Initial commit.
diff --git a/core/include/fdrm/fx_crypt.h b/core/include/fdrm/fx_crypt.h
new file mode 100644
index 0000000..5e0b786
--- /dev/null
+++ b/core/include/fdrm/fx_crypt.h
@@ -0,0 +1,43 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_CRYPT_H_

+#define _FX_CRYPT_H_

+#ifdef __cplusplus

+extern "C" {

+#endif

+void CRYPT_ArcFourCryptBlock(FX_LPBYTE data, FX_DWORD size, FX_LPCBYTE key, FX_DWORD keylen);

+void CRYPT_ArcFourSetup(FX_LPVOID context, FX_LPCBYTE key, FX_DWORD length);

+void CRYPT_ArcFourCrypt(FX_LPVOID context, FX_LPBYTE data, FX_DWORD size);

+void CRYPT_AESSetKey(FX_LPVOID context, FX_DWORD blocklen, FX_LPCBYTE key, FX_DWORD keylen, FX_BOOL bEncrypt);

+void CRYPT_AESSetIV(FX_LPVOID context, FX_LPCBYTE iv);

+void CRYPT_AESDecrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD size);

+void CRYPT_AESEncrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD size);

+void CRYPT_MD5Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[16]);

+void CRYPT_MD5Start(FX_LPVOID context);

+void CRYPT_MD5Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);

+void CRYPT_MD5Finish(FX_LPVOID context, FX_BYTE digest[16]);

+void CRYPT_SHA1Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[20]);

+void CRYPT_SHA1Start(FX_LPVOID context);

+void CRYPT_SHA1Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);

+void CRYPT_SHA1Finish(FX_LPVOID context, FX_BYTE digest[20]);

+void CRYPT_SHA256Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[32]);

+void CRYPT_SHA256Start(FX_LPVOID context);

+void CRYPT_SHA256Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);

+void CRYPT_SHA256Finish(FX_LPVOID context, FX_BYTE digest[32]);

+void CRYPT_SHA384Start(FX_LPVOID context);

+void CRYPT_SHA384Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);

+void CRYPT_SHA384Finish(FX_LPVOID context, FX_BYTE digest[48]);

+void CRYPT_SHA384Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[48]);

+void CRYPT_SHA512Start(FX_LPVOID context);

+void CRYPT_SHA512Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);

+void CRYPT_SHA512Finish(FX_LPVOID context, FX_BYTE digest[64]);

+void CRYPT_SHA512Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64]);

+void CRYPT_SetPubKeyDecryptor(FX_BOOL (*func)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len));

+#ifdef __cplusplus

+};

+#endif

+#endif

diff --git a/core/include/fpdfapi/fpdf_module.h b/core/include/fpdfapi/fpdf_module.h
new file mode 100644
index 0000000..bc11a96
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_module.h
@@ -0,0 +1,205 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_MODULE_

+#define _FPDF_MODULE_

+#ifndef _FXCRT_EXTENSION_

+#include "../fxcrt/fx_ext.h"

+#endif

+class CPDF_ModuleMgr;

+class CPDF_PageModuleDef;

+class CPDF_RenderModuleDef;

+class CPDF_SecurityHandler;

+class CCodec_ModuleMgr;

+class CPDF_Dictionary;

+class ICodec_JpegModule;

+class ICodec_JpxModule;

+class ICodec_FaxModule;

+class ICodec_Jbig2Module;

+class ICodec_IccModule;

+class ICodec_FlateModule;

+#define ADDIN_NAME_CJK			"Eastern Asian Language Support"

+#define ADDIN_NAME_DECODER		"JPEG2000 and JBIG2 Image Decoders"

+class CPDF_ModuleMgr : public CFX_Object

+{

+public:

+

+    static void	Create();

+

+    static CPDF_ModuleMgr*	Get();

+

+    static void	Destroy();

+

+

+

+    void		SetCodecModule(CCodec_ModuleMgr* pModule)

+    {

+        m_pCodecModule = pModule;

+    }

+    CCodec_ModuleMgr*		GetCodecModule()

+    {

+        return m_pCodecModule;

+    }

+

+    void		InitPageModule();

+

+    void		InitRenderModule();

+

+

+    void		SetModulePath(FX_LPCSTR module_name, FX_LPCSTR path);

+

+    CFX_ByteString GetModuleFilePath(FX_LPCSTR module_name, FX_LPCSTR name);

+

+    void		SetDownloadCallback(FX_BOOL (*callback)(FX_LPCSTR module_name));

+

+    FX_BOOL		DownloadModule(FX_LPCSTR module_name);

+

+    void		NotifyModuleAvailable(FX_LPCSTR module_name);

+

+

+

+    CPDF_RenderModuleDef*	GetRenderModule() const

+    {

+        return m_pRenderModule;

+    }

+

+    CPDF_PageModuleDef*		GetPageModule() const

+    {

+        return m_pPageModule;

+    }

+

+

+

+

+    void					LoadEmbeddedGB1CMaps();

+

+    void					LoadEmbeddedCNS1CMaps();

+

+    void					LoadEmbeddedJapan1CMaps();

+

+    void					LoadEmbeddedKorea1CMaps();

+

+    ICodec_FaxModule*		GetFaxModule();

+    ICodec_JpegModule*		GetJpegModule();

+    ICodec_JpxModule*		GetJpxModule();

+    ICodec_Jbig2Module*		GetJbig2Module();

+    ICodec_IccModule*		GetIccModule();

+    ICodec_FlateModule*		GetFlateModule();

+

+    void					RegisterSecurityHandler(FX_LPCSTR name, CPDF_SecurityHandler * (*CreateHandler)(void* param), void* param);

+

+    CPDF_SecurityHandler*	CreateSecurityHandler(FX_LPCSTR name);

+

+    void					SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback);

+

+    FX_LPVOID				GetPrivateData(FX_LPVOID module_id);

+

+    int						m_FileBufSize;

+protected:

+

+    CPDF_ModuleMgr();

+

+    ~CPDF_ModuleMgr();

+    void					Initialize();

+

+    void					InitModules();

+

+

+

+    CCodec_ModuleMgr*		m_pCodecModule;

+

+    CPDF_RenderModuleDef*	m_pRenderModule;

+

+    CPDF_PageModuleDef*		m_pPageModule;

+

+

+    FX_BOOL (*m_pDownloadCallback)(FX_LPCSTR module_name);

+

+    CFX_ByteString			m_DefaultModulePath;

+

+    CFX_CMapByteStringToPtr	m_ModulePathList;

+

+    CFX_MapByteStringToPtr	m_SecurityHandlerMap;

+

+    CFX_PrivateData			m_privateData;

+};

+class CPDF_Document;

+class CPDF_DocPageData;

+class CPDF_FontGlobals;

+class IPDF_FontMgr;

+class IPDF_FontMapper;

+class CPDF_ColorSpace;

+class CPDF_PageModuleDef : public CFX_Object

+{

+public:

+    virtual ~CPDF_PageModuleDef() {}

+

+    virtual CPDF_DocPageData*	CreateDocData(CPDF_Document* pDoc)

+    {

+        return NULL;

+    }

+

+    virtual void				ReleaseDoc(CPDF_Document*) {}

+    virtual void				ClearDoc(CPDF_Document*) {}

+

+    virtual CPDF_FontGlobals*	GetFontGlobals()

+    {

+        return NULL;

+    }

+

+    virtual void				ClearStockFont(CPDF_Document* pDoc) {}

+

+    virtual void				NotifyCJKAvailable() {}

+

+    virtual CPDF_ColorSpace*	GetStockCS(int family)

+    {

+        return NULL;

+    }

+};

+class CPDF_PageObjects;

+class CFX_AffineMatrix;

+class CPDF_RenderOptions;

+class CPDF_Page;

+class CPDF_DocRenderData;

+class CPDF_PageRenderCache;

+class CFX_BitmapDevice;

+class CPDF_Stream;

+class CFX_DIBSource;

+class CPDF_RenderConfig;

+class CPDF_Image;

+class CPDF_RenderModuleDef : public CFX_Object

+{

+public:

+    virtual ~CPDF_RenderModuleDef() {}

+

+    virtual CPDF_DocRenderData*	CreateDocData(CPDF_Document* pDoc)

+    {

+        return NULL;

+    }

+

+    virtual void	DestroyDocData(CPDF_DocRenderData*) {}

+    virtual void	ClearDocData(CPDF_DocRenderData*) {}

+

+    virtual CPDF_DocRenderData* GetRenderData()

+    {

+        return NULL;

+    }

+

+    virtual CPDF_PageRenderCache*	CreatePageCache(CPDF_Page* pPage)

+    {

+        return NULL;

+    }

+

+    virtual void	DestroyPageCache(CPDF_PageRenderCache*) {}

+

+    virtual void	NotifyDecoderAvailable() {}

+

+    virtual CPDF_RenderConfig* GetConfig()

+    {

+        return NULL;

+    }

+};

+#endif

diff --git a/core/include/fpdfapi/fpdf_objects.h b/core/include/fpdfapi/fpdf_objects.h
new file mode 100644
index 0000000..e67144b
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_objects.h
@@ -0,0 +1,785 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_OBJECTS_

+#define _FPDF_OBJECTS_

+#ifndef _FXCRT_EXTENSION_

+#include "../fxcrt/fx_ext.h"

+#endif

+class CPDF_Document;

+class CPDF_IndirectObjects;

+class CPDF_Null;

+class CPDF_Boolean;

+class CPDF_Number;

+class CPDF_String;

+class CPDF_Stream;

+class CPDF_StreamAcc;

+class CPDF_StreamFilter;

+class CPDF_Array;

+class CPDF_Dictionary;

+class CPDF_Reference;

+class IPDF_DocParser;

+class IFX_FileRead;

+class CPDF_CryptoHandler;

+#define PDFOBJ_INVALID		0

+#define	PDFOBJ_BOOLEAN		1

+#define PDFOBJ_NUMBER		2

+#define PDFOBJ_STRING		3

+#define PDFOBJ_NAME			4

+#define PDFOBJ_ARRAY		5

+#define PDFOBJ_DICTIONARY	6

+#define PDFOBJ_STREAM		7

+#define PDFOBJ_NULL			8

+#define PDFOBJ_REFERENCE	9

+typedef IFX_FileStream* (*FPDF_LPFCloneStreamCallback)(CPDF_Stream *pStream, FX_LPVOID pUserData);

+class CPDF_Object : public CFX_Object

+{

+public:

+

+    int						GetType() const

+    {

+        return m_Type;

+    }

+

+    FX_DWORD				GetObjNum() const

+    {

+        return m_ObjNum;

+    }

+

+    FX_BOOL					IsIdentical(CPDF_Object* pObj) const;

+

+    CPDF_Object*			Clone(FX_BOOL bDirect = FALSE) const;

+

+    CPDF_Object*			CloneRef(CPDF_IndirectObjects* pObjs) const;

+

+    CPDF_Object*			GetDirect() const;

+

+    void					Release();

+

+    CFX_ByteString			GetString() const;

+

+    CFX_ByteStringC			GetConstString() const;

+

+    CFX_WideString			GetUnicodeText(CFX_CharMap* pCharMap = NULL) const;

+

+    FX_FLOAT				GetNumber() const;

+

+    FX_FLOAT				GetNumber16() const;

+

+    int						GetInteger() const;

+

+    CPDF_Dictionary*		GetDict() const;

+

+    CPDF_Array*				GetArray() const;

+

+    void					SetString(const CFX_ByteString& str);

+

+    void					SetUnicodeText(FX_LPCWSTR pUnicodes, int len = -1);

+

+    int						GetDirectType() const;

+

+    FX_BOOL					IsModified() const

+    {

+        return FALSE;

+    }

+protected:

+    FX_DWORD				m_Type;

+    CPDF_Object()

+    {

+        m_ObjNum = 0;

+    }

+

+    FX_DWORD 				m_ObjNum;

+

+    void					Destroy();

+

+

+    ~CPDF_Object() {}

+    friend class			CPDF_IndirectObjects;

+    friend class			CPDF_Parser;

+    friend class			CPDF_SyntaxParser;

+private:

+    CPDF_Object(const CPDF_Object& src) {}

+    CPDF_Object* CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const;

+};

+class CPDF_Boolean : public CPDF_Object

+{

+public:

+

+    static CPDF_Boolean*	Create(FX_BOOL value)

+    {

+        return FX_NEW CPDF_Boolean(value);

+    }

+

+    CPDF_Boolean()

+    {

+        m_Type = PDFOBJ_BOOLEAN;

+    }

+

+    CPDF_Boolean(FX_BOOL value)

+    {

+        m_Type = PDFOBJ_BOOLEAN;

+        m_bValue = value;

+    }

+

+    FX_BOOL					Identical(CPDF_Boolean* pOther) const

+    {

+        return m_bValue == pOther->m_bValue;

+    }

+protected:

+

+    FX_BOOL					m_bValue;

+    friend class			CPDF_Object;

+};

+class CPDF_Number : public CPDF_Object

+{

+public:

+

+    static CPDF_Number*		Create(int value)

+    {

+        return FX_NEW CPDF_Number(value);

+    }

+

+    static CPDF_Number*		Create(FX_FLOAT value)

+    {

+        return FX_NEW CPDF_Number(value);

+    }

+

+    static CPDF_Number*		Create(FX_BSTR str)

+    {

+        return FX_NEW CPDF_Number(str);

+    }

+

+    static CPDF_Number*		Create(FX_BOOL bInteger, void* pData)

+    {

+        return FX_NEW CPDF_Number(bInteger, pData);

+    }

+

+    CPDF_Number()

+    {

+        m_Type = PDFOBJ_NUMBER;

+    }

+

+    CPDF_Number(FX_BOOL bInteger, void* pData);

+

+    CPDF_Number(int value);

+

+    CPDF_Number(FX_FLOAT value);

+

+    CPDF_Number(FX_BSTR str);

+

+    FX_BOOL					Identical(CPDF_Number* pOther) const;

+

+    CFX_ByteString			GetString() const;

+

+    void					SetString(FX_BSTR str);

+

+    FX_BOOL					IsInteger() const

+    {

+        return m_bInteger;

+    }

+

+    int						GetInteger() const

+    {

+        return m_bInteger ? m_Integer : (int)m_Float;

+    }

+

+    FX_FLOAT				GetNumber() const

+    {

+        return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;

+    }

+

+    void					SetNumber(FX_FLOAT value);

+

+    FX_FLOAT			GetNumber16() const

+    {

+        return GetNumber();

+    }

+

+    FX_FLOAT				GetFloat() const

+    {

+        return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;

+    }

+protected:

+

+    FX_BOOL					m_bInteger;

+

+    union {

+

+        int					m_Integer;

+

+        FX_FLOAT			m_Float;

+    };

+    friend class			CPDF_Object;

+};

+class CPDF_String : public CPDF_Object

+{

+public:

+

+    static CPDF_String*		Create(const CFX_ByteString& str, FX_BOOL bHex = FALSE)

+    {

+        return FX_NEW CPDF_String(str, bHex);

+    }

+

+    static CPDF_String*		Create(const CFX_WideString& str)

+    {

+        return FX_NEW CPDF_String(str);

+    }

+

+    CPDF_String()

+    {

+        m_Type = PDFOBJ_STRING;

+        m_bHex = FALSE;

+    }

+

+    CPDF_String(const CFX_ByteString& str, FX_BOOL bHex = FALSE) : m_String(str)

+    {

+        m_Type = PDFOBJ_STRING;

+        m_bHex = bHex;

+    }

+

+    CPDF_String(const CFX_WideString& str);

+

+    CFX_ByteString&			GetString()

+    {

+        return m_String;

+    }

+

+    FX_BOOL					Identical(CPDF_String* pOther) const

+    {

+        return m_String == pOther->m_String;

+    }

+

+    FX_BOOL					IsHex() const

+    {

+        return m_bHex;

+    }

+protected:

+

+    CFX_ByteString			m_String;

+

+    FX_BOOL					m_bHex;

+    friend class			CPDF_Object;

+};

+class CPDF_Name : public CPDF_Object

+{

+public:

+

+    static CPDF_Name*		Create(const CFX_ByteString& str)

+    {

+        return FX_NEW CPDF_Name(str);

+    }

+

+    static CPDF_Name*		Create(FX_BSTR str)

+    {

+        return FX_NEW CPDF_Name(str);

+    }

+

+    static CPDF_Name*		Create(FX_LPCSTR str)

+    {

+        return FX_NEW CPDF_Name(str);

+    }

+

+    CPDF_Name(const CFX_ByteString& str) : m_Name(str)

+    {

+        m_Type = PDFOBJ_NAME;

+    }

+

+    CPDF_Name(FX_BSTR str) : m_Name(str)

+    {

+        m_Type = PDFOBJ_NAME;

+    }

+

+    CPDF_Name(FX_LPCSTR str) : m_Name(str)

+    {

+        m_Type = PDFOBJ_NAME;

+    }

+

+    CFX_ByteString&			GetString()

+    {

+        return m_Name;

+    }

+

+    FX_BOOL					Identical(CPDF_Name* pOther) const

+    {

+        return m_Name == pOther->m_Name;

+    }

+protected:

+

+    CFX_ByteString			m_Name;

+    friend class			CPDF_Object;

+};

+class CPDF_Array : public CPDF_Object

+{

+public:

+

+    static CPDF_Array*		Create()

+    {

+        return FX_NEW CPDF_Array();

+    }

+

+    CPDF_Array()

+    {

+        m_Type = PDFOBJ_ARRAY;

+    }

+

+    FX_DWORD				GetCount() const

+    {

+        return m_Objects.GetSize();

+    }

+

+    CPDF_Object*			GetElement(FX_DWORD index) const;

+

+    CPDF_Object*			GetElementValue(FX_DWORD index) const;

+

+

+

+    CFX_AffineMatrix		GetMatrix();

+

+    CFX_FloatRect			GetRect();

+

+

+

+

+    CFX_ByteString			GetString(FX_DWORD index) const;

+

+    CFX_ByteStringC			GetConstString(FX_DWORD index) const;

+

+    int						GetInteger(FX_DWORD index) const;

+

+    FX_FLOAT				GetNumber(FX_DWORD index) const;

+

+    CPDF_Dictionary*		GetDict(FX_DWORD index) const;

+

+    CPDF_Stream*			GetStream(FX_DWORD index) const;

+

+    CPDF_Array*				GetArray(FX_DWORD index) const;

+

+    FX_FLOAT				GetFloat(FX_DWORD index) const

+    {

+        return GetNumber(index);

+    }

+

+

+

+

+    void					SetAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);

+

+

+    void					InsertAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);

+

+    void					RemoveAt(FX_DWORD index);

+

+

+    void					Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);

+

+

+

+    void					AddNumber(FX_FLOAT f);

+

+    void					AddInteger(int i);

+

+    void					AddString(const CFX_ByteString& str);

+

+    void					AddName(const CFX_ByteString& str);

+

+    void					AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);

+

+    void					AddReference(CPDF_IndirectObjects* pDoc, CPDF_Object* obj)

+    {

+        AddReference(pDoc, obj->GetObjNum());

+    }

+

+

+    FX_FLOAT			GetNumber16(FX_DWORD index) const

+    {

+        return GetNumber(index);

+    }

+

+    void					AddNumber16(FX_FLOAT value)

+    {

+        AddNumber(value);

+    }

+

+    FX_BOOL					Identical(CPDF_Array* pOther) const;

+protected:

+

+    ~CPDF_Array();

+

+    CFX_PtrArray			m_Objects;

+    friend class			CPDF_Object;

+};

+class CPDF_Dictionary : public CPDF_Object

+{

+public:

+

+    static CPDF_Dictionary*	Create()

+    {

+        return FX_NEW CPDF_Dictionary();

+    }

+

+    CPDF_Dictionary()

+    {

+        m_Type = PDFOBJ_DICTIONARY;

+    }

+

+

+

+    CPDF_Object*			GetElement(FX_BSTR key) const;

+

+    CPDF_Object*			GetElementValue(FX_BSTR key) const;

+

+

+

+

+

+    CFX_ByteString			GetString(FX_BSTR key) const;

+

+    CFX_ByteStringC			GetConstString(FX_BSTR key) const;

+

+    CFX_ByteString			GetString(FX_BSTR key, FX_BSTR default_str) const;

+

+    CFX_ByteStringC			GetConstString(FX_BSTR key, FX_BSTR default_str) const;

+

+    CFX_WideString			GetUnicodeText(FX_BSTR key, CFX_CharMap* pCharMap = NULL) const;

+

+    int						GetInteger(FX_BSTR key) const;

+

+    int						GetInteger(FX_BSTR key, int default_int) const;

+

+    FX_BOOL					GetBoolean(FX_BSTR key, FX_BOOL bDefault = FALSE) const;

+

+    FX_FLOAT				GetNumber(FX_BSTR key) const;

+

+    CPDF_Dictionary*		GetDict(FX_BSTR key) const;

+

+    CPDF_Stream*			GetStream(FX_BSTR key) const;

+

+    CPDF_Array*				GetArray(FX_BSTR key) const;

+

+    CFX_FloatRect			GetRect(FX_BSTR key) const;

+

+    CFX_AffineMatrix		GetMatrix(FX_BSTR key) const;

+

+    FX_FLOAT				GetFloat(FX_BSTR key) const

+    {

+        return GetNumber(key);

+    }

+

+

+    FX_BOOL					KeyExist(FX_BSTR key) const;

+

+    FX_POSITION				GetStartPos() const;

+

+    CPDF_Object*			GetNextElement(FX_POSITION& pos, CFX_ByteString& key) const;

+

+    void					SetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);

+

+

+

+    void					SetAtName(FX_BSTR key, const CFX_ByteString& name);

+

+

+    void					SetAtString(FX_BSTR key, const CFX_ByteString& string);

+

+

+    void					SetAtInteger(FX_BSTR key, int i);

+

+

+    void					SetAtNumber(FX_BSTR key, FX_FLOAT f);

+

+    void					SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum);

+

+    void					SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, CPDF_Object* obj)

+    {

+        SetAtReference(key, pDoc, obj->GetObjNum());

+    }

+

+    void					AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum);

+

+    void					AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, CPDF_Object* obj)

+    {

+        AddReference(key, pDoc, obj->GetObjNum());

+    }

+

+    void					SetAtRect(FX_BSTR key, const CFX_FloatRect& rect);

+

+    void					SetAtMatrix(FX_BSTR key, const CFX_AffineMatrix& matrix);

+

+    void					SetAtBoolean(FX_BSTR key, FX_BOOL bValue);

+

+

+

+    void					RemoveAt(FX_BSTR key);

+

+

+    void					ReplaceKey(FX_BSTR oldkey, FX_BSTR newkey);

+

+    FX_BOOL					Identical(CPDF_Dictionary* pDict) const;

+

+    int						GetCount() const

+    {

+        return m_Map.GetCount();

+    }

+

+    void					AddValue(FX_BSTR key, CPDF_Object* pObj);

+protected:

+

+    ~CPDF_Dictionary();

+

+    CFX_CMapByteStringToPtr	m_Map;

+

+    friend class			CPDF_Object;

+};

+class CPDF_Stream : public CPDF_Object

+{

+public:

+

+    static CPDF_Stream*		Create(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)

+    {

+        return FX_NEW CPDF_Stream(pData, size, pDict);

+    }

+

+    CPDF_Stream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict);

+

+    CPDF_Dictionary*		GetDict() const

+    {

+        return m_pDict;

+    }

+

+    void					SetData(FX_LPCBYTE pData, FX_DWORD size, FX_BOOL bCompressed, FX_BOOL bKeepBuf);

+

+    void					InitStream(FX_BYTE* pData, FX_DWORD size, CPDF_Dictionary* pDict);

+

+    void					InitStream(IFX_FileRead *pFile, CPDF_Dictionary* pDict);

+

+    FX_BOOL					Identical(CPDF_Stream* pOther) const;

+

+    CPDF_StreamFilter*		GetStreamFilter(FX_BOOL bRaw = FALSE) const;

+

+

+

+    FX_DWORD				GetRawSize() const

+    {

+        return m_dwSize;

+    }

+

+    FX_BOOL					ReadRawData(FX_FILESIZE start_pos, FX_LPBYTE pBuf, FX_DWORD buf_size) const;

+

+

+    FX_BOOL					IsMemoryBased() const

+    {

+        return m_GenNum == (FX_DWORD) - 1;

+    }

+

+    CPDF_Stream*			Clone(FX_BOOL bDirect, FPDF_LPFCloneStreamCallback lpfCallback, FX_LPVOID pUserData) const;

+protected:

+

+    ~CPDF_Stream();

+

+    CPDF_Dictionary*		m_pDict;

+

+    FX_DWORD				m_dwSize;

+

+    FX_DWORD				m_GenNum;

+

+    union {

+

+        FX_LPBYTE			m_pDataBuf;

+

+        IFX_FileRead*		m_pFile;

+    };

+

+    FX_FILESIZE				m_FileOffset;

+

+    CPDF_CryptoHandler*		m_pCryptoHandler;

+

+    void					InitStream(CPDF_Dictionary* pDict);

+    friend class			CPDF_Object;

+    friend class			CPDF_StreamAcc;

+    friend class			CPDF_AttachmentAcc;

+};

+class CPDF_StreamAcc : public CFX_Object

+{

+public:

+

+    CPDF_StreamAcc();

+

+    ~CPDF_StreamAcc();

+

+    void					LoadAllData(const CPDF_Stream* pStream, FX_BOOL bRawAccess = FALSE,

+                                        FX_DWORD estimated_size = 0, FX_BOOL bImageAcc = FALSE);

+

+    const CPDF_Stream*		GetStream() const

+    {

+        return m_pStream;

+    }

+

+    CPDF_Dictionary*		GetDict() const

+    {

+        return m_pStream->GetDict();

+    }

+

+    FX_LPCBYTE				GetData() const;

+

+    FX_DWORD				GetSize() const;

+

+    FX_LPBYTE				DetachData();

+

+    const CFX_ByteString&	GetImageDecoder()

+    {

+        return m_ImageDecoder;

+    }

+

+    const CPDF_Dictionary*	GetImageParam()

+    {

+        return m_pImageParam;

+    }

+protected:

+

+    FX_LPBYTE				m_pData;

+

+    FX_DWORD				m_dwSize;

+

+    FX_BOOL					m_bNewBuf;

+

+    CFX_ByteString			m_ImageDecoder;

+

+    CPDF_Dictionary*		m_pImageParam;

+

+    const CPDF_Stream*		m_pStream;

+

+    FX_LPBYTE				m_pSrcData;

+};

+CFX_DataFilter* FPDF_CreateFilter(FX_BSTR name, const CPDF_Dictionary* pParam, int width = 0, int height = 0);

+#define FPDF_FILTER_BUFFER_SIZE		20480

+class CPDF_StreamFilter : public CFX_Object

+{

+public:

+

+    ~CPDF_StreamFilter();

+

+    FX_DWORD			ReadBlock(FX_LPBYTE buffer, FX_DWORD size);

+

+    FX_DWORD			GetSrcPos()

+    {

+        return m_SrcOffset;

+    }

+

+    const CPDF_Stream*	GetStream()

+    {

+        return m_pStream;

+    }

+protected:

+

+    CPDF_StreamFilter() {}

+

+    FX_DWORD			ReadLeftOver(FX_LPBYTE buffer, FX_DWORD buf_size);

+

+    const CPDF_Stream*	m_pStream;

+

+    CFX_DataFilter*		m_pFilter;

+

+    CFX_BinaryBuf*		m_pBuffer;

+

+    FX_DWORD			m_BufOffset;

+

+    FX_DWORD			m_SrcOffset;

+

+    FX_BYTE				m_SrcBuffer[FPDF_FILTER_BUFFER_SIZE];

+    friend class CPDF_Stream;

+};

+class CPDF_Null : public CPDF_Object

+{

+public:

+

+    static CPDF_Null*		Create()

+    {

+        return FX_NEW CPDF_Null();

+    }

+

+    CPDF_Null()

+    {

+        m_Type = PDFOBJ_NULL;

+    }

+};

+class CPDF_Reference : public CPDF_Object

+{

+public:

+

+    static CPDF_Reference*	Create(CPDF_IndirectObjects* pDoc, int objnum)

+    {

+        return FX_NEW CPDF_Reference(pDoc, objnum);

+    }

+

+    CPDF_Reference(CPDF_IndirectObjects* pDoc, int objnum)

+    {

+        m_Type = PDFOBJ_REFERENCE;

+        m_pObjList = pDoc;

+        m_RefObjNum = objnum;

+    }

+

+    CPDF_IndirectObjects*	GetObjList() const

+    {

+        return m_pObjList;

+    }

+

+    FX_DWORD				GetRefObjNum() const

+    {

+        return m_RefObjNum;

+    }

+

+    void					SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);

+

+    FX_BOOL					Identical(CPDF_Reference* pOther) const

+    {

+        return m_RefObjNum == pOther->m_RefObjNum;

+    }

+protected:

+

+    CPDF_IndirectObjects*	m_pObjList;

+

+    FX_DWORD				m_RefObjNum;

+    friend class			CPDF_Object;

+};

+class CPDF_IndirectObjects : public CFX_Object

+{

+public:

+

+    CPDF_IndirectObjects(IPDF_DocParser* pParser);

+

+    ~CPDF_IndirectObjects();

+

+    CPDF_Object*			GetIndirectObject(FX_DWORD objnum, struct PARSE_CONTEXT* pContext = NULL);

+

+    int						GetIndirectType(FX_DWORD objnum);

+

+    FX_DWORD				AddIndirectObject(CPDF_Object* pObj);

+

+    void					ReleaseIndirectObject(FX_DWORD objnum);

+

+    void					InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj);

+

+    FX_DWORD				GetLastObjNum() const;

+

+    FX_POSITION				GetStartPosition() const

+    {

+        return m_IndirectObjs.GetStartPosition();

+    }

+

+    void					GetNextAssoc(FX_POSITION& rPos, FX_DWORD& objnum, CPDF_Object*& pObject) const

+    {

+        m_IndirectObjs.GetNextAssoc(rPos, (void*&)objnum, (void*&)pObject);

+    }

+protected:

+

+    CFX_MapPtrToPtr			m_IndirectObjs;

+

+    IPDF_DocParser*			m_pParser;

+

+    FX_DWORD				m_LastObjNum;

+};

+#endif

diff --git a/core/include/fpdfapi/fpdf_page.h b/core/include/fpdfapi/fpdf_page.h
new file mode 100644
index 0000000..29b8c68
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_page.h
@@ -0,0 +1,249 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_PAGE_

+#define _FPDF_PAGE_

+#ifndef _FPDF_PARSER_

+#include "fpdf_parser.h"

+#endif

+#ifndef _FPDF_RESOURCE_

+#include "fpdf_resource.h"

+#endif

+#ifndef _FX_DIB_H_

+#include "../fxge/fx_dib.h"

+#endif

+class CPDF_PageObjects;

+class CPDF_Page;

+class CPDF_Form;

+class CPDF_ParseOptions;

+class CPDF_PageObject;

+class CPDF_PageRenderCache;

+class CPDF_StreamFilter;

+class CPDF_AllStates;

+class CPDF_ContentParser;

+class CPDF_StreamContentParser;

+class CPDF_ResourceNaming;

+#define PDFTRANS_GROUP			0x0100

+#define PDFTRANS_ISOLATED		0x0200

+#define PDFTRANS_KNOCKOUT		0x0400

+#define PDF_CONTENT_NOT_PARSED	0

+#define PDF_CONTENT_PARSING		1

+#define PDF_CONTENT_PARSED		2

+class CPDF_PageObjects : public CFX_Object

+{

+public:

+

+    CPDF_PageObjects(FX_BOOL bReleaseMembers = TRUE);

+

+    ~CPDF_PageObjects();

+

+

+

+

+    void				ContinueParse(IFX_Pause* pPause);

+

+    int					GetParseState() const

+    {

+        return m_ParseState;

+    }

+

+    FX_BOOL				IsParsed() const

+    {

+        return m_ParseState == PDF_CONTENT_PARSED;

+    }

+

+    int					EstimateParseProgress() const;

+

+

+

+

+    FX_POSITION			GetFirstObjectPosition() const

+    {

+        return m_ObjectList.GetHeadPosition();

+    }

+

+    FX_POSITION			GetLastObjectPosition() const

+    {

+        return m_ObjectList.GetTailPosition();

+    }

+

+    CPDF_PageObject*	GetNextObject(FX_POSITION& pos) const

+    {

+        return (CPDF_PageObject*)m_ObjectList.GetNext(pos);

+    }

+

+    CPDF_PageObject*	GetPrevObject(FX_POSITION& pos) const

+    {

+        return (CPDF_PageObject*)m_ObjectList.GetPrev(pos);

+    }

+

+    CPDF_PageObject*	GetObjectAt(FX_POSITION pos) const

+    {

+        return (CPDF_PageObject*)m_ObjectList.GetAt(pos);

+    }

+

+    FX_DWORD			CountObjects() const

+    {

+        return m_ObjectList.GetCount();

+    }

+

+    int					GetObjectIndex(CPDF_PageObject* pObj) const;

+

+    CPDF_PageObject*	GetObjectByIndex(int index) const;

+

+

+

+

+

+    FX_POSITION			InsertObject(FX_POSITION posInsertAfter, CPDF_PageObject* pNewObject);

+

+    void				Transform(const CFX_AffineMatrix& matrix);

+

+    FX_BOOL				BackgroundAlphaNeeded() const

+    {

+        return m_bBackgroundAlphaNeeded;

+    }

+

+    CFX_FloatRect		CalcBoundingBox() const;

+

+    CPDF_Dictionary*	m_pFormDict;

+

+    CPDF_Stream*		m_pFormStream;

+

+    CPDF_Document*		m_pDocument;

+

+    CPDF_Dictionary*	m_pPageResources;

+

+    CPDF_Dictionary*	m_pResources;

+

+    CFX_FloatRect		m_BBox;

+

+    int					m_Transparency;

+

+protected:

+    friend class		CPDF_ContentParser;

+    friend class		CPDF_StreamContentParser;

+    friend class		CPDF_AllStates;

+

+    CFX_PtrList			m_ObjectList;

+

+    FX_BOOL				m_bBackgroundAlphaNeeded;

+

+    FX_BOOL				m_bReleaseMembers;

+    void				LoadTransInfo();

+    void                ClearCacheObjects();

+

+    CPDF_ContentParser*	m_pParser;

+

+    FX_BOOL				m_ParseState;

+};

+class CPDF_Page : public CPDF_PageObjects, public CFX_PrivateData

+{

+public:

+

+    CPDF_Page();

+

+    ~CPDF_Page();

+

+    void				Load(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, FX_BOOL bPageCache = TRUE);

+

+    void				StartParse(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);

+

+    void				ParseContent(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);

+

+    void				GetDisplayMatrix(CFX_AffineMatrix& matrix, int xPos, int yPos,

+                                         int xSize, int ySize, int iRotate) const;

+

+    FX_FLOAT			GetPageWidth() const

+    {

+        return m_PageWidth;

+    }

+

+    FX_FLOAT			GetPageHeight() const

+    {

+        return m_PageHeight;

+    }

+

+    CFX_FloatRect		GetPageBBox() const

+    {

+        return m_BBox;

+    }

+

+    const CFX_AffineMatrix&	GetPageMatrix() const

+    {

+        return m_PageMatrix;

+    }

+

+    CPDF_Object*		GetPageAttr(FX_BSTR name) const;

+

+

+

+    CPDF_PageRenderCache*	GetRenderCache() const

+    {

+        return m_pPageRender;

+    }

+

+    void				ClearRenderCache();

+

+protected:

+    friend class		CPDF_ContentParser;

+

+    FX_FLOAT			m_PageWidth;

+

+    FX_FLOAT			m_PageHeight;

+

+    CFX_AffineMatrix	m_PageMatrix;

+

+    CPDF_PageRenderCache*	m_pPageRender;

+};

+class CPDF_ParseOptions : public CFX_Object

+{

+public:

+

+    CPDF_ParseOptions();

+

+    FX_BOOL				m_bTextOnly;

+

+    FX_BOOL				m_bMarkedContent;

+

+    FX_BOOL				m_bSeparateForm;

+

+    FX_BOOL				m_bDecodeInlineImage;

+};

+class CPDF_Form : public CPDF_PageObjects

+{

+public:

+

+    CPDF_Form(CPDF_Document* pDocument, CPDF_Dictionary* pPageResources, CPDF_Stream* pFormStream, CPDF_Dictionary* pParentResources = NULL);

+

+    ~CPDF_Form();

+

+    void				StartParse(CPDF_AllStates* pGraphicStates,  CFX_AffineMatrix* pParentMatrix,

+                                   CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level = 0);

+

+    void				ParseContent(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,

+                                     CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level = 0);

+

+    CPDF_Form*			Clone() const;

+};

+class CPDF_PageContentGenerate : public CFX_Object

+{

+public:

+    CPDF_PageContentGenerate(CPDF_Page* pPage);

+    ~CPDF_PageContentGenerate();

+    FX_BOOL InsertPageObject(CPDF_PageObject* pPageObject);

+    void GenerateContent();

+    void TransformContent(CFX_Matrix& matrix);

+protected:

+    void            ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj);

+    void            ProcessForm(CFX_ByteTextBuf& buf, FX_LPCBYTE data, FX_DWORD size, CFX_Matrix& matrix);

+    CFX_ByteString  RealizeResource(CPDF_Object* pResourceObj, const FX_CHAR* szType);

+private:

+    CPDF_Page*      m_pPage;

+    CPDF_Document*  m_pDocument;

+    CFX_PtrArray    m_pageObjects;

+};

+#endif

diff --git a/core/include/fpdfapi/fpdf_pageobj.h b/core/include/fpdfapi/fpdf_pageobj.h
new file mode 100644
index 0000000..1e82680
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_pageobj.h
@@ -0,0 +1,721 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_PAGEOBJ_H_

+#define _FPDF_PAGEOBJ_H_

+#ifndef _FPDF_RESOURCE_

+#include "fpdf_resource.h"

+#endif

+#ifndef _FX_GE_H_

+#include "../fxge/fx_ge.h"

+#endif

+class CPDF_Path;

+class CPDF_ClipPathData;

+class CPDF_ClipPath;

+class CPDF_ColorStateData;

+class CPDF_ColorState;

+class CPDF_GraphState;

+class CPDF_TextStateData;

+class CPDF_TextState;

+class CPDF_GeneralStateData;

+class CPDF_GeneralState;

+class CPDF_ContentMarkItem;

+class CPDF_ContentMark;

+class CPDF_GraphicStates;

+class CPDF_PageObject;

+class CPDF_TextObject;

+class CPDF_PathObject;

+class CPDF_ImageObject;

+class CPDF_ShadingObject;

+class CPDF_FormObject;

+class CPDF_InlineImages;

+typedef CFX_PathData CPDF_PathData;

+class CPDF_Path : public CFX_CountRef<CFX_PathData>

+{

+public:

+

+

+

+

+    int					GetPointCount()

+    {

+        return m_pObject->m_PointCount;

+    }

+

+    int					GetFlag(int index)

+    {

+        return m_pObject->m_pPoints[index].m_Flag;

+    }

+

+    FX_FLOAT			GetPointX(int index)

+    {

+        return m_pObject->m_pPoints[index].m_PointX;

+    }

+

+    FX_FLOAT			GetPointY(int index)

+    {

+        return m_pObject->m_pPoints[index].m_PointY;

+    }

+

+

+

+

+    FX_PATHPOINT*		GetPoints()

+    {

+        return m_pObject->m_pPoints;

+    }

+

+

+    CFX_FloatRect		GetBoundingBox() const

+    {

+        return m_pObject->GetBoundingBox();

+    }

+

+    CFX_FloatRect		GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const

+    {

+        return m_pObject->GetBoundingBox(line_width, miter_limit);

+    }

+

+    void				Transform(const CFX_AffineMatrix* pMatrix)

+    {

+        GetModify()->Transform(pMatrix);

+    }

+

+    void				Append(CPDF_Path src, const CFX_AffineMatrix* pMatrix)

+    {

+        m_pObject->Append(src.m_pObject, pMatrix);

+    }

+

+    void				AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)

+    {

+        m_pObject->AppendRect(left, bottom, right, top);

+    }

+

+    FX_BOOL				IsRect() const

+    {

+        return m_pObject->IsRect();

+    }

+};

+class CPDF_ClipPathData : public CFX_Object

+{

+public:

+

+    CPDF_ClipPathData();

+

+    CPDF_ClipPathData(const CPDF_ClipPathData&);

+

+    ~CPDF_ClipPathData();

+

+    void				SetCount(int path_count, int text_count);

+public:

+

+    int					m_PathCount;

+

+    CPDF_Path*			m_pPathList;

+

+    FX_BYTE*			m_pTypeList;

+

+    int					m_TextCount;

+

+    CPDF_TextObject**	m_pTextList;

+};

+class CPDF_ClipPath : public CFX_CountRef<CPDF_ClipPathData>

+{

+public:

+

+    FX_DWORD			GetPathCount() const

+    {

+        return m_pObject->m_PathCount;

+    }

+

+    CPDF_Path			GetPath(int i) const

+    {

+        return m_pObject->m_pPathList[i];

+    }

+

+    int					GetClipType(int i) const

+    {

+        return m_pObject->m_pTypeList[i];

+    }

+

+    FX_DWORD			GetTextCount() const

+    {

+        return m_pObject->m_TextCount;

+    }

+

+    CPDF_TextObject*	GetText(int i) const

+    {

+        return m_pObject->m_pTextList[i];

+    }

+

+    CFX_FloatRect		GetClipBox() const;

+

+    void				AppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge);

+

+    void				DeletePath(int layer_index);

+

+    void				AppendTexts(CPDF_TextObject** pTexts, int count);

+

+    void				Transform(const CFX_AffineMatrix& matrix);

+};

+class CPDF_ColorStateData : public CFX_Object

+{

+public:

+

+    CPDF_ColorStateData() {}

+

+    CPDF_ColorStateData(const CPDF_ColorStateData& src);

+

+    void				Default();

+

+    CPDF_Color			m_FillColor;

+

+    FX_DWORD			m_FillRGB;

+

+    CPDF_Color			m_StrokeColor;

+

+    FX_DWORD			m_StrokeRGB;

+};

+class CPDF_ColorState : public CFX_CountRef<CPDF_ColorStateData>

+{

+public:

+

+    CPDF_Color*			GetFillColor() const

+    {

+        return m_pObject ? &m_pObject->m_FillColor : NULL;

+    }

+

+    CPDF_Color*			GetStrokeColor() const

+    {

+        return m_pObject ? &m_pObject->m_StrokeColor : NULL;

+    }

+

+    void				SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);

+

+    void				SetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);

+

+    void				SetFillPattern(CPDF_Pattern* pattern, FX_FLOAT* pValue, int nValues);

+

+    void				SetStrokePattern(CPDF_Pattern* pattern, FX_FLOAT* pValue, int nValues);

+private:

+    void				SetColor(CPDF_Color& color, FX_DWORD& rgb, CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);

+};

+typedef CFX_GraphStateData CPDF_GraphStateData;

+class CPDF_GraphState : public CFX_CountRef<CFX_GraphStateData>

+{

+public:

+};

+class CPDF_TextStateData : public CFX_Object

+{

+public:

+

+    CPDF_TextStateData();

+

+    CPDF_TextStateData(const CPDF_TextStateData& src);

+

+    ~CPDF_TextStateData();

+

+    CPDF_Font*			m_pFont;

+

+    FX_FLOAT			m_FontSize;

+

+    FX_FLOAT			m_CharSpace;

+

+    FX_FLOAT			m_WordSpace;

+

+    FX_FLOAT		m_Matrix[4];

+

+    int					m_TextMode;

+

+    FX_FLOAT		m_CTM[4];

+};

+class CPDF_TextState : public CFX_CountRef<CPDF_TextStateData>

+{

+public:

+

+    CPDF_Font*			GetFont() const

+    {

+        return m_pObject->m_pFont;

+    }

+

+    void				SetFont(CPDF_Font* pFont);

+

+    FX_FLOAT			GetFontSize() const

+    {

+        return m_pObject->m_FontSize;

+    }

+

+    FX_FLOAT*			GetMatrix() const

+    {

+        return m_pObject->m_Matrix;

+    }

+

+

+

+    FX_FLOAT			GetFontSizeV() const;

+

+    FX_FLOAT			GetFontSizeH() const;

+

+    FX_FLOAT			GetBaselineAngle() const;

+

+    FX_FLOAT			GetShearAngle() const;

+

+};

+class CPDF_TransferFunc;

+class CPDF_GeneralStateData : public CFX_Object

+{

+public:

+

+    CPDF_GeneralStateData();

+

+    CPDF_GeneralStateData(const CPDF_GeneralStateData& src);

+    ~CPDF_GeneralStateData();

+

+    void				SetBlendMode(FX_BSTR blend_mode);

+

+    char				m_BlendMode[16];

+

+    int					m_BlendType;

+

+    CPDF_Object*		m_pSoftMask;

+

+    FX_FLOAT			m_SMaskMatrix[6];

+

+    FX_FLOAT			m_StrokeAlpha;

+

+    FX_FLOAT			m_FillAlpha;

+

+    CPDF_Object*		m_pTR;

+

+    CPDF_TransferFunc*	m_pTransferFunc;

+

+    CFX_Matrix			m_Matrix;

+

+    int					m_RenderIntent;

+

+    FX_BOOL				m_StrokeAdjust;

+

+    FX_BOOL				m_AlphaSource;

+

+    FX_BOOL				m_TextKnockout;

+

+    FX_BOOL				m_StrokeOP;

+

+    FX_BOOL				m_FillOP;

+

+    int					m_OPMode;

+

+    CPDF_Object*		m_pBG;

+

+    CPDF_Object*		m_pUCR;

+

+    CPDF_Object*		m_pHT;

+

+    FX_FLOAT			m_Flatness;

+

+    FX_FLOAT			m_Smoothness;

+};

+class CPDF_GeneralState : public CFX_CountRef<CPDF_GeneralStateData>

+{

+public:

+

+    void				SetRenderIntent(const CFX_ByteString& ri);

+

+    int					GetBlendType() const

+    {

+        return m_pObject ? m_pObject->m_BlendType : FXDIB_BLEND_NORMAL;

+    }

+

+    int					GetAlpha(FX_BOOL bStroke) const

+    {

+        return m_pObject ? FXSYS_round((bStroke ? m_pObject->m_StrokeAlpha : m_pObject->m_FillAlpha) * 255) : 255;

+    }

+};

+class CPDF_ContentMarkItem : public CFX_Object

+{

+public:

+

+    typedef enum {

+        None,

+        PropertiesDict,

+        DirectDict,

+        MCID

+    } ParamType;

+

+    CPDF_ContentMarkItem();

+

+    CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src);

+

+    ~CPDF_ContentMarkItem();

+

+    inline const CFX_ByteString&	GetName() const

+    {

+        return m_MarkName;

+    }

+

+    inline ParamType	GetParamType() const

+    {

+        return m_ParamType;

+    }

+

+    inline void*		GetParam() const

+    {

+        return m_pParam;

+    }

+

+    inline FX_BOOL		HasMCID() const;

+

+    inline void			SetName(const CFX_ByteString& name)

+    {

+        m_MarkName = name;

+    }

+

+    inline void			SetParam(ParamType type, void* param)

+    {

+        m_ParamType = type;

+        m_pParam = param;

+    }

+private:

+

+    CFX_ByteString		m_MarkName;

+

+    ParamType			m_ParamType;

+

+    void*				m_pParam;

+};

+class CPDF_ContentMarkData : public CFX_Object

+{

+public:

+

+    CPDF_ContentMarkData() { }

+

+    CPDF_ContentMarkData(const CPDF_ContentMarkData& src);

+

+    inline int			CountItems() const

+    {

+        return m_Marks.GetSize();

+    }

+

+    inline CPDF_ContentMarkItem&	GetItem(int index) const

+    {

+        return m_Marks[index];

+    }

+

+    int					GetMCID() const;

+

+    void				AddMark(const CFX_ByteString& name, CPDF_Dictionary* pDict, FX_BOOL bDictNeedClone);

+

+    void				DeleteLastMark();

+private:

+

+    CFX_ObjectArray<CPDF_ContentMarkItem>	m_Marks;

+};

+class CPDF_ContentMark : public CFX_CountRef<CPDF_ContentMarkData>

+{

+public:

+

+    int					GetMCID() const

+    {

+        return m_pObject ? m_pObject->GetMCID() : -1;

+    }

+

+    FX_BOOL				HasMark(FX_BSTR mark) const;

+

+    FX_BOOL				LookupMark(FX_BSTR mark, CPDF_Dictionary*& pDict) const;

+};

+#define PDFPAGE_TEXT		1

+#define PDFPAGE_PATH		2

+#define PDFPAGE_IMAGE		3

+#define PDFPAGE_SHADING		4

+#define PDFPAGE_FORM		5

+#define PDFPAGE_INLINES		6

+class CPDF_GraphicStates : public CFX_Object

+{

+public:

+

+    void				CopyStates(const CPDF_GraphicStates& src);

+

+    void				DefaultStates();

+

+    CPDF_ClipPath		m_ClipPath;

+

+    CPDF_GraphState		m_GraphState;

+

+    CPDF_ColorState		m_ColorState;

+

+    CPDF_TextState		m_TextState;

+

+    CPDF_GeneralState	m_GeneralState;

+};

+class CPDF_PageObject : public CPDF_GraphicStates

+{

+public:

+

+    static CPDF_PageObject* Create(int type);

+

+    void				Release();

+

+    CPDF_PageObject*	Clone() const;

+

+    void				Copy(const CPDF_PageObject* pSrcObject);

+

+    virtual void		Transform(const CFX_AffineMatrix& matrix) = 0;

+

+

+

+    void				RemoveClipPath();

+

+    void				AppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerge);

+

+    void				CopyClipPath(CPDF_PageObject* pObj);

+

+    void				TransformClipPath(CFX_AffineMatrix& matrix);

+

+    void				TransformGeneralState(CFX_AffineMatrix& matrix);

+

+

+    void				SetColorState(CPDF_ColorState state)

+    {

+        m_ColorState = state;

+    }

+

+    FX_RECT				GetBBox(const CFX_AffineMatrix* pMatrix) const;

+

+    int					m_Type;

+

+    FX_FLOAT			m_Left;

+

+    FX_FLOAT			m_Right;

+

+    FX_FLOAT			m_Top;

+

+    FX_FLOAT			m_Bottom;

+

+    CPDF_ContentMark	m_ContentMark;

+protected:

+

+    virtual void		CopyData(const CPDF_PageObject* pSrcObject) {}

+

+    void				RecalcBBox();

+

+    CPDF_PageObject() {}

+

+    virtual ~CPDF_PageObject() {}

+};

+struct CPDF_TextObjectItem : public CFX_Object {

+

+    FX_DWORD			m_CharCode;

+

+    FX_FLOAT			m_OriginX;

+

+    FX_FLOAT			m_OriginY;

+};

+class CPDF_TextObject : public CPDF_PageObject

+{

+public:

+

+    CPDF_TextObject();

+

+    virtual ~CPDF_TextObject();

+

+    int					CountItems() const

+    {

+        return m_nChars;

+    }

+

+    void				GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const;

+

+    int					CountChars() const;

+

+    void				GetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const;

+    void				GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const;

+

+    void				GetCharRect(int index, CFX_FloatRect& rect) const;

+

+

+    FX_FLOAT			GetCharWidth(FX_DWORD charcode) const;

+    FX_FLOAT			GetSpaceCharWidth() const;

+

+    FX_FLOAT			GetPosX() const

+    {

+        return m_PosX;

+    }

+

+    FX_FLOAT			GetPosY() const

+    {

+        return m_PosY;

+    }

+

+    void				GetTextMatrix(CFX_AffineMatrix* pMatrix) const;

+

+    CPDF_Font*			GetFont() const

+    {

+        return m_TextState.GetFont();

+    }

+

+    FX_FLOAT			GetFontSize() const

+    {

+        return m_TextState.GetFontSize();

+    }

+

+    void				SetEmpty();

+

+    void				SetText(const CFX_ByteString& text);

+

+    void				SetText(CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);

+

+    void				SetText(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pKernings);

+

+    void				SetPosition(FX_FLOAT x, FX_FLOAT y);

+

+    void				SetTextState(CPDF_TextState TextState);

+    virtual void		Transform(const CFX_AffineMatrix& matrix);

+

+    void				CalcCharPos(FX_FLOAT* pPosArray) const;

+

+

+

+    void				SetData(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, FX_FLOAT x, FX_FLOAT y);

+

+    void				GetData(int& nChars, FX_DWORD*& pCharCodes, FX_FLOAT*& pCharPos)

+    {

+        nChars = m_nChars;

+        pCharCodes = m_pCharCodes;

+        pCharPos = m_pCharPos;

+    }

+

+

+    void				RecalcPositionData()

+    {

+        CalcPositionData(NULL, NULL, 1);

+    }

+protected:

+    virtual void		CopyData(const CPDF_PageObject* pSrcObject);

+

+    FX_FLOAT			m_PosX;

+

+    FX_FLOAT			m_PosY;

+

+    int					m_nChars;

+

+    FX_DWORD*			m_pCharCodes;

+

+    FX_FLOAT*		m_pCharPos;

+

+    void				SetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);

+

+    void				CalcPositionData(FX_FLOAT* pTextAdvanceX, FX_FLOAT* pTextAdvanceY, FX_FLOAT horz_scale, int level = 0);

+    friend class		CPDF_StreamContentParser;

+    friend class		CPDF_RenderStatus;

+    friend class		CPDF_QuickDrawer;

+    friend class		CPDF_TextRenderer;

+    friend class		CTextPage;

+    friend class		CPDF_ContentGenerator;

+};

+class CPDF_PathObject : public CPDF_PageObject

+{

+public:

+

+    CPDF_PathObject()

+    {

+        m_Type = PDFPAGE_PATH;

+    }

+

+    virtual ~CPDF_PathObject() {}

+    virtual void		Transform(const CFX_AffineMatrix& maxtrix);

+

+    void				SetGraphState(CPDF_GraphState GraphState);

+

+    CPDF_Path			m_Path;

+

+    int					m_FillType;

+

+    FX_BOOL				m_bStroke;

+

+    CFX_AffineMatrix	m_Matrix;

+

+

+    void				CalcBoundingBox();

+protected:

+    virtual void		CopyData(const CPDF_PageObject* pSrcObjet);

+};

+class CPDF_ImageObject : public CPDF_PageObject

+{

+public:

+

+    CPDF_ImageObject();

+

+    virtual ~CPDF_ImageObject();

+    virtual void		Transform(const CFX_AffineMatrix& matrix);

+

+    CPDF_Image*			m_pImage;

+

+    CFX_AffineMatrix	m_Matrix;

+

+    void				CalcBoundingBox();

+private:

+    virtual void		CopyData(const CPDF_PageObject* pSrcObjet);

+};

+class CPDF_ShadingObject : public CPDF_PageObject

+{

+public:

+

+    CPDF_ShadingObject();

+

+    virtual ~CPDF_ShadingObject();

+

+    CPDF_ShadingPattern*	m_pShading;

+

+    CFX_AffineMatrix	m_Matrix;

+

+    CPDF_Page*			m_pPage;

+    virtual void		Transform(const CFX_AffineMatrix& matrix);

+

+    void				CalcBoundingBox();

+protected:

+    virtual void		CopyData(const CPDF_PageObject* pSrcObjet);

+};

+class CPDF_FormObject : public CPDF_PageObject

+{

+public:

+

+    CPDF_FormObject()

+    {

+        m_Type = PDFPAGE_FORM;

+        m_pForm = NULL;

+    }

+

+    virtual ~CPDF_FormObject();

+    virtual void		Transform(const CFX_AffineMatrix& matrix);

+

+    CPDF_Form*			m_pForm;

+

+    CFX_AffineMatrix	m_FormMatrix;

+

+    void				CalcBoundingBox();

+protected:

+    virtual void		CopyData(const CPDF_PageObject* pSrcObjet);

+};

+class CPDF_InlineImages : public CPDF_PageObject

+{

+public:

+

+    CPDF_InlineImages();

+

+    virtual ~CPDF_InlineImages();

+

+    CPDF_Stream*		m_pStream;

+

+    CFX_DIBitmap*		m_pBitmap;

+

+    CFX_ArrayTemplate<CFX_AffineMatrix>	m_Matrices;

+

+    void				AddMatrix(CFX_AffineMatrix& matrix);

+protected:

+    virtual void		Transform(const CFX_AffineMatrix& matrix) {}

+    virtual void		CopyData(const CPDF_PageObject* pSrcObjet) {}

+};

+#endif

diff --git a/core/include/fpdfapi/fpdf_parser.h b/core/include/fpdfapi/fpdf_parser.h
new file mode 100644
index 0000000..9d41539
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_parser.h
@@ -0,0 +1,1149 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_PARSER_

+#define _FPDF_PARSER_

+#ifndef _FX_BASIC_H_

+#include "../fxcrt/fx_ext.h"

+#endif

+#ifndef _FPDF_OBJECTS_

+#include "fpdf_objects.h"

+#endif

+class CPDF_Document;

+class IPDF_DocParser;

+class CPDF_Parser;

+class CPDF_SecurityHandler;

+class CPDF_StandardSecurityHandler;

+class CPDF_CryptoHandler;

+class CPDF_Object;

+class IFX_FileRead;

+class CFDF_Document;

+class CFDF_Parser;

+class CFX_Font;

+class CFX_AffineMatrix;

+class CFX_FloatRect;

+class CPDF_Point;

+class CPDF_DocPageData;

+class CPDF_DocRenderData;

+class CPDF_ModuleMgr;

+class CFX_DIBSource;

+class CPDF_Font;

+class CPDF_Image;

+class CPDF_ColorSpace;

+class CPDF_Pattern;

+class CPDF_FontEncoding;

+class CPDF_IccProfile;

+class CFX_PrivateData;

+#define FPDFPERM_PRINT			0x0004

+#define FPDFPERM_MODIFY			0x0008

+#define FPDFPERM_EXTRACT		0x0010

+#define FPDFPERM_ANNOT_FORM		0x0020

+#define FPDFPERM_FILL_FORM		0x0100

+#define FPDFPERM_EXTRACT_ACCESS	0x0200

+#define FPDFPERM_ASSEMBLE		0x0400

+#define FPDFPERM_PRINT_HIGH		0x0800

+#define FPDF_PAGE_MAX_NUM		0xFFFFF

+class IPDF_EnumPageHandler

+{

+public:

+

+    virtual FX_BOOL EnumPage(CPDF_Dictionary* pPageDict) = 0;

+};

+class CPDF_Document : public CFX_PrivateData, public CPDF_IndirectObjects

+{

+public:

+

+    CPDF_Document(IPDF_DocParser* pParser);

+

+    CPDF_Document();

+

+    ~CPDF_Document();

+

+    IPDF_DocParser*			GetParser() const

+    {

+        return m_pParser;

+    }

+

+    CPDF_Dictionary*		GetRoot() const

+    {

+        return m_pRootDict;

+    }

+

+    CPDF_Dictionary*		GetInfo() const

+    {

+        return m_pInfoDict;

+    }

+

+    void					GetID(CFX_ByteString& id1, CFX_ByteString& id2) const

+    {

+        id1 = m_ID1;

+        id2 = m_ID2;

+    }

+

+    int						GetPageCount() const;

+

+    CPDF_Dictionary*		GetPage(int iPage);

+

+    int						GetPageIndex(FX_DWORD objnum);

+

+    void					EnumPages(IPDF_EnumPageHandler* pHandler);

+

+    FX_DWORD				GetUserPermissions(FX_BOOL bCheckRevision = FALSE) const;

+

+    FX_BOOL					IsOwner() const;

+

+

+

+    CPDF_DocPageData*		GetPageData()

+    {

+        return GetValidatePageData();

+    }

+

+    void					ClearPageData();

+

+    void					RemoveColorSpaceFromPageData(CPDF_Object* pObject);

+

+

+    CPDF_DocRenderData*		GetRenderData()

+    {

+        return GetValidateRenderData();

+    }

+

+    void					ClearRenderData();

+

+    void					ClearRenderFont();

+

+

+    FX_BOOL					IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const;

+

+

+

+

+    CPDF_Font*				LoadFont(CPDF_Dictionary* pFontDict);

+

+    CPDF_Font*				FindFont(CPDF_Dictionary* pFontDict);

+

+    CPDF_ColorSpace*		LoadColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources = NULL);

+

+    CPDF_Pattern*			LoadPattern(CPDF_Object* pObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix = NULL);

+

+    CPDF_Image*				LoadImageF(CPDF_Object* pObj);

+

+    CPDF_StreamAcc*			LoadFontFile(CPDF_Stream* pStream);

+

+    CPDF_IccProfile*		LoadIccProfile(CPDF_Stream* pStream, int nComponents);

+

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+

+    CPDF_Font*				AddWindowsFont(LOGFONTA* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);

+    CPDF_Font*				AddWindowsFont(LOGFONTW* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);

+#endif

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_

+    CPDF_Font*              AddMacFont(CTFontRef pFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);

+#endif

+

+    CPDF_Font*				AddStandardFont(const FX_CHAR* font, CPDF_FontEncoding* pEncoding);

+

+

+    CPDF_Font*				AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert);

+

+    void					CreateNewDoc();

+

+    CPDF_Dictionary*		CreateNewPage(int iPage);

+

+    void					DeletePage(int iPage);

+

+    void					LoadDoc();

+    void					LoadAsynDoc(CPDF_Dictionary *pLinearized);

+    void					LoadPages();

+protected:

+

+    CPDF_Dictionary*		m_pRootDict;

+

+    CPDF_Dictionary*		m_pInfoDict;

+

+    CFX_ByteString			m_ID1;

+

+    CFX_ByteString			m_ID2;

+

+

+    FX_BOOL					m_bLinearized;

+

+    FX_DWORD				m_dwFirstPageNo;

+

+    FX_DWORD				m_dwFirstPageObjNum;

+

+    CFX_DWordArray			m_PageList;

+

+    int						_GetPageCount() const;

+    CPDF_Dictionary*		_FindPDFPage(CPDF_Dictionary* pPages, int iPage, int nPagesToGo, int level);

+    int						_FindPageIndex(CPDF_Dictionary* pNode, FX_DWORD& skip_count, FX_DWORD objnum, int& index, int level = 0);

+    FX_BOOL					IsContentUsedElsewhere(FX_DWORD objnum, CPDF_Dictionary* pPageDict);

+    FX_BOOL					CheckOCGVisible(CPDF_Dictionary* pOCG, FX_BOOL bPrinting);

+    CPDF_DocPageData*		GetValidatePageData();

+    CPDF_DocRenderData*		GetValidateRenderData();

+    friend class			CPDF_Creator;

+    friend class			CPDF_Parser;

+    friend class			CPDF_DataAvail;

+    friend class			CPDF_OCContext;

+

+

+

+    CPDF_DocPageData*		m_pDocPage;

+

+    CPDF_DocRenderData*		m_pDocRender;

+

+};

+

+#define PDFWORD_EOF			0

+#define PDFWORD_NUMBER		1

+#define PDFWORD_TEXT		2

+#define PDFWORD_DELIMITER	3

+#define PDFWORD_NAME		4

+class CPDF_SimpleParser : public CFX_Object

+{

+public:

+

+    CPDF_SimpleParser(FX_LPCBYTE pData, FX_DWORD dwSize);

+

+    CPDF_SimpleParser(FX_BSTR str);

+

+    CFX_ByteStringC		GetWord();

+

+    FX_BOOL				SearchToken(FX_BSTR token);

+

+    FX_BOOL				SkipWord(FX_BSTR token);

+

+    FX_BOOL				FindTagPair(FX_BSTR start_token, FX_BSTR end_token,

+                                    FX_DWORD& start_pos, FX_DWORD& end_pos);

+

+    FX_BOOL				FindTagParam(FX_BSTR token, int nParams);

+

+    FX_DWORD			GetPos()

+    {

+        return m_dwCurPos;

+    }

+

+    void				SetPos(FX_DWORD pos)

+    {

+        ASSERT(pos <= m_dwSize);

+        m_dwCurPos = pos;

+    }

+private:

+

+    void				ParseWord(FX_LPCBYTE& pStart, FX_DWORD& dwSize, int& type);

+

+    FX_LPCBYTE			m_pData;

+

+    FX_DWORD			m_dwSize;

+

+    FX_DWORD			m_dwCurPos;

+};

+class CPDF_SyntaxParser : public CFX_Object

+{

+public:

+

+    CPDF_SyntaxParser();

+

+    ~CPDF_SyntaxParser();

+

+    void				InitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOffset);

+

+    FX_FILESIZE			SavePos()

+    {

+        return m_Pos;

+    }

+

+    void				RestorePos(FX_FILESIZE pos)

+    {

+        m_Pos = pos;

+    }

+

+    CPDF_Object*		GetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, int level, struct PARSE_CONTEXT* pContext = NULL, FX_BOOL bDecrypt = TRUE);

+

+

+    CPDF_Object*		GetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, int level, struct PARSE_CONTEXT* pContext = NULL);

+

+    int					GetDirectNum();

+

+    CFX_ByteString		GetString(FX_DWORD objnum, FX_DWORD gennum);

+

+    CFX_ByteString		GetName();

+

+    CFX_ByteString		GetKeyword();

+

+    void				GetBinary(FX_BYTE* buffer, FX_DWORD size);

+

+    void				ToNextLine();

+

+    void				ToNextWord();

+

+    FX_BOOL				SearchWord(FX_BSTR word, FX_BOOL bWholeWord, FX_BOOL bForward, FX_FILESIZE limit);

+

+    int					SearchMultiWord(FX_BSTR words, FX_BOOL bWholeWord, FX_FILESIZE limit);

+

+    FX_FILESIZE			FindTag(FX_BSTR tag, FX_FILESIZE limit);

+

+    void				SetEncrypt(CPDF_CryptoHandler* pCryptoHandler)

+    {

+        m_pCryptoHandler = pCryptoHandler;

+    }

+

+    FX_BOOL				IsEncrypted()

+    {

+        return m_pCryptoHandler != NULL;

+    }

+

+    FX_BOOL				GetCharAt(FX_FILESIZE pos, FX_BYTE& ch);

+

+    FX_BOOL				ReadBlock(FX_BYTE* pBuf, FX_DWORD size);

+

+    CFX_ByteString		GetNextWord(FX_BOOL& bIsNumber);

+protected:

+

+    virtual FX_BOOL				GetNextChar(FX_BYTE& ch);

+

+    FX_BOOL				GetCharAtBackward(FX_FILESIZE pos, FX_BYTE& ch);

+

+    void				GetNextWord();

+

+    FX_BOOL				IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit, FX_LPCBYTE tag, FX_DWORD taglen);

+

+    CFX_ByteString		ReadString();

+

+    CFX_ByteString		ReadHexString();

+

+    CPDF_Stream*		ReadStream(CPDF_Dictionary* pDict, PARSE_CONTEXT* pContext, FX_DWORD objnum, FX_DWORD gennum);

+

+    FX_FILESIZE			m_Pos;

+

+    FX_BOOL				m_bFileStream;

+

+    int					m_MetadataObjnum;

+

+    IFX_FileRead*		m_pFileAccess;

+

+    FX_DWORD			m_HeaderOffset;

+

+    FX_FILESIZE			m_FileLen;

+

+    FX_BYTE*			m_pFileBuf;

+

+    FX_DWORD			m_BufSize;

+

+    FX_FILESIZE			m_BufOffset;

+

+    CPDF_CryptoHandler*	m_pCryptoHandler;

+

+    FX_BYTE				m_WordBuffer[257];

+

+    FX_DWORD			m_WordSize;

+

+    FX_BOOL				m_bIsNumber;

+

+    FX_FILESIZE			m_dwWordPos;

+    friend class		CPDF_Parser;

+    friend class		CPDF_DataAvail;

+};

+

+#define PDFPARSE_TYPEONLY	1

+#define PDFPARSE_NOSTREAM	2

+struct PARSE_CONTEXT {

+

+    FX_BOOL		m_Flags;

+

+    FX_FILESIZE	m_DictStart;

+

+    FX_FILESIZE	m_DictEnd;

+

+    FX_FILESIZE	m_DataStart;

+

+    FX_FILESIZE	m_DataEnd;

+};

+class IPDF_DocParser : public CFX_Object

+{

+public:

+

+    virtual FX_DWORD	GetRootObjNum() = 0;

+

+    virtual FX_DWORD	GetInfoObjNum() = 0;

+

+    virtual CPDF_Object*	ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext = NULL) = 0;

+

+    virtual FX_DWORD	GetLastObjNum() = 0;

+

+    virtual CPDF_Array*	GetIDArray() = 0;

+

+    virtual CPDF_Dictionary*	GetEncryptDict() = 0;

+

+    FX_BOOL				IsEncrypted()

+    {

+        return GetEncryptDict() != NULL;

+    }

+

+    virtual FX_DWORD	GetPermissions(FX_BOOL bCheckRevision = FALSE) = 0;

+

+    virtual FX_BOOL		IsOwner() = 0;

+

+    virtual FX_BOOL		IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) = 0;

+};

+

+#define PDFPARSE_ERROR_SUCCESS		0

+#define PDFPARSE_ERROR_FILE			1

+#define PDFPARSE_ERROR_FORMAT		2

+#define PDFPARSE_ERROR_PASSWORD		3

+#define PDFPARSE_ERROR_HANDLER		4

+#define PDFPARSE_ERROR_CERT			5

+class CPDF_Parser : public IPDF_DocParser

+{

+public:

+

+    CPDF_Parser();

+

+    ~CPDF_Parser();

+

+    FX_DWORD			StartParse(FX_LPCSTR filename, FX_BOOL bReParse = FALSE);

+

+    FX_DWORD			StartParse(FX_LPCWSTR filename, FX_BOOL bReParse = FALSE);

+

+    FX_DWORD			StartParse(IFX_FileRead* pFile, FX_BOOL bReParse = FALSE, FX_BOOL bOwnFileRead = TRUE);

+

+    void				CloseParser(FX_BOOL bReParse = FALSE);

+

+    virtual FX_DWORD	GetPermissions(FX_BOOL bCheckRevision = FALSE);

+

+    virtual FX_BOOL		IsOwner();

+

+    void				SetPassword(const FX_CHAR* password)

+    {

+        m_Password = password;

+    }

+

+    CFX_ByteString		GetPassword()

+    {

+        return m_Password;

+    }

+

+    CPDF_SecurityHandler* GetSecurityHandler()

+    {

+        return m_pSecurityHandler;

+    }

+

+    CPDF_CryptoHandler*	GetCryptoHandler()

+    {

+        return m_Syntax.m_pCryptoHandler;

+    }

+

+    void				SetSecurityHandler(CPDF_SecurityHandler* pSecurityHandler, FX_BOOL bForced = FALSE);

+

+    CFX_ByteString		GetRecipient()

+    {

+        return m_bsRecipient;

+    }

+

+    CPDF_Dictionary*	GetTrailer()

+    {

+        return m_pTrailer;

+    }

+

+    FX_FILESIZE			GetLastXRefOffset()

+    {

+        return m_LastXRefOffset;

+    }

+

+    CPDF_Document*		GetDocument()

+    {

+        return m_pDocument;

+    }

+    CFX_ArrayTemplate<CPDF_Dictionary *> * GetOtherTrailers()

+    {

+        return &m_Trailers;

+    }

+

+    virtual FX_DWORD	GetRootObjNum();

+    virtual FX_DWORD	GetInfoObjNum();

+    virtual CPDF_Array*	GetIDArray();

+    virtual CPDF_Dictionary*	GetEncryptDict()

+    {

+        return m_pEncryptDict;

+    }

+    virtual CPDF_Object*		ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext = NULL);

+    virtual FX_DWORD	GetLastObjNum();

+    virtual FX_BOOL		IsFormStream(FX_DWORD objnum, FX_BOOL& bForm);

+

+    FX_FILESIZE			GetObjectOffset(FX_DWORD objnum);

+

+    FX_FILESIZE			GetObjectSize(FX_DWORD objnum);

+

+    int					GetObjectVersion(FX_DWORD objnum)

+    {

+        return m_ObjVersion[objnum];

+    }

+

+    void				GetIndirectBinary(FX_DWORD objnum, FX_BYTE*& pBuffer, FX_DWORD& size);

+

+    FX_BOOL				GetFileStreamOption()

+    {

+        return m_Syntax.m_bFileStream;

+    }

+

+    void				SetFileStreamOption(FX_BOOL b)

+    {

+        m_Syntax.m_bFileStream = b;

+    }

+

+    IFX_FileRead*		GetFileAccess() const

+    {

+        return m_Syntax.m_pFileAccess;

+    }

+

+    int					GetFileVersion() const

+    {

+        return m_FileVersion;

+    }

+

+    FX_BOOL				IsXRefStream() const

+    {

+        return m_bXRefStream;

+    }

+    CPDF_Object*		ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,

+            struct PARSE_CONTEXT* pContext);

+

+    CPDF_Object*		ParseIndirectObjectAtByStrict(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,

+            struct PARSE_CONTEXT* pContext, FX_FILESIZE *pResultPos);

+

+    FX_DWORD			StartAsynParse(IFX_FileRead* pFile, FX_BOOL bReParse = FALSE, FX_BOOL bOwnFileRead = TRUE);

+

+    FX_DWORD			GetFirstPageNo()

+    {

+        return m_dwFirstPageNo;

+    }

+protected:

+

+    CPDF_Document*		m_pDocument;

+

+    CPDF_SyntaxParser	m_Syntax;

+    FX_BOOL				m_bOwnFileRead;

+    CPDF_Object*		ParseDirect(CPDF_Object* pObj);

+

+    FX_BOOL				LoadAllCrossRefV4(FX_FILESIZE pos);

+

+    FX_BOOL				LoadAllCrossRefV5(FX_FILESIZE pos);

+

+    FX_BOOL				LoadCrossRefV4(FX_FILESIZE pos, FX_FILESIZE streampos, FX_BOOL bSkip, FX_BOOL bFirst);

+

+    FX_BOOL				LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL bMainXRef);

+

+    CPDF_Dictionary*	LoadTrailerV4();

+

+    FX_BOOL				RebuildCrossRef();

+

+    FX_DWORD			SetEncryptHandler();

+

+    void				ReleaseEncryptHandler();

+

+    FX_BOOL				LoadLinearizedAllCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount);

+

+    FX_BOOL				LoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount);

+

+    FX_BOOL				LoadLinearizedAllCrossRefV5(FX_FILESIZE pos);

+

+    FX_DWORD			LoadLinearizedMainXRefTable();

+

+    CFX_MapPtrToPtr		m_ObjectStreamMap;

+

+    CPDF_StreamAcc*		GetObjectStream(FX_DWORD number);

+

+    FX_BOOL				IsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset);

+

+

+

+    int					m_FileVersion;

+

+    CPDF_Dictionary*	m_pTrailer;

+

+    CPDF_Dictionary*	m_pEncryptDict;

+    void SetEncryptDictionary(CPDF_Dictionary* pDict);

+

+    FX_FILESIZE			m_LastXRefOffset;

+

+    FX_BOOL				m_bXRefStream;

+

+

+    CPDF_SecurityHandler*	m_pSecurityHandler;

+

+    FX_BOOL					m_bForceUseSecurityHandler;

+

+    CFX_ByteString			m_bsRecipient;

+

+    CFX_ByteString		m_FilePath;

+

+    CFX_ByteString		m_Password;

+

+    CFX_FileSizeArray	m_CrossRef;

+

+    CFX_ByteArray		m_V5Type;

+

+    CFX_FileSizeArray	m_SortedOffset;

+

+    CFX_WordArray		m_ObjVersion;

+    CFX_ArrayTemplate<CPDF_Dictionary *>	m_Trailers;

+

+    FX_BOOL				m_bVersionUpdated;

+

+    CPDF_Object*		m_pLinearized;

+

+    FX_DWORD			m_dwFirstPageNo;

+

+    FX_DWORD			m_dwXrefStartObjNum;

+    friend class		CPDF_Creator;

+    friend class		CPDF_DataAvail;

+};

+#define FXCIPHER_NONE	0

+#define FXCIPHER_RC4	1

+#define FXCIPHER_AES	2

+#define FXCIPHER_AES2   3

+class CPDF_SecurityHandler : public CFX_Object

+{

+public:

+

+    virtual ~CPDF_SecurityHandler() {}

+

+    virtual FX_BOOL		OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict) = 0;

+

+    virtual FX_DWORD	GetPermissions() = 0;

+

+    virtual FX_BOOL		IsOwner() = 0;

+

+    virtual FX_BOOL		GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen) = 0;

+

+    virtual FX_BOOL		IsMetadataEncrypted()

+    {

+        return TRUE;

+    }

+

+    virtual CPDF_CryptoHandler*	CreateCryptoHandler() = 0;

+

+    virtual CPDF_StandardSecurityHandler* GetStandardHandler()

+    {

+        return NULL;

+    }

+};

+#define PDF_ENCRYPT_CONTENT				0

+class CPDF_StandardSecurityHandler : public CPDF_SecurityHandler

+{

+public:

+    CPDF_StandardSecurityHandler();

+

+    virtual ~CPDF_StandardSecurityHandler();

+    virtual FX_BOOL		OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict);

+    virtual FX_DWORD	GetPermissions();

+    virtual FX_BOOL		IsOwner()

+    {

+        return m_bOwner;

+    }

+    virtual FX_BOOL		GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen);

+    virtual FX_BOOL		IsMetadataEncrypted();

+    virtual CPDF_CryptoHandler*	CreateCryptoHandler();

+    virtual CPDF_StandardSecurityHandler* GetStandardHandler()

+    {

+        return this;

+    }

+

+    void				OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,

+                                 FX_LPCBYTE user_pass, FX_DWORD user_size,

+                                 FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_DWORD type = PDF_ENCRYPT_CONTENT);

+

+    void				OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,

+                                 FX_LPCBYTE user_pass, FX_DWORD user_size, FX_DWORD type = PDF_ENCRYPT_CONTENT);

+

+    CFX_ByteString		GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size);

+    CFX_ByteString		GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size, FX_INT32 key_len);

+    int					GetVersion()

+    {

+        return m_Version;

+    }

+    int					GetRevision()

+    {

+        return m_Revision;

+    }

+

+    int					CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key);

+    int					CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key, int key_len);

+private:

+

+    int					m_Version;

+

+    int					m_Revision;

+

+    CPDF_Parser*		m_pParser;

+

+    CPDF_Dictionary*	m_pEncryptDict;

+

+    FX_BOOL				LoadDict(CPDF_Dictionary* pEncryptDict);

+    FX_BOOL				LoadDict(CPDF_Dictionary* pEncryptDict, FX_DWORD type, int& cipher, int& key_len);

+

+    FX_BOOL				CheckUserPassword(FX_LPCBYTE password, FX_DWORD pass_size,

+                                          FX_BOOL bIgnoreEncryptMeta, FX_LPBYTE key, FX_INT32 key_len);

+

+    FX_BOOL				CheckOwnerPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_LPBYTE key, FX_INT32 key_len);

+    FX_BOOL				AES256_CheckPassword(FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPBYTE key);

+    void				AES256_SetPassword(CPDF_Dictionary* pEncryptDict, FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPCBYTE key);

+    void				AES256_SetPerms(CPDF_Dictionary* pEncryptDict, FX_DWORD permission, FX_BOOL bEncryptMetadata, FX_LPCBYTE key);

+    void				OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,

+                                 FX_LPCBYTE user_pass, FX_DWORD user_size,

+                                 FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_BOOL bDefault, FX_DWORD type);

+    FX_BOOL				CheckSecurity(FX_INT32 key_len);

+

+    FX_BOOL				m_bOwner;

+

+    FX_DWORD			m_Permissions;

+

+    int					m_Cipher;

+

+    FX_BYTE				m_EncryptKey[32];

+

+    int					m_KeyLen;

+};

+class CPDF_CryptoHandler : public CFX_Object

+{

+public:

+

+    virtual ~CPDF_CryptoHandler() {}

+

+    virtual FX_BOOL		Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler) = 0;

+

+    virtual FX_DWORD	DecryptGetSize(FX_DWORD src_size) = 0;

+

+    virtual FX_LPVOID	DecryptStart(FX_DWORD objnum, FX_DWORD gennum) = 0;

+

+    virtual FX_BOOL		DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) = 0;

+

+    virtual FX_BOOL		DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf) = 0;

+

+

+    virtual FX_DWORD	EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;

+

+    virtual FX_BOOL		EncryptContent(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size,

+                                       FX_LPBYTE dest_buf, FX_DWORD& dest_size) = 0;

+

+    void				Decrypt(FX_DWORD objnum, FX_DWORD version, CFX_ByteString& str);

+};

+class CPDF_StandardCryptoHandler : public CPDF_CryptoHandler

+{

+public:

+

+    CPDF_StandardCryptoHandler();

+

+    virtual ~CPDF_StandardCryptoHandler();

+

+    FX_BOOL				Init(int cipher, FX_LPCBYTE key, int keylen);

+    virtual FX_BOOL		Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler);

+    virtual FX_DWORD	DecryptGetSize(FX_DWORD src_size);

+    virtual FX_LPVOID	DecryptStart(FX_DWORD objnum, FX_DWORD gennum);

+    virtual FX_BOOL		DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);

+    virtual FX_BOOL		DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf);

+    virtual FX_DWORD	EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size);

+    virtual FX_BOOL		EncryptContent(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size,

+                                       FX_LPBYTE dest_buf, FX_DWORD& dest_size);

+protected:

+

+    virtual void		CryptBlock(FX_BOOL bEncrypt, FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,

+                                   FX_LPBYTE dest_buf, FX_DWORD& dest_size);

+    virtual FX_LPVOID	CryptStart(FX_DWORD objnum, FX_DWORD gennum, FX_BOOL bEncrypt);

+    virtual FX_BOOL		CryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt);

+    virtual FX_BOOL		CryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt);

+

+    FX_BYTE				m_EncryptKey[32];

+

+    int					m_KeyLen;

+

+    int					m_Cipher;

+

+    FX_LPBYTE			m_pAESContext;

+};

+class CPDF_Point : public CFX_Object

+{

+public:

+

+    CPDF_Point(FX_FLOAT xx, FX_FLOAT yy)

+    {

+        x = xx;

+        y = yy;

+    }

+

+    FX_FLOAT			x;

+

+    FX_FLOAT			y;

+};

+

+#define CPDF_Rect		CFX_FloatRect

+#define CPDF_Matrix		CFX_AffineMatrix

+CFX_ByteString PDF_NameDecode(FX_BSTR orig);

+CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig);

+CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig);

+CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex = FALSE);

+CFX_WideString PDF_DecodeText(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL);

+CFX_WideString PDF_DecodeText(FX_LPCBYTE pData, FX_DWORD size, CFX_CharMap* pCharMap = NULL);

+CFX_ByteString PDF_EncodeText(FX_LPCWSTR pString, int len = -1, CFX_CharMap* pCharMap = NULL);

+FX_FLOAT PDF_ClipFloat(FX_FLOAT f);

+class CFDF_Document : public CPDF_IndirectObjects

+{

+public:

+

+    static CFDF_Document*	CreateNewDoc();

+

+    static CFDF_Document*	ParseFile(FX_LPCSTR file_path);

+

+    static CFDF_Document*	ParseFile(FX_LPCWSTR file_path);

+

+    static CFDF_Document*	ParseFile(IFX_FileRead *pFile, FX_BOOL bOwnFile = FALSE);

+

+    static CFDF_Document*	ParseMemory(FX_LPCBYTE pData, FX_DWORD size);

+

+    ~CFDF_Document();

+

+    FX_BOOL					WriteFile(FX_LPCSTR file_path) const;

+

+    FX_BOOL					WriteFile(FX_LPCWSTR file_path) const;

+

+    FX_BOOL					WriteFile(IFX_FileWrite *pFile) const;

+

+    FX_BOOL					WriteBuf(CFX_ByteTextBuf& buf) const;

+

+    CPDF_Dictionary*		GetRoot() const

+    {

+        return m_pRootDict;

+    }

+

+    CFX_WideString			GetWin32Path() const;

+protected:

+

+    CFDF_Document();

+    void	ParseStream(IFX_FileRead *pFile, FX_BOOL bOwnFile);

+    CPDF_Dictionary*		m_pRootDict;

+    IFX_FileRead*			m_pFile;

+    FX_BOOL					m_bOwnFile;

+};

+

+CFX_WideString	FPDF_FileSpec_GetWin32Path(const CPDF_Object* pFileSpec);

+void			FPDF_FileSpec_SetWin32Path(CPDF_Object* pFileSpec, const CFX_WideString& fullpath);

+

+void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+FX_DWORD FlateDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+FX_DWORD RunLengthDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+class CPDF_NumberTree : public CFX_Object

+{

+public:

+

+    CPDF_NumberTree(CPDF_Dictionary* pRoot)

+    {

+        m_pRoot = pRoot;

+    }

+

+    CPDF_Object*		LookupValue(int num);

+protected:

+

+    CPDF_Dictionary*	m_pRoot;

+};

+

+class IFX_FileAvail

+{

+public:

+

+    virtual FX_BOOL			IsDataAvail( FX_FILESIZE offset, FX_DWORD size) = 0;

+};

+class IFX_DownloadHints

+{

+public:

+

+    virtual void			AddSegment(FX_FILESIZE offset, FX_DWORD size) = 0;

+};

+#define PDF_IS_LINEARIZED			1

+#define PDF_NOT_LINEARIZED			0

+#define PDF_UNKNOW_LINEARIZED		-1

+#define PDFFORM_NOTAVAIL		0

+#define PDFFORM_AVAIL			1

+#define PDFFORM_NOTEXIST		2

+class IPDF_DataAvail

+{

+public:

+

+    virtual FX_BOOL			IsDocAvail(IFX_DownloadHints* pHints) = 0;

+

+

+    virtual void			SetDocument(CPDF_Document* pDoc) = 0;

+

+

+    virtual FX_BOOL			IsPageAvail(int iPage, IFX_DownloadHints* pHints) = 0;

+

+    virtual FX_BOOL			IsLinearized() = 0;

+

+    virtual FX_INT32		IsFormAvail(IFX_DownloadHints *pHints) = 0;

+

+    virtual FX_INT32		IsLinearizedPDF() = 0;

+

+    virtual void				GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize) = 0;

+};

+class CPDF_SortObjNumArray : public CFX_Object

+{

+public:

+

+    void AddObjNum(FX_DWORD dwObjNum);

+

+    FX_BOOL Find(FX_DWORD dwObjNum);

+

+    void RemoveAll()

+    {

+        m_number_array.RemoveAll();

+    }

+protected:

+

+    FX_BOOL BinarySearch(FX_DWORD value, int &iNext);

+protected:

+

+    CFX_DWordArray			m_number_array;

+};

+enum PDF_PAGENODE_TYPE {

+    PDF_PAGENODE_UNKOWN = 0,

+    PDF_PAGENODE_PAGE,

+    PDF_PAGENODE_PAGES,

+    PDF_PAGENODE_ARRAY,

+};

+class CPDF_PageNode : public CFX_Object

+{

+public:

+    CPDF_PageNode() : m_type(PDF_PAGENODE_UNKOWN) {}

+    ~CPDF_PageNode();

+    PDF_PAGENODE_TYPE	m_type;

+    FX_DWORD			m_dwPageNo;

+    CFX_PtrArray		m_childNode;

+};

+enum PDF_DATAAVAIL_STATUS {

+    PDF_DATAAVAIL_HEADER = 0,

+    PDF_DATAAVAIL_FIRSTPAGE,

+    PDF_DATAAVAIL_FIRSTPAGE_PREPARE,

+    PDF_DATAAVAIL_END,

+    PDF_DATAAVAIL_CROSSREF,

+    PDF_DATAAVAIL_CROSSREF_ITEM,

+    PDF_DATAAVAIL_CROSSREF_STREAM,

+    PDF_DATAAVAIL_TRAILER,

+    PDF_DATAAVAIL_LOADALLCRSOSSREF,

+    PDF_DATAAVAIL_ROOT,

+    PDF_DATAAVAIL_INFO,

+    PDF_DATAAVAIL_ACROFORM,

+    PDF_DATAAVAIL_ACROFORM_SUBOBJECT,

+    PDF_DATAAVAIL_PAGETREE,

+    PDF_DATAAVAIL_PAGE,

+    PDF_DATAAVAIL_PAGE_LATERLOAD,

+    PDF_DATAAVAIL_RESOURCES,

+    PDF_DATAAVAIL_DONE,

+    PDF_DATAAVAIL_ERROR,

+    PDF_DATAAVAIL_LOADALLFILE,

+    PDF_DATAAVAIL_TRAILER_APPEND

+};

+class CPDF_DataAvail : public CFX_Object, public IPDF_DataAvail

+{

+public:

+

+    CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead);

+    ~CPDF_DataAvail();

+

+    virtual FX_BOOL				IsDocAvail(IFX_DownloadHints* pHints);

+

+

+    virtual void				SetDocument(CPDF_Document* pDoc);

+

+

+    virtual FX_BOOL				IsPageAvail(int iPage, IFX_DownloadHints* pHints);

+

+    virtual FX_INT32			IsFormAvail(IFX_DownloadHints *pHints);

+

+    virtual FX_INT32			IsLinearizedPDF();

+

+    virtual FX_BOOL				IsLinearized()

+    {

+        return m_bLinearized;

+    }

+

+    virtual void				GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize);

+    IFX_FileRead*				GetFileRead() const

+    {

+        return m_pFileRead;

+    }

+    IFX_FileAvail*				GetFileAvail() const

+    {

+        return m_pFileAvail;

+    }

+protected:

+    FX_DWORD					GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset);

+    FX_BOOL						IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePage, IFX_DownloadHints* pHints, CFX_PtrArray &ret_array);

+    FX_BOOL						CheckDocStatus(IFX_DownloadHints *pHints);

+    FX_BOOL						CheckHeader(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckFirstPage(IFX_DownloadHints *pHints);

+    FX_BOOL						CheckEnd(IFX_DownloadHints *pHints);

+    FX_BOOL						CheckCrossRef(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckCrossRefItem(IFX_DownloadHints *pHints);

+    FX_BOOL						CheckTrailer(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckRoot(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckInfo(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckPages(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckPage(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckResources(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckAnnots(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckAcroForm(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckAcroFormSubObject(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckTrailerAppend(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckPageStatus(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckAllCrossRefStream(IFX_DownloadHints *pHints);

+

+    FX_DWORD					CheckCrossRefStream(IFX_DownloadHints *pHints, FX_FILESIZE &xref_offset);

+    FX_BOOL						IsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen);

+    void						SetStartOffset(FX_FILESIZE dwOffset);

+    FX_BOOL						GetNextToken(CFX_ByteString &token);

+    FX_BOOL						GetNextChar(FX_BYTE &ch);

+    CPDF_Object	*				ParseIndirectObjectAt(FX_FILESIZE pos, FX_DWORD objnum);

+    CPDF_Object	*				GetObject(FX_DWORD objnum, IFX_DownloadHints* pHints, FX_BOOL *pExistInFile);

+    FX_BOOL						GetPageKids(CPDF_Parser *pParser, CPDF_Object *pPages);

+    FX_BOOL						PreparePageItem();

+    FX_BOOL						LoadPages(IFX_DownloadHints* pHints);

+    FX_BOOL						LoadAllXref(IFX_DownloadHints* pHints);

+    FX_BOOL						LoadAllFile(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckLinearizedData(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckFileResources(IFX_DownloadHints* pHints);

+    FX_BOOL						CheckPageAnnots(int iPage, IFX_DownloadHints* pHints);

+

+    FX_BOOL						CheckLinearizedFirstPage(int iPage, IFX_DownloadHints* pHints);

+    FX_BOOL						HaveResourceAncestor(CPDF_Dictionary *pDict);

+    FX_BOOL						CheckPage(FX_INT32 iPage, IFX_DownloadHints* pHints);

+    FX_BOOL						LoadDocPages(IFX_DownloadHints* pHints);

+    FX_BOOL						LoadDocPage(FX_INT32 iPage, IFX_DownloadHints* pHints);

+    FX_BOOL						CheckPageNode(CPDF_PageNode &pageNodes, FX_INT32 iPage, FX_INT32 &iCount, IFX_DownloadHints* pHints);

+    FX_BOOL						CheckUnkownPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints);

+    FX_BOOL						CheckArrayPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints);

+    FX_BOOL                     CheckPageCount(IFX_DownloadHints* pHints);

+    FX_BOOL						IsFirstCheck(int iPage);

+    void						ResetFirstCheck(int iPage);

+

+    CPDF_Parser				m_parser;

+

+    CPDF_SyntaxParser		m_syntaxParser;

+

+    CPDF_Object				*m_pRoot;

+

+    FX_DWORD				m_dwRootObjNum;

+

+    FX_DWORD				m_dwInfoObjNum;

+

+    CPDF_Object				*m_pLinearized;

+

+    CPDF_Object				*m_pTrailer;

+

+    FX_BOOL					m_bDocAvail;

+

+    FX_FILESIZE				m_dwHeaderOffset;

+

+    FX_FILESIZE				m_dwLastXRefOffset;

+

+    FX_FILESIZE				m_dwXRefOffset;

+

+    FX_FILESIZE				m_dwTrailerOffset;

+

+    FX_FILESIZE				m_dwCurrentOffset;

+

+    PDF_DATAAVAIL_STATUS	m_docStatus;

+

+    IFX_FileAvail*			m_pFileAvail;

+

+    IFX_FileRead*			m_pFileRead;

+

+    FX_FILESIZE				m_dwFileLen;

+

+    CPDF_Document*			m_pDocument;

+

+    CPDF_SortObjNumArray	m_objnum_array;

+

+    CFX_PtrArray			m_objs_array;

+

+    FX_FILESIZE				m_Pos;

+

+    FX_FILESIZE				m_bufferOffset;

+

+    FX_DWORD				m_bufferSize;

+

+    CFX_ByteString			m_WordBuf;

+

+    FX_BYTE					m_WordBuffer[257];

+

+    FX_DWORD				m_WordSize;

+

+    FX_BYTE					m_bufferData[512];

+

+    CFX_FileSizeArray		m_CrossOffset;

+

+    CFX_DWordArray			m_XRefStreamList;

+

+    CFX_DWordArray			m_PageObjList;

+

+    FX_DWORD				m_PagesObjNum;

+

+    FX_BOOL					m_bLinearized;

+

+    FX_DWORD				m_dwFirstPageNo;

+

+    FX_BOOL					m_bLinearedDataOK;

+

+    FX_BOOL					m_bMainXRefLoad;

+

+    FX_BOOL					m_bMainXRefLoadedOK;

+

+    FX_BOOL					m_bPagesTreeLoad;

+

+    FX_BOOL					m_bPagesLoad;

+

+    CPDF_Parser *			m_pCurrentParser;

+

+    FX_FILESIZE				m_dwCurrentXRefSteam;

+

+    FX_BOOL					m_bAnnotsLoad;

+

+    FX_BOOL					m_bHaveAcroForm;

+

+    FX_DWORD				m_dwAcroFormObjNum;

+

+    FX_BOOL					m_bAcroFormLoad;

+

+    CPDF_Object	*			m_pAcroForm;

+

+    CFX_PtrArray			m_arrayAcroforms;

+

+    CPDF_Dictionary *		m_pPageDict;

+

+    CPDF_Object *			m_pPageResource;

+

+    FX_BOOL					m_bNeedDownLoadResource;

+

+    FX_BOOL					m_bPageLoadedOK;

+

+    FX_BOOL					m_bLinearizedFormParamLoad;

+

+    CFX_PtrArray			m_PagesArray;

+

+    FX_DWORD				m_dwEncryptObjNum;

+

+    FX_FILESIZE				m_dwPrevXRefOffset;

+

+    FX_BOOL					m_bTotalLoadPageTree;

+

+    FX_BOOL					m_bCurPageDictLoadOK;

+

+    CPDF_PageNode			m_pageNodes;

+

+    CFX_CMapDWordToDWord *	m_pageMapCheckState;

+

+    CFX_CMapDWordToDWord *	m_pagesLoadState;

+};

+#endif

diff --git a/core/include/fpdfapi/fpdf_render.h b/core/include/fpdfapi/fpdf_render.h
new file mode 100644
index 0000000..22ba56f
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_render.h
@@ -0,0 +1,318 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_RENDER_

+#define _FPDF_RENDER_

+#ifndef _FPDF_PAGE_

+#include "fpdf_page.h"

+#endif

+#ifndef _FX_GE_H_

+#include "../fxge/fx_ge.h"

+#endif

+class CPDF_RenderContext;

+class CPDF_RenderOptions;

+class CPDF_ImageCache;

+class IPDF_OCContext;

+class CPDF_QuickStretcher;

+class CFX_PathData;

+class CFX_GraphStateData;

+class CFX_RenderDevice;

+class CPDF_TextObject;

+class CPDF_PathObject;

+class CPDF_ImageObject;

+class CPDF_ShadingObject;

+class CPDF_FormObject;

+class IPDF_OCContext

+{

+public:

+

+    virtual ~IPDF_OCContext() {}

+

+    virtual FX_BOOL	CheckOCGVisible(const CPDF_Dictionary* pOCG) = 0;

+

+    FX_BOOL CheckObjectVisible(const CPDF_PageObject* pObj);

+};

+#define RENDER_COLOR_NORMAL		0

+#define RENDER_COLOR_GRAY		1

+#define RENDER_COLOR_TWOCOLOR	2

+#define RENDER_COLOR_ALPHA		3

+#define RENDER_CLEARTYPE			0x00000001

+#define RENDER_PRINTGRAPHICTEXT		0x00000002

+#define RENDER_FORCE_DOWNSAMPLE		0x00000004

+#define RENDER_PRINTPREVIEW			0x00000008

+#define RENDER_BGR_STRIPE			0x00000010

+#define RENDER_NO_NATIVETEXT		0x00000020

+#define RENDER_FORCE_HALFTONE		0x00000040

+#define RENDER_RECT_AA				0x00000080

+#define RENDER_FILL_FULLCOVER		0x00000100

+#define RENDER_PRINTIMAGETEXT       0x00000200

+#define RENDER_OVERPRINT            0x00000400

+#define RENDER_THINLINE             0x00000800

+#define RENDER_NOTEXTSMOOTH			0x10000000

+#define RENDER_NOPATHSMOOTH			0x20000000

+#define RENDER_NOIMAGESMOOTH		0x40000000

+#define RENDER_LIMITEDIMAGECACHE	0x80000000

+class CPDF_RenderOptions : public CFX_Object

+{

+public:

+

+    CPDF_RenderOptions();

+

+    int				m_ColorMode;

+

+    FX_COLORREF		m_BackColor;

+

+    FX_COLORREF		m_ForeColor;

+

+    FX_DWORD		m_Flags;

+

+    int				m_Interpolation;

+

+    FX_DWORD		m_AddFlags;

+

+    IPDF_OCContext*	m_pOCContext;

+

+    FX_DWORD		m_dwLimitCacheSize;

+

+    int				m_HalftoneLimit;

+

+    FX_ARGB			TranslateColor(FX_ARGB argb) const;

+};

+class CPDF_RenderContext : public CFX_Object

+{

+public:

+

+    CPDF_RenderContext();

+

+    void			Create(CPDF_Page* pPage, FX_BOOL bFirstLayer = TRUE);

+

+    void			Create(CPDF_Document* pDoc = NULL, CPDF_PageRenderCache* pPageCache = NULL,

+                           CPDF_Dictionary* pPageResources = NULL, FX_BOOL bFirstLayer = TRUE);

+

+    ~CPDF_RenderContext();

+

+    void			Clear();

+

+    void			AppendObjectList(CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObject2Device);

+

+    void			SetBackground(class IPDF_BackgroundDraw* pBackground);

+

+    void			Render(CFX_RenderDevice* pDevice, const CPDF_RenderOptions* pOptions = NULL,

+                           const CFX_AffineMatrix* pFinalMatrix = NULL);

+

+    void			DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObjects* pObjs,

+                                   const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions);

+

+    void			GetBackground(CFX_DIBitmap* pBuffer, const CPDF_PageObject* pObj,

+                                  const CPDF_RenderOptions* pOptions, CFX_AffineMatrix* pFinalMatrix);

+

+    CPDF_PageRenderCache*	GetPageCache() const

+    {

+        return m_pPageCache;

+    }

+

+

+

+    CPDF_Document*			m_pDocument;

+

+    CPDF_Dictionary*		m_pPageResources;

+

+    CPDF_PageRenderCache*	m_pPageCache;

+

+protected:

+

+    CFX_ArrayTemplate<struct _PDF_RenderItem>	m_ContentList;

+

+    IPDF_BackgroundDraw*	m_pBackgroundDraw;

+

+    FX_BOOL					m_bFirstLayer;

+

+    void			Render(CFX_RenderDevice* pDevice, const CPDF_PageObject* pStopObj,

+                           const CPDF_RenderOptions* pOptions, const CFX_AffineMatrix* pFinalMatrix);

+    friend class CPDF_RenderStatus;

+    friend class CPDF_ProgressiveRenderer;

+};

+class IPDF_BackgroundDraw

+{

+public:

+

+    virtual	void	OnDrawBackground(

+        CFX_RenderDevice* pBitmapDevice,

+        const CFX_AffineMatrix* pOriginal2Bitmap

+    ) = 0;

+};

+class CPDF_ProgressiveRenderer : public CFX_Object

+{

+public:

+

+    CPDF_ProgressiveRenderer();

+

+    ~CPDF_ProgressiveRenderer();

+

+    typedef enum {

+        Ready,

+        ToBeContinued,

+        Done,

+        Failed

+    } RenderStatus;

+

+    RenderStatus		GetStatus()

+    {

+        return m_Status;

+    }

+

+

+

+    void				Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,

+                              const CPDF_RenderOptions* pOptions, class IFX_Pause* pPause, FX_BOOL bDropObjects = FALSE);

+

+    void				Continue(class IFX_Pause* pPause);

+

+

+    int					EstimateProgress();

+

+    void				Clear();

+protected:

+

+    RenderStatus		m_Status;

+

+    CPDF_RenderContext*	m_pContext;

+

+    CFX_RenderDevice*	m_pDevice;

+

+    const CPDF_RenderOptions*	m_pOptions;

+

+    FX_BOOL				m_bDropObjects;

+

+    class CPDF_RenderStatus*	m_pRenderer;

+

+    CFX_FloatRect		m_ClipRect;

+

+    FX_DWORD			m_LayerIndex;

+

+    FX_DWORD			m_ObjectIndex;

+

+    FX_POSITION			m_ObjectPos;

+

+    FX_POSITION			m_PrevLastPos;

+

+    void				RenderStep();

+};

+class CPDF_TextRenderer : public CFX_Object

+{

+public:

+

+    static void		DrawTextString(CFX_RenderDevice* pDevice, int left, int top,

+                                   CPDF_Font* pFont,

+                                   int height,

+                                   const CFX_ByteString& str,

+                                   FX_ARGB argb);

+

+    static void		DrawTextString(CFX_RenderDevice* pDevice, FX_FLOAT origin_x, FX_FLOAT origin_y,

+                                   CPDF_Font* pFont,

+                                   FX_FLOAT font_size,

+                                   const CFX_AffineMatrix* matrix,

+                                   const CFX_ByteString& str,

+                                   FX_ARGB fill_argb,

+                                   FX_ARGB stroke_argb = 0,

+                                   const CFX_GraphStateData* pGraphState = NULL,

+                                   const CPDF_RenderOptions* pOptions = NULL

+                               );

+

+    static FX_BOOL	DrawTextPath(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,

+                                 CPDF_Font* pFont, FX_FLOAT font_size,

+                                 const CFX_AffineMatrix* pText2User, const CFX_AffineMatrix* pUser2Device,

+                                 const CFX_GraphStateData* pGraphState,

+                                 FX_ARGB fill_argb, FX_ARGB stroke_argb, CFX_PathData* pClippingPath, int nFlag = 0);

+

+    static FX_BOOL	DrawNormalText(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,

+                                   CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,

+                                   FX_ARGB fill_argb, const CPDF_RenderOptions* pOptions);

+

+    static FX_BOOL	DrawType3Text(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,

+                                  CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,

+                                  FX_ARGB fill_argb);

+};

+class IPDF_PageImageCache

+{

+public:

+

+    static IPDF_PageImageCache* Create();

+

+    virtual ~IPDF_PageImageCache() {}

+

+    virtual void		OutputPage(CFX_RenderDevice* pDevice, CPDF_Page* pPage,

+                                   int pos_x, int pos_y, int size_x, int size_y, int rotate) = 0;

+

+    virtual void		SetCacheLimit(FX_DWORD limit) = 0;

+};

+class CPDF_PageRenderCache : public CFX_Object

+{

+public:

+    CPDF_PageRenderCache(CPDF_Page* pPage)

+    {

+        m_pPage = pPage;

+        m_nTimeCount = 0;

+        m_nCacheSize = 0;

+        m_pCurImageCache = NULL;

+        m_bCurFindCache = FALSE;

+        m_pCurImageCaches = NULL;

+    }

+    ~CPDF_PageRenderCache()

+    {

+        ClearAll();

+    }

+    void				ClearAll();

+    void				ClearImageData();

+

+    FX_DWORD			EstimateSize();

+    void				CacheOptimization(FX_INT32 dwLimitCacheSize);

+    FX_DWORD			GetCachedSize(CPDF_Stream* pStream) const;

+    FX_DWORD			GetTimeCount() const

+    {

+        return m_nTimeCount;

+    }

+    void				SetTimeCount(FX_DWORD dwTimeCount)

+    {

+        m_nTimeCount = dwTimeCount;

+    }

+

+    void				GetCachedBitmap(CPDF_Stream* pStream, CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor,

+                                        FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE,

+                                        CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);

+

+    void				ResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap);

+    void				ClearImageCache(CPDF_Stream* pStream);

+    CPDF_Page*			GetPage()

+    {

+        return m_pPage;

+    }

+    CFX_MapPtrToPtr		m_ImageCaches;

+public:

+    FX_BOOL				StartGetCachedBitmap(CPDF_Stream* pStream, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0,

+            FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL,

+            FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);

+

+    FX_BOOL				Continue(IFX_Pause* pPause);

+    CPDF_ImageCache*	m_pCurImageCache;

+    CFX_PtrArray*       m_pCurImageCaches;

+protected:

+    friend class		CPDF_Page;

+    CPDF_Page*			m_pPage;

+

+    FX_DWORD			m_nTimeCount;

+    FX_DWORD			m_nCacheSize;

+    FX_BOOL				m_bCurFindCache;

+};

+class CPDF_RenderConfig : public CFX_Object

+{

+public:

+    CPDF_RenderConfig();

+    ~CPDF_RenderConfig();

+    int					m_HalftoneLimit;

+    int					m_RenderStepLimit;

+};

+#endif

diff --git a/core/include/fpdfapi/fpdf_resource.h b/core/include/fpdfapi/fpdf_resource.h
new file mode 100644
index 0000000..eea3afc
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_resource.h
@@ -0,0 +1,960 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_RESOURCE_

+#define _FPDF_RESOURCE_

+#ifndef _FPDF_PARSER_

+#include "fpdf_parser.h"

+#endif

+#ifndef _FX_FONT_H_

+#include "../fxge/fx_font.h"

+#endif

+class CPDF_Font;

+class CPDF_Type1Font;

+class CPDF_TrueTypeFont;

+class CPDF_CIDFont;

+class CPDF_Type3Font;

+class CPDF_FontEncoding;

+class CPDF_CMap;

+class CPDF_CID2UnicodeMap;

+class CPDF_ColorSpace;

+class CPDF_Color;

+class CPDF_Function;

+class CPDF_Pattern;

+class CPDF_TilingPattern;

+class CPDF_ShadingPattern;

+class CPDF_Image;

+class CPDF_Face;

+class CPDF_ToUnicodeMap;

+class CFX_SubstFont;

+class CFX_Font;

+class CPDF_RenderContext;

+class CPDF_Form;

+class CPDF_ImageObject;

+class CFX_DIBitmap;

+typedef struct FT_FaceRec_* FXFT_Face;

+class CFX_CTTGSUBTable;

+class CPDF_Page;

+#define PDFFONT_TYPE1			1

+#define PDFFONT_TRUETYPE		2

+#define PDFFONT_TYPE3			3

+#define PDFFONT_CIDFONT			4

+#define PDFFONT_FIXEDPITCH		1

+#define PDFFONT_SERIF			2

+#define PDFFONT_SYMBOLIC		4

+#define PDFFONT_SCRIPT			8

+#define PDFFONT_NONSYMBOLIC		32

+#define PDFFONT_ITALIC			64

+#define PDFFONT_ALLCAP			0x10000

+#define PDFFONT_SMALLCAP		0x20000

+#define PDFFONT_FORCEBOLD		0x40000

+#define PDFFONT_USEEXTERNATTR	0x80000

+FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name);

+CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode);

+class CPDF_Font : public CFX_Object

+{

+public:

+

+    static CPDF_Font*		CreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict);

+

+    static CPDF_Font*		GetStockFont(CPDF_Document* pDoc, FX_BSTR fontname);

+

+    virtual ~CPDF_Font();

+

+

+

+

+    int						GetFontType() const

+    {

+        return m_FontType;

+    }

+

+    CFX_ByteString			GetFontTypeName() const;

+

+    const CFX_ByteString&	GetBaseFont() const

+    {

+        return m_BaseFont;

+    }

+

+    const CFX_SubstFont*	GetSubstFont() const

+    {

+        return m_Font.GetSubstFont();

+    }

+

+    FX_DWORD				GetFlags() const

+    {

+        return m_Flags;

+    }

+

+    virtual FX_BOOL			IsVertWriting()const;

+

+

+

+

+    CPDF_Type1Font*			GetType1Font() const

+    {

+        return m_FontType == PDFFONT_TYPE1 ? (CPDF_Type1Font*)(void*)this : NULL;

+    }

+

+    CPDF_TrueTypeFont*		GetTrueTypeFont() const

+    {

+        return m_FontType == PDFFONT_TRUETYPE ? (CPDF_TrueTypeFont*)(void*)this : NULL;

+    }

+

+    CPDF_CIDFont*			GetCIDFont() const

+    {

+        return (m_FontType == PDFFONT_CIDFONT) ? (CPDF_CIDFont*)(void*)this : NULL;

+    }

+

+    CPDF_Type3Font*			GetType3Font() const

+    {

+        return (m_FontType == PDFFONT_TYPE3) ? (CPDF_Type3Font*)(void*)this : NULL;

+    }

+

+

+    FX_BOOL					IsEmbedded() const

+    {

+        return m_FontType == PDFFONT_TYPE3 || m_pFontFile != NULL;

+    }

+

+    virtual FX_BOOL			IsUnicodeCompatible() const

+    {

+        return FALSE;

+    }

+

+    CPDF_StreamAcc*			GetFontFile() const

+    {

+        return m_pFontFile;

+    }

+

+    CPDF_Dictionary*		GetFontDict() const

+    {

+        return m_pFontDict;

+    }

+

+    FX_BOOL					IsStandardFont() const;

+

+    FXFT_Face				GetFace() const

+    {

+        return m_Font.GetFace();

+    }

+

+

+

+    virtual FX_DWORD		GetNextChar(FX_LPCSTR pString, int& offset) const

+    {

+        return (FX_BYTE)pString[offset++];

+    }

+

+    virtual int				CountChar(FX_LPCSTR pString, int size) const

+    {

+        return size;

+    }

+

+    void					AppendChar(CFX_ByteString& str, FX_DWORD charcode) const;

+

+    virtual int				AppendChar(FX_LPSTR buf, FX_DWORD charcode) const

+    {

+        *buf = (FX_CHAR)charcode;

+        return 1;

+    }

+

+    virtual int				GetCharSize(FX_DWORD charcode) const

+    {

+        return 1;

+    }

+

+

+

+

+    virtual int				GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL) = 0;

+    virtual int				GlyphFromCharCodeExt(FX_DWORD charcode)

+    {

+        return GlyphFromCharCode(charcode);

+    }

+

+    CFX_WideString			UnicodeFromCharCode(FX_DWORD charcode) const;

+

+    FX_DWORD				CharCodeFromUnicode(FX_WCHAR Unicode) const;

+

+    CFX_CharMap*			GetCharMap()

+    {

+        return m_pCharMap;

+    }

+

+    CFX_ByteString			EncodeString(const CFX_WideString& str) const;

+

+    CFX_WideString			DecodeString(const CFX_ByteString& str) const;

+

+

+

+

+    void					GetFontBBox(FX_RECT& rect) const

+    {

+        rect = m_FontBBox;

+    }

+

+    int						GetTypeAscent() const

+    {

+        return m_Ascent;

+    }

+

+    int						GetTypeDescent() const

+    {

+        return m_Descent;

+    }

+

+    int						GetItalicAngle() const

+    {

+        return m_ItalicAngle;

+    }

+

+    int						GetStemV() const

+    {

+        return m_StemV;

+    }

+

+    int						GetStringWidth(const FX_CHAR* pString, int size);

+

+    virtual int				GetCharWidthF(FX_DWORD charcode, int level = 0) = 0;

+

+    virtual int				GetCharTypeWidth(FX_DWORD charcode);

+

+    virtual void			GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0) = 0;

+

+

+

+    CPDF_Document*			m_pDocument;

+

+    class CFX_PathData*		LoadGlyphPath(FX_DWORD charcode, int dest_width = 0);

+

+    CFX_Font				m_Font;

+protected:

+

+    CPDF_Font();

+

+    FX_BOOL					Initialize();

+

+    FX_BOOL					Load();

+

+    virtual FX_BOOL			_Load() = 0;

+

+    virtual FX_WCHAR		_UnicodeFromCharCode(FX_DWORD charcode) const = 0;

+

+    virtual FX_DWORD		_CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;

+

+    void					LoadUnicodeMap();

+

+    void					LoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding,

+                                            CFX_ByteString*& pCharNames, FX_BOOL bEmbedded, FX_BOOL bTrueType);

+

+    void					LoadFontDescriptor(CPDF_Dictionary*);

+

+    void					LoadCharWidths(FX_WORD* pWidths);

+

+    void					CheckFontMetrics();

+

+    CFX_CharMap*			m_pCharMap;

+

+

+

+    int						m_FontType;

+

+    CFX_ByteString			m_BaseFont;

+

+    CPDF_StreamAcc*			m_pFontFile;

+

+    CPDF_Dictionary*		m_pFontDict;

+

+    CPDF_ToUnicodeMap*		m_pToUnicodeMap;

+

+    FX_BOOL					m_bToUnicodeLoaded;

+

+

+

+

+    int						m_Flags;

+

+    FX_RECT					m_FontBBox;

+

+    int						m_StemV;

+

+    int						m_Ascent;

+

+    int						m_Descent;

+

+    int						m_ItalicAngle;

+

+};

+#define PDFFONT_ENCODING_BUILTIN		0

+#define PDFFONT_ENCODING_WINANSI		1

+#define PDFFONT_ENCODING_MACROMAN		2

+#define PDFFONT_ENCODING_MACEXPERT		3

+#define PDFFONT_ENCODING_STANDARD		4

+#define PDFFONT_ENCODING_ADOBE_SYMBOL	5

+#define PDFFONT_ENCODING_ZAPFDINGBATS	6

+#define PDFFONT_ENCODING_PDFDOC			7

+#define PDFFONT_ENCODING_MS_SYMBOL		8

+#define PDFFONT_ENCODING_UNICODE		9

+class CPDF_FontEncoding : public CFX_Object

+{

+public:

+

+    CPDF_FontEncoding();

+

+    CPDF_FontEncoding(int PredefinedEncoding);

+

+    void					LoadEncoding(CPDF_Object* pEncoding);

+

+    FX_BOOL					IsIdentical(CPDF_FontEncoding* pAnother) const;

+

+    FX_WCHAR				UnicodeFromCharCode(FX_BYTE charcode) const

+    {

+        return m_Unicodes[charcode];

+    }

+

+    int						CharCodeFromUnicode(FX_WCHAR unicode) const;

+

+    void					SetUnicode(FX_BYTE charcode, FX_WCHAR unicode)

+    {

+        m_Unicodes[charcode] = unicode;

+    }

+

+    CPDF_Object*			Realize();

+public:

+

+    FX_WCHAR				m_Unicodes[256];

+};

+class CPDF_SimpleFont : public CPDF_Font

+{

+public:

+

+    CPDF_SimpleFont();

+

+    virtual ~CPDF_SimpleFont();

+

+    CPDF_FontEncoding*		GetEncoding()

+    {

+        return &m_Encoding;

+    }

+    virtual int				GetCharWidthF(FX_DWORD charcode, int level = 0);

+    virtual void			GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);

+    virtual int				GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);

+    virtual FX_BOOL			IsUnicodeCompatible() const;

+protected:

+

+    FX_BOOL					LoadCommon();

+

+    void					LoadSubstFont();

+

+    void					LoadFaceMetrics();

+

+    virtual void			LoadGlyphMap() = 0;

+    virtual FX_WCHAR		_UnicodeFromCharCode(FX_DWORD charcode) const

+    {

+        return m_Encoding.UnicodeFromCharCode((FX_BYTE)charcode);

+    }

+    virtual FX_DWORD		_CharCodeFromUnicode(FX_WCHAR Unicode) const

+    {

+        return m_Encoding.CharCodeFromUnicode(Unicode);

+    }

+

+

+

+    CPDF_FontEncoding		m_Encoding;

+

+    FX_WORD					m_GlyphIndex[256];

+    FX_WORD					m_ExtGID[256];

+

+

+

+

+    CFX_ByteString*			m_pCharNames;

+

+    int						m_BaseEncoding;

+

+

+

+

+    FX_WORD					m_CharWidth[256];

+

+    FX_SMALL_RECT			m_CharBBox[256];

+

+    FX_BOOL					m_bUseFontWidth;

+

+    void					LoadCharMetrics(int charcode);

+

+};

+class CPDF_Type1Font : public CPDF_SimpleFont

+{

+public:

+

+    CPDF_Type1Font();

+

+    int						GetBase14Font()

+    {

+        return m_Base14Font;

+    }

+    virtual int				GlyphFromCharCodeExt(FX_DWORD charcode);

+protected:

+    virtual FX_BOOL			_Load();

+

+    int						m_Base14Font;

+    virtual void			LoadGlyphMap();

+};

+class CPDF_TrueTypeFont : public CPDF_SimpleFont

+{

+public:

+

+    CPDF_TrueTypeFont();

+protected:

+    virtual FX_BOOL			_Load();

+    virtual void			LoadGlyphMap();

+};

+class CPDF_Type3Char : public CFX_Object

+{

+public:

+

+    CPDF_Type3Char();

+

+    ~CPDF_Type3Char();

+

+    FX_BOOL LoadBitmap(CPDF_RenderContext* pContext);

+

+    FX_BOOL					m_bColored;

+

+    FX_BOOL					m_bPageRequired;

+

+

+

+    CPDF_Form*				m_pForm;

+

+    CFX_AffineMatrix		m_ImageMatrix;

+

+    CFX_DIBitmap*			m_pBitmap;

+

+

+    int						m_Width;

+

+    FX_RECT					m_BBox;

+};

+class CPDF_Type3Font : public CPDF_SimpleFont

+{

+public:

+    CPDF_Type3Font();

+    virtual ~CPDF_Type3Font();

+    void					SetPageResources(CPDF_Dictionary* pResources)

+    {

+        m_pPageResources = pResources;

+    }

+    CPDF_Type3Char*			LoadChar(FX_DWORD charcode, int level = 0);

+    virtual int				GetCharWidthF(FX_DWORD charcode, int level = 0);

+    virtual int				GetCharTypeWidth(FX_DWORD charcode)

+    {

+        return GetCharWidthF(charcode);

+    }

+    virtual void			GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);

+    CFX_AffineMatrix&		GetFontMatrix()

+    {

+        return m_FontMatrix;

+    }

+    void					CheckType3FontMetrics();

+private:

+    virtual FX_BOOL			_Load();

+    virtual void			LoadGlyphMap() {}

+    int						m_CharWidthL[256];

+    CPDF_Dictionary*		m_pCharProcs;

+    CPDF_Dictionary*		m_pPageResources;

+    CPDF_Dictionary*		m_pFontResources;

+    CFX_MapPtrToPtr			m_CacheMap;

+    CFX_MapPtrToPtr			m_DeletedMap;

+protected:

+    CFX_AffineMatrix		m_FontMatrix;

+};

+#define CIDSET_UNKNOWN		0

+#define CIDSET_GB1			1

+#define CIDSET_CNS1			2

+#define CIDSET_JAPAN1		3

+#define CIDSET_KOREA1		4

+#define CIDSET_UNICODE		5

+class CPDF_CIDFont : public CPDF_Font

+{

+public:

+

+    CPDF_CIDFont();

+

+    virtual ~CPDF_CIDFont();

+

+    FX_BOOL					LoadGB2312();

+    virtual int				GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);

+    virtual int				GetCharWidthF(FX_DWORD charcode, int level = 0);

+    virtual void			GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);

+

+    FX_WORD					CIDFromCharCode(FX_DWORD charcode) const;

+

+    FX_BOOL					IsTrueType()

+    {

+        return !m_bType1;

+    }

+

+

+    virtual FX_DWORD		GetNextChar(const FX_CHAR* pString, int& offset) const;

+    virtual int				CountChar(const FX_CHAR* pString, int size) const;

+    virtual int				AppendChar(FX_LPSTR str, FX_DWORD charcode) const;

+    virtual int				GetCharSize(FX_DWORD charcode) const;

+

+

+    int						GetCharset() const

+    {

+        return m_Charset;

+    }

+

+    FX_LPCBYTE				GetCIDTransform(FX_WORD CID) const;

+

+

+

+    virtual FX_BOOL			IsVertWriting() const;

+

+    short					GetVertWidth(FX_WORD CID) const;

+

+    void					GetVertOrigin(FX_WORD CID, short& vx, short& vy) const;

+

+    virtual FX_BOOL			IsUnicodeCompatible() const;

+    virtual FX_BOOL			IsFontStyleFromCharCode(FX_DWORD charcode) const;

+protected:

+    friend class			CPDF_Font;

+    virtual FX_BOOL			_Load();

+    virtual FX_WCHAR		_UnicodeFromCharCode(FX_DWORD charcode) const;

+    virtual FX_DWORD		_CharCodeFromUnicode(FX_WCHAR Unicode) const;

+    int				GetGlyphIndex(FX_DWORD unicodeb, FX_BOOL *pVertGlyph);

+

+    CPDF_CMap*				m_pCMap;

+

+    CPDF_CMap*				m_pAllocatedCMap;

+

+    CPDF_CID2UnicodeMap*	m_pCID2UnicodeMap;

+

+    int						m_Charset;

+

+    FX_BOOL					m_bType1;

+

+    CPDF_StreamAcc*			m_pCIDToGIDMap;

+    FX_BOOL					m_bCIDIsGID;

+

+

+

+    FX_WORD					m_DefaultWidth;

+

+    FX_WORD*				m_pAnsiWidths;

+

+    FX_SMALL_RECT			m_CharBBox[256];

+

+    CFX_DWordArray			m_WidthList;

+

+    short					m_DefaultVY;

+

+    short					m_DefaultW1;

+

+    CFX_DWordArray			m_VertMetrics;

+

+

+    void					LoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements);

+

+    void					LoadSubstFont();

+

+    FX_BOOL					m_bAdobeCourierStd;

+

+    CFX_CTTGSUBTable*			m_pTTGSUBTable;

+};

+#define PDFCS_DEVICEGRAY		1

+

+#define PDFCS_DEVICERGB			2

+#define PDFCS_DEVICECMYK		3

+#define PDFCS_CALGRAY			4

+#define PDFCS_CALRGB			5

+#define PDFCS_LAB				6

+#define PDFCS_ICCBASED			7

+#define PDFCS_SEPARATION		8

+#define PDFCS_DEVICEN			9

+#define PDFCS_INDEXED			10

+#define PDFCS_PATTERN			11

+class CPDF_ColorSpace : public CFX_Object

+{

+public:

+

+    static CPDF_ColorSpace* GetStockCS(int Family);

+

+    static CPDF_ColorSpace*	Load(CPDF_Document* pDoc, CPDF_Object* pCSObj);

+

+    void					ReleaseCS();

+

+    int						GetBufSize() const;

+

+    FX_FLOAT*			CreateBuf();

+

+    void					GetDefaultColor(FX_FLOAT* buf) const;

+

+    int						CountComponents() const

+    {

+        return m_nComponents;

+    }

+

+    int						GetFamily() const

+    {

+        return m_Family;

+    }

+

+    virtual void			GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const

+    {

+        value = 0;

+        min = 0;

+        max = 1.0f;

+    }

+

+    FX_BOOL					sRGB() const;

+

+

+

+    virtual FX_BOOL			GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const = 0;

+

+    virtual FX_BOOL			SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const

+    {

+        return FALSE;

+    }

+

+

+

+

+    FX_BOOL					GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;

+

+    FX_BOOL					SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;

+

+

+    virtual void			TranslateImageLine(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels,

+            int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;

+

+    CPDF_Array*&			GetArray()

+    {

+        return m_pArray;

+    }

+

+    int						GetMaxIndex() const;

+

+    virtual CPDF_ColorSpace*	GetBaseCS() const

+    {

+        return NULL;

+    }

+

+    virtual void			EnableStdConversion(FX_BOOL bEnabled);

+    CPDF_Document*			m_pDocument;

+protected:

+

+    CPDF_ColorSpace();

+

+    virtual ~CPDF_ColorSpace() {}

+    virtual FX_BOOL			v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)

+    {

+        return TRUE;

+    }

+    virtual FX_BOOL			v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const

+    {

+        return FALSE;

+    }

+    virtual FX_BOOL			v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const

+    {

+        return FALSE;

+    }

+

+    int						m_Family;

+

+    int						m_nComponents;

+

+    CPDF_Array*				m_pArray;

+

+    FX_DWORD				m_dwStdConversion;

+};

+class CPDF_Color : public CFX_Object

+{

+public:

+

+    CPDF_Color()

+    {

+        m_pBuffer = NULL;

+        m_pCS = NULL;

+    }

+

+    CPDF_Color(int family);

+

+    ~CPDF_Color();

+

+    FX_BOOL					IsNull() const

+    {

+        return m_pBuffer == NULL;

+    }

+

+    FX_BOOL					IsEqual(const CPDF_Color& other) const;

+

+    FX_BOOL					IsPattern() const

+    {

+        return m_pCS && m_pCS->GetFamily() == PDFCS_PATTERN;

+    }

+

+    void					Copy(const CPDF_Color* pSrc);

+

+    void					SetColorSpace(CPDF_ColorSpace* pCS);

+

+    void					SetValue(FX_FLOAT* comp);

+

+    void					SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comp, int ncomps);

+

+    FX_BOOL					GetRGB(int& R, int& G, int& B) const;

+

+    CPDF_Pattern*			GetPattern() const;

+

+    CPDF_ColorSpace*		GetPatternCS() const;

+

+    FX_FLOAT*			GetPatternColor() const;

+

+    CPDF_ColorSpace*		m_pCS;

+

+    FX_FLOAT*			m_pBuffer;

+protected:

+    void	ReleaseBuffer();

+    void	ReleaseColorSpace();

+};

+#define PATTERN_TILING		1

+#define PATTERN_SHADING		2

+class CPDF_Pattern : public CFX_Object

+{

+public:

+

+    virtual ~CPDF_Pattern() {}

+

+    CPDF_Object*			m_pPatternObj;

+

+    int						m_PatternType;

+

+    CFX_AffineMatrix		m_Pattern2Form;

+    CFX_AffineMatrix		m_ParentMatrix;

+

+    CPDF_Document*			m_pDocument;

+

+protected:

+

+    CPDF_Pattern(const CFX_AffineMatrix* pParentMatrix)

+    {

+        if (pParentMatrix) {

+            m_ParentMatrix = *pParentMatrix;

+        }

+    }

+};

+class CPDF_TilingPattern : public CPDF_Pattern

+{

+public:

+

+    CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix);

+

+    virtual ~CPDF_TilingPattern();

+

+    FX_BOOL				Load();

+

+

+

+    FX_BOOL				m_bColored;

+

+    CFX_FloatRect		m_BBox;

+

+    FX_FLOAT			m_XStep;

+

+    FX_FLOAT			m_YStep;

+

+

+

+    CPDF_Form*			m_pForm;

+};

+class CPDF_ShadingPattern : public CPDF_Pattern

+{

+public:

+

+    CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix);

+

+    virtual ~CPDF_ShadingPattern();

+

+    CPDF_Object*		m_pShadingObj;

+

+    FX_BOOL				m_bShadingObj;

+

+    FX_BOOL				Load();

+

+    FX_BOOL				Reload();

+

+    int					m_ShadingType;

+

+    CPDF_ColorSpace*	m_pCS;

+

+

+    CPDF_Function*		m_pFunctions[4];

+

+    int					m_nFuncs;

+protected:

+    void	Clear();

+};

+struct CPDF_MeshVertex {

+    FX_FLOAT x, y;

+    FX_FLOAT r, g, b;

+};

+class CPDF_MeshStream : public CFX_Object

+{

+public:

+

+    FX_BOOL				Load(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);

+

+    FX_DWORD			GetFlag();

+

+    void				GetCoords(FX_FLOAT& x, FX_FLOAT& y);

+

+    void				GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b);

+

+    FX_DWORD 			GetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap);

+

+    FX_BOOL				GetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap);

+    CPDF_Function**	m_pFuncs;

+    CPDF_ColorSpace*	m_pCS;

+    FX_DWORD			m_nFuncs, m_nCoordBits, m_nCompBits, m_nFlagBits, m_nComps;

+    FX_DWORD			m_CoordMax, m_CompMax;

+    FX_FLOAT			m_xmin, m_xmax, m_ymin, m_ymax;

+    FX_FLOAT			m_ColorMin[8], m_ColorMax[8];

+    CPDF_StreamAcc		m_Stream;

+    CFX_BitStream		m_BitStream;

+};

+#define PDF_IMAGE_NO_COMPRESS				0x0000

+#define PDF_IMAGE_LOSSY_COMPRESS			0x0001

+#define PDF_IMAGE_LOSSLESS_COMPRESS			0x0002

+#define PDF_IMAGE_MASK_LOSSY_COMPRESS		0x0004

+#define PDF_IMAGE_MASK_LOSSLESS_COMPRESS	0x0008

+class CPDF_ImageSetParam

+{

+public:

+    CPDF_ImageSetParam()

+        : pMatteColor(NULL)

+        , nQuality(80)

+    {

+    }

+    FX_ARGB* pMatteColor;

+    FX_INT32 nQuality;

+};

+class CPDF_Image : public CFX_Object

+{

+public:

+

+    CPDF_Image(CPDF_Document* pDoc);

+

+    ~CPDF_Image();

+

+    FX_BOOL					LoadImageF(CPDF_Stream* pImageStream, FX_BOOL bInline);

+

+    void					Release();

+

+    CPDF_Image*				Clone();

+

+    FX_BOOL					IsInline()

+    {

+        return m_bInline;

+    }

+

+    void					SetInlineDict(CPDF_Dictionary* pDict)

+    {

+        m_pInlineDict = pDict;

+    }

+

+    CPDF_Dictionary*		GetInlineDict() const

+    {

+        return m_pInlineDict;

+    }

+

+    CPDF_Stream*			GetStream() const

+    {

+        return m_pStream;

+    }

+

+    CPDF_Dictionary*		GetDict() const

+    {

+        return m_pStream->GetDict();

+    }

+

+    CPDF_Dictionary*		GetOC() const

+    {

+        return m_pOC;

+    }

+

+    CPDF_Document*			GetDocument() const

+    {

+        return m_pDocument;

+    }

+

+

+

+    FX_INT32				GetPixelHeight() const

+    {

+        return m_Height;

+    }

+

+    FX_INT32				GetPixelWidth() const

+    {

+        return m_Width;

+    }

+

+

+    FX_BOOL					IsMask() const

+    {

+        return m_bIsMask;

+    }

+

+    FX_BOOL					IsInterpol() const

+    {

+        return m_bInterpolate;

+    }

+

+    CFX_DIBSource*			LoadDIBSource(CFX_DIBSource** ppMask = NULL, FX_DWORD* pMatteColor = NULL, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE) const;

+

+

+

+    void					SetImage(const CFX_DIBitmap* pDIBitmap, FX_INT32 iCompress, IFX_FileWrite *pFileWrite = NULL, IFX_FileRead *pFileRead = NULL, const CFX_DIBitmap* pMask = NULL, const CPDF_ImageSetParam* pParam = NULL);

+

+    void					SetJpegImage(FX_BYTE* pImageData, FX_DWORD size);

+

+    void					SetJpegImage(IFX_FileRead *pFile);

+

+    void					ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pDIBitmap);

+

+public:

+    FX_BOOL					StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);

+    FX_BOOL					Continue(IFX_Pause* pPause);

+    CFX_DIBSource*			DetachBitmap();

+    CFX_DIBSource*			DetachMask();

+    CFX_DIBSource*			m_pDIBSource;

+    CFX_DIBSource*			m_pMask;

+    FX_DWORD				m_MatteColor;

+private:

+

+    CPDF_Stream*			m_pStream;

+    FX_BOOL					m_bInline;

+    CPDF_Dictionary*		m_pInlineDict;

+

+    FX_INT32				m_Height;

+

+    FX_INT32				m_Width;

+

+    FX_BOOL					m_bIsMask;

+

+    FX_BOOL					m_bInterpolate;

+

+    CPDF_Document*			m_pDocument;

+

+    CPDF_Dictionary*		m_pOC;

+    CPDF_Dictionary*	InitJPEG(FX_LPBYTE pData, FX_DWORD size);

+};

+#endif

diff --git a/core/include/fpdfapi/fpdf_serial.h b/core/include/fpdfapi/fpdf_serial.h
new file mode 100644
index 0000000..9b1642e
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_serial.h
@@ -0,0 +1,203 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_SERIAL_

+#define _FPDF_SERIAL_

+#ifndef _FPDF_PAGE_

+#include "fpdf_page.h"

+#endif

+#ifndef _FPDF_PAGEOBJ_H_

+#include "fpdf_pageobj.h"

+#endif

+class CPDF_ObjectStream;

+class CPDF_XRefStream;

+CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj);

+class CPDF_ObjArchiveSaver : public CFX_ArchiveSaver

+{

+public:

+

+    friend CPDF_ObjArchiveSaver&	operator << (CPDF_ObjArchiveSaver& ar, const CPDF_Object* pObj);

+protected:

+

+    CFX_MapPtrToPtr			m_ObjectMap;

+};

+class CPDF_ObjArchiveLoader : public CFX_ArchiveLoader

+{

+public:

+

+    CPDF_ObjArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize) : CFX_ArchiveLoader(pData, dwSize),

+        m_IndirectObjects(NULL) {}

+

+    friend CPDF_ObjArchiveLoader&	operator >> (CPDF_ObjArchiveLoader& ar, CPDF_Object*& pObj);

+protected:

+

+    CPDF_IndirectObjects		m_IndirectObjects;

+};

+class CPDF_PageArchiveSaver : public CPDF_ObjArchiveSaver

+{

+public:

+

+    CPDF_PageArchiveSaver(CPDF_PageObjects* pPageObjs);

+

+    friend CPDF_PageArchiveSaver&	operator << (CPDF_PageArchiveSaver& ar, CPDF_PageObject* pObj);

+

+

+

+    friend CPDF_PageArchiveSaver&	operator << (CPDF_PageArchiveSaver& ar, CPDF_ClipPath clip_path);

+

+    friend CPDF_PageArchiveSaver&	operator << (CPDF_PageArchiveSaver& ar, CPDF_GraphState graph_state);

+

+    friend CPDF_PageArchiveSaver&	operator << (CPDF_PageArchiveSaver& ar, CPDF_TextState text_state);

+

+    friend CPDF_PageArchiveSaver&	operator << (CPDF_PageArchiveSaver& ar, CPDF_ColorState color_state);

+

+    friend CPDF_PageArchiveSaver&	operator << (CPDF_PageArchiveSaver& ar, CPDF_GeneralState general_state);

+

+protected:

+

+    CPDF_ClipPath		m_LastClipPath;

+

+    CPDF_GraphState		m_LastGraphState;

+

+    CPDF_ColorState		m_LastColorState;

+

+    CPDF_TextState		m_LastTextState;

+

+    CPDF_GeneralState	m_LastGeneralState;

+

+    CPDF_PageObjects*	m_pCurPage;

+};

+class CPDF_PageArchiveLoader : public CPDF_ObjArchiveLoader

+{

+public:

+

+    CPDF_PageArchiveLoader(CPDF_PageObjects* pPageObjs, FX_LPCBYTE pData, FX_DWORD dwSize);

+

+    friend CPDF_PageArchiveLoader&	operator >> (CPDF_PageArchiveLoader& ar, CPDF_PageObject*& pObj);

+

+

+

+    friend CPDF_PageArchiveLoader&	operator >> (CPDF_PageArchiveLoader& ar, CPDF_ClipPath& clip_path);

+

+    friend CPDF_PageArchiveLoader&	operator >> (CPDF_PageArchiveLoader& ar, CPDF_GraphState& graph_state);

+

+    friend CPDF_PageArchiveLoader&	operator >> (CPDF_PageArchiveLoader& ar, CPDF_TextState& text_state);

+

+    friend CPDF_PageArchiveLoader&	operator >> (CPDF_PageArchiveLoader& ar, CPDF_ColorState& color_state);

+

+    friend CPDF_PageArchiveLoader&	operator >> (CPDF_PageArchiveLoader& ar, CPDF_GeneralState& general_state);

+

+protected:

+    void				PostProcColor(CPDF_Color& color);

+

+    CPDF_Object*		AddResource(CPDF_Object* pSrcObj, FX_LPCSTR type);

+

+    CPDF_ClipPath		m_LastClipPath;

+

+    CPDF_GraphState		m_LastGraphState;

+

+    CPDF_ColorState		m_LastColorState;

+

+    CPDF_TextState		m_LastTextState;

+

+    CPDF_GeneralState	m_LastGeneralState;

+

+    CPDF_PageObjects*	m_pCurPage;

+

+    CFX_MapPtrToPtr		m_ObjectMap;

+};

+#define FPDFCREATE_INCREMENTAL		1

+#define FPDFCREATE_NO_ORIGINAL		2

+#define FPDFCREATE_PROGRESSIVE		4

+#define FPDFCREATE_OBJECTSTREAM		8

+class CPDF_Creator : public CFX_Object

+{

+public:

+

+    CPDF_Creator(CPDF_Document* pDoc);

+

+    ~CPDF_Creator();

+

+    FX_BOOL				Create(FX_LPCWSTR filename, FX_DWORD flags = 0);

+

+    FX_BOOL				Create(FX_LPCSTR filename, FX_DWORD flags = 0);

+

+    FX_BOOL				Create(IFX_StreamWrite* pFile, FX_DWORD flags = 0);

+

+    FX_INT32			Continue(IFX_Pause *pPause = NULL);

+

+    FX_BOOL				SetFileVersion(FX_INT32 fileVersion = 17);

+protected:

+

+    CPDF_Document*		m_pDocument;

+

+    CPDF_Parser*		m_pParser;

+

+    FX_BOOL				m_bCompress;

+

+    FX_BOOL				m_bSecurityChanged;

+

+    CPDF_Dictionary*	m_pEncryptDict;

+    FX_DWORD			m_dwEnryptObjNum;

+    FX_BOOL				m_bEncryptCloned;

+

+    FX_BOOL				m_bStandardSecurity;

+

+    CPDF_CryptoHandler*	m_pCryptoHandler;

+    FX_BOOL				m_bNewCrypto;

+

+    FX_BOOL				m_bEncryptMetadata;

+

+    CPDF_Object*		m_pMetadata;

+

+    CPDF_XRefStream*	m_pXRefStream;

+

+    FX_INT32			m_ObjectStreamSize;

+

+    FX_DWORD			m_dwLastObjNum;

+    FX_BOOL				Create(FX_DWORD flags);

+    void				ResetStandardSecurity();

+    void				Clear();

+    FX_INT32			WriteDoc_Stage1(IFX_Pause *pPause);

+    FX_INT32			WriteDoc_Stage2(IFX_Pause *pPause);

+    FX_INT32			WriteDoc_Stage3(IFX_Pause *pPause);

+    FX_INT32			WriteDoc_Stage4(IFX_Pause *pPause);

+

+    CFX_FileBufferArchive	m_File;

+

+    FX_FILESIZE			m_Offset;

+    void				InitOldObjNumOffsets();

+    void				InitNewObjNumOffsets();

+    void				AppendNewObjNum(FX_DWORD objbum);

+    FX_INT32			WriteOldIndirectObject(FX_DWORD objnum);

+    FX_INT32			WriteOldObjs(IFX_Pause *pPause);

+    FX_INT32			WriteNewObjs(FX_BOOL bIncremental, IFX_Pause *pPause);

+    FX_INT32			WriteIndirectObj(const CPDF_Object* pObj);

+    FX_INT32			WriteDirectObj(FX_DWORD objnum, const CPDF_Object* pObj, FX_BOOL bEncrypt = TRUE);

+    FX_INT32			WriteIndirectObjectToStream(const CPDF_Object* pObj);

+    FX_INT32			WriteIndirectObj(FX_DWORD objnum, const CPDF_Object* pObj);

+    FX_INT32			WriteIndirectObjectToStream(FX_DWORD objnum, FX_LPCBYTE pBuffer, FX_DWORD dwSize);

+    FX_INT32			AppendObjectNumberToXRef(FX_DWORD objnum);

+    void				InitID(FX_BOOL bDefault = TRUE);

+    FX_INT32			WriteStream(const CPDF_Object* pStream, FX_DWORD objnum, CPDF_CryptoHandler* pCrypto);

+

+    FX_INT32			m_iStage;

+    FX_DWORD			m_dwFlags;

+    FX_POSITION			m_Pos;

+    FX_FILESIZE			m_XrefStart;

+

+    CFX_FileSizeListArray	m_ObjectOffset;

+

+    CFX_DWordListArray		m_ObjectSize;

+    CFX_DWordArray		m_NewObjNumArray;

+

+    CPDF_Array*			m_pIDArray;

+

+    FX_INT32			m_FileVersion;

+    friend class CPDF_ObjectStream;

+    friend class CPDF_XRefStream;

+};

+#endif

diff --git a/core/include/fpdfapi/fpdfapi.h b/core/include/fpdfapi/fpdfapi.h
new file mode 100644
index 0000000..e9fc528
--- /dev/null
+++ b/core/include/fpdfapi/fpdfapi.h
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDFAPI_H_

+#define _FPDFAPI_H_

+#include "../../include/fxcrt/fx_basic.h"

+#include "../../include/fxge/fx_ge.h"

+#include "fpdf_module.h"

+#include "fpdf_pageobj.h"

+#include "fpdf_render.h"

+#include "fpdf_serial.h"

+#endif

diff --git a/core/include/fpdfdoc/fpdf_ap.h b/core/include/fpdfdoc/fpdf_ap.h
new file mode 100644
index 0000000..4b6a371
--- /dev/null
+++ b/core/include/fpdfdoc/fpdf_ap.h
@@ -0,0 +1,92 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#define _FPDF_AP_H_

+#include "../fxcrt/fx_basic.h"

+#include "../fpdfapi/fpdf_parser.h"

+#include "fpdf_vt.h"

+class IPVT_FontMap

+{

+public:

+

+    virtual CPDF_Font*						GetPDFFont(FX_INT32 nFontIndex) = 0;

+

+    virtual CFX_ByteString					GetPDFFontAlias(FX_INT32 nFontIndex) = 0;

+};

+struct CPVT_Dash {

+

+    CPVT_Dash(FX_INT32 dash, FX_INT32 gap, FX_INT32 phase) : nDash(dash), nGap(gap), nPhase(phase)

+    {}

+

+    FX_INT32			nDash;

+

+    FX_INT32			nGap;

+

+    FX_INT32			nPhase;

+};

+#define CT_TRANSPARENT		0

+#define	CT_GRAY				1

+#define	CT_RGB				2

+#define	CT_CMYK				3

+struct CPVT_Color {

+

+    CPVT_Color(FX_INT32 type = 0, FX_FLOAT color1 = 0.0f, FX_FLOAT color2 = 0.0f, FX_FLOAT color3 = 0.0f, FX_FLOAT color4 = 0.0f)

+        : nColorType(type), fColor1(color1), fColor2(color2), fColor3(color3), fColor4(color4)

+    {}

+

+    FX_INT32			nColorType;

+    FX_FLOAT			fColor1;

+    FX_FLOAT			fColor2;

+    FX_FLOAT			fColor3;

+    FX_FLOAT			fColor4;

+};

+class CPVT_Provider : public IPDF_VariableText_Provider

+{

+public:

+

+    CPVT_Provider(IPVT_FontMap * pFontMap);

+

+    virtual ~CPVT_Provider();

+

+    FX_INT32						GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle);

+

+    FX_INT32						GetTypeAscent(FX_INT32 nFontIndex);

+

+    FX_INT32						GetTypeDescent(FX_INT32 nFontIndex);

+

+    FX_INT32						GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);

+

+    FX_BOOL							IsLatinWord(FX_WORD word);

+

+    FX_INT32						GetDefaultFontIndex();

+private:

+

+    IPVT_FontMap *	m_pFontMap;

+};

+#define PBS_SOLID			0

+#define PBS_DASH			1

+#define PBS_BEVELED			2

+#define PBS_INSET			3

+#define PBS_UNDERLINED		4

+class CPVT_GenerateAP

+{

+public:

+

+    static FX_BOOL							GenerateTextFieldAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);

+

+    static FX_BOOL							GenerateComboBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);

+

+    static FX_BOOL							GenerateListBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);

+

+    static CFX_ByteString					GenerateEditAP(IPVT_FontMap * pFontMap, IPDF_VariableText_Iterator * pIterator,

+            const CPDF_Point & ptOffset, FX_BOOL bContinuous, FX_WORD SubWord = 0, const CPVT_WordRange * pVisible = NULL);

+

+    static CFX_ByteString					GenerateBorderAP(const CPDF_Rect & rect, FX_FLOAT fWidth,

+            const CPVT_Color & color, const CPVT_Color & crLeftTop, const CPVT_Color & crRightBottom,

+            FX_INT32 nStyle, const CPVT_Dash & dash);

+

+    static CFX_ByteString					GenerateColorAP(const CPVT_Color & color, const FX_BOOL & bFillOrStroke);

+};

diff --git a/core/include/fpdfdoc/fpdf_doc.h b/core/include/fpdfdoc/fpdf_doc.h
new file mode 100644
index 0000000..fc19441
--- /dev/null
+++ b/core/include/fpdfdoc/fpdf_doc.h
@@ -0,0 +1,1792 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_DOC_H_

+#define _FPDF_DOC_H_

+#ifndef _FPDF_PARSER_

+#include "../fpdfapi/fpdf_parser.h"

+#endif

+#ifndef _FPDF_RENDER_

+#include "../fpdfapi/fpdf_render.h"

+#endif

+class CPDF_Action;

+class CPDF_Annot;

+class CPDF_AnnotList;

+class CPDF_Bookmark;

+class CPDF_BookmarkTree;

+class CPDF_Dest;

+class CPDF_Link;

+class CPDF_LinkList;

+class CPDF_Metadata;

+class CPDF_NameTree;

+class CPDF_NumberTree;

+class CPDF_TextObject;

+class CPDF_ViewerPreferences;

+class CPDF_Page;

+class CPDF_RenderOptions;

+class CXML_Element;

+class CPDF_OCContext;

+class CPDF_DocJSActions;

+class CPDF_ActionFields;

+class CPDF_AAction;

+class CPDF_FileSpec;

+class CPDF_IconFit;

+class CPDF_DefaultAppearance;

+class CPDF_InterForm;

+class CPDF_FormField;

+class CPDF_FormNotify;

+class CPDF_FormControl;

+class CPDF_LWinParam;

+class CFieldTree;

+class CPDF_ApSettings;

+class CPDF_NameTree : public CFX_Object

+{

+public:

+

+    CPDF_NameTree(CPDF_Dictionary* pRoot)

+    {

+        m_pRoot = pRoot;

+    }

+

+    CPDF_NameTree(CPDF_Document* pDoc, FX_BSTR category);

+

+    CPDF_Object*		LookupValue(int nIndex, CFX_ByteString& csName) const;

+

+    CPDF_Object*		LookupValue(const CFX_ByteString& csName) const;

+

+    CPDF_Array*			LookupNamedDest(CPDF_Document* pDoc, FX_BSTR sName);

+

+    int					GetIndex(const CFX_ByteString& csName) const;

+

+    int					GetCount() const;

+

+

+    CPDF_Dictionary*	GetRoot() const

+    {

+        return m_pRoot;

+    }

+

+protected:

+

+    CPDF_Dictionary*		m_pRoot;

+};

+class CPDF_BookmarkTree : public CFX_Object

+{

+public:

+

+    CPDF_BookmarkTree(CPDF_Document* pDoc)

+    {

+        m_pDocument = pDoc;

+    }

+public:

+

+

+

+    CPDF_Bookmark		GetFirstChild(CPDF_Bookmark parent);

+

+    CPDF_Bookmark		GetNextSibling(CPDF_Bookmark bookmark);

+

+

+    CPDF_Document*		GetDocument() const

+    {

+        return m_pDocument;

+    }

+protected:

+

+    CPDF_Document*		m_pDocument;

+};

+#define PDFBOOKMARK_ITALIC			1

+#define PDFBOOKMARK_BOLD			2

+class CPDF_Bookmark : public CFX_Object

+{

+public:

+

+    CPDF_Bookmark(CPDF_Dictionary* pDict = NULL)

+    {

+        m_pDict = pDict;

+    }

+

+    operator CPDF_Dictionary*() const

+    {

+        return m_pDict;

+    }

+

+

+

+    FX_DWORD			GetColorRef();

+

+    FX_DWORD			GetFontStyle();

+

+    CFX_WideString		GetTitle();

+

+

+

+

+    CPDF_Dest			GetDest(CPDF_Document* pDocument);

+

+    CPDF_Action			GetAction();

+

+

+    CPDF_Dictionary*	m_pDict;

+};

+#define PDFZOOM_XYZ					1

+#define PDFZOOM_FITPAGE				2

+#define PDFZOOM_FITHORZ				3

+#define PDFZOOM_FITVERT				4

+#define PDFZOOM_FITRECT				5

+#define PDFZOOM_FITBBOX				6

+#define PDFZOOM_FITBHORZ			7

+

+#define PDFZOOM_FITBVERT			8

+class CPDF_Dest : public CFX_Object

+{

+public:

+

+    CPDF_Dest(CPDF_Object* pObj = NULL)

+    {

+        m_pObj = pObj;

+    }

+

+    operator CPDF_Object* () const

+    {

+        return m_pObj;

+    }

+

+    CFX_ByteString		GetRemoteName();

+

+    int					GetPageIndex(CPDF_Document* pDoc);

+

+    FX_DWORD			GetPageObjNum();

+

+    int					GetZoomMode();

+

+    FX_FLOAT			GetParam(int index);

+

+

+    CPDF_Object*		m_pObj;

+};

+class CPDF_OCContext : public CFX_Object, public IPDF_OCContext

+{

+public:

+

+    enum UsageType {

+        View = 0,

+        Design,

+        Print,

+        Export

+    };

+

+    CPDF_OCContext(CPDF_Document *pDoc, UsageType eUsageType = View);

+

+    virtual ~CPDF_OCContext();

+

+    CPDF_Document*	GetDocument() const

+    {

+        return m_pDocument;

+    }

+

+    UsageType		GetUsageType() const

+    {

+        return m_eUsageType;

+    }

+

+    FX_BOOL			CheckOCGVisible(const CPDF_Dictionary *pOCGDict);

+

+    void			ResetOCContext();

+protected:

+

+    FX_BOOL			LoadOCGStateFromConfig(FX_BSTR csConfig, const CPDF_Dictionary *pOCGDict, FX_BOOL &bValidConfig) const;

+

+    FX_BOOL			LoadOCGState(const CPDF_Dictionary *pOCGDict) const;

+

+    FX_BOOL			GetOCGVisible(const CPDF_Dictionary *pOCGDict);

+

+    FX_BOOL			GetOCGVE(CPDF_Array *pExpression, FX_BOOL bFromConfig, int nLevel = 0);

+

+    FX_BOOL			LoadOCMDState(const CPDF_Dictionary *pOCMDDict, FX_BOOL bFromConfig);

+

+    CPDF_Document		*m_pDocument;

+

+    UsageType			m_eUsageType;

+

+    CFX_MapPtrTemplate<const CPDF_Dictionary*, void*>	m_OCGStates;

+};

+class CPDF_LWinParam : public CFX_Object

+{

+public:

+

+    CPDF_LWinParam(CPDF_Dictionary* pDict)

+    {

+        m_pDict = pDict;

+    }

+

+    operator CPDF_Dictionary* () const

+    {

+        return m_pDict;

+    }

+

+    inline CFX_ByteString	GetFileName()

+    {

+        return m_pDict->GetString("F");

+    }

+

+

+    inline CFX_ByteString	GetDefaultDirectory()

+    {

+        return m_pDict->GetString("D");

+    }

+

+

+    inline CFX_ByteString	GetOperation()

+    {

+        return m_pDict->GetString("O");

+    }

+

+

+    inline CFX_ByteString	GetParameter()

+    {

+        return m_pDict->GetString("P");

+    }

+

+    CPDF_Dictionary*		m_pDict;

+};

+class CPDF_ActionFields : public CFX_Object

+{

+public:

+

+    CPDF_ActionFields(const CPDF_Action* pAction)

+    {

+        m_pAction = (CPDF_Action*)pAction;

+    }

+

+    operator CPDF_Action*() const

+    {

+        return m_pAction;

+    }

+

+    FX_DWORD				GetFieldsCount() const;

+

+    void					GetAllFields(CFX_PtrArray& fieldObjects) const;

+

+    CPDF_Object*			GetField(FX_DWORD iIndex) const;

+

+    CPDF_Action*			m_pAction;

+};

+

+#define PDFNAMED_NEXTPAGE		1

+#define PDFNAMED_PREVPAGE		2

+#define PDFNAMED_FIRSTPAGE		3

+#define PDFNAMED_LASTPAGE		4

+#define PDFJS_MAXLENGTH			64

+class CPDF_Action : public CFX_Object

+{

+public:

+

+    CPDF_Action(CPDF_Dictionary* pDict = NULL)

+    {

+        m_pDict = pDict;

+    }

+

+    operator CPDF_Dictionary* () const

+    {

+        return m_pDict;

+    }

+

+    enum ActionType {

+        Unknown = 0,

+        GoTo,

+        GoToR,

+        GoToE,

+        Launch,

+        Thread,

+        URI,

+        Sound,

+        Movie,

+        Hide,

+        Named,

+        SubmitForm,

+        ResetForm,

+        ImportData,

+        JavaScript,

+        SetOCGState,

+        Rendition,

+        Trans,

+        GoTo3DView

+    };

+

+    CFX_ByteString		GetTypeName() const

+    {

+        return m_pDict->GetString("S");

+    }

+

+    ActionType			GetType() const;

+

+

+

+    CPDF_Dest			GetDest(CPDF_Document* pDoc) const;

+

+

+

+

+

+    CFX_WideString		GetFilePath() const;

+

+

+

+

+    FX_BOOL				GetNewWindow() const

+    {

+        return m_pDict->GetBoolean("NewWindow");

+    }

+

+

+

+

+    CPDF_LWinParam		GetWinParam() const;

+

+

+

+

+    CFX_ByteString		GetURI(CPDF_Document* pDoc) const;

+

+

+

+

+    FX_BOOL				GetMouseMap() const

+    {

+        return m_pDict->GetBoolean("IsMap");

+    }

+

+

+

+

+    CPDF_ActionFields	GetWidgets() const

+    {

+        return this;

+    }

+

+

+

+

+    FX_BOOL				GetHideStatus() const

+    {

+        return m_pDict->GetBoolean("H", TRUE);

+    }

+

+

+

+

+    CFX_ByteString		GetNamedAction() const

+    {

+        return m_pDict->GetString("N");

+    }

+

+

+

+

+    FX_DWORD			GetFlags() const

+    {

+        return m_pDict->GetInteger("Flags");

+    }

+

+

+

+

+    CFX_WideString		GetJavaScript() const;

+

+

+

+

+    CPDF_Dictionary*	GetAnnot() const;

+

+

+

+

+    FX_INT32			GetOperationType() const;

+

+

+

+

+    CPDF_Stream*		GetSoundStream() const

+    {

+        return m_pDict->GetStream("Sound");

+    }

+

+    FX_FLOAT			GetVolume() const

+    {

+        return m_pDict->GetNumber("Volume");

+    }

+

+    FX_BOOL				IsSynchronous() const

+    {

+        return m_pDict->GetBoolean("Synchronous");

+    }

+

+    FX_BOOL				IsRepeat() const

+    {

+        return m_pDict->GetBoolean("Repeat");

+    }

+

+    FX_BOOL				IsMixPlay() const

+    {

+        return m_pDict->GetBoolean("Mix");

+    }

+

+

+

+

+    FX_DWORD			GetSubActionsCount() const;

+

+    CPDF_Action			GetSubAction(FX_DWORD iIndex) const;

+

+

+    CPDF_Dictionary*	m_pDict;

+};

+class CPDF_AAction : public CFX_Object

+{

+public:

+

+    CPDF_AAction(CPDF_Dictionary* pDict = NULL)

+    {

+        m_pDict = pDict;

+    }

+

+    operator CPDF_Dictionary*()	const

+    {

+        return m_pDict;

+    }

+

+    enum AActionType {

+        CursorEnter = 0,

+        CursorExit,

+        ButtonDown,

+        ButtonUp,

+        GetFocus,

+        LoseFocus,

+        PageOpen,

+        PageClose,

+        PageVisible,

+        PageInvisible,

+        OpenPage,

+        ClosePage,

+        KeyStroke,

+        Format,

+        Validate,

+        Calculate,

+        CloseDocument,

+        SaveDocument,

+        DocumentSaved,

+        PrintDocument,

+        DocumentPrinted

+    };

+

+    FX_BOOL				ActionExist(AActionType eType) const;

+

+    CPDF_Action			GetAction(AActionType eType) const;

+

+    FX_POSITION			GetStartPos() const;

+

+    CPDF_Action			GetNextAction(FX_POSITION& pos, AActionType& eType) const;

+

+    CPDF_Dictionary*	m_pDict;

+};

+class CPDF_DocJSActions : public CFX_Object

+{

+public:

+    CPDF_DocJSActions(CPDF_Document* pDoc);

+

+

+    int					CountJSActions() const;

+

+    CPDF_Action			GetJSAction(int index, CFX_ByteString& csName) const;

+

+    CPDF_Action			GetJSAction(const CFX_ByteString& csName) const;

+

+    int					FindJSAction(const CFX_ByteString& csName) const;

+

+

+    CPDF_Document*		GetDocument() const

+    {

+        return m_pDocument;

+    }

+

+protected:

+

+    CPDF_Document*		m_pDocument;

+};

+class CPDF_FileSpec : public CFX_Object

+{

+public:

+

+    CPDF_FileSpec();

+

+    CPDF_FileSpec(CPDF_Object *pObj)

+    {

+        m_pObj = pObj;

+    }

+

+    operator CPDF_Object*() const

+    {

+        return m_pObj;

+    }

+

+    FX_BOOL			IsURL() const;

+

+    FX_BOOL			GetFileName(CFX_WideString &wsFileName) const;

+

+    CPDF_Stream*	GetFileStream() const;

+

+    void			SetFileName(FX_WSTR wsFileName, FX_BOOL bURL = FALSE);

+protected:

+

+    CPDF_Object		*m_pObj;

+};

+class CPDF_LinkList : public CFX_Object

+{

+public:

+

+    CPDF_LinkList(CPDF_Document* pDoc)

+    {

+        m_pDocument = pDoc;

+    }

+

+    ~CPDF_LinkList();

+

+    CPDF_Link			GetLinkAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y);

+

+    int					CountLinks(CPDF_Page* pPage);

+

+    CPDF_Link			GetLink(CPDF_Page* pPage, int index);

+

+    CPDF_Document*		GetDocument() const

+    {

+        return m_pDocument;

+    }

+protected:

+

+    CPDF_Document*		m_pDocument;

+

+    CFX_MapPtrToPtr		m_PageMap;

+

+    CFX_PtrArray*		GetPageLinks(CPDF_Page* pPage);

+

+    void				LoadPageLinks(CPDF_Page* pPage, CFX_PtrArray* pList);

+};

+class CPDF_Link : public CFX_Object

+{

+public:

+

+    CPDF_Link(CPDF_Dictionary* pDict = NULL)

+    {

+        m_pDict = pDict;

+    }

+

+    operator CPDF_Dictionary*() const

+    {

+        return m_pDict;

+    }

+

+    CFX_FloatRect		GetRect();

+

+

+

+    CPDF_Dest			GetDest(CPDF_Document* pDoc);

+

+    CPDF_Action			GetAction();

+

+

+    CPDF_Dictionary*	m_pDict;

+};

+#define ANNOTFLAG_INVISIBLE			1

+#define ANNOTFLAG_HIDDEN			2

+#define ANNOTFLAG_PRINT				4

+#define ANNOTFLAG_NOZOOM			8

+#define ANNOTFLAG_NOROTATE			0x10

+#define ANNOTFLAG_NOVIEW			0x20

+#define ANNOTFLAG_READONLY			0x40

+#define ANNOTFLAG_LOCKED			0x80

+#define ANNOTFLAG_TOGGLENOVIEW		0x100

+class CPDF_Annot : public CFX_PrivateData, public CFX_Object

+{

+public:

+

+    CPDF_Annot(CPDF_Dictionary* pDict);

+

+    ~CPDF_Annot();

+

+    CPDF_Dictionary*	m_pAnnotDict;

+

+    CFX_ByteString		GetSubType() const;

+

+    FX_DWORD			GetFlags() const

+    {

+        return m_pAnnotDict->GetInteger("F");

+    }

+

+    void				GetRect(CFX_FloatRect& rect) const;

+

+    enum AppearanceMode	{

+        Normal,

+        Rollover,

+        Down

+    };

+

+    FX_BOOL				DrawAppearance(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,

+                                       AppearanceMode mode, const CPDF_RenderOptions* pOptions);

+

+    FX_BOOL				DrawInContext(const CPDF_Page* pPage, const CPDF_RenderContext* pContext,

+                                      const CFX_AffineMatrix* pUser2Device, AppearanceMode mode);

+

+    void				ClearCachedAP();

+

+

+    void				DrawBorder(CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,

+                                   const CPDF_RenderOptions* pOptions);

+

+    CPDF_PageObject*	GetBorder(FX_BOOL bPrint, const CPDF_RenderOptions* pOptions);

+

+

+

+    int					CountIRTNotes();

+

+    CPDF_Annot*			GetIRTNote(int index);

+

+

+    CPDF_Form*			GetAPForm(const CPDF_Page* pPage, AppearanceMode mode);

+private:

+

+    CFX_MapPtrToPtr		m_APMap;

+protected:

+    friend class		CPDF_AnnotList;

+

+    CPDF_AnnotList*		m_pList;

+

+    CPDF_Reference*		NewAnnotRef();

+};

+class CPDF_AnnotList : public CFX_Object

+{

+public:

+

+    CPDF_AnnotList(CPDF_Page* pPage);

+

+    ~CPDF_AnnotList();

+

+    void	GetAnnotMatrix(const CPDF_Dictionary* pAnnotDict, const CFX_Matrix* pUser2Device, CFX_Matrix &matrix) const;

+

+    void	GetAnnotRect(const CPDF_Dictionary* pAnnotDict, const CFX_Matrix* pUser2Device, CPDF_Rect &rtAnnot) const;

+

+    void				DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,

+                                      CFX_AffineMatrix* pMatrix, FX_BOOL bShowWidget,

+                                      CPDF_RenderOptions* pOptions);

+

+    void				DisplayAnnots(const CPDF_Page* pPage, CPDF_RenderContext* pContext,

+                                      FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, FX_BOOL bShowWidget,

+                                      CPDF_RenderOptions* pOptions)

+    {

+        DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix, bShowWidget ? 3 : 1, pOptions, NULL);

+    }

+

+    void				DisplayAnnots(const CPDF_Page* pPage, CPDF_RenderContext* pContext,

+                                      FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, FX_BOOL bShowWidget,

+                                      CPDF_RenderOptions* pOptions, FX_RECT *pClipRect)

+    {

+        DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix, bShowWidget ? 3 : 1, pOptions, pClipRect);

+    }

+

+    void				DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, CPDF_RenderContext* pContext,

+                                      FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, FX_DWORD dwAnnotFlags,

+                                      CPDF_RenderOptions* pOptions, FX_RECT* pClipRect);

+

+

+

+    CPDF_Annot*			GetAt(int index)

+    {

+        return (CPDF_Annot*)m_AnnotList.GetAt(index);

+    }

+

+    int					Count()

+    {

+        return m_AnnotList.GetSize();

+    }

+

+    int					GetIndex(CPDF_Annot* pAnnot);

+

+

+    CPDF_Document*		GetDocument() const

+    {

+        return m_pDocument;

+    }

+protected:

+

+    CFX_PtrArray		m_AnnotList;

+

+    CPDF_Dictionary*	m_pPageDict;

+

+    CPDF_Document*		m_pDocument;

+

+    CFX_PtrArray		m_Borders;

+

+    void				DisplayPass(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,

+                                    CPDF_RenderContext* pContext, FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix,

+                                    FX_BOOL bWidget, CPDF_RenderOptions* pOptions, FX_RECT* clip_rect);

+    friend class		CPDF_Annot;

+};

+#define COLORTYPE_TRANSPARENT	0

+#define COLORTYPE_GRAY			1

+#define COLORTYPE_RGB			2

+#define COLORTYPE_CMYK			3

+class CPDF_DefaultAppearance : public CFX_Object

+{

+public:

+

+    CPDF_DefaultAppearance(const CFX_ByteString& csDA = "")

+    {

+        m_csDA = csDA;

+    }

+

+    CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA)

+    {

+        m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;

+    }

+

+

+    operator CFX_ByteString() const

+    {

+        return m_csDA;

+    }

+

+    const CPDF_DefaultAppearance& operator =(const CFX_ByteString& csDA)

+    {

+        m_csDA = csDA;

+        return *this;

+    }

+

+    const CPDF_DefaultAppearance& operator =(const CPDF_DefaultAppearance& cDA)

+    {

+        m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;

+        return *this;

+    }

+

+

+

+    FX_BOOL				HasFont();

+

+    CFX_ByteString		GetFontString();

+

+    void				GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize);

+

+

+

+

+    FX_BOOL				HasColor(FX_BOOL bStrokingOperation = FALSE);

+

+    CFX_ByteString		GetColorString(FX_BOOL bStrokingOperation = FALSE);

+

+    void				GetColor(int& iColorType, FX_FLOAT fc[4], FX_BOOL bStrokingOperation = FALSE);

+

+    void				GetColor(FX_ARGB& color, int& iColorType, FX_BOOL bStrokingOperation = FALSE);

+

+

+

+

+    FX_BOOL				HasTextMatrix();

+

+    CFX_ByteString		GetTextMatrixString();

+

+    CFX_AffineMatrix	GetTextMatrix();

+

+protected:

+

+    CFX_ByteString		m_csDA;

+};

+#define FIELDTYPE_UNKNOWN			0

+#define FIELDTYPE_PUSHBUTTON		1

+#define FIELDTYPE_CHECKBOX			2

+#define FIELDTYPE_RADIOBUTTON		3

+#define FIELDTYPE_COMBOBOX			4

+#define FIELDTYPE_LISTBOX			5

+#define FIELDTYPE_TEXTFIELD			6

+#define FIELDTYPE_SIGNATURE			7

+class CPDF_InterForm : public CFX_PrivateData, public CFX_Object

+{

+public:

+

+    CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bUpdateAP);

+

+    ~CPDF_InterForm();

+

+

+

+    static void				EnableUpdateAP(FX_BOOL bUpdateAP);

+

+    static FX_BOOL			UpdatingAPEnabled();

+

+

+    static CFX_ByteString	GenerateNewResourceName(const CPDF_Dictionary* pResDict, FX_LPCSTR csType, int iMinLen = 2, FX_LPCSTR csPrefix = "");

+

+

+

+    static CPDF_Font*		AddSystemDefaultFont(const CPDF_Document* pDocument);

+

+    static CPDF_Font*		AddSystemFont(const CPDF_Document* pDocument, CFX_ByteString csFontName, FX_BYTE iCharSet = 1);

+

+    static CPDF_Font*		AddSystemFont(const CPDF_Document* pDocument, CFX_WideString csFontName, FX_BYTE iCharSet = 1);

+

+    static CPDF_Font*		AddStandardFont(const CPDF_Document* pDocument, CFX_ByteString csFontName);

+

+    static CFX_ByteString	GetNativeFont(FX_BYTE iCharSet, FX_LPVOID pLogFont = NULL);

+

+    static CFX_ByteString	GetNativeFont(FX_LPVOID pLogFont = NULL);

+

+    static FX_BYTE			GetNativeCharSet();

+

+    static CPDF_Font*		AddNativeFont(FX_BYTE iCharSet, const CPDF_Document* pDocument);

+

+    static CPDF_Font*		AddNativeFont(const CPDF_Document* pDocument);

+

+

+

+

+    FX_BOOL					ValidateFieldName(CFX_WideString& csNewFieldName, int iType);

+

+    FX_BOOL					ValidateFieldName(const CPDF_FormField* pField, CFX_WideString& csNewFieldName);

+

+    FX_BOOL					ValidateFieldName(const CPDF_FormControl* pControl, CFX_WideString& csNewFieldName);

+

+

+

+

+    FX_DWORD				CountFields(const CFX_WideString &csFieldName = L"");

+

+    CPDF_FormField*			GetField(FX_DWORD index, const CFX_WideString &csFieldName = L"");

+

+    void					GetAllFieldNames(CFX_WideStringArray& allFieldNames);

+

+    FX_BOOL					IsValidFormField(const void* pField);

+

+    CPDF_FormField*			GetFieldByDict(CPDF_Dictionary* pFieldDict) const;

+

+

+

+

+    FX_DWORD				CountControls(CFX_WideString csFieldName = L"");

+

+    CPDF_FormControl*		GetControl(FX_DWORD index, CFX_WideString csFieldName = L"");

+

+    FX_BOOL					IsValidFormControl(const void* pControl);

+

+    int						CountPageControls(CPDF_Page* pPage) const;

+

+    CPDF_FormControl*		GetPageControl(CPDF_Page* pPage, int index) const;

+

+

+    CPDF_FormControl*		GetControlAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y) const;

+

+    CPDF_FormControl*		GetControlByDict(CPDF_Dictionary* pWidgetDict) const;

+

+

+

+

+    FX_DWORD				CountInternalFields(const CFX_WideString& csFieldName = L"") const;

+

+    CPDF_Dictionary*		GetInternalField(FX_DWORD index, const CFX_WideString& csFieldName = L"") const;

+

+

+

+

+

+    CPDF_Document*			GetDocument() const

+    {

+        return m_pDocument;

+    }

+

+    CPDF_Dictionary*		GetFormDict() const

+    {

+        return m_pFormDict;

+    }

+

+

+

+

+    FX_BOOL					NeedConstructAP();

+

+    void					NeedConstructAP(FX_BOOL bNeedAP);

+

+

+

+

+    int						CountFieldsInCalculationOrder();

+

+    CPDF_FormField*			GetFieldInCalculationOrder(int index);

+

+    int						FindFieldInCalculationOrder(const CPDF_FormField* pField);

+

+

+

+

+    FX_DWORD				CountFormFonts();

+

+    CPDF_Font*				GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag);

+

+    CPDF_Font*				GetFormFont(CFX_ByteString csNameTag);

+

+    CPDF_Font*				GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag);

+

+    CPDF_Font*				GetNativeFormFont(FX_BYTE iCharSet, CFX_ByteString& csNameTag);

+

+    CPDF_Font*				GetNativeFormFont(CFX_ByteString& csNameTag);

+

+    FX_BOOL					FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);

+

+    FX_BOOL					FindFormFont(CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);

+

+    inline FX_BOOL			FindFormFont(CFX_WideString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)

+    {

+        return FindFormFont(PDF_EncodeText(csFontName), pFont, csNameTag);

+    }

+

+

+

+

+

+    void					AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);

+

+    CPDF_Font*				AddNativeFormFont(FX_BYTE iCharSet, CFX_ByteString& csNameTag);

+

+    CPDF_Font*				AddNativeFormFont(CFX_ByteString& csNameTag);

+

+    void					RemoveFormFont(const CPDF_Font* pFont);

+

+    void					RemoveFormFont(CFX_ByteString csNameTag);

+

+

+

+

+    CPDF_DefaultAppearance	GetDefaultAppearance();

+

+    CPDF_Font*				GetDefaultFormFont();

+

+

+

+    int						GetFormAlignment();

+

+

+

+

+    CPDF_FormField*			CheckRequiredFields(const CFX_PtrArray *fields = NULL, FX_BOOL bIncludeOrExclude = TRUE) const;

+

+    CFDF_Document* 			ExportToFDF(FX_WSTR pdf_path, FX_BOOL bSimpleFileSpec = FALSE) const;

+

+    CFDF_Document*			ExportToFDF(FX_WSTR pdf_path, CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude = TRUE, FX_BOOL bSimpleFileSpec = FALSE) const;

+

+    FX_BOOL					ImportFromFDF(const CFDF_Document* pFDFDoc, FX_BOOL bNotify = FALSE);

+

+

+

+

+    FX_BOOL					ResetForm(const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude = TRUE, FX_BOOL bNotify = FALSE);

+

+    FX_BOOL					ResetForm(FX_BOOL bNotify = FALSE);

+

+    void					ReloadForm();

+

+    CPDF_FormNotify*		GetFormNotify() const

+    {

+        return m_pFormNotify;

+    }

+

+    void					SetFormNotify(const CPDF_FormNotify* pNotify);

+

+

+    int						GetPageWithWidget(int iCurPage, FX_BOOL bNext);

+

+

+

+    FX_BOOL					IsUpdated()

+    {

+        return m_bUpdated;

+    }

+

+    void					ClearUpdatedFlag()

+    {

+        m_bUpdated = FALSE;

+    }

+

+

+    FX_BOOL					HasXFAForm() const;

+

+    void					FixPageFields(const CPDF_Page* pPage);

+protected:

+

+    static FX_BOOL			m_bUpdateAP;

+

+    void					LoadField(CPDF_Dictionary* pFieldDict, int nLevel = 0);

+

+    CPDF_Object*			GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name);

+

+    CPDF_FormField*			AddTerminalField(const CPDF_Dictionary* pFieldDict);

+

+    CPDF_FormControl*		AddControl(const CPDF_FormField* pField, const CPDF_Dictionary* pWidgetDict);

+

+    void					FDF_ImportField(CPDF_Dictionary* pField, const CFX_WideString& parent_name, FX_BOOL bNotify = FALSE, int nLevel = 0);

+

+    FX_BOOL					ValidateFieldName(CFX_WideString& csNewFieldName, int iType, const CPDF_FormField* pExcludedField, const CPDF_FormControl* pExcludedControl);

+

+    int						CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2);

+

+    int						CompareFieldName(const CFX_ByteString& name1, const CFX_ByteString& name2);

+

+    CPDF_Document*			m_pDocument;

+

+    FX_BOOL					m_bGenerateAP;

+

+    CPDF_Dictionary*		m_pFormDict;

+

+    CFX_MapPtrToPtr			m_ControlMap;

+

+    CFieldTree *m_pFieldTree;

+

+    CFX_ByteString			m_bsEncoding;

+

+    CPDF_FormNotify*		m_pFormNotify;

+

+    FX_BOOL					m_bUpdated;

+    friend class CPDF_FormControl;

+    friend class CPDF_FormField;

+};

+#define FORMFIELD_READONLY		0x01

+#define FORMFIELD_REQUIRED		0x02

+#define FORMFIELD_NOEXPORT		0x04

+#define FORMRADIO_NOTOGGLEOFF	0x100

+#define FORMRADIO_UNISON		0x200

+#define FORMTEXT_MULTILINE		0x100

+#define FORMTEXT_PASSWORD		0x200

+#define FORMTEXT_NOSCROLL		0x400

+#define FORMTEXT_COMB			0x800

+#define FORMCOMBO_EDIT			0x100

+#define FORMLIST_MULTISELECT	0x100

+class CPDF_FormField : public CFX_Object

+{

+public:

+

+    enum Type {

+        Unknown,

+        PushButton,

+        RadioButton,

+        CheckBox,

+        Text,

+        RichText,

+        File,

+        ListBox,

+        ComboBox,

+        Sign

+    };

+

+    CFX_WideString			GetFullName();

+

+    Type					GetType()

+    {

+        return m_Type;

+    }

+

+    FX_DWORD				GetFlags()

+    {

+        return m_Flags;

+    }

+

+    CPDF_InterForm*			GetInterForm() const

+    {

+        return m_pForm;

+    }

+

+    CPDF_Dictionary*		GetFieldDict() const

+    {

+        return m_pDict;

+    }

+

+    void					SetFieldDict(CPDF_Dictionary* pDict)

+    {

+        m_pDict = pDict;

+    }

+

+    FX_BOOL					ResetField(FX_BOOL bNotify = FALSE);

+

+

+

+    int						CountControls()

+    {

+        return m_ControlList.GetSize();

+    }

+

+    CPDF_FormControl*		GetControl(int index)

+    {

+        return (CPDF_FormControl*)m_ControlList.GetAt(index);

+    }

+

+    int						GetControlIndex(const CPDF_FormControl* pControl);

+

+

+

+

+    int						GetFieldType();

+

+

+

+

+    CPDF_AAction			GetAdditionalAction();

+

+

+

+

+    CFX_WideString			GetAlternateName();

+

+

+

+

+    CFX_WideString			GetMappingName();

+

+

+

+

+    FX_DWORD				GetFieldFlags();

+

+

+

+

+    CFX_ByteString			GetDefaultStyle();

+

+

+

+

+    CFX_WideString			GetRichTextString();

+

+

+

+    CFX_WideString			GetValue();

+

+    CFX_WideString			GetDefaultValue();

+

+    FX_BOOL					SetValue(const CFX_WideString& value, FX_BOOL bNotify = FALSE);

+

+

+

+

+

+    int						GetMaxLen();

+

+

+

+

+    int						CountSelectedItems();

+

+    int						GetSelectedIndex(int index);

+

+    FX_BOOL					ClearSelection(FX_BOOL bNotify = FALSE);

+

+    FX_BOOL					IsItemSelected(int index);

+

+    FX_BOOL					SetItemSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify = FALSE);

+

+    FX_BOOL					IsItemDefaultSelected(int index);

+

+    int						GetDefaultSelectedItem();

+

+

+

+

+    int						CountOptions();

+

+    CFX_WideString			GetOptionLabel(int index);

+

+    CFX_WideString			GetOptionValue(int index);

+

+    int						FindOption(CFX_WideString csOptLabel);

+

+    int						FindOptionValue(FX_LPCWSTR csOptValue, int iStartIndex = 0);

+

+

+

+

+    FX_BOOL					CheckControl(int iControlIndex, FX_BOOL bChecked, FX_BOOL bNotify = FALSE);

+

+

+

+

+    int						GetTopVisibleIndex();

+

+

+

+

+    int						CountSelectedOptions();

+

+    int						GetSelectedOptionIndex(int index);

+

+    FX_BOOL					IsOptionSelected(int iOptIndex);

+

+    FX_BOOL					SelectOption(int iOptIndex, FX_BOOL bSelected, FX_BOOL bNotify = FALSE);

+

+    FX_BOOL					ClearSelectedOptions(FX_BOOL bNotify = FALSE);

+

+

+

+

+    FX_FLOAT				GetFontSize()

+    {

+        return m_FontSize;

+    }

+

+    CPDF_Font*				GetFont()

+    {

+        return m_pFont;

+    }

+

+protected:

+

+    CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);

+

+    ~CPDF_FormField();

+

+    CPDF_FormField::Type	m_Type;

+

+    FX_DWORD				m_Flags;

+

+    CPDF_InterForm*			m_pForm;

+

+    CPDF_Dictionary*		m_pDict;

+

+    CFX_PtrArray			m_ControlList;

+    friend class			CPDF_InterForm;

+    friend class			CPDF_FormControl;

+

+

+

+    CFX_WideString			GetValue(FX_BOOL bDefault);

+

+    FX_BOOL					SetValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify);

+

+

+    void					SyncFieldFlags();

+

+    int						FindListSel(CPDF_String* str);

+

+    CFX_WideString			GetOptionText(int index, int sub_index);

+

+    void					LoadDA();

+

+    void					UpdateAP(CPDF_FormControl* pControl);

+

+

+

+    CFX_WideString			GetCheckValue(FX_BOOL bDefault);

+

+    FX_BOOL					SetCheckValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify);

+

+

+    FX_FLOAT				m_FontSize;

+

+    CPDF_Font*				m_pFont;

+};

+CPDF_Object*	FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel = 0);

+class CPDF_IconFit : public CFX_Object

+{

+public:

+

+    CPDF_IconFit(CPDF_Dictionary* pDict = NULL)

+    {

+        m_pDict = pDict;

+    }

+

+    operator CPDF_Dictionary*() const

+    {

+        return m_pDict;

+    }

+

+

+

+

+    enum ScaleMethod {

+        Always = 0,

+        Bigger,

+        Smaller,

+        Never

+    };

+

+    ScaleMethod				GetScaleMethod();

+

+

+

+

+    FX_BOOL					IsProportionalScale();

+

+

+

+

+    void					GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom);

+

+

+

+

+    FX_BOOL					GetFittingBounds();

+

+

+    CPDF_Dictionary*		m_pDict;

+};

+

+#define TEXTPOS_CAPTION		0

+#define TEXTPOS_ICON		1

+#define TEXTPOS_BELOW		2

+#define TEXTPOS_ABOVE		3

+#define TEXTPOS_RIGHT		4

+#define TEXTPOS_LEFT		5

+#define TEXTPOS_OVERLAID	6

+class CPDF_FormControl : public CFX_Object

+{

+public:

+

+    CPDF_FormField::Type	GetType()

+    {

+        return m_pField->GetType();

+    }

+

+    CPDF_InterForm*			GetInterForm() const

+    {

+        return m_pForm;

+    }

+

+    CPDF_FormField*			GetField() const

+    {

+        return m_pField;

+    }

+

+    CPDF_Dictionary*		GetWidget() const

+    {

+        return m_pWidgetDict;

+    }

+

+    CFX_FloatRect			GetRect();

+

+    void					DrawControl(CFX_RenderDevice* pDevice, CFX_AffineMatrix* pMatrix,

+                                        CPDF_Page* pPage, CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions = NULL);

+

+

+

+    CFX_ByteString			GetCheckedAPState();

+

+    CFX_WideString			GetExportValue();

+

+    FX_BOOL					IsChecked();

+

+    FX_BOOL					IsDefaultChecked();

+

+

+

+

+    enum HighlightingMode	{

+        None = 0,

+        Invert,

+        Outline,

+        Push,

+        Toggle

+    };

+

+    HighlightingMode		GetHighlightingMode();

+

+

+

+

+    FX_BOOL					HasMKEntry(CFX_ByteString csEntry);

+

+

+

+

+    int						GetRotation();

+

+

+

+

+    inline FX_ARGB			GetBorderColor(int& iColorType)

+    {

+        return GetColor(iColorType, "BC");

+    }

+

+    inline FX_FLOAT			GetOriginalBorderColor(int index)

+    {

+        return GetOriginalColor(index, "BC");

+    }

+

+    inline void				GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4])

+    {

+        GetOriginalColor(iColorType, fc, "BC");

+    }

+

+

+

+

+    inline FX_ARGB			GetBackgroundColor(int& iColorType)

+    {

+        return GetColor(iColorType, "BG");

+    }

+

+    inline FX_FLOAT			GetOriginalBackgroundColor(int index)

+    {

+        return GetOriginalColor(index, "BG");

+    }

+

+    inline void				GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4])

+    {

+        GetOriginalColor(iColorType, fc, "BG");

+    }

+

+

+

+

+    inline CFX_WideString	GetNormalCaption()

+    {

+        return GetCaption("CA");

+    }

+

+

+

+

+    inline CFX_WideString	GetRolloverCaption()

+    {

+        return GetCaption("RC");

+    }

+

+

+

+

+    inline CFX_WideString	GetDownCaption()

+    {

+        return GetCaption("AC");

+    }

+

+

+

+

+    inline CPDF_Stream*		GetNormalIcon()

+    {

+        return GetIcon("I");

+    }

+

+

+

+

+    inline CPDF_Stream*		GetRolloverIcon()

+    {

+        return GetIcon("RI");

+    }

+

+

+

+

+    inline CPDF_Stream*		GetDownIcon()

+    {

+        return GetIcon("IX");

+    }

+

+

+

+

+    CPDF_IconFit			GetIconFit();

+

+

+

+

+    int						GetTextPosition();

+

+

+

+

+    CPDF_Action				GetAction();

+

+

+

+

+    CPDF_AAction			GetAdditionalAction();

+

+

+

+

+    CPDF_DefaultAppearance	GetDefaultAppearance();

+

+    CPDF_Font*				GetDefaultControlFont();

+

+

+

+

+    int						GetControlAlignment();

+

+protected:

+

+    CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict);

+

+    CFX_ByteString			GetOnStateName();

+

+    void					SetOnStateName(const CFX_ByteString& csOn);

+

+    void					CheckControl(FX_BOOL bChecked);

+

+    FX_ARGB					GetColor(int& iColorType, CFX_ByteString csEntry);

+

+    FX_FLOAT				GetOriginalColor(int index, CFX_ByteString csEntry);

+

+    void					GetOriginalColor(int& iColorType, FX_FLOAT fc[4], CFX_ByteString csEntry);

+

+    CFX_WideString			GetCaption(CFX_ByteString csEntry);

+

+    CPDF_Stream*			GetIcon(CFX_ByteString csEntry);

+

+    CPDF_ApSettings			GetMK(FX_BOOL bCreate);

+

+    CPDF_InterForm*			m_pForm;

+

+    CPDF_FormField*			m_pField;

+

+    CPDF_Dictionary*		m_pWidgetDict;

+    friend class			CPDF_InterForm;

+    friend class			CPDF_FormField;

+};

+class CPDF_FormNotify : public CFX_Object

+{

+public:

+

+    virtual ~CPDF_FormNotify() {}

+

+    virtual int		BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue)

+    {

+        return 0;

+    }

+

+    virtual int		AfterValueChange(const CPDF_FormField* pField)

+    {

+        return 0;

+    }

+

+    virtual int		BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue)

+    {

+        return 0;

+    }

+

+    virtual int		AfterSelectionChange(const CPDF_FormField* pField)

+    {

+        return 0;

+    }

+

+    virtual int		AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray)

+    {

+        return 0;

+    }

+

+    virtual int		BeforeFormReset(const CPDF_InterForm* pForm)

+    {

+        return 0;

+    }

+

+    virtual int		AfterFormReset(const CPDF_InterForm* pForm)

+    {

+        return 0;

+    }

+

+    virtual int		BeforeFormImportData(const CPDF_InterForm* pForm)

+    {

+        return 0;

+    }

+

+    virtual int		AfterFormImportData(const CPDF_InterForm* pForm)

+    {

+        return 0;

+    }

+};

+FX_BOOL		FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);

+class CPDF_PageLabel : public CFX_Object

+{

+public:

+

+    CPDF_PageLabel(CPDF_Document* pDocument)

+    {

+        m_pDocument = pDocument;

+    }

+

+

+    CFX_WideString					GetLabel(int nPage) const;

+

+    FX_INT32						GetPageByLabel(FX_BSTR bsLabel) const;

+

+

+    FX_INT32						GetPageByLabel(FX_WSTR wsLabel) const;

+

+protected:

+    CPDF_Document*					m_pDocument;

+};

+class CPDF_Metadata

+{

+public:

+

+    CPDF_Metadata();

+

+

+    ~CPDF_Metadata();

+

+    void				LoadDoc(CPDF_Document *pDoc);

+

+

+    FX_INT32			GetString(FX_BSTR bsItem, CFX_WideString &wsStr);

+

+    CXML_Element*		GetRoot() const;

+

+    CXML_Element*		GetRDF() const;

+

+protected:

+    FX_LPVOID	m_pData;

+};

+class CPDF_ViewerPreferences

+{

+public:

+

+    CPDF_ViewerPreferences(CPDF_Document *pDoc);

+

+

+    ~CPDF_ViewerPreferences();

+

+

+    FX_BOOL IsDirectionR2L() const;

+

+    FX_BOOL PrintScaling() const;

+

+

+protected:

+    CPDF_Document*	m_pDoc;

+};

+class CPDF_ApSettings : public CFX_Object

+{

+public:

+

+    CPDF_ApSettings(CPDF_Dictionary* pDict = NULL)

+    {

+        m_pDict = pDict;

+    }

+

+    operator CPDF_Dictionary* () const

+    {

+        return m_pDict;

+    }

+

+    FX_BOOL					HasMKEntry(FX_BSTR csEntry);

+

+

+

+    int						GetRotation();

+

+

+

+

+    inline FX_ARGB			GetBorderColor(int& iColorType)

+    {

+        return GetColor(iColorType, FX_BSTRC("BC"));

+    }

+

+    inline FX_FLOAT			GetOriginalBorderColor(int index)

+    {

+        return GetOriginalColor(index, FX_BSTRC("BC"));

+    }

+

+    inline void				GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4])

+    {

+        GetOriginalColor(iColorType, fc, FX_BSTRC("BC"));

+    }

+

+

+

+

+    inline FX_ARGB			GetBackgroundColor(int& iColorType)

+    {

+        return GetColor(iColorType, FX_BSTRC("BG"));

+    }

+

+    inline FX_FLOAT			GetOriginalBackgroundColor(int index)

+    {

+        return GetOriginalColor(index, FX_BSTRC("BG"));

+    }

+

+    inline void				GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4])

+    {

+        GetOriginalColor(iColorType, fc, FX_BSTRC("BG"));

+    }

+

+

+

+

+    inline CFX_WideString	GetNormalCaption()

+    {

+        return GetCaption(FX_BSTRC("CA"));

+    }

+

+

+

+

+    inline CFX_WideString	GetRolloverCaption()

+    {

+        return GetCaption(FX_BSTRC("RC"));

+    }

+

+

+

+

+    inline CFX_WideString	GetDownCaption()

+    {

+        return GetCaption(FX_BSTRC("AC"));

+    }

+

+

+

+

+    inline CPDF_Stream*		GetNormalIcon()

+    {

+        return GetIcon(FX_BSTRC("I"));

+    }

+

+

+

+

+    inline CPDF_Stream*		GetRolloverIcon()

+    {

+        return GetIcon(FX_BSTRC("RI"));

+    }

+

+

+

+

+    inline CPDF_Stream*		GetDownIcon()

+    {

+        return GetIcon(FX_BSTRC("IX"));

+    }

+

+

+

+

+    CPDF_IconFit			GetIconFit();

+

+

+

+

+    int						GetTextPosition();

+

+    CPDF_Dictionary*		m_pDict;

+protected:

+

+    FX_ARGB					GetColor(int& iColorType, FX_BSTR csEntry);

+

+    FX_FLOAT				GetOriginalColor(int index, FX_BSTR csEntry);

+

+    void					GetOriginalColor(int& iColorType, FX_FLOAT fc[4], FX_BSTR csEntry);

+

+    CFX_WideString			GetCaption(FX_BSTR csEntry);

+

+    CPDF_Stream*			GetIcon(FX_BSTR csEntry);

+    friend class			CPDF_FormControl;

+};

+#endif

diff --git a/core/include/fpdfdoc/fpdf_tagged.h b/core/include/fpdfdoc/fpdf_tagged.h
new file mode 100644
index 0000000..a44c263
--- /dev/null
+++ b/core/include/fpdfdoc/fpdf_tagged.h
@@ -0,0 +1,99 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_TAGGED_H_

+#define _FPDF_TAGGED_H_

+class CPDF_StructTree;

+class CPDF_StructElement;

+struct CPDF_StructKid;

+class CPDF_Document;

+class CPDF_Page;

+class IPDF_ReflowEngine;

+class IPDF_ReflowedPage;

+class CPDF_StructTree : public CFX_Object

+{

+public:

+

+    static CPDF_StructTree* LoadDoc(const CPDF_Document* pDoc);

+

+    static CPDF_StructTree* LoadPage(const CPDF_Document* pDoc, const CPDF_Dictionary* pPageDict);

+

+    virtual ~CPDF_StructTree() {}

+

+    virtual int			CountTopElements() const = 0;

+

+    virtual CPDF_StructElement*	GetTopElement(int i) const = 0;

+};

+struct CPDF_StructKid {

+    enum {

+        Invalid,

+        Element,

+        PageContent,

+        StreamContent,

+        Object

+    } m_Type;

+

+    union {

+        struct {

+

+            CPDF_StructElement*	m_pElement;

+

+            CPDF_Dictionary*	m_pDict;

+        } m_Element;

+        struct {

+

+            FX_DWORD			m_PageObjNum;

+

+            FX_DWORD			m_ContentId;

+        } m_PageContent;

+        struct {

+

+            FX_DWORD			m_PageObjNum;

+

+            FX_DWORD			m_ContentId;

+

+            FX_DWORD			m_RefObjNum;

+        } m_StreamContent;

+        struct {

+

+            FX_DWORD			m_PageObjNum;

+

+            FX_DWORD			m_RefObjNum;

+        } m_Object;

+    };

+};

+class CPDF_StructElement : public CFX_Object

+{

+public:

+

+    virtual CPDF_StructTree*	GetTree() const = 0;

+

+    virtual const CFX_ByteString&	GetType() const = 0;

+

+    virtual CPDF_StructElement*	GetParent() const = 0;

+

+    virtual CPDF_Dictionary *	GetDict() const = 0;

+

+    virtual int					CountKids() const = 0;

+

+    virtual const CPDF_StructKid&	GetKid(int index) const = 0;

+

+    virtual CFX_PtrArray*		GetObjectArray() = 0;

+

+    virtual CPDF_Object*		GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable = FALSE, FX_FLOAT fLevel = 0.0F) = 0;

+

+

+

+    virtual CFX_ByteString		GetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable = FALSE, int subindex = -1) = 0;

+

+    virtual FX_ARGB				GetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable = FALSE, int subindex = -1) = 0;

+

+    virtual FX_FLOAT			GetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable = FALSE, int subindex = -1) = 0;

+

+    virtual int					GetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable = FALSE, int subindex = -1) = 0;

+

+};

+#endif

diff --git a/core/include/fpdfdoc/fpdf_vt.h b/core/include/fpdfdoc/fpdf_vt.h
new file mode 100644
index 0000000..e2825c1
--- /dev/null
+++ b/core/include/fpdfdoc/fpdf_vt.h
@@ -0,0 +1,444 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_VT_H_

+#define _FPDF_VT_H_

+#include "../fxcrt/fx_basic.h"

+#include "../fpdfapi/fpdf_parser.h"

+struct CPVT_WordPlace;

+struct CPVT_WordRange;

+struct CPVT_Word;

+struct CPVT_Line;

+struct CPVT_Section;

+class IPDF_VariableText_Provider;

+class IPDF_VariableText_Iterator;

+class IPDF_VariableText;

+struct CPVT_WordPlace {

+

+    CPVT_WordPlace() : nSecIndex(-1), nLineIndex(-1), nWordIndex(-1)

+    {

+    }

+

+    CPVT_WordPlace(FX_INT32 nSecIndex, FX_INT32 nLineIndex, FX_INT32 nWordIndex)

+    {

+        this->nSecIndex = nSecIndex;

+        this->nLineIndex = nLineIndex;

+        this->nWordIndex = nWordIndex;

+    }

+

+    void Default()

+    {

+        nSecIndex = nLineIndex = nWordIndex = -1;

+    }

+

+    FX_BOOL operator == (const CPVT_WordPlace & wp) const

+    {

+        return wp.nSecIndex == this->nSecIndex && wp.nLineIndex == this->nLineIndex && wp.nWordIndex == this->nWordIndex;

+    }

+

+    FX_BOOL operator != (const CPVT_WordPlace & wp) const

+    {

+        return wp.nSecIndex != this->nSecIndex || wp.nLineIndex != this->nLineIndex || wp.nWordIndex != this->nWordIndex;

+    }

+

+    inline FX_INT32 WordCmp(const CPVT_WordPlace & wp) const

+    {

+        if (this->nSecIndex > wp.nSecIndex) {

+            return 1;

+        }

+        if (this->nSecIndex < wp.nSecIndex) {

+            return -1;

+        }

+        if (this->nLineIndex > wp.nLineIndex) {

+            return 1;

+        }

+        if (this->nLineIndex < wp.nLineIndex) {

+            return -1;

+        }

+        if (this->nWordIndex > wp.nWordIndex) {

+            return 1;

+        }

+        if (this->nWordIndex < wp.nWordIndex) {

+            return -1;

+        }

+        return 0;

+    }

+

+    inline FX_INT32 LineCmp(const CPVT_WordPlace & wp) const

+    {

+        if (this->nSecIndex > wp.nSecIndex) {

+            return 1;

+        }

+        if (this->nSecIndex < wp.nSecIndex) {

+            return -1;

+        }

+        if (this->nLineIndex > wp.nLineIndex) {

+            return 1;

+        }

+        if (this->nLineIndex < wp.nLineIndex) {

+            return -1;

+        }

+        return 0;

+    }

+

+    inline FX_INT32 SecCmp(const CPVT_WordPlace & wp) const

+    {

+        if (this->nSecIndex > wp.nSecIndex) {

+            return 1;

+        }

+        if (this->nSecIndex < wp.nSecIndex) {

+            return -1;

+        }

+        return 0;

+    }

+

+    FX_INT32							nSecIndex;

+

+    FX_INT32							nLineIndex;

+

+    FX_INT32							nWordIndex;

+};

+struct CPVT_WordRange {

+

+    CPVT_WordRange()

+    {

+    }

+

+    CPVT_WordRange(const CPVT_WordPlace & begin, const CPVT_WordPlace & end)

+    {

+        Set(begin, end);

+    }

+

+    void Default()

+    {

+        BeginPos.Default();

+        EndPos.Default();

+    }

+

+    void Set(const CPVT_WordPlace & begin, const CPVT_WordPlace & end)

+    {

+        this->BeginPos = begin;

+        this->EndPos = end;

+        SwapWordPlace();

+    }

+

+    void SetBeginPos(const CPVT_WordPlace & begin)

+    {

+        this->BeginPos = begin;

+        SwapWordPlace();

+    }

+

+    void SetEndPos(const CPVT_WordPlace & end)

+    {

+        this->EndPos = end;

+        SwapWordPlace();

+    }

+

+    FX_BOOL IsExist() const

+    {

+        return this->BeginPos != this->EndPos;

+    }

+

+    FX_BOOL operator != (const CPVT_WordRange & wr) const

+    {

+        return wr.BeginPos != this->BeginPos || wr.EndPos != this->EndPos;

+    }

+

+    void SwapWordPlace()

+    {

+        if (BeginPos.WordCmp(EndPos) > 0) {

+            CPVT_WordPlace place = EndPos;

+            EndPos = BeginPos;

+            BeginPos = place;

+        }

+    }

+

+    CPVT_WordPlace BeginPos;

+

+    CPVT_WordPlace EndPos;

+};

+struct CPVT_SecProps : public CFX_Object {

+

+    CPVT_SecProps() : fLineLeading(0.0f), fLineIndent(0.0f), nAlignment(0)

+    {

+    }

+

+    CPVT_SecProps(FX_FLOAT lineLeading, FX_FLOAT lineIndent, FX_INT32 alignment) :

+        fLineLeading(lineLeading), fLineIndent(lineIndent), nAlignment(alignment)

+    {

+    }

+

+    CPVT_SecProps(const CPVT_SecProps & other) :

+        fLineLeading(other.fLineLeading), fLineIndent(other.fLineIndent), nAlignment(other.nAlignment)

+    {

+    }

+

+    FX_FLOAT			fLineLeading;

+

+    FX_FLOAT			fLineIndent;

+

+    FX_INT32			nAlignment;

+};

+struct CPVT_WordProps : public CFX_Object {

+

+    CPVT_WordProps() : nFontIndex(-1), fFontSize(0.0f), dwWordColor(0), nScriptType(0), nWordStyle(0),

+        fCharSpace(0.0f), nHorzScale(0)

+    {

+    }

+

+    CPVT_WordProps(FX_INT32	fontIndex, FX_FLOAT fontSize, FX_COLORREF wordColor = 0, FX_INT32 scriptType = 0, FX_INT32 wordStyle = 0,

+                   FX_FLOAT charSpace = 0, FX_INT32 horzScale = 100) :

+        nFontIndex(fontIndex), fFontSize(fontSize), dwWordColor(wordColor), nScriptType(scriptType),

+        nWordStyle(wordStyle), fCharSpace(charSpace), nHorzScale(horzScale)

+    {

+    }

+

+    CPVT_WordProps(const CPVT_WordProps & other) :

+        nFontIndex(other.nFontIndex), fFontSize(other.fFontSize), dwWordColor(other.dwWordColor),

+        nScriptType(other.nScriptType), nWordStyle(other.nWordStyle), fCharSpace(other.fCharSpace),

+        nHorzScale(other.nHorzScale)

+    {

+    }

+

+    FX_INT32					nFontIndex;

+

+    FX_FLOAT					fFontSize;

+

+    FX_COLORREF					dwWordColor;

+

+    FX_INT32					nScriptType;

+

+    FX_INT32					nWordStyle;

+

+    FX_FLOAT					fCharSpace;

+

+    FX_INT32					nHorzScale;

+};

+struct CPVT_Word {

+

+    CPVT_Word() : Word(0), nCharset(0), ptWord(0, 0), fAscent(0.0f), fDescent(0.0f), fWidth(0.0f),

+        fFontSize(0), WordProps()

+    {

+    }

+

+    FX_WORD						Word;

+

+    FX_INT32					nCharset;

+

+    CPVT_WordPlace				WordPlace;

+

+    CPDF_Point					ptWord;

+

+    FX_FLOAT					fAscent;

+

+    FX_FLOAT					fDescent;

+

+    FX_FLOAT					fWidth;

+

+    FX_INT32					nFontIndex;

+

+    FX_FLOAT					fFontSize;

+

+    CPVT_WordProps				WordProps;

+};

+struct CPVT_Line {

+

+    CPVT_Line() : ptLine(0, 0), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f)

+    {

+    }

+

+    CPVT_WordPlace				lineplace;

+

+    CPVT_WordPlace				lineEnd;

+

+    CPDF_Point					ptLine;

+

+    FX_FLOAT					fLineWidth;

+

+    FX_FLOAT					fLineAscent;

+

+    FX_FLOAT					fLineDescent;

+};

+struct CPVT_Section {

+

+    CPVT_WordPlace				secplace;

+

+    CPDF_Rect					rcSection;

+

+    CPVT_SecProps				SecProps;

+

+    CPVT_WordProps				WordProps;

+};

+class IPDF_VariableText_Provider

+{

+public:

+

+    virtual FX_INT32						GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle) = 0;

+

+    virtual FX_INT32						GetTypeAscent(FX_INT32 nFontIndex) = 0;

+

+    virtual FX_INT32						GetTypeDescent(FX_INT32 nFontIndex) = 0;

+

+    virtual FX_INT32						GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex) = 0;

+

+    virtual FX_BOOL							IsLatinWord(FX_WORD word) = 0;

+

+    virtual FX_INT32						GetDefaultFontIndex() = 0;

+};

+class IPDF_VariableText_Iterator

+{

+public:

+

+    virtual FX_BOOL							NextWord() = 0;

+

+    virtual FX_BOOL							PrevWord() = 0;

+

+    virtual FX_BOOL							NextLine() = 0;

+

+    virtual FX_BOOL							PrevLine() = 0;

+

+    virtual FX_BOOL							NextSection() = 0;

+

+    virtual FX_BOOL							PrevSection() = 0;

+

+    virtual FX_BOOL							GetWord(CPVT_Word & word) const = 0;

+

+    virtual FX_BOOL							SetWord(const CPVT_Word & word) = 0;

+

+    virtual FX_BOOL							GetLine(CPVT_Line & line) const = 0;

+

+    virtual FX_BOOL							GetSection(CPVT_Section & section) const = 0;

+

+    virtual	FX_BOOL							SetSection(const CPVT_Section & section) = 0;

+

+    virtual void							SetAt(FX_INT32 nWordIndex) = 0;

+

+    virtual void							SetAt(const CPVT_WordPlace & place) = 0;

+

+    virtual const CPVT_WordPlace &			GetAt() const = 0;

+};

+class IPDF_VariableText

+{

+public:

+

+    static IPDF_VariableText*			NewVariableText();

+

+    static void							DelVariableText(IPDF_VariableText* pVT);

+public:

+

+    virtual IPDF_VariableText_Provider*		SetProvider(IPDF_VariableText_Provider * pProvider) = 0;

+

+    virtual IPDF_VariableText_Iterator*		GetIterator() = 0;

+

+    virtual void							SetPlateRect(const CPDF_Rect & rect) = 0;

+

+    virtual void							SetAlignment(FX_INT32 nFormat = 0) = 0;

+

+    virtual void							SetPasswordChar(FX_WORD wSubWord = '*') = 0;

+

+    virtual void							SetLimitChar(FX_INT32 nLimitChar = 0) = 0;

+

+    virtual void							SetCharArray(FX_INT32 nCharArray = 0) = 0;

+

+    virtual void							SetCharSpace(FX_FLOAT fCharSpace = 0.0f) = 0;

+

+    virtual void							SetHorzScale(FX_INT32 nHorzScale = 100) = 0;

+

+    virtual void							SetMultiLine(FX_BOOL bMultiLine = TRUE) = 0;

+

+    virtual void							SetAutoReturn(FX_BOOL bAuto = TRUE) = 0;

+

+    virtual void							SetAutoFontSize(FX_BOOL bAuto = TRUE) = 0;

+

+    virtual void							SetFontSize(FX_FLOAT fFontSize) = 0;

+

+    virtual void							SetLineLeading(FX_FLOAT fLineLeading) = 0;

+

+    virtual void							SetRichText(FX_BOOL bRichText) = 0;

+

+    virtual void							Initialize() = 0;

+

+    virtual FX_BOOL							IsValid() const = 0;

+

+    virtual FX_BOOL							IsRichText() const = 0;

+

+    virtual void							RearrangeAll() = 0;

+

+    virtual void							RearrangePart(const CPVT_WordRange & PlaceRange) = 0;

+

+    virtual void							ResetAll() = 0;

+

+    virtual void							SetText(FX_LPCWSTR text, FX_INT32 charset = 1, const CPVT_SecProps * pSecProps = NULL,

+            const CPVT_WordProps * pWordProps = NULL) = 0;

+

+    virtual CPVT_WordPlace					InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset = 1,

+            const CPVT_WordProps * pWordProps = NULL) = 0;

+

+    virtual CPVT_WordPlace					InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps = NULL,

+            const CPVT_WordProps * pWordProps = NULL) = 0;

+

+    virtual CPVT_WordPlace					InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset = 1,

+            const CPVT_SecProps * pSecProps = NULL,	const CPVT_WordProps * pWordProps = NULL) = 0;

+

+    virtual CPVT_WordPlace					DeleteWords(const CPVT_WordRange & PlaceRange) = 0;

+

+    virtual CPVT_WordPlace					DeleteWord(const CPVT_WordPlace & place) = 0;

+

+    virtual CPVT_WordPlace					BackSpaceWord(const CPVT_WordPlace & place) = 0;

+

+    virtual const CPDF_Rect &				GetPlateRect() const = 0;

+

+    virtual CPDF_Rect						GetContentRect() const = 0;

+

+    virtual FX_INT32						GetTotalWords() const = 0;

+

+    virtual FX_FLOAT						GetFontSize() const = 0;

+

+    virtual FX_INT32						GetAlignment() const = 0;

+

+    virtual FX_WORD							GetPasswordChar() const = 0;

+

+    virtual FX_INT32						GetCharArray() const = 0;

+

+    virtual FX_INT32						GetLimitChar() const = 0;

+

+    virtual FX_BOOL							IsMultiLine() const = 0;

+

+    virtual FX_INT32						GetHorzScale() const = 0;

+

+    virtual FX_FLOAT						GetCharSpace() const = 0;

+

+    virtual CPVT_WordPlace					GetBeginWordPlace() const = 0;

+

+    virtual CPVT_WordPlace					GetEndWordPlace() const = 0;

+

+    virtual CPVT_WordPlace					GetPrevWordPlace(const CPVT_WordPlace & place) const = 0;

+

+    virtual CPVT_WordPlace					GetNextWordPlace(const CPVT_WordPlace & place) const = 0;

+

+    virtual CPVT_WordPlace					SearchWordPlace(const CPDF_Point & point) const = 0;

+

+    virtual CPVT_WordPlace					GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const = 0;

+

+    virtual CPVT_WordPlace					GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const = 0;

+

+    virtual CPVT_WordPlace					GetLineBeginPlace(const CPVT_WordPlace & place) const = 0;

+

+    virtual CPVT_WordPlace					GetLineEndPlace(const CPVT_WordPlace & place) const = 0;

+

+    virtual CPVT_WordPlace					GetSectionBeginPlace(const CPVT_WordPlace & place) const = 0;

+

+    virtual CPVT_WordPlace					GetSectionEndPlace(const CPVT_WordPlace & place) const = 0;

+

+    virtual void							UpdateWordPlace(CPVT_WordPlace & place) const = 0;

+

+    virtual CPVT_WordPlace					AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const = 0;

+

+    virtual FX_INT32						WordPlaceToWordIndex(const CPVT_WordPlace & place) const = 0;

+

+    virtual CPVT_WordPlace					WordIndexToWordPlace(FX_INT32 index) const = 0;

+};

+#endif

diff --git a/core/include/fpdftext/fpdf_text.h b/core/include/fpdftext/fpdf_text.h
new file mode 100644
index 0000000..8b5edc3
--- /dev/null
+++ b/core/include/fpdftext/fpdf_text.h
@@ -0,0 +1,173 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_TEXT_H_

+#define _FPDF_TEXT_H_

+#ifndef _FPDF_PARSER_

+#include "../fpdfapi/fpdf_parser.h"

+#endif

+#ifndef _FPDF_PAGEOBJ_H_

+#include "../fpdfapi/fpdf_pageobj.h"

+#endif

+#ifndef _FPDF_PAGE_

+#include "../fpdfapi/fpdf_page.h"

+#endif

+class CPDF_PageObjects;

+#define PDF2TXT_AUTO_ROTATE		1

+#define PDF2TXT_AUTO_WIDTH		2

+#define PDF2TXT_KEEP_COLUMN		4

+#define PDF2TXT_USE_OCR			8

+#define PDF2TXT_INCLUDE_INVISIBLE	16

+void PDF_GetPageText(CFX_ByteStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,

+                     int iMinWidth, FX_DWORD flags);

+void PDF_GetPageText_Unicode(CFX_WideStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,

+                             int iMinWidth, FX_DWORD flags);

+void PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_Document* pDoc, CPDF_Dictionary* pPage,

+                               FX_DWORD flags);

+CFX_WideString PDF_GetFirstTextLine_Unicode(CPDF_Document* pDoc, CPDF_Dictionary* pPage);

+class IPDF_TextPage;

+class IPDF_LinkExtract;

+class IPDF_TextPageFind;

+#define CHAR_ERROR			-1

+#define CHAR_NORMAL			0

+#define CHAR_GENERATED		1

+#define CHAR_UNUNICODE		2

+typedef struct {

+    FX_WCHAR			m_Unicode;

+    FX_WCHAR			m_Charcode;

+    FX_INT32			m_Flag;

+    FX_FLOAT			m_FontSize;

+    FX_FLOAT			m_OriginX;

+    FX_FLOAT			m_OriginY;

+    CFX_FloatRect		m_CharBox;

+    CPDF_TextObject*	m_pTextObj;

+    CFX_AffineMatrix	m_Matrix;

+} FPDF_CHAR_INFO;

+typedef	CFX_ArrayTemplate<CFX_FloatRect> CFX_RectArray;

+#define FPDFTEXT_LRTB	0

+#define FPDFTEXT_RLTB	1

+#define FPDFTEXT_TBRL	2

+#define FPDFTEXT_LEFT			-1

+#define FPDFTEXT_RIGHT			1

+#define FPDFTEXT_UP				-2

+#define FPDFTEXT_DOWN			2

+class IPDF_ReflowedPage;

+#define FPDFTEXT_WRITINGMODE_UNKNOW	0

+#define FPDFTEXT_WRITINGMODE_LRTB	1

+#define FPDFTEXT_WRITINGMODE_RLTB	2

+#define FPDFTEXT_WRITINGMODE_TBRL	3

+class CPDFText_ParseOptions : public CFX_Object

+{

+public:

+

+    CPDFText_ParseOptions();

+    FX_BOOL			m_bGetCharCodeOnly;

+    FX_BOOL			m_bNormalizeObjs;

+    FX_BOOL			m_bOutputHyphen;

+};

+class IPDF_TextPage : public CFX_Object

+{

+public:

+

+    virtual ~IPDF_TextPage() {}

+    static IPDF_TextPage*	CreateTextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions);

+    static IPDF_TextPage*	CreateTextPage(const CPDF_Page* pPage, int flags = 0);

+    static IPDF_TextPage*	CreateTextPage(const CPDF_PageObjects* pObjs, int flags = 0);

+    static IPDF_TextPage*	CreateReflowTextPage(IPDF_ReflowedPage* pRefPage);

+

+    virtual void			NormalizeObjects(FX_BOOL bNormalize) = 0;

+

+    virtual FX_BOOL			ParseTextPage() = 0;

+

+

+    virtual FX_BOOL			IsParsered() const = 0;

+public:

+

+    virtual int CharIndexFromTextIndex(int TextIndex) const = 0;

+

+    virtual int TextIndexFromCharIndex(int CharIndex) const = 0;

+

+

+    virtual int				CountChars() const = 0;

+

+    virtual	void			GetCharInfo(int index, FPDF_CHAR_INFO & info) const = 0;

+

+    virtual void			GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const = 0;

+

+

+

+    virtual int				GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const = 0;

+

+    virtual int				GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const = 0;

+

+    virtual	int				GetOrderByDirection(int index, int direction) const = 0;

+

+    virtual CFX_WideString	GetTextByRect(CFX_FloatRect rect) const = 0;

+

+    virtual void			GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const = 0;

+

+

+    virtual int				CountRects(int start, int nCount) = 0;

+

+    virtual	void			GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const = 0;

+

+    virtual FX_BOOL			GetBaselineRotate(int rectIndex, int& Rotate) = 0;

+

+    virtual FX_BOOL			GetBaselineRotate(CFX_FloatRect rect, int& Rotate) = 0;

+

+    virtual	int				CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains = FALSE) = 0;

+

+    virtual	void			GetBoundedSegment(int index, int& start, int& count) const = 0;

+

+

+    virtual int				GetWordBreak(int index, int direction) const = 0;

+

+    virtual CFX_WideString	GetPageText(int start = 0, int nCount = -1 ) const = 0;

+};

+#define FPDFTEXT_MATCHCASE      0x00000001

+#define FPDFTEXT_MATCHWHOLEWORD 0x00000002

+#define FPDFTEXT_CONSECUTIVE	0x00000004

+class IPDF_TextPageFind : public CFX_Object

+{

+public:

+

+    virtual	~IPDF_TextPageFind() {}

+

+    static	IPDF_TextPageFind*	CreatePageFind(const IPDF_TextPage* pTextPage);

+public:

+

+    virtual	FX_BOOL				FindFirst(CFX_WideString findwhat, int flags, int startPos = 0) = 0;

+

+    virtual	FX_BOOL				FindNext() = 0;

+

+    virtual	FX_BOOL				FindPrev() = 0;

+

+    virtual void				GetRectArray(CFX_RectArray& rects) const = 0;

+

+    virtual int					GetCurOrder() const = 0;

+

+    virtual int					GetMatchedCount() const = 0;

+};

+class IPDF_LinkExtract : public CFX_Object

+{

+public:

+

+    virtual	~IPDF_LinkExtract() {}

+

+    static	IPDF_LinkExtract*	CreateLinkExtract();

+

+    virtual FX_BOOL				ExtractLinks(const IPDF_TextPage* pTextPage) = 0;

+public:

+

+    virtual int					CountLinks() const = 0;

+

+    virtual CFX_WideString		GetURL(int index) const = 0;

+

+    virtual	void				GetBoundedSegment(int index, int& start, int& count) const = 0;

+

+    virtual void				GetRects(int index, CFX_RectArray& rects) const = 0;

+};

+#endif

diff --git a/core/include/fxcodec/fx_codec.h b/core/include/fxcodec/fx_codec.h
new file mode 100644
index 0000000..bee9702
--- /dev/null
+++ b/core/include/fxcodec/fx_codec.h
@@ -0,0 +1,288 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_CODEC_H_

+#define _FX_CODEC_H_

+#ifndef _FXCRT_EXTENSION_

+#include "../fxcrt/fx_ext.h"

+#endif

+#include "fx_codec_def.h"

+#include "fx_codec_provider.h"

+class CFX_DIBSource;

+class ICodec_ScanlineDecoder;

+class ICodec_BasicModule;

+class ICodec_FaxModule;

+class ICodec_JpegModule;

+class ICodec_JpxModule;

+class ICodec_Jbig2Module;

+class ICodec_IccModule;

+class ICodec_FlateModule;

+class ICodec_Jbig2Encoder;

+class ICodec_ScanlineDecoder;

+class CCodec_ModuleMgr : public CFX_Object

+{

+public:

+

+    static CCodec_ModuleMgr*	Create();

+

+    void				Destroy();

+

+    void				InitJbig2Decoder();

+

+    void				InitJpxDecoder();

+

+

+    void				InitIccDecoder();

+

+    ICodec_Jbig2Encoder*		CreateJbig2Encoder();

+protected:

+    CCodec_ModuleMgr();

+    ~CCodec_ModuleMgr();

+public:

+    ICodec_BasicModule*	GetBasicModule()

+    {

+        return m_pBasicModule;

+    }

+    ICodec_FaxModule*	GetFaxModule()

+    {

+        return m_pFaxModule;

+    }

+    ICodec_JpegModule*	GetJpegModule()

+    {

+        return m_pJpegModule;

+    }

+    ICodec_JpxModule*	GetJpxModule()

+    {

+        return m_pJpxModule;

+    }

+    ICodec_Jbig2Module*	GetJbig2Module()

+    {

+        return m_pJbig2Module;

+    }

+    ICodec_IccModule*	GetIccModule()

+    {

+        return m_pIccModule;

+    }

+    ICodec_FlateModule*	GetFlateModule()

+    {

+        return m_pFlateModule;

+    }

+protected:

+    ICodec_BasicModule*	m_pBasicModule;

+    ICodec_FaxModule*	m_pFaxModule;

+    ICodec_JpegModule*	m_pJpegModule;

+    ICodec_JpxModule*	m_pJpxModule;

+    ICodec_Jbig2Module*	m_pJbig2Module;

+    ICodec_IccModule*	m_pIccModule;

+    ICodec_FlateModule*	m_pFlateModule;

+

+};

+class ICodec_BasicModule : public CFX_Object

+{

+public:

+

+    virtual ~ICodec_BasicModule() {}

+    virtual FX_BOOL	RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,

+                                    FX_DWORD& dest_size) = 0;

+    virtual FX_BOOL	A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,

+                              FX_DWORD& dest_size) = 0;

+    virtual ICodec_ScanlineDecoder*	CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+            int nComps, int bpc) = 0;

+};

+class ICodec_ScanlineDecoder : public CFX_Object

+{

+public:

+

+    virtual ~ICodec_ScanlineDecoder() {}

+

+    virtual FX_DWORD	GetSrcOffset() = 0;

+

+    virtual void		DownScale(int dest_width, int dest_height) = 0;

+

+    virtual FX_LPBYTE	GetScanline(int line) = 0;

+

+    virtual FX_BOOL		SkipToScanline(int line, IFX_Pause* pPause) = 0;

+

+    virtual int			GetWidth() = 0;

+

+    virtual int			GetHeight() = 0;

+

+    virtual int			CountComps() = 0;

+

+    virtual int			GetBPC() = 0;

+

+    virtual FX_BOOL		IsColorTransformed() = 0;

+

+    virtual void		ClearImageData() = 0;

+};

+class ICodec_FlateModule : public CFX_Object

+{

+public:

+

+    virtual ~ICodec_FlateModule() {}

+    virtual ICodec_ScanlineDecoder*	CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+            int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns) = 0;

+    virtual FX_DWORD	FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,

+                                         int predictor, int Colors, int BitsPerComponent, int Columns,

+                                         FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;

+    virtual FX_BOOL		Encode(const FX_BYTE* src_buf, FX_DWORD src_size,

+                               int predictor, int Colors, int BitsPerComponent, int Columns,

+                               FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;

+    virtual FX_BOOL		Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;

+};

+class ICodec_FaxModule : public CFX_Object

+{

+public:

+

+    virtual ~ICodec_FaxModule() {}

+

+    virtual ICodec_ScanlineDecoder*	CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+            int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows) = 0;

+

+

+    virtual FX_BOOL		Encode(FX_LPCBYTE src_buf, int width, int height, int pitch,

+                               FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;

+};

+class ICodec_JpegModule : public CFX_Object

+{

+public:

+

+    virtual ~ICodec_JpegModule() {}

+

+    virtual void		SetPovider(IFX_JpegProvider* pJP) = 0;

+

+    virtual ICodec_ScanlineDecoder*	CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,

+            int width, int height, int nComps, FX_BOOL ColorTransform) = 0;

+

+    virtual FX_BOOL		LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,

+                                 int& num_components, int& bits_per_components, FX_BOOL& color_transform,

+                                 FX_LPBYTE* icc_buf_ptr = NULL, FX_DWORD* icc_length = NULL) = 0;

+

+    virtual FX_BOOL		Encode(const class CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality = 75,

+                               FX_LPCBYTE icc_buf = NULL, FX_DWORD icc_length = 0) = 0;

+

+    virtual void*		Start() = 0;

+

+    virtual void		Finish(void* pContext) = 0;

+

+    virtual void		Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;

+

+    virtual int			ReadHeader(void* pContext, int* width, int* height, int* nComps) = 0;

+

+

+    virtual int			StartScanline(void* pContext, int down_scale) = 0;

+

+

+    virtual FX_BOOL		ReadScanline(void* pContext, FX_LPBYTE dest_buf) = 0;

+

+

+    virtual FX_DWORD	GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr = NULL) = 0;

+};

+class ICodec_JpxModule : public CFX_Object

+{

+public:

+

+    virtual ~ICodec_JpxModule() {}

+

+    virtual FX_LPVOID 	CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE) = 0;

+

+    virtual void		GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,

+                                     FX_DWORD& codestream_nComps, FX_DWORD& output_nComps) = 0;

+

+    virtual FX_BOOL		Decode(FX_LPVOID ctx, FX_LPBYTE dest_data, int pitch,

+                               FX_BOOL bTranslateColor, FX_LPBYTE offsets) = 0;

+

+    virtual void		DestroyDecoder(FX_LPVOID ctx) = 0;

+};

+class ICodec_Jbig2Module : public CFX_Object

+{

+public:

+

+    virtual ~ICodec_Jbig2Module() {}

+

+    virtual FX_BOOL		Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,

+                               FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch)  = 0;

+

+    virtual FX_BOOL		Decode(IFX_FileRead* file_ptr, FX_DWORD& width, FX_DWORD& height,

+                               FX_DWORD& pitch, FX_LPBYTE& dest_buf) = 0;

+    virtual void*				CreateJbig2Context() = 0;

+

+    virtual FXCODEC_STATUS		StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,

+                                            FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause) = 0;

+

+    virtual FXCODEC_STATUS		StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,

+                                            FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause) = 0;

+    virtual FXCODEC_STATUS		ContinueDecode(void* pJbig2Content, IFX_Pause* pPause) = 0;

+    virtual void				DestroyJbig2Context(void* pJbig2Content) = 0;

+};

+class ICodec_Jbig2Encoder : public CFX_Object

+{

+public:

+

+    virtual ~ICodec_Jbig2Encoder() {}

+};

+class ICodec_IccModule : public CFX_Object

+{

+public:

+    typedef enum {

+        IccCS_Unknown = 0,

+        IccCS_XYZ,

+        IccCS_Lab,

+        IccCS_Luv,

+        IccCS_YCbCr,

+        IccCS_Yxy,

+        IccCS_Hsv,

+        IccCS_Hls,

+        IccCS_Gray,

+        IccCS_Rgb,

+        IccCS_Cmyk,

+        IccCS_Cmy

+    } IccCS;

+    typedef struct _IccParam {

+        FX_DWORD	Version;

+        IccCS		ColorSpace;

+        FX_DWORD	dwProfileType;

+        FX_DWORD	dwFormat;

+        FX_LPBYTE	pProfileData;

+        FX_DWORD	dwProfileSize;

+        double		Gamma;

+    } IccParam;

+

+    virtual ~ICodec_IccModule() {}

+

+    virtual IccCS			GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize) = 0;

+

+    virtual IccCS			GetProfileCS(IFX_FileRead* pFile) = 0;

+

+    virtual FX_LPVOID	CreateTransform(ICodec_IccModule::IccParam* pInputParam,

+                                        ICodec_IccModule::IccParam* pOutputParam,

+                                        ICodec_IccModule::IccParam* pProofParam = NULL,

+                                        FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,

+                                        FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,

+                                        FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,

+                                        FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING

+                                     ) = 0;

+

+

+    virtual FX_LPVOID	CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent = 0,

+            FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT) = 0;

+

+    virtual FX_LPVOID	CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,

+            FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent = 0,

+            FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,

+            FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT

+                                          ) = 0;

+

+    virtual void			DestroyTransform(FX_LPVOID pTransform) = 0;

+

+    virtual void			Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues) = 0;

+

+    virtual void			TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels) = 0;

+};

+void AdobeCMYK_to_sRGB(FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B);

+void AdobeCMYK_to_sRGB1(FX_BYTE c, FX_BYTE m, FX_BYTE y, FX_BYTE k, FX_BYTE& R, FX_BYTE& G, FX_BYTE& B);

+FX_BOOL MD5ComputeID(FX_LPCVOID buf, FX_DWORD dwSize, FX_BYTE ID[16]);

+#endif

diff --git a/core/include/fxcodec/fx_codec_def.h b/core/include/fxcodec/fx_codec_def.h
new file mode 100644
index 0000000..72b10bd
--- /dev/null
+++ b/core/include/fxcodec/fx_codec_def.h
@@ -0,0 +1,71 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_CODEC_DEF_H_

+#define _FX_CODEC_DEF_H_

+enum FXCODEC_STATUS {

+    FXCODEC_STATUS_ERROR = -1,

+    FXCODEC_STATUS_FRAME_READY,

+    FXCODEC_STATUS_FRAME_TOBECONTINUE,

+    FXCODEC_STATUS_DECODE_READY,

+    FXCODEC_STATUS_DECODE_TOBECONTINUE,

+    FXCODEC_STATUS_DECODE_FINISH,

+    FXCODEC_STATUS_ERR_MEMORY,

+    FXCODEC_STATUS_ERR_READ,

+    FXCODEC_STATUS_ERR_FLUSH,

+    FXCODEC_STATUS_ERR_FORMAT,

+    FXCODEC_STATUS_ERR_PARAMS

+};

+#define JP2_SPACE_INVALID	-1

+#define JPX_SPACE_INVALID	-1

+#define JP2_SPACE_bilevel1	0

+#define JP2_SPACE_YCbCr1	1

+#define JP2_SPACE_YCbCr2	3

+#define JP2_SPACE_YCbCr3	4

+#define JP2_SPACE_PhotoYCC	9

+#define JP2_SPACE_CMY		11

+#define JP2_SPACE_CMYK		12

+#define JP2_SPACE_YCCK		13

+#define JP2_SPACE_CIELab	14

+#define JP2_SPACE_bilevel2	15

+#define JP2_SPACE_sRGB		16

+#define JP2_SPACE_sLUM		17

+#define JP2_SPACE_sYCC		18

+#define JP2_SPACE_CIEJab	19

+#define JP2_SPACE_esRGB		20

+#define JP2_SPACE_ROMMRGB	21

+#define JP2_SPACE_YPbPr60	22

+#define JP2_SPACE_YPbPr50	23

+#define JP2_SPACE_esYCC		24

+#define JP2_SPACE_iccLUM	100

+#define JP2_SPACE_iccRGB	101

+#define Icc_INTENT_PERCEPTUAL				0

+#define Icc_INTENT_RELATIVE_COLORIMETRIC	1

+#define Icc_INTENT_SATURATION				2

+#define Icc_INTENT_ABSOLUTE_COLORIMETRIC	3

+#define Icc_FORMAT_DEFAULT					0

+#define Icc_FORMAT_SWAP						(1<<10)

+#define Icc_FLAGS_DEFAULT					0x0000

+#define Icc_FLAGS_BLACKPOINTCOMPENSATION	0x2000

+#define Icc_FLAGS_NOWHITEONWHITEFIXUP		0x0004

+#define Icc_FLAGS_HIGHRESPRECALC			0x0400

+#define Icc_FLAGS_LOWRESPRECALC				0x0800

+#define Icc_FLAGS_GAMUTCHECK				0x1000

+#define Icc_FLAGS_SOFTPROOFING				0x4000

+#define Icc_PARAMTYPE_NONE					0

+#define Icc_PARAMTYPE_BUFFER				1

+#define Icc_PARAMTYPE_PARAM					2

+#define EXIFTAG_USHORT_RESUNIT				296

+#define EXIFTAG_FLOAT_DPIX					282

+#define EXIFTAG_FLOAT_DPIY					283

+#define EXIFTAG_USHORT_ORIENTATION			274

+#define EXIFTAG_STRING_MANUFACTURER			271

+#define EXIFTAG_STRING_MODULE				272

+#define EXIFTAG_STRING_SOFTWARE				305

+#define EXIFTAG_STRING_IAMGEDESCRIPTION		270

+#define EXIFTAG_STRING_DATETIME				306

+#define EXIFTAG_STRING_COPYRIGHT			33432

+#endif

diff --git a/core/include/fxcodec/fx_codec_provider.h b/core/include/fxcodec/fx_codec_provider.h
new file mode 100644
index 0000000..4ef61d8
--- /dev/null
+++ b/core/include/fxcodec/fx_codec_provider.h
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_CODEC_PROVIDER_H_

+#define _FX_CODEC_PROVIDER_H_

+class IFX_JpegProvider

+{

+public:

+

+    virtual void		Release() = 0;

+

+    virtual void*		CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, FX_BOOL ColorTransform) = 0;

+

+

+    virtual void		DestroyDecoder(void* pDecoder) = 0;

+

+    virtual void		DownScale(void* pDecoder, int dest_width, int dest_height) = 0;

+

+    virtual FX_BOOL		Rewind(void* pDecoder) = 0;

+

+    virtual FX_LPBYTE	GetNextLine(void* pDecoder) = 0;

+

+    virtual FX_DWORD	GetSrcOffset(void* pDecoder) = 0;

+

+

+    virtual FX_BOOL		LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,

+                                 int& num_components, int& bits_per_components, FX_BOOL& color_transform,

+                                 FX_LPBYTE* icc_buf_ptr = NULL, FX_DWORD* icc_length = NULL) = 0;

+

+    virtual FX_BOOL		Encode(const class CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality = 75,

+                               FX_LPCBYTE icc_buf = NULL, FX_DWORD icc_length = 0) = 0;

+

+    virtual void*		Start() = 0;

+

+    virtual void		Finish(void* pContext) = 0;

+

+    virtual void		Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;

+

+    virtual int			ReadHeader(void* pContext, int* width, int* height, int* nComps) = 0;

+

+

+    virtual int			StartScanline(void* pContext, int down_scale) = 0;

+

+

+    virtual FX_BOOL		ReadScanline(void* pContext, FX_LPBYTE dest_buf) = 0;

+

+

+    virtual FX_DWORD	GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr = NULL) = 0;

+};

+#endif

diff --git a/core/include/fxcrt/fx_arb.h b/core/include/fxcrt/fx_arb.h
new file mode 100644
index 0000000..4950f81
--- /dev/null
+++ b/core/include/fxcrt/fx_arb.h
@@ -0,0 +1,20 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_ARABIC_
+#define _FX_ARABIC_
+class IFX_BidiChar
+{
+public:
+    static IFX_BidiChar*	Create();
+    virtual void			Release() = 0;
+    virtual void			SetPolicy(FX_BOOL bSeparateNeutral = TRUE) = 0;
+    virtual FX_BOOL			AppendChar(FX_WCHAR wch) = 0;
+    virtual FX_BOOL			EndChar() = 0;
+    virtual FX_INT32		GetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount) = 0;
+    virtual void			Reset() = 0;
+};
+#endif
diff --git a/core/include/fxcrt/fx_basic.h b/core/include/fxcrt/fx_basic.h
new file mode 100644
index 0000000..29bc221
--- /dev/null
+++ b/core/include/fxcrt/fx_basic.h
@@ -0,0 +1,1642 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_BASIC_H_

+#define _FX_BASIC_H_

+#ifndef _FX_SYSTEM_H_

+#include "fx_system.h"

+#endif

+#ifndef _FX_MEMORY_H_

+#include "fx_memory.h"

+#endif

+#ifndef _FX_STRING_H_

+#include "fx_string.h"

+#endif

+#ifndef _FX_STREAM_H_

+#include "fx_stream.h"

+#endif

+class CFX_BinaryBuf : public CFX_Object

+{

+public:

+

+    CFX_BinaryBuf(IFX_Allocator* pAllocator = NULL);

+

+    CFX_BinaryBuf(FX_STRSIZE size, IFX_Allocator* pAllocator = NULL);

+

+    ~CFX_BinaryBuf();

+

+    void					Clear();

+

+    void					EstimateSize(FX_STRSIZE size, FX_STRSIZE alloc_step = 0);

+

+    void					AppendBlock(const void* pBuf, FX_STRSIZE size);

+

+    void					AppendFill(FX_BYTE byte, FX_STRSIZE count);

+

+    void					AppendString(FX_BSTR str)

+    {

+        AppendBlock(str.GetPtr(), str.GetLength());

+    }

+

+    inline void				AppendByte(FX_BYTE byte)

+    {

+        if (m_AllocSize <= m_DataSize) {

+            ExpandBuf(1);

+        }

+        m_pBuffer[m_DataSize++] = byte;

+    }

+

+    void					InsertBlock(FX_STRSIZE pos, const void* pBuf, FX_STRSIZE size);

+

+    void					AttachData(void* pBuf, FX_STRSIZE size);

+

+    void					CopyData(const void* pBuf, FX_STRSIZE size);

+

+    void					TakeOver(CFX_BinaryBuf& other);

+

+    void					Delete(int start_index, int count);

+

+    FX_LPBYTE				GetBuffer() const

+    {

+        return m_pBuffer;

+    }

+

+    FX_STRSIZE				GetSize() const

+    {

+        return m_DataSize;

+    }

+

+    CFX_ByteStringC			GetByteString() const;

+    void					GetByteStringL(CFX_ByteStringL &str) const;

+

+    void					DetachBuffer();

+

+    IFX_Allocator*			m_pAllocator;

+protected:

+

+    FX_STRSIZE				m_AllocStep;

+

+    FX_LPBYTE				m_pBuffer;

+

+    FX_STRSIZE				m_DataSize;

+

+    FX_STRSIZE				m_AllocSize;

+

+    void					ExpandBuf(FX_STRSIZE size);

+};

+class CFX_ByteTextBuf : public CFX_BinaryBuf

+{

+public:

+

+    CFX_ByteTextBuf(IFX_Allocator* pAllocator = NULL) : CFX_BinaryBuf(pAllocator) {}

+

+    void					operator = (FX_BSTR str);

+

+    void					AppendChar(int ch)

+    {

+        AppendByte((FX_BYTE)ch);

+    }

+

+    CFX_ByteTextBuf&		operator << (int i);

+

+    CFX_ByteTextBuf&		operator << (FX_DWORD i);

+

+    CFX_ByteTextBuf&		operator << (double f);

+

+    CFX_ByteTextBuf&		operator << (FX_BSTR lpsz);

+

+    CFX_ByteTextBuf&		operator << (const CFX_ByteTextBuf& buf);

+

+    FX_STRSIZE				GetLength() const

+    {

+        return m_DataSize;

+    }

+};

+class CFX_WideTextBuf : public CFX_BinaryBuf

+{

+public:

+

+    CFX_WideTextBuf(IFX_Allocator* pAllocator = NULL) : CFX_BinaryBuf(pAllocator) {}

+

+    void					operator = (FX_LPCWSTR lpsz);

+

+    void					operator = (FX_WSTR str);

+

+    void					AppendChar(FX_WCHAR wch);

+

+    CFX_WideTextBuf&		operator << (int i);

+

+    CFX_WideTextBuf&		operator << (double f);

+

+    CFX_WideTextBuf&		operator << (FX_LPCWSTR lpsz);

+

+    CFX_WideTextBuf&		operator << (FX_WSTR str);

+    CFX_WideTextBuf&		operator << (const CFX_WideString &str);

+

+    CFX_WideTextBuf&		operator << (const CFX_WideTextBuf& buf);

+

+    FX_STRSIZE				GetLength() const

+    {

+        return m_DataSize / sizeof(FX_WCHAR);

+    }

+

+    FX_LPWSTR				GetBuffer() const

+    {

+        return (FX_LPWSTR)m_pBuffer;

+    }

+

+    void					Delete(int start_index, int count)

+    {

+        CFX_BinaryBuf::Delete(start_index * sizeof(FX_WCHAR), count * sizeof(FX_WCHAR));

+    }

+

+    CFX_WideStringC			GetWideString() const;

+    void					GetWideStringL(CFX_WideStringL& wideText) const;

+};

+class CFX_ArchiveSaver : public CFX_Object

+{

+public:

+

+    CFX_ArchiveSaver(IFX_Allocator* pAllocator = NULL) : m_SavingBuf(pAllocator), m_pStream(NULL) {}

+

+    CFX_ArchiveSaver&		operator << (FX_BYTE i);

+

+    CFX_ArchiveSaver&		operator << (int i);

+

+    CFX_ArchiveSaver&		operator << (FX_DWORD i);

+

+    CFX_ArchiveSaver&		operator << (FX_FLOAT i);

+

+    CFX_ArchiveSaver&		operator << (double i);

+

+    CFX_ArchiveSaver&		operator << (FX_BSTR bstr);

+

+    CFX_ArchiveSaver&		operator << (FX_LPCWSTR bstr);

+

+    CFX_ArchiveSaver&		operator << (const CFX_WideString& wstr);

+

+    void					Write(const void* pData, FX_STRSIZE dwSize);

+

+    FX_INTPTR				GetLength()

+    {

+        return m_SavingBuf.GetSize();

+    }

+

+    FX_LPCBYTE				GetBuffer()

+    {

+        return m_SavingBuf.GetBuffer();

+    }

+

+    void					SetStream(IFX_FileStream* pStream)

+    {

+        m_pStream = pStream;

+    }

+protected:

+

+    CFX_BinaryBuf			m_SavingBuf;

+

+    IFX_FileStream*			m_pStream;

+};

+class CFX_ArchiveLoader : public CFX_Object

+{

+public:

+

+    CFX_ArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize);

+

+    CFX_ArchiveLoader&		operator >> (FX_BYTE& i);

+

+    CFX_ArchiveLoader&		operator >> (int& i);

+

+    CFX_ArchiveLoader&		operator >> (FX_DWORD& i);

+

+    CFX_ArchiveLoader&		operator >> (FX_FLOAT& i);

+

+    CFX_ArchiveLoader&		operator >> (double& i);

+

+    CFX_ArchiveLoader&		operator >> (CFX_ByteString& bstr);

+

+    CFX_ArchiveLoader&		operator >> (CFX_WideString& wstr);

+

+    FX_BOOL					IsEOF();

+

+    FX_BOOL					Read(void* pBuf, FX_DWORD dwSize);

+protected:

+

+    FX_DWORD				m_LoadingPos;

+

+    FX_LPCBYTE				m_pLoadingBuf;

+

+    FX_DWORD				m_LoadingSize;

+};

+class IFX_BufferArchive

+{

+public:

+

+    IFX_BufferArchive(FX_STRSIZE size, IFX_Allocator* pAllocator = NULL);

+

+

+    virtual void			Clear();

+

+

+    FX_BOOL					Flush();

+

+

+    FX_INT32				AppendBlock(const void* pBuf, size_t size);

+

+    FX_INT32				AppendByte(FX_BYTE byte);

+

+    FX_INT32				AppendDWord(FX_DWORD i);

+

+

+    FX_INT32				AppendString(FX_BSTR lpsz);

+

+protected:

+

+    virtual	FX_BOOL			DoWork(const void* pBuf, size_t size) = 0;

+

+

+    IFX_Allocator*			m_pAllocator;

+

+    FX_STRSIZE				m_BufSize;

+

+    FX_LPBYTE				m_pBuffer;

+

+    FX_STRSIZE				m_Length;

+};

+class CFX_FileBufferArchive : public IFX_BufferArchive, public CFX_Object

+{

+public:

+    CFX_FileBufferArchive(FX_STRSIZE size = 32768, IFX_Allocator* pAllocator = NULL);

+    ~CFX_FileBufferArchive();

+    virtual void			Clear();

+

+    FX_BOOL					AttachFile(IFX_StreamWrite *pFile, FX_BOOL bTakeover = FALSE);

+

+    FX_BOOL					AttachFile(FX_LPCWSTR filename);

+

+    FX_BOOL					AttachFile(FX_LPCSTR filename);

+private:

+

+    virtual FX_BOOL			DoWork(const void* pBuf, size_t size);

+

+    IFX_StreamWrite			*m_pFile;

+

+    FX_BOOL					m_bTakeover;

+};

+struct CFX_CharMap {

+

+    static CFX_CharMap*		GetDefaultMapper(FX_INT32 codepage = 0);

+

+

+    CFX_WideString	(*m_GetWideString)(CFX_CharMap* pMap, const CFX_ByteString& bstr);

+

+    CFX_ByteString	(*m_GetByteString)(CFX_CharMap* pMap, const CFX_WideString& wstr);

+

+    FX_INT32		(*m_GetCodePage)();

+};

+class CFX_UTF8Decoder

+{

+public:

+

+    CFX_UTF8Decoder(IFX_Allocator* pAllocator = NULL) : m_Buffer(pAllocator)

+    {

+        m_PendingBytes = 0;

+    }

+

+    void			Clear();

+

+    void			Input(FX_BYTE byte);

+

+    void			AppendChar(FX_DWORD ch);

+

+    void			ClearStatus()

+    {

+        m_PendingBytes = 0;

+    }

+

+    CFX_WideStringC	GetResult() const

+    {

+        return m_Buffer.GetWideString();

+    }

+    void			GetResult(CFX_WideStringL &result) const

+    {

+        m_Buffer.GetWideStringL(result);

+    }

+protected:

+

+    int				m_PendingBytes;

+

+    FX_DWORD		m_PendingChar;

+

+    CFX_WideTextBuf	m_Buffer;

+};

+class CFX_UTF8Encoder

+{

+public:

+

+    CFX_UTF8Encoder(IFX_Allocator* pAllocator = NULL) : m_Buffer(pAllocator)

+    {

+        m_UTF16First = 0;

+    }

+

+    void			Input(FX_WCHAR unicode);

+

+    void			AppendStr(FX_BSTR str)

+    {

+        m_UTF16First = 0;

+        m_Buffer << str;

+    }

+

+    CFX_ByteStringC	GetResult() const

+    {

+        return m_Buffer.GetByteString();

+    }

+    void			GetResult(CFX_ByteStringL &result) const

+    {

+        m_Buffer.GetByteStringL(result);

+    }

+protected:

+

+    CFX_ByteTextBuf	m_Buffer;

+

+    FX_DWORD		m_UTF16First;

+};

+CFX_ByteString FX_UrlEncode(const CFX_WideString& wsUrl);

+CFX_WideString FX_UrlDecode(const CFX_ByteString& bsUrl);

+CFX_ByteString FX_EncodeURI(const CFX_WideString& wsURI);

+CFX_WideString FX_DecodeURI(const CFX_ByteString& bsURI);

+class CFX_BasicArray : public CFX_Object

+{

+public:

+

+    IFX_Allocator*	m_pAllocator;

+protected:

+

+    CFX_BasicArray(int unit_size, IFX_Allocator* pAllocator = NULL);

+

+    ~CFX_BasicArray();

+

+    FX_BOOL			SetSize(int nNewSize, int nGrowBy);

+

+    FX_BOOL			Append(const CFX_BasicArray& src);

+

+    FX_BOOL			Copy(const CFX_BasicArray& src);

+

+    FX_LPBYTE		InsertSpaceAt(int nIndex, int nCount);

+

+    FX_BOOL			RemoveAt(int nIndex, int nCount);

+

+    FX_BOOL			InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray);

+

+    const void*		GetDataPtr(int index) const;

+protected:

+

+    FX_LPBYTE		m_pData;

+

+    int				m_nSize;

+

+    int				m_nMaxSize;

+

+    int				m_nGrowBy;

+

+    int				m_nUnitSize;

+};

+template<class TYPE>

+class CFX_ArrayTemplate : public CFX_BasicArray

+{

+public:

+

+    CFX_ArrayTemplate(IFX_Allocator* pAllocator = NULL) : CFX_BasicArray(sizeof(TYPE), pAllocator) {}

+

+    int			GetSize() const

+    {

+        return m_nSize;

+    }

+

+    int			GetUpperBound() const

+    {

+        return m_nSize - 1;

+    }

+

+    FX_BOOL		SetSize(int nNewSize, int nGrowBy = -1)

+    {

+        return CFX_BasicArray::SetSize(nNewSize, nGrowBy);

+    }

+

+    void		RemoveAll()

+    {

+        SetSize(0, -1);

+    }

+

+    const TYPE	GetAt(int nIndex) const

+    {

+        if (nIndex < 0 || nIndex >= m_nSize) {

+            return (const TYPE&)(*(volatile const TYPE*)NULL);

+        }

+        return ((const TYPE*)m_pData)[nIndex];

+    }

+

+    FX_BOOL		SetAt(int nIndex, TYPE newElement)

+    {

+        if (nIndex < 0 || nIndex >= m_nSize) {

+            return FALSE;

+        }

+        ((TYPE*)m_pData)[nIndex] = newElement;

+        return TRUE;

+    }

+

+    TYPE&		ElementAt(int nIndex)

+    {

+        if (nIndex < 0 || nIndex >= m_nSize) {

+            return *(TYPE*)NULL;

+        }

+        return ((TYPE*)m_pData)[nIndex];

+    }

+

+    const TYPE*	GetData() const

+    {

+        return (const TYPE*)m_pData;

+    }

+

+    TYPE*		GetData()

+    {

+        return (TYPE*)m_pData;

+    }

+

+    FX_BOOL		SetAtGrow(int nIndex, TYPE newElement)

+    {

+        if (nIndex < 0) {

+            return FALSE;

+        }

+        if (nIndex >= m_nSize)

+            if (!SetSize(nIndex + 1, -1)) {

+                return FALSE;

+            }

+        ((TYPE*)m_pData)[nIndex] = newElement;

+        return TRUE;

+    }

+

+    FX_BOOL		Add(TYPE newElement)

+    {

+        if (m_nSize < m_nMaxSize) {

+            m_nSize ++;

+        } else if (!SetSize(m_nSize + 1, -1)) {

+            return FALSE;

+        }

+        ((TYPE*)m_pData)[m_nSize - 1] = newElement;

+        return TRUE;

+    }

+

+    FX_BOOL		Append(const CFX_ArrayTemplate& src)

+    {

+        return CFX_BasicArray::Append(src);

+    }

+

+    FX_BOOL		Copy(const CFX_ArrayTemplate& src)

+    {

+        return CFX_BasicArray::Copy(src);

+    }

+

+    TYPE*		GetDataPtr(int index)

+    {

+        return (TYPE*)CFX_BasicArray::GetDataPtr(index);

+    }

+

+    TYPE*		AddSpace()

+    {

+        return (TYPE*)CFX_BasicArray::InsertSpaceAt(m_nSize, 1);

+    }

+

+    TYPE*		InsertSpaceAt(int nIndex, int nCount)

+    {

+        return (TYPE*)CFX_BasicArray::InsertSpaceAt(nIndex, nCount);

+    }

+

+    const TYPE	operator[](int nIndex) const

+    {

+        if (nIndex < 0 || nIndex >= m_nSize) {

+            *(volatile char*)0 = '\0';

+        }

+        return ((const TYPE*)m_pData)[nIndex];

+    }

+

+    TYPE&		operator[](int nIndex)

+    {

+        if (nIndex < 0 || nIndex >= m_nSize) {

+            *(volatile char*)0 = '\0';

+        }

+        return ((TYPE*)m_pData)[nIndex];

+    }

+

+    FX_BOOL		InsertAt(int nIndex, TYPE newElement, int nCount = 1)

+    {

+        if (!InsertSpaceAt(nIndex, nCount)) {

+            return FALSE;

+        }

+        while (nCount--) {

+            ((TYPE*)m_pData)[nIndex++] = newElement;

+        }

+        return TRUE;

+    }

+

+    FX_BOOL		RemoveAt(int nIndex, int nCount = 1)

+    {

+        return CFX_BasicArray::RemoveAt(nIndex, nCount);

+    }

+

+    FX_BOOL		InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray)

+    {

+        return CFX_BasicArray::InsertAt(nStartIndex, pNewArray);

+    }

+

+    int			Find(TYPE data, int iStart = 0) const

+    {

+        if (iStart < 0) {

+            return -1;

+        }

+        for (; iStart < (int)m_nSize; iStart ++)

+            if (((TYPE*)m_pData)[iStart] == data) {

+                return iStart;

+            }

+        return -1;

+    }

+};

+typedef CFX_ArrayTemplate<FX_BYTE>		CFX_ByteArray;

+typedef CFX_ArrayTemplate<FX_WORD>		CFX_WordArray;

+typedef CFX_ArrayTemplate<FX_DWORD>		CFX_DWordArray;

+typedef CFX_ArrayTemplate<void*>		CFX_PtrArray;

+typedef CFX_ArrayTemplate<FX_FILESIZE>	CFX_FileSizeArray;

+typedef CFX_ArrayTemplate<FX_FLOAT>		CFX_FloatArray;

+typedef CFX_ArrayTemplate<FX_INT32>		CFX_Int32Array;

+template <class ObjectClass>

+class CFX_ObjectArray : public CFX_BasicArray

+{

+public:

+

+    CFX_ObjectArray(IFX_Allocator* pAllocator = NULL) : CFX_BasicArray(sizeof(ObjectClass), pAllocator) {}

+

+    ~CFX_ObjectArray()

+    {

+        RemoveAll();

+    }

+

+    void			Add(const ObjectClass& data)

+    {

+        new ((void*)InsertSpaceAt(m_nSize, 1)) ObjectClass(data);

+    }

+

+    ObjectClass&	Add()

+    {

+        return *(ObjectClass*) new ((void*)InsertSpaceAt(m_nSize, 1)) ObjectClass();

+    }

+

+    void*			AddSpace()

+    {

+        return InsertSpaceAt(m_nSize, 1);

+    }

+

+    FX_INT32		Append(const CFX_ObjectArray& src, FX_INT32 nStart = 0, FX_INT32 nCount = -1)

+    {

+        if (nCount == 0) {

+            return 0;

+        }

+        FX_INT32 nSize = src.GetSize();

+        if (!nSize) {

+            return 0;

+        }

+        FXSYS_assert(nStart > -1 && nStart < nSize);

+        if (nCount < 0) {

+            nCount = nSize;

+        }

+        if (nStart + nCount > nSize) {

+            nCount = nSize - nStart;

+        }

+        if (nCount < 1) {

+            return 0;

+        }

+        nSize = m_nSize;

+        InsertSpaceAt(m_nSize, nCount);

+        ObjectClass* pStartObj = (ObjectClass*)GetDataPtr(nSize);

+        nSize = nStart + nCount;

+        for (FX_INT32 i = nStart; i < nSize; i ++, pStartObj++) {

+            new ((void*)pStartObj) ObjectClass(src[i]);

+        }

+        return nCount;

+    }

+

+    FX_INT32		Copy(const CFX_ObjectArray& src, FX_INT32 nStart = 0, FX_INT32 nCount = -1)

+    {

+        if (nCount == 0) {

+            return 0;

+        }

+        FX_INT32 nSize = src.GetSize();

+        if (!nSize) {

+            return 0;

+        }

+        FXSYS_assert(nStart > -1 && nStart < nSize);

+        if (nCount < 0) {

+            nCount = nSize;

+        }

+        if (nStart + nCount > nSize) {

+            nCount = nSize - nStart;

+        }

+        if (nCount < 1) {

+            return 0;

+        }

+        RemoveAll();

+        SetSize(nCount, -1);

+        ObjectClass* pStartObj = (ObjectClass*)m_pData;

+        nSize = nStart + nCount;

+        for (FX_INT32 i = nStart; i < nSize; i ++, pStartObj++) {

+            new ((void*)pStartObj) ObjectClass(src[i]);

+        }

+        return nCount;

+    }

+

+    int				GetSize() const

+    {

+        return m_nSize;

+    }

+

+    ObjectClass&	operator[] (int index) const

+    {

+        FXSYS_assert(index < m_nSize);

+        return *(ObjectClass*)CFX_BasicArray::GetDataPtr(index);

+    }

+

+    ObjectClass*	GetDataPtr(int index)

+    {

+        return (ObjectClass*)CFX_BasicArray::GetDataPtr(index);

+    }

+

+    void			RemoveAt(int index)

+    {

+        FXSYS_assert(index < m_nSize);

+        ((ObjectClass*)GetDataPtr(index))->~ObjectClass();

+        CFX_BasicArray::RemoveAt(index, 1);

+    }

+

+    void			RemoveAll()

+    {

+        for (int i = 0; i < m_nSize; i ++) {

+            ((ObjectClass*)GetDataPtr(i))->~ObjectClass();

+        }

+        CFX_BasicArray::SetSize(0, -1);

+    }

+};

+typedef CFX_ObjectArray<CFX_ByteString> CFX_ByteStringArray;

+typedef CFX_ObjectArray<CFX_WideString> CFX_WideStringArray;

+class CFX_BaseSegmentedArray : public CFX_Object

+{

+public:

+

+    CFX_BaseSegmentedArray(int unit_size = 1, int segment_units = 512, int index_size = 8, IFX_Allocator* pAllocator = NULL);

+

+    ~CFX_BaseSegmentedArray();

+

+    void	SetUnitSize(int unit_size, int segment_units, int index_size = 8);

+

+    void*	Add();

+

+    void*	GetAt(int index) const;

+

+    void	RemoveAll();

+

+    void	Delete(int index, int count = 1);

+

+    int		GetSize() const

+    {

+        return m_DataSize;

+    }

+

+    int		GetSegmentSize() const

+    {

+        return m_SegmentSize;

+    }

+

+    int		GetUnitSize() const

+    {

+        return m_UnitSize;

+    }

+

+    void*	Iterate(FX_BOOL (*callback)(void* param, void* pData), void* param) const;

+

+    IFX_Allocator*	m_pAllocator;

+private:

+

+    int				m_UnitSize;

+

+    short			m_SegmentSize;

+

+    FX_BYTE			m_IndexSize;

+

+    FX_BYTE			m_IndexDepth;

+

+    int				m_DataSize;

+

+    void*			m_pIndex;

+    void**	GetIndex(int seg_index) const;

+    void*	IterateIndex(int level, int& start, void** pIndex, FX_BOOL (*callback)(void* param, void* pData), void* param) const;

+    void*	IterateSegment(FX_LPCBYTE pSegment, int count, FX_BOOL (*callback)(void* param, void* pData), void* param) const;

+};

+template <class ElementType>

+class CFX_SegmentedArray : public CFX_BaseSegmentedArray

+{

+public:

+

+    CFX_SegmentedArray(int segment_units, int index_size = 8, IFX_Allocator* pAllocator = NULL)

+        : CFX_BaseSegmentedArray(sizeof(ElementType), segment_units, index_size, pAllocator)

+    {}

+

+    void	Add(ElementType data)

+    {

+        *(ElementType*)CFX_BaseSegmentedArray::Add() = data;

+    }

+

+    ElementType& operator [] (int index)

+    {

+        return *(ElementType*)CFX_BaseSegmentedArray::GetAt(index);

+    }

+};

+template <class DataType, int FixedSize>

+class CFX_FixedBufGrow : public CFX_Object

+{

+public:

+    CFX_FixedBufGrow(IFX_Allocator* pAllocator = NULL)

+        : m_pAllocator(pAllocator)

+        , m_pData(NULL)

+    {}

+    CFX_FixedBufGrow(int data_size, IFX_Allocator* pAllocator = NULL)

+        : m_pAllocator(pAllocator)

+        , m_pData(NULL)

+    {

+        if (data_size > FixedSize) {

+            m_pData = FX_Allocator_Alloc(m_pAllocator, DataType, data_size);

+        } else {

+            FXSYS_memset32(m_Data, 0, sizeof(DataType)*FixedSize);

+        }

+    }

+    void SetDataSize(int data_size)

+    {

+        if (m_pData) {

+            FX_Allocator_Free(m_pAllocator, m_pData);

+        }

+        m_pData = NULL;

+        if (data_size > FixedSize) {

+            m_pData = FX_Allocator_Alloc(m_pAllocator, DataType, data_size);

+        } else {

+            FXSYS_memset32(m_Data, 0, sizeof(DataType)*FixedSize);

+        }

+    }

+    ~CFX_FixedBufGrow()

+    {

+        if (m_pData) {

+            FX_Allocator_Free(m_pAllocator, m_pData);

+        }

+    }

+    operator DataType*()

+    {

+        return m_pData ? m_pData : m_Data;

+    }

+private:

+    IFX_Allocator*	m_pAllocator;

+    DataType		m_Data[FixedSize];

+    DataType*		m_pData;

+};

+template <class DataType>

+class CFX_TempBuf

+{

+public:

+    CFX_TempBuf(int size, IFX_Allocator* pAllocator = NULL) : m_pAllocator(pAllocator)

+    {

+        m_pData = FX_Allocator_Alloc(m_pAllocator, DataType, size);

+    }

+    ~CFX_TempBuf()

+    {

+        if (m_pData) {

+            FX_Allocator_Free(m_pAllocator, m_pData);

+        }

+    }

+    DataType&	operator[](int i)

+    {

+        FXSYS_assert(m_pData != NULL);

+        return m_pData[i];

+    }

+    operator DataType*()

+    {

+        return m_pData;

+    }

+private:

+    IFX_Allocator*	m_pAllocator;

+    DataType*		m_pData;

+};

+class CFX_MapPtrToPtr : public CFX_Object

+{

+protected:

+

+    struct CAssoc {

+

+        CAssoc* pNext;

+

+        void* key;

+

+        void* value;

+    };

+public:

+

+    CFX_MapPtrToPtr(int nBlockSize = 10, IFX_Allocator* pAllocator = NULL);

+

+    ~CFX_MapPtrToPtr();

+

+    int GetCount() const

+    {

+        return m_nCount;

+    }

+

+    FX_BOOL IsEmpty() const

+    {

+        return m_nCount == 0;

+    }

+

+    FX_BOOL Lookup(void* key, void*& rValue) const;

+

+    void* GetValueAt(void* key) const;

+

+    void*& operator[](void* key);

+

+    void SetAt(void* key, void* newValue)

+    {

+        (*this)[key] = newValue;

+    }

+

+    FX_BOOL RemoveKey(void* key);

+

+    void RemoveAll();

+

+    FX_POSITION GetStartPosition() const

+    {

+        return (m_nCount == 0) ? NULL : (FX_POSITION) - 1;

+    }

+

+    void GetNextAssoc(FX_POSITION& rNextPosition, void*& rKey, void*& rValue) const;

+

+    FX_DWORD GetHashTableSize() const

+    {

+        return m_nHashTableSize;

+    }

+

+    void InitHashTable(FX_DWORD hashSize, FX_BOOL bAllocNow = TRUE);

+protected:

+

+    IFX_Allocator*	m_pAllocator;

+

+    CAssoc** m_pHashTable;

+

+    FX_DWORD m_nHashTableSize;

+

+    int m_nCount;

+

+    CAssoc* m_pFreeList;

+

+    struct CFX_Plex* m_pBlocks;

+

+    int m_nBlockSize;

+

+    FX_DWORD HashKey(void* key) const;

+

+    CAssoc* NewAssoc();

+

+    void FreeAssoc(CAssoc* pAssoc);

+

+    CAssoc* GetAssocAt(void* key, FX_DWORD& hash) const;

+};

+template <class KeyType, class ValueType>

+class CFX_MapPtrTemplate : public CFX_MapPtrToPtr

+{

+public:

+

+    CFX_MapPtrTemplate(IFX_Allocator* pAllocator = NULL) : CFX_MapPtrToPtr(10, pAllocator) {}

+

+    FX_BOOL	Lookup(KeyType key, ValueType& rValue) const

+    {

+        FX_LPVOID pValue = NULL;

+        if (!CFX_MapPtrToPtr::Lookup((void*)(FX_UINTPTR)key, pValue)) {

+            return FALSE;

+        }

+        rValue = (ValueType)(FX_UINTPTR)pValue;

+        return TRUE;

+    }

+

+    ValueType& operator[](KeyType key)

+    {

+        return (ValueType&)CFX_MapPtrToPtr::operator []((void*)(FX_UINTPTR)key);

+    }

+

+    void SetAt(KeyType key, ValueType newValue)

+    {

+        CFX_MapPtrToPtr::SetAt((void*)(FX_UINTPTR)key, (void*)(FX_UINTPTR)newValue);

+    }

+

+    FX_BOOL	RemoveKey(KeyType key)

+    {

+        return CFX_MapPtrToPtr::RemoveKey((void*)(FX_UINTPTR)key);

+    }

+

+    void GetNextAssoc(FX_POSITION& rNextPosition, KeyType& rKey, ValueType& rValue) const

+    {

+        void* pKey = NULL;

+        void* pValue = NULL;

+        CFX_MapPtrToPtr::GetNextAssoc(rNextPosition, pKey, pValue);

+        rKey = (KeyType)(FX_UINTPTR)pKey;

+        rValue = (ValueType)(FX_UINTPTR)pValue;

+    }

+};

+class CFX_CMapDWordToDWord : public CFX_Object

+{

+public:

+

+    CFX_CMapDWordToDWord(IFX_Allocator* pAllocator = NULL) : m_Buffer(pAllocator) {}

+

+    FX_BOOL			Lookup(FX_DWORD key, FX_DWORD& value) const;

+

+    void			SetAt(FX_DWORD key, FX_DWORD value);

+

+    void			EstimateSize(FX_DWORD size, FX_DWORD grow_by);

+

+    FX_POSITION		GetStartPosition() const;

+

+    void			GetNextAssoc(FX_POSITION& pos, FX_DWORD& key, FX_DWORD& value) const;

+protected:

+

+    CFX_BinaryBuf	m_Buffer;

+};

+class CFX_MapByteStringToPtr : public CFX_Object

+{

+protected:

+

+    struct CAssoc {

+

+        CAssoc* pNext;

+

+        FX_DWORD nHashValue;

+

+        CFX_ByteString key;

+

+        void* value;

+    };

+public:

+

+    CFX_MapByteStringToPtr(int nBlockSize = 10, IFX_Allocator* pAllocator = NULL);

+

+    int GetCount() const

+    {

+        return m_nCount;

+    }

+

+    FX_BOOL IsEmpty() const

+    {

+        return m_nCount == 0;

+    }

+

+    FX_BOOL Lookup(FX_BSTR key, void*& rValue) const;

+

+    void*& operator[](FX_BSTR key);

+

+    void SetAt(FX_BSTR key, void* newValue)

+    {

+        (*this)[key] = newValue;

+    }

+

+    FX_BOOL RemoveKey(FX_BSTR key);

+

+    void RemoveAll();

+

+    FX_POSITION GetStartPosition() const

+    {

+        return (m_nCount == 0) ? NULL : (FX_POSITION) - 1;

+    }

+

+    void GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const;

+

+    FX_LPVOID		GetNextValue(FX_POSITION& rNextPosition) const;

+

+    FX_DWORD GetHashTableSize() const

+    {

+        return m_nHashTableSize;

+    }

+

+    void InitHashTable(FX_DWORD hashSize, FX_BOOL bAllocNow = TRUE);

+

+    FX_DWORD HashKey(FX_BSTR key) const;

+protected:

+

+    IFX_Allocator*	m_pAllocator;

+

+    CAssoc** m_pHashTable;

+

+    FX_DWORD m_nHashTableSize;

+

+    int m_nCount;

+

+    CAssoc* m_pFreeList;

+

+    struct CFX_Plex* m_pBlocks;

+

+    int m_nBlockSize;

+

+    CAssoc* NewAssoc();

+

+    void FreeAssoc(CAssoc* pAssoc);

+

+    CAssoc* GetAssocAt(FX_BSTR key, FX_DWORD& hash) const;

+public:

+

+    ~CFX_MapByteStringToPtr();

+};

+class CFX_CMapByteStringToPtr : public CFX_Object

+{

+public:

+

+    CFX_CMapByteStringToPtr(IFX_Allocator* pAllocator = NULL);

+

+    ~CFX_CMapByteStringToPtr();

+

+    void			RemoveAll();

+

+    FX_POSITION		GetStartPosition() const;

+

+    void			GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const;

+

+    FX_LPVOID		GetNextValue(FX_POSITION& rNextPosition) const;

+

+    FX_BOOL			Lookup(FX_BSTR key, void*& rValue) const;

+

+    void			SetAt(FX_BSTR key, void* value);

+

+    void			RemoveKey(FX_BSTR key);

+

+    int				GetCount() const;

+

+    void			AddValue(FX_BSTR key, void* pValue);

+private:

+

+    CFX_BaseSegmentedArray			m_Buffer;

+};

+class CFX_PtrList : public CFX_Object

+{

+protected:

+

+    struct CNode {

+

+        CNode* pNext;

+

+        CNode* pPrev;

+

+        void* data;

+    };

+public:

+

+    CFX_PtrList(int nBlockSize = 10, IFX_Allocator* pAllocator = NULL);

+

+    FX_POSITION GetHeadPosition() const

+    {

+        return (FX_POSITION)m_pNodeHead;

+    }

+

+    FX_POSITION GetTailPosition() const

+    {

+        return (FX_POSITION)m_pNodeTail;

+    }

+

+    void*	GetNext(FX_POSITION& rPosition) const

+    {

+        CNode* pNode = (CNode*) rPosition;

+        rPosition = (FX_POSITION) pNode->pNext;

+        return pNode->data;

+    }

+

+    void*	GetPrev(FX_POSITION& rPosition) const

+    {

+        CNode* pNode = (CNode*) rPosition;

+        rPosition = (FX_POSITION) pNode->pPrev;

+        return pNode->data;

+    }

+

+    FX_POSITION	GetNextPosition(FX_POSITION pos) const

+    {

+        return ((CNode*)pos)->pNext;

+    }

+

+    FX_POSITION	GetPrevPosition(FX_POSITION pos) const

+    {

+        return ((CNode*)pos)->pPrev;

+    }

+

+    void*	GetAt(FX_POSITION rPosition) const

+    {

+        CNode* pNode = (CNode*) rPosition;

+        return pNode->data;

+    }

+

+    int		GetCount() const

+    {

+        return m_nCount;

+    }

+

+    FX_POSITION	AddTail(void* newElement);

+

+    FX_POSITION AddHead(void* newElement);

+

+    void	SetAt(FX_POSITION pos, void* newElement)

+    {

+        CNode* pNode = (CNode*) pos;

+        pNode->data = newElement;

+    }

+

+    FX_POSITION InsertAfter(FX_POSITION pos, void* newElement);

+

+    FX_POSITION Find(void* searchValue, FX_POSITION startAfter = NULL ) const;

+

+    FX_POSITION FindIndex(int index) const;

+

+    void	RemoveAt(FX_POSITION pos);

+

+    void	RemoveAll();

+protected:

+

+    IFX_Allocator*	m_pAllocator;

+

+    CNode* m_pNodeHead;

+

+    CNode* m_pNodeTail;

+

+    int m_nCount;

+

+    CNode* m_pNodeFree;

+

+    struct CFX_Plex* m_pBlocks;

+

+    int m_nBlockSize;

+

+    CNode* NewNode(CNode* pPrev, CNode* pNext);

+

+    void FreeNode(CNode* pNode);

+public:

+

+    ~CFX_PtrList();

+};

+typedef void (*PD_CALLBACK_FREEDATA)(FX_LPVOID pData);

+struct FX_PRIVATEDATA {

+

+    void					FreeData();

+

+    FX_LPVOID				m_pModuleId;

+

+    FX_LPVOID				m_pData;

+

+    PD_CALLBACK_FREEDATA	m_pCallback;

+

+    FX_BOOL					m_bSelfDestruct;

+};

+class CFX_PrivateData

+{

+public:

+

+    CFX_PrivateData(IFX_Allocator* pAllocator = NULL) : m_DataList(pAllocator) {}

+

+    ~CFX_PrivateData();

+

+    void					ClearAll();

+

+    void					SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback);

+

+    void					SetPrivateObj(FX_LPVOID module_id, CFX_DestructObject* pObj);

+

+    FX_LPVOID				GetPrivateData(FX_LPVOID module_id);

+

+    FX_BOOL					LookupPrivateData(FX_LPVOID module_id, FX_LPVOID &pData) const

+    {

+        if (!module_id) {

+            return FALSE;

+        }

+        FX_DWORD nCount = m_DataList.GetSize();

+        for (FX_DWORD n = 0; n < nCount; n ++) {

+            if (m_DataList[n].m_pModuleId == module_id) {

+                pData = m_DataList[n].m_pData;

+                return TRUE;

+            }

+        }

+        return FALSE;

+    }

+

+    FX_BOOL					RemovePrivateData(FX_LPVOID module_id);

+protected:

+

+    CFX_ArrayTemplate<FX_PRIVATEDATA>	m_DataList;

+

+    void					AddData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback, FX_BOOL bSelfDestruct);

+};

+class CFX_BitStream : public CFX_Object

+{

+public:

+

+    void				Init(FX_LPCBYTE pData, FX_DWORD dwSize);

+

+

+    FX_DWORD			GetBits(FX_DWORD nBits);

+

+    void				ByteAlign();

+

+    FX_BOOL				IsEOF()

+    {

+        return m_BitPos >= m_BitSize;

+    }

+

+    void				SkipBits(FX_DWORD nBits)

+    {

+        m_BitPos += nBits;

+    }

+

+    void				Rewind()

+    {

+        m_BitPos = 0;

+    }

+protected:

+

+    FX_DWORD			m_BitPos;

+

+    FX_DWORD			m_BitSize;

+

+    FX_LPCBYTE			m_pData;

+};

+template <class ObjClass> class CFX_CountRef : public CFX_Object

+{

+public:

+

+    typedef CFX_CountRef<ObjClass> Ref;

+

+    class CountedObj : public ObjClass

+    {

+    public:

+

+        CountedObj() {}

+

+        CountedObj(const CountedObj& src) : ObjClass(src) {}

+

+        int			m_RefCount;

+    };

+

+    CFX_CountRef()

+    {

+        m_pObject = NULL;

+    }

+

+    CFX_CountRef(const Ref& ref)

+    {

+        m_pObject = ref.m_pObject;

+        if (m_pObject) {

+            m_pObject->m_RefCount ++;

+        }

+    }

+

+    ~CFX_CountRef()

+    {

+        if (!m_pObject) {

+            return;

+        }

+        m_pObject->m_RefCount --;

+        if (m_pObject->m_RefCount <= 0) {

+            delete m_pObject;

+        }

+    }

+

+    ObjClass*			New()

+    {

+        if (m_pObject) {

+            m_pObject->m_RefCount --;

+            if (m_pObject->m_RefCount <= 0) {

+                delete m_pObject;

+            }

+            m_pObject = NULL;

+        }

+        m_pObject = FX_NEW CountedObj;

+        if (!m_pObject) {

+            return NULL;

+        }

+        m_pObject->m_RefCount = 1;

+        return m_pObject;

+    }

+

+    void				operator = (const Ref& ref)

+    {

+        if (ref.m_pObject) {

+            ref.m_pObject->m_RefCount ++;

+        }

+        if (m_pObject) {

+            m_pObject->m_RefCount --;

+            if (m_pObject->m_RefCount <= 0) {

+                delete m_pObject;

+            }

+        }

+        m_pObject = ref.m_pObject;

+    }

+

+    void				operator = (void* p)

+    {

+        FXSYS_assert(p == 0);

+        if (m_pObject == NULL) {

+            return;

+        }

+        m_pObject->m_RefCount --;

+        if (m_pObject->m_RefCount <= 0) {

+            delete m_pObject;

+        }

+        m_pObject = NULL;

+    }

+

+    const ObjClass*		GetObject() const

+    {

+        return m_pObject;

+    }

+

+    operator			const ObjClass*() const

+    {

+        return m_pObject;

+    }

+

+    FX_BOOL				IsNull() const

+    {

+        return m_pObject == NULL;

+    }

+

+    FX_BOOL				NotNull() const

+    {

+        return m_pObject != NULL;

+    }

+

+    ObjClass*			GetModify()

+    {

+        if (m_pObject == NULL) {

+            m_pObject = FX_NEW CountedObj;

+            if (m_pObject) {

+                m_pObject->m_RefCount = 1;

+            }

+        } else if (m_pObject->m_RefCount > 1) {

+            m_pObject->m_RefCount --;

+            CountedObj* pOldObject = m_pObject;

+            m_pObject = NULL;

+            m_pObject = FX_NEW CountedObj(*pOldObject);

+            if (m_pObject) {

+                m_pObject->m_RefCount = 1;

+            }

+        }

+        return m_pObject;

+    }

+

+    void				SetNull()

+    {

+        if (m_pObject == NULL) {

+            return;

+        }

+        m_pObject->m_RefCount --;

+        if (m_pObject->m_RefCount <= 0) {

+            delete m_pObject;

+        }

+        m_pObject = NULL;

+    }

+

+    FX_BOOL				operator == (const Ref& ref) const

+    {

+        return m_pObject == ref.m_pObject;

+    }

+protected:

+

+    CountedObj*			m_pObject;

+};

+class IFX_Pause

+{

+public:

+

+    virtual FX_BOOL	NeedToPauseNow() = 0;

+};

+class CFX_DataFilter : public CFX_Object

+{

+public:

+

+    virtual ~CFX_DataFilter();

+

+    void			SetDestFilter(CFX_DataFilter* pFilter);

+

+    FX_BOOL			IsEOF() const

+    {

+        return m_bEOF;

+    }

+

+    FX_DWORD		GetSrcPos()

+    {

+        return m_SrcPos;

+    }

+

+    void			FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);

+

+    void			FilterFinish(CFX_BinaryBuf& dest_buf);

+protected:

+

+    CFX_DataFilter();

+    virtual void	v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) = 0;

+    virtual void	v_FilterFinish(CFX_BinaryBuf& dest_buf) = 0;

+    void			ReportEOF(FX_DWORD left_input);

+

+    FX_BOOL			m_bEOF;

+

+    FX_DWORD		m_SrcPos;

+

+    CFX_DataFilter*	m_pDestFilter;

+};

+template <class T>

+class CFX_SmartPointer

+{

+public:

+    CFX_SmartPointer(T *pObj) : m_pObj(pObj) {}

+    ~CFX_SmartPointer()

+    {

+        m_pObj->Release();

+    }

+    operator T*(void)

+    {

+        return m_pObj;

+    }

+    T&		operator *(void)

+    {

+        return *m_pObj;

+    }

+    T*		operator ->(void)

+    {

+        return m_pObj;

+    }

+protected:

+    T *m_pObj;

+};

+#define FX_DATALIST_LENGTH	1024

+template<size_t unit>

+class CFX_SortListArray : public CFX_Object

+{

+protected:

+

+    struct DataList {

+

+        FX_INT32	start;

+

+        FX_INT32	count;

+        FX_LPBYTE	data;

+    };

+public:

+

+    CFX_SortListArray(IFX_Allocator* pAllocator = NULL) : m_CurList(0), m_DataLists(pAllocator) {}

+

+    ~CFX_SortListArray()

+    {

+        Clear();

+    }

+

+

+    void			Clear()

+    {

+        IFX_Allocator* pAllocator = m_DataLists.m_pAllocator;

+        for (FX_INT32 i = m_DataLists.GetUpperBound(); i >= 0; i--) {

+            DataList list = m_DataLists.ElementAt(i);

+            if (list.data) {

+                FX_Allocator_Free(pAllocator, list.data);

+            }

+        }

+        m_DataLists.RemoveAll();

+        m_CurList = 0;

+    }

+

+    void			Append(FX_INT32 nStart, FX_INT32 nCount)

+    {

+        if (nStart < 0) {

+            return;

+        }

+        IFX_Allocator* pAllocator = m_DataLists.m_pAllocator;

+        while (nCount > 0) {

+            FX_INT32 temp_count = FX_MIN(nCount, FX_DATALIST_LENGTH);

+            DataList list;

+            list.data = FX_Allocator_Alloc(pAllocator, FX_BYTE, temp_count * unit);

+            if (!list.data) {

+                break;

+            }

+            FXSYS_memset32(list.data, 0, temp_count * unit);

+            list.start = nStart;

+            list.count = temp_count;

+            Append(list);

+            nCount -= temp_count;

+            nStart += temp_count;

+        }

+    }

+

+    FX_LPBYTE		GetAt(FX_INT32 nIndex)

+    {

+        if (nIndex < 0) {

+            return NULL;

+        }

+        if (m_CurList < 0 || m_CurList >= m_DataLists.GetSize()) {

+            return NULL;

+        }

+        DataList *pCurList = m_DataLists.GetDataPtr(m_CurList);

+        if (!pCurList || nIndex < pCurList->start || nIndex >= pCurList->start + pCurList->count) {

+            pCurList = NULL;

+            FX_INT32 iStart = 0;

+            FX_INT32 iEnd = m_DataLists.GetUpperBound();

+            FX_INT32 iMid = 0;

+            while (iStart <= iEnd) {

+                iMid = (iStart + iEnd) / 2;

+                DataList* list = m_DataLists.GetDataPtr(iMid);

+                if (nIndex < list->start) {

+                    iEnd = iMid - 1;

+                } else if (nIndex >= list->start + list->count) {

+                    iStart = iMid + 1;

+                } else {

+                    pCurList = list;

+                    m_CurList = iMid;

+                    break;

+                }

+            }

+        }

+        return pCurList ? pCurList->data + (nIndex - pCurList->start) * unit : NULL;

+    }

+protected:

+    void			Append(const DataList& list)

+    {

+        FX_INT32 iStart = 0;

+        FX_INT32 iEnd = m_DataLists.GetUpperBound();

+        FX_INT32 iFind = 0;

+        while (iStart <= iEnd) {

+            FX_INT32 iMid = (iStart + iEnd) / 2;

+            DataList* cur_list = m_DataLists.GetDataPtr(iMid);

+            if (list.start < cur_list->start + cur_list->count) {

+                iEnd = iMid - 1;

+            } else {

+                if (iMid == iEnd) {

+                    iFind = iMid + 1;

+                    break;

+                }

+                DataList* next_list = m_DataLists.GetDataPtr(iMid + 1);

+                if (list.start < next_list->start) {

+                    iFind = iMid + 1;

+                    break;

+                } else {

+                    iStart = iMid + 1;

+                }

+            }

+        }

+        m_DataLists.InsertAt(iFind, list);

+    }

+    FX_INT32		m_CurList;

+    CFX_ArrayTemplate<DataList>	m_DataLists;

+};

+template<typename T1, typename T2>

+class CFX_ListArrayTemplate : public CFX_Object

+{

+public:

+

+    void			Clear()

+    {

+        m_Data.Clear();

+    }

+

+    void			Add(FX_INT32 nStart, FX_INT32 nCount)

+    {

+        m_Data.Append(nStart, nCount);

+    }

+

+    T2&				operator [] (FX_INT32 nIndex)

+    {

+        FX_LPBYTE data = m_Data.GetAt(nIndex);

+        FXSYS_assert(data != NULL);

+        return (T2&)(*(volatile T2*)data);

+    }

+

+    T2*				GetPtrAt(FX_INT32 nIndex)

+    {

+        return (T2*)m_Data.GetAt(nIndex);

+    }

+protected:

+    T1			m_Data;

+};

+typedef CFX_ListArrayTemplate<CFX_SortListArray<sizeof(FX_FILESIZE)>, FX_FILESIZE>	CFX_FileSizeListArray;

+typedef CFX_ListArrayTemplate<CFX_SortListArray<sizeof(FX_DWORD)>, FX_DWORD>		CFX_DWordListArray;

+typedef enum {

+    Ready,

+    ToBeContinued,

+    Found,

+    NotFound,

+    Failed,

+    Done

+} FX_ProgressiveStatus;

+#define ProgressiveStatus	FX_ProgressiveStatus

+#define FX_NAMESPACE_DECLARE(namespace, type)       namespace::type

+#endif

diff --git a/core/include/fxcrt/fx_coordinates.h b/core/include/fxcrt/fx_coordinates.h
new file mode 100644
index 0000000..eee0dfb
--- /dev/null
+++ b/core/include/fxcrt/fx_coordinates.h
@@ -0,0 +1,900 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FXCRT_COORDINATES_

+#define _FXCRT_COORDINATES_

+template<class baseType> class CFX_PSVTemplate;

+template<class baseType> class CFX_VTemplate;

+template<class baseType> class CFX_PRLTemplate;

+template<class baseType> class CFX_RTemplate;

+template<class baseType> class CFX_ETemplate;

+template<class baseType> class CFX_ATemplate;

+template<class baseType> class CFX_RRTemplate;

+class CFX_Matrix;

+template<class baseType>

+class CFX_PSVTemplate : public CFX_Object

+{

+public:

+    typedef CFX_PSVTemplate<baseType>	FXT_PSV;

+    typedef CFX_PSVTemplate<baseType>	FXT_POINT;

+    typedef CFX_PSVTemplate<baseType>	FXT_SIZE;

+    void		Set(baseType x, baseType y)

+    {

+        FXT_PSV::x = x, FXT_PSV::y = y;

+    }

+    void		Set(const FXT_PSV &psv)

+    {

+        FXT_PSV::x = psv.x, FXT_PSV::y = psv.y;

+    }

+    void		Add(baseType x, baseType y)

+    {

+        FXT_PSV::x += x, FXT_PSV::y += y;

+    }

+    void		Subtract(baseType x, baseType y)

+    {

+        FXT_PSV::x -= x, FXT_PSV::y -= y;

+    }

+    void		Reset()

+    {

+        FXT_PSV::x = FXT_PSV::y = 0;

+    }

+    FXT_PSV&	operator += (const FXT_PSV &obj)

+    {

+        x += obj.x;

+        y += obj.y;

+        return *this;

+    }

+    FXT_PSV&	operator -= (const FXT_PSV &obj)

+    {

+        x -= obj.x;

+        y -= obj.y;

+        return *this;

+    }

+    FXT_PSV&	operator *= (baseType lamda)

+    {

+        x *= lamda;

+        y *= lamda;

+        return *this;

+    }

+    FXT_PSV&	operator /= (baseType lamda)

+    {

+        x /= lamda;

+        y /= lamda;

+        return *this;

+    }

+    friend	FX_BOOL		operator == (const FXT_PSV &obj1, const FXT_PSV &obj2)

+    {

+        return obj1.x == obj2.x && obj1.y == obj2.y;

+    }

+    friend	FX_BOOL		operator != (const FXT_PSV &obj1, const FXT_PSV &obj2)

+    {

+        return obj1.x != obj2.x || obj1.y != obj2.y;

+    }

+    friend	FXT_PSV		operator + (const FXT_PSV &obj1, const FXT_PSV &obj2)

+    {

+        CFX_PSVTemplate obj;

+        obj.x = obj1.x + obj2.x;

+        obj.y = obj1.y + obj2.y;

+        return obj;

+    }

+    friend	FXT_PSV		operator - (const FXT_PSV &obj1, const FXT_PSV &obj2)

+    {

+        CFX_PSVTemplate obj;

+        obj.x = obj1.x - obj2.x;

+        obj.y = obj1.y - obj2.y;

+        return obj;

+    }

+    friend	FXT_PSV		operator * (const FXT_PSV &obj, baseType lamda)

+    {

+        CFX_PSVTemplate t;

+        t.x = obj.x * lamda;

+        t.y = obj.y * lamda;

+        return t;

+    }

+    friend	FXT_PSV		operator * (baseType lamda, const FXT_PSV &obj)

+    {

+        CFX_PSVTemplate t;

+        t.x = lamda * obj.x;

+        t.y = lamda * obj.y;

+        return t;

+    }

+    friend	FXT_PSV		operator / (const FXT_PSV &obj, baseType lamda)

+    {

+        CFX_PSVTemplate t;

+        t.x = obj.x / lamda;

+        t.y = obj.y / lamda;

+        return t;

+    }

+    baseType x, y;

+};

+typedef CFX_PSVTemplate<FX_INT32>			CFX_Point;

+typedef CFX_PSVTemplate<FX_FLOAT>			CFX_PointF;

+typedef CFX_PSVTemplate<FX_INT32>			CFX_Size;

+typedef CFX_PSVTemplate<FX_FLOAT>			CFX_SizeF;

+typedef CFX_ArrayTemplate<CFX_Point>		CFX_Points;

+typedef CFX_ArrayTemplate<CFX_PointF>		CFX_PointsF;

+typedef CFX_PSVTemplate<FX_INT32> *			FX_LPPOINT;

+typedef CFX_PSVTemplate<FX_FLOAT> *			FX_LPPOINTF;

+typedef CFX_PSVTemplate<FX_INT32> const *	FX_LPCPOINT;

+typedef CFX_PSVTemplate<FX_FLOAT> const *	FX_LPCPOINTF;

+#define CFX_FloatPoint	CFX_PointF

+template<class baseType>

+class CFX_VTemplate: public CFX_PSVTemplate<baseType>

+{

+public:

+    typedef CFX_PSVTemplate<baseType>	FXT_PSV;

+    typedef CFX_PSVTemplate<baseType>	FXT_POINT;

+    typedef CFX_PSVTemplate<baseType>	FXT_SIZE;

+    typedef CFX_VTemplate<baseType>		FXT_VECTOR;

+    void		Set(baseType x, baseType y)

+    {

+        FXT_PSV::x = x, FXT_PSV::y = y;

+    }

+    void		Set(const FXT_PSV &psv)

+    {

+        FXT_PSV::x = psv.x, FXT_PSV::y = psv.y;

+    }

+    void		Set(const FXT_POINT &p1, const FXT_POINT &p2)

+    {

+        FXT_PSV::x = p2.x - p1.x, FXT_PSV::y = p2.y - p1.y;

+    }

+    void		Reset()

+    {

+        FXT_PSV::x = FXT_PSV::y = 0;

+    }

+    baseType	SquareLength() const

+    {

+        return FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y;

+    }

+    baseType	Length() const

+    {

+        return FXSYS_sqrt(FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y);

+    }

+    void		Normalize()

+    {

+        FX_FLOAT fLen = FXSYS_sqrt(FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y);

+        FXSYS_assert(fLen >= 0.0001f);

+        FXT_PSV::x = ((baseType)FXT_PSV::x) / fLen;

+        FXT_PSV::y = ((baseType)FXT_PSV::y) / fLen;

+    }

+    baseType	DotProduct(baseType x, baseType y) const

+    {

+        return FXT_PSV::x * x + FXT_PSV::y * y;

+    }

+    baseType	DotProduct(const FXT_VECTOR &v) const

+    {

+        return FXT_PSV::x * v.x + FXT_PSV::y * v.y;

+    }

+    FX_BOOL		IsParallel(baseType x, baseType y) const

+    {

+        baseType t = FXT_PSV::x * y - FXT_PSV::y * x;

+        return FXSYS_fabs(t) < 0x0001f;

+    }

+    FX_BOOL		IsParallel(const FXT_VECTOR &v) const

+    {

+        return IsParallel(v.x, v.y);

+    }

+    FX_BOOL		IsPerpendicular(baseType x, baseType y) const

+    {

+        baseType t = DotProduct(x, y);

+        return FXSYS_fabs(t) < 0x0001f;

+    }

+    FX_BOOL		IsPerpendicular(const FXT_VECTOR &v) const

+    {

+        return IsPerpendicular(v.x, v.y);

+    }

+    void		Translate(baseType dx, baseType dy)

+    {

+        FXT_PSV::x += dx, FXT_PSV::y += dy;

+    }

+    void		Scale(baseType sx, baseType sy)

+    {

+        FXT_PSV::x *= sx, FXT_PSV::y *= sy;

+    }

+    void		Rotate(FX_FLOAT fRadian)

+    {

+        FX_FLOAT xx = (FX_FLOAT)FXT_PSV::x;

+        FX_FLOAT yy = (FX_FLOAT)FXT_PSV::y;

+        FX_FLOAT cosValue = FXSYS_cos(fRadian);

+        FX_FLOAT sinValue = FXSYS_sin(fRadian);

+        FXT_PSV::x = xx * cosValue - yy * sinValue;

+        FXT_PSV::y = xx * sinValue + yy * cosValue;

+    }

+    friend	FX_FLOAT	Cosine(const FXT_VECTOR &v1, const FXT_VECTOR &v2)

+    {

+        FXSYS_assert(v1.SquareLength() != 0 && v2.SquareLength() != 0);

+        FX_FLOAT dotProduct = v1.DotProduct(v2);

+        return dotProduct / (FX_FLOAT)FXSYS_sqrt(v1.SquareLength() * v2.SquareLength());

+    }

+    friend	FX_FLOAT	ArcCosine(const FXT_VECTOR &v1, const FXT_VECTOR &v2)

+    {

+        return (FX_FLOAT)FXSYS_acos(Cosine(v1, v2));

+    }

+    friend	FX_FLOAT	SlopeAngle(const FXT_VECTOR &v)

+    {

+        CFX_VTemplate vx;

+        vx.Set(1, 0);

+        FX_FLOAT fSlope = ArcCosine(v, vx);

+        return v.y < 0 ? -fSlope : fSlope;

+    }

+};

+typedef CFX_VTemplate<FX_INT32> CFX_Vector;

+typedef CFX_VTemplate<FX_FLOAT> CFX_VectorF;

+template<class baseType>

+class CFX_RTemplate: public CFX_Object

+{

+public:

+    typedef CFX_PSVTemplate<baseType>	FXT_POINT;

+    typedef CFX_PSVTemplate<baseType>	FXT_SIZE;

+    typedef CFX_VTemplate<baseType>		FXT_VECTOR;

+    typedef CFX_PRLTemplate<baseType>	FXT_PARAL;

+    typedef CFX_RTemplate<baseType>		FXT_RECT;

+    void		Set(baseType left, baseType top, baseType width, baseType height)

+    {

+        FXT_RECT::left = left, FXT_RECT::top = top, FXT_RECT::width = width, FXT_RECT::height = height;

+    }

+    void		Set(baseType left, baseType top, const FXT_SIZE &size)

+    {

+        FXT_RECT::left = left, FXT_RECT::top = top, FXT_RECT::Size(size);

+    }

+    void		Set(const FXT_POINT &p, baseType width, baseType height)

+    {

+        TopLeft(p), FXT_RECT::width = width, FXT_RECT::height = height;

+    }

+    void		Set(const FXT_POINT &p1, const FXT_POINT &p2)

+    {

+        TopLeft(p1), FXT_RECT::width = p2.x - p1.x, FXT_RECT::height = p2.y - p1.y, FXT_RECT::Normalize();

+    }

+    void		Set(const FXT_POINT &p, const FXT_VECTOR &v)

+    {

+        TopLeft(p), FXT_RECT::width = v.x, FXT_RECT::height = v.y, FXT_RECT::Normalize();

+    }

+    void		Reset()

+    {

+        FXT_RECT::left = FXT_RECT::top = FXT_RECT::width = FXT_RECT::height = 0;

+    }

+    FXT_RECT&	operator += (const FXT_POINT &p)

+    {

+        left += p.x, top += p.y;

+        return *this;

+    }

+    FXT_RECT&	operator -= (const FXT_POINT &p)

+    {

+        left -= p.x, top -= p.y;

+        return *this;

+    }

+    baseType	right() const

+    {

+        return left + width;

+    }

+    baseType	bottom() const

+    {

+        return top + height;

+    }

+    void		Normalize()

+    {

+        if (width < 0) {

+            left += width;

+            width = -width;

+        }

+        if (height < 0) {

+            top += height;

+            height = -height;

+        }

+    }

+    void		Offset(baseType dx, baseType dy)

+    {

+        left += dx;

+        top += dy;

+    }

+    void		Inflate(baseType x, baseType y)

+    {

+        left -= x;

+        width += x * 2;

+        top -= y;

+        height += y * 2;

+    }

+    void		Inflate(const FXT_POINT &p)

+    {

+        Inflate(p.x, p.y);

+    }

+    void		Inflate(baseType left, baseType top, baseType right, baseType bottom)

+    {

+        FXT_RECT::left -= left;

+        FXT_RECT::top -= top;

+        FXT_RECT::width += left + right;

+        FXT_RECT::height += top + bottom;

+    }

+    void		Inflate(const FXT_RECT &rt)

+    {

+        Inflate(rt.left, rt.top, rt.left + rt.width, rt.top + rt.height);

+    }

+    void		Deflate(baseType x, baseType y)

+    {

+        left += x;

+        width -= x * 2;

+        top += y;

+        height -= y * 2;

+    }

+    void		Deflate(const FXT_POINT &p)

+    {

+        Deflate(p.x, p.y);

+    }

+    void		Deflate(baseType left, baseType top, baseType right, baseType bottom)

+    {

+        FXT_RECT::left += left;

+        FXT_RECT::top += top;

+        FXT_RECT::width -= left + right;

+        FXT_RECT::height -= top + bottom;

+    }

+    void		Deflate(const FXT_RECT &rt)

+    {

+        Deflate(rt.left, rt.top, rt.top + rt.width, rt.top + rt.height);

+    }

+    FX_BOOL		IsEmpty() const

+    {

+        return width <= 0 || height <= 0;

+    }

+    FX_BOOL		IsEmpty(FX_FLOAT fEpsilon) const

+    {

+        return width <= fEpsilon || height <= fEpsilon;

+    }

+    void		Empty()

+    {

+        width = height = 0;

+    }

+    FX_BOOL		Contains(baseType x, baseType y) const

+    {

+        return x >= left && x < left + width && y >= top && y < top + height;

+    }

+    FX_BOOL		Contains(const FXT_POINT &p) const

+    {

+        return Contains(p.x, p.y);

+    }

+    FX_BOOL		Contains(const FXT_RECT &rt) const

+    {

+        return rt.left >= left && rt.right() <= right() && rt.top >= top && rt.bottom() <= bottom();

+    }

+    baseType	Width() const

+    {

+        return width;

+    }

+    baseType	Height() const

+    {

+        return height;

+    }

+    FXT_SIZE	Size() const

+    {

+        FXT_SIZE size;

+        size.Set(width, height);

+        return size;

+    }

+    void		Size(FXT_SIZE s)

+    {

+        width = s.x, height = s.y;

+    }

+    FXT_POINT	TopLeft() const

+    {

+        FXT_POINT p;

+        p.x = left;

+        p.y = top;

+        return p;

+    }

+    FXT_POINT	TopRight() const

+    {

+        FXT_POINT p;

+        p.x = left + width;

+        p.y = top;

+        return p;

+    }

+    FXT_POINT	BottomLeft() const

+    {

+        FXT_POINT p;

+        p.x = left;

+        p.y = top + height;

+        return p;

+    }

+    FXT_POINT	BottomRight() const

+    {

+        FXT_POINT p;

+        p.x = left + width;

+        p.y = top + height;

+        return p;

+    }

+    void		TopLeft(FXT_POINT tl)

+    {

+        left = tl.x;

+        top = tl.y;

+    }

+    void		TopRight(FXT_POINT tr)

+    {

+        width = tr.x - left;

+        top = tr.y;

+    }

+    void		BottomLeft(FXT_POINT bl)

+    {

+        left = bl.x;

+        height = bl.y - top;

+    }

+    void		BottomRight(FXT_POINT br)

+    {

+        width = br.x - left;

+        height = br.y - top;

+    }

+    FXT_POINT	Center() const

+    {

+        FXT_POINT p;

+        p.x = left + width / 2;

+        p.y = top + height / 2;

+        return p;

+    }

+    void		GetParallelogram(FXT_PARAL &pg) const

+    {

+        pg.x = left, pg.y = top;

+        pg.x1 = width, pg.y1 = 0;

+        pg.x2 = 0, pg.y2 = height;

+    }

+    void		Union(baseType x, baseType y)

+    {

+        baseType r = right(), b = bottom();

+        if (left > x) {

+            left = x;

+        }

+        if (r < x) {

+            r = x;

+        }

+        if (top > y) {

+            top = y;

+        }

+        if (b < y) {

+            b = y;

+        }

+        width = r - left;

+        height = b - top;

+    }

+    void		Union(const FXT_POINT &p)

+    {

+        Union(p.x, p.y);

+    }

+    void		Union(const FXT_RECT &rt)

+    {

+        baseType r = right(), b = bottom();

+        if (left > rt.left) {

+            left = rt.left;

+        }

+        if (r < rt.right()) {

+            r = rt.right();

+        }

+        if (top > rt.top) {

+            top = rt.top;

+        }

+        if (b < rt.bottom()) {

+            b = rt.bottom();

+        }

+        width = r - left;

+        height = b - top;

+    }

+    void		Intersect(const FXT_RECT &rt)

+    {

+        baseType r = right(), b = bottom();

+        if (left < rt.left) {

+            left = rt.left;

+        }

+        if (r > rt.right()) {

+            r = rt.right();

+        }

+        if (top < rt.top) {

+            top = rt.top;

+        }

+        if (b > rt.bottom()) {

+            b = rt.bottom();

+        }

+        width = r - left;

+        height = b - top;

+    }

+    FX_BOOL		IntersectWith(const FXT_RECT &rt) const

+    {

+        FXT_RECT rect = rt;

+        rect.Intersect(*this);

+        return !rect.IsEmpty();

+    }

+    FX_BOOL		IntersectWith(const FXT_RECT &rt, FX_FLOAT fEpsilon) const

+    {

+        FXT_RECT rect = rt;

+        rect.Intersect(*this);

+        return !rect.IsEmpty(fEpsilon);

+    }

+    friend	FX_BOOL	operator == (const FXT_RECT &rc1, const FXT_RECT &rc2)

+    {

+        return rc1.left == rc2.left && rc1.top == rc2.top && rc1.width == rc2.width && rc1.height == rc2.height;

+    }

+    friend	FX_BOOL	operator != (const FXT_RECT &rc1, const FXT_RECT &rc2)

+    {

+        return rc1.left != rc2.left || rc1.top != rc2.top || rc1.width != rc2.width || rc1.height != rc2.height;

+    }

+    baseType left, top;

+    baseType width, height;

+};

+typedef CFX_RTemplate<FX_INT32>			CFX_Rect;

+typedef CFX_RTemplate<FX_FLOAT>			CFX_RectF;

+typedef CFX_RTemplate<FX_INT32> *		FX_LPRECT;

+typedef CFX_RTemplate<FX_FLOAT> *		FX_LPRECTF;

+typedef CFX_RTemplate<FX_INT32> const *	FX_LPCRECT;

+typedef CFX_RTemplate<FX_FLOAT> const *	FX_LPCRECTF;

+typedef CFX_ArrayTemplate<CFX_RectF>	CFX_RectFArray;

+struct FX_RECT {

+

+    int			left;

+

+    int			top;

+

+    int			right;

+

+    int			bottom;

+

+    FX_RECT() {}

+

+    FX_RECT(int left1, int top1, int right1, int bottom1)

+    {

+        left = left1;

+        top = top1;

+        right = right1;

+        bottom = bottom1;

+    }

+

+    int			Width() const

+    {

+        return right - left;

+    }

+

+    int			Height() const

+    {

+        return bottom - top;

+    }

+

+    FX_BOOL		IsEmpty() const

+    {

+        return right <= left || bottom <= top;

+    }

+

+    void		Normalize();

+

+    void		Intersect(const FX_RECT& src);

+

+    void		Intersect(int left1, int top1, int right1, int bottom1)

+    {

+        Intersect(FX_RECT(left1, top1, right1, bottom1));

+    }

+

+    void		Union(const FX_RECT& other_rect);

+

+    FX_BOOL		operator == (const FX_RECT& src) const

+    {

+        return left == src.left && right == src.right && top == src.top && bottom == src.bottom;

+    }

+

+    void		Offset(int dx, int dy)

+    {

+        left += dx;

+        right += dx;

+        top += dy;

+        bottom += dy;

+    }

+

+    FX_BOOL		Contains(const FX_RECT& other_rect) const

+    {

+        return other_rect.left >= left && other_rect.right <= right && other_rect.top >= top && other_rect.bottom <= bottom;

+    }

+

+    FX_BOOL		Contains(int x, int y) const

+    {

+        return x >= left && x < right && y >= top && y < bottom;

+    }

+};

+struct FX_SMALL_RECT {

+

+    FX_SHORT	Left;

+

+    FX_SHORT	Top;

+

+    FX_SHORT	Right;

+

+    FX_SHORT	Bottom;

+};

+class CFX_FloatRect : public CFX_Object

+{

+public:

+

+    CFX_FloatRect()

+    {

+        left = right = bottom = top = 0;

+    }

+

+    CFX_FloatRect(FX_FLOAT left1, FX_FLOAT bottom1, FX_FLOAT right1, FX_FLOAT top1)

+    {

+        left = left1;

+        bottom = bottom1;

+        right = right1;

+        top = top1;

+    }

+

+    CFX_FloatRect(const FX_FLOAT* pArray)

+    {

+        left = pArray[0];

+        bottom = pArray[1];

+        right = pArray[2];

+        top = pArray[3];

+    }

+

+    CFX_FloatRect(const FX_RECT& rect);

+

+    FX_BOOL				IsEmpty() const

+    {

+        return left >= right || bottom >= top;

+    }

+

+    void				Normalize();

+

+    void				Reset()

+    {

+        left = right = bottom = top = 0;

+    }

+

+    FX_BOOL				Contains(const CFX_FloatRect& other_rect) const;

+

+    FX_BOOL				Contains(FX_FLOAT x, FX_FLOAT y) const;

+

+    void				Transform(const CFX_Matrix* pMatrix);

+

+    void				Intersect(const CFX_FloatRect& other_rect);

+

+    void				Union(const CFX_FloatRect& other_rect);

+

+    FX_RECT				GetInnerRect() const;

+

+    FX_RECT				GetOutterRect() const;

+

+    FX_RECT				GetClosestRect() const;

+

+    int					Substract4(CFX_FloatRect& substract_rect, CFX_FloatRect* pRects);

+

+    void				InitRect(FX_FLOAT x, FX_FLOAT y)

+    {

+        left = right = x;

+        bottom = top = y;

+    }

+

+    void				UpdateRect(FX_FLOAT x, FX_FLOAT y);

+

+    FX_FLOAT			Width() const

+    {

+        return right - left;

+    }

+

+    FX_FLOAT			Height() const

+    {

+        return top - bottom;

+    }

+

+    void				Inflate(FX_FLOAT x, FX_FLOAT y)

+    {

+        Normalize();

+        left -= x;

+        right += x;

+        bottom -= y;

+        top += y;

+    }

+

+    void				Inflate(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)

+    {

+        Normalize();

+        this->left -= left;

+        this->bottom -= bottom;

+        this->right += right;

+        this->top += top;

+    }

+

+    void				Inflate(const CFX_FloatRect &rt)

+    {

+        Inflate(rt.left, rt.bottom, rt.right, rt.top);

+    }

+

+    void				Deflate(FX_FLOAT x, FX_FLOAT y)

+    {

+        Normalize();

+        left += x;

+        right -= x;

+        bottom += y;

+        top -= y;

+    }

+

+    void				Deflate(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)

+    {

+        Normalize();

+        this->left += left;

+        this->bottom += bottom;

+        this->right -= right;

+        this->top -= top;

+    }

+

+    void				Deflate(const CFX_FloatRect &rt)

+    {

+        Deflate(rt.left, rt.bottom, rt.right, rt.top);

+    }

+

+    void				Translate(FX_FLOAT e, FX_FLOAT f)

+    {

+        left += e;

+        right += e;

+        top += f;

+        bottom += f;

+    }

+

+    static CFX_FloatRect	GetBBox(const CFX_FloatPoint* pPoints, int nPoints);

+

+    FX_FLOAT			left;

+

+    FX_FLOAT			right;

+

+    FX_FLOAT			bottom;

+

+    FX_FLOAT			top;

+};

+class CFX_Matrix : public CFX_Object

+{

+public:

+

+    CFX_Matrix()

+    {

+        a = d = 1;

+        b = c = e = f = 0;

+    }

+

+    CFX_Matrix(FX_FLOAT a1, FX_FLOAT b1, FX_FLOAT c1, FX_FLOAT d1, FX_FLOAT e1, FX_FLOAT f1)

+    {

+        a = a1;

+        b = b1;

+        c = c1;

+        d = d1;

+        e = e1;

+        f = f1;

+    }

+

+    void			Set(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f);

+    void			Set(const FX_FLOAT n[6]);

+

+    void			SetIdentity()

+    {

+        a = d = 1;

+        b = c = e = f = 0;

+    }

+

+    void			SetReverse(const CFX_Matrix &m);

+

+    void			Concat(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, FX_BOOL bPrepended = FALSE);

+

+    void			Concat(const CFX_Matrix &m, FX_BOOL bPrepended = FALSE);

+

+    void			ConcatInverse(const CFX_Matrix& m, FX_BOOL bPrepended = FALSE);

+    void			Reset()

+    {

+        SetIdentity();

+    }

+

+    void			Copy(const CFX_Matrix& m)

+    {

+        *this = m;

+    }

+

+    FX_BOOL			IsIdentity() const

+    {

+        return a == 1 && b == 0 && c == 0 && d == 1 && e == 0 && f == 0;

+    }

+    FX_BOOL			IsInvertible() const;

+

+    FX_BOOL			Is90Rotated() const;

+

+    FX_BOOL			IsScaled() const;

+

+    void			Translate(FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended = FALSE);

+

+    void			TranslateI(FX_INT32 x, FX_INT32 y, FX_BOOL bPrepended = FALSE)

+    {

+        Translate((FX_FLOAT)x, (FX_FLOAT)y, bPrepended);

+    }

+

+    void			Scale(FX_FLOAT sx, FX_FLOAT sy, FX_BOOL bPrepended = FALSE);

+

+    void			Rotate(FX_FLOAT fRadian, FX_BOOL bPrepended = FALSE);

+

+    void			RotateAt(FX_FLOAT fRadian, FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended = FALSE);

+

+    void			Shear(FX_FLOAT fAlphaRadian, FX_FLOAT fBetaRadian, FX_BOOL bPrepended = FALSE);

+

+    void			MatchRect(const CFX_FloatRect &dest, const CFX_FloatRect &src);

+

+    FX_FLOAT		GetXUnit() const;

+

+    FX_FLOAT		GetYUnit() const;

+    void			GetUnitRect(CFX_RectF &rect) const;

+

+    CFX_FloatRect	GetUnitRect() const;

+

+    FX_FLOAT		GetUnitArea() const;

+    FX_FLOAT		TransformXDistance(FX_FLOAT dx) const;

+    FX_INT32		TransformXDistance(FX_INT32 dx) const;

+    FX_FLOAT		TransformYDistance(FX_FLOAT dy) const;

+    FX_INT32		TransformYDistance(FX_INT32 dy) const;

+    FX_FLOAT		TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const;

+    FX_INT32		TransformDistance(FX_INT32 dx, FX_INT32 dy) const;

+

+    FX_FLOAT		TransformDistance(FX_FLOAT distance) const;

+    void			TransformPoint(FX_FLOAT &x, FX_FLOAT &y) const;

+    void			TransformPoint(FX_INT32 &x, FX_INT32 &y) const;

+    void			TransformPoints(CFX_PointF *points, FX_INT32 iCount) const;

+    void			TransformPoints(CFX_Point *points, FX_INT32 iCount) const;

+

+    void			Transform(FX_FLOAT& x, FX_FLOAT& y) const

+    {

+        TransformPoint(x, y);

+    }

+

+    void			Transform(FX_FLOAT x, FX_FLOAT y, FX_FLOAT& x1, FX_FLOAT& y1) const

+    {

+        x1 = x, y1 = y;

+        TransformPoint(x1, y1);

+    }

+    void			TransformVector(CFX_VectorF &v) const;

+    void			TransformVector(CFX_Vector &v) const;

+    void			TransformRect(CFX_RectF &rect) const;

+    void			TransformRect(CFX_Rect &rect) const;

+

+    void			TransformRect(FX_FLOAT& left, FX_FLOAT& right, FX_FLOAT& top, FX_FLOAT& bottom) const;

+

+    void			TransformRect(CFX_FloatRect& rect) const

+    {

+        TransformRect(rect.left, rect.right, rect.top, rect.bottom);

+    }

+

+    FX_FLOAT		GetA() const

+    {

+        return a;

+    }

+

+    FX_FLOAT		GetB() const

+    {

+        return b;

+    }

+

+    FX_FLOAT		GetC() const

+    {

+        return c;

+    }

+

+    FX_FLOAT		GetD() const

+    {

+        return d;

+    }

+

+    FX_FLOAT		GetE() const

+    {

+        return e;

+    }

+

+    FX_FLOAT		GetF() const

+    {

+        return f;

+    }

+public:

+    FX_FLOAT a;

+    FX_FLOAT b;

+    FX_FLOAT c;

+    FX_FLOAT d;

+    FX_FLOAT e;

+    FX_FLOAT f;

+};

+#define CFX_AffineMatrix	CFX_Matrix

+#endif

diff --git a/core/include/fxcrt/fx_ext.h b/core/include/fxcrt/fx_ext.h
new file mode 100644
index 0000000..7fdbfcd
--- /dev/null
+++ b/core/include/fxcrt/fx_ext.h
@@ -0,0 +1,103 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FXCRT_EXTENSION_

+#define _FXCRT_EXTENSION_

+#ifndef _FX_BASIC_H_

+#include "fx_basic.h"

+#endif

+#ifndef _FXCRT_COORDINATES_

+#include "fx_coordinates.h"

+#endif

+#ifndef _FX_XML_H_

+#include "fx_xml.h"

+#endif

+#ifndef _FX_UNICODE_

+#include "fx_ucd.h"

+#endif

+#ifndef _FX_ARABIC_

+#include "fx_arb.h"

+#endif

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+

+FX_FLOAT		FXSYS_tan(FX_FLOAT a);

+FX_FLOAT		FXSYS_logb(FX_FLOAT b, FX_FLOAT x);

+FX_FLOAT		FXSYS_strtof(FX_LPCSTR pcsStr, FX_INT32 iLength = -1, FX_INT32 *pUsedLen = NULL);

+FX_FLOAT		FXSYS_wcstof(FX_LPCWSTR pwsStr, FX_INT32 iLength = -1, FX_INT32 *pUsedLen = NULL);

+FX_LPWSTR		FXSYS_wcsncpy(FX_LPWSTR dstStr, FX_LPCWSTR srcStr, size_t count);

+FX_INT32		FXSYS_wcsnicmp(FX_LPCWSTR s1, FX_LPCWSTR s2, size_t count);

+FX_INT32		FXSYS_strnicmp(FX_LPCSTR s1, FX_LPCSTR s2, size_t count);

+inline FX_BOOL	FXSYS_islower(FX_INT32 ch)

+{

+    return ch >= 'a' && ch <= 'z';

+}

+inline FX_BOOL	FXSYS_isupper(FX_INT32 ch)

+{

+    return ch >= 'A' && ch <= 'Z';

+}

+inline FX_INT32	FXSYS_tolower(FX_INT32 ch)

+{

+    return ch < 'A' || ch > 'Z' ? ch : (ch + 0x20);

+}

+inline FX_INT32 FXSYS_toupper(FX_INT32 ch)

+{

+    return ch < 'a' || ch > 'z' ? ch : (ch - 0x20);

+}

+

+

+

+FX_DWORD	FX_HashCode_String_GetA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase = FALSE);

+FX_DWORD	FX_HashCode_String_GetW(FX_LPCWSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase = FALSE);

+

+#ifdef __cplusplus

+}

+#endif

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+FX_LPVOID	FX_Random_MT_Start(FX_DWORD dwSeed);

+

+FX_DWORD	FX_Random_MT_Generate(FX_LPVOID pContext);

+

+void		FX_Random_MT_Close(FX_LPVOID pContext);

+

+void		FX_Random_GenerateBase(FX_LPDWORD pBuffer, FX_INT32 iCount);

+

+void		FX_Random_GenerateMT(FX_LPDWORD pBuffer, FX_INT32 iCount);

+

+void		FX_Random_GenerateCrypto(FX_LPDWORD pBuffer, FX_INT32 iCount);

+#ifdef __cplusplus

+}

+#endif

+template<class baseType>

+class CFX_SSortTemplate

+{

+public:

+    void ShellSort(baseType *pArray, FX_INT32 iCount)

+    {

+        FXSYS_assert(pArray != NULL && iCount > 0);

+        FX_INT32 i, j, gap;

+        baseType v1, v2;

+        gap = iCount >> 1;

+        while (gap > 0) {

+            for (i = gap; i < iCount; i ++) {

+                j = i - gap;

+                v1 = pArray[i];

+                while (j > -1 && (v2 = pArray[j]) > v1) {

+                    pArray[j + gap] = v2;

+                    j -= gap;

+                }

+                pArray[j + gap] = v1;

+            }

+            gap >>= 1;

+        }

+    }

+};

+#endif

diff --git a/core/include/fxcrt/fx_memory.h b/core/include/fxcrt/fx_memory.h
new file mode 100644
index 0000000..b0c94c4
--- /dev/null
+++ b/core/include/fxcrt/fx_memory.h
@@ -0,0 +1,300 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_MEMORY_H_

+#define _FX_MEMORY_H_

+#ifndef _FX_SYSTEM_H_

+#include "fx_system.h"

+#endif

+#define FXMEM_NONLEAVE			1

+#define FXMEM_MOVABLE			2

+#define FXMEM_DISCARDABLE		4

+#ifdef __cplusplus

+extern "C" {

+#endif

+typedef struct _FXMEM_SystemMgr {

+

+    void* (*Alloc)(struct _FXMEM_SystemMgr* pMgr, size_t size, int flags);

+

+    void* (*AllocDebug)(struct _FXMEM_SystemMgr* pMgr, size_t size, int flags, FX_LPCSTR file, int line);

+

+    void* (*Realloc)(struct _FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags);

+

+    void* (*ReallocDebug)(struct _FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags, FX_LPCSTR file, int line);

+

+    void* (*Lock)(struct _FXMEM_SystemMgr* pMgr, void* handle);

+

+    void  (*Unlock)(struct _FXMEM_SystemMgr* pMgr, void* handle);

+

+    void  (*Free)(struct _FXMEM_SystemMgr* pMgr, void* pointer, int flags);

+

+    void  (*Purge)(struct _FXMEM_SystemMgr* pMgr);

+

+    void  (*CollectAll)(struct _FXMEM_SystemMgr* pMgr);

+

+

+    void* user;

+} FXMEM_SystemMgr;

+FX_DEFINEHANDLE(FXMEM_FoxitMgr)

+typedef struct _FXMEM_SystemMgr2 {

+

+    FX_BOOL	(*More)(struct _FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size);

+

+    void	(*Free)(struct _FXMEM_SystemMgr2* pMgr, void* memory);

+} FXMEM_SystemMgr2;

+FXMEM_FoxitMgr* FXMEM_CreateMemoryMgr(size_t size, FX_BOOL extensible);

+void	FXMEM_DestroyFoxitMgr(FXMEM_FoxitMgr* pFoxitMgr);

+void*	FXMEM_DefaultAlloc(size_t byte_size, int flags);

+void*	FXMEM_DefaultAlloc2(size_t units, size_t unit_size, int flags);

+void*	FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags);

+void*	FXMEM_DefaultRealloc2(void* pointer, size_t units, size_t unit_size, int flags);

+void	FXMEM_DefaultFree(void* pointer, int flags);

+#define FX_Alloc(type, size)			(type*)FXMEM_DefaultAlloc2(size, sizeof(type), 0)

+#define FX_Realloc(type, ptr, size)		(type*)FXMEM_DefaultRealloc2(ptr, size, sizeof(type), 0)

+#define FX_AllocNL(type, size)			(type*)FXMEM_DefaultAlloc2(size, sizeof(type), FXMEM_NONLEAVE)

+#define FX_ReallocNL(type, ptr, size)	(type*)FXMEM_DefaultRealloc2(ptr, size, sizeof(type), FXMEM_NONLEAVE)

+#define FX_Free(pointer) FXMEM_DefaultFree(pointer, 0)

+#ifdef __cplusplus

+}

+#endif

+#ifdef __cplusplus

+#if defined(_DEBUG)

+#define FX_NEW new(__FILE__, __LINE__)

+#else

+

+#define FX_NEW new

+#endif

+class CFX_Object

+{

+public:

+

+    void*			operator new (size_t size, FX_LPCSTR file, int line);

+

+    void			operator delete (void* p, FX_LPCSTR file, int line);

+

+    void*			operator new (size_t size);

+

+    void			operator delete (void* p);

+

+    void*			operator new[] (size_t size, FX_LPCSTR file, int line);

+

+    void			operator delete[] (void* p, FX_LPCSTR file, int line);

+

+    void*			operator new[] (size_t size);

+

+    void			operator delete[] (void* p);

+

+    void*			operator new (size_t, void* buf)

+    {

+        return buf;

+    }

+

+    void			operator delete (void*, void*) {}

+};

+#define FX_NEW_VECTOR(Pointer, Class, Count) \

+    { \

+        Pointer = FX_Alloc(Class, Count); \

+        if (Pointer) { \

+            for (int i = 0; i < (Count); i ++) new (Pointer + i) Class; \

+        } \

+    }

+#define FX_DELETE_VECTOR(Pointer, Class, Count) \

+    { \

+        for (int i = 0; i < (Count); i ++) Pointer[i].~Class(); \

+        FX_Free(Pointer); \

+    }

+class CFX_DestructObject : public CFX_Object

+{

+public:

+

+    virtual ~CFX_DestructObject() {}

+};

+#ifdef __cplusplus

+extern "C" {

+#endif

+typedef struct _IFX_Allocator {

+

+    void*	(*m_AllocDebug)(struct _IFX_Allocator* pAllocator, size_t size, FX_LPCSTR file, int line);

+

+    void*	(*m_Alloc)(struct _IFX_Allocator* pAllocator, size_t size);

+

+    void*	(*m_ReallocDebug)(struct _IFX_Allocator* pAllocator, void* p, size_t size, FX_LPCSTR file, int line);

+

+    void*	(*m_Realloc)(struct _IFX_Allocator* pAllocator, void* p, size_t size);

+

+    void	(*m_Free)(struct _IFX_Allocator* pAllocator, void* p);

+} IFX_Allocator;

+IFX_Allocator* FXMEM_GetDefAllocator();

+#ifdef __cplusplus

+}

+#endif

+#ifdef _DEBUG

+

+#define FX_Allocator_Alloc(fxAllocator, type, size) \

+    ((fxAllocator) ? (type*)(fxAllocator)->m_AllocDebug((fxAllocator), (size) * sizeof(type), __FILE__, __LINE__) : (FX_Alloc(type, size)))

+

+#define FX_Allocator_Realloc(fxAllocator, type, ptr, new_size) \

+    ((fxAllocator) ? (type*)(fxAllocator)->m_ReallocDebug((fxAllocator), (ptr), (new_size) * sizeof(type), __FILE__, __LINE__) : (FX_Realloc(type, ptr, new_size)))

+#else

+

+#define FX_Allocator_Alloc(fxAllocator, type, size) \

+    ((fxAllocator) ? (type*)(fxAllocator)->m_Alloc((fxAllocator), (size) * sizeof(type)) : (FX_Alloc(type, size)))

+

+#define FX_Allocator_Realloc(fxAllocator, type, ptr, new_size) \

+    ((fxAllocator) ? (type*)(fxAllocator)->m_Realloc((fxAllocator), (ptr), (new_size) * sizeof(type)) : (FX_Realloc(type, ptr, new_size)))

+#endif

+#define FX_Allocator_Free(fxAllocator, ptr) \

+    ((fxAllocator) ? (fxAllocator)->m_Free((fxAllocator), (ptr)) : (FX_Free(ptr)))

+inline void* operator new(size_t size, IFX_Allocator* fxAllocator)

+{

+    return (void*)FX_Allocator_Alloc(fxAllocator, FX_BYTE, size);

+}

+inline void operator delete(void* ptr, IFX_Allocator* fxAllocator)

+{

+}

+#define FX_NewAtAllocator(fxAllocator) \

+    ::new(fxAllocator)

+#define FX_DeleteAtAllocator(pointer, fxAllocator, __class__) \

+    (pointer)->~__class__(); \

+    FX_Allocator_Free(fxAllocator, pointer)

+class CFX_AllocObject

+{

+public:

+

+    void*			operator new (size_t size, IFX_Allocator* pAllocator, FX_LPCSTR file, int line);

+#ifndef _FX_NO_EXCEPTION_

+

+    void			operator delete (void* p, IFX_Allocator* pAllocator, FX_LPCSTR file, int line);

+#endif

+

+    void*			operator new (size_t size, IFX_Allocator* pAllocator);

+

+    void			operator delete (void* p);

+#ifndef _FX_NO_EXCEPTION_

+

+    void			operator delete (void* p, IFX_Allocator* pAllocator);

+#endif

+

+    void*			operator new (size_t, void* buf)

+    {

+        return buf;

+    }

+#ifndef _FX_NO_EXCEPTION_

+

+    void			operator delete (void*, void*) {}

+#endif

+

+    IFX_Allocator*	GetAllocator() const

+    {

+        return m_pAllocator;

+    }

+private:

+

+    void*			operator new[] (size_t size, IFX_Allocator* pAllocator, FX_LPCSTR file, int line)

+    {

+        return operator new(size, pAllocator, file, line);

+    }

+#ifndef _FX_NO_EXCEPTION_

+

+    void			operator delete[] (void* p, IFX_Allocator* pAllocator, FX_LPCSTR file, int line) {}

+#endif

+

+    void*			operator new[] (size_t size, IFX_Allocator* pAllocator)

+    {

+        return operator new(size, pAllocator);

+    }

+

+    void			operator delete[] (void* p) {}

+#ifndef _FX_NO_EXCEPTION_

+

+    void			operator delete[] (void* p, IFX_Allocator* pAllocator) {}

+#endif

+protected:

+

+    IFX_Allocator*	m_pAllocator;

+};

+#if defined(_DEBUG)

+#define FX_NEWAT(pAllocator) new(pAllocator, __FILE__, __LINE__)

+#else

+

+#define FX_NEWAT(pAllocator) new(pAllocator)

+#endif

+class CFX_GrowOnlyPool : public IFX_Allocator, public CFX_Object

+{

+public:

+

+    CFX_GrowOnlyPool(IFX_Allocator* pAllocator = NULL, size_t trunk_size = 16384);

+

+    ~CFX_GrowOnlyPool();

+

+    void	SetAllocator(IFX_Allocator* pAllocator);

+

+    void	SetTrunkSize(size_t trunk_size)

+    {

+        m_TrunkSize = trunk_size;

+    }

+

+    void*	AllocDebug(size_t size, FX_LPCSTR file, int line)

+    {

+        return Alloc(size);

+    }

+

+    void*	Alloc(size_t size);

+

+    void*	ReallocDebug(void* p, size_t new_size, FX_LPCSTR file, int line)

+    {

+        return NULL;

+    }

+

+    void*	Realloc(void* p, size_t new_size)

+    {

+        return NULL;

+    }

+

+    void	Free(void*) {}

+

+    void	FreeAll();

+private:

+

+    size_t	m_TrunkSize;

+

+    void*	m_pFirstTrunk;

+

+    IFX_Allocator*	m_pAllocator;

+};

+#endif

+#ifdef __cplusplus

+extern "C" {

+#endif

+#define FX_FIXEDMEM_PAGESIZE		(4096 * 16)

+#define FX_FIXEDMEM_MIDBLOCKSIZE	(4096)

+typedef struct _FX_MEMCONFIG {

+

+    size_t	nPageNum_Init8;

+

+    size_t	nPageNum_Init16;

+

+    size_t	nPageNum_Init32;

+

+    size_t	nPageNum_More16;

+

+    size_t	nPageNum_More32;

+

+    size_t	nPageSize_Mid;

+

+    size_t	nPageNum_InitMid;

+

+    size_t	nPageNum_MoreMid;

+

+    size_t	nPageSize_Large;

+

+    size_t	nPageSize_Alone;

+} FX_MEMCONFIG;

+void	FXMEM_SetConfig(const FX_MEMCONFIG* memConfig);

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/core/include/fxcrt/fx_stream.h b/core/include/fxcrt/fx_stream.h
new file mode 100644
index 0000000..cda5253
--- /dev/null
+++ b/core/include/fxcrt/fx_stream.h
@@ -0,0 +1,200 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_STREAM_H_

+#define _FX_STREAM_H_

+#ifndef _FX_MEMORY_H_

+#include "fx_memory.h"

+#endif

+void* FX_OpenFolder(FX_LPCSTR path);

+void* FX_OpenFolder(FX_LPCWSTR path);

+FX_BOOL FX_GetNextFile(void* handle, CFX_ByteString& filename, FX_BOOL& bFolder);

+FX_BOOL FX_GetNextFile(void* handle, CFX_WideString& filename, FX_BOOL& bFolder);

+void FX_CloseFolder(void* handle);

+FX_WCHAR FX_GetFolderSeparator();

+FX_DEFINEHANDLE(FX_HFILE)

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+#define FX_FILESIZE			FX_INT32

+#else

+#include <fcntl.h>

+#include <unistd.h>

+#include <sys/stat.h>

+#ifndef O_BINARY

+#define O_BINARY 		0

+#endif

+#ifndef O_LARGEFILE

+#define O_LARGEFILE		0

+#endif

+#define FX_FILESIZE			off_t

+#endif

+#define FX_GETBYTEOFFSET32(a)	0

+#define FX_GETBYTEOFFSET40(a)	0

+#define FX_GETBYTEOFFSET48(a)	0

+#define FX_GETBYTEOFFSET56(a)	0

+#define FX_GETBYTEOFFSET24(a)  ((FX_BYTE)(a>>24))

+#define FX_GETBYTEOFFSET16(a)  ((FX_BYTE)(a>>16))

+#define FX_GETBYTEOFFSET8(a)   ((FX_BYTE)(a>>8))

+#define FX_GETBYTEOFFSET0(a)   ((FX_BYTE)(a))

+#define FX_FILEMODE_Write		0

+#define FX_FILEMODE_ReadOnly	1

+#define FX_FILEMODE_Truncate	2

+FX_HFILE	FX_File_Open(FX_BSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator = NULL);

+FX_HFILE	FX_File_Open(FX_WSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator = NULL);

+void		FX_File_Close(FX_HFILE hFile, IFX_Allocator* pAllocator = NULL);

+FX_FILESIZE	FX_File_GetSize(FX_HFILE hFile);

+FX_FILESIZE	FX_File_GetPosition(FX_HFILE hFile);

+FX_FILESIZE	FX_File_SetPosition(FX_HFILE hFile, FX_FILESIZE pos);

+size_t		FX_File_Read(FX_HFILE hFile, void* pBuffer, size_t szBuffer);

+size_t		FX_File_ReadPos(FX_HFILE hFile, void* pBuffer, size_t szBuffer, FX_FILESIZE pos);

+size_t		FX_File_Write(FX_HFILE hFile, const void* pBuffer, size_t szBuffer);

+size_t		FX_File_WritePos(FX_HFILE hFile, const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);

+FX_BOOL		FX_File_Flush(FX_HFILE hFile);

+FX_BOOL		FX_File_Truncate(FX_HFILE hFile, FX_FILESIZE szFile);

+FX_BOOL		FX_File_Exist(FX_BSTR fileName);

+FX_BOOL		FX_File_Exist(FX_WSTR fileName);

+FX_BOOL		FX_File_Delete(FX_BSTR fileName);

+FX_BOOL		FX_File_Delete(FX_WSTR fileName);

+FX_BOOL		FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst);

+FX_BOOL		FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst);

+FX_BOOL		FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst);

+FX_BOOL		FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst);

+class IFX_StreamWrite

+{

+public:

+

+    virtual void		Release() = 0;

+

+    virtual	FX_BOOL		WriteBlock(const void* pData, size_t size) = 0;

+};

+class IFX_FileWrite : public IFX_StreamWrite

+{

+public:

+

+    virtual void			Release() = 0;

+

+    virtual FX_FILESIZE		GetSize() = 0;

+

+    virtual FX_BOOL			Flush() = 0;

+

+    virtual	FX_BOOL			WriteBlock(const void* pData, FX_FILESIZE offset, size_t size) = 0;

+    virtual	FX_BOOL			WriteBlock(const void* pData, size_t size)

+    {

+        return WriteBlock(pData, GetSize(), size);

+    }

+};

+IFX_FileWrite* FX_CreateFileWrite(FX_LPCSTR filename, IFX_Allocator* pAllocator = NULL);

+IFX_FileWrite* FX_CreateFileWrite(FX_LPCWSTR filename, IFX_Allocator* pAllocator = NULL);

+class IFX_StreamRead

+{

+public:

+

+    virtual void			Release() = 0;

+

+    virtual FX_BOOL			IsEOF() = 0;

+

+    virtual FX_FILESIZE		GetPosition() = 0;

+

+    virtual size_t			ReadBlock(void* buffer, size_t size) = 0;

+};

+class IFX_FileRead : IFX_StreamRead

+{

+public:

+

+    virtual void			Release() = 0;

+

+    virtual FX_FILESIZE		GetSize() = 0;

+

+    virtual FX_BOOL			IsEOF()

+    {

+        return FALSE;

+    }

+

+    virtual FX_FILESIZE		GetPosition()

+    {

+        return 0;

+    }

+

+    virtual FX_BOOL			SetRange(FX_FILESIZE offset, FX_FILESIZE size)

+    {

+        return FALSE;

+    }

+

+    virtual void			ClearRange() {}

+

+    virtual FX_BOOL			ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) = 0;

+

+    virtual size_t			ReadBlock(void* buffer, size_t size)

+    {

+        return 0;

+    }

+};

+IFX_FileRead* FX_CreateFileRead(FX_LPCSTR filename, IFX_Allocator* pAllocator = NULL);

+IFX_FileRead* FX_CreateFileRead(FX_LPCWSTR filename, IFX_Allocator* pAllocator = NULL);

+class IFX_FileStream : public IFX_FileRead, public IFX_FileWrite

+{

+public:

+

+    virtual IFX_FileStream*		Retain() = 0;

+

+    virtual void				Release() = 0;

+

+    virtual FX_FILESIZE			GetSize() = 0;

+

+    virtual FX_BOOL				IsEOF() = 0;

+

+    virtual FX_FILESIZE			GetPosition() = 0;

+

+    virtual FX_BOOL				ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) = 0;

+

+    virtual size_t				ReadBlock(void* buffer, size_t size) = 0;

+

+    virtual	FX_BOOL				WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) = 0;

+    virtual	FX_BOOL				WriteBlock(const void* buffer, size_t size)

+    {

+        return WriteBlock(buffer, GetSize(), size);

+    }

+

+    virtual FX_BOOL				Flush() = 0;

+};

+IFX_FileStream*		FX_CreateFileStream(FX_LPCSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator = NULL);

+IFX_FileStream*		FX_CreateFileStream(FX_LPCWSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator = NULL);

+class IFX_MemoryStream : public IFX_FileStream

+{

+public:

+

+    virtual FX_BOOL			IsConsecutive() const = 0;

+

+    virtual void			EstimateSize(size_t nInitSize, size_t nGrowSize) = 0;

+

+    virtual FX_LPBYTE		GetBuffer() const = 0;

+

+    virtual void			AttachBuffer(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE) = 0;

+

+    virtual void			DetachBuffer() = 0;

+};

+IFX_MemoryStream*	FX_CreateMemoryStream(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE, IFX_Allocator* pAllocator = NULL);

+IFX_MemoryStream*	FX_CreateMemoryStream(FX_BOOL bConsecutive = FALSE, IFX_Allocator* pAllocator = NULL);

+class IFX_BufferRead : public IFX_StreamRead

+{

+public:

+

+    virtual void			Release() = 0;

+

+    virtual FX_BOOL			IsEOF() = 0;

+

+    virtual FX_FILESIZE		GetPosition() = 0;

+

+    virtual size_t			ReadBlock(void* buffer, size_t size) = 0;

+

+    virtual FX_BOOL			ReadNextBlock(FX_BOOL bRestart = FALSE) = 0;

+

+    virtual FX_LPCBYTE		GetBlockBuffer() = 0;

+

+    virtual size_t			GetBlockSize() = 0;

+

+    virtual FX_FILESIZE		GetBlockOffset() = 0;

+};

+#endif

diff --git a/core/include/fxcrt/fx_string.h b/core/include/fxcrt/fx_string.h
new file mode 100644
index 0000000..563964c
--- /dev/null
+++ b/core/include/fxcrt/fx_string.h
@@ -0,0 +1,870 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_STRING_H_

+#define _FX_STRING_H_

+class CFX_ByteStringC;

+class CFX_ByteString;

+class CFX_WideStringC;

+class CFX_WideString;

+struct CFX_CharMap;

+class CFX_BinaryBuf;

+typedef int FX_STRSIZE;

+class CFX_ByteStringL;

+class CFX_WideStringL;

+class CFX_ByteStringC : public CFX_Object

+{

+public:

+

+    CFX_ByteStringC()

+    {

+        m_Ptr = NULL;

+        m_Length = 0;

+    }

+

+    CFX_ByteStringC(FX_LPCBYTE ptr, FX_STRSIZE size)

+    {

+        m_Ptr = ptr;

+        m_Length = size;

+    }

+

+    CFX_ByteStringC(FX_LPCSTR ptr)

+    {

+        m_Ptr = (FX_LPCBYTE)ptr;

+        m_Length = ptr ? (FX_STRSIZE)FXSYS_strlen(ptr) : 0;

+    }

+

+    CFX_ByteStringC(FX_CHAR& ch)

+    {

+        m_Ptr = (FX_LPCBYTE)&ch;

+        m_Length = 1;

+    }

+

+    CFX_ByteStringC(FX_LPCSTR ptr, FX_STRSIZE len)

+    {

+        m_Ptr = (FX_LPCBYTE)ptr;

+        if (len == -1) {

+            m_Length = (FX_STRSIZE)FXSYS_strlen(ptr);

+        } else {

+            m_Length = len;

+        }

+    }

+

+    CFX_ByteStringC(const CFX_ByteStringC& src)

+    {

+        m_Ptr = src.m_Ptr;

+        m_Length = src.m_Length;

+    }

+

+    CFX_ByteStringC(const CFX_ByteString& src);

+

+    CFX_ByteStringC& operator = (FX_LPCSTR src)

+    {

+        m_Ptr = (FX_LPCBYTE)src;

+        m_Length = (FX_STRSIZE)FXSYS_strlen(src);

+        return *this;

+    }

+

+    CFX_ByteStringC& operator = (const CFX_ByteStringC& src)

+    {

+        m_Ptr = src.m_Ptr;

+        m_Length = src.m_Length;

+        return *this;

+    }

+

+    CFX_ByteStringC& operator = (const CFX_ByteString& src);

+

+    bool			operator == (const CFX_ByteStringC& str) const

+    {

+        return 	str.m_Length == m_Length && FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length) == 0;

+    }

+

+    bool			operator != (const CFX_ByteStringC& str) const

+    {

+        return 	str.m_Length != m_Length || FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length) != 0;

+    }

+#define FXBSTR_ID(c1, c2, c3, c4) ((c1 << 24) | (c2 << 16) | (c3 << 8) | (c4))

+

+    FX_DWORD		GetID(FX_STRSIZE start_pos = 0) const;

+

+    FX_LPCBYTE		GetPtr() const

+    {

+        return m_Ptr;

+    }

+

+    FX_LPCSTR		GetCStr() const

+    {

+        return (FX_LPCSTR)m_Ptr;

+    }

+

+    FX_STRSIZE		GetLength() const

+    {

+        return m_Length;

+    }

+

+    bool			IsEmpty() const

+    {

+        return m_Length == 0;

+    }

+

+    operator		FX_LPCBYTE() const

+    {

+        return m_Ptr;

+    }

+

+    FX_BYTE			GetAt(FX_STRSIZE index) const

+    {

+        return m_Ptr[index];

+    }

+

+    CFX_ByteStringC	Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const

+    {

+        if (index < 0) {

+            index = 0;

+        }

+        if (index > m_Length) {

+            return CFX_ByteStringC();

+        }

+        if (count < 0 || count > m_Length - index) {

+            count = m_Length - index;

+        }

+        return CFX_ByteStringC(m_Ptr + index, count);

+    }

+protected:

+

+    FX_LPCBYTE		m_Ptr;

+

+    FX_STRSIZE		m_Length;

+private:

+

+    void*			operator new (size_t) throw()

+    {

+        return NULL;

+    }

+};

+typedef const CFX_ByteStringC& FX_BSTR;

+#define FX_BSTRC(str) CFX_ByteStringC(str, sizeof str-1)

+struct CFX_StringData {

+

+    long		m_nRefs;

+

+    FX_STRSIZE	m_nDataLength;

+

+    FX_STRSIZE	m_nAllocLength;

+

+    FX_CHAR		m_String[1];

+};

+class CFX_ByteString : public CFX_Object

+{

+public:

+

+    CFX_ByteString()

+    {

+        m_pData = NULL;

+    }

+

+    CFX_ByteString(const CFX_ByteString& str);

+

+    CFX_ByteString(char ch);

+

+    CFX_ByteString(FX_LPCSTR ptr, FX_STRSIZE len = -1);

+

+    CFX_ByteString(FX_LPCBYTE ptr, FX_STRSIZE len);

+

+    CFX_ByteString(FX_BSTR bstrc);

+

+    CFX_ByteString(FX_BSTR bstrc1, FX_BSTR bstrc2);

+

+    ~CFX_ByteString();

+

+    static CFX_ByteString	FromUnicode(FX_LPCWSTR ptr, FX_STRSIZE len = -1);

+

+    static CFX_ByteString	FromUnicode(const CFX_WideString& str);

+

+    operator				FX_LPCSTR() const

+    {

+        return m_pData ? m_pData->m_String : "";

+    }

+

+    operator				FX_LPCBYTE() const

+    {

+        return m_pData ? (FX_LPCBYTE)m_pData->m_String : NULL;

+    }

+

+    FX_STRSIZE				GetLength() const

+    {

+        return m_pData ? m_pData->m_nDataLength : 0;

+    }

+

+    bool					IsEmpty() const

+    {

+        return !GetLength();

+    }

+

+    int						Compare(FX_BSTR str) const;

+

+

+    bool					Equal(FX_BSTR str) const;

+

+

+    bool					EqualNoCase(FX_BSTR str) const;

+

+    bool					operator == (FX_LPCSTR str) const

+    {

+        return Equal(str);

+    }

+

+    bool					operator == (FX_BSTR str) const

+    {

+        return Equal(str);

+    }

+

+    bool					operator == (const CFX_ByteString& str) const;

+

+    bool					operator != (FX_LPCSTR str) const

+    {

+        return !Equal(str);

+    }

+

+    bool					operator != (FX_BSTR str) const

+    {

+        return !Equal(str);

+    }

+

+    bool					operator != (const CFX_ByteString& str) const

+    {

+        return !operator==(str);

+    }

+

+    void					Empty();

+

+    const CFX_ByteString&	operator = (FX_LPCSTR str);

+

+    const CFX_ByteString&	operator = (FX_BSTR bstrc);

+

+    const CFX_ByteString&	operator = (const CFX_ByteString& stringSrc);

+

+    const CFX_ByteString&	operator = (const CFX_BinaryBuf& buf);

+

+    void					Load(FX_LPCBYTE str, FX_STRSIZE len);

+

+    const CFX_ByteString&	operator += (FX_CHAR ch);

+

+    const CFX_ByteString&	operator += (FX_LPCSTR str);

+

+    const CFX_ByteString&	operator += (const CFX_ByteString& str);

+

+    const CFX_ByteString&	operator += (FX_BSTR bstrc);

+

+    FX_BYTE					GetAt(FX_STRSIZE nIndex) const

+    {

+        return m_pData ? m_pData->m_String[nIndex] : 0;

+    }

+

+    FX_BYTE					operator[](FX_STRSIZE nIndex) const

+    {

+        return m_pData ? m_pData->m_String[nIndex] : 0;

+    }

+

+    void					SetAt(FX_STRSIZE nIndex, FX_CHAR ch);

+

+    FX_STRSIZE				Insert(FX_STRSIZE index, FX_CHAR ch);

+

+    FX_STRSIZE				Delete(FX_STRSIZE index, FX_STRSIZE count = 1);

+

+

+    void					Format(FX_LPCSTR lpszFormat, ... );

+

+    void					FormatV(FX_LPCSTR lpszFormat, va_list argList);

+

+

+    void					Reserve(FX_STRSIZE len);

+

+    FX_LPSTR				GetBuffer(FX_STRSIZE len);

+

+    FX_LPSTR				LockBuffer();

+

+    void					ReleaseBuffer(FX_STRSIZE len = -1);

+

+    CFX_ByteString			Mid(FX_STRSIZE first) const;

+

+    CFX_ByteString			Mid(FX_STRSIZE first, FX_STRSIZE count) const;

+

+    CFX_ByteString			Left(FX_STRSIZE count) const;

+

+    CFX_ByteString			Right(FX_STRSIZE count) const;

+

+    FX_STRSIZE				Find(FX_BSTR lpszSub, FX_STRSIZE start = 0) const;

+

+    FX_STRSIZE				Find(FX_CHAR ch, FX_STRSIZE start = 0) const;

+

+    FX_STRSIZE				ReverseFind(FX_CHAR ch) const;

+

+    void					MakeLower();

+

+    void					MakeUpper();

+

+    void					TrimRight();

+

+    void					TrimRight(FX_CHAR chTarget);

+

+    void					TrimRight(FX_BSTR lpszTargets);

+

+    void					TrimLeft();

+

+    void					TrimLeft(FX_CHAR chTarget);

+

+    void					TrimLeft(FX_BSTR lpszTargets);

+

+    FX_STRSIZE				Replace(FX_BSTR lpszOld, FX_BSTR lpszNew);

+

+    FX_STRSIZE				Remove(FX_CHAR ch);

+

+    CFX_WideString			UTF8Decode() const;

+

+    void					ConvertFrom(const CFX_WideString& str, CFX_CharMap* pCharMap = NULL);

+

+    FX_DWORD				GetID(FX_STRSIZE start_pos = 0) const;

+

+    static CFX_ByteString	LoadFromFile(FX_BSTR file_path);

+#define FXFORMAT_SIGNED			1

+#define FXFORMAT_HEX			2

+#define FXFORMAT_CAPITAL		4

+

+    static CFX_ByteString	FormatInteger(int i, FX_DWORD flags = 0);

+

+    static CFX_ByteString	FormatFloat(FX_FLOAT f, int precision = 0);

+protected:

+

+    struct CFX_StringData*	m_pData;

+    void					AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex, FX_STRSIZE nExtraLen) const;

+    void					AssignCopy(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData);

+    void					ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data);

+    void					ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData);

+    void					CopyBeforeWrite();

+    void					AllocBeforeWrite(FX_STRSIZE nLen);

+};

+inline CFX_ByteStringC::CFX_ByteStringC(const CFX_ByteString& src)

+{

+    m_Ptr = (FX_LPCBYTE)src;

+    m_Length = src.GetLength();

+}

+inline CFX_ByteStringC& CFX_ByteStringC::operator = (const CFX_ByteString& src)

+{

+    m_Ptr = (FX_LPCBYTE)src;

+    m_Length = src.GetLength();

+    return *this;

+}

+

+inline CFX_ByteString operator + (FX_BSTR str1, FX_BSTR str2)

+{

+    return CFX_ByteString(str1, str2);

+}

+inline CFX_ByteString operator + (FX_BSTR str1, FX_LPCSTR str2)

+{

+    return CFX_ByteString(str1, str2);

+}

+inline CFX_ByteString operator + (FX_LPCSTR str1, FX_BSTR str2)

+{

+    return CFX_ByteString(str1, str2);

+}

+inline CFX_ByteString operator + (FX_BSTR str1, FX_CHAR ch)

+{

+    return CFX_ByteString(str1, CFX_ByteStringC(ch));

+}

+inline CFX_ByteString operator + (FX_CHAR ch, FX_BSTR str2)

+{

+    return CFX_ByteString(ch, str2);

+}

+inline CFX_ByteString operator + (const CFX_ByteString& str1, const CFX_ByteString& str2)

+{

+    return CFX_ByteString(str1, str2);

+}

+inline CFX_ByteString operator + (const CFX_ByteString& str1, FX_CHAR ch)

+{

+    return CFX_ByteString(str1, CFX_ByteStringC(ch));

+}

+inline CFX_ByteString operator + (FX_CHAR ch, const CFX_ByteString& str2)

+{

+    return CFX_ByteString(ch, str2);

+}

+inline CFX_ByteString operator + (const CFX_ByteString& str1, FX_LPCSTR str2)

+{

+    return CFX_ByteString(str1, str2);

+}

+inline CFX_ByteString operator + (FX_LPCSTR str1, const CFX_ByteString& str2)

+{

+    return CFX_ByteString(str1, str2);

+}

+inline CFX_ByteString operator + (const CFX_ByteString& str1, FX_BSTR str2)

+{

+    return CFX_ByteString(str1, str2);

+}

+inline CFX_ByteString operator + (FX_BSTR str1, const CFX_ByteString& str2)

+{

+    return CFX_ByteString(str1, str2);

+}

+class CFX_StringBufBase : public CFX_Object

+{

+public:

+

+    CFX_StringBufBase(FX_STRSIZE limit)

+    {

+        m_Size = 0;

+        m_Limit = limit;

+    }

+

+    FX_CHAR*	GetPtr() const

+    {

+        return (FX_CHAR*)(this + 1);

+    }

+

+    FX_STRSIZE	GetSize() const

+    {

+        return m_Size;

+    }

+

+    void		Empty()

+    {

+        m_Size = 0;

+    }

+

+    void		Copy(FX_BSTR str);

+

+    void		Append(FX_BSTR str);

+

+    void		Append(int i, FX_DWORD flags = 0);

+

+    CFX_ByteStringC		GetStringC() const

+    {

+        return CFX_ByteStringC((FX_CHAR*)(this + 1), m_Size);

+    }

+

+    CFX_ByteString		GetString() const

+    {

+        return CFX_ByteString((FX_CHAR*)(this + 1), m_Size);

+    }

+protected:

+

+    FX_STRSIZE	m_Limit;

+

+    FX_STRSIZE	m_Size;

+};

+template<FX_STRSIZE limit>

+class CFX_StringBufTemplate : public CFX_StringBufBase

+{

+public:

+

+    CFX_StringBufTemplate() : CFX_StringBufBase(limit) {}

+

+    FX_CHAR		m_Buffer[limit];

+};

+typedef CFX_StringBufTemplate<256> CFX_StringBuf256;

+class CFX_WideStringC : public CFX_Object

+{

+public:

+

+    CFX_WideStringC()

+    {

+        m_Ptr = NULL;

+        m_Length = 0;

+    }

+

+    CFX_WideStringC(FX_LPCWSTR ptr)

+    {

+        m_Ptr = ptr;

+        m_Length = ptr ? (FX_STRSIZE)FXSYS_wcslen(ptr) : 0;

+    }

+

+    CFX_WideStringC(FX_WCHAR& ch)

+    {

+        m_Ptr = &ch;

+        m_Length = 1;

+    }

+

+    CFX_WideStringC(FX_LPCWSTR ptr, FX_STRSIZE len)

+    {

+        m_Ptr = ptr;

+        if (len == -1) {

+            m_Length = (FX_STRSIZE)FXSYS_wcslen(ptr);

+        } else {

+            m_Length = len;

+        }

+    }

+

+    CFX_WideStringC(const CFX_WideStringC& src)

+    {

+        m_Ptr = src.m_Ptr;

+        m_Length = src.m_Length;

+    }

+

+    CFX_WideStringC(const CFX_WideString& src);

+

+    CFX_WideStringC& operator = (FX_LPCWSTR src)

+    {

+        m_Ptr = src;

+        m_Length = (FX_STRSIZE)FXSYS_wcslen(src);

+        return *this;

+    }

+

+    CFX_WideStringC& operator = (const CFX_WideStringC& src)

+    {

+        m_Ptr = src.m_Ptr;

+        m_Length = src.m_Length;

+        return *this;

+    }

+

+    CFX_WideStringC& operator = (const CFX_WideString& src);

+

+    bool			operator == (const CFX_WideStringC& str) const

+    {

+        return 	str.m_Length == m_Length && FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length * sizeof(FX_WCHAR)) == 0;

+    }

+

+    bool			operator != (const CFX_WideStringC& str) const

+    {

+        return 	str.m_Length != m_Length || FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length * sizeof(FX_WCHAR)) != 0;

+    }

+

+    FX_LPCWSTR		GetPtr() const

+    {

+        return m_Ptr;

+    }

+

+    FX_STRSIZE		GetLength() const

+    {

+        return m_Length;

+    }

+

+    bool			IsEmpty() const

+    {

+        return m_Length == 0;

+    }

+

+    FX_WCHAR		GetAt(FX_STRSIZE index) const

+    {

+        return m_Ptr[index];

+    }

+

+    CFX_WideStringC	Left(FX_STRSIZE count) const

+    {

+        if (count < 1) {

+            return CFX_WideStringC();

+        }

+        if (count > m_Length) {

+            count = m_Length;

+        }

+        return CFX_WideStringC(m_Ptr, count);

+    }

+

+    CFX_WideStringC	Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const

+    {

+        if (index < 0) {

+            index = 0;

+        }

+        if (index > m_Length) {

+            return CFX_WideStringC();

+        }

+        if (count < 0 || count > m_Length - index) {

+            count = m_Length - index;

+        }

+        return CFX_WideStringC(m_Ptr + index, count);

+    }

+

+    CFX_WideStringC	Right(FX_STRSIZE count) const

+    {

+        if (count < 1) {

+            return CFX_WideStringC();

+        }

+        if (count > m_Length) {

+            count = m_Length;

+        }

+        return CFX_WideStringC(m_Ptr + m_Length - count, count);

+    }

+protected:

+

+    FX_LPCWSTR		m_Ptr;

+

+    FX_STRSIZE		m_Length;

+private:

+

+    void*			operator new (size_t) throw()

+    {

+        return NULL;

+    }

+};

+typedef const CFX_WideStringC&	FX_WSTR;

+#define FX_WSTRC(wstr) CFX_WideStringC((FX_LPCWSTR)wstr, sizeof(wstr) / sizeof(FX_WCHAR) - 1)

+struct CFX_StringDataW {

+

+    long		m_nRefs;

+

+    FX_STRSIZE	m_nDataLength;

+

+    FX_STRSIZE	m_nAllocLength;

+

+    FX_WCHAR	m_String[1];

+};

+class CFX_WideString : public CFX_Object

+{

+public:

+

+    CFX_WideString()

+    {

+        m_pData = NULL;

+    }

+

+    CFX_WideString(const CFX_WideString& str);

+

+    CFX_WideString(FX_LPCWSTR ptr, FX_STRSIZE len = -1)

+    {

+        InitStr(ptr, len);

+    }

+

+    CFX_WideString(FX_WCHAR ch);

+

+    CFX_WideString(const CFX_WideStringC& str);

+

+    CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2);

+

+    ~CFX_WideString();

+

+    static CFX_WideString	FromLocal(const char* str, FX_STRSIZE len = -1);

+

+    static CFX_WideString	FromUTF8(const char* str, FX_STRSIZE len = -1);

+

+    static CFX_WideString	FromUTF16LE(const unsigned short* str, FX_STRSIZE len = -1);

+

+    operator FX_LPCWSTR() const

+    {

+        return m_pData ? m_pData->m_String : (FX_WCHAR*)L"";

+    }

+

+    void					Empty();

+

+

+    FX_BOOL					IsEmpty() const

+    {

+        return !GetLength();

+    }

+

+    FX_STRSIZE				GetLength() const

+    {

+        return m_pData ? m_pData->m_nDataLength : 0;

+    }

+

+    const CFX_WideString&	operator = (FX_LPCWSTR str);

+

+    const CFX_WideString&	operator =(const CFX_WideString& stringSrc);

+

+    const CFX_WideString&	operator =(const CFX_WideStringC& stringSrc);

+

+    const CFX_WideString&	operator += (FX_LPCWSTR str);

+

+    const CFX_WideString&	operator += (FX_WCHAR ch);

+

+    const CFX_WideString&	operator += (const CFX_WideString& str);

+

+    const CFX_WideString&	operator += (const CFX_WideStringC& str);

+

+    FX_WCHAR				GetAt(FX_STRSIZE nIndex) const

+    {

+        return m_pData ? m_pData->m_String[nIndex] : 0;

+    }

+

+    FX_WCHAR				operator[](FX_STRSIZE nIndex) const

+    {

+        return m_pData ? m_pData->m_String[nIndex] : 0;

+    }

+

+    void					SetAt(FX_STRSIZE nIndex, FX_WCHAR ch);

+

+    int						Compare(FX_LPCWSTR str) const;

+

+    int						Compare(const CFX_WideString& str) const;

+

+    int						CompareNoCase(FX_LPCWSTR str) const;

+

+    bool					Equal(const CFX_WideStringC& str) const;

+

+    CFX_WideString			Mid(FX_STRSIZE first) const;

+

+    CFX_WideString			Mid(FX_STRSIZE first, FX_STRSIZE count) const;

+

+    CFX_WideString			Left(FX_STRSIZE count) const;

+

+    CFX_WideString			Right(FX_STRSIZE count) const;

+

+    FX_STRSIZE				Insert(FX_STRSIZE index, FX_WCHAR ch);

+

+    FX_STRSIZE				Delete(FX_STRSIZE index, FX_STRSIZE count = 1);

+

+    void					Format(FX_LPCWSTR lpszFormat, ... );

+

+    void					FormatV(FX_LPCWSTR lpszFormat, va_list argList);

+

+    void					MakeLower();

+

+    void					MakeUpper();

+

+    void					TrimRight();

+

+    void					TrimRight(FX_WCHAR chTarget);

+

+    void					TrimRight(FX_LPCWSTR lpszTargets);

+

+    void					TrimLeft();

+

+    void					TrimLeft(FX_WCHAR chTarget);

+

+    void					TrimLeft(FX_LPCWSTR lpszTargets);

+

+    void					Reserve(FX_STRSIZE len);

+

+    FX_LPWSTR				GetBuffer(FX_STRSIZE len);

+

+    FX_LPWSTR				LockBuffer();

+

+    void					ReleaseBuffer(FX_STRSIZE len = -1);

+

+    int						GetInteger() const;

+

+    FX_FLOAT				GetFloat() const;

+

+    FX_STRSIZE				Find(FX_LPCWSTR lpszSub, FX_STRSIZE start = 0) const;

+

+    FX_STRSIZE				Find(FX_WCHAR ch, FX_STRSIZE start = 0) const;

+

+    FX_STRSIZE				Replace(FX_LPCWSTR lpszOld, FX_LPCWSTR lpszNew);

+

+    FX_STRSIZE				Remove(FX_WCHAR ch);

+

+    CFX_ByteString			UTF8Encode() const;

+

+    CFX_ByteString			UTF16LE_Encode(FX_BOOL bTerminate = TRUE) const;

+

+    void					ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL);

+protected:

+    void					InitStr(FX_LPCWSTR ptr, int len);

+

+    CFX_StringDataW*		m_pData;

+    void					CopyBeforeWrite();

+    void					AllocBeforeWrite(FX_STRSIZE nLen);

+    void					ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData);

+    void					ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data);

+    void					AssignCopy(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData);

+    void					AllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex, FX_STRSIZE nExtraLen) const;

+};

+inline CFX_WideStringC::CFX_WideStringC(const CFX_WideString& src)

+{

+    m_Ptr = (FX_LPCWSTR)src;

+    m_Length = src.GetLength();

+}

+inline CFX_WideStringC& CFX_WideStringC::operator = (const CFX_WideString& src)

+{

+    m_Ptr = (FX_LPCWSTR)src;

+    m_Length = src.GetLength();

+    return *this;

+}

+

+inline CFX_WideString operator + (const CFX_WideStringC& str1, const CFX_WideStringC& str2)

+{

+    return CFX_WideString(str1, str2);

+}

+inline CFX_WideString operator + (const CFX_WideStringC& str1, FX_LPCWSTR str2)

+{

+    return CFX_WideString(str1, str2);

+}

+inline CFX_WideString operator + (FX_LPCWSTR str1, const CFX_WideStringC& str2)

+{

+    return CFX_WideString(str1, str2);

+}

+inline CFX_WideString operator + (const CFX_WideStringC& str1, FX_WCHAR ch)

+{

+    return CFX_WideString(str1, CFX_WideStringC(ch));

+}

+inline CFX_WideString operator + (FX_WCHAR ch, const CFX_WideStringC& str2)

+{

+    return CFX_WideString(ch, str2);

+}

+inline CFX_WideString operator + (const CFX_WideString& str1, const CFX_WideString& str2)

+{

+    return CFX_WideString(str1, str2);

+}

+inline CFX_WideString operator + (const CFX_WideString& str1, FX_WCHAR ch)

+{

+    return CFX_WideString(str1, CFX_WideStringC(ch));

+}

+inline CFX_WideString operator + (FX_WCHAR ch, const CFX_WideString& str2)

+{

+    return CFX_WideString(ch, str2);

+}

+inline CFX_WideString operator + (const CFX_WideString& str1, FX_LPCWSTR str2)

+{

+    return CFX_WideString(str1, str2);

+}

+inline CFX_WideString operator + (FX_LPCWSTR str1, const CFX_WideString& str2)

+{

+    return CFX_WideString(str1, str2);

+}

+inline CFX_WideString operator + (const CFX_WideString& str1, const CFX_WideStringC& str2)

+{

+    return CFX_WideString(str1, str2);

+}

+inline CFX_WideString operator + (const CFX_WideStringC& str1, const CFX_WideString& str2)

+{

+    return CFX_WideString(str1, str2);

+}

+

+bool operator==(const CFX_WideString& s1, const CFX_WideString& s2);

+bool operator==(const CFX_WideString& s1, const CFX_WideStringC& s2);

+bool operator==(const CFX_WideStringC& s1, const CFX_WideString& s2);

+bool operator== (const CFX_WideString& s1, FX_LPCWSTR s2);

+bool operator==(FX_LPCWSTR s1, const CFX_WideString& s2);

+bool operator!=(const CFX_WideString& s1, const CFX_WideString& s2);

+bool operator!=(const CFX_WideString& s1, const CFX_WideStringC& s2);

+bool operator!=(const CFX_WideStringC& s1, const CFX_WideString& s2);

+bool operator!= (const CFX_WideString& s1, FX_LPCWSTR s2);

+bool operator!=(FX_LPCWSTR s1, const CFX_WideString& s2);

+FX_FLOAT FX_atof(FX_BSTR str);

+void FX_atonum(FX_BSTR str, FX_BOOL& bInteger, void* pData);

+FX_STRSIZE FX_ftoa(FX_FLOAT f, FX_LPSTR buf);

+CFX_ByteString	FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len);

+inline CFX_ByteString	FX_UTF8Encode(FX_WSTR wsStr)

+{

+    return FX_UTF8Encode(wsStr.GetPtr(), wsStr.GetLength());

+}

+inline CFX_ByteString	FX_UTF8Encode(const CFX_WideString &wsStr)

+{

+    return FX_UTF8Encode((FX_LPCWSTR)wsStr, wsStr.GetLength());

+}

+class CFX_ByteStringL : public CFX_ByteStringC

+{

+public:

+    CFX_ByteStringL() : CFX_ByteStringC() {}

+    ~CFX_ByteStringL() {}

+

+    void		Empty(IFX_Allocator* pAllocator);

+    FX_LPSTR	AllocBuffer(FX_STRSIZE length, IFX_Allocator* pAllocator);

+

+    void		Set(FX_BSTR src, IFX_Allocator* pAllocator);

+};

+class CFX_WideStringL : public CFX_WideStringC

+{

+public:

+    CFX_WideStringL() : CFX_WideStringC() {}

+    ~CFX_WideStringL() {}

+

+    void		Empty(IFX_Allocator* pAllocator);

+    void		Set(FX_WSTR src, IFX_Allocator* pAllocator);

+

+    int			GetInteger() const;

+    FX_FLOAT	GetFloat() const;

+

+    void		TrimRight(FX_LPCWSTR lpszTargets);

+};

+void	FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len, CFX_ByteStringL &utf8Str, IFX_Allocator* pAllocator = NULL);

+#endif

diff --git a/core/include/fxcrt/fx_system.h b/core/include/fxcrt/fx_system.h
new file mode 100644
index 0000000..f72be0f
--- /dev/null
+++ b/core/include/fxcrt/fx_system.h
@@ -0,0 +1,279 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_SYSTEM_H_

+#define _FX_SYSTEM_H_

+#define _FX_WIN32_DESKTOP_		1

+#define _FX_LINUX_DESKTOP_		4

+#define _FX_MACOSX_				7

+#define _FX_ANDROID_			12

+#define _FXM_PLATFORM_WINDOWS_		1

+#define _FXM_PLATFORM_LINUX_		2

+#define _FXM_PLATFORM_APPLE_		3

+#define _FXM_PLATFORM_ANDROID_		4

+#ifndef _FX_OS_

+#if defined(__ANDROID__)

+#define _FX_OS_ _FX_ANDROID_

+#define _FXM_PLATFORM_ _FXM_PLATFORM_ANDROID_

+#elif defined(_WIN32) || defined(_WIN64)

+#define _FX_OS_ _FX_WIN32_DESKTOP_

+#define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_

+#elif defined(__linux__)

+#define _FX_OS_ _FX_LINUX_DESKTOP_

+#define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_

+#elif defined(__APPLE__)

+#define _FX_OS_ _FX_MACOSX_

+#define _FXM_PLATFORM_ _FXM_PLATFORM_APPLE_

+#endif

+#endif

+#if !defined(_FX_OS_) || _FX_OS_ == 0

+#error Sorry, can not figure out what OS you are targeting to. Please specify _FX_OS_ macro.

+#endif

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+#define _CRT_SECURE_NO_WARNINGS

+#include <windows.h>

+#endif

+#define _FX_W32_		1

+#define _FX_W64_		2

+#ifndef _FX_WORDSIZE_

+#if defined(_WIN64) || defined(__arm64) || defined(__arm64__) || defined(_M_AMD64) || defined(_M_X64) || defined(_M_IA64) || defined(__powerpc64__) || defined(__x86_64__) || __WORDSIZE == 64

+#define _FX_WORDSIZE_	_FX_W64_

+#else

+#define _FX_WORDSIZE_	_FX_W32_

+#endif

+#endif

+#include <stddef.h>

+#include <stdarg.h>

+#include <setjmp.h>

+#include <stdlib.h>

+#include <stdio.h>

+#include <string.h>

+#include <assert.h>

+#include <wchar.h>

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_

+#include <libkern/OSAtomic.h>

+#if _FX_OS_ == _FX_MACOSX_

+#include <Carbon/Carbon.h>

+#elif _FX_OS_ == _FX_IOS_

+#include <CoreText/CoreText.h>

+#include <CoreGraphics/CoreGraphics.h>

+#endif

+#endif

+#ifdef __cplusplus

+extern "C" {

+#endif

+typedef void*					FX_LPVOID;

+typedef void const*				FX_LPCVOID;

+typedef void*					FX_POSITION;

+typedef signed char				FX_INT8;

+typedef unsigned char			FX_UINT8;

+typedef unsigned char			FX_BYTE;

+typedef unsigned char*			FX_LPBYTE;

+typedef unsigned char const*	FX_LPCBYTE;

+typedef short					FX_INT16;

+typedef unsigned short			FX_UINT16;

+typedef short					FX_SHORT;

+typedef unsigned short			FX_WORD;

+typedef unsigned short*			FX_LPWORD;

+typedef unsigned short const*	FX_LPCWORD;

+typedef int						FX_INT32;

+typedef float					FX_FLOAT;

+typedef int						FX_BOOL;

+typedef int						FX_ERR;

+#define FX_SUCCEEDED(Status)	((FX_ERR)(Status) >= 0)

+#define FX_FAILED(Status)		((FX_ERR)(Status) < 0)

+typedef char					FX_CHAR;

+typedef char*					FX_LPSTR;

+typedef char const*				FX_LPCSTR;

+typedef unsigned int		FX_DWORD;

+typedef unsigned int*		FX_LPDWORD;

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+typedef __int64				FX_INT64;

+typedef unsigned __int64	FX_UINT64;

+#else

+typedef long long int		FX_INT64;

+typedef unsigned long long	FX_UINT64;

+#endif

+#if _FX_WORDSIZE_ == _FX_W64_

+typedef FX_INT64			FX_INTPTR;

+typedef FX_UINT64			FX_UINTPTR;

+#else

+typedef int					FX_INTPTR;

+typedef unsigned int		FX_UINTPTR;

+#endif

+typedef wchar_t					FX_WCHAR;

+typedef wchar_t*				FX_LPWSTR;

+typedef wchar_t const*			FX_LPCWSTR;

+typedef FX_DWORD				FX_UINT32;

+typedef FX_UINT64				FX_QWORD;

+#define FX_DEFINEHANDLE(name)	typedef struct _##name {FX_LPVOID pData;} * name;

+#if defined(DEBUG) && !defined(_DEBUG)

+#define _DEBUG

+#endif

+#ifndef TRUE

+

+#define TRUE	1

+#endif

+#ifndef FALSE

+

+#define FALSE	0

+#endif

+#ifndef NULL

+

+#define NULL	0

+#endif

+#define FXSYS_assert assert

+#ifndef ASSERT

+#ifdef _DEBUG

+#define ASSERT FXSYS_assert

+#else

+

+#define ASSERT(a)

+#endif

+#endif

+#define FX_MAX(a, b) (((a) > (b)) ? (a) : (b))

+#define FX_MIN(a, b) (((a) < (b)) ? (a) : (b))

+#define FX_PI	3.1415926535897932384626433832795f

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+#define FXSYS_snprintf	_snprintf

+#else

+#define FXSYS_snprintf	snprintf

+#endif

+#define FXSYS_sprintf	sprintf

+#define FXSYS_vsprintf	vsprintf

+#define FXSYS_strchr	strchr

+#define FXSYS_strlen	strlen

+#define FXSYS_strncmp	strncmp

+#define FXSYS_strcmp	strcmp

+#define FXSYS_strcpy	strcpy

+#define FXSYS_strncpy	strncpy

+#define FXSYS_strstr	strstr

+#define FXSYS_FILE		FILE

+#define FXSYS_fopen		fopen

+#define FXSYS_fclose	fclose

+#define FXSYS_SEEK_END	SEEK_END

+#define FXSYS_SEEK_SET	SEEK_SET

+#define FXSYS_fseek		fseek

+#define FXSYS_ftell		ftell

+#define FXSYS_fread		fread

+#define FXSYS_fwrite	fwrite

+#define FXSYS_fprintf	fprintf

+#define FXSYS_fflush	fflush

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+#ifdef _NATIVE_WCHAR_T_DEFINED

+#define FXSYS_wfopen(f, m) _wfopen((const wchar_t*)(f), (const wchar_t*)(m))

+#else

+#define FXSYS_wfopen _wfopen

+#endif

+#else

+FXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode);

+#endif

+

+#define FXSYS_wcslen	wcslen

+#define FXSYS_wcscmp	wcscmp

+#define FXSYS_wcschr	wcschr

+#define FXSYS_wcsstr	wcsstr

+#define FXSYS_wcsncmp	wcsncmp

+#define FXSYS_vswprintf	vswprintf

+#define FXSYS_mbstowcs	mbstowcs

+#define FXSYS_wcstombs	wcstombs

+#define FXSYS_memcmp	memcmp

+#define FXSYS_memcpy	memcpy

+#define FXSYS_memmove	memmove

+#define FXSYS_memset	memset

+#define FXSYS_memchr	memchr

+#define FXSYS_qsort		qsort

+#define FXSYS_bsearch	bsearch

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+#define FXSYS_GetACP GetACP

+#define FXSYS_itoa _itoa

+#define FXSYS_strlwr _strlwr

+#define FXSYS_strupr _strupr

+#define FXSYS_stricmp _stricmp

+#ifdef _NATIVE_WCHAR_T_DEFINED

+#define FXSYS_wcsicmp(str1, str2) _wcsicmp((wchar_t*)(str1), (wchar_t*)(str2))

+#define FXSYS_WideCharToMultiByte(p1, p2, p3, p4, p5, p6, p7, p8) WideCharToMultiByte(p1, p2, (const wchar_t*)(p3), p4, p5, p6, p7, p8)

+#define FXSYS_MultiByteToWideChar(p1, p2, p3, p4, p5, p6) MultiByteToWideChar(p1, p2, p3, p4, (wchar_t*)(p5), p6)

+#define FXSYS_wcslwr(str) _wcslwr((wchar_t*)(str))

+#define FXSYS_wcsupr(str) _wcsupr((wchar_t*)(str))

+#else

+#define FXSYS_wcsicmp _wcsicmp

+#define FXSYS_WideCharToMultiByte WideCharToMultiByte

+#define FXSYS_MultiByteToWideChar MultiByteToWideChar

+#define FXSYS_wcslwr _wcslwr

+#define FXSYS_wcsupr _wcsupr

+#endif

+#define FXSYS_GetFullPathName GetFullPathName

+#define FXSYS_GetModuleFileName GetModuleFileName

+#else

+int			FXSYS_GetACP(void);

+char*		FXSYS_itoa(int value, char* string, int radix);

+int			FXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, const wchar_t* wstr, int wlen,

+                                      char* buf, int buflen, const char* default_str, int* pUseDefault);

+int			FXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, const char* bstr, int blen,

+                                      wchar_t* buf, int buflen);

+FX_DWORD	FXSYS_GetFullPathName(const char* filename, FX_DWORD buflen, char* buf, char** filepart);

+FX_DWORD	FXSYS_GetModuleFileName(void* hModule, char* buf, FX_DWORD bufsize);

+char*		FXSYS_strlwr(char* str);

+char*		FXSYS_strupr(char* str);

+int			FXSYS_stricmp(const char*, const char*);

+int			FXSYS_wcsicmp(const wchar_t *string1, const wchar_t *string2);

+wchar_t*	FXSYS_wcslwr(wchar_t* str);

+wchar_t*	FXSYS_wcsupr(wchar_t* str);

+#endif

+#define FXSYS_memcpy32		FXSYS_memcpy

+#define FXSYS_memcmp32		FXSYS_memcmp

+#define FXSYS_memset32		FXSYS_memset

+#define FXSYS_memset8		FXSYS_memset

+#define FXSYS_memmove32		FXSYS_memmove

+#ifdef __cplusplus

+}

+#endif

+#include <math.h>

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+#define FXSYS_pow(a, b)		(FX_FLOAT)powf(a, b)

+#else

+#define FXSYS_pow(a, b)		(FX_FLOAT)pow(a, b)

+#endif

+#define FXSYS_sqrt(a)		(FX_FLOAT)sqrt(a)

+#define FXSYS_fabs(a)		(FX_FLOAT)fabs(a)

+#define FXSYS_atan2(a, b)	(FX_FLOAT)atan2(a, b)

+#define FXSYS_ceil(a)		(FX_FLOAT)ceil(a)

+#define FXSYS_floor(a)		(FX_FLOAT)floor(a)

+#define FXSYS_cos(a)		(FX_FLOAT)cos(a)

+#define FXSYS_acos(a)		(FX_FLOAT)acos(a)

+#define FXSYS_sin(a)		(FX_FLOAT)sin(a)

+#define FXSYS_log(a)		(FX_FLOAT)log(a)

+#define FXSYS_log10(a)		(FX_FLOAT)log10(a)

+#define FXSYS_fmod(a, b)	(FX_FLOAT)fmod(a, b)

+#define FXSYS_abs			abs

+#ifdef __cplusplus

+extern "C" {

+#endif

+#define _FX_LSB_FIRST_

+#define FXDWORD_FROM_LSBFIRST(i)	(i)

+#define FXDWORD_FROM_MSBFIRST(i)	(((FX_BYTE)(i) << 24) | ((FX_BYTE)((i) >> 8) << 16) | ((FX_BYTE)((i) >> 16) << 8) | (FX_BYTE)((i) >> 24))

+#define FXDWORD_GET_LSBFIRST(p)		((((FX_LPBYTE)(p))[3] << 24) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0]))

+#define FXDWORD_GET_MSBFIRST(p) ((((FX_LPBYTE)(p))[0] << 24) | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | (((FX_LPBYTE)(p))[3]))

+#define FXSYS_HIBYTE(word)	((FX_BYTE)((word) >> 8))

+#define FXSYS_LOBYTE(word)	((FX_BYTE)(word))

+#define FXSYS_HIWORD(dword)	((FX_WORD)((dword) >> 16))

+#define FXSYS_LOWORD(dword)	((FX_WORD)(dword))

+FX_INT32	FXSYS_atoi(FX_LPCSTR str);

+FX_INT32	FXSYS_wtoi(FX_LPCWSTR str);

+FX_INT64	FXSYS_atoi64(FX_LPCSTR str);

+FX_INT64	FXSYS_wtoi64(FX_LPCWSTR str);

+FX_LPCSTR	FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix);

+FX_LPCWSTR	FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix);

+int			FXSYS_round(FX_FLOAT f);

+#define		FXSYS_Mul(a, b) ((a) * (b))

+#define		FXSYS_Div(a, b) ((a) / (b))

+#define		FXSYS_MulDiv(a, b, c) ((a) * (b) / (c))

+#define		FXSYS_sqrt2(a, b) (FX_FLOAT)FXSYS_sqrt((a)*(a) + (b)*(b))

+#ifdef __cplusplus

+};

+#endif

+#endif

diff --git a/core/include/fxcrt/fx_ucd.h b/core/include/fxcrt/fx_ucd.h
new file mode 100644
index 0000000..447d555
--- /dev/null
+++ b/core/include/fxcrt/fx_ucd.h
@@ -0,0 +1,112 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_UNICODE_
+#define _FX_UNICODE_
+enum FX_CHARBREAKPROP {
+    FX_CBP_OP = 0,
+    FX_CBP_CL = 1,
+    FX_CBP_QU = 2,
+    FX_CBP_GL = 3,
+    FX_CBP_NS = 4,
+    FX_CBP_EX = 5,
+    FX_CBP_SY = 6,
+    FX_CBP_IS = 7,
+    FX_CBP_PR = 8,
+    FX_CBP_PO = 9,
+    FX_CBP_NU = 10,
+    FX_CBP_AL = 11,
+    FX_CBP_ID = 12,
+    FX_CBP_IN = 13,
+    FX_CBP_HY = 14,
+    FX_CBP_BA = 15,
+    FX_CBP_BB = 16,
+    FX_CBP_B2 = 17,
+    FX_CBP_ZW = 18,
+    FX_CBP_CM = 19,
+    FX_CBP_WJ = 20,
+    FX_CBP_H2 = 21,
+    FX_CBP_H3 = 22,
+    FX_CBP_JL = 23,
+    FX_CBP_JV = 24,
+    FX_CBP_JT = 25,
+
+    FX_CBP_BK = 26,
+    FX_CBP_CR = 27,
+    FX_CBP_LF = 28,
+    FX_CBP_NL = 29,
+    FX_CBP_SA = 30,
+    FX_CBP_SG = 31,
+    FX_CBP_CB = 32,
+    FX_CBP_XX = 33,
+    FX_CBP_AI = 34,
+    FX_CBP_SP = 35,
+    FX_CBP_TB = 37,
+    FX_CBP_NONE = 36,
+};
+#define FX_BIDICLASSBITS		6
+#define FX_BIDICLASSBITSMASK	(31 << FX_BIDICLASSBITS)
+enum FX_BIDICLASS {
+    FX_BIDICLASS_ON		= 0,
+    FX_BIDICLASS_L		= 1,
+    FX_BIDICLASS_R		= 2,
+    FX_BIDICLASS_AN		= 3,
+    FX_BIDICLASS_EN		= 4,
+    FX_BIDICLASS_AL		= 5,
+    FX_BIDICLASS_NSM	= 6,
+    FX_BIDICLASS_CS		= 7,
+    FX_BIDICLASS_ES		= 8,
+    FX_BIDICLASS_ET		= 9,
+    FX_BIDICLASS_BN		= 10,
+    FX_BIDICLASS_S		= 11,
+    FX_BIDICLASS_WS		= 12,
+    FX_BIDICLASS_B		= 13,
+    FX_BIDICLASS_RLO	= 14,
+    FX_BIDICLASS_RLE	= 15,
+    FX_BIDICLASS_LRO	= 16,
+    FX_BIDICLASS_LRE	= 17,
+    FX_BIDICLASS_PDF	= 18,
+    FX_BIDICLASS_N		= FX_BIDICLASS_ON,
+};
+#define FX_CHARTYPEBITS		11
+#define FX_CHARTYPEBITSMASK	(15 << FX_CHARTYPEBITS)
+enum FX_CHARTYPE {
+    FX_CHARTYPE_Unknown				= 0,
+    FX_CHARTYPE_Tab					= (1 << FX_CHARTYPEBITS),
+    FX_CHARTYPE_Space				= (2 << FX_CHARTYPEBITS),
+    FX_CHARTYPE_Control				= (3 << FX_CHARTYPEBITS),
+    FX_CHARTYPE_Combination			= (4 << FX_CHARTYPEBITS),
+    FX_CHARTYPE_Numeric				= (5 << FX_CHARTYPEBITS),
+    FX_CHARTYPE_Normal				= (6 << FX_CHARTYPEBITS),
+    FX_CHARTYPE_ArabicAlef			= (7 << FX_CHARTYPEBITS),
+    FX_CHARTYPE_ArabicSpecial		= (8 << FX_CHARTYPEBITS),
+    FX_CHARTYPE_ArabicDistortion	= (9 << FX_CHARTYPEBITS),
+    FX_CHARTYPE_ArabicNormal		= (10 << FX_CHARTYPEBITS),
+    FX_CHARTYPE_ArabicForm			= (11 << FX_CHARTYPEBITS),
+    FX_CHARTYPE_Arabic				= (12 << FX_CHARTYPEBITS),
+};
+typedef struct _FX_CHARPROPERTIES {
+    union {
+        struct {
+            FX_DWORD	dwBreakType		: 6;
+            FX_DWORD	dwBidiClass		: 5;
+            FX_DWORD	dwCharType		: 4;
+            FX_DWORD	dwRotation		: 1;
+            FX_DWORD	dwCJKSpecial	: 1;
+            FX_DWORD	dwVertIndex		: 6;
+            FX_DWORD	dwBidiIndex		: 9;
+        };
+        FX_DWORD	dwCharProps;
+    };
+} FX_CHARPROPERTIES;
+FX_DWORD FX_GetUnicodeProperties(FX_WCHAR wch);
+FX_BOOL	FX_IsCtrlCode(FX_WCHAR ch);
+FX_BOOL	FX_IsRotationCode(FX_WCHAR ch);
+FX_BOOL FX_IsCombinationChar(FX_WCHAR wch);
+FX_BOOL	FX_IsBidiChar(FX_WCHAR wch);
+FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_BOOL bRTL, FX_BOOL bVertical);
+FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_DWORD dwProps, FX_BOOL bRTL, FX_BOOL bVertical);
+#endif
diff --git a/core/include/fxcrt/fx_xml.h b/core/include/fxcrt/fx_xml.h
new file mode 100644
index 0000000..1217677
--- /dev/null
+++ b/core/include/fxcrt/fx_xml.h
@@ -0,0 +1,209 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_XML_H_

+#define _FX_XML_H_

+#ifndef _FX_BASIC_H_

+#include "fx_basic.h"

+#endif

+class CXML_AttrItem : public CFX_Object

+{

+public:

+    CFX_ByteStringL	m_QSpaceName;

+    CFX_ByteStringL	m_AttrName;

+    CFX_WideStringL	m_Value;

+

+    void	Empty(IFX_Allocator* pAllocator = NULL)

+    {

+        m_QSpaceName.Empty(pAllocator);

+        m_AttrName.Empty(pAllocator);

+        m_Value.Empty(pAllocator);

+    }

+};

+class CXML_AttrMap : public CFX_Object

+{

+public:

+    CXML_AttrMap()

+    {

+        m_pMap = NULL;

+    }

+    ~CXML_AttrMap()

+    {

+        RemoveAll(NULL);

+    }

+    const CFX_WideStringL*	Lookup(FX_BSTR space, FX_BSTR name) const;

+    void					SetAt(FX_BSTR space, FX_BSTR name, FX_WSTR value, IFX_Allocator* pAllocator = NULL);

+    void					RemoveAt(FX_BSTR space, FX_BSTR name, IFX_Allocator* pAllocator = NULL);

+    void					RemoveAll(IFX_Allocator* pAllocator = NULL);

+    int						GetSize() const;

+    CXML_AttrItem&			GetAt(int index) const;

+    CFX_ObjectArray<CXML_AttrItem>*	m_pMap;

+};

+class CXML_Content : public CFX_Object

+{

+public:

+    CXML_Content() : m_bCDATA(FALSE), m_Content() {}

+    ~CXML_Content()

+    {

+        Empty(NULL);

+    }

+    void	Empty(IFX_Allocator* pAllocator = NULL)

+    {

+        m_Content.Empty(pAllocator);

+    }

+    void	Set(FX_BOOL bCDATA, FX_WSTR content, IFX_Allocator* pAllocator = NULL)

+    {

+        m_bCDATA = bCDATA;

+        m_Content.Set(content, pAllocator);

+    }

+    FX_BOOL			m_bCDATA;

+    CFX_WideStringL	m_Content;

+};

+class CXML_Element : public CFX_Object

+{

+public:

+

+    static CXML_Element*	Parse(const void* pBuffer, size_t size, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL, IFX_Allocator* pAllocator = NULL);

+

+    static CXML_Element*	Parse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL, IFX_Allocator* pAllocator = NULL);

+

+    static CXML_Element*	Parse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL, IFX_Allocator* pAllocator = NULL);

+

+    CXML_Element(FX_BSTR qSpace, FX_BSTR tagName, IFX_Allocator* pAllocator = NULL);

+

+    CXML_Element(FX_BSTR qTagName, IFX_Allocator* pAllocator = NULL);

+

+    CXML_Element(IFX_Allocator* pAllocator = NULL);

+

+    ~CXML_Element();

+

+    void	Empty();

+

+

+

+    CFX_ByteString			GetTagName(FX_BOOL bQualified = FALSE) const;

+    void					GetTagName(CFX_ByteStringL &tagName, FX_BOOL bQualified = FALSE) const;

+

+    CFX_ByteString			GetNamespace(FX_BOOL bQualified = FALSE) const;

+    void					GetNamespace(CFX_ByteStringL &nameSpace, FX_BOOL bQualified = FALSE) const;

+

+    CFX_ByteString			GetNamespaceURI(FX_BSTR qName) const;

+    void					GetNamespaceURI(FX_BSTR qName, CFX_ByteStringL &uri) const;

+

+    CXML_Element*			GetParent() const

+    {

+        return m_pParent;

+    }

+

+    FX_DWORD				CountAttrs() const

+    {

+        return m_AttrMap.GetSize();

+    }

+

+    void					GetAttrByIndex(int index, CFX_ByteString &space, CFX_ByteString &name, CFX_WideString &value) const;

+    void					GetAttrByIndex(int index, CFX_ByteStringL &space, CFX_ByteStringL &name, CFX_WideStringL &value) const;

+

+    FX_BOOL					HasAttr(FX_BSTR qName) const;

+

+    FX_BOOL					GetAttrValue(FX_BSTR name, CFX_WideString& attribute) const;

+    CFX_WideString			GetAttrValue(FX_BSTR name) const

+    {

+        CFX_WideString attr;

+        GetAttrValue(name, attr);

+        return attr;

+    }

+    const CFX_WideStringL*	GetAttrValuePtr(FX_BSTR name) const;

+

+    FX_BOOL					GetAttrValue(FX_BSTR space, FX_BSTR name, CFX_WideString& attribute) const;

+    CFX_WideString			GetAttrValue(FX_BSTR space, FX_BSTR name) const

+    {

+        CFX_WideString attr;

+        GetAttrValue(space, name, attr);

+        return attr;

+    }

+    const CFX_WideStringL*	GetAttrValuePtr(FX_BSTR space, FX_BSTR name) const;

+

+    FX_BOOL					GetAttrInteger(FX_BSTR name, int& attribute) const;

+    int						GetAttrInteger(FX_BSTR name) const

+    {

+        int attr = 0;

+        GetAttrInteger(name, attr);

+        return attr;

+    }

+

+    FX_BOOL					GetAttrInteger(FX_BSTR space, FX_BSTR name, int& attribute) const;

+    int						GetAttrInteger(FX_BSTR space, FX_BSTR name) const

+    {

+        int attr = 0;

+        GetAttrInteger(space, name, attr);

+        return attr;

+    }

+

+    FX_BOOL					GetAttrFloat(FX_BSTR name, FX_FLOAT& attribute) const;

+    FX_FLOAT				GetAttrFloat(FX_BSTR name) const

+    {

+        FX_FLOAT attr = 0;

+        GetAttrFloat(name, attr);

+        return attr;

+    }

+

+    FX_BOOL					GetAttrFloat(FX_BSTR space, FX_BSTR name, FX_FLOAT& attribute) const;

+    FX_FLOAT				GetAttrFloat(FX_BSTR space, FX_BSTR name) const

+    {

+        FX_FLOAT attr = 0;

+        GetAttrFloat(space, name, attr);

+        return attr;

+    }

+

+    FX_DWORD				CountChildren() const;

+

+    enum ChildType { Invalid, Element, Content};

+

+    ChildType				GetChildType(FX_DWORD index) const;

+

+    CFX_WideString			GetContent(FX_DWORD index) const;

+    const CFX_WideStringL*	GetContentPtr(FX_DWORD index) const;

+

+    CXML_Element*			GetElement(FX_DWORD index) const;

+

+    CXML_Element*			GetElement(FX_BSTR space, FX_BSTR tag) const

+    {

+        return GetElement(space, tag, 0);

+    }

+

+    FX_DWORD				CountElements(FX_BSTR space, FX_BSTR tag) const;

+

+    CXML_Element*			GetElement(FX_BSTR space, FX_BSTR tag, int index) const;

+

+    FX_DWORD				FindElement(CXML_Element *pChild) const;

+

+

+

+

+    void					SetTag(FX_BSTR qSpace, FX_BSTR tagname);

+

+    void					SetTag(FX_BSTR qTagName);

+

+    void					RemoveChildren();

+

+    void					RemoveChild(FX_DWORD index);

+

+

+protected:

+

+    CXML_Element*			m_pParent;

+

+    CFX_ByteStringL			m_QSpaceName;

+

+    CFX_ByteStringL			m_TagName;

+

+    CXML_AttrMap			m_AttrMap;

+

+    CFX_PtrArray			m_Children;

+    friend class CXML_Parser;

+    friend class CXML_Composer;

+};

+#endif

diff --git a/core/include/fxge/fpf.h b/core/include/fxge/fpf.h
new file mode 100644
index 0000000..99d9b7c
--- /dev/null
+++ b/core/include/fxge/fpf.h
@@ -0,0 +1,55 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_PALTFORM_DEVICE_H_
+#define _FX_PALTFORM_DEVICE_H_
+class IFPF_DeviceModule;
+class IFPF_FontMgr;
+class IFPF_Font;
+class IFPF_DeviceModule
+{
+public:
+    virtual void				Destroy() = 0;
+    virtual IFPF_FontMgr*		GetFontMgr() = 0;
+};
+IFPF_DeviceModule*	FPF_GetDeviceModule();
+#define FPF_MATCHFONT_REPLACEANSI		1
+FX_DEFINEHANDLE(FPF_HFONT);
+class IFPF_Font
+{
+public:
+    virtual void			Release() = 0;
+    virtual IFPF_Font*		Retain() = 0;
+    virtual FPF_HFONT		GetHandle() = 0;
+    virtual CFX_ByteString	GetFamilyName() = 0;
+    virtual CFX_WideString	GetPsName() = 0;
+    virtual FX_DWORD		GetFontStyle() const = 0;
+    virtual FX_BYTE			GetCharset() const = 0;
+
+    virtual FX_INT32		GetGlyphIndex(FX_WCHAR wUnicode) = 0;
+    virtual FX_INT32		GetGlyphWidth(FX_INT32 iGlyphIndex) = 0;
+
+    virtual FX_INT32		GetAscent() const = 0;
+    virtual FX_INT32		GetDescent() const = 0;
+
+    virtual FX_BOOL			GetGlyphBBox(FX_INT32 iGlyphIndex, FX_RECT &rtBBox) = 0;
+    virtual FX_BOOL			GetBBox(FX_RECT &rtBBox) = 0;
+
+    virtual FX_INT32		GetHeight() const = 0;
+    virtual FX_INT32		GetItalicAngle() const = 0;
+    virtual FX_DWORD		GetFontData(FX_DWORD dwTable, FX_LPBYTE pBuffer, FX_DWORD dwSize) = 0;
+};
+class IFPF_FontMgr
+{
+public:
+    virtual void			LoadSystemFonts() = 0;
+    virtual void			LoadPrivateFont(IFX_FileRead* pFontFile) = 0;
+    virtual void			LoadPrivateFont(FX_BSTR bsFileName) = 0;
+    virtual void			LoadPrivateFont(FX_LPVOID pBuffer, size_t szBuffer) = 0;
+
+    virtual IFPF_Font*		CreateFont(FX_BSTR bsFamilyname, FX_BYTE charset, FX_DWORD dwStyle, FX_DWORD dwMatch = 0) = 0;
+};
+#endif
diff --git a/core/include/fxge/fx_dib.h b/core/include/fxge/fx_dib.h
new file mode 100644
index 0000000..7aa3bf8
--- /dev/null
+++ b/core/include/fxge/fx_dib.h
@@ -0,0 +1,606 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_DIB_H_

+#define _FPDF_DIB_H_

+#ifndef _FXCRT_EXTENSION_

+#include "../fxcrt/fx_ext.h"

+#endif

+enum FXDIB_Format {

+    FXDIB_Invalid = 0,

+    FXDIB_1bppMask = 0x101,

+    FXDIB_1bppRgb = 0x001,

+    FXDIB_1bppCmyk = 0x401,

+    FXDIB_8bppMask = 0x108,

+    FXDIB_8bppRgb = 0x008,

+    FXDIB_8bppRgba = 0x208,

+    FXDIB_8bppCmyk = 0x408,

+    FXDIB_8bppCmyka = 0x608,

+    FXDIB_Rgb = 0x018,

+    FXDIB_Rgba = 0x218,

+    FXDIB_Rgb32 = 0x020,

+    FXDIB_Argb = 0x220,

+    FXDIB_Cmyk = 0x420,

+    FXDIB_Cmyka = 0x620,

+};

+enum FXDIB_Channel {

+    FXDIB_Red = 1,

+    FXDIB_Green,

+    FXDIB_Blue,

+    FXDIB_Cyan,

+    FXDIB_Magenta,

+    FXDIB_Yellow,

+    FXDIB_Black,

+    FXDIB_Alpha

+};

+#define FXDIB_DOWNSAMPLE		0x04

+#define FXDIB_INTERPOL			0x20

+#define FXDIB_BICUBIC_INTERPOL  0x80

+#define FXDIB_NOSMOOTH			0x100

+#define FXDIB_PALETTE_LOC		0x01

+#define FXDIB_PALETTE_WIN		0x02

+#define FXDIB_PALETTE_MAC		0x04

+#define FXDIB_BLEND_NORMAL			0

+#define FXDIB_BLEND_MULTIPLY		1

+#define FXDIB_BLEND_SCREEN			2

+#define FXDIB_BLEND_OVERLAY			3

+#define FXDIB_BLEND_DARKEN			4

+#define FXDIB_BLEND_LIGHTEN			5

+

+#define FXDIB_BLEND_COLORDODGE		6

+#define FXDIB_BLEND_COLORBURN		7

+#define FXDIB_BLEND_HARDLIGHT		8

+#define FXDIB_BLEND_SOFTLIGHT		9

+#define FXDIB_BLEND_DIFFERENCE		10

+#define FXDIB_BLEND_EXCLUSION		11

+#define FXDIB_BLEND_NONSEPARABLE	21

+#define FXDIB_BLEND_HUE				21

+#define FXDIB_BLEND_SATURATION		22

+#define FXDIB_BLEND_COLOR			23

+#define FXDIB_BLEND_LUMINOSITY		24

+#define FXDIB_BLEND_UNSUPPORTED		-1

+typedef FX_DWORD	FX_ARGB;

+typedef FX_DWORD	FX_COLORREF;

+typedef FX_DWORD	FX_CMYK;

+class CFX_ClipRgn;

+class CFX_DIBSource;

+class CFX_DIBitmap;

+#define FXSYS_RGB(r, g, b)  ((r) | ((g) << 8) | ((b) << 16))

+#define FXSYS_GetRValue(rgb) ((rgb) & 0xff)

+#define FXSYS_GetGValue(rgb) (((rgb) >> 8) & 0xff)

+#define FXSYS_GetBValue(rgb) (((rgb) >> 16) & 0xff)

+#define FX_CCOLOR(val) (255-(val))

+#define FXSYS_CMYK(c, m, y, k) (((c) << 24) | ((m) << 16) | ((y) << 8) | (k))

+#define FXSYS_GetCValue(cmyk) ((FX_BYTE)((cmyk) >> 24) & 0xff)

+#define FXSYS_GetMValue(cmyk) ((FX_BYTE)((cmyk) >> 16) & 0xff)

+#define FXSYS_GetYValue(cmyk) ((FX_BYTE)((cmyk) >> 8) & 0xff)

+#define FXSYS_GetKValue(cmyk) ((FX_BYTE)(cmyk) & 0xff)

+void CmykDecode(FX_CMYK cmyk, int& c, int& m, int& y, int& k);

+inline FX_CMYK CmykEncode(int c, int m, int y, int k)

+{

+    return (c << 24) | (m << 16) | (y << 8) | k;

+}

+void ArgbDecode(FX_ARGB argb, int& a, int& r, int&g, int& b);

+void ArgbDecode(FX_ARGB argb, int& a, FX_COLORREF& rgb);

+inline FX_ARGB ArgbEncode(int a, int r, int g, int b)

+{

+    return (a << 24) | (r << 16) | (g << 8) | b;

+}

+FX_ARGB ArgbEncode(int a, FX_COLORREF rgb);

+#define FXARGB_A(argb) ((FX_BYTE)((argb) >> 24))

+#define FXARGB_R(argb) ((FX_BYTE)((argb) >> 16))

+#define FXARGB_G(argb) ((FX_BYTE)((argb) >> 8))

+#define FXARGB_B(argb) ((FX_BYTE)(argb))

+#define FXARGB_MAKE(a,r,g,b) (((FX_DWORD)(a) << 24) | ((r) << 16) | ((g) << 8) | (b))

+#define FXARGB_MUL_ALPHA(argb, alpha) (((((argb) >> 24) * (alpha) / 255) << 24) | ((argb) & 0xffffff))

+#define FXRGB2GRAY(r,g,b) (((b) * 11 + (g) * 59 + (r) * 30) / 100)

+#define FXCMYK2GRAY(c,m,y,k) (((255-(c)) * (255-(k)) * 30 + (255-(m)) * (255-(k)) * 59 + (255-(y)) * (255-(k)) * 11) / 25500)

+#define FXDIB_ALPHA_MERGE(backdrop, source, source_alpha) (((backdrop) * (255-(source_alpha)) + (source)*(source_alpha))/255)

+#define FXDIB_ALPHA_UNION(dest, src) ((dest) + (src) - (dest)*(src)/255)

+#define FXCMYK_GETDIB(p) ((((FX_LPBYTE)(p))[0] << 24 | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | ((FX_LPBYTE)(p))[3]))

+#define FXCMYK_SETDIB(p, cmyk)  ((FX_LPBYTE)(p))[0] = (FX_BYTE)((cmyk) >> 24), \

+        ((FX_LPBYTE)(p))[1] = (FX_BYTE)((cmyk) >> 16), \

+                              ((FX_LPBYTE)(p))[2] = (FX_BYTE)((cmyk) >> 8), \

+                                      ((FX_LPBYTE)(p))[3] = (FX_BYTE)(cmyk))

+#define FXARGB_GETDIB(p) (((FX_LPBYTE)(p))[0]) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[3] << 24)

+#define FXARGB_SETDIB(p, argb) ((FX_LPBYTE)(p))[0] = (FX_BYTE)(argb), \

+        ((FX_LPBYTE)(p))[1] = (FX_BYTE)((argb) >> 8), \

+                              ((FX_LPBYTE)(p))[2] = (FX_BYTE)((argb) >> 16), \

+                                      ((FX_LPBYTE)(p))[3] = (FX_BYTE)((argb) >> 24)

+#define FXARGB_COPY(dest, src) *(FX_LPBYTE)(dest) = *(FX_LPBYTE)(src), \

+        *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \

+                                 *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src)+2), \

+                                         *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3)

+#define FXCMYK_COPY(dest, src)  *(FX_LPBYTE)(dest) = *(FX_LPBYTE)(src), \

+        *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \

+                                 *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src)+2), \

+                                         *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3)

+#define FXARGB_SETRGBORDERDIB(p, argb) ((FX_LPBYTE)(p))[3] = (FX_BYTE)(argb>>24), \

+        ((FX_LPBYTE)(p))[0] = (FX_BYTE)((argb) >> 16), \

+                              ((FX_LPBYTE)(p))[1] = (FX_BYTE)((argb) >> 8), \

+                                      ((FX_LPBYTE)(p))[2] = (FX_BYTE)(argb)

+#define FXARGB_GETRGBORDERDIB(p) (((FX_LPBYTE)(p))[2]) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0] << 16) | (((FX_LPBYTE)(p))[3] << 24)

+#define FXARGB_RGBORDERCOPY(dest, src) *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3), \

+        *(FX_LPBYTE)(dest) = *((FX_LPBYTE)(src)+2), \

+                             *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \

+                                     *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src))

+#define FXARGB_TODIB(argb) (argb)

+#define FXCMYK_TODIB(cmyk) ((FX_BYTE)((cmyk) >> 24) | ((FX_BYTE)((cmyk) >> 16)) << 8 | ((FX_BYTE)((cmyk) >> 8)) << 16 | ((FX_BYTE)(cmyk) << 24))

+#define FXARGB_TOBGRORDERDIB(argb) ((FX_BYTE)(argb>>16) | ((FX_BYTE)(argb>>8)) << 8 | ((FX_BYTE)(argb)) << 16 | ((FX_BYTE)(argb>>24) << 24))

+#define FXGETFLAG_COLORTYPE(flag)			(FX_BYTE)((flag)>>8)

+#define FXGETFLAG_ALPHA_FILL(flag)			(FX_BYTE)(flag)

+#define FXGETFLAG_ALPHA_STROKE(flag)		(FX_BYTE)((flag)>>16)

+#define FXSETFLAG_COLORTYPE(flag, val)		flag = (((val)<<8)|(flag&0xffff00ff))

+#define FXSETFLAG_ALPHA_FILL(flag, val)		flag = ((val)|(flag&0xffffff00))

+#define FXSETFLAG_ALPHA_STROKE(flag, val)	flag = (((val)<<16)|(flag&0xff00ffff))

+class CFX_DIBSource : public CFX_Object

+{

+public:

+

+    virtual			~CFX_DIBSource();

+

+

+

+    int				GetWidth() const

+    {

+        return m_Width;

+    }

+

+    int				GetHeight() const

+    {

+        return m_Height;

+    }

+

+    FXDIB_Format	GetFormat() const

+    {

+        return (FXDIB_Format)(m_AlphaFlag * 0x100 + m_bpp);

+    }

+

+    FX_DWORD		GetPitch() const

+    {

+        return m_Pitch;

+    }

+

+    FX_DWORD*		GetPalette() const

+    {

+        return m_pPalette;

+    }

+

+

+

+    virtual	FX_LPBYTE	GetBuffer() const

+    {

+        return NULL;

+    }

+

+    virtual FX_LPCBYTE	GetScanline(int line) const = 0;

+

+    virtual FX_BOOL		SkipToScanline(int line, IFX_Pause* pPause) const

+    {

+        return FALSE;

+    }

+

+    virtual void		DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,

+                                           int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const = 0;

+

+    virtual void		SetDownSampleSize(int width, int height) const {}

+

+    int				GetBPP() const

+    {

+        return m_bpp;

+    }

+

+    FX_BOOL			IsAlphaMask() const

+    {

+        return m_AlphaFlag == 1;

+    }

+

+    FX_BOOL			HasAlpha() const

+    {

+        return m_AlphaFlag & 2 ? TRUE : FALSE;

+    }

+

+    FX_BOOL			IsOpaqueImage() const

+    {

+        return !(m_AlphaFlag & 3);

+    }

+

+    FX_BOOL			IsCmykImage() const

+    {

+        return m_AlphaFlag & 4 ? TRUE : FALSE;

+    }

+

+

+

+    int				GetPaletteSize() const

+    {

+        return IsAlphaMask() ? 0 : (m_bpp == 1 ? 2 : (m_bpp == 8 ? 256 : 0));

+    }

+

+    FX_DWORD		GetPaletteEntry(int index) const;

+

+    void			SetPaletteEntry(int index, FX_DWORD color);

+    FX_DWORD		GetPaletteArgb(int index) const

+    {

+        return GetPaletteEntry(index);

+    }

+    void			SetPaletteArgb(int index, FX_DWORD color)

+    {

+        SetPaletteEntry(index, color);

+    }

+

+    void			CopyPalette(const FX_DWORD* pSrcPal, FX_DWORD size = 256);

+

+

+    CFX_DIBitmap*	Clone(const FX_RECT* pClip = NULL) const;

+

+    CFX_DIBitmap*	CloneConvert(FXDIB_Format format, const FX_RECT* pClip = NULL, void* pIccTransform = NULL) const;

+

+    CFX_DIBitmap*	StretchTo(int dest_width, int dest_height, FX_DWORD flags = 0, const FX_RECT* pClip = NULL) const;

+

+

+    CFX_DIBitmap*	TransformTo(const CFX_AffineMatrix* pMatrix, int& left, int &top,

+                                FX_DWORD flags = 0, const FX_RECT* pClip = NULL) const;

+

+    CFX_DIBitmap*	GetAlphaMask(const FX_RECT* pClip = NULL) const;

+

+    FX_BOOL			CopyAlphaMask(const CFX_DIBSource* pAlphaMask, const FX_RECT* pClip = NULL);

+

+    CFX_DIBitmap*	SwapXY(FX_BOOL bXFlip, FX_BOOL bYFlip, const FX_RECT* pClip = NULL) const;

+

+    CFX_DIBitmap*	FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const;

+

+    void			GetOverlapRect(int& dest_left, int& dest_top, int& width, int& height, int src_width,

+                                   int src_height, int& src_left, int& src_top, const CFX_ClipRgn* pClipRgn);

+

+    CFX_DIBitmap*	m_pAlphaMask;

+protected:

+

+    CFX_DIBSource();

+

+    int				m_Width;

+

+    int				m_Height;

+

+    int				m_bpp;

+

+    FX_DWORD		m_AlphaFlag;

+

+    FX_DWORD		m_Pitch;

+

+    FX_DWORD*		m_pPalette;

+

+    void			BuildPalette();

+

+    FX_BOOL			BuildAlphaMask();

+

+    int				FindPalette(FX_DWORD color) const;

+

+    void			GetPalette(FX_DWORD* pal, int alpha) const;

+};

+class CFX_DIBitmap : public CFX_DIBSource

+{

+public:

+

+    virtual ~CFX_DIBitmap();

+

+    CFX_DIBitmap();

+

+    CFX_DIBitmap(const CFX_DIBitmap& src);

+

+    FX_BOOL			Create(int width, int height, FXDIB_Format format, FX_LPBYTE pBuffer = NULL, int pitch = 0);

+

+    FX_BOOL			Copy(const CFX_DIBSource* pSrc);

+

+    virtual	FX_LPBYTE	GetBuffer() const

+    {

+        return m_pBuffer;

+    }

+

+    virtual FX_LPCBYTE	GetScanline(int line) const

+    {

+        return m_pBuffer ? m_pBuffer + line * m_Pitch : NULL;

+    }

+

+    virtual void	DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,

+                                       int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;

+

+    void			TakeOver(CFX_DIBitmap* pSrcBitmap);

+

+    FX_BOOL			ConvertFormat(FXDIB_Format format, void* pIccTransform = NULL);

+

+    void			Clear(FX_DWORD color);

+

+    FX_DWORD		GetPixel(int x, int y) const;

+

+    void			SetPixel(int x, int y, FX_DWORD color);

+

+    FX_BOOL			LoadChannel(FXDIB_Channel destChannel, const CFX_DIBSource* pSrcBitmap, FXDIB_Channel srcChannel);

+

+    FX_BOOL			LoadChannel(FXDIB_Channel destChannel, int value);

+

+    FX_BOOL			MultiplyAlpha(int alpha);

+

+    FX_BOOL			MultiplyAlpha(const CFX_DIBSource* pAlphaMask);

+

+    FX_BOOL			TransferBitmap(int dest_left, int dest_top, int width, int height,

+                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform = NULL);

+

+    FX_BOOL			CompositeBitmap(int dest_left, int dest_top, int width, int height,

+                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top,

+                                    int blend_type = FXDIB_BLEND_NORMAL, const CFX_ClipRgn* pClipRgn = NULL, FX_BOOL bRgbByteOrder = FALSE, void* pIccTransform = NULL);

+

+    FX_BOOL			TransferMask(int dest_left, int dest_top, int width, int height,

+                                 const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, int alpha_flag = 0, void* pIccTransform = NULL);

+

+    FX_BOOL			CompositeMask(int dest_left, int dest_top, int width, int height,

+                                  const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top,

+                                  int blend_type = FXDIB_BLEND_NORMAL, const CFX_ClipRgn* pClipRgn = NULL, FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL);

+

+    FX_BOOL			CompositeRect(int dest_left, int dest_top, int width, int height, FX_DWORD color, int alpha_flag = 0, void* pIccTransform = NULL);

+

+    FX_BOOL			ConvertColorScale(FX_DWORD forecolor, FX_DWORD backcolor);

+

+    FX_BOOL			DitherFS(const FX_DWORD* pPalette, int pal_size, const FX_RECT* pRect = NULL);

+protected:

+

+    FX_LPBYTE		m_pBuffer;

+

+    FX_BOOL			m_bExtBuf;

+

+    FX_BOOL			GetGrayData(void* pIccTransform = NULL);

+};

+class CFX_DIBExtractor : public CFX_Object

+{

+public:

+

+    CFX_DIBExtractor(const CFX_DIBSource* pSrc);

+

+    ~CFX_DIBExtractor();

+

+    operator CFX_DIBitmap*()

+    {

+        return m_pBitmap;

+    }

+private:

+

+    CFX_DIBitmap*			m_pBitmap;

+};

+typedef CFX_CountRef<CFX_DIBitmap> CFX_DIBitmapRef;

+class CFX_FilteredDIB : public CFX_DIBSource

+{

+public:

+

+    CFX_FilteredDIB();

+

+    ~CFX_FilteredDIB();

+

+    void					LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc = FALSE);

+

+    virtual FXDIB_Format	GetDestFormat() = 0;

+

+    virtual FX_DWORD*		GetDestPalette() = 0;

+

+

+    virtual void			TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const = 0;

+

+    virtual void			TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const = 0;

+protected:

+    virtual FX_LPCBYTE		GetScanline(int line) const;

+    virtual void			DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,

+            int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;

+

+    const CFX_DIBSource*	m_pSrc;

+

+    FX_BOOL					m_bAutoDropSrc;

+

+    FX_LPBYTE				m_pScanline;

+};

+class IFX_ScanlineComposer

+{

+public:

+

+    virtual	void		ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha = NULL) = 0;

+

+

+    virtual FX_BOOL		SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette) = 0;

+};

+class CFX_ScanlineCompositor : public CFX_Object

+{

+public:

+

+    CFX_ScanlineCompositor();

+

+    ~CFX_ScanlineCompositor();

+

+    FX_BOOL				Init(FXDIB_Format dest_format, FXDIB_Format src_format, FX_INT32 width, FX_DWORD* pSrcPalette,

+                             FX_DWORD mask_color, int blend_type, FX_BOOL bClip, FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL);

+

+

+    void				CompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,

+            FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);

+

+

+    void				CompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,

+            FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);

+

+

+    void				CompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,

+            FX_LPBYTE dst_extra_alpha = NULL);

+

+

+    void				CompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,

+            FX_LPBYTE dst_extra_alpha = NULL);

+protected:

+    int					m_Transparency;

+    FXDIB_Format		m_SrcFormat,

+                        m_DestFormat;

+    FX_DWORD*			m_pSrcPalette;

+

+    int					m_MaskAlpha,

+                        m_MaskRed,

+                        m_MaskGreen,

+                        m_MaskBlue,

+                        m_MaskBlack;

+    int					m_BlendType;

+    void*				m_pIccTransform;

+    FX_LPBYTE			m_pCacheScanline;

+    int					m_CacheSize;

+    FX_BOOL             m_bRgbByteOrder;

+};

+class CFX_BitmapComposer : public IFX_ScanlineComposer, public CFX_Object

+{

+public:

+

+    CFX_BitmapComposer();

+

+    ~CFX_BitmapComposer();

+

+

+    void				Compose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRgn, int bitmap_alpha,

+                                FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOOL bVertical,

+                                FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByteOrder = FALSE,

+                                int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);

+

+    virtual FX_BOOL		SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette);

+

+

+    virtual	void		ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha);

+protected:

+

+    void				DoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,

+                                  FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);

+    CFX_DIBitmap*		m_pBitmap;

+    const CFX_ClipRgn*	m_pClipRgn;

+    FXDIB_Format		m_SrcFormat;

+    int					m_DestLeft, m_DestTop, m_DestWidth, m_DestHeight, m_BitmapAlpha;

+    FX_DWORD			m_MaskColor;

+    const CFX_DIBitmap*	m_pClipMask;

+    CFX_ScanlineCompositor	m_Compositor;

+    FX_BOOL				m_bVertical, m_bFlipX, m_bFlipY;

+    int					m_AlphaFlag;

+    void*				m_pIccTransform;

+    FX_BOOL             m_bRgbByteOrder;

+    int					m_BlendType;

+    void				ComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha = NULL);

+    FX_LPBYTE			m_pScanlineV, m_pClipScanV, m_pAddClipScan, m_pScanlineAlphaV;

+};

+class CFX_BitmapStorer : public IFX_ScanlineComposer, public CFX_Object

+{

+public:

+

+    CFX_BitmapStorer();

+

+    ~CFX_BitmapStorer();

+

+    virtual	void		ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha);

+

+    virtual FX_BOOL		SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette);

+

+    CFX_DIBitmap*		GetBitmap()

+    {

+        return m_pBitmap;

+    }

+

+    CFX_DIBitmap*		Detach();

+

+    void				Replace(CFX_DIBitmap* pBitmap);

+private:

+    CFX_DIBitmap*		m_pBitmap;

+};

+class CStretchEngine;

+class CFX_ImageStretcher : public CFX_Object

+{

+public:

+

+    CFX_ImageStretcher();

+

+    ~CFX_ImageStretcher();

+

+    FX_INT32		Start(IFX_ScanlineComposer* pDest, const CFX_DIBSource* pBitmap,

+                          int dest_width, int dest_height, const FX_RECT& bitmap_rect, FX_DWORD flags);

+

+

+    FX_INT32		Continue(IFX_Pause* pPause);

+    IFX_ScanlineComposer*	m_pDest;

+    const CFX_DIBSource*	m_pSource;

+    CStretchEngine*		m_pStretchEngine;

+    FX_DWORD		m_Flags;

+    FX_BOOL			m_bFlipX,

+                    m_bFlipY;

+    int				m_DestWidth,

+                    m_DestHeight;

+    FX_RECT			m_ClipRect;

+    int				m_LineIndex;

+    int				m_DestBPP;

+    FX_LPBYTE		m_pScanline;

+    FX_LPBYTE       m_pMaskScanline;

+    FXDIB_Format	m_DestFormat;

+    FX_INT32		m_Status;

+

+    FX_INT32		StartQuickStretch();

+

+    FX_INT32		StartStretch();

+

+    FX_INT32		ContinueQuickStretch(IFX_Pause* pPause);

+

+    FX_INT32		ContinueStretch(IFX_Pause* pPause);

+};

+class CFX_ImageTransformer : public CFX_Object

+{

+public:

+

+    CFX_ImageTransformer();

+

+    ~CFX_ImageTransformer();

+

+    FX_INT32	Start(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pMatrix, int flags, const FX_RECT* pClip);

+

+

+    FX_INT32	Continue(IFX_Pause* pPause);

+    CFX_AffineMatrix* m_pMatrix;

+    FX_RECT		m_StretchClip;

+    int			m_ResultLeft, m_ResultTop, m_ResultWidth, m_ResultHeight;

+    CFX_AffineMatrix	m_dest2stretch;

+    CFX_ImageStretcher	m_Stretcher;

+    CFX_BitmapStorer	m_Storer;

+    FX_DWORD	m_Flags;

+    int			m_Status;

+};

+class CFX_ImageRenderer : public CFX_Object

+{

+public:

+

+    CFX_ImageRenderer();

+

+    ~CFX_ImageRenderer();

+

+    FX_INT32			Start(CFX_DIBitmap* pDevice, const CFX_ClipRgn* pClipRgn,

+                              const CFX_DIBSource* pSource, int bitmap_alpha,

+                              FX_DWORD mask_color, const CFX_AffineMatrix* pMatrix, FX_DWORD dib_flags,

+                              FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL,

+                              int blend_type = FXDIB_BLEND_NORMAL);

+

+    FX_INT32			Continue(IFX_Pause* pPause);

+protected:

+    CFX_DIBitmap*		m_pDevice;

+    const CFX_ClipRgn*	m_pClipRgn;

+    int					m_BitmapAlpha;

+    FX_DWORD			m_MaskColor;

+    CFX_AffineMatrix	m_Matrix;

+    CFX_ImageTransformer*	m_pTransformer;

+    CFX_ImageStretcher	m_Stretcher;

+    CFX_BitmapComposer	m_Composer;

+    int					m_Status;

+    int					m_DestLeft, m_DestTop;

+    FX_RECT				m_ClipBox;

+    FX_DWORD			m_Flags;

+    int					m_AlphaFlag;

+    void*				m_pIccTransform;

+    FX_BOOL				m_bRgbByteOrder;

+    int					m_BlendType;

+};

+#endif

diff --git a/core/include/fxge/fx_font.h b/core/include/fxge/fx_font.h
new file mode 100644
index 0000000..abfa9b8
--- /dev/null
+++ b/core/include/fxge/fx_font.h
@@ -0,0 +1,428 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_FONT_H_

+#define _FX_FONT_H_

+#ifndef _FXCRT_EXTENSION_

+#include "../../include/fxcrt/fx_ext.h"

+#endif

+#ifndef _FX_DIB_H_

+#include "fx_dib.h"

+#endif

+typedef struct FT_FaceRec_* FXFT_Face;

+typedef void* FXFT_Library;

+class IFX_FontEncoding;

+class CFX_PathData;

+class CFX_SubstFont;

+class CFX_FaceCache;

+class IFX_FontMapper;

+class CFX_FontMapper;

+class IFX_SystemFontInfo;

+class CFontFileFaceInfo;

+#define FXFONT_FIXED_PITCH		0x01

+#define FXFONT_SERIF			0x02

+#define FXFONT_SYMBOLIC			0x04

+#define FXFONT_SCRIPT			0x08

+#define FXFONT_ITALIC			0x40

+#define FXFONT_BOLD				0x40000

+#define FXFONT_USEEXTERNATTR	0x80000

+#define FXFONT_CIDFONT			0x100000

+#define FXFONT_ANSI_CHARSET		0

+#define FXFONT_DEFAULT_CHARSET	1

+#define FXFONT_SYMBOL_CHARSET	2

+#define FXFONT_SHIFTJIS_CHARSET	128

+#define FXFONT_HANGEUL_CHARSET	129

+#define FXFONT_GB2312_CHARSET	134

+#define FXFONT_CHINESEBIG5_CHARSET	136

+#define FXFONT_THAI_CHARSET		222

+#define FXFONT_EASTEUROPE_CHARSET	238

+#define FXFONT_RUSSIAN_CHARSET	204

+#define FXFONT_GREEK_CHARSET	161

+#define FXFONT_TURKISH_CHARSET	162

+#define FXFONT_HEBREW_CHARSET	177

+#define FXFONT_ARABIC_CHARSET	178

+#define FXFONT_BALTIC_CHARSET	186

+#define FXFONT_FF_FIXEDPITCH	1

+#define FXFONT_FF_ROMAN			(1<<4)

+#define FXFONT_FF_SCRIPT		(4<<4)

+#define FXFONT_FW_NORMAL		400

+#define FXFONT_FW_BOLD			700

+class CFX_Font : public CFX_Object

+{

+public:

+    CFX_Font();

+    ~CFX_Font();

+

+    FX_BOOL					LoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,

+                                      int weight, int italic_angle, int CharsetCP, FX_BOOL bVertical = FALSE);

+

+    FX_BOOL					LoadEmbedded(FX_LPCBYTE data, FX_DWORD size);

+

+    FX_BOOL					LoadFile(IFX_FileRead* pFile);

+

+    FXFT_Face				GetFace() const

+    {

+        return m_Face;

+    }

+

+

+    const CFX_SubstFont*	GetSubstFont() const

+    {

+        return m_pSubstFont;

+    }

+

+    CFX_PathData*			LoadGlyphPath(FX_DWORD glyph_index, int dest_width = 0);

+

+    int						GetGlyphWidth(FX_DWORD glyph_index);

+

+    int						GetAscent() const;

+

+    int						GetDescent() const;

+

+    FX_BOOL                 GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox);

+

+    FX_BOOL                 IsItalic();

+

+    FX_BOOL                 IsBold();

+

+    FX_BOOL                 IsFixedWidth();

+

+    FX_BOOL					IsVertical() const

+    {

+        return m_bVertical;

+    }

+

+    CFX_WideString          GetPsName() const;

+

+

+    CFX_ByteString          GetFamilyName() const;

+

+    CFX_ByteString          GetFaceName() const;

+

+

+    FX_BOOL                 IsTTFont();

+

+    FX_BOOL                 GetBBox(FX_RECT &bbox);

+

+    int                     GetHeight();

+

+    int                     GetULPos();

+

+    int                     GetULthickness();

+

+    int                     GetMaxAdvanceWidth();

+

+    FXFT_Face				m_Face;

+

+    CFX_SubstFont*			m_pSubstFont;

+    FX_BOOL					IsEmbedded()

+    {

+        return m_bEmbedded;

+    }

+

+    void					AdjustMMParams(int glyph_index, int width, int weight);

+    FX_LPBYTE				m_pFontDataAllocation;

+    FX_LPBYTE               m_pFontData;

+    FX_LPBYTE				m_pGsubData;

+    FX_DWORD                m_dwSize;

+    CFX_BinaryBuf           m_OtfFontData;

+    void*                   m_hHandle;

+    void*                   m_pPlatformFont;

+    void*                   m_pPlatformFontCollection;

+    void*                   m_pDwFont;

+    FX_BOOL                 m_bDwLoaded;

+    void                    ReleasePlatformResource();

+

+    void					DeleteFace();

+protected:

+

+    FX_BOOL					m_bEmbedded;

+    FX_BOOL					m_bVertical;

+    void*					m_pOwnedStream;

+};

+#define ENCODING_INTERNAL		0

+#define ENCODING_UNICODE		1

+class IFX_FontEncoding : public CFX_Object

+{

+public:

+    virtual ~IFX_FontEncoding() {}

+

+    virtual FX_DWORD		GlyphFromCharCode(FX_DWORD charcode) = 0;

+

+    virtual CFX_WideString	UnicodeFromCharCode(FX_DWORD charcode) const = 0;

+

+    virtual FX_DWORD		CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;

+};

+IFX_FontEncoding* FXGE_CreateUnicodeEncoding(CFX_Font* pFont);

+#define FXFONT_SUBST_MM				0x01

+#define FXFONT_SUBST_GLYPHPATH		0x04

+#define FXFONT_SUBST_CLEARTYPE		0x08

+#define FXFONT_SUBST_TRANSFORM		0x10

+#define FXFONT_SUBST_NONSYMBOL		0x20

+#define FXFONT_SUBST_EXACT			0x40

+#define FXFONT_SUBST_STANDARD		0x80

+class CFX_SubstFont : public CFX_Object

+{

+public:

+

+    CFX_SubstFont();

+

+    FX_LPVOID				m_ExtHandle;

+

+    CFX_ByteString			m_Family;

+

+    int						m_Charset;

+

+    FX_DWORD				m_SubstFlags;

+

+    int						m_Weight;

+

+    int						m_ItalicAngle;

+

+    FX_BOOL					m_bSubstOfCJK;

+

+    int						m_WeightCJK;

+

+    FX_BOOL					m_bItlicCJK;

+};

+#define FX_FONT_FLAG_SERIF              0x01

+#define FX_FONT_FLAG_FIXEDPITCH			0x02

+#define FX_FONT_FLAG_ITALIC				0x04

+#define FX_FONT_FLAG_BOLD				0x08

+#define FX_FONT_FLAG_SYMBOLIC_SYMBOL	0x10

+#define FX_FONT_FLAG_SYMBOLIC_DINGBATS	0x20

+#define FX_FONT_FLAG_MULTIPLEMASTER		0x40

+typedef struct {

+    FX_LPCBYTE	m_pFontData;

+    FX_DWORD	m_dwSize;

+} FoxitFonts;

+class CFX_FontMgr : public CFX_Object

+{

+public:

+    CFX_FontMgr();

+    ~CFX_FontMgr();

+    void			InitFTLibrary();

+    FXFT_Face		GetCachedFace(const CFX_ByteString& face_name,

+                                  int weight, FX_BOOL bItalic, FX_LPBYTE& pFontData);

+    FXFT_Face		AddCachedFace(const CFX_ByteString& face_name,

+                                  int weight, FX_BOOL bItalic, FX_LPBYTE pData, FX_DWORD size, int face_index);

+    FXFT_Face		GetCachedTTCFace(int ttc_size, FX_DWORD checksum,

+                                     int font_offset, FX_LPBYTE& pFontData);

+    FXFT_Face		AddCachedTTCFace(int ttc_size, FX_DWORD checksum,

+                                     FX_LPBYTE pData, FX_DWORD size, int font_offset);

+    FXFT_Face		GetFileFace(FX_LPCSTR filename, int face_index);

+    FXFT_Face		GetFixedFace(FX_LPCBYTE pData, FX_DWORD size, int face_index);

+    void			ReleaseFace(FXFT_Face face);

+    void			SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);

+    FXFT_Face		FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,

+                                  int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont);

+

+    void			FreeCache();

+

+    FX_BOOL			GetStandardFont(FX_LPCBYTE& pFontData, FX_DWORD& size, int index);

+    CFX_FontMapper*	m_pBuiltinMapper;

+    IFX_FontMapper*	m_pExtMapper;

+    CFX_MapByteStringToPtr	m_FaceMap;

+    FXFT_Library	m_FTLibrary;

+    FoxitFonts m_ExternalFonts[16];

+};

+class IFX_FontMapper : public CFX_Object

+{

+public:

+

+    virtual ~IFX_FontMapper() {}

+

+    virtual FXFT_Face	FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,

+                                      int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont) = 0;

+

+    CFX_FontMgr*		m_pFontMgr;

+};

+class IFX_FontEnumerator

+{

+public:

+

+    virtual void		HitFont() = 0;

+

+    virtual void		Finish() = 0;

+};

+class IFX_AdditionalFontEnum

+{

+public:

+    virtual int  CountFiles() = 0;

+    virtual IFX_FileStream* GetFontFile(int index) = 0;

+};

+class CFX_FontMapper : public IFX_FontMapper

+{

+public:

+    CFX_FontMapper();

+    virtual ~CFX_FontMapper();

+    void				SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);

+    IFX_SystemFontInfo*	GetSystemFontInfo()

+    {

+        return m_pFontInfo;

+    }

+    void				AddInstalledFont(const CFX_ByteString& name, int charset);

+    void				LoadInstalledFonts();

+    CFX_ByteStringArray	m_InstalledTTFonts;

+    void				SetFontEnumerator(IFX_FontEnumerator* pFontEnumerator)

+    {

+        m_pFontEnumerator = pFontEnumerator;

+    }

+    IFX_FontEnumerator*	GetFontEnumerator() const

+    {

+        return m_pFontEnumerator;

+    }

+    virtual FXFT_Face	FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,

+                                      int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont);

+private:

+    CFX_ByteString		GetPSNameFromTT(void* hFont);

+    CFX_ByteString		MatchInstalledFonts(const CFX_ByteString& norm_name);

+    FXFT_Face			UseInternalSubst(CFX_SubstFont* pSubstFont, int iBaseFont, int italic_angle, int weight, int picthfamily);

+

+    FX_BOOL				m_bListLoaded;

+    FXFT_Face			m_MMFaces[2];

+    CFX_ByteString		m_LastFamily;

+    CFX_DWordArray		m_CharsetArray;

+    CFX_ByteStringArray	m_FaceArray;

+    IFX_SystemFontInfo*	m_pFontInfo;

+    FXFT_Face			m_FoxitFaces[14];

+    IFX_FontEnumerator*		m_pFontEnumerator;

+};

+class IFX_SystemFontInfo : public CFX_Object

+{

+public:

+    static IFX_SystemFontInfo*	CreateDefault();

+    virtual void		Release() = 0;

+    virtual	FX_BOOL		EnumFontList(CFX_FontMapper* pMapper) = 0;

+    virtual void*		MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact) = 0;

+    virtual void*		GetFont(FX_LPCSTR face) = 0;

+    virtual FX_DWORD	GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size) = 0;

+    virtual FX_BOOL		GetFaceName(void* hFont, CFX_ByteString& name) = 0;

+    virtual FX_BOOL		GetFontCharset(void* hFont, int& charset) = 0;

+    virtual int			GetFaceIndex(void* hFont)

+    {

+        return 0;

+    }

+    virtual void		DeleteFont(void* hFont) = 0;

+    virtual void*       RetainFont(void* hFont)

+    {

+        return NULL;

+    }

+};

+class CFX_FolderFontInfo : public IFX_SystemFontInfo

+{

+public:

+    CFX_FolderFontInfo();

+    ~CFX_FolderFontInfo();

+    void				AddPath(FX_BSTR path);

+    virtual void		Release();

+    virtual	FX_BOOL		EnumFontList(CFX_FontMapper* pMapper);

+    virtual void*		MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);

+    virtual void*		GetFont(FX_LPCSTR face);

+    virtual FX_DWORD	GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);

+    virtual void		DeleteFont(void* hFont);

+    virtual	FX_BOOL		GetFaceName(void* hFont, CFX_ByteString& name);

+    virtual FX_BOOL		GetFontCharset(void* hFont, int& charset);

+protected:

+    CFX_MapByteStringToPtr	m_FontList;

+    CFX_ByteStringArray	m_PathList;

+    CFX_FontMapper*		m_pMapper;

+    void				ScanPath(CFX_ByteString& path);

+    void				ScanFile(CFX_ByteString& path);

+    void				ReportFace(CFX_ByteString& path, FXSYS_FILE* pFile, FX_DWORD filesize, FX_DWORD offset);

+};

+class CFX_CountedFaceCache : public CFX_Object

+{

+public:

+    CFX_FaceCache*	m_Obj;

+    FX_DWORD		m_nCount;

+};

+typedef CFX_MapPtrTemplate<FXFT_Face, CFX_CountedFaceCache*> CFX_FTCacheMap;

+class CFX_FontCache : public CFX_Object

+{

+public:

+    ~CFX_FontCache();

+    CFX_FaceCache*			GetCachedFace(CFX_Font* pFont);

+    void					ReleaseCachedFace(CFX_Font* pFont);

+    void					FreeCache(FX_BOOL bRelease = FALSE);

+

+private:

+    CFX_FTCacheMap			m_FTFaceMap;

+    CFX_FTCacheMap			m_ExtFaceMap;

+};

+class CFX_AutoFontCache

+{

+public:

+    CFX_AutoFontCache(CFX_FontCache* pFontCache, CFX_Font* pFont)

+        : m_pFontCache(pFontCache)

+        , m_pFont(pFont)

+    {

+    }

+    ~CFX_AutoFontCache()

+    {

+        m_pFontCache->ReleaseCachedFace(m_pFont);

+    }

+    CFX_FontCache* m_pFontCache;

+    CFX_Font* m_pFont;

+};

+#define FX_FONTCACHE_DEFINE(pFontCache, pFont) CFX_AutoFontCache autoFontCache((pFontCache), (pFont))

+class CFX_GlyphBitmap : public CFX_Object

+{

+public:

+    int						m_Top;

+    int						m_Left;

+    CFX_DIBitmap			m_Bitmap;

+};

+class CFX_FaceCache : public CFX_Object

+{

+public:

+    ~CFX_FaceCache();

+    const CFX_GlyphBitmap*	LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,

+                                            int dest_width, int anti_alias, int& text_flags);

+    const CFX_PathData*		LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width);

+

+

+    CFX_FaceCache(FXFT_Face face);

+private:

+    FXFT_Face				m_Face;

+    CFX_GlyphBitmap*		RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,

+                                        const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias);

+    CFX_GlyphBitmap*		RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index,

+            const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias);

+    CFX_GlyphBitmap*        LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix, CFX_ByteStringC& FaceGlyphsKey,

+            FX_DWORD glyph_index, FX_BOOL bFontStyle, int dest_width, int anti_alias);

+    CFX_MapByteStringToPtr	m_SizeMap;

+    CFX_MapPtrToPtr			m_PathMap;

+    CFX_DIBitmap*           m_pBitmap;

+    void*                   m_pPlatformGraphics;

+    void*                   m_pPlatformBitmap;

+    void*                   m_hDC;

+    void*                   m_hBitmap;

+    void*                   m_hOldBitmap;

+    void*                   m_hGdiFont;

+    void*                   m_hOldGdiFont;

+

+    void				    InitPlatform();

+    void				    DestroyPlatform();

+};

+typedef struct {

+    const CFX_GlyphBitmap*	m_pGlyph;

+    int					m_OriginX, m_OriginY;

+    FX_FLOAT			m_fOriginX, m_fOriginY;

+} FXTEXT_GLYPHPOS;

+FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);

+FX_BOOL	OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,

+                    CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb);

+FX_BOOL	OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,

+                   CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb);

+class IFX_GSUBTable

+{

+public:

+    virtual void	Release() = 0;

+    virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum) = 0;

+};

+IFX_GSUBTable* FXGE_CreateGSUBTable(CFX_Font* pFont);

+#endif

diff --git a/core/include/fxge/fx_freetype.h b/core/include/fxge/fx_freetype.h
new file mode 100644
index 0000000..397c3ee
--- /dev/null
+++ b/core/include/fxge/fx_freetype.h
@@ -0,0 +1,144 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../thirdparties/freetype/ft2build.h"

+#include "../thirdparties/freetype/freetype/freetype.h"

+#include "../thirdparties/freetype/freetype/ftoutln.h"

+#include "../thirdparties/freetype/freetype/ftmm.h"

+#include "../thirdparties/freetype/freetype/internal/ftobjs.h"

+#include "../thirdparties/freetype/freetype/tttables.h"

+#ifdef __cplusplus

+extern "C" {

+#endif

+#define FXFT_ENCODING_UNICODE FT_ENCODING_UNICODE

+#define FXFT_ENCODING_ADOBE_STANDARD FT_ENCODING_ADOBE_STANDARD

+#define FXFT_ENCODING_ADOBE_EXPERT FT_ENCODING_ADOBE_EXPERT

+#define FXFT_ENCODING_ADOBE_LATIN_1 FT_ENCODING_ADOBE_LATIN_1

+#define FXFT_ENCODING_APPLE_ROMAN FT_ENCODING_APPLE_ROMAN

+#define FXFT_ENCODING_ADOBE_CUSTOM FT_ENCODING_ADOBE_CUSTOM

+#define FXFT_ENCODING_MS_SYMBOL FT_ENCODING_MS_SYMBOL

+#define FXFT_ENCODING_GB2312 FT_ENCODING_GB2312

+#define FXFT_ENCODING_BIG5 FT_ENCODING_BIG5

+#define FXFT_ENCODING_SJIS FT_ENCODING_SJIS

+#define FXFT_ENCODING_JOHAB FT_ENCODING_JOHAB

+#define FXFT_ENCODING_WANSUNG FT_ENCODING_WANSUNG

+#define FXFT_LOAD_NO_SCALE FT_LOAD_NO_SCALE

+#define FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH

+#define FXFT_RENDER_MODE_LCD FT_RENDER_MODE_LCD

+#define FXFT_RENDER_MODE_MONO FT_RENDER_MODE_MONO

+#define FXFT_RENDER_MODE_NORMAL FT_RENDER_MODE_NORMAL

+#define FXFT_LOAD_IGNORE_TRANSFORM FT_LOAD_IGNORE_TRANSFORM

+#define FXFT_LOAD_NO_BITMAP FT_LOAD_NO_BITMAP

+#define FXFT_LOAD_NO_HINTING FT_LOAD_NO_HINTING

+#define FXFT_PIXEL_MODE_MONO FT_PIXEL_MODE_MONO

+#define FXFT_STYLE_FLAG_ITALIC FT_STYLE_FLAG_ITALIC

+#define FXFT_STYLE_FLAG_BOLD FT_STYLE_FLAG_BOLD

+#define FXFT_FACE_FLAG_SFNT FT_FACE_FLAG_SFNT

+#define FXFT_FACE_FLAG_TRICKY ( 1L << 13 )

+typedef FT_MM_Var*		FXFT_MM_Var;

+typedef FT_Bitmap*		FXFT_Bitmap;

+#define FXFT_Matrix		FT_Matrix

+#define FXFT_Vector		FT_Vector

+#define FXFT_Outline_Funcs FT_Outline_Funcs

+typedef FT_Open_Args	FXFT_Open_Args;

+typedef FT_StreamRec	FXFT_StreamRec;

+typedef FT_StreamRec*	FXFT_Stream;

+typedef FT_BBox			FXFT_BBox;

+typedef FT_Glyph		FXFT_Glyph;

+typedef FT_CharMap		FXFT_CharMap;

+#define FXFT_GLYPH_BBOX_PIXELS	FT_GLYPH_BBOX_PIXELS

+#define FXFT_Open_Face(library, args, index, face) \

+    FT_Open_Face((FT_Library)(library), args, index, (FT_Face*)(face))

+#define FXFT_Done_Face(face) FT_Done_Face((FT_Face)(face))

+#define FXFT_Done_FreeType(library) FT_Done_FreeType((FT_Library)(library))

+#define FXFT_Init_FreeType(library) FT_Init_FreeType((FT_Library*)(library))

+#define FXFT_New_Memory_Face(library, base, size, index, face) \

+    FT_New_Memory_Face((FT_Library)(library), base, size, index, (FT_Face*)(face))

+#define FXFT_New_Face(library, filename, index, face) \

+    FT_New_Face((FT_Library)(library), filename, index, (FT_Face*)(face))

+#define FXFT_Get_Face_FreeType(face) ((FT_Face)face)->driver->root.library

+#define FXFT_Select_Charmap(face, encoding) FT_Select_Charmap((FT_Face)face, (FT_Encoding)encoding)

+#define FXFT_Set_Charmap(face, charmap) FT_Set_Charmap((FT_Face)face, (FT_CharMap)charmap)

+#define FXFT_Load_Glyph(face, glyph_index, flags) FT_Load_Glyph((FT_Face)face, glyph_index, flags)

+#define FXFT_Get_Char_Index(face, code) FT_Get_Char_Index((FT_Face)face, code)

+#define FXFT_Get_Glyph_Name(face, index, buffer, size) FT_Get_Glyph_Name((FT_Face)face, index, buffer, size)

+#define FXFT_Get_Name_Index(face, name) FT_Get_Name_Index((FT_Face)face, name)

+#define FXFT_Has_Glyph_Names(face)  (((FT_Face)face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES)

+#define FXFT_Get_Postscript_Name(face) FT_Get_Postscript_Name((FT_Face)face)

+#define FXFT_Load_Sfnt_Table(face, tag, offset, buffer, length) \

+    FT_Load_Sfnt_Table((FT_Face)face, tag, offset, buffer, length)

+#define FXFT_Get_First_Char(face, glyph_index) FT_Get_First_Char((FT_Face)face, glyph_index)

+#define FXFT_Get_Next_Char(face, code, glyph_index) FT_Get_Next_Char((FT_Face)face, code, glyph_index)

+#define FXFT_Clear_Face_External_Stream(face) (((FT_Face)face)->face_flags&=~FT_FACE_FLAG_EXTERNAL_STREAM)

+#define FXFT_Get_Face_External_Stream(face) (((FT_Face)face)->face_flags&FT_FACE_FLAG_EXTERNAL_STREAM)

+#define FXFT_Is_Face_TT_OT(face) (((FT_Face)face)->face_flags&FT_FACE_FLAG_SFNT)

+#define FXFT_Is_Face_Tricky(face) (((FT_Face)face)->face_flags&FXFT_FACE_FLAG_TRICKY)

+#define FXFT_Is_Face_fixedwidth(face) (((FT_Face)face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH)

+#define FXFT_Get_Face_Stream_Base(face) ((FT_Face)face)->stream->base

+#define FXFT_Get_Face_Stream_Size(face) ((FT_Face)face)->stream->size

+#define FXFT_Get_Face_Family_Name(face) ((FT_Face)face)->family_name

+#define FXFT_Get_Face_Style_Name(face) ((FT_Face)face)->style_name

+#define FXFT_Get_Face_Numfaces(face) ((FT_Face)face)->num_faces

+#define FXFT_Get_Face_Faceindex(face) ((FT_Face)face)->face_index

+#define FXFT_Is_Face_Italic(face) (((FT_Face)face)->style_flags&FT_STYLE_FLAG_ITALIC)

+#define FXFT_Is_Face_Bold(face) (((FT_Face)face)->style_flags&FT_STYLE_FLAG_BOLD)

+#define FXFT_Get_Face_Charmaps(face) ((FT_Face)face)->charmaps

+#define FXFT_Get_Glyph_HoriBearingX(face) ((FT_Face)face)->glyph->metrics.horiBearingX

+#define FXFT_Get_Glyph_HoriBearingY(face) ((FT_Face)face)->glyph->metrics.horiBearingY

+#define FXFT_Get_Glyph_Width(face) ((FT_Face)face)->glyph->metrics.width

+#define FXFT_Get_Glyph_Height(face) ((FT_Face)face)->glyph->metrics.height

+#define FXFT_Get_Face_CharmapCount(face) ((FT_Face)face)->num_charmaps

+#define FXFT_Get_Charmap_Encoding(charmap) ((FT_CharMap)charmap)->encoding

+#define FXFT_Get_Face_Charmap(face) ((FT_Face)face)->charmap

+#define FXFT_Get_Charmap_PlatformID(charmap) ((FT_CharMap)charmap)->platform_id

+#define FXFT_Get_Charmap_EncodingID(charmap) ((FT_CharMap)charmap)->encoding_id

+#define FXFT_Get_Face_UnitsPerEM(face) ((FT_Face)face)->units_per_EM

+#define FXFT_Get_Face_xMin(face) ((FT_Face)face)->bbox.xMin

+#define FXFT_Get_Face_xMax(face) ((FT_Face)face)->bbox.xMax

+#define FXFT_Get_Face_yMin(face) ((FT_Face)face)->bbox.yMin

+#define FXFT_Get_Face_yMax(face) ((FT_Face)face)->bbox.yMax

+#define FXFT_Get_Face_Height(face) ((FT_Face)face)->height

+#define FXFT_Get_Face_UnderLineThickness(face) ((FT_Face)face)->underline_thickness

+#define FXFT_Get_Face_UnderLinePosition(face) ((FT_Face)face)->underline_position

+#define FXFT_Get_Face_MaxAdvanceWidth(face) ((FT_Face)face)->max_advance_width

+#define FXFT_Get_Face_Ascender(face) ((FT_Face)face)->ascender

+#define FXFT_Get_Face_Descender(face) ((FT_Face)face)->descender

+#define FXFT_Get_Glyph_HoriAdvance(face) ((FT_Face)face)->glyph->metrics.horiAdvance

+#define FXFT_Get_MM_Axis(var, index) &((FT_MM_Var*)var)->axis[index]

+#define FXFT_Get_MM_Axis_Min(axis) ((FT_Var_Axis*)axis)->minimum

+#define FXFT_Get_MM_Axis_Max(axis) ((FT_Var_Axis*)axis)->maximum

+#define FXFT_Get_MM_Axis_Def(axis) ((FT_Var_Axis*)axis)->def

+#define FXFT_Get_Face_Internal_Flag(face) ((FT_Face)face)->internal->transform_flags

+#define FXFT_Set_Face_Internal_Flag(face, flag) (((FT_Face)face)->internal->transform_flags = flag)

+#define FXFT_Alloc(library, size) ((FT_Library)library)->memory->alloc(((FT_Library)library)->memory, size)

+#define FXFT_Free(face, p) ((FT_Face)face)->memory->free(((FT_Face)face)->memory, p)

+#define FXFT_Get_Glyph_Outline(face) &((FT_Face)face)->glyph->outline

+#define FXFT_Get_Outline_Bbox(outline, cbox)  FT_Outline_Get_CBox(outline, cbox)

+#define FXFT_Render_Glyph(face, mode) FT_Render_Glyph(((FT_Face)face)->glyph, (enum FT_Render_Mode_)mode)

+#define FXFT_Get_MM_Var(face, p) FT_Get_MM_Var((FT_Face)face, p)

+#define FXFT_Set_MM_Design_Coordinates(face, n, p) FT_Set_MM_Design_Coordinates((FT_Face)face, n, p)

+#define FXFT_Set_Pixel_Sizes(face, w, h) FT_Set_Pixel_Sizes((FT_Face)face, w, h)

+#define FXFT_Set_Transform(face, m, d) FT_Set_Transform((FT_Face)face, m, d)

+#define FXFT_Outline_Embolden(outline, s) FT_Outline_Embolden(outline, s)

+#define FXFT_Get_Glyph_Bitmap(face) &((FT_Face)face)->glyph->bitmap

+#define FXFT_Get_Bitmap_Width(bitmap) ((FT_Bitmap*)bitmap)->width

+#define FXFT_Get_Bitmap_Rows(bitmap) ((FT_Bitmap*)bitmap)->rows

+#define FXFT_Get_Bitmap_PixelMode(bitmap) ((FT_Bitmap*)bitmap)->pixel_mode

+#define FXFT_Get_Bitmap_Pitch(bitmap) ((FT_Bitmap*)bitmap)->pitch

+#define FXFT_Get_Bitmap_Buffer(bitmap) ((FT_Bitmap*)bitmap)->buffer

+#define FXFT_Get_Glyph_BitmapLeft(face) ((FT_Face)face)->glyph->bitmap_left

+#define FXFT_Get_Glyph_BitmapTop(face) ((FT_Face)face)->glyph->bitmap_top

+#define FXFT_Outline_Decompose(outline, funcs, params) FT_Outline_Decompose(outline, funcs, params)

+#define FXFT_Set_Char_Size(face, char_width, char_height, horz_resolution, vert_resolution) FT_Set_Char_Size(face, char_width, char_height, horz_resolution, vert_resolution)

+#define FXFT_Get_Glyph(slot, aglyph) FT_Get_Glyph(slot, aglyph)

+#define FXFT_Glyph_Get_CBox(glyph, bbox_mode, acbox) FT_Glyph_Get_CBox(glyph, bbox_mode, acbox)

+#define FXFT_Done_Glyph(glyph)	FT_Done_Glyph(glyph)

+#define FXFT_Library_SetLcdFilter(library, filter) FT_Library_SetLcdFilter((FT_Library)(library), filter)

+int FXFT_unicode_from_adobe_name(const char* name);

+void FXFT_adobe_name_from_unicode(char* name, unsigned int unicode);

+#ifdef __cplusplus

+};

+#endif

diff --git a/core/include/fxge/fx_ge.h b/core/include/fxge/fx_ge.h
new file mode 100644
index 0000000..ab0bf35
--- /dev/null
+++ b/core/include/fxge/fx_ge.h
@@ -0,0 +1,733 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_GE_H_

+#define _FX_GE_H_

+#ifndef _FX_DIB_H_

+#include "fx_dib.h"

+#endif

+#ifndef _FX_FONT_H_

+#include "fx_font.h"

+#endif

+class CFX_ClipRgn;

+class CFX_PathData;

+class CFX_GraphStateData;

+class CFX_Font;

+class CFX_FontMgr;

+class CFX_FontCache;

+class CFX_FaceCache;

+class CFX_RenderDevice;

+class IFX_RenderDeviceDriver;

+class CCodec_ModuleMgr;

+class IFXG_PaintModuleMgr;

+class CFX_GEModule : public CFX_Object

+{

+public:

+

+    static void				Create();

+

+    static void				Use(CFX_GEModule* pMgr);

+

+    static CFX_GEModule*	Get();

+

+    static void				Destroy();

+public:

+

+    CFX_FontCache*			GetFontCache();

+    CFX_FontMgr*			GetFontMgr()

+    {

+        return m_pFontMgr;

+    }

+    void					SetTextGamma(FX_FLOAT gammaValue);

+    FX_LPCBYTE				GetTextGammaTable();

+    void					SetExtFontMapper(IFX_FontMapper* pFontMapper);

+

+    void					SetCodecModule(CCodec_ModuleMgr* pCodecModule)

+    {

+        m_pCodecModule = pCodecModule;

+    }

+    CCodec_ModuleMgr*		GetCodecModule()

+    {

+        return m_pCodecModule;

+    }

+    FXFT_Library			m_FTLibrary;

+    void*					GetPlatformData()

+    {

+        return m_pPlatformData;

+    }

+protected:

+

+    CFX_GEModule();

+

+    ~CFX_GEModule();

+    void					InitPlatform();

+    void					DestroyPlatform();

+private:

+    FX_BYTE					m_GammaValue[256];

+    CFX_FontCache*			m_pFontCache;

+    CFX_FontMgr*			m_pFontMgr;

+    CCodec_ModuleMgr*		m_pCodecModule;

+    void*					m_pPlatformData;

+};

+typedef struct {

+

+    FX_FLOAT			m_PointX;

+

+    FX_FLOAT			m_PointY;

+

+    int					m_Flag;

+} FX_PATHPOINT;

+#define FXPT_CLOSEFIGURE		0x01

+#define FXPT_LINETO				0x02

+#define FXPT_BEZIERTO			0x04

+#define FXPT_MOVETO				0x06

+#define FXPT_TYPE				0x06

+#define FXFILL_ALTERNATE		1

+#define FXFILL_WINDING			2

+class CFX_ClipRgn : public CFX_Object

+{

+public:

+

+    CFX_ClipRgn(int device_width, int device_height);

+

+    CFX_ClipRgn(const FX_RECT& rect);

+

+    CFX_ClipRgn(const CFX_ClipRgn& src);

+

+    ~CFX_ClipRgn();

+

+    typedef enum {

+        RectI,

+        MaskF

+    } ClipType;

+

+    void			Reset(const FX_RECT& rect);

+

+    ClipType		GetType() const

+    {

+        return m_Type;

+    }

+

+    const FX_RECT&	GetBox() const

+    {

+        return m_Box;

+    }

+

+    CFX_DIBitmapRef	GetMask() const

+    {

+        return m_Mask;

+    }

+

+    void			IntersectRect(const FX_RECT& rect);

+

+    void			IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask);

+protected:

+

+    ClipType		m_Type;

+

+    FX_RECT			m_Box;

+

+    CFX_DIBitmapRef	m_Mask;

+

+    void			IntersectMaskRect(FX_RECT rect, FX_RECT mask_box, CFX_DIBitmapRef Mask);

+};

+extern const FX_BYTE g_GammaRamp[256];

+extern const FX_BYTE g_GammaInverse[256];

+#define FX_GAMMA(value)			(value)

+#define FX_GAMMA_INVERSE(value)	(value)

+inline FX_ARGB ArgbGamma(FX_ARGB argb)

+{

+    return argb;

+}

+inline FX_ARGB ArgbGammaInverse(FX_ARGB argb)

+{

+    return argb;

+}

+class CFX_PathData : public CFX_Object

+{

+public:

+

+    CFX_PathData();

+

+    CFX_PathData(const CFX_PathData& src);

+

+    ~CFX_PathData();

+

+

+

+

+    int					GetPointCount() const

+    {

+        return m_PointCount;

+    }

+

+    int					GetFlag(int index) const

+    {

+        return m_pPoints[index].m_Flag;

+    }

+

+    FX_FLOAT			GetPointX(int index) const

+    {

+        return m_pPoints[index].m_PointX;

+    }

+

+    FX_FLOAT			GetPointY(int index) const

+    {

+        return m_pPoints[index].m_PointY;

+    }

+

+

+

+    FX_PATHPOINT*		GetPoints() const

+    {

+        return m_pPoints;

+    }

+

+    FX_BOOL				SetPointCount(int nPoints);

+

+    FX_BOOL				AllocPointCount(int nPoints);

+

+    FX_BOOL				AddPointCount(int addPoints);

+

+    CFX_FloatRect		GetBoundingBox() const;

+

+    CFX_FloatRect		GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const;

+

+    void				Transform(const CFX_AffineMatrix* pMatrix);

+

+    FX_BOOL				IsRect() const;

+

+    FX_BOOL				GetZeroAreaPath(CFX_PathData& NewPath, CFX_AffineMatrix* pMatrix, FX_BOOL&bThin, FX_BOOL bAdjust) const;

+

+    FX_BOOL				IsRect(const CFX_AffineMatrix* pMatrix, CFX_FloatRect* rect) const;

+

+    FX_BOOL				Append(const CFX_PathData* pSrc, const CFX_AffineMatrix* pMatrix);

+

+    FX_BOOL				AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top);

+

+    void				SetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag);

+

+    void				TrimPoints(int nPoints);

+

+    FX_BOOL				Copy(const CFX_PathData &src);

+protected:

+    friend class		CPDF_Path;

+

+    int					m_PointCount;

+

+    FX_PATHPOINT*		m_pPoints;

+

+    int					m_AllocCount;

+};

+class CFX_GraphStateData : public CFX_Object

+{

+public:

+

+    CFX_GraphStateData();

+

+    CFX_GraphStateData(const CFX_GraphStateData& src);

+

+    ~CFX_GraphStateData();

+

+    void				Copy(const CFX_GraphStateData& src);

+

+    void				SetDashCount(int count);

+

+

+

+    typedef enum {

+        LineCapButt = 0,

+        LineCapRound = 1,

+        LineCapSquare = 2

+    } LineCap;

+    LineCap				m_LineCap;

+    int					m_DashCount;

+    FX_FLOAT*		m_DashArray;

+    FX_FLOAT			m_DashPhase;

+

+    typedef enum {

+        LineJoinMiter = 0,

+        LineJoinRound = 1,

+        LineJoinBevel = 2,

+    } LineJoin;

+    LineJoin			m_LineJoin;

+    FX_FLOAT			m_MiterLimit;

+    FX_FLOAT			m_LineWidth;

+

+};

+#define FXDC_DEVICE_CLASS			1

+#define FXDC_PIXEL_WIDTH			2

+#define FXDC_PIXEL_HEIGHT			3

+#define FXDC_BITS_PIXEL				4

+#define FXDC_HORZ_SIZE				5

+#define FXDC_VERT_SIZE				6

+#define FXDC_RENDER_CAPS			7

+#define FXDC_DITHER_BITS			8

+#define FXDC_DISPLAY				1

+#define FXDC_PRINTER				2

+#define FXRC_GET_BITS				0x01

+#define FXRC_BIT_MASK				0x02

+#define FXRC_ALPHA_MASK				0x04

+#define FXRC_ALPHA_PATH				0x10

+#define FXRC_ALPHA_IMAGE			0x20

+#define FXRC_ALPHA_OUTPUT			0x40

+#define FXRC_BLEND_MODE				0x80

+#define FXRC_SOFT_CLIP				0x100

+#define FXRC_CMYK_OUTPUT			0x200

+#define FXRC_BITMASK_OUTPUT         0x400

+#define FXRC_BYTEMASK_OUTPUT        0x800

+#define FXRENDER_IMAGE_LOSSY		0x1000

+#define FXFILL_ALTERNATE		1

+#define FXFILL_WINDING			2

+#define FXFILL_FULLCOVER		4

+#define FXFILL_RECT_AA			8

+#define FX_FILL_STROKE			16

+#define FX_STROKE_ADJUST		32

+#define FX_STROKE_TEXT_MODE		64

+#define FX_FILL_TEXT_MODE		128

+#define FX_ZEROAREA_FILL		256

+#define FXFILL_NOPATHSMOOTH		512

+#define FXTEXT_CLEARTYPE			0x01

+#define FXTEXT_BGR_STRIPE			0x02

+#define FXTEXT_PRINTGRAPHICTEXT		0x04

+#define FXTEXT_NO_NATIVETEXT		0x08

+#define FXTEXT_PRINTIMAGETEXT		0x10

+#define FXTEXT_NOSMOOTH				0x20

+typedef struct {

+    FX_DWORD			m_GlyphIndex;

+    FX_FLOAT			m_OriginX, m_OriginY;

+    int					m_FontCharWidth;

+    FX_BOOL				m_bGlyphAdjust;

+    FX_FLOAT			m_AdjustMatrix[4];

+    FX_DWORD			m_ExtGID;

+    FX_BOOL				m_bFontStyle;

+} FXTEXT_CHARPOS;

+class CFX_RenderDevice : public CFX_Object

+{

+public:

+    CFX_RenderDevice();

+

+    virtual ~CFX_RenderDevice();

+

+    void			SetDeviceDriver(IFX_RenderDeviceDriver* pDriver);

+

+    IFX_RenderDeviceDriver*	GetDeviceDriver() const

+    {

+        return m_pDeviceDriver;

+    }

+

+    FX_BOOL			StartRendering();

+

+    void			EndRendering();

+

+

+

+    void			SaveState();

+

+    void			RestoreState(FX_BOOL bKeepSaved = FALSE);

+

+

+

+

+    int				GetWidth() const

+    {

+        return m_Width;

+    }

+

+    int				GetHeight() const

+    {

+        return m_Height;

+    }

+

+    int				GetDeviceClass() const

+    {

+        return m_DeviceClass;

+    }

+

+    int				GetBPP() const

+    {

+        return m_bpp;

+    }

+

+    int				GetRenderCaps() const

+    {

+        return m_RenderCaps;

+    }

+

+    int				GetDeviceCaps(int id) const;

+

+    CFX_Matrix		GetCTM() const;

+

+

+    CFX_DIBitmap*	GetBitmap() const

+    {

+        return m_pBitmap;

+    }

+    void			SetBitmap(CFX_DIBitmap* pBitmap)

+    {

+        m_pBitmap = pBitmap;

+    }

+

+    FX_BOOL			CreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const;

+

+    const FX_RECT&	GetClipBox() const

+    {

+        return m_ClipBox;

+    }

+

+    FX_BOOL			SetClip_PathFill(const CFX_PathData* pPathData,

+                                     const CFX_AffineMatrix* pObject2Device,

+                                     int fill_mode

+                              );

+

+    FX_BOOL			SetClip_Rect(const FX_RECT* pRect);

+

+    FX_BOOL			SetClip_PathStroke(const CFX_PathData* pPathData,

+                                       const CFX_AffineMatrix* pObject2Device,

+                                       const CFX_GraphStateData* pGraphState

+                                );

+

+    FX_BOOL			DrawPath(const CFX_PathData* pPathData,

+                             const CFX_AffineMatrix* pObject2Device,

+                             const CFX_GraphStateData* pGraphState,

+                             FX_DWORD fill_color,

+                             FX_DWORD stroke_color,

+                             int fill_mode,

+                             int alpha_flag = 0,

+                             void* pIccTransform = NULL,

+                             int blend_type = FXDIB_BLEND_NORMAL

+                      );

+

+    FX_BOOL			SetPixel(int x, int y, FX_DWORD color,

+                             int alpha_flag = 0, void* pIccTransform = NULL);

+

+    FX_BOOL			FillRect(const FX_RECT* pRect, FX_DWORD color,

+                             int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);

+

+    FX_BOOL			DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,

+                                     int fill_mode = 0, int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);

+

+    FX_BOOL			GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL);

+

+    CFX_DIBitmap*   GetBackDrop();

+

+    FX_BOOL			SetDIBits(const CFX_DIBSource* pBitmap, int left, int top, int blend_type = FXDIB_BLEND_NORMAL,

+                              void* pIccTransform = NULL);

+

+    FX_BOOL			StretchDIBits(const CFX_DIBSource* pBitmap, int left, int top, int dest_width, int dest_height,

+                                  FX_DWORD flags = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);

+

+    FX_BOOL			SetBitMask(const CFX_DIBSource* pBitmap, int left, int top, FX_DWORD color,

+                               int alpha_flag = 0, void* pIccTransform = NULL);

+

+    FX_BOOL			StretchBitMask(const CFX_DIBSource* pBitmap, int left, int top, int dest_width, int dest_height,

+                                   FX_DWORD color, FX_DWORD flags = 0, int alpha_flag = 0, void* pIccTransform = NULL);

+

+    FX_BOOL			StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,

+                                const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,

+                                int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);

+

+    FX_BOOL			ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause);

+

+    void			CancelDIBits(FX_LPVOID handle);

+

+    FX_BOOL			DrawNormalText(int nChars, const FXTEXT_CHARPOS* pCharPos,

+                                   CFX_Font* pFont, CFX_FontCache* pCache,

+                                   FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,

+                                   FX_DWORD fill_color, FX_DWORD text_flags,

+                                   int alpha_flag = 0, void* pIccTransform = NULL);

+

+    FX_BOOL			DrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPos,

+                                 CFX_Font* pFont, CFX_FontCache* pCache,

+                                 FX_FLOAT font_size, const CFX_AffineMatrix* pText2User,

+                                 const CFX_AffineMatrix* pUser2Device, const CFX_GraphStateData* pGraphState,

+                                 FX_DWORD fill_color, FX_DWORD stroke_color, CFX_PathData* pClippingPath, int nFlag = 0,

+                                 int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);

+    virtual void Begin() {}

+    virtual void End() {}

+private:

+

+    CFX_DIBitmap*	m_pBitmap;

+

+

+

+    int				m_Width;

+

+    int				m_Height;

+

+    int				m_bpp;

+

+    int				m_RenderCaps;

+

+    int				m_DeviceClass;

+

+    FX_RECT			m_ClipBox;

+

+protected:

+

+    IFX_RenderDeviceDriver*	m_pDeviceDriver;

+private:

+

+    void			InitDeviceInfo();

+

+    void			UpdateClipBox();

+};

+class CFX_FxgeDevice : public CFX_RenderDevice

+{

+public:

+

+    CFX_FxgeDevice();

+

+    ~CFX_FxgeDevice();

+

+    FX_BOOL			Attach(CFX_DIBitmap* pBitmap, int dither_bits = 0, FX_BOOL bRgbByteOrder = FALSE, CFX_DIBitmap* pOriDevice = NULL, FX_BOOL bGroupKnockout = FALSE);

+

+    FX_BOOL			Create(int width, int height, FXDIB_Format format, int dither_bits = 0, CFX_DIBitmap* pOriDevice = NULL);

+protected:

+

+    FX_BOOL			m_bOwnedBitmap;

+};

+class CFX_SkiaDevice : public CFX_RenderDevice

+{

+public:

+

+    CFX_SkiaDevice();

+

+    ~CFX_SkiaDevice();

+

+    FX_BOOL			Attach(CFX_DIBitmap* pBitmap, int dither_bits = 0, FX_BOOL bRgbByteOrder = FALSE, CFX_DIBitmap* pOriDevice = NULL, FX_BOOL bGroupKnockout = FALSE);

+

+    FX_BOOL			Create(int width, int height, FXDIB_Format format, int dither_bits = 0, CFX_DIBitmap* pOriDevice = NULL);

+protected:

+

+    FX_BOOL			m_bOwnedBitmap;

+};

+class IFX_RenderDeviceDriver : public CFX_Object

+{

+public:

+

+    static IFX_RenderDeviceDriver*		CreateFxgeDriver(CFX_DIBitmap* pBitmap, FX_BOOL bRgbByteOrder = FALSE,

+            CFX_DIBitmap* pOriDevice = NULL, FX_BOOL bGroupKnockout = FALSE);

+

+    virtual ~IFX_RenderDeviceDriver() {}

+    virtual void Begin() { }

+    virtual void End() { }

+

+    virtual int		GetDeviceCaps(int caps_id) = 0;

+

+    virtual CFX_Matrix	GetCTM() const

+    {

+        return CFX_Matrix();

+    }

+

+    virtual FX_BOOL IsPSPrintDriver()

+    {

+        return FALSE;

+    }

+

+    virtual FX_BOOL	StartRendering()

+    {

+        return TRUE;

+    }

+

+    virtual void	EndRendering() {}

+

+

+

+

+    virtual void	SaveState() = 0;

+

+    virtual void	RestoreState(FX_BOOL bKeepSaved = FALSE) = 0;

+

+

+    virtual FX_BOOL	SetClip_PathFill(const CFX_PathData* pPathData,

+                                     const CFX_AffineMatrix* pObject2Device,

+                                     int fill_mode

+                                    ) = 0;

+

+    virtual FX_BOOL	SetClip_PathStroke(const CFX_PathData* pPathData,

+                                       const CFX_AffineMatrix* pObject2Device,

+                                       const CFX_GraphStateData* pGraphState

+                                      )

+    {

+        return FALSE;

+    }

+

+    virtual FX_BOOL	DrawPath(const CFX_PathData* pPathData,

+                             const CFX_AffineMatrix* pObject2Device,

+                             const CFX_GraphStateData* pGraphState,

+                             FX_DWORD fill_color,

+                             FX_DWORD stroke_color,

+                             int fill_mode,

+                             int alpha_flag = 0,

+                             void* pIccTransform = NULL,

+                             int blend_type = FXDIB_BLEND_NORMAL

+                            ) = 0;

+

+    virtual FX_BOOL	SetPixel(int x, int y, FX_DWORD color,

+                             int alpha_flag = 0, void* pIccTransform = NULL)

+    {

+        return FALSE;

+    }

+

+    virtual FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color,

+                             int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL)

+    {

+        return FALSE;

+    }

+

+    virtual FX_BOOL	DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,

+                                     int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL)

+    {

+        return FALSE;

+    }

+

+    virtual FX_BOOL GetClipBox(FX_RECT* pRect) = 0;

+

+    virtual FX_BOOL	GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE)

+    {

+        return FALSE;

+    }

+    virtual CFX_DIBitmap*   GetBackDrop()

+    {

+        return NULL;

+    }

+

+    virtual FX_BOOL	SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect,

+                              int dest_left, int dest_top, int blend_type,

+                              int alpha_flag = 0, void* pIccTransform = NULL) = 0;

+

+    virtual FX_BOOL	StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,

+                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,

+                                  int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL) = 0;

+

+    virtual FX_BOOL	StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,

+                                const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,

+                                int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL) = 0;

+

+    virtual FX_BOOL	ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)

+    {

+        return FALSE;

+    }

+

+    virtual void	CancelDIBits(FX_LPVOID handle) {}

+

+    virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,

+                                   CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,

+                                   int alpha_flag = 0, void* pIccTransform = NULL)

+    {

+        return FALSE;

+    }

+

+    virtual void*	GetPlatformSurface()

+    {

+        return NULL;

+    }

+

+    virtual int		GetDriverType()

+    {

+        return 0;

+    }

+

+    virtual void    ClearDriver() {}

+};

+class IFX_PSOutput

+{

+public:

+

+    virtual void	OutputPS(FX_LPCSTR string, int len) = 0;

+    virtual void  Release() = 0;

+};

+class CPSFont;

+class CFX_PSRenderer : public CFX_Object

+{

+public:

+

+    CFX_PSRenderer();

+

+    ~CFX_PSRenderer();

+

+    void			Init(IFX_PSOutput* pOutput, int ps_level, int width, int height, FX_BOOL bCmykOutput);

+    FX_BOOL			StartRendering();

+    void			EndRendering();

+

+    void			SaveState();

+

+    void			RestoreState(FX_BOOL bKeepSaved = FALSE);

+

+    void			SetClip_PathFill(const CFX_PathData* pPathData,

+                                     const CFX_AffineMatrix* pObject2Device,

+                                     int fill_mode

+                           );

+

+    void			SetClip_PathStroke(const CFX_PathData* pPathData,

+                                       const CFX_AffineMatrix* pObject2Device,

+                                       const CFX_GraphStateData* pGraphState

+                             );

+

+    FX_RECT			GetClipBox()

+    {

+        return m_ClipBox;

+    }

+

+    FX_BOOL			DrawPath(const CFX_PathData* pPathData,

+                             const CFX_AffineMatrix* pObject2Device,

+                             const CFX_GraphStateData* pGraphState,

+                             FX_DWORD fill_color,

+                             FX_DWORD stroke_color,

+                             int fill_mode,

+                             int alpha_flag = 0,

+                             void* pIccTransform = NULL

+                      );

+

+    FX_BOOL			SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,

+                              int alpha_flag = 0, void* pIccTransform = NULL);

+

+    FX_BOOL			StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,

+                                  int dest_width, int dest_height, FX_DWORD flags,

+                                  int alpha_flag = 0, void* pIccTransform = NULL);

+

+    FX_BOOL			DrawDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color,

+                               const CFX_AffineMatrix* pMatrix, FX_DWORD flags,

+                               int alpha_flag = 0, void* pIccTransform = NULL);

+

+    FX_BOOL			DrawText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont, CFX_FontCache* pCache,

+                             const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,

+                             int alpha_flag = 0, void* pIccTransform = NULL);

+private:

+

+    IFX_PSOutput*	m_pOutput;

+

+    int				m_PSLevel;

+

+    CFX_GraphStateData	m_CurGraphState;

+

+    FX_BOOL			m_bGraphStateSet;

+

+    FX_BOOL			m_bCmykOutput;

+

+    FX_BOOL			m_bColorSet;

+

+    FX_DWORD		m_LastColor;

+

+    FX_RECT			m_ClipBox;

+

+    CFX_ArrayTemplate<CPSFont*>	m_PSFontList;

+

+    CFX_ArrayTemplate<FX_RECT>	m_ClipBoxStack;

+    FX_BOOL			m_bInited;

+

+    void			OutputPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device);

+

+    void			SetGraphState(const CFX_GraphStateData* pGraphState);

+

+    void			SetColor(FX_DWORD color, int alpha_flag, void* pIccTransform);

+

+    void			FindPSFontGlyph(CFX_FaceCache* pFaceCache, CFX_Font* pFont, const FXTEXT_CHARPOS& charpos, int& ps_fontnum, int &ps_glyphindex);

+

+    void			WritePSBinary(FX_LPCBYTE data, int len);

+};

+#endif

diff --git a/core/include/fxge/fx_ge_apple.h b/core/include/fxge/fx_ge_apple.h
new file mode 100644
index 0000000..f13a1b3
--- /dev/null
+++ b/core/include/fxge/fx_ge_apple.h
@@ -0,0 +1,26 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_GE_APPLE_H_

+#define _FX_GE_APPLE_H_

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+class CFX_QuartzDevice : public CFX_RenderDevice

+{

+public:

+    CFX_QuartzDevice();

+    ~CFX_QuartzDevice();

+    FX_BOOL Attach(CGContextRef context, FX_INT32 nDeviceClass = FXDC_DISPLAY);

+    FX_BOOL Attach(CFX_DIBitmap* pBitmap);

+    FX_BOOL Create(FX_INT32 width, FX_INT32 height, FXDIB_Format format);

+

+    CGContextRef GetContext();

+

+protected:

+    CGContextRef m_pContext;

+    FX_BOOL m_bOwnedBitmap;

+};

+#endif

+#endif

diff --git a/core/include/fxge/fx_ge_win32.h b/core/include/fxge/fx_ge_win32.h
new file mode 100644
index 0000000..0b421db
--- /dev/null
+++ b/core/include/fxge/fx_ge_win32.h
@@ -0,0 +1,105 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_GE_WIN32_H_

+#define _FX_GE_WIN32_H_

+#ifdef _WIN32

+#ifndef _WINDOWS_

+#include <windows.h>

+#endif

+#define WINDIB_OPEN_MEMORY    0x1

+#define WINDIB_OPEN_PATHNAME  0x2

+typedef struct  WINDIB_Open_Args_ {

+

+    int         flags;

+

+    const FX_BYTE*  memory_base;

+

+    size_t    memory_size;

+

+    FX_LPCWSTR  path_name;

+} WINDIB_Open_Args_;

+class CFX_WindowsDIB : public CFX_DIBitmap

+{

+public:

+

+    static CFX_ByteString	GetBitmapInfo(const CFX_DIBitmap* pBitmap);

+

+    static CFX_DIBitmap* LoadFromBuf(BITMAPINFO* pbmi, void* pData);

+

+    static HBITMAP		GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC);

+

+    static CFX_DIBitmap* LoadFromDDB(HDC hDC, HBITMAP hBitmap, FX_DWORD* pPalette = NULL, FX_DWORD size = 256);

+

+    static CFX_DIBitmap* LoadFromFile(FX_LPCWSTR filename);

+

+    static CFX_DIBitmap* LoadFromFile(FX_LPCSTR filename)

+    {

+        return LoadFromFile(CFX_WideString::FromLocal(filename));

+    }

+

+    static CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args);

+

+    CFX_WindowsDIB(HDC hDC, int width, int height);

+

+    ~CFX_WindowsDIB();

+

+    HDC					GetDC() const

+    {

+        return m_hMemDC;

+    }

+

+    HBITMAP				GetWindowsBitmap() const

+    {

+        return m_hBitmap;

+    }

+

+    void				LoadFromDevice(HDC hDC, int left, int top);

+

+    void				SetToDevice(HDC hDC, int left, int top);

+protected:

+

+    HDC					m_hMemDC;

+

+    HBITMAP				m_hBitmap;

+

+    HBITMAP				m_hOldBitmap;

+};

+class CFX_WindowsDevice : public CFX_RenderDevice

+{

+public:

+    static IFX_RenderDeviceDriver*	CreateDriver(HDC hDC, FX_BOOL bCmykOutput = FALSE);

+

+    CFX_WindowsDevice(HDC hDC, FX_BOOL bCmykOutput = FALSE, FX_BOOL bForcePSOutput = FALSE, int psLevel = 2);

+

+    HDC		GetDC() const;

+

+    FX_BOOL m_bForcePSOutput;

+

+    static int m_psLevel;

+};

+class CFX_WinBitmapDevice : public CFX_RenderDevice

+{

+public:

+

+    CFX_WinBitmapDevice(int width, int height, FXDIB_Format format);

+

+    ~CFX_WinBitmapDevice();

+

+    HDC		GetDC()

+    {

+        return m_hDC;

+    }

+protected:

+

+    HBITMAP	m_hBitmap;

+

+    HBITMAP m_hOldBitmap;

+

+    HDC		m_hDC;

+};

+#endif

+#endif

diff --git a/core/include/reflow/fpdf_layout.h b/core/include/reflow/fpdf_layout.h
new file mode 100644
index 0000000..fc01ba3
--- /dev/null
+++ b/core/include/reflow/fpdf_layout.h
@@ -0,0 +1,280 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFAPI_LAYOUT_H_
+#define _FPDFAPI_LAYOUT_H_
+class IPDF_LayoutElement;
+class IPDF_LayoutProcessor;
+class IPDF_LayoutProvider;
+typedef enum {
+    LayoutUnknown,
+    LayoutArifact,
+    LayoutDocument,
+    LayoutPart,
+    LayoutArt,
+    LayoutSect,
+    LayoutDiv,
+    LayoutBlockQuote,
+    LayoutCaption,
+    LayoutTOC,
+    LayoutTOCI,
+    LayoutIndex,
+    LayoutNonStruct,
+    LayoutPrivate,
+    LayoutParagraph,
+    LayoutHeading,
+    LayoutHeading1,
+    LayoutHeading2,
+    LayoutHeading3,
+    LayoutHeading4,
+    LayoutHeading5,
+    LayoutHeading6,
+    LayoutList,
+    LayoutListItem,
+    LayoutListLabel,
+    LayoutListBody,
+    LayoutTable,
+    LayoutTableRow,
+    LayoutTableHeaderCell,
+    LayoutTableDataCell,
+    LayoutTableHeaderGroup,
+    LayoutTableBodyGroup,
+    LayoutTableFootGroup,
+    LayoutSpan,
+    LayoutQuote,
+    LayoutNote,
+    LayoutReference,
+    LayoutBibEntry,
+    LayoutCode,
+    LayoutLink,
+    LayoutAnnot,
+    LayoutRuby,
+    LayoutRubyBase,
+    LayoutRubyAnnot,
+    LayoutRubyPunc,
+    LayoutWarichu,
+    LayoutWarichuText,
+    LayoutWarichuPunc,
+    LayoutFigure,
+    LayoutFormula,
+    LayoutForm,
+} LayoutType;
+typedef enum {
+    LayoutArtifactType,
+    LayoutArtifactAttached,
+    LayoutArtifactSubType,
+    LayoutPlacement,
+    LayoutWritingMode,
+    LayoutBackgroundColor,
+    LayoutBorderColor,
+    LayoutBorderStyle,
+    LayoutBorderThickness,
+    LayoutPadding,
+    LayoutColor,
+    LayoutSpaceBefore,
+    LayoutSpaceAfter,
+    LayoutStartIndent,
+    LayoutEndIndent,
+    LayoutTextIndent,
+    LayoutTextAlign,
+    LayoutBBox,
+    LayoutWidth,
+    LayoutHeight,
+    LayoutBlockAlign,
+    LayoutInlineAlign,
+    LayoutTBorderStyle,
+    LayoutTPadding,
+    LayoutBaselineShift,
+    LayoutLineHeight,
+    LayoutTextDecorationColor,
+    LayoutTextDecorationThickness,
+    LayoutTextDecorationType,
+    LayoutRubyAlign,
+    LayoutRubyPosition,
+    LayoutGlyphOrientationVertical,
+    LayoutColumnCount,
+    LayoutColumnGap,
+    LayoutColumnWidths,
+    LayoutListNumbering,
+    LayoutFieldRole,
+    LayoutFieldChecked,
+    LayoutFieldDesc,
+    LayoutRowSpan,
+    LayoutColSpan,
+    LayoutTableHeaders,
+    LayoutTableHeaderScope,
+    LayoutTableSummary,
+} LayoutAttr;
+typedef enum {
+    LayoutInvalid = 0,
+    LayoutBlock,
+    LayoutInline,
+    LayoutBefore,
+    LayoutAfter,
+    LayoutStart,
+    LayoutEnd,
+    LayoutLrTb,
+    LayoutRlTb,
+    LayoutTbRl,
+    LayoutNone,
+    LayoutHidden,
+    LayoutDotted,
+    LayoutDashed,
+    LayoutSolid,
+    LayoutDouble,
+    LayoutGroove,
+    LayoutRidge,
+    LayoutInset,
+    LayoutOutset,
+    LayoutNormal,
+    LayoutAuto,
+    LayoutCenter,
+    LayoutJustify,
+    LayoutMiddle,
+    LayoutUnderline,
+    LayoutOverline,
+    LayoutLineThrough,
+    LayoutDistribute,
+    LayoutMinus90Degree,
+    LayoutZeroDegree,
+    Layout90Degree,
+    Layout180Degree,
+    Layout270Degree,
+    LayoutDisc,
+    LayoutCircle,
+    LayoutSquare,
+    LayoutDecimal,
+    LayoutUpperRoman,
+    LayoutLowerRoman,
+    LayoutUpperAlpha,
+    LayoutLowerAlpha,
+    LayoutRB,
+    LayoutCB,
+    LayoutPB,
+    LayoutTV,
+    LayoutOn,
+    LayoutOff,
+    LayoutNeutral,
+    LayoutRow,
+    LayoutColumn,
+    LayoutBoth,
+    LayoutLeft,
+    LayoutTop,
+    LayoutBottom,
+    LayoutRight,
+    LayoutPagination,
+    LayoutLayout,
+    LayoutPage,
+    LayoutBackground,
+    LayoutHeader,
+    LayoutFooter,
+    LayoutWatermark,
+} LayoutEnum;
+class IPDF_LayoutElement
+{
+public:
+
+    virtual ~IPDF_LayoutElement() {};
+
+
+    virtual LayoutType	GetType() = 0;
+
+    virtual int		CountAttrValues(LayoutAttr attr_type) = 0;
+
+
+    virtual LayoutEnum	GetEnumAttr(LayoutAttr attr_type, int index = 0) = 0;
+
+    virtual FX_FLOAT	GetNumberAttr(LayoutAttr attr_type, int index = 0) = 0;
+
+    virtual FX_COLORREF	GetColorAttr(LayoutAttr attr_type, int index = 0) = 0;
+
+
+    virtual int		CountChildren() = 0;
+
+
+    virtual IPDF_LayoutElement* GetChild(int index) = 0;
+
+
+    virtual IPDF_LayoutElement* GetParent() = 0;
+
+
+    virtual int		CountObjects() = 0;
+
+    virtual CPDF_PageObject*	GetObject(int index) = 0;
+};
+typedef enum {
+    LayoutReady,
+    LayoutFinished,
+    LayoutToBeContinued,
+    LayoutError
+} LayoutStatus;
+#define RF_PARSER_IMAGE		0x1
+#define RF_PARSER_DEBUGINFO	0x2
+#define RF_PARSER_PAGEMODE	0x4
+#define RF_PARSER_READERORDER	0x8
+class IPDF_LayoutProcessor
+{
+public:
+
+    virtual ~IPDF_LayoutProcessor() {};
+
+    static IPDF_LayoutProcessor* Create_LayoutProcessor_Reflow(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, void* pReflowedPage, int flags, FX_FLOAT lineSpace = 0);
+
+    static IPDF_LayoutProcessor* Create_LayoutProcessor_2HTML(FX_LPCSTR fileName);
+
+    virtual LayoutStatus	StartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix = NULL) = 0;
+
+    virtual LayoutStatus	Continue() = 0;
+    virtual int				GetPosition() = 0;
+};
+#define LP_Lang_Unknow	 		0x0
+#define LP_Lang_English	 		0x1
+#define LP_Lang_French			0x2
+#define LP_Lang_Italian			0x4
+#define LP_Lang_German			0x8
+#define LP_Lang_Spanish			0x10
+#define LP_Lang_Polish			0x20
+#define LP_Lang_Russian			0x40
+#define LP_Lang_ChinesePRC		0x80
+#define LP_Lang_ChineseTaiwan	0x100
+#define LP_Lang_Japanese		0x200
+#define LP_Lang_Korean			0x400
+#define LP_Lang_Portuguese		0x800
+#define LP_Lang_Turkish			0x1000
+#define LP_Lang_Dutch			0x2000
+typedef struct _LayoutProviderStyle {
+    _LayoutProviderStyle()
+    {
+        m_Language = LP_Lang_Unknow;
+        m_bIgnoreInvisibleText = TRUE;
+    }
+    FX_INT32	m_Language;
+    FX_BOOL		m_bIgnoreInvisibleText;
+} LAYOUTPROVIDER_STYLE;
+class IPDF_LayoutProvider
+{
+public:
+
+    virtual ~IPDF_LayoutProvider() {};
+
+    static IPDF_LayoutProvider* Create_LayoutProvider_TaggedPDF(CPDF_PageObjects* pPageObjs);
+
+    static IPDF_LayoutProvider* Create_LayoutProvider_AutoReflow(CPDF_PageObjects* pPageObjs, FX_BOOL bReadOrder);
+
+    virtual void			SetLayoutProviderStyle(LAYOUTPROVIDER_STYLE Style) = 0;
+
+
+
+
+    virtual LayoutStatus	StartLoad(IFX_Pause* pPause = NULL) = 0;
+
+    virtual LayoutStatus	Continue() = 0;
+    virtual int				GetPosition() = 0;
+
+
+    virtual IPDF_LayoutElement* GetRoot() = 0;
+};
+#endif
diff --git a/core/include/reflow/reflowengine.h b/core/include/reflow/reflowengine.h
new file mode 100644
index 0000000..e6a5265
--- /dev/null
+++ b/core/include/reflow/reflowengine.h
@@ -0,0 +1,76 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _REFLOW_ENGINE_H
+#define _REFLOW_ENGINE_H
+#include "../fpdfapi/fpdf_render.h"
+#include "../fpdftext/fpdf_text.h"
+#include "fpdf_layout.h"
+#include "../fpdfapi/fpdf_pageobj.h"
+#include "../fpdfdoc/fpdf_tagged.h"
+class IPDF_ReflowedPage
+{
+public:
+    static IPDF_ReflowedPage* Create();
+
+    virtual ~IPDF_ReflowedPage() {}
+    virtual CFX_PrivateData*	GetPrivateDataCtrl() = 0;
+
+
+    virtual void		GetDisplayMatrix(CFX_AffineMatrix& matrix, FX_INT32 xPos, FX_INT32 yPos, FX_INT32 xSize, FX_INT32 ySize, FX_INT32 iRotate, const CFX_AffineMatrix* pPageMatrix) = 0;
+    virtual FX_FLOAT	GetPageHeight() = 0;
+    virtual FX_FLOAT	GetPageWidth() = 0;
+    virtual void		FocusGetData(const CFX_AffineMatrix matrix, FX_INT32 x, FX_INT32 y, CFX_ByteString& str) = 0;
+    virtual FX_BOOL		FocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, FX_INT32& x, FX_INT32& y) = 0;
+};
+typedef struct _RF_ParseStyle {
+    _RF_ParseStyle()
+    {
+        m_LineSpace = 0;
+    };
+    FX_FLOAT m_LineSpace;
+} RF_ParseStyle;
+class IPDF_ProgressiveReflowPageParser
+{
+public:
+    static IPDF_ProgressiveReflowPageParser* Create();
+    static FX_BOOL	IsTaggedPage(CPDF_PageObjects*pPage);
+
+    virtual ~IPDF_ProgressiveReflowPageParser() {}
+    typedef enum { Ready, ToBeContinued, Done, Failed } ParseStatus;
+
+    virtual ParseStatus		GetStatus() = 0;
+    virtual void			SetParserStyle(RF_ParseStyle style) = 0;
+    virtual void			Start(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags) = 0;
+    virtual void			Continue(IFX_Pause* pPause) = 0;
+
+    virtual int				GetPosition() = 0;
+
+
+    virtual void			Clear() = 0;
+};
+class IPDF_ProgressiveReflowPageRender
+{
+public:
+    static IPDF_ProgressiveReflowPageRender* Create();
+
+    virtual ~IPDF_ProgressiveReflowPageRender() {}
+    typedef enum { Ready, ToBeContinued, Waiting, Done, Failed } RenderStatus;
+
+    virtual RenderStatus	GetStatus() = 0;
+
+
+    virtual void		Start(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits ) = 0;
+    virtual void		Continue(IFX_Pause* pPause) = 0;
+    virtual int			GetPosition() = 0;
+
+
+    virtual void				Clear() = 0;
+};
+IPDF_ReflowedPage* Create_ReflowPage();
+IPDF_ProgressiveReflowPageParser* Create_ReflowPageParser();
+IPDF_ProgressiveReflowPageRender* Create_ReflowPageRender();
+#endif
diff --git a/core/include/thirdparties/freetype/foxitnames.h b/core/include/thirdparties/freetype/foxitnames.h
new file mode 100644
index 0000000..5749f9b
--- /dev/null
+++ b/core/include/thirdparties/freetype/foxitnames.h
@@ -0,0 +1,283 @@
+#ifndef _FX_FREETYPE_DONT_RENAME_

+// To avoid any possible linking confliction, we rename all FreeType exported names

+

+#define FT_Init_FreeType FPDFAPI_FT_Init_FreeType

+#define FT_Done_FreeType FPDFAPI_FT_Done_FreeType

+#define FT_New_Face		FPDFAPI_FT_New_Face

+#define FT_Select_Charmap FPDFAPI_FT_Select_Charmap 

+#define FT_Done_Face FPDFAPI_FT_Done_Face 

+#define FT_Get_Charmap_Index FPDFAPI_FT_Get_Charmap_Index 

+#define FT_New_Memory_Face FPDFAPI_FT_New_Memory_Face 

+#define FT_MulDiv FPDFAPI_FT_MulDiv 

+#define FT_Vector_Transform FPDFAPI_FT_Vector_Transform 

+#define FT_Cos FPDFAPI_FT_Cos 

+#define FT_Sin FPDFAPI_FT_Sin 

+#define FT_Load_Glyph FPDFAPI_FT_Load_Glyph 

+#define FT_DivFix FPDFAPI_FT_DivFix 

+#define FT_Realloc FPDFAPI_FT_Realloc 

+#define FT_Alloc FPDFAPI_FT_Alloc 

+#define FT_Get_Char_Index FPDFAPI_FT_Get_Char_Index 

+#define FT_GlyphLoader_CheckPoints FPDFAPI_FT_GlyphLoader_CheckPoints 

+#define FT_GlyphLoader_Add FPDFAPI_FT_GlyphLoader_Add 

+#define FT_GlyphLoader_CheckSubGlyphs FPDFAPI_FT_GlyphLoader_CheckSubGlyphs 

+#define FT_Outline_Translate FPDFAPI_FT_Outline_Translate 

+#define FT_Outline_Transform FPDFAPI_FT_Outline_Transform 

+#define FT_Outline_Get_CBox FPDFAPI_FT_Outline_Get_CBox 

+#define FT_GlyphLoader_Rewind FPDFAPI_FT_GlyphLoader_Rewind 

+#define FT_GlyphLoader_CopyPoints FPDFAPI_FT_GlyphLoader_CopyPoints 

+#define FT_GlyphLoader_New FPDFAPI_FT_GlyphLoader_New 

+#define FT_GlyphLoader_CreateExtra FPDFAPI_FT_GlyphLoader_CreateExtra 

+#define FT_Free FPDFAPI_FT_Free 

+#define FT_Set_Charmap FPDFAPI_FT_Set_Charmap 

+#define FT_GlyphLoader_Done FPDFAPI_FT_GlyphLoader_Done 

+#define _debug_mem_dummy FPDFAPI__debug_mem_dummy 

+#define _debug_mem_dummy FPDFAPI__debug_mem_dummy 

+#define FT_QAlloc FPDFAPI_FT_QAlloc 

+#define FT_QRealloc FPDFAPI_FT_QRealloc 

+#define FT_List_Find FPDFAPI_FT_List_Find 

+#define FT_List_Add FPDFAPI_FT_List_Add 

+#define FT_List_Insert FPDFAPI_FT_List_Insert 

+#define FT_List_Remove FPDFAPI_FT_List_Remove 

+#define FT_List_Up FPDFAPI_FT_List_Up 

+#define FT_List_Iterate FPDFAPI_FT_List_Iterate 

+#define FT_List_Finalize FPDFAPI_FT_List_Finalize 

+#define ft_highpow2 FPDFAPI_ft_highpow2 

+#define FT_Stream_OpenMemory FPDFAPI_FT_Stream_OpenMemory 

+#define FT_Stream_Close FPDFAPI_FT_Stream_Close 

+#define FT_Stream_Seek FPDFAPI_FT_Stream_Seek 

+#define FT_Stream_Skip FPDFAPI_FT_Stream_Skip 

+#define FT_Stream_Pos FPDFAPI_FT_Stream_Pos 

+#define FT_Stream_ReadAt FPDFAPI_FT_Stream_ReadAt 

+#define FT_Stream_Read FPDFAPI_FT_Stream_Read 

+#define FT_Stream_TryRead FPDFAPI_FT_Stream_TryRead 

+#define FT_Stream_EnterFrame FPDFAPI_FT_Stream_EnterFrame 

+#define FT_Stream_ExtractFrame FPDFAPI_FT_Stream_ExtractFrame 

+#define FT_Stream_ReleaseFrame FPDFAPI_FT_Stream_ReleaseFrame 

+#define FT_Stream_ExitFrame FPDFAPI_FT_Stream_ExitFrame 

+#define FT_Stream_GetChar FPDFAPI_FT_Stream_GetChar 

+#define FT_Stream_GetShort FPDFAPI_FT_Stream_GetShort 

+#define FT_Stream_GetShortLE FPDFAPI_FT_Stream_GetShortLE 

+#define FT_Stream_GetOffset FPDFAPI_FT_Stream_GetOffset 

+#define FT_Stream_GetLong FPDFAPI_FT_Stream_GetLong 

+#define FT_Stream_GetLongLE FPDFAPI_FT_Stream_GetLongLE 

+#define FT_Stream_ReadChar FPDFAPI_FT_Stream_ReadChar 

+#define FT_Stream_ReadShort FPDFAPI_FT_Stream_ReadShort 

+#define FT_Stream_ReadShortLE FPDFAPI_FT_Stream_ReadShortLE 

+#define FT_Stream_ReadOffset FPDFAPI_FT_Stream_ReadOffset 

+#define FT_Stream_ReadLong FPDFAPI_FT_Stream_ReadLong 

+#define FT_Stream_ReadLongLE FPDFAPI_FT_Stream_ReadLongLE 

+#define FT_Stream_ReadFields FPDFAPI_FT_Stream_ReadFields 

+#define FT_RoundFix FPDFAPI_FT_RoundFix 

+#define FT_CeilFix FPDFAPI_FT_CeilFix 

+#define FT_FloorFix FPDFAPI_FT_FloorFix 

+#define FT_Sqrt32 FPDFAPI_FT_Sqrt32 

+#define FT_SqrtFixed FPDFAPI_FT_SqrtFixed 

+#define FT_Tan FPDFAPI_FT_Tan 

+#define FT_Atan2 FPDFAPI_FT_Atan2 

+#define FT_Vector_Unit FPDFAPI_FT_Vector_Unit 

+#define FT_Vector_Rotate FPDFAPI_FT_Vector_Rotate 

+#define FT_Vector_Length FPDFAPI_FT_Vector_Length 

+#define FT_Vector_Polarize FPDFAPI_FT_Vector_Polarize 

+#define FT_Vector_From_Polar FPDFAPI_FT_Vector_From_Polar 

+#define FT_Angle_Diff FPDFAPI_FT_Angle_Diff 

+#define FT_Outline_Decompose FPDFAPI_FT_Outline_Decompose 

+#define FT_Outline_Done_Internal FPDFAPI_FT_Outline_Done_Internal 

+#define FT_Outline_New_Internal FPDFAPI_FT_Outline_New_Internal 

+#define FT_Outline_New FPDFAPI_FT_Outline_New 

+#define FT_Outline_Check FPDFAPI_FT_Outline_Check 

+#define FT_Outline_Copy FPDFAPI_FT_Outline_Copy 

+#define FT_Outline_Done FPDFAPI_FT_Outline_Done 

+#define FT_Outline_Reverse FPDFAPI_FT_Outline_Reverse 

+#define FT_Set_Renderer FPDFAPI_FT_Set_Renderer 

+#define FT_Lookup_Renderer FPDFAPI_FT_Lookup_Renderer 

+#define FT_Outline_Render FPDFAPI_FT_Outline_Render 

+#define FT_Outline_Get_Bitmap FPDFAPI_FT_Outline_Get_Bitmap 

+#define FT_Outline_Get_Orientation FPDFAPI_FT_Outline_Get_Orientation 

+#define FT_Outline_Embolden FPDFAPI_FT_Outline_Embolden 

+#define FT_GlyphLoader_Reset FPDFAPI_FT_GlyphLoader_Reset 

+#define FT_GlyphLoader_Prepare FPDFAPI_FT_GlyphLoader_Prepare 

+#define ft_service_list_lookup FPDFAPI_ft_service_list_lookup 

+#define ft_validator_init FPDFAPI_ft_validator_init 

+#define ft_validator_run FPDFAPI_ft_validator_run 

+#define ft_validator_error FPDFAPI_ft_validator_error 

+#define FT_Stream_New FPDFAPI_FT_Stream_New 

+#define FT_Stream_Free FPDFAPI_FT_Stream_Free 

+#define ft_glyphslot_free_bitmap FPDFAPI_ft_glyphslot_free_bitmap 

+#define ft_glyphslot_set_bitmap FPDFAPI_ft_glyphslot_set_bitmap 

+#define FT_GlyphSlot_Own_Bitmap FPDFAPI_FT_GlyphSlot_Own_Bitmap

+#define ft_glyphslot_alloc_bitmap FPDFAPI_ft_glyphslot_alloc_bitmap 

+#define FT_New_GlyphSlot FPDFAPI_FT_New_GlyphSlot 

+#define FT_Done_GlyphSlot FPDFAPI_FT_Done_GlyphSlot 

+#define FT_Set_Transform FPDFAPI_FT_Set_Transform 

+#define FT_Render_Glyph_Internal FPDFAPI_FT_Render_Glyph_Internal 

+#define FT_Render_Glyph FPDFAPI_FT_Render_Glyph 

+#define FT_Load_Char FPDFAPI_FT_Load_Char 

+#define FT_New_Size FPDFAPI_FT_New_Size 

+#define FT_Open_Face FPDFAPI_FT_Open_Face 

+#define FT_Attach_Stream FPDFAPI_FT_Attach_Stream 

+#define FT_Attach_File FPDFAPI_FT_Attach_File 

+#define FT_Done_Size FPDFAPI_FT_Done_Size 

+#define FT_Set_Char_Size FPDFAPI_FT_Set_Char_Size 

+#define FT_Set_Pixel_Sizes FPDFAPI_FT_Set_Pixel_Sizes 

+#define FT_Get_Kerning FPDFAPI_FT_Get_Kerning 

+#define FT_CMap_Done FPDFAPI_FT_CMap_Done 

+#define FT_CMap_New FPDFAPI_FT_CMap_New 

+#define FT_Get_Next_Char FPDFAPI_FT_Get_Next_Char 

+#define FT_Get_First_Char FPDFAPI_FT_Get_First_Char 

+#define FT_Get_Name_Index FPDFAPI_FT_Get_Name_Index 

+#define FT_Get_Glyph_Name FPDFAPI_FT_Get_Glyph_Name 

+#define FT_Get_Postscript_Name FPDFAPI_FT_Get_Postscript_Name 

+#define FT_Get_Sfnt_Table FPDFAPI_FT_Get_Sfnt_Table 

+#define FT_Load_Sfnt_Table FPDFAPI_FT_Load_Sfnt_Table 

+#define FT_Sfnt_Table_Info FPDFAPI_FT_Sfnt_Table_Info 

+#define FT_Get_CMap_Language_ID FPDFAPI_FT_Get_CMap_Language_ID 

+#define FT_Activate_Size FPDFAPI_FT_Activate_Size 

+#define FT_Get_Renderer FPDFAPI_FT_Get_Renderer 

+#define FT_Remove_Module FPDFAPI_FT_Remove_Module 

+#define FT_Add_Module FPDFAPI_FT_Add_Module 

+#define FT_Get_Module FPDFAPI_FT_Get_Module 

+#define FT_Get_Module_Interface FPDFAPI_FT_Get_Module_Interface 

+#define ft_module_get_service FPDFAPI_ft_module_get_service 

+#define FT_New_Library FPDFAPI_FT_New_Library 

+#define FT_Library_Version FPDFAPI_FT_Library_Version 

+#define FT_Done_Library FPDFAPI_FT_Done_Library 

+#define FT_Set_Debug_Hook FPDFAPI_FT_Set_Debug_Hook 

+#define FT_Raccess_Get_HeaderInfo FPDFAPI_FT_Raccess_Get_HeaderInfo 

+#define FT_Raccess_Get_DataOffsets FPDFAPI_FT_Raccess_Get_DataOffsets 

+#define FT_Raccess_Guess FPDFAPI_FT_Raccess_Guess

+#define af_dummy_script_class FPDFAPI_af_dummy_script_class

+#define af_latin_script_class FPDFAPI_af_latin_script_class

+#define af_cjk_script_class FPDFAPI_af_cjk_script_class

+#define af_autofitter_service FPDFAPI_af_autofitter_service

+#define autofit_module_class FPDFAPI_autofit_module_class

+#define cff_cmap_encoding_class_rec FPDFAPI_cff_cmap_encoding_class_rec

+#define cff_cmap_unicode_class_rec FPDFAPI_cff_cmap_unicode_class_rec

+#define cff_driver_class FPDFAPI_cff_driver_class

+#define FT_Stream_Open FPDFAPI_FT_Stream_Open

+#define FT_New_Memory FPDFAPI_FT_New_Memory

+#define FT_Done_Memory FPDFAPI_FT_Done_Memory

+#define ft_mem_qalloc FPDFAPI_ft_mem_qalloc

+#define ft_mem_alloc FPDFAPI_ft_mem_alloc

+#define ft_mem_free FPDFAPI_ft_mem_free

+#define ft_mem_qrealloc FPDFAPI_ft_mem_qrealloc

+#define ft_mem_realloc FPDFAPI_ft_mem_realloc

+#define FT_Get_TrueType_Engine_Type FPDFAPI_FT_Get_TrueType_Engine_Type

+#define ft_stub_set_char_sizes FPDFAPI_ft_stub_set_char_sizes

+#define ft_stub_set_pixel_sizes FPDFAPI_ft_stub_set_pixel_sizes

+#define FT_Get_SubGlyph_Info FPDFAPI_FT_Get_SubGlyph_Info

+#define FT_Get_Sfnt_Name_Count FPDFAPI_FT_Get_Sfnt_Name_Count

+#define FT_Get_Sfnt_Name FPDFAPI_FT_Get_Sfnt_Name

+#define FT_Bitmap_New FPDFAPI_FT_Bitmap_New

+#define FT_Bitmap_Copy FPDFAPI_FT_Bitmap_Copy

+#define FT_Bitmap_Done FPDFAPI_FT_Bitmap_Done

+#define FT_Bitmap_Convert FPDFAPI_FT_Bitmap_Convert

+#define FT_Bitmap_Embolden FPDFAPI_FT_Bitmap_Embolden

+#define ft_bitmap_glyph_class FPDFAPI_ft_bitmap_glyph_class

+#define ft_outline_glyph_class FPDFAPI_ft_outline_glyph_class

+#define FT_Matrix_Multiply FPDFAPI_FT_Matrix_Multiply

+#define FT_Matrix_Invert FPDFAPI_FT_Matrix_Invert

+#define FT_Done_Glyph FPDFAPI_FT_Done_Glyph

+#define FT_Glyph_Copy FPDFAPI_FT_Glyph_Copy

+#define FT_Get_Glyph FPDFAPI_FT_Get_Glyph

+#define FT_Glyph_Transform FPDFAPI_FT_Glyph_Transform

+#define FT_Glyph_Get_CBox FPDFAPI_FT_Glyph_Get_CBox

+#define FT_Glyph_To_Bitmap FPDFAPI_FT_Glyph_To_Bitmap

+#define FT_Add_Default_Modules FPDFAPI_FT_Add_Default_Modules

+#define FT_Get_Multi_Master FPDFAPI_FT_Get_Multi_Master

+#define FT_Get_MM_Var FPDFAPI_FT_Get_MM_Var

+#define FT_Set_MM_Design_Coordinates FPDFAPI_FT_Set_MM_Design_Coordinates

+#define FT_Set_Var_Design_Coordinates FPDFAPI_FT_Set_Var_Design_Coordinates

+#define FT_Set_MM_Blend_Coordinates FPDFAPI_FT_Set_MM_Blend_Coordinates

+#define FT_Set_Var_Blend_Coordinates FPDFAPI_FT_Set_Var_Blend_Coordinates

+#define ps_table_funcs FPDFAPI_ps_table_funcs

+#define ps_parser_funcs FPDFAPI_ps_parser_funcs

+#define t1_builder_funcs FPDFAPI_t1_builder_funcs

+#define t1_decoder_funcs FPDFAPI_t1_decoder_funcs

+#define afm_parser_funcs FPDFAPI_afm_parser_funcs

+#define t1_cmap_classes FPDFAPI_t1_cmap_classes

+#define t1_cmap_standard_class_rec FPDFAPI_t1_cmap_standard_class_rec

+#define t1_cmap_expert_class_rec FPDFAPI_t1_cmap_expert_class_rec

+#define t1_cmap_custom_class_rec FPDFAPI_t1_cmap_custom_class_rec

+#define t1_cmap_unicode_class_rec FPDFAPI_t1_cmap_unicode_class_rec

+#define psaux_module_class FPDFAPI_psaux_module_class

+#define pshinter_module_class FPDFAPI_pshinter_module_class

+#define ps_hints_apply FPDFAPI_ps_hints_apply

+#define psnames_module_class FPDFAPI_psnames_module_class

+#define ft_raster1_renderer_class FPDFAPI_ft_raster1_renderer_class

+#define ft_standard_raster FPDFAPI_ft_standard_raster

+#define ft_raster5_renderer_class FPDFAPI_ft_raster5_renderer_class

+#define tt_cmap0_class_rec FPDFAPI_tt_cmap0_class_rec

+#define tt_cmap2_class_rec FPDFAPI_tt_cmap2_class_rec

+#define tt_cmap4_class_rec FPDFAPI_tt_cmap4_class_rec

+#define tt_cmap6_class_rec FPDFAPI_tt_cmap6_class_rec

+#define tt_cmap8_class_rec FPDFAPI_tt_cmap8_class_rec

+#define tt_cmap10_class_rec FPDFAPI_tt_cmap10_class_rec

+#define tt_cmap12_class_rec FPDFAPI_tt_cmap12_class_rec

+#define tt_cmap13_class_rec FPDFAPI_tt_cmap13_class_rec

+#define tt_cmap14_class_rec FPDFAPI_tt_cmap14_class_rec

+#define sfnt_module_class FPDFAPI_sfnt_module_class

+#define ft_grays_raster FPDFAPI_ft_grays_raster

+#define ft_smooth_renderer_class FPDFAPI_ft_smooth_renderer_class

+#define ft_smooth_lcd_renderer_class FPDFAPI_ft_smooth_lcd_renderer_class

+#define ft_smooth_lcdv_renderer_class FPDFAPI_ft_smooth_lcdv_renderer_class

+#define tt_default_graphics_state FPDFAPI_tt_default_graphics_state

+#define tt_driver_class FPDFAPI_tt_driver_class

+#define TT_RunIns FPDFAPI_TT_RunIns

+#define TT_New_Context FPDFAPI_TT_New_Context

+#define t1_driver_class FPDFAPI_t1_driver_class

+#define t1cid_driver_class FPDFAPI_t1cid_driver_class

+#define FT_Get_Track_Kerning FPDFAPI_FT_Get_Track_Kerning

+#define FT_Match_Size FPDFAPI_FT_Match_Size

+#define FT_MulDiv_No_Round FPDFAPI_FT_MulDiv_No_Round

+#define FT_Request_Metrics FPDFAPI_FT_Request_Metrics

+#define FT_Request_Size FPDFAPI_FT_Request_Size

+#define FT_Select_Metrics FPDFAPI_FT_Select_Metrics

+#define FT_Select_Size FPDFAPI_FT_Select_Size

+#define ft_synthesize_vertical_metrics FPDFAPI_ft_synthesize_vertical_metrics

+#define New_Profile FPDFAPI_New_Profile

+#define End_Profile FPDFAPI_End_Profile

+#define Insert_Y_Turn FPDFAPI_Insert_Y_Turn 

+#define Split_Conic FPDFAPI_Split_Conic  

+#define Split_Cubic FPDFAPI_Split_Cubic

+#define Line_Up FPDFAPI_Line_Up 

+#define Bezier_Up FPDFAPI_Bezier_Up 

+#define Bezier_Down FPDFAPI_Bezier_Down 

+#define Line_To FPDFAPI_Line_To

+#define Conic_To FPDFAPI_Conic_To 

+#define Cubic_To FPDFAPI_Cubic_To

+#define Decompose_Curve FPDFAPI_Decompose_Curve

+#define Convert_Glyph FPDFAPI_Convert_Glyph 

+#define Sort FPDFAPI_Sort 

+#define Vertical_Sweep_Init FPDFAPI_Vertical_Sweep_Init 

+#define Vertical_Sweep_Span FPDFAPI_Vertical_Sweep_Span 

+#define Vertical_Sweep_Drop FPDFAPI_Vertical_Sweep_Drop 

+#define Vertical_Sweep_Step FPDFAPI_Vertical_Sweep_Step 

+#define Horizontal_Sweep_Init FPDFAPI_Horizontal_Sweep_Init 

+#define Horizontal_Sweep_Span FPDFAPI_Horizontal_Sweep_Span 

+#define Horizontal_Sweep_Drop FPDFAPI_Horizontal_Sweep_Drop 

+#define Horizontal_Sweep_Step FPDFAPI_Horizontal_Sweep_Step 

+#define Draw_Sweep FPDFAPI_Draw_Sweep 

+#define Render_Single_Pass FPDFAPI_Render_Single_Pass 

+#define Render_Glyph FPDFAPI_Render_Glyph  

+#define Finalize_Profile_Table FPDFAPI_Finalize_Profile_Table 

+#define InsNew FPDFAPI_InsNew 

+#define DelOld FPDFAPI_DelOld

+#define FT_MulFix FPDFAPI_FT_MulFix

+#define FT_Matrix_Multiply_Scaled FPDFAPI_FT_Matrix_Multiply_Scaled

+#define FT_Vector_Transform_Scaled FPDFAPI_FT_Vector_Transform_Scaled

+#define ft_corner_orientation FPDFAPI_ft_corner_orientation

+#define ft_corner_is_flat FPDFAPI_ft_corner_is_flat

+#define FT_Get_CMap_Format FPDFAPI_FT_Get_CMap_Format

+#define ft_mem_strcpyn FPDFAPI_ft_mem_strcpyn

+#define ft_mem_dup FPDFAPI_ft_mem_dup

+#define ft_mem_strdup FPDFAPI_ft_mem_strdup

+#define FT_Face_GetCharVariantIsDefault FPDFAPI_FT_Face_GetCharVariantIsDefault

+#define FT_Face_GetCharsOfVariant FPDFAPI_FT_Face_GetCharsOfVariant

+#define FT_Face_GetVariantsOfChar FPDFAPI_FT_Face_GetVariantsOfChar

+#define FT_Face_GetVariantSelectors FPDFAPI_FT_Face_GetVariantSelectors

+#define FT_Face_GetCharVariantIndex FPDFAPI_FT_Face_GetCharVariantIndex

+#define FT_Get_Advances FPDFAPI_FT_Get_Advances

+#define FT_Get_Advance FPDFAPI_FT_Get_Advance

+#define FT_Library_SetLcdFilter FPDFAPI_FT_Library_SetLcdFilter

+ 

+#endif // !_FX_FREETYPE_DONT_RENAME_

diff --git a/core/include/thirdparties/freetype/freetype/config/ftconfig.h b/core/include/thirdparties/freetype/freetype/config/ftconfig.h
new file mode 100644
index 0000000..e4eb4dc
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/config/ftconfig.h
@@ -0,0 +1,599 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftconfig.h                                                             */
+/*                                                                         */
+/*    ANSI-specific configuration file (specification only).               */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006-2008, 2010-2011, 2013 by                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This header file contains a number of macro definitions that are used */
+  /* by the rest of the engine.  Most of the macros here are automatically */
+  /* determined at compile time, and you should not need to change it to   */
+  /* port FreeType, except to compile the library with a non-ANSI          */
+  /* compiler.                                                             */
+  /*                                                                       */
+  /* Note however that if some specific modifications are needed, we       */
+  /* advise you to place a modified copy in your build directory.          */
+  /*                                                                       */
+  /* The build directory is usually `freetype/builds/<system>', and        */
+  /* contains system-specific files that are always included first when    */
+  /* building the library.                                                 */
+  /*                                                                       */
+  /* This ANSI version should stay in `include/freetype/config'.           */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __FTCONFIG_H__
+#define __FTCONFIG_H__
+
+#include "../../ft2build.h"
+#include "ftoption.h"
+#include "ftstdlib.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*               PLATFORM-SPECIFIC CONFIGURATION MACROS                  */
+  /*                                                                       */
+  /* These macros can be toggled to suit a specific system.  The current   */
+  /* ones are defaults used to compile FreeType in an ANSI C environment   */
+  /* (16bit compilers are also supported).  Copy this file to your own     */
+  /* `freetype/builds/<system>' directory, and edit it to port the engine. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* There are systems (like the Texas Instruments 'C54x) where a `char' */
+  /* has 16 bits.  ANSI C says that sizeof(char) is always 1.  Since an  */
+  /* `int' has 16 bits also for this system, sizeof(int) gives 1 which   */
+  /* is probably unexpected.                                             */
+  /*                                                                     */
+  /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a      */
+  /* `char' type.                                                        */
+
+#ifndef FT_CHAR_BIT
+#define FT_CHAR_BIT  CHAR_BIT
+#endif
+
+
+  /* The size of an `int' type.  */
+#if                                 FT_UINT_MAX == 0xFFFFUL
+#define FT_SIZEOF_INT  (16 / FT_CHAR_BIT)
+#elif                               FT_UINT_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_INT  (32 / FT_CHAR_BIT)
+#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_INT  (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `int' type!"
+#endif
+
+  /* The size of a `long' type.  A five-byte `long' (as used e.g. on the */
+  /* DM642) is recognized but avoided.                                   */
+#if                                  FT_ULONG_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL
+#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_LONG  (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `long' type!"
+#endif
+
+
+  /* FT_UNUSED is a macro used to indicate that a given parameter is not  */
+  /* used -- this is only used to get rid of unpleasant compiler warnings */
+#ifndef FT_UNUSED
+#define FT_UNUSED( arg )  ( (arg) = (arg) )
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                     AUTOMATIC CONFIGURATION MACROS                    */
+  /*                                                                       */
+  /* These macros are computed from the ones defined above.  Don't touch   */
+  /* their definition, unless you know precisely what you are doing.  No   */
+  /* porter should need to mess with them.                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Mac support                                                           */
+  /*                                                                       */
+  /*   This is the only necessary change, so it is defined here instead    */
+  /*   providing a new configuration file.                                 */
+  /*                                                                       */
+#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
+  /* no Carbon frameworks for 64bit 10.4.x */
+  /* AvailabilityMacros.h is available since Mac OS X 10.2,        */
+  /* so guess the system version by maximum errno before inclusion */
+#include <errno.h>
+#ifdef ECANCELED /* defined since 10.2 */
+#include "AvailabilityMacros.h"
+#endif
+#if defined( __LP64__ ) && \
+    ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )
+#undef FT_MACINTOSH
+#endif
+
+#elif defined( __SC__ ) || defined( __MRC__ )
+  /* Classic MacOS compilers */
+#include "ConditionalMacros.h"
+#if TARGET_OS_MAC
+#define FT_MACINTOSH 1
+#endif
+
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    basic_types                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Int16                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for a 16bit signed integer type.                         */
+  /*                                                                       */
+  typedef signed short  FT_Int16;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UInt16                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for a 16bit unsigned integer type.                       */
+  /*                                                                       */
+  typedef unsigned short  FT_UInt16;
+
+  /* */
+
+
+  /* this #if 0 ... #endif clause is for documentation purposes */
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Int32                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for a 32bit signed integer type.  The size depends on    */
+  /*    the configuration.                                                 */
+  /*                                                                       */
+  typedef signed XXX  FT_Int32;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UInt32                                                          */
+  /*                                                                       */
+  /*    A typedef for a 32bit unsigned integer type.  The size depends on  */
+  /*    the configuration.                                                 */
+  /*                                                                       */
+  typedef unsigned XXX  FT_UInt32;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Int64                                                           */
+  /*                                                                       */
+  /*    A typedef for a 64bit signed integer type.  The size depends on    */
+  /*    the configuration.  Only defined if there is real 64bit support;   */
+  /*    otherwise, it gets emulated with a structure (if necessary).       */
+  /*                                                                       */
+  typedef signed XXX  FT_Int64;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UInt64                                                          */
+  /*                                                                       */
+  /*    A typedef for a 64bit unsigned integer type.  The size depends on  */
+  /*    the configuration.  Only defined if there is real 64bit support;   */
+  /*    otherwise, it gets emulated with a structure (if necessary).       */
+  /*                                                                       */
+  typedef unsigned XXX  FT_UInt64;
+
+  /* */
+
+#endif
+
+#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)
+
+  typedef signed int      FT_Int32;
+  typedef unsigned int    FT_UInt32;
+
+#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)
+
+  typedef signed long     FT_Int32;
+  typedef unsigned long   FT_UInt32;
+
+#else
+#error "no 32bit type found -- please check your configuration files"
+#endif
+
+
+  /* look up an integer type that is at least 32 bits */
+#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)
+
+  typedef int            FT_Fast;
+  typedef unsigned int   FT_UFast;
+
+#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)
+
+  typedef long           FT_Fast;
+  typedef unsigned long  FT_UFast;
+
+#endif
+
+
+  /* determine whether we have a 64-bit int type for platforms without */
+  /* Autoconf                                                          */
+#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
+
+  /* FT_LONG64 must be defined if a 64-bit type is available */
+#define FT_LONG64
+#define FT_INT64   long
+#define FT_UINT64  unsigned long
+
+#elif defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */
+
+  /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64   __int64
+#define FT_UINT64  unsigned __int64
+
+#elif defined( __BORLANDC__ )  /* Borland C++ */
+
+  /* XXXX: We should probably check the value of __BORLANDC__ in order */
+  /*       to test the compiler version.                               */
+
+  /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64   __int64
+#define FT_UINT64  unsigned __int64
+
+#elif defined( __WATCOMC__ )   /* Watcom C++ */
+
+  /* Watcom doesn't provide 64-bit data types */
+
+#elif defined( __MWERKS__ )    /* Metrowerks CodeWarrior */
+
+#define FT_LONG64
+#define FT_INT64   long long int
+#define FT_UINT64  unsigned long long int
+
+#elif defined( __GNUC__ )
+
+  /* GCC provides the `long long' type */
+#define FT_LONG64
+#define FT_INT64   long long int
+#define FT_UINT64  unsigned long long int
+
+#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A 64-bit data type will create compilation problems if you compile    */
+  /* in strict ANSI mode.  To avoid them, we disable its use if __STDC__   */
+  /* is defined.  You can however ignore this rule by defining the         */
+  /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro.                     */
+  /*                                                                       */
+#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )
+
+#ifdef __STDC__
+
+  /* undefine the 64-bit macros in strict ANSI compilation mode */
+#undef FT_LONG64
+#undef FT_INT64
+
+#endif /* __STDC__ */
+
+#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */
+
+#ifdef FT_LONG64
+  typedef FT_INT64   FT_Int64;
+  typedef FT_UINT64  FT_UInt64;
+#endif
+
+
+#define FT_BEGIN_STMNT  do {
+#define FT_END_STMNT    } while ( 0 )
+#define FT_DUMMY_STMNT  FT_BEGIN_STMNT FT_END_STMNT
+
+
+#ifndef  FT_CONFIG_OPTION_NO_ASSEMBLER
+  /* Provide assembler fragments for performance-critical functions. */
+  /* These must be defined `static __inline__' with GCC.             */
+
+  /**Johnson add !defined( __thumb__ )*/

+#if (defined( __CC_ARM ) || defined( __ARMCC__ ))&& !defined( __thumb__ )  /* RVCT */
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm
+
+  /* documentation is in freetype.h */
+
+  static __inline FT_Int32
+  FT_MulFix_arm( FT_Int32  a,
+                 FT_Int32  b )
+  {
+    register FT_Int32  t, t2;
+
+
+    __asm
+    {
+      smull t2, t,  b,  a           /* (lo=t2,hi=t) = a*b */
+      mov   a,  t,  asr #31         /* a   = (hi >> 31) */
+      add   a,  a,  #0x8000         /* a  += 0x8000 */
+      adds  t2, t2, a               /* t2 += a */
+      adc   t,  t,  #0              /* t  += carry */
+      mov   a,  t2, lsr #16         /* a   = t2 >> 16 */
+      orr   a,  a,  t,  lsl #16     /* a  |= t << 16 */
+    }
+    return a;
+  }
+
+#endif /* __CC_ARM || __ARMCC__ */
+
+
+#ifdef __GNUC__
+
+#if defined( __arm__ ) && !defined( __thumb__ )    && \
+    !( defined( __CC_ARM ) || defined( __ARMCC__ ) )
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm
+
+  /* documentation is in freetype.h */
+
+  static __inline__ FT_Int32
+  FT_MulFix_arm( FT_Int32  a,
+                 FT_Int32  b )
+  {
+    register FT_Int32  t, t2;
+
+
+    __asm__ __volatile__ (
+      "smull  %1, %2, %4, %3\n\t"       /* (lo=%1,hi=%2) = a*b */
+      "mov    %0, %2, asr #31\n\t"      /* %0  = (hi >> 31) */
+      "add    %0, %0, #0x8000\n\t"      /* %0 += 0x8000 */
+      "adds   %1, %1, %0\n\t"           /* %1 += %0 */
+      "adc    %2, %2, #0\n\t"           /* %2 += carry */
+      "mov    %0, %1, lsr #16\n\t"      /* %0  = %1 >> 16 */
+      "orr    %0, %0, %2, lsl #16\n\t"  /* %0 |= %2 << 16 */
+      : "=r"(a), "=&r"(t2), "=&r"(t)
+      : "r"(a), "r"(b)
+      : "cc" );
+    return a;
+  }
+
+#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */
+
+#if defined( __i386__ )
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
+
+  /* documentation is in freetype.h */
+
+  static __inline__ FT_Int32
+  FT_MulFix_i386( FT_Int32  a,
+                  FT_Int32  b )
+  {
+    register FT_Int32  result;
+
+
+    __asm__ __volatile__ (
+      "imul  %%edx\n"
+      "movl  %%edx, %%ecx\n"
+      "sarl  $31, %%ecx\n"
+      "addl  $0x8000, %%ecx\n"
+      "addl  %%ecx, %%eax\n"
+      "adcl  $0, %%edx\n"
+      "shrl  $16, %%eax\n"
+      "shll  $16, %%edx\n"
+      "addl  %%edx, %%eax\n"
+      : "=a"(result), "=d"(b)
+      : "a"(a), "d"(b)
+      : "%ecx", "cc" );
+    return result;
+  }
+
+#endif /* i386 */
+
+#endif /* __GNUC__ */
+
+
+#ifdef _MSC_VER /* Visual C++ */
+
+#ifdef _M_IX86
+
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
+
+  /* documentation is in freetype.h */
+
+  static __inline FT_Int32
+  FT_MulFix_i386( FT_Int32  a,
+                  FT_Int32  b )
+  {
+    register FT_Int32  result;
+
+    __asm
+    {
+      mov eax, a
+      mov edx, b
+      imul edx
+      mov ecx, edx
+      sar ecx, 31
+      add ecx, 8000h
+      add eax, ecx
+      adc edx, 0
+      shr eax, 16
+      shl edx, 16
+      add eax, edx
+      mov result, eax
+    }
+    return result;
+  }
+
+#endif /* _M_IX86 */
+
+#endif /* _MSC_VER */
+
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
+#ifdef FT_MULFIX_ASSEMBLER
+#define FT_MULFIX_INLINED  FT_MULFIX_ASSEMBLER
+#endif
+#endif
+
+
+#ifdef FT_MAKE_OPTION_SINGLE_OBJECT
+
+#define FT_LOCAL( x )      static  x
+#define FT_LOCAL_DEF( x )  static  x
+
+#else
+
+#ifdef __cplusplus
+#define FT_LOCAL( x )      extern "C"  x
+#define FT_LOCAL_DEF( x )  extern "C"  x
+#else
+#define FT_LOCAL( x )      extern  x
+#define FT_LOCAL_DEF( x )  x
+#endif
+
+#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
+
+
+#ifndef FT_BASE
+
+#ifdef __cplusplus
+#define FT_BASE( x )  extern "C"  x
+#else
+#define FT_BASE( x )  extern  x
+#endif
+
+#endif /* !FT_BASE */
+
+
+#ifndef FT_BASE_DEF
+
+#ifdef __cplusplus
+#define FT_BASE_DEF( x )  x
+#else
+#define FT_BASE_DEF( x )  x
+#endif
+
+#endif /* !FT_BASE_DEF */
+
+
+#ifndef FT_EXPORT
+
+#ifdef __cplusplus
+#define FT_EXPORT( x )  extern "C"  x
+#else
+#define FT_EXPORT( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT */
+
+
+#ifndef FT_EXPORT_DEF
+
+#ifdef __cplusplus
+#define FT_EXPORT_DEF( x )  extern "C"  x
+#else
+#define FT_EXPORT_DEF( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT_DEF */
+
+
+#ifndef FT_EXPORT_VAR
+
+#ifdef __cplusplus
+#define FT_EXPORT_VAR( x )  extern "C"  x
+#else
+#define FT_EXPORT_VAR( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT_VAR */
+
+  /* The following macros are needed to compile the library with a   */
+  /* C++ compiler and with 16bit compilers.                          */
+  /*                                                                 */
+
+  /* This is special.  Within C++, you must specify `extern "C"' for */
+  /* functions which are used via function pointers, and you also    */
+  /* must do that for structures which contain function pointers to  */
+  /* assure C linkage -- it's not possible to have (local) anonymous */
+  /* functions which are accessed by (global) function pointers.     */
+  /*                                                                 */
+  /*                                                                 */
+  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */
+  /*                                                                 */
+  /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
+  /* contains pointers to callback functions.                        */
+  /*                                                                 */
+  /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable   */
+  /* that contains pointers to callback functions.                   */
+  /*                                                                 */
+  /*                                                                 */
+  /* Some 16bit compilers have to redefine these macros to insert    */
+  /* the infamous `_cdecl' or `__fastcall' declarations.             */
+  /*                                                                 */
+#ifndef FT_CALLBACK_DEF
+#ifdef __cplusplus
+#define FT_CALLBACK_DEF( x )  extern "C"  x
+#else
+#define FT_CALLBACK_DEF( x )  static  x
+#endif
+#endif /* FT_CALLBACK_DEF */
+
+#ifndef FT_CALLBACK_TABLE
+#ifdef __cplusplus
+#define FT_CALLBACK_TABLE      extern "C"
+#define FT_CALLBACK_TABLE_DEF  extern "C"
+#else
+#define FT_CALLBACK_TABLE      extern
+#define FT_CALLBACK_TABLE_DEF  /* nothing */
+#endif
+#endif /* FT_CALLBACK_TABLE */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTCONFIG_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/config/ftheader.h b/core/include/thirdparties/freetype/freetype/config/ftheader.h
new file mode 100644
index 0000000..d979104
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/config/ftheader.h
@@ -0,0 +1,832 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftheader.h                                                             */
+/*                                                                         */
+/*    Build macros of the FreeType 2 library.                              */
+/*                                                                         */
+/*  Copyright 1996-2008, 2010, 2012, 2013 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#ifndef __FT_HEADER_H__
+#define __FT_HEADER_H__
+
+
+  /*@***********************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_BEGIN_HEADER                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro is used in association with @FT_END_HEADER in header    */
+  /*    files to ensure that the declarations within are properly          */
+  /*    encapsulated in an `extern "C" { .. }' block when included from a  */
+  /*    C++ compiler.                                                      */
+  /*                                                                       */
+#ifdef __cplusplus
+#define FT_BEGIN_HEADER  extern "C" {
+#else
+#define FT_BEGIN_HEADER  /* nothing */
+#endif
+
+
+  /*@***********************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_END_HEADER                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro is used in association with @FT_BEGIN_HEADER in header  */
+  /*    files to ensure that the declarations within are properly          */
+  /*    encapsulated in an `extern "C" { .. }' block when included from a  */
+  /*    C++ compiler.                                                      */
+  /*                                                                       */
+#ifdef __cplusplus
+#define FT_END_HEADER  }
+#else
+#define FT_END_HEADER  /* nothing */
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Aliases for the FreeType 2 public and configuration files.            */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    header_file_macros                                                 */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Header File Macros                                                 */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Macro definitions used to #include specific header files.          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The following macros are defined to the name of specific           */
+  /*    FreeType~2 header files.  They can be used directly in #include    */
+  /*    statements as in:                                                  */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      #include "../freetype.h"                                           */
+  /*      #include "../ftmm.h"                                   */
+  /*      #include "../ftglyph.h"                                              */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    There are several reasons why we are now using macros to name      */
+  /*    public header files.  The first one is that such macros are not    */
+  /*    limited to the infamous 8.3~naming rule required by DOS (and       */
+  /*    `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h').   */
+  /*                                                                       */
+  /*    The second reason is that it allows for more flexibility in the    */
+  /*    way FreeType~2 is installed on a given system.                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* configuration files */
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CONFIG_CONFIG_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   FreeType~2 configuration data.
+   *
+   */
+#ifndef FT_CONFIG_CONFIG_H
+#define FT_CONFIG_CONFIG_H  <freetype/config/ftconfig.h>
+#endif
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CONFIG_STANDARD_LIBRARY_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   FreeType~2 interface to the standard C library functions.
+   *
+   */
+#ifndef FT_CONFIG_STANDARD_LIBRARY_H
+#define FT_CONFIG_STANDARD_LIBRARY_H  <freetype/config/ftstdlib.h>
+#endif
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CONFIG_OPTIONS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   FreeType~2 project-specific configuration options.
+   *
+   */
+#ifndef FT_CONFIG_OPTIONS_H
+#define FT_CONFIG_OPTIONS_H  <freetype/config/ftoption.h>
+#endif
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CONFIG_MODULES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   list of FreeType~2 modules that are statically linked to new library
+   *   instances in @FT_Init_FreeType.
+   *
+   */
+#ifndef FT_CONFIG_MODULES_H
+#define FT_CONFIG_MODULES_H  <freetype/config/ftmodule.h>
+#endif
+
+  /* */
+
+  /* public headers */
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_FREETYPE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   base FreeType~2 API.
+   *
+   */
+#define FT_FREETYPE_H  <freetype/freetype.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ERRORS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   list of FreeType~2 error codes (and messages).
+   *
+   *   It is included by @FT_FREETYPE_H.
+   *
+   */
+#define FT_ERRORS_H  <freetype/fterrors.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_MODULE_ERRORS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   list of FreeType~2 module error offsets (and messages).
+   *
+   */
+#define FT_MODULE_ERRORS_H  <freetype/ftmoderr.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SYSTEM_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 interface to low-level operations (i.e., memory management
+   *   and stream i/o).
+   *
+   *   It is included by @FT_FREETYPE_H.
+   *
+   */
+#define FT_SYSTEM_H  <freetype/ftsystem.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IMAGE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing type
+   *   definitions related to glyph images (i.e., bitmaps, outlines,
+   *   scan-converter parameters).
+   *
+   *   It is included by @FT_FREETYPE_H.
+   *
+   */
+#define FT_IMAGE_H  <freetype/ftimage.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TYPES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   basic data types defined by FreeType~2.
+   *
+   *   It is included by @FT_FREETYPE_H.
+   *
+   */
+#define FT_TYPES_H  <freetype/fttypes.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_LIST_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   list management API of FreeType~2.
+   *
+   *   (Most applications will never need to include this file.)
+   *
+   */
+#define FT_LIST_H  <freetype/ftlist.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_OUTLINE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   scalable outline management API of FreeType~2.
+   *
+   */
+#define FT_OUTLINE_H  <freetype/ftoutln.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SIZES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API which manages multiple @FT_Size objects per face.
+   *
+   */
+#define FT_SIZES_H  <freetype/ftsizes.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_MODULE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   module management API of FreeType~2.
+   *
+   */
+#define FT_MODULE_H  <freetype/ftmodapi.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_RENDER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   renderer module management API of FreeType~2.
+   *
+   */
+#define FT_RENDER_H  <freetype/ftrender.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_AUTOHINTER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   structures and macros related to the auto-hinting module.
+   *
+   */
+#define FT_AUTOHINTER_H  <freetype/ftautoh.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CFF_DRIVER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   structures and macros related to the CFF driver module.
+   *
+   */
+#define FT_CFF_DRIVER_H  <freetype/ftcffdrv.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRUETYPE_DRIVER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   structures and macros related to the TrueType driver module.
+   *
+   */
+#define FT_TRUETYPE_DRIVER_H  <freetype/ftttdrv.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TYPE1_TABLES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   types and API specific to the Type~1 format.
+   *
+   */
+#define FT_TYPE1_TABLES_H  <freetype/t1tables.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRUETYPE_IDS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   enumeration values which identify name strings, languages, encodings,
+   *   etc.  This file really contains a _large_ set of constant macro
+   *   definitions, taken from the TrueType and OpenType specifications.
+   *
+   */
+#define FT_TRUETYPE_IDS_H  <freetype/ttnameid.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRUETYPE_TABLES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   types and API specific to the TrueType (as well as OpenType) format.
+   *
+   */
+#define FT_TRUETYPE_TABLES_H  <freetype/tttables.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRUETYPE_TAGS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of TrueType four-byte `tags' which identify blocks in
+   *   SFNT-based font formats (i.e., TrueType and OpenType).
+   *
+   */
+#define FT_TRUETYPE_TAGS_H  <freetype/tttags.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_BDF_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which accesses BDF-specific strings from a
+   *   face.
+   *
+   */
+#define FT_BDF_H  <freetype/ftbdf.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CID_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which access CID font information from a
+   *   face.
+   *
+   */
+#define FT_CID_H  <freetype/ftcid.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_GZIP_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which supports gzip-compressed files.
+   *
+   */
+#define FT_GZIP_H  <freetype/ftgzip.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_LZW_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which supports LZW-compressed files.
+   *
+   */
+#define FT_LZW_H  <freetype/ftlzw.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_BZIP2_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which supports bzip2-compressed files.
+   *
+   */
+#define FT_BZIP2_H  <freetype/ftbzip2.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_WINFONTS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which supports Windows FNT files.
+   *
+   */
+#define FT_WINFONTS_H   <freetype/ftwinfnt.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_GLYPH_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API of the optional glyph management component.
+   *
+   */
+#define FT_GLYPH_H  <freetype/ftglyph.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_BITMAP_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API of the optional bitmap conversion component.
+   *
+   */
+#define FT_BITMAP_H  <freetype/ftbitmap.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_BBOX_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API of the optional exact bounding box computation routines.
+   *
+   */
+#define FT_BBOX_H  <freetype/ftbbox.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CACHE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API of the optional FreeType~2 cache sub-system.
+   *
+   */
+#define FT_CACHE_H  <freetype/ftcache.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CACHE_IMAGE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   `glyph image' API of the FreeType~2 cache sub-system.
+   *
+   *   It is used to define a cache for @FT_Glyph elements.  You can also
+   *   use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to
+   *   store small glyph bitmaps, as it will use less memory.
+   *
+   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all
+   *   glyph image-related cache declarations.
+   *
+   */
+#define FT_CACHE_IMAGE_H  FT_CACHE_H
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CACHE_SMALL_BITMAPS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   `small bitmaps' API of the FreeType~2 cache sub-system.
+   *
+   *   It is used to define a cache for small glyph bitmaps in a relatively
+   *   memory-efficient way.  You can also use the API defined in
+   *   @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images,
+   *   including scalable outlines.
+   *
+   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all
+   *   small bitmaps-related cache declarations.
+   *
+   */
+#define FT_CACHE_SMALL_BITMAPS_H  FT_CACHE_H
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CACHE_CHARMAP_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   `charmap' API of the FreeType~2 cache sub-system.
+   *
+   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all
+   *   charmap-based cache declarations.
+   *
+   */
+#define FT_CACHE_CHARMAP_H  FT_CACHE_H
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_MAC_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   Macintosh-specific FreeType~2 API.  The latter is used to access
+   *   fonts embedded in resource forks.
+   *
+   *   This header file must be explicitly included by client applications
+   *   compiled on the Mac (note that the base API still works though).
+   *
+   */
+#define FT_MAC_H  <freetype/ftmac.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_MULTIPLE_MASTERS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   optional multiple-masters management API of FreeType~2.
+   *
+   */
+#define FT_MULTIPLE_MASTERS_H  <freetype/ftmm.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SFNT_NAMES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   optional FreeType~2 API which accesses embedded `name' strings in
+   *   SFNT-based font formats (i.e., TrueType and OpenType).
+   *
+   */
+#define FT_SFNT_NAMES_H  <freetype/ftsnames.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_OPENTYPE_VALIDATE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   optional FreeType~2 API which validates OpenType tables (BASE, GDEF,
+   *   GPOS, GSUB, JSTF).
+   *
+   */
+#define FT_OPENTYPE_VALIDATE_H  <freetype/ftotval.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_GX_VALIDATE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat,
+   *   mort, morx, bsln, just, kern, opbd, trak, prop).
+   *
+   */
+#define FT_GX_VALIDATE_H  <freetype/ftgxval.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_PFR_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which accesses PFR-specific data.
+   *
+   */
+#define FT_PFR_H  <freetype/ftpfr.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_STROKER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which provides functions to stroke outline paths.
+   */
+#define FT_STROKER_H  <freetype/ftstroke.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SYNTHESIS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs artificial obliquing and emboldening.
+   */
+#define FT_SYNTHESIS_H  <freetype/ftsynth.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_XFREE86_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which provides functions specific to the XFree86 and
+   *   X.Org X11 servers.
+   */
+#define FT_XFREE86_H  <freetype/ftxf86.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRIGONOMETRY_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs trigonometric computations (e.g.,
+   *   cosines and arc tangents).
+   */
+#define FT_TRIGONOMETRY_H  <freetype/fttrigon.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_LCD_FILTER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs color filtering for subpixel rendering.
+   */
+#define FT_LCD_FILTER_H  <freetype/ftlcdfil.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_UNPATENTED_HINTING_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs color filtering for subpixel rendering.
+   */
+#define FT_UNPATENTED_HINTING_H  <freetype/ttunpat.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_INCREMENTAL_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs color filtering for subpixel rendering.
+   */
+#define FT_INCREMENTAL_H  <freetype/ftincrem.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_GASP_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which returns entries from the TrueType GASP table.
+   */
+#define FT_GASP_H  <freetype/ftgasp.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ADVANCES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which returns individual and ranged glyph advances.
+   */
+#define FT_ADVANCES_H  <freetype/ftadvanc.h>
+
+
+  /* */
+
+#define FT_ERROR_DEFINITIONS_H  <freetype/fterrdef.h>
+
+
+  /* The internals of the cache sub-system are no longer exposed.  We */
+  /* default to FT_CACHE_H at the moment just in case, but we know of */
+  /* no rogue client that uses them.                                  */
+  /*                                                                  */
+#define FT_CACHE_MANAGER_H           <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_MRU_H      <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_MANAGER_H  <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_CACHE_H    <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_GLYPH_H    <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_IMAGE_H    <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_SBITS_H    <freetype/ftcache.h>
+
+
+#define FT_INCREMENTAL_H          <freetype/ftincrem.h>
+
+#define FT_TRUETYPE_UNPATENTED_H  <freetype/ttunpat.h>
+
+
+  /*
+   * Include internal headers definitions from <freetype/internal/...>
+   * only when building the library.
+   */
+#ifdef FT2_BUILD_LIBRARY
+#define  FT_INTERNAL_INTERNAL_H  <freetype/internal/internal.h>
+#include "../internal/internal.h"
+#endif /* FT2_BUILD_LIBRARY */
+
+
+#endif /* __FT2_BUILD_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/config/ftmodule.h b/core/include/thirdparties/freetype/freetype/config/ftmodule.h
new file mode 100644
index 0000000..0d31ce6
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/config/ftmodule.h
@@ -0,0 +1,32 @@
+/*
+ *  This file registers the FreeType modules compiled into the library.
+ *
+ *  If you use GNU make, this file IS NOT USED!  Instead, it is created in
+ *  the objects directory (normally `<topdir>/objs/') based on information
+ *  from `<topdir>/modules.cfg'.
+ *
+ *  Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile
+ *  FreeType without GNU make.
+ *
+ */
+
+//FT_USE_MODULE( FT_Module_Class, autofit_module_class )
+FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class )
+FT_USE_MODULE( FT_Module_Class, psaux_module_class )
+FT_USE_MODULE( FT_Module_Class, psnames_module_class )
+FT_USE_MODULE( FT_Module_Class, pshinter_module_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class )
+FT_USE_MODULE( FT_Module_Class, sfnt_module_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class )
+
+/* EOF */
diff --git a/core/include/thirdparties/freetype/freetype/config/ftoption.h b/core/include/thirdparties/freetype/freetype/config/ftoption.h
new file mode 100644
index 0000000..e16e3c1
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/config/ftoption.h
@@ -0,0 +1,833 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftoption.h                                                             */
+/*                                                                         */
+/*    User-selectable configuration macros (specification only).           */
+/*                                                                         */
+/*  Copyright 1996-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTOPTION_H__
+#define __FTOPTION_H__
+
+
+#include "../../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                 USER-SELECTABLE CONFIGURATION MACROS                  */
+  /*                                                                       */
+  /* This file contains the default configuration macro definitions for    */
+  /* a standard build of the FreeType library.  There are three ways to    */
+  /* use this file to build project-specific versions of the library:      */
+  /*                                                                       */
+  /*  - You can modify this file by hand, but this is not recommended in   */
+  /*    cases where you would like to build several versions of the        */
+  /*    library from a single source directory.                            */
+  /*                                                                       */
+  /*  - You can put a copy of this file in your build directory, more      */
+  /*    precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD'   */
+  /*    is the name of a directory that is included _before_ the FreeType  */
+  /*    include path during compilation.                                   */
+  /*                                                                       */
+  /*    The default FreeType Makefiles and Jamfiles use the build          */
+  /*    directory `builds/<system>' by default, but you can easily change  */
+  /*    that for your own projects.                                        */
+  /*                                                                       */
+  /*  - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it    */
+  /*    slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to       */
+  /*    locate this file during the build.  For example,                   */
+  /*                                                                       */
+  /*      #define FT_CONFIG_OPTIONS_H  <myftoptions.h>                     */
+  /*      #include <freetype/config/ftheader.h>                            */
+  /*                                                                       */
+  /*    will use `$BUILD/myftoptions.h' instead of this file for macro     */
+  /*    definitions.                                                       */
+  /*                                                                       */
+  /*    Note also that you can similarly pre-define the macro              */
+  /*    FT_CONFIG_MODULES_H used to locate the file listing of the modules */
+  /*    that are statically linked to the library at compile time.  By     */
+  /*    default, this file is <freetype/config/ftmodule.h>.                */
+  /*                                                                       */
+  /*  We highly recommend using the third method whenever possible.        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /**** G E N E R A L   F R E E T Y P E   2   C O N F I G U R A T I O N ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Uncomment the line below if you want to activate sub-pixel rendering  */
+  /* (a.k.a. LCD rendering, or ClearType) in this build of the library.    */
+  /*                                                                       */
+  /* Note that this feature is covered by several Microsoft patents        */
+  /* and should not be activated in any default build of the library.      */
+  /*                                                                       */
+  /* This macro has no impact on the FreeType API, only on its             */
+  /* _implementation_.  For example, using FT_RENDER_MODE_LCD when calling */
+  /* FT_Render_Glyph still generates a bitmap that is 3 times wider than   */
+  /* the original size in case this macro isn't defined; however, each     */
+  /* triplet of subpixels has R=G=B.                                       */
+  /*                                                                       */
+  /* This is done to allow FreeType clients to run unmodified, forcing     */
+  /* them to display normal gray-level anti-aliased glyphs.                */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Many compilers provide a non-ANSI 64-bit data type that can be used   */
+  /* by FreeType to speed up some computations.  However, this will create */
+  /* some problems when compiling the library in strict ANSI mode.         */
+  /*                                                                       */
+  /* For this reason, the use of 64-bit integers is normally disabled when */
+  /* the __STDC__ macro is defined.  You can however disable this by       */
+  /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here.                 */
+  /*                                                                       */
+  /* For most compilers, this will only create compilation warnings when   */
+  /* building the library.                                                 */
+  /*                                                                       */
+  /* ObNote: The compiler-specific 64-bit integers are detected in the     */
+  /*         file `ftconfig.h' either statically or through the            */
+  /*         `configure' script on supported platforms.                    */
+  /*                                                                       */
+#undef FT_CONFIG_OPTION_FORCE_INT64
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* If this macro is defined, do not try to use an assembler version of   */
+  /* performance-critical functions (e.g. FT_MulFix).  You should only do  */
+  /* that to verify that the assembler function works properly, or to      */
+  /* execute benchmark tests of the various implementations.               */
+/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* If this macro is defined, try to use an inlined assembler version of  */
+  /* the `FT_MulFix' function, which is a `hotspot' when loading and       */
+  /* hinting glyphs, and which should be executed as fast as possible.     */
+  /*                                                                       */
+  /* Note that if your compiler or CPU is not supported, this will default */
+  /* to the standard and portable implementation found in `ftcalc.c'.      */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_INLINE_MULFIX
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* LZW-compressed file support.                                          */
+  /*                                                                       */
+  /*   FreeType now handles font files that have been compressed with the  */
+  /*   `compress' program.  This is mostly used to parse many of the PCF   */
+  /*   files that come with various X11 distributions.  The implementation */
+  /*   uses NetBSD's `zopen' to partially uncompress the file on the fly   */
+  /*   (see src/lzw/ftgzip.c).                                             */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.             */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_USE_LZW
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Gzip-compressed file support.                                         */
+  /*                                                                       */
+  /*   FreeType now handles font files that have been compressed with the  */
+  /*   `gzip' program.  This is mostly used to parse many of the PCF files */
+  /*   that come with XFree86.  The implementation uses `zlib' to          */
+  /*   partially uncompress the file on the fly (see src/gzip/ftgzip.c).   */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.  See also   */
+  /*   the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below.                       */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_USE_ZLIB
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ZLib library selection                                                */
+  /*                                                                       */
+  /*   This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined.  */
+  /*   It allows FreeType's `ftgzip' component to link to the system's     */
+  /*   installation of the ZLib library.  This is useful on systems like   */
+  /*   Unix or VMS where it generally is already available.                */
+  /*                                                                       */
+  /*   If you let it undefined, the component will use its own copy        */
+  /*   of the zlib sources instead.  These have been modified to be        */
+  /*   included directly within the component and *not* export external    */
+  /*   function names.  This allows you to link any program with FreeType  */
+  /*   _and_ ZLib without linking conflicts.                               */
+  /*                                                                       */
+  /*   Do not #undef this macro here since the build system might define   */
+  /*   it for certain configurations only.                                 */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Bzip2-compressed file support.                                        */
+  /*                                                                       */
+  /*   FreeType now handles font files that have been compressed with the  */
+  /*   `bzip2' program.  This is mostly used to parse many of the PCF      */
+  /*   files that come with XFree86.  The implementation uses `libbz2' to  */
+  /*   partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */
+  /*   Contrary to gzip, bzip2 currently is not included and need to use   */
+  /*   the system available bzip2 implementation.                          */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.             */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_USE_BZIP2 */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define to disable the use of file stream functions and types, FILE,   */
+  /* fopen() etc.  Enables the use of smaller system libraries on embedded */
+  /* systems that have multiple system libraries, some with or without     */
+  /* file stream support, in the cases where file stream support is not    */
+  /* necessary such as memory loading of font files.                       */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  PNG bitmap support.                                                  */
+  /*                                                                       */
+  /*   FreeType now handles loading color bitmap glyphs in the PNG format. */
+  /*   This requires help from the external libpng library.  Uncompressed  */
+  /*   color bitmaps do not need any external libraries and will be        */
+  /*   supported regardless of this configuration.                         */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.             */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_USE_PNG */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DLL export compilation                                                */
+  /*                                                                       */
+  /*   When compiling FreeType as a DLL, some systems/compilers need a     */
+  /*   special keyword in front OR after the return type of function       */
+  /*   declarations.                                                       */
+  /*                                                                       */
+  /*   Two macros are used within the FreeType source code to define       */
+  /*   exported library functions: FT_EXPORT and FT_EXPORT_DEF.            */
+  /*                                                                       */
+  /*     FT_EXPORT( return_type )                                          */
+  /*                                                                       */
+  /*       is used in a function declaration, as in                        */
+  /*                                                                       */
+  /*         FT_EXPORT( FT_Error )                                         */
+  /*         FT_Init_FreeType( FT_Library*  alibrary );                    */
+  /*                                                                       */
+  /*                                                                       */
+  /*     FT_EXPORT_DEF( return_type )                                      */
+  /*                                                                       */
+  /*       is used in a function definition, as in                         */
+  /*                                                                       */
+  /*         FT_EXPORT_DEF( FT_Error )                                     */
+  /*         FT_Init_FreeType( FT_Library*  alibrary )                     */
+  /*         {                                                             */
+  /*           ... some code ...                                           */
+  /*           return FT_Err_Ok;                                           */
+  /*         }                                                             */
+  /*                                                                       */
+  /*   You can provide your own implementation of FT_EXPORT and            */
+  /*   FT_EXPORT_DEF here if you want.  If you leave them undefined, they  */
+  /*   will be later automatically defined as `extern return_type' to      */
+  /*   allow normal compilation.                                           */
+  /*                                                                       */
+  /*   Do not #undef these macros here since the build system might define */
+  /*   them for certain configurations only.                               */
+  /*                                                                       */
+/* #define FT_EXPORT(x)      extern x */
+/* #define FT_EXPORT_DEF(x)  x */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Glyph Postscript Names handling                                       */
+  /*                                                                       */
+  /*   By default, FreeType 2 is compiled with the `psnames' module.  This */
+  /*   module is in charge of converting a glyph name string into a        */
+  /*   Unicode value, or return a Macintosh standard glyph name for the    */
+  /*   use with the TrueType `post' table.                                 */
+  /*                                                                       */
+  /*   Undefine this macro if you do not want `psnames' compiled in your   */
+  /*   build of FreeType.  This has the following effects:                 */
+  /*                                                                       */
+  /*   - The TrueType driver will provide its own set of glyph names,      */
+  /*     if you build it to support postscript names in the TrueType       */
+  /*     `post' table.                                                     */
+  /*                                                                       */
+  /*   - The Type 1 driver will not be able to synthesize a Unicode        */
+  /*     charmap out of the glyphs found in the fonts.                     */
+  /*                                                                       */
+  /*   You would normally undefine this configuration macro when building  */
+  /*   a version of FreeType that doesn't contain a Type 1 or CFF driver.  */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Postscript Names to Unicode Values support                            */
+  /*                                                                       */
+  /*   By default, FreeType 2 is built with the `PSNames' module compiled  */
+  /*   in.  Among other things, the module is used to convert a glyph name */
+  /*   into a Unicode value.  This is especially useful in order to        */
+  /*   synthesize on the fly a Unicode charmap from the CFF/Type 1 driver  */
+  /*   through a big table named the `Adobe Glyph List' (AGL).             */
+  /*                                                                       */
+  /*   Undefine this macro if you do not want the Adobe Glyph List         */
+  /*   compiled in your `PSNames' module.  The Type 1 driver will not be   */
+  /*   able to synthesize a Unicode charmap out of the glyphs found in the */
+  /*   fonts.                                                              */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Support for Mac fonts                                                 */
+  /*                                                                       */
+  /*   Define this macro if you want support for outline fonts in Mac      */
+  /*   format (mac dfont, mac resource, macbinary containing a mac         */
+  /*   resource) on non-Mac platforms.                                     */
+  /*                                                                       */
+  /*   Note that the `FOND' resource isn't checked.                        */
+  /*                                                                       */
+//#define FT_CONFIG_OPTION_MAC_FONTS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Guessing methods to access embedded resource forks                    */
+  /*                                                                       */
+  /*   Enable extra Mac fonts support on non-Mac platforms (e.g.           */
+  /*   GNU/Linux).                                                         */
+  /*                                                                       */
+  /*   Resource forks which include fonts data are stored sometimes in     */
+  /*   locations which users or developers don't expected.  In some cases, */
+  /*   resource forks start with some offset from the head of a file.  In  */
+  /*   other cases, the actual resource fork is stored in file different   */
+  /*   from what the user specifies.  If this option is activated,         */
+  /*   FreeType tries to guess whether such offsets or different file      */
+  /*   names must be used.                                                 */
+  /*                                                                       */
+  /*   Note that normal, direct access of resource forks is controlled via */
+  /*   the FT_CONFIG_OPTION_MAC_FONTS option.                              */
+  /*                                                                       */
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Allow the use of FT_Incremental_Interface to load typefaces that      */
+  /* contain no glyph data, but supply it via a callback function.         */
+  /* This is required by clients supporting document formats which         */
+  /* supply font data incrementally as the document is parsed, such        */
+  /* as the Ghostscript interpreter for the PostScript language.           */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_INCREMENTAL
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The size in bytes of the render pool used by the scan-line converter  */
+  /* to do all of its work.                                                */
+  /*                                                                       */
+  /* This must be greater than 4KByte if you use FreeType to rasterize     */
+  /* glyphs; otherwise, you may set it to zero to avoid unnecessary        */
+  /* allocation of the render pool.                                        */
+  /*                                                                       */
+#define FT_RENDER_POOL_SIZE  16384L
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FT_MAX_MODULES                                                        */
+  /*                                                                       */
+  /*   The maximum number of modules that can be registered in a single    */
+  /*   FreeType library object.  32 is the default.                        */
+  /*                                                                       */
+#define FT_MAX_MODULES  32
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Debug level                                                           */
+  /*                                                                       */
+  /*   FreeType can be compiled in debug or trace mode.  In debug mode,    */
+  /*   errors are reported through the `ftdebug' component.  In trace      */
+  /*   mode, additional messages are sent to the standard output during    */
+  /*   execution.                                                          */
+  /*                                                                       */
+  /*   Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode.     */
+  /*   Define FT_DEBUG_LEVEL_TRACE to build it in trace mode.              */
+  /*                                                                       */
+  /*   Don't define any of these macros to compile in `release' mode!      */
+  /*                                                                       */
+  /*   Do not #undef these macros here since the build system might define */
+  /*   them for certain configurations only.                               */
+  /*                                                                       */
+/* #define FT_DEBUG_LEVEL_ERROR */
+/* #define FT_DEBUG_LEVEL_TRACE */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Autofitter debugging                                                  */
+  /*                                                                       */
+  /*   If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to     */
+  /*   control the autofitter behaviour for debugging purposes with global */
+  /*   boolean variables (consequently, you should *never* enable this     */
+  /*   while compiling in `release' mode):                                 */
+  /*                                                                       */
+  /*     _af_debug_disable_horz_hints                                      */
+  /*     _af_debug_disable_vert_hints                                      */
+  /*     _af_debug_disable_blue_hints                                      */
+  /*                                                                       */
+  /*   Additionally, the following functions provide dumps of various      */
+  /*   internal autofit structures to stdout (using `printf'):             */
+  /*                                                                       */
+  /*     af_glyph_hints_dump_points                                        */
+  /*     af_glyph_hints_dump_segments                                      */
+  /*     af_glyph_hints_dump_edges                                         */
+  /*                                                                       */
+  /*   As an argument, they use another global variable:                   */
+  /*                                                                       */
+  /*     _af_debug_hints                                                   */
+  /*                                                                       */
+  /*   Please have a look at the `ftgrid' demo program to see how those    */
+  /*   variables and macros should be used.                                */
+  /*                                                                       */
+  /*   Do not #undef these macros here since the build system might define */
+  /*   them for certain configurations only.                               */
+  /*                                                                       */
+/* #define FT_DEBUG_AUTOFIT */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Memory Debugging                                                      */
+  /*                                                                       */
+  /*   FreeType now comes with an integrated memory debugger that is       */
+  /*   capable of detecting simple errors like memory leaks or double      */
+  /*   deletes.  To compile it within your build of the library, you       */
+  /*   should define FT_DEBUG_MEMORY here.                                 */
+  /*                                                                       */
+  /*   Note that the memory debugger is only activated at runtime when     */
+  /*   when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */
+  /*                                                                       */
+  /*   Do not #undef this macro here since the build system might define   */
+  /*   it for certain configurations only.                                 */
+  /*                                                                       */
+/* #define FT_DEBUG_MEMORY */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Module errors                                                         */
+  /*                                                                       */
+  /*   If this macro is set (which is _not_ the default), the higher byte  */
+  /*   of an error code gives the module in which the error has occurred,  */
+  /*   while the lower byte is the real error code.                        */
+  /*                                                                       */
+  /*   Setting this macro makes sense for debugging purposes only, since   */
+  /*   it would break source compatibility of certain programs that use    */
+  /*   FreeType 2.                                                         */
+  /*                                                                       */
+  /*   More details can be found in the files ftmoderr.h and fterrors.h.   */
+  /*                                                                       */
+#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Position Independent Code                                             */
+  /*                                                                       */
+  /*   If this macro is set (which is _not_ the default), FreeType2 will   */
+  /*   avoid creating constants that require address fixups.  Instead the  */
+  /*   constants will be moved into a struct and additional intialization  */
+  /*   code will be used.                                                  */
+  /*                                                                       */
+  /*   Setting this macro is needed for systems that prohibit address      */
+  /*   fixups, such as BREW.                                               */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_PIC */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****        S F N T   D R I V E R    C O N F I G U R A T I O N       ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support       */
+  /* embedded bitmaps in all formats using the SFNT module (namely         */
+  /* TrueType & OpenType).                                                 */
+  /*                                                                       */
+#undef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to    */
+  /* load and enumerate the glyph Postscript names in a TrueType or        */
+  /* OpenType file.                                                        */
+  /*                                                                       */
+  /* Note that when you do not compile the `PSNames' module by undefining  */
+  /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will   */
+  /* contain additional code used to read the PS Names table from a font.  */
+  /*                                                                       */
+  /* (By default, the module uses `PSNames' to extract glyph names.)       */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to       */
+  /* access the internal name table in a SFNT-based format like TrueType   */
+  /* or OpenType.  The name table contains various strings used to         */
+  /* describe the font, like family name, copyright, version, etc.  It     */
+  /* does not contain any glyph name though.                               */
+  /*                                                                       */
+  /* Accessing SFNT names is done through the functions declared in        */
+  /* `freetype/ftsnames.h'.                                                */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_SFNT_NAMES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TrueType CMap support                                                 */
+  /*                                                                       */
+  /*   Here you can fine-tune which TrueType CMap table format shall be    */
+  /*   supported.                                                          */
+#define TT_CONFIG_CMAP_FORMAT_0
+#define TT_CONFIG_CMAP_FORMAT_2
+#define TT_CONFIG_CMAP_FORMAT_4
+#define TT_CONFIG_CMAP_FORMAT_6
+#define TT_CONFIG_CMAP_FORMAT_8
+#define TT_CONFIG_CMAP_FORMAT_10
+#define TT_CONFIG_CMAP_FORMAT_12
+#define TT_CONFIG_CMAP_FORMAT_13
+#define TT_CONFIG_CMAP_FORMAT_14
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****    T R U E T Y P E   D R I V E R    C O N F I G U R A T I O N   ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile   */
+  /* a bytecode interpreter in the TrueType driver.                        */
+  /*                                                                       */
+  /* By undefining this, you will only compile the code necessary to load  */
+  /* TrueType glyphs without hinting.                                      */
+  /*                                                                       */
+  /*   Do not #undef this macro here, since the build system might         */
+  /*   define it for certain configurations only.                          */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile       */
+  /* EXPERIMENTAL subpixel hinting support into the TrueType driver.  This */
+  /* replaces the native TrueType hinting mechanism when anything but      */
+  /* FT_RENDER_MODE_MONO is requested.                                     */
+  /*                                                                       */
+  /* Enabling this causes the TrueType driver to ignore instructions under */
+  /* certain conditions.  This is done in accordance with the guide here,  */
+  /* with some minor differences:                                          */
+  /*                                                                       */
+  /*  http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
+  /*                                                                       */
+  /* By undefining this, you only compile the code necessary to hint       */
+  /* TrueType glyphs with native TT hinting.                               */
+  /*                                                                       */
+  /*   This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be    */
+  /*   defined.                                                            */
+  /*                                                                       */
+/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version  */
+  /* of the TrueType bytecode interpreter is used that doesn't implement   */
+  /* any of the patented opcodes and algorithms.  The patents related to   */
+  /* TrueType hinting have expired worldwide since May 2010; this option   */
+  /* is now deprecated.                                                    */
+  /*                                                                       */
+  /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored*  */
+  /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words,  */
+  /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or                */
+  /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time.    */
+  /*                                                                       */
+  /* This macro is only useful for a small number of font files (mostly    */
+  /* for Asian scripts) that require bytecode interpretation to properly   */
+  /* load glyphs.  For all other fonts, this produces unpleasant results,  */
+  /* thus the unpatented interpreter is never used to load glyphs from     */
+  /* TrueType fonts unless one of the following two options is used.       */
+  /*                                                                       */
+  /*   - The unpatented interpreter is explicitly activated by the user    */
+  /*     through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag         */
+  /*     when opening the FT_Face.                                         */
+  /*                                                                       */
+  /*   - FreeType detects that the FT_Face corresponds to one of the       */
+  /*     `trick' fonts (e.g., `Mingliu') it knows about.  The font engine  */
+  /*     contains a hard-coded list of font names and other matching       */
+  /*     parameters (see function `tt_face_init' in file                   */
+  /*     `src/truetype/ttobjs.c').                                         */
+  /*                                                                       */
+  /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */
+  /*                                                                       */
+  /*   {                                                                   */
+  /*     FT_Parameter  parameter;                                          */
+  /*     FT_Open_Args  open_args;                                          */
+  /*                                                                       */
+  /*                                                                       */
+  /*     parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING;                  */
+  /*                                                                       */
+  /*     open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;         */
+  /*     open_args.pathname   = my_font_pathname;                          */
+  /*     open_args.num_params = 1;                                         */
+  /*     open_args.params     = &parameter;                                */
+  /*                                                                       */
+  /*     error = FT_Open_Face( library, &open_args, index, &face );        */
+  /*     ...                                                               */
+  /*   }                                                                   */
+  /*                                                                       */
+/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType    */
+  /* bytecode interpreter with a huge switch statement, rather than a call */
+  /* table.  This results in smaller and faster code for a number of       */
+  /* architectures.                                                        */
+  /*                                                                       */
+  /* Note however that on some compiler/processor combinations, undefining */
+  /* this macro will generate faster, though larger, code.                 */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the        */
+  /* TrueType glyph loader to use Apple's definition of how to handle      */
+  /* component offsets in composite glyphs.                                */
+  /*                                                                       */
+  /* Apple and MS disagree on the default behavior of component offsets    */
+  /* in composites.  Apple says that they should be scaled by the scaling  */
+  /* factors in the transformation matrix (roughly, it's more complex)     */
+  /* while MS says they should not.  OpenType defines two bits in the      */
+  /* composite flags array which can be used to disambiguate, but old      */
+  /* fonts will not have them.                                             */
+  /*                                                                       */
+  /*   http://www.microsoft.com/typography/otspec/glyf.htm                 */
+  /*   http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html                 */
+  /*                                                                       */
+#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include         */
+  /* support for Apple's distortable font technology (fvar, gvar, cvar,    */
+  /* and avar tables).  This has many similarities to Type 1 Multiple      */
+  /* Masters support.                                                      */
+  /*                                                                       */
+#undef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_BDF if you want to include support for        */
+  /* an embedded `BDF ' table within SFNT-based bitmap formats.            */
+  /*                                                                       */
+#undef TT_CONFIG_OPTION_BDF
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****      T Y P E 1   D R I V E R    C O N F I G U R A T I O N       ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and       */
+  /* arrays in the Type 1 stream (see t1load.c).  A minimum of 4 is        */
+  /* required.                                                             */
+  /*                                                                       */
+#define T1_MAX_DICT_DEPTH  5
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */
+  /* calls during glyph loading.                                           */
+  /*                                                                       */
+#define T1_MAX_SUBRS_CALLS  16
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */
+  /* minimum of 16 is required.                                            */
+  /*                                                                       */
+  /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */
+  /*                                                                       */
+#define T1_MAX_CHARSTRINGS_OPERANDS  512
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define this configuration macro if you want to prevent the            */
+  /* compilation of `t1afm', which is in charge of reading Type 1 AFM      */
+  /* files into an existing face.  Note that if set, the T1 driver will be */
+  /* unable to produce kerning distances.                                  */
+  /*                                                                       */
+#undef T1_CONFIG_OPTION_NO_AFM
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define this configuration macro if you want to prevent the            */
+  /* compilation of the Multiple Masters font support in the Type 1        */
+  /* driver.                                                               */
+  /*                                                                       */
+#undef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****         C F F   D R I V E R    C O N F I G U R A T I O N        ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF       */
+  /* engine gets compiled into FreeType.  If defined, it is possible to    */
+  /* switch between the two engines using the `hinting-engine' property of */
+  /* the cff driver module.                                                */
+  /*                                                                       */
+/* #define CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****    A U T O F I T   M O D U L E    C O N F I G U R A T I O N     ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compile autofit module with CJK (Chinese, Japanese, Korean) script    */
+  /* support.                                                              */
+  /*                                                                       */
+#define AF_CONFIG_OPTION_CJK
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compile autofit module with Indic script support.                     */
+  /*                                                                       */
+#define AF_CONFIG_OPTION_INDIC
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compile autofit module with warp hinting.  The idea of the warping    */
+  /* code is to slightly scale and shift a glyph within a single dimension */
+  /* so that as much of its segments are aligned (more or less) on the     */
+  /* grid.  To find out the optimal scaling and shifting value, various    */
+  /* parameter combinations are tried and scored.                          */
+  /*                                                                       */
+  /* This experimental option is only active if the render mode is         */
+  /* FT_RENDER_MODE_LIGHT.                                                 */
+  /*                                                                       */
+/* #define AF_CONFIG_OPTION_USE_WARPER */
+
+  /* */
+
+
+  /*
+   *  This macro is obsolete.  Support has been removed in FreeType
+   *  version 2.5.
+   */
+/* #define FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+  /*
+   * This macro is defined if either unpatented or native TrueType
+   * hinting is requested by the definitions above.
+   */
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+#define  TT_USE_BYTECODE_INTERPRETER
+#undef   TT_CONFIG_OPTION_UNPATENTED_HINTING
+#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define  TT_USE_BYTECODE_INTERPRETER
+#endif
+
+FT_END_HEADER
+
+
+#endif /* __FTOPTION_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/config/ftstdlib.h b/core/include/thirdparties/freetype/freetype/config/ftstdlib.h
new file mode 100644
index 0000000..03be04d
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/config/ftstdlib.h
@@ -0,0 +1,174 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstdlib.h                                                             */
+/*                                                                         */
+/*    ANSI-specific library and header configuration file (specification   */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 2002-2007, 2009, 2011-2012 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to group all #includes to the ANSI C library that   */
+  /* FreeType normally requires.  It also defines macros to rename the     */
+  /* standard functions within the FreeType source code.                   */
+  /*                                                                       */
+  /* Load a file which defines __FTSTDLIB_H__ before this one to override  */
+  /* it.                                                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTSTDLIB_H__
+#define __FTSTDLIB_H__
+
+
+#include <stddef.h>
+
+#define ft_ptrdiff_t  ptrdiff_t
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                           integer limits                           */
+  /*                                                                    */
+  /* UINT_MAX and ULONG_MAX are used to automatically compute the size  */
+  /* of `int' and `long' in bytes at compile-time.  So far, this works  */
+  /* for all platforms the library has been tested on.                  */
+  /*                                                                    */
+  /* Note that on the extremely rare platforms that do not provide      */
+  /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some    */
+  /* old Crays where `int' is 36 bits), we do not make any guarantee    */
+  /* about the correct behaviour of FT2 with all fonts.                 */
+  /*                                                                    */
+  /* In these case, `ftconfig.h' will refuse to compile anyway with a   */
+  /* message like `couldn't find 32-bit type' or something similar.     */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#include <limits.h>
+
+#define FT_CHAR_BIT    CHAR_BIT
+#define FT_USHORT_MAX  USHRT_MAX
+#define FT_INT_MAX     INT_MAX
+#define FT_INT_MIN     INT_MIN
+#define FT_UINT_MAX    UINT_MAX
+#define FT_ULONG_MAX   ULONG_MAX
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                 character and string processing                    */
+  /*                                                                    */
+  /**********************************************************************/
+
+#include "../../../../fxcrt/fx_system.h"
+#include <string.h>
+
+#define ft_memchr   FXSYS_memchr
+#define ft_memcmp   FXSYS_memcmp32
+#define ft_memcpy   FXSYS_memcpy32
+#define ft_memmove  FXSYS_memmove32
+#define ft_memset   FXSYS_memset8
+//#define ft_strcat   FXSYS_strcat
+#define ft_strcmp   FXSYS_strcmp
+#define ft_strcpy   FXSYS_strcpy
+#define ft_strlen   FXSYS_strlen
+#define ft_strncmp  FXSYS_strncmp
+#define ft_strncpy  FXSYS_strncpy
+#define ft_strrchr  FXSYS_strrchr
+#define ft_strstr   FXSYS_strstr
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                           file handling                            */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#include <stdio.h>
+
+#define FT_FILE     FXSYS_FILE
+#define ft_fclose   FXSYS_fclose
+#define ft_fopen    FXSYS_fopen
+#define ft_fread    FXSYS_fread
+#define ft_fseek    FXSYS_fseek
+#define ft_ftell    FXSYS_ftell
+#define ft_sprintf  FXSYS_sprintf
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                             sorting                                */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+//#include <stdlib.h>
+
+#define ft_qsort  FXSYS_qsort
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                        memory allocation                           */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#define ft_scalloc   calloc
+#define ft_sfree     free
+#define ft_smalloc   malloc
+#define ft_srealloc  realloc
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                          miscellaneous                             */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#define ft_atol   FXSYS_atoi
+#define ft_labs   labs
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                         execution control                          */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+//#include <setjmp.h>
+
+#define ft_jmp_buf     jmp_buf  /* note: this cannot be a typedef since */
+                                /*       jmp_buf is defined as a macro  */
+                                /*       on certain platforms           */
+
+#define ft_longjmp     longjmp
+#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */
+
+
+  /* the following is only used for debugging purposes, i.e., if */
+  /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined    */
+
+#include <stdarg.h>
+
+
+#endif /* __FTSTDLIB_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/freetype.h b/core/include/thirdparties/freetype/freetype/freetype.h
new file mode 100644
index 0000000..7a31923
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/freetype.h
@@ -0,0 +1,4016 @@
+/***************************************************************************/

+/*                                                                         */

+/*  freetype.h                                                             */

+/*                                                                         */

+/*    FreeType high-level API and common types (specification only).       */

+/*                                                                         */

+/*  Copyright 1996-2013 by                                                 */

+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */

+/*                                                                         */

+/*  This file is part of the FreeType project, and may only be used,       */

+/*  modified, and distributed under the terms of the FreeType project      */

+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */

+/*  this file you indicate that you have read the license and              */

+/*  understand and accept it fully.                                        */

+/*                                                                         */

+/***************************************************************************/

+

+

+#ifndef __FREETYPE_H__

+#define __FREETYPE_H__

+

+

+#ifndef FT_FREETYPE_H

+#error "`ft2build.h' hasn't been included yet!"

+#error "Please always use macros to include FreeType header files."

+#error "Example:"

+#error "  #include <ft2build.h>"

+#error "  #include FT_FREETYPE_H"

+#endif

+

+

+#include "../ft2build.h"

+#include "config/ftconfig.h"

+#include "fttypes.h"

+#include "fterrors.h"

+

+

+FT_BEGIN_HEADER

+

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Section>                                                             */

+  /*    user_allocation                                                    */

+  /*                                                                       */

+  /* <Title>                                                               */

+  /*    User allocation                                                    */

+  /*                                                                       */

+  /* <Abstract>                                                            */

+  /*    How client applications should allocate FreeType data structures.  */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    FreeType assumes that structures allocated by the user and passed  */

+  /*    as arguments are zeroed out except for the actual data.  In other  */

+  /*    words, it is recommended to use `calloc' (or variants of it)       */

+  /*    instead of `malloc' for allocation.                                */

+  /*                                                                       */

+  /*************************************************************************/

+

+

+

+  /*************************************************************************/

+  /*************************************************************************/

+  /*                                                                       */

+  /*                        B A S I C   T Y P E S                          */

+  /*                                                                       */

+  /*************************************************************************/

+  /*************************************************************************/

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Section>                                                             */

+  /*    base_interface                                                     */

+  /*                                                                       */

+  /* <Title>                                                               */

+  /*    Base Interface                                                     */

+  /*                                                                       */

+  /* <Abstract>                                                            */

+  /*    The FreeType~2 base font interface.                                */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This section describes the public high-level API of FreeType~2.    */

+  /*                                                                       */

+  /* <Order>                                                               */

+  /*    FT_Library                                                         */

+  /*    FT_Face                                                            */

+  /*    FT_Size                                                            */

+  /*    FT_GlyphSlot                                                       */

+  /*    FT_CharMap                                                         */

+  /*    FT_Encoding                                                        */

+  /*                                                                       */

+  /*    FT_FaceRec                                                         */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_SCALABLE                                              */

+  /*    FT_FACE_FLAG_FIXED_SIZES                                           */

+  /*    FT_FACE_FLAG_FIXED_WIDTH                                           */

+  /*    FT_FACE_FLAG_HORIZONTAL                                            */

+  /*    FT_FACE_FLAG_VERTICAL                                              */

+  /*    FT_FACE_FLAG_SFNT                                                  */

+  /*    FT_FACE_FLAG_KERNING                                               */

+  /*    FT_FACE_FLAG_MULTIPLE_MASTERS                                      */

+  /*    FT_FACE_FLAG_GLYPH_NAMES                                           */

+  /*    FT_FACE_FLAG_EXTERNAL_STREAM                                       */

+  /*    FT_FACE_FLAG_FAST_GLYPHS                                           */

+  /*    FT_FACE_FLAG_HINTER                                                */

+  /*                                                                       */

+  /*    FT_STYLE_FLAG_BOLD                                                 */

+  /*    FT_STYLE_FLAG_ITALIC                                               */

+  /*                                                                       */

+  /*    FT_SizeRec                                                         */

+  /*    FT_Size_Metrics                                                    */

+  /*                                                                       */

+  /*    FT_GlyphSlotRec                                                    */

+  /*    FT_Glyph_Metrics                                                   */

+  /*    FT_SubGlyph                                                        */

+  /*                                                                       */

+  /*    FT_Bitmap_Size                                                     */

+  /*                                                                       */

+  /*    FT_Init_FreeType                                                   */

+  /*    FT_Done_FreeType                                                   */

+  /*                                                                       */

+  /*    FT_New_Face                                                        */

+  /*    FT_Done_Face                                                       */

+  /*    FT_New_Memory_Face                                                 */

+  /*    FT_Open_Face                                                       */

+  /*    FT_Open_Args                                                       */

+  /*    FT_Parameter                                                       */

+  /*    FT_Attach_File                                                     */

+  /*    FT_Attach_Stream                                                   */

+  /*                                                                       */

+  /*    FT_Set_Char_Size                                                   */

+  /*    FT_Set_Pixel_Sizes                                                 */

+  /*    FT_Request_Size                                                    */

+  /*    FT_Select_Size                                                     */

+  /*    FT_Size_Request_Type                                               */

+  /*    FT_Size_Request                                                    */

+  /*    FT_Set_Transform                                                   */

+  /*    FT_Load_Glyph                                                      */

+  /*    FT_Get_Char_Index                                                  */

+  /*    FT_Get_Name_Index                                                  */

+  /*    FT_Load_Char                                                       */

+  /*                                                                       */

+  /*    FT_OPEN_MEMORY                                                     */

+  /*    FT_OPEN_STREAM                                                     */

+  /*    FT_OPEN_PATHNAME                                                   */

+  /*    FT_OPEN_DRIVER                                                     */

+  /*    FT_OPEN_PARAMS                                                     */

+  /*                                                                       */

+  /*    FT_LOAD_DEFAULT                                                    */

+  /*    FT_LOAD_RENDER                                                     */

+  /*    FT_LOAD_MONOCHROME                                                 */

+  /*    FT_LOAD_LINEAR_DESIGN                                              */

+  /*    FT_LOAD_NO_SCALE                                                   */

+  /*    FT_LOAD_NO_HINTING                                                 */

+  /*    FT_LOAD_NO_BITMAP                                                  */

+  /*    FT_LOAD_CROP_BITMAP                                                */

+  /*                                                                       */

+  /*    FT_LOAD_VERTICAL_LAYOUT                                            */

+  /*    FT_LOAD_IGNORE_TRANSFORM                                           */

+  /*    FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH                                */

+  /*    FT_LOAD_FORCE_AUTOHINT                                             */

+  /*    FT_LOAD_NO_RECURSE                                                 */

+  /*    FT_LOAD_PEDANTIC                                                   */

+  /*                                                                       */

+  /*    FT_LOAD_TARGET_NORMAL                                              */

+  /*    FT_LOAD_TARGET_LIGHT                                               */

+  /*    FT_LOAD_TARGET_MONO                                                */

+  /*    FT_LOAD_TARGET_LCD                                                 */

+  /*    FT_LOAD_TARGET_LCD_V                                               */

+  /*                                                                       */

+  /*    FT_Render_Glyph                                                    */

+  /*    FT_Render_Mode                                                     */

+  /*    FT_Get_Kerning                                                     */

+  /*    FT_Kerning_Mode                                                    */

+  /*    FT_Get_Track_Kerning                                               */

+  /*    FT_Get_Glyph_Name                                                  */

+  /*    FT_Get_Postscript_Name                                             */

+  /*                                                                       */

+  /*    FT_CharMapRec                                                      */

+  /*    FT_Select_Charmap                                                  */

+  /*    FT_Set_Charmap                                                     */

+  /*    FT_Get_Charmap_Index                                               */

+  /*                                                                       */

+  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING                                    */

+  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING                             */

+  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING                              */

+  /*    FT_FSTYPE_EDITABLE_EMBEDDING                                       */

+  /*    FT_FSTYPE_NO_SUBSETTING                                            */

+  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY                                    */

+  /*                                                                       */

+  /*    FT_Get_FSType_Flags                                                */

+  /*                                                                       */

+  /*************************************************************************/

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Struct>                                                              */

+  /*    FT_Glyph_Metrics                                                   */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A structure used to model the metrics of a single glyph.  The      */

+  /*    values are expressed in 26.6 fractional pixel format; if the flag  */

+  /*    @FT_LOAD_NO_SCALE has been used while loading the glyph, values    */

+  /*    are expressed in font units instead.                               */

+  /*                                                                       */

+  /* <Fields>                                                              */

+  /*    width ::                                                           */

+  /*      The glyph's width.                                               */

+  /*                                                                       */

+  /*    height ::                                                          */

+  /*      The glyph's height.                                              */

+  /*                                                                       */

+  /*    horiBearingX ::                                                    */

+  /*      Left side bearing for horizontal layout.                         */

+  /*                                                                       */

+  /*    horiBearingY ::                                                    */

+  /*      Top side bearing for horizontal layout.                          */

+  /*                                                                       */

+  /*    horiAdvance ::                                                     */

+  /*      Advance width for horizontal layout.                             */

+  /*                                                                       */

+  /*    vertBearingX ::                                                    */

+  /*      Left side bearing for vertical layout.                           */

+  /*                                                                       */

+  /*    vertBearingY ::                                                    */

+  /*      Top side bearing for vertical layout.  Larger positive values    */

+  /*      mean further below the vertical glyph origin.                    */

+  /*                                                                       */

+  /*    vertAdvance ::                                                     */

+  /*      Advance height for vertical layout.  Positive values mean the    */

+  /*      glyph has a positive advance downward.                           */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    If not disabled with @FT_LOAD_NO_HINTING, the values represent     */

+  /*    dimensions of the hinted glyph (in case hinting is applicable).    */

+  /*                                                                       */

+  /*    Stroking a glyph with an outside border does not increase          */

+  /*    `horiAdvance' or `vertAdvance'; you have to manually adjust these  */

+  /*    values to account for the added width and height.                  */

+  /*                                                                       */

+  typedef struct  FT_Glyph_Metrics_

+  {

+    FT_Pos  width;

+    FT_Pos  height;

+

+    FT_Pos  horiBearingX;

+    FT_Pos  horiBearingY;

+    FT_Pos  horiAdvance;

+

+    FT_Pos  vertBearingX;

+    FT_Pos  vertBearingY;

+    FT_Pos  vertAdvance;

+

+  } FT_Glyph_Metrics;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Struct>                                                              */

+  /*    FT_Bitmap_Size                                                     */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This structure models the metrics of a bitmap strike (i.e., a set  */

+  /*    of glyphs for a given point size and resolution) in a bitmap font. */

+  /*    It is used for the `available_sizes' field of @FT_Face.            */

+  /*                                                                       */

+  /* <Fields>                                                              */

+  /*    height :: The vertical distance, in pixels, between two            */

+  /*              consecutive baselines.  It is always positive.           */

+  /*                                                                       */

+  /*    width  :: The average width, in pixels, of all glyphs in the       */

+  /*              strike.                                                  */

+  /*                                                                       */

+  /*    size   :: The nominal size of the strike in 26.6 fractional        */

+  /*              points.  This field is not very useful.                  */

+  /*                                                                       */

+  /*    x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional   */

+  /*              pixels.                                                  */

+  /*                                                                       */

+  /*    y_ppem :: The vertical ppem (nominal height) in 26.6 fractional    */

+  /*              pixels.                                                  */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Windows FNT:                                                       */

+  /*      The nominal size given in a FNT font is not reliable.  Thus when */

+  /*      the driver finds it incorrect, it sets `size' to some calculated */

+  /*      values and sets `x_ppem' and `y_ppem' to the pixel width and     */

+  /*      height given in the font, respectively.                          */

+  /*                                                                       */

+  /*    TrueType embedded bitmaps:                                         */

+  /*      `size', `width', and `height' values are not contained in the    */

+  /*      bitmap strike itself.  They are computed from the global font    */

+  /*      parameters.                                                      */

+  /*                                                                       */

+  typedef struct  FT_Bitmap_Size_

+  {

+    FT_Short  height;

+    FT_Short  width;

+

+    FT_Pos    size;

+

+    FT_Pos    x_ppem;

+    FT_Pos    y_ppem;

+

+  } FT_Bitmap_Size;

+

+

+  /*************************************************************************/

+  /*************************************************************************/

+  /*                                                                       */

+  /*                     O B J E C T   C L A S S E S                       */

+  /*                                                                       */

+  /*************************************************************************/

+  /*************************************************************************/

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Type>                                                                */

+  /*    FT_Library                                                         */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A handle to a FreeType library instance.  Each `library' is        */

+  /*    completely independent from the others; it is the `root' of a set  */

+  /*    of objects like fonts, faces, sizes, etc.                          */

+  /*                                                                       */

+  /*    It also embeds a memory manager (see @FT_Memory), as well as a     */

+  /*    scan-line converter object (see @FT_Raster).                       */

+  /*                                                                       */

+  /*    In multi-threaded applications, make sure that the same FT_Library */

+  /*    object or any of its children doesn't get accessed in parallel.    */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Library objects are normally created by @FT_Init_FreeType, and     */

+  /*    destroyed with @FT_Done_FreeType.  If you need reference-counting  */

+  /*    (cf. @FT_Reference_Library), use @FT_New_Library and               */

+  /*    @FT_Done_Library.                                                  */

+  /*                                                                       */

+  typedef struct FT_LibraryRec_  *FT_Library;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Type>                                                                */

+  /*    FT_Module                                                          */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A handle to a given FreeType module object.  Each module can be a  */

+  /*    font driver, a renderer, or anything else that provides services   */

+  /*    to the formers.                                                    */

+  /*                                                                       */

+  typedef struct FT_ModuleRec_*  FT_Module;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Type>                                                                */

+  /*    FT_Driver                                                          */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A handle to a given FreeType font driver object.  Each font driver */

+  /*    is a special module capable of creating faces from font files.     */

+  /*                                                                       */

+  typedef struct FT_DriverRec_*  FT_Driver;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Type>                                                                */

+  /*    FT_Renderer                                                        */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A handle to a given FreeType renderer.  A renderer is a special    */

+  /*    module in charge of converting a glyph image to a bitmap, when     */

+  /*    necessary.  Each renderer supports a given glyph image format, and */

+  /*    one or more target surface depths.                                 */

+  /*                                                                       */

+  typedef struct FT_RendererRec_*  FT_Renderer;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Type>                                                                */

+  /*    FT_Face                                                            */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A handle to a given typographic face object.  A face object models */

+  /*    a given typeface, in a given style.                                */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Each face object also owns a single @FT_GlyphSlot object, as well  */

+  /*    as one or more @FT_Size objects.                                   */

+  /*                                                                       */

+  /*    Use @FT_New_Face or @FT_Open_Face to create a new face object from */

+  /*    a given filepathname or a custom input stream.                     */

+  /*                                                                       */

+  /*    Use @FT_Done_Face to destroy it (along with its slot and sizes).   */

+  /*                                                                       */

+  /* <Also>                                                                */

+  /*    See @FT_FaceRec for the publicly accessible fields of a given face */

+  /*    object.                                                            */

+  /*                                                                       */

+  typedef struct FT_FaceRec_*  FT_Face;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Type>                                                                */

+  /*    FT_Size                                                            */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A handle to an object used to model a face scaled to a given       */

+  /*    character size.                                                    */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Each @FT_Face has an _active_ @FT_Size object that is used by      */

+  /*    functions like @FT_Load_Glyph to determine the scaling             */

+  /*    transformation which is used to load and hint glyphs and metrics.  */

+  /*                                                                       */

+  /*    You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes,                */

+  /*    @FT_Request_Size or even @FT_Select_Size to change the content     */

+  /*    (i.e., the scaling values) of the active @FT_Size.                 */

+  /*                                                                       */

+  /*    You can use @FT_New_Size to create additional size objects for a   */

+  /*    given @FT_Face, but they won't be used by other functions until    */

+  /*    you activate it through @FT_Activate_Size.  Only one size can be   */

+  /*    activated at any given time per face.                              */

+  /*                                                                       */

+  /* <Also>                                                                */

+  /*    See @FT_SizeRec for the publicly accessible fields of a given size */

+  /*    object.                                                            */

+  /*                                                                       */

+  typedef struct FT_SizeRec_*  FT_Size;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Type>                                                                */

+  /*    FT_GlyphSlot                                                       */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A handle to a given `glyph slot'.  A slot is a container where it  */

+  /*    is possible to load any of the glyphs contained in its parent      */

+  /*    face.                                                              */

+  /*                                                                       */

+  /*    In other words, each time you call @FT_Load_Glyph or               */

+  /*    @FT_Load_Char, the slot's content is erased by the new glyph data, */

+  /*    i.e., the glyph's metrics, its image (bitmap or outline), and      */

+  /*    other control information.                                         */

+  /*                                                                       */

+  /* <Also>                                                                */

+  /*    See @FT_GlyphSlotRec for the publicly accessible glyph fields.     */

+  /*                                                                       */

+  typedef struct FT_GlyphSlotRec_*  FT_GlyphSlot;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Type>                                                                */

+  /*    FT_CharMap                                                         */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A handle to a given character map.  A charmap is used to translate */

+  /*    character codes in a given encoding into glyph indexes for its     */

+  /*    parent's face.  Some font formats may provide several charmaps per */

+  /*    font.                                                              */

+  /*                                                                       */

+  /*    Each face object owns zero or more charmaps, but only one of them  */

+  /*    can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char.   */

+  /*                                                                       */

+  /*    The list of available charmaps in a face is available through the  */

+  /*    `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec.   */

+  /*                                                                       */

+  /*    The currently active charmap is available as `face->charmap'.      */

+  /*    You should call @FT_Set_Charmap to change it.                      */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    When a new face is created (either through @FT_New_Face or         */

+  /*    @FT_Open_Face), the library looks for a Unicode charmap within     */

+  /*    the list and automatically activates it.                           */

+  /*                                                                       */

+  /* <Also>                                                                */

+  /*    See @FT_CharMapRec for the publicly accessible fields of a given   */

+  /*    character map.                                                     */

+  /*                                                                       */

+  typedef struct FT_CharMapRec_*  FT_CharMap;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Macro>                                                               */

+  /*    FT_ENC_TAG                                                         */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This macro converts four-letter tags into an unsigned long.  It is */

+  /*    used to define `encoding' identifiers (see @FT_Encoding).          */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */

+  /*    should redefine this macro in case of problems to something like   */

+  /*    this:                                                              */

+  /*                                                                       */

+  /*    {                                                                  */

+  /*      #define FT_ENC_TAG( value, a, b, c, d )  value                   */

+  /*    }                                                                  */

+  /*                                                                       */

+  /*    to get a simple enumeration without assigning special numbers.     */

+  /*                                                                       */

+

+#ifndef FT_ENC_TAG

+#define FT_ENC_TAG( value, a, b, c, d )         \

+          value = ( ( (FT_UInt32)(a) << 24 ) |  \

+                    ( (FT_UInt32)(b) << 16 ) |  \

+                    ( (FT_UInt32)(c) <<  8 ) |  \

+                      (FT_UInt32)(d)         )

+

+#endif /* FT_ENC_TAG */

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Enum>                                                                */

+  /*    FT_Encoding                                                        */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    An enumeration used to specify character sets supported by         */

+  /*    charmaps.  Used in the @FT_Select_Charmap API function.            */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Despite the name, this enumeration lists specific character        */

+  /*    repertories (i.e., charsets), and not text encoding methods (e.g., */

+  /*    UTF-8, UTF-16, etc.).                                              */

+  /*                                                                       */

+  /*    Other encodings might be defined in the future.                    */

+  /*                                                                       */

+  /* <Values>                                                              */

+  /*    FT_ENCODING_NONE ::                                                */

+  /*      The encoding value~0 is reserved.                                */

+  /*                                                                       */

+  /*    FT_ENCODING_UNICODE ::                                             */

+  /*      Corresponds to the Unicode character set.  This value covers     */

+  /*      all versions of the Unicode repertoire, including ASCII and      */

+  /*      Latin-1.  Most fonts include a Unicode charmap, but not all      */

+  /*      of them.                                                         */

+  /*                                                                       */

+  /*      For example, if you want to access Unicode value U+1F028 (and    */

+  /*      the font contains it), use value 0x1F028 as the input value for  */

+  /*      @FT_Get_Char_Index.                                              */

+  /*                                                                       */

+  /*    FT_ENCODING_MS_SYMBOL ::                                           */

+  /*      Corresponds to the Microsoft Symbol encoding, used to encode     */

+  /*      mathematical symbols in the 32..255 character code range.  For   */

+  /*      more information, see `http://www.ceviz.net/symbol.htm'.         */

+  /*                                                                       */

+  /*    FT_ENCODING_SJIS ::                                                */

+  /*      Corresponds to Japanese SJIS encoding.  More info at             */

+  /*      at `http://langsupport.japanreference.com/encoding.shtml'.       */

+  /*      See note on multi-byte encodings below.                          */

+  /*                                                                       */

+  /*    FT_ENCODING_GB2312 ::                                              */

+  /*      Corresponds to an encoding system for Simplified Chinese as used */

+  /*      used in mainland China.                                          */

+  /*                                                                       */

+  /*    FT_ENCODING_BIG5 ::                                                */

+  /*      Corresponds to an encoding system for Traditional Chinese as     */

+  /*      used in Taiwan and Hong Kong.                                    */

+  /*                                                                       */

+  /*    FT_ENCODING_WANSUNG ::                                             */

+  /*      Corresponds to the Korean encoding system known as Wansung.      */

+  /*      For more information see                                         */

+  /*      `http://www.microsoft.com/typography/unicode/949.txt'.           */

+  /*                                                                       */

+  /*    FT_ENCODING_JOHAB ::                                               */

+  /*      The Korean standard character set (KS~C 5601-1992), which        */

+  /*      corresponds to MS Windows code page 1361.  This character set    */

+  /*      includes all possible Hangeul character combinations.            */

+  /*                                                                       */

+  /*    FT_ENCODING_ADOBE_LATIN_1 ::                                       */

+  /*      Corresponds to a Latin-1 encoding as defined in a Type~1         */

+  /*      PostScript font.  It is limited to 256 character codes.          */

+  /*                                                                       */

+  /*    FT_ENCODING_ADOBE_STANDARD ::                                      */

+  /*      Corresponds to the Adobe Standard encoding, as found in Type~1,  */

+  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */

+  /*      codes.                                                           */

+  /*                                                                       */

+  /*    FT_ENCODING_ADOBE_EXPERT ::                                        */

+  /*      Corresponds to the Adobe Expert encoding, as found in Type~1,    */

+  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */

+  /*      codes.                                                           */

+  /*                                                                       */

+  /*    FT_ENCODING_ADOBE_CUSTOM ::                                        */

+  /*      Corresponds to a custom encoding, as found in Type~1, CFF, and   */

+  /*      OpenType/CFF fonts.  It is limited to 256 character codes.       */

+  /*                                                                       */

+  /*    FT_ENCODING_APPLE_ROMAN ::                                         */

+  /*      Corresponds to the 8-bit Apple roman encoding.  Many TrueType    */

+  /*      and OpenType fonts contain a charmap for this encoding, since    */

+  /*      older versions of Mac OS are able to use it.                     */

+  /*                                                                       */

+  /*    FT_ENCODING_OLD_LATIN_2 ::                                         */

+  /*      This value is deprecated and was never used nor reported by      */

+  /*      FreeType.  Don't use or test for it.                             */

+  /*                                                                       */

+  /*    FT_ENCODING_MS_SJIS ::                                             */

+  /*      Same as FT_ENCODING_SJIS.  Deprecated.                           */

+  /*                                                                       */

+  /*    FT_ENCODING_MS_GB2312 ::                                           */

+  /*      Same as FT_ENCODING_GB2312.  Deprecated.                         */

+  /*                                                                       */

+  /*    FT_ENCODING_MS_BIG5 ::                                             */

+  /*      Same as FT_ENCODING_BIG5.  Deprecated.                           */

+  /*                                                                       */

+  /*    FT_ENCODING_MS_WANSUNG ::                                          */

+  /*      Same as FT_ENCODING_WANSUNG.  Deprecated.                        */

+  /*                                                                       */

+  /*    FT_ENCODING_MS_JOHAB ::                                            */

+  /*      Same as FT_ENCODING_JOHAB.  Deprecated.                          */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    By default, FreeType automatically synthesizes a Unicode charmap   */

+  /*    for PostScript fonts, using their glyph names dictionaries.        */

+  /*    However, it also reports the encodings defined explicitly in the   */

+  /*    font file, for the cases when they are needed, with the Adobe      */

+  /*    values as well.                                                    */

+  /*                                                                       */

+  /*    FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap  */

+  /*    is neither Unicode nor ISO-8859-1 (otherwise it is set to          */

+  /*    FT_ENCODING_UNICODE).  Use @FT_Get_BDF_Charset_ID to find out      */

+  /*    which encoding is really present.  If, for example, the            */

+  /*    `cs_registry' field is `KOI8' and the `cs_encoding' field is `R',  */

+  /*    the font is encoded in KOI8-R.                                     */

+  /*                                                                       */

+  /*    FT_ENCODING_NONE is always set (with a single exception) by the    */

+  /*    winfonts driver.  Use @FT_Get_WinFNT_Header and examine the        */

+  /*    `charset' field of the @FT_WinFNT_HeaderRec structure to find out  */

+  /*    which encoding is really present.  For example,                    */

+  /*    @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for       */

+  /*    Russian).                                                          */

+  /*                                                                       */

+  /*    FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */

+  /*    and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to  */

+  /*    FT_ENCODING_APPLE_ROMAN).                                          */

+  /*                                                                       */

+  /*    If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function       */

+  /*    @FT_Get_CMap_Language_ID  to query the Mac language ID which may   */

+  /*    be needed to be able to distinguish Apple encoding variants.  See  */

+  /*                                                                       */

+  /*      http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT  */

+  /*                                                                       */

+  /*    to get an idea how to do that.  Basically, if the language ID      */

+  /*    is~0, don't use it, otherwise subtract 1 from the language ID.     */

+  /*    Then examine `encoding_id'.  If, for example, `encoding_id' is     */

+  /*    @TT_MAC_ID_ROMAN and the language ID (minus~1) is                  */

+  /*    `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman.        */

+  /*    @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi       */

+  /*    variant the Arabic encoding.                                       */

+  /*                                                                       */

+  typedef enum  FT_Encoding_

+  {

+    FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),

+

+    FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),

+    FT_ENC_TAG( FT_ENCODING_UNICODE,   'u', 'n', 'i', 'c' ),

+

+    FT_ENC_TAG( FT_ENCODING_SJIS,    's', 'j', 'i', 's' ),

+    FT_ENC_TAG( FT_ENCODING_GB2312,  'g', 'b', ' ', ' ' ),

+    FT_ENC_TAG( FT_ENCODING_BIG5,    'b', 'i', 'g', '5' ),

+    FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),

+    FT_ENC_TAG( FT_ENCODING_JOHAB,   'j', 'o', 'h', 'a' ),

+

+    /* for backwards compatibility */

+    FT_ENCODING_MS_SJIS    = FT_ENCODING_SJIS,

+    FT_ENCODING_MS_GB2312  = FT_ENCODING_GB2312,

+    FT_ENCODING_MS_BIG5    = FT_ENCODING_BIG5,

+    FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,

+    FT_ENCODING_MS_JOHAB   = FT_ENCODING_JOHAB,

+

+    FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),

+    FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT,   'A', 'D', 'B', 'E' ),

+    FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM,   'A', 'D', 'B', 'C' ),

+    FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1,  'l', 'a', 't', '1' ),

+

+    FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),

+

+    FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )

+

+  } FT_Encoding;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Enum>                                                                */

+  /*    ft_encoding_xxx                                                    */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    These constants are deprecated; use the corresponding @FT_Encoding */

+  /*    values instead.                                                    */

+  /*                                                                       */

+#define ft_encoding_none            FT_ENCODING_NONE

+#define ft_encoding_unicode         FT_ENCODING_UNICODE

+#define ft_encoding_symbol          FT_ENCODING_MS_SYMBOL

+#define ft_encoding_latin_1         FT_ENCODING_ADOBE_LATIN_1

+#define ft_encoding_latin_2         FT_ENCODING_OLD_LATIN_2

+#define ft_encoding_sjis            FT_ENCODING_SJIS

+#define ft_encoding_gb2312          FT_ENCODING_GB2312

+#define ft_encoding_big5            FT_ENCODING_BIG5

+#define ft_encoding_wansung         FT_ENCODING_WANSUNG

+#define ft_encoding_johab           FT_ENCODING_JOHAB

+

+#define ft_encoding_adobe_standard  FT_ENCODING_ADOBE_STANDARD

+#define ft_encoding_adobe_expert    FT_ENCODING_ADOBE_EXPERT

+#define ft_encoding_adobe_custom    FT_ENCODING_ADOBE_CUSTOM

+#define ft_encoding_apple_roman     FT_ENCODING_APPLE_ROMAN

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Struct>                                                              */

+  /*    FT_CharMapRec                                                      */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    The base charmap structure.                                        */

+  /*                                                                       */

+  /* <Fields>                                                              */

+  /*    face        :: A handle to the parent face object.                 */

+  /*                                                                       */

+  /*    encoding    :: An @FT_Encoding tag identifying the charmap.  Use   */

+  /*                   this with @FT_Select_Charmap.                       */

+  /*                                                                       */

+  /*    platform_id :: An ID number describing the platform for the        */

+  /*                   following encoding ID.  This comes directly from    */

+  /*                   the TrueType specification and should be emulated   */

+  /*                   for other formats.                                  */

+  /*                                                                       */

+  /*    encoding_id :: A platform specific encoding number.  This also     */

+  /*                   comes from the TrueType specification and should be */

+  /*                   emulated similarly.                                 */

+  /*                                                                       */

+  typedef struct  FT_CharMapRec_

+  {

+    FT_Face      face;

+    FT_Encoding  encoding;

+    FT_UShort    platform_id;

+    FT_UShort    encoding_id;

+

+  } FT_CharMapRec;

+

+

+  /*************************************************************************/

+  /*************************************************************************/

+  /*                                                                       */

+  /*                 B A S E   O B J E C T   C L A S S E S                 */

+  /*                                                                       */

+  /*************************************************************************/

+  /*************************************************************************/

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Type>                                                                */

+  /*    FT_Face_Internal                                                   */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    An opaque handle to an `FT_Face_InternalRec' structure, used to    */

+  /*    model private data of a given @FT_Face object.                     */

+  /*                                                                       */

+  /*    This structure might change between releases of FreeType~2 and is  */

+  /*    not generally available to client applications.                    */

+  /*                                                                       */

+  typedef struct FT_Face_InternalRec_*  FT_Face_Internal;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Struct>                                                              */

+  /*    FT_FaceRec                                                         */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    FreeType root face class structure.  A face object models a        */

+  /*    typeface in a font file.                                           */

+  /*                                                                       */

+  /* <Fields>                                                              */

+  /*    num_faces           :: The number of faces in the font file.  Some */

+  /*                           font formats can have multiple faces in     */

+  /*                           a font file.                                */

+  /*                                                                       */

+  /*    face_index          :: The index of the face in the font file.  It */

+  /*                           is set to~0 if there is only one face in    */

+  /*                           the font file.                              */

+  /*                                                                       */

+  /*    face_flags          :: A set of bit flags that give important      */

+  /*                           information about the face; see             */

+  /*                           @FT_FACE_FLAG_XXX for the details.          */

+  /*                                                                       */

+  /*    style_flags         :: A set of bit flags indicating the style of  */

+  /*                           the face; see @FT_STYLE_FLAG_XXX for the    */

+  /*                           details.                                    */

+  /*                                                                       */

+  /*    num_glyphs          :: The number of glyphs in the face.  If the   */

+  /*                           face is scalable and has sbits (see         */

+  /*                           `num_fixed_sizes'), it is set to the number */

+  /*                           of outline glyphs.                          */

+  /*                                                                       */

+  /*                           For CID-keyed fonts, this value gives the   */

+  /*                           highest CID used in the font.               */

+  /*                                                                       */

+  /*    family_name         :: The face's family name.  This is an ASCII   */

+  /*                           string, usually in English, which describes */

+  /*                           the typeface's family (like `Times New      */

+  /*                           Roman', `Bodoni', `Garamond', etc).  This   */

+  /*                           is a least common denominator used to list  */

+  /*                           fonts.  Some formats (TrueType & OpenType)  */

+  /*                           provide localized and Unicode versions of   */

+  /*                           this string.  Applications should use the   */

+  /*                           format specific interface to access them.   */

+  /*                           Can be NULL (e.g., in fonts embedded in a   */

+  /*                           PDF file).                                  */

+  /*                                                                       */

+  /*    style_name          :: The face's style name.  This is an ASCII    */

+  /*                           string, usually in English, which describes */

+  /*                           the typeface's style (like `Italic',        */

+  /*                           `Bold', `Condensed', etc).  Not all font    */

+  /*                           formats provide a style name, so this field */

+  /*                           is optional, and can be set to NULL.  As    */

+  /*                           for `family_name', some formats provide     */

+  /*                           localized and Unicode versions of this      */

+  /*                           string.  Applications should use the format */

+  /*                           specific interface to access them.          */

+  /*                                                                       */

+  /*    num_fixed_sizes     :: The number of bitmap strikes in the face.   */

+  /*                           Even if the face is scalable, there might   */

+  /*                           still be bitmap strikes, which are called   */

+  /*                           `sbits' in that case.                       */

+  /*                                                                       */

+  /*    available_sizes     :: An array of @FT_Bitmap_Size for all bitmap  */

+  /*                           strikes in the face.  It is set to NULL if  */

+  /*                           there is no bitmap strike.                  */

+  /*                                                                       */

+  /*    num_charmaps        :: The number of charmaps in the face.         */

+  /*                                                                       */

+  /*    charmaps            :: An array of the charmaps of the face.       */

+  /*                                                                       */

+  /*    generic             :: A field reserved for client uses.  See the  */

+  /*                           @FT_Generic type description.               */

+  /*                                                                       */

+  /*    bbox                :: The font bounding box.  Coordinates are     */

+  /*                           expressed in font units (see                */

+  /*                           `units_per_EM').  The box is large enough   */

+  /*                           to contain any glyph from the font.  Thus,  */

+  /*                           `bbox.yMax' can be seen as the `maximum     */

+  /*                           ascender', and `bbox.yMin' as the `minimum  */

+  /*                           descender'.  Only relevant for scalable     */

+  /*                           formats.                                    */

+  /*                                                                       */

+  /*                           Note that the bounding box might be off by  */

+  /*                           (at least) one pixel for hinted fonts.  See */

+  /*                           @FT_Size_Metrics for further discussion.    */

+  /*                                                                       */

+  /*    units_per_EM        :: The number of font units per EM square for  */

+  /*                           this face.  This is typically 2048 for      */

+  /*                           TrueType fonts, and 1000 for Type~1 fonts.  */

+  /*                           Only relevant for scalable formats.         */

+  /*                                                                       */

+  /*    ascender            :: The typographic ascender of the face,       */

+  /*                           expressed in font units.  For font formats  */

+  /*                           not having this information, it is set to   */

+  /*                           `bbox.yMax'.  Only relevant for scalable    */

+  /*                           formats.                                    */

+  /*                                                                       */

+  /*    descender           :: The typographic descender of the face,      */

+  /*                           expressed in font units.  For font formats  */

+  /*                           not having this information, it is set to   */

+  /*                           `bbox.yMin'.  Note that this field is       */

+  /*                           usually negative.  Only relevant for        */

+  /*                           scalable formats.                           */

+  /*                                                                       */

+  /*    height              :: This value is the vertical distance         */

+  /*                           between two consecutive baselines,          */

+  /*                           expressed in font units.  It is always      */

+  /*                           positive.  Only relevant for scalable       */

+  /*                           formats.                                    */

+  /*                                                                       */

+  /*                           If you want the global glyph height, use    */

+  /*                           `ascender - descender'.                     */

+  /*                                                                       */

+  /*    max_advance_width   :: The maximum advance width, in font units,   */

+  /*                           for all glyphs in this face.  This can be   */

+  /*                           used to make word wrapping computations     */

+  /*                           faster.  Only relevant for scalable         */

+  /*                           formats.                                    */

+  /*                                                                       */

+  /*    max_advance_height  :: The maximum advance height, in font units,  */

+  /*                           for all glyphs in this face.  This is only  */

+  /*                           relevant for vertical layouts, and is set   */

+  /*                           to `height' for fonts that do not provide   */

+  /*                           vertical metrics.  Only relevant for        */

+  /*                           scalable formats.                           */

+  /*                                                                       */

+  /*    underline_position  :: The position, in font units, of the         */

+  /*                           underline line for this face.  It is the    */

+  /*                           center of the underlining stem.  Only       */

+  /*                           relevant for scalable formats.              */

+  /*                                                                       */

+  /*    underline_thickness :: The thickness, in font units, of the        */

+  /*                           underline for this face.  Only relevant for */

+  /*                           scalable formats.                           */

+  /*                                                                       */

+  /*    glyph               :: The face's associated glyph slot(s).        */

+  /*                                                                       */

+  /*    size                :: The current active size for this face.      */

+  /*                                                                       */

+  /*    charmap             :: The current active charmap for this face.   */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Fields may be changed after a call to @FT_Attach_File or           */

+  /*    @FT_Attach_Stream.                                                 */

+  /*                                                                       */

+  typedef struct  FT_FaceRec_

+  {

+    FT_Long           num_faces;

+    FT_Long           face_index;

+

+    FT_Long           face_flags;

+    FT_Long           style_flags;

+

+    FT_Long           num_glyphs;

+

+    FT_String*        family_name;

+    FT_String*        style_name;

+

+    FT_Int            num_fixed_sizes;

+    FT_Bitmap_Size*   available_sizes;

+

+    FT_Int            num_charmaps;

+    FT_CharMap*       charmaps;

+

+#ifdef	_FX_MANAGED_CODE_

+#define generic		generic_data

+#endif

+

+    FT_Generic        generic;

+

+    /*# The following member variables (down to `underline_thickness') */

+    /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size    */

+    /*# for bitmap fonts.                                              */

+    FT_BBox           bbox;

+

+    FT_UShort         units_per_EM;

+    FT_Short          ascender;

+    FT_Short          descender;

+    FT_Short          height;

+

+    FT_Short          max_advance_width;

+    FT_Short          max_advance_height;

+

+    FT_Short          underline_position;

+    FT_Short          underline_thickness;

+

+    FT_GlyphSlot      glyph;

+    FT_Size           size;

+    FT_CharMap        charmap;

+

+    /*@private begin */

+

+    FT_Driver         driver;

+    FT_Memory         memory;

+    FT_Stream         stream;

+

+    FT_ListRec        sizes_list;

+

+    FT_Generic        autohint;   /* face-specific auto-hinter data */

+    void*             extensions; /* unused                         */

+

+    FT_Face_Internal  internal;

+

+    /*@private end */

+

+  } FT_FaceRec;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Enum>                                                                */

+  /*    FT_FACE_FLAG_XXX                                                   */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A list of bit flags used in the `face_flags' field of the          */

+  /*    @FT_FaceRec structure.  They inform client applications of         */

+  /*    properties of the corresponding face.                              */

+  /*                                                                       */

+  /* <Values>                                                              */

+  /*    FT_FACE_FLAG_SCALABLE ::                                           */

+  /*      Indicates that the face contains outline glyphs.  This doesn't   */

+  /*      prevent bitmap strikes, i.e., a face can have both this and      */

+  /*      and @FT_FACE_FLAG_FIXED_SIZES set.                               */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_FIXED_SIZES ::                                        */

+  /*      Indicates that the face contains bitmap strikes.  See also the   */

+  /*      `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec.   */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_FIXED_WIDTH ::                                        */

+  /*      Indicates that the face contains fixed-width characters (like    */

+  /*      Courier, Lucido, MonoType, etc.).                                */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_SFNT ::                                               */

+  /*      Indicates that the face uses the `sfnt' storage scheme.  For     */

+  /*      now, this means TrueType and OpenType.                           */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_HORIZONTAL ::                                         */

+  /*      Indicates that the face contains horizontal glyph metrics.  This */

+  /*      should be set for all common formats.                            */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_VERTICAL ::                                           */

+  /*      Indicates that the face contains vertical glyph metrics.  This   */

+  /*      is only available in some formats, not all of them.              */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_KERNING ::                                            */

+  /*      Indicates that the face contains kerning information.  If set,   */

+  /*      the kerning distance can be retrieved through the function       */

+  /*      @FT_Get_Kerning.  Otherwise the function always return the       */

+  /*      vector (0,0).  Note that FreeType doesn't handle kerning data    */

+  /*      from the `GPOS' table (as present in some OpenType fonts).       */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_FAST_GLYPHS ::                                        */

+  /*      THIS FLAG IS DEPRECATED.  DO NOT USE OR TEST IT.                 */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_MULTIPLE_MASTERS ::                                   */

+  /*      Indicates that the font contains multiple masters and is capable */

+  /*      of interpolating between them.  See the multiple-masters         */

+  /*      specific API for details.                                        */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_GLYPH_NAMES ::                                        */

+  /*      Indicates that the font contains glyph names that can be         */

+  /*      retrieved through @FT_Get_Glyph_Name.  Note that some TrueType   */

+  /*      fonts contain broken glyph name tables.  Use the function        */

+  /*      @FT_Has_PS_Glyph_Names when needed.                              */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_EXTERNAL_STREAM ::                                    */

+  /*      Used internally by FreeType to indicate that a face's stream was */

+  /*      provided by the client application and should not be destroyed   */

+  /*      when @FT_Done_Face is called.  Don't read or test this flag.     */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_HINTER ::                                             */

+  /*      Set if the font driver has a hinting machine of its own.  For    */

+  /*      example, with TrueType fonts, it makes sense to use data from    */

+  /*      the SFNT `gasp' table only if the native TrueType hinting engine */

+  /*      (with the bytecode interpreter) is available and active.         */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_CID_KEYED ::                                          */

+  /*      Set if the font is CID-keyed.  In that case, the font is not     */

+  /*      accessed by glyph indices but by CID values.  For subsetted      */

+  /*      CID-keyed fonts this has the consequence that not all index      */

+  /*      values are a valid argument to FT_Load_Glyph.  Only the CID      */

+  /*      values for which corresponding glyphs in the subsetted font      */

+  /*      exist make FT_Load_Glyph return successfully; in all other cases */

+  /*      you get an `FT_Err_Invalid_Argument' error.                      */

+  /*                                                                       */

+  /*      Note that CID-keyed fonts which are in an SFNT wrapper don't     */

+  /*      have this flag set since the glyphs are accessed in the normal   */

+  /*      way (using contiguous indices); the `CID-ness' isn't visible to  */

+  /*      the application.                                                 */

+  /*                                                                       */

+  /*    FT_FACE_FLAG_TRICKY ::                                             */

+  /*      Set if the font is `tricky', this is, it always needs the        */

+  /*      font format's native hinting engine to get a reasonable result.  */

+  /*      A typical example is the Chinese font `mingli.ttf' which uses    */

+  /*      TrueType bytecode instructions to move and scale all of its      */

+  /*      subglyphs.                                                       */

+  /*                                                                       */

+  /*      It is not possible to autohint such fonts using                  */

+  /*      @FT_LOAD_FORCE_AUTOHINT; it will also ignore                     */

+  /*      @FT_LOAD_NO_HINTING.  You have to set both @FT_LOAD_NO_HINTING   */

+  /*      and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */

+  /*      probably never want this except for demonstration purposes.      */

+  /*                                                                       */

+  /*      Currently, there are about a dozen TrueType fonts in the list of */

+  /*      tricky fonts; they are hard-coded in file `ttobjs.c'.            */

+  /*                                                                       */

+#define FT_FACE_FLAG_SCALABLE          ( 1L <<  0 )

+#define FT_FACE_FLAG_FIXED_SIZES       ( 1L <<  1 )

+#define FT_FACE_FLAG_FIXED_WIDTH       ( 1L <<  2 )

+#define FT_FACE_FLAG_SFNT              ( 1L <<  3 )

+#define FT_FACE_FLAG_HORIZONTAL        ( 1L <<  4 )

+#define FT_FACE_FLAG_VERTICAL          ( 1L <<  5 )

+#define FT_FACE_FLAG_KERNING           ( 1L <<  6 )

+#define FT_FACE_FLAG_FAST_GLYPHS       ( 1L <<  7 )

+#define FT_FACE_FLAG_MULTIPLE_MASTERS  ( 1L <<  8 )

+#define FT_FACE_FLAG_GLYPH_NAMES       ( 1L <<  9 )

+#define FT_FACE_FLAG_EXTERNAL_STREAM   ( 1L << 10 )

+#define FT_FACE_FLAG_HINTER            ( 1L << 11 )

+#define FT_FACE_FLAG_CID_KEYED         ( 1L << 12 )

+#define FT_FACE_FLAG_TRICKY            ( 1L << 13 )

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_HAS_HORIZONTAL( face )

+   *

+   * @description:

+   *   A macro that returns true whenever a face object contains

+   *   horizontal metrics (this is true for all font formats though).

+   *

+   * @also:

+   *   @FT_HAS_VERTICAL can be used to check for vertical metrics.

+   *

+   */

+#define FT_HAS_HORIZONTAL( face ) \

+          ( face->face_flags & FT_FACE_FLAG_HORIZONTAL )

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_HAS_VERTICAL( face )

+   *

+   * @description:

+   *   A macro that returns true whenever a face object contains real

+   *   vertical metrics (and not only synthesized ones).

+   *

+   */

+#define FT_HAS_VERTICAL( face ) \

+          ( face->face_flags & FT_FACE_FLAG_VERTICAL )

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_HAS_KERNING( face )

+   *

+   * @description:

+   *   A macro that returns true whenever a face object contains kerning

+   *   data that can be accessed with @FT_Get_Kerning.

+   *

+   */

+#define FT_HAS_KERNING( face ) \

+          ( face->face_flags & FT_FACE_FLAG_KERNING )

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_IS_SCALABLE( face )

+   *

+   * @description:

+   *   A macro that returns true whenever a face object contains a scalable

+   *   font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF,

+   *   and PFR font formats.

+   *

+   */

+#define FT_IS_SCALABLE( face ) \

+          ( face->face_flags & FT_FACE_FLAG_SCALABLE )

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_IS_SFNT( face )

+   *

+   * @description:

+   *   A macro that returns true whenever a face object contains a font

+   *   whose format is based on the SFNT storage scheme.  This usually

+   *   means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded

+   *   bitmap fonts.

+   *

+   *   If this macro is true, all functions defined in @FT_SFNT_NAMES_H and

+   *   @FT_TRUETYPE_TABLES_H are available.

+   *

+   */

+#define FT_IS_SFNT( face ) \

+          ( face->face_flags & FT_FACE_FLAG_SFNT )

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_IS_FIXED_WIDTH( face )

+   *

+   * @description:

+   *   A macro that returns true whenever a face object contains a font face

+   *   that contains fixed-width (or `monospace', `fixed-pitch', etc.)

+   *   glyphs.

+   *

+   */

+#define FT_IS_FIXED_WIDTH( face ) \

+          ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH )

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_HAS_FIXED_SIZES( face )

+   *

+   * @description:

+   *   A macro that returns true whenever a face object contains some

+   *   embedded bitmaps.  See the `available_sizes' field of the

+   *   @FT_FaceRec structure.

+   *

+   */

+#define FT_HAS_FIXED_SIZES( face ) \

+          ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_HAS_FAST_GLYPHS( face )

+   *

+   * @description:

+   *   Deprecated.

+   *

+   */

+#define FT_HAS_FAST_GLYPHS( face )  0

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_HAS_GLYPH_NAMES( face )

+   *

+   * @description:

+   *   A macro that returns true whenever a face object contains some glyph

+   *   names that can be accessed through @FT_Get_Glyph_Name.

+   *

+   */

+#define FT_HAS_GLYPH_NAMES( face ) \

+          ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES )

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_HAS_MULTIPLE_MASTERS( face )

+   *

+   * @description:

+   *   A macro that returns true whenever a face object contains some

+   *   multiple masters.  The functions provided by @FT_MULTIPLE_MASTERS_H

+   *   are then available to choose the exact design you want.

+   *

+   */

+#define FT_HAS_MULTIPLE_MASTERS( face ) \

+          ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_IS_CID_KEYED( face )

+   *

+   * @description:

+   *   A macro that returns true whenever a face object contains a CID-keyed

+   *   font.  See the discussion of @FT_FACE_FLAG_CID_KEYED for more

+   *   details.

+   *

+   *   If this macro is true, all functions defined in @FT_CID_H are

+   *   available.

+   *

+   */

+#define FT_IS_CID_KEYED( face ) \

+          ( face->face_flags & FT_FACE_FLAG_CID_KEYED )

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_IS_TRICKY( face )

+   *

+   * @description:

+   *   A macro that returns true whenever a face represents a `tricky' font.

+   *   See the discussion of @FT_FACE_FLAG_TRICKY for more details.

+   *

+   */

+#define FT_IS_TRICKY( face ) \

+          ( face->face_flags & FT_FACE_FLAG_TRICKY )

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Const>                                                               */

+  /*    FT_STYLE_FLAG_XXX                                                  */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A list of bit-flags used to indicate the style of a given face.    */

+  /*    These are used in the `style_flags' field of @FT_FaceRec.          */

+  /*                                                                       */

+  /* <Values>                                                              */

+  /*    FT_STYLE_FLAG_ITALIC ::                                            */

+  /*      Indicates that a given face style is italic or oblique.          */

+  /*                                                                       */

+  /*    FT_STYLE_FLAG_BOLD ::                                              */

+  /*      Indicates that a given face is bold.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The style information as provided by FreeType is very basic.  More */

+  /*    details are beyond the scope and should be done on a higher level  */

+  /*    (for example, by analyzing various fields of the `OS/2' table in   */

+  /*    SFNT based fonts).                                                 */

+  /*                                                                       */

+#define FT_STYLE_FLAG_ITALIC  ( 1 << 0 )

+#define FT_STYLE_FLAG_BOLD    ( 1 << 1 )

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Type>                                                                */

+  /*    FT_Size_Internal                                                   */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    An opaque handle to an `FT_Size_InternalRec' structure, used to    */

+  /*    model private data of a given @FT_Size object.                     */

+  /*                                                                       */

+  typedef struct FT_Size_InternalRec_*  FT_Size_Internal;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Struct>                                                              */

+  /*    FT_Size_Metrics                                                    */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    The size metrics structure gives the metrics of a size object.     */

+  /*                                                                       */

+  /* <Fields>                                                              */

+  /*    x_ppem       :: The width of the scaled EM square in pixels, hence */

+  /*                    the term `ppem' (pixels per EM).  It is also       */

+  /*                    referred to as `nominal width'.                    */

+  /*                                                                       */

+  /*    y_ppem       :: The height of the scaled EM square in pixels,      */

+  /*                    hence the term `ppem' (pixels per EM).  It is also */

+  /*                    referred to as `nominal height'.                   */

+  /*                                                                       */

+  /*    x_scale      :: A 16.16 fractional scaling value used to convert   */

+  /*                    horizontal metrics from font units to 26.6         */

+  /*                    fractional pixels.  Only relevant for scalable     */

+  /*                    font formats.                                      */

+  /*                                                                       */

+  /*    y_scale      :: A 16.16 fractional scaling value used to convert   */

+  /*                    vertical metrics from font units to 26.6           */

+  /*                    fractional pixels.  Only relevant for scalable     */

+  /*                    font formats.                                      */

+  /*                                                                       */

+  /*    ascender     :: The ascender in 26.6 fractional pixels.  See       */

+  /*                    @FT_FaceRec for the details.                       */

+  /*                                                                       */

+  /*    descender    :: The descender in 26.6 fractional pixels.  See      */

+  /*                    @FT_FaceRec for the details.                       */

+  /*                                                                       */

+  /*    height       :: The height in 26.6 fractional pixels.  See         */

+  /*                    @FT_FaceRec for the details.                       */

+  /*                                                                       */

+  /*    max_advance  :: The maximum advance width in 26.6 fractional       */

+  /*                    pixels.  See @FT_FaceRec for the details.          */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The scaling values, if relevant, are determined first during a     */

+  /*    size changing operation.  The remaining fields are then set by the */

+  /*    driver.  For scalable formats, they are usually set to scaled      */

+  /*    values of the corresponding fields in @FT_FaceRec.                 */

+  /*                                                                       */

+  /*    Note that due to glyph hinting, these values might not be exact    */

+  /*    for certain fonts.  Thus they must be treated as unreliable        */

+  /*    with an error margin of at least one pixel!                        */

+  /*                                                                       */

+  /*    Indeed, the only way to get the exact metrics is to render _all_   */

+  /*    glyphs.  As this would be a definite performance hit, it is up to  */

+  /*    client applications to perform such computations.                  */

+  /*                                                                       */

+  /*    The FT_Size_Metrics structure is valid for bitmap fonts also.      */

+  /*                                                                       */

+  typedef struct  FT_Size_Metrics_

+  {

+    FT_UShort  x_ppem;      /* horizontal pixels per EM               */

+    FT_UShort  y_ppem;      /* vertical pixels per EM                 */

+

+    FT_Fixed   x_scale;     /* scaling values used to convert font    */

+    FT_Fixed   y_scale;     /* units to 26.6 fractional pixels        */

+

+    FT_Pos     ascender;    /* ascender in 26.6 frac. pixels          */

+    FT_Pos     descender;   /* descender in 26.6 frac. pixels         */

+    FT_Pos     height;      /* text height in 26.6 frac. pixels       */

+    FT_Pos     max_advance; /* max horizontal advance, in 26.6 pixels */

+

+  } FT_Size_Metrics;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Struct>                                                              */

+  /*    FT_SizeRec                                                         */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    FreeType root size class structure.  A size object models a face   */

+  /*    object at a given size.                                            */

+  /*                                                                       */

+  /* <Fields>                                                              */

+  /*    face    :: Handle to the parent face object.                       */

+  /*                                                                       */

+  /*    generic :: A typeless pointer, which is unused by the FreeType     */

+  /*               library or any of its drivers.  It can be used by       */

+  /*               client applications to link their own data to each size */

+  /*               object.                                                 */

+  /*                                                                       */

+  /*    metrics :: Metrics for this size object.  This field is read-only. */

+  /*                                                                       */

+  typedef struct  FT_SizeRec_

+  {

+    FT_Face           face;      /* parent face object              */

+    FT_Generic        generic;   /* generic pointer for client uses */

+    FT_Size_Metrics   metrics;   /* size metrics                    */

+    FT_Size_Internal  internal;

+

+  } FT_SizeRec;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Struct>                                                              */

+  /*    FT_SubGlyph                                                        */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    The subglyph structure is an internal object used to describe      */

+  /*    subglyphs (for example, in the case of composites).                */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The subglyph implementation is not part of the high-level API,     */

+  /*    hence the forward structure declaration.                           */

+  /*                                                                       */

+  /*    You can however retrieve subglyph information with                 */

+  /*    @FT_Get_SubGlyph_Info.                                             */

+  /*                                                                       */

+  typedef struct FT_SubGlyphRec_*  FT_SubGlyph;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Type>                                                                */

+  /*    FT_Slot_Internal                                                   */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    An opaque handle to an `FT_Slot_InternalRec' structure, used to    */

+  /*    model private data of a given @FT_GlyphSlot object.                */

+  /*                                                                       */

+  typedef struct FT_Slot_InternalRec_*  FT_Slot_Internal;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Struct>                                                              */

+  /*    FT_GlyphSlotRec                                                    */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    FreeType root glyph slot class structure.  A glyph slot is a       */

+  /*    container where individual glyphs can be loaded, be they in        */

+  /*    outline or bitmap format.                                          */

+  /*                                                                       */

+  /* <Fields>                                                              */

+  /*    library           :: A handle to the FreeType library instance     */

+  /*                         this slot belongs to.                         */

+  /*                                                                       */

+  /*    face              :: A handle to the parent face object.           */

+  /*                                                                       */

+  /*    next              :: In some cases (like some font tools), several */

+  /*                         glyph slots per face object can be a good     */

+  /*                         thing.  As this is rare, the glyph slots are  */

+  /*                         listed through a direct, single-linked list   */

+  /*                         using its `next' field.                       */

+  /*                                                                       */

+  /*    generic           :: A typeless pointer which is unused by the     */

+  /*                         FreeType library or any of its drivers.  It   */

+  /*                         can be used by client applications to link    */

+  /*                         their own data to each glyph slot object.     */

+  /*                                                                       */

+  /*    metrics           :: The metrics of the last loaded glyph in the   */

+  /*                         slot.  The returned values depend on the last */

+  /*                         load flags (see the @FT_Load_Glyph API        */

+  /*                         function) and can be expressed either in 26.6 */

+  /*                         fractional pixels or font units.              */

+  /*                                                                       */

+  /*                         Note that even when the glyph image is        */

+  /*                         transformed, the metrics are not.             */

+  /*                                                                       */

+  /*    linearHoriAdvance :: The advance width of the unhinted glyph.      */

+  /*                         Its value is expressed in 16.16 fractional    */

+  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */

+  /*                         when loading the glyph.  This field can be    */

+  /*                         important to perform correct WYSIWYG layout.  */

+  /*                         Only relevant for outline glyphs.             */

+  /*                                                                       */

+  /*    linearVertAdvance :: The advance height of the unhinted glyph.     */

+  /*                         Its value is expressed in 16.16 fractional    */

+  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */

+  /*                         when loading the glyph.  This field can be    */

+  /*                         important to perform correct WYSIWYG layout.  */

+  /*                         Only relevant for outline glyphs.             */

+  /*                                                                       */

+  /*    advance           :: This shorthand is, depending on               */

+  /*                         @FT_LOAD_IGNORE_TRANSFORM, the transformed    */

+  /*                         advance width for the glyph (in 26.6          */

+  /*                         fractional pixel format).  As specified with  */

+  /*                         @FT_LOAD_VERTICAL_LAYOUT, it uses either the  */

+  /*                         `horiAdvance' or the `vertAdvance' value of   */

+  /*                         `metrics' field.                              */

+  /*                                                                       */

+  /*    format            :: This field indicates the format of the image  */

+  /*                         contained in the glyph slot.  Typically       */

+  /*                         @FT_GLYPH_FORMAT_BITMAP,                      */

+  /*                         @FT_GLYPH_FORMAT_OUTLINE, or                  */

+  /*                         @FT_GLYPH_FORMAT_COMPOSITE, but others are    */

+  /*                         possible.                                     */

+  /*                                                                       */

+  /*    bitmap            :: This field is used as a bitmap descriptor     */

+  /*                         when the slot format is                       */

+  /*                         @FT_GLYPH_FORMAT_BITMAP.  Note that the       */

+  /*                         address and content of the bitmap buffer can  */

+  /*                         change between calls of @FT_Load_Glyph and a  */

+  /*                         few other functions.                          */

+  /*                                                                       */

+  /*    bitmap_left       :: This is the bitmap's left bearing expressed   */

+  /*                         in integer pixels.  Of course, this is only   */

+  /*                         valid if the format is                        */

+  /*                         @FT_GLYPH_FORMAT_BITMAP.                      */

+  /*                                                                       */

+  /*    bitmap_top        :: This is the bitmap's top bearing expressed in */

+  /*                         integer pixels.  Remember that this is the    */

+  /*                         distance from the baseline to the top-most    */

+  /*                         glyph scanline, upwards y~coordinates being   */

+  /*                         *positive*.                                   */

+  /*                                                                       */

+  /*    outline           :: The outline descriptor for the current glyph  */

+  /*                         image if its format is                        */

+  /*                         @FT_GLYPH_FORMAT_OUTLINE.  Once a glyph is    */

+  /*                         loaded, `outline' can be transformed,         */

+  /*                         distorted, embolded, etc.  However, it must   */

+  /*                         not be freed.                                 */

+  /*                                                                       */

+  /*    num_subglyphs     :: The number of subglyphs in a composite glyph. */

+  /*                         This field is only valid for the composite    */

+  /*                         glyph format that should normally only be     */

+  /*                         loaded with the @FT_LOAD_NO_RECURSE flag.     */

+  /*                         For now this is internal to FreeType.         */

+  /*                                                                       */

+  /*    subglyphs         :: An array of subglyph descriptors for          */

+  /*                         composite glyphs.  There are `num_subglyphs'  */

+  /*                         elements in there.  Currently internal to     */

+  /*                         FreeType.                                     */

+  /*                                                                       */

+  /*    control_data      :: Certain font drivers can also return the      */

+  /*                         control data for a given glyph image (e.g.    */

+  /*                         TrueType bytecode, Type~1 charstrings, etc.). */

+  /*                         This field is a pointer to such data.         */

+  /*                                                                       */

+  /*    control_len       :: This is the length in bytes of the control    */

+  /*                         data.                                         */

+  /*                                                                       */

+  /*    other             :: Really wicked formats can use this pointer to */

+  /*                         present their own glyph image to client       */

+  /*                         applications.  Note that the application      */

+  /*                         needs to know about the image format.         */

+  /*                                                                       */

+  /*    lsb_delta         :: The difference between hinted and unhinted    */

+  /*                         left side bearing while autohinting is        */

+  /*                         active.  Zero otherwise.                      */

+  /*                                                                       */

+  /*    rsb_delta         :: The difference between hinted and unhinted    */

+  /*                         right side bearing while autohinting is       */

+  /*                         active.  Zero otherwise.                      */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    If @FT_Load_Glyph is called with default flags (see                */

+  /*    @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in   */

+  /*    its native format (e.g., an outline glyph for TrueType and Type~1  */

+  /*    formats).                                                          */

+  /*                                                                       */

+  /*    This image can later be converted into a bitmap by calling         */

+  /*    @FT_Render_Glyph.  This function finds the current renderer for    */

+  /*    the native image's format, then invokes it.                        */

+  /*                                                                       */

+  /*    The renderer is in charge of transforming the native image through */

+  /*    the slot's face transformation fields, then converting it into a   */

+  /*    bitmap that is returned in `slot->bitmap'.                         */

+  /*                                                                       */

+  /*    Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */

+  /*    to specify the position of the bitmap relative to the current pen  */

+  /*    position (e.g., coordinates (0,0) on the baseline).  Of course,    */

+  /*    `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP.         */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Here a small pseudo code fragment which shows how to use           */

+  /*    `lsb_delta' and `rsb_delta':                                       */

+  /*                                                                       */

+  /*    {                                                                  */

+  /*      FT_Pos  origin_x       = 0;                                      */

+  /*      FT_Pos  prev_rsb_delta = 0;                                      */

+  /*                                                                       */

+  /*                                                                       */

+  /*      for all glyphs do                                                */

+  /*        <compute kern between current and previous glyph and add it to */

+  /*         `origin_x'>                                                   */

+  /*                                                                       */

+  /*        <load glyph with `FT_Load_Glyph'>                              */

+  /*                                                                       */

+  /*        if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 )           */

+  /*          origin_x -= 64;                                              */

+  /*        else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 )      */

+  /*          origin_x += 64;                                              */

+  /*                                                                       */

+  /*        prev_rsb_delta = face->glyph->rsb_delta;                       */

+  /*                                                                       */

+  /*        <save glyph image, or render glyph, or ...>                    */

+  /*                                                                       */

+  /*        origin_x += face->glyph->advance.x;                            */

+  /*      endfor                                                           */

+  /*    }                                                                  */

+  /*                                                                       */

+  typedef struct  FT_GlyphSlotRec_

+  {

+    FT_Library        library;

+    FT_Face           face;

+    FT_GlyphSlot      next;

+    FT_UInt           reserved;       /* retained for binary compatibility */

+    FT_Generic        generic;

+

+    FT_Glyph_Metrics  metrics;

+    FT_Fixed          linearHoriAdvance;

+    FT_Fixed          linearVertAdvance;

+    FT_Vector         advance;

+

+    FT_Glyph_Format   format;

+

+    FT_Bitmap         bitmap;

+    FT_Int            bitmap_left;

+    FT_Int            bitmap_top;

+

+    FT_Outline        outline;

+

+    FT_UInt           num_subglyphs;

+    FT_SubGlyph       subglyphs;

+

+    void*             control_data;

+    long              control_len;

+

+    FT_Pos            lsb_delta;

+    FT_Pos            rsb_delta;

+

+    void*             other;

+

+    FT_Slot_Internal  internal;

+

+  } FT_GlyphSlotRec;

+

+

+  /*************************************************************************/

+  /*************************************************************************/

+  /*                                                                       */

+  /*                         F U N C T I O N S                             */

+  /*                                                                       */

+  /*************************************************************************/

+  /*************************************************************************/

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Init_FreeType                                                   */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Initialize a new FreeType library object.  The set of modules      */

+  /*    that are registered by this function is determined at build time.  */

+  /*                                                                       */

+  /* <Output>                                                              */

+  /*    alibrary :: A handle to a new library object.                      */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    In case you want to provide your own memory allocating routines,   */

+  /*    use @FT_New_Library instead, followed by a call to                 */

+  /*    @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module).  */

+  /*                                                                       */

+  /*    For multi-threading applications each thread should have its own   */

+  /*    FT_Library object.                                                 */

+  /*                                                                       */

+  /*    If you need reference-counting (cf. @FT_Reference_Library), use    */

+  /*    @FT_New_Library and @FT_Done_Library.                              */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Init_FreeType( FT_Library  *alibrary );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Done_FreeType                                                   */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Destroy a given FreeType library object and all of its children,   */

+  /*    including resources, drivers, faces, sizes, etc.                   */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    library :: A handle to the target library object.                  */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Done_FreeType( FT_Library  library );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Enum>                                                                */

+  /*    FT_OPEN_XXX                                                        */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A list of bit-field constants used within the `flags' field of the */

+  /*    @FT_Open_Args structure.                                           */

+  /*                                                                       */

+  /* <Values>                                                              */

+  /*    FT_OPEN_MEMORY   :: This is a memory-based stream.                 */

+  /*                                                                       */

+  /*    FT_OPEN_STREAM   :: Copy the stream from the `stream' field.       */

+  /*                                                                       */

+  /*    FT_OPEN_PATHNAME :: Create a new input stream from a C~path        */

+  /*                        name.                                          */

+  /*                                                                       */

+  /*    FT_OPEN_DRIVER   :: Use the `driver' field.                        */

+  /*                                                                       */

+  /*    FT_OPEN_PARAMS   :: Use the `num_params' and `params' fields.      */

+  /*                                                                       */

+  /*    ft_open_memory   :: Deprecated; use @FT_OPEN_MEMORY instead.       */

+  /*                                                                       */

+  /*    ft_open_stream   :: Deprecated; use @FT_OPEN_STREAM instead.       */

+  /*                                                                       */

+  /*    ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead.     */

+  /*                                                                       */

+  /*    ft_open_driver   :: Deprecated; use @FT_OPEN_DRIVER instead.       */

+  /*                                                                       */

+  /*    ft_open_params   :: Deprecated; use @FT_OPEN_PARAMS instead.       */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME'     */

+  /*    flags are mutually exclusive.                                      */

+  /*                                                                       */

+#define FT_OPEN_MEMORY    0x1

+#define FT_OPEN_STREAM    0x2

+#define FT_OPEN_PATHNAME  0x4

+#define FT_OPEN_DRIVER    0x8

+#define FT_OPEN_PARAMS    0x10

+

+#define ft_open_memory    FT_OPEN_MEMORY     /* deprecated */

+#define ft_open_stream    FT_OPEN_STREAM     /* deprecated */

+#define ft_open_pathname  FT_OPEN_PATHNAME   /* deprecated */

+#define ft_open_driver    FT_OPEN_DRIVER     /* deprecated */

+#define ft_open_params    FT_OPEN_PARAMS     /* deprecated */

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Struct>                                                              */

+  /*    FT_Parameter                                                       */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A simple structure used to pass more or less generic parameters to */

+  /*    @FT_Open_Face.                                                     */

+  /*                                                                       */

+  /* <Fields>                                                              */

+  /*    tag  :: A four-byte identification tag.                            */

+  /*                                                                       */

+  /*    data :: A pointer to the parameter data.                           */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The ID and function of parameters are driver-specific.  See the    */

+  /*    various FT_PARAM_TAG_XXX flags for more information.               */

+  /*                                                                       */

+  typedef struct  FT_Parameter_

+  {

+    FT_ULong    tag;

+    FT_Pointer  data;

+

+  } FT_Parameter;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Struct>                                                              */

+  /*    FT_Open_Args                                                       */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A structure used to indicate how to open a new font file or        */

+  /*    stream.  A pointer to such a structure can be used as a parameter  */

+  /*    for the functions @FT_Open_Face and @FT_Attach_Stream.             */

+  /*                                                                       */

+  /* <Fields>                                                              */

+  /*    flags       :: A set of bit flags indicating how to use the        */

+  /*                   structure.                                          */

+  /*                                                                       */

+  /*    memory_base :: The first byte of the file in memory.               */

+  /*                                                                       */

+  /*    memory_size :: The size in bytes of the file in memory.            */

+  /*                                                                       */

+  /*    pathname    :: A pointer to an 8-bit file pathname.                */

+  /*                                                                       */

+  /*    stream      :: A handle to a source stream object.                 */

+  /*                                                                       */

+  /*    driver      :: This field is exclusively used by @FT_Open_Face;    */

+  /*                   it simply specifies the font driver to use to open  */

+  /*                   the face.  If set to~0, FreeType tries to load the  */

+  /*                   face with each one of the drivers in its list.      */

+  /*                                                                       */

+  /*    num_params  :: The number of extra parameters.                     */

+  /*                                                                       */

+  /*    params      :: Extra parameters passed to the font driver when     */

+  /*                   opening a new face.                                 */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The stream type is determined by the contents of `flags' which     */

+  /*    are tested in the following order by @FT_Open_Face:                */

+  /*                                                                       */

+  /*    If the `FT_OPEN_MEMORY' bit is set, assume that this is a          */

+  /*    memory file of `memory_size' bytes, located at `memory_address'.   */

+  /*    The data are are not copied, and the client is responsible for     */

+  /*    releasing and destroying them _after_ the corresponding call to    */

+  /*    @FT_Done_Face.                                                     */

+  /*                                                                       */

+  /*    Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a       */

+  /*    custom input stream `stream' is used.                              */

+  /*                                                                       */

+  /*    Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this  */

+  /*    is a normal file and use `pathname' to open it.                    */

+  /*                                                                       */

+  /*    If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to    */

+  /*    open the file with the driver whose handler is in `driver'.        */

+  /*                                                                       */

+  /*    If the `FT_OPEN_PARAMS' bit is set, the parameters given by        */

+  /*    `num_params' and `params' is used.  They are ignored otherwise.    */

+  /*                                                                       */

+  /*    Ideally, both the `pathname' and `params' fields should be tagged  */

+  /*    as `const'; this is missing for API backwards compatibility.  In   */

+  /*    other words, applications should treat them as read-only.          */

+  /*                                                                       */

+  typedef struct  FT_Open_Args_

+  {

+    FT_UInt         flags;

+    const FT_Byte*  memory_base;

+    FT_Long         memory_size;

+    FT_String*      pathname;

+    FT_Stream       stream;

+    FT_Module       driver;

+    FT_Int          num_params;

+    FT_Parameter*   params;

+

+  } FT_Open_Args;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_New_Face                                                        */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This function calls @FT_Open_Face to open a font by its pathname.  */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    library    :: A handle to the library resource.                    */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    pathname   :: A path to the font file.                             */

+  /*                                                                       */

+  /*    face_index :: The index of the face within the font.  The first    */

+  /*                  face has index~0.                                    */

+  /*                                                                       */

+  /* <Output>                                                              */

+  /*    aface      :: A handle to a new face object.  If `face_index' is   */

+  /*                  greater than or equal to zero, it must be non-NULL.  */

+  /*                  See @FT_Open_Face for more details.                  */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Use @FT_Done_Face to destroy the created @FT_Face object (along    */

+  /*    with its slot and sizes).                                          */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_New_Face( FT_Library   library,

+               const char*  filepathname,

+               FT_Long      face_index,

+               FT_Face     *aface );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_New_Memory_Face                                                 */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This function calls @FT_Open_Face to open a font which has been    */

+  /*    loaded into memory.                                                */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    library    :: A handle to the library resource.                    */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    file_base  :: A pointer to the beginning of the font data.         */

+  /*                                                                       */

+  /*    file_size  :: The size of the memory chunk used by the font data.  */

+  /*                                                                       */

+  /*    face_index :: The index of the face within the font.  The first    */

+  /*                  face has index~0.                                    */

+  /*                                                                       */

+  /* <Output>                                                              */

+  /*    aface      :: A handle to a new face object.  If `face_index' is   */

+  /*                  greater than or equal to zero, it must be non-NULL.  */

+  /*                  See @FT_Open_Face for more details.                  */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    You must not deallocate the memory before calling @FT_Done_Face.   */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_New_Memory_Face( FT_Library      library,

+                      const FT_Byte*  file_base,

+                      FT_Long         file_size,

+                      FT_Long         face_index,

+                      FT_Face        *aface );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Open_Face                                                       */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Create a face object from a given resource described by            */

+  /*    @FT_Open_Args.                                                     */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    library    :: A handle to the library resource.                    */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    args       :: A pointer to an `FT_Open_Args' structure which must  */

+  /*                  be filled by the caller.                             */

+  /*                                                                       */

+  /*    face_index :: The index of the face within the font.  The first    */

+  /*                  face has index~0.                                    */

+  /*                                                                       */

+  /* <Output>                                                              */

+  /*    aface      :: A handle to a new face object.  If `face_index' is   */

+  /*                  greater than or equal to zero, it must be non-NULL.  */

+  /*                  See note below.                                      */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Unlike FreeType 1.x, this function automatically creates a glyph   */

+  /*    slot for the face object which can be accessed directly through    */

+  /*    `face->glyph'.                                                     */

+  /*                                                                       */

+  /*    FT_Open_Face can be used to quickly check whether the font         */

+  /*    format of a given font resource is supported by FreeType.  If the  */

+  /*    `face_index' field is negative, the function's return value is~0   */

+  /*    if the font format is recognized, or non-zero otherwise;           */

+  /*    the function returns a more or less empty face handle in `*aface'  */

+  /*    (if `aface' isn't NULL).  The only useful field in this special    */

+  /*    case is `face->num_faces' which gives the number of faces within   */

+  /*    the font file.  After examination, the returned @FT_Face structure */

+  /*    should be deallocated with a call to @FT_Done_Face.                */

+  /*                                                                       */

+  /*    Each new face object created with this function also owns a        */

+  /*    default @FT_Size object, accessible as `face->size'.               */

+  /*                                                                       */

+  /*    One @FT_Library instance can have multiple face objects, this is,  */

+  /*    @FT_Open_Face and its siblings can be called multiple times using  */

+  /*    the same `library' argument.                                       */

+  /*                                                                       */

+  /*    See the discussion of reference counters in the description of     */

+  /*    @FT_Reference_Face.                                                */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Open_Face( FT_Library           library,

+                const FT_Open_Args*  args,

+                FT_Long              face_index,

+                FT_Face             *aface );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Attach_File                                                     */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This function calls @FT_Attach_Stream to attach a file.            */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    face         :: The target face object.                            */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    filepathname :: The pathname.                                      */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Attach_File( FT_Face      face,

+                  const char*  filepathname );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Attach_Stream                                                   */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    `Attach' data to a face object.  Normally, this is used to read    */

+  /*    additional information for the face object.  For example, you can  */

+  /*    attach an AFM file that comes with a Type~1 font to get the        */

+  /*    kerning values and other metrics.                                  */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    face       :: The target face object.                              */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    parameters :: A pointer to @FT_Open_Args which must be filled by   */

+  /*                  the caller.                                          */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The meaning of the `attach' (i.e., what really happens when the    */

+  /*    new file is read) is not fixed by FreeType itself.  It really      */

+  /*    depends on the font format (and thus the font driver).             */

+  /*                                                                       */

+  /*    Client applications are expected to know what they are doing       */

+  /*    when invoking this function.  Most drivers simply do not implement */

+  /*    file attachments.                                                  */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Attach_Stream( FT_Face        face,

+                    FT_Open_Args*  parameters );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Reference_Face                                                  */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A counter gets initialized to~1 at the time an @FT_Face structure  */

+  /*    is created.  This function increments the counter.  @FT_Done_Face  */

+  /*    then only destroys a face if the counter is~1, otherwise it simply */

+  /*    decrements the counter.                                            */

+  /*                                                                       */

+  /*    This function helps in managing life-cycles of structures which    */

+  /*    reference @FT_Face objects.                                        */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face :: A handle to a target face object.                          */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Since>                                                               */

+  /*    2.4.2                                                              */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Reference_Face( FT_Face  face );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Done_Face                                                       */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Discard a given face object, as well as all of its child slots and */

+  /*    sizes.                                                             */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face :: A handle to a target face object.                          */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    See the discussion of reference counters in the description of     */

+  /*    @FT_Reference_Face.                                                */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Done_Face( FT_Face  face );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Select_Size                                                     */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Select a bitmap strike.                                            */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    face         :: A handle to a target face object.                  */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    strike_index :: The index of the bitmap strike in the              */

+  /*                    `available_sizes' field of @FT_FaceRec structure.  */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Select_Size( FT_Face  face,

+                  FT_Int   strike_index );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Enum>                                                                */

+  /*    FT_Size_Request_Type                                               */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    An enumeration type that lists the supported size request types.   */

+  /*                                                                       */

+  /* <Values>                                                              */

+  /*    FT_SIZE_REQUEST_TYPE_NOMINAL ::                                    */

+  /*      The nominal size.  The `units_per_EM' field of @FT_FaceRec is    */

+  /*      used to determine both scaling values.                           */

+  /*                                                                       */

+  /*    FT_SIZE_REQUEST_TYPE_REAL_DIM ::                                   */

+  /*      The real dimension.  The sum of the the `ascender' and (minus    */

+  /*      of) the `descender' fields of @FT_FaceRec are used to determine  */

+  /*      both scaling values.                                             */

+  /*                                                                       */

+  /*    FT_SIZE_REQUEST_TYPE_BBOX ::                                       */

+  /*      The font bounding box.  The width and height of the `bbox' field */

+  /*      of @FT_FaceRec are used to determine the horizontal and vertical */

+  /*      scaling value, respectively.                                     */

+  /*                                                                       */

+  /*    FT_SIZE_REQUEST_TYPE_CELL ::                                       */

+  /*      The `max_advance_width' field of @FT_FaceRec is used to          */

+  /*      determine the horizontal scaling value; the vertical scaling     */

+  /*      value is determined the same way as                              */

+  /*      @FT_SIZE_REQUEST_TYPE_REAL_DIM does.  Finally, both scaling      */

+  /*      values are set to the smaller one.  This type is useful if you   */

+  /*      want to specify the font size for, say, a window of a given      */

+  /*      dimension and 80x24 cells.                                       */

+  /*                                                                       */

+  /*    FT_SIZE_REQUEST_TYPE_SCALES ::                                     */

+  /*      Specify the scaling values directly.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The above descriptions only apply to scalable formats.  For bitmap */

+  /*    formats, the behaviour is up to the driver.                        */

+  /*                                                                       */

+  /*    See the note section of @FT_Size_Metrics if you wonder how size    */

+  /*    requesting relates to scaling values.                              */

+  /*                                                                       */

+  typedef enum  FT_Size_Request_Type_

+  {

+    FT_SIZE_REQUEST_TYPE_NOMINAL,

+    FT_SIZE_REQUEST_TYPE_REAL_DIM,

+    FT_SIZE_REQUEST_TYPE_BBOX,

+    FT_SIZE_REQUEST_TYPE_CELL,

+    FT_SIZE_REQUEST_TYPE_SCALES,

+

+    FT_SIZE_REQUEST_TYPE_MAX

+

+  } FT_Size_Request_Type;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Struct>                                                              */

+  /*    FT_Size_RequestRec                                                 */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A structure used to model a size request.                          */

+  /*                                                                       */

+  /* <Fields>                                                              */

+  /*    type           :: See @FT_Size_Request_Type.                       */

+  /*                                                                       */

+  /*    width          :: The desired width.                               */

+  /*                                                                       */

+  /*    height         :: The desired height.                              */

+  /*                                                                       */

+  /*    horiResolution :: The horizontal resolution.  If set to zero,      */

+  /*                      `width' is treated as a 26.6 fractional pixel    */

+  /*                      value.                                           */

+  /*                                                                       */

+  /*    vertResolution :: The vertical resolution.  If set to zero,        */

+  /*                      `height' is treated as a 26.6 fractional pixel   */

+  /*                      value.                                           */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    If `width' is zero, then the horizontal scaling value is set equal */

+  /*    to the vertical scaling value, and vice versa.                     */

+  /*                                                                       */

+  typedef struct  FT_Size_RequestRec_

+  {

+    FT_Size_Request_Type  type;

+    FT_Long               width;

+    FT_Long               height;

+    FT_UInt               horiResolution;

+    FT_UInt               vertResolution;

+

+  } FT_Size_RequestRec;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Struct>                                                              */

+  /*    FT_Size_Request                                                    */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A handle to a size request structure.                              */

+  /*                                                                       */

+  typedef struct FT_Size_RequestRec_  *FT_Size_Request;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Request_Size                                                    */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Resize the scale of the active @FT_Size object in a face.          */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    face :: A handle to a target face object.                          */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    req  :: A pointer to a @FT_Size_RequestRec.                        */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Although drivers may select the bitmap strike matching the         */

+  /*    request, you should not rely on this if you intend to select a     */

+  /*    particular bitmap strike.  Use @FT_Select_Size instead in that     */

+  /*    case.                                                              */

+  /*                                                                       */

+  /*    The relation between the requested size and the resulting glyph    */

+  /*    size is dependent entirely on how the size is defined in the       */

+  /*    source face.  The font designer chooses the final size of each     */

+  /*    glyph relative to this size.  For more information refer to        */

+  /*    `http://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'      */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Request_Size( FT_Face          face,

+                   FT_Size_Request  req );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Set_Char_Size                                                   */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This function calls @FT_Request_Size to request the nominal size   */

+  /*    (in points).                                                       */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    face            :: A handle to a target face object.               */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    char_width      :: The nominal width, in 26.6 fractional points.   */

+  /*                                                                       */

+  /*    char_height     :: The nominal height, in 26.6 fractional points.  */

+  /*                                                                       */

+  /*    horz_resolution :: The horizontal resolution in dpi.               */

+  /*                                                                       */

+  /*    vert_resolution :: The vertical resolution in dpi.                 */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    If either the character width or height is zero, it is set equal   */

+  /*    to the other value.                                                */

+  /*                                                                       */

+  /*    If either the horizontal or vertical resolution is zero, it is set */

+  /*    equal to the other value.                                          */

+  /*                                                                       */

+  /*    A character width or height smaller than 1pt is set to 1pt; if     */

+  /*    both resolution values are zero, they are set to 72dpi.            */

+  /*                                                                       */

+  /*    Don't use this function if you are using the FreeType cache API.   */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Set_Char_Size( FT_Face     face,

+                    FT_F26Dot6  char_width,

+                    FT_F26Dot6  char_height,

+                    FT_UInt     horz_resolution,

+                    FT_UInt     vert_resolution );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Set_Pixel_Sizes                                                 */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This function calls @FT_Request_Size to request the nominal size   */

+  /*    (in pixels).                                                       */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    face         :: A handle to the target face object.                */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    pixel_width  :: The nominal width, in pixels.                      */

+  /*                                                                       */

+  /*    pixel_height :: The nominal height, in pixels.                     */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    You should not rely on the resulting glyphs matching, or being     */

+  /*    constrained, to this pixel size.  Refer to @FT_Request_Size to     */

+  /*    understand how requested sizes relate to actual sizes.             */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Set_Pixel_Sizes( FT_Face  face,

+                      FT_UInt  pixel_width,

+                      FT_UInt  pixel_height );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Load_Glyph                                                      */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A function used to load a single glyph into the glyph slot of a    */

+  /*    face object.                                                       */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    face        :: A handle to the target face object where the glyph  */

+  /*                   is loaded.                                          */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    glyph_index :: The index of the glyph in the font file.  For       */

+  /*                   CID-keyed fonts (either in PS or in CFF format)     */

+  /*                   this argument specifies the CID value.              */

+  /*                                                                       */

+  /*    load_flags  :: A flag indicating what to load for this glyph.  The */

+  /*                   @FT_LOAD_XXX constants can be used to control the   */

+  /*                   glyph loading process (e.g., whether the outline    */

+  /*                   should be scaled, whether to load bitmaps or not,   */

+  /*                   whether to hint the outline, etc).                  */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The loaded glyph may be transformed.  See @FT_Set_Transform for    */

+  /*    the details.                                                       */

+  /*                                                                       */

+  /*    For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is        */

+  /*    returned for invalid CID values (this is, for CID values which     */

+  /*    don't have a corresponding glyph in the font).  See the discussion */

+  /*    of the @FT_FACE_FLAG_CID_KEYED flag for more details.              */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Load_Glyph( FT_Face   face,

+                 FT_UInt   glyph_index,

+                 FT_Int32  load_flags );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Load_Char                                                       */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A function used to load a single glyph into the glyph slot of a    */

+  /*    face object, according to its character code.                      */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    face        :: A handle to a target face object where the glyph    */

+  /*                   is loaded.                                          */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    char_code   :: The glyph's character code, according to the        */

+  /*                   current charmap used in the face.                   */

+  /*                                                                       */

+  /*    load_flags  :: A flag indicating what to load for this glyph.  The */

+  /*                   @FT_LOAD_XXX constants can be used to control the   */

+  /*                   glyph loading process (e.g., whether the outline    */

+  /*                   should be scaled, whether to load bitmaps or not,   */

+  /*                   whether to hint the outline, etc).                  */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph.  */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Load_Char( FT_Face   face,

+                FT_ULong  char_code,

+                FT_Int32  load_flags );

+

+

+  /*************************************************************************

+   *

+   * @enum:

+   *   FT_LOAD_XXX

+   *

+   * @description:

+   *   A list of bit-field constants used with @FT_Load_Glyph to indicate

+   *   what kind of operations to perform during glyph loading.

+   *

+   * @values:

+   *   FT_LOAD_DEFAULT ::

+   *     Corresponding to~0, this value is used as the default glyph load

+   *     operation.  In this case, the following happens:

+   *

+   *     1. FreeType looks for a bitmap for the glyph corresponding to the

+   *        face's current size.  If one is found, the function returns.

+   *        The bitmap data can be accessed from the glyph slot (see note

+   *        below).

+   *

+   *     2. If no embedded bitmap is searched or found, FreeType looks for a

+   *        scalable outline.  If one is found, it is loaded from the font

+   *        file, scaled to device pixels, then `hinted' to the pixel grid

+   *        in order to optimize it.  The outline data can be accessed from

+   *        the glyph slot (see note below).

+   *

+   *     Note that by default, the glyph loader doesn't render outlines into

+   *     bitmaps.  The following flags are used to modify this default

+   *     behaviour to more specific and useful cases.

+   *

+   *   FT_LOAD_NO_SCALE ::

+   *     Don't scale the loaded outline glyph but keep it in font units.

+   *

+   *     This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and

+   *     unsets @FT_LOAD_RENDER.

+   *

+   *     If the font is `tricky' (see @FT_FACE_FLAG_TRICKY for more), using

+   *     FT_LOAD_NO_SCALE usually yields meaningless outlines because the

+   *     subglyphs must be scaled and positioned with hinting instructions.

+   *     This can be solved by loading the font without FT_LOAD_NO_SCALE and

+   *     setting the character size to `font->units_per_EM'.

+   *

+   *   FT_LOAD_NO_HINTING ::

+   *     Disable hinting.  This generally generates `blurrier' bitmap glyphs

+   *     when the glyph are rendered in any of the anti-aliased modes.  See

+   *     also the note below.

+   *

+   *     This flag is implied by @FT_LOAD_NO_SCALE.

+   *

+   *   FT_LOAD_RENDER ::

+   *     Call @FT_Render_Glyph after the glyph is loaded.  By default, the

+   *     glyph is rendered in @FT_RENDER_MODE_NORMAL mode.  This can be

+   *     overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME.

+   *

+   *     This flag is unset by @FT_LOAD_NO_SCALE.

+   *

+   *   FT_LOAD_NO_BITMAP ::

+   *     Ignore bitmap strikes when loading.  Bitmap-only fonts ignore this

+   *     flag.

+   *

+   *     @FT_LOAD_NO_SCALE always sets this flag.

+   *

+   *   FT_LOAD_VERTICAL_LAYOUT ::

+   *     Load the glyph for vertical text layout.  In particular, the

+   *     `advance' value in the @FT_GlyphSlotRec structure is set to the

+   *     `vertAdvance' value of the `metrics' field.

+   *

+   *     In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use

+   *     this flag currently.  Reason is that in this case vertical metrics

+   *     get synthesized, and those values are not always consistent across

+   *     various font formats.

+   *

+   *   FT_LOAD_FORCE_AUTOHINT ::

+   *     Indicates that the auto-hinter is preferred over the font's native

+   *     hinter.  See also the note below.

+   *

+   *   FT_LOAD_CROP_BITMAP ::

+   *     Indicates that the font driver should crop the loaded bitmap glyph

+   *     (i.e., remove all space around its black bits).  Not all drivers

+   *     implement this.

+   *

+   *   FT_LOAD_PEDANTIC ::

+   *     Indicates that the font driver should perform pedantic verifications

+   *     during glyph loading.  This is mostly used to detect broken glyphs

+   *     in fonts.  By default, FreeType tries to handle broken fonts also.

+   *

+   *     In particular, errors from the TrueType bytecode engine are not

+   *     passed to the application if this flag is not set; this might

+   *     result in partially hinted or distorted glyphs in case a glyph's

+   *     bytecode is buggy.

+   *

+   *   FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ::

+   *     Ignored.  Deprecated.

+   *

+   *   FT_LOAD_NO_RECURSE ::

+   *     This flag is only used internally.  It merely indicates that the

+   *     font driver should not load composite glyphs recursively.  Instead,

+   *     it should set the `num_subglyph' and `subglyphs' values of the

+   *     glyph slot accordingly, and set `glyph->format' to

+   *     @FT_GLYPH_FORMAT_COMPOSITE.

+   *

+   *     The description of sub-glyphs is not available to client

+   *     applications for now.

+   *

+   *     This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM.

+   *

+   *   FT_LOAD_IGNORE_TRANSFORM ::

+   *     Indicates that the transform matrix set by @FT_Set_Transform should

+   *     be ignored.

+   *

+   *   FT_LOAD_MONOCHROME ::

+   *     This flag is used with @FT_LOAD_RENDER to indicate that you want to

+   *     render an outline glyph to a 1-bit monochrome bitmap glyph, with

+   *     8~pixels packed into each byte of the bitmap data.

+   *

+   *     Note that this has no effect on the hinting algorithm used.  You

+   *     should rather use @FT_LOAD_TARGET_MONO so that the

+   *     monochrome-optimized hinting algorithm is used.

+   *

+   *   FT_LOAD_LINEAR_DESIGN ::

+   *     Indicates that the `linearHoriAdvance' and `linearVertAdvance'

+   *     fields of @FT_GlyphSlotRec should be kept in font units.  See

+   *     @FT_GlyphSlotRec for details.

+   *

+   *   FT_LOAD_NO_AUTOHINT ::

+   *     Disable auto-hinter.  See also the note below.

+   *

+   *   FT_LOAD_COLOR ::

+   *     This flag is used to request loading of color embedded-bitmap

+   *     images.  The resulting color bitmaps, if available, will have the

+   *     @FT_PIXEL_MODE_BGRA format.  When the flag is not used and color

+   *     bitmaps are found, they will be converted to 256-level gray

+   *     bitmaps transparently.  Those bitmaps will be in the

+   *     @FT_PIXEL_MODE_GRAY format.

+   *

+   * @note:

+   *   By default, hinting is enabled and the font's native hinter (see

+   *   @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter.  You can

+   *   disable hinting by setting @FT_LOAD_NO_HINTING or change the

+   *   precedence by setting @FT_LOAD_FORCE_AUTOHINT.  You can also set

+   *   @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be

+   *   used at all.

+   *

+   *   See the description of @FT_FACE_FLAG_TRICKY for a special exception

+   *   (affecting only a handful of Asian fonts).

+   *

+   *   Besides deciding which hinter to use, you can also decide which

+   *   hinting algorithm to use.  See @FT_LOAD_TARGET_XXX for details.

+   *

+   *   Note that the auto-hinter needs a valid Unicode cmap (either a native

+   *   one or synthesized by FreeType) for producing correct results.  If a

+   *   font provides an incorrect mapping (for example, assigning the

+   *   character code U+005A, LATIN CAPITAL LETTER Z, to a glyph depicting a

+   *   mathematical integral sign), the auto-hinter might produce useless

+   *   results.

+   *

+   */

+#define FT_LOAD_DEFAULT                      0x0

+#define FT_LOAD_NO_SCALE                     ( 1L << 0 )

+#define FT_LOAD_NO_HINTING                   ( 1L << 1 )

+#define FT_LOAD_RENDER                       ( 1L << 2 )

+#define FT_LOAD_NO_BITMAP                    ( 1L << 3 )

+#define FT_LOAD_VERTICAL_LAYOUT              ( 1L << 4 )

+#define FT_LOAD_FORCE_AUTOHINT               ( 1L << 5 )

+#define FT_LOAD_CROP_BITMAP                  ( 1L << 6 )

+#define FT_LOAD_PEDANTIC                     ( 1L << 7 )

+#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH  ( 1L << 9 )

+#define FT_LOAD_NO_RECURSE                   ( 1L << 10 )

+#define FT_LOAD_IGNORE_TRANSFORM             ( 1L << 11 )

+#define FT_LOAD_MONOCHROME                   ( 1L << 12 )

+#define FT_LOAD_LINEAR_DESIGN                ( 1L << 13 )

+#define FT_LOAD_NO_AUTOHINT                  ( 1L << 15 )

+  /* Bits 16..19 are used by `FT_LOAD_TARGET_' */

+#define FT_LOAD_COLOR                        ( 1L << 20 )

+

+  /* */

+

+  /* used internally only by certain font drivers! */

+#define FT_LOAD_ADVANCE_ONLY                 ( 1L << 8 )

+#define FT_LOAD_SBITS_ONLY                   ( 1L << 14 )

+

+

+  /**************************************************************************

+   *

+   * @enum:

+   *   FT_LOAD_TARGET_XXX

+   *

+   * @description:

+   *   A list of values that are used to select a specific hinting algorithm

+   *   to use by the hinter.  You should OR one of these values to your

+   *   `load_flags' when calling @FT_Load_Glyph.

+   *

+   *   Note that font's native hinters may ignore the hinting algorithm you

+   *   have specified (e.g., the TrueType bytecode interpreter).  You can set

+   *   @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used.

+   *

+   *   Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it

+   *   always implies @FT_LOAD_FORCE_AUTOHINT.

+   *

+   * @values:

+   *   FT_LOAD_TARGET_NORMAL ::

+   *     This corresponds to the default hinting algorithm, optimized for

+   *     standard gray-level rendering.  For monochrome output, use

+   *     @FT_LOAD_TARGET_MONO instead.

+   *

+   *   FT_LOAD_TARGET_LIGHT ::

+   *     A lighter hinting algorithm for non-monochrome modes.  Many

+   *     generated glyphs are more fuzzy but better resemble its original

+   *     shape.  A bit like rendering on Mac OS~X.

+   *

+   *     As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT.

+   *

+   *   FT_LOAD_TARGET_MONO ::

+   *     Strong hinting algorithm that should only be used for monochrome

+   *     output.  The result is probably unpleasant if the glyph is rendered

+   *     in non-monochrome modes.

+   *

+   *   FT_LOAD_TARGET_LCD ::

+   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally

+   *     decimated LCD displays.

+   *

+   *   FT_LOAD_TARGET_LCD_V ::

+   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically

+   *     decimated LCD displays.

+   *

+   * @note:

+   *   You should use only _one_ of the FT_LOAD_TARGET_XXX values in your

+   *   `load_flags'.  They can't be ORed.

+   *

+   *   If @FT_LOAD_RENDER is also set, the glyph is rendered in the

+   *   corresponding mode (i.e., the mode which matches the used algorithm

+   *   best).  An exeption is FT_LOAD_TARGET_MONO since it implies

+   *   @FT_LOAD_MONOCHROME.

+   *

+   *   You can use a hinting algorithm that doesn't correspond to the same

+   *   rendering mode.  As an example, it is possible to use the `light'

+   *   hinting algorithm and have the results rendered in horizontal LCD

+   *   pixel mode, with code like

+   *

+   *     {

+   *       FT_Load_Glyph( face, glyph_index,

+   *                      load_flags | FT_LOAD_TARGET_LIGHT );

+   *

+   *       FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );

+   *     }

+   *

+   */

+#define FT_LOAD_TARGET_( x )   ( (FT_Int32)( (x) & 15 ) << 16 )

+

+#define FT_LOAD_TARGET_NORMAL  FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )

+#define FT_LOAD_TARGET_LIGHT   FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT  )

+#define FT_LOAD_TARGET_MONO    FT_LOAD_TARGET_( FT_RENDER_MODE_MONO   )

+#define FT_LOAD_TARGET_LCD     FT_LOAD_TARGET_( FT_RENDER_MODE_LCD    )

+#define FT_LOAD_TARGET_LCD_V   FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V  )

+

+

+  /**************************************************************************

+   *

+   * @macro:

+   *   FT_LOAD_TARGET_MODE

+   *

+   * @description:

+   *   Return the @FT_Render_Mode corresponding to a given

+   *   @FT_LOAD_TARGET_XXX value.

+   *

+   */

+#define FT_LOAD_TARGET_MODE( x )  ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) )

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Set_Transform                                                   */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A function used to set the transformation that is applied to glyph */

+  /*    images when they are loaded into a glyph slot through              */

+  /*    @FT_Load_Glyph.                                                    */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    face   :: A handle to the source face object.                      */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    matrix :: A pointer to the transformation's 2x2 matrix.  Use~0 for */

+  /*              the identity matrix.                                     */

+  /*    delta  :: A pointer to the translation vector.  Use~0 for the null */

+  /*              vector.                                                  */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The transformation is only applied to scalable image formats after */

+  /*    the glyph has been loaded.  It means that hinting is unaltered by  */

+  /*    the transformation and is performed on the character size given in */

+  /*    the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes.         */

+  /*                                                                       */

+  /*    Note that this also transforms the `face.glyph.advance' field, but */

+  /*    *not* the values in `face.glyph.metrics'.                          */

+  /*                                                                       */

+  FT_EXPORT( void )

+  FT_Set_Transform( FT_Face     face,

+                    FT_Matrix*  matrix,

+                    FT_Vector*  delta );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Enum>                                                                */

+  /*    FT_Render_Mode                                                     */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    An enumeration type that lists the render modes supported by       */

+  /*    FreeType~2.  Each mode corresponds to a specific type of scanline  */

+  /*    conversion performed on the outline.                               */

+  /*                                                                       */

+  /*    For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode'     */

+  /*    field in the @FT_GlyphSlotRec structure gives the format of the    */

+  /*    returned bitmap.                                                   */

+  /*                                                                       */

+  /*    All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity.   */

+  /*                                                                       */

+  /* <Values>                                                              */

+  /*    FT_RENDER_MODE_NORMAL ::                                           */

+  /*      This is the default render mode; it corresponds to 8-bit         */

+  /*      anti-aliased bitmaps.                                            */

+  /*                                                                       */

+  /*    FT_RENDER_MODE_LIGHT ::                                            */

+  /*      This is equivalent to @FT_RENDER_MODE_NORMAL.  It is only        */

+  /*      defined as a separate value because render modes are also used   */

+  /*      indirectly to define hinting algorithm selectors.  See           */

+  /*      @FT_LOAD_TARGET_XXX for details.                                 */

+  /*                                                                       */

+  /*    FT_RENDER_MODE_MONO ::                                             */

+  /*      This mode corresponds to 1-bit bitmaps (with 2~levels of         */

+  /*      opacity).                                                        */

+  /*                                                                       */

+  /*    FT_RENDER_MODE_LCD ::                                              */

+  /*      This mode corresponds to horizontal RGB and BGR sub-pixel        */

+  /*      displays like LCD screens.  It produces 8-bit bitmaps that are   */

+  /*      3~times the width of the original glyph outline in pixels, and   */

+  /*      which use the @FT_PIXEL_MODE_LCD mode.                           */

+  /*                                                                       */

+  /*    FT_RENDER_MODE_LCD_V ::                                            */

+  /*      This mode corresponds to vertical RGB and BGR sub-pixel displays */

+  /*      (like PDA screens, rotated LCD displays, etc.).  It produces     */

+  /*      8-bit bitmaps that are 3~times the height of the original        */

+  /*      glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode.   */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */

+  /*    filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */

+  /*    (not active in the default builds).  It is up to the caller to     */

+  /*    either call @FT_Library_SetLcdFilter (if available) or do the      */

+  /*    filtering itself.                                                  */

+  /*                                                                       */

+  /*    The selected render mode only affects vector glyphs of a font.     */

+  /*    Embedded bitmaps often have a different pixel mode like            */

+  /*    @FT_PIXEL_MODE_MONO.  You can use @FT_Bitmap_Convert to transform  */

+  /*    them into 8-bit pixmaps.                                           */

+  /*                                                                       */

+  typedef enum  FT_Render_Mode_

+  {

+    FT_RENDER_MODE_NORMAL = 0,

+    FT_RENDER_MODE_LIGHT,

+    FT_RENDER_MODE_MONO,

+    FT_RENDER_MODE_LCD,

+    FT_RENDER_MODE_LCD_V,

+

+    FT_RENDER_MODE_MAX

+

+  } FT_Render_Mode;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Enum>                                                                */

+  /*    ft_render_mode_xxx                                                 */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    These constants are deprecated.  Use the corresponding             */

+  /*    @FT_Render_Mode values instead.                                    */

+  /*                                                                       */

+  /* <Values>                                                              */

+  /*    ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL                */

+  /*    ft_render_mode_mono   :: see @FT_RENDER_MODE_MONO                  */

+  /*                                                                       */

+#define ft_render_mode_normal  FT_RENDER_MODE_NORMAL

+#define ft_render_mode_mono    FT_RENDER_MODE_MONO

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Render_Glyph                                                    */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Convert a given glyph image to a bitmap.  It does so by inspecting */

+  /*    the glyph image format, finding the relevant renderer, and         */

+  /*    invoking it.                                                       */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    slot        :: A handle to the glyph slot containing the image to  */

+  /*                   convert.                                            */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    render_mode :: This is the render mode used to render the glyph    */

+  /*                   image into a bitmap.  See @FT_Render_Mode for a     */

+  /*                   list of possible values.                            */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Render_Glyph( FT_GlyphSlot    slot,

+                   FT_Render_Mode  render_mode );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Enum>                                                                */

+  /*    FT_Kerning_Mode                                                    */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    An enumeration used to specify which kerning values to return in   */

+  /*    @FT_Get_Kerning.                                                   */

+  /*                                                                       */

+  /* <Values>                                                              */

+  /*    FT_KERNING_DEFAULT  :: Return scaled and grid-fitted kerning       */

+  /*                           distances (value is~0).                     */

+  /*                                                                       */

+  /*    FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning    */

+  /*                           distances.                                  */

+  /*                                                                       */

+  /*    FT_KERNING_UNSCALED :: Return the kerning vector in original font  */

+  /*                           units.                                      */

+  /*                                                                       */

+  typedef enum  FT_Kerning_Mode_

+  {

+    FT_KERNING_DEFAULT  = 0,

+    FT_KERNING_UNFITTED,

+    FT_KERNING_UNSCALED

+

+  } FT_Kerning_Mode;

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Const>                                                               */

+  /*    ft_kerning_default                                                 */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This constant is deprecated.  Please use @FT_KERNING_DEFAULT       */

+  /*    instead.                                                           */

+  /*                                                                       */

+#define ft_kerning_default   FT_KERNING_DEFAULT

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Const>                                                               */

+  /*    ft_kerning_unfitted                                                */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This constant is deprecated.  Please use @FT_KERNING_UNFITTED      */

+  /*    instead.                                                           */

+  /*                                                                       */

+#define ft_kerning_unfitted  FT_KERNING_UNFITTED

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Const>                                                               */

+  /*    ft_kerning_unscaled                                                */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This constant is deprecated.  Please use @FT_KERNING_UNSCALED      */

+  /*    instead.                                                           */

+  /*                                                                       */

+#define ft_kerning_unscaled  FT_KERNING_UNSCALED

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Get_Kerning                                                     */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Return the kerning vector between two glyphs of a same face.       */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face        :: A handle to a source face object.                   */

+  /*                                                                       */

+  /*    left_glyph  :: The index of the left glyph in the kern pair.       */

+  /*                                                                       */

+  /*    right_glyph :: The index of the right glyph in the kern pair.      */

+  /*                                                                       */

+  /*    kern_mode   :: See @FT_Kerning_Mode for more information.          */

+  /*                   Determines the scale and dimension of the returned  */

+  /*                   kerning vector.                                     */

+  /*                                                                       */

+  /* <Output>                                                              */

+  /*    akerning    :: The kerning vector.  This is either in font units   */

+  /*                   or in pixels (26.6 format) for scalable formats,    */

+  /*                   and in pixels for fixed-sizes formats.              */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Only horizontal layouts (left-to-right & right-to-left) are        */

+  /*    supported by this method.  Other layouts, or more sophisticated    */

+  /*    kernings, are out of the scope of this API function -- they can be */

+  /*    implemented through format-specific interfaces.                    */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Get_Kerning( FT_Face     face,

+                  FT_UInt     left_glyph,

+                  FT_UInt     right_glyph,

+                  FT_UInt     kern_mode,

+                  FT_Vector  *akerning );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Get_Track_Kerning                                               */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Return the track kerning for a given face object at a given size.  */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face       :: A handle to a source face object.                    */

+  /*                                                                       */

+  /*    point_size :: The point size in 16.16 fractional points.           */

+  /*                                                                       */

+  /*    degree     :: The degree of tightness.  Increasingly negative      */

+  /*                  values represent tighter track kerning, while        */

+  /*                  increasingly positive values represent looser track  */

+  /*                  kerning.  Value zero means no track kerning.         */

+  /*                                                                       */

+  /* <Output>                                                              */

+  /*    akerning   :: The kerning in 16.16 fractional points, to be        */

+  /*                  uniformly applied between all glyphs.                */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Currently, only the Type~1 font driver supports track kerning,     */

+  /*    using data from AFM files (if attached with @FT_Attach_File or     */

+  /*    @FT_Attach_Stream).                                                */

+  /*                                                                       */

+  /*    Only very few AFM files come with track kerning data; please refer */

+  /*    to the Adobe's AFM specification for more details.                 */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Get_Track_Kerning( FT_Face    face,

+                        FT_Fixed   point_size,

+                        FT_Int     degree,

+                        FT_Fixed*  akerning );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Get_Glyph_Name                                                  */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Retrieve the ASCII name of a given glyph in a face.  This only     */

+  /*    works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1.   */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face        :: A handle to a source face object.                   */

+  /*                                                                       */

+  /*    glyph_index :: The glyph index.                                    */

+  /*                                                                       */

+  /*    buffer_max  :: The maximum number of bytes available in the        */

+  /*                   buffer.                                             */

+  /*                                                                       */

+  /* <Output>                                                              */

+  /*    buffer      :: A pointer to a target buffer where the name is      */

+  /*                   copied to.                                          */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    An error is returned if the face doesn't provide glyph names or if */

+  /*    the glyph index is invalid.  In all cases of failure, the first    */

+  /*    byte of `buffer' is set to~0 to indicate an empty name.            */

+  /*                                                                       */

+  /*    The glyph name is truncated to fit within the buffer if it is too  */

+  /*    long.  The returned string is always zero-terminated.              */

+  /*                                                                       */

+  /*    Be aware that FreeType reorders glyph indices internally so that   */

+  /*    glyph index~0 always corresponds to the `missing glyph' (called    */

+  /*    `.notdef').                                                        */

+  /*                                                                       */

+  /*    This function is not compiled within the library if the config     */

+  /*    macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in              */

+  /*    `include/freetype/config/ftoptions.h'.                             */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Get_Glyph_Name( FT_Face     face,

+                     FT_UInt     glyph_index,

+                     FT_Pointer  buffer,

+                     FT_UInt     buffer_max );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Get_Postscript_Name                                             */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Retrieve the ASCII PostScript name of a given face, if available.  */

+  /*    This only works with PostScript and TrueType fonts.                */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face :: A handle to the source face object.                        */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    A pointer to the face's PostScript name.  NULL if unavailable.     */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The returned pointer is owned by the face and is destroyed with    */

+  /*    it.                                                                */

+  /*                                                                       */

+  FT_EXPORT( const char* )

+  FT_Get_Postscript_Name( FT_Face  face );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Select_Charmap                                                  */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Select a given charmap by its encoding tag (as listed in           */

+  /*    `freetype.h').                                                     */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    face     :: A handle to the source face object.                    */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    encoding :: A handle to the selected encoding.                     */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    This function returns an error if no charmap in the face           */

+  /*    corresponds to the encoding queried here.                          */

+  /*                                                                       */

+  /*    Because many fonts contain more than a single cmap for Unicode     */

+  /*    encoding, this function has some special code to select the one    */

+  /*    which covers Unicode best (`best' in the sense that a UCS-4 cmap   */

+  /*    is preferred to a UCS-2 cmap).  It is thus preferable to           */

+  /*    @FT_Set_Charmap in this case.                                      */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Select_Charmap( FT_Face      face,

+                     FT_Encoding  encoding );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Set_Charmap                                                     */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Select a given charmap for character code to glyph index mapping.  */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    face    :: A handle to the source face object.                     */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    charmap :: A handle to the selected charmap.                       */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    FreeType error code.  0~means success.                             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    This function returns an error if the charmap is not part of       */

+  /*    the face (i.e., if it is not listed in the `face->charmaps'        */

+  /*    table).                                                            */

+  /*                                                                       */

+  /*    It also fails if a type~14 charmap is selected.                    */

+  /*                                                                       */

+  FT_EXPORT( FT_Error )

+  FT_Set_Charmap( FT_Face     face,

+                  FT_CharMap  charmap );

+

+

+  /*************************************************************************

+   *

+   * @function:

+   *   FT_Get_Charmap_Index

+   *

+   * @description:

+   *   Retrieve index of a given charmap.

+   *

+   * @input:

+   *   charmap ::

+   *     A handle to a charmap.

+   *

+   * @return:

+   *   The index into the array of character maps within the face to which

+   *   `charmap' belongs.  If an error occurs, -1 is returned.

+   *

+   */

+  FT_EXPORT( FT_Int )

+  FT_Get_Charmap_Index( FT_CharMap  charmap );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Get_Char_Index                                                  */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Return the glyph index of a given character code.  This function   */

+  /*    uses a charmap object to do the mapping.                           */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face     :: A handle to the source face object.                    */

+  /*                                                                       */

+  /*    charcode :: The character code.                                    */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The glyph index.  0~means `undefined character code'.              */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    If you use FreeType to manipulate the contents of font files       */

+  /*    directly, be aware that the glyph index returned by this function  */

+  /*    doesn't always correspond to the internal indices used within the  */

+  /*    file.  This is done to ensure that value~0 always corresponds to   */

+  /*    the `missing glyph'.  If the first glyph is not named `.notdef',   */

+  /*    then for Type~1 and Type~42 fonts, `.notdef' will be moved into    */

+  /*    the glyph ID~0 position, and whatever was there will be moved to   */

+  /*    the position `.notdef' had.  For Type~1 fonts, if there is no      */

+  /*    `.notdef' glyph at all, then one will be created at index~0 and    */

+  /*    whatever was there will be moved to the last index -- Type~42      */

+  /*    fonts are considered invalid under this condition.                 */

+  /*                                                                       */

+  FT_EXPORT( FT_UInt )

+  FT_Get_Char_Index( FT_Face   face,

+                     FT_ULong  charcode );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Get_First_Char                                                  */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This function is used to return the first character code in the    */

+  /*    current charmap of a given face.  It also returns the              */

+  /*    corresponding glyph index.                                         */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face    :: A handle to the source face object.                     */

+  /*                                                                       */

+  /* <Output>                                                              */

+  /*    agindex :: Glyph index of first character code.  0~if charmap is   */

+  /*               empty.                                                  */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The charmap's first character code.                                */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    You should use this function with @FT_Get_Next_Char to be able to  */

+  /*    parse all character codes available in a given charmap.  The code  */

+  /*    should look like this:                                             */

+  /*                                                                       */

+  /*    {                                                                  */

+  /*      FT_ULong  charcode;                                              */

+  /*      FT_UInt   gindex;                                                */

+  /*                                                                       */

+  /*                                                                       */

+  /*      charcode = FT_Get_First_Char( face, &gindex );                   */

+  /*      while ( gindex != 0 )                                            */

+  /*      {                                                                */

+  /*        ... do something with (charcode,gindex) pair ...               */

+  /*                                                                       */

+  /*        charcode = FT_Get_Next_Char( face, charcode, &gindex );        */

+  /*      }                                                                */

+  /*    }                                                                  */

+  /*                                                                       */

+  /*    Note that `*agindex' is set to~0 if the charmap is empty.  The     */

+  /*    result itself can be~0 in two cases: if the charmap is empty or    */

+  /*    if the value~0 is the first valid character code.                  */

+  /*                                                                       */

+  FT_EXPORT( FT_ULong )

+  FT_Get_First_Char( FT_Face   face,

+                     FT_UInt  *agindex );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Get_Next_Char                                                   */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This function is used to return the next character code in the     */

+  /*    current charmap of a given face following the value `char_code',   */

+  /*    as well as the corresponding glyph index.                          */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face      :: A handle to the source face object.                   */

+  /*    char_code :: The starting character code.                          */

+  /*                                                                       */

+  /* <Output>                                                              */

+  /*    agindex   :: Glyph index of next character code.  0~if charmap     */

+  /*                 is empty.                                             */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The charmap's next character code.                                 */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    You should use this function with @FT_Get_First_Char to walk       */

+  /*    over all character codes available in a given charmap.  See the    */

+  /*    note for this function for a simple code example.                  */

+  /*                                                                       */

+  /*    Note that `*agindex' is set to~0 when there are no more codes in   */

+  /*    the charmap.                                                       */

+  /*                                                                       */

+  FT_EXPORT( FT_ULong )

+  FT_Get_Next_Char( FT_Face    face,

+                    FT_ULong   char_code,

+                    FT_UInt   *agindex );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Get_Name_Index                                                  */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Return the glyph index of a given glyph name.  This function uses  */

+  /*    driver specific objects to do the translation.                     */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face       :: A handle to the source face object.                  */

+  /*                                                                       */

+  /*    glyph_name :: The glyph name.                                      */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The glyph index.  0~means `undefined character code'.              */

+  /*                                                                       */

+  FT_EXPORT( FT_UInt )

+  FT_Get_Name_Index( FT_Face     face,

+                     FT_String*  glyph_name );

+

+

+  /*************************************************************************

+   *

+   * @macro:

+   *   FT_SUBGLYPH_FLAG_XXX

+   *

+   * @description:

+   *   A list of constants used to describe subglyphs.  Please refer to the

+   *   TrueType specification for the meaning of the various flags.

+   *

+   * @values:

+   *   FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::

+   *   FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ::

+   *   FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID ::

+   *   FT_SUBGLYPH_FLAG_SCALE ::

+   *   FT_SUBGLYPH_FLAG_XY_SCALE ::

+   *   FT_SUBGLYPH_FLAG_2X2 ::

+   *   FT_SUBGLYPH_FLAG_USE_MY_METRICS ::

+   *

+   */

+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1

+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2

+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4

+#define FT_SUBGLYPH_FLAG_SCALE                   8

+#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40

+#define FT_SUBGLYPH_FLAG_2X2                  0x80

+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200

+

+

+  /*************************************************************************

+   *

+   * @func:

+   *   FT_Get_SubGlyph_Info

+   *

+   * @description:

+   *   Retrieve a description of a given subglyph.  Only use it if

+   *   `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is

+   *   returned otherwise.

+   *

+   * @input:

+   *   glyph ::

+   *     The source glyph slot.

+   *

+   *   sub_index ::

+   *     The index of the subglyph.  Must be less than

+   *     `glyph->num_subglyphs'.

+   *

+   * @output:

+   *   p_index ::

+   *     The glyph index of the subglyph.

+   *

+   *   p_flags ::

+   *     The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX.

+   *

+   *   p_arg1 ::

+   *     The subglyph's first argument (if any).

+   *

+   *   p_arg2 ::

+   *     The subglyph's second argument (if any).

+   *

+   *   p_transform ::

+   *     The subglyph transformation (if any).

+   *

+   * @return:

+   *   FreeType error code.  0~means success.

+   *

+   * @note:

+   *   The values of `*p_arg1', `*p_arg2', and `*p_transform' must be

+   *   interpreted depending on the flags returned in `*p_flags'.  See the

+   *   TrueType specification for details.

+   *

+   */

+  FT_EXPORT( FT_Error )

+  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,

+                        FT_UInt       sub_index,

+                        FT_Int       *p_index,

+                        FT_UInt      *p_flags,

+                        FT_Int       *p_arg1,

+                        FT_Int       *p_arg2,

+                        FT_Matrix    *p_transform );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Enum>                                                                */

+  /*    FT_FSTYPE_XXX                                                      */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A list of bit flags used in the `fsType' field of the OS/2 table   */

+  /*    in a TrueType or OpenType font and the `FSType' entry in a         */

+  /*    PostScript font.  These bit flags are returned by                  */

+  /*    @FT_Get_FSType_Flags; they inform client applications of embedding */

+  /*    and subsetting restrictions associated with a font.                */

+  /*                                                                       */

+  /*    See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for  */

+  /*    more details.                                                      */

+  /*                                                                       */

+  /* <Values>                                                              */

+  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING ::                                 */

+  /*      Fonts with no fsType bit set may be embedded and permanently     */

+  /*      installed on the remote system by an application.                */

+  /*                                                                       */

+  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING ::                          */

+  /*      Fonts that have only this bit set must not be modified, embedded */

+  /*      or exchanged in any manner without first obtaining permission of */

+  /*      the font software copyright owner.                               */

+  /*                                                                       */

+  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING ::                           */

+  /*      If this bit is set, the font may be embedded and temporarily     */

+  /*      loaded on the remote system.  Documents containing Preview &     */

+  /*      Print fonts must be opened `read-only'; no edits can be applied  */

+  /*      to the document.                                                 */

+  /*                                                                       */

+  /*    FT_FSTYPE_EDITABLE_EMBEDDING ::                                    */

+  /*      If this bit is set, the font may be embedded but must only be    */

+  /*      installed temporarily on other systems.  In contrast to Preview  */

+  /*      & Print fonts, documents containing editable fonts may be opened */

+  /*      for reading, editing is permitted, and changes may be saved.     */

+  /*                                                                       */

+  /*    FT_FSTYPE_NO_SUBSETTING ::                                         */

+  /*      If this bit is set, the font may not be subsetted prior to       */

+  /*      embedding.                                                       */

+  /*                                                                       */

+  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY ::                                 */

+  /*      If this bit is set, only bitmaps contained in the font may be    */

+  /*      embedded; no outline data may be embedded.  If there are no      */

+  /*      bitmaps available in the font, then the font is unembeddable.    */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    While the fsType flags can indicate that a font may be embedded, a */

+  /*    license with the font vendor may be separately required to use the */

+  /*    font in this way.                                                  */

+  /*                                                                       */

+#define FT_FSTYPE_INSTALLABLE_EMBEDDING         0x0000

+#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING  0x0002

+#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING   0x0004

+#define FT_FSTYPE_EDITABLE_EMBEDDING            0x0008

+#define FT_FSTYPE_NO_SUBSETTING                 0x0100

+#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY         0x0200

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Get_FSType_Flags                                                */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Return the fsType flags for a font.                                */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face :: A handle to the source face object.                        */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The fsType flags, @FT_FSTYPE_XXX.                                  */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Use this function rather than directly reading the `fs_type' field */

+  /*    in the @PS_FontInfoRec structure which is only guaranteed to       */

+  /*    return the correct results for Type~1 fonts.                       */

+  /*                                                                       */

+  /* <Since>                                                               */

+  /*    2.3.8                                                              */

+  /*                                                                       */

+  FT_EXPORT( FT_UShort )

+  FT_Get_FSType_Flags( FT_Face  face );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Section>                                                             */

+  /*    glyph_variants                                                     */

+  /*                                                                       */

+  /* <Title>                                                               */

+  /*    Glyph Variants                                                     */

+  /*                                                                       */

+  /* <Abstract>                                                            */

+  /*    The FreeType~2 interface to Unicode Ideographic Variation          */

+  /*    Sequences (IVS), using the SFNT cmap format~14.                    */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Many CJK characters have variant forms.  They are a sort of grey   */

+  /*    area somewhere between being totally irrelevant and semantically   */

+  /*    distinct; for this reason, the Unicode consortium decided to       */

+  /*    introduce Ideographic Variation Sequences (IVS), consisting of a   */

+  /*    Unicode base character and one of 240 variant selectors            */

+  /*    (U+E0100-U+E01EF), instead of further extending the already huge   */

+  /*    code range for CJK characters.                                     */

+  /*                                                                       */

+  /*    An IVS is registered and unique; for further details please refer  */

+  /*    to Unicode Technical Standard #37, the Ideographic Variation       */

+  /*    Database:                                                          */

+  /*                                                                       */

+  /*      http://www.unicode.org/reports/tr37/                             */

+  /*                                                                       */

+  /*    To date (November 2012), the character with the most variants is   */

+  /*    U+9089, having 31 such IVS.                                        */

+  /*                                                                       */

+  /*    Adobe and MS decided to support IVS with a new cmap subtable       */

+  /*    (format~14).  It is an odd subtable because it is not a mapping of */

+  /*    input code points to glyphs, but contains lists of all variants    */

+  /*    supported by the font.                                             */

+  /*                                                                       */

+  /*    A variant may be either `default' or `non-default'.  A default     */

+  /*    variant is the one you will get for that code point if you look it */

+  /*    up in the standard Unicode cmap.  A non-default variant is a       */

+  /*    different glyph.                                                   */

+  /*                                                                       */

+  /*************************************************************************/

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Face_GetCharVariantIndex                                        */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Return the glyph index of a given character code as modified by    */

+  /*    the variation selector.                                            */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face ::                                                            */

+  /*      A handle to the source face object.                              */

+  /*                                                                       */

+  /*    charcode ::                                                        */

+  /*      The character code point in Unicode.                             */

+  /*                                                                       */

+  /*    variantSelector ::                                                 */

+  /*      The Unicode code point of the variation selector.                */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The glyph index.  0~means either `undefined character code', or    */

+  /*    `undefined selector code', or `no variation selector cmap          */

+  /*    subtable', or `current CharMap is not Unicode'.                    */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    If you use FreeType to manipulate the contents of font files       */

+  /*    directly, be aware that the glyph index returned by this function  */

+  /*    doesn't always correspond to the internal indices used within      */

+  /*    the file.  This is done to ensure that value~0 always corresponds  */

+  /*    to the `missing glyph'.                                            */

+  /*                                                                       */

+  /*    This function is only meaningful if                                */

+  /*      a) the font has a variation selector cmap sub table,             */

+  /*    and                                                                */

+  /*      b) the current charmap has a Unicode encoding.                   */

+  /*                                                                       */

+  /* <Since>                                                               */

+  /*    2.3.6                                                              */

+  /*                                                                       */

+  FT_EXPORT( FT_UInt )

+  FT_Face_GetCharVariantIndex( FT_Face   face,

+                               FT_ULong  charcode,

+                               FT_ULong  variantSelector );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Face_GetCharVariantIsDefault                                    */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Check whether this variant of this Unicode character is the one to */

+  /*    be found in the `cmap'.                                            */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face ::                                                            */

+  /*      A handle to the source face object.                              */

+  /*                                                                       */

+  /*    charcode ::                                                        */

+  /*      The character codepoint in Unicode.                              */

+  /*                                                                       */

+  /*    variantSelector ::                                                 */

+  /*      The Unicode codepoint of the variation selector.                 */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    1~if found in the standard (Unicode) cmap, 0~if found in the       */

+  /*    variation selector cmap, or -1 if it is not a variant.             */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    This function is only meaningful if the font has a variation       */

+  /*    selector cmap subtable.                                            */

+  /*                                                                       */

+  /* <Since>                                                               */

+  /*    2.3.6                                                              */

+  /*                                                                       */

+  FT_EXPORT( FT_Int )

+  FT_Face_GetCharVariantIsDefault( FT_Face   face,

+                                   FT_ULong  charcode,

+                                   FT_ULong  variantSelector );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Face_GetVariantSelectors                                        */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Return a zero-terminated list of Unicode variant selectors found   */

+  /*    in the font.                                                       */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face ::                                                            */

+  /*      A handle to the source face object.                              */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    A pointer to an array of selector code points, or NULL if there is */

+  /*    no valid variant selector cmap subtable.                           */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The last item in the array is~0; the array is owned by the         */

+  /*    @FT_Face object but can be overwritten or released on the next     */

+  /*    call to a FreeType function.                                       */

+  /*                                                                       */

+  /* <Since>                                                               */

+  /*    2.3.6                                                              */

+  /*                                                                       */

+  FT_EXPORT( FT_UInt32* )

+  FT_Face_GetVariantSelectors( FT_Face  face );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Face_GetVariantsOfChar                                          */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Return a zero-terminated list of Unicode variant selectors found   */

+  /*    for the specified character code.                                  */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face ::                                                            */

+  /*      A handle to the source face object.                              */

+  /*                                                                       */

+  /*    charcode ::                                                        */

+  /*      The character codepoint in Unicode.                              */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    A pointer to an array of variant selector code points which are    */

+  /*    active for the given character, or NULL if the corresponding list  */

+  /*    is empty.                                                          */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The last item in the array is~0; the array is owned by the         */

+  /*    @FT_Face object but can be overwritten or released on the next     */

+  /*    call to a FreeType function.                                       */

+  /*                                                                       */

+  /* <Since>                                                               */

+  /*    2.3.6                                                              */

+  /*                                                                       */

+  FT_EXPORT( FT_UInt32* )

+  FT_Face_GetVariantsOfChar( FT_Face   face,

+                             FT_ULong  charcode );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Face_GetCharsOfVariant                                          */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Return a zero-terminated list of Unicode character codes found for */

+  /*    the specified variant selector.                                    */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face ::                                                            */

+  /*      A handle to the source face object.                              */

+  /*                                                                       */

+  /*    variantSelector ::                                                 */

+  /*      The variant selector code point in Unicode.                      */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    A list of all the code points which are specified by this selector */

+  /*    (both default and non-default codes are returned) or NULL if there */

+  /*    is no valid cmap or the variant selector is invalid.               */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The last item in the array is~0; the array is owned by the         */

+  /*    @FT_Face object but can be overwritten or released on the next     */

+  /*    call to a FreeType function.                                       */

+  /*                                                                       */

+  /* <Since>                                                               */

+  /*    2.3.6                                                              */

+  /*                                                                       */

+  FT_EXPORT( FT_UInt32* )

+  FT_Face_GetCharsOfVariant( FT_Face   face,

+                             FT_ULong  variantSelector );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Section>                                                             */

+  /*    computations                                                       */

+  /*                                                                       */

+  /* <Title>                                                               */

+  /*    Computations                                                       */

+  /*                                                                       */

+  /* <Abstract>                                                            */

+  /*    Crunching fixed numbers and vectors.                               */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    This section contains various functions used to perform            */

+  /*    computations on 16.16 fixed-float numbers or 2d vectors.           */

+  /*                                                                       */

+  /* <Order>                                                               */

+  /*    FT_MulDiv                                                          */

+  /*    FT_MulFix                                                          */

+  /*    FT_DivFix                                                          */

+  /*    FT_RoundFix                                                        */

+  /*    FT_CeilFix                                                         */

+  /*    FT_FloorFix                                                        */

+  /*    FT_Vector_Transform                                                */

+  /*    FT_Matrix_Multiply                                                 */

+  /*    FT_Matrix_Invert                                                   */

+  /*                                                                       */

+  /*************************************************************************/

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_MulDiv                                                          */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A very simple function used to perform the computation `(a*b)/c'   */

+  /*    with maximum accuracy (it uses a 64-bit intermediate integer       */

+  /*    whenever necessary).                                               */

+  /*                                                                       */

+  /*    This function isn't necessarily as fast as some processor specific */

+  /*    operations, but is at least completely portable.                   */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    a :: The first multiplier.                                         */

+  /*    b :: The second multiplier.                                        */

+  /*    c :: The divisor.                                                  */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The result of `(a*b)/c'.  This function never traps when trying to */

+  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */

+  /*    on the signs of `a' and `b'.                                       */

+  /*                                                                       */

+  FT_EXPORT( FT_Long )

+  FT_MulDiv( FT_Long  a,

+             FT_Long  b,

+             FT_Long  c );

+

+

+  /* */

+

+  /* The following #if 0 ... #endif is for the documentation formatter, */

+  /* hiding the internal `FT_MULFIX_INLINED' macro.                     */

+

+#if 0

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_MulFix                                                          */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A very simple function used to perform the computation             */

+  /*    `(a*b)/0x10000' with maximum accuracy.  Most of the time this is   */

+  /*    used to multiply a given value by a 16.16 fixed-point factor.      */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    a :: The first multiplier.                                         */

+  /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */

+  /*         possible (see note below).                                    */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The result of `(a*b)/0x10000'.                                     */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    This function has been optimized for the case where the absolute   */

+  /*    value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */

+  /*    As this happens mainly when scaling from notional units to         */

+  /*    fractional pixels in FreeType, it resulted in noticeable speed     */

+  /*    improvements between versions 2.x and 1.x.                         */

+  /*                                                                       */

+  /*    As a conclusion, always try to place a 16.16 factor as the         */

+  /*    _second_ argument of this function; this can make a great          */

+  /*    difference.                                                        */

+  /*                                                                       */

+  FT_EXPORT( FT_Long )

+  FT_MulFix( FT_Long  a,

+             FT_Long  b );

+

+  /* */

+#endif

+

+#ifdef FT_MULFIX_INLINED

+#define FPDFAPI_FT_MulFix( a, b )  FT_MULFIX_INLINED( a, b )

+#else

+  FT_EXPORT( FT_Long )

+  FT_MulFix( FT_Long  a,

+             FT_Long  b );

+#endif

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_DivFix                                                          */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A very simple function used to perform the computation             */

+  /*    `(a*0x10000)/b' with maximum accuracy.  Most of the time, this is  */

+  /*    used to divide a given value by a 16.16 fixed-point factor.        */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    a :: The first multiplier.                                         */

+  /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */

+  /*         possible (see note below).                                    */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The result of `(a*0x10000)/b'.                                     */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The optimization for FT_DivFix() is simple: If (a~<<~16) fits in   */

+  /*    32~bits, then the division is computed directly.  Otherwise, we    */

+  /*    use a specialized version of @FT_MulDiv.                           */

+  /*                                                                       */

+  FT_EXPORT( FT_Long )

+  FT_DivFix( FT_Long  a,

+             FT_Long  b );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_RoundFix                                                        */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A very simple function used to round a 16.16 fixed number.         */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    a :: The number to be rounded.                                     */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The result of `(a + 0x8000) & -0x10000'.                           */

+  /*                                                                       */

+  FT_EXPORT( FT_Fixed )

+  FT_RoundFix( FT_Fixed  a );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_CeilFix                                                         */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A very simple function used to compute the ceiling function of a   */

+  /*    16.16 fixed number.                                                */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    a :: The number for which the ceiling function is to be computed.  */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The result of `(a + 0x10000 - 1) & -0x10000'.                      */

+  /*                                                                       */

+  FT_EXPORT( FT_Fixed )

+  FT_CeilFix( FT_Fixed  a );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_FloorFix                                                        */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    A very simple function used to compute the floor function of a     */

+  /*    16.16 fixed number.                                                */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    a :: The number for which the floor function is to be computed.    */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The result of `a & -0x10000'.                                      */

+  /*                                                                       */

+  FT_EXPORT( FT_Fixed )

+  FT_FloorFix( FT_Fixed  a );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Vector_Transform                                                */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Transform a single vector through a 2x2 matrix.                    */

+  /*                                                                       */

+  /* <InOut>                                                               */

+  /*    vector :: The target vector to transform.                          */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    matrix :: A pointer to the source 2x2 matrix.                      */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The result is undefined if either `vector' or `matrix' is invalid. */

+  /*                                                                       */

+  FT_EXPORT( void )

+  FT_Vector_Transform( FT_Vector*        vec,

+                       const FT_Matrix*  matrix );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Section>                                                             */

+  /*    version                                                            */

+  /*                                                                       */

+  /* <Title>                                                               */

+  /*    FreeType Version                                                   */

+  /*                                                                       */

+  /* <Abstract>                                                            */

+  /*    Functions and macros related to FreeType versions.                 */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Note that those functions and macros are of limited use because    */

+  /*    even a new release of FreeType with only documentation changes     */

+  /*    increases the version number.                                      */

+  /*                                                                       */

+  /*************************************************************************/

+

+

+  /*************************************************************************

+   *

+   * @enum:

+   *   FREETYPE_XXX

+   *

+   * @description:

+   *   These three macros identify the FreeType source code version.

+   *   Use @FT_Library_Version to access them at runtime.

+   *

+   * @values:

+   *   FREETYPE_MAJOR :: The major version number.

+   *   FREETYPE_MINOR :: The minor version number.

+   *   FREETYPE_PATCH :: The patch level.

+   *

+   * @note:

+   *   The version number of FreeType if built as a dynamic link library

+   *   with the `libtool' package is _not_ controlled by these three

+   *   macros.

+   *

+   */

+#define FREETYPE_MAJOR  2

+#define FREETYPE_MINOR  5

+#define FREETYPE_PATCH  0

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Library_Version                                                 */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Return the version of the FreeType library being used.  This is    */

+  /*    useful when dynamically linking to the library, since one cannot   */

+  /*    use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and               */

+  /*    @FREETYPE_PATCH.                                                   */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    library :: A source library handle.                                */

+  /*                                                                       */

+  /* <Output>                                                              */

+  /*    amajor  :: The major version number.                               */

+  /*                                                                       */

+  /*    aminor  :: The minor version number.                               */

+  /*                                                                       */

+  /*    apatch  :: The patch version number.                               */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    The reason why this function takes a `library' argument is because */

+  /*    certain programs implement library initialization in a custom way  */

+  /*    that doesn't use @FT_Init_FreeType.                                */

+  /*                                                                       */

+  /*    In such cases, the library version might not be available before   */

+  /*    the library object has been created.                               */

+  /*                                                                       */

+  FT_EXPORT( void )

+  FT_Library_Version( FT_Library   library,

+                      FT_Int      *amajor,

+                      FT_Int      *aminor,

+                      FT_Int      *apatch );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Face_CheckTrueTypePatents                                       */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Parse all bytecode instructions of a TrueType font file to check   */

+  /*    whether any of the patented opcodes are used.  This is only useful */

+  /*    if you want to be able to use the unpatented hinter with           */

+  /*    fonts that do *not* use these opcodes.                             */

+  /*                                                                       */

+  /*    Note that this function parses *all* glyph instructions in the     */

+  /*    font file, which may be slow.                                      */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face :: A face handle.                                             */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    1~if this is a TrueType font that uses one of the patented         */

+  /*    opcodes, 0~otherwise.                                              */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Since May 2010, TrueType hinting is no longer patented.            */

+  /*                                                                       */

+  /* <Since>                                                               */

+  /*    2.3.5                                                              */

+  /*                                                                       */

+  FT_EXPORT( FT_Bool )

+  FT_Face_CheckTrueTypePatents( FT_Face  face );

+

+

+  /*************************************************************************/

+  /*                                                                       */

+  /* <Function>                                                            */

+  /*    FT_Face_SetUnpatentedHinting                                       */

+  /*                                                                       */

+  /* <Description>                                                         */

+  /*    Enable or disable the unpatented hinter for a given face.          */

+  /*    Only enable it if you have determined that the face doesn't        */

+  /*    use any patented opcodes (see @FT_Face_CheckTrueTypePatents).      */

+  /*                                                                       */

+  /* <Input>                                                               */

+  /*    face  :: A face handle.                                            */

+  /*                                                                       */

+  /*    value :: New boolean setting.                                      */

+  /*                                                                       */

+  /* <Return>                                                              */

+  /*    The old setting value.  This will always be false if this is not   */

+  /*    an SFNT font, or if the unpatented hinter is not compiled in this  */

+  /*    instance of the library.                                           */

+  /*                                                                       */

+  /* <Note>                                                                */

+  /*    Since May 2010, TrueType hinting is no longer patented.            */

+  /*                                                                       */

+  /* <Since>                                                               */

+  /*    2.3.5                                                              */

+  /*                                                                       */

+  FT_EXPORT( FT_Bool )

+  FT_Face_SetUnpatentedHinting( FT_Face  face,

+                                FT_Bool  value );

+

+  /* */

+

+

+FT_END_HEADER

+

+#endif /* __FREETYPE_H__ */

+

+

+/* END */

diff --git a/core/include/thirdparties/freetype/freetype/ftadvanc.h b/core/include/thirdparties/freetype/freetype/ftadvanc.h
new file mode 100644
index 0000000..0163ba1
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftadvanc.h
@@ -0,0 +1,182 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftadvanc.h                                                             */
+/*                                                                         */
+/*    Quick computation of advance widths (specification only).            */
+/*                                                                         */
+/*  Copyright 2008, 2013 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTADVANC_H__
+#define __FTADVANC_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   quick_advance
+   *
+   * @title:
+   *   Quick retrieval of advance values
+   *
+   * @abstract:
+   *   Retrieve horizontal and vertical advance values without processing
+   *   glyph outlines, if possible.
+   *
+   * @description:
+   *   This section contains functions to quickly extract advance values
+   *   without handling glyph outlines, if possible.
+   */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Const>                                                               */
+  /*    FT_ADVANCE_FLAG_FAST_ONLY                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A bit-flag to be OR-ed with the `flags' parameter of the           */
+  /*    @FT_Get_Advance and @FT_Get_Advances functions.                    */
+  /*                                                                       */
+  /*    If set, it indicates that you want these functions to fail if the  */
+  /*    corresponding hinting mode or font driver doesn't allow for very   */
+  /*    quick advance computation.                                         */
+  /*                                                                       */
+  /*    Typically, glyphs which are either unscaled, unhinted, bitmapped,  */
+  /*    or light-hinted can have their advance width computed very         */
+  /*    quickly.                                                           */
+  /*                                                                       */
+  /*    Normal and bytecode hinted modes, which require loading, scaling,  */
+  /*    and hinting of the glyph outline, are extremely slow by            */
+  /*    comparison.                                                        */
+  /*                                                                       */
+#define FT_ADVANCE_FLAG_FAST_ONLY  0x20000000UL
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Advance                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the advance value of a given glyph outline in an          */
+  /*    @FT_Face.                                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: The source @FT_Face handle.                          */
+  /*                                                                       */
+  /*    gindex     :: The glyph index.                                     */
+  /*                                                                       */
+  /*    load_flags :: A set of bit flags similar to those used when        */
+  /*                  calling @FT_Load_Glyph, used to determine what kind  */
+  /*                  of advances you need.                                */
+  /* <Output>                                                              */
+  /*    padvance :: The advance value.  If scaling is performed (based on  */
+  /*                the value of `load_flags'), the advance value is in    */
+  /*                16.16 format.  Otherwise, it is in font units.         */
+  /*                                                                       */
+  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, this is the        */
+  /*                vertical advance corresponding to a vertical layout.   */
+  /*                Otherwise, it is the horizontal advance in a           */
+  /*                horizontal layout.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */
+  /*    if the corresponding font backend doesn't have a quick way to      */
+  /*    retrieve the advances.                                             */
+  /*                                                                       */
+  /*    A scaled advance is returned in 16.16 format but isn't transformed */
+  /*    by the affine transformation specified by @FT_Set_Transform.       */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Advance( FT_Face    face,
+                  FT_UInt    gindex,
+                  FT_Int32   load_flags,
+                  FT_Fixed  *padvance );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Advances                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the advance values of several glyph outlines in an        */
+  /*    @FT_Face.                                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: The source @FT_Face handle.                         */
+  /*                                                                       */
+  /*    start       :: The first glyph index.                              */
+  /*                                                                       */
+  /*    count       :: The number of advance values you want to retrieve.  */
+  /*                                                                       */
+  /*    load_flags  :: A set of bit flags similar to those used when       */
+  /*                   calling @FT_Load_Glyph.                             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    padvance :: The advance values.  This array, to be provided by the */
+  /*                caller, must contain at least `count' elements.        */
+  /*                                                                       */
+  /*                If scaling is performed (based on the value of         */
+  /*                `load_flags'), the advance values are in 16.16 format. */
+  /*                Otherwise, they are in font units.                     */
+  /*                                                                       */
+  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, these are the      */
+  /*                vertical advances corresponding to a vertical layout.  */
+  /*                Otherwise, they are the horizontal advances in a       */
+  /*                horizontal layout.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */
+  /*    if the corresponding font backend doesn't have a quick way to      */
+  /*    retrieve the advances.                                             */
+  /*                                                                       */
+  /*    Scaled advances are returned in 16.16 format but aren't            */
+  /*    transformed by the affine transformation specified by              */
+  /*    @FT_Set_Transform.                                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Advances( FT_Face    face,
+                   FT_UInt    start,
+                   FT_UInt    count,
+                   FT_Int32   load_flags,
+                   FT_Fixed  *padvances );
+
+/* */
+
+
+FT_END_HEADER
+
+#endif /* __FTADVANC_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftautoh.h b/core/include/thirdparties/freetype/freetype/ftautoh.h
new file mode 100644
index 0000000..6edd9f4
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftautoh.h
@@ -0,0 +1,357 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftautoh.h                                                              */
+/*                                                                         */
+/*    FreeType API for controlling the auto-hinter (specification only).   */
+/*                                                                         */
+/*  Copyright 2012, 2013 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTAUTOH_H__
+#define __FTAUTOH_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   auto_hinter
+   *
+   * @title:
+   *   The auto-hinter
+   *
+   * @abstract:
+   *   Controlling the auto-hinting module.
+   *
+   * @description:
+   *   While FreeType's auto-hinter doesn't expose API functions by itself,
+   *   it is possible to control its behaviour with @FT_Property_Set and
+   *   @FT_Property_Get.  The following lists the available properties
+   *   together with the necessary macros and structures.
+   *
+   *   Note that the auto-hinter's module name is `autofitter' for
+   *   historical reasons.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   glyph-to-script-map
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   The auto-hinter provides various script modules to hint glyphs.
+   *   Examples of supported scripts are Latin or CJK.  Before a glyph is
+   *   auto-hinted, the Unicode character map of the font gets examined, and
+   *   the script is then determined based on Unicode character ranges, see
+   *   below.
+   *
+   *   OpenType fonts, however, often provide much more glyphs than
+   *   character codes (small caps, superscripts, ligatures, swashes, etc.),
+   *   to be controlled by so-called `features'.  Handling OpenType features
+   *   can be quite complicated and thus needs a separate library on top of
+   *   FreeType.
+   *
+   *   The mapping between glyph indices and scripts (in the auto-hinter
+   *   sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an
+   *   array with `num_glyphs' elements, as found in the font's @FT_Face
+   *   structure.  The `glyph-to-script-map' property returns a pointer to
+   *   this array which can be modified as needed.  Note that the
+   *   modification should happen before the first glyph gets processed by
+   *   the auto-hinter so that the global analysis of the font shapes
+   *   actually uses the modified mapping.
+   *
+   *   The following example code demonstrates how to access it (omitting
+   *   the error handling).
+   *
+   *   {
+   *     FT_Library                library;
+   *     FT_Face                   face;
+   *     FT_Prop_GlyphToScriptMap  prop;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *     FT_New_Face( library, "foo.ttf", 0, &face );
+   *
+   *     prop.face = face;
+   *
+   *     FT_Property_Get( library, "autofitter",
+   *                               "glyph-to-script-map", &prop );
+   *
+   *     // adjust `prop.map' as needed right here
+   *
+   *     FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
+   *   }
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   FT_AUTOHINTER_SCRIPT_XXX
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   A list of constants used for the @glyph-to-script-map property to
+   *   specify the script submodule the auto-hinter should use for hinting a
+   *   particular glyph.
+   *
+   * @values:
+   *   FT_AUTOHINTER_SCRIPT_NONE ::
+   *     Don't auto-hint this glyph.
+   *
+   *   FT_AUTOHINTER_SCRIPT_LATIN ::
+   *     Apply the latin auto-hinter.  For the auto-hinter, `latin' is a
+   *     very broad term, including Cyrillic and Greek also since characters
+   *     from those scripts share the same design constraints.
+   *
+   *     By default, characters from the following Unicode ranges are
+   *     assigned to this submodule.
+   *
+   *     {
+   *       U+0020 - U+007F  // Basic Latin (no control characters)
+   *       U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)
+   *       U+0100 - U+017F  // Latin Extended-A
+   *       U+0180 - U+024F  // Latin Extended-B
+   *       U+0250 - U+02AF  // IPA Extensions
+   *       U+02B0 - U+02FF  // Spacing Modifier Letters
+   *       U+0300 - U+036F  // Combining Diacritical Marks
+   *       U+0370 - U+03FF  // Greek and Coptic
+   *       U+0400 - U+04FF  // Cyrillic
+   *       U+0500 - U+052F  // Cyrillic Supplement
+   *       U+1D00 - U+1D7F  // Phonetic Extensions
+   *       U+1D80 - U+1DBF  // Phonetic Extensions Supplement
+   *       U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement
+   *       U+1E00 - U+1EFF  // Latin Extended Additional
+   *       U+1F00 - U+1FFF  // Greek Extended
+   *       U+2000 - U+206F  // General Punctuation
+   *       U+2070 - U+209F  // Superscripts and Subscripts
+   *       U+20A0 - U+20CF  // Currency Symbols
+   *       U+2150 - U+218F  // Number Forms
+   *       U+2460 - U+24FF  // Enclosed Alphanumerics
+   *       U+2C60 - U+2C7F  // Latin Extended-C
+   *       U+2DE0 - U+2DFF  // Cyrillic Extended-A
+   *       U+2E00 - U+2E7F  // Supplemental Punctuation
+   *       U+A640 - U+A69F  // Cyrillic Extended-B
+   *       U+A720 - U+A7FF  // Latin Extended-D
+   *       U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)
+   *      U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
+   *      U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
+   *     }
+   *
+   *   FT_AUTOHINTER_SCRIPT_CJK ::
+   *     Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old
+   *     Vietnamese, and some other scripts.
+   *
+   *     By default, characters from the following Unicode ranges are
+   *     assigned to this submodule.
+   *
+   *     {
+   *       U+1100 - U+11FF  // Hangul Jamo
+   *       U+2E80 - U+2EFF  // CJK Radicals Supplement
+   *       U+2F00 - U+2FDF  // Kangxi Radicals
+   *       U+2FF0 - U+2FFF  // Ideographic Description Characters
+   *       U+3000 - U+303F  // CJK Symbols and Punctuation
+   *       U+3040 - U+309F  // Hiragana
+   *       U+30A0 - U+30FF  // Katakana
+   *       U+3100 - U+312F  // Bopomofo
+   *       U+3130 - U+318F  // Hangul Compatibility Jamo
+   *       U+3190 - U+319F  // Kanbun
+   *       U+31A0 - U+31BF  // Bopomofo Extended
+   *       U+31C0 - U+31EF  // CJK Strokes
+   *       U+31F0 - U+31FF  // Katakana Phonetic Extensions
+   *       U+3200 - U+32FF  // Enclosed CJK Letters and Months
+   *       U+3300 - U+33FF  // CJK Compatibility
+   *       U+3400 - U+4DBF  // CJK Unified Ideographs Extension A
+   *       U+4DC0 - U+4DFF  // Yijing Hexagram Symbols
+   *       U+4E00 - U+9FFF  // CJK Unified Ideographs
+   *       U+A960 - U+A97F  // Hangul Jamo Extended-A
+   *       U+AC00 - U+D7AF  // Hangul Syllables
+   *       U+D7B0 - U+D7FF  // Hangul Jamo Extended-B
+   *       U+F900 - U+FAFF  // CJK Compatibility Ideographs
+   *       U+FE10 - U+FE1F  // Vertical forms
+   *       U+FE30 - U+FE4F  // CJK Compatibility Forms
+   *       U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms
+   *      U+1B000 - U+1B0FF // Kana Supplement
+   *      U+1D300 - U+1D35F // Tai Xuan Hing Symbols
+   *      U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
+   *      U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
+   *      U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
+   *      U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
+   *      U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
+   *     }
+   *
+   *   FT_AUTOHINTER_SCRIPT_INDIC ::
+   *     Apply the indic auto-hinter, covering all major scripts from the
+   *     Indian sub-continent and some other related scripts like Thai, Lao,
+   *     or Tibetan.
+   *
+   *     By default, characters from the following Unicode ranges are
+   *     assigned to this submodule.
+   *
+   *     {
+   *       U+0900 - U+0DFF  // Indic Range
+   *       U+0F00 - U+0FFF  // Tibetan
+   *       U+1900 - U+194F  // Limbu
+   *       U+1B80 - U+1BBF  // Sundanese
+   *       U+1C80 - U+1CDF  // Meetei Mayak
+   *       U+A800 - U+A82F  // Syloti Nagri
+   *      U+11800 - U+118DF // Sharada
+   *     }
+   *
+   *     Note that currently Indic support is rudimentary only, missing blue
+   *     zone support.
+   *
+   */
+#define FT_AUTOHINTER_SCRIPT_NONE   0
+#define FT_AUTOHINTER_SCRIPT_LATIN  1
+#define FT_AUTOHINTER_SCRIPT_CJK    2
+#define FT_AUTOHINTER_SCRIPT_INDIC  3
+
+
+  /**************************************************************************
+   *
+   * @struct:
+   *   FT_Prop_GlyphToScriptMap
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   The data exchange structure for the @glyph-to-script-map property.
+   *
+   */
+   typedef struct  FT_Prop_GlyphToScriptMap_
+   {
+     FT_Face   face;
+     FT_Byte*  map;
+
+   } FT_Prop_GlyphToScriptMap;
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   fallback-script
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   If no auto-hinter script module can be assigned to a glyph, a
+   *   fallback script gets assigned to it (see also the
+   *   @glyph-to-script-map property).  By default, this is
+   *   @FT_AUTOHINTER_SCRIPT_CJK.  Using the `fallback-script' property,
+   *   this fallback value can be changed.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "autofitter",
+   *                               "fallback-script", &fallback_script );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   It's important to use the right timing for changing this value: The
+   *   creation of the glyph-to-script map which eventually uses the
+   *   fallback script value gets triggered either by setting or reading a
+   *   face-specific property like @glyph-to-script-map, or by auto-hinting
+   *   any glyph from that face.  In particular, if you have already created
+   *   an @FT_Face structure but not loaded any glyph (using the
+   *   auto-hinter), a change of the fallback glyph will affect this face.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   increase-x-height
+   *
+   * @description:
+   *   For ppem values in the range 6~<= ppem <= `increase-x-height', round
+   *   up the font's x~height much more often than normally.  If the value
+   *   is set to~0, which is the default, this feature is switched off.  Use
+   *   this property to improve the legibility of small font sizes if
+   *   necessary.
+   *
+   *   {
+   *     FT_Library               library;
+   *     FT_Face                  face;
+   *     FT_Prop_IncreaseXHeight  prop;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *     FT_New_Face( library, "foo.ttf", 0, &face );
+   *     FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
+   *
+   *     prop.face  = face;
+   *     prop.limit = 14;
+   *
+   *     FT_Property_Set( library, "autofitter",
+   *                               "increase-x-height", &prop );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   Set this value right after calling @FT_Set_Char_Size, but before
+   *   loading any glyph (using the auto-hinter).
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @struct:
+   *   FT_Prop_IncreaseXHeight
+   *
+   * @description:
+   *   The data exchange structure for the @increase-x-height property.
+   *
+   */
+   typedef struct  FT_Prop_IncreaseXHeight_
+   {
+     FT_Face  face;
+     FT_UInt  limit;
+
+   } FT_Prop_IncreaseXHeight;
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTAUTOH_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftbbox.h b/core/include/thirdparties/freetype/freetype/ftbbox.h
new file mode 100644
index 0000000..5f54246
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftbbox.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbbox.h                                                               */
+/*                                                                         */
+/*    FreeType exact bbox computation (specification).                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2007, 2011 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This component has a _single_ role: to compute exact outline bounding */
+  /* boxes.                                                                */
+  /*                                                                       */
+  /* It is separated from the rest of the engine for various technical     */
+  /* reasons.  It may well be integrated in `ftoutln' later.               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTBBOX_H__
+#define __FTBBOX_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    outline_processing                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Get_BBox                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Compute the exact bounding box of an outline.  This is slower      */
+  /*    than computing the control box.  However, it uses an advanced      */
+  /*    algorithm which returns _very_ quickly when the two boxes          */
+  /*    coincide.  Otherwise, the outline Bézier arcs are traversed to     */
+  /*    extract their extrema.                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline :: A pointer to the source outline.                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    abbox   :: The outline's exact bounding box.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If the font is tricky and the glyph has been loaded with           */
+  /*    @FT_LOAD_NO_SCALE, the resulting BBox is meaningless.  To get      */
+  /*    reasonable values for the BBox it is necessary to load the glyph   */
+  /*    at a large ppem value (so that the hinting instructions can        */
+  /*    properly shift and scale the subglyphs), then extracting the BBox  */
+  /*    which can be eventually converted back to font units.              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Get_BBox( FT_Outline*  outline,
+                       FT_BBox     *abbox );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBBOX_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/include/thirdparties/freetype/freetype/ftbdf.h b/core/include/thirdparties/freetype/freetype/ftbdf.h
new file mode 100644
index 0000000..c4721bc
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftbdf.h
@@ -0,0 +1,209 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbdf.h                                                                */
+/*                                                                         */
+/*    FreeType API for accessing BDF-specific strings (specification).     */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2006, 2009 by                              */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTBDF_H__
+#define __FTBDF_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    bdf_fonts                                                          */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    BDF and PCF Files                                                  */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    BDF and PCF specific API.                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of functions specific to BDF */
+  /*    and PCF fonts.                                                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /**********************************************************************
+   *
+   * @enum:
+   *    FT_PropertyType
+   *
+   * @description:
+   *    A list of BDF property types.
+   *
+   * @values:
+   *    BDF_PROPERTY_TYPE_NONE ::
+   *      Value~0 is used to indicate a missing property.
+   *
+   *    BDF_PROPERTY_TYPE_ATOM ::
+   *      Property is a string atom.
+   *
+   *    BDF_PROPERTY_TYPE_INTEGER ::
+   *      Property is a 32-bit signed integer.
+   *
+   *    BDF_PROPERTY_TYPE_CARDINAL ::
+   *      Property is a 32-bit unsigned integer.
+   */
+  typedef enum  BDF_PropertyType_
+  {
+    BDF_PROPERTY_TYPE_NONE     = 0,
+    BDF_PROPERTY_TYPE_ATOM     = 1,
+    BDF_PROPERTY_TYPE_INTEGER  = 2,
+    BDF_PROPERTY_TYPE_CARDINAL = 3
+
+  } BDF_PropertyType;
+
+
+  /**********************************************************************
+   *
+   * @type:
+   *    BDF_Property
+   *
+   * @description:
+   *    A handle to a @BDF_PropertyRec structure to model a given
+   *    BDF/PCF property.
+   */
+  typedef struct BDF_PropertyRec_*  BDF_Property;
+
+
+ /**********************************************************************
+  *
+  * @struct:
+  *    BDF_PropertyRec
+  *
+  * @description:
+  *    This structure models a given BDF/PCF property.
+  *
+  * @fields:
+  *    type ::
+  *      The property type.
+  *
+  *    u.atom ::
+  *      The atom string, if type is @BDF_PROPERTY_TYPE_ATOM.
+  *
+  *    u.integer ::
+  *      A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER.
+  *
+  *    u.cardinal ::
+  *      An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL.
+  */
+  typedef struct  BDF_PropertyRec_
+  {
+    BDF_PropertyType  type;
+    union {
+      const char*     atom;
+      FT_Int32        integer;
+      FT_UInt32       cardinal;
+
+    } u;
+
+  } BDF_PropertyRec;
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_BDF_Charset_ID
+  *
+  * @description:
+  *    Retrieve a BDF font character set identity, according to
+  *    the BDF specification.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  * @output:
+  *    acharset_encoding ::
+  *       Charset encoding, as a C~string, owned by the face.
+  *
+  *    acharset_registry ::
+  *       Charset registry, as a C~string, owned by the face.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   This function only works with BDF faces, returning an error otherwise.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_BDF_Charset_ID( FT_Face       face,
+                         const char*  *acharset_encoding,
+                         const char*  *acharset_registry );
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_BDF_Property
+  *
+  * @description:
+  *    Retrieve a BDF property from a BDF or PCF font file.
+  *
+  * @input:
+  *    face :: A handle to the input face.
+  *
+  *    name :: The property name.
+  *
+  * @output:
+  *    aproperty :: The property.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   This function works with BDF _and_ PCF fonts.  It returns an error
+  *   otherwise.  It also returns an error if the property is not in the
+  *   font.
+  *
+  *   A `property' is a either key-value pair within the STARTPROPERTIES
+  *   ... ENDPROPERTIES block of a BDF font or a key-value pair from the
+  *   `info->props' array within a `FontRec' structure of a PCF font.
+  *
+  *   Integer properties are always stored as `signed' within PCF fonts;
+  *   consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value
+  *   for BDF fonts only.
+  *
+  *   In case of error, `aproperty->type' is always set to
+  *   @BDF_PROPERTY_TYPE_NONE.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_BDF_Property( FT_Face           face,
+                       const char*       prop_name,
+                       BDF_PropertyRec  *aproperty );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTBDF_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftbitmap.h b/core/include/thirdparties/freetype/freetype/ftbitmap.h
new file mode 100644
index 0000000..9640790
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftbitmap.h
@@ -0,0 +1,227 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbitmap.h                                                             */
+/*                                                                         */
+/*    FreeType utility functions for bitmaps (specification).              */
+/*                                                                         */
+/*  Copyright 2004-2006, 2008, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTBITMAP_H__
+#define __FTBITMAP_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    bitmap_handling                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Bitmap Handling                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Handling FT_Bitmap objects.                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains functions for converting FT_Bitmap objects.  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_New                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a pointer to an @FT_Bitmap structure.                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    abitmap :: A pointer to the bitmap structure.                      */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Bitmap_New( FT_Bitmap  *abitmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_Copy                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Copy a bitmap into another one.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a library object.                           */
+  /*                                                                       */
+  /*    source  :: A handle to the source bitmap.                          */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    target  :: A handle to the target bitmap.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Copy( FT_Library        library,
+                  const FT_Bitmap  *source,
+                  FT_Bitmap        *target);
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_Embolden                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Embolden a bitmap.  The new bitmap will be about `xStrength'       */
+  /*    pixels wider and `yStrength' pixels higher.  The left and bottom   */
+  /*    borders are kept unchanged.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library   :: A handle to a library object.                         */
+  /*                                                                       */
+  /*    xStrength :: How strong the glyph is emboldened horizontally.      */
+  /*                 Expressed in 26.6 pixel format.                       */
+  /*                                                                       */
+  /*    yStrength :: How strong the glyph is emboldened vertically.        */
+  /*                 Expressed in 26.6 pixel format.                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    bitmap    :: A handle to the target bitmap.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The current implementation restricts `xStrength' to be less than   */
+  /*    or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO.      */
+  /*                                                                       */
+  /*    If you want to embolden the bitmap owned by a @FT_GlyphSlotRec,    */
+  /*    you should call @FT_GlyphSlot_Own_Bitmap on the slot first.        */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Embolden( FT_Library  library,
+                      FT_Bitmap*  bitmap,
+                      FT_Pos      xStrength,
+                      FT_Pos      yStrength );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_Convert                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp */
+  /*    to a bitmap object with depth 8bpp, making the number of used      */
+  /*    bytes line (a.k.a. the `pitch') a multiple of `alignment'.         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library   :: A handle to a library object.                         */
+  /*                                                                       */
+  /*    source    :: The source bitmap.                                    */
+  /*                                                                       */
+  /*    alignment :: The pitch of the bitmap is a multiple of this         */
+  /*                 parameter.  Common values are 1, 2, or 4.             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    target    :: The target bitmap.                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    It is possible to call @FT_Bitmap_Convert multiple times without   */
+  /*    calling @FT_Bitmap_Done (the memory is simply reallocated).        */
+  /*                                                                       */
+  /*    Use @FT_Bitmap_Done to finally remove the bitmap object.           */
+  /*                                                                       */
+  /*    The `library' argument is taken to have access to FreeType's       */
+  /*    memory handling functions.                                         */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Convert( FT_Library        library,
+                     const FT_Bitmap  *source,
+                     FT_Bitmap        *target,
+                     FT_Int            alignment );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_GlyphSlot_Own_Bitmap                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Make sure that a glyph slot owns `slot->bitmap'.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot :: The glyph slot.                                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is to be used in combination with                    */
+  /*    @FT_Bitmap_Embolden.                                               */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_Done                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy a bitmap object created with @FT_Bitmap_New.               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a library object.                           */
+  /*                                                                       */
+  /*    bitmap  :: The bitmap object to be freed.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `library' argument is taken to have access to FreeType's       */
+  /*    memory handling functions.                                         */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Done( FT_Library  library,
+                  FT_Bitmap  *bitmap );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBITMAP_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftbzip2.h b/core/include/thirdparties/freetype/freetype/ftbzip2.h
new file mode 100644
index 0000000..654b222
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftbzip2.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbzip2.h                                                              */
+/*                                                                         */
+/*    Bzip2-compressed stream support.                                     */
+/*                                                                         */
+/*  Copyright 2010 by                                                      */
+/*  Joel Klinghed.                                                         */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTBZIP2_H__
+#define __FTBZIP2_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    bzip2                                                              */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    BZIP2 Streams                                                      */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Using bzip2-compressed font files.                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of Bzip2-specific functions. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+ /************************************************************************
+  *
+  * @function:
+  *   FT_Stream_OpenBzip2
+  *
+  * @description:
+  *   Open a new stream to parse bzip2-compressed font files.  This is
+  *   mainly used to support the compressed `*.pcf.bz2' fonts that come
+  *   with XFree86.
+  *
+  * @input:
+  *   stream ::
+  *     The target embedding stream.
+  *
+  *   source ::
+  *     The source stream.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   The source stream must be opened _before_ calling this function.
+  *
+  *   Calling the internal function `FT_Stream_Close' on the new stream will
+  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream
+  *   objects will be released to the heap.
+  *
+  *   The stream implementation is very basic and resets the decompression
+  *   process each time seeking backwards is needed within the stream.
+  *
+  *   In certain builds of the library, bzip2 compression recognition is
+  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.
+  *   This means that if no font driver is capable of handling the raw
+  *   compressed file, the library will try to open a bzip2 compressed stream
+  *   from it and re-open the face with it.
+  *
+  *   This function may return `FT_Err_Unimplemented_Feature' if your build
+  *   of FreeType was not compiled with bzip2 support.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Stream_OpenBzip2( FT_Stream  stream,
+                       FT_Stream  source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBZIP2_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftcache.h b/core/include/thirdparties/freetype/freetype/ftcache.h
new file mode 100644
index 0000000..404b0fa
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftcache.h
@@ -0,0 +1,1057 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcache.h                                                              */
+/*                                                                         */
+/*    FreeType Cache subsystem (specification).                            */
+/*                                                                         */
+/*  Copyright 1996-2008, 2010, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCACHE_H__
+#define __FTCACHE_H__
+
+
+#include "../ft2build.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************
+   *
+   * <Section>
+   *    cache_subsystem
+   *
+   * <Title>
+   *    Cache Sub-System
+   *
+   * <Abstract>
+   *    How to cache face, size, and glyph data with FreeType~2.
+   *
+   * <Description>
+   *   This section describes the FreeType~2 cache sub-system, which is used
+   *   to limit the number of concurrently opened @FT_Face and @FT_Size
+   *   objects, as well as caching information like character maps and glyph
+   *   images while limiting their maximum memory usage.
+   *
+   *   Note that all types and functions begin with the `FTC_' prefix.
+   *
+   *   The cache is highly portable and thus doesn't know anything about the
+   *   fonts installed on your system, or how to access them.  This implies
+   *   the following scheme:
+   *
+   *   First, available or installed font faces are uniquely identified by
+   *   @FTC_FaceID values, provided to the cache by the client.  Note that
+   *   the cache only stores and compares these values, and doesn't try to
+   *   interpret them in any way.
+   *
+   *   Second, the cache calls, only when needed, a client-provided function
+   *   to convert an @FTC_FaceID into a new @FT_Face object.  The latter is
+   *   then completely managed by the cache, including its termination
+   *   through @FT_Done_Face.  To monitor termination of face objects, the
+   *   finalizer callback in the `generic' field of the @FT_Face object can
+   *   be used, which might also be used to store the @FTC_FaceID of the
+   *   face.
+   *
+   *   Clients are free to map face IDs to anything else.  The most simple
+   *   usage is to associate them to a (pathname,face_index) pair that is
+   *   used to call @FT_New_Face.  However, more complex schemes are also
+   *   possible.
+   *
+   *   Note that for the cache to work correctly, the face ID values must be
+   *   *persistent*, which means that the contents they point to should not
+   *   change at runtime, or that their value should not become invalid.
+   *
+   *   If this is unavoidable (e.g., when a font is uninstalled at runtime),
+   *   you should call @FTC_Manager_RemoveFaceID as soon as possible, to let
+   *   the cache get rid of any references to the old @FTC_FaceID it may
+   *   keep internally.  Failure to do so will lead to incorrect behaviour
+   *   or even crashes.
+   *
+   *   To use the cache, start with calling @FTC_Manager_New to create a new
+   *   @FTC_Manager object, which models a single cache instance.  You can
+   *   then look up @FT_Face and @FT_Size objects with
+   *   @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively.
+   *
+   *   If you want to use the charmap caching, call @FTC_CMapCache_New, then
+   *   later use @FTC_CMapCache_Lookup to perform the equivalent of
+   *   @FT_Get_Char_Index, only much faster.
+   *
+   *   If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then
+   *   later use @FTC_ImageCache_Lookup to retrieve the corresponding
+   *   @FT_Glyph objects from the cache.
+   *
+   *   If you need lots of small bitmaps, it is much more memory efficient
+   *   to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup.  This
+   *   returns @FTC_SBitRec structures, which are used to store small
+   *   bitmaps directly.  (A small bitmap is one whose metrics and
+   *   dimensions all fit into 8-bit integers).
+   *
+   *   We hope to also provide a kerning cache in the near future.
+   *
+   *
+   * <Order>
+   *   FTC_Manager
+   *   FTC_FaceID
+   *   FTC_Face_Requester
+   *
+   *   FTC_Manager_New
+   *   FTC_Manager_Reset
+   *   FTC_Manager_Done
+   *   FTC_Manager_LookupFace
+   *   FTC_Manager_LookupSize
+   *   FTC_Manager_RemoveFaceID
+   *
+   *   FTC_Node
+   *   FTC_Node_Unref
+   *
+   *   FTC_ImageCache
+   *   FTC_ImageCache_New
+   *   FTC_ImageCache_Lookup
+   *
+   *   FTC_SBit
+   *   FTC_SBitCache
+   *   FTC_SBitCache_New
+   *   FTC_SBitCache_Lookup
+   *
+   *   FTC_CMapCache
+   *   FTC_CMapCache_New
+   *   FTC_CMapCache_Lookup
+   *
+   *************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    BASIC TYPE DEFINITIONS                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @type: FTC_FaceID
+   *
+   * @description:
+   *   An opaque pointer type that is used to identity face objects.  The
+   *   contents of such objects is application-dependent.
+   *
+   *   These pointers are typically used to point to a user-defined
+   *   structure containing a font file path, and face index.
+   *
+   * @note:
+   *   Never use NULL as a valid @FTC_FaceID.
+   *
+   *   Face IDs are passed by the client to the cache manager, which calls,
+   *   when needed, the @FTC_Face_Requester to translate them into new
+   *   @FT_Face objects.
+   *
+   *   If the content of a given face ID changes at runtime, or if the value
+   *   becomes invalid (e.g., when uninstalling a font), you should
+   *   immediately call @FTC_Manager_RemoveFaceID before any other cache
+   *   function.
+   *
+   *   Failure to do so will result in incorrect behaviour or even
+   *   memory leaks and crashes.
+   */
+  typedef FT_Pointer  FTC_FaceID;
+
+
+  /************************************************************************
+   *
+   * @functype:
+   *   FTC_Face_Requester
+   *
+   * @description:
+   *   A callback function provided by client applications.  It is used by
+   *   the cache manager to translate a given @FTC_FaceID into a new valid
+   *   @FT_Face object, on demand.
+   *
+   * <Input>
+   *   face_id ::
+   *     The face ID to resolve.
+   *
+   *   library ::
+   *     A handle to a FreeType library object.
+   *
+   *   req_data ::
+   *     Application-provided request data (see note below).
+   *
+   * <Output>
+   *   aface ::
+   *     A new @FT_Face handle.
+   *
+   * <Return>
+   *   FreeType error code.  0~means success.
+   *
+   * <Note>
+   *   The third parameter `req_data' is the same as the one passed by the
+   *   client when @FTC_Manager_New is called.
+   *
+   *   The face requester should not perform funny things on the returned
+   *   face object, like creating a new @FT_Size for it, or setting a
+   *   transformation through @FT_Set_Transform!
+   */
+  typedef FT_Error
+  (*FTC_Face_Requester)( FTC_FaceID  face_id,
+                         FT_Library  library,
+                         FT_Pointer  request_data,
+                         FT_Face*    aface );
+
+ /* */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      CACHE MANAGER OBJECT                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_Manager                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This object corresponds to one instance of the cache-subsystem.    */
+  /*    It is used to cache one or more @FT_Face objects, along with       */
+  /*    corresponding @FT_Size objects.                                    */
+  /*                                                                       */
+  /*    The manager intentionally limits the total number of opened        */
+  /*    @FT_Face and @FT_Size objects to control memory usage.  See the    */
+  /*    `max_faces' and `max_sizes' parameters of @FTC_Manager_New.        */
+  /*                                                                       */
+  /*    The manager is also used to cache `nodes' of various types while   */
+  /*    limiting their total memory usage.                                 */
+  /*                                                                       */
+  /*    All limitations are enforced by keeping lists of managed objects   */
+  /*    in most-recently-used order, and flushing old nodes to make room   */
+  /*    for new ones.                                                      */
+  /*                                                                       */
+  typedef struct FTC_ManagerRec_*  FTC_Manager;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_Node                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An opaque handle to a cache node object.  Each cache node is       */
+  /*    reference-counted.  A node with a count of~0 might be flushed      */
+  /*    out of a full cache whenever a lookup request is performed.        */
+  /*                                                                       */
+  /*    If you look up nodes, you have the ability to `acquire' them,      */
+  /*    i.e., to increment their reference count.  This will prevent the   */
+  /*    node from being flushed out of the cache until you explicitly      */
+  /*    `release' it (see @FTC_Node_Unref).                                */
+  /*                                                                       */
+  /*    See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup.         */
+  /*                                                                       */
+  typedef struct FTC_NodeRec_*  FTC_Node;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_New                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new cache manager.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library   :: The parent FreeType library handle to use.            */
+  /*                                                                       */
+  /*    max_faces :: Maximum number of opened @FT_Face objects managed by  */
+  /*                 this cache instance.  Use~0 for defaults.             */
+  /*                                                                       */
+  /*    max_sizes :: Maximum number of opened @FT_Size objects managed by  */
+  /*                 this cache instance.  Use~0 for defaults.             */
+  /*                                                                       */
+  /*    max_bytes :: Maximum number of bytes to use for cached data nodes. */
+  /*                 Use~0 for defaults.  Note that this value does not    */
+  /*                 account for managed @FT_Face and @FT_Size objects.    */
+  /*                                                                       */
+  /*    requester :: An application-provided callback used to translate    */
+  /*                 face IDs into real @FT_Face objects.                  */
+  /*                                                                       */
+  /*    req_data  :: A generic pointer that is passed to the requester     */
+  /*                 each time it is called (see @FTC_Face_Requester).     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amanager  :: A handle to a new manager object.  0~in case of       */
+  /*                 failure.                                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_Manager_New( FT_Library          library,
+                   FT_UInt             max_faces,
+                   FT_UInt             max_sizes,
+                   FT_ULong            max_bytes,
+                   FTC_Face_Requester  requester,
+                   FT_Pointer          req_data,
+                   FTC_Manager        *amanager );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_Reset                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Empty a given cache manager.  This simply gets rid of all the      */
+  /*    currently cached @FT_Face and @FT_Size objects within the manager. */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    manager :: A handle to the manager.                                */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FTC_Manager_Reset( FTC_Manager  manager );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_Done                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy a given manager after emptying it.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: A handle to the target cache manager object.            */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FTC_Manager_Done( FTC_Manager  manager );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_LookupFace                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the @FT_Face object that corresponds to a given face ID   */
+  /*    through a cache manager.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: A handle to the cache manager.                          */
+  /*                                                                       */
+  /*    face_id :: The ID of the face object.                              */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aface   :: A handle to the face object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned @FT_Face object is always owned by the manager.  You  */
+  /*    should never try to discard it yourself.                           */
+  /*                                                                       */
+  /*    The @FT_Face object doesn't necessarily have a current size object */
+  /*    (i.e., face->size can be~0).  If you need a specific `font size',  */
+  /*    use @FTC_Manager_LookupSize instead.                               */
+  /*                                                                       */
+  /*    Never change the face's transformation matrix (i.e., never call    */
+  /*    the @FT_Set_Transform function) on a returned face!  If you need   */
+  /*    to transform glyphs, do it yourself after glyph loading.           */
+  /*                                                                       */
+  /*    When you perform a lookup, out-of-memory errors are detected       */
+  /*    _within_ the lookup and force incremental flushes of the cache     */
+  /*    until enough memory is released for the lookup to succeed.         */
+  /*                                                                       */
+  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */
+  /*    already been completely flushed, and still no memory was available */
+  /*    for the operation.                                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_Manager_LookupFace( FTC_Manager  manager,
+                          FTC_FaceID   face_id,
+                          FT_Face     *aface );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FTC_ScalerRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to describe a given character size in either      */
+  /*    pixels or points to the cache manager.  See                        */
+  /*    @FTC_Manager_LookupSize.                                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    face_id :: The source face ID.                                     */
+  /*                                                                       */
+  /*    width   :: The character width.                                    */
+  /*                                                                       */
+  /*    height  :: The character height.                                   */
+  /*                                                                       */
+  /*    pixel   :: A Boolean.  If 1, the `width' and `height' fields are   */
+  /*               interpreted as integer pixel character sizes.           */
+  /*               Otherwise, they are expressed as 1/64th of points.      */
+  /*                                                                       */
+  /*    x_res   :: Only used when `pixel' is value~0 to indicate the       */
+  /*               horizontal resolution in dpi.                           */
+  /*                                                                       */
+  /*    y_res   :: Only used when `pixel' is value~0 to indicate the       */
+  /*               vertical resolution in dpi.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This type is mainly used to retrieve @FT_Size objects through the  */
+  /*    cache manager.                                                     */
+  /*                                                                       */
+  typedef struct  FTC_ScalerRec_
+  {
+    FTC_FaceID  face_id;
+    FT_UInt     width;
+    FT_UInt     height;
+    FT_Int      pixel;
+    FT_UInt     x_res;
+    FT_UInt     y_res;
+
+  } FTC_ScalerRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FTC_Scaler                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an @FTC_ScalerRec structure.                           */
+  /*                                                                       */
+  typedef struct FTC_ScalerRec_*  FTC_Scaler;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_LookupSize                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the @FT_Size object that corresponds to a given           */
+  /*    @FTC_ScalerRec pointer through a cache manager.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: A handle to the cache manager.                          */
+  /*                                                                       */
+  /*    scaler  :: A scaler handle.                                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    asize   :: A handle to the size object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned @FT_Size object is always owned by the manager.  You  */
+  /*    should never try to discard it by yourself.                        */
+  /*                                                                       */
+  /*    You can access the parent @FT_Face object simply as `size->face'   */
+  /*    if you need it.  Note that this object is also owned by the        */
+  /*    manager.                                                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    When you perform a lookup, out-of-memory errors are detected       */
+  /*    _within_ the lookup and force incremental flushes of the cache     */
+  /*    until enough memory is released for the lookup to succeed.         */
+  /*                                                                       */
+  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */
+  /*    already been completely flushed, and still no memory is available  */
+  /*    for the operation.                                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_Manager_LookupSize( FTC_Manager  manager,
+                          FTC_Scaler   scaler,
+                          FT_Size     *asize );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Node_Unref                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Decrement a cache node's internal reference count.  When the count */
+  /*    reaches 0, it is not destroyed but becomes eligible for subsequent */
+  /*    cache flushes.                                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    node    :: The cache node handle.                                  */
+  /*                                                                       */
+  /*    manager :: The cache manager handle.                               */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FTC_Node_Unref( FTC_Node     node,
+                  FTC_Manager  manager );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FTC_Manager_RemoveFaceID
+   *
+   * @description:
+   *   A special function used to indicate to the cache manager that
+   *   a given @FTC_FaceID is no longer valid, either because its
+   *   content changed, or because it was deallocated or uninstalled.
+   *
+   * @input:
+   *   manager ::
+   *     The cache manager handle.
+   *
+   *   face_id ::
+   *     The @FTC_FaceID to be removed.
+   *
+   * @note:
+   *   This function flushes all nodes from the cache corresponding to this
+   *   `face_id', with the exception of nodes with a non-null reference
+   *   count.
+   *
+   *   Such nodes are however modified internally so as to never appear
+   *   in later lookups with the same `face_id' value, and to be immediately
+   *   destroyed when released by all their users.
+   *
+   */
+  FT_EXPORT( void )
+  FTC_Manager_RemoveFaceID( FTC_Manager  manager,
+                            FTC_FaceID   face_id );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    cache_subsystem                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FTC_CMapCache
+   *
+   * @description:
+   *   An opaque handle used to model a charmap cache.  This cache is to
+   *   hold character codes -> glyph indices mappings.
+   *
+   */
+  typedef struct FTC_CMapCacheRec_*  FTC_CMapCache;
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FTC_CMapCache_New
+   *
+   * @description:
+   *   Create a new charmap cache.
+   *
+   * @input:
+   *   manager ::
+   *     A handle to the cache manager.
+   *
+   * @output:
+   *   acache ::
+   *     A new cache handle.  NULL in case of error.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   Like all other caches, this one will be destroyed with the cache
+   *   manager.
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FTC_CMapCache_New( FTC_Manager     manager,
+                     FTC_CMapCache  *acache );
+
+
+  /************************************************************************
+   *
+   * @function:
+   *   FTC_CMapCache_Lookup
+   *
+   * @description:
+   *   Translate a character code into a glyph index, using the charmap
+   *   cache.
+   *
+   * @input:
+   *   cache ::
+   *     A charmap cache handle.
+   *
+   *   face_id ::
+   *     The source face ID.
+   *
+   *   cmap_index ::
+   *     The index of the charmap in the source face.  Any negative value
+   *     means to use the cache @FT_Face's default charmap.
+   *
+   *   char_code ::
+   *     The character code (in the corresponding charmap).
+   *
+   * @return:
+   *    Glyph index.  0~means `no glyph'.
+   *
+   */
+  FT_EXPORT( FT_UInt )
+  FTC_CMapCache_Lookup( FTC_CMapCache  cache,
+                        FTC_FaceID     face_id,
+                        FT_Int         cmap_index,
+                        FT_UInt32      char_code );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    cache_subsystem                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       IMAGE CACHE OBJECT                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   FTC_ImageTypeRec
+   *
+   * @description:
+   *   A structure used to model the type of images in a glyph cache.
+   *
+   * @fields:
+   *   face_id ::
+   *     The face ID.
+   *
+   *   width ::
+   *     The width in pixels.
+   *
+   *   height ::
+   *     The height in pixels.
+   *
+   *   flags ::
+   *     The load flags, as in @FT_Load_Glyph.
+   *
+   */
+  typedef struct  FTC_ImageTypeRec_
+  {
+    FTC_FaceID  face_id;
+    FT_Int      width;
+    FT_Int      height;
+    FT_Int32    flags;
+
+  } FTC_ImageTypeRec;
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FTC_ImageType
+   *
+   * @description:
+   *   A handle to an @FTC_ImageTypeRec structure.
+   *
+   */
+  typedef struct FTC_ImageTypeRec_*  FTC_ImageType;
+
+
+  /* */
+
+
+#define FTC_IMAGE_TYPE_COMPARE( d1, d2 )      \
+          ( (d1)->face_id == (d2)->face_id && \
+            (d1)->width   == (d2)->width   && \
+            (d1)->flags   == (d2)->flags   )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_ImageCache                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a glyph image cache object.  They are designed to      */
+  /*    hold many distinct glyph images while not exceeding a certain      */
+  /*    memory threshold.                                                  */
+  /*                                                                       */
+  typedef struct FTC_ImageCacheRec_*  FTC_ImageCache;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_ImageCache_New                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new glyph image cache.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: The parent manager for the image cache.                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acache  :: A handle to the new glyph image cache object.           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_ImageCache_New( FTC_Manager      manager,
+                      FTC_ImageCache  *acache );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_ImageCache_Lookup                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve a given glyph image from a glyph image cache.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    cache  :: A handle to the source glyph image cache.                */
+  /*                                                                       */
+  /*    type   :: A pointer to a glyph image type descriptor.              */
+  /*                                                                       */
+  /*    gindex :: The glyph index to retrieve.                             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aglyph :: The corresponding @FT_Glyph object.  0~in case of        */
+  /*              failure.                                                 */
+  /*                                                                       */
+  /*    anode  :: Used to return the address of of the corresponding cache */
+  /*              node after incrementing its reference count (see note    */
+  /*              below).                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned glyph is owned and managed by the glyph image cache.  */
+  /*    Never try to transform or discard it manually!  You can however    */
+  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */
+  /*                                                                       */
+  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
+  /*    node containing the glyph image, after increasing its reference    */
+  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */
+  /*    always be kept in the cache until you call @FTC_Node_Unref to      */
+  /*    `release' it.                                                      */
+  /*                                                                       */
+  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
+  /*    that the @FT_Glyph could be flushed out of the cache on the next   */
+  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
+  /*    is persistent!                                                     */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_ImageCache_Lookup( FTC_ImageCache  cache,
+                         FTC_ImageType   type,
+                         FT_UInt         gindex,
+                         FT_Glyph       *aglyph,
+                         FTC_Node       *anode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_ImageCache_LookupScaler                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec    */
+  /*    to specify the face ID and its size.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    cache      :: A handle to the source glyph image cache.            */
+  /*                                                                       */
+  /*    scaler     :: A pointer to a scaler descriptor.                    */
+  /*                                                                       */
+  /*    load_flags :: The corresponding load flags.                        */
+  /*                                                                       */
+  /*    gindex     :: The glyph index to retrieve.                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aglyph     :: The corresponding @FT_Glyph object.  0~in case of    */
+  /*                  failure.                                             */
+  /*                                                                       */
+  /*    anode      :: Used to return the address of of the corresponding   */
+  /*                  cache node after incrementing its reference count    */
+  /*                  (see note below).                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned glyph is owned and managed by the glyph image cache.  */
+  /*    Never try to transform or discard it manually!  You can however    */
+  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */
+  /*                                                                       */
+  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
+  /*    node containing the glyph image, after increasing its reference    */
+  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */
+  /*    always be kept in the cache until you call @FTC_Node_Unref to      */
+  /*    `release' it.                                                      */
+  /*                                                                       */
+  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
+  /*    that the @FT_Glyph could be flushed out of the cache on the next   */
+  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
+  /*    is persistent!                                                     */
+  /*                                                                       */
+  /*    Calls to @FT_Set_Char_Size and friends have no effect on cached    */
+  /*    glyphs; you should always use the FreeType cache API instead.      */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_ImageCache_LookupScaler( FTC_ImageCache  cache,
+                               FTC_Scaler      scaler,
+                               FT_ULong        load_flags,
+                               FT_UInt         gindex,
+                               FT_Glyph       *aglyph,
+                               FTC_Node       *anode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_SBit                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a small bitmap descriptor.  See the @FTC_SBitRec       */
+  /*    structure for details.                                             */
+  /*                                                                       */
+  typedef struct FTC_SBitRec_*  FTC_SBit;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FTC_SBitRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very compact structure used to describe a small glyph bitmap.    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    width     :: The bitmap width in pixels.                           */
+  /*                                                                       */
+  /*    height    :: The bitmap height in pixels.                          */
+  /*                                                                       */
+  /*    left      :: The horizontal distance from the pen position to the  */
+  /*                 left bitmap border (a.k.a. `left side bearing', or    */
+  /*                 `lsb').                                               */
+  /*                                                                       */
+  /*    top       :: The vertical distance from the pen position (on the   */
+  /*                 baseline) to the upper bitmap border (a.k.a. `top     */
+  /*                 side bearing').  The distance is positive for upwards */
+  /*                 y~coordinates.                                        */
+  /*                                                                       */
+  /*    format    :: The format of the glyph bitmap (monochrome or gray).  */
+  /*                                                                       */
+  /*    max_grays :: Maximum gray level value (in the range 1 to~255).     */
+  /*                                                                       */
+  /*    pitch     :: The number of bytes per bitmap line.  May be positive */
+  /*                 or negative.                                          */
+  /*                                                                       */
+  /*    xadvance  :: The horizontal advance width in pixels.               */
+  /*                                                                       */
+  /*    yadvance  :: The vertical advance height in pixels.                */
+  /*                                                                       */
+  /*    buffer    :: A pointer to the bitmap pixels.                       */
+  /*                                                                       */
+  typedef struct  FTC_SBitRec_
+  {
+    FT_Byte   width;
+    FT_Byte   height;
+    FT_Char   left;
+    FT_Char   top;
+
+    FT_Byte   format;
+    FT_Byte   max_grays;
+    FT_Short  pitch;
+    FT_Char   xadvance;
+    FT_Char   yadvance;
+
+    FT_Byte*  buffer;
+
+  } FTC_SBitRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_SBitCache                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a small bitmap cache.  These are special cache objects */
+  /*    used to store small glyph bitmaps (and anti-aliased pixmaps) in a  */
+  /*    much more efficient way than the traditional glyph image cache     */
+  /*    implemented by @FTC_ImageCache.                                    */
+  /*                                                                       */
+  typedef struct FTC_SBitCacheRec_*  FTC_SBitCache;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_SBitCache_New                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new cache to store small glyph bitmaps.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: A handle to the source cache manager.                   */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acache  :: A handle to the new sbit cache.  NULL in case of error. */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_SBitCache_New( FTC_Manager     manager,
+                     FTC_SBitCache  *acache );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_SBitCache_Lookup                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Look up a given small glyph bitmap in a given sbit cache and       */
+  /*    `lock' it to prevent its flushing from the cache until needed.     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    cache  :: A handle to the source sbit cache.                       */
+  /*                                                                       */
+  /*    type   :: A pointer to the glyph image type descriptor.            */
+  /*                                                                       */
+  /*    gindex :: The glyph index.                                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    sbit   :: A handle to a small bitmap descriptor.                   */
+  /*                                                                       */
+  /*    anode  :: Used to return the address of of the corresponding cache */
+  /*              node after incrementing its reference count (see note    */
+  /*              below).                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The small bitmap descriptor and its bit buffer are owned by the    */
+  /*    cache and should never be freed by the application.  They might    */
+  /*    as well disappear from memory on the next cache lookup, so don't   */
+  /*    treat them as persistent data.                                     */
+  /*                                                                       */
+  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */
+  /*    glyph bitmap.                                                      */
+  /*                                                                       */
+  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
+  /*    node containing the bitmap, after increasing its reference count.  */
+  /*    This ensures that the node (as well as the image) will always be   */
+  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */
+  /*                                                                       */
+  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
+  /*    that the bitmap could be flushed out of the cache on the next      */
+  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
+  /*    is persistent!                                                     */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_SBitCache_Lookup( FTC_SBitCache    cache,
+                        FTC_ImageType    type,
+                        FT_UInt          gindex,
+                        FTC_SBit        *sbit,
+                        FTC_Node        *anode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_SBitCache_LookupScaler                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec     */
+  /*    to specify the face ID and its size.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    cache      :: A handle to the source sbit cache.                   */
+  /*                                                                       */
+  /*    scaler     :: A pointer to the scaler descriptor.                  */
+  /*                                                                       */
+  /*    load_flags :: The corresponding load flags.                        */
+  /*                                                                       */
+  /*    gindex     :: The glyph index.                                     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    sbit       :: A handle to a small bitmap descriptor.               */
+  /*                                                                       */
+  /*    anode      :: Used to return the address of of the corresponding   */
+  /*                  cache node after incrementing its reference count    */
+  /*                  (see note below).                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The small bitmap descriptor and its bit buffer are owned by the    */
+  /*    cache and should never be freed by the application.  They might    */
+  /*    as well disappear from memory on the next cache lookup, so don't   */
+  /*    treat them as persistent data.                                     */
+  /*                                                                       */
+  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */
+  /*    glyph bitmap.                                                      */
+  /*                                                                       */
+  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
+  /*    node containing the bitmap, after increasing its reference count.  */
+  /*    This ensures that the node (as well as the image) will always be   */
+  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */
+  /*                                                                       */
+  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
+  /*    that the bitmap could be flushed out of the cache on the next      */
+  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
+  /*    is persistent!                                                     */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_SBitCache_LookupScaler( FTC_SBitCache  cache,
+                              FTC_Scaler     scaler,
+                              FT_ULong       load_flags,
+                              FT_UInt        gindex,
+                              FTC_SBit      *sbit,
+                              FTC_Node      *anode );
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCACHE_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftcffdrv.h b/core/include/thirdparties/freetype/freetype/ftcffdrv.h
new file mode 100644
index 0000000..3a37795
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftcffdrv.h
@@ -0,0 +1,151 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcffdrv.h                                                             */
+/*                                                                         */
+/*    FreeType API for controlling the CFF driver (specification only).    */
+/*                                                                         */
+/*  Copyright 2013 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCFFDRV_H__
+#define __FTCFFDRV_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   cff_driver
+   *
+   * @title:
+   *   The CFF driver
+   *
+   * @abstract:
+   *   Controlling the CFF driver module.
+   *
+   * @description:
+   *   While FreeType's CFF driver doesn't expose API functions by itself,
+   *   it is possible to control its behaviour with @FT_Property_Set and
+   *   @FT_Property_Get.  The following lists the available properties
+   *   together with the necessary macros and structures.
+   *
+   *   The CFF driver's module name is `cff'.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   hinting-engine
+   *
+   * @description:
+   *   Thanks to Adobe, which contributed a new hinting (and parsing)
+   *   engine, an application can select between `freetype' and `adobe' if
+   *   compiled with CFF_CONFIG_OPTION_OLD_ENGINE.  If this configuration
+   *   macro isn't defined, `hinting-engine' does nothing.
+   *
+   *   The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is
+   *   defined, and `adobe' otherwise.
+   *
+   *   The following example code demonstrates how to select Adobe's hinting
+   *   engine (omitting the error handling).
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Face     face;
+   *     FT_UInt     hinting_engine = FT_CFF_HINTING_ADOBE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "cff",
+   *                               "hinting-engine", &hinting_engine );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   FT_CFF_HINTING_XXX
+   *
+   * @description:
+   *   A list of constants used for the @hinting-engine property to select
+   *   the hinting engine for CFF fonts.
+   *
+   * @values:
+   *   FT_CFF_HINTING_FREETYPE ::
+   *     Use the old FreeType hinting engine.
+   *
+   *   FT_CFF_HINTING_ADOBE ::
+   *     Use the hinting engine contributed by Adobe.
+   *
+   */
+#define FT_CFF_HINTING_FREETYPE  0
+#define FT_CFF_HINTING_ADOBE     1
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   no-stem-darkening
+   *
+   * @description:
+   *   By default, the Adobe CFF engine darkens stems at smaller sizes,
+   *   regardless of hinting, to enhance contrast.  Setting this property,
+   *   stem darkening gets switched off.
+   *
+   *   Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Face     face;
+   *     FT_Bool     no_stem_darkening = TRUE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "cff",
+   *                               "no-stem-darkening", &no_stem_darkening );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   */
+
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __FTCFFDRV_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftchapters.h b/core/include/thirdparties/freetype/freetype/ftchapters.h
new file mode 100644
index 0000000..c55670d
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftchapters.h
@@ -0,0 +1,120 @@
+/***************************************************************************/
+/*                                                                         */
+/* This file defines the structure of the FreeType reference.              */
+/* It is used by the python script which generates the HTML files.         */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    general_remarks                                                      */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    General Remarks                                                      */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    user_allocation                                                      */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    core_api                                                             */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Core API                                                             */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    version                                                              */
+/*    basic_types                                                          */
+/*    base_interface                                                       */
+/*    glyph_variants                                                       */
+/*    glyph_management                                                     */
+/*    mac_specific                                                         */
+/*    sizes_management                                                     */
+/*    header_file_macros                                                   */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    format_specific                                                      */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Format-Specific API                                                  */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    multiple_masters                                                     */
+/*    truetype_tables                                                      */
+/*    type1_tables                                                         */
+/*    sfnt_names                                                           */
+/*    bdf_fonts                                                            */
+/*    cid_fonts                                                            */
+/*    pfr_fonts                                                            */
+/*    winfnt_fonts                                                         */
+/*    font_formats                                                         */
+/*    gasp_table                                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    module_specific                                                      */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Controlling FreeType Modules                                         */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    auto_hinter                                                          */
+/*    cff_driver                                                           */
+/*    tt_driver                                                            */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    cache_subsystem                                                      */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Cache Sub-System                                                     */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    cache_subsystem                                                      */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    support_api                                                          */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Support API                                                          */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    computations                                                         */
+/*    list_processing                                                      */
+/*    outline_processing                                                   */
+/*    quick_advance                                                        */
+/*    bitmap_handling                                                      */
+/*    raster                                                               */
+/*    glyph_stroker                                                        */
+/*    system_interface                                                     */
+/*    module_management                                                    */
+/*    gzip                                                                 */
+/*    lzw                                                                  */
+/*    bzip2                                                                */
+/*    lcd_filtering                                                        */
+/*                                                                         */
+/***************************************************************************/
diff --git a/core/include/thirdparties/freetype/freetype/ftcid.h b/core/include/thirdparties/freetype/freetype/ftcid.h
new file mode 100644
index 0000000..f595975
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftcid.h
@@ -0,0 +1,166 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcid.h                                                                */
+/*                                                                         */
+/*    FreeType API for accessing CID font information (specification).     */
+/*                                                                         */
+/*  Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal.                  */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCID_H__
+#define __FTCID_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    cid_fonts                                                          */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    CID Fonts                                                          */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    CID-keyed font specific API.                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of CID-keyed font specific   */
+  /*    functions.                                                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Get_CID_Registry_Ordering_Supplement
+   *
+   * @description:
+   *    Retrieve the Registry/Ordering/Supplement triple (also known as the
+   *    "R/O/S") from a CID-keyed font.
+   *
+   * @input:
+   *    face ::
+   *       A handle to the input face.
+   *
+   * @output:
+   *    registry ::
+   *       The registry, as a C~string, owned by the face.
+   *
+   *    ordering ::
+   *       The ordering, as a C~string, owned by the face.
+   *
+   *    supplement ::
+   *       The supplement.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    This function only works with CID faces, returning an error
+   *    otherwise.
+   *
+   * @since:
+   *    2.3.6
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,
+                                           const char*  *registry,
+                                           const char*  *ordering,
+                                           FT_Int       *supplement);
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Get_CID_Is_Internally_CID_Keyed
+   *
+   * @description:
+   *    Retrieve the type of the input face, CID keyed or not.  In
+   *    constrast to the @FT_IS_CID_KEYED macro this function returns
+   *    successfully also for CID-keyed fonts in an SNFT wrapper.
+   *
+   * @input:
+   *    face ::
+   *       A handle to the input face.
+   *
+   * @output:
+   *    is_cid ::
+   *       The type of the face as an @FT_Bool.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    This function only works with CID faces and OpenType fonts,
+   *    returning an error otherwise.
+   *
+   * @since:
+   *    2.3.9
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,
+                                      FT_Bool  *is_cid );
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Get_CID_From_Glyph_Index
+   *
+   * @description:
+   *    Retrieve the CID of the input glyph index.
+   *
+   * @input:
+   *    face ::
+   *       A handle to the input face.
+   *
+   *    glyph_index ::
+   *       The input glyph index.
+   *
+   * @output:
+   *    cid ::
+   *       The CID as an @FT_UInt.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    This function only works with CID faces and OpenType fonts,
+   *    returning an error otherwise.
+   *
+   * @since:
+   *    2.3.9
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_CID_From_Glyph_Index( FT_Face   face,
+                               FT_UInt   glyph_index,
+                               FT_UInt  *cid );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCID_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/fterrdef.h b/core/include/thirdparties/freetype/freetype/fterrdef.h
new file mode 100644
index 0000000..76c7b9e
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/fterrdef.h
@@ -0,0 +1,249 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fterrdef.h                                                             */
+/*                                                                         */
+/*    FreeType error codes (specification).                                */
+/*                                                                         */
+/*  Copyright 2002, 2004, 2006, 2007, 2010-2013 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                LIST OF ERROR CODES/MESSAGES             *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+  /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */
+  /* including this file.                                           */
+
+
+  /* generic errors */
+
+  FT_NOERRORDEF_( Ok,                                        0x00, \
+                  "no error" )
+
+  FT_ERRORDEF_( Cannot_Open_Resource,                        0x01, \
+                "cannot open resource" )
+  FT_ERRORDEF_( Unknown_File_Format,                         0x02, \
+                "unknown file format" )
+  FT_ERRORDEF_( Invalid_File_Format,                         0x03, \
+                "broken file" )
+  FT_ERRORDEF_( Invalid_Version,                             0x04, \
+                "invalid FreeType version" )
+  FT_ERRORDEF_( Lower_Module_Version,                        0x05, \
+                "module version is too low" )
+  FT_ERRORDEF_( Invalid_Argument,                            0x06, \
+                "invalid argument" )
+  FT_ERRORDEF_( Unimplemented_Feature,                       0x07, \
+                "unimplemented feature" )
+  FT_ERRORDEF_( Invalid_Table,                               0x08, \
+                "broken table" )
+  FT_ERRORDEF_( Invalid_Offset,                              0x09, \
+                "broken offset within table" )
+  FT_ERRORDEF_( Array_Too_Large,                             0x0A, \
+                "array allocation size too large" )
+  FT_ERRORDEF_( Missing_Module,                              0x0B, \
+                "missing module" )
+  FT_ERRORDEF_( Missing_Property,                            0x0C, \
+                "missing property" )
+
+  /* glyph/character errors */
+
+  FT_ERRORDEF_( Invalid_Glyph_Index,                         0x10, \
+                "invalid glyph index" )
+  FT_ERRORDEF_( Invalid_Character_Code,                      0x11, \
+                "invalid character code" )
+  FT_ERRORDEF_( Invalid_Glyph_Format,                        0x12, \
+                "unsupported glyph image format" )
+  FT_ERRORDEF_( Cannot_Render_Glyph,                         0x13, \
+                "cannot render this glyph format" )
+  FT_ERRORDEF_( Invalid_Outline,                             0x14, \
+                "invalid outline" )
+  FT_ERRORDEF_( Invalid_Composite,                           0x15, \
+                "invalid composite glyph" )
+  FT_ERRORDEF_( Too_Many_Hints,                              0x16, \
+                "too many hints" )
+  FT_ERRORDEF_( Invalid_Pixel_Size,                          0x17, \
+                "invalid pixel size" )
+
+  /* handle errors */
+
+  FT_ERRORDEF_( Invalid_Handle,                              0x20, \
+                "invalid object handle" )
+  FT_ERRORDEF_( Invalid_Library_Handle,                      0x21, \
+                "invalid library handle" )
+  FT_ERRORDEF_( Invalid_Driver_Handle,                       0x22, \
+                "invalid module handle" )
+  FT_ERRORDEF_( Invalid_Face_Handle,                         0x23, \
+                "invalid face handle" )
+  FT_ERRORDEF_( Invalid_Size_Handle,                         0x24, \
+                "invalid size handle" )
+  FT_ERRORDEF_( Invalid_Slot_Handle,                         0x25, \
+                "invalid glyph slot handle" )
+  FT_ERRORDEF_( Invalid_CharMap_Handle,                      0x26, \
+                "invalid charmap handle" )
+  FT_ERRORDEF_( Invalid_Cache_Handle,                        0x27, \
+                "invalid cache manager handle" )
+  FT_ERRORDEF_( Invalid_Stream_Handle,                       0x28, \
+                "invalid stream handle" )
+
+  /* driver errors */
+
+  FT_ERRORDEF_( Too_Many_Drivers,                            0x30, \
+                "too many modules" )
+  FT_ERRORDEF_( Too_Many_Extensions,                         0x31, \
+                "too many extensions" )
+
+  /* memory errors */
+
+  FT_ERRORDEF_( Out_Of_Memory,                               0x40, \
+                "out of memory" )
+  FT_ERRORDEF_( Unlisted_Object,                             0x41, \
+                "unlisted object" )
+
+  /* stream errors */
+
+  FT_ERRORDEF_( Cannot_Open_Stream,                          0x51, \
+                "cannot open stream" )
+  FT_ERRORDEF_( Invalid_Stream_Seek,                         0x52, \
+                "invalid stream seek" )
+  FT_ERRORDEF_( Invalid_Stream_Skip,                         0x53, \
+                "invalid stream skip" )
+  FT_ERRORDEF_( Invalid_Stream_Read,                         0x54, \
+                "invalid stream read" )
+  FT_ERRORDEF_( Invalid_Stream_Operation,                    0x55, \
+                "invalid stream operation" )
+  FT_ERRORDEF_( Invalid_Frame_Operation,                     0x56, \
+                "invalid frame operation" )
+  FT_ERRORDEF_( Nested_Frame_Access,                         0x57, \
+                "nested frame access" )
+  FT_ERRORDEF_( Invalid_Frame_Read,                          0x58, \
+                "invalid frame read" )
+
+  /* raster errors */
+
+  FT_ERRORDEF_( Raster_Uninitialized,                        0x60, \
+                "raster uninitialized" )
+  FT_ERRORDEF_( Raster_Corrupted,                            0x61, \
+                "raster corrupted" )
+  FT_ERRORDEF_( Raster_Overflow,                             0x62, \
+                "raster overflow" )
+  FT_ERRORDEF_( Raster_Negative_Height,                      0x63, \
+                "negative height while rastering" )
+
+  /* cache errors */
+
+  FT_ERRORDEF_( Too_Many_Caches,                             0x70, \
+                "too many registered caches" )
+
+  /* TrueType and SFNT errors */
+
+  FT_ERRORDEF_( Invalid_Opcode,                              0x80, \
+                "invalid opcode" )
+  FT_ERRORDEF_( Too_Few_Arguments,                           0x81, \
+                "too few arguments" )
+  FT_ERRORDEF_( Stack_Overflow,                              0x82, \
+                "stack overflow" )
+  FT_ERRORDEF_( Code_Overflow,                               0x83, \
+                "code overflow" )
+  FT_ERRORDEF_( Bad_Argument,                                0x84, \
+                "bad argument" )
+  FT_ERRORDEF_( Divide_By_Zero,                              0x85, \
+                "division by zero" )
+  FT_ERRORDEF_( Invalid_Reference,                           0x86, \
+                "invalid reference" )
+  FT_ERRORDEF_( Debug_OpCode,                                0x87, \
+                "found debug opcode" )
+  FT_ERRORDEF_( ENDF_In_Exec_Stream,                         0x88, \
+                "found ENDF opcode in execution stream" )
+  FT_ERRORDEF_( Nested_DEFS,                                 0x89, \
+                "nested DEFS" )
+  FT_ERRORDEF_( Invalid_CodeRange,                           0x8A, \
+                "invalid code range" )
+  FT_ERRORDEF_( Execution_Too_Long,                          0x8B, \
+                "execution context too long" )
+  FT_ERRORDEF_( Too_Many_Function_Defs,                      0x8C, \
+                "too many function definitions" )
+  FT_ERRORDEF_( Too_Many_Instruction_Defs,                   0x8D, \
+                "too many instruction definitions" )
+  FT_ERRORDEF_( Table_Missing,                               0x8E, \
+                "SFNT font table missing" )
+  FT_ERRORDEF_( Horiz_Header_Missing,                        0x8F, \
+                "horizontal header (hhea) table missing" )
+  FT_ERRORDEF_( Locations_Missing,                           0x90, \
+                "locations (loca) table missing" )
+  FT_ERRORDEF_( Name_Table_Missing,                          0x91, \
+                "name table missing" )
+  FT_ERRORDEF_( CMap_Table_Missing,                          0x92, \
+                "character map (cmap) table missing" )
+  FT_ERRORDEF_( Hmtx_Table_Missing,                          0x93, \
+                "horizontal metrics (hmtx) table missing" )
+  FT_ERRORDEF_( Post_Table_Missing,                          0x94, \
+                "PostScript (post) table missing" )
+  FT_ERRORDEF_( Invalid_Horiz_Metrics,                       0x95, \
+                "invalid horizontal metrics" )
+  FT_ERRORDEF_( Invalid_CharMap_Format,                      0x96, \
+                "invalid character map (cmap) format" )
+  FT_ERRORDEF_( Invalid_PPem,                                0x97, \
+                "invalid ppem value" )
+  FT_ERRORDEF_( Invalid_Vert_Metrics,                        0x98, \
+                "invalid vertical metrics" )
+  FT_ERRORDEF_( Could_Not_Find_Context,                      0x99, \
+                "could not find context" )
+  FT_ERRORDEF_( Invalid_Post_Table_Format,                   0x9A, \
+                "invalid PostScript (post) table format" )
+  FT_ERRORDEF_( Invalid_Post_Table,                          0x9B, \
+                "invalid PostScript (post) table" )
+
+  /* CFF, CID, and Type 1 errors */
+
+  FT_ERRORDEF_( Syntax_Error,                                0xA0, \
+                "opcode syntax error" )
+  FT_ERRORDEF_( Stack_Underflow,                             0xA1, \
+                "argument stack underflow" )
+  FT_ERRORDEF_( Ignore,                                      0xA2, \
+                "ignore" )
+  FT_ERRORDEF_( No_Unicode_Glyph_Name,                       0xA3, \
+                "no Unicode glyph name found" )
+  FT_ERRORDEF_( Glyph_Too_Big,                               0xA4, \
+                "glyph to big for hinting" )
+
+  /* BDF errors */
+
+  FT_ERRORDEF_( Missing_Startfont_Field,                     0xB0, \
+                "`STARTFONT' field missing" )
+  FT_ERRORDEF_( Missing_Font_Field,                          0xB1, \
+                "`FONT' field missing" )
+  FT_ERRORDEF_( Missing_Size_Field,                          0xB2, \
+                "`SIZE' field missing" )
+  FT_ERRORDEF_( Missing_Fontboundingbox_Field,               0xB3, \
+                "`FONTBOUNDINGBOX' field missing" )
+  FT_ERRORDEF_( Missing_Chars_Field,                         0xB4, \
+                "`CHARS' field missing" )
+  FT_ERRORDEF_( Missing_Startchar_Field,                     0xB5, \
+                "`STARTCHAR' field missing" )
+  FT_ERRORDEF_( Missing_Encoding_Field,                      0xB6, \
+                "`ENCODING' field missing" )
+  FT_ERRORDEF_( Missing_Bbx_Field,                           0xB7, \
+                "`BBX' field missing" )
+  FT_ERRORDEF_( Bbx_Too_Big,                                 0xB8, \
+                "`BBX' too big" )
+  FT_ERRORDEF_( Corrupted_Font_Header,                       0xB9, \
+                "Font header corrupted or missing fields" )
+  FT_ERRORDEF_( Corrupted_Font_Glyphs,                       0xBA, \
+                "Font glyphs corrupted or missing fields" )
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/fterrors.h b/core/include/thirdparties/freetype/freetype/fterrors.h
new file mode 100644
index 0000000..bd69d0f
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/fterrors.h
@@ -0,0 +1,198 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fterrors.h                                                             */
+/*                                                                         */
+/*    FreeType error code handling (specification).                        */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004, 2007, 2013 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This special header file is used to define the handling of FT2        */
+  /* enumeration constants.  It can also be used to generate error message */
+  /* strings with a small macro trick explained below.                     */
+  /*                                                                       */
+  /* I - Error Formats                                                     */
+  /* -----------------                                                     */
+  /*                                                                       */
+  /*   The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be   */
+  /*   defined in ftoption.h in order to make the higher byte indicate     */
+  /*   the module where the error has happened (this is not compatible     */
+  /*   with standard builds of FreeType 2).  See the file `ftmoderr.h' for */
+  /*   more details.                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /* II - Error Message strings                                            */
+  /* --------------------------                                            */
+  /*                                                                       */
+  /*   The error definitions below are made through special macros that    */
+  /*   allow client applications to build a table of error message strings */
+  /*   if they need it.  The strings are not included in a normal build of */
+  /*   FreeType 2 to save space (most client applications do not use       */
+  /*   them).                                                              */
+  /*                                                                       */
+  /*   To do so, you have to define the following macros before including  */
+  /*   this file:                                                          */
+  /*                                                                       */
+  /*   FT_ERROR_START_LIST ::                                              */
+  /*     This macro is called before anything else to define the start of  */
+  /*     the error list.  It is followed by several FT_ERROR_DEF calls     */
+  /*     (see below).                                                      */
+  /*                                                                       */
+  /*   FT_ERROR_DEF( e, v, s ) ::                                          */
+  /*     This macro is called to define one single error.                  */
+  /*     `e' is the error code identifier (e.g. FT_Err_Invalid_Argument).  */
+  /*     `v' is the error numerical value.                                 */
+  /*     `s' is the corresponding error string.                            */
+  /*                                                                       */
+  /*   FT_ERROR_END_LIST ::                                                */
+  /*     This macro ends the list.                                         */
+  /*                                                                       */
+  /*   Additionally, you have to undefine __FTERRORS_H__ before #including */
+  /*   this file.                                                          */
+  /*                                                                       */
+  /*   Here is a simple example:                                           */
+  /*                                                                       */
+  /*     {                                                                 */
+  /*       #undef __FTERRORS_H__                                           */
+  /*       #define FT_ERRORDEF( e, v, s )  { e, s },                       */
+  /*       #define FT_ERROR_START_LIST     {                               */
+  /*       #define FT_ERROR_END_LIST       { 0, 0 } };                     */
+  /*                                                                       */
+  /*       const struct                                                    */
+  /*       {                                                               */
+  /*         int          err_code;                                        */
+  /*         const char*  err_msg;                                         */
+  /*       } ft_errors[] =                                                 */
+  /*                                                                       */
+  /*       #include "fterrors.h"                                            */
+  /*     }                                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTERRORS_H__
+#define __FTERRORS_H__
+
+
+  /* include module base error codes */
+#include "ftmoderr.h"
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                       SETUP MACROS                      *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#undef  FT_NEED_EXTERN_C
+
+
+  /* FT_ERR_PREFIX is used as a prefix for error identifiers. */
+  /* By default, we use `FT_Err_'.                            */
+  /*                                                          */
+#ifndef FT_ERR_PREFIX
+#define FT_ERR_PREFIX  FT_Err_
+#endif
+
+
+  /* FT_ERR_BASE is used as the base for module-specific errors. */
+  /*                                                             */
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+#ifndef FT_ERR_BASE
+#define FT_ERR_BASE  FT_Mod_Err_Base
+#endif
+
+#else
+
+#undef FT_ERR_BASE
+#define FT_ERR_BASE  0
+
+#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */
+
+
+  /* If FT_ERRORDEF is not defined, we need to define a simple */
+  /* enumeration type.                                         */
+  /*                                                           */
+#ifndef FT_ERRORDEF
+
+#define FT_ERRORDEF( e, v, s )  e = v,
+#define FT_ERROR_START_LIST     enum {
+#define FT_ERROR_END_LIST       FT_ERR_CAT( FT_ERR_PREFIX, Max ) };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+  extern "C" {
+#endif
+
+#endif /* !FT_ERRORDEF */
+
+
+  /* this macro is used to define an error */
+#define FT_ERRORDEF_( e, v, s )                                             \
+          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s )
+
+  /* this is only used for <module>_Err_Ok, which must be 0! */
+#define FT_NOERRORDEF_( e, v, s )                             \
+          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s )
+
+
+#ifdef FT_ERROR_START_LIST
+  FT_ERROR_START_LIST
+#endif
+
+
+  /* now include the error codes */
+#include "fterrdef.h"
+
+
+#ifdef FT_ERROR_END_LIST
+  FT_ERROR_END_LIST
+#endif
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                      SIMPLE CLEANUP                     *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+#ifdef FT_NEED_EXTERN_C
+  }
+#endif
+
+#undef FT_ERROR_START_LIST
+#undef FT_ERROR_END_LIST
+
+#undef FT_ERRORDEF
+#undef FT_ERRORDEF_
+#undef FT_NOERRORDEF_
+
+#undef FT_NEED_EXTERN_C
+#undef FT_ERR_BASE
+
+  /* FT_ERR_PREFIX is needed internally */
+#ifndef FT2_BUILD_LIBRARY
+#undef FT_ERR_PREFIX
+#endif
+
+#endif /* __FTERRORS_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftgasp.h b/core/include/thirdparties/freetype/freetype/ftgasp.h
new file mode 100644
index 0000000..ff0a34a
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftgasp.h
@@ -0,0 +1,128 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgasp.h                                                               */
+/*                                                                         */
+/*    Access of TrueType's `gasp' table (specification).                   */
+/*                                                                         */
+/*  Copyright 2007, 2008, 2011 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef _FT_GASP_H_
+#define _FT_GASP_H_
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+  /***************************************************************************
+   *
+   * @section:
+   *   gasp_table
+   *
+   * @title:
+   *   Gasp Table
+   *
+   * @abstract:
+   *   Retrieving TrueType `gasp' table entries.
+   *
+   * @description:
+   *   The function @FT_Get_Gasp can be used to query a TrueType or OpenType
+   *   font for specific entries in its `gasp' table, if any.  This is
+   *   mainly useful when implementing native TrueType hinting with the
+   *   bytecode interpreter to duplicate the Windows text rendering results.
+   */
+
+  /*************************************************************************
+   *
+   * @enum:
+   *   FT_GASP_XXX
+   *
+   * @description:
+   *   A list of values and/or bit-flags returned by the @FT_Get_Gasp
+   *   function.
+   *
+   * @values:
+   *   FT_GASP_NO_TABLE ::
+   *     This special value means that there is no GASP table in this face.
+   *     It is up to the client to decide what to do.
+   *
+   *   FT_GASP_DO_GRIDFIT ::
+   *     Grid-fitting and hinting should be performed at the specified ppem.
+   *     This *really* means TrueType bytecode interpretation.  If this bit
+   *     is not set, no hinting gets applied.
+   *
+   *   FT_GASP_DO_GRAY ::
+   *     Anti-aliased rendering should be performed at the specified ppem.
+   *     If not set, do monochrome rendering.
+   *
+   *   FT_GASP_SYMMETRIC_SMOOTHING ::
+   *     If set, smoothing along multiple axes must be used with ClearType.
+   *
+   *   FT_GASP_SYMMETRIC_GRIDFIT ::
+   *     Grid-fitting must be used with ClearType's symmetric smoothing.
+   *
+   * @note:
+   *   The bit-flags `FT_GASP_DO_GRIDFIT' and `FT_GASP_DO_GRAY' are to be
+   *   used for standard font rasterization only.  Independently of that,
+   *   `FT_GASP_SYMMETRIC_SMOOTHING' and `FT_GASP_SYMMETRIC_GRIDFIT' are to
+   *   be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT' and
+   *   `FT_GASP_DO_GRAY' are consequently ignored).
+   *
+   *   `ClearType' is Microsoft's implementation of LCD rendering, partly
+   *   protected by patents.
+   *
+   * @since:
+   *   2.3.0
+   */
+#define FT_GASP_NO_TABLE               -1
+#define FT_GASP_DO_GRIDFIT           0x01
+#define FT_GASP_DO_GRAY              0x02
+#define FT_GASP_SYMMETRIC_SMOOTHING  0x08
+#define FT_GASP_SYMMETRIC_GRIDFIT    0x10
+
+
+  /*************************************************************************
+   *
+   * @func:
+   *   FT_Get_Gasp
+   *
+   * @description:
+   *   Read the `gasp' table from a TrueType or OpenType font file and
+   *   return the entry corresponding to a given character pixel size.
+   *
+   * @input:
+   *   face :: The source face handle.
+   *   ppem :: The vertical character pixel size.
+   *
+   * @return:
+   *   Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no
+   *   `gasp' table in the face.
+   *
+   * @since:
+   *   2.3.0
+   */
+  FT_EXPORT( FT_Int )
+  FT_Get_Gasp( FT_Face  face,
+               FT_UInt  ppem );
+
+/* */
+
+#endif /* _FT_GASP_H_ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftglyph.h b/core/include/thirdparties/freetype/freetype/ftglyph.h
new file mode 100644
index 0000000..ec2d9d8
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftglyph.h
@@ -0,0 +1,620 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftglyph.h                                                              */
+/*                                                                         */
+/*    FreeType convenience functions to handle glyphs (specification).     */
+/*                                                                         */
+/*  Copyright 1996-2003, 2006, 2008, 2009, 2011 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file contains the definition of several convenience functions    */
+  /* that can be used by client applications to easily retrieve glyph      */
+  /* bitmaps and outlines from a given face.                               */
+  /*                                                                       */
+  /* These functions should be optional if you are writing a font server   */
+  /* or text layout engine on top of FreeType.  However, they are pretty   */
+  /* handy for many other simple uses of the library.                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTGLYPH_H__
+#define __FTGLYPH_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    glyph_management                                                   */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Glyph Management                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Generic interface to manage individual glyph data.                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains definitions used to manage glyph data        */
+  /*    through generic FT_Glyph objects.  Each of them can contain a      */
+  /*    bitmap, a vector outline, or even images in other formats.         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* forward declaration to a private type */
+  typedef struct FT_Glyph_Class_  FT_Glyph_Class;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Glyph                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Handle to an object used to model generic glyph images.  It is a   */
+  /*    pointer to the @FT_GlyphRec structure and can contain a glyph      */
+  /*    bitmap or pointer.                                                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Glyph objects are not owned by the library.  You must thus release */
+  /*    them manually (through @FT_Done_Glyph) _before_ calling            */
+  /*    @FT_Done_FreeType.                                                 */
+  /*                                                                       */
+  typedef struct FT_GlyphRec_*  FT_Glyph;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_GlyphRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The root glyph structure contains a given glyph image plus its     */
+  /*    advance width in 16.16 fixed-point format.                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    library :: A handle to the FreeType library object.                */
+  /*                                                                       */
+  /*    clazz   :: A pointer to the glyph's class.  Private.               */
+  /*                                                                       */
+  /*    format  :: The format of the glyph's image.                        */
+  /*                                                                       */
+  /*    advance :: A 16.16 vector that gives the glyph's advance width.    */
+  /*                                                                       */
+  typedef struct  FT_GlyphRec_
+  {
+    FT_Library             library;
+    const FT_Glyph_Class*  clazz;
+    FT_Glyph_Format        format;
+    FT_Vector              advance;
+
+  } FT_GlyphRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_BitmapGlyph                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an object used to model a bitmap glyph image.  This is */
+  /*    a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec.     */
+  /*                                                                       */
+  typedef struct FT_BitmapGlyphRec_*  FT_BitmapGlyph;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_BitmapGlyphRec                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used for bitmap glyph images.  This really is a        */
+  /*    `sub-class' of @FT_GlyphRec.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root   :: The root @FT_Glyph fields.                               */
+  /*                                                                       */
+  /*    left   :: The left-side bearing, i.e., the horizontal distance     */
+  /*              from the current pen position to the left border of the  */
+  /*              glyph bitmap.                                            */
+  /*                                                                       */
+  /*    top    :: The top-side bearing, i.e., the vertical distance from   */
+  /*              the current pen position to the top border of the glyph  */
+  /*              bitmap.  This distance is positive for upwards~y!        */
+  /*                                                                       */
+  /*    bitmap :: A descriptor for the bitmap.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have       */
+  /*    `glyph->format == FT_GLYPH_FORMAT_BITMAP'.  This lets you access   */
+  /*    the bitmap's contents easily.                                      */
+  /*                                                                       */
+  /*    The corresponding pixel buffer is always owned by @FT_BitmapGlyph  */
+  /*    and is thus created and destroyed with it.                         */
+  /*                                                                       */
+  typedef struct  FT_BitmapGlyphRec_
+  {
+    FT_GlyphRec  root;
+    FT_Int       left;
+    FT_Int       top;
+    FT_Bitmap    bitmap;
+
+  } FT_BitmapGlyphRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_OutlineGlyph                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an object used to model an outline glyph image.  This  */
+  /*    is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */
+  /*                                                                       */
+  typedef struct FT_OutlineGlyphRec_*  FT_OutlineGlyph;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_OutlineGlyphRec                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used for outline (vectorial) glyph images.  This       */
+  /*    really is a `sub-class' of @FT_GlyphRec.                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root    :: The root @FT_Glyph fields.                              */
+  /*                                                                       */
+  /*    outline :: A descriptor for the outline.                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have      */
+  /*    `glyph->format == FT_GLYPH_FORMAT_OUTLINE'.  This lets you access  */
+  /*    the outline's content easily.                                      */
+  /*                                                                       */
+  /*    As the outline is extracted from a glyph slot, its coordinates are */
+  /*    expressed normally in 26.6 pixels, unless the flag                 */
+  /*    @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */
+  /*                                                                       */
+  /*    The outline's tables are always owned by the object and are        */
+  /*    destroyed with it.                                                 */
+  /*                                                                       */
+  typedef struct  FT_OutlineGlyphRec_
+  {
+    FT_GlyphRec  root;
+    FT_Outline   outline;
+
+  } FT_OutlineGlyphRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Glyph                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to extract a glyph image from a slot.  Note that   */
+  /*    the created @FT_Glyph object must be released with @FT_Done_Glyph. */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot   :: A handle to the source glyph slot.                       */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aglyph :: A handle to the glyph object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Glyph( FT_GlyphSlot  slot,
+                FT_Glyph     *aglyph );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Glyph_Copy                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to copy a glyph image.  Note that the created      */
+  /*    @FT_Glyph object must be released with @FT_Done_Glyph.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    source :: A handle to the source glyph object.                     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    target :: A handle to the target glyph object.  0~in case of       */
+  /*              error.                                                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_Copy( FT_Glyph   source,
+                 FT_Glyph  *target );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Glyph_Transform                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Transform a glyph image if its format is scalable.                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    glyph  :: A handle to the target glyph object.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    matrix :: A pointer to a 2x2 matrix to apply.                      */
+  /*                                                                       */
+  /*    delta  :: A pointer to a 2d vector to apply.  Coordinates are      */
+  /*              expressed in 1/64th of a pixel.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code (if not 0, the glyph format is not scalable).  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The 2x2 transformation matrix is also applied to the glyph's       */
+  /*    advance vector.                                                    */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_Transform( FT_Glyph    glyph,
+                      FT_Matrix*  matrix,
+                      FT_Vector*  delta );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Glyph_BBox_Mode                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The mode how the values of @FT_Glyph_Get_CBox are returned.        */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_GLYPH_BBOX_UNSCALED ::                                          */
+  /*      Return unscaled font units.                                      */
+  /*                                                                       */
+  /*    FT_GLYPH_BBOX_SUBPIXELS ::                                         */
+  /*      Return unfitted 26.6 coordinates.                                */
+  /*                                                                       */
+  /*    FT_GLYPH_BBOX_GRIDFIT ::                                           */
+  /*      Return grid-fitted 26.6 coordinates.                             */
+  /*                                                                       */
+  /*    FT_GLYPH_BBOX_TRUNCATE ::                                          */
+  /*      Return coordinates in integer pixels.                            */
+  /*                                                                       */
+  /*    FT_GLYPH_BBOX_PIXELS ::                                            */
+  /*      Return grid-fitted pixel coordinates.                            */
+  /*                                                                       */
+  typedef enum  FT_Glyph_BBox_Mode_
+  {
+    FT_GLYPH_BBOX_UNSCALED  = 0,
+    FT_GLYPH_BBOX_SUBPIXELS = 0,
+    FT_GLYPH_BBOX_GRIDFIT   = 1,
+    FT_GLYPH_BBOX_TRUNCATE  = 2,
+    FT_GLYPH_BBOX_PIXELS    = 3
+
+  } FT_Glyph_BBox_Mode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_glyph_bbox_xxx                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    These constants are deprecated.  Use the corresponding             */
+  /*    @FT_Glyph_BBox_Mode values instead.                                */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*   ft_glyph_bbox_unscaled  :: See @FT_GLYPH_BBOX_UNSCALED.             */
+  /*   ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS.            */
+  /*   ft_glyph_bbox_gridfit   :: See @FT_GLYPH_BBOX_GRIDFIT.              */
+  /*   ft_glyph_bbox_truncate  :: See @FT_GLYPH_BBOX_TRUNCATE.             */
+  /*   ft_glyph_bbox_pixels    :: See @FT_GLYPH_BBOX_PIXELS.               */
+  /*                                                                       */
+#define ft_glyph_bbox_unscaled   FT_GLYPH_BBOX_UNSCALED
+#define ft_glyph_bbox_subpixels  FT_GLYPH_BBOX_SUBPIXELS
+#define ft_glyph_bbox_gridfit    FT_GLYPH_BBOX_GRIDFIT
+#define ft_glyph_bbox_truncate   FT_GLYPH_BBOX_TRUNCATE
+#define ft_glyph_bbox_pixels     FT_GLYPH_BBOX_PIXELS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Glyph_Get_CBox                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a glyph's `control box'.  The control box encloses all the  */
+  /*    outline's points, including Bézier control points.  Though it      */
+  /*    coincides with the exact bounding box for most glyphs, it can be   */
+  /*    slightly larger in some situations (like when rotating an outline  */
+  /*    which contains Bézier outside arcs).                               */
+  /*                                                                       */
+  /*    Computing the control box is very fast, while getting the bounding */
+  /*    box can take much more time as it needs to walk over all segments  */
+  /*    and arcs in the outline.  To get the latter, you can use the       */
+  /*    `ftbbox' component which is dedicated to this single task.         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    glyph :: A handle to the source glyph object.                      */
+  /*                                                                       */
+  /*    mode  :: The mode which indicates how to interpret the returned    */
+  /*             bounding box values.                                      */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acbox :: The glyph coordinate bounding box.  Coordinates are       */
+  /*             expressed in 1/64th of pixels if it is grid-fitted.       */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Coordinates are relative to the glyph origin, using the y~upwards  */
+  /*    convention.                                                        */
+  /*                                                                       */
+  /*    If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode'   */
+  /*    must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font        */
+  /*    units in 26.6 pixel format.  The value @FT_GLYPH_BBOX_SUBPIXELS    */
+  /*    is another name for this constant.                                 */
+  /*                                                                       */
+  /*    If the font is tricky and the glyph has been loaded with           */
+  /*    @FT_LOAD_NO_SCALE, the resulting CBox is meaningless.  To get      */
+  /*    reasonable values for the CBox it is necessary to load the glyph   */
+  /*    at a large ppem value (so that the hinting instructions can        */
+  /*    properly shift and scale the subglyphs), then extracting the CBox  */
+  /*    which can be eventually converted back to font units.              */
+  /*                                                                       */
+  /*    Note that the maximum coordinates are exclusive, which means that  */
+  /*    one can compute the width and height of the glyph image (be it in  */
+  /*    integer or 26.6 pixels) as:                                        */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      width  = bbox.xMax - bbox.xMin;                                  */
+  /*      height = bbox.yMax - bbox.yMin;                                  */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    Note also that for 26.6 coordinates, if `bbox_mode' is set to      */
+  /*    @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted,  */
+  /*    which corresponds to:                                              */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      bbox.xMin = FLOOR(bbox.xMin);                                    */
+  /*      bbox.yMin = FLOOR(bbox.yMin);                                    */
+  /*      bbox.xMax = CEILING(bbox.xMax);                                  */
+  /*      bbox.yMax = CEILING(bbox.yMax);                                  */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    To get the bbox in pixel coordinates, set `bbox_mode' to           */
+  /*    @FT_GLYPH_BBOX_TRUNCATE.                                           */
+  /*                                                                       */
+  /*    To get the bbox in grid-fitted pixel coordinates, set `bbox_mode'  */
+  /*    to @FT_GLYPH_BBOX_PIXELS.                                          */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Glyph_Get_CBox( FT_Glyph  glyph,
+                     FT_UInt   bbox_mode,
+                     FT_BBox  *acbox );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Glyph_To_Bitmap                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Convert a given glyph object to a bitmap glyph object.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    the_glyph   :: A pointer to a handle to the target glyph.          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    render_mode :: An enumeration that describes how the data is       */
+  /*                   rendered.                                           */
+  /*                                                                       */
+  /*    origin      :: A pointer to a vector used to translate the glyph   */
+  /*                   image before rendering.  Can be~0 (if no            */
+  /*                   translation).  The origin is expressed in           */
+  /*                   26.6 pixels.                                        */
+  /*                                                                       */
+  /*    destroy     :: A boolean that indicates that the original glyph    */
+  /*                   image should be destroyed by this function.  It is  */
+  /*                   never destroyed in case of error.                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function does nothing if the glyph format isn't scalable.     */
+  /*                                                                       */
+  /*    The glyph image is translated with the `origin' vector before      */
+  /*    rendering.                                                         */
+  /*                                                                       */
+  /*    The first parameter is a pointer to an @FT_Glyph handle, that will */
+  /*    be _replaced_ by this function (with newly allocated data).        */
+  /*    Typically, you would use (omitting error handling):                */
+  /*                                                                       */
+  /*                                                                       */
+  /*      {                                                                */
+  /*        FT_Glyph        glyph;                                         */
+  /*        FT_BitmapGlyph  glyph_bitmap;                                  */
+  /*                                                                       */
+  /*                                                                       */
+  /*        // load glyph                                                  */
+  /*        error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT );     */
+  /*                                                                       */
+  /*        // extract glyph image                                         */
+  /*        error = FT_Get_Glyph( face->glyph, &glyph );                   */
+  /*                                                                       */
+  /*        // convert to a bitmap (default render mode + destroying old)  */
+  /*        if ( glyph->format != FT_GLYPH_FORMAT_BITMAP )                 */
+  /*        {                                                              */
+  /*          error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL,   */
+  /*                                      0, 1 );                          */
+  /*          if ( error ) // `glyph' unchanged                            */
+  /*            ...                                                        */
+  /*        }                                                              */
+  /*                                                                       */
+  /*        // access bitmap content by typecasting                        */
+  /*        glyph_bitmap = (FT_BitmapGlyph)glyph;                          */
+  /*                                                                       */
+  /*        // do funny stuff with it, like blitting/drawing               */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        // discard glyph image (bitmap or not)                         */
+  /*        FT_Done_Glyph( glyph );                                        */
+  /*      }                                                                */
+  /*                                                                       */
+  /*                                                                       */
+  /*    Here another example, again without error handling:                */
+  /*                                                                       */
+  /*                                                                       */
+  /*      {                                                                */
+  /*        FT_Glyph  glyphs[MAX_GLYPHS]                                   */
+  /*                                                                       */
+  /*                                                                       */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */
+  /*          error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) ||       */
+  /*                  FT_Get_Glyph ( face->glyph, &glyph[idx] );           */
+  /*                                                                       */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */
+  /*        {                                                              */
+  /*          FT_Glyph  bitmap = glyphs[idx];                              */
+  /*                                                                       */
+  /*                                                                       */
+  /*          ...                                                          */
+  /*                                                                       */
+  /*          // after this call, `bitmap' no longer points into           */
+  /*          // the `glyphs' array (and the old value isn't destroyed)    */
+  /*          FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 );    */
+  /*                                                                       */
+  /*          ...                                                          */
+  /*                                                                       */
+  /*          FT_Done_Glyph( bitmap );                                     */
+  /*        }                                                              */
+  /*                                                                       */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */
+  /*          FT_Done_Glyph( glyphs[idx] );                                */
+  /*      }                                                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,
+                      FT_Render_Mode  render_mode,
+                      FT_Vector*      origin,
+                      FT_Bool         destroy );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Glyph                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy a given glyph.                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    glyph :: A handle to the target glyph object.                      */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Done_Glyph( FT_Glyph  glyph );
+
+  /* */
+
+
+  /* other helpful functions */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    computations                                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Matrix_Multiply                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Perform the matrix operation `b = a*b'.                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: A pointer to matrix `a'.                                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    b :: A pointer to matrix `b'.                                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The result is undefined if either `a' or `b' is zero.              */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Matrix_Multiply( const FT_Matrix*  a,
+                      FT_Matrix*        b );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Matrix_Invert                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Invert a 2x2 matrix.  Return an error if it can't be inverted.     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    matrix :: A pointer to the target matrix.  Remains untouched in    */
+  /*              case of error.                                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Matrix_Invert( FT_Matrix*  matrix );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGLYPH_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/include/thirdparties/freetype/freetype/ftgxval.h b/core/include/thirdparties/freetype/freetype/ftgxval.h
new file mode 100644
index 0000000..763652a
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftgxval.h
@@ -0,0 +1,358 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgxval.h                                                              */
+/*                                                                         */
+/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006 by                                          */
+/*  Masatake YAMATO, Redhat K.K,                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTGXVAL_H__
+#define __FTGXVAL_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    gx_validation                                                      */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    TrueTypeGX/AAT Validation                                          */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    An API to validate TrueTypeGX/AAT tables.                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of functions to validate     */
+  /*    some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd,  */
+  /*    trak, prop, lcar).                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                                                                       */
+  /* Warning: Use FT_VALIDATE_XXX to validate a table.                     */
+  /*          Following definitions are for gxvalid developers.            */
+  /*                                                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define FT_VALIDATE_feat_INDEX     0
+#define FT_VALIDATE_mort_INDEX     1
+#define FT_VALIDATE_morx_INDEX     2
+#define FT_VALIDATE_bsln_INDEX     3
+#define FT_VALIDATE_just_INDEX     4
+#define FT_VALIDATE_kern_INDEX     5
+#define FT_VALIDATE_opbd_INDEX     6
+#define FT_VALIDATE_trak_INDEX     7
+#define FT_VALIDATE_prop_INDEX     8
+#define FT_VALIDATE_lcar_INDEX     9
+#define FT_VALIDATE_GX_LAST_INDEX  FT_VALIDATE_lcar_INDEX
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_VALIDATE_GX_LENGTH
+   *
+   * @description:
+   *   The number of tables checked in this module.  Use it as a parameter
+   *   for the `table-length' argument of function @FT_TrueTypeGX_Validate.
+   */
+#define FT_VALIDATE_GX_LENGTH     (FT_VALIDATE_GX_LAST_INDEX + 1)
+
+  /* */
+
+  /* Up to 0x1000 is used by otvalid.
+     Ox2xxx is reserved for feature OT extension. */
+#define FT_VALIDATE_GX_START 0x4000
+#define FT_VALIDATE_GX_BITFIELD( tag )                  \
+  ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )
+
+
+ /**********************************************************************
+  *
+  * @enum:
+  *    FT_VALIDATE_GXXXX
+  *
+  * @description:
+  *    A list of bit-field constants used with @FT_TrueTypeGX_Validate to
+  *    indicate which TrueTypeGX/AAT Type tables should be validated.
+  *
+  * @values:
+  *    FT_VALIDATE_feat ::
+  *      Validate `feat' table.
+  *
+  *    FT_VALIDATE_mort ::
+  *      Validate `mort' table.
+  *
+  *    FT_VALIDATE_morx ::
+  *      Validate `morx' table.
+  *
+  *    FT_VALIDATE_bsln ::
+  *      Validate `bsln' table.
+  *
+  *    FT_VALIDATE_just ::
+  *      Validate `just' table.
+  *
+  *    FT_VALIDATE_kern ::
+  *      Validate `kern' table.
+  *
+  *    FT_VALIDATE_opbd ::
+  *      Validate `opbd' table.
+  *
+  *    FT_VALIDATE_trak ::
+  *      Validate `trak' table.
+  *
+  *    FT_VALIDATE_prop ::
+  *      Validate `prop' table.
+  *
+  *    FT_VALIDATE_lcar ::
+  *      Validate `lcar' table.
+  *
+  *    FT_VALIDATE_GX ::
+  *      Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern,
+  *      opbd, trak, prop and lcar).
+  *
+  */
+
+#define FT_VALIDATE_feat  FT_VALIDATE_GX_BITFIELD( feat )
+#define FT_VALIDATE_mort  FT_VALIDATE_GX_BITFIELD( mort )
+#define FT_VALIDATE_morx  FT_VALIDATE_GX_BITFIELD( morx )
+#define FT_VALIDATE_bsln  FT_VALIDATE_GX_BITFIELD( bsln )
+#define FT_VALIDATE_just  FT_VALIDATE_GX_BITFIELD( just )
+#define FT_VALIDATE_kern  FT_VALIDATE_GX_BITFIELD( kern )
+#define FT_VALIDATE_opbd  FT_VALIDATE_GX_BITFIELD( opbd )
+#define FT_VALIDATE_trak  FT_VALIDATE_GX_BITFIELD( trak )
+#define FT_VALIDATE_prop  FT_VALIDATE_GX_BITFIELD( prop )
+#define FT_VALIDATE_lcar  FT_VALIDATE_GX_BITFIELD( lcar )
+
+#define FT_VALIDATE_GX  ( FT_VALIDATE_feat | \
+                          FT_VALIDATE_mort | \
+                          FT_VALIDATE_morx | \
+                          FT_VALIDATE_bsln | \
+                          FT_VALIDATE_just | \
+                          FT_VALIDATE_kern | \
+                          FT_VALIDATE_opbd | \
+                          FT_VALIDATE_trak | \
+                          FT_VALIDATE_prop | \
+                          FT_VALIDATE_lcar )
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_TrueTypeGX_Validate
+  *
+  * @description:
+  *    Validate various TrueTypeGX tables to assure that all offsets and
+  *    indices are valid.  The idea is that a higher-level library which
+  *    actually does the text layout can access those tables without
+  *    error checking (which can be quite time consuming).
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    validation_flags ::
+  *       A bit field which specifies the tables to be validated.  See
+  *       @FT_VALIDATE_GXXXX for possible values.
+  *
+  *    table_length ::
+  *       The size of the `tables' array.  Normally, @FT_VALIDATE_GX_LENGTH
+  *       should be passed.
+  *
+  * @output:
+  *    tables ::
+  *       The array where all validated sfnt tables are stored.
+  *       The array itself must be allocated by a client.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   This function only works with TrueTypeGX fonts, returning an error
+  *   otherwise.
+  *
+  *   After use, the application should deallocate the buffers pointed to by
+  *   each `tables' element, by calling @FT_TrueTypeGX_Free.  A NULL value
+  *   indicates that the table either doesn't exist in the font, the
+  *   application hasn't asked for validation, or the validator doesn't have
+  *   the ability to validate the sfnt table.
+  */
+  FT_EXPORT( FT_Error )
+  FT_TrueTypeGX_Validate( FT_Face   face,
+                          FT_UInt   validation_flags,
+                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
+                          FT_UInt   table_length );
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_TrueTypeGX_Free
+  *
+  * @description:
+  *    Free the buffer allocated by TrueTypeGX validator.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    table ::
+  *       The pointer to the buffer allocated by
+  *       @FT_TrueTypeGX_Validate.
+  *
+  * @note:
+  *   This function must be used to free the buffer allocated by
+  *   @FT_TrueTypeGX_Validate only.
+  */
+  FT_EXPORT( void )
+  FT_TrueTypeGX_Free( FT_Face   face,
+                      FT_Bytes  table );
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @enum:
+  *    FT_VALIDATE_CKERNXXX
+  *
+  * @description:
+  *    A list of bit-field constants used with @FT_ClassicKern_Validate
+  *    to indicate the classic kern dialect or dialects.  If the selected
+  *    type doesn't fit, @FT_ClassicKern_Validate regards the table as
+  *    invalid.
+  *
+  * @values:
+  *    FT_VALIDATE_MS ::
+  *      Handle the `kern' table as a classic Microsoft kern table.
+  *
+  *    FT_VALIDATE_APPLE ::
+  *      Handle the `kern' table as a classic Apple kern table.
+  *
+  *    FT_VALIDATE_CKERN ::
+  *      Handle the `kern' as either classic Apple or Microsoft kern table.
+  */
+#define FT_VALIDATE_MS     ( FT_VALIDATE_GX_START << 0 )
+#define FT_VALIDATE_APPLE  ( FT_VALIDATE_GX_START << 1 )
+
+#define FT_VALIDATE_CKERN  ( FT_VALIDATE_MS | FT_VALIDATE_APPLE )
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_ClassicKern_Validate
+  *
+  * @description:
+  *    Validate classic (16-bit format) kern table to assure that the offsets
+  *    and indices are valid.  The idea is that a higher-level library which
+  *    actually does the text layout can access those tables without error
+  *    checking (which can be quite time consuming).
+  *
+  *    The `kern' table validator in @FT_TrueTypeGX_Validate deals with both
+  *    the new 32-bit format and the classic 16-bit format, while
+  *    FT_ClassicKern_Validate only supports the classic 16-bit format.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    validation_flags ::
+  *       A bit field which specifies the dialect to be validated.  See
+  *       @FT_VALIDATE_CKERNXXX for possible values.
+  *
+  * @output:
+  *    ckern_table ::
+  *       A pointer to the kern table.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   After use, the application should deallocate the buffers pointed to by
+  *   `ckern_table', by calling @FT_ClassicKern_Free.  A NULL value
+  *   indicates that the table doesn't exist in the font.
+  */
+  FT_EXPORT( FT_Error )
+  FT_ClassicKern_Validate( FT_Face    face,
+                           FT_UInt    validation_flags,
+                           FT_Bytes  *ckern_table );
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_ClassicKern_Free
+  *
+  * @description:
+  *    Free the buffer allocated by classic Kern validator.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    table ::
+  *       The pointer to the buffer that is allocated by
+  *       @FT_ClassicKern_Validate.
+  *
+  * @note:
+  *   This function must be used to free the buffer allocated by
+  *   @FT_ClassicKern_Validate only.
+  */
+  FT_EXPORT( void )
+  FT_ClassicKern_Free( FT_Face   face,
+                       FT_Bytes  table );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGXVAL_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftgzip.h b/core/include/thirdparties/freetype/freetype/ftgzip.h
new file mode 100644
index 0000000..87155a4
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftgzip.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgzip.h                                                               */
+/*                                                                         */
+/*    Gzip-compressed stream support.                                      */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2006 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTGZIP_H__
+#define __FTGZIP_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    gzip                                                               */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    GZIP Streams                                                       */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Using gzip-compressed font files.                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of Gzip-specific functions.  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+ /************************************************************************
+  *
+  * @function:
+  *   FT_Stream_OpenGzip
+  *
+  * @description:
+  *   Open a new stream to parse gzip-compressed font files.  This is
+  *   mainly used to support the compressed `*.pcf.gz' fonts that come
+  *   with XFree86.
+  *
+  * @input:
+  *   stream ::
+  *     The target embedding stream.
+  *
+  *   source ::
+  *     The source stream.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   The source stream must be opened _before_ calling this function.
+  *
+  *   Calling the internal function `FT_Stream_Close' on the new stream will
+  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream
+  *   objects will be released to the heap.
+  *
+  *   The stream implementation is very basic and resets the decompression
+  *   process each time seeking backwards is needed within the stream.
+  *
+  *   In certain builds of the library, gzip compression recognition is
+  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.
+  *   This means that if no font driver is capable of handling the raw
+  *   compressed file, the library will try to open a gzipped stream from
+  *   it and re-open the face with it.
+  *
+  *   This function may return `FT_Err_Unimplemented_Feature' if your build
+  *   of FreeType was not compiled with zlib support.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Stream_OpenGzip( FT_Stream  stream,
+                      FT_Stream  source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGZIP_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftimage.h b/core/include/thirdparties/freetype/freetype/ftimage.h
new file mode 100644
index 0000000..401cb38
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftimage.h
@@ -0,0 +1,1322 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftimage.h                                                              */
+/*                                                                         */
+/*    FreeType glyph image formats and default raster interface            */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 1996-2010, 2013 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Note: A `raster' is simply a scan-line converter, used to render      */
+  /*       FT_Outlines into FT_Bitmaps.                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTIMAGE_H__
+#define __FTIMAGE_H__
+
+
+  /* _STANDALONE_ is from ftgrays.c */
+#ifndef _STANDALONE_
+#include "../ft2build.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    basic_types                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Pos                                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The type FT_Pos is used to store vectorial coordinates.  Depending */
+  /*    on the context, these can represent distances in integer font      */
+  /*    units, or 16.16, or 26.6 fixed-point pixel coordinates.            */
+  /*                                                                       */
+  typedef signed long  FT_Pos;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Vector                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to store a 2D vector; coordinates are of   */
+  /*    the FT_Pos type.                                                   */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    x :: The horizontal coordinate.                                    */
+  /*    y :: The vertical coordinate.                                      */
+  /*                                                                       */
+  typedef struct  FT_Vector_
+  {
+    FT_Pos  x;
+    FT_Pos  y;
+
+  } FT_Vector;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_BBox                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold an outline's bounding box, i.e., the      */
+  /*    coordinates of its extrema in the horizontal and vertical          */
+  /*    directions.                                                        */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    xMin :: The horizontal minimum (left-most).                        */
+  /*                                                                       */
+  /*    yMin :: The vertical minimum (bottom-most).                        */
+  /*                                                                       */
+  /*    xMax :: The horizontal maximum (right-most).                       */
+  /*                                                                       */
+  /*    yMax :: The vertical maximum (top-most).                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The bounding box is specified with the coordinates of the lower    */
+  /*    left and the upper right corner.  In PostScript, those values are  */
+  /*    often called (llx,lly) and (urx,ury), respectively.                */
+  /*                                                                       */
+  /*    If `yMin' is negative, this value gives the glyph's descender.     */
+  /*    Otherwise, the glyph doesn't descend below the baseline.           */
+  /*    Similarly, if `ymax' is positive, this value gives the glyph's     */
+  /*    ascender.                                                          */
+  /*                                                                       */
+  /*    `xMin' gives the horizontal distance from the glyph's origin to    */
+  /*    the left edge of the glyph's bounding box.  If `xMin' is negative, */
+  /*    the glyph extends to the left of the origin.                       */
+  /*                                                                       */
+  typedef struct  FT_BBox_
+  {
+    FT_Pos  xMin, yMin;
+    FT_Pos  xMax, yMax;
+
+  } FT_BBox;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Pixel_Mode                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration type used to describe the format of pixels in a     */
+  /*    given bitmap.  Note that additional formats may be added in the    */
+  /*    future.                                                            */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_PIXEL_MODE_NONE ::                                              */
+  /*      Value~0 is reserved.                                             */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_MONO ::                                              */
+  /*      A monochrome bitmap, using 1~bit per pixel.  Note that pixels    */
+  /*      are stored in most-significant order (MSB), which means that     */
+  /*      the left-most pixel in a byte has value 128.                     */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_GRAY ::                                              */
+  /*      An 8-bit bitmap, generally used to represent anti-aliased glyph  */
+  /*      images.  Each pixel is stored in one byte.  Note that the number */
+  /*      of `gray' levels is stored in the `num_grays' field of the       */
+  /*      @FT_Bitmap structure (it generally is 256).                      */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_GRAY2 ::                                             */
+  /*      A 2-bit per pixel bitmap, used to represent embedded             */
+  /*      anti-aliased bitmaps in font files according to the OpenType     */
+  /*      specification.  We haven't found a single font using this        */
+  /*      format, however.                                                 */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_GRAY4 ::                                             */
+  /*      A 4-bit per pixel bitmap, representing embedded anti-aliased     */
+  /*      bitmaps in font files according to the OpenType specification.   */
+  /*      We haven't found a single font using this format, however.       */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_LCD ::                                               */
+  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */
+  /*      used for display on LCD displays; the bitmap is three times      */
+  /*      wider than the original glyph image.  See also                   */
+  /*      @FT_RENDER_MODE_LCD.                                             */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_LCD_V ::                                             */
+  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */
+  /*      used for display on rotated LCD displays; the bitmap is three    */
+  /*      times taller than the original glyph image.  See also            */
+  /*      @FT_RENDER_MODE_LCD_V.                                           */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_BGRA ::                                              */
+  /*      An image with four 8-bit channels per pixel, representing a      */
+  /*      color image (such as emoticons) with alpha channel.  For each    */
+  /*      pixel, the format is BGRA, which means, the blue channel comes   */
+  /*      first in memory.  The color channels are pre-multiplied and in   */
+  /*      the sRGB colorspace.  For example, full red at half-translucent  */
+  /*      opacity will be represented as `00,00,80,80', not `00,00,FF,80'. */
+  /*      See also @FT_LOAD_COLOR.                                         */
+  /*                                                                       */
+  typedef enum  FT_Pixel_Mode_
+  {
+    FT_PIXEL_MODE_NONE = 0,
+    FT_PIXEL_MODE_MONO,
+    FT_PIXEL_MODE_GRAY,
+    FT_PIXEL_MODE_GRAY2,
+    FT_PIXEL_MODE_GRAY4,
+    FT_PIXEL_MODE_LCD,
+    FT_PIXEL_MODE_LCD_V,
+    FT_PIXEL_MODE_BGRA,
+
+    FT_PIXEL_MODE_MAX      /* do not remove */
+
+  } FT_Pixel_Mode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_pixel_mode_xxx                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of deprecated constants.  Use the corresponding             */
+  /*    @FT_Pixel_Mode values instead.                                     */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    ft_pixel_mode_none  :: See @FT_PIXEL_MODE_NONE.                    */
+  /*    ft_pixel_mode_mono  :: See @FT_PIXEL_MODE_MONO.                    */
+  /*    ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY.                    */
+  /*    ft_pixel_mode_pal2  :: See @FT_PIXEL_MODE_GRAY2.                   */
+  /*    ft_pixel_mode_pal4  :: See @FT_PIXEL_MODE_GRAY4.                   */
+  /*                                                                       */
+#define ft_pixel_mode_none   FT_PIXEL_MODE_NONE
+#define ft_pixel_mode_mono   FT_PIXEL_MODE_MONO
+#define ft_pixel_mode_grays  FT_PIXEL_MODE_GRAY
+#define ft_pixel_mode_pal2   FT_PIXEL_MODE_GRAY2
+#define ft_pixel_mode_pal4   FT_PIXEL_MODE_GRAY4
+
+ /* */
+
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Palette_Mode                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT!                           */
+  /*                                                                       */
+  /*    An enumeration type to describe the format of a bitmap palette,    */
+  /*    used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8.               */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    ft_palette_mode_rgb  :: The palette is an array of 3-byte RGB      */
+  /*                            records.                                   */
+  /*                                                                       */
+  /*    ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA     */
+  /*                            records.                                   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by       */
+  /*    FreeType, these types are not handled by the library itself.       */
+  /*                                                                       */
+  typedef enum  FT_Palette_Mode_
+  {
+    ft_palette_mode_rgb = 0,
+    ft_palette_mode_rgba,
+
+    ft_palette_mode_max   /* do not remove */
+
+  } FT_Palette_Mode;
+
+  /* */
+
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Bitmap                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to describe a bitmap or pixmap to the raster.     */
+  /*    Note that we now manage pixmaps of various depths through the      */
+  /*    `pixel_mode' field.                                                */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    rows         :: The number of bitmap rows.                         */
+  /*                                                                       */
+  /*    width        :: The number of pixels in bitmap row.                */
+  /*                                                                       */
+  /*    pitch        :: The pitch's absolute value is the number of bytes  */
+  /*                    taken by one bitmap row, including padding.        */
+  /*                    However, the pitch is positive when the bitmap has */
+  /*                    a `down' flow, and negative when it has an `up'    */
+  /*                    flow.  In all cases, the pitch is an offset to add */
+  /*                    to a bitmap pointer in order to go down one row.   */
+  /*                                                                       */
+  /*                    Note that `padding' means the alignment of a       */
+  /*                    bitmap to a byte border, and FreeType functions    */
+  /*                    normally align to the smallest possible integer    */
+  /*                    value.                                             */
+  /*                                                                       */
+  /*                    For the B/W rasterizer, `pitch' is always an even  */
+  /*                    number.                                            */
+  /*                                                                       */
+  /*                    To change the pitch of a bitmap (say, to make it a */
+  /*                    multiple of 4), use @FT_Bitmap_Convert.            */
+  /*                    Alternatively, you might use callback functions to */
+  /*                    directly render to the application's surface; see  */
+  /*                    the file `example2.cpp' in the tutorial for a      */
+  /*                    demonstration.                                     */
+  /*                                                                       */
+  /*    buffer       :: A typeless pointer to the bitmap buffer.  This     */
+  /*                    value should be aligned on 32-bit boundaries in    */
+  /*                    most cases.                                        */
+  /*                                                                       */
+  /*    num_grays    :: This field is only used with                       */
+  /*                    @FT_PIXEL_MODE_GRAY; it gives the number of gray   */
+  /*                    levels used in the bitmap.                         */
+  /*                                                                       */
+  /*    pixel_mode   :: The pixel mode, i.e., how pixel bits are stored.   */
+  /*                    See @FT_Pixel_Mode for possible values.            */
+  /*                                                                       */
+  /*    palette_mode :: This field is intended for paletted pixel modes;   */
+  /*                    it indicates how the palette is stored.  Not       */
+  /*                    used currently.                                    */
+  /*                                                                       */
+  /*    palette      :: A typeless pointer to the bitmap palette; this     */
+  /*                    field is intended for paletted pixel modes.  Not   */
+  /*                    used currently.                                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*   For now, the only pixel modes supported by FreeType are mono and    */
+  /*   grays.  However, drivers might be added in the future to support    */
+  /*   more `colorful' options.                                            */
+  /*                                                                       */
+  typedef struct  FT_Bitmap_
+  {
+    int             rows;
+    int             width;
+    int             pitch;
+    unsigned char*  buffer;
+    short           num_grays;
+    char            pixel_mode;
+    char            palette_mode;
+    void*           palette;
+
+  } FT_Bitmap;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    outline_processing                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Outline                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure is used to describe an outline to the scan-line     */
+  /*    converter.                                                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    n_contours :: The number of contours in the outline.               */
+  /*                                                                       */
+  /*    n_points   :: The number of points in the outline.                 */
+  /*                                                                       */
+  /*    points     :: A pointer to an array of `n_points' @FT_Vector       */
+  /*                  elements, giving the outline's point coordinates.    */
+  /*                                                                       */
+  /*    tags       :: A pointer to an array of `n_points' chars, giving    */
+  /*                  each outline point's type.                           */
+  /*                                                                       */
+  /*                  If bit~0 is unset, the point is `off' the curve,     */
+  /*                  i.e., a Bézier control point, while it is `on' if    */
+  /*                  set.                                                 */
+  /*                                                                       */
+  /*                  Bit~1 is meaningful for `off' points only.  If set,  */
+  /*                  it indicates a third-order Bézier arc control point; */
+  /*                  and a second-order control point if unset.           */
+  /*                                                                       */
+  /*                  If bit~2 is set, bits 5-7 contain the drop-out mode  */
+  /*                  (as defined in the OpenType specification; the value */
+  /*                  is the same as the argument to the SCANMODE          */
+  /*                  instruction).                                        */
+  /*                                                                       */
+  /*                  Bits 3 and~4 are reserved for internal purposes.     */
+  /*                                                                       */
+  /*    contours   :: An array of `n_contours' shorts, giving the end      */
+  /*                  point of each contour within the outline.  For       */
+  /*                  example, the first contour is defined by the points  */
+  /*                  `0' to `contours[0]', the second one is defined by   */
+  /*                  the points `contours[0]+1' to `contours[1]', etc.    */
+  /*                                                                       */
+  /*    flags      :: A set of bit flags used to characterize the outline  */
+  /*                  and give hints to the scan-converter and hinter on   */
+  /*                  how to convert/grid-fit it.  See @FT_OUTLINE_FLAGS.  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The B/W rasterizer only checks bit~2 in the `tags' array for the   */
+  /*    first point of each contour.  The drop-out mode as given with      */
+  /*    @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and       */
+  /*    @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden.           */
+  /*                                                                       */
+  typedef struct  FT_Outline_
+  {
+    short       n_contours;      /* number of contours in glyph        */
+    short       n_points;        /* number of points in the glyph      */
+
+    FT_Vector*  points;          /* the outline's points               */
+    char*       tags;            /* the points flags                   */
+    short*      contours;        /* the contour end points             */
+
+    int         flags;           /* outline masks                      */
+
+  } FT_Outline;
+
+  /* Following limits must be consistent with */
+  /* FT_Outline.{n_contours,n_points}         */
+#define FT_OUTLINE_CONTOURS_MAX  SHRT_MAX
+#define FT_OUTLINE_POINTS_MAX    SHRT_MAX
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_OUTLINE_FLAGS                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit-field constants use for the flags in an outline's    */
+  /*    `flags' field.                                                     */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_OUTLINE_NONE ::                                                 */
+  /*      Value~0 is reserved.                                             */
+  /*                                                                       */
+  /*    FT_OUTLINE_OWNER ::                                                */
+  /*      If set, this flag indicates that the outline's field arrays      */
+  /*      (i.e., `points', `flags', and `contours') are `owned' by the     */
+  /*      outline object, and should thus be freed when it is destroyed.   */
+  /*                                                                       */
+  /*    FT_OUTLINE_EVEN_ODD_FILL ::                                        */
+  /*      By default, outlines are filled using the non-zero winding rule. */
+  /*      If set to 1, the outline will be filled using the even-odd fill  */
+  /*      rule (only works with the smooth rasterizer).                    */
+  /*                                                                       */
+  /*    FT_OUTLINE_REVERSE_FILL ::                                         */
+  /*      By default, outside contours of an outline are oriented in       */
+  /*      clock-wise direction, as defined in the TrueType specification.  */
+  /*      This flag is set if the outline uses the opposite direction      */
+  /*      (typically for Type~1 fonts).  This flag is ignored by the scan  */
+  /*      converter.                                                       */
+  /*                                                                       */
+  /*    FT_OUTLINE_IGNORE_DROPOUTS ::                                      */
+  /*      By default, the scan converter will try to detect drop-outs in   */
+  /*      an outline and correct the glyph bitmap to ensure consistent     */
+  /*      shape continuity.  If set, this flag hints the scan-line         */
+  /*      converter to ignore such cases.  See below for more information. */
+  /*                                                                       */
+  /*    FT_OUTLINE_SMART_DROPOUTS ::                                       */
+  /*      Select smart dropout control.  If unset, use simple dropout      */
+  /*      control.  Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See    */
+  /*      below for more information.                                      */
+  /*                                                                       */
+  /*    FT_OUTLINE_INCLUDE_STUBS ::                                        */
+  /*      If set, turn pixels on for `stubs', otherwise exclude them.      */
+  /*      Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See below for    */
+  /*      more information.                                                */
+  /*                                                                       */
+  /*    FT_OUTLINE_HIGH_PRECISION ::                                       */
+  /*      This flag indicates that the scan-line converter should try to   */
+  /*      convert this outline to bitmaps with the highest possible        */
+  /*      quality.  It is typically set for small character sizes.  Note   */
+  /*      that this is only a hint that might be completely ignored by a   */
+  /*      given scan-converter.                                            */
+  /*                                                                       */
+  /*    FT_OUTLINE_SINGLE_PASS ::                                          */
+  /*      This flag is set to force a given scan-converter to only use a   */
+  /*      single pass over the outline to render a bitmap glyph image.     */
+  /*      Normally, it is set for very large character sizes.  It is only  */
+  /*      a hint that might be completely ignored by a given               */
+  /*      scan-converter.                                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */
+  /*    and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth            */
+  /*    rasterizer.                                                        */
+  /*                                                                       */
+  /*    There exists a second mechanism to pass the drop-out mode to the   */
+  /*    B/W rasterizer; see the `tags' field in @FT_Outline.               */
+  /*                                                                       */
+  /*    Please refer to the description of the `SCANTYPE' instruction in   */
+  /*    the OpenType specification (in file `ttinst1.doc') how simple      */
+  /*    drop-outs, smart drop-outs, and stubs are defined.                 */
+  /*                                                                       */
+#define FT_OUTLINE_NONE             0x0
+#define FT_OUTLINE_OWNER            0x1
+#define FT_OUTLINE_EVEN_ODD_FILL    0x2
+#define FT_OUTLINE_REVERSE_FILL     0x4
+#define FT_OUTLINE_IGNORE_DROPOUTS  0x8
+#define FT_OUTLINE_SMART_DROPOUTS   0x10
+#define FT_OUTLINE_INCLUDE_STUBS    0x20
+
+#define FT_OUTLINE_HIGH_PRECISION   0x100
+#define FT_OUTLINE_SINGLE_PASS      0x200
+
+
+ /*************************************************************************
+  *
+  * @enum:
+  *   ft_outline_flags
+  *
+  * @description:
+  *   These constants are deprecated.  Please use the corresponding
+  *   @FT_OUTLINE_FLAGS values.
+  *
+  * @values:
+  *   ft_outline_none            :: See @FT_OUTLINE_NONE.
+  *   ft_outline_owner           :: See @FT_OUTLINE_OWNER.
+  *   ft_outline_even_odd_fill   :: See @FT_OUTLINE_EVEN_ODD_FILL.
+  *   ft_outline_reverse_fill    :: See @FT_OUTLINE_REVERSE_FILL.
+  *   ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS.
+  *   ft_outline_high_precision  :: See @FT_OUTLINE_HIGH_PRECISION.
+  *   ft_outline_single_pass     :: See @FT_OUTLINE_SINGLE_PASS.
+  */
+#define ft_outline_none             FT_OUTLINE_NONE
+#define ft_outline_owner            FT_OUTLINE_OWNER
+#define ft_outline_even_odd_fill    FT_OUTLINE_EVEN_ODD_FILL
+#define ft_outline_reverse_fill     FT_OUTLINE_REVERSE_FILL
+#define ft_outline_ignore_dropouts  FT_OUTLINE_IGNORE_DROPOUTS
+#define ft_outline_high_precision   FT_OUTLINE_HIGH_PRECISION
+#define ft_outline_single_pass      FT_OUTLINE_SINGLE_PASS
+
+  /* */
+
+#define FT_CURVE_TAG( flag )  ( flag & 3 )
+
+#define FT_CURVE_TAG_ON            1
+#define FT_CURVE_TAG_CONIC         0
+#define FT_CURVE_TAG_CUBIC         2
+
+#define FT_CURVE_TAG_HAS_SCANMODE  4
+
+#define FT_CURVE_TAG_TOUCH_X       8  /* reserved for the TrueType hinter */
+#define FT_CURVE_TAG_TOUCH_Y      16  /* reserved for the TrueType hinter */
+
+#define FT_CURVE_TAG_TOUCH_BOTH    ( FT_CURVE_TAG_TOUCH_X | \
+                                     FT_CURVE_TAG_TOUCH_Y )
+
+#define FT_Curve_Tag_On       FT_CURVE_TAG_ON
+#define FT_Curve_Tag_Conic    FT_CURVE_TAG_CONIC
+#define FT_Curve_Tag_Cubic    FT_CURVE_TAG_CUBIC
+#define FT_Curve_Tag_Touch_X  FT_CURVE_TAG_TOUCH_X
+#define FT_Curve_Tag_Touch_Y  FT_CURVE_TAG_TOUCH_Y
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Outline_MoveToFunc                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function pointer type used to describe the signature of a `move  */
+  /*    to' function during outline walking/decomposition.                 */
+  /*                                                                       */
+  /*    A `move to' is emitted to start a new contour in an outline.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    to   :: A pointer to the target point of the `move to'.            */
+  /*                                                                       */
+  /*    user :: A typeless pointer which is passed from the caller of the  */
+  /*            decomposition function.                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  typedef int
+  (*FT_Outline_MoveToFunc)( const FT_Vector*  to,
+                            void*             user );
+
+#define FT_Outline_MoveTo_Func  FT_Outline_MoveToFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Outline_LineToFunc                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function pointer type used to describe the signature of a `line  */
+  /*    to' function during outline walking/decomposition.                 */
+  /*                                                                       */
+  /*    A `line to' is emitted to indicate a segment in the outline.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    to   :: A pointer to the target point of the `line to'.            */
+  /*                                                                       */
+  /*    user :: A typeless pointer which is passed from the caller of the  */
+  /*            decomposition function.                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  typedef int
+  (*FT_Outline_LineToFunc)( const FT_Vector*  to,
+                            void*             user );
+
+#define FT_Outline_LineTo_Func  FT_Outline_LineToFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Outline_ConicToFunc                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function pointer type used to describe the signature of a `conic */
+  /*    to' function during outline walking or decomposition.              */
+  /*                                                                       */
+  /*    A `conic to' is emitted to indicate a second-order Bézier arc in   */
+  /*    the outline.                                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    control :: An intermediate control point between the last position */
+  /*               and the new target in `to'.                             */
+  /*                                                                       */
+  /*    to      :: A pointer to the target end point of the conic arc.     */
+  /*                                                                       */
+  /*    user    :: A typeless pointer which is passed from the caller of   */
+  /*               the decomposition function.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  typedef int
+  (*FT_Outline_ConicToFunc)( const FT_Vector*  control,
+                             const FT_Vector*  to,
+                             void*             user );
+
+#define FT_Outline_ConicTo_Func  FT_Outline_ConicToFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Outline_CubicToFunc                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function pointer type used to describe the signature of a `cubic */
+  /*    to' function during outline walking or decomposition.              */
+  /*                                                                       */
+  /*    A `cubic to' is emitted to indicate a third-order Bézier arc.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    control1 :: A pointer to the first Bézier control point.           */
+  /*                                                                       */
+  /*    control2 :: A pointer to the second Bézier control point.          */
+  /*                                                                       */
+  /*    to       :: A pointer to the target end point.                     */
+  /*                                                                       */
+  /*    user     :: A typeless pointer which is passed from the caller of  */
+  /*                the decomposition function.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  typedef int
+  (*FT_Outline_CubicToFunc)( const FT_Vector*  control1,
+                             const FT_Vector*  control2,
+                             const FT_Vector*  to,
+                             void*             user );
+
+#define FT_Outline_CubicTo_Func  FT_Outline_CubicToFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Outline_Funcs                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure to hold various function pointers used during outline  */
+  /*    decomposition in order to emit segments, conic, and cubic Béziers. */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    move_to  :: The `move to' emitter.                                 */
+  /*                                                                       */
+  /*    line_to  :: The segment emitter.                                   */
+  /*                                                                       */
+  /*    conic_to :: The second-order Bézier arc emitter.                   */
+  /*                                                                       */
+  /*    cubic_to :: The third-order Bézier arc emitter.                    */
+  /*                                                                       */
+  /*    shift    :: The shift that is applied to coordinates before they   */
+  /*                are sent to the emitter.                               */
+  /*                                                                       */
+  /*    delta    :: The delta that is applied to coordinates before they   */
+  /*                are sent to the emitter, but after the shift.          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The point coordinates sent to the emitters are the transformed     */
+  /*    version of the original coordinates (this is important for high    */
+  /*    accuracy during scan-conversion).  The transformation is simple:   */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      x' = (x << shift) - delta                                        */
+  /*      y' = (x << shift) - delta                                        */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    Set the values of `shift' and `delta' to~0 to get the original     */
+  /*    point coordinates.                                                 */
+  /*                                                                       */
+  typedef struct  FT_Outline_Funcs_
+  {
+    FT_Outline_MoveToFunc   move_to;
+    FT_Outline_LineToFunc   line_to;
+    FT_Outline_ConicToFunc  conic_to;
+    FT_Outline_CubicToFunc  cubic_to;
+
+    int                     shift;
+    FT_Pos                  delta;
+
+  } FT_Outline_Funcs;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    basic_types                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_IMAGE_TAG                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro converts four-letter tags to an unsigned long type.     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */
+  /*    should redefine this macro in case of problems to something like   */
+  /*    this:                                                              */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  value         */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    to get a simple enumeration without assigning special numbers.     */
+  /*                                                                       */
+#ifndef FT_IMAGE_TAG
+#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  \
+          value = ( ( (unsigned long)_x1 << 24 ) | \
+                    ( (unsigned long)_x2 << 16 ) | \
+                    ( (unsigned long)_x3 << 8  ) | \
+                      (unsigned long)_x4         )
+#endif /* FT_IMAGE_TAG */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Glyph_Format                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration type used to describe the format of a given glyph   */
+  /*    image.  Note that this version of FreeType only supports two image */
+  /*    formats, even though future font drivers will be able to register  */
+  /*    their own format.                                                  */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_GLYPH_FORMAT_NONE ::                                            */
+  /*      The value~0 is reserved.                                         */
+  /*                                                                       */
+  /*    FT_GLYPH_FORMAT_COMPOSITE ::                                       */
+  /*      The glyph image is a composite of several other images.  This    */
+  /*      format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to   */
+  /*      report compound glyphs (like accented characters).               */
+  /*                                                                       */
+  /*    FT_GLYPH_FORMAT_BITMAP ::                                          */
+  /*      The glyph image is a bitmap, and can be described as an          */
+  /*      @FT_Bitmap.  You generally need to access the `bitmap' field of  */
+  /*      the @FT_GlyphSlotRec structure to read it.                       */
+  /*                                                                       */
+  /*    FT_GLYPH_FORMAT_OUTLINE ::                                         */
+  /*      The glyph image is a vectorial outline made of line segments     */
+  /*      and Bézier arcs; it can be described as an @FT_Outline; you      */
+  /*      generally want to access the `outline' field of the              */
+  /*      @FT_GlyphSlotRec structure to read it.                           */
+  /*                                                                       */
+  /*    FT_GLYPH_FORMAT_PLOTTER ::                                         */
+  /*      The glyph image is a vectorial path with no inside and outside   */
+  /*      contours.  Some Type~1 fonts, like those in the Hershey family,  */
+  /*      contain glyphs in this format.  These are described as           */
+  /*      @FT_Outline, but FreeType isn't currently capable of rendering   */
+  /*      them correctly.                                                  */
+  /*                                                                       */
+  typedef enum  FT_Glyph_Format_
+  {
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ),
+
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ),
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP,    'b', 'i', 't', 's' ),
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE,   'o', 'u', 't', 'l' ),
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER,   'p', 'l', 'o', 't' )
+
+  } FT_Glyph_Format;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_glyph_format_xxx                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of deprecated constants.  Use the corresponding             */
+  /*    @FT_Glyph_Format values instead.                                   */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    ft_glyph_format_none      :: See @FT_GLYPH_FORMAT_NONE.            */
+  /*    ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE.       */
+  /*    ft_glyph_format_bitmap    :: See @FT_GLYPH_FORMAT_BITMAP.          */
+  /*    ft_glyph_format_outline   :: See @FT_GLYPH_FORMAT_OUTLINE.         */
+  /*    ft_glyph_format_plotter   :: See @FT_GLYPH_FORMAT_PLOTTER.         */
+  /*                                                                       */
+#define ft_glyph_format_none       FT_GLYPH_FORMAT_NONE
+#define ft_glyph_format_composite  FT_GLYPH_FORMAT_COMPOSITE
+#define ft_glyph_format_bitmap     FT_GLYPH_FORMAT_BITMAP
+#define ft_glyph_format_outline    FT_GLYPH_FORMAT_OUTLINE
+#define ft_glyph_format_plotter    FT_GLYPH_FORMAT_PLOTTER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****            R A S T E R   D E F I N I T I O N S                *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A raster is a scan converter, in charge of rendering an outline into  */
+  /* a a bitmap.  This section contains the public API for rasters.        */
+  /*                                                                       */
+  /* Note that in FreeType 2, all rasters are now encapsulated within      */
+  /* specific modules called `renderers'.  See `freetype/ftrender.h' for   */
+  /* more details on renderers.                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    raster                                                             */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Scanline Converter                                                 */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    How vectorial outlines are converted into bitmaps and pixmaps.     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains technical definitions.                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Raster                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle (pointer) to a raster object.  Each object can be used    */
+  /*    independently to convert an outline into a bitmap or pixmap.       */
+  /*                                                                       */
+  typedef struct FT_RasterRec_*  FT_Raster;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Span                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a single span of gray (or black) pixels  */
+  /*    when rendering a monochrome or anti-aliased bitmap.                */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    x        :: The span's horizontal start position.                  */
+  /*                                                                       */
+  /*    len      :: The span's length in pixels.                           */
+  /*                                                                       */
+  /*    coverage :: The span color/coverage, ranging from 0 (background)   */
+  /*                to 255 (foreground).  Only used for anti-aliased       */
+  /*                rendering.                                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This structure is used by the span drawing callback type named     */
+  /*    @FT_SpanFunc which takes the y~coordinate of the span as a         */
+  /*    a parameter.                                                       */
+  /*                                                                       */
+  /*    The coverage value is always between 0 and 255.  If you want less  */
+  /*    gray values, the callback function has to reduce them.             */
+  /*                                                                       */
+  typedef struct  FT_Span_
+  {
+    short           x;
+    unsigned short  len;
+    unsigned char   coverage;
+
+  } FT_Span;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_SpanFunc                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used as a call-back by the anti-aliased renderer in     */
+  /*    order to let client applications draw themselves the gray pixel    */
+  /*    spans on each scan line.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    y     :: The scanline's y~coordinate.                              */
+  /*                                                                       */
+  /*    count :: The number of spans to draw on this scanline.             */
+  /*                                                                       */
+  /*    spans :: A table of `count' spans to draw on the scanline.         */
+  /*                                                                       */
+  /*    user  :: User-supplied data that is passed to the callback.        */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This callback allows client applications to directly render the    */
+  /*    gray spans of the anti-aliased bitmap to any kind of surfaces.     */
+  /*                                                                       */
+  /*    This can be used to write anti-aliased outlines directly to a      */
+  /*    given background bitmap, and even perform translucency.            */
+  /*                                                                       */
+  /*    Note that the `count' field cannot be greater than a fixed value   */
+  /*    defined by the `FT_MAX_GRAY_SPANS' configuration macro in          */
+  /*    `ftoption.h'.  By default, this value is set to~32, which means    */
+  /*    that if there are more than 32~spans on a given scanline, the      */
+  /*    callback is called several times with the same `y' parameter in    */
+  /*    order to draw all callbacks.                                       */
+  /*                                                                       */
+  /*    Otherwise, the callback is only called once per scan-line, and     */
+  /*    only for those scanlines that do have `gray' pixels on them.       */
+  /*                                                                       */
+  typedef void
+  (*FT_SpanFunc)( int             y,
+                  int             count,
+                  const FT_Span*  spans,
+                  void*           user );
+
+#define FT_Raster_Span_Func  FT_SpanFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_BitTest_Func                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT.                           */
+  /*                                                                       */
+  /*    A function used as a call-back by the monochrome scan-converter    */
+  /*    to test whether a given target pixel is already set to the drawing */
+  /*    `color'.  These tests are crucial to implement drop-out control    */
+  /*    per-se the TrueType spec.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    y     :: The pixel's y~coordinate.                                 */
+  /*                                                                       */
+  /*    x     :: The pixel's x~coordinate.                                 */
+  /*                                                                       */
+  /*    user  :: User-supplied data that is passed to the callback.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   1~if the pixel is `set', 0~otherwise.                               */
+  /*                                                                       */
+  typedef int
+  (*FT_Raster_BitTest_Func)( int    y,
+                             int    x,
+                             void*  user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_BitSet_Func                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT.                           */
+  /*                                                                       */
+  /*    A function used as a call-back by the monochrome scan-converter    */
+  /*    to set an individual target pixel.  This is crucial to implement   */
+  /*    drop-out control according to the TrueType specification.          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    y     :: The pixel's y~coordinate.                                 */
+  /*                                                                       */
+  /*    x     :: The pixel's x~coordinate.                                 */
+  /*                                                                       */
+  /*    user  :: User-supplied data that is passed to the callback.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    1~if the pixel is `set', 0~otherwise.                              */
+  /*                                                                       */
+  typedef void
+  (*FT_Raster_BitSet_Func)( int    y,
+                            int    x,
+                            void*  user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_RASTER_FLAG_XXX                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit flag constants as used in the `flags' field of a     */
+  /*    @FT_Raster_Params structure.                                       */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_RASTER_FLAG_DEFAULT :: This value is 0.                         */
+  /*                                                                       */
+  /*    FT_RASTER_FLAG_AA      :: This flag is set to indicate that an     */
+  /*                              anti-aliased glyph image should be       */
+  /*                              generated.  Otherwise, it will be        */
+  /*                              monochrome (1-bit).                      */
+  /*                                                                       */
+  /*    FT_RASTER_FLAG_DIRECT  :: This flag is set to indicate direct      */
+  /*                              rendering.  In this mode, client         */
+  /*                              applications must provide their own span */
+  /*                              callback.  This lets them directly       */
+  /*                              draw or compose over an existing bitmap. */
+  /*                              If this bit is not set, the target       */
+  /*                              pixmap's buffer _must_ be zeroed before  */
+  /*                              rendering.                               */
+  /*                                                                       */
+  /*                              Note that for now, direct rendering is   */
+  /*                              only possible with anti-aliased glyphs.  */
+  /*                                                                       */
+  /*    FT_RASTER_FLAG_CLIP    :: This flag is only used in direct         */
+  /*                              rendering mode.  If set, the output will */
+  /*                              be clipped to a box specified in the     */
+  /*                              `clip_box' field of the                  */
+  /*                              @FT_Raster_Params structure.             */
+  /*                                                                       */
+  /*                              Note that by default, the glyph bitmap   */
+  /*                              is clipped to the target pixmap, except  */
+  /*                              in direct rendering mode where all spans */
+  /*                              are generated if no clipping box is set. */
+  /*                                                                       */
+#define FT_RASTER_FLAG_DEFAULT  0x0
+#define FT_RASTER_FLAG_AA       0x1
+#define FT_RASTER_FLAG_DIRECT   0x2
+#define FT_RASTER_FLAG_CLIP     0x4
+
+  /* deprecated */
+#define ft_raster_flag_default  FT_RASTER_FLAG_DEFAULT
+#define ft_raster_flag_aa       FT_RASTER_FLAG_AA
+#define ft_raster_flag_direct   FT_RASTER_FLAG_DIRECT
+#define ft_raster_flag_clip     FT_RASTER_FLAG_CLIP
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Raster_Params                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure to hold the arguments used by a raster's render        */
+  /*    function.                                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    target      :: The target bitmap.                                  */
+  /*                                                                       */
+  /*    source      :: A pointer to the source glyph image (e.g., an       */
+  /*                   @FT_Outline).                                       */
+  /*                                                                       */
+  /*    flags       :: The rendering flags.                                */
+  /*                                                                       */
+  /*    gray_spans  :: The gray span drawing callback.                     */
+  /*                                                                       */
+  /*    black_spans :: The black span drawing callback.  UNIMPLEMENTED!    */
+  /*                                                                       */
+  /*    bit_test    :: The bit test callback.  UNIMPLEMENTED!              */
+  /*                                                                       */
+  /*    bit_set     :: The bit set callback.  UNIMPLEMENTED!               */
+  /*                                                                       */
+  /*    user        :: User-supplied data that is passed to each drawing   */
+  /*                   callback.                                           */
+  /*                                                                       */
+  /*    clip_box    :: An optional clipping box.  It is only used in       */
+  /*                   direct rendering mode.  Note that coordinates here  */
+  /*                   should be expressed in _integer_ pixels (and not in */
+  /*                   26.6 fixed-point units).                            */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA    */
+  /*    bit flag is set in the `flags' field, otherwise a monochrome       */
+  /*    bitmap is generated.                                               */
+  /*                                                                       */
+  /*    If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the      */
+  /*    raster will call the `gray_spans' callback to draw gray pixel      */
+  /*    spans, in the case of an aa glyph bitmap, it will call             */
+  /*    `black_spans', and `bit_test' and `bit_set' in the case of a       */
+  /*    monochrome bitmap.  This allows direct composition over a          */
+  /*    pre-existing bitmap through user-provided callbacks to perform the */
+  /*    span drawing/composition.                                          */
+  /*                                                                       */
+  /*    Note that the `bit_test' and `bit_set' callbacks are required when */
+  /*    rendering a monochrome bitmap, as they are crucial to implement    */
+  /*    correct drop-out control as defined in the TrueType specification. */
+  /*                                                                       */
+  typedef struct  FT_Raster_Params_
+  {
+    const FT_Bitmap*        target;
+    const void*             source;
+    int                     flags;
+    FT_SpanFunc             gray_spans;
+    FT_SpanFunc             black_spans;  /* doesn't work! */
+    FT_Raster_BitTest_Func  bit_test;     /* doesn't work! */
+    FT_Raster_BitSet_Func   bit_set;      /* doesn't work! */
+    void*                   user;
+    FT_BBox                 clip_box;
+
+  } FT_Raster_Params;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_NewFunc                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to create a new raster object.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A handle to the memory allocator.                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    raster :: A handle to the new raster object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `memory' parameter is a typeless pointer in order to avoid     */
+  /*    un-wanted dependencies on the rest of the FreeType code.  In       */
+  /*    practice, it is an @FT_Memory object, i.e., a handle to the        */
+  /*    standard FreeType memory allocator.  However, this field can be    */
+  /*    completely ignored by a given raster implementation.               */
+  /*                                                                       */
+  typedef int
+  (*FT_Raster_NewFunc)( void*       memory,
+                        FT_Raster*  raster );
+
+#define FT_Raster_New_Func  FT_Raster_NewFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_DoneFunc                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to destroy a given raster object.                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    raster :: A handle to the raster object.                           */
+  /*                                                                       */
+  typedef void
+  (*FT_Raster_DoneFunc)( FT_Raster  raster );
+
+#define FT_Raster_Done_Func  FT_Raster_DoneFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_ResetFunc                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FreeType provides an area of memory called the `render pool',      */
+  /*    available to all registered rasters.  This pool can be freely used */
+  /*    during a given scan-conversion but is shared by all rasters.  Its  */
+  /*    content is thus transient.                                         */
+  /*                                                                       */
+  /*    This function is called each time the render pool changes, or just */
+  /*    after a new raster object is created.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    raster    :: A handle to the new raster object.                    */
+  /*                                                                       */
+  /*    pool_base :: The address in memory of the render pool.             */
+  /*                                                                       */
+  /*    pool_size :: The size in bytes of the render pool.                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Rasters can ignore the render pool and rely on dynamic memory      */
+  /*    allocation if they want to (a handle to the memory allocator is    */
+  /*    passed to the raster constructor).  However, this is not           */
+  /*    recommended for efficiency purposes.                               */
+  /*                                                                       */
+  typedef void
+  (*FT_Raster_ResetFunc)( FT_Raster       raster,
+                          unsigned char*  pool_base,
+                          unsigned long   pool_size );
+
+#define FT_Raster_Reset_Func  FT_Raster_ResetFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_SetModeFunc                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is a generic facility to change modes or attributes  */
+  /*    in a given raster.  This can be used for debugging purposes, or    */
+  /*    simply to allow implementation-specific `features' in a given      */
+  /*    raster module.                                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    raster :: A handle to the new raster object.                       */
+  /*                                                                       */
+  /*    mode   :: A 4-byte tag used to name the mode or property.          */
+  /*                                                                       */
+  /*    args   :: A pointer to the new mode/property to use.               */
+  /*                                                                       */
+  typedef int
+  (*FT_Raster_SetModeFunc)( FT_Raster      raster,
+                            unsigned long  mode,
+                            void*          args );
+
+#define FT_Raster_Set_Mode_Func  FT_Raster_SetModeFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_RenderFunc                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Invoke a given raster to scan-convert a given glyph image into a   */
+  /*    target bitmap.                                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    raster :: A handle to the raster object.                           */
+  /*                                                                       */
+  /*    params :: A pointer to an @FT_Raster_Params structure used to      */
+  /*              store the rendering parameters.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The exact format of the source image depends on the raster's glyph */
+  /*    format defined in its @FT_Raster_Funcs structure.  It can be an    */
+  /*    @FT_Outline or anything else in order to support a large array of  */
+  /*    glyph formats.                                                     */
+  /*                                                                       */
+  /*    Note also that the render function can fail and return a           */
+  /*    `FT_Err_Unimplemented_Feature' error code if the raster used does  */
+  /*    not support direct composition.                                    */
+  /*                                                                       */
+  /*    XXX: For now, the standard raster doesn't support direct           */
+  /*         composition but this should change for the final release (see */
+  /*         the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c'    */
+  /*         for examples of distinct implementations which support direct */
+  /*         composition).                                                 */
+  /*                                                                       */
+  typedef int
+  (*FT_Raster_RenderFunc)( FT_Raster                raster,
+                           const FT_Raster_Params*  params );
+
+#define FT_Raster_Render_Func  FT_Raster_RenderFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Raster_Funcs                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   A structure used to describe a given raster class to the library.   */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    glyph_format  :: The supported glyph format for this raster.       */
+  /*                                                                       */
+  /*    raster_new    :: The raster constructor.                           */
+  /*                                                                       */
+  /*    raster_reset  :: Used to reset the render pool within the raster.  */
+  /*                                                                       */
+  /*    raster_render :: A function to render a glyph into a given bitmap. */
+  /*                                                                       */
+  /*    raster_done   :: The raster destructor.                            */
+  /*                                                                       */
+  typedef struct  FT_Raster_Funcs_
+  {
+    FT_Glyph_Format        glyph_format;
+    FT_Raster_NewFunc      raster_new;
+    FT_Raster_ResetFunc    raster_reset;
+    FT_Raster_SetModeFunc  raster_set_mode;
+    FT_Raster_RenderFunc   raster_render;
+    FT_Raster_DoneFunc     raster_done;
+
+  } FT_Raster_Funcs;
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTIMAGE_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/include/thirdparties/freetype/freetype/ftincrem.h b/core/include/thirdparties/freetype/freetype/ftincrem.h
new file mode 100644
index 0000000..3a3015e
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftincrem.h
@@ -0,0 +1,353 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftincrem.h                                                             */
+/*                                                                         */
+/*    FreeType incremental loading (specification).                        */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2006, 2007, 2008, 2010 by                        */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTINCREM_H__
+#define __FTINCREM_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /***************************************************************************
+   *
+   * @section:
+   *    incremental
+   *
+   * @title:
+   *    Incremental Loading
+   *
+   * @abstract:
+   *    Custom Glyph Loading.
+   *
+   * @description:
+   *   This section contains various functions used to perform so-called
+   *   `incremental' glyph loading.  This is a mode where all glyphs loaded
+   *   from a given @FT_Face are provided by the client application,
+   *
+   *   Apart from that, all other tables are loaded normally from the font
+   *   file.  This mode is useful when FreeType is used within another
+   *   engine, e.g., a PostScript Imaging Processor.
+   *
+   *   To enable this mode, you must use @FT_Open_Face, passing an
+   *   @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an
+   *   @FT_Incremental_Interface value.  See the comments for
+   *   @FT_Incremental_InterfaceRec for an example.
+   *
+   */
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental
+   *
+   * @description:
+   *   An opaque type describing a user-provided object used to implement
+   *   `incremental' glyph loading within FreeType.  This is used to support
+   *   embedded fonts in certain environments (e.g., PostScript interpreters),
+   *   where the glyph data isn't in the font file, or must be overridden by
+   *   different values.
+   *
+   * @note:
+   *   It is up to client applications to create and implement @FT_Incremental
+   *   objects, as long as they provide implementations for the methods
+   *   @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc
+   *   and @FT_Incremental_GetGlyphMetricsFunc.
+   *
+   *   See the description of @FT_Incremental_InterfaceRec to understand how
+   *   to use incremental objects with FreeType.
+   *
+   */
+  typedef struct FT_IncrementalRec_*  FT_Incremental;
+
+
+  /***************************************************************************
+   *
+   * @struct:
+   *   FT_Incremental_MetricsRec
+   *
+   * @description:
+   *   A small structure used to contain the basic glyph metrics returned
+   *   by the @FT_Incremental_GetGlyphMetricsFunc method.
+   *
+   * @fields:
+   *   bearing_x ::
+   *     Left bearing, in font units.
+   *
+   *   bearing_y ::
+   *     Top bearing, in font units.
+   *
+   *   advance ::
+   *     Horizontal component of glyph advance, in font units.
+   *
+   *   advance_v ::
+   *     Vertical component of glyph advance, in font units.
+   *
+   * @note:
+   *   These correspond to horizontal or vertical metrics depending on the
+   *   value of the `vertical' argument to the function
+   *   @FT_Incremental_GetGlyphMetricsFunc.
+   *
+   */
+  typedef struct  FT_Incremental_MetricsRec_
+  {
+    FT_Long  bearing_x;
+    FT_Long  bearing_y;
+    FT_Long  advance;
+    FT_Long  advance_v;     /* since 2.3.12 */
+
+  } FT_Incremental_MetricsRec;
+
+
+  /***************************************************************************
+   *
+   * @struct:
+   *   FT_Incremental_Metrics
+   *
+   * @description:
+   *   A handle to an @FT_Incremental_MetricsRec structure.
+   *
+   */
+   typedef struct FT_Incremental_MetricsRec_*  FT_Incremental_Metrics;
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental_GetGlyphDataFunc
+   *
+   * @description:
+   *   A function called by FreeType to access a given glyph's data bytes
+   *   during @FT_Load_Glyph or @FT_Load_Char if incremental loading is
+   *   enabled.
+   *
+   *   Note that the format of the glyph's data bytes depends on the font
+   *   file format.  For TrueType, it must correspond to the raw bytes within
+   *   the `glyf' table.  For PostScript formats, it must correspond to the
+   *   *unencrypted* charstring bytes, without any `lenIV' header.  It is
+   *   undefined for any other format.
+   *
+   * @input:
+   *   incremental ::
+   *     Handle to an opaque @FT_Incremental handle provided by the client
+   *     application.
+   *
+   *   glyph_index ::
+   *     Index of relevant glyph.
+   *
+   * @output:
+   *   adata ::
+   *     A structure describing the returned glyph data bytes (which will be
+   *     accessed as a read-only byte block).
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   If this function returns successfully the method
+   *   @FT_Incremental_FreeGlyphDataFunc will be called later to release
+   *   the data bytes.
+   *
+   *   Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for
+   *   compound glyphs.
+   *
+   */
+  typedef FT_Error
+  (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental  incremental,
+                                      FT_UInt         glyph_index,
+                                      FT_Data*        adata );
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental_FreeGlyphDataFunc
+   *
+   * @description:
+   *   A function used to release the glyph data bytes returned by a
+   *   successful call to @FT_Incremental_GetGlyphDataFunc.
+   *
+   * @input:
+   *   incremental ::
+   *     A handle to an opaque @FT_Incremental handle provided by the client
+   *     application.
+   *
+   *   data ::
+   *     A structure describing the glyph data bytes (which will be accessed
+   *     as a read-only byte block).
+   *
+   */
+  typedef void
+  (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental  incremental,
+                                       FT_Data*        data );
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental_GetGlyphMetricsFunc
+   *
+   * @description:
+   *   A function used to retrieve the basic metrics of a given glyph index
+   *   before accessing its data.  This is necessary because, in certain
+   *   formats like TrueType, the metrics are stored in a different place from
+   *   the glyph images proper.
+   *
+   * @input:
+   *   incremental ::
+   *     A handle to an opaque @FT_Incremental handle provided by the client
+   *     application.
+   *
+   *   glyph_index ::
+   *     Index of relevant glyph.
+   *
+   *   vertical ::
+   *     If true, return vertical metrics.
+   *
+   *   ametrics ::
+   *     This parameter is used for both input and output.
+   *     The original glyph metrics, if any, in font units.  If metrics are
+   *     not available all the values must be set to zero.
+   *
+   * @output:
+   *   ametrics ::
+   *     The replacement glyph metrics in font units.
+   *
+   */
+  typedef FT_Error
+  (*FT_Incremental_GetGlyphMetricsFunc)
+                      ( FT_Incremental              incremental,
+                        FT_UInt                     glyph_index,
+                        FT_Bool                     vertical,
+                        FT_Incremental_MetricsRec  *ametrics );
+
+
+  /**************************************************************************
+   *
+   * @struct:
+   *   FT_Incremental_FuncsRec
+   *
+   * @description:
+   *   A table of functions for accessing fonts that load data
+   *   incrementally.  Used in @FT_Incremental_InterfaceRec.
+   *
+   * @fields:
+   *   get_glyph_data ::
+   *     The function to get glyph data.  Must not be null.
+   *
+   *   free_glyph_data ::
+   *     The function to release glyph data.  Must not be null.
+   *
+   *   get_glyph_metrics ::
+   *     The function to get glyph metrics.  May be null if the font does
+   *     not provide overriding glyph metrics.
+   *
+   */
+  typedef struct  FT_Incremental_FuncsRec_
+  {
+    FT_Incremental_GetGlyphDataFunc     get_glyph_data;
+    FT_Incremental_FreeGlyphDataFunc    free_glyph_data;
+    FT_Incremental_GetGlyphMetricsFunc  get_glyph_metrics;
+
+  } FT_Incremental_FuncsRec;
+
+
+  /***************************************************************************
+   *
+   * @struct:
+   *   FT_Incremental_InterfaceRec
+   *
+   * @description:
+   *   A structure to be used with @FT_Open_Face to indicate that the user
+   *   wants to support incremental glyph loading.  You should use it with
+   *   @FT_PARAM_TAG_INCREMENTAL as in the following example:
+   *
+   *     {
+   *       FT_Incremental_InterfaceRec  inc_int;
+   *       FT_Parameter                 parameter;
+   *       FT_Open_Args                 open_args;
+   *
+   *
+   *       // set up incremental descriptor
+   *       inc_int.funcs  = my_funcs;
+   *       inc_int.object = my_object;
+   *
+   *       // set up optional parameter
+   *       parameter.tag  = FT_PARAM_TAG_INCREMENTAL;
+   *       parameter.data = &inc_int;
+   *
+   *       // set up FT_Open_Args structure
+   *       open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;
+   *       open_args.pathname   = my_font_pathname;
+   *       open_args.num_params = 1;
+   *       open_args.params     = &parameter; // we use one optional argument
+   *
+   *       // open the font
+   *       error = FT_Open_Face( library, &open_args, index, &face );
+   *       ...
+   *     }
+   *
+   */
+  typedef struct  FT_Incremental_InterfaceRec_
+  {
+    const FT_Incremental_FuncsRec*  funcs;
+    FT_Incremental                  object;
+
+  } FT_Incremental_InterfaceRec;
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental_Interface
+   *
+   * @description:
+   *   A pointer to an @FT_Incremental_InterfaceRec structure.
+   *
+   */
+  typedef FT_Incremental_InterfaceRec*   FT_Incremental_Interface;
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_INCREMENTAL
+   *
+   * @description:
+   *   A constant used as the tag of @FT_Parameter structures to indicate
+   *   an incremental loading object to be used by FreeType.
+   *
+   */
+#define FT_PARAM_TAG_INCREMENTAL  FT_MAKE_TAG( 'i', 'n', 'c', 'r' )
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __FTINCREM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftlcdfil.h b/core/include/thirdparties/freetype/freetype/ftlcdfil.h
new file mode 100644
index 0000000..042f983
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftlcdfil.h
@@ -0,0 +1,251 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlcdfil.h                                                             */
+/*                                                                         */
+/*    FreeType API for color filtering of subpixel bitmap glyphs           */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 2006, 2007, 2008, 2010 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FT_LCD_FILTER_H__
+#define __FT_LCD_FILTER_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /***************************************************************************
+   *
+   * @section:
+   *   lcd_filtering
+   *
+   * @title:
+   *   LCD Filtering
+   *
+   * @abstract:
+   *   Reduce color fringes of LCD-optimized bitmaps.
+   *
+   * @description:
+   *   The @FT_Library_SetLcdFilter API can be used to specify a low-pass
+   *   filter which is then applied to LCD-optimized bitmaps generated
+   *   through @FT_Render_Glyph.  This is useful to reduce color fringes
+   *   which would occur with unfiltered rendering.
+   *
+   *   Note that no filter is active by default, and that this function is
+   *   *not* implemented in default builds of the library.  You need to
+   *   #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file
+   *   in order to activate it.
+   *
+   *   FreeType generates alpha coverage maps, which are linear by nature.
+   *   For instance, the value 0x80 in bitmap representation means that
+   *   (within numerical precision) 0x80/0xff fraction of that pixel is
+   *   covered by the glyph's outline.  The blending function for placing
+   *   text over a background is
+   *
+   *   {
+   *     dst = alpha * src + (1 - alpha) * dst    ,
+   *   }
+   *
+   *   which is known as OVER.  However, when calculating the output of the
+   *   OVER operator, the source colors should first be transformed to a
+   *   linear color space, then alpha blended in that space, and transformed
+   *   back to the output color space.
+   *
+   *   When linear light blending is used, the default FIR5 filtering
+   *   weights (as given by FT_LCD_FILTER_DEFAULT) are no longer optimal, as
+   *   they have been designed for black on white rendering while lacking
+   *   gamma correction.  To preserve color neutrality, weights for a FIR5
+   *   filter should be chosen according to two free parameters `a' and `c',
+   *   and the FIR weights should be
+   *
+   *   {
+   *     [a - c, a + c, 2 * a, a + c, a - c]    .
+   *   }
+   *
+   *   This formula generates equal weights for all the color primaries
+   *   across the filter kernel, which makes it colorless.  One suggested
+   *   set of weights is
+   *
+   *   {
+   *     [0x10, 0x50, 0x60, 0x50, 0x10]    ,
+   *   }
+   *
+   *   where `a' has value 0x30 and `b' value 0x20.  The weights in filter
+   *   may have a sum larger than 0x100, which increases coloration slightly
+   *   but also improves contrast.
+   */
+
+
+  /****************************************************************************
+   *
+   * @enum:
+   *   FT_LcdFilter
+   *
+   * @description:
+   *   A list of values to identify various types of LCD filters.
+   *
+   * @values:
+   *   FT_LCD_FILTER_NONE ::
+   *     Do not perform filtering.  When used with subpixel rendering, this
+   *     results in sometimes severe color fringes.
+   *
+   *   FT_LCD_FILTER_DEFAULT ::
+   *     The default filter reduces color fringes considerably, at the cost
+   *     of a slight blurriness in the output.
+   *
+   *   FT_LCD_FILTER_LIGHT ::
+   *     The light filter is a variant that produces less blurriness at the
+   *     cost of slightly more color fringes than the default one.  It might
+   *     be better, depending on taste, your monitor, or your personal vision.
+   *
+   *   FT_LCD_FILTER_LEGACY ::
+   *     This filter corresponds to the original libXft color filter.  It
+   *     provides high contrast output but can exhibit really bad color
+   *     fringes if glyphs are not extremely well hinted to the pixel grid.
+   *     In other words, it only works well if the TrueType bytecode
+   *     interpreter is enabled *and* high-quality hinted fonts are used.
+   *
+   *     This filter is only provided for comparison purposes, and might be
+   *     disabled or stay unsupported in the future.
+   *
+   * @since:
+   *   2.3.0
+   */
+  typedef enum  FT_LcdFilter_
+  {
+    FT_LCD_FILTER_NONE    = 0,
+    FT_LCD_FILTER_DEFAULT = 1,
+    FT_LCD_FILTER_LIGHT   = 2,
+    FT_LCD_FILTER_LEGACY  = 16,
+
+    FT_LCD_FILTER_MAX   /* do not remove */
+
+  } FT_LcdFilter;
+
+
+  /**************************************************************************
+   *
+   * @func:
+   *   FT_Library_SetLcdFilter
+   *
+   * @description:
+   *   This function is used to apply color filtering to LCD decimated
+   *   bitmaps, like the ones used when calling @FT_Render_Glyph with
+   *   @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V.
+   *
+   * @input:
+   *   library ::
+   *     A handle to the target library instance.
+   *
+   *   filter ::
+   *     The filter type.
+   *
+   *     You can use @FT_LCD_FILTER_NONE here to disable this feature, or
+   *     @FT_LCD_FILTER_DEFAULT to use a default filter that should work
+   *     well on most LCD screens.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   This feature is always disabled by default.  Clients must make an
+   *   explicit call to this function with a `filter' value other than
+   *   @FT_LCD_FILTER_NONE in order to enable it.
+   *
+   *   Due to *PATENTS* covering subpixel rendering, this function doesn't
+   *   do anything except returning `FT_Err_Unimplemented_Feature' if the
+   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+   *   defined in your build of the library, which should correspond to all
+   *   default builds of FreeType.
+   *
+   *   The filter affects glyph bitmaps rendered through @FT_Render_Glyph,
+   *   @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char.
+   *
+   *   It does _not_ affect the output of @FT_Outline_Render and
+   *   @FT_Outline_Get_Bitmap.
+   *
+   *   If this feature is activated, the dimensions of LCD glyph bitmaps are
+   *   either larger or taller than the dimensions of the corresponding
+   *   outline with regards to the pixel grid.  For example, for
+   *   @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and
+   *   up to 3~pixels to the right.
+   *
+   *   The bitmap offset values are adjusted correctly, so clients shouldn't
+   *   need to modify their layout and glyph positioning code when enabling
+   *   the filter.
+   *
+   * @since:
+   *   2.3.0
+   */
+  FT_EXPORT( FT_Error )
+  FT_Library_SetLcdFilter( FT_Library    library,
+                           FT_LcdFilter  filter );
+
+
+  /**************************************************************************
+   *
+   * @func:
+   *   FT_Library_SetLcdFilterWeights
+   *
+   * @description:
+   *   Use this function to override the filter weights selected by
+   *   @FT_Library_SetLcdFilter.  By default, FreeType uses the quintuple
+   *   (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10,
+   *   0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and
+   *   FT_LCD_FILTER_LEGACY.
+   *
+   * @input:
+   *   library ::
+   *     A handle to the target library instance.
+   *
+   *   weights ::
+   *     A pointer to an array; the function copies the first five bytes and
+   *     uses them to specify the filter weights.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   Due to *PATENTS* covering subpixel rendering, this function doesn't
+   *   do anything except returning `FT_Err_Unimplemented_Feature' if the
+   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+   *   defined in your build of the library, which should correspond to all
+   *   default builds of FreeType.
+   *
+   *   This function must be called after @FT_Library_SetLcdFilter to have
+   *   any effect.
+   *
+   * @since:
+   *   2.4.0
+   */
+  FT_EXPORT( FT_Error )
+  FT_Library_SetLcdFilterWeights( FT_Library      library,
+                                  unsigned char  *weights );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FT_LCD_FILTER_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftlist.h b/core/include/thirdparties/freetype/freetype/ftlist.h
new file mode 100644
index 0000000..8b18978
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftlist.h
@@ -0,0 +1,277 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlist.h                                                               */
+/*                                                                         */
+/*    Generic list support for FreeType (specification).                   */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2007, 2010 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  This file implements functions relative to list processing.  Its     */
+  /*  data structures are defined in `freetype.h'.                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTLIST_H__
+#define __FTLIST_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    list_processing                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    List Processing                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Simple management of lists.                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains various definitions related to list          */
+  /*    processing using doubly-linked nodes.                              */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_List                                                            */
+  /*    FT_ListNode                                                        */
+  /*    FT_ListRec                                                         */
+  /*    FT_ListNodeRec                                                     */
+  /*                                                                       */
+  /*    FT_List_Add                                                        */
+  /*    FT_List_Insert                                                     */
+  /*    FT_List_Find                                                       */
+  /*    FT_List_Remove                                                     */
+  /*    FT_List_Up                                                         */
+  /*    FT_List_Iterate                                                    */
+  /*    FT_List_Iterator                                                   */
+  /*    FT_List_Finalize                                                   */
+  /*    FT_List_Destructor                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Find                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Find the list node for a given listed object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    list :: A pointer to the parent list.                              */
+  /*    data :: The address of the listed object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    List node.  NULL if it wasn't found.                               */
+  /*                                                                       */
+  FT_EXPORT( FT_ListNode )
+  FT_List_Find( FT_List  list,
+                void*    data );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Add                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Append an element to the end of a list.                            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    list :: A pointer to the parent list.                              */
+  /*    node :: The node to append.                                        */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Add( FT_List      list,
+               FT_ListNode  node );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Insert                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Insert an element at the head of a list.                           */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    list :: A pointer to parent list.                                  */
+  /*    node :: The node to insert.                                        */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Insert( FT_List      list,
+                  FT_ListNode  node );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Remove                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Remove a node from a list.  This function doesn't check whether    */
+  /*    the node is in the list!                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    node :: The node to remove.                                        */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    list :: A pointer to the parent list.                              */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Remove( FT_List      list,
+                  FT_ListNode  node );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Up                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Move a node to the head/top of a list.  Used to maintain LRU       */
+  /*    lists.                                                             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    list :: A pointer to the parent list.                              */
+  /*    node :: The node to move.                                          */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Up( FT_List      list,
+              FT_ListNode  node );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_List_Iterator                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An FT_List iterator function which is called during a list parse   */
+  /*    by @FT_List_Iterate.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    node :: The current iteration list node.                           */
+  /*                                                                       */
+  /*    user :: A typeless pointer passed to @FT_List_Iterate.             */
+  /*            Can be used to point to the iteration's state.             */
+  /*                                                                       */
+  typedef FT_Error
+  (*FT_List_Iterator)( FT_ListNode  node,
+                       void*        user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Iterate                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parse a list and calls a given iterator function on each element.  */
+  /*    Note that parsing is stopped as soon as one of the iterator calls  */
+  /*    returns a non-zero value.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    list     :: A handle to the list.                                  */
+  /*    iterator :: An iterator function, called on each node of the list. */
+  /*    user     :: A user-supplied field which is passed as the second    */
+  /*                argument to the iterator.                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result (a FreeType error code) of the last iterator call.      */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_List_Iterate( FT_List           list,
+                   FT_List_Iterator  iterator,
+                   void*             user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_List_Destructor                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An @FT_List iterator function which is called during a list        */
+  /*    finalization by @FT_List_Finalize to destroy all elements in a     */
+  /*    given list.                                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    system :: The current system object.                               */
+  /*                                                                       */
+  /*    data   :: The current object to destroy.                           */
+  /*                                                                       */
+  /*    user   :: A typeless pointer passed to @FT_List_Iterate.  It can   */
+  /*              be used to point to the iteration's state.               */
+  /*                                                                       */
+  typedef void
+  (*FT_List_Destructor)( FT_Memory  memory,
+                         void*      data,
+                         void*      user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Finalize                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy all elements in the list as well as the list itself.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    list    :: A handle to the list.                                   */
+  /*                                                                       */
+  /*    destroy :: A list destructor that will be applied to each element  */
+  /*               of the list.                                            */
+  /*                                                                       */
+  /*    memory  :: The current memory object which handles deallocation.   */
+  /*                                                                       */
+  /*    user    :: A user-supplied field which is passed as the last       */
+  /*               argument to the destructor.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function expects that all nodes added by @FT_List_Add or      */
+  /*    @FT_List_Insert have been dynamically allocated.                   */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Finalize( FT_List             list,
+                    FT_List_Destructor  destroy,
+                    FT_Memory           memory,
+                    void*               user );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTLIST_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftlzw.h b/core/include/thirdparties/freetype/freetype/ftlzw.h
new file mode 100644
index 0000000..5bb4a82
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftlzw.h
@@ -0,0 +1,99 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlzw.h                                                                */
+/*                                                                         */
+/*    LZW-compressed stream support.                                       */
+/*                                                                         */
+/*  Copyright 2004, 2006 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTLZW_H__
+#define __FTLZW_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    lzw                                                                */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    LZW Streams                                                        */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Using LZW-compressed font files.                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of LZW-specific functions.   */
+  /*                                                                       */
+  /*************************************************************************/
+
+ /************************************************************************
+  *
+  * @function:
+  *   FT_Stream_OpenLZW
+  *
+  * @description:
+  *   Open a new stream to parse LZW-compressed font files.  This is
+  *   mainly used to support the compressed `*.pcf.Z' fonts that come
+  *   with XFree86.
+  *
+  * @input:
+  *   stream :: The target embedding stream.
+  *
+  *   source :: The source stream.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   The source stream must be opened _before_ calling this function.
+  *
+  *   Calling the internal function `FT_Stream_Close' on the new stream will
+  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream
+  *   objects will be released to the heap.
+  *
+  *   The stream implementation is very basic and resets the decompression
+  *   process each time seeking backwards is needed within the stream
+  *
+  *   In certain builds of the library, LZW compression recognition is
+  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.
+  *   This means that if no font driver is capable of handling the raw
+  *   compressed file, the library will try to open a LZW stream from it
+  *   and re-open the face with it.
+  *
+  *   This function may return `FT_Err_Unimplemented_Feature' if your build
+  *   of FreeType was not compiled with LZW support.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Stream_OpenLZW( FT_Stream  stream,
+                     FT_Stream  source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTLZW_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftmac.h b/core/include/thirdparties/freetype/freetype/ftmac.h
new file mode 100644
index 0000000..f40f3fb
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftmac.h
@@ -0,0 +1,274 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmac.h                                                                */
+/*                                                                         */
+/*    Additional Mac-specific API.                                         */
+/*                                                                         */
+/*  Copyright 1996-2001, 2004, 2006, 2007 by                               */
+/*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* NOTE: Include this file after <freetype/freetype.h> and after any       */
+/*       Mac-specific headers (because this header uses Mac types such as  */
+/*       Handle, FSSpec, FSRef, etc.)                                      */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTMAC_H__
+#define __FTMAC_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+/* gcc-3.4.1 and later can warn about functions tagged as deprecated */
+#ifndef FT_DEPRECATED_ATTRIBUTE
+#if defined(__GNUC__)                                               && \
+    ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
+#define FT_DEPRECATED_ATTRIBUTE  __attribute__((deprecated))
+#else
+#define FT_DEPRECATED_ATTRIBUTE
+#endif
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    mac_specific                                                       */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Mac Specific Interface                                             */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Only available on the Macintosh.                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The following definitions are only available if FreeType is        */
+  /*    compiled on a Macintosh.                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FOND                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new face object from a FOND resource.                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    fond       :: A FOND resource.                                     */
+  /*                                                                       */
+  /*    face_index :: Only supported for the -1 `sanity check' special     */
+  /*                  case.                                                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Notes>                                                               */
+  /*    This function can be used to create @FT_Face objects from fonts    */
+  /*    that are installed in the system as follows.                       */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      fond = GetResource( 'FOND', fontName );                          */
+  /*      error = FT_New_Face_From_FOND( library, fond, 0, &face );        */
+  /*    }                                                                  */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Face_From_FOND( FT_Library  library,
+                         Handle      fond,
+                         FT_Long     face_index,
+                         FT_Face    *aface )
+                       FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_GetFile_From_Mac_Name                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return an FSSpec for the disk file containing the named font.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    fontName   :: Mac OS name of the font (e.g., Times New Roman       */
+  /*                  Bold).                                               */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    pathSpec   :: FSSpec to the file.  For passing to                  */
+  /*                  @FT_New_Face_From_FSSpec.                            */
+  /*                                                                       */
+  /*    face_index :: Index of the face.  For passing to                   */
+  /*                  @FT_New_Face_From_FSSpec.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_GetFile_From_Mac_Name( const char*  fontName,
+                            FSSpec*      pathSpec,
+                            FT_Long*     face_index )
+                          FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_GetFile_From_Mac_ATS_Name                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return an FSSpec for the disk file containing the named font.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    fontName   :: Mac OS name of the font in ATS framework.            */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    pathSpec   :: FSSpec to the file. For passing to                   */
+  /*                  @FT_New_Face_From_FSSpec.                            */
+  /*                                                                       */
+  /*    face_index :: Index of the face. For passing to                    */
+  /*                  @FT_New_Face_From_FSSpec.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,
+                                FSSpec*      pathSpec,
+                                FT_Long*     face_index )
+                              FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_GetFilePath_From_Mac_ATS_Name                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a pathname of the disk file and face index for given font   */
+  /*    name which is handled by ATS framework.                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    fontName    :: Mac OS name of the font in ATS framework.           */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    path        :: Buffer to store pathname of the file.  For passing  */
+  /*                   to @FT_New_Face.  The client must allocate this     */
+  /*                   buffer before calling this function.                */
+  /*                                                                       */
+  /*    maxPathSize :: Lengths of the buffer `path' that client allocated. */
+  /*                                                                       */
+  /*    face_index  :: Index of the face.  For passing to @FT_New_Face.    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,
+                                    UInt8*       path,
+                                    UInt32       maxPathSize,
+                                    FT_Long*     face_index )
+                                  FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FSSpec                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new face object from a given resource and typeface index  */
+  /*    using an FSSpec to the font file.                                  */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    spec       :: FSSpec to the font file.                             */
+  /*                                                                       */
+  /*    face_index :: The index of the face within the resource.  The      */
+  /*                  first face has index~0.                              */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    @FT_New_Face_From_FSSpec is identical to @FT_New_Face except       */
+  /*    it accepts an FSSpec instead of a path.                            */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Face_From_FSSpec( FT_Library     library,
+                           const FSSpec  *spec,
+                           FT_Long        face_index,
+                           FT_Face       *aface )
+                         FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FSRef                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new face object from a given resource and typeface index  */
+  /*    using an FSRef to the font file.                                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    spec       :: FSRef to the font file.                              */
+  /*                                                                       */
+  /*    face_index :: The index of the face within the resource.  The      */
+  /*                  first face has index~0.                              */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    @FT_New_Face_From_FSRef is identical to @FT_New_Face except        */
+  /*    it accepts an FSRef instead of a path.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Face_From_FSRef( FT_Library    library,
+                          const FSRef  *ref,
+                          FT_Long       face_index,
+                          FT_Face      *aface )
+                        FT_DEPRECATED_ATTRIBUTE;
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTMAC_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftmm.h b/core/include/thirdparties/freetype/freetype/ftmm.h
new file mode 100644
index 0000000..52aaf44
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftmm.h
@@ -0,0 +1,378 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmm.h                                                                 */
+/*                                                                         */
+/*    FreeType Multiple Master font interface (specification).             */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2004, 2006, 2009 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTMM_H__
+#define __FTMM_H__
+
+
+#include "../ft2build.h"
+#include "t1tables.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    multiple_masters                                                   */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Multiple Masters                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    How to manage Multiple Masters fonts.                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The following types and functions are used to manage Multiple      */
+  /*    Master fonts, i.e., the selection of specific design instances by  */
+  /*    setting design axis coordinates.                                   */
+  /*                                                                       */
+  /*    George Williams has extended this interface to make it work with   */
+  /*    both Type~1 Multiple Masters fonts and GX distortable (var)        */
+  /*    fonts.  Some of these routines only work with MM fonts, others     */
+  /*    will work with both types.  They are similar enough that a         */
+  /*    consistent interface makes sense.                                  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_MM_Axis                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to model a given axis in design space for  */
+  /*    Multiple Masters fonts.                                            */
+  /*                                                                       */
+  /*    This structure can't be used for GX var fonts.                     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    name    :: The axis's name.                                        */
+  /*                                                                       */
+  /*    minimum :: The axis's minimum design coordinate.                   */
+  /*                                                                       */
+  /*    maximum :: The axis's maximum design coordinate.                   */
+  /*                                                                       */
+  typedef struct  FT_MM_Axis_
+  {
+    FT_String*  name;
+    FT_Long     minimum;
+    FT_Long     maximum;
+
+  } FT_MM_Axis;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Multi_Master                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model the axes and space of a Multiple Masters */
+  /*    font.                                                              */
+  /*                                                                       */
+  /*    This structure can't be used for GX var fonts.                     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_axis    :: Number of axes.  Cannot exceed~4.                   */
+  /*                                                                       */
+  /*    num_designs :: Number of designs; should be normally 2^num_axis    */
+  /*                   even though the Type~1 specification strangely      */
+  /*                   allows for intermediate designs to be present. This */
+  /*                   number cannot exceed~16.                            */
+  /*                                                                       */
+  /*    axis        :: A table of axis descriptors.                        */
+  /*                                                                       */
+  typedef struct  FT_Multi_Master_
+  {
+    FT_UInt     num_axis;
+    FT_UInt     num_designs;
+    FT_MM_Axis  axis[T1_MAX_MM_AXIS];
+
+  } FT_Multi_Master;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Var_Axis                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to model a given axis in design space for  */
+  /*    Multiple Masters and GX var fonts.                                 */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    name    :: The axis's name.                                        */
+  /*               Not always meaningful for GX.                           */
+  /*                                                                       */
+  /*    minimum :: The axis's minimum design coordinate.                   */
+  /*                                                                       */
+  /*    def     :: The axis's default design coordinate.                   */
+  /*               FreeType computes meaningful default values for MM; it  */
+  /*               is then an integer value, not in 16.16 format.          */
+  /*                                                                       */
+  /*    maximum :: The axis's maximum design coordinate.                   */
+  /*                                                                       */
+  /*    tag     :: The axis's tag (the GX equivalent to `name').           */
+  /*               FreeType provides default values for MM if possible.    */
+  /*                                                                       */
+  /*    strid   :: The entry in `name' table (another GX version of        */
+  /*               `name').                                                */
+  /*               Not meaningful for MM.                                  */
+  /*                                                                       */
+  typedef struct  FT_Var_Axis_
+  {
+    FT_String*  name;
+
+    FT_Fixed    minimum;
+    FT_Fixed    def;
+    FT_Fixed    maximum;
+
+    FT_ULong    tag;
+    FT_UInt     strid;
+
+  } FT_Var_Axis;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Var_Named_Style                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to model a named style in a GX var font.   */
+  /*                                                                       */
+  /*    This structure can't be used for MM fonts.                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    coords :: The design coordinates for this style.                   */
+  /*              This is an array with one entry for each axis.           */
+  /*                                                                       */
+  /*    strid  :: The entry in `name' table identifying this style.        */
+  /*                                                                       */
+  typedef struct  FT_Var_Named_Style_
+  {
+    FT_Fixed*  coords;
+    FT_UInt    strid;
+
+  } FT_Var_Named_Style;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_MM_Var                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model the axes and space of a Multiple Masters */
+  /*    or GX var distortable font.                                        */
+  /*                                                                       */
+  /*    Some fields are specific to one format and not to the other.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_axis        :: The number of axes.  The maximum value is~4 for */
+  /*                       MM; no limit in GX.                             */
+  /*                                                                       */
+  /*    num_designs     :: The number of designs; should be normally       */
+  /*                       2^num_axis for MM fonts.  Not meaningful for GX */
+  /*                       (where every glyph could have a different       */
+  /*                       number of designs).                             */
+  /*                                                                       */
+  /*    num_namedstyles :: The number of named styles; only meaningful for */
+  /*                       GX which allows certain design coordinates to   */
+  /*                       have a string ID (in the `name' table)          */
+  /*                       associated with them.  The font can tell the    */
+  /*                       user that, for example, Weight=1.5 is `Bold'.   */
+  /*                                                                       */
+  /*    axis            :: A table of axis descriptors.                    */
+  /*                       GX fonts contain slightly more data than MM.    */
+  /*                                                                       */
+  /*    namedstyles     :: A table of named styles.                        */
+  /*                       Only meaningful with GX.                        */
+  /*                                                                       */
+  typedef struct  FT_MM_Var_
+  {
+    FT_UInt              num_axis;
+    FT_UInt              num_designs;
+    FT_UInt              num_namedstyles;
+    FT_Var_Axis*         axis;
+    FT_Var_Named_Style*  namedstyle;
+
+  } FT_MM_Var;
+
+
+  /* */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Multi_Master                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the Multiple Master descriptor of a given font.           */
+  /*                                                                       */
+  /*    This function can't be used with GX fonts.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: A handle to the source face.                            */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amaster :: The Multiple Masters descriptor.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Multi_Master( FT_Face           face,
+                       FT_Multi_Master  *amaster );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_MM_Var                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the Multiple Master/GX var descriptor of a given font.    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: A handle to the source face.                            */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amaster :: The Multiple Masters/GX var descriptor.                 */
+  /*               Allocates a data structure, which the user must free    */
+  /*               (a single call to FT_FREE will do it).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_MM_Var( FT_Face      face,
+                 FT_MM_Var*  *amaster );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_MM_Design_Coordinates                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    For Multiple Masters fonts, choose an interpolated font design     */
+  /*    through design coordinates.                                        */
+  /*                                                                       */
+  /*    This function can't be used with GX fonts.                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of design coordinates (must be equal to   */
+  /*                  the number of axes in the font).                     */
+  /*                                                                       */
+  /*    coords     :: An array of design coordinates.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_MM_Design_Coordinates( FT_Face   face,
+                                FT_UInt   num_coords,
+                                FT_Long*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Var_Design_Coordinates                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    For Multiple Master or GX Var fonts, choose an interpolated font   */
+  /*    design through design coordinates.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of design coordinates (must be equal to   */
+  /*                  the number of axes in the font).                     */
+  /*                                                                       */
+  /*    coords     :: An array of design coordinates.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Var_Design_Coordinates( FT_Face    face,
+                                 FT_UInt    num_coords,
+                                 FT_Fixed*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_MM_Blend_Coordinates                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    For Multiple Masters and GX var fonts, choose an interpolated font */
+  /*    design through normalized blend coordinates.                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of design coordinates (must be equal to   */
+  /*                  the number of axes in the font).                     */
+  /*                                                                       */
+  /*    coords     :: The design coordinates array (each element must be   */
+  /*                  between 0 and 1.0).                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_MM_Blend_Coordinates( FT_Face    face,
+                               FT_UInt    num_coords,
+                               FT_Fixed*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Var_Blend_Coordinates                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is another name of @FT_Set_MM_Blend_Coordinates.              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Var_Blend_Coordinates( FT_Face    face,
+                                FT_UInt    num_coords,
+                                FT_Fixed*  coords );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftmodapi.h b/core/include/thirdparties/freetype/freetype/ftmodapi.h
new file mode 100644
index 0000000..f12c0a9
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftmodapi.h
@@ -0,0 +1,641 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmodapi.h                                                             */
+/*                                                                         */
+/*    FreeType modules public interface (specification).                   */
+/*                                                                         */
+/*  Copyright 1996-2003, 2006, 2008-2010, 2012, 2013 by                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTMODAPI_H__
+#define __FTMODAPI_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    module_management                                                  */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Module Management                                                  */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    How to add, upgrade, remove, and control modules from FreeType.    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The definitions below are used to manage modules within FreeType.  */
+  /*    Modules can be added, upgraded, and removed at runtime.            */
+  /*    Additionally, some module properties can be controlled also.       */
+  /*                                                                       */
+  /*    Here is a list of possible values of the `module_name' field in    */
+  /*    the @FT_Module_Class structure.                                    */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      autofitter                                                       */
+  /*      bdf                                                              */
+  /*      cff                                                              */
+  /*      gxvalid                                                          */
+  /*      otvalid                                                          */
+  /*      pcf                                                              */
+  /*      pfr                                                              */
+  /*      psaux                                                            */
+  /*      pshinter                                                         */
+  /*      psnames                                                          */
+  /*      raster1, raster5                                                 */
+  /*      sfnt                                                             */
+  /*      smooth, smooth-lcd, smooth-lcdv                                  */
+  /*      truetype                                                         */
+  /*      type1                                                            */
+  /*      type42                                                           */
+  /*      t1cid                                                            */
+  /*      winfonts                                                         */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    Note that the FreeType Cache sub-system is not a FreeType module.  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* module bit flags */
+#define FT_MODULE_FONT_DRIVER         1  /* this module is a font driver  */
+#define FT_MODULE_RENDERER            2  /* this module is a renderer     */
+#define FT_MODULE_HINTER              4  /* this module is a glyph hinter */
+#define FT_MODULE_STYLER              8  /* this module is a styler       */
+
+#define FT_MODULE_DRIVER_SCALABLE     0x100   /* the driver supports      */
+                                              /* scalable fonts           */
+#define FT_MODULE_DRIVER_NO_OUTLINES  0x200   /* the driver does not      */
+                                              /* support vector outlines  */
+#define FT_MODULE_DRIVER_HAS_HINTER   0x400   /* the driver provides its  */
+                                              /* own hinter               */
+
+
+  /* deprecated values */
+#define ft_module_font_driver         FT_MODULE_FONT_DRIVER
+#define ft_module_renderer            FT_MODULE_RENDERER
+#define ft_module_hinter              FT_MODULE_HINTER
+#define ft_module_styler              FT_MODULE_STYLER
+
+#define ft_module_driver_scalable     FT_MODULE_DRIVER_SCALABLE
+#define ft_module_driver_no_outlines  FT_MODULE_DRIVER_NO_OUTLINES
+#define ft_module_driver_has_hinter   FT_MODULE_DRIVER_HAS_HINTER
+
+
+  typedef FT_Pointer  FT_Module_Interface;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Constructor                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to initialize (not create) a new module object.    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    module :: The module to initialize.                                */
+  /*                                                                       */
+  typedef FT_Error
+  (*FT_Module_Constructor)( FT_Module  module );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Destructor                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to finalize (not destroy) a given module object.   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    module :: The module to finalize.                                  */
+  /*                                                                       */
+  typedef void
+  (*FT_Module_Destructor)( FT_Module  module );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Requester                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to query a given module for a specific interface.  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    module :: The module to be searched.                               */
+  /*                                                                       */
+  /*    name ::   The name of the interface in the module.                 */
+  /*                                                                       */
+  typedef FT_Module_Interface
+  (*FT_Module_Requester)( FT_Module    module,
+                          const char*  name );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Module_Class                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The module class descriptor.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    module_flags    :: Bit flags describing the module.                */
+  /*                                                                       */
+  /*    module_size     :: The size of one module object/instance in       */
+  /*                       bytes.                                          */
+  /*                                                                       */
+  /*    module_name     :: The name of the module.                         */
+  /*                                                                       */
+  /*    module_version  :: The version, as a 16.16 fixed number            */
+  /*                       (major.minor).                                  */
+  /*                                                                       */
+  /*    module_requires :: The version of FreeType this module requires,   */
+  /*                       as a 16.16 fixed number (major.minor).  Starts  */
+  /*                       at version 2.0, i.e., 0x20000.                  */
+  /*                                                                       */
+  /*    module_init     :: The initializing function.                      */
+  /*                                                                       */
+  /*    module_done     :: The finalizing function.                        */
+  /*                                                                       */
+  /*    get_interface   :: The interface requesting function.              */
+  /*                                                                       */
+  typedef struct  FT_Module_Class_
+  {
+    FT_ULong               module_flags;
+    FT_Long                module_size;
+    const FT_String*       module_name;
+    FT_Fixed               module_version;
+    FT_Fixed               module_requires;
+
+    const void*            module_interface;
+
+    FT_Module_Constructor  module_init;
+    FT_Module_Destructor   module_done;
+    FT_Module_Requester    get_interface;
+
+  } FT_Module_Class;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Add_Module                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Add a new module to a given library instance.                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library :: A handle to the library object.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    clazz   :: A pointer to class descriptor for the module.           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    An error will be returned if a module already exists by that name, */
+  /*    or if the module requires a version of FreeType that is too great. */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Add_Module( FT_Library              library,
+                 const FT_Module_Class*  clazz );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Module                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Find a module by its name.                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library     :: A handle to the library object.                     */
+  /*                                                                       */
+  /*    module_name :: The module's name (as an ASCII string).             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A module handle.  0~if none was found.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    FreeType's internal modules aren't documented very well, and you   */
+  /*    should look up the source code for details.                        */
+  /*                                                                       */
+  FT_EXPORT( FT_Module )
+  FT_Get_Module( FT_Library   library,
+                 const char*  module_name );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Remove_Module                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Remove a given module from a library instance.                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library :: A handle to a library object.                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    module  :: A handle to a module object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The module object is destroyed by the function in case of success. */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Remove_Module( FT_Library  library,
+                    FT_Module   module );
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Property_Set
+   *
+   * @description:
+   *    Set a property for a given module.
+   *
+   * @input:
+   *    library ::
+   *       A handle to the library the module is part of.
+   *
+   *    module_name ::
+   *       The module name.
+   *
+   *    property_name ::
+   *       The property name.  Properties are described in the `Synopsis'
+   *       subsection of the module's documentation.
+   *
+   *       Note that only a few modules have properties.
+   *
+   *    value ::
+   *       A generic pointer to a variable or structure which gives the new
+   *       value of the property.  The exact definition of `value' is
+   *       dependent on the property; see the `Synopsis' subsection of the
+   *       module's documentation.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *    If `module_name' isn't a valid module name, or `property_name'
+   *    doesn't specify a valid property, or if `value' doesn't represent a
+   *    valid value for the given property, an error is returned.
+   *
+   *    The following example sets property `bar' (a simple integer) in
+   *    module `foo' to value~1.
+   *
+   *    {
+   *      FT_UInt  bar;
+   *
+   *
+   *      bar = 1;
+   *      FT_Property_Set( library, "foo", "bar", &bar );
+   *    }
+   *
+   *    Note that the FreeType Cache sub-system doesn't recognize module
+   *    property changes.  To avoid glyph lookup confusion within the cache
+   *    you should call @FTC_Manager_Reset to completely flush the cache if
+   *    a module property gets changed after @FTC_Manager_New has been
+   *    called.
+   *
+   *    It is not possible to set properties of the FreeType Cache
+   *    sub-system itself with FT_Property_Set; use @FTC_Property_Set
+   *    instead.
+   *
+   *  @since:
+   *    2.4.11
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Property_Set( FT_Library        library,
+                   const FT_String*  module_name,
+                   const FT_String*  property_name,
+                   const void*       value );
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Property_Get
+   *
+   * @description:
+   *    Get a module's property value.
+   *
+   * @input:
+   *    library ::
+   *       A handle to the library the module is part of.
+   *
+   *    module_name ::
+   *       The module name.
+   *
+   *    property_name ::
+   *       The property name.  Properties are described in the `Synopsis'
+   *       subsection of the module's documentation.
+   *
+   * @inout:
+   *    value ::
+   *       A generic pointer to a variable or structure which gives the
+   *       value of the property.  The exact definition of `value' is
+   *       dependent on the property; see the `Synopsis' subsection of the
+   *       module's documentation.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *    If `module_name' isn't a valid module name, or `property_name'
+   *    doesn't specify a valid property, or if `value' doesn't represent a
+   *    valid value for the given property, an error is returned.
+   *
+   *    The following example gets property `baz' (a range) in module `foo'.
+   *
+   *    {
+   *      typedef  range_
+   *      {
+   *        FT_Int32  min;
+   *        FT_Int32  max;
+   *
+   *      } range;
+   *
+   *      range  baz;
+   *
+   *
+   *      FT_Property_Get( library, "foo", "baz", &baz );
+   *    }
+   *
+   *    It is not possible to retrieve properties of the FreeType Cache
+   *    sub-system with FT_Property_Get; use @FTC_Property_Get instead.
+   *
+   *  @since:
+   *    2.4.11
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Property_Get( FT_Library        library,
+                   const FT_String*  module_name,
+                   const FT_String*  property_name,
+                   void*             value );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Reference_Library                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A counter gets initialized to~1 at the time an @FT_Library         */
+  /*    structure is created.  This function increments the counter.       */
+  /*    @FT_Done_Library then only destroys a library if the counter is~1, */
+  /*    otherwise it simply decrements the counter.                        */
+  /*                                                                       */
+  /*    This function helps in managing life-cycles of structures which    */
+  /*    reference @FT_Library objects.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a target library object.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.4.2                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Reference_Library( FT_Library  library );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Library                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to create a new FreeType library instance    */
+  /*    from a given memory object.  It is thus possible to use libraries  */
+  /*    with distinct memory allocators within the same program.           */
+  /*                                                                       */
+  /*    Normally, you would call this function (followed by a call to      */
+  /*    @FT_Add_Default_Modules or a series of calls to @FT_Add_Module)    */
+  /*    instead of @FT_Init_FreeType to initialize the FreeType library.   */
+  /*                                                                       */
+  /*    Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a      */
+  /*    library instance.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory   :: A handle to the original memory object.                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    alibrary :: A pointer to handle of a new library object.           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    See the discussion of reference counters in the description of     */
+  /*    @FT_Reference_Library.                                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Library( FT_Memory    memory,
+                  FT_Library  *alibrary );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Library                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discard a given library object.  This closes all drivers and       */
+  /*    discards all resource objects.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to the target library.                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    See the discussion of reference counters in the description of     */
+  /*    @FT_Reference_Library.                                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Done_Library( FT_Library  library );
+
+/* */
+
+  typedef void
+  (*FT_DebugHook_Func)( void*  arg );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Debug_Hook                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set a debug hook function for debugging the interpreter of a font  */
+  /*    format.                                                            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    hook_index :: The index of the debug hook.  You should use the     */
+  /*                  values defined in `ftobjs.h', e.g.,                  */
+  /*                  `FT_DEBUG_HOOK_TRUETYPE'.                            */
+  /*                                                                       */
+  /*    debug_hook :: The function used to debug the interpreter.          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Currently, four debug hook slots are available, but only two (for  */
+  /*    the TrueType and the Type~1 interpreter) are defined.              */
+  /*                                                                       */
+  /*    Since the internal headers of FreeType are no longer installed,    */
+  /*    the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly.      */
+  /*    This is a bug and will be fixed in a forthcoming release.          */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Set_Debug_Hook( FT_Library         library,
+                     FT_UInt            hook_index,
+                     FT_DebugHook_Func  debug_hook );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Add_Default_Modules                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Add the set of default drivers to a given library object.          */
+  /*    This is only useful when you create a library object with          */
+  /*    @FT_New_Library (usually to plug a custom memory manager).         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library :: A handle to a new library object.                       */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Add_Default_Modules( FT_Library  library );
+
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   truetype_engine
+   *
+   * @title:
+   *   The TrueType Engine
+   *
+   * @abstract:
+   *   TrueType bytecode support.
+   *
+   * @description:
+   *   This section contains a function used to query the level of TrueType
+   *   bytecode support compiled in this version of the library.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   *  @enum:
+   *     FT_TrueTypeEngineType
+   *
+   *  @description:
+   *     A list of values describing which kind of TrueType bytecode
+   *     engine is implemented in a given FT_Library instance.  It is used
+   *     by the @FT_Get_TrueType_Engine_Type function.
+   *
+   *  @values:
+   *     FT_TRUETYPE_ENGINE_TYPE_NONE ::
+   *       The library doesn't implement any kind of bytecode interpreter.
+   *
+   *     FT_TRUETYPE_ENGINE_TYPE_UNPATENTED ::
+   *       The library implements a bytecode interpreter that doesn't
+   *       support the patented operations of the TrueType virtual machine.
+   *
+   *       Its main use is to load certain Asian fonts which position and
+   *       scale glyph components with bytecode instructions.  It produces
+   *       bad output for most other fonts.
+   *
+   *     FT_TRUETYPE_ENGINE_TYPE_PATENTED ::
+   *       The library implements a bytecode interpreter that covers
+   *       the full instruction set of the TrueType virtual machine (this
+   *       was governed by patents until May 2010, hence the name).
+   *
+   *  @since:
+   *     2.2
+   *
+   */
+  typedef enum  FT_TrueTypeEngineType_
+  {
+    FT_TRUETYPE_ENGINE_TYPE_NONE = 0,
+    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,
+    FT_TRUETYPE_ENGINE_TYPE_PATENTED
+
+  } FT_TrueTypeEngineType;
+
+
+  /**************************************************************************
+   *
+   *  @func:
+   *     FT_Get_TrueType_Engine_Type
+   *
+   *  @description:
+   *     Return an @FT_TrueTypeEngineType value to indicate which level of
+   *     the TrueType virtual machine a given library instance supports.
+   *
+   *  @input:
+   *     library ::
+   *       A library instance.
+   *
+   *  @return:
+   *     A value indicating which level is supported.
+   *
+   *  @since:
+   *     2.2
+   *
+   */
+  FT_EXPORT( FT_TrueTypeEngineType )
+  FT_Get_TrueType_Engine_Type( FT_Library  library );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMODAPI_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftmoderr.h b/core/include/thirdparties/freetype/freetype/ftmoderr.h
new file mode 100644
index 0000000..4ca851e
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftmoderr.h
@@ -0,0 +1,194 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmoderr.h                                                             */
+/*                                                                         */
+/*    FreeType module error offsets (specification).                       */
+/*                                                                         */
+/*  Copyright 2001-2005, 2010, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the FreeType module error codes.          */
+  /*                                                                       */
+  /* If the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in `ftoption.h' is    */
+  /* set, the lower byte of an error value identifies the error code as    */
+  /* usual.  In addition, the higher byte identifies the module.  For      */
+  /* example, the error `FT_Err_Invalid_File_Format' has value 0x0003, the */
+  /* error `TT_Err_Invalid_File_Format' has value 0x1303, the error        */
+  /* `T1_Err_Invalid_File_Format' has value 0x1403, etc.                   */
+  /*                                                                       */
+  /* Note that `FT_Err_Ok', `TT_Err_Ok', etc. are always equal to zero,    */
+  /* including the high byte.                                              */
+  /*                                                                       */
+  /* If FT_CONFIG_OPTION_USE_MODULE_ERRORS isn't set, the higher byte of   */
+  /* an error value is set to zero.                                        */
+  /*                                                                       */
+  /* To hide the various `XXX_Err_' prefixes in the source code, FreeType  */
+  /* provides some macros in `fttypes.h'.                                  */
+  /*                                                                       */
+  /*   FT_ERR( err )                                                       */
+  /*     Add current error module prefix (as defined with the              */
+  /*     `FT_ERR_PREFIX' macro) to `err'.  For example, in the BDF module  */
+  /*     the line                                                          */
+  /*                                                                       */
+  /*       error = FT_ERR( Invalid_Outline );                              */
+  /*                                                                       */
+  /*     expands to                                                        */
+  /*                                                                       */
+  /*       error = BDF_Err_Invalid_Outline;                                */
+  /*                                                                       */
+  /*     For simplicity, you can always use `FT_Err_Ok' directly instead   */
+  /*     of `FT_ERR( Ok )'.                                                */
+  /*                                                                       */
+  /*   FT_ERR_EQ( errcode, err )                                           */
+  /*   FT_ERR_NEQ( errcode, err )                                          */
+  /*     Compare error code `errcode' with the error `err' for equality    */
+  /*     and inequality, respectively.  Example:                           */
+  /*                                                                       */
+  /*       if ( FT_ERR_EQ( error, Invalid_Outline ) )                      */
+  /*         ...                                                           */
+  /*                                                                       */
+  /*     Using this macro you don't have to think about error prefixes.    */
+  /*     Of course, if module errors are not active, the above example is  */
+  /*     the same as                                                       */
+  /*                                                                       */
+  /*       if ( error == FT_Err_Invalid_Outline )                          */
+  /*         ...                                                           */
+  /*                                                                       */
+  /*   FT_ERROR_BASE( errcode )                                            */
+  /*   FT_ERROR_MODULE( errcode )                                          */
+  /*     Get base error and module error code, respectively.               */
+  /*                                                                       */
+  /*                                                                       */
+  /* It can also be used to create a module error message table easily     */
+  /* with something like                                                   */
+  /*                                                                       */
+  /*   {                                                                   */
+  /*     #undef __FTMODERR_H__                                             */
+  /*     #define FT_MODERRDEF( e, v, s )  { FT_Mod_Err_ ## e, s },         */
+  /*     #define FT_MODERR_START_LIST     {                                */
+  /*     #define FT_MODERR_END_LIST       { 0, 0 } };                      */
+  /*                                                                       */
+  /*     const struct                                                      */
+  /*     {                                                                 */
+  /*       int          mod_err_offset;                                    */
+  /*       const char*  mod_err_msg                                        */
+  /*     } ft_mod_errors[] =                                               */
+  /*                                                                       */
+  /*     #include "ftmoderr.h"                                       */
+  /*   }                                                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTMODERR_H__
+#define __FTMODERR_H__
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                       SETUP MACROS                      *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#undef  FT_NEED_EXTERN_C
+
+#ifndef FT_MODERRDEF
+
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = v,
+#else
+#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = 0,
+#endif
+
+#define FT_MODERR_START_LIST  enum {
+#define FT_MODERR_END_LIST    FT_Mod_Err_Max };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+  extern "C" {
+#endif
+
+#endif /* !FT_MODERRDEF */
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****               LIST MODULE ERROR BASES                   *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#ifdef FT_MODERR_START_LIST
+  FT_MODERR_START_LIST
+#endif
+
+
+  FT_MODERRDEF( Base,      0x000, "base module" )
+  FT_MODERRDEF( Autofit,   0x100, "autofitter module" )
+  FT_MODERRDEF( BDF,       0x200, "BDF module" )
+  FT_MODERRDEF( Bzip2,     0x300, "Bzip2 module" )
+  FT_MODERRDEF( Cache,     0x400, "cache module" )
+  FT_MODERRDEF( CFF,       0x500, "CFF module" )
+  FT_MODERRDEF( CID,       0x600, "CID module" )
+  FT_MODERRDEF( Gzip,      0x700, "Gzip module" )
+  FT_MODERRDEF( LZW,       0x800, "LZW module" )
+  FT_MODERRDEF( OTvalid,   0x900, "OpenType validation module" )
+  FT_MODERRDEF( PCF,       0xA00, "PCF module" )
+  FT_MODERRDEF( PFR,       0xB00, "PFR module" )
+  FT_MODERRDEF( PSaux,     0xC00, "PS auxiliary module" )
+  FT_MODERRDEF( PShinter,  0xD00, "PS hinter module" )
+  FT_MODERRDEF( PSnames,   0xE00, "PS names module" )
+  FT_MODERRDEF( Raster,    0xF00, "raster module" )
+  FT_MODERRDEF( SFNT,     0x1000, "SFNT module" )
+  FT_MODERRDEF( Smooth,   0x1100, "smooth raster module" )
+  FT_MODERRDEF( TrueType, 0x1200, "TrueType module" )
+  FT_MODERRDEF( Type1,    0x1300, "Type 1 module" )
+  FT_MODERRDEF( Type42,   0x1400, "Type 42 module" )
+  FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" )
+  FT_MODERRDEF( GXvalid,  0x1600, "GX validation module" )
+
+
+#ifdef FT_MODERR_END_LIST
+  FT_MODERR_END_LIST
+#endif
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                      CLEANUP                            *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#ifdef FT_NEED_EXTERN_C
+  }
+#endif
+
+#undef FT_MODERR_START_LIST
+#undef FT_MODERR_END_LIST
+#undef FT_MODERRDEF
+#undef FT_NEED_EXTERN_C
+
+
+#endif /* __FTMODERR_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftotval.h b/core/include/thirdparties/freetype/freetype/ftotval.h
new file mode 100644
index 0000000..e33e307
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftotval.h
@@ -0,0 +1,203 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftotval.h                                                              */
+/*                                                                         */
+/*    FreeType API for validating OpenType tables (specification).         */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006, 2007 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/*                                                                         */
+/* Warning: This module might be moved to a different library in the       */
+/*          future to avoid a tight dependency between FreeType and the    */
+/*          OpenType specification.                                        */
+/*                                                                         */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTOTVAL_H__
+#define __FTOTVAL_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    ot_validation                                                      */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    OpenType Validation                                                */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    An API to validate OpenType tables.                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of functions to validate     */
+  /*    some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+ /**********************************************************************
+  *
+  * @enum:
+  *    FT_VALIDATE_OTXXX
+  *
+  * @description:
+  *    A list of bit-field constants used with @FT_OpenType_Validate to
+  *    indicate which OpenType tables should be validated.
+  *
+  * @values:
+  *    FT_VALIDATE_BASE ::
+  *      Validate BASE table.
+  *
+  *    FT_VALIDATE_GDEF ::
+  *      Validate GDEF table.
+  *
+  *    FT_VALIDATE_GPOS ::
+  *      Validate GPOS table.
+  *
+  *    FT_VALIDATE_GSUB ::
+  *      Validate GSUB table.
+  *
+  *    FT_VALIDATE_JSTF ::
+  *      Validate JSTF table.
+  *
+  *    FT_VALIDATE_MATH ::
+  *      Validate MATH table.
+  *
+  *    FT_VALIDATE_OT ::
+  *      Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).
+  *
+  */
+#define FT_VALIDATE_BASE  0x0100
+#define FT_VALIDATE_GDEF  0x0200
+#define FT_VALIDATE_GPOS  0x0400
+#define FT_VALIDATE_GSUB  0x0800
+#define FT_VALIDATE_JSTF  0x1000
+#define FT_VALIDATE_MATH  0x2000
+
+#define FT_VALIDATE_OT  FT_VALIDATE_BASE | \
+                        FT_VALIDATE_GDEF | \
+                        FT_VALIDATE_GPOS | \
+                        FT_VALIDATE_GSUB | \
+                        FT_VALIDATE_JSTF | \
+                        FT_VALIDATE_MATH
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_OpenType_Validate
+  *
+  * @description:
+  *    Validate various OpenType tables to assure that all offsets and
+  *    indices are valid.  The idea is that a higher-level library which
+  *    actually does the text layout can access those tables without
+  *    error checking (which can be quite time consuming).
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    validation_flags ::
+  *       A bit field which specifies the tables to be validated.  See
+  *       @FT_VALIDATE_OTXXX for possible values.
+  *
+  * @output:
+  *    BASE_table ::
+  *       A pointer to the BASE table.
+  *
+  *    GDEF_table ::
+  *       A pointer to the GDEF table.
+  *
+  *    GPOS_table ::
+  *       A pointer to the GPOS table.
+  *
+  *    GSUB_table ::
+  *       A pointer to the GSUB table.
+  *
+  *    JSTF_table ::
+  *       A pointer to the JSTF table.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   This function only works with OpenType fonts, returning an error
+  *   otherwise.
+  *
+  *   After use, the application should deallocate the five tables with
+  *   @FT_OpenType_Free.  A NULL value indicates that the table either
+  *   doesn't exist in the font, or the application hasn't asked for
+  *   validation.
+  */
+  FT_EXPORT( FT_Error )
+  FT_OpenType_Validate( FT_Face    face,
+                        FT_UInt    validation_flags,
+                        FT_Bytes  *BASE_table,
+                        FT_Bytes  *GDEF_table,
+                        FT_Bytes  *GPOS_table,
+                        FT_Bytes  *GSUB_table,
+                        FT_Bytes  *JSTF_table );
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_OpenType_Free
+  *
+  * @description:
+  *    Free the buffer allocated by OpenType validator.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    table ::
+  *       The pointer to the buffer that is allocated by
+  *       @FT_OpenType_Validate.
+  *
+  * @note:
+  *   This function must be used to free the buffer allocated by
+  *   @FT_OpenType_Validate only.
+  */
+  FT_EXPORT( void )
+  FT_OpenType_Free( FT_Face   face,
+                    FT_Bytes  table );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTOTVAL_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftoutln.h b/core/include/thirdparties/freetype/freetype/ftoutln.h
new file mode 100644
index 0000000..ca94947
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftoutln.h
@@ -0,0 +1,560 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftoutln.h                                                              */
+/*                                                                         */
+/*    Support for the FT_Outline type used to store glyph shapes of        */
+/*    most scalable font formats (specification).                          */
+/*                                                                         */
+/*  Copyright 1996-2003, 2005-2012 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTOUTLN_H__
+#define __FTOUTLN_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    outline_processing                                                 */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Outline Processing                                                 */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Functions to create, transform, and render vectorial glyph images. */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains routines used to create and destroy scalable */
+  /*    glyph images known as `outlines'.  These can also be measured,     */
+  /*    transformed, and converted into bitmaps and pixmaps.               */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_Outline                                                         */
+  /*    FT_OUTLINE_FLAGS                                                   */
+  /*    FT_Outline_New                                                     */
+  /*    FT_Outline_Done                                                    */
+  /*    FT_Outline_Copy                                                    */
+  /*    FT_Outline_Translate                                               */
+  /*    FT_Outline_Transform                                               */
+  /*    FT_Outline_Embolden                                                */
+  /*    FT_Outline_EmboldenXY                                              */
+  /*    FT_Outline_Reverse                                                 */
+  /*    FT_Outline_Check                                                   */
+  /*                                                                       */
+  /*    FT_Outline_Get_CBox                                                */
+  /*    FT_Outline_Get_BBox                                                */
+  /*                                                                       */
+  /*    FT_Outline_Get_Bitmap                                              */
+  /*    FT_Outline_Render                                                  */
+  /*                                                                       */
+  /*    FT_Outline_Decompose                                               */
+  /*    FT_Outline_Funcs                                                   */
+  /*    FT_Outline_MoveTo_Func                                             */
+  /*    FT_Outline_LineTo_Func                                             */
+  /*    FT_Outline_ConicTo_Func                                            */
+  /*    FT_Outline_CubicTo_Func                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Decompose                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Walk over an outline's structure to decompose it into individual   */
+  /*    segments and Bézier arcs.  This function also emits `move to'      */
+  /*    operations to indicate the start of new contours in the outline.   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline        :: A pointer to the source target.                  */
+  /*                                                                       */
+  /*    func_interface :: A table of `emitters', i.e., function pointers   */
+  /*                      called during decomposition to indicate path     */
+  /*                      operations.                                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    user           :: A typeless pointer which is passed to each       */
+  /*                      emitter during the decomposition.  It can be     */
+  /*                      used to store the state during the               */
+  /*                      decomposition.                                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Decompose( FT_Outline*              outline,
+                        const FT_Outline_Funcs*  func_interface,
+                        void*                    user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_New                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new outline of a given size.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library     :: A handle to the library object from where the       */
+  /*                   outline is allocated.  Note however that the new    */
+  /*                   outline will *not* necessarily be *freed*, when     */
+  /*                   destroying the library, by @FT_Done_FreeType.       */
+  /*                                                                       */
+  /*    numPoints   :: The maximum number of points within the outline.    */
+  /*                   Must be smaller than or equal to 0xFFFF (65535).    */
+  /*                                                                       */
+  /*    numContours :: The maximum number of contours within the outline.  */
+  /*                   This value must be in the range 0 to `numPoints'.   */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    anoutline   :: A handle to the new outline.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The reason why this function takes a `library' parameter is simply */
+  /*    to use the library's memory allocator.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_New( FT_Library   library,
+                  FT_UInt      numPoints,
+                  FT_Int       numContours,
+                  FT_Outline  *anoutline );
+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_New_Internal( FT_Memory    memory,
+                           FT_UInt      numPoints,
+                           FT_Int       numContours,
+                           FT_Outline  *anoutline );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Done                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy an outline created with @FT_Outline_New.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle of the library object used to allocate the     */
+  /*               outline.                                                */
+  /*                                                                       */
+  /*    outline :: A pointer to the outline object to be discarded.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If the outline's `owner' field is not set, only the outline        */
+  /*    descriptor will be released.                                       */
+  /*                                                                       */
+  /*    The reason why this function takes an `library' parameter is       */
+  /*    simply to use ft_mem_free().                                       */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Done( FT_Library   library,
+                   FT_Outline*  outline );
+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_Done_Internal( FT_Memory    memory,
+                            FT_Outline*  outline );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Check                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Check the contents of an outline descriptor.                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline :: A handle to a source outline.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Check( FT_Outline*  outline );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Get_CBox                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return an outline's `control box'.  The control box encloses all   */
+  /*    the outline's points, including Bézier control points.  Though it  */
+  /*    coincides with the exact bounding box for most glyphs, it can be   */
+  /*    slightly larger in some situations (like when rotating an outline  */
+  /*    which contains Bézier outside arcs).                               */
+  /*                                                                       */
+  /*    Computing the control box is very fast, while getting the bounding */
+  /*    box can take much more time as it needs to walk over all segments  */
+  /*    and arcs in the outline.  To get the latter, you can use the       */
+  /*    `ftbbox' component which is dedicated to this single task.         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline :: A pointer to the source outline descriptor.             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acbox   :: The outline's control box.                              */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    See @FT_Glyph_Get_CBox for a discussion of tricky fonts.           */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Outline_Get_CBox( const FT_Outline*  outline,
+                       FT_BBox           *acbox );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Translate                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Apply a simple translation to the points of an outline.            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    outline :: A pointer to the target outline descriptor.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    xOffset :: The horizontal offset.                                  */
+  /*                                                                       */
+  /*    yOffset :: The vertical offset.                                    */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Outline_Translate( const FT_Outline*  outline,
+                        FT_Pos             xOffset,
+                        FT_Pos             yOffset );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Copy                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Copy an outline into another one.  Both objects must have the      */
+  /*    same sizes (number of points & number of contours) when this       */
+  /*    function is called.                                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    source :: A handle to the source outline.                          */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    target :: A handle to the target outline.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Copy( const FT_Outline*  source,
+                   FT_Outline        *target );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Transform                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Apply a simple 2x2 matrix to all of an outline's points.  Useful   */
+  /*    for applying rotations, slanting, flipping, etc.                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    outline :: A pointer to the target outline descriptor.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    matrix  :: A pointer to the transformation matrix.                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You can use @FT_Outline_Translate if you need to translate the     */
+  /*    outline's points.                                                  */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Outline_Transform( const FT_Outline*  outline,
+                        const FT_Matrix*   matrix );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Embolden                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Embolden an outline.  The new outline will be at most 4~times      */
+  /*    `strength' pixels wider and higher.  You may think of the left and */
+  /*    bottom borders as unchanged.                                       */
+  /*                                                                       */
+  /*    Negative `strength' values to reduce the outline thickness are     */
+  /*    possible also.                                                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    outline  :: A handle to the target outline.                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    strength :: How strong the glyph is emboldened.  Expressed in      */
+  /*                26.6 pixel format.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The used algorithm to increase or decrease the thickness of the    */
+  /*    glyph doesn't change the number of points; this means that certain */
+  /*    situations like acute angles or intersections are sometimes        */
+  /*    handled incorrectly.                                               */
+  /*                                                                       */
+  /*    If you need `better' metrics values you should call                */
+  /*    @FT_Outline_Get_CBox or @FT_Outline_Get_BBox.                      */
+  /*                                                                       */
+  /*    Example call:                                                      */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      FT_Load_Glyph( face, index, FT_LOAD_DEFAULT );                   */
+  /*      if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE )             */
+  /*        FT_Outline_Embolden( &face->slot->outline, strength );         */
+  /*    }                                                                  */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Embolden( FT_Outline*  outline,
+                       FT_Pos       strength );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_EmboldenXY                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Embolden an outline.  The new outline will be `xstrength' pixels   */
+  /*    wider and `ystrength' pixels higher.  Otherwise, it is similar to  */
+  /*    @FT_Outline_Embolden, which uses the same strength in both         */
+  /*    directions.                                                        */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_EmboldenXY( FT_Outline*  outline,
+                         FT_Pos       xstrength,
+                         FT_Pos       ystrength );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Reverse                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Reverse the drawing direction of an outline.  This is used to      */
+  /*    ensure consistent fill conventions for mirrored glyphs.            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    outline :: A pointer to the target outline descriptor.             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in     */
+  /*    the outline's `flags' field.                                       */
+  /*                                                                       */
+  /*    It shouldn't be used by a normal client application, unless it     */
+  /*    knows what it is doing.                                            */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Outline_Reverse( FT_Outline*  outline );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Get_Bitmap                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Render an outline within a bitmap.  The outline's image is simply  */
+  /*    OR-ed to the target bitmap.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a FreeType library object.                  */
+  /*                                                                       */
+  /*    outline :: A pointer to the source outline descriptor.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    abitmap :: A pointer to the target bitmap descriptor.              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function does NOT CREATE the bitmap, it only renders an       */
+  /*    outline image within the one you pass to it!  Consequently, the    */
+  /*    various fields in `abitmap' should be set accordingly.             */
+  /*                                                                       */
+  /*    It will use the raster corresponding to the default glyph format.  */
+  /*                                                                       */
+  /*    The value of the `num_grays' field in `abitmap' is ignored.  If    */
+  /*    you select the gray-level rasterizer, and you want less than 256   */
+  /*    gray levels, you have to use @FT_Outline_Render directly.          */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Get_Bitmap( FT_Library        library,
+                         FT_Outline*       outline,
+                         const FT_Bitmap  *abitmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Render                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Render an outline within a bitmap using the current scan-convert.  */
+  /*    This function uses an @FT_Raster_Params structure as an argument,  */
+  /*    allowing advanced features like direct composition, translucency,  */
+  /*    etc.                                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a FreeType library object.                  */
+  /*                                                                       */
+  /*    outline :: A pointer to the source outline descriptor.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    params  :: A pointer to an @FT_Raster_Params structure used to     */
+  /*               describe the rendering operation.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You should know what you are doing and how @FT_Raster_Params works */
+  /*    to use this function.                                              */
+  /*                                                                       */
+  /*    The field `params.source' will be set to `outline' before the scan */
+  /*    converter is called, which means that the value you give to it is  */
+  /*    actually ignored.                                                  */
+  /*                                                                       */
+  /*    The gray-level rasterizer always uses 256 gray levels.  If you     */
+  /*    want less gray levels, you have to provide your own span callback. */
+  /*    See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the   */
+  /*    @FT_Raster_Params structure for more details.                      */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Render( FT_Library         library,
+                     FT_Outline*        outline,
+                     FT_Raster_Params*  params );
+
+
+ /**************************************************************************
+  *
+  * @enum:
+  *   FT_Orientation
+  *
+  * @description:
+  *   A list of values used to describe an outline's contour orientation.
+  *
+  *   The TrueType and PostScript specifications use different conventions
+  *   to determine whether outline contours should be filled or unfilled.
+  *
+  * @values:
+  *   FT_ORIENTATION_TRUETYPE ::
+  *     According to the TrueType specification, clockwise contours must
+  *     be filled, and counter-clockwise ones must be unfilled.
+  *
+  *   FT_ORIENTATION_POSTSCRIPT ::
+  *     According to the PostScript specification, counter-clockwise contours
+  *     must be filled, and clockwise ones must be unfilled.
+  *
+  *   FT_ORIENTATION_FILL_RIGHT ::
+  *     This is identical to @FT_ORIENTATION_TRUETYPE, but is used to
+  *     remember that in TrueType, everything that is to the right of
+  *     the drawing direction of a contour must be filled.
+  *
+  *   FT_ORIENTATION_FILL_LEFT ::
+  *     This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to
+  *     remember that in PostScript, everything that is to the left of
+  *     the drawing direction of a contour must be filled.
+  *
+  *   FT_ORIENTATION_NONE ::
+  *     The orientation cannot be determined.  That is, different parts of
+  *     the glyph have different orientation.
+  *
+  */
+  typedef enum  FT_Orientation_
+  {
+    FT_ORIENTATION_TRUETYPE   = 0,
+    FT_ORIENTATION_POSTSCRIPT = 1,
+    FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,
+    FT_ORIENTATION_FILL_LEFT  = FT_ORIENTATION_POSTSCRIPT,
+    FT_ORIENTATION_NONE
+
+  } FT_Orientation;
+
+
+ /**************************************************************************
+  *
+  * @function:
+  *   FT_Outline_Get_Orientation
+  *
+  * @description:
+  *   This function analyzes a glyph outline and tries to compute its
+  *   fill orientation (see @FT_Orientation).  This is done by computing
+  *   the direction of each global horizontal and/or vertical extrema
+  *   within the outline.
+  *
+  *   Note that this will return @FT_ORIENTATION_TRUETYPE for empty
+  *   outlines.
+  *
+  * @input:
+  *   outline ::
+  *     A handle to the source outline.
+  *
+  * @return:
+  *   The orientation.
+  *
+  */
+  FT_EXPORT( FT_Orientation )
+  FT_Outline_Get_Orientation( FT_Outline*  outline );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTOUTLN_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/include/thirdparties/freetype/freetype/ftpfr.h b/core/include/thirdparties/freetype/freetype/ftpfr.h
new file mode 100644
index 0000000..62cd67e
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftpfr.h
@@ -0,0 +1,172 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpfr.h                                                                */
+/*                                                                         */
+/*    FreeType API for accessing PFR-specific data (specification only).   */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2006, 2008, 2009 by                        */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTPFR_H__
+#define __FTPFR_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    pfr_fonts                                                          */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    PFR Fonts                                                          */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    PFR/TrueDoc specific API.                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of PFR-specific functions.   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_PFR_Metrics
+  *
+  * @description:
+  *    Return the outline and metrics resolutions of a given PFR face.
+  *
+  * @input:
+  *    face :: Handle to the input face.  It can be a non-PFR face.
+  *
+  * @output:
+  *    aoutline_resolution ::
+  *      Outline resolution.  This is equivalent to `face->units_per_EM'
+  *      for non-PFR fonts.  Optional (parameter can be NULL).
+  *
+  *    ametrics_resolution ::
+  *      Metrics resolution.  This is equivalent to `outline_resolution'
+  *      for non-PFR fonts.  Optional (parameter can be NULL).
+  *
+  *    ametrics_x_scale ::
+  *      A 16.16 fixed-point number used to scale distance expressed
+  *      in metrics units to device sub-pixels.  This is equivalent to
+  *      `face->size->x_scale', but for metrics only.  Optional (parameter
+  *      can be NULL).
+  *
+  *    ametrics_y_scale ::
+  *      Same as `ametrics_x_scale' but for the vertical direction.
+  *      optional (parameter can be NULL).
+  *
+  * @return:
+  *    FreeType error code.  0~means success.
+  *
+  * @note:
+  *   If the input face is not a PFR, this function will return an error.
+  *   However, in all cases, it will return valid values.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_PFR_Metrics( FT_Face    face,
+                      FT_UInt   *aoutline_resolution,
+                      FT_UInt   *ametrics_resolution,
+                      FT_Fixed  *ametrics_x_scale,
+                      FT_Fixed  *ametrics_y_scale );
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_PFR_Kerning
+  *
+  * @description:
+  *    Return the kerning pair corresponding to two glyphs in a PFR face.
+  *    The distance is expressed in metrics units, unlike the result of
+  *    @FT_Get_Kerning.
+  *
+  * @input:
+  *    face  :: A handle to the input face.
+  *
+  *    left  :: Index of the left glyph.
+  *
+  *    right :: Index of the right glyph.
+  *
+  * @output:
+  *    avector :: A kerning vector.
+  *
+  * @return:
+  *    FreeType error code.  0~means success.
+  *
+  * @note:
+  *    This function always return distances in original PFR metrics
+  *    units.  This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED
+  *    mode, which always returns distances converted to outline units.
+  *
+  *    You can use the value of the `x_scale' and `y_scale' parameters
+  *    returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_PFR_Kerning( FT_Face     face,
+                      FT_UInt     left,
+                      FT_UInt     right,
+                      FT_Vector  *avector );
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_PFR_Advance
+  *
+  * @description:
+  *    Return a given glyph advance, expressed in original metrics units,
+  *    from a PFR font.
+  *
+  * @input:
+  *    face   :: A handle to the input face.
+  *
+  *    gindex :: The glyph index.
+  *
+  * @output:
+  *    aadvance :: The glyph advance in metrics units.
+  *
+  * @return:
+  *    FreeType error code.  0~means success.
+  *
+  * @note:
+  *    You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics
+  *    to convert the advance to device sub-pixels (i.e., 1/64th of pixels).
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_PFR_Advance( FT_Face   face,
+                      FT_UInt   gindex,
+                      FT_Pos   *aadvance );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTPFR_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftrender.h b/core/include/thirdparties/freetype/freetype/ftrender.h
new file mode 100644
index 0000000..b1437df
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftrender.h
@@ -0,0 +1,238 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftrender.h                                                             */
+/*                                                                         */
+/*    FreeType renderer modules public interface (specification).          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2005, 2006, 2010 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTRENDER_H__
+#define __FTRENDER_H__
+
+
+#include "../ft2build.h"
+#include "ftmodapi.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    module_management                                                  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* create a new glyph object */
+  typedef FT_Error
+  (*FT_Glyph_InitFunc)( FT_Glyph      glyph,
+                        FT_GlyphSlot  slot );
+
+  /* destroys a given glyph object */
+  typedef void
+  (*FT_Glyph_DoneFunc)( FT_Glyph  glyph );
+
+  typedef void
+  (*FT_Glyph_TransformFunc)( FT_Glyph          glyph,
+                             const FT_Matrix*  matrix,
+                             const FT_Vector*  delta );
+
+  typedef void
+  (*FT_Glyph_GetBBoxFunc)( FT_Glyph  glyph,
+                           FT_BBox*  abbox );
+
+  typedef FT_Error
+  (*FT_Glyph_CopyFunc)( FT_Glyph   source,
+                        FT_Glyph   target );
+
+  typedef FT_Error
+  (*FT_Glyph_PrepareFunc)( FT_Glyph      glyph,
+                           FT_GlyphSlot  slot );
+
+/* deprecated */
+#define FT_Glyph_Init_Func       FT_Glyph_InitFunc
+#define FT_Glyph_Done_Func       FT_Glyph_DoneFunc
+#define FT_Glyph_Transform_Func  FT_Glyph_TransformFunc
+#define FT_Glyph_BBox_Func       FT_Glyph_GetBBoxFunc
+#define FT_Glyph_Copy_Func       FT_Glyph_CopyFunc
+#define FT_Glyph_Prepare_Func    FT_Glyph_PrepareFunc
+
+
+  struct  FT_Glyph_Class_
+  {
+    FT_Long                 glyph_size;
+    FT_Glyph_Format         glyph_format;
+    FT_Glyph_InitFunc       glyph_init;
+    FT_Glyph_DoneFunc       glyph_done;
+    FT_Glyph_CopyFunc       glyph_copy;
+    FT_Glyph_TransformFunc  glyph_transform;
+    FT_Glyph_GetBBoxFunc    glyph_bbox;
+    FT_Glyph_PrepareFunc    glyph_prepare;
+  };
+
+
+  typedef FT_Error
+  (*FT_Renderer_RenderFunc)( FT_Renderer       renderer,
+                             FT_GlyphSlot      slot,
+                             FT_UInt           mode,
+                             const FT_Vector*  origin );
+
+  typedef FT_Error
+  (*FT_Renderer_TransformFunc)( FT_Renderer       renderer,
+                                FT_GlyphSlot      slot,
+                                const FT_Matrix*  matrix,
+                                const FT_Vector*  delta );
+
+
+  typedef void
+  (*FT_Renderer_GetCBoxFunc)( FT_Renderer   renderer,
+                              FT_GlyphSlot  slot,
+                              FT_BBox*      cbox );
+
+
+  typedef FT_Error
+  (*FT_Renderer_SetModeFunc)( FT_Renderer  renderer,
+                              FT_ULong     mode_tag,
+                              FT_Pointer   mode_ptr );
+
+/* deprecated identifiers */
+#define FTRenderer_render  FT_Renderer_RenderFunc
+#define FTRenderer_transform  FT_Renderer_TransformFunc
+#define FTRenderer_getCBox  FT_Renderer_GetCBoxFunc
+#define FTRenderer_setMode  FT_Renderer_SetModeFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Renderer_Class                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The renderer module class descriptor.                              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root            :: The root @FT_Module_Class fields.               */
+  /*                                                                       */
+  /*    glyph_format    :: The glyph image format this renderer handles.   */
+  /*                                                                       */
+  /*    render_glyph    :: A method used to render the image that is in a  */
+  /*                       given glyph slot into a bitmap.                 */
+  /*                                                                       */
+  /*    transform_glyph :: A method used to transform the image that is in */
+  /*                       a given glyph slot.                             */
+  /*                                                                       */
+  /*    get_glyph_cbox  :: A method used to access the glyph's cbox.       */
+  /*                                                                       */
+  /*    set_mode        :: A method used to pass additional parameters.    */
+  /*                                                                       */
+  /*    raster_class    :: For @FT_GLYPH_FORMAT_OUTLINE renderers only.    */
+  /*                       This is a pointer to its raster's class.        */
+  /*                                                                       */
+  typedef struct  FT_Renderer_Class_
+  {
+    FT_Module_Class            root;
+
+    FT_Glyph_Format            glyph_format;
+
+    FT_Renderer_RenderFunc     render_glyph;
+    FT_Renderer_TransformFunc  transform_glyph;
+    FT_Renderer_GetCBoxFunc    get_glyph_cbox;
+    FT_Renderer_SetModeFunc    set_mode;
+
+    FT_Raster_Funcs*           raster_class;
+
+  } FT_Renderer_Class;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Renderer                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the current renderer for a given glyph format.            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to the library object.                         */
+  /*                                                                       */
+  /*    format  :: The glyph format.                                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A renderer handle.  0~if none found.                               */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    An error will be returned if a module already exists by that name, */
+  /*    or if the module requires a version of FreeType that is too great. */
+  /*                                                                       */
+  /*    To add a new renderer, simply use @FT_Add_Module.  To retrieve a   */
+  /*    renderer by its name, use @FT_Get_Module.                          */
+  /*                                                                       */
+  FT_EXPORT( FT_Renderer )
+  FT_Get_Renderer( FT_Library       library,
+                   FT_Glyph_Format  format );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Renderer                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set the current renderer to use, and set additional mode.          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    renderer   :: A handle to the renderer object.                     */
+  /*                                                                       */
+  /*    num_params :: The number of additional parameters.                 */
+  /*                                                                       */
+  /*    parameters :: Additional parameters.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    In case of success, the renderer will be used to convert glyph     */
+  /*    images in the renderer's known format into bitmaps.                */
+  /*                                                                       */
+  /*    This doesn't change the current renderer for other formats.        */
+  /*                                                                       */
+  /*    Currently, only the B/W renderer, if compiled with                 */
+  /*    FT_RASTER_OPTION_ANTI_ALIASING (providing a 5-levels               */
+  /*    anti-aliasing mode; this option must be set directly in            */
+  /*    `ftraster.c' and is undefined by default) accepts a single tag     */
+  /*    `pal5' to set its gray palette as a character string with          */
+  /*    5~elements.  Consequently, the third and fourth argument are zero  */
+  /*    normally.                                                          */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Renderer( FT_Library     library,
+                   FT_Renderer    renderer,
+                   FT_UInt        num_params,
+                   FT_Parameter*  parameters );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTRENDER_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftsizes.h b/core/include/thirdparties/freetype/freetype/ftsizes.h
new file mode 100644
index 0000000..a4b449b
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftsizes.h
@@ -0,0 +1,159 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsizes.h                                                              */
+/*                                                                         */
+/*    FreeType size objects management (specification).                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2004, 2006, 2009 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Typical application would normally not need to use these functions.   */
+  /* However, they have been placed in a public API for the rare cases     */
+  /* where they are needed.                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTSIZES_H__
+#define __FTSIZES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    sizes_management                                                   */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Size Management                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Managing multiple sizes per face.                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    When creating a new face object (e.g., with @FT_New_Face), an      */
+  /*    @FT_Size object is automatically created and used to store all     */
+  /*    pixel-size dependent information, available in the `face->size'    */
+  /*    field.                                                             */
+  /*                                                                       */
+  /*    It is however possible to create more sizes for a given face,      */
+  /*    mostly in order to manage several character pixel sizes of the     */
+  /*    same font family and style.  See @FT_New_Size and @FT_Done_Size.   */
+  /*                                                                       */
+  /*    Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only           */
+  /*    modify the contents of the current `active' size; you thus need    */
+  /*    to use @FT_Activate_Size to change it.                             */
+  /*                                                                       */
+  /*    99% of applications won't need the functions provided here,        */
+  /*    especially if they use the caching sub-system, so be cautious      */
+  /*    when using these.                                                  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Size                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new size object from a given face object.                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to a parent face object.                          */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    asize :: A handle to a new size object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You need to call @FT_Activate_Size in order to select the new size */
+  /*    for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size,      */
+  /*    @FT_Load_Glyph, @FT_Load_Char, etc.                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Size( FT_Face   face,
+               FT_Size*  size );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Size                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discard a given size object.  Note that @FT_Done_Face              */
+  /*    automatically discards all size objects allocated with             */
+  /*    @FT_New_Size.                                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size :: A handle to a target size object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Done_Size( FT_Size  size );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Activate_Size                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Even though it is possible to create several size objects for a    */
+  /*    given face (see @FT_New_Size for details), functions like          */
+  /*    @FT_Load_Glyph or @FT_Load_Char only use the one which has been    */
+  /*    activated last to determine the `current character pixel size'.    */
+  /*                                                                       */
+  /*    This function can be used to `activate' a previously created size  */
+  /*    object.                                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size :: A handle to a target size object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If `face' is the size's parent face object, this function changes  */
+  /*    the value of `face->size' to the input size handle.                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Activate_Size( FT_Size  size );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTSIZES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftsnames.h b/core/include/thirdparties/freetype/freetype/ftsnames.h
new file mode 100644
index 0000000..a13db81
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftsnames.h
@@ -0,0 +1,200 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsnames.h                                                             */
+/*                                                                         */
+/*    Simple interface to access SFNT name tables (which are used          */
+/*    to hold font names, copyright info, notices, etc.) (specification).  */
+/*                                                                         */
+/*    This is _not_ used to retrieve glyph names!                          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2006, 2009, 2010 by                   */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FT_SFNT_NAMES_H__
+#define __FT_SFNT_NAMES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    sfnt_names                                                         */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    SFNT Names                                                         */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Access the names embedded in TrueType and OpenType files.          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The TrueType and OpenType specifications allow the inclusion of    */
+  /*    a special `names table' in font files.  This table contains        */
+  /*    textual (and internationalized) information regarding the font,    */
+  /*    like family name, copyright, version, etc.                         */
+  /*                                                                       */
+  /*    The definitions below are used to access them if available.        */
+  /*                                                                       */
+  /*    Note that this has nothing to do with glyph names!                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_SfntName                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model an SFNT `name' table entry.              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    platform_id :: The platform ID for `string'.                       */
+  /*                                                                       */
+  /*    encoding_id :: The encoding ID for `string'.                       */
+  /*                                                                       */
+  /*    language_id :: The language ID for `string'.                       */
+  /*                                                                       */
+  /*    name_id     :: An identifier for `string'.                         */
+  /*                                                                       */
+  /*    string      :: The `name' string.  Note that its format differs    */
+  /*                   depending on the (platform,encoding) pair.  It can  */
+  /*                   be a Pascal String, a UTF-16 one, etc.              */
+  /*                                                                       */
+  /*                   Generally speaking, the string is not               */
+  /*                   zero-terminated.  Please refer to the TrueType      */
+  /*                   specification for details.                          */
+  /*                                                                       */
+  /*    string_len  :: The length of `string' in bytes.                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Possible values for `platform_id', `encoding_id', `language_id',   */
+  /*    and `name_id' are given in the file `ttnameid.h'.  For details     */
+  /*    please refer to the TrueType or OpenType specification.            */
+  /*                                                                       */
+  /*    See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX,       */
+  /*    @TT_ISO_ID_XXX, and @TT_MS_ID_XXX.                                 */
+  /*                                                                       */
+  typedef struct  FT_SfntName_
+  {
+    FT_UShort  platform_id;
+    FT_UShort  encoding_id;
+    FT_UShort  language_id;
+    FT_UShort  name_id;
+
+    FT_Byte*   string;      /* this string is *not* null-terminated! */
+    FT_UInt    string_len;  /* in bytes */
+
+  } FT_SfntName;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Sfnt_Name_Count                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the number of name strings in the SFNT `name' table.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source face.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The number of strings in the `name' table.                         */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt )
+  FT_Get_Sfnt_Name_Count( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Sfnt_Name                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve a string of the SFNT `name' table for a given index.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face  :: A handle to the source face.                              */
+  /*                                                                       */
+  /*    idx   :: The index of the `name' string.                           */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aname :: The indexed @FT_SfntName structure.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `string' array returned in the `aname' structure is not        */
+  /*    null-terminated.  The application should deallocate it if it is no */
+  /*    longer in use.                                                     */
+  /*                                                                       */
+  /*    Use @FT_Get_Sfnt_Name_Count to get the total number of available   */
+  /*    `name' table entries, then do a loop until you get the right       */
+  /*    platform, encoding, and name ID.                                   */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Sfnt_Name( FT_Face       face,
+                    FT_UInt       idx,
+                    FT_SfntName  *aname );
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY
+   *
+   * @description:
+   *   A constant used as the tag of @FT_Parameter structures to make
+   *   FT_Open_Face() ignore preferred family subfamily names in `name'
+   *   table since OpenType version 1.4.  For backwards compatibility with
+   *   legacy systems which has 4-face-per-family restriction.
+   *
+   */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 'f' )
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY
+   *
+   * @description:
+   *   A constant used as the tag of @FT_Parameter structures to make
+   *   FT_Open_Face() ignore preferred subfamily names in `name' table since
+   *   OpenType version 1.4.  For backwards compatibility with legacy
+   *   systems which has 4-face-per-family restriction.
+   *
+   */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 's' )
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FT_SFNT_NAMES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftstroke.h b/core/include/thirdparties/freetype/freetype/ftstroke.h
new file mode 100644
index 0000000..05f9a13
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftstroke.h
@@ -0,0 +1,751 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstroke.h                                                             */
+/*                                                                         */
+/*    FreeType path stroker (specification).                               */
+/*                                                                         */
+/*  Copyright 2002-2006, 2008, 2009, 2011-2012 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FT_STROKE_H__
+#define __FT_STROKE_H__
+
+#include "../ft2build.h"
+#include "ftoutln.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /************************************************************************
+  *
+  * @section:
+  *    glyph_stroker
+  *
+  * @title:
+  *    Glyph Stroker
+  *
+  * @abstract:
+  *    Generating bordered and stroked glyphs.
+  *
+  * @description:
+  *    This component generates stroked outlines of a given vectorial
+  *    glyph.  It also allows you to retrieve the `outside' and/or the
+  *    `inside' borders of the stroke.
+  *
+  *    This can be useful to generate `bordered' glyph, i.e., glyphs
+  *    displayed with a coloured (and anti-aliased) border around their
+  *    shape.
+  */
+
+
+ /**************************************************************
+  *
+  * @type:
+  *   FT_Stroker
+  *
+  * @description:
+  *   Opaque handler to a path stroker object.
+  */
+  typedef struct FT_StrokerRec_*  FT_Stroker;
+
+
+  /**************************************************************
+   *
+   * @enum:
+   *   FT_Stroker_LineJoin
+   *
+   * @description:
+   *   These values determine how two joining lines are rendered
+   *   in a stroker.
+   *
+   * @values:
+   *   FT_STROKER_LINEJOIN_ROUND ::
+   *     Used to render rounded line joins.  Circular arcs are used
+   *     to join two lines smoothly.
+   *
+   *   FT_STROKER_LINEJOIN_BEVEL ::
+   *     Used to render beveled line joins.  The outer corner of
+   *     the joined lines is filled by enclosing the triangular
+   *     region of the corner with a straight line between the
+   *     outer corners of each stroke.
+   *
+   *   FT_STROKER_LINEJOIN_MITER_FIXED ::
+   *     Used to render mitered line joins, with fixed bevels if the
+   *     miter limit is exceeded.  The outer edges of the strokes
+   *     for the two segments are extended until they meet at an
+   *     angle.  If the segments meet at too sharp an angle (such
+   *     that the miter would extend from the intersection of the
+   *     segments a distance greater than the product of the miter
+   *     limit value and the border radius), then a bevel join (see
+   *     above) is used instead.  This prevents long spikes being
+   *     created.  FT_STROKER_LINEJOIN_MITER_FIXED generates a miter
+   *     line join as used in PostScript and PDF.
+   *
+   *   FT_STROKER_LINEJOIN_MITER_VARIABLE ::
+   *   FT_STROKER_LINEJOIN_MITER ::
+   *     Used to render mitered line joins, with variable bevels if
+   *     the miter limit is exceeded.  The intersection of the
+   *     strokes is clipped at a line perpendicular to the bisector
+   *     of the angle between the strokes, at the distance from the
+   *     intersection of the segments equal to the product of the
+   *     miter limit value and the border radius.  This prevents
+   *     long spikes being created.
+   *     FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line
+   *     join as used in XPS.  FT_STROKER_LINEJOIN_MITER is an alias
+   *     for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for
+   *     backwards compatibility.
+   */
+  typedef enum  FT_Stroker_LineJoin_
+  {
+    FT_STROKER_LINEJOIN_ROUND          = 0,
+    FT_STROKER_LINEJOIN_BEVEL          = 1,
+    FT_STROKER_LINEJOIN_MITER_VARIABLE = 2,
+    FT_STROKER_LINEJOIN_MITER          = FT_STROKER_LINEJOIN_MITER_VARIABLE,
+    FT_STROKER_LINEJOIN_MITER_FIXED    = 3
+
+  } FT_Stroker_LineJoin;
+
+
+  /**************************************************************
+   *
+   * @enum:
+   *   FT_Stroker_LineCap
+   *
+   * @description:
+   *   These values determine how the end of opened sub-paths are
+   *   rendered in a stroke.
+   *
+   * @values:
+   *   FT_STROKER_LINECAP_BUTT ::
+   *     The end of lines is rendered as a full stop on the last
+   *     point itself.
+   *
+   *   FT_STROKER_LINECAP_ROUND ::
+   *     The end of lines is rendered as a half-circle around the
+   *     last point.
+   *
+   *   FT_STROKER_LINECAP_SQUARE ::
+   *     The end of lines is rendered as a square around the
+   *     last point.
+   */
+  typedef enum  FT_Stroker_LineCap_
+  {
+    FT_STROKER_LINECAP_BUTT = 0,
+    FT_STROKER_LINECAP_ROUND,
+    FT_STROKER_LINECAP_SQUARE
+
+  } FT_Stroker_LineCap;
+
+
+  /**************************************************************
+   *
+   * @enum:
+   *   FT_StrokerBorder
+   *
+   * @description:
+   *   These values are used to select a given stroke border
+   *   in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder.
+   *
+   * @values:
+   *   FT_STROKER_BORDER_LEFT ::
+   *     Select the left border, relative to the drawing direction.
+   *
+   *   FT_STROKER_BORDER_RIGHT ::
+   *     Select the right border, relative to the drawing direction.
+   *
+   * @note:
+   *   Applications are generally interested in the `inside' and `outside'
+   *   borders.  However, there is no direct mapping between these and the
+   *   `left' and `right' ones, since this really depends on the glyph's
+   *   drawing orientation, which varies between font formats.
+   *
+   *   You can however use @FT_Outline_GetInsideBorder and
+   *   @FT_Outline_GetOutsideBorder to get these.
+   */
+  typedef enum  FT_StrokerBorder_
+  {
+    FT_STROKER_BORDER_LEFT = 0,
+    FT_STROKER_BORDER_RIGHT
+
+  } FT_StrokerBorder;
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Outline_GetInsideBorder
+   *
+   * @description:
+   *   Retrieve the @FT_StrokerBorder value corresponding to the
+   *   `inside' borders of a given outline.
+   *
+   * @input:
+   *   outline ::
+   *     The source outline handle.
+   *
+   * @return:
+   *   The border index.  @FT_STROKER_BORDER_RIGHT for empty or invalid
+   *   outlines.
+   */
+  FT_EXPORT( FT_StrokerBorder )
+  FT_Outline_GetInsideBorder( FT_Outline*  outline );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Outline_GetOutsideBorder
+   *
+   * @description:
+   *   Retrieve the @FT_StrokerBorder value corresponding to the
+   *   `outside' borders of a given outline.
+   *
+   * @input:
+   *   outline ::
+   *     The source outline handle.
+   *
+   * @return:
+   *   The border index.  @FT_STROKER_BORDER_LEFT for empty or invalid
+   *   outlines.
+   */
+  FT_EXPORT( FT_StrokerBorder )
+  FT_Outline_GetOutsideBorder( FT_Outline*  outline );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_New
+   *
+   * @description:
+   *   Create a new stroker object.
+   *
+   * @input:
+   *   library ::
+   *     FreeType library handle.
+   *
+   * @output:
+   *   astroker ::
+   *     A new stroker object handle.  NULL in case of error.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_New( FT_Library   library,
+                  FT_Stroker  *astroker );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_Set
+   *
+   * @description:
+   *   Reset a stroker object's attributes.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   radius ::
+   *     The border radius.
+   *
+   *   line_cap ::
+   *     The line cap style.
+   *
+   *   line_join ::
+   *     The line join style.
+   *
+   *   miter_limit ::
+   *     The miter limit for the FT_STROKER_LINEJOIN_MITER_FIXED and
+   *     FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles,
+   *     expressed as 16.16 fixed-point value.
+   *
+   * @note:
+   *   The radius is expressed in the same units as the outline
+   *   coordinates.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_Set( FT_Stroker           stroker,
+                  FT_Fixed             radius,
+                  FT_Stroker_LineCap   line_cap,
+                  FT_Stroker_LineJoin  line_join,
+                  FT_Fixed             miter_limit );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_Rewind
+   *
+   * @description:
+   *   Reset a stroker object without changing its attributes.
+   *   You should call this function before beginning a new
+   *   series of calls to @FT_Stroker_BeginSubPath or
+   *   @FT_Stroker_EndSubPath.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_Rewind( FT_Stroker  stroker );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_ParseOutline
+   *
+   * @description:
+   *   A convenience function used to parse a whole outline with
+   *   the stroker.  The resulting outline(s) can be retrieved
+   *   later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   outline ::
+   *     The source outline.
+   *
+   *   opened ::
+   *     A boolean.  If~1, the outline is treated as an open path instead
+   *     of a closed one.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   If `opened' is~0 (the default), the outline is treated as a closed
+   *   path, and the stroker generates two distinct `border' outlines.
+   *
+   *   If `opened' is~1, the outline is processed as an open path, and the
+   *   stroker generates a single `stroke' outline.
+   *
+   *   This function calls @FT_Stroker_Rewind automatically.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_ParseOutline( FT_Stroker   stroker,
+                           FT_Outline*  outline,
+                           FT_Bool      opened );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_BeginSubPath
+   *
+   * @description:
+   *   Start a new sub-path in the stroker.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   to ::
+   *     A pointer to the start vector.
+   *
+   *   open ::
+   *     A boolean.  If~1, the sub-path is treated as an open one.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   This function is useful when you need to stroke a path that is
+   *   not stored as an @FT_Outline object.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_BeginSubPath( FT_Stroker  stroker,
+                           FT_Vector*  to,
+                           FT_Bool     open );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_EndSubPath
+   *
+   * @description:
+   *   Close the current sub-path in the stroker.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   You should call this function after @FT_Stroker_BeginSubPath.
+   *   If the subpath was not `opened', this function `draws' a
+   *   single line segment to the start position when needed.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_EndSubPath( FT_Stroker  stroker );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_LineTo
+   *
+   * @description:
+   *   `Draw' a single line segment in the stroker's current sub-path,
+   *   from the last position.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   to ::
+   *     A pointer to the destination point.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   You should call this function between @FT_Stroker_BeginSubPath and
+   *   @FT_Stroker_EndSubPath.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_LineTo( FT_Stroker  stroker,
+                     FT_Vector*  to );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_ConicTo
+   *
+   * @description:
+   *   `Draw' a single quadratic Bézier in the stroker's current sub-path,
+   *   from the last position.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   control ::
+   *     A pointer to a Bézier control point.
+   *
+   *   to ::
+   *     A pointer to the destination point.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   You should call this function between @FT_Stroker_BeginSubPath and
+   *   @FT_Stroker_EndSubPath.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_ConicTo( FT_Stroker  stroker,
+                      FT_Vector*  control,
+                      FT_Vector*  to );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_CubicTo
+   *
+   * @description:
+   *   `Draw' a single cubic Bézier in the stroker's current sub-path,
+   *   from the last position.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   control1 ::
+   *     A pointer to the first Bézier control point.
+   *
+   *   control2 ::
+   *     A pointer to second Bézier control point.
+   *
+   *   to ::
+   *     A pointer to the destination point.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   You should call this function between @FT_Stroker_BeginSubPath and
+   *   @FT_Stroker_EndSubPath.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_CubicTo( FT_Stroker  stroker,
+                      FT_Vector*  control1,
+                      FT_Vector*  control2,
+                      FT_Vector*  to );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_GetBorderCounts
+   *
+   * @description:
+   *   Call this function once you have finished parsing your paths
+   *   with the stroker.  It returns the number of points and
+   *   contours necessary to export one of the `border' or `stroke'
+   *   outlines generated by the stroker.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   border ::
+   *     The border index.
+   *
+   * @output:
+   *   anum_points ::
+   *     The number of points.
+   *
+   *   anum_contours ::
+   *     The number of contours.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   When an outline, or a sub-path, is `closed', the stroker generates
+   *   two independent `border' outlines, named `left' and `right'.
+   *
+   *   When the outline, or a sub-path, is `opened', the stroker merges
+   *   the `border' outlines with caps.  The `left' border receives all
+   *   points, while the `right' border becomes empty.
+   *
+   *   Use the function @FT_Stroker_GetCounts instead if you want to
+   *   retrieve the counts associated to both borders.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,
+                              FT_StrokerBorder  border,
+                              FT_UInt          *anum_points,
+                              FT_UInt          *anum_contours );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_ExportBorder
+   *
+   * @description:
+   *   Call this function after @FT_Stroker_GetBorderCounts to
+   *   export the corresponding border to your own @FT_Outline
+   *   structure.
+   *
+   *   Note that this function appends the border points and
+   *   contours to your outline, but does not try to resize its
+   *   arrays.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   border ::
+   *     The border index.
+   *
+   *   outline ::
+   *     The target outline handle.
+   *
+   * @note:
+   *   Always call this function after @FT_Stroker_GetBorderCounts to
+   *   get sure that there is enough room in your @FT_Outline object to
+   *   receive all new data.
+   *
+   *   When an outline, or a sub-path, is `closed', the stroker generates
+   *   two independent `border' outlines, named `left' and `right'
+   *
+   *   When the outline, or a sub-path, is `opened', the stroker merges
+   *   the `border' outlines with caps. The `left' border receives all
+   *   points, while the `right' border becomes empty.
+   *
+   *   Use the function @FT_Stroker_Export instead if you want to
+   *   retrieve all borders at once.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_ExportBorder( FT_Stroker        stroker,
+                           FT_StrokerBorder  border,
+                           FT_Outline*       outline );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_GetCounts
+   *
+   * @description:
+   *   Call this function once you have finished parsing your paths
+   *   with the stroker.  It returns the number of points and
+   *   contours necessary to export all points/borders from the stroked
+   *   outline/path.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   * @output:
+   *   anum_points ::
+   *     The number of points.
+   *
+   *   anum_contours ::
+   *     The number of contours.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_GetCounts( FT_Stroker  stroker,
+                        FT_UInt    *anum_points,
+                        FT_UInt    *anum_contours );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_Export
+   *
+   * @description:
+   *   Call this function after @FT_Stroker_GetBorderCounts to
+   *   export all borders to your own @FT_Outline structure.
+   *
+   *   Note that this function appends the border points and
+   *   contours to your outline, but does not try to resize its
+   *   arrays.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   outline ::
+   *     The target outline handle.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_Export( FT_Stroker   stroker,
+                     FT_Outline*  outline );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_Done
+   *
+   * @description:
+   *   Destroy a stroker object.
+   *
+   * @input:
+   *   stroker ::
+   *     A stroker handle.  Can be NULL.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_Done( FT_Stroker  stroker );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Glyph_Stroke
+   *
+   * @description:
+   *   Stroke a given outline glyph object with a given stroker.
+   *
+   * @inout:
+   *   pglyph ::
+   *     Source glyph handle on input, new glyph handle on output.
+   *
+   * @input:
+   *   stroker ::
+   *     A stroker handle.
+   *
+   *   destroy ::
+   *     A Boolean.  If~1, the source glyph object is destroyed
+   *     on success.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *   The source glyph is untouched in case of error.
+   *
+   *   Adding stroke may yield a significantly wider and taller glyph
+   *   depending on how large of a radius was used to stroke the glyph.  You
+   *   may need to manually adjust horizontal and vertical advance amounts
+   *   to account for this added size.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_Stroke( FT_Glyph    *pglyph,
+                   FT_Stroker   stroker,
+                   FT_Bool      destroy );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Glyph_StrokeBorder
+   *
+   * @description:
+   *   Stroke a given outline glyph object with a given stroker, but
+   *   only return either its inside or outside border.
+   *
+   * @inout:
+   *   pglyph ::
+   *     Source glyph handle on input, new glyph handle on output.
+   *
+   * @input:
+   *   stroker ::
+   *     A stroker handle.
+   *
+   *   inside ::
+   *     A Boolean.  If~1, return the inside border, otherwise
+   *     the outside border.
+   *
+   *   destroy ::
+   *     A Boolean.  If~1, the source glyph object is destroyed
+   *     on success.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *   The source glyph is untouched in case of error.
+   *
+   *   Adding stroke may yield a significantly wider and taller glyph
+   *   depending on how large of a radius was used to stroke the glyph.  You
+   *   may need to manually adjust horizontal and vertical advance amounts
+   *   to account for this added size.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,
+                         FT_Stroker   stroker,
+                         FT_Bool      inside,
+                         FT_Bool      destroy );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FT_STROKE_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/include/thirdparties/freetype/freetype/ftsynth.h b/core/include/thirdparties/freetype/freetype/ftsynth.h
new file mode 100644
index 0000000..55f32d6
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftsynth.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsynth.h                                                              */
+/*                                                                         */
+/*    FreeType synthesizing code for emboldening and slanting              */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 2000-2001, 2003, 2006, 2008, 2012 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*********                                                       *********/
+  /*********        WARNING, THIS IS ALPHA CODE!  THIS API         *********/
+  /*********    IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE    *********/
+  /*********            FREETYPE DEVELOPMENT TEAM                  *********/
+  /*********                                                       *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* Main reason for not lifting the functions in this module to a  */
+  /* `standard' API is that the used parameters for emboldening and */
+  /* slanting are not configurable.  Consider the functions as a    */
+  /* code resource which should be copied into the application and  */
+  /* adapted to the particular needs.                               */
+
+
+#ifndef __FTSYNTH_H__
+#define __FTSYNTH_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /* Embolden a glyph by a `reasonable' value (which is highly a matter of */
+  /* taste).  This function is actually a convenience function, providing  */
+  /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden.           */
+  /*                                                                       */
+  /* For emboldened outlines the height, width, and advance metrics are    */
+  /* increased by the strength of the emboldening.  You can also call      */
+  /* @FT_Outline_Get_CBox to get precise values.                           */
+  FT_EXPORT( void )
+  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot );
+
+  /* Slant an outline glyph to the right by about 12 degrees. */
+  FT_EXPORT( void )
+  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot );
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __FTSYNTH_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftsystem.h b/core/include/thirdparties/freetype/freetype/ftsystem.h
new file mode 100644
index 0000000..6b41320
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftsystem.h
@@ -0,0 +1,354 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsystem.h                                                             */
+/*                                                                         */
+/*    FreeType low-level system interface definition (specification).      */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2005, 2010 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTSYSTEM_H__
+#define __FTSYSTEM_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*   system_interface                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*   System Interface                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*   How FreeType manages memory and i/o.                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   This section contains various definitions related to memory         */
+  /*   management and i/o access.  You need to understand this             */
+  /*   information if you want to use a custom memory manager or you own   */
+  /*   i/o streams.                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                  M E M O R Y   M A N A G E M E N T                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FT_Memory
+   *
+   * @description:
+   *   A handle to a given memory manager object, defined with an
+   *   @FT_MemoryRec structure.
+   *
+   */
+  typedef struct FT_MemoryRec_*  FT_Memory;
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Alloc_Func
+   *
+   * @description:
+   *   A function used to allocate `size' bytes from `memory'.
+   *
+   * @input:
+   *   memory ::
+   *     A handle to the source memory manager.
+   *
+   *   size ::
+   *     The size in bytes to allocate.
+   *
+   * @return:
+   *   Address of new memory block.  0~in case of failure.
+   *
+   */
+  typedef void*
+  (*FT_Alloc_Func)( FT_Memory  memory,
+                    long       size );
+
+  /* Sunliang.Liu 20100915 sync 221's revison. */

+  typedef void*

+	  (*FT_AllocDebug_Func)( FT_Memory  memory,

+	  long       size, const char* filename,  int line);

+
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Free_Func
+   *
+   * @description:
+   *   A function used to release a given block of memory.
+   *
+   * @input:
+   *   memory ::
+   *     A handle to the source memory manager.
+   *
+   *   block ::
+   *     The address of the target memory block.
+   *
+   */
+  typedef void
+  (*FT_Free_Func)( FT_Memory  memory,
+                   void*      block );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Realloc_Func
+   *
+   * @description:
+   *   A function used to re-allocate a given block of memory.
+   *
+   * @input:
+   *   memory ::
+   *     A handle to the source memory manager.
+   *
+   *   cur_size ::
+   *     The block's current size in bytes.
+   *
+   *   new_size ::
+   *     The block's requested new size.
+   *
+   *   block ::
+   *     The block's current address.
+   *
+   * @return:
+   *   New block address.  0~in case of memory shortage.
+   *
+   * @note:
+   *   In case of error, the old block must still be available.
+   *
+   */
+  typedef void*
+  (*FT_Realloc_Func)( FT_Memory  memory,
+                      long       cur_size,
+                      long       new_size,
+                      void*      block );
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   FT_MemoryRec
+   *
+   * @description:
+   *   A structure used to describe a given memory manager to FreeType~2.
+   *
+   * @fields:
+   *   user ::
+   *     A generic typeless pointer for user data.
+   *
+   *   alloc ::
+   *     A pointer type to an allocation function.
+   *
+   *   free ::
+   *     A pointer type to an memory freeing function.
+   *
+   *   realloc ::
+   *     A pointer type to a reallocation function.
+   *
+   */
+  struct  FT_MemoryRec_
+  {
+    void*            user;
+    FT_Alloc_Func    alloc;
+	FT_AllocDebug_Func allocdebug;	/* Sunliang.Liu 20100915 sync 221's revison. */
+    FT_Free_Func     free;
+    FT_Realloc_Func  realloc;
+  };
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                       I / O   M A N A G E M E N T                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FT_Stream
+   *
+   * @description:
+   *   A handle to an input stream.
+   *
+   */
+  typedef struct FT_StreamRec_*  FT_Stream;
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   FT_StreamDesc
+   *
+   * @description:
+   *   A union type used to store either a long or a pointer.  This is used
+   *   to store a file descriptor or a `FILE*' in an input stream.
+   *
+   */
+  typedef union  FT_StreamDesc_
+  {
+    long   value;
+    void*  pointer;
+
+  } FT_StreamDesc;
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Stream_IoFunc
+   *
+   * @description:
+   *   A function used to seek and read data from a given input stream.
+   *
+   * @input:
+   *   stream ::
+   *     A handle to the source stream.
+   *
+   *   offset ::
+   *     The offset of read in stream (always from start).
+   *
+   *   buffer ::
+   *     The address of the read buffer.
+   *
+   *   count ::
+   *     The number of bytes to read from the stream.
+   *
+   * @return:
+   *   The number of bytes effectively read by the stream.
+   *
+   * @note:
+   *   This function might be called to perform a seek or skip operation
+   *   with a `count' of~0.  A non-zero return value then indicates an
+   *   error.
+   *
+   */
+  typedef unsigned long
+  (*FT_Stream_IoFunc)( FT_Stream       stream,
+                       unsigned long   offset,
+                       unsigned char*  buffer,
+                       unsigned long   count );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Stream_CloseFunc
+   *
+   * @description:
+   *   A function used to close a given input stream.
+   *
+   * @input:
+   *  stream ::
+   *     A handle to the target stream.
+   *
+   */
+  typedef void
+  (*FT_Stream_CloseFunc)( FT_Stream  stream );
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   FT_StreamRec
+   *
+   * @description:
+   *   A structure used to describe an input stream.
+   *
+   * @input:
+   *   base ::
+   *     For memory-based streams, this is the address of the first stream
+   *     byte in memory.  This field should always be set to NULL for
+   *     disk-based streams.
+   *
+   *   size ::
+   *     The stream size in bytes.
+   *
+   *   pos ::
+   *     The current position within the stream.
+   *
+   *   descriptor ::
+   *     This field is a union that can hold an integer or a pointer.  It is
+   *     used by stream implementations to store file descriptors or `FILE*'
+   *     pointers.
+   *
+   *   pathname ::
+   *     This field is completely ignored by FreeType.  However, it is often
+   *     useful during debugging to use it to store the stream's filename
+   *     (where available).
+   *
+   *   read ::
+   *     The stream's input function.
+   *
+   *   close ::
+   *     The stream's close function.
+   *
+   *   memory ::
+   *     The memory manager to use to preload frames.  This is set
+   *     internally by FreeType and shouldn't be touched by stream
+   *     implementations.
+   *
+   *   cursor ::
+   *     This field is set and used internally by FreeType when parsing
+   *     frames.
+   *
+   *   limit ::
+   *     This field is set and used internally by FreeType when parsing
+   *     frames.
+   *
+   */
+  typedef struct  FT_StreamRec_
+  {
+    unsigned char*       base;
+    unsigned long        size;
+    unsigned long        pos;
+
+    FT_StreamDesc        descriptor;
+    FT_StreamDesc        pathname;
+    FT_Stream_IoFunc     read;
+    FT_Stream_CloseFunc  close;
+
+    FT_Memory            memory;
+    unsigned char*       cursor;
+    unsigned char*       limit;
+
+  } FT_StreamRec;
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTSYSTEM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/fttrigon.h b/core/include/thirdparties/freetype/freetype/fttrigon.h
new file mode 100644
index 0000000..111c63e
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/fttrigon.h
@@ -0,0 +1,350 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttrigon.h                                                             */
+/*                                                                         */
+/*    FreeType trigonometric functions (specification).                    */
+/*                                                                         */
+/*  Copyright 2001, 2003, 2005, 2007, 2013 by                              */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTTRIGON_H__
+#define __FTTRIGON_H__
+
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*   computations                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FT_Angle
+   *
+   * @description:
+   *   This type is used to model angle values in FreeType.  Note that the
+   *   angle is a 16.16 fixed-point value expressed in degrees.
+   *
+   */
+  typedef FT_Fixed  FT_Angle;
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ANGLE_PI
+   *
+   * @description:
+   *   The angle pi expressed in @FT_Angle units.
+   *
+   */
+#define FT_ANGLE_PI  ( 180L << 16 )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ANGLE_2PI
+   *
+   * @description:
+   *   The angle 2*pi expressed in @FT_Angle units.
+   *
+   */
+#define FT_ANGLE_2PI  ( FT_ANGLE_PI * 2 )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ANGLE_PI2
+   *
+   * @description:
+   *   The angle pi/2 expressed in @FT_Angle units.
+   *
+   */
+#define FT_ANGLE_PI2  ( FT_ANGLE_PI / 2 )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ANGLE_PI4
+   *
+   * @description:
+   *   The angle pi/4 expressed in @FT_Angle units.
+   *
+   */
+#define FT_ANGLE_PI4  ( FT_ANGLE_PI / 4 )
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Sin
+   *
+   * @description:
+   *   Return the sinus of a given angle in fixed-point format.
+   *
+   * @input:
+   *   angle ::
+   *     The input angle.
+   *
+   * @return:
+   *   The sinus value.
+   *
+   * @note:
+   *   If you need both the sinus and cosinus for a given angle, use the
+   *   function @FT_Vector_Unit.
+   *
+   */
+  FT_EXPORT( FT_Fixed )
+  FT_Sin( FT_Angle  angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Cos
+   *
+   * @description:
+   *   Return the cosinus of a given angle in fixed-point format.
+   *
+   * @input:
+   *   angle ::
+   *     The input angle.
+   *
+   * @return:
+   *   The cosinus value.
+   *
+   * @note:
+   *   If you need both the sinus and cosinus for a given angle, use the
+   *   function @FT_Vector_Unit.
+   *
+   */
+  FT_EXPORT( FT_Fixed )
+  FT_Cos( FT_Angle  angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Tan
+   *
+   * @description:
+   *   Return the tangent of a given angle in fixed-point format.
+   *
+   * @input:
+   *   angle ::
+   *     The input angle.
+   *
+   * @return:
+   *   The tangent value.
+   *
+   */
+  FT_EXPORT( FT_Fixed )
+  FT_Tan( FT_Angle  angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Atan2
+   *
+   * @description:
+   *   Return the arc-tangent corresponding to a given vector (x,y) in
+   *   the 2d plane.
+   *
+   * @input:
+   *   x ::
+   *     The horizontal vector coordinate.
+   *
+   *   y ::
+   *     The vertical vector coordinate.
+   *
+   * @return:
+   *   The arc-tangent value (i.e. angle).
+   *
+   */
+  FT_EXPORT( FT_Angle )
+  FT_Atan2( FT_Fixed  x,
+            FT_Fixed  y );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Angle_Diff
+   *
+   * @description:
+   *   Return the difference between two angles.  The result is always
+   *   constrained to the ]-PI..PI] interval.
+   *
+   * @input:
+   *   angle1 ::
+   *     First angle.
+   *
+   *   angle2 ::
+   *     Second angle.
+   *
+   * @return:
+   *   Constrained value of `value2-value1'.
+   *
+   */
+  FT_EXPORT( FT_Angle )
+  FT_Angle_Diff( FT_Angle  angle1,
+                 FT_Angle  angle2 );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_Unit
+   *
+   * @description:
+   *   Return the unit vector corresponding to a given angle.  After the
+   *   call, the value of `vec.x' will be `sin(angle)', and the value of
+   *   `vec.y' will be `cos(angle)'.
+   *
+   *   This function is useful to retrieve both the sinus and cosinus of a
+   *   given angle quickly.
+   *
+   * @output:
+   *   vec ::
+   *     The address of target vector.
+   *
+   * @input:
+   *   angle ::
+   *     The address of angle.
+   *
+   */
+  FT_EXPORT( void )
+  FT_Vector_Unit( FT_Vector*  vec,
+                  FT_Angle    angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_Rotate
+   *
+   * @description:
+   *   Rotate a vector by a given angle.
+   *
+   * @inout:
+   *   vec ::
+   *     The address of target vector.
+   *
+   * @input:
+   *   angle ::
+   *     The address of angle.
+   *
+   */
+  FT_EXPORT( void )
+  FT_Vector_Rotate( FT_Vector*  vec,
+                    FT_Angle    angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_Length
+   *
+   * @description:
+   *   Return the length of a given vector.
+   *
+   * @input:
+   *   vec ::
+   *     The address of target vector.
+   *
+   * @return:
+   *   The vector length, expressed in the same units that the original
+   *   vector coordinates.
+   *
+   */
+  FT_EXPORT( FT_Fixed )
+  FT_Vector_Length( FT_Vector*  vec );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_Polarize
+   *
+   * @description:
+   *   Compute both the length and angle of a given vector.
+   *
+   * @input:
+   *   vec ::
+   *     The address of source vector.
+   *
+   * @output:
+   *   length ::
+   *     The vector length.
+   *
+   *   angle ::
+   *     The vector angle.
+   *
+   */
+  FT_EXPORT( void )
+  FT_Vector_Polarize( FT_Vector*  vec,
+                      FT_Fixed   *length,
+                      FT_Angle   *angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_From_Polar
+   *
+   * @description:
+   *   Compute vector coordinates from a length and angle.
+   *
+   * @output:
+   *   vec ::
+   *     The address of source vector.
+   *
+   * @input:
+   *   length ::
+   *     The vector length.
+   *
+   *   angle ::
+   *     The vector angle.
+   *
+   */
+  FT_EXPORT( void )
+  FT_Vector_From_Polar( FT_Vector*  vec,
+                        FT_Fixed    length,
+                        FT_Angle    angle );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTTRIGON_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftttdrv.h b/core/include/thirdparties/freetype/freetype/ftttdrv.h
new file mode 100644
index 0000000..01b25a4
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftttdrv.h
@@ -0,0 +1,150 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftttdrv.h                                                              */
+/*                                                                         */
+/*    FreeType API for controlling the TrueType driver                     */
+/*    (specification only).                                                */
+/*                                                                         */
+/*  Copyright 2013 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTTTDRV_H__
+#define __FTTTDRV_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   tt_driver
+   *
+   * @title:
+   *   The TrueType driver
+   *
+   * @abstract:
+   *   Controlling the TrueType driver module.
+   *
+   * @description:
+   *   While FreeType's TrueType driver doesn't expose API functions by
+   *   itself, it is possible to control its behaviour with @FT_Property_Set
+   *   and @FT_Property_Get.  The following lists the available properties
+   *   together with the necessary macros and structures.
+   *
+   *   The TrueType driver's module name is `truetype'.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   interpreter-version
+   *
+   * @description:
+   *   Currently, two versions are available which represent the bytecode
+   *   interpreter with and without subpixel hinting support,
+   *   respectively.  The default is subpixel support if
+   *   TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel
+   *   support otherwise (since it isn't available then).
+   *
+   *   If subpixel hinting is on, many TrueType bytecode instructions
+   *   behave differently compared to B/W or grayscale rendering.  The
+   *   main idea is to render at a much increased horizontal resolution,
+   *   then sampling down the created output to subpixel precision.
+   *   However, many older fonts are not suited to this and must be
+   *   specially taken care of by applying (hardcoded) font-specific
+   *   tweaks.
+   *
+   *   Details on subpixel hinting and some of the necessary tweaks can be
+   *   found in Greg Hitchcock's whitepaper at
+   *   `http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.
+   *
+   *   The following example code demonstrates how to activate subpixel
+   *   hinting (omitting the error handling).
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Face     face;
+   *     FT_UInt     interpreter_version = TT_INTERPRETER_VERSION_38;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "truetype",
+   *                               "interpreter-version",
+   *                               &interpreter_version );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   TT_INTERPRETER_VERSION_XXX
+   *
+   * @description:
+   *   A list of constants used for the @interpreter-version property to
+   *   select the hinting engine for Truetype fonts.
+   *
+   *   The numeric value in the constant names represents the version
+   *   number as returned by the `GETINFO' bytecode instruction.
+   *
+   * @values:
+   *   TT_INTERPRETER_VERSION_35 ::
+   *     Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in
+   *     Windows~98; only grayscale and B/W rasterizing is supported.
+   *
+   *   TT_INTERPRETER_VERSION_38 ::
+   *     Version~38 corresponds to MS rasterizer v.1.9; it is roughly
+   *     equivalent to the hinting provided by DirectWrite ClearType (as
+   *     can be found, for example, in the Internet Explorer~9 running on
+   *     Windows~7).
+   *
+   * @note:
+   *   This property controls the behaviour of the bytecode interpreter
+   *   and thus how outlines get hinted.  It does *not* control how glyph
+   *   get rasterized!  In particular, it does not control subpixel color
+   *   filtering.
+   *
+   *   If FreeType has not been compiled with configuration option
+   *   FT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 causes an
+   *   `FT_Err_Unimplemented_Feature' error.
+   *
+   */
+#define TT_INTERPRETER_VERSION_35  35
+#define TT_INTERPRETER_VERSION_38  38
+
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __FTTTDRV_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/fttypes.h b/core/include/thirdparties/freetype/freetype/fttypes.h
new file mode 100644
index 0000000..4d11bed
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/fttypes.h
@@ -0,0 +1,598 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttypes.h                                                              */
+/*                                                                         */
+/*    FreeType simple types definitions (specification only).              */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004, 2006-2009, 2012, 2013 by                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTTYPES_H__
+#define __FTTYPES_H__
+
+
+#include "../ft2build.h"
+#include "config/ftconfig.h"
+#include "ftsystem.h"
+#include "ftimage.h"
+
+#include <stddef.h>
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    basic_types                                                        */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Basic Data Types                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    The basic data types defined by the library.                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the basic data types defined by FreeType~2,  */
+  /*    ranging from simple scalar types to bitmap descriptors.  More      */
+  /*    font-specific structures are defined in a different section.       */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_Byte                                                            */
+  /*    FT_Bytes                                                           */
+  /*    FT_Char                                                            */
+  /*    FT_Int                                                             */
+  /*    FT_UInt                                                            */
+  /*    FT_Int16                                                           */
+  /*    FT_UInt16                                                          */
+  /*    FT_Int32                                                           */
+  /*    FT_UInt32                                                          */
+  /*    FT_Short                                                           */
+  /*    FT_UShort                                                          */
+  /*    FT_Long                                                            */
+  /*    FT_ULong                                                           */
+  /*    FT_Bool                                                            */
+  /*    FT_Offset                                                          */
+  /*    FT_PtrDist                                                         */
+  /*    FT_String                                                          */
+  /*    FT_Tag                                                             */
+  /*    FT_Error                                                           */
+  /*    FT_Fixed                                                           */
+  /*    FT_Pointer                                                         */
+  /*    FT_Pos                                                             */
+  /*    FT_Vector                                                          */
+  /*    FT_BBox                                                            */
+  /*    FT_Matrix                                                          */
+  /*    FT_FWord                                                           */
+  /*    FT_UFWord                                                          */
+  /*    FT_F2Dot14                                                         */
+  /*    FT_UnitVector                                                      */
+  /*    FT_F26Dot6                                                         */
+  /*                                                                       */
+  /*                                                                       */
+  /*    FT_Generic                                                         */
+  /*    FT_Generic_Finalizer                                               */
+  /*                                                                       */
+  /*    FT_Bitmap                                                          */
+  /*    FT_Pixel_Mode                                                      */
+  /*    FT_Palette_Mode                                                    */
+  /*    FT_Glyph_Format                                                    */
+  /*    FT_IMAGE_TAG                                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Bool                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef of unsigned char, used for simple booleans.  As usual,   */
+  /*    values 1 and~0 represent true and false, respectively.             */
+  /*                                                                       */
+  typedef unsigned char  FT_Bool;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_FWord                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A signed 16-bit integer used to store a distance in original font  */
+  /*    units.                                                             */
+  /*                                                                       */
+  typedef signed short  FT_FWord;   /* distance in FUnits */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UFWord                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An unsigned 16-bit integer used to store a distance in original    */
+  /*    font units.                                                        */
+  /*                                                                       */
+  typedef unsigned short  FT_UFWord;  /* unsigned distance */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Char                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple typedef for the _signed_ char type.                       */
+  /*                                                                       */
+  typedef signed char  FT_Char;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Byte                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple typedef for the _unsigned_ char type.                     */
+  /*                                                                       */
+  typedef unsigned char  FT_Byte;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Bytes                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for constant memory areas.                               */
+  /*                                                                       */
+  typedef const FT_Byte*  FT_Bytes;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Tag                                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for 32-bit tags (as used in the SFNT format).            */
+  /*                                                                       */
+  typedef FT_UInt32  FT_Tag;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_String                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple typedef for the char type, usually used for strings.      */
+  /*                                                                       */
+  typedef char  FT_String;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Short                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for signed short.                                        */
+  /*                                                                       */
+  typedef signed short  FT_Short;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UShort                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for unsigned short.                                      */
+  /*                                                                       */
+  typedef unsigned short  FT_UShort;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Int                                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for the int type.                                        */
+  /*                                                                       */
+  typedef signed int  FT_Int;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UInt                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for the unsigned int type.                               */
+  /*                                                                       */
+  typedef unsigned int  FT_UInt;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Long                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for signed long.                                         */
+  /*                                                                       */
+  typedef signed long  FT_Long;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_ULong                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for unsigned long.                                       */
+  /*                                                                       */
+  typedef unsigned long  FT_ULong;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_F2Dot14                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A signed 2.14 fixed-point type used for unit vectors.              */
+  /*                                                                       */
+  typedef signed short  FT_F2Dot14;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_F26Dot6                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A signed 26.6 fixed-point type used for vectorial pixel            */
+  /*    coordinates.                                                       */
+  /*                                                                       */
+  typedef signed long  FT_F26Dot6;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Fixed                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This type is used to store 16.16 fixed-point values, like scaling  */
+  /*    values or matrix coefficients.                                     */
+  /*                                                                       */
+  typedef signed long  FT_Fixed;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Error                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The FreeType error code type.  A value of~0 is always interpreted  */
+  /*    as a successful operation.                                         */
+  /*                                                                       */
+  typedef int  FT_Error;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Pointer                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple typedef for a typeless pointer.                           */
+  /*                                                                       */
+  typedef void*  FT_Pointer;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Offset                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is equivalent to the ANSI~C `size_t' type, i.e., the largest  */
+  /*    _unsigned_ integer type used to express a file size or position,   */
+  /*    or a memory block size.                                            */
+  /*                                                                       */
+  typedef size_t  FT_Offset;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_PtrDist                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the       */
+  /*    largest _signed_ integer type used to express the distance         */
+  /*    between two pointers.                                              */
+  /*                                                                       */
+  typedef ft_ptrdiff_t  FT_PtrDist;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_UnitVector                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to store a 2D vector unit vector.  Uses    */
+  /*    FT_F2Dot14 types.                                                  */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    x :: Horizontal coordinate.                                        */
+  /*                                                                       */
+  /*    y :: Vertical coordinate.                                          */
+  /*                                                                       */
+  typedef struct  FT_UnitVector_
+  {
+    FT_F2Dot14  x;
+    FT_F2Dot14  y;
+
+  } FT_UnitVector;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Matrix                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to store a 2x2 matrix.  Coefficients are   */
+  /*    in 16.16 fixed-point format.  The computation performed is:        */
+  /*                                                                       */
+  /*       {                                                               */
+  /*          x' = x*xx + y*xy                                             */
+  /*          y' = x*yx + y*yy                                             */
+  /*       }                                                               */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    xx :: Matrix coefficient.                                          */
+  /*                                                                       */
+  /*    xy :: Matrix coefficient.                                          */
+  /*                                                                       */
+  /*    yx :: Matrix coefficient.                                          */
+  /*                                                                       */
+  /*    yy :: Matrix coefficient.                                          */
+  /*                                                                       */
+  typedef struct  FT_Matrix_
+  {
+    FT_Fixed  xx, xy;
+    FT_Fixed  yx, yy;
+
+  } FT_Matrix;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Data                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Read-only binary data represented as a pointer and a length.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    pointer :: The data.                                               */
+  /*                                                                       */
+  /*    length  :: The length of the data in bytes.                        */
+  /*                                                                       */
+  typedef struct  FT_Data_
+  {
+    const FT_Byte*  pointer;
+    FT_Int          length;
+
+  } FT_Data;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Generic_Finalizer                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Describe a function used to destroy the `client' data of any       */
+  /*    FreeType object.  See the description of the @FT_Generic type for  */
+  /*    details of usage.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    The address of the FreeType object which is under finalization.    */
+  /*    Its client data is accessed through its `generic' field.           */
+  /*                                                                       */
+  typedef void  (*FT_Generic_Finalizer)(void*  object);
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Generic                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Client applications often need to associate their own data to a    */
+  /*    variety of FreeType core objects.  For example, a text layout API  */
+  /*    might want to associate a glyph cache to a given size object.      */
+  /*                                                                       */
+  /*    Some FreeType object contains a `generic' field, of type           */
+  /*    FT_Generic, which usage is left to client applications and font    */
+  /*    servers.                                                           */
+  /*                                                                       */
+  /*    It can be used to store a pointer to client-specific data, as well */
+  /*    as the address of a `finalizer' function, which will be called by  */
+  /*    FreeType when the object is destroyed (for example, the previous   */
+  /*    client example would put the address of the glyph cache destructor */
+  /*    in the `finalizer' field).                                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    data      :: A typeless pointer to any client-specified data. This */
+  /*                 field is completely ignored by the FreeType library.  */
+  /*                                                                       */
+  /*    finalizer :: A pointer to a `generic finalizer' function, which    */
+  /*                 will be called when the object is destroyed.  If this */
+  /*                 field is set to NULL, no code will be called.         */
+  /*                                                                       */
+  typedef struct  FT_Generic_
+  {
+    void*                 data;
+    FT_Generic_Finalizer  finalizer;
+
+  } FT_Generic;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_MAKE_TAG                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro converts four-letter tags which are used to label       */
+  /*    TrueType tables into an unsigned long to be used within FreeType.  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The produced values *must* be 32-bit integers.  Don't redefine     */
+  /*    this macro.                                                        */
+  /*                                                                       */
+#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
+          (FT_Tag)                        \
+          ( ( (FT_ULong)_x1 << 24 ) |     \
+            ( (FT_ULong)_x2 << 16 ) |     \
+            ( (FT_ULong)_x3 <<  8 ) |     \
+              (FT_ULong)_x4         )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /*                    L I S T   M A N A G E M E N T                      */
+  /*                                                                       */
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    list_processing                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_ListNode                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*     Many elements and objects in FreeType are listed through an       */
+  /*     @FT_List record (see @FT_ListRec).  As its name suggests, an      */
+  /*     FT_ListNode is a handle to a single list element.                 */
+  /*                                                                       */
+  typedef struct FT_ListNodeRec_*  FT_ListNode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_List                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a list record (see @FT_ListRec).                       */
+  /*                                                                       */
+  typedef struct FT_ListRec_*  FT_List;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_ListNodeRec                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold a single list element.                    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    prev :: The previous element in the list.  NULL if first.          */
+  /*                                                                       */
+  /*    next :: The next element in the list.  NULL if last.               */
+  /*                                                                       */
+  /*    data :: A typeless pointer to the listed object.                   */
+  /*                                                                       */
+  typedef struct  FT_ListNodeRec_
+  {
+    FT_ListNode  prev;
+    FT_ListNode  next;
+    void*        data;
+
+  } FT_ListNodeRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_ListRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold a simple doubly-linked list.  These are   */
+  /*    used in many parts of FreeType.                                    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    head :: The head (first element) of doubly-linked list.            */
+  /*                                                                       */
+  /*    tail :: The tail (last element) of doubly-linked list.             */
+  /*                                                                       */
+  typedef struct  FT_ListRec_
+  {
+    FT_ListNode  head;
+    FT_ListNode  tail;
+
+  } FT_ListRec;
+
+
+  /* */
+
+#define FT_IS_EMPTY( list )  ( (list).head == 0 )
+#define FT_BOOL( x )  ( (FT_Bool)( x ) )
+
+  /* concatenate C tokens */
+#define FT_ERR_XCAT( x, y )  x ## y
+#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )
+
+  /* see `ftmoderr.h' for descriptions of the following macros */
+
+#define FT_ERR( e )  FT_ERR_CAT( FT_ERR_PREFIX, e )
+
+#define FT_ERROR_BASE( x )    ( (x) & 0xFF )
+#define FT_ERROR_MODULE( x )  ( (x) & 0xFF00U )
+
+#define FT_ERR_EQ( x, e )                                        \
+          ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) )
+#define FT_ERR_NEQ( x, e )                                       \
+          ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTTYPES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftwinfnt.h b/core/include/thirdparties/freetype/freetype/ftwinfnt.h
new file mode 100644
index 0000000..af4334e
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftwinfnt.h
@@ -0,0 +1,274 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftwinfnt.h                                                             */
+/*                                                                         */
+/*    FreeType API for accessing Windows fnt-specific data.                */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2008 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTWINFNT_H__
+#define __FTWINFNT_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    winfnt_fonts                                                       */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Window FNT Files                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Windows FNT specific API.                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of Windows FNT specific      */
+  /*    functions.                                                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @enum:
+   *   FT_WinFNT_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `charset' byte in
+   *   @FT_WinFNT_HeaderRec.  Exact mapping tables for the various cpXXXX
+   *   encodings (except for cp1361) can be found at ftp://ftp.unicode.org
+   *   in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory.  cp1361 is
+   *   roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.
+   *
+   * @values:
+   *   FT_WinFNT_ID_DEFAULT ::
+   *     This is used for font enumeration and font creation as a
+   *     `don't care' value.  Valid font files don't contain this value.
+   *     When querying for information about the character set of the font
+   *     that is currently selected into a specified device context, this
+   *     return value (of the related Windows API) simply denotes failure.
+   *
+   *   FT_WinFNT_ID_SYMBOL ::
+   *     There is no known mapping table available.
+   *
+   *   FT_WinFNT_ID_MAC ::
+   *     Mac Roman encoding.
+   *
+   *   FT_WinFNT_ID_OEM ::
+   *     From Michael Pöttgen <michael@poettgen.de>:
+   *
+   *       The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM
+   *       is used for the charset of vector fonts, like `modern.fon',
+   *       `roman.fon', and `script.fon' on Windows.
+   *
+   *       The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value
+   *       specifies a character set that is operating-system dependent.
+   *
+   *       The `IFIMETRICS' documentation from the `Windows Driver
+   *       Development Kit' says: This font supports an OEM-specific
+   *       character set.  The OEM character set is system dependent.
+   *
+   *       In general OEM, as opposed to ANSI (i.e., cp1252), denotes the
+   *       second default codepage that most international versions of
+   *       Windows have.  It is one of the OEM codepages from
+   *
+   *         http://www.microsoft.com/globaldev/reference/cphome.mspx,
+   *
+   *       and is used for the `DOS boxes', to support legacy applications.
+   *       A German Windows version for example usually uses ANSI codepage
+   *       1252 and OEM codepage 850.
+   *
+   *   FT_WinFNT_ID_CP874 ::
+   *     A superset of Thai TIS 620 and ISO 8859-11.
+   *
+   *   FT_WinFNT_ID_CP932 ::
+   *     A superset of Japanese Shift-JIS (with minor deviations).
+   *
+   *   FT_WinFNT_ID_CP936 ::
+   *     A superset of simplified Chinese GB 2312-1980 (with different
+   *     ordering and minor deviations).
+   *
+   *   FT_WinFNT_ID_CP949 ::
+   *     A superset of Korean Hangul KS~C 5601-1987 (with different
+   *     ordering and minor deviations).
+   *
+   *   FT_WinFNT_ID_CP950 ::
+   *     A superset of traditional Chinese Big~5 ETen (with different
+   *     ordering and minor deviations).
+   *
+   *   FT_WinFNT_ID_CP1250 ::
+   *     A superset of East European ISO 8859-2 (with slightly different
+   *     ordering).
+   *
+   *   FT_WinFNT_ID_CP1251 ::
+   *     A superset of Russian ISO 8859-5 (with different ordering).
+   *
+   *   FT_WinFNT_ID_CP1252 ::
+   *     ANSI encoding.  A superset of ISO 8859-1.
+   *
+   *   FT_WinFNT_ID_CP1253 ::
+   *     A superset of Greek ISO 8859-7 (with minor modifications).
+   *
+   *   FT_WinFNT_ID_CP1254 ::
+   *     A superset of Turkish ISO 8859-9.
+   *
+   *   FT_WinFNT_ID_CP1255 ::
+   *     A superset of Hebrew ISO 8859-8 (with some modifications).
+   *
+   *   FT_WinFNT_ID_CP1256 ::
+   *     A superset of Arabic ISO 8859-6 (with different ordering).
+   *
+   *   FT_WinFNT_ID_CP1257 ::
+   *     A superset of Baltic ISO 8859-13 (with some deviations).
+   *
+   *   FT_WinFNT_ID_CP1258 ::
+   *     For Vietnamese.  This encoding doesn't cover all necessary
+   *     characters.
+   *
+   *   FT_WinFNT_ID_CP1361 ::
+   *     Korean (Johab).
+   */
+
+#define FT_WinFNT_ID_CP1252    0
+#define FT_WinFNT_ID_DEFAULT   1
+#define FT_WinFNT_ID_SYMBOL    2
+#define FT_WinFNT_ID_MAC      77
+#define FT_WinFNT_ID_CP932   128
+#define FT_WinFNT_ID_CP949   129
+#define FT_WinFNT_ID_CP1361  130
+#define FT_WinFNT_ID_CP936   134
+#define FT_WinFNT_ID_CP950   136
+#define FT_WinFNT_ID_CP1253  161
+#define FT_WinFNT_ID_CP1254  162
+#define FT_WinFNT_ID_CP1258  163
+#define FT_WinFNT_ID_CP1255  177
+#define FT_WinFNT_ID_CP1256  178
+#define FT_WinFNT_ID_CP1257  186
+#define FT_WinFNT_ID_CP1251  204
+#define FT_WinFNT_ID_CP874   222
+#define FT_WinFNT_ID_CP1250  238
+#define FT_WinFNT_ID_OEM     255
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_WinFNT_HeaderRec                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Windows FNT Header info.                                           */
+  /*                                                                       */
+  typedef struct  FT_WinFNT_HeaderRec_
+  {
+    FT_UShort  version;
+    FT_ULong   file_size;
+    FT_Byte    copyright[60];
+    FT_UShort  file_type;
+    FT_UShort  nominal_point_size;
+    FT_UShort  vertical_resolution;
+    FT_UShort  horizontal_resolution;
+    FT_UShort  ascent;
+    FT_UShort  internal_leading;
+    FT_UShort  external_leading;
+    FT_Byte    italic;
+    FT_Byte    underline;
+    FT_Byte    strike_out;
+    FT_UShort  weight;
+    FT_Byte    charset;
+    FT_UShort  pixel_width;
+    FT_UShort  pixel_height;
+    FT_Byte    pitch_and_family;
+    FT_UShort  avg_width;
+    FT_UShort  max_width;
+    FT_Byte    first_char;
+    FT_Byte    last_char;
+    FT_Byte    default_char;
+    FT_Byte    break_char;
+    FT_UShort  bytes_per_row;
+    FT_ULong   device_offset;
+    FT_ULong   face_name_offset;
+    FT_ULong   bits_pointer;
+    FT_ULong   bits_offset;
+    FT_Byte    reserved;
+    FT_ULong   flags;
+    FT_UShort  A_space;
+    FT_UShort  B_space;
+    FT_UShort  C_space;
+    FT_UShort  color_table_offset;
+    FT_ULong   reserved1[4];
+
+  } FT_WinFNT_HeaderRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_WinFNT_Header                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an @FT_WinFNT_HeaderRec structure.                     */
+  /*                                                                       */
+  typedef struct FT_WinFNT_HeaderRec_*  FT_WinFNT_Header;
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Get_WinFNT_Header
+   *
+   * @description:
+   *    Retrieve a Windows FNT font info header.
+   *
+   * @input:
+   *    face    :: A handle to the input face.
+   *
+   * @output:
+   *    aheader :: The WinFNT header.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   This function only works with Windows FNT faces, returning an error
+   *   otherwise.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_WinFNT_Header( FT_Face               face,
+                        FT_WinFNT_HeaderRec  *aheader );
+
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __FTWINFNT_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/include/thirdparties/freetype/freetype/ftxf86.h b/core/include/thirdparties/freetype/freetype/ftxf86.h
new file mode 100644
index 0000000..d7e2dab
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftxf86.h
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftxf86.h                                                               */
+/*                                                                         */
+/*    Support functions for X11.                                           */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2006, 2007 by                              */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTXF86_H__
+#define __FTXF86_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*   font_formats                                                        */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*   Font Formats                                                        */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*   Getting the font format.                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   The single function in this section can be used to get the font     */
+  /*   format.  Note that this information is not needed normally;         */
+  /*   however, there are special cases (like in PDF devices) where it is  */
+  /*   important to differentiate, in spite of FreeType's uniform API.     */
+  /*                                                                       */
+  /*   This function is in the X11/xf86 namespace for historical reasons   */
+  /*   and in no way depends on that windowing system.                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*   FT_Get_X11_Font_Format                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   Return a string describing the format of a given face, using values */
+  /*   which can be used as an X11 FONT_PROPERTY.  Possible values are     */
+  /*   `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */
+  /*   `PFR', and `Windows~FNT'.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*   face ::                                                             */
+  /*     Input face handle.                                                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   Font format string.  NULL in case of error.                         */
+  /*                                                                       */
+  FT_EXPORT( const char* )
+  FT_Get_X11_Font_Format( FT_Face  face );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTXF86_H__ */
diff --git a/core/include/thirdparties/freetype/freetype/internal/autohint.h b/core/include/thirdparties/freetype/freetype/internal/autohint.h
new file mode 100644
index 0000000..f07646d
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/autohint.h
@@ -0,0 +1,244 @@
+/***************************************************************************/
+/*                                                                         */
+/*  autohint.h                                                             */
+/*                                                                         */
+/*    High-level `autohint' module-specific interface (specification).     */
+/*                                                                         */
+/*  Copyright 1996-2002, 2007, 2009, 2012 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The auto-hinter is used to load and automatically hint glyphs if a    */
+  /* format-specific hinter isn't available.                               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __AUTOHINT_H__
+#define __AUTOHINT_H__
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A small technical note regarding automatic hinting in order to        */
+  /* clarify this module interface.                                        */
+  /*                                                                       */
+  /* An automatic hinter might compute two kinds of data for a given face: */
+  /*                                                                       */
+  /* - global hints: Usually some metrics that describe global properties  */
+  /*                 of the face.  It is computed by scanning more or less */
+  /*                 aggressively the glyphs in the face, and thus can be  */
+  /*                 very slow to compute (even if the size of global      */
+  /*                 hints is really small).                               */
+  /*                                                                       */
+  /* - glyph hints:  These describe some important features of the glyph   */
+  /*                 outline, as well as how to align them.  They are      */
+  /*                 generally much faster to compute than global hints.   */
+  /*                                                                       */
+  /* The current FreeType auto-hinter does a pretty good job while         */
+  /* performing fast computations for both global and glyph hints.         */
+  /* However, we might be interested in introducing more complex and       */
+  /* powerful algorithms in the future, like the one described in the John */
+  /* D. Hobby paper, which unfortunately requires a lot more horsepower.   */
+  /*                                                                       */
+  /* Because a sufficiently sophisticated font management system would     */
+  /* typically implement an LRU cache of opened face objects to reduce     */
+  /* memory usage, it is a good idea to be able to avoid recomputing       */
+  /* global hints every time the same face is re-opened.                   */
+  /*                                                                       */
+  /* We thus provide the ability to cache global hints outside of the face */
+  /* object, in order to speed up font re-opening time.  Of course, this   */
+  /* feature is purely optional, so most client programs won't even notice */
+  /* it.                                                                   */
+  /*                                                                       */
+  /* I initially thought that it would be a good idea to cache the glyph   */
+  /* hints too.  However, my general idea now is that if you really need   */
+  /* to cache these too, you are simply in need of a new font format,      */
+  /* where all this information could be stored within the font file and   */
+  /* decoded on the fly.                                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+  typedef struct FT_AutoHinterRec_  *FT_AutoHinter;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_AutoHinter_GlobalGetFunc                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the global hints computed for a given face object.  The   */
+  /*    resulting data is dissociated from the face and will survive a     */
+  /*    call to FT_Done_Face().  It must be discarded through the API      */
+  /*    FT_AutoHinter_GlobalDoneFunc().                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    hinter       :: A handle to the source auto-hinter.                */
+  /*                                                                       */
+  /*    face         :: A handle to the source face object.                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    global_hints :: A typeless pointer to the global hints.            */
+  /*                                                                       */
+  /*    global_len   :: The size in bytes of the global hints.             */
+  /*                                                                       */
+  typedef void
+  (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter  hinter,
+                                  FT_Face        face,
+                                  void**         global_hints,
+                                  long*          global_len );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_AutoHinter_GlobalDoneFunc                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discard the global hints retrieved through                         */
+  /*    FT_AutoHinter_GlobalGetFunc().  This is the only way these hints   */
+  /*    are freed from memory.                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    hinter :: A handle to the auto-hinter module.                      */
+  /*                                                                       */
+  /*    global :: A pointer to retrieved global hints to discard.          */
+  /*                                                                       */
+  typedef void
+  (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter  hinter,
+                                   void*          global );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_AutoHinter_GlobalResetFunc                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to recompute the global metrics in a given   */
+  /*    font.  This is useful when global font data changes (e.g. Multiple */
+  /*    Masters fonts where blend coordinates change).                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    hinter :: A handle to the source auto-hinter.                      */
+  /*                                                                       */
+  /*    face   :: A handle to the face.                                    */
+  /*                                                                       */
+  typedef void
+  (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter  hinter,
+                                    FT_Face        face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_AutoHinter_GlyphLoadFunc                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to load, scale, and automatically hint a     */
+  /*    glyph from a given face.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to the face.                               */
+  /*                                                                       */
+  /*    glyph_index :: The glyph index.                                    */
+  /*                                                                       */
+  /*    load_flags  :: The load flags.                                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is capable of loading composite glyphs by hinting    */
+  /*    each sub-glyph independently (which improves quality).             */
+  /*                                                                       */
+  /*    It will call the font driver with @FT_Load_Glyph, with             */
+  /*    @FT_LOAD_NO_SCALE set.                                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter  hinter,
+                                  FT_GlyphSlot   slot,
+                                  FT_Size        size,
+                                  FT_UInt        glyph_index,
+                                  FT_Int32       load_flags );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_AutoHinter_InterfaceRec                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The auto-hinter module's interface.                                */
+  /*                                                                       */
+  typedef struct  FT_AutoHinter_InterfaceRec_
+  {
+    FT_AutoHinter_GlobalResetFunc  reset_face;
+    FT_AutoHinter_GlobalGetFunc    get_global_hints;
+    FT_AutoHinter_GlobalDoneFunc   done_global_hints;
+    FT_AutoHinter_GlyphLoadFunc    load_glyph;
+
+  } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_AUTOHINTER_INTERFACE(       \
+          class_,                             \
+          reset_face_,                        \
+          get_global_hints_,                  \
+          done_global_hints_,                 \
+          load_glyph_ )                       \
+  FT_CALLBACK_TABLE_DEF                       \
+  const FT_AutoHinter_InterfaceRec  class_ =  \
+  {                                           \
+    reset_face_,                              \
+    get_global_hints_,                        \
+    done_global_hints_,                       \
+    load_glyph_                               \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_AUTOHINTER_INTERFACE(                            \
+          class_,                                                  \
+          reset_face_,                                             \
+          get_global_hints_,                                       \
+          done_global_hints_,                                      \
+          load_glyph_ )                                            \
+  void                                                             \
+  FT_Init_Class_ ## class_( FT_Library                   library,  \
+                            FT_AutoHinter_InterfaceRec*  clazz )   \
+  {                                                                \
+    FT_UNUSED( library );                                          \
+                                                                   \
+    clazz->reset_face        = reset_face_;                        \
+    clazz->get_global_hints  = get_global_hints_;                  \
+    clazz->done_global_hints = done_global_hints_;                 \
+    clazz->load_glyph        = load_glyph_;                        \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __AUTOHINT_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftcalc.h b/core/include/thirdparties/freetype/freetype/internal/ftcalc.h
new file mode 100644
index 0000000..1f2462d
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftcalc.h
@@ -0,0 +1,167 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcalc.h                                                               */
+/*                                                                         */
+/*    Arithmetic computations (specification).                             */
+/*                                                                         */
+/*  Copyright 1996-2006, 2008, 2009, 2012-2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCALC_H__
+#define __FTCALC_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_FixedSqrt                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the square root of a 16.16 fixed-point value.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    x :: The value to compute the root for.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `sqrt(x)'.                                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is not very fast.                                    */
+  /*                                                                       */
+  FT_BASE( FT_Int32 )
+  FT_SqrtFixed( FT_Int32  x );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FT_MulDiv() and FT_MulFix() are declared in freetype.h.               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_MulDiv_No_Round                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to perform the computation `(a*b)/c'   */
+  /*    (without rounding) with maximum accuracy (it uses a 64-bit         */
+  /*    intermediate integer whenever necessary).                          */
+  /*                                                                       */
+  /*    This function isn't necessarily as fast as some processor specific */
+  /*    operations, but is at least completely portable.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The first multiplier.                                         */
+  /*    b :: The second multiplier.                                        */
+  /*    c :: The divisor.                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a*b)/c'.  This function never traps when trying to */
+  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */
+  /*    on the signs of `a' and `b'.                                       */
+  /*                                                                       */
+  FT_BASE( FT_Long )
+  FT_MulDiv_No_Round( FT_Long  a,
+                      FT_Long  b,
+                      FT_Long  c );
+
+
+  /*
+   *  A variant of FT_Matrix_Multiply which scales its result afterwards.
+   *  The idea is that both `a' and `b' are scaled by factors of 10 so that
+   *  the values are as precise as possible to get a correct result during
+   *  the 64bit multiplication.  Let `sa' and `sb' be the scaling factors of
+   *  `a' and `b', respectively, then the scaling factor of the result is
+   *  `sa*sb'.
+   */
+  FT_BASE( void )
+  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,
+                             FT_Matrix        *b,
+                             FT_Long           scaling );
+
+
+  /*
+   *  A variant of FT_Vector_Transform.  See comments for
+   *  FT_Matrix_Multiply_Scaled.
+   */
+  FT_BASE( void )
+  FT_Vector_Transform_Scaled( FT_Vector*        vector,
+                              const FT_Matrix*  matrix,
+                              FT_Long           scaling );
+
+
+  /*
+   *  Return -1, 0, or +1, depending on the orientation of a given corner.
+   *  We use the Cartesian coordinate system, with positive vertical values
+   *  going upwards.  The function returns +1 if the corner turns to the
+   *  left, -1 to the right, and 0 for undecidable cases.
+   */
+  FT_BASE( FT_Int )
+  ft_corner_orientation( FT_Pos  in_x,
+                         FT_Pos  in_y,
+                         FT_Pos  out_x,
+                         FT_Pos  out_y );
+
+  /*
+   *  Return TRUE if a corner is flat or nearly flat.  This is equivalent to
+   *  saying that the angle difference between the `in' and `out' vectors is
+   *  very small.
+   */
+  FT_BASE( FT_Int )
+  ft_corner_is_flat( FT_Pos  in_x,
+                     FT_Pos  in_y,
+                     FT_Pos  out_x,
+                     FT_Pos  out_y );
+
+
+  /*
+   *  Return the most significant bit index.
+   */
+  FT_BASE( FT_Int )
+  FT_MSB( FT_UInt32  z );
+
+
+  /*
+   *  Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses
+   *  two fixed-point arguments instead.
+   */
+  FT_BASE( FT_Fixed )
+  FT_Hypot( FT_Fixed  x,
+            FT_Fixed  y );
+
+
+#define INT_TO_F26DOT6( x )    ( (FT_Long)(x) << 6  )
+#define INT_TO_F2DOT14( x )    ( (FT_Long)(x) << 14 )
+#define INT_TO_FIXED( x )      ( (FT_Long)(x) << 16 )
+#define F2DOT14_TO_FIXED( x )  ( (FT_Long)(x) << 2  )
+#define FLOAT_TO_FIXED( x )    ( (FT_Long)( x * 65536.0 ) )
+#define FIXED_TO_INT( x )      ( FT_RoundFix( x ) >> 16 )
+
+#define ROUND_F26DOT6( x )     ( x >= 0 ? (    ( (x) + 32 ) & -64 )     \
+                                        : ( -( ( 32 - (x) ) & -64 ) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTCALC_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftdebug.h b/core/include/thirdparties/freetype/freetype/internal/ftdebug.h
new file mode 100644
index 0000000..e7b1419
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftdebug.h
@@ -0,0 +1,255 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdebug.h                                                              */
+/*                                                                         */
+/*    Debugging and logging component (specification).                     */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004, 2006-2009, 2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/*                                                                         */
+/*  IMPORTANT: A description of FreeType's debugging support can be        */
+/*             found in `docs/DEBUG.TXT'.  Read it if you need to use or   */
+/*             understand this code.                                       */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTDEBUG_H__
+#define __FTDEBUG_H__
+
+
+#include "../../ft2build.h"
+#include "../config/ftconfig.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */
+  /* is already defined; this simplifies the following #ifdefs            */
+  /*                                                                      */
+#ifdef FT_DEBUG_LEVEL_TRACE
+#undef  FT_DEBUG_LEVEL_ERROR
+#define FT_DEBUG_LEVEL_ERROR
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the trace enums as well as the trace levels array when they    */
+  /* are needed.                                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define FT_TRACE_DEF( x )  trace_ ## x ,
+
+  /* defining the enumeration */
+  typedef enum  FT_Trace_
+  {
+#include "fttrace.h"
+    trace_count
+
+  } FT_Trace;
+
+
+  /* defining the array of trace levels, provided by `src/base/ftdebug.c' */
+  extern int  ft_trace_levels[trace_count];
+
+#undef FT_TRACE_DEF
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the FT_TRACE macro                                             */
+  /*                                                                       */
+  /* IMPORTANT!                                                            */
+  /*                                                                       */
+  /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */
+  /* value before using any TRACE macro.                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define FT_TRACE( level, varformat )                      \
+          do                                              \
+          {                                               \
+            if ( ft_trace_levels[FT_COMPONENT] >= level ) \
+              FT_Message varformat;                       \
+          } while ( 0 )
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+#define FT_TRACE( level, varformat )  do { } while ( 0 )      /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Trace_Get_Count                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the number of available trace components.                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The number of trace components.  0 if FreeType 2 is not built with */
+  /*    FT_DEBUG_LEVEL_TRACE definition.                                   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function may be useful if you want to access elements of      */
+  /*    the internal `ft_trace_levels' array by an index.                  */
+  /*                                                                       */
+  FT_BASE( FT_Int )
+  FT_Trace_Get_Count( void );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Trace_Get_Name                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the name of a trace component.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    The index of the trace component.                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The name of the trace component.  This is a statically allocated   */
+  /*    C string, so do not free it after use.  NULL if FreeType 2 is not  */
+  /*    built with FT_DEBUG_LEVEL_TRACE definition.                        */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Use @FT_Trace_Get_Count to get the number of available trace       */
+  /*    components.                                                        */
+  /*                                                                       */
+  /*    This function may be useful if you want to control FreeType 2's    */
+  /*    debug level in your application.                                   */
+  /*                                                                       */
+  FT_BASE( const char * )
+  FT_Trace_Get_Name( FT_Int  idx );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* You need two opening and closing parentheses!                         */
+  /*                                                                       */
+  /* Example: FT_TRACE0(( "Value is %i", foo ))                            */
+  /*                                                                       */
+  /* Output of the FT_TRACEX macros is sent to stderr.                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define FT_TRACE0( varformat )  FT_TRACE( 0, varformat )
+#define FT_TRACE1( varformat )  FT_TRACE( 1, varformat )
+#define FT_TRACE2( varformat )  FT_TRACE( 2, varformat )
+#define FT_TRACE3( varformat )  FT_TRACE( 3, varformat )
+#define FT_TRACE4( varformat )  FT_TRACE( 4, varformat )
+#define FT_TRACE5( varformat )  FT_TRACE( 5, varformat )
+#define FT_TRACE6( varformat )  FT_TRACE( 6, varformat )
+#define FT_TRACE7( varformat )  FT_TRACE( 7, varformat )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the FT_ERROR macro.                                            */
+  /*                                                                       */
+  /* Output of this macro is sent to stderr.                               */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ERROR( varformat )  FT_Message  varformat
+
+#else  /* !FT_DEBUG_LEVEL_ERROR */
+
+#define FT_ERROR( varformat )  do { } while ( 0 )      /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the FT_ASSERT and FT_THROW macros.  The call to `FT_Throw'     */
+  /* makes it possible to easily set a breakpoint at this function.        */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ASSERT( condition )                                      \
+          do                                                        \
+          {                                                         \
+            if ( !( condition ) )                                   \
+              FT_Panic( "assertion failed on line %d of file %s\n", \
+                        __LINE__, __FILE__ );                       \
+          } while ( 0 )
+
+#define FT_THROW( e )                                   \
+          ( FT_Throw( FT_ERR_CAT( FT_ERR_PREFIX, e ),   \
+                      __LINE__,                         \
+                      __FILE__ )                      | \
+            FT_ERR_CAT( FT_ERR_PREFIX, e )            )
+
+#else /* !FT_DEBUG_LEVEL_ERROR */
+
+#define FT_ASSERT( condition )  do { } while ( 0 )
+
+#define FT_THROW( e )  FT_ERR_CAT( FT_ERR_PREFIX, e )
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define `FT_Message' and `FT_Panic' when needed.                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#include "stdio.h"  /* for vfprintf() */
+
+  /* print a message */
+  FT_BASE( void )
+  FT_Message( const char*  fmt,
+              ... );
+
+  /* print a message and exit */
+  FT_BASE( void )
+  FT_Panic( const char*  fmt,
+            ... );
+
+  /* report file name and line number of an error */
+  FT_BASE( int )
+  FT_Throw( FT_Error     error,
+            int          line,
+            const char*  file );
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+  FT_BASE( void )
+  ft_debug_init( void );
+
+FT_END_HEADER
+
+#endif /* __FTDEBUG_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftdriver.h b/core/include/thirdparties/freetype/freetype/internal/ftdriver.h
new file mode 100644
index 0000000..5b0e863
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftdriver.h
@@ -0,0 +1,409 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdriver.h                                                             */
+/*                                                                         */
+/*    FreeType font driver interface (specification).                      */
+/*                                                                         */
+/*  Copyright 1996-2003, 2006, 2008, 2011-2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTDRIVER_H__
+#define __FTDRIVER_H__
+
+
+#include "../../ft2build.h"
+#include "../ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+  typedef FT_Error
+  (*FT_Face_InitFunc)( FT_Stream      stream,
+                       FT_Face        face,
+                       FT_Int         typeface_index,
+                       FT_Int         num_params,
+                       FT_Parameter*  parameters );
+
+  typedef void
+  (*FT_Face_DoneFunc)( FT_Face  face );
+
+
+  typedef FT_Error
+  (*FT_Size_InitFunc)( FT_Size  size );
+
+  typedef void
+  (*FT_Size_DoneFunc)( FT_Size  size );
+
+
+  typedef FT_Error
+  (*FT_Slot_InitFunc)( FT_GlyphSlot  slot );
+
+  typedef void
+  (*FT_Slot_DoneFunc)( FT_GlyphSlot  slot );
+
+
+  typedef FT_Error
+  (*FT_Size_RequestFunc)( FT_Size          size,
+                          FT_Size_Request  req );
+
+  typedef FT_Error
+  (*FT_Size_SelectFunc)( FT_Size   size,
+                         FT_ULong  size_index );
+
+  typedef FT_Error
+  (*FT_Slot_LoadFunc)( FT_GlyphSlot  slot,
+                       FT_Size       size,
+                       FT_UInt       glyph_index,
+                       FT_Int32      load_flags );
+
+
+  typedef FT_UInt
+  (*FT_CharMap_CharIndexFunc)( FT_CharMap  charmap,
+                               FT_Long     charcode );
+
+  typedef FT_Long
+  (*FT_CharMap_CharNextFunc)( FT_CharMap  charmap,
+                              FT_Long     charcode );
+
+
+  typedef FT_Error
+  (*FT_Face_GetKerningFunc)( FT_Face     face,
+                             FT_UInt     left_glyph,
+                             FT_UInt     right_glyph,
+                             FT_Vector*  kerning );
+
+
+  typedef FT_Error
+  (*FT_Face_AttachFunc)( FT_Face    face,
+                         FT_Stream  stream );
+
+
+  typedef FT_Error
+  (*FT_Face_GetAdvancesFunc)( FT_Face    face,
+                              FT_UInt    first,
+                              FT_UInt    count,
+                              FT_Int32   flags,
+                              FT_Fixed*  advances );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Driver_ClassRec                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The font driver class.  This structure mostly contains pointers to */
+  /*    driver methods.                                                    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root             :: The parent module.                             */
+  /*                                                                       */
+  /*    face_object_size :: The size of a face object in bytes.            */
+  /*                                                                       */
+  /*    size_object_size :: The size of a size object in bytes.            */
+  /*                                                                       */
+  /*    slot_object_size :: The size of a glyph object in bytes.           */
+  /*                                                                       */
+  /*    init_face        :: The format-specific face constructor.          */
+  /*                                                                       */
+  /*    done_face        :: The format-specific face destructor.           */
+  /*                                                                       */
+  /*    init_size        :: The format-specific size constructor.          */
+  /*                                                                       */
+  /*    done_size        :: The format-specific size destructor.           */
+  /*                                                                       */
+  /*    init_slot        :: The format-specific slot constructor.          */
+  /*                                                                       */
+  /*    done_slot        :: The format-specific slot destructor.           */
+  /*                                                                       */
+  /*                                                                       */
+  /*    load_glyph       :: A function handle to load a glyph to a slot.   */
+  /*                        This field is mandatory!                       */
+  /*                                                                       */
+  /*    get_kerning      :: A function handle to return the unscaled       */
+  /*                        kerning for a given pair of glyphs.  Can be    */
+  /*                        set to 0 if the format doesn't support         */
+  /*                        kerning.                                       */
+  /*                                                                       */
+  /*    attach_file      :: This function handle is used to read           */
+  /*                        additional data for a face from another        */
+  /*                        file/stream.  For example, this can be used to */
+  /*                        add data from AFM or PFM files on a Type 1     */
+  /*                        face, or a CIDMap on a CID-keyed face.         */
+  /*                                                                       */
+  /*    get_advances     :: A function handle used to return advance       */
+  /*                        widths of `count' glyphs (in font units),      */
+  /*                        starting at `first'.  The `vertical' flag must */
+  /*                        be set to get vertical advance heights.  The   */
+  /*                        `advances' buffer is caller-allocated.         */
+  /*                        The idea of this function is to be able to     */
+  /*                        perform device-independent text layout without */
+  /*                        loading a single glyph image.                  */
+  /*                                                                       */
+  /*    request_size     :: A handle to a function used to request the new */
+  /*                        character size.  Can be set to 0 if the        */
+  /*                        scaling done in the base layer suffices.       */
+  /*                                                                       */
+  /*    select_size      :: A handle to a function used to select a new    */
+  /*                        fixed size.  It is used only if                */
+  /*                        @FT_FACE_FLAG_FIXED_SIZES is set.  Can be set  */
+  /*                        to 0 if the scaling done in the base layer     */
+  /*                        suffices.                                      */
+  /* <Note>                                                                */
+  /*    Most function pointers, with the exception of `load_glyph', can be */
+  /*    set to 0 to indicate a default behaviour.                          */
+  /*                                                                       */
+  typedef struct  FT_Driver_ClassRec_
+  {
+    FT_Module_Class          root;
+
+    FT_Long                  face_object_size;
+    FT_Long                  size_object_size;
+    FT_Long                  slot_object_size;
+
+    FT_Face_InitFunc         init_face;
+    FT_Face_DoneFunc         done_face;
+
+    FT_Size_InitFunc         init_size;
+    FT_Size_DoneFunc         done_size;
+
+    FT_Slot_InitFunc         init_slot;
+    FT_Slot_DoneFunc         done_slot;
+
+    FT_Slot_LoadFunc         load_glyph;
+
+    FT_Face_GetKerningFunc   get_kerning;
+    FT_Face_AttachFunc       attach_file;
+    FT_Face_GetAdvancesFunc  get_advances;
+
+    /* since version 2.2 */
+    FT_Size_RequestFunc      request_size;
+    FT_Size_SelectFunc       select_size;
+
+  } FT_Driver_ClassRec, *FT_Driver_Class;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DECLARE_DRIVER                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to create a forward declaration of an FT_Driver_ClassRec      */
+  /*    struct instance.                                                   */
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_DRIVER                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Driver_ClassRec struct.       */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function has to be */
+  /*    called with a pointer where the allocated structure is returned.   */
+  /*    And when it is no longer needed a `destroy' function needs to be   */
+  /*    called to release that allocation.                                 */
+  /*                                                                       */
+  /*    `fcinit.c' (ft_create_default_module_classes) already contains a   */
+  /*    mechanism to call these functions for the default modules          */
+  /*    described in `ftmodule.h'.                                         */
+  /*                                                                       */
+  /*    Notice that the created `create' and `destroy' functions call      */
+  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */
+  /*    initialize any additional global data, like a module specific      */
+  /*    interface, and put them in the global pic container defined in     */
+  /*    `ftpic.h'.  If you don't need them just implement the functions as */
+  /*    empty to resolve the link error.  Also the `pic_init' and          */
+  /*    `pic_free' functions should be declared in `pic.h', to be referred */
+  /*    by driver definition calling `FT_DEFINE_DRIVER' in following.      */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro is     */
+  /*    used).                                                             */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_DRIVER( class_ )  \
+  FT_CALLBACK_TABLE                  \
+  const FT_Driver_ClassRec  class_;
+
+#define FT_DEFINE_DRIVER(                    \
+          class_,                            \
+          flags_,                            \
+          size_,                             \
+          name_,                             \
+          version_,                          \
+          requires_,                         \
+          interface_,                        \
+          init_,                             \
+          done_,                             \
+          get_interface_,                    \
+          face_object_size_,                 \
+          size_object_size_,                 \
+          slot_object_size_,                 \
+          init_face_,                        \
+          done_face_,                        \
+          init_size_,                        \
+          done_size_,                        \
+          init_slot_,                        \
+          done_slot_,                        \
+          load_glyph_,                       \
+          get_kerning_,                      \
+          attach_file_,                      \
+          get_advances_,                     \
+          request_size_,                     \
+          select_size_ )                     \
+  FT_CALLBACK_TABLE_DEF                      \
+  const FT_Driver_ClassRec  class_ =         \
+  {                                          \
+    FT_DEFINE_ROOT_MODULE( flags_,           \
+                           size_,            \
+                           name_,            \
+                           version_,         \
+                           requires_,        \
+                           interface_,       \
+                           init_,            \
+                           done_,            \
+                           get_interface_ )  \
+                                             \
+    face_object_size_,                       \
+    size_object_size_,                       \
+    slot_object_size_,                       \
+                                             \
+    init_face_,                              \
+    done_face_,                              \
+                                             \
+    init_size_,                              \
+    done_size_,                              \
+                                             \
+    init_slot_,                              \
+    done_slot_,                              \
+                                             \
+    load_glyph_,                             \
+                                             \
+    get_kerning_,                            \
+    attach_file_,                            \
+    get_advances_,                           \
+                                             \
+    request_size_,                           \
+    select_size_                             \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_DRIVER( class_ )  FT_DECLARE_MODULE( class_ )
+
+#define FT_DEFINE_DRIVER(                                        \
+          class_,                                                \
+          flags_,                                                \
+          size_,                                                 \
+          name_,                                                 \
+          version_,                                              \
+          requires_,                                             \
+          interface_,                                            \
+          init_,                                                 \
+          done_,                                                 \
+          get_interface_,                                        \
+          face_object_size_,                                     \
+          size_object_size_,                                     \
+          slot_object_size_,                                     \
+          init_face_,                                            \
+          done_face_,                                            \
+          init_size_,                                            \
+          done_size_,                                            \
+          init_slot_,                                            \
+          done_slot_,                                            \
+          load_glyph_,                                           \
+          get_kerning_,                                          \
+          attach_file_,                                          \
+          get_advances_,                                         \
+          request_size_,                                         \
+          select_size_ )                                         \
+  void                                                           \
+  FT_Destroy_Class_ ## class_( FT_Library        library,        \
+                               FT_Module_Class*  clazz )         \
+  {                                                              \
+    FT_Memory        memory = library->memory;                   \
+    FT_Driver_Class  dclazz = (FT_Driver_Class)clazz;            \
+                                                                 \
+                                                                 \
+    class_ ## _pic_free( library );                              \
+    if ( dclazz )                                                \
+      FT_FREE( dclazz );                                         \
+  }                                                              \
+                                                                 \
+                                                                 \
+  FT_Error                                                       \
+  FT_Create_Class_ ## class_( FT_Library         library,        \
+                              FT_Module_Class**  output_class )  \
+  {                                                              \
+    FT_Driver_Class  clazz  = NULL;                              \
+    FT_Error         error;                                      \
+    FT_Memory        memory = library->memory;                   \
+                                                                 \
+                                                                 \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \
+      return error;                                              \
+                                                                 \
+    error = class_ ## _pic_init( library );                      \
+    if ( error )                                                 \
+    {                                                            \
+      FT_FREE( clazz );                                          \
+      return error;                                              \
+    }                                                            \
+                                                                 \
+    FT_DEFINE_ROOT_MODULE( flags_,                               \
+                           size_,                                \
+                           name_,                                \
+                           version_,                             \
+                           requires_,                            \
+                           interface_,                           \
+                           init_,                                \
+                           done_,                                \
+                           get_interface_ )                      \
+                                                                 \
+    clazz->face_object_size = face_object_size_;                 \
+    clazz->size_object_size = size_object_size_;                 \
+    clazz->slot_object_size = slot_object_size_;                 \
+                                                                 \
+    clazz->init_face        = init_face_;                        \
+    clazz->done_face        = done_face_;                        \
+                                                                 \
+    clazz->init_size        = init_size_;                        \
+    clazz->done_size        = done_size_;                        \
+                                                                 \
+    clazz->init_slot        = init_slot_;                        \
+    clazz->done_slot        = done_slot_;                        \
+                                                                 \
+    clazz->load_glyph       = load_glyph_;                       \
+                                                                 \
+    clazz->get_kerning      = get_kerning_;                      \
+    clazz->attach_file      = attach_file_;                      \
+    clazz->get_advances     = get_advances_;                     \
+                                                                 \
+    clazz->request_size     = request_size_;                     \
+    clazz->select_size      = select_size_;                      \
+                                                                 \
+    *output_class = (FT_Module_Class*)clazz;                     \
+                                                                 \
+    return FT_Err_Ok;                                            \
+  }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __FTDRIVER_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftgloadr.h b/core/include/thirdparties/freetype/freetype/internal/ftgloadr.h
new file mode 100644
index 0000000..76e5a7e
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftgloadr.h
@@ -0,0 +1,168 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgloadr.h                                                             */
+/*                                                                         */
+/*    The FreeType glyph loader (specification).                           */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2005, 2006 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTGLOADR_H__
+#define __FTGLOADR_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_GlyphLoader                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The glyph loader is an internal object used to load several glyphs */
+  /*    together (for example, in the case of composites).                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The glyph loader implementation is not part of the high-level API, */
+  /*    hence the forward structure declaration.                           */
+  /*                                                                       */
+  typedef struct FT_GlyphLoaderRec_*  FT_GlyphLoader ;
+
+
+#if 0  /* moved to freetype.h in version 2.2 */
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2
+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4
+#define FT_SUBGLYPH_FLAG_SCALE                   8
+#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40
+#define FT_SUBGLYPH_FLAG_2X2                  0x80
+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200
+#endif
+
+
+  typedef struct  FT_SubGlyphRec_
+  {
+    FT_Int     index;
+    FT_UShort  flags;
+    FT_Int     arg1;
+    FT_Int     arg2;
+    FT_Matrix  transform;
+
+  } FT_SubGlyphRec;
+
+
+  typedef struct  FT_GlyphLoadRec_
+  {
+    FT_Outline   outline;       /* outline                   */
+    FT_Vector*   extra_points;  /* extra points table        */
+    FT_Vector*   extra_points2; /* second extra points table */
+    FT_UInt      num_subglyphs; /* number of subglyphs       */
+    FT_SubGlyph  subglyphs;     /* subglyphs                 */
+
+  } FT_GlyphLoadRec, *FT_GlyphLoad;
+
+
+  typedef struct  FT_GlyphLoaderRec_
+  {
+    FT_Memory        memory;
+    FT_UInt          max_points;
+    FT_UInt          max_contours;
+    FT_UInt          max_subglyphs;
+    FT_Bool          use_extra;
+
+    FT_GlyphLoadRec  base;
+    FT_GlyphLoadRec  current;
+
+    void*            other;            /* for possible future extension? */
+
+  } FT_GlyphLoaderRec;
+
+
+  /* create new empty glyph loader */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_New( FT_Memory        memory,
+                      FT_GlyphLoader  *aloader );
+
+  /* add an extra points table to a glyph loader */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader );
+
+  /* destroy a glyph loader */
+  FT_BASE( void )
+  FT_GlyphLoader_Done( FT_GlyphLoader  loader );
+
+  /* reset a glyph loader (frees everything int it) */
+  FT_BASE( void )
+  FT_GlyphLoader_Reset( FT_GlyphLoader  loader );
+
+  /* rewind a glyph loader */
+  FT_BASE( void )
+  FT_GlyphLoader_Rewind( FT_GlyphLoader  loader );
+
+  /* check that there is enough space to add `n_points' and `n_contours' */
+  /* to the glyph loader                                                 */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,
+                              FT_UInt         n_points,
+                              FT_UInt         n_contours );
+
+
+#define FT_GLYPHLOADER_CHECK_P( _loader, _count )                         \
+   ( (_count) == 0 || ((_loader)->base.outline.n_points    +              \
+                       (_loader)->current.outline.n_points +              \
+                       (unsigned long)(_count)) <= (_loader)->max_points )
+
+#define FT_GLYPHLOADER_CHECK_C( _loader, _count )                          \
+  ( (_count) == 0 || ((_loader)->base.outline.n_contours    +              \
+                      (_loader)->current.outline.n_contours +              \
+                      (unsigned long)(_count)) <= (_loader)->max_contours )
+
+#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours )      \
+  ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points )   &&                  \
+      FT_GLYPHLOADER_CHECK_C( _loader, _contours ) )                   \
+    ? 0                                                                \
+    : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) )
+
+
+  /* check that there is enough space to add `n_subs' sub-glyphs to */
+  /* a glyph loader                                                 */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,
+                                 FT_UInt         n_subs );
+
+  /* prepare a glyph loader, i.e. empty the current glyph */
+  FT_BASE( void )
+  FT_GlyphLoader_Prepare( FT_GlyphLoader  loader );
+
+  /* add the current glyph to the base glyph */
+  FT_BASE( void )
+  FT_GlyphLoader_Add( FT_GlyphLoader  loader );
+
+  /* copy points from one glyph loader to another */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_CopyPoints( FT_GlyphLoader  target,
+                             FT_GlyphLoader  source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGLOADR_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftmemory.h b/core/include/thirdparties/freetype/freetype/internal/ftmemory.h
new file mode 100644
index 0000000..67cbf43
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftmemory.h
@@ -0,0 +1,459 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmemory.h                                                             */
+/*                                                                         */
+/*    The FreeType memory management macros (specification).               */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004-2007, 2010, 2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTMEMORY_H__
+#define __FTMEMORY_H__
+
+
+#include "../../ft2build.h"
+#include "../config/ftconfig.h"
+#include "../fttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_SET_ERROR                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro is used to set an implicit `error' variable to a given  */
+  /*    expression's value (usually a function call), and convert it to a  */
+  /*    boolean which is set whenever the value is != 0.                   */
+  /*                                                                       */
+#undef  FT_SET_ERROR
+#define FT_SET_ERROR( expression ) \
+          ( ( error = (expression) ) != 0 )
+
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                           M E M O R Y                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*
+   *  C++ refuses to handle statements like p = (void*)anything, with `p' a
+   *  typed pointer.  Since we don't have a `typeof' operator in standard
+   *  C++, we have to use a template to emulate it.
+   */
+
+#ifdef __cplusplus
+
+  extern "C++"
+  template <typename T> inline T*
+  cplusplus_typeof(        T*,
+                    void  *v )
+  {
+    return static_cast <T*> ( v );
+  }
+
+#define FT_ASSIGNP( p, val )  (p) = cplusplus_typeof( (p), (val) )
+
+#else
+
+#define FT_ASSIGNP( p, val )  (p) = (val)
+
+#endif
+
+
+
+#ifdef FT_DEBUG_MEMORY
+
+  FT_BASE( const char* )  _ft_debug_file;
+  FT_BASE( long )         _ft_debug_lineno;
+
+#define FT_DEBUG_INNER( exp )  ( _ft_debug_file   = __FILE__, \
+                                 _ft_debug_lineno = __LINE__, \
+                                 (exp) )
+
+#define FT_ASSIGNP_INNER( p, exp )  ( _ft_debug_file   = __FILE__, \
+                                      _ft_debug_lineno = __LINE__, \
+                                      FT_ASSIGNP( p, exp ) )
+
+#else /* !FT_DEBUG_MEMORY */
+
+#define FT_DEBUG_INNER( exp )       (exp)
+#define FT_ASSIGNP_INNER( p, exp )  FT_ASSIGNP( p, exp )
+
+#endif /* !FT_DEBUG_MEMORY */
+
+
+  /*
+   *  The allocation functions return a pointer, and the error code
+   *  is written to through the `p_error' parameter.  See below for
+   *  for documentation.
+   */
+
+  FT_BASE( FT_Pointer )
+  ft_mem_alloc( FT_Memory  memory,
+                FT_Long    size,
+                FT_Error  *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_qalloc( FT_Memory  memory,
+                 FT_Long    size,
+                 FT_Error  *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_realloc( FT_Memory  memory,
+                  FT_Long    item_size,
+                  FT_Long    cur_count,
+                  FT_Long    new_count,
+                  void*      block,
+                  FT_Error  *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_qrealloc( FT_Memory  memory,
+                   FT_Long    item_size,
+                   FT_Long    cur_count,
+                   FT_Long    new_count,
+                   void*      block,
+                   FT_Error  *p_error );
+#ifdef _DEBUG

+//#define _XYQ_MEM_DEBUG

+#endif

+  

+#ifdef _XYQ_MEM_DEBUG		/* XYQ */

+  FT_BASE( FT_Pointer )

+	  ft_mem_allocdebug( FT_Memory  memory,

+	  FT_Long    size, const char* filename, int line,

+	  FT_Error  *p_error );

+  

+  FT_BASE( FT_Pointer )

+	  ft_mem_qallocdebug( FT_Memory  memory,

+	  FT_Long    size, const char* filename, int line,

+	  FT_Error  *p_error );

+  

+  FT_BASE( FT_Pointer )

+	  ft_mem_reallocdebug( FT_Memory  memory,

+	  FT_Long    item_size,

+	  FT_Long    cur_count,

+	  FT_Long    new_count,

+	  void*      block, const char* filename, int line,

+	  FT_Error  *p_error );

+  

+  FT_BASE( FT_Pointer )

+	  ft_mem_qreallocdebug( FT_Memory  memory,

+	  FT_Long    item_size,

+	  FT_Long    cur_count,

+	  FT_Long    new_count,

+	  void*      block, const char* filename, int line,

+	  FT_Error  *p_error );

+#endif

+
+
+  FT_BASE( void )
+  ft_mem_free( FT_Memory    memory,
+               const void*  P );
+
+
+#define FT_MEM_FREE( ptr )                \
+          FT_BEGIN_STMNT                  \
+            ft_mem_free( memory, (ptr) ); \
+            (ptr) = NULL;                 \
+          FT_END_STMNT
+#ifndef _XYQ_MEM_DEBUG

+#define FT_MEM_ALLOC( ptr, size )                                         \

+		  FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) )
+
+
+#define FT_MEM_REALLOC( ptr, cursz, newsz )                        \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,           \
+                                                 1,                \
+                                                 (FT_Long)(cursz), \
+                                                 (FT_Long)(newsz), \
+                                                 (ptr),            \
+                                                 &error ) )
+
+#define FT_MEM_QALLOC( ptr, size )                               \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory,          \
+                                                (FT_Long)(size), \
+                                                &error ) )
+
+#define FT_MEM_QREALLOC( ptr, cursz, newsz )                        \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,           \
+                                                  1,                \
+                                                  (FT_Long)(cursz), \
+                                                  (FT_Long)(newsz), \
+                                                  (ptr),            \
+                                                  &error ) )
+
+#define FT_MEM_ALLOC_MULT( ptr, count, item_size )                     \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,               \
+                                                 (FT_Long)(item_size), \
+                                                 0,                    \
+                                                 (FT_Long)(count),     \
+                                                 NULL,                 \
+                                                 &error ) )
+
+#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )           \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,            \
+                                                 (FT_Long)(itmsz),  \
+                                                 (FT_Long)(oldcnt), \
+                                                 (FT_Long)(newcnt), \
+                                                 (ptr),             \
+                                                 &error ) )
+
+#define FT_MEM_QALLOC_MULT( ptr, count, item_size )                     \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,               \
+                                                  (FT_Long)(item_size), \
+                                                  0,                    \
+                                                  (FT_Long)(count),     \
+                                                  NULL,                 \
+                                                  &error ) )
+
+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz)            \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,            \
+                                                  (FT_Long)(itmsz),  \
+                                                  (FT_Long)(oldcnt), \
+                                                  (FT_Long)(newcnt), \
+                                                  (ptr),             \
+                                                  &error ) )
+#define FT_MEM_NEW_ARRAY( ptr, count )                                      \

+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \

+                                                 0, (count),                \

+                                                 NULL, &error ) )

+

+#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz )                             \

+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \

+                                                 (cursz), (newsz),          \

+                                                 (ptr), &error ) )

+

+#define FT_MEM_QNEW_ARRAY( ptr, count )                                      \

+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \

+                                                  0, (count),                \

+                                                  NULL, &error ) )

+

+#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                             \

+	FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \

+	(cursz), (newsz),          \

+  (ptr), &error ) )

+  

+#else

+#define FT_MEM_ALLOC( ptr, size )                                         \

+  FT_ASSIGNP_INNER( ptr, ft_mem_allocdebug( memory, (size), __FILE__, __LINE__, &error ) )

+  

+#define FT_MEM_REALLOC( ptr, cursz, newsz )                        \

+	FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, 1,        \

+                                                  (cursz), (newsz),          \

+                                                 (ptr), __FILE__, __LINE__, &error ) )

+

+#define FT_MEM_QALLOC( ptr, size )                                         \

+          FT_ASSIGNP_INNER( ptr, ft_mem_qallocdebug( memory, (size), __FILE__, __LINE__, &error ) )

+

+#define FT_MEM_QREALLOC( ptr, cursz, newsz )                         \

+          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, 1,        \

+                                                  (cursz), (newsz), \

+                                                  (ptr), __FILE__, __LINE__, &error ) )

+

+#define FT_MEM_ALLOC_MULT( ptr, count, item_size )                    \

+          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (item_size), \

+                                                 0, (count),          \

+                                                 NULL, __FILE__, __LINE__, &error ) )

+

+#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )            \

+          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (itmsz),    \

+                                                 (oldcnt), (newcnt), \

+                                                 (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QALLOC_MULT( ptr, count, item_size )                    \

+          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (item_size), \

+                                                  0, (count),          \

+                                                  NULL, __FILE__, __LINE__, &error ) )

+

+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz)             \

+          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (itmsz),    \

+                                                  (oldcnt), (newcnt), \

+                                                  (ptr), __FILE__, __LINE__, &error ) )

+  /*************************************************************************/

+  /*                                                                       */

+  /* The following functions macros expect that their pointer argument is  */

+  /* _typed_ in order to automatically compute array element sizes.        */

+  /*                                                                       */

+

+#define FT_MEM_NEW_ARRAY( ptr, count )                                      \

+          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \

+                                                 0, (count),                \

+                                                 NULL, __FILE__, __LINE__, &error ) )

+

+#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz )                             \

+          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \

+                                                 (cursz), (newsz),          \

+                                                 (ptr), __FILE__, __LINE__, &error ) )

+

+#define FT_MEM_QNEW_ARRAY( ptr, count )                                      \

+          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \

+                                                  0, (count),                \

+                                                  NULL, __FILE__, __LINE__, &error ) )

+

+#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                             \

+          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \

+                                                  (cursz), (newsz),          \

+                                                  (ptr), __FILE__, __LINE__, &error ) )

+

+#endif

+

+#define FT_MEM_NEW( ptr )                        \

+          FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) )

+

+#define FT_MEM_QNEW( ptr )                        \

+          FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) )
+
+#define FT_MEM_SET_ERROR( cond )  ( (cond), error != 0 )
+
+
+#define FT_MEM_SET( dest, byte, count )     ft_memset( dest, byte, count )
+
+#define FT_MEM_COPY( dest, source, count )  ft_memcpy( dest, source, count )
+
+#define FT_MEM_MOVE( dest, source, count )  ft_memmove( dest, source, count )
+
+
+#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )
+
+#define FT_ZERO( p )                FT_MEM_ZERO( p, sizeof ( *(p) ) )
+
+
+#define FT_ARRAY_ZERO( dest, count )                        \
+          FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) )
+
+#define FT_ARRAY_COPY( dest, source, count )                        \
+          FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) )
+
+#define FT_ARRAY_MOVE( dest, source, count )                        \
+          FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) )
+
+
+  /*
+   *  Return the maximum number of addressable elements in an array.
+   *  We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid
+   *  any problems.
+   */
+#define FT_ARRAY_MAX( ptr )           ( FT_INT_MAX / sizeof ( *(ptr) ) )
+
+#define FT_ARRAY_CHECK( ptr, count )  ( (count) <= FT_ARRAY_MAX( ptr ) )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The following functions macros expect that their pointer argument is  */
+  /* _typed_ in order to automatically compute array element sizes.        */
+  /*                                                                       */
+
+#define FT_ALLOC( ptr, size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) )
+
+#define FT_REALLOC( ptr, cursz, newsz )                           \
+          FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) )
+
+#define FT_ALLOC_MULT( ptr, count, item_size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) )
+
+#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \
+          FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt,      \
+                                                 newcnt, itmsz ) )
+
+#define FT_QALLOC( ptr, size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) )
+
+#define FT_QREALLOC( ptr, cursz, newsz )                           \
+          FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) )
+
+#define FT_QALLOC_MULT( ptr, count, item_size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) )
+
+#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \
+          FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt,      \
+                                                  newcnt, itmsz ) )
+
+#define FT_FREE( ptr )  FT_MEM_FREE( ptr )
+
+#define FT_NEW( ptr )  FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) )
+
+#define FT_NEW_ARRAY( ptr, count )                           \
+          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
+
+#define FT_RENEW_ARRAY( ptr, curcnt, newcnt )                           \
+          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+#define FT_QNEW( ptr )                           \
+          FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) )
+
+#define FT_QNEW_ARRAY( ptr, count )                          \
+          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
+
+#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt )                          \
+          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+
+  FT_BASE( FT_Pointer )
+  ft_mem_strdup( FT_Memory    memory,
+                 const char*  str,
+                 FT_Error    *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_dup( FT_Memory    memory,
+              const void*  address,
+              FT_ULong     size,
+              FT_Error    *p_error );
+
+
+#define FT_MEM_STRDUP( dst, str )                                            \
+          (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error )
+
+#define FT_STRDUP( dst, str )                           \
+          FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) )
+
+#define FT_MEM_DUP( dst, address, size )                                    \
+          (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )
+
+#define FT_DUP( dst, address, size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) )
+
+
+  /* Return >= 1 if a truncation occurs.            */
+  /* Return 0 if the source string fits the buffer. */
+  /* This is *not* the same as strlcpy().           */
+  FT_BASE( FT_Int )
+  ft_mem_strcpyn( char*        dst,
+                  const char*  src,
+                  FT_ULong     size );
+
+#define FT_STRCPYN( dst, src, size )                                         \
+          ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) )
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMEMORY_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftobjs.h b/core/include/thirdparties/freetype/freetype/internal/ftobjs.h
new file mode 100644
index 0000000..d6f7de3
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftobjs.h
@@ -0,0 +1,1569 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftobjs.h                                                               */
+/*                                                                         */
+/*    The FreeType private base classes (specification).                   */
+/*                                                                         */
+/*  Copyright 1996-2006, 2008, 2010, 2012-2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  This file contains the definition of all internal FreeType classes.  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTOBJS_H__
+#define __FTOBJS_H__
+
+#include "../../ft2build.h"
+#include "../ftrender.h"
+#include "../ftsizes.h"
+#include "../ftlcdfil.h"
+#include "ftmemory.h"
+#include "ftgloadr.h"
+#include "ftdriver.h"
+#include "autohint.h"
+#include "ftserv.h"
+#include "ftpic.h"
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+#include "../ftincrem.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Some generic definitions.                                             */
+  /*                                                                       */
+#ifndef TRUE
+#define TRUE  1
+#endif
+
+#ifndef FALSE
+#define FALSE  0
+#endif
+
+#ifndef NULL
+#define NULL  (void*)0
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The min and max functions missing in C.  As usual, be careful not to  */
+  /* write things like FT_MIN( a++, b++ ) to avoid side effects.           */
+  /*                                                                       */
+#define FT_MIN( a, b )  ( (a) < (b) ? (a) : (b) )
+#define FT_MAX( a, b )  ( (a) > (b) ? (a) : (b) )
+
+#define FT_ABS( a )     ( (a) < 0 ? -(a) : (a) )
+
+
+#define FT_PAD_FLOOR( x, n )  ( (x) & ~((n)-1) )
+#define FT_PAD_ROUND( x, n )  FT_PAD_FLOOR( (x) + ((n)/2), n )
+#define FT_PAD_CEIL( x, n )   FT_PAD_FLOOR( (x) + ((n)-1), n )
+
+#define FT_PIX_FLOOR( x )     ( (x) & ~63 )
+#define FT_PIX_ROUND( x )     FT_PIX_FLOOR( (x) + 32 )
+#define FT_PIX_CEIL( x )      FT_PIX_FLOOR( (x) + 63 )
+
+
+  /*
+   *  Return the highest power of 2 that is <= value; this correspond to
+   *  the highest bit in a given 32-bit value.
+   */
+  FT_BASE( FT_UInt32 )
+  ft_highpow2( FT_UInt32  value );
+
+
+  /*
+   *  character classification functions -- since these are used to parse
+   *  font files, we must not use those in <ctypes.h> which are
+   *  locale-dependent
+   */
+#define  ft_isdigit( x )   ( ( (unsigned)(x) - '0' ) < 10U )
+
+#define  ft_isxdigit( x )  ( ( (unsigned)(x) - '0' ) < 10U || \
+                             ( (unsigned)(x) - 'a' ) < 6U  || \
+                             ( (unsigned)(x) - 'A' ) < 6U  )
+
+  /* the next two macros assume ASCII representation */
+#define  ft_isupper( x )  ( ( (unsigned)(x) - 'A' ) < 26U )
+#define  ft_islower( x )  ( ( (unsigned)(x) - 'a' ) < 26U )
+
+#define  ft_isalpha( x )  ( ft_isupper( x ) || ft_islower( x ) )
+#define  ft_isalnum( x )  ( ft_isdigit( x ) || ft_isalpha( x ) )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                       C H A R M A P S                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* handle to internal charmap object */
+  typedef struct FT_CMapRec_*              FT_CMap;
+
+  /* handle to charmap class structure */
+  typedef const struct FT_CMap_ClassRec_*  FT_CMap_Class;
+
+  /* internal charmap object structure */
+  typedef struct  FT_CMapRec_
+  {
+    FT_CharMapRec  charmap;
+    FT_CMap_Class  clazz;
+
+  } FT_CMapRec;
+
+  /* typecase any pointer to a charmap handle */
+#define FT_CMAP( x )              ((FT_CMap)( x ))
+
+  /* obvious macros */
+#define FT_CMAP_PLATFORM_ID( x )  FT_CMAP( x )->charmap.platform_id
+#define FT_CMAP_ENCODING_ID( x )  FT_CMAP( x )->charmap.encoding_id
+#define FT_CMAP_ENCODING( x )     FT_CMAP( x )->charmap.encoding
+#define FT_CMAP_FACE( x )         FT_CMAP( x )->charmap.face
+
+
+  /* class method definitions */
+  typedef FT_Error
+  (*FT_CMap_InitFunc)( FT_CMap     cmap,
+                       FT_Pointer  init_data );
+
+  typedef void
+  (*FT_CMap_DoneFunc)( FT_CMap  cmap );
+
+  typedef FT_UInt
+  (*FT_CMap_CharIndexFunc)( FT_CMap    cmap,
+                            FT_UInt32  char_code );
+
+  typedef FT_UInt
+  (*FT_CMap_CharNextFunc)( FT_CMap     cmap,
+                           FT_UInt32  *achar_code );
+
+  typedef FT_UInt
+  (*FT_CMap_CharVarIndexFunc)( FT_CMap    cmap,
+                               FT_CMap    unicode_cmap,
+                               FT_UInt32  char_code,
+                               FT_UInt32  variant_selector );
+
+  typedef FT_Bool
+  (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap    cmap,
+                                   FT_UInt32  char_code,
+                                   FT_UInt32  variant_selector );
+
+  typedef FT_UInt32 *
+  (*FT_CMap_VariantListFunc)( FT_CMap    cmap,
+                              FT_Memory  mem );
+
+  typedef FT_UInt32 *
+  (*FT_CMap_CharVariantListFunc)( FT_CMap    cmap,
+                                  FT_Memory  mem,
+                                  FT_UInt32  char_code );
+
+  typedef FT_UInt32 *
+  (*FT_CMap_VariantCharListFunc)( FT_CMap    cmap,
+                                  FT_Memory  mem,
+                                  FT_UInt32  variant_selector );
+
+
+  typedef struct  FT_CMap_ClassRec_
+  {
+    FT_ULong               size;
+    FT_CMap_InitFunc       init;
+    FT_CMap_DoneFunc       done;
+    FT_CMap_CharIndexFunc  char_index;
+    FT_CMap_CharNextFunc   char_next;
+
+    /* Subsequent entries are special ones for format 14 -- the variant */
+    /* selector subtable which behaves like no other                    */
+
+    FT_CMap_CharVarIndexFunc      char_var_index;
+    FT_CMap_CharVarIsDefaultFunc  char_var_default;
+    FT_CMap_VariantListFunc       variant_list;
+    FT_CMap_CharVariantListFunc   charvariant_list;
+    FT_CMap_VariantCharListFunc   variantchar_list;
+
+  } FT_CMap_ClassRec;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_CMAP_CLASS( class_ )              \
+  FT_CALLBACK_TABLE const  FT_CMap_ClassRec class_;
+
+#define FT_DEFINE_CMAP_CLASS(       \
+          class_,                   \
+          size_,                    \
+          init_,                    \
+          done_,                    \
+          char_index_,              \
+          char_next_,               \
+          char_var_index_,          \
+          char_var_default_,        \
+          variant_list_,            \
+          charvariant_list_,        \
+          variantchar_list_ )       \
+  FT_CALLBACK_TABLE_DEF             \
+  const FT_CMap_ClassRec  class_ =  \
+  {                                 \
+    size_,                          \
+    init_,                          \
+    done_,                          \
+    char_index_,                    \
+    char_next_,                     \
+    char_var_index_,                \
+    char_var_default_,              \
+    variant_list_,                  \
+    charvariant_list_,              \
+    variantchar_list_               \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_CMAP_CLASS( class_ )                  \
+  void                                                   \
+  FT_Init_Class_ ## class_( FT_Library         library,  \
+                            FT_CMap_ClassRec*  clazz );
+
+#define FT_DEFINE_CMAP_CLASS(                            \
+          class_,                                        \
+          size_,                                         \
+          init_,                                         \
+          done_,                                         \
+          char_index_,                                   \
+          char_next_,                                    \
+          char_var_index_,                               \
+          char_var_default_,                             \
+          variant_list_,                                 \
+          charvariant_list_,                             \
+          variantchar_list_ )                            \
+  void                                                   \
+  FT_Init_Class_ ## class_( FT_Library         library,  \
+                            FT_CMap_ClassRec*  clazz )   \
+  {                                                      \
+    FT_UNUSED( library );                                \
+                                                         \
+    clazz->size             = size_;                     \
+    clazz->init             = init_;                     \
+    clazz->done             = done_;                     \
+    clazz->char_index       = char_index_;               \
+    clazz->char_next        = char_next_;                \
+    clazz->char_var_index   = char_var_index_;           \
+    clazz->char_var_default = char_var_default_;         \
+    clazz->variant_list     = variant_list_;             \
+    clazz->charvariant_list = charvariant_list_;         \
+    clazz->variantchar_list = variantchar_list_;         \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /* create a new charmap and add it to charmap->face */
+  FT_BASE( FT_Error )
+  FT_CMap_New( FT_CMap_Class  clazz,
+               FT_Pointer     init_data,
+               FT_CharMap     charmap,
+               FT_CMap       *acmap );
+
+  /* destroy a charmap and remove it from face's list */
+  FT_BASE( void )
+  FT_CMap_Done( FT_CMap  cmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Face_InternalRec                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure contains the internal fields of each FT_Face        */
+  /*    object.  These fields may change between different releases of     */
+  /*    FreeType.                                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    max_points ::                                                      */
+  /*      The maximum number of points used to store the vectorial outline */
+  /*      of any glyph in this face.  If this value cannot be known in     */
+  /*      advance, or if the face isn't scalable, this should be set to 0. */
+  /*      Only relevant for scalable formats.                              */
+  /*                                                                       */
+  /*    max_contours ::                                                    */
+  /*      The maximum number of contours used to store the vectorial       */
+  /*      outline of any glyph in this face.  If this value cannot be      */
+  /*      known in advance, or if the face isn't scalable, this should be  */
+  /*      set to 0.  Only relevant for scalable formats.                   */
+  /*                                                                       */
+  /*    transform_matrix ::                                                */
+  /*      A 2x2 matrix of 16.16 coefficients used to transform glyph       */
+  /*      outlines after they are loaded from the font.  Only used by the  */
+  /*      convenience functions.                                           */
+  /*                                                                       */
+  /*    transform_delta ::                                                 */
+  /*      A translation vector used to transform glyph outlines after they */
+  /*      are loaded from the font.  Only used by the convenience          */
+  /*      functions.                                                       */
+  /*                                                                       */
+  /*    transform_flags ::                                                 */
+  /*      Some flags used to classify the transform.  Only used by the     */
+  /*      convenience functions.                                           */
+  /*                                                                       */
+  /*    services ::                                                        */
+  /*      A cache for frequently used services.  It should be only         */
+  /*      accessed with the macro `FT_FACE_LOOKUP_SERVICE'.                */
+  /*                                                                       */
+  /*    incremental_interface ::                                           */
+  /*      If non-null, the interface through which glyph data and metrics  */
+  /*      are loaded incrementally for faces that do not provide all of    */
+  /*      this data when first opened.  This field exists only if          */
+  /*      @FT_CONFIG_OPTION_INCREMENTAL is defined.                        */
+  /*                                                                       */
+  /*    ignore_unpatented_hinter ::                                        */
+  /*      This boolean flag instructs the glyph loader to ignore the       */
+  /*      native font hinter, if one is found.  This is exclusively used   */
+  /*      in the case when the unpatented hinter is compiled within the    */
+  /*      library.                                                         */
+  /*                                                                       */
+  /*    refcount ::                                                        */
+  /*      A counter initialized to~1 at the time an @FT_Face structure is  */
+  /*      created.  @FT_Reference_Face increments this counter, and        */
+  /*      @FT_Done_Face only destroys a face if the counter is~1,          */
+  /*      otherwise it simply decrements it.                               */
+  /*                                                                       */
+  typedef struct  FT_Face_InternalRec_
+  {
+    FT_Matrix           transform_matrix;
+    FT_Vector           transform_delta;
+    FT_Int              transform_flags;
+
+    FT_ServiceCacheRec  services;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_Incremental_InterfaceRec*  incremental_interface;
+#endif
+
+    FT_Bool             ignore_unpatented_hinter;
+    FT_Int              refcount;
+
+  } FT_Face_InternalRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Slot_InternalRec                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure contains the internal fields of each FT_GlyphSlot   */
+  /*    object.  These fields may change between different releases of     */
+  /*    FreeType.                                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    loader            :: The glyph loader object used to load outlines */
+  /*                         into the glyph slot.                          */
+  /*                                                                       */
+  /*    flags             :: Possible values are zero or                   */
+  /*                         FT_GLYPH_OWN_BITMAP.  The latter indicates    */
+  /*                         that the FT_GlyphSlot structure owns the      */
+  /*                         bitmap buffer.                                */
+  /*                                                                       */
+  /*    glyph_transformed :: Boolean.  Set to TRUE when the loaded glyph   */
+  /*                         must be transformed through a specific        */
+  /*                         font transformation.  This is _not_ the same  */
+  /*                         as the face transform set through             */
+  /*                         FT_Set_Transform().                           */
+  /*                                                                       */
+  /*    glyph_matrix      :: The 2x2 matrix corresponding to the glyph     */
+  /*                         transformation, if necessary.                 */
+  /*                                                                       */
+  /*    glyph_delta       :: The 2d translation vector corresponding to    */
+  /*                         the glyph transformation, if necessary.       */
+  /*                                                                       */
+  /*    glyph_hints       :: Format-specific glyph hints management.       */
+  /*                                                                       */
+
+#define FT_GLYPH_OWN_BITMAP  0x1
+
+  typedef struct  FT_Slot_InternalRec_
+  {
+    FT_GlyphLoader  loader;
+    FT_UInt         flags;
+    FT_Bool         glyph_transformed;
+    FT_Matrix       glyph_matrix;
+    FT_Vector       glyph_delta;
+    void*           glyph_hints;
+
+  } FT_GlyphSlot_InternalRec;
+
+
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Size_InternalRec                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure contains the internal fields of each FT_Size        */
+  /*    object.  Currently, it's empty.                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+  typedef struct  FT_Size_InternalRec_
+  {
+    /* empty */
+
+  } FT_Size_InternalRec;
+
+#endif
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                         M O D U L E S                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_ModuleRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A module object instance.                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    clazz   :: A pointer to the module's class.                        */
+  /*                                                                       */
+  /*    library :: A handle to the parent library object.                  */
+  /*                                                                       */
+  /*    memory  :: A handle to the memory manager.                         */
+  /*                                                                       */
+  typedef struct  FT_ModuleRec_
+  {
+    FT_Module_Class*  clazz;
+    FT_Library        library;
+    FT_Memory         memory;
+
+  } FT_ModuleRec;
+
+
+  /* typecast an object to an FT_Module */
+#define FT_MODULE( x )          ((FT_Module)( x ))
+#define FT_MODULE_CLASS( x )    FT_MODULE( x )->clazz
+#define FT_MODULE_LIBRARY( x )  FT_MODULE( x )->library
+#define FT_MODULE_MEMORY( x )   FT_MODULE( x )->memory
+
+
+#define FT_MODULE_IS_DRIVER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                    FT_MODULE_FONT_DRIVER )
+
+#define FT_MODULE_IS_RENDERER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                      FT_MODULE_RENDERER )
+
+#define FT_MODULE_IS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                    FT_MODULE_HINTER )
+
+#define FT_MODULE_IS_STYLER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                    FT_MODULE_STYLER )
+
+#define FT_DRIVER_IS_SCALABLE( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                      FT_MODULE_DRIVER_SCALABLE )
+
+#define FT_DRIVER_USES_OUTLINES( x )  !( FT_MODULE_CLASS( x )->module_flags & \
+                                         FT_MODULE_DRIVER_NO_OUTLINES )
+
+#define FT_DRIVER_HAS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                     FT_MODULE_DRIVER_HAS_HINTER )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Module_Interface                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finds a module and returns its specific interface as a typeless    */
+  /*    pointer.                                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library     :: A handle to the library object.                     */
+  /*                                                                       */
+  /*    module_name :: The module's name (as an ASCII string).             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A module-specific interface if available, 0 otherwise.             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You should better be familiar with FreeType internals to know      */
+  /*    which module to look for, and what its interface is :-)            */
+  /*                                                                       */
+  FT_BASE( const void* )
+  FT_Get_Module_Interface( FT_Library   library,
+                           const char*  mod_name );
+
+  FT_BASE( FT_Pointer )
+  ft_module_get_service( FT_Module    module,
+                         const char*  service_id );
+
+  /* */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****   F A C E,   S I Z E   &   G L Y P H   S L O T   O B J E C T S  ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* a few macros used to perform easy typecasts with minimal brain damage */
+
+#define FT_FACE( x )          ((FT_Face)(x))
+#define FT_SIZE( x )          ((FT_Size)(x))
+#define FT_SLOT( x )          ((FT_GlyphSlot)(x))
+
+#define FT_FACE_DRIVER( x )   FT_FACE( x )->driver
+#define FT_FACE_LIBRARY( x )  FT_FACE_DRIVER( x )->root.library
+#define FT_FACE_MEMORY( x )   FT_FACE( x )->memory
+#define FT_FACE_STREAM( x )   FT_FACE( x )->stream
+
+#define FT_SIZE_FACE( x )     FT_SIZE( x )->face
+#define FT_SLOT_FACE( x )     FT_SLOT( x )->face
+
+#define FT_FACE_SLOT( x )     FT_FACE( x )->glyph
+#define FT_FACE_SIZE( x )     FT_FACE( x )->size
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_GlyphSlot                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    It is sometimes useful to have more than one glyph slot for a      */
+  /*    given face object.  This function is used to create additional     */
+  /*    slots.  All of them are automatically discarded when the face is   */
+  /*    destroyed.                                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face  :: A handle to a parent face object.                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aslot :: A handle to a new glyph slot object.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_BASE( FT_Error )
+  FT_New_GlyphSlot( FT_Face        face,
+                    FT_GlyphSlot  *aslot );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_GlyphSlot                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroys a given glyph slot.  Remember however that all slots are  */
+  /*    automatically destroyed with its parent.  Using this function is   */
+  /*    not always mandatory.                                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot :: A handle to a target glyph slot.                           */
+  /*                                                                       */
+  FT_BASE( void )
+  FT_Done_GlyphSlot( FT_GlyphSlot  slot );
+
+ /* */
+
+#define FT_REQUEST_WIDTH( req )                                            \
+          ( (req)->horiResolution                                          \
+              ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \
+              : (req)->width )
+
+#define FT_REQUEST_HEIGHT( req )                                            \
+          ( (req)->vertResolution                                           \
+              ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \
+              : (req)->height )
+
+
+  /* Set the metrics according to a bitmap strike. */
+  FT_BASE( void )
+  FT_Select_Metrics( FT_Face   face,
+                     FT_ULong  strike_index );
+
+
+  /* Set the metrics according to a size request. */
+  FT_BASE( void )
+  FT_Request_Metrics( FT_Face          face,
+                      FT_Size_Request  req );
+
+
+  /* Match a size request against `available_sizes'. */
+  FT_BASE( FT_Error )
+  FT_Match_Size( FT_Face          face,
+                 FT_Size_Request  req,
+                 FT_Bool          ignore_width,
+                 FT_ULong*        size_index );
+
+
+  /* Use the horizontal metrics to synthesize the vertical metrics. */
+  /* If `advance' is zero, it is also synthesized.                  */
+  FT_BASE( void )
+  ft_synthesize_vertical_metrics( FT_Glyph_Metrics*  metrics,
+                                  FT_Pos             advance );
+
+
+  /* Free the bitmap of a given glyphslot when needed (i.e., only when it */
+  /* was allocated with ft_glyphslot_alloc_bitmap).                       */
+  FT_BASE( void )
+  ft_glyphslot_free_bitmap( FT_GlyphSlot  slot );
+
+
+  /* Allocate a new bitmap buffer in a glyph slot. */
+  FT_BASE( FT_Error )
+  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,
+                             FT_ULong      size );
+
+
+  /* Set the bitmap buffer in a glyph slot to a given pointer.  The buffer */
+  /* will not be freed by a later call to ft_glyphslot_free_bitmap.        */
+  FT_BASE( void )
+  ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,
+                           FT_Byte*      buffer );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                        R E N D E R E R S                        ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#define FT_RENDERER( x )      ((FT_Renderer)( x ))
+#define FT_GLYPH( x )         ((FT_Glyph)( x ))
+#define FT_BITMAP_GLYPH( x )  ((FT_BitmapGlyph)( x ))
+#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x ))
+
+
+  typedef struct  FT_RendererRec_
+  {
+    FT_ModuleRec            root;
+    FT_Renderer_Class*      clazz;
+    FT_Glyph_Format         glyph_format;
+    FT_Glyph_Class          glyph_class;
+
+    FT_Raster               raster;
+    FT_Raster_Render_Func   raster_render;
+    FT_Renderer_RenderFunc  render;
+
+  } FT_RendererRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                    F O N T   D R I V E R S                      ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* typecast a module into a driver easily */
+#define FT_DRIVER( x )        ((FT_Driver)(x))
+
+  /* typecast a module as a driver, and get its driver class */
+#define FT_DRIVER_CLASS( x )  FT_DRIVER( x )->clazz
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_DriverRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The root font driver class.  A font driver is responsible for      */
+  /*    managing and loading font files of a given format.                 */
+  /*                                                                       */
+  /*  <Fields>                                                             */
+  /*     root         :: Contains the fields of the root module class.     */
+  /*                                                                       */
+  /*     clazz        :: A pointer to the font driver's class.  Note that  */
+  /*                     this is NOT root.clazz.  `class' wasn't used      */
+  /*                     as it is a reserved word in C++.                  */
+  /*                                                                       */
+  /*     faces_list   :: The list of faces currently opened by this        */
+  /*                     driver.                                           */
+  /*                                                                       */
+  /*     glyph_loader :: The glyph loader for all faces managed by this    */
+  /*                     driver.  This object isn't defined for unscalable */
+  /*                     formats.                                          */
+  /*                                                                       */
+  typedef struct  FT_DriverRec_
+  {
+    FT_ModuleRec     root;
+    FT_Driver_Class  clazz;
+    FT_ListRec       faces_list;
+    FT_GlyphLoader   glyph_loader;
+
+  } FT_DriverRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                       L I B R A R I E S                         ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* This hook is used by the TrueType debugger.  It must be set to an */
+  /* alternate truetype bytecode interpreter function.                 */
+#define FT_DEBUG_HOOK_TRUETYPE            0
+
+
+  /* Set this debug hook to a non-null pointer to force unpatented hinting */
+  /* for all faces when both TT_USE_BYTECODE_INTERPRETER and               */
+  /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined.  This is only used   */
+  /* during debugging.                                                     */
+#define FT_DEBUG_HOOK_UNPATENTED_HINTING  1
+
+
+  typedef void  (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap*      bitmap,
+                                            FT_Render_Mode  render_mode,
+                                            FT_Library      library );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_LibraryRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The FreeType library class.  This is the root of all FreeType      */
+  /*    data.  Use FT_New_Library() to create a library object, and        */
+  /*    FT_Done_Library() to discard it and all child objects.             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory           :: The library's memory object.  Manages memory   */
+  /*                        allocation.                                    */
+  /*                                                                       */
+  /*    version_major    :: The major version number of the library.       */
+  /*                                                                       */
+  /*    version_minor    :: The minor version number of the library.       */
+  /*                                                                       */
+  /*    version_patch    :: The current patch level of the library.        */
+  /*                                                                       */
+  /*    num_modules      :: The number of modules currently registered     */
+  /*                        within this library.  This is set to 0 for new */
+  /*                        libraries.  New modules are added through the  */
+  /*                        FT_Add_Module() API function.                  */
+  /*                                                                       */
+  /*    modules          :: A table used to store handles to the currently */
+  /*                        registered modules. Note that each font driver */
+  /*                        contains a list of its opened faces.           */
+  /*                                                                       */
+  /*    renderers        :: The list of renderers currently registered     */
+  /*                        within the library.                            */
+  /*                                                                       */
+  /*    cur_renderer     :: The current outline renderer.  This is a       */
+  /*                        shortcut used to avoid parsing the list on     */
+  /*                        each call to FT_Outline_Render().  It is a     */
+  /*                        handle to the current renderer for the         */
+  /*                        FT_GLYPH_FORMAT_OUTLINE format.                */
+  /*                                                                       */
+  /*    auto_hinter      :: XXX                                            */
+  /*                                                                       */
+  /*    raster_pool      :: The raster object's render pool.  This can     */
+  /*                        ideally be changed dynamically at run-time.    */
+  /*                                                                       */
+  /*    raster_pool_size :: The size of the render pool in bytes.          */
+  /*                                                                       */
+  /*    debug_hooks      :: XXX                                            */
+  /*                                                                       */
+  /*    lcd_filter       :: If subpixel rendering is activated, the        */
+  /*                        selected LCD filter mode.                      */
+  /*                                                                       */
+  /*    lcd_extra        :: If subpixel rendering is activated, the number */
+  /*                        of extra pixels needed for the LCD filter.     */
+  /*                                                                       */
+  /*    lcd_weights      :: If subpixel rendering is activated, the LCD    */
+  /*                        filter weights, if any.                        */
+  /*                                                                       */
+  /*    lcd_filter_func  :: If subpixel rendering is activated, the LCD    */
+  /*                        filtering callback function.                   */
+  /*                                                                       */
+  /*    pic_container    :: Contains global structs and tables, instead    */
+  /*                        of defining them globallly.                    */
+  /*                                                                       */
+  /*    refcount         :: A counter initialized to~1 at the time an      */
+  /*                        @FT_Library structure is created.              */
+  /*                        @FT_Reference_Library increments this counter, */
+  /*                        and @FT_Done_Library only destroys a library   */
+  /*                        if the counter is~1, otherwise it simply       */
+  /*                        decrements it.                                 */
+  /*                                                                       */
+  typedef struct  FT_LibraryRec_
+  {
+    FT_Memory          memory;           /* library's memory manager */
+
+    FT_Int             version_major;
+    FT_Int             version_minor;
+    FT_Int             version_patch;
+
+    FT_UInt            num_modules;
+    FT_Module          modules[FT_MAX_MODULES];  /* module objects  */
+
+    FT_ListRec         renderers;        /* list of renderers        */
+    FT_Renderer        cur_renderer;     /* current outline renderer */
+    FT_Module          auto_hinter;
+
+    FT_Byte*           raster_pool;      /* scan-line conversion */
+                                         /* render pool          */
+    FT_ULong           raster_pool_size; /* size of render pool in bytes */
+
+    FT_DebugHook_Func  debug_hooks[4];
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+    FT_LcdFilter             lcd_filter;
+    FT_Int                   lcd_extra;        /* number of extra pixels */
+    FT_Byte                  lcd_weights[7];   /* filter weights, if any */
+    FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */
+#endif
+
+#ifdef FT_CONFIG_OPTION_PIC
+    FT_PIC_Container   pic_container;
+#endif
+
+    FT_Int             refcount;
+
+  } FT_LibraryRec;
+
+
+  FT_BASE( FT_Renderer )
+  FT_Lookup_Renderer( FT_Library       library,
+                      FT_Glyph_Format  format,
+                      FT_ListNode*     node );
+
+  FT_BASE( FT_Error )
+  FT_Render_Glyph_Internal( FT_Library      library,
+                            FT_GlyphSlot    slot,
+                            FT_Render_Mode  render_mode );
+
+  typedef const char*
+  (*FT_Face_GetPostscriptNameFunc)( FT_Face  face );
+
+  typedef FT_Error
+  (*FT_Face_GetGlyphNameFunc)( FT_Face     face,
+                               FT_UInt     glyph_index,
+                               FT_Pointer  buffer,
+                               FT_UInt     buffer_max );
+
+  typedef FT_UInt
+  (*FT_Face_GetGlyphNameIndexFunc)( FT_Face     face,
+                                    FT_String*  glyph_name );
+
+
+#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Memory                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Creates a new memory object.                                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A pointer to the new memory object.  0 in case of error.           */
+  /*                                                                       */
+  FT_BASE( FT_Memory )
+  FT_New_Memory( void );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Memory                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discards memory manager.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A handle to the memory manager.                          */
+  /*                                                                       */
+  FT_BASE( void )
+  FT_Done_Memory( FT_Memory  memory );
+
+#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
+
+
+  /* Define default raster's interface.  The default raster is located in  */
+  /* `src/base/ftraster.c'.                                                */
+  /*                                                                       */
+  /* Client applications can register new rasters through the              */
+  /* FT_Set_Raster() API.                                                  */
+
+#ifndef FT_NO_DEFAULT_RASTER
+  FT_EXPORT_VAR( FT_Raster_Funcs )  ft_default_raster;
+#endif
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                      P I C   S U P P O R T                      ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* PIC support macros for ftimage.h */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_OUTLINE_FUNCS                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Outline_Funcs struct.         */
+  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */
+  /*    be called with a pre-allocated structure to be filled.             */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_OUTLINE_FUNCS(           \
+          class_,                          \
+          move_to_,                        \
+          line_to_,                        \
+          conic_to_,                       \
+          cubic_to_,                       \
+          shift_,                          \
+          delta_ )                         \
+  static const  FT_Outline_Funcs class_ =  \
+  {                                        \
+    move_to_,                              \
+    line_to_,                              \
+    conic_to_,                             \
+    cubic_to_,                             \
+    shift_,                                \
+    delta_                                 \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_OUTLINE_FUNCS(                     \
+          class_,                                    \
+          move_to_,                                  \
+          line_to_,                                  \
+          conic_to_,                                 \
+          cubic_to_,                                 \
+          shift_,                                    \
+          delta_ )                                   \
+  static FT_Error                                    \
+  Init_Class_ ## class_( FT_Outline_Funcs*  clazz )  \
+  {                                                  \
+    clazz->move_to  = move_to_;                      \
+    clazz->line_to  = line_to_;                      \
+    clazz->conic_to = conic_to_;                     \
+    clazz->cubic_to = cubic_to_;                     \
+    clazz->shift    = shift_;                        \
+    clazz->delta    = delta_;                        \
+                                                     \
+    return FT_Err_Ok;                                \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_RASTER_FUNCS                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Raster_Funcs struct.          */
+  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */
+  /*    be called with a pre-allocated structure to be filled.             */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_RASTER_FUNCS(    \
+          class_,                  \
+          glyph_format_,           \
+          raster_new_,             \
+          raster_reset_,           \
+          raster_set_mode_,        \
+          raster_render_,          \
+          raster_done_ )           \
+  const FT_Raster_Funcs  class_ =  \
+  {                                \
+    glyph_format_,                 \
+    raster_new_,                   \
+    raster_reset_,                 \
+    raster_set_mode_,              \
+    raster_render_,                \
+    raster_done_                   \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_RASTER_FUNCS(                        \
+          class_,                                      \
+          glyph_format_,                               \
+          raster_new_,                                 \
+          raster_reset_,                               \
+          raster_set_mode_,                            \
+          raster_render_,                              \
+          raster_done_ )                               \
+  void                                                 \
+  FT_Init_Class_ ## class_( FT_Raster_Funcs*  clazz )  \
+  {                                                    \
+    clazz->glyph_format    = glyph_format_;            \
+    clazz->raster_new      = raster_new_;              \
+    clazz->raster_reset    = raster_reset_;            \
+    clazz->raster_set_mode = raster_set_mode_;         \
+    clazz->raster_render   = raster_render_;           \
+    clazz->raster_done     = raster_done_;             \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /* PIC support macros for ftrender.h */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_GLYPH                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Glyph_Class struct.           */
+  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */
+  /*    be called with a pre-allocated stcture to be filled.               */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_GLYPH(          \
+          class_,                 \
+          size_,                  \
+          format_,                \
+          init_,                  \
+          done_,                  \
+          copy_,                  \
+          transform_,             \
+          bbox_,                  \
+          prepare_ )              \
+  FT_CALLBACK_TABLE_DEF           \
+  const FT_Glyph_Class  class_ =  \
+  {                               \
+    size_,                        \
+    format_,                      \
+    init_,                        \
+    done_,                        \
+    copy_,                        \
+    transform_,                   \
+    bbox_,                        \
+    prepare_                      \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_GLYPH(                              \
+          class_,                                     \
+          size_,                                      \
+          format_,                                    \
+          init_,                                      \
+          done_,                                      \
+          copy_,                                      \
+          transform_,                                 \
+          bbox_,                                      \
+          prepare_ )                                  \
+  void                                                \
+  FT_Init_Class_ ## class_( FT_Glyph_Class*  clazz )  \
+  {                                                   \
+    clazz->glyph_size      = size_;                   \
+    clazz->glyph_format    = format_;                 \
+    clazz->glyph_init      = init_;                   \
+    clazz->glyph_done      = done_;                   \
+    clazz->glyph_copy      = copy_;                   \
+    clazz->glyph_transform = transform_;              \
+    clazz->glyph_bbox      = bbox_;                   \
+    clazz->glyph_prepare   = prepare_;                \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DECLARE_RENDERER                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to create a forward declaration of a                          */
+  /*    FT_Renderer_Class struct instance.                                 */
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_RENDERER                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Renderer_Class struct.        */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a `create' funtion will need  */
+  /*    to be called with a pointer where the allocated structure is       */
+  /*    returned.  And when it is no longer needed a `destroy' function    */
+  /*    needs to be called to release that allocation.                     */
+  /*    `fcinit.c' (ft_create_default_module_classes) already contains     */
+  /*    a mechanism to call these functions for the default modules        */
+  /*    described in `ftmodule.h'.                                         */
+  /*                                                                       */
+  /*    Notice that the created `create' and `destroy' functions call      */
+  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */
+  /*    initialize any additional global data, like a module specific      */
+  /*    interface, and put them in the global pic container defined in     */
+  /*    `ftpic.h'.  If you don't need them just implement the functions as */
+  /*    empty to resolve the link error.  Also the `pic_init' and          */
+  /*    `pic_free' functions should be declared in `pic.h', to be referred */
+  /*    by the renderer definition calling `FT_DEFINE_RENDERER' in the     */
+  /*    following.                                                         */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_RENDERER( class_ )               \
+  FT_EXPORT_VAR( const FT_Renderer_Class ) class_;
+
+#define FT_DEFINE_RENDERER(                  \
+          class_,                            \
+          flags_,                            \
+          size_,                             \
+          name_,                             \
+          version_,                          \
+          requires_,                         \
+          interface_,                        \
+          init_,                             \
+          done_,                             \
+          get_interface_,                    \
+          glyph_format_,                     \
+          render_glyph_,                     \
+          transform_glyph_,                  \
+          get_glyph_cbox_,                   \
+          set_mode_,                         \
+          raster_class_ )                    \
+  FT_CALLBACK_TABLE_DEF                      \
+  const FT_Renderer_Class  class_ =          \
+  {                                          \
+    FT_DEFINE_ROOT_MODULE( flags_,           \
+                           size_,            \
+                           name_,            \
+                           version_,         \
+                           requires_,        \
+                           interface_,       \
+                           init_,            \
+                           done_,            \
+                           get_interface_ )  \
+    glyph_format_,                           \
+                                             \
+    render_glyph_,                           \
+    transform_glyph_,                        \
+    get_glyph_cbox_,                         \
+    set_mode_,                               \
+                                             \
+    raster_class_                            \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_RENDERER( class_ )  FT_DECLARE_MODULE( class_ )
+
+#define FT_DEFINE_RENDERER(                                      \
+          class_,                                                \
+          flags_,                                                \
+          size_,                                                 \
+          name_,                                                 \
+          version_,                                              \
+          requires_,                                             \
+          interface_,                                            \
+          init_,                                                 \
+          done_,                                                 \
+          get_interface_,                                        \
+          glyph_format_,                                         \
+          render_glyph_,                                         \
+          transform_glyph_,                                      \
+          get_glyph_cbox_,                                       \
+          set_mode_,                                             \
+          raster_class_ )                                        \
+  void                                                           \
+  FT_Destroy_Class_ ## class_( FT_Library        library,        \
+                               FT_Module_Class*  clazz )         \
+  {                                                              \
+    FT_Renderer_Class*  rclazz = (FT_Renderer_Class*)clazz;      \
+    FT_Memory           memory = library->memory;                \
+                                                                 \
+                                                                 \
+    class_ ## _pic_free( library );                              \
+    if ( rclazz )                                                \
+      FT_FREE( rclazz );                                         \
+  }                                                              \
+                                                                 \
+                                                                 \
+  FT_Error                                                       \
+  FT_Create_Class_ ## class_( FT_Library         library,        \
+                              FT_Module_Class**  output_class )  \
+  {                                                              \
+    FT_Renderer_Class*  clazz = NULL;                            \
+    FT_Error            error;                                   \
+    FT_Memory           memory = library->memory;                \
+                                                                 \
+                                                                 \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \
+      return error;                                              \
+                                                                 \
+    error = class_ ## _pic_init( library );                      \
+    if ( error )                                                 \
+    {                                                            \
+      FT_FREE( clazz );                                          \
+      return error;                                              \
+    }                                                            \
+                                                                 \
+    FT_DEFINE_ROOT_MODULE( flags_,                               \
+                           size_,                                \
+                           name_,                                \
+                           version_,                             \
+                           requires_,                            \
+                           interface_,                           \
+                           init_,                                \
+                           done_,                                \
+                           get_interface_ )                      \
+                                                                 \
+    clazz->glyph_format    = glyph_format_;                      \
+                                                                 \
+    clazz->render_glyph    = render_glyph_;                      \
+    clazz->transform_glyph = transform_glyph_;                   \
+    clazz->get_glyph_cbox  = get_glyph_cbox_;                    \
+    clazz->set_mode        = set_mode_;                          \
+                                                                 \
+    clazz->raster_class    = raster_class_;                      \
+                                                                 \
+    *output_class = (FT_Module_Class*)clazz;                     \
+                                                                 \
+    return FT_Err_Ok;                                            \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /* PIC support macros for ftmodapi.h **/
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Creator                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to create (allocate) a new module class object.    */
+  /*    The object's members are initialized, but the module itself is     */
+  /*    not.                                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory       :: A handle to the memory manager.                    */
+  /*    output_class :: Initialized with the newly allocated class.        */
+  /*                                                                       */
+  typedef FT_Error
+  (*FT_Module_Creator)( FT_Memory          memory,
+                        FT_Module_Class**  output_class );
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Destroyer                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to destroy (deallocate) a module class object.     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A handle to the memory manager.                          */
+  /*    clazz  :: Module class to destroy.                                 */
+  /*                                                                       */
+  typedef void
+  (*FT_Module_Destroyer)( FT_Memory         memory,
+                          FT_Module_Class*  clazz );
+
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DECLARE_MODULE                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to create a forward declaration of a                          */
+  /*    FT_Module_Class struct instance.                                   */
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_MODULE                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of an FT_Module_Class struct.       */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a `create' funtion needs to   */
+  /*    be called with a pointer where the allocated structure is          */
+  /*    returned.  And when it is no longer needed a `destroy' function    */
+  /*    needs to be called to release that allocation.                     */
+  /*    `fcinit.c' (ft_create_default_module_classes) already contains     */
+  /*    a mechanism to call these functions for the default modules        */
+  /*    described in `ftmodule.h'.                                         */
+  /*                                                                       */
+  /*    Notice that the created `create' and `destroy' functions call      */
+  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */
+  /*    initialize any additional global data, like a module specific      */
+  /*    interface, and put them in the global pic container defined in     */
+  /*    `ftpic.h'.  If you don't need them just implement the functions as */
+  /*    empty to resolve the link error.  Also the `pic_init' and          */
+  /*    `pic_free' functions should be declared in `pic.h', to be referred */
+  /*    by the module definition calling `FT_DEFINE_MODULE' in the         */
+  /*    following.                                                         */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_ROOT_MODULE                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of an FT_Module_Class struct inside */
+  /*    another struct that contains it or in a function that initializes  */
+  /*    that containing struct.                                            */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_MODULE( class_ )  \
+  FT_CALLBACK_TABLE                  \
+  const FT_Module_Class  class_;
+
+#define FT_DEFINE_ROOT_MODULE(  \
+          flags_,               \
+          size_,                \
+          name_,                \
+          version_,             \
+          requires_,            \
+          interface_,           \
+          init_,                \
+          done_,                \
+          get_interface_ )      \
+  {                             \
+    flags_,                     \
+    size_,                      \
+                                \
+    name_,                      \
+    version_,                   \
+    requires_,                  \
+                                \
+    interface_,                 \
+                                \
+    init_,                      \
+    done_,                      \
+    get_interface_,             \
+  },
+
+#define FT_DEFINE_MODULE(         \
+          class_,                 \
+          flags_,                 \
+          size_,                  \
+          name_,                  \
+          version_,               \
+          requires_,              \
+          interface_,             \
+          init_,                  \
+          done_,                  \
+          get_interface_ )        \
+  FT_CALLBACK_TABLE_DEF           \
+  const FT_Module_Class class_ =  \
+  {                               \
+    flags_,                       \
+    size_,                        \
+                                  \
+    name_,                        \
+    version_,                     \
+    requires_,                    \
+                                  \
+    interface_,                   \
+                                  \
+    init_,                        \
+    done_,                        \
+    get_interface_,               \
+  };
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_MODULE( class_ )                               \
+  FT_Error                                                        \
+  FT_Create_Class_ ## class_( FT_Library         library,         \
+                              FT_Module_Class**  output_class );  \
+  void                                                            \
+  FT_Destroy_Class_ ## class_( FT_Library        library,         \
+                               FT_Module_Class*  clazz );
+
+#define FT_DEFINE_ROOT_MODULE(                      \
+          flags_,                                   \
+          size_,                                    \
+          name_,                                    \
+          version_,                                 \
+          requires_,                                \
+          interface_,                               \
+          init_,                                    \
+          done_,                                    \
+          get_interface_ )                          \
+    clazz->root.module_flags     = flags_;          \
+    clazz->root.module_size      = size_;           \
+    clazz->root.module_name      = name_;           \
+    clazz->root.module_version   = version_;        \
+    clazz->root.module_requires  = requires_;       \
+                                                    \
+    clazz->root.module_interface = interface_;      \
+                                                    \
+    clazz->root.module_init      = init_;           \
+    clazz->root.module_done      = done_;           \
+    clazz->root.get_interface    = get_interface_;
+
+#define FT_DEFINE_MODULE(                                        \
+          class_,                                                \
+          flags_,                                                \
+          size_,                                                 \
+          name_,                                                 \
+          version_,                                              \
+          requires_,                                             \
+          interface_,                                            \
+          init_,                                                 \
+          done_,                                                 \
+          get_interface_ )                                       \
+  void                                                           \
+  FT_Destroy_Class_ ## class_( FT_Library        library,        \
+                               FT_Module_Class*  clazz )         \
+  {                                                              \
+    FT_Memory memory = library->memory;                          \
+                                                                 \
+                                                                 \
+    class_ ## _pic_free( library );                              \
+    if ( clazz )                                                 \
+      FT_FREE( clazz );                                          \
+  }                                                              \
+                                                                 \
+                                                                 \
+  FT_Error                                                       \
+  FT_Create_Class_ ## class_( FT_Library         library,        \
+                              FT_Module_Class**  output_class )  \
+  {                                                              \
+    FT_Memory         memory = library->memory;                  \
+    FT_Module_Class*  clazz  = NULL;                             \
+    FT_Error          error;                                     \
+                                                                 \
+                                                                 \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \
+      return error;                                              \
+    error = class_ ## _pic_init( library );                      \
+    if ( error )                                                 \
+    {                                                            \
+      FT_FREE( clazz );                                          \
+      return error;                                              \
+    }                                                            \
+                                                                 \
+    clazz->module_flags     = flags_;                            \
+    clazz->module_size      = size_;                             \
+    clazz->module_name      = name_;                             \
+    clazz->module_version   = version_;                          \
+    clazz->module_requires  = requires_;                         \
+                                                                 \
+    clazz->module_interface = interface_;                        \
+                                                                 \
+    clazz->module_init      = init_;                             \
+    clazz->module_done      = done_;                             \
+    clazz->get_interface    = get_interface_;                    \
+                                                                 \
+    *output_class = clazz;                                       \
+                                                                 \
+    return FT_Err_Ok;                                            \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+FT_END_HEADER
+
+#endif /* __FTOBJS_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftpic.h b/core/include/thirdparties/freetype/freetype/internal/ftpic.h
new file mode 100644
index 0000000..485ce7a
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftpic.h
@@ -0,0 +1,71 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpic.h                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services (declaration).       */
+/*                                                                         */
+/*  Copyright 2009, 2012 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Modules that ordinarily have const global data that need address     */
+  /*  can instead define pointers here.                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTPIC_H__
+#define __FTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  typedef struct  FT_PIC_Container_
+  {
+    /* pic containers for base */
+    void*  base;
+
+    /* pic containers for modules */
+    void*  autofit;
+    void*  cff;
+    void*  pshinter;
+    void*  psnames;
+    void*  raster;
+    void*  sfnt;
+    void*  smooth;
+    void*  truetype;
+
+  } FT_PIC_Container;
+
+
+  /* Initialize the various function tables, structs, etc. */
+  /* stored in the container.                              */
+  FT_BASE( FT_Error )
+  ft_pic_container_init( FT_Library  library );
+
+
+  /* Destroy the contents of the container. */
+  FT_BASE( void )
+  ft_pic_container_destroy( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTPIC_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftrfork.h b/core/include/thirdparties/freetype/freetype/internal/ftrfork.h
new file mode 100644
index 0000000..061124b
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftrfork.h
@@ -0,0 +1,258 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftrfork.h                                                              */
+/*                                                                         */
+/*    Embedded resource forks accessor (specification).                    */
+/*                                                                         */
+/*  Copyright 2004, 2006, 2007, 2012 by                                    */
+/*  Masatake YAMATO and Redhat K.K.                                        */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/* Development of the code in this file is support of                      */
+/* Information-technology Promotion Agency, Japan.                         */
+/***************************************************************************/
+
+
+#ifndef __FTRFORK_H__
+#define __FTRFORK_H__
+
+
+#include "../../ft2build.h"
+#include "ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* Number of guessing rules supported in `FT_Raccess_Guess'.            */
+  /* Don't forget to increment the number if you add a new guessing rule. */
+#define FT_RACCESS_N_RULES  9
+
+
+  /* A structure to describe a reference in a resource by its resource ID */
+  /* and internal offset.  The `POST' resource expects to be concatenated */
+  /* by the order of resource IDs instead of its appearance in the file.  */
+
+  typedef struct  FT_RFork_Ref_
+  {
+    FT_UShort  res_id;
+    FT_ULong   offset;
+
+  } FT_RFork_Ref;
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+  typedef FT_Error
+  (*ft_raccess_guess_func)( FT_Library  library,
+                            FT_Stream   stream,
+                            char       *base_file_name,
+                            char      **result_file_name,
+                            FT_Long    *result_offset );
+
+  typedef enum  FT_RFork_Rule_ {
+    FT_RFork_Rule_invalid = -2,
+    FT_RFork_Rule_uknown, /* -1 */
+    FT_RFork_Rule_apple_double,
+    FT_RFork_Rule_apple_single,
+    FT_RFork_Rule_darwin_ufs_export,
+    FT_RFork_Rule_darwin_newvfs,
+    FT_RFork_Rule_darwin_hfsplus,
+    FT_RFork_Rule_vfat,
+    FT_RFork_Rule_linux_cap,
+    FT_RFork_Rule_linux_double,
+    FT_RFork_Rule_linux_netatalk
+  } FT_RFork_Rule;
+
+  /* For fast translation between rule index and rule type,
+   * the macros FT_RFORK_xxx should be kept consistent with
+   * the raccess_guess_funcs table
+   */
+  typedef struct ft_raccess_guess_rec_ {
+    ft_raccess_guess_func  func;
+    FT_RFork_Rule          type;
+  } ft_raccess_guess_rec;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+  /* this array is a storage in non-PIC mode, so ; is needed in END */
+#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \
+          const type name[] = {
+#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \
+          { raccess_guess_ ## func_suffix,                           \
+            FT_RFork_Rule_ ## type_suffix },
+#define CONST_FT_RFORK_RULE_ARRAY_END  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+  /* this array is a function in PIC mode, so no ; is needed in END */
+#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \
+          void                                         \
+          FT_Init_ ## name( type*  storage )           \
+          {                                            \
+            type*  local = storage;                    \
+                                                       \
+                                                       \
+            int  i = 0;
+#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \
+          local[i].func = raccess_guess_ ## func_suffix;             \
+          local[i].type = FT_RFork_Rule_ ## type_suffix;             \
+          i++;
+#define CONST_FT_RFORK_RULE_ARRAY_END  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Raccess_Guess                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Guess a file name and offset where the actual resource fork is     */
+  /*    stored.  The macro FT_RACCESS_N_RULES holds the number of          */
+  /*    guessing rules;  the guessed result for the Nth rule is            */
+  /*    represented as a triplet: a new file name (new_names[N]), a file   */
+  /*    offset (offsets[N]), and an error code (errors[N]).                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library ::                                                         */
+  /*      A FreeType library instance.                                     */
+  /*                                                                       */
+  /*    stream ::                                                          */
+  /*      A file stream containing the resource fork.                      */
+  /*                                                                       */
+  /*    base_name ::                                                       */
+  /*      The (base) file name of the resource fork used for some          */
+  /*      guessing rules.                                                  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    new_names ::                                                       */
+  /*      An array of guessed file names in which the resource forks may   */
+  /*      exist.  If `new_names[N]' is NULL, the guessed file name is      */
+  /*      equal to `base_name'.                                            */
+  /*                                                                       */
+  /*    offsets ::                                                         */
+  /*      An array of guessed file offsets.  `offsets[N]' holds the file   */
+  /*      offset of the possible start of the resource fork in file        */
+  /*      `new_names[N]'.                                                  */
+  /*                                                                       */
+  /*    errors ::                                                          */
+  /*      An array of FreeType error codes.  `errors[N]' is the error      */
+  /*      code of Nth guessing rule function.  If `errors[N]' is not       */
+  /*      FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless.      */
+  /*                                                                       */
+  FT_BASE( void )
+  FT_Raccess_Guess( FT_Library  library,
+                    FT_Stream   stream,
+                    char*       base_name,
+                    char**      new_names,
+                    FT_Long*    offsets,
+                    FT_Error*   errors );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Raccess_Get_HeaderInfo                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the information from the header of resource fork.  The         */
+  /*    information includes the file offset where the resource map        */
+  /*    starts, and the file offset where the resource data starts.        */
+  /*    `FT_Raccess_Get_DataOffsets' requires these two data.              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library ::                                                         */
+  /*      A FreeType library instance.                                     */
+  /*                                                                       */
+  /*    stream ::                                                          */
+  /*      A file stream containing the resource fork.                      */
+  /*                                                                       */
+  /*    rfork_offset ::                                                    */
+  /*      The file offset where the resource fork starts.                  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    map_offset ::                                                      */
+  /*      The file offset where the resource map starts.                   */
+  /*                                                                       */
+  /*    rdata_pos ::                                                       */
+  /*      The file offset where the resource data starts.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  FT_Err_Ok means success.                     */
+  /*                                                                       */
+  FT_BASE( FT_Error )
+  FT_Raccess_Get_HeaderInfo( FT_Library  library,
+                             FT_Stream   stream,
+                             FT_Long     rfork_offset,
+                             FT_Long    *map_offset,
+                             FT_Long    *rdata_pos );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Raccess_Get_DataOffsets                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the data offsets for a tag in a resource fork.  Offsets are    */
+  /*    stored in an array because, in some cases, resources in a resource */
+  /*    fork have the same tag.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library ::                                                         */
+  /*      A FreeType library instance.                                     */
+  /*                                                                       */
+  /*    stream ::                                                          */
+  /*      A file stream containing the resource fork.                      */
+  /*                                                                       */
+  /*    map_offset ::                                                      */
+  /*      The file offset where the resource map starts.                   */
+  /*                                                                       */
+  /*    rdata_pos ::                                                       */
+  /*      The file offset where the resource data starts.                  */
+  /*                                                                       */
+  /*    tag ::                                                             */
+  /*      The resource tag.                                                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    offsets ::                                                         */
+  /*      The stream offsets for the resource data specified by `tag'.     */
+  /*      This array is allocated by the function, so you have to call     */
+  /*      @ft_mem_free after use.                                          */
+  /*                                                                       */
+  /*    count ::                                                           */
+  /*      The length of offsets array.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  FT_Err_Ok means success.                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Normally you should use `FT_Raccess_Get_HeaderInfo' to get the     */
+  /*    value for `map_offset' and `rdata_pos'.                            */
+  /*                                                                       */
+  FT_BASE( FT_Error )
+  FT_Raccess_Get_DataOffsets( FT_Library  library,
+                              FT_Stream   stream,
+                              FT_Long     map_offset,
+                              FT_Long     rdata_pos,
+                              FT_Long     tag,
+                              FT_Long   **offsets,
+                              FT_Long    *count );
+
+
+FT_END_HEADER
+
+#endif /* __FTRFORK_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftserv.h b/core/include/thirdparties/freetype/freetype/internal/ftserv.h
new file mode 100644
index 0000000..cd5fbd0
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftserv.h
@@ -0,0 +1,763 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftserv.h                                                               */
+/*                                                                         */
+/*    The FreeType services (specification only).                          */
+/*                                                                         */
+/*  Copyright 2003-2007, 2009, 2012, 2013 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Each module can export one or more `services'.  Each service is      */
+  /*  identified by a constant string and modeled by a pointer; the latter */
+  /*  generally corresponds to a structure containing function pointers.   */
+  /*                                                                       */
+  /*  Note that a service's data cannot be a mere function pointer because */
+  /*  in C it is possible that function pointers might be implemented      */
+  /*  differently than data pointers (e.g. 48 bits instead of 32).         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTSERV_H__
+#define __FTSERV_H__
+
+
+FT_BEGIN_HEADER
+
+  /*
+   * @macro:
+   *   FT_FACE_FIND_SERVICE
+   *
+   * @description:
+   *   This macro is used to look up a service from a face's driver module.
+   *
+   * @input:
+   *   face ::
+   *     The source face handle.
+   *
+   *   id ::
+   *     A string describing the service as defined in the service's
+   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
+   *     `multi-masters').  It is automatically prefixed with
+   *     `FT_SERVICE_ID_'.
+   *
+   * @output:
+   *   ptr ::
+   *     A variable that receives the service pointer.  Will be NULL
+   *     if not found.
+   */
+#ifdef __cplusplus
+
+#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \
+  FT_BEGIN_STMNT                                                            \
+    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );             \
+    FT_Pointer   _tmp_  = NULL;                                             \
+    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                              \
+                                                                            \
+                                                                            \
+    if ( module->clazz->get_interface )                                     \
+      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
+    *_pptr_ = _tmp_;                                                        \
+  FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \
+  FT_BEGIN_STMNT                                                            \
+    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );              \
+    FT_Pointer  _tmp_  = NULL;                                              \
+                                                                            \
+    if ( module->clazz->get_interface )                                     \
+      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
+    ptr = _tmp_;                                                            \
+  FT_END_STMNT
+
+#endif /* !C++ */
+
+
+  /*
+   * @macro:
+   *   FT_FACE_FIND_GLOBAL_SERVICE
+   *
+   * @description:
+   *   This macro is used to look up a service from all modules.
+   *
+   * @input:
+   *   face ::
+   *     The source face handle.
+   *
+   *   id ::
+   *     A string describing the service as defined in the service's
+   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
+   *     `multi-masters').  It is automatically prefixed with
+   *     `FT_SERVICE_ID_'.
+   *
+   * @output:
+   *   ptr ::
+   *     A variable that receives the service pointer.  Will be NULL
+   *     if not found.
+   */
+#ifdef __cplusplus
+
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \
+  FT_BEGIN_STMNT                                                   \
+    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );    \
+    FT_Pointer   _tmp_;                                            \
+    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                     \
+                                                                   \
+                                                                   \
+    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
+    *_pptr_ = _tmp_;                                               \
+  FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \
+  FT_BEGIN_STMNT                                                   \
+    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );     \
+    FT_Pointer  _tmp_;                                             \
+                                                                   \
+                                                                   \
+    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
+    ptr   = _tmp_;                                                 \
+  FT_END_STMNT
+
+#endif /* !C++ */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****         S E R V I C E   D E S C R I P T O R S                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+   *  The following structure is used to _describe_ a given service
+   *  to the library.  This is useful to build simple static service lists.
+   */
+  typedef struct  FT_ServiceDescRec_
+  {
+    const char*  serv_id;     /* service name         */
+    const void*  serv_data;   /* service pointer/data */
+
+  } FT_ServiceDescRec;
+
+  typedef const FT_ServiceDescRec*  FT_ServiceDesc;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_SERVICEDESCREC1                                          */
+  /*    FT_DEFINE_SERVICEDESCREC2                                          */
+  /*    FT_DEFINE_SERVICEDESCREC3                                          */
+  /*    FT_DEFINE_SERVICEDESCREC4                                          */
+  /*    FT_DEFINE_SERVICEDESCREC5                                          */
+  /*    FT_DEFINE_SERVICEDESCREC6                                          */
+  /*    FT_DEFINE_SERVICEDESCREC7                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an array of FT_ServiceDescRec structures.       */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function needs to  */
+  /*    be called with a pointer to return an allocated array.  As soon as */
+  /*    it is no longer needed, a `destroy' function needs to be called to */
+  /*    release that allocation.                                           */
+  /*                                                                       */
+  /*    These functions should be manually called from the `pic_init' and  */
+  /*    `pic_free' functions of your module (see FT_DEFINE_MODULE).        */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the array will be         */
+  /*    allocated in the global scope (or the scope where the macro is     */
+  /*    used).                                                             */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \
+                                   serv_id_1, serv_data_1 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC4( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC5( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { serv_id_5, serv_data_5 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC6( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { serv_id_5, serv_data_5 },                                             \
+    { serv_id_6, serv_data_6 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC7( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6,                  \
+                                   serv_id_7, serv_data_7 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { serv_id_5, serv_data_5 },                                             \
+    { serv_id_6, serv_data_6 },                                             \
+    { serv_id_7, serv_data_7 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \
+                                   serv_id_1, serv_data_1 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 2 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = NULL;                                              \
+    clazz[1].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 3 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = NULL;                                              \
+    clazz[2].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 4 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = NULL;                                              \
+    clazz[3].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC4( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 5 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = NULL;                                              \
+    clazz[4].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC5( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 6 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = serv_id_5;                                         \
+    clazz[4].serv_data = serv_data_5;                                       \
+    clazz[5].serv_id   = NULL;                                              \
+    clazz[5].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC6( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class)            \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 7 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = serv_id_5;                                         \
+    clazz[4].serv_data = serv_data_5;                                       \
+    clazz[5].serv_id   = serv_id_6;                                         \
+    clazz[5].serv_data = serv_data_6;                                       \
+    clazz[6].serv_id   = NULL;                                              \
+    clazz[6].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC7( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6,                  \
+                                   serv_id_7, serv_data_7 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class)            \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 8 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = serv_id_5;                                         \
+    clazz[4].serv_data = serv_data_5;                                       \
+    clazz[5].serv_id   = serv_id_6;                                         \
+    clazz[5].serv_data = serv_data_6;                                       \
+    clazz[6].serv_id   = serv_id_7;                                         \
+    clazz[6].serv_data = serv_data_7;                                       \
+    clazz[7].serv_id   = NULL;                                              \
+    clazz[7].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /*
+   *  Parse a list of FT_ServiceDescRec descriptors and look for
+   *  a specific service by ID.  Note that the last element in the
+   *  array must be { NULL, NULL }, and that the function should
+   *  return NULL if the service isn't available.
+   *
+   *  This function can be used by modules to implement their
+   *  `get_service' method.
+   */
+  FT_BASE( FT_Pointer )
+  ft_service_list_lookup( FT_ServiceDesc  service_descriptors,
+                          const char*     service_id );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****             S E R V I C E S   C A C H E                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+   *  This structure is used to store a cache for several frequently used
+   *  services.  It is the type of `face->internal->services'.  You
+   *  should only use FT_FACE_LOOKUP_SERVICE to access it.
+   *
+   *  All fields should have the type FT_Pointer to relax compilation
+   *  dependencies.  We assume the developer isn't completely stupid.
+   *
+   *  Each field must be named `service_XXXX' where `XXX' corresponds to
+   *  the correct FT_SERVICE_ID_XXXX macro.  See the definition of
+   *  FT_FACE_LOOKUP_SERVICE below how this is implemented.
+   *
+   */
+  typedef struct  FT_ServiceCacheRec_
+  {
+    FT_Pointer  service_POSTSCRIPT_FONT_NAME;
+    FT_Pointer  service_MULTI_MASTERS;
+    FT_Pointer  service_GLYPH_DICT;
+    FT_Pointer  service_PFR_METRICS;
+    FT_Pointer  service_WINFNT;
+
+  } FT_ServiceCacheRec, *FT_ServiceCache;
+
+
+  /*
+   *  A magic number used within the services cache.
+   */
+
+  /* ensure that value `1' has the same width as a pointer */
+#define FT_SERVICE_UNAVAILABLE  ((FT_Pointer)~(FT_PtrDist)1)
+
+
+  /*
+   * @macro:
+   *   FT_FACE_LOOKUP_SERVICE
+   *
+   * @description:
+   *   This macro is used to lookup a service from a face's driver module
+   *   using its cache.
+   *
+   * @input:
+   *   face::
+   *     The source face handle containing the cache.
+   *
+   *   field ::
+   *     The field name in the cache.
+   *
+   *   id ::
+   *     The service ID.
+   *
+   * @output:
+   *   ptr ::
+   *     A variable receiving the service data.  NULL if not available.
+   */
+#ifdef __cplusplus
+
+#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \
+  FT_BEGIN_STMNT                                               \
+    FT_Pointer   svc;                                          \
+    FT_Pointer*  Pptr = (FT_Pointer*)&(ptr);                   \
+                                                               \
+                                                               \
+    svc = FT_FACE( face )->internal->services. service_ ## id; \
+    if ( svc == FT_SERVICE_UNAVAILABLE )                       \
+      svc = NULL;                                              \
+    else if ( svc == NULL )                                    \
+    {                                                          \
+      FT_FACE_FIND_SERVICE( face, svc, id );                   \
+                                                               \
+      FT_FACE( face )->internal->services. service_ ## id =    \
+        (FT_Pointer)( svc != NULL ? svc                        \
+                                  : FT_SERVICE_UNAVAILABLE );  \
+    }                                                          \
+    *Pptr = svc;                                               \
+  FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \
+  FT_BEGIN_STMNT                                               \
+    FT_Pointer  svc;                                           \
+                                                               \
+                                                               \
+    svc = FT_FACE( face )->internal->services. service_ ## id; \
+    if ( svc == FT_SERVICE_UNAVAILABLE )                       \
+      svc = NULL;                                              \
+    else if ( svc == NULL )                                    \
+    {                                                          \
+      FT_FACE_FIND_SERVICE( face, svc, id );                   \
+                                                               \
+      FT_FACE( face )->internal->services. service_ ## id =    \
+        (FT_Pointer)( svc != NULL ? svc                        \
+                                  : FT_SERVICE_UNAVAILABLE );  \
+    }                                                          \
+    ptr = svc;                                                 \
+  FT_END_STMNT
+
+#endif /* !C++ */
+
+  /*
+   *  A macro used to define new service structure types.
+   */
+
+#define FT_DEFINE_SERVICE( name )            \
+  typedef struct FT_Service_ ## name ## Rec_ \
+    FT_Service_ ## name ## Rec ;             \
+  typedef struct FT_Service_ ## name ## Rec_ \
+    const * FT_Service_ ## name ;            \
+  struct FT_Service_ ## name ## Rec_
+
+  /* */
+
+  /*
+   *  The header files containing the services.
+   */
+
+#define FT_SERVICE_BDF_H                <freetype/internal/services/svbdf.h>
+#define FT_SERVICE_CID_H                <freetype/internal/services/svcid.h>
+#define FT_SERVICE_GLYPH_DICT_H         <freetype/internal/services/svgldict.h>
+#define FT_SERVICE_GX_VALIDATE_H        <freetype/internal/services/svgxval.h>
+#define FT_SERVICE_KERNING_H            <freetype/internal/services/svkern.h>
+#define FT_SERVICE_MULTIPLE_MASTERS_H   <freetype/internal/services/svmm.h>
+#define FT_SERVICE_OPENTYPE_VALIDATE_H  <freetype/internal/services/svotval.h>
+#define FT_SERVICE_PFR_H                <freetype/internal/services/svpfr.h>
+#define FT_SERVICE_POSTSCRIPT_CMAPS_H   <freetype/internal/services/svpscmap.h>
+#define FT_SERVICE_POSTSCRIPT_INFO_H    <freetype/internal/services/svpsinfo.h>
+#define FT_SERVICE_POSTSCRIPT_NAME_H    <freetype/internal/services/svpostnm.h>
+#define FT_SERVICE_PROPERTIES_H         <freetype/internal/services/svprop.h>
+#define FT_SERVICE_SFNT_H               <freetype/internal/services/svsfnt.h>
+#define FT_SERVICE_TRUETYPE_ENGINE_H    <freetype/internal/services/svtteng.h>
+#define FT_SERVICE_TT_CMAP_H            <freetype/internal/services/svttcmap.h>
+#define FT_SERVICE_WINFNT_H             <freetype/internal/services/svwinfnt.h>
+#define FT_SERVICE_XFREE86_NAME_H       <freetype/internal/services/svxf86nm.h>
+#define FT_SERVICE_TRUETYPE_GLYF_H      <freetype/internal/services/svttglyf.h>
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSERV_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftstream.h b/core/include/thirdparties/freetype/freetype/internal/ftstream.h
new file mode 100644
index 0000000..c1a2654
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftstream.h
@@ -0,0 +1,536 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstream.h                                                             */
+/*                                                                         */
+/*    Stream handling (specification).                                     */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004-2006, 2011, 2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTSTREAM_H__
+#define __FTSTREAM_H__
+
+
+#include "../../ft2build.h"
+#include "../ftsystem.h"
+#include "ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* format of an 8-bit frame_op value:           */
+  /*                                              */
+  /* bit  76543210                                */
+  /*      xxxxxxes                                */
+  /*                                              */
+  /* s is set to 1 if the value is signed.        */
+  /* e is set to 1 if the value is little-endian. */
+  /* xxx is a command.                            */
+
+#define FT_FRAME_OP_SHIFT         2
+#define FT_FRAME_OP_SIGNED        1
+#define FT_FRAME_OP_LITTLE        2
+#define FT_FRAME_OP_COMMAND( x )  ( x >> FT_FRAME_OP_SHIFT )
+
+#define FT_MAKE_FRAME_OP( command, little, sign ) \
+          ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign )
+
+#define FT_FRAME_OP_END    0
+#define FT_FRAME_OP_START  1  /* start a new frame     */
+#define FT_FRAME_OP_BYTE   2  /* read 1-byte value     */
+#define FT_FRAME_OP_SHORT  3  /* read 2-byte value     */
+#define FT_FRAME_OP_LONG   4  /* read 4-byte value     */
+#define FT_FRAME_OP_OFF3   5  /* read 3-byte value     */
+#define FT_FRAME_OP_BYTES  6  /* read a bytes sequence */
+
+
+  typedef enum  FT_Frame_Op_
+  {
+    ft_frame_end       = 0,
+    ft_frame_start     = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ),
+
+    ft_frame_byte      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 0 ),
+    ft_frame_schar     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 1 ),
+
+    ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ),
+    ft_frame_short_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ),
+    ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ),
+    ft_frame_short_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ),
+
+    ft_frame_ulong_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ),
+    ft_frame_long_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ),
+    ft_frame_ulong_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ),
+    ft_frame_long_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ),
+
+    ft_frame_uoff3_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ),
+    ft_frame_off3_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ),
+    ft_frame_uoff3_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ),
+    ft_frame_off3_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ),
+
+    ft_frame_bytes     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ),
+    ft_frame_skip      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 )
+
+  } FT_Frame_Op;
+
+
+  typedef struct  FT_Frame_Field_
+  {
+    FT_Byte    value;
+    FT_Byte    size;
+    FT_UShort  offset;
+
+  } FT_Frame_Field;
+
+
+  /* Construct an FT_Frame_Field out of a structure type and a field name. */
+  /* The structure type must be set in the FT_STRUCTURE macro before       */
+  /* calling the FT_FRAME_START() macro.                                   */
+  /*                                                                       */
+#define FT_FIELD_SIZE( f ) \
+          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f )
+
+#define FT_FIELD_SIZE_DELTA( f ) \
+          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] )
+
+#define FT_FIELD_OFFSET( f ) \
+          (FT_UShort)( offsetof( FT_STRUCTURE, f ) )
+
+#define FT_FRAME_FIELD( frame_op, field ) \
+          {                               \
+            frame_op,                     \
+            FT_FIELD_SIZE( field ),       \
+            FT_FIELD_OFFSET( field )      \
+          }
+
+#define FT_MAKE_EMPTY_FIELD( frame_op )  { frame_op, 0, 0 }
+
+#define FT_FRAME_START( size )   { ft_frame_start, 0, size }
+#define FT_FRAME_END             { ft_frame_end, 0, 0 }
+
+#define FT_FRAME_LONG( f )       FT_FRAME_FIELD( ft_frame_long_be, f )
+#define FT_FRAME_ULONG( f )      FT_FRAME_FIELD( ft_frame_ulong_be, f )
+#define FT_FRAME_SHORT( f )      FT_FRAME_FIELD( ft_frame_short_be, f )
+#define FT_FRAME_USHORT( f )     FT_FRAME_FIELD( ft_frame_ushort_be, f )
+#define FT_FRAME_OFF3( f )       FT_FRAME_FIELD( ft_frame_off3_be, f )
+#define FT_FRAME_UOFF3( f )      FT_FRAME_FIELD( ft_frame_uoff3_be, f )
+#define FT_FRAME_BYTE( f )       FT_FRAME_FIELD( ft_frame_byte, f )
+#define FT_FRAME_CHAR( f )       FT_FRAME_FIELD( ft_frame_schar, f )
+
+#define FT_FRAME_LONG_LE( f )    FT_FRAME_FIELD( ft_frame_long_le, f )
+#define FT_FRAME_ULONG_LE( f )   FT_FRAME_FIELD( ft_frame_ulong_le, f )
+#define FT_FRAME_SHORT_LE( f )   FT_FRAME_FIELD( ft_frame_short_le, f )
+#define FT_FRAME_USHORT_LE( f )  FT_FRAME_FIELD( ft_frame_ushort_le, f )
+#define FT_FRAME_OFF3_LE( f )    FT_FRAME_FIELD( ft_frame_off3_le, f )
+#define FT_FRAME_UOFF3_LE( f )   FT_FRAME_FIELD( ft_frame_uoff3_le, f )
+
+#define FT_FRAME_SKIP_LONG       { ft_frame_long_be, 0, 0 }
+#define FT_FRAME_SKIP_SHORT      { ft_frame_short_be, 0, 0 }
+#define FT_FRAME_SKIP_BYTE       { ft_frame_byte, 0, 0 }
+
+#define FT_FRAME_BYTES( field, count ) \
+          {                            \
+            ft_frame_bytes,            \
+            count,                     \
+            FT_FIELD_OFFSET( field )   \
+          }
+
+#define FT_FRAME_SKIP_BYTES( count )  { ft_frame_skip, count, 0 }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */
+  /* type `char*' or equivalent (1-byte elements).                         */
+  /*                                                                       */
+
+#define FT_BYTE_( p, i )  ( ((const FT_Byte*)(p))[(i)] )
+
+#define FT_INT16( x )   ( (FT_Int16)(x)  )
+#define FT_UINT16( x )  ( (FT_UInt16)(x) )
+#define FT_INT32( x )   ( (FT_Int32)(x)  )
+#define FT_UINT32( x )  ( (FT_UInt32)(x) )
+
+
+#define FT_BYTE_U16( p, i, s )  ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) )
+#define FT_BYTE_U32( p, i, s )  ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) )
+
+
+#define FT_PEEK_SHORT( p )  FT_INT16( FT_BYTE_U16( p, 0, 8) | \
+                                      FT_BYTE_U16( p, 1, 0) )
+
+#define FT_PEEK_USHORT( p )  FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \
+                                        FT_BYTE_U16( p, 1, 0 ) )
+
+#define FT_PEEK_LONG( p )  FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \
+                                     FT_BYTE_U32( p, 1, 16 ) | \
+                                     FT_BYTE_U32( p, 2,  8 ) | \
+                                     FT_BYTE_U32( p, 3,  0 ) )
+
+#define FT_PEEK_ULONG( p )  FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \
+                                       FT_BYTE_U32( p, 1, 16 ) | \
+                                       FT_BYTE_U32( p, 2,  8 ) | \
+                                       FT_BYTE_U32( p, 3,  0 ) )
+
+#define FT_PEEK_OFF3( p )  FT_INT32( FT_BYTE_U32( p, 0, 16 ) | \
+                                     FT_BYTE_U32( p, 1,  8 ) | \
+                                     FT_BYTE_U32( p, 2,  0 ) )
+
+#define FT_PEEK_UOFF3( p )  FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \
+                                       FT_BYTE_U32( p, 1,  8 ) | \
+                                       FT_BYTE_U32( p, 2,  0 ) )
+
+#define FT_PEEK_SHORT_LE( p )  FT_INT16( FT_BYTE_U16( p, 1, 8 ) | \
+                                         FT_BYTE_U16( p, 0, 0 ) )
+
+#define FT_PEEK_USHORT_LE( p )  FT_UINT16( FT_BYTE_U16( p, 1, 8 ) |  \
+                                           FT_BYTE_U16( p, 0, 0 ) )
+
+#define FT_PEEK_LONG_LE( p )  FT_INT32( FT_BYTE_U32( p, 3, 24 ) | \
+                                        FT_BYTE_U32( p, 2, 16 ) | \
+                                        FT_BYTE_U32( p, 1,  8 ) | \
+                                        FT_BYTE_U32( p, 0,  0 ) )
+
+#define FT_PEEK_ULONG_LE( p )  FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \
+                                          FT_BYTE_U32( p, 2, 16 ) | \
+                                          FT_BYTE_U32( p, 1,  8 ) | \
+                                          FT_BYTE_U32( p, 0,  0 ) )
+
+#define FT_PEEK_OFF3_LE( p )  FT_INT32( FT_BYTE_U32( p, 2, 16 ) | \
+                                        FT_BYTE_U32( p, 1,  8 ) | \
+                                        FT_BYTE_U32( p, 0,  0 ) )
+
+#define FT_PEEK_UOFF3_LE( p )  FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \
+                                          FT_BYTE_U32( p, 1,  8 ) | \
+                                          FT_BYTE_U32( p, 0,  0 ) )
+
+
+#define FT_NEXT_CHAR( buffer )       \
+          ( (signed char)*buffer++ )
+
+#define FT_NEXT_BYTE( buffer )         \
+          ( (unsigned char)*buffer++ )
+
+#define FT_NEXT_SHORT( buffer )                                   \
+          ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) )
+
+#define FT_NEXT_USHORT( buffer )                                            \
+          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )
+
+#define FT_NEXT_OFF3( buffer )                                  \
+          ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )
+
+#define FT_NEXT_UOFF3( buffer )                                           \
+          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )
+
+#define FT_NEXT_LONG( buffer )                                  \
+          ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )
+
+#define FT_NEXT_ULONG( buffer )                                           \
+          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )
+
+
+#define FT_NEXT_SHORT_LE( buffer )                                   \
+          ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) )
+
+#define FT_NEXT_USHORT_LE( buffer )                                            \
+          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) )
+
+#define FT_NEXT_OFF3_LE( buffer )                                  \
+          ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) )
+
+#define FT_NEXT_UOFF3_LE( buffer )                                           \
+          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) )
+
+#define FT_NEXT_LONG_LE( buffer )                                  \
+          ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) )
+
+#define FT_NEXT_ULONG_LE( buffer )                                           \
+          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Each GET_xxxx() macro uses an implicit `stream' variable.             */
+  /*                                                                       */
+#if 0
+#define FT_GET_MACRO( type )    FT_NEXT_ ## type ( stream->cursor )
+
+#define FT_GET_CHAR()       FT_GET_MACRO( CHAR )
+#define FT_GET_BYTE()       FT_GET_MACRO( BYTE )
+#define FT_GET_SHORT()      FT_GET_MACRO( SHORT )
+#define FT_GET_USHORT()     FT_GET_MACRO( USHORT )
+#define FT_GET_OFF3()       FT_GET_MACRO( OFF3 )
+#define FT_GET_UOFF3()      FT_GET_MACRO( UOFF3 )
+#define FT_GET_LONG()       FT_GET_MACRO( LONG )
+#define FT_GET_ULONG()      FT_GET_MACRO( ULONG )
+#define FT_GET_TAG4()       FT_GET_MACRO( ULONG )
+
+#define FT_GET_SHORT_LE()   FT_GET_MACRO( SHORT_LE )
+#define FT_GET_USHORT_LE()  FT_GET_MACRO( USHORT_LE )
+#define FT_GET_LONG_LE()    FT_GET_MACRO( LONG_LE )
+#define FT_GET_ULONG_LE()   FT_GET_MACRO( ULONG_LE )
+
+#else
+#define FT_GET_MACRO( func, type )        ( (type)func( stream ) )
+
+#define FT_GET_CHAR()       FT_GET_MACRO( FT_Stream_GetChar, FT_Char )
+#define FT_GET_BYTE()       FT_GET_MACRO( FT_Stream_GetChar, FT_Byte )
+#define FT_GET_SHORT()      FT_GET_MACRO( FT_Stream_GetUShort, FT_Short )
+#define FT_GET_USHORT()     FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort )
+#define FT_GET_OFF3()       FT_GET_MACRO( FT_Stream_GetUOffset, FT_Long )
+#define FT_GET_UOFF3()      FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong )
+#define FT_GET_LONG()       FT_GET_MACRO( FT_Stream_GetULong, FT_Long )
+#define FT_GET_ULONG()      FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
+#define FT_GET_TAG4()       FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
+
+#define FT_GET_SHORT_LE()   FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short )
+#define FT_GET_USHORT_LE()  FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort )
+#define FT_GET_LONG_LE()    FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long )
+#define FT_GET_ULONG_LE()   FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong )
+#endif
+
+#define FT_READ_MACRO( func, type, var )        \
+          ( var = (type)func( stream, &error ), \
+            error != FT_Err_Ok )
+
+#define FT_READ_BYTE( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var )
+#define FT_READ_CHAR( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var )
+#define FT_READ_SHORT( var )      FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var )
+#define FT_READ_USHORT( var )     FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var )
+#define FT_READ_OFF3( var )       FT_READ_MACRO( FT_Stream_ReadUOffset, FT_Long, var )
+#define FT_READ_UOFF3( var )      FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var )
+#define FT_READ_LONG( var )       FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var )
+#define FT_READ_ULONG( var )      FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var )
+
+#define FT_READ_SHORT_LE( var )   FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var )
+#define FT_READ_USHORT_LE( var )  FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var )
+#define FT_READ_LONG_LE( var )    FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var )
+#define FT_READ_ULONG_LE( var )   FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var )
+
+
+#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
+
+  /* initialize a stream for reading a regular system stream */
+  FT_BASE( FT_Error )
+  FT_Stream_Open( FT_Stream    stream,
+                  const char*  filepathname );
+
+#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
+
+
+  /* create a new (input) stream from an FT_Open_Args structure */
+  FT_BASE( FT_Error )
+  FT_Stream_New( FT_Library           library,
+                 const FT_Open_Args*  args,
+                 FT_Stream           *astream );
+
+  /* free a stream */
+  FT_BASE( void )
+  FT_Stream_Free( FT_Stream  stream,
+                  FT_Int     external );
+
+  /* initialize a stream for reading in-memory data */
+  FT_BASE( void )
+  FT_Stream_OpenMemory( FT_Stream       stream,
+                        const FT_Byte*  base,
+                        FT_ULong        size );
+
+  /* close a stream (does not destroy the stream structure) */
+  FT_BASE( void )
+  FT_Stream_Close( FT_Stream  stream );
+
+
+  /* seek within a stream. position is relative to start of stream */
+  FT_BASE( FT_Error )
+  FT_Stream_Seek( FT_Stream  stream,
+                  FT_ULong   pos );
+
+  /* skip bytes in a stream */
+  FT_BASE( FT_Error )
+  FT_Stream_Skip( FT_Stream  stream,
+                  FT_Long    distance );
+
+  /* return current stream position */
+  FT_BASE( FT_Long )
+  FT_Stream_Pos( FT_Stream  stream );
+
+  /* read bytes from a stream into a user-allocated buffer, returns an */
+  /* error if not all bytes could be read.                             */
+  FT_BASE( FT_Error )
+  FT_Stream_Read( FT_Stream  stream,
+                  FT_Byte*   buffer,
+                  FT_ULong   count );
+
+  /* read bytes from a stream at a given position */
+  FT_BASE( FT_Error )
+  FT_Stream_ReadAt( FT_Stream  stream,
+                    FT_ULong   pos,
+                    FT_Byte*   buffer,
+                    FT_ULong   count );
+
+  /* try to read bytes at the end of a stream; return number of bytes */
+  /* really available                                                 */
+  FT_BASE( FT_ULong )
+  FT_Stream_TryRead( FT_Stream  stream,
+                     FT_Byte*   buffer,
+                     FT_ULong   count );
+
+  /* Enter a frame of `count' consecutive bytes in a stream.  Returns an */
+  /* error if the frame could not be read/accessed.  The caller can use  */
+  /* the FT_Stream_Get_XXX functions to retrieve frame data without      */
+  /* error checks.                                                       */
+  /*                                                                     */
+  /* You must _always_ call FT_Stream_ExitFrame() once you have entered  */
+  /* a stream frame!                                                     */
+  /*                                                                     */
+  FT_BASE( FT_Error )
+  FT_Stream_EnterFrame( FT_Stream  stream,
+                        FT_ULong   count );
+
+  /* exit a stream frame */
+  FT_BASE( void )
+  FT_Stream_ExitFrame( FT_Stream  stream );
+
+  /* Extract a stream frame.  If the stream is disk-based, a heap block */
+  /* is allocated and the frame bytes are read into it.  If the stream  */
+  /* is memory-based, this function simply set a pointer to the data.   */
+  /*                                                                    */
+  /* Useful to optimize access to memory-based streams transparently.   */
+  /*                                                                    */
+  /* All extracted frames must be `freed' with a call to the function   */
+  /* FT_Stream_ReleaseFrame().                                          */
+  /*                                                                    */
+  FT_BASE( FT_Error )
+  FT_Stream_ExtractFrame( FT_Stream  stream,
+                          FT_ULong   count,
+                          FT_Byte**  pbytes );
+
+  /* release an extract frame (see FT_Stream_ExtractFrame) */
+  FT_BASE( void )
+  FT_Stream_ReleaseFrame( FT_Stream  stream,
+                          FT_Byte**  pbytes );
+
+  /* read a byte from an entered frame */
+  FT_BASE( FT_Char )
+  FT_Stream_GetChar( FT_Stream  stream );
+
+  /* read a 16-bit big-endian unsigned integer from an entered frame */
+  FT_BASE( FT_UShort )
+  FT_Stream_GetUShort( FT_Stream  stream );
+
+  /* read a 24-bit big-endian unsigned integer from an entered frame */
+  FT_BASE( FT_ULong )
+  FT_Stream_GetUOffset( FT_Stream  stream );
+
+  /* read a 32-bit big-endian unsigned integer from an entered frame */
+  FT_BASE( FT_ULong )
+  FT_Stream_GetULong( FT_Stream  stream );
+
+  /* read a 16-bit little-endian unsigned integer from an entered frame */
+  FT_BASE( FT_UShort )
+  FT_Stream_GetUShortLE( FT_Stream  stream );
+
+  /* read a 32-bit little-endian unsigned integer from an entered frame */
+  FT_BASE( FT_ULong )
+  FT_Stream_GetULongLE( FT_Stream  stream );
+
+
+  /* read a byte from a stream */
+  FT_BASE( FT_Char )
+  FT_Stream_ReadChar( FT_Stream  stream,
+                      FT_Error*  error );
+
+  /* read a 16-bit big-endian unsigned integer from a stream */
+  FT_BASE( FT_UShort )
+  FT_Stream_ReadUShort( FT_Stream  stream,
+                        FT_Error*  error );
+
+  /* read a 24-bit big-endian unsigned integer from a stream */
+  FT_BASE( FT_ULong )
+  FT_Stream_ReadUOffset( FT_Stream  stream,
+                         FT_Error*  error );
+
+  /* read a 32-bit big-endian integer from a stream */
+  FT_BASE( FT_ULong )
+  FT_Stream_ReadULong( FT_Stream  stream,
+                       FT_Error*  error );
+
+  /* read a 16-bit little-endian unsigned integer from a stream */
+  FT_BASE( FT_UShort )
+  FT_Stream_ReadUShortLE( FT_Stream  stream,
+                          FT_Error*  error );
+
+  /* read a 32-bit little-endian unsigned integer from a stream */
+  FT_BASE( FT_ULong )
+  FT_Stream_ReadULongLE( FT_Stream  stream,
+                         FT_Error*  error );
+
+  /* Read a structure from a stream.  The structure must be described */
+  /* by an array of FT_Frame_Field records.                           */
+  FT_BASE( FT_Error )
+  FT_Stream_ReadFields( FT_Stream              stream,
+                        const FT_Frame_Field*  fields,
+                        void*                  structure );
+
+
+#define FT_STREAM_POS()           \
+          FT_Stream_Pos( stream )
+
+#define FT_STREAM_SEEK( position )                               \
+          FT_SET_ERROR( FT_Stream_Seek( stream,                  \
+                                        (FT_ULong)(position) ) )
+
+#define FT_STREAM_SKIP( distance )                              \
+          FT_SET_ERROR( FT_Stream_Skip( stream,                 \
+                                        (FT_Long)(distance) ) )
+
+#define FT_STREAM_READ( buffer, count )                       \
+          FT_SET_ERROR( FT_Stream_Read( stream,               \
+                                        (FT_Byte*)(buffer),   \
+                                        (FT_ULong)(count) ) )
+
+#define FT_STREAM_READ_AT( position, buffer, count )            \
+          FT_SET_ERROR( FT_Stream_ReadAt( stream,               \
+                                          (FT_ULong)(position), \
+                                          (FT_Byte*)buffer,     \
+                                          (FT_ULong)(count) ) )
+
+#define FT_STREAM_READ_FIELDS( fields, object )                          \
+          FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) )
+
+
+#define FT_FRAME_ENTER( size )                                           \
+          FT_SET_ERROR(                                                  \
+            FT_DEBUG_INNER( FT_Stream_EnterFrame( stream,                \
+                                                  (FT_ULong)(size) ) ) )
+
+#define FT_FRAME_EXIT()                                   \
+          FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) )
+
+#define FT_FRAME_EXTRACT( size, bytes )                                       \
+          FT_SET_ERROR(                                                       \
+            FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream,                   \
+                                                    (FT_ULong)(size),         \
+                                                    (FT_Byte**)&(bytes) ) ) )
+
+#define FT_FRAME_RELEASE( bytes )                                         \
+          FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream,                 \
+                                                  (FT_Byte**)&(bytes) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTSTREAM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/fttrace.h b/core/include/thirdparties/freetype/freetype/internal/fttrace.h
new file mode 100644
index 0000000..a9d98b6
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/fttrace.h
@@ -0,0 +1,152 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttrace.h                                                              */
+/*                                                                         */
+/*    Tracing handling (specification only).                               */
+/*                                                                         */
+/*  Copyright 2002, 2004-2007, 2009, 2011-2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /* definitions of trace levels for FreeType 2 */
+
+  /* the first level must always be `trace_any' */
+FT_TRACE_DEF( any )
+
+  /* base components */
+FT_TRACE_DEF( calc )      /* calculations            (ftcalc.c)   */
+FT_TRACE_DEF( memory )    /* memory manager          (ftobjs.c)   */
+FT_TRACE_DEF( stream )    /* stream manager          (ftstream.c) */
+FT_TRACE_DEF( io )        /* i/o interface           (ftsystem.c) */
+FT_TRACE_DEF( list )      /* list management         (ftlist.c)   */
+FT_TRACE_DEF( init )      /* initialization          (ftinit.c)   */
+FT_TRACE_DEF( objs )      /* base objects            (ftobjs.c)   */
+FT_TRACE_DEF( outline )   /* outline management      (ftoutln.c)  */
+FT_TRACE_DEF( glyph )     /* glyph management        (ftglyph.c)  */
+FT_TRACE_DEF( gloader )   /* glyph loader            (ftgloadr.c) */
+
+FT_TRACE_DEF( raster )    /* monochrome rasterizer   (ftraster.c) */
+FT_TRACE_DEF( smooth )    /* anti-aliasing raster    (ftgrays.c)  */
+FT_TRACE_DEF( mm )        /* MM interface            (ftmm.c)     */
+FT_TRACE_DEF( raccess )   /* resource fork accessor  (ftrfork.c)  */
+FT_TRACE_DEF( synth )     /* bold/slant synthesizer  (ftsynth.c)  */
+FT_TRACE_DEF( bitmap )    /* bitmap checksum         (ftobjs.c)   */
+
+  /* Cache sub-system */
+FT_TRACE_DEF( cache )     /* cache sub-system        (ftcache.c, etc.) */
+
+  /* SFNT driver components */
+FT_TRACE_DEF( sfdriver )  /* SFNT font driver        (sfdriver.c) */
+FT_TRACE_DEF( sfobjs )    /* SFNT object handler     (sfobjs.c)   */
+FT_TRACE_DEF( ttcmap )    /* charmap handler         (ttcmap.c)   */
+FT_TRACE_DEF( ttkern )    /* kerning handler         (ttkern.c)   */
+FT_TRACE_DEF( ttload )    /* basic TrueType tables   (ttload.c)   */
+FT_TRACE_DEF( ttmtx )     /* metrics-related tables  (ttmtx.c)    */
+FT_TRACE_DEF( ttpost )    /* PS table processing     (ttpost.c)   */
+FT_TRACE_DEF( ttsbit )    /* TrueType sbit handling  (ttsbit.c)   */
+FT_TRACE_DEF( ttbdf )     /* TrueType embedded BDF   (ttbdf.c)    */
+
+  /* TrueType driver components */
+FT_TRACE_DEF( ttdriver )  /* TT font driver          (ttdriver.c) */
+FT_TRACE_DEF( ttgload )   /* TT glyph loader         (ttgload.c)  */
+FT_TRACE_DEF( ttinterp )  /* bytecode interpreter    (ttinterp.c) */
+FT_TRACE_DEF( ttobjs )    /* TT objects manager      (ttobjs.c)   */
+FT_TRACE_DEF( ttpload )   /* TT data/program loader  (ttpload.c)  */
+FT_TRACE_DEF( ttgxvar )   /* TrueType GX var handler (ttgxvar.c)  */
+
+  /* Type 1 driver components */
+FT_TRACE_DEF( t1afm )
+FT_TRACE_DEF( t1driver )
+FT_TRACE_DEF( t1gload )
+FT_TRACE_DEF( t1hint )
+FT_TRACE_DEF( t1load )
+FT_TRACE_DEF( t1objs )
+FT_TRACE_DEF( t1parse )
+
+  /* PostScript helper module `psaux' */
+FT_TRACE_DEF( t1decode )
+FT_TRACE_DEF( psobjs )
+FT_TRACE_DEF( psconv )
+
+  /* PostScript hinting module `pshinter' */
+FT_TRACE_DEF( pshrec )
+FT_TRACE_DEF( pshalgo1 )
+FT_TRACE_DEF( pshalgo2 )
+
+  /* Type 2 driver components */
+FT_TRACE_DEF( cffdriver )
+FT_TRACE_DEF( cffgload )
+FT_TRACE_DEF( cffload )
+FT_TRACE_DEF( cffobjs )
+FT_TRACE_DEF( cffparse )
+
+FT_TRACE_DEF( cf2blues )
+FT_TRACE_DEF( cf2hints )
+FT_TRACE_DEF( cf2interp )
+
+  /* Type 42 driver component */
+FT_TRACE_DEF( t42 )
+
+  /* CID driver components */
+FT_TRACE_DEF( cidafm )
+FT_TRACE_DEF( ciddriver )
+FT_TRACE_DEF( cidgload )
+FT_TRACE_DEF( cidload )
+FT_TRACE_DEF( cidobjs )
+FT_TRACE_DEF( cidparse )
+
+  /* Windows font component */
+FT_TRACE_DEF( winfnt )
+
+  /* PCF font components */
+FT_TRACE_DEF( pcfdriver )
+FT_TRACE_DEF( pcfread )
+
+  /* BDF font components */
+FT_TRACE_DEF( bdfdriver )
+FT_TRACE_DEF( bdflib )
+
+  /* PFR font component */
+FT_TRACE_DEF( pfr )
+
+  /* OpenType validation components */
+FT_TRACE_DEF( otvmodule )
+FT_TRACE_DEF( otvcommon )
+FT_TRACE_DEF( otvbase )
+FT_TRACE_DEF( otvgdef )
+FT_TRACE_DEF( otvgpos )
+FT_TRACE_DEF( otvgsub )
+FT_TRACE_DEF( otvjstf )
+FT_TRACE_DEF( otvmath )
+
+  /* TrueTypeGX/AAT validation components */
+FT_TRACE_DEF( gxvmodule )
+FT_TRACE_DEF( gxvcommon )
+FT_TRACE_DEF( gxvfeat )
+FT_TRACE_DEF( gxvmort )
+FT_TRACE_DEF( gxvmorx )
+FT_TRACE_DEF( gxvbsln )
+FT_TRACE_DEF( gxvjust )
+FT_TRACE_DEF( gxvkern )
+FT_TRACE_DEF( gxvopbd )
+FT_TRACE_DEF( gxvtrak )
+FT_TRACE_DEF( gxvprop )
+FT_TRACE_DEF( gxvlcar )
+
+  /* autofit components */
+FT_TRACE_DEF( afmodule )
+FT_TRACE_DEF( afhints )
+FT_TRACE_DEF( afcjk )
+FT_TRACE_DEF( aflatin )
+FT_TRACE_DEF( aflatin2 )
+FT_TRACE_DEF( afwarp )
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftvalid.h b/core/include/thirdparties/freetype/freetype/internal/ftvalid.h
new file mode 100644
index 0000000..4442613
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftvalid.h
@@ -0,0 +1,161 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftvalid.h                                                              */
+/*                                                                         */
+/*    FreeType validation support (specification).                         */
+/*                                                                         */
+/*  Copyright 2004, 2013 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTVALID_H__
+#define __FTVALID_H__
+
+#include "../../ft2build.h"
+#include "../config/ftstdlib.h"   /* for ft_setjmp and ft_longjmp */
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                    V A L I D A T I O N                          ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* handle to a validation object */
+  typedef struct FT_ValidatorRec_ volatile*  FT_Validator;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* There are three distinct validation levels defined here:              */
+  /*                                                                       */
+  /* FT_VALIDATE_DEFAULT ::                                                */
+  /*   A table that passes this validation level can be used reliably by   */
+  /*   FreeType.  It generally means that all offsets have been checked to */
+  /*   prevent out-of-bound reads, that array counts are correct, etc.     */
+  /*                                                                       */
+  /* FT_VALIDATE_TIGHT ::                                                  */
+  /*   A table that passes this validation level can be used reliably and  */
+  /*   doesn't contain invalid data.  For example, a charmap table that    */
+  /*   returns invalid glyph indices will not pass, even though it can     */
+  /*   be used with FreeType in default mode (the library will simply      */
+  /*   return an error later when trying to load the glyph).               */
+  /*                                                                       */
+  /*   It also checks that fields which must be a multiple of 2, 4, or 8,  */
+  /*   don't have incorrect values, etc.                                   */
+  /*                                                                       */
+  /* FT_VALIDATE_PARANOID ::                                               */
+  /*   Only for font debugging.  Checks that a table follows the           */
+  /*   specification by 100%.  Very few fonts will be able to pass this    */
+  /*   level anyway but it can be useful for certain tools like font       */
+  /*   editors/converters.                                                 */
+  /*                                                                       */
+  typedef enum  FT_ValidationLevel_
+  {
+    FT_VALIDATE_DEFAULT = 0,
+    FT_VALIDATE_TIGHT,
+    FT_VALIDATE_PARANOID
+
+  } FT_ValidationLevel;
+
+
+#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
+  /* We disable the warning `structure was padded due to   */
+  /* __declspec(align())' in order to compile cleanly with */
+  /* the maximum level of warnings.                        */
+#pragma warning( push )
+#pragma warning( disable : 4324 )
+#endif /* _MSC_VER */
+
+  /* validator structure */
+  typedef struct  FT_ValidatorRec_
+  {
+    const FT_Byte*      base;        /* address of table in memory       */
+    const FT_Byte*      limit;       /* `base' + sizeof(table) in memory */
+    FT_ValidationLevel  level;       /* validation level                 */
+    FT_Error            error;       /* error returned. 0 means success  */
+
+    ft_jmp_buf          jump_buffer; /* used for exception handling      */
+
+  } FT_ValidatorRec;
+
+#if defined( _MSC_VER )
+#pragma warning( pop )
+#endif
+
+#define FT_VALIDATOR( x )  ( (FT_Validator)( x ) )
+
+
+  FT_BASE( void )
+  ft_validator_init( FT_Validator        valid,
+                     const FT_Byte*      base,
+                     const FT_Byte*      limit,
+                     FT_ValidationLevel  level );
+
+  /* Do not use this. It's broken and will cause your validator to crash */
+  /* if you run it on an invalid font.                                   */
+  FT_BASE( FT_Int )
+  ft_validator_run( FT_Validator  valid );
+
+  /* Sets the error field in a validator, then calls `longjmp' to return */
+  /* to high-level caller.  Using `setjmp/longjmp' avoids many stupid    */
+  /* error checks within the validation routines.                        */
+  /*                                                                     */
+  FT_BASE( void )
+  ft_validator_error( FT_Validator  valid,
+                      FT_Error      error );
+
+
+  /* Calls ft_validate_error.  Assumes that the `valid' local variable */
+  /* holds a pointer to the current validator object.                  */
+  /*                                                                   */
+  /* Use preprocessor prescan to pass FT_ERR_PREFIX.                   */
+  /*                                                                   */
+#define FT_INVALID( _prefix, _error )  FT_INVALID_( _prefix, _error )
+#define FT_INVALID_( _prefix, _error ) \
+          ft_validator_error( valid, _prefix ## _error )
+
+  /* called when a broken table is detected */
+#define FT_INVALID_TOO_SHORT \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+  /* called when an invalid offset is detected */
+#define FT_INVALID_OFFSET \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Offset )
+
+  /* called when an invalid format/value is detected */
+#define FT_INVALID_FORMAT \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+  /* called when an invalid glyph index is detected */
+#define FT_INVALID_GLYPH_ID \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index )
+
+  /* called when an invalid field value is detected */
+#define FT_INVALID_DATA \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+
+FT_END_HEADER
+
+#endif /* __FTVALID_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/internal.h b/core/include/thirdparties/freetype/freetype/internal/internal.h
new file mode 100644
index 0000000..262afcf
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/internal.h
@@ -0,0 +1,63 @@
+/***************************************************************************/
+/*                                                                         */
+/*  internal.h                                                             */
+/*                                                                         */
+/*    Internal header files (specification only).                          */
+/*                                                                         */
+/*  Copyright 1996-2004, 2013 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is automatically included by `ft2build.h'.                  */
+  /* Do not include it manually!                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#define FT_INTERNAL_OBJECTS_H             <freetype/internal/ftobjs.h>
+#define FT_INTERNAL_PIC_H                 <freetype/internal/ftpic.h>
+#define FT_INTERNAL_STREAM_H              <freetype/internal/ftstream.h>
+#define FT_INTERNAL_MEMORY_H              <freetype/internal/ftmemory.h>
+#define FT_INTERNAL_DEBUG_H               <freetype/internal/ftdebug.h>
+#define FT_INTERNAL_CALC_H                <freetype/internal/ftcalc.h>
+#define FT_INTERNAL_DRIVER_H              <freetype/internal/ftdriver.h>
+#define FT_INTERNAL_TRACE_H               <freetype/internal/fttrace.h>
+#define FT_INTERNAL_GLYPH_LOADER_H        <freetype/internal/ftgloadr.h>
+#define FT_INTERNAL_SFNT_H                <freetype/internal/sfnt.h>
+#define FT_INTERNAL_SERVICE_H             <freetype/internal/ftserv.h>
+#define FT_INTERNAL_RFORK_H               <freetype/internal/ftrfork.h>
+#define FT_INTERNAL_VALIDATE_H            <freetype/internal/ftvalid.h>
+
+#define FT_INTERNAL_TRUETYPE_TYPES_H      <freetype/internal/tttypes.h>
+#define FT_INTERNAL_TYPE1_TYPES_H         <freetype/internal/t1types.h>
+
+#define FT_INTERNAL_POSTSCRIPT_AUX_H      <freetype/internal/psaux.h>
+#define FT_INTERNAL_POSTSCRIPT_HINTS_H    <freetype/internal/pshints.h>
+#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H  <freetype/internal/psglobal.h>
+
+#define FT_INTERNAL_AUTOHINT_H            <freetype/internal/autohint.h>
+
+
+#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
+
+  /* We disable the warning `conditional expression is constant' here */
+  /* in order to compile cleanly with the maximum level of warnings.  */
+  /* In particular, the warning complains about stuff like `while(0)' */
+  /* which is very useful in macro definitions.  There is no benefit  */
+  /* in having it enabled.                                            */
+#pragma warning( disable : 4127 )
+
+#endif /* _MSC_VER */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/psaux.h b/core/include/thirdparties/freetype/freetype/internal/psaux.h
new file mode 100644
index 0000000..3128ea4
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/psaux.h
@@ -0,0 +1,877 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psaux.h                                                                */
+/*                                                                         */
+/*    Auxiliary functions and data structures related to PostScript fonts  */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006, 2008, 2009, 2012 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSAUX_H__
+#define __PSAUX_H__
+
+
+#include "../../ft2build.h"
+#include "ftobjs.h"
+#include "t1types.h"
+#include "services/svpscmap.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                             T1_TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct PS_TableRec_*              PS_Table;
+  typedef const struct PS_Table_FuncsRec_*  PS_Table_Funcs;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_Table_FuncsRec                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A set of function pointers to manage PS_Table objects.             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    table_init    :: Used to initialize a table.                       */
+  /*                                                                       */
+  /*    table_done    :: Finalizes resp. destroy a given table.            */
+  /*                                                                       */
+  /*    table_add     :: Adds a new object to a table.                     */
+  /*                                                                       */
+  /*    table_release :: Releases table data, then finalizes it.           */
+  /*                                                                       */
+  typedef struct  PS_Table_FuncsRec_
+  {
+    FT_Error
+    (*init)( PS_Table   table,
+             FT_Int     count,
+             FT_Memory  memory );
+
+    void
+    (*done)( PS_Table  table );
+
+    FT_Error
+    (*add)( PS_Table    table,
+            FT_Int      idx,
+            void*       object,
+            FT_PtrDist  length );
+
+    void
+    (*release)( PS_Table  table );
+
+  } PS_Table_FuncsRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_TableRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A PS_Table is a simple object used to store an array of objects in */
+  /*    a single memory block.                                             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    block     :: The address in memory of the growheap's block.  This  */
+  /*                 can change between two object adds, due to            */
+  /*                 reallocation.                                         */
+  /*                                                                       */
+  /*    cursor    :: The current top of the grow heap within its block.    */
+  /*                                                                       */
+  /*    capacity  :: The current size of the heap block.  Increments by    */
+  /*                 1kByte chunks.                                        */
+  /*                                                                       */
+  /*    init      :: Set to 0xDEADBEEF if `elements' and `lengths' have    */
+  /*                 been allocated.                                       */
+  /*                                                                       */
+  /*    max_elems :: The maximum number of elements in table.              */
+  /*                                                                       */
+  /*    num_elems :: The current number of elements in table.              */
+  /*                                                                       */
+  /*    elements  :: A table of element addresses within the block.        */
+  /*                                                                       */
+  /*    lengths   :: A table of element sizes within the block.            */
+  /*                                                                       */
+  /*    memory    :: The object used for memory operations                 */
+  /*                 (alloc/realloc).                                      */
+  /*                                                                       */
+  /*    funcs     :: A table of method pointers for this object.           */
+  /*                                                                       */
+  typedef struct  PS_TableRec_
+  {
+    FT_Byte*           block;          /* current memory block           */
+    FT_Offset          cursor;         /* current cursor in memory block */
+    FT_Offset          capacity;       /* current size of memory block   */
+    FT_Long            init;
+
+    FT_Int             max_elems;
+    FT_Int             num_elems;
+    FT_Byte**          elements;       /* addresses of table elements */
+    FT_PtrDist*        lengths;        /* lengths of table elements   */
+
+    FT_Memory          memory;
+    PS_Table_FuncsRec  funcs;
+
+  } PS_TableRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       T1 FIELDS & TOKENS                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct PS_ParserRec_*  PS_Parser;
+
+  typedef struct T1_TokenRec_*   T1_Token;
+
+  typedef struct T1_FieldRec_*   T1_Field;
+
+
+  /* simple enumeration type used to identify token types */
+  typedef enum  T1_TokenType_
+  {
+    T1_TOKEN_TYPE_NONE = 0,
+    T1_TOKEN_TYPE_ANY,
+    T1_TOKEN_TYPE_STRING,
+    T1_TOKEN_TYPE_ARRAY,
+    T1_TOKEN_TYPE_KEY, /* aka `name' */
+
+    /* do not remove */
+    T1_TOKEN_TYPE_MAX
+
+  } T1_TokenType;
+
+
+  /* a simple structure used to identify tokens */
+  typedef struct  T1_TokenRec_
+  {
+    FT_Byte*      start;   /* first character of token in input stream */
+    FT_Byte*      limit;   /* first character after the token          */
+    T1_TokenType  type;    /* type of token                            */
+
+  } T1_TokenRec;
+
+
+  /* enumeration type used to identify object fields */
+  typedef enum  T1_FieldType_
+  {
+    T1_FIELD_TYPE_NONE = 0,
+    T1_FIELD_TYPE_BOOL,
+    T1_FIELD_TYPE_INTEGER,
+    T1_FIELD_TYPE_FIXED,
+    T1_FIELD_TYPE_FIXED_1000,
+    T1_FIELD_TYPE_STRING,
+    T1_FIELD_TYPE_KEY,
+    T1_FIELD_TYPE_BBOX,
+    T1_FIELD_TYPE_MM_BBOX,
+    T1_FIELD_TYPE_INTEGER_ARRAY,
+    T1_FIELD_TYPE_FIXED_ARRAY,
+    T1_FIELD_TYPE_CALLBACK,
+
+    /* do not remove */
+    T1_FIELD_TYPE_MAX
+
+  } T1_FieldType;
+
+
+  typedef enum  T1_FieldLocation_
+  {
+    T1_FIELD_LOCATION_CID_INFO,
+    T1_FIELD_LOCATION_FONT_DICT,
+    T1_FIELD_LOCATION_FONT_EXTRA,
+    T1_FIELD_LOCATION_FONT_INFO,
+    T1_FIELD_LOCATION_PRIVATE,
+    T1_FIELD_LOCATION_BBOX,
+    T1_FIELD_LOCATION_LOADER,
+    T1_FIELD_LOCATION_FACE,
+    T1_FIELD_LOCATION_BLEND,
+
+    /* do not remove */
+    T1_FIELD_LOCATION_MAX
+
+  } T1_FieldLocation;
+
+
+  typedef void
+  (*T1_Field_ParseFunc)( FT_Face     face,
+                         FT_Pointer  parser );
+
+
+  /* structure type used to model object fields */
+  typedef struct  T1_FieldRec_
+  {
+    const char*         ident;        /* field identifier               */
+    T1_FieldLocation    location;
+    T1_FieldType        type;         /* type of field                  */
+    T1_Field_ParseFunc  reader;
+    FT_UInt             offset;       /* offset of field in object      */
+    FT_Byte             size;         /* size of field in bytes         */
+    FT_UInt             array_max;    /* maximum number of elements for */
+                                      /* array                          */
+    FT_UInt             count_offset; /* offset of element count for    */
+                                      /* arrays; must not be zero if in */
+                                      /* use -- in other words, a       */
+                                      /* `num_FOO' element must not     */
+                                      /* start the used structure if we */
+                                      /* parse a `FOO' array            */
+    FT_UInt             dict;         /* where we expect it             */
+  } T1_FieldRec;
+
+#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
+#define T1_FIELD_DICT_PRIVATE  ( 1 << 1 )
+
+
+
+#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
+          {                                                 \
+            _ident, T1CODE, _type,                          \
+            0,                                              \
+            FT_FIELD_OFFSET( _fname ),                      \
+            FT_FIELD_SIZE( _fname ),                        \
+            0, 0,                                           \
+            _dict                                           \
+          },
+
+#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
+          {                                             \
+            _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \
+            (T1_Field_ParseFunc)_reader,                \
+            0, 0,                                       \
+            0, 0,                                       \
+            _dict                                       \
+          },
+
+#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
+          {                                                      \
+            _ident, T1CODE, _type,                               \
+            0,                                                   \
+            FT_FIELD_OFFSET( _fname ),                           \
+            FT_FIELD_SIZE_DELTA( _fname ),                       \
+            _max,                                                \
+            FT_FIELD_OFFSET( num_ ## _fname ),                   \
+            _dict                                                \
+          },
+
+#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
+          {                                                       \
+            _ident, T1CODE, _type,                                \
+            0,                                                    \
+            FT_FIELD_OFFSET( _fname ),                            \
+            FT_FIELD_SIZE_DELTA( _fname ),                        \
+            _max, 0,                                              \
+            _dict                                                 \
+          },
+
+
+#define T1_FIELD_BOOL( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
+
+#define T1_FIELD_NUM( _ident, _fname, _dict )                                 \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
+
+#define T1_FIELD_FIXED( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
+
+#define T1_FIELD_FIXED_1000( _ident, _fname, _dict )                     \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
+                               _dict )
+
+#define T1_FIELD_STRING( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
+
+#define T1_FIELD_KEY( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
+
+#define T1_FIELD_BBOX( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
+
+
+#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict )         \
+          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
+                              _fname, _fmax, _dict )
+
+#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict )     \
+          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
+                              _fname, _fmax, _dict )
+
+#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict )         \
+          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
+                               _fname, _fmax, _dict )
+
+#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict )     \
+          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
+                               _fname, _fmax, _dict )
+
+#define T1_FIELD_CALLBACK( _ident, _name, _dict )       \
+          T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            T1 PARSER                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef const struct PS_Parser_FuncsRec_*  PS_Parser_Funcs;
+
+  typedef struct  PS_Parser_FuncsRec_
+  {
+    void
+    (*init)( PS_Parser  parser,
+             FT_Byte*   base,
+             FT_Byte*   limit,
+             FT_Memory  memory );
+
+    void
+    (*done)( PS_Parser  parser );
+
+    void
+    (*skip_spaces)( PS_Parser  parser );
+    void
+    (*skip_PS_token)( PS_Parser  parser );
+
+    FT_Long
+    (*to_int)( PS_Parser  parser );
+    FT_Fixed
+    (*to_fixed)( PS_Parser  parser,
+                 FT_Int     power_ten );
+
+    FT_Error
+    (*to_bytes)( PS_Parser  parser,
+                 FT_Byte*   bytes,
+                 FT_Offset  max_bytes,
+                 FT_Long*   pnum_bytes,
+                 FT_Bool    delimiters );
+
+    FT_Int
+    (*to_coord_array)( PS_Parser  parser,
+                       FT_Int     max_coords,
+                       FT_Short*  coords );
+    FT_Int
+    (*to_fixed_array)( PS_Parser  parser,
+                       FT_Int     max_values,
+                       FT_Fixed*  values,
+                       FT_Int     power_ten );
+
+    void
+    (*to_token)( PS_Parser  parser,
+                 T1_Token   token );
+    void
+    (*to_token_array)( PS_Parser  parser,
+                       T1_Token   tokens,
+                       FT_UInt    max_tokens,
+                       FT_Int*    pnum_tokens );
+
+    FT_Error
+    (*load_field)( PS_Parser       parser,
+                   const T1_Field  field,
+                   void**          objects,
+                   FT_UInt         max_objects,
+                   FT_ULong*       pflags );
+
+    FT_Error
+    (*load_field_table)( PS_Parser       parser,
+                         const T1_Field  field,
+                         void**          objects,
+                         FT_UInt         max_objects,
+                         FT_ULong*       pflags );
+
+  } PS_Parser_FuncsRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_ParserRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A PS_Parser is an object used to parse a Type 1 font very quickly. */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    cursor :: The current position in the text.                        */
+  /*                                                                       */
+  /*    base   :: Start of the processed text.                             */
+  /*                                                                       */
+  /*    limit  :: End of the processed text.                               */
+  /*                                                                       */
+  /*    error  :: The last error returned.                                 */
+  /*                                                                       */
+  /*    memory :: The object used for memory operations (alloc/realloc).   */
+  /*                                                                       */
+  /*    funcs  :: A table of functions for the parser.                     */
+  /*                                                                       */
+  typedef struct  PS_ParserRec_
+  {
+    FT_Byte*   cursor;
+    FT_Byte*   base;
+    FT_Byte*   limit;
+    FT_Error   error;
+    FT_Memory  memory;
+
+    PS_Parser_FuncsRec  funcs;
+
+  } PS_ParserRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         T1 BUILDER                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct T1_BuilderRec_*  T1_Builder;
+
+
+  typedef FT_Error
+  (*T1_Builder_Check_Points_Func)( T1_Builder  builder,
+                                   FT_Int      count );
+
+  typedef void
+  (*T1_Builder_Add_Point_Func)( T1_Builder  builder,
+                                FT_Pos      x,
+                                FT_Pos      y,
+                                FT_Byte     flag );
+
+  typedef FT_Error
+  (*T1_Builder_Add_Point1_Func)( T1_Builder  builder,
+                                 FT_Pos      x,
+                                 FT_Pos      y );
+
+  typedef FT_Error
+  (*T1_Builder_Add_Contour_Func)( T1_Builder  builder );
+
+  typedef FT_Error
+  (*T1_Builder_Start_Point_Func)( T1_Builder  builder,
+                                  FT_Pos      x,
+                                  FT_Pos      y );
+
+  typedef void
+  (*T1_Builder_Close_Contour_Func)( T1_Builder  builder );
+
+
+  typedef const struct T1_Builder_FuncsRec_*  T1_Builder_Funcs;
+
+  typedef struct  T1_Builder_FuncsRec_
+  {
+    void
+    (*init)( T1_Builder    builder,
+             FT_Face       face,
+             FT_Size       size,
+             FT_GlyphSlot  slot,
+             FT_Bool       hinting );
+
+    void
+    (*done)( T1_Builder   builder );
+
+    T1_Builder_Check_Points_Func   check_points;
+    T1_Builder_Add_Point_Func      add_point;
+    T1_Builder_Add_Point1_Func     add_point1;
+    T1_Builder_Add_Contour_Func    add_contour;
+    T1_Builder_Start_Point_Func    start_point;
+    T1_Builder_Close_Contour_Func  close_contour;
+
+  } T1_Builder_FuncsRec;
+
+
+  /* an enumeration type to handle charstring parsing states */
+  typedef enum  T1_ParseState_
+  {
+    T1_Parse_Start,
+    T1_Parse_Have_Width,
+    T1_Parse_Have_Moveto,
+    T1_Parse_Have_Path
+
+  } T1_ParseState;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Structure>                                                           */
+  /*    T1_BuilderRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*     A structure used during glyph loading to store its outline.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory       :: The current memory object.                         */
+  /*                                                                       */
+  /*    face         :: The current face object.                           */
+  /*                                                                       */
+  /*    glyph        :: The current glyph slot.                            */
+  /*                                                                       */
+  /*    loader       :: XXX                                                */
+  /*                                                                       */
+  /*    base         :: The base glyph outline.                            */
+  /*                                                                       */
+  /*    current      :: The current glyph outline.                         */
+  /*                                                                       */
+  /*    max_points   :: maximum points in builder outline                  */
+  /*                                                                       */
+  /*    max_contours :: Maximum number of contours in builder outline.     */
+  /*                                                                       */
+  /*    pos_x        :: The horizontal translation (if composite glyph).   */
+  /*                                                                       */
+  /*    pos_y        :: The vertical translation (if composite glyph).     */
+  /*                                                                       */
+  /*    left_bearing :: The left side bearing point.                       */
+  /*                                                                       */
+  /*    advance      :: The horizontal advance vector.                     */
+  /*                                                                       */
+  /*    bbox         :: Unused.                                            */
+  /*                                                                       */
+  /*    parse_state  :: An enumeration which controls the charstring       */
+  /*                    parsing state.                                     */
+  /*                                                                       */
+  /*    load_points  :: If this flag is not set, no points are loaded.     */
+  /*                                                                       */
+  /*    no_recurse   :: Set but not used.                                  */
+  /*                                                                       */
+  /*    metrics_only :: A boolean indicating that we only want to compute  */
+  /*                    the metrics of a given glyph, not load all of its  */
+  /*                    points.                                            */
+  /*                                                                       */
+  /*    funcs        :: An array of function pointers for the builder.     */
+  /*                                                                       */
+  typedef struct  T1_BuilderRec_
+  {
+    FT_Memory       memory;
+    FT_Face         face;
+    FT_GlyphSlot    glyph;
+    FT_GlyphLoader  loader;
+    FT_Outline*     base;
+    FT_Outline*     current;
+
+    FT_Pos          pos_x;
+    FT_Pos          pos_y;
+
+    FT_Vector       left_bearing;
+    FT_Vector       advance;
+
+    FT_BBox         bbox;          /* bounding box */
+    T1_ParseState   parse_state;
+    FT_Bool         load_points;
+    FT_Bool         no_recurse;
+
+    FT_Bool         metrics_only;
+
+    void*           hints_funcs;    /* hinter-specific */
+    void*           hints_globals;  /* hinter-specific */
+
+    T1_Builder_FuncsRec  funcs;
+
+  } T1_BuilderRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         T1 DECODER                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */
+  /* calls during glyph loading.                                           */
+  /*                                                                       */
+#define T1_MAX_SUBRS_CALLS  8
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */
+  /* minimum of 16 is required.                                            */
+  /*                                                                       */
+#define T1_MAX_CHARSTRINGS_OPERANDS  32
+
+#endif /* 0 */
+
+
+  typedef struct  T1_Decoder_ZoneRec_
+  {
+    FT_Byte*  cursor;
+    FT_Byte*  base;
+    FT_Byte*  limit;
+
+  } T1_Decoder_ZoneRec, *T1_Decoder_Zone;
+
+
+  typedef struct T1_DecoderRec_*              T1_Decoder;
+  typedef const struct T1_Decoder_FuncsRec_*  T1_Decoder_Funcs;
+
+
+  typedef FT_Error
+  (*T1_Decoder_Callback)( T1_Decoder  decoder,
+                          FT_UInt     glyph_index );
+
+
+  typedef struct  T1_Decoder_FuncsRec_
+  {
+    FT_Error
+    (*init)( T1_Decoder           decoder,
+             FT_Face              face,
+             FT_Size              size,
+             FT_GlyphSlot         slot,
+             FT_Byte**            glyph_names,
+             PS_Blend             blend,
+             FT_Bool              hinting,
+             FT_Render_Mode       hint_mode,
+             T1_Decoder_Callback  callback );
+
+    void
+    (*done)( T1_Decoder  decoder );
+
+    FT_Error
+    (*parse_charstrings)( T1_Decoder  decoder,
+                          FT_Byte*    base,
+                          FT_UInt     len );
+
+  } T1_Decoder_FuncsRec;
+
+
+  typedef struct  T1_DecoderRec_
+  {
+    T1_BuilderRec        builder;
+
+    FT_Long              stack[T1_MAX_CHARSTRINGS_OPERANDS];
+    FT_Long*             top;
+
+    T1_Decoder_ZoneRec   zones[T1_MAX_SUBRS_CALLS + 1];
+    T1_Decoder_Zone      zone;
+
+    FT_Service_PsCMaps   psnames;      /* for seac */
+    FT_UInt              num_glyphs;
+    FT_Byte**            glyph_names;
+
+    FT_Int               lenIV;        /* internal for sub routine calls */
+    FT_UInt              num_subrs;
+    FT_Byte**            subrs;
+    FT_PtrDist*          subrs_len;    /* array of subrs length (optional) */
+
+    FT_Matrix            font_matrix;
+    FT_Vector            font_offset;
+
+    FT_Int               flex_state;
+    FT_Int               num_flex_vectors;
+    FT_Vector            flex_vectors[7];
+
+    PS_Blend             blend;       /* for multiple master support */
+
+    FT_Render_Mode       hint_mode;
+
+    T1_Decoder_Callback  parse_callback;
+    T1_Decoder_FuncsRec  funcs;
+
+    FT_Long*             buildchar;
+    FT_UInt              len_buildchar;
+
+    FT_Bool              seac;
+
+  } T1_DecoderRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            AFM PARSER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct AFM_ParserRec_*  AFM_Parser;
+
+  typedef struct  AFM_Parser_FuncsRec_
+  {
+    FT_Error
+    (*init)( AFM_Parser  parser,
+             FT_Memory   memory,
+             FT_Byte*    base,
+             FT_Byte*    limit );
+
+    void
+    (*done)( AFM_Parser  parser );
+
+    FT_Error
+    (*parse)( AFM_Parser  parser );
+
+  } AFM_Parser_FuncsRec;
+
+
+  typedef struct AFM_StreamRec_*  AFM_Stream;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    AFM_ParserRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An AFM_Parser is a parser for the AFM files.                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory    :: The object used for memory operations (alloc and      */
+  /*                 realloc).                                             */
+  /*                                                                       */
+  /*    stream    :: This is an opaque object.                             */
+  /*                                                                       */
+  /*    FontInfo  :: The result will be stored here.                       */
+  /*                                                                       */
+  /*    get_index :: A user provided function to get a glyph index by its  */
+  /*                 name.                                                 */
+  /*                                                                       */
+  typedef struct  AFM_ParserRec_
+  {
+    FT_Memory     memory;
+    AFM_Stream    stream;
+
+    AFM_FontInfo  FontInfo;
+
+    FT_Int
+    (*get_index)( const char*  name,
+                  FT_Offset    len,
+                  void*        user_data );
+
+    void*         user_data;
+
+  } AFM_ParserRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     TYPE1 CHARMAPS                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef const struct T1_CMap_ClassesRec_*  T1_CMap_Classes;
+
+  typedef struct T1_CMap_ClassesRec_
+  {
+    FT_CMap_Class  standard;
+    FT_CMap_Class  expert;
+    FT_CMap_Class  custom;
+    FT_CMap_Class  unicode;
+
+  } T1_CMap_ClassesRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        PSAux Module Interface                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  PSAux_ServiceRec_
+  {
+    /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */
+    const PS_Table_FuncsRec*    ps_table_funcs;
+    const PS_Parser_FuncsRec*   ps_parser_funcs;
+    const T1_Builder_FuncsRec*  t1_builder_funcs;
+    const T1_Decoder_FuncsRec*  t1_decoder_funcs;
+
+    void
+    (*t1_decrypt)( FT_Byte*   buffer,
+                   FT_Offset  length,
+                   FT_UShort  seed );
+
+    T1_CMap_Classes  t1_cmap_classes;
+
+    /* fields after this comment line were added after version 2.1.10 */
+    const AFM_Parser_FuncsRec*  afm_parser_funcs;
+
+  } PSAux_ServiceRec, *PSAux_Service;
+
+  /* backwards-compatible type definition */
+  typedef PSAux_ServiceRec   PSAux_Interface;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                 Some convenience functions                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define IS_PS_NEWLINE( ch ) \
+  ( (ch) == '\r' ||         \
+    (ch) == '\n' )
+
+#define IS_PS_SPACE( ch )  \
+  ( (ch) == ' '         || \
+    IS_PS_NEWLINE( ch ) || \
+    (ch) == '\t'        || \
+    (ch) == '\f'        || \
+    (ch) == '\0' )
+
+#define IS_PS_SPECIAL( ch )       \
+  ( (ch) == '/'                || \
+    (ch) == '(' || (ch) == ')' || \
+    (ch) == '<' || (ch) == '>' || \
+    (ch) == '[' || (ch) == ']' || \
+    (ch) == '{' || (ch) == '}' || \
+    (ch) == '%'                )
+
+#define IS_PS_DELIM( ch )  \
+  ( IS_PS_SPACE( ch )   || \
+    IS_PS_SPECIAL( ch ) )
+
+#define IS_PS_DIGIT( ch )        \
+  ( (ch) >= '0' && (ch) <= '9' )
+
+#define IS_PS_XDIGIT( ch )            \
+  ( IS_PS_DIGIT( ch )              || \
+    ( (ch) >= 'A' && (ch) <= 'F' ) || \
+    ( (ch) >= 'a' && (ch) <= 'f' ) )
+
+#define IS_PS_BASE85( ch )       \
+  ( (ch) >= '!' && (ch) <= 'u' )
+
+#define IS_PS_TOKEN( cur, limit, token )                                \
+  ( (char)(cur)[0] == (token)[0]                                     && \
+    ( (cur) + sizeof ( (token) ) == (limit) ||                          \
+      ( (cur) + sizeof( (token) ) < (limit)          &&                 \
+        IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) )             && \
+    ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )
+
+
+FT_END_HEADER
+
+#endif /* __PSAUX_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/pshints.h b/core/include/thirdparties/freetype/freetype/internal/pshints.h
new file mode 100644
index 0000000..f9b5940
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/pshints.h
@@ -0,0 +1,722 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshints.h                                                              */
+/*                                                                         */
+/*    Interface to Postscript-specific (Type 1 and Type 2) hints           */
+/*    recorders (specification only).  These are used to support native    */
+/*    T1/T2 hints in the `type1', `cid', and `cff' font drivers.           */
+/*                                                                         */
+/*  Copyright 2001-2003, 2005-2007, 2009, 2012 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSHINTS_H__
+#define __PSHINTS_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+#include "../t1tables.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****               INTERNAL REPRESENTATION OF GLOBALS              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct PSH_GlobalsRec_*  PSH_Globals;
+
+  typedef FT_Error
+  (*PSH_Globals_NewFunc)( FT_Memory     memory,
+                          T1_Private*   private_dict,
+                          PSH_Globals*  aglobals );
+
+  typedef FT_Error
+  (*PSH_Globals_SetScaleFunc)( PSH_Globals  globals,
+                               FT_Fixed     x_scale,
+                               FT_Fixed     y_scale,
+                               FT_Fixed     x_delta,
+                               FT_Fixed     y_delta );
+
+  typedef void
+  (*PSH_Globals_DestroyFunc)( PSH_Globals  globals );
+
+
+  typedef struct  PSH_Globals_FuncsRec_
+  {
+    PSH_Globals_NewFunc       create;
+    PSH_Globals_SetScaleFunc  set_scale;
+    PSH_Globals_DestroyFunc   destroy;
+
+  } PSH_Globals_FuncsRec, *PSH_Globals_Funcs;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  PUBLIC TYPE 1 HINTS RECORDER                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************
+   *
+   * @type:
+   *   T1_Hints
+   *
+   * @description:
+   *   This is a handle to an opaque structure used to record glyph hints
+   *   from a Type 1 character glyph character string.
+   *
+   *   The methods used to operate on this object are defined by the
+   *   @T1_Hints_FuncsRec structure.  Recording glyph hints is normally
+   *   achieved through the following scheme:
+   *
+   *   - Open a new hint recording session by calling the `open' method.
+   *     This rewinds the recorder and prepare it for new input.
+   *
+   *   - For each hint found in the glyph charstring, call the corresponding
+   *     method (`stem', `stem3', or `reset').  Note that these functions do
+   *     not return an error code.
+   *
+   *   - Close the recording session by calling the `close' method.  It
+   *     returns an error code if the hints were invalid or something
+   *     strange happened (e.g., memory shortage).
+   *
+   *   The hints accumulated in the object can later be used by the
+   *   PostScript hinter.
+   *
+   */
+  typedef struct T1_HintsRec_*  T1_Hints;
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   T1_Hints_Funcs
+   *
+   * @description:
+   *   A pointer to the @T1_Hints_FuncsRec structure that defines the API of
+   *   a given @T1_Hints object.
+   *
+   */
+  typedef const struct T1_Hints_FuncsRec_*  T1_Hints_Funcs;
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_OpenFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to prepare it for a new Type 1
+   *   hints recording session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   * @note:
+   *   You should always call the @T1_Hints_CloseFunc method in order to
+   *   close an opened recording session.
+   *
+   */
+  typedef void
+  (*T1_Hints_OpenFunc)( T1_Hints  hints );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_SetStemFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to record a new horizontal or
+   *   vertical stem.  This corresponds to the Type 1 `hstem' and `vstem'
+   *   operators.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   dimension ::
+   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).
+   *
+   *   coords ::
+   *     Array of 2 coordinates in 16.16 format, used as (position,length)
+   *     stem descriptor.
+   *
+   * @note:
+   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use
+   *   horizontal coordinates (x) for vertical stems (dim=1).
+   *
+   *   `coords[0]' is the absolute stem position (lowest coordinate);
+   *   `coords[1]' is the length.
+   *
+   *   The length can be negative, in which case it must be either -20 or
+   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1
+   *   specification.
+   *
+   *   If the length is -21 (corresponding to a bottom ghost stem), then
+   *   the real stem position is `coords[0]+coords[1]'.
+   *
+   */
+  typedef void
+  (*T1_Hints_SetStemFunc)( T1_Hints   hints,
+                           FT_UInt    dimension,
+                           FT_Fixed*  coords );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_SetStem3Func
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to record three
+   *   counter-controlled horizontal or vertical stems at once.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   dimension ::
+   *     0 for horizontal stems, 1 for vertical ones.
+   *
+   *   coords ::
+   *     An array of 6 values in 16.16 format, holding 3 (position,length)
+   *     pairs for the counter-controlled stems.
+   *
+   * @note:
+   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use
+   *   horizontal coordinates (x) for vertical stems (dim=1).
+   *
+   *   The lengths cannot be negative (ghost stems are never
+   *   counter-controlled).
+   *
+   */
+  typedef void
+  (*T1_Hints_SetStem3Func)( T1_Hints   hints,
+                            FT_UInt    dimension,
+                            FT_Fixed*  coords );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_ResetFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to reset the stems hints in a
+   *   recording session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   end_point ::
+   *     The index of the last point in the input glyph in which the
+   *     previously defined hints apply.
+   *
+   */
+  typedef void
+  (*T1_Hints_ResetFunc)( T1_Hints  hints,
+                         FT_UInt   end_point );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_CloseFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to close a hint recording
+   *   session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   end_point ::
+   *     The index of the last point in the input glyph.
+   *
+   * @return:
+   *   FreeType error code.  0 means success.
+   *
+   * @note:
+   *   The error code is set to indicate that an error occurred during the
+   *   recording session.
+   *
+   */
+  typedef FT_Error
+  (*T1_Hints_CloseFunc)( T1_Hints  hints,
+                         FT_UInt   end_point );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_ApplyFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to apply hints to the
+   *   corresponding glyph outline.  Must be called once all hints have been
+   *   recorded.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   outline ::
+   *     A pointer to the target outline descriptor.
+   *
+   *   globals ::
+   *     The hinter globals for this font.
+   *
+   *   hint_mode ::
+   *     Hinting information.
+   *
+   * @return:
+   *   FreeType error code.  0 means success.
+   *
+   * @note:
+   *   On input, all points within the outline are in font coordinates. On
+   *   output, they are in 1/64th of pixels.
+   *
+   *   The scaling transformation is taken from the `globals' object which
+   *   must correspond to the same font as the glyph.
+   *
+   */
+  typedef FT_Error
+  (*T1_Hints_ApplyFunc)( T1_Hints        hints,
+                         FT_Outline*     outline,
+                         PSH_Globals     globals,
+                         FT_Render_Mode  hint_mode );
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   T1_Hints_FuncsRec
+   *
+   * @description:
+   *   The structure used to provide the API to @T1_Hints objects.
+   *
+   * @fields:
+   *   hints ::
+   *     A handle to the T1 Hints recorder.
+   *
+   *   open ::
+   *     The function to open a recording session.
+   *
+   *   close ::
+   *     The function to close a recording session.
+   *
+   *   stem ::
+   *     The function to set a simple stem.
+   *
+   *   stem3 ::
+   *     The function to set counter-controlled stems.
+   *
+   *   reset ::
+   *     The function to reset stem hints.
+   *
+   *   apply ::
+   *     The function to apply the hints to the corresponding glyph outline.
+   *
+   */
+  typedef struct  T1_Hints_FuncsRec_
+  {
+    T1_Hints               hints;
+    T1_Hints_OpenFunc      open;
+    T1_Hints_CloseFunc     close;
+    T1_Hints_SetStemFunc   stem;
+    T1_Hints_SetStem3Func  stem3;
+    T1_Hints_ResetFunc     reset;
+    T1_Hints_ApplyFunc     apply;
+
+  } T1_Hints_FuncsRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  PUBLIC TYPE 2 HINTS RECORDER                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************
+   *
+   * @type:
+   *   T2_Hints
+   *
+   * @description:
+   *   This is a handle to an opaque structure used to record glyph hints
+   *   from a Type 2 character glyph character string.
+   *
+   *   The methods used to operate on this object are defined by the
+   *   @T2_Hints_FuncsRec structure.  Recording glyph hints is normally
+   *   achieved through the following scheme:
+   *
+   *   - Open a new hint recording session by calling the `open' method.
+   *     This rewinds the recorder and prepare it for new input.
+   *
+   *   - For each hint found in the glyph charstring, call the corresponding
+   *     method (`stems', `hintmask', `counters').  Note that these
+   *     functions do not return an error code.
+   *
+   *   - Close the recording session by calling the `close' method.  It
+   *     returns an error code if the hints were invalid or something
+   *     strange happened (e.g., memory shortage).
+   *
+   *   The hints accumulated in the object can later be used by the
+   *   Postscript hinter.
+   *
+   */
+  typedef struct T2_HintsRec_*  T2_Hints;
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   T2_Hints_Funcs
+   *
+   * @description:
+   *   A pointer to the @T2_Hints_FuncsRec structure that defines the API of
+   *   a given @T2_Hints object.
+   *
+   */
+  typedef const struct T2_Hints_FuncsRec_*  T2_Hints_Funcs;
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_OpenFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to prepare it for a new Type 2
+   *   hints recording session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   * @note:
+   *   You should always call the @T2_Hints_CloseFunc method in order to
+   *   close an opened recording session.
+   *
+   */
+  typedef void
+  (*T2_Hints_OpenFunc)( T2_Hints  hints );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_StemsFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to set the table of stems in
+   *   either the vertical or horizontal dimension.  Equivalent to the
+   *   `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   dimension ::
+   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).
+   *
+   *   count ::
+   *     The number of stems.
+   *
+   *   coords ::
+   *     An array of `count' (position,length) pairs in 16.16 format.
+   *
+   * @note:
+   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use
+   *   horizontal coordinates (x) for vertical stems (dim=1).
+   *
+   *   There are `2*count' elements in the `coords' array.  Each even
+   *   element is an absolute position in font units, each odd element is a
+   *   length in font units.
+   *
+   *   A length can be negative, in which case it must be either -20 or
+   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1
+   *   specification.
+   *
+   */
+  typedef void
+  (*T2_Hints_StemsFunc)( T2_Hints   hints,
+                         FT_UInt    dimension,
+                         FT_UInt    count,
+                         FT_Fixed*  coordinates );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_MaskFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to set a given hintmask (this
+   *   corresponds to the `hintmask' Type 2 operator).
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   end_point ::
+   *     The glyph index of the last point to which the previously defined
+   *     or activated hints apply.
+   *
+   *   bit_count ::
+   *     The number of bits in the hint mask.
+   *
+   *   bytes ::
+   *     An array of bytes modelling the hint mask.
+   *
+   * @note:
+   *   If the hintmask starts the charstring (before any glyph point
+   *   definition), the value of `end_point' should be 0.
+   *
+   *   `bit_count' is the number of meaningful bits in the `bytes' array; it
+   *   must be equal to the total number of hints defined so far (i.e.,
+   *   horizontal+verticals).
+   *
+   *   The `bytes' array can come directly from the Type 2 charstring and
+   *   respects the same format.
+   *
+   */
+  typedef void
+  (*T2_Hints_MaskFunc)( T2_Hints        hints,
+                        FT_UInt         end_point,
+                        FT_UInt         bit_count,
+                        const FT_Byte*  bytes );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_CounterFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to set a given counter mask
+   *   (this corresponds to the `hintmask' Type 2 operator).
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   end_point ::
+   *     A glyph index of the last point to which the previously defined or
+   *     active hints apply.
+   *
+   *   bit_count ::
+   *     The number of bits in the hint mask.
+   *
+   *   bytes ::
+   *     An array of bytes modelling the hint mask.
+   *
+   * @note:
+   *   If the hintmask starts the charstring (before any glyph point
+   *   definition), the value of `end_point' should be 0.
+   *
+   *   `bit_count' is the number of meaningful bits in the `bytes' array; it
+   *   must be equal to the total number of hints defined so far (i.e.,
+   *   horizontal+verticals).
+   *
+   *    The `bytes' array can come directly from the Type 2 charstring and
+   *    respects the same format.
+   *
+   */
+  typedef void
+  (*T2_Hints_CounterFunc)( T2_Hints        hints,
+                           FT_UInt         bit_count,
+                           const FT_Byte*  bytes );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_CloseFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to close a hint recording
+   *   session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   end_point ::
+   *     The index of the last point in the input glyph.
+   *
+   * @return:
+   *   FreeType error code.  0 means success.
+   *
+   * @note:
+   *   The error code is set to indicate that an error occurred during the
+   *   recording session.
+   *
+   */
+  typedef FT_Error
+  (*T2_Hints_CloseFunc)( T2_Hints  hints,
+                         FT_UInt   end_point );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_ApplyFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to apply hints to the
+   *   corresponding glyph outline.  Must be called after the `close'
+   *   method.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   outline ::
+   *     A pointer to the target outline descriptor.
+   *
+   *   globals ::
+   *     The hinter globals for this font.
+   *
+   *   hint_mode ::
+   *     Hinting information.
+   *
+   * @return:
+   *   FreeType error code.  0 means success.
+   *
+   * @note:
+   *   On input, all points within the outline are in font coordinates. On
+   *   output, they are in 1/64th of pixels.
+   *
+   *   The scaling transformation is taken from the `globals' object which
+   *   must correspond to the same font than the glyph.
+   *
+   */
+  typedef FT_Error
+  (*T2_Hints_ApplyFunc)( T2_Hints        hints,
+                         FT_Outline*     outline,
+                         PSH_Globals     globals,
+                         FT_Render_Mode  hint_mode );
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   T2_Hints_FuncsRec
+   *
+   * @description:
+   *   The structure used to provide the API to @T2_Hints objects.
+   *
+   * @fields:
+   *   hints ::
+   *     A handle to the T2 hints recorder object.
+   *
+   *   open ::
+   *     The function to open a recording session.
+   *
+   *   close ::
+   *     The function to close a recording session.
+   *
+   *   stems ::
+   *     The function to set the dimension's stems table.
+   *
+   *   hintmask ::
+   *     The function to set hint masks.
+   *
+   *   counter ::
+   *     The function to set counter masks.
+   *
+   *   apply ::
+   *     The function to apply the hints on the corresponding glyph outline.
+   *
+   */
+  typedef struct  T2_Hints_FuncsRec_
+  {
+    T2_Hints              hints;
+    T2_Hints_OpenFunc     open;
+    T2_Hints_CloseFunc    close;
+    T2_Hints_StemsFunc    stems;
+    T2_Hints_MaskFunc     hintmask;
+    T2_Hints_CounterFunc  counter;
+    T2_Hints_ApplyFunc    apply;
+
+  } T2_Hints_FuncsRec;
+
+
+  /* */
+
+
+  typedef struct  PSHinter_Interface_
+  {
+    PSH_Globals_Funcs  (*get_globals_funcs)( FT_Module  module );
+    T1_Hints_Funcs     (*get_t1_funcs)     ( FT_Module  module );
+    T2_Hints_Funcs     (*get_t2_funcs)     ( FT_Module  module );
+
+  } PSHinter_Interface;
+
+  typedef PSHinter_Interface*  PSHinter_Service;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_PSHINTER_INTERFACE(        \
+          class_,                            \
+          get_globals_funcs_,                \
+          get_t1_funcs_,                     \
+          get_t2_funcs_ )                    \
+  static const PSHinter_Interface  class_ =  \
+  {                                          \
+    get_globals_funcs_,                      \
+    get_t1_funcs_,                           \
+    get_t2_funcs_                            \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_PSHINTER_INTERFACE(                      \
+          class_,                                          \
+          get_globals_funcs_,                              \
+          get_t1_funcs_,                                   \
+          get_t2_funcs_ )                                  \
+  void                                                     \
+  FT_Init_Class_ ## class_( FT_Library           library,  \
+                            PSHinter_Interface*  clazz )   \
+  {                                                        \
+    FT_UNUSED( library );                                  \
+                                                           \
+    clazz->get_globals_funcs = get_globals_funcs_;         \
+    clazz->get_t1_funcs      = get_t1_funcs_;              \
+    clazz->get_t2_funcs      = get_t2_funcs_;              \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __PSHINTS_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svbdf.h b/core/include/thirdparties/freetype/freetype/internal/services/svbdf.h
new file mode 100644
index 0000000..508bd15
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svbdf.h
@@ -0,0 +1,82 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svbdf.h                                                                */
+/*                                                                         */
+/*    The FreeType BDF services (specification).                           */
+/*                                                                         */
+/*  Copyright 2003, 2009, 2012 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVBDF_H__
+#define __SVBDF_H__
+
+#include "../../ftbdf.h"
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_BDF  "bdf"
+
+  typedef FT_Error
+  (*FT_BDF_GetCharsetIdFunc)( FT_Face       face,
+                              const char*  *acharset_encoding,
+                              const char*  *acharset_registry );
+
+  typedef FT_Error
+  (*FT_BDF_GetPropertyFunc)( FT_Face           face,
+                             const char*       prop_name,
+                             BDF_PropertyRec  *aproperty );
+
+
+  FT_DEFINE_SERVICE( BDF )
+  {
+    FT_BDF_GetCharsetIdFunc  get_charset_id;
+    FT_BDF_GetPropertyFunc   get_property;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_BDFRec( class_,                                \
+                                  get_charset_id_,                       \
+                                  get_property_ )                        \
+  static const FT_Service_BDFRec  class_ =                               \
+  {                                                                      \
+    get_charset_id_, get_property_                                       \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_BDFRec( class_,                                \
+                                  get_charset_id_,                       \
+                                  get_property_ )                        \
+  void                                                                   \
+  FT_Init_Class_ ## class_( FT_Service_BDFRec*  clazz )                  \
+  {                                                                      \
+    clazz->get_charset_id = get_charset_id_;                             \
+    clazz->get_property   = get_property_;                               \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVBDF_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svcid.h b/core/include/thirdparties/freetype/freetype/internal/services/svcid.h
new file mode 100644
index 0000000..fe33c74
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svcid.h
@@ -0,0 +1,89 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svcid.h                                                                */
+/*                                                                         */
+/*    The FreeType CID font services (specification).                      */
+/*                                                                         */
+/*  Copyright 2007, 2009, 2012 by Derek Clegg, Michael Toftdal.            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVCID_H__
+#define __SVCID_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_CID  "CID"
+
+  typedef FT_Error
+  (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face       face,
+                                               const char*  *registry,
+                                               const char*  *ordering,
+                                               FT_Int       *supplement );
+  typedef FT_Error
+  (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face   face,
+                                         FT_Bool  *is_cid );
+  typedef FT_Error
+  (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face   face,
+                                      FT_UInt   glyph_index,
+                                      FT_UInt  *cid );
+
+  FT_DEFINE_SERVICE( CID )
+  {
+    FT_CID_GetRegistryOrderingSupplementFunc  get_ros;
+    FT_CID_GetIsInternallyCIDKeyedFunc        get_is_cid;
+    FT_CID_GetCIDFromGlyphIndexFunc           get_cid_from_glyph_index;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \
+                                  get_ros_,                                 \
+                                  get_is_cid_,                              \
+                                  get_cid_from_glyph_index_ )               \
+  static const FT_Service_CIDRec class_ =                                   \
+  {                                                                         \
+    get_ros_, get_is_cid_, get_cid_from_glyph_index_                        \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \
+                                  get_ros_,                                 \
+                                  get_is_cid_,                              \
+                                  get_cid_from_glyph_index_ )               \
+  void                                                                      \
+  FT_Init_Class_ ## class_( FT_Library          library,                    \
+                            FT_Service_CIDRec*  clazz )                     \
+  {                                                                         \
+    FT_UNUSED( library );                                                   \
+                                                                            \
+    clazz->get_ros                  = get_ros_;                             \
+    clazz->get_is_cid               = get_is_cid_;                          \
+    clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_;            \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVCID_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svgldict.h b/core/include/thirdparties/freetype/freetype/internal/services/svgldict.h
new file mode 100644
index 0000000..9956f74
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svgldict.h
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svgldict.h                                                             */
+/*                                                                         */
+/*    The FreeType glyph dictionary services (specification).              */
+/*                                                                         */
+/*  Copyright 2003, 2009, 2012 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVGLDICT_H__
+#define __SVGLDICT_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  A service used to retrieve glyph names, as well as to find the
+   *  index of a given glyph name in a font.
+   *
+   */
+
+#define FT_SERVICE_ID_GLYPH_DICT  "glyph-dict"
+
+
+  typedef FT_Error
+  (*FT_GlyphDict_GetNameFunc)( FT_Face     face,
+                               FT_UInt     glyph_index,
+                               FT_Pointer  buffer,
+                               FT_UInt     buffer_max );
+
+  typedef FT_UInt
+  (*FT_GlyphDict_NameIndexFunc)( FT_Face     face,
+                                 FT_String*  glyph_name );
+
+
+  FT_DEFINE_SERVICE( GlyphDict )
+  {
+    FT_GlyphDict_GetNameFunc    get_name;
+    FT_GlyphDict_NameIndexFunc  name_index;  /* optional */
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \
+                                        get_name_,                     \
+                                        name_index_)                   \
+  static const FT_Service_GlyphDictRec  class_ =                       \
+  {                                                                    \
+    get_name_, name_index_                                             \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \
+                                        get_name_,                     \
+                                        name_index_)                   \
+  void                                                                 \
+  FT_Init_Class_ ## class_( FT_Library                library,         \
+                            FT_Service_GlyphDictRec*  clazz )          \
+  {                                                                    \
+    FT_UNUSED( library );                                              \
+                                                                       \
+    clazz->get_name   = get_name_;                                     \
+    clazz->name_index = name_index_;                                   \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVGLDICT_H__ */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svgxval.h b/core/include/thirdparties/freetype/freetype/internal/services/svgxval.h
new file mode 100644
index 0000000..277b6a9
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svgxval.h
@@ -0,0 +1,72 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svgxval.h                                                              */
+/*                                                                         */
+/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */
+/*                                                                         */
+/*  Copyright 2004, 2005 by                                                */
+/*  Masatake YAMATO, Red Hat K.K.,                                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVGXVAL_H__
+#define __SVGXVAL_H__
+
+#include "../../ftgxval.h"
+#include "../ftvalid.h"
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_GX_VALIDATE           "truetypegx-validate"
+#define FT_SERVICE_ID_CLASSICKERN_VALIDATE  "classickern-validate"
+
+  typedef FT_Error
+  (*gxv_validate_func)( FT_Face   face,
+                        FT_UInt   gx_flags,
+                        FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
+                        FT_UInt   table_length );
+
+
+  typedef FT_Error
+  (*ckern_validate_func)( FT_Face   face,
+                          FT_UInt   ckern_flags,
+                          FT_Bytes  *ckern_table );
+
+
+  FT_DEFINE_SERVICE( GXvalidate )
+  {
+    gxv_validate_func  validate;
+  };
+
+  FT_DEFINE_SERVICE( CKERNvalidate )
+  {
+    ckern_validate_func  validate;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVGXVAL_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svkern.h b/core/include/thirdparties/freetype/freetype/internal/services/svkern.h
new file mode 100644
index 0000000..da03fef
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svkern.h
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svkern.h                                                               */
+/*                                                                         */
+/*    The FreeType Kerning service (specification).                        */
+/*                                                                         */
+/*  Copyright 2006 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVKERN_H__
+#define __SVKERN_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+#define FT_SERVICE_ID_KERNING  "kerning"
+
+
+  typedef FT_Error
+  (*FT_Kerning_TrackGetFunc)( FT_Face    face,
+                              FT_Fixed   point_size,
+                              FT_Int     degree,
+                              FT_Fixed*  akerning );
+
+  FT_DEFINE_SERVICE( Kerning )
+  {
+    FT_Kerning_TrackGetFunc  get_track;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVKERN_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svmm.h b/core/include/thirdparties/freetype/freetype/internal/services/svmm.h
new file mode 100644
index 0000000..100ff87
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svmm.h
@@ -0,0 +1,113 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svmm.h                                                                 */
+/*                                                                         */
+/*    The FreeType Multiple Masters and GX var services (specification).   */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2009, 2012 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVMM_H__
+#define __SVMM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  A service used to manage multiple-masters data in a given face.
+   *
+   *  See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H).
+   *
+   */
+
+#define FT_SERVICE_ID_MULTI_MASTERS  "multi-masters"
+
+
+  typedef FT_Error
+  (*FT_Get_MM_Func)( FT_Face           face,
+                     FT_Multi_Master*  master );
+
+  typedef FT_Error
+  (*FT_Get_MM_Var_Func)( FT_Face      face,
+                         FT_MM_Var*  *master );
+
+  typedef FT_Error
+  (*FT_Set_MM_Design_Func)( FT_Face   face,
+                            FT_UInt   num_coords,
+                            FT_Long*  coords );
+
+  typedef FT_Error
+  (*FT_Set_Var_Design_Func)( FT_Face    face,
+                             FT_UInt    num_coords,
+                             FT_Fixed*  coords );
+
+  typedef FT_Error
+  (*FT_Set_MM_Blend_Func)( FT_Face   face,
+                           FT_UInt   num_coords,
+                           FT_Long*  coords );
+
+
+  FT_DEFINE_SERVICE( MultiMasters )
+  {
+    FT_Get_MM_Func          get_mm;
+    FT_Set_MM_Design_Func   set_mm_design;
+    FT_Set_MM_Blend_Func    set_mm_blend;
+    FT_Get_MM_Var_Func      get_mm_var;
+    FT_Set_Var_Design_Func  set_var_design;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \
+                                           get_mm_,                         \
+                                           set_mm_design_,                  \
+                                           set_mm_blend_,                   \
+                                           get_mm_var_,                     \
+                                           set_var_design_ )                \
+  static const FT_Service_MultiMastersRec  class_ =                         \
+  {                                                                         \
+    get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_    \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \
+                                           get_mm_,                         \
+                                           set_mm_design_,                  \
+                                           set_mm_blend_,                   \
+                                           get_mm_var_,                     \
+                                           set_var_design_ )                \
+  void                                                                      \
+  FT_Init_Class_ ## class_( FT_Service_MultiMastersRec*  clazz )            \
+  {                                                                         \
+    clazz->get_mm         = get_mm_;                                        \
+    clazz->set_mm_design  = set_mm_design_;                                 \
+    clazz->set_mm_blend   = set_mm_blend_;                                  \
+    clazz->get_mm_var     = get_mm_var_;                                    \
+    clazz->set_var_design = set_var_design_;                                \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVMM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svotval.h b/core/include/thirdparties/freetype/freetype/internal/services/svotval.h
new file mode 100644
index 0000000..37cd34f
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svotval.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svotval.h                                                              */
+/*                                                                         */
+/*    The FreeType OpenType validation service (specification).            */
+/*                                                                         */
+/*  Copyright 2004, 2006 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVOTVAL_H__
+#define __SVOTVAL_H__
+
+#include "../../ftotval.h"
+#include "../ftvalid.h"
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_OPENTYPE_VALIDATE  "opentype-validate"
+
+
+  typedef FT_Error
+  (*otv_validate_func)( FT_Face volatile  face,
+                        FT_UInt           ot_flags,
+                        FT_Bytes         *base,
+                        FT_Bytes         *gdef,
+                        FT_Bytes         *gpos,
+                        FT_Bytes         *gsub,
+                        FT_Bytes         *jstf );
+
+
+  FT_DEFINE_SERVICE( OTvalidate )
+  {
+    otv_validate_func  validate;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVOTVAL_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svpfr.h b/core/include/thirdparties/freetype/freetype/internal/services/svpfr.h
new file mode 100644
index 0000000..21a00d3
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svpfr.h
@@ -0,0 +1,66 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svpfr.h                                                                */
+/*                                                                         */
+/*    Internal PFR service functions (specification).                      */
+/*                                                                         */
+/*  Copyright 2003, 2006 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPFR_H__
+#define __SVPFR_H__
+
+#include "../../ftpfr.h"
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_PFR_METRICS  "pfr-metrics"
+
+
+  typedef FT_Error
+  (*FT_PFR_GetMetricsFunc)( FT_Face    face,
+                            FT_UInt   *aoutline,
+                            FT_UInt   *ametrics,
+                            FT_Fixed  *ax_scale,
+                            FT_Fixed  *ay_scale );
+
+  typedef FT_Error
+  (*FT_PFR_GetKerningFunc)( FT_Face     face,
+                            FT_UInt     left,
+                            FT_UInt     right,
+                            FT_Vector  *avector );
+
+  typedef FT_Error
+  (*FT_PFR_GetAdvanceFunc)( FT_Face   face,
+                            FT_UInt   gindex,
+                            FT_Pos   *aadvance );
+
+
+  FT_DEFINE_SERVICE( PfrMetrics )
+  {
+    FT_PFR_GetMetricsFunc  get_metrics;
+    FT_PFR_GetKerningFunc  get_kerning;
+    FT_PFR_GetAdvanceFunc  get_advance;
+
+  };
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __SVPFR_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svpostnm.h b/core/include/thirdparties/freetype/freetype/internal/services/svpostnm.h
new file mode 100644
index 0000000..7fe8603
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svpostnm.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svpostnm.h                                                             */
+/*                                                                         */
+/*    The FreeType PostScript name services (specification).               */
+/*                                                                         */
+/*  Copyright 2003, 2007, 2009, 2012 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPOSTNM_H__
+#define __SVPOSTNM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+  /*
+   *  A trivial service used to retrieve the PostScript name of a given
+   *  font when available.  The `get_name' field should never be NULL.
+   *
+   *  The corresponding function can return NULL to indicate that the
+   *  PostScript name is not available.
+   *
+   *  The name is owned by the face and will be destroyed with it.
+   */
+
+#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME  "postscript-font-name"
+
+
+  typedef const char*
+  (*FT_PsName_GetFunc)( FT_Face  face );
+
+
+  FT_DEFINE_SERVICE( PsFontName )
+  {
+    FT_PsName_GetFunc  get_ps_font_name;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+  static const FT_Service_PsFontNameRec  class_ =                    \
+  {                                                                  \
+    get_ps_font_name_                                                \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+  void                                                               \
+  FT_Init_Class_ ## class_( FT_Library                 library,      \
+                            FT_Service_PsFontNameRec*  clazz )       \
+  {                                                                  \
+    FT_UNUSED( library );                                            \
+                                                                     \
+    clazz->get_ps_font_name = get_ps_font_name_;                     \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPOSTNM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svprop.h b/core/include/thirdparties/freetype/freetype/internal/services/svprop.h
new file mode 100644
index 0000000..22da0bb
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svprop.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svprop.h                                                               */
+/*                                                                         */
+/*    The FreeType property service (specification).                       */
+/*                                                                         */
+/*  Copyright 2012 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPROP_H__
+#define __SVPROP_H__
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_PROPERTIES  "properties"
+
+
+  typedef FT_Error
+  (*FT_Properties_SetFunc)( FT_Module    module,
+                            const char*  property_name,
+                            const void*  value );
+
+  typedef FT_Error
+  (*FT_Properties_GetFunc)( FT_Module    module,
+                            const char*  property_name,
+                            void*        value );
+
+
+  FT_DEFINE_SERVICE( Properties )
+  {
+    FT_Properties_SetFunc  set_property;
+    FT_Properties_GetFunc  get_property;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PROPERTIESREC( class_,          \
+                                         set_property_,   \
+                                         get_property_ )  \
+  static const FT_Service_PropertiesRec  class_ =         \
+  {                                                       \
+    set_property_,                                        \
+    get_property_                                         \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PROPERTIESREC( class_,                \
+                                         set_property_,         \
+                                         get_property_ )        \
+  void                                                          \
+  FT_Init_Class_ ## class_( FT_Service_PropertiesRec*  clazz )  \
+  {                                                             \
+    clazz->set_property = set_property_;                        \
+    clazz->get_property = get_property_;                        \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPROP_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svpscmap.h b/core/include/thirdparties/freetype/freetype/internal/services/svpscmap.h
new file mode 100644
index 0000000..592d14f
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svpscmap.h
@@ -0,0 +1,177 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svpscmap.h                                                             */
+/*                                                                         */
+/*    The FreeType PostScript charmap service (specification).             */
+/*                                                                         */
+/*  Copyright 2003, 2006, 2009, 2012 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPSCMAP_H__
+#define __SVPSCMAP_H__
+
+#include "../ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_POSTSCRIPT_CMAPS  "postscript-cmaps"
+
+
+  /*
+   *  Adobe glyph name to unicode value.
+   */
+  typedef FT_UInt32
+  (*PS_Unicode_ValueFunc)( const char*  glyph_name );
+
+  /*
+   *  Macintosh name id to glyph name.  NULL if invalid index.
+   */
+  typedef const char*
+  (*PS_Macintosh_NameFunc)( FT_UInt  name_index );
+
+  /*
+   *  Adobe standard string ID to glyph name.  NULL if invalid index.
+   */
+  typedef const char*
+  (*PS_Adobe_Std_StringsFunc)( FT_UInt  string_index );
+
+
+  /*
+   *  Simple unicode -> glyph index charmap built from font glyph names
+   *  table.
+   */
+  typedef struct  PS_UniMap_
+  {
+    FT_UInt32  unicode;      /* bit 31 set: is glyph variant */
+    FT_UInt    glyph_index;
+
+  } PS_UniMap;
+
+
+  typedef struct PS_UnicodesRec_*  PS_Unicodes;
+
+  typedef struct  PS_UnicodesRec_
+  {
+    FT_CMapRec  cmap;
+    FT_UInt     num_maps;
+    PS_UniMap*  maps;
+
+  } PS_UnicodesRec;
+
+
+  /*
+   *  A function which returns a glyph name for a given index.  Returns
+   *  NULL if invalid index.
+   */
+  typedef const char*
+  (*PS_GetGlyphNameFunc)( FT_Pointer  data,
+                          FT_UInt     string_index );
+
+  /*
+   *  A function used to release the glyph name returned by
+   *  PS_GetGlyphNameFunc, when needed
+   */
+  typedef void
+  (*PS_FreeGlyphNameFunc)( FT_Pointer  data,
+                           const char*  name );
+
+  typedef FT_Error
+  (*PS_Unicodes_InitFunc)( FT_Memory             memory,
+                           PS_Unicodes           unicodes,
+                           FT_UInt               num_glyphs,
+                           PS_GetGlyphNameFunc   get_glyph_name,
+                           PS_FreeGlyphNameFunc  free_glyph_name,
+                           FT_Pointer            glyph_data );
+
+  typedef FT_UInt
+  (*PS_Unicodes_CharIndexFunc)( PS_Unicodes  unicodes,
+                                FT_UInt32    unicode );
+
+  typedef FT_UInt32
+  (*PS_Unicodes_CharNextFunc)( PS_Unicodes  unicodes,
+                               FT_UInt32   *unicode );
+
+
+  FT_DEFINE_SERVICE( PsCMaps )
+  {
+    PS_Unicode_ValueFunc       unicode_value;
+
+    PS_Unicodes_InitFunc       unicodes_init;
+    PS_Unicodes_CharIndexFunc  unicodes_char_index;
+    PS_Unicodes_CharNextFunc   unicodes_char_next;
+
+    PS_Macintosh_NameFunc      macintosh_name;
+    PS_Adobe_Std_StringsFunc   adobe_std_strings;
+    const unsigned short*      adobe_std_encoding;
+    const unsigned short*      adobe_expert_encoding;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \
+                                      unicode_value_,                       \
+                                      unicodes_init_,                       \
+                                      unicodes_char_index_,                 \
+                                      unicodes_char_next_,                  \
+                                      macintosh_name_,                      \
+                                      adobe_std_strings_,                   \
+                                      adobe_std_encoding_,                  \
+                                      adobe_expert_encoding_ )              \
+  static const FT_Service_PsCMapsRec  class_ =                              \
+  {                                                                         \
+    unicode_value_, unicodes_init_,                                         \
+    unicodes_char_index_, unicodes_char_next_, macintosh_name_,             \
+    adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_         \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \
+                                      unicode_value_,                       \
+                                      unicodes_init_,                       \
+                                      unicodes_char_index_,                 \
+                                      unicodes_char_next_,                  \
+                                      macintosh_name_,                      \
+                                      adobe_std_strings_,                   \
+                                      adobe_std_encoding_,                  \
+                                      adobe_expert_encoding_ )              \
+  void                                                                      \
+  FT_Init_Class_ ## class_( FT_Library              library,                \
+                            FT_Service_PsCMapsRec*  clazz )                 \
+  {                                                                         \
+    FT_UNUSED( library );                                                   \
+                                                                            \
+    clazz->unicode_value         = unicode_value_;                          \
+    clazz->unicodes_init         = unicodes_init_;                          \
+    clazz->unicodes_char_index   = unicodes_char_index_;                    \
+    clazz->unicodes_char_next    = unicodes_char_next_;                     \
+    clazz->macintosh_name        = macintosh_name_;                         \
+    clazz->adobe_std_strings     = adobe_std_strings_;                      \
+    clazz->adobe_std_encoding    = adobe_std_encoding_;                     \
+    clazz->adobe_expert_encoding = adobe_expert_encoding_;                  \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPSCMAP_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svpsinfo.h b/core/include/thirdparties/freetype/freetype/internal/services/svpsinfo.h
new file mode 100644
index 0000000..fa3b303
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svpsinfo.h
@@ -0,0 +1,111 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svpsinfo.h                                                             */
+/*                                                                         */
+/*    The FreeType PostScript info service (specification).                */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2009, 2011, 2012 by                              */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPSINFO_H__
+#define __SVPSINFO_H__
+
+#include "../ftserv.h"
+#include "../t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_POSTSCRIPT_INFO  "postscript-info"
+
+
+  typedef FT_Error
+  (*PS_GetFontInfoFunc)( FT_Face          face,
+                         PS_FontInfoRec*  afont_info );
+
+  typedef FT_Error
+  (*PS_GetFontExtraFunc)( FT_Face           face,
+                          PS_FontExtraRec*  afont_extra );
+
+  typedef FT_Int
+  (*PS_HasGlyphNamesFunc)( FT_Face  face );
+
+  typedef FT_Error
+  (*PS_GetFontPrivateFunc)( FT_Face         face,
+                            PS_PrivateRec*  afont_private );
+
+  typedef FT_Long
+  (*PS_GetFontValueFunc)( FT_Face       face,
+                          PS_Dict_Keys  key,
+                          FT_UInt       idx,
+                          void         *value,
+                          FT_Long       value_len );
+
+
+  FT_DEFINE_SERVICE( PsInfo )
+  {
+    PS_GetFontInfoFunc     ps_get_font_info;
+    PS_GetFontExtraFunc    ps_get_font_extra;
+    PS_HasGlyphNamesFunc   ps_has_glyph_names;
+    PS_GetFontPrivateFunc  ps_get_font_private;
+    PS_GetFontValueFunc    ps_get_font_value;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \
+                                     get_font_info_,             \
+                                     ps_get_font_extra_,         \
+                                     has_glyph_names_,           \
+                                     get_font_private_,          \
+                                     get_font_value_ )           \
+  static const FT_Service_PsInfoRec  class_ =                    \
+  {                                                              \
+    get_font_info_, ps_get_font_extra_, has_glyph_names_,        \
+    get_font_private_, get_font_value_                           \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \
+                                     get_font_info_,             \
+                                     ps_get_font_extra_,         \
+                                     has_glyph_names_,           \
+                                     get_font_private_,          \
+                                     get_font_value_ )           \
+  void                                                           \
+  FT_Init_Class_ ## class_( FT_Library             library,      \
+                            FT_Service_PsInfoRec*  clazz )       \
+  {                                                              \
+    FT_UNUSED( library );                                        \
+                                                                 \
+    clazz->ps_get_font_info    = get_font_info_;                 \
+    clazz->ps_get_font_extra   = ps_get_font_extra_;             \
+    clazz->ps_has_glyph_names  = has_glyph_names_;               \
+    clazz->ps_get_font_private = get_font_private_;              \
+    clazz->ps_get_font_value   = get_font_value_;                \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPSINFO_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svsfnt.h b/core/include/thirdparties/freetype/freetype/internal/services/svsfnt.h
new file mode 100644
index 0000000..3425042
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svsfnt.h
@@ -0,0 +1,103 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svsfnt.h                                                               */
+/*                                                                         */
+/*    The FreeType SFNT table loading service (specification).             */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2009, 2012 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVSFNT_H__
+#define __SVSFNT_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  SFNT table loading service.
+   */
+
+#define FT_SERVICE_ID_SFNT_TABLE  "sfnt-table"
+
+
+  /*
+   * Used to implement FT_Load_Sfnt_Table().
+   */
+  typedef FT_Error
+  (*FT_SFNT_TableLoadFunc)( FT_Face    face,
+                            FT_ULong   tag,
+                            FT_Long    offset,
+                            FT_Byte*   buffer,
+                            FT_ULong*  length );
+
+  /*
+   * Used to implement FT_Get_Sfnt_Table().
+   */
+  typedef void*
+  (*FT_SFNT_TableGetFunc)( FT_Face      face,
+                           FT_Sfnt_Tag  tag );
+
+
+  /*
+   * Used to implement FT_Sfnt_Table_Info().
+   */
+  typedef FT_Error
+  (*FT_SFNT_TableInfoFunc)( FT_Face    face,
+                            FT_UInt    idx,
+                            FT_ULong  *tag,
+                            FT_ULong  *offset,
+                            FT_ULong  *length );
+
+
+  FT_DEFINE_SERVICE( SFNT_Table )
+  {
+    FT_SFNT_TableLoadFunc  load_table;
+    FT_SFNT_TableGetFunc   get_table;
+    FT_SFNT_TableInfoFunc  table_info;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ )  \
+  static const FT_Service_SFNT_TableRec  class_ =                      \
+  {                                                                    \
+    load_, get_, info_                                                 \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \
+  void                                                                \
+  FT_Init_Class_ ## class_( FT_Service_SFNT_TableRec*  clazz )        \
+  {                                                                   \
+    clazz->load_table = load_;                                        \
+    clazz->get_table  = get_;                                         \
+    clazz->table_info = info_;                                        \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVSFNT_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svttcmap.h b/core/include/thirdparties/freetype/freetype/internal/services/svttcmap.h
new file mode 100644
index 0000000..02542ab
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svttcmap.h
@@ -0,0 +1,107 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svttcmap.h                                                             */
+/*                                                                         */
+/*    The FreeType TrueType/sfnt cmap extra information service.           */
+/*                                                                         */
+/*  Copyright 2003 by                                                      */
+/*  Masatake YAMATO, Redhat K.K.                                           */
+/*                                                                         */
+/*  Copyright 2003, 2008, 2009, 2012 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/* Development of this service is support of
+   Information-technology Promotion Agency, Japan. */
+
+#ifndef __SVTTCMAP_H__
+#define __SVTTCMAP_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_TT_CMAP  "tt-cmaps"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_CMapInfo                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to store TrueType/sfnt specific cmap information  */
+  /*    which is not covered by the generic @FT_CharMap structure.  This   */
+  /*    structure can be accessed with the @FT_Get_TT_CMap_Info function.  */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    language ::                                                        */
+  /*      The language ID used in Mac fonts.  Definitions of values are in */
+  /*      freetype/ttnameid.h.                                             */
+  /*                                                                       */
+  /*    format ::                                                          */
+  /*      The cmap format.  OpenType 1.5 defines the formats 0 (byte       */
+  /*      encoding table), 2~(high-byte mapping through table), 4~(segment */
+  /*      mapping to delta values), 6~(trimmed table mapping), 8~(mixed    */
+  /*      16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented   */
+  /*      coverage), and 14 (Unicode Variation Sequences).                 */
+  /*                                                                       */
+  typedef struct  TT_CMapInfo_
+  {
+    FT_ULong  language;
+    FT_Long   format;
+
+  } TT_CMapInfo;
+
+
+  typedef FT_Error
+  (*TT_CMap_Info_GetFunc)( FT_CharMap    charmap,
+                           TT_CMapInfo  *cmap_info );
+
+
+  FT_DEFINE_SERVICE( TTCMaps )
+  {
+    TT_CMap_Info_GetFunc  get_cmap_info;
+  };
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \
+  static const FT_Service_TTCMapsRec  class_ =                  \
+  {                                                             \
+    get_cmap_info_                                              \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \
+  void                                                          \
+  FT_Init_Class_ ## class_( FT_Library              library,    \
+                            FT_Service_TTCMapsRec*  clazz )     \
+  {                                                             \
+    FT_UNUSED( library );                                       \
+                                                                \
+    clazz->get_cmap_info = get_cmap_info_;                      \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVTTCMAP_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svtteng.h b/core/include/thirdparties/freetype/freetype/internal/services/svtteng.h
new file mode 100644
index 0000000..e567efb
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svtteng.h
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svtteng.h                                                              */
+/*                                                                         */
+/*    The FreeType TrueType engine query service (specification).          */
+/*                                                                         */
+/*  Copyright 2006 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVTTENG_H__
+#define __SVTTENG_H__
+
+#include "../ftserv.h"
+#include "../../ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  SFNT table loading service.
+   */
+
+#define FT_SERVICE_ID_TRUETYPE_ENGINE  "truetype-engine"
+
+  /*
+   * Used to implement FT_Get_TrueType_Engine_Type
+   */
+
+  FT_DEFINE_SERVICE( TrueTypeEngine )
+  {
+    FT_TrueTypeEngineType  engine_type;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVTTENG_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svttglyf.h b/core/include/thirdparties/freetype/freetype/internal/services/svttglyf.h
new file mode 100644
index 0000000..d8824fb
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svttglyf.h
@@ -0,0 +1,68 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svttglyf.h                                                             */
+/*                                                                         */
+/*    The FreeType TrueType glyph service.                                 */
+/*                                                                         */
+/*  Copyright 2007, 2009, 2012 by David Turner.                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#ifndef __SVTTGLYF_H__
+#define __SVTTGLYF_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_TT_GLYF  "tt-glyf"
+
+
+  typedef FT_ULong
+  (*TT_Glyf_GetLocationFunc)( FT_Face    face,
+                              FT_UInt    gindex,
+                              FT_ULong  *psize );
+
+  FT_DEFINE_SERVICE( TTGlyf )
+  {
+    TT_Glyf_GetLocationFunc  get_location;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \
+  static const FT_Service_TTGlyfRec  class_ =                 \
+  {                                                           \
+    get_location_                                             \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \
+  void                                                        \
+  FT_Init_Class_ ## class_( FT_Service_TTGlyfRec*  clazz )    \
+  {                                                           \
+    clazz->get_location = get_location_;                      \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVTTGLYF_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svwinfnt.h b/core/include/thirdparties/freetype/freetype/internal/services/svwinfnt.h
new file mode 100644
index 0000000..013a991
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svwinfnt.h
@@ -0,0 +1,50 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svwinfnt.h                                                             */
+/*                                                                         */
+/*    The FreeType Windows FNT/FONT service (specification).               */
+/*                                                                         */
+/*  Copyright 2003 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVWINFNT_H__
+#define __SVWINFNT_H__
+
+#include "../ftserv.h"
+#include "../../ftwinfnt.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_WINFNT  "winfonts"
+
+  typedef FT_Error
+  (*FT_WinFnt_GetHeaderFunc)( FT_Face               face,
+                              FT_WinFNT_HeaderRec  *aheader );
+
+
+  FT_DEFINE_SERVICE( WinFnt )
+  {
+    FT_WinFnt_GetHeaderFunc  get_header;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVWINFNT_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svxf86nm.h b/core/include/thirdparties/freetype/freetype/internal/services/svxf86nm.h
new file mode 100644
index 0000000..571f63d
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svxf86nm.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svxf86nm.h                                                             */
+/*                                                                         */
+/*    The FreeType XFree86 services (specification only).                  */
+/*                                                                         */
+/*  Copyright 2003 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVXF86NM_H__
+#define __SVXF86NM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  A trivial service used to return the name of a face's font driver,
+   *  according to the XFree86 nomenclature.  Note that the service data
+   *  is a simple constant string pointer.
+   */
+
+#define FT_SERVICE_ID_XF86_NAME  "xf86-driver-name"
+
+#define FT_XF86_FORMAT_TRUETYPE  "TrueType"
+#define FT_XF86_FORMAT_TYPE_1    "Type 1"
+#define FT_XF86_FORMAT_BDF       "BDF"
+#define FT_XF86_FORMAT_PCF       "PCF"
+#define FT_XF86_FORMAT_TYPE_42   "Type 42"
+#define FT_XF86_FORMAT_CID       "CID Type 1"
+#define FT_XF86_FORMAT_CFF       "CFF"
+#define FT_XF86_FORMAT_PFR       "PFR"
+#define FT_XF86_FORMAT_WINFNT    "Windows FNT"
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVXF86NM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/sfnt.h b/core/include/thirdparties/freetype/freetype/internal/sfnt.h
new file mode 100644
index 0000000..2759ba3
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/sfnt.h
@@ -0,0 +1,707 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfnt.h                                                                 */
+/*                                                                         */
+/*    High-level `sfnt' driver interface (specification).                  */
+/*                                                                         */
+/*  Copyright 1996-2006, 2009, 2012-2013 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SFNT_H__
+#define __SFNT_H__
+
+
+#include "../../ft2build.h"
+#include "ftdriver.h"
+#include "tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Init_Face_Func                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    First part of the SFNT face object initialization.  This finds     */
+  /*    the face in a SFNT file or collection, and load its format tag in  */
+  /*    face->format_tag.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     :: The input stream.                                    */
+  /*                                                                       */
+  /*    face       :: A handle to the target face object.                  */
+  /*                                                                       */
+  /*    face_index :: The index of the TrueType font, if we are opening a  */
+  /*                  collection.                                          */
+  /*                                                                       */
+  /*    num_params :: The number of additional parameters.                 */
+  /*                                                                       */
+  /*    params     :: Optional additional parameters.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be at the font file's origin.               */
+  /*                                                                       */
+  /*    This function recognizes fonts embedded in a `TrueType             */
+  /*    collection'.                                                       */
+  /*                                                                       */
+  /*    Once the format tag has been validated by the font driver, it      */
+  /*    should then call the TT_Load_Face_Func() callback to read the rest */
+  /*    of the SFNT tables in the object.                                  */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Init_Face_Func)( FT_Stream      stream,
+                        TT_Face        face,
+                        FT_Int         face_index,
+                        FT_Int         num_params,
+                        FT_Parameter*  params );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Face_Func                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Second part of the SFNT face object initialization.  This loads    */
+  /*    the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the    */
+  /*    face object.                                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     :: The input stream.                                    */
+  /*                                                                       */
+  /*    face       :: A handle to the target face object.                  */
+  /*                                                                       */
+  /*    face_index :: The index of the TrueType font, if we are opening a  */
+  /*                  collection.                                          */
+  /*                                                                       */
+  /*    num_params :: The number of additional parameters.                 */
+  /*                                                                       */
+  /*    params     :: Optional additional parameters.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function must be called after TT_Init_Face_Func().            */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Face_Func)( FT_Stream      stream,
+                        TT_Face        face,
+                        FT_Int         face_index,
+                        FT_Int         num_params,
+                        FT_Parameter*  params );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Done_Face_Func                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A callback used to delete the common SFNT data from a face.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the target face object.                        */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function does NOT destroy the face object.                    */
+  /*                                                                       */
+  typedef void
+  (*TT_Done_Face_Func)( TT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Any_Func                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load any font table into client memory.                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: The face object to look for.                             */
+  /*                                                                       */
+  /*    tag    :: The tag of table to load.  Use the value 0 if you want   */
+  /*              to access the whole font file, else set this parameter   */
+  /*              to a valid TrueType table tag that you can forge with    */
+  /*              the MAKE_TT_TAG macro.                                   */
+  /*                                                                       */
+  /*    offset :: The starting offset in the table (or the file if         */
+  /*              tag == 0).                                               */
+  /*                                                                       */
+  /*    length :: The address of the decision variable:                    */
+  /*                                                                       */
+  /*                If length == NULL:                                     */
+  /*                  Loads the whole table.  Returns an error if          */
+  /*                  `offset' == 0!                                       */
+  /*                                                                       */
+  /*                If *length == 0:                                       */
+  /*                  Exits immediately; returning the length of the given */
+  /*                  table or of the font file, depending on the value of */
+  /*                  `tag'.                                               */
+  /*                                                                       */
+  /*                If *length != 0:                                       */
+  /*                  Loads the next `length' bytes of table or font,      */
+  /*                  starting at offset `offset' (in table or font too).  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    buffer :: The address of target buffer.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    TrueType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Any_Func)( TT_Face    face,
+                       FT_ULong   tag,
+                       FT_Long    offset,
+                       FT_Byte   *buffer,
+                       FT_ULong*  length );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Find_SBit_Image_Func                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Check whether an embedded bitmap (an `sbit') exists for a given    */
+  /*    glyph, at a given strike.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face          :: The target face object.                           */
+  /*                                                                       */
+  /*    glyph_index   :: The glyph index.                                  */
+  /*                                                                       */
+  /*    strike_index  :: The current strike index.                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    arange        :: The SBit range containing the glyph index.        */
+  /*                                                                       */
+  /*    astrike       :: The SBit strike containing the glyph index.       */
+  /*                                                                       */
+  /*    aglyph_offset :: The offset of the glyph data in `EBDT' table.     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns                    */
+  /*    SFNT_Err_Invalid_Argument if no sbit exists for the requested      */
+  /*    glyph.                                                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Find_SBit_Image_Func)( TT_Face          face,
+                              FT_UInt          glyph_index,
+                              FT_ULong         strike_index,
+                              TT_SBit_Range   *arange,
+                              TT_SBit_Strike  *astrike,
+                              FT_ULong        *aglyph_offset );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_SBit_Metrics_Func                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the big metrics for a given embedded bitmap.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream      :: The input stream.                                   */
+  /*                                                                       */
+  /*    range       :: The SBit range containing the glyph.                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    big_metrics :: A big SBit metrics structure for the glyph.         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be positioned at the glyph's offset within  */
+  /*    the `EBDT' table before the call.                                  */
+  /*                                                                       */
+  /*    If the image format uses variable metrics, the stream cursor is    */
+  /*    positioned just after the metrics header in the `EBDT' table on    */
+  /*    function exit.                                                     */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_SBit_Metrics_Func)( FT_Stream        stream,
+                                TT_SBit_Range    range,
+                                TT_SBit_Metrics  metrics );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_SBit_Image_Func                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load a given glyph sbit image from the font resource.  This also   */
+  /*    returns its metrics.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      The target face object.                                          */
+  /*                                                                       */
+  /*    strike_index ::                                                    */
+  /*      The strike index.                                                */
+  /*                                                                       */
+  /*    glyph_index ::                                                     */
+  /*      The current glyph index.                                         */
+  /*                                                                       */
+  /*    load_flags ::                                                      */
+  /*      The current load flags.                                          */
+  /*                                                                       */
+  /*    stream ::                                                          */
+  /*      The input stream.                                                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amap ::                                                            */
+  /*      The target pixmap.                                               */
+  /*                                                                       */
+  /*    ametrics ::                                                        */
+  /*      A big sbit metrics structure for the glyph image.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns an error if no     */
+  /*    glyph sbit exists for the index.                                   */
+  /*                                                                       */
+  /*  <Note>                                                               */
+  /*    The `map.buffer' field is always freed before the glyph is loaded. */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_SBit_Image_Func)( TT_Face              face,
+                              FT_ULong             strike_index,
+                              FT_UInt              glyph_index,
+                              FT_UInt              load_flags,
+                              FT_Stream            stream,
+                              FT_Bitmap           *amap,
+                              TT_SBit_MetricsRec  *ametrics );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Set_SBit_Strike_Func                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Select an sbit strike for a given size request.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face          :: The target face object.                           */
+  /*                                                                       */
+  /*    req           :: The size request.                                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    astrike_index :: The index of the sbit strike.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns an error if no     */
+  /*    sbit strike exists for the selected ppem values.                   */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Set_SBit_Strike_Func)( TT_Face          face,
+                              FT_Size_Request  req,
+                              FT_ULong*        astrike_index );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Strike_Metrics_Func                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the metrics of a given strike.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face          :: The target face object.                           */
+  /*                                                                       */
+  /*    strike_index  :: The strike index.                                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    metrics       :: the metrics of the strike.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns an error if no     */
+  /*    such sbit strike exists.                                           */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Strike_Metrics_Func)( TT_Face           face,
+                                  FT_ULong          strike_index,
+                                  FT_Size_Metrics*  metrics );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Get_PS_Name_Func                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the PostScript glyph name of a glyph.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    idx  :: The glyph index.                                           */
+  /*                                                                       */
+  /*    PSname :: The address of a string pointer.  Will be NULL in case   */
+  /*              of error, otherwise it is a pointer to the glyph name.   */
+  /*                                                                       */
+  /*              You must not modify the returned string!                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Get_PS_Name_Func)( TT_Face      face,
+                          FT_UInt      idx,
+                          FT_String**  PSname );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Metrics_Func                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load a metrics table, which is a table with a horizontal and a     */
+  /*    vertical version.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the target face object.                    */
+  /*                                                                       */
+  /*    stream   :: The input stream.                                      */
+  /*                                                                       */
+  /*    vertical :: A boolean flag.  If set, load the vertical one.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Metrics_Func)( TT_Face    face,
+                           FT_Stream  stream,
+                           FT_Bool    vertical );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Get_Metrics_Func                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the horizontal or vertical header in a face object.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the target face object.                    */
+  /*                                                                       */
+  /*    stream   :: The input stream.                                      */
+  /*                                                                       */
+  /*    vertical :: A boolean flag.  If set, load vertical metrics.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Get_Metrics_Func)( TT_Face     face,
+                          FT_Bool     vertical,
+                          FT_UInt     gindex,
+                          FT_Short*   abearing,
+                          FT_UShort*  aadvance );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Table_Func                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load a given TrueType table.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The function uses `face->goto_table' to seek the stream to the     */
+  /*    start of the table, except while loading the font directory.       */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Table_Func)( TT_Face    face,
+                         FT_Stream  stream );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Free_Table_Func                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Free a given TrueType table.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the target face object.                        */
+  /*                                                                       */
+  typedef void
+  (*TT_Free_Table_Func)( TT_Face  face );
+
+
+  /*
+   * @functype:
+   *    TT_Face_GetKerningFunc
+   *
+   * @description:
+   *    Return the horizontal kerning value between two glyphs.
+   *
+   * @input:
+   *    face        :: A handle to the source face object.
+   *    left_glyph  :: The left glyph index.
+   *    right_glyph :: The right glyph index.
+   *
+   * @return:
+   *    The kerning value in font units.
+   */
+  typedef FT_Int
+  (*TT_Face_GetKerningFunc)( TT_Face  face,
+                             FT_UInt  left_glyph,
+                             FT_UInt  right_glyph );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    SFNT_Interface                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure holds pointers to the functions used to load and    */
+  /*    free the basic tables that are required in a `sfnt' font file.     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    Check the various xxx_Func() descriptions for details.             */
+  /*                                                                       */
+  typedef struct  SFNT_Interface_
+  {
+    TT_Loader_GotoTableFunc      goto_table;
+
+    TT_Init_Face_Func            init_face;
+    TT_Load_Face_Func            load_face;
+    TT_Done_Face_Func            done_face;
+    FT_Module_Requester          get_interface;
+
+    TT_Load_Any_Func             load_any;
+
+    /* these functions are called by `load_face' but they can also  */
+    /* be called from external modules, if there is a need to do so */
+    TT_Load_Table_Func           load_head;
+    TT_Load_Metrics_Func         load_hhea;
+    TT_Load_Table_Func           load_cmap;
+    TT_Load_Table_Func           load_maxp;
+    TT_Load_Table_Func           load_os2;
+    TT_Load_Table_Func           load_post;
+
+    TT_Load_Table_Func           load_name;
+    TT_Free_Table_Func           free_name;
+
+    /* this field was called `load_kerning' up to version 2.1.10 */
+    TT_Load_Table_Func           load_kern;
+
+    TT_Load_Table_Func           load_gasp;
+    TT_Load_Table_Func           load_pclt;
+
+    /* see `ttload.h'; this field was called `load_bitmap_header' up to */
+    /* version 2.1.10                                                   */
+    TT_Load_Table_Func           load_bhed;
+
+    TT_Load_SBit_Image_Func      load_sbit_image;
+
+    /* see `ttpost.h' */
+    TT_Get_PS_Name_Func          get_psname;
+    TT_Free_Table_Func           free_psnames;
+
+    /* starting here, the structure differs from version 2.1.7 */
+
+    /* this field was introduced in version 2.1.8, named `get_psname' */
+    TT_Face_GetKerningFunc       get_kerning;
+
+    /* new elements introduced after version 2.1.10 */
+
+    /* load the font directory, i.e., the offset table and */
+    /* the table directory                                 */
+    TT_Load_Table_Func           load_font_dir;
+    TT_Load_Metrics_Func         load_hmtx;
+
+    TT_Load_Table_Func           load_eblc;
+    TT_Free_Table_Func           free_eblc;
+
+    TT_Set_SBit_Strike_Func      set_sbit_strike;
+    TT_Load_Strike_Metrics_Func  load_strike_metrics;
+
+    TT_Get_Metrics_Func          get_metrics;
+
+  } SFNT_Interface;
+
+
+  /* transitional */
+  typedef SFNT_Interface*   SFNT_Service;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SFNT_INTERFACE(        \
+          class_,                        \
+          goto_table_,                   \
+          init_face_,                    \
+          load_face_,                    \
+          done_face_,                    \
+          get_interface_,                \
+          load_any_,                     \
+          load_head_,                    \
+          load_hhea_,                    \
+          load_cmap_,                    \
+          load_maxp_,                    \
+          load_os2_,                     \
+          load_post_,                    \
+          load_name_,                    \
+          free_name_,                    \
+          load_kern_,                    \
+          load_gasp_,                    \
+          load_pclt_,                    \
+          load_bhed_,                    \
+          load_sbit_image_,              \
+          get_psname_,                   \
+          free_psnames_,                 \
+          get_kerning_,                  \
+          load_font_dir_,                \
+          load_hmtx_,                    \
+          load_eblc_,                    \
+          free_eblc_,                    \
+          set_sbit_strike_,              \
+          load_strike_metrics_,          \
+          get_metrics_ )                 \
+  static const SFNT_Interface  class_ =  \
+  {                                      \
+    goto_table_,                         \
+    init_face_,                          \
+    load_face_,                          \
+    done_face_,                          \
+    get_interface_,                      \
+    load_any_,                           \
+    load_head_,                          \
+    load_hhea_,                          \
+    load_cmap_,                          \
+    load_maxp_,                          \
+    load_os2_,                           \
+    load_post_,                          \
+    load_name_,                          \
+    free_name_,                          \
+    load_kern_,                          \
+    load_gasp_,                          \
+    load_pclt_,                          \
+    load_bhed_,                          \
+    load_sbit_image_,                    \
+    get_psname_,                         \
+    free_psnames_,                       \
+    get_kerning_,                        \
+    load_font_dir_,                      \
+    load_hmtx_,                          \
+    load_eblc_,                          \
+    free_eblc_,                          \
+    set_sbit_strike_,                    \
+    load_strike_metrics_,                \
+    get_metrics_,                        \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_INTERNAL( a, a_ )  \
+          clazz->a = a_;
+
+#define FT_DEFINE_SFNT_INTERFACE(                       \
+          class_,                                       \
+          goto_table_,                                  \
+          init_face_,                                   \
+          load_face_,                                   \
+          done_face_,                                   \
+          get_interface_,                               \
+          load_any_,                                    \
+          load_head_,                                   \
+          load_hhea_,                                   \
+          load_cmap_,                                   \
+          load_maxp_,                                   \
+          load_os2_,                                    \
+          load_post_,                                   \
+          load_name_,                                   \
+          free_name_,                                   \
+          load_kern_,                                   \
+          load_gasp_,                                   \
+          load_pclt_,                                   \
+          load_bhed_,                                   \
+          load_sbit_image_,                             \
+          get_psname_,                                  \
+          free_psnames_,                                \
+          get_kerning_,                                 \
+          load_font_dir_,                               \
+          load_hmtx_,                                   \
+          load_eblc_,                                   \
+          free_eblc_,                                   \
+          set_sbit_strike_,                             \
+          load_strike_metrics_,                         \
+          get_metrics_ )                                \
+  void                                                  \
+  FT_Init_Class_ ## class_( FT_Library       library,   \
+                            SFNT_Interface*  clazz )    \
+  {                                                     \
+    FT_UNUSED( library );                               \
+                                                        \
+    clazz->goto_table          = goto_table_;           \
+    clazz->init_face           = init_face_;            \
+    clazz->load_face           = load_face_;            \
+    clazz->done_face           = done_face_;            \
+    clazz->get_interface       = get_interface_;        \
+    clazz->load_any            = load_any_;             \
+    clazz->load_head           = load_head_;            \
+    clazz->load_hhea           = load_hhea_;            \
+    clazz->load_cmap           = load_cmap_;            \
+    clazz->load_maxp           = load_maxp_;            \
+    clazz->load_os2            = load_os2_;             \
+    clazz->load_post           = load_post_;            \
+    clazz->load_name           = load_name_;            \
+    clazz->free_name           = free_name_;            \
+    clazz->load_kern           = load_kern_;            \
+    clazz->load_gasp           = load_gasp_;            \
+    clazz->load_pclt           = load_pclt_;            \
+    clazz->load_bhed           = load_bhed_;            \
+    clazz->load_sbit_image     = load_sbit_image_;      \
+    clazz->get_psname          = get_psname_;           \
+    clazz->free_psnames        = free_psnames_;         \
+    clazz->get_kerning         = get_kerning_;          \
+    clazz->load_font_dir       = load_font_dir_;        \
+    clazz->load_hmtx           = load_hmtx_;            \
+    clazz->load_eblc           = load_eblc_;            \
+    clazz->free_eblc           = free_eblc_;            \
+    clazz->set_sbit_strike     = set_sbit_strike_;      \
+    clazz->load_strike_metrics = load_strike_metrics_;  \
+    clazz->get_metrics         = get_metrics_;          \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __SFNT_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/t1types.h b/core/include/thirdparties/freetype/freetype/internal/t1types.h
new file mode 100644
index 0000000..36deec8
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/t1types.h
@@ -0,0 +1,255 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1types.h                                                              */
+/*                                                                         */
+/*    Basic Type1/Type2 type definitions and interface (specification      */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by                   */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1TYPES_H__
+#define __T1TYPES_H__
+
+
+#include "../../ft2build.h"
+#include "../t1tables.h"
+#include "pshints.h"
+#include "ftserv.h"
+#include "services/svpscmap.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***              REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS              ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    T1_EncodingRec                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling a custom encoding.                            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_chars  :: The number of character codes in the encoding.       */
+  /*                  Usually 256.                                         */
+  /*                                                                       */
+  /*    code_first :: The lowest valid character code in the encoding.     */
+  /*                                                                       */
+  /*    code_last  :: The highest valid character code in the encoding     */
+  /*                  + 1. When equal to code_first there are no valid     */
+  /*                  character codes.                                     */
+  /*                                                                       */
+  /*    char_index :: An array of corresponding glyph indices.             */
+  /*                                                                       */
+  /*    char_name  :: An array of corresponding glyph names.               */
+  /*                                                                       */
+  typedef struct  T1_EncodingRecRec_
+  {
+    FT_Int       num_chars;
+    FT_Int       code_first;
+    FT_Int       code_last;
+
+    FT_UShort*   char_index;
+    FT_String**  char_name;
+
+  } T1_EncodingRec, *T1_Encoding;
+
+
+  /* used to hold extra data of PS_FontInfoRec that
+   * cannot be stored in the publicly defined structure.
+   *
+   * Note these can't be blended with multiple-masters.
+   */
+  typedef struct  PS_FontExtraRec_
+  {
+    FT_UShort  fs_type;
+
+  } PS_FontExtraRec;
+
+
+  typedef struct  T1_FontRec_
+  {
+    PS_FontInfoRec   font_info;         /* font info dictionary   */
+    PS_FontExtraRec  font_extra;        /* font info extra fields */
+    PS_PrivateRec    private_dict;      /* private dictionary     */
+    FT_String*       font_name;         /* top-level dictionary   */
+
+    T1_EncodingType  encoding_type;
+    T1_EncodingRec   encoding;
+
+    FT_Byte*         subrs_block;
+    FT_Byte*         charstrings_block;
+    FT_Byte*         glyph_names_block;
+
+    FT_Int           num_subrs;
+    FT_Byte**        subrs;
+    FT_PtrDist*      subrs_len;
+
+    FT_Int           num_glyphs;
+    FT_String**      glyph_names;       /* array of glyph names       */
+    FT_Byte**        charstrings;       /* array of glyph charstrings */
+    FT_PtrDist*      charstrings_len;
+
+    FT_Byte          paint_type;
+    FT_Byte          font_type;
+    FT_Matrix        font_matrix;
+    FT_Vector        font_offset;
+    FT_BBox          font_bbox;
+    FT_Long          font_id;
+
+    FT_Fixed         stroke_width;
+
+  } T1_FontRec, *T1_Font;
+
+
+  typedef struct  CID_SubrsRec_
+  {
+    FT_UInt    num_subrs;
+    FT_Byte**  code;
+
+  } CID_SubrsRec, *CID_Subrs;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                AFM FONT INFORMATION STRUCTURES                    ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  AFM_TrackKernRec_
+  {
+    FT_Int    degree;
+    FT_Fixed  min_ptsize;
+    FT_Fixed  min_kern;
+    FT_Fixed  max_ptsize;
+    FT_Fixed  max_kern;
+
+  } AFM_TrackKernRec, *AFM_TrackKern;
+
+  typedef struct  AFM_KernPairRec_
+  {
+    FT_Int  index1;
+    FT_Int  index2;
+    FT_Int  x;
+    FT_Int  y;
+
+  } AFM_KernPairRec, *AFM_KernPair;
+
+  typedef struct  AFM_FontInfoRec_
+  {
+    FT_Bool        IsCIDFont;
+    FT_BBox        FontBBox;
+    FT_Fixed       Ascender;
+    FT_Fixed       Descender;
+    AFM_TrackKern  TrackKerns;   /* free if non-NULL */
+    FT_Int         NumTrackKern;
+    AFM_KernPair   KernPairs;    /* free if non-NULL */
+    FT_Int         NumKernPair;
+
+  } AFM_FontInfoRec, *AFM_FontInfo;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                ORIGINAL T1_FACE CLASS DEFINITION                  ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct T1_FaceRec_*   T1_Face;
+  typedef struct CID_FaceRec_*  CID_Face;
+
+
+  typedef struct  T1_FaceRec_
+  {
+    FT_FaceRec      root;
+    T1_FontRec      type1;
+    const void*     psnames;
+    const void*     psaux;
+    const void*     afm_data;
+    FT_CharMapRec   charmaprecs[2];
+    FT_CharMap      charmaps[2];
+
+    /* support for Multiple Masters fonts */
+    PS_Blend        blend;
+
+    /* undocumented, optional: indices of subroutines that express      */
+    /* the NormalizeDesignVector and the ConvertDesignVector procedure, */
+    /* respectively, as Type 2 charstrings; -1 if keywords not present  */
+    FT_Int           ndv_idx;
+    FT_Int           cdv_idx;
+
+    /* undocumented, optional: has the same meaning as len_buildchar */
+    /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25    */
+    FT_UInt          len_buildchar;
+    FT_Long*         buildchar;
+
+    /* since version 2.1 - interface to PostScript hinter */
+    const void*     pshinter;
+
+  } T1_FaceRec;
+
+
+  typedef struct  CID_FaceRec_
+  {
+    FT_FaceRec       root;
+    void*            psnames;
+    void*            psaux;
+    CID_FaceInfoRec  cid;
+    PS_FontExtraRec  font_extra;
+#if 0
+    void*            afm_data;
+#endif
+    CID_Subrs        subrs;
+
+    /* since version 2.1 - interface to PostScript hinter */
+    void*            pshinter;
+
+    /* since version 2.1.8, but was originally positioned after `afm_data' */
+    FT_Byte*         binary_data; /* used if hex data has been converted */
+    FT_Stream        cid_stream;
+
+  } CID_FaceRec;
+
+
+FT_END_HEADER
+
+#endif /* __T1TYPES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/tttypes.h b/core/include/thirdparties/freetype/freetype/internal/tttypes.h
new file mode 100644
index 0000000..d6c1d62
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/tttypes.h
@@ -0,0 +1,1440 @@
+/***************************************************************************/
+/*                                                                         */
+/*  tttypes.h                                                              */
+/*                                                                         */
+/*    Basic SFNT/TrueType type definitions and interface (specification    */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004-2008, 2012-2013 by                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTTYPES_H__
+#define __TTTYPES_H__
+
+
+#include "../../ft2build.h"
+#include "../tttables.h"
+#include "ftobjs.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "../ftmm.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***             REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TTC_HeaderRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    TrueType collection header.  This table contains the offsets of    */
+  /*    the font headers of each distinct TrueType face in the file.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    tag     :: Must be `ttc ' to indicate a TrueType collection.       */
+  /*                                                                       */
+  /*    version :: The version number.                                     */
+  /*                                                                       */
+  /*    count   :: The number of faces in the collection.  The             */
+  /*               specification says this should be an unsigned long, but */
+  /*               we use a signed long since we need the value -1 for     */
+  /*               specific purposes.                                      */
+  /*                                                                       */
+  /*    offsets :: The offsets of the font headers, one per face.          */
+  /*                                                                       */
+  typedef struct  TTC_HeaderRec_
+  {
+    FT_ULong   tag;
+    FT_Fixed   version;
+    FT_Long    count;
+    FT_ULong*  offsets;
+
+  } TTC_HeaderRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    SFNT_HeaderRec                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    SFNT file format header.                                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    format_tag     :: The font format tag.                             */
+  /*                                                                       */
+  /*    num_tables     :: The number of tables in file.                    */
+  /*                                                                       */
+  /*    search_range   :: Must be `16 * (max power of 2 <= num_tables)'.   */
+  /*                                                                       */
+  /*    entry_selector :: Must be log2 of `search_range / 16'.             */
+  /*                                                                       */
+  /*    range_shift    :: Must be `num_tables * 16 - search_range'.        */
+  /*                                                                       */
+  typedef struct  SFNT_HeaderRec_
+  {
+    FT_ULong   format_tag;
+    FT_UShort  num_tables;
+    FT_UShort  search_range;
+    FT_UShort  entry_selector;
+    FT_UShort  range_shift;
+
+    FT_ULong   offset;  /* not in file */
+
+  } SFNT_HeaderRec, *SFNT_Header;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_TableRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure describes a given table of a TrueType font.         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    Tag      :: A four-bytes tag describing the table.                 */
+  /*                                                                       */
+  /*    CheckSum :: The table checksum.  This value can be ignored.        */
+  /*                                                                       */
+  /*    Offset   :: The offset of the table from the start of the TrueType */
+  /*                font in its resource.                                  */
+  /*                                                                       */
+  /*    Length   :: The table length (in bytes).                           */
+  /*                                                                       */
+  typedef struct  TT_TableRec_
+  {
+    FT_ULong  Tag;        /*        table type */
+    FT_ULong  CheckSum;   /*    table checksum */
+    FT_ULong  Offset;     /* table file offset */
+    FT_ULong  Length;     /*      table length */
+
+  } TT_TableRec, *TT_Table;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_LongMetricsRec                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling the long metrics of the `hmtx' and `vmtx'     */
+  /*    TrueType tables.  The values are expressed in font units.          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    advance :: The advance width or height for the glyph.              */
+  /*                                                                       */
+  /*    bearing :: The left-side or top-side bearing for the glyph.        */
+  /*                                                                       */
+  typedef struct  TT_LongMetricsRec_
+  {
+    FT_UShort  advance;
+    FT_Short   bearing;
+
+  } TT_LongMetricsRec, *TT_LongMetrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_ShortMetrics                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple type to model the short metrics of the `hmtx' and `vmtx'  */
+  /*    tables.                                                            */
+  /*                                                                       */
+  typedef FT_Short  TT_ShortMetrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_NameEntryRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling TrueType name records.  Name records are used */
+  /*    to store important strings like family name, style name,           */
+  /*    copyright, etc. in _localized_ versions (i.e., language, encoding, */
+  /*    etc).                                                              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    platformID   :: The ID of the name's encoding platform.            */
+  /*                                                                       */
+  /*    encodingID   :: The platform-specific ID for the name's encoding.  */
+  /*                                                                       */
+  /*    languageID   :: The platform-specific ID for the name's language.  */
+  /*                                                                       */
+  /*    nameID       :: The ID specifying what kind of name this is.       */
+  /*                                                                       */
+  /*    stringLength :: The length of the string in bytes.                 */
+  /*                                                                       */
+  /*    stringOffset :: The offset to the string in the `name' table.      */
+  /*                                                                       */
+  /*    string       :: A pointer to the string's bytes.  Note that these  */
+  /*                    are usually UTF-16 encoded characters.             */
+  /*                                                                       */
+  typedef struct  TT_NameEntryRec_
+  {
+    FT_UShort  platformID;
+    FT_UShort  encodingID;
+    FT_UShort  languageID;
+    FT_UShort  nameID;
+    FT_UShort  stringLength;
+    FT_ULong   stringOffset;
+
+    /* this last field is not defined in the spec */
+    /* but used by the FreeType engine            */
+
+    FT_Byte*   string;
+
+  } TT_NameEntryRec, *TT_NameEntry;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_NameTableRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling the TrueType name table.                      */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    format         :: The format of the name table.                    */
+  /*                                                                       */
+  /*    numNameRecords :: The number of names in table.                    */
+  /*                                                                       */
+  /*    storageOffset  :: The offset of the name table in the `name'       */
+  /*                      TrueType table.                                  */
+  /*                                                                       */
+  /*    names          :: An array of name records.                        */
+  /*                                                                       */
+  /*    stream         :: the file's input stream.                         */
+  /*                                                                       */
+  typedef struct  TT_NameTableRec_
+  {
+    FT_UShort         format;
+    FT_UInt           numNameRecords;
+    FT_UInt           storageOffset;
+    TT_NameEntryRec*  names;
+    FT_Stream         stream;
+
+  } TT_NameTableRec, *TT_NameTable;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***             OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_GaspRangeRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A tiny structure used to model a gasp range according to the       */
+  /*    TrueType specification.                                            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    maxPPEM  :: The maximum ppem value to which `gaspFlag' applies.    */
+  /*                                                                       */
+  /*    gaspFlag :: A flag describing the grid-fitting and anti-aliasing   */
+  /*                modes to be used.                                      */
+  /*                                                                       */
+  typedef struct  TT_GaspRangeRec_
+  {
+    FT_UShort  maxPPEM;
+    FT_UShort  gaspFlag;
+
+  } TT_GaspRangeRec, *TT_GaspRange;
+
+
+#define TT_GASP_GRIDFIT  0x01
+#define TT_GASP_DOGRAY   0x02
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_GaspRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling the TrueType `gasp' table used to specify     */
+  /*    grid-fitting and anti-aliasing behaviour.                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    version    :: The version number.                                  */
+  /*                                                                       */
+  /*    numRanges  :: The number of gasp ranges in table.                  */
+  /*                                                                       */
+  /*    gaspRanges :: An array of gasp ranges.                             */
+  /*                                                                       */
+  typedef struct  TT_Gasp_
+  {
+    FT_UShort     version;
+    FT_UShort     numRanges;
+    TT_GaspRange  gaspRanges;
+
+  } TT_GaspRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                    EMBEDDED BITMAPS SUPPORT                       ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_MetricsRec                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold the big metrics of a given glyph bitmap   */
+  /*    in a TrueType or OpenType font.  These are usually found in the    */
+  /*    `EBDT' (Microsoft) or `bloc' (Apple) table.                        */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    height       :: The glyph height in pixels.                        */
+  /*                                                                       */
+  /*    width        :: The glyph width in pixels.                         */
+  /*                                                                       */
+  /*    horiBearingX :: The horizontal left bearing.                       */
+  /*                                                                       */
+  /*    horiBearingY :: The horizontal top bearing.                        */
+  /*                                                                       */
+  /*    horiAdvance  :: The horizontal advance.                            */
+  /*                                                                       */
+  /*    vertBearingX :: The vertical left bearing.                         */
+  /*                                                                       */
+  /*    vertBearingY :: The vertical top bearing.                          */
+  /*                                                                       */
+  /*    vertAdvance  :: The vertical advance.                              */
+  /*                                                                       */
+  typedef struct  TT_SBit_MetricsRec_
+  {
+    FT_Byte  height;
+    FT_Byte  width;
+
+    FT_Char  horiBearingX;
+    FT_Char  horiBearingY;
+    FT_Byte  horiAdvance;
+
+    FT_Char  vertBearingX;
+    FT_Char  vertBearingY;
+    FT_Byte  vertAdvance;
+
+  } TT_SBit_MetricsRec, *TT_SBit_Metrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_SmallMetricsRec                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold the small metrics of a given glyph bitmap */
+  /*    in a TrueType or OpenType font.  These are usually found in the    */
+  /*    `EBDT' (Microsoft) or the `bdat' (Apple) table.                    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    height   :: The glyph height in pixels.                            */
+  /*                                                                       */
+  /*    width    :: The glyph width in pixels.                             */
+  /*                                                                       */
+  /*    bearingX :: The left-side bearing.                                 */
+  /*                                                                       */
+  /*    bearingY :: The top-side bearing.                                  */
+  /*                                                                       */
+  /*    advance  :: The advance width or height.                           */
+  /*                                                                       */
+  typedef struct  TT_SBit_Small_Metrics_
+  {
+    FT_Byte  height;
+    FT_Byte  width;
+
+    FT_Char  bearingX;
+    FT_Char  bearingY;
+    FT_Byte  advance;
+
+  } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_LineMetricsRec                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to describe the text line metrics of a given      */
+  /*    bitmap strike, for either a horizontal or vertical layout.         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    ascender                :: The ascender in pixels.                 */
+  /*                                                                       */
+  /*    descender               :: The descender in pixels.                */
+  /*                                                                       */
+  /*    max_width               :: The maximum glyph width in pixels.      */
+  /*                                                                       */
+  /*    caret_slope_enumerator  :: Rise of the caret slope, typically set  */
+  /*                               to 1 for non-italic fonts.              */
+  /*                                                                       */
+  /*    caret_slope_denominator :: Rise of the caret slope, typically set  */
+  /*                               to 0 for non-italic fonts.              */
+  /*                                                                       */
+  /*    caret_offset            :: Offset in pixels to move the caret for  */
+  /*                               proper positioning.                     */
+  /*                                                                       */
+  /*    min_origin_SB           :: Minimum of horiBearingX (resp.          */
+  /*                               vertBearingY).                          */
+  /*    min_advance_SB          :: Minimum of                              */
+  /*                                                                       */
+  /*                                 horizontal advance -                  */
+  /*                                   ( horiBearingX + width )            */
+  /*                                                                       */
+  /*                               resp.                                   */
+  /*                                                                       */
+  /*                                 vertical advance -                    */
+  /*                                   ( vertBearingY + height )           */
+  /*                                                                       */
+  /*    max_before_BL           :: Maximum of horiBearingY (resp.          */
+  /*                               vertBearingY).                          */
+  /*                                                                       */
+  /*    min_after_BL            :: Minimum of                              */
+  /*                                                                       */
+  /*                                 horiBearingY - height                 */
+  /*                                                                       */
+  /*                               resp.                                   */
+  /*                                                                       */
+  /*                                 vertBearingX - width                  */
+  /*                                                                       */
+  /*    pads                    :: Unused (to make the size of the record  */
+  /*                               a multiple of 32 bits.                  */
+  /*                                                                       */
+  typedef struct  TT_SBit_LineMetricsRec_
+  {
+    FT_Char  ascender;
+    FT_Char  descender;
+    FT_Byte  max_width;
+    FT_Char  caret_slope_numerator;
+    FT_Char  caret_slope_denominator;
+    FT_Char  caret_offset;
+    FT_Char  min_origin_SB;
+    FT_Char  min_advance_SB;
+    FT_Char  max_before_BL;
+    FT_Char  min_after_BL;
+    FT_Char  pads[2];
+
+  } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_RangeRec                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A TrueType/OpenType subIndexTable as defined in the `EBLC'         */
+  /*    (Microsoft) or `bloc' (Apple) tables.                              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    first_glyph   :: The first glyph index in the range.               */
+  /*                                                                       */
+  /*    last_glyph    :: The last glyph index in the range.                */
+  /*                                                                       */
+  /*    index_format  :: The format of index table.  Valid values are 1    */
+  /*                     to 5.                                             */
+  /*                                                                       */
+  /*    image_format  :: The format of `EBDT' image data.                  */
+  /*                                                                       */
+  /*    image_offset  :: The offset to image data in `EBDT'.               */
+  /*                                                                       */
+  /*    image_size    :: For index formats 2 and 5.  This is the size in   */
+  /*                     bytes of each glyph bitmap.                       */
+  /*                                                                       */
+  /*    big_metrics   :: For index formats 2 and 5.  This is the big       */
+  /*                     metrics for each glyph bitmap.                    */
+  /*                                                                       */
+  /*    num_glyphs    :: For index formats 4 and 5.  This is the number of */
+  /*                     glyphs in the code array.                         */
+  /*                                                                       */
+  /*    glyph_offsets :: For index formats 1 and 3.                        */
+  /*                                                                       */
+  /*    glyph_codes   :: For index formats 4 and 5.                        */
+  /*                                                                       */
+  /*    table_offset  :: The offset of the index table in the `EBLC'       */
+  /*                     table.  Only used during strike loading.          */
+  /*                                                                       */
+  typedef struct  TT_SBit_RangeRec_
+  {
+    FT_UShort           first_glyph;
+    FT_UShort           last_glyph;
+
+    FT_UShort           index_format;
+    FT_UShort           image_format;
+    FT_ULong            image_offset;
+
+    FT_ULong            image_size;
+    TT_SBit_MetricsRec  metrics;
+    FT_ULong            num_glyphs;
+
+    FT_ULong*           glyph_offsets;
+    FT_UShort*          glyph_codes;
+
+    FT_ULong            table_offset;
+
+  } TT_SBit_RangeRec, *TT_SBit_Range;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_StrikeRec                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used describe a given bitmap strike in the `EBLC'      */
+  /*    (Microsoft) or `bloc' (Apple) tables.                              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*   num_index_ranges :: The number of index ranges.                     */
+  /*                                                                       */
+  /*   index_ranges     :: An array of glyph index ranges.                 */
+  /*                                                                       */
+  /*   color_ref        :: Unused.  `color_ref' is put in for future       */
+  /*                       enhancements, but these fields are already      */
+  /*                       in use by other platforms (e.g. Newton).        */
+  /*                       For details, please see                         */
+  /*                                                                       */
+  /*                         http://fonts.apple.com/                       */
+  /*                                TTRefMan/RM06/Chap6bloc.html           */
+  /*                                                                       */
+  /*   hori             :: The line metrics for horizontal layouts.        */
+  /*                                                                       */
+  /*   vert             :: The line metrics for vertical layouts.          */
+  /*                                                                       */
+  /*   start_glyph      :: The lowest glyph index for this strike.         */
+  /*                                                                       */
+  /*   end_glyph        :: The highest glyph index for this strike.        */
+  /*                                                                       */
+  /*   x_ppem           :: The number of horizontal pixels per EM.         */
+  /*                                                                       */
+  /*   y_ppem           :: The number of vertical pixels per EM.           */
+  /*                                                                       */
+  /*   bit_depth        :: The bit depth.  Valid values are 1, 2, 4,       */
+  /*                       and 8.                                          */
+  /*                                                                       */
+  /*   flags            :: Is this a vertical or horizontal strike?  For   */
+  /*                       details, please see                             */
+  /*                                                                       */
+  /*                         http://fonts.apple.com/                       */
+  /*                                TTRefMan/RM06/Chap6bloc.html           */
+  /*                                                                       */
+  typedef struct  TT_SBit_StrikeRec_
+  {
+    FT_Int                  num_ranges;
+    TT_SBit_Range           sbit_ranges;
+    FT_ULong                ranges_offset;
+
+    FT_ULong                color_ref;
+
+    TT_SBit_LineMetricsRec  hori;
+    TT_SBit_LineMetricsRec  vert;
+
+    FT_UShort               start_glyph;
+    FT_UShort               end_glyph;
+
+    FT_Byte                 x_ppem;
+    FT_Byte                 y_ppem;
+
+    FT_Byte                 bit_depth;
+    FT_Char                 flags;
+
+  } TT_SBit_StrikeRec, *TT_SBit_Strike;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_ComponentRec                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure to describe a compound sbit element.            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    glyph_code :: The element's glyph index.                           */
+  /*                                                                       */
+  /*    x_offset   :: The element's left bearing.                          */
+  /*                                                                       */
+  /*    y_offset   :: The element's top bearing.                           */
+  /*                                                                       */
+  typedef struct  TT_SBit_ComponentRec_
+  {
+    FT_UShort  glyph_code;
+    FT_Char    x_offset;
+    FT_Char    y_offset;
+
+  } TT_SBit_ComponentRec, *TT_SBit_Component;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_ScaleRec                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used describe a given bitmap scaling table, as defined */
+  /*    in the `EBSC' table.                                               */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    hori              :: The horizontal line metrics.                  */
+  /*                                                                       */
+  /*    vert              :: The vertical line metrics.                    */
+  /*                                                                       */
+  /*    x_ppem            :: The number of horizontal pixels per EM.       */
+  /*                                                                       */
+  /*    y_ppem            :: The number of vertical pixels per EM.         */
+  /*                                                                       */
+  /*    x_ppem_substitute :: Substitution x_ppem value.                    */
+  /*                                                                       */
+  /*    y_ppem_substitute :: Substitution y_ppem value.                    */
+  /*                                                                       */
+  typedef struct  TT_SBit_ScaleRec_
+  {
+    TT_SBit_LineMetricsRec  hori;
+    TT_SBit_LineMetricsRec  vert;
+
+    FT_Byte                 x_ppem;
+    FT_Byte                 y_ppem;
+
+    FT_Byte                 x_ppem_substitute;
+    FT_Byte                 y_ppem_substitute;
+
+  } TT_SBit_ScaleRec, *TT_SBit_Scale;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                  POSTSCRIPT GLYPH NAMES SUPPORT                   ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Post_20Rec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Postscript names sub-table, format 2.0.  Stores the PS name of     */
+  /*    each glyph in the font face.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_glyphs    :: The number of named glyphs in the table.          */
+  /*                                                                       */
+  /*    num_names     :: The number of PS names stored in the table.       */
+  /*                                                                       */
+  /*    glyph_indices :: The indices of the glyphs in the names arrays.    */
+  /*                                                                       */
+  /*    glyph_names   :: The PS names not in Mac Encoding.                 */
+  /*                                                                       */
+  typedef struct  TT_Post_20Rec_
+  {
+    FT_UShort   num_glyphs;
+    FT_UShort   num_names;
+    FT_UShort*  glyph_indices;
+    FT_Char**   glyph_names;
+
+  } TT_Post_20Rec, *TT_Post_20;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Post_25Rec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Postscript names sub-table, format 2.5.  Stores the PS name of     */
+  /*    each glyph in the font face.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_glyphs :: The number of glyphs in the table.                   */
+  /*                                                                       */
+  /*    offsets    :: An array of signed offsets in a normal Mac           */
+  /*                  Postscript name encoding.                            */
+  /*                                                                       */
+  typedef struct  TT_Post_25_
+  {
+    FT_UShort  num_glyphs;
+    FT_Char*   offsets;
+
+  } TT_Post_25Rec, *TT_Post_25;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Post_NamesRec                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Postscript names table, either format 2.0 or 2.5.                  */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    loaded    :: A flag to indicate whether the PS names are loaded.   */
+  /*                                                                       */
+  /*    format_20 :: The sub-table used for format 2.0.                    */
+  /*                                                                       */
+  /*    format_25 :: The sub-table used for format 2.5.                    */
+  /*                                                                       */
+  typedef struct  TT_Post_NamesRec_
+  {
+    FT_Bool  loaded;
+
+    union
+    {
+      TT_Post_20Rec  format_20;
+      TT_Post_25Rec  format_25;
+
+    } names;
+
+  } TT_Post_NamesRec, *TT_Post_Names;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                    GX VARIATION TABLE SUPPORT                     ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+  typedef struct GX_BlendRec_  *GX_Blend;
+#endif
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***              EMBEDDED BDF PROPERTIES TABLE SUPPORT                ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+   * These types are used to support a `BDF ' table that isn't part of the
+   * official TrueType specification.  It is mainly used in SFNT-based
+   * bitmap fonts that were generated from a set of BDF fonts.
+   *
+   * The format of the table is as follows.
+   *
+   *   USHORT   version      `BDF ' table version number, should be 0x0001.
+   *   USHORT   strikeCount  Number of strikes (bitmap sizes) in this table.
+   *   ULONG    stringTable  Offset (from start of BDF table) to string
+   *                         table.
+   *
+   * This is followed by an array of `strikeCount' descriptors, having the
+   * following format.
+   *
+   *   USHORT   ppem         Vertical pixels per EM for this strike.
+   *   USHORT   numItems     Number of items for this strike (properties and
+   *                         atoms).  Maximum is 255.
+   *
+   * This array in turn is followed by `strikeCount' value sets.  Each
+   * `value set' is an array of `numItems' items with the following format.
+   *
+   *   ULONG    item_name    Offset in string table to item name.
+   *   USHORT   item_type    The item type.  Possible values are
+   *                            0 => string (e.g., COMMENT)
+   *                            1 => atom   (e.g., FONT or even SIZE)
+   *                            2 => int32
+   *                            3 => uint32
+   *                         0x10 => A flag to indicate a properties.  This
+   *                                 is ORed with the above values.
+   *   ULONG    item_value   For strings  => Offset into string table without
+   *                                         the corresponding double quotes.
+   *                         For atoms    => Offset into string table.
+   *                         For integers => Direct value.
+   *
+   * All strings in the string table consist of bytes and are
+   * zero-terminated.
+   *
+   */
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+  typedef struct  TT_BDFRec_
+  {
+    FT_Byte*   table;
+    FT_Byte*   table_end;
+    FT_Byte*   strings;
+    FT_ULong   strings_size;
+    FT_UInt    num_strikes;
+    FT_Bool    loaded;
+
+  } TT_BDFRec, *TT_BDF;
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                  ORIGINAL TT_FACE CLASS DEFINITION                ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This structure/class is defined here because it is common to the      */
+  /* following formats: TTF, OpenType-TT, and OpenType-CFF.                */
+  /*                                                                       */
+  /* Note, however, that the classes TT_Size and TT_GlyphSlot are not      */
+  /* shared between font drivers, and are thus defined in `ttobjs.h'.      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_Face                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a TrueType face/font object.  A TT_Face encapsulates   */
+  /*    the resolution and scaling independent parts of a TrueType font    */
+  /*    resource.                                                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The TT_Face structure is also used as a `parent class' for the     */
+  /*    OpenType-CFF class (T2_Face).                                      */
+  /*                                                                       */
+  typedef struct TT_FaceRec_*  TT_Face;
+
+
+  /* a function type used for the truetype bytecode interpreter hooks */
+  typedef FT_Error
+  (*TT_Interpreter)( void*  exec_context );
+
+  /* forward declaration */
+  typedef struct TT_LoaderRec_*  TT_Loader;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Loader_GotoTableFunc                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Seeks a stream to the start of a given TrueType table.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    tag    :: A 4-byte tag used to name the table.                     */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    length :: The length of the table in bytes.  Set to 0 if not       */
+  /*              needed.                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be at the font file's origin.               */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Loader_GotoTableFunc)( TT_Face    face,
+                              FT_ULong   tag,
+                              FT_Stream  stream,
+                              FT_ULong*  length );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Loader_StartGlyphFunc                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Seeks a stream to the start of a given glyph element, and opens a  */
+  /*    frame for it.                                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    loader      :: The current TrueType glyph loader object.           */
+  /*                                                                       */
+  /*    glyph index :: The index of the glyph to access.                   */
+  /*                                                                       */
+  /*    offset      :: The offset of the glyph according to the            */
+  /*                   `locations' table.                                  */
+  /*                                                                       */
+  /*    byte_count  :: The size of the frame in bytes.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is normally equivalent to FT_STREAM_SEEK(offset)     */
+  /*    followed by FT_FRAME_ENTER(byte_count) with the loader's stream,   */
+  /*    but alternative formats (e.g. compressed ones) might use something */
+  /*    different.                                                         */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Loader_StartGlyphFunc)( TT_Loader  loader,
+                               FT_UInt    glyph_index,
+                               FT_ULong   offset,
+                               FT_UInt    byte_count );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Loader_ReadGlyphFunc                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Reads one glyph element (its header, a simple glyph, or a          */
+  /*    composite) from the loader's current stream frame.                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    loader :: The current TrueType glyph loader object.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Loader_ReadGlyphFunc)( TT_Loader  loader );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Loader_EndGlyphFunc                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Closes the current loader stream frame for the glyph.              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    loader :: The current TrueType glyph loader object.                */
+  /*                                                                       */
+  typedef void
+  (*TT_Loader_EndGlyphFunc)( TT_Loader  loader );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                         TrueType Face Type                            */
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Face                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The TrueType face class.  These objects model the resolution and   */
+  /*    point-size independent data found in a TrueType font file.         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root                 :: The base FT_Face structure, managed by the */
+  /*                            base layer.                                */
+  /*                                                                       */
+  /*    ttc_header           :: The TrueType collection header, used when  */
+  /*                            the file is a `ttc' rather than a `ttf'.   */
+  /*                            For ordinary font files, the field         */
+  /*                            `ttc_header.count' is set to 0.            */
+  /*                                                                       */
+  /*    format_tag           :: The font format tag.                       */
+  /*                                                                       */
+  /*    num_tables           :: The number of TrueType tables in this font */
+  /*                            file.                                      */
+  /*                                                                       */
+  /*    dir_tables           :: The directory of TrueType tables for this  */
+  /*                            font file.                                 */
+  /*                                                                       */
+  /*    header               :: The font's font header (`head' table).     */
+  /*                            Read on font opening.                      */
+  /*                                                                       */
+  /*    horizontal           :: The font's horizontal header (`hhea'       */
+  /*                            table).  This field also contains the      */
+  /*                            associated horizontal metrics table        */
+  /*                            (`hmtx').                                  */
+  /*                                                                       */
+  /*    max_profile          :: The font's maximum profile table.  Read on */
+  /*                            font opening.  Note that some maximum      */
+  /*                            values cannot be taken directly from this  */
+  /*                            table.  We thus define additional fields   */
+  /*                            below to hold the computed maxima.         */
+  /*                                                                       */
+  /*    vertical_info        :: A boolean which is set when the font file  */
+  /*                            contains vertical metrics.  If not, the    */
+  /*                            value of the `vertical' field is           */
+  /*                            undefined.                                 */
+  /*                                                                       */
+  /*    vertical             :: The font's vertical header (`vhea' table). */
+  /*                            This field also contains the associated    */
+  /*                            vertical metrics table (`vmtx'), if found. */
+  /*                            IMPORTANT: The contents of this field is   */
+  /*                            undefined if the `verticalInfo' field is   */
+  /*                            unset.                                     */
+  /*                                                                       */
+  /*    num_names            :: The number of name records within this     */
+  /*                            TrueType font.                             */
+  /*                                                                       */
+  /*    name_table           :: The table of name records (`name').        */
+  /*                                                                       */
+  /*    os2                  :: The font's OS/2 table (`OS/2').            */
+  /*                                                                       */
+  /*    postscript           :: The font's PostScript table (`post'        */
+  /*                            table).  The PostScript glyph names are    */
+  /*                            not loaded by the driver on face opening.  */
+  /*                            See the `ttpost' module for more details.  */
+  /*                                                                       */
+  /*    cmap_table           :: Address of the face's `cmap' SFNT table    */
+  /*                            in memory (it's an extracted frame).       */
+  /*                                                                       */
+  /*    cmap_size            :: The size in bytes of the `cmap_table'      */
+  /*                            described above.                           */
+  /*                                                                       */
+  /*    goto_table           :: A function called by each TrueType table   */
+  /*                            loader to position a stream's cursor to    */
+  /*                            the start of a given table according to    */
+  /*                            its tag.  It defaults to TT_Goto_Face but  */
+  /*                            can be different for strange formats (e.g. */
+  /*                            Type 42).                                  */
+  /*                                                                       */
+  /*    access_glyph_frame   :: A function used to access the frame of a   */
+  /*                            given glyph within the face's font file.   */
+  /*                                                                       */
+  /*    forget_glyph_frame   :: A function used to forget the frame of a   */
+  /*                            given glyph when all data has been loaded. */
+  /*                                                                       */
+  /*    read_glyph_header    :: A function used to read a glyph header.    */
+  /*                            It must be called between an `access' and  */
+  /*                            `forget'.                                  */
+  /*                                                                       */
+  /*    read_simple_glyph    :: A function used to read a simple glyph.    */
+  /*                            It must be called after the header was     */
+  /*                            read, and before the `forget'.             */
+  /*                                                                       */
+  /*    read_composite_glyph :: A function used to read a composite glyph. */
+  /*                            It must be called after the header was     */
+  /*                            read, and before the `forget'.             */
+  /*                                                                       */
+  /*    sfnt                 :: A pointer to the SFNT service.             */
+  /*                                                                       */
+  /*    psnames              :: A pointer to the PostScript names service. */
+  /*                                                                       */
+  /*    hdmx                 :: The face's horizontal device metrics       */
+  /*                            (`hdmx' table).  This table is optional in */
+  /*                            TrueType/OpenType fonts.                   */
+  /*                                                                       */
+  /*    gasp                 :: The grid-fitting and scaling properties    */
+  /*                            table (`gasp').  This table is optional in */
+  /*                            TrueType/OpenType fonts.                   */
+  /*                                                                       */
+  /*    pclt                 :: The `pclt' SFNT table.                     */
+  /*                                                                       */
+  /*    num_sbit_strikes     :: The number of sbit strikes, i.e., bitmap   */
+  /*                            sizes, embedded in this font.              */
+  /*                                                                       */
+  /*    sbit_strikes         :: An array of sbit strikes embedded in this  */
+  /*                            font.  This table is optional in a         */
+  /*                            TrueType/OpenType font.                    */
+  /*                                                                       */
+  /*    num_sbit_scales      :: The number of sbit scales for this font.   */
+  /*                                                                       */
+  /*    sbit_scales          :: Array of sbit scales embedded in this      */
+  /*                            font.  This table is optional in a         */
+  /*                            TrueType/OpenType font.                    */
+  /*                                                                       */
+  /*    postscript_names     :: A table used to store the Postscript names */
+  /*                            of  the glyphs for this font.  See the     */
+  /*                            file  `ttconfig.h' for comments on the     */
+  /*                            TT_CONFIG_OPTION_POSTSCRIPT_NAMES option.  */
+  /*                                                                       */
+  /*    num_locations        :: The number of glyph locations in this      */
+  /*                            TrueType file.  This should be             */
+  /*                            identical to the number of glyphs.         */
+  /*                            Ignored for Type 2 fonts.                  */
+  /*                                                                       */
+  /*    glyph_locations      :: An array of longs.  These are offsets to   */
+  /*                            glyph data within the `glyf' table.        */
+  /*                            Ignored for Type 2 font faces.             */
+  /*                                                                       */
+  /*    glyf_len             :: The length of the `glyf' table.  Needed    */
+  /*                            for malformed `loca' tables.               */
+  /*                                                                       */
+  /*    font_program_size    :: Size in bytecodes of the face's font       */
+  /*                            program.  0 if none defined.  Ignored for  */
+  /*                            Type 2 fonts.                              */
+  /*                                                                       */
+  /*    font_program         :: The face's font program (bytecode stream)  */
+  /*                            executed at load time, also used during    */
+  /*                            glyph rendering.  Comes from the `fpgm'    */
+  /*                            table.  Ignored for Type 2 font fonts.     */
+  /*                                                                       */
+  /*    cvt_program_size     :: The size in bytecodes of the face's cvt    */
+  /*                            program.  Ignored for Type 2 fonts.        */
+  /*                                                                       */
+  /*    cvt_program          :: The face's cvt program (bytecode stream)   */
+  /*                            executed each time an instance/size is     */
+  /*                            changed/reset.  Comes from the `prep'      */
+  /*                            table.  Ignored for Type 2 fonts.          */
+  /*                                                                       */
+  /*    cvt_size             :: Size of the control value table (in        */
+  /*                            entries).   Ignored for Type 2 fonts.      */
+  /*                                                                       */
+  /*    cvt                  :: The face's original control value table.   */
+  /*                            Coordinates are expressed in unscaled font */
+  /*                            units.  Comes from the `cvt ' table.       */
+  /*                            Ignored for Type 2 fonts.                  */
+  /*                                                                       */
+  /*    num_kern_pairs       :: The number of kerning pairs present in the */
+  /*                            font file.  The engine only loads the      */
+  /*                            first horizontal format 0 kern table it    */
+  /*                            finds in the font file.  Ignored for       */
+  /*                            Type 2 fonts.                              */
+  /*                                                                       */
+  /*    kern_table_index     :: The index of the kerning table in the font */
+  /*                            kerning directory.  Ignored for Type 2     */
+  /*                            fonts.                                     */
+  /*                                                                       */
+  /*    interpreter          :: A pointer to the TrueType bytecode         */
+  /*                            interpreters field is also used to hook    */
+  /*                            the debugger in `ttdebug'.                 */
+  /*                                                                       */
+  /*    unpatented_hinting   :: If true, use only unpatented methods in    */
+  /*                            the bytecode interpreter.                  */
+  /*                                                                       */
+  /*    doblend              :: A boolean which is set if the font should  */
+  /*                            be blended (this is for GX var).           */
+  /*                                                                       */
+  /*    blend                :: Contains the data needed to control GX     */
+  /*                            variation tables (rather like Multiple     */
+  /*                            Master data).                              */
+  /*                                                                       */
+  /*    extra                :: Reserved for third-party font drivers.     */
+  /*                                                                       */
+  /*    postscript_name      :: The PS name of the font.  Used by the      */
+  /*                            postscript name service.                   */
+  /*                                                                       */
+  typedef struct  TT_FaceRec_
+  {
+    FT_FaceRec            root;
+
+    TTC_HeaderRec         ttc_header;
+
+    FT_ULong              format_tag;
+    FT_UShort             num_tables;
+    TT_Table              dir_tables;
+
+    TT_Header             header;       /* TrueType header table          */
+    TT_HoriHeader         horizontal;   /* TrueType horizontal header     */
+
+    TT_MaxProfile         max_profile;
+
+    FT_Bool               vertical_info;
+    TT_VertHeader         vertical;     /* TT Vertical header, if present */
+
+    FT_UShort             num_names;    /* number of name records  */
+    TT_NameTableRec       name_table;   /* name table              */
+
+    TT_OS2                os2;          /* TrueType OS/2 table            */
+    TT_Postscript         postscript;   /* TrueType Postscript table      */
+
+    FT_Byte*              cmap_table;   /* extracted `cmap' table */
+    FT_ULong              cmap_size;
+
+    TT_Loader_GotoTableFunc   goto_table;
+
+    TT_Loader_StartGlyphFunc  access_glyph_frame;
+    TT_Loader_EndGlyphFunc    forget_glyph_frame;
+    TT_Loader_ReadGlyphFunc   read_glyph_header;
+    TT_Loader_ReadGlyphFunc   read_simple_glyph;
+    TT_Loader_ReadGlyphFunc   read_composite_glyph;
+
+    /* a typeless pointer to the SFNT_Interface table used to load */
+    /* the basic TrueType tables in the face object                */
+    void*                 sfnt;
+
+    /* a typeless pointer to the FT_Service_PsCMapsRec table used to */
+    /* handle glyph names <-> unicode & Mac values                   */
+    void*                 psnames;
+
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* Optional TrueType/OpenType tables                                   */
+    /*                                                                     */
+    /***********************************************************************/
+
+    /* grid-fitting and scaling table */
+    TT_GaspRec            gasp;                 /* the `gasp' table */
+
+    /* PCL 5 table */
+    TT_PCLT               pclt;
+
+    /* embedded bitmaps support */
+    FT_ULong              num_sbit_scales;
+    TT_SBit_Scale         sbit_scales;
+
+    /* postscript names table */
+    TT_Post_NamesRec      postscript_names;
+
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* TrueType-specific fields (ignored by the OTF-Type2 driver)          */
+    /*                                                                     */
+    /***********************************************************************/
+
+    /* the font program, if any */
+    FT_ULong              font_program_size;
+    FT_Byte*              font_program;
+
+    /* the cvt program, if any */
+    FT_ULong              cvt_program_size;
+    FT_Byte*              cvt_program;
+
+    /* the original, unscaled, control value table */
+    FT_ULong              cvt_size;
+    FT_Short*             cvt;
+
+    /* A pointer to the bytecode interpreter to use.  This is also */
+    /* used to hook the debugger for the `ttdebug' utility.        */
+    TT_Interpreter        interpreter;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    /* Use unpatented hinting only. */
+    FT_Bool               unpatented_hinting;
+#endif
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* Other tables or fields. This is used by derivative formats like     */
+    /* OpenType.                                                           */
+    /*                                                                     */
+    /***********************************************************************/
+
+    FT_Generic            extra;
+
+    const char*           postscript_name;
+
+    FT_ULong              glyf_len;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    FT_Bool               doblend;
+    GX_Blend              blend;
+#endif
+
+    /* since version 2.2 */
+
+    FT_Byte*              horz_metrics;
+    FT_ULong              horz_metrics_size;
+
+    FT_Byte*              vert_metrics;
+    FT_ULong              vert_metrics_size;
+
+    FT_ULong              num_locations; /* in broken TTF, gid > 0xFFFF */
+    FT_Byte*              glyph_locations;
+
+    FT_Byte*              hdmx_table;
+    FT_ULong              hdmx_table_size;
+    FT_UInt               hdmx_record_count;
+    FT_ULong              hdmx_record_size;
+    FT_Byte*              hdmx_record_sizes;
+
+    FT_Byte*              sbit_table;
+    FT_ULong              sbit_table_size;
+    FT_UInt               sbit_num_strikes;
+
+    FT_Byte*              kern_table;
+    FT_ULong              kern_table_size;
+    FT_UInt               num_kern_tables;
+    FT_UInt32             kern_avail_bits;
+    FT_UInt32             kern_order_bits;
+
+#ifdef TT_CONFIG_OPTION_BDF
+    TT_BDFRec             bdf;
+#endif /* TT_CONFIG_OPTION_BDF */
+
+    /* since 2.3.0 */
+    FT_ULong              horz_metrics_offset;
+    FT_ULong              vert_metrics_offset;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    /* since 2.4.12 */
+    FT_ULong              sph_found_func_flags; /* special functions found */
+                                                /* for this face           */
+    FT_Bool               sph_compatibility_mode;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+  } TT_FaceRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  <Struct>                                                             */
+  /*     TT_GlyphZoneRec                                                   */
+  /*                                                                       */
+  /*  <Description>                                                        */
+  /*     A glyph zone is used to load, scale and hint glyph outline        */
+  /*     coordinates.                                                      */
+  /*                                                                       */
+  /*  <Fields>                                                             */
+  /*     memory       :: A handle to the memory manager.                   */
+  /*                                                                       */
+  /*     max_points   :: The maximum size in points of the zone.           */
+  /*                                                                       */
+  /*     max_contours :: Max size in links contours of the zone.           */
+  /*                                                                       */
+  /*     n_points     :: The current number of points in the zone.         */
+  /*                                                                       */
+  /*     n_contours   :: The current number of contours in the zone.       */
+  /*                                                                       */
+  /*     org          :: The original glyph coordinates (font              */
+  /*                     units/scaled).                                    */
+  /*                                                                       */
+  /*     cur          :: The current glyph coordinates (scaled/hinted).    */
+  /*                                                                       */
+  /*     tags         :: The point control tags.                           */
+  /*                                                                       */
+  /*     contours     :: The contours end points.                          */
+  /*                                                                       */
+  /*     first_point  :: Offset of the current subglyph's first point.     */
+  /*                                                                       */
+  typedef struct  TT_GlyphZoneRec_
+  {
+    FT_Memory   memory;
+    FT_UShort   max_points;
+    FT_UShort   max_contours;
+    FT_UShort   n_points;    /* number of points in zone    */
+    FT_Short    n_contours;  /* number of contours          */
+
+    FT_Vector*  org;         /* original point coordinates  */
+    FT_Vector*  cur;         /* current point coordinates   */
+    FT_Vector*  orus;        /* original (unscaled) point coordinates */
+
+    FT_Byte*    tags;        /* current touch flags         */
+    FT_UShort*  contours;    /* contour end points          */
+
+    FT_UShort   first_point; /* offset of first (#0) point  */
+
+  } TT_GlyphZoneRec, *TT_GlyphZone;
+
+
+  /* handle to execution context */
+  typedef struct TT_ExecContextRec_*  TT_ExecContext;
+
+  /* glyph loader structure */
+  typedef struct  TT_LoaderRec_
+  {
+    FT_Face          face;
+    FT_Size          size;
+    FT_GlyphSlot     glyph;
+    FT_GlyphLoader   gloader;
+
+    FT_ULong         load_flags;
+    FT_UInt          glyph_index;
+
+    FT_Stream        stream;
+    FT_Int           byte_len;
+
+    FT_Short         n_contours;
+    FT_BBox          bbox;
+    FT_Int           left_bearing;
+    FT_Int           advance;
+    FT_Int           linear;
+    FT_Bool          linear_def;
+    FT_Bool          preserve_pps;
+    FT_Vector        pp1;
+    FT_Vector        pp2;
+
+    FT_ULong         glyf_offset;
+
+    /* the zone where we load our glyphs */
+    TT_GlyphZoneRec  base;
+    TT_GlyphZoneRec  zone;
+
+    TT_ExecContext   exec;
+    FT_Byte*         instructions;
+    FT_ULong         ins_pos;
+
+    /* for possible extensibility in other formats */
+    void*            other;
+
+    /* since version 2.1.8 */
+    FT_Int           top_bearing;
+    FT_Int           vadvance;
+    FT_Vector        pp3;
+    FT_Vector        pp4;
+
+    /* since version 2.2.1 */
+    FT_Byte*         cursor;
+    FT_Byte*         limit;
+
+  } TT_LoaderRec;
+
+
+FT_END_HEADER
+
+#endif /* __TTTYPES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/t1tables.h b/core/include/thirdparties/freetype/freetype/t1tables.h
new file mode 100644
index 0000000..6530094
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/t1tables.h
@@ -0,0 +1,662 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1tables.h                                                             */
+/*                                                                         */
+/*    Basic Type 1/Type 2 tables definitions and interface (specification  */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006, 2008, 2009, 2011 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1TABLES_H__
+#define __T1TABLES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    type1_tables                                                       */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Type 1 Tables                                                      */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Type~1 (PostScript) specific font tables.                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the definition of Type 1-specific tables,    */
+  /*    including structures related to other PostScript font formats.     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */
+  /* structures in order to support Multiple Master fonts.               */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_FontInfoRec                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a Type~1 or Type~2 FontInfo dictionary.  */
+  /*    Note that for Multiple Master fonts, each instance has its own     */
+  /*    FontInfo dictionary.                                               */
+  /*                                                                       */
+  typedef struct  PS_FontInfoRec_
+  {
+    FT_String*  version;
+    FT_String*  notice;
+    FT_String*  full_name;
+    FT_String*  family_name;
+    FT_String*  weight;
+    FT_Long     italic_angle;
+    FT_Bool     is_fixed_pitch;
+    FT_Short    underline_position;
+    FT_UShort   underline_thickness;
+
+  } PS_FontInfoRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_FontInfo                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a @PS_FontInfoRec structure.                           */
+  /*                                                                       */
+  typedef struct PS_FontInfoRec_*  PS_FontInfo;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    T1_FontInfo                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This type is equivalent to @PS_FontInfoRec.  It is deprecated but  */
+  /*    kept to maintain source compatibility between various versions of  */
+  /*    FreeType.                                                          */
+  /*                                                                       */
+  typedef PS_FontInfoRec  T1_FontInfo;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_PrivateRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a Type~1 or Type~2 private dictionary.   */
+  /*    Note that for Multiple Master fonts, each instance has its own     */
+  /*    Private dictionary.                                                */
+  /*                                                                       */
+  typedef struct  PS_PrivateRec_
+  {
+    FT_Int     unique_id;
+    FT_Int     lenIV;
+
+    FT_Byte    num_blue_values;
+    FT_Byte    num_other_blues;
+    FT_Byte    num_family_blues;
+    FT_Byte    num_family_other_blues;
+
+    FT_Short   blue_values[14];
+    FT_Short   other_blues[10];
+
+    FT_Short   family_blues      [14];
+    FT_Short   family_other_blues[10];
+
+    FT_Fixed   blue_scale;
+    FT_Int     blue_shift;
+    FT_Int     blue_fuzz;
+
+    FT_UShort  standard_width[1];
+    FT_UShort  standard_height[1];
+
+    FT_Byte    num_snap_widths;
+    FT_Byte    num_snap_heights;
+    FT_Bool    force_bold;
+    FT_Bool    round_stem_up;
+
+    FT_Short   snap_widths [13];  /* including std width  */
+    FT_Short   snap_heights[13];  /* including std height */
+
+    FT_Fixed   expansion_factor;
+
+    FT_Long    language_group;
+    FT_Long    password;
+
+    FT_Short   min_feature[2];
+
+  } PS_PrivateRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_Private                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a @PS_PrivateRec structure.                            */
+  /*                                                                       */
+  typedef struct PS_PrivateRec_*  PS_Private;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    T1_Private                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   This type is equivalent to @PS_PrivateRec.  It is deprecated but    */
+  /*   kept to maintain source compatibility between various versions of   */
+  /*   FreeType.                                                           */
+  /*                                                                       */
+  typedef PS_PrivateRec  T1_Private;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    T1_Blend_Flags                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A set of flags used to indicate which fields are present in a      */
+  /*    given blend dictionary (font info or private).  Used to support    */
+  /*    Multiple Masters fonts.                                            */
+  /*                                                                       */
+  typedef enum  T1_Blend_Flags_
+  {
+    /*# required fields in a FontInfo blend dictionary */
+    T1_BLEND_UNDERLINE_POSITION = 0,
+    T1_BLEND_UNDERLINE_THICKNESS,
+    T1_BLEND_ITALIC_ANGLE,
+
+    /*# required fields in a Private blend dictionary */
+    T1_BLEND_BLUE_VALUES,
+    T1_BLEND_OTHER_BLUES,
+    T1_BLEND_STANDARD_WIDTH,
+    T1_BLEND_STANDARD_HEIGHT,
+    T1_BLEND_STEM_SNAP_WIDTHS,
+    T1_BLEND_STEM_SNAP_HEIGHTS,
+    T1_BLEND_BLUE_SCALE,
+    T1_BLEND_BLUE_SHIFT,
+    T1_BLEND_FAMILY_BLUES,
+    T1_BLEND_FAMILY_OTHER_BLUES,
+    T1_BLEND_FORCE_BOLD,
+
+    /*# never remove */
+    T1_BLEND_MAX
+
+  } T1_Blend_Flags;
+
+  /* */
+
+
+  /*# backwards compatible definitions */
+#define t1_blend_underline_position   T1_BLEND_UNDERLINE_POSITION
+#define t1_blend_underline_thickness  T1_BLEND_UNDERLINE_THICKNESS
+#define t1_blend_italic_angle         T1_BLEND_ITALIC_ANGLE
+#define t1_blend_blue_values          T1_BLEND_BLUE_VALUES
+#define t1_blend_other_blues          T1_BLEND_OTHER_BLUES
+#define t1_blend_standard_widths      T1_BLEND_STANDARD_WIDTH
+#define t1_blend_standard_height      T1_BLEND_STANDARD_HEIGHT
+#define t1_blend_stem_snap_widths     T1_BLEND_STEM_SNAP_WIDTHS
+#define t1_blend_stem_snap_heights    T1_BLEND_STEM_SNAP_HEIGHTS
+#define t1_blend_blue_scale           T1_BLEND_BLUE_SCALE
+#define t1_blend_blue_shift           T1_BLEND_BLUE_SHIFT
+#define t1_blend_family_blues         T1_BLEND_FAMILY_BLUES
+#define t1_blend_family_other_blues   T1_BLEND_FAMILY_OTHER_BLUES
+#define t1_blend_force_bold           T1_BLEND_FORCE_BOLD
+#define t1_blend_max                  T1_BLEND_MAX
+
+
+  /* maximum number of Multiple Masters designs, as defined in the spec */
+#define T1_MAX_MM_DESIGNS     16
+
+  /* maximum number of Multiple Masters axes, as defined in the spec */
+#define T1_MAX_MM_AXIS        4
+
+  /* maximum number of elements in a design map */
+#define T1_MAX_MM_MAP_POINTS  20
+
+
+  /* this structure is used to store the BlendDesignMap entry for an axis */
+  typedef struct  PS_DesignMap_
+  {
+    FT_Byte    num_points;
+    FT_Long*   design_points;
+    FT_Fixed*  blend_points;
+
+  } PS_DesignMapRec, *PS_DesignMap;
+
+  /* backwards-compatible definition */
+  typedef PS_DesignMapRec  T1_DesignMap;
+
+
+  typedef struct  PS_BlendRec_
+  {
+    FT_UInt          num_designs;
+    FT_UInt          num_axis;
+
+    FT_String*       axis_names[T1_MAX_MM_AXIS];
+    FT_Fixed*        design_pos[T1_MAX_MM_DESIGNS];
+    PS_DesignMapRec  design_map[T1_MAX_MM_AXIS];
+
+    FT_Fixed*        weight_vector;
+    FT_Fixed*        default_weight_vector;
+
+    PS_FontInfo      font_infos[T1_MAX_MM_DESIGNS + 1];
+    PS_Private       privates  [T1_MAX_MM_DESIGNS + 1];
+
+    FT_ULong         blend_bitflags;
+
+    FT_BBox*         bboxes    [T1_MAX_MM_DESIGNS + 1];
+
+    /* since 2.3.0 */
+
+    /* undocumented, optional: the default design instance;   */
+    /* corresponds to default_weight_vector --                */
+    /* num_default_design_vector == 0 means it is not present */
+    /* in the font and associated metrics files               */
+    FT_UInt          default_design_vector[T1_MAX_MM_DESIGNS];
+    FT_UInt          num_default_design_vector;
+
+  } PS_BlendRec, *PS_Blend;
+
+
+  /* backwards-compatible definition */
+  typedef PS_BlendRec  T1_Blend;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_FaceDictRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to represent data in a CID top-level dictionary.  */
+  /*                                                                       */
+  typedef struct  CID_FaceDictRec_
+  {
+    PS_PrivateRec  private_dict;
+
+    FT_UInt        len_buildchar;
+    FT_Fixed       forcebold_threshold;
+    FT_Pos         stroke_width;
+    FT_Fixed       expansion_factor;
+
+    FT_Byte        paint_type;
+    FT_Byte        font_type;
+    FT_Matrix      font_matrix;
+    FT_Vector      font_offset;
+
+    FT_UInt        num_subrs;
+    FT_ULong       subrmap_offset;
+    FT_Int         sd_bytes;
+
+  } CID_FaceDictRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_FaceDict                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a @CID_FaceDictRec structure.                          */
+  /*                                                                       */
+  typedef struct CID_FaceDictRec_*  CID_FaceDict;
+
+  /* */
+
+
+  /* backwards-compatible definition */
+  typedef CID_FaceDictRec  CID_FontDict;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_FaceInfoRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to represent CID Face information.                */
+  /*                                                                       */
+  typedef struct  CID_FaceInfoRec_
+  {
+    FT_String*      cid_font_name;
+    FT_Fixed        cid_version;
+    FT_Int          cid_font_type;
+
+    FT_String*      registry;
+    FT_String*      ordering;
+    FT_Int          supplement;
+
+    PS_FontInfoRec  font_info;
+    FT_BBox         font_bbox;
+    FT_ULong        uid_base;
+
+    FT_Int          num_xuid;
+    FT_ULong        xuid[16];
+
+    FT_ULong        cidmap_offset;
+    FT_Int          fd_bytes;
+    FT_Int          gd_bytes;
+    FT_ULong        cid_count;
+
+    FT_Int          num_dicts;
+    CID_FaceDict    font_dicts;
+
+    FT_ULong        data_offset;
+
+  } CID_FaceInfoRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_FaceInfo                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a @CID_FaceInfoRec structure.                          */
+  /*                                                                       */
+  typedef struct CID_FaceInfoRec_*  CID_FaceInfo;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_Info                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   This type is equivalent to @CID_FaceInfoRec.  It is deprecated but  */
+  /*   kept to maintain source compatibility between various versions of   */
+  /*   FreeType.                                                           */
+  /*                                                                       */
+  typedef CID_FaceInfoRec  CID_Info;
+
+
+  /************************************************************************
+   *
+   * @function:
+   *    FT_Has_PS_Glyph_Names
+   *
+   * @description:
+   *    Return true if a given face provides reliable PostScript glyph
+   *    names.  This is similar to using the @FT_HAS_GLYPH_NAMES macro,
+   *    except that certain fonts (mostly TrueType) contain incorrect
+   *    glyph name tables.
+   *
+   *    When this function returns true, the caller is sure that the glyph
+   *    names returned by @FT_Get_Glyph_Name are reliable.
+   *
+   * @input:
+   *    face ::
+   *       face handle
+   *
+   * @return:
+   *    Boolean.  True if glyph names are reliable.
+   *
+   */
+  FT_EXPORT( FT_Int )
+  FT_Has_PS_Glyph_Names( FT_Face  face );
+
+
+  /************************************************************************
+   *
+   * @function:
+   *    FT_Get_PS_Font_Info
+   *
+   * @description:
+   *    Retrieve the @PS_FontInfoRec structure corresponding to a given
+   *    PostScript font.
+   *
+   * @input:
+   *    face ::
+   *       PostScript face handle.
+   *
+   * @output:
+   *    afont_info ::
+   *       Output font info structure pointer.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    The string pointers within the font info structure are owned by
+   *    the face and don't need to be freed by the caller.
+   *
+   *    If the font's format is not PostScript-based, this function will
+   *    return the `FT_Err_Invalid_Argument' error code.
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_PS_Font_Info( FT_Face      face,
+                       PS_FontInfo  afont_info );
+
+
+  /************************************************************************
+   *
+   * @function:
+   *    FT_Get_PS_Font_Private
+   *
+   * @description:
+   *    Retrieve the @PS_PrivateRec structure corresponding to a given
+   *    PostScript font.
+   *
+   * @input:
+   *    face ::
+   *       PostScript face handle.
+   *
+   * @output:
+   *    afont_private ::
+   *       Output private dictionary structure pointer.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    The string pointers within the @PS_PrivateRec structure are owned by
+   *    the face and don't need to be freed by the caller.
+   *
+   *    If the font's format is not PostScript-based, this function returns
+   *    the `FT_Err_Invalid_Argument' error code.
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_PS_Font_Private( FT_Face     face,
+                          PS_Private  afont_private );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    T1_EncodingType                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration describing the `Encoding' entry in a Type 1         */
+  /*    dictionary.                                                        */
+  /*                                                                       */
+  typedef enum  T1_EncodingType_
+  {
+    T1_ENCODING_TYPE_NONE = 0,
+    T1_ENCODING_TYPE_ARRAY,
+    T1_ENCODING_TYPE_STANDARD,
+    T1_ENCODING_TYPE_ISOLATIN1,
+    T1_ENCODING_TYPE_EXPERT
+
+  } T1_EncodingType;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    PS_Dict_Keys                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration used in calls to @FT_Get_PS_Font_Value to identify  */
+  /*    the Type~1 dictionary entry to retrieve.                           */
+  /*                                                                       */
+  typedef enum  PS_Dict_Keys_
+  {
+    /* conventionally in the font dictionary */
+    PS_DICT_FONT_TYPE,              /* FT_Byte         */
+    PS_DICT_FONT_MATRIX,            /* FT_Fixed        */
+    PS_DICT_FONT_BBOX,              /* FT_Fixed        */
+    PS_DICT_PAINT_TYPE,             /* FT_Byte         */
+    PS_DICT_FONT_NAME,              /* FT_String*      */
+    PS_DICT_UNIQUE_ID,              /* FT_Int          */
+    PS_DICT_NUM_CHAR_STRINGS,       /* FT_Int          */
+    PS_DICT_CHAR_STRING_KEY,        /* FT_String*      */
+    PS_DICT_CHAR_STRING,            /* FT_String*      */
+    PS_DICT_ENCODING_TYPE,          /* T1_EncodingType */
+    PS_DICT_ENCODING_ENTRY,         /* FT_String*      */
+
+    /* conventionally in the font Private dictionary */
+    PS_DICT_NUM_SUBRS,              /* FT_Int     */
+    PS_DICT_SUBR,                   /* FT_String* */
+    PS_DICT_STD_HW,                 /* FT_UShort  */
+    PS_DICT_STD_VW,                 /* FT_UShort  */
+    PS_DICT_NUM_BLUE_VALUES,        /* FT_Byte    */
+    PS_DICT_BLUE_VALUE,             /* FT_Short   */
+    PS_DICT_BLUE_FUZZ,              /* FT_Int     */
+    PS_DICT_NUM_OTHER_BLUES,        /* FT_Byte    */
+    PS_DICT_OTHER_BLUE,             /* FT_Short   */
+    PS_DICT_NUM_FAMILY_BLUES,       /* FT_Byte    */
+    PS_DICT_FAMILY_BLUE,            /* FT_Short   */
+    PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte    */
+    PS_DICT_FAMILY_OTHER_BLUE,      /* FT_Short   */
+    PS_DICT_BLUE_SCALE,             /* FT_Fixed   */
+    PS_DICT_BLUE_SHIFT,             /* FT_Int     */
+    PS_DICT_NUM_STEM_SNAP_H,        /* FT_Byte    */
+    PS_DICT_STEM_SNAP_H,            /* FT_Short   */
+    PS_DICT_NUM_STEM_SNAP_V,        /* FT_Byte    */
+    PS_DICT_STEM_SNAP_V,            /* FT_Short   */
+    PS_DICT_FORCE_BOLD,             /* FT_Bool    */
+    PS_DICT_RND_STEM_UP,            /* FT_Bool    */
+    PS_DICT_MIN_FEATURE,            /* FT_Short   */
+    PS_DICT_LEN_IV,                 /* FT_Int     */
+    PS_DICT_PASSWORD,               /* FT_Long    */
+    PS_DICT_LANGUAGE_GROUP,         /* FT_Long    */
+
+    /* conventionally in the font FontInfo dictionary */
+    PS_DICT_VERSION,                /* FT_String* */
+    PS_DICT_NOTICE,                 /* FT_String* */
+    PS_DICT_FULL_NAME,              /* FT_String* */
+    PS_DICT_FAMILY_NAME,            /* FT_String* */
+    PS_DICT_WEIGHT,                 /* FT_String* */
+    PS_DICT_IS_FIXED_PITCH,         /* FT_Bool    */
+    PS_DICT_UNDERLINE_POSITION,     /* FT_Short   */
+    PS_DICT_UNDERLINE_THICKNESS,    /* FT_UShort  */
+    PS_DICT_FS_TYPE,                /* FT_UShort  */
+    PS_DICT_ITALIC_ANGLE,           /* FT_Long    */
+
+    PS_DICT_MAX = PS_DICT_ITALIC_ANGLE
+
+  } PS_Dict_Keys;
+
+
+  /************************************************************************
+   *
+   * @function:
+   *    FT_Get_PS_Font_Value
+   *
+   * @description:
+   *    Retrieve the value for the supplied key from a PostScript font.
+   *
+   * @input:
+   *    face ::
+   *       PostScript face handle.
+   *
+   *    key ::
+   *       An enumeration value representing the dictionary key to retrieve.
+   *
+   *    idx ::
+   *       For array values, this specifies the index to be returned.
+   *
+   *    value ::
+   *       A pointer to memory into which to write the value.
+   *
+   *    valen_len ::
+   *       The size, in bytes, of the memory supplied for the value.
+   *
+   * @output:
+   *    value ::
+   *       The value matching the above key, if it exists.
+   *
+   * @return:
+   *    The amount of memory (in bytes) required to hold the requested
+   *    value (if it exists, -1 otherwise).
+   *
+   * @note:
+   *    The values returned are not pointers into the internal structures of
+   *    the face, but are `fresh' copies, so that the memory containing them
+   *    belongs to the calling application.  This also enforces the
+   *    `read-only' nature of these values, i.e., this function cannot be
+   *    used to manipulate the face.
+   *
+   *    `value' is a void pointer because the values returned can be of
+   *    various types.
+   *
+   *    If either `value' is NULL or `value_len' is too small, just the
+   *    required memory size for the requested entry is returned.
+   *
+   *    The `idx' parameter is used, not only to retrieve elements of, for
+   *    example, the FontMatrix or FontBBox, but also to retrieve name keys
+   *    from the CharStrings dictionary, and the charstrings themselves.  It
+   *    is ignored for atomic values.
+   *
+   *    PS_DICT_BLUE_SCALE returns a value that is scaled up by 1000.  To
+   *    get the value as in the font stream, you need to divide by
+   *    65536000.0 (to remove the FT_Fixed scale, and the x1000 scale).
+   *
+   *    IMPORTANT: Only key/value pairs read by the FreeType interpreter can
+   *    be retrieved.  So, for example, PostScript procedures such as NP,
+   *    ND, and RD are not available.  Arbitrary keys are, obviously, not be
+   *    available either.
+   *
+   *    If the font's format is not PostScript-based, this function returns
+   *    the `FT_Err_Invalid_Argument' error code.
+   *
+   */
+  FT_EXPORT( FT_Long )
+  FT_Get_PS_Font_Value( FT_Face       face,
+                        PS_Dict_Keys  key,
+                        FT_UInt       idx,
+                        void         *value,
+                        FT_Long       value_len );
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __T1TABLES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ttnameid.h b/core/include/thirdparties/freetype/freetype/ttnameid.h
new file mode 100644
index 0000000..862bf92
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ttnameid.h
@@ -0,0 +1,1237 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttnameid.h                                                             */
+/*                                                                         */
+/*    TrueType name ID definitions (specification only).                   */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006-2008, 2012 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTNAMEID_H__
+#define __TTNAMEID_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    truetype_tables                                                    */
+  /*                                                                       */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Possible values for the `platform' identifier code in the name        */
+  /* records of the TTF `name' table.                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_PLATFORM_XXX
+   *
+   * @description:
+   *   A list of valid values for the `platform_id' identifier code in
+   *   @FT_CharMapRec and @FT_SfntName structures.
+   *
+   * @values:
+   *   TT_PLATFORM_APPLE_UNICODE ::
+   *     Used by Apple to indicate a Unicode character map and/or name entry.
+   *     See @TT_APPLE_ID_XXX for corresponding `encoding_id' values.  Note
+   *     that name entries in this format are coded as big-endian UCS-2
+   *     character codes _only_.
+   *
+   *   TT_PLATFORM_MACINTOSH ::
+   *     Used by Apple to indicate a MacOS-specific charmap and/or name entry.
+   *     See @TT_MAC_ID_XXX for corresponding `encoding_id' values.  Note that
+   *     most TrueType fonts contain an Apple roman charmap to be usable on
+   *     MacOS systems (even if they contain a Microsoft charmap as well).
+   *
+   *   TT_PLATFORM_ISO ::
+   *     This value was used to specify ISO/IEC 10646 charmaps.  It is however
+   *     now deprecated.  See @TT_ISO_ID_XXX for a list of corresponding
+   *     `encoding_id' values.
+   *
+   *   TT_PLATFORM_MICROSOFT ::
+   *     Used by Microsoft to indicate Windows-specific charmaps.  See
+   *     @TT_MS_ID_XXX for a list of corresponding `encoding_id' values.
+   *     Note that most fonts contain a Unicode charmap using
+   *     (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS).
+   *
+   *   TT_PLATFORM_CUSTOM ::
+   *     Used to indicate application-specific charmaps.
+   *
+   *   TT_PLATFORM_ADOBE ::
+   *     This value isn't part of any font format specification, but is used
+   *     by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec
+   *     structure.  See @TT_ADOBE_ID_XXX.
+   */
+
+#define TT_PLATFORM_APPLE_UNICODE  0
+#define TT_PLATFORM_MACINTOSH      1
+#define TT_PLATFORM_ISO            2 /* deprecated */
+#define TT_PLATFORM_MICROSOFT      3
+#define TT_PLATFORM_CUSTOM         4
+#define TT_PLATFORM_ADOBE          7 /* artificial */
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_APPLE_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_APPLE_UNICODE charmaps and name entries.
+   *
+   * @values:
+   *   TT_APPLE_ID_DEFAULT ::
+   *     Unicode version 1.0.
+   *
+   *   TT_APPLE_ID_UNICODE_1_1 ::
+   *     Unicode 1.1; specifies Hangul characters starting at U+34xx.
+   *
+   *   TT_APPLE_ID_ISO_10646 ::
+   *     Deprecated (identical to preceding).
+   *
+   *   TT_APPLE_ID_UNICODE_2_0 ::
+   *     Unicode 2.0 and beyond (UTF-16 BMP only).
+   *
+   *   TT_APPLE_ID_UNICODE_32 ::
+   *     Unicode 3.1 and beyond, using UTF-32.
+   *
+   *   TT_APPLE_ID_VARIANT_SELECTOR ::
+   *     From Adobe, not Apple.  Not a normal cmap.  Specifies variations
+   *     on a real cmap.
+   */
+
+#define TT_APPLE_ID_DEFAULT           0 /* Unicode 1.0 */
+#define TT_APPLE_ID_UNICODE_1_1       1 /* specify Hangul at U+34xx */
+#define TT_APPLE_ID_ISO_10646         2 /* deprecated */
+#define TT_APPLE_ID_UNICODE_2_0       3 /* or later */
+#define TT_APPLE_ID_UNICODE_32        4 /* 2.0 or later, full repertoire */
+#define TT_APPLE_ID_VARIANT_SELECTOR  5 /* variation selector data */
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_MAC_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_MACINTOSH charmaps and name entries.
+   *
+   * @values:
+   *   TT_MAC_ID_ROMAN ::
+   *   TT_MAC_ID_JAPANESE ::
+   *   TT_MAC_ID_TRADITIONAL_CHINESE ::
+   *   TT_MAC_ID_KOREAN ::
+   *   TT_MAC_ID_ARABIC ::
+   *   TT_MAC_ID_HEBREW ::
+   *   TT_MAC_ID_GREEK ::
+   *   TT_MAC_ID_RUSSIAN ::
+   *   TT_MAC_ID_RSYMBOL ::
+   *   TT_MAC_ID_DEVANAGARI ::
+   *   TT_MAC_ID_GURMUKHI ::
+   *   TT_MAC_ID_GUJARATI ::
+   *   TT_MAC_ID_ORIYA ::
+   *   TT_MAC_ID_BENGALI ::
+   *   TT_MAC_ID_TAMIL ::
+   *   TT_MAC_ID_TELUGU ::
+   *   TT_MAC_ID_KANNADA ::
+   *   TT_MAC_ID_MALAYALAM ::
+   *   TT_MAC_ID_SINHALESE ::
+   *   TT_MAC_ID_BURMESE ::
+   *   TT_MAC_ID_KHMER ::
+   *   TT_MAC_ID_THAI ::
+   *   TT_MAC_ID_LAOTIAN ::
+   *   TT_MAC_ID_GEORGIAN ::
+   *   TT_MAC_ID_ARMENIAN ::
+   *   TT_MAC_ID_MALDIVIAN ::
+   *   TT_MAC_ID_SIMPLIFIED_CHINESE ::
+   *   TT_MAC_ID_TIBETAN ::
+   *   TT_MAC_ID_MONGOLIAN ::
+   *   TT_MAC_ID_GEEZ ::
+   *   TT_MAC_ID_SLAVIC ::
+   *   TT_MAC_ID_VIETNAMESE ::
+   *   TT_MAC_ID_SINDHI ::
+   *   TT_MAC_ID_UNINTERP ::
+   */
+
+#define TT_MAC_ID_ROMAN                 0
+#define TT_MAC_ID_JAPANESE              1
+#define TT_MAC_ID_TRADITIONAL_CHINESE   2
+#define TT_MAC_ID_KOREAN                3
+#define TT_MAC_ID_ARABIC                4
+#define TT_MAC_ID_HEBREW                5
+#define TT_MAC_ID_GREEK                 6
+#define TT_MAC_ID_RUSSIAN               7
+#define TT_MAC_ID_RSYMBOL               8
+#define TT_MAC_ID_DEVANAGARI            9
+#define TT_MAC_ID_GURMUKHI             10
+#define TT_MAC_ID_GUJARATI             11
+#define TT_MAC_ID_ORIYA                12
+#define TT_MAC_ID_BENGALI              13
+#define TT_MAC_ID_TAMIL                14
+#define TT_MAC_ID_TELUGU               15
+#define TT_MAC_ID_KANNADA              16
+#define TT_MAC_ID_MALAYALAM            17
+#define TT_MAC_ID_SINHALESE            18
+#define TT_MAC_ID_BURMESE              19
+#define TT_MAC_ID_KHMER                20
+#define TT_MAC_ID_THAI                 21
+#define TT_MAC_ID_LAOTIAN              22
+#define TT_MAC_ID_GEORGIAN             23
+#define TT_MAC_ID_ARMENIAN             24
+#define TT_MAC_ID_MALDIVIAN            25
+#define TT_MAC_ID_SIMPLIFIED_CHINESE   25
+#define TT_MAC_ID_TIBETAN              26
+#define TT_MAC_ID_MONGOLIAN            27
+#define TT_MAC_ID_GEEZ                 28
+#define TT_MAC_ID_SLAVIC               29
+#define TT_MAC_ID_VIETNAMESE           30
+#define TT_MAC_ID_SINDHI               31
+#define TT_MAC_ID_UNINTERP             32
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_ISO_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_ISO charmaps and name entries.
+   *
+   *   Their use is now deprecated.
+   *
+   * @values:
+   *   TT_ISO_ID_7BIT_ASCII ::
+   *     ASCII.
+   *   TT_ISO_ID_10646 ::
+   *     ISO/10646.
+   *   TT_ISO_ID_8859_1 ::
+   *     Also known as Latin-1.
+   */
+
+#define TT_ISO_ID_7BIT_ASCII  0
+#define TT_ISO_ID_10646       1
+#define TT_ISO_ID_8859_1      2
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_MS_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_MICROSOFT charmaps and name entries.
+   *
+   * @values:
+   *   TT_MS_ID_SYMBOL_CS ::
+   *     Corresponds to Microsoft symbol encoding. See
+   *     @FT_ENCODING_MS_SYMBOL.
+   *
+   *   TT_MS_ID_UNICODE_CS ::
+   *     Corresponds to a Microsoft WGL4 charmap, matching Unicode.  See
+   *     @FT_ENCODING_UNICODE.
+   *
+   *   TT_MS_ID_SJIS ::
+   *     Corresponds to SJIS Japanese encoding.  See @FT_ENCODING_SJIS.
+   *
+   *   TT_MS_ID_GB2312 ::
+   *     Corresponds to Simplified Chinese as used in Mainland China.  See
+   *     @FT_ENCODING_GB2312.
+   *
+   *   TT_MS_ID_BIG_5 ::
+   *     Corresponds to Traditional Chinese as used in Taiwan and Hong Kong.
+   *     See @FT_ENCODING_BIG5.
+   *
+   *   TT_MS_ID_WANSUNG ::
+   *     Corresponds to Korean Wansung encoding.  See @FT_ENCODING_WANSUNG.
+   *
+   *   TT_MS_ID_JOHAB ::
+   *     Corresponds to Johab encoding.  See @FT_ENCODING_JOHAB.
+   *
+   *   TT_MS_ID_UCS_4 ::
+   *     Corresponds to UCS-4 or UTF-32 charmaps.  This has been added to
+   *     the OpenType specification version 1.4 (mid-2001.)
+   */
+
+#define TT_MS_ID_SYMBOL_CS    0
+#define TT_MS_ID_UNICODE_CS   1
+#define TT_MS_ID_SJIS         2
+#define TT_MS_ID_GB2312       3
+#define TT_MS_ID_BIG_5        4
+#define TT_MS_ID_WANSUNG      5
+#define TT_MS_ID_JOHAB        6
+#define TT_MS_ID_UCS_4       10
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_ADOBE_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_ADOBE charmaps.  This is a FreeType-specific extension!
+   *
+   * @values:
+   *   TT_ADOBE_ID_STANDARD ::
+   *     Adobe standard encoding.
+   *   TT_ADOBE_ID_EXPERT ::
+   *     Adobe expert encoding.
+   *   TT_ADOBE_ID_CUSTOM ::
+   *     Adobe custom encoding.
+   *   TT_ADOBE_ID_LATIN_1 ::
+   *     Adobe Latin~1 encoding.
+   */
+
+#define TT_ADOBE_ID_STANDARD  0
+#define TT_ADOBE_ID_EXPERT    1
+#define TT_ADOBE_ID_CUSTOM    2
+#define TT_ADOBE_ID_LATIN_1   3
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Possible values of the language identifier field in the name records  */
+  /* of the TTF `name' table if the `platform' identifier code is          */
+  /* TT_PLATFORM_MACINTOSH.  These values are also used as return values   */
+  /* for function @FT_Get_CMap_Language_ID.                                */
+  /*                                                                       */
+  /* The canonical source for the Apple assigned Language ID's is at       */
+  /*                                                                       */
+  /*   https://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html      */
+  /*                                                                       */
+#define TT_MAC_LANGID_ENGLISH                       0
+#define TT_MAC_LANGID_FRENCH                        1
+#define TT_MAC_LANGID_GERMAN                        2
+#define TT_MAC_LANGID_ITALIAN                       3
+#define TT_MAC_LANGID_DUTCH                         4
+#define TT_MAC_LANGID_SWEDISH                       5
+#define TT_MAC_LANGID_SPANISH                       6
+#define TT_MAC_LANGID_DANISH                        7
+#define TT_MAC_LANGID_PORTUGUESE                    8
+#define TT_MAC_LANGID_NORWEGIAN                     9
+#define TT_MAC_LANGID_HEBREW                       10
+#define TT_MAC_LANGID_JAPANESE                     11
+#define TT_MAC_LANGID_ARABIC                       12
+#define TT_MAC_LANGID_FINNISH                      13
+#define TT_MAC_LANGID_GREEK                        14
+#define TT_MAC_LANGID_ICELANDIC                    15
+#define TT_MAC_LANGID_MALTESE                      16
+#define TT_MAC_LANGID_TURKISH                      17
+#define TT_MAC_LANGID_CROATIAN                     18
+#define TT_MAC_LANGID_CHINESE_TRADITIONAL          19
+#define TT_MAC_LANGID_URDU                         20
+#define TT_MAC_LANGID_HINDI                        21
+#define TT_MAC_LANGID_THAI                         22
+#define TT_MAC_LANGID_KOREAN                       23
+#define TT_MAC_LANGID_LITHUANIAN                   24
+#define TT_MAC_LANGID_POLISH                       25
+#define TT_MAC_LANGID_HUNGARIAN                    26
+#define TT_MAC_LANGID_ESTONIAN                     27
+#define TT_MAC_LANGID_LETTISH                      28
+#define TT_MAC_LANGID_SAAMISK                      29
+#define TT_MAC_LANGID_FAEROESE                     30
+#define TT_MAC_LANGID_FARSI                        31
+#define TT_MAC_LANGID_RUSSIAN                      32
+#define TT_MAC_LANGID_CHINESE_SIMPLIFIED           33
+#define TT_MAC_LANGID_FLEMISH                      34
+#define TT_MAC_LANGID_IRISH                        35
+#define TT_MAC_LANGID_ALBANIAN                     36
+#define TT_MAC_LANGID_ROMANIAN                     37
+#define TT_MAC_LANGID_CZECH                        38
+#define TT_MAC_LANGID_SLOVAK                       39
+#define TT_MAC_LANGID_SLOVENIAN                    40
+#define TT_MAC_LANGID_YIDDISH                      41
+#define TT_MAC_LANGID_SERBIAN                      42
+#define TT_MAC_LANGID_MACEDONIAN                   43
+#define TT_MAC_LANGID_BULGARIAN                    44
+#define TT_MAC_LANGID_UKRAINIAN                    45
+#define TT_MAC_LANGID_BYELORUSSIAN                 46
+#define TT_MAC_LANGID_UZBEK                        47
+#define TT_MAC_LANGID_KAZAKH                       48
+#define TT_MAC_LANGID_AZERBAIJANI                  49
+#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT  49
+#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT    50
+#define TT_MAC_LANGID_ARMENIAN                     51
+#define TT_MAC_LANGID_GEORGIAN                     52
+#define TT_MAC_LANGID_MOLDAVIAN                    53
+#define TT_MAC_LANGID_KIRGHIZ                      54
+#define TT_MAC_LANGID_TAJIKI                       55
+#define TT_MAC_LANGID_TURKMEN                      56
+#define TT_MAC_LANGID_MONGOLIAN                    57
+#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT   57
+#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT    58
+#define TT_MAC_LANGID_PASHTO                       59
+#define TT_MAC_LANGID_KURDISH                      60
+#define TT_MAC_LANGID_KASHMIRI                     61
+#define TT_MAC_LANGID_SINDHI                       62
+#define TT_MAC_LANGID_TIBETAN                      63
+#define TT_MAC_LANGID_NEPALI                       64
+#define TT_MAC_LANGID_SANSKRIT                     65
+#define TT_MAC_LANGID_MARATHI                      66
+#define TT_MAC_LANGID_BENGALI                      67
+#define TT_MAC_LANGID_ASSAMESE                     68
+#define TT_MAC_LANGID_GUJARATI                     69
+#define TT_MAC_LANGID_PUNJABI                      70
+#define TT_MAC_LANGID_ORIYA                        71
+#define TT_MAC_LANGID_MALAYALAM                    72
+#define TT_MAC_LANGID_KANNADA                      73
+#define TT_MAC_LANGID_TAMIL                        74
+#define TT_MAC_LANGID_TELUGU                       75
+#define TT_MAC_LANGID_SINHALESE                    76
+#define TT_MAC_LANGID_BURMESE                      77
+#define TT_MAC_LANGID_KHMER                        78
+#define TT_MAC_LANGID_LAO                          79
+#define TT_MAC_LANGID_VIETNAMESE                   80
+#define TT_MAC_LANGID_INDONESIAN                   81
+#define TT_MAC_LANGID_TAGALOG                      82
+#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT           83
+#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT          84
+#define TT_MAC_LANGID_AMHARIC                      85
+#define TT_MAC_LANGID_TIGRINYA                     86
+#define TT_MAC_LANGID_GALLA                        87
+#define TT_MAC_LANGID_SOMALI                       88
+#define TT_MAC_LANGID_SWAHILI                      89
+#define TT_MAC_LANGID_RUANDA                       90
+#define TT_MAC_LANGID_RUNDI                        91
+#define TT_MAC_LANGID_CHEWA                        92
+#define TT_MAC_LANGID_MALAGASY                     93
+#define TT_MAC_LANGID_ESPERANTO                    94
+#define TT_MAC_LANGID_WELSH                       128
+#define TT_MAC_LANGID_BASQUE                      129
+#define TT_MAC_LANGID_CATALAN                     130
+#define TT_MAC_LANGID_LATIN                       131
+#define TT_MAC_LANGID_QUECHUA                     132
+#define TT_MAC_LANGID_GUARANI                     133
+#define TT_MAC_LANGID_AYMARA                      134
+#define TT_MAC_LANGID_TATAR                       135
+#define TT_MAC_LANGID_UIGHUR                      136
+#define TT_MAC_LANGID_DZONGKHA                    137
+#define TT_MAC_LANGID_JAVANESE                    138
+#define TT_MAC_LANGID_SUNDANESE                   139
+
+
+#if 0  /* these seem to be errors that have been dropped */
+
+#define TT_MAC_LANGID_SCOTTISH_GAELIC             140
+#define TT_MAC_LANGID_IRISH_GAELIC                141
+
+#endif
+
+
+  /* The following codes are new as of 2000-03-10 */
+#define TT_MAC_LANGID_GALICIAN                    140
+#define TT_MAC_LANGID_AFRIKAANS                   141
+#define TT_MAC_LANGID_BRETON                      142
+#define TT_MAC_LANGID_INUKTITUT                   143
+#define TT_MAC_LANGID_SCOTTISH_GAELIC             144
+#define TT_MAC_LANGID_MANX_GAELIC                 145
+#define TT_MAC_LANGID_IRISH_GAELIC                146
+#define TT_MAC_LANGID_TONGAN                      147
+#define TT_MAC_LANGID_GREEK_POLYTONIC             148
+#define TT_MAC_LANGID_GREELANDIC                  149
+#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT    150
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Possible values of the language identifier field in the name records  */
+  /* of the TTF `name' table if the `platform' identifier code is          */
+  /* TT_PLATFORM_MICROSOFT.                                                */
+  /*                                                                       */
+  /* The canonical source for the MS assigned LCIDs is                     */
+  /*                                                                       */
+  /*   http://www.microsoft.com/globaldev/reference/lcid-all.mspx          */
+  /*                                                                       */
+
+#define TT_MS_LANGID_ARABIC_GENERAL                    0x0001
+#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA               0x0401
+#define TT_MS_LANGID_ARABIC_IRAQ                       0x0801
+#define TT_MS_LANGID_ARABIC_EGYPT                      0x0c01
+#define TT_MS_LANGID_ARABIC_LIBYA                      0x1001
+#define TT_MS_LANGID_ARABIC_ALGERIA                    0x1401
+#define TT_MS_LANGID_ARABIC_MOROCCO                    0x1801
+#define TT_MS_LANGID_ARABIC_TUNISIA                    0x1c01
+#define TT_MS_LANGID_ARABIC_OMAN                       0x2001
+#define TT_MS_LANGID_ARABIC_YEMEN                      0x2401
+#define TT_MS_LANGID_ARABIC_SYRIA                      0x2801
+#define TT_MS_LANGID_ARABIC_JORDAN                     0x2c01
+#define TT_MS_LANGID_ARABIC_LEBANON                    0x3001
+#define TT_MS_LANGID_ARABIC_KUWAIT                     0x3401
+#define TT_MS_LANGID_ARABIC_UAE                        0x3801
+#define TT_MS_LANGID_ARABIC_BAHRAIN                    0x3c01
+#define TT_MS_LANGID_ARABIC_QATAR                      0x4001
+#define TT_MS_LANGID_BULGARIAN_BULGARIA                0x0402
+#define TT_MS_LANGID_CATALAN_SPAIN                     0x0403
+#define TT_MS_LANGID_CHINESE_GENERAL                   0x0004
+#define TT_MS_LANGID_CHINESE_TAIWAN                    0x0404
+#define TT_MS_LANGID_CHINESE_PRC                       0x0804
+#define TT_MS_LANGID_CHINESE_HONG_KONG                 0x0c04
+#define TT_MS_LANGID_CHINESE_SINGAPORE                 0x1004
+
+#if 1  /* this looks like the correct value */
+#define TT_MS_LANGID_CHINESE_MACAU                     0x1404
+#else  /* but beware, Microsoft may change its mind...
+          the most recent Word reference has the following: */
+#define TT_MS_LANGID_CHINESE_MACAU  TT_MS_LANGID_CHINESE_HONG_KONG
+#endif
+
+#if 0  /* used only with .NET `cultures'; commented out */
+#define TT_MS_LANGID_CHINESE_TRADITIONAL               0x7C04
+#endif
+
+#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC              0x0405
+#define TT_MS_LANGID_DANISH_DENMARK                    0x0406
+#define TT_MS_LANGID_GERMAN_GERMANY                    0x0407
+#define TT_MS_LANGID_GERMAN_SWITZERLAND                0x0807
+#define TT_MS_LANGID_GERMAN_AUSTRIA                    0x0c07
+#define TT_MS_LANGID_GERMAN_LUXEMBOURG                 0x1007
+#define TT_MS_LANGID_GERMAN_LIECHTENSTEI               0x1407
+#define TT_MS_LANGID_GREEK_GREECE                      0x0408
+
+  /* don't ask what this one means... It is commented out currently. */
+#if 0
+#define TT_MS_LANGID_GREEK_GREECE2                     0x2008
+#endif
+
+#define TT_MS_LANGID_ENGLISH_GENERAL                   0x0009
+#define TT_MS_LANGID_ENGLISH_UNITED_STATES             0x0409
+#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM            0x0809
+#define TT_MS_LANGID_ENGLISH_AUSTRALIA                 0x0c09
+#define TT_MS_LANGID_ENGLISH_CANADA                    0x1009
+#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND               0x1409
+#define TT_MS_LANGID_ENGLISH_IRELAND                   0x1809
+#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA              0x1c09
+#define TT_MS_LANGID_ENGLISH_JAMAICA                   0x2009
+#define TT_MS_LANGID_ENGLISH_CARIBBEAN                 0x2409
+#define TT_MS_LANGID_ENGLISH_BELIZE                    0x2809
+#define TT_MS_LANGID_ENGLISH_TRINIDAD                  0x2c09
+#define TT_MS_LANGID_ENGLISH_ZIMBABWE                  0x3009
+#define TT_MS_LANGID_ENGLISH_PHILIPPINES               0x3409
+#define TT_MS_LANGID_ENGLISH_INDONESIA                 0x3809
+#define TT_MS_LANGID_ENGLISH_HONG_KONG                 0x3c09
+#define TT_MS_LANGID_ENGLISH_INDIA                     0x4009
+#define TT_MS_LANGID_ENGLISH_MALAYSIA                  0x4409
+#define TT_MS_LANGID_ENGLISH_SINGAPORE                 0x4809
+#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT    0x040a
+#define TT_MS_LANGID_SPANISH_MEXICO                    0x080a
+#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT  0x0c0a
+#define TT_MS_LANGID_SPANISH_GUATEMALA                 0x100a
+#define TT_MS_LANGID_SPANISH_COSTA_RICA                0x140a
+#define TT_MS_LANGID_SPANISH_PANAMA                    0x180a
+#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC        0x1c0a
+#define TT_MS_LANGID_SPANISH_VENEZUELA                 0x200a
+#define TT_MS_LANGID_SPANISH_COLOMBIA                  0x240a
+#define TT_MS_LANGID_SPANISH_PERU                      0x280a
+#define TT_MS_LANGID_SPANISH_ARGENTINA                 0x2c0a
+#define TT_MS_LANGID_SPANISH_ECUADOR                   0x300a
+#define TT_MS_LANGID_SPANISH_CHILE                     0x340a
+#define TT_MS_LANGID_SPANISH_URUGUAY                   0x380a
+#define TT_MS_LANGID_SPANISH_PARAGUAY                  0x3c0a
+#define TT_MS_LANGID_SPANISH_BOLIVIA                   0x400a
+#define TT_MS_LANGID_SPANISH_EL_SALVADOR               0x440a
+#define TT_MS_LANGID_SPANISH_HONDURAS                  0x480a
+#define TT_MS_LANGID_SPANISH_NICARAGUA                 0x4c0a
+#define TT_MS_LANGID_SPANISH_PUERTO_RICO               0x500a
+#define TT_MS_LANGID_SPANISH_UNITED_STATES             0x540a
+  /* The following ID blatantly violate MS specs by using a */
+  /* sublanguage > 0x1F.                                    */
+#define TT_MS_LANGID_SPANISH_LATIN_AMERICA             0xE40aU
+#define TT_MS_LANGID_FINNISH_FINLAND                   0x040b
+#define TT_MS_LANGID_FRENCH_FRANCE                     0x040c
+#define TT_MS_LANGID_FRENCH_BELGIUM                    0x080c
+#define TT_MS_LANGID_FRENCH_CANADA                     0x0c0c
+#define TT_MS_LANGID_FRENCH_SWITZERLAND                0x100c
+#define TT_MS_LANGID_FRENCH_LUXEMBOURG                 0x140c
+#define TT_MS_LANGID_FRENCH_MONACO                     0x180c
+#define TT_MS_LANGID_FRENCH_WEST_INDIES                0x1c0c
+#define TT_MS_LANGID_FRENCH_REUNION                    0x200c
+#define TT_MS_LANGID_FRENCH_CONGO                      0x240c
+  /* which was formerly: */
+#define TT_MS_LANGID_FRENCH_ZAIRE  TT_MS_LANGID_FRENCH_CONGO
+#define TT_MS_LANGID_FRENCH_SENEGAL                    0x280c
+#define TT_MS_LANGID_FRENCH_CAMEROON                   0x2c0c
+#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE              0x300c
+#define TT_MS_LANGID_FRENCH_MALI                       0x340c
+#define TT_MS_LANGID_FRENCH_MOROCCO                    0x380c
+#define TT_MS_LANGID_FRENCH_HAITI                      0x3c0c
+  /* and another violation of the spec (see 0xE40aU) */
+#define TT_MS_LANGID_FRENCH_NORTH_AFRICA               0xE40cU
+#define TT_MS_LANGID_HEBREW_ISRAEL                     0x040d
+#define TT_MS_LANGID_HUNGARIAN_HUNGARY                 0x040e
+#define TT_MS_LANGID_ICELANDIC_ICELAND                 0x040f
+#define TT_MS_LANGID_ITALIAN_ITALY                     0x0410
+#define TT_MS_LANGID_ITALIAN_SWITZERLAND               0x0810
+#define TT_MS_LANGID_JAPANESE_JAPAN                    0x0411
+#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA     0x0412
+#define TT_MS_LANGID_KOREAN_JOHAB_KOREA                0x0812
+#define TT_MS_LANGID_DUTCH_NETHERLANDS                 0x0413
+#define TT_MS_LANGID_DUTCH_BELGIUM                     0x0813
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL           0x0414
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK          0x0814
+#define TT_MS_LANGID_POLISH_POLAND                     0x0415
+#define TT_MS_LANGID_PORTUGUESE_BRAZIL                 0x0416
+#define TT_MS_LANGID_PORTUGUESE_PORTUGAL               0x0816
+#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND        0x0417
+#define TT_MS_LANGID_ROMANIAN_ROMANIA                  0x0418
+#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA                0x0818
+#define TT_MS_LANGID_RUSSIAN_RUSSIA                    0x0419
+#define TT_MS_LANGID_RUSSIAN_MOLDAVIA                  0x0819
+#define TT_MS_LANGID_CROATIAN_CROATIA                  0x041a
+#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN              0x081a
+#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC           0x0c1a
+
+#if 0  /* this used to be this value, but it looks like we were wrong */
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x101a
+#else  /* current sources say */
+#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA       0x101a
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x141a
+       /* and XPsp2 Platform SDK added (2004-07-26) */
+       /* Names are shortened to be significant within 40 chars. */
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN         0x181a
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC      0x181a
+#endif
+
+#define TT_MS_LANGID_SLOVAK_SLOVAKIA                   0x041b
+#define TT_MS_LANGID_ALBANIAN_ALBANIA                  0x041c
+#define TT_MS_LANGID_SWEDISH_SWEDEN                    0x041d
+#define TT_MS_LANGID_SWEDISH_FINLAND                   0x081d
+#define TT_MS_LANGID_THAI_THAILAND                     0x041e
+#define TT_MS_LANGID_TURKISH_TURKEY                    0x041f
+#define TT_MS_LANGID_URDU_PAKISTAN                     0x0420
+#define TT_MS_LANGID_URDU_INDIA                        0x0820
+#define TT_MS_LANGID_INDONESIAN_INDONESIA              0x0421
+#define TT_MS_LANGID_UKRAINIAN_UKRAINE                 0x0422
+#define TT_MS_LANGID_BELARUSIAN_BELARUS                0x0423
+#define TT_MS_LANGID_SLOVENE_SLOVENIA                  0x0424
+#define TT_MS_LANGID_ESTONIAN_ESTONIA                  0x0425
+#define TT_MS_LANGID_LATVIAN_LATVIA                    0x0426
+#define TT_MS_LANGID_LITHUANIAN_LITHUANIA              0x0427
+#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA      0x0827
+#define TT_MS_LANGID_TAJIK_TAJIKISTAN                  0x0428
+#define TT_MS_LANGID_FARSI_IRAN                        0x0429
+#define TT_MS_LANGID_VIETNAMESE_VIET_NAM               0x042a
+#define TT_MS_LANGID_ARMENIAN_ARMENIA                  0x042b
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN            0x042c
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC         0x082c
+#define TT_MS_LANGID_BASQUE_SPAIN                      0x042d
+#define TT_MS_LANGID_SORBIAN_GERMANY                   0x042e
+#define TT_MS_LANGID_MACEDONIAN_MACEDONIA              0x042f
+#define TT_MS_LANGID_SUTU_SOUTH_AFRICA                 0x0430
+#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA               0x0431
+#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA               0x0432
+#define TT_MS_LANGID_VENDA_SOUTH_AFRICA                0x0433
+#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA                0x0434
+#define TT_MS_LANGID_ZULU_SOUTH_AFRICA                 0x0435
+#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA            0x0436
+#define TT_MS_LANGID_GEORGIAN_GEORGIA                  0x0437
+#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS           0x0438
+#define TT_MS_LANGID_HINDI_INDIA                       0x0439
+#define TT_MS_LANGID_MALTESE_MALTA                     0x043a
+  /* Added by XPsp2 Platform SDK (2004-07-26) */
+#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY              0x043b
+#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN              0x083b
+#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND             0x0C3b
+#define TT_MS_LANGID_SAMI_LULE_NORWAY                  0x103b
+#define TT_MS_LANGID_SAMI_LULE_SWEDEN                  0x143b
+#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY              0x183b
+#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN              0x1C3b
+#define TT_MS_LANGID_SAMI_SKOLT_FINLAND                0x203b
+#define TT_MS_LANGID_SAMI_INARI_FINLAND                0x243b
+  /* ... and we also keep our old identifier... */
+#define TT_MS_LANGID_SAAMI_LAPONIA                     0x043b
+
+#if 0 /* this seems to be a previous inversion */
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043c
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083c
+#else
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083c
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043c
+#endif
+
+#define TT_MS_LANGID_YIDDISH_GERMANY                   0x043d
+#define TT_MS_LANGID_MALAY_MALAYSIA                    0x043e
+#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM           0x083e
+#define TT_MS_LANGID_KAZAK_KAZAKSTAN                   0x043f
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440
+  /* alias declared in Windows 2000 */
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \
+          TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN
+
+#define TT_MS_LANGID_SWAHILI_KENYA                     0x0441
+#define TT_MS_LANGID_TURKMEN_TURKMENISTAN              0x0442
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN            0x0443
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC         0x0843
+#define TT_MS_LANGID_TATAR_TATARSTAN                   0x0444
+#define TT_MS_LANGID_BENGALI_INDIA                     0x0445
+#define TT_MS_LANGID_BENGALI_BANGLADESH                0x0845
+#define TT_MS_LANGID_PUNJABI_INDIA                     0x0446
+#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN           0x0846
+#define TT_MS_LANGID_GUJARATI_INDIA                    0x0447
+#define TT_MS_LANGID_ORIYA_INDIA                       0x0448
+#define TT_MS_LANGID_TAMIL_INDIA                       0x0449
+#define TT_MS_LANGID_TELUGU_INDIA                      0x044a
+#define TT_MS_LANGID_KANNADA_INDIA                     0x044b
+#define TT_MS_LANGID_MALAYALAM_INDIA                   0x044c
+#define TT_MS_LANGID_ASSAMESE_INDIA                    0x044d
+#define TT_MS_LANGID_MARATHI_INDIA                     0x044e
+#define TT_MS_LANGID_SANSKRIT_INDIA                    0x044f
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN      0x0850
+#define TT_MS_LANGID_TIBETAN_CHINA                     0x0451
+  /* Don't use the next constant!  It has            */
+  /*   (1) the wrong spelling (Dzonghka)             */
+  /*   (2) Microsoft doesn't officially define it -- */
+  /*       at least it is not in the List of Local   */
+  /*       ID Values.                                */
+  /*   (3) Dzongkha is not the same language as      */
+  /*       Tibetan, so merging it is wrong anyway.   */
+  /*                                                 */
+  /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW.    */
+#define TT_MS_LANGID_DZONGHKA_BHUTAN                   0x0851
+
+#if 0
+  /* the following used to be defined */
+#define TT_MS_LANGID_TIBETAN_BHUTAN                    0x0451
+  /* ... but it was changed; */
+#else
+  /* So we will continue to #define it, but with the correct value */
+#define TT_MS_LANGID_TIBETAN_BHUTAN   TT_MS_LANGID_DZONGHKA_BHUTAN
+#endif
+
+#define TT_MS_LANGID_WELSH_WALES                       0x0452
+#define TT_MS_LANGID_KHMER_CAMBODIA                    0x0453
+#define TT_MS_LANGID_LAO_LAOS                          0x0454
+#define TT_MS_LANGID_BURMESE_MYANMAR                   0x0455
+#define TT_MS_LANGID_GALICIAN_SPAIN                    0x0456
+#define TT_MS_LANGID_KONKANI_INDIA                     0x0457
+#define TT_MS_LANGID_MANIPURI_INDIA  /* Bengali */     0x0458
+#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */         0x0459
+#define TT_MS_LANGID_SINDHI_PAKISTAN                   0x0859
+  /* Missing a LCID for Sindhi in Devanagari script */
+#define TT_MS_LANGID_SYRIAC_SYRIA                      0x045a
+#define TT_MS_LANGID_SINHALESE_SRI_LANKA               0x045b
+#define TT_MS_LANGID_CHEROKEE_UNITED_STATES            0x045c
+#define TT_MS_LANGID_INUKTITUT_CANADA                  0x045d
+#define TT_MS_LANGID_AMHARIC_ETHIOPIA                  0x045e
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */    0x045f
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN           0x085f
+  /* Missing a LCID for Tifinagh script */
+#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */    0x0460
+  /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */
+  /* script is yet unclear... might be Arabic, Nagari or Sharada */
+#define TT_MS_LANGID_KASHMIRI_SASIA                    0x0860
+  /* ... and aliased (by MS) for compatibility reasons. */
+#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA
+#define TT_MS_LANGID_NEPALI_NEPAL                      0x0461
+#define TT_MS_LANGID_NEPALI_INDIA                      0x0861
+#define TT_MS_LANGID_FRISIAN_NETHERLANDS               0x0462
+#define TT_MS_LANGID_PASHTO_AFGHANISTAN                0x0463
+#define TT_MS_LANGID_FILIPINO_PHILIPPINES              0x0464
+#define TT_MS_LANGID_DHIVEHI_MALDIVES                  0x0465
+  /* alias declared in Windows 2000 */
+#define TT_MS_LANGID_DIVEHI_MALDIVES  TT_MS_LANGID_DHIVEHI_MALDIVES
+#define TT_MS_LANGID_EDO_NIGERIA                       0x0466
+#define TT_MS_LANGID_FULFULDE_NIGERIA                  0x0467
+#define TT_MS_LANGID_HAUSA_NIGERIA                     0x0468
+#define TT_MS_LANGID_IBIBIO_NIGERIA                    0x0469
+#define TT_MS_LANGID_YORUBA_NIGERIA                    0x046a
+#define TT_MS_LANGID_QUECHUA_BOLIVIA                   0x046b
+#define TT_MS_LANGID_QUECHUA_ECUADOR                   0x086b
+#define TT_MS_LANGID_QUECHUA_PERU                      0x0c6b
+#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA               0x046c
+  /* Also spelled by XPsp2 Platform SDK (2004-07-26) */
+#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \
+          TT_MS_LANGID_SEPEDI_SOUTH_AFRICA
+  /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */
+#define TT_MS_LANGID_IGBO_NIGERIA                      0x0470
+#define TT_MS_LANGID_KANURI_NIGERIA                    0x0471
+#define TT_MS_LANGID_OROMO_ETHIOPIA                    0x0472
+#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA                 0x0473
+#define TT_MS_LANGID_TIGRIGNA_ERYTHREA                 0x0873
+  /* also spelled in the `Passport SDK' list as: */
+#define TT_MS_LANGID_TIGRIGNA_ERYTREA  TT_MS_LANGID_TIGRIGNA_ERYTHREA
+#define TT_MS_LANGID_GUARANI_PARAGUAY                  0x0474
+#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES            0x0475
+#define TT_MS_LANGID_LATIN                             0x0476
+#define TT_MS_LANGID_SOMALI_SOMALIA                    0x0477
+  /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */
+  /*       not written (but OTOH the peculiar writing system is worth     */
+  /*       studying).                                                     */
+#define TT_MS_LANGID_YI_CHINA                          0x0478
+#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES   0x0479
+  /* language codes from 0x047a to 0x047f are (still) unknown. */
+#define TT_MS_LANGID_UIGHUR_CHINA                      0x0480
+#define TT_MS_LANGID_MAORI_NEW_ZEALAND                 0x0481
+
+#if 0  /* not deemed useful for fonts */
+#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE            0x04ff
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Possible values of the `name' identifier field in the name records of */
+  /* the TTF `name' table.  These values are platform independent.         */
+  /*                                                                       */
+#define TT_NAME_ID_COPYRIGHT            0
+#define TT_NAME_ID_FONT_FAMILY          1
+#define TT_NAME_ID_FONT_SUBFAMILY       2
+#define TT_NAME_ID_UNIQUE_ID            3
+#define TT_NAME_ID_FULL_NAME            4
+#define TT_NAME_ID_VERSION_STRING       5
+#define TT_NAME_ID_PS_NAME              6
+#define TT_NAME_ID_TRADEMARK            7
+
+  /* the following values are from the OpenType spec */
+#define TT_NAME_ID_MANUFACTURER         8
+#define TT_NAME_ID_DESIGNER             9
+#define TT_NAME_ID_DESCRIPTION          10
+#define TT_NAME_ID_VENDOR_URL           11
+#define TT_NAME_ID_DESIGNER_URL         12
+#define TT_NAME_ID_LICENSE              13
+#define TT_NAME_ID_LICENSE_URL          14
+  /* number 15 is reserved */
+#define TT_NAME_ID_PREFERRED_FAMILY     16
+#define TT_NAME_ID_PREFERRED_SUBFAMILY  17
+#define TT_NAME_ID_MAC_FULL_NAME        18
+
+  /* The following code is new as of 2000-01-21 */
+#define TT_NAME_ID_SAMPLE_TEXT          19
+
+  /* This is new in OpenType 1.3 */
+#define TT_NAME_ID_CID_FINDFONT_NAME    20
+
+  /* This is new in OpenType 1.5 */
+#define TT_NAME_ID_WWS_FAMILY           21
+#define TT_NAME_ID_WWS_SUBFAMILY        22
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table.     */
+  /*                                                                       */
+  /* Updated 08-Nov-2008.                                                  */
+  /*                                                                       */
+
+  /* Bit  0   Basic Latin */
+#define TT_UCR_BASIC_LATIN                     (1L <<  0) /* U+0020-U+007E */
+  /* Bit  1   C1 Controls and Latin-1 Supplement */
+#define TT_UCR_LATIN1_SUPPLEMENT               (1L <<  1) /* U+0080-U+00FF */
+  /* Bit  2   Latin Extended-A */
+#define TT_UCR_LATIN_EXTENDED_A                (1L <<  2) /* U+0100-U+017F */
+  /* Bit  3   Latin Extended-B */
+#define TT_UCR_LATIN_EXTENDED_B                (1L <<  3) /* U+0180-U+024F */
+  /* Bit  4   IPA Extensions                 */
+  /*          Phonetic Extensions            */
+  /*          Phonetic Extensions Supplement */
+#define TT_UCR_IPA_EXTENSIONS                  (1L <<  4) /* U+0250-U+02AF */
+                                                          /* U+1D00-U+1D7F */
+                                                          /* U+1D80-U+1DBF */
+  /* Bit  5   Spacing Modifier Letters */
+  /*          Modifier Tone Letters    */
+#define TT_UCR_SPACING_MODIFIER                (1L <<  5) /* U+02B0-U+02FF */
+                                                          /* U+A700-U+A71F */
+  /* Bit  6   Combining Diacritical Marks            */
+  /*          Combining Diacritical Marks Supplement */
+#define TT_UCR_COMBINING_DIACRITICS            (1L <<  6) /* U+0300-U+036F */
+                                                          /* U+1DC0-U+1DFF */
+  /* Bit  7   Greek and Coptic */
+#define TT_UCR_GREEK                           (1L <<  7) /* U+0370-U+03FF */
+  /* Bit  8   Coptic */
+#define TT_UCR_COPTIC                          (1L <<  8) /* U+2C80-U+2CFF */
+  /* Bit  9   Cyrillic            */
+  /*          Cyrillic Supplement */
+  /*          Cyrillic Extended-A */
+  /*          Cyrillic Extended-B */
+#define TT_UCR_CYRILLIC                        (1L <<  9) /* U+0400-U+04FF */
+                                                          /* U+0500-U+052F */
+                                                          /* U+2DE0-U+2DFF */
+                                                          /* U+A640-U+A69F */
+  /* Bit 10   Armenian */
+#define TT_UCR_ARMENIAN                        (1L << 10) /* U+0530-U+058F */
+  /* Bit 11   Hebrew */
+#define TT_UCR_HEBREW                          (1L << 11) /* U+0590-U+05FF */
+  /* Bit 12   Vai */
+#define TT_UCR_VAI                             (1L << 12) /* U+A500-U+A63F */
+  /* Bit 13   Arabic            */
+  /*          Arabic Supplement */
+#define TT_UCR_ARABIC                          (1L << 13) /* U+0600-U+06FF */
+                                                          /* U+0750-U+077F */
+  /* Bit 14   NKo */
+#define TT_UCR_NKO                             (1L << 14) /* U+07C0-U+07FF */
+  /* Bit 15   Devanagari */
+#define TT_UCR_DEVANAGARI                      (1L << 15) /* U+0900-U+097F */
+  /* Bit 16   Bengali */
+#define TT_UCR_BENGALI                         (1L << 16) /* U+0980-U+09FF */
+  /* Bit 17   Gurmukhi */
+#define TT_UCR_GURMUKHI                        (1L << 17) /* U+0A00-U+0A7F */
+  /* Bit 18   Gujarati */
+#define TT_UCR_GUJARATI                        (1L << 18) /* U+0A80-U+0AFF */
+  /* Bit 19   Oriya */
+#define TT_UCR_ORIYA                           (1L << 19) /* U+0B00-U+0B7F */
+  /* Bit 20   Tamil */
+#define TT_UCR_TAMIL                           (1L << 20) /* U+0B80-U+0BFF */
+  /* Bit 21   Telugu */
+#define TT_UCR_TELUGU                          (1L << 21) /* U+0C00-U+0C7F */
+  /* Bit 22   Kannada */
+#define TT_UCR_KANNADA                         (1L << 22) /* U+0C80-U+0CFF */
+  /* Bit 23   Malayalam */
+#define TT_UCR_MALAYALAM                       (1L << 23) /* U+0D00-U+0D7F */
+  /* Bit 24   Thai */
+#define TT_UCR_THAI                            (1L << 24) /* U+0E00-U+0E7F */
+  /* Bit 25   Lao */
+#define TT_UCR_LAO                             (1L << 25) /* U+0E80-U+0EFF */
+  /* Bit 26   Georgian            */
+  /*          Georgian Supplement */
+#define TT_UCR_GEORGIAN                        (1L << 26) /* U+10A0-U+10FF */
+                                                          /* U+2D00-U+2D2F */
+  /* Bit 27   Balinese */
+#define TT_UCR_BALINESE                        (1L << 27) /* U+1B00-U+1B7F */
+  /* Bit 28   Hangul Jamo */
+#define TT_UCR_HANGUL_JAMO                     (1L << 28) /* U+1100-U+11FF */
+  /* Bit 29   Latin Extended Additional */
+  /*          Latin Extended-C          */
+  /*          Latin Extended-D          */
+#define TT_UCR_LATIN_EXTENDED_ADDITIONAL       (1L << 29) /* U+1E00-U+1EFF */
+                                                          /* U+2C60-U+2C7F */
+                                                          /* U+A720-U+A7FF */
+  /* Bit 30   Greek Extended */
+#define TT_UCR_GREEK_EXTENDED                  (1L << 30) /* U+1F00-U+1FFF */
+  /* Bit 31   General Punctuation      */
+  /*          Supplemental Punctuation */
+#define TT_UCR_GENERAL_PUNCTUATION             (1L << 31) /* U+2000-U+206F */
+                                                          /* U+2E00-U+2E7F */
+  /* Bit 32   Superscripts And Subscripts */
+#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS         (1L <<  0) /* U+2070-U+209F */
+  /* Bit 33   Currency Symbols */
+#define TT_UCR_CURRENCY_SYMBOLS                (1L <<  1) /* U+20A0-U+20CF */
+  /* Bit 34   Combining Diacritical Marks For Symbols */
+#define TT_UCR_COMBINING_DIACRITICS_SYMB       (1L <<  2) /* U+20D0-U+20FF */
+  /* Bit 35   Letterlike Symbols */
+#define TT_UCR_LETTERLIKE_SYMBOLS              (1L <<  3) /* U+2100-U+214F */
+  /* Bit 36   Number Forms */
+#define TT_UCR_NUMBER_FORMS                    (1L <<  4) /* U+2150-U+218F */
+  /* Bit 37   Arrows                           */
+  /*          Supplemental Arrows-A            */
+  /*          Supplemental Arrows-B            */
+  /*          Miscellaneous Symbols and Arrows */
+#define TT_UCR_ARROWS                          (1L <<  5) /* U+2190-U+21FF */
+                                                          /* U+27F0-U+27FF */
+                                                          /* U+2900-U+297F */
+                                                          /* U+2B00-U+2BFF */
+  /* Bit 38   Mathematical Operators               */
+  /*          Supplemental Mathematical Operators  */
+  /*          Miscellaneous Mathematical Symbols-A */
+  /*          Miscellaneous Mathematical Symbols-B */
+#define TT_UCR_MATHEMATICAL_OPERATORS          (1L <<  6) /* U+2200-U+22FF */
+                                                          /* U+2A00-U+2AFF */
+                                                          /* U+27C0-U+27EF */
+                                                          /* U+2980-U+29FF */
+  /* Bit 39 Miscellaneous Technical */
+#define TT_UCR_MISCELLANEOUS_TECHNICAL         (1L <<  7) /* U+2300-U+23FF */
+  /* Bit 40   Control Pictures */
+#define TT_UCR_CONTROL_PICTURES                (1L <<  8) /* U+2400-U+243F */
+  /* Bit 41   Optical Character Recognition */
+#define TT_UCR_OCR                             (1L <<  9) /* U+2440-U+245F */
+  /* Bit 42   Enclosed Alphanumerics */
+#define TT_UCR_ENCLOSED_ALPHANUMERICS          (1L << 10) /* U+2460-U+24FF */
+  /* Bit 43   Box Drawing */
+#define TT_UCR_BOX_DRAWING                     (1L << 11) /* U+2500-U+257F */
+  /* Bit 44   Block Elements */
+#define TT_UCR_BLOCK_ELEMENTS                  (1L << 12) /* U+2580-U+259F */
+  /* Bit 45   Geometric Shapes */
+#define TT_UCR_GEOMETRIC_SHAPES                (1L << 13) /* U+25A0-U+25FF */
+  /* Bit 46   Miscellaneous Symbols */
+#define TT_UCR_MISCELLANEOUS_SYMBOLS           (1L << 14) /* U+2600-U+26FF */
+  /* Bit 47   Dingbats */
+#define TT_UCR_DINGBATS                        (1L << 15) /* U+2700-U+27BF */
+  /* Bit 48   CJK Symbols and Punctuation */
+#define TT_UCR_CJK_SYMBOLS                     (1L << 16) /* U+3000-U+303F */
+  /* Bit 49   Hiragana */
+#define TT_UCR_HIRAGANA                        (1L << 17) /* U+3040-U+309F */
+  /* Bit 50   Katakana                     */
+  /*          Katakana Phonetic Extensions */
+#define TT_UCR_KATAKANA                        (1L << 18) /* U+30A0-U+30FF */
+                                                          /* U+31F0-U+31FF */
+  /* Bit 51   Bopomofo          */
+  /*          Bopomofo Extended */
+#define TT_UCR_BOPOMOFO                        (1L << 19) /* U+3100-U+312F */
+                                                          /* U+31A0-U+31BF */
+  /* Bit 52   Hangul Compatibility Jamo */
+#define TT_UCR_HANGUL_COMPATIBILITY_JAMO       (1L << 20) /* U+3130-U+318F */
+  /* Bit 53   Phags-Pa */
+#define TT_UCR_CJK_MISC                        (1L << 21) /* U+A840-U+A87F */
+#define TT_UCR_KANBUN  TT_UCR_CJK_MISC /* deprecated */
+#define TT_UCR_PHAGSPA
+  /* Bit 54   Enclosed CJK Letters and Months */
+#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS     (1L << 22) /* U+3200-U+32FF */
+  /* Bit 55   CJK Compatibility */
+#define TT_UCR_CJK_COMPATIBILITY               (1L << 23) /* U+3300-U+33FF */
+  /* Bit 56   Hangul Syllables */
+#define TT_UCR_HANGUL                          (1L << 24) /* U+AC00-U+D7A3 */
+  /* Bit 57   High Surrogates              */
+  /*          High Private Use Surrogates  */
+  /*          Low Surrogates               */
+  /*                                       */
+  /* According to OpenType specs v.1.3+,   */
+  /* setting bit 57 implies that there is  */
+  /* at least one codepoint beyond the     */
+  /* Basic Multilingual Plane that is      */
+  /* supported by this font.  So it really */
+  /* means >= U+10000                      */
+#define TT_UCR_SURROGATES                      (1L << 25) /* U+D800-U+DB7F */
+                                                          /* U+DB80-U+DBFF */
+                                                          /* U+DC00-U+DFFF */
+#define TT_UCR_NON_PLANE_0  TT_UCR_SURROGATES
+  /* Bit 58  Phoenician */
+#define TT_UCR_PHOENICIAN                      (1L << 26) /*U+10900-U+1091F*/
+  /* Bit 59   CJK Unified Ideographs             */
+  /*          CJK Radicals Supplement            */
+  /*          Kangxi Radicals                    */
+  /*          Ideographic Description Characters */
+  /*          CJK Unified Ideographs Extension A */
+  /*          CJK Unified Ideographs Extension B */
+  /*          Kanbun                             */
+#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS          (1L << 27) /* U+4E00-U+9FFF */
+                                                          /* U+2E80-U+2EFF */
+                                                          /* U+2F00-U+2FDF */
+                                                          /* U+2FF0-U+2FFF */
+                                                          /* U+3400-U+4DB5 */
+                                                          /*U+20000-U+2A6DF*/
+                                                          /* U+3190-U+319F */
+  /* Bit 60   Private Use */
+#define TT_UCR_PRIVATE_USE                     (1L << 28) /* U+E000-U+F8FF */
+  /* Bit 61   CJK Strokes                             */
+  /*          CJK Compatibility Ideographs            */
+  /*          CJK Compatibility Ideographs Supplement */
+#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS    (1L << 29) /* U+31C0-U+31EF */
+                                                          /* U+F900-U+FAFF */
+                                                          /*U+2F800-U+2FA1F*/
+  /* Bit 62   Alphabetic Presentation Forms */
+#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS   (1L << 30) /* U+FB00-U+FB4F */
+  /* Bit 63   Arabic Presentation Forms-A */
+#define TT_UCR_ARABIC_PRESENTATIONS_A          (1L << 31) /* U+FB50-U+FDFF */
+  /* Bit 64   Combining Half Marks */
+#define TT_UCR_COMBINING_HALF_MARKS            (1L <<  0) /* U+FE20-U+FE2F */
+  /* Bit 65   Vertical forms          */
+  /*          CJK Compatibility Forms */
+#define TT_UCR_CJK_COMPATIBILITY_FORMS         (1L <<  1) /* U+FE10-U+FE1F */
+                                                          /* U+FE30-U+FE4F */
+  /* Bit 66   Small Form Variants */
+#define TT_UCR_SMALL_FORM_VARIANTS             (1L <<  2) /* U+FE50-U+FE6F */
+  /* Bit 67   Arabic Presentation Forms-B */
+#define TT_UCR_ARABIC_PRESENTATIONS_B          (1L <<  3) /* U+FE70-U+FEFE */
+  /* Bit 68   Halfwidth and Fullwidth Forms */
+#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS       (1L <<  4) /* U+FF00-U+FFEF */
+  /* Bit 69   Specials */
+#define TT_UCR_SPECIALS                        (1L <<  5) /* U+FFF0-U+FFFD */
+  /* Bit 70   Tibetan */
+#define TT_UCR_TIBETAN                         (1L <<  6) /* U+0F00-U+0FFF */
+  /* Bit 71   Syriac */
+#define TT_UCR_SYRIAC                          (1L <<  7) /* U+0700-U+074F */
+  /* Bit 72   Thaana */
+#define TT_UCR_THAANA                          (1L <<  8) /* U+0780-U+07BF */
+  /* Bit 73   Sinhala */
+#define TT_UCR_SINHALA                         (1L <<  9) /* U+0D80-U+0DFF */
+  /* Bit 74   Myanmar */
+#define TT_UCR_MYANMAR                         (1L << 10) /* U+1000-U+109F */
+  /* Bit 75   Ethiopic            */
+  /*          Ethiopic Supplement */
+  /*          Ethiopic Extended   */
+#define TT_UCR_ETHIOPIC                        (1L << 11) /* U+1200-U+137F */
+                                                          /* U+1380-U+139F */
+                                                          /* U+2D80-U+2DDF */
+  /* Bit 76   Cherokee */
+#define TT_UCR_CHEROKEE                        (1L << 12) /* U+13A0-U+13FF */
+  /* Bit 77   Unified Canadian Aboriginal Syllabics */
+#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS   (1L << 13) /* U+1400-U+167F */
+  /* Bit 78   Ogham */
+#define TT_UCR_OGHAM                           (1L << 14) /* U+1680-U+169F */
+  /* Bit 79   Runic */
+#define TT_UCR_RUNIC                           (1L << 15) /* U+16A0-U+16FF */
+  /* Bit 80   Khmer         */
+  /*          Khmer Symbols */
+#define TT_UCR_KHMER                           (1L << 16) /* U+1780-U+17FF */
+                                                          /* U+19E0-U+19FF */
+  /* Bit 81   Mongolian */
+#define TT_UCR_MONGOLIAN                       (1L << 17) /* U+1800-U+18AF */
+  /* Bit 82   Braille Patterns */
+#define TT_UCR_BRAILLE                         (1L << 18) /* U+2800-U+28FF */
+  /* Bit 83   Yi Syllables */
+  /*          Yi Radicals  */
+#define TT_UCR_YI                              (1L << 19) /* U+A000-U+A48F */
+                                                          /* U+A490-U+A4CF */
+  /* Bit 84   Tagalog  */
+  /*          Hanunoo  */
+  /*          Buhid    */
+  /*          Tagbanwa */
+#define TT_UCR_PHILIPPINE                      (1L << 20) /* U+1700-U+171F */
+                                                          /* U+1720-U+173F */
+                                                          /* U+1740-U+175F */
+                                                          /* U+1760-U+177F */
+  /* Bit 85   Old Italic */
+#define TT_UCR_OLD_ITALIC                      (1L << 21) /*U+10300-U+1032F*/
+  /* Bit 86   Gothic */
+#define TT_UCR_GOTHIC                          (1L << 22) /*U+10330-U+1034F*/
+  /* Bit 87   Deseret */
+#define TT_UCR_DESERET                         (1L << 23) /*U+10400-U+1044F*/
+  /* Bit 88   Byzantine Musical Symbols      */
+  /*          Musical Symbols                */
+  /*          Ancient Greek Musical Notation */
+#define TT_UCR_MUSICAL_SYMBOLS                 (1L << 24) /*U+1D000-U+1D0FF*/
+                                                          /*U+1D100-U+1D1FF*/
+                                                          /*U+1D200-U+1D24F*/
+  /* Bit 89   Mathematical Alphanumeric Symbols */
+#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS       (1L << 25) /*U+1D400-U+1D7FF*/
+  /* Bit 90   Private Use (plane 15) */
+  /*          Private Use (plane 16) */
+#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY       (1L << 26) /*U+F0000-U+FFFFD*/
+                                                        /*U+100000-U+10FFFD*/
+  /* Bit 91   Variation Selectors            */
+  /*          Variation Selectors Supplement */
+#define TT_UCR_VARIATION_SELECTORS             (1L << 27) /* U+FE00-U+FE0F */
+                                                          /*U+E0100-U+E01EF*/
+  /* Bit 92   Tags */
+#define TT_UCR_TAGS                            (1L << 28) /*U+E0000-U+E007F*/
+  /* Bit 93   Limbu */
+#define TT_UCR_LIMBU                           (1L << 29) /* U+1900-U+194F */
+  /* Bit 94   Tai Le */
+#define TT_UCR_TAI_LE                          (1L << 30) /* U+1950-U+197F */
+  /* Bit 95   New Tai Lue */
+#define TT_UCR_NEW_TAI_LUE                     (1L << 31) /* U+1980-U+19DF */
+  /* Bit 96   Buginese */
+#define TT_UCR_BUGINESE                        (1L <<  0) /* U+1A00-U+1A1F */
+  /* Bit 97   Glagolitic */
+#define TT_UCR_GLAGOLITIC                      (1L <<  1) /* U+2C00-U+2C5F */
+  /* Bit 98   Tifinagh */
+#define TT_UCR_TIFINAGH                        (1L <<  2) /* U+2D30-U+2D7F */
+  /* Bit 99   Yijing Hexagram Symbols */
+#define TT_UCR_YIJING                          (1L <<  3) /* U+4DC0-U+4DFF */
+  /* Bit 100  Syloti Nagri */
+#define TT_UCR_SYLOTI_NAGRI                    (1L <<  4) /* U+A800-U+A82F */
+  /* Bit 101  Linear B Syllabary */
+  /*          Linear B Ideograms */
+  /*          Aegean Numbers     */
+#define TT_UCR_LINEAR_B                        (1L <<  5) /*U+10000-U+1007F*/
+                                                          /*U+10080-U+100FF*/
+                                                          /*U+10100-U+1013F*/
+  /* Bit 102  Ancient Greek Numbers */
+#define TT_UCR_ANCIENT_GREEK_NUMBERS           (1L <<  6) /*U+10140-U+1018F*/
+  /* Bit 103  Ugaritic */
+#define TT_UCR_UGARITIC                        (1L <<  7) /*U+10380-U+1039F*/
+  /* Bit 104  Old Persian */
+#define TT_UCR_OLD_PERSIAN                     (1L <<  8) /*U+103A0-U+103DF*/
+  /* Bit 105  Shavian */
+#define TT_UCR_SHAVIAN                         (1L <<  9) /*U+10450-U+1047F*/
+  /* Bit 106  Osmanya */
+#define TT_UCR_OSMANYA                         (1L << 10) /*U+10480-U+104AF*/
+  /* Bit 107  Cypriot Syllabary */
+#define TT_UCR_CYPRIOT_SYLLABARY               (1L << 11) /*U+10800-U+1083F*/
+  /* Bit 108  Kharoshthi */
+#define TT_UCR_KHAROSHTHI                      (1L << 12) /*U+10A00-U+10A5F*/
+  /* Bit 109  Tai Xuan Jing Symbols */
+#define TT_UCR_TAI_XUAN_JING                   (1L << 13) /*U+1D300-U+1D35F*/
+  /* Bit 110  Cuneiform                         */
+  /*          Cuneiform Numbers and Punctuation */
+#define TT_UCR_CUNEIFORM                       (1L << 14) /*U+12000-U+123FF*/
+                                                          /*U+12400-U+1247F*/
+  /* Bit 111  Counting Rod Numerals */
+#define TT_UCR_COUNTING_ROD_NUMERALS           (1L << 15) /*U+1D360-U+1D37F*/
+  /* Bit 112  Sundanese */
+#define TT_UCR_SUNDANESE                       (1L << 16) /* U+1B80-U+1BBF */
+  /* Bit 113  Lepcha */
+#define TT_UCR_LEPCHA                          (1L << 17) /* U+1C00-U+1C4F */
+  /* Bit 114  Ol Chiki */
+#define TT_UCR_OL_CHIKI                        (1L << 18) /* U+1C50-U+1C7F */
+  /* Bit 115  Saurashtra */
+#define TT_UCR_SAURASHTRA                      (1L << 19) /* U+A880-U+A8DF */
+  /* Bit 116  Kayah Li */
+#define TT_UCR_KAYAH_LI                        (1L << 20) /* U+A900-U+A92F */
+  /* Bit 117  Rejang */
+#define TT_UCR_REJANG                          (1L << 21) /* U+A930-U+A95F */
+  /* Bit 118  Cham */
+#define TT_UCR_CHAM                            (1L << 22) /* U+AA00-U+AA5F */
+  /* Bit 119  Ancient Symbols */
+#define TT_UCR_ANCIENT_SYMBOLS                 (1L << 23) /*U+10190-U+101CF*/
+  /* Bit 120  Phaistos Disc */
+#define TT_UCR_PHAISTOS_DISC                   (1L << 24) /*U+101D0-U+101FF*/
+  /* Bit 121  Carian */
+  /*          Lycian */
+  /*          Lydian */
+#define TT_UCR_OLD_ANATOLIAN                   (1L << 25) /*U+102A0-U+102DF*/
+                                                          /*U+10280-U+1029F*/
+                                                          /*U+10920-U+1093F*/
+  /* Bit 122  Domino Tiles  */
+  /*          Mahjong Tiles */
+#define TT_UCR_GAME_TILES                      (1L << 26) /*U+1F030-U+1F09F*/
+                                                          /*U+1F000-U+1F02F*/
+  /* Bit 123-127 Reserved for process-internal usage */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Some compilers have a very limited length of identifiers.             */
+  /*                                                                       */
+#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ )
+#define HAVE_LIMIT_ON_IDENTS
+#endif
+
+
+#ifndef HAVE_LIMIT_ON_IDENTS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Here some alias #defines in order to be clearer.                      */
+  /*                                                                       */
+  /* These are not always #defined to stay within the 31~character limit   */
+  /* which some compilers have.                                            */
+  /*                                                                       */
+  /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern  */
+  /* Borland compilers (read: from BC++ 3.1 on) can increase this limit.   */
+  /* If you get a warning with such a compiler, use the -i40 switch.       */
+  /*                                                                       */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_A      \
+         TT_UCR_ARABIC_PRESENTATIONS_A
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_B      \
+         TT_UCR_ARABIC_PRESENTATIONS_B
+
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS      \
+         TT_UCR_COMBINING_DIACRITICS
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \
+         TT_UCR_COMBINING_DIACRITICS_SYMB
+
+
+#endif /* !HAVE_LIMIT_ON_IDENTS */
+
+
+FT_END_HEADER
+
+#endif /* __TTNAMEID_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/tttables.h b/core/include/thirdparties/freetype/freetype/tttables.h
new file mode 100644
index 0000000..c620550
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/tttables.h
@@ -0,0 +1,777 @@
+/***************************************************************************/
+/*                                                                         */
+/*  tttables.h                                                             */
+/*                                                                         */
+/*    Basic SFNT/TrueType tables definitions and interface                 */
+/*    (specification only).                                                */
+/*                                                                         */
+/*  Copyright 1996-2005, 2008-2012 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTTABLES_H__
+#define __TTTABLES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    truetype_tables                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    TrueType Tables                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    TrueType specific table types and functions.                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the definition of TrueType-specific tables   */
+  /*    as well as some routines used to access and process them.          */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Header                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType font header table.  All       */
+  /*    fields follow the TrueType specification.                          */
+  /*                                                                       */
+  typedef struct  TT_Header_
+  {
+    FT_Fixed   Table_Version;
+    FT_Fixed   Font_Revision;
+
+    FT_Long    CheckSum_Adjust;
+    FT_Long    Magic_Number;
+
+    FT_UShort  Flags;
+    FT_UShort  Units_Per_EM;
+
+    FT_Long    Created [2];
+    FT_Long    Modified[2];
+
+    FT_Short   xMin;
+    FT_Short   yMin;
+    FT_Short   xMax;
+    FT_Short   yMax;
+
+    FT_UShort  Mac_Style;
+    FT_UShort  Lowest_Rec_PPEM;
+
+    FT_Short   Font_Direction;
+    FT_Short   Index_To_Loc_Format;
+    FT_Short   Glyph_Data_Format;
+
+  } TT_Header;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_HoriHeader                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType horizontal header, the `hhea' */
+  /*    table, as well as the corresponding horizontal metrics table,      */
+  /*    i.e., the `hmtx' table.                                            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    Version                :: The table version.                       */
+  /*                                                                       */
+  /*    Ascender               :: The font's ascender, i.e., the distance  */
+  /*                              from the baseline to the top-most of all */
+  /*                              glyph points found in the font.          */
+  /*                                                                       */
+  /*                              This value is invalid in many fonts, as  */
+  /*                              it is usually set by the font designer,  */
+  /*                              and often reflects only a portion of the */
+  /*                              glyphs found in the font (maybe ASCII).  */
+  /*                                                                       */
+  /*                              You should use the `sTypoAscender' field */
+  /*                              of the OS/2 table instead if you want    */
+  /*                              the correct one.                         */
+  /*                                                                       */
+  /*    Descender              :: The font's descender, i.e., the distance */
+  /*                              from the baseline to the bottom-most of  */
+  /*                              all glyph points found in the font.  It  */
+  /*                              is negative.                             */
+  /*                                                                       */
+  /*                              This value is invalid in many fonts, as  */
+  /*                              it is usually set by the font designer,  */
+  /*                              and often reflects only a portion of the */
+  /*                              glyphs found in the font (maybe ASCII).  */
+  /*                                                                       */
+  /*                              You should use the `sTypoDescender'      */
+  /*                              field of the OS/2 table instead if you   */
+  /*                              want the correct one.                    */
+  /*                                                                       */
+  /*    Line_Gap               :: The font's line gap, i.e., the distance  */
+  /*                              to add to the ascender and descender to  */
+  /*                              get the BTB, i.e., the                   */
+  /*                              baseline-to-baseline distance for the    */
+  /*                              font.                                    */
+  /*                                                                       */
+  /*    advance_Width_Max      :: This field is the maximum of all advance */
+  /*                              widths found in the font.  It can be     */
+  /*                              used to compute the maximum width of an  */
+  /*                              arbitrary string of text.                */
+  /*                                                                       */
+  /*    min_Left_Side_Bearing  :: The minimum left side bearing of all     */
+  /*                              glyphs within the font.                  */
+  /*                                                                       */
+  /*    min_Right_Side_Bearing :: The minimum right side bearing of all    */
+  /*                              glyphs within the font.                  */
+  /*                                                                       */
+  /*    xMax_Extent            :: The maximum horizontal extent (i.e., the */
+  /*                              `width' of a glyph's bounding box) for   */
+  /*                              all glyphs in the font.                  */
+  /*                                                                       */
+  /*    caret_Slope_Rise       :: The rise coefficient of the cursor's     */
+  /*                              slope of the cursor (slope=rise/run).    */
+  /*                                                                       */
+  /*    caret_Slope_Run        :: The run coefficient of the cursor's      */
+  /*                              slope.                                   */
+  /*                                                                       */
+  /*    Reserved               :: 8~reserved bytes.                        */
+  /*                                                                       */
+  /*    metric_Data_Format     :: Always~0.                                */
+  /*                                                                       */
+  /*    number_Of_HMetrics     :: Number of HMetrics entries in the `hmtx' */
+  /*                              table -- this value can be smaller than  */
+  /*                              the total number of glyphs in the font.  */
+  /*                                                                       */
+  /*    long_metrics           :: A pointer into the `hmtx' table.         */
+  /*                                                                       */
+  /*    short_metrics          :: A pointer into the `hmtx' table.         */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */
+  /*               be identical except for the names of their fields which */
+  /*               are different.                                          */
+  /*                                                                       */
+  /*               This ensures that a single function in the `ttload'     */
+  /*               module is able to read both the horizontal and vertical */
+  /*               headers.                                                */
+  /*                                                                       */
+  typedef struct  TT_HoriHeader_
+  {
+    FT_Fixed   Version;
+    FT_Short   Ascender;
+    FT_Short   Descender;
+    FT_Short   Line_Gap;
+
+    FT_UShort  advance_Width_Max;      /* advance width maximum */
+
+    FT_Short   min_Left_Side_Bearing;  /* minimum left-sb       */
+    FT_Short   min_Right_Side_Bearing; /* minimum right-sb      */
+    FT_Short   xMax_Extent;            /* xmax extents          */
+    FT_Short   caret_Slope_Rise;
+    FT_Short   caret_Slope_Run;
+    FT_Short   caret_Offset;
+
+    FT_Short   Reserved[4];
+
+    FT_Short   metric_Data_Format;
+    FT_UShort  number_Of_HMetrics;
+
+    /* The following fields are not defined by the TrueType specification */
+    /* but they are used to connect the metrics header to the relevant    */
+    /* `HMTX' table.                                                      */
+
+    void*      long_metrics;
+    void*      short_metrics;
+
+  } TT_HoriHeader;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_VertHeader                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType vertical header, the `vhea'   */
+  /*    table, as well as the corresponding vertical metrics table, i.e.,  */
+  /*    the `vmtx' table.                                                  */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    Version                 :: The table version.                      */
+  /*                                                                       */
+  /*    Ascender                :: The font's ascender, i.e., the distance */
+  /*                               from the baseline to the top-most of    */
+  /*                               all glyph points found in the font.     */
+  /*                                                                       */
+  /*                               This value is invalid in many fonts, as */
+  /*                               it is usually set by the font designer, */
+  /*                               and often reflects only a portion of    */
+  /*                               the glyphs found in the font (maybe     */
+  /*                               ASCII).                                 */
+  /*                                                                       */
+  /*                               You should use the `sTypoAscender'      */
+  /*                               field of the OS/2 table instead if you  */
+  /*                               want the correct one.                   */
+  /*                                                                       */
+  /*    Descender               :: The font's descender, i.e., the         */
+  /*                               distance from the baseline to the       */
+  /*                               bottom-most of all glyph points found   */
+  /*                               in the font.  It is negative.           */
+  /*                                                                       */
+  /*                               This value is invalid in many fonts, as */
+  /*                               it is usually set by the font designer, */
+  /*                               and often reflects only a portion of    */
+  /*                               the glyphs found in the font (maybe     */
+  /*                               ASCII).                                 */
+  /*                                                                       */
+  /*                               You should use the `sTypoDescender'     */
+  /*                               field of the OS/2 table instead if you  */
+  /*                               want the correct one.                   */
+  /*                                                                       */
+  /*    Line_Gap                :: The font's line gap, i.e., the distance */
+  /*                               to add to the ascender and descender to */
+  /*                               get the BTB, i.e., the                  */
+  /*                               baseline-to-baseline distance for the   */
+  /*                               font.                                   */
+  /*                                                                       */
+  /*    advance_Height_Max      :: This field is the maximum of all        */
+  /*                               advance heights found in the font.  It  */
+  /*                               can be used to compute the maximum      */
+  /*                               height of an arbitrary string of text.  */
+  /*                                                                       */
+  /*    min_Top_Side_Bearing    :: The minimum top side bearing of all     */
+  /*                               glyphs within the font.                 */
+  /*                                                                       */
+  /*    min_Bottom_Side_Bearing :: The minimum bottom side bearing of all  */
+  /*                               glyphs within the font.                 */
+  /*                                                                       */
+  /*    yMax_Extent             :: The maximum vertical extent (i.e., the  */
+  /*                               `height' of a glyph's bounding box) for */
+  /*                               all glyphs in the font.                 */
+  /*                                                                       */
+  /*    caret_Slope_Rise        :: The rise coefficient of the cursor's    */
+  /*                               slope of the cursor (slope=rise/run).   */
+  /*                                                                       */
+  /*    caret_Slope_Run         :: The run coefficient of the cursor's     */
+  /*                               slope.                                  */
+  /*                                                                       */
+  /*    caret_Offset            :: The cursor's offset for slanted fonts.  */
+  /*                               This value is `reserved' in vmtx        */
+  /*                               version 1.0.                            */
+  /*                                                                       */
+  /*    Reserved                :: 8~reserved bytes.                       */
+  /*                                                                       */
+  /*    metric_Data_Format      :: Always~0.                               */
+  /*                                                                       */
+  /*    number_Of_HMetrics      :: Number of VMetrics entries in the       */
+  /*                               `vmtx' table -- this value can be       */
+  /*                               smaller than the total number of glyphs */
+  /*                               in the font.                            */
+  /*                                                                       */
+  /*    long_metrics           :: A pointer into the `vmtx' table.         */
+  /*                                                                       */
+  /*    short_metrics          :: A pointer into the `vmtx' table.         */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */
+  /*               be identical except for the names of their fields which */
+  /*               are different.                                          */
+  /*                                                                       */
+  /*               This ensures that a single function in the `ttload'     */
+  /*               module is able to read both the horizontal and vertical */
+  /*               headers.                                                */
+  /*                                                                       */
+  typedef struct  TT_VertHeader_
+  {
+    FT_Fixed   Version;
+    FT_Short   Ascender;
+    FT_Short   Descender;
+    FT_Short   Line_Gap;
+
+    FT_UShort  advance_Height_Max;      /* advance height maximum */
+
+    FT_Short   min_Top_Side_Bearing;    /* minimum left-sb or top-sb       */
+    FT_Short   min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb   */
+    FT_Short   yMax_Extent;             /* xmax or ymax extents            */
+    FT_Short   caret_Slope_Rise;
+    FT_Short   caret_Slope_Run;
+    FT_Short   caret_Offset;
+
+    FT_Short   Reserved[4];
+
+    FT_Short   metric_Data_Format;
+    FT_UShort  number_Of_VMetrics;
+
+    /* The following fields are not defined by the TrueType specification */
+    /* but they're used to connect the metrics header to the relevant     */
+    /* `HMTX' or `VMTX' table.                                            */
+
+    void*      long_metrics;
+    void*      short_metrics;
+
+  } TT_VertHeader;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_OS2                                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType OS/2 table. This is the long  */
+  /*    table version.  All fields comply to the TrueType specification.   */
+  /*                                                                       */
+  /*    Note that we now support old Mac fonts which do not include an     */
+  /*    OS/2 table.  In this case, the `version' field is always set to    */
+  /*    0xFFFF.                                                            */
+  /*                                                                       */
+  typedef struct  TT_OS2_
+  {
+    FT_UShort  version;                /* 0x0001 - more or 0xFFFF */
+    FT_Short   xAvgCharWidth;
+    FT_UShort  usWeightClass;
+    FT_UShort  usWidthClass;
+    FT_Short   fsType;
+    FT_Short   ySubscriptXSize;
+    FT_Short   ySubscriptYSize;
+    FT_Short   ySubscriptXOffset;
+    FT_Short   ySubscriptYOffset;
+    FT_Short   ySuperscriptXSize;
+    FT_Short   ySuperscriptYSize;
+    FT_Short   ySuperscriptXOffset;
+    FT_Short   ySuperscriptYOffset;
+    FT_Short   yStrikeoutSize;
+    FT_Short   yStrikeoutPosition;
+    FT_Short   sFamilyClass;
+
+    FT_Byte    panose[10];
+
+    FT_ULong   ulUnicodeRange1;        /* Bits 0-31   */
+    FT_ULong   ulUnicodeRange2;        /* Bits 32-63  */
+    FT_ULong   ulUnicodeRange3;        /* Bits 64-95  */
+    FT_ULong   ulUnicodeRange4;        /* Bits 96-127 */
+
+    FT_Char    achVendID[4];
+
+    FT_UShort  fsSelection;
+    FT_UShort  usFirstCharIndex;
+    FT_UShort  usLastCharIndex;
+    FT_Short   sTypoAscender;
+    FT_Short   sTypoDescender;
+    FT_Short   sTypoLineGap;
+    FT_UShort  usWinAscent;
+    FT_UShort  usWinDescent;
+
+    /* only version 1 tables: */
+
+    FT_ULong   ulCodePageRange1;       /* Bits 0-31   */
+    FT_ULong   ulCodePageRange2;       /* Bits 32-63  */
+
+    /* only version 2 tables: */
+
+    FT_Short   sxHeight;
+    FT_Short   sCapHeight;
+    FT_UShort  usDefaultChar;
+    FT_UShort  usBreakChar;
+    FT_UShort  usMaxContext;
+
+  } TT_OS2;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Postscript                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType PostScript table.  All fields */
+  /*    comply to the TrueType specification.  This structure does not     */
+  /*    reference the PostScript glyph names, which can be nevertheless    */
+  /*    accessed with the `ttpost' module.                                 */
+  /*                                                                       */
+  typedef struct  TT_Postscript_
+  {
+    FT_Fixed  FormatType;
+    FT_Fixed  italicAngle;
+    FT_Short  underlinePosition;
+    FT_Short  underlineThickness;
+    FT_ULong  isFixedPitch;
+    FT_ULong  minMemType42;
+    FT_ULong  maxMemType42;
+    FT_ULong  minMemType1;
+    FT_ULong  maxMemType1;
+
+    /* Glyph names follow in the file, but we don't   */
+    /* load them by default.  See the ttpost.c file.  */
+
+  } TT_Postscript;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_PCLT                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType PCLT table.  All fields       */
+  /*    comply to the TrueType specification.                              */
+  /*                                                                       */
+  typedef struct  TT_PCLT_
+  {
+    FT_Fixed   Version;
+    FT_ULong   FontNumber;
+    FT_UShort  Pitch;
+    FT_UShort  xHeight;
+    FT_UShort  Style;
+    FT_UShort  TypeFamily;
+    FT_UShort  CapHeight;
+    FT_UShort  SymbolSet;
+    FT_Char    TypeFace[16];
+    FT_Char    CharacterComplement[8];
+    FT_Char    FileName[6];
+    FT_Char    StrokeWeight;
+    FT_Char    WidthType;
+    FT_Byte    SerifStyle;
+    FT_Byte    Reserved;
+
+  } TT_PCLT;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_MaxProfile                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The maximum profile is a table containing many max values which    */
+  /*    can be used to pre-allocate arrays.  This ensures that no memory   */
+  /*    allocation occurs during a glyph load.                             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    version               :: The version number.                       */
+  /*                                                                       */
+  /*    numGlyphs             :: The number of glyphs in this TrueType     */
+  /*                             font.                                     */
+  /*                                                                       */
+  /*    maxPoints             :: The maximum number of points in a         */
+  /*                             non-composite TrueType glyph.  See also   */
+  /*                             the structure element                     */
+  /*                             `maxCompositePoints'.                     */
+  /*                                                                       */
+  /*    maxContours           :: The maximum number of contours in a       */
+  /*                             non-composite TrueType glyph.  See also   */
+  /*                             the structure element                     */
+  /*                             `maxCompositeContours'.                   */
+  /*                                                                       */
+  /*    maxCompositePoints    :: The maximum number of points in a         */
+  /*                             composite TrueType glyph.  See also the   */
+  /*                             structure element `maxPoints'.            */
+  /*                                                                       */
+  /*    maxCompositeContours  :: The maximum number of contours in a       */
+  /*                             composite TrueType glyph.  See also the   */
+  /*                             structure element `maxContours'.          */
+  /*                                                                       */
+  /*    maxZones              :: The maximum number of zones used for      */
+  /*                             glyph hinting.                            */
+  /*                                                                       */
+  /*    maxTwilightPoints     :: The maximum number of points in the       */
+  /*                             twilight zone used for glyph hinting.     */
+  /*                                                                       */
+  /*    maxStorage            :: The maximum number of elements in the     */
+  /*                             storage area used for glyph hinting.      */
+  /*                                                                       */
+  /*    maxFunctionDefs       :: The maximum number of function            */
+  /*                             definitions in the TrueType bytecode for  */
+  /*                             this font.                                */
+  /*                                                                       */
+  /*    maxInstructionDefs    :: The maximum number of instruction         */
+  /*                             definitions in the TrueType bytecode for  */
+  /*                             this font.                                */
+  /*                                                                       */
+  /*    maxStackElements      :: The maximum number of stack elements used */
+  /*                             during bytecode interpretation.           */
+  /*                                                                       */
+  /*    maxSizeOfInstructions :: The maximum number of TrueType opcodes    */
+  /*                             used for glyph hinting.                   */
+  /*                                                                       */
+  /*    maxComponentElements  :: The maximum number of simple (i.e., non-  */
+  /*                             composite) glyphs in a composite glyph.   */
+  /*                                                                       */
+  /*    maxComponentDepth     :: The maximum nesting depth of composite    */
+  /*                             glyphs.                                   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This structure is only used during font loading.                   */
+  /*                                                                       */
+  typedef struct  TT_MaxProfile_
+  {
+    FT_Fixed   version;
+    FT_UShort  numGlyphs;
+    FT_UShort  maxPoints;
+    FT_UShort  maxContours;
+    FT_UShort  maxCompositePoints;
+    FT_UShort  maxCompositeContours;
+    FT_UShort  maxZones;
+    FT_UShort  maxTwilightPoints;
+    FT_UShort  maxStorage;
+    FT_UShort  maxFunctionDefs;
+    FT_UShort  maxInstructionDefs;
+    FT_UShort  maxStackElements;
+    FT_UShort  maxSizeOfInstructions;
+    FT_UShort  maxComponentElements;
+    FT_UShort  maxComponentDepth;
+
+  } TT_MaxProfile;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Sfnt_Tag                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration used to specify the index of an SFNT table.         */
+  /*    Used in the @FT_Get_Sfnt_Table API function.                       */
+  /*                                                                       */
+  typedef enum  FT_Sfnt_Tag_
+  {
+    ft_sfnt_head = 0,    /* TT_Header     */
+    ft_sfnt_maxp = 1,    /* TT_MaxProfile */
+    ft_sfnt_os2  = 2,    /* TT_OS2        */
+    ft_sfnt_hhea = 3,    /* TT_HoriHeader */
+    ft_sfnt_vhea = 4,    /* TT_VertHeader */
+    ft_sfnt_post = 5,    /* TT_Postscript */
+    ft_sfnt_pclt = 6,    /* TT_PCLT       */
+
+    sfnt_max   /* internal end mark */
+
+  } FT_Sfnt_Tag;
+
+  /* */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Sfnt_Table                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a pointer to a given SFNT table within a face.              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source.                                    */
+  /*                                                                       */
+  /*    tag  :: The index of the SFNT table.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A type-less pointer to the table.  This will be~0 in case of       */
+  /*    error, or if the corresponding table was not found *OR* loaded     */
+  /*    from the file.                                                     */
+  /*                                                                       */
+  /*    Use a typecast according to `tag' to access the structure          */
+  /*    elements.                                                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The table is owned by the face object and disappears with it.      */
+  /*                                                                       */
+  /*    This function is only useful to access SFNT tables that are loaded */
+  /*    by the sfnt, truetype, and opentype drivers.  See @FT_Sfnt_Tag for */
+  /*    a list.                                                            */
+  /*                                                                       */
+  /*    Here an example how to access the `vhea' table:                    */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      TT_VertHeader*  vert_header;                                     */
+  /*                                                                       */
+  /*                                                                       */
+  /*      vert_header =                                                    */
+  /*        (TT_VertHeader*)FT_Get_Sfnt_Table( face, ft_sfnt_vhea );       */
+  /*    }                                                                  */
+  /*                                                                       */
+  FT_EXPORT( void* )
+  FT_Get_Sfnt_Table( FT_Face      face,
+                     FT_Sfnt_Tag  tag );
+
+
+ /**************************************************************************
+  *
+  * @function:
+  *   FT_Load_Sfnt_Table
+  *
+  * @description:
+  *   Load any font table into client memory.
+  *
+  * @input:
+  *   face ::
+  *     A handle to the source face.
+  *
+  *   tag ::
+  *     The four-byte tag of the table to load.  Use the value~0 if you want
+  *     to access the whole font file.  Otherwise, you can use one of the
+  *     definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new
+  *     one with @FT_MAKE_TAG.
+  *
+  *   offset ::
+  *     The starting offset in the table (or file if tag == 0).
+  *
+  * @output:
+  *   buffer ::
+  *     The target buffer address.  The client must ensure that the memory
+  *     array is big enough to hold the data.
+  *
+  * @inout:
+  *   length ::
+  *     If the `length' parameter is NULL, then try to load the whole table.
+  *     Return an error code if it fails.
+  *
+  *     Else, if `*length' is~0, exit immediately while returning the
+  *     table's (or file) full size in it.
+  *
+  *     Else the number of bytes to read from the table or file, from the
+  *     starting offset.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   If you need to determine the table's length you should first call this
+  *   function with `*length' set to~0, as in the following example:
+  *
+  *     {
+  *       FT_ULong  length = 0;
+  *
+  *
+  *       error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length );
+  *       if ( error ) { ... table does not exist ... }
+  *
+  *       buffer = malloc( length );
+  *       if ( buffer == NULL ) { ... not enough memory ... }
+  *
+  *       error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length );
+  *       if ( error ) { ... could not load table ... }
+  *     }
+  */
+  FT_EXPORT( FT_Error )
+  FT_Load_Sfnt_Table( FT_Face    face,
+                      FT_ULong   tag,
+                      FT_Long    offset,
+                      FT_Byte*   buffer,
+                      FT_ULong*  length );
+
+
+ /**************************************************************************
+  *
+  * @function:
+  *   FT_Sfnt_Table_Info
+  *
+  * @description:
+  *   Return information on an SFNT table.
+  *
+  * @input:
+  *   face ::
+  *     A handle to the source face.
+  *
+  *   table_index ::
+  *     The index of an SFNT table.  The function returns
+  *     FT_Err_Table_Missing for an invalid value.
+  *
+  * @inout:
+  *   tag ::
+  *     The name tag of the SFNT table.  If the value is NULL, `table_index'
+  *     is ignored, and `length' returns the number of SFNT tables in the
+  *     font.
+  *
+  * @output:
+  *   length ::
+  *     The length of the SFNT table (or the number of SFNT tables, depending
+  *     on `tag').
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   While parsing fonts, FreeType handles SFNT tables with length zero as
+  *   missing.
+  *
+  */
+  FT_EXPORT( FT_Error )
+  FT_Sfnt_Table_Info( FT_Face    face,
+                      FT_UInt    table_index,
+                      FT_ULong  *tag,
+                      FT_ULong  *length );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_CMap_Language_ID                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return TrueType/sfnt specific cmap language ID.  Definitions of    */
+  /*    language ID values are in `freetype/ttnameid.h'.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    charmap ::                                                         */
+  /*      The target charmap.                                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The language ID of `charmap'.  If `charmap' doesn't belong to a    */
+  /*    TrueType/sfnt face, just return~0 as the default value.            */
+  /*                                                                       */
+  /*    For a format~14 cmap (to access Unicode IVS), the return value is  */
+  /*    0xFFFFFFFF.                                                        */
+  /*                                                                       */
+  FT_EXPORT( FT_ULong )
+  FT_Get_CMap_Language_ID( FT_CharMap  charmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_CMap_Format                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return TrueType/sfnt specific cmap format.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    charmap ::                                                         */
+  /*      The target charmap.                                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The format of `charmap'.  If `charmap' doesn't belong to a         */
+  /*    TrueType/sfnt face, return -1.                                     */
+  /*                                                                       */
+  FT_EXPORT( FT_Long )
+  FT_Get_CMap_Format( FT_CharMap  charmap );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __TTTABLES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/tttags.h b/core/include/thirdparties/freetype/freetype/tttags.h
new file mode 100644
index 0000000..ac7de2a
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/tttags.h
@@ -0,0 +1,109 @@
+/***************************************************************************/
+/*                                                                         */
+/*  tttags.h                                                               */
+/*                                                                         */
+/*    Tags for TrueType and OpenType tables (specification only).          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2004, 2005, 2007, 2008, 2013 by                   */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTAGS_H__
+#define __TTAGS_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+#define TTAG_avar  FT_MAKE_TAG( 'a', 'v', 'a', 'r' )
+#define TTAG_BASE  FT_MAKE_TAG( 'B', 'A', 'S', 'E' )
+#define TTAG_bdat  FT_MAKE_TAG( 'b', 'd', 'a', 't' )
+#define TTAG_BDF   FT_MAKE_TAG( 'B', 'D', 'F', ' ' )
+#define TTAG_bhed  FT_MAKE_TAG( 'b', 'h', 'e', 'd' )
+#define TTAG_bloc  FT_MAKE_TAG( 'b', 'l', 'o', 'c' )
+#define TTAG_bsln  FT_MAKE_TAG( 'b', 's', 'l', 'n' )
+#define TTAG_CBDT  FT_MAKE_TAG( 'C', 'B', 'D', 'T' )
+#define TTAG_CBLC  FT_MAKE_TAG( 'C', 'B', 'L', 'C' )
+#define TTAG_CFF   FT_MAKE_TAG( 'C', 'F', 'F', ' ' )
+#define TTAG_CID   FT_MAKE_TAG( 'C', 'I', 'D', ' ' )
+#define TTAG_cmap  FT_MAKE_TAG( 'c', 'm', 'a', 'p' )
+#define TTAG_cvar  FT_MAKE_TAG( 'c', 'v', 'a', 'r' )
+#define TTAG_cvt   FT_MAKE_TAG( 'c', 'v', 't', ' ' )
+#define TTAG_DSIG  FT_MAKE_TAG( 'D', 'S', 'I', 'G' )
+#define TTAG_EBDT  FT_MAKE_TAG( 'E', 'B', 'D', 'T' )
+#define TTAG_EBLC  FT_MAKE_TAG( 'E', 'B', 'L', 'C' )
+#define TTAG_EBSC  FT_MAKE_TAG( 'E', 'B', 'S', 'C' )
+#define TTAG_feat  FT_MAKE_TAG( 'f', 'e', 'a', 't' )
+#define TTAG_FOND  FT_MAKE_TAG( 'F', 'O', 'N', 'D' )
+#define TTAG_fpgm  FT_MAKE_TAG( 'f', 'p', 'g', 'm' )
+#define TTAG_fvar  FT_MAKE_TAG( 'f', 'v', 'a', 'r' )
+#define TTAG_gasp  FT_MAKE_TAG( 'g', 'a', 's', 'p' )
+#define TTAG_GDEF  FT_MAKE_TAG( 'G', 'D', 'E', 'F' )
+#define TTAG_glyf  FT_MAKE_TAG( 'g', 'l', 'y', 'f' )
+#define TTAG_GPOS  FT_MAKE_TAG( 'G', 'P', 'O', 'S' )
+#define TTAG_GSUB  FT_MAKE_TAG( 'G', 'S', 'U', 'B' )
+#define TTAG_gvar  FT_MAKE_TAG( 'g', 'v', 'a', 'r' )
+#define TTAG_hdmx  FT_MAKE_TAG( 'h', 'd', 'm', 'x' )
+#define TTAG_head  FT_MAKE_TAG( 'h', 'e', 'a', 'd' )
+#define TTAG_hhea  FT_MAKE_TAG( 'h', 'h', 'e', 'a' )
+#define TTAG_hmtx  FT_MAKE_TAG( 'h', 'm', 't', 'x' )
+#define TTAG_JSTF  FT_MAKE_TAG( 'J', 'S', 'T', 'F' )
+#define TTAG_just  FT_MAKE_TAG( 'j', 'u', 's', 't' )
+#define TTAG_kern  FT_MAKE_TAG( 'k', 'e', 'r', 'n' )
+#define TTAG_lcar  FT_MAKE_TAG( 'l', 'c', 'a', 'r' )
+#define TTAG_loca  FT_MAKE_TAG( 'l', 'o', 'c', 'a' )
+#define TTAG_LTSH  FT_MAKE_TAG( 'L', 'T', 'S', 'H' )
+#define TTAG_LWFN  FT_MAKE_TAG( 'L', 'W', 'F', 'N' )
+#define TTAG_MATH  FT_MAKE_TAG( 'M', 'A', 'T', 'H' )
+#define TTAG_maxp  FT_MAKE_TAG( 'm', 'a', 'x', 'p' )
+#define TTAG_META  FT_MAKE_TAG( 'M', 'E', 'T', 'A' )
+#define TTAG_MMFX  FT_MAKE_TAG( 'M', 'M', 'F', 'X' )
+#define TTAG_MMSD  FT_MAKE_TAG( 'M', 'M', 'S', 'D' )
+#define TTAG_mort  FT_MAKE_TAG( 'm', 'o', 'r', 't' )
+#define TTAG_morx  FT_MAKE_TAG( 'm', 'o', 'r', 'x' )
+#define TTAG_name  FT_MAKE_TAG( 'n', 'a', 'm', 'e' )
+#define TTAG_opbd  FT_MAKE_TAG( 'o', 'p', 'b', 'd' )
+#define TTAG_OS2   FT_MAKE_TAG( 'O', 'S', '/', '2' )
+#define TTAG_OTTO  FT_MAKE_TAG( 'O', 'T', 'T', 'O' )
+#define TTAG_PCLT  FT_MAKE_TAG( 'P', 'C', 'L', 'T' )
+#define TTAG_POST  FT_MAKE_TAG( 'P', 'O', 'S', 'T' )
+#define TTAG_post  FT_MAKE_TAG( 'p', 'o', 's', 't' )
+#define TTAG_prep  FT_MAKE_TAG( 'p', 'r', 'e', 'p' )
+#define TTAG_prop  FT_MAKE_TAG( 'p', 'r', 'o', 'p' )
+#define TTAG_sfnt  FT_MAKE_TAG( 's', 'f', 'n', 't' )
+#define TTAG_SING  FT_MAKE_TAG( 'S', 'I', 'N', 'G' )
+#define TTAG_trak  FT_MAKE_TAG( 't', 'r', 'a', 'k' )
+#define TTAG_true  FT_MAKE_TAG( 't', 'r', 'u', 'e' )
+#define TTAG_ttc   FT_MAKE_TAG( 't', 't', 'c', ' ' )
+#define TTAG_ttcf  FT_MAKE_TAG( 't', 't', 'c', 'f' )
+#define TTAG_TYP1  FT_MAKE_TAG( 'T', 'Y', 'P', '1' )
+#define TTAG_typ1  FT_MAKE_TAG( 't', 'y', 'p', '1' )
+#define TTAG_VDMX  FT_MAKE_TAG( 'V', 'D', 'M', 'X' )
+#define TTAG_vhea  FT_MAKE_TAG( 'v', 'h', 'e', 'a' )
+#define TTAG_vmtx  FT_MAKE_TAG( 'v', 'm', 't', 'x' )
+
+
+FT_END_HEADER
+
+#endif /* __TTAGS_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ttunpat.h b/core/include/thirdparties/freetype/freetype/ttunpat.h
new file mode 100644
index 0000000..08e2759
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ttunpat.h
@@ -0,0 +1,59 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttunpat.h                                                              */
+/*                                                                         */
+/*    Definitions for the unpatented TrueType hinting system               */
+/*                                                                         */
+/*  Copyright 2003, 2006 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  Written by Graham Asher <graham.asher@btinternet.com>                  */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTUNPAT_H__
+#define __TTUNPAT_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /***************************************************************************
+  *
+  * @constant:
+  *   FT_PARAM_TAG_UNPATENTED_HINTING
+  *
+  * @description:
+  *   A constant used as the tag of an @FT_Parameter structure to indicate
+  *   that unpatented methods only should be used by the TrueType bytecode
+  *   interpreter for a typeface opened by @FT_Open_Face.
+  *
+  */
+#define FT_PARAM_TAG_UNPATENTED_HINTING  FT_MAKE_TAG( 'u', 'n', 'p', 'a' )
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __TTUNPAT_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/ft2build.h b/core/include/thirdparties/freetype/ft2build.h
new file mode 100644
index 0000000..134007d
--- /dev/null
+++ b/core/include/thirdparties/freetype/ft2build.h
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ft2build.h                                                             */
+/*                                                                         */
+/*    FreeType 2 build and setup macros.                                   */
+/*    (Generic version)                                                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2006 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file corresponds to the default `ft2build.h' file for            */
+  /* FreeType 2.  It uses the `freetype' include root.                     */
+  /*                                                                       */
+  /* Note that specific platforms might use a different configuration.     */
+  /* See builds/unix/ft2unix.h for an example.                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FT2_BUILD_GENERIC_H__
+#define __FT2_BUILD_GENERIC_H__
+
+#include "foxitnames.h"

+#include "freetype/config/ftheader.h"
+
+#endif /* __FT2_BUILD_GENERIC_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/libjpeg/jconfig.h b/core/include/thirdparties/libjpeg/jconfig.h
new file mode 100644
index 0000000..2f4da14
--- /dev/null
+++ b/core/include/thirdparties/libjpeg/jconfig.h
@@ -0,0 +1,45 @@
+/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */

+/* see jconfig.doc for explanations */

+

+#define HAVE_PROTOTYPES

+#define HAVE_UNSIGNED_CHAR

+#define HAVE_UNSIGNED_SHORT

+/* #define void char */

+/* #define const */

+#undef CHAR_IS_UNSIGNED

+#define HAVE_STDDEF_H

+#define HAVE_STDLIB_H

+#undef NEED_BSD_STRINGS

+#undef NEED_SYS_TYPES_H

+#undef NEED_FAR_POINTERS	/* we presume a 32-bit flat memory model */

+#undef NEED_SHORT_EXTERNAL_NAMES

+#undef INCOMPLETE_TYPES_BROKEN

+

+/* Define "boolean" as unsigned char, not int, per Windows custom */

+#ifndef __RPCNDR_H__		/* don't conflict if rpcndr.h already read */

+typedef unsigned char boolean;

+#endif

+#define HAVE_BOOLEAN		/* prevent jmorecfg.h from redefining it */

+

+

+#ifdef JPEG_INTERNALS

+

+#undef RIGHT_SHIFT_IS_UNSIGNED

+

+#endif /* JPEG_INTERNALS */

+

+#ifdef JPEG_CJPEG_DJPEG

+

+#define BMP_SUPPORTED		/* BMP image file format */

+#define GIF_SUPPORTED		/* GIF image file format */

+#define PPM_SUPPORTED		/* PBMPLUS PPM/PGM image file format */

+#undef RLE_SUPPORTED		/* Utah RLE image file format */

+#define TARGA_SUPPORTED		/* Targa image file format */

+

+#define TWO_FILE_COMMANDLINE	/* optional */

+#define USE_SETMODE		/* Microsoft has setmode() */

+#undef NEED_SIGNAL_CATCHER

+#undef DONT_USE_B_MODE

+#undef PROGRESS_REPORT		/* optional */

+

+#endif /* JPEG_CJPEG_DJPEG */

diff --git a/core/include/thirdparties/libjpeg/jerror.h b/core/include/thirdparties/libjpeg/jerror.h
new file mode 100644
index 0000000..a2b8f96
--- /dev/null
+++ b/core/include/thirdparties/libjpeg/jerror.h
@@ -0,0 +1,291 @@
+/*

+ * jerror.h

+ *

+ * Copyright (C) 1994-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file defines the error and message codes for the JPEG library.

+ * Edit this file to add new codes, or to translate the message strings to

+ * some other language.

+ * A set of error-reporting macros are defined too.  Some applications using

+ * the JPEG library may wish to include this file to get the error codes

+ * and/or the macros.

+ */

+

+/*

+ * To define the enum list of message codes, include this file without

+ * defining macro JMESSAGE.  To create a message string table, include it

+ * again with a suitable JMESSAGE definition (see jerror.c for an example).

+ */

+#ifndef JMESSAGE

+#ifndef JERROR_H

+/* First time through, define the enum list */

+#define JMAKE_ENUM_LIST

+#else

+/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */

+#define JMESSAGE(code,string)

+#endif /* JERROR_H */

+#endif /* JMESSAGE */

+

+#ifdef JMAKE_ENUM_LIST

+

+typedef enum {

+

+#define JMESSAGE(code,string)	code ,

+

+#endif /* JMAKE_ENUM_LIST */

+

+JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */

+

+/* For maintenance convenience, list is alphabetical by message code name */

+JMESSAGE(JERR_ARITH_NOTIMPL,

+	 "Sorry, there are legal restrictions on arithmetic coding")

+JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix")

+JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")

+JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode")

+JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS")

+JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range")

+JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported")

+JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition")

+JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace")

+JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace")

+JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length")

+JMESSAGE(JERR_BAD_LIB_VERSION,

+	 "Wrong JPEG library version: library is %d, caller expects %d")

+JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan")

+JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d")

+JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d")

+JMESSAGE(JERR_BAD_PROGRESSION,

+	 "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d")

+JMESSAGE(JERR_BAD_PROG_SCRIPT,

+	 "Invalid progressive parameters at scan script entry %d")

+JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors")

+JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d")

+JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d")

+JMESSAGE(JERR_BAD_STRUCT_SIZE,

+	 "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u")

+JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access")

+JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small")

+JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here")

+JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet")

+JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d")

+JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request")

+JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d")

+JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x")

+JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d")

+JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d")

+JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)")

+JMESSAGE(JERR_EMS_READ, "Read from EMS failed")

+JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed")

+JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan")

+JMESSAGE(JERR_FILE_READ, "Input file read error")

+JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")

+JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")

+JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow")

+JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")

+JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")

+JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")

+JMESSAGE(JERR_INPUT_EOF, "Premature end of input file")

+JMESSAGE(JERR_MISMATCHED_QUANT_TABLE,

+	 "Cannot transcode due to multiple use of quantization table %d")

+JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")

+JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")

+JMESSAGE(JERR_NOTIMPL, "Not implemented yet")

+JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")

+JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")

+JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")

+JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")

+JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined")

+JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x")

+JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)")

+JMESSAGE(JERR_QUANT_COMPONENTS,

+	 "Cannot quantize more than %d color components")

+JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")

+JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")

+JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")

+JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")

+JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")

+JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")

+JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF")

+JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")

+JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")

+JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")

+JMESSAGE(JERR_TFILE_WRITE,

+	 "Write failed on temporary file --- out of disk space?")

+JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines")

+JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x")

+JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up")

+JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation")

+JMESSAGE(JERR_XMS_READ, "Read from XMS failed")

+JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed")

+JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT)

+JMESSAGE(JMSG_VERSION, JVERSION)

+JMESSAGE(JTRC_16BIT_TABLES,

+	 "Caution: quantization tables are too coarse for baseline JPEG")

+JMESSAGE(JTRC_ADOBE,

+	 "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d")

+JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u")

+JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u")

+JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x")

+JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x")

+JMESSAGE(JTRC_DQT, "Define Quantization Table %d  precision %d")

+JMESSAGE(JTRC_DRI, "Define Restart Interval %u")

+JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u")

+JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u")

+JMESSAGE(JTRC_EOI, "End Of Image")

+JMESSAGE(JTRC_HUFFBITS, "        %3d %3d %3d %3d %3d %3d %3d %3d")

+JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d  %d")

+JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE,

+	 "Warning: thumbnail image size does not match data length %u")

+JMESSAGE(JTRC_JFIF_EXTENSION,

+	 "JFIF extension marker: type 0x%02x, length %u")

+JMESSAGE(JTRC_JFIF_THUMBNAIL, "    with %d x %d thumbnail image")

+JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u")

+JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x")

+JMESSAGE(JTRC_QUANTVALS, "        %4u %4u %4u %4u %4u %4u %4u %4u")

+JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors")

+JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors")

+JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization")

+JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d")

+JMESSAGE(JTRC_RST, "RST%d")

+JMESSAGE(JTRC_SMOOTH_NOTIMPL,

+	 "Smoothing not supported with nonstandard sampling ratios")

+JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d")

+JMESSAGE(JTRC_SOF_COMPONENT, "    Component %d: %dhx%dv q=%d")

+JMESSAGE(JTRC_SOI, "Start of Image")

+JMESSAGE(JTRC_SOS, "Start Of Scan: %d components")

+JMESSAGE(JTRC_SOS_COMPONENT, "    Component %d: dc=%d ac=%d")

+JMESSAGE(JTRC_SOS_PARAMS, "  Ss=%d, Se=%d, Ah=%d, Al=%d")

+JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s")

+JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s")

+JMESSAGE(JTRC_THUMB_JPEG,

+	 "JFIF extension marker: JPEG-compressed thumbnail image, length %u")

+JMESSAGE(JTRC_THUMB_PALETTE,

+	 "JFIF extension marker: palette thumbnail image, length %u")

+JMESSAGE(JTRC_THUMB_RGB,

+	 "JFIF extension marker: RGB thumbnail image, length %u")

+JMESSAGE(JTRC_UNKNOWN_IDS,

+	 "Unrecognized component IDs %d %d %d, assuming YCbCr")

+JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")

+JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")

+JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d")

+JMESSAGE(JWRN_BOGUS_PROGRESSION,

+	 "Inconsistent progression sequence for component %d coefficient %d")

+JMESSAGE(JWRN_EXTRANEOUS_DATA,

+	 "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x")

+JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment")

+JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code")

+JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d")

+JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file")

+JMESSAGE(JWRN_MUST_RESYNC,

+	 "Corrupt JPEG data: found marker 0x%02x instead of RST%d")

+JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG")

+JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines")

+

+#ifdef JMAKE_ENUM_LIST

+

+  JMSG_LASTMSGCODE

+} J_MESSAGE_CODE;

+

+#undef JMAKE_ENUM_LIST

+#endif /* JMAKE_ENUM_LIST */

+

+/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */

+#undef JMESSAGE

+

+

+#ifndef JERROR_H

+#define JERROR_H

+

+/* Macros to simplify using the error and trace message stuff */

+/* The first parameter is either type of cinfo pointer */

+

+/* Fatal errors (print message and exit) */

+#define ERREXIT(cinfo,code)  \

+  ((cinfo)->err->msg_code = (code), \

+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

+#define ERREXIT1(cinfo,code,p1)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

+#define ERREXIT2(cinfo,code,p1,p2)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (cinfo)->err->msg_parm.i[1] = (p2), \

+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

+#define ERREXIT3(cinfo,code,p1,p2,p3)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (cinfo)->err->msg_parm.i[1] = (p2), \

+   (cinfo)->err->msg_parm.i[2] = (p3), \

+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

+#define ERREXIT4(cinfo,code,p1,p2,p3,p4)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (cinfo)->err->msg_parm.i[1] = (p2), \

+   (cinfo)->err->msg_parm.i[2] = (p3), \

+   (cinfo)->err->msg_parm.i[3] = (p4), \

+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

+#define ERREXITS(cinfo,code,str)  \

+  ((cinfo)->err->msg_code = (code), \

+   FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \

+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

+

+#define MAKESTMT(stuff)		do { stuff } while (0)

+

+/* Nonfatal errors (we can keep going, but the data is probably corrupt) */

+#define WARNMS(cinfo,code)  \

+  ((cinfo)->err->msg_code = (code), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))

+#define WARNMS1(cinfo,code,p1)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))

+#define WARNMS2(cinfo,code,p1,p2)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (cinfo)->err->msg_parm.i[1] = (p2), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))

+

+/* Informational/debugging messages */

+#define TRACEMS(cinfo,lvl,code)  \

+  ((cinfo)->err->msg_code = (code), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))

+#define TRACEMS1(cinfo,lvl,code,p1)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))

+#define TRACEMS2(cinfo,lvl,code,p1,p2)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (cinfo)->err->msg_parm.i[1] = (p2), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))

+#define TRACEMS3(cinfo,lvl,code,p1,p2,p3)  \

+  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \

+	   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \

+	   (cinfo)->err->msg_code = (code); \

+	   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )

+#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4)  \

+  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \

+	   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \

+	   (cinfo)->err->msg_code = (code); \

+	   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )

+#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5)  \

+  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \

+	   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \

+	   _mp[4] = (p5); \

+	   (cinfo)->err->msg_code = (code); \

+	   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )

+#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8)  \

+  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \

+	   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \

+	   _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \

+	   (cinfo)->err->msg_code = (code); \

+	   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )

+#define TRACEMSS(cinfo,lvl,code,str)  \

+  ((cinfo)->err->msg_code = (code), \

+   FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))

+

+#endif /* JERROR_H */

diff --git a/core/include/thirdparties/libjpeg/jmorecfg.h b/core/include/thirdparties/libjpeg/jmorecfg.h
new file mode 100644
index 0000000..3602114
--- /dev/null
+++ b/core/include/thirdparties/libjpeg/jmorecfg.h
@@ -0,0 +1,376 @@
+/*

+ * jmorecfg.h

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains additional configuration options that customize the

+ * JPEG software for special applications or support machine-dependent

+ * optimizations.  Most users will not need to touch this file.

+ */

+

+#ifdef _MSC_VER

+#pragma warning (disable : 4142)

+#endif

+

+/*

+ * Define BITS_IN_JSAMPLE as either

+ *   8   for 8-bit sample values (the usual setting)

+ *   12  for 12-bit sample values

+ * Only 8 and 12 are legal data precisions for lossy JPEG according to the

+ * JPEG standard, and the IJG code does not support anything else!

+ * We do not support run-time selection of data precision, sorry.

+ */

+

+#define BITS_IN_JSAMPLE  8	/* use 8 or 12 */

+

+

+/*

+ * Maximum number of components (color channels) allowed in JPEG image.

+ * To meet the letter of the JPEG spec, set this to 255.  However, darn

+ * few applications need more than 4 channels (maybe 5 for CMYK + alpha

+ * mask).  We recommend 10 as a reasonable compromise; use 4 if you are

+ * really short on memory.  (Each allowed component costs a hundred or so

+ * bytes of storage, whether actually used in an image or not.)

+ */

+

+#define MAX_COMPONENTS  10	/* maximum number of image components */

+

+

+/*

+ * Basic data types.

+ * You may need to change these if you have a machine with unusual data

+ * type sizes; for example, "char" not 8 bits, "short" not 16 bits,

+ * or "long" not 32 bits.  We don't care whether "int" is 16 or 32 bits,

+ * but it had better be at least 16.

+ */

+

+/* Representation of a single sample (pixel element value).

+ * We frequently allocate large arrays of these, so it's important to keep

+ * them small.  But if you have memory to burn and access to char or short

+ * arrays is very slow on your hardware, you might want to change these.

+ */

+

+#if BITS_IN_JSAMPLE == 8

+/* JSAMPLE should be the smallest type that will hold the values 0..255.

+ * You can use a signed char by having GETJSAMPLE mask it with 0xFF.

+ */

+

+#ifdef HAVE_UNSIGNED_CHAR

+

+typedef unsigned char JSAMPLE;

+#define GETJSAMPLE(value)  ((int) (value))

+

+#else /* not HAVE_UNSIGNED_CHAR */

+

+typedef char JSAMPLE;

+#ifdef CHAR_IS_UNSIGNED

+#define GETJSAMPLE(value)  ((int) (value))

+#else

+#define GETJSAMPLE(value)  ((int) (value) & 0xFF)

+#endif /* CHAR_IS_UNSIGNED */

+

+#endif /* HAVE_UNSIGNED_CHAR */

+

+#define MAXJSAMPLE	255

+#define CENTERJSAMPLE	128

+

+#endif /* BITS_IN_JSAMPLE == 8 */

+

+

+#if BITS_IN_JSAMPLE == 12

+/* JSAMPLE should be the smallest type that will hold the values 0..4095.

+ * On nearly all machines "short" will do nicely.

+ */

+

+typedef short JSAMPLE;

+#define GETJSAMPLE(value)  ((int) (value))

+

+#define MAXJSAMPLE	4095

+#define CENTERJSAMPLE	2048

+

+#endif /* BITS_IN_JSAMPLE == 12 */

+

+

+/* Representation of a DCT frequency coefficient.

+ * This should be a signed value of at least 16 bits; "short" is usually OK.

+ * Again, we allocate large arrays of these, but you can change to int

+ * if you have memory to burn and "short" is really slow.

+ */

+

+typedef short JCOEF;

+

+

+/* Compressed datastreams are represented as arrays of JOCTET.

+ * These must be EXACTLY 8 bits wide, at least once they are written to

+ * external storage.  Note that when using the stdio data source/destination

+ * managers, this is also the data type passed to fread/fwrite.

+ */

+

+#ifdef HAVE_UNSIGNED_CHAR

+

+typedef unsigned char JOCTET;

+#define GETJOCTET(value)  (value)

+

+#else /* not HAVE_UNSIGNED_CHAR */

+

+typedef char JOCTET;

+#ifdef CHAR_IS_UNSIGNED

+#define GETJOCTET(value)  (value)

+#else

+#define GETJOCTET(value)  ((value) & 0xFF)

+#endif /* CHAR_IS_UNSIGNED */

+

+#endif /* HAVE_UNSIGNED_CHAR */

+

+

+/* These typedefs are used for various table entries and so forth.

+ * They must be at least as wide as specified; but making them too big

+ * won't cost a huge amount of memory, so we don't provide special

+ * extraction code like we did for JSAMPLE.  (In other words, these

+ * typedefs live at a different point on the speed/space tradeoff curve.)

+ */

+

+#if _FX_OS_ != _FX_VXWORKS_

+

+/* UINT8 must hold at least the values 0..255. */

+

+#ifdef HAVE_UNSIGNED_CHAR

+typedef unsigned char UINT8;

+#else /* not HAVE_UNSIGNED_CHAR */

+#ifdef CHAR_IS_UNSIGNED

+typedef char UINT8;

+#else /* not CHAR_IS_UNSIGNED */

+typedef short UINT8;

+#endif /* CHAR_IS_UNSIGNED */

+#endif /* HAVE_UNSIGNED_CHAR */

+

+

+/* UINT16 must hold at least the values 0..65535. */

+

+#ifdef HAVE_UNSIGNED_SHORT

+typedef unsigned short UINT16;

+#else /* not HAVE_UNSIGNED_SHORT */

+typedef unsigned int UINT16;

+#endif /* HAVE_UNSIGNED_SHORT */

+

+/* INT16 must hold at least the values -32768..32767. */

+

+#ifndef XMD_H			/* X11/xmd.h correctly defines INT16 */

+typedef short INT16;

+#endif

+

+/* INT32 must hold at least signed 32-bit values. */

+

+#ifndef XMD_H			/* X11/xmd.h correctly defines INT32 */

+typedef int INT32;

+#endif

+

+#endif 

+

+/* Datatype used for image dimensions.  The JPEG standard only supports

+ * images up to 64K*64K due to 16-bit fields in SOF markers.  Therefore

+ * "unsigned int" is sufficient on all machines.  However, if you need to

+ * handle larger images and you don't mind deviating from the spec, you

+ * can change this datatype.

+ */

+

+typedef unsigned int JDIMENSION;

+

+#define JPEG_MAX_DIMENSION  65500L  /* a tad under 64K to prevent overflows */

+

+

+/* These macros are used in all function definitions and extern declarations.

+ * You could modify them if you need to change function linkage conventions;

+ * in particular, you'll need to do that to make the library a Windows DLL.

+ * Another application is to make all functions global for use with debuggers

+ * or code profilers that require it.

+ */

+

+/* a function called through method pointers: */

+#define METHODDEF(type)		static type

+/* a function used only in its module: */

+#define LOCAL(type)		static type

+/* a function referenced thru EXTERNs: */

+#define GLOBAL(type)		type

+

+#ifdef _FX_MANAGED_CODE_

+#define EXTERN(type)		extern "C" type

+#else

+/* a reference to a GLOBAL function: */

+#define EXTERN(type)		extern type

+#endif

+

+

+/* This macro is used to declare a "method", that is, a function pointer.

+ * We want to supply prototype parameters if the compiler can cope.

+ * Note that the arglist parameter must be parenthesized!

+ * Again, you can customize this if you need special linkage keywords.

+ */

+

+#ifdef HAVE_PROTOTYPES

+#define JMETHOD(type,methodname,arglist)  type (*methodname) arglist

+#else

+#define JMETHOD(type,methodname,arglist)  type (*methodname) ()

+#endif

+

+

+/* Here is the pseudo-keyword for declaring pointers that must be "far"

+ * on 80x86 machines.  Most of the specialized coding for 80x86 is handled

+ * by just saying "FAR *" where such a pointer is needed.  In a few places

+ * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.

+ */

+

+#ifdef NEED_FAR_POINTERS

+#define FAR  far

+#else

+//#define FAR

+#endif

+

+

+/*

+ * On a few systems, type boolean and/or its values FALSE, TRUE may appear

+ * in standard header files.  Or you may have conflicts with application-

+ * specific header files that you want to include together with these files.

+ * Defining HAVE_BOOLEAN before including jpeglib.h should make it work.

+ */

+

+#ifndef HAVE_BOOLEAN

+typedef int boolean;

+#endif

+#ifndef FALSE			/* in case these macros already exist */

+#define FALSE	0		/* values of boolean */

+#endif

+#ifndef TRUE

+#define TRUE	1

+#endif

+

+

+/*

+ * The remaining options affect code selection within the JPEG library,

+ * but they don't need to be visible to most applications using the library.

+ * To minimize application namespace pollution, the symbols won't be

+ * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.

+ */

+

+#ifdef JPEG_INTERNALS

+#define JPEG_INTERNAL_OPTIONS

+#endif

+

+#ifdef JPEG_INTERNAL_OPTIONS

+

+

+/*

+ * These defines indicate whether to include various optional functions.

+ * Undefining some of these symbols will produce a smaller but less capable

+ * library.  Note that you can leave certain source files out of the

+ * compilation/linking process if you've #undef'd the corresponding symbols.

+ * (You may HAVE to do that if your compiler doesn't like null source files.)

+ */

+

+/* Arithmetic coding is unsupported for legal reasons.  Complaints to IBM. */

+

+/* Capability options common to encoder and decoder: */

+

+#define DCT_ISLOW_SUPPORTED	/* slow but accurate integer algorithm */

+#define DCT_IFAST_SUPPORTED	/* faster, less accurate integer method */

+#undef DCT_FLOAT_SUPPORTED	/* floating-point: accurate, fast on fast HW */

+

+/* Encoder capability options: */

+

+#undef  C_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */

+#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */

+#define C_PROGRESSIVE_SUPPORTED	    /* Progressive JPEG? (Requires MULTISCAN)*/

+#define ENTROPY_OPT_SUPPORTED	    /* Optimization of entropy coding parms? */

+/* Note: if you selected 12-bit data precision, it is dangerous to turn off

+ * ENTROPY_OPT_SUPPORTED.  The standard Huffman tables are only good for 8-bit

+ * precision, so jchuff.c normally uses entropy optimization to compute

+ * usable tables for higher precision.  If you don't want to do optimization,

+ * you'll have to supply different default Huffman tables.

+ * The exact same statements apply for progressive JPEG: the default tables

+ * don't work for progressive mode.  (This may get fixed, however.)

+ */

+#define INPUT_SMOOTHING_SUPPORTED   /* Input image smoothing option? */

+

+/* Decoder capability options: */

+

+#undef  D_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */

+#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */

+#define D_PROGRESSIVE_SUPPORTED	    /* Progressive JPEG? (Requires MULTISCAN)*/

+#define SAVE_MARKERS_SUPPORTED	    /* jpeg_save_markers() needed? */

+#define BLOCK_SMOOTHING_SUPPORTED   /* Block smoothing? (Progressive only) */

+#define IDCT_SCALING_SUPPORTED	    /* Output rescaling via IDCT? */

+#undef UPSAMPLE_SCALING_SUPPORTED  /* Output rescaling at upsample stage? */

+#define UPSAMPLE_MERGING_SUPPORTED  /* Fast path for sloppy upsampling? */

+#undef QUANT_1PASS_SUPPORTED	    /* 1-pass color quantization? */

+#undef QUANT_2PASS_SUPPORTED	    /* 2-pass color quantization? */

+

+/* more capability options later, no doubt */

+

+

+/*

+ * Ordering of RGB data in scanlines passed to or from the application.

+ * If your application wants to deal with data in the order B,G,R, just

+ * change these macros.  You can also deal with formats such as R,G,B,X

+ * (one extra byte per pixel) by changing RGB_PIXELSIZE.  Note that changing

+ * the offsets will also change the order in which colormap data is organized.

+ * RESTRICTIONS:

+ * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.

+ * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not

+ *    useful if you are using JPEG color spaces other than YCbCr or grayscale.

+ * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE

+ *    is not 3 (they don't understand about dummy color components!).  So you

+ *    can't use color quantization if you change that value.

+ */

+

+#define RGB_RED		0	/* Offset of Red in an RGB scanline element */

+#define RGB_GREEN	1	/* Offset of Green */

+#define RGB_BLUE	2	/* Offset of Blue */

+#define RGB_PIXELSIZE	3	/* JSAMPLEs per RGB scanline element */

+

+

+/* Definitions for speed-related optimizations. */

+

+

+/* If your compiler supports inline functions, define INLINE

+ * as the inline keyword; otherwise define it as empty.

+ */

+

+#ifndef INLINE

+#ifdef __GNUC__			/* for instance, GNU C knows about inline */

+#define INLINE __inline__

+#endif

+#ifndef INLINE

+#define INLINE			/* default is to define it as empty */

+#endif

+#endif

+

+

+/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying

+ * two 16-bit shorts is faster than multiplying two ints.  Define MULTIPLIER

+ * as short on such a machine.  MULTIPLIER must be at least 16 bits wide.

+ */

+

+#ifndef MULTIPLIER

+#define MULTIPLIER  int		/* type for fastest integer multiply */

+#endif

+

+

+/* FAST_FLOAT should be either float or double, whichever is done faster

+ * by your compiler.  (Note that this type is only used in the floating point

+ * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)

+ * Typically, float is faster in ANSI C compilers, while double is faster in

+ * pre-ANSI compilers (because they insist on converting to double anyway).

+ * The code below therefore chooses float if we have ANSI-style prototypes.

+ */

+

+#ifndef FAST_FLOAT

+#ifdef HAVE_PROTOTYPES

+#define FAST_FLOAT  float

+#else

+#define FAST_FLOAT  double

+#endif

+#endif

+

+#endif /* JPEG_INTERNAL_OPTIONS */

diff --git a/core/include/thirdparties/libjpeg/jpegint.h b/core/include/thirdparties/libjpeg/jpegint.h
new file mode 100644
index 0000000..685a361
--- /dev/null
+++ b/core/include/thirdparties/libjpeg/jpegint.h
@@ -0,0 +1,392 @@
+/*

+ * jpegint.h

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file provides common declarations for the various JPEG modules.

+ * These declarations are considered internal to the JPEG library; most

+ * applications using the library shouldn't need to include this file.

+ */

+

+

+/* Declarations for both compression & decompression */

+

+typedef enum {			/* Operating modes for buffer controllers */

+	JBUF_PASS_THRU,		/* Plain stripwise operation */

+	/* Remaining modes require a full-image buffer to have been created */

+	JBUF_SAVE_SOURCE,	/* Run source subobject only, save output */

+	JBUF_CRANK_DEST,	/* Run dest subobject only, using saved data */

+	JBUF_SAVE_AND_PASS	/* Run both subobjects, save output */

+} J_BUF_MODE;

+

+/* Values of global_state field (jdapi.c has some dependencies on ordering!) */

+#define CSTATE_START	100	/* after create_compress */

+#define CSTATE_SCANNING	101	/* start_compress done, write_scanlines OK */

+#define CSTATE_RAW_OK	102	/* start_compress done, write_raw_data OK */

+#define CSTATE_WRCOEFS	103	/* jpeg_write_coefficients done */

+#define DSTATE_START	200	/* after create_decompress */

+#define DSTATE_INHEADER	201	/* reading header markers, no SOS yet */

+#define DSTATE_READY	202	/* found SOS, ready for start_decompress */

+#define DSTATE_PRELOAD	203	/* reading multiscan file in start_decompress*/

+#define DSTATE_PRESCAN	204	/* performing dummy pass for 2-pass quant */

+#define DSTATE_SCANNING	205	/* start_decompress done, read_scanlines OK */

+#define DSTATE_RAW_OK	206	/* start_decompress done, read_raw_data OK */

+#define DSTATE_BUFIMAGE	207	/* expecting jpeg_start_output */

+#define DSTATE_BUFPOST	208	/* looking for SOS/EOI in jpeg_finish_output */

+#define DSTATE_RDCOEFS	209	/* reading file in jpeg_read_coefficients */

+#define DSTATE_STOPPING	210	/* looking for EOI in jpeg_finish_decompress */

+

+

+/* Declarations for compression modules */

+

+/* Master control module */

+struct jpeg_comp_master {

+  JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));

+  JMETHOD(void, pass_startup, (j_compress_ptr cinfo));

+  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));

+

+  /* State variables made visible to other modules */

+  boolean call_pass_startup;	/* True if pass_startup must be called */

+  boolean is_last_pass;		/* True during last pass */

+};

+

+/* Main buffer control (downsampled-data buffer) */

+struct jpeg_c_main_controller {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));

+  JMETHOD(void, process_data, (j_compress_ptr cinfo,

+			       JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,

+			       JDIMENSION in_rows_avail));

+};

+

+/* Compression preprocessing (downsampling input buffer control) */

+struct jpeg_c_prep_controller {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));

+  JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,

+				   JSAMPARRAY input_buf,

+				   JDIMENSION *in_row_ctr,

+				   JDIMENSION in_rows_avail,

+				   JSAMPIMAGE output_buf,

+				   JDIMENSION *out_row_group_ctr,

+				   JDIMENSION out_row_groups_avail));

+};

+

+/* Coefficient buffer control */

+struct jpeg_c_coef_controller {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));

+  JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,

+				   JSAMPIMAGE input_buf));

+};

+

+/* Colorspace conversion */

+struct jpeg_color_converter {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo));

+  JMETHOD(void, color_convert, (j_compress_ptr cinfo,

+				JSAMPARRAY input_buf, JSAMPIMAGE output_buf,

+				JDIMENSION output_row, int num_rows));

+};

+

+/* Downsampling */

+struct jpeg_downsampler {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo));

+  JMETHOD(void, downsample, (j_compress_ptr cinfo,

+			     JSAMPIMAGE input_buf, JDIMENSION in_row_index,

+			     JSAMPIMAGE output_buf,

+			     JDIMENSION out_row_group_index));

+

+  boolean need_context_rows;	/* TRUE if need rows above & below */

+};

+

+/* Forward DCT (also controls coefficient quantization) */

+struct jpeg_forward_dct {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo));

+  /* perhaps this should be an array??? */

+  JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,

+			      jpeg_component_info * compptr,

+			      JSAMPARRAY sample_data, JBLOCKROW coef_blocks,

+			      JDIMENSION start_row, JDIMENSION start_col,

+			      JDIMENSION num_blocks));

+};

+

+/* Entropy encoding */

+struct jpeg_entropy_encoder {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));

+  JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));

+  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));

+};

+

+/* Marker writing */

+struct jpeg_marker_writer {

+  JMETHOD(void, write_file_header, (j_compress_ptr cinfo));

+  JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));

+  JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));

+  JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));

+  JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));

+  /* These routines are exported to allow insertion of extra markers */

+  /* Probably only COM and APPn markers should be written this way */

+  JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,

+				      unsigned int datalen));

+  JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));

+};

+

+

+/* Declarations for decompression modules */

+

+/* Master control module */

+struct jpeg_decomp_master {

+  JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));

+  JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));

+

+  /* State variables made visible to other modules */

+  boolean is_dummy_pass;	/* True during 1st pass for 2-pass quant */

+};

+

+/* Input control module */

+struct jpeg_input_controller {

+  JMETHOD(int, consume_input, (j_decompress_ptr cinfo));

+  JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));

+  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));

+  JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));

+

+  /* State variables made visible to other modules */

+  boolean has_multiple_scans;	/* True if file has multiple scans */

+  boolean eoi_reached;		/* True when EOI has been consumed */

+};

+

+/* Main buffer control (downsampled-data buffer) */

+struct jpeg_d_main_controller {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));

+  JMETHOD(void, process_data, (j_decompress_ptr cinfo,

+			       JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+			       JDIMENSION out_rows_avail));

+};

+

+/* Coefficient buffer control */

+struct jpeg_d_coef_controller {

+  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));

+  JMETHOD(int, consume_data, (j_decompress_ptr cinfo));

+  JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));

+  JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,

+				 JSAMPIMAGE output_buf));

+  /* Pointer to array of coefficient virtual arrays, or NULL if none */

+  jvirt_barray_ptr *coef_arrays;

+};

+

+/* Decompression postprocessing (color quantization buffer control) */

+struct jpeg_d_post_controller {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));

+  JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,

+				    JSAMPIMAGE input_buf,

+				    JDIMENSION *in_row_group_ctr,

+				    JDIMENSION in_row_groups_avail,

+				    JSAMPARRAY output_buf,

+				    JDIMENSION *out_row_ctr,

+				    JDIMENSION out_rows_avail));

+};

+

+/* Marker reading & parsing */

+struct jpeg_marker_reader {

+  JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));

+  /* Read markers until SOS or EOI.

+   * Returns same codes as are defined for jpeg_consume_input:

+   * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.

+   */

+  JMETHOD(int, read_markers, (j_decompress_ptr cinfo));

+  /* Read a restart marker --- exported for use by entropy decoder only */

+  jpeg_marker_parser_method read_restart_marker;

+

+  /* State of marker reader --- nominally internal, but applications

+   * supplying COM or APPn handlers might like to know the state.

+   */

+  boolean saw_SOI;		/* found SOI? */

+  boolean saw_SOF;		/* found SOF? */

+  int next_restart_num;		/* next restart number expected (0-7) */

+  unsigned int discarded_bytes;	/* # of bytes skipped looking for a marker */

+};

+

+/* Entropy decoding */

+struct jpeg_entropy_decoder {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));

+  JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,

+				JBLOCKROW *MCU_data));

+

+  /* This is here to share code between baseline and progressive decoders; */

+  /* other modules probably should not use it */

+  boolean insufficient_data;	/* set TRUE after emitting warning */

+};

+

+/* Inverse DCT (also performs dequantization) */

+typedef JMETHOD(void, inverse_DCT_method_ptr,

+		(j_decompress_ptr cinfo, jpeg_component_info * compptr,

+		 JCOEFPTR coef_block,

+		 JSAMPARRAY output_buf, JDIMENSION output_col));

+

+struct jpeg_inverse_dct {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));

+  /* It is useful to allow each component to have a separate IDCT method. */

+  inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];

+};

+

+/* Upsampling (note that upsampler must also call color converter) */

+struct jpeg_upsampler {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));

+  JMETHOD(void, upsample, (j_decompress_ptr cinfo,

+			   JSAMPIMAGE input_buf,

+			   JDIMENSION *in_row_group_ctr,

+			   JDIMENSION in_row_groups_avail,

+			   JSAMPARRAY output_buf,

+			   JDIMENSION *out_row_ctr,

+			   JDIMENSION out_rows_avail));

+

+  boolean need_context_rows;	/* TRUE if need rows above & below */

+};

+

+/* Colorspace conversion */

+struct jpeg_color_deconverter {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));

+  JMETHOD(void, color_convert, (j_decompress_ptr cinfo,

+				JSAMPIMAGE input_buf, JDIMENSION input_row,

+				JSAMPARRAY output_buf, int num_rows));

+};

+

+/* Color quantization or color precision reduction */

+struct jpeg_color_quantizer {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));

+  JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,

+				 JSAMPARRAY input_buf, JSAMPARRAY output_buf,

+				 int num_rows));

+  JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));

+  JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));

+};

+

+

+/* Miscellaneous useful macros */

+

+#undef MAX

+#define MAX(a,b)	((a) > (b) ? (a) : (b))

+#undef MIN

+#define MIN(a,b)	((a) < (b) ? (a) : (b))

+

+

+/* We assume that right shift corresponds to signed division by 2 with

+ * rounding towards minus infinity.  This is correct for typical "arithmetic

+ * shift" instructions that shift in copies of the sign bit.  But some

+ * C compilers implement >> with an unsigned shift.  For these machines you

+ * must define RIGHT_SHIFT_IS_UNSIGNED.

+ * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.

+ * It is only applied with constant shift counts.  SHIFT_TEMPS must be

+ * included in the variables of any routine using RIGHT_SHIFT.

+ */

+

+#ifdef RIGHT_SHIFT_IS_UNSIGNED

+#define SHIFT_TEMPS	INT32 shift_temp;

+#define RIGHT_SHIFT(x,shft)  \

+	((shift_temp = (x)) < 0 ? \

+	 (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \

+	 (shift_temp >> (shft)))

+#else

+#define SHIFT_TEMPS

+#define RIGHT_SHIFT(x,shft)	((x) >> (shft))

+#endif

+

+

+/* Short forms of external names for systems with brain-damaged linkers. */

+

+#ifdef NEED_SHORT_EXTERNAL_NAMES

+#define jinit_compress_master	jICompress

+#define jinit_c_master_control	jICMaster

+#define jinit_c_main_controller	jICMainC

+#define jinit_c_prep_controller	jICPrepC

+#define jinit_c_coef_controller	jICCoefC

+#define jinit_color_converter	jICColor

+#define jinit_downsampler	jIDownsampler

+#define jinit_forward_dct	jIFDCT

+#define jinit_huff_encoder	jIHEncoder

+#define jinit_phuff_encoder	jIPHEncoder

+#define jinit_marker_writer	jIMWriter

+#define jinit_master_decompress	jIDMaster

+#define jinit_d_main_controller	jIDMainC

+#define jinit_d_coef_controller	jIDCoefC

+#define jinit_d_post_controller	jIDPostC

+#define jinit_input_controller	jIInCtlr

+#define jinit_marker_reader	jIMReader

+#define jinit_huff_decoder	jIHDecoder

+#define jinit_phuff_decoder	jIPHDecoder

+#define jinit_inverse_dct	jIIDCT

+#define jinit_upsampler		jIUpsampler

+#define jinit_color_deconverter	jIDColor

+#define jinit_1pass_quantizer	jI1Quant

+#define jinit_2pass_quantizer	jI2Quant

+#define jinit_merged_upsampler	jIMUpsampler

+#define jinit_memory_mgr	jIMemMgr

+#define jdiv_round_up		jDivRound

+#define jround_up		jRound

+#define jcopy_sample_rows	jCopySamples

+#define jcopy_block_row		jCopyBlocks

+#define jzero_far		jZeroFar

+#define jpeg_zigzag_order	jZIGTable

+#define jpeg_natural_order	jZAGTable

+#endif /* NEED_SHORT_EXTERNAL_NAMES */

+

+

+/* Compression module initialization routines */

+EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));

+EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,

+					 boolean transcode_only));

+EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,

+					  boolean need_full_buffer));

+EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,

+					  boolean need_full_buffer));

+EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,

+					  boolean need_full_buffer));

+EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));

+EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));

+EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));

+EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));

+EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));

+EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));

+/* Decompression module initialization routines */

+EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,

+					  boolean need_full_buffer));

+EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,

+					  boolean need_full_buffer));

+EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,

+					  boolean need_full_buffer));

+EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));

+/* Memory manager initialization */

+EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));

+

+/* Utility routines in jutils.c */

+EXTERN(long) jdiv_round_up JPP((long a, long b));

+EXTERN(long) jround_up JPP((long a, long b));

+EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,

+				    JSAMPARRAY output_array, int dest_row,

+				    int num_rows, JDIMENSION num_cols));

+EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,

+				  JDIMENSION num_blocks));

+EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));

+/* Constant tables in jutils.c */

+#if 0				/* This table is not actually needed in v6a */

+extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */

+#endif

+extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */

+

+/* Suppress undefined-structure complaints if necessary. */

+

+#ifdef INCOMPLETE_TYPES_BROKEN

+#ifndef AM_MEMORY_MANAGER	/* only jmemmgr.c defines these */

+struct jvirt_sarray_control { long dummy; };

+struct jvirt_barray_control { long dummy; };

+#endif

+#endif /* INCOMPLETE_TYPES_BROKEN */

diff --git a/core/include/thirdparties/libjpeg/jpeglib.h b/core/include/thirdparties/libjpeg/jpeglib.h
new file mode 100644
index 0000000..ac2aff9
--- /dev/null
+++ b/core/include/thirdparties/libjpeg/jpeglib.h
@@ -0,0 +1,1165 @@
+/*

+ * jpeglib.h

+ *

+ * Copyright (C) 1991-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file defines the application interface for the JPEG library.

+ * Most applications using the library need only include this file,

+ * and perhaps jerror.h if they want to know the exact error codes.

+ */

+

+#ifndef JPEGLIB_H

+#define JPEGLIB_H

+

+#define FOXIT_PREFIX(origName)  FPDFAPIJPEG_##origName

+

+#define jcopy_block_row FOXIT_PREFIX(jcopy_block_row)

+#define jcopy_sample_rows FOXIT_PREFIX(jcopy_sample_rows)

+#define jdiv_round_up FOXIT_PREFIX(jdiv_round_up)

+#define jinit_1pass_quantizer FOXIT_PREFIX(jinit_1pass_quantizer)

+#define jinit_2pass_quantizer FOXIT_PREFIX(jinit_2pass_quantizer)

+#define jinit_color_deconverter FOXIT_PREFIX(jinit_color_deconverter)

+#define jinit_d_coef_controller FOXIT_PREFIX(jinit_d_coef_controller)

+#define jinit_d_main_controller FOXIT_PREFIX(jinit_d_main_controller)

+#define jinit_d_post_controller FOXIT_PREFIX(jinit_d_post_controller)

+#define jinit_huff_decoder FOXIT_PREFIX(jinit_huff_decoder)

+#define jinit_input_controller FOXIT_PREFIX(jinit_input_controller)

+#define jinit_inverse_dct FOXIT_PREFIX(jinit_inverse_dct)

+#define jinit_marker_reader FOXIT_PREFIX(jinit_marker_reader)

+#define jinit_master_decompress FOXIT_PREFIX(jinit_master_decompress)

+#define jinit_memory_mgr FOXIT_PREFIX(jinit_memory_mgr)

+#define jinit_merged_upsampler FOXIT_PREFIX(jinit_merged_upsampler)

+#define jinit_phuff_decoder FOXIT_PREFIX(jinit_phuff_decoder)

+#define jinit_upsampler FOXIT_PREFIX(jinit_upsampler)

+#define jpeg_CreateDecompress FOXIT_PREFIX(jpeg_CreateDecompress)

+#define jpeg_abort FOXIT_PREFIX(jpeg_abort)

+#define jpeg_abort_decompress FOXIT_PREFIX(jpeg_abort_decompress)

+#define jpeg_alloc_huff_table FOXIT_PREFIX(jpeg_alloc_huff_table)

+#define jpeg_alloc_quant_table FOXIT_PREFIX(jpeg_alloc_quant_table)

+#define jpeg_calc_output_dimensions FOXIT_PREFIX(jpeg_calc_output_dimensions)

+#define jpeg_consume_input FOXIT_PREFIX(jpeg_consume_input)

+#define jpeg_destroy FOXIT_PREFIX(jpeg_destroy)

+#define jpeg_destroy_decompress FOXIT_PREFIX(jpeg_destroy_decompress)

+#define jpeg_fill_bit_buffer FOXIT_PREFIX(jpeg_fill_bit_buffer)

+#define jpeg_finish_decompress FOXIT_PREFIX(jpeg_finish_decompress)

+#define jpeg_finish_output FOXIT_PREFIX(jpeg_finish_output)

+#define jpeg_free_large FOXIT_PREFIX(jpeg_free_large)

+#define jpeg_free_small FOXIT_PREFIX(jpeg_free_small)

+#define jpeg_get_large FOXIT_PREFIX(jpeg_get_large)

+#define jpeg_get_small FOXIT_PREFIX(jpeg_get_small)

+#define jpeg_has_multiple_scans FOXIT_PREFIX(jpeg_has_multiple_scans)

+#define jpeg_huff_decode FOXIT_PREFIX(jpeg_huff_decode)

+#define jpeg_idct_1x1 FOXIT_PREFIX(jpeg_idct_1x1)

+#define jpeg_idct_2x2 FOXIT_PREFIX(jpeg_idct_2x2)

+#define jpeg_idct_4x4 FOXIT_PREFIX(jpeg_idct_4x4)

+#define jpeg_idct_float FOXIT_PREFIX(jpeg_idct_float)

+#define jpeg_idct_ifast FOXIT_PREFIX(jpeg_idct_ifast)

+#define jpeg_idct_islow FOXIT_PREFIX(jpeg_idct_islow)

+#define jpeg_input_complete FOXIT_PREFIX(jpeg_input_complete)

+#define jpeg_make_d_derived_tbl FOXIT_PREFIX(jpeg_make_d_derived_tbl)

+#define jpeg_mem_available FOXIT_PREFIX(jpeg_mem_available)

+#define jpeg_mem_init FOXIT_PREFIX(jpeg_mem_init)

+#define jpeg_mem_term FOXIT_PREFIX(jpeg_mem_term)

+#define jpeg_natural_order FOXIT_PREFIX(jpeg_natural_order)

+#define jpeg_new_colormap FOXIT_PREFIX(jpeg_new_colormap)

+#define jpeg_open_backing_store FOXIT_PREFIX(jpeg_open_backing_store)

+#define jpeg_read_coefficients FOXIT_PREFIX(jpeg_read_coefficients)

+#define jpeg_read_header FOXIT_PREFIX(jpeg_read_header)

+#define jpeg_read_raw_data FOXIT_PREFIX(jpeg_read_raw_data)

+#define jpeg_read_scanlines FOXIT_PREFIX(jpeg_read_scanlines)

+#define jpeg_resync_to_restart FOXIT_PREFIX(jpeg_resync_to_restart)

+#define jpeg_save_markers FOXIT_PREFIX(jpeg_save_markers)

+#define jpeg_set_marker_processor FOXIT_PREFIX(jpeg_set_marker_processor)

+#define jpeg_start_decompress FOXIT_PREFIX(jpeg_start_decompress)

+#define jpeg_start_output FOXIT_PREFIX(jpeg_start_output)

+#define jpeg_std_error FOXIT_PREFIX(jpeg_std_error)

+#define jpeg_std_message_table FOXIT_PREFIX(jpeg_std_message_table)

+#define jpeg_stdio_src FOXIT_PREFIX(jpeg_stdio_src)

+#define jround_up FOXIT_PREFIX(jround_up)

+#define jzero_far FOXIT_PREFIX(jzero_far)

+

+ /*

+ * First we include the configuration files that record how this

+ * installation of the JPEG library is set up.  jconfig.h can be

+ * generated automatically for many systems.  jmorecfg.h contains

+ * manual configuration options that most people need not worry about.

+ */

+

+#ifndef JCONFIG_INCLUDED	/* in case jinclude.h already did */

+#include "jconfig.h"		/* widely used configuration options */

+#endif

+#include "jmorecfg.h"		/* seldom changed options */

+

+

+/* Version ID for the JPEG library.

+ * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60".

+ */

+

+#define JPEG_LIB_VERSION  62	/* Version 6b */

+

+

+/* Various constants determining the sizes of things.

+ * All of these are specified by the JPEG standard, so don't change them

+ * if you want to be compatible.

+ */

+

+#define DCTSIZE		    8	/* The basic DCT block is 8x8 samples */

+#define DCTSIZE2	    64	/* DCTSIZE squared; # of elements in a block */

+#define NUM_QUANT_TBLS      4	/* Quantization tables are numbered 0..3 */

+#define NUM_HUFF_TBLS       4	/* Huffman tables are numbered 0..3 */

+#define NUM_ARITH_TBLS      16	/* Arith-coding tables are numbered 0..15 */

+#define MAX_COMPS_IN_SCAN   4	/* JPEG limit on # of components in one scan */

+#define MAX_SAMP_FACTOR     4	/* JPEG limit on sampling factors */

+/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard;

+ * the PostScript DCT filter can emit files with many more than 10 blocks/MCU.

+ * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU

+ * to handle it.  We even let you do this from the jconfig.h file.  However,

+ * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe

+ * sometimes emits noncompliant files doesn't mean you should too.

+ */

+#define C_MAX_BLOCKS_IN_MCU   10 /* compressor's limit on blocks per MCU */

+#ifndef D_MAX_BLOCKS_IN_MCU

+#define D_MAX_BLOCKS_IN_MCU   10 /* decompressor's limit on blocks per MCU */

+#endif

+

+

+/* Data structures for images (arrays of samples and of DCT coefficients).

+ * On 80x86 machines, the image arrays are too big for near pointers,

+ * but the pointer arrays can fit in near memory.

+ */

+

+typedef JSAMPLE  *JSAMPROW;	/* ptr to one image row of pixel samples. */

+typedef JSAMPROW *JSAMPARRAY;	/* ptr to some rows (a 2-D sample array) */

+typedef JSAMPARRAY *JSAMPIMAGE;	/* a 3-D sample array: top index is color */

+

+typedef JCOEF JBLOCK[DCTSIZE2];	/* one block of coefficients */

+typedef JBLOCK  *JBLOCKROW;	/* pointer to one row of coefficient blocks */

+typedef JBLOCKROW *JBLOCKARRAY;		/* a 2-D array of coefficient blocks */

+typedef JBLOCKARRAY *JBLOCKIMAGE;	/* a 3-D array of coefficient blocks */

+

+typedef JCOEF  *JCOEFPTR;	/* useful in a couple of places */

+

+

+/* Types for JPEG compression parameters and working tables. */

+

+

+/* DCT coefficient quantization tables. */

+

+typedef struct {

+  /* This array gives the coefficient quantizers in natural array order

+   * (not the zigzag order in which they are stored in a JPEG DQT marker).

+   * CAUTION: IJG versions prior to v6a kept this array in zigzag order.

+   */

+  UINT16 quantval[DCTSIZE2];	/* quantization step for each coefficient */

+  /* This field is used only during compression.  It's initialized FALSE when

+   * the table is created, and set TRUE when it's been output to the file.

+   * You could suppress output of a table by setting this to TRUE.

+   * (See jpeg_suppress_tables for an example.)

+   */

+  boolean sent_table;		/* TRUE when table has been output */

+} JQUANT_TBL;

+

+

+/* Huffman coding tables. */

+

+typedef struct {

+  /* These two fields directly represent the contents of a JPEG DHT marker */

+  UINT8 bits[17];		/* bits[k] = # of symbols with codes of */

+				/* length k bits; bits[0] is unused */

+  UINT8 huffval[256];		/* The symbols, in order of incr code length */

+  /* This field is used only during compression.  It's initialized FALSE when

+   * the table is created, and set TRUE when it's been output to the file.

+   * You could suppress output of a table by setting this to TRUE.

+   * (See jpeg_suppress_tables for an example.)

+   */

+  boolean sent_table;		/* TRUE when table has been output */

+} JHUFF_TBL;

+

+

+/* Basic info about one component (color channel). */

+

+typedef struct {

+  /* These values are fixed over the whole image. */

+  /* For compression, they must be supplied by parameter setup; */

+  /* for decompression, they are read from the SOF marker. */

+  int component_id;		/* identifier for this component (0..255) */

+  int component_index;		/* its index in SOF or cinfo->comp_info[] */

+  int h_samp_factor;		/* horizontal sampling factor (1..4) */

+  int v_samp_factor;		/* vertical sampling factor (1..4) */

+  int quant_tbl_no;		/* quantization table selector (0..3) */

+  /* These values may vary between scans. */

+  /* For compression, they must be supplied by parameter setup; */

+  /* for decompression, they are read from the SOS marker. */

+  /* The decompressor output side may not use these variables. */

+  int dc_tbl_no;		/* DC entropy table selector (0..3) */

+  int ac_tbl_no;		/* AC entropy table selector (0..3) */

+  

+  /* Remaining fields should be treated as private by applications. */

+  

+  /* These values are computed during compression or decompression startup: */

+  /* Component's size in DCT blocks.

+   * Any dummy blocks added to complete an MCU are not counted; therefore

+   * these values do not depend on whether a scan is interleaved or not.

+   */

+  JDIMENSION width_in_blocks;

+  JDIMENSION height_in_blocks;

+  /* Size of a DCT block in samples.  Always DCTSIZE for compression.

+   * For decompression this is the size of the output from one DCT block,

+   * reflecting any scaling we choose to apply during the IDCT step.

+   * Values of 1,2,4,8 are likely to be supported.  Note that different

+   * components may receive different IDCT scalings.

+   */

+  int DCT_scaled_size;

+  /* The downsampled dimensions are the component's actual, unpadded number

+   * of samples at the main buffer (preprocessing/compression interface), thus

+   * downsampled_width = ceil(image_width * Hi/Hmax)

+   * and similarly for height.  For decompression, IDCT scaling is included, so

+   * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE)

+   */

+  JDIMENSION downsampled_width;	 /* actual width in samples */

+  JDIMENSION downsampled_height; /* actual height in samples */

+  /* This flag is used only for decompression.  In cases where some of the

+   * components will be ignored (eg grayscale output from YCbCr image),

+   * we can skip most computations for the unused components.

+   */

+  boolean component_needed;	/* do we need the value of this component? */

+

+  /* These values are computed before starting a scan of the component. */

+  /* The decompressor output side may not use these variables. */

+  int MCU_width;		/* number of blocks per MCU, horizontally */

+  int MCU_height;		/* number of blocks per MCU, vertically */

+  int MCU_blocks;		/* MCU_width * MCU_height */

+  int MCU_sample_width;		/* MCU width in samples, MCU_width*DCT_scaled_size */

+  int last_col_width;		/* # of non-dummy blocks across in last MCU */

+  int last_row_height;		/* # of non-dummy blocks down in last MCU */

+

+  /* Saved quantization table for component; NULL if none yet saved.

+   * See jdinput.c comments about the need for this information.

+   * This field is currently used only for decompression.

+   */

+  JQUANT_TBL * quant_table;

+

+  /* Private per-component storage for DCT or IDCT subsystem. */

+  void * dct_table;

+} jpeg_component_info;

+

+

+/* The script for encoding a multiple-scan file is an array of these: */

+

+typedef struct {

+  int comps_in_scan;		/* number of components encoded in this scan */

+  int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */

+  int Ss, Se;			/* progressive JPEG spectral selection parms */

+  int Ah, Al;			/* progressive JPEG successive approx. parms */

+} jpeg_scan_info;

+

+/* The decompressor can save APPn and COM markers in a list of these: */

+

+typedef struct jpeg_marker_struct  * jpeg_saved_marker_ptr;

+

+struct jpeg_marker_struct {

+  jpeg_saved_marker_ptr next;	/* next in list, or NULL */

+  UINT8 marker;			/* marker code: JPEG_COM, or JPEG_APP0+n */

+  unsigned int original_length;	/* # bytes of data in the file */

+  unsigned int data_length;	/* # bytes of data saved at data[] */

+  JOCTET  * data;		/* the data contained in the marker */

+  /* the marker length word is not counted in data_length or original_length */

+};

+

+/* Known color spaces. */

+

+typedef enum {

+	JCS_UNKNOWN,		/* error/unspecified */

+	JCS_GRAYSCALE,		/* monochrome */

+	JCS_RGB,		/* red/green/blue */

+	JCS_YCbCr,		/* Y/Cb/Cr (also known as YUV) */

+	JCS_CMYK,		/* C/M/Y/K */

+	JCS_YCCK		/* Y/Cb/Cr/K */

+} J_COLOR_SPACE;

+

+/* DCT/IDCT algorithm options. */

+

+typedef enum {

+	JDCT_ISLOW,		/* slow but accurate integer algorithm */

+	JDCT_IFAST,		/* faster, less accurate integer method */

+	JDCT_FLOAT		/* floating-point: accurate, fast on fast HW */

+} J_DCT_METHOD;

+

+#ifndef JDCT_DEFAULT		/* may be overridden in jconfig.h */

+#define JDCT_DEFAULT  JDCT_ISLOW

+#endif

+#ifndef JDCT_FASTEST		/* may be overridden in jconfig.h */

+#define JDCT_FASTEST  JDCT_IFAST

+#endif

+

+/* Dithering options for decompression. */

+

+typedef enum {

+	JDITHER_NONE,		/* no dithering */

+	JDITHER_ORDERED,	/* simple ordered dither */

+	JDITHER_FS		/* Floyd-Steinberg error diffusion dither */

+} J_DITHER_MODE;

+

+

+/* Common fields between JPEG compression and decompression master structs. */

+

+#define jpeg_common_fields \

+  struct jpeg_error_mgr * err;	/* Error handler module */\

+  struct jpeg_memory_mgr * mem;	/* Memory manager module */\

+  struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\

+  void * client_data;		/* Available for use by application */\

+  boolean is_decompressor;	/* So common code can tell which is which */\

+  int global_state		/* For checking call sequence validity */

+

+/* Routines that are to be used by both halves of the library are declared

+ * to receive a pointer to this structure.  There are no actual instances of

+ * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct.

+ */

+struct jpeg_common_struct {

+  jpeg_common_fields;		/* Fields common to both master struct types */

+  /* Additional fields follow in an actual jpeg_compress_struct or

+   * jpeg_decompress_struct.  All three structs must agree on these

+   * initial fields!  (This would be a lot cleaner in C++.)

+   */

+};

+

+typedef struct jpeg_common_struct * j_common_ptr;

+typedef struct jpeg_compress_struct * j_compress_ptr;

+typedef struct jpeg_decompress_struct * j_decompress_ptr;

+

+

+/* Master record for a compression instance */

+

+struct jpeg_compress_struct {

+  jpeg_common_fields;		/* Fields shared with jpeg_decompress_struct */

+

+  /* Destination for compressed data */

+  struct jpeg_destination_mgr * dest;

+

+  /* Description of source image --- these fields must be filled in by

+   * outer application before starting compression.  in_color_space must

+   * be correct before you can even call jpeg_set_defaults().

+   */

+

+  JDIMENSION image_width;	/* input image width */

+  JDIMENSION image_height;	/* input image height */

+  int input_components;		/* # of color components in input image */

+  J_COLOR_SPACE in_color_space;	/* colorspace of input image */

+

+  double input_gamma;		/* image gamma of input image */

+

+  /* Compression parameters --- these fields must be set before calling

+   * jpeg_start_compress().  We recommend calling jpeg_set_defaults() to

+   * initialize everything to reasonable defaults, then changing anything

+   * the application specifically wants to change.  That way you won't get

+   * burnt when new parameters are added.  Also note that there are several

+   * helper routines to simplify changing parameters.

+   */

+

+  int data_precision;		/* bits of precision in image data */

+

+  int num_components;		/* # of color components in JPEG image */

+  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */

+

+  jpeg_component_info * comp_info;

+  /* comp_info[i] describes component that appears i'th in SOF */

+  

+  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];

+  /* ptrs to coefficient quantization tables, or NULL if not defined */

+  

+  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];

+  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];

+  /* ptrs to Huffman coding tables, or NULL if not defined */

+  

+  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */

+  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */

+  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */

+

+  int num_scans;		/* # of entries in scan_info array */

+  const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */

+  /* The default value of scan_info is NULL, which causes a single-scan

+   * sequential JPEG file to be emitted.  To create a multi-scan file,

+   * set num_scans and scan_info to point to an array of scan definitions.

+   */

+

+  boolean raw_data_in;		/* TRUE=caller supplies downsampled data */

+  boolean arith_code;		/* TRUE=arithmetic coding, FALSE=Huffman */

+  boolean optimize_coding;	/* TRUE=optimize entropy encoding parms */

+  boolean CCIR601_sampling;	/* TRUE=first samples are cosited */

+  int smoothing_factor;		/* 1..100, or 0 for no input smoothing */

+  J_DCT_METHOD dct_method;	/* DCT algorithm selector */

+

+  /* The restart interval can be specified in absolute MCUs by setting

+   * restart_interval, or in MCU rows by setting restart_in_rows

+   * (in which case the correct restart_interval will be figured

+   * for each scan).

+   */

+  unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */

+  int restart_in_rows;		/* if > 0, MCU rows per restart interval */

+

+  /* Parameters controlling emission of special markers. */

+

+  boolean write_JFIF_header;	/* should a JFIF marker be written? */

+  UINT8 JFIF_major_version;	/* What to write for the JFIF version number */

+  UINT8 JFIF_minor_version;

+  /* These three values are not used by the JPEG code, merely copied */

+  /* into the JFIF APP0 marker.  density_unit can be 0 for unknown, */

+  /* 1 for dots/inch, or 2 for dots/cm.  Note that the pixel aspect */

+  /* ratio is defined by X_density/Y_density even when density_unit=0. */

+  UINT8 density_unit;		/* JFIF code for pixel size units */

+  UINT16 X_density;		/* Horizontal pixel density */

+  UINT16 Y_density;		/* Vertical pixel density */

+  boolean write_Adobe_marker;	/* should an Adobe marker be written? */

+  

+  /* State variable: index of next scanline to be written to

+   * jpeg_write_scanlines().  Application may use this to control its

+   * processing loop, e.g., "while (next_scanline < image_height)".

+   */

+

+  JDIMENSION next_scanline;	/* 0 .. image_height-1  */

+

+  /* Remaining fields are known throughout compressor, but generally

+   * should not be touched by a surrounding application.

+   */

+

+  /*

+   * These fields are computed during compression startup

+   */

+  boolean progressive_mode;	/* TRUE if scan script uses progressive mode */

+  int max_h_samp_factor;	/* largest h_samp_factor */

+  int max_v_samp_factor;	/* largest v_samp_factor */

+

+  JDIMENSION total_iMCU_rows;	/* # of iMCU rows to be input to coef ctlr */

+  /* The coefficient controller receives data in units of MCU rows as defined

+   * for fully interleaved scans (whether the JPEG file is interleaved or not).

+   * There are v_samp_factor * DCTSIZE sample rows of each component in an

+   * "iMCU" (interleaved MCU) row.

+   */

+  

+  /*

+   * These fields are valid during any one scan.

+   * They describe the components and MCUs actually appearing in the scan.

+   */

+  int comps_in_scan;		/* # of JPEG components in this scan */

+  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];

+  /* *cur_comp_info[i] describes component that appears i'th in SOS */

+  

+  JDIMENSION MCUs_per_row;	/* # of MCUs across the image */

+  JDIMENSION MCU_rows_in_scan;	/* # of MCU rows in the image */

+  

+  int blocks_in_MCU;		/* # of DCT blocks per MCU */

+  int MCU_membership[C_MAX_BLOCKS_IN_MCU];

+  /* MCU_membership[i] is index in cur_comp_info of component owning */

+  /* i'th block in an MCU */

+

+  int Ss, Se, Ah, Al;		/* progressive JPEG parameters for scan */

+

+  /*

+   * Links to compression subobjects (methods and private variables of modules)

+   */

+  struct jpeg_comp_master * master;

+  struct jpeg_c_main_controller * main;

+  struct jpeg_c_prep_controller * prep;

+  struct jpeg_c_coef_controller * coef;

+  struct jpeg_marker_writer * marker;

+  struct jpeg_color_converter * cconvert;

+  struct jpeg_downsampler * downsample;

+  struct jpeg_forward_dct * fdct;

+  struct jpeg_entropy_encoder * entropy;

+  jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */

+  int script_space_size;

+};

+

+

+/* Master record for a decompression instance */

+

+struct jpeg_decompress_struct {

+  jpeg_common_fields;		/* Fields shared with jpeg_compress_struct */

+

+  /* Source of compressed data */

+  struct jpeg_source_mgr * src;

+

+  /* Basic description of image --- filled in by jpeg_read_header(). */

+  /* Application may inspect these values to decide how to process image. */

+

+  JDIMENSION image_width;	/* nominal image width (from SOF marker) */

+  JDIMENSION image_height;	/* nominal image height */

+  int num_components;		/* # of color components in JPEG image */

+  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */

+

+  /* Decompression processing parameters --- these fields must be set before

+   * calling jpeg_start_decompress().  Note that jpeg_read_header() initializes

+   * them to default values.

+   */

+

+  J_COLOR_SPACE out_color_space; /* colorspace for output */

+

+  unsigned int scale_num, scale_denom; /* fraction by which to scale image */

+

+  double output_gamma;		/* image gamma wanted in output */

+

+  boolean buffered_image;	/* TRUE=multiple output passes */

+  boolean raw_data_out;		/* TRUE=downsampled data wanted */

+

+  J_DCT_METHOD dct_method;	/* IDCT algorithm selector */

+  boolean do_fancy_upsampling;	/* TRUE=apply fancy upsampling */

+  boolean do_block_smoothing;	/* TRUE=apply interblock smoothing */

+

+  boolean quantize_colors;	/* TRUE=colormapped output wanted */

+  /* the following are ignored if not quantize_colors: */

+  J_DITHER_MODE dither_mode;	/* type of color dithering to use */

+  boolean two_pass_quantize;	/* TRUE=use two-pass color quantization */

+  int desired_number_of_colors;	/* max # colors to use in created colormap */

+  /* these are significant only in buffered-image mode: */

+  boolean enable_1pass_quant;	/* enable future use of 1-pass quantizer */

+  boolean enable_external_quant;/* enable future use of external colormap */

+  boolean enable_2pass_quant;	/* enable future use of 2-pass quantizer */

+

+  /* Description of actual output image that will be returned to application.

+   * These fields are computed by jpeg_start_decompress().

+   * You can also use jpeg_calc_output_dimensions() to determine these values

+   * in advance of calling jpeg_start_decompress().

+   */

+

+  JDIMENSION output_width;	/* scaled image width */

+  JDIMENSION output_height;	/* scaled image height */

+  int out_color_components;	/* # of color components in out_color_space */

+  int output_components;	/* # of color components returned */

+  /* output_components is 1 (a colormap index) when quantizing colors;

+   * otherwise it equals out_color_components.

+   */

+  int rec_outbuf_height;	/* min recommended height of scanline buffer */

+  /* If the buffer passed to jpeg_read_scanlines() is less than this many rows

+   * high, space and time will be wasted due to unnecessary data copying.

+   * Usually rec_outbuf_height will be 1 or 2, at most 4.

+   */

+

+  /* When quantizing colors, the output colormap is described by these fields.

+   * The application can supply a colormap by setting colormap non-NULL before

+   * calling jpeg_start_decompress; otherwise a colormap is created during

+   * jpeg_start_decompress or jpeg_start_output.

+   * The map has out_color_components rows and actual_number_of_colors columns.

+   */

+  int actual_number_of_colors;	/* number of entries in use */

+  JSAMPARRAY colormap;		/* The color map as a 2-D pixel array */

+

+  /* State variables: these variables indicate the progress of decompression.

+   * The application may examine these but must not modify them.

+   */

+

+  /* Row index of next scanline to be read from jpeg_read_scanlines().

+   * Application may use this to control its processing loop, e.g.,

+   * "while (output_scanline < output_height)".

+   */

+  JDIMENSION output_scanline;	/* 0 .. output_height-1  */

+

+  /* Current input scan number and number of iMCU rows completed in scan.

+   * These indicate the progress of the decompressor input side.

+   */

+  int input_scan_number;	/* Number of SOS markers seen so far */

+  JDIMENSION input_iMCU_row;	/* Number of iMCU rows completed */

+

+  /* The "output scan number" is the notional scan being displayed by the

+   * output side.  The decompressor will not allow output scan/row number

+   * to get ahead of input scan/row, but it can fall arbitrarily far behind.

+   */

+  int output_scan_number;	/* Nominal scan number being displayed */

+  JDIMENSION output_iMCU_row;	/* Number of iMCU rows read */

+

+  /* Current progression status.  coef_bits[c][i] indicates the precision

+   * with which component c's DCT coefficient i (in zigzag order) is known.

+   * It is -1 when no data has yet been received, otherwise it is the point

+   * transform (shift) value for the most recent scan of the coefficient

+   * (thus, 0 at completion of the progression).

+   * This pointer is NULL when reading a non-progressive file.

+   */

+  int (*coef_bits)[DCTSIZE2];	/* -1 or current Al value for each coef */

+

+  /* Internal JPEG parameters --- the application usually need not look at

+   * these fields.  Note that the decompressor output side may not use

+   * any parameters that can change between scans.

+   */

+

+  /* Quantization and Huffman tables are carried forward across input

+   * datastreams when processing abbreviated JPEG datastreams.

+   */

+

+  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];

+  /* ptrs to coefficient quantization tables, or NULL if not defined */

+

+  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];

+  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];

+  /* ptrs to Huffman coding tables, or NULL if not defined */

+

+  /* These parameters are never carried across datastreams, since they

+   * are given in SOF/SOS markers or defined to be reset by SOI.

+   */

+

+  int data_precision;		/* bits of precision in image data */

+

+  jpeg_component_info * comp_info;

+  /* comp_info[i] describes component that appears i'th in SOF */

+

+  boolean progressive_mode;	/* TRUE if SOFn specifies progressive mode */

+  boolean arith_code;		/* TRUE=arithmetic coding, FALSE=Huffman */

+

+  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */

+  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */

+  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */

+

+  unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */

+

+  /* These fields record data obtained from optional markers recognized by

+   * the JPEG library.

+   */

+  boolean saw_JFIF_marker;	/* TRUE iff a JFIF APP0 marker was found */

+  /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */

+  UINT8 JFIF_major_version;	/* JFIF version number */

+  UINT8 JFIF_minor_version;

+  UINT8 density_unit;		/* JFIF code for pixel size units */

+  UINT16 X_density;		/* Horizontal pixel density */

+  UINT16 Y_density;		/* Vertical pixel density */

+  boolean saw_Adobe_marker;	/* TRUE iff an Adobe APP14 marker was found */

+  UINT8 Adobe_transform;	/* Color transform code from Adobe marker */

+

+  boolean CCIR601_sampling;	/* TRUE=first samples are cosited */

+

+  /* Aside from the specific data retained from APPn markers known to the

+   * library, the uninterpreted contents of any or all APPn and COM markers

+   * can be saved in a list for examination by the application.

+   */

+  jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */

+

+  /* Remaining fields are known throughout decompressor, but generally

+   * should not be touched by a surrounding application.

+   */

+

+  /*

+   * These fields are computed during decompression startup

+   */

+  int max_h_samp_factor;	/* largest h_samp_factor */

+  int max_v_samp_factor;	/* largest v_samp_factor */

+

+  int min_DCT_scaled_size;	/* smallest DCT_scaled_size of any component */

+

+  JDIMENSION total_iMCU_rows;	/* # of iMCU rows in image */

+  /* The coefficient controller's input and output progress is measured in

+   * units of "iMCU" (interleaved MCU) rows.  These are the same as MCU rows

+   * in fully interleaved JPEG scans, but are used whether the scan is

+   * interleaved or not.  We define an iMCU row as v_samp_factor DCT block

+   * rows of each component.  Therefore, the IDCT output contains

+   * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row.

+   */

+

+  JSAMPLE * sample_range_limit; /* table for fast range-limiting */

+

+  /*

+   * These fields are valid during any one scan.

+   * They describe the components and MCUs actually appearing in the scan.

+   * Note that the decompressor output side must not use these fields.

+   */

+  int comps_in_scan;		/* # of JPEG components in this scan */

+  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];

+  /* *cur_comp_info[i] describes component that appears i'th in SOS */

+

+  JDIMENSION MCUs_per_row;	/* # of MCUs across the image */

+  JDIMENSION MCU_rows_in_scan;	/* # of MCU rows in the image */

+

+  int blocks_in_MCU;		/* # of DCT blocks per MCU */

+  int MCU_membership[D_MAX_BLOCKS_IN_MCU];

+  /* MCU_membership[i] is index in cur_comp_info of component owning */

+  /* i'th block in an MCU */

+

+  int Ss, Se, Ah, Al;		/* progressive JPEG parameters for scan */

+

+  /* This field is shared between entropy decoder and marker parser.

+   * It is either zero or the code of a JPEG marker that has been

+   * read from the data source, but has not yet been processed.

+   */

+  int unread_marker;

+

+  /*

+   * Links to decompression subobjects (methods, private variables of modules)

+   */

+  struct jpeg_decomp_master * master;

+  struct jpeg_d_main_controller * main;

+  struct jpeg_d_coef_controller * coef;

+  struct jpeg_d_post_controller * post;

+  struct jpeg_input_controller * inputctl;

+  struct jpeg_marker_reader * marker;

+  struct jpeg_entropy_decoder * entropy;

+  struct jpeg_inverse_dct * idct;

+  struct jpeg_upsampler * upsample;

+  struct jpeg_color_deconverter * cconvert;

+  struct jpeg_color_quantizer * cquantize;

+};

+

+

+/* "Object" declarations for JPEG modules that may be supplied or called

+ * directly by the surrounding application.

+ * As with all objects in the JPEG library, these structs only define the

+ * publicly visible methods and state variables of a module.  Additional

+ * private fields may exist after the public ones.

+ */

+

+

+/* Error handler object */

+

+struct jpeg_error_mgr {

+  /* Error exit handler: does not return to caller */

+  JMETHOD(void, error_exit, (j_common_ptr cinfo));

+  /* Conditionally emit a trace or warning message */

+  JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));

+  /* Routine that actually outputs a trace or error message */

+  JMETHOD(void, output_message, (j_common_ptr cinfo));

+  /* Format a message string for the most recent JPEG error or message */

+  JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));

+#define JMSG_LENGTH_MAX  200	/* recommended size of format_message buffer */

+  /* Reset error state variables at start of a new image */

+  JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));

+  

+  /* The message ID code and any parameters are saved here.

+   * A message can have one string parameter or up to 8 int parameters.

+   */

+  int msg_code;

+#define JMSG_STR_PARM_MAX  80

+  union {

+    int i[8];

+    char s[JMSG_STR_PARM_MAX];

+  } msg_parm;

+  

+  /* Standard state variables for error facility */

+  

+  int trace_level;		/* max msg_level that will be displayed */

+  

+  /* For recoverable corrupt-data errors, we emit a warning message,

+   * but keep going unless emit_message chooses to abort.  emit_message

+   * should count warnings in num_warnings.  The surrounding application

+   * can check for bad data by seeing if num_warnings is nonzero at the

+   * end of processing.

+   */

+  long num_warnings;		/* number of corrupt-data warnings */

+

+  /* These fields point to the table(s) of error message strings.

+   * An application can change the table pointer to switch to a different

+   * message list (typically, to change the language in which errors are

+   * reported).  Some applications may wish to add additional error codes

+   * that will be handled by the JPEG library error mechanism; the second

+   * table pointer is used for this purpose.

+   *

+   * First table includes all errors generated by JPEG library itself.

+   * Error code 0 is reserved for a "no such error string" message.

+   */

+  const char * const * jpeg_message_table; /* Library errors */

+  int last_jpeg_message;    /* Table contains strings 0..last_jpeg_message */

+  /* Second table can be added by application (see cjpeg/djpeg for example).

+   * It contains strings numbered first_addon_message..last_addon_message.

+   */

+  const char * const * addon_message_table; /* Non-library errors */

+  int first_addon_message;	/* code for first string in addon table */

+  int last_addon_message;	/* code for last string in addon table */

+};

+

+

+/* Progress monitor object */

+

+struct jpeg_progress_mgr {

+  JMETHOD(void, progress_monitor, (j_common_ptr cinfo));

+

+  long pass_counter;		/* work units completed in this pass */

+  long pass_limit;		/* total number of work units in this pass */

+  int completed_passes;		/* passes completed so far */

+  int total_passes;		/* total number of passes expected */

+};

+

+

+/* Data destination object for compression */

+

+struct jpeg_destination_mgr {

+  JOCTET * next_output_byte;	/* => next byte to write in buffer */

+  size_t free_in_buffer;	/* # of byte spaces remaining in buffer */

+

+  JMETHOD(void, init_destination, (j_compress_ptr cinfo));

+  JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo));

+  JMETHOD(void, term_destination, (j_compress_ptr cinfo));

+};

+

+

+/* Data source object for decompression */

+

+struct jpeg_source_mgr {

+  const JOCTET * next_input_byte; /* => next byte to read from buffer */

+  size_t bytes_in_buffer;	/* # of bytes remaining in buffer */

+

+  JMETHOD(void, init_source, (j_decompress_ptr cinfo));

+  JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));

+  JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));

+  JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));

+  JMETHOD(void, term_source, (j_decompress_ptr cinfo));

+};

+

+

+/* Memory manager object.

+ * Allocates "small" objects (a few K total), "large" objects (tens of K),

+ * and "really big" objects (virtual arrays with backing store if needed).

+ * The memory manager does not allow individual objects to be freed; rather,

+ * each created object is assigned to a pool, and whole pools can be freed

+ * at once.  This is faster and more convenient than remembering exactly what

+ * to free, especially where malloc()/free() are not too speedy.

+ * NB: alloc routines never return NULL.  They exit to error_exit if not

+ * successful.

+ */

+

+#define JPOOL_PERMANENT	0	/* lasts until master record is destroyed */

+#define JPOOL_IMAGE	1	/* lasts until done with image/datastream */

+#define JPOOL_NUMPOOLS	2

+

+typedef struct jvirt_sarray_control * jvirt_sarray_ptr;

+typedef struct jvirt_barray_control * jvirt_barray_ptr;

+

+

+struct jpeg_memory_mgr {

+  /* Method pointers */

+  JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id,

+				size_t sizeofobject));

+  JMETHOD(void  *, alloc_large, (j_common_ptr cinfo, int pool_id,

+				     size_t sizeofobject));

+  JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id,

+				     JDIMENSION samplesperrow,

+				     JDIMENSION numrows));

+  JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id,

+				      JDIMENSION blocksperrow,

+				      JDIMENSION numrows));

+  JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo,

+						  int pool_id,

+						  boolean pre_zero,

+						  JDIMENSION samplesperrow,

+						  JDIMENSION numrows,

+						  JDIMENSION maxaccess));

+  JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo,

+						  int pool_id,

+						  boolean pre_zero,

+						  JDIMENSION blocksperrow,

+						  JDIMENSION numrows,

+						  JDIMENSION maxaccess));

+  JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo));

+  JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo,

+					   jvirt_sarray_ptr ptr,

+					   JDIMENSION start_row,

+					   JDIMENSION num_rows,

+					   boolean writable));

+  JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo,

+					    jvirt_barray_ptr ptr,

+					    JDIMENSION start_row,

+					    JDIMENSION num_rows,

+					    boolean writable));

+  JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id));

+  JMETHOD(void, self_destruct, (j_common_ptr cinfo));

+

+  /* Limit on memory allocation for this JPEG object.  (Note that this is

+   * merely advisory, not a guaranteed maximum; it only affects the space

+   * used for virtual-array buffers.)  May be changed by outer application

+   * after creating the JPEG object.

+   */

+  long max_memory_to_use;

+

+  /* Maximum allocation request accepted by alloc_large. */

+  long max_alloc_chunk;

+};

+

+

+/* Routine signature for application-supplied marker processing methods.

+ * Need not pass marker code since it is stored in cinfo->unread_marker.

+ */

+typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));

+

+

+/* Declarations for routines called by application.

+ * The JPP macro hides prototype parameters from compilers that can't cope.

+ * Note JPP requires double parentheses.

+ */

+

+#ifdef HAVE_PROTOTYPES

+#define JPP(arglist)	arglist

+#else

+#define JPP(arglist)	()

+#endif

+

+

+/* Short forms of external names for systems with brain-damaged linkers.

+ * We shorten external names to be unique in the first six letters, which

+ * is good enough for all known systems.

+ * (If your compiler itself needs names to be unique in less than 15 

+ * characters, you are out of luck.  Get a better compiler.)

+ */

+

+#ifdef NEED_SHORT_EXTERNAL_NAMES

+#define jpeg_std_error		jStdError

+#define jpeg_CreateCompress	jCreaCompress

+#define jpeg_CreateDecompress	jCreaDecompress

+#define jpeg_destroy_compress	jDestCompress

+#define jpeg_destroy_decompress	jDestDecompress

+#define jpeg_stdio_dest		jStdDest

+#define jpeg_stdio_src		jStdSrc

+#define jpeg_set_defaults	jSetDefaults

+#define jpeg_set_colorspace	jSetColorspace

+#define jpeg_default_colorspace	jDefColorspace

+#define jpeg_set_quality	jSetQuality

+#define jpeg_set_linear_quality	jSetLQuality

+#define jpeg_add_quant_table	jAddQuantTable

+#define jpeg_quality_scaling	jQualityScaling

+#define jpeg_simple_progression	jSimProgress

+#define jpeg_suppress_tables	jSuppressTables

+#define jpeg_alloc_quant_table	jAlcQTable

+#define jpeg_alloc_huff_table	jAlcHTable

+#define jpeg_start_compress	jStrtCompress

+#define jpeg_write_scanlines	jWrtScanlines

+#define jpeg_finish_compress	jFinCompress

+#define jpeg_write_raw_data	jWrtRawData

+#define jpeg_write_marker	jWrtMarker

+#define jpeg_write_m_header	jWrtMHeader

+#define jpeg_write_m_byte	jWrtMByte

+#define jpeg_write_tables	jWrtTables

+#define jpeg_read_header	jReadHeader

+#define jpeg_start_decompress	jStrtDecompress

+#define jpeg_read_scanlines	jReadScanlines

+#define jpeg_finish_decompress	jFinDecompress

+#define jpeg_read_raw_data	jReadRawData

+#define jpeg_has_multiple_scans	jHasMultScn

+#define jpeg_start_output	jStrtOutput

+#define jpeg_finish_output	jFinOutput

+#define jpeg_input_complete	jInComplete

+#define jpeg_new_colormap	jNewCMap

+#define jpeg_consume_input	jConsumeInput

+#define jpeg_calc_output_dimensions	jCalcDimensions

+#define jpeg_save_markers	jSaveMarkers

+#define jpeg_set_marker_processor	jSetMarker

+#define jpeg_read_coefficients	jReadCoefs

+#define jpeg_write_coefficients	jWrtCoefs

+#define jpeg_copy_critical_parameters	jCopyCrit

+#define jpeg_abort_compress	jAbrtCompress

+#define jpeg_abort_decompress	jAbrtDecompress

+#define jpeg_abort		jAbort

+#define jpeg_destroy		jDestroy

+#define jpeg_resync_to_restart	jResyncRestart

+#endif /* NEED_SHORT_EXTERNAL_NAMES */

+

+

+/* Default error-management setup */

+EXTERN(struct jpeg_error_mgr *) jpeg_std_error

+	JPP((struct jpeg_error_mgr * err));

+

+/* Initialization of JPEG compression objects.

+ * jpeg_create_compress() and jpeg_create_decompress() are the exported

+ * names that applications should call.  These expand to calls on

+ * jpeg_CreateCompress and jpeg_CreateDecompress with additional information

+ * passed for version mismatch checking.

+ * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx.

+ */

+#define jpeg_create_compress(cinfo) \

+    jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \

+			(size_t) sizeof(struct jpeg_compress_struct))

+#define jpeg_create_decompress(cinfo) \

+    jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \

+			  (size_t) sizeof(struct jpeg_decompress_struct))

+EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo,

+				      int version, size_t structsize));

+EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo,

+					int version, size_t structsize));

+/* Destruction of JPEG compression objects */

+EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo));

+EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));

+

+#if 0

+/* Standard data source and destination managers: stdio streams. */

+/* Caller is responsible for opening the file before and closing after. */

+EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FXSYS_FILE * outfile));

+EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));

+#endif

+

+/* Default parameter setup for compression */

+EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));

+/* Compression parameter setup aids */

+EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo,

+				      J_COLOR_SPACE colorspace));

+EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo));

+EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality,

+				   boolean force_baseline));

+EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo,

+					  int scale_factor,

+					  boolean force_baseline));

+EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl,

+				       const unsigned int *basic_table,

+				       int scale_factor,

+				       boolean force_baseline));

+EXTERN(int) jpeg_quality_scaling JPP((int quality));

+EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo));

+EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,

+				       boolean suppress));

+EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));

+EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));

+

+/* Main entry points for compression */

+EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,

+				      boolean write_all_tables));

+EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo,

+					     JSAMPARRAY scanlines,

+					     JDIMENSION num_lines));

+EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo));

+

+/* Replaces jpeg_write_scanlines when writing raw downsampled data. */

+EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo,

+					    JSAMPIMAGE data,

+					    JDIMENSION num_lines));

+

+/* Write a special marker.  See libjpeg.doc concerning safe usage. */

+EXTERN(void) jpeg_write_marker

+	JPP((j_compress_ptr cinfo, int marker,

+	     const JOCTET * dataptr, unsigned int datalen));

+/* Same, but piecemeal. */

+EXTERN(void) jpeg_write_m_header

+	JPP((j_compress_ptr cinfo, int marker, unsigned int datalen));

+EXTERN(void) jpeg_write_m_byte

+	JPP((j_compress_ptr cinfo, int val));

+

+/* Alternate compression function: just write an abbreviated table file */

+EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo));

+

+/* Decompression startup: read start of JPEG datastream to see what's there */

+EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,

+				  boolean require_image));

+/* Return value is one of: */

+#define JPEG_SUSPENDED		0 /* Suspended due to lack of input data */

+#define JPEG_HEADER_OK		1 /* Found valid image datastream */

+#define JPEG_HEADER_TABLES_ONLY	2 /* Found valid table-specs-only datastream */

+/* If you pass require_image = TRUE (normal case), you need not check for

+ * a TABLES_ONLY return code; an abbreviated file will cause an error exit.

+ * JPEG_SUSPENDED is only possible if you use a data source module that can

+ * give a suspension return (the stdio source module doesn't).

+ */

+

+/* Main entry points for decompression */

+EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo));

+EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo,

+					    JSAMPARRAY scanlines,

+					    JDIMENSION max_lines));

+EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo));

+

+/* Replaces jpeg_read_scanlines when reading raw downsampled data. */

+EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo,

+					   JSAMPIMAGE data,

+					   JDIMENSION max_lines));

+

+/* Additional entry points for buffered-image mode. */

+EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo));

+EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo,

+				       int scan_number));

+EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo));

+EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo));

+EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo));

+EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));

+/* Return value is one of: */

+/* #define JPEG_SUSPENDED	0    Suspended due to lack of input data */

+#define JPEG_REACHED_SOS	1 /* Reached start of new scan */

+#define JPEG_REACHED_EOI	2 /* Reached end of image */

+#define JPEG_ROW_COMPLETED	3 /* Completed one iMCU row */

+#define JPEG_SCAN_COMPLETED	4 /* Completed last iMCU row of a scan */

+

+/* Precalculate output dimensions for current decompression parameters. */

+EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));

+

+/* Control saving of COM and APPn markers into marker_list. */

+EXTERN(void) jpeg_save_markers

+	JPP((j_decompress_ptr cinfo, int marker_code,

+	     unsigned int length_limit));

+

+/* Install a special processing method for COM or APPn markers. */

+EXTERN(void) jpeg_set_marker_processor

+	JPP((j_decompress_ptr cinfo, int marker_code,

+	     jpeg_marker_parser_method routine));

+

+/* Read or write raw DCT coefficients --- useful for lossless transcoding. */

+EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo));

+EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo,

+					  jvirt_barray_ptr * coef_arrays));

+EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo,

+						j_compress_ptr dstinfo));

+

+/* If you choose to abort compression or decompression before completing

+ * jpeg_finish_(de)compress, then you need to clean up to release memory,

+ * temporary files, etc.  You can just call jpeg_destroy_(de)compress

+ * if you're done with the JPEG object, but if you want to clean it up and

+ * reuse it, call this:

+ */

+EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo));

+EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo));

+

+/* Generic versions of jpeg_abort and jpeg_destroy that work on either

+ * flavor of JPEG object.  These may be more convenient in some places.

+ */

+EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo));

+EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo));

+

+/* Default restart-marker-resync procedure for use by data source modules */

+EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo,

+					    int desired));

+

+

+/* These marker codes are exported since applications and data source modules

+ * are likely to want to use them.

+ */

+

+#define JPEG_RST0	0xD0	/* RST0 marker code */

+#define JPEG_EOI	0xD9	/* EOI marker code */

+#define JPEG_APP0	0xE0	/* APP0 marker code */

+#define JPEG_COM	0xFE	/* COM marker code */

+

+

+/* If we have a brain-damaged compiler that emits warnings (or worse, errors)

+ * for structure definitions that are never filled in, keep it quiet by

+ * supplying dummy definitions for the various substructures.

+ */

+

+#ifdef INCOMPLETE_TYPES_BROKEN

+#ifndef JPEG_INTERNALS		/* will be defined in jpegint.h */

+struct jvirt_sarray_control { long dummy; };

+struct jvirt_barray_control { long dummy; };

+struct jpeg_comp_master { long dummy; };

+struct jpeg_c_main_controller { long dummy; };

+struct jpeg_c_prep_controller { long dummy; };

+struct jpeg_c_coef_controller { long dummy; };

+struct jpeg_marker_writer { long dummy; };

+struct jpeg_color_converter { long dummy; };

+struct jpeg_downsampler { long dummy; };

+struct jpeg_forward_dct { long dummy; };

+struct jpeg_entropy_encoder { long dummy; };

+struct jpeg_decomp_master { long dummy; };

+struct jpeg_d_main_controller { long dummy; };

+struct jpeg_d_coef_controller { long dummy; };

+struct jpeg_d_post_controller { long dummy; };

+struct jpeg_input_controller { long dummy; };

+struct jpeg_marker_reader { long dummy; };

+struct jpeg_entropy_decoder { long dummy; };

+struct jpeg_inverse_dct { long dummy; };

+struct jpeg_upsampler { long dummy; };

+struct jpeg_color_deconverter { long dummy; };

+struct jpeg_color_quantizer { long dummy; };

+#endif /* JPEG_INTERNALS */

+#endif /* INCOMPLETE_TYPES_BROKEN */

+

+

+/*

+ * The JPEG library modules define JPEG_INTERNALS before including this file.

+ * The internal structure declarations are read only when that is true.

+ * Applications using the library should not include jpegint.h, but may wish

+ * to include jerror.h.

+ */

+

+#ifdef JPEG_INTERNALS

+#include "jpegint.h"		/* fetch private declarations */

+#include "jerror.h"		/* fetch error codes too */

+#endif

+

+#endif /* JPEGLIB_H */

diff --git a/core/include/thirdparties/zlib/zconf.h b/core/include/thirdparties/zlib/zconf.h
new file mode 100644
index 0000000..3a1f969
--- /dev/null
+++ b/core/include/thirdparties/zlib/zconf.h
@@ -0,0 +1,519 @@
+/* zconf.h -- configuration of the zlib compression library

+ * Copyright (C) 1995-2013 Jean-loup Gailly.

+ * For conditions of distribution and use, see copyright notice in zlib.h

+ */

+

+/* @(#) $Id$ */

+

+#ifndef ZCONF_H

+#define ZCONF_H

+

+/*

+ * If you *really* need a unique prefix for all types and library functions,

+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.

+ * Even better than compiling with -DZ_PREFIX would be to use configure to set

+ * this permanently in zconf.h using "./configure --zprefix".

+ */

+#ifdef Z_PREFIX     /* may be set to #if 1 by ./configure */

+#  define Z_PREFIX_SET

+

+/* all linked symbols */

+#  define _dist_code            z__dist_code

+#  define _length_code          z__length_code

+#  define _tr_align             z__tr_align

+#  define _tr_flush_bits        z__tr_flush_bits

+#  define _tr_flush_block       z__tr_flush_block

+#  define _tr_init              z__tr_init

+#  define _tr_stored_block      z__tr_stored_block

+#  define _tr_tally             z__tr_tally

+#  define adler32               z_adler32

+#  define adler32_combine       z_adler32_combine

+#  define adler32_combine64     z_adler32_combine64

+#  ifndef Z_SOLO

+#    define compress              z_compress

+#    define compress2             z_compress2

+#    define compressBound         z_compressBound

+#  endif

+#  define crc32                 z_crc32

+#  define crc32_combine         z_crc32_combine

+#  define crc32_combine64       z_crc32_combine64

+#  define deflate               z_deflate

+#  define deflateBound          z_deflateBound

+#  define deflateCopy           z_deflateCopy

+#  define deflateEnd            z_deflateEnd

+#  define deflateInit2_         z_deflateInit2_

+#  define deflateInit_          z_deflateInit_

+#  define deflateParams         z_deflateParams

+#  define deflatePending        z_deflatePending

+#  define deflatePrime          z_deflatePrime

+#  define deflateReset          z_deflateReset

+#  define deflateResetKeep      z_deflateResetKeep

+#  define deflateSetDictionary  z_deflateSetDictionary

+#  define deflateSetHeader      z_deflateSetHeader

+#  define deflateTune           z_deflateTune

+#  define deflate_copyright     z_deflate_copyright

+#  define get_crc_table         z_get_crc_table

+#  ifndef Z_SOLO

+#    define gz_error              z_gz_error

+#    define gz_intmax             z_gz_intmax

+#    define gz_strwinerror        z_gz_strwinerror

+#    define gzbuffer              z_gzbuffer

+#    define gzclearerr            z_gzclearerr

+#    define gzclose               z_gzclose

+#    define gzclose_r             z_gzclose_r

+#    define gzclose_w             z_gzclose_w

+#    define gzdirect              z_gzdirect

+#    define gzdopen               z_gzdopen

+#    define gzeof                 z_gzeof

+#    define gzerror               z_gzerror

+#    define gzflush               z_gzflush

+#    define gzgetc                z_gzgetc

+#    define gzgetc_               z_gzgetc_

+#    define gzgets                z_gzgets

+#    define gzoffset              z_gzoffset

+#    define gzoffset64            z_gzoffset64

+#    define gzopen                z_gzopen

+#    define gzopen64              z_gzopen64

+#    ifdef _WIN32

+#      define gzopen_w              z_gzopen_w

+#    endif

+#    define gzprintf              z_gzprintf

+#    define gzvprintf             z_gzvprintf

+#    define gzputc                z_gzputc

+#    define gzputs                z_gzputs

+#    define gzread                z_gzread

+#    define gzrewind              z_gzrewind

+#    define gzseek                z_gzseek

+#    define gzseek64              z_gzseek64

+#    define gzsetparams           z_gzsetparams

+#    define gztell                z_gztell

+#    define gztell64              z_gztell64

+#    define gzungetc              z_gzungetc

+#    define gzwrite               z_gzwrite

+#  endif

+#  define inflate               z_inflate

+#  define inflateBack           z_inflateBack

+#  define inflateBackEnd        z_inflateBackEnd

+#  define inflateBackInit_      z_inflateBackInit_

+#  define inflateCopy           z_inflateCopy

+#  define inflateEnd            z_inflateEnd

+#  define inflateGetHeader      z_inflateGetHeader

+#  define inflateInit2_         z_inflateInit2_

+#  define inflateInit_          z_inflateInit_

+#  define inflateMark           z_inflateMark

+#  define inflatePrime          z_inflatePrime

+#  define inflateReset          z_inflateReset

+#  define inflateReset2         z_inflateReset2

+#  define inflateSetDictionary  z_inflateSetDictionary

+#  define inflateGetDictionary  z_inflateGetDictionary

+#  define inflateSync           z_inflateSync

+#  define inflateSyncPoint      z_inflateSyncPoint

+#  define inflateUndermine      z_inflateUndermine

+#  define inflateResetKeep      z_inflateResetKeep

+#  define inflate_copyright     z_inflate_copyright

+#  define inflate_fast          z_inflate_fast

+#  define inflate_table         z_inflate_table

+#  ifndef Z_SOLO

+#    define uncompress            z_uncompress

+#  endif

+#  define zError                z_zError

+#  ifndef Z_SOLO

+#    define zcalloc               z_zcalloc

+#    define zcfree                z_zcfree

+#  endif

+#  define zlibCompileFlags      z_zlibCompileFlags

+#  define zlibVersion           z_zlibVersion

+

+/* all zlib typedefs in zlib.h and zconf.h */

+#  define Byte                  z_Byte

+#  define Bytef                 z_Bytef

+#  define alloc_func            z_alloc_func

+#  define charf                 z_charf

+#  define free_func             z_free_func

+#  ifndef Z_SOLO

+#    define gzFile                z_gzFile

+#  endif

+#  define gz_header             z_gz_header

+#  define gz_headerp            z_gz_headerp

+#  define in_func               z_in_func

+#  define intf                  z_intf

+#  define out_func              z_out_func

+#  define uInt                  z_uInt

+#  define uIntf                 z_uIntf

+#  define uLong                 z_uLong

+#  define uLongf                z_uLongf

+#  define voidp                 z_voidp

+#  define voidpc                z_voidpc

+#  define voidpf                z_voidpf

+

+/* all zlib structs in zlib.h and zconf.h */

+#  define gz_header_s           z_gz_header_s

+#  define internal_state        z_internal_state

+

+#endif

+

+#if defined(__MSDOS__) && !defined(MSDOS)

+#  define MSDOS

+#endif

+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)

+#  define OS2

+#endif

+#if defined(_WINDOWS) && !defined(WINDOWS)

+#  define WINDOWS

+#endif

+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)

+#  ifndef WIN32

+#    define WIN32

+#  endif

+#endif

+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)

+#  if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)

+#    ifndef SYS16BIT

+#      define SYS16BIT

+#    endif

+#  endif

+#endif

+

+/*

+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more

+ * than 64k bytes at a time (needed on systems with 16-bit int).

+ */

+#ifdef SYS16BIT

+#  define MAXSEG_64K

+#endif

+#ifdef MSDOS

+#  define UNALIGNED_OK

+#endif

+

+#ifdef __STDC_VERSION__

+#  ifndef STDC

+#    define STDC

+#  endif

+#  if __STDC_VERSION__ >= 199901L

+#    ifndef STDC99

+#      define STDC99

+#    endif

+#  endif

+#endif

+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))

+#  define STDC

+#endif

+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))

+#  define STDC

+#endif

+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))

+#  define STDC

+#endif

+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))

+#  define STDC

+#endif

+

+#if defined(__OS400__) && !defined(STDC)    /* iSeries (formerly AS/400). */

+#  define STDC

+#endif

+

+#ifndef STDC

+#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */

+#    define const       /* note: need a more gentle solution here */

+#  endif

+#endif

+

+#if defined(ZLIB_CONST) && !defined(z_const)

+#  define z_const const

+#else

+#  define z_const

+#endif

+

+/* Some Mac compilers merge all .h files incorrectly: */

+#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)

+#  define NO_DUMMY_DECL

+#endif

+

+/* Maximum value for memLevel in deflateInit2 */

+#ifndef MAX_MEM_LEVEL

+#  ifdef MAXSEG_64K

+#    define MAX_MEM_LEVEL 8

+#  else

+#    define MAX_MEM_LEVEL 9

+#  endif

+#endif

+

+/* Maximum value for windowBits in deflateInit2 and inflateInit2.

+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files

+ * created by gzip. (Files created by minigzip can still be extracted by

+ * gzip.)

+ */

+#ifndef MAX_WBITS

+#  define MAX_WBITS   15 /* 32K LZ77 window */

+#endif

+

+/* The memory requirements for deflate are (in bytes):

+            (1 << (windowBits+2)) +  (1 << (memLevel+9))

+ that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)

+ plus a few kilobytes for small objects. For example, if you want to reduce

+ the default memory requirements from 256K to 128K, compile with

+     make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"

+ Of course this will generally degrade compression (there's no free lunch).

+

+   The memory requirements for inflate are (in bytes) 1 << windowBits

+ that is, 32K for windowBits=15 (default value) plus a few kilobytes

+ for small objects.

+*/

+

+                        /* Type declarations */

+

+#ifndef OF /* function prototypes */

+#  ifdef STDC

+#    define OF(args)  args

+#  else

+#    define OF(args)  ()

+#  endif

+#endif

+

+#ifndef Z_ARG /* function prototypes for stdarg */

+#  if defined(STDC) || defined(Z_HAVE_STDARG_H)

+#    define Z_ARG(args)  args

+#  else

+#    define Z_ARG(args)  ()

+#  endif

+#endif

+

+/* The following definitions for FAR are needed only for MSDOS mixed

+ * model programming (small or medium model with some far allocations).

+ * This was tested only with MSC; for other MSDOS compilers you may have

+ * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,

+ * just define FAR to be empty.

+ */

+#ifdef SYS16BIT

+#  if defined(M_I86SM) || defined(M_I86MM)

+     /* MSC small or medium model */

+#    define SMALL_MEDIUM

+#    ifdef _MSC_VER

+#      define FAR _far

+#    else

+#      define FAR far

+#    endif

+#  endif

+#  if (defined(__SMALL__) || defined(__MEDIUM__))

+     /* Turbo C small or medium model */

+#    define SMALL_MEDIUM

+#    ifdef __BORLANDC__

+#      define FAR _far

+#    else

+#      define FAR far

+#    endif

+#  endif

+#endif

+

+#if defined(WINDOWS) || defined(WIN32)

+   /* If building or using zlib as a DLL, define ZLIB_DLL.

+    * This is not mandatory, but it offers a little performance increase.

+    */

+#  ifdef ZLIB_DLL

+#    if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))

+#      ifdef ZLIB_INTERNAL

+#        define ZEXTERN extern __declspec(dllexport)

+#      else

+#        define ZEXTERN extern __declspec(dllimport)

+#      endif

+#    endif

+#  endif  /* ZLIB_DLL */

+   /* If building or using zlib with the WINAPI/WINAPIV calling convention,

+    * define ZLIB_WINAPI.

+    * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.

+    */

+#  ifdef ZLIB_WINAPI

+#    ifdef FAR

+#      undef FAR

+#    endif

+#    include <windows.h>

+     /* No need for _export, use ZLIB.DEF instead. */

+     /* For complete Windows compatibility, use WINAPI, not __stdcall. */

+#    define ZEXPORT WINAPI

+#    ifdef WIN32

+#      define ZEXPORTVA WINAPIV

+#    else

+#      define ZEXPORTVA FAR CDECL

+#    endif

+#  endif

+#endif

+

+#if defined (__BEOS__)

+#  ifdef ZLIB_DLL

+#    ifdef ZLIB_INTERNAL

+#      define ZEXPORT   __declspec(dllexport)

+#      define ZEXPORTVA __declspec(dllexport)

+#    else

+#      define ZEXPORT   __declspec(dllimport)

+#      define ZEXPORTVA __declspec(dllimport)

+#    endif

+#  endif

+#endif

+

+#ifndef ZEXTERN

+#  define ZEXTERN extern

+#endif

+#ifndef ZEXPORT

+#  define ZEXPORT

+#endif

+#ifndef ZEXPORTVA

+#  define ZEXPORTVA

+#endif

+

+#ifndef FAR

+#  define FAR

+#endif

+

+#if !defined(__MACTYPES__)

+typedef unsigned char  Byte;  /* 8 bits */

+#endif

+typedef unsigned int   uInt;  /* 16 bits or more */

+typedef unsigned long  uLong; /* 32 bits or more */

+

+#ifdef SMALL_MEDIUM

+   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */

+#  define Bytef Byte FAR

+#else

+   typedef Byte  FAR Bytef;

+#endif

+typedef char  FAR charf;

+typedef int   FAR intf;

+typedef uInt  FAR uIntf;

+typedef uLong FAR uLongf;

+

+#ifdef STDC

+   typedef void const *voidpc;

+   typedef void FAR   *voidpf;

+   typedef void       *voidp;

+#else

+   typedef Byte const *voidpc;

+   typedef Byte FAR   *voidpf;

+   typedef Byte       *voidp;

+#endif

+

+#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)

+#  include <limits.h>

+#  if (UINT_MAX == 0xffffffffUL)

+#    define Z_U4 unsigned

+#  elif (ULONG_MAX == 0xffffffffUL)

+#    define Z_U4 unsigned long

+#  elif (USHRT_MAX == 0xffffffffUL)

+#    define Z_U4 unsigned short

+#  endif

+#endif

+

+#ifdef Z_U4

+   typedef Z_U4 z_crc_t;

+#else

+   typedef unsigned long z_crc_t;

+#endif

+

+#if 0				/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */

+#ifdef HAVE_UNISTD_H    /* may be set to #if 1 by ./configure */

+#  define Z_HAVE_UNISTD_H

+#endif

+#endif /* 0 */

+

+#ifdef HAVE_STDARG_H    /* may be set to #if 1 by ./configure */

+#  define Z_HAVE_STDARG_H

+#endif

+

+#if 0				/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */

+#ifdef STDC

+#  ifndef Z_SOLO

+#    include <sys/types.h>      /* for off_t */

+#  endif

+#endif

+#endif /* 0 */

+

+#if defined(STDC) || defined(Z_HAVE_STDARG_H)

+#  ifndef Z_SOLO

+#    include <stdarg.h>         /* for va_list */

+#  endif

+#endif

+

+#ifdef _WIN32

+#  ifndef Z_SOLO

+#    include <stddef.h>         /* for wchar_t */

+#  endif

+#endif

+

+#if 0				/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */

+/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and

+ * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even

+ * though the former does not conform to the LFS document), but considering

+ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as

+ * equivalently requesting no 64-bit operations

+ */

+#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1

+#  undef _LARGEFILE64_SOURCE

+#endif

+#endif /* 0 */

+

+#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)

+#  define Z_HAVE_UNISTD_H

+#endif

+#ifndef Z_SOLO

+#if 0				/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */

+#  if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)

+#    include <unistd.h>         /* for SEEK_*, off_t, and _LFS64_LARGEFILE */

+#    ifdef VMS

+#      include <unixio.h>       /* for off_t */

+#    endif

+#    ifndef z_off_t

+#      define z_off_t off_t

+#    endif

+#  endif

+#endif /* 0 */

+#endif

+

+#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0

+#  define Z_LFS64

+#endif

+

+#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)

+#  define Z_LARGE64

+#endif

+

+#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)

+#  define Z_WANT64

+#endif

+

+#if !defined(SEEK_SET) && !defined(Z_SOLO)

+#  define SEEK_SET        0       /* Seek from beginning of file.  */

+#  define SEEK_CUR        1       /* Seek from current position.  */

+#  define SEEK_END        2       /* Set file pointer to EOF plus "offset" */

+#endif

+

+#ifndef z_off_t

+#  define z_off_t long

+#endif

+

+#if !defined(_WIN32) && defined(Z_LARGE64)

+#  define z_off64_t off64_t

+#else

+#  if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)

+#    define z_off64_t __int64

+#  else

+#    define z_off64_t z_off_t

+#  endif

+#endif

+

+/* MVS linker does not support external names larger than 8 bytes */

+#if defined(__MVS__)

+  #pragma map(deflateInit_,"DEIN")

+  #pragma map(deflateInit2_,"DEIN2")

+  #pragma map(deflateEnd,"DEEND")

+  #pragma map(deflateBound,"DEBND")

+  #pragma map(inflateInit_,"ININ")

+  #pragma map(inflateInit2_,"ININ2")

+  #pragma map(inflateEnd,"INEND")

+  #pragma map(inflateSync,"INSY")

+  #pragma map(inflateSetDictionary,"INSEDI")

+  #pragma map(compressBound,"CMBND")

+  #pragma map(inflate_table,"INTABL")

+  #pragma map(inflate_fast,"INFA")

+  #pragma map(inflate_copyright,"INCOPY")

+#endif

+

+#endif /* ZCONF_H */

diff --git a/core/include/thirdparties/zlib/zlib.h b/core/include/thirdparties/zlib/zlib.h
new file mode 100644
index 0000000..5e068c4
--- /dev/null
+++ b/core/include/thirdparties/zlib/zlib.h
@@ -0,0 +1,1828 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library

+  version 1.2.8, April 28th, 2013

+

+  Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler

+

+  This software is provided 'as-is', without any express or implied

+  warranty.  In no event will the authors be held liable for any damages

+  arising from the use of this software.

+

+  Permission is granted to anyone to use this software for any purpose,

+  including commercial applications, and to alter it and redistribute it

+  freely, subject to the following restrictions:

+

+  1. The origin of this software must not be misrepresented; you must not

+     claim that you wrote the original software. If you use this software

+     in a product, an acknowledgment in the product documentation would be

+     appreciated but is not required.

+  2. Altered source versions must be plainly marked as such, and must not be

+     misrepresented as being the original software.

+  3. This notice may not be removed or altered from any source distribution.

+

+  Jean-loup Gailly        Mark Adler

+  jloup@gzip.org          madler@alumni.caltech.edu

+

+

+  The data format used by the zlib library is described by RFCs (Request for

+  Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950

+  (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).

+*/

+

+#ifndef ZLIB_H

+#define ZLIB_H

+

+#define deflate_copyright FPDFAPI_deflate_copyright

+#define adler32 FPDFAPI_adler32

+#define compress2 FPDFAPI_compress2

+#define compress FPDFAPI_compress

+#define compressBound FPDFAPI_compressBound

+#define get_crc_table FPDFAPI_get_crc_table

+#define crc32 FPDFAPI_crc32

+#define deflateInit_ FPDFAPI_deflateInit_

+#define deflateInit2_ FPDFAPI_deflateInit2_

+#define deflateSetDictionary FPDFAPI_deflateSetDictionary

+#define deflateReset FPDFAPI_deflateReset

+#define deflatePrime FPDFAPI_deflatePrime

+#define deflateParams FPDFAPI_deflateParams

+#define deflateBound FPDFAPI_deflateBound

+#define deflateSetHeader FPDFAPI_deflateSetHeader

+#define deflateTune FPDFAPI_deflateTune

+#define deflate FPDFAPI_deflate

+#define deflateEnd FPDFAPI_deflateEnd

+#define deflateCopy FPDFAPI_deflateCopy

+#define inflateBackInit_ FPDFAPI_inflateBackInit_

+#define inflateBack FPDFAPI_inflateBack

+#define inflateBackEnd FPDFAPI_inflateBackEnd

+#define inflateReset FPDFAPI_inflateReset

+#define inflateInit2_ FPDFAPI_inflateInit2_

+#define inflateInit_ FPDFAPI_inflateInit_

+#define inflate FPDFAPI_inflate

+#define inflateEnd FPDFAPI_inflateEnd

+#define inflateSetDictionary FPDFAPI_inflateSetDictionary

+#define inflateSync FPDFAPI_inflateSync

+#define inflateSyncPoint FPDFAPI_inflateSyncPoint

+#define inflateCopy FPDFAPI_inflateCopy

+#define uncompress FPDFAPI_uncompress

+#define zlibVersion FPDFAPI_zlibVersion

+#define zlibCompileFlags FPDFAPI_zlibCompileFlags

+#define zError FPDFAPI_zError

+#define z_errmsg FPDFAPI_z_errmsg

+#define zcfree FPDFAPI_zcfree

+#define zcalloc FPDFAPI_zcalloc

+#define inflate_fast FPDFAPI_inflate_fast

+#define inflate_table FPDFAPI_inflate_table

+#define inflate_copyright FPDFAPI_inflate_copyright

+#define _length_code FPDFAPI_length_code

+#define _tr_flush_block FPDFAPI_tr_flush_block

+#define _dist_code FPDFAPI_dist_code

+#define _tr_stored_block FPDFAPI_tr_stored_block

+#define _tr_init FPDFAPI_tr_init

+#define _tr_align FPDFAPI_tr_align

+#define _tr_tally FPDFAPI_tr_tally

+#define adler32_combine FPDFAPI_adler32_combine

+#define inflatePrime FPDFAPI_inflatePrime

+#define inflateGetHeader FPDFAPI_inflateGetHeader

+#define crc32_combine FPDFAPI_crc32_combine

+#define inflateReset2 FPDFAPI_inflateReset2

+#define inflateUndermine FPDFAPI_inflateUndermine

+#define inflateMark FPDFAPI_inflateMark

+#define adler32_combine64 FPDFAPI_adler32_combine64

+

+#include "zconf.h"

+

+/* Sunliang.Liu 20100908 sync the config to the old revision. NO_GZIP */

+#define NO_GZIP		/* XYQ */

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#define ZLIB_VERSION "1.2.8"

+#define ZLIB_VERNUM 0x1280

+#define ZLIB_VER_MAJOR 1

+#define ZLIB_VER_MINOR 2

+#define ZLIB_VER_REVISION 8

+#define ZLIB_VER_SUBREVISION 0

+

+/*

+    The 'zlib' compression library provides in-memory compression and

+  decompression functions, including integrity checks of the uncompressed data.

+  This version of the library supports only one compression method (deflation)

+  but other algorithms will be added later and will have the same stream

+  interface.

+

+    Compression can be done in a single step if the buffers are large enough,

+  or can be done by repeated calls of the compression function.  In the latter

+  case, the application must provide more input and/or consume the output

+  (providing more output space) before each call.

+

+    The compressed data format used by default by the in-memory functions is

+  the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped

+  around a deflate stream, which is itself documented in RFC 1951.

+

+    The library also supports reading and writing files in gzip (.gz) format

+  with an interface similar to that of stdio using the functions that start

+  with "gz".  The gzip format is different from the zlib format.  gzip is a

+  gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.

+

+    This library can optionally read and write gzip streams in memory as well.

+

+    The zlib format was designed to be compact and fast for use in memory

+  and on communications channels.  The gzip format was designed for single-

+  file compression on file systems, has a larger header than zlib to maintain

+  directory information, and uses a different, slower check method than zlib.

+

+    The library does not install any signal handler.  The decoder checks

+  the consistency of the compressed data, so the library should never crash

+  even in case of corrupted input.

+*/

+

+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));

+typedef void   (*free_func)  OF((voidpf opaque, voidpf address));

+

+struct internal_state;

+

+typedef struct z_stream_s {

+    z_const Bytef *next_in;     /* next input byte */

+    uInt     avail_in;  /* number of bytes available at next_in */

+    uLong    total_in;  /* total number of input bytes read so far */

+

+    Bytef    *next_out; /* next output byte should be put there */

+    uInt     avail_out; /* remaining free space at next_out */

+    uLong    total_out; /* total number of bytes output so far */

+

+    z_const char *msg;  /* last error message, NULL if no error */

+    struct internal_state FAR *state; /* not visible by applications */

+

+    alloc_func zalloc;  /* used to allocate the internal state */

+    free_func  zfree;   /* used to free the internal state */

+    voidpf     opaque;  /* private data object passed to zalloc and zfree */

+

+    int     data_type;  /* best guess about the data type: binary or text */

+    uLong   adler;      /* adler32 value of the uncompressed data */

+    uLong   reserved;   /* reserved for future use */

+} z_stream;

+

+typedef z_stream FAR *z_streamp;

+

+/*

+     gzip header information passed to and from zlib routines.  See RFC 1952

+  for more details on the meanings of these fields.

+*/

+typedef struct gz_header_s {

+    int     text;       /* true if compressed data believed to be text */

+    uLong   time;       /* modification time */

+    int     xflags;     /* extra flags (not used when writing a gzip file) */

+    int     os;         /* operating system */

+    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */

+    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */

+    uInt    extra_max;  /* space at extra (only when reading header) */

+    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */

+    uInt    name_max;   /* space at name (only when reading header) */

+    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */

+    uInt    comm_max;   /* space at comment (only when reading header) */

+    int     hcrc;       /* true if there was or will be a header crc */

+    int     done;       /* true when done reading gzip header (not used

+                           when writing a gzip file) */

+} gz_header;

+

+typedef gz_header FAR *gz_headerp;

+

+/*

+     The application must update next_in and avail_in when avail_in has dropped

+   to zero.  It must update next_out and avail_out when avail_out has dropped

+   to zero.  The application must initialize zalloc, zfree and opaque before

+   calling the init function.  All other fields are set by the compression

+   library and must not be updated by the application.

+

+     The opaque value provided by the application will be passed as the first

+   parameter for calls of zalloc and zfree.  This can be useful for custom

+   memory management.  The compression library attaches no meaning to the

+   opaque value.

+

+     zalloc must return Z_NULL if there is not enough memory for the object.

+   If zlib is used in a multi-threaded application, zalloc and zfree must be

+   thread safe.

+

+     On 16-bit systems, the functions zalloc and zfree must be able to allocate

+   exactly 65536 bytes, but will not be required to allocate more than this if

+   the symbol MAXSEG_64K is defined (see zconf.h).  WARNING: On MSDOS, pointers

+   returned by zalloc for objects of exactly 65536 bytes *must* have their

+   offset normalized to zero.  The default allocation function provided by this

+   library ensures this (see zutil.c).  To reduce memory requirements and avoid

+   any allocation of 64K objects, at the expense of compression ratio, compile

+   the library with -DMAX_WBITS=14 (see zconf.h).

+

+     The fields total_in and total_out can be used for statistics or progress

+   reports.  After compression, total_in holds the total size of the

+   uncompressed data and may be saved for use in the decompressor (particularly

+   if the decompressor wants to decompress everything in a single step).

+*/

+

+                        /* constants */

+

+#define Z_NO_FLUSH      0

+#define Z_PARTIAL_FLUSH 1

+#define Z_SYNC_FLUSH    2

+#define Z_FULL_FLUSH    3

+#define Z_FINISH        4

+#define Z_BLOCK         5

+#define Z_TREES         6

+/* Allowed flush values; see deflate() and inflate() below for details */

+

+#define Z_OK            0

+#define Z_STREAM_END    1

+#define Z_NEED_DICT     2

+#define Z_ERRNO        (-1)

+#define Z_STREAM_ERROR (-2)

+#define Z_DATA_ERROR   (-3)

+#define Z_MEM_ERROR    (-4)

+#define Z_BUF_ERROR    (-5)

+#define Z_VERSION_ERROR (-6)

+/* Return codes for the compression/decompression functions. Negative values

+ * are errors, positive values are used for special but normal events.

+ */

+

+#define Z_NO_COMPRESSION         0

+#define Z_BEST_SPEED             1

+#define Z_BEST_COMPRESSION       9

+#define Z_DEFAULT_COMPRESSION  (-1)

+/* compression levels */

+

+#define Z_FILTERED            1

+#define Z_HUFFMAN_ONLY        2

+#define Z_RLE                 3

+#define Z_FIXED               4

+#define Z_DEFAULT_STRATEGY    0

+/* compression strategy; see deflateInit2() below for details */

+

+#define Z_BINARY   0

+#define Z_TEXT     1

+#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */

+#define Z_UNKNOWN  2

+/* Possible values of the data_type field (though see inflate()) */

+

+#define Z_DEFLATED   8

+/* The deflate compression method (the only one supported in this version) */

+

+#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */

+

+#define zlib_version zlibVersion()

+/* for compatibility with versions < 1.0.2 */

+

+

+                        /* basic functions */

+

+ZEXTERN const char * ZEXPORT zlibVersion OF((void));

+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.

+   If the first character differs, the library code actually used is not

+   compatible with the zlib.h header file used by the application.  This check

+   is automatically made by deflateInit and inflateInit.

+ */

+

+/*

+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));

+

+     Initializes the internal stream state for compression.  The fields

+   zalloc, zfree and opaque must be initialized before by the caller.  If

+   zalloc and zfree are set to Z_NULL, deflateInit updates them to use default

+   allocation functions.

+

+     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:

+   1 gives best speed, 9 gives best compression, 0 gives no compression at all

+   (the input data is simply copied a block at a time).  Z_DEFAULT_COMPRESSION

+   requests a default compromise between speed and compression (currently

+   equivalent to level 6).

+

+     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough

+   memory, Z_STREAM_ERROR if level is not a valid compression level, or

+   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible

+   with the version assumed by the caller (ZLIB_VERSION).  msg is set to null

+   if there is no error message.  deflateInit does not perform any compression:

+   this will be done by deflate().

+*/

+

+

+ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));

+/*

+    deflate compresses as much data as possible, and stops when the input

+  buffer becomes empty or the output buffer becomes full.  It may introduce

+  some output latency (reading input without producing any output) except when

+  forced to flush.

+

+    The detailed semantics are as follows.  deflate performs one or both of the

+  following actions:

+

+  - Compress more input starting at next_in and update next_in and avail_in

+    accordingly.  If not all input can be processed (because there is not

+    enough room in the output buffer), next_in and avail_in are updated and

+    processing will resume at this point for the next call of deflate().

+

+  - Provide more output starting at next_out and update next_out and avail_out

+    accordingly.  This action is forced if the parameter flush is non zero.

+    Forcing flush frequently degrades the compression ratio, so this parameter

+    should be set only when necessary (in interactive applications).  Some

+    output may be provided even if flush is not set.

+

+    Before the call of deflate(), the application should ensure that at least

+  one of the actions is possible, by providing more input and/or consuming more

+  output, and updating avail_in or avail_out accordingly; avail_out should

+  never be zero before the call.  The application can consume the compressed

+  output when it wants, for example when the output buffer is full (avail_out

+  == 0), or after each call of deflate().  If deflate returns Z_OK and with

+  zero avail_out, it must be called again after making room in the output

+  buffer because there might be more output pending.

+

+    Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to

+  decide how much data to accumulate before producing output, in order to

+  maximize compression.

+

+    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is

+  flushed to the output buffer and the output is aligned on a byte boundary, so

+  that the decompressor can get all input data available so far.  (In

+  particular avail_in is zero after the call if enough output space has been

+  provided before the call.) Flushing may degrade compression for some

+  compression algorithms and so it should be used only when necessary.  This

+  completes the current deflate block and follows it with an empty stored block

+  that is three bits plus filler bits to the next byte, followed by four bytes

+  (00 00 ff ff).

+

+    If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the

+  output buffer, but the output is not aligned to a byte boundary.  All of the

+  input data so far will be available to the decompressor, as for Z_SYNC_FLUSH.

+  This completes the current deflate block and follows it with an empty fixed

+  codes block that is 10 bits long.  This assures that enough bytes are output

+  in order for the decompressor to finish the block before the empty fixed code

+  block.

+

+    If flush is set to Z_BLOCK, a deflate block is completed and emitted, as

+  for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to

+  seven bits of the current block are held to be written as the next byte after

+  the next deflate block is completed.  In this case, the decompressor may not

+  be provided enough bits at this point in order to complete decompression of

+  the data provided so far to the compressor.  It may need to wait for the next

+  block to be emitted.  This is for advanced applications that need to control

+  the emission of deflate blocks.

+

+    If flush is set to Z_FULL_FLUSH, all output is flushed as with

+  Z_SYNC_FLUSH, and the compression state is reset so that decompression can

+  restart from this point if previous compressed data has been damaged or if

+  random access is desired.  Using Z_FULL_FLUSH too often can seriously degrade

+  compression.

+

+    If deflate returns with avail_out == 0, this function must be called again

+  with the same value of the flush parameter and more output space (updated

+  avail_out), until the flush is complete (deflate returns with non-zero

+  avail_out).  In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that

+  avail_out is greater than six to avoid repeated flush markers due to

+  avail_out == 0 on return.

+

+    If the parameter flush is set to Z_FINISH, pending input is processed,

+  pending output is flushed and deflate returns with Z_STREAM_END if there was

+  enough output space; if deflate returns with Z_OK, this function must be

+  called again with Z_FINISH and more output space (updated avail_out) but no

+  more input data, until it returns with Z_STREAM_END or an error.  After

+  deflate has returned Z_STREAM_END, the only possible operations on the stream

+  are deflateReset or deflateEnd.

+

+    Z_FINISH can be used immediately after deflateInit if all the compression

+  is to be done in a single step.  In this case, avail_out must be at least the

+  value returned by deflateBound (see below).  Then deflate is guaranteed to

+  return Z_STREAM_END.  If not enough output space is provided, deflate will

+  not return Z_STREAM_END, and it must be called again as described above.

+

+    deflate() sets strm->adler to the adler32 checksum of all input read

+  so far (that is, total_in bytes).

+

+    deflate() may update strm->data_type if it can make a good guess about

+  the input data type (Z_BINARY or Z_TEXT).  In doubt, the data is considered

+  binary.  This field is only for information purposes and does not affect the

+  compression algorithm in any manner.

+

+    deflate() returns Z_OK if some progress has been made (more input

+  processed or more output produced), Z_STREAM_END if all input has been

+  consumed and all output has been produced (only when flush is set to

+  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example

+  if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible

+  (for example avail_in or avail_out was zero).  Note that Z_BUF_ERROR is not

+  fatal, and deflate() can be called again with more input and more output

+  space to continue compressing.

+*/

+

+

+ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));

+/*

+     All dynamically allocated data structures for this stream are freed.

+   This function discards any unprocessed input and does not flush any pending

+   output.

+

+     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the

+   stream state was inconsistent, Z_DATA_ERROR if the stream was freed

+   prematurely (some input or output was discarded).  In the error case, msg

+   may be set but then points to a static string (which must not be

+   deallocated).

+*/

+

+

+/*

+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));

+

+     Initializes the internal stream state for decompression.  The fields

+   next_in, avail_in, zalloc, zfree and opaque must be initialized before by

+   the caller.  If next_in is not Z_NULL and avail_in is large enough (the

+   exact value depends on the compression method), inflateInit determines the

+   compression method from the zlib header and allocates all data structures

+   accordingly; otherwise the allocation will be deferred to the first call of

+   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to

+   use default allocation functions.

+

+     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough

+   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the

+   version assumed by the caller, or Z_STREAM_ERROR if the parameters are

+   invalid, such as a null pointer to the structure.  msg is set to null if

+   there is no error message.  inflateInit does not perform any decompression

+   apart from possibly reading the zlib header if present: actual decompression

+   will be done by inflate().  (So next_in and avail_in may be modified, but

+   next_out and avail_out are unused and unchanged.) The current implementation

+   of inflateInit() does not process any header information -- that is deferred

+   until inflate() is called.

+*/

+

+

+ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));

+/*

+    inflate decompresses as much data as possible, and stops when the input

+  buffer becomes empty or the output buffer becomes full.  It may introduce

+  some output latency (reading input without producing any output) except when

+  forced to flush.

+

+  The detailed semantics are as follows.  inflate performs one or both of the

+  following actions:

+

+  - Decompress more input starting at next_in and update next_in and avail_in

+    accordingly.  If not all input can be processed (because there is not

+    enough room in the output buffer), next_in is updated and processing will

+    resume at this point for the next call of inflate().

+

+  - Provide more output starting at next_out and update next_out and avail_out

+    accordingly.  inflate() provides as much output as possible, until there is

+    no more input data or no more space in the output buffer (see below about

+    the flush parameter).

+

+    Before the call of inflate(), the application should ensure that at least

+  one of the actions is possible, by providing more input and/or consuming more

+  output, and updating the next_* and avail_* values accordingly.  The

+  application can consume the uncompressed output when it wants, for example

+  when the output buffer is full (avail_out == 0), or after each call of

+  inflate().  If inflate returns Z_OK and with zero avail_out, it must be

+  called again after making room in the output buffer because there might be

+  more output pending.

+

+    The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH,

+  Z_BLOCK, or Z_TREES.  Z_SYNC_FLUSH requests that inflate() flush as much

+  output as possible to the output buffer.  Z_BLOCK requests that inflate()

+  stop if and when it gets to the next deflate block boundary.  When decoding

+  the zlib or gzip format, this will cause inflate() to return immediately

+  after the header and before the first block.  When doing a raw inflate,

+  inflate() will go ahead and process the first block, and will return when it

+  gets to the end of that block, or when it runs out of data.

+

+    The Z_BLOCK option assists in appending to or combining deflate streams.

+  Also to assist in this, on return inflate() will set strm->data_type to the

+  number of unused bits in the last byte taken from strm->next_in, plus 64 if

+  inflate() is currently decoding the last block in the deflate stream, plus

+  128 if inflate() returned immediately after decoding an end-of-block code or

+  decoding the complete header up to just before the first byte of the deflate

+  stream.  The end-of-block will not be indicated until all of the uncompressed

+  data from that block has been written to strm->next_out.  The number of

+  unused bits may in general be greater than seven, except when bit 7 of

+  data_type is set, in which case the number of unused bits will be less than

+  eight.  data_type is set as noted here every time inflate() returns for all

+  flush options, and so can be used to determine the amount of currently

+  consumed input in bits.

+

+    The Z_TREES option behaves as Z_BLOCK does, but it also returns when the

+  end of each deflate block header is reached, before any actual data in that

+  block is decoded.  This allows the caller to determine the length of the

+  deflate block header for later use in random access within a deflate block.

+  256 is added to the value of strm->data_type when inflate() returns

+  immediately after reaching the end of the deflate block header.

+

+    inflate() should normally be called until it returns Z_STREAM_END or an

+  error.  However if all decompression is to be performed in a single step (a

+  single call of inflate), the parameter flush should be set to Z_FINISH.  In

+  this case all pending input is processed and all pending output is flushed;

+  avail_out must be large enough to hold all of the uncompressed data for the

+  operation to complete.  (The size of the uncompressed data may have been

+  saved by the compressor for this purpose.) The use of Z_FINISH is not

+  required to perform an inflation in one step.  However it may be used to

+  inform inflate that a faster approach can be used for the single inflate()

+  call.  Z_FINISH also informs inflate to not maintain a sliding window if the

+  stream completes, which reduces inflate's memory footprint.  If the stream

+  does not complete, either because not all of the stream is provided or not

+  enough output space is provided, then a sliding window will be allocated and

+  inflate() can be called again to continue the operation as if Z_NO_FLUSH had

+  been used.

+

+     In this implementation, inflate() always flushes as much output as

+  possible to the output buffer, and always uses the faster approach on the

+  first call.  So the effects of the flush parameter in this implementation are

+  on the return value of inflate() as noted below, when inflate() returns early

+  when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of

+  memory for a sliding window when Z_FINISH is used.

+

+     If a preset dictionary is needed after this call (see inflateSetDictionary

+  below), inflate sets strm->adler to the Adler-32 checksum of the dictionary

+  chosen by the compressor and returns Z_NEED_DICT; otherwise it sets

+  strm->adler to the Adler-32 checksum of all output produced so far (that is,

+  total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described

+  below.  At the end of the stream, inflate() checks that its computed adler32

+  checksum is equal to that saved by the compressor and returns Z_STREAM_END

+  only if the checksum is correct.

+

+    inflate() can decompress and check either zlib-wrapped or gzip-wrapped

+  deflate data.  The header type is detected automatically, if requested when

+  initializing with inflateInit2().  Any information contained in the gzip

+  header is not retained, so applications that need that information should

+  instead use raw inflate, see inflateInit2() below, or inflateBack() and

+  perform their own processing of the gzip header and trailer.  When processing

+  gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output

+  producted so far.  The CRC-32 is checked against the gzip trailer.

+

+    inflate() returns Z_OK if some progress has been made (more input processed

+  or more output produced), Z_STREAM_END if the end of the compressed data has

+  been reached and all uncompressed output has been produced, Z_NEED_DICT if a

+  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was

+  corrupted (input stream not conforming to the zlib format or incorrect check

+  value), Z_STREAM_ERROR if the stream structure was inconsistent (for example

+  next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory,

+  Z_BUF_ERROR if no progress is possible or if there was not enough room in the

+  output buffer when Z_FINISH is used.  Note that Z_BUF_ERROR is not fatal, and

+  inflate() can be called again with more input and more output space to

+  continue decompressing.  If Z_DATA_ERROR is returned, the application may

+  then call inflateSync() to look for a good compression block if a partial

+  recovery of the data is desired.

+*/

+

+

+ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));

+/*

+     All dynamically allocated data structures for this stream are freed.

+   This function discards any unprocessed input and does not flush any pending

+   output.

+

+     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state

+   was inconsistent.  In the error case, msg may be set but then points to a

+   static string (which must not be deallocated).

+*/

+

+

+                        /* Advanced functions */

+

+/*

+    The following functions are needed only in some special applications.

+*/

+

+/*

+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,

+                                     int  level,

+                                     int  method,

+                                     int  windowBits,

+                                     int  memLevel,

+                                     int  strategy));

+

+     This is another version of deflateInit with more compression options.  The

+   fields next_in, zalloc, zfree and opaque must be initialized before by the

+   caller.

+

+     The method parameter is the compression method.  It must be Z_DEFLATED in

+   this version of the library.

+

+     The windowBits parameter is the base two logarithm of the window size

+   (the size of the history buffer).  It should be in the range 8..15 for this

+   version of the library.  Larger values of this parameter result in better

+   compression at the expense of memory usage.  The default value is 15 if

+   deflateInit is used instead.

+

+     windowBits can also be -8..-15 for raw deflate.  In this case, -windowBits

+   determines the window size.  deflate() will then generate raw deflate data

+   with no zlib header or trailer, and will not compute an adler32 check value.

+

+     windowBits can also be greater than 15 for optional gzip encoding.  Add

+   16 to windowBits to write a simple gzip header and trailer around the

+   compressed data instead of a zlib wrapper.  The gzip header will have no

+   file name, no extra data, no comment, no modification time (set to zero), no

+   header crc, and the operating system will be set to 255 (unknown).  If a

+   gzip stream is being written, strm->adler is a crc32 instead of an adler32.

+

+     The memLevel parameter specifies how much memory should be allocated

+   for the internal compression state.  memLevel=1 uses minimum memory but is

+   slow and reduces compression ratio; memLevel=9 uses maximum memory for

+   optimal speed.  The default value is 8.  See zconf.h for total memory usage

+   as a function of windowBits and memLevel.

+

+     The strategy parameter is used to tune the compression algorithm.  Use the

+   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a

+   filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no

+   string match), or Z_RLE to limit match distances to one (run-length

+   encoding).  Filtered data consists mostly of small values with a somewhat

+   random distribution.  In this case, the compression algorithm is tuned to

+   compress them better.  The effect of Z_FILTERED is to force more Huffman

+   coding and less string matching; it is somewhat intermediate between

+   Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY.  Z_RLE is designed to be almost as

+   fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data.  The

+   strategy parameter only affects the compression ratio but not the

+   correctness of the compressed output even if it is not set appropriately.

+   Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler

+   decoder for special applications.

+

+     deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough

+   memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid

+   method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is

+   incompatible with the version assumed by the caller (ZLIB_VERSION).  msg is

+   set to null if there is no error message.  deflateInit2 does not perform any

+   compression: this will be done by deflate().

+*/

+

+ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,

+                                             const Bytef *dictionary,

+                                             uInt  dictLength));

+/*

+     Initializes the compression dictionary from the given byte sequence

+   without producing any compressed output.  When using the zlib format, this

+   function must be called immediately after deflateInit, deflateInit2 or

+   deflateReset, and before any call of deflate.  When doing raw deflate, this

+   function must be called either before any call of deflate, or immediately

+   after the completion of a deflate block, i.e. after all input has been

+   consumed and all output has been delivered when using any of the flush

+   options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH.  The

+   compressor and decompressor must use exactly the same dictionary (see

+   inflateSetDictionary).

+

+     The dictionary should consist of strings (byte sequences) that are likely

+   to be encountered later in the data to be compressed, with the most commonly

+   used strings preferably put towards the end of the dictionary.  Using a

+   dictionary is most useful when the data to be compressed is short and can be

+   predicted with good accuracy; the data can then be compressed better than

+   with the default empty dictionary.

+

+     Depending on the size of the compression data structures selected by

+   deflateInit or deflateInit2, a part of the dictionary may in effect be

+   discarded, for example if the dictionary is larger than the window size

+   provided in deflateInit or deflateInit2.  Thus the strings most likely to be

+   useful should be put at the end of the dictionary, not at the front.  In

+   addition, the current implementation of deflate will use at most the window

+   size minus 262 bytes of the provided dictionary.

+

+     Upon return of this function, strm->adler is set to the adler32 value

+   of the dictionary; the decompressor may later use this value to determine

+   which dictionary has been used by the compressor.  (The adler32 value

+   applies to the whole dictionary even if only a subset of the dictionary is

+   actually used by the compressor.) If a raw deflate was requested, then the

+   adler32 value is not computed and strm->adler is not set.

+

+     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a

+   parameter is invalid (e.g.  dictionary being Z_NULL) or the stream state is

+   inconsistent (for example if deflate has already been called for this stream

+   or if not at a block boundary for raw deflate).  deflateSetDictionary does

+   not perform any compression: this will be done by deflate().

+*/

+

+ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,

+                                    z_streamp source));

+/*

+     Sets the destination stream as a complete copy of the source stream.

+

+     This function can be useful when several compression strategies will be

+   tried, for example when there are several ways of pre-processing the input

+   data with a filter.  The streams that will be discarded should then be freed

+   by calling deflateEnd.  Note that deflateCopy duplicates the internal

+   compression state which can be quite large, so this strategy is slow and can

+   consume lots of memory.

+

+     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not

+   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent

+   (such as zalloc being Z_NULL).  msg is left unchanged in both source and

+   destination.

+*/

+

+ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));

+/*

+     This function is equivalent to deflateEnd followed by deflateInit,

+   but does not free and reallocate all the internal compression state.  The

+   stream will keep the same compression level and any other attributes that

+   may have been set by deflateInit2.

+

+     deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source

+   stream state was inconsistent (such as zalloc or state being Z_NULL).

+*/

+

+ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,

+                                      int level,

+                                      int strategy));

+/*

+     Dynamically update the compression level and compression strategy.  The

+   interpretation of level and strategy is as in deflateInit2.  This can be

+   used to switch between compression and straight copy of the input data, or

+   to switch to a different kind of input data requiring a different strategy.

+   If the compression level is changed, the input available so far is

+   compressed with the old level (and may be flushed); the new level will take

+   effect only at the next call of deflate().

+

+     Before the call of deflateParams, the stream state must be set as for

+   a call of deflate(), since the currently available input may have to be

+   compressed and flushed.  In particular, strm->avail_out must be non-zero.

+

+     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source

+   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if

+   strm->avail_out was zero.

+*/

+

+ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,

+                                    int good_length,

+                                    int max_lazy,

+                                    int nice_length,

+                                    int max_chain));

+/*

+     Fine tune deflate's internal compression parameters.  This should only be

+   used by someone who understands the algorithm used by zlib's deflate for

+   searching for the best matching string, and even then only by the most

+   fanatic optimizer trying to squeeze out the last compressed bit for their

+   specific input data.  Read the deflate.c source code for the meaning of the

+   max_lazy, good_length, nice_length, and max_chain parameters.

+

+     deflateTune() can be called after deflateInit() or deflateInit2(), and

+   returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.

+ */

+

+ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,

+                                       uLong sourceLen));

+/*

+     deflateBound() returns an upper bound on the compressed size after

+   deflation of sourceLen bytes.  It must be called after deflateInit() or

+   deflateInit2(), and after deflateSetHeader(), if used.  This would be used

+   to allocate an output buffer for deflation in a single pass, and so would be

+   called before deflate().  If that first deflate() call is provided the

+   sourceLen input bytes, an output buffer allocated to the size returned by

+   deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed

+   to return Z_STREAM_END.  Note that it is possible for the compressed size to

+   be larger than the value returned by deflateBound() if flush options other

+   than Z_FINISH or Z_NO_FLUSH are used.

+*/

+

+ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,

+                                       unsigned *pending,

+                                       int *bits));

+/*

+     deflatePending() returns the number of bytes and bits of output that have

+   been generated, but not yet provided in the available output.  The bytes not

+   provided would be due to the available output space having being consumed.

+   The number of bits of output not provided are between 0 and 7, where they

+   await more bits to join them in order to fill out a full byte.  If pending

+   or bits are Z_NULL, then those values are not set.

+

+     deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source

+   stream state was inconsistent.

+ */

+

+ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,

+                                     int bits,

+                                     int value));

+/*

+     deflatePrime() inserts bits in the deflate output stream.  The intent

+   is that this function is used to start off the deflate output with the bits

+   leftover from a previous deflate stream when appending to it.  As such, this

+   function can only be used for raw deflate, and must be used before the first

+   deflate() call after a deflateInit2() or deflateReset().  bits must be less

+   than or equal to 16, and that many of the least significant bits of value

+   will be inserted in the output.

+

+     deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough

+   room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the

+   source stream state was inconsistent.

+*/

+

+ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,

+                                         gz_headerp head));

+/*

+     deflateSetHeader() provides gzip header information for when a gzip

+   stream is requested by deflateInit2().  deflateSetHeader() may be called

+   after deflateInit2() or deflateReset() and before the first call of

+   deflate().  The text, time, os, extra field, name, and comment information

+   in the provided gz_header structure are written to the gzip header (xflag is

+   ignored -- the extra flags are set according to the compression level).  The

+   caller must assure that, if not Z_NULL, name and comment are terminated with

+   a zero byte, and that if extra is not Z_NULL, that extra_len bytes are

+   available there.  If hcrc is true, a gzip header crc is included.  Note that

+   the current versions of the command-line version of gzip (up through version

+   1.3.x) do not support header crc's, and will report that it is a "multi-part

+   gzip file" and give up.

+

+     If deflateSetHeader is not used, the default gzip header has text false,

+   the time set to zero, and os set to 255, with no extra, name, or comment

+   fields.  The gzip header is returned to the default state by deflateReset().

+

+     deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source

+   stream state was inconsistent.

+*/

+

+/*

+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,

+                                     int  windowBits));

+

+     This is another version of inflateInit with an extra parameter.  The

+   fields next_in, avail_in, zalloc, zfree and opaque must be initialized

+   before by the caller.

+

+     The windowBits parameter is the base two logarithm of the maximum window

+   size (the size of the history buffer).  It should be in the range 8..15 for

+   this version of the library.  The default value is 15 if inflateInit is used

+   instead.  windowBits must be greater than or equal to the windowBits value

+   provided to deflateInit2() while compressing, or it must be equal to 15 if

+   deflateInit2() was not used.  If a compressed stream with a larger window

+   size is given as input, inflate() will return with the error code

+   Z_DATA_ERROR instead of trying to allocate a larger window.

+

+     windowBits can also be zero to request that inflate use the window size in

+   the zlib header of the compressed stream.

+

+     windowBits can also be -8..-15 for raw inflate.  In this case, -windowBits

+   determines the window size.  inflate() will then process raw deflate data,

+   not looking for a zlib or gzip header, not generating a check value, and not

+   looking for any check values for comparison at the end of the stream.  This

+   is for use with other formats that use the deflate compressed data format

+   such as zip.  Those formats provide their own check values.  If a custom

+   format is developed using the raw deflate format for compressed data, it is

+   recommended that a check value such as an adler32 or a crc32 be applied to

+   the uncompressed data as is done in the zlib, gzip, and zip formats.  For

+   most applications, the zlib format should be used as is.  Note that comments

+   above on the use in deflateInit2() applies to the magnitude of windowBits.

+

+     windowBits can also be greater than 15 for optional gzip decoding.  Add

+   32 to windowBits to enable zlib and gzip decoding with automatic header

+   detection, or add 16 to decode only the gzip format (the zlib format will

+   return a Z_DATA_ERROR).  If a gzip stream is being decoded, strm->adler is a

+   crc32 instead of an adler32.

+

+     inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough

+   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the

+   version assumed by the caller, or Z_STREAM_ERROR if the parameters are

+   invalid, such as a null pointer to the structure.  msg is set to null if

+   there is no error message.  inflateInit2 does not perform any decompression

+   apart from possibly reading the zlib header if present: actual decompression

+   will be done by inflate().  (So next_in and avail_in may be modified, but

+   next_out and avail_out are unused and unchanged.) The current implementation

+   of inflateInit2() does not process any header information -- that is

+   deferred until inflate() is called.

+*/

+

+ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,

+                                             const Bytef *dictionary,

+                                             uInt  dictLength));

+/*

+     Initializes the decompression dictionary from the given uncompressed byte

+   sequence.  This function must be called immediately after a call of inflate,

+   if that call returned Z_NEED_DICT.  The dictionary chosen by the compressor

+   can be determined from the adler32 value returned by that call of inflate.

+   The compressor and decompressor must use exactly the same dictionary (see

+   deflateSetDictionary).  For raw inflate, this function can be called at any

+   time to set the dictionary.  If the provided dictionary is smaller than the

+   window and there is already data in the window, then the provided dictionary

+   will amend what's there.  The application must insure that the dictionary

+   that was used for compression is provided.

+

+     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a

+   parameter is invalid (e.g.  dictionary being Z_NULL) or the stream state is

+   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the

+   expected one (incorrect adler32 value).  inflateSetDictionary does not

+   perform any decompression: this will be done by subsequent calls of

+   inflate().

+*/

+

+ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,

+                                             Bytef *dictionary,

+                                             uInt  *dictLength));

+/*

+     Returns the sliding dictionary being maintained by inflate.  dictLength is

+   set to the number of bytes in the dictionary, and that many bytes are copied

+   to dictionary.  dictionary must have enough space, where 32768 bytes is

+   always enough.  If inflateGetDictionary() is called with dictionary equal to

+   Z_NULL, then only the dictionary length is returned, and nothing is copied.

+   Similary, if dictLength is Z_NULL, then it is not set.

+

+     inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the

+   stream state is inconsistent.

+*/

+

+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));

+/*

+     Skips invalid compressed data until a possible full flush point (see above

+   for the description of deflate with Z_FULL_FLUSH) can be found, or until all

+   available input is skipped.  No output is provided.

+

+     inflateSync searches for a 00 00 FF FF pattern in the compressed data.

+   All full flush points have this pattern, but not all occurrences of this

+   pattern are full flush points.

+

+     inflateSync returns Z_OK if a possible full flush point has been found,

+   Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point

+   has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.

+   In the success case, the application may save the current current value of

+   total_in which indicates where valid compressed data was found.  In the

+   error case, the application may repeatedly call inflateSync, providing more

+   input each time, until success or end of the input data.

+*/

+

+ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,

+                                    z_streamp source));

+/*

+     Sets the destination stream as a complete copy of the source stream.

+

+     This function can be useful when randomly accessing a large stream.  The

+   first pass through the stream can periodically record the inflate state,

+   allowing restarting inflate at those points when randomly accessing the

+   stream.

+

+     inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not

+   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent

+   (such as zalloc being Z_NULL).  msg is left unchanged in both source and

+   destination.

+*/

+

+ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));

+/*

+     This function is equivalent to inflateEnd followed by inflateInit,

+   but does not free and reallocate all the internal decompression state.  The

+   stream will keep attributes that may have been set by inflateInit2.

+

+     inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source

+   stream state was inconsistent (such as zalloc or state being Z_NULL).

+*/

+

+ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,

+                                      int windowBits));

+/*

+     This function is the same as inflateReset, but it also permits changing

+   the wrap and window size requests.  The windowBits parameter is interpreted

+   the same as it is for inflateInit2.

+

+     inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source

+   stream state was inconsistent (such as zalloc or state being Z_NULL), or if

+   the windowBits parameter is invalid.

+*/

+

+ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,

+                                     int bits,

+                                     int value));

+/*

+     This function inserts bits in the inflate input stream.  The intent is

+   that this function is used to start inflating at a bit position in the

+   middle of a byte.  The provided bits will be used before any bytes are used

+   from next_in.  This function should only be used with raw inflate, and

+   should be used before the first inflate() call after inflateInit2() or

+   inflateReset().  bits must be less than or equal to 16, and that many of the

+   least significant bits of value will be inserted in the input.

+

+     If bits is negative, then the input stream bit buffer is emptied.  Then

+   inflatePrime() can be called again to put bits in the buffer.  This is used

+   to clear out bits leftover after feeding inflate a block description prior

+   to feeding inflate codes.

+

+     inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source

+   stream state was inconsistent.

+*/

+

+ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));

+/*

+     This function returns two values, one in the lower 16 bits of the return

+   value, and the other in the remaining upper bits, obtained by shifting the

+   return value down 16 bits.  If the upper value is -1 and the lower value is

+   zero, then inflate() is currently decoding information outside of a block.

+   If the upper value is -1 and the lower value is non-zero, then inflate is in

+   the middle of a stored block, with the lower value equaling the number of

+   bytes from the input remaining to copy.  If the upper value is not -1, then

+   it is the number of bits back from the current bit position in the input of

+   the code (literal or length/distance pair) currently being processed.  In

+   that case the lower value is the number of bytes already emitted for that

+   code.

+

+     A code is being processed if inflate is waiting for more input to complete

+   decoding of the code, or if it has completed decoding but is waiting for

+   more output space to write the literal or match data.

+

+     inflateMark() is used to mark locations in the input data for random

+   access, which may be at bit positions, and to note those cases where the

+   output of a code may span boundaries of random access blocks.  The current

+   location in the input stream can be determined from avail_in and data_type

+   as noted in the description for the Z_BLOCK flush parameter for inflate.

+

+     inflateMark returns the value noted above or -1 << 16 if the provided

+   source stream state was inconsistent.

+*/

+

+ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,

+                                         gz_headerp head));

+/*

+     inflateGetHeader() requests that gzip header information be stored in the

+   provided gz_header structure.  inflateGetHeader() may be called after

+   inflateInit2() or inflateReset(), and before the first call of inflate().

+   As inflate() processes the gzip stream, head->done is zero until the header

+   is completed, at which time head->done is set to one.  If a zlib stream is

+   being decoded, then head->done is set to -1 to indicate that there will be

+   no gzip header information forthcoming.  Note that Z_BLOCK or Z_TREES can be

+   used to force inflate() to return immediately after header processing is

+   complete and before any actual data is decompressed.

+

+     The text, time, xflags, and os fields are filled in with the gzip header

+   contents.  hcrc is set to true if there is a header CRC.  (The header CRC

+   was valid if done is set to one.) If extra is not Z_NULL, then extra_max

+   contains the maximum number of bytes to write to extra.  Once done is true,

+   extra_len contains the actual extra field length, and extra contains the

+   extra field, or that field truncated if extra_max is less than extra_len.

+   If name is not Z_NULL, then up to name_max characters are written there,

+   terminated with a zero unless the length is greater than name_max.  If

+   comment is not Z_NULL, then up to comm_max characters are written there,

+   terminated with a zero unless the length is greater than comm_max.  When any

+   of extra, name, or comment are not Z_NULL and the respective field is not

+   present in the header, then that field is set to Z_NULL to signal its

+   absence.  This allows the use of deflateSetHeader() with the returned

+   structure to duplicate the header.  However if those fields are set to

+   allocated memory, then the application will need to save those pointers

+   elsewhere so that they can be eventually freed.

+

+     If inflateGetHeader is not used, then the header information is simply

+   discarded.  The header is always checked for validity, including the header

+   CRC if present.  inflateReset() will reset the process to discard the header

+   information.  The application would need to call inflateGetHeader() again to

+   retrieve the header from the next gzip stream.

+

+     inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source

+   stream state was inconsistent.

+*/

+

+/*

+ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,

+                                        unsigned char FAR *window));

+

+     Initialize the internal stream state for decompression using inflateBack()

+   calls.  The fields zalloc, zfree and opaque in strm must be initialized

+   before the call.  If zalloc and zfree are Z_NULL, then the default library-

+   derived memory allocation routines are used.  windowBits is the base two

+   logarithm of the window size, in the range 8..15.  window is a caller

+   supplied buffer of that size.  Except for special applications where it is

+   assured that deflate was used with small window sizes, windowBits must be 15

+   and a 32K byte window must be supplied to be able to decompress general

+   deflate streams.

+

+     See inflateBack() for the usage of these routines.

+

+     inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of

+   the parameters are invalid, Z_MEM_ERROR if the internal state could not be

+   allocated, or Z_VERSION_ERROR if the version of the library does not match

+   the version of the header file.

+*/

+

+typedef unsigned (*in_func) OF((void FAR *,

+                                z_const unsigned char FAR * FAR *));

+typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));

+

+ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,

+                                    in_func in, void FAR *in_desc,

+                                    out_func out, void FAR *out_desc));

+/*

+     inflateBack() does a raw inflate with a single call using a call-back

+   interface for input and output.  This is potentially more efficient than

+   inflate() for file i/o applications, in that it avoids copying between the

+   output and the sliding window by simply making the window itself the output

+   buffer.  inflate() can be faster on modern CPUs when used with large

+   buffers.  inflateBack() trusts the application to not change the output

+   buffer passed by the output function, at least until inflateBack() returns.

+

+     inflateBackInit() must be called first to allocate the internal state

+   and to initialize the state with the user-provided window buffer.

+   inflateBack() may then be used multiple times to inflate a complete, raw

+   deflate stream with each call.  inflateBackEnd() is then called to free the

+   allocated state.

+

+     A raw deflate stream is one with no zlib or gzip header or trailer.

+   This routine would normally be used in a utility that reads zip or gzip

+   files and writes out uncompressed files.  The utility would decode the

+   header and process the trailer on its own, hence this routine expects only

+   the raw deflate stream to decompress.  This is different from the normal

+   behavior of inflate(), which expects either a zlib or gzip header and

+   trailer around the deflate stream.

+

+     inflateBack() uses two subroutines supplied by the caller that are then

+   called by inflateBack() for input and output.  inflateBack() calls those

+   routines until it reads a complete deflate stream and writes out all of the

+   uncompressed data, or until it encounters an error.  The function's

+   parameters and return types are defined above in the in_func and out_func

+   typedefs.  inflateBack() will call in(in_desc, &buf) which should return the

+   number of bytes of provided input, and a pointer to that input in buf.  If

+   there is no input available, in() must return zero--buf is ignored in that

+   case--and inflateBack() will return a buffer error.  inflateBack() will call

+   out(out_desc, buf, len) to write the uncompressed data buf[0..len-1].  out()

+   should return zero on success, or non-zero on failure.  If out() returns

+   non-zero, inflateBack() will return with an error.  Neither in() nor out()

+   are permitted to change the contents of the window provided to

+   inflateBackInit(), which is also the buffer that out() uses to write from.

+   The length written by out() will be at most the window size.  Any non-zero

+   amount of input may be provided by in().

+

+     For convenience, inflateBack() can be provided input on the first call by

+   setting strm->next_in and strm->avail_in.  If that input is exhausted, then

+   in() will be called.  Therefore strm->next_in must be initialized before

+   calling inflateBack().  If strm->next_in is Z_NULL, then in() will be called

+   immediately for input.  If strm->next_in is not Z_NULL, then strm->avail_in

+   must also be initialized, and then if strm->avail_in is not zero, input will

+   initially be taken from strm->next_in[0 ..  strm->avail_in - 1].

+

+     The in_desc and out_desc parameters of inflateBack() is passed as the

+   first parameter of in() and out() respectively when they are called.  These

+   descriptors can be optionally used to pass any information that the caller-

+   supplied in() and out() functions need to do their job.

+

+     On return, inflateBack() will set strm->next_in and strm->avail_in to

+   pass back any unused input that was provided by the last in() call.  The

+   return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR

+   if in() or out() returned an error, Z_DATA_ERROR if there was a format error

+   in the deflate stream (in which case strm->msg is set to indicate the nature

+   of the error), or Z_STREAM_ERROR if the stream was not properly initialized.

+   In the case of Z_BUF_ERROR, an input or output error can be distinguished

+   using strm->next_in which will be Z_NULL only if in() returned an error.  If

+   strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning

+   non-zero.  (in() will always be called before out(), so strm->next_in is

+   assured to be defined if out() returns non-zero.) Note that inflateBack()

+   cannot return Z_OK.

+*/

+

+ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));

+/*

+     All memory allocated by inflateBackInit() is freed.

+

+     inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream

+   state was inconsistent.

+*/

+

+ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));

+/* Return flags indicating compile-time options.

+

+    Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:

+     1.0: size of uInt

+     3.2: size of uLong

+     5.4: size of voidpf (pointer)

+     7.6: size of z_off_t

+

+    Compiler, assembler, and debug options:

+     8: DEBUG

+     9: ASMV or ASMINF -- use ASM code

+     10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention

+     11: 0 (reserved)

+

+    One-time table building (smaller code, but not thread-safe if true):

+     12: BUILDFIXED -- build static block decoding tables when needed

+     13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed

+     14,15: 0 (reserved)

+

+    Library content (indicates missing functionality):

+     16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking

+                          deflate code when not needed)

+     17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect

+                    and decode gzip streams (to avoid linking crc code)

+     18-19: 0 (reserved)

+

+    Operation variations (changes in library functionality):

+     20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate

+     21: FASTEST -- deflate algorithm with only one, lowest compression level

+     22,23: 0 (reserved)

+

+    The sprintf variant used by gzprintf (zero is best):

+     24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format

+     25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!

+     26: 0 = returns value, 1 = void -- 1 means inferred string length returned

+

+    Remainder:

+     27-31: 0 (reserved)

+ */

+

+#ifndef Z_SOLO

+

+                        /* utility functions */

+

+/*

+     The following utility functions are implemented on top of the basic

+   stream-oriented functions.  To simplify the interface, some default options

+   are assumed (compression level and memory usage, standard memory allocation

+   functions).  The source code of these utility functions can be modified if

+   you need special options.

+*/

+

+ZEXTERN int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,

+                                 const Bytef *source, uLong sourceLen));

+/*

+     Compresses the source buffer into the destination buffer.  sourceLen is

+   the byte length of the source buffer.  Upon entry, destLen is the total size

+   of the destination buffer, which must be at least the value returned by

+   compressBound(sourceLen).  Upon exit, destLen is the actual size of the

+   compressed buffer.

+

+     compress returns Z_OK if success, Z_MEM_ERROR if there was not

+   enough memory, Z_BUF_ERROR if there was not enough room in the output

+   buffer.

+*/

+

+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,

+                                  const Bytef *source, uLong sourceLen,

+                                  int level));

+/*

+     Compresses the source buffer into the destination buffer.  The level

+   parameter has the same meaning as in deflateInit.  sourceLen is the byte

+   length of the source buffer.  Upon entry, destLen is the total size of the

+   destination buffer, which must be at least the value returned by

+   compressBound(sourceLen).  Upon exit, destLen is the actual size of the

+   compressed buffer.

+

+     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough

+   memory, Z_BUF_ERROR if there was not enough room in the output buffer,

+   Z_STREAM_ERROR if the level parameter is invalid.

+*/

+

+ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));

+/*

+     compressBound() returns an upper bound on the compressed size after

+   compress() or compress2() on sourceLen bytes.  It would be used before a

+   compress() or compress2() call to allocate the destination buffer.

+*/

+

+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,

+                                   const Bytef *source, uLong sourceLen));

+/*

+     Decompresses the source buffer into the destination buffer.  sourceLen is

+   the byte length of the source buffer.  Upon entry, destLen is the total size

+   of the destination buffer, which must be large enough to hold the entire

+   uncompressed data.  (The size of the uncompressed data must have been saved

+   previously by the compressor and transmitted to the decompressor by some

+   mechanism outside the scope of this compression library.) Upon exit, destLen

+   is the actual size of the uncompressed buffer.

+

+     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not

+   enough memory, Z_BUF_ERROR if there was not enough room in the output

+   buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.  In

+   the case where there is not enough room, uncompress() will fill the output

+   buffer with the uncompressed data up to that point.

+*/

+

+                        /* gzip file access functions */

+

+/*

+     This library supports reading and writing files in gzip (.gz) format with

+   an interface similar to that of stdio, using the functions that start with

+   "gz".  The gzip format is different from the zlib format.  gzip is a gzip

+   wrapper, documented in RFC 1952, wrapped around a deflate stream.

+*/

+

+typedef struct gzFile_s *gzFile;    /* semi-opaque gzip file descriptor */

+

+/*

+ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));

+

+     Opens a gzip (.gz) file for reading or writing.  The mode parameter is as

+   in fopen ("rb" or "wb") but can also include a compression level ("wb9") or

+   a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only

+   compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F'

+   for fixed code compression as in "wb9F".  (See the description of

+   deflateInit2 for more information about the strategy parameter.)  'T' will

+   request transparent writing or appending with no compression and not using

+   the gzip format.

+

+     "a" can be used instead of "w" to request that the gzip stream that will

+   be written be appended to the file.  "+" will result in an error, since

+   reading and writing to the same gzip file is not supported.  The addition of

+   "x" when writing will create the file exclusively, which fails if the file

+   already exists.  On systems that support it, the addition of "e" when

+   reading or writing will set the flag to close the file on an execve() call.

+

+     These functions, as well as gzip, will read and decode a sequence of gzip

+   streams in a file.  The append function of gzopen() can be used to create

+   such a file.  (Also see gzflush() for another way to do this.)  When

+   appending, gzopen does not test whether the file begins with a gzip stream,

+   nor does it look for the end of the gzip streams to begin appending.  gzopen

+   will simply append a gzip stream to the existing file.

+

+     gzopen can be used to read a file which is not in gzip format; in this

+   case gzread will directly read from the file without decompression.  When

+   reading, this will be detected automatically by looking for the magic two-

+   byte gzip header.

+

+     gzopen returns NULL if the file could not be opened, if there was

+   insufficient memory to allocate the gzFile state, or if an invalid mode was

+   specified (an 'r', 'w', or 'a' was not provided, or '+' was provided).

+   errno can be checked to determine if the reason gzopen failed was that the

+   file could not be opened.

+*/

+

+ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));

+/*

+     gzdopen associates a gzFile with the file descriptor fd.  File descriptors

+   are obtained from calls like open, dup, creat, pipe or fileno (if the file

+   has been previously opened with fopen).  The mode parameter is as in gzopen.

+

+     The next call of gzclose on the returned gzFile will also close the file

+   descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor

+   fd.  If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd,

+   mode);.  The duplicated descriptor should be saved to avoid a leak, since

+   gzdopen does not close fd if it fails.  If you are using fileno() to get the

+   file descriptor from a FILE *, then you will have to use dup() to avoid

+   double-close()ing the file descriptor.  Both gzclose() and fclose() will

+   close the associated file descriptor, so they need to have different file

+   descriptors.

+

+     gzdopen returns NULL if there was insufficient memory to allocate the

+   gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not

+   provided, or '+' was provided), or if fd is -1.  The file descriptor is not

+   used until the next gz* read, write, seek, or close operation, so gzdopen

+   will not detect if fd is invalid (unless fd is -1).

+*/

+

+ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));

+/*

+     Set the internal buffer size used by this library's functions.  The

+   default buffer size is 8192 bytes.  This function must be called after

+   gzopen() or gzdopen(), and before any other calls that read or write the

+   file.  The buffer memory allocation is always deferred to the first read or

+   write.  Two buffers are allocated, either both of the specified size when

+   writing, or one of the specified size and the other twice that size when

+   reading.  A larger buffer size of, for example, 64K or 128K bytes will

+   noticeably increase the speed of decompression (reading).

+

+     The new buffer size also affects the maximum length for gzprintf().

+

+     gzbuffer() returns 0 on success, or -1 on failure, such as being called

+   too late.

+*/

+

+ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));

+/*

+     Dynamically update the compression level or strategy.  See the description

+   of deflateInit2 for the meaning of these parameters.

+

+     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not

+   opened for writing.

+*/

+

+ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));

+/*

+     Reads the given number of uncompressed bytes from the compressed file.  If

+   the input file is not in gzip format, gzread copies the given number of

+   bytes into the buffer directly from the file.

+

+     After reaching the end of a gzip stream in the input, gzread will continue

+   to read, looking for another gzip stream.  Any number of gzip streams may be

+   concatenated in the input file, and will all be decompressed by gzread().

+   If something other than a gzip stream is encountered after a gzip stream,

+   that remaining trailing garbage is ignored (and no error is returned).

+

+     gzread can be used to read a gzip file that is being concurrently written.

+   Upon reaching the end of the input, gzread will return with the available

+   data.  If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then

+   gzclearerr can be used to clear the end of file indicator in order to permit

+   gzread to be tried again.  Z_OK indicates that a gzip stream was completed

+   on the last gzread.  Z_BUF_ERROR indicates that the input file ended in the

+   middle of a gzip stream.  Note that gzread does not return -1 in the event

+   of an incomplete gzip stream.  This error is deferred until gzclose(), which

+   will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip

+   stream.  Alternatively, gzerror can be used before gzclose to detect this

+   case.

+

+     gzread returns the number of uncompressed bytes actually read, less than

+   len for end of file, or -1 for error.

+*/

+

+ZEXTERN int ZEXPORT gzwrite OF((gzFile file,

+                                voidpc buf, unsigned len));

+/*

+     Writes the given number of uncompressed bytes into the compressed file.

+   gzwrite returns the number of uncompressed bytes written or 0 in case of

+   error.

+*/

+

+ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));

+/*

+     Converts, formats, and writes the arguments to the compressed file under

+   control of the format string, as in fprintf.  gzprintf returns the number of

+   uncompressed bytes actually written, or 0 in case of error.  The number of

+   uncompressed bytes written is limited to 8191, or one less than the buffer

+   size given to gzbuffer().  The caller should assure that this limit is not

+   exceeded.  If it is exceeded, then gzprintf() will return an error (0) with

+   nothing written.  In this case, there may also be a buffer overflow with

+   unpredictable consequences, which is possible only if zlib was compiled with

+   the insecure functions sprintf() or vsprintf() because the secure snprintf()

+   or vsnprintf() functions were not available.  This can be determined using

+   zlibCompileFlags().

+*/

+

+ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));

+/*

+     Writes the given null-terminated string to the compressed file, excluding

+   the terminating null character.

+

+     gzputs returns the number of characters written, or -1 in case of error.

+*/

+

+ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));

+/*

+     Reads bytes from the compressed file until len-1 characters are read, or a

+   newline character is read and transferred to buf, or an end-of-file

+   condition is encountered.  If any characters are read or if len == 1, the

+   string is terminated with a null character.  If no characters are read due

+   to an end-of-file or len < 1, then the buffer is left untouched.

+

+     gzgets returns buf which is a null-terminated string, or it returns NULL

+   for end-of-file or in case of error.  If there was an error, the contents at

+   buf are indeterminate.

+*/

+

+ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));

+/*

+     Writes c, converted to an unsigned char, into the compressed file.  gzputc

+   returns the value that was written, or -1 in case of error.

+*/

+

+ZEXTERN int ZEXPORT gzgetc OF((gzFile file));

+/*

+     Reads one byte from the compressed file.  gzgetc returns this byte or -1

+   in case of end of file or error.  This is implemented as a macro for speed.

+   As such, it does not do all of the checking the other functions do.  I.e.

+   it does not check to see if file is NULL, nor whether the structure file

+   points to has been clobbered or not.

+*/

+

+ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));

+/*

+     Push one character back onto the stream to be read as the first character

+   on the next read.  At least one character of push-back is allowed.

+   gzungetc() returns the character pushed, or -1 on failure.  gzungetc() will

+   fail if c is -1, and may fail if a character has been pushed but not read

+   yet.  If gzungetc is used immediately after gzopen or gzdopen, at least the

+   output buffer size of pushed characters is allowed.  (See gzbuffer above.)

+   The pushed character will be discarded if the stream is repositioned with

+   gzseek() or gzrewind().

+*/

+

+ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));

+/*

+     Flushes all pending output into the compressed file.  The parameter flush

+   is as in the deflate() function.  The return value is the zlib error number

+   (see function gzerror below).  gzflush is only permitted when writing.

+

+     If the flush parameter is Z_FINISH, the remaining data is written and the

+   gzip stream is completed in the output.  If gzwrite() is called again, a new

+   gzip stream will be started in the output.  gzread() is able to read such

+   concatented gzip streams.

+

+     gzflush should be called only when strictly necessary because it will

+   degrade compression if called too often.

+*/

+

+/*

+ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,

+                                   z_off_t offset, int whence));

+

+     Sets the starting position for the next gzread or gzwrite on the given

+   compressed file.  The offset represents a number of bytes in the

+   uncompressed data stream.  The whence parameter is defined as in lseek(2);

+   the value SEEK_END is not supported.

+

+     If the file is opened for reading, this function is emulated but can be

+   extremely slow.  If the file is opened for writing, only forward seeks are

+   supported; gzseek then compresses a sequence of zeroes up to the new

+   starting position.

+

+     gzseek returns the resulting offset location as measured in bytes from

+   the beginning of the uncompressed stream, or -1 in case of error, in

+   particular if the file is opened for writing and the new starting position

+   would be before the current position.

+*/

+

+ZEXTERN int ZEXPORT    gzrewind OF((gzFile file));

+/*

+     Rewinds the given file. This function is supported only for reading.

+

+     gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)

+*/

+

+/*

+ZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));

+

+     Returns the starting position for the next gzread or gzwrite on the given

+   compressed file.  This position represents a number of bytes in the

+   uncompressed data stream, and is zero when starting, even if appending or

+   reading a gzip stream from the middle of a file using gzdopen().

+

+     gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)

+*/

+

+/*

+ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));

+

+     Returns the current offset in the file being read or written.  This offset

+   includes the count of bytes that precede the gzip stream, for example when

+   appending or when using gzdopen() for reading.  When reading, the offset

+   does not include as yet unused buffered input.  This information can be used

+   for a progress indicator.  On error, gzoffset() returns -1.

+*/

+

+ZEXTERN int ZEXPORT gzeof OF((gzFile file));

+/*

+     Returns true (1) if the end-of-file indicator has been set while reading,

+   false (0) otherwise.  Note that the end-of-file indicator is set only if the

+   read tried to go past the end of the input, but came up short.  Therefore,

+   just like feof(), gzeof() may return false even if there is no more data to

+   read, in the event that the last read request was for the exact number of

+   bytes remaining in the input file.  This will happen if the input file size

+   is an exact multiple of the buffer size.

+

+     If gzeof() returns true, then the read functions will return no more data,

+   unless the end-of-file indicator is reset by gzclearerr() and the input file

+   has grown since the previous end of file was detected.

+*/

+

+ZEXTERN int ZEXPORT gzdirect OF((gzFile file));

+/*

+     Returns true (1) if file is being copied directly while reading, or false

+   (0) if file is a gzip stream being decompressed.

+

+     If the input file is empty, gzdirect() will return true, since the input

+   does not contain a gzip stream.

+

+     If gzdirect() is used immediately after gzopen() or gzdopen() it will

+   cause buffers to be allocated to allow reading the file to determine if it

+   is a gzip file.  Therefore if gzbuffer() is used, it should be called before

+   gzdirect().

+

+     When writing, gzdirect() returns true (1) if transparent writing was

+   requested ("wT" for the gzopen() mode), or false (0) otherwise.  (Note:

+   gzdirect() is not needed when writing.  Transparent writing must be

+   explicitly requested, so the application already knows the answer.  When

+   linking statically, using gzdirect() will include all of the zlib code for

+   gzip file reading and decompression, which may not be desired.)

+*/

+

+ZEXTERN int ZEXPORT    gzclose OF((gzFile file));

+/*

+     Flushes all pending output if necessary, closes the compressed file and

+   deallocates the (de)compression state.  Note that once file is closed, you

+   cannot call gzerror with file, since its structures have been deallocated.

+   gzclose must not be called more than once on the same file, just as free

+   must not be called more than once on the same allocation.

+

+     gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a

+   file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the

+   last read ended in the middle of a gzip stream, or Z_OK on success.

+*/

+

+ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));

+ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));

+/*

+     Same as gzclose(), but gzclose_r() is only for use when reading, and

+   gzclose_w() is only for use when writing or appending.  The advantage to

+   using these instead of gzclose() is that they avoid linking in zlib

+   compression or decompression code that is not used when only reading or only

+   writing respectively.  If gzclose() is used, then both compression and

+   decompression code will be included the application when linking to a static

+   zlib library.

+*/

+

+ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));

+/*

+     Returns the error message for the last error which occurred on the given

+   compressed file.  errnum is set to zlib error number.  If an error occurred

+   in the file system and not in the compression library, errnum is set to

+   Z_ERRNO and the application may consult errno to get the exact error code.

+

+     The application must not modify the returned string.  Future calls to

+   this function may invalidate the previously returned string.  If file is

+   closed, then the string previously returned by gzerror will no longer be

+   available.

+

+     gzerror() should be used to distinguish errors from end-of-file for those

+   functions above that do not distinguish those cases in their return values.

+*/

+

+ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));

+/*

+     Clears the error and end-of-file flags for file.  This is analogous to the

+   clearerr() function in stdio.  This is useful for continuing to read a gzip

+   file that is being written concurrently.

+*/

+

+#endif /* !Z_SOLO */

+

+                        /* checksum functions */

+

+/*

+     These functions are not related to compression but are exported

+   anyway because they might be useful in applications using the compression

+   library.

+*/

+

+ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));

+/*

+     Update a running Adler-32 checksum with the bytes buf[0..len-1] and

+   return the updated checksum.  If buf is Z_NULL, this function returns the

+   required initial value for the checksum.

+

+     An Adler-32 checksum is almost as reliable as a CRC32 but can be computed

+   much faster.

+

+   Usage example:

+

+     uLong adler = adler32(0L, Z_NULL, 0);

+

+     while (read_buffer(buffer, length) != EOF) {

+       adler = adler32(adler, buffer, length);

+     }

+     if (adler != original_adler) error();

+*/

+

+/*

+ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,

+                                          z_off_t len2));

+

+     Combine two Adler-32 checksums into one.  For two sequences of bytes, seq1

+   and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for

+   each, adler1 and adler2.  adler32_combine() returns the Adler-32 checksum of

+   seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.  Note

+   that the z_off_t type (like off_t) is a signed integer.  If len2 is

+   negative, the result has no meaning or utility.

+*/

+

+ZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));

+/*

+     Update a running CRC-32 with the bytes buf[0..len-1] and return the

+   updated CRC-32.  If buf is Z_NULL, this function returns the required

+   initial value for the crc.  Pre- and post-conditioning (one's complement) is

+   performed within this function so it shouldn't be done by the application.

+

+   Usage example:

+

+     uLong crc = crc32(0L, Z_NULL, 0);

+

+     while (read_buffer(buffer, length) != EOF) {

+       crc = crc32(crc, buffer, length);

+     }

+     if (crc != original_crc) error();

+*/

+

+/*

+ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));

+

+     Combine two CRC-32 check values into one.  For two sequences of bytes,

+   seq1 and seq2 with lengths len1 and len2, CRC-32 check values were

+   calculated for each, crc1 and crc2.  crc32_combine() returns the CRC-32

+   check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and

+   len2.

+*/

+

+

+                        /* various hacks, don't look :) */

+

+/* deflateInit and inflateInit are macros to allow checking the zlib version

+ * and the compiler's view of z_stream:

+ */

+ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,

+                                     const char *version, int stream_size));

+ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,

+                                     const char *version, int stream_size));

+ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,

+                                      int windowBits, int memLevel,

+                                      int strategy, const char *version,

+                                      int stream_size));

+ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,

+                                      const char *version, int stream_size));

+ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,

+                                         unsigned char FAR *window,

+                                         const char *version,

+                                         int stream_size));

+#define deflateInit(strm, level) \

+        deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))

+#define inflateInit(strm) \

+        inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream))

+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \

+        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\

+                      (strategy), ZLIB_VERSION, (int)sizeof(z_stream))

+#define inflateInit2(strm, windowBits) \

+        inflateInit2_((strm), (windowBits), ZLIB_VERSION, \

+                      (int)sizeof(z_stream))

+#define inflateBackInit(strm, windowBits, window) \

+        inflateBackInit_((strm), (windowBits), (window), \

+                      ZLIB_VERSION, (int)sizeof(z_stream))

+

+#ifndef Z_SOLO

+

+/* gzgetc() macro and its supporting function and exposed data structure.  Note

+ * that the real internal state is much larger than the exposed structure.

+ * This abbreviated structure exposes just enough for the gzgetc() macro.  The

+ * user should not mess with these exposed elements, since their names or

+ * behavior could change in the future, perhaps even capriciously.  They can

+ * only be used by the gzgetc() macro.  You have been warned.

+ */

+struct gzFile_s {

+    unsigned have;

+    unsigned char *next;

+    z_off64_t pos;

+};

+ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file));  /* backward compatibility */

+#ifdef Z_PREFIX_SET

+#  undef z_gzgetc

+#  define z_gzgetc(g) \

+          ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))

+#else

+#  define gzgetc(g) \

+          ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))

+#endif

+

+/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or

+ * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if

+ * both are true, the application gets the *64 functions, and the regular

+ * functions are changed to 64 bits) -- in case these are set on systems

+ * without large file support, _LFS64_LARGEFILE must also be true

+ */

+#ifdef Z_LARGE64

+   ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));

+   ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));

+   ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));

+   ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));

+   ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));

+   ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));

+#endif

+

+#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)

+#  ifdef Z_PREFIX_SET

+#    define z_gzopen z_gzopen64

+#    define z_gzseek z_gzseek64

+#    define z_gztell z_gztell64

+#    define z_gzoffset z_gzoffset64

+#    define z_adler32_combine z_adler32_combine64

+#    define z_crc32_combine z_crc32_combine64

+#  else

+#    define gzopen gzopen64

+#    define gzseek gzseek64

+#    define gztell gztell64

+#    define gzoffset gzoffset64

+#    define adler32_combine adler32_combine64

+#    define crc32_combine crc32_combine64

+#  endif

+#  ifndef Z_LARGE64

+     ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));

+     ZEXTERN off64_t ZEXPORT gzseek64 OF((gzFile, off64_t, int));

+     ZEXTERN off64_t ZEXPORT gztell64 OF((gzFile));

+     ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));

+     ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, off64_t));

+     ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, off64_t));

+#  endif

+#else

+   ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));

+   ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));

+   ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));

+   ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));

+   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));

+   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));

+#endif

+

+#else /* Z_SOLO */

+

+   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));

+   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));

+

+#endif /* !Z_SOLO */

+

+/* hack for buggy compilers */

+#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)

+    struct internal_state {int dummy;};

+#endif

+

+/* undocumented functions */

+ZEXTERN const char   * ZEXPORT zError           OF((int));

+ZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp));

+ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table    OF((void));

+ZEXTERN int            ZEXPORT inflateUndermine OF((z_streamp, int));

+ZEXTERN int            ZEXPORT inflateResetKeep OF((z_streamp));

+ZEXTERN int            ZEXPORT deflateResetKeep OF((z_streamp));

+#if defined(_WIN32) && !defined(Z_SOLO)

+ZEXTERN gzFile         ZEXPORT gzopen_w OF((const wchar_t *path,

+                                            const char *mode));

+#endif

+#if defined(STDC) || defined(Z_HAVE_STDARG_H)

+#  ifndef Z_SOLO

+ZEXTERN int            ZEXPORTVA gzvprintf Z_ARG((gzFile file,

+                                                  const char *format,

+                                                  va_list va));

+#  endif

+#endif

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* ZLIB_H */

diff --git a/core/src/fdrm/crypto/fx_crypt.cpp b/core/src/fdrm/crypto/fx_crypt.cpp
new file mode 100644
index 0000000..0f1bf5f
--- /dev/null
+++ b/core/src/fdrm/crypto/fx_crypt.cpp
@@ -0,0 +1,259 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxcrt/fx_basic.h"

+#include "../../../include/fdrm/fx_crypt.h"

+#ifdef __cplusplus

+extern "C" {

+#endif

+struct rc4_state {

+    int x, y, m[256];

+};

+void CRYPT_ArcFourSetup(void* context,  FX_LPCBYTE key,  FX_DWORD length )

+{

+    rc4_state *s = (rc4_state*)context;

+    int i, j, k, *m, a;

+    s->x = 0;

+    s->y = 0;

+    m = s->m;

+    for( i = 0; i < 256; i++ ) {

+        m[i] = i;

+    }

+    j = k = 0;

+    for( i = 0; i < 256; i++ ) {

+        a = m[i];

+        j = ( j + a + key[k] ) & 0xFF;

+        m[i] = m[j];

+        m[j] = a;

+        if( ++k >= (int)length ) {

+            k = 0;

+        }

+    }

+}

+void CRYPT_ArcFourCrypt(void* context, unsigned char *data, FX_DWORD length )

+{

+    struct rc4_state* s = (struct rc4_state*)context;

+    int i, x, y, *m, a, b;

+    x = s->x;

+    y = s->y;

+    m = s->m;

+    for( i = 0; i < (int)length; i++ ) {

+        x = ( x + 1 ) & 0xFF;

+        a = m[x];

+        y = ( y + a ) & 0xFF;

+        m[x] = b = m[y];

+        m[y] = a;

+        data[i] ^= m[( a + b ) & 0xFF];

+    }

+    s->x = x;

+    s->y = y;

+}

+void CRYPT_ArcFourCryptBlock(FX_LPBYTE pData, FX_DWORD size, FX_LPCBYTE key, FX_DWORD keylen)

+{

+    rc4_state s;

+    CRYPT_ArcFourSetup(&s, key, keylen);

+    CRYPT_ArcFourCrypt(&s, pData, size);

+}

+struct md5_context {

+    FX_DWORD total[2];

+    FX_DWORD state[4];

+    FX_BYTE buffer[64];

+};

+#define GET_FX_DWORD(n,b,i)                                       \

+    {                                                               \

+        (n) = (FX_DWORD) ((FX_BYTE *) b)[(i)]                           \

+              | (((FX_DWORD) ((FX_BYTE *) b)[(i)+1]) <<  8)                 \

+              | (((FX_DWORD) ((FX_BYTE *) b)[(i)+2]) << 16)                 \

+              | (((FX_DWORD) ((FX_BYTE *) b)[(i)+3]) << 24);                \

+    }

+#define PUT_FX_DWORD(n,b,i)                                       \

+    {                                                               \

+        (((FX_BYTE *) b)[(i)]  ) = (FX_BYTE) (((n)      ) & 0xFF);      \

+        (((FX_BYTE *) b)[(i)+1]) = (FX_BYTE) (((n) >>  8) & 0xFF);      \

+        (((FX_BYTE *) b)[(i)+2]) = (FX_BYTE) (((n) >> 16) & 0xFF);      \

+        (((FX_BYTE *) b)[(i)+3]) = (FX_BYTE) (((n) >> 24) & 0xFF);      \

+    }

+void md5_process( struct md5_context *ctx, const FX_BYTE data[64] )

+{

+    FX_DWORD A, B, C, D, X[16];

+    GET_FX_DWORD( X[0],  data,  0 );

+    GET_FX_DWORD( X[1],  data,  4 );

+    GET_FX_DWORD( X[2],  data,  8 );

+    GET_FX_DWORD( X[3],  data, 12 );

+    GET_FX_DWORD( X[4],  data, 16 );

+    GET_FX_DWORD( X[5],  data, 20 );

+    GET_FX_DWORD( X[6],  data, 24 );

+    GET_FX_DWORD( X[7],  data, 28 );

+    GET_FX_DWORD( X[8],  data, 32 );

+    GET_FX_DWORD( X[9],  data, 36 );

+    GET_FX_DWORD( X[10], data, 40 );

+    GET_FX_DWORD( X[11], data, 44 );

+    GET_FX_DWORD( X[12], data, 48 );

+    GET_FX_DWORD( X[13], data, 52 );

+    GET_FX_DWORD( X[14], data, 56 );

+    GET_FX_DWORD( X[15], data, 60 );

+#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))

+#define P(a,b,c,d,k,s,t)                                \

+    {                                                       \

+        a += F(b,c,d) + X[k] + t; a = S(a,s) + b;           \

+    }

+    A = ctx->state[0];

+    B = ctx->state[1];

+    C = ctx->state[2];

+    D = ctx->state[3];

+#define F(x,y,z) (z ^ (x & (y ^ z)))

+    P( A, B, C, D,  0,  7, 0xD76AA478 );

+    P( D, A, B, C,  1, 12, 0xE8C7B756 );

+    P( C, D, A, B,  2, 17, 0x242070DB );

+    P( B, C, D, A,  3, 22, 0xC1BDCEEE );

+    P( A, B, C, D,  4,  7, 0xF57C0FAF );

+    P( D, A, B, C,  5, 12, 0x4787C62A );

+    P( C, D, A, B,  6, 17, 0xA8304613 );

+    P( B, C, D, A,  7, 22, 0xFD469501 );

+    P( A, B, C, D,  8,  7, 0x698098D8 );

+    P( D, A, B, C,  9, 12, 0x8B44F7AF );

+    P( C, D, A, B, 10, 17, 0xFFFF5BB1 );

+    P( B, C, D, A, 11, 22, 0x895CD7BE );

+    P( A, B, C, D, 12,  7, 0x6B901122 );

+    P( D, A, B, C, 13, 12, 0xFD987193 );

+    P( C, D, A, B, 14, 17, 0xA679438E );

+    P( B, C, D, A, 15, 22, 0x49B40821 );

+#undef F

+#define F(x,y,z) (y ^ (z & (x ^ y)))

+    P( A, B, C, D,  1,  5, 0xF61E2562 );

+    P( D, A, B, C,  6,  9, 0xC040B340 );

+    P( C, D, A, B, 11, 14, 0x265E5A51 );

+    P( B, C, D, A,  0, 20, 0xE9B6C7AA );

+    P( A, B, C, D,  5,  5, 0xD62F105D );

+    P( D, A, B, C, 10,  9, 0x02441453 );

+    P( C, D, A, B, 15, 14, 0xD8A1E681 );

+    P( B, C, D, A,  4, 20, 0xE7D3FBC8 );

+    P( A, B, C, D,  9,  5, 0x21E1CDE6 );

+    P( D, A, B, C, 14,  9, 0xC33707D6 );

+    P( C, D, A, B,  3, 14, 0xF4D50D87 );

+    P( B, C, D, A,  8, 20, 0x455A14ED );

+    P( A, B, C, D, 13,  5, 0xA9E3E905 );

+    P( D, A, B, C,  2,  9, 0xFCEFA3F8 );

+    P( C, D, A, B,  7, 14, 0x676F02D9 );

+    P( B, C, D, A, 12, 20, 0x8D2A4C8A );

+#undef F

+#define F(x,y,z) (x ^ y ^ z)

+    P( A, B, C, D,  5,  4, 0xFFFA3942 );

+    P( D, A, B, C,  8, 11, 0x8771F681 );

+    P( C, D, A, B, 11, 16, 0x6D9D6122 );

+    P( B, C, D, A, 14, 23, 0xFDE5380C );

+    P( A, B, C, D,  1,  4, 0xA4BEEA44 );

+    P( D, A, B, C,  4, 11, 0x4BDECFA9 );

+    P( C, D, A, B,  7, 16, 0xF6BB4B60 );

+    P( B, C, D, A, 10, 23, 0xBEBFBC70 );

+    P( A, B, C, D, 13,  4, 0x289B7EC6 );

+    P( D, A, B, C,  0, 11, 0xEAA127FA );

+    P( C, D, A, B,  3, 16, 0xD4EF3085 );

+    P( B, C, D, A,  6, 23, 0x04881D05 );

+    P( A, B, C, D,  9,  4, 0xD9D4D039 );

+    P( D, A, B, C, 12, 11, 0xE6DB99E5 );

+    P( C, D, A, B, 15, 16, 0x1FA27CF8 );

+    P( B, C, D, A,  2, 23, 0xC4AC5665 );

+#undef F

+#define F(x,y,z) (y ^ (x | ~z))

+    P( A, B, C, D,  0,  6, 0xF4292244 );

+    P( D, A, B, C,  7, 10, 0x432AFF97 );

+    P( C, D, A, B, 14, 15, 0xAB9423A7 );

+    P( B, C, D, A,  5, 21, 0xFC93A039 );

+    P( A, B, C, D, 12,  6, 0x655B59C3 );

+    P( D, A, B, C,  3, 10, 0x8F0CCC92 );

+    P( C, D, A, B, 10, 15, 0xFFEFF47D );

+    P( B, C, D, A,  1, 21, 0x85845DD1 );

+    P( A, B, C, D,  8,  6, 0x6FA87E4F );

+    P( D, A, B, C, 15, 10, 0xFE2CE6E0 );

+    P( C, D, A, B,  6, 15, 0xA3014314 );

+    P( B, C, D, A, 13, 21, 0x4E0811A1 );

+    P( A, B, C, D,  4,  6, 0xF7537E82 );

+    P( D, A, B, C, 11, 10, 0xBD3AF235 );

+    P( C, D, A, B,  2, 15, 0x2AD7D2BB );

+    P( B, C, D, A,  9, 21, 0xEB86D391 );

+#undef F

+    ctx->state[0] += A;

+    ctx->state[1] += B;

+    ctx->state[2] += C;

+    ctx->state[3] += D;

+}

+void CRYPT_MD5Start(void* context)

+{

+    struct md5_context *ctx = (struct md5_context*)context;

+    ctx->total[0] = 0;

+    ctx->total[1] = 0;

+    ctx->state[0] = 0x67452301;

+    ctx->state[1] = 0xEFCDAB89;

+    ctx->state[2] = 0x98BADCFE;

+    ctx->state[3] = 0x10325476;

+}

+void CRYPT_MD5Update(FX_LPVOID pctx, FX_LPCBYTE input, FX_DWORD length )

+{

+    struct md5_context *ctx = (struct md5_context *)pctx;

+    FX_DWORD left, fill;

+    if( ! length ) {

+        return;

+    }

+    left = ( ctx->total[0] >> 3 ) & 0x3F;

+    fill = 64 - left;

+    ctx->total[0] += length <<  3;

+    ctx->total[1] += length >> 29;

+    ctx->total[0] &= 0xFFFFFFFF;

+    ctx->total[1] += ctx->total[0] < length << 3;

+    if( left && length >= fill ) {

+        FXSYS_memcpy32( (void *) (ctx->buffer + left), (void *) input, fill );

+        md5_process( ctx, ctx->buffer );

+        length -= fill;

+        input  += fill;

+        left = 0;

+    }

+    while( length >= 64 ) {

+        md5_process( ctx, input );

+        length -= 64;

+        input  += 64;

+    }

+    if( length ) {

+        FXSYS_memcpy32( (void *) (ctx->buffer + left), (void *) input, length );

+    }

+}

+const FX_BYTE md5_padding[64] = {

+    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+};

+void CRYPT_MD5Finish(FX_LPVOID pctx, FX_BYTE digest[16] )

+{

+    struct md5_context *ctx = (struct md5_context *)pctx;

+    FX_DWORD last, padn;

+    FX_BYTE msglen[8];

+    PUT_FX_DWORD( ctx->total[0], msglen, 0 );

+    PUT_FX_DWORD( ctx->total[1], msglen, 4 );

+    last = ( ctx->total[0] >> 3 ) & 0x3F;

+    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );

+    CRYPT_MD5Update( ctx, md5_padding, padn );

+    CRYPT_MD5Update( ctx, msglen, 8 );

+    PUT_FX_DWORD( ctx->state[0], digest,  0 );

+    PUT_FX_DWORD( ctx->state[1], digest,  4 );

+    PUT_FX_DWORD( ctx->state[2], digest,  8 );

+    PUT_FX_DWORD( ctx->state[3], digest, 12 );

+}

+void CRYPT_MD5Generate(FX_LPCBYTE input, FX_DWORD length, FX_BYTE digest[16])

+{

+    md5_context ctx;

+    CRYPT_MD5Start(&ctx);

+    CRYPT_MD5Update(&ctx, input, length);

+    CRYPT_MD5Finish(&ctx, digest);

+}

+static FX_BOOL (*g_PubKeyDecryptor)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len) = NULL;

+void CRYPT_SetPubKeyDecryptor(FX_BOOL (*func)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len))

+{

+    g_PubKeyDecryptor = func;

+}

+#ifdef __cplusplus

+};

+#endif

diff --git a/core/src/fdrm/crypto/fx_crypt_aes.cpp b/core/src/fdrm/crypto/fx_crypt_aes.cpp
new file mode 100644
index 0000000..b8644d1
--- /dev/null
+++ b/core/src/fdrm/crypto/fx_crypt_aes.cpp
@@ -0,0 +1,1013 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxcrt/fx_basic.h"

+#include "../../../include/fdrm/fx_crypt.h"

+#ifdef __cplusplus

+extern "C" {

+#endif

+#define MAX_NR 14

+#define MAX_NK 8

+#define MAX_NB 8

+#define mulby2(x) ( ((x&0x7F) << 1) ^ (x & 0x80 ? 0x1B : 0) )

+#define GET_32BIT_MSB_FIRST(cp) \

+    (((unsigned long)(unsigned char)(cp)[3]) | \

+     ((unsigned long)(unsigned char)(cp)[2] << 8) | \

+     ((unsigned long)(unsigned char)(cp)[1] << 16) | \

+     ((unsigned long)(unsigned char)(cp)[0] << 24))

+#define PUT_32BIT_MSB_FIRST(cp, value) do { \

+        (cp)[3] = (value); \

+        (cp)[2] = (value) >> 8; \

+        (cp)[1] = (value) >> 16; \

+        (cp)[0] = (value) >> 24; } while (0)

+struct AESContext {

+    unsigned int keysched[(MAX_NR + 1) * MAX_NB];

+    unsigned int invkeysched[(MAX_NR + 1) * MAX_NB];

+    void (*encrypt) (AESContext * ctx, unsigned int * block);

+    void (*decrypt) (AESContext * ctx, unsigned int * block);

+    unsigned int iv[MAX_NB];

+    int Nb, Nr;

+};

+static const unsigned char Sbox[256] = {

+    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,

+    0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,

+    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,

+    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,

+    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,

+    0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,

+    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,

+    0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,

+    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,

+    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,

+    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,

+    0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,

+    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,

+    0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,

+    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,

+    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,

+    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,

+    0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,

+    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,

+    0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,

+    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,

+    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,

+    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,

+    0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,

+    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,

+    0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,

+    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,

+    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,

+    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,

+    0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,

+    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,

+    0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16

+};

+static const unsigned char Sboxinv[256] = {

+    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,

+    0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,

+    0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,

+    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,

+    0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,

+    0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,

+    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,

+    0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,

+    0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,

+    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,

+    0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,

+    0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,

+    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,

+    0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,

+    0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,

+    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,

+    0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,

+    0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,

+    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,

+    0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,

+    0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,

+    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,

+    0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,

+    0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,

+    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,

+    0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,

+    0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,

+    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,

+    0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,

+    0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,

+    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,

+    0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d

+};

+static const unsigned int E0[256] = {

+    0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,

+    0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,

+    0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,

+    0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,

+    0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,

+    0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,

+    0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,

+    0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,

+    0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,

+    0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,

+    0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,

+    0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,

+    0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,

+    0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,

+    0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,

+    0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,

+    0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,

+    0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,

+    0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,

+    0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,

+    0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,

+    0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,

+    0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,

+    0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,

+    0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,

+    0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,

+    0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,

+    0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,

+    0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,

+    0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,

+    0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,

+    0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,

+    0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,

+    0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,

+    0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,

+    0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,

+    0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,

+    0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,

+    0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,

+    0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,

+    0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,

+    0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,

+    0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,

+    0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,

+    0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,

+    0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,

+    0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,

+    0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,

+    0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,

+    0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,

+    0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,

+    0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,

+    0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,

+    0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,

+    0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,

+    0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,

+    0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,

+    0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,

+    0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,

+    0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,

+    0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,

+    0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,

+    0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,

+    0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,

+};

+static const unsigned int E1[256] = {

+    0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,

+    0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,

+    0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,

+    0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,

+    0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,

+    0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,

+    0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,

+    0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,

+    0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,

+    0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,

+    0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,

+    0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,

+    0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,

+    0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,

+    0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,

+    0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,

+    0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,

+    0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,

+    0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,

+    0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,

+    0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,

+    0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,

+    0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,

+    0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,

+    0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,

+    0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,

+    0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,

+    0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,

+    0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,

+    0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,

+    0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,

+    0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,

+    0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,

+    0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,

+    0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,

+    0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,

+    0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,

+    0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,

+    0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,

+    0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,

+    0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,

+    0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,

+    0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,

+    0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,

+    0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,

+    0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,

+    0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,

+    0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,

+    0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,

+    0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,

+    0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,

+    0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,

+    0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,

+    0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,

+    0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,

+    0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,

+    0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,

+    0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,

+    0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,

+    0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,

+    0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,

+    0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,

+    0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,

+    0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,

+};

+static const unsigned int E2[256] = {

+    0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,

+    0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,

+    0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,

+    0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,

+    0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,

+    0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,

+    0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,

+    0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,

+    0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,

+    0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,

+    0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,

+    0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,

+    0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,

+    0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,

+    0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,

+    0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,

+    0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,

+    0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,

+    0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,

+    0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,

+    0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,

+    0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,

+    0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,

+    0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,

+    0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,

+    0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,

+    0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,

+    0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,

+    0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,

+    0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,

+    0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,

+    0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,

+    0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,

+    0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,

+    0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,

+    0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,

+    0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,

+    0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,

+    0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,

+    0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,

+    0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,

+    0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,

+    0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,

+    0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,

+    0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,

+    0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,

+    0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,

+    0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,

+    0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,

+    0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,

+    0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,

+    0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,

+    0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,

+    0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,

+    0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,

+    0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,

+    0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,

+    0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,

+    0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,

+    0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,

+    0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,

+    0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,

+    0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,

+    0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,

+};

+static const unsigned int E3[256] = {

+    0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,

+    0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,

+    0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,

+    0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,

+    0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,

+    0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,

+    0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,

+    0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,

+    0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,

+    0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,

+    0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,

+    0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,

+    0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,

+    0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,

+    0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,

+    0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,

+    0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,

+    0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,

+    0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,

+    0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,

+    0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,

+    0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,

+    0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,

+    0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,

+    0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,

+    0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,

+    0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,

+    0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,

+    0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,

+    0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,

+    0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,

+    0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,

+    0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,

+    0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,

+    0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,

+    0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,

+    0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,

+    0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,

+    0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,

+    0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,

+    0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,

+    0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,

+    0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,

+    0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,

+    0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,

+    0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,

+    0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,

+    0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,

+    0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,

+    0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,

+    0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,

+    0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,

+    0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,

+    0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,

+    0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,

+    0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,

+    0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,

+    0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,

+    0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,

+    0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,

+    0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,

+    0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,

+    0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,

+    0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,

+};

+static const unsigned int D0[256] = {

+    0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,

+    0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,

+    0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,

+    0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,

+    0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,

+    0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,

+    0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,

+    0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,

+    0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,

+    0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,

+    0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,

+    0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,

+    0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,

+    0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,

+    0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,

+    0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,

+    0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,

+    0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,

+    0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,

+    0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,

+    0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,

+    0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,

+    0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,

+    0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,

+    0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,

+    0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,

+    0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,

+    0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,

+    0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,

+    0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,

+    0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,

+    0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,

+    0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,

+    0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,

+    0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,

+    0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,

+    0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,

+    0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,

+    0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,

+    0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,

+    0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,

+    0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,

+    0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,

+    0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,

+    0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,

+    0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,

+    0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,

+    0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,

+    0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,

+    0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,

+    0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,

+    0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,

+    0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,

+    0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,

+    0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,

+    0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,

+    0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,

+    0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,

+    0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,

+    0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,

+    0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,

+    0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,

+    0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,

+    0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,

+};

+static const unsigned int D1[256] = {

+    0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,

+    0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,

+    0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,

+    0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,

+    0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,

+    0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,

+    0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,

+    0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,

+    0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,

+    0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,

+    0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,

+    0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,

+    0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,

+    0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,

+    0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,

+    0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,

+    0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,

+    0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,

+    0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,

+    0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,

+    0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,

+    0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,

+    0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,

+    0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,

+    0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,

+    0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,

+    0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,

+    0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,

+    0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,

+    0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,

+    0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,

+    0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,

+    0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,

+    0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,

+    0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,

+    0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,

+    0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,

+    0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,

+    0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,

+    0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,

+    0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,

+    0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,

+    0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,

+    0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,

+    0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,

+    0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,

+    0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,

+    0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,

+    0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,

+    0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,

+    0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,

+    0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,

+    0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,

+    0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,

+    0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,

+    0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,

+    0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,

+    0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,

+    0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,

+    0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,

+    0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,

+    0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,

+    0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,

+    0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,

+};

+static const unsigned int D2[256] = {

+    0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,

+    0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,

+    0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,

+    0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,

+    0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,

+    0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,

+    0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,

+    0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,

+    0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,

+    0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,

+    0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,

+    0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,

+    0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,

+    0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,

+    0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,

+    0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,

+    0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,

+    0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,

+    0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,

+    0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,

+    0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,

+    0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,

+    0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,

+    0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,

+    0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,

+    0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,

+    0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,

+    0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,

+    0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,

+    0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,

+    0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,

+    0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,

+    0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,

+    0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,

+    0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,

+    0xdccad731, 0x85104263, 0x22401397, 0x112084c6,

+    0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,

+    0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,

+    0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,

+    0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,

+    0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,

+    0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,

+    0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,

+    0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,

+    0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,

+    0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,

+    0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,

+    0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,

+    0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,

+    0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,

+    0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,

+    0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,

+    0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,

+    0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,

+    0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,

+    0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,

+    0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,

+    0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,

+    0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,

+    0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,

+    0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,

+    0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,

+    0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,

+    0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,

+};

+static const unsigned int D3[256] = {

+    0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,

+    0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,

+    0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,

+    0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,

+    0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,

+    0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,

+    0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,

+    0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,

+    0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,

+    0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,

+    0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,

+    0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,

+    0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,

+    0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,

+    0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,

+    0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,

+    0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,

+    0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,

+    0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,

+    0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,

+    0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,

+    0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,

+    0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,

+    0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,

+    0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,

+    0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,

+    0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,

+    0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,

+    0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,

+    0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,

+    0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,

+    0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,

+    0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,

+    0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,

+    0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,

+    0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,

+    0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,

+    0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,

+    0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,

+    0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,

+    0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,

+    0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,

+    0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,

+    0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,

+    0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,

+    0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,

+    0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,

+    0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,

+    0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,

+    0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,

+    0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,

+    0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,

+    0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,

+    0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,

+    0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,

+    0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,

+    0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,

+    0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,

+    0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,

+    0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,

+    0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,

+    0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,

+    0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,

+    0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,

+};

+#define ADD_ROUND_KEY_4 (block[0]^=*keysched++, block[1]^=*keysched++, \

+                         block[2]^=*keysched++, block[3]^=*keysched++)

+#define ADD_ROUND_KEY_6 (block[0]^=*keysched++, block[1]^=*keysched++, \

+                         block[2]^=*keysched++, block[3]^=*keysched++, \

+                         block[4]^=*keysched++, block[5]^=*keysched++)

+#define ADD_ROUND_KEY_8 (block[0]^=*keysched++, block[1]^=*keysched++, \

+                         block[2]^=*keysched++, block[3]^=*keysched++, \

+                         block[4]^=*keysched++, block[5]^=*keysched++, \

+                         block[6]^=*keysched++, block[7]^=*keysched++)

+#define MOVEWORD(i) ( block[i] = newstate[i] )

+#undef MAKEWORD

+#define MAKEWORD(i) ( newstate[i] = (E0[(block[i] >> 24) & 0xFF] ^ \

+                                     E1[(block[(i+C1)%Nb] >> 16) & 0xFF] ^ \

+                                     E2[(block[(i+C2)%Nb] >> 8) & 0xFF] ^ \

+                                     E3[block[(i+C3)%Nb] & 0xFF]) )

+#define LASTWORD(i) ( newstate[i] = (Sbox[(block[i] >> 24) & 0xFF] << 24) | \

+                                    (Sbox[(block[(i+C1)%Nb] >> 16) & 0xFF] << 16) | \

+                                    (Sbox[(block[(i+C2)%Nb] >>  8) & 0xFF] <<  8) | \

+                                    (Sbox[(block[(i+C3)%Nb]      ) & 0xFF]      ) )

+static void aes_encrypt_nb_4(AESContext * ctx, unsigned int * block)

+{

+    int i;

+    static const int C1 = 1, C2 = 2, C3 = 3, Nb = 4;

+    unsigned int *keysched = ctx->keysched;

+    unsigned int newstate[4];

+    for (i = 0; i < ctx->Nr - 1; i++) {

+        ADD_ROUND_KEY_4;

+        MAKEWORD(0);

+        MAKEWORD(1);

+        MAKEWORD(2);

+        MAKEWORD(3);

+        MOVEWORD(0);

+        MOVEWORD(1);

+        MOVEWORD(2);

+        MOVEWORD(3);

+    }

+    ADD_ROUND_KEY_4;

+    LASTWORD(0);

+    LASTWORD(1);

+    LASTWORD(2);

+    LASTWORD(3);

+    MOVEWORD(0);

+    MOVEWORD(1);

+    MOVEWORD(2);

+    MOVEWORD(3);

+    ADD_ROUND_KEY_4;

+}

+static void aes_encrypt_nb_6(AESContext * ctx, unsigned int * block)

+{

+    int i;

+    static const int C1 = 1, C2 = 2, C3 = 3, Nb = 6;

+    unsigned int *keysched = ctx->keysched;

+    unsigned int newstate[6];

+    for (i = 0; i < ctx->Nr - 1; i++) {

+        ADD_ROUND_KEY_6;

+        MAKEWORD(0);

+        MAKEWORD(1);

+        MAKEWORD(2);

+        MAKEWORD(3);

+        MAKEWORD(4);

+        MAKEWORD(5);

+        MOVEWORD(0);

+        MOVEWORD(1);

+        MOVEWORD(2);

+        MOVEWORD(3);

+        MOVEWORD(4);

+        MOVEWORD(5);

+    }

+    ADD_ROUND_KEY_6;

+    LASTWORD(0);

+    LASTWORD(1);

+    LASTWORD(2);

+    LASTWORD(3);

+    LASTWORD(4);

+    LASTWORD(5);

+    MOVEWORD(0);

+    MOVEWORD(1);

+    MOVEWORD(2);

+    MOVEWORD(3);

+    MOVEWORD(4);

+    MOVEWORD(5);

+    ADD_ROUND_KEY_6;

+}

+static void aes_encrypt_nb_8(AESContext * ctx, unsigned int * block)

+{

+    int i;

+    static const int C1 = 1, C2 = 3, C3 = 4, Nb = 8;

+    unsigned int *keysched = ctx->keysched;

+    unsigned int newstate[8];

+    for (i = 0; i < ctx->Nr - 1; i++) {

+        ADD_ROUND_KEY_8;

+        MAKEWORD(0);

+        MAKEWORD(1);

+        MAKEWORD(2);

+        MAKEWORD(3);

+        MAKEWORD(4);

+        MAKEWORD(5);

+        MAKEWORD(6);

+        MAKEWORD(7);

+        MOVEWORD(0);

+        MOVEWORD(1);

+        MOVEWORD(2);

+        MOVEWORD(3);

+        MOVEWORD(4);

+        MOVEWORD(5);

+        MOVEWORD(6);

+        MOVEWORD(7);

+    }

+    ADD_ROUND_KEY_8;

+    LASTWORD(0);

+    LASTWORD(1);

+    LASTWORD(2);

+    LASTWORD(3);

+    LASTWORD(4);

+    LASTWORD(5);

+    LASTWORD(6);

+    LASTWORD(7);

+    MOVEWORD(0);

+    MOVEWORD(1);

+    MOVEWORD(2);

+    MOVEWORD(3);

+    MOVEWORD(4);

+    MOVEWORD(5);

+    MOVEWORD(6);

+    MOVEWORD(7);

+    ADD_ROUND_KEY_8;

+}

+#undef MAKEWORD

+#undef LASTWORD

+#define MAKEWORD(i) ( newstate[i] = (D0[(block[i] >> 24) & 0xFF] ^ \

+                                     D1[(block[(i+C1)%Nb] >> 16) & 0xFF] ^ \

+                                     D2[(block[(i+C2)%Nb] >> 8) & 0xFF] ^ \

+                                     D3[block[(i+C3)%Nb] & 0xFF]) )

+#define LASTWORD(i) (newstate[i] = (Sboxinv[(block[i] >> 24) & 0xFF] << 24) | \

+                                   (Sboxinv[(block[(i+C1)%Nb] >> 16) & 0xFF] << 16) | \

+                                   (Sboxinv[(block[(i+C2)%Nb] >>  8) & 0xFF] <<  8) | \

+                                   (Sboxinv[(block[(i+C3)%Nb]      ) & 0xFF]      ) )

+static void aes_decrypt_nb_4(AESContext * ctx, unsigned int * block)

+{

+    int i;

+    static const int C1 = 4 - 1, C2 = 4 - 2, C3 = 4 - 3, Nb = 4;

+    unsigned int *keysched = ctx->invkeysched;

+    unsigned int newstate[4];

+    for (i = 0; i < ctx->Nr - 1; i++) {

+        ADD_ROUND_KEY_4;

+        MAKEWORD(0);

+        MAKEWORD(1);

+        MAKEWORD(2);

+        MAKEWORD(3);

+        MOVEWORD(0);

+        MOVEWORD(1);

+        MOVEWORD(2);

+        MOVEWORD(3);

+    }

+    ADD_ROUND_KEY_4;

+    LASTWORD(0);

+    LASTWORD(1);

+    LASTWORD(2);

+    LASTWORD(3);

+    MOVEWORD(0);

+    MOVEWORD(1);

+    MOVEWORD(2);

+    MOVEWORD(3);

+    ADD_ROUND_KEY_4;

+}

+static void aes_decrypt_nb_6(AESContext * ctx, unsigned int * block)

+{

+    int i;

+    static const int C1 = 6 - 1, C2 = 6 - 2, C3 = 6 - 3, Nb = 6;

+    unsigned int *keysched = ctx->invkeysched;

+    unsigned int newstate[6];

+    for (i = 0; i < ctx->Nr - 1; i++) {

+        ADD_ROUND_KEY_6;

+        MAKEWORD(0);

+        MAKEWORD(1);

+        MAKEWORD(2);

+        MAKEWORD(3);

+        MAKEWORD(4);

+        MAKEWORD(5);

+        MOVEWORD(0);

+        MOVEWORD(1);

+        MOVEWORD(2);

+        MOVEWORD(3);

+        MOVEWORD(4);

+        MOVEWORD(5);

+    }

+    ADD_ROUND_KEY_6;

+    LASTWORD(0);

+    LASTWORD(1);

+    LASTWORD(2);

+    LASTWORD(3);

+    LASTWORD(4);

+    LASTWORD(5);

+    MOVEWORD(0);

+    MOVEWORD(1);

+    MOVEWORD(2);

+    MOVEWORD(3);

+    MOVEWORD(4);

+    MOVEWORD(5);

+    ADD_ROUND_KEY_6;

+}

+static void aes_decrypt_nb_8(AESContext * ctx, unsigned int * block)

+{

+    int i;

+    static const int C1 = 8 - 1, C2 = 8 - 3, C3 = 8 - 4, Nb = 8;

+    unsigned int *keysched = ctx->invkeysched;

+    unsigned int newstate[8];

+    for (i = 0; i < ctx->Nr - 1; i++) {

+        ADD_ROUND_KEY_8;

+        MAKEWORD(0);

+        MAKEWORD(1);

+        MAKEWORD(2);

+        MAKEWORD(3);

+        MAKEWORD(4);

+        MAKEWORD(5);

+        MAKEWORD(6);

+        MAKEWORD(7);

+        MOVEWORD(0);

+        MOVEWORD(1);

+        MOVEWORD(2);

+        MOVEWORD(3);

+        MOVEWORD(4);

+        MOVEWORD(5);

+        MOVEWORD(6);

+        MOVEWORD(7);

+    }

+    ADD_ROUND_KEY_8;

+    LASTWORD(0);

+    LASTWORD(1);

+    LASTWORD(2);

+    LASTWORD(3);

+    LASTWORD(4);

+    LASTWORD(5);

+    LASTWORD(6);

+    LASTWORD(7);

+    MOVEWORD(0);

+    MOVEWORD(1);

+    MOVEWORD(2);

+    MOVEWORD(3);

+    MOVEWORD(4);

+    MOVEWORD(5);

+    MOVEWORD(6);

+    MOVEWORD(7);

+    ADD_ROUND_KEY_8;

+}

+#undef MAKEWORD

+#undef LASTWORD

+static void aes_setup(AESContext * ctx, int blocklen,

+                      const unsigned char *key, int keylen)

+{

+    int i, j, Nk, rconst;

+    ASSERT(blocklen == 16 || blocklen == 24 || blocklen == 32);

+    ASSERT(keylen == 16 || keylen == 24 || keylen == 32);

+    Nk = keylen / 4;

+    ctx->Nb = blocklen / 4;

+    ctx->Nr = 6 + (ctx->Nb > Nk ? ctx->Nb : Nk);

+    if (ctx->Nb == 8) {

+        ctx->encrypt = aes_encrypt_nb_8, ctx->decrypt = aes_decrypt_nb_8;

+    } else if (ctx->Nb == 6) {

+        ctx->encrypt = aes_encrypt_nb_6, ctx->decrypt = aes_decrypt_nb_6;

+    } else if (ctx->Nb == 4) {

+        ctx->encrypt = aes_encrypt_nb_4, ctx->decrypt = aes_decrypt_nb_4;

+    }

+    rconst = 1;

+    for (i = 0; i < (ctx->Nr + 1) * ctx->Nb; i++) {

+        if (i < Nk) {

+            ctx->keysched[i] = GET_32BIT_MSB_FIRST(key + 4 * i);

+        } else {

+            unsigned int temp = ctx->keysched[i - 1];

+            if (i % Nk == 0) {

+                int a, b, c, d;

+                a = (temp >> 16) & 0xFF;

+                b = (temp >> 8) & 0xFF;

+                c = (temp >> 0) & 0xFF;

+                d = (temp >> 24) & 0xFF;

+                temp = Sbox[a] ^ rconst;

+                temp = (temp << 8) | Sbox[b];

+                temp = (temp << 8) | Sbox[c];

+                temp = (temp << 8) | Sbox[d];

+                rconst = mulby2(rconst);

+            } else if (i % Nk == 4 && Nk > 6) {

+                int a, b, c, d;

+                a = (temp >> 24) & 0xFF;

+                b = (temp >> 16) & 0xFF;

+                c = (temp >> 8) & 0xFF;

+                d = (temp >> 0) & 0xFF;

+                temp = Sbox[a];

+                temp = (temp << 8) | Sbox[b];

+                temp = (temp << 8) | Sbox[c];

+                temp = (temp << 8) | Sbox[d];

+            }

+            ctx->keysched[i] = ctx->keysched[i - Nk] ^ temp;

+        }

+    }

+    for (i = 0; i <= ctx->Nr; i++) {

+        for (j = 0; j < ctx->Nb; j++) {

+            unsigned int temp;

+            temp = ctx->keysched[(ctx->Nr - i) * ctx->Nb + j];

+            if (i != 0 && i != ctx->Nr) {

+                int a, b, c, d;

+                a = (temp >> 24) & 0xFF;

+                b = (temp >> 16) & 0xFF;

+                c = (temp >> 8) & 0xFF;

+                d = (temp >> 0) & 0xFF;

+                temp = D0[Sbox[a]];

+                temp ^= D1[Sbox[b]];

+                temp ^= D2[Sbox[c]];

+                temp ^= D3[Sbox[d]];

+            }

+            ctx->invkeysched[i * ctx->Nb + j] = temp;

+        }

+    }

+}

+static void aes_decrypt(AESContext * ctx, unsigned int * block)

+{

+    ctx->decrypt(ctx, block);

+}

+static void aes_decrypt_cbc(unsigned char *dest, const unsigned char *src, int len, AESContext * ctx)

+{

+    unsigned int iv[4], x[4], ct[4];

+    int i;

+    ASSERT((len & 15) == 0);

+    FXSYS_memcpy32(iv, ctx->iv, sizeof(iv));

+    while (len > 0) {

+        for (i = 0; i < 4; i++) {

+            x[i] = ct[i] = GET_32BIT_MSB_FIRST(src + 4 * i);

+        }

+        aes_decrypt(ctx, x);

+        for (i = 0; i < 4; i++) {

+            PUT_32BIT_MSB_FIRST(dest + 4 * i, iv[i] ^ x[i]);

+            iv[i] = ct[i];

+        }

+        dest += 16;

+        src += 16;

+        len -= 16;

+    }

+    FXSYS_memcpy32(ctx->iv, iv, sizeof(iv));

+}

+static void aes_encrypt(AESContext * ctx, unsigned int * block)

+{

+    ctx->encrypt(ctx, block);

+}

+static void aes_encrypt_cbc(unsigned char *dest, const unsigned char *src, int len, AESContext * ctx)

+{

+    unsigned int iv[4];

+    int i;

+    ASSERT((len & 15) == 0);

+    FXSYS_memcpy32(iv, ctx->iv, sizeof(iv));

+    while (len > 0) {

+        for (i = 0; i < 4; i++) {

+            iv[i] ^= GET_32BIT_MSB_FIRST(src + 4 * i);

+        }

+        aes_encrypt(ctx, iv);

+        for (i = 0; i < 4; i++) {

+            PUT_32BIT_MSB_FIRST(dest + 4 * i, iv[i]);

+        }

+        dest += 16;

+        src += 16;

+        len -= 16;

+    }

+    FXSYS_memcpy32(ctx->iv, iv, sizeof(iv));

+}

+void CRYPT_AESSetKey(FX_LPVOID context, FX_DWORD blocklen, FX_LPCBYTE key, FX_DWORD keylen, FX_BOOL bEncrypt)

+{

+    aes_setup((AESContext*)context, blocklen, key, keylen);

+}

+void CRYPT_AESSetIV(FX_LPVOID context, FX_LPCBYTE iv)

+{

+    int i;

+    for (i = 0; i < ((AESContext*)context)->Nb; i++) {

+        ((AESContext*)context)->iv[i] = GET_32BIT_MSB_FIRST(iv + 4 * i);

+    }

+}

+void CRYPT_AESDecrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD len)

+{

+    aes_decrypt_cbc(dest, src, len, (AESContext*)context);

+}

+void CRYPT_AESEncrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD len)

+{

+    aes_encrypt_cbc(dest, src, len, (AESContext*)context);

+}

+#ifdef __cplusplus

+};

+#endif

diff --git a/core/src/fdrm/crypto/fx_crypt_sha.cpp b/core/src/fdrm/crypto/fx_crypt_sha.cpp
new file mode 100644
index 0000000..acabcb7
--- /dev/null
+++ b/core/src/fdrm/crypto/fx_crypt_sha.cpp
@@ -0,0 +1,742 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxcrt/fx_basic.h"

+#include "../../../include/fdrm/fx_crypt.h"

+#ifdef __cplusplus

+extern "C" {

+#endif

+typedef struct {

+    unsigned int h[5];

+    unsigned char block[64];

+    int blkused;

+    unsigned int lenhi, lenlo;

+} SHA_State;

+#define rol(x,y) ( ((x) << (y)) | (((unsigned int)x) >> (32-y)) )

+static void SHA_Core_Init(unsigned int h[5])

+{

+    h[0] = 0x67452301;

+    h[1] = 0xefcdab89;

+    h[2] = 0x98badcfe;

+    h[3] = 0x10325476;

+    h[4] = 0xc3d2e1f0;

+}

+static void SHATransform(unsigned int * digest, unsigned int * block)

+{

+    unsigned int w[80];

+    unsigned int a, b, c, d, e;

+    int t;

+    for (t = 0; t < 16; t++) {

+        w[t] = block[t];

+    }

+    for (t = 16; t < 80; t++) {

+        unsigned int tmp = w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16];

+        w[t] = rol(tmp, 1);

+    }

+    a = digest[0];

+    b = digest[1];

+    c = digest[2];

+    d = digest[3];

+    e = digest[4];

+    for (t = 0; t < 20; t++) {

+        unsigned int tmp =

+            rol(a, 5) + ((b & c) | (d & ~b)) + e + w[t] + 0x5a827999;

+        e = d;

+        d = c;

+        c = rol(b, 30);

+        b = a;

+        a = tmp;

+    }

+    for (t = 20; t < 40; t++) {

+        unsigned int tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0x6ed9eba1;

+        e = d;

+        d = c;

+        c = rol(b, 30);

+        b = a;

+        a = tmp;

+    }

+    for (t = 40; t < 60; t++) {

+        unsigned int tmp = rol(a,

+                               5) + ((b & c) | (b & d) | (c & d)) + e + w[t] +

+                           0x8f1bbcdc;

+        e = d;

+        d = c;

+        c = rol(b, 30);

+        b = a;

+        a = tmp;

+    }

+    for (t = 60; t < 80; t++) {

+        unsigned int tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0xca62c1d6;

+        e = d;

+        d = c;

+        c = rol(b, 30);

+        b = a;

+        a = tmp;

+    }

+    digest[0] += a;

+    digest[1] += b;

+    digest[2] += c;

+    digest[3] += d;

+    digest[4] += e;

+}

+void CRYPT_SHA1Start(FX_LPVOID context)

+{

+    SHA_State * s = (SHA_State*)context;

+    SHA_Core_Init(s->h);

+    s->blkused = 0;

+    s->lenhi = s->lenlo = 0;

+}

+void CRYPT_SHA1Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size)

+{

+    SHA_State * s = (SHA_State*)context;

+    unsigned char *q = (unsigned char *)data;

+    unsigned int wordblock[16];

+    int len = size;

+    unsigned int lenw = len;

+    int i;

+    s->lenlo += lenw;

+    s->lenhi += (s->lenlo < lenw);

+    if (s->blkused && s->blkused + len < 64) {

+        FXSYS_memcpy32(s->block + s->blkused, q, len);

+        s->blkused += len;

+    } else {

+        while (s->blkused + len >= 64) {

+            FXSYS_memcpy32(s->block + s->blkused, q, 64 - s->blkused);

+            q += 64 - s->blkused;

+            len -= 64 - s->blkused;

+            for (i = 0; i < 16; i++) {

+                wordblock[i] =

+                    (((unsigned int) s->block[i * 4 + 0]) << 24) |

+                    (((unsigned int) s->block[i * 4 + 1]) << 16) |

+                    (((unsigned int) s->block[i * 4 + 2]) << 8) |

+                    (((unsigned int) s->block[i * 4 + 3]) << 0);

+            }

+            SHATransform(s->h, wordblock);

+            s->blkused = 0;

+        }

+        FXSYS_memcpy32(s->block, q, len);

+        s->blkused = len;

+    }

+}

+void CRYPT_SHA1Finish(FX_LPVOID context, FX_BYTE digest[20])

+{

+    SHA_State * s = (SHA_State*)context;

+    int i;

+    int pad;

+    unsigned char c[64];

+    unsigned int lenhi, lenlo;

+    if (s->blkused >= 56) {

+        pad = 56 + 64 - s->blkused;

+    } else {

+        pad = 56 - s->blkused;

+    }

+    lenhi = (s->lenhi << 3) | (s->lenlo >> (32 - 3));

+    lenlo = (s->lenlo << 3);

+    FXSYS_memset32(c, 0, pad);

+    c[0] = 0x80;

+    CRYPT_SHA1Update(s, c, pad);

+    c[0] = (lenhi >> 24) & 0xFF;

+    c[1] = (lenhi >> 16) & 0xFF;

+    c[2] = (lenhi >> 8) & 0xFF;

+    c[3] = (lenhi >> 0) & 0xFF;

+    c[4] = (lenlo >> 24) & 0xFF;

+    c[5] = (lenlo >> 16) & 0xFF;

+    c[6] = (lenlo >> 8) & 0xFF;

+    c[7] = (lenlo >> 0) & 0xFF;

+    CRYPT_SHA1Update(s, c, 8);

+    for (i = 0; i < 5; i++) {

+        digest[i * 4] = (s->h[i] >> 24) & 0xFF;

+        digest[i * 4 + 1] = (s->h[i] >> 16) & 0xFF;

+        digest[i * 4 + 2] = (s->h[i] >> 8) & 0xFF;

+        digest[i * 4 + 3] = (s->h[i]) & 0xFF;

+    }

+}

+void CRYPT_SHA1Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[20])

+{

+    SHA_State s;

+    CRYPT_SHA1Start(&s);

+    CRYPT_SHA1Update(&s, data, size);

+    CRYPT_SHA1Finish(&s, digest);

+}

+typedef struct {

+    FX_DWORD total[2];

+    FX_DWORD state[8];

+    FX_BYTE buffer[64];

+}

+sha256_context;

+#define GET_FX_DWORD(n,b,i)                       \

+    {                                               \

+        (n) = ( (FX_DWORD) (b)[(i)    ] << 24 )       \

+              | ( (FX_DWORD) (b)[(i) + 1] << 16 )       \

+              | ( (FX_DWORD) (b)[(i) + 2] <<  8 )       \

+              | ( (FX_DWORD) (b)[(i) + 3]       );      \

+    }

+#define PUT_FX_DWORD(n,b,i)                       \

+    {                                               \

+        (b)[(i)    ] = (FX_BYTE) ( (n) >> 24 );       \

+        (b)[(i) + 1] = (FX_BYTE) ( (n) >> 16 );       \

+        (b)[(i) + 2] = (FX_BYTE) ( (n) >>  8 );       \

+        (b)[(i) + 3] = (FX_BYTE) ( (n)       );       \

+    }

+void CRYPT_SHA256Start( FX_LPVOID context )

+{

+    sha256_context *ctx = (sha256_context *)context;

+    ctx->total[0] = 0;

+    ctx->total[1] = 0;

+    ctx->state[0] = 0x6A09E667;

+    ctx->state[1] = 0xBB67AE85;

+    ctx->state[2] = 0x3C6EF372;

+    ctx->state[3] = 0xA54FF53A;

+    ctx->state[4] = 0x510E527F;

+    ctx->state[5] = 0x9B05688C;

+    ctx->state[6] = 0x1F83D9AB;

+    ctx->state[7] = 0x5BE0CD19;

+}

+static void sha256_process( sha256_context *ctx, const FX_BYTE data[64] )

+{

+    FX_DWORD temp1, temp2, W[64];

+    FX_DWORD A, B, C, D, E, F, G, H;

+    GET_FX_DWORD( W[0],  data,  0 );

+    GET_FX_DWORD( W[1],  data,  4 );

+    GET_FX_DWORD( W[2],  data,  8 );

+    GET_FX_DWORD( W[3],  data, 12 );

+    GET_FX_DWORD( W[4],  data, 16 );

+    GET_FX_DWORD( W[5],  data, 20 );

+    GET_FX_DWORD( W[6],  data, 24 );

+    GET_FX_DWORD( W[7],  data, 28 );

+    GET_FX_DWORD( W[8],  data, 32 );

+    GET_FX_DWORD( W[9],  data, 36 );

+    GET_FX_DWORD( W[10], data, 40 );

+    GET_FX_DWORD( W[11], data, 44 );

+    GET_FX_DWORD( W[12], data, 48 );

+    GET_FX_DWORD( W[13], data, 52 );

+    GET_FX_DWORD( W[14], data, 56 );

+    GET_FX_DWORD( W[15], data, 60 );

+#define  SHR(x,n) ((x & 0xFFFFFFFF) >> n)

+#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))

+#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^  SHR(x, 3))

+#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^  SHR(x,10))

+#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))

+#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))

+#define F0(x,y,z) ((x & y) | (z & (x | y)))

+#define F1(x,y,z) (z ^ (x & (y ^ z)))

+#define R(t)                                    \

+    (                                               \

+            W[t] = S1(W[t -  2]) + W[t -  7] +          \

+                   S0(W[t - 15]) + W[t - 16]            \

+    )

+#define P(a,b,c,d,e,f,g,h,x,K)                  \

+    {                                               \

+        temp1 = h + S3(e) + F1(e,f,g) + K + x;      \

+        temp2 = S2(a) + F0(a,b,c);                  \

+        d += temp1; h = temp1 + temp2;              \

+    }

+    A = ctx->state[0];

+    B = ctx->state[1];

+    C = ctx->state[2];

+    D = ctx->state[3];

+    E = ctx->state[4];

+    F = ctx->state[5];

+    G = ctx->state[6];

+    H = ctx->state[7];

+    P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );

+    P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );

+    P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );

+    P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );

+    P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );

+    P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );

+    P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );

+    P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );

+    P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );

+    P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );

+    P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );

+    P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );

+    P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );

+    P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );

+    P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );

+    P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );

+    P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );

+    P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );

+    P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );

+    P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );

+    P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );

+    P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );

+    P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );

+    P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );

+    P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );

+    P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );

+    P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );

+    P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );

+    P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );

+    P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );

+    P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );

+    P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );

+    P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );

+    P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );

+    P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );

+    P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );

+    P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );

+    P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );

+    P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );

+    P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );

+    P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );

+    P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );

+    P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );

+    P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );

+    P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );

+    P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );

+    P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );

+    P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );

+    P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );

+    P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );

+    P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );

+    P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );

+    P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );

+    P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );

+    P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );

+    P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );

+    P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );

+    P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );

+    P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );

+    P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );

+    P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );

+    P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );

+    P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );

+    P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );

+    ctx->state[0] += A;

+    ctx->state[1] += B;

+    ctx->state[2] += C;

+    ctx->state[3] += D;

+    ctx->state[4] += E;

+    ctx->state[5] += F;

+    ctx->state[6] += G;

+    ctx->state[7] += H;

+}

+void CRYPT_SHA256Update( void* context, FX_LPCBYTE input, FX_DWORD length )

+{

+    sha256_context *ctx = (sha256_context *)context;

+    FX_DWORD left, fill;

+    if( ! length ) {

+        return;

+    }

+    left = ctx->total[0] & 0x3F;

+    fill = 64 - left;

+    ctx->total[0] += length;

+    ctx->total[0] &= 0xFFFFFFFF;

+    if( ctx->total[0] < length ) {

+        ctx->total[1]++;

+    }

+    if( left && length >= fill ) {

+        FXSYS_memcpy32( (void *) (ctx->buffer + left),

+                        (void *) input, fill );

+        sha256_process( ctx, ctx->buffer );

+        length -= fill;

+        input  += fill;

+        left = 0;

+    }

+    while( length >= 64 ) {

+        sha256_process( ctx, input );

+        length -= 64;

+        input  += 64;

+    }

+    if( length ) {

+        FXSYS_memcpy32( (void *) (ctx->buffer + left),

+                        (void *) input, length );

+    }

+}

+static const FX_BYTE sha256_padding[64] = {

+    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+};

+void CRYPT_SHA256Finish( FX_LPVOID context, FX_BYTE digest[32] )

+{

+    sha256_context *ctx = (sha256_context *)context;

+    FX_DWORD last, padn;

+    FX_DWORD high, low;

+    FX_BYTE msglen[8];

+    high = ( ctx->total[0] >> 29 )

+           | ( ctx->total[1] <<  3 );

+    low  = ( ctx->total[0] <<  3 );

+    PUT_FX_DWORD( high, msglen, 0 );

+    PUT_FX_DWORD( low,  msglen, 4 );

+    last = ctx->total[0] & 0x3F;

+    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );

+    CRYPT_SHA256Update( ctx, sha256_padding, padn );

+    CRYPT_SHA256Update( ctx, msglen, 8 );

+    PUT_FX_DWORD( ctx->state[0], digest,  0 );

+    PUT_FX_DWORD( ctx->state[1], digest,  4 );

+    PUT_FX_DWORD( ctx->state[2], digest,  8 );

+    PUT_FX_DWORD( ctx->state[3], digest, 12 );

+    PUT_FX_DWORD( ctx->state[4], digest, 16 );

+    PUT_FX_DWORD( ctx->state[5], digest, 20 );

+    PUT_FX_DWORD( ctx->state[6], digest, 24 );

+    PUT_FX_DWORD( ctx->state[7], digest, 28 );

+}

+void CRYPT_SHA256Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[32])

+{

+    sha256_context ctx;

+    CRYPT_SHA256Start(&ctx);

+    CRYPT_SHA256Update(&ctx, data, size);

+    CRYPT_SHA256Finish(&ctx, digest);

+}

+typedef struct {

+    FX_UINT64	total[2];

+    FX_UINT64	state[8];

+    FX_BYTE		buffer[128];

+} sha384_context;

+FX_UINT64 FX_ato64i(FX_LPCSTR str)

+{

+    FXSYS_assert(str != NULL);

+    FX_UINT64 ret = 0;

+    int len = (int)FXSYS_strlen(str);

+    len = len > 16 ? 16 : len;

+    for (int i = 0; i < len; ++i) {

+        if (i) {

+            ret <<= 4;

+        }

+        if (str[i] >= '0' && str[i] <= '9') {

+            ret |= (str[i] - '0') & 0xFF;

+        } else if (str[i] >= 'a' && str[i] <= 'f') {

+            ret |= (str[i] - 'a' + 10) & 0xFF;

+        } else if (str[i] >= 'A' && str[i] <= 'F') {

+            ret |= (str[i] - 'A' + 10) & 0xFF;

+        } else {

+            FXSYS_assert(FALSE);

+        }

+    }

+    return ret;

+}

+void CRYPT_SHA384Start(FX_LPVOID context)

+{

+    if (context == NULL) {

+        return;

+    }

+    sha384_context *ctx = (sha384_context *)context;

+    FXSYS_memset32(ctx, 0, sizeof(sha384_context));

+    ctx->state[0] = FX_ato64i("cbbb9d5dc1059ed8");

+    ctx->state[1] = FX_ato64i("629a292a367cd507");

+    ctx->state[2] = FX_ato64i("9159015a3070dd17");

+    ctx->state[3] = FX_ato64i("152fecd8f70e5939");

+    ctx->state[4] = FX_ato64i("67332667ffc00b31");

+    ctx->state[5] = FX_ato64i("8eb44a8768581511");

+    ctx->state[6] = FX_ato64i("db0c2e0d64f98fa7");

+    ctx->state[7] = FX_ato64i("47b5481dbefa4fa4");

+}

+#define SHA384_F0(x,y,z) ((x & y) | (z & (x | y)))

+#define SHA384_F1(x,y,z) (z ^ (x & (y ^ z)))

+#define SHA384_SHR(x,n) (x >> n)

+#define SHA384_ROTR(x,n) (SHA384_SHR(x, n) | x << (64 - n))

+#define SHA384_S0(x) (SHA384_ROTR(x, 1) ^ SHA384_ROTR(x, 8) ^  SHA384_SHR(x, 7))

+#define SHA384_S1(x) (SHA384_ROTR(x,19) ^ SHA384_ROTR(x, 61) ^  SHA384_SHR(x, 6))

+#define SHA384_S2(x) (SHA384_ROTR(x, 28) ^ SHA384_ROTR(x, 34) ^ SHA384_ROTR(x, 39))

+#define SHA384_S3(x) (SHA384_ROTR(x, 14) ^ SHA384_ROTR(x,18) ^ SHA384_ROTR(x, 41))

+#define SHA384_P(a,b,c,d,e,f,g,h,x,K)							\

+    {																\

+        temp1 = h + SHA384_S3(e) + SHA384_F1(e,f,g) + K + x;		\

+        temp2 = SHA384_S2(a) + SHA384_F0(a,b,c);					\

+        d += temp1; h = temp1 + temp2;								\

+    }

+static const FX_BYTE sha384_padding[128] = {

+    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+};

+#define SHA384_R(t) (W[t] = SHA384_S1(W[t -  2]) + W[t -  7] + SHA384_S0(W[t - 15]) + W[t - 16])

+static FX_LPCSTR constants[] = {

+    "428a2f98d728ae22",

+    "7137449123ef65cd",

+    "b5c0fbcfec4d3b2f",

+    "e9b5dba58189dbbc",

+    "3956c25bf348b538",

+    "59f111f1b605d019",

+    "923f82a4af194f9b",

+    "ab1c5ed5da6d8118",

+    "d807aa98a3030242",

+    "12835b0145706fbe",

+    "243185be4ee4b28c",

+    "550c7dc3d5ffb4e2",

+    "72be5d74f27b896f",

+    "80deb1fe3b1696b1",

+    "9bdc06a725c71235",

+    "c19bf174cf692694",

+    "e49b69c19ef14ad2",

+    "efbe4786384f25e3",

+    "0fc19dc68b8cd5b5",

+    "240ca1cc77ac9c65",

+    "2de92c6f592b0275",

+    "4a7484aa6ea6e483",

+    "5cb0a9dcbd41fbd4",

+    "76f988da831153b5",

+    "983e5152ee66dfab",

+    "a831c66d2db43210",

+    "b00327c898fb213f",

+    "bf597fc7beef0ee4",

+    "c6e00bf33da88fc2",

+    "d5a79147930aa725",

+    "06ca6351e003826f",

+    "142929670a0e6e70",

+    "27b70a8546d22ffc",

+    "2e1b21385c26c926",

+    "4d2c6dfc5ac42aed",

+    "53380d139d95b3df",

+    "650a73548baf63de",

+    "766a0abb3c77b2a8",

+    "81c2c92e47edaee6",

+    "92722c851482353b",

+    "a2bfe8a14cf10364",

+    "a81a664bbc423001",

+    "c24b8b70d0f89791",

+    "c76c51a30654be30",

+    "d192e819d6ef5218",

+    "d69906245565a910",

+    "f40e35855771202a",

+    "106aa07032bbd1b8",

+    "19a4c116b8d2d0c8",

+    "1e376c085141ab53",

+    "2748774cdf8eeb99",

+    "34b0bcb5e19b48a8",

+    "391c0cb3c5c95a63",

+    "4ed8aa4ae3418acb",

+    "5b9cca4f7763e373",

+    "682e6ff3d6b2b8a3",

+    "748f82ee5defb2fc",

+    "78a5636f43172f60",

+    "84c87814a1f0ab72",

+    "8cc702081a6439ec",

+    "90befffa23631e28",

+    "a4506cebde82bde9",

+    "bef9a3f7b2c67915",

+    "c67178f2e372532b",

+    "ca273eceea26619c",

+    "d186b8c721c0c207",

+    "eada7dd6cde0eb1e",

+    "f57d4f7fee6ed178",

+    "06f067aa72176fba",

+    "0a637dc5a2c898a6",

+    "113f9804bef90dae",

+    "1b710b35131c471b",

+    "28db77f523047d84",

+    "32caab7b40c72493",

+    "3c9ebe0a15c9bebc",

+    "431d67c49c100d4c",

+    "4cc5d4becb3e42b6",

+    "597f299cfc657e2a",

+    "5fcb6fab3ad6faec",

+    "6c44198c4a475817",

+};

+#define GET_FX_64WORD(n,b,i)                       \

+    {                                               \

+        (n) = ( (FX_UINT64) (b)[(i)    ] << 56 )       \

+              | ( (FX_UINT64) (b)[(i) + 1] << 48 )       \

+              | ( (FX_UINT64) (b)[(i) + 2] << 40 )       \

+              | ( (FX_UINT64) (b)[(i) + 3] << 32 )      \

+              | ( (FX_UINT64) (b)[(i) + 4] << 24 )       \

+              | ( (FX_UINT64) (b)[(i) + 5] << 16 )       \

+              | ( (FX_UINT64) (b)[(i) + 6] <<  8 )       \

+              | ( (FX_UINT64) (b)[(i) + 7]       );      \

+    }

+#define PUT_FX_64DWORD(n,b,i)                       \

+    {                                               \

+        (b)[(i)    ] = (FX_BYTE) ( (n) >> 56 );       \

+        (b)[(i) + 1] = (FX_BYTE) ( (n) >> 48 );       \

+        (b)[(i) + 2] = (FX_BYTE) ( (n) >> 40 );       \

+        (b)[(i) + 3] = (FX_BYTE) ( (n) >> 32 );       \

+        (b)[(i) + 4] = (FX_BYTE) ( (n) >> 24 );       \

+        (b)[(i) + 5] = (FX_BYTE) ( (n) >> 16 );       \

+        (b)[(i) + 6] = (FX_BYTE) ( (n) >>  8 );       \

+        (b)[(i) + 7] = (FX_BYTE) ( (n) );       \

+    }

+static void sha384_process( sha384_context *ctx, const FX_BYTE data[128] )

+{

+    FX_UINT64 temp1, temp2;

+    FX_UINT64 A, B, C, D, E, F, G, H;

+    FX_UINT64 W[80];

+    GET_FX_64WORD(W[0], data, 0);

+    GET_FX_64WORD(W[1], data, 8);

+    GET_FX_64WORD(W[2], data, 16);

+    GET_FX_64WORD(W[3], data, 24);

+    GET_FX_64WORD(W[4], data, 32);

+    GET_FX_64WORD(W[5], data, 40);

+    GET_FX_64WORD(W[6], data, 48);

+    GET_FX_64WORD(W[7], data, 56);

+    GET_FX_64WORD(W[8], data, 64);

+    GET_FX_64WORD(W[9], data, 72);

+    GET_FX_64WORD(W[10], data, 80);

+    GET_FX_64WORD(W[11], data, 88);

+    GET_FX_64WORD(W[12], data, 96);

+    GET_FX_64WORD(W[13], data, 104);

+    GET_FX_64WORD(W[14], data, 112);

+    GET_FX_64WORD(W[15], data, 120);

+    A = ctx->state[0];

+    B = ctx->state[1];

+    C = ctx->state[2];

+    D = ctx->state[3];

+    E = ctx->state[4];

+    F = ctx->state[5];

+    G = ctx->state[6];

+    H = ctx->state[7];

+    for (int i = 0; i < 10; ++i) {

+        FX_UINT64 temp[8];

+        if (i < 2) {

+            temp[0] = W[i * 8];

+            temp[1] = W[i * 8 + 1];

+            temp[2] = W[i * 8 + 2];

+            temp[3] = W[i * 8 + 3];

+            temp[4] = W[i * 8 + 4];

+            temp[5] = W[i * 8 + 5];

+            temp[6] = W[i * 8 + 6];

+            temp[7] = W[i * 8 + 7];

+        } else {

+            temp[0] = SHA384_R(i * 8);

+            temp[1] = SHA384_R(i * 8 + 1);

+            temp[2] = SHA384_R(i * 8 + 2);

+            temp[3] = SHA384_R(i * 8 + 3);

+            temp[4] = SHA384_R(i * 8 + 4);

+            temp[5] = SHA384_R(i * 8 + 5);

+            temp[6] = SHA384_R(i * 8 + 6);

+            temp[7] = SHA384_R(i * 8 + 7);

+        }

+        SHA384_P( A, B, C, D, E, F, G, H, temp[ 0], FX_ato64i(constants[i * 8    ]) );

+        SHA384_P( H, A, B, C, D, E, F, G, temp[ 1], FX_ato64i(constants[i * 8 + 1]) );

+        SHA384_P( G, H, A, B, C, D, E, F, temp[ 2], FX_ato64i(constants[i * 8 + 2]) );

+        SHA384_P( F, G, H, A, B, C, D, E, temp[ 3], FX_ato64i(constants[i * 8 + 3]) );

+        SHA384_P( E, F, G, H, A, B, C, D, temp[ 4], FX_ato64i(constants[i * 8 + 4]) );

+        SHA384_P( D, E, F, G, H, A, B, C, temp[ 5], FX_ato64i(constants[i * 8 + 5]) );

+        SHA384_P( C, D, E, F, G, H, A, B, temp[ 6], FX_ato64i(constants[i * 8 + 6]) );

+        SHA384_P( B, C, D, E, F, G, H, A, temp[ 7], FX_ato64i(constants[i * 8 + 7]) );

+    }

+    ctx->state[0] += A;

+    ctx->state[1] += B;

+    ctx->state[2] += C;

+    ctx->state[3] += D;

+    ctx->state[4] += E;

+    ctx->state[5] += F;

+    ctx->state[6] += G;

+    ctx->state[7] += H;

+}

+void CRYPT_SHA384Update(FX_LPVOID context, FX_LPCBYTE input, FX_DWORD length)

+{

+    sha384_context *ctx = (sha384_context *)context;

+    FX_DWORD left, fill;

+    if( ! length ) {

+        return;

+    }

+    left = (FX_DWORD)ctx->total[0] & 0x7F;

+    fill = 128 - left;

+    ctx->total[0] += length;

+    if( ctx->total[0] < length ) {

+        ctx->total[1]++;

+    }

+    if( left && length >= fill ) {

+        FXSYS_memcpy32( (void *) (ctx->buffer + left),

+                        (void *) input, fill );

+        sha384_process( ctx, ctx->buffer );

+        length -= fill;

+        input  += fill;

+        left = 0;

+    }

+    while( length >= 128 ) {

+        sha384_process( ctx, input );

+        length -= 128;

+        input  += 128;

+    }

+    if( length ) {

+        FXSYS_memcpy32( (void *) (ctx->buffer + left),

+                        (void *) input, length );

+    }

+}

+void CRYPT_SHA384Finish(FX_LPVOID context, FX_BYTE digest[48])

+{

+    sha384_context *ctx = (sha384_context *)context;

+    FX_DWORD last, padn;

+    FX_BYTE msglen[16];

+    FXSYS_memset32(msglen, 0, 16);

+    FX_UINT64 high, low;

+    high = ( ctx->total[0] >> 29 )

+           | ( ctx->total[1] <<  3 );

+    low  = ( ctx->total[0] <<  3 );

+    PUT_FX_64DWORD( high, msglen, 0 );

+    PUT_FX_64DWORD( low,  msglen, 8 );

+    last = (FX_DWORD)ctx->total[0] & 0x7F;

+    padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );

+    CRYPT_SHA384Update( ctx, sha384_padding, padn );

+    CRYPT_SHA384Update( ctx, msglen, 16 );

+    PUT_FX_64DWORD(ctx->state[0], digest, 0);

+    PUT_FX_64DWORD(ctx->state[1], digest, 8);

+    PUT_FX_64DWORD(ctx->state[2], digest, 16);

+    PUT_FX_64DWORD(ctx->state[3], digest, 24);

+    PUT_FX_64DWORD(ctx->state[4], digest, 32);

+    PUT_FX_64DWORD(ctx->state[5], digest, 40);

+}

+void CRYPT_SHA384Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64])

+{

+    sha384_context context;

+    CRYPT_SHA384Start(&context);

+    CRYPT_SHA384Update(&context, data, size);

+    CRYPT_SHA384Finish(&context, digest);

+}

+void CRYPT_SHA512Start(FX_LPVOID context)

+{

+    if (context == NULL) {

+        return;

+    }

+    sha384_context *ctx = (sha384_context *)context;

+    FXSYS_memset32(ctx, 0, sizeof(sha384_context));

+    ctx->state[0] = FX_ato64i("6a09e667f3bcc908");

+    ctx->state[1] = FX_ato64i("bb67ae8584caa73b");

+    ctx->state[2] = FX_ato64i("3c6ef372fe94f82b");

+    ctx->state[3] = FX_ato64i("a54ff53a5f1d36f1");

+    ctx->state[4] = FX_ato64i("510e527fade682d1");

+    ctx->state[5] = FX_ato64i("9b05688c2b3e6c1f");

+    ctx->state[6] = FX_ato64i("1f83d9abfb41bd6b");

+    ctx->state[7] = FX_ato64i("5be0cd19137e2179");

+}

+void CRYPT_SHA512Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size)

+{

+    CRYPT_SHA384Update(context, data, size);

+}

+void CRYPT_SHA512Finish(FX_LPVOID context, FX_BYTE digest[64])

+{

+    sha384_context *ctx = (sha384_context *)context;

+    FX_DWORD last, padn;

+    FX_BYTE msglen[16];

+    FXSYS_memset32(msglen, 0, 16);

+    FX_UINT64 high, low;

+    high = ( ctx->total[0] >> 29 )

+           | ( ctx->total[1] <<  3 );

+    low  = ( ctx->total[0] <<  3 );

+    PUT_FX_64DWORD( high, msglen, 0 );

+    PUT_FX_64DWORD( low,  msglen, 8 );

+    last = (FX_DWORD)ctx->total[0] & 0x7F;

+    padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );

+    CRYPT_SHA512Update( ctx, sha384_padding, padn );

+    CRYPT_SHA512Update( ctx, msglen, 16 );

+    PUT_FX_64DWORD(ctx->state[0], digest, 0);

+    PUT_FX_64DWORD(ctx->state[1], digest, 8);

+    PUT_FX_64DWORD(ctx->state[2], digest, 16);

+    PUT_FX_64DWORD(ctx->state[3], digest, 24);

+    PUT_FX_64DWORD(ctx->state[4], digest, 32);

+    PUT_FX_64DWORD(ctx->state[5], digest, 40);

+    PUT_FX_64DWORD(ctx->state[6], digest, 48);

+    PUT_FX_64DWORD(ctx->state[7], digest, 56);

+}

+void CRYPT_SHA512Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64])

+{

+    sha384_context context;

+    CRYPT_SHA512Start(&context);

+    CRYPT_SHA512Update(&context, data, size);

+    CRYPT_SHA512Finish(&context, digest);

+}

+#ifdef __cplusplus

+};

+#endif

diff --git a/core/src/fpdfapi/fpdf_basic_module.cpp b/core/src/fpdfapi/fpdf_basic_module.cpp
new file mode 100644
index 0000000..4c648b4
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_basic_module.cpp
@@ -0,0 +1,178 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcodec/fx_codec.h"

+#include "../../include/fpdfapi/fpdf_module.h"

+static CPDF_ModuleMgr*	g_FPDFAPI_pDefaultMgr = NULL;

+CPDF_ModuleMgr* CPDF_ModuleMgr::Get()

+{

+    return g_FPDFAPI_pDefaultMgr;

+}

+void CPDF_ModuleMgr::Create()

+{

+    g_FPDFAPI_pDefaultMgr = FX_NEW CPDF_ModuleMgr;

+    g_FPDFAPI_pDefaultMgr->Initialize();

+}

+void CPDF_ModuleMgr::Destroy()

+{

+    if (g_FPDFAPI_pDefaultMgr) {

+        delete g_FPDFAPI_pDefaultMgr;

+    }

+    g_FPDFAPI_pDefaultMgr = NULL;

+}

+CPDF_ModuleMgr::CPDF_ModuleMgr()

+{

+    m_pCodecModule = NULL;

+    m_pPageModule = NULL;

+    m_pRenderModule = NULL;

+    m_FileBufSize = 512;

+}

+void CPDF_ModuleMgr::Initialize()

+{

+    InitModules();

+    m_FileBufSize = 512;

+}

+void CPDF_ModuleMgr::InitModules()

+{

+    m_pCodecModule = NULL;

+    m_pPageModule = FX_NEW CPDF_PageModuleDef;

+    m_pRenderModule = FX_NEW CPDF_RenderModuleDef;

+}

+CPDF_ModuleMgr::~CPDF_ModuleMgr()

+{

+    if (m_pPageModule) {

+        delete m_pPageModule;

+    }

+    if (m_pRenderModule) {

+        delete m_pRenderModule;

+    }

+}

+void CPDF_ModuleMgr::SetDownloadCallback(FX_BOOL (*callback)(FX_LPCSTR module_name))

+{

+    m_pDownloadCallback = callback;

+}

+FX_BOOL CPDF_ModuleMgr::DownloadModule(FX_LPCSTR module_name)

+{

+    if (m_pDownloadCallback == NULL) {

+        return FALSE;

+    }

+    return m_pDownloadCallback(module_name);

+}

+static CFX_ByteString _GetPath(const CFX_ByteString& folder, FX_LPCSTR name)

+{

+    FX_STRSIZE folder_len = folder.GetLength();

+#if _FX_OS_ == _FX_SYMBIAN_ || _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_

+    if (folder[folder_len - 1] == '\\') {

+        return folder + name;

+    } else {

+        return (folder + "\\") + name;

+    }

+#else

+    if (folder[folder_len - 1] == '/') {

+        return folder + name;

+    } else {

+        return (folder + "/") + name;

+    }

+#endif

+}

+void CPDF_ModuleMgr::SetModulePath(FX_LPCSTR module_name, FX_LPCSTR path)

+{

+    if (module_name == NULL || module_name[0] == 0) {

+        m_DefaultModulePath = path;

+    } else {

+        m_ModulePathList.SetAt(module_name, FX_NEW CFX_ByteString(path, -1));

+    }

+}

+CFX_ByteString CPDF_ModuleMgr::GetModuleFilePath(FX_LPCSTR module_name, FX_LPCSTR name)

+{

+    CFX_ByteString* pPath = NULL;

+    if (m_ModulePathList.Lookup(module_name, (FX_LPVOID&)pPath)) {

+        return _GetPath(*pPath, name);

+    }

+    if (!m_DefaultModulePath.IsEmpty()) {

+        return _GetPath(m_DefaultModulePath, name);

+    }

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_

+    FX_WCHAR app_path[260];

+    ::GetModuleFileNameW(NULL, (LPWSTR)app_path, 260);

+    FX_INTPTR len = FXSYS_wcslen(app_path);

+    for (FX_INTPTR i = len; i >= 0; i --)

+        if (app_path[i] == '\\') {

+            app_path[i] = 0;

+            break;

+        }

+    CFX_ByteString path = CFX_ByteString::FromUnicode(app_path);

+    path += '\\';

+    path += name;

+    return path;

+#else

+    return name;

+#endif

+}

+void CPDF_ModuleMgr::NotifyModuleAvailable(FX_LPCSTR module_name)

+{

+    if (FXSYS_strcmp(module_name, ADDIN_NAME_CJK) == 0) {

+        m_pPageModule->NotifyCJKAvailable();

+    } else if (FXSYS_strcmp(module_name, ADDIN_NAME_DECODER) == 0) {

+        m_pRenderModule->NotifyDecoderAvailable();

+    }

+}

+void CPDF_ModuleMgr::RegisterSecurityHandler(FX_LPCSTR filter, CPDF_SecurityHandler * (*CreateHandler)(void* param), void* param)

+{

+    if (CreateHandler == NULL) {

+        m_SecurityHandlerMap.RemoveKey(filter);

+    } else {

+        m_SecurityHandlerMap.SetAt(filter, (void*)CreateHandler);

+    }

+    if (param) {

+        m_SecurityHandlerMap.SetAt(FX_BSTRC("_param_") + filter, param);

+    }

+}

+void CPDF_ModuleMgr::SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)

+{

+    m_privateData.SetPrivateData(module_id, pData, callback);

+}

+FX_LPVOID CPDF_ModuleMgr::GetPrivateData(FX_LPVOID module_id)

+{

+    return m_privateData.GetPrivateData(module_id);

+}

+CPDF_SecurityHandler* CPDF_ModuleMgr::CreateSecurityHandler(FX_LPCSTR filter)

+{

+    CPDF_SecurityHandler* (*CreateHandler)(void*) = NULL;

+    if (!m_SecurityHandlerMap.Lookup(filter, (void*&)CreateHandler)) {

+        return NULL;

+    }

+    if (CreateHandler == NULL) {

+        return NULL;

+    }

+    void* param = NULL;

+    m_SecurityHandlerMap.Lookup(FX_BSTRC("_param_") + filter, param);

+    return CreateHandler(param);

+}

+ICodec_FaxModule* CPDF_ModuleMgr::GetFaxModule()

+{

+    return m_pCodecModule ? m_pCodecModule->GetFaxModule() : NULL;

+}

+ICodec_JpegModule* CPDF_ModuleMgr::GetJpegModule()

+{

+    return m_pCodecModule ? m_pCodecModule->GetJpegModule() : NULL;

+}

+ICodec_JpxModule* CPDF_ModuleMgr::GetJpxModule()

+{

+    return m_pCodecModule ? m_pCodecModule->GetJpxModule() : NULL;

+}

+ICodec_Jbig2Module* CPDF_ModuleMgr::GetJbig2Module()

+{

+    return m_pCodecModule ? m_pCodecModule->GetJbig2Module() : NULL;

+}

+ICodec_IccModule* CPDF_ModuleMgr::GetIccModule()

+{

+    return m_pCodecModule ? m_pCodecModule->GetIccModule() : NULL;

+}

+ICodec_FlateModule* CPDF_ModuleMgr::GetFlateModule()

+{

+    return m_pCodecModule ? m_pCodecModule->GetFlateModule() : NULL;

+}

diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp
new file mode 100644
index 0000000..5899e28
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp
@@ -0,0 +1,2394 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_CNS1CID2Unicode_5[19088] = {
+    0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,
+    0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
+    0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
+    0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
+    0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,
+    0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,
+    0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
+    0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,
+    0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
+    0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+    0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
+    0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,
+    0x00A9, 0x2122, 0x2026, 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E,
+    0x2027, 0xFF1B, 0xFF1A, 0xFF1F, 0xFF01, 0xFE30, 0x22EF, 0x2025,
+    0xFE50, 0xFE51, 0xFE52, 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57,
+    0xFF5C, 0x2013, 0xFE31, 0x2014, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+    0xFF08, 0xFF09, 0xFE35, 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38,
+    0x3014, 0x3015, 0xFE39, 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C,
+    0x300A, 0x300B, 0xFE3D, 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40,
+    0x300C, 0x300D, 0xFE41, 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44,
+    0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019,
+    0x201C, 0x201D, 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06,
+    0xFF0A, 0x203B, 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2,
+    0x25CE, 0x2606, 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD,
+    0x25BC, 0x32A3, 0x2105, 0x203E, 0xFFE3, 0xFF3F, 0x02CD, 0xFE49,
+    0xFE4A, 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61,
+    0xFF0B, 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E,
+    0xFF1D, 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62,
+    0xFE63, 0xFE64, 0xFE65, 0xFE66, 0x223C, 0x2229, 0x222A, 0x22A5,
+    0x2220, 0x221F, 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235,
+    0x2234, 0x2640, 0x2642, 0x2295, 0x2609, 0x2191, 0x2193, 0x2192,
+    0x2190, 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xFF0F,
+    0xFF3C, 0xFF0F, 0xFF3C, 0xFF04, 0x00A5, 0x3012, 0x00A2, 0x00A3,
+    0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5,
+    0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4,
+    0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7,
+    0x74E9, 0x7CCE, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586,
+    0x2587, 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A,
+    0x2589, 0x253C, 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500,
+    0x2502, 0x2595, 0x250C, 0x2510, 0x2514, 0x2518, 0x256D, 0x256E,
+    0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, 0x25E2, 0x25E3,
+    0x25E5, 0x25E4, 0x2571, 0x2572, 0x2573, 0xFF10, 0xFF11, 0xFF12,
+    0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0x2160,
+    0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,
+    0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027,
+    0x3028, 0x3029, 0x3038, 0x5344, 0x303A, 0xFF21, 0xFF22, 0xFF23,
+    0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B,
+    0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33,
+    0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF41,
+    0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49,
+    0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51,
+    0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59,
+    0xFF5A, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+    0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+    0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8,
+    0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+    0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+    0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8,
+    0x03C9, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310A, 0x310B,
+    0x310C, 0x310D, 0x310E, 0x310F, 0x3110, 0x3111, 0x3112, 0x3113,
+    0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311A, 0x311B,
+    0x311C, 0x311D, 0x311E, 0x311F, 0x3120, 0x3121, 0x3122, 0x3123,
+    0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02D9, 0x02CA,
+    0x02C7, 0x02CB, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465,
+    0x2466, 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477,
+    0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x2170, 0x2171,
+    0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179,
+    0x4E28, 0x4E36, 0x4E3F, 0x4E85, 0x4EA0, 0x5182, 0x5196, 0x51AB,
+    0x52F9, 0x5338, 0x5369, 0x53B6, 0x5902, 0x5B80, 0x5DDB, 0x5E7A,
+    0x5E7F, 0x5EF4, 0x5F50, 0x5F61, 0x6534, 0x65E0, 0x7592, 0x7676,
+    0x8FB5, 0x96B6, 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405,
+    0x2406, 0x2407, 0x2408, 0x2409, 0x240A, 0x240B, 0x240C, 0x240D,
+    0x240E, 0x240F, 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415,
+    0x2416, 0x2417, 0x2418, 0x2419, 0x241A, 0x241B, 0x241C, 0x241D,
+    0x241E, 0x241F, 0x2421, 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43,
+    0x4E5D, 0x4E86, 0x4E8C, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0,
+    0x5200, 0x5201, 0x529B, 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09,
+    0x4E0B, 0x4E08, 0x4E0A, 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48,
+    0x4E5F, 0x4E5E, 0x4E8E, 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343,
+    0x53C9, 0x53E3, 0x571F, 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50,
+    0x5B51, 0x5B53, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD,
+    0x5DE5, 0x5DF1, 0x5DF2, 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B,
+    0x5F13, 0x624D, 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39,
+    0x4E4B, 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2,
+    0x4EC1, 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB,
+    0x4EC4, 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197,
+    0x51F6, 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316,
+    0x5339, 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA,
+    0x53CD, 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11,
+    0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15,
+    0x5FC3, 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597,
+    0x65A4, 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62,
+    0x6B79, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A,
+    0x7236, 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19,
+    0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E,
+    0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4,
+    0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9,
+    0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317,
+    0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E,
+    0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8,
+    0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1,
+    0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, 0x592E,
+    0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C, 0x5DE8, 0x5DE7,
+    0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01, 0x5F18, 0x5F17,
+    0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251, 0x65A5, 0x65E6,
+    0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63, 0x6BCD, 0x6C11,
+    0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF, 0x7384, 0x7389,
+    0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529, 0x7530, 0x7531,
+    0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF, 0x76EE, 0x77DB,
+    0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB, 0x4E1E, 0x4E1F,
+    0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6, 0x4EA5, 0x4EFF,
+    0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10, 0x4F11, 0x4F0F,
+    0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD, 0x4F01, 0x4F0B,
+    0x5149, 0x5147, 0x5146, 0x5148, 0x5168, 0x5171, 0x518D, 0x51B0,
+    0x5217, 0x5211, 0x5212, 0x520E, 0x5216, 0x52A3, 0x5308, 0x5321,
+    0x5320, 0x5370, 0x5371, 0x5409, 0x540F, 0x540C, 0x540A, 0x5410,
+    0x5401, 0x540B, 0x5404, 0x5411, 0x540D, 0x5408, 0x5403, 0x540E,
+    0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD, 0x5733, 0x5730, 0x5728,
+    0x572D, 0x572C, 0x572F, 0x5729, 0x5919, 0x591A, 0x5937, 0x5938,
+    0x5984, 0x5978, 0x5983, 0x597D, 0x5979, 0x5982, 0x5981, 0x5B57,
+    0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89, 0x5BFA, 0x5C16, 0x5C79,
+    0x5DDE, 0x5E06, 0x5E76, 0x5E74, 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6,
+    0x620E, 0x620C, 0x620D, 0x6210, 0x6263, 0x625B, 0x6258, 0x6536,
+    0x65E9, 0x65E8, 0x65EC, 0x65ED, 0x66F2, 0x66F3, 0x6709, 0x673D,
+    0x6734, 0x6731, 0x6735, 0x6B21, 0x6B64, 0x6B7B, 0x6C16, 0x6C5D,
+    0x6C57, 0x6C59, 0x6C5F, 0x6C60, 0x6C50, 0x6C55, 0x6C61, 0x6C5B,
+    0x6C4D, 0x6C4E, 0x7070, 0x725F, 0x725D, 0x767E, 0x7AF9, 0x7C73,
+    0x7CF8, 0x7F36, 0x7F8A, 0x7FBD, 0x8001, 0x8003, 0x800C, 0x8012,
+    0x8033, 0x807F, 0x8089, 0x808B, 0x808C, 0x81E3, 0x81EA, 0x81F3,
+    0x81FC, 0x820C, 0x821B, 0x821F, 0x826E, 0x8272, 0x827E, 0x866B,
+    0x8840, 0x884C, 0x8863, 0x897F, 0x9621, 0x4E32, 0x4EA8, 0x4F4D,
+    0x4F4F, 0x4F47, 0x4F57, 0x4F5E, 0x4F34, 0x4F5B, 0x4F55, 0x4F30,
+    0x4F50, 0x4F51, 0x4F3D, 0x4F3A, 0x4F38, 0x4F43, 0x4F54, 0x4F3C,
+    0x4F46, 0x4F63, 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, 0x4F36, 0x4F59,
+    0x4F5D, 0x4F48, 0x4F5A, 0x514C, 0x514B, 0x514D, 0x5175, 0x51B6,
+    0x51B7, 0x5225, 0x5224, 0x5229, 0x522A, 0x5228, 0x52AB, 0x52A9,
+    0x52AA, 0x52AC, 0x5323, 0x5373, 0x5375, 0x541D, 0x542D, 0x541E,
+    0x543E, 0x5426, 0x544E, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448,
+    0x5442, 0x541B, 0x5429, 0x544A, 0x5439, 0x543B, 0x5438, 0x542E,
+    0x5435, 0x5436, 0x5420, 0x543C, 0x5440, 0x5431, 0x542B, 0x541F,
+    0x542C, 0x56EA, 0x56F0, 0x56E4, 0x56EB, 0x574A, 0x5751, 0x5740,
+    0x574D, 0x5747, 0x574E, 0x573E, 0x5750, 0x574F, 0x573B, 0x58EF,
+    0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, 0x59A3, 0x5999, 0x5996,
+    0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A,
+    0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, 0x5C40, 0x5C41, 0x5C3F,
+    0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F,
+    0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, 0x5F64, 0x5F62, 0x5F77,
+    0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8,
+    0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276,
+    0x6289, 0x626D, 0x628A, 0x627C, 0x627E, 0x6279, 0x6273, 0x6292,
+    0x626F, 0x6298, 0x626E, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539,
+    0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, 0x674E, 0x674F, 0x6750,
+    0x6751, 0x675C, 0x6756, 0x675E, 0x6749, 0x6746, 0x6760, 0x6753,
+    0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, 0x6C99, 0x6C81, 0x6C88,
+    0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, 0x6C90, 0x6C70, 0x6C8C,
+    0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, 0x6C72, 0x6C7E, 0x6C74,
+    0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, 0x6C82, 0x7076, 0x707C,
+    0x707D, 0x7078, 0x7262, 0x7261, 0x7260, 0x72C4, 0x72C2, 0x7396,
+    0x752C, 0x752B, 0x7537, 0x7538, 0x7682, 0x76EF, 0x77E3, 0x79C1,
+    0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, 0x8096, 0x8093, 0x809D,
+    0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, 0x8292, 0x828B, 0x828D,
+    0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46, 0x8C55, 0x8C9D, 0x8D64,
+    0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6,
+    0x8FC5, 0x8FC4, 0x5DE1, 0x9091, 0x90A2, 0x90AA, 0x90A6, 0x90A3,
+    0x9149, 0x91C6, 0x91CC, 0x9632, 0x962E, 0x9631, 0x962A, 0x962C,
+    0x4E26, 0x4E56, 0x4E73, 0x4E8B, 0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC,
+    0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, 0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B,
+    0x4F86, 0x4F83, 0x4F70, 0x4F75, 0x4F88, 0x4F69, 0x4F7B, 0x4F96,
+    0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, 0x5154, 0x5152, 0x5155, 0x5169,
+    0x5177, 0x5176, 0x5178, 0x51BD, 0x51FD, 0x523B, 0x5238, 0x5237,
+    0x523A, 0x5230, 0x522E, 0x5236, 0x5241, 0x52BE, 0x52BB, 0x5352,
+    0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53D6,
+    0x53D4, 0x53D7, 0x5473, 0x5475, 0x5496, 0x5478, 0x5495, 0x5480,
+    0x547B, 0x5477, 0x5484, 0x5492, 0x5486, 0x547C, 0x5490, 0x5471,
+    0x5476, 0x548C, 0x549A, 0x5462, 0x5468, 0x548B, 0x547D, 0x548E,
+    0x56FA, 0x5783, 0x5777, 0x576A, 0x5769, 0x5761, 0x5766, 0x5764,
+    0x577C, 0x591C, 0x5949, 0x5947, 0x5948, 0x5944, 0x5954, 0x59BE,
+    0x59BB, 0x59D4, 0x59B9, 0x59AE, 0x59D1, 0x59C6, 0x59D0, 0x59CD,
+    0x59CB, 0x59D3, 0x59CA, 0x59AF, 0x59B3, 0x59D2, 0x59C5, 0x5B5F,
+    0x5B64, 0x5B63, 0x5B97, 0x5B9A, 0x5B98, 0x5B9C, 0x5B99, 0x5B9B,
+    0x5C1A, 0x5C48, 0x5C45, 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9,
+    0x5CAB, 0x5CB1, 0x5CB3, 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B,
+    0x5E11, 0x5E78, 0x5E9A, 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6,
+    0x5F26, 0x5F27, 0x5F29, 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD,
+    0x5FE0, 0x5FFD, 0x5FF5, 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035,
+    0x6016, 0x602A, 0x6015, 0x6021, 0x6027, 0x6029, 0x602B, 0x601B,
+    0x6216, 0x6215, 0x623F, 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC,
+    0x62C4, 0x62BF, 0x62C2, 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3,
+    0x62D4, 0x62CB, 0x62C8, 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9,
+    0x62C7, 0x62CD, 0x62B5, 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7,
+    0x62C6, 0x62AC, 0x62CE, 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614,
+    0x6613, 0x660C, 0x6606, 0x6602, 0x660E, 0x6600, 0x660F, 0x6615,
+    0x660A, 0x6607, 0x670D, 0x670B, 0x676D, 0x678B, 0x6795, 0x6771,
+    0x679C, 0x6773, 0x6777, 0x6787, 0x679D, 0x6797, 0x676F, 0x6770,
+    0x677F, 0x6789, 0x677E, 0x6790, 0x6775, 0x679A, 0x6793, 0x677C,
+    0x676A, 0x6772, 0x6B23, 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B,
+    0x6CE3, 0x6CE8, 0x6CF3, 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD,
+    0x6CBE, 0x6CBC, 0x6CE2, 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4,
+    0x6CB9, 0x6CC1, 0x6CAE, 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB,
+    0x6CE1, 0x6CDB, 0x6CCA, 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0,
+    0x7095, 0x708E, 0x7092, 0x708A, 0x7099, 0x722C, 0x722D, 0x7238,
+    0x7248, 0x7267, 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7, 0x72D0,
+    0x73A9, 0x73A8, 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D, 0x7599,
+    0x759A, 0x7684, 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD, 0x793E,
+    0x7940, 0x7941, 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA, 0x7CFE,
+    0x7F54, 0x7F8C, 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2, 0x80B1,
+    0x80A1, 0x80AB, 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5, 0x81FE,
+    0x820D, 0x82B3, 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F, 0x82B9,
+    0x82B1, 0x82AC, 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0, 0x82BE,
+    0x82B7, 0x864E, 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE, 0x8FD4,
+    0x8FD1, 0x90B5, 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1, 0x9577,
+    0x9580, 0x961C, 0x9640, 0x963F, 0x963B, 0x9644, 0x9642, 0x96B9,
+    0x96E8, 0x9752, 0x975E, 0x4E9F, 0x4EAD, 0x4EAE, 0x4FE1, 0x4FB5,
+    0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD, 0x4FC3, 0x4FB6,
+    0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0, 0x4FC4, 0x4FC2,
+    0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, 0x5157, 0x5192, 0x5191, 0x51A0,
+    0x524E, 0x5243, 0x524A, 0x524D, 0x524C, 0x524B, 0x5247, 0x52C7,
+    0x52C9, 0x52C3, 0x52C1, 0x530D, 0x5357, 0x537B, 0x539A, 0x53DB,
+    0x54AC, 0x54C0, 0x54A8, 0x54CE, 0x54C9, 0x54B8, 0x54A6, 0x54B3,
+    0x54C7, 0x54C2, 0x54BD, 0x54AA, 0x54C1, 0x54C4, 0x54C8, 0x54AF,
+    0x54AB, 0x54B1, 0x54BB, 0x54A9, 0x54A7, 0x54BF, 0x56FF, 0x5782,
+    0x578B, 0x57A0, 0x57A3, 0x57A2, 0x57CE, 0x57AE, 0x5793, 0x5955,
+    0x5951, 0x594F, 0x594E, 0x5950, 0x59DC, 0x59D8, 0x59FF, 0x59E3,
+    0x59E8, 0x5A03, 0x59E5, 0x59EA, 0x59DA, 0x59E6, 0x5A01, 0x59FB,
+    0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E,
+    0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25,
+    0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, 0x5EFA, 0x5F08, 0x5F2D, 0x5F65,
+    0x5F88, 0x5F85, 0x5F8A, 0x5F8B, 0x5F87, 0x5F8C, 0x5F89, 0x6012,
+    0x601D, 0x6020, 0x6025, 0x600E, 0x6028, 0x604D, 0x6070, 0x6068,
+    0x6062, 0x6046, 0x6043, 0x606C, 0x606B, 0x606A, 0x6064, 0x6241,
+    0x62DC, 0x6316, 0x6309, 0x62FC, 0x62ED, 0x6301, 0x62EE, 0x62FD,
+    0x6307, 0x62F1, 0x62F7, 0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311,
+    0x6302, 0x653F, 0x6545, 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D,
+    0x6620, 0x6627, 0x662F, 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7,
+    0x67FF, 0x67D3, 0x67F1, 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF,
+    0x67F5, 0x67E9, 0x67EF, 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5,
+    0x67B8, 0x67CF, 0x67DE, 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD,
+    0x67D2, 0x6B6A, 0x6B83, 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F,
+    0x6CC9, 0x6D0B, 0x6D32, 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31,
+    0x6D1E, 0x6D17, 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5,
+    0x6D39, 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B,
+    0x70AB, 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE,
+    0x70A4, 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1,
+    0x73B7, 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A,
+    0x752D, 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5,
+    0x75A2, 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6,
+    0x76C3, 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE,
+    0x76FC, 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946,
+    0x7949, 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB,
+    0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00,
+    0x7D09, 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8010,
+    0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3, 0x80C4,
+    0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD, 0x81F4,
+    0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6, 0x8304,
+    0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301, 0x82DC,
+    0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306, 0x8650,
+    0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4, 0x8A08,
+    0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, 0x8ECD,
+    0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, 0x8FED, 0x8FEB,
+    0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1, 0x90C3, 0x914B, 0x914A,
+    0x91CD, 0x9582, 0x9650, 0x964B, 0x964C, 0x964D, 0x9762, 0x9769,
+    0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8, 0x98DB, 0x98DF, 0x9996,
+    0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D, 0x5023, 0x4FEF, 0x5026,
+    0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006, 0x503C, 0x501F, 0x501A,
+    0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014, 0x5028, 0x4FF1, 0x5021,
+    0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE, 0x502D, 0x502A, 0x4FFE,
+    0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5, 0x51A2, 0x51CD, 0x51CC,
+    0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254, 0x525B, 0x525D, 0x532A,
+    0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8, 0x5510, 0x5501, 0x5537,
+    0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA, 0x5514, 0x54E9, 0x54ED,
+    0x54E1, 0x5509, 0x54EE, 0x54EA, 0x54E6, 0x5527, 0x5507, 0x54FD,
+    0x550F, 0x5703, 0x5704, 0x57C2, 0x57D4, 0x57CB, 0x57C3, 0x5809,
+    0x590F, 0x5957, 0x5958, 0x595A, 0x5A11, 0x5A18, 0x5A1C, 0x5A1F,
+    0x5A1B, 0x5A13, 0x59EC, 0x5A20, 0x5A23, 0x5A29, 0x5A25, 0x5A0C,
+    0x5A09, 0x5B6B, 0x5C58, 0x5BB0, 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE,
+    0x5BB5, 0x5BB9, 0x5BB8, 0x5C04, 0x5C51, 0x5C55, 0x5C50, 0x5CED,
+    0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8, 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4,
+    0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB, 0x5EAD, 0x5EA7, 0x5F31, 0x5F92,
+    0x5F91, 0x5F90, 0x6059, 0x6063, 0x6065, 0x6050, 0x6055, 0x606D,
+    0x6069, 0x606F, 0x6084, 0x609F, 0x609A, 0x608D, 0x6094, 0x608C,
+    0x6085, 0x6096, 0x6247, 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E,
+    0x632F, 0x6355, 0x6342, 0x6346, 0x634F, 0x6349, 0x633A, 0x6350,
+    0x633D, 0x632A, 0x632B, 0x6328, 0x634D, 0x634C, 0x6548, 0x6549,
+    0x6599, 0x65C1, 0x65C5, 0x6642, 0x6649, 0x664F, 0x6643, 0x6652,
+    0x664C, 0x6645, 0x6641, 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821,
+    0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829,
+    0x68B3, 0x6817, 0x684C, 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840,
+    0x683C, 0x6843, 0x682A, 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A,
+    0x6B89, 0x6BB7, 0x6C23, 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0,
+    0x6D6A, 0x6D95, 0x6D88, 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59,
+    0x6D93, 0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C,
+    0x6D8A, 0x6D79, 0x6D85, 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4,
+    0x70D9, 0x70C8, 0x70CF, 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD,
+    0x72F8, 0x72F7, 0x7386, 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA,
+    0x73DE, 0x7554, 0x755D, 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5,
+    0x75C7, 0x75B2, 0x75B3, 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8,
+    0x768B, 0x76B0, 0x76CA, 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720,
+    0x7728, 0x77E9, 0x7830, 0x7827, 0x7838, 0x781D, 0x7834, 0x7837,
+    0x7825, 0x782D, 0x7820, 0x781F, 0x7832, 0x7955, 0x7950, 0x7960,
+    0x795F, 0x7956, 0x795E, 0x795D, 0x7957, 0x795A, 0x79E4, 0x79E3,
+    0x79E7, 0x79DF, 0x79E6, 0x79E9, 0x79D8, 0x7A84, 0x7A88, 0x7AD9,
+    0x7B06, 0x7B11, 0x7C89, 0x7D21, 0x7D17, 0x7D0B, 0x7D0A, 0x7D20,
+    0x7D22, 0x7D14, 0x7D10, 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, 0x7D19,
+    0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, 0x7FC5, 0x7FC1, 0x8006, 0x8004,
+    0x8018, 0x8015, 0x8019, 0x8017, 0x803D, 0x803F, 0x80F1, 0x8102,
+    0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, 0x80F8, 0x80F3, 0x8108,
+    0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, 0x81EC, 0x8200, 0x8210,
+    0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, 0x832B, 0x8352, 0x8354,
+    0x834A, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834F, 0x8332,
+    0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, 0x8654,
+    0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, 0x868C, 0x86A3, 0x869C,
+    0x8870, 0x8877, 0x8881, 0x8882, 0x887D, 0x8879, 0x8A18, 0x8A10,
+    0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, 0x8A13, 0x8A16, 0x8A0F,
+    0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, 0x8CA2, 0x8D77, 0x8EAC,
+    0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, 0x9006, 0x8FF7, 0x9000,
+    0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, 0x8FF8, 0x9095, 0x90E1,
+    0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, 0x91D8, 0x91DD, 0x91D7,
+    0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, 0x9661, 0x965B, 0x965D,
+    0x9664, 0x9658, 0x965E, 0x96BB, 0x98E2, 0x99AC, 0x9AA8, 0x9AD8,
+    0x9B25, 0x9B32, 0x9B3C, 0x4E7E, 0x507A, 0x507D, 0x505C, 0x5047,
+    0x5043, 0x504C, 0x505A, 0x5049, 0x5065, 0x5076, 0x504E, 0x5055,
+    0x5075, 0x5074, 0x5077, 0x504F, 0x500F, 0x506F, 0x506D, 0x515C,
+    0x5195, 0x51F0, 0x526A, 0x526F, 0x52D2, 0x52D9, 0x52D8, 0x52D5,
+    0x5310, 0x530F, 0x5319, 0x533F, 0x5340, 0x533E, 0x53C3, 0x66FC,
+    0x5546, 0x556A, 0x5566, 0x5544, 0x555E, 0x5561, 0x5543, 0x554A,
+    0x5531, 0x5556, 0x554F, 0x5555, 0x552F, 0x5564, 0x5538, 0x552E,
+    0x555C, 0x552C, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570B,
+    0x5709, 0x57DF, 0x5805, 0x580A, 0x5806, 0x57E0, 0x57E4, 0x57FA,
+    0x5802, 0x5835, 0x57F7, 0x57F9, 0x5920, 0x5962, 0x5A36, 0x5A41,
+    0x5A49, 0x5A66, 0x5A6A, 0x5A40, 0x5A3C, 0x5A62, 0x5A5A, 0x5A46,
+    0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6,
+    0x5C09, 0x5C08, 0x5C07, 0x5C60, 0x5C5C, 0x5C5D, 0x5D07, 0x5D06,
+    0x5D0E, 0x5D1B, 0x5D16, 0x5D22, 0x5D11, 0x5D29, 0x5D14, 0x5D19,
+    0x5D24, 0x5D27, 0x5D17, 0x5DE2, 0x5E38, 0x5E36, 0x5E33, 0x5E37,
+    0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, 0x5EBE, 0x5F35, 0x5F37, 0x5F57,
+    0x5F6C, 0x5F69, 0x5F6B, 0x5F97, 0x5F99, 0x5F9E, 0x5F98, 0x5FA1,
+    0x5FA0, 0x5F9C, 0x607F, 0x60A3, 0x6089, 0x60A0, 0x60A8, 0x60CB,
+    0x60B4, 0x60E6, 0x60BD, 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC,
+    0x60D8, 0x60D5, 0x60C6, 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A,
+    0x621B, 0x6248, 0x63A0, 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5,
+    0x6377, 0x6367, 0x6398, 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383,
+    0x639B, 0x636B, 0x63A8, 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC,
+    0x6392, 0x638F, 0x6380, 0x637B, 0x6369, 0x6368, 0x637A, 0x655D,
+    0x6556, 0x6551, 0x6559, 0x6557, 0x555F, 0x654F, 0x6558, 0x6555,
+    0x6554, 0x659C, 0x659B, 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE,
+    0x665D, 0x665A, 0x6664, 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7,
+    0x671B, 0x6881, 0x68AF, 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876,
+    0x68B1, 0x68A7, 0x6897, 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886,
+    0x6885, 0x6894, 0x689D, 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32,
+    0x6BBA, 0x6BEB, 0x6BEC, 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9,
+    0x6DB2, 0x6DE1, 0x6DCC, 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7,
+    0x6DCB, 0x6DAF, 0x6DD1, 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7,
+    0x6DF5, 0x6DC5, 0x6DD2, 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8,
+    0x6DEA, 0x6DF1, 0x6DEE, 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC,
+    0x6DBF, 0x6DE6, 0x70F9, 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D,
+    0x727D, 0x7281, 0x731C, 0x731B, 0x7316, 0x7313, 0x7319, 0x7387,
+    0x7405, 0x740A, 0x7403, 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6,
+    0x74F7, 0x751C, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758F,
+    0x75D4, 0x75D5, 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4, 0x76D2,
+    0x76DB, 0x7737, 0x773E, 0x773C, 0x7736, 0x7738, 0x773A, 0x786B,
+    0x7843, 0x784E, 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92, 0x7A95,
+    0x7B20, 0x7B28, 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E, 0x7B2E,
+    0x7C92, 0x7C97, 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E, 0x7D39,
+    0x7D3C, 0x7D40, 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42, 0x7D32,
+    0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2, 0x801C,
+    0x804A, 0x8046, 0x812F, 0x8116, 0x8123, 0x812B, 0x8129, 0x8130,
+    0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838E, 0x839E,
+    0x8398, 0x8378, 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392, 0x838A,
+    0x8393, 0x8389, 0x83A0, 0x8377, 0x837B, 0x837C, 0x8386, 0x83A7,
+    0x8655, 0x5F6A, 0x86C7, 0x86C0, 0x86B6, 0x86C4, 0x86B5, 0x86C6,
+    0x86CB, 0x86B1, 0x86AF, 0x86C9, 0x8853, 0x889E, 0x8888, 0x88AB,
+    0x8892, 0x8896, 0x888D, 0x888B, 0x8993, 0x898F, 0x8A2A, 0x8A1D,
+    0x8A23, 0x8A25, 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B, 0x8A22, 0x8C49,
+    0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA, 0x8CA7, 0x8D67,
+    0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, 0x8EDF, 0x9019, 0x900D, 0x901A,
+    0x9017, 0x9023, 0x901F, 0x901D, 0x9010, 0x9015, 0x901E, 0x9020,
+    0x900F, 0x9022, 0x9016, 0x901B, 0x9014, 0x90E8, 0x90ED, 0x90FD,
+    0x9157, 0x91CE, 0x91F5, 0x91E6, 0x91E3, 0x91E7, 0x91ED, 0x91E9,
+    0x9589, 0x966A, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676,
+    0x9677, 0x966C, 0x96C0, 0x96EA, 0x96E9, 0x7AE0, 0x7ADF, 0x9802,
+    0x9803, 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2,
+    0x508D, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509A,
+    0x6700, 0x51F1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52DE, 0x52DD,
+    0x52DB, 0x535A, 0x53A5, 0x557B, 0x5580, 0x55A7, 0x557C, 0x558A,
+    0x559D, 0x5598, 0x5582, 0x559C, 0x55AA, 0x5594, 0x5587, 0x558B,
+    0x5583, 0x55B3, 0x55AE, 0x559F, 0x553E, 0x55B2, 0x559A, 0x55BB,
+    0x55AC, 0x55B1, 0x557E, 0x5589, 0x55AB, 0x5599, 0x570D, 0x582F,
+    0x582A, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581D, 0x5820,
+    0x58F9, 0x58FA, 0x5960, 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B,
+    0x5AA7, 0x5B73, 0x5B71, 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A,
+    0x5C0B, 0x5C31, 0x5D4C, 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45,
+    0x5E3D, 0x5E40, 0x5E43, 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4,
+    0x5F3C, 0x5F6D, 0x5FA9, 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2,
+    0x60B6, 0x60E0, 0x611C, 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB,
+    0x60F4, 0x6168, 0x60F1, 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112,
+    0x621F, 0x6249, 0x63A3, 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9,
+    0x63C6, 0x63CD, 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED,
+    0x63EE, 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9,
+    0x655E, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E,
+    0x6670, 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677,
+    0x66FE, 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8,
+    0x68D7, 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2,
+    0x68F2, 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9,
+    0x68DA, 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96,
+    0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54,
+    0x6E21, 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B,
+    0x6E5B, 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F,
+    0x6E34, 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB,
+    0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F,
+    0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C,
+    0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A,
+    0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F,
+    0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2,
+    0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C,
+    0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C,
+    0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, 0x7A97,
+    0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46, 0x7B50, 0x7B52,
+    0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F, 0x7CA5, 0x7D5E,
+    0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72, 0x7D61, 0x7D66,
+    0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5, 0x800B, 0x8052,
+    0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E, 0x8139, 0x8146,
+    0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C, 0x83E9, 0x8403,
+    0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1, 0x83EF, 0x83F1,
+    0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC, 0x83FD, 0x83F2,
+    0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407, 0x83D4, 0x83DF,
+    0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB, 0x86E4, 0x86D0,
+    0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983, 0x8996, 0x8A3B,
+    0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41, 0x8A54, 0x8A5B, 0x8A50,
+    0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56, 0x8C61, 0x8C82, 0x8CAF,
+    0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB, 0x8CC0, 0x8CB4, 0x8CB7,
+    0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85, 0x8D81, 0x8DCE, 0x8DDD,
+    0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB, 0x8DC6, 0x8EFB, 0x8EF8,
+    0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036,
+    0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163, 0x9165, 0x91CF, 0x9214,
+    0x9215, 0x9223, 0x9209, 0x921E, 0x920D, 0x9210, 0x9207, 0x9211,
+    0x9594, 0x958F, 0x958B, 0x9591, 0x9593, 0x9592, 0x958E, 0x968A,
+    0x968E, 0x968B, 0x967D, 0x9685, 0x9686, 0x968D, 0x9672, 0x9684,
+    0x96C1, 0x96C5, 0x96C4, 0x96C6, 0x96C7, 0x96EF, 0x96F2, 0x97CC,
+    0x9805, 0x9806, 0x9808, 0x98E7, 0x98EA, 0x98EF, 0x98E9, 0x98F2,
+    0x98ED, 0x99AE, 0x99AD, 0x9EC3, 0x9ECD, 0x9ED1, 0x4E82, 0x50AD,
+    0x50B5, 0x50B2, 0x50B3, 0x50C5, 0x50BE, 0x50AC, 0x50B7, 0x50BB,
+    0x50AF, 0x50C7, 0x527F, 0x5277, 0x527D, 0x52DF, 0x52E6, 0x52E4,
+    0x52E2, 0x52E3, 0x532F, 0x55DF, 0x55E8, 0x55D3, 0x55E6, 0x55CE,
+    0x55DC, 0x55C7, 0x55D1, 0x55E3, 0x55E4, 0x55EF, 0x55DA, 0x55E1,
+    0x55C5, 0x55C6, 0x55E5, 0x55C9, 0x5712, 0x5713, 0x585E, 0x5851,
+    0x5858, 0x5857, 0x585A, 0x5854, 0x586B, 0x584C, 0x586D, 0x584A,
+    0x5862, 0x5852, 0x584B, 0x5967, 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE,
+    0x5ABD, 0x5ABC, 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C,
+    0x5E79, 0x5EC9, 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, 0x5FAE, 0x611A,
+    0x610F, 0x6148, 0x611F, 0x60F3, 0x611B, 0x60F9, 0x6101, 0x6108,
+    0x614E, 0x614C, 0x6144, 0x614D, 0x613E, 0x6134, 0x6127, 0x610D,
+    0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643E, 0x641E, 0x642A,
+    0x642D, 0x643D, 0x642C, 0x640F, 0x641C, 0x6414, 0x640D, 0x6436,
+    0x6416, 0x6417, 0x6406, 0x656C, 0x659F, 0x65B0, 0x6697, 0x6689,
+    0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668D, 0x6703, 0x6994,
+    0x696D, 0x695A, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982,
+    0x694A, 0x6968, 0x696B, 0x695E, 0x6953, 0x6979, 0x6986, 0x695D,
+    0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD,
+    0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7,
+    0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96,
+    0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, 0x6EB4, 0x714E, 0x7159,
+    0x7169, 0x7164, 0x7149, 0x7167, 0x715C, 0x716C, 0x7166, 0x714C,
+    0x7165, 0x715E, 0x7146, 0x7168, 0x7156, 0x723A, 0x7252, 0x7337,
+    0x7345, 0x733F, 0x733E, 0x746F, 0x745A, 0x7455, 0x745F, 0x745E,
+    0x7441, 0x743F, 0x7459, 0x745B, 0x745C, 0x7576, 0x7578, 0x7600,
+    0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, 0x75FF, 0x75F4, 0x75F3,
+    0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, 0x775E, 0x7763, 0x7779,
+    0x776A, 0x776C, 0x775C, 0x7765, 0x7768, 0x7762, 0x77EE, 0x788E,
+    0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, 0x787C, 0x7891, 0x7893,
+    0x787F, 0x797A, 0x797F, 0x7981, 0x842C, 0x79BD, 0x7A1C, 0x7A1A,
+    0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, 0x7AA0, 0x7B77, 0x7BC0,
+    0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, 0x7CB5, 0x7D93, 0x7D79,
+    0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, 0x7F69, 0x7F6A, 0x7F72,
+    0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, 0x8086, 0x8084, 0x8171,
+    0x8170, 0x8178, 0x8165, 0x816E, 0x8173, 0x816B, 0x8179, 0x817A,
+    0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843D, 0x8431, 0x8475,
+    0x8466, 0x846B, 0x8449, 0x846C, 0x845B, 0x843C, 0x8435, 0x8461,
+    0x8463, 0x8469, 0x846D, 0x8446, 0x865E, 0x865C, 0x865F, 0x86F9,
+    0x8713, 0x8708, 0x8707, 0x8700, 0x86FE, 0x86FB, 0x8702, 0x8703,
+    0x8706, 0x870A, 0x8859, 0x88DF, 0x88D4, 0x88D9, 0x88DC, 0x88D8,
+    0x88DD, 0x88E1, 0x88CA, 0x88D5, 0x88D2, 0x899C, 0x89E3, 0x8A6B,
+    0x8A72, 0x8A73, 0x8A66, 0x8A69, 0x8A70, 0x8A87, 0x8A7C, 0x8A63,
+    0x8AA0, 0x8A71, 0x8A85, 0x8A6D, 0x8A62, 0x8A6E, 0x8A6C, 0x8A79,
+    0x8A7B, 0x8A3E, 0x8A68, 0x8C62, 0x8C8A, 0x8C89, 0x8CCA, 0x8CC7,
+    0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, 0x8CC2, 0x8CC5, 0x8DE1, 0x8DDF,
+    0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, 0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2,
+    0x8F03, 0x8F09, 0x8EFE, 0x8F0A, 0x8F9F, 0x8FB2, 0x904B, 0x904A,
+    0x9053, 0x9042, 0x9054, 0x903C, 0x9055, 0x9050, 0x9047, 0x904F,
+    0x904E, 0x904D, 0x9051, 0x903E, 0x9041, 0x9112, 0x9117, 0x916C,
+    0x916A, 0x9169, 0x91C9, 0x9237, 0x9257, 0x9238, 0x923D, 0x9240,
+    0x923E, 0x925B, 0x924B, 0x9264, 0x9251, 0x9234, 0x9249, 0x924D,
+    0x9245, 0x9239, 0x923F, 0x925A, 0x9598, 0x9698, 0x9694, 0x9695,
+    0x96CD, 0x96CB, 0x96C9, 0x96CA, 0x96F7, 0x96FB, 0x96F9, 0x96F6,
+    0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980A, 0x9812,
+    0x980C, 0x98FC, 0x98F4, 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4,
+    0x9AE1, 0x9CE9, 0x9E82, 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE,
+    0x50E5, 0x50D6, 0x50ED, 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1,
+    0x50CE, 0x50E9, 0x5162, 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD,
+    0x55FE, 0x5600, 0x561B, 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609,
+    0x560D, 0x560E, 0x55F7, 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6,
+    0x5718, 0x5716, 0x5875, 0x587E, 0x5883, 0x5893, 0x588A, 0x5879,
+    0x5885, 0x587D, 0x58FD, 0x5925, 0x5922, 0x5924, 0x596A, 0x5969,
+    0x5AE1, 0x5AE6, 0x5AE9, 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75,
+    0x5BDE, 0x5BE7, 0x5BE1, 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4,
+    0x5BDF, 0x5C0D, 0x5C62, 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55,
+    0x5E57, 0x5E54, 0x5ED3, 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9,
+    0x6147, 0x613F, 0x614B, 0x6177, 0x6162, 0x6163, 0x615F, 0x615A,
+    0x6158, 0x6175, 0x622A, 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478,
+    0x645F, 0x647A, 0x6451, 0x6467, 0x6434, 0x646D, 0x647B, 0x6572,
+    0x65A1, 0x65D7, 0x65D6, 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8,
+    0x6995, 0x69C1, 0x69AE, 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB,
+    0x69AB, 0x69B4, 0x69D0, 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3,
+    0x69A3, 0x6B49, 0x6B4C, 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13,
+    0x6EF4, 0x6F29, 0x6F3E, 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22,
+    0x6EFF, 0x6EEF, 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23, 0x6F15,
+    0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2, 0x6ECC,
+    0x6EF7, 0x7194, 0x7199, 0x717D, 0x718A, 0x7184, 0x7192, 0x723E,
+    0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746A, 0x7470,
+    0x746D, 0x7504, 0x7591, 0x7627, 0x760D, 0x760B, 0x7609, 0x7613,
+    0x76E1, 0x76E3, 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1, 0x789F,
+    0x78A7, 0x78B3, 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D, 0x7A2E,
+    0x7A31, 0x7AAA, 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95, 0x7B8B,
+    0x7B75, 0x7B97, 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87, 0x7B84,
+    0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE,
+    0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF,
+    0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC, 0x7F70, 0x7FE0,
+    0x7FE1, 0x7FDF, 0x805E, 0x805A, 0x8087, 0x8150, 0x8180, 0x818F,
+    0x8188, 0x818A, 0x817F, 0x8182, 0x81E7, 0x81FA, 0x8207, 0x8214,
+    0x821E, 0x824B, 0x84C9, 0x84BF, 0x84C6, 0x84C4, 0x8499, 0x849E,
+    0x84B2, 0x849C, 0x84CB, 0x84B8, 0x84C0, 0x84D3, 0x8490, 0x84BC,
+    0x84D1, 0x84CA, 0x873F, 0x871C, 0x873B, 0x8722, 0x8725, 0x8734,
+    0x8718, 0x8755, 0x8737, 0x8729, 0x88F3, 0x8902, 0x88F4, 0x88F9,
+    0x88F8, 0x88FD, 0x88E8, 0x891A, 0x88EF, 0x8AA6, 0x8A8C, 0x8A9E,
+    0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, 0x8AA4, 0x8AAA, 0x8AA5, 0x8AA8,
+    0x8A98, 0x8A91, 0x8A9A, 0x8AA7, 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3,
+    0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, 0x8D95, 0x8DFC, 0x8F14, 0x8F12,
+    0x8F15, 0x8F13, 0x8FA3, 0x9060, 0x9058, 0x905C, 0x9063, 0x9059,
+    0x905E, 0x9062, 0x905D, 0x905B, 0x9119, 0x9118, 0x911E, 0x9175,
+    0x9178, 0x9177, 0x9174, 0x9278, 0x92AC, 0x9280, 0x9285, 0x9298,
+    0x9296, 0x927B, 0x9293, 0x929C, 0x92A8, 0x927C, 0x9291, 0x95A1,
+    0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4, 0x9699, 0x969C, 0x969B,
+    0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785, 0x97F6, 0x9817, 0x9818,
+    0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C, 0x9909, 0x99C1, 0x9AAF,
+    0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4, 0x9CF6, 0x9CF3, 0x9EBC,
+    0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB, 0x50F5, 0x50F9, 0x5102,
+    0x5108, 0x5109, 0x5105, 0x51DC, 0x5287, 0x5288, 0x5289, 0x528D,
+    0x528A, 0x52F0, 0x53B2, 0x562E, 0x563B, 0x5639, 0x5632, 0x563F,
+    0x5634, 0x5629, 0x5653, 0x564E, 0x5657, 0x5674, 0x5636, 0x562F,
+    0x5630, 0x5880, 0x589F, 0x589E, 0x58B3, 0x589C, 0x58AE, 0x58A9,
+    0x58A6, 0x596D, 0x5B09, 0x5AFB, 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08,
+    0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB, 0x5C64, 0x5C65, 0x5D9D, 0x5D94,
+    0x5E62, 0x5E5F, 0x5E61, 0x5EE2, 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3,
+    0x5EE0, 0x5F48, 0x5F71, 0x5FB7, 0x5FB5, 0x6176, 0x6167, 0x616E,
+    0x615D, 0x6155, 0x6182, 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7,
+    0x6190, 0x61AB, 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE,
+    0x622E, 0x6469, 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490,
+    0x64B0, 0x64A5, 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD,
+    0x64AB, 0x649A, 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577,
+    0x6578, 0x66AE, 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8,
+    0x6A01, 0x6A1E, 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3,
+    0x6A02, 0x6A05, 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5,
+    0x6BC6, 0x6F3F, 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86,
+    0x6F6D, 0x6F5B, 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64,
+    0x6F97, 0x6F58, 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC,
+    0x71B1, 0x71A8, 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B,
+    0x7483, 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624,
+    0x7626, 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787,
+    0x778C, 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE,
+    0x78D5, 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37,
+    0x7A3B, 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6,
+    0x7BC7, 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF,
+    0x7DFB, 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE,
+    0x7DE9, 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF,
+    0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A, 0x8198,
+    0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513, 0x8511,
+    0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506, 0x8782,
+    0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757,
+    0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912, 0x8913,
+    0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95, 0x8ACB,
+    0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6, 0x8ACD,
+    0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0, 0x8CDE,
+    0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC, 0x8CEA,
+    0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D, 0x8E22,
+    0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D, 0x8F1B,
+    0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E, 0x8F25, 0x9069,
+    0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D, 0x9127, 0x9131,
+    0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB, 0x92B7, 0x92EA,
+    0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2, 0x92C7, 0x92F0, 0x92B2,
+    0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, 0x978D,
+    0x978B, 0x978F, 0x9821, 0x982B, 0x981C, 0x98B3, 0x990A, 0x9913,
+    0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF, 0x99DB, 0x99D1, 0x99D5,
+    0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF, 0x9B27, 0x9B45, 0x9B44,
+    0x9B77, 0x9B6F, 0x9D06, 0x9D09, 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE,
+    0x58A8, 0x9F52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180,
+    0x51AA, 0x51DD, 0x5291, 0x5293, 0x52F3, 0x5659, 0x566B, 0x5679,
+    0x5669, 0x5664, 0x5678, 0x566A, 0x5668, 0x5665, 0x5671, 0x566F,
+    0x566C, 0x5662, 0x5676, 0x58C1, 0x58BE, 0x58C7, 0x58C5, 0x596E,
+    0x5B1D, 0x5B34, 0x5B78, 0x5BF0, 0x5C0E, 0x5F4A, 0x61B2, 0x6191,
+    0x61A9, 0x618A, 0x61CD, 0x61B6, 0x61BE, 0x61CA, 0x61C8, 0x6230,
+    0x64C5, 0x64C1, 0x64CB, 0x64BB, 0x64BC, 0x64DA, 0x64C4, 0x64C7,
+    0x64C2, 0x64CD, 0x64BF, 0x64D2, 0x64D4, 0x64BE, 0x6574, 0x66C6,
+    0x66C9, 0x66B9, 0x66C4, 0x66C7, 0x66B8, 0x6A3D, 0x6A38, 0x6A3A,
+    0x6A59, 0x6A6B, 0x6A58, 0x6A39, 0x6A44, 0x6A62, 0x6A61, 0x6A4B,
+    0x6A47, 0x6A35, 0x6A5F, 0x6A48, 0x6B59, 0x6B77, 0x6C05, 0x6FC2,
+    0x6FB1, 0x6FA1, 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0,
+    0x6FB9, 0x6FB6, 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, 0x71C9, 0x71D0,
+    0x71D2, 0x71C8, 0x71D5, 0x71B9, 0x71CE, 0x71D9, 0x71DC, 0x71C3,
+    0x71C4, 0x7368, 0x749C, 0x74A3, 0x7498, 0x749F, 0x749E, 0x74E2,
+    0x750C, 0x750D, 0x7634, 0x7638, 0x763A, 0x76E7, 0x76E5, 0x77A0,
+    0x779E, 0x779F, 0x77A5, 0x78E8, 0x78DA, 0x78EC, 0x78E7, 0x79A6,
+    0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11,
+    0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6,
+    0x7E0A, 0x7E11, 0x7E08, 0x7E1B, 0x7E23, 0x7E1E, 0x7E1D, 0x7E09,
+    0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, 0x7FEE, 0x8028, 0x81B3,
+    0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, 0x8259, 0x854A, 0x8559,
+    0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856D, 0x856A, 0x855E,
+    0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, 0x8861, 0x892A, 0x8932,
+    0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB,
+    0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, 0x8AFE, 0x8B01, 0x8B02,
+    0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93,
+    0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, 0x8E39, 0x8E35, 0x8F3B,
+    0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, 0x9075, 0x9074, 0x9078,
+    0x9072, 0x907C, 0x907A, 0x9134, 0x9192, 0x9320, 0x9336, 0x92F8,
+    0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, 0x9304, 0x931A, 0x9310,
+    0x9326, 0x9321, 0x9315, 0x932E, 0x9319, 0x95BB, 0x96A7, 0x96A8,
+    0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, 0x970D, 0x9713, 0x970F,
+    0x975B, 0x975C, 0x9766, 0x9798, 0x9830, 0x9838, 0x983B, 0x9837,
+    0x982D, 0x9839, 0x9824, 0x9910, 0x9928, 0x991E, 0x991B, 0x9921,
+    0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, 0x9ABC, 0x9AFB, 0x9AED,
+    0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, 0x9D28, 0x9D12, 0x9D1B,
+    0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, 0x511F, 0x5121, 0x5132,
+    0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, 0x5687, 0x568F, 0x58D5,
+    0x58D3, 0x58D1, 0x58CE, 0x5B30, 0x5B2A, 0x5B24, 0x5B7A, 0x5C37,
+    0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, 0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD,
+    0x61C9, 0x61C2, 0x61C7, 0x61E6, 0x61CB, 0x6232, 0x6234, 0x64CE,
+    0x64CA, 0x64D8, 0x64E0, 0x64F0, 0x64E6, 0x64EC, 0x64F1, 0x64E2,
+    0x64ED, 0x6582, 0x6583, 0x66D9, 0x66D6, 0x6A80, 0x6A94, 0x6A84,
+    0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, 0x6A7E, 0x6A97, 0x6A90, 0x6AA0,
+    0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, 0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0,
+    0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, 0x6F80, 0x6FEC, 0x6FE1, 0x6FE9,
+    0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, 0x71DF, 0x71EE, 0x71E6, 0x71E5,
+    0x71ED, 0x71EC, 0x71F4, 0x71E0, 0x7235, 0x7246, 0x7370, 0x7372,
+    0x74A9, 0x74B0, 0x74A6, 0x74A8, 0x7646, 0x7642, 0x764C, 0x76EA,
+    0x77B3, 0x77AA, 0x77B0, 0x77AC, 0x77A7, 0x77AD, 0x77EF, 0x78F7,
+    0x78FA, 0x78F4, 0x78EF, 0x7901, 0x79A7, 0x79AA, 0x7A57, 0x7ABF,
+    0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC,
+    0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46,
+    0x7E37, 0x7E32, 0x7E43, 0x7E2B, 0x7E3D, 0x7E31, 0x7E45, 0x7E41,
+    0x7E34, 0x7E39, 0x7E48, 0x7E35, 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3,
+    0x7FFC, 0x8071, 0x8072, 0x8070, 0x806F, 0x8073, 0x81C6, 0x81C3,
+    0x81BA, 0x81C2, 0x81C0, 0x81BF, 0x81BD, 0x81C9, 0x81BE, 0x81E8,
+    0x8209, 0x8271, 0x85AA, 0x8584, 0x857E, 0x859C, 0x8591, 0x8594,
+    0x85AF, 0x859B, 0x8587, 0x85A8, 0x858A, 0x85A6, 0x8667, 0x87C0,
+    0x87D1, 0x87B3, 0x87D2, 0x87C6, 0x87AB, 0x87BB, 0x87BA, 0x87C8,
+    0x87CB, 0x893B, 0x8936, 0x8944, 0x8938, 0x893D, 0x89AC, 0x8B0E,
+    0x8B17, 0x8B19, 0x8B1B, 0x8B0A, 0x8B20, 0x8B1D, 0x8B04, 0x8B10,
+    0x8C41, 0x8C3F, 0x8C73, 0x8CFA, 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB,
+    0x8DA8, 0x8E49, 0x8E4B, 0x8E48, 0x8E4A, 0x8F44, 0x8F3E, 0x8F42,
+    0x8F45, 0x8F3F, 0x907F, 0x907D, 0x9084, 0x9081, 0x9082, 0x9080,
+    0x9139, 0x91A3, 0x919E, 0x919C, 0x934D, 0x9382, 0x9328, 0x9375,
+    0x934A, 0x9365, 0x934B, 0x9318, 0x937E, 0x936C, 0x935B, 0x9370,
+    0x935A, 0x9354, 0x95CA, 0x95CB, 0x95CC, 0x95C8, 0x95C6, 0x96B1,
+    0x96B8, 0x96D6, 0x971C, 0x971E, 0x97A0, 0x97D3, 0x9846, 0x98B6,
+    0x9935, 0x9A01, 0x99FF, 0x9BAE, 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B,
+    0x9D3F, 0x9E8B, 0x9ECF, 0x9EDE, 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E,
+    0x9F4B, 0x53E2, 0x5695, 0x56AE, 0x58D9, 0x58D8, 0x5B38, 0x5F5D,
+    0x61E3, 0x6233, 0x64F4, 0x64F2, 0x64FE, 0x6506, 0x64FA, 0x64FB,
+    0x64F7, 0x65B7, 0x66DC, 0x6726, 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB,
+    0x6AB8, 0x6AC2, 0x6AAE, 0x6AAF, 0x6B5F, 0x6B78, 0x6BAF, 0x7009,
+    0x700B, 0x6FFE, 0x7006, 0x6FFA, 0x7011, 0x700F, 0x71FB, 0x71FC,
+    0x71FE, 0x71F8, 0x7377, 0x7375, 0x74A7, 0x74BF, 0x7515, 0x7656,
+    0x7658, 0x7652, 0x77BD, 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE,
+    0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A,
+    0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A,
+    0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076,
+    0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9,
+    0x85B0, 0x85BA, 0x85B9, 0x87EF, 0x87EC, 0x87F2, 0x87E0, 0x8986,
+    0x89B2, 0x89F4, 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50, 0x8D05,
+    0x8E59, 0x8E63, 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0, 0x8F49,
+    0x8F4D, 0x9087, 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0, 0x9394,
+    0x938A, 0x9396, 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0, 0x9398,
+    0x939A, 0x9397, 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2, 0x96DC,
+    0x96D9, 0x96DB, 0x96DE, 0x9724, 0x97A3, 0x97A6, 0x97AD, 0x97F9,
+    0x984D, 0x984F, 0x984C, 0x984E, 0x9853, 0x98BA, 0x993E, 0x993F,
+    0x993D, 0x992E, 0x99A5, 0x9A0E, 0x9AC1, 0x9B03, 0x9B06, 0x9B4F,
+    0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8, 0x9BC0, 0x9D51,
+    0x9D5D, 0x9D60, 0x9EE0, 0x9F15, 0x9F2C, 0x5133, 0x56A5, 0x56A8,
+    0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, 0x5EEC, 0x61F2, 0x61F7,
+    0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, 0x66DD, 0x6AE5, 0x6ADD,
+    0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, 0x701A, 0x701D, 0x7015,
+    0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, 0x7378, 0x737A, 0x74BD,
+    0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F, 0x7661, 0x77C7, 0x7919,
+    0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, 0x7C38, 0x7C3D, 0x7C37,
+    0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69, 0x7E6A, 0x7E73, 0x7F85,
+    0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9, 0x85DD, 0x85EA, 0x85D5,
+    0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805, 0x880D, 0x87F9, 0x87FE,
+    0x8960, 0x895F, 0x8956, 0x895E, 0x8B41, 0x8B5C, 0x8B58, 0x8B49,
+    0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59, 0x8D08, 0x8D0A, 0x8E7C,
+    0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A, 0x8E74, 0x8F54, 0x8F4E,
+    0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE, 0x93E1, 0x93D1, 0x93DF,
+    0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6, 0x93E2, 0x93CD, 0x93D8,
+    0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4, 0x96E3, 0x972A, 0x9727,
+    0x9761, 0x97DC, 0x97FB, 0x985E, 0x9858, 0x985B, 0x98BC, 0x9945,
+    0x9949, 0x9A16, 0x9A19, 0x9B0D, 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB,
+    0x9D89, 0x9D61, 0x9D72, 0x9D6A, 0x9D6C, 0x9E92, 0x9E97, 0x9E93,
+    0x9EB4, 0x52F8, 0x56B7, 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40,
+    0x5B43, 0x5B7D, 0x5BF6, 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514,
+    0x6519, 0x66E6, 0x6727, 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210,
+    0x737B, 0x74CF, 0x7662, 0x7665, 0x7926, 0x792A, 0x792C, 0x792B,
+    0x7AC7, 0x7AF6, 0x7C4C, 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE,
+    0x7E7D, 0x7E7C, 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB,
+    0x85F9, 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814,
+    0x8815, 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F,
+    0x8B5F, 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82,
+    0x91B4, 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4,
+    0x9952, 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13,
+    0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61,
+    0x5137, 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD,
+    0x61FC, 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04,
+    0x6AFA, 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669,
+    0x77D3, 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A,
+    0x8823, 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74,
+    0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF,
+    0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B,
+    0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957,
+    0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D,
+    0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19,
+    0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9,
+    0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61,
+    0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, 0x79B3,
+    0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972, 0x896F, 0x89FC,
+    0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61, 0x9148, 0x9444,
+    0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1, 0x986B, 0x9955,
+    0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31, 0x9C3E, 0x9C3B,
+    0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94, 0x56CC, 0x5DD6,
+    0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10, 0x74DA, 0x7ACA,
+    0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94, 0x81E2, 0x8638,
+    0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463, 0x9460, 0x9464,
+    0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57, 0x9AD3, 0x9AD4,
+    0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F, 0x9EF4, 0x56D1,
+    0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7, 0x7F50, 0x7F88,
+    0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92, 0x8B96, 0x8277, 0x8D1B,
+    0x91C0, 0x946A, 0x9742, 0x9748, 0x9744, 0x97C6, 0x9870, 0x9A5F,
+    0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, 0x9E7C, 0x9E7D, 0x9F07,
+    0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, 0x7C6C, 0x7C6E, 0x883B,
+    0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, 0x9871, 0x995E, 0x9AD6,
+    0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, 0x9477, 0x97C9, 0x9A62,
+    0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, 0x947D, 0x947E, 0x947C,
+    0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F, 0x9E1A, 0x7228, 0x9A6A,
+    0x9B31, 0x9E1B, 0x9E1E, 0x7C72, 0x4E42, 0x4E5C, 0x51F5, 0x531A,
+    0x5382, 0x4E07, 0x4E0C, 0x4E47, 0x4E8D, 0x56D7, 0x5C6E, 0x5F73,
+    0x4E0F, 0x5187, 0x4E0E, 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8,
+    0x5198, 0x52FC, 0x536C, 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10,
+    0x5DFF, 0x65E1, 0x6BB3, 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C,
+    0x4EE8, 0x4EDC, 0x4EE9, 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x5209,
+    0x531C, 0x534C, 0x5722, 0x5723, 0x5917, 0x592F, 0x5B81, 0x5B84,
+    0x5C12, 0x5C3B, 0x5C74, 0x5C73, 0x5E04, 0x5E80, 0x5E82, 0x5FC9,
+    0x6209, 0x6250, 0x6C15, 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE,
+    0x72B0, 0x738A, 0x79B8, 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C,
+    0x4EF5, 0x4F14, 0x4EF1, 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02,
+    0x4F05, 0x4F22, 0x4F13, 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213,
+    0x5210, 0x52A6, 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1,
+    0x56DF, 0x572E, 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985,
+    0x597B, 0x597E, 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C,
+    0x5C7A, 0x5C7B, 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A,
+    0x5F74, 0x5FD5, 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261,
+    0x6266, 0x6262, 0x6259, 0x6260, 0x625A, 0x6265, 0x6537, 0x65EF,
+    0x65EE, 0x673E, 0x6739, 0x6738, 0x673B, 0x673A, 0x673F, 0x673C,
+    0x6733, 0x6C18, 0x6C46, 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54,
+    0x6C4B, 0x6C4C, 0x7071, 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A,
+    0x767F, 0x7A75, 0x7F51, 0x8278, 0x827C, 0x8280, 0x827D, 0x827F,
+    0x864D, 0x897E, 0x9099, 0x9097, 0x9098, 0x909B, 0x9094, 0x9622,
+    0x9624, 0x9620, 0x9623, 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53,
+    0x4F64, 0x4F3E, 0x4F67, 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D,
+    0x4F33, 0x4F3F, 0x4F61, 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221,
+    0x52AD, 0x52AE, 0x5309, 0x5363, 0x5372, 0x538E, 0x538F, 0x5430,
+    0x5437, 0x542A, 0x5454, 0x5445, 0x5419, 0x541C, 0x5425, 0x5418,
+    0x543D, 0x544F, 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE, 0x56E7,
+    0x56E5, 0x5741, 0x5745, 0x574C, 0x5749, 0x574B, 0x5752, 0x5906,
+    0x5940, 0x59A6, 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2, 0x5990,
+    0x598F, 0x59A7, 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A, 0x5C8D,
+    0x5C8F, 0x5C88, 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86, 0x5C93,
+    0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C, 0x5E88,
+    0x5E8D, 0x5F05, 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1, 0x5FD0,
+    0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA,
+    0x5FEF, 0x5FF7, 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283, 0x628C,
+    0x628E, 0x628F, 0x6294, 0x6287, 0x6271, 0x627B, 0x627A, 0x6270,
+    0x6281, 0x6288, 0x6277, 0x627D, 0x6272, 0x6274, 0x65F0, 0x65F4,
+    0x65F3, 0x65F2, 0x65F5, 0x6745, 0x6747, 0x6759, 0x6755, 0x674C,
+    0x6748, 0x675D, 0x674D, 0x675A, 0x674B, 0x6BD0, 0x6C19, 0x6C1A,
+    0x6C78, 0x6C67, 0x6C6B, 0x6C84, 0x6C8B, 0x6C8F, 0x6C71, 0x6C6F,
+    0x6C69, 0x6C9A, 0x6C6D, 0x6C87, 0x6C95, 0x6C9C, 0x6C66, 0x6C73,
+    0x6C65, 0x6C7B, 0x6C8E, 0x7074, 0x707A, 0x7263, 0x72BF, 0x72BD,
+    0x72C3, 0x72C6, 0x72C1, 0x72BA, 0x72C5, 0x7395, 0x7397, 0x7393,
+    0x7394, 0x7392, 0x753A, 0x7539, 0x7594, 0x7595, 0x7681, 0x793D,
+    0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809C, 0x8290, 0x828F,
+    0x8285, 0x828E, 0x8291, 0x8293, 0x828A, 0x8283, 0x8284, 0x8C78,
+    0x8FC9, 0x8FBF, 0x909F, 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0,
+    0x9630, 0x9628, 0x962F, 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85,
+    0x4F7D, 0x4F80, 0x4F87, 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77,
+    0x4F4C, 0x4F97, 0x4F6A, 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90,
+    0x4F9C, 0x4F94, 0x4F9E, 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E,
+    0x519E, 0x51BC, 0x51BE, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231,
+    0x52BC, 0x530A, 0x530B, 0x533C, 0x5392, 0x5394, 0x5487, 0x547F,
+    0x5481, 0x5491, 0x5482, 0x5488, 0x546B, 0x547A, 0x547E, 0x5465,
+    0x546C, 0x5474, 0x5466, 0x548D, 0x546F, 0x5461, 0x5460, 0x5498,
+    0x5463, 0x5467, 0x5464, 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D,
+    0x576B, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577B, 0x5773,
+    0x5774, 0x5762, 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA,
+    0x59CF, 0x59CE, 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3,
+    0x59D6, 0x59B1, 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62,
+    0x5B65, 0x5B93, 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0,
+    0x5CB5, 0x5CAF, 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2,
+    0x5CAA, 0x5CA7, 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17,
+    0x5E14, 0x5E19, 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82,
+    0x5F7E, 0x5F7D, 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032,
+    0x600B, 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, 0x602C,
+    0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, 0x6009,
+    0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA,
+    0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0,
+    0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612,
+    0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611,
+    0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, 0x6776,
+    0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, 0x677A,
+    0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, 0x6779,
+    0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC,
+    0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7,
+    0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, 0x6CD2,
+    0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, 0x6D30,
+    0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, 0x7094,
+    0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082,
+    0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9, 0x72DC,
+    0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1, 0x73AD,
+    0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8, 0x753F,
+    0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1, 0x76F0,
+    0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, 0x77F7, 0x7942,
+    0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB, 0x7C75, 0x7CFD, 0x8035,
+    0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5, 0x80AD, 0x8220, 0x82A0,
+    0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B, 0x82B5, 0x82A7, 0x82AE,
+    0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8, 0x82A1, 0x82A9, 0x82C2,
+    0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670, 0x866F, 0x866D, 0x866E,
+    0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD, 0x8FD6, 0x8FD5, 0x8FD7,
+    0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0, 0x9639, 0x963D, 0x963C,
+    0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3, 0x4FB2, 0x4FC9, 0x4FCB,
+    0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB, 0x4FB3, 0x4FDB, 0x4FC7,
+    0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC, 0x5244, 0x5249, 0x52C0,
+    0x52C2, 0x533D, 0x537C, 0x5397, 0x5396, 0x5399, 0x5398, 0x54BA,
+    0x54A1, 0x54AD, 0x54A5, 0x54CF, 0x54C3, 0x830D, 0x54B7, 0x54AE,
+    0x54D6, 0x54B6, 0x54C5, 0x54C6, 0x54A0, 0x5470, 0x54BC, 0x54A2,
+    0x54BE, 0x5472, 0x54DE, 0x54B0, 0x57B5, 0x579E, 0x579F, 0x57A4,
+    0x578C, 0x5797, 0x579D, 0x579B, 0x5794, 0x5798, 0x578F, 0x5799,
+    0x57A5, 0x579A, 0x5795, 0x58F4, 0x590D, 0x5953, 0x59E1, 0x59DE,
+    0x59EE, 0x5A00, 0x59F1, 0x59DD, 0x59FA, 0x59FD, 0x59FC, 0x59F6,
+    0x59E4, 0x59F2, 0x59F7, 0x59DB, 0x59E9, 0x59F3, 0x59F5, 0x59E0,
+    0x59FE, 0x59F4, 0x59ED, 0x5BA8, 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC,
+    0x5CD7, 0x5CCB, 0x5CDB, 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA,
+    0x5CD6, 0x5CD3, 0x5CD4, 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF,
+    0x5CF8, 0x5DF9, 0x5E21, 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0,
+    0x5EA4, 0x5EA2, 0x5E9B, 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56,
+    0x5F86, 0x6037, 0x6039, 0x6054, 0x6072, 0x605E, 0x6045, 0x6053,
+    0x6047, 0x6049, 0x605B, 0x604C, 0x6040, 0x6042, 0x605F, 0x6024,
+    0x6044, 0x6058, 0x6066, 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D,
+    0x630B, 0x62F5, 0x630E, 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C,
+    0x62F8, 0x62F6, 0x6300, 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB,
+    0x62F0, 0x6541, 0x6543, 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632,
+    0x6635, 0x661C, 0x6626, 0x6622, 0x6633, 0x662B, 0x663A, 0x661D,
+    0x6634, 0x6639, 0x662E, 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8,
+    0x67BA, 0x67DC, 0x67BB, 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5,
+    0x67EB, 0x67E4, 0x67DF, 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6,
+    0x67EE, 0x67E3, 0x67C2, 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2,
+    0x67FC, 0x67C6, 0x67ED, 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA,
+    0x67C9, 0x67CA, 0x67C3, 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84,
+    0x6BB6, 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34,
+    0x6D2D, 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33,
+    0x6D04, 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42,
+    0x6D01, 0x6D18, 0x6D37, 0x6D03, 0x6D0F, 0x6D40, 0x6D07, 0x6D20,
+    0x6D2C, 0x6D08, 0x6D22, 0x6D09, 0x6D10, 0x70B7, 0x709F, 0x70BE,
+    0x70B1, 0x70B0, 0x70A1, 0x70B4, 0x70B5, 0x70A9, 0x7241, 0x7249,
+    0x724A, 0x726C, 0x7270, 0x7273, 0x726E, 0x72CA, 0x72E4, 0x72E8,
+    0x72EB, 0x72DF, 0x72EA, 0x72E6, 0x72E3, 0x7385, 0x73CC, 0x73C2,
+    0x73C8, 0x73C5, 0x73B9, 0x73B6, 0x73B5, 0x73B4, 0x73EB, 0x73BF,
+    0x73C7, 0x73BE, 0x73C3, 0x73C6, 0x73B8, 0x73CB, 0x74EC, 0x74EE,
+    0x752E, 0x7547, 0x7548, 0x75A7, 0x75AA, 0x7679, 0x76C4, 0x7708,
+    0x7703, 0x7704, 0x7705, 0x770A, 0x76F7, 0x76FB, 0x76FA, 0x77E7,
+    0x77E8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780F, 0x780E,
+    0x7809, 0x7803, 0x7813, 0x794A, 0x794C, 0x794B, 0x7945, 0x7944,
+    0x79D5, 0x79CD, 0x79CF, 0x79D6, 0x79CE, 0x7A80, 0x7A7E, 0x7AD1,
+    0x7B00, 0x7B01, 0x7C7A, 0x7C78, 0x7C79, 0x7C7F, 0x7C80, 0x7C81,
+    0x7D03, 0x7D08, 0x7D01, 0x7F58, 0x7F91, 0x7F8D, 0x7FBE, 0x8007,
+    0x800E, 0x800F, 0x8014, 0x8037, 0x80D8, 0x80C7, 0x80E0, 0x80D1,
+    0x80C8, 0x80C2, 0x80D0, 0x80C5, 0x80E3, 0x80D9, 0x80DC, 0x80CA,
+    0x80D5, 0x80C9, 0x80CF, 0x80D7, 0x80E6, 0x80CD, 0x81FF, 0x8221,
+    0x8294, 0x82D9, 0x82FE, 0x82F9, 0x8307, 0x82E8, 0x8300, 0x82D5,
+    0x833A, 0x82EB, 0x82D6, 0x82F4, 0x82EC, 0x82E1, 0x82F2, 0x82F5,
+    0x830C, 0x82FB, 0x82F6, 0x82F0, 0x82EA, 0x82E4, 0x82E0, 0x82FA,
+    0x82F3, 0x82ED, 0x8677, 0x8674, 0x867C, 0x8673, 0x8841, 0x884E,
+    0x8867, 0x886A, 0x8869, 0x89D3, 0x8A04, 0x8A07, 0x8D72, 0x8FE3,
+    0x8FE1, 0x8FEE, 0x8FE0, 0x90F1, 0x90BD, 0x90BF, 0x90D5, 0x90C5,
+    0x90BE, 0x90C7, 0x90CB, 0x90C8, 0x91D4, 0x91D3, 0x9654, 0x964F,
+    0x9651, 0x9653, 0x964A, 0x964E, 0x501E, 0x5005, 0x5007, 0x5013,
+    0x5022, 0x5030, 0x501B, 0x4FF5, 0x4FF4, 0x5033, 0x5037, 0x502C,
+    0x4FF6, 0x4FF7, 0x5017, 0x501C, 0x5020, 0x5027, 0x5035, 0x502F,
+    0x5031, 0x500E, 0x515A, 0x5194, 0x5193, 0x51CA, 0x51C4, 0x51C5,
+    0x51C8, 0x51CE, 0x5261, 0x525A, 0x5252, 0x525E, 0x525F, 0x5255,
+    0x5262, 0x52CD, 0x530E, 0x539E, 0x5526, 0x54E2, 0x5517, 0x5512,
+    0x54E7, 0x54F3, 0x54E4, 0x551A, 0x54FF, 0x5504, 0x5508, 0x54EB,
+    0x5511, 0x5505, 0x54F1, 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0,
+    0x550E, 0x5503, 0x550B, 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5,
+    0x57D2, 0x57BA, 0x57C6, 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF,
+    0x57C7, 0x57D0, 0x57B9, 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16,
+    0x5A2D, 0x5A2E, 0x5A15, 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33,
+    0x5B6C, 0x5BA7, 0x5BAD, 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC,
+    0x5CFF, 0x5CEE, 0x5CF1, 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28,
+    0x5EA8, 0x5EAE, 0x5EAA, 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D,
+    0x605A, 0x6067, 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081,
+    0x609D, 0x6083, 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E,
+    0x6219, 0x6246, 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345,
+    0x6336, 0x6343, 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329,
+    0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333,
+    0x635A, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546,
+    0x65C6, 0x65C3, 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651,
+    0x6712, 0x6713, 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B,
+    0x684B, 0x684F, 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D,
+    0x682F, 0x684E, 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826,
+    0x6828, 0x682E, 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F,
+    0x6B2D, 0x6B31, 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4,
+    0x6BE8, 0x6BE3, 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64,
+    0x6D76, 0x6D0D, 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F,
+    0x6D91, 0x6D8D, 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60,
+    0x6D97, 0x6D70, 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68,
+    0x6D8B, 0x6D7E, 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D,
+    0x6D75, 0x6D90, 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39,
+    0x70E2, 0x70D7, 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5,
+    0x70C6, 0x70C7, 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278, 0x7277,
+    0x7276, 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6, 0x72F3, 0x72FB,
+    0x7301, 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC, 0x73E7, 0x73E3,
+    0x73E9, 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD, 0x73DA, 0x73D7,
+    0x73D8, 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5, 0x7521, 0x755B,
+    0x755F, 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0, 0x75BF, 0x75B6,
+    0x75BA, 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710, 0x7713, 0x7712,
+    0x7723, 0x7711, 0x7715, 0x7719, 0x771A, 0x7722, 0x7727, 0x7823,
+    0x782C, 0x7822, 0x7835, 0x782F, 0x7828, 0x782E, 0x782B, 0x7821,
+    0x7829, 0x7833, 0x782A, 0x7831, 0x7954, 0x795B, 0x794F, 0x795C,
+    0x7953, 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0, 0x79EE, 0x79ED,
+    0x79EA, 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89, 0x7A85, 0x7A8B,
+    0x7A8C, 0x7A8A, 0x7A87, 0x7AD8, 0x7B10, 0x7B04, 0x7B13, 0x7B05,
+    0x7B0F, 0x7B08, 0x7B0A, 0x7B0E, 0x7B09, 0x7B12, 0x7C84, 0x7C91,
+    0x7C8A, 0x7C8C, 0x7C88, 0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, 0x7D11,
+    0x7D0E, 0x7D18, 0x7D16, 0x7D13, 0x7D1F, 0x7D12, 0x7D0F, 0x7D0C,
+    0x7F5C, 0x7F61, 0x7F5E, 0x7F60, 0x7F5D, 0x7F5B, 0x7F96, 0x7F92,
+    0x7FC3, 0x7FC2, 0x7FC0, 0x8016, 0x803E, 0x8039, 0x80FA, 0x80F2,
+    0x80F9, 0x80F5, 0x8101, 0x80FB, 0x8100, 0x8201, 0x822F, 0x8225,
+    0x8333, 0x832D, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833F,
+    0x8341, 0x8326, 0x831C, 0x8322, 0x8342, 0x834E, 0x831B, 0x832A,
+    0x8308, 0x833C, 0x834D, 0x8316, 0x8324, 0x8320, 0x8337, 0x832F,
+    0x8329, 0x8347, 0x8345, 0x834C, 0x8353, 0x831E, 0x832C, 0x834B,
+    0x8327, 0x8348, 0x8653, 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D,
+    0x8691, 0x869E, 0x8687, 0x8697, 0x8686, 0x868B, 0x869A, 0x8685,
+    0x86A5, 0x8699, 0x86A1, 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D,
+    0x8690, 0x8694, 0x8843, 0x8844, 0x886D, 0x8875, 0x8876, 0x8872,
+    0x8880, 0x8871, 0x887F, 0x886F, 0x8883, 0x887E, 0x8874, 0x887C,
+    0x8A12, 0x8C47, 0x8C57, 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78,
+    0x8DB5, 0x8DB7, 0x8DB6, 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002,
+    0x8FFF, 0x8FFB, 0x9004, 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9,
+    0x90DA, 0x90E3, 0x90DF, 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC,
+    0x90E4, 0x9150, 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C,
+    0x965F, 0x96BC, 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A,
+    0x5061, 0x505E, 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048,
+    0x504D, 0x5041, 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F,
+    0x5069, 0x506B, 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073,
+    0x5057, 0x5051, 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6,
+    0x52D3, 0x532D, 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550,
+    0x5534, 0x552A, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552,
+    0x5545, 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, 0x552D,
+    0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2,
+    0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8,
+    0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5,
+    0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C,
+    0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58,
+    0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F,
+    0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52,
+    0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C,
+    0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72,
+    0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A,
+    0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, 0x5D30,
+    0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, 0x5EB4,
+    0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96, 0x5F9F,
+    0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3, 0x60D4,
+    0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB, 0x60B7,
+    0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365, 0x638A,
+    0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397, 0x63AB,
+    0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375, 0x639C,
+    0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F, 0x6378, 0x6385,
+    0x6381, 0x6391, 0x638D, 0x6370, 0x6553, 0x65CD, 0x6665, 0x6661,
+    0x665B, 0x6659, 0x665C, 0x6662, 0x6718, 0x6879, 0x6887, 0x6890,
+    0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB, 0x6956, 0x686F, 0x68A3,
+    0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2, 0x688F, 0x6877, 0x6892,
+    0x687C, 0x686B, 0x6872, 0x68AA, 0x6880, 0x6871, 0x687E, 0x689B,
+    0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4, 0x6878, 0x687B, 0x6891,
+    0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33, 0x6B37, 0x6B38, 0x6B91,
+    0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A, 0x6DC0, 0x6DAB, 0x6DB4,
+    0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2, 0x6DB7, 0x6DF6, 0x6DD4,
+    0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6, 0x6DBE, 0x6DE5, 0x6DDC,
+    0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD, 0x6DED, 0x6DF0, 0x6DBA,
+    0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9, 0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD,
+    0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB, 0x70FA, 0x710D, 0x70F7, 0x7117,
+    0x70F4, 0x710C, 0x70F0, 0x7104, 0x70F3, 0x7110, 0x70FC, 0x70FF,
+    0x7106, 0x7113, 0x7100, 0x70F8, 0x70F6, 0x710B, 0x7102, 0x710E,
+    0x727E, 0x727B, 0x727C, 0x727F, 0x731D, 0x7317, 0x7307, 0x7311,
+    0x7318, 0x730A, 0x7308, 0x72FF, 0x730F, 0x731E, 0x7388, 0x73F6,
+    0x73F8, 0x73F5, 0x7404, 0x7401, 0x73FD, 0x7407, 0x7400, 0x73FA,
+    0x73FC, 0x73FF, 0x740C, 0x740B, 0x73F4, 0x7408, 0x7564, 0x7563,
+    0x75CE, 0x75D2, 0x75CF, 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F,
+    0x7689, 0x76D3, 0x7739, 0x772F, 0x772D, 0x7731, 0x7732, 0x7734,
+    0x7733, 0x773D, 0x7725, 0x773B, 0x7735, 0x7848, 0x7852, 0x7849,
+    0x784D, 0x784A, 0x784C, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967,
+    0x7969, 0x796A, 0x7963, 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8,
+    0x79F6, 0x79F7, 0x7A8F, 0x7A94, 0x7A90, 0x7B35, 0x7B3B, 0x7B34,
+    0x7B25, 0x7B30, 0x7B22, 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D,
+    0x7B31, 0x7B2B, 0x7B2D, 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23,
+    0x7C94, 0x7C98, 0x7C96, 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36,
+    0x7D3A, 0x7D45, 0x7D2C, 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F,
+    0x7D4A, 0x7D3B, 0x7D28, 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B,
+    0x7FCA, 0x7FCB, 0x7FCD, 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9,
+    0x801F, 0x801E, 0x801B, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125,
+    0x8119, 0x811B, 0x812D, 0x811F, 0x812C, 0x811E, 0x8121, 0x8115,
+    0x8127, 0x811D, 0x8122, 0x8211, 0x8238, 0x8233, 0x823A, 0x8234,
+    0x8232, 0x8274, 0x8390, 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373,
+    0x83A4, 0x8374, 0x838F, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394,
+    0x83A9, 0x837D, 0x8383, 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B,
+    0x837E, 0x83A5, 0x83AF, 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6,
+    0x8387, 0x83AE, 0x8376, 0x8659, 0x8656, 0x86BF, 0x86B7, 0x86C2,
+    0x86C1, 0x86C5, 0x86BA, 0x86B0, 0x86C8, 0x86B9, 0x86B3, 0x86B8,
+    0x86CC, 0x86B4, 0x86BB, 0x86BC, 0x86C3, 0x86BD, 0x86BE, 0x8852,
+    0x8889, 0x8895, 0x88A8, 0x88A2, 0x88AA, 0x889A, 0x8891, 0x88A1,
+    0x889F, 0x8898, 0x88A7, 0x8899, 0x889B, 0x8897, 0x88A4, 0x88AC,
+    0x888C, 0x8893, 0x888E, 0x8982, 0x89D6, 0x89D9, 0x89D5, 0x8A30,
+    0x8A27, 0x8A2C, 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, 0x8C5D, 0x8C7D,
+    0x8CA5, 0x8D7D, 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, 0x8DB9, 0x8DBF,
+    0x8DC1, 0x8ED8, 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, 0x8EE0, 0x8EE1,
+    0x9024, 0x900B, 0x9011, 0x901C, 0x900C, 0x9021, 0x90EF, 0x90EA,
+    0x90F0, 0x90F4, 0x90F2, 0x90F3, 0x90D4, 0x90EB, 0x90EC, 0x90E9,
+    0x9156, 0x9158, 0x915A, 0x9153, 0x9155, 0x91EC, 0x91F4, 0x91F1,
+    0x91F3, 0x91F8, 0x91E4, 0x91F9, 0x91EA, 0x91EB, 0x91F7, 0x91E8,
+    0x91EE, 0x957A, 0x9586, 0x9588, 0x967C, 0x966D, 0x966B, 0x9671,
+    0x966F, 0x96BF, 0x976A, 0x9804, 0x98E5, 0x9997, 0x509B, 0x5095,
+    0x5094, 0x509E, 0x508B, 0x50A3, 0x5083, 0x508C, 0x508E, 0x509D,
+    0x5068, 0x509C, 0x5092, 0x5082, 0x5087, 0x515F, 0x51D4, 0x5312,
+    0x5311, 0x53A4, 0x53A7, 0x5591, 0x55A8, 0x55A5, 0x55AD, 0x5577,
+    0x5645, 0x55A2, 0x5593, 0x5588, 0x558F, 0x55B5, 0x5581, 0x55A3,
+    0x5592, 0x55A4, 0x557D, 0x558C, 0x55A6, 0x557F, 0x5595, 0x55A1,
+    0x558E, 0x570C, 0x5829, 0x5837, 0x5819, 0x581E, 0x5827, 0x5823,
+    0x5828, 0x57F5, 0x5848, 0x5825, 0x581C, 0x581B, 0x5833, 0x583F,
+    0x5836, 0x582E, 0x5839, 0x5838, 0x582D, 0x582C, 0x583B, 0x5961,
+    0x5AAF, 0x5A94, 0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6,
+    0x5A7C, 0x5AA5, 0x5AAC, 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A,
+    0x5A97, 0x5A83, 0x5A8B, 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C,
+    0x5A8F, 0x5A93, 0x5A9D, 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1,
+    0x5BCA, 0x5BCE, 0x5C0C, 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41,
+    0x5D4B, 0x5D3F, 0x5D35, 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A,
+    0x5D52, 0x5D3D, 0x5D31, 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38,
+    0x5D3C, 0x5D32, 0x5D36, 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58,
+    0x5FA6, 0x5FA5, 0x5FAB, 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE,
+    0x60C4, 0x6114, 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113,
+    0x60F8, 0x60FC, 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110,
+    0x60FF, 0x6104, 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE,
+    0x63E5, 0x63E8, 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0,
+    0x63F6, 0x63D5, 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD,
+    0x63DC, 0x63C4, 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB,
+    0x63C8, 0x63F0, 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564,
+    0x655C, 0x6568, 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0,
+    0x65D2, 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A,
+    0x6672, 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC,
+    0x68EA, 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6,
+    0x6913, 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970,
+    0x68B4, 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD,
+    0x68FC, 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD,
+    0x68DE, 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915,
+    0x6925, 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97,
+    0x6B99, 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC,
+    0x6E46, 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45,
+    0x6E62, 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33,
+    0x6E4B, 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, 0x6E68,
+    0x6E5C, 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, 0x6E39,
+    0x6E22, 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, 0x6E77,
+    0x6E55, 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, 0x7120,
+    0x711E, 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, 0x7122,
+    0x7132, 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, 0x7288,
+    0x7289, 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, 0x7322,
+    0x7331, 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, 0x7335,
+    0x730C, 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, 0x741A, 0x7421,
+    0x742D, 0x7431, 0x7424, 0x7423, 0x741D, 0x7429, 0x7420, 0x7432,
+    0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7, 0x75DA, 0x75E1, 0x75E6,
+    0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695, 0x7692, 0x76DA, 0x7746,
+    0x7747, 0x7744, 0x774D, 0x7745, 0x774A, 0x774E, 0x774B, 0x774C,
+    0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865, 0x785C, 0x786D, 0x7871,
+    0x786A, 0x786E, 0x7870, 0x7869, 0x7868, 0x785E, 0x7862, 0x7974,
+    0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A, 0x7A03, 0x7A0C, 0x7A04,
+    0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B47, 0x7B44, 0x7B48, 0x7B4C,
+    0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2, 0x7C9E, 0x7CA8, 0x7CA1,
+    0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56, 0x7D67, 0x7D6A, 0x7D4F,
+    0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54, 0x7D69, 0x7D51, 0x7D5F,
+    0x7D4E, 0x7F3E, 0x7F3F, 0x7F65, 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1,
+    0x7FD7, 0x8051, 0x804F, 0x8050, 0x80FE, 0x80D4, 0x8143, 0x814A,
+    0x8152, 0x814F, 0x8147, 0x813D, 0x814D, 0x813A, 0x81E6, 0x81EE,
+    0x81F7, 0x81F8, 0x81F9, 0x8204, 0x823C, 0x823D, 0x823F, 0x8275,
+    0x833B, 0x83CF, 0x83F9, 0x8423, 0x83C0, 0x83E8, 0x8412, 0x83E7,
+    0x83E4, 0x83FC, 0x83F6, 0x8410, 0x83C6, 0x83C8, 0x83EB, 0x83E3,
+    0x83BF, 0x8401, 0x83DD, 0x83E5, 0x83D8, 0x83FF, 0x83E1, 0x83CB,
+    0x83CE, 0x83D6, 0x83F5, 0x83C9, 0x8409, 0x840F, 0x83DE, 0x8411,
+    0x8406, 0x83C2, 0x83F3, 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA,
+    0x8413, 0x839A, 0x83C3, 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7,
+    0x83E2, 0x841B, 0x83DB, 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3,
+    0x86E3, 0x86DA, 0x86EA, 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9,
+    0x86D7, 0x86E8, 0x86D1, 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7,
+    0x88B9, 0x88B8, 0x88C0, 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD,
+    0x88B2, 0x8901, 0x88C9, 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA,
+    0x89DB, 0x8A4E, 0x8A4D, 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58,
+    0x8A44, 0x8A45, 0x8A52, 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F,
+    0x8C5F, 0x8C81, 0x8C80, 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5,
+    0x8D84, 0x8D80, 0x8D89, 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6,
+    0x8DDC, 0x8DCF, 0x8DD5, 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF,
+    0x8EF7, 0x8EFA, 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7,
+    0x8EE8, 0x8EF6, 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D,
+    0x9034, 0x902F, 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108,
+    0x90F9, 0x90FB, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161,
+    0x9164, 0x915F, 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203,
+    0x921A, 0x9226, 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD,
+    0x9206, 0x9204, 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217,
+    0x9205, 0x9216, 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E,
+    0x9688, 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1,
+    0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6,
+    0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE,
+    0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA,
+    0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278,
+    0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA,
+    0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D,
+    0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9,
+    0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, 0x5849,
+    0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, 0x583D,
+    0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8,
+    0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, 0x5AB7,
+    0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, 0x5BD6,
+    0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A, 0x5D65,
+    0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0, 0x5E4F,
+    0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, 0x5ECB,
+    0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A, 0x612B,
+    0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F, 0x6129,
+    0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5, 0x63F1,
+    0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x6433, 0x6443,
+    0x641F, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640C,
+    0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642F, 0x640A, 0x641A,
+    0x6440, 0x6425, 0x6427, 0x640B, 0x63E7, 0x641B, 0x642E, 0x6421,
+    0x640E, 0x656F, 0x6592, 0x65D3, 0x6686, 0x668C, 0x6695, 0x6690,
+    0x668B, 0x668A, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695F,
+    0x6938, 0x694E, 0x6962, 0x6971, 0x693F, 0x6945, 0x696A, 0x6939,
+    0x6942, 0x6957, 0x6959, 0x697A, 0x6948, 0x6949, 0x6935, 0x696C,
+    0x6933, 0x693D, 0x6965, 0x68F0, 0x6978, 0x6934, 0x6969, 0x6940,
+    0x696F, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694C, 0x693B,
+    0x694B, 0x6937, 0x695C, 0x694F, 0x6951, 0x6932, 0x6952, 0x692F,
+    0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43, 0x6B42, 0x6B48, 0x6B41,
+    0x6B9B, 0x6BFB, 0x6BFC, 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6,
+    0x6EC8, 0x6E8F, 0x6EC0, 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1,
+    0x6EB9, 0x6EC6, 0x6ED2, 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7,
+    0x6EB0, 0x6ECD, 0x6EA6, 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC,
+    0x6ED8, 0x6E99, 0x6E92, 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF,
+    0x6EB3, 0x6ED0, 0x6ECA, 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154,
+    0x7152, 0x7163, 0x7160, 0x7141, 0x715D, 0x7162, 0x7172, 0x7178,
+    0x716A, 0x7161, 0x7142, 0x7158, 0x7143, 0x714B, 0x7170, 0x715F,
+    0x7150, 0x7153, 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C,
+    0x7291, 0x7290, 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340,
+    0x734A, 0x7349, 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457,
+    0x7440, 0x744F, 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454,
+    0x74E1, 0x74FF, 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983,
+    0x75EF, 0x760F, 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8,
+    0x7610, 0x75FB, 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5,
+    0x76DD, 0x7755, 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769,
+    0x7767, 0x7754, 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894,
+    0x788F, 0x7884, 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879,
+    0x7899, 0x7880, 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979,
+    0x7A11, 0x7A18, 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13,
+    0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64,
+    0x7B6D, 0x7B74, 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70,
+    0x7B61, 0x7B78, 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88,
+    0x7D86, 0x7D80, 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B,
+    0x7D83, 0x7D7C, 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D,
+    0x7F6B, 0x7F67, 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB,
+    0x7FDC, 0x8021, 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B,
+    0x8162, 0x8172, 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, 0x8144,
+    0x8161, 0x821D, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84F1,
+    0x843F, 0x8456, 0x8476, 0x8479, 0x848F, 0x848D, 0x8465, 0x8451,
+    0x8440, 0x8486, 0x8467, 0x8430, 0x844D, 0x847D, 0x845A, 0x8459,
+    0x8474, 0x8473, 0x845D, 0x8507, 0x845E, 0x8437, 0x843A, 0x8434,
+    0x847A, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83D9, 0x844B,
+    0x842F, 0x8442, 0x842D, 0x845F, 0x8470, 0x8439, 0x844E, 0x844C,
+    0x8452, 0x846F, 0x84C5, 0x848E, 0x843B, 0x8447, 0x8436, 0x8433,
+    0x8468, 0x847E, 0x8444, 0x842B, 0x8460, 0x8454, 0x846E, 0x8450,
+    0x870B, 0x8704, 0x86F7, 0x870C, 0x86FA, 0x86D6, 0x86F5, 0x874D,
+    0x86F8, 0x870E, 0x8709, 0x8701, 0x86F6, 0x870D, 0x8705, 0x88D6,
+    0x88CB, 0x88CD, 0x88CE, 0x88DE, 0x88DB, 0x88DA, 0x88CC, 0x88D0,
+    0x8985, 0x899B, 0x89DF, 0x89E5, 0x89E4, 0x89E1, 0x89E0, 0x89E2,
+    0x89DC, 0x89E6, 0x8A76, 0x8A86, 0x8A7F, 0x8A61, 0x8A3F, 0x8A77,
+    0x8A82, 0x8A84, 0x8A75, 0x8A83, 0x8A81, 0x8A74, 0x8A7A, 0x8C3C,
+    0x8C4B, 0x8C4A, 0x8C65, 0x8C64, 0x8C66, 0x8C86, 0x8C84, 0x8C85,
+    0x8CCC, 0x8D68, 0x8D69, 0x8D91, 0x8D8C, 0x8D8E, 0x8D8F, 0x8D8D,
+    0x8D93, 0x8D94, 0x8D90, 0x8D92, 0x8DF0, 0x8DE0, 0x8DEC, 0x8DF1,
+    0x8DEE, 0x8DD0, 0x8DE9, 0x8DE3, 0x8DE2, 0x8DE7, 0x8DF2, 0x8DEB,
+    0x8DF4, 0x8F06, 0x8EFF, 0x8F01, 0x8F00, 0x8F05, 0x8F07, 0x8F08,
+    0x8F02, 0x8F0B, 0x9052, 0x903F, 0x9044, 0x9049, 0x903D, 0x9110,
+    0x910D, 0x910F, 0x9111, 0x9116, 0x9114, 0x910B, 0x910E, 0x916E,
+    0x916F, 0x9248, 0x9252, 0x9230, 0x923A, 0x9266, 0x9233, 0x9265,
+    0x925E, 0x9283, 0x922E, 0x924A, 0x9246, 0x926D, 0x926C, 0x924F,
+    0x9260, 0x9267, 0x926F, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254,
+    0x9263, 0x9250, 0x9272, 0x924E, 0x9253, 0x924C, 0x9256, 0x9232,
+    0x959F, 0x959C, 0x959E, 0x959B, 0x9692, 0x9693, 0x9691, 0x9697,
+    0x96CE, 0x96FA, 0x96FD, 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778,
+    0x9772, 0x980F, 0x980D, 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF,
+    0x99B2, 0x99B0, 0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED,
+    0x9CE7, 0x9E80, 0x9EFD, 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3,
+    0x50DB, 0x50EA, 0x50DD, 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF,
+    0x50E3, 0x50E0, 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330,
+    0x53AC, 0x5627, 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C,
+    0x5601, 0x5613, 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9,
+    0x5889, 0x587C, 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874,
+    0x588B, 0x587A, 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888,
+    0x587B, 0x5894, 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5,
+    0x5AD5, 0x5AEA, 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0,
+    0x5ADB, 0x5AEC, 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77,
+    0x5BE0, 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A,
+    0x5D81, 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D,
+    0x5D79, 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7,
+    0x5ECE, 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43,
+    0x5F6F, 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173,
+    0x6152, 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A,
+    0x615B, 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227,
+    0x622B, 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472,
+    0x6473, 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E,
+    0x645C, 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C,
+    0x646B, 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0,
+    0x669F, 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9, 0x69A0,
+    0x69CE, 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, 0x698E,
+    0x69A7, 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, 0x69BD,
+    0x69A4, 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, 0x6993,
+    0x69AA, 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, 0x69B5,
+    0x69A5, 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, 0x6BA0,
+    0x6BC3, 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, 0x6F25,
+    0x6EF8, 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, 0x6F1A,
+    0x6F27, 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, 0x6F36, 0x6F73,
+    0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30, 0x6F3C, 0x6F35, 0x6EEB,
+    0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD, 0x6EF6, 0x6F39, 0x6F1C,
+    0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, 0x6F21, 0x7187,
+    0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718F, 0x717B, 0x7186,
+    0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343,
+    0x734D, 0x7351, 0x734C, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472,
+    0x7467, 0x746E, 0x7500, 0x7502, 0x7503, 0x757D, 0x7590, 0x7616,
+    0x7608, 0x760C, 0x7615, 0x7611, 0x760A, 0x7614, 0x76B8, 0x7781,
+    0x777C, 0x7785, 0x7782, 0x776E, 0x7780, 0x776F, 0x777E, 0x7783,
+    0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8, 0x787E, 0x78AB, 0x789E,
+    0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4, 0x7998, 0x798A, 0x798B,
+    0x7996, 0x7995, 0x7994, 0x7993, 0x7997, 0x7988, 0x7992, 0x7990,
+    0x7A2B, 0x7A4A, 0x7A30, 0x7A2F, 0x7A28, 0x7A26, 0x7AA8, 0x7AAB,
+    0x7AAC, 0x7AEE, 0x7B88, 0x7B9C, 0x7B8A, 0x7B91, 0x7B90, 0x7B96,
+    0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E, 0x7B85, 0x7B98, 0x5284, 0x7B99,
+    0x7BA4, 0x7B82, 0x7CBB, 0x7CBF, 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7,
+    0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1, 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE,
+    0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC, 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC,
+    0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2,
+    0x7FE3, 0x7FE5, 0x7FDE, 0x8024, 0x805D, 0x805C, 0x8189, 0x8186,
+    0x8183, 0x8187, 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4,
+    0x84A1, 0x849F, 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB,
+    0x84B9, 0x84B4, 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0,
+    0x849D, 0x84A7, 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B,
+    0x84A9, 0x84AF, 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0,
+    0x84D7, 0x84D4, 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733,
+    0x8723, 0x8728, 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719,
+    0x871B, 0x8743, 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732,
+    0x872A, 0x872D, 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742,
+    0x8726, 0x8727, 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7,
+    0x88E7, 0x88F1, 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6,
+    0x88FB, 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E,
+    0x89E9, 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F,
+    0x8A96, 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96,
+    0x8E09, 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07,
+    0x8E06, 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E,
+    0x8F0D, 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A,
+    0x9124, 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5,
+    0x92A4, 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D,
+    0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3, 0x92EE,
+    0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1, 0x928A,
+    0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9, 0x929D,
+    0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D, 0x977A,
+    0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, 0x9781, 0x977F,
+    0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900, 0x9907,
+    0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2, 0x99BD,
+    0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60, 0x9B61,
+    0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103, 0x5130,
+    0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C, 0x50FD,
+    0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642, 0x564C,
+    0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658, 0x565A, 0x5640,
+    0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A, 0x563A, 0x571A,
+    0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF, 0x58AC, 0x58A5,
+    0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, 0x5AF6, 0x5B03,
+    0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05, 0x5B0F, 0x5C67,
+    0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, 0x5D95, 0x5DA0,
+    0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, 0x5E60, 0x5E5C,
+    0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, 0x618B, 0x6183,
+    0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189, 0x619B, 0x6193, 0x61AF,
+    0x61AD, 0x619F, 0x6192, 0x61AA, 0x61A1, 0x618D, 0x6166, 0x61B3,
+    0x622D, 0x646E, 0x6470, 0x6496, 0x64A0, 0x6485, 0x6497, 0x649C,
+    0x648F, 0x648B, 0x648A, 0x648C, 0x64A3, 0x649F, 0x6468, 0x64B1,
+    0x6498, 0x6576, 0x657A, 0x6579, 0x657B, 0x65B2, 0x65B3, 0x66B5,
+    0x66B0, 0x66A9, 0x66B2, 0x66B7, 0x66AA, 0x66AF, 0x6A00, 0x6A06,
+    0x6A17, 0x69E5, 0x69F8, 0x6A15, 0x69F1, 0x69E4, 0x6A20, 0x69FF,
+    0x69EC, 0x69E2, 0x6A1B, 0x6A1D, 0x69FE, 0x6A27, 0x69F2, 0x69EE,
+    0x6A14, 0x69F7, 0x69E7, 0x6A40, 0x6A08, 0x69E6, 0x69FB, 0x6A0D,
+    0x69FC, 0x69EB, 0x6A09, 0x6A04, 0x6A18, 0x6A25, 0x6A0F, 0x69F6,
+    0x6A26, 0x6A07, 0x69F4, 0x6A16, 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2,
+    0x6BA6, 0x6C01, 0x6C00, 0x6BFF, 0x6C02, 0x6F41, 0x6F26, 0x6F7E,
+    0x6F87, 0x6FC6, 0x6F92, 0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F,
+    0x6F85, 0x6F5A, 0x6F96, 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72,
+    0x6F52, 0x6F50, 0x6F57, 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61,
+    0x6F6B, 0x6F7D, 0x6F67, 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F,
+    0x6F95, 0x6F63, 0x6F77, 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B,
+    0x71B0, 0x71A0, 0x719A, 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E,
+    0x71A4, 0x71A1, 0x71AA, 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A,
+    0x7358, 0x7352, 0x735E, 0x735F, 0x7360, 0x735D, 0x735B, 0x7361,
+    0x735A, 0x7359, 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481,
+    0x747D, 0x7485, 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E,
+    0x7625, 0x761E, 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628,
+    0x761B, 0x769C, 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789,
+    0x7788, 0x78CD, 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4,
+    0x78C8, 0x78C3, 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C,
+    0x79A2, 0x799B, 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7,
+    0x7BCB, 0x7BBE, 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5,
+    0x7CC5, 0x7CC8, 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7,
+    0x7DD7, 0x7DE1, 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0,
+    0x7DEE, 0x7DDF, 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB,
+    0x7FEA, 0x7FEC, 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F,
+    0x819E, 0x8195, 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253,
+    0x8252, 0x8250, 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500,
+    0x8529, 0x850E, 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C,
+    0x84FB, 0x852B, 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2,
+    0x8515, 0x84F7, 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9,
+    0x8516, 0x84FE, 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E,
+    0x84F6, 0x8531, 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9,
+    0x8518, 0x8520, 0x8530, 0x850B, 0x8519, 0x852F, 0x8662, 0x8756,
+    0x8763, 0x8764, 0x8777, 0x87E1, 0x8773, 0x8758, 0x8754, 0x875B,
+    0x8752, 0x8761, 0x875A, 0x8751, 0x875E, 0x876D, 0x876A, 0x8750,
+    0x874E, 0x875F, 0x875D, 0x876F, 0x876C, 0x877A, 0x876E, 0x875C,
+    0x8765, 0x874F, 0x877B, 0x8775, 0x8762, 0x8767, 0x8769, 0x885A,
+    0x8905, 0x890C, 0x8914, 0x890B, 0x8917, 0x8918, 0x8919, 0x8906,
+    0x8916, 0x8911, 0x890E, 0x8909, 0x89A2, 0x89A4, 0x89A3, 0x89ED,
+    0x89F0, 0x89EC, 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, 0x8AD1, 0x8AD4,
+    0x8AD5, 0x8ABB, 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, 0x8AD8, 0x8AC3,
+    0x8ABA, 0x8ABD, 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, 0x8CE5, 0x8CDF,
+    0x8CD9, 0x8CE8, 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, 0x8D9C, 0x8DA1,
+    0x8D9B, 0x8E20, 0x8E23, 0x8E25, 0x8E24, 0x8E2E, 0x8E15, 0x8E1B,
+    0x8E16, 0x8E11, 0x8E19, 0x8E26, 0x8E27, 0x8E14, 0x8E12, 0x8E18,
+    0x8E13, 0x8E1C, 0x8E17, 0x8E1A, 0x8F2C, 0x8F24, 0x8F18, 0x8F1A,
+    0x8F20, 0x8F23, 0x8F16, 0x8F17, 0x9073, 0x9070, 0x906F, 0x9067,
+    0x906B, 0x912F, 0x912B, 0x9129, 0x912A, 0x9132, 0x9126, 0x912E,
+    0x9185, 0x9186, 0x918A, 0x9181, 0x9182, 0x9184, 0x9180, 0x92D0,
+    0x92C3, 0x92C4, 0x92C0, 0x92D9, 0x92B6, 0x92CF, 0x92F1, 0x92DF,
+    0x92D8, 0x92E9, 0x92D7, 0x92DD, 0x92CC, 0x92EF, 0x92C2, 0x92E8,
+    0x92CA, 0x92C8, 0x92CE, 0x92E6, 0x92CD, 0x92D5, 0x92C9, 0x92E0,
+    0x92DE, 0x92E7, 0x92D1, 0x92D3, 0x92B5, 0x92E1, 0x9325, 0x92C6,
+    0x92B4, 0x957C, 0x95AC, 0x95AB, 0x95AE, 0x95B0, 0x96A4, 0x96A2,
+    0x96D3, 0x9705, 0x9708, 0x9702, 0x975A, 0x978A, 0x978E, 0x9788,
+    0x97D0, 0x97CF, 0x981E, 0x981D, 0x9826, 0x9829, 0x9828, 0x9820,
+    0x981B, 0x9827, 0x98B2, 0x9908, 0x98FA, 0x9911, 0x9914, 0x9916,
+    0x9917, 0x9915, 0x99DC, 0x99CD, 0x99CF, 0x99D3, 0x99D4, 0x99CE,
+    0x99C9, 0x99D6, 0x99D8, 0x99CB, 0x99D7, 0x99CC, 0x9AB3, 0x9AEC,
+    0x9AEB, 0x9AF3, 0x9AF2, 0x9AF1, 0x9B46, 0x9B43, 0x9B67, 0x9B74,
+    0x9B71, 0x9B66, 0x9B76, 0x9B75, 0x9B70, 0x9B68, 0x9B64, 0x9B6C,
+    0x9CFC, 0x9CFA, 0x9CFD, 0x9CFF, 0x9CF7, 0x9D07, 0x9D00, 0x9CF9,
+    0x9CFB, 0x9D08, 0x9D05, 0x9D04, 0x9E83, 0x9ED3, 0x9F0F, 0x9F10,
+    0x511C, 0x5113, 0x5117, 0x511A, 0x5111, 0x51DE, 0x5334, 0x53E1,
+    0x5670, 0x5660, 0x566E, 0x5673, 0x5666, 0x5663, 0x566D, 0x5672,
+    0x565E, 0x5677, 0x571C, 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF,
+    0x58BA, 0x58C2, 0x58BC, 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21,
+    0x5B14, 0x5B13, 0x5B10, 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E,
+    0x5BEF, 0x5DAC, 0x5DB1, 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE,
+    0x5DAA, 0x5DA8, 0x5DB2, 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68,
+    0x5E66, 0x5E6F, 0x5EE9, 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B,
+    0x5FBC, 0x5FBB, 0x619D, 0x61A8, 0x6196, 0x61C5, 0x61B4, 0x61C6,
+    0x61C1, 0x61CC, 0x61BA, 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6,
+    0x64D0, 0x64CF, 0x64C9, 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3,
+    0x64D9, 0x6533, 0x657F, 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0,
+    0x66CA, 0x66CB, 0x66CF, 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723,
+    0x6A34, 0x6A66, 0x6A49, 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D,
+    0x6A6D, 0x6A76, 0x6A5B, 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F,
+    0x6A41, 0x6A6A, 0x6A64, 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69,
+    0x6A60, 0x6A3C, 0x6A5E, 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46,
+    0x6B55, 0x6B54, 0x6B56, 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7,
+    0x6C04, 0x6C03, 0x6C06, 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC,
+    0x6FCE, 0x6FC8, 0x6F5E, 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8,
+    0x7004, 0x6FA5, 0x6FAE, 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF,
+    0x6FB8, 0x6FA2, 0x6FC9, 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0,
+    0x71C5, 0x71C2, 0x71BF, 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB,
+    0x71D4, 0x71CA, 0x71C7, 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6,
+    0x71DA, 0x71DB, 0x729D, 0x729E, 0x7369, 0x7366, 0x7367, 0x736C,
+    0x7365, 0x736B, 0x736A, 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492,
+    0x7495, 0x74A1, 0x750B, 0x7580, 0x762F, 0x762D, 0x7631, 0x763D,
+    0x7633, 0x763C, 0x7635, 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A,
+    0x779D, 0x77A1, 0x779C, 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799,
+    0x7797, 0x78DD, 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3, 0x78DB,
+    0x78E1, 0x78E2, 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44, 0x7A48,
+    0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3,
+    0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4,
+    0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2, 0x7CD4,
+    0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C, 0x7E1F,
+    0x7E20, 0x7E13, 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22, 0x7E0B,
+    0x7E0F, 0x7E16, 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43, 0x7F7B,
+    0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C, 0x81B1,
+    0x81A6, 0x81AE, 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC, 0x81B4,
+    0x81B2, 0x81B7, 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257, 0x8556,
+    0x8545, 0x856B, 0x854D, 0x8553, 0x8561, 0x8558, 0x8540, 0x8546,
+    0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853E,
+    0x855B, 0x8571, 0x854E, 0x856E, 0x8575, 0x8555, 0x8567, 0x8560,
+    0x858C, 0x8566, 0x855D, 0x8554, 0x8565, 0x856C, 0x8663, 0x8665,
+    0x8664, 0x87A4, 0x879B, 0x878F, 0x8797, 0x8793, 0x8792, 0x8788,
+    0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87A3, 0x8785, 0x8790,
+    0x8791, 0x879D, 0x8784, 0x8794, 0x879C, 0x879A, 0x8789, 0x891E,
+    0x8926, 0x8930, 0x892D, 0x892E, 0x8927, 0x8931, 0x8922, 0x8929,
+    0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, 0x8AE0, 0x8AE2, 0x8AF2,
+    0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, 0x8ADF, 0x8AF0, 0x8AC8,
+    0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, 0x8AFB, 0x8C91, 0x8C92,
+    0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, 0x8CF3, 0x8D6C, 0x8D6E,
+    0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38, 0x8E40, 0x8E45, 0x8E36,
+    0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F, 0x8EBD, 0x8F36, 0x8F2E,
+    0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34, 0x9076, 0x9079, 0x907B,
+    0x9086, 0x90FA, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191,
+    0x918D, 0x918F, 0x9327, 0x931E, 0x9308, 0x931F, 0x9306, 0x930F,
+    0x937A, 0x9338, 0x933C, 0x931B, 0x9323, 0x9312, 0x9301, 0x9346,
+    0x932D, 0x930E, 0x930D, 0x92CB, 0x931D, 0x92FA, 0x9313, 0x92F9,
+    0x92F7, 0x9334, 0x9302, 0x9324, 0x92FF, 0x9329, 0x9339, 0x9335,
+    0x932A, 0x9314, 0x930C, 0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB,
+    0x9316, 0x95BC, 0x95CD, 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF,
+    0x95B5, 0x95BD, 0x96A9, 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799,
+    0x9797, 0x9794, 0x97F0, 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924,
+    0x991F, 0x9927, 0x9929, 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4,
+    0x99F0, 0x99E3, 0x99EA, 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4,
+    0x9ABB, 0x9AF6, 0x9AFA, 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85,
+    0x9B87, 0x9B7C, 0x9B7E, 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90,
+    0x9B7A, 0x9B95, 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E,
+    0x9D14, 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F,
+    0x9E88, 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA,
+    0x9F12, 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129,
+    0x52F4, 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E,
+    0x5682, 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D,
+    0x5B25, 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E,
+    0x5B7B, 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x61C3,
+    0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE,
+    0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580,
+    0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89,
+    0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E, 0x6A95,
+    0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, 0x6A85,
+    0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, 0x6FF4,
+    0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, 0x6FF2,
+    0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2, 0x71E4,
+    0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2, 0x74AB,
+    0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510, 0x7511,
+    0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, 0x76A4,
+    0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6, 0x77B4, 0x77B1,
+    0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902, 0x78FB, 0x78FC, 0x78FF,
+    0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB, 0x79A8, 0x7A5C,
+    0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE, 0x7AC0, 0x7AC1,
+    0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB, 0x7C0E, 0x7BF4,
+    0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01, 0x7BF8, 0x7BFD,
+    0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8, 0x7E2D, 0x7E3C,
+    0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49, 0x7E40, 0x7E47,
+    0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44, 0x7E3A, 0x7F45,
+    0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C, 0x81BB, 0x81C4,
+    0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9, 0x825B, 0x825A,
+    0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595, 0x85A0, 0x858B,
+    0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E, 0x8577, 0x857C, 0x8589,
+    0x85A1, 0x857A, 0x8578, 0x8557, 0x858E, 0x8596, 0x8586, 0x858D,
+    0x8599, 0x859D, 0x8581, 0x85A2, 0x8582, 0x8588, 0x8585, 0x8579,
+    0x8576, 0x8598, 0x8590, 0x859F, 0x8668, 0x87BE, 0x87AA, 0x87AD,
+    0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5, 0x87BC, 0x87AE, 0x87C9,
+    0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF, 0x87C4, 0x87CA, 0x87B4,
+    0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE, 0x87B2, 0x8935, 0x8933,
+    0x893C, 0x893E, 0x8941, 0x8952, 0x8937, 0x8942, 0x89AD, 0x89AF,
+    0x89AE, 0x89F2, 0x89F3, 0x8B1E, 0x8B18, 0x8B16, 0x8B11, 0x8B05,
+    0x8B0B, 0x8B22, 0x8B0F, 0x8B12, 0x8B15, 0x8B07, 0x8B0D, 0x8B08,
+    0x8B06, 0x8B1C, 0x8B13, 0x8B1A, 0x8C4F, 0x8C70, 0x8C72, 0x8C71,
+    0x8C6F, 0x8C95, 0x8C94, 0x8CF9, 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53,
+    0x8E50, 0x8E4C, 0x8E47, 0x8F43, 0x8F40, 0x9085, 0x907E, 0x9138,
+    0x919A, 0x91A2, 0x919B, 0x9199, 0x919F, 0x91A1, 0x919D, 0x91A0,
+    0x93A1, 0x9383, 0x93AF, 0x9364, 0x9356, 0x9347, 0x937C, 0x9358,
+    0x935C, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936D, 0x938F,
+    0x934C, 0x936A, 0x9379, 0x9357, 0x9355, 0x9352, 0x934F, 0x9371,
+    0x9377, 0x937B, 0x9361, 0x935E, 0x9363, 0x9367, 0x934E, 0x9359,
+    0x95C7, 0x95C0, 0x95C9, 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0,
+    0x96AC, 0x9720, 0x971F, 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1,
+    0x979C, 0x979E, 0x979D, 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844,
+    0x984A, 0x9849, 0x9845, 0x9843, 0x9925, 0x992B, 0x992C, 0x992A,
+    0x9933, 0x9932, 0x992F, 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3,
+    0x99A1, 0x9A02, 0x99FA, 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6,
+    0x99FB, 0x99FD, 0x99FE, 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD,
+    0x9B01, 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6,
+    0x9BA1, 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33,
+    0x9D41, 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30,
+    0x9D45, 0x9D42, 0x9D43, 0x9D3E, 0x9D37, 0x9D40, 0x9D3D, 0x7FF5,
+    0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, 0x9EFB,
+    0x9EFF, 0x9F24, 0x9F23, 0x9F22, 0x9F54, 0x9FA0, 0x5131, 0x512D,
+    0x512E, 0x5698, 0x569C, 0x5697, 0x569A, 0x569D, 0x5699, 0x5970,
+    0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, 0x61DF,
+    0x61ED, 0x61EE, 0x61F1, 0x61EA, 0x61F0, 0x61EB, 0x61D6, 0x61E9,
+    0x64FF, 0x6504, 0x64FD, 0x64F8, 0x6501, 0x6503, 0x64FC, 0x6594,
+    0x65DB, 0x66DA, 0x66DB, 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, 0x6AE1,
+    0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, 0x6B5E,
+    0x6BC9, 0x6C0B, 0x7007, 0x700C, 0x700D, 0x7001, 0x7005, 0x7014,
+    0x700E, 0x6FFF, 0x7000, 0x6FFB, 0x7026, 0x6FFC, 0x6FF7, 0x700A,
+    0x7201, 0x71FF, 0x71F9, 0x7203, 0x71FD, 0x7376, 0x74B8, 0x74C0,
+    0x74B5, 0x74C1, 0x74BE, 0x74B6, 0x74BB, 0x74C2, 0x7514, 0x7513,
+    0x765C, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765A, 0x76A6,
+    0x76BD, 0x76EC, 0x77C2, 0x77BA, 0x790C, 0x7913, 0x7914, 0x7909,
+    0x7910, 0x7912, 0x7911, 0x79AD, 0x79AC, 0x7A5F, 0x7C1C, 0x7C29,
+    0x7C19, 0x7C20, 0x7C1F, 0x7C2D, 0x7C1D, 0x7C26, 0x7C28, 0x7C22,
+    0x7C25, 0x7C30, 0x7E5C, 0x7E50, 0x7E56, 0x7E63, 0x7E58, 0x7E62,
+    0x7E5F, 0x7E51, 0x7E60, 0x7E57, 0x7E53, 0x7FB5, 0x7FB3, 0x7FF7,
+    0x7FF8, 0x8075, 0x81D1, 0x81D2, 0x81D0, 0x825F, 0x825E, 0x85B4,
+    0x85C6, 0x85C0, 0x85C3, 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7,
+    0x85C4, 0x85BF, 0x85CB, 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6,
+    0x85D2, 0x8624, 0x85B8, 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6,
+    0x87E2, 0x87DB, 0x87EB, 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4,
+    0x87D4, 0x87DC, 0x87D3, 0x87ED, 0x87D8, 0x87E3, 0x87D7, 0x87D9,
+    0x8801, 0x87F4, 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C,
+    0x8946, 0x8950, 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33,
+    0x8B30, 0x8B35, 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25,
+    0x8B37, 0x8B26, 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A,
+    0x8C42, 0x8C75, 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02,
+    0x8D00, 0x8E5C, 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65,
+    0x8E67, 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46,
+    0x8F47, 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8,
+    0x91A5, 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7,
+    0x939B, 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6,
+    0x9395, 0x9388, 0x9399, 0x939F, 0x9380, 0x938D, 0x93B1, 0x9391,
+    0x93B2, 0x93A4, 0x93A8, 0x93B4, 0x93A3, 0x95D2, 0x95D3, 0x95D1,
+    0x96B3, 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723,
+    0x9722, 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA,
+    0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, 0x9850,
+    0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, 0x9A0B,
+    0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, 0x9A06,
+    0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, 0x9B4A,
+    0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, 0x9BB5,
+    0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, 0x9D53,
+    0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, 0x9D57,
+    0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, 0x9EDF,
+    0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, 0x9F28,
+    0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, 0x56AB,
+    0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, 0x58DB,
+    0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70, 0x5FBF, 0x61FB,
+    0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, 0x6584, 0x65DE,
+    0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, 0x6AD9, 0x6ACB,
+    0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, 0x6ADE, 0x6B60,
+    0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, 0x702B, 0x7021,
+    0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, 0x720C, 0x720A,
+    0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, 0x72A4, 0x72A3, 0x72A1,
+    0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, 0x7660, 0x77C9, 0x77CA,
+    0x77C4, 0x77F1, 0x791D, 0x791B, 0x7921, 0x791C, 0x7917, 0x791E,
+    0x79B0, 0x7A67, 0x7A68, 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B,
+    0x7CEC, 0x7CEA, 0x7E76, 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F,
+    0x7E7A, 0x7E72, 0x7E74, 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86,
+    0x7FB7, 0x7FFD, 0x7FFE, 0x8078, 0x81D7, 0x81D5, 0x820B, 0x8264,
+    0x8261, 0x8263, 0x85EB, 0x85F1, 0x85ED, 0x85D9, 0x85E1, 0x85E8,
+    0x85DA, 0x85D7, 0x85EC, 0x85F2, 0x85F8, 0x85D8, 0x85DF, 0x85E3,
+    0x85DC, 0x85D1, 0x85F0, 0x85E6, 0x85EF, 0x85DE, 0x85E2, 0x8800,
+    0x87FA, 0x8803, 0x87F6, 0x87F7, 0x8809, 0x880C, 0x880B, 0x8806,
+    0x87FC, 0x8808, 0x87FF, 0x880A, 0x8802, 0x8962, 0x895A, 0x895B,
+    0x8957, 0x8961, 0x895C, 0x8958, 0x895D, 0x8959, 0x8988, 0x89B7,
+    0x89B6, 0x89F6, 0x8B50, 0x8B48, 0x8B4A, 0x8B40, 0x8B53, 0x8B56,
+    0x8B54, 0x8B4B, 0x8B55, 0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43,
+    0x8C77, 0x8C76, 0x8C9A, 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA,
+    0x8DAD, 0x8DAB, 0x8E6D, 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B,
+    0x8EC2, 0x8F52, 0x8F51, 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140,
+    0x913F, 0x91B0, 0x91AD, 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA,
+    0x93D0, 0x93F9, 0x93EC, 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA,
+    0x93D4, 0x93EE, 0x93E3, 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2,
+    0x93A5, 0x93E7, 0x957D, 0x95DA, 0x95DB, 0x96E1, 0x9729, 0x972B,
+    0x972C, 0x9728, 0x9726, 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE,
+    0x97DF, 0x985C, 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB,
+    0x98BE, 0x9948, 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15,
+    0x9A25, 0x9A1D, 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23,
+    0x9A1E, 0x9A1C, 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C,
+    0x9B37, 0x9BEA, 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2,
+    0x9BF0, 0x9BD4, 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5,
+    0x9BE1, 0x9BDA, 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71,
+    0x9D80, 0x9D78, 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74,
+    0x9D75, 0x9D70, 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F,
+    0x9D79, 0x9D7F, 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC,
+    0x9F2D, 0x9F40, 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337,
+    0x56B2, 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE,
+    0x5EEF, 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513,
+    0x65DF, 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8,
+    0x6AF9, 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037,
+    0x7034, 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x702A,
+    0x7040, 0x703B, 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D,
+    0x737C, 0x74BA, 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE,
+    0x77CF, 0x77CD, 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924,
+    0x7929, 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48,
+    0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80,
+    0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x8268, 0x8269, 0x8622,
+    0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604, 0x8609,
+    0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813,
+    0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A, 0x8B5D,
+    0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86, 0x8E88,
+    0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A, 0x908D,
+    0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B, 0x9413,
+    0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410, 0x9428,
+    0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E, 0x9416,
+    0x9412, 0x93FA, 0x9409, 0x93F8, 0x943C, 0x940A, 0x93FF, 0x93FC,
+    0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF, 0x972E,
+    0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862, 0x9863,
+    0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C, 0x994B,
+    0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, 0x9A29,
+    0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, 0x9B12,
+    0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, 0x9C40,
+    0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F, 0x9D99,
+    0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, 0x9DA0, 0x9D94,
+    0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A, 0x9DA2, 0x9DA8, 0x9D9E,
+    0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6, 0x9DA7, 0x9E99, 0x9E9B,
+    0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6, 0x9F30, 0x9F2E, 0x9F5B,
+    0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91, 0x513A, 0x5139, 0x5298,
+    0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48, 0x5B47, 0x5DCB, 0x5DCF,
+    0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC, 0x6B03, 0x6AF8, 0x6B00,
+    0x7043, 0x7044, 0x704A, 0x7048, 0x7049, 0x7045, 0x7046, 0x721D,
+    0x721A, 0x7219, 0x737E, 0x7517, 0x766A, 0x77D0, 0x792D, 0x7931,
+    0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A, 0x7E87, 0x7E88, 0x7E8B,
+    0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030, 0x81DD, 0x8618, 0x862A,
+    0x8626, 0x861F, 0x8623, 0x861C, 0x8619, 0x8627, 0x862E, 0x8621,
+    0x8620, 0x8629, 0x861E, 0x8625, 0x8829, 0x881D, 0x881B, 0x8820,
+    0x8824, 0x881C, 0x882B, 0x884A, 0x896D, 0x8969, 0x896E, 0x896B,
+    0x89FA, 0x8B79, 0x8B78, 0x8B45, 0x8B7A, 0x8B7B, 0x8D10, 0x8D14,
+    0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E, 0x8F5B, 0x8F5D, 0x9146, 0x9144,
+    0x9145, 0x91B9, 0x943F, 0x943B, 0x9436, 0x9429, 0x943D, 0x9430,
+    0x9439, 0x942A, 0x9437, 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4,
+    0x95E3, 0x9735, 0x973A, 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6,
+    0x98C0, 0x9958, 0x9956, 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42,
+    0x9A41, 0x9A3A, 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16,
+    0x9B3A, 0x9B52, 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28,
+    0x9C29, 0x9C24, 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7,
+    0x9DCA, 0x9DCF, 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE,
+    0x9DB9, 0x9DBA, 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3,
+    0x9DCD, 0x9DB2, 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B,
+    0x9F18, 0x9F1A, 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9,
+    0x56C6, 0x56C5, 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1,
+    0x5EF2, 0x6521, 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09,
+    0x6C0D, 0x7055, 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9,
+    0x737F, 0x74D8, 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935,
+    0x79B4, 0x7A70, 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A,
+    0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634,
+    0x8635, 0x8633, 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826,
+    0x882A, 0x8825, 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84,
+    0x8B82, 0x8B86, 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A,
+    0x8E92, 0x8E90, 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C,
+    0x9450, 0x944A, 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449,
+    0x9446, 0x973F, 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B,
+    0x9A4E, 0x9A53, 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, 0x9A49,
+    0x9A52, 0x9A50, 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, 0x9B56, 0x9B55,
+    0x9C46, 0x9C48, 0x9C3F, 0x9C44, 0x9C39, 0x9C33, 0x9C41, 0x9C3C,
+    0x9C37, 0x9C34, 0x9C32, 0x9C3D, 0x9C36, 0x9DDB, 0x9DD2, 0x9DDE,
+    0x9DDA, 0x9DCB, 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, 0x9DE9, 0x9DD9,
+    0x9DD8, 0x9DD6, 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, 0x9EF0, 0x9F35,
+    0x9F33, 0x9F32, 0x9F42, 0x9F6B, 0x9F95, 0x9FA2, 0x513D, 0x5299,
+    0x58E8, 0x58E7, 0x5972, 0x5B4D, 0x5DD8, 0x882F, 0x5F4F, 0x6201,
+    0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66EB, 0x6B11, 0x6B12,
+    0x6B0F, 0x6BCA, 0x705B, 0x705A, 0x7222, 0x7382, 0x7381, 0x7383,
+    0x7670, 0x77D4, 0x7C67, 0x7C66, 0x7E95, 0x826C, 0x863A, 0x8640,
+    0x8639, 0x863C, 0x8631, 0x863B, 0x863E, 0x8830, 0x8832, 0x882E,
+    0x8833, 0x8976, 0x8974, 0x8973, 0x89FE, 0x8B8C, 0x8B8E, 0x8B8B,
+    0x8B88, 0x8C45, 0x8D19, 0x8E98, 0x8F64, 0x8F63, 0x91BC, 0x9462,
+    0x9455, 0x945D, 0x9457, 0x945E, 0x97C4, 0x97C5, 0x9800, 0x9A56,
+    0x9A59, 0x9B1E, 0x9B1F, 0x9B20, 0x9C52, 0x9C58, 0x9C50, 0x9C4A,
+    0x9C4D, 0x9C4B, 0x9C55, 0x9C59, 0x9C4C, 0x9C4E, 0x9DFB, 0x9DF7,
+    0x9DEF, 0x9DE3, 0x9DEB, 0x9DF8, 0x9DE4, 0x9DF6, 0x9DE1, 0x9DEE,
+    0x9DE6, 0x9DF2, 0x9DF0, 0x9DE2, 0x9DEC, 0x9DF4, 0x9DF3, 0x9DE8,
+    0x9DED, 0x9EC2, 0x9ED0, 0x9EF2, 0x9EF3, 0x9F06, 0x9F1C, 0x9F38,
+    0x9F37, 0x9F36, 0x9F43, 0x9F4F, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F,
+    0x56D3, 0x56CD, 0x5B4E, 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13,
+    0x705F, 0x7061, 0x705D, 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5,
+    0x7938, 0x79B7, 0x79B6, 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643,
+    0x8838, 0x8837, 0x8835, 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F,
+    0x8EA0, 0x8E9D, 0x91BE, 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469,
+    0x96E5, 0x9746, 0x9743, 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5,
+    0x9B59, 0x9C63, 0x9C67, 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02,
+    0x9DFE, 0x9E07, 0x9E03, 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09,
+    0x9DFF, 0x9DFD, 0x9E04, 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75,
+    0x9F76, 0x56D4, 0x652E, 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A,
+    0x7062, 0x7226, 0x72AA, 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B,
+    0x7CF6, 0x7E9A, 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646,
+    0x8647, 0x8648, 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98,
+    0x8B99, 0x8EA5, 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471,
+    0x9473, 0x9749, 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B,
+    0x9E0D, 0x9E10, 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09,
+    0x9F47, 0x9F78, 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F,
+    0x883C, 0x8DB2, 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475,
+    0x9A60, 0x9B2E, 0x9C74, 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13,
+    0x9EF6, 0x9F0A, 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E,
+    0x883D, 0x883F, 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873,
+    0x9874, 0x98CC, 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24,
+    0x9E15, 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8,
+    0x9482, 0x9480, 0x9481, 0x9A69, 0x9A68, 0x9E19, 0x864B, 0x8B9F,
+    0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, 0x7069,
+    0x706A, 0x7229, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0xFE19, 0x223C,
+    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+    0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+    0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+    0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0xFE33,
+    0x2574, 0xFE34, 0xFE4F, 0x0308, 0xFF3E, 0x30FD, 0x30FE, 0x309D,
+    0x309E, 0xFFFD, 0x3005, 0x3006, 0x3007, 0x30FC, 0xFF3B, 0xFF3D,
+    0x273D, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047,
+    0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F,
+    0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,
+    0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,
+    0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,
+    0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+    0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,
+    0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,
+    0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,
+    0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,
+    0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, 0x30A3, 0x30A4,
+    0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC,
+    0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4,
+    0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC,
+    0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4,
+    0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC,
+    0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4,
+    0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC,
+    0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4,
+    0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,
+    0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4,
+    0x30F5, 0x30F6, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415,
+    0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C,
+    0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424,
+    0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C,
+    0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434,
+    0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B,
+    0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443,
+    0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B,
+    0x044C, 0x044D, 0x044E, 0x044F, 0x21E7, 0x21B8, 0x21B9, 0x4E41,
+    0x0000, 0x4E5A, 0x0000, 0x5202, 0x4491, 0x9FB0, 0x5188, 0x9FB1,
+    0x0000, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+    0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+    0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+    0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+    0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+    0xFFFD, 0x00AC, 0xFFE4, 0xFF07, 0xFF02, 0x3231, 0x2116, 0x2121,
+    0x7881, 0x92B9, 0x88CF, 0x58BB, 0x6052, 0x7CA7, 0x5AFA, 0x2554,
+    0x2566, 0x2557, 0x2560, 0x256C, 0x2563, 0x255A, 0x2569, 0x255D,
+    0x2552, 0x2564, 0x2555, 0xFFFD, 0xFFFD, 0xFFFD, 0x2558, 0x2567,
+    0x255B, 0x2553, 0x2565, 0x2556, 0x255F, 0x256B, 0x2562, 0x2559,
+    0x2568, 0x255C, 0x2551, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+    0x2593, 0xFFFD, 0xFFFD, 0xFE10, 0xFE11, 0xFE12, 0xFFFD, 0xFE14,
+    0xFE13, 0xFE16, 0xFE15, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+    0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+    0xFFFD, 0xFFFD, 0xFFFD, 0x0000, 0x57BE, 0x0000, 0x713E, 0x0000,
+    0x69A2, 0x0000, 0x5B74, 0x7A49, 0x0000, 0x0000, 0x7A65, 0x7A7D,
+    0x0000, 0x7ABB, 0x7AB0, 0x7AC2, 0x7AC3, 0x71D1, 0x0000, 0x41CA,
+    0x7ADA, 0x7ADD, 0x7AEA, 0x41EF, 0x54B2, 0x0000, 0x7B0B, 0x7B55,
+    0x7B29, 0x0000, 0x0000, 0x7BA2, 0x7B6F, 0x839C, 0x0000, 0x0000,
+    0x7BD0, 0x8421, 0x7B92, 0xFFFD, 0x0000, 0xFFFD, 0x8492, 0x7BFA,
+    0xFFFD, 0x7C35, 0x0000, 0x7C44, 0x7C83, 0x0000, 0x7CA6, 0x0000,
+    0x7CC9, 0x7CC7, 0x7CE6, 0xFFFD, 0x7CF3, 0x7CF5, 0x7E67, 0x451D,
+    0x0000, 0x7D5D, 0x0000, 0x7D89, 0x7DAB, 0x7135, 0x7DB3, 0x7DD6,
+    0x0000, 0x0000, 0x7DE4, 0x3D13, 0x7DF5, 0x0000, 0x7DE5, 0x0000,
+    0xFFFD, 0x0000, 0x0000, 0x7E6E, 0xFFFD, 0x432B, 0x946C, 0x7E27,
+    0x7F40, 0x7F41, 0x7F47, 0x7936, 0x0000, 0x99E1, 0x7F97, 0x0000,
+    0x7FA3, 0x0000, 0x0000, 0x455C, 0x0000, 0x0000, 0x7FFA, 0x0000,
+    0xFA5B, 0x8008, 0x801D, 0xFFFD, 0x802F, 0x0000, 0x0000, 0x803B,
+    0x803C, 0x8061, 0x0000, 0x4989, 0x0000, 0x0000, 0x0000, 0x6725,
+    0x80A7, 0x0000, 0x8107, 0x811A, 0x58B0, 0x0000, 0x6C7F, 0x0000,
+    0x64E7, 0x0000, 0x8218, 0x0000, 0x6A53, 0x0000, 0x0000, 0x447A,
+    0x8229, 0x0000, 0x0000, 0x4FF9, 0x0000, 0x84E2, 0x8362, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x82AA, 0x691B, 0x0000, 0x41DB,
+    0x854B, 0x82D0, 0x831A, 0x0000, 0x0000, 0x36C1, 0x0000, 0x0000,
+    0x827B, 0x82E2, 0x8318, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x3DBF, 0x831D, 0x55EC, 0x8385, 0x450B, 0x0000, 0x83AC, 0xFFFD,
+    0x83D3, 0x0000, 0x6A57, 0x855A, 0x3496, 0x0000, 0x8458, 0x0000,
+    0x8471, 0x3DD3, 0x44E4, 0x6AA7, 0x844A, 0x7958, 0xFFFD, 0x0000,
+    0x0000, 0x0000, 0x84DE, 0xFFFD, 0x8391, 0x44A0, 0x8493, 0x84E4,
+    0x0000, 0x4240, 0x0000, 0x4543, 0x8534, 0x5AF2, 0x4523, 0x4527,
+    0x8573, 0x4516, 0x67BF, 0x8616, 0x0000, 0x0000, 0x85C1, 0x0000,
+    0x8602, 0x0000, 0x0000, 0x0000, 0x456A, 0x8628, 0x3648, 0x0000,
+    0x53F7, 0x0000, 0x867E, 0xFFFD, 0x0000, 0x87EE, 0x0000, 0x87B1,
+    0x87DA, 0x880F, 0x5661, 0x866C, 0x6856, 0x460F, 0x8845, 0x8846,
+    0x0000, 0x0000, 0x0000, 0x885E, 0x889C, 0x465B, 0x88B4, 0x88B5,
+    0x88C5, 0x0000, 0x8987, 0xFFFD, 0xFFFD, 0xFFFD, 0x89A7, 0x89BC,
+    0x0000, 0x89E7, 0x0000, 0x0000, 0x8A9C, 0x7793, 0x91FE, 0x8A90,
+    0x0000, 0x7AE9, 0x0000, 0x4713, 0x0000, 0x717C, 0x8B0C, 0x8B1F,
+    0x0000, 0x0000, 0x8B3F, 0xFFFD, 0x8B4D, 0x8AA9, 0x0000, 0x8B90,
+    0x8B9B, 0x8AAF, 0x0000, 0x4615, 0x884F, 0x8C9B, 0x0000, 0x0000,
+    0x0000, 0x3725, 0x0000, 0x8CD6, 0x0000, 0x0000, 0x8D12, 0x8D03,
+    0x0000, 0x8CDB, 0x705C, 0x8D11, 0x3ED0, 0x0000, 0x8DA9, 0x0000,
+    0x0000, 0x0000, 0x3B7C, 0x0000, 0x0000, 0x7AE7, 0x8EAD, 0x8EB6,
+    0x8EC3, 0x92D4, 0x8F19, 0x8F2D, 0x0000, 0x0000, 0x8FA5, 0x9303,
+    0x0000, 0x0000, 0x8FB3, 0xFFFD, 0x0000, 0x0000, 0x0000, 0x5EF8,
+    0x0000, 0x8FF9, 0xFFFD, 0x0000, 0x3980, 0x0000, 0x9037, 0x0000,
+    0x0000, 0x9061, 0x0000, 0x0000, 0x90A8, 0x0000, 0x90C4, 0x0000,
+    0x90AE, 0xFA26, 0x9167, 0x91A9, 0x91C4, 0x7CAC, 0x0000, 0x0000,
+    0x920E, 0x6C9F, 0x9241, 0x9262, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x932C, 0x936B, 0x0000, 0x0000, 0x5AC3, 0x0000,
+    0x0000, 0x4965, 0x9244, 0x0000, 0x0000, 0x0000, 0x9373, 0x945B,
+    0x8EBC, 0x9585, 0x95A6, 0x9426, 0x95A0, 0x6FF6, 0x42B9, 0x0000,
+    0x0000, 0x0000, 0x49DF, 0x6C1C, 0x967B, 0x9696, 0x416C, 0x96A3,
+    0x0000, 0x61DA, 0xE4AD, 0x78F5, 0x0000, 0x96BD, 0x53CC, 0x49A1,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x9731, 0x8642, 0x9736, 0x4A0F, 0x453D, 0x4585, 0x0000, 0x7075,
+    0x5B41, 0x971B, 0xFFFD, 0x0000, 0x9757, 0x5B4A, 0x0000, 0x975F,
+    0x9425, 0x50D0, 0x0000, 0x0000, 0x9789, 0x979F, 0x97B1, 0x97BE,
+    0x97C0, 0x97D2, 0x97E0, 0x0000, 0x97EE, 0x741C, 0x0000, 0xFFFD,
+    0x97F5, 0x0000, 0x0000, 0x4AD1, 0x9834, 0x9833, 0x984B, 0x9866,
+    0x3B0E, 0x0000, 0x3D51, 0x0000, 0x0000, 0x0000, 0x98CA, 0x98B7,
+    0x98C8, 0x98C7, 0x4AFF, 0x0000, 0x0000, 0x55B0, 0x98E1, 0x98E6,
+    0x98EC, 0x9378, 0x9939, 0x0000, 0x4B72, 0x0000, 0x0000, 0x99F5,
+    0x9A0C, 0x9A3B, 0x9A10, 0x9A58, 0x0000, 0x36C4, 0x0000, 0x0000,
+    0x9AE0, 0x9AE2, 0x0000, 0x9AF4, 0x4C0E, 0x9B14, 0x9B2D, 0x0000,
+    0x5034, 0x9B34, 0x38C3, 0x0000, 0x9B50, 0x9B40, 0x0000, 0x5A45,
+    0x0000, 0x9B8E, 0x9C02, 0x9BFF, 0x9C0C, 0x0000, 0x9DD4, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9D7E, 0x9D83, 0x0000,
+    0x9E0E, 0x9DC4, 0x0000, 0x0000, 0x0000, 0x0000, 0x9D39, 0x0000,
+    0x0000, 0x9E90, 0x9E95, 0x9E9E, 0x9EA2, 0x4D34, 0x9EAA, 0x9EAF,
+    0x0000, 0x9EC1, 0x3B60, 0x39E5, 0x3D1D, 0x4F32, 0x37BE, 0x0000,
+    0x9F02, 0x9F08, 0x4B96, 0x9424, 0x0000, 0x9F17, 0x0000, 0x9F39,
+    0x569F, 0x568A, 0x9F45, 0x99B8, 0x0000, 0x97F2, 0x847F, 0xFFFD,
+    0x9F69, 0x7ADC, 0x9F8E, 0x7216, 0x4BBE, 0x0000, 0x0000, 0x7177,
+    0x0000, 0x0000, 0x0000, 0x739E, 0x0000, 0x0000, 0x799F, 0x0000,
+    0x0000, 0x9369, 0x93F3, 0x0000, 0x92EC, 0x9381, 0x93CB, 0x0000,
+    0x0000, 0x7217, 0x3EEB, 0x7772, 0x7A43, 0x70D0, 0x0000, 0x0000,
+    0x717E, 0x0000, 0x70A3, 0x0000, 0x0000, 0x3EC7, 0x0000, 0x0000,
+    0x0000, 0x3722, 0x0000, 0x0000, 0x36E1, 0x0000, 0x0000, 0x0000,
+    0x3723, 0x0000, 0x575B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x8503, 0x0000, 0xFFFD, 0x8455, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x44F4, 0x0000, 0x0000, 0x0000, 0x67F9, 0x3733,
+    0x3C15, 0x3DE7, 0x586C, 0x0000, 0x6810, 0x4057, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x54CB, 0x569E, 0x0000, 0x5692, 0x0000,
+    0x0000, 0x0000, 0xFFFD, 0x0000, 0x939C, 0x4EF8, 0x512B, 0x3819,
+    0x0000, 0x4EBC, 0x0000, 0xFFFD, 0x4F4B, 0x4F8A, 0x0000, 0x5A68,
+    0x0000, 0x0000, 0x3999, 0x0000, 0x0000, 0x3435, 0x4F29, 0x0000,
+    0x0000, 0x0000, 0x8ADA, 0x0000, 0x4E98, 0x50CD, 0x510D, 0x4FA2,
+    0x4F03, 0x0000, 0x0000, 0x4F42, 0x502E, 0x506C, 0x5081, 0x4FCC,
+    0x4FE5, 0x5058, 0x50FC, 0x6E76, 0x0000, 0x0000, 0x0000, 0x6D72,
+    0x0000, 0x0000, 0x51A8, 0x51C3, 0x0000, 0x44DD, 0x0000, 0x0000,
+    0x0000, 0x8D7A, 0x0000, 0x0000, 0x5259, 0x52A4, 0x0000, 0x52E1,
+    0xFFFD, 0x467A, 0x718C, 0x0000, 0x0000, 0x0000, 0x0000, 0x69D1,
+    0x0000, 0xFFFD, 0x3EDE, 0x7499, 0x7414, 0x7456, 0x7398, 0x4B8E,
+    0x0000, 0x0000, 0x53D0, 0x3584, 0x720F, 0x0000, 0x55B4, 0x0000,
+    0x54CD, 0x0000, 0x571D, 0x925D, 0x96F4, 0x57DD, 0x578D, 0x577F,
+    0x363E, 0x58CB, 0x5A99, 0x0000, 0x0000, 0x0000, 0x0000, 0x5A2C,
+    0x59B8, 0x5A7E, 0x5ACF, 0x5A12, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x36F5, 0x6D05, 0x7443, 0x5A21, 0x0000, 0x5A81, 0x0000, 0x0000,
+    0x93E0, 0x748C, 0x0000, 0x7105, 0x4972, 0x9408, 0x0000, 0x93BD,
+    0x37A0, 0x5C1E, 0x5C9E, 0x5E5E, 0x5E48, 0x0000, 0x0000, 0x0000,
+    0x5ECD, 0x5B4F, 0x0000, 0x0000, 0x3701, 0x0000, 0x36DD, 0x0000,
+    0x36D3, 0x812A, 0x0000, 0x0000, 0x0000, 0x0000, 0x5F0C, 0x5F0E,
+    0x0000, 0x0000, 0x5A6B, 0x0000, 0x5B44, 0x0000, 0x8860, 0x607E,
+    0x0000, 0x0000, 0x5FDB, 0x3EB8, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x61C0, 0x0000, 0x0000, 0x0000, 0x6199, 0x6198, 0x6075, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x6471, 0x0000, 0x0000, 0x3A29, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x6337, 0x64B6, 0x6331, 0x63D1, 0x0000,
+    0x0000, 0x62A4, 0x0000, 0x643B, 0x656B, 0x6972, 0x3BF4, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x550D, 0x0000, 0x0000, 0x0000, 0x66CE,
+    0x0000, 0x0000, 0x3AE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x78EE, 0x0000, 0x0000, 0x0000, 0x3464, 0x0000, 0x0000,
+    0x0000, 0x668E, 0x0000, 0x666B, 0x4B93, 0x6630, 0x0000, 0x0000,
+    0x6663, 0x0000, 0x0000, 0x661E, 0x0000, 0x38D1, 0x0000, 0x0000,
+    0x3B99, 0x0000, 0x0000, 0x74D0, 0x3B96, 0x0000, 0x68B6, 0xFFFD,
+    0x3BC4, 0x6ABE, 0x0000, 0x0000, 0x6A33, 0x6A52, 0x6AC9, 0x6B05,
+    0x0000, 0x6511, 0x6898, 0x6A4C, 0x3BD7, 0x6A7A, 0x6B57, 0x0000,
+    0x0000, 0x93A0, 0x92F2, 0x0000, 0x0000, 0x9289, 0x0000, 0x0000,
+    0x9467, 0x6DA5, 0x6F0B, 0xFFFD, 0x0000, 0x3D8F, 0x6E04, 0x0000,
+    0x5A3D, 0x6E0A, 0x5847, 0x6D24, 0x7842, 0x713B, 0x0000, 0x0000,
+    0x70F1, 0x7250, 0x7287, 0x7294, 0x0000, 0x0000, 0x5179, 0x0000,
+    0x0000, 0x747A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3F06,
+    0x3EB1, 0x0000, 0x0000, 0x0000, 0x60A7, 0x3EF3, 0x74CC, 0x743C,
+    0x9387, 0x7437, 0x449F, 0x0000, 0x4551, 0x7583, 0x3F63, 0x0000,
+    0x0000, 0x3F58, 0x7555, 0x7673, 0x0000, 0xFFFD, 0x7468, 0x0000,
+    0x0000, 0x0000, 0x3AFB, 0x3DCD, 0x0000, 0x3EFF, 0x0000, 0x0000,
+    0x91FA, 0x5732, 0x9342, 0x0000, 0x0000, 0x50DF, 0x0000, 0x0000,
+    0x7778, 0x0000, 0x770E, 0x770F, 0x777B, 0x0000, 0x0000, 0x3A5E,
+    0x0000, 0x7438, 0x749B, 0x3EBF, 0x0000, 0x0000, 0x40C8, 0x0000,
+    0x0000, 0x9307, 0x0000, 0x781E, 0x788D, 0x7888, 0x78D2, 0x73D0,
+    0x7959, 0x0000, 0x0000, 0x410E, 0xFFFD, 0xFFFD, 0x79A5, 0x6A2D,
+    0x0000, 0x7A3A, 0x79F4, 0x416E, 0x0000, 0x4132, 0x9235, 0x79F1,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3597, 0x556B, 0x3570,
+    0x36AA, 0x0000, 0x0000, 0x7AE2, 0x5A59, 0x0000, 0x0000, 0x0000,
+    0x5A0D, 0x0000, 0x78F0, 0x5A2A, 0x0000, 0x7AFE, 0x41F9, 0x7C5D,
+    0x7C6D, 0x4211, 0x0000, 0x0000, 0x0000, 0x7CCD, 0x0000, 0x0000,
+    0x7C8E, 0x7C7C, 0x7CAE, 0x6AB2, 0x7DDC, 0x7E07, 0x7DD3, 0x7F4E,
+    0x0000, 0x0000, 0x0000, 0x7D97, 0x0000, 0x426A, 0x0000, 0x0000,
+    0x67D6, 0x0000, 0x0000, 0x57C4, 0x0000, 0x0000, 0x7FDD, 0x7B27,
+    0x0000, 0x0000, 0x0000, 0x7B0C, 0x0000, 0x99E6, 0x8645, 0x9A63,
+    0x6A1C, 0x0000, 0x0000, 0x0000, 0x9A1F, 0x0000, 0x8495, 0x0000,
+    0x0000, 0x44EA, 0x8137, 0x4402, 0x80C6, 0x8109, 0x8142, 0x0000,
+    0x98C3, 0x0000, 0x8262, 0x8265, 0x0000, 0x8453, 0x0000, 0x8610,
+    0x0000, 0x5A86, 0x417F, 0x0000, 0x5B2B, 0x0000, 0x5AE4, 0x0000,
+    0x86A0, 0x0000, 0x0000, 0x882D, 0x0000, 0x5A02, 0x886E, 0x4F45,
+    0x8887, 0x88BF, 0x88E6, 0x8965, 0x894D, 0x0000, 0x8954, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3EAD, 0x84A3, 0x46F5,
+    0x46CF, 0x37F2, 0x8A3D, 0x8A1C, 0x0000, 0x5F4D, 0x922B, 0x0000,
+    0x65D4, 0x7129, 0x70C4, 0x0000, 0x9D6D, 0x8C9F, 0x8CE9, 0x0000,
+    0x599A, 0x77C3, 0x59F0, 0x36D4, 0x8E2A, 0x8EA7, 0x0000, 0x8F30,
+    0x8F4A, 0x42F4, 0x6C58, 0x6FBB, 0x0000, 0x489B, 0x6F79, 0x6E8B,
+    0x0000, 0x9BE9, 0x36B5, 0x0000, 0x90BB, 0x48B4, 0x5571, 0x4906,
+    0x91BB, 0x9404, 0x0000, 0x4062, 0x0000, 0x9427, 0x0000, 0x0000,
+    0x84E5, 0x8A2B, 0x9599, 0x95A7, 0x9597, 0x9596, 0x0000, 0x7445,
+    0x3EC2, 0x0000, 0x0000, 0x0000, 0x3EE7, 0x0000, 0x968F, 0x0000,
+    0x0000, 0x0000, 0x3ECC, 0x0000, 0x0000, 0x0000, 0x7412, 0x746B,
+    0x3EFC, 0x9741, 0x0000, 0x6847, 0x4A1D, 0x0000, 0x0000, 0xFFFD,
+    0x9368, 0x0000, 0x0000, 0x0000, 0x0000, 0x92BA, 0x5B11, 0x8B69,
+    0x493C, 0x73F9, 0x0000, 0x979B, 0xFFFD, 0x9938, 0x0000, 0x5DC1,
+    0x0000, 0x0000, 0x981F, 0x0000, 0x92F6, 0x0000, 0x91E5, 0x44C0,
+    0x0000, 0x0000, 0x0000, 0x98DC, 0x0000, 0x3F00, 0x922A, 0x4925,
+    0x8414, 0x993B, 0x994D, 0x0000, 0x3DFD, 0xFFFD, 0x4B6F, 0x99AA,
+    0x9A5C, 0x0000, 0x0000, 0x6A8F, 0x9A21, 0x5AFE, 0x9A2F, 0x0000,
+    0x4B90, 0x0000, 0x99BC, 0x4BBD, 0x4B97, 0x937D, 0x5872, 0x0000,
+    0x5822, 0x0000, 0x0000, 0x7844, 0x0000, 0x0000, 0x68C5, 0x3D7D,
+    0x9458, 0x3927, 0x6150, 0x0000, 0x0000, 0x6107, 0x9C4F, 0x9C53,
+    0x9C7B, 0x9C35, 0x9C10, 0x9B7F, 0x9BCF, 0x0000, 0x9B9F, 0x0000,
+    0x0000, 0x9D21, 0x4CAE, 0x0000, 0x9E18, 0x4CB0, 0x9D0C, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x9DA5, 0x84BD, 0x0000, 0x0000, 0x0000,
+    0x85FC, 0x4533, 0x0000, 0x0000, 0x0000, 0x8420, 0x85EE, 0x0000,
+    0x0000, 0x0000, 0x79E2, 0x0000, 0x0000, 0x0000, 0x3D62, 0x93DB,
+    0x92BE, 0x9348, 0x0000, 0x78B9, 0x9277, 0x944D, 0x4FE4, 0x3440,
+    0x9064, 0x0000, 0x783D, 0x7854, 0x78B6, 0x784B, 0x0000, 0x0000,
+    0x0000, 0x369A, 0x4F72, 0x6FDA, 0x6FD9, 0xFFFD, 0x701E, 0x5414,
+    0x0000, 0x57BB, 0x58F3, 0x578A, 0x9D16, 0x57D7, 0x7134, 0x34AF,
+    0x0000, 0x71EB, 0x0000, 0x0000, 0xFFFD, 0x0000, 0x0000, 0x610C,
+    0x5ACE, 0x5A0B, 0x42BC, 0x0000, 0x372C, 0x4B7B, 0x0000, 0x93BB,
+    0x93B8, 0x0000, 0x0000, 0x8472, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x5994, 0x0000, 0x0000, 0x7DA8, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x92E5, 0x73E2, 0x3EE9, 0x74B4, 0x0000, 0x0000,
+    0x3EE1, 0x0000, 0x6AD8, 0x73F3, 0x73FB, 0x3ED6, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7448, 0x0000, 0x70A5,
+    0x0000, 0x9284, 0x73E6, 0x935F, 0x0000, 0x9331, 0x0000, 0x0000,
+    0x9386, 0x0000, 0x0000, 0x4935, 0x0000, 0x716B, 0x0000, 0x0000,
+    0x56A4, 0x0000, 0x0000, 0x0000, 0x5502, 0x79C4, 0x0000, 0x7DFE,
+    0x0000, 0x0000, 0x0000, 0x452E, 0x9401, 0x370A, 0x0000, 0x0000,
+    0x59B0, 0x0000, 0x0000, 0x0000, 0x5AA1, 0x36E2, 0x0000, 0x36B0,
+    0x925F, 0x5A79, 0x0000, 0x0000, 0x9374, 0x3CCD, 0x0000, 0x4A96,
+    0x398A, 0x50F4, 0x3D69, 0x3D4C, 0x0000, 0x7175, 0x42FB, 0x0000,
+    0x6E0F, 0x0000, 0x44EB, 0x6D57, 0x0000, 0x7067, 0x6CAF, 0x3CD6,
+    0x0000, 0x0000, 0x6E02, 0x6F0C, 0x3D6F, 0x0000, 0x7551, 0x36BC,
+    0x34C8, 0x4680, 0x3EDA, 0x4871, 0x59C4, 0x926E, 0x493E, 0x8F41,
+    0x0000, 0x0000, 0x5812, 0x57C8, 0x36D6, 0x0000, 0x70FE, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x68B9, 0x6967, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6A1A, 0x0000,
+    0x0000, 0x843E, 0x44DF, 0x44CE, 0x0000, 0x0000, 0x0000, 0x0000,
+    0xFFFD, 0xFFFD, 0x833D, 0x0000, 0x83ED, 0x0000, 0x0000, 0x0000,
+    0x5989, 0x5A82, 0x0000, 0x5A61, 0x5A71, 0x0000, 0x0000, 0x372D,
+    0x59EF, 0x0000, 0x36C7, 0x718E, 0x9390, 0x669A, 0x0000, 0x5A6E,
+    0x5A2B, 0x0000, 0x6A2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x711D,
+    0x0000, 0x0000, 0x4FB0, 0x0000, 0x5CC2, 0x0000, 0x0000, 0x0000,
+    0x6A0C, 0x0000, 0x0000, 0xFFFD, 0x7133, 0x0000, 0x3DA5, 0x6CDF,
+    0x0000, 0x59EB, 0x5F5C, 0x0000, 0x7CD3, 0x0000, 0x0000, 0x0000,
+    0x906C, 0x81F6, 0x770C, 0x6CA2, 0x56FD, 0x5869, 0x6761, 0x5C5E,
+    0x58F2, 0x70B9, 0x6803, 0x8FBB, 0x8FBC, 0x4E21, 0x7B39, 0x3DCC,
+    0x732A, 0x7560, 0x583A, 0x82A6, 0x698A, 0x60E3, 0x4EEE, 0x99C4,
+    0x9EBF, 0x5301, 0x67A0, 0x60E8, 0x51B4, 0x7A83, 0x9C3A, 0x7AC8,
+    0x691A, 0x59AC, 0x5840, 0x546A, 0x60E7, 0x567A, 0x6955, 0x9C2F,
+    0x87A5, 0x5C20, 0x5E0B, 0x671E, 0x84AD, 0x8B81, 0x4E78, 0x62C3,
+    0x6855, 0xFFFD, 0x82FD, 0x89A5, 0x8FA0, 0x97B8, 0x9847, 0x9ABD,
+    0x5FB1, 0x6648, 0x66BF, 0x0000, 0xFFFD, 0x0000, 0xFFFD, 0xFFFD,
+    0x0000, 0x670E, 0x6918, 0x0000, 0x0000, 0x0000, 0x0000, 0x48D0,
+    0x4AB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x51D2, 0x0000, 0x599F,
+    0x0000, 0x3BBE, 0x0000, 0x399B, 0x0000, 0x0000, 0x3762, 0x0000,
+    0x8B5E, 0x0000, 0xFFFD, 0x7209, 0x0000, 0x0000, 0x8EDA, 0x528F,
+    0x7171, 0x0000, 0x0000, 0x55BC, 0x0000, 0x3473, 0x0000, 0x4718,
+    0x0000, 0x5066, 0x34FB, 0x0000, 0xFFFD, 0x477C, 0x0000, 0x0000,
+    0xFFFD, 0x0000, 0x9056, 0x0000, 0x8B62, 0x5D5B, 0x0000, 0xFFFD,
+    0x0000, 0x8AEA, 0x0000, 0x0000, 0x4BC0, 0x0000, 0x9465, 0x0000,
+    0x6195, 0x5A27, 0x0000, 0x0000, 0x0000, 0x4E6A, 0x0000, 0x9656,
+    0x6D8F, 0x0000, 0x8977, 0x0000, 0xFFFD, 0x7B42, 0x0000, 0x0000,
+    0xFFFD, 0x7A45, 0x9A26, 0x365F, 0x0000, 0x0000, 0x7983, 0x5D2C,
+    0x0000, 0xFFFD, 0x46D0, 0x753B, 0x8865, 0x58B6, 0x371C, 0x0000,
+    0x3C54, 0x9281, 0x0000, 0x9330, 0x0000, 0x6C39, 0x0000, 0x8827,
+    0x88F5, 0x0000, 0x0000, 0x0000, 0x6EB8, 0x0000, 0x0000, 0x39A4,
+    0xFFFD, 0xFFFD, 0x453F, 0x66B6, 0x0000, 0x0000, 0x8943, 0x40DF,
+    0x0000, 0x39A1, 0x0000, 0x0000, 0x0000, 0x71AD, 0x8366, 0x0000,
+    0xFFFD, 0x4CB7, 0x0000, 0x0000, 0x0000, 0x7B43, 0x797E, 0x6FB5,
+    0x0000, 0x6A03, 0x0000, 0x53A2, 0x0000, 0x93BF, 0x6836, 0x975D,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x5D85, 0x0000, 0x5715, 0x9823,
+    0x0000, 0x5DAB, 0x0000, 0x65BE, 0x69D5, 0x53D2, 0x0000, 0x0000,
+    0x3C11, 0x6736, 0x0000, 0x35CA, 0x48FA, 0xFFFD, 0x7808, 0x9255,
+    0x43F2, 0x43DF, 0x59F8, 0xFFFD, 0x568B, 0x0000, 0x9012, 0x55C1,
+    0x4509, 0x7E7F, 0x6F56, 0x6AB1, 0x34E4, 0x0000, 0x373A, 0xFFFD,
+    0x0000, 0x0000, 0x3DEB, 0x0000, 0x0000, 0x56BF, 0x8E0E, 0x5B6D,
+    0x63DE, 0xFFFD, 0x6530, 0x562D, 0x541A, 0x0000, 0x4C7D, 0x5622,
+    0x561E, 0x7F49, 0x5975, 0x0000, 0x8770, 0x8117, 0x9D5E, 0x8D18,
+    0x763B, 0x9C45, 0x764E, 0x77B9, 0x9345, 0x5432, 0x8148, 0x82F7,
+    0x5625, 0x8132, 0x8418, 0x80BD, 0x55EA, 0x7962, 0x5643, 0x5416,
+    0x0000, 0x35CE, 0x5605, 0x55F1, 0x66F1, 0x0000, 0x362D, 0x7534,
+    0x55F0, 0x55BA, 0x5497, 0x5572, 0x0000, 0x0000, 0x5ED0, 0x0000,
+    0x0000, 0x0000, 0x9EAB, 0x7D5A, 0xFFFD, 0x0000, 0x629D, 0x976D,
+    0x5494, 0x8CCD, 0x71F6, 0x9176, 0x63FC, 0x63B9, 0x63FE, 0x5569,
+    0x0000, 0x9C72, 0x0000, 0x519A, 0x34DF, 0x0000, 0x51A7, 0x544D,
+    0x551E, 0x5513, 0x7666, 0x8E2D, 0x0000, 0x75B1, 0x80B6, 0x8804,
+    0xFFFD, 0x88C7, 0x81B6, 0x841C, 0x44EC, 0x7304, 0x830B, 0x567B,
+    0x9170, 0x9208, 0x0000, 0x7266, 0x474E, 0x0000, 0x40FA, 0x9C5D,
+    0x651F, 0x48F3, 0x0000, 0x0000, 0xFFFD, 0x0000, 0xED2B, 0x0000,
+    0x71A3, 0x7E8E, 0x9D50, 0x3577, 0x6CB2, 0x5367, 0x39DC, 0x0000,
+    0x822D, 0x544B, 0xED43, 0x3A52, 0x7374, 0x0000, 0x4D09, 0x9BED,
+    0xFFFD, 0x4C5B, 0x0000, 0x845C, 0x0000, 0x632E, 0x7D25, 0x3A2A,
+    0x9008, 0x52CC, 0x3E74, 0x367A, 0x45E9, 0x0000, 0x7640, 0x5AF0,
+    0x0000, 0x787A, 0x0000, 0x58A7, 0x40BF, 0x567C, 0x9B8B, 0x5D74,
+    0x7654, 0x0000, 0x9E85, 0x4CE1, 0xFFFD, 0x37FB, 0x6119, 0x0000,
+    0xED73, 0x565D, 0x0000, 0x5234, 0x35AD, 0xFFFD, 0x9D7C, 0x7C56,
+    0x9B39, 0x57DE, 0x5C53, 0x64D3, 0x0000, 0x0000, 0x86AD, 0x0000,
+    0x0000, 0xED8C, 0x51FE, 0x0000, 0x5D8E, 0x9703, 0x0000, 0x9E81,
+    0x904C, 0x7B1F, 0x9B02, 0x5CD1, 0x7BA3, 0x6268, 0x6335, 0x9AFF,
+    0x7BCF, 0x9B2A, 0x7C7E, 0xFFFD, 0x7C42, 0x7C86, 0x9C15, 0x7BFC,
+    0x9B09, 0xFFFD, 0x9C2E, 0x9F5A, 0x5573, 0x5BC3, 0x4FFD, 0x9E98,
+    0x4FF2, 0x5260, 0x52D1, 0x5767, 0x5056, 0x59B7, 0x5E12, 0x97C8,
+    0x9DAB, 0x8F5C, 0x5469, 0x97B4, 0x9940, 0x97BA, 0x532C, 0x6130,
+    0x692C, 0x53DA, 0x9C0A, 0x9D02, 0x4C3B, 0x9641, 0x6980, 0x50A6,
+    0x7546, 0x0000, 0x99DA, 0x5273, 0xEDC9, 0x9159, 0x9681, 0x915C,
+    0xEDCD, 0x9151, 0x0000, 0x637F, 0x6ACA, 0x5611, 0x918E, 0x757A,
+    0x6285, 0x734F, 0x7C70, 0x0000, 0xEDDC, 0x76D6, 0x9B9D, 0x4E2A,
+    0x0000, 0x83BE, 0x8842, 0xEDE4, 0x5C4A, 0x69C0, 0xFFFD, 0xFFFD,
+    0x521F, 0x5DF5, 0x4ECE, 0x6C31, 0x0000, 0x4F39, 0x549C, 0xFFFD,
+    0x529A, 0x8D82, 0x35FE, 0xFFFD, 0x35F3, 0xEDF6, 0x6B52, 0x917C,
+    0x9FA5, 0x9B97, 0x982E, 0x98B4, 0x9ABA, 0x9EA8, 0x9E84, 0x7B14,
+    0xEE02, 0x6BFA, 0x8818, 0x7F78, 0xEE06, 0x5620, 0x0000, 0x8E77,
+    0x9F53, 0xEE0B, 0x8DD4, 0x8E4F, 0x9E1C, 0x8E01, 0x6282, 0x0000,
+    0x8E28, 0x8E75, 0x7AD3, 0x7A3E, 0x78D8, 0x6CEA, 0x8A67, 0x7607,
+    0x9F26, 0x6CCE, 0x87D6, 0x75C3, 0x0000, 0x7853, 0x8D0C, 0x72E2,
+    0x7371, 0x8B2D, 0x7302, 0x74F1, 0x8CEB, 0x0000, 0x862F, 0x5FBA,
+    0x88A0, 0x44B7, 0xEE2F, 0x0000, 0xEE32, 0x8A7E, 0x0000, 0xEE35,
+    0x60FD, 0x7667, 0x9AD7, 0x9D44, 0x936E, 0x9B8F, 0x87F5, 0xEE3D,
+    0xFFFD, 0x8CF7, 0x732C, 0x9721, 0x9BB0, 0x35D6, 0x72B2, 0x4C07,
+    0x7C51, 0x994A, 0x6159, 0x4C04, 0x9E96, 0x617D, 0xEE4D, 0x575F,
+    0x616F, 0x62A6, 0x6239, 0xFFFD, 0x3A5C, 0x61E2, 0x53AA, 0x6364,
+    0x6802, 0x35D2, 0x5D57, 0x8FDA, 0x0000, 0xEE5E, 0x50D9, 0x7906,
+    0x5332, 0x9638, 0x0000, 0x4065, 0xEE66, 0x77FE, 0xEE68, 0x7CC2,
+    0x0000, 0x7CDA, 0x7A2D, 0x8066, 0x8063, 0x7D4D, 0x7505, 0x74F2,
+    0x8994, 0x821A, 0x670C, 0x8062, 0x0000, 0x805B, 0x74F0, 0x8103,
+    0x7724, 0x8989, 0x0000, 0x7553, 0x87A9, 0x87CE, 0x81C8, 0x878C,
+    0x8A49, 0x8CAD, 0x8B43, 0x772B, 0x74F8, 0x84DA, 0x69B2, 0x8DA6,
+    0xEE8C, 0x89A9, 0xFFFD, 0x6DB9, 0x87C1, 0x0000, 0x74E7, 0x3DDB,
+    0x7176, 0x60A4, 0x619C, 0x3CD1, 0xFFFD, 0x6077, 0xEE9A, 0x7F71,
+    0x0000, 0x60E9, 0x4B7E, 0x0000, 0x92DB, 0x0000, 0x0000, 0x854C,
+    0x42B5, 0x73EF, 0x51B5, 0x3649, 0x0000, 0x0000, 0x9344, 0x0000,
+    0x82EE, 0x0000, 0x783C, 0x6744, 0x62DF, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x4FAB, 0x0000, 0x5008, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0xFFFD, 0x0000, 0x5FA4, 0x0000, 0x0000, 0x6EDB,
+    0x0000, 0x50DE, 0x5101, 0x347A, 0x510E, 0x986C, 0x3743, 0x8416,
+    0x0000, 0x0000, 0x5160, 0x0000, 0x516A, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x5B82, 0x877D, 0x0000, 0x0000,
+    0x51B2, 0x51B8, 0x9D34, 0x51C9, 0x51CF, 0x51D1, 0x3CDC, 0x51D3,
+    0x0000, 0x51B3, 0xFFFD, 0xFFFD, 0x51ED, 0x83CD, 0x693E, 0x0000,
+    0x5F7B, 0x520B, 0x5226, 0x523C, 0x52B5, 0x5257, 0x5294, 0x52B9,
+    0x52C5, 0x7C15, 0x8542, 0x52E0, 0x860D, 0x0000, 0x0000, 0x0000,
+    0x5549, 0x6ED9, 0x0000, 0x0000, 0x0000, 0x5333, 0xFFFD, 0x0000,
+    0x6CCB, 0x0000, 0x681B, 0x73D5, 0x604A, 0x3EAA, 0x38CC, 0x0000,
+    0x71DD, 0x44A2, 0x536D, 0x5374, 0x0000, 0x537E, 0x0000, 0x0000,
+    0x0000, 0x77E6, 0x5393, 0x0000, 0x53A0, 0x53AB, 0x53AE, 0x73A7,
+    0x0000, 0x3F59, 0x739C, 0x53C1, 0x53C5, 0x6C49, 0x4E49, 0x57FE,
+    0x53D9, 0x3AAB, 0x0000, 0x53E0, 0x0000, 0x0000, 0x53F6, 0x0000,
+    0x5413, 0x7079, 0x552B, 0x6657, 0x6D5B, 0x546D, 0x0000, 0x0000,
+    0x555D, 0x548F, 0x54A4, 0x47A6, 0x0000, 0x0000, 0x3DB4, 0x0000,
+    0x0000, 0x0000, 0x5547, 0x4CED, 0x542F, 0x7417, 0x5586, 0x55A9,
+    0xFFFD, 0x0000, 0x0000, 0x4552, 0x0000, 0x66B3, 0x0000, 0x5637,
+    0x66CD, 0x0000, 0x66A4, 0xFFFD, 0x564D, 0x564F, 0x78F1, 0x56F1,
+    0x9787, 0x53FE, 0x5700, 0x56EF, 0x56ED, 0x0000, 0x3623, 0x0000,
+    0x5746, 0x0000, 0x6C6E, 0x708B, 0x5742, 0x36B1, 0x0000, 0x57E6,
+    0x0000, 0x5803, 0x0000, 0x0000, 0x5826, 0x0000, 0x581F, 0x58AA,
+    0x3561, 0x58E0, 0x58DC, 0x0000, 0x58FB, 0x5BFF, 0x5743, 0x0000,
+    0x0000, 0x93D3, 0x35A1, 0x591F, 0x68A6, 0x36C3, 0x6E59, 0x0000,
+    0x5A24, 0xFFFD, 0x0000, 0x8505, 0x59C9, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x59D9, 0x0000, 0x0000, 0x0000, 0x6D71, 0x0000, 0x0000,
+    0x59F9, 0x0000, 0x5AAB, 0x5A63, 0x36E6, 0x0000, 0xFFFD, 0x3708,
+    0x5A96, 0x7465, 0x5AD3, 0x0000, 0x0000, 0x0000, 0x3732, 0x0000,
+    0x5E83, 0x52D0, 0x5B76, 0x6588, 0x5B7C, 0x0000, 0x4004, 0x485D,
+    0x0000, 0x5BD5, 0x0000, 0x0000, 0x0000, 0x5BF3, 0x5B9D, 0x4D10,
+    0x5C05, 0x0000, 0x5C13, 0x73CE, 0x5C14, 0x0000, 0x0000, 0x5C49,
+    0x48DD, 0x5C85, 0x5CE9, 0x5CEF, 0x5D8B, 0x0000, 0x0000, 0x5D10,
+    0x5D18, 0x5D46, 0x0000, 0x5CBA, 0x5DD7, 0x82FC, 0x382D, 0x0000,
+    0x0000, 0x0000, 0x8287, 0x3836, 0x3BC2, 0x5E2E, 0x6A8A, 0xFFFD,
+    0xE12F, 0x0000, 0x0000, 0x53A6, 0x4EB7, 0xFFFD, 0x53A8, 0x0000,
+    0x5E09, 0xE138, 0x0000, 0x5EF9, 0x5EFB, 0x38A0, 0x5EFC, 0x683E,
+    0x941B, 0x5F0D, 0x0000, 0x0000, 0x3ADE, 0x0000, 0x5F3A, 0x0000,
+    0x0000, 0x0000, 0x5F63, 0x0000, 0x5F72, 0x9340, 0x0000, 0x5FA7,
+    0x5DB6, 0x3D5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x91D6, 0x0000,
+    0x0000, 0x6031, 0x6685, 0x3963, 0x3DC7, 0x3639, 0x5790, 0x0000,
+    0x7971, 0x3E40, 0x609E, 0xFFFD, 0x60EA, 0x0000, 0x0000, 0x0000,
+    0x74A4, 0x50E1, 0x5AA0, 0x6164, 0x6142, 0x0000, 0x0000, 0x6181,
+    0x51F4, 0x0000, 0x6187, 0x5BAA, 0x0000, 0x0000, 0x61D3, 0x0000,
+    0x0000, 0x61D0, 0x3932, 0x0000, 0x0000, 0x6023, 0x615C, 0x651E,
+    0x638B, 0x0000, 0x62C5, 0x0000, 0x62D5, 0x0000, 0x636C, 0x0000,
+    0x3A17, 0x6438, 0x63F8, 0x0000, 0x0000, 0x6F8A, 0x0000, 0xFFFD,
+    0x0000, 0x64E1, 0x64E5, 0x947B, 0x3A66, 0x643A, 0x3A57, 0x654D,
+    0x6F16, 0x0000, 0x0000, 0x6585, 0x656D, 0x655F, 0xFFFD, 0x65B5,
+    0x0000, 0x4B37, 0x65D1, 0x40D8, 0x0000, 0xE1AB, 0x65E3, 0x5FDF,
+    0x0000, 0x6618, 0x0000, 0x0000, 0x6644, 0x0000, 0x0000, 0x664B,
+    0x0000, 0x6667, 0x0000, 0x6673, 0xFA12, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x77C5, 0x0000, 0x99A4, 0x6702, 0x0000, 0x0000, 0x69FA,
+    0x0000, 0x0000, 0x6767, 0x6762, 0x0000, 0x0000, 0x67D7, 0x44E9,
+    0x6822, 0x6E50, 0x923C, 0x6801, 0x0000, 0x0000, 0x685D, 0x0000,
+    0x69E1, 0x6A0B, 0x0000, 0x6973, 0x68C3, 0x0000, 0x6901, 0x6900,
+    0x3A01, 0x0000, 0x3B80, 0x67AC, 0x6961, 0x0000, 0x42FC, 0x6936,
+    0x6998, 0x3BA1, 0x0000, 0x8363, 0x5090, 0x69F9, 0x0000, 0x0000,
+    0x6A45, 0x0000, 0x6A9D, 0x3BF3, 0x67B1, 0x6AC8, 0x0000, 0x3C0D,
+    0x6B1D, 0x0000, 0x60DE, 0x6B35, 0x6B74, 0x0000, 0x6EB5, 0x0000,
+    0xFFFD, 0x0000, 0x3740, 0x5421, 0x0000, 0x6BE1, 0x0000, 0x6BDC,
+    0x6C37, 0x0000, 0x0000, 0x0000, 0x6C5A, 0x8226, 0x6C79, 0x0000,
+    0x44C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x36E5, 0x3CEB,
+    0x0000, 0x9B83, 0x0000, 0x0000, 0x7F8F, 0x6837, 0x0000, 0x0000,
+    0x0000, 0x6D96, 0x6D5C, 0x6E7C, 0x6F04, 0x0000, 0x0000, 0x0000,
+    0x8533, 0x0000, 0x51C7, 0xFFFD, 0xFFFD, 0x842E, 0x0000, 0x0000,
+    0x0000, 0x7453, 0x0000, 0x79CC, 0x6E4F, 0x5A91, 0x0000, 0x6FF8,
+    0x370D, 0x6F9D, 0x0000, 0x6EFA, 0x0000, 0x0000, 0x4555, 0x93F0,
+    0x6F44, 0x6F5C, 0x3D4E, 0x6F74, 0x0000, 0x3D3B, 0x6F9F, 0x0000,
+    0x6FD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51DF,
+    0xE251, 0xE252, 0x0000, 0x0000, 0x704B, 0x707E, 0x70A7, 0xFFFD,
+    0x70CC, 0x70D5, 0x70D6, 0x70DF, 0x4104, 0x3DE8, 0x71B4, 0x7196,
+    0x0000, 0x712B, 0x7145, 0x5A88, 0x714A, 0xFA48, 0x0000, 0x714F,
+    0x9362, 0x0000, 0x712C, 0x0000, 0x0000, 0x0000, 0x71BA, 0x0000,
+    0x70BD, 0x720E, 0x9442, 0x7215, 0x5911, 0x9443, 0x7224, 0x9341,
+    0x0000, 0x722E, 0x7240, 0x0000, 0x68BD, 0x7255, 0x7257, 0x3E55,
+    0x0000, 0x680D, 0x6F3D, 0x7282, 0xFFFD, 0x732B, 0x0000, 0x0000,
+    0x48ED, 0x0000, 0x7328, 0x732E, 0x73CF, 0x73AA, 0x0000, 0x0000,
+    0x73C9, 0x7449, 0x0000, 0x0000, 0x0000, 0x6623, 0x36C5, 0x0000,
+    0x0000, 0x0000, 0x73F7, 0x7415, 0x6903, 0x0000, 0x7439, 0x3ED7,
+    0x0000, 0x0000, 0x7460, 0x0000, 0x7447, 0x73E4, 0x7476, 0x83B9,
+    0x746C, 0x7474, 0x93F1, 0x6A2C, 0x7482, 0x4953, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x5B46, 0x0000, 0x0000, 0x74C8, 0x0000, 0x750E,
+    0x751E, 0x0000, 0x0000, 0x5BD7, 0x0000, 0x9385, 0x754D, 0x754A,
+    0x7567, 0x756E, 0x0000, 0x3F04, 0x0000, 0x758E, 0x745D, 0x759E,
+    0x75B4, 0x7602, 0x762C, 0x7651, 0x764F, 0x766F, 0xE2D3, 0x0000,
+    0x7690, 0x81EF, 0x37F8, 0x0000, 0x0000, 0x76A1, 0x76A5, 0x76B7,
+    0x76CC, 0x0000, 0x8462, 0x0000, 0x0000, 0x0000, 0x771E, 0x7726,
+    0x7740, 0x64AF, 0x0000, 0x7758, 0x0000, 0x77AF, 0x0000, 0x0000,
+    0x0000, 0x77F4, 0xFFFD, 0x68CA, 0x78AF, 0x78C7, 0x78D3, 0x96A5,
+    0x792E, 0x0000, 0x78D7, 0x7934, 0x78B1, 0x0000, 0x8FB8, 0x8884,
+    0x0000, 0x7986, 0x8900, 0x6902, 0x7980, 0x0000, 0x799D, 0x0000,
+    0x793C, 0x79A9, 0x6E2A, 0x0000, 0x3EA8, 0x79C6, 0x0000, 0x79D4,
+    0xFFFD, 0x5525, 0xFFFD, 0x0000, 0x0000, 0x0000, 0x5590, 0x0000,
+    0x39EC, 0x0000, 0x8E46, 0x0000, 0x0000, 0xFFFD, 0x0000, 0x777A,
+    0x0000, 0x3A34, 0x47D5, 0x0000, 0x0000, 0x0000, 0x64DD, 0x0000,
+    0x0000, 0x0000, 0xFFFD, 0x648D, 0x8E7E, 0x0000, 0xFFFD, 0x0000,
+    0x0000, 0x0000, 0x0000, 0xFFFD, 0x0000, 0x0000, 0x0000, 0x47F4,
+    0x0000, 0x0000, 0x9AB2, 0x3A67, 0x0000, 0x3FED, 0x3506, 0x0000,
+    0x0000, 0xFFFD, 0x0000, 0x9D6E, 0x9815, 0xFFFD, 0x43D9, 0xFFFD,
+    0x64B4, 0x54E3, 0xFFFD, 0x0000, 0xFFFD, 0x39FB, 0xFFFD, 0x0000,
+    0x0000, 0x0000, 0x64EA, 0x0000, 0x0000, 0x8E68, 0xFFFD, 0x0000,
+    0x0000, 0xFFFD, 0x480B, 0x0000, 0x3FFA, 0x5873, 0x0000, 0xFFFD,
+    0x0000, 0x0000, 0x0000, 0x0000, 0xFFFD, 0x5579, 0xFFFD, 0x43BA,
+    0xFFFD, 0x4AB4, 0x0000, 0x0000, 0x81AA, 0x98F5, 0x0000, 0x6379,
+    0x39FE, 0x0000, 0x8DC0, 0x56A1, 0x647C, 0x3E43, 0xFFFD, 0x0000,
+    0x0000, 0x0000, 0xFFFD, 0xFFFD, 0x0000, 0x0000, 0x3992, 0x3A06,
+    0x0000, 0x3578, 0x0000, 0x0000, 0xFFFD, 0xFFFD, 0x0000, 0x0000,
+    0x34BC, 0x6C3D, 0x0000, 0xFFFD, 0xFFFD, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3A18,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95AA, 0xFFFD, 0x0000,
+    0x7140, 0xFFFD, 0x5156, 0x4EFE, 0x5088, 0xFFFD, 0x3493, 0x5186,
+    0x5E42, 0x5205, 0x5227, 0x5279, 0x0000, 0x3553, 0x53C2, 0x535F,
+    0xFFFD, 0x553F, 0xFFFD, 0x55D8, 0x35DD, 0x5621, 0xFFFD, 0x5654,
+    0x0000, 0xFFFD, 0x0000, 0xFFFD, 0x0000, 0xFFFD, 0xFFFD, 0x37B9,
+    0x5CC1, 0x5D15, 0x5D56, 0x3838, 0x4E81, 0x5EBD, 0x3914, 0x61B9,
+    0x6290, 0x6318, 0x645A, 0x6491, 0x816D, 0x8184, 0x8193, 0x6800,
+    0x3BBC, 0x728F, 0x72CD, 0x0000, 0x7339, 0x7542, 0x75DC, 0x3FC0,
+    0x0000, 0x3FD7, 0xFFFD, 0x7680, 0x768C, 0x40A8, 0x7839, 0x4103,
+    0x7A91, 0x7C1B, 0x7CED, 0x7F93, 0x7FAE, 0xFFFD, 0x82FF, 0x585F,
+    0x86B2, 0x45AC, 0x878B, 0x8947, 0xFFFD, 0x8A29, 0xFFFD, 0x8E71,
+    0x0000, 0x8EB0, 0xFFFD, 0x915E, 0x918C, 0x990E, 0x991C, 0xFFFD,
+    0xFFFD, 0x9B81, 0x9DC0, 0x9D93, 0x9EAC, 0x4D91, 0xFFFD, 0x93BA,
+    0x9E7B, 0x7089, 0x7348, 0xFFFD, 0x7999, 0x8FB7, 0xFFFD, 0x9942,
+    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+    0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+    0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+    0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x00A9,
+    0x2122, 0x2026, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025,
+    0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D,
+    0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
+    0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D,
+    0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,
+    0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D,
+    0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055,
+    0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D,
+    0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,
+    0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D,
+    0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075,
+    0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D,
+    0x007E, 0x20AC, 0x20AC, 0x2110, 0x20AC, 0x20AC, 0x309B, 0x309C,
+    0x2E80, 0x31C0, 0x31C1, 0x31C2, 0x31C3, 0x31C4, 0x0000, 0x31C5,
+    0x0000, 0x0000, 0x31C6, 0x31C7, 0x0000, 0x0000, 0x31C8, 0x0000,
+    0x31C9, 0x31CA, 0x31CB, 0x31CC, 0x0000, 0x31CD, 0x31CE, 0xF538,
+    0xF539, 0x0000, 0x0000, 0x9751, 0x0000, 0x4E5B, 0x4EBB, 0x353E,
+    0x5C23, 0x5F51, 0x5FC4, 0x38FA, 0x624C, 0x6535, 0x6B7A, 0x6C35,
+    0x6C3A, 0x706C, 0x722B, 0x4E2C, 0x72AD, 0x0000, 0x7F52, 0x793B,
+    0x7CF9, 0x7F53, 0x0000, 0x34C1, 0x0000, 0x8002, 0x8080, 0x0000,
+    0x0000, 0x535D, 0x8864, 0x89C1, 0x0000, 0x8BA0, 0x8D1D, 0x9485,
+    0x9578, 0x957F, 0x95E8, 0x0000, 0x97E6, 0x9875, 0x98CE, 0x98DE,
+    0x9963, 0x0000, 0x9C7C, 0x9E1F, 0x9EC4, 0x6B6F, 0xF907, 0x4E37,
+    0x0000, 0x961D, 0x6237, 0x94A2, 0x2E84, 0x2E86, 0x2E87, 0x2E88,
+    0x2E8A, 0x2E8C, 0x2E8D, 0x2E95, 0x2E9C, 0x2EA5, 0x2EA7, 0x2EAA,
+    0x2EAC, 0x2EAE, 0x2EB6, 0x2EBC, 0x2EBE, 0x2ECA, 0x2ECC, 0x2ECD,
+    0x2ECF, 0x2ED6, 0x2ED7, 0x2EDE, 0x0000, 0x0000, 0x650A, 0x4E3D,
+    0x6EDD, 0x9D4E, 0x91DF, 0x0000, 0x4F1A, 0x4F28, 0x4FA8, 0x5174,
+    0x519C, 0x51E4, 0x52A1, 0x52A8, 0x533B, 0x534E, 0x53D1, 0x53D8,
+    0x56E2, 0x58F0, 0x5904, 0x5907, 0x5932, 0x5934, 0x5B66, 0x5B9E,
+    0x5B9F, 0x5C9A, 0x5E86, 0x603B, 0x6589, 0x67FE, 0x6804, 0x6865,
+    0x6D4E, 0x70BC, 0x7535, 0x7EA4, 0x7EAC, 0x7EBA, 0x7EC7, 0x7ECF,
+    0x7EDF, 0x7F06, 0x7F37, 0x827A, 0x82CF, 0x836F, 0x89C6, 0x8BBE,
+    0x8BE2, 0x8F66, 0x8F67, 0x8F6E, 0x7411, 0x7CFC, 0x7DCD, 0x6946,
+    0x7AC9, 0x78B8, 0x80BC, 0x8D0B, 0x80F6, 0x0000, 0x809F, 0x9EC7,
+    0x4CCD, 0x9DC9, 0x9E0C, 0x4C3E, 0x0000, 0x0000, 0x9E0A, 0x0000,
+    0x35C1, 0x6E9A, 0x823E, 0x7519, 0x4911, 0x9A6C, 0x9A8F, 0x9F99,
+    0x7987, 0x0000, 0x0000, 0x0000, 0x0000, 0x4E24, 0x4E80, 0x4E87,
+    0x4EBF, 0x4EEB, 0x4F37, 0x344C, 0x4FBD, 0x3E48, 0x5003, 0x347D,
+    0x34A5, 0x5905, 0x51DB, 0x51FC, 0x4E89, 0x5290, 0x5327, 0x35C7,
+    0x53A9, 0x3551, 0x53B0, 0x5423, 0x356D, 0x3572, 0x3681, 0x5493,
+    0x54A3, 0x54B4, 0x54B9, 0x54D0, 0x54EF, 0x5518, 0x5523, 0x5528,
+    0x3598, 0x35A5, 0x35BF, 0x55D7, 0x35C5, 0x0000, 0x4053, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x40BB, 0x0000, 0x5652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x35FB, 0x0000, 0x0000, 0x0000, 0x0000, 0x3F93, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3FF9,
+    0x0000, 0x6432, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x54CC, 0x82C4, 0x55B9, 0x0000, 0x9C26, 0x9AB6,
+    0x0000, 0x80EC, 0x5C1C, 0x0000, 0x8134, 0x3797, 0x0000, 0x91B6,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3609, 0x0000, 0x56AF,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x5A54, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x579C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3703,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x5899, 0x5268, 0x361A, 0x0000, 0x7BB2, 0x5B68, 0x4800, 0x4B2C,
+    0x9F27, 0x49E7, 0x9C1F, 0x9B8D, 0x0000, 0x0000, 0x55FB, 0x35F2,
+    0x5689, 0x5D3E, 0x5D48, 0x3DFC, 0x380F, 0x5DA4, 0x5DB9, 0x3820,
+    0x5F25, 0x5F83, 0x3908, 0x393F, 0x394D, 0x60D7, 0x613D, 0x5CE5,
+    0x3989, 0x61B7, 0x61CF, 0x39B8, 0x622C, 0x62E5, 0x39F8, 0x56B1,
+    0x3A03, 0x63E2, 0x63FB, 0x6407, 0x3A4B, 0x64C0, 0x9F9F, 0x3A97,
+    0x6586, 0x3ABD, 0x65FF, 0x6653, 0x3AF2, 0x6692, 0x3B22, 0x6716,
+    0x3B42, 0x67A4, 0x3B58, 0x684A, 0x6884, 0x3B72, 0x3B71, 0x3B7B,
+    0x6909, 0x6943, 0x725C, 0x6964, 0x699F, 0x6985, 0x69D6, 0x3BDD,
+    0x6A65, 0x6A74, 0x6A71, 0x6A82, 0x3BEC, 0x6A99, 0x3BF2, 0x6AAB,
+    0x6AB5, 0x6AD4, 0x6AF6, 0x6B81, 0x6BC1, 0x6BEA, 0x6C75, 0x6CAA,
+    0x3CCB, 0x6D02, 0x6D06, 0x6D26, 0x6D81, 0x3CEF, 0x6DA4, 0x6DB1,
+    0x6E15, 0x6E18, 0x6E29, 0x6E86, 0x0000, 0x6EBB, 0x6EE2, 0x6EDA,
+    0x9F7F, 0x6EE8, 0x6EE9, 0x6F24, 0x6F34, 0x3D46, 0x0000, 0x6F81,
+    0x6FBE, 0x3D6A, 0x3D75, 0x71B7, 0x5C99, 0x3D8A, 0x702C, 0x3D91,
+    0x7050, 0x7054, 0x706F, 0x707F, 0x0000, 0x43C1, 0x35F1, 0x0000,
+    0x364E, 0x3DAD, 0x0000, 0x667D, 0x7C74, 0x748D, 0x7E92, 0x4503,
+    0x0000, 0x0000, 0x0000, 0x347E, 0x0000, 0x0000, 0x0000, 0x8771,
+    0x63C1, 0x7777, 0x898A, 0x0000, 0x8B4C, 0x0000, 0x492A, 0x0000,
+    0x0000, 0x0000, 0x3AF0, 0x708F, 0x0000, 0x0000, 0x0000, 0x6888,
+    0x0000, 0x9F62, 0x93C6, 0x0000, 0x9366, 0x928F, 0x8614, 0x0000,
+    0x4190, 0x678F, 0x681E, 0x3863, 0x0000, 0x3B19, 0x8496, 0x0000,
+    0x39E2, 0x8480, 0x436E, 0x9771, 0x999B, 0x492D, 0x6F17, 0x0000,
+    0x70A6, 0x0000, 0x7E65, 0x5D2F, 0x3DF3, 0x0000, 0x0000, 0x7DA4,
+    0x8426, 0x5485, 0x0000, 0x0000, 0x577E, 0x0000, 0x0000, 0x3FE5,
+    0x0000, 0x0000, 0x7003, 0x0000, 0x5D70, 0x738F, 0x0000, 0x0000,
+    0x4FC8, 0x7FE7, 0x7310, 0x7338, 0x7341, 0x3EA9, 0x71F5, 0x0000,
+    0x73E1, 0x3ECA, 0x3ED1, 0x7419, 0x741E, 0x741F, 0x3EE2, 0x3EF0,
+    0x3EF4, 0x3EFA, 0x74D3, 0x3F0E, 0x3F53, 0x756D, 0x7572, 0x758D,
+    0x3F7C, 0x75C8, 0x764D, 0x7674, 0x3FDC, 0x767A, 0x7188, 0x5623,
+    0x8980, 0x401D, 0x7743, 0x4039, 0x4045, 0x35DB, 0x7798, 0x406A,
+    0x406F, 0x77BE, 0x77CB, 0x7818, 0x781C, 0x7847, 0x7851, 0x7866,
+    0x8448, 0x0000, 0x7933, 0x7932, 0x4109, 0x7991, 0x7A06, 0x4167,
+    0x41B2, 0x7ABC, 0x8279, 0x41C4, 0x7ACF, 0x7ADB, 0x41CF, 0x7B62,
+    0x7B6C, 0x7B7B, 0x7C12, 0x4260, 0x427A, 0x7C7B, 0x7C9C, 0x428C,
+    0x7CB8, 0x4294, 0x8F93, 0x70C0, 0x0000, 0x7DCF, 0x7DD4, 0x7DD0,
+    0x7DFD, 0x7FB4, 0x729F, 0x4397, 0x8020, 0x8025, 0x802E, 0x8031,
+    0x8054, 0x57B4, 0x70A0, 0x80B7, 0x80E9, 0x43ED, 0x810C, 0x810E,
+    0x8112, 0x8114, 0x4401, 0x3B39, 0x8156, 0x8159, 0x815A, 0x4413,
+    0x817C, 0x4425, 0x442D, 0x81A5, 0x57EF, 0x81C1, 0x81E4, 0x8254,
+    0x448F, 0x8276, 0x82CA, 0x82D8, 0x44B0, 0x8357, 0x9669, 0x8405,
+    0x70F5, 0x8464, 0x8488, 0x4504, 0x84BE, 0x84E1, 0x84F8, 0x8510,
+    0x8538, 0x8552, 0x453B, 0x856F, 0x8570, 0x85E0, 0x4577, 0x8672,
+    0x8692, 0x86EF, 0x9645, 0x4606, 0x4617, 0x88AE, 0x88FF, 0x8924,
+    0x8991, 0x0000, 0x8A38, 0x8A94, 0x8AB4, 0x8C51, 0x8CD4, 0x8CF2,
+    0x8D1C, 0x4798, 0x8DC3, 0x47ED, 0x8E3A, 0x5754, 0x55F5, 0x4837,
+    0x8ECE, 0x8EE2, 0x8EE4, 0x8EED, 0x8EF2, 0x8FC1, 0x8FCA, 0x8FCC,
+    0x9033, 0x48AD, 0x98E0, 0x9213, 0x491E, 0x9228, 0x9258, 0x926B,
+    0x92B1, 0x92AE, 0x92BF, 0x92E3, 0x92EB, 0x92F3, 0x92F4, 0x92FD,
+    0x9343, 0x9384, 0x93AD, 0x4945, 0x4951, 0x9417, 0x941D, 0x942D,
+    0x943E, 0x496A, 0x9454, 0x9479, 0x952D, 0x95A2, 0x49A7, 0x95F4,
+    0x9633, 0x49E5, 0x4A24, 0x9740, 0x4A35, 0x97B2, 0x97C2, 0x4AE4,
+    0x98B9, 0x4B19, 0x98F1, 0x5844, 0x9919, 0x9937, 0x995D, 0x9962,
+    0x4B70, 0x99C5, 0x4B9D, 0x9A3C, 0x9B0F, 0x9B69, 0x9BDD, 0x9BF1,
+    0x9BF4, 0x4C6D, 0x9C20, 0x376F, 0x0000, 0x9D49, 0x9EFE, 0x5650,
+    0x9DBD, 0x9DFC, 0x94F6, 0x8FB6, 0x9EB1, 0x9EBD, 0x9EC6, 0x94DC,
+    0x9EE2, 0x9EF1, 0x9EF8, 0x9F44, 0x0000, 0x0000, 0x0000, 0x94C3,
+    0x0000, 0x94C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x5757, 0x7173,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x549E, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3647, 0x0000,
+    0x0000, 0x0000, 0x5364, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x70BB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7198, 0x0000, 0x69E9,
+    0x36C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x58B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x5788, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x5965, 0x0000, 0x0000, 0x573F, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x57A1, 0x7151, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x56B9,
+    0x0000, 0x3618, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x949F, 0x0000, 0x36B9,
+    0x0000, 0x0000, 0x56D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63E6,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x3DF7, 0x0000, 0x0000, 0x8FD0, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x7E9F, 0x0000, 0x0000, 0x4CA4, 0x9547,
+    0x0000, 0x71A2, 0x0000, 0x0000, 0x4D9C, 0x0000, 0x8FBE, 0x8FBA,
+    0x0000, 0x8FB9, 0x0000, 0x4EEA, 0x0000, 0x8E80, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4E9A, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3DC6, 0x0000,
+    0x4E1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x55DE, 0x8786, 0x0000,
+    0x0000, 0x5B90, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4E1A, 0x4E04, 0x5B0D,
+    0x36AC, 0x537D, 0x36A5, 0x589A, 0x0000, 0x57AA, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x57A7, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x9C1B, 0x0000, 0x3E06, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x577A, 0x54DA, 0x717A, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3635, 0x0000,
+    0x5220, 0x3C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x4562, 0x5B1F, 0x0000, 0x9F50, 0x9EA6, 0x0000, 0x51E2, 0x5342,
+    0x66AD, 0x585C, 0x5553, 0x3D85, 0x6160, 0x48AE, 0x97BD, 0x0000,
+    0x60B3, 0x8424, 0x9814, 0x0000, 0x0000, 0x0000, 0x3B2B, 0x3D32,
+    0x0000, 0x7081, 0x5C9C, 0x0000, 0x3730, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0100, 0x00C1, 0x01CD, 0x00C0, 0x0112, 0x00C9, 0x011A,
+    0x00C8, 0x014C, 0x00D3, 0x01D1, 0x00D2, 0xF325, 0x1EBE, 0xF327,
+    0x1EC0, 0x00CA, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0251, 0x0113,
+    0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D,
+    0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6,
+    0x01D8, 0x01DA, 0x01DC, 0x00FC, 0xF344, 0x1EBF, 0xF346, 0x1EC1,
+    0x00EA, 0x0261, 0x0283, 0x0250, 0x025B, 0x0254, 0x0275, 0x0153,
+    0x00F8, 0x014B, 0x028A, 0x026A, 0x23DA, 0x23DB, 0x2E9D, 0x2EC6,
+    0x2EE3, 0x503B, 0x6DFE, 0x0000, 0x9FA6, 0x3DC9, 0x888F, 0x0000,
+    0x7077, 0x5CF5, 0x4B20, 0x0000, 0x3559, 0x0000, 0x6122, 0x0000,
+    0x8FA7, 0x91F6, 0x7191, 0x6719, 0x73BA, 0x0000, 0x0000, 0x3C8B,
+    0x0000, 0x4B10, 0x78E4, 0x7402, 0x51AE, 0x0000, 0x4009, 0x6A63,
+    0x0000, 0x4223, 0x860F, 0x7A2A, 0x0000, 0x0000, 0x9755, 0x704D,
+    0x5324, 0x0000, 0x93F4, 0x76D9, 0x0000, 0x9FA7, 0x77DD, 0x4EA3,
+    0x4FF0, 0x50BC, 0x4E2F, 0x4F17, 0x9FA8, 0x5434, 0x7D8B, 0x5892,
+    0x58D0, 0x0000, 0x5E92, 0x5E99, 0x5FC2, 0x0000, 0x658B, 0x0000,
+    0x6919, 0x6A43, 0x0000, 0x6CFF, 0x7200, 0x0000, 0x738C, 0x3EDB,
+    0x0000, 0x5B15, 0x74B9, 0x8B83, 0x0000, 0x0000, 0x7A93, 0x7BEC,
+    0x7CC3, 0x7E6C, 0x82F8, 0x8597, 0x9FA9, 0x8890, 0x9FAA, 0x8EB9,
+    0x9FAB, 0x8FCF, 0x855F, 0x99E0, 0x9221, 0x9FAC, 0x0000, 0x0000,
+    0x4071, 0x42A2, 0x5A1A, 0x9868, 0x676B, 0x4276, 0x573D, 0x85D6,
+    0x0000, 0x82BF, 0x0000, 0x4C81, 0x0000, 0x5D7B, 0x0000, 0x0000,
+    0x9FAD, 0x9FAE, 0x5B96, 0x9FAF, 0x7E5B, 0x43F0, 0x4C32, 0x4603,
+    0x45A6, 0x4578, 0x0000, 0x4D77, 0x45B3, 0x0000, 0x4CE2, 0x0000,
+    0x3B95, 0x4736, 0x4744, 0x4C47, 0x4C40, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x4C57, 0x0000, 0x474F, 0x45DA, 0x4C85, 0x0000,
+    0x4D07, 0x4AA4, 0x46A1, 0x0000, 0x7225, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x664D, 0x56FB, 0x7D95, 0x591D, 0x0000, 0x3DF4, 0x9734,
+    0x0000, 0x5BDB, 0x0000, 0x5AA4, 0x3625, 0x0000, 0x5AD1, 0x5BB7,
+    0x5CFC, 0x676E, 0x8593, 0x0000, 0x7461, 0x749D, 0x0000, 0x66E7,
+    0x6E57, 0x79CA, 0x3D88, 0x44C3, 0x0000, 0x0000, 0x439A, 0x4536,
+    0x5CD5, 0x0000, 0x8AF9, 0x5C78, 0x3D12, 0x0000, 0x5D78, 0x9FB2,
+    0x7157, 0x4558, 0x0000, 0x0000, 0x4C77, 0x3978, 0x344A, 0x0000,
+    0x0000, 0x8ACC, 0x4FB4, 0x0000, 0x59BF, 0x816C, 0x9856, 0x0000,
+    0x5F3B, 0x0000, 0x0000, 0x0000, 0x4102, 0x46BB, 0x0000, 0x3F07,
+    0x9FB3, 0x0000, 0x40F8, 0x37D6, 0x46F7, 0x0000, 0x417C, 0x0000,
+    0x0000, 0x456D, 0x38D4, 0x0000, 0x4561, 0x451B, 0x4D89, 0x4C7B,
+    0x4D76, 0x45EA, 0x3FC8, 0x0000, 0x3661, 0x44DE, 0x44BD, 0x41ED,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp
new file mode 100644
index 0000000..e12a859
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp
@@ -0,0 +1,91 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_B5pc_H_0[247 * 3] = {

+    0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x003D, 0x00FD, 0x00FF, 0x0060,

+    0xA140, 0xA158, 0x0063, 0xA159, 0xA15C, 0x35AF, 0xA15D, 0xA17E, 0x0080,

+    0xA1A1, 0xA1F5, 0x00A2, 0xA1F6, 0xA1F6, 0x00F8, 0xA1F7, 0xA1F7, 0x00F7,

+    0xA1F8, 0xA1FE, 0x00F9, 0xA240, 0xA27E, 0x0100, 0xA2A1, 0xA2FE, 0x013F,

+    0xA340, 0xA37E, 0x019D, 0xA3A1, 0xA3BB, 0x01DC, 0xA3BD, 0xA3BF, 0x01F7,

+    0xA3C0, 0xA3E0, 0x0232, 0xA440, 0xA47E, 0x0253, 0xA4A1, 0xA4FE, 0x0292,

+    0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, 0xA640, 0xA67E, 0x038D,

+    0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, 0xA7A1, 0xA7FE, 0x0469,

+    0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, 0xA940, 0xA97E, 0x0564,

+    0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, 0xAAA1, 0xAAFE, 0x0640,

+    0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, 0xAC40, 0xAC7E, 0x073B,

+    0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, 0xAD40, 0xAD7E, 0x07D7,

+    0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, 0xAEA1, 0xAEFE, 0x08B3,

+    0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, 0xAFD0, 0xAFFE, 0x0980,

+    0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, 0xB140, 0xB17E, 0x0A4C,

+    0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, 0xB2A1, 0xB2FE, 0x0B28,

+    0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, 0xB440, 0xB47E, 0x0C23,

+    0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, 0xB5A1, 0xB5FE, 0x0CFF,

+    0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, 0xB740, 0xB77E, 0x0DFA,

+    0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, 0xB8A1, 0xB8FE, 0x0ED6,

+    0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, 0xBA40, 0xBA7E, 0x0FD1,

+    0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, 0xBBA1, 0xBBC7, 0x10AD,

+    0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, 0xBCA1, 0xBCFE, 0x114B,

+    0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, 0xBE40, 0xBE51, 0x1246,

+    0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, 0xBEA1, 0xBEFE, 0x1284,

+    0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, 0xC040, 0xC07E, 0x137F,

+    0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, 0xC1A1, 0xC1AA, 0x145B,

+    0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, 0xC2A1, 0xC2CA, 0x14F9,

+    0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, 0xC340, 0xC360, 0x1556,

+    0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, 0xC3B9, 0xC3B9, 0x15AF,

+    0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, 0xC440, 0xC455, 0x15F4,

+    0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, 0xC4A1, 0xC4FE, 0x1632,

+    0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, 0xC640, 0xC67E, 0x172D,

+    0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,

+    0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,

+    0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,

+    0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,

+    0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,

+    0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,

+    0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,

+    0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,

+    0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,

+    0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,

+    0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,

+    0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,

+    0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,

+    0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,

+    0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,

+    0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,

+    0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,

+    0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,

+    0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,

+    0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,

+    0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,

+    0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,

+    0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,

+    0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,

+    0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,

+    0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,

+    0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,

+    0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,

+    0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,

+    0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,

+    0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,

+    0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,

+    0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,

+    0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,

+    0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,

+    0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,

+    0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,

+    0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,

+    0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,

+    0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,

+    0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,

+    0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,

+    0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,

+    0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,

+    0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,

+    0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,

+    0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,

+    0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,

+    0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,

+    0xF9D2, 0xF9D5, 0x354A,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp
new file mode 100644
index 0000000..188aefc
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp
@@ -0,0 +1,12 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_B5pc_V_0[12 * 3] = {

+    0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,

+    0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,

+    0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,

+    0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp
new file mode 100644
index 0000000..57ae87c
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp
@@ -0,0 +1,182 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_CNS_EUC_H_0[157 * 3] = {

+    0x0020, 0x007E, 0x3550, 0xA1A1, 0xA1FE, 0x0063, 0xA2A1, 0xA2FE, 0x00C1,

+    0xA3A1, 0xA3CE, 0x011F, 0xA4A1, 0xA4FE, 0x014D, 0xA5A1, 0xA5EC, 0x01AB,

+    0xA5EE, 0xA5F0, 0x01F7, 0xA6A1, 0xA6BE, 0x01FA, 0xA7A1, 0xA7A1, 0x0253,

+    0xA7A2, 0xA7A4, 0x0218, 0xA7A5, 0xA7A5, 0x0254, 0xA7A6, 0xA7A6, 0x021B,

+    0xA7A7, 0xA7A7, 0x025A, 0xA7A8, 0xA7A8, 0x021C, 0xA7A9, 0xA7AC, 0x025B,

+    0xA7AD, 0xA7AF, 0x021D, 0xA7B0, 0xA7B0, 0x025F, 0xA7B1, 0xA7B1, 0x176E,

+    0xA7B2, 0xA7B2, 0x0260, 0xA7B3, 0xA7B3, 0x0262, 0xA7B4, 0xA7B4, 0x0220,

+    0xA7B5, 0xA7B5, 0x0263, 0xA7B6, 0xA7B6, 0x176F, 0xA7B7, 0xA7B7, 0x0221,

+    0xA7B8, 0xA7B9, 0x0264, 0xA7BA, 0xA7BA, 0x0222, 0xA7BB, 0xA7BB, 0x1770,

+    0xA7BC, 0xA7BC, 0x0223, 0xA7BD, 0xA7BD, 0x0266, 0xA7BE, 0xA7BE, 0x0279,

+    0xA7BF, 0xA7BF, 0x1775, 0xA7C0, 0xA7C1, 0x027A, 0xA7C2, 0xA7C2, 0x0224,

+    0xA7C3, 0xA7C6, 0x027C, 0xA7C7, 0xA7C7, 0x0225, 0xA7C8, 0xA7CB, 0x0282,

+    0xA7CC, 0xA7CC, 0x1776, 0xA7CD, 0xA7CD, 0x0286, 0xA7CE, 0xA7CE, 0x0226,

+    0xA7CF, 0xA7D0, 0x0288, 0xA7D1, 0xA7D2, 0x028C, 0xA7D3, 0xA7D5, 0x0227,

+    0xA7D6, 0xA7D8, 0x028E, 0xA7D9, 0xA7DA, 0x022A, 0xA7DB, 0xA7DB, 0x1777,

+    0xA7DC, 0xA7DF, 0x02D0, 0xA7E0, 0xA7E0, 0x02D5, 0xA7E1, 0xA7E1, 0x022C,

+    0xA7E2, 0xA7E5, 0x02D6, 0xA7E6, 0xA7E6, 0x022D, 0xA7E7, 0xA7ED, 0x02DA,

+    0xA7EE, 0xA7EE, 0x178A, 0xA7EF, 0xA7F2, 0x02E1, 0xA7F3, 0xA7F3, 0x178C,

+    0xA7F4, 0xA7F8, 0x02E5, 0xA7F9, 0xA7F9, 0x178D, 0xA7FA, 0xA7FD, 0x02EA,

+    0xA7FE, 0xA7FE, 0x0356, 0xA8A1, 0xA8A6, 0x0357, 0xA8A7, 0xA8A7, 0x035E,

+    0xA8A8, 0xA8A8, 0x0362, 0xA8A9, 0xA8AA, 0x022E, 0xA8AB, 0xA8B2, 0x0363,

+    0xA8B3, 0xA8B3, 0x17B2, 0xA8B4, 0xA8B6, 0x036B, 0xA8B7, 0xA8BA, 0x03F6,

+    0xA8BB, 0xA8BB, 0x1812, 0xA8BC, 0xA8BE, 0x03FA, 0xA8BF, 0xA8C3, 0x03FE,

+    0xA8C4, 0xA8CC, 0x0405, 0xA8CD, 0xA8CD, 0x1813, 0xA8CE, 0xA8CE, 0x1818,

+    0xA8CF, 0xA8D2, 0x040F, 0xA8D3, 0xA8D3, 0x1819, 0xA8D4, 0xA8D9, 0x0508,

+    0xA8DA, 0xA8DA, 0x18E7, 0xA8DB, 0xA8E2, 0x050E, 0xA8E3, 0xA8E3, 0x0230,

+    0xA8E4, 0xA8E4, 0x051B, 0xA8E5, 0xA8E7, 0x0520, 0xA8E8, 0xA8EB, 0x0696,

+    0xA8EC, 0xA8EC, 0x0231, 0xA8ED, 0xA8F0, 0x069F, 0xA8F1, 0xA8FB, 0x0826,

+    0xA8FC, 0xA8FE, 0x09F5, 0xA9A1, 0xA9A1, 0x1E33, 0xA9A2, 0xA9A2, 0x09F8,

+    0xA9A3, 0xA9A3, 0x1E34, 0xA9A4, 0xA9A5, 0x09F9, 0xA9A6, 0xA9AB, 0x0BE1,

+    0xA9AC, 0xA9AE, 0x0DBB, 0xA9AF, 0xA9AF, 0x2360, 0xA9B0, 0xA9B0, 0x2612,

+    0xA9B1, 0xA9B3, 0x0F7B, 0xA9B4, 0xA9B5, 0x1100, 0xA9B6, 0xA9B6, 0x1289,

+    0xA9B7, 0xA9B8, 0x13B2, 0xA9B9, 0xA9B9, 0x2F0D, 0xC2A1, 0xC2C1, 0x0232,

+    0xC4A1, 0xC4FE, 0x0253, 0xC5A1, 0xC5FE, 0x02B1, 0xC6A1, 0xC6FE, 0x030F,

+    0xC7A1, 0xC7FE, 0x036D, 0xC8A1, 0xC8FE, 0x03CB, 0xC9A1, 0xC9FE, 0x0429,

+    0xCAA1, 0xCAFE, 0x0487, 0xCBA1, 0xCBFE, 0x04E5, 0xCCA1, 0xCCFE, 0x0543,

+    0xCDA1, 0xCDFE, 0x05A1, 0xCEA1, 0xCEFE, 0x05FF, 0xCFA1, 0xCFFE, 0x065D,

+    0xD0A1, 0xD0FE, 0x06BB, 0xD1A1, 0xD1FE, 0x0719, 0xD2A1, 0xD2FE, 0x0777,

+    0xD3A1, 0xD3FE, 0x07D5, 0xD4A1, 0xD4FE, 0x0833, 0xD5A1, 0xD5FE, 0x0891,

+    0xD6A1, 0xD6FE, 0x08EF, 0xD7A1, 0xD7FE, 0x094D, 0xD8A1, 0xD8FE, 0x09AB,

+    0xD9A1, 0xD9FE, 0x0A09, 0xDAA1, 0xDAFE, 0x0A67, 0xDBA1, 0xDBFE, 0x0AC5,

+    0xDCA1, 0xDCFE, 0x0B23, 0xDDA1, 0xDDFE, 0x0B81, 0xDEA1, 0xDEFE, 0x0BDF,

+    0xDFA1, 0xDFFE, 0x0C3D, 0xE0A1, 0xE0FE, 0x0C9B, 0xE1A1, 0xE1FE, 0x0CF9,

+    0xE2A1, 0xE2FE, 0x0D57, 0xE3A1, 0xE3FE, 0x0DB5, 0xE4A1, 0xE4FE, 0x0E13,

+    0xE5A1, 0xE5FE, 0x0E71, 0xE6A1, 0xE6FE, 0x0ECF, 0xE7A1, 0xE7FE, 0x0F2D,

+    0xE8A1, 0xE8FE, 0x0F8B, 0xE9A1, 0xE9FE, 0x0FE9, 0xEAA1, 0xEAFE, 0x1047,

+    0xEBA1, 0xEBFE, 0x10A5, 0xECA1, 0xECFE, 0x1103, 0xEDA1, 0xEDFE, 0x1161,

+    0xEEA1, 0xEEFE, 0x11BF, 0xEFA1, 0xEFFE, 0x121D, 0xF0A1, 0xF0FE, 0x127B,

+    0xF1A1, 0xF1FE, 0x12D9, 0xF2A1, 0xF2FE, 0x1337, 0xF3A1, 0xF3FE, 0x1395,

+    0xF4A1, 0xF4FE, 0x13F3, 0xF5A1, 0xF5FE, 0x1451, 0xF6A1, 0xF6FE, 0x14AF,

+    0xF7A1, 0xF7FE, 0x150D, 0xF8A1, 0xF8FE, 0x156B, 0xF9A1, 0xF9FE, 0x15C9,

+    0xFAA1, 0xFAFE, 0x1627, 0xFBA1, 0xFBFE, 0x1685, 0xFCA1, 0xFCFE, 0x16E3,

+    0xFDA1, 0xFDCB, 0x1741,

+};

+extern const unsigned short g_FXCMAP_CNS_EUC_H_0_DWord[238 * 4] = {

+    0x8EA1, 0xA1A1, 0xA1FE, 0x0063, 0x8EA1, 0xA2A1, 0xA2FE, 0x00C1,

+    0x8EA1, 0xA3A1, 0xA3CE, 0x011F, 0x8EA1, 0xA4A1, 0xA4FE, 0x014D,

+    0x8EA1, 0xA5A1, 0xA5EC, 0x01AB, 0x8EA1, 0xA5EE, 0xA5F0, 0x01F7,

+    0x8EA1, 0xA6A1, 0xA6BE, 0x01FA, 0x8EA1, 0xA7A1, 0xA7A1, 0x0253,

+    0x8EA1, 0xA7A2, 0xA7A4, 0x0218, 0x8EA1, 0xA7A5, 0xA7A5, 0x0254,

+    0x8EA1, 0xA7A6, 0xA7A6, 0x021B, 0x8EA1, 0xA7A7, 0xA7A7, 0x025A,

+    0x8EA1, 0xA7A8, 0xA7A8, 0x021C, 0x8EA1, 0xA7A9, 0xA7AC, 0x025B,

+    0x8EA1, 0xA7AD, 0xA7AF, 0x021D, 0x8EA1, 0xA7B0, 0xA7B0, 0x025F,

+    0x8EA1, 0xA7B1, 0xA7B1, 0x176E, 0x8EA1, 0xA7B2, 0xA7B2, 0x0260,

+    0x8EA1, 0xA7B3, 0xA7B3, 0x0262, 0x8EA1, 0xA7B4, 0xA7B4, 0x0220,

+    0x8EA1, 0xA7B5, 0xA7B5, 0x0263, 0x8EA1, 0xA7B6, 0xA7B6, 0x176F,

+    0x8EA1, 0xA7B7, 0xA7B7, 0x0221, 0x8EA1, 0xA7B8, 0xA7B9, 0x0264,

+    0x8EA1, 0xA7BA, 0xA7BA, 0x0222, 0x8EA1, 0xA7BB, 0xA7BB, 0x1770,

+    0x8EA1, 0xA7BC, 0xA7BC, 0x0223, 0x8EA1, 0xA7BD, 0xA7BD, 0x0266,

+    0x8EA1, 0xA7BE, 0xA7BE, 0x0279, 0x8EA1, 0xA7BF, 0xA7BF, 0x1775,

+    0x8EA1, 0xA7C0, 0xA7C1, 0x027A, 0x8EA1, 0xA7C2, 0xA7C2, 0x0224,

+    0x8EA1, 0xA7C3, 0xA7C6, 0x027C, 0x8EA1, 0xA7C7, 0xA7C7, 0x0225,

+    0x8EA1, 0xA7C8, 0xA7CB, 0x0282, 0x8EA1, 0xA7CC, 0xA7CC, 0x1776,

+    0x8EA1, 0xA7CD, 0xA7CD, 0x0286, 0x8EA1, 0xA7CE, 0xA7CE, 0x0226,

+    0x8EA1, 0xA7CF, 0xA7D0, 0x0288, 0x8EA1, 0xA7D1, 0xA7D2, 0x028C,

+    0x8EA1, 0xA7D3, 0xA7D5, 0x0227, 0x8EA1, 0xA7D6, 0xA7D8, 0x028E,

+    0x8EA1, 0xA7D9, 0xA7DA, 0x022A, 0x8EA1, 0xA7DB, 0xA7DB, 0x1777,

+    0x8EA1, 0xA7DC, 0xA7DF, 0x02D0, 0x8EA1, 0xA7E0, 0xA7E0, 0x02D5,

+    0x8EA1, 0xA7E1, 0xA7E1, 0x022C, 0x8EA1, 0xA7E2, 0xA7E5, 0x02D6,

+    0x8EA1, 0xA7E6, 0xA7E6, 0x022D, 0x8EA1, 0xA7E7, 0xA7ED, 0x02DA,

+    0x8EA1, 0xA7EE, 0xA7EE, 0x178A, 0x8EA1, 0xA7EF, 0xA7F2, 0x02E1,

+    0x8EA1, 0xA7F3, 0xA7F3, 0x178C, 0x8EA1, 0xA7F4, 0xA7F8, 0x02E5,

+    0x8EA1, 0xA7F9, 0xA7F9, 0x178D, 0x8EA1, 0xA7FA, 0xA7FD, 0x02EA,

+    0x8EA1, 0xA7FE, 0xA7FE, 0x0356, 0x8EA1, 0xA8A1, 0xA8A6, 0x0357,

+    0x8EA1, 0xA8A7, 0xA8A7, 0x035E, 0x8EA1, 0xA8A8, 0xA8A8, 0x0362,

+    0x8EA1, 0xA8A9, 0xA8AA, 0x022E, 0x8EA1, 0xA8AB, 0xA8B2, 0x0363,

+    0x8EA1, 0xA8B3, 0xA8B3, 0x17B2, 0x8EA1, 0xA8B4, 0xA8B6, 0x036B,

+    0x8EA1, 0xA8B7, 0xA8BA, 0x03F6, 0x8EA1, 0xA8BB, 0xA8BB, 0x1812,

+    0x8EA1, 0xA8BC, 0xA8BE, 0x03FA, 0x8EA1, 0xA8BF, 0xA8C3, 0x03FE,

+    0x8EA1, 0xA8C4, 0xA8CC, 0x0405, 0x8EA1, 0xA8CD, 0xA8CD, 0x1813,

+    0x8EA1, 0xA8CE, 0xA8CE, 0x1818, 0x8EA1, 0xA8CF, 0xA8D2, 0x040F,

+    0x8EA1, 0xA8D3, 0xA8D3, 0x1819, 0x8EA1, 0xA8D4, 0xA8D9, 0x0508,

+    0x8EA1, 0xA8DA, 0xA8DA, 0x18E7, 0x8EA1, 0xA8DB, 0xA8E2, 0x050E,

+    0x8EA1, 0xA8E3, 0xA8E3, 0x0230, 0x8EA1, 0xA8E4, 0xA8E4, 0x051B,

+    0x8EA1, 0xA8E5, 0xA8E7, 0x0520, 0x8EA1, 0xA8E8, 0xA8EB, 0x0696,

+    0x8EA1, 0xA8EC, 0xA8EC, 0x0231, 0x8EA1, 0xA8ED, 0xA8F0, 0x069F,

+    0x8EA1, 0xA8F1, 0xA8FB, 0x0826, 0x8EA1, 0xA8FC, 0xA8FE, 0x09F5,

+    0x8EA1, 0xA9A1, 0xA9A1, 0x1E33, 0x8EA1, 0xA9A2, 0xA9A2, 0x09F8,

+    0x8EA1, 0xA9A3, 0xA9A3, 0x1E34, 0x8EA1, 0xA9A4, 0xA9A5, 0x09F9,

+    0x8EA1, 0xA9A6, 0xA9AB, 0x0BE1, 0x8EA1, 0xA9AC, 0xA9AE, 0x0DBB,

+    0x8EA1, 0xA9AF, 0xA9AF, 0x2360, 0x8EA1, 0xA9B0, 0xA9B0, 0x2612,

+    0x8EA1, 0xA9B1, 0xA9B3, 0x0F7B, 0x8EA1, 0xA9B4, 0xA9B5, 0x1100,

+    0x8EA1, 0xA9B6, 0xA9B6, 0x1289, 0x8EA1, 0xA9B7, 0xA9B8, 0x13B2,

+    0x8EA1, 0xA9B9, 0xA9B9, 0x2F0D, 0x8EA1, 0xC2A1, 0xC2C1, 0x0232,

+    0x8EA1, 0xC4A1, 0xC4FE, 0x0253, 0x8EA1, 0xC5A1, 0xC5FE, 0x02B1,

+    0x8EA1, 0xC6A1, 0xC6FE, 0x030F, 0x8EA1, 0xC7A1, 0xC7FE, 0x036D,

+    0x8EA1, 0xC8A1, 0xC8FE, 0x03CB, 0x8EA1, 0xC9A1, 0xC9FE, 0x0429,

+    0x8EA1, 0xCAA1, 0xCAFE, 0x0487, 0x8EA1, 0xCBA1, 0xCBFE, 0x04E5,

+    0x8EA1, 0xCCA1, 0xCCFE, 0x0543, 0x8EA1, 0xCDA1, 0xCDFE, 0x05A1,

+    0x8EA1, 0xCEA1, 0xCEFE, 0x05FF, 0x8EA1, 0xCFA1, 0xCFFE, 0x065D,

+    0x8EA1, 0xD0A1, 0xD0FE, 0x06BB, 0x8EA1, 0xD1A1, 0xD1FE, 0x0719,

+    0x8EA1, 0xD2A1, 0xD2FE, 0x0777, 0x8EA1, 0xD3A1, 0xD3FE, 0x07D5,

+    0x8EA1, 0xD4A1, 0xD4FE, 0x0833, 0x8EA1, 0xD5A1, 0xD5FE, 0x0891,

+    0x8EA1, 0xD6A1, 0xD6FE, 0x08EF, 0x8EA1, 0xD7A1, 0xD7FE, 0x094D,

+    0x8EA1, 0xD8A1, 0xD8FE, 0x09AB, 0x8EA1, 0xD9A1, 0xD9FE, 0x0A09,

+    0x8EA1, 0xDAA1, 0xDAFE, 0x0A67, 0x8EA1, 0xDBA1, 0xDBFE, 0x0AC5,

+    0x8EA1, 0xDCA1, 0xDCFE, 0x0B23, 0x8EA1, 0xDDA1, 0xDDFE, 0x0B81,

+    0x8EA1, 0xDEA1, 0xDEFE, 0x0BDF, 0x8EA1, 0xDFA1, 0xDFFE, 0x0C3D,

+    0x8EA1, 0xE0A1, 0xE0FE, 0x0C9B, 0x8EA1, 0xE1A1, 0xE1FE, 0x0CF9,

+    0x8EA1, 0xE2A1, 0xE2FE, 0x0D57, 0x8EA1, 0xE3A1, 0xE3FE, 0x0DB5,

+    0x8EA1, 0xE4A1, 0xE4FE, 0x0E13, 0x8EA1, 0xE5A1, 0xE5FE, 0x0E71,

+    0x8EA1, 0xE6A1, 0xE6FE, 0x0ECF, 0x8EA1, 0xE7A1, 0xE7FE, 0x0F2D,

+    0x8EA1, 0xE8A1, 0xE8FE, 0x0F8B, 0x8EA1, 0xE9A1, 0xE9FE, 0x0FE9,

+    0x8EA1, 0xEAA1, 0xEAFE, 0x1047, 0x8EA1, 0xEBA1, 0xEBFE, 0x10A5,

+    0x8EA1, 0xECA1, 0xECFE, 0x1103, 0x8EA1, 0xEDA1, 0xEDFE, 0x1161,

+    0x8EA1, 0xEEA1, 0xEEFE, 0x11BF, 0x8EA1, 0xEFA1, 0xEFFE, 0x121D,

+    0x8EA1, 0xF0A1, 0xF0FE, 0x127B, 0x8EA1, 0xF1A1, 0xF1FE, 0x12D9,

+    0x8EA1, 0xF2A1, 0xF2FE, 0x1337, 0x8EA1, 0xF3A1, 0xF3FE, 0x1395,

+    0x8EA1, 0xF4A1, 0xF4FE, 0x13F3, 0x8EA1, 0xF5A1, 0xF5FE, 0x1451,

+    0x8EA1, 0xF6A1, 0xF6FE, 0x14AF, 0x8EA1, 0xF7A1, 0xF7FE, 0x150D,

+    0x8EA1, 0xF8A1, 0xF8FE, 0x156B, 0x8EA1, 0xF9A1, 0xF9FE, 0x15C9,

+    0x8EA1, 0xFAA1, 0xFAFE, 0x1627, 0x8EA1, 0xFBA1, 0xFBFE, 0x1685,

+    0x8EA1, 0xFCA1, 0xFCFE, 0x16E3, 0x8EA1, 0xFDA1, 0xFDCB, 0x1741,

+    0x8EA2, 0xA1A1, 0xA1FE, 0x176C, 0x8EA2, 0xA2A1, 0xA2FE, 0x17CA,

+    0x8EA2, 0xA3A1, 0xA3FE, 0x1828, 0x8EA2, 0xA4A1, 0xA4FE, 0x1886,

+    0x8EA2, 0xA5A1, 0xA5FE, 0x18E4, 0x8EA2, 0xA6A1, 0xA6FE, 0x1942,

+    0x8EA2, 0xA7A1, 0xA7FE, 0x19A0, 0x8EA2, 0xA8A1, 0xA8FE, 0x19FE,

+    0x8EA2, 0xA9A1, 0xA9FE, 0x1A5C, 0x8EA2, 0xAAA1, 0xAAFE, 0x1ABA,

+    0x8EA2, 0xABA1, 0xABFE, 0x1B18, 0x8EA2, 0xACA1, 0xACFE, 0x1B76,

+    0x8EA2, 0xADA1, 0xADFE, 0x1BD4, 0x8EA2, 0xAEA1, 0xAEFE, 0x1C32,

+    0x8EA2, 0xAFA1, 0xAFFE, 0x1C90, 0x8EA2, 0xB0A1, 0xB0FE, 0x1CEE,

+    0x8EA2, 0xB1A1, 0xB1FE, 0x1D4C, 0x8EA2, 0xB2A1, 0xB2FE, 0x1DAA,

+    0x8EA2, 0xB3A1, 0xB3FE, 0x1E08, 0x8EA2, 0xB4A1, 0xB4FE, 0x1E66,

+    0x8EA2, 0xB5A1, 0xB5FE, 0x1EC4, 0x8EA2, 0xB6A1, 0xB6FE, 0x1F22,

+    0x8EA2, 0xB7A1, 0xB7FE, 0x1F80, 0x8EA2, 0xB8A1, 0xB8FE, 0x1FDE,

+    0x8EA2, 0xB9A1, 0xB9FE, 0x203C, 0x8EA2, 0xBAA1, 0xBAFE, 0x209A,

+    0x8EA2, 0xBBA1, 0xBBFE, 0x20F8, 0x8EA2, 0xBCA1, 0xBCFE, 0x2156,

+    0x8EA2, 0xBDA1, 0xBDFE, 0x21B4, 0x8EA2, 0xBEA1, 0xBEFE, 0x2212,

+    0x8EA2, 0xBFA1, 0xBFFE, 0x2270, 0x8EA2, 0xC0A1, 0xC0FE, 0x22CE,

+    0x8EA2, 0xC1A1, 0xC1FE, 0x232C, 0x8EA2, 0xC2A1, 0xC2FE, 0x238A,

+    0x8EA2, 0xC3A1, 0xC3FE, 0x23E8, 0x8EA2, 0xC4A1, 0xC4FE, 0x2446,

+    0x8EA2, 0xC5A1, 0xC5FE, 0x24A4, 0x8EA2, 0xC6A1, 0xC6FE, 0x2502,

+    0x8EA2, 0xC7A1, 0xC7FE, 0x2560, 0x8EA2, 0xC8A1, 0xC8FE, 0x25BE,

+    0x8EA2, 0xC9A1, 0xC9FE, 0x261C, 0x8EA2, 0xCAA1, 0xCAFE, 0x267A,

+    0x8EA2, 0xCBA1, 0xCBFE, 0x26D8, 0x8EA2, 0xCCA1, 0xCCFE, 0x2736,

+    0x8EA2, 0xCDA1, 0xCDFE, 0x2794, 0x8EA2, 0xCEA1, 0xCEFE, 0x27F2,

+    0x8EA2, 0xCFA1, 0xCFFE, 0x2850, 0x8EA2, 0xD0A1, 0xD0FE, 0x28AE,

+    0x8EA2, 0xD1A1, 0xD1FE, 0x290C, 0x8EA2, 0xD2A1, 0xD2FE, 0x296A,

+    0x8EA2, 0xD3A1, 0xD3FE, 0x29C8, 0x8EA2, 0xD4A1, 0xD4FE, 0x2A26,

+    0x8EA2, 0xD5A1, 0xD5FE, 0x2A84, 0x8EA2, 0xD6A1, 0xD6FE, 0x2AE2,

+    0x8EA2, 0xD7A1, 0xD7FE, 0x2B40, 0x8EA2, 0xD8A1, 0xD8FE, 0x2B9E,

+    0x8EA2, 0xD9A1, 0xD9FE, 0x2BFC, 0x8EA2, 0xDAA1, 0xDAFE, 0x2C5A,

+    0x8EA2, 0xDBA1, 0xDBFE, 0x2CB8, 0x8EA2, 0xDCA1, 0xDCFE, 0x2D16,

+    0x8EA2, 0xDDA1, 0xDDFE, 0x2D74, 0x8EA2, 0xDEA1, 0xDEFE, 0x2DD2,

+    0x8EA2, 0xDFA1, 0xDFFE, 0x2E30, 0x8EA2, 0xE0A1, 0xE0FE, 0x2E8E,

+    0x8EA2, 0xE1A1, 0xE1FE, 0x2EEC, 0x8EA2, 0xE2A1, 0xE2FE, 0x2F4A,

+    0x8EA2, 0xE3A1, 0xE3FE, 0x2FA8, 0x8EA2, 0xE4A1, 0xE4FE, 0x3006,

+    0x8EA2, 0xE5A1, 0xE5FE, 0x3064, 0x8EA2, 0xE6A1, 0xE6FE, 0x30C2,

+    0x8EA2, 0xE7A1, 0xE7FE, 0x3120, 0x8EA2, 0xE8A1, 0xE8FE, 0x317E,

+    0x8EA2, 0xE9A1, 0xE9FE, 0x31DC, 0x8EA2, 0xEAA1, 0xEAFE, 0x323A,

+    0x8EA2, 0xEBA1, 0xEBFE, 0x3298, 0x8EA2, 0xECA1, 0xECFE, 0x32F6,

+    0x8EA2, 0xEDA1, 0xEDFE, 0x3354, 0x8EA2, 0xEEA1, 0xEEFE, 0x33B2,

+    0x8EA2, 0xEFA1, 0xEFFE, 0x3410, 0x8EA2, 0xF0A1, 0xF0FE, 0x346E,

+    0x8EA2, 0xF1A1, 0xF1FE, 0x34CC, 0x8EA2, 0xF2A1, 0xF2C4, 0x352A,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp
new file mode 100644
index 0000000..8737cf4
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp
@@ -0,0 +1,201 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_CNS_EUC_V_0[180 * 3] = {

+    0x0020, 0x007E, 0x3550, 0xA1A1, 0xA1AB, 0x0063, 0xA1AC, 0xA1AC, 0x354E,

+    0xA1AD, 0xA1BA, 0x006F, 0xA1BB, 0xA1BB, 0x007C, 0xA1BC, 0xA1BC, 0x007E,

+    0xA1BD, 0xA1BD, 0x007E, 0xA1BE, 0xA1BF, 0x0082, 0xA1C0, 0xA1C1, 0x0082,

+    0xA1C2, 0xA1C3, 0x0086, 0xA1C4, 0xA1C5, 0x0086, 0xA1C6, 0xA1C7, 0x008A,

+    0xA1C8, 0xA1C9, 0x008A, 0xA1CA, 0xA1CB, 0x008E, 0xA1CC, 0xA1CD, 0x008E,

+    0xA1CE, 0xA1CF, 0x0092, 0xA1D0, 0xA1D1, 0x0092, 0xA1D2, 0xA1D3, 0x0096,

+    0xA1D4, 0xA1D5, 0x0096, 0xA1D6, 0xA1D7, 0x009A, 0xA1D8, 0xA1D9, 0x009A,

+    0xA1DA, 0xA1DB, 0x009E, 0xA1DC, 0xA1FE, 0x009E, 0xA2A1, 0xA2C3, 0x00C1,

+    0xA2C4, 0xA2C4, 0x354F, 0xA2C5, 0xA2FE, 0x00E5, 0xA3A1, 0xA3CE, 0x011F,

+    0xA4A1, 0xA4FE, 0x014D, 0xA5A1, 0xA5EC, 0x01AB, 0xA5EE, 0xA5F0, 0x01F7,

+    0xA6A1, 0xA6BE, 0x01FA, 0xA7A1, 0xA7A1, 0x0253, 0xA7A2, 0xA7A4, 0x0218,

+    0xA7A5, 0xA7A5, 0x0254, 0xA7A6, 0xA7A6, 0x021B, 0xA7A7, 0xA7A7, 0x025A,

+    0xA7A8, 0xA7A8, 0x021C, 0xA7A9, 0xA7AC, 0x025B, 0xA7AD, 0xA7AF, 0x021D,

+    0xA7B0, 0xA7B0, 0x025F, 0xA7B1, 0xA7B1, 0x176E, 0xA7B2, 0xA7B2, 0x0260,

+    0xA7B3, 0xA7B3, 0x0262, 0xA7B4, 0xA7B4, 0x0220, 0xA7B5, 0xA7B5, 0x0263,

+    0xA7B6, 0xA7B6, 0x176F, 0xA7B7, 0xA7B7, 0x0221, 0xA7B8, 0xA7B9, 0x0264,

+    0xA7BA, 0xA7BA, 0x0222, 0xA7BB, 0xA7BB, 0x1770, 0xA7BC, 0xA7BC, 0x0223,

+    0xA7BD, 0xA7BD, 0x0266, 0xA7BE, 0xA7BE, 0x0279, 0xA7BF, 0xA7BF, 0x1775,

+    0xA7C0, 0xA7C1, 0x027A, 0xA7C2, 0xA7C2, 0x0224, 0xA7C3, 0xA7C6, 0x027C,

+    0xA7C7, 0xA7C7, 0x0225, 0xA7C8, 0xA7CB, 0x0282, 0xA7CC, 0xA7CC, 0x1776,

+    0xA7CD, 0xA7CD, 0x0286, 0xA7CE, 0xA7CE, 0x0226, 0xA7CF, 0xA7D0, 0x0288,

+    0xA7D1, 0xA7D2, 0x028C, 0xA7D3, 0xA7D5, 0x0227, 0xA7D6, 0xA7D8, 0x028E,

+    0xA7D9, 0xA7DA, 0x022A, 0xA7DB, 0xA7DB, 0x1777, 0xA7DC, 0xA7DF, 0x02D0,

+    0xA7E0, 0xA7E0, 0x02D5, 0xA7E1, 0xA7E1, 0x022C, 0xA7E2, 0xA7E5, 0x02D6,

+    0xA7E6, 0xA7E6, 0x022D, 0xA7E7, 0xA7ED, 0x02DA, 0xA7EE, 0xA7EE, 0x178A,

+    0xA7EF, 0xA7F2, 0x02E1, 0xA7F3, 0xA7F3, 0x178C, 0xA7F4, 0xA7F8, 0x02E5,

+    0xA7F9, 0xA7F9, 0x178D, 0xA7FA, 0xA7FD, 0x02EA, 0xA7FE, 0xA7FE, 0x0356,

+    0xA8A1, 0xA8A6, 0x0357, 0xA8A7, 0xA8A7, 0x035E, 0xA8A8, 0xA8A8, 0x0362,

+    0xA8A9, 0xA8AA, 0x022E, 0xA8AB, 0xA8B2, 0x0363, 0xA8B3, 0xA8B3, 0x17B2,

+    0xA8B4, 0xA8B6, 0x036B, 0xA8B7, 0xA8BA, 0x03F6, 0xA8BB, 0xA8BB, 0x1812,

+    0xA8BC, 0xA8BE, 0x03FA, 0xA8BF, 0xA8C3, 0x03FE, 0xA8C4, 0xA8CC, 0x0405,

+    0xA8CD, 0xA8CD, 0x1813, 0xA8CE, 0xA8CE, 0x1818, 0xA8CF, 0xA8D2, 0x040F,

+    0xA8D3, 0xA8D3, 0x1819, 0xA8D4, 0xA8D9, 0x0508, 0xA8DA, 0xA8DA, 0x18E7,

+    0xA8DB, 0xA8E2, 0x050E, 0xA8E3, 0xA8E3, 0x0230, 0xA8E4, 0xA8E4, 0x051B,

+    0xA8E5, 0xA8E7, 0x0520, 0xA8E8, 0xA8EB, 0x0696, 0xA8EC, 0xA8EC, 0x0231,

+    0xA8ED, 0xA8F0, 0x069F, 0xA8F1, 0xA8FB, 0x0826, 0xA8FC, 0xA8FE, 0x09F5,

+    0xA9A1, 0xA9A1, 0x1E33, 0xA9A2, 0xA9A2, 0x09F8, 0xA9A3, 0xA9A3, 0x1E34,

+    0xA9A4, 0xA9A5, 0x09F9, 0xA9A6, 0xA9AB, 0x0BE1, 0xA9AC, 0xA9AE, 0x0DBB,

+    0xA9AF, 0xA9AF, 0x2360, 0xA9B0, 0xA9B0, 0x2612, 0xA9B1, 0xA9B3, 0x0F7B,

+    0xA9B4, 0xA9B5, 0x1100, 0xA9B6, 0xA9B6, 0x1289, 0xA9B7, 0xA9B8, 0x13B2,

+    0xA9B9, 0xA9B9, 0x2F0D, 0xC2A1, 0xC2C1, 0x0232, 0xC4A1, 0xC4FE, 0x0253,

+    0xC5A1, 0xC5FE, 0x02B1, 0xC6A1, 0xC6FE, 0x030F, 0xC7A1, 0xC7FE, 0x036D,

+    0xC8A1, 0xC8FE, 0x03CB, 0xC9A1, 0xC9FE, 0x0429, 0xCAA1, 0xCAFE, 0x0487,

+    0xCBA1, 0xCBFE, 0x04E5, 0xCCA1, 0xCCFE, 0x0543, 0xCDA1, 0xCDFE, 0x05A1,

+    0xCEA1, 0xCEFE, 0x05FF, 0xCFA1, 0xCFFE, 0x065D, 0xD0A1, 0xD0FE, 0x06BB,

+    0xD1A1, 0xD1FE, 0x0719, 0xD2A1, 0xD2FE, 0x0777, 0xD3A1, 0xD3FE, 0x07D5,

+    0xD4A1, 0xD4FE, 0x0833, 0xD5A1, 0xD5FE, 0x0891, 0xD6A1, 0xD6FE, 0x08EF,

+    0xD7A1, 0xD7FE, 0x094D, 0xD8A1, 0xD8FE, 0x09AB, 0xD9A1, 0xD9FE, 0x0A09,

+    0xDAA1, 0xDAFE, 0x0A67, 0xDBA1, 0xDBFE, 0x0AC5, 0xDCA1, 0xDCFE, 0x0B23,

+    0xDDA1, 0xDDFE, 0x0B81, 0xDEA1, 0xDEFE, 0x0BDF, 0xDFA1, 0xDFFE, 0x0C3D,

+    0xE0A1, 0xE0FE, 0x0C9B, 0xE1A1, 0xE1FE, 0x0CF9, 0xE2A1, 0xE2FE, 0x0D57,

+    0xE3A1, 0xE3FE, 0x0DB5, 0xE4A1, 0xE4FE, 0x0E13, 0xE5A1, 0xE5FE, 0x0E71,

+    0xE6A1, 0xE6FE, 0x0ECF, 0xE7A1, 0xE7FE, 0x0F2D, 0xE8A1, 0xE8FE, 0x0F8B,

+    0xE9A1, 0xE9FE, 0x0FE9, 0xEAA1, 0xEAFE, 0x1047, 0xEBA1, 0xEBFE, 0x10A5,

+    0xECA1, 0xECFE, 0x1103, 0xEDA1, 0xEDFE, 0x1161, 0xEEA1, 0xEEFE, 0x11BF,

+    0xEFA1, 0xEFFE, 0x121D, 0xF0A1, 0xF0FE, 0x127B, 0xF1A1, 0xF1FE, 0x12D9,

+    0xF2A1, 0xF2FE, 0x1337, 0xF3A1, 0xF3FE, 0x1395, 0xF4A1, 0xF4FE, 0x13F3,

+    0xF5A1, 0xF5FE, 0x1451, 0xF6A1, 0xF6FE, 0x14AF, 0xF7A1, 0xF7FE, 0x150D,

+    0xF8A1, 0xF8FE, 0x156B, 0xF9A1, 0xF9FE, 0x15C9, 0xFAA1, 0xFAFE, 0x1627,

+    0xFBA1, 0xFBFE, 0x1685, 0xFCA1, 0xFCFE, 0x16E3, 0xFDA1, 0xFDCB, 0x1741,

+};

+extern const unsigned short g_FXCMAP_CNS_EUC_V_0_DWord[261 * 4] = {

+    0x8EA1, 0xA1A1, 0xA1AB, 0x0063, 0x8EA1, 0xA1AC, 0xA1AC, 0x354E,

+    0x8EA1, 0xA1AD, 0xA1BA, 0x006F, 0x8EA1, 0xA1BB, 0xA1BB, 0x007C,

+    0x8EA1, 0xA1BC, 0xA1BC, 0x007E, 0x8EA1, 0xA1BD, 0xA1BD, 0x007E,

+    0x8EA1, 0xA1BE, 0xA1BF, 0x0082, 0x8EA1, 0xA1C0, 0xA1C1, 0x0082,

+    0x8EA1, 0xA1C2, 0xA1C3, 0x0086, 0x8EA1, 0xA1C4, 0xA1C5, 0x0086,

+    0x8EA1, 0xA1C6, 0xA1C7, 0x008A, 0x8EA1, 0xA1C8, 0xA1C9, 0x008A,

+    0x8EA1, 0xA1CA, 0xA1CB, 0x008E, 0x8EA1, 0xA1CC, 0xA1CD, 0x008E,

+    0x8EA1, 0xA1CE, 0xA1CF, 0x0092, 0x8EA1, 0xA1D0, 0xA1D1, 0x0092,

+    0x8EA1, 0xA1D2, 0xA1D3, 0x0096, 0x8EA1, 0xA1D4, 0xA1D5, 0x0096,

+    0x8EA1, 0xA1D6, 0xA1D7, 0x009A, 0x8EA1, 0xA1D8, 0xA1D9, 0x009A,

+    0x8EA1, 0xA1DA, 0xA1DB, 0x009E, 0x8EA1, 0xA1DC, 0xA1FE, 0x009E,

+    0x8EA1, 0xA2A1, 0xA2C3, 0x00C1, 0x8EA1, 0xA2C4, 0xA2C4, 0x354F,

+    0x8EA1, 0xA2C5, 0xA2FE, 0x00E5, 0x8EA1, 0xA3A1, 0xA3CE, 0x011F,

+    0x8EA1, 0xA4A1, 0xA4FE, 0x014D, 0x8EA1, 0xA5A1, 0xA5EC, 0x01AB,

+    0x8EA1, 0xA5EE, 0xA5F0, 0x01F7, 0x8EA1, 0xA6A1, 0xA6BE, 0x01FA,

+    0x8EA1, 0xA7A1, 0xA7A1, 0x0253, 0x8EA1, 0xA7A2, 0xA7A4, 0x0218,

+    0x8EA1, 0xA7A5, 0xA7A5, 0x0254, 0x8EA1, 0xA7A6, 0xA7A6, 0x021B,

+    0x8EA1, 0xA7A7, 0xA7A7, 0x025A, 0x8EA1, 0xA7A8, 0xA7A8, 0x021C,

+    0x8EA1, 0xA7A9, 0xA7AC, 0x025B, 0x8EA1, 0xA7AD, 0xA7AF, 0x021D,

+    0x8EA1, 0xA7B0, 0xA7B0, 0x025F, 0x8EA1, 0xA7B1, 0xA7B1, 0x176E,

+    0x8EA1, 0xA7B2, 0xA7B2, 0x0260, 0x8EA1, 0xA7B3, 0xA7B3, 0x0262,

+    0x8EA1, 0xA7B4, 0xA7B4, 0x0220, 0x8EA1, 0xA7B5, 0xA7B5, 0x0263,

+    0x8EA1, 0xA7B6, 0xA7B6, 0x176F, 0x8EA1, 0xA7B7, 0xA7B7, 0x0221,

+    0x8EA1, 0xA7B8, 0xA7B9, 0x0264, 0x8EA1, 0xA7BA, 0xA7BA, 0x0222,

+    0x8EA1, 0xA7BB, 0xA7BB, 0x1770, 0x8EA1, 0xA7BC, 0xA7BC, 0x0223,

+    0x8EA1, 0xA7BD, 0xA7BD, 0x0266, 0x8EA1, 0xA7BE, 0xA7BE, 0x0279,

+    0x8EA1, 0xA7BF, 0xA7BF, 0x1775, 0x8EA1, 0xA7C0, 0xA7C1, 0x027A,

+    0x8EA1, 0xA7C2, 0xA7C2, 0x0224, 0x8EA1, 0xA7C3, 0xA7C6, 0x027C,

+    0x8EA1, 0xA7C7, 0xA7C7, 0x0225, 0x8EA1, 0xA7C8, 0xA7CB, 0x0282,

+    0x8EA1, 0xA7CC, 0xA7CC, 0x1776, 0x8EA1, 0xA7CD, 0xA7CD, 0x0286,

+    0x8EA1, 0xA7CE, 0xA7CE, 0x0226, 0x8EA1, 0xA7CF, 0xA7D0, 0x0288,

+    0x8EA1, 0xA7D1, 0xA7D2, 0x028C, 0x8EA1, 0xA7D3, 0xA7D5, 0x0227,

+    0x8EA1, 0xA7D6, 0xA7D8, 0x028E, 0x8EA1, 0xA7D9, 0xA7DA, 0x022A,

+    0x8EA1, 0xA7DB, 0xA7DB, 0x1777, 0x8EA1, 0xA7DC, 0xA7DF, 0x02D0,

+    0x8EA1, 0xA7E0, 0xA7E0, 0x02D5, 0x8EA1, 0xA7E1, 0xA7E1, 0x022C,

+    0x8EA1, 0xA7E2, 0xA7E5, 0x02D6, 0x8EA1, 0xA7E6, 0xA7E6, 0x022D,

+    0x8EA1, 0xA7E7, 0xA7ED, 0x02DA, 0x8EA1, 0xA7EE, 0xA7EE, 0x178A,

+    0x8EA1, 0xA7EF, 0xA7F2, 0x02E1, 0x8EA1, 0xA7F3, 0xA7F3, 0x178C,

+    0x8EA1, 0xA7F4, 0xA7F8, 0x02E5, 0x8EA1, 0xA7F9, 0xA7F9, 0x178D,

+    0x8EA1, 0xA7FA, 0xA7FD, 0x02EA, 0x8EA1, 0xA7FE, 0xA7FE, 0x0356,

+    0x8EA1, 0xA8A1, 0xA8A6, 0x0357, 0x8EA1, 0xA8A7, 0xA8A7, 0x035E,

+    0x8EA1, 0xA8A8, 0xA8A8, 0x0362, 0x8EA1, 0xA8A9, 0xA8AA, 0x022E,

+    0x8EA1, 0xA8AB, 0xA8B2, 0x0363, 0x8EA1, 0xA8B3, 0xA8B3, 0x17B2,

+    0x8EA1, 0xA8B4, 0xA8B6, 0x036B, 0x8EA1, 0xA8B7, 0xA8BA, 0x03F6,

+    0x8EA1, 0xA8BB, 0xA8BB, 0x1812, 0x8EA1, 0xA8BC, 0xA8BE, 0x03FA,

+    0x8EA1, 0xA8BF, 0xA8C3, 0x03FE, 0x8EA1, 0xA8C4, 0xA8CC, 0x0405,

+    0x8EA1, 0xA8CD, 0xA8CD, 0x1813, 0x8EA1, 0xA8CE, 0xA8CE, 0x1818,

+    0x8EA1, 0xA8CF, 0xA8D2, 0x040F, 0x8EA1, 0xA8D3, 0xA8D3, 0x1819,

+    0x8EA1, 0xA8D4, 0xA8D9, 0x0508, 0x8EA1, 0xA8DA, 0xA8DA, 0x18E7,

+    0x8EA1, 0xA8DB, 0xA8E2, 0x050E, 0x8EA1, 0xA8E3, 0xA8E3, 0x0230,

+    0x8EA1, 0xA8E4, 0xA8E4, 0x051B, 0x8EA1, 0xA8E5, 0xA8E7, 0x0520,

+    0x8EA1, 0xA8E8, 0xA8EB, 0x0696, 0x8EA1, 0xA8EC, 0xA8EC, 0x0231,

+    0x8EA1, 0xA8ED, 0xA8F0, 0x069F, 0x8EA1, 0xA8F1, 0xA8FB, 0x0826,

+    0x8EA1, 0xA8FC, 0xA8FE, 0x09F5, 0x8EA1, 0xA9A1, 0xA9A1, 0x1E33,

+    0x8EA1, 0xA9A2, 0xA9A2, 0x09F8, 0x8EA1, 0xA9A3, 0xA9A3, 0x1E34,

+    0x8EA1, 0xA9A4, 0xA9A5, 0x09F9, 0x8EA1, 0xA9A6, 0xA9AB, 0x0BE1,

+    0x8EA1, 0xA9AC, 0xA9AE, 0x0DBB, 0x8EA1, 0xA9AF, 0xA9AF, 0x2360,

+    0x8EA1, 0xA9B0, 0xA9B0, 0x2612, 0x8EA1, 0xA9B1, 0xA9B3, 0x0F7B,

+    0x8EA1, 0xA9B4, 0xA9B5, 0x1100, 0x8EA1, 0xA9B6, 0xA9B6, 0x1289,

+    0x8EA1, 0xA9B7, 0xA9B8, 0x13B2, 0x8EA1, 0xA9B9, 0xA9B9, 0x2F0D,

+    0x8EA1, 0xC2A1, 0xC2C1, 0x0232, 0x8EA1, 0xC4A1, 0xC4FE, 0x0253,

+    0x8EA1, 0xC5A1, 0xC5FE, 0x02B1, 0x8EA1, 0xC6A1, 0xC6FE, 0x030F,

+    0x8EA1, 0xC7A1, 0xC7FE, 0x036D, 0x8EA1, 0xC8A1, 0xC8FE, 0x03CB,

+    0x8EA1, 0xC9A1, 0xC9FE, 0x0429, 0x8EA1, 0xCAA1, 0xCAFE, 0x0487,

+    0x8EA1, 0xCBA1, 0xCBFE, 0x04E5, 0x8EA1, 0xCCA1, 0xCCFE, 0x0543,

+    0x8EA1, 0xCDA1, 0xCDFE, 0x05A1, 0x8EA1, 0xCEA1, 0xCEFE, 0x05FF,

+    0x8EA1, 0xCFA1, 0xCFFE, 0x065D, 0x8EA1, 0xD0A1, 0xD0FE, 0x06BB,

+    0x8EA1, 0xD1A1, 0xD1FE, 0x0719, 0x8EA1, 0xD2A1, 0xD2FE, 0x0777,

+    0x8EA1, 0xD3A1, 0xD3FE, 0x07D5, 0x8EA1, 0xD4A1, 0xD4FE, 0x0833,

+    0x8EA1, 0xD5A1, 0xD5FE, 0x0891, 0x8EA1, 0xD6A1, 0xD6FE, 0x08EF,

+    0x8EA1, 0xD7A1, 0xD7FE, 0x094D, 0x8EA1, 0xD8A1, 0xD8FE, 0x09AB,

+    0x8EA1, 0xD9A1, 0xD9FE, 0x0A09, 0x8EA1, 0xDAA1, 0xDAFE, 0x0A67,

+    0x8EA1, 0xDBA1, 0xDBFE, 0x0AC5, 0x8EA1, 0xDCA1, 0xDCFE, 0x0B23,

+    0x8EA1, 0xDDA1, 0xDDFE, 0x0B81, 0x8EA1, 0xDEA1, 0xDEFE, 0x0BDF,

+    0x8EA1, 0xDFA1, 0xDFFE, 0x0C3D, 0x8EA1, 0xE0A1, 0xE0FE, 0x0C9B,

+    0x8EA1, 0xE1A1, 0xE1FE, 0x0CF9, 0x8EA1, 0xE2A1, 0xE2FE, 0x0D57,

+    0x8EA1, 0xE3A1, 0xE3FE, 0x0DB5, 0x8EA1, 0xE4A1, 0xE4FE, 0x0E13,

+    0x8EA1, 0xE5A1, 0xE5FE, 0x0E71, 0x8EA1, 0xE6A1, 0xE6FE, 0x0ECF,

+    0x8EA1, 0xE7A1, 0xE7FE, 0x0F2D, 0x8EA1, 0xE8A1, 0xE8FE, 0x0F8B,

+    0x8EA1, 0xE9A1, 0xE9FE, 0x0FE9, 0x8EA1, 0xEAA1, 0xEAFE, 0x1047,

+    0x8EA1, 0xEBA1, 0xEBFE, 0x10A5, 0x8EA1, 0xECA1, 0xECFE, 0x1103,

+    0x8EA1, 0xEDA1, 0xEDFE, 0x1161, 0x8EA1, 0xEEA1, 0xEEFE, 0x11BF,

+    0x8EA1, 0xEFA1, 0xEFFE, 0x121D, 0x8EA1, 0xF0A1, 0xF0FE, 0x127B,

+    0x8EA1, 0xF1A1, 0xF1FE, 0x12D9, 0x8EA1, 0xF2A1, 0xF2FE, 0x1337,

+    0x8EA1, 0xF3A1, 0xF3FE, 0x1395, 0x8EA1, 0xF4A1, 0xF4FE, 0x13F3,

+    0x8EA1, 0xF5A1, 0xF5FE, 0x1451, 0x8EA1, 0xF6A1, 0xF6FE, 0x14AF,

+    0x8EA1, 0xF7A1, 0xF7FE, 0x150D, 0x8EA1, 0xF8A1, 0xF8FE, 0x156B,

+    0x8EA1, 0xF9A1, 0xF9FE, 0x15C9, 0x8EA1, 0xFAA1, 0xFAFE, 0x1627,

+    0x8EA1, 0xFBA1, 0xFBFE, 0x1685, 0x8EA1, 0xFCA1, 0xFCFE, 0x16E3,

+    0x8EA1, 0xFDA1, 0xFDCB, 0x1741, 0x8EA2, 0xA1A1, 0xA1FE, 0x176C,

+    0x8EA2, 0xA2A1, 0xA2FE, 0x17CA, 0x8EA2, 0xA3A1, 0xA3FE, 0x1828,

+    0x8EA2, 0xA4A1, 0xA4FE, 0x1886, 0x8EA2, 0xA5A1, 0xA5FE, 0x18E4,

+    0x8EA2, 0xA6A1, 0xA6FE, 0x1942, 0x8EA2, 0xA7A1, 0xA7FE, 0x19A0,

+    0x8EA2, 0xA8A1, 0xA8FE, 0x19FE, 0x8EA2, 0xA9A1, 0xA9FE, 0x1A5C,

+    0x8EA2, 0xAAA1, 0xAAFE, 0x1ABA, 0x8EA2, 0xABA1, 0xABFE, 0x1B18,

+    0x8EA2, 0xACA1, 0xACFE, 0x1B76, 0x8EA2, 0xADA1, 0xADFE, 0x1BD4,

+    0x8EA2, 0xAEA1, 0xAEFE, 0x1C32, 0x8EA2, 0xAFA1, 0xAFFE, 0x1C90,

+    0x8EA2, 0xB0A1, 0xB0FE, 0x1CEE, 0x8EA2, 0xB1A1, 0xB1FE, 0x1D4C,

+    0x8EA2, 0xB2A1, 0xB2FE, 0x1DAA, 0x8EA2, 0xB3A1, 0xB3FE, 0x1E08,

+    0x8EA2, 0xB4A1, 0xB4FE, 0x1E66, 0x8EA2, 0xB5A1, 0xB5FE, 0x1EC4,

+    0x8EA2, 0xB6A1, 0xB6FE, 0x1F22, 0x8EA2, 0xB7A1, 0xB7FE, 0x1F80,

+    0x8EA2, 0xB8A1, 0xB8FE, 0x1FDE, 0x8EA2, 0xB9A1, 0xB9FE, 0x203C,

+    0x8EA2, 0xBAA1, 0xBAFE, 0x209A, 0x8EA2, 0xBBA1, 0xBBFE, 0x20F8,

+    0x8EA2, 0xBCA1, 0xBCFE, 0x2156, 0x8EA2, 0xBDA1, 0xBDFE, 0x21B4,

+    0x8EA2, 0xBEA1, 0xBEFE, 0x2212, 0x8EA2, 0xBFA1, 0xBFFE, 0x2270,

+    0x8EA2, 0xC0A1, 0xC0FE, 0x22CE, 0x8EA2, 0xC1A1, 0xC1FE, 0x232C,

+    0x8EA2, 0xC2A1, 0xC2FE, 0x238A, 0x8EA2, 0xC3A1, 0xC3FE, 0x23E8,

+    0x8EA2, 0xC4A1, 0xC4FE, 0x2446, 0x8EA2, 0xC5A1, 0xC5FE, 0x24A4,

+    0x8EA2, 0xC6A1, 0xC6FE, 0x2502, 0x8EA2, 0xC7A1, 0xC7FE, 0x2560,

+    0x8EA2, 0xC8A1, 0xC8FE, 0x25BE, 0x8EA2, 0xC9A1, 0xC9FE, 0x261C,

+    0x8EA2, 0xCAA1, 0xCAFE, 0x267A, 0x8EA2, 0xCBA1, 0xCBFE, 0x26D8,

+    0x8EA2, 0xCCA1, 0xCCFE, 0x2736, 0x8EA2, 0xCDA1, 0xCDFE, 0x2794,

+    0x8EA2, 0xCEA1, 0xCEFE, 0x27F2, 0x8EA2, 0xCFA1, 0xCFFE, 0x2850,

+    0x8EA2, 0xD0A1, 0xD0FE, 0x28AE, 0x8EA2, 0xD1A1, 0xD1FE, 0x290C,

+    0x8EA2, 0xD2A1, 0xD2FE, 0x296A, 0x8EA2, 0xD3A1, 0xD3FE, 0x29C8,

+    0x8EA2, 0xD4A1, 0xD4FE, 0x2A26, 0x8EA2, 0xD5A1, 0xD5FE, 0x2A84,

+    0x8EA2, 0xD6A1, 0xD6FE, 0x2AE2, 0x8EA2, 0xD7A1, 0xD7FE, 0x2B40,

+    0x8EA2, 0xD8A1, 0xD8FE, 0x2B9E, 0x8EA2, 0xD9A1, 0xD9FE, 0x2BFC,

+    0x8EA2, 0xDAA1, 0xDAFE, 0x2C5A, 0x8EA2, 0xDBA1, 0xDBFE, 0x2CB8,

+    0x8EA2, 0xDCA1, 0xDCFE, 0x2D16, 0x8EA2, 0xDDA1, 0xDDFE, 0x2D74,

+    0x8EA2, 0xDEA1, 0xDEFE, 0x2DD2, 0x8EA2, 0xDFA1, 0xDFFE, 0x2E30,

+    0x8EA2, 0xE0A1, 0xE0FE, 0x2E8E, 0x8EA2, 0xE1A1, 0xE1FE, 0x2EEC,

+    0x8EA2, 0xE2A1, 0xE2FE, 0x2F4A, 0x8EA2, 0xE3A1, 0xE3FE, 0x2FA8,

+    0x8EA2, 0xE4A1, 0xE4FE, 0x3006, 0x8EA2, 0xE5A1, 0xE5FE, 0x3064,

+    0x8EA2, 0xE6A1, 0xE6FE, 0x30C2, 0x8EA2, 0xE7A1, 0xE7FE, 0x3120,

+    0x8EA2, 0xE8A1, 0xE8FE, 0x317E, 0x8EA2, 0xE9A1, 0xE9FE, 0x31DC,

+    0x8EA2, 0xEAA1, 0xEAFE, 0x323A, 0x8EA2, 0xEBA1, 0xEBFE, 0x3298,

+    0x8EA2, 0xECA1, 0xECFE, 0x32F6, 0x8EA2, 0xEDA1, 0xEDFE, 0x3354,

+    0x8EA2, 0xEEA1, 0xEEFE, 0x33B2, 0x8EA2, 0xEFA1, 0xEFFE, 0x3410,

+    0x8EA2, 0xF0A1, 0xF0FE, 0x346E, 0x8EA2, 0xF1A1, 0xF1FE, 0x34CC,

+    0x8EA2, 0xF2A1, 0xF2C4, 0x352A,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp
new file mode 100644
index 0000000..f1c9483
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp
@@ -0,0 +1,93 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_ETen_B5_H_0[254 * 3] = {

+    0x0020, 0x007E, 0x3550, 0xA140, 0xA158, 0x0063, 0xA159, 0xA15C, 0x35AF,

+    0xA15D, 0xA17E, 0x0080, 0xA1A1, 0xA1F5, 0x00A2, 0xA1F6, 0xA1F6, 0x00F8,

+    0xA1F7, 0xA1F7, 0x00F7, 0xA1F8, 0xA1FE, 0x00F9, 0xA240, 0xA27E, 0x0100,

+    0xA2A1, 0xA2FE, 0x013F, 0xA340, 0xA37E, 0x019D, 0xA3A1, 0xA3BB, 0x01DC,

+    0xA3BD, 0xA3BF, 0x01F7, 0xA440, 0xA47E, 0x0253, 0xA4A1, 0xA4FE, 0x0292,

+    0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, 0xA640, 0xA67E, 0x038D,

+    0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, 0xA7A1, 0xA7FE, 0x0469,

+    0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, 0xA940, 0xA97E, 0x0564,

+    0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, 0xAAA1, 0xAAFE, 0x0640,

+    0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, 0xAC40, 0xAC7E, 0x073B,

+    0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, 0xAD40, 0xAD7E, 0x07D7,

+    0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, 0xAEA1, 0xAEFE, 0x08B3,

+    0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, 0xAFD0, 0xAFFE, 0x0980,

+    0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, 0xB140, 0xB17E, 0x0A4C,

+    0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, 0xB2A1, 0xB2FE, 0x0B28,

+    0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, 0xB440, 0xB47E, 0x0C23,

+    0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, 0xB5A1, 0xB5FE, 0x0CFF,

+    0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, 0xB740, 0xB77E, 0x0DFA,

+    0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, 0xB8A1, 0xB8FE, 0x0ED6,

+    0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, 0xBA40, 0xBA7E, 0x0FD1,

+    0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, 0xBBA1, 0xBBC7, 0x10AD,

+    0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, 0xBCA1, 0xBCFE, 0x114B,

+    0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, 0xBE40, 0xBE51, 0x1246,

+    0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, 0xBEA1, 0xBEFE, 0x1284,

+    0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, 0xC040, 0xC07E, 0x137F,

+    0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, 0xC1A1, 0xC1AA, 0x145B,

+    0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, 0xC2A1, 0xC2CA, 0x14F9,

+    0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, 0xC340, 0xC360, 0x1556,

+    0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, 0xC3B9, 0xC3B9, 0x15AF,

+    0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, 0xC440, 0xC455, 0x15F4,

+    0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, 0xC4A1, 0xC4FE, 0x1632,

+    0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, 0xC640, 0xC67E, 0x172D,

+    0xC6A1, 0xC6BE, 0x01FA, 0xC6BF, 0xC6D7, 0x0219, 0xC6D8, 0xC6DE, 0x35B3,

+    0xC6DF, 0xC6DF, 0x1794, 0xC6E0, 0xC6FE, 0x35BA, 0xC740, 0xC77E, 0x35D9,

+    0xC7A1, 0xC7FE, 0x3618, 0xC840, 0xC87E, 0x3676, 0xC8A1, 0xC8D3, 0x36B5,

+    0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,

+    0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,

+    0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,

+    0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,

+    0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,

+    0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,

+    0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,

+    0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,

+    0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,

+    0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,

+    0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,

+    0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,

+    0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,

+    0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,

+    0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,

+    0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,

+    0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,

+    0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,

+    0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,

+    0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,

+    0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,

+    0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,

+    0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,

+    0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,

+    0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,

+    0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,

+    0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,

+    0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,

+    0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,

+    0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,

+    0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,

+    0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,

+    0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,

+    0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,

+    0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,

+    0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,

+    0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,

+    0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,

+    0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,

+    0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,

+    0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,

+    0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,

+    0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,

+    0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,

+    0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,

+    0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,

+    0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,

+    0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,

+    0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,

+    0xF9D2, 0xF9D5, 0x354A, 0xF9D6, 0xF9FE, 0x36E8,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp
new file mode 100644
index 0000000..e1d9e23
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp
@@ -0,0 +1,13 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_ETen_B5_V_0[13 * 3] = {

+    0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,

+    0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,

+    0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,

+    0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,

+    0xC6E4, 0xC6E5, 0x3711,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp
new file mode 100644
index 0000000..1b5136e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp
@@ -0,0 +1,9 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_ETenms_B5_H_0[1 * 3] = {

+    0x0020, 0x007E, 0x0001,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp
new file mode 100644
index 0000000..1b8ad0e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_ETenms_B5_V_0[18 * 3] = {

+    0xA14B, 0xA14B, 0x354E, 0xA14C, 0xA14C, 0x006D, 0xA156, 0xA156, 0x0138,

+    0xA158, 0xA158, 0x007A, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,

+    0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,

+    0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,

+    0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA17D, 0xA17E, 0x0082,

+    0xA1A1, 0xA1A2, 0x0086, 0xA1A3, 0xA1A4, 0x008A, 0xC6E4, 0xC6E5, 0x3711,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-H_5.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-H_5.cpp
new file mode 100644
index 0000000..287c10e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-H_5.cpp
@@ -0,0 +1,412 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_HKscs_B5_H_5[1210 * 3] = {
+    0x0020, 0x007E, 0x0001, 0x8740, 0x8765, 0x4A15, 0x8767, 0x8779, 0x4A3B,
+    0x8840, 0x8855, 0x44C9, 0x8856, 0x887E, 0x4961, 0x88A1, 0x88A8, 0x498A,
+    0x88A9, 0x88AA, 0x499C, 0x8940, 0x8941, 0x4534, 0x8943, 0x8943, 0x4536,
+    0x8946, 0x8949, 0x4537, 0x894C, 0x894C, 0x453B, 0x894D, 0x894D, 0x43C3,
+    0x894E, 0x8950, 0x453C, 0x8951, 0x8951, 0x439A, 0x8952, 0x897E, 0x453F,
+    0x89A1, 0x89A5, 0x456C, 0x89A6, 0x89A6, 0x43A2, 0x89AB, 0x89AB, 0x43EC,
+    0x89AC, 0x89AC, 0x4571, 0x89AD, 0x89AD, 0x43EB, 0x89AE, 0x89AE, 0x4572,
+    0x89B0, 0x89B2, 0x4573, 0x89B5, 0x89BF, 0x4576, 0x89C1, 0x89C3, 0x4581,
+    0x89C5, 0x89CE, 0x4584, 0x89CF, 0x89CF, 0x43BC, 0x89D0, 0x89D8, 0x458E,
+    0x89D9, 0x89D9, 0x439C, 0x89DA, 0x89DA, 0x4597, 0x89DB, 0x89DB, 0x439E,
+    0x89DC, 0x89DC, 0x4598, 0x89DD, 0x89DD, 0x439F, 0x89DE, 0x89E0, 0x4599,
+    0x89E1, 0x89E1, 0x43A1, 0x89E2, 0x89E2, 0x459C, 0x89E3, 0x89E3, 0x43A3,
+    0x89E4, 0x89E9, 0x459D, 0x89EA, 0x89EB, 0x43A5, 0x89EC, 0x89F9, 0x45A3,
+    0x89FA, 0x89FA, 0x43A9, 0x89FB, 0x89FE, 0x45B1, 0x8A40, 0x8A40, 0x45B5,
+    0x8A41, 0x8A41, 0x4309, 0x8A43, 0x8A4C, 0x430B, 0x8A4D, 0x8A4D, 0x45B6,
+    0x8A4E, 0x8A59, 0x4316, 0x8A5A, 0x8A5A, 0x45B7, 0x8A5B, 0x8A5D, 0x4323,
+    0x8A5E, 0x8A5E, 0x45B8, 0x8A5F, 0x8A62, 0x4327, 0x8A64, 0x8A70, 0x432C,
+    0x8A71, 0x8A71, 0x45B9, 0x8A72, 0x8A74, 0x433A, 0x8A76, 0x8A76, 0x433E,
+    0x8A77, 0x8A77, 0x45BA, 0x8A78, 0x8A79, 0x4340, 0x8A7A, 0x8A7A, 0x45BB,
+    0x8A7B, 0x8A7B, 0x4343, 0x8A7C, 0x8A7C, 0x45BC, 0x8A7D, 0x8A7D, 0x4345,
+    0x8A7E, 0x8A7E, 0x45BD, 0x8AA1, 0x8AA7, 0x4347, 0x8AA8, 0x8AA8, 0x45BE,
+    0x8AA9, 0x8AAA, 0x434F, 0x8AAC, 0x8AB0, 0x4352, 0x8AB2, 0x8AB5, 0x4358,
+    0x8AB6, 0x8AB6, 0x45BF, 0x8AB7, 0x8AB7, 0x435D, 0x8AB8, 0x8AB8, 0x45C0,
+    0x8AB9, 0x8AB9, 0x435F, 0x8ABB, 0x8AC7, 0x4361, 0x8AC9, 0x8ACB, 0x436F,
+    0x8ACC, 0x8ACC, 0x45C1, 0x8ACE, 0x8AD5, 0x4374, 0x8AD6, 0x8AD7, 0x45C2,
+    0x8AD8, 0x8ADC, 0x437E, 0x8ADF, 0x8AE5, 0x4385, 0x8AE6, 0x8AE6, 0x45C4,
+    0x8AE7, 0x8AE7, 0x43DB, 0x8AE8, 0x8AF4, 0x45C5, 0x8AF6, 0x8AFE, 0x45D2,
+    0x8B40, 0x8B40, 0x45DB, 0x8B41, 0x8B42, 0x438C, 0x8B43, 0x8B44, 0x45DC,
+    0x8B45, 0x8B45, 0x438E, 0x8B46, 0x8B46, 0x45DE, 0x8B47, 0x8B47, 0x438F,
+    0x8B48, 0x8B48, 0x45DF, 0x8B49, 0x8B49, 0x4390, 0x8B4A, 0x8B4A, 0x45E0,
+    0x8B4B, 0x8B4B, 0x4391, 0x8B4C, 0x8B4C, 0x45E1, 0x8B4D, 0x8B50, 0x4392,
+    0x8B51, 0x8B53, 0x45E2, 0x8B55, 0x8B57, 0x45E5, 0x8B58, 0x8B58, 0x4397,
+    0x8B59, 0x8B59, 0x45E8, 0x8B5A, 0x8B5A, 0x4398, 0x8B5B, 0x8B5B, 0x43C4,
+    0x8B5C, 0x8B60, 0x45E9, 0x8B61, 0x8B61, 0x43A7, 0x8B62, 0x8B67, 0x45EE,
+    0x8B68, 0x8B68, 0x43AC, 0x8B69, 0x8B7E, 0x45F4, 0x8BA1, 0x8BBF, 0x460A,
+    0x8BC0, 0x8BDC, 0x44DF, 0x8BDE, 0x8BFD, 0x44FC, 0x8C40, 0x8C61, 0x49A1,
+    0x8C62, 0x8C62, 0x4A4E, 0x8C63, 0x8C7E, 0x49C3, 0x8CA1, 0x8CA5, 0x49DF,
+    0x8CA7, 0x8CC5, 0x49E4, 0x8CC9, 0x8CCC, 0x4A03, 0x8CCE, 0x8CDA, 0x4A07,
+    0x8CDB, 0x8CDB, 0x4A4F, 0x8CDC, 0x8CDC, 0x4A14, 0x8CDD, 0x8CE4, 0x4A50,
+    0x8CE6, 0x8CFE, 0x4A58, 0x8D40, 0x8D40, 0x4A71, 0x8D42, 0x8D5F, 0x4A72,
+    0x8D60, 0x8D61, 0x4629, 0x8D62, 0x8D62, 0x43BA, 0x8D63, 0x8D67, 0x462B,
+    0x8D68, 0x8D68, 0x43BB, 0x8D69, 0x8D69, 0x43A0, 0x8D6A, 0x8D6A, 0x43BD,
+    0x8D6B, 0x8D6D, 0x4630, 0x8D6E, 0x8D6E, 0x43BE, 0x8D6F, 0x8D75, 0x4633,
+    0x8D76, 0x8D76, 0x43BF, 0x8D77, 0x8D79, 0x463A, 0x8D7A, 0x8D7A, 0x43C0,
+    0x8D7B, 0x8D7B, 0x463D, 0x8D7C, 0x8D7C, 0x43C1, 0x8D7D, 0x8D7E, 0x463E,
+    0x8DA1, 0x8DA4, 0x4640, 0x8DA5, 0x8DA5, 0x43C2, 0x8DA6, 0x8DA7, 0x4644,
+    0x8DA8, 0x8DA8, 0x43B9, 0x8DA9, 0x8DA9, 0x43AD, 0x8DAA, 0x8DB5, 0x4646,
+    0x8DB6, 0x8DB6, 0x43C7, 0x8DB7, 0x8DC2, 0x4652, 0x8DC3, 0x8DC3, 0x43C8,
+    0x8DC4, 0x8DF9, 0x465E, 0x8DFA, 0x8DFA, 0x43F9, 0x8DFB, 0x8DFE, 0x4694,
+    0x8E40, 0x8E44, 0x372B, 0x8E45, 0x8E45, 0x4698, 0x8E46, 0x8E68, 0x3730,
+    0x8E69, 0x8E69, 0x1055, 0x8E6A, 0x8E6A, 0x3754, 0x8E6B, 0x8E6C, 0x4699,
+    0x8E6D, 0x8E6E, 0x3756, 0x8E6F, 0x8E6F, 0x2DE8, 0x8E70, 0x8E75, 0x3759,
+    0x8E76, 0x8E76, 0x469B, 0x8E77, 0x8E7A, 0x375F, 0x8E7B, 0x8E7B, 0x469C,
+    0x8E7C, 0x8E7D, 0x3764, 0x8E7E, 0x8E7E, 0x0121, 0x8EA1, 0x8EA5, 0x3766,
+    0x8EA6, 0x8EA6, 0x469D, 0x8EA7, 0x8EAA, 0x376B, 0x8EAB, 0x8EAB, 0x106B,
+    0x8EAC, 0x8EB3, 0x3770, 0x8EB4, 0x8EB4, 0x1326, 0x8EB5, 0x8EB7, 0x3779,
+    0x8EB8, 0x8EB8, 0x469E, 0x8EB9, 0x8EC8, 0x377D, 0x8EC9, 0x8EC9, 0x469F,
+    0x8ECA, 0x8ECC, 0x378D, 0x8ECD, 0x8ECD, 0x066B, 0x8ECE, 0x8ECF, 0x3791,
+    0x8ED0, 0x8ED0, 0x132E, 0x8ED1, 0x8EE4, 0x3794, 0x8EE5, 0x8EE5, 0x46A0,
+    0x8EE6, 0x8EEE, 0x37A8, 0x8EEF, 0x8EEF, 0x46A1, 0x8EF0, 0x8EF5, 0x37B1,
+    0x8EF6, 0x8EF6, 0x46A2, 0x8EF7, 0x8EFE, 0x37B8, 0x8F40, 0x8F56, 0x37C0,
+    0x8F57, 0x8F57, 0x0D35, 0x8F58, 0x8F58, 0x37D8, 0x8F59, 0x8F59, 0x46A3,
+    0x8F5A, 0x8F5E, 0x37D9, 0x8F5F, 0x8F5F, 0x46A4, 0x8F60, 0x8F66, 0x37DE,
+    0x8F67, 0x8F67, 0x46A5, 0x8F68, 0x8F68, 0x37E5, 0x8F69, 0x8F69, 0x27C2,
+    0x8F6A, 0x8F6D, 0x37E7, 0x8F6E, 0x8F6E, 0x22AD, 0x8F6F, 0x8F78, 0x37EC,
+    0x8F79, 0x8F79, 0x46A6, 0x8F7A, 0x8F7E, 0x37F7, 0x8FA1, 0x8FAF, 0x37FC,
+    0x8FB0, 0x8FB0, 0x46A7, 0x8FB1, 0x8FC4, 0x380C, 0x8FC5, 0x8FC5, 0x46A8,
+    0x8FC6, 0x8FC6, 0x3820, 0x8FC7, 0x8FC7, 0x46A9, 0x8FC8, 0x8FC9, 0x3821,
+    0x8FCA, 0x8FCA, 0x46AA, 0x8FCB, 0x8FCB, 0x134C, 0x8FCC, 0x8FCC, 0x3FF9,
+    0x8FCD, 0x8FD9, 0x3826, 0x8FDA, 0x8FDA, 0x46AB, 0x8FDB, 0x8FE2, 0x3833,
+    0x8FE3, 0x8FE3, 0x46AC, 0x8FE4, 0x8FFB, 0x383C, 0x8FFC, 0x8FFC, 0x46AD,
+    0x8FFD, 0x8FFD, 0x3854, 0x8FFE, 0x8FFE, 0x09CE, 0x9040, 0x9054, 0x3856,
+    0x9055, 0x9055, 0x46AE, 0x9056, 0x905B, 0x386C, 0x905C, 0x905E, 0x46AF,
+    0x905F, 0x906C, 0x3873, 0x906D, 0x906D, 0x0BC7, 0x906E, 0x906E, 0x3882,
+    0x906F, 0x906F, 0x46B2, 0x9070, 0x9079, 0x3883, 0x907A, 0x907A, 0x36E9,
+    0x907B, 0x907E, 0x388D, 0x90A1, 0x90A5, 0x3891, 0x90A6, 0x90A6, 0x46B3,
+    0x90A7, 0x90B7, 0x3896, 0x90B8, 0x90B8, 0x46B4, 0x90B9, 0x90DB, 0x38A7,
+    0x90DC, 0x90DC, 0x1391, 0x90DD, 0x90F0, 0x38CB, 0x90F1, 0x90F1, 0x16A4,
+    0x90F2, 0x90FE, 0x38E0, 0x9140, 0x9164, 0x38ED, 0x9165, 0x9165, 0x46B5,
+    0x9166, 0x916D, 0x3912, 0x916E, 0x916E, 0x46B6, 0x916F, 0x917D, 0x391A,
+    0x917E, 0x917E, 0x46B7, 0x91A1, 0x91A1, 0x3929, 0x91A2, 0x91A2, 0x46B8,
+    0x91A3, 0x91BE, 0x392A, 0x91BF, 0x91BF, 0x3072, 0x91C0, 0x91C7, 0x3947,
+    0x91C8, 0x91C8, 0x46B9, 0x91C9, 0x91FE, 0x3950, 0x9240, 0x9243, 0x3986,
+    0x9244, 0x9244, 0x3988, 0x9245, 0x9263, 0x398B, 0x9264, 0x9264, 0x46BA,
+    0x9265, 0x926C, 0x39AB, 0x926D, 0x926D, 0x46BB, 0x926E, 0x927E, 0x39B4,
+    0x92A1, 0x92AE, 0x39C5, 0x92AF, 0x92B0, 0x0119, 0x92B1, 0x92B1, 0x011C,
+    0x92B2, 0x92B2, 0x011B, 0x92B3, 0x92C7, 0x39D3, 0x92C8, 0x92C8, 0x3FAC,
+    0x92C9, 0x92D0, 0x39E9, 0x92D1, 0x92D1, 0x297C, 0x92D2, 0x92E4, 0x39F2,
+    0x92E5, 0x92E5, 0x46BC, 0x92E6, 0x92F1, 0x3A05, 0x92F2, 0x92F2, 0x46BD,
+    0x92F3, 0x92FE, 0x3A11, 0x9340, 0x9367, 0x3A1D, 0x9368, 0x9368, 0x46BE,
+    0x9369, 0x937E, 0x3A45, 0x93A1, 0x93A9, 0x3A5B, 0x93AA, 0x93AA, 0x46BF,
+    0x93AB, 0x93C1, 0x3A64, 0x93C2, 0x93C2, 0x46C0, 0x93C3, 0x93E4, 0x3A7B,
+    0x93E5, 0x93E5, 0x46C1, 0x93E6, 0x93E7, 0x3A9D, 0x93E8, 0x93E8, 0x46C2,
+    0x93E9, 0x93EA, 0x3AA0, 0x93EB, 0x93EB, 0x46C3, 0x93EC, 0x93FE, 0x3AA2,
+    0x9440, 0x9445, 0x3AB5, 0x9446, 0x9446, 0x46C4, 0x9447, 0x9447, 0x1D06,
+    0x9448, 0x9478, 0x3ABC, 0x9479, 0x9479, 0x46C5, 0x947A, 0x947E, 0x3AEE,
+    0x94A1, 0x94C9, 0x3AF3, 0x94CA, 0x94CA, 0x29A1, 0x94CB, 0x94CB, 0x46C6,
+    0x94CC, 0x94FE, 0x3B1E, 0x9540, 0x954C, 0x3B51, 0x954D, 0x954D, 0x46C7,
+    0x954E, 0x9559, 0x3B5E, 0x955A, 0x955A, 0x46C8, 0x955B, 0x955E, 0x3B6A,
+    0x955F, 0x955F, 0x46C9, 0x9560, 0x957E, 0x3B6F, 0x95A1, 0x95C5, 0x3B8E,
+    0x95C6, 0x95C6, 0x46CA, 0x95C7, 0x95D8, 0x3BB3, 0x95D9, 0x95D9, 0x181B,
+    0x95DA, 0x95FE, 0x3BC6, 0x9640, 0x9643, 0x3BEB, 0x9644, 0x9644, 0x3E2F,
+    0x9645, 0x9650, 0x3BF0, 0x9651, 0x9651, 0x46CB, 0x9652, 0x9669, 0x3BFD,
+    0x966A, 0x966A, 0x46CC, 0x966B, 0x967E, 0x3C16, 0x96A1, 0x96D3, 0x3C2A,
+    0x96D4, 0x96D4, 0x46CD, 0x96D5, 0x96EC, 0x3C5D, 0x96ED, 0x96ED, 0x3C76,
+    0x96EE, 0x96FB, 0x3C76, 0x96FC, 0x96FC, 0x2B24, 0x96FD, 0x96FE, 0x3C85,
+    0x9740, 0x977E, 0x3C87, 0x97A1, 0x97FE, 0x3CC6, 0x9840, 0x9843, 0x3D24,
+    0x9844, 0x9845, 0x46CE, 0x9846, 0x986E, 0x3D2A, 0x986F, 0x986F, 0x46D0,
+    0x9870, 0x9874, 0x3D54, 0x9875, 0x9876, 0x46D1, 0x9877, 0x9877, 0x3D59,
+    0x9878, 0x9879, 0x46D3, 0x987A, 0x987A, 0x3D5A, 0x987B, 0x987E, 0x46D5,
+    0x98A1, 0x98A2, 0x46D9, 0x98A3, 0x98A3, 0x3D5B, 0x98A4, 0x98AE, 0x46DB,
+    0x98AF, 0x98AF, 0x3D5C, 0x98B0, 0x98B3, 0x46E6, 0x98B4, 0x98B4, 0x43CA,
+    0x98B5, 0x98B5, 0x46EA, 0x98B6, 0x98B6, 0x3D5D, 0x98B7, 0x98B7, 0x46EB,
+    0x98B8, 0x98B8, 0x43CC, 0x98B9, 0x98B9, 0x3D5E, 0x98BA, 0x98BA, 0x46EC,
+    0x98BB, 0x98BB, 0x43FA, 0x98BC, 0x98BC, 0x46ED, 0x98BD, 0x98BE, 0x3D5F,
+    0x98BF, 0x98C1, 0x46EE, 0x98C2, 0x98C2, 0x3D61, 0x98C3, 0x98C3, 0x46F1,
+    0x98C4, 0x98C4, 0x3D62, 0x98C5, 0x98C5, 0x46F2, 0x98C6, 0x98C7, 0x3D63,
+    0x98C8, 0x98D1, 0x46F3, 0x98D2, 0x98D2, 0x43CD, 0x98D3, 0x98D7, 0x46FD,
+    0x98D8, 0x98D9, 0x43CE, 0x98DA, 0x98DA, 0x4702, 0x98DB, 0x98DB, 0x43D1,
+    0x98DC, 0x98DE, 0x4703, 0x98DF, 0x98DF, 0x43D4, 0x98E0, 0x98E2, 0x4706,
+    0x98E3, 0x98E3, 0x3D65, 0x98E4, 0x98E6, 0x4709, 0x98E7, 0x98E7, 0x3D66,
+    0x98E8, 0x98EC, 0x470C, 0x98ED, 0x98ED, 0x3D67, 0x98EE, 0x98EF, 0x4711,
+    0x98F0, 0x98F0, 0x3D68, 0x98F1, 0x98F1, 0x4713, 0x98F2, 0x98F2, 0x3D69,
+    0x98F3, 0x98F3, 0x4714, 0x98F4, 0x98F5, 0x43D5, 0x98F6, 0x98FB, 0x4715,
+    0x98FC, 0x98FC, 0x3D6A, 0x98FD, 0x98FD, 0x471B, 0x98FE, 0x98FE, 0x43D7,
+    0x9940, 0x9941, 0x471C, 0x9942, 0x9942, 0x43FC, 0x9943, 0x9943, 0x3D6B,
+    0x9944, 0x9944, 0x471E, 0x9945, 0x9945, 0x3D6C, 0x9946, 0x9946, 0x471F,
+    0x9947, 0x9947, 0x43D8, 0x9948, 0x994E, 0x4720, 0x994F, 0x994F, 0x3D6D,
+    0x9950, 0x9953, 0x4727, 0x9954, 0x9954, 0x43D9, 0x9955, 0x995B, 0x472B,
+    0x995C, 0x995C, 0x43DA, 0x995D, 0x9963, 0x4732, 0x9964, 0x9964, 0x43DC,
+    0x9965, 0x9969, 0x4739, 0x996A, 0x996A, 0x3D6E, 0x996B, 0x996D, 0x473E,
+    0x996E, 0x996E, 0x3D6F, 0x996F, 0x9974, 0x4741, 0x9975, 0x9975, 0x3D70,
+    0x9976, 0x9977, 0x4747, 0x9978, 0x9978, 0x3D71, 0x9979, 0x997E, 0x4749,
+    0x99A1, 0x99A1, 0x474F, 0x99A2, 0x99A2, 0x3D72, 0x99A3, 0x99A3, 0x4750,
+    0x99A4, 0x99A4, 0x43C5, 0x99A5, 0x99A5, 0x4751, 0x99A6, 0x99A6, 0x43C6,
+    0x99A7, 0x99AD, 0x4752, 0x99AE, 0x99AE, 0x3D73, 0x99AF, 0x99B1, 0x4759,
+    0x99B2, 0x99B2, 0x43DE, 0x99B3, 0x99B5, 0x475C, 0x99B6, 0x99B6, 0x3D74,
+    0x99B7, 0x99B9, 0x475F, 0x99BA, 0x99BA, 0x3D75, 0x99BB, 0x99C9, 0x4762,
+    0x99CA, 0x99CA, 0x43E0, 0x99CB, 0x99CC, 0x4771, 0x99CD, 0x99CD, 0x43E2,
+    0x99CE, 0x99D2, 0x4773, 0x99D3, 0x99D3, 0x43E3, 0x99D4, 0x99D5, 0x4778,
+    0x99D6, 0x99D6, 0x43E5, 0x99D7, 0x99DE, 0x477A, 0x99DF, 0x99DF, 0x43DF,
+    0x99E0, 0x99E1, 0x4782, 0x99E2, 0x99E2, 0x3D76, 0x99E3, 0x99E3, 0x4784,
+    0x99E4, 0x99E4, 0x43AB, 0x99E5, 0x99E5, 0x4785, 0x99E6, 0x99E6, 0x43E7,
+    0x99E7, 0x99E7, 0x4786, 0x99E8, 0x99E8, 0x43E9, 0x99E9, 0x99EE, 0x4787,
+    0x99EF, 0x99EF, 0x43FD, 0x99F0, 0x99F3, 0x478D, 0x99F4, 0x99F4, 0x3D77,
+    0x99F5, 0x99FE, 0x4791, 0x9A40, 0x9A49, 0x479B, 0x9A4A, 0x9A4A, 0x3D78,
+    0x9A4B, 0x9A4B, 0x47A5, 0x9A4C, 0x9A4C, 0x3D79, 0x9A4D, 0x9A58, 0x47A6,
+    0x9A59, 0x9A59, 0x3D7A, 0x9A5A, 0x9A5E, 0x47B2, 0x9A5F, 0x9A5F, 0x43AF,
+    0x9A60, 0x9A60, 0x47B7, 0x9A61, 0x9A61, 0x3D7B, 0x9A62, 0x9A65, 0x47B8,
+    0x9A66, 0x9A66, 0x43ED, 0x9A67, 0x9A67, 0x47BC, 0x9A68, 0x9A68, 0x3D7C,
+    0x9A69, 0x9A69, 0x43EE, 0x9A6A, 0x9A6A, 0x47BD, 0x9A6B, 0x9A6B, 0x43FF,
+    0x9A6C, 0x9A72, 0x47BE, 0x9A73, 0x9A73, 0x3D7D, 0x9A74, 0x9A74, 0x47C5,
+    0x9A75, 0x9A75, 0x43F1, 0x9A76, 0x9A7D, 0x47C6, 0x9A7E, 0x9A7E, 0x3D7E,
+    0x9AA1, 0x9AA2, 0x47CE, 0x9AA3, 0x9AA3, 0x43F3, 0x9AA4, 0x9AA4, 0x47D0,
+    0x9AA5, 0x9AA5, 0x43F2, 0x9AA6, 0x9AA8, 0x47D1, 0x9AA9, 0x9AA9, 0x43F8,
+    0x9AAA, 0x9AAA, 0x43F4, 0x9AAB, 0x9AB1, 0x47D4, 0x9AB2, 0x9AB2, 0x3D7F,
+    0x9AB3, 0x9AB6, 0x47DB, 0x9AB7, 0x9AB7, 0x3D80, 0x9AB8, 0x9AB8, 0x47DF,
+    0x9AB9, 0x9AB9, 0x3D81, 0x9ABA, 0x9ABA, 0x47E0, 0x9ABB, 0x9ABB, 0x3D82,
+    0x9ABC, 0x9ABC, 0x47E1, 0x9ABD, 0x9ABD, 0x43B7, 0x9ABE, 0x9AC6, 0x47E2,
+    0x9AC7, 0x9AC7, 0x3D83, 0x9AC8, 0x9ACF, 0x47EB, 0x9AD0, 0x9AD0, 0x3D84,
+    0x9AD1, 0x9AD1, 0x47F3, 0x9AD2, 0x9AD2, 0x3D85, 0x9AD3, 0x9AD8, 0x47F4,
+    0x9AD9, 0x9ADB, 0x3D86, 0x9ADC, 0x9AE1, 0x47FA, 0x9AE2, 0x9AE2, 0x3D89,
+    0x9AE3, 0x9AE3, 0x4800, 0x9AE4, 0x9AE4, 0x3D8A, 0x9AE5, 0x9AE7, 0x4801,
+    0x9AE8, 0x9AE8, 0x3D8B, 0x9AE9, 0x9AE9, 0x43B0, 0x9AEA, 0x9AED, 0x4804,
+    0x9AEE, 0x9AEE, 0x43B2, 0x9AEF, 0x9AF1, 0x4808, 0x9AF2, 0x9AF2, 0x3D8C,
+    0x9AF3, 0x9AF5, 0x480B, 0x9AF6, 0x9AF6, 0x3D8D, 0x9AF7, 0x9AFA, 0x480E,
+    0x9AFB, 0x9AFB, 0x3D8E, 0x9AFC, 0x9AFE, 0x4812, 0x9B40, 0x9B45, 0x4815,
+    0x9B46, 0x9B46, 0x3D8F, 0x9B47, 0x9B49, 0x481B, 0x9B4A, 0x9B4A, 0x3D90,
+    0x9B4B, 0x9B53, 0x481E, 0x9B54, 0x9B54, 0x3D92, 0x9B55, 0x9B57, 0x4827,
+    0x9B58, 0x9B58, 0x3D93, 0x9B59, 0x9B59, 0x482A, 0x9B5A, 0x9B5A, 0x3D94,
+    0x9B5B, 0x9B5B, 0x482B, 0x9B5C, 0x9B5C, 0x3D95, 0x9B5D, 0x9B5D, 0x482C,
+    0x9B5E, 0x9B5F, 0x3D96, 0x9B60, 0x9B60, 0x482D, 0x9B62, 0x9B6F, 0x482E,
+    0x9B70, 0x9B73, 0x3D98, 0x9B74, 0x9B75, 0x483C, 0x9B76, 0x9B76, 0x2F50,
+    0x9B77, 0x9B77, 0x3D9D, 0x9B78, 0x9B78, 0x1725, 0x9B79, 0x9B7A, 0x483E,
+    0x9B7B, 0x9B7B, 0x32ED, 0x9B7C, 0x9B7C, 0x3DA0, 0x9B7D, 0x9B7D, 0x4840,
+    0x9B7E, 0x9B7E, 0x3DA1, 0x9BA1, 0x9BA1, 0x3DA2, 0x9BA2, 0x9BA2, 0x4841,
+    0x9BA3, 0x9BA4, 0x3DA3, 0x9BA5, 0x9BA6, 0x4842, 0x9BA7, 0x9BAA, 0x3DA5,
+    0x9BAB, 0x9BAB, 0x4844, 0x9BAC, 0x9BAC, 0x3DA9, 0x9BAD, 0x9BAE, 0x4845,
+    0x9BAF, 0x9BAF, 0x3DAA, 0x9BB0, 0x9BB1, 0x4847, 0x9BB2, 0x9BB9, 0x3DAB,
+    0x9BBA, 0x9BBD, 0x4849, 0x9BBE, 0x9BBE, 0x3DB3, 0x9BBF, 0x9BBF, 0x484D,
+    0x9BC0, 0x9BC5, 0x3DB4, 0x9BC6, 0x9BC6, 0x2AD9, 0x9BC7, 0x9BC9, 0x484E,
+    0x9BCA, 0x9BCA, 0x3DBB, 0x9BCB, 0x9BCB, 0x4851, 0x9BCC, 0x9BCC, 0x3DBC,
+    0x9BCD, 0x9BCD, 0x4852, 0x9BCE, 0x9BCE, 0x43D0, 0x9BCF, 0x9BCF, 0x4853,
+    0x9BD0, 0x9BD1, 0x3DBD, 0x9BD2, 0x9BD2, 0x4854, 0x9BD3, 0x9BD3, 0x3DBF,
+    0x9BD4, 0x9BD4, 0x4855, 0x9BD5, 0x9BD5, 0x3DC0, 0x9BD6, 0x9BD7, 0x4856,
+    0x9BD8, 0x9BDA, 0x3DC1, 0x9BDB, 0x9BDC, 0x4858, 0x9BDD, 0x9BDD, 0x3DC4,
+    0x9BDE, 0x9BDE, 0x1C14, 0x9BDF, 0x9BDF, 0x3DC5, 0x9BE0, 0x9BE0, 0x485A,
+    0x9BE1, 0x9BE1, 0x3DC6, 0x9BE2, 0x9BE2, 0x485B, 0x9BE3, 0x9BE3, 0x3DC7,
+    0x9BE4, 0x9BE6, 0x485C, 0x9BE7, 0x9BE7, 0x3DC8, 0x9BE8, 0x9BE8, 0x485F,
+    0x9BE9, 0x9BEB, 0x3DC9, 0x9BEC, 0x9BEC, 0x41FA, 0x9BED, 0x9BED, 0x4860,
+    0x9BEE, 0x9BEF, 0x3DCD, 0x9BF0, 0x9BF2, 0x4861, 0x9BF3, 0x9BF3, 0x3DCF,
+    0x9BF4, 0x9BF5, 0x4864, 0x9BF6, 0x9BF6, 0x12E9, 0x9BF7, 0x9BF7, 0x4866,
+    0x9BF8, 0x9BF9, 0x3DD1, 0x9BFA, 0x9BFA, 0x4867, 0x9BFB, 0x9BFC, 0x3DD3,
+    0x9BFD, 0x9BFE, 0x4868, 0x9C40, 0x9C41, 0x3DD5, 0x9C42, 0x9C42, 0x2CAE,
+    0x9C43, 0x9C43, 0x486A, 0x9C44, 0x9C46, 0x3DD8, 0x9C47, 0x9C47, 0x486B,
+    0x9C48, 0x9C48, 0x3DDB, 0x9C49, 0x9C49, 0x486C, 0x9C4A, 0x9C4A, 0x3DDC,
+    0x9C4B, 0x9C4C, 0x486D, 0x9C4D, 0x9C52, 0x3DDD, 0x9C53, 0x9C53, 0x1A64,
+    0x9C54, 0x9C54, 0x486F, 0x9C55, 0x9C55, 0x3DE4, 0x9C56, 0x9C56, 0x4870,
+    0x9C57, 0x9C5B, 0x3DE5, 0x9C5C, 0x9C5C, 0x4871, 0x9C5D, 0x9C5D, 0x3DEA,
+    0x9C5E, 0x9C5F, 0x4872, 0x9C60, 0x9C60, 0x3DEB, 0x9C61, 0x9C61, 0x4874,
+    0x9C62, 0x9C62, 0x1404, 0x9C63, 0x9C63, 0x4875, 0x9C64, 0x9C66, 0x3DED,
+    0x9C67, 0x9C67, 0x4876, 0x9C68, 0x9C68, 0x2324, 0x9C69, 0x9C69, 0x4877,
+    0x9C6A, 0x9C6A, 0x3DF1, 0x9C6B, 0x9C6B, 0x346A, 0x9C6C, 0x9C6C, 0x4878,
+    0x9C6D, 0x9C6D, 0x3DF2, 0x9C6E, 0x9C6E, 0x4879, 0x9C6F, 0x9C72, 0x3DF3,
+    0x9C73, 0x9C74, 0x487A, 0x9C75, 0x9C76, 0x3DF7, 0x9C77, 0x9C77, 0x2291,
+    0x9C78, 0x9C78, 0x487C, 0x9C79, 0x9C79, 0x3DFA, 0x9C7A, 0x9C7A, 0x487D,
+    0x9C7B, 0x9C7C, 0x3DFB, 0x9C7D, 0x9C7D, 0x487E, 0x9C7E, 0x9C7E, 0x3DFD,
+    0x9CA1, 0x9CA2, 0x3DFE, 0x9CA3, 0x9CA4, 0x487F, 0x9CA5, 0x9CA5, 0x3E00,
+    0x9CA6, 0x9CA7, 0x4881, 0x9CA8, 0x9CA9, 0x3E01, 0x9CAA, 0x9CAA, 0x4883,
+    0x9CAB, 0x9CAB, 0x3E03, 0x9CAC, 0x9CAC, 0x4884, 0x9CAD, 0x9CAE, 0x3E04,
+    0x9CAF, 0x9CB0, 0x4885, 0x9CB1, 0x9CBA, 0x3E06, 0x9CBB, 0x9CBB, 0x4887,
+    0x9CBC, 0x9CBC, 0x1787, 0x9CBD, 0x9CBD, 0x095F, 0x9CBE, 0x9CC2, 0x3E12,
+    0x9CC3, 0x9CC5, 0x4888, 0x9CC6, 0x9CCD, 0x3E17, 0x9CCE, 0x9CCE, 0x488B,
+    0x9CCF, 0x9CCF, 0x3E1F, 0x9CD0, 0x9CD0, 0x1E99, 0x9CD1, 0x9CD3, 0x3E21,
+    0x9CD4, 0x9CD7, 0x488C, 0x9CD8, 0x9CDA, 0x3E24, 0x9CDB, 0x9CDB, 0x4890,
+    0x9CDC, 0x9CE5, 0x3E27, 0x9CE6, 0x9CE6, 0x4891, 0x9CE7, 0x9CE9, 0x3E31,
+    0x9CEA, 0x9CEA, 0x4892, 0x9CEB, 0x9CEC, 0x3E34, 0x9CED, 0x9CED, 0x4893,
+    0x9CEE, 0x9CF9, 0x3E36, 0x9CFA, 0x9CFC, 0x4894, 0x9CFD, 0x9CFD, 0x3E42,
+    0x9CFE, 0x9CFE, 0x4897, 0x9D40, 0x9D40, 0x43E8, 0x9D41, 0x9D45, 0x4898,
+    0x9D46, 0x9D46, 0x3E43, 0x9D47, 0x9D48, 0x489D, 0x9D49, 0x9D49, 0x3E44,
+    0x9D4A, 0x9D4B, 0x489F, 0x9D4C, 0x9D4D, 0x3E46, 0x9D4E, 0x9D4E, 0x48A1,
+    0x9D4F, 0x9D4F, 0x3E48, 0x9D50, 0x9D50, 0x48A2, 0x9D51, 0x9D51, 0x3E49,
+    0x9D52, 0x9D54, 0x48A3, 0x9D55, 0x9D55, 0x3E4A, 0x9D56, 0x9D56, 0x48A6,
+    0x9D57, 0x9D57, 0x25C1, 0x9D58, 0x9D59, 0x48A7, 0x9D5A, 0x9D5A, 0x0D0C,
+    0x9D5B, 0x9D60, 0x48A9, 0x9D61, 0x9D61, 0x43C9, 0x9D62, 0x9D62, 0x3E4C,
+    0x9D63, 0x9D63, 0x48AF, 0x9D64, 0x9D64, 0x3E4D, 0x9D65, 0x9D77, 0x48B0,
+    0x9D78, 0x9D78, 0x43F5, 0x9D79, 0x9D79, 0x3E4E, 0x9D7A, 0x9D7D, 0x48C3,
+    0x9D7E, 0x9D7E, 0x3E4F, 0x9DA1, 0x9DA4, 0x48C7, 0x9DA5, 0x9DA8, 0x3E50,
+    0x9DA9, 0x9DA9, 0x48CB, 0x9DAA, 0x9DAA, 0x3E54, 0x9DAB, 0x9DAB, 0x48CC,
+    0x9DAC, 0x9DAD, 0x3E55, 0x9DAE, 0x9DAF, 0x48CD, 0x9DB0, 0x9DB0, 0x3E58,
+    0x9DB1, 0x9DB2, 0x48CF, 0x9DB3, 0x9DB3, 0x3E59, 0x9DB4, 0x9DB4, 0x48D1,
+    0x9DB5, 0x9DB5, 0x3E5A, 0x9DB6, 0x9DB6, 0x48D2, 0x9DB7, 0x9DB7, 0x3E5B,
+    0x9DB8, 0x9DBB, 0x48D3, 0x9DBC, 0x9DBD, 0x3E5C, 0x9DBE, 0x9DBE, 0x48D7,
+    0x9DBF, 0x9DC0, 0x3E5E, 0x9DC1, 0x9DC2, 0x48D8, 0x9DC3, 0x9DC3, 0x3E60,
+    0x9DC4, 0x9DC4, 0x05E6, 0x9DC5, 0x9DC6, 0x48DA, 0x9DC7, 0x9DC8, 0x3E62,
+    0x9DC9, 0x9DC9, 0x48DC, 0x9DCA, 0x9DCA, 0x3E64, 0x9DCB, 0x9DCC, 0x48DD,
+    0x9DCD, 0x9DD1, 0x3E65, 0x9DD2, 0x9DD2, 0x48DF, 0x9DD3, 0x9DD5, 0x3E6A,
+    0x9DD6, 0x9DD9, 0x48E0, 0x9DDA, 0x9DFB, 0x3E6D, 0x9DFC, 0x9DFC, 0x48E4,
+    0x9DFD, 0x9DFE, 0x3E8F, 0x9E40, 0x9E42, 0x3E91, 0x9E43, 0x9E43, 0x48E5,
+    0x9E44, 0x9E5E, 0x3E95, 0x9E5F, 0x9E5F, 0x48E6, 0x9E60, 0x9E62, 0x3EB1,
+    0x9E63, 0x9E63, 0x48E7, 0x9E64, 0x9E65, 0x3EB4, 0x9E66, 0x9E67, 0x48E8,
+    0x9E68, 0x9E68, 0x3EB6, 0x9E69, 0x9E69, 0x48EA, 0x9E6A, 0x9E6A, 0x3EB7,
+    0x9E6B, 0x9E70, 0x48EB, 0x9E71, 0x9E71, 0x3EB8, 0x9E72, 0x9E72, 0x48F1,
+    0x9E73, 0x9E73, 0x3EB9, 0x9E74, 0x9E76, 0x48F2, 0x9E77, 0x9E78, 0x3EBA,
+    0x9E79, 0x9E79, 0x48F5, 0x9E7A, 0x9E7A, 0x3EBC, 0x9E7B, 0x9E7B, 0x48F6,
+    0x9E7C, 0x9E7C, 0x3EBD, 0x9E7D, 0x9E7D, 0x48F7, 0x9E7E, 0x9E7E, 0x3EBE,
+    0x9EA1, 0x9EA2, 0x3EBF, 0x9EA3, 0x9EA3, 0x48F8, 0x9EA4, 0x9EA6, 0x3EC1,
+    0x9EA7, 0x9EA8, 0x48F9, 0x9EA9, 0x9EA9, 0x0728, 0x9EAA, 0x9EAA, 0x3EC5,
+    0x9EAB, 0x9EAB, 0x48FB, 0x9EAC, 0x9EAD, 0x3EC6, 0x9EAE, 0x9EAE, 0x48FC,
+    0x9EAF, 0x9EB1, 0x3EC8, 0x9EB2, 0x9EB3, 0x48FD, 0x9EB4, 0x9EB4, 0x3ECB,
+    0x9EB5, 0x9EB5, 0x48FF, 0x9EB6, 0x9EB7, 0x3ECC, 0x9EB8, 0x9EB8, 0x4900,
+    0x9EB9, 0x9EB9, 0x3ECE, 0x9EBA, 0x9EBB, 0x4901, 0x9EBC, 0x9EBC, 0x3ECF,
+    0x9EBD, 0x9EBE, 0x4903, 0x9EBF, 0x9EC0, 0x3ED0, 0x9EC1, 0x9EC3, 0x4905,
+    0x9EC4, 0x9EC5, 0x3ED2, 0x9EC6, 0x9EC6, 0x4908, 0x9EC7, 0x9ECA, 0x3ED4,
+    0x9ECB, 0x9ECC, 0x4909, 0x9ECD, 0x9ECD, 0x3ED9, 0x9ECE, 0x9ECF, 0x490B,
+    0x9ED0, 0x9ED1, 0x3EDA, 0x9ED2, 0x9ED2, 0x490D, 0x9ED3, 0x9ED3, 0x3EDC,
+    0x9ED4, 0x9ED5, 0x490E, 0x9ED6, 0x9ED7, 0x3EDD, 0x9ED8, 0x9ED9, 0x4910,
+    0x9EDA, 0x9EEE, 0x3EDF, 0x9EEF, 0x9EEF, 0x24B6, 0x9EF0, 0x9EF1, 0x3EF5,
+    0x9EF2, 0x9EF2, 0x4912, 0x9EF3, 0x9EF5, 0x3EF7, 0x9EF6, 0x9EF8, 0x4913,
+    0x9EF9, 0x9EFA, 0x3EFA, 0x9EFB, 0x9EFB, 0x4916, 0x9EFC, 0x9EFC, 0x3EFC,
+    0x9EFD, 0x9EFD, 0x1806, 0x9EFE, 0x9EFE, 0x3EFE, 0x9F40, 0x9F42, 0x3EFF,
+    0x9F43, 0x9F43, 0x4917, 0x9F44, 0x9F47, 0x3F02, 0x9F48, 0x9F48, 0x4918,
+    0x9F49, 0x9F4A, 0x3F06, 0x9F4B, 0x9F4C, 0x4919, 0x9F4D, 0x9F5F, 0x3F08,
+    0x9F60, 0x9F60, 0x3511, 0x9F61, 0x9F65, 0x3F1C, 0x9F66, 0x9F66, 0x3945,
+    0x9F67, 0x9F68, 0x491B, 0x9F69, 0x9F6F, 0x3F23, 0x9F70, 0x9F70, 0x491D,
+    0x9F71, 0x9F7E, 0x3F2A, 0x9FA1, 0x9FB4, 0x3F38, 0x9FB5, 0x9FB5, 0x491E,
+    0x9FB6, 0x9FBA, 0x3F4C, 0x9FBB, 0x9FBB, 0x491F, 0x9FBC, 0x9FBE, 0x3F51,
+    0x9FBF, 0x9FBF, 0x4920, 0x9FC0, 0x9FC0, 0x3F54, 0x9FC1, 0x9FC1, 0x4921,
+    0x9FC2, 0x9FCA, 0x3F55, 0x9FCB, 0x9FCB, 0x0F82, 0x9FCC, 0x9FCC, 0x4922,
+    0x9FCD, 0x9FD3, 0x3F60, 0x9FD4, 0x9FD4, 0x4923, 0x9FD5, 0x9FD7, 0x3F68,
+    0x9FD8, 0x9FD8, 0x3A3E, 0x9FD9, 0x9FE3, 0x3F6C, 0x9FE4, 0x9FE4, 0x4924,
+    0x9FE5, 0x9FF8, 0x3F77, 0x9FF9, 0x9FF9, 0x4925, 0x9FFA, 0x9FFE, 0x3F8B,
+    0xA040, 0xA040, 0x4926, 0xA041, 0xA046, 0x3F90, 0xA047, 0xA047, 0x4927,
+    0xA048, 0xA054, 0x3F96, 0xA055, 0xA055, 0x4928, 0xA056, 0xA062, 0x3FA3,
+    0xA063, 0xA063, 0x3811, 0xA064, 0xA06C, 0x3FB1, 0xA06D, 0xA06D, 0x4929,
+    0xA06E, 0xA076, 0x3FBA, 0xA077, 0xA077, 0x05F2, 0xA078, 0xA07A, 0x3FC4,
+    0xA07B, 0xA07B, 0x492A, 0xA07C, 0xA07E, 0x3FC7, 0xA0A1, 0xA0A1, 0x3FCA,
+    0xA0A2, 0xA0A2, 0x492B, 0xA0A3, 0xA0A6, 0x3FCB, 0xA0A7, 0xA0A7, 0x492C,
+    0xA0A8, 0xA0C4, 0x3FCF, 0xA0C5, 0xA0C5, 0x492D, 0xA0C6, 0xA0CF, 0x3FEC,
+    0xA0D0, 0xA0D0, 0x492E, 0xA0D1, 0xA0D4, 0x3FF6, 0xA0D5, 0xA0D5, 0x3AEE,
+    0xA0D6, 0xA0DE, 0x3FFB, 0xA0DF, 0xA0DF, 0x247D, 0xA0E0, 0xA0E2, 0x4005,
+    0xA0E3, 0xA0E3, 0x492F, 0xA0E4, 0xA0E4, 0x3AC9, 0xA0E5, 0xA0E6, 0x4009,
+    0xA0E7, 0xA0ED, 0x4930, 0xA0EE, 0xA0EE, 0x43B4, 0xA0EF, 0xA0F1, 0x4937,
+    0xA0F2, 0xA0F2, 0x43B8, 0xA0F3, 0xA0FE, 0x493A, 0xA140, 0xA158, 0x0063,
+    0xA159, 0xA15C, 0x35AF, 0xA15D, 0xA17E, 0x0080, 0xA1A1, 0xA1F5, 0x00A2,
+    0xA1F6, 0xA1F6, 0x00F8, 0xA1F7, 0xA1F7, 0x00F7, 0xA1F8, 0xA1FE, 0x00F9,
+    0xA240, 0xA27E, 0x0100, 0xA2A1, 0xA2FE, 0x013F, 0xA340, 0xA37E, 0x019D,
+    0xA3A1, 0xA3BB, 0x01DC, 0xA3BD, 0xA3BF, 0x01F7, 0xA440, 0xA47E, 0x0253,
+    0xA4A1, 0xA4FE, 0x0292, 0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F,
+    0xA640, 0xA67E, 0x038D, 0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A,
+    0xA7A1, 0xA7FE, 0x0469, 0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506,
+    0xA940, 0xA97E, 0x0564, 0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601,
+    0xAAA1, 0xAAFE, 0x0640, 0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD,
+    0xAC40, 0xAC7E, 0x073B, 0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F,
+    0xAD40, 0xAD7E, 0x07D7, 0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874,
+    0xAEA1, 0xAEFE, 0x08B3, 0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950,
+    0xAFD0, 0xAFFE, 0x0980, 0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE,
+    0xB140, 0xB17E, 0x0A4C, 0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9,
+    0xB2A1, 0xB2FE, 0x0B28, 0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5,
+    0xB440, 0xB47E, 0x0C23, 0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0,
+    0xB5A1, 0xB5FE, 0x0CFF, 0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C,
+    0xB740, 0xB77E, 0x0DFA, 0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97,
+    0xB8A1, 0xB8FE, 0x0ED6, 0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73,
+    0xBA40, 0xBA7E, 0x0FD1, 0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E,
+    0xBBA1, 0xBBC7, 0x10AD, 0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C,
+    0xBCA1, 0xBCFE, 0x114B, 0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8,
+    0xBE40, 0xBE51, 0x1246, 0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258,
+    0xBEA1, 0xBEFE, 0x1284, 0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321,
+    0xC040, 0xC07E, 0x137F, 0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C,
+    0xC1A1, 0xC1AA, 0x145B, 0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA,
+    0xC2A1, 0xC2CA, 0x14F9, 0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523,
+    0xC340, 0xC360, 0x1556, 0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596,
+    0xC3B9, 0xC3B9, 0x15AF, 0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0,
+    0xC440, 0xC455, 0x15F4, 0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A,
+    0xC4A1, 0xC4FE, 0x1632, 0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF,
+    0xC640, 0xC67E, 0x172D, 0xC6A1, 0xC6BE, 0x01FA, 0xC6BF, 0xC6CE, 0x0219,
+    0xC6D0, 0xC6D2, 0x022A, 0xC6D4, 0xC6D4, 0x022E, 0xC6D6, 0xC6D6, 0x0230,
+    0xC6D8, 0xC6DD, 0x35B3, 0xC6E0, 0xC6FE, 0x35BA, 0xC740, 0xC77E, 0x35D9,
+    0xC7A1, 0xC7FE, 0x3618, 0xC840, 0xC87E, 0x3676, 0xC8A1, 0xC8A4, 0x36B5,
+    0xC8CD, 0xC8D3, 0x36E1, 0xC8D4, 0xC8D6, 0x44C6, 0xC8D7, 0xC8DF, 0x451C,
+    0xC8E0, 0xC8E0, 0x499E, 0xC8E1, 0xC8E8, 0x4525, 0xC8E9, 0xC8E9, 0x499F,
+    0xC8EA, 0xC8F0, 0x452D, 0xC8F1, 0xC8F1, 0x49A0, 0xC8F5, 0xC8FE, 0x4992,
+    0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,
+    0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,
+    0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,
+    0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,
+    0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,
+    0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,
+    0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,
+    0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,
+    0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,
+    0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,
+    0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,
+    0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,
+    0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,
+    0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,
+    0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,
+    0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,
+    0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,
+    0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,
+    0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,
+    0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,
+    0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,
+    0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,
+    0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,
+    0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,
+    0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,
+    0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,
+    0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,
+    0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,
+    0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,
+    0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,
+    0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,
+    0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,
+    0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,
+    0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,
+    0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,
+    0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,
+    0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,
+    0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,
+    0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,
+    0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,
+    0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,
+    0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,
+    0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,
+    0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,
+    0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,
+    0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,
+    0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,
+    0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,
+    0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,
+    0xF9D2, 0xF9D5, 0x354A, 0xF9D6, 0xF9FE, 0x36E8, 0xFA40, 0xFA5E, 0x400B,
+    0xFA5F, 0xFA5F, 0x083A, 0xFA60, 0xFA65, 0x402B, 0xFA66, 0xFA66, 0x09FD,
+    0xFA67, 0xFA7E, 0x4032, 0xFAA1, 0xFAA8, 0x404A, 0xFAA9, 0xFAAA, 0x4946,
+    0xFAAB, 0xFABC, 0x4054, 0xFABD, 0xFABD, 0x030D, 0xFABE, 0xFAC4, 0x4067,
+    0xFAC5, 0xFAC5, 0x016B, 0xFAC6, 0xFAD4, 0x406F, 0xFAD5, 0xFAD5, 0x0860,
+    0xFAD6, 0xFAFE, 0x407F, 0xFB40, 0xFB47, 0x40A8, 0xFB48, 0xFB48, 0x3E82,
+    0xFB49, 0xFB52, 0x40B1, 0xFB53, 0xFB53, 0x4948, 0xFB54, 0xFB6D, 0x40BC,
+    0xFB6E, 0xFB6E, 0x4949, 0xFB6F, 0xFB7E, 0x40D7, 0xFBA1, 0xFBA2, 0x40E7,
+    0xFBA3, 0xFBA3, 0x494A, 0xFBA4, 0xFBB7, 0x40EA, 0xFBB8, 0xFBB8, 0x0C23,
+    0xFBB9, 0xFBBE, 0x40FF, 0xFBBF, 0xFBBF, 0x494B, 0xFBC0, 0xFBCC, 0x4105,
+    0xFBCD, 0xFBCD, 0x494C, 0xFBCE, 0xFBF2, 0x4112, 0xFBF3, 0xFBF3, 0x17E4,
+    0xFBF4, 0xFBF8, 0x4138, 0xFBF9, 0xFBF9, 0x3E8E, 0xFBFA, 0xFBFE, 0x413E,
+    0xFC40, 0xFC49, 0x4143, 0xFC4A, 0xFC4A, 0x494D, 0xFC4B, 0xFC4E, 0x414D,
+    0xFC4F, 0xFC4F, 0x212F, 0xFC50, 0xFC51, 0x4151, 0xFC52, 0xFC52, 0x494E,
+    0xFC53, 0xFC62, 0x4153, 0xFC63, 0xFC63, 0x494F, 0xFC64, 0xFC6B, 0x4163,
+    0xFC6C, 0xFC6C, 0x4001, 0xFC6D, 0xFC6D, 0x4950, 0xFC6E, 0xFC74, 0x416D,
+    0xFC75, 0xFC75, 0x4951, 0xFC76, 0xFC7E, 0x4174, 0xFCA1, 0xFCB8, 0x417D,
+    0xFCB9, 0xFCB9, 0x115F, 0xFCBA, 0xFCBB, 0x4195, 0xFCBC, 0xFCBD, 0x4952,
+    0xFCBE, 0xFCCB, 0x4198, 0xFCCC, 0xFCCC, 0x4954, 0xFCCD, 0xFCE1, 0x41A7,
+    0xFCE2, 0xFCE2, 0x0C79, 0xFCE3, 0xFCE3, 0x4955, 0xFCE4, 0xFCED, 0x41BD,
+    0xFCEE, 0xFCEE, 0x4956, 0xFCEF, 0xFCF0, 0x41C7, 0xFCF1, 0xFCF1, 0x04C3,
+    0xFCF2, 0xFCFE, 0x41CA, 0xFD40, 0xFD48, 0x41D7, 0xFD49, 0xFD49, 0x4957,
+    0xFD4A, 0xFD69, 0x41E0, 0xFD6A, 0xFD6A, 0x4958, 0xFD6B, 0xFD7E, 0x4201,
+    0xFDA1, 0xFDB6, 0x4215, 0xFDB7, 0xFDB7, 0x18BD, 0xFDB8, 0xFDB8, 0x0CBD,
+    0xFDB9, 0xFDBA, 0x422D, 0xFDBB, 0xFDBB, 0x0CA5, 0xFDBC, 0xFDE2, 0x4230,
+    0xFDE3, 0xFDE3, 0x4959, 0xFDE4, 0xFDF0, 0x4258, 0xFDF1, 0xFDF1, 0x0CCE,
+    0xFDF2, 0xFDF2, 0x495A, 0xFDF3, 0xFDFE, 0x4266, 0xFE40, 0xFE51, 0x4272,
+    0xFE52, 0xFE52, 0x3D70, 0xFE53, 0xFE6C, 0x4285, 0xFE6D, 0xFE6D, 0x495B,
+    0xFE6E, 0xFE6E, 0x429F, 0xFE6F, 0xFE6F, 0x0E84, 0xFE70, 0xFE77, 0x42A1,
+    0xFE78, 0xFE78, 0x495C, 0xFE79, 0xFE7E, 0x42A9, 0xFEA1, 0xFEA9, 0x42AF,
+    0xFEAA, 0xFEAA, 0x0120, 0xFEAB, 0xFEDC, 0x42B8, 0xFEDD, 0xFEDD, 0x1BA8,
+    0xFEDE, 0xFEDF, 0x495D, 0xFEE0, 0xFEEC, 0x42EB, 0xFEED, 0xFEEE, 0x495F,
+    0xFEEF, 0xFEFE, 0x42F8,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-V_5.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-V_5.cpp
new file mode 100644
index 0000000..05c52e4
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-V_5.cpp
@@ -0,0 +1,13 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_HKscs_B5_V_5[13 * 3] = {
+    0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,
+    0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,
+    0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,
+    0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,
+    0xC6E4, 0xC6E5, 0x3711,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-H_3.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-H_3.cpp
new file mode 100644
index 0000000..d58b5a3
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-H_3.cpp
@@ -0,0 +1,5481 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniCNS_UCS2_H_3[16418 * 3] = {
+    0x0020, 0x007E, 0x0001, 0x00A2, 0x00A3, 0x0106, 0x00A5, 0x00A5, 0x0104,
+    0x00A7, 0x00A7, 0x00B2, 0x00A8, 0x00A8, 0x35B3, 0x00AC, 0x00AC, 0x36E1,
+    0x00B0, 0x00B0, 0x0118, 0x00B1, 0x00B1, 0x00D4, 0x00B7, 0x00B7, 0x0073,
+    0x00C0, 0x00C0, 0x4964, 0x00C1, 0x00C1, 0x4962, 0x00C8, 0x00C8, 0x4968,
+    0x00C9, 0x00C9, 0x4966, 0x00CA, 0x00CA, 0x4971, 0x00D2, 0x00D2, 0x496C,
+    0x00D3, 0x00D3, 0x496A, 0x00D7, 0x00D7, 0x00D2, 0x00E0, 0x00E0, 0x4975,
+    0x00E1, 0x00E1, 0x4973, 0x00E8, 0x00E8, 0x497A, 0x00E9, 0x00E9, 0x4978,
+    0x00EA, 0x00EA, 0x4990, 0x00EC, 0x00EC, 0x497E, 0x00ED, 0x00ED, 0x497C,
+    0x00F2, 0x00F2, 0x4982, 0x00F3, 0x00F3, 0x4980, 0x00F7, 0x00F7, 0x00D3,
+    0x00F8, 0x00F8, 0x4998, 0x00F9, 0x00F9, 0x4986, 0x00FA, 0x00FA, 0x4984,
+    0x00FC, 0x00FC, 0x498B, 0x0100, 0x0100, 0x4961, 0x0101, 0x0101, 0x4972,
+    0x0112, 0x0112, 0x4965, 0x0113, 0x0113, 0x4977, 0x011A, 0x011A, 0x4967,
+    0x011B, 0x011B, 0x4979, 0x012B, 0x012B, 0x497B, 0x014B, 0x014B, 0x4999,
+    0x014C, 0x014C, 0x4969, 0x014D, 0x014D, 0x497F, 0x0153, 0x0153, 0x4997,
+    0x016B, 0x016B, 0x4983, 0x01CD, 0x01CD, 0x4963, 0x01CE, 0x01CE, 0x4974,
+    0x01D0, 0x01D0, 0x497D, 0x01D1, 0x01D1, 0x496B, 0x01D2, 0x01D2, 0x4981,
+    0x01D4, 0x01D4, 0x4985, 0x01D6, 0x01D6, 0x4987, 0x01D8, 0x01D8, 0x4988,
+    0x01DA, 0x01DA, 0x4989, 0x01DC, 0x01DC, 0x498A, 0x0250, 0x0250, 0x4993,
+    0x0251, 0x0251, 0x4976, 0x0254, 0x0254, 0x4995, 0x025B, 0x025B, 0x4994,
+    0x0261, 0x0261, 0x4991, 0x026A, 0x026A, 0x499B, 0x0275, 0x0275, 0x4996,
+    0x0283, 0x0283, 0x4992, 0x028A, 0x028A, 0x499A, 0x02C6, 0x02C6, 0x35B4,
+    0x02C7, 0x02C7, 0x01F8, 0x02CA, 0x02CA, 0x01F7, 0x02CB, 0x02CB, 0x01F9,
+    0x02D9, 0x02D9, 0x01F6, 0x0308, 0x0308, 0x35B3, 0x0391, 0x03A1, 0x01A1,
+    0x03A3, 0x03A9, 0x01B2, 0x03B1, 0x03C1, 0x01B9, 0x03C3, 0x03C9, 0x01CA,
+    0x0401, 0x0401, 0x3670, 0x0410, 0x0415, 0x366A, 0x0416, 0x0435, 0x3671,
+    0x0436, 0x044F, 0x3692, 0x0451, 0x0451, 0x3691, 0x1EBE, 0x1EBE, 0x496E,
+    0x1EBF, 0x1EBF, 0x498D, 0x1EC0, 0x1EC0, 0x4970, 0x1EC1, 0x1EC1, 0x498F,
+    0x2013, 0x2013, 0x0079, 0x2014, 0x2014, 0x007B, 0x2018, 0x2019, 0x00A6,
+    0x201C, 0x201D, 0x00A8, 0x2022, 0x2022, 0x0068, 0x2025, 0x2025, 0x006F,
+    0x2026, 0x2026, 0x006E, 0x2032, 0x2032, 0x00AD, 0x2035, 0x2035, 0x00AC,
+    0x203B, 0x203B, 0x00B1, 0x203E, 0x203E, 0x00C3, 0x20AC, 0x20AC, 0x44C1,
+    0x2103, 0x2103, 0x010A, 0x2105, 0x2105, 0x00C2, 0x2109, 0x2109, 0x010B,
+    0x2116, 0x2116, 0x36E6, 0x2121, 0x2121, 0x36E7, 0x2160, 0x2169, 0x0157,
+    0x2170, 0x2179, 0x020E, 0x2190, 0x2190, 0x00F8, 0x2191, 0x2191, 0x00F5,
+    0x2192, 0x2192, 0x00F7, 0x2193, 0x2193, 0x00F6, 0x2196, 0x2197, 0x00F9,
+    0x2198, 0x2198, 0x00FC, 0x2199, 0x2199, 0x00FB, 0x21B8, 0x21B9, 0x36AD,
+    0x21E7, 0x21E7, 0x36AC, 0x221A, 0x221A, 0x00D5, 0x221E, 0x221E, 0x00DC,
+    0x221F, 0x221F, 0x00E9, 0x2220, 0x2220, 0x00E8, 0x2223, 0x2223, 0x00FE,
+    0x2225, 0x2225, 0x00FD, 0x2229, 0x222A, 0x00E5, 0x222B, 0x222B, 0x00ED,
+    0x222E, 0x222E, 0x00EE, 0x2234, 0x2234, 0x00F0, 0x2235, 0x2235, 0x00EF,
+    0x223C, 0x223C, 0x00E4, 0x2252, 0x2252, 0x00DD, 0x2260, 0x2260, 0x00DB,
+    0x2261, 0x2261, 0x00DE, 0x2266, 0x2267, 0x00D9, 0x22A5, 0x22A5, 0x00E7,
+    0x22BF, 0x22BF, 0x00EA, 0x2400, 0x241F, 0x0232, 0x2421, 0x2421, 0x0252,
+    0x2460, 0x2469, 0x01FA, 0x2474, 0x247D, 0x0204, 0x2500, 0x2500, 0x0137,
+    0x2502, 0x2502, 0x0138, 0x250C, 0x250C, 0x013A, 0x2510, 0x2510, 0x013B,
+    0x2514, 0x2514, 0x013C, 0x2518, 0x2518, 0x013D, 0x251C, 0x251C, 0x0135,
+    0x2524, 0x2524, 0x0134, 0x252C, 0x252C, 0x0133, 0x2534, 0x2534, 0x0132,
+    0x253C, 0x253C, 0x0131, 0x2550, 0x2550, 0x0142, 0x2551, 0x2551, 0x370A,
+    0x2552, 0x2552, 0x36F8, 0x2553, 0x2553, 0x3701, 0x2554, 0x2554, 0x36EF,
+    0x2555, 0x2555, 0x36FA, 0x2556, 0x2556, 0x3703, 0x2557, 0x2557, 0x36F1,
+    0x2558, 0x2558, 0x36FE, 0x2559, 0x2559, 0x3707, 0x255A, 0x255A, 0x36F5,
+    0x255B, 0x255B, 0x3700, 0x255C, 0x255C, 0x3709, 0x255D, 0x255D, 0x36F7,
+    0x255E, 0x255E, 0x0143, 0x255F, 0x255F, 0x3704, 0x2560, 0x2560, 0x36F2,
+    0x2561, 0x2561, 0x0145, 0x2562, 0x2562, 0x3706, 0x2563, 0x2563, 0x36F4,
+    0x2564, 0x2564, 0x36F9, 0x2565, 0x2565, 0x3702, 0x2566, 0x2566, 0x36F0,
+    0x2567, 0x2567, 0x36FF, 0x2568, 0x2568, 0x3708, 0x2569, 0x2569, 0x36F6,
+    0x256A, 0x256A, 0x0144, 0x256B, 0x256B, 0x3705, 0x256C, 0x256C, 0x36F3,
+    0x256D, 0x256E, 0x013E, 0x256F, 0x256F, 0x0141, 0x2570, 0x2570, 0x0140,
+    0x2571, 0x2573, 0x014A, 0x2581, 0x2588, 0x0122, 0x2589, 0x2589, 0x0130,
+    0x258A, 0x258A, 0x012F, 0x258B, 0x258B, 0x012E, 0x258C, 0x258C, 0x012D,
+    0x258D, 0x258D, 0x012C, 0x258E, 0x258E, 0x012B, 0x258F, 0x258F, 0x012A,
+    0x2593, 0x2593, 0x3710, 0x2594, 0x2594, 0x0136, 0x2595, 0x2595, 0x0139,
+    0x25A0, 0x25A0, 0x00BE, 0x25A1, 0x25A1, 0x00BD, 0x25B2, 0x25B2, 0x00B7,
+    0x25B3, 0x25B3, 0x00B6, 0x25BC, 0x25BC, 0x00C0, 0x25BD, 0x25BD, 0x00BF,
+    0x25C6, 0x25C6, 0x00BC, 0x25C7, 0x25C7, 0x00BB, 0x25CB, 0x25CB, 0x00B4,
+    0x25CE, 0x25CE, 0x00B8, 0x25CF, 0x25CF, 0x00B5, 0x25E2, 0x25E3, 0x0146,
+    0x25E4, 0x25E4, 0x0149, 0x25E5, 0x25E5, 0x0148, 0x2605, 0x2605, 0x00BA,
+    0x2606, 0x2606, 0x00B9, 0x2609, 0x2609, 0x00F4, 0x2640, 0x2640, 0x00F1,
+    0x2641, 0x2641, 0x00F3, 0x2642, 0x2642, 0x00F2, 0x273D, 0x273D, 0x35C0,
+    0x2E80, 0x2E80, 0x44C8, 0x2E84, 0x2E84, 0x451C, 0x2E86, 0x2E88, 0x451D,
+    0x2E8A, 0x2E8A, 0x4520, 0x2E8C, 0x2E8D, 0x4521, 0x2E95, 0x2E95, 0x4523,
+    0x2E9C, 0x2E9C, 0x4524, 0x2E9D, 0x2E9D, 0x02DC, 0x2EA5, 0x2EA5, 0x4525,
+    0x2EA7, 0x2EA7, 0x4526, 0x2EAA, 0x2EAA, 0x4527, 0x2EAC, 0x2EAC, 0x4528,
+    0x2EAE, 0x2EAE, 0x4529, 0x2EB6, 0x2EB6, 0x452A, 0x2EBC, 0x2EBC, 0x452B,
+    0x2EBE, 0x2EBE, 0x452C, 0x2EC6, 0x2EC6, 0x0509, 0x2ECA, 0x2ECA, 0x452D,
+    0x2ECC, 0x2ECD, 0x452E, 0x2ECF, 0x2ECF, 0x4530, 0x2ED6, 0x2ED7, 0x4531,
+    0x2EDE, 0x2EDE, 0x4533, 0x2EE3, 0x2EE3, 0x09F6, 0x2F33, 0x2F33, 0x0227,
+    0x3000, 0x3000, 0x0063, 0x3001, 0x3002, 0x0065, 0x3003, 0x3003, 0x00B3,
+    0x3005, 0x3007, 0x35BA, 0x3008, 0x3009, 0x0094, 0x300A, 0x300B, 0x0090,
+    0x300C, 0x300D, 0x0098, 0x300E, 0x300F, 0x009C, 0x3010, 0x3011, 0x008C,
+    0x3012, 0x3012, 0x0105, 0x3014, 0x3015, 0x0088, 0x301D, 0x301E, 0x00AA,
+    0x3021, 0x3029, 0x0161, 0x3041, 0x3093, 0x35C1, 0x309B, 0x309C, 0x44C6,
+    0x309D, 0x309E, 0x35B7, 0x30A1, 0x30F6, 0x3614, 0x30FC, 0x30FC, 0x35BD,
+    0x30FD, 0x30FE, 0x35B5, 0x3105, 0x3129, 0x01D1, 0x3231, 0x3231, 0x36E5,
+    0x32A3, 0x32A3, 0x00C1, 0x338E, 0x338F, 0x0115, 0x339C, 0x339E, 0x0110,
+    0x33A1, 0x33A1, 0x0114, 0x33C4, 0x33C4, 0x0117, 0x33CE, 0x33CE, 0x0113,
+    0x33D1, 0x33D1, 0x00EC, 0x33D2, 0x33D2, 0x00EB, 0x33D5, 0x33D5, 0x010F,
+    0x3435, 0x3435, 0x39BD, 0x3440, 0x3440, 0x3C67, 0x344C, 0x344C, 0x4593,
+    0x3464, 0x3464, 0x3A85, 0x3473, 0x3473, 0x3DC5, 0x347A, 0x347A, 0x4033,
+    0x347D, 0x347D, 0x4597, 0x347E, 0x347E, 0x46A3, 0x3493, 0x3493, 0x439E,
+    0x3496, 0x3496, 0x37DC, 0x34A5, 0x34A5, 0x4598, 0x34AF, 0x34AF, 0x3C7F,
+    0x34BC, 0x34BC, 0x4380, 0x34C1, 0x34C1, 0x44FB, 0x34C8, 0x34C8, 0x3D00,
+    0x34DF, 0x34DF, 0x3EA4, 0x34E4, 0x34E4, 0x3E54, 0x34FB, 0x34FB, 0x3DCA,
+    0x3506, 0x3506, 0x4336, 0x353E, 0x353E, 0x44E7, 0x3551, 0x3551, 0x45A1,
+    0x3553, 0x3553, 0x43A5, 0x3561, 0x3561, 0x40D8, 0x356D, 0x356D, 0x45A4,
+    0x3570, 0x3570, 0x3B2F, 0x3572, 0x3572, 0x45A5, 0x3577, 0x3577, 0x3ECB,
+    0x3578, 0x3578, 0x4379, 0x3584, 0x3584, 0x39FB, 0x3597, 0x3597, 0x3B2D,
+    0x3598, 0x3598, 0x45B0, 0x35A1, 0x35A1, 0x40E2, 0x35A5, 0x35A5, 0x45B1,
+    0x35AD, 0x35AD, 0x3EFC, 0x35BF, 0x35BF, 0x45B2, 0x35C1, 0x35C1, 0x4580,
+    0x35C5, 0x35C5, 0x45B4, 0x35C7, 0x35C7, 0x459F, 0x35CA, 0x35CA, 0x3E43,
+    0x35CE, 0x35CE, 0x3E81, 0x35D2, 0x35D2, 0x3FC9, 0x35D6, 0x35D6, 0x3FB5,
+    0x35DB, 0x35DB, 0x470D, 0x35DD, 0x35DD, 0x43AC, 0x35F1, 0x35F1, 0x4696,
+    0x35F2, 0x35F2, 0x4627, 0x35F3, 0x35F3, 0x3F6C, 0x35FB, 0x35FB, 0x45C8,
+    0x35FE, 0x35FE, 0x3F6A, 0x3609, 0x3609, 0x45F5, 0x3618, 0x3618, 0x4871,
+    0x361A, 0x361A, 0x461A, 0x3623, 0x3623, 0x40C6, 0x362D, 0x362D, 0x3E86,
+    0x3635, 0x3635, 0x492E, 0x3639, 0x3639, 0x4165, 0x363E, 0x363E, 0x3A08,
+    0x3647, 0x3647, 0x4806, 0x3648, 0x3648, 0x3806, 0x3649, 0x3649, 0x4013,
+    0x364E, 0x364E, 0x4698, 0x365F, 0x365F, 0x3DF3, 0x367A, 0x367A, 0x3EE3,
+    0x3681, 0x3681, 0x45A6, 0x369A, 0x369A, 0x3C71, 0x36A5, 0x36A5, 0x4902,
+    0x36AA, 0x36AA, 0x3B30, 0x36AC, 0x36AC, 0x4900, 0x36B0, 0x36B0, 0x3CDF,
+    0x36B1, 0x36B1, 0x40CD, 0x36B5, 0x36B5, 0x3BC2, 0x36B9, 0x36B9, 0x4887,
+    0x36BC, 0x36BC, 0x3CFF, 0x36C1, 0x36C1, 0x37C5, 0x36C3, 0x36C3, 0x40E5,
+    0x36C4, 0x36C4, 0x3905, 0x36C5, 0x36C5, 0x4296, 0x36C7, 0x36C7, 0x3D3A,
+    0x36C8, 0x36C8, 0x4820, 0x36D3, 0x36D3, 0x3A38, 0x36D4, 0x36D4, 0x3BB3,
+    0x36D6, 0x36D6, 0x3D0C, 0x36DD, 0x36DD, 0x3A36, 0x36E1, 0x36E1, 0x397C,
+    0x36E2, 0x36E2, 0x3CDD, 0x36E5, 0x36E5, 0x4216, 0x36E6, 0x36E6, 0x40FC,
+    0x36F5, 0x36F5, 0x3A18, 0x3701, 0x3701, 0x3A34, 0x3703, 0x3703, 0x460F,
+    0x3708, 0x3708, 0x40FF, 0x370A, 0x370A, 0x3CD5, 0x370D, 0x370D, 0x4238,
+    0x371C, 0x371C, 0x3DFE, 0x3722, 0x3722, 0x3979, 0x3723, 0x3723, 0x3980,
+    0x3725, 0x3725, 0x3849, 0x372C, 0x372C, 0x3C8C, 0x372D, 0x372D, 0x3D37,
+    0x3730, 0x3730, 0x495C, 0x3732, 0x3732, 0x4106, 0x3733, 0x3733, 0x3997,
+    0x373A, 0x373A, 0x3E56, 0x3740, 0x3740, 0x4202, 0x3743, 0x3743, 0x4036,
+    0x3762, 0x3762, 0x3DB6, 0x376F, 0x376F, 0x47CB, 0x3797, 0x3797, 0x45ED,
+    0x37A0, 0x37A0, 0x3A28, 0x37B9, 0x37B9, 0x43B7, 0x37BE, 0x37BE, 0x393E,
+    0x37F2, 0x37F2, 0x3BA1, 0x37F8, 0x37F8, 0x42D2, 0x37FB, 0x37FB, 0x3EF5,
+    0x380F, 0x380F, 0x462C, 0x3819, 0x3819, 0x39AF, 0x3820, 0x3820, 0x462F,
+    0x382D, 0x382D, 0x412E, 0x3836, 0x3836, 0x4133, 0x3838, 0x3838, 0x43BB,
+    0x3863, 0x3863, 0x46C3, 0x38A0, 0x38A0, 0x4145, 0x38C3, 0x38C3, 0x3912,
+    0x38CC, 0x38CC, 0x4076, 0x38D1, 0x38D1, 0x3A95, 0x38FA, 0x38FA, 0x44EB,
+    0x3908, 0x3908, 0x4632, 0x3914, 0x3914, 0x43BE, 0x3927, 0x3927, 0x3C31,
+    0x3932, 0x3932, 0x4182, 0x393F, 0x393F, 0x4633, 0x394D, 0x394D, 0x4634,
+    0x3963, 0x3963, 0x4163, 0x3980, 0x3980, 0x3874, 0x3989, 0x3989, 0x4638,
+    0x398A, 0x398A, 0x3CE8, 0x3992, 0x3992, 0x4376, 0x3999, 0x3999, 0x39BA,
+    0x399B, 0x399B, 0x3DB3, 0x39A1, 0x39A1, 0x3E19, 0x39A4, 0x39A4, 0x3E0F,
+    0x39B8, 0x39B8, 0x463B, 0x39DC, 0x39DC, 0x3ECE, 0x39E2, 0x39E2, 0x46C8,
+    0x39E5, 0x39E5, 0x393B, 0x39EC, 0x39EC, 0x4310, 0x39F8, 0x39F8, 0x463E,
+    0x39FB, 0x39FB, 0x4345, 0x39FE, 0x39FE, 0x4368, 0x3A01, 0x3A01, 0x41E0,
+    0x3A03, 0x3A03, 0x4640, 0x3A06, 0x3A06, 0x4377, 0x3A17, 0x3A17, 0x4190,
+    0x3A18, 0x3A18, 0x438F, 0x3A29, 0x3A29, 0x3A5E, 0x3A2A, 0x3A2A, 0x3EDF,
+    0x3A34, 0x3A34, 0x4319, 0x3A4B, 0x3A4B, 0x4644, 0x3A52, 0x3A52, 0x3ED3,
+    0x3A57, 0x3A57, 0x419E, 0x3A5C, 0x3A5C, 0x3FC4, 0x3A5E, 0x3A5E, 0x3B07,
+    0x3A66, 0x3A66, 0x419C, 0x3A67, 0x3A67, 0x4333, 0x3A97, 0x3A97, 0x4647,
+    0x3AAB, 0x3AAB, 0x4091, 0x3ABD, 0x3ABD, 0x4649, 0x3ADE, 0x3ADE, 0x414C,
+    0x3AE0, 0x3AE0, 0x3A7A, 0x3AF0, 0x3AF0, 0x46B2, 0x3AF2, 0x3AF2, 0x464C,
+    0x3AFB, 0x3AFB, 0x3AF2, 0x3B0E, 0x3B0E, 0x38E8, 0x3B19, 0x3B19, 0x46C5,
+    0x3B22, 0x3B22, 0x464E, 0x3B2B, 0x3B2B, 0x4956, 0x3B39, 0x3B39, 0x474B,
+    0x3B42, 0x3B42, 0x4650, 0x3B58, 0x3B58, 0x4652, 0x3B60, 0x3B60, 0x393A,
+    0x3B71, 0x3B71, 0x4656, 0x3B72, 0x3B72, 0x4655, 0x3B7B, 0x3B7B, 0x4657,
+    0x3B7C, 0x3B7C, 0x385A, 0x3B80, 0x3B80, 0x41E2, 0x3B96, 0x3B96, 0x3A9C,
+    0x3B99, 0x3B99, 0x3A98, 0x3BA1, 0x3BA1, 0x41E9, 0x3BBC, 0x3BBC, 0x43C8,
+    0x3BBE, 0x3BBE, 0x3DB1, 0x3BC2, 0x3BC2, 0x4134, 0x3BC4, 0x3BC4, 0x3AA0,
+    0x3BD7, 0x3BD7, 0x3AAC, 0x3BDD, 0x3BDD, 0x465F, 0x3BEC, 0x3BEC, 0x4664,
+    0x3BF2, 0x3BF2, 0x4666, 0x3BF3, 0x3BF3, 0x41F3, 0x3BF4, 0x3BF4, 0x3A6E,
+    0x3C0D, 0x3C0D, 0x41F7, 0x3C11, 0x3C11, 0x3E40, 0x3C15, 0x3C15, 0x3998,
+    0x3C54, 0x3C54, 0x3E00, 0x3CCB, 0x3CCB, 0x4670, 0x3CCD, 0x3CCD, 0x3CE5,
+    0x3CD1, 0x3CD1, 0x4003, 0x3CD6, 0x3CD6, 0x3CF7, 0x3CDC, 0x3CDC, 0x404E,
+    0x3CEB, 0x3CEB, 0x4217, 0x3CEF, 0x3CEF, 0x4675, 0x3D13, 0x3D13, 0x3773,
+    0x3D1D, 0x3D1D, 0x393C, 0x3D32, 0x3D32, 0x4957, 0x3D3B, 0x3D3B, 0x4245,
+    0x3D46, 0x3D46, 0x4685, 0x3D4C, 0x3D4C, 0x3CEB, 0x3D4E, 0x3D4E, 0x4242,
+    0x3D51, 0x3D51, 0x38EA, 0x3D5F, 0x3D5F, 0x4159, 0x3D62, 0x3D62, 0x3C5E,
+    0x3D69, 0x3D69, 0x3CEA, 0x3D6A, 0x3D6A, 0x4689, 0x3D6F, 0x3D6F, 0x3CFC,
+    0x3D75, 0x3D75, 0x468A, 0x3D7D, 0x3D7D, 0x3C2F, 0x3D85, 0x3D85, 0x494B,
+    0x3D8A, 0x3D8A, 0x468D, 0x3D8F, 0x3D8F, 0x3ABD, 0x3D91, 0x3D91, 0x468F,
+    0x3DA5, 0x3DA5, 0x3D56, 0x3DAD, 0x3DAD, 0x4699, 0x3DB4, 0x3DB4, 0x40A6,
+    0x3DBF, 0x3DBF, 0x37D0, 0x3DC6, 0x3DC6, 0x48DE, 0x3DC7, 0x3DC7, 0x4164,
+    0x3DCC, 0x3DCC, 0x3D6F, 0x3DCD, 0x3DCD, 0x3AF3, 0x3DD3, 0x3DD3, 0x37E1,
+    0x3DDB, 0x3DDB, 0x3FFF, 0x3DE7, 0x3DE7, 0x3999, 0x3DE8, 0x3DE8, 0x425D,
+    0x3DEB, 0x3DEB, 0x3E5A, 0x3DF3, 0x3DF3, 0x46D4, 0x3DF7, 0x3DF7, 0x48AB,
+    0x3DFC, 0x3DFC, 0x462B, 0x3DFD, 0x3DFD, 0x3C14, 0x3E06, 0x3E06, 0x491D,
+    0x3E40, 0x3E40, 0x4169, 0x3E43, 0x3E43, 0x436D, 0x3E48, 0x3E48, 0x4595,
+    0x3E55, 0x3E55, 0x427F, 0x3E74, 0x3E74, 0x3EE2, 0x3EA8, 0x3EA8, 0x4304,
+    0x3EA9, 0x3EA9, 0x46ED, 0x3EAA, 0x3EAA, 0x4075, 0x3EAD, 0x3EAD, 0x3B9D,
+    0x3EB1, 0x3EB1, 0x3AD8, 0x3EB8, 0x3EB8, 0x3A4B, 0x3EBF, 0x3EBF, 0x3B0B,
+    0x3EC2, 0x3EC2, 0x3BD8, 0x3EC7, 0x3EC7, 0x3975, 0x3ECA, 0x3ECA, 0x46F1,
+    0x3ECC, 0x3ECC, 0x3BE2, 0x3ED0, 0x3ED0, 0x3854, 0x3ED1, 0x3ED1, 0x46F2,
+    0x3ED6, 0x3ED6, 0x3CAD, 0x3ED7, 0x3ED7, 0x429F, 0x3EDA, 0x3EDA, 0x3D02,
+    0x3EDE, 0x3EDE, 0x39F2, 0x3EE1, 0x3EE1, 0x3CA8, 0x3EE2, 0x3EE2, 0x46F6,
+    0x3EE7, 0x3EE7, 0x3BDC, 0x3EE9, 0x3EE9, 0x3CA4, 0x3EEB, 0x3EEB, 0x396A,
+    0x3EF0, 0x3EF0, 0x46F7, 0x3EF3, 0x3EF3, 0x3ADD, 0x3EF4, 0x3EF4, 0x46F8,
+    0x3EFA, 0x3EFA, 0x46F9, 0x3EFC, 0x3EFC, 0x3BE8, 0x3EFF, 0x3EFF, 0x3AF5,
+    0x3F00, 0x3F00, 0x3C0D, 0x3F04, 0x3F04, 0x42C3, 0x3F06, 0x3F06, 0x3AD7,
+    0x3F0E, 0x3F0E, 0x46FB, 0x3F53, 0x3F53, 0x46FC, 0x3F58, 0x3F58, 0x3AE9,
+    0x3F59, 0x3F59, 0x4089, 0x3F63, 0x3F63, 0x3AE6, 0x3F7C, 0x3F7C, 0x4700,
+    0x3F93, 0x3F93, 0x45CD, 0x3FC0, 0x3FC0, 0x43CF, 0x3FD7, 0x3FD7, 0x43D1,
+    0x3FDC, 0x3FDC, 0x4704, 0x3FE5, 0x3FE5, 0x46DF, 0x3FED, 0x3FED, 0x4335,
+    0x3FF9, 0x3FF9, 0x45D7, 0x3FFA, 0x3FFA, 0x4354, 0x4004, 0x4004, 0x410E,
+    0x401D, 0x401D, 0x4709, 0x4039, 0x4039, 0x470B, 0x4045, 0x4045, 0x470C,
+    0x4053, 0x4053, 0x45B6, 0x4057, 0x4057, 0x399D, 0x4062, 0x4062, 0x3BCB,
+    0x4065, 0x4065, 0x3FD3, 0x406A, 0x406A, 0x470F, 0x406F, 0x406F, 0x4710,
+    0x40A8, 0x40A8, 0x43D5, 0x40BB, 0x40BB, 0x45C0, 0x40BF, 0x40BF, 0x3EEC,
+    0x40C8, 0x40C8, 0x3B0E, 0x40D8, 0x40D8, 0x41AB, 0x40DF, 0x40DF, 0x3E17,
+    0x40FA, 0x40FA, 0x3EBE, 0x4103, 0x4103, 0x43D7, 0x4104, 0x4104, 0x425C,
+    0x4109, 0x4109, 0x471C, 0x410E, 0x410E, 0x3B1B, 0x4132, 0x4132, 0x3B25,
+    0x4167, 0x4167, 0x471F, 0x416C, 0x416C, 0x38AE, 0x416E, 0x416E, 0x3B23,
+    0x417F, 0x417F, 0x3B82, 0x4190, 0x4190, 0x46C0, 0x41B2, 0x41B2, 0x4720,
+    0x41C4, 0x41C4, 0x4723, 0x41CA, 0x41CA, 0x373F, 0x41CF, 0x41CF, 0x4726,
+    0x41DB, 0x41DB, 0x37BF, 0x41EF, 0x41EF, 0x3743, 0x41F9, 0x41F9, 0x3B3E,
+    0x4211, 0x4211, 0x3B41, 0x4240, 0x4240, 0x37F1, 0x4260, 0x4260, 0x472B,
+    0x426A, 0x426A, 0x3B55, 0x427A, 0x427A, 0x472C, 0x428C, 0x428C, 0x472F,
+    0x4294, 0x4294, 0x4731, 0x42B5, 0x42B5, 0x4010, 0x42B9, 0x42B9, 0x38A6,
+    0x42BC, 0x42BC, 0x3C8A, 0x42F4, 0x42F4, 0x3BB9, 0x42FB, 0x42FB, 0x3CEE,
+    0x42FC, 0x42FC, 0x41E6, 0x432B, 0x432B, 0x377D, 0x436E, 0x436E, 0x46CA,
+    0x4397, 0x4397, 0x473B, 0x43BA, 0x43BA, 0x435F, 0x43C1, 0x43C1, 0x4695,
+    0x43D9, 0x43D9, 0x433E, 0x43DF, 0x43DF, 0x3E49, 0x43ED, 0x43ED, 0x4745,
+    0x43F2, 0x43F2, 0x3E48, 0x4401, 0x4401, 0x474A, 0x4402, 0x4402, 0x3B73,
+    0x4413, 0x4413, 0x474F, 0x4425, 0x4425, 0x4751, 0x442D, 0x442D, 0x4752,
+    0x447A, 0x447A, 0x37AF, 0x448F, 0x448F, 0x4758, 0x449F, 0x449F, 0x3AE2,
+    0x44A0, 0x44A0, 0x37ED, 0x44A2, 0x44A2, 0x4079, 0x44B0, 0x44B0, 0x475C,
+    0x44B7, 0x44B7, 0x3FA1, 0x44C0, 0x44C0, 0x3C07, 0x44C5, 0x44C5, 0x4210,
+    0x44CE, 0x44CE, 0x3D23, 0x44DD, 0x44DD, 0x39DD, 0x44DF, 0x44DF, 0x3D22,
+    0x44E4, 0x44E4, 0x37E2, 0x44E9, 0x44E9, 0x41CF, 0x44EA, 0x44EA, 0x3B71,
+    0x44EB, 0x44EB, 0x3CF2, 0x44EC, 0x44EC, 0x3EB4, 0x44F4, 0x44F4, 0x3992,
+    0x4503, 0x4503, 0x469F, 0x4504, 0x4504, 0x4763, 0x4509, 0x4509, 0x3E50,
+    0x450B, 0x450B, 0x37D4, 0x4516, 0x4516, 0x37F9, 0x451D, 0x451D, 0x3767,
+    0x4527, 0x4527, 0x37F7, 0x452E, 0x452E, 0x3CD3, 0x4533, 0x4533, 0x3C51,
+    0x453B, 0x453B, 0x476A, 0x453D, 0x453D, 0x38C4, 0x453F, 0x453F, 0x3E12,
+    0x4543, 0x4543, 0x37F3, 0x4551, 0x4551, 0x3AE4, 0x4552, 0x4552, 0x40B3,
+    0x4555, 0x4555, 0x423E, 0x455C, 0x455C, 0x378B, 0x4562, 0x4562, 0x4940,
+    0x456A, 0x456A, 0x3804, 0x4577, 0x4577, 0x476E, 0x4585, 0x4585, 0x38C5,
+    0x45E9, 0x45E9, 0x3EE4, 0x4606, 0x4606, 0x4773, 0x460F, 0x460F, 0x3815,
+    0x4615, 0x4615, 0x3843, 0x4617, 0x4617, 0x4774, 0x465B, 0x465B, 0x381D,
+    0x467A, 0x467A, 0x39E9, 0x4680, 0x4680, 0x3D01, 0x46CF, 0x46CF, 0x3BA0,
+    0x46D0, 0x46D0, 0x3DFA, 0x46F5, 0x46F5, 0x3B9F, 0x4713, 0x4713, 0x3833,
+    0x4718, 0x4718, 0x3DC7, 0x474E, 0x474E, 0x3EBC, 0x477C, 0x477C, 0x3DCD,
+    0x4798, 0x4798, 0x4781, 0x47A6, 0x47A6, 0x40A3, 0x47B6, 0x47B6, 0x3EEA,
+    0x47D5, 0x47D5, 0x431A, 0x47ED, 0x47ED, 0x4783, 0x47F4, 0x47F4, 0x432F,
+    0x4800, 0x4800, 0x461E, 0x480B, 0x480B, 0x4352, 0x4837, 0x4837, 0x4787,
+    0x485D, 0x485D, 0x410F, 0x4871, 0x4871, 0x3D03, 0x489B, 0x489B, 0x3BBD,
+    0x48AD, 0x48AD, 0x4791, 0x48AE, 0x48AE, 0x494D, 0x48D0, 0x48D0, 0x3DA7,
+    0x48DD, 0x48DD, 0x4120, 0x48ED, 0x48ED, 0x4288, 0x48F3, 0x48F3, 0x3EC1,
+    0x48FA, 0x48FA, 0x3E44, 0x4906, 0x4906, 0x3BC7, 0x4911, 0x4911, 0x4584,
+    0x491E, 0x491E, 0x4794, 0x4925, 0x4925, 0x3C0F, 0x492A, 0x492A, 0x46AE,
+    0x492D, 0x492D, 0x46CD, 0x4935, 0x4935, 0x3CC3, 0x493C, 0x493C, 0x3BF8,
+    0x493E, 0x493E, 0x3D06, 0x4945, 0x4945, 0x47A3, 0x4951, 0x4951, 0x47A4,
+    0x4953, 0x4953, 0x42AD, 0x4965, 0x4965, 0x3899, 0x496A, 0x496A, 0x47A9,
+    0x4972, 0x4972, 0x3A24, 0x4989, 0x4989, 0x379B, 0x49A1, 0x49A1, 0x38B7,
+    0x49A7, 0x49A7, 0x47AE, 0x49DF, 0x49DF, 0x38AA, 0x49E5, 0x49E5, 0x47B1,
+    0x49E7, 0x49E7, 0x4621, 0x4A0F, 0x4A0F, 0x38C3, 0x4A1D, 0x4A1D, 0x3BEC,
+    0x4A24, 0x4A24, 0x47B2, 0x4A35, 0x4A35, 0x47B4, 0x4A96, 0x4A96, 0x3CE7,
+    0x4AB4, 0x4AB4, 0x4361, 0x4AB8, 0x4AB8, 0x3DA8, 0x4AD1, 0x4AD1, 0x38E3,
+    0x4AE4, 0x4AE4, 0x47B7, 0x4AFF, 0x4AFF, 0x38F2, 0x4B19, 0x4B19, 0x47B9,
+    0x4B2C, 0x4B2C, 0x461F, 0x4B37, 0x4B37, 0x41A9, 0x4B6F, 0x4B6F, 0x3C16,
+    0x4B70, 0x4B70, 0x47C0, 0x4B72, 0x4B72, 0x38FC, 0x4B7B, 0x4B7B, 0x3C8D,
+    0x4B7E, 0x4B7E, 0x400A, 0x4B8E, 0x4B8E, 0x39F7, 0x4B90, 0x4B90, 0x3C20,
+    0x4B93, 0x4B93, 0x3A8C, 0x4B96, 0x4B96, 0x3942, 0x4B97, 0x4B97, 0x3C24,
+    0x4B9D, 0x4B9D, 0x47C2, 0x4BBD, 0x4BBD, 0x3C23, 0x4BBE, 0x4BBE, 0x3954,
+    0x4BC0, 0x4BC0, 0x3DDC, 0x4C04, 0x4C04, 0x3FBB, 0x4C07, 0x4C07, 0x3FB7,
+    0x4C0E, 0x4C0E, 0x390C, 0x4C3B, 0x4C3B, 0x3F3C, 0x4C3E, 0x4C3E, 0x457B,
+    0x4C5B, 0x4C5B, 0x3ED9, 0x4C6D, 0x4C6D, 0x47C9, 0x4C7D, 0x4C7D, 0x3E66,
+    0x4CA4, 0x4CA4, 0x48BE, 0x4CAE, 0x4CAE, 0x3C42, 0x4CB0, 0x4CB0, 0x3C45,
+    0x4CB7, 0x4CB7, 0x3E21, 0x4CCD, 0x4CCD, 0x4578, 0x4CE1, 0x4CE1, 0x3EF3,
+    0x4CED, 0x4CED, 0x40AB, 0x4D09, 0x4D09, 0x3ED6, 0x4D10, 0x4D10, 0x4117,
+    0x4D34, 0x4D34, 0x3935, 0x4D91, 0x4D91, 0x43F5, 0x4D9C, 0x4D9C, 0x48C4,
+    0x4E00, 0x4E00, 0x0253, 0x4E01, 0x4E01, 0x0255, 0x4E03, 0x4E03, 0x0256,
+    0x4E04, 0x4E04, 0x48FE, 0x4E07, 0x4E07, 0x1771, 0x4E08, 0x4E08, 0x0269,
+    0x4E09, 0x4E09, 0x0267, 0x4E0A, 0x4E0A, 0x026A, 0x4E0B, 0x4E0B, 0x0268,
+    0x4E0C, 0x4E0C, 0x1772, 0x4E0D, 0x4E0D, 0x0294, 0x4E0E, 0x4E0E, 0x177A,
+    0x4E0F, 0x4E0F, 0x1778, 0x4E10, 0x4E10, 0x0293, 0x4E11, 0x4E11, 0x0292,
+    0x4E14, 0x4E14, 0x02F2, 0x4E15, 0x4E15, 0x02F1, 0x4E16, 0x4E16, 0x02F0,
+    0x4E18, 0x4E18, 0x02F3, 0x4E19, 0x4E19, 0x02EF, 0x4E1A, 0x4E1A, 0x48FD,
+    0x4E1C, 0x4E1C, 0x48E0, 0x4E1E, 0x4E1F, 0x036E, 0x4E21, 0x4E21, 0x3D6D,
+    0x4E24, 0x4E24, 0x458D, 0x4E26, 0x4E26, 0x0528, 0x4E28, 0x4E28, 0x0218,
+    0x4E2A, 0x4E2A, 0x3F57, 0x4E2B, 0x4E2B, 0x026B, 0x4E2C, 0x4E2C, 0x44F3,
+    0x4E2D, 0x4E2D, 0x0295, 0x4E2E, 0x4E2E, 0x177B, 0x4E30, 0x4E30, 0x0296,
+    0x4E31, 0x4E31, 0x178E, 0x4E32, 0x4E32, 0x0415, 0x4E33, 0x4E33, 0x18F4,
+    0x4E36, 0x4E36, 0x0219, 0x4E37, 0x4E37, 0x4517, 0x4E38, 0x4E38, 0x026C,
+    0x4E39, 0x4E39, 0x0297, 0x4E3B, 0x4E3B, 0x02F4, 0x4E3C, 0x4E3C, 0x178F,
+    0x4E3D, 0x4E3D, 0x4537, 0x4E3F, 0x4E3F, 0x021A, 0x4E41, 0x4E41, 0x36AF,
+    0x4E42, 0x4E42, 0x176C, 0x4E43, 0x4E43, 0x0257, 0x4E45, 0x4E45, 0x026E,
+    0x4E47, 0x4E47, 0x1773, 0x4E48, 0x4E48, 0x026F, 0x4E49, 0x4E49, 0x408E,
+    0x4E4B, 0x4E4B, 0x0298, 0x4E4D, 0x4E4D, 0x02F5, 0x4E4E, 0x4E4E, 0x02F7,
+    0x4E4F, 0x4E4F, 0x02F6, 0x4E52, 0x4E53, 0x0370, 0x4E56, 0x4E56, 0x0529,
+    0x4E58, 0x4E58, 0x0831, 0x4E59, 0x4E59, 0x0254, 0x4E5A, 0x4E5A, 0x36B1,
+    0x4E5B, 0x4E5B, 0x44E5, 0x4E5C, 0x4E5C, 0x176D, 0x4E5D, 0x4E5D, 0x0258,
+    0x4E5E, 0x4E5E, 0x0271, 0x4E5F, 0x4E5F, 0x0270, 0x4E69, 0x4E69, 0x0372,
+    0x4E6A, 0x4E6A, 0x3DE5, 0x4E73, 0x4E73, 0x052A, 0x4E78, 0x4E78, 0x3D8E,
+    0x4E7E, 0x4E7E, 0x09FB, 0x4E7F, 0x4E7F, 0x1E35, 0x4E80, 0x4E80, 0x458E,
+    0x4E81, 0x4E81, 0x43BC, 0x4E82, 0x4E82, 0x0DBE, 0x4E83, 0x4E84, 0x2361,
+    0x4E85, 0x4E85, 0x021B, 0x4E86, 0x4E86, 0x0259, 0x4E87, 0x4E87, 0x458F,
+    0x4E88, 0x4E88, 0x029A, 0x4E89, 0x4E89, 0x459C, 0x4E8B, 0x4E8B, 0x052B,
+    0x4E8C, 0x4E8C, 0x025A, 0x4E8D, 0x4E8D, 0x1774, 0x4E8E, 0x4E8E, 0x0272,
+    0x4E91, 0x4E91, 0x029B, 0x4E92, 0x4E92, 0x029D, 0x4E93, 0x4E93, 0x177C,
+    0x4E94, 0x4E94, 0x029E, 0x4E95, 0x4E95, 0x029C, 0x4E98, 0x4E98, 0x39C4,
+    0x4E99, 0x4E99, 0x0373, 0x4E9A, 0x4E9A, 0x48D5, 0x4E9B, 0x4E9B, 0x052C,
+    0x4E9E, 0x4E9E, 0x052D, 0x4E9F, 0x4E9F, 0x06A3, 0x4EA0, 0x4EA0, 0x021C,
+    0x4EA1, 0x4EA1, 0x0273, 0x4EA2, 0x4EA2, 0x029F, 0x4EA4, 0x4EA4, 0x0374,
+    0x4EA5, 0x4EA5, 0x0376, 0x4EA6, 0x4EA6, 0x0375, 0x4EA8, 0x4EA8, 0x0416,
+    0x4EAB, 0x4EAC, 0x052E, 0x4EAD, 0x4EAE, 0x06A4, 0x4EB3, 0x4EB3, 0x0832,
+    0x4EB6, 0x4EB6, 0x2363, 0x4EB7, 0x4EB7, 0x413C, 0x4EB9, 0x4EB9, 0x3377,
+    0x4EBA, 0x4EBA, 0x025B, 0x4EBB, 0x4EBB, 0x44E6, 0x4EBC, 0x4EBC, 0x39B1,
+    0x4EBF, 0x4EBF, 0x4590, 0x4EC0, 0x4EC0, 0x02A1, 0x4EC1, 0x4EC1, 0x02A0,
+    0x4EC2, 0x4EC2, 0x177D, 0x4EC3, 0x4EC3, 0x02A2, 0x4EC4, 0x4EC4, 0x02A8,
+    0x4EC6, 0x4EC7, 0x02A3, 0x4EC8, 0x4EC8, 0x177F, 0x4EC9, 0x4EC9, 0x177E,
+    0x4ECA, 0x4ECB, 0x02A6, 0x4ECD, 0x4ECD, 0x02A5, 0x4ECE, 0x4ECE, 0x3F62,
+    0x4ED4, 0x4ED7, 0x02FA, 0x4ED8, 0x4ED8, 0x02F9, 0x4ED9, 0x4ED9, 0x0300,
+    0x4EDA, 0x4EDA, 0x1795, 0x4EDC, 0x4EDC, 0x1791, 0x4EDD, 0x4EDD, 0x1794,
+    0x4EDE, 0x4EDE, 0x0301, 0x4EDF, 0x4EDF, 0x0311, 0x4EE1, 0x4EE1, 0x1793,
+    0x4EE3, 0x4EE4, 0x02FE, 0x4EE5, 0x4EE5, 0x02F8, 0x4EE8, 0x4EE8, 0x1790,
+    0x4EE9, 0x4EE9, 0x1792, 0x4EEA, 0x4EEA, 0x48CB, 0x4EEB, 0x4EEB, 0x4591,
+    0x4EEE, 0x4EEE, 0x3D76, 0x4EF0, 0x4EF0, 0x0383, 0x4EF1, 0x4EF1, 0x17BA,
+    0x4EF2, 0x4EF2, 0x0380, 0x4EF3, 0x4EF3, 0x0384, 0x4EF4, 0x4EF4, 0x17C4,
+    0x4EF5, 0x4EF5, 0x17B8, 0x4EF6, 0x4EF6, 0x0381, 0x4EF7, 0x4EF7, 0x17BC,
+    0x4EF8, 0x4EF8, 0x39AD, 0x4EFB, 0x4EFB, 0x0382, 0x4EFD, 0x4EFD, 0x0385,
+    0x4EFF, 0x4EFF, 0x0377, 0x4F00, 0x4F00, 0x17BB, 0x4F01, 0x4F01, 0x0386,
+    0x4F02, 0x4F02, 0x17BF, 0x4F03, 0x4F03, 0x39C8, 0x4F04, 0x4F04, 0x17C3,
+    0x4F05, 0x4F05, 0x17C0, 0x4F08, 0x4F08, 0x17BD, 0x4F09, 0x4F09, 0x0378,
+    0x4F0A, 0x4F0A, 0x037A, 0x4F0B, 0x4F0B, 0x0387, 0x4F0D, 0x4F0D, 0x037C,
+    0x4F0E, 0x4F0E, 0x17B5, 0x4F0F, 0x4F0F, 0x037F, 0x4F10, 0x4F11, 0x037D,
+    0x4F12, 0x4F12, 0x17C5, 0x4F13, 0x4F13, 0x17C2, 0x4F14, 0x4F14, 0x17B9,
+    0x4F15, 0x4F15, 0x037B, 0x4F18, 0x4F18, 0x17B6, 0x4F19, 0x4F19, 0x0379,
+    0x4F1A, 0x4F1A, 0x453C, 0x4F1D, 0x4F1D, 0x17BE, 0x4F22, 0x4F22, 0x17C1,
+    0x4F28, 0x4F28, 0x453D, 0x4F29, 0x4F29, 0x39BE, 0x4F2C, 0x4F2C, 0x17B7,
+    0x4F2D, 0x4F2D, 0x182F, 0x4F2F, 0x4F2F, 0x042C, 0x4F30, 0x4F30, 0x041F,
+    0x4F32, 0x4F32, 0x393D, 0x4F33, 0x4F33, 0x1830, 0x4F34, 0x4F34, 0x041C,
+    0x4F36, 0x4F36, 0x042E, 0x4F37, 0x4F37, 0x4592, 0x4F38, 0x4F38, 0x0424,
+    0x4F39, 0x4F39, 0x3F65, 0x4F3A, 0x4F3A, 0x0423, 0x4F3B, 0x4F3B, 0x1824,
+    0x4F3C, 0x4F3C, 0x0427, 0x4F3D, 0x4F3D, 0x0422, 0x4F3E, 0x4F3E, 0x1829,
+    0x4F3F, 0x4F3F, 0x1831, 0x4F41, 0x4F41, 0x182D, 0x4F42, 0x4F42, 0x39CB,
+    0x4F43, 0x4F43, 0x0425, 0x4F45, 0x4F45, 0x3B8F, 0x4F46, 0x4F46, 0x0428,
+    0x4F47, 0x4F47, 0x0419, 0x4F48, 0x4F48, 0x0431, 0x4F49, 0x4F49, 0x1826,
+    0x4F4B, 0x4F4B, 0x39B4, 0x4F4C, 0x4F4C, 0x1900, 0x4F4D, 0x4F4D, 0x0417,
+    0x4F4E, 0x4F4E, 0x042D, 0x4F4F, 0x4F4F, 0x0418, 0x4F50, 0x4F51, 0x0420,
+    0x4F52, 0x4F52, 0x182B, 0x4F53, 0x4F53, 0x1827, 0x4F54, 0x4F54, 0x0426,
+    0x4F55, 0x4F55, 0x041E, 0x4F56, 0x4F56, 0x1823, 0x4F57, 0x4F57, 0x041A,
+    0x4F58, 0x4F58, 0x182E, 0x4F59, 0x4F59, 0x042F, 0x4F5A, 0x4F5A, 0x0432,
+    0x4F5B, 0x4F5B, 0x041D, 0x4F5C, 0x4F5C, 0x042A, 0x4F5D, 0x4F5D, 0x0430,
+    0x4F5E, 0x4F5E, 0x041B, 0x4F5F, 0x4F5F, 0x182C, 0x4F60, 0x4F60, 0x042B,
+    0x4F61, 0x4F61, 0x1832, 0x4F62, 0x4F62, 0x1825, 0x4F63, 0x4F63, 0x0429,
+    0x4F64, 0x4F64, 0x1828, 0x4F67, 0x4F67, 0x182A, 0x4F69, 0x4F69, 0x053D,
+    0x4F6A, 0x4F6A, 0x1902, 0x4F6B, 0x4F6B, 0x190E, 0x4F6C, 0x4F6C, 0x0535,
+    0x4F6E, 0x4F6E, 0x190F, 0x4F6F, 0x4F6F, 0x0530, 0x4F70, 0x4F70, 0x053A,
+    0x4F72, 0x4F72, 0x3C72, 0x4F73, 0x4F73, 0x0533, 0x4F74, 0x4F74, 0x18FC,
+    0x4F75, 0x4F75, 0x053B, 0x4F76, 0x4F76, 0x18FB, 0x4F77, 0x4F77, 0x18FF,
+    0x4F78, 0x4F78, 0x1906, 0x4F79, 0x4F79, 0x1904, 0x4F7A, 0x4F7A, 0x0543,
+    0x4F7B, 0x4F7B, 0x053E, 0x4F7C, 0x4F7C, 0x18F6, 0x4F7D, 0x4F7D, 0x18F8,
+    0x4F7E, 0x4F7E, 0x0540, 0x4F7F, 0x4F7F, 0x0534, 0x4F80, 0x4F80, 0x18F9,
+    0x4F81, 0x4F81, 0x1905, 0x4F82, 0x4F82, 0x190C, 0x4F83, 0x4F83, 0x0539,
+    0x4F84, 0x4F84, 0x18FE, 0x4F85, 0x4F85, 0x18F7, 0x4F86, 0x4F86, 0x0538,
+    0x4F87, 0x4F87, 0x18FA, 0x4F88, 0x4F88, 0x053C, 0x4F89, 0x4F89, 0x18FD,
+    0x4F8A, 0x4F8A, 0x39B5, 0x4F8B, 0x4F8B, 0x0537, 0x4F8D, 0x4F8D, 0x0532,
+    0x4F8F, 0x4F8F, 0x0541, 0x4F90, 0x4F90, 0x1907, 0x4F91, 0x4F91, 0x0542,
+    0x4F92, 0x4F92, 0x190B, 0x4F94, 0x4F94, 0x1909, 0x4F95, 0x4F95, 0x190D,
+    0x4F96, 0x4F96, 0x053F, 0x4F97, 0x4F97, 0x1901, 0x4F98, 0x4F98, 0x18F5,
+    0x4F9A, 0x4F9A, 0x1903, 0x4F9B, 0x4F9B, 0x0536, 0x4F9C, 0x4F9C, 0x1908,
+    0x4F9D, 0x4F9D, 0x0531, 0x4F9E, 0x4F9E, 0x190A, 0x4FA2, 0x4FA2, 0x39C7,
+    0x4FA8, 0x4FA8, 0x453E, 0x4FAB, 0x4FAB, 0x4022, 0x4FAE, 0x4FAE, 0x06B4,
+    0x4FAF, 0x4FAF, 0x06A8, 0x4FB0, 0x4FB0, 0x3D4A, 0x4FB2, 0x4FB2, 0x1A5D,
+    0x4FB3, 0x4FB3, 0x1A65, 0x4FB5, 0x4FB5, 0x06A7, 0x4FB6, 0x4FB6, 0x06AF,
+    0x4FB7, 0x4FB7, 0x06BB, 0x4FB9, 0x4FB9, 0x1A6B, 0x4FBA, 0x4FBA, 0x1A69,
+    0x4FBB, 0x4FBB, 0x1A64, 0x4FBD, 0x4FBD, 0x4594, 0x4FBF, 0x4FBF, 0x06A9,
+    0x4FC0, 0x4FC0, 0x1A6A, 0x4FC1, 0x4FC1, 0x1A60, 0x4FC2, 0x4FC2, 0x06B7,
+    0x4FC3, 0x4FC3, 0x06AE, 0x4FC4, 0x4FC4, 0x06B6, 0x4FC5, 0x4FC5, 0x1A5B,
+    0x4FC7, 0x4FC7, 0x1A67, 0x4FC8, 0x4FC8, 0x46E8, 0x4FC9, 0x4FC9, 0x1A5E,
+    0x4FCA, 0x4FCA, 0x06B2, 0x4FCB, 0x4FCB, 0x1A5F, 0x4FCC, 0x4FCC, 0x39CF,
+    0x4FCD, 0x4FCD, 0x1A5A, 0x4FCE, 0x4FCE, 0x06B9, 0x4FCF, 0x4FCF, 0x06AC,
+    0x4FD0, 0x4FD0, 0x06B5, 0x4FD1, 0x4FD1, 0x06AB, 0x4FD3, 0x4FD3, 0x1A5C,
+    0x4FD4, 0x4FD4, 0x1A61, 0x4FD6, 0x4FD6, 0x1A68, 0x4FD7, 0x4FD7, 0x06B3,
+    0x4FD8, 0x4FD8, 0x06B0, 0x4FD9, 0x4FD9, 0x1A63, 0x4FDA, 0x4FDA, 0x06B8,
+    0x4FDB, 0x4FDB, 0x1A66, 0x4FDC, 0x4FDC, 0x1A62, 0x4FDD, 0x4FDD, 0x06AD,
+    0x4FDE, 0x4FDE, 0x06BA, 0x4FDF, 0x4FDF, 0x06B1, 0x4FE0, 0x4FE0, 0x06AA,
+    0x4FE1, 0x4FE1, 0x06A6, 0x4FE4, 0x4FE4, 0x3C66, 0x4FE5, 0x4FE5, 0x39D0,
+    0x4FEC, 0x4FEC, 0x1A6C, 0x4FEE, 0x4FEE, 0x084C, 0x4FEF, 0x4FEF, 0x0836,
+    0x4FF1, 0x4FF1, 0x0846, 0x4FF2, 0x4FF2, 0x3F28, 0x4FF3, 0x4FF3, 0x084B,
+    0x4FF4, 0x4FF4, 0x1C24, 0x4FF5, 0x4FF5, 0x1C23, 0x4FF6, 0x4FF7, 0x1C28,
+    0x4FF8, 0x4FF8, 0x0839, 0x4FF9, 0x4FF9, 0x37B3, 0x4FFA, 0x4FFA, 0x0842,
+    0x4FFD, 0x4FFD, 0x3F26, 0x4FFE, 0x4FFE, 0x084F, 0x5000, 0x5000, 0x0843,
+    0x5003, 0x5003, 0x4596, 0x5005, 0x5005, 0x1C1D, 0x5006, 0x5006, 0x083C,
+    0x5007, 0x5007, 0x1C1E, 0x5008, 0x5008, 0x4024, 0x5009, 0x5009, 0x0851,
+    0x500B, 0x500B, 0x0848, 0x500C, 0x500D, 0x0833, 0x500E, 0x500E, 0x1C31,
+    0x500F, 0x500F, 0x0A0C, 0x5011, 0x5011, 0x0841, 0x5012, 0x5012, 0x0840,
+    0x5013, 0x5013, 0x1C1F, 0x5014, 0x5014, 0x0844, 0x5015, 0x5015, 0x1E45,
+    0x5016, 0x5016, 0x083B, 0x5017, 0x5017, 0x1C2A, 0x5018, 0x5018, 0x084A,
+    0x5019, 0x5019, 0x0849, 0x501A, 0x501A, 0x083F, 0x501B, 0x501B, 0x1C22,
+    0x501C, 0x501C, 0x1C2B, 0x501E, 0x501E, 0x1C1C, 0x501F, 0x501F, 0x083E,
+    0x5020, 0x5020, 0x1C2C, 0x5021, 0x5021, 0x0847, 0x5022, 0x5022, 0x1C20,
+    0x5023, 0x5023, 0x0835, 0x5025, 0x5025, 0x0838, 0x5026, 0x5026, 0x0837,
+    0x5027, 0x5027, 0x1C2D, 0x5028, 0x5028, 0x0845, 0x5029, 0x5029, 0x083A,
+    0x502A, 0x502A, 0x084E, 0x502B, 0x502B, 0x0850, 0x502C, 0x502C, 0x1C27,
+    0x502D, 0x502D, 0x084D, 0x502E, 0x502E, 0x39CC, 0x502F, 0x502F, 0x1C2F,
+    0x5030, 0x5030, 0x1C21, 0x5031, 0x5031, 0x1C30, 0x5033, 0x5033, 0x1C25,
+    0x5034, 0x5034, 0x3910, 0x5035, 0x5035, 0x1C2E, 0x5037, 0x5037, 0x1C26,
+    0x503C, 0x503C, 0x083D, 0x5040, 0x5040, 0x1E4D, 0x5041, 0x5041, 0x1E41,
+    0x5043, 0x5043, 0x0A00, 0x5045, 0x5045, 0x1E46, 0x5046, 0x5046, 0x1E4C,
+    0x5047, 0x5047, 0x09FF, 0x5048, 0x5048, 0x1E3F, 0x5049, 0x5049, 0x0A03,
+    0x504A, 0x504A, 0x1E43, 0x504B, 0x504B, 0x1E3C, 0x504C, 0x504C, 0x0A01,
+    0x504D, 0x504D, 0x1E40, 0x504E, 0x504E, 0x0A06, 0x504F, 0x504F, 0x0A0B,
+    0x5051, 0x5051, 0x1E51, 0x5053, 0x5053, 0x1E3B, 0x5055, 0x5055, 0x0A07,
+    0x5056, 0x5056, 0x3F2C, 0x5057, 0x5057, 0x1E50, 0x5058, 0x5058, 0x39D1,
+    0x505A, 0x505A, 0x0A02, 0x505B, 0x505B, 0x1E42, 0x505C, 0x505C, 0x09FE,
+    0x505D, 0x505D, 0x1E3D, 0x505E, 0x505E, 0x1E39, 0x505F, 0x505F, 0x1E47,
+    0x5060, 0x5060, 0x1E3A, 0x5061, 0x5061, 0x1E38, 0x5062, 0x5062, 0x1E44,
+    0x5063, 0x5064, 0x1E4A, 0x5065, 0x5065, 0x0A04, 0x5066, 0x5066, 0x3DC9,
+    0x5068, 0x5068, 0x20B8, 0x5069, 0x5069, 0x1E48, 0x506A, 0x506A, 0x1E37,
+    0x506B, 0x506B, 0x1E49, 0x506C, 0x506C, 0x39CD, 0x506D, 0x506D, 0x0A0E,
+    0x506E, 0x506E, 0x1E4E, 0x506F, 0x506F, 0x0A0D, 0x5070, 0x5070, 0x1E36,
+    0x5072, 0x5072, 0x1E3E, 0x5073, 0x5073, 0x1E4F, 0x5074, 0x5074, 0x0A09,
+    0x5075, 0x5075, 0x0A08, 0x5076, 0x5076, 0x0A05, 0x5077, 0x5077, 0x0A0A,
+    0x507A, 0x507A, 0x09FC, 0x507D, 0x507D, 0x09FD, 0x5080, 0x5080, 0x0BEC,
+    0x5081, 0x5081, 0x39CE, 0x5082, 0x5082, 0x20BB, 0x5083, 0x5083, 0x20B4,
+    0x5085, 0x5085, 0x0BE9, 0x5087, 0x5087, 0x20BC, 0x5088, 0x5088, 0x439C,
+    0x508B, 0x508B, 0x20B2, 0x508C, 0x508C, 0x20B5, 0x508D, 0x508D, 0x0BE8,
+    0x508E, 0x508E, 0x20B6, 0x5090, 0x5090, 0x41EC, 0x5091, 0x5091, 0x0BEB,
+    0x5092, 0x5092, 0x20BA, 0x5094, 0x5094, 0x20B0, 0x5095, 0x5095, 0x20AF,
+    0x5096, 0x5096, 0x0BED, 0x5098, 0x5098, 0x0BEE, 0x5099, 0x5099, 0x0BEA,
+    0x509A, 0x509A, 0x0BEF, 0x509B, 0x509B, 0x20AE, 0x509C, 0x509C, 0x20B9,
+    0x509D, 0x509D, 0x20B7, 0x509E, 0x509E, 0x20B1, 0x50A2, 0x50A2, 0x0BE7,
+    0x50A3, 0x50A3, 0x20B3, 0x50A6, 0x50A6, 0x3F3F, 0x50AC, 0x50AC, 0x0DC5,
+    0x50AD, 0x50AD, 0x0DBF, 0x50AE, 0x50AE, 0x2367, 0x50AF, 0x50AF, 0x0DC8,
+    0x50B0, 0x50B0, 0x236D, 0x50B1, 0x50B1, 0x2370, 0x50B2, 0x50B3, 0x0DC1,
+    0x50B4, 0x50B4, 0x236A, 0x50B5, 0x50B5, 0x0DC0, 0x50B6, 0x50B6, 0x2373,
+    0x50B7, 0x50B7, 0x0DC6, 0x50B8, 0x50B8, 0x2374, 0x50BA, 0x50BA, 0x236F,
+    0x50BB, 0x50BB, 0x0DC7, 0x50BD, 0x50BD, 0x2364, 0x50BE, 0x50BE, 0x0DC4,
+    0x50BF, 0x50BF, 0x2365, 0x50C1, 0x50C1, 0x236E, 0x50C2, 0x50C2, 0x236C,
+    0x50C4, 0x50C4, 0x2368, 0x50C5, 0x50C5, 0x0DC3, 0x50C6, 0x50C6, 0x2366,
+    0x50C7, 0x50C7, 0x0DC9, 0x50C8, 0x50C8, 0x236B, 0x50C9, 0x50C9, 0x2372,
+    0x50CA, 0x50CA, 0x2369, 0x50CB, 0x50CB, 0x2371, 0x50CD, 0x50CD, 0x39C5,
+    0x50CE, 0x50CE, 0x0F88, 0x50CF, 0x50CF, 0x0F85, 0x50D0, 0x50D0, 0x38D1,
+    0x50D1, 0x50D1, 0x0F86, 0x50D3, 0x50D3, 0x261C, 0x50D4, 0x50D4, 0x2614,
+    0x50D5, 0x50D5, 0x0F84, 0x50D6, 0x50D6, 0x0F81, 0x50D7, 0x50D7, 0x2615,
+    0x50D9, 0x50D9, 0x3FCE, 0x50DA, 0x50DA, 0x0F83, 0x50DB, 0x50DB, 0x2618,
+    0x50DD, 0x50DD, 0x261A, 0x50DE, 0x50DE, 0x4031, 0x50DF, 0x50DF, 0x3AFD,
+    0x50E0, 0x50E0, 0x2621, 0x50E1, 0x50E1, 0x4171, 0x50E3, 0x50E3, 0x2620,
+    0x50E4, 0x50E4, 0x261B, 0x50E5, 0x50E5, 0x0F80, 0x50E6, 0x50E6, 0x2613,
+    0x50E7, 0x50E7, 0x0F7E, 0x50E8, 0x50E8, 0x2616, 0x50E9, 0x50E9, 0x0F89,
+    0x50EA, 0x50EA, 0x2619, 0x50EC, 0x50EC, 0x261D, 0x50ED, 0x50ED, 0x0F82,
+    0x50EE, 0x50EE, 0x0F7F, 0x50EF, 0x50EF, 0x261F, 0x50F0, 0x50F0, 0x261E,
+    0x50F1, 0x50F1, 0x0F87, 0x50F3, 0x50F3, 0x2617, 0x50F4, 0x50F4, 0x3CE9,
+    0x50F5, 0x50F5, 0x1105, 0x50F6, 0x50F6, 0x2883, 0x50F8, 0x50F8, 0x2880,
+    0x50F9, 0x50F9, 0x1106, 0x50FB, 0x50FB, 0x1104, 0x50FC, 0x50FC, 0x39D2,
+    0x50FD, 0x50FD, 0x2887, 0x50FE, 0x50FE, 0x2884, 0x50FF, 0x50FF, 0x287D,
+    0x5100, 0x5100, 0x1103, 0x5101, 0x5101, 0x4032, 0x5102, 0x5102, 0x1107,
+    0x5103, 0x5103, 0x287E, 0x5104, 0x5104, 0x1102, 0x5105, 0x5105, 0x110A,
+    0x5106, 0x5107, 0x2881, 0x5108, 0x5109, 0x1108, 0x510A, 0x510A, 0x2888,
+    0x510B, 0x510C, 0x2885, 0x510D, 0x510D, 0x39C6, 0x510E, 0x510E, 0x4034,
+    0x5110, 0x5110, 0x128D, 0x5111, 0x5111, 0x2B04, 0x5112, 0x5112, 0x128A,
+    0x5113, 0x5113, 0x2B01, 0x5114, 0x5114, 0x128C, 0x5115, 0x5115, 0x128E,
+    0x5117, 0x5117, 0x2B02, 0x5118, 0x5118, 0x128B, 0x511A, 0x511A, 0x2B03,
+    0x511C, 0x511C, 0x2B00, 0x511F, 0x511F, 0x13B5, 0x5120, 0x5120, 0x2D3E,
+    0x5121, 0x5121, 0x13B6, 0x5122, 0x5122, 0x2D3C, 0x5124, 0x5124, 0x2D3D,
+    0x5125, 0x5125, 0x2D3B, 0x5126, 0x5126, 0x2D3A, 0x5129, 0x5129, 0x2D3F,
+    0x512A, 0x512A, 0x13B4, 0x512B, 0x512B, 0x39AE, 0x512D, 0x512E, 0x2F0F,
+    0x5130, 0x5130, 0x287F, 0x5131, 0x5131, 0x2F0E, 0x5132, 0x5132, 0x13B7,
+    0x5133, 0x5133, 0x1575, 0x5134, 0x5135, 0x307A, 0x5137, 0x5138, 0x1668,
+    0x5139, 0x5139, 0x32C6, 0x513A, 0x513A, 0x32C5, 0x513B, 0x513B, 0x16BC,
+    0x513C, 0x513C, 0x16BB, 0x513D, 0x513D, 0x340E, 0x513F, 0x513F, 0x025C,
+    0x5140, 0x5140, 0x0274, 0x5141, 0x5141, 0x02AA, 0x5143, 0x5143, 0x02A9,
+    0x5144, 0x5144, 0x0303, 0x5145, 0x5145, 0x0302, 0x5146, 0x5146, 0x038A,
+    0x5147, 0x5147, 0x0389, 0x5148, 0x5148, 0x038B, 0x5149, 0x5149, 0x0388,
+    0x514B, 0x514B, 0x0434, 0x514C, 0x514C, 0x0433, 0x514D, 0x514D, 0x0435,
+    0x5152, 0x5152, 0x0545, 0x5154, 0x5154, 0x0544, 0x5155, 0x5155, 0x0546,
+    0x5156, 0x5156, 0x439A, 0x5157, 0x5157, 0x06BC, 0x5159, 0x5159, 0x0119,
+    0x515A, 0x515A, 0x1C32, 0x515B, 0x515B, 0x011A, 0x515C, 0x515C, 0x0A0F,
+    0x515D, 0x515D, 0x011C, 0x515E, 0x515E, 0x011B, 0x515F, 0x515F, 0x20BD,
+    0x5160, 0x5160, 0x403A, 0x5161, 0x5161, 0x011D, 0x5162, 0x5162, 0x0F8A,
+    0x5163, 0x5163, 0x011E, 0x5165, 0x5165, 0x025D, 0x5167, 0x5167, 0x02AB,
+    0x5168, 0x5168, 0x038C, 0x5169, 0x5169, 0x0547, 0x516A, 0x516A, 0x403C,
+    0x516B, 0x516B, 0x025E, 0x516C, 0x516C, 0x02AE, 0x516D, 0x516E, 0x02AC,
+    0x5171, 0x5171, 0x038D, 0x5174, 0x5174, 0x453F, 0x5175, 0x5175, 0x0436,
+    0x5176, 0x5176, 0x0549, 0x5177, 0x5177, 0x0548, 0x5178, 0x5178, 0x054A,
+    0x5179, 0x5179, 0x3ACE, 0x517C, 0x517C, 0x0852, 0x5180, 0x5180, 0x128F,
+    0x5182, 0x5182, 0x021D, 0x5186, 0x5186, 0x439F, 0x5187, 0x5187, 0x1779,
+    0x5188, 0x5188, 0x36B6, 0x5189, 0x518A, 0x0304, 0x518D, 0x518D, 0x038E,
+    0x518F, 0x518F, 0x1833, 0x5191, 0x5191, 0x06BE, 0x5192, 0x5192, 0x06BD,
+    0x5193, 0x5193, 0x1C34, 0x5194, 0x5194, 0x1C33, 0x5195, 0x5195, 0x0A10,
+    0x5196, 0x5196, 0x021E, 0x5197, 0x5197, 0x02AF, 0x5198, 0x5198, 0x1780,
+    0x519A, 0x519A, 0x3EA3, 0x519C, 0x519C, 0x4540, 0x519E, 0x519E, 0x1910,
+    0x51A0, 0x51A0, 0x06BF, 0x51A2, 0x51A2, 0x0855, 0x51A4, 0x51A5, 0x0853,
+    0x51A7, 0x51A7, 0x3EA6, 0x51A8, 0x51A8, 0x39DA, 0x51AA, 0x51AA, 0x1290,
+    0x51AB, 0x51AB, 0x021F, 0x51AC, 0x51AC, 0x0306, 0x51B0, 0x51B0, 0x038F,
+    0x51B1, 0x51B1, 0x17C6, 0x51B2, 0x51B2, 0x4048, 0x51B3, 0x51B3, 0x4051,
+    0x51B4, 0x51B4, 0x3D7C, 0x51B5, 0x51B5, 0x4012, 0x51B6, 0x51B7, 0x0437,
+    0x51B8, 0x51B8, 0x4049, 0x51B9, 0x51B9, 0x1834, 0x51BC, 0x51BC, 0x1911,
+    0x51BD, 0x51BD, 0x054B, 0x51BE, 0x51BE, 0x1912, 0x51C3, 0x51C3, 0x39DB,
+    0x51C4, 0x51C5, 0x1C36, 0x51C6, 0x51C6, 0x0858, 0x51C7, 0x51C7, 0x422A,
+    0x51C8, 0x51C8, 0x1C38, 0x51C9, 0x51C9, 0x404B, 0x51CA, 0x51CA, 0x1C35,
+    0x51CB, 0x51CB, 0x0859, 0x51CC, 0x51CC, 0x0857, 0x51CD, 0x51CD, 0x0856,
+    0x51CE, 0x51CE, 0x1C39, 0x51CF, 0x51CF, 0x404C, 0x51D0, 0x51D0, 0x1E52,
+    0x51D1, 0x51D1, 0x404D, 0x51D2, 0x51D2, 0x3DAD, 0x51D3, 0x51D3, 0x404F,
+    0x51D4, 0x51D4, 0x20BE, 0x51D7, 0x51D7, 0x2375, 0x51D8, 0x51D8, 0x2622,
+    0x51DB, 0x51DB, 0x459A, 0x51DC, 0x51DC, 0x110B, 0x51DD, 0x51DD, 0x1291,
+    0x51DE, 0x51DE, 0x2B05, 0x51DF, 0x51DF, 0x424F, 0x51E0, 0x51E0, 0x025F,
+    0x51E1, 0x51E1, 0x026D, 0x51E2, 0x51E2, 0x4052, 0x51E4, 0x51E4, 0x4541,
+    0x51ED, 0x51ED, 0x4054, 0x51F0, 0x51F0, 0x0A11, 0x51F1, 0x51F1, 0x0BF1,
+    0x51F3, 0x51F3, 0x0F8B, 0x51F4, 0x51F4, 0x4178, 0x51F5, 0x51F5, 0x176E,
+    0x51F6, 0x51F6, 0x02B0, 0x51F8, 0x51F8, 0x0309, 0x51F9, 0x51FA, 0x0307,
+    0x51FC, 0x51FC, 0x459B, 0x51FD, 0x51FD, 0x054C, 0x51FE, 0x51FE, 0x3F0A,
+    0x5200, 0x5201, 0x0260, 0x5202, 0x5202, 0x36B3, 0x5203, 0x5203, 0x0275,
+    0x5205, 0x5205, 0x43A1, 0x5206, 0x5208, 0x02B1, 0x5209, 0x5209, 0x1797,
+    0x520A, 0x520A, 0x030A, 0x520B, 0x520B, 0x4059, 0x520C, 0x520C, 0x1796,
+    0x520E, 0x520E, 0x0393, 0x5210, 0x5210, 0x17C8, 0x5211, 0x5212, 0x0391,
+    0x5213, 0x5213, 0x17C7, 0x5216, 0x5216, 0x0394, 0x5217, 0x5217, 0x0390,
+    0x521C, 0x521C, 0x1835, 0x521D, 0x521D, 0x068B, 0x521E, 0x521E, 0x1836,
+    0x521F, 0x521F, 0x3F60, 0x5220, 0x5220, 0x4930, 0x5221, 0x5221, 0x1837,
+    0x5224, 0x5224, 0x043A, 0x5225, 0x5225, 0x0439, 0x5226, 0x5226, 0x405A,
+    0x5227, 0x5227, 0x43A2, 0x5228, 0x5228, 0x043D, 0x5229, 0x522A, 0x043B,
+    0x522E, 0x522E, 0x0552, 0x5230, 0x5230, 0x0551, 0x5231, 0x5231, 0x1917,
+    0x5232, 0x5233, 0x1914, 0x5234, 0x5234, 0x3EFB, 0x5235, 0x5235, 0x1913,
+    0x5236, 0x5236, 0x0553, 0x5237, 0x5237, 0x054F, 0x5238, 0x5238, 0x054E,
+    0x523A, 0x523A, 0x0550, 0x523B, 0x523B, 0x054D, 0x523C, 0x523C, 0x405B,
+    0x5241, 0x5241, 0x0554, 0x5243, 0x5243, 0x06C1, 0x5244, 0x5244, 0x1A6D,
+    0x5246, 0x5246, 0x1916, 0x5247, 0x5247, 0x06C6, 0x5249, 0x5249, 0x1A6E,
+    0x524A, 0x524A, 0x06C2, 0x524B, 0x524B, 0x06C5, 0x524C, 0x524C, 0x06C4,
+    0x524D, 0x524D, 0x06C3, 0x524E, 0x524E, 0x06C0, 0x5252, 0x5252, 0x1C3C,
+    0x5254, 0x5254, 0x085C, 0x5255, 0x5255, 0x1C3F, 0x5256, 0x5256, 0x085A,
+    0x5257, 0x5257, 0x405D, 0x5259, 0x5259, 0x39E4, 0x525A, 0x525A, 0x1C3B,
+    0x525B, 0x525B, 0x085D, 0x525C, 0x525C, 0x085B, 0x525D, 0x525D, 0x085E,
+    0x525E, 0x525F, 0x1C3D, 0x5260, 0x5260, 0x3F29, 0x5261, 0x5261, 0x1C3A,
+    0x5262, 0x5262, 0x1C40, 0x5268, 0x5268, 0x4619, 0x5269, 0x5269, 0x0BF5,
+    0x526A, 0x526A, 0x0A12, 0x526B, 0x526B, 0x1E53, 0x526C, 0x526C, 0x1E55,
+    0x526D, 0x526D, 0x1E54, 0x526E, 0x526E, 0x1E56, 0x526F, 0x526F, 0x0A13,
+    0x5272, 0x5272, 0x0BF2, 0x5273, 0x5273, 0x3F43, 0x5274, 0x5275, 0x0BF3,
+    0x5277, 0x5277, 0x0DCB, 0x5278, 0x5278, 0x2377, 0x5279, 0x5279, 0x43A3,
+    0x527A, 0x527A, 0x2376, 0x527B, 0x527C, 0x2378, 0x527D, 0x527D, 0x0DCC,
+    0x527F, 0x527F, 0x0DCA, 0x5280, 0x5281, 0x2623, 0x5282, 0x5282, 0x0F8D,
+    0x5283, 0x5283, 0x0F8C, 0x5284, 0x5284, 0x2776, 0x5287, 0x5289, 0x110C,
+    0x528A, 0x528A, 0x1110, 0x528B, 0x528C, 0x2889, 0x528D, 0x528D, 0x110F,
+    0x528F, 0x528F, 0x3DBF, 0x5290, 0x5290, 0x459D, 0x5291, 0x5291, 0x1292,
+    0x5293, 0x5293, 0x1293, 0x5294, 0x5294, 0x405E, 0x5296, 0x5296, 0x307C,
+    0x5297, 0x5297, 0x32C8, 0x5298, 0x5298, 0x32C7, 0x5299, 0x5299, 0x340F,
+    0x529A, 0x529A, 0x3F68, 0x529B, 0x529B, 0x0262, 0x529F, 0x529F, 0x030C,
+    0x52A0, 0x52A0, 0x030B, 0x52A1, 0x52A1, 0x4542, 0x52A3, 0x52A3, 0x0395,
+    0x52A4, 0x52A4, 0x39E5, 0x52A6, 0x52A6, 0x17C9, 0x52A8, 0x52A8, 0x4543,
+    0x52A9, 0x52AA, 0x043F, 0x52AB, 0x52AB, 0x043E, 0x52AC, 0x52AC, 0x0441,
+    0x52AD, 0x52AE, 0x1838, 0x52B5, 0x52B5, 0x405C, 0x52B9, 0x52B9, 0x405F,
+    0x52BB, 0x52BB, 0x0556, 0x52BC, 0x52BC, 0x1918, 0x52BE, 0x52BE, 0x0555,
+    0x52C0, 0x52C0, 0x1A6F, 0x52C1, 0x52C1, 0x06CA, 0x52C2, 0x52C2, 0x1A70,
+    0x52C3, 0x52C3, 0x06C9, 0x52C5, 0x52C5, 0x4060, 0x52C7, 0x52C7, 0x06C7,
+    0x52C9, 0x52C9, 0x06C8, 0x52CC, 0x52CC, 0x3EE1, 0x52CD, 0x52CD, 0x1C41,
+    0x52D0, 0x52D0, 0x4109, 0x52D1, 0x52D1, 0x3F2A, 0x52D2, 0x52D2, 0x0A14,
+    0x52D3, 0x52D3, 0x1E58, 0x52D5, 0x52D5, 0x0A17, 0x52D6, 0x52D6, 0x1E57,
+    0x52D7, 0x52D7, 0x0ACF, 0x52D8, 0x52D8, 0x0A16, 0x52D9, 0x52D9, 0x0A15,
+    0x52DB, 0x52DB, 0x0BF8, 0x52DD, 0x52DD, 0x0BF7, 0x52DE, 0x52DE, 0x0BF6,
+    0x52DF, 0x52DF, 0x0DCD, 0x52E0, 0x52E0, 0x4063, 0x52E1, 0x52E1, 0x39E7,
+    0x52E2, 0x52E3, 0x0DD0, 0x52E4, 0x52E4, 0x0DCF, 0x52E6, 0x52E6, 0x0DCE,
+    0x52E9, 0x52E9, 0x2625, 0x52EB, 0x52EB, 0x2626, 0x52EF, 0x52EF, 0x288C,
+    0x52F0, 0x52F0, 0x1111, 0x52F1, 0x52F1, 0x288B, 0x52F3, 0x52F3, 0x1294,
+    0x52F4, 0x52F4, 0x2D40, 0x52F5, 0x52F5, 0x13B8, 0x52F7, 0x52F7, 0x307D,
+    0x52F8, 0x52F8, 0x1609, 0x52F9, 0x52F9, 0x0220, 0x52FA, 0x52FA, 0x0276,
+    0x52FB, 0x52FB, 0x02B4, 0x52FC, 0x52FC, 0x1781, 0x52FE, 0x52FF, 0x02B5,
+    0x5301, 0x5301, 0x3D79, 0x5305, 0x5306, 0x030D, 0x5308, 0x5308, 0x0396,
+    0x5309, 0x5309, 0x183A, 0x530A, 0x530B, 0x1919, 0x530D, 0x530D, 0x06CB,
+    0x530E, 0x530E, 0x1C42, 0x530F, 0x530F, 0x0A19, 0x5310, 0x5310, 0x0A18,
+    0x5311, 0x5311, 0x20C0, 0x5312, 0x5312, 0x20BF, 0x5315, 0x5315, 0x0263,
+    0x5316, 0x5316, 0x02B7, 0x5317, 0x5317, 0x030F, 0x5319, 0x5319, 0x0A1A,
+    0x531A, 0x531A, 0x176F, 0x531C, 0x531C, 0x1798, 0x531D, 0x531D, 0x0310,
+    0x531F, 0x531F, 0x17CB, 0x5320, 0x5320, 0x0398, 0x5321, 0x5321, 0x0397,
+    0x5322, 0x5322, 0x17CA, 0x5323, 0x5323, 0x0442, 0x5327, 0x5327, 0x459E,
+    0x532A, 0x532A, 0x085F, 0x532C, 0x532C, 0x3F36, 0x532D, 0x532D, 0x1E59,
+    0x532F, 0x532F, 0x0DD2, 0x5330, 0x5330, 0x2627, 0x5331, 0x5331, 0x0F8E,
+    0x5332, 0x5332, 0x3FD0, 0x5333, 0x5333, 0x406D, 0x5334, 0x5334, 0x2B06,
+    0x5337, 0x5337, 0x31C7, 0x5338, 0x5338, 0x0221, 0x5339, 0x5339, 0x02B8,
+    0x533B, 0x533B, 0x4544, 0x533C, 0x533C, 0x191B, 0x533D, 0x533D, 0x1A71,
+    0x533E, 0x533E, 0x0A1D, 0x533F, 0x5340, 0x0A1B, 0x5341, 0x5341, 0x0264,
+    0x5342, 0x5342, 0x4947, 0x5343, 0x5343, 0x0277, 0x5344, 0x5344, 0x016B,
+    0x5345, 0x5345, 0x02BB, 0x5347, 0x5347, 0x02BA, 0x5348, 0x5348, 0x02B9,
+    0x5349, 0x5349, 0x0313, 0x534A, 0x534A, 0x0312, 0x534C, 0x534C, 0x1799,
+    0x534D, 0x534D, 0x17CC, 0x534E, 0x534E, 0x4545, 0x5351, 0x5351, 0x055A,
+    0x5352, 0x5352, 0x0557, 0x5353, 0x5353, 0x0559, 0x5354, 0x5354, 0x0558,
+    0x5357, 0x5357, 0x06CC, 0x535A, 0x535A, 0x0BF9, 0x535C, 0x535C, 0x0265,
+    0x535D, 0x535D, 0x4501, 0x535E, 0x535E, 0x02BC, 0x535F, 0x535F, 0x43A7,
+    0x5360, 0x5360, 0x0315, 0x5361, 0x5361, 0x0314, 0x5363, 0x5363, 0x183B,
+    0x5364, 0x5364, 0x480A, 0x5366, 0x5366, 0x055B, 0x5367, 0x5367, 0x3ECD,
+    0x5369, 0x5369, 0x0222, 0x536C, 0x536C, 0x1782, 0x536D, 0x536D, 0x407A,
+    0x536E, 0x536E, 0x0317, 0x536F, 0x536F, 0x0316, 0x5370, 0x5371, 0x0399,
+    0x5372, 0x5372, 0x183C, 0x5373, 0x5373, 0x0443, 0x5374, 0x5374, 0x407B,
+    0x5375, 0x5375, 0x0444, 0x5377, 0x5379, 0x055C, 0x537B, 0x537B, 0x06CD,
+    0x537C, 0x537C, 0x1A72, 0x537D, 0x537D, 0x4901, 0x537E, 0x537E, 0x407D,
+    0x537F, 0x537F, 0x0860, 0x5382, 0x5382, 0x1770, 0x5384, 0x5384, 0x02BD,
+    0x538A, 0x538A, 0x17CD, 0x538E, 0x538F, 0x183D, 0x5392, 0x5392, 0x191C,
+    0x5393, 0x5393, 0x4082, 0x5394, 0x5394, 0x191D, 0x5396, 0x5396, 0x1A74,
+    0x5397, 0x5397, 0x1A73, 0x5398, 0x5398, 0x1A76, 0x5399, 0x5399, 0x1A75,
+    0x539A, 0x539A, 0x06CE, 0x539C, 0x539C, 0x1E5A, 0x539D, 0x539D, 0x0862,
+    0x539E, 0x539E, 0x1C43, 0x539F, 0x539F, 0x0861, 0x53A0, 0x53A0, 0x4084,
+    0x53A2, 0x53A2, 0x3E2B, 0x53A4, 0x53A4, 0x20C1, 0x53A5, 0x53A5, 0x0BFA,
+    0x53A6, 0x53A6, 0x413B, 0x53A7, 0x53A7, 0x20C2, 0x53A8, 0x53A8, 0x413E,
+    0x53A9, 0x53A9, 0x45A0, 0x53AA, 0x53AA, 0x3FC6, 0x53AB, 0x53AB, 0x4085,
+    0x53AC, 0x53AC, 0x2628, 0x53AD, 0x53AD, 0x0F8F, 0x53AE, 0x53AE, 0x4086,
+    0x53B0, 0x53B0, 0x45A2, 0x53B2, 0x53B2, 0x1112, 0x53B4, 0x53B4, 0x307E,
+    0x53B6, 0x53B6, 0x0223, 0x53B9, 0x53B9, 0x1783, 0x53BB, 0x53BB, 0x0318,
+    0x53C1, 0x53C1, 0x408B, 0x53C2, 0x53C2, 0x43A6, 0x53C3, 0x53C3, 0x0A1E,
+    0x53C5, 0x53C5, 0x408C, 0x53C8, 0x53C8, 0x0266, 0x53C9, 0x53C9, 0x0278,
+    0x53CA, 0x53CA, 0x02BF, 0x53CB, 0x53CB, 0x02BE, 0x53CC, 0x53CC, 0x38B6,
+    0x53CD, 0x53CD, 0x02C0, 0x53D0, 0x53D0, 0x39FA, 0x53D1, 0x53D1, 0x4546,
+    0x53D2, 0x53D2, 0x3E3D, 0x53D4, 0x53D4, 0x0560, 0x53D6, 0x53D6, 0x055F,
+    0x53D7, 0x53D7, 0x0561, 0x53D8, 0x53D8, 0x4547, 0x53D9, 0x53D9, 0x4090,
+    0x53DA, 0x53DA, 0x3F39, 0x53DB, 0x53DB, 0x06CF, 0x53DF, 0x53DF, 0x0863,
+    0x53E0, 0x53E0, 0x4093, 0x53E1, 0x53E1, 0x2B07, 0x53E2, 0x53E2, 0x14C9,
+    0x53E3, 0x53E3, 0x0279, 0x53E4, 0x53E4, 0x031A, 0x53E5, 0x53E5, 0x0329,
+    0x53E6, 0x53E6, 0x0324, 0x53E8, 0x53E8, 0x031F, 0x53E9, 0x53E9, 0x031E,
+    0x53EA, 0x53EA, 0x0325, 0x53EB, 0x53EB, 0x0323, 0x53EC, 0x53EC, 0x031C,
+    0x53ED, 0x53ED, 0x032A, 0x53EE, 0x53EE, 0x031D, 0x53EF, 0x53EF, 0x0319,
+    0x53F0, 0x53F0, 0x0328, 0x53F1, 0x53F1, 0x0327, 0x53F2, 0x53F2, 0x0326,
+    0x53F3, 0x53F3, 0x031B, 0x53F5, 0x53F5, 0x0322, 0x53F6, 0x53F6, 0x4096,
+    0x53F7, 0x53F7, 0x3808, 0x53F8, 0x53F8, 0x0321, 0x53FB, 0x53FB, 0x032B,
+    0x53FC, 0x53FC, 0x0320, 0x53FE, 0x53FE, 0x40C1, 0x5401, 0x5401, 0x03A0,
+    0x5403, 0x5403, 0x03A6, 0x5404, 0x5404, 0x03A2, 0x5406, 0x5406, 0x03A8,
+    0x5407, 0x5407, 0x17CE, 0x5408, 0x5408, 0x03A5, 0x5409, 0x5409, 0x039B,
+    0x540A, 0x540A, 0x039E, 0x540B, 0x540B, 0x03A1, 0x540C, 0x540C, 0x039D,
+    0x540D, 0x540D, 0x03A4, 0x540E, 0x540E, 0x03A7, 0x540F, 0x540F, 0x039C,
+    0x5410, 0x5410, 0x039F, 0x5411, 0x5411, 0x03A3, 0x5412, 0x5412, 0x03A9,
+    0x5413, 0x5413, 0x4098, 0x5414, 0x5414, 0x3C77, 0x5416, 0x5416, 0x3E7F,
+    0x5418, 0x5418, 0x1847, 0x5419, 0x5419, 0x1844, 0x541A, 0x541A, 0x3E64,
+    0x541B, 0x541B, 0x0451, 0x541C, 0x541C, 0x1845, 0x541D, 0x541D, 0x0445,
+    0x541E, 0x541E, 0x0447, 0x541F, 0x541F, 0x045F, 0x5420, 0x5420, 0x045A,
+    0x5421, 0x5421, 0x4203, 0x5423, 0x5423, 0x45A3, 0x5424, 0x5424, 0x184C,
+    0x5425, 0x5425, 0x1846, 0x5426, 0x5426, 0x0449, 0x5427, 0x5427, 0x044B,
+    0x5428, 0x5428, 0x184B, 0x5429, 0x5429, 0x0452, 0x542A, 0x542A, 0x1841,
+    0x542B, 0x542B, 0x045E, 0x542C, 0x542C, 0x0460, 0x542D, 0x542D, 0x0446,
+    0x542E, 0x542E, 0x0457, 0x542F, 0x542F, 0x40AC, 0x5430, 0x5430, 0x183F,
+    0x5431, 0x5431, 0x045D, 0x5432, 0x5432, 0x3E75, 0x5433, 0x5433, 0x044E,
+    0x5435, 0x5436, 0x0458, 0x5437, 0x5437, 0x1840, 0x5438, 0x5438, 0x0456,
+    0x5439, 0x5439, 0x0454, 0x543B, 0x543B, 0x0455, 0x543C, 0x543C, 0x045B,
+    0x543D, 0x543D, 0x1848, 0x543E, 0x543E, 0x0448, 0x5440, 0x5440, 0x045C,
+    0x5441, 0x5441, 0x184A, 0x5442, 0x5442, 0x0450, 0x5443, 0x5443, 0x044D,
+    0x5445, 0x5445, 0x1843, 0x5446, 0x5446, 0x044C, 0x5447, 0x5447, 0x184D,
+    0x5448, 0x5448, 0x044F, 0x544A, 0x544A, 0x0453, 0x544B, 0x544B, 0x3ED1,
+    0x544D, 0x544D, 0x3EA7, 0x544E, 0x544E, 0x044A, 0x544F, 0x544F, 0x1849,
+    0x5454, 0x5454, 0x1842, 0x5460, 0x5460, 0x192E, 0x5461, 0x5461, 0x192D,
+    0x5462, 0x5462, 0x0573, 0x5463, 0x5463, 0x1930, 0x5464, 0x5464, 0x1932,
+    0x5465, 0x5465, 0x1927, 0x5466, 0x5466, 0x192A, 0x5467, 0x5467, 0x1931,
+    0x5468, 0x5468, 0x0574, 0x5469, 0x5469, 0x3F32, 0x546A, 0x546A, 0x3D83,
+    0x546B, 0x546B, 0x1924, 0x546C, 0x546C, 0x1928, 0x546D, 0x546D, 0x409D,
+    0x546F, 0x546F, 0x192C, 0x5470, 0x5470, 0x1A85, 0x5471, 0x5471, 0x056F,
+    0x5472, 0x5472, 0x1A89, 0x5473, 0x5473, 0x0562, 0x5474, 0x5474, 0x1929,
+    0x5475, 0x5475, 0x0563, 0x5476, 0x5476, 0x0570, 0x5477, 0x5477, 0x0569,
+    0x5478, 0x5478, 0x0565, 0x547A, 0x547A, 0x1925, 0x547B, 0x547B, 0x0568,
+    0x547C, 0x547C, 0x056D, 0x547D, 0x547D, 0x0576, 0x547E, 0x547E, 0x1926,
+    0x547F, 0x547F, 0x191F, 0x5480, 0x5480, 0x0567, 0x5481, 0x5481, 0x1920,
+    0x5482, 0x5482, 0x1922, 0x5484, 0x5484, 0x056A, 0x5485, 0x5485, 0x46D9,
+    0x5486, 0x5486, 0x056C, 0x5487, 0x5487, 0x191E, 0x5488, 0x5488, 0x1923,
+    0x548B, 0x548B, 0x0575, 0x548C, 0x548C, 0x0571, 0x548D, 0x548D, 0x192B,
+    0x548E, 0x548E, 0x0577, 0x548F, 0x548F, 0x40A1, 0x5490, 0x5490, 0x056E,
+    0x5491, 0x5491, 0x1921, 0x5492, 0x5492, 0x056B, 0x5493, 0x5493, 0x45A7,
+    0x5494, 0x5494, 0x3E98, 0x5495, 0x5495, 0x0566, 0x5496, 0x5496, 0x0564,
+    0x5497, 0x5497, 0x3E8A, 0x5498, 0x5498, 0x192F, 0x549A, 0x549A, 0x0572,
+    0x549C, 0x549C, 0x3F66, 0x549E, 0x549E, 0x47ED, 0x54A0, 0x54A0, 0x1A84,
+    0x54A1, 0x54A1, 0x1A78, 0x54A2, 0x54A2, 0x1A87, 0x54A3, 0x54A3, 0x45A8,
+    0x54A4, 0x54A4, 0x40A2, 0x54A5, 0x54A5, 0x1A7A, 0x54A6, 0x54A6, 0x06D6,
+    0x54A7, 0x54A7, 0x06E4, 0x54A8, 0x54A8, 0x06D2, 0x54A9, 0x54A9, 0x06E3,
+    0x54AA, 0x54AA, 0x06DB, 0x54AB, 0x54AB, 0x06E0, 0x54AC, 0x54AC, 0x06D0,
+    0x54AD, 0x54AD, 0x1A79, 0x54AE, 0x54AE, 0x1A7F, 0x54AF, 0x54AF, 0x06DF,
+    0x54B0, 0x54B0, 0x1A8B, 0x54B1, 0x54B1, 0x06E1, 0x54B2, 0x54B2, 0x3744,
+    0x54B3, 0x54B3, 0x06D7, 0x54B4, 0x54B4, 0x45A9, 0x54B6, 0x54B6, 0x1A81,
+    0x54B7, 0x54B7, 0x1A7E, 0x54B8, 0x54B8, 0x06D5, 0x54B9, 0x54B9, 0x45AA,
+    0x54BA, 0x54BA, 0x1A77, 0x54BB, 0x54BB, 0x06E2, 0x54BC, 0x54BC, 0x1A86,
+    0x54BD, 0x54BD, 0x06DA, 0x54BE, 0x54BE, 0x1A88, 0x54BF, 0x54BF, 0x06E5,
+    0x54C0, 0x54C0, 0x06D1, 0x54C1, 0x54C1, 0x06DC, 0x54C2, 0x54C2, 0x06D9,
+    0x54C3, 0x54C3, 0x1A7C, 0x54C4, 0x54C4, 0x06DD, 0x54C5, 0x54C6, 0x1A82,
+    0x54C7, 0x54C7, 0x06D8, 0x54C8, 0x54C8, 0x06DE, 0x54C9, 0x54C9, 0x06D4,
+    0x54CB, 0x54CB, 0x39A3, 0x54CC, 0x54CC, 0x43A8, 0x54CD, 0x54CD, 0x3A00,
+    0x54CE, 0x54CE, 0x06D3, 0x54CF, 0x54CF, 0x1A7B, 0x54D0, 0x54D0, 0x45AB,
+    0x54D6, 0x54D6, 0x1A80, 0x54DA, 0x54DA, 0x4923, 0x54DE, 0x54DE, 0x1A8A,
+    0x54E0, 0x54E0, 0x1C57, 0x54E1, 0x54E1, 0x0870, 0x54E2, 0x54E2, 0x1C45,
+    0x54E3, 0x54E3, 0x4341, 0x54E4, 0x54E4, 0x1C4A, 0x54E5, 0x54E5, 0x0869,
+    0x54E6, 0x54E6, 0x0874, 0x54E7, 0x54E7, 0x1C48, 0x54E8, 0x54E8, 0x0864,
+    0x54E9, 0x54E9, 0x086E, 0x54EA, 0x54EA, 0x0873, 0x54EB, 0x54EB, 0x1C4F,
+    0x54ED, 0x54ED, 0x086F, 0x54EE, 0x54EE, 0x0872, 0x54EF, 0x54EF, 0x45AC,
+    0x54F1, 0x54F1, 0x1C52, 0x54F2, 0x54F2, 0x086A, 0x54F3, 0x54F3, 0x1C49,
+    0x54F7, 0x54F8, 0x1C55, 0x54FA, 0x54FA, 0x086C, 0x54FB, 0x54FB, 0x1C54,
+    0x54FC, 0x54FC, 0x0868, 0x54FD, 0x54FD, 0x0877, 0x54FF, 0x54FF, 0x1C4C,
+    0x5501, 0x5501, 0x0866, 0x5502, 0x5502, 0x3CCC, 0x5503, 0x5503, 0x1C59,
+    0x5504, 0x5504, 0x1C4D, 0x5505, 0x5505, 0x1C51, 0x5506, 0x5506, 0x086B,
+    0x5507, 0x5507, 0x0876, 0x5508, 0x5508, 0x1C4E, 0x5509, 0x5509, 0x0871,
+    0x550A, 0x550A, 0x1C53, 0x550B, 0x550B, 0x1C5A, 0x550C, 0x550C, 0x1E69,
+    0x550D, 0x550D, 0x3A73, 0x550E, 0x550E, 0x1C58, 0x550F, 0x550F, 0x0878,
+    0x5510, 0x5510, 0x0865, 0x5511, 0x5511, 0x1C50, 0x5512, 0x5512, 0x1C47,
+    0x5513, 0x5513, 0x3EA9, 0x5514, 0x5514, 0x086D, 0x5517, 0x5517, 0x1C46,
+    0x5518, 0x5518, 0x45AD, 0x551A, 0x551A, 0x1C4B, 0x551E, 0x551E, 0x3EA8,
+    0x5523, 0x5523, 0x45AE, 0x5525, 0x5525, 0x4309, 0x5526, 0x5526, 0x1C44,
+    0x5527, 0x5527, 0x0875, 0x5528, 0x5528, 0x45AF, 0x552A, 0x552A, 0x1E61,
+    0x552B, 0x552B, 0x409A, 0x552C, 0x552C, 0x0A31, 0x552D, 0x552D, 0x1E6F,
+    0x552E, 0x552E, 0x0A2F, 0x552F, 0x552F, 0x0A2C, 0x5530, 0x5530, 0x1E66,
+    0x5531, 0x5531, 0x0A28, 0x5532, 0x5532, 0x1E6A, 0x5533, 0x5533, 0x0A33,
+    0x5534, 0x5534, 0x1E60, 0x5535, 0x5535, 0x1E65, 0x5536, 0x5536, 0x1E64,
+    0x5537, 0x5537, 0x0867, 0x5538, 0x5538, 0x0A2E, 0x5539, 0x5539, 0x1E6D,
+    0x553B, 0x553B, 0x1E70, 0x553C, 0x553C, 0x1E5D, 0x553E, 0x553E, 0x0C0C,
+    0x553F, 0x553F, 0x43A9, 0x5540, 0x5540, 0x1E71, 0x5541, 0x5541, 0x0A34,
+    0x5543, 0x5543, 0x0A26, 0x5544, 0x5544, 0x0A23, 0x5545, 0x5545, 0x1E68,
+    0x5546, 0x5546, 0x0A20, 0x5547, 0x5547, 0x40AA, 0x5548, 0x5548, 0x1E6E,
+    0x5549, 0x5549, 0x4068, 0x554A, 0x554A, 0x0A27, 0x554B, 0x554B, 0x1E72,
+    0x554D, 0x554D, 0x1E5E, 0x554E, 0x554E, 0x1E6C, 0x554F, 0x554F, 0x0A2A,
+    0x5550, 0x5550, 0x1E5F, 0x5551, 0x5551, 0x1E62, 0x5552, 0x5552, 0x1E67,
+    0x5553, 0x5553, 0x43AE, 0x5555, 0x5555, 0x0A2B, 0x5556, 0x5556, 0x0A29,
+    0x5557, 0x5557, 0x0A35, 0x555C, 0x555C, 0x0A30, 0x555D, 0x555D, 0x40A0,
+    0x555E, 0x555E, 0x0A24, 0x555F, 0x555F, 0x0ABC, 0x5561, 0x5561, 0x0A25,
+    0x5562, 0x5562, 0x1E63, 0x5563, 0x5563, 0x0A32, 0x5564, 0x5564, 0x0A2D,
+    0x5565, 0x5565, 0x1E6B, 0x5566, 0x5566, 0x0A22, 0x5569, 0x5569, 0x3E9F,
+    0x556A, 0x556A, 0x0A21, 0x556B, 0x556B, 0x3B2E, 0x5571, 0x5571, 0x3BC6,
+    0x5572, 0x5572, 0x3E8B, 0x5573, 0x5573, 0x3F24, 0x5575, 0x5576, 0x1E5B,
+    0x5577, 0x5577, 0x20C7, 0x5579, 0x5579, 0x435D, 0x557B, 0x557B, 0x0BFB,
+    0x557C, 0x557C, 0x0BFE, 0x557D, 0x557D, 0x20D2, 0x557E, 0x557E, 0x0C12,
+    0x557F, 0x557F, 0x20D5, 0x5580, 0x5580, 0x0BFC, 0x5581, 0x5581, 0x20CE,
+    0x5582, 0x5582, 0x0C02, 0x5583, 0x5583, 0x0C08, 0x5584, 0x5584, 0x0D1B,
+    0x5586, 0x5586, 0x40AE, 0x5587, 0x5587, 0x0C06, 0x5588, 0x5588, 0x20CB,
+    0x5589, 0x5589, 0x0C13, 0x558A, 0x558A, 0x0BFF, 0x558B, 0x558B, 0x0C07,
+    0x558C, 0x558C, 0x20D3, 0x558D, 0x558D, 0x2387, 0x558E, 0x558E, 0x20D8,
+    0x558F, 0x558F, 0x20CC, 0x5590, 0x5590, 0x430E, 0x5591, 0x5591, 0x20C3,
+    0x5592, 0x5592, 0x20D0, 0x5593, 0x5593, 0x20CA, 0x5594, 0x5594, 0x0C05,
+    0x5595, 0x5595, 0x20D6, 0x5598, 0x5598, 0x0C01, 0x5599, 0x5599, 0x0C15,
+    0x559A, 0x559A, 0x0C0E, 0x559C, 0x559C, 0x0C03, 0x559D, 0x559D, 0x0C00,
+    0x559F, 0x559F, 0x0C0B, 0x55A1, 0x55A1, 0x20D7, 0x55A2, 0x55A2, 0x20C9,
+    0x55A3, 0x55A3, 0x20CF, 0x55A4, 0x55A4, 0x20D1, 0x55A5, 0x55A5, 0x20C5,
+    0x55A6, 0x55A6, 0x20D4, 0x55A7, 0x55A7, 0x0BFD, 0x55A8, 0x55A8, 0x20C4,
+    0x55A9, 0x55A9, 0x40AF, 0x55AA, 0x55AA, 0x0C04, 0x55AB, 0x55AB, 0x0C14,
+    0x55AC, 0x55AC, 0x0C10, 0x55AD, 0x55AD, 0x20C6, 0x55AE, 0x55AE, 0x0C0A,
+    0x55B0, 0x55B0, 0x38F5, 0x55B1, 0x55B1, 0x0C11, 0x55B2, 0x55B2, 0x0C0D,
+    0x55B3, 0x55B3, 0x0C09, 0x55B4, 0x55B4, 0x39FE, 0x55B5, 0x55B5, 0x20CD,
+    0x55B9, 0x55B9, 0x43AA, 0x55BA, 0x55BA, 0x3E89, 0x55BB, 0x55BB, 0x0C0F,
+    0x55BC, 0x55BC, 0x3DC3, 0x55BF, 0x55BF, 0x2385, 0x55C0, 0x55C0, 0x2381,
+    0x55C1, 0x55C1, 0x3E4F, 0x55C2, 0x55C2, 0x2390, 0x55C3, 0x55C3, 0x237A,
+    0x55C4, 0x55C4, 0x2383, 0x55C5, 0x55C6, 0x0DE0, 0x55C7, 0x55C7, 0x0DD9,
+    0x55C8, 0x55C8, 0x238C, 0x55C9, 0x55C9, 0x0DE3, 0x55CA, 0x55CA, 0x237F,
+    0x55CB, 0x55CB, 0x237E, 0x55CC, 0x55CC, 0x237C, 0x55CD, 0x55CD, 0x238E,
+    0x55CE, 0x55CE, 0x0DD7, 0x55CF, 0x55CF, 0x2388, 0x55D0, 0x55D0, 0x237D,
+    0x55D1, 0x55D1, 0x0DDA, 0x55D2, 0x55D2, 0x2386, 0x55D3, 0x55D3, 0x0DD5,
+    0x55D4, 0x55D4, 0x2382, 0x55D5, 0x55D5, 0x2389, 0x55D6, 0x55D6, 0x238B,
+    0x55D7, 0x55D7, 0x45B3, 0x55D8, 0x55D8, 0x43AB, 0x55D9, 0x55D9, 0x238F,
+    0x55DA, 0x55DA, 0x0DDE, 0x55DB, 0x55DB, 0x237B, 0x55DC, 0x55DC, 0x0DD8,
+    0x55DD, 0x55DD, 0x2380, 0x55DE, 0x55DE, 0x3E94, 0x55DF, 0x55DF, 0x0DD3,
+    0x55E1, 0x55E1, 0x0DDF, 0x55E2, 0x55E2, 0x238A, 0x55E3, 0x55E4, 0x0DDB,
+    0x55E5, 0x55E5, 0x0DE2, 0x55E6, 0x55E6, 0x0DD6, 0x55E7, 0x55E7, 0x011F,
+    0x55E8, 0x55E8, 0x0DD4, 0x55E9, 0x55E9, 0x2384, 0x55EA, 0x55EA, 0x3E7C,
+    0x55EC, 0x55EC, 0x37D2, 0x55EF, 0x55EF, 0x0DDD, 0x55F0, 0x55F0, 0x3E88,
+    0x55F1, 0x55F1, 0x3E83, 0x55F2, 0x55F2, 0x238D, 0x55F5, 0x55F5, 0x4786,
+    0x55F6, 0x55F6, 0x0F9F, 0x55F7, 0x55F7, 0x0F9A, 0x55F9, 0x55F9, 0x2637,
+    0x55FA, 0x55FA, 0x2633, 0x55FB, 0x55FB, 0x4626, 0x55FC, 0x55FC, 0x262D,
+    0x55FD, 0x55FD, 0x0F94, 0x55FE, 0x55FE, 0x0F90, 0x55FF, 0x55FF, 0x2636,
+    0x5600, 0x5600, 0x0F91, 0x5601, 0x5601, 0x2630, 0x5602, 0x5602, 0x2632,
+    0x5604, 0x5604, 0x2635, 0x5605, 0x5605, 0x3E82, 0x5606, 0x5606, 0x0F96,
+    0x5608, 0x5608, 0x0F9D, 0x5609, 0x5609, 0x0F97, 0x560C, 0x560C, 0x262B,
+    0x560D, 0x560E, 0x0F98, 0x560F, 0x560F, 0x262E, 0x5610, 0x5610, 0x0F9E,
+    0x5611, 0x5611, 0x3F4D, 0x5612, 0x5612, 0x262C, 0x5613, 0x5613, 0x2631,
+    0x5614, 0x5614, 0x0F95, 0x5615, 0x5615, 0x262A, 0x5616, 0x5616, 0x0F9B,
+    0x5617, 0x5617, 0x0F93, 0x561B, 0x561B, 0x0F92, 0x561C, 0x561C, 0x262F,
+    0x561D, 0x561D, 0x2634, 0x561E, 0x561E, 0x3E68, 0x561F, 0x561F, 0x0F9C,
+    0x5620, 0x5620, 0x3F7D, 0x5621, 0x5621, 0x43AD, 0x5622, 0x5622, 0x3E67,
+    0x5623, 0x5623, 0x4707, 0x5625, 0x5625, 0x3E78, 0x5627, 0x5627, 0x2629,
+    0x5629, 0x5629, 0x1119, 0x562A, 0x562A, 0x289D, 0x562C, 0x562C, 0x289A,
+    0x562D, 0x562D, 0x3E63, 0x562E, 0x562E, 0x1113, 0x562F, 0x5630, 0x111F,
+    0x5632, 0x5632, 0x1116, 0x5633, 0x5633, 0x2898, 0x5634, 0x5634, 0x1118,
+    0x5635, 0x5635, 0x2890, 0x5636, 0x5636, 0x111E, 0x5637, 0x5637, 0x40B7,
+    0x5638, 0x5638, 0x289C, 0x5639, 0x5639, 0x1115, 0x563A, 0x563A, 0x289E,
+    0x563B, 0x563B, 0x1114, 0x563D, 0x563D, 0x2899, 0x563E, 0x563E, 0x289B,
+    0x563F, 0x563F, 0x1117, 0x5640, 0x5640, 0x2897, 0x5641, 0x5641, 0x2891,
+    0x5642, 0x5642, 0x288E, 0x5643, 0x5643, 0x3E7E, 0x5645, 0x5645, 0x20C8,
+    0x5646, 0x5646, 0x2894, 0x5648, 0x5648, 0x288D, 0x5649, 0x5649, 0x2893,
+    0x564A, 0x564A, 0x2892, 0x564C, 0x564C, 0x288F, 0x564D, 0x564D, 0x40BC,
+    0x564E, 0x564E, 0x111B, 0x564F, 0x564F, 0x40BD, 0x5650, 0x5650, 0x47CF,
+    0x5652, 0x5652, 0x45C2, 0x5653, 0x5653, 0x111A, 0x5654, 0x5654, 0x43AF,
+    0x5657, 0x5657, 0x111C, 0x5658, 0x5658, 0x2895, 0x5659, 0x5659, 0x1295,
+    0x565A, 0x565A, 0x2896, 0x565D, 0x565D, 0x3EF9, 0x565E, 0x565E, 0x2B10,
+    0x5660, 0x5660, 0x2B09, 0x5661, 0x5661, 0x3812, 0x5662, 0x5662, 0x12A1,
+    0x5663, 0x5663, 0x2B0D, 0x5664, 0x5664, 0x1299, 0x5665, 0x5665, 0x129D,
+    0x5666, 0x5666, 0x2B0C, 0x5668, 0x5668, 0x129C, 0x5669, 0x5669, 0x1298,
+    0x566A, 0x566A, 0x129B, 0x566B, 0x566B, 0x1296, 0x566C, 0x566C, 0x12A0,
+    0x566D, 0x566D, 0x2B0E, 0x566E, 0x566E, 0x2B0A, 0x566F, 0x566F, 0x129F,
+    0x5670, 0x5670, 0x2B08, 0x5671, 0x5671, 0x129E, 0x5672, 0x5672, 0x2B0F,
+    0x5673, 0x5673, 0x2B0B, 0x5674, 0x5674, 0x111D, 0x5676, 0x5676, 0x12A2,
+    0x5677, 0x5677, 0x2B11, 0x5678, 0x5678, 0x129A, 0x5679, 0x5679, 0x1297,
+    0x567A, 0x567A, 0x3D85, 0x567B, 0x567B, 0x3EB7, 0x567C, 0x567C, 0x3EED,
+    0x567E, 0x567E, 0x2D47, 0x567F, 0x567F, 0x2D49, 0x5680, 0x5680, 0x13BA,
+    0x5681, 0x5681, 0x2D4A, 0x5682, 0x5682, 0x2D48, 0x5683, 0x5683, 0x2D46,
+    0x5684, 0x5684, 0x2D45, 0x5685, 0x5685, 0x13BC, 0x5686, 0x5686, 0x2D44,
+    0x5687, 0x5687, 0x13BD, 0x5689, 0x5689, 0x4628, 0x568A, 0x568A, 0x3949,
+    0x568B, 0x568B, 0x3E4C, 0x568C, 0x568D, 0x2D42, 0x568E, 0x568E, 0x13B9,
+    0x568F, 0x568F, 0x13BE, 0x5690, 0x5690, 0x13BB, 0x5692, 0x5692, 0x39A6,
+    0x5693, 0x5693, 0x2D41, 0x5695, 0x5695, 0x14CA, 0x5697, 0x5697, 0x2F13,
+    0x5698, 0x5698, 0x2F11, 0x5699, 0x5699, 0x2F16, 0x569A, 0x569A, 0x2F14,
+    0x569C, 0x569C, 0x2F12, 0x569D, 0x569D, 0x2F15, 0x569E, 0x569E, 0x39A4,
+    0x569F, 0x569F, 0x3948, 0x56A1, 0x56A1, 0x436B, 0x56A4, 0x56A4, 0x3CC8,
+    0x56A5, 0x56A5, 0x1576, 0x56A6, 0x56A7, 0x3081, 0x56A8, 0x56A8, 0x1577,
+    0x56AA, 0x56AA, 0x3083, 0x56AB, 0x56AB, 0x307F, 0x56AC, 0x56AC, 0x3084,
+    0x56AD, 0x56AD, 0x3080, 0x56AE, 0x56AE, 0x14CB, 0x56AF, 0x56AF, 0x45F7,
+    0x56B1, 0x56B1, 0x463F, 0x56B2, 0x56B2, 0x31C8, 0x56B3, 0x56B3, 0x31CA,
+    0x56B4, 0x56B4, 0x160C, 0x56B5, 0x56B5, 0x31C9, 0x56B6, 0x56B6, 0x160B,
+    0x56B7, 0x56B7, 0x160A, 0x56B9, 0x56B9, 0x486F, 0x56BC, 0x56BC, 0x160D,
+    0x56BD, 0x56BE, 0x32CA, 0x56BF, 0x56BF, 0x3E5D, 0x56C0, 0x56C0, 0x166B,
+    0x56C1, 0x56C1, 0x166A, 0x56C2, 0x56C2, 0x166C, 0x56C3, 0x56C3, 0x32C9,
+    0x56C5, 0x56C5, 0x3379, 0x56C6, 0x56C6, 0x3378, 0x56C8, 0x56C8, 0x16BD,
+    0x56C9, 0x56C9, 0x16BF, 0x56CA, 0x56CA, 0x16BE, 0x56CB, 0x56CB, 0x337A,
+    0x56CC, 0x56CC, 0x16F6, 0x56CD, 0x56CD, 0x3481, 0x56D1, 0x56D1, 0x171F,
+    0x56D3, 0x56D3, 0x3480, 0x56D4, 0x56D4, 0x34C9, 0x56D6, 0x56D6, 0x488A,
+    0x56D7, 0x56D7, 0x1775, 0x56DA, 0x56DA, 0x032D, 0x56DB, 0x56DB, 0x032C,
+    0x56DD, 0x56DD, 0x03AC, 0x56DE, 0x56DE, 0x03AB, 0x56DF, 0x56DF, 0x17D0,
+    0x56E0, 0x56E0, 0x03AA, 0x56E1, 0x56E1, 0x17CF, 0x56E2, 0x56E2, 0x4548,
+    0x56E4, 0x56E4, 0x0463, 0x56E5, 0x56E5, 0x1850, 0x56E7, 0x56E7, 0x184F,
+    0x56EA, 0x56EA, 0x0461, 0x56EB, 0x56EB, 0x0464, 0x56ED, 0x56ED, 0x40C4,
+    0x56EE, 0x56EE, 0x184E, 0x56EF, 0x56EF, 0x40C3, 0x56F0, 0x56F0, 0x0462,
+    0x56F1, 0x56F1, 0x40BF, 0x56F7, 0x56F7, 0x1933, 0x56F9, 0x56F9, 0x1934,
+    0x56FA, 0x56FA, 0x0578, 0x56FD, 0x56FD, 0x3D64, 0x56FF, 0x56FF, 0x06E6,
+    0x5700, 0x5700, 0x40C2, 0x5701, 0x5702, 0x1C5B, 0x5703, 0x5704, 0x0879,
+    0x5707, 0x5707, 0x1E74, 0x5708, 0x5708, 0x0A36, 0x5709, 0x5709, 0x0A38,
+    0x570A, 0x570A, 0x1E73, 0x570B, 0x570B, 0x0A37, 0x570C, 0x570C, 0x20D9,
+    0x570D, 0x570D, 0x0C16, 0x5712, 0x5713, 0x0DE4, 0x5714, 0x5714, 0x2391,
+    0x5715, 0x5715, 0x3E36, 0x5716, 0x5716, 0x0FA1, 0x5718, 0x5718, 0x0FA0,
+    0x571A, 0x571A, 0x289F, 0x571B, 0x571B, 0x2B13, 0x571C, 0x571C, 0x2B12,
+    0x571D, 0x571D, 0x3A02, 0x571E, 0x571E, 0x3505, 0x571F, 0x571F, 0x027A,
+    0x5720, 0x5720, 0x1784, 0x5722, 0x5723, 0x179A, 0x5728, 0x5728, 0x03AF,
+    0x5729, 0x5729, 0x03B3, 0x572A, 0x572A, 0x17D2, 0x572C, 0x572C, 0x03B1,
+    0x572D, 0x572D, 0x03B0, 0x572E, 0x572E, 0x17D1, 0x572F, 0x572F, 0x03B2,
+    0x5730, 0x5730, 0x03AE, 0x5732, 0x5732, 0x3AF9, 0x5733, 0x5733, 0x03AD,
+    0x5734, 0x5734, 0x17D3, 0x573B, 0x573B, 0x046E, 0x573E, 0x573E, 0x046B,
+    0x573F, 0x573F, 0x4855, 0x5740, 0x5740, 0x0467, 0x5741, 0x5741, 0x1851,
+    0x5742, 0x5742, 0x40CC, 0x5743, 0x5743, 0x40DE, 0x5745, 0x5745, 0x1852,
+    0x5746, 0x5746, 0x40C8, 0x5747, 0x5747, 0x0469, 0x5749, 0x5749, 0x1854,
+    0x574A, 0x574A, 0x0465, 0x574B, 0x574B, 0x1855, 0x574C, 0x574C, 0x1853,
+    0x574D, 0x574D, 0x0468, 0x574E, 0x574E, 0x046A, 0x574F, 0x574F, 0x046D,
+    0x5750, 0x5750, 0x046C, 0x5751, 0x5751, 0x0466, 0x5752, 0x5752, 0x1856,
+    0x5754, 0x5754, 0x4785, 0x5757, 0x5757, 0x47E6, 0x575B, 0x575B, 0x3982,
+    0x575F, 0x575F, 0x3FBF, 0x5761, 0x5761, 0x057D, 0x5762, 0x5762, 0x1941,
+    0x5764, 0x5764, 0x057F, 0x5766, 0x5766, 0x057E, 0x5767, 0x5767, 0x3F2B,
+    0x5768, 0x5768, 0x1942, 0x5769, 0x5769, 0x057C, 0x576A, 0x576A, 0x057B,
+    0x576B, 0x576B, 0x1938, 0x576D, 0x576D, 0x1937, 0x576F, 0x576F, 0x1935,
+    0x5770, 0x5770, 0x193A, 0x5771, 0x5771, 0x1939, 0x5772, 0x5772, 0x1936,
+    0x5773, 0x5774, 0x193F, 0x5775, 0x5775, 0x193D, 0x5776, 0x5776, 0x193B,
+    0x5777, 0x5777, 0x057A, 0x577A, 0x577A, 0x3F5F, 0x577B, 0x577B, 0x193E,
+    0x577C, 0x577C, 0x0580, 0x577D, 0x577D, 0x1943, 0x577E, 0x577E, 0x46DC,
+    0x577F, 0x577F, 0x3A07, 0x5780, 0x5780, 0x193C, 0x5782, 0x5782, 0x06E7,
+    0x5783, 0x5783, 0x0579, 0x5788, 0x5788, 0x484B, 0x578A, 0x578A, 0x3C7B,
+    0x578B, 0x578B, 0x06E8, 0x578C, 0x578C, 0x1A90, 0x578D, 0x578D, 0x3A06,
+    0x578F, 0x578F, 0x1A96, 0x5790, 0x5790, 0x4166, 0x5793, 0x5793, 0x06EE,
+    0x5794, 0x5794, 0x1A94, 0x5795, 0x5795, 0x1A9A, 0x5797, 0x5797, 0x1A91,
+    0x5798, 0x5798, 0x1A95, 0x5799, 0x5799, 0x1A97, 0x579A, 0x579A, 0x1A99,
+    0x579B, 0x579B, 0x1A93, 0x579C, 0x579C, 0x4608, 0x579D, 0x579D, 0x1A92,
+    0x579E, 0x579F, 0x1A8D, 0x57A0, 0x57A0, 0x06E9, 0x57A1, 0x57A1, 0x4864,
+    0x57A2, 0x57A2, 0x06EB, 0x57A3, 0x57A3, 0x06EA, 0x57A4, 0x57A4, 0x1A8F,
+    0x57A5, 0x57A5, 0x1A98, 0x57A7, 0x57A7, 0x4914, 0x57AA, 0x57AA, 0x4905,
+    0x57AE, 0x57AE, 0x06ED, 0x57B4, 0x57B4, 0x4741, 0x57B5, 0x57B5, 0x1A8C,
+    0x57B6, 0x57B6, 0x1C66, 0x57B8, 0x57B8, 0x1C65, 0x57B9, 0x57B9, 0x1C6A,
+    0x57BA, 0x57BA, 0x1C61, 0x57BB, 0x57BB, 0x3C79, 0x57BC, 0x57BC, 0x1C64,
+    0x57BD, 0x57BD, 0x1C63, 0x57BE, 0x57BE, 0x372C, 0x57BF, 0x57BF, 0x1C67,
+    0x57C1, 0x57C1, 0x1C6B, 0x57C2, 0x57C2, 0x087B, 0x57C3, 0x57C3, 0x087E,
+    0x57C4, 0x57C4, 0x3B5B, 0x57C6, 0x57C6, 0x1C62, 0x57C7, 0x57C7, 0x1C68,
+    0x57C8, 0x57C8, 0x3D0B, 0x57CB, 0x57CB, 0x087D, 0x57CC, 0x57CC, 0x1C5D,
+    0x57CE, 0x57CE, 0x06EC, 0x57CF, 0x57CF, 0x1E82, 0x57D0, 0x57D0, 0x1C69,
+    0x57D2, 0x57D2, 0x1C60, 0x57D4, 0x57D4, 0x087C, 0x57D5, 0x57D5, 0x1C5F,
+    0x57D7, 0x57D7, 0x3C7D, 0x57DC, 0x57DC, 0x1E79, 0x57DD, 0x57DD, 0x3A05,
+    0x57DE, 0x57DE, 0x3F01, 0x57DF, 0x57DF, 0x0A39, 0x57E0, 0x57E0, 0x0A3D,
+    0x57E1, 0x57E1, 0x1E89, 0x57E2, 0x57E2, 0x1E77, 0x57E3, 0x57E3, 0x1E85,
+    0x57E4, 0x57E4, 0x0A3E, 0x57E5, 0x57E5, 0x1E87, 0x57E6, 0x57E6, 0x40CF,
+    0x57E7, 0x57E7, 0x1E8D, 0x57E9, 0x57E9, 0x1E91, 0x57EC, 0x57EC, 0x1E88,
+    0x57ED, 0x57ED, 0x1E7C, 0x57EE, 0x57EE, 0x1E84, 0x57EF, 0x57EF, 0x4754,
+    0x57F0, 0x57F0, 0x1E92, 0x57F1, 0x57F1, 0x1E90, 0x57F2, 0x57F2, 0x1E86,
+    0x57F3, 0x57F3, 0x1E81, 0x57F4, 0x57F4, 0x1E7A, 0x57F5, 0x57F5, 0x20E1,
+    0x57F6, 0x57F6, 0x1E78, 0x57F7, 0x57F7, 0x0A42, 0x57F8, 0x57F8, 0x1E7F,
+    0x57F9, 0x57F9, 0x0A43, 0x57FA, 0x57FA, 0x0A3F, 0x57FB, 0x57FB, 0x1E75,
+    0x57FC, 0x57FC, 0x1E8B, 0x57FD, 0x57FD, 0x1E7D, 0x57FE, 0x57FE, 0x408F,
+    0x5800, 0x5800, 0x1E7B, 0x5801, 0x5801, 0x1E8E, 0x5802, 0x5802, 0x0A40,
+    0x5803, 0x5803, 0x40D1, 0x5804, 0x5804, 0x1E94, 0x5805, 0x5805, 0x0A3A,
+    0x5806, 0x5806, 0x0A3C, 0x5807, 0x5807, 0x1E83, 0x5808, 0x5808, 0x1E7E,
+    0x5809, 0x5809, 0x087F, 0x580A, 0x580A, 0x0A3B, 0x580B, 0x580B, 0x1E80,
+    0x580C, 0x580C, 0x1E8F, 0x580D, 0x580D, 0x1E93, 0x580E, 0x580E, 0x1E8A,
+    0x5810, 0x5810, 0x1E8C, 0x5812, 0x5812, 0x3D0A, 0x5814, 0x5814, 0x1E76,
+    0x5819, 0x5819, 0x20DC, 0x581B, 0x581B, 0x20E5, 0x581C, 0x581C, 0x20E4,
+    0x581D, 0x581D, 0x0C1E, 0x581E, 0x581E, 0x20DD, 0x5820, 0x5820, 0x0C1F,
+    0x5821, 0x5821, 0x0C1D, 0x5822, 0x5822, 0x3C28, 0x5823, 0x5823, 0x20DF,
+    0x5824, 0x5824, 0x0C1A, 0x5825, 0x5825, 0x20E3, 0x5826, 0x5826, 0x40D4,
+    0x5827, 0x5827, 0x20DE, 0x5828, 0x5828, 0x20E0, 0x5829, 0x5829, 0x20DA,
+    0x582A, 0x582A, 0x0C18, 0x582C, 0x582C, 0x20ED, 0x582D, 0x582D, 0x20EC,
+    0x582E, 0x582E, 0x20E9, 0x582F, 0x582F, 0x0C17, 0x5830, 0x5831, 0x0C1B,
+    0x5832, 0x5832, 0x1C5E, 0x5833, 0x5833, 0x20E6, 0x5834, 0x5834, 0x0C19,
+    0x5835, 0x5835, 0x0A41, 0x5836, 0x5836, 0x20E8, 0x5837, 0x5837, 0x20DB,
+    0x5838, 0x5838, 0x20EB, 0x5839, 0x5839, 0x20EA, 0x583A, 0x583A, 0x3D72,
+    0x583B, 0x583B, 0x20EE, 0x583D, 0x583D, 0x239F, 0x583F, 0x583F, 0x20E7,
+    0x5840, 0x5840, 0x3D82, 0x5844, 0x5844, 0x47BB, 0x5847, 0x5847, 0x3AC2,
+    0x5848, 0x5848, 0x20E2, 0x5849, 0x5849, 0x2397, 0x584A, 0x584A, 0x0DEF,
+    0x584B, 0x584B, 0x0DF2, 0x584C, 0x584C, 0x0DED, 0x584D, 0x584D, 0x2396,
+    0x584E, 0x584E, 0x239A, 0x584F, 0x584F, 0x2395, 0x5851, 0x5851, 0x0DE7,
+    0x5852, 0x5852, 0x0DF1, 0x5853, 0x5853, 0x2392, 0x5854, 0x5854, 0x0DEB,
+    0x5855, 0x5855, 0x2399, 0x5857, 0x5857, 0x0DE9, 0x5858, 0x5858, 0x0DE8,
+    0x5859, 0x5859, 0x239C, 0x585A, 0x585A, 0x0DEA, 0x585B, 0x585B, 0x239E,
+    0x585C, 0x585C, 0x4949, 0x585D, 0x585D, 0x239B, 0x585E, 0x585E, 0x0DE6,
+    0x585F, 0x585F, 0x43DF, 0x5862, 0x5862, 0x0DF0, 0x5863, 0x5863, 0x23A0,
+    0x5864, 0x5864, 0x2394, 0x5865, 0x5865, 0x239D, 0x5868, 0x5868, 0x2393,
+    0x5869, 0x5869, 0x3D65, 0x586B, 0x586B, 0x0DEC, 0x586C, 0x586C, 0x399A,
+    0x586D, 0x586D, 0x0DEE, 0x586F, 0x586F, 0x2398, 0x5871, 0x5871, 0x23A1,
+    0x5872, 0x5872, 0x3C26, 0x5873, 0x5873, 0x4355, 0x5874, 0x5874, 0x263F,
+    0x5875, 0x5875, 0x0FA2, 0x5876, 0x5876, 0x2645, 0x5879, 0x5879, 0x0FA7,
+    0x587A, 0x587A, 0x2641, 0x587B, 0x587B, 0x2648, 0x587C, 0x587C, 0x2639,
+    0x587D, 0x587D, 0x0FA9, 0x587E, 0x587E, 0x0FA3, 0x587F, 0x587F, 0x263E,
+    0x5880, 0x5880, 0x1121, 0x5881, 0x5881, 0x263D, 0x5882, 0x5882, 0x2646,
+    0x5883, 0x5883, 0x0FA4, 0x5885, 0x5885, 0x0FA8, 0x5886, 0x5886, 0x263C,
+    0x5887, 0x5887, 0x2642, 0x5888, 0x5888, 0x2647, 0x5889, 0x5889, 0x2638,
+    0x588A, 0x588A, 0x0FA6, 0x588B, 0x588B, 0x2640, 0x588E, 0x588E, 0x2644,
+    0x588F, 0x588F, 0x264A, 0x5890, 0x5890, 0x263A, 0x5891, 0x5891, 0x2643,
+    0x5893, 0x5893, 0x0FA5, 0x5894, 0x5894, 0x2649, 0x5898, 0x5898, 0x263B,
+    0x5899, 0x5899, 0x4618, 0x589A, 0x589A, 0x4903, 0x589C, 0x589C, 0x1125,
+    0x589D, 0x589D, 0x28A1, 0x589E, 0x589E, 0x1123, 0x589F, 0x589F, 0x1122,
+    0x58A0, 0x58A0, 0x28A3, 0x58A1, 0x58A1, 0x28A8, 0x58A3, 0x58A3, 0x28A4,
+    0x58A5, 0x58A5, 0x28A7, 0x58A6, 0x58A6, 0x1128, 0x58A7, 0x58A7, 0x3EEB,
+    0x58A8, 0x58A8, 0x1288, 0x58A9, 0x58A9, 0x1127, 0x58AA, 0x58AA, 0x40D7,
+    0x58AB, 0x58AB, 0x28A0, 0x58AC, 0x58AC, 0x28A6, 0x58AE, 0x58AE, 0x1126,
+    0x58AF, 0x58AF, 0x28A5, 0x58B0, 0x58B0, 0x37A4, 0x58B1, 0x58B1, 0x28A2,
+    0x58B3, 0x58B3, 0x1124, 0x58B5, 0x58B5, 0x4840, 0x58B6, 0x58B6, 0x3DFD,
+    0x58BA, 0x58BA, 0x2B18, 0x58BB, 0x58BB, 0x36EB, 0x58BC, 0x58BC, 0x2B1A,
+    0x58BD, 0x58BD, 0x2B15, 0x58BE, 0x58BE, 0x12A4, 0x58BF, 0x58BF, 0x2B17,
+    0x58C1, 0x58C1, 0x12A3, 0x58C2, 0x58C2, 0x2B19, 0x58C5, 0x58C5, 0x12A6,
+    0x58C6, 0x58C6, 0x2B1B, 0x58C7, 0x58C7, 0x12A5, 0x58C8, 0x58C8, 0x2B14,
+    0x58C9, 0x58C9, 0x2B16, 0x58CB, 0x58CB, 0x3A09, 0x58CE, 0x58CE, 0x13C2,
+    0x58CF, 0x58CF, 0x2D4D, 0x58D1, 0x58D1, 0x13C1, 0x58D2, 0x58D2, 0x2D4E,
+    0x58D3, 0x58D3, 0x13C0, 0x58D4, 0x58D4, 0x2D4C, 0x58D5, 0x58D5, 0x13BF,
+    0x58D6, 0x58D6, 0x2D4B, 0x58D8, 0x58D8, 0x14CD, 0x58D9, 0x58D9, 0x14CC,
+    0x58DA, 0x58DA, 0x3085, 0x58DB, 0x58DB, 0x3087, 0x58DC, 0x58DC, 0x40DA,
+    0x58DD, 0x58DD, 0x3086, 0x58DE, 0x58DF, 0x1578, 0x58E0, 0x58E0, 0x40D9,
+    0x58E2, 0x58E2, 0x157A, 0x58E3, 0x58E3, 0x31CB, 0x58E4, 0x58E4, 0x160E,
+    0x58E7, 0x58E7, 0x3411, 0x58E8, 0x58E8, 0x3410, 0x58E9, 0x58E9, 0x1720,
+    0x58EB, 0x58EB, 0x027B, 0x58EC, 0x58EC, 0x02C1, 0x58EF, 0x58EF, 0x046F,
+    0x58F0, 0x58F0, 0x4549, 0x58F2, 0x58F2, 0x3D68, 0x58F3, 0x58F3, 0x3C7A,
+    0x58F4, 0x58F4, 0x1A9B, 0x58F9, 0x58FA, 0x0C20, 0x58FB, 0x58FB, 0x40DC,
+    0x58FC, 0x58FC, 0x23A2, 0x58FD, 0x58FD, 0x0FAA, 0x58FE, 0x58FE, 0x264B,
+    0x58FF, 0x58FF, 0x28A9, 0x5902, 0x5902, 0x0224, 0x5903, 0x5903, 0x1785,
+    0x5904, 0x5904, 0x454A, 0x5905, 0x5905, 0x4599, 0x5906, 0x5906, 0x1857,
+    0x5907, 0x5907, 0x454B, 0x590A, 0x590A, 0x0224, 0x590C, 0x590C, 0x1944,
+    0x590D, 0x590D, 0x1A9C, 0x590E, 0x590E, 0x1C6C, 0x590F, 0x590F, 0x0880,
+    0x5911, 0x5911, 0x4274, 0x5912, 0x5912, 0x3088, 0x5914, 0x5914, 0x166D,
+    0x5915, 0x5915, 0x027C, 0x5916, 0x5916, 0x032E, 0x5917, 0x5917, 0x179C,
+    0x5919, 0x591A, 0x03B4, 0x591C, 0x591C, 0x0581, 0x591F, 0x591F, 0x40E3,
+    0x5920, 0x5920, 0x0A44, 0x5922, 0x5922, 0x0FAC, 0x5924, 0x5924, 0x0FAD,
+    0x5925, 0x5925, 0x0FAB, 0x5927, 0x5927, 0x027D, 0x5929, 0x5929, 0x02C2,
+    0x592A, 0x592A, 0x02C4, 0x592B, 0x592B, 0x02C3, 0x592C, 0x592C, 0x1786,
+    0x592D, 0x592D, 0x02C5, 0x592E, 0x592E, 0x032F, 0x592F, 0x592F, 0x179D,
+    0x5931, 0x5931, 0x0330, 0x5932, 0x5932, 0x454C, 0x5934, 0x5934, 0x454D,
+    0x5937, 0x5938, 0x03B6, 0x593C, 0x593C, 0x17D4, 0x593E, 0x593E, 0x0470,
+    0x5940, 0x5940, 0x1858, 0x5944, 0x5944, 0x0585, 0x5945, 0x5945, 0x1945,
+    0x5947, 0x5948, 0x0583, 0x5949, 0x5949, 0x0582, 0x594A, 0x594A, 0x1C6D,
+    0x594E, 0x594E, 0x06F2, 0x594F, 0x594F, 0x06F1, 0x5950, 0x5950, 0x06F3,
+    0x5951, 0x5951, 0x06F0, 0x5953, 0x5953, 0x1A9D, 0x5954, 0x5954, 0x0586,
+    0x5955, 0x5955, 0x06EF, 0x5957, 0x5958, 0x0881, 0x595A, 0x595A, 0x0883,
+    0x595C, 0x595C, 0x1E95, 0x5960, 0x5960, 0x0C22, 0x5961, 0x5961, 0x20EF,
+    0x5962, 0x5962, 0x0A45, 0x5965, 0x5965, 0x4852, 0x5967, 0x5967, 0x0DF3,
+    0x5969, 0x5969, 0x0FAF, 0x596A, 0x596A, 0x0FAE, 0x596B, 0x596B, 0x264C,
+    0x596D, 0x596D, 0x1129, 0x596E, 0x596E, 0x12A7, 0x5970, 0x5970, 0x2F17,
+    0x5971, 0x5971, 0x337B, 0x5972, 0x5972, 0x3412, 0x5973, 0x5973, 0x027E,
+    0x5974, 0x5974, 0x0331, 0x5975, 0x5975, 0x3E6A, 0x5976, 0x5976, 0x0332,
+    0x5977, 0x5977, 0x17DA, 0x5978, 0x5978, 0x03B9, 0x5979, 0x5979, 0x03BC,
+    0x597B, 0x597B, 0x17D8, 0x597C, 0x597C, 0x17D6, 0x597D, 0x597D, 0x03BB,
+    0x597E, 0x597E, 0x17D9, 0x597F, 0x597F, 0x17DB, 0x5980, 0x5980, 0x17D5,
+    0x5981, 0x5981, 0x03BE, 0x5982, 0x5982, 0x03BD, 0x5983, 0x5983, 0x03BA,
+    0x5984, 0x5984, 0x03B8, 0x5985, 0x5985, 0x17D7, 0x5989, 0x5989, 0x3D30,
+    0x598A, 0x598A, 0x047B, 0x598D, 0x598D, 0x0478, 0x598E, 0x598E, 0x185D,
+    0x598F, 0x598F, 0x1860, 0x5990, 0x5990, 0x185F, 0x5992, 0x5992, 0x0472,
+    0x5993, 0x5993, 0x047A, 0x5994, 0x5994, 0x3C99, 0x5996, 0x5996, 0x0477,
+    0x5997, 0x5997, 0x185C, 0x5998, 0x5998, 0x185A, 0x5999, 0x5999, 0x0476,
+    0x599A, 0x599A, 0x3BB0, 0x599D, 0x599D, 0x0471, 0x599E, 0x599E, 0x0474,
+    0x599F, 0x599F, 0x3DAF, 0x59A0, 0x59A0, 0x185B, 0x59A1, 0x59A1, 0x1862,
+    0x59A2, 0x59A2, 0x185E, 0x59A3, 0x59A3, 0x0475, 0x59A4, 0x59A4, 0x0479,
+    0x59A5, 0x59A5, 0x047C, 0x59A6, 0x59A6, 0x1859, 0x59A7, 0x59A7, 0x1861,
+    0x59A8, 0x59A8, 0x0473, 0x59AC, 0x59AC, 0x3D81, 0x59AE, 0x59AE, 0x058B,
+    0x59AF, 0x59AF, 0x0593, 0x59B0, 0x59B0, 0x3CD8, 0x59B1, 0x59B1, 0x1951,
+    0x59B2, 0x59B2, 0x194A, 0x59B3, 0x59B3, 0x0594, 0x59B4, 0x59B4, 0x1955,
+    0x59B5, 0x59B5, 0x1946, 0x59B6, 0x59B6, 0x194D, 0x59B7, 0x59B7, 0x3F2D,
+    0x59B8, 0x59B8, 0x3A10, 0x59B9, 0x59B9, 0x058A, 0x59BA, 0x59BA, 0x1947,
+    0x59BB, 0x59BB, 0x0588, 0x59BC, 0x59BC, 0x194E, 0x59BD, 0x59BD, 0x1952,
+    0x59BE, 0x59BE, 0x0587, 0x59C0, 0x59C0, 0x1953, 0x59C1, 0x59C1, 0x194C,
+    0x59C3, 0x59C3, 0x194F, 0x59C4, 0x59C4, 0x3D04, 0x59C5, 0x59C5, 0x0596,
+    0x59C6, 0x59C6, 0x058D, 0x59C7, 0x59C7, 0x1956, 0x59C8, 0x59C8, 0x1954,
+    0x59C9, 0x59C9, 0x40EC, 0x59CA, 0x59CA, 0x0592, 0x59CB, 0x59CB, 0x0590,
+    0x59CC, 0x59CC, 0x194B, 0x59CD, 0x59CD, 0x058F, 0x59CE, 0x59CE, 0x1949,
+    0x59CF, 0x59CF, 0x1948, 0x59D0, 0x59D0, 0x058E, 0x59D1, 0x59D1, 0x058C,
+    0x59D2, 0x59D2, 0x0595, 0x59D3, 0x59D3, 0x0591, 0x59D4, 0x59D4, 0x0589,
+    0x59D6, 0x59D6, 0x1950, 0x59D8, 0x59D8, 0x06F5, 0x59D9, 0x59D9, 0x40F1,
+    0x59DA, 0x59DA, 0x06FC, 0x59DB, 0x59DB, 0x1AAB, 0x59DC, 0x59DC, 0x06F4,
+    0x59DD, 0x59DD, 0x1AA3, 0x59DE, 0x59DE, 0x1A9F, 0x59E0, 0x59E0, 0x1AAF,
+    0x59E1, 0x59E1, 0x1A9E, 0x59E3, 0x59E3, 0x06F7, 0x59E4, 0x59E4, 0x1AA8,
+    0x59E5, 0x59E5, 0x06FA, 0x59E6, 0x59E6, 0x06FD, 0x59E8, 0x59E8, 0x06F8,
+    0x59E9, 0x59E9, 0x1AAC, 0x59EA, 0x59EA, 0x06FB, 0x59EB, 0x59EB, 0x3D59,
+    0x59EC, 0x59EC, 0x088A, 0x59ED, 0x59ED, 0x1AB2, 0x59EE, 0x59EE, 0x1AA0,
+    0x59EF, 0x59EF, 0x3D38, 0x59F0, 0x59F0, 0x3BB2, 0x59F1, 0x59F1, 0x1AA2,
+    0x59F2, 0x59F2, 0x1AA9, 0x59F3, 0x59F3, 0x1AAD, 0x59F4, 0x59F4, 0x1AB1,
+    0x59F5, 0x59F5, 0x1AAE, 0x59F6, 0x59F6, 0x1AA7, 0x59F7, 0x59F7, 0x1AAA,
+    0x59F8, 0x59F8, 0x3E4A, 0x59F9, 0x59F9, 0x40F8, 0x59FA, 0x59FA, 0x1AA4,
+    0x59FB, 0x59FB, 0x06FF, 0x59FC, 0x59FC, 0x1AA6, 0x59FD, 0x59FD, 0x1AA5,
+    0x59FE, 0x59FE, 0x1AB0, 0x59FF, 0x59FF, 0x06F6, 0x5A00, 0x5A00, 0x1AA1,
+    0x5A01, 0x5A01, 0x06FE, 0x5A02, 0x5A02, 0x3B8D, 0x5A03, 0x5A03, 0x06F9,
+    0x5A09, 0x5A09, 0x0890, 0x5A0A, 0x5A0A, 0x1C75, 0x5A0B, 0x5A0B, 0x3C89,
+    0x5A0C, 0x5A0C, 0x088F, 0x5A0D, 0x5A0D, 0x3B38, 0x5A0F, 0x5A0F, 0x1C73,
+    0x5A11, 0x5A11, 0x0884, 0x5A12, 0x5A12, 0x3A13, 0x5A13, 0x5A13, 0x0889,
+    0x5A15, 0x5A15, 0x1C72, 0x5A16, 0x5A16, 0x1C6F, 0x5A17, 0x5A17, 0x1C74,
+    0x5A18, 0x5A18, 0x0885, 0x5A19, 0x5A19, 0x1C6E, 0x5A1B, 0x5A1B, 0x0888,
+    0x5A1C, 0x5A1C, 0x0886, 0x5A1E, 0x5A1E, 0x1C76, 0x5A1F, 0x5A1F, 0x0887,
+    0x5A20, 0x5A20, 0x088B, 0x5A21, 0x5A21, 0x3A1B, 0x5A23, 0x5A23, 0x088C,
+    0x5A24, 0x5A24, 0x40E8, 0x5A25, 0x5A25, 0x088E, 0x5A27, 0x5A27, 0x3DE1,
+    0x5A29, 0x5A29, 0x088D, 0x5A2A, 0x5A2A, 0x3B3B, 0x5A2B, 0x5A2B, 0x3D40,
+    0x5A2C, 0x5A2C, 0x3A0F, 0x5A2D, 0x5A2E, 0x1C70, 0x5A33, 0x5A33, 0x1C77,
+    0x5A35, 0x5A35, 0x1E9C, 0x5A36, 0x5A36, 0x0A46, 0x5A37, 0x5A37, 0x20FD,
+    0x5A38, 0x5A38, 0x1E9B, 0x5A39, 0x5A39, 0x1EAE, 0x5A3C, 0x5A3C, 0x0A4C,
+    0x5A3D, 0x5A3D, 0x3AC0, 0x5A3E, 0x5A3E, 0x1EAC, 0x5A40, 0x5A40, 0x0A4B,
+    0x5A41, 0x5A41, 0x0A47, 0x5A42, 0x5A42, 0x1EB5, 0x5A43, 0x5A43, 0x1EA5,
+    0x5A44, 0x5A44, 0x1EA8, 0x5A45, 0x5A45, 0x3917, 0x5A46, 0x5A46, 0x0A4F,
+    0x5A47, 0x5A47, 0x1EB2, 0x5A48, 0x5A48, 0x1EAA, 0x5A49, 0x5A49, 0x0A48,
+    0x5A4A, 0x5A4A, 0x0A50, 0x5A4C, 0x5A4C, 0x1EAF, 0x5A4D, 0x5A4D, 0x1EAD,
+    0x5A50, 0x5A50, 0x1E9E, 0x5A51, 0x5A51, 0x1EB3, 0x5A52, 0x5A52, 0x1EA7,
+    0x5A53, 0x5A53, 0x1EA2, 0x5A54, 0x5A54, 0x4603, 0x5A55, 0x5A55, 0x1E98,
+    0x5A56, 0x5A56, 0x1EB4, 0x5A57, 0x5A57, 0x1EA4, 0x5A58, 0x5A58, 0x1E97,
+    0x5A59, 0x5A59, 0x3B34, 0x5A5A, 0x5A5A, 0x0A4E, 0x5A5B, 0x5A5B, 0x1EA9,
+    0x5A5C, 0x5A5C, 0x1EB6, 0x5A5D, 0x5A5D, 0x1EA6, 0x5A5E, 0x5A5E, 0x1E9A,
+    0x5A5F, 0x5A5F, 0x1E9F, 0x5A60, 0x5A60, 0x1E96, 0x5A61, 0x5A61, 0x3D33,
+    0x5A62, 0x5A62, 0x0A4D, 0x5A63, 0x5A63, 0x40FB, 0x5A64, 0x5A64, 0x1EA3,
+    0x5A65, 0x5A65, 0x1EA0, 0x5A66, 0x5A66, 0x0A49, 0x5A67, 0x5A67, 0x1E99,
+    0x5A68, 0x5A68, 0x39B7, 0x5A69, 0x5A69, 0x1EB1, 0x5A6A, 0x5A6A, 0x0A4A,
+    0x5A6B, 0x5A6B, 0x3A42, 0x5A6C, 0x5A6C, 0x1EA1, 0x5A6D, 0x5A6D, 0x1E9D,
+    0x5A6E, 0x5A6E, 0x3D3F, 0x5A70, 0x5A70, 0x1EB0, 0x5A71, 0x5A71, 0x3D34,
+    0x5A77, 0x5A77, 0x0C23, 0x5A78, 0x5A78, 0x20F6, 0x5A79, 0x5A79, 0x3CE1,
+    0x5A7A, 0x5A7A, 0x20F3, 0x5A7B, 0x5A7B, 0x2104, 0x5A7C, 0x5A7C, 0x20F8,
+    0x5A7D, 0x5A7D, 0x2105, 0x5A7E, 0x5A7E, 0x3A11, 0x5A7F, 0x5A7F, 0x0C25,
+    0x5A81, 0x5A81, 0x3A1D, 0x5A82, 0x5A82, 0x3D31, 0x5A83, 0x5A83, 0x2101,
+    0x5A84, 0x5A84, 0x20FE, 0x5A86, 0x5A86, 0x3B81, 0x5A88, 0x5A88, 0x4263,
+    0x5A8A, 0x5A8A, 0x20FF, 0x5A8B, 0x5A8B, 0x2102, 0x5A8C, 0x5A8C, 0x2106,
+    0x5A8E, 0x5A8E, 0x1EAB, 0x5A8F, 0x5A8F, 0x2108, 0x5A90, 0x5A90, 0x23B6,
+    0x5A91, 0x5A91, 0x4235, 0x5A92, 0x5A92, 0x0C26, 0x5A93, 0x5A93, 0x2109,
+    0x5A94, 0x5A94, 0x20F1, 0x5A95, 0x5A95, 0x20FB, 0x5A96, 0x5A96, 0x4100,
+    0x5A97, 0x5A97, 0x2100, 0x5A99, 0x5A99, 0x3A0A, 0x5A9A, 0x5A9A, 0x0C24,
+    0x5A9B, 0x5A9B, 0x0C27, 0x5A9C, 0x5A9C, 0x2107, 0x5A9D, 0x5A9D, 0x210A,
+    0x5A9E, 0x5A9E, 0x20F5, 0x5A9F, 0x5A9F, 0x20F2, 0x5AA0, 0x5AA0, 0x4172,
+    0x5AA1, 0x5AA1, 0x3CDC, 0x5AA2, 0x5AA2, 0x20F4, 0x5AA5, 0x5AA5, 0x20F9,
+    0x5AA6, 0x5AA6, 0x20F7, 0x5AA7, 0x5AA7, 0x0C28, 0x5AA9, 0x5AA9, 0x2103,
+    0x5AAB, 0x5AAB, 0x40FA, 0x5AAC, 0x5AAC, 0x20FA, 0x5AAE, 0x5AAE, 0x20FC,
+    0x5AAF, 0x5AAF, 0x20F0, 0x5AB0, 0x5AB0, 0x23AA, 0x5AB1, 0x5AB1, 0x23A8,
+    0x5AB2, 0x5AB2, 0x0DFC, 0x5AB3, 0x5AB3, 0x0DFA, 0x5AB4, 0x5AB4, 0x23B2,
+    0x5AB5, 0x5AB5, 0x23A9, 0x5AB6, 0x5AB6, 0x23B3, 0x5AB7, 0x5AB7, 0x23AF,
+    0x5AB8, 0x5AB8, 0x23A7, 0x5AB9, 0x5AB9, 0x23B5, 0x5ABA, 0x5ABA, 0x23A6,
+    0x5ABB, 0x5ABB, 0x23AD, 0x5ABC, 0x5ABC, 0x0DF9, 0x5ABD, 0x5ABD, 0x0DF8,
+    0x5ABE, 0x5ABE, 0x0DF7, 0x5ABF, 0x5ABF, 0x23AB, 0x5AC0, 0x5AC0, 0x23B0,
+    0x5AC1, 0x5AC1, 0x0DF4, 0x5AC2, 0x5AC2, 0x0DFB, 0x5AC3, 0x5AC3, 0x3896,
+    0x5AC4, 0x5AC4, 0x23A4, 0x5AC6, 0x5AC6, 0x23AE, 0x5AC7, 0x5AC7, 0x23A3,
+    0x5AC8, 0x5AC8, 0x23AC, 0x5AC9, 0x5AC9, 0x0DF5, 0x5ACA, 0x5ACA, 0x23B1,
+    0x5ACB, 0x5ACB, 0x23A5, 0x5ACC, 0x5ACC, 0x0DF6, 0x5ACD, 0x5ACD, 0x23B4,
+    0x5ACE, 0x5ACE, 0x3C88, 0x5ACF, 0x5ACF, 0x43B5, 0x5AD3, 0x5AD3, 0x4102,
+    0x5AD5, 0x5AD5, 0x2650, 0x5AD6, 0x5AD6, 0x0FB4, 0x5AD7, 0x5AD7, 0x0FB3,
+    0x5AD8, 0x5AD8, 0x0FB5, 0x5AD9, 0x5AD9, 0x265C, 0x5ADA, 0x5ADA, 0x2652,
+    0x5ADB, 0x5ADB, 0x2658, 0x5ADC, 0x5ADC, 0x264D, 0x5ADD, 0x5ADD, 0x265B,
+    0x5ADE, 0x5ADE, 0x265A, 0x5ADF, 0x5ADF, 0x265E, 0x5AE0, 0x5AE0, 0x2657,
+    0x5AE1, 0x5AE1, 0x0FB0, 0x5AE2, 0x5AE2, 0x2656, 0x5AE3, 0x5AE3, 0x0FB6,
+    0x5AE4, 0x5AE4, 0x3B86, 0x5AE5, 0x5AE5, 0x264F, 0x5AE6, 0x5AE6, 0x0FB1,
+    0x5AE8, 0x5AE8, 0x265D, 0x5AE9, 0x5AE9, 0x0FB2, 0x5AEA, 0x5AEA, 0x2651,
+    0x5AEB, 0x5AEB, 0x2654, 0x5AEC, 0x5AEC, 0x2659, 0x5AED, 0x5AED, 0x2653,
+    0x5AEE, 0x5AEE, 0x264E, 0x5AF0, 0x5AF0, 0x3EE7, 0x5AF2, 0x5AF2, 0x37F5,
+    0x5AF3, 0x5AF3, 0x2655, 0x5AF4, 0x5AF4, 0x28AB, 0x5AF5, 0x5AF5, 0x112D,
+    0x5AF6, 0x5AF6, 0x28AE, 0x5AF7, 0x5AF7, 0x28AD, 0x5AF8, 0x5AF8, 0x28B0,
+    0x5AF9, 0x5AF9, 0x28B2, 0x5AFA, 0x5AFA, 0x36EE, 0x5AFB, 0x5AFB, 0x112B,
+    0x5AFD, 0x5AFD, 0x28AC, 0x5AFE, 0x5AFE, 0x3C1D, 0x5AFF, 0x5AFF, 0x28AA,
+    0x5B01, 0x5B01, 0x28B3, 0x5B02, 0x5B02, 0x28B1, 0x5B03, 0x5B03, 0x28AF,
+    0x5B05, 0x5B05, 0x28B5, 0x5B07, 0x5B07, 0x28B4, 0x5B08, 0x5B08, 0x112F,
+    0x5B09, 0x5B09, 0x112A, 0x5B0B, 0x5B0B, 0x112C, 0x5B0C, 0x5B0C, 0x112E,
+    0x5B0D, 0x5B0D, 0x48FF, 0x5B0F, 0x5B0F, 0x28B6, 0x5B10, 0x5B10, 0x2B22,
+    0x5B11, 0x5B11, 0x3BF6, 0x5B13, 0x5B13, 0x2B21, 0x5B14, 0x5B14, 0x2B20,
+    0x5B16, 0x5B16, 0x2B23, 0x5B17, 0x5B17, 0x2B1C, 0x5B19, 0x5B19, 0x2B1D,
+    0x5B1A, 0x5B1A, 0x2B25, 0x5B1B, 0x5B1B, 0x2B1E, 0x5B1D, 0x5B1D, 0x12A8,
+    0x5B1E, 0x5B1E, 0x2B27, 0x5B1F, 0x5B1F, 0x4941, 0x5B20, 0x5B20, 0x2B26,
+    0x5B21, 0x5B21, 0x2B1F, 0x5B23, 0x5B23, 0x2D52, 0x5B24, 0x5B24, 0x13C5,
+    0x5B25, 0x5B25, 0x2D50, 0x5B26, 0x5B26, 0x2D55, 0x5B27, 0x5B27, 0x2D54,
+    0x5B28, 0x5B28, 0x2B24, 0x5B2A, 0x5B2A, 0x13C4, 0x5B2B, 0x5B2B, 0x3B84,
+    0x5B2C, 0x5B2C, 0x2D53, 0x5B2D, 0x5B2D, 0x2D4F, 0x5B2E, 0x5B2E, 0x2D57,
+    0x5B2F, 0x5B2F, 0x2D56, 0x5B30, 0x5B30, 0x13C3, 0x5B32, 0x5B32, 0x2D51,
+    0x5B34, 0x5B34, 0x12A9, 0x5B38, 0x5B38, 0x14CE, 0x5B3C, 0x5B3C, 0x2F18,
+    0x5B3D, 0x5B3F, 0x3089, 0x5B40, 0x5B40, 0x160F, 0x5B41, 0x5B41, 0x38C8,
+    0x5B43, 0x5B43, 0x1610, 0x5B44, 0x5B44, 0x3A44, 0x5B45, 0x5B45, 0x31CC,
+    0x5B46, 0x5B46, 0x42B2, 0x5B47, 0x5B47, 0x32CD, 0x5B48, 0x5B48, 0x32CC,
+    0x5B4A, 0x5B4A, 0x38CD, 0x5B4B, 0x5B4C, 0x337C, 0x5B4D, 0x5B4D, 0x3413,
+    0x5B4E, 0x5B4E, 0x3482, 0x5B4F, 0x5B4F, 0x3A31, 0x5B50, 0x5B51, 0x027F,
+    0x5B53, 0x5B53, 0x0281, 0x5B54, 0x5B54, 0x02C6, 0x5B55, 0x5B55, 0x0333,
+    0x5B56, 0x5B56, 0x17DC, 0x5B57, 0x5B58, 0x03BF, 0x5B5A, 0x5B5B, 0x047F,
+    0x5B5C, 0x5B5C, 0x047E, 0x5B5D, 0x5B5D, 0x047D, 0x5B5F, 0x5B5F, 0x0597,
+    0x5B62, 0x5B62, 0x1957, 0x5B63, 0x5B63, 0x0599, 0x5B64, 0x5B64, 0x0598,
+    0x5B65, 0x5B65, 0x1958, 0x5B66, 0x5B66, 0x454E, 0x5B68, 0x5B68, 0x461D,
+    0x5B69, 0x5B69, 0x0700, 0x5B6B, 0x5B6B, 0x0891, 0x5B6C, 0x5B6C, 0x1C78,
+    0x5B6D, 0x5B6D, 0x3E5F, 0x5B6E, 0x5B6E, 0x1EB8, 0x5B70, 0x5B70, 0x0A51,
+    0x5B71, 0x5B71, 0x0C2A, 0x5B72, 0x5B72, 0x1EB7, 0x5B73, 0x5B73, 0x0C29,
+    0x5B74, 0x5B74, 0x3732, 0x5B75, 0x5B75, 0x0FB7, 0x5B76, 0x5B76, 0x410A,
+    0x5B77, 0x5B77, 0x265F, 0x5B78, 0x5B78, 0x12AA, 0x5B7A, 0x5B7A, 0x13C6,
+    0x5B7B, 0x5B7B, 0x2D58, 0x5B7C, 0x5B7C, 0x410C, 0x5B7D, 0x5B7D, 0x1611,
+    0x5B7F, 0x5B7F, 0x16C0, 0x5B80, 0x5B80, 0x0225, 0x5B81, 0x5B81, 0x179E,
+    0x5B82, 0x5B82, 0x4044, 0x5B83, 0x5B83, 0x0334, 0x5B84, 0x5B84, 0x179F,
+    0x5B85, 0x5B85, 0x03C3, 0x5B87, 0x5B88, 0x03C1, 0x5B89, 0x5B89, 0x03C4,
+    0x5B8B, 0x5B8B, 0x0482, 0x5B8C, 0x5B8C, 0x0481, 0x5B8E, 0x5B8E, 0x1863,
+    0x5B8F, 0x5B8F, 0x0483, 0x5B90, 0x5B90, 0x48E9, 0x5B92, 0x5B92, 0x1864,
+    0x5B93, 0x5B93, 0x1959, 0x5B95, 0x5B95, 0x195A, 0x5B97, 0x5B97, 0x059A,
+    0x5B98, 0x5B98, 0x059C, 0x5B99, 0x5B99, 0x059E, 0x5B9A, 0x5B9A, 0x059B,
+    0x5B9B, 0x5B9B, 0x059F, 0x5B9C, 0x5B9C, 0x059D, 0x5B9D, 0x5B9D, 0x4116,
+    0x5B9E, 0x5B9F, 0x454F, 0x5BA2, 0x5BA2, 0x0704, 0x5BA3, 0x5BA3, 0x0701,
+    0x5BA4, 0x5BA4, 0x0703, 0x5BA5, 0x5BA5, 0x0705, 0x5BA6, 0x5BA6, 0x0702,
+    0x5BA7, 0x5BA7, 0x1C79, 0x5BA8, 0x5BA8, 0x1AB3, 0x5BAA, 0x5BAA, 0x417B,
+    0x5BAC, 0x5BAC, 0x1C7B, 0x5BAD, 0x5BAD, 0x1C7A, 0x5BAE, 0x5BAE, 0x0897,
+    0x5BB0, 0x5BB0, 0x0893, 0x5BB3, 0x5BB3, 0x0894, 0x5BB4, 0x5BB4, 0x0896,
+    0x5BB5, 0x5BB5, 0x0898, 0x5BB6, 0x5BB6, 0x0895, 0x5BB8, 0x5BB8, 0x089A,
+    0x5BB9, 0x5BB9, 0x0899, 0x5BBF, 0x5BBF, 0x0A56, 0x5BC0, 0x5BC0, 0x1EBA,
+    0x5BC1, 0x5BC1, 0x1EB9, 0x5BC2, 0x5BC2, 0x0A55, 0x5BC3, 0x5BC3, 0x3F25,
+    0x5BC4, 0x5BC4, 0x0A54, 0x5BC5, 0x5BC5, 0x0A53, 0x5BC6, 0x5BC6, 0x0A57,
+    0x5BC7, 0x5BC7, 0x0A52, 0x5BCA, 0x5BCA, 0x2110, 0x5BCB, 0x5BCB, 0x210D,
+    0x5BCC, 0x5BCC, 0x0C2C, 0x5BCD, 0x5BCD, 0x210C, 0x5BCE, 0x5BCE, 0x2111,
+    0x5BD0, 0x5BD0, 0x0C2E, 0x5BD1, 0x5BD1, 0x210F, 0x5BD2, 0x5BD2, 0x0C2B,
+    0x5BD3, 0x5BD3, 0x0C2D, 0x5BD4, 0x5BD4, 0x210E, 0x5BD5, 0x5BD5, 0x4111,
+    0x5BD6, 0x5BD6, 0x23B7, 0x5BD7, 0x5BD7, 0x42BB, 0x5BD8, 0x5BD9, 0x23B8,
+    0x5BDE, 0x5BDE, 0x0FB8, 0x5BDF, 0x5BDF, 0x0FC0, 0x5BE0, 0x5BE0, 0x2660,
+    0x5BE1, 0x5BE1, 0x0FBA, 0x5BE2, 0x5BE2, 0x0FBE, 0x5BE3, 0x5BE3, 0x2661,
+    0x5BE4, 0x5BE4, 0x0FBF, 0x5BE5, 0x5BE6, 0x0FBB, 0x5BE7, 0x5BE7, 0x0FB9,
+    0x5BE8, 0x5BE8, 0x0FBD, 0x5BE9, 0x5BE9, 0x1132, 0x5BEA, 0x5BEA, 0x210B,
+    0x5BEB, 0x5BEB, 0x1133, 0x5BEC, 0x5BEC, 0x1131, 0x5BEE, 0x5BEE, 0x1130,
+    0x5BEF, 0x5BEF, 0x2B28, 0x5BF0, 0x5BF0, 0x12AB, 0x5BF1, 0x5BF2, 0x2D59,
+    0x5BF3, 0x5BF3, 0x4115, 0x5BF5, 0x5BF5, 0x157B, 0x5BF6, 0x5BF6, 0x1612,
+    0x5BF8, 0x5BF8, 0x0282, 0x5BFA, 0x5BFA, 0x03C5, 0x5BFF, 0x5BFF, 0x40DD,
+    0x5C01, 0x5C01, 0x0706, 0x5C03, 0x5C03, 0x1C7C, 0x5C04, 0x5C04, 0x089B,
+    0x5C05, 0x5C05, 0x4118, 0x5C07, 0x5C07, 0x0A5A, 0x5C08, 0x5C08, 0x0A59,
+    0x5C09, 0x5C09, 0x0A58, 0x5C0A, 0x5C0B, 0x0C2F, 0x5C0C, 0x5C0C, 0x2112,
+    0x5C0D, 0x5C0D, 0x0FC1, 0x5C0E, 0x5C0E, 0x12AC, 0x5C0F, 0x5C0F, 0x0283,
+    0x5C10, 0x5C10, 0x1787, 0x5C11, 0x5C11, 0x02C7, 0x5C12, 0x5C12, 0x17A0,
+    0x5C13, 0x5C13, 0x411A, 0x5C14, 0x5C14, 0x411C, 0x5C15, 0x5C15, 0x17DD,
+    0x5C16, 0x5C16, 0x03C6, 0x5C1A, 0x5C1A, 0x05A0, 0x5C1C, 0x5C1C, 0x45EA,
+    0x5C1E, 0x5C1E, 0x3A29, 0x5C1F, 0x5C1F, 0x23BA, 0x5C20, 0x5C20, 0x3D89,
+    0x5C22, 0x5C22, 0x0284, 0x5C23, 0x5C23, 0x44E8, 0x5C24, 0x5C24, 0x02C8,
+    0x5C25, 0x5C25, 0x17DE, 0x5C28, 0x5C28, 0x1865, 0x5C2A, 0x5C2A, 0x1866,
+    0x5C2C, 0x5C2C, 0x0484, 0x5C30, 0x5C30, 0x2113, 0x5C31, 0x5C31, 0x0C31,
+    0x5C33, 0x5C33, 0x23BB, 0x5C37, 0x5C37, 0x13C7, 0x5C38, 0x5C38, 0x0285,
+    0x5C39, 0x5C39, 0x0299, 0x5C3A, 0x5C3A, 0x02C9, 0x5C3B, 0x5C3B, 0x17A1,
+    0x5C3C, 0x5C3C, 0x0335, 0x5C3E, 0x5C3E, 0x0488, 0x5C3F, 0x5C3F, 0x0487,
+    0x5C40, 0x5C41, 0x0485, 0x5C44, 0x5C44, 0x195B, 0x5C45, 0x5C46, 0x05A2,
+    0x5C47, 0x5C47, 0x195C, 0x5C48, 0x5C48, 0x05A1, 0x5C49, 0x5C49, 0x411F,
+    0x5C4A, 0x5C4A, 0x3F5C, 0x5C4B, 0x5C4B, 0x070A, 0x5C4C, 0x5C4C, 0x1AB4,
+    0x5C4D, 0x5C4D, 0x0709, 0x5C4E, 0x5C4F, 0x0707, 0x5C50, 0x5C50, 0x089E,
+    0x5C51, 0x5C51, 0x089C, 0x5C53, 0x5C53, 0x3F02, 0x5C54, 0x5C54, 0x1C7E,
+    0x5C55, 0x5C55, 0x089D, 0x5C56, 0x5C56, 0x1C7D, 0x5C58, 0x5C58, 0x0892,
+    0x5C59, 0x5C59, 0x1EBB, 0x5C5C, 0x5C5D, 0x0A5C, 0x5C5E, 0x5C5E, 0x3D67,
+    0x5C60, 0x5C60, 0x0A5B, 0x5C62, 0x5C62, 0x0FC2, 0x5C63, 0x5C63, 0x2662,
+    0x5C64, 0x5C65, 0x1134, 0x5C67, 0x5C67, 0x28B7, 0x5C68, 0x5C68, 0x13C8,
+    0x5C69, 0x5C6A, 0x2F19, 0x5C6C, 0x5C6C, 0x166E, 0x5C6D, 0x5C6D, 0x3483,
+    0x5C6E, 0x5C6E, 0x1776, 0x5C6F, 0x5C6F, 0x02CA, 0x5C71, 0x5C71, 0x0286,
+    0x5C73, 0x5C73, 0x17A3, 0x5C74, 0x5C74, 0x17A2, 0x5C79, 0x5C79, 0x03C7,
+    0x5C7A, 0x5C7B, 0x17E0, 0x5C7C, 0x5C7C, 0x17DF, 0x5C7E, 0x5C7E, 0x17E2,
+    0x5C85, 0x5C85, 0x4121, 0x5C86, 0x5C86, 0x186E, 0x5C88, 0x5C88, 0x1869,
+    0x5C89, 0x5C89, 0x186B, 0x5C8A, 0x5C8A, 0x186D, 0x5C8B, 0x5C8B, 0x186A,
+    0x5C8C, 0x5C8C, 0x048C, 0x5C8D, 0x5C8D, 0x1867, 0x5C8F, 0x5C8F, 0x1868,
+    0x5C90, 0x5C91, 0x0489, 0x5C92, 0x5C92, 0x186C, 0x5C93, 0x5C93, 0x186F,
+    0x5C94, 0x5C94, 0x048B, 0x5C95, 0x5C95, 0x1870, 0x5C99, 0x5C99, 0x468C,
+    0x5C9A, 0x5C9A, 0x4551, 0x5C9C, 0x5C9C, 0x495A, 0x5C9D, 0x5C9D, 0x196A,
+    0x5C9E, 0x5C9E, 0x3A2A, 0x5C9F, 0x5C9F, 0x1964, 0x5CA0, 0x5CA0, 0x195F,
+    0x5CA1, 0x5CA1, 0x05A5, 0x5CA2, 0x5CA2, 0x1967, 0x5CA3, 0x5CA3, 0x1965,
+    0x5CA4, 0x5CA4, 0x195E, 0x5CA5, 0x5CA5, 0x196B, 0x5CA6, 0x5CA6, 0x196E,
+    0x5CA7, 0x5CA7, 0x1969, 0x5CA8, 0x5CA8, 0x1962, 0x5CA9, 0x5CA9, 0x05A7,
+    0x5CAA, 0x5CAA, 0x1968, 0x5CAB, 0x5CAB, 0x05A8, 0x5CAC, 0x5CAC, 0x1963,
+    0x5CAD, 0x5CAD, 0x1966, 0x5CAE, 0x5CAE, 0x195D, 0x5CAF, 0x5CAF, 0x1961,
+    0x5CB0, 0x5CB0, 0x196D, 0x5CB1, 0x5CB1, 0x05A9, 0x5CB3, 0x5CB3, 0x05AA,
+    0x5CB5, 0x5CB5, 0x1960, 0x5CB6, 0x5CB6, 0x196C, 0x5CB7, 0x5CB7, 0x05A4,
+    0x5CB8, 0x5CB8, 0x05A6, 0x5CBA, 0x5CBA, 0x412B, 0x5CC1, 0x5CC1, 0x43B8,
+    0x5CC2, 0x5CC2, 0x3D4C, 0x5CC6, 0x5CC6, 0x1AC5, 0x5CC7, 0x5CC7, 0x1ABE,
+    0x5CC8, 0x5CC8, 0x1AC4, 0x5CC9, 0x5CC9, 0x1ABD, 0x5CCA, 0x5CCA, 0x1ABF,
+    0x5CCB, 0x5CCB, 0x1AB9, 0x5CCC, 0x5CCC, 0x1AB7, 0x5CCE, 0x5CCE, 0x1AC6,
+    0x5CCF, 0x5CCF, 0x1AC3, 0x5CD0, 0x5CD0, 0x1AB5, 0x5CD1, 0x5CD1, 0x3F13,
+    0x5CD2, 0x5CD2, 0x070C, 0x5CD3, 0x5CD4, 0x1AC1, 0x5CD6, 0x5CD6, 0x1AC0,
+    0x5CD7, 0x5CD7, 0x1AB8, 0x5CD8, 0x5CD8, 0x1AB6, 0x5CD9, 0x5CD9, 0x070B,
+    0x5CDA, 0x5CDA, 0x1ABC, 0x5CDB, 0x5CDB, 0x1ABA, 0x5CDE, 0x5CDE, 0x1ABB,
+    0x5CDF, 0x5CDF, 0x1AC7, 0x5CE5, 0x5CE5, 0x4637, 0x5CE8, 0x5CE8, 0x08A3,
+    0x5CE9, 0x5CE9, 0x4122, 0x5CEA, 0x5CEA, 0x08A2, 0x5CEC, 0x5CEC, 0x1C7F,
+    0x5CED, 0x5CED, 0x089F, 0x5CEE, 0x5CEE, 0x1C81, 0x5CEF, 0x5CEF, 0x4123,
+    0x5CF0, 0x5CF0, 0x08A4, 0x5CF1, 0x5CF1, 0x1C82, 0x5CF4, 0x5CF4, 0x08A7,
+    0x5CF6, 0x5CF6, 0x08A5, 0x5CF7, 0x5CF7, 0x1C83, 0x5CF8, 0x5CF8, 0x1AC8,
+    0x5CF9, 0x5CF9, 0x1C85, 0x5CFB, 0x5CFB, 0x08A1, 0x5CFD, 0x5CFD, 0x08A0,
+    0x5CFF, 0x5CFF, 0x1C80, 0x5D00, 0x5D00, 0x1C84, 0x5D01, 0x5D01, 0x08A6,
+    0x5D06, 0x5D06, 0x0A5F, 0x5D07, 0x5D07, 0x0A5E, 0x5D0B, 0x5D0B, 0x1EBD,
+    0x5D0C, 0x5D0C, 0x1EC1, 0x5D0D, 0x5D0D, 0x1EC3, 0x5D0E, 0x5D0E, 0x0A60,
+    0x5D0F, 0x5D0F, 0x1EC6, 0x5D10, 0x5D10, 0x4127, 0x5D11, 0x5D11, 0x0A64,
+    0x5D12, 0x5D12, 0x1EC8, 0x5D14, 0x5D14, 0x0A66, 0x5D15, 0x5D15, 0x43B9,
+    0x5D16, 0x5D16, 0x0A62, 0x5D17, 0x5D17, 0x0A6A, 0x5D18, 0x5D18, 0x4128,
+    0x5D19, 0x5D19, 0x0A67, 0x5D1A, 0x5D1A, 0x1EBF, 0x5D1B, 0x5D1B, 0x0A61,
+    0x5D1D, 0x5D1D, 0x1EBE, 0x5D1E, 0x5D1E, 0x1EBC, 0x5D1F, 0x5D1F, 0x1ECA,
+    0x5D20, 0x5D20, 0x1EC0, 0x5D22, 0x5D22, 0x0A63, 0x5D23, 0x5D23, 0x1EC9,
+    0x5D24, 0x5D24, 0x0A68, 0x5D25, 0x5D25, 0x1EC5, 0x5D26, 0x5D26, 0x1EC4,
+    0x5D27, 0x5D27, 0x0A69, 0x5D28, 0x5D28, 0x1EC2, 0x5D29, 0x5D29, 0x0A65,
+    0x5D2C, 0x5D2C, 0x3DF7, 0x5D2E, 0x5D2E, 0x1ECB, 0x5D2F, 0x5D2F, 0x46D3,
+    0x5D30, 0x5D30, 0x1EC7, 0x5D31, 0x5D31, 0x2122, 0x5D32, 0x5D32, 0x2129,
+    0x5D33, 0x5D33, 0x211E, 0x5D34, 0x5D34, 0x0C34, 0x5D35, 0x5D35, 0x211A,
+    0x5D36, 0x5D36, 0x212A, 0x5D37, 0x5D37, 0x2114, 0x5D38, 0x5D38, 0x2127,
+    0x5D39, 0x5D39, 0x2125, 0x5D3A, 0x5D3A, 0x211F, 0x5D3C, 0x5D3C, 0x2128,
+    0x5D3D, 0x5D3D, 0x2121, 0x5D3E, 0x5D3E, 0x4629, 0x5D3F, 0x5D3F, 0x2119,
+    0x5D40, 0x5D40, 0x212B, 0x5D41, 0x5D41, 0x2117, 0x5D42, 0x5D42, 0x2124,
+    0x5D43, 0x5D43, 0x2115, 0x5D45, 0x5D45, 0x212C, 0x5D46, 0x5D46, 0x4129,
+    0x5D47, 0x5D47, 0x0C35, 0x5D48, 0x5D48, 0x462A, 0x5D49, 0x5D49, 0x2126,
+    0x5D4A, 0x5D4A, 0x23BE, 0x5D4B, 0x5D4B, 0x2118, 0x5D4C, 0x5D4C, 0x0C32,
+    0x5D4E, 0x5D4E, 0x211C, 0x5D50, 0x5D50, 0x0C33, 0x5D51, 0x5D51, 0x211B,
+    0x5D52, 0x5D52, 0x2120, 0x5D55, 0x5D55, 0x211D, 0x5D56, 0x5D56, 0x43BA,
+    0x5D57, 0x5D57, 0x3FCA, 0x5D59, 0x5D59, 0x2123, 0x5D5B, 0x5D5B, 0x3DD5,
+    0x5D5E, 0x5D5E, 0x23C2, 0x5D62, 0x5D62, 0x23C5, 0x5D63, 0x5D63, 0x23BD,
+    0x5D65, 0x5D65, 0x23BF, 0x5D67, 0x5D67, 0x23C4, 0x5D68, 0x5D68, 0x23C3,
+    0x5D69, 0x5D69, 0x0DFD, 0x5D6B, 0x5D6B, 0x2116, 0x5D6C, 0x5D6C, 0x23C1,
+    0x5D6F, 0x5D6F, 0x0DFE, 0x5D70, 0x5D70, 0x46E4, 0x5D71, 0x5D71, 0x23BC,
+    0x5D72, 0x5D72, 0x23C0, 0x5D74, 0x5D74, 0x3EEF, 0x5D77, 0x5D77, 0x2669,
+    0x5D79, 0x5D79, 0x2670, 0x5D7A, 0x5D7A, 0x2667, 0x5D7C, 0x5D7C, 0x266E,
+    0x5D7D, 0x5D7D, 0x2665, 0x5D7E, 0x5D7E, 0x266D, 0x5D7F, 0x5D7F, 0x2671,
+    0x5D80, 0x5D80, 0x2664, 0x5D81, 0x5D81, 0x2668, 0x5D82, 0x5D82, 0x2663,
+    0x5D84, 0x5D84, 0x0FC3, 0x5D85, 0x5D85, 0x3E34, 0x5D86, 0x5D86, 0x2666,
+    0x5D87, 0x5D87, 0x0FC4, 0x5D88, 0x5D88, 0x266C, 0x5D89, 0x5D89, 0x266B,
+    0x5D8A, 0x5D8A, 0x266A, 0x5D8B, 0x5D8B, 0x4124, 0x5D8D, 0x5D8D, 0x266F,
+    0x5D8E, 0x5D8E, 0x3F0C, 0x5D92, 0x5D92, 0x28BB, 0x5D93, 0x5D93, 0x28BD,
+    0x5D94, 0x5D94, 0x1137, 0x5D95, 0x5D95, 0x28BE, 0x5D97, 0x5D97, 0x28B9,
+    0x5D99, 0x5D99, 0x28B8, 0x5D9A, 0x5D9A, 0x28C2, 0x5D9C, 0x5D9C, 0x28C0,
+    0x5D9D, 0x5D9D, 0x1136, 0x5D9E, 0x5D9E, 0x28C3, 0x5D9F, 0x5D9F, 0x28BA,
+    0x5DA0, 0x5DA0, 0x28BF, 0x5DA1, 0x5DA1, 0x28C1, 0x5DA2, 0x5DA2, 0x28BC,
+    0x5DA4, 0x5DA4, 0x462D, 0x5DA7, 0x5DA7, 0x2B2C, 0x5DA8, 0x5DA8, 0x2B31,
+    0x5DA9, 0x5DA9, 0x2B2B, 0x5DAA, 0x5DAA, 0x2B30, 0x5DAB, 0x5DAB, 0x3E39,
+    0x5DAC, 0x5DAC, 0x2B29, 0x5DAD, 0x5DAD, 0x2B33, 0x5DAE, 0x5DAE, 0x2B2F,
+    0x5DAF, 0x5DAF, 0x2B34, 0x5DB0, 0x5DB0, 0x2B2E, 0x5DB1, 0x5DB1, 0x2B2A,
+    0x5DB2, 0x5DB2, 0x2B32, 0x5DB4, 0x5DB4, 0x2B35, 0x5DB5, 0x5DB5, 0x2B2D,
+    0x5DB6, 0x5DB6, 0x4158, 0x5DB7, 0x5DB7, 0x2D5B, 0x5DB8, 0x5DB8, 0x13CC,
+    0x5DB9, 0x5DB9, 0x462E, 0x5DBA, 0x5DBA, 0x13CA, 0x5DBC, 0x5DBC, 0x13C9,
+    0x5DBD, 0x5DBD, 0x13CB, 0x5DC0, 0x5DC0, 0x2F1B, 0x5DC1, 0x5DC1, 0x3BFF,
+    0x5DC2, 0x5DC2, 0x3023, 0x5DC3, 0x5DC3, 0x308C, 0x5DC6, 0x5DC7, 0x31CD,
+    0x5DC9, 0x5DC9, 0x1613, 0x5DCB, 0x5DCB, 0x32CE, 0x5DCD, 0x5DCD, 0x166F,
+    0x5DCF, 0x5DCF, 0x32CF, 0x5DD1, 0x5DD1, 0x337F, 0x5DD2, 0x5DD2, 0x16C2,
+    0x5DD4, 0x5DD4, 0x16C1, 0x5DD5, 0x5DD5, 0x337E, 0x5DD6, 0x5DD6, 0x16F7,
+    0x5DD7, 0x5DD7, 0x412C, 0x5DD8, 0x5DD8, 0x3414, 0x5DDB, 0x5DDB, 0x0226,
+    0x5DDD, 0x5DDD, 0x0287, 0x5DDE, 0x5DDE, 0x03C8, 0x5DDF, 0x5DDF, 0x17E3,
+    0x5DE0, 0x5DE0, 0x1871, 0x5DE1, 0x5DE1, 0x051A, 0x5DE2, 0x5DE2, 0x0A6B,
+    0x5DE5, 0x5DE5, 0x0288, 0x5DE6, 0x5DE6, 0x0338, 0x5DE7, 0x5DE7, 0x0337,
+    0x5DE8, 0x5DE8, 0x0336, 0x5DEB, 0x5DEB, 0x048D, 0x5DEE, 0x5DEE, 0x08A8,
+    0x5DF0, 0x5DF0, 0x23C6, 0x5DF1, 0x5DF3, 0x0289, 0x5DF4, 0x5DF4, 0x02CB,
+    0x5DF5, 0x5DF5, 0x3F61, 0x5DF7, 0x5DF7, 0x070D, 0x5DF9, 0x5DF9, 0x1AC9,
+    0x5DFD, 0x5DFD, 0x0C36, 0x5DFE, 0x5DFE, 0x028C, 0x5DFF, 0x5DFF, 0x1788,
+    0x5E02, 0x5E03, 0x0339, 0x5E04, 0x5E04, 0x17A4, 0x5E06, 0x5E06, 0x03C9,
+    0x5E09, 0x5E09, 0x4140, 0x5E0A, 0x5E0A, 0x1872, 0x5E0B, 0x5E0B, 0x3D8A,
+    0x5E0C, 0x5E0C, 0x048E, 0x5E0E, 0x5E0E, 0x1873, 0x5E11, 0x5E11, 0x05B0,
+    0x5E12, 0x5E12, 0x3F2E, 0x5E14, 0x5E14, 0x1970, 0x5E15, 0x5E15, 0x05AE,
+    0x5E16, 0x5E16, 0x05AD, 0x5E17, 0x5E17, 0x196F, 0x5E18, 0x5E18, 0x05AB,
+    0x5E19, 0x5E19, 0x1971, 0x5E1A, 0x5E1A, 0x05AC, 0x5E1B, 0x5E1B, 0x05AF,
+    0x5E1D, 0x5E1D, 0x070E, 0x5E1F, 0x5E1F, 0x0710, 0x5E20, 0x5E20, 0x1ACD,
+    0x5E21, 0x5E23, 0x1ACA, 0x5E24, 0x5E24, 0x1ACE, 0x5E25, 0x5E25, 0x070F,
+    0x5E28, 0x5E28, 0x1C87, 0x5E29, 0x5E29, 0x1C86, 0x5E2B, 0x5E2B, 0x08AA,
+    0x5E2D, 0x5E2D, 0x08A9, 0x5E2E, 0x5E2E, 0x4135, 0x5E33, 0x5E33, 0x0A6E,
+    0x5E34, 0x5E34, 0x1ECD, 0x5E36, 0x5E36, 0x0A6D, 0x5E37, 0x5E37, 0x0A6F,
+    0x5E38, 0x5E38, 0x0A6C, 0x5E3D, 0x5E3D, 0x0C38, 0x5E3E, 0x5E3E, 0x1ECC,
+    0x5E40, 0x5E40, 0x0C39, 0x5E41, 0x5E41, 0x212E, 0x5E42, 0x5E42, 0x43A0,
+    0x5E43, 0x5E43, 0x0C3A, 0x5E44, 0x5E44, 0x212D, 0x5E45, 0x5E45, 0x0C37,
+    0x5E48, 0x5E48, 0x3A2C, 0x5E4A, 0x5E4A, 0x23C9, 0x5E4B, 0x5E4B, 0x23CB,
+    0x5E4C, 0x5E4C, 0x0DFF, 0x5E4D, 0x5E4D, 0x23CA, 0x5E4E, 0x5E4E, 0x23C8,
+    0x5E4F, 0x5E4F, 0x23C7, 0x5E53, 0x5E53, 0x2674, 0x5E54, 0x5E54, 0x0FC9,
+    0x5E55, 0x5E55, 0x0FC7, 0x5E57, 0x5E57, 0x0FC8, 0x5E58, 0x5E59, 0x2672,
+    0x5E5B, 0x5E5B, 0x0FC5, 0x5E5C, 0x5E5C, 0x28C7, 0x5E5D, 0x5E5D, 0x28C5,
+    0x5E5E, 0x5E5E, 0x3A2B, 0x5E5F, 0x5E5F, 0x1139, 0x5E60, 0x5E60, 0x28C6,
+    0x5E61, 0x5E61, 0x113A, 0x5E62, 0x5E62, 0x1138, 0x5E63, 0x5E63, 0x0FC6,
+    0x5E66, 0x5E66, 0x2B38, 0x5E67, 0x5E68, 0x2B36, 0x5E69, 0x5E69, 0x28C4,
+    0x5E6A, 0x5E6A, 0x2D5D, 0x5E6B, 0x5E6B, 0x13CD, 0x5E6C, 0x5E6C, 0x2D5C,
+    0x5E6D, 0x5E6E, 0x2F1C, 0x5E6F, 0x5E6F, 0x2B39, 0x5E70, 0x5E70, 0x308D,
+    0x5E72, 0x5E72, 0x028D, 0x5E73, 0x5E73, 0x033B, 0x5E74, 0x5E74, 0x03CB,
+    0x5E75, 0x5E75, 0x17E4, 0x5E76, 0x5E76, 0x03CA, 0x5E78, 0x5E78, 0x05B1,
+    0x5E79, 0x5E79, 0x0E00, 0x5E7A, 0x5E7A, 0x0227, 0x5E7B, 0x5E7B, 0x02CC,
+    0x5E7C, 0x5E7C, 0x033C, 0x5E7D, 0x5E7D, 0x0711, 0x5E7E, 0x5E7E, 0x0C3B,
+    0x5E7F, 0x5E7F, 0x0228, 0x5E80, 0x5E80, 0x17A5, 0x5E82, 0x5E82, 0x17A6,
+    0x5E83, 0x5E83, 0x4108, 0x5E84, 0x5E84, 0x17E5, 0x5E86, 0x5E86, 0x4552,
+    0x5E87, 0x5E87, 0x0490, 0x5E88, 0x5E88, 0x1877, 0x5E89, 0x5E89, 0x1875,
+    0x5E8A, 0x5E8A, 0x0491, 0x5E8B, 0x5E8B, 0x1874, 0x5E8C, 0x5E8C, 0x1876,
+    0x5E8D, 0x5E8D, 0x1878, 0x5E8F, 0x5E8F, 0x048F, 0x5E95, 0x5E96, 0x05B5,
+    0x5E97, 0x5E97, 0x05B3, 0x5E9A, 0x5E9A, 0x05B2, 0x5E9B, 0x5E9B, 0x1AD2,
+    0x5E9C, 0x5E9C, 0x05B4, 0x5EA0, 0x5EA0, 0x0712, 0x5EA2, 0x5EA2, 0x1AD1,
+    0x5EA3, 0x5EA3, 0x1AD3, 0x5EA4, 0x5EA4, 0x1AD0, 0x5EA5, 0x5EA5, 0x1AD4,
+    0x5EA6, 0x5EA6, 0x0713, 0x5EA7, 0x5EA7, 0x08AD, 0x5EA8, 0x5EA8, 0x1C88,
+    0x5EAA, 0x5EAA, 0x1C8A, 0x5EAB, 0x5EAB, 0x08AB, 0x5EAC, 0x5EAC, 0x1C8B,
+    0x5EAD, 0x5EAD, 0x08AC, 0x5EAE, 0x5EAE, 0x1C89, 0x5EB0, 0x5EB0, 0x1ACF,
+    0x5EB1, 0x5EB1, 0x1ECE, 0x5EB2, 0x5EB3, 0x1ED1, 0x5EB4, 0x5EB4, 0x1ECF,
+    0x5EB5, 0x5EB5, 0x0A73, 0x5EB6, 0x5EB6, 0x0A72, 0x5EB7, 0x5EB8, 0x0A70,
+    0x5EB9, 0x5EB9, 0x1ED0, 0x5EBD, 0x5EBD, 0x43BD, 0x5EBE, 0x5EBE, 0x0A74,
+    0x5EC1, 0x5EC2, 0x0C3D, 0x5EC4, 0x5EC4, 0x0C3F, 0x5EC5, 0x5EC5, 0x23CC,
+    0x5EC6, 0x5EC6, 0x23CE, 0x5EC7, 0x5EC7, 0x23D0, 0x5EC8, 0x5EC8, 0x0E02,
+    0x5EC9, 0x5EC9, 0x0E01, 0x5ECA, 0x5ECA, 0x0C3C, 0x5ECB, 0x5ECB, 0x23CF,
+    0x5ECC, 0x5ECC, 0x23CD, 0x5ECD, 0x5ECD, 0x3A30, 0x5ECE, 0x5ECE, 0x2678,
+    0x5ED0, 0x5ED0, 0x413D, 0x5ED1, 0x5ED1, 0x2676, 0x5ED2, 0x5ED2, 0x267C,
+    0x5ED3, 0x5ED3, 0x0FCA, 0x5ED4, 0x5ED4, 0x267D, 0x5ED5, 0x5ED5, 0x267A,
+    0x5ED6, 0x5ED6, 0x0FCB, 0x5ED7, 0x5ED7, 0x2677, 0x5ED8, 0x5ED8, 0x2675,
+    0x5ED9, 0x5ED9, 0x267B, 0x5EDA, 0x5EDA, 0x113C, 0x5EDB, 0x5EDB, 0x28C9,
+    0x5EDC, 0x5EDC, 0x2679, 0x5EDD, 0x5EDD, 0x113E, 0x5EDE, 0x5EDE, 0x28CA,
+    0x5EDF, 0x5EDF, 0x113D, 0x5EE0, 0x5EE0, 0x1140, 0x5EE1, 0x5EE1, 0x28CB,
+    0x5EE2, 0x5EE2, 0x113B, 0x5EE3, 0x5EE3, 0x113F, 0x5EE5, 0x5EE5, 0x2B3E,
+    0x5EE6, 0x5EE6, 0x2B3C, 0x5EE7, 0x5EE7, 0x2B3B, 0x5EE8, 0x5EE8, 0x2B3D,
+    0x5EE9, 0x5EE9, 0x2B3A, 0x5EEC, 0x5EEC, 0x157D, 0x5EEE, 0x5EEF, 0x31CF,
+    0x5EF1, 0x5EF1, 0x32D0, 0x5EF2, 0x5EF2, 0x3380, 0x5EF3, 0x5EF3, 0x1742,
+    0x5EF4, 0x5EF4, 0x0229, 0x5EF6, 0x5EF6, 0x05B7, 0x5EF7, 0x5EF7, 0x0492,
+    0x5EF8, 0x5EF8, 0x386F, 0x5EF9, 0x5EF9, 0x4143, 0x5EFA, 0x5EFA, 0x0714,
+    0x5EFB, 0x5EFB, 0x4144, 0x5EFC, 0x5EFC, 0x4146, 0x5EFE, 0x5EFE, 0x028E,
+    0x5EFF, 0x5EFF, 0x02CD, 0x5F01, 0x5F01, 0x033D, 0x5F02, 0x5F02, 0x17E6,
+    0x5F04, 0x5F04, 0x0493, 0x5F05, 0x5F05, 0x1879, 0x5F07, 0x5F07, 0x1AD5,
+    0x5F08, 0x5F08, 0x0715, 0x5F0A, 0x5F0A, 0x0FCC, 0x5F0B, 0x5F0B, 0x028F,
+    0x5F0C, 0x5F0C, 0x3A3E, 0x5F0D, 0x5F0D, 0x4149, 0x5F0E, 0x5F0E, 0x3A3F,
+    0x5F0F, 0x5F0F, 0x03CC, 0x5F12, 0x5F12, 0x0E03, 0x5F13, 0x5F13, 0x0290,
+    0x5F14, 0x5F15, 0x02CE, 0x5F17, 0x5F17, 0x033F, 0x5F18, 0x5F18, 0x033E,
+    0x5F1A, 0x5F1A, 0x17E7, 0x5F1B, 0x5F1B, 0x03CD, 0x5F1D, 0x5F1D, 0x187A,
+    0x5F1F, 0x5F1F, 0x0494, 0x5F22, 0x5F24, 0x1973, 0x5F25, 0x5F25, 0x4630,
+    0x5F26, 0x5F27, 0x05B8, 0x5F28, 0x5F28, 0x1972, 0x5F29, 0x5F29, 0x05BA,
+    0x5F2D, 0x5F2D, 0x0716, 0x5F2E, 0x5F2E, 0x1AD6, 0x5F30, 0x5F30, 0x1C8D,
+    0x5F31, 0x5F31, 0x08AE, 0x5F33, 0x5F33, 0x1C8C, 0x5F35, 0x5F35, 0x0A75,
+    0x5F36, 0x5F36, 0x1ED3, 0x5F37, 0x5F37, 0x0A76, 0x5F38, 0x5F38, 0x1ED4,
+    0x5F3A, 0x5F3A, 0x414E, 0x5F3C, 0x5F3C, 0x0C40, 0x5F40, 0x5F40, 0x23D1,
+    0x5F43, 0x5F43, 0x267F, 0x5F44, 0x5F44, 0x267E, 0x5F46, 0x5F46, 0x0FCD,
+    0x5F48, 0x5F48, 0x1141, 0x5F49, 0x5F49, 0x28CC, 0x5F4A, 0x5F4A, 0x12AD,
+    0x5F4B, 0x5F4B, 0x2B3F, 0x5F4C, 0x5F4C, 0x13CE, 0x5F4D, 0x5F4D, 0x3BA5,
+    0x5F4E, 0x5F4E, 0x16C3, 0x5F4F, 0x5F4F, 0x3416, 0x5F50, 0x5F50, 0x022A,
+    0x5F51, 0x5F51, 0x44E9, 0x5F54, 0x5F54, 0x1976, 0x5F56, 0x5F56, 0x1AD7,
+    0x5F57, 0x5F57, 0x0A77, 0x5F58, 0x5F58, 0x212F, 0x5F59, 0x5F59, 0x0E04,
+    0x5F5C, 0x5F5C, 0x3D5A, 0x5F5D, 0x5F5D, 0x14CF, 0x5F61, 0x5F61, 0x022B,
+    0x5F62, 0x5F62, 0x0496, 0x5F63, 0x5F63, 0x4152, 0x5F64, 0x5F64, 0x0495,
+    0x5F65, 0x5F65, 0x0717, 0x5F67, 0x5F67, 0x1C8E, 0x5F69, 0x5F69, 0x0A79,
+    0x5F6A, 0x5F6A, 0x0B89, 0x5F6B, 0x5F6B, 0x0A7A, 0x5F6C, 0x5F6C, 0x0A78,
+    0x5F6D, 0x5F6D, 0x0C41, 0x5F6F, 0x5F6F, 0x2680, 0x5F70, 0x5F70, 0x0FCE,
+    0x5F71, 0x5F71, 0x1142, 0x5F72, 0x5F72, 0x4154, 0x5F73, 0x5F73, 0x1777,
+    0x5F74, 0x5F74, 0x17E8, 0x5F76, 0x5F76, 0x187C, 0x5F77, 0x5F77, 0x0497,
+    0x5F78, 0x5F78, 0x187B, 0x5F79, 0x5F79, 0x0498, 0x5F7B, 0x5F7B, 0x4058,
+    0x5F7C, 0x5F7C, 0x05BE, 0x5F7D, 0x5F7D, 0x1979, 0x5F7E, 0x5F7E, 0x1978,
+    0x5F7F, 0x5F7F, 0x05BD, 0x5F80, 0x5F81, 0x05BB, 0x5F82, 0x5F82, 0x1977,
+    0x5F83, 0x5F83, 0x4631, 0x5F85, 0x5F85, 0x0719, 0x5F86, 0x5F86, 0x1AD8,
+    0x5F87, 0x5F87, 0x071C, 0x5F88, 0x5F88, 0x0718, 0x5F89, 0x5F89, 0x071E,
+    0x5F8A, 0x5F8B, 0x071A, 0x5F8C, 0x5F8C, 0x071D, 0x5F90, 0x5F90, 0x08B1,
+    0x5F91, 0x5F91, 0x08B0, 0x5F92, 0x5F92, 0x08AF, 0x5F96, 0x5F96, 0x1ED6,
+    0x5F97, 0x5F97, 0x0A7B, 0x5F98, 0x5F98, 0x0A7E, 0x5F99, 0x5F99, 0x0A7C,
+    0x5F9B, 0x5F9B, 0x1ED5, 0x5F9C, 0x5F9C, 0x0A81, 0x5F9E, 0x5F9E, 0x0A7D,
+    0x5F9F, 0x5F9F, 0x1ED7, 0x5FA0, 0x5FA0, 0x0A80, 0x5FA1, 0x5FA1, 0x0A7F,
+    0x5FA4, 0x5FA4, 0x402C, 0x5FA5, 0x5FA5, 0x2131, 0x5FA6, 0x5FA6, 0x2130,
+    0x5FA7, 0x5FA7, 0x4157, 0x5FA8, 0x5FA8, 0x0C44, 0x5FA9, 0x5FAA, 0x0C42,
+    0x5FAB, 0x5FAB, 0x2132, 0x5FAC, 0x5FAC, 0x0E05, 0x5FAD, 0x5FAD, 0x23D3,
+    0x5FAE, 0x5FAE, 0x0E06, 0x5FAF, 0x5FAF, 0x23D2, 0x5FB1, 0x5FB1, 0x3D98,
+    0x5FB2, 0x5FB2, 0x28CD, 0x5FB5, 0x5FB5, 0x1144, 0x5FB6, 0x5FB6, 0x2681,
+    0x5FB7, 0x5FB7, 0x1143, 0x5FB9, 0x5FB9, 0x0FCF, 0x5FBA, 0x5FBA, 0x3F9F,
+    0x5FBB, 0x5FBB, 0x2B41, 0x5FBC, 0x5FBC, 0x2B40, 0x5FBD, 0x5FBD, 0x13CF,
+    0x5FBE, 0x5FBE, 0x2D5E, 0x5FBF, 0x5FBF, 0x308E, 0x5FC0, 0x5FC1, 0x31D1,
+    0x5FC3, 0x5FC3, 0x02D0, 0x5FC4, 0x5FC4, 0x44EA, 0x5FC5, 0x5FC5, 0x0340,
+    0x5FC9, 0x5FC9, 0x17A7, 0x5FCC, 0x5FCC, 0x049A, 0x5FCD, 0x5FCD, 0x049C,
+    0x5FCF, 0x5FCF, 0x17EB, 0x5FD0, 0x5FD0, 0x187F, 0x5FD1, 0x5FD1, 0x187E,
+    0x5FD2, 0x5FD2, 0x187D, 0x5FD4, 0x5FD4, 0x17EA, 0x5FD5, 0x5FD5, 0x17E9,
+    0x5FD6, 0x5FD6, 0x03CF, 0x5FD7, 0x5FD7, 0x049B, 0x5FD8, 0x5FD8, 0x0499,
+    0x5FD9, 0x5FD9, 0x03CE, 0x5FDB, 0x5FDB, 0x3A4A, 0x5FDD, 0x5FDD, 0x05BF,
+    0x5FDE, 0x5FDE, 0x197A, 0x5FDF, 0x5FDF, 0x41AF, 0x5FE0, 0x5FE0, 0x05C0,
+    0x5FE1, 0x5FE1, 0x1884, 0x5FE3, 0x5FE3, 0x1886, 0x5FE4, 0x5FE4, 0x1885,
+    0x5FE5, 0x5FE5, 0x197B, 0x5FE8, 0x5FE8, 0x1881, 0x5FEA, 0x5FEA, 0x04A0,
+    0x5FEB, 0x5FEB, 0x049E, 0x5FED, 0x5FED, 0x1880, 0x5FEE, 0x5FEE, 0x1882,
+    0x5FEF, 0x5FEF, 0x1888, 0x5FF1, 0x5FF1, 0x049D, 0x5FF3, 0x5FF3, 0x1883,
+    0x5FF4, 0x5FF4, 0x188C, 0x5FF5, 0x5FF5, 0x05C2, 0x5FF7, 0x5FF7, 0x1889,
+    0x5FF8, 0x5FF8, 0x049F, 0x5FFA, 0x5FFA, 0x1887, 0x5FFB, 0x5FFB, 0x188A,
+    0x5FFD, 0x5FFD, 0x05C1, 0x5FFF, 0x5FFF, 0x05C3, 0x6000, 0x6000, 0x188B,
+    0x6009, 0x6009, 0x198F, 0x600A, 0x600A, 0x1982, 0x600B, 0x600B, 0x1980,
+    0x600C, 0x600C, 0x198E, 0x600D, 0x600D, 0x1989, 0x600E, 0x600E, 0x0723,
+    0x600F, 0x600F, 0x05C4, 0x6010, 0x6010, 0x198A, 0x6011, 0x6011, 0x198D,
+    0x6012, 0x6012, 0x071F, 0x6013, 0x6013, 0x198C, 0x6014, 0x6014, 0x05C5,
+    0x6015, 0x6015, 0x05CA, 0x6016, 0x6016, 0x05C8, 0x6017, 0x6017, 0x1983,
+    0x6019, 0x6019, 0x197E, 0x601A, 0x601A, 0x1985, 0x601B, 0x601B, 0x05CF,
+    0x601C, 0x601C, 0x1990, 0x601D, 0x601D, 0x0720, 0x601E, 0x601E, 0x1986,
+    0x6020, 0x6020, 0x0721, 0x6021, 0x6021, 0x05CB, 0x6022, 0x6022, 0x1988,
+    0x6023, 0x6023, 0x4185, 0x6024, 0x6024, 0x1AE7, 0x6025, 0x6025, 0x0722,
+    0x6026, 0x6026, 0x197D, 0x6027, 0x6027, 0x05CC, 0x6028, 0x6028, 0x0724,
+    0x6029, 0x6029, 0x05CD, 0x602A, 0x602A, 0x05C9, 0x602B, 0x602B, 0x05CE,
+    0x602C, 0x602C, 0x1987, 0x602D, 0x602D, 0x197C, 0x602E, 0x602E, 0x198B,
+    0x602F, 0x602F, 0x05C6, 0x6031, 0x6031, 0x4161, 0x6032, 0x6032, 0x197F,
+    0x6033, 0x6033, 0x1984, 0x6034, 0x6034, 0x1981, 0x6035, 0x6035, 0x05C7,
+    0x6037, 0x6037, 0x1AD9, 0x6039, 0x6039, 0x1ADA, 0x603B, 0x603B, 0x4553,
+    0x6040, 0x6040, 0x1AE4, 0x6041, 0x6041, 0x1C92, 0x6042, 0x6042, 0x1AE5,
+    0x6043, 0x6043, 0x072A, 0x6044, 0x6044, 0x1AE8, 0x6045, 0x6045, 0x1ADE,
+    0x6046, 0x6046, 0x0729, 0x6047, 0x6047, 0x1AE0, 0x6049, 0x6049, 0x1AE1,
+    0x604A, 0x604A, 0x4074, 0x604C, 0x604C, 0x1AE3, 0x604D, 0x604D, 0x0725,
+    0x6050, 0x6050, 0x08B5, 0x6052, 0x6052, 0x36EC, 0x6053, 0x6053, 0x1ADF,
+    0x6054, 0x6054, 0x1ADB, 0x6055, 0x6055, 0x08B6, 0x6058, 0x6058, 0x1AE9,
+    0x6059, 0x6059, 0x08B2, 0x605A, 0x605A, 0x1C90, 0x605B, 0x605B, 0x1AE2,
+    0x605D, 0x605D, 0x1C8F, 0x605E, 0x605E, 0x1ADD, 0x605F, 0x605F, 0x1AE6,
+    0x6062, 0x6062, 0x0728, 0x6063, 0x6063, 0x08B3, 0x6064, 0x6064, 0x072E,
+    0x6065, 0x6065, 0x08B4, 0x6066, 0x6066, 0x1AEA, 0x6067, 0x6067, 0x1C91,
+    0x6068, 0x6068, 0x0727, 0x6069, 0x6069, 0x08B8, 0x606A, 0x606A, 0x072D,
+    0x606B, 0x606B, 0x072C, 0x606C, 0x606C, 0x072B, 0x606D, 0x606D, 0x08B7,
+    0x606E, 0x606E, 0x1AEB, 0x606F, 0x606F, 0x08B9, 0x6070, 0x6070, 0x0726,
+    0x6072, 0x6072, 0x1ADC, 0x6075, 0x6075, 0x3A56, 0x6077, 0x6077, 0x4005,
+    0x607E, 0x607E, 0x3A47, 0x607F, 0x607F, 0x0A82, 0x6080, 0x6080, 0x1C95,
+    0x6081, 0x6081, 0x1C97, 0x6083, 0x6083, 0x1C99, 0x6084, 0x6084, 0x08BA,
+    0x6085, 0x6085, 0x08C0, 0x6086, 0x6086, 0x1EDA, 0x6087, 0x6087, 0x1C9D,
+    0x6088, 0x6088, 0x1C94, 0x6089, 0x6089, 0x0A84, 0x608A, 0x608A, 0x1ED8,
+    0x608C, 0x608C, 0x08BF, 0x608D, 0x608D, 0x08BD, 0x608E, 0x608E, 0x1C9F,
+    0x6090, 0x6090, 0x1ED9, 0x6092, 0x6092, 0x1C96, 0x6094, 0x6094, 0x08BE,
+    0x6095, 0x6095, 0x1C9A, 0x6096, 0x6096, 0x08C1, 0x6097, 0x6097, 0x1C9C,
+    0x609A, 0x609A, 0x08BC, 0x609B, 0x609B, 0x1C9B, 0x609C, 0x609C, 0x1C9E,
+    0x609D, 0x609D, 0x1C98, 0x609E, 0x609E, 0x416A, 0x609F, 0x609F, 0x08BB,
+    0x60A0, 0x60A0, 0x0A85, 0x60A2, 0x60A2, 0x1C93, 0x60A3, 0x60A3, 0x0A83,
+    0x60A4, 0x60A4, 0x4001, 0x60A7, 0x60A7, 0x3ADC, 0x60A8, 0x60A8, 0x0A86,
+    0x60B0, 0x60B0, 0x1EDC, 0x60B1, 0x60B1, 0x1EE5, 0x60B2, 0x60B2, 0x0C47,
+    0x60B3, 0x60B3, 0x416C, 0x60B4, 0x60B4, 0x0A88, 0x60B5, 0x60B5, 0x0A8D,
+    0x60B6, 0x60B6, 0x0C48, 0x60B7, 0x60B7, 0x1EE7, 0x60B8, 0x60B8, 0x0A94,
+    0x60B9, 0x60B9, 0x2134, 0x60BA, 0x60BA, 0x1EDD, 0x60BB, 0x60BB, 0x0A8C,
+    0x60BC, 0x60BC, 0x0A8F, 0x60BD, 0x60BD, 0x0A8A, 0x60BE, 0x60BE, 0x1EDB,
+    0x60BF, 0x60BF, 0x1EE9, 0x60C0, 0x60C0, 0x1EEC, 0x60C1, 0x60C1, 0x2143,
+    0x60C3, 0x60C3, 0x1EEA, 0x60C4, 0x60C4, 0x2138, 0x60C5, 0x60C5, 0x0A8B,
+    0x60C6, 0x60C6, 0x0A92, 0x60C7, 0x60C7, 0x0A96, 0x60C8, 0x60C8, 0x1EE4,
+    0x60C9, 0x60C9, 0x2133, 0x60CA, 0x60CA, 0x1EE8, 0x60CB, 0x60CB, 0x0A87,
+    0x60CC, 0x60CC, 0x2135, 0x60CD, 0x60CD, 0x1EEB, 0x60CE, 0x60CE, 0x2137,
+    0x60CF, 0x60CF, 0x1EE0, 0x60D1, 0x60D1, 0x0C45, 0x60D3, 0x60D4, 0x1EDE,
+    0x60D5, 0x60D5, 0x0A91, 0x60D7, 0x60D7, 0x4635, 0x60D8, 0x60D8, 0x0A90,
+    0x60D9, 0x60D9, 0x1EE2, 0x60DA, 0x60DA, 0x0A95, 0x60DB, 0x60DB, 0x1EE6,
+    0x60DC, 0x60DC, 0x0A8E, 0x60DD, 0x60DD, 0x1EE3, 0x60DE, 0x60DE, 0x3DCC,
+    0x60DF, 0x60DF, 0x0A93, 0x60E0, 0x60E0, 0x0C49, 0x60E1, 0x60E1, 0x0C46,
+    0x60E2, 0x60E2, 0x2136, 0x60E3, 0x60E3, 0x3D75, 0x60E4, 0x60E4, 0x1EE1,
+    0x60E6, 0x60E6, 0x0A89, 0x60E7, 0x60E7, 0x3D84, 0x60E8, 0x60E8, 0x3D7B,
+    0x60E9, 0x60E9, 0x4009, 0x60F0, 0x60F0, 0x0C4E, 0x60F1, 0x60F1, 0x0C52,
+    0x60F2, 0x60F2, 0x213A, 0x60F3, 0x60F3, 0x0E0B, 0x60F4, 0x60F4, 0x0C50,
+    0x60F5, 0x60F5, 0x213E, 0x60F6, 0x60F6, 0x0C54, 0x60F7, 0x60F7, 0x23D4,
+    0x60F8, 0x60F8, 0x2140, 0x60F9, 0x60F9, 0x0E0D, 0x60FA, 0x60FA, 0x0C4C,
+    0x60FB, 0x60FB, 0x0C4F, 0x60FC, 0x60FC, 0x2141, 0x60FD, 0x60FD, 0x3FA8,
+    0x60FE, 0x60FE, 0x2142, 0x60FF, 0x60FF, 0x2148, 0x6100, 0x6100, 0x0C56,
+    0x6101, 0x6101, 0x0E0E, 0x6103, 0x6103, 0x2144, 0x6104, 0x6104, 0x2149,
+    0x6105, 0x6105, 0x213D, 0x6106, 0x6106, 0x0E18, 0x6107, 0x6107, 0x3C35,
+    0x6108, 0x6108, 0x0E0F, 0x6109, 0x6109, 0x0C55, 0x610A, 0x610A, 0x213B,
+    0x610B, 0x610B, 0x214A, 0x610C, 0x610C, 0x3C87, 0x610D, 0x610D, 0x0E17,
+    0x610E, 0x610E, 0x0C53, 0x610F, 0x610F, 0x0E08, 0x6110, 0x6110, 0x2147,
+    0x6112, 0x6112, 0x0C57, 0x6113, 0x6113, 0x213F, 0x6114, 0x6114, 0x2139,
+    0x6115, 0x6115, 0x0C4D, 0x6116, 0x6116, 0x213C, 0x6118, 0x6118, 0x2145,
+    0x6119, 0x6119, 0x3EF6, 0x611A, 0x611A, 0x0E07, 0x611B, 0x611B, 0x0E0C,
+    0x611C, 0x611C, 0x0C4A, 0x611D, 0x611D, 0x2146, 0x611F, 0x611F, 0x0E0A,
+    0x6123, 0x6123, 0x0C4B, 0x6127, 0x6127, 0x0E16, 0x6128, 0x6128, 0x2683,
+    0x6129, 0x6129, 0x23DF, 0x612B, 0x612B, 0x23D7, 0x612C, 0x612C, 0x2682,
+    0x612E, 0x612E, 0x23DB, 0x612F, 0x612F, 0x23DD, 0x6130, 0x6130, 0x3F37,
+    0x6132, 0x6132, 0x23DA, 0x6134, 0x6134, 0x0E15, 0x6136, 0x6136, 0x23D9,
+    0x6137, 0x6137, 0x0E19, 0x613B, 0x613B, 0x2692, 0x613D, 0x613D, 0x4636,
+    0x613E, 0x613E, 0x0E14, 0x613F, 0x613F, 0x0FD1, 0x6140, 0x6140, 0x23E0,
+    0x6141, 0x6141, 0x2684, 0x6142, 0x6142, 0x4174, 0x6144, 0x6144, 0x0E12,
+    0x6145, 0x6145, 0x23D8, 0x6146, 0x6146, 0x23DC, 0x6147, 0x6147, 0x0FD0,
+    0x6148, 0x6148, 0x0E09, 0x6149, 0x614A, 0x23D5, 0x614B, 0x614B, 0x0FD2,
+    0x614C, 0x614C, 0x0E11, 0x614D, 0x614D, 0x0E13, 0x614E, 0x614E, 0x0E10,
+    0x614F, 0x614F, 0x23DE, 0x6150, 0x6150, 0x3C32, 0x6152, 0x6153, 0x2688,
+    0x6154, 0x6154, 0x268E, 0x6155, 0x6155, 0x1149, 0x6156, 0x6156, 0x2695,
+    0x6158, 0x6158, 0x0FD8, 0x6159, 0x6159, 0x3FBA, 0x615A, 0x615A, 0x0FD7,
+    0x615B, 0x615B, 0x2690, 0x615C, 0x615C, 0x4186, 0x615D, 0x615D, 0x1148,
+    0x615E, 0x615E, 0x2685, 0x615F, 0x615F, 0x0FD6, 0x6160, 0x6160, 0x494C,
+    0x6161, 0x6161, 0x2694, 0x6162, 0x6163, 0x0FD4, 0x6164, 0x6164, 0x4173,
+    0x6165, 0x6165, 0x2691, 0x6166, 0x6166, 0x28DE, 0x6167, 0x6167, 0x1146,
+    0x6168, 0x6168, 0x0C51, 0x616A, 0x616A, 0x2693, 0x616B, 0x616B, 0x114D,
+    0x616C, 0x616C, 0x268B, 0x616E, 0x616E, 0x1147, 0x616F, 0x616F, 0x3FC0,
+    0x6170, 0x6170, 0x114C, 0x6171, 0x6171, 0x2686, 0x6172, 0x6172, 0x268A,
+    0x6173, 0x6173, 0x2687, 0x6174, 0x6174, 0x268D, 0x6175, 0x6175, 0x0FD9,
+    0x6176, 0x6176, 0x1145, 0x6177, 0x6177, 0x0FD3, 0x6179, 0x6179, 0x28D0,
+    0x617A, 0x617A, 0x268F, 0x617C, 0x617C, 0x114B, 0x617D, 0x617D, 0x3FBD,
+    0x617E, 0x617E, 0x114E, 0x6180, 0x6180, 0x268C, 0x6181, 0x6181, 0x4177,
+    0x6182, 0x6182, 0x114A, 0x6183, 0x6183, 0x28CF, 0x6187, 0x6187, 0x417A,
+    0x6189, 0x6189, 0x28D4, 0x618A, 0x618A, 0x12B1, 0x618B, 0x618B, 0x28CE,
+    0x618C, 0x618C, 0x2B4D, 0x618D, 0x618D, 0x28DD, 0x618E, 0x618E, 0x1152,
+    0x6190, 0x6190, 0x1150, 0x6191, 0x6191, 0x12AF, 0x6192, 0x6192, 0x28DA,
+    0x6193, 0x6193, 0x28D6, 0x6194, 0x6194, 0x1156, 0x6195, 0x6195, 0x3DE0,
+    0x6196, 0x6196, 0x2B44, 0x6198, 0x6198, 0x3A55, 0x6199, 0x6199, 0x3A54,
+    0x619A, 0x619A, 0x1154, 0x619B, 0x619B, 0x28D5, 0x619C, 0x619C, 0x4002,
+    0x619D, 0x619D, 0x2B42, 0x619F, 0x619F, 0x28D9, 0x61A1, 0x61A1, 0x28DC,
+    0x61A2, 0x61A2, 0x28D3, 0x61A4, 0x61A4, 0x1155, 0x61A7, 0x61A7, 0x114F,
+    0x61A8, 0x61A8, 0x2B43, 0x61A9, 0x61A9, 0x12B0, 0x61AA, 0x61AA, 0x28DB,
+    0x61AB, 0x61AB, 0x1151, 0x61AC, 0x61AC, 0x1153, 0x61AD, 0x61AD, 0x28D8,
+    0x61AE, 0x61AE, 0x1157, 0x61AF, 0x61AF, 0x28D7, 0x61B0, 0x61B0, 0x28D2,
+    0x61B1, 0x61B1, 0x28D1, 0x61B2, 0x61B2, 0x12AE, 0x61B3, 0x61B3, 0x28DF,
+    0x61B4, 0x61B4, 0x2B46, 0x61B5, 0x61B5, 0x2D60, 0x61B6, 0x61B6, 0x12B3,
+    0x61B7, 0x61B7, 0x4639, 0x61B8, 0x61B8, 0x2B4C, 0x61B9, 0x61B9, 0x43BF,
+    0x61BA, 0x61BA, 0x2B4A, 0x61BC, 0x61BC, 0x2D61, 0x61BE, 0x61BE, 0x12B4,
+    0x61BF, 0x61BF, 0x2B4B, 0x61C0, 0x61C0, 0x3A50, 0x61C1, 0x61C1, 0x2B48,
+    0x61C2, 0x61C2, 0x13D1, 0x61C3, 0x61C3, 0x2D5F, 0x61C5, 0x61C5, 0x2B45,
+    0x61C6, 0x61C6, 0x2B47, 0x61C7, 0x61C7, 0x13D2, 0x61C8, 0x61C8, 0x12B6,
+    0x61C9, 0x61C9, 0x13D0, 0x61CA, 0x61CA, 0x12B5, 0x61CB, 0x61CB, 0x13D4,
+    0x61CC, 0x61CC, 0x2B49, 0x61CD, 0x61CD, 0x12B2, 0x61CF, 0x61CF, 0x463A,
+    0x61D0, 0x61D0, 0x4181, 0x61D3, 0x61D3, 0x417E, 0x61D6, 0x61D6, 0x2F26,
+    0x61D8, 0x61D8, 0x2F1E, 0x61DA, 0x61DA, 0x38B1, 0x61DE, 0x61DE, 0x2D67,
+    0x61DF, 0x61DF, 0x2F1F, 0x61E0, 0x61E0, 0x2D63, 0x61E2, 0x61E2, 0x3FC5,
+    0x61E3, 0x61E3, 0x14D0, 0x61E4, 0x61E4, 0x2D65, 0x61E5, 0x61E5, 0x2D64,
+    0x61E6, 0x61E6, 0x13D3, 0x61E7, 0x61E7, 0x2D62, 0x61E8, 0x61E8, 0x2D66,
+    0x61E9, 0x61E9, 0x2F27, 0x61EA, 0x61EA, 0x2F23, 0x61EB, 0x61EB, 0x2F25,
+    0x61ED, 0x61EE, 0x2F20, 0x61F0, 0x61F0, 0x2F24, 0x61F1, 0x61F1, 0x2F22,
+    0x61F2, 0x61F2, 0x157E, 0x61F5, 0x61F5, 0x1581, 0x61F6, 0x61F6, 0x1580,
+    0x61F7, 0x61F7, 0x157F, 0x61F8, 0x61F8, 0x1614, 0x61F9, 0x61F9, 0x31D3,
+    0x61FA, 0x61FA, 0x1615, 0x61FB, 0x61FB, 0x308F, 0x61FC, 0x61FC, 0x1670,
+    0x61FD, 0x61FD, 0x32D1, 0x61FE, 0x61FE, 0x1671, 0x61FF, 0x61FF, 0x16C4,
+    0x6200, 0x6200, 0x16F8, 0x6201, 0x6201, 0x3417, 0x6203, 0x6204, 0x3418,
+    0x6207, 0x6207, 0x3533, 0x6208, 0x6208, 0x02D1, 0x6209, 0x6209, 0x17A8,
+    0x620A, 0x620A, 0x0341, 0x620C, 0x620D, 0x03D1, 0x620E, 0x620E, 0x03D0,
+    0x6210, 0x6210, 0x03D3, 0x6211, 0x6211, 0x04A2, 0x6212, 0x6212, 0x04A1,
+    0x6214, 0x6214, 0x1991, 0x6215, 0x6215, 0x05D1, 0x6216, 0x6216, 0x05D0,
+    0x6219, 0x6219, 0x1CA0, 0x621A, 0x621B, 0x0A97, 0x621F, 0x621F, 0x0C58,
+    0x6220, 0x6220, 0x23E1, 0x6221, 0x6222, 0x0E1A, 0x6223, 0x6223, 0x23E3,
+    0x6224, 0x6224, 0x23E5, 0x6225, 0x6225, 0x23E4, 0x6227, 0x6227, 0x2697,
+    0x6229, 0x6229, 0x2696, 0x622A, 0x622A, 0x0FDA, 0x622B, 0x622B, 0x2698,
+    0x622C, 0x622C, 0x463C, 0x622D, 0x622D, 0x28E0, 0x622E, 0x622E, 0x1158,
+    0x6230, 0x6230, 0x12B7, 0x6232, 0x6232, 0x13D5, 0x6233, 0x6233, 0x14D1,
+    0x6234, 0x6234, 0x13D6, 0x6236, 0x6236, 0x02D2, 0x6237, 0x6237, 0x451A,
+    0x6239, 0x6239, 0x3FC2, 0x623A, 0x623A, 0x188D, 0x623D, 0x623D, 0x1992,
+    0x623E, 0x623E, 0x05D3, 0x623F, 0x623F, 0x05D2, 0x6240, 0x6240, 0x05D4,
+    0x6241, 0x6241, 0x072F, 0x6242, 0x6243, 0x1AEC, 0x6246, 0x6246, 0x1CA1,
+    0x6247, 0x6247, 0x08C2, 0x6248, 0x6248, 0x0A99, 0x6249, 0x6249, 0x0C59,
+    0x624A, 0x624A, 0x214B, 0x624B, 0x624B, 0x02D3, 0x624C, 0x624C, 0x44EC,
+    0x624D, 0x624D, 0x0291, 0x624E, 0x624E, 0x02D4, 0x6250, 0x6250, 0x17A9,
+    0x6251, 0x6251, 0x0345, 0x6252, 0x6252, 0x0344, 0x6253, 0x6254, 0x0342,
+    0x6258, 0x6258, 0x03D6, 0x6259, 0x6259, 0x17F2, 0x625A, 0x625A, 0x17F4,
+    0x625B, 0x625B, 0x03D5, 0x625C, 0x625C, 0x17EC, 0x625E, 0x625E, 0x17ED,
+    0x6260, 0x6260, 0x17F3, 0x6261, 0x6261, 0x17EF, 0x6262, 0x6262, 0x17F1,
+    0x6263, 0x6263, 0x03D4, 0x6264, 0x6264, 0x17EE, 0x6265, 0x6265, 0x17F5,
+    0x6266, 0x6266, 0x17F0, 0x6268, 0x6268, 0x3F15, 0x626D, 0x626D, 0x04A9,
+    0x626E, 0x626E, 0x04B2, 0x626F, 0x626F, 0x04B0, 0x6270, 0x6270, 0x1897,
+    0x6271, 0x6271, 0x1894, 0x6272, 0x6272, 0x189C, 0x6273, 0x6273, 0x04AE,
+    0x6274, 0x6274, 0x189D, 0x6276, 0x6276, 0x04A7, 0x6277, 0x6277, 0x189A,
+    0x6279, 0x6279, 0x04AD, 0x627A, 0x627A, 0x1896, 0x627B, 0x627B, 0x1895,
+    0x627C, 0x627C, 0x04AB, 0x627D, 0x627D, 0x189B, 0x627E, 0x627E, 0x04AC,
+    0x627F, 0x627F, 0x05D5, 0x6280, 0x6280, 0x04A6, 0x6281, 0x6281, 0x1898,
+    0x6282, 0x6282, 0x3F86, 0x6283, 0x6283, 0x188E, 0x6284, 0x6284, 0x04A3,
+    0x6285, 0x6285, 0x3F50, 0x6286, 0x6286, 0x04B6, 0x6287, 0x6287, 0x1893,
+    0x6288, 0x6288, 0x1899, 0x6289, 0x6289, 0x04A8, 0x628A, 0x628A, 0x04AA,
+    0x628C, 0x628C, 0x188F, 0x628E, 0x628F, 0x1890, 0x6290, 0x6290, 0x43C0,
+    0x6291, 0x6291, 0x04B5, 0x6292, 0x6292, 0x04AF, 0x6293, 0x6293, 0x04B4,
+    0x6294, 0x6294, 0x1892, 0x6295, 0x6295, 0x04B3, 0x6296, 0x6296, 0x04A5,
+    0x6297, 0x6297, 0x04A4, 0x6298, 0x6298, 0x04B1, 0x629D, 0x629D, 0x3E96,
+    0x62A4, 0x62A4, 0x3A69, 0x62A6, 0x62A6, 0x3FC1, 0x62A8, 0x62A8, 0x05E3,
+    0x62A9, 0x62A9, 0x199E, 0x62AA, 0x62AA, 0x1997, 0x62AB, 0x62AB, 0x05DE,
+    0x62AC, 0x62AC, 0x05F1, 0x62AD, 0x62AD, 0x1993, 0x62AE, 0x62AE, 0x199A,
+    0x62AF, 0x62AF, 0x199C, 0x62B0, 0x62B0, 0x199F, 0x62B1, 0x62B1, 0x05EC,
+    0x62B3, 0x62B3, 0x199B, 0x62B4, 0x62B4, 0x1994, 0x62B5, 0x62B5, 0x05EA,
+    0x62B6, 0x62B6, 0x1998, 0x62B8, 0x62B8, 0x19A0, 0x62B9, 0x62B9, 0x05DB,
+    0x62BB, 0x62BB, 0x199D, 0x62BC, 0x62BC, 0x05E5, 0x62BD, 0x62BD, 0x05E4,
+    0x62BE, 0x62BE, 0x1996, 0x62BF, 0x62BF, 0x05D9, 0x62C2, 0x62C2, 0x05DA,
+    0x62C3, 0x62C3, 0x3D8F, 0x62C4, 0x62C4, 0x05D8, 0x62C5, 0x62C5, 0x418A,
+    0x62C6, 0x62C6, 0x05F0, 0x62C7, 0x62C7, 0x05E8, 0x62C8, 0x62C8, 0x05E2,
+    0x62C9, 0x62C9, 0x05D6, 0x62CA, 0x62CA, 0x1999, 0x62CB, 0x62CB, 0x05E1,
+    0x62CC, 0x62CC, 0x05D7, 0x62CD, 0x62CD, 0x05E9, 0x62CE, 0x62CE, 0x05F2,
+    0x62CF, 0x62CF, 0x1AEE, 0x62D0, 0x62D0, 0x05E6, 0x62D1, 0x62D1, 0x1995,
+    0x62D2, 0x62D2, 0x05DC, 0x62D3, 0x62D4, 0x05DF, 0x62D5, 0x62D5, 0x418C,
+    0x62D6, 0x62D7, 0x05EE, 0x62D8, 0x62D8, 0x05ED, 0x62D9, 0x62D9, 0x05E7,
+    0x62DA, 0x62DA, 0x05EB, 0x62DB, 0x62DB, 0x05DD, 0x62DC, 0x62DC, 0x0730,
+    0x62DF, 0x62DF, 0x401C, 0x62E5, 0x62E5, 0x463D, 0x62EB, 0x62EB, 0x1AF4,
+    0x62EC, 0x62EC, 0x073C, 0x62ED, 0x62ED, 0x0734, 0x62EE, 0x62EE, 0x0736,
+    0x62EF, 0x62EF, 0x073B, 0x62F0, 0x62F0, 0x1B00, 0x62F1, 0x62F1, 0x0739,
+    0x62F2, 0x62F2, 0x1CA2, 0x62F3, 0x62F3, 0x08C3, 0x62F4, 0x62F4, 0x073E,
+    0x62F5, 0x62F5, 0x1AF1, 0x62F6, 0x62F6, 0x1AF9, 0x62F7, 0x62F7, 0x073A,
+    0x62F8, 0x62F8, 0x1AF8, 0x62F9, 0x62F9, 0x1AF5, 0x62FA, 0x62FA, 0x1AFD,
+    0x62FB, 0x62FB, 0x1AFF, 0x62FC, 0x62FC, 0x0733, 0x62FD, 0x62FD, 0x0737,
+    0x62FE, 0x62FE, 0x073D, 0x62FF, 0x62FF, 0x08C5, 0x6300, 0x6300, 0x1AFA,
+    0x6301, 0x6301, 0x0735, 0x6302, 0x6302, 0x0740, 0x6303, 0x6303, 0x1AF3,
+    0x6307, 0x6307, 0x0738, 0x6308, 0x6308, 0x08C4, 0x6309, 0x6309, 0x0732,
+    0x630B, 0x630B, 0x1AF0, 0x630C, 0x630C, 0x1AF7, 0x630D, 0x630D, 0x1AEF,
+    0x630E, 0x630E, 0x1AF2, 0x630F, 0x630F, 0x1AF6, 0x6310, 0x6310, 0x1CA3,
+    0x6311, 0x6311, 0x073F, 0x6313, 0x6314, 0x1AFB, 0x6315, 0x6315, 0x1AFE,
+    0x6316, 0x6316, 0x0731, 0x6318, 0x6318, 0x43C1, 0x6328, 0x6328, 0x08D3,
+    0x6329, 0x6329, 0x1CAF, 0x632A, 0x632B, 0x08D1, 0x632C, 0x632C, 0x1CA5,
+    0x632D, 0x632D, 0x1CB5, 0x632E, 0x632E, 0x3EDD, 0x632F, 0x632F, 0x08C8,
+    0x6331, 0x6331, 0x3A65, 0x6332, 0x6332, 0x1EED, 0x6333, 0x6333, 0x1CB7,
+    0x6334, 0x6334, 0x1CB1, 0x6335, 0x6335, 0x3F16, 0x6336, 0x6336, 0x1CA8,
+    0x6337, 0x6337, 0x3A63, 0x6338, 0x6338, 0x1CBA, 0x6339, 0x6339, 0x1CAB,
+    0x633A, 0x633A, 0x08CE, 0x633B, 0x633B, 0x1F04, 0x633C, 0x633C, 0x1CAE,
+    0x633D, 0x633D, 0x08D0, 0x633E, 0x633E, 0x08C7, 0x6340, 0x6340, 0x1CBC,
+    0x6341, 0x6341, 0x1CB0, 0x6342, 0x6342, 0x08CA, 0x6343, 0x6343, 0x1CA9,
+    0x6344, 0x6345, 0x1CA6, 0x6346, 0x6346, 0x08CB, 0x6347, 0x6347, 0x1CB6,
+    0x6348, 0x6348, 0x1CBD, 0x6349, 0x6349, 0x08CD, 0x634A, 0x634A, 0x1CAD,
+    0x634B, 0x634B, 0x1CAC, 0x634C, 0x634C, 0x08D5, 0x634D, 0x634D, 0x08D4,
+    0x634E, 0x634E, 0x08C6, 0x634F, 0x634F, 0x08CC, 0x6350, 0x6350, 0x08CF,
+    0x6351, 0x6351, 0x1CB9, 0x6354, 0x6354, 0x1CB3, 0x6355, 0x6355, 0x08C9,
+    0x6356, 0x6356, 0x1CA4, 0x6357, 0x6357, 0x1CBB, 0x6358, 0x6358, 0x1CB2,
+    0x6359, 0x6359, 0x1CB4, 0x635A, 0x635A, 0x1CB8, 0x6364, 0x6364, 0x3FC7,
+    0x6365, 0x6365, 0x1EEE, 0x6367, 0x6367, 0x0AA1, 0x6368, 0x6368, 0x0AB5,
+    0x6369, 0x6369, 0x0AB4, 0x636B, 0x636B, 0x0AA9, 0x636C, 0x636C, 0x418E,
+    0x636D, 0x636D, 0x1F00, 0x636E, 0x636E, 0x1EFC, 0x636F, 0x636F, 0x1EF9,
+    0x6370, 0x6370, 0x1F0B, 0x6371, 0x6371, 0x0AA4, 0x6372, 0x6372, 0x0A9C,
+    0x6375, 0x6375, 0x1EFE, 0x6376, 0x6376, 0x0C69, 0x6377, 0x6377, 0x0AA0,
+    0x6378, 0x6378, 0x1F06, 0x6379, 0x6379, 0x4367, 0x637A, 0x637A, 0x0AB6,
+    0x637B, 0x637B, 0x0AB3, 0x637C, 0x637C, 0x1F02, 0x637D, 0x637D, 0x1EF1,
+    0x637F, 0x637F, 0x3F4B, 0x6380, 0x6380, 0x0AB2, 0x6381, 0x6381, 0x1F08,
+    0x6382, 0x6382, 0x1EF0, 0x6383, 0x6383, 0x0AA7, 0x6384, 0x6384, 0x0AAB,
+    0x6385, 0x6385, 0x1F07, 0x6387, 0x6387, 0x1EFA, 0x6388, 0x6388, 0x0AAC,
+    0x6389, 0x6389, 0x0AA6, 0x638A, 0x638A, 0x1EEF, 0x638B, 0x638B, 0x4188,
+    0x638C, 0x638C, 0x0C5B, 0x638D, 0x638D, 0x1F0A, 0x638E, 0x638E, 0x1EF8,
+    0x638F, 0x638F, 0x0AB1, 0x6390, 0x6390, 0x1EFB, 0x6391, 0x6391, 0x1F09,
+    0x6392, 0x6392, 0x0AB0, 0x6394, 0x6394, 0x214C, 0x6396, 0x6396, 0x0A9D,
+    0x6397, 0x6397, 0x1EF6, 0x6398, 0x6398, 0x0AA2, 0x6399, 0x6399, 0x0AAD,
+    0x639B, 0x639B, 0x0AA8, 0x639C, 0x639C, 0x1EFF, 0x639D, 0x639D, 0x1EF5,
+    0x639E, 0x639E, 0x1EF3, 0x639F, 0x639F, 0x1F05, 0x63A0, 0x63A0, 0x0A9A,
+    0x63A1, 0x63A1, 0x0AAE, 0x63A2, 0x63A2, 0x0A9E, 0x63A3, 0x63A3, 0x0C5A,
+    0x63A4, 0x63A4, 0x1F03, 0x63A5, 0x63A5, 0x0A9F, 0x63A7, 0x63A7, 0x0A9B,
+    0x63A8, 0x63A8, 0x0AAA, 0x63A9, 0x63A9, 0x0AA5, 0x63AA, 0x63AA, 0x0AA3,
+    0x63AB, 0x63AB, 0x1EF7, 0x63AC, 0x63AC, 0x0AAF, 0x63AD, 0x63AD, 0x1EF4,
+    0x63AE, 0x63AE, 0x1F01, 0x63AF, 0x63AF, 0x1EFD, 0x63B0, 0x63B0, 0x214E,
+    0x63B1, 0x63B1, 0x214D, 0x63B9, 0x63B9, 0x3E9D, 0x63BD, 0x63BD, 0x1EF2,
+    0x63BE, 0x63BE, 0x215E, 0x63C0, 0x63C0, 0x0C5D, 0x63C1, 0x63C1, 0x46A8,
+    0x63C2, 0x63C2, 0x2164, 0x63C3, 0x63C3, 0x2153, 0x63C4, 0x63C4, 0x2161,
+    0x63C5, 0x63C5, 0x23E6, 0x63C6, 0x63C6, 0x0C60, 0x63C7, 0x63C7, 0x2165,
+    0x63C8, 0x63C8, 0x2168, 0x63C9, 0x63C9, 0x0C5F, 0x63CA, 0x63CA, 0x2156,
+    0x63CB, 0x63CB, 0x2167, 0x63CC, 0x63CC, 0x2166, 0x63CD, 0x63CD, 0x0C61,
+    0x63CE, 0x63CE, 0x214F, 0x63CF, 0x63CF, 0x0C5C, 0x63D0, 0x63D0, 0x0C64,
+    0x63D1, 0x63D1, 0x3A66, 0x63D2, 0x63D2, 0x0C62, 0x63D3, 0x63D3, 0x2163,
+    0x63D5, 0x63D5, 0x2159, 0x63D6, 0x63D6, 0x0C66, 0x63D7, 0x63D7, 0x216A,
+    0x63D8, 0x63D8, 0x2162, 0x63D9, 0x63D9, 0x216B, 0x63DA, 0x63DA, 0x0C6E,
+    0x63DB, 0x63DB, 0x0C6C, 0x63DC, 0x63DC, 0x2160, 0x63DD, 0x63DD, 0x215F,
+    0x63DE, 0x63DE, 0x3E60, 0x63DF, 0x63DF, 0x215D, 0x63E0, 0x63E0, 0x2157,
+    0x63E1, 0x63E1, 0x0C65, 0x63E2, 0x63E2, 0x4641, 0x63E3, 0x63E3, 0x0C63,
+    0x63E4, 0x63E4, 0x1CAA, 0x63E5, 0x63E5, 0x2150, 0x63E6, 0x63E6, 0x489F,
+    0x63E7, 0x63E7, 0x2404, 0x63E8, 0x63E8, 0x2151, 0x63E9, 0x63E9, 0x0C5E,
+    0x63EA, 0x63EA, 0x0C6B, 0x63EB, 0x63EB, 0x23E8, 0x63ED, 0x63EE, 0x0C67,
+    0x63EF, 0x63EF, 0x2152, 0x63F0, 0x63F0, 0x2169, 0x63F1, 0x63F1, 0x23E7,
+    0x63F2, 0x63F2, 0x215A, 0x63F3, 0x63F3, 0x2155, 0x63F4, 0x63F4, 0x0C6A,
+    0x63F5, 0x63F5, 0x215B, 0x63F6, 0x63F6, 0x2158, 0x63F8, 0x63F8, 0x4192,
+    0x63F9, 0x63F9, 0x0C6F, 0x63FB, 0x63FB, 0x4642, 0x63FC, 0x63FC, 0x3E9C,
+    0x63FE, 0x63FE, 0x3E9E, 0x6406, 0x6406, 0x0E2A, 0x6407, 0x6407, 0x4643,
+    0x6409, 0x6409, 0x23EB, 0x640A, 0x640A, 0x23FE, 0x640B, 0x640B, 0x2403,
+    0x640C, 0x640C, 0x23F7, 0x640D, 0x640D, 0x0E26, 0x640E, 0x640E, 0x2408,
+    0x640F, 0x640F, 0x0E23, 0x6410, 0x6410, 0x23E9, 0x6412, 0x6412, 0x23EA,
+    0x6413, 0x6413, 0x0E1C, 0x6414, 0x6414, 0x0E25, 0x6415, 0x6415, 0x23F1,
+    0x6416, 0x6417, 0x0E28, 0x6418, 0x6418, 0x23F2, 0x641A, 0x641A, 0x23FF,
+    0x641B, 0x641B, 0x2405, 0x641C, 0x641C, 0x0E24, 0x641E, 0x641E, 0x0E1E,
+    0x641F, 0x641F, 0x23F0, 0x6420, 0x6420, 0x23EC, 0x6421, 0x6421, 0x2407,
+    0x6422, 0x6423, 0x23F5, 0x6424, 0x6424, 0x23ED, 0x6425, 0x6425, 0x2401,
+    0x6426, 0x6426, 0x23F8, 0x6427, 0x6427, 0x2402, 0x6428, 0x6428, 0x23FA,
+    0x642A, 0x642A, 0x0E1F, 0x642B, 0x642B, 0x2699, 0x642C, 0x642C, 0x0E22,
+    0x642D, 0x642D, 0x0E20, 0x642E, 0x642E, 0x2406, 0x642F, 0x642F, 0x23FD,
+    0x6430, 0x6430, 0x23F9, 0x6432, 0x6432, 0x45D9, 0x6433, 0x6433, 0x23EE,
+    0x6434, 0x6434, 0x0FE4, 0x6435, 0x6435, 0x23FC, 0x6436, 0x6436, 0x0E27,
+    0x6437, 0x6437, 0x23F4, 0x6438, 0x6438, 0x4191, 0x6439, 0x6439, 0x23F3,
+    0x643A, 0x643A, 0x419D, 0x643B, 0x643B, 0x3A6B, 0x643D, 0x643D, 0x0E21,
+    0x643E, 0x643E, 0x0E1D, 0x643F, 0x643F, 0x26AE, 0x6440, 0x6440, 0x2400,
+    0x6441, 0x6441, 0x23FB, 0x6443, 0x6443, 0x23EF, 0x644B, 0x644B, 0x26A9,
+    0x644D, 0x644D, 0x269A, 0x644E, 0x644E, 0x26A5, 0x6450, 0x6450, 0x26AC,
+    0x6451, 0x6451, 0x0FE2, 0x6452, 0x6452, 0x0C6D, 0x6453, 0x6453, 0x26AA,
+    0x6454, 0x6454, 0x0FDD, 0x6458, 0x6458, 0x0FDC, 0x6459, 0x6459, 0x26B1,
+    0x645A, 0x645A, 0x43C2, 0x645B, 0x645B, 0x269B, 0x645C, 0x645C, 0x26A8,
+    0x645D, 0x645D, 0x269C, 0x645E, 0x645E, 0x26A7, 0x645F, 0x645F, 0x0FE0,
+    0x6460, 0x6460, 0x26AB, 0x6461, 0x6461, 0x215C, 0x6465, 0x6465, 0x26B2,
+    0x6466, 0x6466, 0x26A3, 0x6467, 0x6467, 0x0FE3, 0x6468, 0x6468, 0x28EE,
+    0x6469, 0x6469, 0x1159, 0x646B, 0x646B, 0x26B0, 0x646C, 0x646C, 0x26AF,
+    0x646D, 0x646D, 0x0FE5, 0x646E, 0x646E, 0x28E1, 0x646F, 0x646F, 0x115A,
+    0x6470, 0x6470, 0x28E2, 0x6471, 0x6471, 0x3A5B, 0x6472, 0x6473, 0x269F,
+    0x6474, 0x6474, 0x269D, 0x6475, 0x6475, 0x26A2, 0x6476, 0x6476, 0x269E,
+    0x6477, 0x6477, 0x26B3, 0x6478, 0x6478, 0x0FDF, 0x6479, 0x6479, 0x115B,
+    0x647A, 0x647A, 0x0FE1, 0x647B, 0x647B, 0x0FE6, 0x647C, 0x647C, 0x436C,
+    0x647D, 0x647D, 0x26A1, 0x647F, 0x647F, 0x26AD, 0x6482, 0x6482, 0x26A6,
+    0x6485, 0x6485, 0x28E5, 0x6487, 0x6487, 0x0FDB, 0x6488, 0x6488, 0x115E,
+    0x6489, 0x6489, 0x2B54, 0x648A, 0x648A, 0x28EA, 0x648B, 0x648B, 0x28E9,
+    0x648C, 0x648C, 0x28EB, 0x648D, 0x648D, 0x4323, 0x648F, 0x648F, 0x28E8,
+    0x6490, 0x6490, 0x115F, 0x6491, 0x6491, 0x43C3, 0x6492, 0x6492, 0x1165,
+    0x6493, 0x6493, 0x1162, 0x6495, 0x6495, 0x1163, 0x6496, 0x6496, 0x28E3,
+    0x6497, 0x6497, 0x28E6, 0x6498, 0x6498, 0x28F0, 0x6499, 0x6499, 0x116B,
+    0x649A, 0x649A, 0x1169, 0x649C, 0x649C, 0x28E7, 0x649D, 0x649D, 0x2154,
+    0x649E, 0x649E, 0x115C, 0x649F, 0x649F, 0x28ED, 0x64A0, 0x64A0, 0x28E4,
+    0x64A2, 0x64A2, 0x116C, 0x64A3, 0x64A3, 0x28EC, 0x64A4, 0x64A4, 0x0FDE,
+    0x64A5, 0x64A5, 0x1161, 0x64A6, 0x64A6, 0x26A4, 0x64A9, 0x64A9, 0x1164,
+    0x64AB, 0x64AB, 0x1168, 0x64AC, 0x64AC, 0x116A, 0x64AD, 0x64AD, 0x1167,
+    0x64AE, 0x64AE, 0x1166, 0x64AF, 0x64AF, 0x42E1, 0x64B0, 0x64B0, 0x1160,
+    0x64B1, 0x64B1, 0x28EF, 0x64B2, 0x64B2, 0x115D, 0x64B3, 0x64B3, 0x116D,
+    0x64B4, 0x64B4, 0x4340, 0x64B6, 0x64B6, 0x3A64, 0x64BB, 0x64BC, 0x12BB,
+    0x64BD, 0x64BD, 0x2B53, 0x64BE, 0x64BE, 0x12C5, 0x64BF, 0x64BF, 0x12C2,
+    0x64C0, 0x64C0, 0x4645, 0x64C1, 0x64C1, 0x12B9, 0x64C2, 0x64C2, 0x12C0,
+    0x64C3, 0x64C3, 0x2B55, 0x64C4, 0x64C4, 0x12BE, 0x64C5, 0x64C5, 0x12B8,
+    0x64C7, 0x64C7, 0x12BF, 0x64C9, 0x64C9, 0x2B52, 0x64CA, 0x64CA, 0x13D8,
+    0x64CB, 0x64CB, 0x12BA, 0x64CD, 0x64CD, 0x12C1, 0x64CE, 0x64CE, 0x13D7,
+    0x64CF, 0x64CF, 0x2B51, 0x64D0, 0x64D0, 0x2B50, 0x64D2, 0x64D2, 0x12C3,
+    0x64D3, 0x64D3, 0x3F03, 0x64D4, 0x64D4, 0x12C4, 0x64D6, 0x64D6, 0x2B4F,
+    0x64D7, 0x64D7, 0x2B4E, 0x64D8, 0x64D8, 0x13D9, 0x64D9, 0x64D9, 0x2B58,
+    0x64DA, 0x64DA, 0x12BD, 0x64DB, 0x64DB, 0x2B56, 0x64DD, 0x64DD, 0x431E,
+    0x64E0, 0x64E0, 0x13DA, 0x64E1, 0x64E1, 0x4199, 0x64E2, 0x64E2, 0x13DF,
+    0x64E3, 0x64E3, 0x2D6A, 0x64E4, 0x64E4, 0x2D6C, 0x64E5, 0x64E5, 0x419A,
+    0x64E6, 0x64E6, 0x13DC, 0x64E7, 0x64E7, 0x37A8, 0x64E8, 0x64E8, 0x2D6D,
+    0x64E9, 0x64E9, 0x2D69, 0x64EA, 0x64EA, 0x434A, 0x64EB, 0x64EB, 0x2D6B,
+    0x64EC, 0x64EC, 0x13DD, 0x64ED, 0x64ED, 0x13E0, 0x64EF, 0x64EF, 0x2D68,
+    0x64F0, 0x64F0, 0x13DB, 0x64F1, 0x64F1, 0x13DE, 0x64F2, 0x64F2, 0x14D3,
+    0x64F3, 0x64F3, 0x2B57, 0x64F4, 0x64F4, 0x14D2, 0x64F7, 0x64F7, 0x14D8,
+    0x64F8, 0x64F8, 0x2F2B, 0x64FA, 0x64FB, 0x14D6, 0x64FC, 0x64FC, 0x2F2E,
+    0x64FD, 0x64FD, 0x2F2A, 0x64FE, 0x64FE, 0x14D4, 0x64FF, 0x64FF, 0x2F28,
+    0x6500, 0x6500, 0x1582, 0x6501, 0x6501, 0x2F2C, 0x6503, 0x6503, 0x2F2D,
+    0x6504, 0x6504, 0x2F29, 0x6506, 0x6506, 0x14D5, 0x6507, 0x6507, 0x3090,
+    0x6509, 0x6509, 0x3093, 0x650A, 0x650A, 0x4536, 0x650C, 0x650C, 0x3094,
+    0x650D, 0x650D, 0x3092, 0x650E, 0x650E, 0x3095, 0x650F, 0x650F, 0x1583,
+    0x6510, 0x6510, 0x3091, 0x6511, 0x6511, 0x3AA9, 0x6513, 0x6513, 0x31D7,
+    0x6514, 0x6514, 0x1617, 0x6515, 0x6515, 0x31D6, 0x6516, 0x6516, 0x31D5,
+    0x6517, 0x6517, 0x31D4, 0x6518, 0x6518, 0x1616, 0x6519, 0x6519, 0x1618,
+    0x651B, 0x651B, 0x32D2, 0x651C, 0x651C, 0x1673, 0x651D, 0x651D, 0x1672,
+    0x651E, 0x651E, 0x4187, 0x651F, 0x651F, 0x3EC0, 0x6520, 0x6520, 0x3382,
+    0x6521, 0x6521, 0x3381, 0x6522, 0x6522, 0x3384, 0x6523, 0x6523, 0x16F9,
+    0x6524, 0x6524, 0x16C5, 0x6525, 0x6525, 0x341B, 0x6526, 0x6526, 0x3383,
+    0x6529, 0x6529, 0x341A, 0x652A, 0x652A, 0x16FB, 0x652B, 0x652B, 0x16FA,
+    0x652C, 0x652C, 0x1721, 0x652D, 0x652D, 0x3484, 0x652E, 0x652E, 0x34CA,
+    0x652F, 0x652F, 0x02D5, 0x6530, 0x6530, 0x3E62, 0x6532, 0x6532, 0x216C,
+    0x6533, 0x6533, 0x2B59, 0x6534, 0x6534, 0x022C, 0x6535, 0x6535, 0x44ED,
+    0x6536, 0x6536, 0x03D7, 0x6537, 0x6537, 0x17F6, 0x6538, 0x6538, 0x04B9,
+    0x6539, 0x6539, 0x04B7, 0x653B, 0x653B, 0x04B8, 0x653D, 0x653D, 0x19A1,
+    0x653E, 0x653E, 0x05F3, 0x653F, 0x653F, 0x0741, 0x6541, 0x6541, 0x1B01,
+    0x6543, 0x6543, 0x1B02, 0x6545, 0x6545, 0x0742, 0x6546, 0x6546, 0x1CBF,
+    0x6548, 0x6549, 0x08D6, 0x654A, 0x654A, 0x1CBE, 0x654D, 0x654D, 0x419F,
+    0x654F, 0x654F, 0x0ABD, 0x6551, 0x6551, 0x0AB9, 0x6553, 0x6553, 0x1F0C,
+    0x6554, 0x6554, 0x0AC0, 0x6555, 0x6555, 0x0ABF, 0x6556, 0x6556, 0x0AB8,
+    0x6557, 0x6557, 0x0ABB, 0x6558, 0x6558, 0x0ABE, 0x6559, 0x6559, 0x0ABA,
+    0x655C, 0x655C, 0x2170, 0x655D, 0x655D, 0x0AB7, 0x655E, 0x655E, 0x0C70,
+    0x655F, 0x655F, 0x41A5, 0x6562, 0x6563, 0x0C72, 0x6564, 0x6564, 0x216F,
+    0x6565, 0x6565, 0x2172, 0x6566, 0x6566, 0x0C71, 0x6567, 0x6567, 0x216D,
+    0x6568, 0x6568, 0x2171, 0x656A, 0x656A, 0x216E, 0x656B, 0x656B, 0x3A6C,
+    0x656C, 0x656C, 0x0E2B, 0x656D, 0x656D, 0x41A4, 0x656F, 0x656F, 0x2409,
+    0x6572, 0x6572, 0x0FE7, 0x6573, 0x6573, 0x26B4, 0x6574, 0x6574, 0x12C6,
+    0x6575, 0x6575, 0x116E, 0x6576, 0x6576, 0x28F1, 0x6577, 0x6578, 0x116F,
+    0x6579, 0x6579, 0x28F3, 0x657A, 0x657A, 0x28F2, 0x657B, 0x657B, 0x28F4,
+    0x657C, 0x657C, 0x2B5B, 0x657F, 0x657F, 0x2B5A, 0x6580, 0x6580, 0x2D6F,
+    0x6581, 0x6581, 0x2D6E, 0x6582, 0x6583, 0x13E1, 0x6584, 0x6584, 0x3096,
+    0x6585, 0x6585, 0x41A3, 0x6586, 0x6586, 0x4648, 0x6587, 0x6587, 0x02D6,
+    0x6588, 0x6588, 0x410B, 0x6589, 0x6589, 0x4554, 0x658C, 0x658C, 0x2173,
+    0x6590, 0x6590, 0x0C75, 0x6591, 0x6591, 0x0C74, 0x6592, 0x6592, 0x240A,
+    0x6594, 0x6594, 0x2F2F, 0x6595, 0x6595, 0x1674, 0x6596, 0x6596, 0x341C,
+    0x6597, 0x6597, 0x02D7, 0x6599, 0x6599, 0x08D8, 0x659B, 0x659B, 0x0AC2,
+    0x659C, 0x659C, 0x0AC1, 0x659D, 0x659E, 0x2174, 0x659F, 0x659F, 0x0E2C,
+    0x65A0, 0x65A0, 0x26B5, 0x65A1, 0x65A1, 0x0FE8, 0x65A2, 0x65A2, 0x2B5C,
+    0x65A4, 0x65A4, 0x02D8, 0x65A5, 0x65A5, 0x0346, 0x65A7, 0x65A7, 0x05F4,
+    0x65A8, 0x65A8, 0x19A2, 0x65AA, 0x65AA, 0x1B03, 0x65AB, 0x65AB, 0x0743,
+    0x65AC, 0x65AC, 0x0AC3, 0x65AE, 0x65AE, 0x2176, 0x65AF, 0x65AF, 0x0C76,
+    0x65B0, 0x65B0, 0x0E2D, 0x65B2, 0x65B3, 0x28F5, 0x65B5, 0x65B5, 0x41A7,
+    0x65B6, 0x65B6, 0x2D70, 0x65B7, 0x65B7, 0x14D9, 0x65B8, 0x65B8, 0x34CB,
+    0x65B9, 0x65B9, 0x02D9, 0x65BB, 0x65BB, 0x19A3, 0x65BC, 0x65BC, 0x05F5,
+    0x65BD, 0x65BD, 0x0744, 0x65BE, 0x65BE, 0x3E3B, 0x65BF, 0x65BF, 0x1B04,
+    0x65C1, 0x65C1, 0x08D9, 0x65C2, 0x65C2, 0x1CC3, 0x65C3, 0x65C4, 0x1CC1,
+    0x65C5, 0x65C5, 0x08DA, 0x65C6, 0x65C6, 0x1CC0, 0x65CB, 0x65CC, 0x0AC5,
+    0x65CD, 0x65CD, 0x1F0D, 0x65CE, 0x65CE, 0x0AC7, 0x65CF, 0x65CF, 0x0AC4,
+    0x65D0, 0x65D0, 0x2177, 0x65D1, 0x65D1, 0x41AA, 0x65D2, 0x65D2, 0x2178,
+    0x65D3, 0x65D3, 0x240B, 0x65D4, 0x65D4, 0x3BA8, 0x65D6, 0x65D6, 0x0FEA,
+    0x65D7, 0x65D7, 0x0FE9, 0x65DA, 0x65DA, 0x2D71, 0x65DB, 0x65DB, 0x2F30,
+    0x65DD, 0x65DD, 0x3098, 0x65DE, 0x65DE, 0x3097, 0x65DF, 0x65DF, 0x31D8,
+    0x65E0, 0x65E0, 0x022D, 0x65E1, 0x65E1, 0x1789, 0x65E2, 0x65E2, 0x0745,
+    0x65E3, 0x65E3, 0x41AE, 0x65E5, 0x65E5, 0x02DA, 0x65E6, 0x65E6, 0x0347,
+    0x65E8, 0x65E8, 0x03D9, 0x65E9, 0x65E9, 0x03D8, 0x65EC, 0x65ED, 0x03DA,
+    0x65EE, 0x65EE, 0x17F8, 0x65EF, 0x65EF, 0x17F7, 0x65F0, 0x65F0, 0x189E,
+    0x65F1, 0x65F1, 0x04BA, 0x65F2, 0x65F2, 0x18A1, 0x65F3, 0x65F3, 0x18A0,
+    0x65F4, 0x65F4, 0x189F, 0x65F5, 0x65F5, 0x18A2, 0x65FA, 0x65FA, 0x05F6,
+    0x65FB, 0x65FB, 0x19A9, 0x65FC, 0x65FC, 0x19A5, 0x65FD, 0x65FD, 0x19AE,
+    0x65FF, 0x65FF, 0x464A, 0x6600, 0x6600, 0x05FD, 0x6602, 0x6602, 0x05FB,
+    0x6603, 0x6603, 0x19AA, 0x6604, 0x6604, 0x19A6, 0x6605, 0x6605, 0x19AD,
+    0x6606, 0x6606, 0x05FA, 0x6607, 0x6607, 0x0601, 0x6608, 0x6608, 0x19A8,
+    0x6609, 0x6609, 0x19A4, 0x660A, 0x660A, 0x0600, 0x660B, 0x660B, 0x19AB,
+    0x660C, 0x660C, 0x05F9, 0x660D, 0x660D, 0x19AC, 0x660E, 0x660E, 0x05FC,
+    0x660F, 0x660F, 0x05FE, 0x6610, 0x6610, 0x19B0, 0x6611, 0x6611, 0x19AF,
+    0x6612, 0x6612, 0x19A7, 0x6613, 0x6613, 0x05F8, 0x6614, 0x6614, 0x05F7,
+    0x6615, 0x6615, 0x05FF, 0x6618, 0x6618, 0x41B1, 0x661C, 0x661C, 0x1B09,
+    0x661D, 0x661D, 0x1B0F, 0x661E, 0x661E, 0x3A93, 0x661F, 0x661F, 0x074B,
+    0x6620, 0x6620, 0x0748, 0x6621, 0x6621, 0x1B06, 0x6622, 0x6622, 0x1B0B,
+    0x6623, 0x6623, 0x4295, 0x6624, 0x6624, 0x074E, 0x6625, 0x6625, 0x0746,
+    0x6626, 0x6626, 0x1B0A, 0x6627, 0x6627, 0x0749, 0x6628, 0x6628, 0x074C,
+    0x662B, 0x662B, 0x1B0D, 0x662D, 0x662D, 0x0747, 0x662E, 0x662E, 0x1B12,
+    0x662F, 0x662F, 0x074A, 0x6630, 0x6630, 0x3A8D, 0x6631, 0x6631, 0x074D,
+    0x6632, 0x6632, 0x1B07, 0x6633, 0x6633, 0x1B0C, 0x6634, 0x6634, 0x1B10,
+    0x6635, 0x6635, 0x1B08, 0x6636, 0x6636, 0x1B05, 0x6639, 0x6639, 0x1B11,
+    0x663A, 0x663A, 0x1B0E, 0x6641, 0x6641, 0x08E2, 0x6642, 0x6642, 0x08DB,
+    0x6643, 0x6643, 0x08DE, 0x6644, 0x6644, 0x41B4, 0x6645, 0x6645, 0x08E1,
+    0x6647, 0x6647, 0x1CC6, 0x6648, 0x6648, 0x3D99, 0x6649, 0x6649, 0x08DC,
+    0x664A, 0x664A, 0x1CC4, 0x664B, 0x664B, 0x41B7, 0x664C, 0x664C, 0x08E0,
+    0x664F, 0x664F, 0x08DD, 0x6651, 0x6651, 0x1CC7, 0x6652, 0x6652, 0x08DF,
+    0x6653, 0x6653, 0x464B, 0x6657, 0x6657, 0x409B, 0x6659, 0x6659, 0x1F11,
+    0x665A, 0x665A, 0x0AC9, 0x665B, 0x665B, 0x1F10, 0x665C, 0x665C, 0x1F12,
+    0x665D, 0x665D, 0x0AC8, 0x665E, 0x665E, 0x0ACD, 0x665F, 0x665F, 0x1CC5,
+    0x6661, 0x6661, 0x1F0F, 0x6662, 0x6662, 0x1F13, 0x6663, 0x6663, 0x3A90,
+    0x6664, 0x6664, 0x0ACA, 0x6665, 0x6665, 0x1F0E, 0x6666, 0x6666, 0x0ACC,
+    0x6667, 0x6667, 0x41B9, 0x6668, 0x6668, 0x0ACB, 0x666A, 0x666A, 0x217F,
+    0x666B, 0x666B, 0x3A8B, 0x666C, 0x666C, 0x217A, 0x666E, 0x666E, 0x0C77,
+    0x666F, 0x666F, 0x0C7B, 0x6670, 0x6670, 0x0C78, 0x6671, 0x6671, 0x217D,
+    0x6672, 0x6672, 0x2180, 0x6673, 0x6673, 0x41BB, 0x6674, 0x6674, 0x0C79,
+    0x6676, 0x6676, 0x0C7A, 0x6677, 0x6677, 0x0C7F, 0x6678, 0x6678, 0x2414,
+    0x6679, 0x6679, 0x217E, 0x667A, 0x667A, 0x0C7D, 0x667B, 0x667B, 0x217B,
+    0x667C, 0x667C, 0x2179, 0x667D, 0x667D, 0x469B, 0x667E, 0x667E, 0x0C7E,
+    0x6680, 0x6680, 0x217C, 0x6684, 0x6684, 0x0E33, 0x6685, 0x6685, 0x4162,
+    0x6686, 0x6686, 0x240C, 0x6687, 0x6688, 0x0E30, 0x6689, 0x6689, 0x0E2F,
+    0x668A, 0x668A, 0x2411, 0x668B, 0x668B, 0x2410, 0x668C, 0x668C, 0x240D,
+    0x668D, 0x668D, 0x0E35, 0x668E, 0x668E, 0x3A89, 0x6690, 0x6690, 0x240F,
+    0x6691, 0x6691, 0x0C7C, 0x6692, 0x6692, 0x464D, 0x6694, 0x6694, 0x2413,
+    0x6695, 0x6695, 0x240E, 0x6696, 0x6696, 0x0E32, 0x6697, 0x6697, 0x0E2E,
+    0x6698, 0x6698, 0x0E34, 0x6699, 0x6699, 0x2412, 0x669A, 0x669A, 0x3D3D,
+    0x669D, 0x669D, 0x0FED, 0x669F, 0x669F, 0x26B8, 0x66A0, 0x66A0, 0x26B7,
+    0x66A1, 0x66A1, 0x26B6, 0x66A2, 0x66A2, 0x0FEB, 0x66A4, 0x66A4, 0x40BA,
+    0x66A8, 0x66A8, 0x0FEC, 0x66A9, 0x66A9, 0x28F9, 0x66AA, 0x66AA, 0x28FC,
+    0x66AB, 0x66AB, 0x1172, 0x66AD, 0x66AD, 0x4948, 0x66AE, 0x66AE, 0x1171,
+    0x66AF, 0x66AF, 0x28FD, 0x66B0, 0x66B0, 0x28F8, 0x66B1, 0x66B1, 0x1174,
+    0x66B2, 0x66B2, 0x28FA, 0x66B3, 0x66B3, 0x40B5, 0x66B4, 0x66B4, 0x1173,
+    0x66B5, 0x66B5, 0x28F7, 0x66B6, 0x66B6, 0x3E13, 0x66B7, 0x66B7, 0x28FB,
+    0x66B8, 0x66B8, 0x12CC, 0x66B9, 0x66B9, 0x12C9, 0x66BA, 0x66BA, 0x2B65,
+    0x66BB, 0x66BB, 0x2B64, 0x66BD, 0x66BD, 0x2B63, 0x66BE, 0x66BE, 0x2B5E,
+    0x66BF, 0x66BF, 0x3D9A, 0x66C0, 0x66C0, 0x2B5F, 0x66C4, 0x66C4, 0x12CA,
+    0x66C6, 0x66C6, 0x12C7, 0x66C7, 0x66C7, 0x12CB, 0x66C8, 0x66C8, 0x2B5D,
+    0x66C9, 0x66C9, 0x12C8, 0x66CA, 0x66CB, 0x2B60, 0x66CC, 0x66CC, 0x2B66,
+    0x66CD, 0x66CD, 0x40B8, 0x66CE, 0x66CE, 0x3A77, 0x66CF, 0x66CF, 0x2B62,
+    0x66D2, 0x66D2, 0x2D72, 0x66D6, 0x66D6, 0x13E4, 0x66D8, 0x66D8, 0x2F33,
+    0x66D9, 0x66D9, 0x13E3, 0x66DA, 0x66DB, 0x2F31, 0x66DC, 0x66DC, 0x14DA,
+    0x66DD, 0x66DD, 0x1585, 0x66DE, 0x66DE, 0x3099, 0x66E0, 0x66E0, 0x1584,
+    0x66E3, 0x66E4, 0x31DA, 0x66E6, 0x66E6, 0x1619, 0x66E8, 0x66E8, 0x31D9,
+    0x66E9, 0x66E9, 0x1675, 0x66EB, 0x66EB, 0x341D, 0x66EC, 0x66EC, 0x16FC,
+    0x66ED, 0x66EE, 0x3485, 0x66F0, 0x66F0, 0x02DB, 0x66F1, 0x66F1, 0x3E84,
+    0x66F2, 0x66F3, 0x03DC, 0x66F4, 0x66F4, 0x04BB, 0x66F6, 0x66F6, 0x19B1,
+    0x66F7, 0x66F7, 0x074F, 0x66F8, 0x66F8, 0x08E3, 0x66F9, 0x66F9, 0x0ACE,
+    0x66FC, 0x66FC, 0x0A1F, 0x66FE, 0x66FF, 0x0C80, 0x6700, 0x6700, 0x0BF0,
+    0x6701, 0x6701, 0x2181, 0x6702, 0x6702, 0x41C4, 0x6703, 0x6703, 0x0E36,
+    0x6704, 0x6704, 0x26BA, 0x6705, 0x6705, 0x26B9, 0x6708, 0x6708, 0x02DC,
+    0x6709, 0x6709, 0x03DE, 0x670A, 0x670A, 0x19B2, 0x670B, 0x670B, 0x0603,
+    0x670C, 0x670C, 0x3FE2, 0x670D, 0x670D, 0x0602, 0x670E, 0x670E, 0x3DA1,
+    0x670F, 0x6710, 0x1B13, 0x6712, 0x6713, 0x1CC8, 0x6714, 0x6715, 0x08E4,
+    0x6716, 0x6716, 0x464F, 0x6717, 0x6717, 0x08E6, 0x6718, 0x6718, 0x1F14,
+    0x671B, 0x671B, 0x0AD0, 0x671D, 0x671D, 0x0C83, 0x671E, 0x671E, 0x3D8B,
+    0x671F, 0x671F, 0x0C82, 0x6720, 0x6720, 0x2415, 0x6721, 0x6721, 0x2522,
+    0x6722, 0x6722, 0x26BB, 0x6723, 0x6723, 0x2B67, 0x6725, 0x6725, 0x379F,
+    0x6726, 0x6726, 0x14DB, 0x6727, 0x6727, 0x161A, 0x6728, 0x6728, 0x02DD,
+    0x672A, 0x672B, 0x034A, 0x672C, 0x672C, 0x0349, 0x672D, 0x672D, 0x034C,
+    0x672E, 0x672E, 0x0348, 0x6731, 0x6731, 0x03E1, 0x6733, 0x6733, 0x1800,
+    0x6734, 0x6734, 0x03E0, 0x6735, 0x6735, 0x03E2, 0x6736, 0x6736, 0x3E41,
+    0x6738, 0x6738, 0x17FB, 0x6739, 0x6739, 0x17FA, 0x673A, 0x673A, 0x17FD,
+    0x673B, 0x673B, 0x17FC, 0x673C, 0x673C, 0x17FF, 0x673D, 0x673D, 0x03DF,
+    0x673E, 0x673E, 0x17F9, 0x673F, 0x673F, 0x17FE, 0x6744, 0x6744, 0x401B,
+    0x6745, 0x6745, 0x18A3, 0x6746, 0x6746, 0x04C5, 0x6747, 0x6747, 0x18A4,
+    0x6748, 0x6748, 0x18A8, 0x6749, 0x6749, 0x04C4, 0x674B, 0x674B, 0x18AC,
+    0x674C, 0x674C, 0x18A7, 0x674D, 0x674D, 0x18AA, 0x674E, 0x6751, 0x04BD,
+    0x6753, 0x6753, 0x04C7, 0x6755, 0x6755, 0x18A6, 0x6756, 0x6756, 0x04C2,
+    0x6757, 0x6757, 0x04C8, 0x6759, 0x6759, 0x18A5, 0x675A, 0x675A, 0x18AB,
+    0x675C, 0x675C, 0x04C1, 0x675D, 0x675D, 0x18A9, 0x675E, 0x675E, 0x04C3,
+    0x675F, 0x675F, 0x04BC, 0x6760, 0x6760, 0x04C6, 0x6761, 0x6761, 0x3D66,
+    0x6762, 0x6762, 0x41CB, 0x6767, 0x6767, 0x41CA, 0x676A, 0x676A, 0x0618,
+    0x676C, 0x676C, 0x19B4, 0x676D, 0x676D, 0x0604, 0x676F, 0x6770, 0x060E,
+    0x6771, 0x6771, 0x0607, 0x6772, 0x6772, 0x0619, 0x6773, 0x6773, 0x0609,
+    0x6774, 0x6774, 0x19BC, 0x6775, 0x6775, 0x0614, 0x6776, 0x6776, 0x19B7,
+    0x6777, 0x6777, 0x060A, 0x6778, 0x6779, 0x19C6, 0x677A, 0x677A, 0x19BF,
+    0x677B, 0x677B, 0x19B8, 0x677C, 0x677C, 0x0617, 0x677D, 0x677D, 0x19C4,
+    0x677E, 0x677E, 0x0612, 0x677F, 0x677F, 0x0610, 0x6781, 0x6781, 0x19C5,
+    0x6783, 0x6783, 0x19C3, 0x6784, 0x6784, 0x19BB, 0x6785, 0x6785, 0x19B3,
+    0x6786, 0x6786, 0x19BA, 0x6787, 0x6787, 0x060B, 0x6789, 0x6789, 0x0611,
+    0x678B, 0x678B, 0x0605, 0x678C, 0x678C, 0x19BE, 0x678D, 0x678D, 0x19BD,
+    0x678E, 0x678E, 0x19B5, 0x678F, 0x678F, 0x46C1, 0x6790, 0x6790, 0x0613,
+    0x6791, 0x6791, 0x19C1, 0x6792, 0x6792, 0x19B6, 0x6793, 0x6793, 0x0616,
+    0x6794, 0x6794, 0x19C8, 0x6795, 0x6795, 0x0606, 0x6797, 0x6797, 0x060D,
+    0x6798, 0x6798, 0x19B9, 0x6799, 0x6799, 0x19C2, 0x679A, 0x679A, 0x0615,
+    0x679C, 0x679C, 0x0608, 0x679D, 0x679D, 0x060C, 0x679F, 0x679F, 0x19C0,
+    0x67A0, 0x67A0, 0x3D7A, 0x67A4, 0x67A4, 0x4651, 0x67AC, 0x67AC, 0x41E3,
+    0x67AE, 0x67AE, 0x1B34, 0x67AF, 0x67AF, 0x0757, 0x67B0, 0x67B0, 0x0764,
+    0x67B1, 0x67B1, 0x41F4, 0x67B2, 0x67B2, 0x1B2F, 0x67B3, 0x67B3, 0x1B25,
+    0x67B4, 0x67B4, 0x075D, 0x67B5, 0x67B5, 0x1B23, 0x67B6, 0x67B6, 0x0756,
+    0x67B7, 0x67B7, 0x1B1E, 0x67B8, 0x67B8, 0x0760, 0x67B9, 0x67B9, 0x1B2B,
+    0x67BA, 0x67BA, 0x1B18, 0x67BB, 0x67BB, 0x1B1A, 0x67BF, 0x67BF, 0x37FA,
+    0x67C0, 0x67C0, 0x1B1D, 0x67C1, 0x67C1, 0x1B15, 0x67C2, 0x67C2, 0x1B2A,
+    0x67C3, 0x67C3, 0x1B3A, 0x67C4, 0x67C4, 0x075B, 0x67C5, 0x67C5, 0x1B1F,
+    0x67C6, 0x67C6, 0x1B31, 0x67C8, 0x67C8, 0x1B17, 0x67C9, 0x67CA, 0x1B38,
+    0x67CB, 0x67CB, 0x1B3C, 0x67CC, 0x67CC, 0x1B33, 0x67CD, 0x67CD, 0x1B24,
+    0x67CE, 0x67CE, 0x1B2C, 0x67CF, 0x67CF, 0x0761, 0x67D0, 0x67D0, 0x0754,
+    0x67D1, 0x67D1, 0x075C, 0x67D2, 0x67D2, 0x0768, 0x67D3, 0x67D3, 0x0751,
+    0x67D4, 0x67D4, 0x0753, 0x67D6, 0x67D6, 0x3B58, 0x67D7, 0x67D7, 0x41CE,
+    0x67D8, 0x67D8, 0x1B1C, 0x67D9, 0x67D9, 0x0765, 0x67DA, 0x67DA, 0x075E,
+    0x67DB, 0x67DB, 0x1B36, 0x67DC, 0x67DC, 0x1B19, 0x67DD, 0x67DD, 0x0767,
+    0x67DE, 0x67DE, 0x0762, 0x67DF, 0x67DF, 0x1B22, 0x67E2, 0x67E2, 0x0766,
+    0x67E3, 0x67E3, 0x1B29, 0x67E4, 0x67E4, 0x1B21, 0x67E5, 0x67E5, 0x075F,
+    0x67E6, 0x67E6, 0x1B35, 0x67E7, 0x67E7, 0x1B2D, 0x67E9, 0x67E9, 0x0759,
+    0x67EA, 0x67EA, 0x1B3B, 0x67EB, 0x67EB, 0x1B20, 0x67EC, 0x67EC, 0x0755,
+    0x67ED, 0x67ED, 0x1B32, 0x67EE, 0x67EE, 0x1B28, 0x67EF, 0x67EF, 0x075A,
+    0x67F0, 0x67F0, 0x1B2E, 0x67F1, 0x67F1, 0x0752, 0x67F2, 0x67F2, 0x1B16,
+    0x67F3, 0x67F3, 0x0763, 0x67F4, 0x67F4, 0x08F5, 0x67F5, 0x67F5, 0x0758,
+    0x67F6, 0x67F6, 0x1B27, 0x67F7, 0x67F7, 0x1B26, 0x67F8, 0x67F8, 0x1B1B,
+    0x67F9, 0x67F9, 0x3996, 0x67FA, 0x67FA, 0x1B37, 0x67FC, 0x67FC, 0x1B30,
+    0x67FE, 0x67FE, 0x4555, 0x67FF, 0x67FF, 0x0750, 0x6800, 0x6800, 0x43C7,
+    0x6801, 0x6801, 0x41D3, 0x6802, 0x6802, 0x3FC8, 0x6803, 0x6803, 0x3D6A,
+    0x6804, 0x6804, 0x4556, 0x680D, 0x680D, 0x4281, 0x6810, 0x6810, 0x399C,
+    0x6812, 0x6812, 0x1CDD, 0x6813, 0x6813, 0x08FC, 0x6814, 0x6814, 0x1CDE,
+    0x6816, 0x6816, 0x1CD2, 0x6817, 0x6817, 0x08F1, 0x6818, 0x6818, 0x08FD,
+    0x681A, 0x681A, 0x1CCB, 0x681B, 0x681B, 0x4072, 0x681C, 0x681C, 0x1CD4,
+    0x681D, 0x681D, 0x1CDC, 0x681E, 0x681E, 0x46C2, 0x681F, 0x681F, 0x1CCA,
+    0x6820, 0x6820, 0x1CE5, 0x6821, 0x6821, 0x08E7, 0x6822, 0x6822, 0x41D0,
+    0x6825, 0x6825, 0x1CE4, 0x6826, 0x6826, 0x1CDF, 0x6828, 0x6828, 0x1CE0,
+    0x6829, 0x6829, 0x08EF, 0x682A, 0x682A, 0x08FA, 0x682B, 0x682B, 0x1CD6,
+    0x682D, 0x682D, 0x1CD7, 0x682E, 0x682E, 0x1CE1, 0x682F, 0x682F, 0x1CD8,
+    0x6831, 0x6831, 0x1CD3, 0x6832, 0x6833, 0x1CCD, 0x6834, 0x6834, 0x1CDB,
+    0x6835, 0x6835, 0x1CD5, 0x6836, 0x6836, 0x3E2E, 0x6837, 0x6837, 0x421D,
+    0x6838, 0x6838, 0x08E8, 0x6839, 0x6839, 0x08EC, 0x683A, 0x683A, 0x1CE3,
+    0x683B, 0x683B, 0x1CCF, 0x683C, 0x683C, 0x08F8, 0x683D, 0x683D, 0x08F4,
+    0x683E, 0x683E, 0x4147, 0x6840, 0x6840, 0x08F7, 0x6841, 0x6841, 0x08FE,
+    0x6842, 0x6842, 0x08ED, 0x6843, 0x6843, 0x08F9, 0x6844, 0x6844, 0x1CDA,
+    0x6845, 0x6845, 0x08FB, 0x6846, 0x6846, 0x08EA, 0x6847, 0x6847, 0x3BEB,
+    0x6848, 0x6848, 0x08E9, 0x6849, 0x6849, 0x1CCC, 0x684A, 0x684A, 0x4653,
+    0x684B, 0x684B, 0x1CD0, 0x684C, 0x684C, 0x08F2, 0x684D, 0x684D, 0x1CE2,
+    0x684E, 0x684E, 0x1CD9, 0x684F, 0x684F, 0x1CD1, 0x6850, 0x6850, 0x08F6,
+    0x6851, 0x6851, 0x08F3, 0x6853, 0x6853, 0x08EB, 0x6854, 0x6854, 0x08EE,
+    0x6855, 0x6855, 0x3D90, 0x6856, 0x6856, 0x3814, 0x685D, 0x685D, 0x41D6,
+    0x6865, 0x6865, 0x4557, 0x686B, 0x686B, 0x1F29, 0x686D, 0x686E, 0x1F19,
+    0x686F, 0x686F, 0x1F1E, 0x6871, 0x6871, 0x1F2D, 0x6872, 0x6872, 0x1F2A,
+    0x6874, 0x6874, 0x1F23, 0x6875, 0x6875, 0x1F22, 0x6876, 0x6876, 0x0AD7,
+    0x6877, 0x6877, 0x1F26, 0x6878, 0x6878, 0x1F35, 0x6879, 0x6879, 0x1F15,
+    0x687B, 0x687B, 0x1F36, 0x687C, 0x687C, 0x1F28, 0x687D, 0x687D, 0x1F3A,
+    0x687E, 0x687E, 0x1F2E, 0x687F, 0x687F, 0x0AD6, 0x6880, 0x6880, 0x1F2C,
+    0x6881, 0x6881, 0x0AD1, 0x6882, 0x6882, 0x0AE6, 0x6883, 0x6883, 0x0ADC,
+    0x6884, 0x6884, 0x4654, 0x6885, 0x6885, 0x0AE0, 0x6886, 0x6886, 0x0ADF,
+    0x6887, 0x6887, 0x1F16, 0x6888, 0x6888, 0x46B7, 0x6889, 0x6889, 0x1F33,
+    0x688A, 0x688A, 0x1F39, 0x688B, 0x688B, 0x1F31, 0x688C, 0x688C, 0x1F38,
+    0x688F, 0x688F, 0x1F25, 0x6890, 0x6890, 0x1F17, 0x6891, 0x6891, 0x1F37,
+    0x6892, 0x6892, 0x1F27, 0x6893, 0x6893, 0x0AD4, 0x6894, 0x6894, 0x0AE1,
+    0x6896, 0x6896, 0x1F30, 0x6897, 0x6897, 0x0ADA, 0x6898, 0x6898, 0x3AAA,
+    0x689B, 0x689B, 0x1F2F, 0x689C, 0x689C, 0x1F18, 0x689D, 0x689D, 0x0AE2,
+    0x689F, 0x689F, 0x0AE4, 0x68A0, 0x68A0, 0x1F32, 0x68A1, 0x68A1, 0x0AE5,
+    0x68A2, 0x68A2, 0x0AD3, 0x68A3, 0x68A3, 0x1F1F, 0x68A4, 0x68A4, 0x1F34,
+    0x68A6, 0x68A6, 0x40E4, 0x68A7, 0x68A7, 0x0AD9, 0x68A8, 0x68A8, 0x0AE3,
+    0x68A9, 0x68A9, 0x1F21, 0x68AA, 0x68AA, 0x1F2B, 0x68AB, 0x68AB, 0x1F1C,
+    0x68AC, 0x68AC, 0x1F20, 0x68AD, 0x68AD, 0x0ADE, 0x68AE, 0x68AE, 0x1F1B,
+    0x68AF, 0x68AF, 0x0AD2, 0x68B0, 0x68B0, 0x0ADB, 0x68B1, 0x68B1, 0x0AD8,
+    0x68B2, 0x68B2, 0x1F24, 0x68B3, 0x68B3, 0x08F0, 0x68B4, 0x68B4, 0x2198,
+    0x68B5, 0x68B5, 0x0AD5, 0x68B6, 0x68B6, 0x3A9E, 0x68B9, 0x68B9, 0x3D14,
+    0x68BD, 0x68BD, 0x427C, 0x68C3, 0x68C3, 0x41DC, 0x68C4, 0x68C4, 0x0ADD,
+    0x68C5, 0x68C5, 0x3C2E, 0x68C6, 0x68C6, 0x219B, 0x68C7, 0x68C7, 0x21B1,
+    0x68C8, 0x68C8, 0x21A6, 0x68C9, 0x68C9, 0x0C97, 0x68CA, 0x68CA, 0x42EB,
+    0x68CB, 0x68CB, 0x0C92, 0x68CC, 0x68CC, 0x2195, 0x68CD, 0x68CD, 0x0C93,
+    0x68CE, 0x68CE, 0x21A5, 0x68D0, 0x68D0, 0x219E, 0x68D1, 0x68D1, 0x21AB,
+    0x68D2, 0x68D2, 0x0C8F, 0x68D3, 0x68D3, 0x2183, 0x68D4, 0x68D4, 0x21AD,
+    0x68D5, 0x68D5, 0x0C85, 0x68D6, 0x68D6, 0x218B, 0x68D7, 0x68D7, 0x0C88,
+    0x68D8, 0x68D8, 0x0C87, 0x68DA, 0x68DA, 0x0C98, 0x68DC, 0x68DC, 0x2185,
+    0x68DD, 0x68DE, 0x21A7, 0x68DF, 0x68DF, 0x0C8A, 0x68E0, 0x68E0, 0x0C86,
+    0x68E1, 0x68E1, 0x2193, 0x68E3, 0x68E3, 0x0C91, 0x68E4, 0x68E4, 0x218E,
+    0x68E6, 0x68E6, 0x21A9, 0x68E7, 0x68E7, 0x0C8D, 0x68E8, 0x68E8, 0x21A1,
+    0x68E9, 0x68E9, 0x21AE, 0x68EA, 0x68EA, 0x2188, 0x68EB, 0x68EB, 0x218D,
+    0x68EC, 0x68EC, 0x2187, 0x68EE, 0x68EE, 0x0C8C, 0x68EF, 0x68EF, 0x219A,
+    0x68F0, 0x68F0, 0x242B, 0x68F1, 0x68F1, 0x2189, 0x68F2, 0x68F2, 0x0C90,
+    0x68F3, 0x68F3, 0x2192, 0x68F4, 0x68F4, 0x21AA, 0x68F5, 0x68F5, 0x0C8B,
+    0x68F6, 0x68F6, 0x218F, 0x68F7, 0x68F7, 0x218C, 0x68F8, 0x68F8, 0x219D,
+    0x68F9, 0x68F9, 0x0C8E, 0x68FA, 0x68FA, 0x0C84, 0x68FB, 0x68FB, 0x0C9A,
+    0x68FC, 0x68FC, 0x21A0, 0x68FD, 0x68FD, 0x219F, 0x6900, 0x6900, 0x41DF,
+    0x6901, 0x6901, 0x41DE, 0x6902, 0x6902, 0x42FB, 0x6903, 0x6903, 0x429C,
+    0x6904, 0x6904, 0x2184, 0x6905, 0x6905, 0x0C89, 0x6906, 0x6906, 0x21AC,
+    0x6907, 0x6907, 0x2194, 0x6908, 0x6908, 0x2196, 0x6909, 0x6909, 0x4658,
+    0x690A, 0x690A, 0x21A3, 0x690B, 0x690B, 0x21A2, 0x690C, 0x690C, 0x2182,
+    0x690D, 0x690D, 0x0C94, 0x690E, 0x690E, 0x0C96, 0x690F, 0x690F, 0x218A,
+    0x6910, 0x6910, 0x2191, 0x6911, 0x6911, 0x2199, 0x6912, 0x6912, 0x0C95,
+    0x6913, 0x6913, 0x2190, 0x6914, 0x6914, 0x219C, 0x6915, 0x6915, 0x21AF,
+    0x6917, 0x6917, 0x21A4, 0x6918, 0x6918, 0x3DA2, 0x691A, 0x691A, 0x3D80,
+    0x691B, 0x691B, 0x37BD, 0x6925, 0x6925, 0x21B0, 0x692A, 0x692A, 0x2186,
+    0x692C, 0x692C, 0x3F38, 0x692F, 0x692F, 0x243F, 0x6930, 0x6930, 0x0E3E,
+    0x6932, 0x6932, 0x243D, 0x6933, 0x6933, 0x2428, 0x6934, 0x6934, 0x242D,
+    0x6935, 0x6935, 0x2426, 0x6936, 0x6936, 0x41E7, 0x6937, 0x6937, 0x2439,
+    0x6938, 0x6938, 0x2418, 0x6939, 0x6939, 0x241F, 0x693B, 0x693B, 0x2437,
+    0x693C, 0x693C, 0x2441, 0x693D, 0x693D, 0x2429, 0x693E, 0x693E, 0x4056,
+    0x693F, 0x693F, 0x241C, 0x6940, 0x6940, 0x242F, 0x6941, 0x6941, 0x2434,
+    0x6942, 0x6942, 0x2420, 0x6943, 0x6943, 0x4659, 0x6944, 0x6944, 0x2431,
+    0x6945, 0x6945, 0x241D, 0x6946, 0x6946, 0x456F, 0x6948, 0x6949, 0x2424,
+    0x694A, 0x694A, 0x0E40, 0x694B, 0x694B, 0x2438, 0x694C, 0x694C, 0x2436,
+    0x694E, 0x694E, 0x2419, 0x694F, 0x694F, 0x243B, 0x6951, 0x6951, 0x243C,
+    0x6952, 0x6952, 0x243E, 0x6953, 0x6953, 0x0E44, 0x6954, 0x6954, 0x0E3C,
+    0x6955, 0x6955, 0x3D86, 0x6956, 0x6956, 0x1F1D, 0x6957, 0x6957, 0x2421,
+    0x6958, 0x6958, 0x2433, 0x6959, 0x6959, 0x2422, 0x695A, 0x695A, 0x0E39,
+    0x695B, 0x695B, 0x0E49, 0x695C, 0x695C, 0x243A, 0x695D, 0x695D, 0x0E47,
+    0x695E, 0x695E, 0x0E43, 0x695F, 0x695F, 0x2417, 0x6960, 0x6960, 0x0E3B,
+    0x6961, 0x6961, 0x41E4, 0x6962, 0x6962, 0x241A, 0x6963, 0x6963, 0x0E48,
+    0x6964, 0x6964, 0x465B, 0x6965, 0x6965, 0x242A, 0x6966, 0x6966, 0x2416,
+    0x6967, 0x6967, 0x3D15, 0x6968, 0x6968, 0x0E41, 0x6969, 0x6969, 0x242E,
+    0x696A, 0x696A, 0x241E, 0x696B, 0x696B, 0x0E42, 0x696C, 0x696C, 0x2427,
+    0x696D, 0x696D, 0x0E38, 0x696E, 0x696E, 0x0C99, 0x696F, 0x696F, 0x2430,
+    0x6970, 0x6970, 0x2197, 0x6971, 0x6971, 0x241B, 0x6972, 0x6972, 0x3A6D,
+    0x6973, 0x6973, 0x41DB, 0x6974, 0x6974, 0x2435, 0x6975, 0x6975, 0x0E3D,
+    0x6976, 0x6976, 0x2432, 0x6977, 0x6977, 0x0E3A, 0x6978, 0x6978, 0x242C,
+    0x6979, 0x6979, 0x0E45, 0x697A, 0x697A, 0x2423, 0x697B, 0x697B, 0x2440,
+    0x6980, 0x6980, 0x3F3E, 0x6982, 0x6982, 0x0E3F, 0x6983, 0x6983, 0x24AF,
+    0x6985, 0x6985, 0x465D, 0x6986, 0x6986, 0x0E46, 0x698A, 0x698A, 0x3D74,
+    0x698D, 0x698D, 0x26C9, 0x698E, 0x698E, 0x26C7, 0x6990, 0x6990, 0x26DD,
+    0x6991, 0x6991, 0x26C5, 0x6993, 0x6993, 0x26D7, 0x6994, 0x6994, 0x0E37,
+    0x6995, 0x6995, 0x0FF0, 0x6996, 0x6996, 0x26C1, 0x6997, 0x6997, 0x26DC,
+    0x6998, 0x6998, 0x41E8, 0x6999, 0x6999, 0x26C6, 0x699A, 0x699A, 0x26D4,
+    0x699B, 0x699B, 0x0FF5, 0x699C, 0x699C, 0x0FEE, 0x699E, 0x699E, 0x26DA,
+    0x699F, 0x699F, 0x465C, 0x69A0, 0x69A0, 0x26BF, 0x69A1, 0x69A1, 0x26D9,
+    0x69A2, 0x69A2, 0x3730, 0x69A3, 0x69A3, 0x1000, 0x69A4, 0x69A4, 0x26D0,
+    0x69A5, 0x69A5, 0x26E0, 0x69A6, 0x69A6, 0x0FFE, 0x69A7, 0x69A7, 0x26C8,
+    0x69A8, 0x69A8, 0x0FEF, 0x69A9, 0x69A9, 0x26CA, 0x69AA, 0x69AA, 0x26D8,
+    0x69AB, 0x69AB, 0x0FF8, 0x69AC, 0x69AC, 0x26C3, 0x69AD, 0x69AD, 0x0FFC,
+    0x69AE, 0x69AE, 0x0FF2, 0x69AF, 0x69AF, 0x26CC, 0x69B0, 0x69B0, 0x26C2,
+    0x69B1, 0x69B1, 0x26BC, 0x69B2, 0x69B2, 0x3FF6, 0x69B3, 0x69B3, 0x26D6,
+    0x69B4, 0x69B4, 0x0FF9, 0x69B5, 0x69B5, 0x26DF, 0x69B6, 0x69B6, 0x26BD,
+    0x69B7, 0x69B7, 0x0FF6, 0x69B9, 0x69B9, 0x26D2, 0x69BB, 0x69BB, 0x0FF7,
+    0x69BC, 0x69BC, 0x26C4, 0x69BD, 0x69BD, 0x26CF, 0x69BE, 0x69BE, 0x26CB,
+    0x69BF, 0x69BF, 0x26CD, 0x69C0, 0x69C0, 0x3F5D, 0x69C1, 0x69C1, 0x0FF1,
+    0x69C2, 0x69C2, 0x26DE, 0x69C3, 0x69C3, 0x0FFF, 0x69C4, 0x69C4, 0x26CE,
+    0x69C6, 0x69C6, 0x26E1, 0x69C9, 0x69C9, 0x26BE, 0x69CA, 0x69CA, 0x26D3,
+    0x69CB, 0x69CB, 0x0FF4, 0x69CC, 0x69CC, 0x0FFD, 0x69CD, 0x69CD, 0x0FFB,
+    0x69CE, 0x69CE, 0x26C0, 0x69CF, 0x69CF, 0x26D5, 0x69D0, 0x69D0, 0x0FFA,
+    0x69D1, 0x69D1, 0x39EF, 0x69D3, 0x69D3, 0x0FF3, 0x69D4, 0x69D4, 0x26D1,
+    0x69D5, 0x69D5, 0x3E3C, 0x69D6, 0x69D6, 0x465E, 0x69D9, 0x69D9, 0x26DB,
+    0x69E1, 0x69E1, 0x41D8, 0x69E2, 0x69E2, 0x2909, 0x69E4, 0x69E4, 0x2905,
+    0x69E5, 0x69E5, 0x2901, 0x69E6, 0x69E6, 0x2915, 0x69E7, 0x69E7, 0x2912,
+    0x69E8, 0x69E8, 0x1177, 0x69E9, 0x69E9, 0x3D91, 0x69EB, 0x69EB, 0x2919,
+    0x69EC, 0x69EC, 0x2908, 0x69ED, 0x69ED, 0x1182, 0x69EE, 0x69EE, 0x290F,
+    0x69F1, 0x69F1, 0x2904, 0x69F2, 0x69F2, 0x290E, 0x69F3, 0x69F3, 0x117F,
+    0x69F4, 0x69F4, 0x2922, 0x69F6, 0x69F6, 0x291F, 0x69F7, 0x69F7, 0x2911,
+    0x69F8, 0x69F8, 0x2902, 0x69F9, 0x69F9, 0x41ED, 0x69FA, 0x69FA, 0x41C7,
+    0x69FB, 0x69FB, 0x2916, 0x69FC, 0x69FC, 0x2918, 0x69FD, 0x69FD, 0x117B,
+    0x69FE, 0x69FE, 0x290C, 0x69FF, 0x69FF, 0x2907, 0x6A00, 0x6A00, 0x28FE,
+    0x6A01, 0x6A01, 0x1178, 0x6A02, 0x6A02, 0x1180, 0x6A03, 0x6A03, 0x3E29,
+    0x6A04, 0x6A04, 0x291B, 0x6A05, 0x6A05, 0x1181, 0x6A06, 0x6A06, 0x28FF,
+    0x6A07, 0x6A07, 0x2921, 0x6A08, 0x6A08, 0x2914, 0x6A09, 0x6A09, 0x291A,
+    0x6A0A, 0x6A0A, 0x117E, 0x6A0B, 0x6A0B, 0x41D9, 0x6A0C, 0x6A0C, 0x3D50,
+    0x6A0D, 0x6A0D, 0x2917, 0x6A0F, 0x6A0F, 0x291E, 0x6A11, 0x6A11, 0x1183,
+    0x6A13, 0x6A13, 0x117D, 0x6A14, 0x6A14, 0x2910, 0x6A15, 0x6A15, 0x2903,
+    0x6A16, 0x6A16, 0x2923, 0x6A17, 0x6A17, 0x2900, 0x6A18, 0x6A18, 0x291C,
+    0x6A19, 0x6A19, 0x117A, 0x6A1A, 0x6A1A, 0x3D1E, 0x6A1B, 0x6A1B, 0x290A,
+    0x6A1C, 0x6A1C, 0x3B68, 0x6A1D, 0x6A1D, 0x290B, 0x6A1E, 0x6A1E, 0x1179,
+    0x6A1F, 0x6A1F, 0x1176, 0x6A20, 0x6A20, 0x2906, 0x6A21, 0x6A21, 0x117C,
+    0x6A23, 0x6A23, 0x1175, 0x6A25, 0x6A25, 0x291D, 0x6A26, 0x6A26, 0x2920,
+    0x6A27, 0x6A27, 0x290D, 0x6A28, 0x6A28, 0x2B74, 0x6A2B, 0x6A2B, 0x3D42,
+    0x6A2C, 0x6A2C, 0x42AB, 0x6A2D, 0x6A2D, 0x3B1F, 0x6A32, 0x6A32, 0x2B6C,
+    0x6A33, 0x6A33, 0x3AA4, 0x6A34, 0x6A34, 0x2B68, 0x6A35, 0x6A35, 0x12D9,
+    0x6A38, 0x6A38, 0x12CE, 0x6A39, 0x6A39, 0x12D3, 0x6A3A, 0x6A3A, 0x12CF,
+    0x6A3B, 0x6A3B, 0x2B76, 0x6A3C, 0x6A3C, 0x2B81, 0x6A3D, 0x6A3D, 0x12CD,
+    0x6A3E, 0x6A3E, 0x2B6E, 0x6A3F, 0x6A3F, 0x2B77, 0x6A40, 0x6A40, 0x2913,
+    0x6A41, 0x6A41, 0x2B78, 0x6A44, 0x6A44, 0x12D4, 0x6A45, 0x6A45, 0x41F0,
+    0x6A46, 0x6A46, 0x2B87, 0x6A47, 0x6A47, 0x12D8, 0x6A48, 0x6A48, 0x12DB,
+    0x6A49, 0x6A49, 0x2B6A, 0x6A4B, 0x6A4B, 0x12D7, 0x6A4C, 0x6A4C, 0x3AAB,
+    0x6A4D, 0x6A4E, 0x2B85, 0x6A4F, 0x6A4F, 0x2B7C, 0x6A50, 0x6A50, 0x2B7B,
+    0x6A51, 0x6A51, 0x2B73, 0x6A52, 0x6A52, 0x3AA5, 0x6A53, 0x6A53, 0x37AC,
+    0x6A54, 0x6A54, 0x2B7D, 0x6A55, 0x6A55, 0x2B84, 0x6A56, 0x6A56, 0x2B83,
+    0x6A57, 0x6A57, 0x37DA, 0x6A58, 0x6A58, 0x12D2, 0x6A59, 0x6A59, 0x12D0,
+    0x6A5A, 0x6A5A, 0x2B75, 0x6A5B, 0x6A5B, 0x2B72, 0x6A5D, 0x6A5D, 0x2B6F,
+    0x6A5E, 0x6A5E, 0x2B82, 0x6A5F, 0x6A5F, 0x12DA, 0x6A60, 0x6A60, 0x2B80,
+    0x6A61, 0x6A61, 0x12D6, 0x6A62, 0x6A62, 0x12D5, 0x6A64, 0x6A64, 0x2B7A,
+    0x6A65, 0x6A65, 0x4660, 0x6A66, 0x6A66, 0x2B69, 0x6A67, 0x6A67, 0x2B6B,
+    0x6A68, 0x6A68, 0x2B6D, 0x6A69, 0x6A69, 0x2B7F, 0x6A6A, 0x6A6A, 0x2B79,
+    0x6A6B, 0x6A6B, 0x12D1, 0x6A6D, 0x6A6D, 0x2B70, 0x6A6F, 0x6A6F, 0x2B7E,
+    0x6A71, 0x6A71, 0x4662, 0x6A74, 0x6A74, 0x4661, 0x6A76, 0x6A76, 0x2B71,
+    0x6A7A, 0x6A7A, 0x3AAD, 0x6A7E, 0x6A7E, 0x13EC, 0x6A7F, 0x6A7F, 0x2D84,
+    0x6A80, 0x6A80, 0x13E5, 0x6A81, 0x6A81, 0x2D75, 0x6A82, 0x6A82, 0x4663,
+    0x6A83, 0x6A83, 0x2D80, 0x6A84, 0x6A84, 0x13E7, 0x6A85, 0x6A85, 0x2D87,
+    0x6A87, 0x6A87, 0x2D7C, 0x6A89, 0x6A89, 0x2D77, 0x6A8A, 0x6A8A, 0x4136,
+    0x6A8C, 0x6A8C, 0x2D88, 0x6A8D, 0x6A8D, 0x2D73, 0x6A8E, 0x6A8E, 0x2D7E,
+    0x6A8F, 0x6A8F, 0x3C1B, 0x6A90, 0x6A90, 0x13EE, 0x6A91, 0x6A91, 0x2D83,
+    0x6A92, 0x6A92, 0x2D89, 0x6A93, 0x6A93, 0x2D7D, 0x6A94, 0x6A94, 0x13E6,
+    0x6A95, 0x6A95, 0x2D7F, 0x6A96, 0x6A96, 0x2D74, 0x6A97, 0x6A97, 0x13ED,
+    0x6A99, 0x6A99, 0x4665, 0x6A9A, 0x6A9A, 0x2D86, 0x6A9B, 0x6A9B, 0x2D79,
+    0x6A9C, 0x6A9C, 0x13E9, 0x6A9D, 0x6A9D, 0x41F2, 0x6A9E, 0x6A9E, 0x2D7B,
+    0x6A9F, 0x6A9F, 0x2D78, 0x6AA0, 0x6AA0, 0x13EF, 0x6AA1, 0x6AA1, 0x2D7A,
+    0x6AA2, 0x6AA2, 0x13E8, 0x6AA3, 0x6AA3, 0x13EB, 0x6AA4, 0x6AA4, 0x2D82,
+    0x6AA5, 0x6AA5, 0x2D76, 0x6AA6, 0x6AA6, 0x2D85, 0x6AA7, 0x6AA7, 0x37E3,
+    0x6AA8, 0x6AA8, 0x2D81, 0x6AAB, 0x6AAB, 0x4667, 0x6AAC, 0x6AAC, 0x14DD,
+    0x6AAD, 0x6AAD, 0x2F3E, 0x6AAE, 0x6AAF, 0x14E2, 0x6AB1, 0x6AB1, 0x3E53,
+    0x6AB2, 0x6AB2, 0x3B4B, 0x6AB3, 0x6AB3, 0x14DC, 0x6AB4, 0x6AB4, 0x2F3D,
+    0x6AB5, 0x6AB5, 0x4668, 0x6AB6, 0x6AB7, 0x2F3A, 0x6AB8, 0x6AB8, 0x14E0,
+    0x6AB9, 0x6AB9, 0x2F35, 0x6ABA, 0x6ABA, 0x2F39, 0x6ABB, 0x6ABB, 0x14DF,
+    0x6ABD, 0x6ABD, 0x2F36, 0x6ABE, 0x6ABE, 0x3AA1, 0x6AC2, 0x6AC2, 0x14E1,
+    0x6AC3, 0x6AC3, 0x14DE, 0x6AC5, 0x6AC5, 0x2F34, 0x6AC6, 0x6AC6, 0x2F38,
+    0x6AC7, 0x6AC7, 0x2F3C, 0x6AC8, 0x6AC8, 0x41F5, 0x6AC9, 0x6AC9, 0x3AA6,
+    0x6ACA, 0x6ACA, 0x3F4C, 0x6ACB, 0x6ACB, 0x309F, 0x6ACC, 0x6ACC, 0x309C,
+    0x6ACD, 0x6ACD, 0x30A5, 0x6ACF, 0x6ACF, 0x30A4, 0x6AD0, 0x6AD0, 0x30A2,
+    0x6AD1, 0x6AD1, 0x309D, 0x6AD3, 0x6AD3, 0x1589, 0x6AD4, 0x6AD4, 0x4669,
+    0x6AD8, 0x6AD8, 0x3CAA, 0x6AD9, 0x6AD9, 0x309E, 0x6ADA, 0x6ADA, 0x1588,
+    0x6ADB, 0x6ADB, 0x13EA, 0x6ADC, 0x6ADC, 0x30A1, 0x6ADD, 0x6ADD, 0x1587,
+    0x6ADE, 0x6ADE, 0x30A6, 0x6ADF, 0x6ADF, 0x30A0, 0x6AE0, 0x6AE0, 0x309B,
+    0x6AE1, 0x6AE1, 0x2F37, 0x6AE5, 0x6AE5, 0x1586, 0x6AE7, 0x6AE7, 0x309A,
+    0x6AE8, 0x6AE8, 0x31DF, 0x6AEA, 0x6AEA, 0x31DE, 0x6AEB, 0x6AEB, 0x30A3,
+    0x6AEC, 0x6AEC, 0x161B, 0x6AEE, 0x6AEF, 0x31E2, 0x6AF0, 0x6AF0, 0x31DD,
+    0x6AF1, 0x6AF1, 0x31E1, 0x6AF3, 0x6AF3, 0x31DC, 0x6AF6, 0x6AF6, 0x466A,
+    0x6AF8, 0x6AF8, 0x32D6, 0x6AF9, 0x6AF9, 0x31E0, 0x6AFA, 0x6AFA, 0x1678,
+    0x6AFB, 0x6AFB, 0x1676, 0x6AFC, 0x6AFC, 0x32D4, 0x6B00, 0x6B00, 0x32D7,
+    0x6B02, 0x6B02, 0x32D3, 0x6B03, 0x6B03, 0x32D5, 0x6B04, 0x6B04, 0x1677,
+    0x6B05, 0x6B05, 0x3AA7, 0x6B08, 0x6B09, 0x3386, 0x6B0A, 0x6B0A, 0x16C6,
+    0x6B0B, 0x6B0B, 0x3385, 0x6B0F, 0x6B0F, 0x3420, 0x6B10, 0x6B10, 0x16FD,
+    0x6B11, 0x6B12, 0x341E, 0x6B13, 0x6B13, 0x3487, 0x6B16, 0x6B16, 0x1743,
+    0x6B17, 0x6B17, 0x34CE, 0x6B18, 0x6B19, 0x34CC, 0x6B1A, 0x6B1A, 0x34CF,
+    0x6B1D, 0x6B1D, 0x41F8, 0x6B1E, 0x6B1E, 0x3534, 0x6B20, 0x6B20, 0x02DE,
+    0x6B21, 0x6B21, 0x03E3, 0x6B23, 0x6B23, 0x061A, 0x6B25, 0x6B25, 0x19C9,
+    0x6B28, 0x6B28, 0x1B3D, 0x6B2C, 0x6B2C, 0x1CE6, 0x6B2D, 0x6B2D, 0x1CE8,
+    0x6B2F, 0x6B2F, 0x1CE7, 0x6B31, 0x6B31, 0x1CE9, 0x6B32, 0x6B32, 0x0AE7,
+    0x6B33, 0x6B33, 0x1F3C, 0x6B34, 0x6B34, 0x1CEA, 0x6B35, 0x6B35, 0x41FB,
+    0x6B36, 0x6B36, 0x1F3B, 0x6B37, 0x6B38, 0x1F3D, 0x6B39, 0x6B39, 0x21B2,
+    0x6B3A, 0x6B3A, 0x0C9C, 0x6B3B, 0x6B3B, 0x21B3, 0x6B3C, 0x6B3C, 0x21B5,
+    0x6B3D, 0x6B3D, 0x0C9D, 0x6B3E, 0x6B3E, 0x0C9B, 0x6B3F, 0x6B3F, 0x21B4,
+    0x6B41, 0x6B41, 0x2447, 0x6B42, 0x6B42, 0x2445, 0x6B43, 0x6B43, 0x2444,
+    0x6B45, 0x6B45, 0x2443, 0x6B46, 0x6B46, 0x2442, 0x6B47, 0x6B47, 0x0E4A,
+    0x6B48, 0x6B48, 0x2446, 0x6B49, 0x6B49, 0x1001, 0x6B4A, 0x6B4A, 0x26E2,
+    0x6B4B, 0x6B4B, 0x26E4, 0x6B4C, 0x6B4C, 0x1002, 0x6B4D, 0x6B4D, 0x26E3,
+    0x6B4E, 0x6B4E, 0x1185, 0x6B50, 0x6B50, 0x1184, 0x6B51, 0x6B51, 0x2924,
+    0x6B52, 0x6B52, 0x3F6E, 0x6B54, 0x6B54, 0x2B89, 0x6B55, 0x6B55, 0x2B88,
+    0x6B56, 0x6B56, 0x2B8A, 0x6B57, 0x6B57, 0x3AAE, 0x6B59, 0x6B59, 0x12DC,
+    0x6B5B, 0x6B5B, 0x2D8A, 0x6B5C, 0x6B5C, 0x13F0, 0x6B5E, 0x6B5E, 0x2F3F,
+    0x6B5F, 0x6B5F, 0x14E4, 0x6B60, 0x6B60, 0x30A7, 0x6B61, 0x6B61, 0x16C7,
+    0x6B62, 0x6B62, 0x02DF, 0x6B63, 0x6B63, 0x034D, 0x6B64, 0x6B64, 0x03E4,
+    0x6B65, 0x6B65, 0x04C9, 0x6B66, 0x6B67, 0x061B, 0x6B6A, 0x6B6A, 0x0769,
+    0x6B6D, 0x6B6D, 0x1CEB, 0x6B6F, 0x6B6F, 0x4515, 0x6B72, 0x6B72, 0x0E4B,
+    0x6B74, 0x6B74, 0x41FC, 0x6B76, 0x6B76, 0x29A2, 0x6B77, 0x6B77, 0x12DD,
+    0x6B78, 0x6B78, 0x14E5, 0x6B79, 0x6B79, 0x02E0, 0x6B7A, 0x6B7A, 0x44EE,
+    0x6B7B, 0x6B7B, 0x03E5, 0x6B7E, 0x6B7E, 0x19CB, 0x6B7F, 0x6B7F, 0x061D,
+    0x6B80, 0x6B80, 0x19CA, 0x6B81, 0x6B81, 0x466B, 0x6B82, 0x6B82, 0x1B3E,
+    0x6B83, 0x6B83, 0x076A, 0x6B84, 0x6B84, 0x1B3F, 0x6B86, 0x6B86, 0x076B,
+    0x6B88, 0x6B88, 0x1CED, 0x6B89, 0x6B89, 0x0900, 0x6B8A, 0x6B8A, 0x08FF,
+    0x6B8C, 0x6B8C, 0x1F43, 0x6B8D, 0x6B8E, 0x1F41, 0x6B8F, 0x6B8F, 0x1F40,
+    0x6B91, 0x6B91, 0x1F3F, 0x6B94, 0x6B94, 0x21B6, 0x6B95, 0x6B95, 0x21B9,
+    0x6B96, 0x6B96, 0x0C9F, 0x6B97, 0x6B97, 0x21B7, 0x6B98, 0x6B98, 0x0C9E,
+    0x6B99, 0x6B99, 0x21B8, 0x6B9B, 0x6B9B, 0x2448, 0x6B9E, 0x6BA0, 0x26E5,
+    0x6BA2, 0x6BA2, 0x2927, 0x6BA3, 0x6BA3, 0x2926, 0x6BA4, 0x6BA4, 0x1186,
+    0x6BA5, 0x6BA5, 0x2925, 0x6BA6, 0x6BA6, 0x2928, 0x6BA7, 0x6BA7, 0x2B8B,
+    0x6BAA, 0x6BAB, 0x2B8C, 0x6BAD, 0x6BAD, 0x2D8B, 0x6BAE, 0x6BAE, 0x13F1,
+    0x6BAF, 0x6BAF, 0x14E6, 0x6BB0, 0x6BB0, 0x30A8, 0x6BB2, 0x6BB2, 0x1679,
+    0x6BB3, 0x6BB3, 0x178A, 0x6BB5, 0x6BB5, 0x076C, 0x6BB6, 0x6BB6, 0x1B40,
+    0x6BB7, 0x6BB7, 0x0901, 0x6BBA, 0x6BBA, 0x0AE8, 0x6BBC, 0x6BBC, 0x0CA0,
+    0x6BBD, 0x6BBD, 0x21BA, 0x6BBF, 0x6BBF, 0x0E4D, 0x6BC0, 0x6BC0, 0x0E4C,
+    0x6BC1, 0x6BC1, 0x466C, 0x6BC3, 0x6BC4, 0x26E8, 0x6BC5, 0x6BC6, 0x1187,
+    0x6BC7, 0x6BC7, 0x2B8F, 0x6BC8, 0x6BC8, 0x2B8E, 0x6BC9, 0x6BC9, 0x2F40,
+    0x6BCA, 0x6BCA, 0x3421, 0x6BCB, 0x6BCB, 0x02E1, 0x6BCC, 0x6BCC, 0x178B,
+    0x6BCD, 0x6BCD, 0x034E, 0x6BCF, 0x6BCF, 0x04CA, 0x6BD0, 0x6BD0, 0x18AD,
+    0x6BD2, 0x6BD2, 0x076D, 0x6BD3, 0x6BD3, 0x0E4E, 0x6BD4, 0x6BD4, 0x02E2,
+    0x6BD6, 0x6BD6, 0x1B41, 0x6BD7, 0x6BD7, 0x076E, 0x6BD8, 0x6BD8, 0x1B42,
+    0x6BDA, 0x6BDA, 0x13F2, 0x6BDB, 0x6BDB, 0x02E3, 0x6BDC, 0x6BDC, 0x4207,
+    0x6BDE, 0x6BDE, 0x19CC, 0x6BE0, 0x6BE0, 0x1B43, 0x6BE1, 0x6BE1, 0x4205,
+    0x6BE2, 0x6BE2, 0x1CF2, 0x6BE3, 0x6BE3, 0x1CF1, 0x6BE4, 0x6BE4, 0x1CEF,
+    0x6BE6, 0x6BE6, 0x1CEE, 0x6BE7, 0x6BE7, 0x1CF3, 0x6BE8, 0x6BE8, 0x1CF0,
+    0x6BEA, 0x6BEA, 0x466D, 0x6BEB, 0x6BEC, 0x0AE9, 0x6BEF, 0x6BEF, 0x0CA1,
+    0x6BF0, 0x6BF0, 0x21BB, 0x6BF2, 0x6BF3, 0x21BC, 0x6BF7, 0x6BF8, 0x244C,
+    0x6BF9, 0x6BF9, 0x244B, 0x6BFA, 0x6BFA, 0x3F79, 0x6BFB, 0x6BFC, 0x2449,
+    0x6BFD, 0x6BFD, 0x0E4F, 0x6BFE, 0x6BFE, 0x26EA, 0x6BFF, 0x6BFF, 0x292B,
+    0x6C00, 0x6C00, 0x292A, 0x6C01, 0x6C01, 0x2929, 0x6C02, 0x6C02, 0x292C,
+    0x6C03, 0x6C03, 0x2B91, 0x6C04, 0x6C04, 0x2B90, 0x6C05, 0x6C05, 0x12DE,
+    0x6C06, 0x6C06, 0x2B92, 0x6C08, 0x6C08, 0x13F3, 0x6C09, 0x6C09, 0x2D8C,
+    0x6C0B, 0x6C0B, 0x2F41, 0x6C0C, 0x6C0C, 0x30A9, 0x6C0D, 0x6C0D, 0x3388,
+    0x6C0F, 0x6C0F, 0x02E4, 0x6C10, 0x6C10, 0x0350, 0x6C11, 0x6C11, 0x034F,
+    0x6C13, 0x6C13, 0x061E, 0x6C14, 0x6C14, 0x178C, 0x6C15, 0x6C15, 0x17AA,
+    0x6C16, 0x6C16, 0x03E6, 0x6C18, 0x6C18, 0x1801, 0x6C19, 0x6C1A, 0x18AE,
+    0x6C1B, 0x6C1B, 0x061F, 0x6C1C, 0x6C1C, 0x38AB, 0x6C1D, 0x6C1D, 0x19CD,
+    0x6C1F, 0x6C1F, 0x076F, 0x6C20, 0x6C21, 0x1B44, 0x6C23, 0x6C23, 0x0902,
+    0x6C24, 0x6C24, 0x0906, 0x6C25, 0x6C25, 0x1CF4, 0x6C26, 0x6C26, 0x0905,
+    0x6C27, 0x6C28, 0x0903, 0x6C2A, 0x6C2A, 0x1F44, 0x6C2B, 0x6C2B, 0x0AEB,
+    0x6C2C, 0x6C2C, 0x0CA4, 0x6C2E, 0x6C2F, 0x0CA2, 0x6C30, 0x6C30, 0x21BE,
+    0x6C31, 0x6C31, 0x3F63, 0x6C33, 0x6C33, 0x1003, 0x6C34, 0x6C34, 0x02E5,
+    0x6C35, 0x6C35, 0x44EF, 0x6C36, 0x6C36, 0x17AB, 0x6C37, 0x6C37, 0x4208,
+    0x6C38, 0x6C38, 0x0351, 0x6C39, 0x6C39, 0x3E05, 0x6C3A, 0x6C3A, 0x44F0,
+    0x6C3B, 0x6C3B, 0x17AE, 0x6C3D, 0x6C3D, 0x4381, 0x6C3E, 0x6C3E, 0x0354,
+    0x6C3F, 0x6C3F, 0x17AD, 0x6C40, 0x6C40, 0x0353, 0x6C41, 0x6C41, 0x0352,
+    0x6C42, 0x6C42, 0x04CB, 0x6C43, 0x6C43, 0x17AC, 0x6C46, 0x6C46, 0x1802,
+    0x6C49, 0x6C49, 0x408D, 0x6C4A, 0x6C4A, 0x1806, 0x6C4B, 0x6C4C, 0x1808,
+    0x6C4D, 0x6C4E, 0x03F0, 0x6C4F, 0x6C4F, 0x1805, 0x6C50, 0x6C50, 0x03EC,
+    0x6C52, 0x6C52, 0x1803, 0x6C54, 0x6C54, 0x1807, 0x6C55, 0x6C55, 0x03ED,
+    0x6C57, 0x6C57, 0x03E8, 0x6C58, 0x6C58, 0x3BBA, 0x6C59, 0x6C59, 0x03E9,
+    0x6C5A, 0x6C5A, 0x420C, 0x6C5B, 0x6C5B, 0x03EF, 0x6C5C, 0x6C5C, 0x1804,
+    0x6C5D, 0x6C5D, 0x03E7, 0x6C5E, 0x6C5E, 0x04CC, 0x6C5F, 0x6C60, 0x03EA,
+    0x6C61, 0x6C61, 0x03EE, 0x6C65, 0x6C65, 0x18C0, 0x6C66, 0x6C66, 0x18BE,
+    0x6C67, 0x6C67, 0x18B1, 0x6C68, 0x6C68, 0x04D8, 0x6C69, 0x6C69, 0x18B8,
+    0x6C6A, 0x6C6A, 0x04D3, 0x6C6B, 0x6C6B, 0x18B2, 0x6C6D, 0x6C6D, 0x18BA,
+    0x6C6E, 0x6C6E, 0x40CA, 0x6C6F, 0x6C6F, 0x18B7, 0x6C70, 0x6C70, 0x04D6,
+    0x6C71, 0x6C71, 0x18B6, 0x6C72, 0x6C72, 0x04DD, 0x6C73, 0x6C73, 0x18BF,
+    0x6C74, 0x6C74, 0x04DF, 0x6C75, 0x6C75, 0x466E, 0x6C76, 0x6C76, 0x04E1,
+    0x6C78, 0x6C78, 0x18B0, 0x6C79, 0x6C79, 0x420E, 0x6C7A, 0x6C7A, 0x04D4,
+    0x6C7B, 0x6C7B, 0x18C1, 0x6C7D, 0x6C7D, 0x04DB, 0x6C7E, 0x6C7E, 0x04DE,
+    0x6C7F, 0x6C7F, 0x37A6, 0x6C80, 0x6C80, 0x19E4, 0x6C81, 0x6C81, 0x04CE,
+    0x6C82, 0x6C82, 0x04E5, 0x6C83, 0x6C83, 0x04DC, 0x6C84, 0x6C84, 0x18B3,
+    0x6C85, 0x6C85, 0x04D1, 0x6C86, 0x6C86, 0x04E0, 0x6C87, 0x6C87, 0x18BB,
+    0x6C88, 0x6C89, 0x04CF, 0x6C8A, 0x6C8A, 0x19E2, 0x6C8B, 0x6C8B, 0x18B4,
+    0x6C8C, 0x6C8C, 0x04D7, 0x6C8D, 0x6C8D, 0x04E2, 0x6C8E, 0x6C8E, 0x18C2,
+    0x6C8F, 0x6C8F, 0x18B5, 0x6C90, 0x6C90, 0x04D5, 0x6C92, 0x6C92, 0x04DA,
+    0x6C93, 0x6C93, 0x19CE, 0x6C94, 0x6C94, 0x04E3, 0x6C95, 0x6C95, 0x18BC,
+    0x6C96, 0x6C96, 0x04D9, 0x6C98, 0x6C98, 0x04E4, 0x6C99, 0x6C99, 0x04CD,
+    0x6C9A, 0x6C9A, 0x18B9, 0x6C9B, 0x6C9B, 0x04D2, 0x6C9C, 0x6C9C, 0x18BD,
+    0x6C9D, 0x6C9D, 0x19E3, 0x6C9F, 0x6C9F, 0x3889, 0x6CA2, 0x6CA2, 0x3D63,
+    0x6CAA, 0x6CAA, 0x466F, 0x6CAB, 0x6CAB, 0x062B, 0x6CAC, 0x6CAC, 0x063B,
+    0x6CAD, 0x6CAD, 0x19D5, 0x6CAE, 0x6CAE, 0x0632, 0x6CAF, 0x6CAF, 0x3CF6,
+    0x6CB0, 0x6CB0, 0x19EA, 0x6CB1, 0x6CB1, 0x0623, 0x6CB2, 0x6CB2, 0x3ECC,
+    0x6CB3, 0x6CB3, 0x0626, 0x6CB4, 0x6CB4, 0x19E1, 0x6CB6, 0x6CB6, 0x19D3,
+    0x6CB7, 0x6CB7, 0x19D7, 0x6CB8, 0x6CB8, 0x062E, 0x6CB9, 0x6CB9, 0x0630,
+    0x6CBA, 0x6CBA, 0x19DA, 0x6CBB, 0x6CBB, 0x0637, 0x6CBC, 0x6CBC, 0x0629,
+    0x6CBD, 0x6CBE, 0x0627, 0x6CBF, 0x6CBF, 0x0636, 0x6CC0, 0x6CC0, 0x19E6,
+    0x6CC1, 0x6CC1, 0x0631, 0x6CC2, 0x6CC2, 0x19D9, 0x6CC3, 0x6CC3, 0x19DB,
+    0x6CC4, 0x6CC4, 0x062F, 0x6CC5, 0x6CC5, 0x0634, 0x6CC6, 0x6CC6, 0x19DC,
+    0x6CC7, 0x6CC7, 0x19E9, 0x6CC9, 0x6CC9, 0x0770, 0x6CCA, 0x6CCA, 0x063A,
+    0x6CCB, 0x6CCB, 0x4070, 0x6CCC, 0x6CCC, 0x0624, 0x6CCD, 0x6CCD, 0x19E8,
+    0x6CCE, 0x6CCE, 0x3F91, 0x6CCF, 0x6CCF, 0x19EC, 0x6CD0, 0x6CD0, 0x19D8,
+    0x6CD1, 0x6CD1, 0x19EE, 0x6CD2, 0x6CD2, 0x19DF, 0x6CD3, 0x6CD3, 0x062D,
+    0x6CD4, 0x6CD4, 0x19D4, 0x6CD5, 0x6CD5, 0x062C, 0x6CD6, 0x6CD6, 0x063E,
+    0x6CD7, 0x6CD7, 0x0633, 0x6CD9, 0x6CD9, 0x19D2, 0x6CDA, 0x6CDA, 0x1B4E,
+    0x6CDB, 0x6CDB, 0x0639, 0x6CDC, 0x6CDC, 0x063D, 0x6CDD, 0x6CDD, 0x19E0,
+    0x6CDE, 0x6CDE, 0x19E5, 0x6CDF, 0x6CDF, 0x3D57, 0x6CE0, 0x6CE0, 0x063F,
+    0x6CE1, 0x6CE1, 0x0638, 0x6CE2, 0x6CE2, 0x062A, 0x6CE3, 0x6CE3, 0x0620,
+    0x6CE5, 0x6CE5, 0x0625, 0x6CE7, 0x6CE7, 0x19D6, 0x6CE8, 0x6CE8, 0x0621,
+    0x6CE9, 0x6CE9, 0x19ED, 0x6CEA, 0x6CEA, 0x3F8D, 0x6CEB, 0x6CEB, 0x19D0,
+    0x6CEC, 0x6CEC, 0x19CF, 0x6CED, 0x6CED, 0x19DD, 0x6CEE, 0x6CEE, 0x19D1,
+    0x6CEF, 0x6CEF, 0x063C, 0x6CF0, 0x6CF0, 0x0907, 0x6CF1, 0x6CF1, 0x0635,
+    0x6CF2, 0x6CF2, 0x19DE, 0x6CF3, 0x6CF3, 0x0622, 0x6CF5, 0x6CF5, 0x077F,
+    0x6CF9, 0x6CF9, 0x19EB, 0x6D00, 0x6D00, 0x1B55, 0x6D01, 0x6D01, 0x1B58,
+    0x6D02, 0x6D02, 0x4671, 0x6D03, 0x6D03, 0x1B5B, 0x6D04, 0x6D04, 0x1B50,
+    0x6D05, 0x6D05, 0x3A19, 0x6D06, 0x6D06, 0x4672, 0x6D07, 0x6D07, 0x1B5E,
+    0x6D08, 0x6D08, 0x1B61, 0x6D09, 0x6D09, 0x1B63, 0x6D0A, 0x6D0A, 0x1B4D,
+    0x6D0B, 0x6D0B, 0x0771, 0x6D0C, 0x6D0C, 0x0776, 0x6D0D, 0x6D0D, 0x1CF9,
+    0x6D0E, 0x6D0E, 0x0786, 0x6D0F, 0x6D0F, 0x1B5C, 0x6D10, 0x6D10, 0x1B64,
+    0x6D11, 0x6D11, 0x1B54, 0x6D12, 0x6D12, 0x1B4C, 0x6D16, 0x6D16, 0x1D14,
+    0x6D17, 0x6D17, 0x0779, 0x6D18, 0x6D18, 0x1B59, 0x6D19, 0x6D19, 0x1B51,
+    0x6D1A, 0x6D1A, 0x1B53, 0x6D1B, 0x6D1B, 0x077E, 0x6D1D, 0x6D1D, 0x1B56,
+    0x6D1E, 0x6D1E, 0x0778, 0x6D1F, 0x6D1F, 0x1B49, 0x6D20, 0x6D20, 0x1B5F,
+    0x6D22, 0x6D22, 0x1B62, 0x6D24, 0x6D24, 0x3AC3, 0x6D25, 0x6D25, 0x0775,
+    0x6D26, 0x6D26, 0x4673, 0x6D27, 0x6D27, 0x0781, 0x6D28, 0x6D28, 0x1B46,
+    0x6D29, 0x6D29, 0x0783, 0x6D2A, 0x6D2A, 0x0773, 0x6D2B, 0x6D2B, 0x0787,
+    0x6D2C, 0x6D2C, 0x1B60, 0x6D2D, 0x6D2D, 0x1B48, 0x6D2E, 0x6D2E, 0x0784,
+    0x6D2F, 0x6D2F, 0x1D0E, 0x6D30, 0x6D30, 0x19E7, 0x6D31, 0x6D31, 0x0777,
+    0x6D32, 0x6D32, 0x0772, 0x6D33, 0x6D33, 0x1B4F, 0x6D34, 0x6D34, 0x1B47,
+    0x6D35, 0x6D35, 0x0785, 0x6D36, 0x6D36, 0x077D, 0x6D37, 0x6D37, 0x1B5A,
+    0x6D38, 0x6D38, 0x0782, 0x6D39, 0x6D39, 0x0780, 0x6D3A, 0x6D3A, 0x1B52,
+    0x6D3B, 0x6D3B, 0x077A, 0x6D3C, 0x6D3C, 0x1B4A, 0x6D3D, 0x6D3E, 0x077B,
+    0x6D3F, 0x6D3F, 0x1B4B, 0x6D40, 0x6D40, 0x1B5D, 0x6D41, 0x6D41, 0x0774,
+    0x6D42, 0x6D42, 0x1B57, 0x6D4E, 0x6D4E, 0x4558, 0x6D57, 0x6D57, 0x3CF3,
+    0x6D58, 0x6D58, 0x1CFC, 0x6D59, 0x6D59, 0x090F, 0x6D5A, 0x6D5A, 0x0914,
+    0x6D5B, 0x6D5B, 0x409C, 0x6D5C, 0x6D5C, 0x4222, 0x6D5E, 0x6D5E, 0x1D05,
+    0x6D5F, 0x6D5F, 0x1D0B, 0x6D60, 0x6D60, 0x1D07, 0x6D61, 0x6D61, 0x1CFA,
+    0x6D62, 0x6D62, 0x1CFD, 0x6D63, 0x6D64, 0x1CF6, 0x6D65, 0x6D65, 0x091B,
+    0x6D66, 0x6D66, 0x090C, 0x6D67, 0x6D67, 0x1D06, 0x6D68, 0x6D68, 0x1D0F,
+    0x6D69, 0x6D69, 0x0916, 0x6D6A, 0x6D6A, 0x0908, 0x6D6C, 0x6D6C, 0x0911,
+    0x6D6D, 0x6D6D, 0x1CFE, 0x6D6E, 0x6D6E, 0x0913, 0x6D6F, 0x6D6F, 0x1CFF,
+    0x6D70, 0x6D70, 0x1D09, 0x6D71, 0x6D71, 0x40F5, 0x6D72, 0x6D72, 0x39D7,
+    0x6D74, 0x6D74, 0x0915, 0x6D75, 0x6D75, 0x1D18, 0x6D76, 0x6D76, 0x1CF8,
+    0x6D77, 0x6D77, 0x090E, 0x6D78, 0x6D78, 0x090D, 0x6D79, 0x6D79, 0x0919,
+    0x6D7A, 0x6D7A, 0x1CF5, 0x6D7B, 0x6D7B, 0x1D16, 0x6D7C, 0x6D7C, 0x1D0A,
+    0x6D7D, 0x6D7D, 0x1D17, 0x6D7E, 0x6D7E, 0x1D11, 0x6D7F, 0x6D7F, 0x1D03,
+    0x6D80, 0x6D80, 0x1D12, 0x6D81, 0x6D81, 0x4674, 0x6D82, 0x6D82, 0x1D0C,
+    0x6D83, 0x6D83, 0x1D15, 0x6D84, 0x6D84, 0x1D13, 0x6D85, 0x6D85, 0x091A,
+    0x6D86, 0x6D86, 0x1D04, 0x6D87, 0x6D87, 0x090B, 0x6D88, 0x6D88, 0x090A,
+    0x6D89, 0x6D89, 0x0912, 0x6D8A, 0x6D8A, 0x0918, 0x6D8B, 0x6D8B, 0x1D10,
+    0x6D8C, 0x6D8C, 0x0917, 0x6D8D, 0x6D8D, 0x1D01, 0x6D8E, 0x6D8E, 0x0AEC,
+    0x6D8F, 0x6D8F, 0x3DE8, 0x6D90, 0x6D90, 0x1D19, 0x6D91, 0x6D91, 0x1D00,
+    0x6D92, 0x6D92, 0x1CFB, 0x6D93, 0x6D93, 0x0910, 0x6D94, 0x6D94, 0x091C,
+    0x6D95, 0x6D95, 0x0909, 0x6D96, 0x6D96, 0x4221, 0x6D97, 0x6D97, 0x1D08,
+    0x6D98, 0x6D98, 0x1D0D, 0x6DA4, 0x6DA4, 0x4676, 0x6DA5, 0x6DA5, 0x3AB9,
+    0x6DAA, 0x6DAA, 0x0B0E, 0x6DAB, 0x6DAB, 0x1F46, 0x6DAC, 0x6DAC, 0x1F4A,
+    0x6DAE, 0x6DAE, 0x0AFB, 0x6DAF, 0x6DAF, 0x0AF9, 0x6DB1, 0x6DB1, 0x4677,
+    0x6DB2, 0x6DB2, 0x0AF0, 0x6DB3, 0x6DB3, 0x1F48, 0x6DB4, 0x6DB4, 0x1F47,
+    0x6DB5, 0x6DB5, 0x0B04, 0x6DB7, 0x6DB7, 0x1F4D, 0x6DB8, 0x6DB8, 0x0AFE,
+    0x6DB9, 0x6DB9, 0x3FFB, 0x6DBA, 0x6DBA, 0x1F5F, 0x6DBB, 0x6DBB, 0x1F6B,
+    0x6DBC, 0x6DBC, 0x0AED, 0x6DBD, 0x6DBD, 0x1F5C, 0x6DBE, 0x6DBE, 0x1F55,
+    0x6DBF, 0x6DBF, 0x0B10, 0x6DC0, 0x6DC0, 0x1F45, 0x6DC2, 0x6DC2, 0x1F61,
+    0x6DC4, 0x6DC4, 0x0B0D, 0x6DC5, 0x6DC5, 0x0B01, 0x6DC6, 0x6DC6, 0x0B0C,
+    0x6DC7, 0x6DC7, 0x0AF7, 0x6DC8, 0x6DC8, 0x1F51, 0x6DC9, 0x6DC9, 0x1F63,
+    0x6DCA, 0x6DCA, 0x1F5B, 0x6DCB, 0x6DCB, 0x0AF8, 0x6DCC, 0x6DCC, 0x0AF2,
+    0x6DCD, 0x6DCD, 0x1F69, 0x6DCF, 0x6DCF, 0x1F62, 0x6DD0, 0x6DD0, 0x1F64,
+    0x6DD1, 0x6DD1, 0x0AFA, 0x6DD2, 0x6DD2, 0x0B02, 0x6DD3, 0x6DD3, 0x1F66,
+    0x6DD4, 0x6DD4, 0x1F4F, 0x6DD5, 0x6DD5, 0x1F60, 0x6DD6, 0x6DD6, 0x1F54,
+    0x6DD7, 0x6DD7, 0x1F68, 0x6DD8, 0x6DD8, 0x0B07, 0x6DD9, 0x6DD9, 0x0AEF,
+    0x6DDA, 0x6DDA, 0x0B05, 0x6DDB, 0x6DDB, 0x1F59, 0x6DDC, 0x6DDD, 0x1F57,
+    0x6DDE, 0x6DDE, 0x0AFC, 0x6DDF, 0x6DDF, 0x1F53, 0x6DE0, 0x6DE0, 0x1F52,
+    0x6DE1, 0x6DE1, 0x0AF1, 0x6DE2, 0x6DE2, 0x1F4C, 0x6DE3, 0x6DE3, 0x1F6A,
+    0x6DE4, 0x6DE4, 0x0AF3, 0x6DE5, 0x6DE5, 0x1F56, 0x6DE6, 0x6DE6, 0x0B11,
+    0x6DE8, 0x6DE8, 0x0B0B, 0x6DE9, 0x6DE9, 0x1F4B, 0x6DEA, 0x6DEA, 0x0B08,
+    0x6DEB, 0x6DEB, 0x0B06, 0x6DEC, 0x6DEC, 0x0B0F, 0x6DED, 0x6DED, 0x1F5D,
+    0x6DEE, 0x6DEE, 0x0B0A, 0x6DEF, 0x6DEF, 0x1D02, 0x6DF0, 0x6DF0, 0x1F5E,
+    0x6DF1, 0x6DF1, 0x0B09, 0x6DF2, 0x6DF2, 0x1F65, 0x6DF3, 0x6DF3, 0x0AEE,
+    0x6DF4, 0x6DF4, 0x1F5A, 0x6DF5, 0x6DF5, 0x0B00, 0x6DF6, 0x6DF6, 0x1F4E,
+    0x6DF7, 0x6DF7, 0x0AFF, 0x6DF9, 0x6DF9, 0x0AFD, 0x6DFA, 0x6DFA, 0x0AF5,
+    0x6DFB, 0x6DFB, 0x0AF4, 0x6DFC, 0x6DFC, 0x21BF, 0x6DFD, 0x6DFD, 0x1F67,
+    0x6E00, 0x6E00, 0x1F50, 0x6E02, 0x6E02, 0x3CFA, 0x6E03, 0x6E03, 0x21D4,
+    0x6E04, 0x6E04, 0x3ABE, 0x6E05, 0x6E05, 0x0AF6, 0x6E0A, 0x6E0A, 0x3AC1,
+    0x6E0F, 0x6E0F, 0x3CF0, 0x6E15, 0x6E15, 0x4678, 0x6E18, 0x6E18, 0x4679,
+    0x6E19, 0x6E19, 0x0CC1, 0x6E1A, 0x6E1A, 0x0B03, 0x6E1B, 0x6E1B, 0x0CAF,
+    0x6E1C, 0x6E1C, 0x21CE, 0x6E1D, 0x6E1D, 0x0CBD, 0x6E1F, 0x6E1F, 0x21C2,
+    0x6E20, 0x6E20, 0x0CAC, 0x6E21, 0x6E21, 0x0CA8, 0x6E22, 0x6E22, 0x21E0,
+    0x6E23, 0x6E23, 0x0CAE, 0x6E24, 0x6E24, 0x0CB2, 0x6E25, 0x6E25, 0x0CAD,
+    0x6E26, 0x6E26, 0x0CB6, 0x6E27, 0x6E27, 0x21E4, 0x6E28, 0x6E28, 0x21DB,
+    0x6E29, 0x6E29, 0x467A, 0x6E2A, 0x6E2A, 0x4302, 0x6E2B, 0x6E2B, 0x21C9,
+    0x6E2C, 0x6E2C, 0x0CBB, 0x6E2D, 0x6E2D, 0x0CB5, 0x6E2E, 0x6E2E, 0x21D5,
+    0x6E2F, 0x6E2F, 0x0CA5, 0x6E30, 0x6E30, 0x21E1, 0x6E31, 0x6E31, 0x21DA,
+    0x6E32, 0x6E32, 0x0CA9, 0x6E33, 0x6E33, 0x21CF, 0x6E34, 0x6E34, 0x0CB8,
+    0x6E35, 0x6E36, 0x21EC, 0x6E38, 0x6E38, 0x0CA6, 0x6E39, 0x6E39, 0x21DF,
+    0x6E3A, 0x6E3A, 0x0CBA, 0x6E3B, 0x6E3B, 0x21D3, 0x6E3C, 0x6E3D, 0x21C5,
+    0x6E3E, 0x6E3E, 0x0CBE, 0x6E3F, 0x6E3F, 0x21CA, 0x6E40, 0x6E40, 0x21D1,
+    0x6E41, 0x6E41, 0x21CB, 0x6E43, 0x6E43, 0x0CBC, 0x6E44, 0x6E44, 0x0CC4,
+    0x6E45, 0x6E45, 0x21C7, 0x6E46, 0x6E47, 0x21C0, 0x6E49, 0x6E49, 0x21C3,
+    0x6E4A, 0x6E4A, 0x0CAB, 0x6E4B, 0x6E4B, 0x21D0, 0x6E4D, 0x6E4D, 0x0CB9,
+    0x6E4E, 0x6E4E, 0x0CC2, 0x6E4F, 0x6E4F, 0x4234, 0x6E50, 0x6E50, 0x41D1,
+    0x6E51, 0x6E51, 0x21D2, 0x6E52, 0x6E52, 0x21EA, 0x6E53, 0x6E53, 0x21E2,
+    0x6E54, 0x6E54, 0x0CA7, 0x6E55, 0x6E55, 0x21E8, 0x6E56, 0x6E56, 0x0CB3,
+    0x6E58, 0x6E58, 0x0CB1, 0x6E59, 0x6E59, 0x40E6, 0x6E5A, 0x6E5A, 0x21EE,
+    0x6E5B, 0x6E5B, 0x0CB0, 0x6E5C, 0x6E5C, 0x21D8, 0x6E5D, 0x6E5D, 0x21CC,
+    0x6E5E, 0x6E5E, 0x21D6, 0x6E5F, 0x6E5F, 0x0CC7, 0x6E60, 0x6E60, 0x21DC,
+    0x6E61, 0x6E61, 0x21D9, 0x6E62, 0x6E62, 0x21C8, 0x6E63, 0x6E63, 0x0CC3,
+    0x6E64, 0x6E64, 0x21E6, 0x6E65, 0x6E65, 0x21E3, 0x6E66, 0x6E66, 0x21EB,
+    0x6E67, 0x6E67, 0x0CAA, 0x6E68, 0x6E68, 0x21D7, 0x6E69, 0x6E69, 0x0CC6,
+    0x6E6B, 0x6E6B, 0x21DE, 0x6E6E, 0x6E6E, 0x0CB4, 0x6E6F, 0x6E6F, 0x0CB7,
+    0x6E71, 0x6E71, 0x21DD, 0x6E72, 0x6E72, 0x0CC5, 0x6E73, 0x6E73, 0x21CD,
+    0x6E74, 0x6E74, 0x1F49, 0x6E76, 0x6E76, 0x39D3, 0x6E77, 0x6E77, 0x21E7,
+    0x6E78, 0x6E78, 0x21E5, 0x6E79, 0x6E79, 0x21E9, 0x6E7C, 0x6E7C, 0x4223,
+    0x6E86, 0x6E86, 0x467B, 0x6E88, 0x6E88, 0x21C4, 0x6E89, 0x6E89, 0x0CC0,
+    0x6E8B, 0x6E8B, 0x3BBF, 0x6E8D, 0x6E8D, 0x246C, 0x6E8E, 0x6E8E, 0x246B,
+    0x6E8F, 0x6E8F, 0x2451, 0x6E90, 0x6E90, 0x0E55, 0x6E92, 0x6E92, 0x246A,
+    0x6E93, 0x6E94, 0x2454, 0x6E96, 0x6E96, 0x0E5F, 0x6E97, 0x6E97, 0x2473,
+    0x6E98, 0x6E98, 0x0E5A, 0x6E99, 0x6E99, 0x2469, 0x6E9A, 0x6E9A, 0x4581,
+    0x6E9B, 0x6E9B, 0x244E, 0x6E9C, 0x6E9C, 0x0E60, 0x6E9D, 0x6E9D, 0x0E56,
+    0x6E9E, 0x6E9E, 0x245D, 0x6E9F, 0x6E9F, 0x2453, 0x6EA0, 0x6EA0, 0x2456,
+    0x6EA1, 0x6EA1, 0x246E, 0x6EA2, 0x6EA2, 0x0E50, 0x6EA3, 0x6EA3, 0x2475,
+    0x6EA4, 0x6EA4, 0x246D, 0x6EA5, 0x6EA5, 0x0E59, 0x6EA6, 0x6EA6, 0x2462,
+    0x6EA7, 0x6EA7, 0x0E64, 0x6EAA, 0x6EAA, 0x0E63, 0x6EAB, 0x6EAB, 0x0E5D,
+    0x6EAE, 0x6EAE, 0x2474, 0x6EAF, 0x6EAF, 0x0E51, 0x6EB0, 0x6EB0, 0x2460,
+    0x6EB1, 0x6EB1, 0x2457, 0x6EB2, 0x6EB2, 0x2464, 0x6EB3, 0x6EB3, 0x2470,
+    0x6EB4, 0x6EB4, 0x0E65, 0x6EB5, 0x6EB5, 0x41FE, 0x6EB6, 0x6EB6, 0x0E53,
+    0x6EB7, 0x6EB7, 0x245F, 0x6EB8, 0x6EB8, 0x3E0C, 0x6EB9, 0x6EB9, 0x2458,
+    0x6EBA, 0x6EBA, 0x0E5C, 0x6EBB, 0x6EBB, 0x467D, 0x6EBC, 0x6EBC, 0x0E5B,
+    0x6EBD, 0x6EBD, 0x245B, 0x6EBE, 0x6EBE, 0x2465, 0x6EBF, 0x6EBF, 0x246F,
+    0x6EC0, 0x6EC0, 0x2452, 0x6EC1, 0x6EC1, 0x245C, 0x6EC2, 0x6EC2, 0x0E54,
+    0x6EC3, 0x6EC3, 0x2466, 0x6EC4, 0x6EC4, 0x0E61, 0x6EC5, 0x6EC5, 0x0E58,
+    0x6EC6, 0x6EC6, 0x2459, 0x6EC7, 0x6EC7, 0x0E57, 0x6EC8, 0x6EC8, 0x2450,
+    0x6EC9, 0x6EC9, 0x245E, 0x6ECA, 0x6ECA, 0x2472, 0x6ECB, 0x6ECB, 0x0CBF,
+    0x6ECC, 0x6ECC, 0x101F, 0x6ECD, 0x6ECD, 0x2461, 0x6ECE, 0x6ECE, 0x26EB,
+    0x6ECF, 0x6ECF, 0x2463, 0x6ED0, 0x6ED0, 0x2471, 0x6ED1, 0x6ED1, 0x0E5E,
+    0x6ED2, 0x6ED2, 0x245A, 0x6ED3, 0x6ED3, 0x0E52, 0x6ED4, 0x6ED4, 0x0E62,
+    0x6ED5, 0x6ED5, 0x119A, 0x6ED6, 0x6ED6, 0x244F, 0x6ED8, 0x6ED8, 0x2468,
+    0x6ED9, 0x6ED9, 0x4069, 0x6EDA, 0x6EDA, 0x467F, 0x6EDB, 0x6EDB, 0x402F,
+    0x6EDC, 0x6EDC, 0x2467, 0x6EDD, 0x6EDD, 0x4538, 0x6EE2, 0x6EE2, 0x467E,
+    0x6EE8, 0x6EE9, 0x4681, 0x6EEB, 0x6EEB, 0x2707, 0x6EEC, 0x6EEC, 0x101C,
+    0x6EED, 0x6EED, 0x26FC, 0x6EEE, 0x6EEE, 0x2701, 0x6EEF, 0x6EEF, 0x1011,
+    0x6EF1, 0x6EF1, 0x26ED, 0x6EF2, 0x6EF2, 0x101E, 0x6EF4, 0x6EF4, 0x1008,
+    0x6EF5, 0x6EF5, 0x26EC, 0x6EF6, 0x6EF6, 0x270D, 0x6EF7, 0x6EF7, 0x1020,
+    0x6EF8, 0x6EF8, 0x26F0, 0x6EF9, 0x6EF9, 0x2700, 0x6EFA, 0x6EFA, 0x423B,
+    0x6EFB, 0x6EFB, 0x26F2, 0x6EFC, 0x6EFC, 0x2710, 0x6EFD, 0x6EFD, 0x270C,
+    0x6EFE, 0x6EFE, 0x1006, 0x6EFF, 0x6EFF, 0x1010, 0x6F00, 0x6F00, 0x2946,
+    0x6F01, 0x6F01, 0x101D, 0x6F02, 0x6F02, 0x100E, 0x6F03, 0x6F03, 0x26EE,
+    0x6F04, 0x6F04, 0x4224, 0x6F05, 0x6F05, 0x270B, 0x6F06, 0x6F06, 0x1012,
+    0x6F07, 0x6F07, 0x2708, 0x6F08, 0x6F08, 0x2715, 0x6F09, 0x6F09, 0x26F4,
+    0x6F0A, 0x6F0A, 0x26FD, 0x6F0B, 0x6F0B, 0x3ABA, 0x6F0C, 0x6F0C, 0x3CFB,
+    0x6F0D, 0x6F0D, 0x2713, 0x6F0E, 0x6F0E, 0x2709, 0x6F0F, 0x6F0F, 0x100D,
+    0x6F12, 0x6F12, 0x26FB, 0x6F13, 0x6F13, 0x1007, 0x6F14, 0x6F14, 0x1005,
+    0x6F15, 0x6F15, 0x1017, 0x6F16, 0x6F16, 0x41A0, 0x6F17, 0x6F17, 0x46CE,
+    0x6F18, 0x6F18, 0x26F9, 0x6F19, 0x6F1A, 0x26F6, 0x6F1C, 0x6F1C, 0x270F,
+    0x6F1E, 0x6F1E, 0x2714, 0x6F1F, 0x6F1F, 0x2712, 0x6F20, 0x6F20, 0x100B,
+    0x6F21, 0x6F21, 0x2716, 0x6F22, 0x6F22, 0x100F, 0x6F23, 0x6F23, 0x1016,
+    0x6F24, 0x6F24, 0x4683, 0x6F25, 0x6F25, 0x26EF, 0x6F26, 0x6F26, 0x292E,
+    0x6F27, 0x6F27, 0x26F8, 0x6F29, 0x6F29, 0x1009, 0x6F2A, 0x6F2A, 0x101B,
+    0x6F2B, 0x6F2B, 0x1018, 0x6F2C, 0x6F2C, 0x100C, 0x6F2D, 0x6F2D, 0x2702,
+    0x6F2E, 0x6F2E, 0x26F3, 0x6F2F, 0x6F2F, 0x1019, 0x6F30, 0x6F30, 0x2704,
+    0x6F31, 0x6F31, 0x1013, 0x6F32, 0x6F32, 0x1015, 0x6F33, 0x6F33, 0x1004,
+    0x6F34, 0x6F34, 0x4684, 0x6F35, 0x6F35, 0x2706, 0x6F36, 0x6F36, 0x26FE,
+    0x6F37, 0x6F37, 0x26F1, 0x6F38, 0x6F38, 0x1014, 0x6F39, 0x6F39, 0x270E,
+    0x6F3A, 0x6F3A, 0x2711, 0x6F3B, 0x6F3B, 0x26FA, 0x6F3C, 0x6F3C, 0x2705,
+    0x6F3D, 0x6F3D, 0x4282, 0x6F3E, 0x6F3E, 0x100A, 0x6F3F, 0x6F3F, 0x1189,
+    0x6F40, 0x6F40, 0x2703, 0x6F41, 0x6F41, 0x292D, 0x6F43, 0x6F43, 0x270A,
+    0x6F44, 0x6F44, 0x4240, 0x6F4E, 0x6F4E, 0x26F5, 0x6F4F, 0x6F4F, 0x2937,
+    0x6F50, 0x6F50, 0x2941, 0x6F51, 0x6F51, 0x118C, 0x6F52, 0x6F52, 0x2940,
+    0x6F53, 0x6F53, 0x294C, 0x6F54, 0x6F54, 0x118E, 0x6F55, 0x6F55, 0x293E,
+    0x6F56, 0x6F56, 0x3E52, 0x6F57, 0x6F57, 0x2942, 0x6F58, 0x6F58, 0x1199,
+    0x6F5A, 0x6F5A, 0x2939, 0x6F5B, 0x6F5B, 0x1191, 0x6F5C, 0x6F5C, 0x4241,
+    0x6F5D, 0x6F5D, 0x2945, 0x6F5E, 0x6F5E, 0x2B9A, 0x6F5F, 0x6F5F, 0x119D,
+    0x6F60, 0x6F60, 0x119C, 0x6F61, 0x6F61, 0x2947, 0x6F62, 0x6F62, 0x2936,
+    0x6F63, 0x6F63, 0x2951, 0x6F64, 0x6F64, 0x1197, 0x6F66, 0x6F66, 0x118D,
+    0x6F67, 0x6F67, 0x294A, 0x6F69, 0x6F69, 0x294E, 0x6F6A, 0x6F6A, 0x2953,
+    0x6F6B, 0x6F6B, 0x2948, 0x6F6C, 0x6F6C, 0x293C, 0x6F6D, 0x6F6D, 0x1190,
+    0x6F6E, 0x6F6E, 0x1193, 0x6F6F, 0x6F6F, 0x119B, 0x6F70, 0x6F70, 0x1196,
+    0x6F72, 0x6F72, 0x293F, 0x6F73, 0x6F73, 0x26FF, 0x6F74, 0x6F74, 0x4243,
+    0x6F76, 0x6F76, 0x293B, 0x6F77, 0x6F77, 0x2952, 0x6F78, 0x6F78, 0x1192,
+    0x6F79, 0x6F79, 0x3BBE, 0x6F7A, 0x6F7A, 0x1195, 0x6F7B, 0x6F7B, 0x2954,
+    0x6F7C, 0x6F7C, 0x118A, 0x6F7D, 0x6F7D, 0x2949, 0x6F7E, 0x6F7E, 0x292F,
+    0x6F7F, 0x6F7F, 0x294F, 0x6F80, 0x6F80, 0x13FC, 0x6F81, 0x6F81, 0x4687,
+    0x6F82, 0x6F82, 0x293D, 0x6F84, 0x6F84, 0x118B, 0x6F85, 0x6F85, 0x2938,
+    0x6F86, 0x6F86, 0x118F, 0x6F87, 0x6F87, 0x2930, 0x6F88, 0x6F88, 0x101A,
+    0x6F89, 0x6F89, 0x2934, 0x6F8A, 0x6F8A, 0x4195, 0x6F8B, 0x6F8B, 0x294D,
+    0x6F8C, 0x6F8C, 0x2935, 0x6F8D, 0x6F8D, 0x2933, 0x6F8E, 0x6F8E, 0x1194,
+    0x6F90, 0x6F90, 0x294B, 0x6F92, 0x6F92, 0x2932, 0x6F93, 0x6F93, 0x2944,
+    0x6F94, 0x6F94, 0x2943, 0x6F95, 0x6F95, 0x2950, 0x6F96, 0x6F96, 0x293A,
+    0x6F97, 0x6F97, 0x1198, 0x6F9D, 0x6F9D, 0x4239, 0x6F9E, 0x6F9E, 0x2B9D,
+    0x6F9F, 0x6F9F, 0x4246, 0x6FA0, 0x6FA0, 0x12EB, 0x6FA1, 0x6FA1, 0x12E1,
+    0x6FA2, 0x6FA2, 0x2BA9, 0x6FA3, 0x6FA3, 0x2B95, 0x6FA4, 0x6FA4, 0x12E3,
+    0x6FA5, 0x6FA5, 0x2BA1, 0x6FA6, 0x6FA6, 0x12EA, 0x6FA7, 0x6FA7, 0x12E5,
+    0x6FA8, 0x6FA8, 0x2B9F, 0x6FA9, 0x6FA9, 0x2D8E, 0x6FAA, 0x6FAA, 0x2BA5,
+    0x6FAB, 0x6FAB, 0x2BAB, 0x6FAC, 0x6FAC, 0x2BA4, 0x6FAD, 0x6FAD, 0x2B93,
+    0x6FAE, 0x6FAE, 0x2BA2, 0x6FAF, 0x6FAF, 0x2BAD, 0x6FB0, 0x6FB0, 0x2BAF,
+    0x6FB1, 0x6FB1, 0x12E0, 0x6FB2, 0x6FB2, 0x2BAE, 0x6FB3, 0x6FB3, 0x12E6,
+    0x6FB4, 0x6FB4, 0x12EC, 0x6FB5, 0x6FB5, 0x3E27, 0x6FB6, 0x6FB6, 0x12E9,
+    0x6FB8, 0x6FB8, 0x2BA8, 0x6FB9, 0x6FB9, 0x12E8, 0x6FBA, 0x6FBA, 0x2BA3,
+    0x6FBB, 0x6FBB, 0x3BBB, 0x6FBC, 0x6FBC, 0x2B97, 0x6FBD, 0x6FBD, 0x2B9C,
+    0x6FBE, 0x6FBE, 0x4688, 0x6FBF, 0x6FBF, 0x2BA7, 0x6FC0, 0x6FC0, 0x12E7,
+    0x6FC1, 0x6FC1, 0x12E4, 0x6FC2, 0x6FC2, 0x12DF, 0x6FC3, 0x6FC3, 0x12E2,
+    0x6FC4, 0x6FC4, 0x2B9B, 0x6FC6, 0x6FC6, 0x2931, 0x6FC7, 0x6FC7, 0x2B96,
+    0x6FC8, 0x6FC8, 0x2B99, 0x6FC9, 0x6FC9, 0x2BAA, 0x6FCA, 0x6FCA, 0x2B9E,
+    0x6FCB, 0x6FCB, 0x2B94, 0x6FCC, 0x6FCC, 0x2D8D, 0x6FCD, 0x6FCD, 0x2BAC,
+    0x6FCE, 0x6FCE, 0x2B98, 0x6FCF, 0x6FCF, 0x2BA6, 0x6FD3, 0x6FD3, 0x4248,
+    0x6FD4, 0x6FD4, 0x2D90, 0x6FD5, 0x6FD5, 0x1400, 0x6FD8, 0x6FD8, 0x13F4,
+    0x6FD9, 0x6FD9, 0x3C74, 0x6FDA, 0x6FDA, 0x3C73, 0x6FDB, 0x6FDB, 0x13F8,
+    0x6FDC, 0x6FDC, 0x2D92, 0x6FDD, 0x6FDD, 0x2D98, 0x6FDE, 0x6FDE, 0x2D96,
+    0x6FDF, 0x6FE0, 0x13F6, 0x6FE1, 0x6FE1, 0x13FE, 0x6FE2, 0x6FE2, 0x2D99,
+    0x6FE3, 0x6FE3, 0x2D91, 0x6FE4, 0x6FE4, 0x13F9, 0x6FE6, 0x6FE6, 0x2D95,
+    0x6FE7, 0x6FE7, 0x2D94, 0x6FE8, 0x6FE8, 0x2D9A, 0x6FE9, 0x6FE9, 0x13FF,
+    0x6FEB, 0x6FEB, 0x13FA, 0x6FEC, 0x6FEC, 0x13FD, 0x6FED, 0x6FED, 0x2D93,
+    0x6FEE, 0x6FEE, 0x1401, 0x6FEF, 0x6FEF, 0x13FB, 0x6FF0, 0x6FF0, 0x1402,
+    0x6FF1, 0x6FF1, 0x13F5, 0x6FF2, 0x6FF2, 0x2D97, 0x6FF4, 0x6FF4, 0x2D8F,
+    0x6FF6, 0x6FF6, 0x38A5, 0x6FF7, 0x6FF7, 0x2F4E, 0x6FF8, 0x6FF8, 0x4237,
+    0x6FFA, 0x6FFA, 0x14EB, 0x6FFB, 0x6FFB, 0x2F4B, 0x6FFC, 0x6FFC, 0x2F4D,
+    0x6FFE, 0x6FFE, 0x14E9, 0x6FFF, 0x6FFF, 0x2F49, 0x7000, 0x7000, 0x2F4A,
+    0x7001, 0x7001, 0x2F45, 0x7003, 0x7003, 0x46E2, 0x7004, 0x7004, 0x2BA0,
+    0x7005, 0x7005, 0x2F46, 0x7006, 0x7006, 0x14EA, 0x7007, 0x7007, 0x2F42,
+    0x7009, 0x7009, 0x14E7, 0x700A, 0x700A, 0x2F4F, 0x700B, 0x700B, 0x14E8,
+    0x700C, 0x700D, 0x2F43, 0x700E, 0x700E, 0x2F48, 0x700F, 0x700F, 0x14ED,
+    0x7011, 0x7011, 0x14EC, 0x7014, 0x7014, 0x2F47, 0x7015, 0x7015, 0x158F,
+    0x7016, 0x7016, 0x30AD, 0x7017, 0x7017, 0x30B3, 0x7018, 0x7018, 0x1590,
+    0x7019, 0x7019, 0x30AA, 0x701A, 0x701A, 0x158D, 0x701B, 0x701B, 0x158A,
+    0x701C, 0x701C, 0x30B5, 0x701D, 0x701D, 0x158E, 0x701E, 0x701E, 0x3C76,
+    0x701F, 0x701F, 0x158B, 0x7020, 0x7020, 0x30AC, 0x7021, 0x7023, 0x30AF,
+    0x7024, 0x7024, 0x30B4, 0x7026, 0x7026, 0x2F4C, 0x7027, 0x7027, 0x30AB,
+    0x7028, 0x7028, 0x158C, 0x7029, 0x7029, 0x30B2, 0x702A, 0x702A, 0x31EF,
+    0x702B, 0x702B, 0x30AE, 0x702C, 0x702C, 0x468E, 0x702F, 0x702F, 0x31E6,
+    0x7030, 0x7030, 0x161D, 0x7031, 0x7031, 0x31E9, 0x7032, 0x7032, 0x161E,
+    0x7033, 0x7033, 0x31F2, 0x7034, 0x7034, 0x31E8, 0x7035, 0x7035, 0x31E5,
+    0x7037, 0x7037, 0x31E7, 0x7038, 0x7038, 0x31EB, 0x7039, 0x7039, 0x31EE,
+    0x703A, 0x703A, 0x31ED, 0x703B, 0x703B, 0x31F1, 0x703C, 0x703C, 0x31E4,
+    0x703E, 0x703E, 0x161C, 0x703F, 0x703F, 0x31EC, 0x7040, 0x7040, 0x31F0,
+    0x7041, 0x7041, 0x31F3, 0x7042, 0x7042, 0x31EA, 0x7043, 0x7044, 0x32D8,
+    0x7045, 0x7046, 0x32DD, 0x7048, 0x7049, 0x32DB, 0x704A, 0x704A, 0x32DA,
+    0x704B, 0x704B, 0x4254, 0x704C, 0x704C, 0x167A, 0x7050, 0x7050, 0x4690,
+    0x7051, 0x7051, 0x16C8, 0x7052, 0x7052, 0x338C, 0x7054, 0x7054, 0x4691,
+    0x7055, 0x7057, 0x3389, 0x7058, 0x7058, 0x16C9, 0x705A, 0x705A, 0x3423,
+    0x705B, 0x705B, 0x3422, 0x705C, 0x705C, 0x3852, 0x705D, 0x705D, 0x348A,
+    0x705E, 0x705E, 0x1722, 0x705F, 0x705F, 0x3488, 0x7060, 0x7060, 0x348B,
+    0x7061, 0x7061, 0x3489, 0x7062, 0x7062, 0x34D0, 0x7063, 0x7063, 0x1744,
+    0x7064, 0x7064, 0x1752, 0x7065, 0x7065, 0x351C, 0x7066, 0x7066, 0x3506,
+    0x7067, 0x7067, 0x3CF5, 0x7068, 0x7068, 0x351B, 0x7069, 0x706A, 0x3547,
+    0x706B, 0x706B, 0x02E6, 0x706C, 0x706C, 0x44F1, 0x706F, 0x706F, 0x4692,
+    0x7070, 0x7070, 0x03F2, 0x7071, 0x7071, 0x180A, 0x7074, 0x7074, 0x18C3,
+    0x7075, 0x7075, 0x38C7, 0x7076, 0x7076, 0x04E6, 0x7078, 0x7078, 0x04E9,
+    0x7079, 0x7079, 0x4099, 0x707A, 0x707A, 0x18C4, 0x707C, 0x707D, 0x04E7,
+    0x707E, 0x707E, 0x4255, 0x707F, 0x707F, 0x4693, 0x7081, 0x7081, 0x4959,
+    0x7082, 0x7082, 0x19F7, 0x7083, 0x7083, 0x19F9, 0x7084, 0x7084, 0x19F4,
+    0x7085, 0x7085, 0x19F1, 0x7086, 0x7086, 0x19F3, 0x7089, 0x7089, 0x43F9,
+    0x708A, 0x708A, 0x0643, 0x708B, 0x708B, 0x40CB, 0x708E, 0x708E, 0x0641,
+    0x708F, 0x708F, 0x46B3, 0x7091, 0x7091, 0x19F5, 0x7092, 0x7092, 0x0642,
+    0x7093, 0x7093, 0x19F2, 0x7094, 0x7094, 0x19EF, 0x7095, 0x7095, 0x0640,
+    0x7096, 0x7096, 0x19F6, 0x7098, 0x7098, 0x19F0, 0x7099, 0x7099, 0x0644,
+    0x709A, 0x709A, 0x19F8, 0x709F, 0x709F, 0x1B66, 0x70A0, 0x70A0, 0x4742,
+    0x70A1, 0x70A1, 0x1B6A, 0x70A3, 0x70A3, 0x3972, 0x70A4, 0x70A4, 0x0790,
+    0x70A5, 0x70A5, 0x3CB7, 0x70A6, 0x70A6, 0x3D53, 0x70A7, 0x70A7, 0x4256,
+    0x70A9, 0x70A9, 0x1B6D, 0x70AB, 0x70AB, 0x0788, 0x70AC, 0x70AC, 0x078B,
+    0x70AD, 0x70AD, 0x078D, 0x70AE, 0x70AE, 0x078F, 0x70AF, 0x70AF, 0x078C,
+    0x70B0, 0x70B0, 0x1B69, 0x70B1, 0x70B1, 0x1B68, 0x70B3, 0x70B3, 0x078A,
+    0x70B4, 0x70B5, 0x1B6B, 0x70B7, 0x70B7, 0x1B65, 0x70B8, 0x70B8, 0x078E,
+    0x70B9, 0x70B9, 0x3D69, 0x70BA, 0x70BA, 0x0789, 0x70BB, 0x70BB, 0x4812,
+    0x70BC, 0x70BC, 0x4559, 0x70BD, 0x70BD, 0x4270, 0x70BE, 0x70BE, 0x1B67,
+    0x70C0, 0x70C0, 0x4733, 0x70C4, 0x70C4, 0x3BAA, 0x70C5, 0x70C7, 0x1D27,
+    0x70C8, 0x70C8, 0x0921, 0x70CA, 0x70CA, 0x091D, 0x70CB, 0x70CB, 0x1D1E,
+    0x70CC, 0x70CC, 0x4258, 0x70CD, 0x70CD, 0x1D26, 0x70CE, 0x70CE, 0x1D2B,
+    0x70CF, 0x70CF, 0x0922, 0x70D0, 0x70D0, 0x396D, 0x70D1, 0x70D1, 0x1D1C,
+    0x70D2, 0x70D2, 0x1D22, 0x70D3, 0x70D3, 0x1D1B, 0x70D4, 0x70D4, 0x1D25,
+    0x70D5, 0x70D6, 0x4259, 0x70D7, 0x70D7, 0x1D21, 0x70D8, 0x70D8, 0x091E,
+    0x70D9, 0x70D9, 0x0920, 0x70DA, 0x70DA, 0x1D2A, 0x70DC, 0x70DC, 0x1D1A,
+    0x70DD, 0x70DD, 0x1D1D, 0x70DE, 0x70DE, 0x1D23, 0x70DF, 0x70DF, 0x425B,
+    0x70E0, 0x70E0, 0x1D24, 0x70E1, 0x70E1, 0x1D2C, 0x70E2, 0x70E2, 0x1D20,
+    0x70E4, 0x70E4, 0x091F, 0x70EF, 0x70EF, 0x0B16, 0x70F0, 0x70F0, 0x1F72,
+    0x70F1, 0x70F1, 0x3AC8, 0x70F3, 0x70F3, 0x1F74, 0x70F4, 0x70F4, 0x1F70,
+    0x70F5, 0x70F5, 0x4760, 0x70F6, 0x70F6, 0x1F7C, 0x70F7, 0x70F7, 0x1F6E,
+    0x70F8, 0x70F8, 0x1F7B, 0x70F9, 0x70F9, 0x0B12, 0x70FA, 0x70FA, 0x1F6C,
+    0x70FB, 0x70FB, 0x21F2, 0x70FC, 0x70FC, 0x1F76, 0x70FD, 0x70FD, 0x0B15,
+    0x70FE, 0x70FE, 0x3D0E, 0x70FF, 0x70FF, 0x1F77, 0x7100, 0x7100, 0x1F7A,
+    0x7102, 0x7102, 0x1F7E, 0x7104, 0x7104, 0x1F73, 0x7105, 0x7105, 0x3A23,
+    0x7106, 0x7106, 0x1F78, 0x7109, 0x710A, 0x0B13, 0x710B, 0x710B, 0x1F7D,
+    0x710C, 0x710C, 0x1F71, 0x710D, 0x710D, 0x1F6D, 0x710E, 0x710E, 0x1F7F,
+    0x7110, 0x7110, 0x1F75, 0x7113, 0x7113, 0x1F79, 0x7117, 0x7117, 0x1F6F,
+    0x7119, 0x711A, 0x0CC8, 0x711B, 0x711B, 0x21FC, 0x711C, 0x711C, 0x0CCF,
+    0x711D, 0x711D, 0x3D47, 0x711E, 0x711E, 0x21F0, 0x711F, 0x711F, 0x21F9,
+    0x7120, 0x7120, 0x21EF, 0x7121, 0x7121, 0x0CCC, 0x7122, 0x7122, 0x21F7,
+    0x7123, 0x7123, 0x21F5, 0x7125, 0x7125, 0x21F6, 0x7126, 0x7126, 0x0CCA,
+    0x7128, 0x7128, 0x21FA, 0x7129, 0x7129, 0x3BA9, 0x712B, 0x712B, 0x4261,
+    0x712C, 0x712C, 0x426A, 0x712E, 0x712E, 0x21F3, 0x712F, 0x712F, 0x21F1,
+    0x7130, 0x7130, 0x0CCB, 0x7131, 0x7131, 0x21F4, 0x7132, 0x7132, 0x21F8,
+    0x7133, 0x7133, 0x3D54, 0x7134, 0x7134, 0x3C7E, 0x7135, 0x7135, 0x376D,
+    0x7136, 0x7136, 0x0CCD, 0x713A, 0x713A, 0x21FB, 0x713B, 0x713B, 0x3AC5,
+    0x713E, 0x713E, 0x372E, 0x7140, 0x7140, 0x4398, 0x7141, 0x7141, 0x247B,
+    0x7142, 0x7142, 0x2482, 0x7143, 0x7143, 0x2484, 0x7144, 0x7144, 0x248A,
+    0x7145, 0x7145, 0x4262, 0x7146, 0x7146, 0x0E72, 0x7147, 0x7147, 0x2476,
+    0x7149, 0x7149, 0x0E6A, 0x714A, 0x714A, 0x4264, 0x714B, 0x714B, 0x2485,
+    0x714C, 0x714C, 0x0E6F, 0x714D, 0x714D, 0x248B, 0x714E, 0x714E, 0x0E66,
+    0x714F, 0x714F, 0x4267, 0x7150, 0x7150, 0x2488, 0x7151, 0x7151, 0x4865,
+    0x7152, 0x7152, 0x2478, 0x7153, 0x7153, 0x2489, 0x7154, 0x7154, 0x2477,
+    0x7156, 0x7156, 0x0E74, 0x7158, 0x7158, 0x2483, 0x7159, 0x7159, 0x0E67,
+    0x715A, 0x715A, 0x248C, 0x715C, 0x715C, 0x0E6C, 0x715D, 0x715D, 0x247C,
+    0x715E, 0x715E, 0x0E71, 0x715F, 0x715F, 0x2487, 0x7160, 0x7160, 0x247A,
+    0x7161, 0x7161, 0x2481, 0x7162, 0x7162, 0x247D, 0x7163, 0x7163, 0x2479,
+    0x7164, 0x7164, 0x0E69, 0x7165, 0x7165, 0x0E70, 0x7166, 0x7166, 0x0E6E,
+    0x7167, 0x7167, 0x0E6B, 0x7168, 0x7168, 0x0E73, 0x7169, 0x7169, 0x0E68,
+    0x716A, 0x716A, 0x2480, 0x716B, 0x716B, 0x3CC5, 0x716C, 0x716C, 0x0E6D,
+    0x716E, 0x716E, 0x0CCE, 0x7170, 0x7170, 0x2486, 0x7171, 0x7171, 0x3DC0,
+    0x7172, 0x7172, 0x247E, 0x7173, 0x7173, 0x47E7, 0x7175, 0x7175, 0x3CED,
+    0x7176, 0x7176, 0x4000, 0x7177, 0x7177, 0x3957, 0x7178, 0x7178, 0x247F,
+    0x717A, 0x717A, 0x4924, 0x717B, 0x717B, 0x271E, 0x717C, 0x717C, 0x3835,
+    0x717D, 0x717D, 0x1023, 0x717E, 0x717E, 0x3970, 0x7180, 0x7180, 0x271A,
+    0x7181, 0x7181, 0x2720, 0x7182, 0x7182, 0x271C, 0x7184, 0x7184, 0x1025,
+    0x7185, 0x7185, 0x271B, 0x7186, 0x7186, 0x271F, 0x7187, 0x7187, 0x2717,
+    0x7188, 0x7188, 0x4706, 0x7189, 0x7189, 0x2719, 0x718A, 0x718A, 0x1024,
+    0x718C, 0x718C, 0x39EA, 0x718E, 0x718E, 0x3D3B, 0x718F, 0x718F, 0x271D,
+    0x7190, 0x7190, 0x2718, 0x7192, 0x7192, 0x1026, 0x7194, 0x7194, 0x1021,
+    0x7196, 0x7196, 0x425F, 0x7197, 0x7197, 0x2721, 0x7198, 0x7198, 0x481D,
+    0x7199, 0x7199, 0x1022, 0x719A, 0x719A, 0x295A, 0x719B, 0x719B, 0x2957,
+    0x719C, 0x719C, 0x2963, 0x719D, 0x719D, 0x295D, 0x719E, 0x719E, 0x295F,
+    0x719F, 0x719F, 0x119E, 0x71A0, 0x71A0, 0x2959, 0x71A1, 0x71A1, 0x2961,
+    0x71A2, 0x71A2, 0x48C1, 0x71A3, 0x71A3, 0x3EC8, 0x71A4, 0x71A4, 0x2960,
+    0x71A5, 0x71A5, 0x295E, 0x71A7, 0x71A7, 0x2964, 0x71A8, 0x71A8, 0x11A1,
+    0x71A9, 0x71A9, 0x295B, 0x71AA, 0x71AA, 0x2962, 0x71AC, 0x71AC, 0x119F,
+    0x71AD, 0x71AD, 0x3E1D, 0x71AF, 0x71AF, 0x2956, 0x71B0, 0x71B0, 0x2958,
+    0x71B1, 0x71B1, 0x11A0, 0x71B2, 0x71B2, 0x2955, 0x71B3, 0x71B3, 0x2965,
+    0x71B4, 0x71B4, 0x425E, 0x71B5, 0x71B5, 0x295C, 0x71B7, 0x71B7, 0x468B,
+    0x71B8, 0x71B8, 0x2BB3, 0x71B9, 0x71B9, 0x12F3, 0x71BA, 0x71BA, 0x426E,
+    0x71BC, 0x71BC, 0x2BBE, 0x71BD, 0x71BD, 0x2BBC, 0x71BE, 0x71BE, 0x12ED,
+    0x71BF, 0x71BF, 0x2BB2, 0x71C0, 0x71C1, 0x2BB5, 0x71C2, 0x71C2, 0x2BB1,
+    0x71C3, 0x71C4, 0x12F7, 0x71C5, 0x71C5, 0x2BB0, 0x71C6, 0x71C6, 0x2BBF,
+    0x71C7, 0x71C7, 0x2BBA, 0x71C8, 0x71C8, 0x12F1, 0x71C9, 0x71C9, 0x12EE,
+    0x71CA, 0x71CA, 0x2BB9, 0x71CB, 0x71CB, 0x2BB7, 0x71CE, 0x71CE, 0x12F4,
+    0x71CF, 0x71CF, 0x2BBB, 0x71D0, 0x71D0, 0x12EF, 0x71D1, 0x71D1, 0x373D,
+    0x71D2, 0x71D2, 0x12F0, 0x71D4, 0x71D4, 0x2BB8, 0x71D5, 0x71D5, 0x12F2,
+    0x71D6, 0x71D6, 0x2BB4, 0x71D8, 0x71D8, 0x2BBD, 0x71D9, 0x71D9, 0x12F5,
+    0x71DA, 0x71DB, 0x2BC0, 0x71DC, 0x71DC, 0x12F6, 0x71DD, 0x71DD, 0x4078,
+    0x71DF, 0x71DF, 0x1404, 0x71E0, 0x71E0, 0x140B, 0x71E1, 0x71E1, 0x2D9B,
+    0x71E2, 0x71E2, 0x2DA1, 0x71E4, 0x71E4, 0x2D9F, 0x71E5, 0x71E5, 0x1407,
+    0x71E6, 0x71E6, 0x1406, 0x71E7, 0x71E7, 0x1403, 0x71E8, 0x71E8, 0x2D9D,
+    0x71EB, 0x71EB, 0x3C81, 0x71EC, 0x71EC, 0x1409, 0x71ED, 0x71ED, 0x1408,
+    0x71EE, 0x71EE, 0x1405, 0x71F0, 0x71F0, 0x2DA0, 0x71F1, 0x71F1, 0x2D9C,
+    0x71F2, 0x71F2, 0x2D9E, 0x71F4, 0x71F4, 0x140A, 0x71F5, 0x71F5, 0x46EE,
+    0x71F6, 0x71F6, 0x3E9A, 0x71F8, 0x71F8, 0x14F1, 0x71F9, 0x71F9, 0x2F52,
+    0x71FB, 0x71FC, 0x14EE, 0x71FD, 0x71FD, 0x2F54, 0x71FE, 0x71FE, 0x14F0,
+    0x71FF, 0x71FF, 0x2F51, 0x7201, 0x7201, 0x2F50, 0x7202, 0x7202, 0x30B9,
+    0x7203, 0x7203, 0x2F53, 0x7205, 0x7205, 0x30BA, 0x7206, 0x7206, 0x1591,
+    0x7207, 0x7207, 0x30B8, 0x7209, 0x7209, 0x3DBB, 0x720A, 0x720A, 0x30B7,
+    0x720C, 0x720C, 0x30B6, 0x720D, 0x720D, 0x1592, 0x720E, 0x720E, 0x4271,
+    0x720F, 0x720F, 0x39FC, 0x7210, 0x7210, 0x161F, 0x7213, 0x7214, 0x31F4,
+    0x7215, 0x7215, 0x4273, 0x7216, 0x7216, 0x3953, 0x7217, 0x7217, 0x3969,
+    0x7219, 0x7219, 0x32E1, 0x721A, 0x721A, 0x32E0, 0x721B, 0x721B, 0x167B,
+    0x721D, 0x721D, 0x32DF, 0x721E, 0x721F, 0x338D, 0x7222, 0x7222, 0x3424,
+    0x7223, 0x7223, 0x348C, 0x7224, 0x7224, 0x4276, 0x7226, 0x7226, 0x34D1,
+    0x7227, 0x7227, 0x3535, 0x7228, 0x7228, 0x1766, 0x7229, 0x7229, 0x3549,
+    0x722A, 0x722A, 0x02E7, 0x722B, 0x722B, 0x44F2, 0x722C, 0x722D, 0x0645,
+    0x722E, 0x722E, 0x4279, 0x7230, 0x7230, 0x0791, 0x7235, 0x7235, 0x140C,
+    0x7236, 0x7236, 0x02E8, 0x7238, 0x7238, 0x0647, 0x7239, 0x7239, 0x0923,
+    0x723A, 0x723A, 0x0E75, 0x723B, 0x723B, 0x02E9, 0x723D, 0x723D, 0x0B17,
+    0x723E, 0x723E, 0x1027, 0x723F, 0x723F, 0x178D, 0x7240, 0x7240, 0x427A,
+    0x7241, 0x7241, 0x1B6E, 0x7242, 0x7242, 0x1D2D, 0x7244, 0x7244, 0x2722,
+    0x7246, 0x7246, 0x140D, 0x7247, 0x7247, 0x02EA, 0x7248, 0x7248, 0x0648,
+    0x7249, 0x724A, 0x1B6F, 0x724B, 0x724B, 0x21FD, 0x724C, 0x724C, 0x0CD0,
+    0x724F, 0x724F, 0x248D, 0x7250, 0x7250, 0x3AC9, 0x7252, 0x7252, 0x0E76,
+    0x7253, 0x7253, 0x2723, 0x7255, 0x7255, 0x427D, 0x7256, 0x7256, 0x11A2,
+    0x7257, 0x7257, 0x427E, 0x7258, 0x7258, 0x1593, 0x7259, 0x7259, 0x02EB,
+    0x725A, 0x725A, 0x21FE, 0x725B, 0x725B, 0x02EC, 0x725C, 0x725C, 0x465A,
+    0x725D, 0x725D, 0x03F4, 0x725E, 0x725E, 0x180B, 0x725F, 0x725F, 0x03F3,
+    0x7260, 0x7260, 0x04EC, 0x7261, 0x7261, 0x04EB, 0x7262, 0x7262, 0x04EA,
+    0x7263, 0x7263, 0x18C5, 0x7266, 0x7266, 0x3EBB, 0x7267, 0x7267, 0x0649,
+    0x7269, 0x7269, 0x064A, 0x726A, 0x726A, 0x19FA, 0x726C, 0x726C, 0x1B71,
+    0x726E, 0x726E, 0x1B74, 0x726F, 0x726F, 0x0793, 0x7270, 0x7270, 0x1B72,
+    0x7272, 0x7272, 0x0792, 0x7273, 0x7273, 0x1B73, 0x7274, 0x7274, 0x0794,
+    0x7276, 0x7276, 0x1D30, 0x7277, 0x7277, 0x1D2F, 0x7278, 0x7278, 0x1D2E,
+    0x7279, 0x7279, 0x0924, 0x727B, 0x727C, 0x1F81, 0x727D, 0x727D, 0x0B18,
+    0x727E, 0x727E, 0x1F80, 0x727F, 0x727F, 0x1F83, 0x7280, 0x7280, 0x0CD2,
+    0x7281, 0x7281, 0x0B19, 0x7282, 0x7282, 0x4283, 0x7284, 0x7284, 0x0CD1,
+    0x7285, 0x7285, 0x2202, 0x7286, 0x7286, 0x2201, 0x7287, 0x7287, 0x3ACA,
+    0x7288, 0x7289, 0x21FF, 0x728B, 0x728B, 0x2203, 0x728C, 0x728C, 0x248F,
+    0x728D, 0x728D, 0x248E, 0x728E, 0x728E, 0x2492, 0x728F, 0x728F, 0x43C9,
+    0x7290, 0x7290, 0x2491, 0x7291, 0x7291, 0x2490, 0x7292, 0x7292, 0x1028,
+    0x7293, 0x7293, 0x2726, 0x7294, 0x7294, 0x3ACB, 0x7295, 0x7295, 0x2725,
+    0x7296, 0x7296, 0x1029, 0x7297, 0x7297, 0x2724, 0x7298, 0x7298, 0x2966,
+    0x729A, 0x729A, 0x2967, 0x729B, 0x729B, 0x11A3, 0x729D, 0x729E, 0x2BC2,
+    0x729F, 0x729F, 0x473A, 0x72A1, 0x72A1, 0x30BF, 0x72A2, 0x72A2, 0x1594,
+    0x72A3, 0x72A3, 0x30BE, 0x72A4, 0x72A4, 0x30BD, 0x72A5, 0x72A6, 0x30BB,
+    0x72A7, 0x72A7, 0x167C, 0x72A8, 0x72A8, 0x31F6, 0x72A9, 0x72A9, 0x338F,
+    0x72AA, 0x72AA, 0x34D2, 0x72AC, 0x72AC, 0x02ED, 0x72AD, 0x72AD, 0x44F4,
+    0x72AE, 0x72AE, 0x17AF, 0x72AF, 0x72AF, 0x0355, 0x72B0, 0x72B0, 0x17B0,
+    0x72B2, 0x72B2, 0x3FB6, 0x72B4, 0x72B5, 0x180C, 0x72BA, 0x72BA, 0x18CB,
+    0x72BD, 0x72BD, 0x18C7, 0x72BF, 0x72BF, 0x18C6, 0x72C0, 0x72C0, 0x064B,
+    0x72C1, 0x72C1, 0x18CA, 0x72C2, 0x72C2, 0x04EE, 0x72C3, 0x72C3, 0x18C8,
+    0x72C4, 0x72C4, 0x04ED, 0x72C5, 0x72C5, 0x18CC, 0x72C6, 0x72C6, 0x18C9,
+    0x72C9, 0x72C9, 0x19FE, 0x72CA, 0x72CA, 0x1B75, 0x72CB, 0x72CB, 0x19FC,
+    0x72CC, 0x72CC, 0x1A03, 0x72CD, 0x72CD, 0x43CA, 0x72CE, 0x72CE, 0x064C,
+    0x72D0, 0x72D0, 0x064F, 0x72D1, 0x72D1, 0x1A04, 0x72D2, 0x72D2, 0x1A00,
+    0x72D4, 0x72D4, 0x1A01, 0x72D6, 0x72D6, 0x19FB, 0x72D7, 0x72D7, 0x064E,
+    0x72D8, 0x72D8, 0x19FD, 0x72D9, 0x72D9, 0x064D, 0x72DA, 0x72DA, 0x1A02,
+    0x72DC, 0x72DC, 0x19FF, 0x72DF, 0x72DF, 0x1B79, 0x72E0, 0x72E1, 0x0796,
+    0x72E2, 0x72E2, 0x3F97, 0x72E3, 0x72E3, 0x1B7C, 0x72E4, 0x72E4, 0x1B76,
+    0x72E6, 0x72E6, 0x1B7B, 0x72E8, 0x72E8, 0x1B77, 0x72E9, 0x72E9, 0x0795,
+    0x72EA, 0x72EA, 0x1B7A, 0x72EB, 0x72EB, 0x1B78, 0x72F3, 0x72F3, 0x1D36,
+    0x72F4, 0x72F4, 0x1D33, 0x72F6, 0x72F6, 0x1D35, 0x72F7, 0x72F7, 0x0929,
+    0x72F8, 0x72F8, 0x0928, 0x72F9, 0x72F9, 0x0926, 0x72FA, 0x72FA, 0x1D32,
+    0x72FB, 0x72FB, 0x1D37, 0x72FC, 0x72FC, 0x0925, 0x72FD, 0x72FD, 0x0927,
+    0x72FE, 0x72FE, 0x1D34, 0x72FF, 0x72FF, 0x1F8B, 0x7300, 0x7300, 0x1D31,
+    0x7301, 0x7301, 0x1D38, 0x7302, 0x7302, 0x3F9A, 0x7304, 0x7304, 0x3EB5,
+    0x7307, 0x7307, 0x1F86, 0x7308, 0x7308, 0x1F8A, 0x730A, 0x730A, 0x1F89,
+    0x730B, 0x730B, 0x2205, 0x730C, 0x730C, 0x2210, 0x730F, 0x730F, 0x1F8C,
+    0x7310, 0x7310, 0x46EA, 0x7311, 0x7311, 0x1F87, 0x7312, 0x7312, 0x2204,
+    0x7313, 0x7313, 0x0B1D, 0x7316, 0x7316, 0x0B1C, 0x7317, 0x7317, 0x1F85,
+    0x7318, 0x7318, 0x1F88, 0x7319, 0x7319, 0x0B1E, 0x731B, 0x731B, 0x0B1B,
+    0x731C, 0x731C, 0x0B1A, 0x731D, 0x731D, 0x1F84, 0x731E, 0x731E, 0x1F8D,
+    0x7322, 0x7322, 0x2207, 0x7323, 0x7323, 0x220E, 0x7325, 0x7325, 0x0CD4,
+    0x7326, 0x7326, 0x220D, 0x7327, 0x7327, 0x220A, 0x7328, 0x7328, 0x428A,
+    0x7329, 0x7329, 0x0CD6, 0x732A, 0x732A, 0x3D70, 0x732B, 0x732B, 0x4285,
+    0x732C, 0x732C, 0x3FB2, 0x732D, 0x732D, 0x220C, 0x732E, 0x732E, 0x428B,
+    0x7330, 0x7330, 0x2206, 0x7331, 0x7331, 0x2208, 0x7332, 0x7332, 0x220B,
+    0x7333, 0x7333, 0x2209, 0x7334, 0x7334, 0x0CD5, 0x7335, 0x7335, 0x220F,
+    0x7336, 0x7336, 0x0CD3, 0x7337, 0x7337, 0x0E77, 0x7338, 0x7338, 0x46EB,
+    0x7339, 0x7339, 0x43CC, 0x733A, 0x733A, 0x2496, 0x733B, 0x733B, 0x2495,
+    0x733C, 0x733C, 0x2493, 0x733E, 0x733E, 0x0E7A, 0x733F, 0x733F, 0x0E79,
+    0x7340, 0x7340, 0x2497, 0x7341, 0x7341, 0x46EC, 0x7342, 0x7342, 0x2494,
+    0x7343, 0x7343, 0x2727, 0x7344, 0x7344, 0x102A, 0x7345, 0x7345, 0x0E78,
+    0x7348, 0x7348, 0x43FA, 0x7349, 0x7349, 0x2499, 0x734A, 0x734A, 0x2498,
+    0x734C, 0x734C, 0x272A, 0x734D, 0x734D, 0x2728, 0x734E, 0x734E, 0x11A4,
+    0x734F, 0x734F, 0x3F51, 0x7350, 0x7350, 0x102B, 0x7351, 0x7351, 0x2729,
+    0x7352, 0x7352, 0x2969, 0x7357, 0x7357, 0x11A5, 0x7358, 0x7358, 0x2968,
+    0x7359, 0x7359, 0x2971, 0x735A, 0x735A, 0x2970, 0x735B, 0x735B, 0x296E,
+    0x735D, 0x735D, 0x296D, 0x735E, 0x7360, 0x296A, 0x7361, 0x7361, 0x296F,
+    0x7362, 0x7362, 0x2972, 0x7365, 0x7365, 0x2BC8, 0x7366, 0x7367, 0x2BC5,
+    0x7368, 0x7368, 0x12F9, 0x7369, 0x7369, 0x2BC4, 0x736A, 0x736A, 0x2BCA,
+    0x736B, 0x736B, 0x2BC9, 0x736C, 0x736C, 0x2BC7, 0x736E, 0x736F, 0x2DA3,
+    0x7370, 0x7370, 0x140E, 0x7371, 0x7371, 0x3F98, 0x7372, 0x7372, 0x140F,
+    0x7373, 0x7373, 0x2DA2, 0x7374, 0x7374, 0x3ED4, 0x7375, 0x7375, 0x14F3,
+    0x7376, 0x7376, 0x2F55, 0x7377, 0x7377, 0x14F2, 0x7378, 0x7378, 0x1595,
+    0x737A, 0x737A, 0x1596, 0x737B, 0x737B, 0x1620, 0x737C, 0x737C, 0x31F8,
+    0x737D, 0x737D, 0x31F7, 0x737E, 0x737E, 0x32E2, 0x737F, 0x737F, 0x3390,
+    0x7380, 0x7380, 0x16CA, 0x7381, 0x7381, 0x3426, 0x7382, 0x7382, 0x3425,
+    0x7383, 0x7383, 0x3427, 0x7384, 0x7384, 0x0356, 0x7385, 0x7385, 0x1B7D,
+    0x7386, 0x7386, 0x092A, 0x7387, 0x7387, 0x0B1F, 0x7388, 0x7388, 0x1F8E,
+    0x7389, 0x7389, 0x0357, 0x738A, 0x738A, 0x17B1, 0x738B, 0x738B, 0x02EE,
+    0x738E, 0x738E, 0x180E, 0x738F, 0x738F, 0x46E5, 0x7392, 0x7392, 0x18D1,
+    0x7393, 0x7394, 0x18CF, 0x7395, 0x7395, 0x18CD, 0x7396, 0x7396, 0x04EF,
+    0x7397, 0x7397, 0x18CE, 0x7398, 0x7398, 0x39F6, 0x739C, 0x739C, 0x408A,
+    0x739D, 0x739D, 0x1A0C, 0x739E, 0x739E, 0x395B, 0x739F, 0x739F, 0x0652,
+    0x73A0, 0x73A0, 0x1A0A, 0x73A1, 0x73A1, 0x1A06, 0x73A2, 0x73A2, 0x1A09,
+    0x73A4, 0x73A4, 0x1A05, 0x73A5, 0x73A5, 0x0654, 0x73A6, 0x73A6, 0x1A08,
+    0x73A7, 0x73A7, 0x4087, 0x73A8, 0x73A8, 0x0651, 0x73A9, 0x73A9, 0x0650,
+    0x73AA, 0x73AA, 0x428D, 0x73AB, 0x73AB, 0x0653, 0x73AC, 0x73AC, 0x1A0B,
+    0x73AD, 0x73AD, 0x1A07, 0x73B2, 0x73B2, 0x079B, 0x73B3, 0x73B3, 0x079E,
+    0x73B4, 0x73B4, 0x1B85, 0x73B5, 0x73B5, 0x1B84, 0x73B6, 0x73B6, 0x1B83,
+    0x73B7, 0x73B7, 0x0798, 0x73B8, 0x73B8, 0x1B8C, 0x73B9, 0x73B9, 0x1B82,
+    0x73BB, 0x73BB, 0x079A, 0x73BC, 0x73BC, 0x1D3D, 0x73BE, 0x73BE, 0x1B89,
+    0x73BF, 0x73BF, 0x1B87, 0x73C0, 0x73C0, 0x079D, 0x73C2, 0x73C2, 0x1B7F,
+    0x73C3, 0x73C3, 0x1B8A, 0x73C5, 0x73C5, 0x1B81, 0x73C6, 0x73C6, 0x1B8B,
+    0x73C7, 0x73C7, 0x1B88, 0x73C8, 0x73C8, 0x1B80, 0x73C9, 0x73C9, 0x4290,
+    0x73CA, 0x73CA, 0x0799, 0x73CB, 0x73CB, 0x1B8D, 0x73CC, 0x73CC, 0x1B7E,
+    0x73CD, 0x73CD, 0x079C, 0x73CE, 0x73CE, 0x411B, 0x73CF, 0x73CF, 0x428C,
+    0x73D0, 0x73D0, 0x3B17, 0x73D2, 0x73D2, 0x1D42, 0x73D3, 0x73D3, 0x1D39,
+    0x73D4, 0x73D4, 0x1D44, 0x73D5, 0x73D5, 0x4073, 0x73D6, 0x73D6, 0x1D3C,
+    0x73D7, 0x73D8, 0x1D47, 0x73D9, 0x73D9, 0x1D3A, 0x73DA, 0x73DA, 0x1D46,
+    0x73DB, 0x73DB, 0x1D43, 0x73DC, 0x73DC, 0x1D41, 0x73DD, 0x73DD, 0x1D45,
+    0x73DE, 0x73DE, 0x0930, 0x73E0, 0x73E0, 0x092E, 0x73E1, 0x73E1, 0x46F0,
+    0x73E2, 0x73E2, 0x3CA3, 0x73E3, 0x73E3, 0x1D3F, 0x73E4, 0x73E4, 0x42A5,
+    0x73E5, 0x73E5, 0x1D3B, 0x73E6, 0x73E6, 0x3CBA, 0x73E7, 0x73E7, 0x1D3E,
+    0x73E8, 0x73E8, 0x1D49, 0x73E9, 0x73E9, 0x1D40, 0x73EA, 0x73EA, 0x092F,
+    0x73EB, 0x73EB, 0x1B86, 0x73ED, 0x73ED, 0x092B, 0x73EE, 0x73EE, 0x092D,
+    0x73EF, 0x73EF, 0x4011, 0x73F3, 0x73F3, 0x3CAB, 0x73F4, 0x73F4, 0x1F9C,
+    0x73F5, 0x73F5, 0x1F91, 0x73F6, 0x73F6, 0x1F8F, 0x73F7, 0x73F7, 0x429A,
+    0x73F8, 0x73F8, 0x1F90, 0x73F9, 0x73F9, 0x3BF9, 0x73FA, 0x73FA, 0x1F97,
+    0x73FB, 0x73FB, 0x3CAC, 0x73FC, 0x73FC, 0x1F98, 0x73FD, 0x73FD, 0x1F94,
+    0x73FE, 0x73FE, 0x0B24, 0x73FF, 0x73FF, 0x1F99, 0x7400, 0x7400, 0x1F96,
+    0x7401, 0x7401, 0x1F93, 0x7403, 0x7403, 0x0B22, 0x7404, 0x7404, 0x1F92,
+    0x7405, 0x7405, 0x0B20, 0x7406, 0x7406, 0x0B23, 0x7407, 0x7407, 0x1F95,
+    0x7408, 0x7408, 0x1F9D, 0x7409, 0x7409, 0x092C, 0x740A, 0x740A, 0x0B21,
+    0x740B, 0x740B, 0x1F9B, 0x740C, 0x740C, 0x1F9A, 0x740D, 0x740D, 0x0B25,
+    0x7411, 0x7411, 0x456C, 0x7412, 0x7412, 0x3BE6, 0x7414, 0x7414, 0x39F4,
+    0x7415, 0x7415, 0x429B, 0x7416, 0x7416, 0x2215, 0x7417, 0x7417, 0x40AD,
+    0x7419, 0x7419, 0x46F3, 0x741A, 0x741A, 0x2216, 0x741B, 0x741B, 0x0CE0,
+    0x741C, 0x741C, 0x38DD, 0x741D, 0x741D, 0x221C, 0x741E, 0x741F, 0x46F4,
+    0x7420, 0x7420, 0x221E, 0x7421, 0x7421, 0x2217, 0x7422, 0x7422, 0x0CDA,
+    0x7423, 0x7423, 0x221B, 0x7424, 0x7424, 0x221A, 0x7425, 0x7425, 0x0CDB,
+    0x7426, 0x7426, 0x0CE1, 0x7428, 0x7428, 0x0CE2, 0x7429, 0x7429, 0x221D,
+    0x742A, 0x742A, 0x0CD8, 0x742B, 0x742B, 0x2214, 0x742C, 0x742C, 0x2212,
+    0x742D, 0x742D, 0x2218, 0x742E, 0x742E, 0x2211, 0x742F, 0x742F, 0x0CDF,
+    0x7430, 0x7430, 0x2213, 0x7431, 0x7431, 0x2219, 0x7432, 0x7432, 0x221F,
+    0x7433, 0x7433, 0x0CD9, 0x7434, 0x7434, 0x0CDE, 0x7435, 0x7436, 0x0CDC,
+    0x7437, 0x7437, 0x3AE1, 0x7438, 0x7438, 0x3B09, 0x7439, 0x7439, 0x429E,
+    0x743A, 0x743A, 0x0CD7, 0x743C, 0x743C, 0x3ADF, 0x743F, 0x743F, 0x0E81,
+    0x7440, 0x7440, 0x24A0, 0x7441, 0x7441, 0x0E80, 0x7442, 0x7442, 0x24A4,
+    0x7443, 0x7443, 0x3A1A, 0x7444, 0x7444, 0x249A, 0x7445, 0x7445, 0x3BD7,
+    0x7446, 0x7446, 0x24A5, 0x7447, 0x7447, 0x42A4, 0x7448, 0x7448, 0x3CB5,
+    0x7449, 0x7449, 0x4291, 0x744A, 0x744B, 0x249B, 0x744D, 0x744D, 0x24A6,
+    0x744E, 0x744E, 0x24A3, 0x744F, 0x7450, 0x24A1, 0x7451, 0x7451, 0x249E,
+    0x7452, 0x7452, 0x249D, 0x7453, 0x7453, 0x4231, 0x7454, 0x7454, 0x24A7,
+    0x7455, 0x7455, 0x0E7D, 0x7456, 0x7456, 0x39F5, 0x7457, 0x7457, 0x249F,
+    0x7459, 0x7459, 0x0E82, 0x745A, 0x745A, 0x0E7C, 0x745B, 0x745C, 0x0E83,
+    0x745D, 0x745D, 0x42C6, 0x745E, 0x745E, 0x0E7F, 0x745F, 0x745F, 0x0E7E,
+    0x7460, 0x7460, 0x42A2, 0x7462, 0x7462, 0x272B, 0x7463, 0x7463, 0x102D,
+    0x7464, 0x7464, 0x102C, 0x7465, 0x7465, 0x4101, 0x7467, 0x7467, 0x2730,
+    0x7468, 0x7468, 0x3AEE, 0x7469, 0x7469, 0x11A6, 0x746A, 0x746A, 0x102E,
+    0x746B, 0x746B, 0x3BE7, 0x746C, 0x746C, 0x42A8, 0x746D, 0x746D, 0x1030,
+    0x746E, 0x746E, 0x2731, 0x746F, 0x746F, 0x0E7B, 0x7470, 0x7470, 0x102F,
+    0x7471, 0x7471, 0x272D, 0x7472, 0x7472, 0x272F, 0x7473, 0x7473, 0x272C,
+    0x7474, 0x7474, 0x42A9, 0x7475, 0x7475, 0x272E, 0x7476, 0x7476, 0x42A6,
+    0x7479, 0x7479, 0x297C, 0x747A, 0x747A, 0x3AD1, 0x747C, 0x747C, 0x297B,
+    0x747D, 0x747D, 0x2978, 0x747E, 0x747E, 0x11A9, 0x747F, 0x747F, 0x2BCB,
+    0x7480, 0x7480, 0x11AA, 0x7481, 0x7481, 0x2977, 0x7482, 0x7482, 0x42AC,
+    0x7483, 0x7483, 0x11A8, 0x7485, 0x7485, 0x2979, 0x7486, 0x7486, 0x2976,
+    0x7487, 0x7487, 0x2973, 0x7488, 0x7488, 0x297A, 0x7489, 0x748A, 0x2974,
+    0x748B, 0x748B, 0x11A7, 0x748C, 0x748C, 0x3A21, 0x748D, 0x748D, 0x469D,
+    0x7490, 0x7490, 0x2DA8, 0x7492, 0x7492, 0x2BCF, 0x7494, 0x7494, 0x2BCE,
+    0x7495, 0x7495, 0x2BD0, 0x7497, 0x7497, 0x2DA5, 0x7498, 0x7498, 0x12FC,
+    0x7499, 0x7499, 0x39F3, 0x749A, 0x749A, 0x2BCC, 0x749B, 0x749B, 0x3B0A,
+    0x749C, 0x749C, 0x12FA, 0x749E, 0x749E, 0x12FE, 0x749F, 0x749F, 0x12FD,
+    0x74A0, 0x74A0, 0x2BCD, 0x74A1, 0x74A1, 0x2BD1, 0x74A3, 0x74A3, 0x12FB,
+    0x74A4, 0x74A4, 0x4170, 0x74A5, 0x74A5, 0x2DAC, 0x74A6, 0x74A6, 0x1412,
+    0x74A7, 0x74A7, 0x14F4, 0x74A8, 0x74A8, 0x1413, 0x74A9, 0x74A9, 0x1410,
+    0x74AA, 0x74AA, 0x2DA9, 0x74AB, 0x74AB, 0x2DA7, 0x74AD, 0x74AD, 0x2DAA,
+    0x74AF, 0x74AF, 0x2DAD, 0x74B0, 0x74B0, 0x1411, 0x74B1, 0x74B1, 0x2DAB,
+    0x74B2, 0x74B2, 0x2DA6, 0x74B4, 0x74B4, 0x3CA5, 0x74B5, 0x74B5, 0x2F58,
+    0x74B6, 0x74B6, 0x2F5B, 0x74B7, 0x74B7, 0x30C2, 0x74B8, 0x74B8, 0x2F56,
+    0x74BA, 0x74BA, 0x31F9, 0x74BB, 0x74BB, 0x2F5C, 0x74BD, 0x74BD, 0x1597,
+    0x74BE, 0x74BE, 0x2F5A, 0x74BF, 0x74BF, 0x14F5, 0x74C0, 0x74C0, 0x2F57,
+    0x74C1, 0x74C1, 0x2F59, 0x74C2, 0x74C2, 0x2F5D, 0x74C3, 0x74C3, 0x30C3,
+    0x74C5, 0x74C5, 0x30C1, 0x74C8, 0x74C8, 0x42B5, 0x74CA, 0x74CA, 0x1598,
+    0x74CB, 0x74CB, 0x30C0, 0x74CC, 0x74CC, 0x3ADE, 0x74CF, 0x74CF, 0x1621,
+    0x74D0, 0x74D0, 0x3A9B, 0x74D3, 0x74D3, 0x46FA, 0x74D4, 0x74D4, 0x167E,
+    0x74D5, 0x74D5, 0x3392, 0x74D6, 0x74D6, 0x167D, 0x74D7, 0x74D7, 0x3394,
+    0x74D8, 0x74D8, 0x3391, 0x74D9, 0x74D9, 0x3393, 0x74DA, 0x74DA, 0x16FE,
+    0x74DB, 0x74DB, 0x348D, 0x74DC, 0x74DC, 0x0358, 0x74DD, 0x74DD, 0x1A0D,
+    0x74DE, 0x74DF, 0x1D4A, 0x74E0, 0x74E0, 0x0B26, 0x74E1, 0x74E1, 0x24A8,
+    0x74E2, 0x74E2, 0x12FF, 0x74E3, 0x74E3, 0x1599, 0x74E4, 0x74E4, 0x16CB,
+    0x74E5, 0x74E5, 0x348E, 0x74E6, 0x74E6, 0x0359, 0x74E7, 0x74E7, 0x3FFE,
+    0x74E8, 0x74E8, 0x1A0E, 0x74E9, 0x74E9, 0x0120, 0x74EC, 0x74EC, 0x1B8E,
+    0x74EE, 0x74EE, 0x1B8F, 0x74F0, 0x74F0, 0x3FE6, 0x74F1, 0x74F1, 0x3F9B,
+    0x74F2, 0x74F2, 0x3FDF, 0x74F4, 0x74F5, 0x1D4C, 0x74F6, 0x74F7, 0x0B27,
+    0x74F8, 0x74F8, 0x3FF4, 0x74FB, 0x74FB, 0x2220, 0x74FD, 0x74FD, 0x24AB,
+    0x74FE, 0x74FE, 0x24AA, 0x74FF, 0x74FF, 0x24A9, 0x7500, 0x7500, 0x2732,
+    0x7502, 0x7503, 0x2733, 0x7504, 0x7504, 0x1031, 0x7505, 0x7505, 0x3FDE,
+    0x7507, 0x7507, 0x297E, 0x7508, 0x7508, 0x297D, 0x750B, 0x750B, 0x2BD2,
+    0x750C, 0x750D, 0x1300, 0x750E, 0x750E, 0x42B7, 0x750F, 0x750F, 0x2DB1,
+    0x7510, 0x7512, 0x2DAE, 0x7513, 0x7513, 0x2F5F, 0x7514, 0x7514, 0x2F5E,
+    0x7515, 0x7515, 0x14F6, 0x7516, 0x7516, 0x30C4, 0x7517, 0x7517, 0x32E3,
+    0x7518, 0x7518, 0x035A, 0x7519, 0x7519, 0x4583, 0x751A, 0x751A, 0x079F,
+    0x751C, 0x751C, 0x0B29, 0x751D, 0x751D, 0x24AC, 0x751E, 0x751E, 0x42B8,
+    0x751F, 0x751F, 0x035B, 0x7521, 0x7521, 0x1D4E, 0x7522, 0x7522, 0x0B2A,
+    0x7525, 0x7526, 0x0CE3, 0x7528, 0x7529, 0x035C, 0x752A, 0x752A, 0x180F,
+    0x752B, 0x752B, 0x04F1, 0x752C, 0x752C, 0x04F0, 0x752D, 0x752D, 0x07A0,
+    0x752E, 0x752E, 0x1B90, 0x752F, 0x752F, 0x2221, 0x7530, 0x7533, 0x035E,
+    0x7534, 0x7534, 0x3E87, 0x7535, 0x7535, 0x455A, 0x7537, 0x7538, 0x04F2,
+    0x7539, 0x7539, 0x18D3, 0x753A, 0x753A, 0x18D2, 0x753B, 0x753B, 0x3DFB,
+    0x753D, 0x753D, 0x0655, 0x753E, 0x753E, 0x1A11, 0x753F, 0x7540, 0x1A0F,
+    0x7542, 0x7542, 0x43CD, 0x7546, 0x7546, 0x3F40, 0x7547, 0x7548, 0x1B91,
+    0x754A, 0x754A, 0x42BF, 0x754B, 0x754B, 0x07A4, 0x754C, 0x754C, 0x07A2,
+    0x754D, 0x754D, 0x42BE, 0x754E, 0x754E, 0x07A3, 0x754F, 0x754F, 0x07A1,
+    0x7551, 0x7551, 0x3CFE, 0x7553, 0x7553, 0x3FEB, 0x7554, 0x7554, 0x0931,
+    0x7555, 0x7555, 0x3AEA, 0x7559, 0x7559, 0x0935, 0x755A, 0x755A, 0x0934,
+    0x755B, 0x755B, 0x1D4F, 0x755C, 0x755C, 0x0933, 0x755D, 0x755D, 0x0932,
+    0x755F, 0x755F, 0x1D50, 0x7560, 0x7560, 0x3D71, 0x7562, 0x7562, 0x0B2D,
+    0x7563, 0x7563, 0x1F9F, 0x7564, 0x7564, 0x1F9E, 0x7565, 0x7566, 0x0B2B,
+    0x7567, 0x7567, 0x42C0, 0x756A, 0x756A, 0x0CE6, 0x756B, 0x756B, 0x0CE5,
+    0x756C, 0x756C, 0x2223, 0x756D, 0x756D, 0x46FD, 0x756E, 0x756E, 0x42C1,
+    0x756F, 0x756F, 0x2222, 0x7570, 0x7570, 0x0B2E, 0x7572, 0x7572, 0x46FE,
+    0x7576, 0x7576, 0x0E85, 0x7577, 0x7577, 0x24AE, 0x7578, 0x7578, 0x0E86,
+    0x7579, 0x7579, 0x24AD, 0x757A, 0x757A, 0x3F4F, 0x757D, 0x757D, 0x2735,
+    0x757E, 0x757E, 0x297F, 0x757F, 0x757F, 0x11AB, 0x7580, 0x7580, 0x2BD3,
+    0x7583, 0x7583, 0x3AE5, 0x7584, 0x7584, 0x2DB2, 0x7586, 0x7586, 0x159B,
+    0x7587, 0x7587, 0x159A, 0x758A, 0x758A, 0x16CC, 0x758B, 0x758B, 0x0362,
+    0x758C, 0x758C, 0x1A12, 0x758D, 0x758D, 0x46FF, 0x758E, 0x758E, 0x42C5,
+    0x758F, 0x758F, 0x0B2F, 0x7590, 0x7590, 0x2736, 0x7591, 0x7591, 0x1032,
+    0x7592, 0x7592, 0x022E, 0x7594, 0x7595, 0x18D4, 0x7598, 0x7598, 0x1A13,
+    0x7599, 0x759A, 0x0657, 0x759D, 0x759D, 0x0656, 0x759E, 0x759E, 0x42C7,
+    0x75A2, 0x75A3, 0x07A8, 0x75A4, 0x75A5, 0x07A6, 0x75A7, 0x75A7, 0x1B93,
+    0x75AA, 0x75AA, 0x1B94, 0x75AB, 0x75AB, 0x07A5, 0x75B0, 0x75B0, 0x1D51,
+    0x75B1, 0x75B1, 0x3EAD, 0x75B2, 0x75B3, 0x0939, 0x75B4, 0x75B4, 0x42C8,
+    0x75B5, 0x75B5, 0x0B32, 0x75B6, 0x75B6, 0x1D57, 0x75B8, 0x75B8, 0x093F,
+    0x75B9, 0x75B9, 0x093D, 0x75BA, 0x75BA, 0x1D58, 0x75BB, 0x75BB, 0x1D53,
+    0x75BC, 0x75BC, 0x093C, 0x75BD, 0x75BD, 0x093B, 0x75BE, 0x75BE, 0x0936,
+    0x75BF, 0x75BF, 0x1D56, 0x75C0, 0x75C0, 0x1D55, 0x75C1, 0x75C1, 0x1D52,
+    0x75C2, 0x75C2, 0x093E, 0x75C3, 0x75C3, 0x3F93, 0x75C4, 0x75C4, 0x1D54,
+    0x75C5, 0x75C5, 0x0937, 0x75C7, 0x75C7, 0x0938, 0x75C8, 0x75C8, 0x4701,
+    0x75CA, 0x75CA, 0x0B33, 0x75CB, 0x75CC, 0x1FA3, 0x75CD, 0x75CD, 0x0B34,
+    0x75CE, 0x75CE, 0x1FA0, 0x75CF, 0x75CF, 0x1FA2, 0x75D0, 0x75D0, 0x1FA6,
+    0x75D1, 0x75D1, 0x1FA5, 0x75D2, 0x75D2, 0x1FA1, 0x75D4, 0x75D5, 0x0B30,
+    0x75D7, 0x75D7, 0x222B, 0x75D8, 0x75D8, 0x0CEB, 0x75D9, 0x75D9, 0x0CEA,
+    0x75DA, 0x75DA, 0x2225, 0x75DB, 0x75DB, 0x0CE8, 0x75DC, 0x75DC, 0x43CE,
+    0x75DD, 0x75DD, 0x2228, 0x75DE, 0x75DE, 0x0CEC, 0x75DF, 0x75DF, 0x2229,
+    0x75E0, 0x75E0, 0x0CED, 0x75E1, 0x75E1, 0x2226, 0x75E2, 0x75E2, 0x0CE7,
+    0x75E3, 0x75E3, 0x0CE9, 0x75E4, 0x75E4, 0x222A, 0x75E6, 0x75E6, 0x2227,
+    0x75E7, 0x75E7, 0x2224, 0x75ED, 0x75ED, 0x24BB, 0x75EF, 0x75EF, 0x24B0,
+    0x75F0, 0x75F0, 0x0E88, 0x75F1, 0x75F1, 0x0E8B, 0x75F2, 0x75F2, 0x0E8A,
+    0x75F3, 0x75F3, 0x0E8F, 0x75F4, 0x75F4, 0x0E8E, 0x75F5, 0x75F5, 0x24BC,
+    0x75F6, 0x75F6, 0x24BA, 0x75F7, 0x75F7, 0x24B3, 0x75F8, 0x75F8, 0x24B7,
+    0x75F9, 0x75F9, 0x24B6, 0x75FA, 0x75FA, 0x0E8C, 0x75FB, 0x75FB, 0x24B9,
+    0x75FC, 0x75FC, 0x24B5, 0x75FD, 0x75FD, 0x24BD, 0x75FE, 0x75FE, 0x24B4,
+    0x75FF, 0x75FF, 0x0E8D, 0x7600, 0x7600, 0x0E87, 0x7601, 0x7601, 0x0E89,
+    0x7602, 0x7602, 0x42C9, 0x7603, 0x7603, 0x24B2, 0x7607, 0x7607, 0x3F8F,
+    0x7608, 0x7608, 0x2738, 0x7609, 0x7609, 0x1036, 0x760A, 0x760A, 0x273C,
+    0x760B, 0x760B, 0x1035, 0x760C, 0x760C, 0x2739, 0x760D, 0x760D, 0x1034,
+    0x760F, 0x760F, 0x24B1, 0x7610, 0x7610, 0x24B8, 0x7611, 0x7611, 0x273B,
+    0x7613, 0x7613, 0x1037, 0x7614, 0x7614, 0x273D, 0x7615, 0x7615, 0x273A,
+    0x7616, 0x7616, 0x2737, 0x7619, 0x7619, 0x2982, 0x761A, 0x761A, 0x2986,
+    0x761B, 0x761B, 0x2988, 0x761C, 0x761C, 0x2984, 0x761D, 0x761D, 0x2983,
+    0x761E, 0x761E, 0x2981, 0x761F, 0x761F, 0x11AE, 0x7620, 0x7620, 0x11AC,
+    0x7621, 0x7622, 0x11B1, 0x7623, 0x7623, 0x2985, 0x7624, 0x7624, 0x11AF,
+    0x7625, 0x7625, 0x2980, 0x7626, 0x7626, 0x11B0, 0x7627, 0x7627, 0x1033,
+    0x7628, 0x7628, 0x2987, 0x7629, 0x7629, 0x11AD, 0x762C, 0x762C, 0x42CA,
+    0x762D, 0x762D, 0x2BD5, 0x762F, 0x762F, 0x2BD4, 0x7630, 0x7630, 0x2BDC,
+    0x7631, 0x7631, 0x2BD6, 0x7632, 0x7632, 0x2BDB, 0x7633, 0x7633, 0x2BD8,
+    0x7634, 0x7634, 0x1302, 0x7635, 0x7635, 0x2BDA, 0x7638, 0x7638, 0x1303,
+    0x763A, 0x763A, 0x1304, 0x763B, 0x763B, 0x3E70, 0x763C, 0x763C, 0x2BD9,
+    0x763D, 0x763D, 0x2BD7, 0x7640, 0x7640, 0x3EE6, 0x7642, 0x7642, 0x1415,
+    0x7643, 0x7643, 0x2DB3, 0x7646, 0x7646, 0x1414, 0x7647, 0x7647, 0x2DB6,
+    0x7648, 0x7649, 0x2DB4, 0x764C, 0x764C, 0x1416, 0x764D, 0x764D, 0x4702,
+    0x764E, 0x764E, 0x3E72, 0x764F, 0x764F, 0x42CC, 0x7650, 0x7650, 0x2F63,
+    0x7651, 0x7651, 0x42CB, 0x7652, 0x7652, 0x14F9, 0x7653, 0x7653, 0x2F64,
+    0x7654, 0x7654, 0x3EF0, 0x7656, 0x7656, 0x14F7, 0x7657, 0x7657, 0x2F65,
+    0x7658, 0x7658, 0x14F8, 0x7659, 0x7659, 0x2F62, 0x765A, 0x765A, 0x2F66,
+    0x765C, 0x765C, 0x2F60, 0x765F, 0x765F, 0x159C, 0x7660, 0x7660, 0x30C5,
+    0x7661, 0x7661, 0x159D, 0x7662, 0x7662, 0x1622, 0x7664, 0x7664, 0x2F61,
+    0x7665, 0x7665, 0x1623, 0x7666, 0x7666, 0x3EAA, 0x7667, 0x7667, 0x3FA9,
+    0x7669, 0x7669, 0x167F, 0x766A, 0x766A, 0x32E4, 0x766C, 0x766C, 0x16CE,
+    0x766D, 0x766D, 0x3395, 0x766E, 0x766E, 0x16CD, 0x766F, 0x766F, 0x42CD,
+    0x7670, 0x7670, 0x3428, 0x7671, 0x7672, 0x1723, 0x7673, 0x7673, 0x3AEB,
+    0x7674, 0x7674, 0x4703, 0x7675, 0x7675, 0x3543, 0x7676, 0x7676, 0x022F,
+    0x7678, 0x7678, 0x07AA, 0x7679, 0x7679, 0x1B95, 0x767A, 0x767A, 0x4705,
+    0x767B, 0x767C, 0x0CEE, 0x767D, 0x767D, 0x0363, 0x767E, 0x767E, 0x03F5,
+    0x767F, 0x767F, 0x1810, 0x7680, 0x7680, 0x43D3, 0x7681, 0x7681, 0x18D6,
+    0x7682, 0x7682, 0x04F4, 0x7684, 0x7684, 0x0659, 0x7686, 0x7688, 0x07AB,
+    0x7689, 0x7689, 0x1FA8, 0x768A, 0x768A, 0x1D59, 0x768B, 0x768B, 0x0940,
+    0x768C, 0x768C, 0x43D4, 0x768E, 0x768E, 0x0B35, 0x768F, 0x768F, 0x1FA7,
+    0x7690, 0x7690, 0x42D0, 0x7692, 0x7692, 0x222D, 0x7693, 0x7693, 0x0CF1,
+    0x7695, 0x7695, 0x222C, 0x7696, 0x7696, 0x0CF0, 0x7699, 0x7699, 0x24BE,
+    0x769A, 0x769A, 0x11B3, 0x769B, 0x769B, 0x298C, 0x769C, 0x769E, 0x2989,
+    0x76A1, 0x76A1, 0x42D5, 0x76A4, 0x76A4, 0x2DB7, 0x76A5, 0x76A5, 0x42D6,
+    0x76A6, 0x76A6, 0x2F67, 0x76AA, 0x76AA, 0x31FB, 0x76AB, 0x76AB, 0x31FA,
+    0x76AD, 0x76AD, 0x3396, 0x76AE, 0x76AE, 0x0364, 0x76AF, 0x76AF, 0x1A14,
+    0x76B0, 0x76B0, 0x0941, 0x76B4, 0x76B4, 0x0CF2, 0x76B5, 0x76B5, 0x24BF,
+    0x76B7, 0x76B7, 0x42D7, 0x76B8, 0x76B8, 0x273E, 0x76BA, 0x76BA, 0x11B4,
+    0x76BB, 0x76BB, 0x2BDD, 0x76BD, 0x76BD, 0x2F68, 0x76BE, 0x76BE, 0x31FC,
+    0x76BF, 0x76BF, 0x0365, 0x76C2, 0x76C2, 0x065A, 0x76C3, 0x76C3, 0x07B0,
+    0x76C4, 0x76C4, 0x1B96, 0x76C5, 0x76C5, 0x07B1, 0x76C6, 0x76C6, 0x07AF,
+    0x76C8, 0x76C8, 0x07AE, 0x76C9, 0x76C9, 0x1D5A, 0x76CA, 0x76CA, 0x0942,
+    0x76CC, 0x76CC, 0x42D8, 0x76CD, 0x76CE, 0x0943, 0x76D2, 0x76D2, 0x0B37,
+    0x76D3, 0x76D3, 0x1FA9, 0x76D4, 0x76D4, 0x0B36, 0x76D6, 0x76D6, 0x3F55,
+    0x76DA, 0x76DA, 0x222E, 0x76DB, 0x76DB, 0x0B38, 0x76DC, 0x76DC, 0x0CF3,
+    0x76DD, 0x76DD, 0x24C0, 0x76DE, 0x76DF, 0x0E90, 0x76E1, 0x76E1, 0x1038,
+    0x76E3, 0x76E3, 0x1039, 0x76E4, 0x76E4, 0x11B5, 0x76E5, 0x76E5, 0x1306,
+    0x76E6, 0x76E6, 0x2BDE, 0x76E7, 0x76E7, 0x1305, 0x76E9, 0x76E9, 0x2DB8,
+    0x76EA, 0x76EA, 0x1417, 0x76EC, 0x76EC, 0x2F69, 0x76ED, 0x76ED, 0x31FD,
+    0x76EE, 0x76EE, 0x0366, 0x76EF, 0x76EF, 0x04F5, 0x76F0, 0x76F0, 0x1A17,
+    0x76F1, 0x76F1, 0x1A16, 0x76F2, 0x76F2, 0x065B, 0x76F3, 0x76F3, 0x1A15,
+    0x76F4, 0x76F4, 0x065C, 0x76F5, 0x76F5, 0x1A18, 0x76F7, 0x76F7, 0x1B9C,
+    0x76F8, 0x76F8, 0x07B4, 0x76F9, 0x76F9, 0x07B3, 0x76FA, 0x76FA, 0x1B9E,
+    0x76FB, 0x76FB, 0x1B9D, 0x76FC, 0x76FC, 0x07B8, 0x76FE, 0x76FE, 0x07B7,
+    0x7701, 0x7701, 0x07B2, 0x7703, 0x7705, 0x1B98, 0x7707, 0x7707, 0x07B9,
+    0x7708, 0x7708, 0x1B97, 0x7709, 0x7709, 0x07B5, 0x770A, 0x770A, 0x1B9B,
+    0x770B, 0x770B, 0x07B6, 0x770C, 0x770C, 0x3D62, 0x770E, 0x770F, 0x3B02,
+    0x7710, 0x7710, 0x1D5D, 0x7711, 0x7711, 0x1D61, 0x7712, 0x7712, 0x1D5F,
+    0x7713, 0x7713, 0x1D5E, 0x7715, 0x7715, 0x1D62, 0x7719, 0x771A, 0x1D63,
+    0x771B, 0x771B, 0x1D5C, 0x771D, 0x771D, 0x1D5B, 0x771E, 0x771E, 0x42DE,
+    0x771F, 0x7720, 0x0946, 0x7722, 0x7722, 0x1D65, 0x7723, 0x7723, 0x1D60,
+    0x7724, 0x7724, 0x3FE8, 0x7725, 0x7725, 0x1FB2, 0x7726, 0x7726, 0x42DF,
+    0x7727, 0x7727, 0x1D66, 0x7728, 0x7728, 0x0948, 0x7729, 0x7729, 0x0945,
+    0x772B, 0x772B, 0x3FF3, 0x772D, 0x772D, 0x1FAC, 0x772F, 0x772F, 0x1FAB,
+    0x7731, 0x7732, 0x1FAD, 0x7733, 0x7733, 0x1FB0, 0x7734, 0x7734, 0x1FAF,
+    0x7735, 0x7735, 0x1FB4, 0x7736, 0x7736, 0x0B3C, 0x7737, 0x7737, 0x0B39,
+    0x7738, 0x7738, 0x0B3D, 0x7739, 0x7739, 0x1FAA, 0x773A, 0x773A, 0x0B3E,
+    0x773B, 0x773B, 0x1FB3, 0x773C, 0x773C, 0x0B3B, 0x773D, 0x773D, 0x1FB1,
+    0x773E, 0x773E, 0x0B3A, 0x7740, 0x7740, 0x42E0, 0x7743, 0x7743, 0x470A,
+    0x7744, 0x7744, 0x2231, 0x7745, 0x7745, 0x2233, 0x7746, 0x7747, 0x222F,
+    0x774A, 0x774A, 0x2234, 0x774B, 0x774C, 0x2236, 0x774D, 0x774D, 0x2232,
+    0x774E, 0x774E, 0x2235, 0x774F, 0x774F, 0x0CF4, 0x7752, 0x7752, 0x24C4,
+    0x7754, 0x7754, 0x24C9, 0x7755, 0x7755, 0x24C1, 0x7756, 0x7756, 0x24C5,
+    0x7758, 0x7758, 0x42E3, 0x7759, 0x7759, 0x24CA, 0x775A, 0x775A, 0x24C6,
+    0x775B, 0x775B, 0x0E92, 0x775C, 0x775C, 0x0E9A, 0x775E, 0x775E, 0x0E95,
+    0x775F, 0x7760, 0x24C2, 0x7761, 0x7761, 0x103D, 0x7762, 0x7762, 0x0E9D,
+    0x7763, 0x7763, 0x0E96, 0x7765, 0x7765, 0x0E9B, 0x7766, 0x7766, 0x0E94,
+    0x7767, 0x7767, 0x24C8, 0x7768, 0x7768, 0x0E9C, 0x7769, 0x7769, 0x24C7,
+    0x776A, 0x776A, 0x0E98, 0x776B, 0x776B, 0x0E93, 0x776C, 0x776C, 0x0E99,
+    0x776D, 0x776D, 0x24CB, 0x776E, 0x776E, 0x2743, 0x776F, 0x776F, 0x2745,
+    0x7772, 0x7772, 0x396B, 0x7777, 0x7777, 0x46A9, 0x7778, 0x7778, 0x3B00,
+    0x7779, 0x7779, 0x0E97, 0x777A, 0x777A, 0x4317, 0x777B, 0x777B, 0x3B04,
+    0x777C, 0x777C, 0x2740, 0x777D, 0x777D, 0x103B, 0x777E, 0x777E, 0x2746,
+    0x777F, 0x777F, 0x103C, 0x7780, 0x7780, 0x2744, 0x7781, 0x7781, 0x273F,
+    0x7782, 0x7782, 0x2742, 0x7783, 0x7783, 0x2747, 0x7784, 0x7784, 0x103A,
+    0x7785, 0x7785, 0x2741, 0x7787, 0x7787, 0x11B7, 0x7788, 0x7788, 0x2990,
+    0x7789, 0x7789, 0x298F, 0x778B, 0x778B, 0x11BA, 0x778C, 0x778C, 0x11B8,
+    0x778D, 0x778D, 0x298D, 0x778E, 0x778E, 0x11B6, 0x778F, 0x778F, 0x298E,
+    0x7791, 0x7791, 0x11B9, 0x7793, 0x7793, 0x382D, 0x7795, 0x7795, 0x2BE6,
+    0x7797, 0x7797, 0x2BE8, 0x7798, 0x7798, 0x470E, 0x7799, 0x7799, 0x2BE7,
+    0x779A, 0x779A, 0x2BDF, 0x779B, 0x779B, 0x2BE3, 0x779C, 0x779C, 0x2BE2,
+    0x779D, 0x779D, 0x2BE0, 0x779E, 0x779F, 0x1308, 0x77A0, 0x77A0, 0x1307,
+    0x77A1, 0x77A1, 0x2BE1, 0x77A2, 0x77A3, 0x2BE4, 0x77A5, 0x77A5, 0x130A,
+    0x77A7, 0x77A7, 0x141C, 0x77A8, 0x77A8, 0x2DC0, 0x77AA, 0x77AA, 0x1419,
+    0x77AB, 0x77AB, 0x2DBA, 0x77AC, 0x77AC, 0x141B, 0x77AD, 0x77AD, 0x141D,
+    0x77AF, 0x77AF, 0x42E5, 0x77B0, 0x77B0, 0x141A, 0x77B1, 0x77B1, 0x2DBF,
+    0x77B2, 0x77B2, 0x2DBB, 0x77B3, 0x77B3, 0x1418, 0x77B4, 0x77B4, 0x2DBE,
+    0x77B5, 0x77B5, 0x2DB9, 0x77B6, 0x77B6, 0x2DBD, 0x77B7, 0x77B7, 0x2DBC,
+    0x77B9, 0x77B9, 0x3E73, 0x77BA, 0x77BA, 0x2F6B, 0x77BB, 0x77BC, 0x14FC,
+    0x77BD, 0x77BD, 0x14FA, 0x77BE, 0x77BE, 0x4711, 0x77BF, 0x77BF, 0x14FB,
+    0x77C2, 0x77C2, 0x2F6A, 0x77C3, 0x77C3, 0x3BB1, 0x77C4, 0x77C4, 0x30C8,
+    0x77C5, 0x77C5, 0x41C1, 0x77C7, 0x77C7, 0x159E, 0x77C9, 0x77CA, 0x30C6,
+    0x77CB, 0x77CB, 0x4712, 0x77CC, 0x77CC, 0x31FE, 0x77CD, 0x77CD, 0x3201,
+    0x77CE, 0x77CF, 0x31FF, 0x77D0, 0x77D0, 0x32E5, 0x77D3, 0x77D3, 0x1680,
+    0x77D4, 0x77D4, 0x3429, 0x77D5, 0x77D5, 0x348F, 0x77D7, 0x77D7, 0x1725,
+    0x77D8, 0x77D9, 0x34D3, 0x77DA, 0x77DA, 0x1753, 0x77DB, 0x77DB, 0x0367,
+    0x77DC, 0x77DC, 0x07BA, 0x77DE, 0x77DE, 0x2238, 0x77E0, 0x77E0, 0x24CC,
+    0x77E2, 0x77E2, 0x0368, 0x77E3, 0x77E3, 0x04F6, 0x77E5, 0x77E5, 0x065D,
+    0x77E6, 0x77E6, 0x4081, 0x77E7, 0x77E8, 0x1B9F, 0x77E9, 0x77E9, 0x0949,
+    0x77EC, 0x77EC, 0x2239, 0x77ED, 0x77ED, 0x0CF5, 0x77EE, 0x77EE, 0x0E9E,
+    0x77EF, 0x77EF, 0x141E, 0x77F0, 0x77F0, 0x2DC1, 0x77F1, 0x77F1, 0x30C9,
+    0x77F2, 0x77F2, 0x3202, 0x77F3, 0x77F3, 0x0369, 0x77F4, 0x77F4, 0x42E9,
+    0x77F7, 0x77F7, 0x1A1E, 0x77F8, 0x77F8, 0x1A19, 0x77F9, 0x77F9, 0x1A1B,
+    0x77FA, 0x77FA, 0x1A1D, 0x77FB, 0x77FB, 0x1A1C, 0x77FC, 0x77FC, 0x1A1A,
+    0x77FD, 0x77FD, 0x065E, 0x77FE, 0x77FE, 0x3FD5, 0x7802, 0x7802, 0x07BB,
+    0x7803, 0x7803, 0x1BA9, 0x7805, 0x7805, 0x1BA4, 0x7806, 0x7806, 0x1BA1,
+    0x7808, 0x7808, 0x3E46, 0x7809, 0x7809, 0x1BA8, 0x780C, 0x780D, 0x07BD,
+    0x780E, 0x780E, 0x1BA7, 0x780F, 0x780F, 0x1BA6, 0x7810, 0x7810, 0x1BA5,
+    0x7811, 0x7812, 0x1BA2, 0x7813, 0x7813, 0x1BAA, 0x7814, 0x7814, 0x07BC,
+    0x7818, 0x7818, 0x4713, 0x781C, 0x781C, 0x4714, 0x781D, 0x781D, 0x094D,
+    0x781E, 0x781E, 0x3B13, 0x781F, 0x781F, 0x0953, 0x7820, 0x7820, 0x0952,
+    0x7821, 0x7821, 0x1D6F, 0x7822, 0x7822, 0x1D69, 0x7823, 0x7823, 0x1D67,
+    0x7825, 0x7825, 0x0950, 0x7826, 0x7826, 0x1FBB, 0x7827, 0x7827, 0x094B,
+    0x7828, 0x7828, 0x1D6C, 0x7829, 0x7829, 0x1D70, 0x782A, 0x782A, 0x1D72,
+    0x782B, 0x782B, 0x1D6E, 0x782C, 0x782C, 0x1D68, 0x782D, 0x782D, 0x0951,
+    0x782E, 0x782E, 0x1D6D, 0x782F, 0x782F, 0x1D6B, 0x7830, 0x7830, 0x094A,
+    0x7831, 0x7831, 0x1D73, 0x7832, 0x7832, 0x0954, 0x7833, 0x7833, 0x1D71,
+    0x7834, 0x7834, 0x094E, 0x7835, 0x7835, 0x1D6A, 0x7837, 0x7837, 0x094F,
+    0x7838, 0x7838, 0x094C, 0x7839, 0x7839, 0x43D6, 0x783C, 0x783C, 0x401A,
+    0x783D, 0x783D, 0x3C6A, 0x7842, 0x7842, 0x3AC4, 0x7843, 0x7843, 0x0B40,
+    0x7844, 0x7844, 0x3C2B, 0x7845, 0x7845, 0x1FBC, 0x7847, 0x7847, 0x4715,
+    0x7848, 0x7848, 0x1FB5, 0x7849, 0x7849, 0x1FB7, 0x784A, 0x784A, 0x1FB9,
+    0x784B, 0x784B, 0x3C6D, 0x784C, 0x784C, 0x1FBA, 0x784D, 0x784D, 0x1FB8,
+    0x784E, 0x784E, 0x0B41, 0x7850, 0x7850, 0x1FBD, 0x7851, 0x7851, 0x4716,
+    0x7852, 0x7852, 0x1FB6, 0x7853, 0x7853, 0x3F95, 0x7854, 0x7854, 0x3C6B,
+    0x785C, 0x785C, 0x223D, 0x785D, 0x785D, 0x0CF6, 0x785E, 0x785E, 0x2245,
+    0x7860, 0x7860, 0x223A, 0x7862, 0x7862, 0x2246, 0x7864, 0x7865, 0x223B,
+    0x7866, 0x7866, 0x4717, 0x7868, 0x7868, 0x2244, 0x7869, 0x7869, 0x2243,
+    0x786A, 0x786A, 0x2240, 0x786B, 0x786B, 0x0B3F, 0x786C, 0x786C, 0x0CF7,
+    0x786D, 0x786D, 0x223E, 0x786E, 0x786E, 0x2241, 0x786F, 0x786F, 0x0CF8,
+    0x7870, 0x7870, 0x2242, 0x7871, 0x7871, 0x223F, 0x7879, 0x7879, 0x24D7,
+    0x787A, 0x787A, 0x3EE9, 0x787B, 0x787B, 0x24DB, 0x787C, 0x787C, 0x0EA5,
+    0x787E, 0x787E, 0x274D, 0x787F, 0x787F, 0x0EA8, 0x7880, 0x7880, 0x24D9,
+    0x7881, 0x7881, 0x36E8, 0x7883, 0x7883, 0x24D6, 0x7884, 0x7884, 0x24D1,
+    0x7885, 0x7886, 0x24D3, 0x7887, 0x7887, 0x24CD, 0x7888, 0x7888, 0x3B15,
+    0x7889, 0x7889, 0x0EA4, 0x788C, 0x788C, 0x0EA3, 0x788D, 0x788D, 0x3B14,
+    0x788E, 0x788E, 0x0E9F, 0x788F, 0x788F, 0x24D0, 0x7891, 0x7891, 0x0EA6,
+    0x7893, 0x7893, 0x0EA7, 0x7894, 0x7894, 0x24CF, 0x7895, 0x7895, 0x24D2,
+    0x7896, 0x7896, 0x24DA, 0x7897, 0x7898, 0x0EA1, 0x7899, 0x7899, 0x24D8,
+    0x789A, 0x789A, 0x24CE, 0x789E, 0x789E, 0x274F, 0x789F, 0x789F, 0x103F,
+    0x78A0, 0x78A0, 0x2751, 0x78A1, 0x78A1, 0x24D5, 0x78A2, 0x78A2, 0x2753,
+    0x78A3, 0x78A3, 0x1043, 0x78A4, 0x78A4, 0x2754, 0x78A5, 0x78A5, 0x2750,
+    0x78A7, 0x78A7, 0x1040, 0x78A8, 0x78A8, 0x274C, 0x78A9, 0x78A9, 0x1042,
+    0x78AA, 0x78AA, 0x2749, 0x78AB, 0x78AB, 0x274E, 0x78AC, 0x78AC, 0x2752,
+    0x78AD, 0x78AD, 0x274B, 0x78AF, 0x78AF, 0x42EC, 0x78B0, 0x78B0, 0x0EA0,
+    0x78B1, 0x78B1, 0x42F4, 0x78B2, 0x78B2, 0x2748, 0x78B3, 0x78B3, 0x1041,
+    0x78B4, 0x78B4, 0x274A, 0x78B6, 0x78B6, 0x3C6C, 0x78B8, 0x78B8, 0x4571,
+    0x78B9, 0x78B9, 0x3C63, 0x78BA, 0x78BA, 0x11BD, 0x78BB, 0x78BB, 0x2992,
+    0x78BC, 0x78BC, 0x11C1, 0x78BE, 0x78BE, 0x11BF, 0x78C1, 0x78C1, 0x103E,
+    0x78C3, 0x78C4, 0x2999, 0x78C5, 0x78C5, 0x11BC, 0x78C7, 0x78C7, 0x42ED,
+    0x78C8, 0x78C8, 0x2998, 0x78C9, 0x78C9, 0x299B, 0x78CA, 0x78CA, 0x11BE,
+    0x78CB, 0x78CB, 0x11BB, 0x78CC, 0x78CC, 0x2994, 0x78CD, 0x78CD, 0x2991,
+    0x78CE, 0x78CE, 0x2996, 0x78CF, 0x78CF, 0x2993, 0x78D0, 0x78D0, 0x11C2,
+    0x78D1, 0x78D1, 0x2995, 0x78D2, 0x78D2, 0x3B16, 0x78D3, 0x78D3, 0x42EE,
+    0x78D4, 0x78D4, 0x2997, 0x78D5, 0x78D5, 0x11C0, 0x78D7, 0x78D7, 0x42F2,
+    0x78D8, 0x78D8, 0x3F8C, 0x78DA, 0x78DA, 0x130C, 0x78DB, 0x78DB, 0x2BEF,
+    0x78DD, 0x78DD, 0x2BE9, 0x78DE, 0x78DE, 0x2BED, 0x78DF, 0x78E0, 0x2BF3,
+    0x78E1, 0x78E2, 0x2BF0, 0x78E3, 0x78E3, 0x2BEE, 0x78E5, 0x78E5, 0x2BEB,
+    0x78E7, 0x78E7, 0x130E, 0x78E8, 0x78E8, 0x130B, 0x78E9, 0x78E9, 0x2BEA,
+    0x78EA, 0x78EA, 0x2BEC, 0x78EC, 0x78EC, 0x130D, 0x78ED, 0x78ED, 0x2BF2,
+    0x78EE, 0x78EE, 0x3A81, 0x78EF, 0x78EF, 0x1422, 0x78F0, 0x78F0, 0x3B3A,
+    0x78F1, 0x78F1, 0x40BE, 0x78F2, 0x78F2, 0x2DC8, 0x78F3, 0x78F3, 0x2DC2,
+    0x78F4, 0x78F4, 0x1421, 0x78F5, 0x78F5, 0x38B3, 0x78F7, 0x78F7, 0x141F,
+    0x78F9, 0x78F9, 0x2DCA, 0x78FA, 0x78FA, 0x1420, 0x78FB, 0x78FC, 0x2DC5,
+    0x78FD, 0x78FD, 0x2DC3, 0x78FE, 0x78FE, 0x2DCB, 0x78FF, 0x78FF, 0x2DC7,
+    0x7901, 0x7901, 0x1423, 0x7902, 0x7902, 0x2DC4, 0x7904, 0x7904, 0x2DCC,
+    0x7905, 0x7905, 0x2DC9, 0x7906, 0x7906, 0x3FCF, 0x7909, 0x7909, 0x2F6F,
+    0x790C, 0x790C, 0x2F6C, 0x790E, 0x790E, 0x14FE, 0x7910, 0x7910, 0x2F70,
+    0x7911, 0x7911, 0x2F72, 0x7912, 0x7912, 0x2F71, 0x7913, 0x7914, 0x2F6D,
+    0x7917, 0x7917, 0x30CE, 0x7919, 0x7919, 0x159F, 0x791B, 0x791B, 0x30CB,
+    0x791C, 0x791C, 0x30CD, 0x791D, 0x791D, 0x30CA, 0x791E, 0x791E, 0x30CF,
+    0x7921, 0x7921, 0x30CC, 0x7923, 0x7923, 0x3204, 0x7924, 0x7924, 0x3207,
+    0x7925, 0x7925, 0x3203, 0x7926, 0x7926, 0x1624, 0x7927, 0x7928, 0x3205,
+    0x7929, 0x7929, 0x3208, 0x792A, 0x792A, 0x1625, 0x792B, 0x792B, 0x1627,
+    0x792C, 0x792C, 0x1626, 0x792D, 0x792D, 0x32E6, 0x792E, 0x792E, 0x42F0,
+    0x792F, 0x792F, 0x32E8, 0x7931, 0x7931, 0x32E7, 0x7932, 0x7932, 0x471B,
+    0x7933, 0x7933, 0x471A, 0x7934, 0x7934, 0x42F3, 0x7935, 0x7935, 0x3397,
+    0x7936, 0x7936, 0x3783, 0x7938, 0x7938, 0x3490, 0x7939, 0x7939, 0x34D5,
+    0x793A, 0x793A, 0x036A, 0x793B, 0x793B, 0x44F7, 0x793C, 0x793C, 0x4300,
+    0x793D, 0x793D, 0x18D7, 0x793E, 0x793E, 0x065F, 0x793F, 0x793F, 0x1A20,
+    0x7940, 0x7941, 0x0660, 0x7942, 0x7942, 0x1A1F, 0x7944, 0x7944, 0x1BAF,
+    0x7945, 0x7945, 0x1BAE, 0x7946, 0x7946, 0x07BF, 0x7947, 0x7947, 0x07C2,
+    0x7948, 0x7948, 0x07C1, 0x7949, 0x7949, 0x07C0, 0x794A, 0x794A, 0x1BAB,
+    0x794B, 0x794B, 0x1BAD, 0x794C, 0x794C, 0x1BAC, 0x794F, 0x794F, 0x1D76,
+    0x7950, 0x7950, 0x0956, 0x7951, 0x7951, 0x1D7A, 0x7952, 0x7952, 0x1D79,
+    0x7953, 0x7953, 0x1D78, 0x7954, 0x7954, 0x1D74, 0x7955, 0x7955, 0x0955,
+    0x7956, 0x7956, 0x0959, 0x7957, 0x7957, 0x095C, 0x7958, 0x7958, 0x37E5,
+    0x7959, 0x7959, 0x3B18, 0x795A, 0x795A, 0x095D, 0x795B, 0x795B, 0x1D75,
+    0x795C, 0x795C, 0x1D77, 0x795D, 0x795D, 0x095B, 0x795E, 0x795E, 0x095A,
+    0x795F, 0x795F, 0x0958, 0x7960, 0x7960, 0x0957, 0x7961, 0x7961, 0x1FC4,
+    0x7962, 0x7962, 0x3E7D, 0x7963, 0x7963, 0x1FC2, 0x7964, 0x7964, 0x1FBE,
+    0x7965, 0x7965, 0x0B42, 0x7967, 0x7967, 0x1FBF, 0x7968, 0x7968, 0x0B43,
+    0x7969, 0x796A, 0x1FC0, 0x796B, 0x796B, 0x1FC3, 0x796D, 0x796D, 0x0B44,
+    0x7970, 0x7970, 0x224A, 0x7971, 0x7971, 0x4168, 0x7972, 0x7972, 0x2249,
+    0x7973, 0x7973, 0x2248, 0x7974, 0x7974, 0x2247, 0x7979, 0x7979, 0x24DF,
+    0x797A, 0x797A, 0x0EA9, 0x797C, 0x797C, 0x24DC, 0x797D, 0x797D, 0x24DE,
+    0x797E, 0x797E, 0x3E26, 0x797F, 0x797F, 0x0EAA, 0x7980, 0x7980, 0x42FC,
+    0x7981, 0x7981, 0x0EAB, 0x7982, 0x7982, 0x24DD, 0x7983, 0x7983, 0x3DF6,
+    0x7986, 0x7986, 0x42F9, 0x7987, 0x7987, 0x4588, 0x7988, 0x7988, 0x275D,
+    0x798A, 0x798B, 0x2756, 0x798D, 0x798D, 0x1046, 0x798E, 0x798F, 0x1044,
+    0x7990, 0x7990, 0x275F, 0x7991, 0x7991, 0x471D, 0x7992, 0x7992, 0x275E,
+    0x7993, 0x7993, 0x275B, 0x7994, 0x7994, 0x275A, 0x7995, 0x7995, 0x2759,
+    0x7996, 0x7996, 0x2758, 0x7997, 0x7997, 0x275C, 0x7998, 0x7998, 0x2755,
+    0x7999, 0x7999, 0x43FC, 0x799A, 0x799A, 0x299C, 0x799B, 0x799B, 0x29A1,
+    0x799C, 0x799C, 0x299F, 0x799D, 0x799D, 0x42FE, 0x799F, 0x799F, 0x395E,
+    0x79A0, 0x79A0, 0x299E, 0x79A1, 0x79A1, 0x299D, 0x79A2, 0x79A2, 0x29A0,
+    0x79A4, 0x79A4, 0x2BF5, 0x79A5, 0x79A5, 0x3B1E, 0x79A6, 0x79A6, 0x130F,
+    0x79A7, 0x79A7, 0x1424, 0x79A8, 0x79A8, 0x2DCE, 0x79A9, 0x79A9, 0x4301,
+    0x79AA, 0x79AA, 0x1425, 0x79AB, 0x79AB, 0x2DCD, 0x79AC, 0x79AC, 0x2F74,
+    0x79AD, 0x79AD, 0x2F73, 0x79AE, 0x79AE, 0x14FF, 0x79B0, 0x79B0, 0x30D0,
+    0x79B1, 0x79B1, 0x15A0, 0x79B2, 0x79B2, 0x3209, 0x79B3, 0x79B3, 0x16CF,
+    0x79B4, 0x79B4, 0x3398, 0x79B6, 0x79B6, 0x3492, 0x79B7, 0x79B7, 0x3491,
+    0x79B8, 0x79B8, 0x17B2, 0x79B9, 0x79BA, 0x07C3, 0x79BB, 0x79BB, 0x1FC5,
+    0x79BD, 0x79BD, 0x0EAD, 0x79BE, 0x79BE, 0x036B, 0x79BF, 0x79BF, 0x04F9,
+    0x79C0, 0x79C0, 0x04F8, 0x79C1, 0x79C1, 0x04F7, 0x79C4, 0x79C4, 0x3CCD,
+    0x79C5, 0x79C5, 0x1A21, 0x79C6, 0x79C6, 0x4305, 0x79C8, 0x79C8, 0x0663,
+    0x79C9, 0x79C9, 0x0662, 0x79CB, 0x79CB, 0x07C7, 0x79CC, 0x79CC, 0x4233,
+    0x79CD, 0x79CD, 0x1BB1, 0x79CE, 0x79CE, 0x1BB4, 0x79CF, 0x79CF, 0x1BB2,
+    0x79D1, 0x79D2, 0x07C5, 0x79D4, 0x79D4, 0x4307, 0x79D5, 0x79D5, 0x1BB0,
+    0x79D6, 0x79D6, 0x1BB3, 0x79D8, 0x79D8, 0x0964, 0x79DC, 0x79DC, 0x1D81,
+    0x79DD, 0x79DD, 0x1D83, 0x79DE, 0x79DE, 0x1D82, 0x79DF, 0x79DF, 0x0961,
+    0x79E0, 0x79E0, 0x1D7D, 0x79E2, 0x79E2, 0x3C5A, 0x79E3, 0x79E3, 0x095F,
+    0x79E4, 0x79E4, 0x095E, 0x79E6, 0x79E6, 0x0962, 0x79E7, 0x79E7, 0x0960,
+    0x79E9, 0x79E9, 0x0963, 0x79EA, 0x79EA, 0x1D80, 0x79EB, 0x79EC, 0x1D7B,
+    0x79ED, 0x79ED, 0x1D7F, 0x79EE, 0x79EE, 0x1D7E, 0x79F1, 0x79F1, 0x3B27,
+    0x79F4, 0x79F4, 0x3B22, 0x79F6, 0x79F7, 0x1FC8, 0x79F8, 0x79F8, 0x1FC7,
+    0x79FA, 0x79FA, 0x1FC6, 0x79FB, 0x79FB, 0x0B45, 0x7A00, 0x7A00, 0x0CFD,
+    0x7A02, 0x7A02, 0x224B, 0x7A03, 0x7A03, 0x224D, 0x7A04, 0x7A04, 0x224F,
+    0x7A05, 0x7A05, 0x0CFC, 0x7A06, 0x7A06, 0x471E, 0x7A08, 0x7A08, 0x0CFA,
+    0x7A0A, 0x7A0A, 0x224C, 0x7A0B, 0x7A0B, 0x0CFB, 0x7A0C, 0x7A0C, 0x224E,
+    0x7A0D, 0x7A0D, 0x0CF9, 0x7A10, 0x7A10, 0x24E9, 0x7A11, 0x7A11, 0x24E0,
+    0x7A12, 0x7A12, 0x24E3, 0x7A13, 0x7A13, 0x24E7, 0x7A14, 0x7A14, 0x0EB1,
+    0x7A15, 0x7A15, 0x24E5, 0x7A17, 0x7A17, 0x24E4, 0x7A18, 0x7A19, 0x24E1,
+    0x7A1A, 0x7A1A, 0x0EAF, 0x7A1B, 0x7A1B, 0x24E8, 0x7A1C, 0x7A1C, 0x0EAE,
+    0x7A1E, 0x7A1E, 0x0EB3, 0x7A1F, 0x7A1F, 0x0EB2, 0x7A20, 0x7A20, 0x0EB0,
+    0x7A22, 0x7A22, 0x24E6, 0x7A26, 0x7A26, 0x2765, 0x7A28, 0x7A28, 0x2764,
+    0x7A2B, 0x7A2B, 0x2760, 0x7A2D, 0x7A2D, 0x3FDA, 0x7A2E, 0x7A2E, 0x1047,
+    0x7A2F, 0x7A2F, 0x2763, 0x7A30, 0x7A30, 0x2762, 0x7A31, 0x7A31, 0x1048,
+    0x7A37, 0x7A37, 0x11C7, 0x7A39, 0x7A39, 0x29A3, 0x7A3A, 0x7A3A, 0x3B21,
+    0x7A3B, 0x7A3B, 0x11C8, 0x7A3C, 0x7A3C, 0x11C4, 0x7A3D, 0x7A3D, 0x11C6,
+    0x7A3E, 0x7A3E, 0x3F8B, 0x7A3F, 0x7A3F, 0x11C3, 0x7A40, 0x7A40, 0x11C5,
+    0x7A43, 0x7A43, 0x396C, 0x7A44, 0x7A44, 0x2BF6, 0x7A45, 0x7A45, 0x3DF1,
+    0x7A46, 0x7A46, 0x1312, 0x7A47, 0x7A47, 0x2BF8, 0x7A48, 0x7A48, 0x2BF7,
+    0x7A49, 0x7A49, 0x3733, 0x7A4A, 0x7A4A, 0x2761, 0x7A4B, 0x7A4B, 0x1314,
+    0x7A4C, 0x7A4C, 0x1313, 0x7A4D, 0x7A4E, 0x1310, 0x7A54, 0x7A54, 0x2DD3,
+    0x7A56, 0x7A56, 0x2DD1, 0x7A57, 0x7A57, 0x1426, 0x7A58, 0x7A58, 0x2DD2,
+    0x7A5A, 0x7A5A, 0x2DD4, 0x7A5B, 0x7A5B, 0x2DD0, 0x7A5C, 0x7A5C, 0x2DCF,
+    0x7A5F, 0x7A5F, 0x2F75, 0x7A60, 0x7A60, 0x1502, 0x7A61, 0x7A62, 0x1500,
+    0x7A65, 0x7A65, 0x3736, 0x7A67, 0x7A68, 0x30D1, 0x7A69, 0x7A69, 0x15A2,
+    0x7A6B, 0x7A6B, 0x15A1, 0x7A6C, 0x7A6D, 0x320B, 0x7A6E, 0x7A6E, 0x320A,
+    0x7A70, 0x7A71, 0x3399, 0x7A74, 0x7A74, 0x036C, 0x7A75, 0x7A75, 0x1811,
+    0x7A76, 0x7A76, 0x04FA, 0x7A78, 0x7A78, 0x1A22, 0x7A79, 0x7A79, 0x0665,
+    0x7A7A, 0x7A7A, 0x0664, 0x7A7B, 0x7A7B, 0x1A23, 0x7A7D, 0x7A7D, 0x3737,
+    0x7A7E, 0x7A7E, 0x1BB6, 0x7A7F, 0x7A7F, 0x07C8, 0x7A80, 0x7A80, 0x1BB5,
+    0x7A81, 0x7A81, 0x07C9, 0x7A83, 0x7A83, 0x3D7D, 0x7A84, 0x7A84, 0x0965,
+    0x7A85, 0x7A85, 0x1D86, 0x7A86, 0x7A86, 0x1D84, 0x7A87, 0x7A87, 0x1D8A,
+    0x7A88, 0x7A88, 0x0966, 0x7A89, 0x7A89, 0x1D85, 0x7A8A, 0x7A8A, 0x1D89,
+    0x7A8B, 0x7A8C, 0x1D87, 0x7A8F, 0x7A8F, 0x1FCA, 0x7A90, 0x7A90, 0x1FCC,
+    0x7A91, 0x7A91, 0x43D8, 0x7A92, 0x7A92, 0x0B46, 0x7A94, 0x7A94, 0x1FCB,
+    0x7A95, 0x7A95, 0x0B47, 0x7A96, 0x7A96, 0x0D00, 0x7A97, 0x7A97, 0x0CFF,
+    0x7A98, 0x7A98, 0x0CFE, 0x7A99, 0x7A99, 0x2250, 0x7A9E, 0x7A9E, 0x24EC,
+    0x7A9F, 0x7AA0, 0x0EB4, 0x7AA2, 0x7AA2, 0x24EB, 0x7AA3, 0x7AA3, 0x24EA,
+    0x7AA8, 0x7AA8, 0x2766, 0x7AA9, 0x7AA9, 0x104A, 0x7AAA, 0x7AAA, 0x1049,
+    0x7AAB, 0x7AAC, 0x2767, 0x7AAE, 0x7AAE, 0x11CA, 0x7AAF, 0x7AAF, 0x11C9,
+    0x7AB0, 0x7AB0, 0x373A, 0x7AB1, 0x7AB1, 0x2BFC, 0x7AB2, 0x7AB2, 0x29A4,
+    0x7AB3, 0x7AB3, 0x29A6, 0x7AB4, 0x7AB4, 0x29A5, 0x7AB5, 0x7AB5, 0x2BFB,
+    0x7AB6, 0x7AB6, 0x2BF9, 0x7AB7, 0x7AB7, 0x2BFD, 0x7AB8, 0x7AB8, 0x2BFA,
+    0x7ABA, 0x7ABA, 0x1315, 0x7ABB, 0x7ABB, 0x3739, 0x7ABC, 0x7ABC, 0x4721,
+    0x7ABE, 0x7ABE, 0x2DD5, 0x7ABF, 0x7ABF, 0x1427, 0x7AC0, 0x7AC1, 0x2DD6,
+    0x7AC2, 0x7AC3, 0x373B, 0x7AC4, 0x7AC5, 0x1503, 0x7AC7, 0x7AC7, 0x1628,
+    0x7AC8, 0x7AC8, 0x3D7F, 0x7AC9, 0x7AC9, 0x4570, 0x7ACA, 0x7ACA, 0x16FF,
+    0x7ACB, 0x7ACB, 0x036D, 0x7ACF, 0x7ACF, 0x4724, 0x7AD1, 0x7AD1, 0x1BB7,
+    0x7AD3, 0x7AD3, 0x3F8A, 0x7AD8, 0x7AD8, 0x1D8B, 0x7AD9, 0x7AD9, 0x0967,
+    0x7ADA, 0x7ADA, 0x3740, 0x7ADB, 0x7ADB, 0x4725, 0x7ADC, 0x7ADC, 0x3951,
+    0x7ADD, 0x7ADD, 0x3741, 0x7ADF, 0x7ADF, 0x0BDE, 0x7AE0, 0x7AE0, 0x0BDD,
+    0x7AE2, 0x7AE2, 0x3B33, 0x7AE3, 0x7AE3, 0x0D02, 0x7AE4, 0x7AE4, 0x2252,
+    0x7AE5, 0x7AE5, 0x0D01, 0x7AE6, 0x7AE6, 0x2251, 0x7AE7, 0x7AE7, 0x385D,
+    0x7AE9, 0x7AE9, 0x3831, 0x7AEA, 0x7AEA, 0x3742, 0x7AEB, 0x7AEB, 0x24ED,
+    0x7AED, 0x7AED, 0x104B, 0x7AEE, 0x7AEE, 0x2769, 0x7AEF, 0x7AEF, 0x104C,
+    0x7AF6, 0x7AF6, 0x1629, 0x7AF7, 0x7AF7, 0x320D, 0x7AF9, 0x7AF9, 0x03F6,
+    0x7AFA, 0x7AFA, 0x0666, 0x7AFB, 0x7AFB, 0x1A24, 0x7AFD, 0x7AFD, 0x07CB,
+    0x7AFE, 0x7AFE, 0x3B3D, 0x7AFF, 0x7AFF, 0x07CA, 0x7B00, 0x7B01, 0x1BB8,
+    0x7B04, 0x7B04, 0x1D8D, 0x7B05, 0x7B05, 0x1D8F, 0x7B06, 0x7B06, 0x0968,
+    0x7B08, 0x7B08, 0x1D91, 0x7B09, 0x7B09, 0x1D94, 0x7B0A, 0x7B0A, 0x1D92,
+    0x7B0B, 0x7B0B, 0x3746, 0x7B0C, 0x7B0C, 0x3B63, 0x7B0E, 0x7B0E, 0x1D93,
+    0x7B0F, 0x7B0F, 0x1D90, 0x7B10, 0x7B10, 0x1D8C, 0x7B11, 0x7B11, 0x0969,
+    0x7B12, 0x7B12, 0x1D95, 0x7B13, 0x7B13, 0x1D8E, 0x7B14, 0x7B14, 0x3F77,
+    0x7B18, 0x7B18, 0x1FD5, 0x7B19, 0x7B19, 0x0B4D, 0x7B1A, 0x7B1A, 0x1FDE,
+    0x7B1B, 0x7B1B, 0x0B4A, 0x7B1D, 0x7B1D, 0x1FD7, 0x7B1E, 0x7B1E, 0x0B4E,
+    0x7B1F, 0x7B1F, 0x3F11, 0x7B20, 0x7B20, 0x0B48, 0x7B22, 0x7B22, 0x1FD2,
+    0x7B23, 0x7B23, 0x1FDF, 0x7B24, 0x7B24, 0x1FD3, 0x7B25, 0x7B25, 0x1FD0,
+    0x7B26, 0x7B26, 0x0B4C, 0x7B27, 0x7B27, 0x3B5F, 0x7B28, 0x7B28, 0x0B49,
+    0x7B29, 0x7B29, 0x3748, 0x7B2A, 0x7B2A, 0x1FD6, 0x7B2B, 0x7B2B, 0x1FD9,
+    0x7B2C, 0x7B2C, 0x0B4B, 0x7B2D, 0x7B2D, 0x1FDA, 0x7B2E, 0x7B2E, 0x0B4F,
+    0x7B2F, 0x7B2F, 0x1FDB, 0x7B30, 0x7B30, 0x1FD1, 0x7B31, 0x7B31, 0x1FD8,
+    0x7B32, 0x7B32, 0x1FDC, 0x7B33, 0x7B33, 0x1FD4, 0x7B34, 0x7B34, 0x1FCF,
+    0x7B35, 0x7B35, 0x1FCD, 0x7B38, 0x7B38, 0x1FDD, 0x7B39, 0x7B39, 0x3D6E,
+    0x7B3B, 0x7B3B, 0x1FCE, 0x7B40, 0x7B40, 0x2259, 0x7B42, 0x7B42, 0x3DED,
+    0x7B43, 0x7B43, 0x3E25, 0x7B44, 0x7B44, 0x2255, 0x7B45, 0x7B45, 0x225B,
+    0x7B46, 0x7B46, 0x0D05, 0x7B47, 0x7B47, 0x2254, 0x7B48, 0x7B48, 0x2256,
+    0x7B49, 0x7B49, 0x0D03, 0x7B4A, 0x7B4A, 0x2253, 0x7B4B, 0x7B4B, 0x0D0A,
+    0x7B4C, 0x7B4C, 0x2257, 0x7B4D, 0x7B4D, 0x0D09, 0x7B4E, 0x7B4E, 0x2258,
+    0x7B4F, 0x7B4F, 0x0D0B, 0x7B50, 0x7B50, 0x0D06, 0x7B51, 0x7B51, 0x0D0C,
+    0x7B52, 0x7B52, 0x0D07, 0x7B54, 0x7B54, 0x0D08, 0x7B55, 0x7B55, 0x3747,
+    0x7B56, 0x7B56, 0x0D04, 0x7B58, 0x7B58, 0x225A, 0x7B60, 0x7B60, 0x0EB8,
+    0x7B61, 0x7B61, 0x24F8, 0x7B62, 0x7B62, 0x4727, 0x7B63, 0x7B63, 0x24FB,
+    0x7B64, 0x7B64, 0x24EF, 0x7B65, 0x7B65, 0x24F4, 0x7B66, 0x7B66, 0x24EE,
+    0x7B67, 0x7B67, 0x0EBA, 0x7B69, 0x7B69, 0x24F2, 0x7B6C, 0x7B6C, 0x4728,
+    0x7B6D, 0x7B6D, 0x24F0, 0x7B6E, 0x7B6E, 0x0EB9, 0x7B6F, 0x7B6F, 0x374C,
+    0x7B70, 0x7B70, 0x24F7, 0x7B71, 0x7B71, 0x24F6, 0x7B72, 0x7B72, 0x24F3,
+    0x7B73, 0x7B73, 0x24F5, 0x7B74, 0x7B74, 0x24F1, 0x7B75, 0x7B75, 0x1050,
+    0x7B76, 0x7B76, 0x24FA, 0x7B77, 0x7B77, 0x0EB6, 0x7B78, 0x7B78, 0x24F9,
+    0x7B7B, 0x7B7B, 0x4729, 0x7B82, 0x7B82, 0x2779, 0x7B84, 0x7B84, 0x1057,
+    0x7B85, 0x7B85, 0x2774, 0x7B87, 0x7B87, 0x1056, 0x7B88, 0x7B88, 0x276A,
+    0x7B8A, 0x7B8A, 0x276C, 0x7B8B, 0x7B8B, 0x104F, 0x7B8C, 0x7B8C, 0x2771,
+    0x7B8D, 0x7B8D, 0x2770, 0x7B8E, 0x7B8E, 0x2773, 0x7B8F, 0x7B8F, 0x1054,
+    0x7B90, 0x7B90, 0x276E, 0x7B91, 0x7B91, 0x276D, 0x7B92, 0x7B92, 0x3752,
+    0x7B94, 0x7B94, 0x1053, 0x7B95, 0x7B95, 0x104E, 0x7B96, 0x7B96, 0x276F,
+    0x7B97, 0x7B97, 0x1051, 0x7B98, 0x7B98, 0x2775, 0x7B99, 0x7B99, 0x2777,
+    0x7B9B, 0x7B9B, 0x2772, 0x7B9C, 0x7B9C, 0x276B, 0x7B9D, 0x7B9D, 0x1052,
+    0x7BA0, 0x7BA0, 0x11D2, 0x7BA1, 0x7BA1, 0x104D, 0x7BA2, 0x7BA2, 0x374B,
+    0x7BA3, 0x7BA3, 0x3F14, 0x7BA4, 0x7BA4, 0x2778, 0x7BAC, 0x7BAC, 0x29AA,
+    0x7BAD, 0x7BAD, 0x11CB, 0x7BAF, 0x7BAF, 0x29AC, 0x7BB1, 0x7BB1, 0x11CC,
+    0x7BB2, 0x7BB2, 0x461C, 0x7BB4, 0x7BB4, 0x11CE, 0x7BB5, 0x7BB5, 0x29AF,
+    0x7BB7, 0x7BB7, 0x29A7, 0x7BB8, 0x7BB8, 0x1055, 0x7BB9, 0x7BB9, 0x29AD,
+    0x7BBE, 0x7BBE, 0x29A9, 0x7BC0, 0x7BC0, 0x0EB7, 0x7BC1, 0x7BC1, 0x11D1,
+    0x7BC4, 0x7BC4, 0x11CD, 0x7BC6, 0x7BC7, 0x11CF, 0x7BC9, 0x7BC9, 0x1318,
+    0x7BCA, 0x7BCA, 0x29AE, 0x7BCB, 0x7BCB, 0x29A8, 0x7BCC, 0x7BCC, 0x11D3,
+    0x7BCE, 0x7BCE, 0x29AB, 0x7BCF, 0x7BCF, 0x3F18, 0x7BD0, 0x7BD0, 0x3750,
+    0x7BD4, 0x7BD4, 0x2C07, 0x7BD5, 0x7BD5, 0x2C02, 0x7BD8, 0x7BD8, 0x2C0C,
+    0x7BD9, 0x7BD9, 0x1316, 0x7BDA, 0x7BDA, 0x2C04, 0x7BDB, 0x7BDB, 0x131A,
+    0x7BDC, 0x7BDC, 0x2C0A, 0x7BDD, 0x7BDD, 0x2C01, 0x7BDE, 0x7BDE, 0x2BFE,
+    0x7BDF, 0x7BDF, 0x2C0D, 0x7BE0, 0x7BE0, 0x142D, 0x7BE1, 0x7BE1, 0x131B,
+    0x7BE2, 0x7BE2, 0x2C09, 0x7BE3, 0x7BE3, 0x2BFF, 0x7BE4, 0x7BE4, 0x1319,
+    0x7BE5, 0x7BE5, 0x2C03, 0x7BE6, 0x7BE6, 0x131D, 0x7BE7, 0x7BE7, 0x2C00,
+    0x7BE8, 0x7BE8, 0x2C05, 0x7BE9, 0x7BE9, 0x131C, 0x7BEA, 0x7BEA, 0x2C08,
+    0x7BEB, 0x7BEB, 0x2C0B, 0x7BF0, 0x7BF1, 0x2DE9, 0x7BF2, 0x7BF2, 0x2DDA,
+    0x7BF3, 0x7BF3, 0x2DE1, 0x7BF4, 0x7BF4, 0x2DDF, 0x7BF7, 0x7BF7, 0x142B,
+    0x7BF8, 0x7BF8, 0x2DE6, 0x7BF9, 0x7BF9, 0x2C06, 0x7BFA, 0x7BFA, 0x3757,
+    0x7BFB, 0x7BFB, 0x2DDD, 0x7BFC, 0x7BFC, 0x3F1F, 0x7BFD, 0x7BFD, 0x2DE7,
+    0x7BFE, 0x7BFE, 0x142A, 0x7BFF, 0x7BFF, 0x2DDC, 0x7C00, 0x7C00, 0x2DDB,
+    0x7C01, 0x7C01, 0x2DE5, 0x7C02, 0x7C02, 0x2DE2, 0x7C03, 0x7C03, 0x2DE4,
+    0x7C05, 0x7C05, 0x2DD8, 0x7C06, 0x7C06, 0x2DE8, 0x7C07, 0x7C07, 0x1428,
+    0x7C09, 0x7C09, 0x2DE3, 0x7C0A, 0x7C0A, 0x2DEC, 0x7C0B, 0x7C0B, 0x2DE0,
+    0x7C0C, 0x7C0C, 0x142C, 0x7C0D, 0x7C0D, 0x1429, 0x7C0E, 0x7C0E, 0x2DDE,
+    0x7C0F, 0x7C0F, 0x2DD9, 0x7C10, 0x7C10, 0x2DEB, 0x7C11, 0x7C11, 0x1317,
+    0x7C12, 0x7C12, 0x472A, 0x7C15, 0x7C15, 0x4061, 0x7C19, 0x7C19, 0x2F78,
+    0x7C1B, 0x7C1B, 0x43D9, 0x7C1C, 0x7C1C, 0x2F76, 0x7C1D, 0x7C1D, 0x2F7C,
+    0x7C1E, 0x7C1E, 0x1508, 0x7C1F, 0x7C1F, 0x2F7A, 0x7C20, 0x7C20, 0x2F79,
+    0x7C21, 0x7C21, 0x150A, 0x7C22, 0x7C22, 0x2F7F, 0x7C23, 0x7C23, 0x1509,
+    0x7C25, 0x7C25, 0x2F80, 0x7C26, 0x7C26, 0x2F7D, 0x7C27, 0x7C27, 0x1506,
+    0x7C28, 0x7C28, 0x2F7E, 0x7C29, 0x7C29, 0x2F77, 0x7C2A, 0x7C2A, 0x1507,
+    0x7C2B, 0x7C2B, 0x1505, 0x7C2C, 0x7C2C, 0x30D6, 0x7C2D, 0x7C2D, 0x2F7B,
+    0x7C30, 0x7C30, 0x2F81, 0x7C33, 0x7C33, 0x30D3, 0x7C35, 0x7C35, 0x3759,
+    0x7C37, 0x7C37, 0x15A7, 0x7C38, 0x7C38, 0x15A5, 0x7C39, 0x7C39, 0x30D5,
+    0x7C3B, 0x7C3B, 0x30D7, 0x7C3C, 0x7C3C, 0x30D4, 0x7C3D, 0x7C3D, 0x15A6,
+    0x7C3E, 0x7C3F, 0x15A3, 0x7C40, 0x7C40, 0x15A8, 0x7C42, 0x7C42, 0x3F1C,
+    0x7C43, 0x7C43, 0x162B, 0x7C44, 0x7C44, 0x375B, 0x7C45, 0x7C45, 0x3212,
+    0x7C47, 0x7C47, 0x3211, 0x7C48, 0x7C48, 0x320F, 0x7C49, 0x7C49, 0x320E,
+    0x7C4A, 0x7C4A, 0x3210, 0x7C4C, 0x7C4C, 0x162A, 0x7C4D, 0x7C4D, 0x162C,
+    0x7C50, 0x7C50, 0x1681, 0x7C51, 0x7C51, 0x3FB8, 0x7C53, 0x7C53, 0x32EA,
+    0x7C54, 0x7C54, 0x32E9, 0x7C56, 0x7C56, 0x3EFF, 0x7C57, 0x7C57, 0x339B,
+    0x7C59, 0x7C59, 0x339D, 0x7C5A, 0x7C5A, 0x339F, 0x7C5B, 0x7C5B, 0x339E,
+    0x7C5C, 0x7C5C, 0x339C, 0x7C5D, 0x7C5D, 0x3B3F, 0x7C5F, 0x7C5F, 0x16D1,
+    0x7C60, 0x7C60, 0x16D0, 0x7C63, 0x7C63, 0x1701, 0x7C64, 0x7C64, 0x1700,
+    0x7C65, 0x7C65, 0x1702, 0x7C66, 0x7C66, 0x342B, 0x7C67, 0x7C67, 0x342A,
+    0x7C69, 0x7C69, 0x34D6, 0x7C6A, 0x7C6A, 0x3493, 0x7C6B, 0x7C6B, 0x34D7,
+    0x7C6C, 0x7C6C, 0x1745, 0x7C6D, 0x7C6D, 0x3B40, 0x7C6E, 0x7C6E, 0x1746,
+    0x7C6F, 0x7C6F, 0x3507, 0x7C70, 0x7C70, 0x3F52, 0x7C72, 0x7C72, 0x176B,
+    0x7C73, 0x7C73, 0x03F7, 0x7C74, 0x7C74, 0x469C, 0x7C75, 0x7C75, 0x1A25,
+    0x7C78, 0x7C79, 0x1BBB, 0x7C7A, 0x7C7A, 0x1BBA, 0x7C7B, 0x7C7B, 0x472D,
+    0x7C7C, 0x7C7C, 0x3B49, 0x7C7D, 0x7C7D, 0x07CC, 0x7C7E, 0x7C7E, 0x3F1A,
+    0x7C7F, 0x7C81, 0x1BBD, 0x7C83, 0x7C83, 0x375C, 0x7C84, 0x7C84, 0x1D96,
+    0x7C85, 0x7C85, 0x1D9C, 0x7C86, 0x7C86, 0x3F1D, 0x7C88, 0x7C88, 0x1D9A,
+    0x7C89, 0x7C89, 0x096A, 0x7C8A, 0x7C8A, 0x1D98, 0x7C8C, 0x7C8C, 0x1D99,
+    0x7C8D, 0x7C8D, 0x1D9B, 0x7C8E, 0x7C8E, 0x3B48, 0x7C91, 0x7C91, 0x1D97,
+    0x7C92, 0x7C92, 0x0B50, 0x7C94, 0x7C94, 0x1FE0, 0x7C95, 0x7C95, 0x0B52,
+    0x7C96, 0x7C96, 0x1FE2, 0x7C97, 0x7C97, 0x0B51, 0x7C98, 0x7C98, 0x1FE1,
+    0x7C9C, 0x7C9C, 0x472E, 0x7C9E, 0x7C9E, 0x225D, 0x7C9F, 0x7C9F, 0x0D0D,
+    0x7CA1, 0x7CA1, 0x225F, 0x7CA2, 0x7CA2, 0x225C, 0x7CA3, 0x7CA3, 0x1FE3,
+    0x7CA5, 0x7CA5, 0x0D0E, 0x7CA6, 0x7CA6, 0x375E, 0x7CA7, 0x7CA7, 0x36ED,
+    0x7CA8, 0x7CA8, 0x225E, 0x7CAC, 0x7CAC, 0x3885, 0x7CAE, 0x7CAE, 0x3B4A,
+    0x7CAF, 0x7CAF, 0x24FE, 0x7CB1, 0x7CB1, 0x0EBB, 0x7CB2, 0x7CB2, 0x24FC,
+    0x7CB3, 0x7CB3, 0x0EBC, 0x7CB4, 0x7CB4, 0x24FD, 0x7CB5, 0x7CB5, 0x0EBD,
+    0x7CB8, 0x7CB8, 0x4730, 0x7CB9, 0x7CB9, 0x1058, 0x7CBA, 0x7CBA, 0x277D,
+    0x7CBB, 0x7CBB, 0x277A, 0x7CBC, 0x7CBC, 0x277C, 0x7CBD, 0x7CBE, 0x1059,
+    0x7CBF, 0x7CBF, 0x277B, 0x7CC2, 0x7CC2, 0x3FD7, 0x7CC5, 0x7CC5, 0x29B0,
+    0x7CC7, 0x7CC7, 0x3761, 0x7CC8, 0x7CC8, 0x29B1, 0x7CC9, 0x7CC9, 0x3760,
+    0x7CCA, 0x7CCA, 0x11D4, 0x7CCB, 0x7CCB, 0x29B3, 0x7CCC, 0x7CCC, 0x29B2,
+    0x7CCD, 0x7CCD, 0x3B45, 0x7CCE, 0x7CCE, 0x0121, 0x7CD0, 0x7CD1, 0x2C11,
+    0x7CD2, 0x7CD2, 0x2C0E, 0x7CD3, 0x7CD3, 0x3D5C, 0x7CD4, 0x7CD4, 0x2C0F,
+    0x7CD5, 0x7CD6, 0x131E, 0x7CD7, 0x7CD7, 0x2C10, 0x7CD9, 0x7CD9, 0x1433,
+    0x7CDA, 0x7CDA, 0x3FD9, 0x7CDC, 0x7CDC, 0x142F, 0x7CDD, 0x7CDD, 0x1434,
+    0x7CDE, 0x7CDE, 0x1430, 0x7CDF, 0x7CDF, 0x1432, 0x7CE0, 0x7CE0, 0x142E,
+    0x7CE2, 0x7CE2, 0x1431, 0x7CE6, 0x7CE6, 0x3762, 0x7CE7, 0x7CE7, 0x150B,
+    0x7CE8, 0x7CE8, 0x2DED, 0x7CEA, 0x7CEA, 0x30D9, 0x7CEC, 0x7CEC, 0x30D8,
+    0x7CED, 0x7CED, 0x43DA, 0x7CEE, 0x7CEE, 0x3213, 0x7CEF, 0x7CF0, 0x162D,
+    0x7CF1, 0x7CF1, 0x33A1, 0x7CF2, 0x7CF2, 0x32EB, 0x7CF3, 0x7CF3, 0x3764,
+    0x7CF4, 0x7CF4, 0x33A0, 0x7CF5, 0x7CF5, 0x3765, 0x7CF6, 0x7CF6, 0x34D8,
+    0x7CF7, 0x7CF7, 0x351D, 0x7CF8, 0x7CF8, 0x03F8, 0x7CF9, 0x7CF9, 0x44F8,
+    0x7CFB, 0x7CFB, 0x04FB, 0x7CFC, 0x7CFC, 0x456D, 0x7CFD, 0x7CFD, 0x1A26,
+    0x7CFE, 0x7CFE, 0x0667, 0x7D00, 0x7D00, 0x07CF, 0x7D01, 0x7D01, 0x1BC2,
+    0x7D02, 0x7D02, 0x07CD, 0x7D03, 0x7D03, 0x1BC0, 0x7D04, 0x7D04, 0x07D2,
+    0x7D05, 0x7D05, 0x07CE, 0x7D06, 0x7D06, 0x07D3, 0x7D07, 0x7D07, 0x07D1,
+    0x7D08, 0x7D08, 0x1BC1, 0x7D09, 0x7D09, 0x07D0, 0x7D0A, 0x7D0A, 0x096E,
+    0x7D0B, 0x7D0B, 0x096D, 0x7D0C, 0x7D0C, 0x1DA7, 0x7D0D, 0x7D0D, 0x0976,
+    0x7D0E, 0x7D0E, 0x1DA0, 0x7D0F, 0x7D0F, 0x1DA6, 0x7D10, 0x7D10, 0x0972,
+    0x7D11, 0x7D11, 0x1D9F, 0x7D12, 0x7D12, 0x1DA5, 0x7D13, 0x7D13, 0x1DA3,
+    0x7D14, 0x7D14, 0x0971, 0x7D15, 0x7D15, 0x0973, 0x7D16, 0x7D16, 0x1DA2,
+    0x7D17, 0x7D17, 0x096C, 0x7D18, 0x7D18, 0x1DA1, 0x7D19, 0x7D19, 0x0977,
+    0x7D1A, 0x7D1A, 0x0974, 0x7D1B, 0x7D1B, 0x0978, 0x7D1C, 0x7D1C, 0x0975,
+    0x7D1D, 0x7D1D, 0x1D9E, 0x7D1E, 0x7D1E, 0x1D9D, 0x7D1F, 0x7D1F, 0x1DA4,
+    0x7D20, 0x7D20, 0x096F, 0x7D21, 0x7D21, 0x096B, 0x7D22, 0x7D22, 0x0970,
+    0x7D25, 0x7D25, 0x3EDE, 0x7D28, 0x7D28, 0x1FF2, 0x7D29, 0x7D29, 0x1FEB,
+    0x7D2B, 0x7D2B, 0x0D13, 0x7D2C, 0x7D2C, 0x1FEA, 0x7D2E, 0x7D2E, 0x0B56,
+    0x7D2F, 0x7D2F, 0x0B5D, 0x7D30, 0x7D30, 0x0B5A, 0x7D31, 0x7D31, 0x0B60,
+    0x7D32, 0x7D32, 0x0B5F, 0x7D33, 0x7D33, 0x0B5B, 0x7D35, 0x7D35, 0x1FE4,
+    0x7D36, 0x7D36, 0x1FE7, 0x7D38, 0x7D38, 0x1FE6, 0x7D39, 0x7D39, 0x0B57,
+    0x7D3A, 0x7D3A, 0x1FE8, 0x7D3B, 0x7D3B, 0x1FF1, 0x7D3C, 0x7D3C, 0x0B58,
+    0x7D3D, 0x7D3D, 0x1FE5, 0x7D3E, 0x7D3F, 0x1FEE, 0x7D40, 0x7D40, 0x0B59,
+    0x7D41, 0x7D41, 0x1FEC, 0x7D42, 0x7D42, 0x0B5E, 0x7D43, 0x7D43, 0x0B54,
+    0x7D44, 0x7D44, 0x0B5C, 0x7D45, 0x7D45, 0x1FE9, 0x7D46, 0x7D46, 0x0B53,
+    0x7D47, 0x7D47, 0x1FED, 0x7D4A, 0x7D4A, 0x1FF0, 0x7D4D, 0x7D4D, 0x3FDD,
+    0x7D4E, 0x7D4E, 0x2270, 0x7D4F, 0x7D4F, 0x2267, 0x7D50, 0x7D50, 0x0D10,
+    0x7D51, 0x7D51, 0x226E, 0x7D52, 0x7D52, 0x226B, 0x7D53, 0x7D53, 0x2263,
+    0x7D54, 0x7D54, 0x226C, 0x7D55, 0x7D55, 0x0D12, 0x7D56, 0x7D56, 0x2264,
+    0x7D58, 0x7D58, 0x2260, 0x7D5A, 0x7D5A, 0x3E93, 0x7D5B, 0x7D5B, 0x0EC3,
+    0x7D5C, 0x7D5C, 0x2269, 0x7D5D, 0x7D5D, 0x3769, 0x7D5E, 0x7D5E, 0x0D0F,
+    0x7D5F, 0x7D5F, 0x226F, 0x7D61, 0x7D61, 0x0D16, 0x7D62, 0x7D62, 0x0D18,
+    0x7D63, 0x7D63, 0x2262, 0x7D66, 0x7D66, 0x0D17, 0x7D67, 0x7D67, 0x2265,
+    0x7D68, 0x7D68, 0x0D11, 0x7D69, 0x7D69, 0x226D, 0x7D6A, 0x7D6A, 0x2266,
+    0x7D6B, 0x7D6B, 0x226A, 0x7D6D, 0x7D6D, 0x2268, 0x7D6E, 0x7D6E, 0x0D14,
+    0x7D6F, 0x7D6F, 0x2261, 0x7D70, 0x7D70, 0x0D19, 0x7D71, 0x7D71, 0x0B55,
+    0x7D72, 0x7D72, 0x0D15, 0x7D73, 0x7D73, 0x0D1A, 0x7D79, 0x7D79, 0x0EBF,
+    0x7D7A, 0x7D7A, 0x2505, 0x7D7B, 0x7D7B, 0x2507, 0x7D7C, 0x7D7C, 0x2509,
+    0x7D7D, 0x7D7D, 0x250D, 0x7D7F, 0x7D7F, 0x2503, 0x7D80, 0x7D80, 0x2501,
+    0x7D81, 0x7D81, 0x0EC1, 0x7D83, 0x7D83, 0x2508, 0x7D84, 0x7D84, 0x250C,
+    0x7D85, 0x7D85, 0x2504, 0x7D86, 0x7D86, 0x2500, 0x7D88, 0x7D88, 0x24FF,
+    0x7D89, 0x7D89, 0x376B, 0x7D8C, 0x7D8C, 0x250A, 0x7D8D, 0x7D8D, 0x2502,
+    0x7D8E, 0x7D8E, 0x2506, 0x7D8F, 0x7D8F, 0x0EC2, 0x7D91, 0x7D91, 0x0EC0,
+    0x7D92, 0x7D92, 0x250E, 0x7D93, 0x7D93, 0x0EBE, 0x7D94, 0x7D94, 0x250B,
+    0x7D96, 0x7D96, 0x278E, 0x7D97, 0x7D97, 0x3B53, 0x7D9C, 0x7D9C, 0x105D,
+    0x7D9D, 0x7D9D, 0x2786, 0x7D9E, 0x7D9E, 0x11E1, 0x7D9F, 0x7D9F, 0x2790,
+    0x7DA0, 0x7DA0, 0x1060, 0x7DA1, 0x7DA1, 0x2794, 0x7DA2, 0x7DA2, 0x1066,
+    0x7DA3, 0x7DA3, 0x2781, 0x7DA4, 0x7DA4, 0x46D7, 0x7DA6, 0x7DA6, 0x2791,
+    0x7DA7, 0x7DA7, 0x277E, 0x7DA8, 0x7DA8, 0x3C9C, 0x7DA9, 0x7DA9, 0x2793,
+    0x7DAA, 0x7DAA, 0x2782, 0x7DAB, 0x7DAB, 0x376C, 0x7DAC, 0x7DAC, 0x106D,
+    0x7DAD, 0x7DAD, 0x106A, 0x7DAE, 0x7DAE, 0x2792, 0x7DAF, 0x7DAF, 0x278C,
+    0x7DB0, 0x7DB0, 0x105C, 0x7DB1, 0x7DB1, 0x1064, 0x7DB2, 0x7DB2, 0x1063,
+    0x7DB3, 0x7DB3, 0x376E, 0x7DB4, 0x7DB4, 0x1062, 0x7DB5, 0x7DB5, 0x1068,
+    0x7DB7, 0x7DB7, 0x277F, 0x7DB8, 0x7DB8, 0x1069, 0x7DB9, 0x7DB9, 0x278D,
+    0x7DBA, 0x7DBA, 0x1065, 0x7DBB, 0x7DBB, 0x105B, 0x7DBC, 0x7DBC, 0x278F,
+    0x7DBD, 0x7DBE, 0x105E, 0x7DBF, 0x7DBF, 0x1067, 0x7DC0, 0x7DC0, 0x2784,
+    0x7DC1, 0x7DC1, 0x2783, 0x7DC2, 0x7DC2, 0x2780, 0x7DC4, 0x7DC4, 0x2788,
+    0x7DC5, 0x7DC5, 0x2785, 0x7DC6, 0x7DC6, 0x2789, 0x7DC7, 0x7DC7, 0x106C,
+    0x7DC9, 0x7DC9, 0x2795, 0x7DCA, 0x7DCA, 0x1061, 0x7DCB, 0x7DCC, 0x278A,
+    0x7DCD, 0x7DCD, 0x456E, 0x7DCE, 0x7DCE, 0x2787, 0x7DCF, 0x7DCF, 0x4735,
+    0x7DD0, 0x7DD0, 0x4737, 0x7DD2, 0x7DD2, 0x106B, 0x7DD3, 0x7DD3, 0x3B4E,
+    0x7DD4, 0x7DD4, 0x4736, 0x7DD6, 0x7DD6, 0x376F, 0x7DD7, 0x7DD7, 0x29B8,
+    0x7DD8, 0x7DD8, 0x11D9, 0x7DD9, 0x7DD9, 0x11E2, 0x7DDA, 0x7DDA, 0x11DE,
+    0x7DDB, 0x7DDB, 0x29B5, 0x7DDC, 0x7DDC, 0x3B4C, 0x7DDD, 0x7DDD, 0x11DB,
+    0x7DDE, 0x7DDE, 0x11DF, 0x7DDF, 0x7DDF, 0x29C1, 0x7DE0, 0x7DE0, 0x11D5,
+    0x7DE1, 0x7DE1, 0x29B9, 0x7DE3, 0x7DE3, 0x11DD, 0x7DE4, 0x7DE4, 0x3772,
+    0x7DE5, 0x7DE5, 0x3776, 0x7DE6, 0x7DE6, 0x29BC, 0x7DE7, 0x7DE7, 0x29B7,
+    0x7DE8, 0x7DE8, 0x11DC, 0x7DE9, 0x7DE9, 0x11E0, 0x7DEA, 0x7DEA, 0x29B6,
+    0x7DEC, 0x7DEC, 0x11DA, 0x7DEE, 0x7DEE, 0x29C0, 0x7DEF, 0x7DEF, 0x11D7,
+    0x7DF0, 0x7DF0, 0x29BF, 0x7DF1, 0x7DF1, 0x29BE, 0x7DF2, 0x7DF2, 0x11E3,
+    0x7DF3, 0x7DF3, 0x28C8, 0x7DF4, 0x7DF4, 0x11D6, 0x7DF5, 0x7DF5, 0x3774,
+    0x7DF6, 0x7DF6, 0x29BD, 0x7DF7, 0x7DF7, 0x29B4, 0x7DF9, 0x7DF9, 0x11E4,
+    0x7DFA, 0x7DFA, 0x29BB, 0x7DFB, 0x7DFB, 0x11D8, 0x7DFD, 0x7DFD, 0x4738,
+    0x7DFE, 0x7DFE, 0x3CCF, 0x7E03, 0x7E03, 0x29BA, 0x7E07, 0x7E07, 0x3B4D,
+    0x7E08, 0x7E08, 0x1322, 0x7E09, 0x7E09, 0x1327, 0x7E0A, 0x7E0A, 0x1320,
+    0x7E0B, 0x7E0B, 0x2C1F, 0x7E0C, 0x7E0C, 0x2C16, 0x7E0D, 0x7E0D, 0x2C22,
+    0x7E0E, 0x7E0E, 0x2C1A, 0x7E0F, 0x7E0F, 0x2C20, 0x7E10, 0x7E10, 0x1328,
+    0x7E11, 0x7E11, 0x1321, 0x7E12, 0x7E12, 0x2C13, 0x7E13, 0x7E13, 0x2C19,
+    0x7E14, 0x7E14, 0x2C23, 0x7E15, 0x7E15, 0x2C1C, 0x7E16, 0x7E16, 0x2C21,
+    0x7E17, 0x7E17, 0x2C15, 0x7E1A, 0x7E1A, 0x2C1D, 0x7E1B, 0x7E1B, 0x1323,
+    0x7E1C, 0x7E1C, 0x2C1B, 0x7E1D, 0x7E1D, 0x1326, 0x7E1E, 0x7E1E, 0x1325,
+    0x7E1F, 0x7E20, 0x2C17, 0x7E21, 0x7E21, 0x2C14, 0x7E22, 0x7E22, 0x2C1E,
+    0x7E23, 0x7E23, 0x1324, 0x7E24, 0x7E24, 0x2C25, 0x7E25, 0x7E25, 0x2C24,
+    0x7E27, 0x7E27, 0x377F, 0x7E29, 0x7E29, 0x2DF8, 0x7E2A, 0x7E2A, 0x2DF4,
+    0x7E2B, 0x7E2B, 0x143B, 0x7E2D, 0x7E2D, 0x2DEE, 0x7E2E, 0x7E2E, 0x1435,
+    0x7E2F, 0x7E2F, 0x1445, 0x7E30, 0x7E30, 0x2DFA, 0x7E31, 0x7E31, 0x143D,
+    0x7E32, 0x7E32, 0x1439, 0x7E33, 0x7E33, 0x2DF1, 0x7E34, 0x7E34, 0x1440,
+    0x7E35, 0x7E35, 0x1443, 0x7E36, 0x7E36, 0x2DFC, 0x7E37, 0x7E37, 0x1438,
+    0x7E38, 0x7E38, 0x2DF3, 0x7E39, 0x7E39, 0x1441, 0x7E3A, 0x7E3A, 0x2DFE,
+    0x7E3B, 0x7E3B, 0x2DFB, 0x7E3C, 0x7E3C, 0x2DEF, 0x7E3D, 0x7E3D, 0x143C,
+    0x7E3E, 0x7E3E, 0x1436, 0x7E3F, 0x7E3F, 0x1444, 0x7E40, 0x7E40, 0x2DF6,
+    0x7E41, 0x7E41, 0x143F, 0x7E42, 0x7E42, 0x2DF0, 0x7E43, 0x7E43, 0x143A,
+    0x7E44, 0x7E44, 0x2DFD, 0x7E45, 0x7E45, 0x143E, 0x7E46, 0x7E46, 0x1437,
+    0x7E47, 0x7E47, 0x2DF7, 0x7E48, 0x7E48, 0x1442, 0x7E49, 0x7E49, 0x2DF5,
+    0x7E4C, 0x7E4C, 0x2DF9, 0x7E50, 0x7E50, 0x2F83, 0x7E51, 0x7E51, 0x2F89,
+    0x7E52, 0x7E52, 0x1511, 0x7E53, 0x7E53, 0x2F8C, 0x7E54, 0x7E55, 0x150C,
+    0x7E56, 0x7E56, 0x2F84, 0x7E57, 0x7E57, 0x2F8B, 0x7E58, 0x7E58, 0x2F86,
+    0x7E59, 0x7E59, 0x1512, 0x7E5A, 0x7E5A, 0x150F, 0x7E5C, 0x7E5C, 0x2F82,
+    0x7E5E, 0x7E5E, 0x150E, 0x7E5F, 0x7E5F, 0x2F88, 0x7E60, 0x7E60, 0x2F8A,
+    0x7E61, 0x7E61, 0x1510, 0x7E62, 0x7E62, 0x2F87, 0x7E63, 0x7E63, 0x2F85,
+    0x7E65, 0x7E65, 0x46D2, 0x7E67, 0x7E67, 0x3766, 0x7E68, 0x7E68, 0x30E3,
+    0x7E69, 0x7E6A, 0x15AC, 0x7E6B, 0x7E6B, 0x15A9, 0x7E6D, 0x7E6D, 0x15AA,
+    0x7E6E, 0x7E6E, 0x377B, 0x7E6F, 0x7E6F, 0x30DF, 0x7E70, 0x7E70, 0x30DD,
+    0x7E72, 0x7E72, 0x30E1, 0x7E73, 0x7E73, 0x15AE, 0x7E74, 0x7E74, 0x30E2,
+    0x7E75, 0x7E75, 0x30DB, 0x7E76, 0x7E76, 0x30DA, 0x7E77, 0x7E77, 0x30DE,
+    0x7E78, 0x7E78, 0x30DC, 0x7E79, 0x7E79, 0x15AB, 0x7E7A, 0x7E7A, 0x30E0,
+    0x7E7B, 0x7E7B, 0x3214, 0x7E7C, 0x7E7C, 0x1631, 0x7E7D, 0x7E7D, 0x1630,
+    0x7E7E, 0x7E7E, 0x3215, 0x7E7F, 0x7E7F, 0x3E51, 0x7E80, 0x7E80, 0x3217,
+    0x7E81, 0x7E81, 0x3216, 0x7E82, 0x7E82, 0x1632, 0x7E86, 0x7E86, 0x32F0,
+    0x7E87, 0x7E88, 0x32ED, 0x7E8A, 0x7E8A, 0x32EC, 0x7E8B, 0x7E8B, 0x32EF,
+    0x7E8C, 0x7E8C, 0x1683, 0x7E8D, 0x7E8D, 0x32F1, 0x7E8E, 0x7E8E, 0x3EC9,
+    0x7E8F, 0x7E8F, 0x1682, 0x7E91, 0x7E91, 0x33A2, 0x7E92, 0x7E92, 0x469E,
+    0x7E93, 0x7E93, 0x1703, 0x7E94, 0x7E94, 0x1705, 0x7E95, 0x7E95, 0x342C,
+    0x7E96, 0x7E96, 0x1704, 0x7E97, 0x7E97, 0x3494, 0x7E98, 0x7E98, 0x34DA,
+    0x7E99, 0x7E99, 0x34DC, 0x7E9A, 0x7E9A, 0x34D9, 0x7E9B, 0x7E9B, 0x34DB,
+    0x7E9C, 0x7E9C, 0x1759, 0x7E9F, 0x7E9F, 0x48BB, 0x7EA4, 0x7EA4, 0x455B,
+    0x7EAC, 0x7EAC, 0x455C, 0x7EBA, 0x7EBA, 0x455D, 0x7EC7, 0x7EC7, 0x455E,
+    0x7ECF, 0x7ECF, 0x455F, 0x7EDF, 0x7EDF, 0x4560, 0x7F06, 0x7F06, 0x4561,
+    0x7F36, 0x7F36, 0x03F9, 0x7F37, 0x7F37, 0x4562, 0x7F38, 0x7F38, 0x07D4,
+    0x7F39, 0x7F39, 0x1D1F, 0x7F3A, 0x7F3A, 0x0979, 0x7F3D, 0x7F3D, 0x0B61,
+    0x7F3E, 0x7F3F, 0x2271, 0x7F40, 0x7F41, 0x3780, 0x7F43, 0x7F43, 0x2C26,
+    0x7F44, 0x7F44, 0x1446, 0x7F45, 0x7F45, 0x2DFF, 0x7F47, 0x7F47, 0x3782,
+    0x7F48, 0x7F48, 0x1513, 0x7F49, 0x7F49, 0x3E69, 0x7F4A, 0x7F4A, 0x30E5,
+    0x7F4B, 0x7F4B, 0x30E4, 0x7F4C, 0x7F4C, 0x1633, 0x7F4D, 0x7F4D, 0x32F2,
+    0x7F4E, 0x7F4E, 0x3B4F, 0x7F4F, 0x7F4F, 0x33A3, 0x7F50, 0x7F50, 0x1726,
+    0x7F51, 0x7F51, 0x1812, 0x7F52, 0x7F52, 0x44F6, 0x7F53, 0x7F53, 0x44F9,
+    0x7F54, 0x7F54, 0x0668, 0x7F55, 0x7F55, 0x04FC, 0x7F58, 0x7F58, 0x1BC3,
+    0x7F5B, 0x7F5B, 0x1DAD, 0x7F5C, 0x7F5C, 0x1DA8, 0x7F5D, 0x7F5D, 0x1DAC,
+    0x7F5E, 0x7F5E, 0x1DAA, 0x7F5F, 0x7F5F, 0x097A, 0x7F60, 0x7F60, 0x1DAB,
+    0x7F61, 0x7F61, 0x1DA9, 0x7F63, 0x7F63, 0x1FF3, 0x7F65, 0x7F66, 0x2273,
+    0x7F67, 0x7F68, 0x2511, 0x7F69, 0x7F6A, 0x0EC5, 0x7F6B, 0x7F6B, 0x2510,
+    0x7F6C, 0x7F6C, 0x2513, 0x7F6D, 0x7F6D, 0x250F, 0x7F6E, 0x7F6E, 0x0EC4,
+    0x7F70, 0x7F70, 0x106E, 0x7F71, 0x7F71, 0x4007, 0x7F72, 0x7F72, 0x0EC7,
+    0x7F73, 0x7F73, 0x2796, 0x7F75, 0x7F75, 0x11E5, 0x7F76, 0x7F76, 0x29C2,
+    0x7F77, 0x7F77, 0x11E6, 0x7F78, 0x7F78, 0x3F7B, 0x7F79, 0x7F79, 0x1329,
+    0x7F7A, 0x7F7A, 0x2C29, 0x7F7B, 0x7F7C, 0x2C27, 0x7F7D, 0x7F7D, 0x2E02,
+    0x7F7E, 0x7F7E, 0x2E01, 0x7F7F, 0x7F7F, 0x2E00, 0x7F83, 0x7F83, 0x30E6,
+    0x7F85, 0x7F85, 0x15AF, 0x7F86, 0x7F86, 0x30E7, 0x7F87, 0x7F87, 0x33A4,
+    0x7F88, 0x7F88, 0x1727, 0x7F89, 0x7F89, 0x3495, 0x7F8A, 0x7F8A, 0x03FA,
+    0x7F8B, 0x7F8B, 0x066A, 0x7F8C, 0x7F8C, 0x0669, 0x7F8D, 0x7F8D, 0x1BC5,
+    0x7F8E, 0x7F8E, 0x07D5, 0x7F8F, 0x7F8F, 0x421C, 0x7F91, 0x7F91, 0x1BC4,
+    0x7F92, 0x7F92, 0x1DAF, 0x7F93, 0x7F93, 0x43DB, 0x7F94, 0x7F94, 0x097B,
+    0x7F95, 0x7F95, 0x1FF4, 0x7F96, 0x7F96, 0x1DAE, 0x7F97, 0x7F97, 0x3786,
+    0x7F9A, 0x7F9A, 0x0B63, 0x7F9B, 0x7F9B, 0x1FF7, 0x7F9C, 0x7F9D, 0x1FF5,
+    0x7F9E, 0x7F9E, 0x0B62, 0x7FA0, 0x7FA1, 0x2276, 0x7FA2, 0x7FA2, 0x2275,
+    0x7FA3, 0x7FA3, 0x3788, 0x7FA4, 0x7FA4, 0x0ECA, 0x7FA5, 0x7FA5, 0x2515,
+    0x7FA6, 0x7FA6, 0x2514, 0x7FA7, 0x7FA7, 0x2516, 0x7FA8, 0x7FA8, 0x0EC9,
+    0x7FA9, 0x7FA9, 0x0EC8, 0x7FAC, 0x7FAC, 0x29C3, 0x7FAD, 0x7FAD, 0x29C5,
+    0x7FAE, 0x7FAE, 0x43DC, 0x7FAF, 0x7FAF, 0x11E7, 0x7FB0, 0x7FB0, 0x29C4,
+    0x7FB1, 0x7FB1, 0x2C2A, 0x7FB2, 0x7FB2, 0x132A, 0x7FB3, 0x7FB3, 0x2F8E,
+    0x7FB4, 0x7FB4, 0x4739, 0x7FB5, 0x7FB5, 0x2F8D, 0x7FB6, 0x7FB6, 0x15B0,
+    0x7FB7, 0x7FB7, 0x30E8, 0x7FB8, 0x7FB8, 0x15B2, 0x7FB9, 0x7FB9, 0x15B1,
+    0x7FBA, 0x7FBA, 0x3218, 0x7FBB, 0x7FBB, 0x32F3, 0x7FBC, 0x7FBC, 0x1684,
+    0x7FBD, 0x7FBD, 0x03FB, 0x7FBE, 0x7FBE, 0x1BC6, 0x7FBF, 0x7FBF, 0x07D6,
+    0x7FC0, 0x7FC0, 0x1DB2, 0x7FC1, 0x7FC1, 0x097D, 0x7FC2, 0x7FC2, 0x1DB1,
+    0x7FC3, 0x7FC3, 0x1DB0, 0x7FC5, 0x7FC5, 0x097C, 0x7FC7, 0x7FC7, 0x1FFD,
+    0x7FC9, 0x7FC9, 0x1FFF, 0x7FCA, 0x7FCB, 0x1FF8, 0x7FCC, 0x7FCC, 0x0B64,
+    0x7FCD, 0x7FCD, 0x1FFA, 0x7FCE, 0x7FCE, 0x0B65, 0x7FCF, 0x7FCF, 0x1FFE,
+    0x7FD0, 0x7FD1, 0x1FFB, 0x7FD2, 0x7FD2, 0x0B66, 0x7FD4, 0x7FD5, 0x0D1C,
+    0x7FD7, 0x7FD7, 0x2278, 0x7FDB, 0x7FDC, 0x2517, 0x7FDD, 0x7FDD, 0x3B5E,
+    0x7FDE, 0x7FDE, 0x279A, 0x7FDF, 0x7FDF, 0x1071, 0x7FE0, 0x7FE1, 0x106F,
+    0x7FE2, 0x7FE3, 0x2797, 0x7FE5, 0x7FE5, 0x2799, 0x7FE6, 0x7FE6, 0x29CA,
+    0x7FE7, 0x7FE7, 0x46E9, 0x7FE8, 0x7FE8, 0x29CB, 0x7FE9, 0x7FE9, 0x11E8,
+    0x7FEA, 0x7FEA, 0x29C8, 0x7FEB, 0x7FEB, 0x29C7, 0x7FEC, 0x7FEC, 0x29C9,
+    0x7FED, 0x7FED, 0x29C6, 0x7FEE, 0x7FEE, 0x132D, 0x7FEF, 0x7FEF, 0x2C2B,
+    0x7FF0, 0x7FF1, 0x132B, 0x7FF2, 0x7FF2, 0x2E04, 0x7FF3, 0x7FF3, 0x1447,
+    0x7FF4, 0x7FF4, 0x2E03, 0x7FF5, 0x7FF5, 0x2EFF, 0x7FF7, 0x7FF8, 0x2F8F,
+    0x7FF9, 0x7FF9, 0x1514, 0x7FFA, 0x7FFA, 0x378E, 0x7FFB, 0x7FFB, 0x1515,
+    0x7FFC, 0x7FFC, 0x1448, 0x7FFD, 0x7FFE, 0x30E9, 0x7FFF, 0x7FFF, 0x3219,
+    0x8000, 0x8000, 0x1634, 0x8001, 0x8001, 0x03FC, 0x8002, 0x8002, 0x44FD,
+    0x8003, 0x8003, 0x03FD, 0x8004, 0x8004, 0x097F, 0x8005, 0x8005, 0x066B,
+    0x8006, 0x8006, 0x097E, 0x8007, 0x8007, 0x1BC7, 0x8008, 0x8008, 0x3791,
+    0x800B, 0x800B, 0x0D1E, 0x800C, 0x800C, 0x03FE, 0x800D, 0x800D, 0x07D8,
+    0x800E, 0x800F, 0x1BC8, 0x8010, 0x8010, 0x07D7, 0x8011, 0x8011, 0x07D9,
+    0x8012, 0x8012, 0x03FF, 0x8014, 0x8014, 0x1BCA, 0x8015, 0x8015, 0x0981,
+    0x8016, 0x8016, 0x1DB3, 0x8017, 0x8017, 0x0983, 0x8018, 0x8018, 0x0980,
+    0x8019, 0x8019, 0x0982, 0x801B, 0x801B, 0x2002, 0x801C, 0x801C, 0x0B67,
+    0x801D, 0x801D, 0x3792, 0x801E, 0x801E, 0x2001, 0x801F, 0x801F, 0x2000,
+    0x8020, 0x8020, 0x473C, 0x8021, 0x8021, 0x2519, 0x8024, 0x8024, 0x279B,
+    0x8025, 0x8025, 0x473D, 0x8026, 0x8026, 0x11E9, 0x8028, 0x8028, 0x132E,
+    0x8029, 0x8029, 0x2C2D, 0x802A, 0x802A, 0x2C2C, 0x802C, 0x802C, 0x2E05,
+    0x802E, 0x802E, 0x473E, 0x802F, 0x802F, 0x3794, 0x8030, 0x8030, 0x32F4,
+    0x8031, 0x8031, 0x473F, 0x8033, 0x8033, 0x0400, 0x8034, 0x8034, 0x18D8,
+    0x8035, 0x8035, 0x1A27, 0x8036, 0x8036, 0x07DA, 0x8037, 0x8037, 0x1BCB,
+    0x8039, 0x8039, 0x1DB5, 0x803B, 0x803C, 0x3797, 0x803D, 0x803D, 0x0984,
+    0x803E, 0x803E, 0x1DB4, 0x803F, 0x803F, 0x0985, 0x8043, 0x8043, 0x2004,
+    0x8046, 0x8046, 0x0B69, 0x8047, 0x8047, 0x2003, 0x8048, 0x8048, 0x2005,
+    0x804A, 0x804A, 0x0B68, 0x804F, 0x8050, 0x227A, 0x8051, 0x8051, 0x2279,
+    0x8052, 0x8052, 0x0D1F, 0x8054, 0x8054, 0x4740, 0x8056, 0x8056, 0x0ECB,
+    0x8058, 0x8058, 0x0ECC, 0x805A, 0x805A, 0x1073, 0x805B, 0x805B, 0x3FE5,
+    0x805C, 0x805C, 0x279D, 0x805D, 0x805D, 0x279C, 0x805E, 0x805E, 0x1072,
+    0x8061, 0x8061, 0x3799, 0x8062, 0x8062, 0x3FE3, 0x8063, 0x8063, 0x3FDC,
+    0x8064, 0x8064, 0x29CC, 0x8066, 0x8066, 0x3FDB, 0x8067, 0x8067, 0x29CD,
+    0x806C, 0x806C, 0x2C2E, 0x806F, 0x806F, 0x144C, 0x8070, 0x8070, 0x144B,
+    0x8071, 0x8072, 0x1449, 0x8073, 0x8073, 0x144D, 0x8075, 0x8075, 0x2F91,
+    0x8076, 0x8076, 0x1517, 0x8077, 0x8077, 0x1516, 0x8078, 0x8078, 0x30EB,
+    0x8079, 0x8079, 0x321A, 0x807D, 0x807D, 0x16D3, 0x807E, 0x807E, 0x16D2,
+    0x807F, 0x807F, 0x0401, 0x8080, 0x8080, 0x44FE, 0x8082, 0x8082, 0x1CEC,
+    0x8084, 0x8084, 0x0ECE, 0x8085, 0x8085, 0x0D20, 0x8086, 0x8086, 0x0ECD,
+    0x8087, 0x8087, 0x1074, 0x8089, 0x8089, 0x0402, 0x808A, 0x808A, 0x17B3,
+    0x808B, 0x808C, 0x0403, 0x808F, 0x808F, 0x1A28, 0x8090, 0x8090, 0x18DB,
+    0x8092, 0x8092, 0x18DC, 0x8093, 0x8093, 0x04FE, 0x8095, 0x8095, 0x18D9,
+    0x8096, 0x8096, 0x04FD, 0x8098, 0x8098, 0x0500, 0x8099, 0x8099, 0x18DA,
+    0x809A, 0x809A, 0x0502, 0x809B, 0x809B, 0x0501, 0x809C, 0x809C, 0x18DD,
+    0x809D, 0x809D, 0x04FF, 0x809F, 0x809F, 0x4576, 0x80A1, 0x80A1, 0x0670,
+    0x80A2, 0x80A2, 0x066E, 0x80A3, 0x80A3, 0x1A2A, 0x80A5, 0x80A5, 0x066D,
+    0x80A7, 0x80A7, 0x37A0, 0x80A9, 0x80A9, 0x0672, 0x80AA, 0x80AA, 0x0674,
+    0x80AB, 0x80AB, 0x0671, 0x80AD, 0x80AD, 0x1A2D, 0x80AE, 0x80AE, 0x1A29,
+    0x80AF, 0x80AF, 0x0675, 0x80B1, 0x80B1, 0x066F, 0x80B2, 0x80B2, 0x0503,
+    0x80B4, 0x80B4, 0x0673, 0x80B5, 0x80B5, 0x1A2C, 0x80B6, 0x80B6, 0x3EAE,
+    0x80B7, 0x80B7, 0x4743, 0x80B8, 0x80B8, 0x1A2B, 0x80BA, 0x80BA, 0x066C,
+    0x80BC, 0x80BC, 0x4572, 0x80BD, 0x80BD, 0x3E7B, 0x80C2, 0x80C2, 0x1BD1,
+    0x80C3, 0x80C4, 0x07DE, 0x80C5, 0x80C5, 0x1BD3, 0x80C6, 0x80C6, 0x3B74,
+    0x80C7, 0x80C7, 0x1BCD, 0x80C8, 0x80C8, 0x1BD0, 0x80C9, 0x80C9, 0x1BD9,
+    0x80CA, 0x80CA, 0x1BD7, 0x80CC, 0x80CC, 0x07E0, 0x80CD, 0x80CD, 0x1BDD,
+    0x80CE, 0x80CE, 0x07E3, 0x80CF, 0x80CF, 0x1BDA, 0x80D0, 0x80D0, 0x1BD2,
+    0x80D1, 0x80D1, 0x1BCF, 0x80D4, 0x80D4, 0x227D, 0x80D5, 0x80D5, 0x1BD8,
+    0x80D6, 0x80D6, 0x07DB, 0x80D7, 0x80D7, 0x1BDB, 0x80D8, 0x80D8, 0x1BCC,
+    0x80D9, 0x80D9, 0x1BD5, 0x80DA, 0x80DA, 0x07DD, 0x80DB, 0x80DB, 0x07E2,
+    0x80DC, 0x80DC, 0x1BD6, 0x80DD, 0x80DD, 0x07E6, 0x80DE, 0x80DE, 0x07E4,
+    0x80E0, 0x80E0, 0x1BCE, 0x80E1, 0x80E1, 0x07E1, 0x80E3, 0x80E3, 0x1BD4,
+    0x80E4, 0x80E4, 0x07E5, 0x80E5, 0x80E5, 0x07DC, 0x80E6, 0x80E6, 0x1BDC,
+    0x80E9, 0x80E9, 0x4744, 0x80EC, 0x80EC, 0x45E9, 0x80ED, 0x80ED, 0x098A,
+    0x80EF, 0x80EF, 0x0993, 0x80F0, 0x80F0, 0x0988, 0x80F1, 0x80F1, 0x0986,
+    0x80F2, 0x80F2, 0x1DB7, 0x80F3, 0x80F3, 0x098E, 0x80F4, 0x80F4, 0x098B,
+    0x80F5, 0x80F5, 0x1DB9, 0x80F6, 0x80F6, 0x4574, 0x80F8, 0x80F8, 0x098D,
+    0x80F9, 0x80F9, 0x1DB8, 0x80FA, 0x80FA, 0x1DB6, 0x80FB, 0x80FB, 0x1DBB,
+    0x80FC, 0x80FC, 0x0992, 0x80FD, 0x80FD, 0x0990, 0x80FE, 0x80FE, 0x227C,
+    0x8100, 0x8100, 0x1DBC, 0x8101, 0x8101, 0x1DBA, 0x8102, 0x8102, 0x0987,
+    0x8103, 0x8103, 0x3FE7, 0x8105, 0x8105, 0x0989, 0x8106, 0x8106, 0x098C,
+    0x8107, 0x8107, 0x37A2, 0x8108, 0x8108, 0x098F, 0x8109, 0x8109, 0x3B75,
+    0x810A, 0x810A, 0x0991, 0x810C, 0x810C, 0x4746, 0x810E, 0x810E, 0x4747,
+    0x8112, 0x8112, 0x4748, 0x8114, 0x8114, 0x4749, 0x8115, 0x8115, 0x200F,
+    0x8116, 0x8116, 0x0B6B, 0x8117, 0x8117, 0x3E6D, 0x8118, 0x8118, 0x2006,
+    0x8119, 0x8119, 0x2008, 0x811A, 0x811A, 0x37A3, 0x811B, 0x811B, 0x2009,
+    0x811D, 0x811D, 0x2011, 0x811E, 0x811E, 0x200D, 0x811F, 0x811F, 0x200B,
+    0x8121, 0x8121, 0x200E, 0x8122, 0x8122, 0x2012, 0x8123, 0x8123, 0x0B6C,
+    0x8124, 0x8124, 0x0B70, 0x8125, 0x8125, 0x2007, 0x8127, 0x8127, 0x2010,
+    0x8129, 0x8129, 0x0B6E, 0x812A, 0x812A, 0x3A39, 0x812B, 0x812B, 0x0B6D,
+    0x812C, 0x812C, 0x200C, 0x812D, 0x812D, 0x200A, 0x812F, 0x812F, 0x0B6A,
+    0x8130, 0x8130, 0x0B6F, 0x8132, 0x8132, 0x3E79, 0x8134, 0x8134, 0x45EC,
+    0x8137, 0x8137, 0x3B72, 0x8139, 0x8139, 0x0D26, 0x813A, 0x813A, 0x2285,
+    0x813D, 0x813D, 0x2283, 0x813E, 0x813E, 0x0D28, 0x8142, 0x8142, 0x3B76,
+    0x8143, 0x8143, 0x227E, 0x8144, 0x8144, 0x2527, 0x8146, 0x8146, 0x0D27,
+    0x8147, 0x8147, 0x2282, 0x8148, 0x8148, 0x3E76, 0x814A, 0x814A, 0x227F,
+    0x814B, 0x814B, 0x0D23, 0x814C, 0x814C, 0x0D29, 0x814D, 0x814D, 0x2284,
+    0x814E, 0x814E, 0x0D25, 0x814F, 0x814F, 0x2281, 0x8150, 0x8150, 0x1075,
+    0x8151, 0x8151, 0x0D24, 0x8152, 0x8152, 0x2280, 0x8153, 0x8153, 0x0D2A,
+    0x8154, 0x8154, 0x0D22, 0x8155, 0x8155, 0x0D21, 0x8156, 0x8156, 0x474C,
+    0x8159, 0x815A, 0x474D, 0x815B, 0x815B, 0x251F, 0x815C, 0x815C, 0x251D,
+    0x815E, 0x815E, 0x2523, 0x8160, 0x8160, 0x251B, 0x8161, 0x8161, 0x2528,
+    0x8162, 0x8162, 0x2520, 0x8164, 0x8164, 0x251A, 0x8165, 0x8165, 0x0ED2,
+    0x8166, 0x8166, 0x0ED8, 0x8167, 0x8167, 0x2525, 0x8169, 0x8169, 0x251E,
+    0x816B, 0x816B, 0x0ED5, 0x816D, 0x816D, 0x43C4, 0x816E, 0x816E, 0x0ED3,
+    0x816F, 0x816F, 0x2526, 0x8170, 0x8170, 0x0ED0, 0x8171, 0x8171, 0x0ECF,
+    0x8172, 0x8172, 0x2521, 0x8173, 0x8173, 0x0ED4, 0x8174, 0x8174, 0x0D2B,
+    0x8176, 0x8176, 0x2524, 0x8177, 0x8177, 0x251C, 0x8178, 0x8178, 0x0ED1,
+    0x8179, 0x817A, 0x0ED6, 0x817C, 0x817C, 0x4750, 0x817F, 0x817F, 0x107A,
+    0x8180, 0x8180, 0x1076, 0x8182, 0x8182, 0x107B, 0x8183, 0x8183, 0x27A0,
+    0x8184, 0x8184, 0x43C5, 0x8186, 0x8186, 0x279F, 0x8187, 0x8187, 0x27A1,
+    0x8188, 0x8188, 0x1078, 0x8189, 0x8189, 0x279E, 0x818A, 0x818A, 0x1079,
+    0x818B, 0x818B, 0x27A4, 0x818C, 0x818C, 0x27A3, 0x818D, 0x818D, 0x27A2,
+    0x818F, 0x818F, 0x1077, 0x8193, 0x8193, 0x43C6, 0x8195, 0x8195, 0x29D1,
+    0x8197, 0x8197, 0x29D4, 0x8198, 0x8198, 0x11EF, 0x8199, 0x8199, 0x29D3,
+    0x819A, 0x819A, 0x11EE, 0x819B, 0x819D, 0x11EA, 0x819E, 0x819E, 0x29D0,
+    0x819F, 0x819F, 0x29CF, 0x81A0, 0x81A0, 0x11ED, 0x81A2, 0x81A2, 0x29D2,
+    0x81A3, 0x81A3, 0x29CE, 0x81A5, 0x81A5, 0x4753, 0x81A6, 0x81A6, 0x2C30,
+    0x81A7, 0x81A7, 0x2C3A, 0x81A8, 0x81A8, 0x1331, 0x81A9, 0x81A9, 0x1330,
+    0x81AA, 0x81AA, 0x4364, 0x81AB, 0x81AB, 0x2C34, 0x81AC, 0x81AC, 0x2C36,
+    0x81AE, 0x81AE, 0x2C31, 0x81B0, 0x81B0, 0x2C35, 0x81B1, 0x81B1, 0x2C2F,
+    0x81B2, 0x81B2, 0x2C38, 0x81B3, 0x81B3, 0x132F, 0x81B4, 0x81B4, 0x2C37,
+    0x81B5, 0x81B5, 0x2C33, 0x81B6, 0x81B6, 0x3EB2, 0x81B7, 0x81B7, 0x2C39,
+    0x81B9, 0x81B9, 0x2C32, 0x81BA, 0x81BA, 0x1450, 0x81BB, 0x81BB, 0x2E06,
+    0x81BC, 0x81BC, 0x2E0C, 0x81BD, 0x81BD, 0x1454, 0x81BE, 0x81BE, 0x1456,
+    0x81BF, 0x81BF, 0x1453, 0x81C0, 0x81C0, 0x1452, 0x81C1, 0x81C1, 0x4755,
+    0x81C2, 0x81C2, 0x1451, 0x81C3, 0x81C3, 0x144F, 0x81C4, 0x81C4, 0x2E07,
+    0x81C5, 0x81C5, 0x2E0A, 0x81C6, 0x81C6, 0x144E, 0x81C7, 0x81C7, 0x2E0B,
+    0x81C8, 0x81C8, 0x3FEE, 0x81C9, 0x81C9, 0x1455, 0x81CA, 0x81CA, 0x2E09,
+    0x81CC, 0x81CC, 0x2E08, 0x81CD, 0x81CD, 0x1518, 0x81CF, 0x81CF, 0x1519,
+    0x81D0, 0x81D0, 0x2F94, 0x81D1, 0x81D2, 0x2F92, 0x81D5, 0x81D5, 0x30ED,
+    0x81D7, 0x81D7, 0x30EC, 0x81D8, 0x81D8, 0x15B3, 0x81D9, 0x81D9, 0x321C,
+    0x81DA, 0x81DA, 0x1635, 0x81DB, 0x81DB, 0x321B, 0x81DD, 0x81DD, 0x32F5,
+    0x81DE, 0x81DE, 0x33A5, 0x81DF, 0x81DF, 0x16D4, 0x81E0, 0x81E1, 0x34DD,
+    0x81E2, 0x81E2, 0x1706, 0x81E3, 0x81E3, 0x0405, 0x81E4, 0x81E4, 0x4756,
+    0x81E5, 0x81E5, 0x0676, 0x81E6, 0x81E6, 0x2286, 0x81E7, 0x81E7, 0x107C,
+    0x81E8, 0x81E8, 0x1457, 0x81E9, 0x81E9, 0x2E0D, 0x81EA, 0x81EA, 0x0406,
+    0x81EC, 0x81EC, 0x0995, 0x81ED, 0x81ED, 0x0994, 0x81EE, 0x81EE, 0x2287,
+    0x81EF, 0x81EF, 0x42D1, 0x81F2, 0x81F2, 0x2C3B, 0x81F3, 0x81F3, 0x0407,
+    0x81F4, 0x81F4, 0x07E7, 0x81F6, 0x81F6, 0x3D61, 0x81F7, 0x81F9, 0x2288,
+    0x81FA, 0x81FA, 0x107D, 0x81FB, 0x81FB, 0x1332, 0x81FC, 0x81FC, 0x0408,
+    0x81FE, 0x81FE, 0x0677, 0x81FF, 0x81FF, 0x1BDE, 0x8200, 0x8200, 0x0996,
+    0x8201, 0x8201, 0x1DBD, 0x8202, 0x8202, 0x0B71, 0x8204, 0x8204, 0x228B,
+    0x8205, 0x8205, 0x0ED9, 0x8207, 0x8207, 0x107E, 0x8208, 0x8208, 0x1333,
+    0x8209, 0x8209, 0x1458, 0x820A, 0x820A, 0x151A, 0x820B, 0x820B, 0x30EE,
+    0x820C, 0x820C, 0x0409, 0x820D, 0x820D, 0x0678, 0x8210, 0x8210, 0x0997,
+    0x8211, 0x8211, 0x2013, 0x8212, 0x8212, 0x0D2C, 0x8214, 0x8214, 0x107F,
+    0x8215, 0x8215, 0x27A5, 0x8216, 0x8216, 0x29D5, 0x8218, 0x8218, 0x37AA,
+    0x821A, 0x821A, 0x3FE1, 0x821B, 0x821B, 0x040A, 0x821C, 0x821C, 0x0D2D,
+    0x821D, 0x821D, 0x2529, 0x821E, 0x821E, 0x1080, 0x821F, 0x821F, 0x040B,
+    0x8220, 0x8220, 0x1A2E, 0x8221, 0x8221, 0x1BDF, 0x8222, 0x8222, 0x07E8,
+    0x8225, 0x8225, 0x1DBF, 0x8226, 0x8226, 0x420D, 0x8228, 0x8228, 0x099A,
+    0x8229, 0x8229, 0x37B0, 0x822A, 0x822B, 0x0998, 0x822C, 0x822C, 0x099B,
+    0x822D, 0x822D, 0x3ED0, 0x822F, 0x822F, 0x1DBE, 0x8232, 0x8232, 0x2018,
+    0x8233, 0x8233, 0x2015, 0x8234, 0x8234, 0x2017, 0x8235, 0x8235, 0x0B72,
+    0x8236, 0x8236, 0x0B74, 0x8237, 0x8237, 0x0B73, 0x8238, 0x8238, 0x2014,
+    0x8239, 0x8239, 0x0B75, 0x823A, 0x823A, 0x2016, 0x823C, 0x823D, 0x228C,
+    0x823E, 0x823E, 0x4582, 0x823F, 0x823F, 0x228E, 0x8240, 0x8240, 0x252C,
+    0x8242, 0x8242, 0x252D, 0x8244, 0x8244, 0x252B, 0x8245, 0x8245, 0x252E,
+    0x8247, 0x8247, 0x0EDA, 0x8249, 0x8249, 0x252A, 0x824B, 0x824B, 0x1081,
+    0x824E, 0x824E, 0x29DA, 0x824F, 0x824F, 0x29D6, 0x8250, 0x8250, 0x29D9,
+    0x8251, 0x8251, 0x29DB, 0x8252, 0x8252, 0x29D8, 0x8253, 0x8253, 0x29D7,
+    0x8254, 0x8254, 0x4757, 0x8255, 0x8257, 0x2C3C, 0x8258, 0x8259, 0x1334,
+    0x825A, 0x825A, 0x2E0F, 0x825B, 0x825B, 0x2E0E, 0x825C, 0x825C, 0x2E10,
+    0x825E, 0x825E, 0x2F96, 0x825F, 0x825F, 0x2F95, 0x8261, 0x8261, 0x30F0,
+    0x8262, 0x8262, 0x3B7A, 0x8263, 0x8263, 0x30F1, 0x8264, 0x8264, 0x30EF,
+    0x8265, 0x8265, 0x3B7B, 0x8266, 0x8266, 0x1636, 0x8268, 0x8269, 0x321D,
+    0x826B, 0x826B, 0x33A6, 0x826C, 0x826C, 0x342D, 0x826D, 0x826D, 0x3496,
+    0x826E, 0x826E, 0x040C, 0x826F, 0x826F, 0x0504, 0x8271, 0x8271, 0x1459,
+    0x8272, 0x8272, 0x040D, 0x8274, 0x8274, 0x2019, 0x8275, 0x8275, 0x228F,
+    0x8276, 0x8276, 0x4759, 0x8277, 0x8277, 0x172E, 0x8278, 0x8278, 0x1813,
+    0x8279, 0x8279, 0x4722, 0x827A, 0x827A, 0x4563, 0x827B, 0x827B, 0x37C8,
+    0x827C, 0x827C, 0x1814, 0x827D, 0x827D, 0x1816, 0x827E, 0x827E, 0x040E,
+    0x827F, 0x827F, 0x1817, 0x8280, 0x8280, 0x1815, 0x8283, 0x8284, 0x18E5,
+    0x8285, 0x8285, 0x18E0, 0x8287, 0x8287, 0x4132, 0x828A, 0x828A, 0x18E4,
+    0x828B, 0x828B, 0x0506, 0x828D, 0x828D, 0x0507, 0x828E, 0x828E, 0x18E1,
+    0x828F, 0x828F, 0x18DF, 0x8290, 0x8290, 0x18DE, 0x8291, 0x8291, 0x18E2,
+    0x8292, 0x8292, 0x0505, 0x8293, 0x8293, 0x18E3, 0x8294, 0x8294, 0x1BE0,
+    0x8298, 0x8298, 0x1A33, 0x8299, 0x8299, 0x067B, 0x829A, 0x829A, 0x1A32,
+    0x829B, 0x829B, 0x1A34, 0x829D, 0x829D, 0x067A, 0x829E, 0x829E, 0x1A39,
+    0x829F, 0x829F, 0x067E, 0x82A0, 0x82A0, 0x1A2F, 0x82A1, 0x82A1, 0x1A3D,
+    0x82A2, 0x82A2, 0x1A43, 0x82A3, 0x82A3, 0x0685, 0x82A4, 0x82A4, 0x1A40,
+    0x82A5, 0x82A5, 0x0682, 0x82A6, 0x82A6, 0x3D73, 0x82A7, 0x82A7, 0x1A36,
+    0x82A8, 0x82A8, 0x1A3C, 0x82A9, 0x82A9, 0x1A3E, 0x82AA, 0x82AA, 0x37BC,
+    0x82AB, 0x82AB, 0x1A31, 0x82AC, 0x82AC, 0x0681, 0x82AD, 0x82AD, 0x067C,
+    0x82AE, 0x82AE, 0x1A37, 0x82AF, 0x82AF, 0x0683, 0x82B0, 0x82B0, 0x0686,
+    0x82B1, 0x82B1, 0x0680, 0x82B3, 0x82B3, 0x0679, 0x82B4, 0x82B4, 0x1A3B,
+    0x82B5, 0x82B5, 0x1A35, 0x82B6, 0x82B6, 0x1A42, 0x82B7, 0x82B7, 0x0688,
+    0x82B8, 0x82B8, 0x0684, 0x82B9, 0x82B9, 0x067F, 0x82BA, 0x82BA, 0x1A3A,
+    0x82BB, 0x82BB, 0x099C, 0x82BC, 0x82BC, 0x1A38, 0x82BD, 0x82BD, 0x067D,
+    0x82BE, 0x82BE, 0x0687, 0x82C0, 0x82C0, 0x1A30, 0x82C2, 0x82C2, 0x1A3F,
+    0x82C3, 0x82C3, 0x1A41, 0x82C4, 0x82C4, 0x45E3, 0x82CA, 0x82CA, 0x475A,
+    0x82CF, 0x82CF, 0x4564, 0x82D0, 0x82D0, 0x37C1, 0x82D1, 0x82D1, 0x07F9,
+    0x82D2, 0x82D2, 0x07F3, 0x82D3, 0x82D3, 0x07FB, 0x82D4, 0x82D4, 0x07F8,
+    0x82D5, 0x82D5, 0x1BE7, 0x82D6, 0x82D6, 0x1BEA, 0x82D7, 0x82D7, 0x07F4,
+    0x82D8, 0x82D8, 0x475B, 0x82D9, 0x82D9, 0x1BE1, 0x82DB, 0x82DB, 0x07ED,
+    0x82DC, 0x82DC, 0x07F7, 0x82DE, 0x82DE, 0x07FA, 0x82DF, 0x82DF, 0x07FC,
+    0x82E0, 0x82E0, 0x1BF6, 0x82E1, 0x82E1, 0x1BED, 0x82E2, 0x82E2, 0x37C9,
+    0x82E3, 0x82E3, 0x07EC, 0x82E4, 0x82E4, 0x1BF5, 0x82E5, 0x82E5, 0x07F0,
+    0x82E6, 0x82E6, 0x07EE, 0x82E7, 0x82E7, 0x07E9, 0x82E8, 0x82E8, 0x1BE5,
+    0x82EA, 0x82EA, 0x1BF4, 0x82EB, 0x82EB, 0x1BE9, 0x82EC, 0x82EC, 0x1BEC,
+    0x82ED, 0x82ED, 0x1BF9, 0x82EE, 0x82EE, 0x4018, 0x82EF, 0x82EF, 0x07FD,
+    0x82F0, 0x82F0, 0x1BF3, 0x82F1, 0x82F1, 0x07F5, 0x82F2, 0x82F2, 0x1BEE,
+    0x82F3, 0x82F3, 0x1BF8, 0x82F4, 0x82F4, 0x1BEB, 0x82F5, 0x82F5, 0x1BEF,
+    0x82F6, 0x82F6, 0x1BF2, 0x82F7, 0x82F7, 0x3E77, 0x82F9, 0x82F9, 0x1BE3,
+    0x82FA, 0x82FA, 0x1BF7, 0x82FB, 0x82FB, 0x1BF1, 0x82FC, 0x82FC, 0x412D,
+    0x82FD, 0x82FD, 0x3D92, 0x82FE, 0x82FE, 0x1BE2, 0x82FF, 0x82FF, 0x43DE,
+    0x8300, 0x8300, 0x1BE6, 0x8301, 0x8301, 0x07F6, 0x8302, 0x8302, 0x07F1,
+    0x8303, 0x8303, 0x07EA, 0x8304, 0x8304, 0x07EF, 0x8305, 0x8305, 0x07EB,
+    0x8306, 0x8306, 0x07FE, 0x8307, 0x8307, 0x1BE4, 0x8308, 0x8308, 0x1DD0,
+    0x8309, 0x8309, 0x07F2, 0x830B, 0x830B, 0x3EB6, 0x830C, 0x830C, 0x1BF0,
+    0x830D, 0x830D, 0x1A7D, 0x8316, 0x8316, 0x1DD3, 0x8317, 0x8317, 0x09AA,
+    0x8318, 0x8318, 0x37CA, 0x8319, 0x8319, 0x1DC3, 0x831A, 0x831A, 0x37C2,
+    0x831B, 0x831B, 0x1DCE, 0x831C, 0x831C, 0x1DCA, 0x831D, 0x831D, 0x37D1,
+    0x831E, 0x831E, 0x1DDD, 0x8320, 0x8320, 0x1DD5, 0x8322, 0x8322, 0x1DCB,
+    0x8324, 0x8324, 0x1DD4, 0x8325, 0x8325, 0x1DC5, 0x8326, 0x8326, 0x1DC9,
+    0x8327, 0x8327, 0x1DE0, 0x8328, 0x8328, 0x09AD, 0x8329, 0x8329, 0x1DD8,
+    0x832A, 0x832A, 0x1DCF, 0x832B, 0x832B, 0x099D, 0x832C, 0x832C, 0x1DDE,
+    0x832D, 0x832D, 0x1DC1, 0x832F, 0x832F, 0x1DD7, 0x8331, 0x8331, 0x09AC,
+    0x8332, 0x8332, 0x09A7, 0x8333, 0x8333, 0x1DC0, 0x8334, 0x8334, 0x09A5,
+    0x8335, 0x8335, 0x09A4, 0x8336, 0x8336, 0x09A9, 0x8337, 0x8337, 0x1DD6,
+    0x8338, 0x8338, 0x09A1, 0x8339, 0x8339, 0x09A8, 0x833A, 0x833A, 0x1BE8,
+    0x833B, 0x833B, 0x2290, 0x833C, 0x833C, 0x1DD1, 0x833D, 0x833D, 0x3D2A,
+    0x833F, 0x833F, 0x1DC7, 0x8340, 0x8340, 0x09AB, 0x8341, 0x8341, 0x1DC8,
+    0x8342, 0x8342, 0x1DCC, 0x8343, 0x8343, 0x09AE, 0x8344, 0x8344, 0x1DC2,
+    0x8345, 0x8345, 0x1DDA, 0x8347, 0x8347, 0x1DD9, 0x8348, 0x8348, 0x1DE1,
+    0x8349, 0x8349, 0x09A3, 0x834A, 0x834A, 0x09A0, 0x834B, 0x834B, 0x1DDF,
+    0x834C, 0x834C, 0x1DDB, 0x834D, 0x834D, 0x1DD2, 0x834E, 0x834E, 0x1DCD,
+    0x834F, 0x834F, 0x09A6, 0x8350, 0x8350, 0x09A2, 0x8351, 0x8351, 0x1DC4,
+    0x8352, 0x8352, 0x099E, 0x8353, 0x8353, 0x1DDC, 0x8354, 0x8354, 0x099F,
+    0x8356, 0x8356, 0x1DC6, 0x8357, 0x8357, 0x475D, 0x8362, 0x8362, 0x37B6,
+    0x8363, 0x8363, 0x41EB, 0x8366, 0x8366, 0x3E1E, 0x836F, 0x836F, 0x4565,
+    0x8373, 0x8373, 0x201F, 0x8374, 0x8374, 0x2021, 0x8375, 0x8375, 0x2026,
+    0x8376, 0x8376, 0x203A, 0x8377, 0x8377, 0x0B83, 0x8378, 0x8378, 0x0B79,
+    0x837A, 0x837A, 0x201E, 0x837B, 0x837C, 0x0B84, 0x837D, 0x837D, 0x2029,
+    0x837E, 0x837E, 0x2030, 0x837F, 0x837F, 0x2036, 0x8381, 0x8381, 0x2023,
+    0x8383, 0x8383, 0x202A, 0x8385, 0x8385, 0x37D3, 0x8386, 0x8386, 0x0B86,
+    0x8387, 0x8387, 0x2038, 0x8388, 0x8388, 0x2033, 0x8389, 0x8389, 0x0B81,
+    0x838A, 0x838A, 0x0B7F, 0x838B, 0x838B, 0x202F, 0x838C, 0x838C, 0x202B,
+    0x838D, 0x838D, 0x201D, 0x838E, 0x838E, 0x0B76, 0x838F, 0x838F, 0x2022,
+    0x8390, 0x8390, 0x201A, 0x8391, 0x8391, 0x37EC, 0x8392, 0x8392, 0x0B7E,
+    0x8393, 0x8393, 0x0B80, 0x8394, 0x8394, 0x2027, 0x8395, 0x8395, 0x2024,
+    0x8396, 0x8396, 0x0B7B, 0x8397, 0x8397, 0x2034, 0x8398, 0x8398, 0x0B78,
+    0x8399, 0x8399, 0x2025, 0x839A, 0x839A, 0x22B9, 0x839B, 0x839B, 0x202D,
+    0x839C, 0x839C, 0x374D, 0x839D, 0x839D, 0x202C, 0x839E, 0x839E, 0x0B77,
+    0x83A0, 0x83A0, 0x0B82, 0x83A2, 0x83A2, 0x0B7A, 0x83A3, 0x83A3, 0x201B,
+    0x83A4, 0x83A4, 0x2020, 0x83A5, 0x83A5, 0x2031, 0x83A6, 0x83A6, 0x2037,
+    0x83A7, 0x83A7, 0x0B87, 0x83A8, 0x83A8, 0x201C, 0x83A9, 0x83A9, 0x2028,
+    0x83AA, 0x83AA, 0x202E, 0x83AB, 0x83AB, 0x0B7D, 0x83AC, 0x83AC, 0x37D6,
+    0x83AE, 0x83AE, 0x2039, 0x83AF, 0x83AF, 0x2032, 0x83B0, 0x83B0, 0x2035,
+    0x83B9, 0x83B9, 0x42A7, 0x83BD, 0x83BD, 0x0B7C, 0x83BE, 0x83BE, 0x3F59,
+    0x83BF, 0x83BF, 0x22A0, 0x83C0, 0x83C0, 0x2294, 0x83C1, 0x83C1, 0x0D35,
+    0x83C2, 0x83C2, 0x22B1, 0x83C3, 0x83C3, 0x22BA, 0x83C4, 0x83C4, 0x22BD,
+    0x83C5, 0x83C5, 0x0D33, 0x83C6, 0x83C6, 0x229C, 0x83C7, 0x83C7, 0x22B5,
+    0x83C8, 0x83C8, 0x229D, 0x83C9, 0x83C9, 0x22AB, 0x83CA, 0x83CA, 0x0D40,
+    0x83CB, 0x83CB, 0x22A7, 0x83CC, 0x83CC, 0x0D3D, 0x83CD, 0x83CD, 0x4055,
+    0x83CE, 0x83CE, 0x22A8, 0x83CF, 0x83CF, 0x2291, 0x83D1, 0x83D1, 0x22B6,
+    0x83D3, 0x83D3, 0x37D8, 0x83D4, 0x83D4, 0x0D46, 0x83D5, 0x83D5, 0x22B3,
+    0x83D6, 0x83D6, 0x22A9, 0x83D7, 0x83D7, 0x22BF, 0x83D8, 0x83D8, 0x22A4,
+    0x83D9, 0x83D9, 0x254E, 0x83DB, 0x83DB, 0x22C2, 0x83DC, 0x83DC, 0x0D44,
+    0x83DD, 0x83DD, 0x22A2, 0x83DE, 0x83DE, 0x22AE, 0x83DF, 0x83DF, 0x0D47,
+    0x83E0, 0x83E0, 0x0D32, 0x83E1, 0x83E1, 0x22A6, 0x83E2, 0x83E2, 0x22C0,
+    0x83E3, 0x83E3, 0x229F, 0x83E4, 0x83E4, 0x2298, 0x83E5, 0x83E5, 0x22A3,
+    0x83E7, 0x83E7, 0x2297, 0x83E8, 0x83E8, 0x2295, 0x83E9, 0x83E9, 0x0D2E,
+    0x83EA, 0x83EA, 0x22B7, 0x83EB, 0x83EB, 0x229E, 0x83EC, 0x83EC, 0x22BB,
+    0x83ED, 0x83ED, 0x3D2C, 0x83EE, 0x83EE, 0x22BC, 0x83EF, 0x83EF, 0x0D36,
+    0x83F0, 0x83F0, 0x0D3B, 0x83F1, 0x83F1, 0x0D37, 0x83F2, 0x83F2, 0x0D3F,
+    0x83F3, 0x83F3, 0x22B2, 0x83F4, 0x83F4, 0x0D38, 0x83F5, 0x83F5, 0x22AA,
+    0x83F6, 0x83F6, 0x229A, 0x83F8, 0x83F8, 0x0D30, 0x83F9, 0x83F9, 0x2292,
+    0x83FA, 0x83FA, 0x22B4, 0x83FB, 0x83FB, 0x22BE, 0x83FC, 0x83FC, 0x2299,
+    0x83FD, 0x83FD, 0x0D3E, 0x83FE, 0x83FE, 0x22C3, 0x83FF, 0x83FF, 0x22A5,
+    0x8401, 0x8401, 0x22A1, 0x8403, 0x8403, 0x0D2F, 0x8404, 0x8404, 0x0D43,
+    0x8405, 0x8405, 0x475F, 0x8406, 0x8406, 0x22B0, 0x8407, 0x8407, 0x0D45,
+    0x8409, 0x8409, 0x22AC, 0x840A, 0x840A, 0x0D3A, 0x840B, 0x840B, 0x0D34,
+    0x840C, 0x840C, 0x0D3C, 0x840D, 0x840D, 0x0D31, 0x840E, 0x840E, 0x0D42,
+    0x840F, 0x840F, 0x22AD, 0x8410, 0x8410, 0x229B, 0x8411, 0x8411, 0x22AF,
+    0x8412, 0x8412, 0x2296, 0x8413, 0x8413, 0x22B8, 0x8414, 0x8414, 0x3C10,
+    0x8416, 0x8416, 0x4037, 0x8418, 0x8418, 0x3E7A, 0x841B, 0x841B, 0x22C1,
+    0x841C, 0x841C, 0x3EB3, 0x8420, 0x8420, 0x3C55, 0x8421, 0x8421, 0x3751,
+    0x8423, 0x8423, 0x2293, 0x8424, 0x8424, 0x4951, 0x8426, 0x8426, 0x46D8,
+    0x8429, 0x8429, 0x254D, 0x842B, 0x842B, 0x2563, 0x842C, 0x842C, 0x0EAC,
+    0x842D, 0x842D, 0x2552, 0x842E, 0x842E, 0x422D, 0x842F, 0x842F, 0x2550,
+    0x8430, 0x8430, 0x253B, 0x8431, 0x8431, 0x0EDE, 0x8432, 0x8432, 0x254B,
+    0x8433, 0x8433, 0x255F, 0x8434, 0x8434, 0x2547, 0x8435, 0x8435, 0x0EE6,
+    0x8436, 0x8436, 0x255E, 0x8437, 0x8437, 0x2545, 0x8438, 0x8438, 0x0D41,
+    0x8439, 0x8439, 0x2555, 0x843A, 0x843A, 0x2546, 0x843B, 0x843B, 0x255C,
+    0x843C, 0x843C, 0x0EE5, 0x843D, 0x843D, 0x0EDD, 0x843E, 0x843E, 0x3D21,
+    0x843F, 0x843F, 0x2530, 0x8440, 0x8440, 0x2538, 0x8442, 0x8442, 0x2551,
+    0x8443, 0x8443, 0x2549, 0x8444, 0x8444, 0x2562, 0x8445, 0x8445, 0x254C,
+    0x8446, 0x8446, 0x0EEB, 0x8447, 0x8447, 0x255D, 0x8448, 0x8448, 0x4718,
+    0x8449, 0x8449, 0x0EE2, 0x844A, 0x844A, 0x37E4, 0x844B, 0x844B, 0x254F,
+    0x844C, 0x844C, 0x2557, 0x844D, 0x844D, 0x253C, 0x844E, 0x844E, 0x2556,
+    0x8450, 0x8450, 0x2567, 0x8451, 0x8451, 0x2537, 0x8452, 0x8452, 0x2558,
+    0x8453, 0x8453, 0x3B7D, 0x8454, 0x8454, 0x2565, 0x8455, 0x8455, 0x398B,
+    0x8456, 0x8456, 0x2531, 0x8457, 0x8457, 0x0D39, 0x8458, 0x8458, 0x37DE,
+    0x8459, 0x8459, 0x253F, 0x845A, 0x845A, 0x253E, 0x845B, 0x845B, 0x0EE4,
+    0x845C, 0x845C, 0x3EDB, 0x845D, 0x845D, 0x2542, 0x845E, 0x845E, 0x2544,
+    0x845F, 0x845F, 0x2553, 0x8460, 0x8460, 0x2564, 0x8461, 0x8461, 0x0EE7,
+    0x8462, 0x8462, 0x42DA, 0x8463, 0x8463, 0x0EE8, 0x8464, 0x8464, 0x4761,
+    0x8465, 0x8465, 0x2536, 0x8466, 0x8466, 0x0EE0, 0x8467, 0x8467, 0x253A,
+    0x8468, 0x8468, 0x2560, 0x8469, 0x8469, 0x0EE9, 0x846B, 0x846B, 0x0EE1,
+    0x846C, 0x846C, 0x0EE3, 0x846D, 0x846D, 0x0EEA, 0x846E, 0x846E, 0x2566,
+    0x846F, 0x846F, 0x2559, 0x8470, 0x8470, 0x2554, 0x8471, 0x8471, 0x37E0,
+    0x8472, 0x8472, 0x3C93, 0x8473, 0x8473, 0x2541, 0x8474, 0x8474, 0x2540,
+    0x8475, 0x8475, 0x0EDF, 0x8476, 0x8476, 0x2532, 0x8477, 0x8477, 0x0EDC,
+    0x8478, 0x8478, 0x254A, 0x8479, 0x8479, 0x2533, 0x847A, 0x847A, 0x2548,
+    0x847D, 0x847D, 0x253D, 0x847E, 0x847E, 0x2561, 0x847F, 0x847F, 0x394E,
+    0x8480, 0x8480, 0x3B6E, 0x8482, 0x8482, 0x0EDB, 0x8486, 0x8486, 0x2539,
+    0x8488, 0x8488, 0x4762, 0x848D, 0x848D, 0x2535, 0x848E, 0x848E, 0x255B,
+    0x848F, 0x848F, 0x2534, 0x8490, 0x8490, 0x108E, 0x8491, 0x8491, 0x27CD,
+    0x8492, 0x8492, 0x3756, 0x8493, 0x8493, 0x37EE, 0x8494, 0x8494, 0x27BC,
+    0x8496, 0x8496, 0x3B1D, 0x8497, 0x8497, 0x27A6, 0x8498, 0x8498, 0x27C4,
+    0x8499, 0x8499, 0x1086, 0x849A, 0x849A, 0x27B5, 0x849B, 0x849B, 0x27BF,
+    0x849C, 0x849C, 0x1089, 0x849D, 0x849D, 0x27B8, 0x849E, 0x849E, 0x1087,
+    0x849F, 0x849F, 0x27A9, 0x84A0, 0x84A0, 0x27C7, 0x84A1, 0x84A1, 0x27A8,
+    0x84A2, 0x84A2, 0x27BB, 0x84A3, 0x84A3, 0x3B9E, 0x84A4, 0x84A4, 0x27A7,
+    0x84A7, 0x84A7, 0x27B9, 0x84A8, 0x84A8, 0x27C2, 0x84A9, 0x84A9, 0x27C0,
+    0x84AA, 0x84AA, 0x27B4, 0x84AB, 0x84AB, 0x27AF, 0x84AC, 0x84AC, 0x27AD,
+    0x84AD, 0x84AD, 0x3D8C, 0x84AE, 0x84AE, 0x27AE, 0x84AF, 0x84AF, 0x27C1,
+    0x84B0, 0x84B0, 0x27CC, 0x84B1, 0x84B1, 0x27B6, 0x84B2, 0x84B2, 0x1088,
+    0x84B4, 0x84B4, 0x27B1, 0x84B6, 0x84B6, 0x27C5, 0x84B8, 0x84B8, 0x108B,
+    0x84B9, 0x84B9, 0x27B0, 0x84BA, 0x84BA, 0x27AA, 0x84BB, 0x84BB, 0x27BA,
+    0x84BC, 0x84BC, 0x108F, 0x84BD, 0x84BD, 0x3C4C, 0x84BE, 0x84BE, 0x4764,
+    0x84BF, 0x84BF, 0x1083, 0x84C0, 0x84C0, 0x108C, 0x84C1, 0x84C1, 0x27B2,
+    0x84C2, 0x84C2, 0x27AC, 0x84C4, 0x84C4, 0x1085, 0x84C5, 0x84C5, 0x255A,
+    0x84C6, 0x84C6, 0x1084, 0x84C7, 0x84C7, 0x27BD, 0x84C9, 0x84C9, 0x1082,
+    0x84CA, 0x84CA, 0x1091, 0x84CB, 0x84CB, 0x108A, 0x84CC, 0x84CC, 0x27BE,
+    0x84CD, 0x84CD, 0x27B3, 0x84CE, 0x84CE, 0x27AB, 0x84CF, 0x84CF, 0x27C6,
+    0x84D0, 0x84D0, 0x27B7, 0x84D1, 0x84D1, 0x1090, 0x84D2, 0x84D2, 0x27CA,
+    0x84D3, 0x84D3, 0x108D, 0x84D4, 0x84D4, 0x27C9, 0x84D6, 0x84D6, 0x27C3,
+    0x84D7, 0x84D7, 0x27C8, 0x84DA, 0x84DA, 0x3FF5, 0x84DB, 0x84DB, 0x27CB,
+    0x84DE, 0x84DE, 0x37EA, 0x84E1, 0x84E1, 0x4765, 0x84E2, 0x84E2, 0x37B5,
+    0x84E4, 0x84E4, 0x37EF, 0x84E5, 0x84E5, 0x3BD0, 0x84E7, 0x84E8, 0x2A03,
+    0x84E9, 0x84E9, 0x29F7, 0x84EA, 0x84EA, 0x29F6, 0x84EB, 0x84EB, 0x29F2,
+    0x84EC, 0x84EC, 0x11FB, 0x84EE, 0x84EE, 0x11F3, 0x84EF, 0x84EF, 0x2A06,
+    0x84F0, 0x84F0, 0x2A05, 0x84F1, 0x84F1, 0x252F, 0x84F2, 0x84F2, 0x29EF,
+    0x84F3, 0x84F3, 0x29F3, 0x84F4, 0x84F4, 0x29ED, 0x84F6, 0x84F6, 0x2A00,
+    0x84F7, 0x84F7, 0x29F1, 0x84F8, 0x84F8, 0x4766, 0x84F9, 0x84F9, 0x2A07,
+    0x84FA, 0x84FA, 0x29EA, 0x84FB, 0x84FB, 0x29E8, 0x84FC, 0x84FC, 0x29F4,
+    0x84FD, 0x84FD, 0x29FE, 0x84FE, 0x84FE, 0x29F9, 0x84FF, 0x84FF, 0x11FD,
+    0x8500, 0x8500, 0x29DF, 0x8502, 0x8502, 0x29FD, 0x8503, 0x8503, 0x398A,
+    0x8505, 0x8505, 0x40EB, 0x8506, 0x8506, 0x11FE, 0x8507, 0x8507, 0x2543,
+    0x8508, 0x8508, 0x29EB, 0x8509, 0x8509, 0x29E2, 0x850A, 0x850A, 0x29E5,
+    0x850B, 0x850B, 0x2A0B, 0x850C, 0x850C, 0x29EC, 0x850D, 0x850D, 0x29E3,
+    0x850E, 0x850E, 0x29E1, 0x850F, 0x850F, 0x29DE, 0x8510, 0x8510, 0x4767,
+    0x8511, 0x8511, 0x11F7, 0x8512, 0x8512, 0x29F5, 0x8513, 0x8513, 0x11F6,
+    0x8514, 0x8514, 0x11FA, 0x8515, 0x8515, 0x29F0, 0x8516, 0x8516, 0x29F8,
+    0x8517, 0x8517, 0x11F0, 0x8518, 0x8518, 0x2A08, 0x8519, 0x8519, 0x2A0C,
+    0x851A, 0x851A, 0x11F2, 0x851C, 0x851C, 0x29E7, 0x851D, 0x851D, 0x29FB,
+    0x851E, 0x851E, 0x29FF, 0x851F, 0x851F, 0x29E4, 0x8520, 0x8520, 0x2A09,
+    0x8521, 0x8521, 0x11F9, 0x8523, 0x8523, 0x11F8, 0x8524, 0x8524, 0x29DC,
+    0x8525, 0x8525, 0x11FC, 0x8526, 0x8526, 0x2A02, 0x8527, 0x8527, 0x29E6,
+    0x8528, 0x8528, 0x29FA, 0x8529, 0x8529, 0x29E0, 0x852A, 0x852A, 0x29EE,
+    0x852B, 0x852B, 0x29E9, 0x852C, 0x852D, 0x11F4, 0x852E, 0x852E, 0x29FC,
+    0x852F, 0x852F, 0x2A0D, 0x8530, 0x8530, 0x2A0A, 0x8531, 0x8531, 0x2A01,
+    0x8533, 0x8533, 0x4228, 0x8534, 0x8534, 0x37F4, 0x8538, 0x8538, 0x4768,
+    0x853B, 0x853B, 0x29DD, 0x853D, 0x853D, 0x11F1, 0x853E, 0x853E, 0x2C4F,
+    0x8540, 0x8540, 0x2C46, 0x8541, 0x8541, 0x2C49, 0x8542, 0x8542, 0x4062,
+    0x8543, 0x8543, 0x133B, 0x8544, 0x8544, 0x2C4B, 0x8545, 0x8545, 0x2C40,
+    0x8546, 0x8546, 0x2C47, 0x8547, 0x8547, 0x2C4D, 0x8548, 0x8548, 0x1338,
+    0x8549, 0x8549, 0x133C, 0x854A, 0x854A, 0x1336, 0x854B, 0x854B, 0x37C0,
+    0x854C, 0x854C, 0x400F, 0x854D, 0x854D, 0x2C42, 0x854E, 0x854E, 0x2C52,
+    0x8551, 0x8551, 0x2C4C, 0x8552, 0x8552, 0x4769, 0x8553, 0x8553, 0x2C43,
+    0x8554, 0x8554, 0x2C5B, 0x8555, 0x8555, 0x2C55, 0x8556, 0x8556, 0x2C3F,
+    0x8557, 0x8557, 0x2E23, 0x8558, 0x8558, 0x2C45, 0x8559, 0x8559, 0x1337,
+    0x855A, 0x855A, 0x37DB, 0x855B, 0x855B, 0x2C50, 0x855D, 0x855D, 0x2C5A,
+    0x855E, 0x855E, 0x133F, 0x8560, 0x8560, 0x2C57, 0x8561, 0x8561, 0x2C44,
+    0x8562, 0x8562, 0x2C4A, 0x8563, 0x8563, 0x2C4E, 0x8564, 0x8564, 0x2C48,
+    0x8565, 0x8565, 0x2C5C, 0x8566, 0x8566, 0x2C59, 0x8567, 0x8567, 0x2C56,
+    0x8568, 0x8569, 0x1339, 0x856A, 0x856A, 0x133E, 0x856B, 0x856B, 0x2C41,
+    0x856C, 0x856C, 0x2C5D, 0x856D, 0x856D, 0x133D, 0x856E, 0x856E, 0x2C53,
+    0x856F, 0x8570, 0x476B, 0x8571, 0x8571, 0x2C51, 0x8573, 0x8573, 0x37F8,
+    0x8575, 0x8575, 0x2C54, 0x8576, 0x8576, 0x2E30, 0x8577, 0x8577, 0x2E1D,
+    0x8578, 0x8578, 0x2E22, 0x8579, 0x8579, 0x2E2F, 0x857A, 0x857A, 0x2E21,
+    0x857B, 0x857B, 0x2E19, 0x857C, 0x857C, 0x2E1E, 0x857E, 0x857E, 0x145C,
+    0x8580, 0x8580, 0x2E12, 0x8581, 0x8581, 0x2E2A, 0x8582, 0x8582, 0x2E2C,
+    0x8583, 0x8583, 0x2E11, 0x8584, 0x8584, 0x145B, 0x8585, 0x8585, 0x2E2E,
+    0x8586, 0x8586, 0x2E26, 0x8587, 0x8587, 0x1462, 0x8588, 0x8588, 0x2E2D,
+    0x8589, 0x8589, 0x2E1F, 0x858A, 0x858A, 0x1464, 0x858B, 0x858B, 0x2E17,
+    0x858C, 0x858C, 0x2C58, 0x858D, 0x858D, 0x2E27, 0x858E, 0x858E, 0x2E24,
+    0x858F, 0x858F, 0x2E13, 0x8590, 0x8590, 0x2E32, 0x8591, 0x8591, 0x145E,
+    0x8594, 0x8594, 0x145F, 0x8595, 0x8595, 0x2E15, 0x8596, 0x8596, 0x2E25,
+    0x8598, 0x8598, 0x2E31, 0x8599, 0x8599, 0x2E28, 0x859A, 0x859A, 0x2E1B,
+    0x859B, 0x859B, 0x1461, 0x859C, 0x859C, 0x145D, 0x859D, 0x859D, 0x2E29,
+    0x859E, 0x859E, 0x2E1C, 0x859F, 0x859F, 0x2E33, 0x85A0, 0x85A0, 0x2E16,
+    0x85A1, 0x85A1, 0x2E20, 0x85A2, 0x85A2, 0x2E2B, 0x85A3, 0x85A3, 0x2E18,
+    0x85A4, 0x85A4, 0x2E1A, 0x85A6, 0x85A6, 0x1465, 0x85A7, 0x85A7, 0x2E14,
+    0x85A8, 0x85A8, 0x1463, 0x85A9, 0x85A9, 0x151C, 0x85AA, 0x85AA, 0x145A,
+    0x85AF, 0x85AF, 0x1460, 0x85B0, 0x85B0, 0x1520, 0x85B1, 0x85B1, 0x2FA6,
+    0x85B3, 0x85B3, 0x2F9C, 0x85B4, 0x85B4, 0x2F97, 0x85B5, 0x85B5, 0x2F9D,
+    0x85B6, 0x85B6, 0x2FA7, 0x85B7, 0x85B7, 0x2FAB, 0x85B8, 0x85B8, 0x2FAA,
+    0x85B9, 0x85B9, 0x1522, 0x85BA, 0x85BA, 0x1521, 0x85BD, 0x85BD, 0x2F9E,
+    0x85BE, 0x85BE, 0x2FAC, 0x85BF, 0x85BF, 0x2FA1, 0x85C0, 0x85C0, 0x2F99,
+    0x85C1, 0x85C1, 0x37FE, 0x85C2, 0x85C2, 0x2F9B, 0x85C3, 0x85C3, 0x2F9A,
+    0x85C4, 0x85C4, 0x2FA0, 0x85C5, 0x85C5, 0x2FA5, 0x85C6, 0x85C6, 0x2F98,
+    0x85C7, 0x85C7, 0x2F9F, 0x85C8, 0x85C8, 0x2FA4, 0x85C9, 0x85C9, 0x151F,
+    0x85CB, 0x85CB, 0x2FA2, 0x85CD, 0x85CD, 0x151D, 0x85CE, 0x85CE, 0x2FA3,
+    0x85CF, 0x85CF, 0x151B, 0x85D0, 0x85D0, 0x151E, 0x85D1, 0x85D1, 0x3101,
+    0x85D2, 0x85D2, 0x2FA8, 0x85D5, 0x85D5, 0x15B7, 0x85D7, 0x85D7, 0x30F9,
+    0x85D8, 0x85D8, 0x30FD, 0x85D9, 0x85D9, 0x30F5, 0x85DA, 0x85DA, 0x30F8,
+    0x85DC, 0x85DC, 0x3100, 0x85DD, 0x85DD, 0x15B5, 0x85DE, 0x85DE, 0x3105,
+    0x85DF, 0x85DF, 0x30FE, 0x85E0, 0x85E0, 0x476D, 0x85E1, 0x85E1, 0x30F6,
+    0x85E2, 0x85E2, 0x3106, 0x85E3, 0x85E3, 0x30FF, 0x85E4, 0x85E5, 0x15B8,
+    0x85E6, 0x85E6, 0x3103, 0x85E8, 0x85E8, 0x30F7, 0x85E9, 0x85E9, 0x15B4,
+    0x85EA, 0x85EA, 0x15B6, 0x85EB, 0x85EB, 0x30F2, 0x85EC, 0x85EC, 0x30FA,
+    0x85ED, 0x85ED, 0x30F4, 0x85EE, 0x85EE, 0x3C56, 0x85EF, 0x85EF, 0x3104,
+    0x85F0, 0x85F0, 0x3102, 0x85F1, 0x85F1, 0x30F3, 0x85F2, 0x85F2, 0x30FB,
+    0x85F6, 0x85F6, 0x3225, 0x85F7, 0x85F7, 0x15BA, 0x85F8, 0x85F8, 0x30FC,
+    0x85F9, 0x85F9, 0x1638, 0x85FA, 0x85FA, 0x163A, 0x85FB, 0x85FB, 0x1637,
+    0x85FC, 0x85FC, 0x3C50, 0x85FD, 0x85FD, 0x322A, 0x85FE, 0x85FE, 0x3222,
+    0x85FF, 0x85FF, 0x3220, 0x8600, 0x8600, 0x3224, 0x8601, 0x8601, 0x3221,
+    0x8602, 0x8602, 0x3800, 0x8604, 0x8604, 0x3226, 0x8605, 0x8605, 0x3228,
+    0x8606, 0x8606, 0x163B, 0x8607, 0x8607, 0x163D, 0x8609, 0x8609, 0x3227,
+    0x860A, 0x860A, 0x163E, 0x860B, 0x860B, 0x163C, 0x860C, 0x860C, 0x3229,
+    0x860D, 0x860D, 0x4064, 0x8610, 0x8610, 0x3B7F, 0x8611, 0x8611, 0x1639,
+    0x8614, 0x8614, 0x46BE, 0x8616, 0x8616, 0x37FB, 0x8617, 0x8617, 0x1685,
+    0x8618, 0x8618, 0x32F6, 0x8619, 0x8619, 0x32FC, 0x861A, 0x861A, 0x1687,
+    0x861B, 0x861B, 0x3223, 0x861C, 0x861C, 0x32FB, 0x861E, 0x861E, 0x3302,
+    0x861F, 0x861F, 0x32F9, 0x8620, 0x8620, 0x3300, 0x8621, 0x8621, 0x32FF,
+    0x8622, 0x8622, 0x321F, 0x8623, 0x8623, 0x32FA, 0x8624, 0x8624, 0x2FA9,
+    0x8625, 0x8625, 0x3303, 0x8626, 0x8626, 0x32F8, 0x8627, 0x8627, 0x32FD,
+    0x8628, 0x8628, 0x3805, 0x8629, 0x8629, 0x3301, 0x862A, 0x862A, 0x32F7,
+    0x862C, 0x862C, 0x33AA, 0x862D, 0x862D, 0x1686, 0x862E, 0x862E, 0x32FE,
+    0x862F, 0x862F, 0x3F9E, 0x8631, 0x8631, 0x3432, 0x8632, 0x8632, 0x33AB,
+    0x8633, 0x8633, 0x33A9, 0x8634, 0x8635, 0x33A7, 0x8636, 0x8636, 0x33AC,
+    0x8638, 0x8638, 0x1707, 0x8639, 0x8639, 0x3430, 0x863A, 0x863A, 0x342E,
+    0x863B, 0x863B, 0x3433, 0x863C, 0x863C, 0x3431, 0x863E, 0x863E, 0x3434,
+    0x863F, 0x863F, 0x1708, 0x8640, 0x8640, 0x342F, 0x8642, 0x8642, 0x38C1,
+    0x8643, 0x8643, 0x3497, 0x8645, 0x8645, 0x3B66, 0x8646, 0x8648, 0x34DF,
+    0x864B, 0x864B, 0x353E, 0x864C, 0x864C, 0x3536, 0x864D, 0x864D, 0x1818,
+    0x864E, 0x864E, 0x0689, 0x8650, 0x8650, 0x07FF, 0x8652, 0x8652, 0x1DE3,
+    0x8653, 0x8653, 0x1DE2, 0x8654, 0x8654, 0x09AF, 0x8655, 0x8655, 0x0B88,
+    0x8656, 0x8656, 0x203C, 0x8659, 0x8659, 0x203B, 0x865B, 0x865B, 0x0D48,
+    0x865C, 0x865C, 0x0EED, 0x865E, 0x865E, 0x0EEC, 0x865F, 0x865F, 0x0EEE,
+    0x8661, 0x8661, 0x27CE, 0x8662, 0x8662, 0x2A0E, 0x8663, 0x8663, 0x2C5E,
+    0x8664, 0x8664, 0x2C60, 0x8665, 0x8665, 0x2C5F, 0x8667, 0x8667, 0x1466,
+    0x8668, 0x8668, 0x2E34, 0x8669, 0x8669, 0x2FAD, 0x866A, 0x866A, 0x351E,
+    0x866B, 0x866B, 0x040F, 0x866C, 0x866C, 0x3813, 0x866D, 0x866E, 0x1A46,
+    0x866F, 0x866F, 0x1A45, 0x8670, 0x8670, 0x1A44, 0x8671, 0x8671, 0x068A,
+    0x8672, 0x8672, 0x476F, 0x8673, 0x8673, 0x1BFD, 0x8674, 0x8674, 0x1BFB,
+    0x8677, 0x8677, 0x1BFA, 0x8679, 0x8679, 0x0800, 0x867A, 0x867A, 0x0802,
+    0x867B, 0x867B, 0x0801, 0x867C, 0x867C, 0x1BFC, 0x867E, 0x867E, 0x380A,
+    0x8685, 0x8685, 0x1DEF, 0x8686, 0x8686, 0x1DEC, 0x8687, 0x8687, 0x1DEA,
+    0x868A, 0x868A, 0x09B0, 0x868B, 0x868B, 0x1DED, 0x868C, 0x868C, 0x09B5,
+    0x868D, 0x868D, 0x1DE7, 0x868E, 0x868E, 0x1DF6, 0x8690, 0x8690, 0x1DF8,
+    0x8691, 0x8691, 0x1DE8, 0x8692, 0x8692, 0x4770, 0x8693, 0x8693, 0x09B2,
+    0x8694, 0x8694, 0x1DF9, 0x8695, 0x8695, 0x1DF4, 0x8696, 0x8696, 0x1DE6,
+    0x8697, 0x8697, 0x1DEB, 0x8698, 0x8698, 0x1DF5, 0x8699, 0x8699, 0x1DF1,
+    0x869A, 0x869A, 0x1DEE, 0x869C, 0x869C, 0x09B7, 0x869D, 0x869D, 0x1DF7,
+    0x869E, 0x869E, 0x1DE9, 0x86A0, 0x86A0, 0x3B88, 0x86A1, 0x86A1, 0x1DF2,
+    0x86A2, 0x86A2, 0x1DE4, 0x86A3, 0x86A3, 0x09B6, 0x86A4, 0x86A4, 0x09B3,
+    0x86A5, 0x86A5, 0x1DF0, 0x86A7, 0x86A7, 0x1DF3, 0x86A8, 0x86A8, 0x1DE5,
+    0x86A9, 0x86A9, 0x09B4, 0x86AA, 0x86AA, 0x09B1, 0x86AD, 0x86AD, 0x3F06,
+    0x86AF, 0x86AF, 0x0B92, 0x86B0, 0x86B0, 0x2043, 0x86B1, 0x86B1, 0x0B91,
+    0x86B2, 0x86B2, 0x43E0, 0x86B3, 0x86B3, 0x2046, 0x86B4, 0x86B4, 0x2049,
+    0x86B5, 0x86B5, 0x0B8E, 0x86B6, 0x86B6, 0x0B8C, 0x86B7, 0x86B7, 0x203E,
+    0x86B8, 0x86B8, 0x2047, 0x86B9, 0x86B9, 0x2045, 0x86BA, 0x86BA, 0x2042,
+    0x86BB, 0x86BC, 0x204A, 0x86BD, 0x86BE, 0x204D, 0x86BF, 0x86BF, 0x203D,
+    0x86C0, 0x86C0, 0x0B8B, 0x86C1, 0x86C1, 0x2040, 0x86C2, 0x86C2, 0x203F,
+    0x86C3, 0x86C3, 0x204C, 0x86C4, 0x86C4, 0x0B8D, 0x86C5, 0x86C5, 0x2041,
+    0x86C6, 0x86C6, 0x0B8F, 0x86C7, 0x86C7, 0x0B8A, 0x86C8, 0x86C8, 0x2044,
+    0x86C9, 0x86C9, 0x0B93, 0x86CB, 0x86CB, 0x0B90, 0x86CC, 0x86CC, 0x2048,
+    0x86D0, 0x86D0, 0x0D4F, 0x86D1, 0x86D1, 0x22D2, 0x86D3, 0x86D3, 0x22C7,
+    0x86D4, 0x86D4, 0x0D4C, 0x86D6, 0x86D6, 0x256D, 0x86D7, 0x86D7, 0x22D0,
+    0x86D8, 0x86D8, 0x22C4, 0x86D9, 0x86D9, 0x0D4A, 0x86DA, 0x86DA, 0x22C9,
+    0x86DB, 0x86DB, 0x0D4D, 0x86DC, 0x86DC, 0x22CD, 0x86DD, 0x86DD, 0x22CB,
+    0x86DE, 0x86DE, 0x0D50, 0x86DF, 0x86DF, 0x0D49, 0x86E2, 0x86E2, 0x22C5,
+    0x86E3, 0x86E3, 0x22C8, 0x86E4, 0x86E4, 0x0D4E, 0x86E6, 0x86E6, 0x22C6,
+    0x86E8, 0x86E8, 0x22D1, 0x86E9, 0x86E9, 0x22CF, 0x86EA, 0x86EA, 0x22CA,
+    0x86EB, 0x86EB, 0x22CC, 0x86EC, 0x86EC, 0x22CE, 0x86ED, 0x86ED, 0x0D4B,
+    0x86EF, 0x86EF, 0x4771, 0x86F5, 0x86F5, 0x256E, 0x86F6, 0x86F6, 0x2574,
+    0x86F7, 0x86F7, 0x256A, 0x86F8, 0x86F8, 0x2570, 0x86F9, 0x86F9, 0x0EEF,
+    0x86FA, 0x86FA, 0x256C, 0x86FB, 0x86FB, 0x0EF5, 0x86FE, 0x86FE, 0x0EF4,
+    0x8700, 0x8700, 0x0EF3, 0x8701, 0x8701, 0x2573, 0x8702, 0x8703, 0x0EF6,
+    0x8704, 0x8704, 0x2569, 0x8705, 0x8705, 0x2576, 0x8706, 0x8706, 0x0EF8,
+    0x8707, 0x8707, 0x0EF2, 0x8708, 0x8708, 0x0EF1, 0x8709, 0x8709, 0x2572,
+    0x870A, 0x870A, 0x0EF9, 0x870B, 0x870B, 0x2568, 0x870C, 0x870C, 0x256B,
+    0x870D, 0x870D, 0x2575, 0x870E, 0x870E, 0x2571, 0x8711, 0x8711, 0x27EE,
+    0x8712, 0x8712, 0x27E3, 0x8713, 0x8713, 0x0EF0, 0x8718, 0x8718, 0x1098,
+    0x8719, 0x8719, 0x27D7, 0x871A, 0x871A, 0x27EC, 0x871B, 0x871B, 0x27D8,
+    0x871C, 0x871C, 0x1093, 0x871E, 0x871E, 0x27D5, 0x8720, 0x8720, 0x27DE,
+    0x8721, 0x8721, 0x27D6, 0x8722, 0x8722, 0x1095, 0x8723, 0x8723, 0x27D0,
+    0x8724, 0x8724, 0x27EB, 0x8725, 0x8725, 0x1096, 0x8726, 0x8727, 0x27E8,
+    0x8728, 0x8728, 0x27D1, 0x8729, 0x8729, 0x109B, 0x872A, 0x872A, 0x27E0,
+    0x872C, 0x872C, 0x27DA, 0x872D, 0x872D, 0x27E1, 0x872E, 0x872E, 0x27D4,
+    0x8730, 0x8730, 0x27ED, 0x8731, 0x8731, 0x27E5, 0x8732, 0x8732, 0x27DF,
+    0x8733, 0x8733, 0x27CF, 0x8734, 0x8734, 0x1097, 0x8735, 0x8735, 0x27E6,
+    0x8737, 0x8737, 0x109A, 0x8738, 0x8738, 0x27EA, 0x873A, 0x873A, 0x27E4,
+    0x873B, 0x873B, 0x1094, 0x873C, 0x873C, 0x27E2, 0x873E, 0x873E, 0x27DC,
+    0x873F, 0x873F, 0x1092, 0x8740, 0x8740, 0x27D3, 0x8741, 0x8741, 0x27DB,
+    0x8742, 0x8742, 0x27E7, 0x8743, 0x8743, 0x27D9, 0x8746, 0x8746, 0x27DD,
+    0x874C, 0x874C, 0x1208, 0x874D, 0x874D, 0x256F, 0x874E, 0x874E, 0x2A20,
+    0x874F, 0x874F, 0x2A29, 0x8750, 0x8750, 0x2A1F, 0x8751, 0x8751, 0x2A1B,
+    0x8752, 0x8752, 0x2A18, 0x8753, 0x8753, 0x1209, 0x8754, 0x8754, 0x2A16,
+    0x8755, 0x8755, 0x1099, 0x8756, 0x8756, 0x2A0F, 0x8757, 0x8757, 0x1207,
+    0x8758, 0x8758, 0x2A15, 0x8759, 0x8759, 0x1206, 0x875A, 0x875A, 0x2A1A,
+    0x875B, 0x875B, 0x2A17, 0x875C, 0x875C, 0x2A27, 0x875D, 0x875D, 0x2A22,
+    0x875E, 0x875E, 0x2A1C, 0x875F, 0x875F, 0x2A21, 0x8760, 0x8760, 0x1202,
+    0x8761, 0x8761, 0x2A19, 0x8762, 0x8762, 0x2A2C, 0x8763, 0x8764, 0x2A10,
+    0x8765, 0x8765, 0x2A28, 0x8766, 0x8766, 0x1203, 0x8767, 0x8767, 0x2A2D,
+    0x8768, 0x8768, 0x1205, 0x8769, 0x8769, 0x2A2E, 0x876A, 0x876A, 0x2A1E,
+    0x876B, 0x876B, 0x27D2, 0x876C, 0x876C, 0x2A24, 0x876D, 0x876D, 0x2A1D,
+    0x876E, 0x876E, 0x2A26, 0x876F, 0x876F, 0x2A23, 0x8770, 0x8770, 0x3E6C,
+    0x8771, 0x8771, 0x380B, 0x8773, 0x8773, 0x2A14, 0x8774, 0x8774, 0x1200,
+    0x8775, 0x8775, 0x2A2B, 0x8776, 0x8776, 0x1201, 0x8777, 0x8777, 0x2A12,
+    0x8778, 0x8778, 0x1204, 0x8779, 0x8779, 0x2C6B, 0x877A, 0x877A, 0x2A25,
+    0x877B, 0x877B, 0x2A2A, 0x877D, 0x877D, 0x4045, 0x8781, 0x8781, 0x2C68,
+    0x8782, 0x8782, 0x11FF, 0x8783, 0x8783, 0x1340, 0x8784, 0x8784, 0x2C72,
+    0x8785, 0x8785, 0x2C6E, 0x8786, 0x8786, 0x3EB0, 0x8787, 0x8787, 0x2C6C,
+    0x8788, 0x8788, 0x2C67, 0x8789, 0x8789, 0x2C76, 0x878B, 0x878B, 0x43E2,
+    0x878C, 0x878C, 0x3FEF, 0x878D, 0x878D, 0x1344, 0x878F, 0x878F, 0x2C63,
+    0x8790, 0x8791, 0x2C6F, 0x8792, 0x8792, 0x2C66, 0x8793, 0x8793, 0x2C65,
+    0x8794, 0x8794, 0x2C73, 0x8796, 0x8796, 0x2C69, 0x8797, 0x8797, 0x2C64,
+    0x8798, 0x8798, 0x2C6A, 0x879A, 0x879A, 0x2C75, 0x879B, 0x879B, 0x2C62,
+    0x879C, 0x879C, 0x2C74, 0x879D, 0x879D, 0x2C71, 0x879E, 0x879E, 0x1342,
+    0x879F, 0x879F, 0x1341, 0x87A2, 0x87A2, 0x1343, 0x87A3, 0x87A3, 0x2C6D,
+    0x87A4, 0x87A4, 0x2C61, 0x87A5, 0x87A5, 0x3D88, 0x87A9, 0x87A9, 0x3FEC,
+    0x87AA, 0x87AA, 0x2E36, 0x87AB, 0x87AB, 0x146C, 0x87AC, 0x87AC, 0x2E3A,
+    0x87AD, 0x87AD, 0x2E37, 0x87AE, 0x87AE, 0x2E3E, 0x87AF, 0x87AF, 0x2E44,
+    0x87B0, 0x87B0, 0x2E39, 0x87B1, 0x87B1, 0x380F, 0x87B2, 0x87B2, 0x2E4D,
+    0x87B3, 0x87B3, 0x1469, 0x87B4, 0x87B4, 0x2E47, 0x87B5, 0x87B5, 0x2E3C,
+    0x87B6, 0x87B6, 0x2E48, 0x87B7, 0x87B7, 0x2E43, 0x87B8, 0x87B8, 0x2E4A,
+    0x87B9, 0x87B9, 0x2E3B, 0x87BA, 0x87BA, 0x146E, 0x87BB, 0x87BB, 0x146D,
+    0x87BC, 0x87BC, 0x2E3D, 0x87BD, 0x87BD, 0x2E4B, 0x87BE, 0x87BE, 0x2E35,
+    0x87BF, 0x87BF, 0x2E49, 0x87C0, 0x87C0, 0x1467, 0x87C1, 0x87C1, 0x3FFC,
+    0x87C2, 0x87C2, 0x2E41, 0x87C3, 0x87C3, 0x2E40, 0x87C4, 0x87C4, 0x2E45,
+    0x87C5, 0x87C5, 0x2E38, 0x87C6, 0x87C6, 0x146B, 0x87C8, 0x87C8, 0x146F,
+    0x87C9, 0x87C9, 0x2E3F, 0x87CA, 0x87CA, 0x2E46, 0x87CB, 0x87CB, 0x1470,
+    0x87CC, 0x87CC, 0x2E42, 0x87CE, 0x87CE, 0x3FED, 0x87D1, 0x87D1, 0x1468,
+    0x87D2, 0x87D2, 0x146A, 0x87D3, 0x87D3, 0x2FBA, 0x87D4, 0x87D4, 0x2FB8,
+    0x87D6, 0x87D6, 0x3F92, 0x87D7, 0x87D7, 0x2FBE, 0x87D8, 0x87D8, 0x2FBC,
+    0x87D9, 0x87D9, 0x2FBF, 0x87DA, 0x87DA, 0x3810, 0x87DB, 0x87DB, 0x2FB1,
+    0x87DC, 0x87DC, 0x2FB9, 0x87DD, 0x87DD, 0x2FC3, 0x87DE, 0x87DE, 0x2E4C,
+    0x87DF, 0x87DF, 0x2FB5, 0x87E0, 0x87E0, 0x1526, 0x87E1, 0x87E1, 0x2A13,
+    0x87E2, 0x87E2, 0x2FB0, 0x87E3, 0x87E3, 0x2FBD, 0x87E4, 0x87E4, 0x2FB7,
+    0x87E5, 0x87E5, 0x2FB4, 0x87E6, 0x87E6, 0x2FAF, 0x87E7, 0x87E7, 0x2FAE,
+    0x87E8, 0x87E8, 0x2FC2, 0x87EA, 0x87EA, 0x2FB3, 0x87EB, 0x87EB, 0x2FB2,
+    0x87EC, 0x87EC, 0x1524, 0x87ED, 0x87ED, 0x2FBB, 0x87EE, 0x87EE, 0x380D,
+    0x87EF, 0x87EF, 0x1523, 0x87F2, 0x87F2, 0x1525, 0x87F3, 0x87F3, 0x2FB6,
+    0x87F4, 0x87F4, 0x2FC1, 0x87F5, 0x87F5, 0x3FAE, 0x87F6, 0x87F7, 0x310A,
+    0x87F9, 0x87F9, 0x15BE, 0x87FA, 0x87FA, 0x3108, 0x87FB, 0x87FB, 0x15BB,
+    0x87FC, 0x87FC, 0x3110, 0x87FE, 0x87FE, 0x15BF, 0x87FF, 0x87FF, 0x3112,
+    0x8800, 0x8800, 0x3107, 0x8801, 0x8801, 0x2FC0, 0x8802, 0x8802, 0x3114,
+    0x8803, 0x8803, 0x3109, 0x8804, 0x8804, 0x3EAF, 0x8805, 0x8805, 0x15BC,
+    0x8806, 0x8806, 0x310F, 0x8808, 0x8808, 0x3111, 0x8809, 0x8809, 0x310C,
+    0x880A, 0x880A, 0x3113, 0x880B, 0x880B, 0x310E, 0x880C, 0x880C, 0x310D,
+    0x880D, 0x880D, 0x15BD, 0x880F, 0x880F, 0x3811, 0x8810, 0x8811, 0x322C,
+    0x8813, 0x8813, 0x322F, 0x8814, 0x8815, 0x163F, 0x8816, 0x8816, 0x3230,
+    0x8817, 0x8817, 0x322E, 0x8818, 0x8818, 0x3F7A, 0x8819, 0x8819, 0x322B,
+    0x881B, 0x881B, 0x3306, 0x881C, 0x881C, 0x3309, 0x881D, 0x881D, 0x3305,
+    0x881F, 0x881F, 0x168B, 0x8820, 0x8820, 0x3307, 0x8821, 0x8821, 0x168A,
+    0x8822, 0x8822, 0x1689, 0x8823, 0x8823, 0x1688, 0x8824, 0x8824, 0x3308,
+    0x8825, 0x8825, 0x33B1, 0x8826, 0x8826, 0x33AF, 0x8827, 0x8827, 0x3E07,
+    0x8828, 0x8828, 0x33AE, 0x8829, 0x8829, 0x3304, 0x882A, 0x882A, 0x33B0,
+    0x882B, 0x882B, 0x330A, 0x882C, 0x882C, 0x33AD, 0x882D, 0x882D, 0x3B8B,
+    0x882E, 0x882E, 0x3437, 0x882F, 0x882F, 0x3415, 0x8830, 0x8830, 0x3435,
+    0x8831, 0x8831, 0x1709, 0x8832, 0x8832, 0x3436, 0x8833, 0x8833, 0x3438,
+    0x8835, 0x8835, 0x349A, 0x8836, 0x8836, 0x1728, 0x8837, 0x8837, 0x3499,
+    0x8838, 0x8838, 0x3498, 0x8839, 0x8839, 0x1729, 0x883B, 0x883B, 0x1747,
+    0x883C, 0x883C, 0x3508, 0x883D, 0x883D, 0x3520, 0x883E, 0x883E, 0x351F,
+    0x883F, 0x883F, 0x3521, 0x8840, 0x8840, 0x0410, 0x8841, 0x8841, 0x1BFE,
+    0x8842, 0x8842, 0x3F5A, 0x8843, 0x8844, 0x1DFA, 0x8845, 0x8846, 0x3816,
+    0x8848, 0x8848, 0x22D3, 0x884A, 0x884A, 0x330B, 0x884B, 0x884B, 0x349B,
+    0x884C, 0x884C, 0x0411, 0x884D, 0x884D, 0x0803, 0x884E, 0x884E, 0x1BFF,
+    0x884F, 0x884F, 0x3844, 0x8852, 0x8852, 0x204F, 0x8853, 0x8853, 0x0B94,
+    0x8855, 0x8855, 0x22D5, 0x8856, 0x8856, 0x22D4, 0x8857, 0x8857, 0x0D51,
+    0x8859, 0x8859, 0x0EFA, 0x885A, 0x885A, 0x2A2F, 0x885B, 0x885B, 0x120A,
+    0x885D, 0x885D, 0x120B, 0x885E, 0x885E, 0x381B, 0x8860, 0x8860, 0x3A46,
+    0x8861, 0x8861, 0x1345, 0x8862, 0x8862, 0x172A, 0x8863, 0x8863, 0x0412,
+    0x8864, 0x8864, 0x4502, 0x8865, 0x8865, 0x3DFC, 0x8867, 0x8867, 0x1C00,
+    0x8868, 0x8868, 0x068C, 0x8869, 0x8869, 0x1C02, 0x886A, 0x886A, 0x1C01,
+    0x886B, 0x886B, 0x0804, 0x886D, 0x886D, 0x1DFC, 0x886E, 0x886E, 0x3B8E,
+    0x886F, 0x886F, 0x1E03, 0x8870, 0x8870, 0x09B8, 0x8871, 0x8871, 0x1E01,
+    0x8872, 0x8872, 0x1DFF, 0x8874, 0x8874, 0x1E06, 0x8875, 0x8876, 0x1DFD,
+    0x8877, 0x8877, 0x09B9, 0x8879, 0x8879, 0x09BD, 0x887C, 0x887C, 0x1E07,
+    0x887D, 0x887D, 0x09BC, 0x887E, 0x887E, 0x1E05, 0x887F, 0x887F, 0x1E02,
+    0x8880, 0x8880, 0x1E00, 0x8881, 0x8882, 0x09BA, 0x8883, 0x8883, 0x1E04,
+    0x8884, 0x8884, 0x42F7, 0x8887, 0x8887, 0x3B90, 0x8888, 0x8888, 0x0B96,
+    0x8889, 0x8889, 0x2050, 0x888B, 0x888B, 0x0B9B, 0x888C, 0x888C, 0x2060,
+    0x888D, 0x888D, 0x0B9A, 0x888E, 0x888E, 0x2062, 0x8891, 0x8891, 0x2056,
+    0x8892, 0x8892, 0x0B98, 0x8893, 0x8893, 0x2061, 0x8895, 0x8895, 0x2051,
+    0x8896, 0x8896, 0x0B99, 0x8897, 0x8897, 0x205D, 0x8898, 0x8898, 0x2059,
+    0x8899, 0x8899, 0x205B, 0x889A, 0x889A, 0x2055, 0x889B, 0x889B, 0x205C,
+    0x889C, 0x889C, 0x381C, 0x889E, 0x889E, 0x0B95, 0x889F, 0x889F, 0x2058,
+    0x88A0, 0x88A0, 0x3FA0, 0x88A1, 0x88A1, 0x2057, 0x88A2, 0x88A2, 0x2053,
+    0x88A4, 0x88A4, 0x205E, 0x88A7, 0x88A7, 0x205A, 0x88A8, 0x88A8, 0x2052,
+    0x88AA, 0x88AA, 0x2054, 0x88AB, 0x88AB, 0x0B97, 0x88AC, 0x88AC, 0x205F,
+    0x88AE, 0x88AE, 0x4775, 0x88B1, 0x88B1, 0x0D54, 0x88B2, 0x88B2, 0x22E0,
+    0x88B4, 0x88B5, 0x381E, 0x88B6, 0x88B6, 0x22DC, 0x88B7, 0x88B7, 0x22DE,
+    0x88B8, 0x88B8, 0x22D9, 0x88B9, 0x88B9, 0x22D8, 0x88BA, 0x88BA, 0x22D6,
+    0x88BC, 0x88BC, 0x22DD, 0x88BD, 0x88BD, 0x22DF, 0x88BE, 0x88BE, 0x22DB,
+    0x88BF, 0x88BF, 0x3B91, 0x88C0, 0x88C0, 0x22DA, 0x88C1, 0x88C2, 0x0D52,
+    0x88C5, 0x88C5, 0x3820, 0x88C7, 0x88C7, 0x3EB1, 0x88C9, 0x88C9, 0x22E2,
+    0x88CA, 0x88CA, 0x0F02, 0x88CB, 0x88CB, 0x2578, 0x88CC, 0x88CC, 0x257E,
+    0x88CD, 0x88CE, 0x2579, 0x88CF, 0x88CF, 0x36EA, 0x88D0, 0x88D0, 0x257F,
+    0x88D2, 0x88D2, 0x0F04, 0x88D4, 0x88D4, 0x0EFC, 0x88D5, 0x88D5, 0x0F03,
+    0x88D6, 0x88D6, 0x2577, 0x88D7, 0x88D7, 0x22D7, 0x88D8, 0x88D8, 0x0EFF,
+    0x88D9, 0x88D9, 0x0EFD, 0x88DA, 0x88DA, 0x257D, 0x88DB, 0x88DB, 0x257C,
+    0x88DC, 0x88DC, 0x0EFE, 0x88DD, 0x88DD, 0x0F00, 0x88DE, 0x88DE, 0x257B,
+    0x88DF, 0x88DF, 0x0EFB, 0x88E1, 0x88E1, 0x0F01, 0x88E6, 0x88E6, 0x3B92,
+    0x88E7, 0x88E7, 0x27F0, 0x88E8, 0x88E8, 0x10A2, 0x88EB, 0x88EB, 0x27FB,
+    0x88EC, 0x88EC, 0x27FA, 0x88EE, 0x88EE, 0x27F5, 0x88EF, 0x88EF, 0x10A4,
+    0x88F0, 0x88F0, 0x27F9, 0x88F1, 0x88F2, 0x27F1, 0x88F3, 0x88F3, 0x109C,
+    0x88F4, 0x88F4, 0x109E, 0x88F5, 0x88F5, 0x3E08, 0x88F6, 0x88F6, 0x27F7,
+    0x88F7, 0x88F7, 0x27EF, 0x88F8, 0x88F8, 0x10A0, 0x88F9, 0x88F9, 0x109F,
+    0x88FA, 0x88FA, 0x27F3, 0x88FB, 0x88FB, 0x27F8, 0x88FC, 0x88FC, 0x27F6,
+    0x88FD, 0x88FD, 0x10A1, 0x88FE, 0x88FE, 0x27F4, 0x88FF, 0x88FF, 0x4776,
+    0x8900, 0x8900, 0x42FA, 0x8901, 0x8901, 0x22E1, 0x8902, 0x8902, 0x109D,
+    0x8905, 0x8905, 0x2A30, 0x8906, 0x8906, 0x2A37, 0x8907, 0x8907, 0x120D,
+    0x8909, 0x8909, 0x2A3B, 0x890A, 0x890A, 0x1211, 0x890B, 0x890B, 0x2A33,
+    0x890C, 0x890C, 0x2A31, 0x890E, 0x890E, 0x2A3A, 0x8910, 0x8910, 0x120C,
+    0x8911, 0x8911, 0x2A39, 0x8912, 0x8913, 0x120E, 0x8914, 0x8914, 0x2A32,
+    0x8915, 0x8915, 0x1210, 0x8916, 0x8916, 0x2A38, 0x8917, 0x8919, 0x2A34,
+    0x891A, 0x891A, 0x10A3, 0x891E, 0x891E, 0x2C77, 0x891F, 0x891F, 0x2C83,
+    0x8921, 0x8921, 0x134A, 0x8922, 0x8922, 0x2C7E, 0x8923, 0x8923, 0x2C80,
+    0x8924, 0x8924, 0x4777, 0x8925, 0x8925, 0x1348, 0x8926, 0x8926, 0x2C78,
+    0x8927, 0x8927, 0x2C7C, 0x8929, 0x8929, 0x2C7F, 0x892A, 0x892A, 0x1346,
+    0x892B, 0x892B, 0x1349, 0x892C, 0x892C, 0x2C82, 0x892D, 0x892E, 0x2C7A,
+    0x892F, 0x892F, 0x2C81, 0x8930, 0x8930, 0x2C79, 0x8931, 0x8931, 0x2C7D,
+    0x8932, 0x8932, 0x1347, 0x8933, 0x8933, 0x2E4F, 0x8935, 0x8935, 0x2E4E,
+    0x8936, 0x8936, 0x1472, 0x8937, 0x8937, 0x2E54, 0x8938, 0x8938, 0x1474,
+    0x893B, 0x893B, 0x1471, 0x893C, 0x893C, 0x2E50, 0x893D, 0x893D, 0x1475,
+    0x893E, 0x893E, 0x2E51, 0x8941, 0x8941, 0x2E52, 0x8942, 0x8942, 0x2E55,
+    0x8943, 0x8943, 0x3E16, 0x8944, 0x8944, 0x1473, 0x8946, 0x8946, 0x2FC8,
+    0x8947, 0x8947, 0x43E3, 0x8949, 0x8949, 0x2FCB, 0x894B, 0x894B, 0x2FC5,
+    0x894C, 0x894C, 0x2FC7, 0x894D, 0x894D, 0x3B94, 0x894F, 0x894F, 0x2FC6,
+    0x8950, 0x8951, 0x2FC9, 0x8952, 0x8952, 0x2E53, 0x8953, 0x8953, 0x2FC4,
+    0x8954, 0x8954, 0x3B96, 0x8956, 0x8956, 0x15C2, 0x8957, 0x8957, 0x3118,
+    0x8958, 0x8958, 0x311B, 0x8959, 0x8959, 0x311D, 0x895A, 0x895B, 0x3116,
+    0x895C, 0x895C, 0x311A, 0x895D, 0x895D, 0x311C, 0x895E, 0x895E, 0x15C3,
+    0x895F, 0x895F, 0x15C1, 0x8960, 0x8960, 0x15C0, 0x8961, 0x8961, 0x3119,
+    0x8962, 0x8962, 0x3115, 0x8963, 0x8963, 0x3231, 0x8964, 0x8964, 0x1641,
+    0x8965, 0x8965, 0x3B93, 0x8966, 0x8966, 0x3232, 0x8969, 0x8969, 0x330D,
+    0x896A, 0x896A, 0x168C, 0x896B, 0x896B, 0x330F, 0x896C, 0x896C, 0x168D,
+    0x896D, 0x896D, 0x330C, 0x896E, 0x896E, 0x330E, 0x896F, 0x896F, 0x16D6,
+    0x8971, 0x8971, 0x33B2, 0x8972, 0x8972, 0x16D5, 0x8973, 0x8973, 0x343B,
+    0x8974, 0x8974, 0x343A, 0x8976, 0x8976, 0x3439, 0x8977, 0x8977, 0x3DEA,
+    0x8979, 0x897A, 0x34E2, 0x897B, 0x897B, 0x34E5, 0x897C, 0x897C, 0x34E4,
+    0x897E, 0x897E, 0x1819, 0x897F, 0x897F, 0x0413, 0x8980, 0x8980, 0x4708,
+    0x8981, 0x8981, 0x0805, 0x8982, 0x8982, 0x2063, 0x8983, 0x8983, 0x0D55,
+    0x8985, 0x8985, 0x2580, 0x8986, 0x8986, 0x1527, 0x8987, 0x8987, 0x3822,
+    0x8988, 0x8988, 0x311E, 0x8989, 0x8989, 0x3FE9, 0x898A, 0x898A, 0x3823,
+    0x898B, 0x898B, 0x0508, 0x898F, 0x898F, 0x0B9D, 0x8991, 0x8991, 0x4778,
+    0x8993, 0x8993, 0x0B9C, 0x8994, 0x8994, 0x3FE0, 0x8995, 0x8995, 0x22E3,
+    0x8996, 0x8996, 0x0D56, 0x8997, 0x8997, 0x22E5, 0x8998, 0x8998, 0x22E4,
+    0x899B, 0x899B, 0x2581, 0x899C, 0x899C, 0x0F05, 0x899D, 0x899D, 0x27FC,
+    0x899E, 0x899E, 0x27FF, 0x899F, 0x899F, 0x27FE, 0x89A1, 0x89A1, 0x27FD,
+    0x89A2, 0x89A2, 0x2A3C, 0x89A3, 0x89A3, 0x2A3E, 0x89A4, 0x89A4, 0x2A3D,
+    0x89A5, 0x89A5, 0x3D93, 0x89A6, 0x89A6, 0x134C, 0x89A7, 0x89A7, 0x3826,
+    0x89A9, 0x89A9, 0x3825, 0x89AA, 0x89AA, 0x134B, 0x89AC, 0x89AC, 0x1476,
+    0x89AD, 0x89AD, 0x2E56, 0x89AE, 0x89AE, 0x2E58, 0x89AF, 0x89AF, 0x2E57,
+    0x89B2, 0x89B2, 0x1528, 0x89B6, 0x89B6, 0x3120, 0x89B7, 0x89B7, 0x311F,
+    0x89B9, 0x89B9, 0x3233, 0x89BA, 0x89BA, 0x1642, 0x89BC, 0x89BC, 0x3827,
+    0x89BD, 0x89BD, 0x168E, 0x89BE, 0x89BE, 0x33B4, 0x89BF, 0x89BF, 0x33B3,
+    0x89C0, 0x89C0, 0x1748, 0x89C1, 0x89C1, 0x4503, 0x89C6, 0x89C6, 0x4566,
+    0x89D2, 0x89D2, 0x0509, 0x89D3, 0x89D3, 0x1C03, 0x89D4, 0x89D4, 0x0806,
+    0x89D5, 0x89D5, 0x2066, 0x89D6, 0x89D6, 0x2064, 0x89D9, 0x89D9, 0x2065,
+    0x89DA, 0x89DB, 0x22E7, 0x89DC, 0x89DC, 0x2588, 0x89DD, 0x89DD, 0x22E6,
+    0x89DF, 0x89DF, 0x2582, 0x89E0, 0x89E0, 0x2586, 0x89E1, 0x89E1, 0x2585,
+    0x89E2, 0x89E2, 0x2587, 0x89E3, 0x89E3, 0x0F06, 0x89E4, 0x89E4, 0x2584,
+    0x89E5, 0x89E5, 0x2583, 0x89E6, 0x89E6, 0x2589, 0x89E7, 0x89E7, 0x3829,
+    0x89E8, 0x89E8, 0x2802, 0x89E9, 0x89E9, 0x2800, 0x89EB, 0x89EB, 0x2801,
+    0x89EC, 0x89EC, 0x2A41, 0x89ED, 0x89ED, 0x2A3F, 0x89F0, 0x89F0, 0x2A40,
+    0x89F1, 0x89F1, 0x2C84, 0x89F2, 0x89F3, 0x2E59, 0x89F4, 0x89F4, 0x1529,
+    0x89F6, 0x89F6, 0x3121, 0x89F7, 0x89F7, 0x3234, 0x89F8, 0x89F8, 0x1643,
+    0x89FA, 0x89FA, 0x3310, 0x89FB, 0x89FB, 0x33B5, 0x89FC, 0x89FC, 0x16D7,
+    0x89FE, 0x89FE, 0x343C, 0x89FF, 0x89FF, 0x34E6, 0x8A00, 0x8A00, 0x050A,
+    0x8A02, 0x8A03, 0x0808, 0x8A04, 0x8A04, 0x1C04, 0x8A07, 0x8A07, 0x1C05,
+    0x8A08, 0x8A08, 0x0807, 0x8A0A, 0x8A0A, 0x09C3, 0x8A0C, 0x8A0C, 0x09C1,
+    0x8A0E, 0x8A0E, 0x09C0, 0x8A0F, 0x8A0F, 0x09C7, 0x8A10, 0x8A10, 0x09BF,
+    0x8A11, 0x8A11, 0x09C8, 0x8A12, 0x8A12, 0x1E08, 0x8A13, 0x8A13, 0x09C5,
+    0x8A15, 0x8A15, 0x09C2, 0x8A16, 0x8A16, 0x09C6, 0x8A17, 0x8A17, 0x09C4,
+    0x8A18, 0x8A18, 0x09BE, 0x8A1B, 0x8A1B, 0x0BA5, 0x8A1C, 0x8A1C, 0x3BA3,
+    0x8A1D, 0x8A1D, 0x0B9F, 0x8A1E, 0x8A1E, 0x206A, 0x8A1F, 0x8A1F, 0x0BA4,
+    0x8A22, 0x8A22, 0x0BA6, 0x8A23, 0x8A23, 0x0BA0, 0x8A25, 0x8A25, 0x0BA1,
+    0x8A27, 0x8A27, 0x2068, 0x8A29, 0x8A29, 0x43E5, 0x8A2A, 0x8A2A, 0x0B9E,
+    0x8A2B, 0x8A2B, 0x3BD1, 0x8A2C, 0x8A2C, 0x2069, 0x8A2D, 0x8A2D, 0x0BA3,
+    0x8A30, 0x8A30, 0x2067, 0x8A31, 0x8A31, 0x0BA2, 0x8A34, 0x8A34, 0x0D61,
+    0x8A36, 0x8A36, 0x0D63, 0x8A38, 0x8A38, 0x477A, 0x8A39, 0x8A39, 0x22EB,
+    0x8A3A, 0x8A3A, 0x0D62, 0x8A3B, 0x8A3B, 0x0D57, 0x8A3C, 0x8A3C, 0x0D5B,
+    0x8A3D, 0x8A3D, 0x3BA2, 0x8A3E, 0x8A3E, 0x0F19, 0x8A3F, 0x8A3F, 0x258E,
+    0x8A40, 0x8A40, 0x22ED, 0x8A41, 0x8A41, 0x0D5C, 0x8A44, 0x8A45, 0x22F0,
+    0x8A46, 0x8A46, 0x0D60, 0x8A48, 0x8A48, 0x22F3, 0x8A49, 0x8A49, 0x3FF0,
+    0x8A4A, 0x8A4A, 0x22F5, 0x8A4C, 0x8A4C, 0x22F6, 0x8A4D, 0x8A4D, 0x22EA,
+    0x8A4E, 0x8A4E, 0x22E9, 0x8A4F, 0x8A4F, 0x22F7, 0x8A50, 0x8A50, 0x0D5F,
+    0x8A51, 0x8A51, 0x22F4, 0x8A52, 0x8A52, 0x22F2, 0x8A54, 0x8A54, 0x0D5D,
+    0x8A55, 0x8A55, 0x0D59, 0x8A56, 0x8A56, 0x0D64, 0x8A57, 0x8A58, 0x22EE,
+    0x8A59, 0x8A59, 0x22EC, 0x8A5B, 0x8A5B, 0x0D5E, 0x8A5E, 0x8A5E, 0x0D5A,
+    0x8A60, 0x8A60, 0x0D58, 0x8A61, 0x8A61, 0x258D, 0x8A62, 0x8A62, 0x0F14,
+    0x8A63, 0x8A63, 0x0F0F, 0x8A66, 0x8A66, 0x0F0A, 0x8A67, 0x8A67, 0x3F8E,
+    0x8A68, 0x8A68, 0x0F1A, 0x8A69, 0x8A69, 0x0F0B, 0x8A6B, 0x8A6B, 0x0F07,
+    0x8A6C, 0x8A6C, 0x0F16, 0x8A6D, 0x8A6D, 0x0F13, 0x8A6E, 0x8A6E, 0x0F15,
+    0x8A70, 0x8A70, 0x0F0C, 0x8A71, 0x8A71, 0x0F11, 0x8A72, 0x8A73, 0x0F08,
+    0x8A74, 0x8A74, 0x2595, 0x8A75, 0x8A75, 0x2592, 0x8A76, 0x8A76, 0x258A,
+    0x8A77, 0x8A77, 0x258F, 0x8A79, 0x8A79, 0x0F17, 0x8A7A, 0x8A7A, 0x2596,
+    0x8A7B, 0x8A7B, 0x0F18, 0x8A7C, 0x8A7C, 0x0F0E, 0x8A7E, 0x8A7E, 0x3FA5,
+    0x8A7F, 0x8A7F, 0x258C, 0x8A81, 0x8A81, 0x2594, 0x8A82, 0x8A82, 0x2590,
+    0x8A83, 0x8A83, 0x2593, 0x8A84, 0x8A84, 0x2591, 0x8A85, 0x8A85, 0x0F12,
+    0x8A86, 0x8A86, 0x258B, 0x8A87, 0x8A87, 0x0F0D, 0x8A8B, 0x8A8B, 0x2805,
+    0x8A8C, 0x8A8C, 0x10A6, 0x8A8D, 0x8A8D, 0x10A9, 0x8A8F, 0x8A8F, 0x2807,
+    0x8A90, 0x8A90, 0x382F, 0x8A91, 0x8A91, 0x10B1, 0x8A92, 0x8A92, 0x2806,
+    0x8A93, 0x8A93, 0x10AB, 0x8A94, 0x8A94, 0x477B, 0x8A95, 0x8A95, 0x1216,
+    0x8A96, 0x8A96, 0x2808, 0x8A98, 0x8A98, 0x10B0, 0x8A99, 0x8A99, 0x2804,
+    0x8A9A, 0x8A9A, 0x10B2, 0x8A9C, 0x8A9C, 0x382C, 0x8A9E, 0x8A9E, 0x10A7,
+    0x8AA0, 0x8AA0, 0x0F10, 0x8AA1, 0x8AA1, 0x10AA, 0x8AA3, 0x8AA3, 0x10A8,
+    0x8AA4, 0x8AA4, 0x10AC, 0x8AA5, 0x8AA5, 0x10AE, 0x8AA6, 0x8AA6, 0x10A5,
+    0x8AA7, 0x8AA7, 0x10B3, 0x8AA8, 0x8AA8, 0x10AF, 0x8AA9, 0x8AA9, 0x383D,
+    0x8AAA, 0x8AAA, 0x10AD, 0x8AAB, 0x8AAB, 0x2803, 0x8AAF, 0x8AAF, 0x3841,
+    0x8AB0, 0x8AB0, 0x121D, 0x8AB2, 0x8AB2, 0x1219, 0x8AB4, 0x8AB4, 0x477C,
+    0x8AB6, 0x8AB6, 0x1220, 0x8AB8, 0x8AB8, 0x2A44, 0x8AB9, 0x8AB9, 0x1221,
+    0x8ABA, 0x8ABA, 0x2A50, 0x8ABB, 0x8ABB, 0x2A49, 0x8ABC, 0x8ABC, 0x1212,
+    0x8ABD, 0x8ABD, 0x2A51, 0x8ABE, 0x8ABE, 0x2A4B, 0x8ABF, 0x8ABF, 0x121C,
+    0x8AC0, 0x8AC0, 0x2A4C, 0x8AC2, 0x8AC2, 0x121B, 0x8AC3, 0x8AC3, 0x2A4F,
+    0x8AC4, 0x8AC4, 0x1215, 0x8AC5, 0x8AC5, 0x2A4D, 0x8AC6, 0x8AC6, 0x2A43,
+    0x8AC7, 0x8AC7, 0x1214, 0x8AC8, 0x8AC8, 0x2C8F, 0x8AC9, 0x8AC9, 0x121A,
+    0x8ACB, 0x8ACB, 0x1217, 0x8ACD, 0x8ACD, 0x121F, 0x8ACF, 0x8ACF, 0x2A42,
+    0x8AD1, 0x8AD1, 0x2A46, 0x8AD2, 0x8AD2, 0x1213, 0x8AD3, 0x8AD3, 0x2A45,
+    0x8AD4, 0x8AD5, 0x2A47, 0x8AD6, 0x8AD6, 0x121E, 0x8AD7, 0x8AD7, 0x2A4A,
+    0x8AD8, 0x8AD8, 0x2A4E, 0x8AD9, 0x8AD9, 0x2A52, 0x8ADA, 0x8ADA, 0x39C2,
+    0x8ADB, 0x8ADB, 0x1222, 0x8ADC, 0x8ADC, 0x1352, 0x8ADD, 0x8ADD, 0x2C8A,
+    0x8ADE, 0x8ADE, 0x2C90, 0x8ADF, 0x8ADF, 0x2C8D, 0x8AE0, 0x8AE0, 0x2C85,
+    0x8AE1, 0x8AE1, 0x2C91, 0x8AE2, 0x8AE2, 0x2C86, 0x8AE4, 0x8AE4, 0x2C8C,
+    0x8AE6, 0x8AE6, 0x134D, 0x8AE7, 0x8AE7, 0x1353, 0x8AE8, 0x8AE8, 0x2C92,
+    0x8AEA, 0x8AEA, 0x3DD9, 0x8AEB, 0x8AEB, 0x134F, 0x8AED, 0x8AED, 0x1359,
+    0x8AEE, 0x8AEE, 0x1354, 0x8AEF, 0x8AEF, 0x2C94, 0x8AF0, 0x8AF0, 0x2C8E,
+    0x8AF1, 0x8AF1, 0x1350, 0x8AF2, 0x8AF2, 0x2C87, 0x8AF3, 0x8AF3, 0x135A,
+    0x8AF4, 0x8AF5, 0x2C88, 0x8AF6, 0x8AF6, 0x135B, 0x8AF7, 0x8AF7, 0x1358,
+    0x8AF8, 0x8AF8, 0x1218, 0x8AFA, 0x8AFA, 0x134E, 0x8AFB, 0x8AFB, 0x2C95,
+    0x8AFC, 0x8AFC, 0x135C, 0x8AFE, 0x8AFE, 0x1355, 0x8AFF, 0x8AFF, 0x2C93,
+    0x8B00, 0x8B00, 0x1351, 0x8B01, 0x8B02, 0x1356, 0x8B04, 0x8B04, 0x147E,
+    0x8B05, 0x8B05, 0x2E5F, 0x8B06, 0x8B06, 0x2E68, 0x8B07, 0x8B07, 0x2E65,
+    0x8B08, 0x8B08, 0x2E67, 0x8B0A, 0x8B0A, 0x147B, 0x8B0B, 0x8B0B, 0x2E60,
+    0x8B0C, 0x8B0C, 0x3836, 0x8B0D, 0x8B0D, 0x2E66, 0x8B0E, 0x8B0E, 0x1477,
+    0x8B0F, 0x8B0F, 0x2E62, 0x8B10, 0x8B10, 0x147F, 0x8B11, 0x8B11, 0x2E5E,
+    0x8B12, 0x8B12, 0x2E63, 0x8B13, 0x8B13, 0x2E6A, 0x8B14, 0x8B14, 0x2C8B,
+    0x8B15, 0x8B15, 0x2E64, 0x8B16, 0x8B16, 0x2E5D, 0x8B17, 0x8B17, 0x1478,
+    0x8B18, 0x8B18, 0x2E5C, 0x8B19, 0x8B19, 0x1479, 0x8B1A, 0x8B1A, 0x2E6B,
+    0x8B1B, 0x8B1B, 0x147A, 0x8B1C, 0x8B1C, 0x2E69, 0x8B1D, 0x8B1D, 0x147D,
+    0x8B1E, 0x8B1E, 0x2E5B, 0x8B1F, 0x8B1F, 0x3837, 0x8B20, 0x8B20, 0x147C,
+    0x8B22, 0x8B22, 0x2E61, 0x8B23, 0x8B23, 0x2FCE, 0x8B24, 0x8B24, 0x2FDC,
+    0x8B25, 0x8B25, 0x2FD7, 0x8B26, 0x8B26, 0x2FD9, 0x8B27, 0x8B27, 0x2FCD,
+    0x8B28, 0x8B28, 0x152A, 0x8B2A, 0x8B2A, 0x2FCC, 0x8B2B, 0x8B2B, 0x152D,
+    0x8B2C, 0x8B2C, 0x152C, 0x8B2D, 0x8B2D, 0x3F99, 0x8B2E, 0x8B2E, 0x2FDB,
+    0x8B2F, 0x8B2F, 0x2FD3, 0x8B30, 0x8B30, 0x2FD0, 0x8B31, 0x8B31, 0x2FD6,
+    0x8B33, 0x8B33, 0x2FCF, 0x8B35, 0x8B35, 0x2FD1, 0x8B36, 0x8B36, 0x2FDA,
+    0x8B37, 0x8B37, 0x2FD8, 0x8B39, 0x8B39, 0x152B, 0x8B3A, 0x8B3A, 0x2FDF,
+    0x8B3B, 0x8B3B, 0x2FDD, 0x8B3C, 0x8B3C, 0x2FD4, 0x8B3D, 0x8B3D, 0x2FDE,
+    0x8B3E, 0x8B3E, 0x2FD5, 0x8B3F, 0x8B3F, 0x383A, 0x8B40, 0x8B40, 0x3125,
+    0x8B41, 0x8B41, 0x15C4, 0x8B42, 0x8B42, 0x312C, 0x8B43, 0x8B43, 0x3FF2,
+    0x8B45, 0x8B45, 0x3313, 0x8B46, 0x8B46, 0x15CB, 0x8B47, 0x8B47, 0x2FD2,
+    0x8B48, 0x8B48, 0x3123, 0x8B49, 0x8B49, 0x15C7, 0x8B4A, 0x8B4A, 0x3124,
+    0x8B4B, 0x8B4B, 0x3129, 0x8B4C, 0x8B4D, 0x383B, 0x8B4E, 0x8B4F, 0x15C9,
+    0x8B50, 0x8B50, 0x3122, 0x8B51, 0x8B51, 0x312B, 0x8B52, 0x8B52, 0x312D,
+    0x8B53, 0x8B53, 0x3126, 0x8B54, 0x8B54, 0x3128, 0x8B55, 0x8B55, 0x312A,
+    0x8B56, 0x8B56, 0x3127, 0x8B57, 0x8B57, 0x312E, 0x8B58, 0x8B58, 0x15C6,
+    0x8B59, 0x8B59, 0x15CC, 0x8B5A, 0x8B5A, 0x15C8, 0x8B5C, 0x8B5C, 0x15C5,
+    0x8B5D, 0x8B5D, 0x3237, 0x8B5E, 0x8B5E, 0x3DB8, 0x8B5F, 0x8B5F, 0x1648,
+    0x8B60, 0x8B60, 0x3235, 0x8B62, 0x8B62, 0x3DD4, 0x8B63, 0x8B63, 0x3239,
+    0x8B65, 0x8B65, 0x323A, 0x8B66, 0x8B66, 0x1646, 0x8B67, 0x8B67, 0x323B,
+    0x8B68, 0x8B68, 0x3238, 0x8B69, 0x8B69, 0x3BF7, 0x8B6A, 0x8B6A, 0x3236,
+    0x8B6B, 0x8B6B, 0x1649, 0x8B6C, 0x8B6C, 0x1645, 0x8B6D, 0x8B6D, 0x323C,
+    0x8B6F, 0x8B6F, 0x1647, 0x8B70, 0x8B70, 0x1644, 0x8B74, 0x8B74, 0x168F,
+    0x8B77, 0x8B77, 0x1690, 0x8B78, 0x8B78, 0x3312, 0x8B79, 0x8B79, 0x3311,
+    0x8B7A, 0x8B7B, 0x3314, 0x8B7D, 0x8B7D, 0x1691, 0x8B7E, 0x8B7E, 0x33B6,
+    0x8B7F, 0x8B7F, 0x33BB, 0x8B80, 0x8B80, 0x16D8, 0x8B81, 0x8B81, 0x3D8D,
+    0x8B82, 0x8B82, 0x33B8, 0x8B84, 0x8B84, 0x33B7, 0x8B85, 0x8B85, 0x33BA,
+    0x8B86, 0x8B86, 0x33B9, 0x8B88, 0x8B88, 0x3440, 0x8B8A, 0x8B8A, 0x170A,
+    0x8B8B, 0x8B8B, 0x343F, 0x8B8C, 0x8B8C, 0x343D, 0x8B8E, 0x8B8E, 0x343E,
+    0x8B90, 0x8B90, 0x383F, 0x8B92, 0x8B92, 0x172C, 0x8B93, 0x8B93, 0x172B,
+    0x8B94, 0x8B95, 0x349C, 0x8B96, 0x8B96, 0x172D, 0x8B98, 0x8B99, 0x34E7,
+    0x8B9A, 0x8B9A, 0x1754, 0x8B9B, 0x8B9B, 0x3840, 0x8B9C, 0x8B9C, 0x175A,
+    0x8B9E, 0x8B9E, 0x3522, 0x8B9F, 0x8B9F, 0x353F, 0x8BA0, 0x8BA0, 0x4505,
+    0x8BBE, 0x8BBE, 0x4567, 0x8BE2, 0x8BE2, 0x4568, 0x8C37, 0x8C37, 0x050B,
+    0x8C39, 0x8C39, 0x206B, 0x8C3B, 0x8C3B, 0x206C, 0x8C3C, 0x8C3C, 0x2597,
+    0x8C3D, 0x8C3D, 0x2809, 0x8C3E, 0x8C3E, 0x2A53, 0x8C3F, 0x8C3F, 0x1481,
+    0x8C41, 0x8C41, 0x1480, 0x8C42, 0x8C42, 0x2FE0, 0x8C43, 0x8C43, 0x312F,
+    0x8C45, 0x8C45, 0x3441, 0x8C46, 0x8C46, 0x050C, 0x8C47, 0x8C47, 0x1E09,
+    0x8C48, 0x8C48, 0x09C9, 0x8C49, 0x8C49, 0x0BA7, 0x8C4A, 0x8C4A, 0x2599,
+    0x8C4B, 0x8C4B, 0x2598, 0x8C4C, 0x8C4C, 0x1223, 0x8C4D, 0x8C4D, 0x2A54,
+    0x8C4E, 0x8C4E, 0x1224, 0x8C4F, 0x8C4F, 0x2E6C, 0x8C50, 0x8C50, 0x152E,
+    0x8C51, 0x8C51, 0x477D, 0x8C54, 0x8C54, 0x1763, 0x8C55, 0x8C55, 0x050D,
+    0x8C56, 0x8C56, 0x1A48, 0x8C57, 0x8C57, 0x1E0A, 0x8C5A, 0x8C5A, 0x0BA8,
+    0x8C5C, 0x8C5D, 0x206D, 0x8C5F, 0x8C5F, 0x22F8, 0x8C61, 0x8C61, 0x0D65,
+    0x8C62, 0x8C62, 0x0F1B, 0x8C64, 0x8C64, 0x259B, 0x8C65, 0x8C65, 0x259A,
+    0x8C66, 0x8C66, 0x259C, 0x8C68, 0x8C69, 0x280A, 0x8C6A, 0x8C6A, 0x10B4,
+    0x8C6B, 0x8C6B, 0x135D, 0x8C6C, 0x8C6C, 0x1225, 0x8C6D, 0x8C6D, 0x135E,
+    0x8C6F, 0x8C6F, 0x2E70, 0x8C70, 0x8C70, 0x2E6D, 0x8C71, 0x8C71, 0x2E6F,
+    0x8C72, 0x8C72, 0x2E6E, 0x8C73, 0x8C73, 0x1482, 0x8C75, 0x8C75, 0x2FE1,
+    0x8C76, 0x8C76, 0x3131, 0x8C77, 0x8C77, 0x3130, 0x8C78, 0x8C78, 0x18E7,
+    0x8C79, 0x8C79, 0x09CB, 0x8C7A, 0x8C7A, 0x09CA, 0x8C7B, 0x8C7B, 0x1E0B,
+    0x8C7D, 0x8C7D, 0x206F, 0x8C80, 0x8C80, 0x22FA, 0x8C81, 0x8C81, 0x22F9,
+    0x8C82, 0x8C82, 0x0D66, 0x8C84, 0x8C85, 0x259E, 0x8C86, 0x8C86, 0x259D,
+    0x8C89, 0x8C89, 0x0F1D, 0x8C8A, 0x8C8A, 0x0F1C, 0x8C8C, 0x8C8C, 0x10B6,
+    0x8C8D, 0x8C8D, 0x10B5, 0x8C8F, 0x8C8F, 0x2A55, 0x8C90, 0x8C90, 0x2C98,
+    0x8C91, 0x8C92, 0x2C96, 0x8C93, 0x8C93, 0x135F, 0x8C94, 0x8C94, 0x2E72,
+    0x8C95, 0x8C95, 0x2E71, 0x8C97, 0x8C97, 0x2FE4, 0x8C98, 0x8C98, 0x2FE3,
+    0x8C99, 0x8C99, 0x2FE2, 0x8C9A, 0x8C9A, 0x3132, 0x8C9B, 0x8C9B, 0x3845,
+    0x8C9C, 0x8C9C, 0x3523, 0x8C9D, 0x8C9D, 0x050E, 0x8C9E, 0x8C9E, 0x080A,
+    0x8C9F, 0x8C9F, 0x3BAD, 0x8CA0, 0x8CA0, 0x080B, 0x8CA1, 0x8CA2, 0x09CC,
+    0x8CA3, 0x8CA3, 0x1E0D, 0x8CA4, 0x8CA4, 0x1E0C, 0x8CA5, 0x8CA5, 0x2070,
+    0x8CA7, 0x8CA7, 0x0BAE, 0x8CA8, 0x8CA8, 0x0BAC, 0x8CA9, 0x8CA9, 0x0BA9,
+    0x8CAA, 0x8CAA, 0x0BAD, 0x8CAB, 0x8CAB, 0x0BAB, 0x8CAC, 0x8CAC, 0x0BAA,
+    0x8CAD, 0x8CAD, 0x3FF1, 0x8CAF, 0x8CAF, 0x0D67, 0x8CB0, 0x8CB0, 0x22FD,
+    0x8CB2, 0x8CB2, 0x0F22, 0x8CB3, 0x8CB3, 0x0D69, 0x8CB4, 0x8CB4, 0x0D6E,
+    0x8CB5, 0x8CB5, 0x22FF, 0x8CB6, 0x8CB6, 0x0D70, 0x8CB7, 0x8CB7, 0x0D6F,
+    0x8CB8, 0x8CB8, 0x0D72, 0x8CB9, 0x8CB9, 0x22FE, 0x8CBA, 0x8CBA, 0x22FB,
+    0x8CBB, 0x8CBB, 0x0D6C, 0x8CBC, 0x8CBC, 0x0D68, 0x8CBD, 0x8CBD, 0x0D6A,
+    0x8CBE, 0x8CBE, 0x22FC, 0x8CBF, 0x8CBF, 0x0D71, 0x8CC0, 0x8CC0, 0x0D6D,
+    0x8CC1, 0x8CC1, 0x0D6B, 0x8CC2, 0x8CC2, 0x0F24, 0x8CC3, 0x8CC3, 0x0F23,
+    0x8CC4, 0x8CC4, 0x0F21, 0x8CC5, 0x8CC5, 0x0F25, 0x8CC7, 0x8CC8, 0x0F1F,
+    0x8CCA, 0x8CCA, 0x0F1E, 0x8CCC, 0x8CCC, 0x25A0, 0x8CCD, 0x8CCD, 0x3E99,
+    0x8CCF, 0x8CCF, 0x280D, 0x8CD1, 0x8CD2, 0x10B8, 0x8CD3, 0x8CD3, 0x10B7,
+    0x8CD4, 0x8CD4, 0x477E, 0x8CD5, 0x8CD5, 0x280C, 0x8CD6, 0x8CD6, 0x384B,
+    0x8CD7, 0x8CD7, 0x280E, 0x8CD9, 0x8CD9, 0x2A58, 0x8CDA, 0x8CDA, 0x2A5A,
+    0x8CDB, 0x8CDB, 0x3851, 0x8CDC, 0x8CDC, 0x122E, 0x8CDD, 0x8CDD, 0x2A5B,
+    0x8CDE, 0x8CDE, 0x1227, 0x8CDF, 0x8CDF, 0x2A57, 0x8CE0, 0x8CE0, 0x1226,
+    0x8CE1, 0x8CE1, 0x1230, 0x8CE2, 0x8CE3, 0x122C, 0x8CE4, 0x8CE4, 0x1229,
+    0x8CE5, 0x8CE5, 0x2A56, 0x8CE6, 0x8CE6, 0x1228, 0x8CE7, 0x8CE7, 0x2A5C,
+    0x8CE8, 0x8CE8, 0x2A59, 0x8CE9, 0x8CE9, 0x3BAE, 0x8CEA, 0x8CEA, 0x122F,
+    0x8CEB, 0x8CEB, 0x3F9C, 0x8CEC, 0x8CED, 0x122A, 0x8CEE, 0x8CEE, 0x2C9A,
+    0x8CF0, 0x8CF0, 0x2C9C, 0x8CF1, 0x8CF1, 0x2C9B, 0x8CF2, 0x8CF2, 0x477F,
+    0x8CF3, 0x8CF3, 0x2C9D, 0x8CF4, 0x8CF4, 0x1360, 0x8CF5, 0x8CF5, 0x2C99,
+    0x8CF7, 0x8CF7, 0x3FB1, 0x8CF8, 0x8CF8, 0x1486, 0x8CF9, 0x8CF9, 0x2E73,
+    0x8CFA, 0x8CFA, 0x1483, 0x8CFB, 0x8CFB, 0x1487, 0x8CFC, 0x8CFC, 0x1485,
+    0x8CFD, 0x8CFD, 0x1484, 0x8CFE, 0x8CFE, 0x2FE5, 0x8D00, 0x8D00, 0x2FE8,
+    0x8D02, 0x8D02, 0x2FE7, 0x8D03, 0x8D03, 0x384F, 0x8D04, 0x8D04, 0x2FE6,
+    0x8D05, 0x8D05, 0x152F, 0x8D06, 0x8D07, 0x3133, 0x8D08, 0x8D08, 0x15CD,
+    0x8D09, 0x8D09, 0x3135, 0x8D0A, 0x8D0A, 0x15CE, 0x8D0B, 0x8D0B, 0x4573,
+    0x8D0C, 0x8D0C, 0x3F96, 0x8D0D, 0x8D0D, 0x164B, 0x8D0F, 0x8D0F, 0x164A,
+    0x8D10, 0x8D10, 0x3316, 0x8D11, 0x8D11, 0x3853, 0x8D12, 0x8D12, 0x384E,
+    0x8D13, 0x8D13, 0x1692, 0x8D14, 0x8D14, 0x3317, 0x8D15, 0x8D15, 0x33BC,
+    0x8D16, 0x8D17, 0x16D9, 0x8D18, 0x8D18, 0x3E6F, 0x8D19, 0x8D19, 0x3442,
+    0x8D1B, 0x8D1B, 0x172F, 0x8D1C, 0x8D1C, 0x4780, 0x8D1D, 0x8D1D, 0x4506,
+    0x8D64, 0x8D64, 0x050F, 0x8D66, 0x8D66, 0x0BB0, 0x8D67, 0x8D67, 0x0BAF,
+    0x8D68, 0x8D69, 0x25A1, 0x8D6B, 0x8D6B, 0x10BA, 0x8D6C, 0x8D6C, 0x2C9E,
+    0x8D6D, 0x8D6D, 0x1231, 0x8D6E, 0x8D6E, 0x2C9F, 0x8D6F, 0x8D6F, 0x2E74,
+    0x8D70, 0x8D70, 0x0510, 0x8D72, 0x8D72, 0x1C06, 0x8D73, 0x8D73, 0x080D,
+    0x8D74, 0x8D74, 0x080C, 0x8D76, 0x8D76, 0x1E0E, 0x8D77, 0x8D77, 0x09CE,
+    0x8D78, 0x8D78, 0x1E0F, 0x8D79, 0x8D79, 0x2073, 0x8D7A, 0x8D7A, 0x39E1,
+    0x8D7B, 0x8D7B, 0x2072, 0x8D7D, 0x8D7D, 0x2071, 0x8D80, 0x8D80, 0x2301,
+    0x8D81, 0x8D81, 0x0D75, 0x8D82, 0x8D82, 0x3F69, 0x8D84, 0x8D84, 0x2300,
+    0x8D85, 0x8D85, 0x0D74, 0x8D89, 0x8D89, 0x2302, 0x8D8A, 0x8D8A, 0x0D73,
+    0x8D8C, 0x8D8C, 0x25A4, 0x8D8D, 0x8D8D, 0x25A7, 0x8D8E, 0x8D8F, 0x25A5,
+    0x8D90, 0x8D90, 0x25AA, 0x8D91, 0x8D91, 0x25A3, 0x8D92, 0x8D92, 0x25AB,
+    0x8D93, 0x8D94, 0x25A8, 0x8D95, 0x8D95, 0x10BC, 0x8D96, 0x8D96, 0x280F,
+    0x8D99, 0x8D99, 0x10BB, 0x8D9B, 0x8D9B, 0x2A60, 0x8D9C, 0x8D9C, 0x2A5E,
+    0x8D9F, 0x8D9F, 0x1232, 0x8DA0, 0x8DA0, 0x2A5D, 0x8DA1, 0x8DA1, 0x2A5F,
+    0x8DA3, 0x8DA3, 0x1233, 0x8DA5, 0x8DA5, 0x2CA0, 0x8DA6, 0x8DA6, 0x3FF7,
+    0x8DA7, 0x8DA7, 0x2CA1, 0x8DA8, 0x8DA8, 0x1488, 0x8DA9, 0x8DA9, 0x3856,
+    0x8DAA, 0x8DAA, 0x3137, 0x8DAB, 0x8DAB, 0x3139, 0x8DAC, 0x8DAC, 0x3136,
+    0x8DAD, 0x8DAD, 0x3138, 0x8DAE, 0x8DAE, 0x323D, 0x8DAF, 0x8DAF, 0x3318,
+    0x8DB2, 0x8DB2, 0x3509, 0x8DB3, 0x8DB3, 0x0511, 0x8DB4, 0x8DB4, 0x080E,
+    0x8DB5, 0x8DB5, 0x1E10, 0x8DB6, 0x8DB6, 0x1E12, 0x8DB7, 0x8DB7, 0x1E11,
+    0x8DB9, 0x8DB9, 0x2076, 0x8DBA, 0x8DBA, 0x0BB2, 0x8DBC, 0x8DBC, 0x2074,
+    0x8DBE, 0x8DBE, 0x0BB1, 0x8DBF, 0x8DBF, 0x2077, 0x8DC0, 0x8DC0, 0x436A,
+    0x8DC1, 0x8DC1, 0x2078, 0x8DC2, 0x8DC2, 0x2075, 0x8DC3, 0x8DC3, 0x4782,
+    0x8DC5, 0x8DC5, 0x230E, 0x8DC6, 0x8DC6, 0x0D7D, 0x8DC7, 0x8DC7, 0x2306,
+    0x8DC8, 0x8DC8, 0x230C, 0x8DCB, 0x8DCB, 0x0D78, 0x8DCC, 0x8DCC, 0x0D7B,
+    0x8DCD, 0x8DCD, 0x2305, 0x8DCE, 0x8DCE, 0x0D76, 0x8DCF, 0x8DCF, 0x2309,
+    0x8DD0, 0x8DD0, 0x25B1, 0x8DD1, 0x8DD1, 0x0D7A, 0x8DD3, 0x8DD3, 0x2304,
+    0x8DD4, 0x8DD4, 0x3F82, 0x8DD5, 0x8DD5, 0x230A, 0x8DD6, 0x8DD6, 0x2307,
+    0x8DD7, 0x8DD7, 0x230D, 0x8DD8, 0x8DD8, 0x2303, 0x8DD9, 0x8DD9, 0x230B,
+    0x8DDA, 0x8DDA, 0x0D79, 0x8DDB, 0x8DDB, 0x0D7C, 0x8DDC, 0x8DDC, 0x2308,
+    0x8DDD, 0x8DDD, 0x0D77, 0x8DDF, 0x8DDF, 0x0F27, 0x8DE0, 0x8DE0, 0x25AD,
+    0x8DE1, 0x8DE1, 0x0F26, 0x8DE2, 0x8DE2, 0x25B4, 0x8DE3, 0x8DE3, 0x25B3,
+    0x8DE4, 0x8DE4, 0x0F2D, 0x8DE6, 0x8DE6, 0x0F2E, 0x8DE7, 0x8DE7, 0x25B5,
+    0x8DE8, 0x8DE8, 0x0F28, 0x8DE9, 0x8DE9, 0x25B2, 0x8DEA, 0x8DEA, 0x0F2C,
+    0x8DEB, 0x8DEB, 0x25B7, 0x8DEC, 0x8DEC, 0x25AE, 0x8DEE, 0x8DEE, 0x25B0,
+    0x8DEF, 0x8DEF, 0x0F29, 0x8DF0, 0x8DF0, 0x25AC, 0x8DF1, 0x8DF1, 0x25AF,
+    0x8DF2, 0x8DF2, 0x25B6, 0x8DF3, 0x8DF3, 0x0F2A, 0x8DF4, 0x8DF4, 0x25B8,
+    0x8DFA, 0x8DFA, 0x0F2B, 0x8DFC, 0x8DFC, 0x10BD, 0x8DFD, 0x8DFD, 0x2814,
+    0x8DFE, 0x8DFE, 0x281A, 0x8DFF, 0x8DFF, 0x2812, 0x8E00, 0x8E00, 0x281B,
+    0x8E01, 0x8E01, 0x3F85, 0x8E02, 0x8E02, 0x2811, 0x8E03, 0x8E03, 0x2816,
+    0x8E04, 0x8E04, 0x281C, 0x8E05, 0x8E05, 0x2819, 0x8E06, 0x8E06, 0x2818,
+    0x8E07, 0x8E07, 0x2817, 0x8E09, 0x8E09, 0x2810, 0x8E0A, 0x8E0A, 0x2815,
+    0x8E0D, 0x8E0D, 0x2813, 0x8E0E, 0x8E0E, 0x3E5E, 0x8E0F, 0x8E0F, 0x1238,
+    0x8E10, 0x8E10, 0x1235, 0x8E11, 0x8E11, 0x2A69, 0x8E12, 0x8E12, 0x2A6E,
+    0x8E13, 0x8E13, 0x2A70, 0x8E14, 0x8E14, 0x2A6D, 0x8E15, 0x8E15, 0x2A66,
+    0x8E16, 0x8E16, 0x2A68, 0x8E17, 0x8E17, 0x2A72, 0x8E18, 0x8E18, 0x2A6F,
+    0x8E19, 0x8E19, 0x2A6A, 0x8E1A, 0x8E1A, 0x2A73, 0x8E1B, 0x8E1B, 0x2A67,
+    0x8E1C, 0x8E1C, 0x2A71, 0x8E1D, 0x8E1D, 0x1236, 0x8E1E, 0x8E1E, 0x123C,
+    0x8E1F, 0x8E1F, 0x123A, 0x8E20, 0x8E20, 0x2A61, 0x8E21, 0x8E21, 0x123B,
+    0x8E22, 0x8E22, 0x1237, 0x8E23, 0x8E23, 0x2A62, 0x8E24, 0x8E24, 0x2A64,
+    0x8E25, 0x8E25, 0x2A63, 0x8E26, 0x8E27, 0x2A6B, 0x8E28, 0x8E28, 0x3F88,
+    0x8E29, 0x8E29, 0x1239, 0x8E2A, 0x8E2A, 0x3BB4, 0x8E2B, 0x8E2B, 0x1234,
+    0x8E2D, 0x8E2D, 0x3EAB, 0x8E2E, 0x8E2E, 0x2A65, 0x8E30, 0x8E30, 0x2CAB,
+    0x8E31, 0x8E31, 0x1362, 0x8E33, 0x8E33, 0x2CA2, 0x8E34, 0x8E34, 0x1363,
+    0x8E35, 0x8E35, 0x1366, 0x8E36, 0x8E36, 0x2CA7, 0x8E38, 0x8E38, 0x2CA4,
+    0x8E39, 0x8E39, 0x1365, 0x8E3A, 0x8E3A, 0x4784, 0x8E3C, 0x8E3D, 0x2CA8,
+    0x8E3E, 0x8E3E, 0x2CA3, 0x8E3F, 0x8E3F, 0x2CAC, 0x8E40, 0x8E40, 0x2CA5,
+    0x8E41, 0x8E41, 0x2CAA, 0x8E42, 0x8E42, 0x1364, 0x8E44, 0x8E44, 0x1361,
+    0x8E45, 0x8E45, 0x2CA6, 0x8E46, 0x8E46, 0x4312, 0x8E47, 0x8E47, 0x2E7A,
+    0x8E48, 0x8E48, 0x148B, 0x8E49, 0x8E49, 0x1489, 0x8E4A, 0x8E4A, 0x148C,
+    0x8E4B, 0x8E4B, 0x148A, 0x8E4C, 0x8E4C, 0x2E79, 0x8E4D, 0x8E4D, 0x2E76,
+    0x8E4E, 0x8E4E, 0x2E75, 0x8E4F, 0x8E4F, 0x3F83, 0x8E50, 0x8E50, 0x2E78,
+    0x8E53, 0x8E53, 0x2E77, 0x8E54, 0x8E54, 0x2FF6, 0x8E55, 0x8E55, 0x1535,
+    0x8E56, 0x8E56, 0x2FED, 0x8E57, 0x8E57, 0x2FEC, 0x8E59, 0x8E59, 0x1530,
+    0x8E5A, 0x8E5A, 0x2FF2, 0x8E5B, 0x8E5B, 0x2FF1, 0x8E5C, 0x8E5C, 0x2FE9,
+    0x8E5D, 0x8E5D, 0x2FF4, 0x8E5E, 0x8E5E, 0x2FEE, 0x8E5F, 0x8E5F, 0x1534,
+    0x8E60, 0x8E60, 0x2FEB, 0x8E61, 0x8E61, 0x2FF3, 0x8E62, 0x8E62, 0x2FEA,
+    0x8E63, 0x8E63, 0x1531, 0x8E64, 0x8E64, 0x1533, 0x8E65, 0x8E65, 0x2FEF,
+    0x8E66, 0x8E66, 0x1532, 0x8E67, 0x8E67, 0x2FF0, 0x8E68, 0x8E68, 0x434D,
+    0x8E69, 0x8E69, 0x2FF5, 0x8E6A, 0x8E6A, 0x313D, 0x8E6C, 0x8E6C, 0x15D3,
+    0x8E6D, 0x8E6D, 0x313A, 0x8E6F, 0x8E6F, 0x313E, 0x8E71, 0x8E71, 0x43E7,
+    0x8E72, 0x8E72, 0x15D0, 0x8E73, 0x8E73, 0x313C, 0x8E74, 0x8E74, 0x15D5,
+    0x8E75, 0x8E75, 0x3F89, 0x8E76, 0x8E76, 0x15D2, 0x8E77, 0x8E77, 0x3F7F,
+    0x8E78, 0x8E78, 0x313B, 0x8E7A, 0x8E7A, 0x15D4, 0x8E7B, 0x8E7B, 0x313F,
+    0x8E7C, 0x8E7C, 0x15CF, 0x8E7E, 0x8E7E, 0x4324, 0x8E80, 0x8E80, 0x3E57,
+    0x8E81, 0x8E81, 0x164D, 0x8E82, 0x8E82, 0x164F, 0x8E84, 0x8E84, 0x3240,
+    0x8E85, 0x8E85, 0x164E, 0x8E86, 0x8E86, 0x323E, 0x8E87, 0x8E87, 0x15D1,
+    0x8E88, 0x8E88, 0x323F, 0x8E89, 0x8E89, 0x164C, 0x8E8A, 0x8E8A, 0x1693,
+    0x8E8B, 0x8E8B, 0x1695, 0x8E8C, 0x8E8C, 0x331A, 0x8E8D, 0x8E8D, 0x1694,
+    0x8E8E, 0x8E8E, 0x3319, 0x8E90, 0x8E90, 0x33C1, 0x8E91, 0x8E91, 0x16DB,
+    0x8E92, 0x8E92, 0x33C0, 0x8E93, 0x8E93, 0x16DC, 0x8E94, 0x8E94, 0x33BE,
+    0x8E95, 0x8E95, 0x33BD, 0x8E96, 0x8E97, 0x33C2, 0x8E98, 0x8E98, 0x3443,
+    0x8E9A, 0x8E9A, 0x33BF, 0x8E9D, 0x8E9D, 0x34A1, 0x8E9E, 0x8EA0, 0x349E,
+    0x8EA1, 0x8EA1, 0x1749, 0x8EA3, 0x8EA3, 0x34EB, 0x8EA4, 0x8EA4, 0x34EA,
+    0x8EA5, 0x8EA5, 0x34E9, 0x8EA6, 0x8EA6, 0x350A, 0x8EA7, 0x8EA7, 0x3BB5,
+    0x8EA8, 0x8EA8, 0x3537, 0x8EA9, 0x8EA9, 0x3524, 0x8EAA, 0x8EAA, 0x175B,
+    0x8EAB, 0x8EAB, 0x0512, 0x8EAC, 0x8EAC, 0x09CF, 0x8EAD, 0x8EAD, 0x385E,
+    0x8EB0, 0x8EB0, 0x43E9, 0x8EB2, 0x8EB2, 0x0F2F, 0x8EB6, 0x8EB6, 0x385F,
+    0x8EBA, 0x8EBA, 0x123D, 0x8EBC, 0x8EBC, 0x38A0, 0x8EBD, 0x8EBD, 0x2CAD,
+    0x8EC0, 0x8EC0, 0x1536, 0x8EC2, 0x8EC2, 0x3140, 0x8EC3, 0x8EC3, 0x3860,
+    0x8EC9, 0x8EC9, 0x3525, 0x8ECA, 0x8ECA, 0x0513, 0x8ECB, 0x8ECB, 0x068D,
+    0x8ECC, 0x8ECC, 0x0810, 0x8ECD, 0x8ECD, 0x080F, 0x8ECE, 0x8ECE, 0x4788,
+    0x8ECF, 0x8ECF, 0x09D2, 0x8ED1, 0x8ED1, 0x1E13, 0x8ED2, 0x8ED2, 0x09D0,
+    0x8ED3, 0x8ED3, 0x1E14, 0x8ED4, 0x8ED4, 0x09D1, 0x8ED7, 0x8ED7, 0x207D,
+    0x8ED8, 0x8ED8, 0x2079, 0x8EDA, 0x8EDA, 0x3DBE, 0x8EDB, 0x8EDB, 0x0BB3,
+    0x8EDC, 0x8EDC, 0x207C, 0x8EDD, 0x8EDD, 0x207B, 0x8EDE, 0x8EDE, 0x207A,
+    0x8EDF, 0x8EDF, 0x0BB4, 0x8EE0, 0x8EE1, 0x207E, 0x8EE2, 0x8EE2, 0x4789,
+    0x8EE4, 0x8EE4, 0x478A, 0x8EE5, 0x8EE5, 0x2315, 0x8EE6, 0x8EE6, 0x2313,
+    0x8EE7, 0x8EE8, 0x2317, 0x8EE9, 0x8EE9, 0x231E, 0x8EEB, 0x8EEB, 0x231A,
+    0x8EEC, 0x8EEC, 0x231C, 0x8EED, 0x8EED, 0x478B, 0x8EEE, 0x8EEE, 0x2314,
+    0x8EEF, 0x8EEF, 0x230F, 0x8EF1, 0x8EF1, 0x231B, 0x8EF2, 0x8EF2, 0x478C,
+    0x8EF4, 0x8EF4, 0x231D, 0x8EF5, 0x8EF5, 0x2316, 0x8EF6, 0x8EF6, 0x2319,
+    0x8EF7, 0x8EF7, 0x2310, 0x8EF8, 0x8EF8, 0x0D7F, 0x8EF9, 0x8EF9, 0x2312,
+    0x8EFA, 0x8EFA, 0x2311, 0x8EFB, 0x8EFB, 0x0D7E, 0x8EFC, 0x8EFC, 0x0D80,
+    0x8EFE, 0x8EFE, 0x0F32, 0x8EFF, 0x8EFF, 0x25BA, 0x8F00, 0x8F00, 0x25BC,
+    0x8F01, 0x8F01, 0x25BB, 0x8F02, 0x8F02, 0x25C0, 0x8F03, 0x8F03, 0x0F30,
+    0x8F05, 0x8F05, 0x25BD, 0x8F06, 0x8F06, 0x25B9, 0x8F07, 0x8F08, 0x25BE,
+    0x8F09, 0x8F09, 0x0F31, 0x8F0A, 0x8F0A, 0x0F33, 0x8F0B, 0x8F0B, 0x25C1,
+    0x8F0D, 0x8F0D, 0x2820, 0x8F0E, 0x8F0E, 0x281F, 0x8F10, 0x8F11, 0x281D,
+    0x8F12, 0x8F12, 0x10BF, 0x8F13, 0x8F13, 0x10C1, 0x8F14, 0x8F14, 0x10BE,
+    0x8F15, 0x8F15, 0x10C0, 0x8F16, 0x8F17, 0x2A7A, 0x8F18, 0x8F18, 0x2A76,
+    0x8F19, 0x8F19, 0x3862, 0x8F1A, 0x8F1A, 0x2A77, 0x8F1B, 0x8F1B, 0x123F,
+    0x8F1C, 0x8F1C, 0x1244, 0x8F1D, 0x8F1D, 0x123E, 0x8F1E, 0x8F1E, 0x1245,
+    0x8F1F, 0x8F1F, 0x1240, 0x8F20, 0x8F20, 0x2A78, 0x8F23, 0x8F23, 0x2A79,
+    0x8F24, 0x8F24, 0x2A75, 0x8F25, 0x8F25, 0x1246, 0x8F26, 0x8F26, 0x1242,
+    0x8F29, 0x8F29, 0x1241, 0x8F2A, 0x8F2A, 0x1243, 0x8F2C, 0x8F2C, 0x2A74,
+    0x8F2D, 0x8F2D, 0x3863, 0x8F2E, 0x8F2E, 0x2CAF, 0x8F2F, 0x8F2F, 0x1368,
+    0x8F30, 0x8F30, 0x3BB7, 0x8F32, 0x8F32, 0x2CB1, 0x8F33, 0x8F33, 0x136A,
+    0x8F34, 0x8F34, 0x2CB4, 0x8F35, 0x8F35, 0x2CB0, 0x8F36, 0x8F36, 0x2CAE,
+    0x8F37, 0x8F37, 0x2CB3, 0x8F38, 0x8F38, 0x1369, 0x8F39, 0x8F39, 0x2CB2,
+    0x8F3B, 0x8F3B, 0x1367, 0x8F3E, 0x8F3E, 0x148E, 0x8F3F, 0x8F3F, 0x1491,
+    0x8F40, 0x8F40, 0x2E7C, 0x8F41, 0x8F41, 0x3D07, 0x8F42, 0x8F42, 0x148F,
+    0x8F43, 0x8F43, 0x2E7B, 0x8F44, 0x8F44, 0x148D, 0x8F45, 0x8F45, 0x1490,
+    0x8F46, 0x8F48, 0x2FF7, 0x8F49, 0x8F49, 0x1537, 0x8F4A, 0x8F4A, 0x3BB8,
+    0x8F4B, 0x8F4B, 0x2FFA, 0x8F4D, 0x8F4D, 0x1538, 0x8F4E, 0x8F4E, 0x15D7,
+    0x8F4F, 0x8F50, 0x3143, 0x8F51, 0x8F51, 0x3142, 0x8F52, 0x8F52, 0x3141,
+    0x8F53, 0x8F53, 0x3145, 0x8F54, 0x8F54, 0x15D6, 0x8F55, 0x8F55, 0x3244,
+    0x8F56, 0x8F57, 0x3242, 0x8F58, 0x8F58, 0x3245, 0x8F59, 0x8F59, 0x3241,
+    0x8F5A, 0x8F5A, 0x3246, 0x8F5B, 0x8F5B, 0x331C, 0x8F5C, 0x8F5C, 0x3F31,
+    0x8F5D, 0x8F5D, 0x331D, 0x8F5E, 0x8F5E, 0x331B, 0x8F5F, 0x8F5F, 0x1696,
+    0x8F60, 0x8F60, 0x33C4, 0x8F61, 0x8F61, 0x16DD, 0x8F62, 0x8F62, 0x33C5,
+    0x8F63, 0x8F63, 0x3445, 0x8F64, 0x8F64, 0x3444, 0x8F66, 0x8F67, 0x4569,
+    0x8F6E, 0x8F6E, 0x456B, 0x8F93, 0x8F93, 0x4732, 0x8F9B, 0x8F9B, 0x0514,
+    0x8F9C, 0x8F9C, 0x0D81, 0x8F9F, 0x8F9F, 0x0F34, 0x8FA0, 0x8FA0, 0x3D94,
+    0x8FA3, 0x8FA3, 0x10C2, 0x8FA5, 0x8FA5, 0x3866, 0x8FA6, 0x8FA6, 0x136C,
+    0x8FA8, 0x8FA8, 0x136B, 0x8FAD, 0x8FAD, 0x15D8, 0x8FAE, 0x8FAE, 0x162F,
+    0x8FAF, 0x8FAF, 0x1697, 0x8FB0, 0x8FB0, 0x0515, 0x8FB1, 0x8FB1, 0x09D3,
+    0x8FB2, 0x8FB2, 0x0F35, 0x8FB3, 0x8FB3, 0x386A, 0x8FB4, 0x8FB4, 0x3146,
+    0x8FB5, 0x8FB5, 0x0230, 0x8FB6, 0x8FB6, 0x47D3, 0x8FB7, 0x8FB7, 0x43FD,
+    0x8FB8, 0x8FB8, 0x42F6, 0x8FB9, 0x8FB9, 0x48C9, 0x8FBA, 0x8FBA, 0x48C7,
+    0x8FBB, 0x8FBC, 0x3D6B, 0x8FBE, 0x8FBE, 0x48C6, 0x8FBF, 0x8FBF, 0x18E9,
+    0x8FC1, 0x8FC1, 0x478D, 0x8FC2, 0x8FC2, 0x0516, 0x8FC4, 0x8FC4, 0x0519,
+    0x8FC5, 0x8FC5, 0x0518, 0x8FC6, 0x8FC6, 0x0517, 0x8FC9, 0x8FC9, 0x18E8,
+    0x8FCA, 0x8FCA, 0x478E, 0x8FCB, 0x8FCB, 0x1A4A, 0x8FCC, 0x8FCC, 0x478F,
+    0x8FCD, 0x8FCD, 0x1A4C, 0x8FCE, 0x8FCE, 0x068E, 0x8FD0, 0x8FD0, 0x48AE,
+    0x8FD1, 0x8FD1, 0x0690, 0x8FD2, 0x8FD2, 0x1A49, 0x8FD3, 0x8FD3, 0x1A4B,
+    0x8FD4, 0x8FD4, 0x068F, 0x8FD5, 0x8FD5, 0x1A4E, 0x8FD6, 0x8FD6, 0x1A4D,
+    0x8FD7, 0x8FD7, 0x1A4F, 0x8FDA, 0x8FDA, 0x3FCB, 0x8FE0, 0x8FE0, 0x1C0A,
+    0x8FE1, 0x8FE1, 0x1C08, 0x8FE2, 0x8FE2, 0x0813, 0x8FE3, 0x8FE3, 0x1C07,
+    0x8FE4, 0x8FE4, 0x0818, 0x8FE5, 0x8FE5, 0x0815, 0x8FE6, 0x8FE6, 0x0812,
+    0x8FE8, 0x8FE8, 0x0819, 0x8FEA, 0x8FEA, 0x0814, 0x8FEB, 0x8FEB, 0x0817,
+    0x8FED, 0x8FED, 0x0816, 0x8FEE, 0x8FEE, 0x1C09, 0x8FF0, 0x8FF0, 0x0811,
+    0x8FF4, 0x8FF4, 0x09D9, 0x8FF5, 0x8FF5, 0x1E16, 0x8FF6, 0x8FF6, 0x1E1C,
+    0x8FF7, 0x8FF7, 0x09D6, 0x8FF8, 0x8FF8, 0x09DD, 0x8FF9, 0x8FF9, 0x3871,
+    0x8FFA, 0x8FFA, 0x09D8, 0x8FFB, 0x8FFB, 0x1E19, 0x8FFC, 0x8FFC, 0x1E1B,
+    0x8FFD, 0x8FFD, 0x09DB, 0x8FFE, 0x8FFE, 0x1E15, 0x8FFF, 0x8FFF, 0x1E18,
+    0x9000, 0x9000, 0x09D7, 0x9001, 0x9001, 0x09D4, 0x9002, 0x9002, 0x1E17,
+    0x9003, 0x9003, 0x09DA, 0x9004, 0x9004, 0x1E1A, 0x9005, 0x9005, 0x09DC,
+    0x9006, 0x9006, 0x09D5, 0x9008, 0x9008, 0x3EE0, 0x900B, 0x900B, 0x2081,
+    0x900C, 0x900C, 0x2084, 0x900D, 0x900D, 0x0BB6, 0x900F, 0x900F, 0x0BC0,
+    0x9010, 0x9010, 0x0BBC, 0x9011, 0x9011, 0x2082, 0x9012, 0x9012, 0x3E4E,
+    0x9014, 0x9014, 0x0BC4, 0x9015, 0x9015, 0x0BBD, 0x9016, 0x9016, 0x0BC2,
+    0x9017, 0x9017, 0x0BB8, 0x9019, 0x9019, 0x0BB5, 0x901A, 0x901A, 0x0BB7,
+    0x901B, 0x901B, 0x0BC3, 0x901C, 0x901C, 0x2083, 0x901D, 0x901D, 0x0BBB,
+    0x901E, 0x901E, 0x0BBE, 0x901F, 0x901F, 0x0BBA, 0x9020, 0x9020, 0x0BBF,
+    0x9021, 0x9021, 0x2085, 0x9022, 0x9022, 0x0BC1, 0x9023, 0x9023, 0x0BB9,
+    0x9024, 0x9024, 0x2080, 0x902D, 0x902D, 0x231F, 0x902E, 0x902E, 0x0D82,
+    0x902F, 0x902F, 0x2321, 0x9031, 0x9031, 0x0D84, 0x9032, 0x9032, 0x0D86,
+    0x9033, 0x9033, 0x4790, 0x9034, 0x9034, 0x2320, 0x9035, 0x9035, 0x0D83,
+    0x9036, 0x9036, 0x0D87, 0x9037, 0x9037, 0x3876, 0x9038, 0x9038, 0x0D85,
+    0x903C, 0x903C, 0x0F3B, 0x903D, 0x903D, 0x25C6, 0x903E, 0x903E, 0x0F43,
+    0x903F, 0x903F, 0x25C3, 0x9041, 0x9041, 0x0F44, 0x9042, 0x9042, 0x0F39,
+    0x9044, 0x9044, 0x25C4, 0x9047, 0x9047, 0x0F3E, 0x9049, 0x9049, 0x25C5,
+    0x904A, 0x904A, 0x0F37, 0x904B, 0x904B, 0x0F36, 0x904C, 0x904C, 0x3F10,
+    0x904D, 0x904D, 0x0F41, 0x904E, 0x904E, 0x0F40, 0x904F, 0x904F, 0x0F3F,
+    0x9050, 0x9050, 0x0F3D, 0x9051, 0x9051, 0x0F42, 0x9052, 0x9052, 0x25C2,
+    0x9053, 0x9053, 0x0F38, 0x9054, 0x9054, 0x0F3A, 0x9055, 0x9055, 0x0F3C,
+    0x9056, 0x9056, 0x3DD2, 0x9058, 0x9058, 0x10C4, 0x9059, 0x9059, 0x10C7,
+    0x905B, 0x905B, 0x10CB, 0x905C, 0x905C, 0x10C5, 0x905D, 0x905D, 0x10CA,
+    0x905E, 0x905E, 0x10C8, 0x9060, 0x9060, 0x10C3, 0x9061, 0x9061, 0x3879,
+    0x9062, 0x9062, 0x10C9, 0x9063, 0x9063, 0x10C6, 0x9064, 0x9064, 0x3C68,
+    0x9067, 0x9067, 0x2A7F, 0x9068, 0x9068, 0x1249, 0x9069, 0x9069, 0x1247,
+    0x906B, 0x906B, 0x2A80, 0x906C, 0x906C, 0x3D60, 0x906D, 0x906D, 0x124A,
+    0x906E, 0x906E, 0x1248, 0x906F, 0x906F, 0x2A7E, 0x9070, 0x9070, 0x2A7D,
+    0x9072, 0x9072, 0x1370, 0x9073, 0x9073, 0x2A7C, 0x9074, 0x9074, 0x136E,
+    0x9075, 0x9075, 0x136D, 0x9076, 0x9076, 0x2CB5, 0x9077, 0x9077, 0x124B,
+    0x9078, 0x9078, 0x136F, 0x9079, 0x9079, 0x2CB6, 0x907A, 0x907A, 0x1372,
+    0x907B, 0x907B, 0x2CB7, 0x907C, 0x907C, 0x1371, 0x907D, 0x907D, 0x1493,
+    0x907E, 0x907E, 0x2E7E, 0x907F, 0x907F, 0x1492, 0x9080, 0x9080, 0x1497,
+    0x9081, 0x9082, 0x1495, 0x9083, 0x9083, 0x153A, 0x9084, 0x9084, 0x1494,
+    0x9085, 0x9085, 0x2E7D, 0x9086, 0x9086, 0x2CB8, 0x9087, 0x9087, 0x1539,
+    0x9088, 0x9088, 0x153B, 0x908A, 0x908B, 0x15D9, 0x908D, 0x908D, 0x3247,
+    0x908F, 0x908F, 0x170C, 0x9090, 0x9090, 0x170B, 0x9091, 0x9091, 0x051B,
+    0x9094, 0x9094, 0x181E, 0x9095, 0x9095, 0x09DE, 0x9097, 0x9098, 0x181B,
+    0x9099, 0x9099, 0x181A, 0x909B, 0x909B, 0x181D, 0x909E, 0x909E, 0x18ED,
+    0x909F, 0x909F, 0x18EA, 0x90A0, 0x90A0, 0x18EF, 0x90A1, 0x90A1, 0x18EB,
+    0x90A2, 0x90A2, 0x051C, 0x90A3, 0x90A3, 0x051F, 0x90A5, 0x90A5, 0x18EC,
+    0x90A6, 0x90A6, 0x051E, 0x90A7, 0x90A7, 0x18EE, 0x90A8, 0x90A8, 0x387C,
+    0x90AA, 0x90AA, 0x051D, 0x90AE, 0x90AE, 0x3880, 0x90AF, 0x90AF, 0x1A52,
+    0x90B0, 0x90B0, 0x1A54, 0x90B1, 0x90B1, 0x0693, 0x90B2, 0x90B2, 0x1A50,
+    0x90B3, 0x90B3, 0x1A53, 0x90B4, 0x90B4, 0x1A51, 0x90B5, 0x90B5, 0x0691,
+    0x90B6, 0x90B6, 0x0694, 0x90B8, 0x90B8, 0x0692, 0x90BB, 0x90BB, 0x3BC4,
+    0x90BD, 0x90BD, 0x1C0C, 0x90BE, 0x90BE, 0x1C10, 0x90BF, 0x90BF, 0x1C0D,
+    0x90C1, 0x90C1, 0x081C, 0x90C3, 0x90C3, 0x081D, 0x90C4, 0x90C4, 0x387E,
+    0x90C5, 0x90C5, 0x1C0F, 0x90C7, 0x90C7, 0x1C11, 0x90C8, 0x90C8, 0x1C13,
+    0x90CA, 0x90CA, 0x081A, 0x90CB, 0x90CB, 0x1C12, 0x90CE, 0x90CE, 0x081B,
+    0x90D4, 0x90D4, 0x208C, 0x90D5, 0x90D5, 0x1C0E, 0x90D6, 0x90D6, 0x1E1D,
+    0x90D7, 0x90D7, 0x1E26, 0x90D8, 0x90D8, 0x1E24, 0x90D9, 0x90DA, 0x1E1F,
+    0x90DB, 0x90DB, 0x1E25, 0x90DC, 0x90DC, 0x1E27, 0x90DD, 0x90DD, 0x09E0,
+    0x90DF, 0x90DF, 0x1E22, 0x90E0, 0x90E0, 0x1E1E, 0x90E1, 0x90E1, 0x09DF,
+    0x90E2, 0x90E2, 0x09E1, 0x90E3, 0x90E3, 0x1E21, 0x90E4, 0x90E4, 0x1E28,
+    0x90E5, 0x90E5, 0x1E23, 0x90E8, 0x90E8, 0x0BC5, 0x90E9, 0x90E9, 0x208F,
+    0x90EA, 0x90EA, 0x2087, 0x90EB, 0x90EC, 0x208D, 0x90ED, 0x90ED, 0x0BC6,
+    0x90EF, 0x90EF, 0x2086, 0x90F0, 0x90F0, 0x2088, 0x90F1, 0x90F1, 0x1C0B,
+    0x90F2, 0x90F3, 0x208A, 0x90F4, 0x90F4, 0x2089, 0x90F5, 0x90F5, 0x0D89,
+    0x90F9, 0x90F9, 0x2328, 0x90FA, 0x90FA, 0x2CB9, 0x90FB, 0x90FB, 0x2329,
+    0x90FC, 0x90FC, 0x2326, 0x90FD, 0x90FD, 0x0BC7, 0x90FE, 0x90FE, 0x0D8B,
+    0x90FF, 0x90FF, 0x2325, 0x9100, 0x9100, 0x232B, 0x9101, 0x9101, 0x232A,
+    0x9102, 0x9102, 0x0D88, 0x9103, 0x9103, 0x232E, 0x9104, 0x9104, 0x2324,
+    0x9105, 0x9105, 0x232D, 0x9106, 0x9106, 0x2322, 0x9107, 0x9107, 0x232C,
+    0x9108, 0x9108, 0x2327, 0x9109, 0x9109, 0x0D8A, 0x910B, 0x910B, 0x25CD,
+    0x910D, 0x910D, 0x25C8, 0x910E, 0x910E, 0x25CE, 0x910F, 0x910F, 0x25C9,
+    0x9110, 0x9110, 0x25C7, 0x9111, 0x9111, 0x25CA, 0x9112, 0x9112, 0x0F45,
+    0x9114, 0x9114, 0x25CC, 0x9116, 0x9116, 0x25CB, 0x9117, 0x9117, 0x0F46,
+    0x9118, 0x9118, 0x10CD, 0x9119, 0x9119, 0x10CC, 0x911A, 0x911A, 0x2827,
+    0x911B, 0x911B, 0x282A, 0x911C, 0x911C, 0x2822, 0x911D, 0x911D, 0x2826,
+    0x911E, 0x911E, 0x10CE, 0x911F, 0x911F, 0x2825, 0x9120, 0x9120, 0x2823,
+    0x9121, 0x9121, 0x2829, 0x9122, 0x9122, 0x2824, 0x9123, 0x9123, 0x2821,
+    0x9124, 0x9124, 0x2828, 0x9126, 0x9126, 0x2A86, 0x9127, 0x9127, 0x124E,
+    0x9128, 0x9128, 0x2FFB, 0x9129, 0x912A, 0x2A83, 0x912B, 0x912B, 0x2A82,
+    0x912C, 0x912C, 0x2323, 0x912D, 0x912D, 0x124D, 0x912E, 0x912E, 0x2A87,
+    0x912F, 0x912F, 0x2A81, 0x9130, 0x9130, 0x124C, 0x9131, 0x9131, 0x124F,
+    0x9132, 0x9132, 0x2A85, 0x9133, 0x9133, 0x2CBA, 0x9134, 0x9134, 0x1373,
+    0x9135, 0x9136, 0x2CBB, 0x9138, 0x9138, 0x2E7F, 0x9139, 0x9139, 0x1498,
+    0x913A, 0x913B, 0x2FFC, 0x913E, 0x913E, 0x2FFE, 0x913F, 0x913F, 0x3148,
+    0x9140, 0x9140, 0x3147, 0x9141, 0x9141, 0x3249, 0x9143, 0x9143, 0x3248,
+    0x9144, 0x9145, 0x331F, 0x9146, 0x9146, 0x331E, 0x9147, 0x9147, 0x33C6,
+    0x9148, 0x9148, 0x16DE, 0x9149, 0x9149, 0x0520, 0x914A, 0x914A, 0x081F,
+    0x914B, 0x914B, 0x081E, 0x914C, 0x914C, 0x09E4, 0x914D, 0x914D, 0x09E3,
+    0x914E, 0x914F, 0x1E2A, 0x9150, 0x9150, 0x1E29, 0x9151, 0x9151, 0x3F49,
+    0x9152, 0x9152, 0x09E2, 0x9153, 0x9153, 0x2093, 0x9155, 0x9155, 0x2094,
+    0x9156, 0x9156, 0x2090, 0x9157, 0x9157, 0x0BC8, 0x9158, 0x9158, 0x2091,
+    0x9159, 0x9159, 0x3F45, 0x915A, 0x915A, 0x2092, 0x915C, 0x915C, 0x3F47,
+    0x915E, 0x915E, 0x43EB, 0x915F, 0x915F, 0x2331, 0x9160, 0x9160, 0x2333,
+    0x9161, 0x9161, 0x232F, 0x9162, 0x9162, 0x2332, 0x9163, 0x9163, 0x0D8C,
+    0x9164, 0x9164, 0x2330, 0x9165, 0x9165, 0x0D8D, 0x9167, 0x9167, 0x3882,
+    0x9168, 0x9168, 0x23E2, 0x9169, 0x9169, 0x0F49, 0x916A, 0x916A, 0x0F48,
+    0x916C, 0x916C, 0x0F47, 0x916E, 0x916F, 0x25CF, 0x9170, 0x9170, 0x3EB8,
+    0x9172, 0x9172, 0x282C, 0x9173, 0x9173, 0x282E, 0x9174, 0x9174, 0x10D2,
+    0x9175, 0x9175, 0x10CF, 0x9176, 0x9176, 0x3E9B, 0x9177, 0x9177, 0x10D1,
+    0x9178, 0x9178, 0x10D0, 0x9179, 0x9179, 0x282D, 0x917A, 0x917A, 0x282B,
+    0x917C, 0x917C, 0x3F6F, 0x9180, 0x9180, 0x2A8E, 0x9181, 0x9182, 0x2A8B,
+    0x9183, 0x9183, 0x1253, 0x9184, 0x9184, 0x2A8D, 0x9185, 0x9186, 0x2A88,
+    0x9187, 0x9187, 0x1250, 0x9189, 0x9189, 0x1251, 0x918A, 0x918A, 0x2A8A,
+    0x918B, 0x918B, 0x1252, 0x918C, 0x918C, 0x43EC, 0x918D, 0x918D, 0x2CC0,
+    0x918E, 0x918E, 0x3F4E, 0x918F, 0x918F, 0x2CC1, 0x9190, 0x9191, 0x2CBE,
+    0x9192, 0x9192, 0x1374, 0x9193, 0x9193, 0x2CBD, 0x9199, 0x9199, 0x2E83,
+    0x919A, 0x919A, 0x2E80, 0x919B, 0x919B, 0x2E82, 0x919C, 0x919C, 0x149B,
+    0x919D, 0x919D, 0x2E86, 0x919E, 0x919E, 0x149A, 0x919F, 0x919F, 0x2E84,
+    0x91A0, 0x91A0, 0x2E87, 0x91A1, 0x91A1, 0x2E85, 0x91A2, 0x91A2, 0x2E81,
+    0x91A3, 0x91A3, 0x1499, 0x91A5, 0x91A5, 0x3000, 0x91A7, 0x91A7, 0x3001,
+    0x91A8, 0x91A8, 0x2FFF, 0x91A9, 0x91A9, 0x3883, 0x91AA, 0x91AA, 0x3003,
+    0x91AB, 0x91AC, 0x153C, 0x91AD, 0x91AD, 0x314A, 0x91AE, 0x91AE, 0x15DC,
+    0x91AF, 0x91AF, 0x3002, 0x91B0, 0x91B0, 0x3149, 0x91B1, 0x91B1, 0x15DB,
+    0x91B2, 0x91B3, 0x324C, 0x91B4, 0x91B4, 0x1650, 0x91B5, 0x91B5, 0x324B,
+    0x91B6, 0x91B6, 0x45EF, 0x91B7, 0x91B7, 0x324A, 0x91B9, 0x91B9, 0x3321,
+    0x91BA, 0x91BA, 0x1698, 0x91BB, 0x91BB, 0x3BC8, 0x91BC, 0x91BC, 0x3446,
+    0x91BD, 0x91BD, 0x34A3, 0x91BE, 0x91BE, 0x34A2, 0x91C0, 0x91C0, 0x1730,
+    0x91C1, 0x91C1, 0x174A, 0x91C2, 0x91C2, 0x34A4, 0x91C3, 0x91C3, 0x350B,
+    0x91C4, 0x91C4, 0x3884, 0x91C5, 0x91C5, 0x175C, 0x91C6, 0x91C6, 0x0521,
+    0x91C7, 0x91C7, 0x0695, 0x91C9, 0x91C9, 0x0F4A, 0x91CB, 0x91CB, 0x1651,
+    0x91CC, 0x91CC, 0x0522, 0x91CD, 0x91CD, 0x0820, 0x91CE, 0x91CE, 0x0BC9,
+    0x91CF, 0x91CF, 0x0D8E, 0x91D0, 0x91D0, 0x153E, 0x91D1, 0x91D1, 0x0696,
+    0x91D3, 0x91D3, 0x1C15, 0x91D4, 0x91D4, 0x1C14, 0x91D5, 0x91D5, 0x1E2C,
+    0x91D6, 0x91D6, 0x415E, 0x91D7, 0x91D7, 0x09E7, 0x91D8, 0x91D8, 0x09E5,
+    0x91D9, 0x91D9, 0x09E9, 0x91DA, 0x91DA, 0x1E2E, 0x91DC, 0x91DC, 0x09E8,
+    0x91DD, 0x91DD, 0x09E6, 0x91DF, 0x91DF, 0x453A, 0x91E2, 0x91E2, 0x1E2D,
+    0x91E3, 0x91E3, 0x0BCC, 0x91E4, 0x91E4, 0x209A, 0x91E5, 0x91E5, 0x3C06,
+    0x91E6, 0x91E6, 0x0BCB, 0x91E7, 0x91E7, 0x0BCD, 0x91E8, 0x91E8, 0x209F,
+    0x91E9, 0x91E9, 0x0BCF, 0x91EA, 0x91EB, 0x209C, 0x91EC, 0x91EC, 0x2095,
+    0x91ED, 0x91ED, 0x0BCE, 0x91EE, 0x91EE, 0x20A0, 0x91F1, 0x91F1, 0x2097,
+    0x91F3, 0x91F3, 0x2098, 0x91F4, 0x91F4, 0x2096, 0x91F5, 0x91F5, 0x0BCA,
+    0x91F7, 0x91F7, 0x209E, 0x91F8, 0x91F8, 0x2099, 0x91F9, 0x91F9, 0x209B,
+    0x91FA, 0x91FA, 0x3AF8, 0x91FD, 0x91FD, 0x233F, 0x91FE, 0x91FE, 0x382E,
+    0x91FF, 0x91FF, 0x233E, 0x9200, 0x9200, 0x233C, 0x9201, 0x9201, 0x2334,
+    0x9202, 0x9202, 0x2343, 0x9203, 0x9203, 0x2337, 0x9204, 0x9204, 0x2341,
+    0x9205, 0x9205, 0x2348, 0x9206, 0x9206, 0x2340, 0x9207, 0x9207, 0x0D96,
+    0x9208, 0x9208, 0x3EB9, 0x9209, 0x9209, 0x0D92, 0x920A, 0x920A, 0x2335,
+    0x920C, 0x920C, 0x233B, 0x920D, 0x920D, 0x0D94, 0x920E, 0x920E, 0x3888,
+    0x920F, 0x920F, 0x233A, 0x9210, 0x9210, 0x0D95, 0x9211, 0x9211, 0x0D97,
+    0x9212, 0x9212, 0x233D, 0x9213, 0x9213, 0x4793, 0x9214, 0x9215, 0x0D8F,
+    0x9216, 0x9216, 0x2349, 0x9217, 0x9217, 0x2347, 0x9219, 0x9219, 0x2346,
+    0x921A, 0x921A, 0x2338, 0x921C, 0x921C, 0x2344, 0x921E, 0x921E, 0x0D93,
+    0x9223, 0x9223, 0x0D91, 0x9224, 0x9224, 0x2345, 0x9225, 0x9225, 0x2336,
+    0x9226, 0x9226, 0x2339, 0x9227, 0x9227, 0x2342, 0x9228, 0x9228, 0x4795,
+    0x922A, 0x922A, 0x3C0E, 0x922B, 0x922B, 0x3BA6, 0x922D, 0x922D, 0x2851,
+    0x922E, 0x922E, 0x25DA, 0x9230, 0x9230, 0x25D3, 0x9231, 0x9231, 0x25E6,
+    0x9232, 0x9232, 0x25EF, 0x9233, 0x9233, 0x25D6, 0x9234, 0x9234, 0x0F55,
+    0x9235, 0x9235, 0x3B26, 0x9236, 0x9236, 0x25E3, 0x9237, 0x9237, 0x0F4B,
+    0x9238, 0x9238, 0x0F4D, 0x9239, 0x9239, 0x0F59, 0x923A, 0x923A, 0x25D4,
+    0x923C, 0x923C, 0x41D2, 0x923D, 0x923D, 0x0F4E, 0x923E, 0x923E, 0x0F50,
+    0x923F, 0x923F, 0x0F5A, 0x9240, 0x9240, 0x0F4F, 0x9241, 0x9241, 0x388A,
+    0x9244, 0x9244, 0x389A, 0x9245, 0x9245, 0x0F58, 0x9246, 0x9246, 0x25DC,
+    0x9248, 0x9248, 0x25D1, 0x9249, 0x9249, 0x0F56, 0x924A, 0x924A, 0x25DB,
+    0x924B, 0x924B, 0x0F52, 0x924C, 0x924C, 0x25ED, 0x924D, 0x924D, 0x0F57,
+    0x924E, 0x924E, 0x25EB, 0x924F, 0x924F, 0x25DF, 0x9250, 0x9250, 0x25E9,
+    0x9251, 0x9251, 0x0F54, 0x9252, 0x9252, 0x25D2, 0x9253, 0x9253, 0x25EC,
+    0x9254, 0x9254, 0x25E7, 0x9255, 0x9255, 0x3E47, 0x9256, 0x9256, 0x25EE,
+    0x9257, 0x9257, 0x0F4C, 0x9258, 0x9258, 0x4796, 0x925A, 0x925A, 0x0F5B,
+    0x925B, 0x925B, 0x0F51, 0x925D, 0x925D, 0x3A03, 0x925E, 0x925E, 0x25D8,
+    0x925F, 0x925F, 0x3CE0, 0x9260, 0x9260, 0x25E0, 0x9261, 0x9261, 0x25E4,
+    0x9262, 0x9262, 0x388B, 0x9263, 0x9263, 0x25E8, 0x9264, 0x9264, 0x0F53,
+    0x9265, 0x9265, 0x25D7, 0x9266, 0x9266, 0x25D5, 0x9267, 0x9267, 0x25E1,
+    0x926B, 0x926B, 0x4797, 0x926C, 0x926C, 0x25DE, 0x926D, 0x926D, 0x25DD,
+    0x926E, 0x926E, 0x3D05, 0x926F, 0x926F, 0x25E2, 0x9270, 0x9270, 0x25E5,
+    0x9272, 0x9272, 0x25EA, 0x9276, 0x9276, 0x2831, 0x9277, 0x9277, 0x3C64,
+    0x9278, 0x9278, 0x10D3, 0x9279, 0x9279, 0x283B, 0x927A, 0x927A, 0x2833,
+    0x927B, 0x927B, 0x10D9, 0x927C, 0x927C, 0x10DD, 0x927D, 0x927D, 0x2844,
+    0x927E, 0x927E, 0x284C, 0x927F, 0x927F, 0x283D, 0x9280, 0x9280, 0x10D5,
+    0x9281, 0x9281, 0x3E01, 0x9282, 0x9282, 0x2841, 0x9283, 0x9283, 0x25D9,
+    0x9284, 0x9284, 0x3CB9, 0x9285, 0x9285, 0x10D6, 0x9286, 0x9286, 0x2848,
+    0x9287, 0x9287, 0x284D, 0x9288, 0x9288, 0x2845, 0x9289, 0x9289, 0x3AB5,
+    0x928A, 0x928A, 0x2847, 0x928B, 0x928B, 0x2850, 0x928C, 0x928C, 0x2849,
+    0x928D, 0x928D, 0x2837, 0x928E, 0x928E, 0x2840, 0x928F, 0x928F, 0x46BD,
+    0x9291, 0x9291, 0x10DE, 0x9293, 0x9293, 0x10DA, 0x9294, 0x9294, 0x2835,
+    0x9295, 0x9295, 0x2842, 0x9296, 0x9296, 0x10D8, 0x9297, 0x9297, 0x283C,
+    0x9298, 0x9298, 0x10D7, 0x9299, 0x9299, 0x284A, 0x929A, 0x929A, 0x2839,
+    0x929B, 0x929B, 0x2832, 0x929C, 0x929C, 0x10DB, 0x929D, 0x929D, 0x284F,
+    0x92A0, 0x92A0, 0x2834, 0x92A1, 0x92A1, 0x2846, 0x92A2, 0x92A2, 0x2843,
+    0x92A3, 0x92A3, 0x283E, 0x92A4, 0x92A4, 0x2830, 0x92A5, 0x92A5, 0x282F,
+    0x92A6, 0x92A6, 0x2838, 0x92A7, 0x92A7, 0x284B, 0x92A8, 0x92A8, 0x10DC,
+    0x92A9, 0x92A9, 0x284E, 0x92AA, 0x92AA, 0x2836, 0x92AB, 0x92AB, 0x283A,
+    0x92AC, 0x92AC, 0x10D4, 0x92AE, 0x92AE, 0x4799, 0x92B1, 0x92B1, 0x4798,
+    0x92B2, 0x92B2, 0x125F, 0x92B3, 0x92B3, 0x125A, 0x92B4, 0x92B4, 0x2AB0,
+    0x92B5, 0x92B5, 0x2AAC, 0x92B6, 0x92B6, 0x2A94, 0x92B7, 0x92B7, 0x1256,
+    0x92B9, 0x92B9, 0x36E9, 0x92BA, 0x92BA, 0x3BF5, 0x92BB, 0x92BB, 0x1255,
+    0x92BC, 0x92BC, 0x125B, 0x92BE, 0x92BE, 0x3C60, 0x92BF, 0x92BF, 0x479A,
+    0x92C0, 0x92C0, 0x2A92, 0x92C1, 0x92C1, 0x1259, 0x92C2, 0x92C2, 0x2A9E,
+    0x92C3, 0x92C4, 0x2A90, 0x92C5, 0x92C5, 0x1254, 0x92C6, 0x92C6, 0x2AAF,
+    0x92C7, 0x92C7, 0x125D, 0x92C8, 0x92C8, 0x2AA1, 0x92C9, 0x92C9, 0x2AA6,
+    0x92CA, 0x92CA, 0x2AA0, 0x92CB, 0x92CB, 0x2CD3, 0x92CC, 0x92CC, 0x2A9C,
+    0x92CD, 0x92CD, 0x2AA4, 0x92CE, 0x92CE, 0x2AA2, 0x92CF, 0x92CF, 0x2A95,
+    0x92D0, 0x92D0, 0x2A8F, 0x92D1, 0x92D1, 0x2AAA, 0x92D2, 0x92D2, 0x125C,
+    0x92D3, 0x92D3, 0x2AAB, 0x92D4, 0x92D4, 0x3861, 0x92D5, 0x92D5, 0x2AA5,
+    0x92D7, 0x92D7, 0x2A9A, 0x92D8, 0x92D8, 0x2A98, 0x92D9, 0x92D9, 0x2A93,
+    0x92DB, 0x92DB, 0x400C, 0x92DD, 0x92DD, 0x2A9B, 0x92DE, 0x92DE, 0x2AA8,
+    0x92DF, 0x92DF, 0x2A97, 0x92E0, 0x92E0, 0x2AA7, 0x92E1, 0x92E1, 0x2AAD,
+    0x92E3, 0x92E3, 0x479B, 0x92E4, 0x92E4, 0x1258, 0x92E5, 0x92E5, 0x3CA2,
+    0x92E6, 0x92E6, 0x2AA3, 0x92E7, 0x92E7, 0x2AA9, 0x92E8, 0x92E8, 0x2A9F,
+    0x92E9, 0x92E9, 0x2A99, 0x92EA, 0x92EA, 0x1257, 0x92EB, 0x92EB, 0x479C,
+    0x92EC, 0x92EC, 0x3964, 0x92EE, 0x92EE, 0x283F, 0x92EF, 0x92EF, 0x2A9D,
+    0x92F0, 0x92F0, 0x125E, 0x92F1, 0x92F1, 0x2A96, 0x92F2, 0x92F2, 0x3AB2,
+    0x92F3, 0x92F4, 0x479D, 0x92F6, 0x92F6, 0x3C04, 0x92F7, 0x92F7, 0x2CD8,
+    0x92F8, 0x92F8, 0x1377, 0x92F9, 0x92F9, 0x2CD7, 0x92FA, 0x92FA, 0x2CD5,
+    0x92FB, 0x92FB, 0x2CE7, 0x92FC, 0x92FC, 0x137B, 0x92FD, 0x92FD, 0x479F,
+    0x92FE, 0x92FE, 0x2CE4, 0x92FF, 0x92FF, 0x2CDC, 0x9300, 0x9300, 0x2CE6,
+    0x9301, 0x9301, 0x2CCE, 0x9302, 0x9302, 0x2CDA, 0x9303, 0x9303, 0x3867,
+    0x9304, 0x9304, 0x137D, 0x9306, 0x9306, 0x2CC6, 0x9307, 0x9307, 0x3B11,
+    0x9308, 0x9308, 0x2CC4, 0x9309, 0x9309, 0x2CE5, 0x930B, 0x930B, 0x2CE3,
+    0x930C, 0x930C, 0x2CE2, 0x930D, 0x930D, 0x2CD2, 0x930E, 0x930E, 0x2CD1,
+    0x930F, 0x930F, 0x2CC7, 0x9310, 0x9310, 0x137F, 0x9312, 0x9312, 0x2CCD,
+    0x9313, 0x9313, 0x2CD6, 0x9314, 0x9314, 0x2CE1, 0x9315, 0x9315, 0x1382,
+    0x9316, 0x9316, 0x2CE8, 0x9318, 0x9318, 0x14A3, 0x9319, 0x9319, 0x1384,
+    0x931A, 0x931A, 0x137E, 0x931B, 0x931B, 0x2CCB, 0x931D, 0x931D, 0x2CD4,
+    0x931E, 0x931E, 0x2CC3, 0x931F, 0x931F, 0x2CC5, 0x9320, 0x9320, 0x1375,
+    0x9321, 0x9321, 0x1381, 0x9322, 0x9322, 0x137A, 0x9323, 0x9323, 0x2CCC,
+    0x9324, 0x9324, 0x2CDB, 0x9325, 0x9325, 0x2AAE, 0x9326, 0x9326, 0x1380,
+    0x9327, 0x9327, 0x2CC2, 0x9328, 0x9328, 0x149E, 0x9329, 0x9329, 0x2CDD,
+    0x932A, 0x932A, 0x2CE0, 0x932B, 0x932B, 0x137C, 0x932C, 0x932C, 0x3892,
+    0x932D, 0x932D, 0x2CD0, 0x932E, 0x932E, 0x1383, 0x932F, 0x932F, 0x1379,
+    0x9330, 0x9330, 0x3E03, 0x9331, 0x9331, 0x3CBD, 0x9333, 0x9333, 0x1378,
+    0x9334, 0x9334, 0x2CD9, 0x9335, 0x9335, 0x2CDF, 0x9336, 0x9336, 0x1376,
+    0x9338, 0x9338, 0x2CC9, 0x9339, 0x9339, 0x2CDE, 0x933C, 0x933C, 0x2CCA,
+    0x9340, 0x9340, 0x4155, 0x9341, 0x9341, 0x4277, 0x9342, 0x9342, 0x3AFA,
+    0x9343, 0x9343, 0x47A0, 0x9344, 0x9344, 0x4016, 0x9345, 0x9345, 0x3E74,
+    0x9346, 0x9346, 0x2CCF, 0x9347, 0x9347, 0x2E8D, 0x9348, 0x9348, 0x3C61,
+    0x9349, 0x9349, 0x2E92, 0x934A, 0x934A, 0x14A0, 0x934B, 0x934B, 0x14A2,
+    0x934C, 0x934C, 0x2E98, 0x934D, 0x934D, 0x149C, 0x934E, 0x934E, 0x2EA6,
+    0x934F, 0x934F, 0x2E9E, 0x9350, 0x9351, 0x2E93, 0x9352, 0x9352, 0x2E9D,
+    0x9354, 0x9354, 0x14A9, 0x9355, 0x9355, 0x2E9C, 0x9356, 0x9356, 0x2E8C,
+    0x9357, 0x9357, 0x2E9B, 0x9358, 0x9358, 0x2E8F, 0x9359, 0x9359, 0x2EA7,
+    0x935A, 0x935A, 0x14A8, 0x935B, 0x935B, 0x14A6, 0x935C, 0x935C, 0x2E90,
+    0x935E, 0x935E, 0x2EA3, 0x935F, 0x935F, 0x3CBB, 0x9360, 0x9360, 0x2E95,
+    0x9361, 0x9361, 0x2EA2, 0x9362, 0x9362, 0x4268, 0x9363, 0x9363, 0x2EA4,
+    0x9364, 0x9364, 0x2E8B, 0x9365, 0x9365, 0x14A1, 0x9366, 0x9366, 0x46BC,
+    0x9367, 0x9367, 0x2EA5, 0x9368, 0x9368, 0x3BF0, 0x9369, 0x9369, 0x3961,
+    0x936A, 0x936A, 0x2E99, 0x936B, 0x936B, 0x3893, 0x936C, 0x936C, 0x14A5,
+    0x936D, 0x936D, 0x2E96, 0x936E, 0x936E, 0x39E8, 0x9370, 0x9370, 0x14A7,
+    0x9371, 0x9371, 0x2E9F, 0x9373, 0x9373, 0x389E, 0x9374, 0x9374, 0x3CE4,
+    0x9375, 0x9375, 0x149F, 0x9376, 0x9376, 0x2E91, 0x9377, 0x9377, 0x2EA0,
+    0x9378, 0x9378, 0x38F9, 0x9379, 0x9379, 0x2E9A, 0x937A, 0x937A, 0x2CC8,
+    0x937B, 0x937B, 0x2EA1, 0x937C, 0x937C, 0x2E8E, 0x937D, 0x937D, 0x3C25,
+    0x937E, 0x937E, 0x14A4, 0x9380, 0x9380, 0x3014, 0x9381, 0x9381, 0x3965,
+    0x9382, 0x9382, 0x149D, 0x9383, 0x9383, 0x2E89, 0x9384, 0x9384, 0x47A1,
+    0x9385, 0x9385, 0x42BD, 0x9386, 0x9386, 0x3CC0, 0x9387, 0x9387, 0x3AE0,
+    0x9388, 0x9388, 0x3011, 0x9389, 0x9389, 0x300A, 0x938A, 0x938A, 0x1540,
+    0x938C, 0x938C, 0x3005, 0x938D, 0x938D, 0x3015, 0x938E, 0x938E, 0x300C,
+    0x938F, 0x938F, 0x2E97, 0x9390, 0x9390, 0x3D3C, 0x9391, 0x9391, 0x3017,
+    0x9392, 0x9392, 0x3006, 0x9394, 0x9394, 0x153F, 0x9395, 0x9395, 0x3010,
+    0x9396, 0x9396, 0x1541, 0x9397, 0x9397, 0x1549, 0x9398, 0x9398, 0x1547,
+    0x9399, 0x9399, 0x3012, 0x939A, 0x939A, 0x1548, 0x939B, 0x939B, 0x3008,
+    0x939C, 0x939C, 0x39AC, 0x939D, 0x939D, 0x3009, 0x939E, 0x939E, 0x300E,
+    0x939F, 0x939F, 0x3013, 0x93A0, 0x93A0, 0x3AB1, 0x93A1, 0x93A1, 0x2E88,
+    0x93A2, 0x93A2, 0x1542, 0x93A3, 0x93A3, 0x301C, 0x93A4, 0x93A4, 0x3019,
+    0x93A5, 0x93A5, 0x3160, 0x93A6, 0x93A6, 0x300F, 0x93A7, 0x93A7, 0x300B,
+    0x93A8, 0x93A8, 0x301A, 0x93A9, 0x93A9, 0x3155, 0x93AA, 0x93AA, 0x300D,
+    0x93AC, 0x93AC, 0x1545, 0x93AD, 0x93AD, 0x47A2, 0x93AE, 0x93AE, 0x1544,
+    0x93AF, 0x93AF, 0x2E8A, 0x93B0, 0x93B0, 0x1546, 0x93B1, 0x93B1, 0x3016,
+    0x93B2, 0x93B2, 0x3018, 0x93B3, 0x93B3, 0x1543, 0x93B4, 0x93B4, 0x301B,
+    0x93B5, 0x93B5, 0x3004, 0x93B7, 0x93B7, 0x3007, 0x93B8, 0x93B8, 0x3C90,
+    0x93BA, 0x93BA, 0x43F7, 0x93BB, 0x93BB, 0x3C8F, 0x93BD, 0x93BD, 0x3A27,
+    0x93BF, 0x93BF, 0x3E2D, 0x93C0, 0x93C0, 0x315E, 0x93C2, 0x93C2, 0x314E,
+    0x93C3, 0x93C3, 0x15E0, 0x93C4, 0x93C4, 0x315C, 0x93C6, 0x93C6, 0x39AA,
+    0x93C7, 0x93C7, 0x314C, 0x93C8, 0x93C8, 0x15E1, 0x93CA, 0x93CA, 0x3157,
+    0x93CB, 0x93CB, 0x3966, 0x93CC, 0x93CC, 0x3153, 0x93CD, 0x93CD, 0x15E6,
+    0x93CE, 0x93CE, 0x315D, 0x93CF, 0x93CF, 0x314D, 0x93D0, 0x93D0, 0x3150,
+    0x93D1, 0x93D1, 0x15DE, 0x93D2, 0x93D2, 0x315F, 0x93D3, 0x93D3, 0x40E1,
+    0x93D4, 0x93D4, 0x3158, 0x93D5, 0x93D5, 0x315B, 0x93D6, 0x93D6, 0x15E4,
+    0x93D7, 0x93D7, 0x15E9, 0x93D8, 0x93D8, 0x15E7, 0x93D9, 0x93D9, 0x3154,
+    0x93DA, 0x93DA, 0x314F, 0x93DB, 0x93DB, 0x3C5F, 0x93DC, 0x93DD, 0x15E2,
+    0x93DE, 0x93DE, 0x314B, 0x93DF, 0x93DF, 0x15DF, 0x93E0, 0x93E0, 0x3A20,
+    0x93E1, 0x93E1, 0x15DD, 0x93E2, 0x93E2, 0x15E5, 0x93E3, 0x93E3, 0x315A,
+    0x93E4, 0x93E4, 0x15E8, 0x93E6, 0x93E6, 0x3156, 0x93E7, 0x93E7, 0x3161,
+    0x93E8, 0x93E8, 0x15EA, 0x93EC, 0x93EC, 0x3152, 0x93EE, 0x93EE, 0x3159,
+    0x93F0, 0x93F0, 0x423F, 0x93F1, 0x93F1, 0x42AA, 0x93F3, 0x93F3, 0x3962,
+    0x93F5, 0x93F5, 0x325A, 0x93F6, 0x93F6, 0x3269, 0x93F7, 0x93F7, 0x325C,
+    0x93F8, 0x93F8, 0x3263, 0x93F9, 0x93F9, 0x3151, 0x93FA, 0x93FA, 0x3261,
+    0x93FB, 0x93FB, 0x3250, 0x93FC, 0x93FC, 0x3267, 0x93FD, 0x93FD, 0x1654,
+    0x93FE, 0x93FE, 0x3254, 0x93FF, 0x93FF, 0x3266, 0x9400, 0x9400, 0x325B,
+    0x9401, 0x9401, 0x3CD4, 0x9403, 0x9403, 0x1653, 0x9404, 0x9404, 0x3BC9,
+    0x9406, 0x9406, 0x326B, 0x9407, 0x9407, 0x325D, 0x9408, 0x9408, 0x3A25,
+    0x9409, 0x9409, 0x3262, 0x940A, 0x940A, 0x3265, 0x940B, 0x940B, 0x324E,
+    0x940C, 0x940C, 0x3268, 0x940D, 0x940D, 0x3259, 0x940E, 0x940E, 0x325E,
+    0x940F, 0x940F, 0x3252, 0x9410, 0x9410, 0x3256, 0x9411, 0x9411, 0x326A,
+    0x9412, 0x9412, 0x3260, 0x9413, 0x9413, 0x324F, 0x9414, 0x9414, 0x3253,
+    0x9415, 0x9415, 0x3255, 0x9416, 0x9416, 0x325F, 0x9417, 0x9417, 0x47A5,
+    0x9418, 0x9418, 0x1652, 0x9419, 0x9419, 0x3258, 0x941B, 0x941B, 0x4148,
+    0x941D, 0x941D, 0x47A6, 0x9420, 0x9420, 0x3251, 0x9424, 0x9424, 0x3943,
+    0x9425, 0x9425, 0x38D0, 0x9426, 0x9426, 0x38A3, 0x9427, 0x9427, 0x3BCD,
+    0x9428, 0x9428, 0x3257, 0x9429, 0x9429, 0x3325, 0x942A, 0x942A, 0x3329,
+    0x942B, 0x942B, 0x169F, 0x942C, 0x942C, 0x332B, 0x942D, 0x942D, 0x47A7,
+    0x942E, 0x942E, 0x1699, 0x9430, 0x9430, 0x3327, 0x9431, 0x9431, 0x332D,
+    0x9432, 0x9432, 0x169E, 0x9433, 0x9433, 0x169A, 0x9435, 0x9435, 0x169B,
+    0x9436, 0x9436, 0x3324, 0x9437, 0x9437, 0x332A, 0x9438, 0x9438, 0x169D,
+    0x9439, 0x9439, 0x3328, 0x943A, 0x943A, 0x169C, 0x943B, 0x943B, 0x3323,
+    0x943C, 0x943C, 0x3264, 0x943D, 0x943D, 0x3326, 0x943E, 0x943E, 0x47A8,
+    0x943F, 0x943F, 0x3322, 0x9440, 0x9440, 0x332C, 0x9442, 0x9442, 0x4272,
+    0x9443, 0x9443, 0x4275, 0x9444, 0x9444, 0x16DF, 0x9445, 0x9445, 0x33CD,
+    0x9446, 0x9446, 0x33D0, 0x9447, 0x9447, 0x33CC, 0x9448, 0x9449, 0x33CE,
+    0x944A, 0x944B, 0x33C9, 0x944C, 0x944C, 0x33C7, 0x944D, 0x944D, 0x3C65,
+    0x944F, 0x944F, 0x33CB, 0x9450, 0x9450, 0x33C8, 0x9451, 0x9452, 0x16E0,
+    0x9454, 0x9454, 0x47AA, 0x9455, 0x9455, 0x3448, 0x9457, 0x9457, 0x344A,
+    0x9458, 0x9458, 0x3C30, 0x945B, 0x945B, 0x389F, 0x945D, 0x945D, 0x3449,
+    0x945E, 0x945E, 0x344B, 0x9460, 0x9460, 0x170E, 0x9462, 0x9462, 0x3447,
+    0x9463, 0x9463, 0x170D, 0x9464, 0x9464, 0x170F, 0x9465, 0x9465, 0x3DDE,
+    0x9467, 0x9467, 0x3AB8, 0x9468, 0x9469, 0x34A6, 0x946A, 0x946A, 0x1731,
+    0x946B, 0x946B, 0x34A5, 0x946C, 0x946C, 0x377E, 0x946D, 0x946D, 0x34ED,
+    0x946E, 0x946E, 0x34EC, 0x946F, 0x946F, 0x34EE, 0x9470, 0x9470, 0x174C,
+    0x9471, 0x9471, 0x34EF, 0x9472, 0x9472, 0x174B, 0x9473, 0x9473, 0x34F0,
+    0x9474, 0x9474, 0x350C, 0x9475, 0x9475, 0x350F, 0x9476, 0x9476, 0x350E,
+    0x9477, 0x9477, 0x1755, 0x9478, 0x9478, 0x350D, 0x9479, 0x9479, 0x47AB,
+    0x947B, 0x947B, 0x419B, 0x947C, 0x947C, 0x175F, 0x947D, 0x947E, 0x175D,
+    0x947F, 0x947F, 0x1764, 0x9480, 0x9481, 0x3539, 0x9482, 0x9482, 0x3538,
+    0x9483, 0x9483, 0x3540, 0x9485, 0x9485, 0x4507, 0x949F, 0x949F, 0x4885,
+    0x94A2, 0x94A2, 0x451B, 0x94C1, 0x94C1, 0x47E1, 0x94C3, 0x94C3, 0x47DF,
+    0x94DC, 0x94DC, 0x47D7, 0x94F6, 0x94F6, 0x47D2, 0x952D, 0x952D, 0x47AC,
+    0x9547, 0x9547, 0x48BF, 0x9577, 0x9577, 0x0697, 0x9578, 0x9578, 0x4508,
+    0x957A, 0x957A, 0x20A1, 0x957B, 0x957B, 0x234A, 0x957C, 0x957C, 0x2AB1,
+    0x957D, 0x957D, 0x3162, 0x957F, 0x957F, 0x4509, 0x9580, 0x9580, 0x0698,
+    0x9582, 0x9582, 0x0821, 0x9583, 0x9583, 0x09EA, 0x9585, 0x9585, 0x38A1,
+    0x9586, 0x9586, 0x20A2, 0x9588, 0x9588, 0x20A3, 0x9589, 0x9589, 0x0BD0,
+    0x958B, 0x958B, 0x0D9A, 0x958C, 0x958C, 0x234C, 0x958D, 0x958D, 0x234B,
+    0x958E, 0x958E, 0x0D9E, 0x958F, 0x958F, 0x0D99, 0x9590, 0x9590, 0x234D,
+    0x9591, 0x9591, 0x0D9B, 0x9592, 0x9592, 0x0D9D, 0x9593, 0x9593, 0x0D9C,
+    0x9594, 0x9594, 0x0D98, 0x9596, 0x9596, 0x3BD5, 0x9597, 0x9597, 0x3BD4,
+    0x9598, 0x9598, 0x0F5C, 0x9599, 0x9599, 0x3BD2, 0x959B, 0x959B, 0x25F3,
+    0x959C, 0x959C, 0x25F1, 0x959E, 0x959E, 0x25F2, 0x959F, 0x959F, 0x25F0,
+    0x95A0, 0x95A0, 0x38A4, 0x95A1, 0x95A1, 0x10DF, 0x95A2, 0x95A2, 0x47AD,
+    0x95A3, 0x95A3, 0x10E2, 0x95A4, 0x95A4, 0x10E4, 0x95A5, 0x95A5, 0x10E3,
+    0x95A6, 0x95A6, 0x38A2, 0x95A7, 0x95A7, 0x3BD3, 0x95A8, 0x95A9, 0x10E0,
+    0x95AA, 0x95AA, 0x4395, 0x95AB, 0x95AB, 0x2AB3, 0x95AC, 0x95AC, 0x2AB2,
+    0x95AD, 0x95AD, 0x1260, 0x95AE, 0x95AE, 0x2AB4, 0x95B0, 0x95B0, 0x2AB5,
+    0x95B1, 0x95B1, 0x1261, 0x95B5, 0x95B5, 0x2CF0, 0x95B6, 0x95B6, 0x2CEE,
+    0x95B7, 0x95B7, 0x2EAD, 0x95B9, 0x95BA, 0x2CEC, 0x95BB, 0x95BB, 0x1385,
+    0x95BC, 0x95BC, 0x2CE9, 0x95BD, 0x95BD, 0x2CF1, 0x95BE, 0x95BE, 0x2CEB,
+    0x95BF, 0x95BF, 0x2CEF, 0x95C0, 0x95C0, 0x2EA9, 0x95C3, 0x95C3, 0x2EAB,
+    0x95C5, 0x95C5, 0x2EAC, 0x95C6, 0x95C6, 0x14AE, 0x95C7, 0x95C7, 0x2EA8,
+    0x95C8, 0x95C8, 0x14AD, 0x95C9, 0x95C9, 0x2EAA, 0x95CA, 0x95CC, 0x14AA,
+    0x95CD, 0x95CD, 0x2CEA, 0x95D0, 0x95D0, 0x154C, 0x95D1, 0x95D1, 0x301F,
+    0x95D2, 0x95D3, 0x301D, 0x95D4, 0x95D4, 0x154A, 0x95D5, 0x95D5, 0x154D,
+    0x95D6, 0x95D6, 0x154B, 0x95DA, 0x95DB, 0x3163, 0x95DC, 0x95DC, 0x15EB,
+    0x95DE, 0x95DE, 0x326C, 0x95DF, 0x95DF, 0x326E, 0x95E0, 0x95E0, 0x326D,
+    0x95E1, 0x95E1, 0x1655, 0x95E2, 0x95E2, 0x16A0, 0x95E3, 0x95E3, 0x3330,
+    0x95E4, 0x95E4, 0x332F, 0x95E5, 0x95E5, 0x332E, 0x95E8, 0x95E8, 0x450A,
+    0x95F4, 0x95F4, 0x47AF, 0x961C, 0x961C, 0x0699, 0x961D, 0x961D, 0x4519,
+    0x961E, 0x961E, 0x17B4, 0x9620, 0x9620, 0x1821, 0x9621, 0x9621, 0x0414,
+    0x9622, 0x9622, 0x181F, 0x9623, 0x9623, 0x1822, 0x9624, 0x9624, 0x1820,
+    0x9628, 0x9628, 0x18F1, 0x962A, 0x962A, 0x0526, 0x962C, 0x962C, 0x0527,
+    0x962D, 0x962D, 0x18F3, 0x962E, 0x962E, 0x0524, 0x962F, 0x962F, 0x18F2,
+    0x9630, 0x9630, 0x18F0, 0x9631, 0x9631, 0x0525, 0x9632, 0x9632, 0x0523,
+    0x9633, 0x9633, 0x47B0, 0x9638, 0x9638, 0x3FD1, 0x9639, 0x9639, 0x1A55,
+    0x963A, 0x963A, 0x1A58, 0x963B, 0x963B, 0x069C, 0x963C, 0x963C, 0x1A57,
+    0x963D, 0x963D, 0x1A56, 0x963F, 0x963F, 0x069B, 0x9640, 0x9640, 0x069A,
+    0x9641, 0x9641, 0x3F3D, 0x9642, 0x9642, 0x069E, 0x9643, 0x9643, 0x1A59,
+    0x9644, 0x9644, 0x069D, 0x9645, 0x9645, 0x4772, 0x964A, 0x964A, 0x1C1A,
+    0x964B, 0x964D, 0x0823, 0x964E, 0x964E, 0x1C1B, 0x964F, 0x964F, 0x1C17,
+    0x9650, 0x9650, 0x0822, 0x9651, 0x9651, 0x1C18, 0x9653, 0x9653, 0x1C19,
+    0x9654, 0x9654, 0x1C16, 0x9656, 0x9656, 0x3DE7, 0x9658, 0x9658, 0x09F1,
+    0x965B, 0x965B, 0x09EE, 0x965C, 0x965C, 0x1E2F, 0x965D, 0x965D, 0x09EF,
+    0x965E, 0x965E, 0x09F2, 0x965F, 0x965F, 0x1E30, 0x9661, 0x9661, 0x09ED,
+    0x9662, 0x9663, 0x09EB, 0x9664, 0x9664, 0x09F0, 0x9669, 0x9669, 0x475E,
+    0x966A, 0x966A, 0x0BD1, 0x966B, 0x966B, 0x20A6, 0x966C, 0x966C, 0x0BD9,
+    0x966D, 0x966D, 0x20A5, 0x966F, 0x966F, 0x20A8, 0x9670, 0x9670, 0x0BD5,
+    0x9671, 0x9671, 0x20A7, 0x9672, 0x9672, 0x0DA6, 0x9673, 0x9673, 0x0BD3,
+    0x9674, 0x9674, 0x0BD6, 0x9675, 0x9675, 0x0BD2, 0x9676, 0x9677, 0x0BD7,
+    0x9678, 0x9678, 0x0BD4, 0x967B, 0x967B, 0x38AC, 0x967C, 0x967C, 0x20A4,
+    0x967D, 0x967D, 0x0DA2, 0x967E, 0x967E, 0x234F, 0x9680, 0x9680, 0x2353,
+    0x9681, 0x9681, 0x3F46, 0x9683, 0x9683, 0x2352, 0x9684, 0x9684, 0x0DA7,
+    0x9685, 0x9686, 0x0DA3, 0x9687, 0x9687, 0x234E, 0x9688, 0x9689, 0x2350,
+    0x968A, 0x968A, 0x0D9F, 0x968B, 0x968B, 0x0DA1, 0x968D, 0x968D, 0x0DA5,
+    0x968E, 0x968E, 0x0DA0, 0x968F, 0x968F, 0x3BDE, 0x9691, 0x9691, 0x25F6,
+    0x9692, 0x9693, 0x25F4, 0x9694, 0x9695, 0x0F5E, 0x9696, 0x9696, 0x38AD,
+    0x9697, 0x9697, 0x25F7, 0x9698, 0x9698, 0x0F5D, 0x9699, 0x9699, 0x10E5,
+    0x969B, 0x969B, 0x10E7, 0x969C, 0x969C, 0x10E6, 0x969E, 0x969E, 0x2852,
+    0x96A1, 0x96A1, 0x2853, 0x96A2, 0x96A2, 0x2AB7, 0x96A3, 0x96A3, 0x38AF,
+    0x96A4, 0x96A4, 0x2AB6, 0x96A5, 0x96A5, 0x42EF, 0x96A7, 0x96A8, 0x1386,
+    0x96A9, 0x96A9, 0x2CF2, 0x96AA, 0x96AA, 0x1388, 0x96AC, 0x96AC, 0x2EB0,
+    0x96AE, 0x96AE, 0x2EAE, 0x96B0, 0x96B0, 0x2EAF, 0x96B1, 0x96B1, 0x14AF,
+    0x96B3, 0x96B3, 0x3020, 0x96B4, 0x96B4, 0x15EC, 0x96B6, 0x96B6, 0x0231,
+    0x96B8, 0x96B8, 0x14B0, 0x96B9, 0x96B9, 0x069F, 0x96BB, 0x96BB, 0x09F3,
+    0x96BC, 0x96BC, 0x1E31, 0x96BD, 0x96BD, 0x38B5, 0x96BF, 0x96BF, 0x20A9,
+    0x96C0, 0x96C0, 0x0BDA, 0x96C1, 0x96C1, 0x0DA8, 0x96C2, 0x96C2, 0x2354,
+    0x96C3, 0x96C3, 0x2356, 0x96C4, 0x96C4, 0x0DAA, 0x96C5, 0x96C5, 0x0DA9,
+    0x96C6, 0x96C7, 0x0DAB, 0x96C8, 0x96C8, 0x2355, 0x96C9, 0x96CA, 0x0F62,
+    0x96CB, 0x96CB, 0x0F61, 0x96CC, 0x96CC, 0x10E8, 0x96CD, 0x96CD, 0x0F60,
+    0x96CE, 0x96CE, 0x25F8, 0x96D2, 0x96D2, 0x10E9, 0x96D3, 0x96D3, 0x2AB8,
+    0x96D4, 0x96D4, 0x2CF3, 0x96D5, 0x96D5, 0x1389, 0x96D6, 0x96D6, 0x14B1,
+    0x96D7, 0x96D7, 0x3021, 0x96D8, 0x96D8, 0x3025, 0x96D9, 0x96D9, 0x1550,
+    0x96DA, 0x96DA, 0x3022, 0x96DB, 0x96DB, 0x1551, 0x96DC, 0x96DC, 0x154F,
+    0x96DD, 0x96DD, 0x3026, 0x96DE, 0x96DE, 0x1552, 0x96DF, 0x96DF, 0x3024,
+    0x96E1, 0x96E1, 0x3165, 0x96E2, 0x96E2, 0x154E, 0x96E3, 0x96E3, 0x15ED,
+    0x96E5, 0x96E5, 0x34A8, 0x96E8, 0x96E8, 0x06A0, 0x96E9, 0x96E9, 0x0BDC,
+    0x96EA, 0x96EA, 0x0BDB, 0x96EF, 0x96EF, 0x0DAD, 0x96F0, 0x96F0, 0x2358,
+    0x96F1, 0x96F1, 0x2357, 0x96F2, 0x96F2, 0x0DAE, 0x96F4, 0x96F4, 0x3A04,
+    0x96F5, 0x96F5, 0x25FC, 0x96F6, 0x96F6, 0x0F67, 0x96F7, 0x96F7, 0x0F64,
+    0x96F8, 0x96F8, 0x25FB, 0x96F9, 0x96F9, 0x0F66, 0x96FA, 0x96FA, 0x25F9,
+    0x96FB, 0x96FB, 0x0F65, 0x96FD, 0x96FD, 0x25FA, 0x96FF, 0x96FF, 0x2854,
+    0x9700, 0x9700, 0x10EA, 0x9702, 0x9702, 0x2ABB, 0x9703, 0x9703, 0x3F0D,
+    0x9704, 0x9704, 0x1262, 0x9705, 0x9705, 0x2AB9, 0x9706, 0x9707, 0x1263,
+    0x9708, 0x9708, 0x2ABA, 0x9709, 0x9709, 0x1265, 0x970B, 0x970B, 0x2CF4,
+    0x970D, 0x970D, 0x138D, 0x970E, 0x970E, 0x138A, 0x970F, 0x970F, 0x138F,
+    0x9710, 0x9710, 0x2CF6, 0x9711, 0x9711, 0x138B, 0x9712, 0x9712, 0x2CF5,
+    0x9713, 0x9713, 0x138E, 0x9716, 0x9716, 0x138C, 0x9718, 0x9718, 0x2EB3,
+    0x9719, 0x9719, 0x2EB5, 0x971B, 0x971B, 0x38C9, 0x971C, 0x971C, 0x14B2,
+    0x971D, 0x971D, 0x2EB4, 0x971E, 0x971E, 0x14B3, 0x971F, 0x971F, 0x2EB2,
+    0x9720, 0x9720, 0x2EB1, 0x9721, 0x9721, 0x3FB3, 0x9722, 0x9722, 0x3028,
+    0x9723, 0x9723, 0x3027, 0x9724, 0x9724, 0x1553, 0x9725, 0x9725, 0x3029,
+    0x9726, 0x9726, 0x316A, 0x9727, 0x9727, 0x15EF, 0x9728, 0x9728, 0x3169,
+    0x9729, 0x9729, 0x3166, 0x972A, 0x972A, 0x15EE, 0x972B, 0x972C, 0x3167,
+    0x972E, 0x972F, 0x326F, 0x9730, 0x9730, 0x1656, 0x9731, 0x9731, 0x38C0,
+    0x9732, 0x9732, 0x16A3, 0x9735, 0x9735, 0x3331, 0x9736, 0x9736, 0x38C2,
+    0x9738, 0x9739, 0x16A1, 0x973A, 0x973A, 0x3332, 0x973D, 0x973E, 0x16E2,
+    0x973F, 0x973F, 0x33D1, 0x9740, 0x9740, 0x47B3, 0x9741, 0x9741, 0x3BE9,
+    0x9742, 0x9742, 0x1732, 0x9743, 0x9743, 0x34AA, 0x9744, 0x9744, 0x1734,
+    0x9746, 0x9746, 0x34A9, 0x9747, 0x9747, 0x34AB, 0x9748, 0x9748, 0x1733,
+    0x9749, 0x9749, 0x34F1, 0x974B, 0x974B, 0x3526, 0x9751, 0x9751, 0x44E3,
+    0x9752, 0x9752, 0x06A1, 0x9756, 0x9756, 0x0F68, 0x9757, 0x9757, 0x38CC,
+    0x9758, 0x9758, 0x2855, 0x975A, 0x975A, 0x2ABC, 0x975B, 0x975C, 0x1390,
+    0x975D, 0x975D, 0x3BEF, 0x975E, 0x975E, 0x06A2, 0x975F, 0x975F, 0x38CF,
+    0x9760, 0x9760, 0x1266, 0x9761, 0x9761, 0x15F0, 0x9762, 0x9762, 0x0826,
+    0x9766, 0x9766, 0x1392, 0x9768, 0x9768, 0x1710, 0x9769, 0x9769, 0x0827,
+    0x976A, 0x976A, 0x20AA, 0x976C, 0x976C, 0x2359, 0x976D, 0x976D, 0x3E97,
+    0x976E, 0x976E, 0x235B, 0x9770, 0x9770, 0x235A, 0x9771, 0x9771, 0x3BFC,
+    0x9772, 0x9772, 0x2600, 0x9773, 0x9773, 0x25FD, 0x9774, 0x9774, 0x0F69,
+    0x9776, 0x9776, 0x0F6A, 0x9777, 0x9778, 0x25FE, 0x977A, 0x977A, 0x2857,
+    0x977B, 0x977B, 0x285C, 0x977C, 0x977C, 0x10EB, 0x977D, 0x977D, 0x2856,
+    0x977E, 0x977E, 0x2858, 0x977F, 0x977F, 0x285F, 0x9780, 0x9780, 0x285A,
+    0x9781, 0x9781, 0x285E, 0x9782, 0x9782, 0x285B, 0x9783, 0x9783, 0x2859,
+    0x9784, 0x9784, 0x285D, 0x9785, 0x9785, 0x10EC, 0x9787, 0x9787, 0x40C0,
+    0x9788, 0x9788, 0x2ABF, 0x9789, 0x9789, 0x38D4, 0x978A, 0x978A, 0x2ABD,
+    0x978B, 0x978B, 0x1268, 0x978D, 0x978D, 0x1267, 0x978E, 0x978E, 0x2ABE,
+    0x978F, 0x978F, 0x1269, 0x9794, 0x9794, 0x2CF9, 0x9797, 0x9797, 0x2CF8,
+    0x9798, 0x9798, 0x1393, 0x9799, 0x9799, 0x2CF7, 0x979A, 0x979A, 0x2EB6,
+    0x979B, 0x979B, 0x3BFB, 0x979C, 0x979C, 0x2EB8, 0x979D, 0x979D, 0x2EBA,
+    0x979E, 0x979E, 0x2EB9, 0x979F, 0x979F, 0x38D5, 0x97A0, 0x97A0, 0x14B4,
+    0x97A1, 0x97A1, 0x2EB7, 0x97A2, 0x97A2, 0x3030, 0x97A3, 0x97A3, 0x1554,
+    0x97A4, 0x97A4, 0x302E, 0x97A5, 0x97A5, 0x3031, 0x97A6, 0x97A6, 0x1555,
+    0x97A8, 0x97A8, 0x302C, 0x97AA, 0x97AA, 0x302F, 0x97AB, 0x97AB, 0x302D,
+    0x97AC, 0x97AC, 0x302A, 0x97AD, 0x97AD, 0x1556, 0x97AE, 0x97AE, 0x302B,
+    0x97B1, 0x97B1, 0x38D6, 0x97B2, 0x97B2, 0x47B5, 0x97B3, 0x97B3, 0x316B,
+    0x97B4, 0x97B4, 0x3F33, 0x97B6, 0x97B6, 0x316D, 0x97B7, 0x97B7, 0x316C,
+    0x97B8, 0x97B8, 0x3D95, 0x97B9, 0x97B9, 0x3271, 0x97BA, 0x97BA, 0x3F35,
+    0x97BB, 0x97BB, 0x3272, 0x97BD, 0x97BD, 0x494E, 0x97BE, 0x97BE, 0x38D7,
+    0x97BF, 0x97BF, 0x3333, 0x97C0, 0x97C0, 0x38D8, 0x97C1, 0x97C1, 0x16E5,
+    0x97C2, 0x97C2, 0x47B6, 0x97C3, 0x97C3, 0x16E4, 0x97C4, 0x97C5, 0x344C,
+    0x97C6, 0x97C6, 0x1735, 0x97C7, 0x97C7, 0x34AC, 0x97C8, 0x97C8, 0x3F2F,
+    0x97C9, 0x97C9, 0x1756, 0x97CB, 0x97CB, 0x0828, 0x97CC, 0x97CC, 0x0DAF,
+    0x97CD, 0x97CD, 0x2861, 0x97CE, 0x97CE, 0x2860, 0x97CF, 0x97CF, 0x2AC1,
+    0x97D0, 0x97D0, 0x2AC0, 0x97D2, 0x97D2, 0x38D9, 0x97D3, 0x97D3, 0x14B5,
+    0x97D4, 0x97D4, 0x2EBC, 0x97D5, 0x97D5, 0x2EBB, 0x97D6, 0x97D6, 0x3034,
+    0x97D7, 0x97D7, 0x3032, 0x97D8, 0x97D8, 0x3035, 0x97D9, 0x97D9, 0x3033,
+    0x97DC, 0x97DC, 0x15F1, 0x97DD, 0x97DF, 0x316E, 0x97E0, 0x97E0, 0x38DA,
+    0x97E1, 0x97E1, 0x3334, 0x97E3, 0x97E3, 0x33D2, 0x97E5, 0x97E5, 0x34AD,
+    0x97E6, 0x97E6, 0x450C, 0x97ED, 0x97ED, 0x0829, 0x97EE, 0x97EE, 0x38DC,
+    0x97F0, 0x97F0, 0x2CFA, 0x97F1, 0x97F1, 0x2EBD, 0x97F2, 0x97F2, 0x394D,
+    0x97F3, 0x97F3, 0x082A, 0x97F5, 0x97F5, 0x38E0, 0x97F6, 0x97F6, 0x10ED,
+    0x97F8, 0x97F8, 0x2CFB, 0x97F9, 0x97F9, 0x1557, 0x97FA, 0x97FA, 0x3036,
+    0x97FB, 0x97FB, 0x15F2, 0x97FD, 0x97FE, 0x3273, 0x97FF, 0x97FF, 0x16A4,
+    0x9800, 0x9800, 0x344E, 0x9801, 0x9801, 0x082B, 0x9802, 0x9803, 0x0BDF,
+    0x9804, 0x9804, 0x20AB, 0x9805, 0x9806, 0x0DB0, 0x9807, 0x9807, 0x235C,
+    0x9808, 0x9808, 0x0DB2, 0x980A, 0x980A, 0x0F6E, 0x980C, 0x980C, 0x0F70,
+    0x980D, 0x980E, 0x2602, 0x980F, 0x980F, 0x2601, 0x9810, 0x9811, 0x0F6B,
+    0x9812, 0x9812, 0x0F6F, 0x9813, 0x9813, 0x0F6D, 0x9814, 0x9814, 0x4952,
+    0x9815, 0x9815, 0x433C, 0x9816, 0x9816, 0x2862, 0x9817, 0x9818, 0x10EE,
+    0x981B, 0x981B, 0x2AC8, 0x981C, 0x981C, 0x126C, 0x981D, 0x981D, 0x2AC3,
+    0x981E, 0x981E, 0x2AC2, 0x981F, 0x981F, 0x3C02, 0x9820, 0x9820, 0x2AC7,
+    0x9821, 0x9821, 0x126A, 0x9823, 0x9823, 0x3E37, 0x9824, 0x9824, 0x139A,
+    0x9826, 0x9826, 0x2AC4, 0x9827, 0x9827, 0x2AC9, 0x9828, 0x9828, 0x2AC6,
+    0x9829, 0x9829, 0x2AC5, 0x982B, 0x982B, 0x126B, 0x982D, 0x982D, 0x1398,
+    0x982E, 0x982E, 0x3F72, 0x982F, 0x982F, 0x2CFD, 0x9830, 0x9830, 0x1394,
+    0x9832, 0x9832, 0x2CFE, 0x9833, 0x9833, 0x38E5, 0x9834, 0x9834, 0x38E4,
+    0x9835, 0x9835, 0x2CFC, 0x9837, 0x9837, 0x1397, 0x9838, 0x9838, 0x1395,
+    0x9839, 0x9839, 0x1399, 0x983B, 0x983B, 0x1396, 0x9841, 0x9841, 0x2EBE,
+    0x9843, 0x9843, 0x2EC3, 0x9844, 0x9844, 0x2EBF, 0x9845, 0x9845, 0x2EC2,
+    0x9846, 0x9846, 0x14B6, 0x9847, 0x9847, 0x3D96, 0x9848, 0x9848, 0x2DF2,
+    0x9849, 0x9849, 0x2EC1, 0x984A, 0x984A, 0x2EC0, 0x984B, 0x984B, 0x38E6,
+    0x984C, 0x984C, 0x155A, 0x984D, 0x984D, 0x1558, 0x984E, 0x984E, 0x155B,
+    0x984F, 0x984F, 0x1559, 0x9850, 0x9852, 0x3037, 0x9853, 0x9853, 0x155C,
+    0x9857, 0x9857, 0x3174, 0x9858, 0x9858, 0x15F4, 0x9859, 0x9859, 0x3172,
+    0x985B, 0x985B, 0x15F5, 0x985C, 0x985C, 0x3171, 0x985D, 0x985D, 0x3173,
+    0x985E, 0x985E, 0x15F3, 0x985F, 0x985F, 0x3278, 0x9860, 0x9860, 0x3275,
+    0x9862, 0x9863, 0x3276, 0x9864, 0x9864, 0x3335, 0x9865, 0x9865, 0x16A6,
+    0x9866, 0x9866, 0x38E7, 0x9867, 0x9867, 0x16A5, 0x9869, 0x9869, 0x33D4,
+    0x986A, 0x986A, 0x33D3, 0x986B, 0x986B, 0x16E6, 0x986C, 0x986C, 0x4035,
+    0x986F, 0x986F, 0x1711, 0x9870, 0x9870, 0x1736, 0x9871, 0x9871, 0x174D,
+    0x9872, 0x9872, 0x34F2, 0x9873, 0x9874, 0x3527, 0x9875, 0x9875, 0x450D,
+    0x98A8, 0x98A8, 0x082C, 0x98A9, 0x98A9, 0x235D, 0x98AC, 0x98AC, 0x2604,
+    0x98AD, 0x98AE, 0x2863, 0x98AF, 0x98AF, 0x10F0, 0x98B1, 0x98B1, 0x10F1,
+    0x98B2, 0x98B2, 0x2ACA, 0x98B3, 0x98B3, 0x126D, 0x98B4, 0x98B4, 0x3F73,
+    0x98B6, 0x98B6, 0x14B7, 0x98B7, 0x98B7, 0x38EF, 0x98B8, 0x98B8, 0x303A,
+    0x98B9, 0x98B9, 0x47B8, 0x98BA, 0x98BA, 0x155D, 0x98BB, 0x98BB, 0x3177,
+    0x98BC, 0x98BC, 0x15F6, 0x98BD, 0x98BD, 0x3176, 0x98BE, 0x98BE, 0x3178,
+    0x98BF, 0x98BF, 0x3175, 0x98C0, 0x98C0, 0x3338, 0x98C1, 0x98C2, 0x3279,
+    0x98C3, 0x98C3, 0x3B78, 0x98C4, 0x98C4, 0x1657, 0x98C6, 0x98C6, 0x3337,
+    0x98C7, 0x98C7, 0x38F1, 0x98C8, 0x98C8, 0x38F0, 0x98C9, 0x98C9, 0x3336,
+    0x98CA, 0x98CA, 0x38EE, 0x98CB, 0x98CB, 0x33D5, 0x98CC, 0x98CC, 0x3529,
+    0x98CE, 0x98CE, 0x450E, 0x98DB, 0x98DB, 0x082D, 0x98DC, 0x98DC, 0x3C0B,
+    0x98DE, 0x98DE, 0x450F, 0x98DF, 0x98DF, 0x082E, 0x98E0, 0x98E0, 0x4792,
+    0x98E1, 0x98E1, 0x38F6, 0x98E2, 0x98E2, 0x09F4, 0x98E3, 0x98E3, 0x1E32,
+    0x98E5, 0x98E5, 0x20AC, 0x98E6, 0x98E6, 0x38F7, 0x98E7, 0x98E7, 0x0DB3,
+    0x98E9, 0x98E9, 0x0DB6, 0x98EA, 0x98EA, 0x0DB4, 0x98EB, 0x98EB, 0x235E,
+    0x98EC, 0x98EC, 0x38F8, 0x98ED, 0x98ED, 0x0DB8, 0x98EF, 0x98EF, 0x0DB5,
+    0x98F1, 0x98F1, 0x47BA, 0x98F2, 0x98F2, 0x0DB7, 0x98F4, 0x98F4, 0x0F72,
+    0x98F5, 0x98F5, 0x4365, 0x98F6, 0x98F6, 0x2605, 0x98F9, 0x98F9, 0x2606,
+    0x98FA, 0x98FA, 0x2ACC, 0x98FC, 0x98FC, 0x0F71, 0x98FD, 0x98FE, 0x0F73,
+    0x9900, 0x9900, 0x2866, 0x9902, 0x9902, 0x2865, 0x9903, 0x9903, 0x10F2,
+    0x9905, 0x9905, 0x10F3, 0x9907, 0x9907, 0x2867, 0x9908, 0x9908, 0x2ACB,
+    0x9909, 0x9909, 0x10F5, 0x990A, 0x990A, 0x126E, 0x990C, 0x990C, 0x10F4,
+    0x990E, 0x990E, 0x43ED, 0x9910, 0x9910, 0x139B, 0x9911, 0x9911, 0x2ACD,
+    0x9912, 0x9912, 0x1270, 0x9913, 0x9913, 0x126F, 0x9914, 0x9914, 0x2ACE,
+    0x9915, 0x9915, 0x2AD1, 0x9916, 0x9917, 0x2ACF, 0x9918, 0x9918, 0x1271,
+    0x9919, 0x9919, 0x47BC, 0x991A, 0x991A, 0x13A0, 0x991B, 0x991B, 0x139E,
+    0x991C, 0x991C, 0x43EE, 0x991E, 0x991E, 0x139D, 0x991F, 0x991F, 0x2D00,
+    0x9921, 0x9921, 0x139F, 0x9924, 0x9924, 0x2CFF, 0x9925, 0x9925, 0x2EC4,
+    0x9927, 0x9927, 0x2D01, 0x9928, 0x9928, 0x139C, 0x9929, 0x9929, 0x2D02,
+    0x992A, 0x992A, 0x2EC7, 0x992B, 0x992C, 0x2EC5, 0x992D, 0x992D, 0x2ECB,
+    0x992E, 0x992E, 0x1561, 0x992F, 0x992F, 0x2ECA, 0x9930, 0x9930, 0x2ECD,
+    0x9931, 0x9931, 0x2ECC, 0x9932, 0x9932, 0x2EC9, 0x9933, 0x9933, 0x2EC8,
+    0x9935, 0x9935, 0x14B8, 0x9937, 0x9937, 0x47BD, 0x9938, 0x9938, 0x3BFD,
+    0x9939, 0x9939, 0x38FA, 0x993A, 0x993A, 0x303D, 0x993B, 0x993B, 0x3C11,
+    0x993C, 0x993C, 0x303C, 0x993D, 0x993D, 0x1560, 0x993E, 0x993F, 0x155E,
+    0x9940, 0x9940, 0x3F34, 0x9941, 0x9941, 0x303B, 0x9942, 0x9942, 0x43FF,
+    0x9943, 0x9943, 0x317B, 0x9945, 0x9945, 0x15F7, 0x9947, 0x9947, 0x317A,
+    0x9948, 0x9948, 0x3179, 0x9949, 0x9949, 0x15F8, 0x994A, 0x994A, 0x3FB9,
+    0x994B, 0x994B, 0x327F, 0x994C, 0x994C, 0x327E, 0x994D, 0x994D, 0x3C12,
+    0x994E, 0x994E, 0x327C, 0x9950, 0x9950, 0x327B, 0x9951, 0x9951, 0x1659,
+    0x9952, 0x9952, 0x1658, 0x9953, 0x9953, 0x3280, 0x9954, 0x9954, 0x33D6,
+    0x9955, 0x9955, 0x16E7, 0x9956, 0x9956, 0x333A, 0x9957, 0x9957, 0x16A7,
+    0x9958, 0x9958, 0x3339, 0x9959, 0x9959, 0x327D, 0x995B, 0x995B, 0x33D7,
+    0x995C, 0x995C, 0x1712, 0x995D, 0x995D, 0x47BE, 0x995E, 0x995E, 0x174E,
+    0x995F, 0x995F, 0x34F3, 0x9961, 0x9961, 0x352A, 0x9962, 0x9962, 0x43EF,
+    0x9963, 0x9963, 0x4510, 0x9996, 0x9996, 0x082F, 0x9997, 0x9997, 0x20AD,
+    0x9998, 0x9998, 0x2ECE, 0x9999, 0x9999, 0x0830, 0x999B, 0x999B, 0x3C15,
+    0x999C, 0x999C, 0x2869, 0x999D, 0x999D, 0x2868, 0x999E, 0x999E, 0x2D03,
+    0x99A1, 0x99A1, 0x2ED0, 0x99A3, 0x99A3, 0x2ECF, 0x99A4, 0x99A4, 0x41C3,
+    0x99A5, 0x99A5, 0x1562, 0x99A6, 0x99A7, 0x317C, 0x99A8, 0x99A8, 0x165A,
+    0x99AA, 0x99AA, 0x3C17, 0x99AB, 0x99AB, 0x352B, 0x99AC, 0x99AC, 0x09F5,
+    0x99AD, 0x99AD, 0x0DBA, 0x99AE, 0x99AE, 0x0DB9, 0x99AF, 0x99AF, 0x2607,
+    0x99B0, 0x99B0, 0x2609, 0x99B1, 0x99B1, 0x0F76, 0x99B2, 0x99B2, 0x2608,
+    0x99B3, 0x99B3, 0x0F75, 0x99B4, 0x99B4, 0x0F77, 0x99B5, 0x99B5, 0x260A,
+    0x99B8, 0x99B8, 0x394B, 0x99B9, 0x99B9, 0x286B, 0x99BA, 0x99BA, 0x286D,
+    0x99BB, 0x99BB, 0x286C, 0x99BC, 0x99BC, 0x3C22, 0x99BD, 0x99BD, 0x286F,
+    0x99C1, 0x99C1, 0x10F6, 0x99C2, 0x99C2, 0x286E, 0x99C3, 0x99C3, 0x286A,
+    0x99C4, 0x99C4, 0x3D77, 0x99C5, 0x99C5, 0x47C1, 0x99C7, 0x99C7, 0x2870,
+    0x99C9, 0x99C9, 0x2AD8, 0x99CB, 0x99CB, 0x2ADB, 0x99CC, 0x99CC, 0x2ADD,
+    0x99CD, 0x99CD, 0x2AD3, 0x99CE, 0x99CE, 0x2AD7, 0x99CF, 0x99CF, 0x2AD4,
+    0x99D0, 0x99D0, 0x1273, 0x99D1, 0x99D1, 0x1276, 0x99D2, 0x99D2, 0x1278,
+    0x99D3, 0x99D4, 0x2AD5, 0x99D5, 0x99D5, 0x1277, 0x99D6, 0x99D6, 0x2AD9,
+    0x99D7, 0x99D7, 0x2ADC, 0x99D8, 0x99D8, 0x2ADA, 0x99D9, 0x99D9, 0x1279,
+    0x99DA, 0x99DA, 0x3F42, 0x99DB, 0x99DB, 0x1275, 0x99DC, 0x99DC, 0x2AD2,
+    0x99DD, 0x99DD, 0x1272, 0x99DF, 0x99DF, 0x1274, 0x99E1, 0x99E1, 0x3785,
+    0x99E2, 0x99E2, 0x13A2, 0x99E3, 0x99E3, 0x2D09, 0x99E4, 0x99E4, 0x2D07,
+    0x99E5, 0x99E5, 0x2D06, 0x99E6, 0x99E6, 0x3B65, 0x99E7, 0x99E7, 0x2D0C,
+    0x99E9, 0x99E9, 0x2D0B, 0x99EA, 0x99EA, 0x2D0A, 0x99EC, 0x99EC, 0x2D05,
+    0x99ED, 0x99ED, 0x13A1, 0x99EE, 0x99EE, 0x2D04, 0x99F0, 0x99F0, 0x2D08,
+    0x99F1, 0x99F1, 0x13A3, 0x99F4, 0x99F4, 0x2ED3, 0x99F5, 0x99F5, 0x38FF,
+    0x99F6, 0x99F6, 0x2ED7, 0x99F7, 0x99F7, 0x2ED4, 0x99F8, 0x99F8, 0x2ED6,
+    0x99F9, 0x99F9, 0x2ED5, 0x99FA, 0x99FA, 0x2ED2, 0x99FB, 0x99FB, 0x2ED8,
+    0x99FC, 0x99FC, 0x2EDB, 0x99FD, 0x99FE, 0x2ED9, 0x99FF, 0x99FF, 0x14BA,
+    0x9A01, 0x9A01, 0x14B9, 0x9A02, 0x9A02, 0x2ED1, 0x9A03, 0x9A03, 0x2EDC,
+    0x9A04, 0x9A04, 0x3042, 0x9A05, 0x9A05, 0x3045, 0x9A06, 0x9A06, 0x3047,
+    0x9A07, 0x9A07, 0x3046, 0x9A09, 0x9A09, 0x3040, 0x9A0A, 0x9A0A, 0x3044,
+    0x9A0B, 0x9A0B, 0x303F, 0x9A0C, 0x9A0C, 0x3900, 0x9A0D, 0x9A0D, 0x3041,
+    0x9A0E, 0x9A0E, 0x1563, 0x9A0F, 0x9A0F, 0x303E, 0x9A10, 0x9A10, 0x3902,
+    0x9A11, 0x9A11, 0x3043, 0x9A14, 0x9A14, 0x318A, 0x9A15, 0x9A15, 0x317F,
+    0x9A16, 0x9A16, 0x15F9, 0x9A19, 0x9A19, 0x15FA, 0x9A1A, 0x9A1A, 0x317E,
+    0x9A1B, 0x9A1B, 0x3183, 0x9A1C, 0x9A1C, 0x3189, 0x9A1D, 0x9A1D, 0x3181,
+    0x9A1E, 0x9A1E, 0x3188, 0x9A1F, 0x9A1F, 0x3B6C, 0x9A20, 0x9A20, 0x3185,
+    0x9A21, 0x9A21, 0x3C1C, 0x9A22, 0x9A22, 0x3184, 0x9A23, 0x9A23, 0x3187,
+    0x9A24, 0x9A24, 0x3182, 0x9A25, 0x9A25, 0x3180, 0x9A26, 0x9A26, 0x3DF2,
+    0x9A27, 0x9A27, 0x3186, 0x9A29, 0x9A29, 0x3287, 0x9A2A, 0x9A2A, 0x3285,
+    0x9A2B, 0x9A2B, 0x165B, 0x9A2C, 0x9A2C, 0x3284, 0x9A2D, 0x9A2D, 0x328A,
+    0x9A2E, 0x9A2E, 0x3288, 0x9A2F, 0x9A2F, 0x3C1E, 0x9A30, 0x9A30, 0x165C,
+    0x9A31, 0x9A31, 0x3283, 0x9A32, 0x9A32, 0x3281, 0x9A34, 0x9A34, 0x3282,
+    0x9A35, 0x9A35, 0x165E, 0x9A36, 0x9A36, 0x3286, 0x9A37, 0x9A37, 0x165D,
+    0x9A38, 0x9A38, 0x3289, 0x9A39, 0x9A39, 0x333B, 0x9A3A, 0x9A3A, 0x3341,
+    0x9A3B, 0x9A3B, 0x3901, 0x9A3C, 0x9A3C, 0x47C3, 0x9A3D, 0x9A3D, 0x333C,
+    0x9A3E, 0x9A3E, 0x16AB, 0x9A3F, 0x9A3F, 0x3342, 0x9A40, 0x9A40, 0x16AA,
+    0x9A41, 0x9A41, 0x3340, 0x9A42, 0x9A42, 0x333F, 0x9A43, 0x9A43, 0x16A9,
+    0x9A44, 0x9A44, 0x333E, 0x9A45, 0x9A45, 0x16A8, 0x9A46, 0x9A46, 0x333D,
+    0x9A48, 0x9A48, 0x33DD, 0x9A49, 0x9A49, 0x33DF, 0x9A4A, 0x9A4A, 0x33DE,
+    0x9A4C, 0x9A4C, 0x33DB, 0x9A4D, 0x9A4D, 0x16E9, 0x9A4E, 0x9A4E, 0x33D8,
+    0x9A4F, 0x9A4F, 0x33DC, 0x9A50, 0x9A50, 0x33E1, 0x9A52, 0x9A52, 0x33E0,
+    0x9A53, 0x9A54, 0x33D9, 0x9A55, 0x9A55, 0x16E8, 0x9A56, 0x9A56, 0x344F,
+    0x9A57, 0x9A57, 0x1715, 0x9A58, 0x9A58, 0x3903, 0x9A59, 0x9A59, 0x3450,
+    0x9A5A, 0x9A5B, 0x1713, 0x9A5C, 0x9A5C, 0x3C18, 0x9A5E, 0x9A5E, 0x34AE,
+    0x9A5F, 0x9A5F, 0x1737, 0x9A60, 0x9A60, 0x3510, 0x9A62, 0x9A62, 0x1757,
+    0x9A63, 0x9A63, 0x3B67, 0x9A64, 0x9A64, 0x352C, 0x9A65, 0x9A65, 0x1758,
+    0x9A66, 0x9A67, 0x352D, 0x9A68, 0x9A68, 0x353C, 0x9A69, 0x9A69, 0x353B,
+    0x9A6A, 0x9A6A, 0x1767, 0x9A6B, 0x9A6B, 0x3544, 0x9A6C, 0x9A6C, 0x4585,
+    0x9A8F, 0x9A8F, 0x4586, 0x9AA8, 0x9AA8, 0x09F6, 0x9AAB, 0x9AAB, 0x260C,
+    0x9AAD, 0x9AAD, 0x260B, 0x9AAF, 0x9AB0, 0x10F7, 0x9AB1, 0x9AB1, 0x2871,
+    0x9AB2, 0x9AB2, 0x4332, 0x9AB3, 0x9AB3, 0x2ADE, 0x9AB4, 0x9AB4, 0x2D0F,
+    0x9AB6, 0x9AB6, 0x43F0, 0x9AB7, 0x9AB7, 0x127A, 0x9AB8, 0x9AB8, 0x13A4,
+    0x9AB9, 0x9AB9, 0x2D0D, 0x9ABA, 0x9ABA, 0x3F74, 0x9ABB, 0x9ABB, 0x2D10,
+    0x9ABC, 0x9ABC, 0x13A5, 0x9ABD, 0x9ABD, 0x3D97, 0x9ABE, 0x9ABE, 0x2EDD,
+    0x9ABF, 0x9ABF, 0x2D0E, 0x9AC0, 0x9AC0, 0x3048, 0x9AC1, 0x9AC1, 0x1564,
+    0x9AC2, 0x9AC2, 0x318B, 0x9AC6, 0x9AC6, 0x328D, 0x9AC7, 0x9AC7, 0x328B,
+    0x9ACA, 0x9ACA, 0x328C, 0x9ACD, 0x9ACD, 0x3343, 0x9ACF, 0x9ACF, 0x16AC,
+    0x9AD0, 0x9AD0, 0x33E2, 0x9AD1, 0x9AD1, 0x1718, 0x9AD2, 0x9AD2, 0x16EA,
+    0x9AD3, 0x9AD4, 0x1716, 0x9AD5, 0x9AD5, 0x34AF, 0x9AD6, 0x9AD6, 0x174F,
+    0x9AD7, 0x9AD7, 0x3FAA, 0x9AD8, 0x9AD8, 0x09F7, 0x9ADC, 0x9ADC, 0x3049,
+    0x9ADF, 0x9ADF, 0x1E33, 0x9AE0, 0x9AE0, 0x3908, 0x9AE1, 0x9AE1, 0x0F78,
+    0x9AE2, 0x9AE2, 0x3909, 0x9AE3, 0x9AE3, 0x2872, 0x9AE6, 0x9AE6, 0x10F9,
+    0x9AE7, 0x9AE7, 0x2873, 0x9AEB, 0x9AEB, 0x2AE0, 0x9AEC, 0x9AEC, 0x2ADF,
+    0x9AED, 0x9AED, 0x13A7, 0x9AEE, 0x9AEF, 0x127B, 0x9AF1, 0x9AF1, 0x2AE3,
+    0x9AF2, 0x9AF2, 0x2AE2, 0x9AF3, 0x9AF3, 0x2AE1, 0x9AF4, 0x9AF4, 0x390B,
+    0x9AF6, 0x9AF6, 0x2D11, 0x9AF7, 0x9AF7, 0x2D14, 0x9AF9, 0x9AF9, 0x2D13,
+    0x9AFA, 0x9AFA, 0x2D12, 0x9AFB, 0x9AFB, 0x13A6, 0x9AFC, 0x9AFC, 0x2EE1,
+    0x9AFD, 0x9AFD, 0x2EDF, 0x9AFE, 0x9AFE, 0x2EDE, 0x9AFF, 0x9AFF, 0x3F17,
+    0x9B01, 0x9B01, 0x2EE0, 0x9B02, 0x9B02, 0x3F12, 0x9B03, 0x9B03, 0x1565,
+    0x9B04, 0x9B05, 0x304B, 0x9B06, 0x9B06, 0x1566, 0x9B08, 0x9B08, 0x304A,
+    0x9B09, 0x9B09, 0x3F20, 0x9B0A, 0x9B0A, 0x318D, 0x9B0B, 0x9B0B, 0x318C,
+    0x9B0C, 0x9B0C, 0x318F, 0x9B0D, 0x9B0D, 0x15FB, 0x9B0E, 0x9B0E, 0x318E,
+    0x9B0F, 0x9B0F, 0x47C4, 0x9B10, 0x9B10, 0x328E, 0x9B11, 0x9B11, 0x3290,
+    0x9B12, 0x9B12, 0x328F, 0x9B14, 0x9B14, 0x390D, 0x9B15, 0x9B15, 0x3344,
+    0x9B16, 0x9B16, 0x3347, 0x9B17, 0x9B18, 0x3345, 0x9B19, 0x9B19, 0x33E3,
+    0x9B1A, 0x9B1A, 0x16EB, 0x9B1E, 0x9B20, 0x3451, 0x9B22, 0x9B22, 0x1738,
+    0x9B23, 0x9B23, 0x1750, 0x9B24, 0x9B24, 0x352F, 0x9B25, 0x9B25, 0x09F8,
+    0x9B27, 0x9B27, 0x127D, 0x9B28, 0x9B28, 0x13A8, 0x9B29, 0x9B29, 0x304D,
+    0x9B2A, 0x9B2A, 0x3F19, 0x9B2B, 0x9B2B, 0x33E4, 0x9B2D, 0x9B2D, 0x390E,
+    0x9B2E, 0x9B2E, 0x3511, 0x9B2F, 0x9B2F, 0x1E34, 0x9B31, 0x9B31, 0x1768,
+    0x9B32, 0x9B32, 0x09F9, 0x9B33, 0x9B33, 0x2D15, 0x9B34, 0x9B34, 0x3911,
+    0x9B35, 0x9B35, 0x304E, 0x9B37, 0x9B37, 0x3190, 0x9B39, 0x9B39, 0x3F00,
+    0x9B3A, 0x9B3A, 0x3348, 0x9B3B, 0x9B3B, 0x33E5, 0x9B3C, 0x9B3C, 0x09FA,
+    0x9B3E, 0x9B3F, 0x2874, 0x9B40, 0x9B40, 0x3915, 0x9B41, 0x9B42, 0x10FA,
+    0x9B43, 0x9B43, 0x2AE5, 0x9B44, 0x9B44, 0x127F, 0x9B45, 0x9B45, 0x127E,
+    0x9B46, 0x9B46, 0x2AE4, 0x9B48, 0x9B48, 0x2EE2, 0x9B4A, 0x9B4A, 0x304F,
+    0x9B4B, 0x9B4B, 0x3051, 0x9B4C, 0x9B4C, 0x3050, 0x9B4D, 0x9B4D, 0x1569,
+    0x9B4E, 0x9B4E, 0x1568, 0x9B4F, 0x9B4F, 0x1567, 0x9B50, 0x9B50, 0x3914,
+    0x9B51, 0x9B51, 0x16AE, 0x9B52, 0x9B52, 0x3349, 0x9B54, 0x9B54, 0x16AD,
+    0x9B55, 0x9B55, 0x33E7, 0x9B56, 0x9B56, 0x33E6, 0x9B58, 0x9B58, 0x1739,
+    0x9B59, 0x9B59, 0x34B0, 0x9B5A, 0x9B5A, 0x0BE1, 0x9B5B, 0x9B5B, 0x260D,
+    0x9B5F, 0x9B5F, 0x2878, 0x9B60, 0x9B61, 0x2876, 0x9B64, 0x9B64, 0x2AEE,
+    0x9B66, 0x9B66, 0x2AE9, 0x9B67, 0x9B67, 0x2AE6, 0x9B68, 0x9B68, 0x2AED,
+    0x9B69, 0x9B69, 0x47C5, 0x9B6C, 0x9B6C, 0x2AEF, 0x9B6F, 0x9B6F, 0x1281,
+    0x9B70, 0x9B70, 0x2AEC, 0x9B71, 0x9B71, 0x2AE8, 0x9B74, 0x9B74, 0x2AE7,
+    0x9B75, 0x9B75, 0x2AEB, 0x9B76, 0x9B76, 0x2AEA, 0x9B77, 0x9B77, 0x1280,
+    0x9B7A, 0x9B7A, 0x2D20, 0x9B7B, 0x9B7B, 0x2D1B, 0x9B7C, 0x9B7C, 0x2D19,
+    0x9B7D, 0x9B7D, 0x2D22, 0x9B7E, 0x9B7E, 0x2D1A, 0x9B7F, 0x9B7F, 0x3C3B,
+    0x9B80, 0x9B80, 0x2D16, 0x9B81, 0x9B81, 0x43F1, 0x9B82, 0x9B82, 0x2D1C,
+    0x9B83, 0x9B83, 0x4219, 0x9B85, 0x9B85, 0x2D17, 0x9B86, 0x9B86, 0x2EEB,
+    0x9B87, 0x9B87, 0x2D18, 0x9B88, 0x9B88, 0x2D23, 0x9B8B, 0x9B8B, 0x3EEE,
+    0x9B8D, 0x9B8D, 0x4623, 0x9B8E, 0x9B8E, 0x3919, 0x9B8F, 0x9B8F, 0x3FAD,
+    0x9B90, 0x9B90, 0x2D1F, 0x9B91, 0x9B91, 0x13A9, 0x9B92, 0x9B92, 0x2D1E,
+    0x9B93, 0x9B93, 0x2D1D, 0x9B95, 0x9B95, 0x2D21, 0x9B97, 0x9B97, 0x3F71,
+    0x9B9A, 0x9B9A, 0x2EE3, 0x9B9B, 0x9B9B, 0x2EE6, 0x9B9D, 0x9B9D, 0x3F56,
+    0x9B9E, 0x9B9E, 0x2EE5, 0x9B9F, 0x9B9F, 0x3C3E, 0x9BA0, 0x9BA0, 0x2EED,
+    0x9BA1, 0x9BA1, 0x2EE8, 0x9BA2, 0x9BA2, 0x2EEC, 0x9BA4, 0x9BA4, 0x2EEA,
+    0x9BA5, 0x9BA5, 0x2EE9, 0x9BA6, 0x9BA6, 0x2EE7, 0x9BA8, 0x9BA8, 0x2EE4,
+    0x9BAA, 0x9BAA, 0x14BD, 0x9BAB, 0x9BAB, 0x14BC, 0x9BAD, 0x9BAD, 0x14BE,
+    0x9BAE, 0x9BAE, 0x14BB, 0x9BAF, 0x9BAF, 0x2EEE, 0x9BB0, 0x9BB0, 0x3FB4,
+    0x9BB5, 0x9BB5, 0x3057, 0x9BB6, 0x9BB6, 0x305A, 0x9BB8, 0x9BB8, 0x3058,
+    0x9BB9, 0x9BB9, 0x305C, 0x9BBD, 0x9BBD, 0x305D, 0x9BBF, 0x9BBF, 0x3055,
+    0x9BC0, 0x9BC0, 0x156E, 0x9BC1, 0x9BC1, 0x3056, 0x9BC3, 0x9BC3, 0x3054,
+    0x9BC4, 0x9BC4, 0x305B, 0x9BC6, 0x9BC6, 0x3053, 0x9BC7, 0x9BC7, 0x3052,
+    0x9BC8, 0x9BC8, 0x156D, 0x9BC9, 0x9BC9, 0x156B, 0x9BCA, 0x9BCA, 0x156A,
+    0x9BCF, 0x9BCF, 0x3C3C, 0x9BD3, 0x9BD3, 0x3059, 0x9BD4, 0x9BD4, 0x3199,
+    0x9BD5, 0x9BD5, 0x319F, 0x9BD6, 0x9BD6, 0x15FE, 0x9BD7, 0x9BD7, 0x319A,
+    0x9BD9, 0x9BD9, 0x319D, 0x9BDA, 0x9BDA, 0x31A1, 0x9BDB, 0x9BDB, 0x15FF,
+    0x9BDC, 0x9BDC, 0x319C, 0x9BDD, 0x9BDD, 0x47C6, 0x9BDE, 0x9BDE, 0x3194,
+    0x9BE0, 0x9BE0, 0x3193, 0x9BE1, 0x9BE1, 0x31A0, 0x9BE2, 0x9BE2, 0x3197,
+    0x9BE4, 0x9BE4, 0x3195, 0x9BE5, 0x9BE5, 0x319E, 0x9BE6, 0x9BE6, 0x3196,
+    0x9BE7, 0x9BE7, 0x15FD, 0x9BE8, 0x9BE8, 0x15FC, 0x9BE9, 0x9BE9, 0x3BC1,
+    0x9BEA, 0x9BEB, 0x3191, 0x9BEC, 0x9BEC, 0x319B, 0x9BED, 0x9BED, 0x3ED7,
+    0x9BF0, 0x9BF0, 0x3198, 0x9BF1, 0x9BF1, 0x47C7, 0x9BF4, 0x9BF4, 0x47C8,
+    0x9BF7, 0x9BF7, 0x3293, 0x9BF8, 0x9BF8, 0x3296, 0x9BFD, 0x9BFD, 0x156C,
+    0x9BFF, 0x9BFF, 0x391B, 0x9C02, 0x9C02, 0x391A, 0x9C05, 0x9C05, 0x3294,
+    0x9C06, 0x9C06, 0x329A, 0x9C07, 0x9C07, 0x3298, 0x9C08, 0x9C08, 0x3292,
+    0x9C09, 0x9C09, 0x329D, 0x9C0A, 0x9C0A, 0x3F3A, 0x9C0B, 0x9C0B, 0x3291,
+    0x9C0C, 0x9C0C, 0x391C, 0x9C0D, 0x9C0D, 0x1660, 0x9C0E, 0x9C0E, 0x3299,
+    0x9C10, 0x9C10, 0x3C3A, 0x9C12, 0x9C12, 0x3295, 0x9C13, 0x9C13, 0x165F,
+    0x9C14, 0x9C14, 0x329C, 0x9C15, 0x9C15, 0x3F1E, 0x9C17, 0x9C17, 0x329B,
+    0x9C1B, 0x9C1B, 0x491B, 0x9C1C, 0x9C1C, 0x334C, 0x9C1D, 0x9C1D, 0x334B,
+    0x9C1F, 0x9C1F, 0x4622, 0x9C20, 0x9C20, 0x47CA, 0x9C21, 0x9C21, 0x3352,
+    0x9C23, 0x9C23, 0x334E, 0x9C24, 0x9C24, 0x3351, 0x9C25, 0x9C25, 0x16B0,
+    0x9C26, 0x9C26, 0x45E6, 0x9C28, 0x9C29, 0x334F, 0x9C2B, 0x9C2B, 0x334A,
+    0x9C2C, 0x9C2C, 0x334D, 0x9C2D, 0x9C2D, 0x16AF, 0x9C2E, 0x9C2E, 0x3F22,
+    0x9C2F, 0x9C2F, 0x3D87, 0x9C31, 0x9C31, 0x16ED, 0x9C32, 0x9C32, 0x33F2,
+    0x9C33, 0x9C33, 0x33ED, 0x9C34, 0x9C34, 0x33F1, 0x9C35, 0x9C35, 0x3C39,
+    0x9C36, 0x9C36, 0x33F4, 0x9C37, 0x9C37, 0x33F0, 0x9C39, 0x9C39, 0x33EC,
+    0x9C3A, 0x9C3A, 0x3D7E, 0x9C3B, 0x9C3B, 0x16EF, 0x9C3C, 0x9C3C, 0x33EF,
+    0x9C3D, 0x9C3D, 0x33F3, 0x9C3E, 0x9C3E, 0x16EE, 0x9C3F, 0x9C3F, 0x33EA,
+    0x9C40, 0x9C40, 0x3297, 0x9C41, 0x9C41, 0x33EE, 0x9C44, 0x9C44, 0x33EB,
+    0x9C45, 0x9C45, 0x3E71, 0x9C46, 0x9C46, 0x33E8, 0x9C48, 0x9C48, 0x33E9,
+    0x9C49, 0x9C49, 0x16EC, 0x9C4A, 0x9C4A, 0x3457, 0x9C4B, 0x9C4B, 0x3459,
+    0x9C4C, 0x9C4C, 0x345C, 0x9C4D, 0x9C4D, 0x3458, 0x9C4E, 0x9C4E, 0x345D,
+    0x9C4F, 0x9C4F, 0x3C36, 0x9C50, 0x9C50, 0x3456, 0x9C52, 0x9C52, 0x3454,
+    0x9C53, 0x9C53, 0x3C37, 0x9C54, 0x9C54, 0x1719, 0x9C55, 0x9C55, 0x345A,
+    0x9C56, 0x9C56, 0x171B, 0x9C57, 0x9C57, 0x171A, 0x9C58, 0x9C58, 0x3455,
+    0x9C59, 0x9C59, 0x345B, 0x9C5D, 0x9C5D, 0x3EBF, 0x9C5E, 0x9C5E, 0x34B5,
+    0x9C5F, 0x9C5F, 0x173A, 0x9C60, 0x9C60, 0x34B6, 0x9C62, 0x9C62, 0x34B4,
+    0x9C63, 0x9C63, 0x34B1, 0x9C66, 0x9C66, 0x34B3, 0x9C67, 0x9C67, 0x34B2,
+    0x9C68, 0x9C68, 0x34F4, 0x9C6D, 0x9C6D, 0x34F6, 0x9C6E, 0x9C6E, 0x34F5,
+    0x9C71, 0x9C71, 0x3514, 0x9C72, 0x9C72, 0x3EA1, 0x9C73, 0x9C73, 0x3513,
+    0x9C74, 0x9C74, 0x3512, 0x9C75, 0x9C75, 0x3515, 0x9C77, 0x9C78, 0x1760,
+    0x9C79, 0x9C79, 0x3541, 0x9C7A, 0x9C7A, 0x3545, 0x9C7B, 0x9C7B, 0x3C38,
+    0x9C7C, 0x9C7C, 0x4512, 0x9CE5, 0x9CE5, 0x0BE2, 0x9CE6, 0x9CE6, 0x235F,
+    0x9CE7, 0x9CE7, 0x2610, 0x9CE9, 0x9CE9, 0x0F79, 0x9CEA, 0x9CEA, 0x260E,
+    0x9CED, 0x9CED, 0x260F, 0x9CF1, 0x9CF2, 0x2879, 0x9CF3, 0x9CF3, 0x10FE,
+    0x9CF4, 0x9CF4, 0x10FC, 0x9CF5, 0x9CF5, 0x287B, 0x9CF6, 0x9CF6, 0x10FD,
+    0x9CF7, 0x9CF7, 0x2AF4, 0x9CF9, 0x9CF9, 0x2AF7, 0x9CFA, 0x9CFA, 0x2AF1,
+    0x9CFB, 0x9CFB, 0x2AF8, 0x9CFC, 0x9CFC, 0x2AF0, 0x9CFD, 0x9CFD, 0x2AF2,
+    0x9CFF, 0x9CFF, 0x2AF3, 0x9D00, 0x9D00, 0x2AF6, 0x9D02, 0x9D02, 0x3F3B,
+    0x9D03, 0x9D03, 0x1284, 0x9D04, 0x9D04, 0x2AFB, 0x9D05, 0x9D05, 0x2AFA,
+    0x9D06, 0x9D06, 0x1282, 0x9D07, 0x9D07, 0x2AF5, 0x9D08, 0x9D08, 0x2AF9,
+    0x9D09, 0x9D09, 0x1283, 0x9D0C, 0x9D0C, 0x3C46, 0x9D10, 0x9D10, 0x2D2D,
+    0x9D12, 0x9D12, 0x13AE, 0x9D14, 0x9D14, 0x2D28, 0x9D15, 0x9D15, 0x13AA,
+    0x9D16, 0x9D16, 0x3C7C, 0x9D17, 0x9D17, 0x2D25, 0x9D18, 0x9D18, 0x2D2B,
+    0x9D19, 0x9D19, 0x2D2E, 0x9D1B, 0x9D1B, 0x13AF, 0x9D1D, 0x9D1D, 0x2D2A,
+    0x9D1E, 0x9D1E, 0x2D27, 0x9D1F, 0x9D1F, 0x2D2F, 0x9D20, 0x9D20, 0x2D26,
+    0x9D21, 0x9D21, 0x3C41, 0x9D22, 0x9D22, 0x2D2C, 0x9D23, 0x9D23, 0x13AB,
+    0x9D25, 0x9D25, 0x2D24, 0x9D26, 0x9D26, 0x13AC, 0x9D28, 0x9D28, 0x13AD,
+    0x9D29, 0x9D29, 0x2D29, 0x9D2D, 0x9D2D, 0x2F00, 0x9D2E, 0x9D2F, 0x2EF3,
+    0x9D30, 0x9D30, 0x2EF7, 0x9D31, 0x9D31, 0x2EF5, 0x9D33, 0x9D33, 0x2EEF,
+    0x9D34, 0x9D34, 0x404A, 0x9D36, 0x9D36, 0x2EF2, 0x9D37, 0x9D37, 0x2EFC,
+    0x9D38, 0x9D38, 0x2EF6, 0x9D39, 0x9D39, 0x392E, 0x9D3B, 0x9D3B, 0x14BF,
+    0x9D3D, 0x9D3D, 0x2EFE, 0x9D3E, 0x9D3E, 0x2EFB, 0x9D3F, 0x9D3F, 0x14C0,
+    0x9D40, 0x9D40, 0x2EFD, 0x9D41, 0x9D41, 0x2EF0, 0x9D42, 0x9D43, 0x2EF9,
+    0x9D44, 0x9D44, 0x3FAB, 0x9D45, 0x9D45, 0x2EF8, 0x9D49, 0x9D49, 0x47CD,
+    0x9D4A, 0x9D4A, 0x3061, 0x9D4B, 0x9D4B, 0x3063, 0x9D4C, 0x9D4C, 0x3066,
+    0x9D4E, 0x9D4E, 0x4539, 0x9D4F, 0x9D4F, 0x3060, 0x9D50, 0x9D50, 0x3ECA,
+    0x9D51, 0x9D51, 0x156F, 0x9D52, 0x9D52, 0x3068, 0x9D53, 0x9D53, 0x305F,
+    0x9D54, 0x9D54, 0x3069, 0x9D56, 0x9D56, 0x3065, 0x9D57, 0x9D57, 0x3067,
+    0x9D58, 0x9D58, 0x306B, 0x9D59, 0x9D59, 0x3064, 0x9D5A, 0x9D5A, 0x306C,
+    0x9D5B, 0x9D5B, 0x3062, 0x9D5C, 0x9D5C, 0x305E, 0x9D5D, 0x9D5D, 0x1570,
+    0x9D5E, 0x9D5E, 0x3E6E, 0x9D5F, 0x9D5F, 0x306A, 0x9D60, 0x9D60, 0x1571,
+    0x9D61, 0x9D61, 0x1601, 0x9D67, 0x9D67, 0x2EF1, 0x9D68, 0x9D68, 0x31BB,
+    0x9D69, 0x9D69, 0x31B2, 0x9D6A, 0x9D6A, 0x1603, 0x9D6B, 0x9D6B, 0x31AE,
+    0x9D6C, 0x9D6C, 0x1604, 0x9D6D, 0x9D6D, 0x3BAC, 0x9D6E, 0x9D6E, 0x433B,
+    0x9D6F, 0x9D6F, 0x31B7, 0x9D70, 0x9D70, 0x31B1, 0x9D71, 0x9D71, 0x31A7,
+    0x9D72, 0x9D72, 0x1602, 0x9D73, 0x9D73, 0x31B4, 0x9D74, 0x9D75, 0x31AF,
+    0x9D77, 0x9D77, 0x31A2, 0x9D78, 0x9D78, 0x31A9, 0x9D79, 0x9D79, 0x31B8,
+    0x9D7B, 0x9D7B, 0x31B5, 0x9D7C, 0x9D7C, 0x3EFE, 0x9D7D, 0x9D7D, 0x31AD,
+    0x9D7E, 0x9D7E, 0x3925, 0x9D7F, 0x9D7F, 0x31B9, 0x9D80, 0x9D80, 0x31A8,
+    0x9D81, 0x9D81, 0x31A3, 0x9D82, 0x9D82, 0x31B6, 0x9D83, 0x9D83, 0x3926,
+    0x9D84, 0x9D84, 0x31A5, 0x9D85, 0x9D85, 0x31B3, 0x9D86, 0x9D86, 0x31AA,
+    0x9D87, 0x9D87, 0x31BA, 0x9D88, 0x9D88, 0x31A6, 0x9D89, 0x9D89, 0x1600,
+    0x9D8A, 0x9D8A, 0x31A4, 0x9D8B, 0x9D8C, 0x31AB, 0x9D90, 0x9D90, 0x32A4,
+    0x9D92, 0x9D92, 0x32A2, 0x9D93, 0x9D93, 0x43F3, 0x9D94, 0x9D94, 0x32A7,
+    0x9D96, 0x9D96, 0x32B3, 0x9D97, 0x9D97, 0x32AA, 0x9D98, 0x9D98, 0x32A3,
+    0x9D99, 0x9D99, 0x329F, 0x9D9A, 0x9D9A, 0x32AC, 0x9D9B, 0x9D9B, 0x32A5,
+    0x9D9C, 0x9D9C, 0x32A8, 0x9D9D, 0x9D9D, 0x32A1, 0x9D9E, 0x9D9E, 0x32AF,
+    0x9D9F, 0x9D9F, 0x329E, 0x9DA0, 0x9DA0, 0x32A6, 0x9DA1, 0x9DA1, 0x32AB,
+    0x9DA2, 0x9DA2, 0x32AD, 0x9DA3, 0x9DA3, 0x32B0, 0x9DA4, 0x9DA4, 0x32A0,
+    0x9DA5, 0x9DA5, 0x3C4B, 0x9DA6, 0x9DA7, 0x32B4, 0x9DA8, 0x9DA8, 0x32AE,
+    0x9DA9, 0x9DA9, 0x32B2, 0x9DAA, 0x9DAA, 0x32A9, 0x9DAB, 0x9DAB, 0x3F30,
+    0x9DAC, 0x9DAC, 0x3362, 0x9DAD, 0x9DAD, 0x3365, 0x9DAF, 0x9DAF, 0x16B1,
+    0x9DB1, 0x9DB1, 0x3364, 0x9DB2, 0x9DB2, 0x3369, 0x9DB3, 0x9DB3, 0x3367,
+    0x9DB4, 0x9DB4, 0x16B2, 0x9DB5, 0x9DB5, 0x335E, 0x9DB6, 0x9DB6, 0x3354,
+    0x9DB7, 0x9DB7, 0x3353, 0x9DB8, 0x9DB8, 0x16B4, 0x9DB9, 0x9DBA, 0x3360,
+    0x9DBB, 0x9DBB, 0x335D, 0x9DBC, 0x9DBC, 0x3355, 0x9DBD, 0x9DBD, 0x47D0,
+    0x9DBE, 0x9DBE, 0x335A, 0x9DBF, 0x9DBF, 0x32B1, 0x9DC0, 0x9DC0, 0x43F2,
+    0x9DC1, 0x9DC1, 0x3356, 0x9DC2, 0x9DC2, 0x16B3, 0x9DC3, 0x9DC3, 0x335C,
+    0x9DC4, 0x9DC4, 0x3929, 0x9DC5, 0x9DC5, 0x335B, 0x9DC7, 0x9DC7, 0x3357,
+    0x9DC8, 0x9DC8, 0x3363, 0x9DC9, 0x9DC9, 0x4579, 0x9DCA, 0x9DCA, 0x3358,
+    0x9DCB, 0x9DCB, 0x33F9, 0x9DCC, 0x9DCC, 0x3366, 0x9DCD, 0x9DCD, 0x3368,
+    0x9DCE, 0x9DCE, 0x335F, 0x9DCF, 0x9DCF, 0x3359, 0x9DD0, 0x9DD0, 0x33FA,
+    0x9DD1, 0x9DD1, 0x33FC, 0x9DD2, 0x9DD2, 0x33F6, 0x9DD3, 0x9DD3, 0x16F0,
+    0x9DD4, 0x9DD4, 0x391E, 0x9DD5, 0x9DD5, 0x3403, 0x9DD6, 0x9DD6, 0x3401,
+    0x9DD7, 0x9DD7, 0x16F1, 0x9DD8, 0x9DD8, 0x3400, 0x9DD9, 0x9DD9, 0x33FF,
+    0x9DDA, 0x9DDA, 0x33F8, 0x9DDB, 0x9DDB, 0x33F5, 0x9DDC, 0x9DDC, 0x33FB,
+    0x9DDD, 0x9DDD, 0x3404, 0x9DDE, 0x9DDE, 0x33F7, 0x9DDF, 0x9DDF, 0x33FD,
+    0x9DE1, 0x9DE1, 0x3466, 0x9DE2, 0x9DE2, 0x346B, 0x9DE3, 0x9DE3, 0x3461,
+    0x9DE4, 0x9DE4, 0x3464, 0x9DE5, 0x9DE5, 0x171C, 0x9DE6, 0x9DE6, 0x3468,
+    0x9DE8, 0x9DE8, 0x346F, 0x9DE9, 0x9DE9, 0x33FE, 0x9DEB, 0x9DEB, 0x3462,
+    0x9DEC, 0x9DEC, 0x346C, 0x9DED, 0x9DED, 0x3470, 0x9DEE, 0x9DEE, 0x3467,
+    0x9DEF, 0x9DEF, 0x3460, 0x9DF0, 0x9DF0, 0x346A, 0x9DF2, 0x9DF2, 0x3469,
+    0x9DF3, 0x9DF3, 0x346E, 0x9DF4, 0x9DF4, 0x346D, 0x9DF5, 0x9DF5, 0x3402,
+    0x9DF6, 0x9DF6, 0x3465, 0x9DF7, 0x9DF7, 0x345F, 0x9DF8, 0x9DF8, 0x3463,
+    0x9DF9, 0x9DFA, 0x173B, 0x9DFB, 0x9DFB, 0x345E, 0x9DFC, 0x9DFC, 0x47D1,
+    0x9DFD, 0x9DFD, 0x34C1, 0x9DFE, 0x9DFE, 0x34B8, 0x9DFF, 0x9DFF, 0x34C0,
+    0x9E00, 0x9E01, 0x34BD, 0x9E02, 0x9E02, 0x34B7, 0x9E03, 0x9E03, 0x34BA,
+    0x9E04, 0x9E04, 0x34C2, 0x9E05, 0x9E05, 0x34BC, 0x9E06, 0x9E06, 0x34BB,
+    0x9E07, 0x9E07, 0x34B9, 0x9E09, 0x9E09, 0x34BF, 0x9E0A, 0x9E0A, 0x457E,
+    0x9E0B, 0x9E0B, 0x34F7, 0x9E0C, 0x9E0C, 0x457A, 0x9E0D, 0x9E0D, 0x34F8,
+    0x9E0E, 0x9E0E, 0x3928, 0x9E0F, 0x9E0F, 0x34FA, 0x9E10, 0x9E10, 0x34F9,
+    0x9E11, 0x9E11, 0x34FC, 0x9E12, 0x9E12, 0x34FB, 0x9E13, 0x9E13, 0x3517,
+    0x9E14, 0x9E14, 0x3516, 0x9E15, 0x9E15, 0x3530, 0x9E17, 0x9E17, 0x3531,
+    0x9E18, 0x9E18, 0x3C44, 0x9E19, 0x9E19, 0x353D, 0x9E1A, 0x9E1A, 0x1765,
+    0x9E1B, 0x9E1B, 0x1769, 0x9E1C, 0x9E1C, 0x3F84, 0x9E1D, 0x9E1D, 0x3546,
+    0x9E1E, 0x9E1E, 0x176A, 0x9E1F, 0x9E1F, 0x4513, 0x9E75, 0x9E75, 0x0BE3,
+    0x9E79, 0x9E79, 0x1661, 0x9E7A, 0x9E7A, 0x336A, 0x9E7B, 0x9E7B, 0x43F8,
+    0x9E7C, 0x9E7D, 0x173D, 0x9E7F, 0x9E7F, 0x0BE4, 0x9E80, 0x9E80, 0x2611,
+    0x9E81, 0x9E81, 0x3F0F, 0x9E82, 0x9E82, 0x0F7A, 0x9E83, 0x9E83, 0x2AFC,
+    0x9E84, 0x9E84, 0x3F76, 0x9E85, 0x9E85, 0x3EF2, 0x9E86, 0x9E87, 0x2D31,
+    0x9E88, 0x9E88, 0x2D30, 0x9E89, 0x9E89, 0x2F02, 0x9E8A, 0x9E8A, 0x2F01,
+    0x9E8B, 0x9E8B, 0x14C1, 0x9E8C, 0x9E8C, 0x306E, 0x9E8D, 0x9E8D, 0x2F03,
+    0x9E8E, 0x9E8E, 0x306D, 0x9E90, 0x9E90, 0x3931, 0x9E91, 0x9E91, 0x31BD,
+    0x9E92, 0x9E92, 0x1605, 0x9E93, 0x9E93, 0x1607, 0x9E94, 0x9E94, 0x31BC,
+    0x9E95, 0x9E95, 0x3932, 0x9E96, 0x9E96, 0x3FBC, 0x9E97, 0x9E97, 0x1606,
+    0x9E98, 0x9E98, 0x3F27, 0x9E99, 0x9E99, 0x32B6, 0x9E9A, 0x9E9A, 0x32B8,
+    0x9E9B, 0x9E9B, 0x32B7, 0x9E9C, 0x9E9C, 0x336B, 0x9E9D, 0x9E9D, 0x16B5,
+    0x9E9E, 0x9E9E, 0x3933, 0x9E9F, 0x9E9F, 0x171D, 0x9EA0, 0x9EA0, 0x34C3,
+    0x9EA1, 0x9EA1, 0x34FD, 0x9EA2, 0x9EA2, 0x3934, 0x9EA4, 0x9EA4, 0x354A,
+    0x9EA5, 0x9EA5, 0x0BE5, 0x9EA6, 0x9EA6, 0x4944, 0x9EA7, 0x9EA7, 0x287C,
+    0x9EA8, 0x9EA8, 0x3F75, 0x9EA9, 0x9EA9, 0x1285, 0x9EAA, 0x9EAA, 0x3936,
+    0x9EAB, 0x9EAB, 0x3E92, 0x9EAC, 0x9EAC, 0x43F4, 0x9EAD, 0x9EAD, 0x2D34,
+    0x9EAE, 0x9EAE, 0x2D33, 0x9EAF, 0x9EAF, 0x3937, 0x9EB0, 0x9EB0, 0x2F04,
+    0x9EB1, 0x9EB1, 0x47D4, 0x9EB4, 0x9EB4, 0x1608, 0x9EB5, 0x9EB5, 0x1662,
+    0x9EB6, 0x9EB6, 0x3405, 0x9EB7, 0x9EB7, 0x3542, 0x9EBB, 0x9EBB, 0x0BE6,
+    0x9EBC, 0x9EBC, 0x10FF, 0x9EBD, 0x9EBD, 0x47D5, 0x9EBE, 0x9EBE, 0x1286,
+    0x9EBF, 0x9EBF, 0x3D78, 0x9EC0, 0x9EC0, 0x31BE, 0x9EC1, 0x9EC1, 0x3939,
+    0x9EC2, 0x9EC2, 0x3471, 0x9EC3, 0x9EC3, 0x0DBB, 0x9EC4, 0x9EC4, 0x4514,
+    0x9EC6, 0x9EC6, 0x47D6, 0x9EC7, 0x9EC7, 0x4577, 0x9EC8, 0x9EC8, 0x2F05,
+    0x9ECC, 0x9ECC, 0x1751, 0x9ECD, 0x9ECD, 0x0DBC, 0x9ECE, 0x9ECE, 0x1287,
+    0x9ECF, 0x9ECF, 0x14C2, 0x9ED0, 0x9ED0, 0x3472, 0x9ED1, 0x9ED1, 0x0DBD,
+    0x9ED3, 0x9ED3, 0x2AFD, 0x9ED4, 0x9ED4, 0x13B1, 0x9ED5, 0x9ED6, 0x2D35,
+    0x9ED8, 0x9ED8, 0x13B0, 0x9EDA, 0x9EDA, 0x2F06, 0x9EDB, 0x9EDB, 0x14C6,
+    0x9EDC, 0x9EDD, 0x14C4, 0x9EDE, 0x9EDE, 0x14C3, 0x9EDF, 0x9EDF, 0x306F,
+    0x9EE0, 0x9EE0, 0x1572, 0x9EE2, 0x9EE2, 0x47D8, 0x9EE4, 0x9EE4, 0x32BA,
+    0x9EE5, 0x9EE5, 0x32B9, 0x9EE6, 0x9EE6, 0x32BC, 0x9EE7, 0x9EE7, 0x32BB,
+    0x9EE8, 0x9EE8, 0x1663, 0x9EEB, 0x9EEB, 0x336C, 0x9EED, 0x9EED, 0x336E,
+    0x9EEE, 0x9EEE, 0x336D, 0x9EEF, 0x9EEF, 0x16B6, 0x9EF0, 0x9EF0, 0x3406,
+    0x9EF1, 0x9EF1, 0x47D9, 0x9EF2, 0x9EF3, 0x3473, 0x9EF4, 0x9EF4, 0x171E,
+    0x9EF5, 0x9EF5, 0x34FE, 0x9EF6, 0x9EF6, 0x3518, 0x9EF7, 0x9EF7, 0x1762,
+    0x9EF8, 0x9EF8, 0x47DA, 0x9EF9, 0x9EF9, 0x2360, 0x9EFA, 0x9EFA, 0x2D37,
+    0x9EFB, 0x9EFB, 0x2F07, 0x9EFC, 0x9EFC, 0x31BF, 0x9EFD, 0x9EFD, 0x2612,
+    0x9EFE, 0x9EFE, 0x47CE, 0x9EFF, 0x9EFF, 0x2F08, 0x9F00, 0x9F00, 0x3071,
+    0x9F01, 0x9F01, 0x3070, 0x9F02, 0x9F02, 0x3940, 0x9F06, 0x9F06, 0x3475,
+    0x9F07, 0x9F07, 0x173F, 0x9F08, 0x9F08, 0x3941, 0x9F09, 0x9F09, 0x34FF,
+    0x9F0A, 0x9F0A, 0x3519, 0x9F0E, 0x9F0E, 0x0F7B, 0x9F0F, 0x9F10, 0x2AFE,
+    0x9F12, 0x9F12, 0x2D38, 0x9F13, 0x9F13, 0x0F7C, 0x9F15, 0x9F15, 0x1573,
+    0x9F16, 0x9F16, 0x3072, 0x9F17, 0x9F17, 0x3945, 0x9F18, 0x9F18, 0x3370,
+    0x9F19, 0x9F19, 0x16B7, 0x9F1A, 0x9F1A, 0x3371, 0x9F1B, 0x9F1B, 0x336F,
+    0x9F1C, 0x9F1C, 0x3476, 0x9F1E, 0x9F1E, 0x34C4, 0x9F20, 0x9F20, 0x0F7D,
+    0x9F22, 0x9F22, 0x2F0B, 0x9F23, 0x9F23, 0x2F0A, 0x9F24, 0x9F24, 0x2F09,
+    0x9F25, 0x9F25, 0x3073, 0x9F26, 0x9F26, 0x3F90, 0x9F27, 0x9F27, 0x4620,
+    0x9F28, 0x9F28, 0x3077, 0x9F29, 0x9F29, 0x3076, 0x9F2A, 0x9F2A, 0x3075,
+    0x9F2B, 0x9F2B, 0x3074, 0x9F2C, 0x9F2C, 0x1574, 0x9F2D, 0x9F2D, 0x31C0,
+    0x9F2E, 0x9F2E, 0x32BE, 0x9F2F, 0x9F2F, 0x1664, 0x9F30, 0x9F30, 0x32BD,
+    0x9F31, 0x9F31, 0x3372, 0x9F32, 0x9F32, 0x3409, 0x9F33, 0x9F33, 0x3408,
+    0x9F34, 0x9F34, 0x16F2, 0x9F35, 0x9F35, 0x3407, 0x9F36, 0x9F36, 0x3479,
+    0x9F37, 0x9F37, 0x3478, 0x9F38, 0x9F38, 0x3477, 0x9F39, 0x9F39, 0x3947,
+    0x9F3B, 0x9F3B, 0x1100, 0x9F3D, 0x9F3D, 0x2D39, 0x9F3E, 0x9F3E, 0x14C7,
+    0x9F40, 0x9F41, 0x31C1, 0x9F42, 0x9F42, 0x340A, 0x9F43, 0x9F43, 0x347A,
+    0x9F44, 0x9F44, 0x47DB, 0x9F45, 0x9F45, 0x394A, 0x9F46, 0x9F46, 0x34C5,
+    0x9F47, 0x9F47, 0x3500, 0x9F48, 0x9F48, 0x3532, 0x9F49, 0x9F49, 0x354C,
+    0x9F4A, 0x9F4A, 0x1101, 0x9F4B, 0x9F4B, 0x14C8, 0x9F4C, 0x9F4C, 0x3078,
+    0x9F4D, 0x9F4D, 0x31C3, 0x9F4E, 0x9F4E, 0x3373, 0x9F4F, 0x9F4F, 0x347B,
+    0x9F50, 0x9F50, 0x4943, 0x9F52, 0x9F52, 0x1289, 0x9F53, 0x9F53, 0x3F80,
+    0x9F54, 0x9F54, 0x2F0C, 0x9F55, 0x9F55, 0x3079, 0x9F56, 0x9F58, 0x31C4,
+    0x9F59, 0x9F59, 0x32C3, 0x9F5A, 0x9F5A, 0x3F23, 0x9F5B, 0x9F5B, 0x32BF,
+    0x9F5C, 0x9F5C, 0x16B8, 0x9F5D, 0x9F5D, 0x32C2, 0x9F5E, 0x9F5E, 0x32C1,
+    0x9F5F, 0x9F5F, 0x1665, 0x9F60, 0x9F60, 0x32C0, 0x9F61, 0x9F61, 0x1667,
+    0x9F62, 0x9F62, 0x394F, 0x9F63, 0x9F63, 0x1666, 0x9F64, 0x9F64, 0x3375,
+    0x9F65, 0x9F65, 0x3374, 0x9F66, 0x9F67, 0x16B9, 0x9F69, 0x9F69, 0x3950,
+    0x9F6A, 0x9F6A, 0x16F4, 0x9F6B, 0x9F6B, 0x340B, 0x9F6C, 0x9F6C, 0x16F3,
+    0x9F6E, 0x9F6F, 0x347E, 0x9F70, 0x9F70, 0x347D, 0x9F71, 0x9F71, 0x347C,
+    0x9F72, 0x9F72, 0x1741, 0x9F74, 0x9F76, 0x34C6, 0x9F77, 0x9F77, 0x1740,
+    0x9F78, 0x9F78, 0x3501, 0x9F79, 0x9F79, 0x3504, 0x9F7A, 0x9F7A, 0x3503,
+    0x9F7B, 0x9F7B, 0x3502, 0x9F7E, 0x9F7E, 0x354B, 0x9F7F, 0x9F7F, 0x4680,
+    0x9F8D, 0x9F8D, 0x13B2, 0x9F8E, 0x9F8E, 0x3952, 0x9F90, 0x9F90, 0x157C,
+    0x9F91, 0x9F91, 0x32C4, 0x9F92, 0x9F92, 0x3376, 0x9F94, 0x9F94, 0x16F5,
+    0x9F95, 0x9F95, 0x340C, 0x9F98, 0x9F98, 0x354D, 0x9F99, 0x9F99, 0x4587,
+    0x9F9C, 0x9F9C, 0x13B3, 0x9F9F, 0x9F9F, 0x4646, 0x9FA0, 0x9FA0, 0x2F0D,
+    0x9FA2, 0x9FA2, 0x340D, 0x9FA4, 0x9FA4, 0x351A, 0x9FA5, 0x9FA5, 0x3F70,
+    0xE000, 0xE000, 0x400B, 0xE002, 0xE003, 0x400D, 0xE009, 0xE00A, 0x4014,
+    0xE00C, 0xE00C, 0x4017, 0xE00E, 0xE00E, 0x4019, 0xE012, 0xE016, 0x401D,
+    0xE018, 0xE018, 0x4023, 0xE01A, 0xE01E, 0x4025, 0xE020, 0xE020, 0x402B,
+    0xE022, 0xE023, 0x402D, 0xE025, 0xE025, 0x4030, 0xE02D, 0xE02E, 0x4038,
+    0xE030, 0xE030, 0x403B, 0xE032, 0xE038, 0x403D, 0xE03B, 0xE03C, 0x4046,
+    0xE045, 0xE045, 0x4050, 0xE04C, 0xE04C, 0x4057, 0xE05A, 0xE05A, 0x4065,
+    0xE05C, 0xE05C, 0x4067, 0xE05F, 0xE061, 0x406A, 0xE064, 0xE064, 0x406F,
+    0xE066, 0xE066, 0x4071, 0xE06C, 0xE06C, 0x4077, 0xE071, 0xE071, 0x407C,
+    0xE074, 0xE075, 0x407F, 0xE078, 0xE078, 0x4083, 0xE07D, 0xE07D, 0x4088,
+    0xE087, 0xE087, 0x4092, 0xE089, 0xE08A, 0x4094, 0xE08C, 0xE08C, 0x4097,
+    0xE093, 0xE094, 0x409E, 0xE099, 0xE09A, 0x40A4, 0xE09C, 0xE09E, 0x40A7,
+    0xE0A6, 0xE0A7, 0x40B1, 0xE0A9, 0xE0A9, 0x40B4, 0xE0AB, 0xE0AB, 0x40B6,
+    0xE0AE, 0xE0AE, 0x40B9, 0xE0BA, 0xE0BA, 0x40C5, 0xE0BC, 0xE0BC, 0x40C7,
+    0xE0BE, 0xE0BE, 0x40C9, 0xE0C3, 0xE0C3, 0x40CE, 0xE0C5, 0xE0C5, 0x40D0,
+    0xE0C7, 0xE0C8, 0x40D2, 0xE0CA, 0xE0CA, 0x40D5, 0xE0D0, 0xE0D0, 0x40DB,
+    0xE0D4, 0xE0D5, 0x40DF, 0xE0DC, 0xE0DC, 0x40E7, 0xE0DF, 0xE0DF, 0x40EA,
+    0xE0E2, 0xE0E5, 0x40ED, 0xE0E7, 0xE0E9, 0x40F2, 0xE0EB, 0xE0EC, 0x40F6,
+    0xE0EE, 0xE0EE, 0x40F9, 0xE0F2, 0xE0F2, 0x40FD, 0xE0F8, 0xE0F9, 0x4103,
+    0xE0FB, 0xE0FB, 0x4105, 0xE0FD, 0xE0FD, 0x4107, 0xE103, 0xE103, 0x410D,
+    0xE106, 0xE106, 0x4110, 0xE109, 0xE10B, 0x4112, 0xE110, 0xE110, 0x4119,
+    0xE114, 0xE115, 0x411D, 0xE11C, 0xE11D, 0x4125, 0xE121, 0xE121, 0x412A,
+    0xE126, 0xE128, 0x412F, 0xE130, 0xE131, 0x4139, 0xE136, 0xE136, 0x413F,
+    0xE139, 0xE139, 0x4142, 0xE141, 0xE142, 0x414A, 0xE145, 0xE145, 0x414D,
+    0xE147, 0xE148, 0x414F, 0xE14A, 0xE14A, 0x4151, 0xE14D, 0xE14D, 0x4153,
+    0xE150, 0xE150, 0x4156, 0xE154, 0xE157, 0x415A, 0xE159, 0xE15A, 0x415F,
+    0xE15D, 0xE15D, 0x494F, 0xE162, 0xE162, 0x4167, 0xE168, 0xE16A, 0x416D,
+    0xE171, 0xE172, 0x4175, 0xE175, 0xE175, 0x4179, 0xE178, 0xE179, 0x417C,
+    0xE17B, 0xE17C, 0x417F, 0xE17F, 0xE180, 0x4183, 0xE185, 0xE185, 0x4189,
+    0xE187, 0xE187, 0x418B, 0xE189, 0xE189, 0x418D, 0xE18B, 0xE18B, 0x418F,
+    0xE18F, 0xE190, 0x4193, 0xE193, 0xE193, 0x4196, 0xE195, 0xE195, 0x4953,
+    0xE196, 0xE196, 0x4198, 0xE19F, 0xE1A0, 0x41A1, 0xE1A4, 0xE1A4, 0x4954,
+    0xE1A6, 0xE1A6, 0x41A8, 0xE1AA, 0xE1AA, 0x41AC, 0xE1AE, 0xE1AE, 0x41B0,
+    0xE1B0, 0xE1B1, 0x41B2, 0xE1B3, 0xE1B4, 0x41B5, 0xE1B6, 0xE1B6, 0x41B8,
+    0xE1B8, 0xE1B8, 0x41BA, 0xE1BB, 0xE1BB, 0x4955, 0xE1BC, 0xE1BF, 0x41BD,
+    0xE1C1, 0xE1C1, 0x41C2, 0xE1C4, 0xE1C5, 0x41C5, 0xE1C8, 0xE1C8, 0x41C8,
+    0xE1CC, 0xE1CD, 0x41CC, 0xE1D4, 0xE1D5, 0x41D4, 0xE1D7, 0xE1D7, 0x41D7,
+    0xE1DA, 0xE1DA, 0x41DA, 0xE1DD, 0xE1DD, 0x41DD, 0xE1E2, 0xE1E2, 0x41E1,
+    0xE1E6, 0xE1E6, 0x41E5, 0xE1EB, 0xE1EB, 0x41EA, 0xE1EF, 0xE1F0, 0x41EE,
+    0xE1F2, 0xE1F2, 0x41F1, 0xE1F7, 0xE1F7, 0x41F6, 0xE1FA, 0xE1FA, 0x41F9,
+    0xE1FE, 0xE1FE, 0x41FD, 0xE200, 0xE200, 0x41FF, 0xE201, 0xE201, 0x4958,
+    0xE202, 0xE202, 0x4201, 0xE205, 0xE205, 0x4204, 0xE207, 0xE207, 0x4206,
+    0xE20A, 0xE20C, 0x4209, 0xE210, 0xE210, 0x420F, 0xE212, 0xE216, 0x4211,
+    0xE219, 0xE219, 0x4218, 0xE21B, 0xE21C, 0x421A, 0xE21F, 0xE221, 0x421E,
+    0xE226, 0xE228, 0x4225, 0xE22A, 0xE22A, 0x4229, 0xE22F, 0xE22F, 0x422E,
+    0xE231, 0xE231, 0x4230, 0xE233, 0xE233, 0x4232, 0xE237, 0xE237, 0x4236,
+    0xE23B, 0xE23B, 0x423A, 0xE23D, 0xE23E, 0x423C, 0xE245, 0xE245, 0x4244,
+    0xE248, 0xE248, 0x4247, 0xE24A, 0xE24F, 0x4249, 0xE251, 0xE254, 0x4250,
+    0xE261, 0xE261, 0x4260, 0xE268, 0xE268, 0x4266, 0xE26B, 0xE26B, 0x4269,
+    0xE26D, 0xE26F, 0x426B, 0xE271, 0xE271, 0x426F, 0xE27A, 0xE27A, 0x4278,
+    0xE27D, 0xE27D, 0x427B, 0xE282, 0xE282, 0x4280, 0xE288, 0xE289, 0x4286,
+    0xE28B, 0xE28B, 0x4289, 0xE290, 0xE291, 0x428E, 0xE294, 0xE296, 0x4292,
+    0xE299, 0xE29B, 0x4297, 0xE29F, 0xE29F, 0x429D, 0xE2A1, 0xE2A1, 0x495B,
+    0xE2A4, 0xE2A4, 0x42A1, 0xE2A6, 0xE2A6, 0x42A3, 0xE2B2, 0xE2B5, 0x42AE,
+    0xE2B7, 0xE2B8, 0x42B3, 0xE2BA, 0xE2BA, 0x42B6, 0xE2BE, 0xE2BF, 0x42B9,
+    0xE2C1, 0xE2C1, 0x42BC, 0xE2C7, 0xE2C7, 0x42C2, 0xE2C9, 0xE2C9, 0x42C4,
+    0xE2D4, 0xE2D4, 0x42CF, 0xE2D8, 0xE2D9, 0x42D3, 0xE2DE, 0xE2DE, 0x42D9,
+    0xE2E0, 0xE2E2, 0x42DB, 0xE2E7, 0xE2E7, 0x42E2, 0xE2E9, 0xE2E9, 0x42E4,
+    0xE2EB, 0xE2ED, 0x42E6, 0xE2F0, 0xE2F1, 0x495D, 0xE2F8, 0xE2F8, 0x42F1,
+    0xE2FC, 0xE2FC, 0x42F5, 0xE2FF, 0xE2FF, 0x495F, 0xE300, 0xE300, 0x4960,
+    0xE301, 0xE301, 0x42F8, 0xE306, 0xE306, 0x42FD, 0xE308, 0xE308, 0x42FF,
+    0xE30C, 0xE30C, 0x4303, 0xE30F, 0xE30F, 0x4306, 0xE311, 0xE311, 0x372B,
+    0xE313, 0xE313, 0x372D, 0xE315, 0xE315, 0x372F, 0xE318, 0xE318, 0x3731,
+    0xE31B, 0xE31C, 0x3734, 0xE31F, 0xE31F, 0x3738, 0xE325, 0xE325, 0x373E,
+    0xE32C, 0xE32C, 0x3745, 0xE330, 0xE331, 0x3749, 0xE335, 0xE336, 0x374E,
+    0xE33B, 0xE33B, 0x3754, 0xE33D, 0xE33D, 0x469A, 0xE342, 0xE342, 0x375A,
+    0xE345, 0xE345, 0x375D, 0xE348, 0xE348, 0x375F, 0xE352, 0xE352, 0x3768,
+    0xE354, 0xE354, 0x376A, 0xE35B, 0xE35C, 0x3770, 0xE360, 0xE360, 0x3775,
+    0xE362, 0xE362, 0x3777, 0xE364, 0xE365, 0x3779, 0xE36F, 0xE36F, 0x3784,
+    0xE372, 0xE372, 0x3787, 0xE374, 0xE375, 0x3789, 0xE377, 0xE377, 0x378C,
+    0xE379, 0xE379, 0x378D, 0xE37B, 0xE37B, 0x378F, 0xE381, 0xE382, 0x3795,
+    0xE386, 0xE386, 0x379A, 0xE388, 0xE38A, 0x379C, 0xE38D, 0xE38D, 0x37A1,
+    0xE391, 0xE391, 0x37A5, 0xE393, 0xE393, 0x37A7, 0xE394, 0xE394, 0x46A0,
+    0xE396, 0xE396, 0x37A9, 0xE398, 0xE398, 0x37AB, 0xE39A, 0xE39B, 0x37AD,
+    0xE39E, 0xE39E, 0x46A1, 0xE39F, 0xE3A0, 0x37B1, 0xE3A2, 0xE3A2, 0x37B4,
+    0xE3A5, 0xE3A5, 0x46A2, 0xE3A6, 0xE3A9, 0x37B8, 0xE3AC, 0xE3AC, 0x37BE,
+    0xE3B1, 0xE3B2, 0x37C3, 0xE3B4, 0xE3B5, 0x37C6, 0xE3B9, 0xE3BD, 0x37CB,
+    0xE3C3, 0xE3C3, 0x37D5, 0xE3C8, 0xE3C8, 0x37D9, 0xE3CC, 0xE3CC, 0x37DD,
+    0xE3CD, 0xE3CD, 0x46A4, 0xE3CF, 0xE3CF, 0x37DF, 0xE3D5, 0xE3D5, 0x46A5,
+    0xE3D8, 0xE3DA, 0x37E7, 0xE3E1, 0xE3E1, 0x37F0, 0xE3E3, 0xE3E3, 0x37F2,
+    0xE3E7, 0xE3E7, 0x46A6, 0xE3ED, 0xE3EE, 0x37FC, 0xE3F0, 0xE3F0, 0x37FF,
+    0xE3F2, 0xE3F4, 0x3801, 0xE3F8, 0xE3F8, 0x3807, 0xE3FA, 0xE3FA, 0x3809,
+    0xE3FD, 0xE3FD, 0x380C, 0xE3FF, 0xE3FF, 0x380E, 0xE409, 0xE40B, 0x3818,
+    0xE414, 0xE414, 0x3821, 0xE41B, 0xE41B, 0x3828, 0xE41D, 0xE41E, 0x382A,
+    0xE423, 0xE423, 0x3830, 0xE425, 0xE425, 0x3832, 0xE426, 0xE426, 0x46AB,
+    0xE428, 0xE428, 0x3834, 0xE42C, 0xE42D, 0x3838, 0xE432, 0xE432, 0x383E,
+    0xE436, 0xE436, 0x3842, 0xE43A, 0xE43C, 0x3846, 0xE43E, 0xE43E, 0x384A,
+    0xE440, 0xE441, 0x384C, 0xE444, 0xE444, 0x3850, 0xE448, 0xE448, 0x46AD,
+    0xE44C, 0xE44E, 0x3857, 0xE450, 0xE451, 0x385B, 0xE459, 0xE45A, 0x3864,
+    0xE45D, 0xE45E, 0x3868, 0xE461, 0xE463, 0x386C, 0xE465, 0xE465, 0x3870,
+    0xE467, 0xE469, 0x46AF, 0xE46A, 0xE46A, 0x3873, 0xE46C, 0xE46C, 0x3875,
+    0xE46E, 0xE46F, 0x3877, 0xE471, 0xE472, 0x387A, 0xE474, 0xE474, 0x387D,
+    0xE476, 0xE476, 0x387F, 0xE47E, 0xE47F, 0x3886, 0xE484, 0xE484, 0x388C,
+    0xE486, 0xE48A, 0x388D, 0xE48D, 0xE48E, 0x3894, 0xE491, 0xE492, 0x3897,
+    0xE495, 0xE497, 0x389B, 0xE4A1, 0xE4A1, 0x46B4, 0xE4A2, 0xE4A4, 0x38A7,
+    0xE4AB, 0xE4AB, 0x38B0, 0xE4AF, 0xE4AF, 0x38B4, 0xE4B3, 0xE4BA, 0x38B8,
+    0xE4C1, 0xE4C1, 0x38C6, 0xE4C6, 0xE4C6, 0x38CB, 0xE4C9, 0xE4C9, 0x38CE,
+    0xE4CD, 0xE4CE, 0x38D2, 0xE4D6, 0xE4D6, 0x38DB, 0xE4D9, 0xE4D9, 0x38DE,
+    0xE4DC, 0xE4DD, 0x38E1, 0xE4E4, 0xE4E4, 0x38E9, 0xE4E6, 0xE4E8, 0x38EB,
+    0xE4EE, 0xE4EF, 0x38F3, 0xE4F6, 0xE4F6, 0x38FB, 0xE4F8, 0xE4F9, 0x38FD,
+    0xE4FF, 0xE4FF, 0x3904, 0xE501, 0xE502, 0x3906, 0xE505, 0xE505, 0x390A,
+    0xE50A, 0xE50A, 0x390F, 0xE50D, 0xE50D, 0x46B5, 0xE50F, 0xE50F, 0x3913,
+    0xE512, 0xE512, 0x3916, 0xE514, 0xE514, 0x3918, 0xE516, 0xE516, 0x46B6,
+    0xE51A, 0xE51A, 0x391D, 0xE51C, 0xE521, 0x391F, 0xE524, 0xE524, 0x3927,
+    0xE528, 0xE528, 0x46B8, 0xE529, 0xE52C, 0x392A, 0xE52E, 0xE52F, 0x392F,
+    0xE537, 0xE537, 0x3938, 0xE53E, 0xE53E, 0x393F, 0xE543, 0xE543, 0x3944,
+    0xE54B, 0xE54B, 0x394C, 0xE554, 0xE555, 0x3955, 0xE557, 0xE559, 0x3958,
+    0xE55B, 0xE55C, 0x395C, 0xE55E, 0xE55F, 0x395F, 0xE562, 0xE562, 0x3963,
+    0xE566, 0xE567, 0x3967, 0xE56D, 0xE56E, 0x396E, 0xE570, 0xE570, 0x3971,
+    0xE572, 0xE573, 0x3973, 0xE575, 0xE577, 0x3976, 0xE579, 0xE57A, 0x397A,
+    0xE57C, 0xE57E, 0x397D, 0xE580, 0xE580, 0x3981, 0xE582, 0xE586, 0x3983,
+    0xE588, 0xE588, 0x3989, 0xE58B, 0xE590, 0x398C, 0xE592, 0xE594, 0x3993,
+    0xE59A, 0xE59A, 0x399B, 0xE59D, 0xE5A1, 0x399E, 0xE5A4, 0xE5A4, 0x39A5,
+    0xE5A6, 0xE5A8, 0x39A7, 0xE5AA, 0xE5AA, 0x39AB, 0xE5AF, 0xE5AF, 0x39B0,
+    0xE5B1, 0xE5B1, 0x39B2, 0xE5B2, 0xE5B2, 0x46BB, 0xE5B5, 0xE5B5, 0x39B6,
+    0xE5B7, 0xE5B8, 0x39B8, 0xE5BA, 0xE5BB, 0x39BB, 0xE5BE, 0xE5C0, 0x39BF,
+    0xE5C2, 0xE5C2, 0x39C3, 0xE5C8, 0xE5C9, 0x39C9, 0xE5D7, 0xE5D9, 0x39D4,
+    0xE5DB, 0xE5DC, 0x39D8, 0xE5DF, 0xE5DF, 0x39DC, 0xE5E1, 0xE5E3, 0x39DE,
+    0xE5E5, 0xE5E6, 0x39E2, 0xE5E9, 0xE5E9, 0x39E6, 0xE5EE, 0xE5F1, 0x39EB,
+    0xE5F3, 0xE5F3, 0x39F0, 0xE5FB, 0xE5FC, 0x39F8, 0xE600, 0xE600, 0x39FD,
+    0xE602, 0xE602, 0x39FF, 0xE604, 0xE604, 0x3A01, 0xE60F, 0xE612, 0x3A0B,
+    0xE619, 0xE61C, 0x3A14, 0xE621, 0xE621, 0x3A1C, 0xE623, 0xE624, 0x3A1E,
+    0xE627, 0xE627, 0x3A22, 0xE62B, 0xE62B, 0x3A26, 0xE632, 0xE634, 0x3A2D,
+    0xE637, 0xE638, 0x3A32, 0xE63A, 0xE63A, 0x3A35, 0xE63C, 0xE63C, 0x3A37,
+    0xE63F, 0xE642, 0x3A3A, 0xE645, 0xE646, 0x3A40, 0xE648, 0xE648, 0x3A43,
+    0xE64B, 0xE64B, 0x3A45, 0xE64E, 0xE64F, 0x3A48, 0xE652, 0xE655, 0x3A4C,
+    0xE657, 0xE659, 0x3A51, 0xE65D, 0xE660, 0x3A57, 0xE662, 0xE663, 0x3A5C,
+    0xE665, 0xE668, 0x3A5F, 0xE66A, 0xE66A, 0x46BF, 0xE66E, 0xE66F, 0x3A67,
+    0xE671, 0xE671, 0x3A6A, 0xE676, 0xE679, 0x3A6F, 0xE67B, 0xE67D, 0x3A74,
+    0xE67F, 0xE680, 0x3A78, 0xE683, 0xE688, 0x3A7B, 0xE68A, 0xE68C, 0x3A82,
+    0xE68E, 0xE690, 0x3A86, 0xE692, 0xE692, 0x3A8A, 0xE696, 0xE697, 0x3A8E,
+    0xE699, 0xE69A, 0x3A91, 0xE69C, 0xE69C, 0x3A94, 0xE69E, 0xE69F, 0x3A96,
+    0xE6A1, 0xE6A2, 0x3A99, 0xE6A6, 0xE6A6, 0x3A9D, 0xE6AC, 0xE6AD, 0x3AA2,
+    0xE6B2, 0xE6B2, 0x3AA8, 0xE6B9, 0xE6BA, 0x3AAF, 0xE6BD, 0xE6BE, 0x3AB3,
+    0xE6C0, 0xE6C1, 0x3AB6, 0xE6C5, 0xE6C5, 0x46C4, 0xE6C7, 0xE6C7, 0x3ABC,
+    0xE6CA, 0xE6CA, 0x3ABF, 0xE6D1, 0xE6D2, 0x3AC6, 0xE6D7, 0xE6D8, 0x3ACC,
+    0xE6DA, 0xE6DB, 0x3ACF, 0xE6DD, 0xE6E1, 0x3AD2, 0xE6E4, 0xE6E6, 0x3AD9,
+    0xE6EE, 0xE6EE, 0x3AE3, 0xE6F2, 0xE6F3, 0x3AE7, 0xE6F7, 0xE6F7, 0x3AEC,
+    0xE6FA, 0xE6FC, 0x3AEF, 0xE6FF, 0xE6FF, 0x3AF4, 0xE701, 0xE702, 0x3AF6,
+    0xE706, 0xE707, 0x3AFB, 0xE709, 0xE70A, 0x3AFE, 0xE70C, 0xE70C, 0x3B01,
+    0xE710, 0xE711, 0x3B05, 0xE713, 0xE713, 0x3B08, 0xE717, 0xE718, 0x3B0C,
+    0xE71A, 0xE71B, 0x3B0F, 0xE71D, 0xE71D, 0x3B12, 0xE724, 0xE725, 0x3B19,
+    0xE72B, 0xE72B, 0x3B20, 0xE72F, 0xE72F, 0x3B24, 0xE733, 0xE737, 0x3B28,
+    0xE73C, 0xE73D, 0x3B31, 0xE740, 0xE742, 0x3B35, 0xE744, 0xE744, 0x3B39,
+    0xE747, 0xE747, 0x3B3C, 0xE74D, 0xE74F, 0x3B42, 0xE751, 0xE752, 0x3B46,
+    0xE75B, 0xE75D, 0x3B50, 0xE75F, 0xE75F, 0x3B54, 0xE761, 0xE762, 0x3B56,
+    0xE764, 0xE765, 0x3B59, 0xE767, 0xE768, 0x3B5C, 0xE769, 0xE769, 0x46C7,
+    0xE76C, 0xE76E, 0x3B60, 0xE770, 0xE770, 0x3B64, 0xE775, 0xE775, 0x3B69,
+    0xE777, 0xE778, 0x3B6A, 0xE77A, 0xE77A, 0x3B6D, 0xE77C, 0xE77D, 0x3B6F,
+    0xE784, 0xE784, 0x3B77, 0xE786, 0xE786, 0x3B79, 0xE789, 0xE789, 0x3B7C,
+    0xE78B, 0xE78B, 0x3B7E, 0xE78D, 0xE78D, 0x3B80, 0xE790, 0xE790, 0x3B83,
+    0xE792, 0xE792, 0x3B85, 0xE794, 0xE794, 0x3B87, 0xE796, 0xE797, 0x3B89,
+    0xE799, 0xE799, 0x3B8C, 0xE7A2, 0xE7A2, 0x3B95, 0xE7A4, 0xE7A9, 0x3B97,
+    0xE7B1, 0xE7B1, 0x3BA4, 0xE7B4, 0xE7B4, 0x3BA7, 0xE7B8, 0xE7B8, 0x3BAB,
+    0xE7BC, 0xE7BC, 0x3BAF, 0xE7C4, 0xE7C4, 0x3BB6, 0xE7CA, 0xE7CA, 0x3BBC,
+    0xE7CE, 0xE7CE, 0x3BC0, 0xE7D1, 0xE7D1, 0x3BC3, 0xE7D8, 0xE7D8, 0x3BCA,
+    0xE7DA, 0xE7DA, 0x3BCC, 0xE7DC, 0xE7DD, 0x3BCE, 0xE7E4, 0xE7E4, 0x3BD6,
+    0xE7E7, 0xE7E9, 0x3BD9, 0xE7EB, 0xE7EB, 0x3BDD, 0xE7ED, 0xE7EF, 0x3BDF,
+    0xE7F1, 0xE7F3, 0x3BE3, 0xE7F8, 0xE7F8, 0x3BEA, 0xE7FB, 0xE7FC, 0x3BED,
+    0xE7FF, 0xE7FF, 0x3BF1, 0xE800, 0xE802, 0x3BF2, 0xE808, 0xE808, 0x3BFA,
+    0xE80C, 0xE80C, 0x3BFE, 0xE80E, 0xE80F, 0x3C00, 0xE811, 0xE811, 0x3C03,
+    0xE813, 0xE813, 0x3C05, 0xE816, 0xE818, 0x3C08, 0xE81A, 0xE81A, 0x3C0C,
+    0xE821, 0xE821, 0x3C13, 0xE827, 0xE828, 0x3C19, 0xE82D, 0xE82D, 0x3C1F,
+    0xE82F, 0xE82F, 0x3C21, 0xE835, 0xE835, 0x3C27, 0xE837, 0xE838, 0x3C29,
+    0xE83A, 0xE83B, 0x3C2C, 0xE841, 0xE842, 0x3C33, 0xE84B, 0xE84B, 0x3C3D,
+    0xE84D, 0xE84E, 0x3C3F, 0xE851, 0xE851, 0x3C43, 0xE855, 0xE858, 0x3C47,
+    0xE85B, 0xE85D, 0x3C4D, 0xE860, 0xE862, 0x3C52, 0xE865, 0xE867, 0x3C57,
+    0xE869, 0xE86A, 0x3C5B, 0xE86C, 0xE86C, 0x3C5D, 0xE871, 0xE871, 0x3C62,
+    0xE878, 0xE878, 0x3C69, 0xE87D, 0xE87F, 0x3C6E, 0xE887, 0xE887, 0x3C78,
+    0xE88F, 0xE88F, 0x3C80, 0xE891, 0xE892, 0x3C82, 0xE894, 0xE895, 0x3C85,
+    0xE89A, 0xE89A, 0x3C8B, 0xE89D, 0xE89D, 0x3C8E, 0xE8A0, 0xE8A1, 0x3C91,
+    0xE8A3, 0xE8A7, 0x3C94, 0xE8A9, 0xE8AA, 0x3C9A, 0xE8AC, 0xE8B0, 0x3C9D,
+    0xE8B5, 0xE8B6, 0x3CA6, 0xE8B8, 0xE8B8, 0x3CA9, 0xE8BD, 0xE8C3, 0x3CAE,
+    0xE8C5, 0xE8C5, 0x3CB6, 0xE8C7, 0xE8C7, 0x3CB8, 0xE8CB, 0xE8CB, 0x3CBC,
+    0xE8CD, 0xE8CE, 0x3CBE, 0xE8D0, 0xE8D1, 0x3CC1, 0xE8D3, 0xE8D3, 0x3CC4,
+    0xE8D5, 0xE8D6, 0x3CC6, 0xE8D8, 0xE8DA, 0x3CC9, 0xE8DD, 0xE8DD, 0x3CCE,
+    0xE8DF, 0xE8E1, 0x3CD0, 0xE8E5, 0xE8E6, 0x3CD6, 0xE8E8, 0xE8EA, 0x3CD9,
+    0xE8ED, 0xE8ED, 0x3CDE, 0xE8F1, 0xE8F2, 0x3CE2, 0xE8F5, 0xE8F5, 0x3CE6,
+    0xE8FB, 0xE8FB, 0x3CEC, 0xE8FE, 0xE8FE, 0x3CEF, 0xE900, 0xE900, 0x3CF1,
+    0xE903, 0xE903, 0x3CF4, 0xE907, 0xE908, 0x3CF8, 0xE90C, 0xE90C, 0x3CFD,
+    0xE917, 0xE918, 0x3D08, 0xE91C, 0xE91C, 0x3D0D, 0xE91E, 0xE922, 0x3D0F,
+    0xE925, 0xE92C, 0x3D16, 0xE92E, 0xE92F, 0x3D1F, 0xE933, 0xE936, 0x3D24,
+    0xE938, 0xE938, 0x46CF, 0xE93A, 0xE93A, 0x3D2B, 0xE93C, 0xE93E, 0x3D2D,
+    0xE941, 0xE941, 0x3D32, 0xE944, 0xE945, 0x3D35, 0xE948, 0xE948, 0x3D39,
+    0xE94D, 0xE94D, 0x3D3E, 0xE950, 0xE950, 0x3D41, 0xE952, 0xE955, 0x3D43,
+    0xE957, 0xE958, 0x3D48, 0xE95A, 0xE95A, 0x3D4B, 0xE95C, 0xE95E, 0x3D4D,
+    0xE960, 0xE961, 0x3D51, 0xE964, 0xE964, 0x3D55, 0xE967, 0xE967, 0x3D58,
+    0xE968, 0xE968, 0x46D1, 0xE96E, 0xE96F, 0x46D5, 0xE973, 0xE973, 0x46DA,
+    0xE974, 0xE974, 0x3D5B, 0xE975, 0xE975, 0x46DB, 0xE977, 0xE978, 0x46DD,
+    0xE97A, 0xE97B, 0x46E0, 0xE97D, 0xE97D, 0x46E3, 0xE981, 0xE982, 0x46E6,
+    0xE987, 0xE987, 0x3D5D, 0xE98A, 0xE98A, 0x3D5E, 0xE98E, 0xE98E, 0x3D5F,
+    0xE991, 0xE991, 0x46EF, 0xE9B0, 0xE9B0, 0x43D4, 0xE9CB, 0xE9CB, 0x4719,
+    0xE9EF, 0xE9EF, 0x4734, 0xEA43, 0xEA43, 0x4779, 0xEAA9, 0xEAA9, 0x47CC,
+    0xEABF, 0xEAC1, 0x47DC, 0xEAC5, 0xEAC5, 0x47E0, 0xEAC9, 0xEACC, 0x47E2,
+    0xEACF, 0xEAD1, 0x47E8, 0xEAD3, 0xEAD4, 0x47EB, 0xEAD6, 0xEADA, 0x47EE,
+    0xEADC, 0xEADC, 0x47F3, 0xEADE, 0xEAE3, 0x47F4, 0xEAE7, 0xEAEC, 0x47FA,
+    0xEAEE, 0xEAEE, 0x4800, 0xEAF0, 0xEAF2, 0x4801, 0xEAF4, 0xEAF4, 0x43B0,
+    0xEAF5, 0xEAF6, 0x4804, 0xEAF8, 0xEAF8, 0x4807, 0xEAF9, 0xEAF9, 0x43B2,
+    0xEAFA, 0xEAFB, 0x4808, 0xEAFE, 0xEAFF, 0x480B, 0xEB00, 0xEB00, 0x480D,
+    0xEB02, 0xEB05, 0x480E, 0xEB08, 0xEB0F, 0x4813, 0xEB11, 0xEB12, 0x481B,
+    0xEB15, 0xEB15, 0x481E, 0xEB18, 0xEB1D, 0x4821, 0xEB1F, 0xEB21, 0x4827,
+    0xEB23, 0xEB23, 0x482A, 0xEB25, 0xEB25, 0x482B, 0xEB27, 0xEB27, 0x482C,
+    0xEB2A, 0xEB2A, 0x482D, 0xEB2C, 0xEB39, 0x482E, 0xEB3D, 0xEB3D, 0x3D9B,
+    0xEB3E, 0xEB3F, 0x483C, 0xEB41, 0xEB41, 0x3D9D, 0xEB43, 0xEB44, 0x483E,
+    0xEB46, 0xEB46, 0x3DA0, 0xEB4A, 0xEB4A, 0x4841, 0xEB4B, 0xEB4C, 0x3DA3,
+    0xEB4D, 0xEB4E, 0x4842, 0xEB4F, 0xEB50, 0x3DA5, 0xEB53, 0xEB53, 0x4844,
+    0xEB54, 0xEB54, 0x3DA9, 0xEB55, 0xEB56, 0x4845, 0xEB57, 0xEB57, 0x3DAA,
+    0xEB58, 0xEB59, 0x4847, 0xEB5A, 0xEB5B, 0x3DAB, 0xEB5D, 0xEB5D, 0x3DAE,
+    0xEB5F, 0xEB5F, 0x3DB0, 0xEB61, 0xEB61, 0x3DB2, 0xEB62, 0xEB63, 0x4849,
+    0xEB65, 0xEB65, 0x484C, 0xEB67, 0xEB67, 0x484D, 0xEB68, 0xEB69, 0x3DB4,
+    0xEB6B, 0xEB6B, 0x3DB7, 0xEB6D, 0xEB6D, 0x3DB9, 0xEB6F, 0xEB71, 0x484E,
+    0xEB73, 0xEB73, 0x4851, 0xEB74, 0xEB74, 0x3DBC, 0xEB76, 0xEB76, 0x43D0,
+    0xEB77, 0xEB77, 0x4853, 0xEB78, 0xEB78, 0x3DBD, 0xEB7A, 0xEB7A, 0x4854,
+    0xEB7E, 0xEB7F, 0x4856, 0xEB80, 0xEB81, 0x3DC1, 0xEB83, 0xEB84, 0x4858,
+    0xEB85, 0xEB85, 0x3DC4, 0xEB88, 0xEB88, 0x485A, 0xEB89, 0xEB89, 0x3DC6,
+    0xEB8A, 0xEB8A, 0x485B, 0xEB8C, 0xEB8E, 0x485C, 0xEB8F, 0xEB8F, 0x3DC8,
+    0xEB90, 0xEB90, 0x485F, 0xEB93, 0xEB93, 0x3DCB, 0xEB95, 0xEB95, 0x4860,
+    0xEB97, 0xEB97, 0x3DCE, 0xEB98, 0xEB9A, 0x4861, 0xEB9B, 0xEB9B, 0x3DCF,
+    0xEB9F, 0xEB9F, 0x4866, 0xEBA0, 0xEBA0, 0x3DD1, 0xEBA2, 0xEBA2, 0x4867,
+    0xEBA3, 0xEBA3, 0x3DD3, 0xEBA5, 0xEBA6, 0x4868, 0xEBA8, 0xEBA8, 0x3DD6,
+    0xEBAA, 0xEBAA, 0x486A, 0xEBAB, 0xEBAB, 0x3DD8, 0xEBAD, 0xEBAD, 0x3DDA,
+    0xEBAE, 0xEBAE, 0x486B, 0xEBAF, 0xEBAF, 0x3DDB, 0xEBB0, 0xEBB0, 0x486C,
+    0xEBB2, 0xEBB3, 0x486D, 0xEBB4, 0xEBB4, 0x3DDD, 0xEBB6, 0xEBB6, 0x3DDF,
+    0xEBB9, 0xEBB9, 0x3DE2, 0xEBBC, 0xEBBC, 0x3DE4, 0xEBBD, 0xEBBD, 0x4870,
+    0xEBBF, 0xEBBF, 0x3DE6, 0xEBC2, 0xEBC2, 0x3DE9, 0xEBC5, 0xEBC6, 0x4872,
+    0xEBC7, 0xEBC7, 0x3DEB, 0xEBC8, 0xEBC8, 0x4874, 0xEBCA, 0xEBCA, 0x4875,
+    0xEBCC, 0xEBCD, 0x3DEE, 0xEBCE, 0xEBCE, 0x4876, 0xEBD0, 0xEBD0, 0x4877,
+    0xEBD3, 0xEBD3, 0x4878, 0xEBD5, 0xEBD5, 0x4879, 0xEBD7, 0xEBD8, 0x3DF4,
+    0xEBDA, 0xEBDB, 0x487A, 0xEBDD, 0xEBDD, 0x3DF8, 0xEBDF, 0xEBDF, 0x487C,
+    0xEBE1, 0xEBE1, 0x487D, 0xEBE4, 0xEBE4, 0x487E, 0xEBE7, 0xEBE7, 0x3DFF,
+    0xEBE8, 0xEBE9, 0x487F, 0xEBEB, 0xEBEC, 0x4881, 0xEBEE, 0xEBEE, 0x3E02,
+    0xEBEF, 0xEBEF, 0x4883, 0xEBF1, 0xEBF1, 0x4884, 0xEBF2, 0xEBF2, 0x3E04,
+    0xEBF5, 0xEBF5, 0x4886, 0xEBF6, 0xEBF6, 0x3E06, 0xEBF9, 0xEBFB, 0x3E09,
+    0xEBFD, 0xEBFE, 0x3E0D, 0xEC05, 0xEC06, 0x3E14, 0xEC08, 0xEC09, 0x4888,
+    0xEC0C, 0xEC0C, 0x3E18, 0xEC0E, 0xEC10, 0x3E1A, 0xEC13, 0xEC13, 0x488B,
+    0xEC14, 0xEC14, 0x3E1F, 0xEC17, 0xEC18, 0x3E22, 0xEC19, 0xEC1C, 0x488C,
+    0xEC1D, 0xEC1D, 0x3E24, 0xEC20, 0xEC20, 0x4890, 0xEC22, 0xEC22, 0x3E28,
+    0xEC24, 0xEC24, 0x3E2A, 0xEC26, 0xEC26, 0x3E2C, 0xEC2A, 0xEC2A, 0x3E30,
+    0xEC2B, 0xEC2B, 0x4891, 0xEC2C, 0xEC2E, 0x3E31, 0xEC2F, 0xEC2F, 0x4892,
+    0xEC31, 0xEC31, 0x3E35, 0xEC32, 0xEC32, 0x4893, 0xEC35, 0xEC35, 0x3E38,
+    0xEC37, 0xEC37, 0x3E3A, 0xEC3B, 0xEC3C, 0x3E3E, 0xEC3F, 0xEC41, 0x4894,
+    0xEC42, 0xEC42, 0x3E42, 0xEC43, 0xEC43, 0x4897, 0xEC44, 0xEC44, 0x43E8,
+    0xEC45, 0xEC49, 0x4898, 0xEC4B, 0xEC4C, 0x489D, 0xEC4F, 0xEC4F, 0x48A0,
+    0xEC52, 0xEC52, 0x48A1, 0xEC54, 0xEC54, 0x48A2, 0xEC56, 0xEC58, 0x48A3,
+    0xEC5A, 0xEC5A, 0x48A6, 0xEC5C, 0xEC5D, 0x48A7, 0xEC5F, 0xEC60, 0x48A9,
+    0xEC62, 0xEC63, 0x48AC, 0xEC67, 0xEC67, 0x48AF, 0xEC68, 0xEC68, 0x3E4D,
+    0xEC69, 0xEC73, 0x48B0, 0xEC75, 0xEC76, 0x48BC, 0xEC79, 0xEC79, 0x48C0,
+    0xEC7B, 0xEC7B, 0x48C2, 0xEC7E, 0xEC7E, 0x48C3, 0xEC80, 0xEC80, 0x48C5,
+    0xEC84, 0xEC84, 0x48C8, 0xEC86, 0xEC86, 0x48CA, 0xEC8D, 0xEC8D, 0x48CC,
+    0xEC8E, 0xEC8E, 0x3E55, 0xEC91, 0xEC91, 0x48CE, 0xEC92, 0xEC92, 0x3E58,
+    0xEC93, 0xEC94, 0x48CF, 0xEC95, 0xEC95, 0x3E59, 0xEC96, 0xEC96, 0x48D1,
+    0xEC98, 0xEC98, 0x48D2, 0xEC99, 0xEC99, 0x3E5B, 0xEC9A, 0xEC9B, 0x48D3,
+    0xEC9D, 0xEC9D, 0x48D6, 0xEC9E, 0xEC9E, 0x3E5C, 0xECA0, 0xECA0, 0x48D7,
+    0xECA3, 0xECA4, 0x48D8, 0xECA7, 0xECA8, 0x48DA, 0xECAB, 0xECAB, 0x48DC,
+    0xECAD, 0xECAD, 0x48DD, 0xECAF, 0xECAF, 0x3E65, 0xECB4, 0xECB4, 0x48DF,
+    0xECB6, 0xECB6, 0x3E6B, 0xECB9, 0xECBB, 0x48E1, 0xECCF, 0xECCF, 0x3E80,
+    0xECD4, 0xECD4, 0x3E85, 0xECDB, 0xECDC, 0x3E8C, 0xECDE, 0xECDE, 0x48E4,
+    0xECDF, 0xECE1, 0x3E8F, 0xECE5, 0xECE5, 0x3E95, 0xECF0, 0xECF0, 0x3EA0,
+    0xECF2, 0xECF2, 0x3EA2, 0xECF5, 0xECF5, 0x3EA5, 0xECFC, 0xECFC, 0x3EAC,
+    0xED04, 0xED04, 0x48E7, 0xED07, 0xED07, 0x48E8, 0xED0A, 0xED0A, 0x48EA,
+    0xED0C, 0xED11, 0x48EB, 0xED13, 0xED13, 0x48F1, 0xED15, 0xED17, 0x48F2,
+    0xED18, 0xED18, 0x3EBA, 0xED1A, 0xED1A, 0x48F5, 0xED1C, 0xED1C, 0x48F6,
+    0xED1D, 0xED1D, 0x3EBD, 0xED1E, 0xED1E, 0x48F7, 0xED22, 0xED22, 0x48F8,
+    0xED24, 0xED25, 0x3EC2, 0xED26, 0xED27, 0x48F9, 0xED29, 0xED29, 0x3EC5,
+    0xED2A, 0xED2A, 0x48FB, 0xED2C, 0xED2C, 0x3EC7, 0xED2D, 0xED2D, 0x48FC,
+    0xED3B, 0xED3B, 0x3ECF, 0xED3D, 0xED3D, 0x4904, 0xED41, 0xED42, 0x4906,
+    0xED45, 0xED45, 0x4908, 0xED47, 0xED47, 0x3ED5, 0xED4A, 0xED4B, 0x4909,
+    0xED4D, 0xED4E, 0x490B, 0xED4F, 0xED4F, 0x3EDA, 0xED51, 0xED51, 0x490D,
+    0xED52, 0xED52, 0x3EDC, 0xED53, 0xED54, 0x490E, 0xED57, 0xED58, 0x4910,
+    0xED5F, 0xED5F, 0x3EE5, 0xED62, 0xED62, 0x3EE8, 0xED6B, 0xED6B, 0x3EF1,
+    0xED71, 0xED71, 0x4912, 0xED72, 0xED72, 0x3EF7, 0xED75, 0xED75, 0x4913,
+    0xED77, 0xED77, 0x4915, 0xED78, 0xED78, 0x3EFA, 0xED7A, 0xED7A, 0x4916,
+    0xED81, 0xED81, 0x4917, 0xED84, 0xED85, 0x3F04, 0xED86, 0xED86, 0x4918,
+    0xED88, 0xED88, 0x3F07, 0xED89, 0xED8A, 0x4919, 0xED8B, 0xED8B, 0x3F08,
+    0xED8E, 0xED8E, 0x3F0B, 0xED91, 0xED91, 0x3F0E, 0xEDA6, 0xEDA6, 0x491C,
+    0xEDC6, 0xEDC6, 0x3F41, 0xEDCF, 0xEDCF, 0x3F4A, 0xEDD1, 0xEDD1, 0x491E,
+    0xEDD7, 0xEDD7, 0x491F, 0xEDDA, 0xEDDA, 0x3F53, 0xEDDB, 0xEDDB, 0x4920,
+    0xEDDD, 0xEDDD, 0x4921, 0xEDE1, 0xEDE1, 0x3F58, 0xEDED, 0xEDED, 0x3F64,
+    0xEE08, 0xEE08, 0x3F7E, 0xEE11, 0xEE11, 0x3F87, 0xEE15, 0xEE15, 0x4925,
+    0xEE1B, 0xEE1B, 0x4926, 0xEE20, 0xEE20, 0x3F94, 0xEE22, 0xEE22, 0x4927,
+    0xEE2A, 0xEE2A, 0x3F9D, 0xEE30, 0xEE30, 0x4928, 0xEE31, 0xEE31, 0x3FA3,
+    0xEE34, 0xEE34, 0x3FA6, 0xEE48, 0xEE48, 0x4929, 0xEE56, 0xEE56, 0x492A,
+    0xEE5B, 0xEE5B, 0x492B, 0xEE5D, 0xEE5D, 0x3FCC, 0xEE60, 0xEE60, 0x492C,
+    0xEE64, 0xEE64, 0x3FD2, 0xEE6A, 0xEE6A, 0x3FD8, 0xEE76, 0xEE76, 0x3FE4,
+    0xEE7C, 0xEE7C, 0x3FEA, 0xEE7E, 0xEE7E, 0x492D, 0xEE91, 0xEE91, 0x3FFD,
+    0xEE9C, 0xEE9C, 0x492F, 0xEEA1, 0xEEA6, 0x4931, 0xEEA7, 0xEEA7, 0x43B4,
+    0xEEA8, 0xEEAA, 0x4937, 0xEEAC, 0xEEB1, 0x493A, 0xEEB4, 0xEEB4, 0x4942,
+    0xEEB7, 0xEEB7, 0x4945, 0xF303, 0xF318, 0x44C9, 0xF325, 0xF325, 0x496D,
+    0xF327, 0xF327, 0x496F, 0xF344, 0xF344, 0x498C, 0xF346, 0xF346, 0x498E,
+    0xF34A, 0xF34B, 0x499C, 0xF3A0, 0xF3A1, 0x4534, 0xF3AC, 0xF3AC, 0x453B,
+    0xF3F0, 0xF3F0, 0x4575, 0xF3F9, 0xF3FA, 0x457C, 0xF3FC, 0xF3FC, 0x457F,
+    0xF408, 0xF40B, 0x4589, 0xF43D, 0xF43D, 0x45B5, 0xF440, 0xF442, 0x430B,
+    0xF444, 0xF444, 0x430F, 0xF446, 0xF446, 0x4311, 0xF448, 0xF449, 0x4313,
+    0xF44B, 0xF44B, 0x4316, 0xF44D, 0xF44D, 0x4318, 0xF450, 0xF452, 0x431B,
+    0xF454, 0xF456, 0x431F, 0xF457, 0xF457, 0x45B7, 0xF45A, 0xF45A, 0x4325,
+    0xF45B, 0xF45B, 0x45B8, 0xF45C, 0xF45F, 0x4327, 0xF461, 0xF463, 0x432C,
+    0xF465, 0xF466, 0x4330, 0xF469, 0xF469, 0x4334, 0xF46C, 0xF46D, 0x4337,
+    0xF46E, 0xF46E, 0x45B9, 0xF46F, 0xF46F, 0x433A, 0xF474, 0xF474, 0x45BA,
+    0xF477, 0xF477, 0x45BB, 0xF478, 0xF478, 0x4343, 0xF479, 0xF479, 0x45BC,
+    0xF47B, 0xF47B, 0x45BD, 0xF47C, 0xF47E, 0x4347, 0xF480, 0xF481, 0x434B,
+    0xF483, 0xF483, 0x45BE, 0xF484, 0xF485, 0x434F, 0xF488, 0xF488, 0x4353,
+    0xF48B, 0xF48B, 0x4356, 0xF48D, 0xF490, 0x4358, 0xF491, 0xF491, 0x45BF,
+    0xF497, 0xF498, 0x4362, 0xF49B, 0xF49B, 0x4366, 0xF49E, 0xF49E, 0x4369,
+    0xF4A4, 0xF4A6, 0x436F, 0xF4A7, 0xF4A7, 0x45C1, 0xF4A9, 0xF4AA, 0x4374,
+    0xF4AD, 0xF4AD, 0x4378, 0xF4AF, 0xF4B0, 0x437A, 0xF4B2, 0xF4B2, 0x45C3,
+    0xF4B3, 0xF4B4, 0x437E, 0xF4B7, 0xF4B7, 0x4382, 0xF4BA, 0xF4C0, 0x4385,
+    0xF4C1, 0xF4C1, 0x45C4, 0xF4C3, 0xF4C5, 0x45C5, 0xF4C7, 0xF4CA, 0x45C9,
+    0xF4CC, 0xF4CF, 0x45CE, 0xF4D1, 0xF4D5, 0x45D2, 0xF4D7, 0xF4D7, 0x45D8,
+    0xF4D9, 0xF4DA, 0x45DA, 0xF4DB, 0xF4DC, 0x438C, 0xF4DD, 0xF4DE, 0x45DC,
+    0xF4DF, 0xF4DF, 0x438E, 0xF4E0, 0xF4E0, 0x45DE, 0xF4E2, 0xF4E2, 0x45DF,
+    0xF4E3, 0xF4E3, 0x4390, 0xF4E4, 0xF4E4, 0x45E0, 0xF4E5, 0xF4E5, 0x4391,
+    0xF4E6, 0xF4E6, 0x45E1, 0xF4E7, 0xF4E9, 0x4392, 0xF4EF, 0xF4EF, 0x45E5,
+    0xF4F2, 0xF4F2, 0x4397, 0xF4F3, 0xF4F3, 0x45E8, 0xF4F8, 0xF4F8, 0x45EB,
+    0xF4FC, 0xF4FC, 0x45EE, 0xF4FE, 0xF4FF, 0x45F0, 0xF500, 0xF501, 0x45F2,
+    0xF503, 0xF503, 0x45F4, 0xF505, 0xF505, 0x45F6, 0xF507, 0xF511, 0x45F8,
+    0xF513, 0xF516, 0x4604, 0xF518, 0xF51D, 0x4609, 0xF51F, 0xF526, 0x4610,
+    0xF52A, 0xF52A, 0x461B, 0xF533, 0xF534, 0x4624, 0xF53A, 0xF53B, 0x44E1,
+    0xF53D, 0xF53D, 0x44E4, 0xF54E, 0xF54E, 0x44F5, 0xF553, 0xF553, 0x44FA,
+    0xF556, 0xF556, 0x44FC, 0xF559, 0xF55A, 0x44FF, 0xF55E, 0xF55E, 0x4504,
+    0xF565, 0xF565, 0x450B, 0xF56B, 0xF56B, 0x4511, 0xF572, 0xF572, 0x4518,
+    0xF694, 0xF694, 0x467C, 0xF69E, 0xF69E, 0x4686, 0xF6AD, 0xF6AD, 0x4694,
+    0xF6B0, 0xF6B0, 0x4697, 0xF7E5, 0xF7E6, 0x36AF, 0xF7E8, 0xF7E8, 0x36B2,
+    0xF7EA, 0xF7EB, 0x36B4, 0xF7ED, 0xF7EE, 0x36B7, 0xFA0C, 0xFA0C, 0x0274,
+    0xFA0D, 0xFA0D, 0x2381, 0xFE30, 0xFE30, 0x006D, 0xFE31, 0xFE31, 0x007A,
+    0xFE33, 0xFE33, 0x35AF, 0xFE34, 0xFE34, 0x35B1, 0xFE35, 0xFE36, 0x0082,
+    0xFE37, 0xFE38, 0x0086, 0xFE39, 0xFE3A, 0x008A, 0xFE3B, 0xFE3C, 0x008E,
+    0xFE3D, 0xFE3E, 0x0092, 0xFE3F, 0xFE40, 0x0096, 0xFE41, 0xFE42, 0x009A,
+    0xFE43, 0xFE44, 0x009E, 0xFE49, 0xFE4A, 0x00C7, 0xFE4B, 0xFE4C, 0x00CB,
+    0xFE4D, 0xFE4E, 0x00C9, 0xFE4F, 0xFE4F, 0x35B2, 0xFE50, 0xFE50, 0x0070,
+    0xFE52, 0xFE52, 0x0072, 0xFE54, 0xFE57, 0x0074, 0xFE59, 0xFE5E, 0x00A0,
+    0xFE5F, 0xFE61, 0x00CD, 0xFE62, 0xFE66, 0x00DF, 0xFE69, 0xFE6B, 0x010C,
+    0xFF01, 0xFF01, 0x006C, 0xFF02, 0xFF02, 0x36E4, 0xFF03, 0xFF03, 0x00AE,
+    0xFF04, 0xFF04, 0x0103, 0xFF05, 0xFF05, 0x0108, 0xFF06, 0xFF06, 0x00AF,
+    0xFF07, 0xFF07, 0x36E3, 0xFF08, 0xFF09, 0x0080, 0xFF0A, 0xFF0A, 0x00B0,
+    0xFF0B, 0xFF0B, 0x00D0, 0xFF0C, 0xFF0C, 0x0064, 0xFF0D, 0xFF0D, 0x00D1,
+    0xFF0E, 0xFF0E, 0x0067, 0xFF0F, 0xFF0F, 0x0101, 0xFF10, 0xFF19, 0x014D,
+    0xFF1A, 0xFF1A, 0x006A, 0xFF1B, 0xFF1B, 0x0069, 0xFF1C, 0xFF1C, 0x00D6,
+    0xFF1D, 0xFF1D, 0x00D8, 0xFF1E, 0xFF1E, 0x00D7, 0xFF1F, 0xFF1F, 0x006B,
+    0xFF20, 0xFF20, 0x0109, 0xFF21, 0xFF3A, 0x016D, 0xFF3B, 0xFF3B, 0x35BE,
+    0xFF3C, 0xFF3C, 0x0102, 0xFF3D, 0xFF3D, 0x35BF, 0xFF3E, 0xFF3E, 0x35B4,
+    0xFF3F, 0xFF3F, 0x00C5, 0xFF41, 0xFF5A, 0x0187, 0xFF5B, 0xFF5B, 0x0084,
+    0xFF5C, 0xFF5C, 0x0078, 0xFF5D, 0xFF5D, 0x0085, 0xFF64, 0xFF64, 0x0071,
+    0xFFE2, 0xFFE2, 0x36E1, 0xFFE4, 0xFFE4, 0x36E2,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-V_3.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-V_3.cpp
new file mode 100644
index 0000000..eed5e1f
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-V_3.cpp
@@ -0,0 +1,13 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniCNS_UCS2_V_3[13 * 3] = {
+    0x2013, 0x2013, 0x0078, 0x2014, 0x2014, 0x007A, 0x2025, 0x2025, 0x006D,
+    0x3008, 0x3009, 0x0096, 0x300A, 0x300B, 0x0092, 0x300C, 0x300D, 0x009A,
+    0x300E, 0x300F, 0x009E, 0x3010, 0x3011, 0x008E, 0x3014, 0x3015, 0x008A,
+    0xFE4F, 0xFE4F, 0x35B1, 0xFF08, 0xFF09, 0x0082, 0xFF5B, 0xFF5B, 0x0086,
+    0xFF5D, 0xFF5D, 0x0087,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp
new file mode 100644
index 0000000..d29a725
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp
@@ -0,0 +1,3651 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_UniCNS_UTF16_H_0[14557 * 2] = {

+    0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,

+    0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,

+    0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,

+    0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,

+    0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,

+    0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,

+    0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,

+    0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,

+    0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,

+    0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,

+    0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,

+    0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,

+    0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,

+    0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,

+    0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,

+    0x005C, 0x003D, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,

+    0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,

+    0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,

+    0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,

+    0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,

+    0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,

+    0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,

+    0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,

+    0x007C, 0x005D, 0x007D, 0x005E, 0x007E, 0x005F, 0x00A2, 0x0106,

+    0x00A3, 0x0107, 0x00A5, 0x0104, 0x00A7, 0x00B2, 0x00A8, 0x35B3,

+    0x00AC, 0x36E1, 0x00AF, 0x00C3, 0x00B0, 0x0118, 0x00B1, 0x00D4,

+    0x00B7, 0x0073, 0x00D7, 0x00D2, 0x00F7, 0x00D3, 0x02C6, 0x35B4,

+    0x02C7, 0x01F8, 0x02CA, 0x01F7, 0x02CB, 0x01F9, 0x02CD, 0x00C6,

+    0x02D9, 0x01F6, 0x0308, 0x35B3, 0x0391, 0x01A1, 0x0392, 0x01A2,

+    0x0393, 0x01A3, 0x0394, 0x01A4, 0x0395, 0x01A5, 0x0396, 0x01A6,

+    0x0397, 0x01A7, 0x0398, 0x01A8, 0x0399, 0x01A9, 0x039A, 0x01AA,

+    0x039B, 0x01AB, 0x039C, 0x01AC, 0x039D, 0x01AD, 0x039E, 0x01AE,

+    0x039F, 0x01AF, 0x03A0, 0x01B0, 0x03A1, 0x01B1, 0x03A3, 0x01B2,

+    0x03A4, 0x01B3, 0x03A5, 0x01B4, 0x03A6, 0x01B5, 0x03A7, 0x01B6,

+    0x03A8, 0x01B7, 0x03A9, 0x01B8, 0x03B1, 0x01B9, 0x03B2, 0x01BA,

+    0x03B3, 0x01BB, 0x03B4, 0x01BC, 0x03B5, 0x01BD, 0x03B6, 0x01BE,

+    0x03B7, 0x01BF, 0x03B8, 0x01C0, 0x03B9, 0x01C1, 0x03BA, 0x01C2,

+    0x03BB, 0x01C3, 0x03BC, 0x01C4, 0x03BD, 0x01C5, 0x03BE, 0x01C6,

+    0x03BF, 0x01C7, 0x03C0, 0x01C8, 0x03C1, 0x01C9, 0x03C3, 0x01CA,

+    0x03C4, 0x01CB, 0x03C5, 0x01CC, 0x03C6, 0x01CD, 0x03C7, 0x01CE,

+    0x03C8, 0x01CF, 0x03C9, 0x01D0, 0x0401, 0x3670, 0x0410, 0x366A,

+    0x0411, 0x366B, 0x0412, 0x366C, 0x0413, 0x366D, 0x0414, 0x366E,

+    0x0415, 0x366F, 0x0416, 0x3671, 0x0417, 0x3672, 0x0418, 0x3673,

+    0x0419, 0x3674, 0x041A, 0x3675, 0x041B, 0x3676, 0x041C, 0x3677,

+    0x041D, 0x3678, 0x041E, 0x3679, 0x041F, 0x367A, 0x0420, 0x367B,

+    0x0421, 0x367C, 0x0422, 0x367D, 0x0423, 0x367E, 0x0424, 0x367F,

+    0x0425, 0x3680, 0x0426, 0x3681, 0x0427, 0x3682, 0x0428, 0x3683,

+    0x0429, 0x3684, 0x042A, 0x3685, 0x042B, 0x3686, 0x042C, 0x3687,

+    0x042D, 0x3688, 0x042E, 0x3689, 0x042F, 0x368A, 0x0430, 0x368B,

+    0x0431, 0x368C, 0x0432, 0x368D, 0x0433, 0x368E, 0x0434, 0x368F,

+    0x0435, 0x3690, 0x0436, 0x3692, 0x0437, 0x3693, 0x0438, 0x3694,

+    0x0439, 0x3695, 0x043A, 0x3696, 0x043B, 0x3697, 0x043C, 0x3698,

+    0x043D, 0x3699, 0x043E, 0x369A, 0x043F, 0x369B, 0x0440, 0x369C,

+    0x0441, 0x369D, 0x0442, 0x369E, 0x0443, 0x369F, 0x0444, 0x36A0,

+    0x0445, 0x36A1, 0x0446, 0x36A2, 0x0447, 0x36A3, 0x0448, 0x36A4,

+    0x0449, 0x36A5, 0x044A, 0x36A6, 0x044B, 0x36A7, 0x044C, 0x36A8,

+    0x044D, 0x36A9, 0x044E, 0x36AA, 0x044F, 0x36AB, 0x0451, 0x3691,

+    0x2013, 0x0079, 0x2014, 0x007B, 0x2018, 0x00A6, 0x2019, 0x00A7,

+    0x201C, 0x00A8, 0x201D, 0x00A9, 0x2022, 0x0068, 0x2025, 0x006F,

+    0x2026, 0x006E, 0x2027, 0x0068, 0x2032, 0x00AD, 0x2035, 0x00AC,

+    0x203B, 0x00B1, 0x203E, 0x00C3, 0x2103, 0x010A, 0x2105, 0x00C2,

+    0x2109, 0x010B, 0x2116, 0x36E6, 0x2121, 0x36E7, 0x2160, 0x0157,

+    0x2161, 0x0158, 0x2162, 0x0159, 0x2163, 0x015A, 0x2164, 0x015B,

+    0x2165, 0x015C, 0x2166, 0x015D, 0x2167, 0x015E, 0x2168, 0x015F,

+    0x2169, 0x0160, 0x2170, 0x020E, 0x2171, 0x020F, 0x2172, 0x0210,

+    0x2173, 0x0211, 0x2174, 0x0212, 0x2175, 0x0213, 0x2176, 0x0214,

+    0x2177, 0x0215, 0x2178, 0x0216, 0x2179, 0x0217, 0x2190, 0x00F8,

+    0x2191, 0x00F5, 0x2192, 0x00F7, 0x2193, 0x00F6, 0x2196, 0x00F9,

+    0x2197, 0x00FA, 0x2198, 0x00FC, 0x2199, 0x00FB, 0x21B8, 0x36AD,

+    0x21B9, 0x36AE, 0x21E7, 0x36AC, 0x2215, 0x0101, 0x221A, 0x00D5,

+    0x221E, 0x00DC, 0x221F, 0x00E9, 0x2220, 0x00E8, 0x2223, 0x00FE,

+    0x2225, 0x00FD, 0x2229, 0x00E5, 0x222A, 0x00E6, 0x222B, 0x00ED,

+    0x222E, 0x00EE, 0x2234, 0x00F0, 0x2235, 0x00EF, 0x223C, 0x00E4,

+    0x2252, 0x00DD, 0x2260, 0x00DB, 0x2261, 0x00DE, 0x2266, 0x00D9,

+    0x2267, 0x00DA, 0x2295, 0x00F3, 0x2299, 0x00F4, 0x22A5, 0x00E7,

+    0x22BF, 0x00EA, 0x22EF, 0x006E, 0x2400, 0x0232, 0x2401, 0x0233,

+    0x2402, 0x0234, 0x2403, 0x0235, 0x2404, 0x0236, 0x2405, 0x0237,

+    0x2406, 0x0238, 0x2407, 0x0239, 0x2408, 0x023A, 0x2409, 0x023B,

+    0x240A, 0x023C, 0x240B, 0x023D, 0x240C, 0x023E, 0x240D, 0x023F,

+    0x240E, 0x0240, 0x240F, 0x0241, 0x2410, 0x0242, 0x2411, 0x0243,

+    0x2412, 0x0244, 0x2413, 0x0245, 0x2414, 0x0246, 0x2415, 0x0247,

+    0x2416, 0x0248, 0x2417, 0x0249, 0x2418, 0x024A, 0x2419, 0x024B,

+    0x241A, 0x024C, 0x241B, 0x024D, 0x241C, 0x024E, 0x241D, 0x024F,

+    0x241E, 0x0250, 0x241F, 0x0251, 0x2421, 0x0252, 0x2460, 0x01FA,

+    0x2461, 0x01FB, 0x2462, 0x01FC, 0x2463, 0x01FD, 0x2464, 0x01FE,

+    0x2465, 0x01FF, 0x2466, 0x0200, 0x2467, 0x0201, 0x2468, 0x0202,

+    0x2469, 0x0203, 0x2474, 0x0204, 0x2475, 0x0205, 0x2476, 0x0206,

+    0x2477, 0x0207, 0x2478, 0x0208, 0x2479, 0x0209, 0x247A, 0x020A,

+    0x247B, 0x020B, 0x247C, 0x020C, 0x247D, 0x020D, 0x2500, 0x0137,

+    0x2502, 0x0138, 0x250C, 0x013A, 0x2510, 0x013B, 0x2514, 0x013C,

+    0x2518, 0x013D, 0x251C, 0x0135, 0x2524, 0x0134, 0x252C, 0x0133,

+    0x2534, 0x0132, 0x253C, 0x0131, 0x2550, 0x0142, 0x2551, 0x370A,

+    0x2552, 0x36F8, 0x2553, 0x3701, 0x2554, 0x36EF, 0x2555, 0x36FA,

+    0x2556, 0x3703, 0x2557, 0x36F1, 0x2558, 0x36FE, 0x2559, 0x3707,

+    0x255A, 0x36F5, 0x255B, 0x3700, 0x255C, 0x3709, 0x255D, 0x36F7,

+    0x255E, 0x0143, 0x255F, 0x3704, 0x2560, 0x36F2, 0x2561, 0x0145,

+    0x2562, 0x3706, 0x2563, 0x36F4, 0x2564, 0x36F9, 0x2565, 0x3702,

+    0x2566, 0x36F0, 0x2567, 0x36FF, 0x2568, 0x3708, 0x2569, 0x36F6,

+    0x256A, 0x0144, 0x256B, 0x3705, 0x256C, 0x36F3, 0x256D, 0x013E,

+    0x256E, 0x013F, 0x256F, 0x0141, 0x2570, 0x0140, 0x2571, 0x014A,

+    0x2572, 0x014B, 0x2573, 0x014C, 0x2574, 0x35B0, 0x2581, 0x0122,

+    0x2582, 0x0123, 0x2583, 0x0124, 0x2584, 0x0125, 0x2585, 0x0126,

+    0x2586, 0x0127, 0x2587, 0x0128, 0x2588, 0x0129, 0x2589, 0x0130,

+    0x258A, 0x012F, 0x258B, 0x012E, 0x258C, 0x012D, 0x258D, 0x012C,

+    0x258E, 0x012B, 0x258F, 0x012A, 0x2593, 0x3710, 0x2594, 0x0136,

+    0x2595, 0x0139, 0x25A0, 0x00BE, 0x25A1, 0x00BD, 0x25B2, 0x00B7,

+    0x25B3, 0x00B6, 0x25BC, 0x00C0, 0x25BD, 0x00BF, 0x25C6, 0x00BC,

+    0x25C7, 0x00BB, 0x25CB, 0x00B4, 0x25CE, 0x00B8, 0x25CF, 0x00B5,

+    0x25E2, 0x0146, 0x25E3, 0x0147, 0x25E4, 0x0149, 0x25E5, 0x0148,

+    0x2605, 0x00BA, 0x2606, 0x00B9, 0x2609, 0x00F4, 0x2640, 0x00F1,

+    0x2641, 0x00F3, 0x2642, 0x00F2, 0x273D, 0x35C0, 0x2F00, 0x0253,

+    0x2F01, 0x0218, 0x2F02, 0x0219, 0x2F03, 0x021A, 0x2F04, 0x0254,

+    0x2F05, 0x021B, 0x2F06, 0x025A, 0x2F07, 0x021C, 0x2F08, 0x025B,

+    0x2F09, 0x025C, 0x2F0A, 0x025D, 0x2F0B, 0x025E, 0x2F0C, 0x021D,

+    0x2F0D, 0x021E, 0x2F0E, 0x021F, 0x2F0F, 0x025F, 0x2F10, 0x176E,

+    0x2F11, 0x0260, 0x2F12, 0x0262, 0x2F13, 0x0220, 0x2F14, 0x0263,

+    0x2F15, 0x176F, 0x2F16, 0x0221, 0x2F17, 0x0264, 0x2F18, 0x0265,

+    0x2F19, 0x0222, 0x2F1A, 0x1770, 0x2F1B, 0x0223, 0x2F1C, 0x0266,

+    0x2F1D, 0x0279, 0x2F1E, 0x1775, 0x2F1F, 0x027A, 0x2F20, 0x027B,

+    0x2F21, 0x0224, 0x2F22, 0x0224, 0x2F23, 0x027C, 0x2F24, 0x027D,

+    0x2F25, 0x027E, 0x2F26, 0x027F, 0x2F27, 0x0225, 0x2F28, 0x0282,

+    0x2F29, 0x0283, 0x2F2A, 0x0284, 0x2F2B, 0x0285, 0x2F2C, 0x1776,

+    0x2F2D, 0x0286, 0x2F2E, 0x0226, 0x2F2F, 0x0288, 0x2F30, 0x0289,

+    0x2F31, 0x028C, 0x2F32, 0x028D, 0x2F33, 0x0227, 0x2F34, 0x0228,

+    0x2F35, 0x0229, 0x2F36, 0x028E, 0x2F37, 0x028F, 0x2F38, 0x0290,

+    0x2F39, 0x022A, 0x2F3A, 0x022B, 0x2F3B, 0x1777, 0x2F3C, 0x02D0,

+    0x2F3D, 0x02D1, 0x2F3E, 0x02D2, 0x2F3F, 0x02D3, 0x2F40, 0x02D5,

+    0x2F41, 0x022C, 0x2F42, 0x02D6, 0x2F43, 0x02D7, 0x2F44, 0x02D8,

+    0x2F45, 0x02D9, 0x2F46, 0x022D, 0x2F47, 0x02DA, 0x2F48, 0x02DB,

+    0x2F49, 0x02DC, 0x2F4A, 0x02DD, 0x2F4B, 0x02DE, 0x2F4C, 0x02DF,

+    0x2F4D, 0x02E0, 0x2F4E, 0x178A, 0x2F4F, 0x02E1, 0x2F50, 0x02E2,

+    0x2F51, 0x02E3, 0x2F52, 0x02E4, 0x2F53, 0x178C, 0x2F54, 0x02E5,

+    0x2F55, 0x02E6, 0x2F56, 0x02E7, 0x2F57, 0x02E8, 0x2F58, 0x02E9,

+    0x2F59, 0x178D, 0x2F5A, 0x02EA, 0x2F5B, 0x02EB, 0x2F5C, 0x02EC,

+    0x2F5D, 0x02ED, 0x2F5E, 0x0356, 0x2F5F, 0x0357, 0x2F60, 0x0358,

+    0x2F61, 0x0359, 0x2F62, 0x035A, 0x2F63, 0x035B, 0x2F64, 0x035C,

+    0x2F65, 0x035E, 0x2F66, 0x0362, 0x2F67, 0x022E, 0x2F68, 0x022F,

+    0x2F69, 0x0363, 0x2F6A, 0x0364, 0x2F6B, 0x0365, 0x2F6C, 0x0366,

+    0x2F6D, 0x0367, 0x2F6E, 0x0368, 0x2F6F, 0x0369, 0x2F70, 0x036A,

+    0x2F71, 0x17B2, 0x2F72, 0x036B, 0x2F73, 0x036C, 0x2F74, 0x036D,

+    0x2F75, 0x03F6, 0x2F76, 0x03F7, 0x2F77, 0x03F8, 0x2F78, 0x03F9,

+    0x2F79, 0x1812, 0x2F7A, 0x03FA, 0x2F7B, 0x03FB, 0x2F7C, 0x03FC,

+    0x2F7D, 0x03FE, 0x2F7E, 0x03FF, 0x2F7F, 0x0400, 0x2F80, 0x0401,

+    0x2F81, 0x0402, 0x2F82, 0x0405, 0x2F83, 0x0406, 0x2F84, 0x0407,

+    0x2F85, 0x0408, 0x2F86, 0x0409, 0x2F87, 0x040A, 0x2F88, 0x040B,

+    0x2F89, 0x040C, 0x2F8A, 0x040D, 0x2F8B, 0x1813, 0x2F8C, 0x1818,

+    0x2F8D, 0x040F, 0x2F8E, 0x0410, 0x2F8F, 0x0411, 0x2F90, 0x0412,

+    0x2F91, 0x1819, 0x2F92, 0x0508, 0x2F93, 0x0509, 0x2F94, 0x050A,

+    0x2F95, 0x050B, 0x2F96, 0x050C, 0x2F97, 0x050D, 0x2F98, 0x18E7,

+    0x2F99, 0x050E, 0x2F9A, 0x050F, 0x2F9B, 0x0510, 0x2F9C, 0x0511,

+    0x2F9D, 0x0512, 0x2F9E, 0x0513, 0x2F9F, 0x0514, 0x2FA0, 0x0515,

+    0x2FA1, 0x0230, 0x2FA2, 0x051B, 0x2FA3, 0x0520, 0x2FA4, 0x0521,

+    0x2FA5, 0x0522, 0x2FA6, 0x0696, 0x2FA7, 0x0697, 0x2FA8, 0x0698,

+    0x2FA9, 0x0699, 0x2FAA, 0x0231, 0x2FAB, 0x069F, 0x2FAC, 0x06A0,

+    0x2FAE, 0x06A2, 0x2FAF, 0x0826, 0x2FB0, 0x0827, 0x2FB1, 0x0828,

+    0x2FB2, 0x0829, 0x2FB3, 0x082A, 0x2FB4, 0x082B, 0x2FB5, 0x082C,

+    0x2FB6, 0x082D, 0x2FB7, 0x082E, 0x2FB8, 0x082F, 0x2FB9, 0x0830,

+    0x2FBA, 0x09F5, 0x2FBB, 0x09F6, 0x2FBC, 0x09F7, 0x2FBD, 0x1E33,

+    0x2FBE, 0x09F8, 0x2FBF, 0x1E34, 0x2FC0, 0x09F9, 0x2FC1, 0x09FA,

+    0x2FC2, 0x0BE1, 0x2FC3, 0x0BE2, 0x2FC4, 0x0BE3, 0x2FC5, 0x0BE4,

+    0x2FC6, 0x0BE5, 0x2FC7, 0x0BE6, 0x2FC8, 0x0DBB, 0x2FC9, 0x0DBC,

+    0x2FCA, 0x0DBD, 0x2FCB, 0x2360, 0x2FCC, 0x2612, 0x2FCD, 0x0F7B,

+    0x2FCE, 0x0F7C, 0x2FCF, 0x0F7D, 0x2FD0, 0x1100, 0x2FD1, 0x1101,

+    0x2FD2, 0x1289, 0x2FD3, 0x13B2, 0x2FD4, 0x13B3, 0x2FD5, 0x2F0D,

+    0x3000, 0x0063, 0x3001, 0x0065, 0x3002, 0x0066, 0x3003, 0x00B3,

+    0x3005, 0x35BA, 0x3006, 0x35BB, 0x3007, 0x35BC, 0x3008, 0x0094,

+    0x3009, 0x0095, 0x300A, 0x0090, 0x300B, 0x0091, 0x300C, 0x0098,

+    0x300D, 0x0099, 0x300E, 0x009C, 0x300F, 0x009D, 0x3010, 0x008C,

+    0x3011, 0x008D, 0x3012, 0x0105, 0x3014, 0x0088, 0x3015, 0x0089,

+    0x301D, 0x00AA, 0x301E, 0x00AB, 0x3021, 0x0161, 0x3022, 0x0162,

+    0x3023, 0x0163, 0x3024, 0x0164, 0x3025, 0x0165, 0x3026, 0x0166,

+    0x3027, 0x0167, 0x3028, 0x0168, 0x3029, 0x0169, 0x3038, 0x016A,

+    0x3039, 0x016B, 0x303A, 0x016C, 0x3041, 0x35C1, 0x3042, 0x35C2,

+    0x3043, 0x35C3, 0x3044, 0x35C4, 0x3045, 0x35C5, 0x3046, 0x35C6,

+    0x3047, 0x35C7, 0x3048, 0x35C8, 0x3049, 0x35C9, 0x304A, 0x35CA,

+    0x304B, 0x35CB, 0x304C, 0x35CC, 0x304D, 0x35CD, 0x304E, 0x35CE,

+    0x304F, 0x35CF, 0x3050, 0x35D0, 0x3051, 0x35D1, 0x3052, 0x35D2,

+    0x3053, 0x35D3, 0x3054, 0x35D4, 0x3055, 0x35D5, 0x3056, 0x35D6,

+    0x3057, 0x35D7, 0x3058, 0x35D8, 0x3059, 0x35D9, 0x305A, 0x35DA,

+    0x305B, 0x35DB, 0x305C, 0x35DC, 0x305D, 0x35DD, 0x305E, 0x35DE,

+    0x305F, 0x35DF, 0x3060, 0x35E0, 0x3061, 0x35E1, 0x3062, 0x35E2,

+    0x3063, 0x35E3, 0x3064, 0x35E4, 0x3065, 0x35E5, 0x3066, 0x35E6,

+    0x3067, 0x35E7, 0x3068, 0x35E8, 0x3069, 0x35E9, 0x306A, 0x35EA,

+    0x306B, 0x35EB, 0x306C, 0x35EC, 0x306D, 0x35ED, 0x306E, 0x35EE,

+    0x306F, 0x35EF, 0x3070, 0x35F0, 0x3071, 0x35F1, 0x3072, 0x35F2,

+    0x3073, 0x35F3, 0x3074, 0x35F4, 0x3075, 0x35F5, 0x3076, 0x35F6,

+    0x3077, 0x35F7, 0x3078, 0x35F8, 0x3079, 0x35F9, 0x307A, 0x35FA,

+    0x307B, 0x35FB, 0x307C, 0x35FC, 0x307D, 0x35FD, 0x307E, 0x35FE,

+    0x307F, 0x35FF, 0x3080, 0x3600, 0x3081, 0x3601, 0x3082, 0x3602,

+    0x3083, 0x3603, 0x3084, 0x3604, 0x3085, 0x3605, 0x3086, 0x3606,

+    0x3087, 0x3607, 0x3088, 0x3608, 0x3089, 0x3609, 0x308A, 0x360A,

+    0x308B, 0x360B, 0x308C, 0x360C, 0x308D, 0x360D, 0x308E, 0x360E,

+    0x308F, 0x360F, 0x3090, 0x3610, 0x3091, 0x3611, 0x3092, 0x3612,

+    0x3093, 0x3613, 0x309D, 0x35B7, 0x309E, 0x35B8, 0x30A1, 0x3614,

+    0x30A2, 0x3615, 0x30A3, 0x3616, 0x30A4, 0x3617, 0x30A5, 0x3618,

+    0x30A6, 0x3619, 0x30A7, 0x361A, 0x30A8, 0x361B, 0x30A9, 0x361C,

+    0x30AA, 0x361D, 0x30AB, 0x361E, 0x30AC, 0x361F, 0x30AD, 0x3620,

+    0x30AE, 0x3621, 0x30AF, 0x3622, 0x30B0, 0x3623, 0x30B1, 0x3624,

+    0x30B2, 0x3625, 0x30B3, 0x3626, 0x30B4, 0x3627, 0x30B5, 0x3628,

+    0x30B6, 0x3629, 0x30B7, 0x362A, 0x30B8, 0x362B, 0x30B9, 0x362C,

+    0x30BA, 0x362D, 0x30BB, 0x362E, 0x30BC, 0x362F, 0x30BD, 0x3630,

+    0x30BE, 0x3631, 0x30BF, 0x3632, 0x30C0, 0x3633, 0x30C1, 0x3634,

+    0x30C2, 0x3635, 0x30C3, 0x3636, 0x30C4, 0x3637, 0x30C5, 0x3638,

+    0x30C6, 0x3639, 0x30C7, 0x363A, 0x30C8, 0x363B, 0x30C9, 0x363C,

+    0x30CA, 0x363D, 0x30CB, 0x363E, 0x30CC, 0x363F, 0x30CD, 0x3640,

+    0x30CE, 0x3641, 0x30CF, 0x3642, 0x30D0, 0x3643, 0x30D1, 0x3644,

+    0x30D2, 0x3645, 0x30D3, 0x3646, 0x30D4, 0x3647, 0x30D5, 0x3648,

+    0x30D6, 0x3649, 0x30D7, 0x364A, 0x30D8, 0x364B, 0x30D9, 0x364C,

+    0x30DA, 0x364D, 0x30DB, 0x364E, 0x30DC, 0x364F, 0x30DD, 0x3650,

+    0x30DE, 0x3651, 0x30DF, 0x3652, 0x30E0, 0x3653, 0x30E1, 0x3654,

+    0x30E2, 0x3655, 0x30E3, 0x3656, 0x30E4, 0x3657, 0x30E5, 0x3658,

+    0x30E6, 0x3659, 0x30E7, 0x365A, 0x30E8, 0x365B, 0x30E9, 0x365C,

+    0x30EA, 0x365D, 0x30EB, 0x365E, 0x30EC, 0x365F, 0x30ED, 0x3660,

+    0x30EE, 0x3661, 0x30EF, 0x3662, 0x30F0, 0x3663, 0x30F1, 0x3664,

+    0x30F2, 0x3665, 0x30F3, 0x3666, 0x30F4, 0x3667, 0x30F5, 0x3668,

+    0x30F6, 0x3669, 0x30FC, 0x35BD, 0x30FD, 0x35B5, 0x30FE, 0x35B6,

+    0x3105, 0x01D1, 0x3106, 0x01D2, 0x3107, 0x01D3, 0x3108, 0x01D4,

+    0x3109, 0x01D5, 0x310A, 0x01D6, 0x310B, 0x01D7, 0x310C, 0x01D8,

+    0x310D, 0x01D9, 0x310E, 0x01DA, 0x310F, 0x01DB, 0x3110, 0x01DC,

+    0x3111, 0x01DD, 0x3112, 0x01DE, 0x3113, 0x01DF, 0x3114, 0x01E0,

+    0x3115, 0x01E1, 0x3116, 0x01E2, 0x3117, 0x01E3, 0x3118, 0x01E4,

+    0x3119, 0x01E5, 0x311A, 0x01E6, 0x311B, 0x01E7, 0x311C, 0x01E8,

+    0x311D, 0x01E9, 0x311E, 0x01EA, 0x311F, 0x01EB, 0x3120, 0x01EC,

+    0x3121, 0x01ED, 0x3122, 0x01EE, 0x3123, 0x01EF, 0x3124, 0x01F0,

+    0x3125, 0x01F1, 0x3126, 0x01F2, 0x3127, 0x01F3, 0x3128, 0x01F4,

+    0x3129, 0x01F5, 0x3231, 0x36E5, 0x32A3, 0x00C1, 0x338E, 0x0115,

+    0x338F, 0x0116, 0x339C, 0x0110, 0x339D, 0x0111, 0x339E, 0x0112,

+    0x33A1, 0x0114, 0x33C4, 0x0117, 0x33CE, 0x0113, 0x33D1, 0x00EC,

+    0x33D2, 0x00EB, 0x33D5, 0x010F, 0x361D, 0x36B7, 0x4491, 0x36B4,

+    0x4E00, 0x0253, 0x4E01, 0x0255, 0x4E03, 0x0256, 0x4E07, 0x1771,

+    0x4E08, 0x0269, 0x4E09, 0x0267, 0x4E0A, 0x026A, 0x4E0B, 0x0268,

+    0x4E0C, 0x1772, 0x4E0D, 0x0294, 0x4E0E, 0x177A, 0x4E0F, 0x1778,

+    0x4E10, 0x0293, 0x4E11, 0x0292, 0x4E14, 0x02F2, 0x4E15, 0x02F1,

+    0x4E16, 0x02F0, 0x4E18, 0x02F3, 0x4E19, 0x02EF, 0x4E1E, 0x036E,

+    0x4E1F, 0x036F, 0x4E26, 0x0528, 0x4E28, 0x0218, 0x4E2B, 0x026B,

+    0x4E2D, 0x0295, 0x4E2E, 0x177B, 0x4E30, 0x0296, 0x4E31, 0x178E,

+    0x4E32, 0x0415, 0x4E33, 0x18F4, 0x4E36, 0x0219, 0x4E38, 0x026C,

+    0x4E39, 0x0297, 0x4E3B, 0x02F4, 0x4E3C, 0x178F, 0x4E3F, 0x021A,

+    0x4E41, 0x36AF, 0x4E42, 0x176C, 0x4E43, 0x0257, 0x4E45, 0x026E,

+    0x4E47, 0x1773, 0x4E48, 0x026F, 0x4E4B, 0x0298, 0x4E4D, 0x02F5,

+    0x4E4E, 0x02F7, 0x4E4F, 0x02F6, 0x4E52, 0x0370, 0x4E53, 0x0371,

+    0x4E56, 0x0529, 0x4E58, 0x0831, 0x4E59, 0x0254, 0x4E5A, 0x36B1,

+    0x4E5C, 0x176D, 0x4E5D, 0x0258, 0x4E5E, 0x0271, 0x4E5F, 0x0270,

+    0x4E69, 0x0372, 0x4E73, 0x052A, 0x4E7E, 0x09FB, 0x4E7F, 0x1E35,

+    0x4E82, 0x0DBE, 0x4E83, 0x2361, 0x4E84, 0x2362, 0x4E85, 0x021B,

+    0x4E86, 0x0259, 0x4E88, 0x029A, 0x4E8B, 0x052B, 0x4E8C, 0x025A,

+    0x4E8D, 0x1774, 0x4E8E, 0x0272, 0x4E91, 0x029B, 0x4E92, 0x029D,

+    0x4E93, 0x177C, 0x4E94, 0x029E, 0x4E95, 0x029C, 0x4E99, 0x0373,

+    0x4E9B, 0x052C, 0x4E9E, 0x052D, 0x4E9F, 0x06A3, 0x4EA0, 0x021C,

+    0x4EA1, 0x0273, 0x4EA2, 0x029F, 0x4EA4, 0x0374, 0x4EA5, 0x0376,

+    0x4EA6, 0x0375, 0x4EA8, 0x0416, 0x4EAB, 0x052E, 0x4EAC, 0x052F,

+    0x4EAD, 0x06A4, 0x4EAE, 0x06A5, 0x4EB3, 0x0832, 0x4EB6, 0x2363,

+    0x4EB9, 0x3377, 0x4EBA, 0x025B, 0x4EC0, 0x02A1, 0x4EC1, 0x02A0,

+    0x4EC2, 0x177D, 0x4EC3, 0x02A2, 0x4EC4, 0x02A8, 0x4EC6, 0x02A3,

+    0x4EC7, 0x02A4, 0x4EC8, 0x177F, 0x4EC9, 0x177E, 0x4ECA, 0x02A6,

+    0x4ECB, 0x02A7, 0x4ECD, 0x02A5, 0x4ED4, 0x02FA, 0x4ED5, 0x02FB,

+    0x4ED6, 0x02FC, 0x4ED7, 0x02FD, 0x4ED8, 0x02F9, 0x4ED9, 0x0300,

+    0x4EDA, 0x1795, 0x4EDC, 0x1791, 0x4EDD, 0x1794, 0x4EDE, 0x0301,

+    0x4EDF, 0x0311, 0x4EE1, 0x1793, 0x4EE3, 0x02FE, 0x4EE4, 0x02FF,

+    0x4EE5, 0x02F8, 0x4EE8, 0x1790, 0x4EE9, 0x1792, 0x4EF0, 0x0383,

+    0x4EF1, 0x17BA, 0x4EF2, 0x0380, 0x4EF3, 0x0384, 0x4EF4, 0x17C4,

+    0x4EF5, 0x17B8, 0x4EF6, 0x0381, 0x4EF7, 0x17BC, 0x4EFB, 0x0382,

+    0x4EFD, 0x0385, 0x4EFF, 0x0377, 0x4F00, 0x17BB, 0x4F01, 0x0386,

+    0x4F02, 0x17BF, 0x4F04, 0x17C3, 0x4F05, 0x17C0, 0x4F08, 0x17BD,

+    0x4F09, 0x0378, 0x4F0A, 0x037A, 0x4F0B, 0x0387, 0x4F0D, 0x037C,

+    0x4F0E, 0x17B5, 0x4F0F, 0x037F, 0x4F10, 0x037D, 0x4F11, 0x037E,

+    0x4F12, 0x17C5, 0x4F13, 0x17C2, 0x4F14, 0x17B9, 0x4F15, 0x037B,

+    0x4F18, 0x17B6, 0x4F19, 0x0379, 0x4F1D, 0x17BE, 0x4F22, 0x17C1,

+    0x4F2C, 0x17B7, 0x4F2D, 0x182F, 0x4F2F, 0x042C, 0x4F30, 0x041F,

+    0x4F33, 0x1830, 0x4F34, 0x041C, 0x4F36, 0x042E, 0x4F38, 0x0424,

+    0x4F3A, 0x0423, 0x4F3B, 0x1824, 0x4F3C, 0x0427, 0x4F3D, 0x0422,

+    0x4F3E, 0x1829, 0x4F3F, 0x1831, 0x4F41, 0x182D, 0x4F43, 0x0425,

+    0x4F46, 0x0428, 0x4F47, 0x0419, 0x4F48, 0x0431, 0x4F49, 0x1826,

+    0x4F4C, 0x1900, 0x4F4D, 0x0417, 0x4F4E, 0x042D, 0x4F4F, 0x0418,

+    0x4F50, 0x0420, 0x4F51, 0x0421, 0x4F52, 0x182B, 0x4F53, 0x1827,

+    0x4F54, 0x0426, 0x4F55, 0x041E, 0x4F56, 0x1823, 0x4F57, 0x041A,

+    0x4F58, 0x182E, 0x4F59, 0x042F, 0x4F5A, 0x0432, 0x4F5B, 0x041D,

+    0x4F5C, 0x042A, 0x4F5D, 0x0430, 0x4F5E, 0x041B, 0x4F5F, 0x182C,

+    0x4F60, 0x042B, 0x4F61, 0x1832, 0x4F62, 0x1825, 0x4F63, 0x0429,

+    0x4F64, 0x1828, 0x4F67, 0x182A, 0x4F69, 0x053D, 0x4F6A, 0x1902,

+    0x4F6B, 0x190E, 0x4F6C, 0x0535, 0x4F6E, 0x190F, 0x4F6F, 0x0530,

+    0x4F70, 0x053A, 0x4F73, 0x0533, 0x4F74, 0x18FC, 0x4F75, 0x053B,

+    0x4F76, 0x18FB, 0x4F77, 0x18FF, 0x4F78, 0x1906, 0x4F79, 0x1904,

+    0x4F7A, 0x0543, 0x4F7B, 0x053E, 0x4F7C, 0x18F6, 0x4F7D, 0x18F8,

+    0x4F7E, 0x0540, 0x4F7F, 0x0534, 0x4F80, 0x18F9, 0x4F81, 0x1905,

+    0x4F82, 0x190C, 0x4F83, 0x0539, 0x4F84, 0x18FE, 0x4F85, 0x18F7,

+    0x4F86, 0x0538, 0x4F87, 0x18FA, 0x4F88, 0x053C, 0x4F89, 0x18FD,

+    0x4F8B, 0x0537, 0x4F8D, 0x0532, 0x4F8F, 0x0541, 0x4F90, 0x1907,

+    0x4F91, 0x0542, 0x4F92, 0x190B, 0x4F94, 0x1909, 0x4F95, 0x190D,

+    0x4F96, 0x053F, 0x4F97, 0x1901, 0x4F98, 0x18F5, 0x4F9A, 0x1903,

+    0x4F9B, 0x0536, 0x4F9C, 0x1908, 0x4F9D, 0x0531, 0x4F9E, 0x190A,

+    0x4FAE, 0x06B4, 0x4FAF, 0x06A8, 0x4FB2, 0x1A5D, 0x4FB3, 0x1A65,

+    0x4FB5, 0x06A7, 0x4FB6, 0x06AF, 0x4FB7, 0x06BB, 0x4FB9, 0x1A6B,

+    0x4FBA, 0x1A69, 0x4FBB, 0x1A64, 0x4FBF, 0x06A9, 0x4FC0, 0x1A6A,

+    0x4FC1, 0x1A60, 0x4FC2, 0x06B7, 0x4FC3, 0x06AE, 0x4FC4, 0x06B6,

+    0x4FC5, 0x1A5B, 0x4FC7, 0x1A67, 0x4FC9, 0x1A5E, 0x4FCA, 0x06B2,

+    0x4FCB, 0x1A5F, 0x4FCD, 0x1A5A, 0x4FCE, 0x06B9, 0x4FCF, 0x06AC,

+    0x4FD0, 0x06B5, 0x4FD1, 0x06AB, 0x4FD3, 0x1A5C, 0x4FD4, 0x1A61,

+    0x4FD6, 0x1A68, 0x4FD7, 0x06B3, 0x4FD8, 0x06B0, 0x4FD9, 0x1A63,

+    0x4FDA, 0x06B8, 0x4FDB, 0x1A66, 0x4FDC, 0x1A62, 0x4FDD, 0x06AD,

+    0x4FDE, 0x06BA, 0x4FDF, 0x06B1, 0x4FE0, 0x06AA, 0x4FE1, 0x06A6,

+    0x4FEC, 0x1A6C, 0x4FEE, 0x084C, 0x4FEF, 0x0836, 0x4FF1, 0x0846,

+    0x4FF3, 0x084B, 0x4FF4, 0x1C24, 0x4FF5, 0x1C23, 0x4FF6, 0x1C28,

+    0x4FF7, 0x1C29, 0x4FF8, 0x0839, 0x4FFA, 0x0842, 0x4FFE, 0x084F,

+    0x5000, 0x0843, 0x5005, 0x1C1D, 0x5006, 0x083C, 0x5007, 0x1C1E,

+    0x5009, 0x0851, 0x500B, 0x0848, 0x500C, 0x0833, 0x500D, 0x0834,

+    0x500E, 0x1C31, 0x500F, 0x0A0C, 0x5011, 0x0841, 0x5012, 0x0840,

+    0x5013, 0x1C1F, 0x5014, 0x0844, 0x5015, 0x1E45, 0x5016, 0x083B,

+    0x5017, 0x1C2A, 0x5018, 0x084A, 0x5019, 0x0849, 0x501A, 0x083F,

+    0x501B, 0x1C22, 0x501C, 0x1C2B, 0x501E, 0x1C1C, 0x501F, 0x083E,

+    0x5020, 0x1C2C, 0x5021, 0x0847, 0x5022, 0x1C20, 0x5023, 0x0835,

+    0x5025, 0x0838, 0x5026, 0x0837, 0x5027, 0x1C2D, 0x5028, 0x0845,

+    0x5029, 0x083A, 0x502A, 0x084E, 0x502B, 0x0850, 0x502C, 0x1C27,

+    0x502D, 0x084D, 0x502F, 0x1C2F, 0x5030, 0x1C21, 0x5031, 0x1C30,

+    0x5033, 0x1C25, 0x5035, 0x1C2E, 0x5037, 0x1C26, 0x503C, 0x083D,

+    0x5040, 0x1E4D, 0x5041, 0x1E41, 0x5043, 0x0A00, 0x5045, 0x1E46,

+    0x5046, 0x1E4C, 0x5047, 0x09FF, 0x5048, 0x1E3F, 0x5049, 0x0A03,

+    0x504A, 0x1E43, 0x504B, 0x1E3C, 0x504C, 0x0A01, 0x504D, 0x1E40,

+    0x504E, 0x0A06, 0x504F, 0x0A0B, 0x5051, 0x1E51, 0x5053, 0x1E3B,

+    0x5055, 0x0A07, 0x5057, 0x1E50, 0x505A, 0x0A02, 0x505B, 0x1E42,

+    0x505C, 0x09FE, 0x505D, 0x1E3D, 0x505E, 0x1E39, 0x505F, 0x1E47,

+    0x5060, 0x1E3A, 0x5061, 0x1E38, 0x5062, 0x1E44, 0x5063, 0x1E4A,

+    0x5064, 0x1E4B, 0x5065, 0x0A04, 0x5068, 0x20B8, 0x5069, 0x1E48,

+    0x506A, 0x1E37, 0x506B, 0x1E49, 0x506D, 0x0A0E, 0x506E, 0x1E4E,

+    0x506F, 0x0A0D, 0x5070, 0x1E36, 0x5072, 0x1E3E, 0x5073, 0x1E4F,

+    0x5074, 0x0A09, 0x5075, 0x0A08, 0x5076, 0x0A05, 0x5077, 0x0A0A,

+    0x507A, 0x09FC, 0x507D, 0x09FD, 0x5080, 0x0BEC, 0x5082, 0x20BB,

+    0x5083, 0x20B4, 0x5085, 0x0BE9, 0x5087, 0x20BC, 0x508B, 0x20B2,

+    0x508C, 0x20B5, 0x508D, 0x0BE8, 0x508E, 0x20B6, 0x5091, 0x0BEB,

+    0x5092, 0x20BA, 0x5094, 0x20B0, 0x5095, 0x20AF, 0x5096, 0x0BED,

+    0x5098, 0x0BEE, 0x5099, 0x0BEA, 0x509A, 0x0BEF, 0x509B, 0x20AE,

+    0x509C, 0x20B9, 0x509D, 0x20B7, 0x509E, 0x20B1, 0x50A2, 0x0BE7,

+    0x50A3, 0x20B3, 0x50AC, 0x0DC5, 0x50AD, 0x0DBF, 0x50AE, 0x2367,

+    0x50AF, 0x0DC8, 0x50B0, 0x236D, 0x50B1, 0x2370, 0x50B2, 0x0DC1,

+    0x50B3, 0x0DC2, 0x50B4, 0x236A, 0x50B5, 0x0DC0, 0x50B6, 0x2373,

+    0x50B7, 0x0DC6, 0x50B8, 0x2374, 0x50BA, 0x236F, 0x50BB, 0x0DC7,

+    0x50BD, 0x2364, 0x50BE, 0x0DC4, 0x50BF, 0x2365, 0x50C1, 0x236E,

+    0x50C2, 0x236C, 0x50C4, 0x2368, 0x50C5, 0x0DC3, 0x50C6, 0x2366,

+    0x50C7, 0x0DC9, 0x50C8, 0x236B, 0x50C9, 0x2372, 0x50CA, 0x2369,

+    0x50CB, 0x2371, 0x50CE, 0x0F88, 0x50CF, 0x0F85, 0x50D1, 0x0F86,

+    0x50D3, 0x261C, 0x50D4, 0x2614, 0x50D5, 0x0F84, 0x50D6, 0x0F81,

+    0x50D7, 0x2615, 0x50DA, 0x0F83, 0x50DB, 0x2618, 0x50DD, 0x261A,

+    0x50E0, 0x2621, 0x50E3, 0x2620, 0x50E4, 0x261B, 0x50E5, 0x0F80,

+    0x50E6, 0x2613, 0x50E7, 0x0F7E, 0x50E8, 0x2616, 0x50E9, 0x0F89,

+    0x50EA, 0x2619, 0x50EC, 0x261D, 0x50ED, 0x0F82, 0x50EE, 0x0F7F,

+    0x50EF, 0x261F, 0x50F0, 0x261E, 0x50F1, 0x0F87, 0x50F3, 0x2617,

+    0x50F5, 0x1105, 0x50F6, 0x2883, 0x50F8, 0x2880, 0x50F9, 0x1106,

+    0x50FB, 0x1104, 0x50FD, 0x2887, 0x50FE, 0x2884, 0x50FF, 0x287D,

+    0x5100, 0x1103, 0x5102, 0x1107, 0x5103, 0x287E, 0x5104, 0x1102,

+    0x5105, 0x110A, 0x5106, 0x2881, 0x5107, 0x2882, 0x5108, 0x1108,

+    0x5109, 0x1109, 0x510A, 0x2888, 0x510B, 0x2885, 0x510C, 0x2886,

+    0x5110, 0x128D, 0x5111, 0x2B04, 0x5112, 0x128A, 0x5113, 0x2B01,

+    0x5114, 0x128C, 0x5115, 0x128E, 0x5117, 0x2B02, 0x5118, 0x128B,

+    0x511A, 0x2B03, 0x511C, 0x2B00, 0x511F, 0x13B5, 0x5120, 0x2D3E,

+    0x5121, 0x13B6, 0x5122, 0x2D3C, 0x5124, 0x2D3D, 0x5125, 0x2D3B,

+    0x5126, 0x2D3A, 0x5129, 0x2D3F, 0x512A, 0x13B4, 0x512D, 0x2F0F,

+    0x512E, 0x2F10, 0x5130, 0x287F, 0x5131, 0x2F0E, 0x5132, 0x13B7,

+    0x5133, 0x1575, 0x5134, 0x307A, 0x5135, 0x307B, 0x5137, 0x1668,

+    0x5138, 0x1669, 0x5139, 0x32C6, 0x513A, 0x32C5, 0x513B, 0x16BC,

+    0x513C, 0x16BB, 0x513D, 0x340E, 0x513F, 0x025C, 0x5140, 0x0274,

+    0x5141, 0x02AA, 0x5143, 0x02A9, 0x5144, 0x0303, 0x5145, 0x0302,

+    0x5146, 0x038A, 0x5147, 0x0389, 0x5148, 0x038B, 0x5149, 0x0388,

+    0x514B, 0x0434, 0x514C, 0x0433, 0x514D, 0x0435, 0x5152, 0x0545,

+    0x5154, 0x0544, 0x5155, 0x0546, 0x5157, 0x06BC, 0x5159, 0x0119,

+    0x515A, 0x1C32, 0x515B, 0x011A, 0x515C, 0x0A0F, 0x515D, 0x011C,

+    0x515E, 0x011B, 0x515F, 0x20BD, 0x5161, 0x011D, 0x5162, 0x0F8A,

+    0x5163, 0x011E, 0x5165, 0x025D, 0x5167, 0x02AB, 0x5168, 0x038C,

+    0x5169, 0x0547, 0x516B, 0x025E, 0x516C, 0x02AE, 0x516D, 0x02AC,

+    0x516E, 0x02AD, 0x5171, 0x038D, 0x5175, 0x0436, 0x5176, 0x0549,

+    0x5177, 0x0548, 0x5178, 0x054A, 0x517C, 0x0852, 0x5180, 0x128F,

+    0x5182, 0x021D, 0x5187, 0x1779, 0x5188, 0x36B6, 0x5189, 0x0304,

+    0x518A, 0x0305, 0x518D, 0x038E, 0x518F, 0x1833, 0x5191, 0x06BE,

+    0x5192, 0x06BD, 0x5193, 0x1C34, 0x5194, 0x1C33, 0x5195, 0x0A10,

+    0x5196, 0x021E, 0x5197, 0x02AF, 0x5198, 0x1780, 0x519E, 0x1910,

+    0x51A0, 0x06BF, 0x51A2, 0x0855, 0x51A4, 0x0853, 0x51A5, 0x0854,

+    0x51AA, 0x1290, 0x51AB, 0x021F, 0x51AC, 0x0306, 0x51B0, 0x038F,

+    0x51B1, 0x17C6, 0x51B6, 0x0437, 0x51B7, 0x0438, 0x51B9, 0x1834,

+    0x51BC, 0x1911, 0x51BD, 0x054B, 0x51BE, 0x1912, 0x51C4, 0x1C36,

+    0x51C5, 0x1C37, 0x51C6, 0x0858, 0x51C8, 0x1C38, 0x51CA, 0x1C35,

+    0x51CB, 0x0859, 0x51CC, 0x0857, 0x51CD, 0x0856, 0x51CE, 0x1C39,

+    0x51D0, 0x1E52, 0x51D4, 0x20BE, 0x51D7, 0x2375, 0x51D8, 0x2622,

+    0x51DC, 0x110B, 0x51DD, 0x1291, 0x51DE, 0x2B05, 0x51E0, 0x025F,

+    0x51E1, 0x026D, 0x51F0, 0x0A11, 0x51F1, 0x0BF1, 0x51F3, 0x0F8B,

+    0x51F5, 0x176E, 0x51F6, 0x02B0, 0x51F8, 0x0309, 0x51F9, 0x0307,

+    0x51FA, 0x0308, 0x51FD, 0x054C, 0x5200, 0x0260, 0x5201, 0x0261,

+    0x5202, 0x36B3, 0x5203, 0x0275, 0x5206, 0x02B1, 0x5207, 0x02B2,

+    0x5208, 0x02B3, 0x5209, 0x1797, 0x520A, 0x030A, 0x520C, 0x1796,

+    0x520E, 0x0393, 0x5210, 0x17C8, 0x5211, 0x0391, 0x5212, 0x0392,

+    0x5213, 0x17C7, 0x5216, 0x0394, 0x5217, 0x0390, 0x521C, 0x1835,

+    0x521D, 0x068B, 0x521E, 0x1836, 0x5221, 0x1837, 0x5224, 0x043A,

+    0x5225, 0x0439, 0x5228, 0x043D, 0x5229, 0x043B, 0x522A, 0x043C,

+    0x522E, 0x0552, 0x5230, 0x0551, 0x5231, 0x1917, 0x5232, 0x1914,

+    0x5233, 0x1915, 0x5235, 0x1913, 0x5236, 0x0553, 0x5237, 0x054F,

+    0x5238, 0x054E, 0x523A, 0x0550, 0x523B, 0x054D, 0x5241, 0x0554,

+    0x5243, 0x06C1, 0x5244, 0x1A6D, 0x5246, 0x1916, 0x5247, 0x06C6,

+    0x5249, 0x1A6E, 0x524A, 0x06C2, 0x524B, 0x06C5, 0x524C, 0x06C4,

+    0x524D, 0x06C3, 0x524E, 0x06C0, 0x5252, 0x1C3C, 0x5254, 0x085C,

+    0x5255, 0x1C3F, 0x5256, 0x085A, 0x525A, 0x1C3B, 0x525B, 0x085D,

+    0x525C, 0x085B, 0x525D, 0x085E, 0x525E, 0x1C3D, 0x525F, 0x1C3E,

+    0x5261, 0x1C3A, 0x5262, 0x1C40, 0x5269, 0x0BF5, 0x526A, 0x0A12,

+    0x526B, 0x1E53, 0x526C, 0x1E55, 0x526D, 0x1E54, 0x526E, 0x1E56,

+    0x526F, 0x0A13, 0x5272, 0x0BF2, 0x5274, 0x0BF3, 0x5275, 0x0BF4,

+    0x5277, 0x0DCB, 0x5278, 0x2377, 0x527A, 0x2376, 0x527B, 0x2378,

+    0x527C, 0x2379, 0x527D, 0x0DCC, 0x527F, 0x0DCA, 0x5280, 0x2623,

+    0x5281, 0x2624, 0x5282, 0x0F8D, 0x5283, 0x0F8C, 0x5284, 0x2776,

+    0x5287, 0x110C, 0x5288, 0x110D, 0x5289, 0x110E, 0x528A, 0x1110,

+    0x528B, 0x2889, 0x528C, 0x288A, 0x528D, 0x110F, 0x5291, 0x1292,

+    0x5293, 0x1293, 0x5296, 0x307C, 0x5297, 0x32C8, 0x5298, 0x32C7,

+    0x5299, 0x340F, 0x529B, 0x0262, 0x529F, 0x030C, 0x52A0, 0x030B,

+    0x52A3, 0x0395, 0x52A6, 0x17C9, 0x52A9, 0x043F, 0x52AA, 0x0440,

+    0x52AB, 0x043E, 0x52AC, 0x0441, 0x52AD, 0x1838, 0x52AE, 0x1839,

+    0x52BB, 0x0556, 0x52BC, 0x1918, 0x52BE, 0x0555, 0x52C0, 0x1A6F,

+    0x52C1, 0x06CA, 0x52C2, 0x1A70, 0x52C3, 0x06C9, 0x52C7, 0x06C7,

+    0x52C9, 0x06C8, 0x52CD, 0x1C41, 0x52D2, 0x0A14, 0x52D3, 0x1E58,

+    0x52D5, 0x0A17, 0x52D6, 0x1E57, 0x52D7, 0x0ACF, 0x52D8, 0x0A16,

+    0x52D9, 0x0A15, 0x52DB, 0x0BF8, 0x52DD, 0x0BF7, 0x52DE, 0x0BF6,

+    0x52DF, 0x0DCD, 0x52E2, 0x0DD0, 0x52E3, 0x0DD1, 0x52E4, 0x0DCF,

+    0x52E6, 0x0DCE, 0x52E9, 0x2625, 0x52EB, 0x2626, 0x52EF, 0x288C,

+    0x52F0, 0x1111, 0x52F1, 0x288B, 0x52F3, 0x1294, 0x52F4, 0x2D40,

+    0x52F5, 0x13B8, 0x52F7, 0x307D, 0x52F8, 0x1609, 0x52F9, 0x0220,

+    0x52FA, 0x0276, 0x52FB, 0x02B4, 0x52FC, 0x1781, 0x52FE, 0x02B5,

+    0x52FF, 0x02B6, 0x5305, 0x030D, 0x5306, 0x030E, 0x5308, 0x0396,

+    0x5309, 0x183A, 0x530A, 0x1919, 0x530B, 0x191A, 0x530D, 0x06CB,

+    0x530E, 0x1C42, 0x530F, 0x0A19, 0x5310, 0x0A18, 0x5311, 0x20C0,

+    0x5312, 0x20BF, 0x5315, 0x0263, 0x5316, 0x02B7, 0x5317, 0x030F,

+    0x5319, 0x0A1A, 0x531A, 0x176F, 0x531C, 0x1798, 0x531D, 0x0310,

+    0x531F, 0x17CB, 0x5320, 0x0398, 0x5321, 0x0397, 0x5322, 0x17CA,

+    0x5323, 0x0442, 0x532A, 0x085F, 0x532D, 0x1E59, 0x532F, 0x0DD2,

+    0x5330, 0x2627, 0x5331, 0x0F8E, 0x5334, 0x2B06, 0x5337, 0x31C7,

+    0x5338, 0x0221, 0x5339, 0x02B8, 0x533C, 0x191B, 0x533D, 0x1A71,

+    0x533E, 0x0A1D, 0x533F, 0x0A1B, 0x5340, 0x0A1C, 0x5341, 0x0264,

+    0x5343, 0x0277, 0x5344, 0x016B, 0x5345, 0x02BB, 0x5347, 0x02BA,

+    0x5348, 0x02B9, 0x5349, 0x0313, 0x534A, 0x0312, 0x534C, 0x1799,

+    0x534D, 0x17CC, 0x5351, 0x055A, 0x5352, 0x0557, 0x5353, 0x0559,

+    0x5354, 0x0558, 0x5357, 0x06CC, 0x535A, 0x0BF9, 0x535C, 0x0265,

+    0x535E, 0x02BC, 0x5360, 0x0315, 0x5361, 0x0314, 0x5363, 0x183B,

+    0x5366, 0x055B, 0x5369, 0x0222, 0x536C, 0x1782, 0x536E, 0x0317,

+    0x536F, 0x0316, 0x5370, 0x0399, 0x5371, 0x039A, 0x5372, 0x183C,

+    0x5373, 0x0443, 0x5375, 0x0444, 0x5377, 0x055C, 0x5378, 0x055D,

+    0x5379, 0x055E, 0x537B, 0x06CD, 0x537C, 0x1A72, 0x537F, 0x0860,

+    0x5382, 0x1770, 0x5384, 0x02BD, 0x538A, 0x17CD, 0x538E, 0x183D,

+    0x538F, 0x183E, 0x5392, 0x191C, 0x5394, 0x191D, 0x5396, 0x1A74,

+    0x5397, 0x1A73, 0x5398, 0x1A76, 0x5399, 0x1A75, 0x539A, 0x06CE,

+    0x539C, 0x1E5A, 0x539D, 0x0862, 0x539E, 0x1C43, 0x539F, 0x0861,

+    0x53A4, 0x20C1, 0x53A5, 0x0BFA, 0x53A7, 0x20C2, 0x53AC, 0x2628,

+    0x53AD, 0x0F8F, 0x53B2, 0x1112, 0x53B4, 0x307E, 0x53B6, 0x0223,

+    0x53B9, 0x1783, 0x53BB, 0x0318, 0x53C3, 0x0A1E, 0x53C8, 0x0266,

+    0x53C9, 0x0278, 0x53CA, 0x02BF, 0x53CB, 0x02BE, 0x53CD, 0x02C0,

+    0x53D4, 0x0560, 0x53D6, 0x055F, 0x53D7, 0x0561, 0x53DB, 0x06CF,

+    0x53DF, 0x0863, 0x53E1, 0x2B07, 0x53E2, 0x14C9, 0x53E3, 0x0279,

+    0x53E4, 0x031A, 0x53E5, 0x0329, 0x53E6, 0x0324, 0x53E8, 0x031F,

+    0x53E9, 0x031E, 0x53EA, 0x0325, 0x53EB, 0x0323, 0x53EC, 0x031C,

+    0x53ED, 0x032A, 0x53EE, 0x031D, 0x53EF, 0x0319, 0x53F0, 0x0328,

+    0x53F1, 0x0327, 0x53F2, 0x0326, 0x53F3, 0x031B, 0x53F5, 0x0322,

+    0x53F8, 0x0321, 0x53FB, 0x032B, 0x53FC, 0x0320, 0x5401, 0x03A0,

+    0x5403, 0x03A6, 0x5404, 0x03A2, 0x5406, 0x03A8, 0x5407, 0x17CE,

+    0x5408, 0x03A5, 0x5409, 0x039B, 0x540A, 0x039E, 0x540B, 0x03A1,

+    0x540C, 0x039D, 0x540D, 0x03A4, 0x540E, 0x03A7, 0x540F, 0x039C,

+    0x5410, 0x039F, 0x5411, 0x03A3, 0x5412, 0x03A9, 0x5418, 0x1847,

+    0x5419, 0x1844, 0x541B, 0x0451, 0x541C, 0x1845, 0x541D, 0x0445,

+    0x541E, 0x0447, 0x541F, 0x045F, 0x5420, 0x045A, 0x5424, 0x184C,

+    0x5425, 0x1846, 0x5426, 0x0449, 0x5427, 0x044B, 0x5428, 0x184B,

+    0x5429, 0x0452, 0x542A, 0x1841, 0x542B, 0x045E, 0x542C, 0x0460,

+    0x542D, 0x0446, 0x542E, 0x0457, 0x5430, 0x183F, 0x5431, 0x045D,

+    0x5433, 0x044E, 0x5435, 0x0458, 0x5436, 0x0459, 0x5437, 0x1840,

+    0x5438, 0x0456, 0x5439, 0x0454, 0x543B, 0x0455, 0x543C, 0x045B,

+    0x543D, 0x1848, 0x543E, 0x0448, 0x5440, 0x045C, 0x5441, 0x184A,

+    0x5442, 0x0450, 0x5443, 0x044D, 0x5445, 0x1843, 0x5446, 0x044C,

+    0x5447, 0x184D, 0x5448, 0x044F, 0x544A, 0x0453, 0x544E, 0x044A,

+    0x544F, 0x1849, 0x5454, 0x1842, 0x5460, 0x192E, 0x5461, 0x192D,

+    0x5462, 0x0573, 0x5463, 0x1930, 0x5464, 0x1932, 0x5465, 0x1927,

+    0x5466, 0x192A, 0x5467, 0x1931, 0x5468, 0x0574, 0x546B, 0x1924,

+    0x546C, 0x1928, 0x546F, 0x192C, 0x5470, 0x1A85, 0x5471, 0x056F,

+    0x5472, 0x1A89, 0x5473, 0x0562, 0x5474, 0x1929, 0x5475, 0x0563,

+    0x5476, 0x0570, 0x5477, 0x0569, 0x5478, 0x0565, 0x547A, 0x1925,

+    0x547B, 0x0568, 0x547C, 0x056D, 0x547D, 0x0576, 0x547E, 0x1926,

+    0x547F, 0x191F, 0x5480, 0x0567, 0x5481, 0x1920, 0x5482, 0x1922,

+    0x5484, 0x056A, 0x5486, 0x056C, 0x5487, 0x191E, 0x5488, 0x1923,

+    0x548B, 0x0575, 0x548C, 0x0571, 0x548D, 0x192B, 0x548E, 0x0577,

+    0x5490, 0x056E, 0x5491, 0x1921, 0x5492, 0x056B, 0x5495, 0x0566,

+    0x5496, 0x0564, 0x5498, 0x192F, 0x549A, 0x0572, 0x54A0, 0x1A84,

+    0x54A1, 0x1A78, 0x54A2, 0x1A87, 0x54A5, 0x1A7A, 0x54A6, 0x06D6,

+    0x54A7, 0x06E4, 0x54A8, 0x06D2, 0x54A9, 0x06E3, 0x54AA, 0x06DB,

+    0x54AB, 0x06E0, 0x54AC, 0x06D0, 0x54AD, 0x1A79, 0x54AE, 0x1A7F,

+    0x54AF, 0x06DF, 0x54B0, 0x1A8B, 0x54B1, 0x06E1, 0x54B3, 0x06D7,

+    0x54B6, 0x1A81, 0x54B7, 0x1A7E, 0x54B8, 0x06D5, 0x54BA, 0x1A77,

+    0x54BB, 0x06E2, 0x54BC, 0x1A86, 0x54BD, 0x06DA, 0x54BE, 0x1A88,

+    0x54BF, 0x06E5, 0x54C0, 0x06D1, 0x54C1, 0x06DC, 0x54C2, 0x06D9,

+    0x54C3, 0x1A7C, 0x54C4, 0x06DD, 0x54C5, 0x1A82, 0x54C6, 0x1A83,

+    0x54C7, 0x06D8, 0x54C8, 0x06DE, 0x54C9, 0x06D4, 0x54CE, 0x06D3,

+    0x54CF, 0x1A7B, 0x54D6, 0x1A80, 0x54DE, 0x1A8A, 0x54E0, 0x1C57,

+    0x54E1, 0x0870, 0x54E2, 0x1C45, 0x54E4, 0x1C4A, 0x54E5, 0x0869,

+    0x54E6, 0x0874, 0x54E7, 0x1C48, 0x54E8, 0x0864, 0x54E9, 0x086E,

+    0x54EA, 0x0873, 0x54EB, 0x1C4F, 0x54ED, 0x086F, 0x54EE, 0x0872,

+    0x54F1, 0x1C52, 0x54F2, 0x086A, 0x54F3, 0x1C49, 0x54F7, 0x1C55,

+    0x54F8, 0x1C56, 0x54FA, 0x086C, 0x54FB, 0x1C54, 0x54FC, 0x0868,

+    0x54FD, 0x0877, 0x54FF, 0x1C4C, 0x5501, 0x0866, 0x5503, 0x1C59,

+    0x5504, 0x1C4D, 0x5505, 0x1C51, 0x5506, 0x086B, 0x5507, 0x0876,

+    0x5508, 0x1C4E, 0x5509, 0x0871, 0x550A, 0x1C53, 0x550B, 0x1C5A,

+    0x550C, 0x1E69, 0x550E, 0x1C58, 0x550F, 0x0878, 0x5510, 0x0865,

+    0x5511, 0x1C50, 0x5512, 0x1C47, 0x5514, 0x086D, 0x5517, 0x1C46,

+    0x551A, 0x1C4B, 0x5526, 0x1C44, 0x5527, 0x0875, 0x552A, 0x1E61,

+    0x552C, 0x0A31, 0x552D, 0x1E6F, 0x552E, 0x0A2F, 0x552F, 0x0A2C,

+    0x5530, 0x1E66, 0x5531, 0x0A28, 0x5532, 0x1E6A, 0x5533, 0x0A33,

+    0x5534, 0x1E60, 0x5535, 0x1E65, 0x5536, 0x1E64, 0x5537, 0x0867,

+    0x5538, 0x0A2E, 0x5539, 0x1E6D, 0x553B, 0x1E70, 0x553C, 0x1E5D,

+    0x553E, 0x0C0C, 0x5540, 0x1E71, 0x5541, 0x0A34, 0x5543, 0x0A26,

+    0x5544, 0x0A23, 0x5545, 0x1E68, 0x5546, 0x0A20, 0x5548, 0x1E6E,

+    0x554A, 0x0A27, 0x554B, 0x1E72, 0x554D, 0x1E5E, 0x554E, 0x1E6C,

+    0x554F, 0x0A2A, 0x5550, 0x1E5F, 0x5551, 0x1E62, 0x5552, 0x1E67,

+    0x5555, 0x0A2B, 0x5556, 0x0A29, 0x5557, 0x0A35, 0x555C, 0x0A30,

+    0x555E, 0x0A24, 0x555F, 0x0ABC, 0x5561, 0x0A25, 0x5562, 0x1E63,

+    0x5563, 0x0A32, 0x5564, 0x0A2D, 0x5565, 0x1E6B, 0x5566, 0x0A22,

+    0x556A, 0x0A21, 0x5575, 0x1E5B, 0x5576, 0x1E5C, 0x5577, 0x20C7,

+    0x557B, 0x0BFB, 0x557C, 0x0BFE, 0x557D, 0x20D2, 0x557E, 0x0C12,

+    0x557F, 0x20D5, 0x5580, 0x0BFC, 0x5581, 0x20CE, 0x5582, 0x0C02,

+    0x5583, 0x0C08, 0x5584, 0x0D1B, 0x5587, 0x0C06, 0x5588, 0x20CB,

+    0x5589, 0x0C13, 0x558A, 0x0BFF, 0x558B, 0x0C07, 0x558C, 0x20D3,

+    0x558D, 0x2387, 0x558E, 0x20D8, 0x558F, 0x20CC, 0x5591, 0x20C3,

+    0x5592, 0x20D0, 0x5593, 0x20CA, 0x5594, 0x0C05, 0x5595, 0x20D6,

+    0x5598, 0x0C01, 0x5599, 0x0C15, 0x559A, 0x0C0E, 0x559C, 0x0C03,

+    0x559D, 0x0C00, 0x559F, 0x0C0B, 0x55A1, 0x20D7, 0x55A2, 0x20C9,

+    0x55A3, 0x20CF, 0x55A4, 0x20D1, 0x55A5, 0x20C5, 0x55A6, 0x20D4,

+    0x55A7, 0x0BFD, 0x55A8, 0x20C4, 0x55AA, 0x0C04, 0x55AB, 0x0C14,

+    0x55AC, 0x0C10, 0x55AD, 0x20C6, 0x55AE, 0x0C0A, 0x55B1, 0x0C11,

+    0x55B2, 0x0C0D, 0x55B3, 0x0C09, 0x55B5, 0x20CD, 0x55BB, 0x0C0F,

+    0x55BF, 0x2385, 0x55C0, 0x2381, 0x55C2, 0x2390, 0x55C3, 0x237A,

+    0x55C4, 0x2383, 0x55C5, 0x0DE0, 0x55C6, 0x0DE1, 0x55C7, 0x0DD9,

+    0x55C8, 0x238C, 0x55C9, 0x0DE3, 0x55CA, 0x237F, 0x55CB, 0x237E,

+    0x55CC, 0x237C, 0x55CD, 0x238E, 0x55CE, 0x0DD7, 0x55CF, 0x2388,

+    0x55D0, 0x237D, 0x55D1, 0x0DDA, 0x55D2, 0x2386, 0x55D3, 0x0DD5,

+    0x55D4, 0x2382, 0x55D5, 0x2389, 0x55D6, 0x238B, 0x55D9, 0x238F,

+    0x55DA, 0x0DDE, 0x55DB, 0x237B, 0x55DC, 0x0DD8, 0x55DD, 0x2380,

+    0x55DF, 0x0DD3, 0x55E1, 0x0DDF, 0x55E2, 0x238A, 0x55E3, 0x0DDB,

+    0x55E4, 0x0DDC, 0x55E5, 0x0DE2, 0x55E6, 0x0DD6, 0x55E7, 0x011F,

+    0x55E8, 0x0DD4, 0x55E9, 0x2384, 0x55EF, 0x0DDD, 0x55F2, 0x238D,

+    0x55F6, 0x0F9F, 0x55F7, 0x0F9A, 0x55F9, 0x2637, 0x55FA, 0x2633,

+    0x55FC, 0x262D, 0x55FD, 0x0F94, 0x55FE, 0x0F90, 0x55FF, 0x2636,

+    0x5600, 0x0F91, 0x5601, 0x2630, 0x5602, 0x2632, 0x5604, 0x2635,

+    0x5606, 0x0F96, 0x5608, 0x0F9D, 0x5609, 0x0F97, 0x560C, 0x262B,

+    0x560D, 0x0F98, 0x560E, 0x0F99, 0x560F, 0x262E, 0x5610, 0x0F9E,

+    0x5612, 0x262C, 0x5613, 0x2631, 0x5614, 0x0F95, 0x5615, 0x262A,

+    0x5616, 0x0F9B, 0x5617, 0x0F93, 0x561B, 0x0F92, 0x561C, 0x262F,

+    0x561D, 0x2634, 0x561F, 0x0F9C, 0x5627, 0x2629, 0x5629, 0x1119,

+    0x562A, 0x289D, 0x562C, 0x289A, 0x562E, 0x1113, 0x562F, 0x111F,

+    0x5630, 0x1120, 0x5632, 0x1116, 0x5633, 0x2898, 0x5634, 0x1118,

+    0x5635, 0x2890, 0x5636, 0x111E, 0x5638, 0x289C, 0x5639, 0x1115,

+    0x563A, 0x289E, 0x563B, 0x1114, 0x563D, 0x2899, 0x563E, 0x289B,

+    0x563F, 0x1117, 0x5640, 0x2897, 0x5641, 0x2891, 0x5642, 0x288E,

+    0x5645, 0x20C8, 0x5646, 0x2894, 0x5648, 0x288D, 0x5649, 0x2893,

+    0x564A, 0x2892, 0x564C, 0x288F, 0x564E, 0x111B, 0x5653, 0x111A,

+    0x5657, 0x111C, 0x5658, 0x2895, 0x5659, 0x1295, 0x565A, 0x2896,

+    0x565E, 0x2B10, 0x5660, 0x2B09, 0x5662, 0x12A1, 0x5663, 0x2B0D,

+    0x5664, 0x1299, 0x5665, 0x129D, 0x5666, 0x2B0C, 0x5668, 0x129C,

+    0x5669, 0x1298, 0x566A, 0x129B, 0x566B, 0x1296, 0x566C, 0x12A0,

+    0x566D, 0x2B0E, 0x566E, 0x2B0A, 0x566F, 0x129F, 0x5670, 0x2B08,

+    0x5671, 0x129E, 0x5672, 0x2B0F, 0x5673, 0x2B0B, 0x5674, 0x111D,

+    0x5676, 0x12A2, 0x5677, 0x2B11, 0x5678, 0x129A, 0x5679, 0x1297,

+    0x567E, 0x2D47, 0x567F, 0x2D49, 0x5680, 0x13BA, 0x5681, 0x2D4A,

+    0x5682, 0x2D48, 0x5683, 0x2D46, 0x5684, 0x2D45, 0x5685, 0x13BC,

+    0x5686, 0x2D44, 0x5687, 0x13BD, 0x568C, 0x2D42, 0x568D, 0x2D43,

+    0x568E, 0x13B9, 0x568F, 0x13BE, 0x5690, 0x13BB, 0x5693, 0x2D41,

+    0x5695, 0x14CA, 0x5697, 0x2F13, 0x5698, 0x2F11, 0x5699, 0x2F16,

+    0x569A, 0x2F14, 0x569C, 0x2F12, 0x569D, 0x2F15, 0x56A5, 0x1576,

+    0x56A6, 0x3081, 0x56A7, 0x3082, 0x56A8, 0x1577, 0x56AA, 0x3083,

+    0x56AB, 0x307F, 0x56AC, 0x3084, 0x56AD, 0x3080, 0x56AE, 0x14CB,

+    0x56B2, 0x31C8, 0x56B3, 0x31CA, 0x56B4, 0x160C, 0x56B5, 0x31C9,

+    0x56B6, 0x160B, 0x56B7, 0x160A, 0x56BC, 0x160D, 0x56BD, 0x32CA,

+    0x56BE, 0x32CB, 0x56C0, 0x166B, 0x56C1, 0x166A, 0x56C2, 0x166C,

+    0x56C3, 0x32C9, 0x56C5, 0x3379, 0x56C6, 0x3378, 0x56C8, 0x16BD,

+    0x56C9, 0x16BF, 0x56CA, 0x16BE, 0x56CB, 0x337A, 0x56CC, 0x16F6,

+    0x56CD, 0x3481, 0x56D1, 0x171F, 0x56D3, 0x3480, 0x56D4, 0x34C9,

+    0x56D7, 0x1775, 0x56DA, 0x032D, 0x56DB, 0x032C, 0x56DD, 0x03AC,

+    0x56DE, 0x03AB, 0x56DF, 0x17D0, 0x56E0, 0x03AA, 0x56E1, 0x17CF,

+    0x56E4, 0x0463, 0x56E5, 0x1850, 0x56E7, 0x184F, 0x56EA, 0x0461,

+    0x56EB, 0x0464, 0x56EE, 0x184E, 0x56F0, 0x0462, 0x56F7, 0x1933,

+    0x56F9, 0x1934, 0x56FA, 0x0578, 0x56FF, 0x06E6, 0x5701, 0x1C5B,

+    0x5702, 0x1C5C, 0x5703, 0x0879, 0x5704, 0x087A, 0x5707, 0x1E74,

+    0x5708, 0x0A36, 0x5709, 0x0A38, 0x570A, 0x1E73, 0x570B, 0x0A37,

+    0x570C, 0x20D9, 0x570D, 0x0C16, 0x5712, 0x0DE4, 0x5713, 0x0DE5,

+    0x5714, 0x2391, 0x5716, 0x0FA1, 0x5718, 0x0FA0, 0x571A, 0x289F,

+    0x571B, 0x2B13, 0x571C, 0x2B12, 0x571E, 0x3505, 0x571F, 0x027A,

+    0x5720, 0x1784, 0x5722, 0x179A, 0x5723, 0x179B, 0x5728, 0x03AF,

+    0x5729, 0x03B3, 0x572A, 0x17D2, 0x572C, 0x03B1, 0x572D, 0x03B0,

+    0x572E, 0x17D1, 0x572F, 0x03B2, 0x5730, 0x03AE, 0x5733, 0x03AD,

+    0x5734, 0x17D3, 0x573B, 0x046E, 0x573E, 0x046B, 0x5740, 0x0467,

+    0x5741, 0x1851, 0x5745, 0x1852, 0x5747, 0x0469, 0x5749, 0x1854,

+    0x574A, 0x0465, 0x574B, 0x1855, 0x574C, 0x1853, 0x574D, 0x0468,

+    0x574E, 0x046A, 0x574F, 0x046D, 0x5750, 0x046C, 0x5751, 0x0466,

+    0x5752, 0x1856, 0x5761, 0x057D, 0x5762, 0x1941, 0x5764, 0x057F,

+    0x5766, 0x057E, 0x5768, 0x1942, 0x5769, 0x057C, 0x576A, 0x057B,

+    0x576B, 0x1938, 0x576D, 0x1937, 0x576F, 0x1935, 0x5770, 0x193A,

+    0x5771, 0x1939, 0x5772, 0x1936, 0x5773, 0x193F, 0x5774, 0x1940,

+    0x5775, 0x193D, 0x5776, 0x193B, 0x5777, 0x057A, 0x577B, 0x193E,

+    0x577C, 0x0580, 0x577D, 0x1943, 0x5780, 0x193C, 0x5782, 0x06E7,

+    0x5783, 0x0579, 0x578B, 0x06E8, 0x578C, 0x1A90, 0x578F, 0x1A96,

+    0x5793, 0x06EE, 0x5794, 0x1A94, 0x5795, 0x1A9A, 0x5797, 0x1A91,

+    0x5798, 0x1A95, 0x5799, 0x1A97, 0x579A, 0x1A99, 0x579B, 0x1A93,

+    0x579D, 0x1A92, 0x579E, 0x1A8D, 0x579F, 0x1A8E, 0x57A0, 0x06E9,

+    0x57A2, 0x06EB, 0x57A3, 0x06EA, 0x57A4, 0x1A8F, 0x57A5, 0x1A98,

+    0x57AE, 0x06ED, 0x57B5, 0x1A8C, 0x57B6, 0x1C66, 0x57B8, 0x1C65,

+    0x57B9, 0x1C6A, 0x57BA, 0x1C61, 0x57BC, 0x1C64, 0x57BD, 0x1C63,

+    0x57BF, 0x1C67, 0x57C1, 0x1C6B, 0x57C2, 0x087B, 0x57C3, 0x087E,

+    0x57C6, 0x1C62, 0x57C7, 0x1C68, 0x57CB, 0x087D, 0x57CC, 0x1C5D,

+    0x57CE, 0x06EC, 0x57CF, 0x1E82, 0x57D0, 0x1C69, 0x57D2, 0x1C60,

+    0x57D4, 0x087C, 0x57D5, 0x1C5F, 0x57DC, 0x1E79, 0x57DF, 0x0A39,

+    0x57E0, 0x0A3D, 0x57E1, 0x1E89, 0x57E2, 0x1E77, 0x57E3, 0x1E85,

+    0x57E4, 0x0A3E, 0x57E5, 0x1E87, 0x57E7, 0x1E8D, 0x57E9, 0x1E91,

+    0x57EC, 0x1E88, 0x57ED, 0x1E7C, 0x57EE, 0x1E84, 0x57F0, 0x1E92,

+    0x57F1, 0x1E90, 0x57F2, 0x1E86, 0x57F3, 0x1E81, 0x57F4, 0x1E7A,

+    0x57F5, 0x20E1, 0x57F6, 0x1E78, 0x57F7, 0x0A42, 0x57F8, 0x1E7F,

+    0x57F9, 0x0A43, 0x57FA, 0x0A3F, 0x57FB, 0x1E75, 0x57FC, 0x1E8B,

+    0x57FD, 0x1E7D, 0x5800, 0x1E7B, 0x5801, 0x1E8E, 0x5802, 0x0A40,

+    0x5804, 0x1E94, 0x5805, 0x0A3A, 0x5806, 0x0A3C, 0x5807, 0x1E83,

+    0x5808, 0x1E7E, 0x5809, 0x087F, 0x580A, 0x0A3B, 0x580B, 0x1E80,

+    0x580C, 0x1E8F, 0x580D, 0x1E93, 0x580E, 0x1E8A, 0x5810, 0x1E8C,

+    0x5814, 0x1E76, 0x5819, 0x20DC, 0x581B, 0x20E5, 0x581C, 0x20E4,

+    0x581D, 0x0C1E, 0x581E, 0x20DD, 0x5820, 0x0C1F, 0x5821, 0x0C1D,

+    0x5823, 0x20DF, 0x5824, 0x0C1A, 0x5825, 0x20E3, 0x5827, 0x20DE,

+    0x5828, 0x20E0, 0x5829, 0x20DA, 0x582A, 0x0C18, 0x582C, 0x20ED,

+    0x582D, 0x20EC, 0x582E, 0x20E9, 0x582F, 0x0C17, 0x5830, 0x0C1B,

+    0x5831, 0x0C1C, 0x5832, 0x1C5E, 0x5833, 0x20E6, 0x5834, 0x0C19,

+    0x5835, 0x0A41, 0x5836, 0x20E8, 0x5837, 0x20DB, 0x5838, 0x20EB,

+    0x5839, 0x20EA, 0x583B, 0x20EE, 0x583D, 0x239F, 0x583F, 0x20E7,

+    0x5848, 0x20E2, 0x5849, 0x2397, 0x584A, 0x0DEF, 0x584B, 0x0DF2,

+    0x584C, 0x0DED, 0x584D, 0x2396, 0x584E, 0x239A, 0x584F, 0x2395,

+    0x5851, 0x0DE7, 0x5852, 0x0DF1, 0x5853, 0x2392, 0x5854, 0x0DEB,

+    0x5855, 0x2399, 0x5857, 0x0DE9, 0x5858, 0x0DE8, 0x5859, 0x239C,

+    0x585A, 0x0DEA, 0x585B, 0x239E, 0x585D, 0x239B, 0x585E, 0x0DE6,

+    0x5862, 0x0DF0, 0x5863, 0x23A0, 0x5864, 0x2394, 0x5865, 0x239D,

+    0x5868, 0x2393, 0x586B, 0x0DEC, 0x586D, 0x0DEE, 0x586F, 0x2398,

+    0x5871, 0x23A1, 0x5874, 0x263F, 0x5875, 0x0FA2, 0x5876, 0x2645,

+    0x5879, 0x0FA7, 0x587A, 0x2641, 0x587B, 0x2648, 0x587C, 0x2639,

+    0x587D, 0x0FA9, 0x587E, 0x0FA3, 0x587F, 0x263E, 0x5880, 0x1121,

+    0x5881, 0x263D, 0x5882, 0x2646, 0x5883, 0x0FA4, 0x5885, 0x0FA8,

+    0x5886, 0x263C, 0x5887, 0x2642, 0x5888, 0x2647, 0x5889, 0x2638,

+    0x588A, 0x0FA6, 0x588B, 0x2640, 0x588E, 0x2644, 0x588F, 0x264A,

+    0x5890, 0x263A, 0x5891, 0x2643, 0x5893, 0x0FA5, 0x5894, 0x2649,

+    0x5898, 0x263B, 0x589C, 0x1125, 0x589D, 0x28A1, 0x589E, 0x1123,

+    0x589F, 0x1122, 0x58A0, 0x28A3, 0x58A1, 0x28A8, 0x58A3, 0x28A4,

+    0x58A5, 0x28A7, 0x58A6, 0x1128, 0x58A8, 0x1288, 0x58A9, 0x1127,

+    0x58AB, 0x28A0, 0x58AC, 0x28A6, 0x58AE, 0x1126, 0x58AF, 0x28A5,

+    0x58B1, 0x28A2, 0x58B3, 0x1124, 0x58BA, 0x2B18, 0x58BB, 0x36EB,

+    0x58BC, 0x2B1A, 0x58BD, 0x2B15, 0x58BE, 0x12A4, 0x58BF, 0x2B17,

+    0x58C1, 0x12A3, 0x58C2, 0x2B19, 0x58C5, 0x12A6, 0x58C6, 0x2B1B,

+    0x58C7, 0x12A5, 0x58C8, 0x2B14, 0x58C9, 0x2B16, 0x58CE, 0x13C2,

+    0x58CF, 0x2D4D, 0x58D1, 0x13C1, 0x58D2, 0x2D4E, 0x58D3, 0x13C0,

+    0x58D4, 0x2D4C, 0x58D5, 0x13BF, 0x58D6, 0x2D4B, 0x58D8, 0x14CD,

+    0x58D9, 0x14CC, 0x58DA, 0x3085, 0x58DB, 0x3087, 0x58DD, 0x3086,

+    0x58DE, 0x1578, 0x58DF, 0x1579, 0x58E2, 0x157A, 0x58E3, 0x31CB,

+    0x58E4, 0x160E, 0x58E7, 0x3411, 0x58E8, 0x3410, 0x58E9, 0x1720,

+    0x58EB, 0x027B, 0x58EC, 0x02C1, 0x58EF, 0x046F, 0x58F4, 0x1A9B,

+    0x58F9, 0x0C20, 0x58FA, 0x0C21, 0x58FC, 0x23A2, 0x58FD, 0x0FAA,

+    0x58FE, 0x264B, 0x58FF, 0x28A9, 0x5902, 0x0224, 0x5903, 0x1785,

+    0x5906, 0x1857, 0x590A, 0x0224, 0x590C, 0x1944, 0x590D, 0x1A9C,

+    0x590E, 0x1C6C, 0x590F, 0x0880, 0x5912, 0x3088, 0x5914, 0x166D,

+    0x5915, 0x027C, 0x5916, 0x032E, 0x5917, 0x179C, 0x5919, 0x03B4,

+    0x591A, 0x03B5, 0x591C, 0x0581, 0x5920, 0x0A44, 0x5922, 0x0FAC,

+    0x5924, 0x0FAD, 0x5925, 0x0FAB, 0x5927, 0x027D, 0x5929, 0x02C2,

+    0x592A, 0x02C4, 0x592B, 0x02C3, 0x592C, 0x1786, 0x592D, 0x02C5,

+    0x592E, 0x032F, 0x592F, 0x179D, 0x5931, 0x0330, 0x5937, 0x03B6,

+    0x5938, 0x03B7, 0x593C, 0x17D4, 0x593E, 0x0470, 0x5940, 0x1858,

+    0x5944, 0x0585, 0x5945, 0x1945, 0x5947, 0x0583, 0x5948, 0x0584,

+    0x5949, 0x0582, 0x594A, 0x1C6D, 0x594E, 0x06F2, 0x594F, 0x06F1,

+    0x5950, 0x06F3, 0x5951, 0x06F0, 0x5953, 0x1A9D, 0x5954, 0x0586,

+    0x5955, 0x06EF, 0x5957, 0x0881, 0x5958, 0x0882, 0x595A, 0x0883,

+    0x595C, 0x1E95, 0x5960, 0x0C22, 0x5961, 0x20EF, 0x5962, 0x0A45,

+    0x5967, 0x0DF3, 0x5969, 0x0FAF, 0x596A, 0x0FAE, 0x596B, 0x264C,

+    0x596D, 0x1129, 0x596E, 0x12A7, 0x5970, 0x2F17, 0x5971, 0x337B,

+    0x5972, 0x3412, 0x5973, 0x027E, 0x5974, 0x0331, 0x5976, 0x0332,

+    0x5977, 0x17DA, 0x5978, 0x03B9, 0x5979, 0x03BC, 0x597B, 0x17D8,

+    0x597C, 0x17D6, 0x597D, 0x03BB, 0x597E, 0x17D9, 0x597F, 0x17DB,

+    0x5980, 0x17D5, 0x5981, 0x03BE, 0x5982, 0x03BD, 0x5983, 0x03BA,

+    0x5984, 0x03B8, 0x5985, 0x17D7, 0x598A, 0x047B, 0x598D, 0x0478,

+    0x598E, 0x185D, 0x598F, 0x1860, 0x5990, 0x185F, 0x5992, 0x0472,

+    0x5993, 0x047A, 0x5996, 0x0477, 0x5997, 0x185C, 0x5998, 0x185A,

+    0x5999, 0x0476, 0x599D, 0x0471, 0x599E, 0x0474, 0x59A0, 0x185B,

+    0x59A1, 0x1862, 0x59A2, 0x185E, 0x59A3, 0x0475, 0x59A4, 0x0479,

+    0x59A5, 0x047C, 0x59A6, 0x1859, 0x59A7, 0x1861, 0x59A8, 0x0473,

+    0x59AE, 0x058B, 0x59AF, 0x0593, 0x59B1, 0x1951, 0x59B2, 0x194A,

+    0x59B3, 0x0594, 0x59B4, 0x1955, 0x59B5, 0x1946, 0x59B6, 0x194D,

+    0x59B9, 0x058A, 0x59BA, 0x1947, 0x59BB, 0x0588, 0x59BC, 0x194E,

+    0x59BD, 0x1952, 0x59BE, 0x0587, 0x59C0, 0x1953, 0x59C1, 0x194C,

+    0x59C3, 0x194F, 0x59C5, 0x0596, 0x59C6, 0x058D, 0x59C7, 0x1956,

+    0x59C8, 0x1954, 0x59CA, 0x0592, 0x59CB, 0x0590, 0x59CC, 0x194B,

+    0x59CD, 0x058F, 0x59CE, 0x1949, 0x59CF, 0x1948, 0x59D0, 0x058E,

+    0x59D1, 0x058C, 0x59D2, 0x0595, 0x59D3, 0x0591, 0x59D4, 0x0589,

+    0x59D6, 0x1950, 0x59D8, 0x06F5, 0x59DA, 0x06FC, 0x59DB, 0x1AAB,

+    0x59DC, 0x06F4, 0x59DD, 0x1AA3, 0x59DE, 0x1A9F, 0x59E0, 0x1AAF,

+    0x59E1, 0x1A9E, 0x59E3, 0x06F7, 0x59E4, 0x1AA8, 0x59E5, 0x06FA,

+    0x59E6, 0x06FD, 0x59E8, 0x06F8, 0x59E9, 0x1AAC, 0x59EA, 0x06FB,

+    0x59EC, 0x088A, 0x59ED, 0x1AB2, 0x59EE, 0x1AA0, 0x59F1, 0x1AA2,

+    0x59F2, 0x1AA9, 0x59F3, 0x1AAD, 0x59F4, 0x1AB1, 0x59F5, 0x1AAE,

+    0x59F6, 0x1AA7, 0x59F7, 0x1AAA, 0x59FA, 0x1AA4, 0x59FB, 0x06FF,

+    0x59FC, 0x1AA6, 0x59FD, 0x1AA5, 0x59FE, 0x1AB0, 0x59FF, 0x06F6,

+    0x5A00, 0x1AA1, 0x5A01, 0x06FE, 0x5A03, 0x06F9, 0x5A09, 0x0890,

+    0x5A0A, 0x1C75, 0x5A0C, 0x088F, 0x5A0F, 0x1C73, 0x5A11, 0x0884,

+    0x5A13, 0x0889, 0x5A15, 0x1C72, 0x5A16, 0x1C6F, 0x5A17, 0x1C74,

+    0x5A18, 0x0885, 0x5A19, 0x1C6E, 0x5A1B, 0x0888, 0x5A1C, 0x0886,

+    0x5A1E, 0x1C76, 0x5A1F, 0x0887, 0x5A20, 0x088B, 0x5A23, 0x088C,

+    0x5A25, 0x088E, 0x5A29, 0x088D, 0x5A2D, 0x1C70, 0x5A2E, 0x1C71,

+    0x5A33, 0x1C77, 0x5A35, 0x1E9C, 0x5A36, 0x0A46, 0x5A37, 0x20FD,

+    0x5A38, 0x1E9B, 0x5A39, 0x1EAE, 0x5A3C, 0x0A4C, 0x5A3E, 0x1EAC,

+    0x5A40, 0x0A4B, 0x5A41, 0x0A47, 0x5A42, 0x1EB5, 0x5A43, 0x1EA5,

+    0x5A44, 0x1EA8, 0x5A46, 0x0A4F, 0x5A47, 0x1EB2, 0x5A48, 0x1EAA,

+    0x5A49, 0x0A48, 0x5A4A, 0x0A50, 0x5A4C, 0x1EAF, 0x5A4D, 0x1EAD,

+    0x5A50, 0x1E9E, 0x5A51, 0x1EB3, 0x5A52, 0x1EA7, 0x5A53, 0x1EA2,

+    0x5A55, 0x1E98, 0x5A56, 0x1EB4, 0x5A57, 0x1EA4, 0x5A58, 0x1E97,

+    0x5A5A, 0x0A4E, 0x5A5B, 0x1EA9, 0x5A5C, 0x1EB6, 0x5A5D, 0x1EA6,

+    0x5A5E, 0x1E9A, 0x5A5F, 0x1E9F, 0x5A60, 0x1E96, 0x5A62, 0x0A4D,

+    0x5A64, 0x1EA3, 0x5A65, 0x1EA0, 0x5A66, 0x0A49, 0x5A67, 0x1E99,

+    0x5A69, 0x1EB1, 0x5A6A, 0x0A4A, 0x5A6C, 0x1EA1, 0x5A6D, 0x1E9D,

+    0x5A70, 0x1EB0, 0x5A77, 0x0C23, 0x5A78, 0x20F6, 0x5A7A, 0x20F3,

+    0x5A7B, 0x2104, 0x5A7C, 0x20F8, 0x5A7D, 0x2105, 0x5A7F, 0x0C25,

+    0x5A83, 0x2101, 0x5A84, 0x20FE, 0x5A8A, 0x20FF, 0x5A8B, 0x2102,

+    0x5A8C, 0x2106, 0x5A8E, 0x1EAB, 0x5A8F, 0x2108, 0x5A90, 0x23B6,

+    0x5A92, 0x0C26, 0x5A93, 0x2109, 0x5A94, 0x20F1, 0x5A95, 0x20FB,

+    0x5A97, 0x2100, 0x5A9A, 0x0C24, 0x5A9B, 0x0C27, 0x5A9C, 0x2107,

+    0x5A9D, 0x210A, 0x5A9E, 0x20F5, 0x5A9F, 0x20F2, 0x5AA2, 0x20F4,

+    0x5AA5, 0x20F9, 0x5AA6, 0x20F7, 0x5AA7, 0x0C28, 0x5AA9, 0x2103,

+    0x5AAC, 0x20FA, 0x5AAE, 0x20FC, 0x5AAF, 0x20F0, 0x5AB0, 0x23AA,

+    0x5AB1, 0x23A8, 0x5AB2, 0x0DFC, 0x5AB3, 0x0DFA, 0x5AB4, 0x23B2,

+    0x5AB5, 0x23A9, 0x5AB6, 0x23B3, 0x5AB7, 0x23AF, 0x5AB8, 0x23A7,

+    0x5AB9, 0x23B5, 0x5ABA, 0x23A6, 0x5ABB, 0x23AD, 0x5ABC, 0x0DF9,

+    0x5ABD, 0x0DF8, 0x5ABE, 0x0DF7, 0x5ABF, 0x23AB, 0x5AC0, 0x23B0,

+    0x5AC1, 0x0DF4, 0x5AC2, 0x0DFB, 0x5AC4, 0x23A4, 0x5AC6, 0x23AE,

+    0x5AC7, 0x23A3, 0x5AC8, 0x23AC, 0x5AC9, 0x0DF5, 0x5ACA, 0x23B1,

+    0x5ACB, 0x23A5, 0x5ACC, 0x0DF6, 0x5ACD, 0x23B4, 0x5AD5, 0x2650,

+    0x5AD6, 0x0FB4, 0x5AD7, 0x0FB3, 0x5AD8, 0x0FB5, 0x5AD9, 0x265C,

+    0x5ADA, 0x2652, 0x5ADB, 0x2658, 0x5ADC, 0x264D, 0x5ADD, 0x265B,

+    0x5ADE, 0x265A, 0x5ADF, 0x265E, 0x5AE0, 0x2657, 0x5AE1, 0x0FB0,

+    0x5AE2, 0x2656, 0x5AE3, 0x0FB6, 0x5AE5, 0x264F, 0x5AE6, 0x0FB1,

+    0x5AE8, 0x265D, 0x5AE9, 0x0FB2, 0x5AEA, 0x2651, 0x5AEB, 0x2654,

+    0x5AEC, 0x2659, 0x5AED, 0x2653, 0x5AEE, 0x264E, 0x5AF3, 0x2655,

+    0x5AF4, 0x28AB, 0x5AF5, 0x112D, 0x5AF6, 0x28AE, 0x5AF7, 0x28AD,

+    0x5AF8, 0x28B0, 0x5AF9, 0x28B2, 0x5AFA, 0x36EE, 0x5AFB, 0x112B,

+    0x5AFD, 0x28AC, 0x5AFF, 0x28AA, 0x5B01, 0x28B3, 0x5B02, 0x28B1,

+    0x5B03, 0x28AF, 0x5B05, 0x28B5, 0x5B07, 0x28B4, 0x5B08, 0x112F,

+    0x5B09, 0x112A, 0x5B0B, 0x112C, 0x5B0C, 0x112E, 0x5B0F, 0x28B6,

+    0x5B10, 0x2B22, 0x5B13, 0x2B21, 0x5B14, 0x2B20, 0x5B16, 0x2B23,

+    0x5B17, 0x2B1C, 0x5B19, 0x2B1D, 0x5B1A, 0x2B25, 0x5B1B, 0x2B1E,

+    0x5B1D, 0x12A8, 0x5B1E, 0x2B27, 0x5B20, 0x2B26, 0x5B21, 0x2B1F,

+    0x5B23, 0x2D52, 0x5B24, 0x13C5, 0x5B25, 0x2D50, 0x5B26, 0x2D55,

+    0x5B27, 0x2D54, 0x5B28, 0x2B24, 0x5B2A, 0x13C4, 0x5B2C, 0x2D53,

+    0x5B2D, 0x2D4F, 0x5B2E, 0x2D57, 0x5B2F, 0x2D56, 0x5B30, 0x13C3,

+    0x5B32, 0x2D51, 0x5B34, 0x12A9, 0x5B38, 0x14CE, 0x5B3C, 0x2F18,

+    0x5B3D, 0x3089, 0x5B3E, 0x308A, 0x5B3F, 0x308B, 0x5B40, 0x160F,

+    0x5B43, 0x1610, 0x5B45, 0x31CC, 0x5B47, 0x32CD, 0x5B48, 0x32CC,

+    0x5B4B, 0x337C, 0x5B4C, 0x337D, 0x5B4D, 0x3413, 0x5B4E, 0x3482,

+    0x5B50, 0x027F, 0x5B51, 0x0280, 0x5B53, 0x0281, 0x5B54, 0x02C6,

+    0x5B55, 0x0333, 0x5B56, 0x17DC, 0x5B57, 0x03BF, 0x5B58, 0x03C0,

+    0x5B5A, 0x047F, 0x5B5B, 0x0480, 0x5B5C, 0x047E, 0x5B5D, 0x047D,

+    0x5B5F, 0x0597, 0x5B62, 0x1957, 0x5B63, 0x0599, 0x5B64, 0x0598,

+    0x5B65, 0x1958, 0x5B69, 0x0700, 0x5B6B, 0x0891, 0x5B6C, 0x1C78,

+    0x5B6E, 0x1EB8, 0x5B70, 0x0A51, 0x5B71, 0x0C2A, 0x5B72, 0x1EB7,

+    0x5B73, 0x0C29, 0x5B75, 0x0FB7, 0x5B77, 0x265F, 0x5B78, 0x12AA,

+    0x5B7A, 0x13C6, 0x5B7B, 0x2D58, 0x5B7D, 0x1611, 0x5B7F, 0x16C0,

+    0x5B80, 0x0225, 0x5B81, 0x179E, 0x5B83, 0x0334, 0x5B84, 0x179F,

+    0x5B85, 0x03C3, 0x5B87, 0x03C1, 0x5B88, 0x03C2, 0x5B89, 0x03C4,

+    0x5B8B, 0x0482, 0x5B8C, 0x0481, 0x5B8E, 0x1863, 0x5B8F, 0x0483,

+    0x5B92, 0x1864, 0x5B93, 0x1959, 0x5B95, 0x195A, 0x5B97, 0x059A,

+    0x5B98, 0x059C, 0x5B99, 0x059E, 0x5B9A, 0x059B, 0x5B9B, 0x059F,

+    0x5B9C, 0x059D, 0x5BA2, 0x0704, 0x5BA3, 0x0701, 0x5BA4, 0x0703,

+    0x5BA5, 0x0705, 0x5BA6, 0x0702, 0x5BA7, 0x1C79, 0x5BA8, 0x1AB3,

+    0x5BAC, 0x1C7B, 0x5BAD, 0x1C7A, 0x5BAE, 0x0897, 0x5BB0, 0x0893,

+    0x5BB3, 0x0894, 0x5BB4, 0x0896, 0x5BB5, 0x0898, 0x5BB6, 0x0895,

+    0x5BB8, 0x089A, 0x5BB9, 0x0899, 0x5BBF, 0x0A56, 0x5BC0, 0x1EBA,

+    0x5BC1, 0x1EB9, 0x5BC2, 0x0A55, 0x5BC4, 0x0A54, 0x5BC5, 0x0A53,

+    0x5BC6, 0x0A57, 0x5BC7, 0x0A52, 0x5BCA, 0x2110, 0x5BCB, 0x210D,

+    0x5BCC, 0x0C2C, 0x5BCD, 0x210C, 0x5BCE, 0x2111, 0x5BD0, 0x0C2E,

+    0x5BD1, 0x210F, 0x5BD2, 0x0C2B, 0x5BD3, 0x0C2D, 0x5BD4, 0x210E,

+    0x5BD6, 0x23B7, 0x5BD8, 0x23B8, 0x5BD9, 0x23B9, 0x5BDE, 0x0FB8,

+    0x5BDF, 0x0FC0, 0x5BE0, 0x2660, 0x5BE1, 0x0FBA, 0x5BE2, 0x0FBE,

+    0x5BE3, 0x2661, 0x5BE4, 0x0FBF, 0x5BE5, 0x0FBB, 0x5BE6, 0x0FBC,

+    0x5BE7, 0x0FB9, 0x5BE8, 0x0FBD, 0x5BE9, 0x1132, 0x5BEA, 0x210B,

+    0x5BEB, 0x1133, 0x5BEC, 0x1131, 0x5BEE, 0x1130, 0x5BEF, 0x2B28,

+    0x5BF0, 0x12AB, 0x5BF1, 0x2D59, 0x5BF2, 0x2D5A, 0x5BF5, 0x157B,

+    0x5BF6, 0x1612, 0x5BF8, 0x0282, 0x5BFA, 0x03C5, 0x5C01, 0x0706,

+    0x5C03, 0x1C7C, 0x5C04, 0x089B, 0x5C07, 0x0A5A, 0x5C08, 0x0A59,

+    0x5C09, 0x0A58, 0x5C0A, 0x0C2F, 0x5C0B, 0x0C30, 0x5C0C, 0x2112,

+    0x5C0D, 0x0FC1, 0x5C0E, 0x12AC, 0x5C0F, 0x0283, 0x5C10, 0x1787,

+    0x5C11, 0x02C7, 0x5C12, 0x17A0, 0x5C15, 0x17DD, 0x5C16, 0x03C6,

+    0x5C1A, 0x05A0, 0x5C1F, 0x23BA, 0x5C22, 0x0284, 0x5C24, 0x02C8,

+    0x5C25, 0x17DE, 0x5C28, 0x1865, 0x5C2A, 0x1866, 0x5C2C, 0x0484,

+    0x5C30, 0x2113, 0x5C31, 0x0C31, 0x5C33, 0x23BB, 0x5C37, 0x13C7,

+    0x5C38, 0x0285, 0x5C39, 0x0299, 0x5C3A, 0x02C9, 0x5C3B, 0x17A1,

+    0x5C3C, 0x0335, 0x5C3E, 0x0488, 0x5C3F, 0x0487, 0x5C40, 0x0485,

+    0x5C41, 0x0486, 0x5C44, 0x195B, 0x5C45, 0x05A2, 0x5C46, 0x05A3,

+    0x5C47, 0x195C, 0x5C48, 0x05A1, 0x5C4B, 0x070A, 0x5C4C, 0x1AB4,

+    0x5C4D, 0x0709, 0x5C4E, 0x0707, 0x5C4F, 0x0708, 0x5C50, 0x089E,

+    0x5C51, 0x089C, 0x5C54, 0x1C7E, 0x5C55, 0x089D, 0x5C56, 0x1C7D,

+    0x5C58, 0x0892, 0x5C59, 0x1EBB, 0x5C5C, 0x0A5C, 0x5C5D, 0x0A5D,

+    0x5C60, 0x0A5B, 0x5C62, 0x0FC2, 0x5C63, 0x2662, 0x5C64, 0x1134,

+    0x5C65, 0x1135, 0x5C67, 0x28B7, 0x5C68, 0x13C8, 0x5C69, 0x2F19,

+    0x5C6A, 0x2F1A, 0x5C6C, 0x166E, 0x5C6D, 0x3483, 0x5C6E, 0x1776,

+    0x5C6F, 0x02CA, 0x5C71, 0x0286, 0x5C73, 0x17A3, 0x5C74, 0x17A2,

+    0x5C79, 0x03C7, 0x5C7A, 0x17E0, 0x5C7B, 0x17E1, 0x5C7C, 0x17DF,

+    0x5C7E, 0x17E2, 0x5C86, 0x186E, 0x5C88, 0x1869, 0x5C89, 0x186B,

+    0x5C8A, 0x186D, 0x5C8B, 0x186A, 0x5C8C, 0x048C, 0x5C8D, 0x1867,

+    0x5C8F, 0x1868, 0x5C90, 0x0489, 0x5C91, 0x048A, 0x5C92, 0x186C,

+    0x5C93, 0x186F, 0x5C94, 0x048B, 0x5C95, 0x1870, 0x5C9D, 0x196A,

+    0x5C9F, 0x1964, 0x5CA0, 0x195F, 0x5CA1, 0x05A5, 0x5CA2, 0x1967,

+    0x5CA3, 0x1965, 0x5CA4, 0x195E, 0x5CA5, 0x196B, 0x5CA6, 0x196E,

+    0x5CA7, 0x1969, 0x5CA8, 0x1962, 0x5CA9, 0x05A7, 0x5CAA, 0x1968,

+    0x5CAB, 0x05A8, 0x5CAC, 0x1963, 0x5CAD, 0x1966, 0x5CAE, 0x195D,

+    0x5CAF, 0x1961, 0x5CB0, 0x196D, 0x5CB1, 0x05A9, 0x5CB3, 0x05AA,

+    0x5CB5, 0x1960, 0x5CB6, 0x196C, 0x5CB7, 0x05A4, 0x5CB8, 0x05A6,

+    0x5CC6, 0x1AC5, 0x5CC7, 0x1ABE, 0x5CC8, 0x1AC4, 0x5CC9, 0x1ABD,

+    0x5CCA, 0x1ABF, 0x5CCB, 0x1AB9, 0x5CCC, 0x1AB7, 0x5CCE, 0x1AC6,

+    0x5CCF, 0x1AC3, 0x5CD0, 0x1AB5, 0x5CD2, 0x070C, 0x5CD3, 0x1AC1,

+    0x5CD4, 0x1AC2, 0x5CD6, 0x1AC0, 0x5CD7, 0x1AB8, 0x5CD8, 0x1AB6,

+    0x5CD9, 0x070B, 0x5CDA, 0x1ABC, 0x5CDB, 0x1ABA, 0x5CDE, 0x1ABB,

+    0x5CDF, 0x1AC7, 0x5CE8, 0x08A3, 0x5CEA, 0x08A2, 0x5CEC, 0x1C7F,

+    0x5CED, 0x089F, 0x5CEE, 0x1C81, 0x5CF0, 0x08A4, 0x5CF1, 0x1C82,

+    0x5CF4, 0x08A7, 0x5CF6, 0x08A5, 0x5CF7, 0x1C83, 0x5CF8, 0x1AC8,

+    0x5CF9, 0x1C85, 0x5CFB, 0x08A1, 0x5CFD, 0x08A0, 0x5CFF, 0x1C80,

+    0x5D00, 0x1C84, 0x5D01, 0x08A6, 0x5D06, 0x0A5F, 0x5D07, 0x0A5E,

+    0x5D0B, 0x1EBD, 0x5D0C, 0x1EC1, 0x5D0D, 0x1EC3, 0x5D0E, 0x0A60,

+    0x5D0F, 0x1EC6, 0x5D11, 0x0A64, 0x5D12, 0x1EC8, 0x5D14, 0x0A66,

+    0x5D16, 0x0A62, 0x5D17, 0x0A6A, 0x5D19, 0x0A67, 0x5D1A, 0x1EBF,

+    0x5D1B, 0x0A61, 0x5D1D, 0x1EBE, 0x5D1E, 0x1EBC, 0x5D1F, 0x1ECA,

+    0x5D20, 0x1EC0, 0x5D22, 0x0A63, 0x5D23, 0x1EC9, 0x5D24, 0x0A68,

+    0x5D25, 0x1EC5, 0x5D26, 0x1EC4, 0x5D27, 0x0A69, 0x5D28, 0x1EC2,

+    0x5D29, 0x0A65, 0x5D2E, 0x1ECB, 0x5D30, 0x1EC7, 0x5D31, 0x2122,

+    0x5D32, 0x2129, 0x5D33, 0x211E, 0x5D34, 0x0C34, 0x5D35, 0x211A,

+    0x5D36, 0x212A, 0x5D37, 0x2114, 0x5D38, 0x2127, 0x5D39, 0x2125,

+    0x5D3A, 0x211F, 0x5D3C, 0x2128, 0x5D3D, 0x2121, 0x5D3F, 0x2119,

+    0x5D40, 0x212B, 0x5D41, 0x2117, 0x5D42, 0x2124, 0x5D43, 0x2115,

+    0x5D45, 0x212C, 0x5D47, 0x0C35, 0x5D49, 0x2126, 0x5D4A, 0x23BE,

+    0x5D4B, 0x2118, 0x5D4C, 0x0C32, 0x5D4E, 0x211C, 0x5D50, 0x0C33,

+    0x5D51, 0x211B, 0x5D52, 0x2120, 0x5D55, 0x211D, 0x5D59, 0x2123,

+    0x5D5E, 0x23C2, 0x5D62, 0x23C5, 0x5D63, 0x23BD, 0x5D65, 0x23BF,

+    0x5D67, 0x23C4, 0x5D68, 0x23C3, 0x5D69, 0x0DFD, 0x5D6B, 0x2116,

+    0x5D6C, 0x23C1, 0x5D6F, 0x0DFE, 0x5D71, 0x23BC, 0x5D72, 0x23C0,

+    0x5D77, 0x2669, 0x5D79, 0x2670, 0x5D7A, 0x2667, 0x5D7C, 0x266E,

+    0x5D7D, 0x2665, 0x5D7E, 0x266D, 0x5D7F, 0x2671, 0x5D80, 0x2664,

+    0x5D81, 0x2668, 0x5D82, 0x2663, 0x5D84, 0x0FC3, 0x5D86, 0x2666,

+    0x5D87, 0x0FC4, 0x5D88, 0x266C, 0x5D89, 0x266B, 0x5D8A, 0x266A,

+    0x5D8D, 0x266F, 0x5D92, 0x28BB, 0x5D93, 0x28BD, 0x5D94, 0x1137,

+    0x5D95, 0x28BE, 0x5D97, 0x28B9, 0x5D99, 0x28B8, 0x5D9A, 0x28C2,

+    0x5D9C, 0x28C0, 0x5D9D, 0x1136, 0x5D9E, 0x28C3, 0x5D9F, 0x28BA,

+    0x5DA0, 0x28BF, 0x5DA1, 0x28C1, 0x5DA2, 0x28BC, 0x5DA7, 0x2B2C,

+    0x5DA8, 0x2B31, 0x5DA9, 0x2B2B, 0x5DAA, 0x2B30, 0x5DAC, 0x2B29,

+    0x5DAD, 0x2B33, 0x5DAE, 0x2B2F, 0x5DAF, 0x2B34, 0x5DB0, 0x2B2E,

+    0x5DB1, 0x2B2A, 0x5DB2, 0x2B32, 0x5DB4, 0x2B35, 0x5DB5, 0x2B2D,

+    0x5DB7, 0x2D5B, 0x5DB8, 0x13CC, 0x5DBA, 0x13CA, 0x5DBC, 0x13C9,

+    0x5DBD, 0x13CB, 0x5DC0, 0x2F1B, 0x5DC2, 0x3023, 0x5DC3, 0x308C,

+    0x5DC6, 0x31CD, 0x5DC7, 0x31CE, 0x5DC9, 0x1613, 0x5DCB, 0x32CE,

+    0x5DCD, 0x166F, 0x5DCF, 0x32CF, 0x5DD1, 0x337F, 0x5DD2, 0x16C2,

+    0x5DD4, 0x16C1, 0x5DD5, 0x337E, 0x5DD6, 0x16F7, 0x5DD8, 0x3414,

+    0x5DDB, 0x0226, 0x5DDD, 0x0287, 0x5DDE, 0x03C8, 0x5DDF, 0x17E3,

+    0x5DE0, 0x1871, 0x5DE1, 0x051A, 0x5DE2, 0x0A6B, 0x5DE5, 0x0288,

+    0x5DE6, 0x0338, 0x5DE7, 0x0337, 0x5DE8, 0x0336, 0x5DEB, 0x048D,

+    0x5DEE, 0x08A8, 0x5DF0, 0x23C6, 0x5DF1, 0x0289, 0x5DF2, 0x028A,

+    0x5DF3, 0x028B, 0x5DF4, 0x02CB, 0x5DF7, 0x070D, 0x5DF9, 0x1AC9,

+    0x5DFD, 0x0C36, 0x5DFE, 0x028C, 0x5DFF, 0x1788, 0x5E02, 0x0339,

+    0x5E03, 0x033A, 0x5E04, 0x17A4, 0x5E06, 0x03C9, 0x5E0A, 0x1872,

+    0x5E0C, 0x048E, 0x5E0E, 0x1873, 0x5E11, 0x05B0, 0x5E14, 0x1970,

+    0x5E15, 0x05AE, 0x5E16, 0x05AD, 0x5E17, 0x196F, 0x5E18, 0x05AB,

+    0x5E19, 0x1971, 0x5E1A, 0x05AC, 0x5E1B, 0x05AF, 0x5E1D, 0x070E,

+    0x5E1F, 0x0710, 0x5E20, 0x1ACD, 0x5E21, 0x1ACA, 0x5E22, 0x1ACB,

+    0x5E23, 0x1ACC, 0x5E24, 0x1ACE, 0x5E25, 0x070F, 0x5E28, 0x1C87,

+    0x5E29, 0x1C86, 0x5E2B, 0x08AA, 0x5E2D, 0x08A9, 0x5E33, 0x0A6E,

+    0x5E34, 0x1ECD, 0x5E36, 0x0A6D, 0x5E37, 0x0A6F, 0x5E38, 0x0A6C,

+    0x5E3D, 0x0C38, 0x5E3E, 0x1ECC, 0x5E40, 0x0C39, 0x5E41, 0x212E,

+    0x5E43, 0x0C3A, 0x5E44, 0x212D, 0x5E45, 0x0C37, 0x5E4A, 0x23C9,

+    0x5E4B, 0x23CB, 0x5E4C, 0x0DFF, 0x5E4D, 0x23CA, 0x5E4E, 0x23C8,

+    0x5E4F, 0x23C7, 0x5E53, 0x2674, 0x5E54, 0x0FC9, 0x5E55, 0x0FC7,

+    0x5E57, 0x0FC8, 0x5E58, 0x2672, 0x5E59, 0x2673, 0x5E5B, 0x0FC5,

+    0x5E5C, 0x28C7, 0x5E5D, 0x28C5, 0x5E5F, 0x1139, 0x5E60, 0x28C6,

+    0x5E61, 0x113A, 0x5E62, 0x1138, 0x5E63, 0x0FC6, 0x5E66, 0x2B38,

+    0x5E67, 0x2B36, 0x5E68, 0x2B37, 0x5E69, 0x28C4, 0x5E6A, 0x2D5D,

+    0x5E6B, 0x13CD, 0x5E6C, 0x2D5C, 0x5E6D, 0x2F1C, 0x5E6E, 0x2F1D,

+    0x5E6F, 0x2B39, 0x5E70, 0x308D, 0x5E72, 0x028D, 0x5E73, 0x033B,

+    0x5E74, 0x03CB, 0x5E75, 0x17E4, 0x5E76, 0x03CA, 0x5E78, 0x05B1,

+    0x5E79, 0x0E00, 0x5E7A, 0x0227, 0x5E7B, 0x02CC, 0x5E7C, 0x033C,

+    0x5E7D, 0x0711, 0x5E7E, 0x0C3B, 0x5E7F, 0x0228, 0x5E80, 0x17A5,

+    0x5E82, 0x17A6, 0x5E84, 0x17E5, 0x5E87, 0x0490, 0x5E88, 0x1877,

+    0x5E89, 0x1875, 0x5E8A, 0x0491, 0x5E8B, 0x1874, 0x5E8C, 0x1876,

+    0x5E8D, 0x1878, 0x5E8F, 0x048F, 0x5E95, 0x05B5, 0x5E96, 0x05B6,

+    0x5E97, 0x05B3, 0x5E9A, 0x05B2, 0x5E9B, 0x1AD2, 0x5E9C, 0x05B4,

+    0x5EA0, 0x0712, 0x5EA2, 0x1AD1, 0x5EA3, 0x1AD3, 0x5EA4, 0x1AD0,

+    0x5EA5, 0x1AD4, 0x5EA6, 0x0713, 0x5EA7, 0x08AD, 0x5EA8, 0x1C88,

+    0x5EAA, 0x1C8A, 0x5EAB, 0x08AB, 0x5EAC, 0x1C8B, 0x5EAD, 0x08AC,

+    0x5EAE, 0x1C89, 0x5EB0, 0x1ACF, 0x5EB1, 0x1ECE, 0x5EB2, 0x1ED1,

+    0x5EB3, 0x1ED2, 0x5EB4, 0x1ECF, 0x5EB5, 0x0A73, 0x5EB6, 0x0A72,

+    0x5EB7, 0x0A70, 0x5EB8, 0x0A71, 0x5EB9, 0x1ED0, 0x5EBE, 0x0A74,

+    0x5EC1, 0x0C3D, 0x5EC2, 0x0C3E, 0x5EC4, 0x0C3F, 0x5EC5, 0x23CC,

+    0x5EC6, 0x23CE, 0x5EC7, 0x23D0, 0x5EC8, 0x0E02, 0x5EC9, 0x0E01,

+    0x5ECA, 0x0C3C, 0x5ECB, 0x23CF, 0x5ECC, 0x23CD, 0x5ECE, 0x2678,

+    0x5ED1, 0x2676, 0x5ED2, 0x267C, 0x5ED3, 0x0FCA, 0x5ED4, 0x267D,

+    0x5ED5, 0x267A, 0x5ED6, 0x0FCB, 0x5ED7, 0x2677, 0x5ED8, 0x2675,

+    0x5ED9, 0x267B, 0x5EDA, 0x113C, 0x5EDB, 0x28C9, 0x5EDC, 0x2679,

+    0x5EDD, 0x113E, 0x5EDE, 0x28CA, 0x5EDF, 0x113D, 0x5EE0, 0x1140,

+    0x5EE1, 0x28CB, 0x5EE2, 0x113B, 0x5EE3, 0x113F, 0x5EE5, 0x2B3E,

+    0x5EE6, 0x2B3C, 0x5EE7, 0x2B3B, 0x5EE8, 0x2B3D, 0x5EE9, 0x2B3A,

+    0x5EEC, 0x157D, 0x5EEE, 0x31CF, 0x5EEF, 0x31D0, 0x5EF1, 0x32D0,

+    0x5EF2, 0x3380, 0x5EF3, 0x1742, 0x5EF4, 0x0229, 0x5EF6, 0x05B7,

+    0x5EF7, 0x0492, 0x5EFA, 0x0714, 0x5EFE, 0x028E, 0x5EFF, 0x02CD,

+    0x5F01, 0x033D, 0x5F02, 0x17E6, 0x5F04, 0x0493, 0x5F05, 0x1879,

+    0x5F07, 0x1AD5, 0x5F08, 0x0715, 0x5F0A, 0x0FCC, 0x5F0B, 0x028F,

+    0x5F0F, 0x03CC, 0x5F12, 0x0E03, 0x5F13, 0x0290, 0x5F14, 0x02CE,

+    0x5F15, 0x02CF, 0x5F17, 0x033F, 0x5F18, 0x033E, 0x5F1A, 0x17E7,

+    0x5F1B, 0x03CD, 0x5F1D, 0x187A, 0x5F1F, 0x0494, 0x5F22, 0x1973,

+    0x5F23, 0x1974, 0x5F24, 0x1975, 0x5F26, 0x05B8, 0x5F27, 0x05B9,

+    0x5F28, 0x1972, 0x5F29, 0x05BA, 0x5F2D, 0x0716, 0x5F2E, 0x1AD6,

+    0x5F30, 0x1C8D, 0x5F31, 0x08AE, 0x5F33, 0x1C8C, 0x5F35, 0x0A75,

+    0x5F36, 0x1ED3, 0x5F37, 0x0A76, 0x5F38, 0x1ED4, 0x5F3C, 0x0C40,

+    0x5F40, 0x23D1, 0x5F43, 0x267F, 0x5F44, 0x267E, 0x5F46, 0x0FCD,

+    0x5F48, 0x1141, 0x5F49, 0x28CC, 0x5F4A, 0x12AD, 0x5F4B, 0x2B3F,

+    0x5F4C, 0x13CE, 0x5F4E, 0x16C3, 0x5F4F, 0x3416, 0x5F50, 0x022A,

+    0x5F54, 0x1976, 0x5F56, 0x1AD7, 0x5F57, 0x0A77, 0x5F58, 0x212F,

+    0x5F59, 0x0E04, 0x5F5D, 0x14CF, 0x5F61, 0x022B, 0x5F62, 0x0496,

+    0x5F64, 0x0495, 0x5F65, 0x0717, 0x5F67, 0x1C8E, 0x5F69, 0x0A79,

+    0x5F6A, 0x0B89, 0x5F6B, 0x0A7A, 0x5F6C, 0x0A78, 0x5F6D, 0x0C41,

+    0x5F6F, 0x2680, 0x5F70, 0x0FCE, 0x5F71, 0x1142, 0x5F73, 0x1777,

+    0x5F74, 0x17E8, 0x5F76, 0x187C, 0x5F77, 0x0497, 0x5F78, 0x187B,

+    0x5F79, 0x0498, 0x5F7C, 0x05BE, 0x5F7D, 0x1979, 0x5F7E, 0x1978,

+    0x5F7F, 0x05BD, 0x5F80, 0x05BB, 0x5F81, 0x05BC, 0x5F82, 0x1977,

+    0x5F85, 0x0719, 0x5F86, 0x1AD8, 0x5F87, 0x071C, 0x5F88, 0x0718,

+    0x5F89, 0x071E, 0x5F8A, 0x071A, 0x5F8B, 0x071B, 0x5F8C, 0x071D,

+    0x5F90, 0x08B1, 0x5F91, 0x08B0, 0x5F92, 0x08AF, 0x5F96, 0x1ED6,

+    0x5F97, 0x0A7B, 0x5F98, 0x0A7E, 0x5F99, 0x0A7C, 0x5F9B, 0x1ED5,

+    0x5F9C, 0x0A81, 0x5F9E, 0x0A7D, 0x5F9F, 0x1ED7, 0x5FA0, 0x0A80,

+    0x5FA1, 0x0A7F, 0x5FA5, 0x2131, 0x5FA6, 0x2130, 0x5FA8, 0x0C44,

+    0x5FA9, 0x0C42, 0x5FAA, 0x0C43, 0x5FAB, 0x2132, 0x5FAC, 0x0E05,

+    0x5FAD, 0x23D3, 0x5FAE, 0x0E06, 0x5FAF, 0x23D2, 0x5FB2, 0x28CD,

+    0x5FB5, 0x1144, 0x5FB6, 0x2681, 0x5FB7, 0x1143, 0x5FB9, 0x0FCF,

+    0x5FBB, 0x2B41, 0x5FBC, 0x2B40, 0x5FBD, 0x13CF, 0x5FBE, 0x2D5E,

+    0x5FBF, 0x308E, 0x5FC0, 0x31D1, 0x5FC1, 0x31D2, 0x5FC3, 0x02D0,

+    0x5FC5, 0x0340, 0x5FC9, 0x17A7, 0x5FCC, 0x049A, 0x5FCD, 0x049C,

+    0x5FCF, 0x17EB, 0x5FD0, 0x187F, 0x5FD1, 0x187E, 0x5FD2, 0x187D,

+    0x5FD4, 0x17EA, 0x5FD5, 0x17E9, 0x5FD6, 0x03CF, 0x5FD7, 0x049B,

+    0x5FD8, 0x0499, 0x5FD9, 0x03CE, 0x5FDD, 0x05BF, 0x5FDE, 0x197A,

+    0x5FE0, 0x05C0, 0x5FE1, 0x1884, 0x5FE3, 0x1886, 0x5FE4, 0x1885,

+    0x5FE5, 0x197B, 0x5FE8, 0x1881, 0x5FEA, 0x04A0, 0x5FEB, 0x049E,

+    0x5FED, 0x1880, 0x5FEE, 0x1882, 0x5FEF, 0x1888, 0x5FF1, 0x049D,

+    0x5FF3, 0x1883, 0x5FF4, 0x188C, 0x5FF5, 0x05C2, 0x5FF7, 0x1889,

+    0x5FF8, 0x049F, 0x5FFA, 0x1887, 0x5FFB, 0x188A, 0x5FFD, 0x05C1,

+    0x5FFF, 0x05C3, 0x6000, 0x188B, 0x6009, 0x198F, 0x600A, 0x1982,

+    0x600B, 0x1980, 0x600C, 0x198E, 0x600D, 0x1989, 0x600E, 0x0723,

+    0x600F, 0x05C4, 0x6010, 0x198A, 0x6011, 0x198D, 0x6012, 0x071F,

+    0x6013, 0x198C, 0x6014, 0x05C5, 0x6015, 0x05CA, 0x6016, 0x05C8,

+    0x6017, 0x1983, 0x6019, 0x197E, 0x601A, 0x1985, 0x601B, 0x05CF,

+    0x601C, 0x1990, 0x601D, 0x0720, 0x601E, 0x1986, 0x6020, 0x0721,

+    0x6021, 0x05CB, 0x6022, 0x1988, 0x6024, 0x1AE7, 0x6025, 0x0722,

+    0x6026, 0x197D, 0x6027, 0x05CC, 0x6028, 0x0724, 0x6029, 0x05CD,

+    0x602A, 0x05C9, 0x602B, 0x05CE, 0x602C, 0x1987, 0x602D, 0x197C,

+    0x602E, 0x198B, 0x602F, 0x05C6, 0x6032, 0x197F, 0x6033, 0x1984,

+    0x6034, 0x1981, 0x6035, 0x05C7, 0x6037, 0x1AD9, 0x6039, 0x1ADA,

+    0x6040, 0x1AE4, 0x6041, 0x1C92, 0x6042, 0x1AE5, 0x6043, 0x072A,

+    0x6044, 0x1AE8, 0x6045, 0x1ADE, 0x6046, 0x0729, 0x6047, 0x1AE0,

+    0x6049, 0x1AE1, 0x604C, 0x1AE3, 0x604D, 0x0725, 0x6050, 0x08B5,

+    0x6052, 0x36EC, 0x6053, 0x1ADF, 0x6054, 0x1ADB, 0x6055, 0x08B6,

+    0x6058, 0x1AE9, 0x6059, 0x08B2, 0x605A, 0x1C90, 0x605B, 0x1AE2,

+    0x605D, 0x1C8F, 0x605E, 0x1ADD, 0x605F, 0x1AE6, 0x6062, 0x0728,

+    0x6063, 0x08B3, 0x6064, 0x072E, 0x6065, 0x08B4, 0x6066, 0x1AEA,

+    0x6067, 0x1C91, 0x6068, 0x0727, 0x6069, 0x08B8, 0x606A, 0x072D,

+    0x606B, 0x072C, 0x606C, 0x072B, 0x606D, 0x08B7, 0x606E, 0x1AEB,

+    0x606F, 0x08B9, 0x6070, 0x0726, 0x6072, 0x1ADC, 0x607F, 0x0A82,

+    0x6080, 0x1C95, 0x6081, 0x1C97, 0x6083, 0x1C99, 0x6084, 0x08BA,

+    0x6085, 0x08C0, 0x6086, 0x1EDA, 0x6087, 0x1C9D, 0x6088, 0x1C94,

+    0x6089, 0x0A84, 0x608A, 0x1ED8, 0x608C, 0x08BF, 0x608D, 0x08BD,

+    0x608E, 0x1C9F, 0x6090, 0x1ED9, 0x6092, 0x1C96, 0x6094, 0x08BE,

+    0x6095, 0x1C9A, 0x6096, 0x08C1, 0x6097, 0x1C9C, 0x609A, 0x08BC,

+    0x609B, 0x1C9B, 0x609C, 0x1C9E, 0x609D, 0x1C98, 0x609F, 0x08BB,

+    0x60A0, 0x0A85, 0x60A2, 0x1C93, 0x60A3, 0x0A83, 0x60A8, 0x0A86,

+    0x60B0, 0x1EDC, 0x60B1, 0x1EE5, 0x60B2, 0x0C47, 0x60B4, 0x0A88,

+    0x60B5, 0x0A8D, 0x60B6, 0x0C48, 0x60B7, 0x1EE7, 0x60B8, 0x0A94,

+    0x60B9, 0x2134, 0x60BA, 0x1EDD, 0x60BB, 0x0A8C, 0x60BC, 0x0A8F,

+    0x60BD, 0x0A8A, 0x60BE, 0x1EDB, 0x60BF, 0x1EE9, 0x60C0, 0x1EEC,

+    0x60C1, 0x2143, 0x60C3, 0x1EEA, 0x60C4, 0x2138, 0x60C5, 0x0A8B,

+    0x60C6, 0x0A92, 0x60C7, 0x0A96, 0x60C8, 0x1EE4, 0x60C9, 0x2133,

+    0x60CA, 0x1EE8, 0x60CB, 0x0A87, 0x60CC, 0x2135, 0x60CD, 0x1EEB,

+    0x60CE, 0x2137, 0x60CF, 0x1EE0, 0x60D1, 0x0C45, 0x60D3, 0x1EDE,

+    0x60D4, 0x1EDF, 0x60D5, 0x0A91, 0x60D8, 0x0A90, 0x60D9, 0x1EE2,

+    0x60DA, 0x0A95, 0x60DB, 0x1EE6, 0x60DC, 0x0A8E, 0x60DD, 0x1EE3,

+    0x60DF, 0x0A93, 0x60E0, 0x0C49, 0x60E1, 0x0C46, 0x60E2, 0x2136,

+    0x60E4, 0x1EE1, 0x60E6, 0x0A89, 0x60F0, 0x0C4E, 0x60F1, 0x0C52,

+    0x60F2, 0x213A, 0x60F3, 0x0E0B, 0x60F4, 0x0C50, 0x60F5, 0x213E,

+    0x60F6, 0x0C54, 0x60F7, 0x23D4, 0x60F8, 0x2140, 0x60F9, 0x0E0D,

+    0x60FA, 0x0C4C, 0x60FB, 0x0C4F, 0x60FC, 0x2141, 0x60FE, 0x2142,

+    0x60FF, 0x2148, 0x6100, 0x0C56, 0x6101, 0x0E0E, 0x6103, 0x2144,

+    0x6104, 0x2149, 0x6105, 0x213D, 0x6106, 0x0E18, 0x6108, 0x0E0F,

+    0x6109, 0x0C55, 0x610A, 0x213B, 0x610B, 0x214A, 0x610D, 0x0E17,

+    0x610E, 0x0C53, 0x610F, 0x0E08, 0x6110, 0x2147, 0x6112, 0x0C57,

+    0x6113, 0x213F, 0x6114, 0x2139, 0x6115, 0x0C4D, 0x6116, 0x213C,

+    0x6118, 0x2145, 0x611A, 0x0E07, 0x611B, 0x0E0C, 0x611C, 0x0C4A,

+    0x611D, 0x2146, 0x611F, 0x0E0A, 0x6123, 0x0C4B, 0x6127, 0x0E16,

+    0x6128, 0x2683, 0x6129, 0x23DF, 0x612B, 0x23D7, 0x612C, 0x2682,

+    0x612E, 0x23DB, 0x612F, 0x23DD, 0x6132, 0x23DA, 0x6134, 0x0E15,

+    0x6136, 0x23D9, 0x6137, 0x0E19, 0x613B, 0x2692, 0x613E, 0x0E14,

+    0x613F, 0x0FD1, 0x6140, 0x23E0, 0x6141, 0x2684, 0x6144, 0x0E12,

+    0x6145, 0x23D8, 0x6146, 0x23DC, 0x6147, 0x0FD0, 0x6148, 0x0E09,

+    0x6149, 0x23D5, 0x614A, 0x23D6, 0x614B, 0x0FD2, 0x614C, 0x0E11,

+    0x614D, 0x0E13, 0x614E, 0x0E10, 0x614F, 0x23DE, 0x6152, 0x2688,

+    0x6153, 0x2689, 0x6154, 0x268E, 0x6155, 0x1149, 0x6156, 0x2695,

+    0x6158, 0x0FD8, 0x615A, 0x0FD7, 0x615B, 0x2690, 0x615D, 0x1148,

+    0x615E, 0x2685, 0x615F, 0x0FD6, 0x6161, 0x2694, 0x6162, 0x0FD4,

+    0x6163, 0x0FD5, 0x6165, 0x2691, 0x6166, 0x28DE, 0x6167, 0x1146,

+    0x6168, 0x0C51, 0x616A, 0x2693, 0x616B, 0x114D, 0x616C, 0x268B,

+    0x616E, 0x1147, 0x6170, 0x114C, 0x6171, 0x2686, 0x6172, 0x268A,

+    0x6173, 0x2687, 0x6174, 0x268D, 0x6175, 0x0FD9, 0x6176, 0x1145,

+    0x6177, 0x0FD3, 0x6179, 0x28D0, 0x617A, 0x268F, 0x617C, 0x114B,

+    0x617E, 0x114E, 0x6180, 0x268C, 0x6182, 0x114A, 0x6183, 0x28CF,

+    0x6189, 0x28D4, 0x618A, 0x12B1, 0x618B, 0x28CE, 0x618C, 0x2B4D,

+    0x618D, 0x28DD, 0x618E, 0x1152, 0x6190, 0x1150, 0x6191, 0x12AF,

+    0x6192, 0x28DA, 0x6193, 0x28D6, 0x6194, 0x1156, 0x6196, 0x2B44,

+    0x619A, 0x1154, 0x619B, 0x28D5, 0x619D, 0x2B42, 0x619F, 0x28D9,

+    0x61A1, 0x28DC, 0x61A2, 0x28D3, 0x61A4, 0x1155, 0x61A7, 0x114F,

+    0x61A8, 0x2B43, 0x61A9, 0x12B0, 0x61AA, 0x28DB, 0x61AB, 0x1151,

+    0x61AC, 0x1153, 0x61AD, 0x28D8, 0x61AE, 0x1157, 0x61AF, 0x28D7,

+    0x61B0, 0x28D2, 0x61B1, 0x28D1, 0x61B2, 0x12AE, 0x61B3, 0x28DF,

+    0x61B4, 0x2B46, 0x61B5, 0x2D60, 0x61B6, 0x12B3, 0x61B8, 0x2B4C,

+    0x61BA, 0x2B4A, 0x61BC, 0x2D61, 0x61BE, 0x12B4, 0x61BF, 0x2B4B,

+    0x61C1, 0x2B48, 0x61C2, 0x13D1, 0x61C3, 0x2D5F, 0x61C5, 0x2B45,

+    0x61C6, 0x2B47, 0x61C7, 0x13D2, 0x61C8, 0x12B6, 0x61C9, 0x13D0,

+    0x61CA, 0x12B5, 0x61CB, 0x13D4, 0x61CC, 0x2B49, 0x61CD, 0x12B2,

+    0x61D6, 0x2F26, 0x61D8, 0x2F1E, 0x61DE, 0x2D67, 0x61DF, 0x2F1F,

+    0x61E0, 0x2D63, 0x61E3, 0x14D0, 0x61E4, 0x2D65, 0x61E5, 0x2D64,

+    0x61E6, 0x13D3, 0x61E7, 0x2D62, 0x61E8, 0x2D66, 0x61E9, 0x2F27,

+    0x61EA, 0x2F23, 0x61EB, 0x2F25, 0x61ED, 0x2F20, 0x61EE, 0x2F21,

+    0x61F0, 0x2F24, 0x61F1, 0x2F22, 0x61F2, 0x157E, 0x61F5, 0x1581,

+    0x61F6, 0x1580, 0x61F7, 0x157F, 0x61F8, 0x1614, 0x61F9, 0x31D3,

+    0x61FA, 0x1615, 0x61FB, 0x308F, 0x61FC, 0x1670, 0x61FD, 0x32D1,

+    0x61FE, 0x1671, 0x61FF, 0x16C4, 0x6200, 0x16F8, 0x6201, 0x3417,

+    0x6203, 0x3418, 0x6204, 0x3419, 0x6207, 0x3533, 0x6208, 0x02D1,

+    0x6209, 0x17A8, 0x620A, 0x0341, 0x620C, 0x03D1, 0x620D, 0x03D2,

+    0x620E, 0x03D0, 0x6210, 0x03D3, 0x6211, 0x04A2, 0x6212, 0x04A1,

+    0x6214, 0x1991, 0x6215, 0x05D1, 0x6216, 0x05D0, 0x6219, 0x1CA0,

+    0x621A, 0x0A97, 0x621B, 0x0A98, 0x621F, 0x0C58, 0x6220, 0x23E1,

+    0x6221, 0x0E1A, 0x6222, 0x0E1B, 0x6223, 0x23E3, 0x6224, 0x23E5,

+    0x6225, 0x23E4, 0x6227, 0x2697, 0x6229, 0x2696, 0x622A, 0x0FDA,

+    0x622B, 0x2698, 0x622D, 0x28E0, 0x622E, 0x1158, 0x6230, 0x12B7,

+    0x6232, 0x13D5, 0x6233, 0x14D1, 0x6234, 0x13D6, 0x6236, 0x02D2,

+    0x623A, 0x188D, 0x623D, 0x1992, 0x623E, 0x05D3, 0x623F, 0x05D2,

+    0x6240, 0x05D4, 0x6241, 0x072F, 0x6242, 0x1AEC, 0x6243, 0x1AED,

+    0x6246, 0x1CA1, 0x6247, 0x08C2, 0x6248, 0x0A99, 0x6249, 0x0C59,

+    0x624A, 0x214B, 0x624B, 0x02D3, 0x624D, 0x0291, 0x624E, 0x02D4,

+    0x6250, 0x17A9, 0x6251, 0x0345, 0x6252, 0x0344, 0x6253, 0x0342,

+    0x6254, 0x0343, 0x6258, 0x03D6, 0x6259, 0x17F2, 0x625A, 0x17F4,

+    0x625B, 0x03D5, 0x625C, 0x17EC, 0x625E, 0x17ED, 0x6260, 0x17F3,

+    0x6261, 0x17EF, 0x6262, 0x17F1, 0x6263, 0x03D4, 0x6264, 0x17EE,

+    0x6265, 0x17F5, 0x6266, 0x17F0, 0x626D, 0x04A9, 0x626E, 0x04B2,

+    0x626F, 0x04B0, 0x6270, 0x1897, 0x6271, 0x1894, 0x6272, 0x189C,

+    0x6273, 0x04AE, 0x6274, 0x189D, 0x6276, 0x04A7, 0x6277, 0x189A,

+    0x6279, 0x04AD, 0x627A, 0x1896, 0x627B, 0x1895, 0x627C, 0x04AB,

+    0x627D, 0x189B, 0x627E, 0x04AC, 0x627F, 0x05D5, 0x6280, 0x04A6,

+    0x6281, 0x1898, 0x6283, 0x188E, 0x6284, 0x04A3, 0x6286, 0x04B6,

+    0x6287, 0x1893, 0x6288, 0x1899, 0x6289, 0x04A8, 0x628A, 0x04AA,

+    0x628C, 0x188F, 0x628E, 0x1890, 0x628F, 0x1891, 0x6291, 0x04B5,

+    0x6292, 0x04AF, 0x6293, 0x04B4, 0x6294, 0x1892, 0x6295, 0x04B3,

+    0x6296, 0x04A5, 0x6297, 0x04A4, 0x6298, 0x04B1, 0x62A8, 0x05E3,

+    0x62A9, 0x199E, 0x62AA, 0x1997, 0x62AB, 0x05DE, 0x62AC, 0x05F1,

+    0x62AD, 0x1993, 0x62AE, 0x199A, 0x62AF, 0x199C, 0x62B0, 0x199F,

+    0x62B1, 0x05EC, 0x62B3, 0x199B, 0x62B4, 0x1994, 0x62B5, 0x05EA,

+    0x62B6, 0x1998, 0x62B8, 0x19A0, 0x62B9, 0x05DB, 0x62BB, 0x199D,

+    0x62BC, 0x05E5, 0x62BD, 0x05E4, 0x62BE, 0x1996, 0x62BF, 0x05D9,

+    0x62C2, 0x05DA, 0x62C4, 0x05D8, 0x62C6, 0x05F0, 0x62C7, 0x05E8,

+    0x62C8, 0x05E2, 0x62C9, 0x05D6, 0x62CA, 0x1999, 0x62CB, 0x05E1,

+    0x62CC, 0x05D7, 0x62CD, 0x05E9, 0x62CE, 0x05F2, 0x62CF, 0x1AEE,

+    0x62D0, 0x05E6, 0x62D1, 0x1995, 0x62D2, 0x05DC, 0x62D3, 0x05DF,

+    0x62D4, 0x05E0, 0x62D6, 0x05EE, 0x62D7, 0x05EF, 0x62D8, 0x05ED,

+    0x62D9, 0x05E7, 0x62DA, 0x05EB, 0x62DB, 0x05DD, 0x62DC, 0x0730,

+    0x62EB, 0x1AF4, 0x62EC, 0x073C, 0x62ED, 0x0734, 0x62EE, 0x0736,

+    0x62EF, 0x073B, 0x62F0, 0x1B00, 0x62F1, 0x0739, 0x62F2, 0x1CA2,

+    0x62F3, 0x08C3, 0x62F4, 0x073E, 0x62F5, 0x1AF1, 0x62F6, 0x1AF9,

+    0x62F7, 0x073A, 0x62F8, 0x1AF8, 0x62F9, 0x1AF5, 0x62FA, 0x1AFD,

+    0x62FB, 0x1AFF, 0x62FC, 0x0733, 0x62FD, 0x0737, 0x62FE, 0x073D,

+    0x62FF, 0x08C5, 0x6300, 0x1AFA, 0x6301, 0x0735, 0x6302, 0x0740,

+    0x6303, 0x1AF3, 0x6307, 0x0738, 0x6308, 0x08C4, 0x6309, 0x0732,

+    0x630B, 0x1AF0, 0x630C, 0x1AF7, 0x630D, 0x1AEF, 0x630E, 0x1AF2,

+    0x630F, 0x1AF6, 0x6310, 0x1CA3, 0x6311, 0x073F, 0x6313, 0x1AFB,

+    0x6314, 0x1AFC, 0x6315, 0x1AFE, 0x6316, 0x0731, 0x6328, 0x08D3,

+    0x6329, 0x1CAF, 0x632A, 0x08D1, 0x632B, 0x08D2, 0x632C, 0x1CA5,

+    0x632D, 0x1CB5, 0x632F, 0x08C8, 0x6332, 0x1EED, 0x6333, 0x1CB7,

+    0x6334, 0x1CB1, 0x6336, 0x1CA8, 0x6338, 0x1CBA, 0x6339, 0x1CAB,

+    0x633A, 0x08CE, 0x633B, 0x1F04, 0x633C, 0x1CAE, 0x633D, 0x08D0,

+    0x633E, 0x08C7, 0x6340, 0x1CBC, 0x6341, 0x1CB0, 0x6342, 0x08CA,

+    0x6343, 0x1CA9, 0x6344, 0x1CA6, 0x6345, 0x1CA7, 0x6346, 0x08CB,

+    0x6347, 0x1CB6, 0x6348, 0x1CBD, 0x6349, 0x08CD, 0x634A, 0x1CAD,

+    0x634B, 0x1CAC, 0x634C, 0x08D5, 0x634D, 0x08D4, 0x634E, 0x08C6,

+    0x634F, 0x08CC, 0x6350, 0x08CF, 0x6351, 0x1CB9, 0x6354, 0x1CB3,

+    0x6355, 0x08C9, 0x6356, 0x1CA4, 0x6357, 0x1CBB, 0x6358, 0x1CB2,

+    0x6359, 0x1CB4, 0x635A, 0x1CB8, 0x6365, 0x1EEE, 0x6367, 0x0AA1,

+    0x6368, 0x0AB5, 0x6369, 0x0AB4, 0x636B, 0x0AA9, 0x636D, 0x1F00,

+    0x636E, 0x1EFC, 0x636F, 0x1EF9, 0x6370, 0x1F0B, 0x6371, 0x0AA4,

+    0x6372, 0x0A9C, 0x6375, 0x1EFE, 0x6376, 0x0C69, 0x6377, 0x0AA0,

+    0x6378, 0x1F06, 0x637A, 0x0AB6, 0x637B, 0x0AB3, 0x637C, 0x1F02,

+    0x637D, 0x1EF1, 0x6380, 0x0AB2, 0x6381, 0x1F08, 0x6382, 0x1EF0,

+    0x6383, 0x0AA7, 0x6384, 0x0AAB, 0x6385, 0x1F07, 0x6387, 0x1EFA,

+    0x6388, 0x0AAC, 0x6389, 0x0AA6, 0x638A, 0x1EEF, 0x638C, 0x0C5B,

+    0x638D, 0x1F0A, 0x638E, 0x1EF8, 0x638F, 0x0AB1, 0x6390, 0x1EFB,

+    0x6391, 0x1F09, 0x6392, 0x0AB0, 0x6394, 0x214C, 0x6396, 0x0A9D,

+    0x6397, 0x1EF6, 0x6398, 0x0AA2, 0x6399, 0x0AAD, 0x639B, 0x0AA8,

+    0x639C, 0x1EFF, 0x639D, 0x1EF5, 0x639E, 0x1EF3, 0x639F, 0x1F05,

+    0x63A0, 0x0A9A, 0x63A1, 0x0AAE, 0x63A2, 0x0A9E, 0x63A3, 0x0C5A,

+    0x63A4, 0x1F03, 0x63A5, 0x0A9F, 0x63A7, 0x0A9B, 0x63A8, 0x0AAA,

+    0x63A9, 0x0AA5, 0x63AA, 0x0AA3, 0x63AB, 0x1EF7, 0x63AC, 0x0AAF,

+    0x63AD, 0x1EF4, 0x63AE, 0x1F01, 0x63AF, 0x1EFD, 0x63B0, 0x214E,

+    0x63B1, 0x214D, 0x63BD, 0x1EF2, 0x63BE, 0x215E, 0x63C0, 0x0C5D,

+    0x63C2, 0x2164, 0x63C3, 0x2153, 0x63C4, 0x2161, 0x63C5, 0x23E6,

+    0x63C6, 0x0C60, 0x63C7, 0x2165, 0x63C8, 0x2168, 0x63C9, 0x0C5F,

+    0x63CA, 0x2156, 0x63CB, 0x2167, 0x63CC, 0x2166, 0x63CD, 0x0C61,

+    0x63CE, 0x214F, 0x63CF, 0x0C5C, 0x63D0, 0x0C64, 0x63D2, 0x0C62,

+    0x63D3, 0x2163, 0x63D5, 0x2159, 0x63D6, 0x0C66, 0x63D7, 0x216A,

+    0x63D8, 0x2162, 0x63D9, 0x216B, 0x63DA, 0x0C6E, 0x63DB, 0x0C6C,

+    0x63DC, 0x2160, 0x63DD, 0x215F, 0x63DF, 0x215D, 0x63E0, 0x2157,

+    0x63E1, 0x0C65, 0x63E3, 0x0C63, 0x63E4, 0x1CAA, 0x63E5, 0x2150,

+    0x63E7, 0x2404, 0x63E8, 0x2151, 0x63E9, 0x0C5E, 0x63EA, 0x0C6B,

+    0x63EB, 0x23E8, 0x63ED, 0x0C67, 0x63EE, 0x0C68, 0x63EF, 0x2152,

+    0x63F0, 0x2169, 0x63F1, 0x23E7, 0x63F2, 0x215A, 0x63F3, 0x2155,

+    0x63F4, 0x0C6A, 0x63F5, 0x215B, 0x63F6, 0x2158, 0x63F9, 0x0C6F,

+    0x6406, 0x0E2A, 0x6409, 0x23EB, 0x640A, 0x23FE, 0x640B, 0x2403,

+    0x640C, 0x23F7, 0x640D, 0x0E26, 0x640E, 0x2408, 0x640F, 0x0E23,

+    0x6410, 0x23E9, 0x6412, 0x23EA, 0x6413, 0x0E1C, 0x6414, 0x0E25,

+    0x6415, 0x23F1, 0x6416, 0x0E28, 0x6417, 0x0E29, 0x6418, 0x23F2,

+    0x641A, 0x23FF, 0x641B, 0x2405, 0x641C, 0x0E24, 0x641E, 0x0E1E,

+    0x641F, 0x23F0, 0x6420, 0x23EC, 0x6421, 0x2407, 0x6422, 0x23F5,

+    0x6423, 0x23F6, 0x6424, 0x23ED, 0x6425, 0x2401, 0x6426, 0x23F8,

+    0x6427, 0x2402, 0x6428, 0x23FA, 0x642A, 0x0E1F, 0x642B, 0x2699,

+    0x642C, 0x0E22, 0x642D, 0x0E20, 0x642E, 0x2406, 0x642F, 0x23FD,

+    0x6430, 0x23F9, 0x6433, 0x23EE, 0x6434, 0x0FE4, 0x6435, 0x23FC,

+    0x6436, 0x0E27, 0x6437, 0x23F4, 0x6439, 0x23F3, 0x643D, 0x0E21,

+    0x643E, 0x0E1D, 0x643F, 0x26AE, 0x6440, 0x2400, 0x6441, 0x23FB,

+    0x6443, 0x23EF, 0x644B, 0x26A9, 0x644D, 0x269A, 0x644E, 0x26A5,

+    0x6450, 0x26AC, 0x6451, 0x0FE2, 0x6452, 0x0C6D, 0x6453, 0x26AA,

+    0x6454, 0x0FDD, 0x6458, 0x0FDC, 0x6459, 0x26B1, 0x645B, 0x269B,

+    0x645C, 0x26A8, 0x645D, 0x269C, 0x645E, 0x26A7, 0x645F, 0x0FE0,

+    0x6460, 0x26AB, 0x6461, 0x215C, 0x6465, 0x26B2, 0x6466, 0x26A3,

+    0x6467, 0x0FE3, 0x6468, 0x28EE, 0x6469, 0x1159, 0x646B, 0x26B0,

+    0x646C, 0x26AF, 0x646D, 0x0FE5, 0x646E, 0x28E1, 0x646F, 0x115A,

+    0x6470, 0x28E2, 0x6472, 0x269F, 0x6473, 0x26A0, 0x6474, 0x269D,

+    0x6475, 0x26A2, 0x6476, 0x269E, 0x6477, 0x26B3, 0x6478, 0x0FDF,

+    0x6479, 0x115B, 0x647A, 0x0FE1, 0x647B, 0x0FE6, 0x647D, 0x26A1,

+    0x647F, 0x26AD, 0x6482, 0x26A6, 0x6485, 0x28E5, 0x6487, 0x0FDB,

+    0x6488, 0x115E, 0x6489, 0x2B54, 0x648A, 0x28EA, 0x648B, 0x28E9,

+    0x648C, 0x28EB, 0x648F, 0x28E8, 0x6490, 0x115F, 0x6492, 0x1165,

+    0x6493, 0x1162, 0x6495, 0x1163, 0x6496, 0x28E3, 0x6497, 0x28E6,

+    0x6498, 0x28F0, 0x6499, 0x116B, 0x649A, 0x1169, 0x649C, 0x28E7,

+    0x649D, 0x2154, 0x649E, 0x115C, 0x649F, 0x28ED, 0x64A0, 0x28E4,

+    0x64A2, 0x116C, 0x64A3, 0x28EC, 0x64A4, 0x0FDE, 0x64A5, 0x1161,

+    0x64A6, 0x26A4, 0x64A9, 0x1164, 0x64AB, 0x1168, 0x64AC, 0x116A,

+    0x64AD, 0x1167, 0x64AE, 0x1166, 0x64B0, 0x1160, 0x64B1, 0x28EF,

+    0x64B2, 0x115D, 0x64B3, 0x116D, 0x64BB, 0x12BB, 0x64BC, 0x12BC,

+    0x64BD, 0x2B53, 0x64BE, 0x12C5, 0x64BF, 0x12C2, 0x64C1, 0x12B9,

+    0x64C2, 0x12C0, 0x64C3, 0x2B55, 0x64C4, 0x12BE, 0x64C5, 0x12B8,

+    0x64C7, 0x12BF, 0x64C9, 0x2B52, 0x64CA, 0x13D8, 0x64CB, 0x12BA,

+    0x64CD, 0x12C1, 0x64CE, 0x13D7, 0x64CF, 0x2B51, 0x64D0, 0x2B50,

+    0x64D2, 0x12C3, 0x64D4, 0x12C4, 0x64D6, 0x2B4F, 0x64D7, 0x2B4E,

+    0x64D8, 0x13D9, 0x64D9, 0x2B58, 0x64DA, 0x12BD, 0x64DB, 0x2B56,

+    0x64E0, 0x13DA, 0x64E2, 0x13DF, 0x64E3, 0x2D6A, 0x64E4, 0x2D6C,

+    0x64E6, 0x13DC, 0x64E8, 0x2D6D, 0x64E9, 0x2D69, 0x64EB, 0x2D6B,

+    0x64EC, 0x13DD, 0x64ED, 0x13E0, 0x64EF, 0x2D68, 0x64F0, 0x13DB,

+    0x64F1, 0x13DE, 0x64F2, 0x14D3, 0x64F3, 0x2B57, 0x64F4, 0x14D2,

+    0x64F7, 0x14D8, 0x64F8, 0x2F2B, 0x64FA, 0x14D6, 0x64FB, 0x14D7,

+    0x64FC, 0x2F2E, 0x64FD, 0x2F2A, 0x64FE, 0x14D4, 0x64FF, 0x2F28,

+    0x6500, 0x1582, 0x6501, 0x2F2C, 0x6503, 0x2F2D, 0x6504, 0x2F29,

+    0x6506, 0x14D5, 0x6507, 0x3090, 0x6509, 0x3093, 0x650C, 0x3094,

+    0x650D, 0x3092, 0x650E, 0x3095, 0x650F, 0x1583, 0x6510, 0x3091,

+    0x6513, 0x31D7, 0x6514, 0x1617, 0x6515, 0x31D6, 0x6516, 0x31D5,

+    0x6517, 0x31D4, 0x6518, 0x1616, 0x6519, 0x1618, 0x651B, 0x32D2,

+    0x651C, 0x1673, 0x651D, 0x1672, 0x6520, 0x3382, 0x6521, 0x3381,

+    0x6522, 0x3384, 0x6523, 0x16F9, 0x6524, 0x16C5, 0x6525, 0x341B,

+    0x6526, 0x3383, 0x6529, 0x341A, 0x652A, 0x16FB, 0x652B, 0x16FA,

+    0x652C, 0x1721, 0x652D, 0x3484, 0x652E, 0x34CA, 0x652F, 0x02D5,

+    0x6532, 0x216C, 0x6533, 0x2B59, 0x6534, 0x022C, 0x6536, 0x03D7,

+    0x6537, 0x17F6, 0x6538, 0x04B9, 0x6539, 0x04B7, 0x653B, 0x04B8,

+    0x653D, 0x19A1, 0x653E, 0x05F3, 0x653F, 0x0741, 0x6541, 0x1B01,

+    0x6543, 0x1B02, 0x6545, 0x0742, 0x6546, 0x1CBF, 0x6548, 0x08D6,

+    0x6549, 0x08D7, 0x654A, 0x1CBE, 0x654F, 0x0ABD, 0x6551, 0x0AB9,

+    0x6553, 0x1F0C, 0x6554, 0x0AC0, 0x6555, 0x0ABF, 0x6556, 0x0AB8,

+    0x6557, 0x0ABB, 0x6558, 0x0ABE, 0x6559, 0x0ABA, 0x655C, 0x2170,

+    0x655D, 0x0AB7, 0x655E, 0x0C70, 0x6562, 0x0C72, 0x6563, 0x0C73,

+    0x6564, 0x216F, 0x6565, 0x2172, 0x6566, 0x0C71, 0x6567, 0x216D,

+    0x6568, 0x2171, 0x656A, 0x216E, 0x656C, 0x0E2B, 0x656F, 0x2409,

+    0x6572, 0x0FE7, 0x6573, 0x26B4, 0x6574, 0x12C6, 0x6575, 0x116E,

+    0x6576, 0x28F1, 0x6577, 0x116F, 0x6578, 0x1170, 0x6579, 0x28F3,

+    0x657A, 0x28F2, 0x657B, 0x28F4, 0x657C, 0x2B5B, 0x657F, 0x2B5A,

+    0x6580, 0x2D6F, 0x6581, 0x2D6E, 0x6582, 0x13E1, 0x6583, 0x13E2,

+    0x6584, 0x3096, 0x6587, 0x02D6, 0x658C, 0x2173, 0x6590, 0x0C75,

+    0x6591, 0x0C74, 0x6592, 0x240A, 0x6594, 0x2F2F, 0x6595, 0x1674,

+    0x6596, 0x341C, 0x6597, 0x02D7, 0x6599, 0x08D8, 0x659B, 0x0AC2,

+    0x659C, 0x0AC1, 0x659D, 0x2174, 0x659E, 0x2175, 0x659F, 0x0E2C,

+    0x65A0, 0x26B5, 0x65A1, 0x0FE8, 0x65A2, 0x2B5C, 0x65A4, 0x02D8,

+    0x65A5, 0x0346, 0x65A7, 0x05F4, 0x65A8, 0x19A2, 0x65AA, 0x1B03,

+    0x65AB, 0x0743, 0x65AC, 0x0AC3, 0x65AE, 0x2176, 0x65AF, 0x0C76,

+    0x65B0, 0x0E2D, 0x65B2, 0x28F5, 0x65B3, 0x28F6, 0x65B6, 0x2D70,

+    0x65B7, 0x14D9, 0x65B8, 0x34CB, 0x65B9, 0x02D9, 0x65BB, 0x19A3,

+    0x65BC, 0x05F5, 0x65BD, 0x0744, 0x65BF, 0x1B04, 0x65C1, 0x08D9,

+    0x65C2, 0x1CC3, 0x65C3, 0x1CC1, 0x65C4, 0x1CC2, 0x65C5, 0x08DA,

+    0x65C6, 0x1CC0, 0x65CB, 0x0AC5, 0x65CC, 0x0AC6, 0x65CD, 0x1F0D,

+    0x65CE, 0x0AC7, 0x65CF, 0x0AC4, 0x65D0, 0x2177, 0x65D2, 0x2178,

+    0x65D3, 0x240B, 0x65D6, 0x0FEA, 0x65D7, 0x0FE9, 0x65DA, 0x2D71,

+    0x65DB, 0x2F30, 0x65DD, 0x3098, 0x65DE, 0x3097, 0x65DF, 0x31D8,

+    0x65E0, 0x022D, 0x65E1, 0x1789, 0x65E2, 0x0745, 0x65E5, 0x02DA,

+    0x65E6, 0x0347, 0x65E8, 0x03D9, 0x65E9, 0x03D8, 0x65EC, 0x03DA,

+    0x65ED, 0x03DB, 0x65EE, 0x17F8, 0x65EF, 0x17F7, 0x65F0, 0x189E,

+    0x65F1, 0x04BA, 0x65F2, 0x18A1, 0x65F3, 0x18A0, 0x65F4, 0x189F,

+    0x65F5, 0x18A2, 0x65FA, 0x05F6, 0x65FB, 0x19A9, 0x65FC, 0x19A5,

+    0x65FD, 0x19AE, 0x6600, 0x05FD, 0x6602, 0x05FB, 0x6603, 0x19AA,

+    0x6604, 0x19A6, 0x6605, 0x19AD, 0x6606, 0x05FA, 0x6607, 0x0601,

+    0x6608, 0x19A8, 0x6609, 0x19A4, 0x660A, 0x0600, 0x660B, 0x19AB,

+    0x660C, 0x05F9, 0x660D, 0x19AC, 0x660E, 0x05FC, 0x660F, 0x05FE,

+    0x6610, 0x19B0, 0x6611, 0x19AF, 0x6612, 0x19A7, 0x6613, 0x05F8,

+    0x6614, 0x05F7, 0x6615, 0x05FF, 0x661C, 0x1B09, 0x661D, 0x1B0F,

+    0x661F, 0x074B, 0x6620, 0x0748, 0x6621, 0x1B06, 0x6622, 0x1B0B,

+    0x6624, 0x074E, 0x6625, 0x0746, 0x6626, 0x1B0A, 0x6627, 0x0749,

+    0x6628, 0x074C, 0x662B, 0x1B0D, 0x662D, 0x0747, 0x662E, 0x1B12,

+    0x662F, 0x074A, 0x6631, 0x074D, 0x6632, 0x1B07, 0x6633, 0x1B0C,

+    0x6634, 0x1B10, 0x6635, 0x1B08, 0x6636, 0x1B05, 0x6639, 0x1B11,

+    0x663A, 0x1B0E, 0x6641, 0x08E2, 0x6642, 0x08DB, 0x6643, 0x08DE,

+    0x6645, 0x08E1, 0x6647, 0x1CC6, 0x6649, 0x08DC, 0x664A, 0x1CC4,

+    0x664C, 0x08E0, 0x664F, 0x08DD, 0x6651, 0x1CC7, 0x6652, 0x08DF,

+    0x6659, 0x1F11, 0x665A, 0x0AC9, 0x665B, 0x1F10, 0x665C, 0x1F12,

+    0x665D, 0x0AC8, 0x665E, 0x0ACD, 0x665F, 0x1CC5, 0x6661, 0x1F0F,

+    0x6662, 0x1F13, 0x6664, 0x0ACA, 0x6665, 0x1F0E, 0x6666, 0x0ACC,

+    0x6668, 0x0ACB, 0x666A, 0x217F, 0x666C, 0x217A, 0x666E, 0x0C77,

+    0x666F, 0x0C7B, 0x6670, 0x0C78, 0x6671, 0x217D, 0x6672, 0x2180,

+    0x6674, 0x0C79, 0x6676, 0x0C7A, 0x6677, 0x0C7F, 0x6678, 0x2414,

+    0x6679, 0x217E, 0x667A, 0x0C7D, 0x667B, 0x217B, 0x667C, 0x2179,

+    0x667E, 0x0C7E, 0x6680, 0x217C, 0x6684, 0x0E33, 0x6686, 0x240C,

+    0x6687, 0x0E30, 0x6688, 0x0E31, 0x6689, 0x0E2F, 0x668A, 0x2411,

+    0x668B, 0x2410, 0x668C, 0x240D, 0x668D, 0x0E35, 0x6690, 0x240F,

+    0x6691, 0x0C7C, 0x6694, 0x2413, 0x6695, 0x240E, 0x6696, 0x0E32,

+    0x6697, 0x0E2E, 0x6698, 0x0E34, 0x6699, 0x2412, 0x669D, 0x0FED,

+    0x669F, 0x26B8, 0x66A0, 0x26B7, 0x66A1, 0x26B6, 0x66A2, 0x0FEB,

+    0x66A8, 0x0FEC, 0x66A9, 0x28F9, 0x66AA, 0x28FC, 0x66AB, 0x1172,

+    0x66AE, 0x1171, 0x66AF, 0x28FD, 0x66B0, 0x28F8, 0x66B1, 0x1174,

+    0x66B2, 0x28FA, 0x66B4, 0x1173, 0x66B5, 0x28F7, 0x66B7, 0x28FB,

+    0x66B8, 0x12CC, 0x66B9, 0x12C9, 0x66BA, 0x2B65, 0x66BB, 0x2B64,

+    0x66BD, 0x2B63, 0x66BE, 0x2B5E, 0x66C0, 0x2B5F, 0x66C4, 0x12CA,

+    0x66C6, 0x12C7, 0x66C7, 0x12CB, 0x66C8, 0x2B5D, 0x66C9, 0x12C8,

+    0x66CA, 0x2B60, 0x66CB, 0x2B61, 0x66CC, 0x2B66, 0x66CF, 0x2B62,

+    0x66D2, 0x2D72, 0x66D6, 0x13E4, 0x66D8, 0x2F33, 0x66D9, 0x13E3,

+    0x66DA, 0x2F31, 0x66DB, 0x2F32, 0x66DC, 0x14DA, 0x66DD, 0x1585,

+    0x66DE, 0x3099, 0x66E0, 0x1584, 0x66E3, 0x31DA, 0x66E4, 0x31DB,

+    0x66E6, 0x1619, 0x66E8, 0x31D9, 0x66E9, 0x1675, 0x66EB, 0x341D,

+    0x66EC, 0x16FC, 0x66ED, 0x3485, 0x66EE, 0x3486, 0x66F0, 0x02DB,

+    0x66F2, 0x03DC, 0x66F3, 0x03DD, 0x66F4, 0x04BB, 0x66F6, 0x19B1,

+    0x66F7, 0x074F, 0x66F8, 0x08E3, 0x66F9, 0x0ACE, 0x66FC, 0x0A1F,

+    0x66FE, 0x0C80, 0x66FF, 0x0C81, 0x6700, 0x0BF0, 0x6701, 0x2181,

+    0x6703, 0x0E36, 0x6704, 0x26BA, 0x6705, 0x26B9, 0x6708, 0x02DC,

+    0x6709, 0x03DE, 0x670A, 0x19B2, 0x670B, 0x0603, 0x670D, 0x0602,

+    0x670F, 0x1B13, 0x6710, 0x1B14, 0x6712, 0x1CC8, 0x6713, 0x1CC9,

+    0x6714, 0x08E4, 0x6715, 0x08E5, 0x6717, 0x08E6, 0x6718, 0x1F14,

+    0x671B, 0x0AD0, 0x671D, 0x0C83, 0x671F, 0x0C82, 0x6720, 0x2415,

+    0x6721, 0x2522, 0x6722, 0x26BB, 0x6723, 0x2B67, 0x6726, 0x14DB,

+    0x6727, 0x161A, 0x6728, 0x02DD, 0x672A, 0x034A, 0x672B, 0x034B,

+    0x672C, 0x0349, 0x672D, 0x034C, 0x672E, 0x0348, 0x6731, 0x03E1,

+    0x6733, 0x1800, 0x6734, 0x03E0, 0x6735, 0x03E2, 0x6738, 0x17FB,

+    0x6739, 0x17FA, 0x673A, 0x17FD, 0x673B, 0x17FC, 0x673C, 0x17FF,

+    0x673D, 0x03DF, 0x673E, 0x17F9, 0x673F, 0x17FE, 0x6745, 0x18A3,

+    0x6746, 0x04C5, 0x6747, 0x18A4, 0x6748, 0x18A8, 0x6749, 0x04C4,

+    0x674B, 0x18AC, 0x674C, 0x18A7, 0x674D, 0x18AA, 0x674E, 0x04BD,

+    0x674F, 0x04BE, 0x6750, 0x04BF, 0x6751, 0x04C0, 0x6753, 0x04C7,

+    0x6755, 0x18A6, 0x6756, 0x04C2, 0x6757, 0x04C8, 0x6759, 0x18A5,

+    0x675A, 0x18AB, 0x675C, 0x04C1, 0x675D, 0x18A9, 0x675E, 0x04C3,

+    0x675F, 0x04BC, 0x6760, 0x04C6, 0x676A, 0x0618, 0x676C, 0x19B4,

+    0x676D, 0x0604, 0x676F, 0x060E, 0x6770, 0x060F, 0x6771, 0x0607,

+    0x6772, 0x0619, 0x6773, 0x0609, 0x6774, 0x19BC, 0x6775, 0x0614,

+    0x6776, 0x19B7, 0x6777, 0x060A, 0x6778, 0x19C6, 0x6779, 0x19C7,

+    0x677A, 0x19BF, 0x677B, 0x19B8, 0x677C, 0x0617, 0x677D, 0x19C4,

+    0x677E, 0x0612, 0x677F, 0x0610, 0x6781, 0x19C5, 0x6783, 0x19C3,

+    0x6784, 0x19BB, 0x6785, 0x19B3, 0x6786, 0x19BA, 0x6787, 0x060B,

+    0x6789, 0x0611, 0x678B, 0x0605, 0x678C, 0x19BE, 0x678D, 0x19BD,

+    0x678E, 0x19B5, 0x6790, 0x0613, 0x6791, 0x19C1, 0x6792, 0x19B6,

+    0x6793, 0x0616, 0x6794, 0x19C8, 0x6795, 0x0606, 0x6797, 0x060D,

+    0x6798, 0x19B9, 0x6799, 0x19C2, 0x679A, 0x0615, 0x679C, 0x0608,

+    0x679D, 0x060C, 0x679F, 0x19C0, 0x67AE, 0x1B34, 0x67AF, 0x0757,

+    0x67B0, 0x0764, 0x67B2, 0x1B2F, 0x67B3, 0x1B25, 0x67B4, 0x075D,

+    0x67B5, 0x1B23, 0x67B6, 0x0756, 0x67B7, 0x1B1E, 0x67B8, 0x0760,

+    0x67B9, 0x1B2B, 0x67BA, 0x1B18, 0x67BB, 0x1B1A, 0x67C0, 0x1B1D,

+    0x67C1, 0x1B15, 0x67C2, 0x1B2A, 0x67C3, 0x1B3A, 0x67C4, 0x075B,

+    0x67C5, 0x1B1F, 0x67C6, 0x1B31, 0x67C8, 0x1B17, 0x67C9, 0x1B38,

+    0x67CA, 0x1B39, 0x67CB, 0x1B3C, 0x67CC, 0x1B33, 0x67CD, 0x1B24,

+    0x67CE, 0x1B2C, 0x67CF, 0x0761, 0x67D0, 0x0754, 0x67D1, 0x075C,

+    0x67D2, 0x0768, 0x67D3, 0x0751, 0x67D4, 0x0753, 0x67D8, 0x1B1C,

+    0x67D9, 0x0765, 0x67DA, 0x075E, 0x67DB, 0x1B36, 0x67DC, 0x1B19,

+    0x67DD, 0x0767, 0x67DE, 0x0762, 0x67DF, 0x1B22, 0x67E2, 0x0766,

+    0x67E3, 0x1B29, 0x67E4, 0x1B21, 0x67E5, 0x075F, 0x67E6, 0x1B35,

+    0x67E7, 0x1B2D, 0x67E9, 0x0759, 0x67EA, 0x1B3B, 0x67EB, 0x1B20,

+    0x67EC, 0x0755, 0x67ED, 0x1B32, 0x67EE, 0x1B28, 0x67EF, 0x075A,

+    0x67F0, 0x1B2E, 0x67F1, 0x0752, 0x67F2, 0x1B16, 0x67F3, 0x0763,

+    0x67F4, 0x08F5, 0x67F5, 0x0758, 0x67F6, 0x1B27, 0x67F7, 0x1B26,

+    0x67F8, 0x1B1B, 0x67FA, 0x1B37, 0x67FC, 0x1B30, 0x67FF, 0x0750,

+    0x6812, 0x1CDD, 0x6813, 0x08FC, 0x6814, 0x1CDE, 0x6816, 0x1CD2,

+    0x6817, 0x08F1, 0x6818, 0x08FD, 0x681A, 0x1CCB, 0x681C, 0x1CD4,

+    0x681D, 0x1CDC, 0x681F, 0x1CCA, 0x6820, 0x1CE5, 0x6821, 0x08E7,

+    0x6825, 0x1CE4, 0x6826, 0x1CDF, 0x6828, 0x1CE0, 0x6829, 0x08EF,

+    0x682A, 0x08FA, 0x682B, 0x1CD6, 0x682D, 0x1CD7, 0x682E, 0x1CE1,

+    0x682F, 0x1CD8, 0x6831, 0x1CD3, 0x6832, 0x1CCD, 0x6833, 0x1CCE,

+    0x6834, 0x1CDB, 0x6835, 0x1CD5, 0x6838, 0x08E8, 0x6839, 0x08EC,

+    0x683A, 0x1CE3, 0x683B, 0x1CCF, 0x683C, 0x08F8, 0x683D, 0x08F4,

+    0x6840, 0x08F7, 0x6841, 0x08FE, 0x6842, 0x08ED, 0x6843, 0x08F9,

+    0x6844, 0x1CDA, 0x6845, 0x08FB, 0x6846, 0x08EA, 0x6848, 0x08E9,

+    0x6849, 0x1CCC, 0x684B, 0x1CD0, 0x684C, 0x08F2, 0x684D, 0x1CE2,

+    0x684E, 0x1CD9, 0x684F, 0x1CD1, 0x6850, 0x08F6, 0x6851, 0x08F3,

+    0x6853, 0x08EB, 0x6854, 0x08EE, 0x686B, 0x1F29, 0x686D, 0x1F19,

+    0x686E, 0x1F1A, 0x686F, 0x1F1E, 0x6871, 0x1F2D, 0x6872, 0x1F2A,

+    0x6874, 0x1F23, 0x6875, 0x1F22, 0x6876, 0x0AD7, 0x6877, 0x1F26,

+    0x6878, 0x1F35, 0x6879, 0x1F15, 0x687B, 0x1F36, 0x687C, 0x1F28,

+    0x687D, 0x1F3A, 0x687E, 0x1F2E, 0x687F, 0x0AD6, 0x6880, 0x1F2C,

+    0x6881, 0x0AD1, 0x6882, 0x0AE6, 0x6883, 0x0ADC, 0x6885, 0x0AE0,

+    0x6886, 0x0ADF, 0x6887, 0x1F16, 0x6889, 0x1F33, 0x688A, 0x1F39,

+    0x688B, 0x1F31, 0x688C, 0x1F38, 0x688F, 0x1F25, 0x6890, 0x1F17,

+    0x6891, 0x1F37, 0x6892, 0x1F27, 0x6893, 0x0AD4, 0x6894, 0x0AE1,

+    0x6896, 0x1F30, 0x6897, 0x0ADA, 0x689B, 0x1F2F, 0x689C, 0x1F18,

+    0x689D, 0x0AE2, 0x689F, 0x0AE4, 0x68A0, 0x1F32, 0x68A1, 0x0AE5,

+    0x68A2, 0x0AD3, 0x68A3, 0x1F1F, 0x68A4, 0x1F34, 0x68A7, 0x0AD9,

+    0x68A8, 0x0AE3, 0x68A9, 0x1F21, 0x68AA, 0x1F2B, 0x68AB, 0x1F1C,

+    0x68AC, 0x1F20, 0x68AD, 0x0ADE, 0x68AE, 0x1F1B, 0x68AF, 0x0AD2,

+    0x68B0, 0x0ADB, 0x68B1, 0x0AD8, 0x68B2, 0x1F24, 0x68B3, 0x08F0,

+    0x68B4, 0x2198, 0x68B5, 0x0AD5, 0x68C4, 0x0ADD, 0x68C6, 0x219B,

+    0x68C7, 0x21B1, 0x68C8, 0x21A6, 0x68C9, 0x0C97, 0x68CB, 0x0C92,

+    0x68CC, 0x2195, 0x68CD, 0x0C93, 0x68CE, 0x21A5, 0x68D0, 0x219E,

+    0x68D1, 0x21AB, 0x68D2, 0x0C8F, 0x68D3, 0x2183, 0x68D4, 0x21AD,

+    0x68D5, 0x0C85, 0x68D6, 0x218B, 0x68D7, 0x0C88, 0x68D8, 0x0C87,

+    0x68DA, 0x0C98, 0x68DC, 0x2185, 0x68DD, 0x21A7, 0x68DE, 0x21A8,

+    0x68DF, 0x0C8A, 0x68E0, 0x0C86, 0x68E1, 0x2193, 0x68E3, 0x0C91,

+    0x68E4, 0x218E, 0x68E6, 0x21A9, 0x68E7, 0x0C8D, 0x68E8, 0x21A1,

+    0x68E9, 0x21AE, 0x68EA, 0x2188, 0x68EB, 0x218D, 0x68EC, 0x2187,

+    0x68EE, 0x0C8C, 0x68EF, 0x219A, 0x68F0, 0x242B, 0x68F1, 0x2189,

+    0x68F2, 0x0C90, 0x68F3, 0x2192, 0x68F4, 0x21AA, 0x68F5, 0x0C8B,

+    0x68F6, 0x218F, 0x68F7, 0x218C, 0x68F8, 0x219D, 0x68F9, 0x0C8E,

+    0x68FA, 0x0C84, 0x68FB, 0x0C9A, 0x68FC, 0x21A0, 0x68FD, 0x219F,

+    0x6904, 0x2184, 0x6905, 0x0C89, 0x6906, 0x21AC, 0x6907, 0x2194,

+    0x6908, 0x2196, 0x690A, 0x21A3, 0x690B, 0x21A2, 0x690C, 0x2182,

+    0x690D, 0x0C94, 0x690E, 0x0C96, 0x690F, 0x218A, 0x6910, 0x2191,

+    0x6911, 0x2199, 0x6912, 0x0C95, 0x6913, 0x2190, 0x6914, 0x219C,

+    0x6915, 0x21AF, 0x6917, 0x21A4, 0x6925, 0x21B0, 0x692A, 0x2186,

+    0x692F, 0x243F, 0x6930, 0x0E3E, 0x6932, 0x243D, 0x6933, 0x2428,

+    0x6934, 0x242D, 0x6935, 0x2426, 0x6937, 0x2439, 0x6938, 0x2418,

+    0x6939, 0x241F, 0x693B, 0x2437, 0x693C, 0x2441, 0x693D, 0x2429,

+    0x693F, 0x241C, 0x6940, 0x242F, 0x6941, 0x2434, 0x6942, 0x2420,

+    0x6944, 0x2431, 0x6945, 0x241D, 0x6948, 0x2424, 0x6949, 0x2425,

+    0x694A, 0x0E40, 0x694B, 0x2438, 0x694C, 0x2436, 0x694E, 0x2419,

+    0x694F, 0x243B, 0x6951, 0x243C, 0x6952, 0x243E, 0x6953, 0x0E44,

+    0x6954, 0x0E3C, 0x6956, 0x1F1D, 0x6957, 0x2421, 0x6958, 0x2433,

+    0x6959, 0x2422, 0x695A, 0x0E39, 0x695B, 0x0E49, 0x695C, 0x243A,

+    0x695D, 0x0E47, 0x695E, 0x0E43, 0x695F, 0x2417, 0x6960, 0x0E3B,

+    0x6962, 0x241A, 0x6963, 0x0E48, 0x6965, 0x242A, 0x6966, 0x2416,

+    0x6968, 0x0E41, 0x6969, 0x242E, 0x696A, 0x241E, 0x696B, 0x0E42,

+    0x696C, 0x2427, 0x696D, 0x0E38, 0x696E, 0x0C99, 0x696F, 0x2430,

+    0x6970, 0x2197, 0x6971, 0x241B, 0x6974, 0x2435, 0x6975, 0x0E3D,

+    0x6976, 0x2432, 0x6977, 0x0E3A, 0x6978, 0x242C, 0x6979, 0x0E45,

+    0x697A, 0x2423, 0x697B, 0x2440, 0x6982, 0x0E3F, 0x6983, 0x24AF,

+    0x6986, 0x0E46, 0x698D, 0x26C9, 0x698E, 0x26C7, 0x6990, 0x26DD,

+    0x6991, 0x26C5, 0x6993, 0x26D7, 0x6994, 0x0E37, 0x6995, 0x0FF0,

+    0x6996, 0x26C1, 0x6997, 0x26DC, 0x6999, 0x26C6, 0x699A, 0x26D4,

+    0x699B, 0x0FF5, 0x699C, 0x0FEE, 0x699E, 0x26DA, 0x69A0, 0x26BF,

+    0x69A1, 0x26D9, 0x69A3, 0x1000, 0x69A4, 0x26D0, 0x69A5, 0x26E0,

+    0x69A6, 0x0FFE, 0x69A7, 0x26C8, 0x69A8, 0x0FEF, 0x69A9, 0x26CA,

+    0x69AA, 0x26D8, 0x69AB, 0x0FF8, 0x69AC, 0x26C3, 0x69AD, 0x0FFC,

+    0x69AE, 0x0FF2, 0x69AF, 0x26CC, 0x69B0, 0x26C2, 0x69B1, 0x26BC,

+    0x69B3, 0x26D6, 0x69B4, 0x0FF9, 0x69B5, 0x26DF, 0x69B6, 0x26BD,

+    0x69B7, 0x0FF6, 0x69B9, 0x26D2, 0x69BB, 0x0FF7, 0x69BC, 0x26C4,

+    0x69BD, 0x26CF, 0x69BE, 0x26CB, 0x69BF, 0x26CD, 0x69C1, 0x0FF1,

+    0x69C2, 0x26DE, 0x69C3, 0x0FFF, 0x69C4, 0x26CE, 0x69C6, 0x26E1,

+    0x69C9, 0x26BE, 0x69CA, 0x26D3, 0x69CB, 0x0FF4, 0x69CC, 0x0FFD,

+    0x69CD, 0x0FFB, 0x69CE, 0x26C0, 0x69CF, 0x26D5, 0x69D0, 0x0FFA,

+    0x69D3, 0x0FF3, 0x69D4, 0x26D1, 0x69D9, 0x26DB, 0x69E2, 0x2909,

+    0x69E4, 0x2905, 0x69E5, 0x2901, 0x69E6, 0x2915, 0x69E7, 0x2912,

+    0x69E8, 0x1177, 0x69EB, 0x2919, 0x69EC, 0x2908, 0x69ED, 0x1182,

+    0x69EE, 0x290F, 0x69F1, 0x2904, 0x69F2, 0x290E, 0x69F3, 0x117F,

+    0x69F4, 0x2922, 0x69F6, 0x291F, 0x69F7, 0x2911, 0x69F8, 0x2902,

+    0x69FB, 0x2916, 0x69FC, 0x2918, 0x69FD, 0x117B, 0x69FE, 0x290C,

+    0x69FF, 0x2907, 0x6A00, 0x28FE, 0x6A01, 0x1178, 0x6A02, 0x1180,

+    0x6A04, 0x291B, 0x6A05, 0x1181, 0x6A06, 0x28FF, 0x6A07, 0x2921,

+    0x6A08, 0x2914, 0x6A09, 0x291A, 0x6A0A, 0x117E, 0x6A0D, 0x2917,

+    0x6A0F, 0x291E, 0x6A11, 0x1183, 0x6A13, 0x117D, 0x6A14, 0x2910,

+    0x6A15, 0x2903, 0x6A16, 0x2923, 0x6A17, 0x2900, 0x6A18, 0x291C,

+    0x6A19, 0x117A, 0x6A1B, 0x290A, 0x6A1D, 0x290B, 0x6A1E, 0x1179,

+    0x6A1F, 0x1176, 0x6A20, 0x2906, 0x6A21, 0x117C, 0x6A23, 0x1175,

+    0x6A25, 0x291D, 0x6A26, 0x2920, 0x6A27, 0x290D, 0x6A28, 0x2B74,

+    0x6A32, 0x2B6C, 0x6A34, 0x2B68, 0x6A35, 0x12D9, 0x6A38, 0x12CE,

+    0x6A39, 0x12D3, 0x6A3A, 0x12CF, 0x6A3B, 0x2B76, 0x6A3C, 0x2B81,

+    0x6A3D, 0x12CD, 0x6A3E, 0x2B6E, 0x6A3F, 0x2B77, 0x6A40, 0x2913,

+    0x6A41, 0x2B78, 0x6A44, 0x12D4, 0x6A46, 0x2B87, 0x6A47, 0x12D8,

+    0x6A48, 0x12DB, 0x6A49, 0x2B6A, 0x6A4B, 0x12D7, 0x6A4D, 0x2B85,

+    0x6A4E, 0x2B86, 0x6A4F, 0x2B7C, 0x6A50, 0x2B7B, 0x6A51, 0x2B73,

+    0x6A54, 0x2B7D, 0x6A55, 0x2B84, 0x6A56, 0x2B83, 0x6A58, 0x12D2,

+    0x6A59, 0x12D0, 0x6A5A, 0x2B75, 0x6A5B, 0x2B72, 0x6A5D, 0x2B6F,

+    0x6A5E, 0x2B82, 0x6A5F, 0x12DA, 0x6A60, 0x2B80, 0x6A61, 0x12D6,

+    0x6A62, 0x12D5, 0x6A64, 0x2B7A, 0x6A66, 0x2B69, 0x6A67, 0x2B6B,

+    0x6A68, 0x2B6D, 0x6A69, 0x2B7F, 0x6A6A, 0x2B79, 0x6A6B, 0x12D1,

+    0x6A6D, 0x2B70, 0x6A6F, 0x2B7E, 0x6A76, 0x2B71, 0x6A7E, 0x13EC,

+    0x6A7F, 0x2D84, 0x6A80, 0x13E5, 0x6A81, 0x2D75, 0x6A83, 0x2D80,

+    0x6A84, 0x13E7, 0x6A85, 0x2D87, 0x6A87, 0x2D7C, 0x6A89, 0x2D77,

+    0x6A8C, 0x2D88, 0x6A8D, 0x2D73, 0x6A8E, 0x2D7E, 0x6A90, 0x13EE,

+    0x6A91, 0x2D83, 0x6A92, 0x2D89, 0x6A93, 0x2D7D, 0x6A94, 0x13E6,

+    0x6A95, 0x2D7F, 0x6A96, 0x2D74, 0x6A97, 0x13ED, 0x6A9A, 0x2D86,

+    0x6A9B, 0x2D79, 0x6A9C, 0x13E9, 0x6A9E, 0x2D7B, 0x6A9F, 0x2D78,

+    0x6AA0, 0x13EF, 0x6AA1, 0x2D7A, 0x6AA2, 0x13E8, 0x6AA3, 0x13EB,

+    0x6AA4, 0x2D82, 0x6AA5, 0x2D76, 0x6AA6, 0x2D85, 0x6AA8, 0x2D81,

+    0x6AAC, 0x14DD, 0x6AAD, 0x2F3E, 0x6AAE, 0x14E2, 0x6AAF, 0x14E3,

+    0x6AB3, 0x14DC, 0x6AB4, 0x2F3D, 0x6AB6, 0x2F3A, 0x6AB7, 0x2F3B,

+    0x6AB8, 0x14E0, 0x6AB9, 0x2F35, 0x6ABA, 0x2F39, 0x6ABB, 0x14DF,

+    0x6ABD, 0x2F36, 0x6AC2, 0x14E1, 0x6AC3, 0x14DE, 0x6AC5, 0x2F34,

+    0x6AC6, 0x2F38, 0x6AC7, 0x2F3C, 0x6ACB, 0x309F, 0x6ACC, 0x309C,

+    0x6ACD, 0x30A5, 0x6ACF, 0x30A4, 0x6AD0, 0x30A2, 0x6AD1, 0x309D,

+    0x6AD3, 0x1589, 0x6AD9, 0x309E, 0x6ADA, 0x1588, 0x6ADB, 0x13EA,

+    0x6ADC, 0x30A1, 0x6ADD, 0x1587, 0x6ADE, 0x30A6, 0x6ADF, 0x30A0,

+    0x6AE0, 0x309B, 0x6AE1, 0x2F37, 0x6AE5, 0x1586, 0x6AE7, 0x309A,

+    0x6AE8, 0x31DF, 0x6AEA, 0x31DE, 0x6AEB, 0x30A3, 0x6AEC, 0x161B,

+    0x6AEE, 0x31E2, 0x6AEF, 0x31E3, 0x6AF0, 0x31DD, 0x6AF1, 0x31E1,

+    0x6AF3, 0x31DC, 0x6AF8, 0x32D6, 0x6AF9, 0x31E0, 0x6AFA, 0x1678,

+    0x6AFB, 0x1676, 0x6AFC, 0x32D4, 0x6B00, 0x32D7, 0x6B02, 0x32D3,

+    0x6B03, 0x32D5, 0x6B04, 0x1677, 0x6B08, 0x3386, 0x6B09, 0x3387,

+    0x6B0A, 0x16C6, 0x6B0B, 0x3385, 0x6B0F, 0x3420, 0x6B10, 0x16FD,

+    0x6B11, 0x341E, 0x6B12, 0x341F, 0x6B13, 0x3487, 0x6B16, 0x1743,

+    0x6B17, 0x34CE, 0x6B18, 0x34CC, 0x6B19, 0x34CD, 0x6B1A, 0x34CF,

+    0x6B1E, 0x3534, 0x6B20, 0x02DE, 0x6B21, 0x03E3, 0x6B23, 0x061A,

+    0x6B25, 0x19C9, 0x6B28, 0x1B3D, 0x6B2C, 0x1CE6, 0x6B2D, 0x1CE8,

+    0x6B2F, 0x1CE7, 0x6B31, 0x1CE9, 0x6B32, 0x0AE7, 0x6B33, 0x1F3C,

+    0x6B34, 0x1CEA, 0x6B36, 0x1F3B, 0x6B37, 0x1F3D, 0x6B38, 0x1F3E,

+    0x6B39, 0x21B2, 0x6B3A, 0x0C9C, 0x6B3B, 0x21B3, 0x6B3C, 0x21B5,

+    0x6B3D, 0x0C9D, 0x6B3E, 0x0C9B, 0x6B3F, 0x21B4, 0x6B41, 0x2447,

+    0x6B42, 0x2445, 0x6B43, 0x2444, 0x6B45, 0x2443, 0x6B46, 0x2442,

+    0x6B47, 0x0E4A, 0x6B48, 0x2446, 0x6B49, 0x1001, 0x6B4A, 0x26E2,

+    0x6B4B, 0x26E4, 0x6B4C, 0x1002, 0x6B4D, 0x26E3, 0x6B4E, 0x1185,

+    0x6B50, 0x1184, 0x6B51, 0x2924, 0x6B54, 0x2B89, 0x6B55, 0x2B88,

+    0x6B56, 0x2B8A, 0x6B59, 0x12DC, 0x6B5B, 0x2D8A, 0x6B5C, 0x13F0,

+    0x6B5E, 0x2F3F, 0x6B5F, 0x14E4, 0x6B60, 0x30A7, 0x6B61, 0x16C7,

+    0x6B62, 0x02DF, 0x6B63, 0x034D, 0x6B64, 0x03E4, 0x6B65, 0x04C9,

+    0x6B66, 0x061B, 0x6B67, 0x061C, 0x6B6A, 0x0769, 0x6B6D, 0x1CEB,

+    0x6B72, 0x0E4B, 0x6B76, 0x29A2, 0x6B77, 0x12DD, 0x6B78, 0x14E5,

+    0x6B79, 0x02E0, 0x6B7B, 0x03E5, 0x6B7E, 0x19CB, 0x6B7F, 0x061D,

+    0x6B80, 0x19CA, 0x6B82, 0x1B3E, 0x6B83, 0x076A, 0x6B84, 0x1B3F,

+    0x6B86, 0x076B, 0x6B88, 0x1CED, 0x6B89, 0x0900, 0x6B8A, 0x08FF,

+    0x6B8C, 0x1F43, 0x6B8D, 0x1F41, 0x6B8E, 0x1F42, 0x6B8F, 0x1F40,

+    0x6B91, 0x1F3F, 0x6B94, 0x21B6, 0x6B95, 0x21B9, 0x6B96, 0x0C9F,

+    0x6B97, 0x21B7, 0x6B98, 0x0C9E, 0x6B99, 0x21B8, 0x6B9B, 0x2448,

+    0x6B9E, 0x26E5, 0x6B9F, 0x26E6, 0x6BA0, 0x26E7, 0x6BA2, 0x2927,

+    0x6BA3, 0x2926, 0x6BA4, 0x1186, 0x6BA5, 0x2925, 0x6BA6, 0x2928,

+    0x6BA7, 0x2B8B, 0x6BAA, 0x2B8C, 0x6BAB, 0x2B8D, 0x6BAD, 0x2D8B,

+    0x6BAE, 0x13F1, 0x6BAF, 0x14E6, 0x6BB0, 0x30A8, 0x6BB2, 0x1679,

+    0x6BB3, 0x178A, 0x6BB5, 0x076C, 0x6BB6, 0x1B40, 0x6BB7, 0x0901,

+    0x6BBA, 0x0AE8, 0x6BBC, 0x0CA0, 0x6BBD, 0x21BA, 0x6BBF, 0x0E4D,

+    0x6BC0, 0x0E4C, 0x6BC3, 0x26E8, 0x6BC4, 0x26E9, 0x6BC5, 0x1187,

+    0x6BC6, 0x1188, 0x6BC7, 0x2B8F, 0x6BC8, 0x2B8E, 0x6BC9, 0x2F40,

+    0x6BCA, 0x3421, 0x6BCB, 0x02E1, 0x6BCC, 0x178B, 0x6BCD, 0x034E,

+    0x6BCF, 0x04CA, 0x6BD0, 0x18AD, 0x6BD2, 0x076D, 0x6BD3, 0x0E4E,

+    0x6BD4, 0x02E2, 0x6BD6, 0x1B41, 0x6BD7, 0x076E, 0x6BD8, 0x1B42,

+    0x6BDA, 0x13F2, 0x6BDB, 0x02E3, 0x6BDE, 0x19CC, 0x6BE0, 0x1B43,

+    0x6BE2, 0x1CF2, 0x6BE3, 0x1CF1, 0x6BE4, 0x1CEF, 0x6BE6, 0x1CEE,

+    0x6BE7, 0x1CF3, 0x6BE8, 0x1CF0, 0x6BEB, 0x0AE9, 0x6BEC, 0x0AEA,

+    0x6BEF, 0x0CA1, 0x6BF0, 0x21BB, 0x6BF2, 0x21BC, 0x6BF3, 0x21BD,

+    0x6BF7, 0x244C, 0x6BF8, 0x244D, 0x6BF9, 0x244B, 0x6BFB, 0x2449,

+    0x6BFC, 0x244A, 0x6BFD, 0x0E4F, 0x6BFE, 0x26EA, 0x6BFF, 0x292B,

+    0x6C00, 0x292A, 0x6C01, 0x2929, 0x6C02, 0x292C, 0x6C03, 0x2B91,

+    0x6C04, 0x2B90, 0x6C05, 0x12DE, 0x6C06, 0x2B92, 0x6C08, 0x13F3,

+    0x6C09, 0x2D8C, 0x6C0B, 0x2F41, 0x6C0C, 0x30A9, 0x6C0D, 0x3388,

+    0x6C0F, 0x02E4, 0x6C10, 0x0350, 0x6C11, 0x034F, 0x6C13, 0x061E,

+    0x6C14, 0x178C, 0x6C15, 0x17AA, 0x6C16, 0x03E6, 0x6C18, 0x1801,

+    0x6C19, 0x18AE, 0x6C1A, 0x18AF, 0x6C1B, 0x061F, 0x6C1D, 0x19CD,

+    0x6C1F, 0x076F, 0x6C20, 0x1B44, 0x6C21, 0x1B45, 0x6C23, 0x0902,

+    0x6C24, 0x0906, 0x6C25, 0x1CF4, 0x6C26, 0x0905, 0x6C27, 0x0903,

+    0x6C28, 0x0904, 0x6C2A, 0x1F44, 0x6C2B, 0x0AEB, 0x6C2C, 0x0CA4,

+    0x6C2E, 0x0CA2, 0x6C2F, 0x0CA3, 0x6C30, 0x21BE, 0x6C33, 0x1003,

+    0x6C34, 0x02E5, 0x6C36, 0x17AB, 0x6C38, 0x0351, 0x6C3B, 0x17AE,

+    0x6C3E, 0x0354, 0x6C3F, 0x17AD, 0x6C40, 0x0353, 0x6C41, 0x0352,

+    0x6C42, 0x04CB, 0x6C43, 0x17AC, 0x6C46, 0x1802, 0x6C4A, 0x1806,

+    0x6C4B, 0x1808, 0x6C4C, 0x1809, 0x6C4D, 0x03F0, 0x6C4E, 0x03F1,

+    0x6C4F, 0x1805, 0x6C50, 0x03EC, 0x6C52, 0x1803, 0x6C54, 0x1807,

+    0x6C55, 0x03ED, 0x6C57, 0x03E8, 0x6C59, 0x03E9, 0x6C5B, 0x03EF,

+    0x6C5C, 0x1804, 0x6C5D, 0x03E7, 0x6C5E, 0x04CC, 0x6C5F, 0x03EA,

+    0x6C60, 0x03EB, 0x6C61, 0x03EE, 0x6C65, 0x18C0, 0x6C66, 0x18BE,

+    0x6C67, 0x18B1, 0x6C68, 0x04D8, 0x6C69, 0x18B8, 0x6C6A, 0x04D3,

+    0x6C6B, 0x18B2, 0x6C6D, 0x18BA, 0x6C6F, 0x18B7, 0x6C70, 0x04D6,

+    0x6C71, 0x18B6, 0x6C72, 0x04DD, 0x6C73, 0x18BF, 0x6C74, 0x04DF,

+    0x6C76, 0x04E1, 0x6C78, 0x18B0, 0x6C7A, 0x04D4, 0x6C7B, 0x18C1,

+    0x6C7D, 0x04DB, 0x6C7E, 0x04DE, 0x6C80, 0x19E4, 0x6C81, 0x04CE,

+    0x6C82, 0x04E5, 0x6C83, 0x04DC, 0x6C84, 0x18B3, 0x6C85, 0x04D1,

+    0x6C86, 0x04E0, 0x6C87, 0x18BB, 0x6C88, 0x04CF, 0x6C89, 0x04D0,

+    0x6C8A, 0x19E2, 0x6C8B, 0x18B4, 0x6C8C, 0x04D7, 0x6C8D, 0x04E2,

+    0x6C8E, 0x18C2, 0x6C8F, 0x18B5, 0x6C90, 0x04D5, 0x6C92, 0x04DA,

+    0x6C93, 0x19CE, 0x6C94, 0x04E3, 0x6C95, 0x18BC, 0x6C96, 0x04D9,

+    0x6C98, 0x04E4, 0x6C99, 0x04CD, 0x6C9A, 0x18B9, 0x6C9B, 0x04D2,

+    0x6C9C, 0x18BD, 0x6C9D, 0x19E3, 0x6CAB, 0x062B, 0x6CAC, 0x063B,

+    0x6CAD, 0x19D5, 0x6CAE, 0x0632, 0x6CB0, 0x19EA, 0x6CB1, 0x0623,

+    0x6CB3, 0x0626, 0x6CB4, 0x19E1, 0x6CB6, 0x19D3, 0x6CB7, 0x19D7,

+    0x6CB8, 0x062E, 0x6CB9, 0x0630, 0x6CBA, 0x19DA, 0x6CBB, 0x0637,

+    0x6CBC, 0x0629, 0x6CBD, 0x0627, 0x6CBE, 0x0628, 0x6CBF, 0x0636,

+    0x6CC0, 0x19E6, 0x6CC1, 0x0631, 0x6CC2, 0x19D9, 0x6CC3, 0x19DB,

+    0x6CC4, 0x062F, 0x6CC5, 0x0634, 0x6CC6, 0x19DC, 0x6CC7, 0x19E9,

+    0x6CC9, 0x0770, 0x6CCA, 0x063A, 0x6CCC, 0x0624, 0x6CCD, 0x19E8,

+    0x6CCF, 0x19EC, 0x6CD0, 0x19D8, 0x6CD1, 0x19EE, 0x6CD2, 0x19DF,

+    0x6CD3, 0x062D, 0x6CD4, 0x19D4, 0x6CD5, 0x062C, 0x6CD6, 0x063E,

+    0x6CD7, 0x0633, 0x6CD9, 0x19D2, 0x6CDA, 0x1B4E, 0x6CDB, 0x0639,

+    0x6CDC, 0x063D, 0x6CDD, 0x19E0, 0x6CDE, 0x19E5, 0x6CE0, 0x063F,

+    0x6CE1, 0x0638, 0x6CE2, 0x062A, 0x6CE3, 0x0620, 0x6CE5, 0x0625,

+    0x6CE7, 0x19D6, 0x6CE8, 0x0621, 0x6CE9, 0x19ED, 0x6CEB, 0x19D0,

+    0x6CEC, 0x19CF, 0x6CED, 0x19DD, 0x6CEE, 0x19D1, 0x6CEF, 0x063C,

+    0x6CF0, 0x0907, 0x6CF1, 0x0635, 0x6CF2, 0x19DE, 0x6CF3, 0x0622,

+    0x6CF5, 0x077F, 0x6CF9, 0x19EB, 0x6D00, 0x1B55, 0x6D01, 0x1B58,

+    0x6D03, 0x1B5B, 0x6D04, 0x1B50, 0x6D07, 0x1B5E, 0x6D08, 0x1B61,

+    0x6D09, 0x1B63, 0x6D0A, 0x1B4D, 0x6D0B, 0x0771, 0x6D0C, 0x0776,

+    0x6D0D, 0x1CF9, 0x6D0E, 0x0786, 0x6D0F, 0x1B5C, 0x6D10, 0x1B64,

+    0x6D11, 0x1B54, 0x6D12, 0x1B4C, 0x6D16, 0x1D14, 0x6D17, 0x0779,

+    0x6D18, 0x1B59, 0x6D19, 0x1B51, 0x6D1A, 0x1B53, 0x6D1B, 0x077E,

+    0x6D1D, 0x1B56, 0x6D1E, 0x0778, 0x6D1F, 0x1B49, 0x6D20, 0x1B5F,

+    0x6D22, 0x1B62, 0x6D25, 0x0775, 0x6D27, 0x0781, 0x6D28, 0x1B46,

+    0x6D29, 0x0783, 0x6D2A, 0x0773, 0x6D2B, 0x0787, 0x6D2C, 0x1B60,

+    0x6D2D, 0x1B48, 0x6D2E, 0x0784, 0x6D2F, 0x1D0E, 0x6D30, 0x19E7,

+    0x6D31, 0x0777, 0x6D32, 0x0772, 0x6D33, 0x1B4F, 0x6D34, 0x1B47,

+    0x6D35, 0x0785, 0x6D36, 0x077D, 0x6D37, 0x1B5A, 0x6D38, 0x0782,

+    0x6D39, 0x0780, 0x6D3A, 0x1B52, 0x6D3B, 0x077A, 0x6D3C, 0x1B4A,

+    0x6D3D, 0x077B, 0x6D3E, 0x077C, 0x6D3F, 0x1B4B, 0x6D40, 0x1B5D,

+    0x6D41, 0x0774, 0x6D42, 0x1B57, 0x6D58, 0x1CFC, 0x6D59, 0x090F,

+    0x6D5A, 0x0914, 0x6D5E, 0x1D05, 0x6D5F, 0x1D0B, 0x6D60, 0x1D07,

+    0x6D61, 0x1CFA, 0x6D62, 0x1CFD, 0x6D63, 0x1CF6, 0x6D64, 0x1CF7,

+    0x6D65, 0x091B, 0x6D66, 0x090C, 0x6D67, 0x1D06, 0x6D68, 0x1D0F,

+    0x6D69, 0x0916, 0x6D6A, 0x0908, 0x6D6C, 0x0911, 0x6D6D, 0x1CFE,

+    0x6D6E, 0x0913, 0x6D6F, 0x1CFF, 0x6D70, 0x1D09, 0x6D74, 0x0915,

+    0x6D75, 0x1D18, 0x6D76, 0x1CF8, 0x6D77, 0x090E, 0x6D78, 0x090D,

+    0x6D79, 0x0919, 0x6D7A, 0x1CF5, 0x6D7B, 0x1D16, 0x6D7C, 0x1D0A,

+    0x6D7D, 0x1D17, 0x6D7E, 0x1D11, 0x6D7F, 0x1D03, 0x6D80, 0x1D12,

+    0x6D82, 0x1D0C, 0x6D83, 0x1D15, 0x6D84, 0x1D13, 0x6D85, 0x091A,

+    0x6D86, 0x1D04, 0x6D87, 0x090B, 0x6D88, 0x090A, 0x6D89, 0x0912,

+    0x6D8A, 0x0918, 0x6D8B, 0x1D10, 0x6D8C, 0x0917, 0x6D8D, 0x1D01,

+    0x6D8E, 0x0AEC, 0x6D90, 0x1D19, 0x6D91, 0x1D00, 0x6D92, 0x1CFB,

+    0x6D93, 0x0910, 0x6D94, 0x091C, 0x6D95, 0x0909, 0x6D97, 0x1D08,

+    0x6D98, 0x1D0D, 0x6DAA, 0x0B0E, 0x6DAB, 0x1F46, 0x6DAC, 0x1F4A,

+    0x6DAE, 0x0AFB, 0x6DAF, 0x0AF9, 0x6DB2, 0x0AF0, 0x6DB3, 0x1F48,

+    0x6DB4, 0x1F47, 0x6DB5, 0x0B04, 0x6DB7, 0x1F4D, 0x6DB8, 0x0AFE,

+    0x6DBA, 0x1F5F, 0x6DBB, 0x1F6B, 0x6DBC, 0x0AED, 0x6DBD, 0x1F5C,

+    0x6DBE, 0x1F55, 0x6DBF, 0x0B10, 0x6DC0, 0x1F45, 0x6DC2, 0x1F61,

+    0x6DC4, 0x0B0D, 0x6DC5, 0x0B01, 0x6DC6, 0x0B0C, 0x6DC7, 0x0AF7,

+    0x6DC8, 0x1F51, 0x6DC9, 0x1F63, 0x6DCA, 0x1F5B, 0x6DCB, 0x0AF8,

+    0x6DCC, 0x0AF2, 0x6DCD, 0x1F69, 0x6DCF, 0x1F62, 0x6DD0, 0x1F64,

+    0x6DD1, 0x0AFA, 0x6DD2, 0x0B02, 0x6DD3, 0x1F66, 0x6DD4, 0x1F4F,

+    0x6DD5, 0x1F60, 0x6DD6, 0x1F54, 0x6DD7, 0x1F68, 0x6DD8, 0x0B07,

+    0x6DD9, 0x0AEF, 0x6DDA, 0x0B05, 0x6DDB, 0x1F59, 0x6DDC, 0x1F57,

+    0x6DDD, 0x1F58, 0x6DDE, 0x0AFC, 0x6DDF, 0x1F53, 0x6DE0, 0x1F52,

+    0x6DE1, 0x0AF1, 0x6DE2, 0x1F4C, 0x6DE3, 0x1F6A, 0x6DE4, 0x0AF3,

+    0x6DE5, 0x1F56, 0x6DE6, 0x0B11, 0x6DE8, 0x0B0B, 0x6DE9, 0x1F4B,

+    0x6DEA, 0x0B08, 0x6DEB, 0x0B06, 0x6DEC, 0x0B0F, 0x6DED, 0x1F5D,

+    0x6DEE, 0x0B0A, 0x6DEF, 0x1D02, 0x6DF0, 0x1F5E, 0x6DF1, 0x0B09,

+    0x6DF2, 0x1F65, 0x6DF3, 0x0AEE, 0x6DF4, 0x1F5A, 0x6DF5, 0x0B00,

+    0x6DF6, 0x1F4E, 0x6DF7, 0x0AFF, 0x6DF9, 0x0AFD, 0x6DFA, 0x0AF5,

+    0x6DFB, 0x0AF4, 0x6DFC, 0x21BF, 0x6DFD, 0x1F67, 0x6E00, 0x1F50,

+    0x6E03, 0x21D4, 0x6E05, 0x0AF6, 0x6E19, 0x0CC1, 0x6E1A, 0x0B03,

+    0x6E1B, 0x0CAF, 0x6E1C, 0x21CE, 0x6E1D, 0x0CBD, 0x6E1F, 0x21C2,

+    0x6E20, 0x0CAC, 0x6E21, 0x0CA8, 0x6E22, 0x21E0, 0x6E23, 0x0CAE,

+    0x6E24, 0x0CB2, 0x6E25, 0x0CAD, 0x6E26, 0x0CB6, 0x6E27, 0x21E4,

+    0x6E28, 0x21DB, 0x6E2B, 0x21C9, 0x6E2C, 0x0CBB, 0x6E2D, 0x0CB5,

+    0x6E2E, 0x21D5, 0x6E2F, 0x0CA5, 0x6E30, 0x21E1, 0x6E31, 0x21DA,

+    0x6E32, 0x0CA9, 0x6E33, 0x21CF, 0x6E34, 0x0CB8, 0x6E35, 0x21EC,

+    0x6E36, 0x21ED, 0x6E38, 0x0CA6, 0x6E39, 0x21DF, 0x6E3A, 0x0CBA,

+    0x6E3B, 0x21D3, 0x6E3C, 0x21C5, 0x6E3D, 0x21C6, 0x6E3E, 0x0CBE,

+    0x6E3F, 0x21CA, 0x6E40, 0x21D1, 0x6E41, 0x21CB, 0x6E43, 0x0CBC,

+    0x6E44, 0x0CC4, 0x6E45, 0x21C7, 0x6E46, 0x21C0, 0x6E47, 0x21C1,

+    0x6E49, 0x21C3, 0x6E4A, 0x0CAB, 0x6E4B, 0x21D0, 0x6E4D, 0x0CB9,

+    0x6E4E, 0x0CC2, 0x6E51, 0x21D2, 0x6E52, 0x21EA, 0x6E53, 0x21E2,

+    0x6E54, 0x0CA7, 0x6E55, 0x21E8, 0x6E56, 0x0CB3, 0x6E58, 0x0CB1,

+    0x6E5A, 0x21EE, 0x6E5B, 0x0CB0, 0x6E5C, 0x21D8, 0x6E5D, 0x21CC,

+    0x6E5E, 0x21D6, 0x6E5F, 0x0CC7, 0x6E60, 0x21DC, 0x6E61, 0x21D9,

+    0x6E62, 0x21C8, 0x6E63, 0x0CC3, 0x6E64, 0x21E6, 0x6E65, 0x21E3,

+    0x6E66, 0x21EB, 0x6E67, 0x0CAA, 0x6E68, 0x21D7, 0x6E69, 0x0CC6,

+    0x6E6B, 0x21DE, 0x6E6E, 0x0CB4, 0x6E6F, 0x0CB7, 0x6E71, 0x21DD,

+    0x6E72, 0x0CC5, 0x6E73, 0x21CD, 0x6E74, 0x1F49, 0x6E77, 0x21E7,

+    0x6E78, 0x21E5, 0x6E79, 0x21E9, 0x6E88, 0x21C4, 0x6E89, 0x0CC0,

+    0x6E8D, 0x246C, 0x6E8E, 0x246B, 0x6E8F, 0x2451, 0x6E90, 0x0E55,

+    0x6E92, 0x246A, 0x6E93, 0x2454, 0x6E94, 0x2455, 0x6E96, 0x0E5F,

+    0x6E97, 0x2473, 0x6E98, 0x0E5A, 0x6E99, 0x2469, 0x6E9B, 0x244E,

+    0x6E9C, 0x0E60, 0x6E9D, 0x0E56, 0x6E9E, 0x245D, 0x6E9F, 0x2453,

+    0x6EA0, 0x2456, 0x6EA1, 0x246E, 0x6EA2, 0x0E50, 0x6EA3, 0x2475,

+    0x6EA4, 0x246D, 0x6EA5, 0x0E59, 0x6EA6, 0x2462, 0x6EA7, 0x0E64,

+    0x6EAA, 0x0E63, 0x6EAB, 0x0E5D, 0x6EAE, 0x2474, 0x6EAF, 0x0E51,

+    0x6EB0, 0x2460, 0x6EB1, 0x2457, 0x6EB2, 0x2464, 0x6EB3, 0x2470,

+    0x6EB4, 0x0E65, 0x6EB6, 0x0E53, 0x6EB7, 0x245F, 0x6EB9, 0x2458,

+    0x6EBA, 0x0E5C, 0x6EBC, 0x0E5B, 0x6EBD, 0x245B, 0x6EBE, 0x2465,

+    0x6EBF, 0x246F, 0x6EC0, 0x2452, 0x6EC1, 0x245C, 0x6EC2, 0x0E54,

+    0x6EC3, 0x2466, 0x6EC4, 0x0E61, 0x6EC5, 0x0E58, 0x6EC6, 0x2459,

+    0x6EC7, 0x0E57, 0x6EC8, 0x2450, 0x6EC9, 0x245E, 0x6ECA, 0x2472,

+    0x6ECB, 0x0CBF, 0x6ECC, 0x101F, 0x6ECD, 0x2461, 0x6ECE, 0x26EB,

+    0x6ECF, 0x2463, 0x6ED0, 0x2471, 0x6ED1, 0x0E5E, 0x6ED2, 0x245A,

+    0x6ED3, 0x0E52, 0x6ED4, 0x0E62, 0x6ED5, 0x119A, 0x6ED6, 0x244F,

+    0x6ED8, 0x2468, 0x6EDC, 0x2467, 0x6EEB, 0x2707, 0x6EEC, 0x101C,

+    0x6EED, 0x26FC, 0x6EEE, 0x2701, 0x6EEF, 0x1011, 0x6EF1, 0x26ED,

+    0x6EF2, 0x101E, 0x6EF4, 0x1008, 0x6EF5, 0x26EC, 0x6EF6, 0x270D,

+    0x6EF7, 0x1020, 0x6EF8, 0x26F0, 0x6EF9, 0x2700, 0x6EFB, 0x26F2,

+    0x6EFC, 0x2710, 0x6EFD, 0x270C, 0x6EFE, 0x1006, 0x6EFF, 0x1010,

+    0x6F00, 0x2946, 0x6F01, 0x101D, 0x6F02, 0x100E, 0x6F03, 0x26EE,

+    0x6F05, 0x270B, 0x6F06, 0x1012, 0x6F07, 0x2708, 0x6F08, 0x2715,

+    0x6F09, 0x26F4, 0x6F0A, 0x26FD, 0x6F0D, 0x2713, 0x6F0E, 0x2709,

+    0x6F0F, 0x100D, 0x6F12, 0x26FB, 0x6F13, 0x1007, 0x6F14, 0x1005,

+    0x6F15, 0x1017, 0x6F18, 0x26F9, 0x6F19, 0x26F6, 0x6F1A, 0x26F7,

+    0x6F1C, 0x270F, 0x6F1E, 0x2714, 0x6F1F, 0x2712, 0x6F20, 0x100B,

+    0x6F21, 0x2716, 0x6F22, 0x100F, 0x6F23, 0x1016, 0x6F25, 0x26EF,

+    0x6F26, 0x292E, 0x6F27, 0x26F8, 0x6F29, 0x1009, 0x6F2A, 0x101B,

+    0x6F2B, 0x1018, 0x6F2C, 0x100C, 0x6F2D, 0x2702, 0x6F2E, 0x26F3,

+    0x6F2F, 0x1019, 0x6F30, 0x2704, 0x6F31, 0x1013, 0x6F32, 0x1015,

+    0x6F33, 0x1004, 0x6F35, 0x2706, 0x6F36, 0x26FE, 0x6F37, 0x26F1,

+    0x6F38, 0x1014, 0x6F39, 0x270E, 0x6F3A, 0x2711, 0x6F3B, 0x26FA,

+    0x6F3C, 0x2705, 0x6F3E, 0x100A, 0x6F3F, 0x1189, 0x6F40, 0x2703,

+    0x6F41, 0x292D, 0x6F43, 0x270A, 0x6F4E, 0x26F5, 0x6F4F, 0x2937,

+    0x6F50, 0x2941, 0x6F51, 0x118C, 0x6F52, 0x2940, 0x6F53, 0x294C,

+    0x6F54, 0x118E, 0x6F55, 0x293E, 0x6F57, 0x2942, 0x6F58, 0x1199,

+    0x6F5A, 0x2939, 0x6F5B, 0x1191, 0x6F5D, 0x2945, 0x6F5E, 0x2B9A,

+    0x6F5F, 0x119D, 0x6F60, 0x119C, 0x6F61, 0x2947, 0x6F62, 0x2936,

+    0x6F63, 0x2951, 0x6F64, 0x1197, 0x6F66, 0x118D, 0x6F67, 0x294A,

+    0x6F69, 0x294E, 0x6F6A, 0x2953, 0x6F6B, 0x2948, 0x6F6C, 0x293C,

+    0x6F6D, 0x1190, 0x6F6E, 0x1193, 0x6F6F, 0x119B, 0x6F70, 0x1196,

+    0x6F72, 0x293F, 0x6F73, 0x26FF, 0x6F76, 0x293B, 0x6F77, 0x2952,

+    0x6F78, 0x1192, 0x6F7A, 0x1195, 0x6F7B, 0x2954, 0x6F7C, 0x118A,

+    0x6F7D, 0x2949, 0x6F7E, 0x292F, 0x6F7F, 0x294F, 0x6F80, 0x13FC,

+    0x6F82, 0x293D, 0x6F84, 0x118B, 0x6F85, 0x2938, 0x6F86, 0x118F,

+    0x6F87, 0x2930, 0x6F88, 0x101A, 0x6F89, 0x2934, 0x6F8B, 0x294D,

+    0x6F8C, 0x2935, 0x6F8D, 0x2933, 0x6F8E, 0x1194, 0x6F90, 0x294B,

+    0x6F92, 0x2932, 0x6F93, 0x2944, 0x6F94, 0x2943, 0x6F95, 0x2950,

+    0x6F96, 0x293A, 0x6F97, 0x1198, 0x6F9E, 0x2B9D, 0x6FA0, 0x12EB,

+    0x6FA1, 0x12E1, 0x6FA2, 0x2BA9, 0x6FA3, 0x2B95, 0x6FA4, 0x12E3,

+    0x6FA5, 0x2BA1, 0x6FA6, 0x12EA, 0x6FA7, 0x12E5, 0x6FA8, 0x2B9F,

+    0x6FA9, 0x2D8E, 0x6FAA, 0x2BA5, 0x6FAB, 0x2BAB, 0x6FAC, 0x2BA4,

+    0x6FAD, 0x2B93, 0x6FAE, 0x2BA2, 0x6FAF, 0x2BAD, 0x6FB0, 0x2BAF,

+    0x6FB1, 0x12E0, 0x6FB2, 0x2BAE, 0x6FB3, 0x12E6, 0x6FB4, 0x12EC,

+    0x6FB6, 0x12E9, 0x6FB8, 0x2BA8, 0x6FB9, 0x12E8, 0x6FBA, 0x2BA3,

+    0x6FBC, 0x2B97, 0x6FBD, 0x2B9C, 0x6FBF, 0x2BA7, 0x6FC0, 0x12E7,

+    0x6FC1, 0x12E4, 0x6FC2, 0x12DF, 0x6FC3, 0x12E2, 0x6FC4, 0x2B9B,

+    0x6FC6, 0x2931, 0x6FC7, 0x2B96, 0x6FC8, 0x2B99, 0x6FC9, 0x2BAA,

+    0x6FCA, 0x2B9E, 0x6FCB, 0x2B94, 0x6FCC, 0x2D8D, 0x6FCD, 0x2BAC,

+    0x6FCE, 0x2B98, 0x6FCF, 0x2BA6, 0x6FD4, 0x2D90, 0x6FD5, 0x1400,

+    0x6FD8, 0x13F4, 0x6FDB, 0x13F8, 0x6FDC, 0x2D92, 0x6FDD, 0x2D98,

+    0x6FDE, 0x2D96, 0x6FDF, 0x13F6, 0x6FE0, 0x13F7, 0x6FE1, 0x13FE,

+    0x6FE2, 0x2D99, 0x6FE3, 0x2D91, 0x6FE4, 0x13F9, 0x6FE6, 0x2D95,

+    0x6FE7, 0x2D94, 0x6FE8, 0x2D9A, 0x6FE9, 0x13FF, 0x6FEB, 0x13FA,

+    0x6FEC, 0x13FD, 0x6FED, 0x2D93, 0x6FEE, 0x1401, 0x6FEF, 0x13FB,

+    0x6FF0, 0x1402, 0x6FF1, 0x13F5, 0x6FF2, 0x2D97, 0x6FF4, 0x2D8F,

+    0x6FF7, 0x2F4E, 0x6FFA, 0x14EB, 0x6FFB, 0x2F4B, 0x6FFC, 0x2F4D,

+    0x6FFE, 0x14E9, 0x6FFF, 0x2F49, 0x7000, 0x2F4A, 0x7001, 0x2F45,

+    0x7004, 0x2BA0, 0x7005, 0x2F46, 0x7006, 0x14EA, 0x7007, 0x2F42,

+    0x7009, 0x14E7, 0x700A, 0x2F4F, 0x700B, 0x14E8, 0x700C, 0x2F43,

+    0x700D, 0x2F44, 0x700E, 0x2F48, 0x700F, 0x14ED, 0x7011, 0x14EC,

+    0x7014, 0x2F47, 0x7015, 0x158F, 0x7016, 0x30AD, 0x7017, 0x30B3,

+    0x7018, 0x1590, 0x7019, 0x30AA, 0x701A, 0x158D, 0x701B, 0x158A,

+    0x701C, 0x30B5, 0x701D, 0x158E, 0x701F, 0x158B, 0x7020, 0x30AC,

+    0x7021, 0x30AF, 0x7022, 0x30B0, 0x7023, 0x30B1, 0x7024, 0x30B4,

+    0x7026, 0x2F4C, 0x7027, 0x30AB, 0x7028, 0x158C, 0x7029, 0x30B2,

+    0x702A, 0x31EF, 0x702B, 0x30AE, 0x702F, 0x31E6, 0x7030, 0x161D,

+    0x7031, 0x31E9, 0x7032, 0x161E, 0x7033, 0x31F2, 0x7034, 0x31E8,

+    0x7035, 0x31E5, 0x7037, 0x31E7, 0x7038, 0x31EB, 0x7039, 0x31EE,

+    0x703A, 0x31ED, 0x703B, 0x31F1, 0x703C, 0x31E4, 0x703E, 0x161C,

+    0x703F, 0x31EC, 0x7040, 0x31F0, 0x7041, 0x31F3, 0x7042, 0x31EA,

+    0x7043, 0x32D8, 0x7044, 0x32D9, 0x7045, 0x32DD, 0x7046, 0x32DE,

+    0x7048, 0x32DB, 0x7049, 0x32DC, 0x704A, 0x32DA, 0x704C, 0x167A,

+    0x7051, 0x16C8, 0x7052, 0x338C, 0x7055, 0x3389, 0x7056, 0x338A,

+    0x7057, 0x338B, 0x7058, 0x16C9, 0x705A, 0x3423, 0x705B, 0x3422,

+    0x705D, 0x348A, 0x705E, 0x1722, 0x705F, 0x3488, 0x7060, 0x348B,

+    0x7061, 0x3489, 0x7062, 0x34D0, 0x7063, 0x1744, 0x7064, 0x1752,

+    0x7065, 0x351C, 0x7066, 0x3506, 0x7068, 0x351B, 0x7069, 0x3547,

+    0x706A, 0x3548, 0x706B, 0x02E6, 0x7070, 0x03F2, 0x7071, 0x180A,

+    0x7074, 0x18C3, 0x7076, 0x04E6, 0x7078, 0x04E9, 0x707A, 0x18C4,

+    0x707C, 0x04E7, 0x707D, 0x04E8, 0x7082, 0x19F7, 0x7083, 0x19F9,

+    0x7084, 0x19F4, 0x7085, 0x19F1, 0x7086, 0x19F3, 0x708A, 0x0643,

+    0x708E, 0x0641, 0x7091, 0x19F5, 0x7092, 0x0642, 0x7093, 0x19F2,

+    0x7094, 0x19EF, 0x7095, 0x0640, 0x7096, 0x19F6, 0x7098, 0x19F0,

+    0x7099, 0x0644, 0x709A, 0x19F8, 0x709F, 0x1B66, 0x70A1, 0x1B6A,

+    0x70A4, 0x0790, 0x70A9, 0x1B6D, 0x70AB, 0x0788, 0x70AC, 0x078B,

+    0x70AD, 0x078D, 0x70AE, 0x078F, 0x70AF, 0x078C, 0x70B0, 0x1B69,

+    0x70B1, 0x1B68, 0x70B3, 0x078A, 0x70B4, 0x1B6B, 0x70B5, 0x1B6C,

+    0x70B7, 0x1B65, 0x70B8, 0x078E, 0x70BA, 0x0789, 0x70BE, 0x1B67,

+    0x70C5, 0x1D27, 0x70C6, 0x1D28, 0x70C7, 0x1D29, 0x70C8, 0x0921,

+    0x70CA, 0x091D, 0x70CB, 0x1D1E, 0x70CD, 0x1D26, 0x70CE, 0x1D2B,

+    0x70CF, 0x0922, 0x70D1, 0x1D1C, 0x70D2, 0x1D22, 0x70D3, 0x1D1B,

+    0x70D4, 0x1D25, 0x70D7, 0x1D21, 0x70D8, 0x091E, 0x70D9, 0x0920,

+    0x70DA, 0x1D2A, 0x70DC, 0x1D1A, 0x70DD, 0x1D1D, 0x70DE, 0x1D23,

+    0x70E0, 0x1D24, 0x70E1, 0x1D2C, 0x70E2, 0x1D20, 0x70E4, 0x091F,

+    0x70EF, 0x0B16, 0x70F0, 0x1F72, 0x70F3, 0x1F74, 0x70F4, 0x1F70,

+    0x70F6, 0x1F7C, 0x70F7, 0x1F6E, 0x70F8, 0x1F7B, 0x70F9, 0x0B12,

+    0x70FA, 0x1F6C, 0x70FB, 0x21F2, 0x70FC, 0x1F76, 0x70FD, 0x0B15,

+    0x70FF, 0x1F77, 0x7100, 0x1F7A, 0x7102, 0x1F7E, 0x7104, 0x1F73,

+    0x7106, 0x1F78, 0x7109, 0x0B13, 0x710A, 0x0B14, 0x710B, 0x1F7D,

+    0x710C, 0x1F71, 0x710D, 0x1F6D, 0x710E, 0x1F7F, 0x7110, 0x1F75,

+    0x7113, 0x1F79, 0x7117, 0x1F6F, 0x7119, 0x0CC8, 0x711A, 0x0CC9,

+    0x711B, 0x21FC, 0x711C, 0x0CCF, 0x711E, 0x21F0, 0x711F, 0x21F9,

+    0x7120, 0x21EF, 0x7121, 0x0CCC, 0x7122, 0x21F7, 0x7123, 0x21F5,

+    0x7125, 0x21F6, 0x7126, 0x0CCA, 0x7128, 0x21FA, 0x712E, 0x21F3,

+    0x712F, 0x21F1, 0x7130, 0x0CCB, 0x7131, 0x21F4, 0x7132, 0x21F8,

+    0x7136, 0x0CCD, 0x713A, 0x21FB, 0x7141, 0x247B, 0x7142, 0x2482,

+    0x7143, 0x2484, 0x7144, 0x248A, 0x7146, 0x0E72, 0x7147, 0x2476,

+    0x7149, 0x0E6A, 0x714B, 0x2485, 0x714C, 0x0E6F, 0x714D, 0x248B,

+    0x714E, 0x0E66, 0x7150, 0x2488, 0x7152, 0x2478, 0x7153, 0x2489,

+    0x7154, 0x2477, 0x7156, 0x0E74, 0x7158, 0x2483, 0x7159, 0x0E67,

+    0x715A, 0x248C, 0x715C, 0x0E6C, 0x715D, 0x247C, 0x715E, 0x0E71,

+    0x715F, 0x2487, 0x7160, 0x247A, 0x7161, 0x2481, 0x7162, 0x247D,

+    0x7163, 0x2479, 0x7164, 0x0E69, 0x7165, 0x0E70, 0x7166, 0x0E6E,

+    0x7167, 0x0E6B, 0x7168, 0x0E73, 0x7169, 0x0E68, 0x716A, 0x2480,

+    0x716C, 0x0E6D, 0x716E, 0x0CCE, 0x7170, 0x2486, 0x7172, 0x247E,

+    0x7178, 0x247F, 0x717B, 0x271E, 0x717D, 0x1023, 0x7180, 0x271A,

+    0x7181, 0x2720, 0x7182, 0x271C, 0x7184, 0x1025, 0x7185, 0x271B,

+    0x7186, 0x271F, 0x7187, 0x2717, 0x7189, 0x2719, 0x718A, 0x1024,

+    0x718F, 0x271D, 0x7190, 0x2718, 0x7192, 0x1026, 0x7194, 0x1021,

+    0x7197, 0x2721, 0x7199, 0x1022, 0x719A, 0x295A, 0x719B, 0x2957,

+    0x719C, 0x2963, 0x719D, 0x295D, 0x719E, 0x295F, 0x719F, 0x119E,

+    0x71A0, 0x2959, 0x71A1, 0x2961, 0x71A4, 0x2960, 0x71A5, 0x295E,

+    0x71A7, 0x2964, 0x71A8, 0x11A1, 0x71A9, 0x295B, 0x71AA, 0x2962,

+    0x71AC, 0x119F, 0x71AF, 0x2956, 0x71B0, 0x2958, 0x71B1, 0x11A0,

+    0x71B2, 0x2955, 0x71B3, 0x2965, 0x71B5, 0x295C, 0x71B8, 0x2BB3,

+    0x71B9, 0x12F3, 0x71BC, 0x2BBE, 0x71BD, 0x2BBC, 0x71BE, 0x12ED,

+    0x71BF, 0x2BB2, 0x71C0, 0x2BB5, 0x71C1, 0x2BB6, 0x71C2, 0x2BB1,

+    0x71C3, 0x12F7, 0x71C4, 0x12F8, 0x71C5, 0x2BB0, 0x71C6, 0x2BBF,

+    0x71C7, 0x2BBA, 0x71C8, 0x12F1, 0x71C9, 0x12EE, 0x71CA, 0x2BB9,

+    0x71CB, 0x2BB7, 0x71CE, 0x12F4, 0x71CF, 0x2BBB, 0x71D0, 0x12EF,

+    0x71D2, 0x12F0, 0x71D4, 0x2BB8, 0x71D5, 0x12F2, 0x71D6, 0x2BB4,

+    0x71D8, 0x2BBD, 0x71D9, 0x12F5, 0x71DA, 0x2BC0, 0x71DB, 0x2BC1,

+    0x71DC, 0x12F6, 0x71DF, 0x1404, 0x71E0, 0x140B, 0x71E1, 0x2D9B,

+    0x71E2, 0x2DA1, 0x71E4, 0x2D9F, 0x71E5, 0x1407, 0x71E6, 0x1406,

+    0x71E7, 0x1403, 0x71E8, 0x2D9D, 0x71EC, 0x1409, 0x71ED, 0x1408,

+    0x71EE, 0x1405, 0x71F0, 0x2DA0, 0x71F1, 0x2D9C, 0x71F2, 0x2D9E,

+    0x71F4, 0x140A, 0x71F8, 0x14F1, 0x71F9, 0x2F52, 0x71FB, 0x14EE,

+    0x71FC, 0x14EF, 0x71FD, 0x2F54, 0x71FE, 0x14F0, 0x71FF, 0x2F51,

+    0x7201, 0x2F50, 0x7202, 0x30B9, 0x7203, 0x2F53, 0x7205, 0x30BA,

+    0x7206, 0x1591, 0x7207, 0x30B8, 0x720A, 0x30B7, 0x720C, 0x30B6,

+    0x720D, 0x1592, 0x7210, 0x161F, 0x7213, 0x31F4, 0x7214, 0x31F5,

+    0x7219, 0x32E1, 0x721A, 0x32E0, 0x721B, 0x167B, 0x721D, 0x32DF,

+    0x721E, 0x338D, 0x721F, 0x338E, 0x7222, 0x3424, 0x7223, 0x348C,

+    0x7226, 0x34D1, 0x7227, 0x3535, 0x7228, 0x1766, 0x7229, 0x3549,

+    0x722A, 0x02E7, 0x722C, 0x0645, 0x722D, 0x0646, 0x7230, 0x0791,

+    0x7235, 0x140C, 0x7236, 0x02E8, 0x7238, 0x0647, 0x7239, 0x0923,

+    0x723A, 0x0E75, 0x723B, 0x02E9, 0x723D, 0x0B17, 0x723E, 0x1027,

+    0x723F, 0x178D, 0x7241, 0x1B6E, 0x7242, 0x1D2D, 0x7244, 0x2722,

+    0x7246, 0x140D, 0x7247, 0x02EA, 0x7248, 0x0648, 0x7249, 0x1B6F,

+    0x724A, 0x1B70, 0x724B, 0x21FD, 0x724C, 0x0CD0, 0x724F, 0x248D,

+    0x7252, 0x0E76, 0x7253, 0x2723, 0x7256, 0x11A2, 0x7258, 0x1593,

+    0x7259, 0x02EB, 0x725A, 0x21FE, 0x725B, 0x02EC, 0x725D, 0x03F4,

+    0x725E, 0x180B, 0x725F, 0x03F3, 0x7260, 0x04EC, 0x7261, 0x04EB,

+    0x7262, 0x04EA, 0x7263, 0x18C5, 0x7267, 0x0649, 0x7269, 0x064A,

+    0x726A, 0x19FA, 0x726C, 0x1B71, 0x726E, 0x1B74, 0x726F, 0x0793,

+    0x7270, 0x1B72, 0x7272, 0x0792, 0x7273, 0x1B73, 0x7274, 0x0794,

+    0x7276, 0x1D30, 0x7277, 0x1D2F, 0x7278, 0x1D2E, 0x7279, 0x0924,

+    0x727B, 0x1F81, 0x727C, 0x1F82, 0x727D, 0x0B18, 0x727E, 0x1F80,

+    0x727F, 0x1F83, 0x7280, 0x0CD2, 0x7281, 0x0B19, 0x7284, 0x0CD1,

+    0x7285, 0x2202, 0x7286, 0x2201, 0x7288, 0x21FF, 0x7289, 0x2200,

+    0x728B, 0x2203, 0x728C, 0x248F, 0x728D, 0x248E, 0x728E, 0x2492,

+    0x7290, 0x2491, 0x7291, 0x2490, 0x7292, 0x1028, 0x7293, 0x2726,

+    0x7295, 0x2725, 0x7296, 0x1029, 0x7297, 0x2724, 0x7298, 0x2966,

+    0x729A, 0x2967, 0x729B, 0x11A3, 0x729D, 0x2BC2, 0x729E, 0x2BC3,

+    0x72A1, 0x30BF, 0x72A2, 0x1594, 0x72A3, 0x30BE, 0x72A4, 0x30BD,

+    0x72A5, 0x30BB, 0x72A6, 0x30BC, 0x72A7, 0x167C, 0x72A8, 0x31F6,

+    0x72A9, 0x338F, 0x72AA, 0x34D2, 0x72AC, 0x02ED, 0x72AE, 0x17AF,

+    0x72AF, 0x0355, 0x72B0, 0x17B0, 0x72B4, 0x180C, 0x72B5, 0x180D,

+    0x72BA, 0x18CB, 0x72BD, 0x18C7, 0x72BF, 0x18C6, 0x72C0, 0x064B,

+    0x72C1, 0x18CA, 0x72C2, 0x04EE, 0x72C3, 0x18C8, 0x72C4, 0x04ED,

+    0x72C5, 0x18CC, 0x72C6, 0x18C9, 0x72C9, 0x19FE, 0x72CA, 0x1B75,

+    0x72CB, 0x19FC, 0x72CC, 0x1A03, 0x72CE, 0x064C, 0x72D0, 0x064F,

+    0x72D1, 0x1A04, 0x72D2, 0x1A00, 0x72D4, 0x1A01, 0x72D6, 0x19FB,

+    0x72D7, 0x064E, 0x72D8, 0x19FD, 0x72D9, 0x064D, 0x72DA, 0x1A02,

+    0x72DC, 0x19FF, 0x72DF, 0x1B79, 0x72E0, 0x0796, 0x72E1, 0x0797,

+    0x72E3, 0x1B7C, 0x72E4, 0x1B76, 0x72E6, 0x1B7B, 0x72E8, 0x1B77,

+    0x72E9, 0x0795, 0x72EA, 0x1B7A, 0x72EB, 0x1B78, 0x72F3, 0x1D36,

+    0x72F4, 0x1D33, 0x72F6, 0x1D35, 0x72F7, 0x0929, 0x72F8, 0x0928,

+    0x72F9, 0x0926, 0x72FA, 0x1D32, 0x72FB, 0x1D37, 0x72FC, 0x0925,

+    0x72FD, 0x0927, 0x72FE, 0x1D34, 0x72FF, 0x1F8B, 0x7300, 0x1D31,

+    0x7301, 0x1D38, 0x7307, 0x1F86, 0x7308, 0x1F8A, 0x730A, 0x1F89,

+    0x730B, 0x2205, 0x730C, 0x2210, 0x730F, 0x1F8C, 0x7311, 0x1F87,

+    0x7312, 0x2204, 0x7313, 0x0B1D, 0x7316, 0x0B1C, 0x7317, 0x1F85,

+    0x7318, 0x1F88, 0x7319, 0x0B1E, 0x731B, 0x0B1B, 0x731C, 0x0B1A,

+    0x731D, 0x1F84, 0x731E, 0x1F8D, 0x7322, 0x2207, 0x7323, 0x220E,

+    0x7325, 0x0CD4, 0x7326, 0x220D, 0x7327, 0x220A, 0x7329, 0x0CD6,

+    0x732D, 0x220C, 0x7330, 0x2206, 0x7331, 0x2208, 0x7332, 0x220B,

+    0x7333, 0x2209, 0x7334, 0x0CD5, 0x7335, 0x220F, 0x7336, 0x0CD3,

+    0x7337, 0x0E77, 0x733A, 0x2496, 0x733B, 0x2495, 0x733C, 0x2493,

+    0x733E, 0x0E7A, 0x733F, 0x0E79, 0x7340, 0x2497, 0x7342, 0x2494,

+    0x7343, 0x2727, 0x7344, 0x102A, 0x7345, 0x0E78, 0x7349, 0x2499,

+    0x734A, 0x2498, 0x734C, 0x272A, 0x734D, 0x2728, 0x734E, 0x11A4,

+    0x7350, 0x102B, 0x7351, 0x2729, 0x7352, 0x2969, 0x7357, 0x11A5,

+    0x7358, 0x2968, 0x7359, 0x2971, 0x735A, 0x2970, 0x735B, 0x296E,

+    0x735D, 0x296D, 0x735E, 0x296A, 0x735F, 0x296B, 0x7360, 0x296C,

+    0x7361, 0x296F, 0x7362, 0x2972, 0x7365, 0x2BC8, 0x7366, 0x2BC5,

+    0x7367, 0x2BC6, 0x7368, 0x12F9, 0x7369, 0x2BC4, 0x736A, 0x2BCA,

+    0x736B, 0x2BC9, 0x736C, 0x2BC7, 0x736E, 0x2DA3, 0x736F, 0x2DA4,

+    0x7370, 0x140E, 0x7372, 0x140F, 0x7373, 0x2DA2, 0x7375, 0x14F3,

+    0x7376, 0x2F55, 0x7377, 0x14F2, 0x7378, 0x1595, 0x737A, 0x1596,

+    0x737B, 0x1620, 0x737C, 0x31F8, 0x737D, 0x31F7, 0x737E, 0x32E2,

+    0x737F, 0x3390, 0x7380, 0x16CA, 0x7381, 0x3426, 0x7382, 0x3425,

+    0x7383, 0x3427, 0x7384, 0x0356, 0x7385, 0x1B7D, 0x7386, 0x092A,

+    0x7387, 0x0B1F, 0x7388, 0x1F8E, 0x7389, 0x0357, 0x738A, 0x17B1,

+    0x738B, 0x02EE, 0x738E, 0x180E, 0x7392, 0x18D1, 0x7393, 0x18CF,

+    0x7394, 0x18D0, 0x7395, 0x18CD, 0x7396, 0x04EF, 0x7397, 0x18CE,

+    0x739D, 0x1A0C, 0x739F, 0x0652, 0x73A0, 0x1A0A, 0x73A1, 0x1A06,

+    0x73A2, 0x1A09, 0x73A4, 0x1A05, 0x73A5, 0x0654, 0x73A6, 0x1A08,

+    0x73A8, 0x0651, 0x73A9, 0x0650, 0x73AB, 0x0653, 0x73AC, 0x1A0B,

+    0x73AD, 0x1A07, 0x73B2, 0x079B, 0x73B3, 0x079E, 0x73B4, 0x1B85,

+    0x73B5, 0x1B84, 0x73B6, 0x1B83, 0x73B7, 0x0798, 0x73B8, 0x1B8C,

+    0x73B9, 0x1B82, 0x73BB, 0x079A, 0x73BC, 0x1D3D, 0x73BE, 0x1B89,

+    0x73BF, 0x1B87, 0x73C0, 0x079D, 0x73C2, 0x1B7F, 0x73C3, 0x1B8A,

+    0x73C5, 0x1B81, 0x73C6, 0x1B8B, 0x73C7, 0x1B88, 0x73C8, 0x1B80,

+    0x73CA, 0x0799, 0x73CB, 0x1B8D, 0x73CC, 0x1B7E, 0x73CD, 0x079C,

+    0x73D2, 0x1D42, 0x73D3, 0x1D39, 0x73D4, 0x1D44, 0x73D6, 0x1D3C,

+    0x73D7, 0x1D47, 0x73D8, 0x1D48, 0x73D9, 0x1D3A, 0x73DA, 0x1D46,

+    0x73DB, 0x1D43, 0x73DC, 0x1D41, 0x73DD, 0x1D45, 0x73DE, 0x0930,

+    0x73E0, 0x092E, 0x73E3, 0x1D3F, 0x73E5, 0x1D3B, 0x73E7, 0x1D3E,

+    0x73E8, 0x1D49, 0x73E9, 0x1D40, 0x73EA, 0x092F, 0x73EB, 0x1B86,

+    0x73ED, 0x092B, 0x73EE, 0x092D, 0x73F4, 0x1F9C, 0x73F5, 0x1F91,

+    0x73F6, 0x1F8F, 0x73F8, 0x1F90, 0x73FA, 0x1F97, 0x73FC, 0x1F98,

+    0x73FD, 0x1F94, 0x73FE, 0x0B24, 0x73FF, 0x1F99, 0x7400, 0x1F96,

+    0x7401, 0x1F93, 0x7403, 0x0B22, 0x7404, 0x1F92, 0x7405, 0x0B20,

+    0x7406, 0x0B23, 0x7407, 0x1F95, 0x7408, 0x1F9D, 0x7409, 0x092C,

+    0x740A, 0x0B21, 0x740B, 0x1F9B, 0x740C, 0x1F9A, 0x740D, 0x0B25,

+    0x7416, 0x2215, 0x741A, 0x2216, 0x741B, 0x0CE0, 0x741D, 0x221C,

+    0x7420, 0x221E, 0x7421, 0x2217, 0x7422, 0x0CDA, 0x7423, 0x221B,

+    0x7424, 0x221A, 0x7425, 0x0CDB, 0x7426, 0x0CE1, 0x7428, 0x0CE2,

+    0x7429, 0x221D, 0x742A, 0x0CD8, 0x742B, 0x2214, 0x742C, 0x2212,

+    0x742D, 0x2218, 0x742E, 0x2211, 0x742F, 0x0CDF, 0x7430, 0x2213,

+    0x7431, 0x2219, 0x7432, 0x221F, 0x7433, 0x0CD9, 0x7434, 0x0CDE,

+    0x7435, 0x0CDC, 0x7436, 0x0CDD, 0x743A, 0x0CD7, 0x743F, 0x0E81,

+    0x7440, 0x24A0, 0x7441, 0x0E80, 0x7442, 0x24A4, 0x7444, 0x249A,

+    0x7446, 0x24A5, 0x744A, 0x249B, 0x744B, 0x249C, 0x744D, 0x24A6,

+    0x744E, 0x24A3, 0x744F, 0x24A1, 0x7450, 0x24A2, 0x7451, 0x249E,

+    0x7452, 0x249D, 0x7454, 0x24A7, 0x7455, 0x0E7D, 0x7457, 0x249F,

+    0x7459, 0x0E82, 0x745A, 0x0E7C, 0x745B, 0x0E83, 0x745C, 0x0E84,

+    0x745E, 0x0E7F, 0x745F, 0x0E7E, 0x7462, 0x272B, 0x7463, 0x102D,

+    0x7464, 0x102C, 0x7467, 0x2730, 0x7469, 0x11A6, 0x746A, 0x102E,

+    0x746D, 0x1030, 0x746E, 0x2731, 0x746F, 0x0E7B, 0x7470, 0x102F,

+    0x7471, 0x272D, 0x7472, 0x272F, 0x7473, 0x272C, 0x7475, 0x272E,

+    0x7479, 0x297C, 0x747C, 0x297B, 0x747D, 0x2978, 0x747E, 0x11A9,

+    0x747F, 0x2BCB, 0x7480, 0x11AA, 0x7481, 0x2977, 0x7483, 0x11A8,

+    0x7485, 0x2979, 0x7486, 0x2976, 0x7487, 0x2973, 0x7488, 0x297A,

+    0x7489, 0x2974, 0x748A, 0x2975, 0x748B, 0x11A7, 0x7490, 0x2DA8,

+    0x7492, 0x2BCF, 0x7494, 0x2BCE, 0x7495, 0x2BD0, 0x7497, 0x2DA5,

+    0x7498, 0x12FC, 0x749A, 0x2BCC, 0x749C, 0x12FA, 0x749E, 0x12FE,

+    0x749F, 0x12FD, 0x74A0, 0x2BCD, 0x74A1, 0x2BD1, 0x74A3, 0x12FB,

+    0x74A5, 0x2DAC, 0x74A6, 0x1412, 0x74A7, 0x14F4, 0x74A8, 0x1413,

+    0x74A9, 0x1410, 0x74AA, 0x2DA9, 0x74AB, 0x2DA7, 0x74AD, 0x2DAA,

+    0x74AF, 0x2DAD, 0x74B0, 0x1411, 0x74B1, 0x2DAB, 0x74B2, 0x2DA6,

+    0x74B5, 0x2F58, 0x74B6, 0x2F5B, 0x74B7, 0x30C2, 0x74B8, 0x2F56,

+    0x74BA, 0x31F9, 0x74BB, 0x2F5C, 0x74BD, 0x1597, 0x74BE, 0x2F5A,

+    0x74BF, 0x14F5, 0x74C0, 0x2F57, 0x74C1, 0x2F59, 0x74C2, 0x2F5D,

+    0x74C3, 0x30C3, 0x74C5, 0x30C1, 0x74CA, 0x1598, 0x74CB, 0x30C0,

+    0x74CF, 0x1621, 0x74D4, 0x167E, 0x74D5, 0x3392, 0x74D6, 0x167D,

+    0x74D7, 0x3394, 0x74D8, 0x3391, 0x74D9, 0x3393, 0x74DA, 0x16FE,

+    0x74DB, 0x348D, 0x74DC, 0x0358, 0x74DD, 0x1A0D, 0x74DE, 0x1D4A,

+    0x74DF, 0x1D4B, 0x74E0, 0x0B26, 0x74E1, 0x24A8, 0x74E2, 0x12FF,

+    0x74E3, 0x1599, 0x74E4, 0x16CB, 0x74E5, 0x348E, 0x74E6, 0x0359,

+    0x74E8, 0x1A0E, 0x74E9, 0x0120, 0x74EC, 0x1B8E, 0x74EE, 0x1B8F,

+    0x74F4, 0x1D4C, 0x74F5, 0x1D4D, 0x74F6, 0x0B27, 0x74F7, 0x0B28,

+    0x74FB, 0x2220, 0x74FD, 0x24AB, 0x74FE, 0x24AA, 0x74FF, 0x24A9,

+    0x7500, 0x2732, 0x7502, 0x2733, 0x7503, 0x2734, 0x7504, 0x1031,

+    0x7507, 0x297E, 0x7508, 0x297D, 0x750B, 0x2BD2, 0x750C, 0x1300,

+    0x750D, 0x1301, 0x750F, 0x2DB1, 0x7510, 0x2DAE, 0x7511, 0x2DAF,

+    0x7512, 0x2DB0, 0x7513, 0x2F5F, 0x7514, 0x2F5E, 0x7515, 0x14F6,

+    0x7516, 0x30C4, 0x7517, 0x32E3, 0x7518, 0x035A, 0x751A, 0x079F,

+    0x751C, 0x0B29, 0x751D, 0x24AC, 0x751F, 0x035B, 0x7521, 0x1D4E,

+    0x7522, 0x0B2A, 0x7525, 0x0CE3, 0x7526, 0x0CE4, 0x7528, 0x035C,

+    0x7529, 0x035D, 0x752A, 0x180F, 0x752B, 0x04F1, 0x752C, 0x04F0,

+    0x752D, 0x07A0, 0x752E, 0x1B90, 0x752F, 0x2221, 0x7530, 0x035E,

+    0x7531, 0x035F, 0x7532, 0x0360, 0x7533, 0x0361, 0x7537, 0x04F2,

+    0x7538, 0x04F3, 0x7539, 0x18D3, 0x753A, 0x18D2, 0x753D, 0x0655,

+    0x753E, 0x1A11, 0x753F, 0x1A0F, 0x7540, 0x1A10, 0x7547, 0x1B91,

+    0x7548, 0x1B92, 0x754B, 0x07A4, 0x754C, 0x07A2, 0x754E, 0x07A3,

+    0x754F, 0x07A1, 0x7554, 0x0931, 0x7559, 0x0935, 0x755A, 0x0934,

+    0x755B, 0x1D4F, 0x755C, 0x0933, 0x755D, 0x0932, 0x755F, 0x1D50,

+    0x7562, 0x0B2D, 0x7563, 0x1F9F, 0x7564, 0x1F9E, 0x7565, 0x0B2B,

+    0x7566, 0x0B2C, 0x756A, 0x0CE6, 0x756B, 0x0CE5, 0x756C, 0x2223,

+    0x756F, 0x2222, 0x7570, 0x0B2E, 0x7576, 0x0E85, 0x7577, 0x24AE,

+    0x7578, 0x0E86, 0x7579, 0x24AD, 0x757D, 0x2735, 0x757E, 0x297F,

+    0x757F, 0x11AB, 0x7580, 0x2BD3, 0x7584, 0x2DB2, 0x7586, 0x159B,

+    0x7587, 0x159A, 0x758A, 0x16CC, 0x758B, 0x0362, 0x758C, 0x1A12,

+    0x758F, 0x0B2F, 0x7590, 0x2736, 0x7591, 0x1032, 0x7592, 0x022E,

+    0x7594, 0x18D4, 0x7595, 0x18D5, 0x7598, 0x1A13, 0x7599, 0x0657,

+    0x759A, 0x0658, 0x759D, 0x0656, 0x75A2, 0x07A8, 0x75A3, 0x07A9,

+    0x75A4, 0x07A6, 0x75A5, 0x07A7, 0x75A7, 0x1B93, 0x75AA, 0x1B94,

+    0x75AB, 0x07A5, 0x75B0, 0x1D51, 0x75B2, 0x0939, 0x75B3, 0x093A,

+    0x75B5, 0x0B32, 0x75B6, 0x1D57, 0x75B8, 0x093F, 0x75B9, 0x093D,

+    0x75BA, 0x1D58, 0x75BB, 0x1D53, 0x75BC, 0x093C, 0x75BD, 0x093B,

+    0x75BE, 0x0936, 0x75BF, 0x1D56, 0x75C0, 0x1D55, 0x75C1, 0x1D52,

+    0x75C2, 0x093E, 0x75C4, 0x1D54, 0x75C5, 0x0937, 0x75C7, 0x0938,

+    0x75CA, 0x0B33, 0x75CB, 0x1FA3, 0x75CC, 0x1FA4, 0x75CD, 0x0B34,

+    0x75CE, 0x1FA0, 0x75CF, 0x1FA2, 0x75D0, 0x1FA6, 0x75D1, 0x1FA5,

+    0x75D2, 0x1FA1, 0x75D4, 0x0B30, 0x75D5, 0x0B31, 0x75D7, 0x222B,

+    0x75D8, 0x0CEB, 0x75D9, 0x0CEA, 0x75DA, 0x2225, 0x75DB, 0x0CE8,

+    0x75DD, 0x2228, 0x75DE, 0x0CEC, 0x75DF, 0x2229, 0x75E0, 0x0CED,

+    0x75E1, 0x2226, 0x75E2, 0x0CE7, 0x75E3, 0x0CE9, 0x75E4, 0x222A,

+    0x75E6, 0x2227, 0x75E7, 0x2224, 0x75ED, 0x24BB, 0x75EF, 0x24B0,

+    0x75F0, 0x0E88, 0x75F1, 0x0E8B, 0x75F2, 0x0E8A, 0x75F3, 0x0E8F,

+    0x75F4, 0x0E8E, 0x75F5, 0x24BC, 0x75F6, 0x24BA, 0x75F7, 0x24B3,

+    0x75F8, 0x24B7, 0x75F9, 0x24B6, 0x75FA, 0x0E8C, 0x75FB, 0x24B9,

+    0x75FC, 0x24B5, 0x75FD, 0x24BD, 0x75FE, 0x24B4, 0x75FF, 0x0E8D,

+    0x7600, 0x0E87, 0x7601, 0x0E89, 0x7603, 0x24B2, 0x7608, 0x2738,

+    0x7609, 0x1036, 0x760A, 0x273C, 0x760B, 0x1035, 0x760C, 0x2739,

+    0x760D, 0x1034, 0x760F, 0x24B1, 0x7610, 0x24B8, 0x7611, 0x273B,

+    0x7613, 0x1037, 0x7614, 0x273D, 0x7615, 0x273A, 0x7616, 0x2737,

+    0x7619, 0x2982, 0x761A, 0x2986, 0x761B, 0x2988, 0x761C, 0x2984,

+    0x761D, 0x2983, 0x761E, 0x2981, 0x761F, 0x11AE, 0x7620, 0x11AC,

+    0x7621, 0x11B1, 0x7622, 0x11B2, 0x7623, 0x2985, 0x7624, 0x11AF,

+    0x7625, 0x2980, 0x7626, 0x11B0, 0x7627, 0x1033, 0x7628, 0x2987,

+    0x7629, 0x11AD, 0x762D, 0x2BD5, 0x762F, 0x2BD4, 0x7630, 0x2BDC,

+    0x7631, 0x2BD6, 0x7632, 0x2BDB, 0x7633, 0x2BD8, 0x7634, 0x1302,

+    0x7635, 0x2BDA, 0x7638, 0x1303, 0x763A, 0x1304, 0x763C, 0x2BD9,

+    0x763D, 0x2BD7, 0x7642, 0x1415, 0x7643, 0x2DB3, 0x7646, 0x1414,

+    0x7647, 0x2DB6, 0x7648, 0x2DB4, 0x7649, 0x2DB5, 0x764C, 0x1416,

+    0x7650, 0x2F63, 0x7652, 0x14F9, 0x7653, 0x2F64, 0x7656, 0x14F7,

+    0x7657, 0x2F65, 0x7658, 0x14F8, 0x7659, 0x2F62, 0x765A, 0x2F66,

+    0x765C, 0x2F60, 0x765F, 0x159C, 0x7660, 0x30C5, 0x7661, 0x159D,

+    0x7662, 0x1622, 0x7664, 0x2F61, 0x7665, 0x1623, 0x7669, 0x167F,

+    0x766A, 0x32E4, 0x766C, 0x16CE, 0x766D, 0x3395, 0x766E, 0x16CD,

+    0x7670, 0x3428, 0x7671, 0x1723, 0x7672, 0x1724, 0x7675, 0x3543,

+    0x7676, 0x022F, 0x7678, 0x07AA, 0x7679, 0x1B95, 0x767B, 0x0CEE,

+    0x767C, 0x0CEF, 0x767D, 0x0363, 0x767E, 0x03F5, 0x767F, 0x1810,

+    0x7681, 0x18D6, 0x7682, 0x04F4, 0x7684, 0x0659, 0x7686, 0x07AB,

+    0x7687, 0x07AC, 0x7688, 0x07AD, 0x7689, 0x1FA8, 0x768A, 0x1D59,

+    0x768B, 0x0940, 0x768E, 0x0B35, 0x768F, 0x1FA7, 0x7692, 0x222D,

+    0x7693, 0x0CF1, 0x7695, 0x222C, 0x7696, 0x0CF0, 0x7699, 0x24BE,

+    0x769A, 0x11B3, 0x769B, 0x298C, 0x769C, 0x2989, 0x769D, 0x298A,

+    0x769E, 0x298B, 0x76A4, 0x2DB7, 0x76A6, 0x2F67, 0x76AA, 0x31FB,

+    0x76AB, 0x31FA, 0x76AD, 0x3396, 0x76AE, 0x0364, 0x76AF, 0x1A14,

+    0x76B0, 0x0941, 0x76B4, 0x0CF2, 0x76B5, 0x24BF, 0x76B8, 0x273E,

+    0x76BA, 0x11B4, 0x76BB, 0x2BDD, 0x76BD, 0x2F68, 0x76BE, 0x31FC,

+    0x76BF, 0x0365, 0x76C2, 0x065A, 0x76C3, 0x07B0, 0x76C4, 0x1B96,

+    0x76C5, 0x07B1, 0x76C6, 0x07AF, 0x76C8, 0x07AE, 0x76C9, 0x1D5A,

+    0x76CA, 0x0942, 0x76CD, 0x0943, 0x76CE, 0x0944, 0x76D2, 0x0B37,

+    0x76D3, 0x1FA9, 0x76D4, 0x0B36, 0x76DA, 0x222E, 0x76DB, 0x0B38,

+    0x76DC, 0x0CF3, 0x76DD, 0x24C0, 0x76DE, 0x0E90, 0x76DF, 0x0E91,

+    0x76E1, 0x1038, 0x76E3, 0x1039, 0x76E4, 0x11B5, 0x76E5, 0x1306,

+    0x76E6, 0x2BDE, 0x76E7, 0x1305, 0x76E9, 0x2DB8, 0x76EA, 0x1417,

+    0x76EC, 0x2F69, 0x76ED, 0x31FD, 0x76EE, 0x0366, 0x76EF, 0x04F5,

+    0x76F0, 0x1A17, 0x76F1, 0x1A16, 0x76F2, 0x065B, 0x76F3, 0x1A15,

+    0x76F4, 0x065C, 0x76F5, 0x1A18, 0x76F7, 0x1B9C, 0x76F8, 0x07B4,

+    0x76F9, 0x07B3, 0x76FA, 0x1B9E, 0x76FB, 0x1B9D, 0x76FC, 0x07B8,

+    0x76FE, 0x07B7, 0x7701, 0x07B2, 0x7703, 0x1B98, 0x7704, 0x1B99,

+    0x7705, 0x1B9A, 0x7707, 0x07B9, 0x7708, 0x1B97, 0x7709, 0x07B5,

+    0x770A, 0x1B9B, 0x770B, 0x07B6, 0x7710, 0x1D5D, 0x7711, 0x1D61,

+    0x7712, 0x1D5F, 0x7713, 0x1D5E, 0x7715, 0x1D62, 0x7719, 0x1D63,

+    0x771A, 0x1D64, 0x771B, 0x1D5C, 0x771D, 0x1D5B, 0x771F, 0x0946,

+    0x7720, 0x0947, 0x7722, 0x1D65, 0x7723, 0x1D60, 0x7725, 0x1FB2,

+    0x7727, 0x1D66, 0x7728, 0x0948, 0x7729, 0x0945, 0x772D, 0x1FAC,

+    0x772F, 0x1FAB, 0x7731, 0x1FAD, 0x7732, 0x1FAE, 0x7733, 0x1FB0,

+    0x7734, 0x1FAF, 0x7735, 0x1FB4, 0x7736, 0x0B3C, 0x7737, 0x0B39,

+    0x7738, 0x0B3D, 0x7739, 0x1FAA, 0x773A, 0x0B3E, 0x773B, 0x1FB3,

+    0x773C, 0x0B3B, 0x773D, 0x1FB1, 0x773E, 0x0B3A, 0x7744, 0x2231,

+    0x7745, 0x2233, 0x7746, 0x222F, 0x7747, 0x2230, 0x774A, 0x2234,

+    0x774B, 0x2236, 0x774C, 0x2237, 0x774D, 0x2232, 0x774E, 0x2235,

+    0x774F, 0x0CF4, 0x7752, 0x24C4, 0x7754, 0x24C9, 0x7755, 0x24C1,

+    0x7756, 0x24C5, 0x7759, 0x24CA, 0x775A, 0x24C6, 0x775B, 0x0E92,

+    0x775C, 0x0E9A, 0x775E, 0x0E95, 0x775F, 0x24C2, 0x7760, 0x24C3,

+    0x7761, 0x103D, 0x7762, 0x0E9D, 0x7763, 0x0E96, 0x7765, 0x0E9B,

+    0x7766, 0x0E94, 0x7767, 0x24C8, 0x7768, 0x0E9C, 0x7769, 0x24C7,

+    0x776A, 0x0E98, 0x776B, 0x0E93, 0x776C, 0x0E99, 0x776D, 0x24CB,

+    0x776E, 0x2743, 0x776F, 0x2745, 0x7779, 0x0E97, 0x777C, 0x2740,

+    0x777D, 0x103B, 0x777E, 0x2746, 0x777F, 0x103C, 0x7780, 0x2744,

+    0x7781, 0x273F, 0x7782, 0x2742, 0x7783, 0x2747, 0x7784, 0x103A,

+    0x7785, 0x2741, 0x7787, 0x11B7, 0x7788, 0x2990, 0x7789, 0x298F,

+    0x778B, 0x11BA, 0x778C, 0x11B8, 0x778D, 0x298D, 0x778E, 0x11B6,

+    0x778F, 0x298E, 0x7791, 0x11B9, 0x7795, 0x2BE6, 0x7797, 0x2BE8,

+    0x7799, 0x2BE7, 0x779A, 0x2BDF, 0x779B, 0x2BE3, 0x779C, 0x2BE2,

+    0x779D, 0x2BE0, 0x779E, 0x1308, 0x779F, 0x1309, 0x77A0, 0x1307,

+    0x77A1, 0x2BE1, 0x77A2, 0x2BE4, 0x77A3, 0x2BE5, 0x77A5, 0x130A,

+    0x77A7, 0x141C, 0x77A8, 0x2DC0, 0x77AA, 0x1419, 0x77AB, 0x2DBA,

+    0x77AC, 0x141B, 0x77AD, 0x141D, 0x77B0, 0x141A, 0x77B1, 0x2DBF,

+    0x77B2, 0x2DBB, 0x77B3, 0x1418, 0x77B4, 0x2DBE, 0x77B5, 0x2DB9,

+    0x77B6, 0x2DBD, 0x77B7, 0x2DBC, 0x77BA, 0x2F6B, 0x77BB, 0x14FC,

+    0x77BC, 0x14FD, 0x77BD, 0x14FA, 0x77BF, 0x14FB, 0x77C2, 0x2F6A,

+    0x77C4, 0x30C8, 0x77C7, 0x159E, 0x77C9, 0x30C6, 0x77CA, 0x30C7,

+    0x77CC, 0x31FE, 0x77CD, 0x3201, 0x77CE, 0x31FF, 0x77CF, 0x3200,

+    0x77D0, 0x32E5, 0x77D3, 0x1680, 0x77D4, 0x3429, 0x77D5, 0x348F,

+    0x77D7, 0x1725, 0x77D8, 0x34D3, 0x77D9, 0x34D4, 0x77DA, 0x1753,

+    0x77DB, 0x0367, 0x77DC, 0x07BA, 0x77DE, 0x2238, 0x77E0, 0x24CC,

+    0x77E2, 0x0368, 0x77E3, 0x04F6, 0x77E5, 0x065D, 0x77E7, 0x1B9F,

+    0x77E8, 0x1BA0, 0x77E9, 0x0949, 0x77EC, 0x2239, 0x77ED, 0x0CF5,

+    0x77EE, 0x0E9E, 0x77EF, 0x141E, 0x77F0, 0x2DC1, 0x77F1, 0x30C9,

+    0x77F2, 0x3202, 0x77F3, 0x0369, 0x77F7, 0x1A1E, 0x77F8, 0x1A19,

+    0x77F9, 0x1A1B, 0x77FA, 0x1A1D, 0x77FB, 0x1A1C, 0x77FC, 0x1A1A,

+    0x77FD, 0x065E, 0x7802, 0x07BB, 0x7803, 0x1BA9, 0x7805, 0x1BA4,

+    0x7806, 0x1BA1, 0x7809, 0x1BA8, 0x780C, 0x07BD, 0x780D, 0x07BE,

+    0x780E, 0x1BA7, 0x780F, 0x1BA6, 0x7810, 0x1BA5, 0x7811, 0x1BA2,

+    0x7812, 0x1BA3, 0x7813, 0x1BAA, 0x7814, 0x07BC, 0x781D, 0x094D,

+    0x781F, 0x0953, 0x7820, 0x0952, 0x7821, 0x1D6F, 0x7822, 0x1D69,

+    0x7823, 0x1D67, 0x7825, 0x0950, 0x7826, 0x1FBB, 0x7827, 0x094B,

+    0x7828, 0x1D6C, 0x7829, 0x1D70, 0x782A, 0x1D72, 0x782B, 0x1D6E,

+    0x782C, 0x1D68, 0x782D, 0x0951, 0x782E, 0x1D6D, 0x782F, 0x1D6B,

+    0x7830, 0x094A, 0x7831, 0x1D73, 0x7832, 0x0954, 0x7833, 0x1D71,

+    0x7834, 0x094E, 0x7835, 0x1D6A, 0x7837, 0x094F, 0x7838, 0x094C,

+    0x7843, 0x0B40, 0x7845, 0x1FBC, 0x7848, 0x1FB5, 0x7849, 0x1FB7,

+    0x784A, 0x1FB9, 0x784C, 0x1FBA, 0x784D, 0x1FB8, 0x784E, 0x0B41,

+    0x7850, 0x1FBD, 0x7852, 0x1FB6, 0x785C, 0x223D, 0x785D, 0x0CF6,

+    0x785E, 0x2245, 0x7860, 0x223A, 0x7862, 0x2246, 0x7864, 0x223B,

+    0x7865, 0x223C, 0x7868, 0x2244, 0x7869, 0x2243, 0x786A, 0x2240,

+    0x786B, 0x0B3F, 0x786C, 0x0CF7, 0x786D, 0x223E, 0x786E, 0x2241,

+    0x786F, 0x0CF8, 0x7870, 0x2242, 0x7871, 0x223F, 0x7879, 0x24D7,

+    0x787B, 0x24DB, 0x787C, 0x0EA5, 0x787E, 0x274D, 0x787F, 0x0EA8,

+    0x7880, 0x24D9, 0x7881, 0x36E8, 0x7883, 0x24D6, 0x7884, 0x24D1,

+    0x7885, 0x24D3, 0x7886, 0x24D4, 0x7887, 0x24CD, 0x7889, 0x0EA4,

+    0x788C, 0x0EA3, 0x788E, 0x0E9F, 0x788F, 0x24D0, 0x7891, 0x0EA6,

+    0x7893, 0x0EA7, 0x7894, 0x24CF, 0x7895, 0x24D2, 0x7896, 0x24DA,

+    0x7897, 0x0EA1, 0x7898, 0x0EA2, 0x7899, 0x24D8, 0x789A, 0x24CE,

+    0x789E, 0x274F, 0x789F, 0x103F, 0x78A0, 0x2751, 0x78A1, 0x24D5,

+    0x78A2, 0x2753, 0x78A3, 0x1043, 0x78A4, 0x2754, 0x78A5, 0x2750,

+    0x78A7, 0x1040, 0x78A8, 0x274C, 0x78A9, 0x1042, 0x78AA, 0x2749,

+    0x78AB, 0x274E, 0x78AC, 0x2752, 0x78AD, 0x274B, 0x78B0, 0x0EA0,

+    0x78B2, 0x2748, 0x78B3, 0x1041, 0x78B4, 0x274A, 0x78BA, 0x11BD,

+    0x78BB, 0x2992, 0x78BC, 0x11C1, 0x78BE, 0x11BF, 0x78C1, 0x103E,

+    0x78C3, 0x2999, 0x78C4, 0x299A, 0x78C5, 0x11BC, 0x78C8, 0x2998,

+    0x78C9, 0x299B, 0x78CA, 0x11BE, 0x78CB, 0x11BB, 0x78CC, 0x2994,

+    0x78CD, 0x2991, 0x78CE, 0x2996, 0x78CF, 0x2993, 0x78D0, 0x11C2,

+    0x78D1, 0x2995, 0x78D4, 0x2997, 0x78D5, 0x11C0, 0x78DA, 0x130C,

+    0x78DB, 0x2BEF, 0x78DD, 0x2BE9, 0x78DE, 0x2BED, 0x78DF, 0x2BF3,

+    0x78E0, 0x2BF4, 0x78E1, 0x2BF0, 0x78E2, 0x2BF1, 0x78E3, 0x2BEE,

+    0x78E5, 0x2BEB, 0x78E7, 0x130E, 0x78E8, 0x130B, 0x78E9, 0x2BEA,

+    0x78EA, 0x2BEC, 0x78EC, 0x130D, 0x78ED, 0x2BF2, 0x78EF, 0x1422,

+    0x78F2, 0x2DC8, 0x78F3, 0x2DC2, 0x78F4, 0x1421, 0x78F7, 0x141F,

+    0x78F9, 0x2DCA, 0x78FA, 0x1420, 0x78FB, 0x2DC5, 0x78FC, 0x2DC6,

+    0x78FD, 0x2DC3, 0x78FE, 0x2DCB, 0x78FF, 0x2DC7, 0x7901, 0x1423,

+    0x7902, 0x2DC4, 0x7904, 0x2DCC, 0x7905, 0x2DC9, 0x7909, 0x2F6F,

+    0x790C, 0x2F6C, 0x790E, 0x14FE, 0x7910, 0x2F70, 0x7911, 0x2F72,

+    0x7912, 0x2F71, 0x7913, 0x2F6D, 0x7914, 0x2F6E, 0x7917, 0x30CE,

+    0x7919, 0x159F, 0x791B, 0x30CB, 0x791C, 0x30CD, 0x791D, 0x30CA,

+    0x791E, 0x30CF, 0x7921, 0x30CC, 0x7923, 0x3204, 0x7924, 0x3207,

+    0x7925, 0x3203, 0x7926, 0x1624, 0x7927, 0x3205, 0x7928, 0x3206,

+    0x7929, 0x3208, 0x792A, 0x1625, 0x792B, 0x1627, 0x792C, 0x1626,

+    0x792D, 0x32E6, 0x792F, 0x32E8, 0x7931, 0x32E7, 0x7935, 0x3397,

+    0x7938, 0x3490, 0x7939, 0x34D5, 0x793A, 0x036A, 0x793D, 0x18D7,

+    0x793E, 0x065F, 0x793F, 0x1A20, 0x7940, 0x0660, 0x7941, 0x0661,

+    0x7942, 0x1A1F, 0x7944, 0x1BAF, 0x7945, 0x1BAE, 0x7946, 0x07BF,

+    0x7947, 0x07C2, 0x7948, 0x07C1, 0x7949, 0x07C0, 0x794A, 0x1BAB,

+    0x794B, 0x1BAD, 0x794C, 0x1BAC, 0x794F, 0x1D76, 0x7950, 0x0956,

+    0x7951, 0x1D7A, 0x7952, 0x1D79, 0x7953, 0x1D78, 0x7954, 0x1D74,

+    0x7955, 0x0955, 0x7956, 0x0959, 0x7957, 0x095C, 0x795A, 0x095D,

+    0x795B, 0x1D75, 0x795C, 0x1D77, 0x795D, 0x095B, 0x795E, 0x095A,

+    0x795F, 0x0958, 0x7960, 0x0957, 0x7961, 0x1FC4, 0x7963, 0x1FC2,

+    0x7964, 0x1FBE, 0x7965, 0x0B42, 0x7967, 0x1FBF, 0x7968, 0x0B43,

+    0x7969, 0x1FC0, 0x796A, 0x1FC1, 0x796B, 0x1FC3, 0x796D, 0x0B44,

+    0x7970, 0x224A, 0x7972, 0x2249, 0x7973, 0x2248, 0x7974, 0x2247,

+    0x7979, 0x24DF, 0x797A, 0x0EA9, 0x797C, 0x24DC, 0x797D, 0x24DE,

+    0x797F, 0x0EAA, 0x7981, 0x0EAB, 0x7982, 0x24DD, 0x7988, 0x275D,

+    0x798A, 0x2756, 0x798B, 0x2757, 0x798D, 0x1046, 0x798E, 0x1044,

+    0x798F, 0x1045, 0x7990, 0x275F, 0x7992, 0x275E, 0x7993, 0x275B,

+    0x7994, 0x275A, 0x7995, 0x2759, 0x7996, 0x2758, 0x7997, 0x275C,

+    0x7998, 0x2755, 0x799A, 0x299C, 0x799B, 0x29A1, 0x799C, 0x299F,

+    0x79A0, 0x299E, 0x79A1, 0x299D, 0x79A2, 0x29A0, 0x79A4, 0x2BF5,

+    0x79A6, 0x130F, 0x79A7, 0x1424, 0x79A8, 0x2DCE, 0x79AA, 0x1425,

+    0x79AB, 0x2DCD, 0x79AC, 0x2F74, 0x79AD, 0x2F73, 0x79AE, 0x14FF,

+    0x79B0, 0x30D0, 0x79B1, 0x15A0, 0x79B2, 0x3209, 0x79B3, 0x16CF,

+    0x79B4, 0x3398, 0x79B6, 0x3492, 0x79B7, 0x3491, 0x79B8, 0x17B2,

+    0x79B9, 0x07C3, 0x79BA, 0x07C4, 0x79BB, 0x1FC5, 0x79BD, 0x0EAD,

+    0x79BE, 0x036B, 0x79BF, 0x04F9, 0x79C0, 0x04F8, 0x79C1, 0x04F7,

+    0x79C5, 0x1A21, 0x79C8, 0x0663, 0x79C9, 0x0662, 0x79CB, 0x07C7,

+    0x79CD, 0x1BB1, 0x79CE, 0x1BB4, 0x79CF, 0x1BB2, 0x79D1, 0x07C5,

+    0x79D2, 0x07C6, 0x79D5, 0x1BB0, 0x79D6, 0x1BB3, 0x79D8, 0x0964,

+    0x79DC, 0x1D81, 0x79DD, 0x1D83, 0x79DE, 0x1D82, 0x79DF, 0x0961,

+    0x79E0, 0x1D7D, 0x79E3, 0x095F, 0x79E4, 0x095E, 0x79E6, 0x0962,

+    0x79E7, 0x0960, 0x79E9, 0x0963, 0x79EA, 0x1D80, 0x79EB, 0x1D7B,

+    0x79EC, 0x1D7C, 0x79ED, 0x1D7F, 0x79EE, 0x1D7E, 0x79F6, 0x1FC8,

+    0x79F7, 0x1FC9, 0x79F8, 0x1FC7, 0x79FA, 0x1FC6, 0x79FB, 0x0B45,

+    0x7A00, 0x0CFD, 0x7A02, 0x224B, 0x7A03, 0x224D, 0x7A04, 0x224F,

+    0x7A05, 0x0CFC, 0x7A08, 0x0CFA, 0x7A0A, 0x224C, 0x7A0B, 0x0CFB,

+    0x7A0C, 0x224E, 0x7A0D, 0x0CF9, 0x7A10, 0x24E9, 0x7A11, 0x24E0,

+    0x7A12, 0x24E3, 0x7A13, 0x24E7, 0x7A14, 0x0EB1, 0x7A15, 0x24E5,

+    0x7A17, 0x24E4, 0x7A18, 0x24E1, 0x7A19, 0x24E2, 0x7A1A, 0x0EAF,

+    0x7A1B, 0x24E8, 0x7A1C, 0x0EAE, 0x7A1E, 0x0EB3, 0x7A1F, 0x0EB2,

+    0x7A20, 0x0EB0, 0x7A22, 0x24E6, 0x7A26, 0x2765, 0x7A28, 0x2764,

+    0x7A2B, 0x2760, 0x7A2E, 0x1047, 0x7A2F, 0x2763, 0x7A30, 0x2762,

+    0x7A31, 0x1048, 0x7A37, 0x11C7, 0x7A39, 0x29A3, 0x7A3B, 0x11C8,

+    0x7A3C, 0x11C4, 0x7A3D, 0x11C6, 0x7A3F, 0x11C3, 0x7A40, 0x11C5,

+    0x7A44, 0x2BF6, 0x7A46, 0x1312, 0x7A47, 0x2BF8, 0x7A48, 0x2BF7,

+    0x7A4A, 0x2761, 0x7A4B, 0x1314, 0x7A4C, 0x1313, 0x7A4D, 0x1310,

+    0x7A4E, 0x1311, 0x7A54, 0x2DD3, 0x7A56, 0x2DD1, 0x7A57, 0x1426,

+    0x7A58, 0x2DD2, 0x7A5A, 0x2DD4, 0x7A5B, 0x2DD0, 0x7A5C, 0x2DCF,

+    0x7A5F, 0x2F75, 0x7A60, 0x1502, 0x7A61, 0x1500, 0x7A62, 0x1501,

+    0x7A67, 0x30D1, 0x7A68, 0x30D2, 0x7A69, 0x15A2, 0x7A6B, 0x15A1,

+    0x7A6C, 0x320B, 0x7A6D, 0x320C, 0x7A6E, 0x320A, 0x7A70, 0x3399,

+    0x7A71, 0x339A, 0x7A74, 0x036C, 0x7A75, 0x1811, 0x7A76, 0x04FA,

+    0x7A78, 0x1A22, 0x7A79, 0x0665, 0x7A7A, 0x0664, 0x7A7B, 0x1A23,

+    0x7A7E, 0x1BB6, 0x7A7F, 0x07C8, 0x7A80, 0x1BB5, 0x7A81, 0x07C9,

+    0x7A84, 0x0965, 0x7A85, 0x1D86, 0x7A86, 0x1D84, 0x7A87, 0x1D8A,

+    0x7A88, 0x0966, 0x7A89, 0x1D85, 0x7A8A, 0x1D89, 0x7A8B, 0x1D87,

+    0x7A8C, 0x1D88, 0x7A8F, 0x1FCA, 0x7A90, 0x1FCC, 0x7A92, 0x0B46,

+    0x7A94, 0x1FCB, 0x7A95, 0x0B47, 0x7A96, 0x0D00, 0x7A97, 0x0CFF,

+    0x7A98, 0x0CFE, 0x7A99, 0x2250, 0x7A9E, 0x24EC, 0x7A9F, 0x0EB4,

+    0x7AA0, 0x0EB5, 0x7AA2, 0x24EB, 0x7AA3, 0x24EA, 0x7AA8, 0x2766,

+    0x7AA9, 0x104A, 0x7AAA, 0x1049, 0x7AAB, 0x2767, 0x7AAC, 0x2768,

+    0x7AAE, 0x11CA, 0x7AAF, 0x11C9, 0x7AB1, 0x2BFC, 0x7AB2, 0x29A4,

+    0x7AB3, 0x29A6, 0x7AB4, 0x29A5, 0x7AB5, 0x2BFB, 0x7AB6, 0x2BF9,

+    0x7AB7, 0x2BFD, 0x7AB8, 0x2BFA, 0x7ABA, 0x1315, 0x7ABE, 0x2DD5,

+    0x7ABF, 0x1427, 0x7AC0, 0x2DD6, 0x7AC1, 0x2DD7, 0x7AC4, 0x1503,

+    0x7AC5, 0x1504, 0x7AC7, 0x1628, 0x7ACA, 0x16FF, 0x7ACB, 0x036D,

+    0x7AD1, 0x1BB7, 0x7AD8, 0x1D8B, 0x7AD9, 0x0967, 0x7ADF, 0x0BDE,

+    0x7AE0, 0x0BDD, 0x7AE3, 0x0D02, 0x7AE4, 0x2252, 0x7AE5, 0x0D01,

+    0x7AE6, 0x2251, 0x7AEB, 0x24ED, 0x7AED, 0x104B, 0x7AEE, 0x2769,

+    0x7AEF, 0x104C, 0x7AF6, 0x1629, 0x7AF7, 0x320D, 0x7AF9, 0x03F6,

+    0x7AFA, 0x0666, 0x7AFB, 0x1A24, 0x7AFD, 0x07CB, 0x7AFF, 0x07CA,

+    0x7B00, 0x1BB8, 0x7B01, 0x1BB9, 0x7B04, 0x1D8D, 0x7B05, 0x1D8F,

+    0x7B06, 0x0968, 0x7B08, 0x1D91, 0x7B09, 0x1D94, 0x7B0A, 0x1D92,

+    0x7B0E, 0x1D93, 0x7B0F, 0x1D90, 0x7B10, 0x1D8C, 0x7B11, 0x0969,

+    0x7B12, 0x1D95, 0x7B13, 0x1D8E, 0x7B18, 0x1FD5, 0x7B19, 0x0B4D,

+    0x7B1A, 0x1FDE, 0x7B1B, 0x0B4A, 0x7B1D, 0x1FD7, 0x7B1E, 0x0B4E,

+    0x7B20, 0x0B48, 0x7B22, 0x1FD2, 0x7B23, 0x1FDF, 0x7B24, 0x1FD3,

+    0x7B25, 0x1FD0, 0x7B26, 0x0B4C, 0x7B28, 0x0B49, 0x7B2A, 0x1FD6,

+    0x7B2B, 0x1FD9, 0x7B2C, 0x0B4B, 0x7B2D, 0x1FDA, 0x7B2E, 0x0B4F,

+    0x7B2F, 0x1FDB, 0x7B30, 0x1FD1, 0x7B31, 0x1FD8, 0x7B32, 0x1FDC,

+    0x7B33, 0x1FD4, 0x7B34, 0x1FCF, 0x7B35, 0x1FCD, 0x7B38, 0x1FDD,

+    0x7B3B, 0x1FCE, 0x7B40, 0x2259, 0x7B44, 0x2255, 0x7B45, 0x225B,

+    0x7B46, 0x0D05, 0x7B47, 0x2254, 0x7B48, 0x2256, 0x7B49, 0x0D03,

+    0x7B4A, 0x2253, 0x7B4B, 0x0D0A, 0x7B4C, 0x2257, 0x7B4D, 0x0D09,

+    0x7B4E, 0x2258, 0x7B4F, 0x0D0B, 0x7B50, 0x0D06, 0x7B51, 0x0D0C,

+    0x7B52, 0x0D07, 0x7B54, 0x0D08, 0x7B56, 0x0D04, 0x7B58, 0x225A,

+    0x7B60, 0x0EB8, 0x7B61, 0x24F8, 0x7B63, 0x24FB, 0x7B64, 0x24EF,

+    0x7B65, 0x24F4, 0x7B66, 0x24EE, 0x7B67, 0x0EBA, 0x7B69, 0x24F2,

+    0x7B6D, 0x24F0, 0x7B6E, 0x0EB9, 0x7B70, 0x24F7, 0x7B71, 0x24F6,

+    0x7B72, 0x24F3, 0x7B73, 0x24F5, 0x7B74, 0x24F1, 0x7B75, 0x1050,

+    0x7B76, 0x24FA, 0x7B77, 0x0EB6, 0x7B78, 0x24F9, 0x7B82, 0x2779,

+    0x7B84, 0x1057, 0x7B85, 0x2774, 0x7B87, 0x1056, 0x7B88, 0x276A,

+    0x7B8A, 0x276C, 0x7B8B, 0x104F, 0x7B8C, 0x2771, 0x7B8D, 0x2770,

+    0x7B8E, 0x2773, 0x7B8F, 0x1054, 0x7B90, 0x276E, 0x7B91, 0x276D,

+    0x7B94, 0x1053, 0x7B95, 0x104E, 0x7B96, 0x276F, 0x7B97, 0x1051,

+    0x7B98, 0x2775, 0x7B99, 0x2777, 0x7B9B, 0x2772, 0x7B9C, 0x276B,

+    0x7B9D, 0x1052, 0x7BA0, 0x11D2, 0x7BA1, 0x104D, 0x7BA4, 0x2778,

+    0x7BAC, 0x29AA, 0x7BAD, 0x11CB, 0x7BAF, 0x29AC, 0x7BB1, 0x11CC,

+    0x7BB4, 0x11CE, 0x7BB5, 0x29AF, 0x7BB7, 0x29A7, 0x7BB8, 0x1055,

+    0x7BB9, 0x29AD, 0x7BBE, 0x29A9, 0x7BC0, 0x0EB7, 0x7BC1, 0x11D1,

+    0x7BC4, 0x11CD, 0x7BC6, 0x11CF, 0x7BC7, 0x11D0, 0x7BC9, 0x1318,

+    0x7BCA, 0x29AE, 0x7BCB, 0x29A8, 0x7BCC, 0x11D3, 0x7BCE, 0x29AB,

+    0x7BD4, 0x2C07, 0x7BD5, 0x2C02, 0x7BD8, 0x2C0C, 0x7BD9, 0x1316,

+    0x7BDA, 0x2C04, 0x7BDB, 0x131A, 0x7BDC, 0x2C0A, 0x7BDD, 0x2C01,

+    0x7BDE, 0x2BFE, 0x7BDF, 0x2C0D, 0x7BE0, 0x142D, 0x7BE1, 0x131B,

+    0x7BE2, 0x2C09, 0x7BE3, 0x2BFF, 0x7BE4, 0x1319, 0x7BE5, 0x2C03,

+    0x7BE6, 0x131D, 0x7BE7, 0x2C00, 0x7BE8, 0x2C05, 0x7BE9, 0x131C,

+    0x7BEA, 0x2C08, 0x7BEB, 0x2C0B, 0x7BF0, 0x2DE9, 0x7BF1, 0x2DEA,

+    0x7BF2, 0x2DDA, 0x7BF3, 0x2DE1, 0x7BF4, 0x2DDF, 0x7BF7, 0x142B,

+    0x7BF8, 0x2DE6, 0x7BF9, 0x2C06, 0x7BFB, 0x2DDD, 0x7BFD, 0x2DE7,

+    0x7BFE, 0x142A, 0x7BFF, 0x2DDC, 0x7C00, 0x2DDB, 0x7C01, 0x2DE5,

+    0x7C02, 0x2DE2, 0x7C03, 0x2DE4, 0x7C05, 0x2DD8, 0x7C06, 0x2DE8,

+    0x7C07, 0x1428, 0x7C09, 0x2DE3, 0x7C0A, 0x2DEC, 0x7C0B, 0x2DE0,

+    0x7C0C, 0x142C, 0x7C0D, 0x1429, 0x7C0E, 0x2DDE, 0x7C0F, 0x2DD9,

+    0x7C10, 0x2DEB, 0x7C11, 0x1317, 0x7C19, 0x2F78, 0x7C1C, 0x2F76,

+    0x7C1D, 0x2F7C, 0x7C1E, 0x1508, 0x7C1F, 0x2F7A, 0x7C20, 0x2F79,

+    0x7C21, 0x150A, 0x7C22, 0x2F7F, 0x7C23, 0x1509, 0x7C25, 0x2F80,

+    0x7C26, 0x2F7D, 0x7C27, 0x1506, 0x7C28, 0x2F7E, 0x7C29, 0x2F77,

+    0x7C2A, 0x1507, 0x7C2B, 0x1505, 0x7C2C, 0x30D6, 0x7C2D, 0x2F7B,

+    0x7C30, 0x2F81, 0x7C33, 0x30D3, 0x7C37, 0x15A7, 0x7C38, 0x15A5,

+    0x7C39, 0x30D5, 0x7C3B, 0x30D7, 0x7C3C, 0x30D4, 0x7C3D, 0x15A6,

+    0x7C3E, 0x15A3, 0x7C3F, 0x15A4, 0x7C40, 0x15A8, 0x7C43, 0x162B,

+    0x7C45, 0x3212, 0x7C47, 0x3211, 0x7C48, 0x320F, 0x7C49, 0x320E,

+    0x7C4A, 0x3210, 0x7C4C, 0x162A, 0x7C4D, 0x162C, 0x7C50, 0x1681,

+    0x7C53, 0x32EA, 0x7C54, 0x32E9, 0x7C57, 0x339B, 0x7C59, 0x339D,

+    0x7C5A, 0x339F, 0x7C5B, 0x339E, 0x7C5C, 0x339C, 0x7C5F, 0x16D1,

+    0x7C60, 0x16D0, 0x7C63, 0x1701, 0x7C64, 0x1700, 0x7C65, 0x1702,

+    0x7C66, 0x342B, 0x7C67, 0x342A, 0x7C69, 0x34D6, 0x7C6A, 0x3493,

+    0x7C6B, 0x34D7, 0x7C6C, 0x1745, 0x7C6E, 0x1746, 0x7C6F, 0x3507,

+    0x7C72, 0x176B, 0x7C73, 0x03F7, 0x7C75, 0x1A25, 0x7C78, 0x1BBB,

+    0x7C79, 0x1BBC, 0x7C7A, 0x1BBA, 0x7C7D, 0x07CC, 0x7C7F, 0x1BBD,

+    0x7C80, 0x1BBE, 0x7C81, 0x1BBF, 0x7C84, 0x1D96, 0x7C85, 0x1D9C,

+    0x7C88, 0x1D9A, 0x7C89, 0x096A, 0x7C8A, 0x1D98, 0x7C8C, 0x1D99,

+    0x7C8D, 0x1D9B, 0x7C91, 0x1D97, 0x7C92, 0x0B50, 0x7C94, 0x1FE0,

+    0x7C95, 0x0B52, 0x7C96, 0x1FE2, 0x7C97, 0x0B51, 0x7C98, 0x1FE1,

+    0x7C9E, 0x225D, 0x7C9F, 0x0D0D, 0x7CA1, 0x225F, 0x7CA2, 0x225C,

+    0x7CA3, 0x1FE3, 0x7CA5, 0x0D0E, 0x7CA7, 0x36ED, 0x7CA8, 0x225E,

+    0x7CAF, 0x24FE, 0x7CB1, 0x0EBB, 0x7CB2, 0x24FC, 0x7CB3, 0x0EBC,

+    0x7CB4, 0x24FD, 0x7CB5, 0x0EBD, 0x7CB9, 0x1058, 0x7CBA, 0x277D,

+    0x7CBB, 0x277A, 0x7CBC, 0x277C, 0x7CBD, 0x1059, 0x7CBE, 0x105A,

+    0x7CBF, 0x277B, 0x7CC5, 0x29B0, 0x7CC8, 0x29B1, 0x7CCA, 0x11D4,

+    0x7CCB, 0x29B3, 0x7CCC, 0x29B2, 0x7CCE, 0x0121, 0x7CD0, 0x2C11,

+    0x7CD1, 0x2C12, 0x7CD2, 0x2C0E, 0x7CD4, 0x2C0F, 0x7CD5, 0x131E,

+    0x7CD6, 0x131F, 0x7CD7, 0x2C10, 0x7CD9, 0x1433, 0x7CDC, 0x142F,

+    0x7CDD, 0x1434, 0x7CDE, 0x1430, 0x7CDF, 0x1432, 0x7CE0, 0x142E,

+    0x7CE2, 0x1431, 0x7CE7, 0x150B, 0x7CE8, 0x2DED, 0x7CEA, 0x30D9,

+    0x7CEC, 0x30D8, 0x7CEE, 0x3213, 0x7CEF, 0x162D, 0x7CF0, 0x162E,

+    0x7CF1, 0x33A1, 0x7CF2, 0x32EB, 0x7CF4, 0x33A0, 0x7CF6, 0x34D8,

+    0x7CF7, 0x351D, 0x7CF8, 0x03F8, 0x7CFB, 0x04FB, 0x7CFD, 0x1A26,

+    0x7CFE, 0x0667, 0x7D00, 0x07CF, 0x7D01, 0x1BC2, 0x7D02, 0x07CD,

+    0x7D03, 0x1BC0, 0x7D04, 0x07D2, 0x7D05, 0x07CE, 0x7D06, 0x07D3,

+    0x7D07, 0x07D1, 0x7D08, 0x1BC1, 0x7D09, 0x07D0, 0x7D0A, 0x096E,

+    0x7D0B, 0x096D, 0x7D0C, 0x1DA7, 0x7D0D, 0x0976, 0x7D0E, 0x1DA0,

+    0x7D0F, 0x1DA6, 0x7D10, 0x0972, 0x7D11, 0x1D9F, 0x7D12, 0x1DA5,

+    0x7D13, 0x1DA3, 0x7D14, 0x0971, 0x7D15, 0x0973, 0x7D16, 0x1DA2,

+    0x7D17, 0x096C, 0x7D18, 0x1DA1, 0x7D19, 0x0977, 0x7D1A, 0x0974,

+    0x7D1B, 0x0978, 0x7D1C, 0x0975, 0x7D1D, 0x1D9E, 0x7D1E, 0x1D9D,

+    0x7D1F, 0x1DA4, 0x7D20, 0x096F, 0x7D21, 0x096B, 0x7D22, 0x0970,

+    0x7D28, 0x1FF2, 0x7D29, 0x1FEB, 0x7D2B, 0x0D13, 0x7D2C, 0x1FEA,

+    0x7D2E, 0x0B56, 0x7D2F, 0x0B5D, 0x7D30, 0x0B5A, 0x7D31, 0x0B60,

+    0x7D32, 0x0B5F, 0x7D33, 0x0B5B, 0x7D35, 0x1FE4, 0x7D36, 0x1FE7,

+    0x7D38, 0x1FE6, 0x7D39, 0x0B57, 0x7D3A, 0x1FE8, 0x7D3B, 0x1FF1,

+    0x7D3C, 0x0B58, 0x7D3D, 0x1FE5, 0x7D3E, 0x1FEE, 0x7D3F, 0x1FEF,

+    0x7D40, 0x0B59, 0x7D41, 0x1FEC, 0x7D42, 0x0B5E, 0x7D43, 0x0B54,

+    0x7D44, 0x0B5C, 0x7D45, 0x1FE9, 0x7D46, 0x0B53, 0x7D47, 0x1FED,

+    0x7D4A, 0x1FF0, 0x7D4E, 0x2270, 0x7D4F, 0x2267, 0x7D50, 0x0D10,

+    0x7D51, 0x226E, 0x7D52, 0x226B, 0x7D53, 0x2263, 0x7D54, 0x226C,

+    0x7D55, 0x0D12, 0x7D56, 0x2264, 0x7D58, 0x2260, 0x7D5B, 0x0EC3,

+    0x7D5C, 0x2269, 0x7D5E, 0x0D0F, 0x7D5F, 0x226F, 0x7D61, 0x0D16,

+    0x7D62, 0x0D18, 0x7D63, 0x2262, 0x7D66, 0x0D17, 0x7D67, 0x2265,

+    0x7D68, 0x0D11, 0x7D69, 0x226D, 0x7D6A, 0x2266, 0x7D6B, 0x226A,

+    0x7D6D, 0x2268, 0x7D6E, 0x0D14, 0x7D6F, 0x2261, 0x7D70, 0x0D19,

+    0x7D71, 0x0B55, 0x7D72, 0x0D15, 0x7D73, 0x0D1A, 0x7D79, 0x0EBF,

+    0x7D7A, 0x2505, 0x7D7B, 0x2507, 0x7D7C, 0x2509, 0x7D7D, 0x250D,

+    0x7D7F, 0x2503, 0x7D80, 0x2501, 0x7D81, 0x0EC1, 0x7D83, 0x2508,

+    0x7D84, 0x250C, 0x7D85, 0x2504, 0x7D86, 0x2500, 0x7D88, 0x24FF,

+    0x7D8C, 0x250A, 0x7D8D, 0x2502, 0x7D8E, 0x2506, 0x7D8F, 0x0EC2,

+    0x7D91, 0x0EC0, 0x7D92, 0x250E, 0x7D93, 0x0EBE, 0x7D94, 0x250B,

+    0x7D96, 0x278E, 0x7D9C, 0x105D, 0x7D9D, 0x2786, 0x7D9E, 0x11E1,

+    0x7D9F, 0x2790, 0x7DA0, 0x1060, 0x7DA1, 0x2794, 0x7DA2, 0x1066,

+    0x7DA3, 0x2781, 0x7DA6, 0x2791, 0x7DA7, 0x277E, 0x7DA9, 0x2793,

+    0x7DAA, 0x2782, 0x7DAC, 0x106D, 0x7DAD, 0x106A, 0x7DAE, 0x2792,

+    0x7DAF, 0x278C, 0x7DB0, 0x105C, 0x7DB1, 0x1064, 0x7DB2, 0x1063,

+    0x7DB4, 0x1062, 0x7DB5, 0x1068, 0x7DB7, 0x277F, 0x7DB8, 0x1069,

+    0x7DB9, 0x278D, 0x7DBA, 0x1065, 0x7DBB, 0x105B, 0x7DBC, 0x278F,

+    0x7DBD, 0x105E, 0x7DBE, 0x105F, 0x7DBF, 0x1067, 0x7DC0, 0x2784,

+    0x7DC1, 0x2783, 0x7DC2, 0x2780, 0x7DC4, 0x2788, 0x7DC5, 0x2785,

+    0x7DC6, 0x2789, 0x7DC7, 0x106C, 0x7DC9, 0x2795, 0x7DCA, 0x1061,

+    0x7DCB, 0x278A, 0x7DCC, 0x278B, 0x7DCE, 0x2787, 0x7DD2, 0x106B,

+    0x7DD7, 0x29B8, 0x7DD8, 0x11D9, 0x7DD9, 0x11E2, 0x7DDA, 0x11DE,

+    0x7DDB, 0x29B5, 0x7DDD, 0x11DB, 0x7DDE, 0x11DF, 0x7DDF, 0x29C1,

+    0x7DE0, 0x11D5, 0x7DE1, 0x29B9, 0x7DE3, 0x11DD, 0x7DE6, 0x29BC,

+    0x7DE7, 0x29B7, 0x7DE8, 0x11DC, 0x7DE9, 0x11E0, 0x7DEA, 0x29B6,

+    0x7DEC, 0x11DA, 0x7DEE, 0x29C0, 0x7DEF, 0x11D7, 0x7DF0, 0x29BF,

+    0x7DF1, 0x29BE, 0x7DF2, 0x11E3, 0x7DF3, 0x28C8, 0x7DF4, 0x11D6,

+    0x7DF6, 0x29BD, 0x7DF7, 0x29B4, 0x7DF9, 0x11E4, 0x7DFA, 0x29BB,

+    0x7DFB, 0x11D8, 0x7E03, 0x29BA, 0x7E08, 0x1322, 0x7E09, 0x1327,

+    0x7E0A, 0x1320, 0x7E0B, 0x2C1F, 0x7E0C, 0x2C16, 0x7E0D, 0x2C22,

+    0x7E0E, 0x2C1A, 0x7E0F, 0x2C20, 0x7E10, 0x1328, 0x7E11, 0x1321,

+    0x7E12, 0x2C13, 0x7E13, 0x2C19, 0x7E14, 0x2C23, 0x7E15, 0x2C1C,

+    0x7E16, 0x2C21, 0x7E17, 0x2C15, 0x7E1A, 0x2C1D, 0x7E1B, 0x1323,

+    0x7E1C, 0x2C1B, 0x7E1D, 0x1326, 0x7E1E, 0x1325, 0x7E1F, 0x2C17,

+    0x7E20, 0x2C18, 0x7E21, 0x2C14, 0x7E22, 0x2C1E, 0x7E23, 0x1324,

+    0x7E24, 0x2C25, 0x7E25, 0x2C24, 0x7E29, 0x2DF8, 0x7E2A, 0x2DF4,

+    0x7E2B, 0x143B, 0x7E2D, 0x2DEE, 0x7E2E, 0x1435, 0x7E2F, 0x1445,

+    0x7E30, 0x2DFA, 0x7E31, 0x143D, 0x7E32, 0x1439, 0x7E33, 0x2DF1,

+    0x7E34, 0x1440, 0x7E35, 0x1443, 0x7E36, 0x2DFC, 0x7E37, 0x1438,

+    0x7E38, 0x2DF3, 0x7E39, 0x1441, 0x7E3A, 0x2DFE, 0x7E3B, 0x2DFB,

+    0x7E3C, 0x2DEF, 0x7E3D, 0x143C, 0x7E3E, 0x1436, 0x7E3F, 0x1444,

+    0x7E40, 0x2DF6, 0x7E41, 0x143F, 0x7E42, 0x2DF0, 0x7E43, 0x143A,

+    0x7E44, 0x2DFD, 0x7E45, 0x143E, 0x7E46, 0x1437, 0x7E47, 0x2DF7,

+    0x7E48, 0x1442, 0x7E49, 0x2DF5, 0x7E4C, 0x2DF9, 0x7E50, 0x2F83,

+    0x7E51, 0x2F89, 0x7E52, 0x1511, 0x7E53, 0x2F8C, 0x7E54, 0x150C,

+    0x7E55, 0x150D, 0x7E56, 0x2F84, 0x7E57, 0x2F8B, 0x7E58, 0x2F86,

+    0x7E59, 0x1512, 0x7E5A, 0x150F, 0x7E5C, 0x2F82, 0x7E5E, 0x150E,

+    0x7E5F, 0x2F88, 0x7E60, 0x2F8A, 0x7E61, 0x1510, 0x7E62, 0x2F87,

+    0x7E63, 0x2F85, 0x7E68, 0x30E3, 0x7E69, 0x15AC, 0x7E6A, 0x15AD,

+    0x7E6B, 0x15A9, 0x7E6D, 0x15AA, 0x7E6F, 0x30DF, 0x7E70, 0x30DD,

+    0x7E72, 0x30E1, 0x7E73, 0x15AE, 0x7E74, 0x30E2, 0x7E75, 0x30DB,

+    0x7E76, 0x30DA, 0x7E77, 0x30DE, 0x7E78, 0x30DC, 0x7E79, 0x15AB,

+    0x7E7A, 0x30E0, 0x7E7B, 0x3214, 0x7E7C, 0x1631, 0x7E7D, 0x1630,

+    0x7E7E, 0x3215, 0x7E80, 0x3217, 0x7E81, 0x3216, 0x7E82, 0x1632,

+    0x7E86, 0x32F0, 0x7E87, 0x32ED, 0x7E88, 0x32EE, 0x7E8A, 0x32EC,

+    0x7E8B, 0x32EF, 0x7E8C, 0x1683, 0x7E8D, 0x32F1, 0x7E8F, 0x1682,

+    0x7E91, 0x33A2, 0x7E93, 0x1703, 0x7E94, 0x1705, 0x7E95, 0x342C,

+    0x7E96, 0x1704, 0x7E97, 0x3494, 0x7E98, 0x34DA, 0x7E99, 0x34DC,

+    0x7E9A, 0x34D9, 0x7E9B, 0x34DB, 0x7E9C, 0x1759, 0x7F36, 0x03F9,

+    0x7F38, 0x07D4, 0x7F39, 0x1D1F, 0x7F3A, 0x0979, 0x7F3D, 0x0B61,

+    0x7F3E, 0x2271, 0x7F3F, 0x2272, 0x7F43, 0x2C26, 0x7F44, 0x1446,

+    0x7F45, 0x2DFF, 0x7F48, 0x1513, 0x7F4A, 0x30E5, 0x7F4B, 0x30E4,

+    0x7F4C, 0x1633, 0x7F4D, 0x32F2, 0x7F4F, 0x33A3, 0x7F50, 0x1726,

+    0x7F51, 0x1812, 0x7F54, 0x0668, 0x7F55, 0x04FC, 0x7F58, 0x1BC3,

+    0x7F5B, 0x1DAD, 0x7F5C, 0x1DA8, 0x7F5D, 0x1DAC, 0x7F5E, 0x1DAA,

+    0x7F5F, 0x097A, 0x7F60, 0x1DAB, 0x7F61, 0x1DA9, 0x7F63, 0x1FF3,

+    0x7F65, 0x2273, 0x7F66, 0x2274, 0x7F67, 0x2511, 0x7F68, 0x2512,

+    0x7F69, 0x0EC5, 0x7F6A, 0x0EC6, 0x7F6B, 0x2510, 0x7F6C, 0x2513,

+    0x7F6D, 0x250F, 0x7F6E, 0x0EC4, 0x7F70, 0x106E, 0x7F72, 0x0EC7,

+    0x7F73, 0x2796, 0x7F75, 0x11E5, 0x7F76, 0x29C2, 0x7F77, 0x11E6,

+    0x7F79, 0x1329, 0x7F7A, 0x2C29, 0x7F7B, 0x2C27, 0x7F7C, 0x2C28,

+    0x7F7D, 0x2E02, 0x7F7E, 0x2E01, 0x7F7F, 0x2E00, 0x7F83, 0x30E6,

+    0x7F85, 0x15AF, 0x7F86, 0x30E7, 0x7F87, 0x33A4, 0x7F88, 0x1727,

+    0x7F89, 0x3495, 0x7F8A, 0x03FA, 0x7F8B, 0x066A, 0x7F8C, 0x0669,

+    0x7F8D, 0x1BC5, 0x7F8E, 0x07D5, 0x7F91, 0x1BC4, 0x7F92, 0x1DAF,

+    0x7F94, 0x097B, 0x7F95, 0x1FF4, 0x7F96, 0x1DAE, 0x7F9A, 0x0B63,

+    0x7F9B, 0x1FF7, 0x7F9C, 0x1FF5, 0x7F9D, 0x1FF6, 0x7F9E, 0x0B62,

+    0x7FA0, 0x2276, 0x7FA1, 0x2277, 0x7FA2, 0x2275, 0x7FA4, 0x0ECA,

+    0x7FA5, 0x2515, 0x7FA6, 0x2514, 0x7FA7, 0x2516, 0x7FA8, 0x0EC9,

+    0x7FA9, 0x0EC8, 0x7FAC, 0x29C3, 0x7FAD, 0x29C5, 0x7FAF, 0x11E7,

+    0x7FB0, 0x29C4, 0x7FB1, 0x2C2A, 0x7FB2, 0x132A, 0x7FB3, 0x2F8E,

+    0x7FB5, 0x2F8D, 0x7FB6, 0x15B0, 0x7FB7, 0x30E8, 0x7FB8, 0x15B2,

+    0x7FB9, 0x15B1, 0x7FBA, 0x3218, 0x7FBB, 0x32F3, 0x7FBC, 0x1684,

+    0x7FBD, 0x03FB, 0x7FBE, 0x1BC6, 0x7FBF, 0x07D6, 0x7FC0, 0x1DB2,

+    0x7FC1, 0x097D, 0x7FC2, 0x1DB1, 0x7FC3, 0x1DB0, 0x7FC5, 0x097C,

+    0x7FC7, 0x1FFD, 0x7FC9, 0x1FFF, 0x7FCA, 0x1FF8, 0x7FCB, 0x1FF9,

+    0x7FCC, 0x0B64, 0x7FCD, 0x1FFA, 0x7FCE, 0x0B65, 0x7FCF, 0x1FFE,

+    0x7FD0, 0x1FFB, 0x7FD1, 0x1FFC, 0x7FD2, 0x0B66, 0x7FD4, 0x0D1C,

+    0x7FD5, 0x0D1D, 0x7FD7, 0x2278, 0x7FDB, 0x2517, 0x7FDC, 0x2518,

+    0x7FDE, 0x279A, 0x7FDF, 0x1071, 0x7FE0, 0x106F, 0x7FE1, 0x1070,

+    0x7FE2, 0x2797, 0x7FE3, 0x2798, 0x7FE5, 0x2799, 0x7FE6, 0x29CA,

+    0x7FE8, 0x29CB, 0x7FE9, 0x11E8, 0x7FEA, 0x29C8, 0x7FEB, 0x29C7,

+    0x7FEC, 0x29C9, 0x7FED, 0x29C6, 0x7FEE, 0x132D, 0x7FEF, 0x2C2B,

+    0x7FF0, 0x132B, 0x7FF1, 0x132C, 0x7FF2, 0x2E04, 0x7FF3, 0x1447,

+    0x7FF4, 0x2E03, 0x7FF5, 0x2EFF, 0x7FF7, 0x2F8F, 0x7FF8, 0x2F90,

+    0x7FF9, 0x1514, 0x7FFB, 0x1515, 0x7FFC, 0x1448, 0x7FFD, 0x30E9,

+    0x7FFE, 0x30EA, 0x7FFF, 0x3219, 0x8000, 0x1634, 0x8001, 0x03FC,

+    0x8003, 0x03FD, 0x8004, 0x097F, 0x8005, 0x066B, 0x8006, 0x097E,

+    0x8007, 0x1BC7, 0x800B, 0x0D1E, 0x800C, 0x03FE, 0x800D, 0x07D8,

+    0x800E, 0x1BC8, 0x800F, 0x1BC9, 0x8010, 0x07D7, 0x8011, 0x07D9,

+    0x8012, 0x03FF, 0x8014, 0x1BCA, 0x8015, 0x0981, 0x8016, 0x1DB3,

+    0x8017, 0x0983, 0x8018, 0x0980, 0x8019, 0x0982, 0x801B, 0x2002,

+    0x801C, 0x0B67, 0x801E, 0x2001, 0x801F, 0x2000, 0x8021, 0x2519,

+    0x8024, 0x279B, 0x8026, 0x11E9, 0x8028, 0x132E, 0x8029, 0x2C2D,

+    0x802A, 0x2C2C, 0x802C, 0x2E05, 0x8030, 0x32F4, 0x8033, 0x0400,

+    0x8034, 0x18D8, 0x8035, 0x1A27, 0x8036, 0x07DA, 0x8037, 0x1BCB,

+    0x8039, 0x1DB5, 0x803D, 0x0984, 0x803E, 0x1DB4, 0x803F, 0x0985,

+    0x8043, 0x2004, 0x8046, 0x0B69, 0x8047, 0x2003, 0x8048, 0x2005,

+    0x804A, 0x0B68, 0x804F, 0x227A, 0x8050, 0x227B, 0x8051, 0x2279,

+    0x8052, 0x0D1F, 0x8056, 0x0ECB, 0x8058, 0x0ECC, 0x805A, 0x1073,

+    0x805C, 0x279D, 0x805D, 0x279C, 0x805E, 0x1072, 0x8064, 0x29CC,

+    0x8067, 0x29CD, 0x806C, 0x2C2E, 0x806F, 0x144C, 0x8070, 0x144B,

+    0x8071, 0x1449, 0x8072, 0x144A, 0x8073, 0x144D, 0x8075, 0x2F91,

+    0x8076, 0x1517, 0x8077, 0x1516, 0x8078, 0x30EB, 0x8079, 0x321A,

+    0x807D, 0x16D3, 0x807E, 0x16D2, 0x807F, 0x0401, 0x8082, 0x1CEC,

+    0x8084, 0x0ECE, 0x8085, 0x0D20, 0x8086, 0x0ECD, 0x8087, 0x1074,

+    0x8089, 0x0402, 0x808A, 0x17B3, 0x808B, 0x0403, 0x808C, 0x0404,

+    0x808F, 0x1A28, 0x8090, 0x18DB, 0x8092, 0x18DC, 0x8093, 0x04FE,

+    0x8095, 0x18D9, 0x8096, 0x04FD, 0x8098, 0x0500, 0x8099, 0x18DA,

+    0x809A, 0x0502, 0x809B, 0x0501, 0x809C, 0x18DD, 0x809D, 0x04FF,

+    0x80A1, 0x0670, 0x80A2, 0x066E, 0x80A3, 0x1A2A, 0x80A5, 0x066D,

+    0x80A9, 0x0672, 0x80AA, 0x0674, 0x80AB, 0x0671, 0x80AD, 0x1A2D,

+    0x80AE, 0x1A29, 0x80AF, 0x0675, 0x80B1, 0x066F, 0x80B2, 0x0503,

+    0x80B4, 0x0673, 0x80B5, 0x1A2C, 0x80B8, 0x1A2B, 0x80BA, 0x066C,

+    0x80C2, 0x1BD1, 0x80C3, 0x07DE, 0x80C4, 0x07DF, 0x80C5, 0x1BD3,

+    0x80C7, 0x1BCD, 0x80C8, 0x1BD0, 0x80C9, 0x1BD9, 0x80CA, 0x1BD7,

+    0x80CC, 0x07E0, 0x80CD, 0x1BDD, 0x80CE, 0x07E3, 0x80CF, 0x1BDA,

+    0x80D0, 0x1BD2, 0x80D1, 0x1BCF, 0x80D4, 0x227D, 0x80D5, 0x1BD8,

+    0x80D6, 0x07DB, 0x80D7, 0x1BDB, 0x80D8, 0x1BCC, 0x80D9, 0x1BD5,

+    0x80DA, 0x07DD, 0x80DB, 0x07E2, 0x80DC, 0x1BD6, 0x80DD, 0x07E6,

+    0x80DE, 0x07E4, 0x80E0, 0x1BCE, 0x80E1, 0x07E1, 0x80E3, 0x1BD4,

+    0x80E4, 0x07E5, 0x80E5, 0x07DC, 0x80E6, 0x1BDC, 0x80ED, 0x098A,

+    0x80EF, 0x0993, 0x80F0, 0x0988, 0x80F1, 0x0986, 0x80F2, 0x1DB7,

+    0x80F3, 0x098E, 0x80F4, 0x098B, 0x80F5, 0x1DB9, 0x80F8, 0x098D,

+    0x80F9, 0x1DB8, 0x80FA, 0x1DB6, 0x80FB, 0x1DBB, 0x80FC, 0x0992,

+    0x80FD, 0x0990, 0x80FE, 0x227C, 0x8100, 0x1DBC, 0x8101, 0x1DBA,

+    0x8102, 0x0987, 0x8105, 0x0989, 0x8106, 0x098C, 0x8108, 0x098F,

+    0x810A, 0x0991, 0x8115, 0x200F, 0x8116, 0x0B6B, 0x8118, 0x2006,

+    0x8119, 0x2008, 0x811B, 0x2009, 0x811D, 0x2011, 0x811E, 0x200D,

+    0x811F, 0x200B, 0x8121, 0x200E, 0x8122, 0x2012, 0x8123, 0x0B6C,

+    0x8124, 0x0B70, 0x8125, 0x2007, 0x8127, 0x2010, 0x8129, 0x0B6E,

+    0x812B, 0x0B6D, 0x812C, 0x200C, 0x812D, 0x200A, 0x812F, 0x0B6A,

+    0x8130, 0x0B6F, 0x8139, 0x0D26, 0x813A, 0x2285, 0x813D, 0x2283,

+    0x813E, 0x0D28, 0x8143, 0x227E, 0x8144, 0x2527, 0x8146, 0x0D27,

+    0x8147, 0x2282, 0x814A, 0x227F, 0x814B, 0x0D23, 0x814C, 0x0D29,

+    0x814D, 0x2284, 0x814E, 0x0D25, 0x814F, 0x2281, 0x8150, 0x1075,

+    0x8151, 0x0D24, 0x8152, 0x2280, 0x8153, 0x0D2A, 0x8154, 0x0D22,

+    0x8155, 0x0D21, 0x815B, 0x251F, 0x815C, 0x251D, 0x815E, 0x2523,

+    0x8160, 0x251B, 0x8161, 0x2528, 0x8162, 0x2520, 0x8164, 0x251A,

+    0x8165, 0x0ED2, 0x8166, 0x0ED8, 0x8167, 0x2525, 0x8169, 0x251E,

+    0x816B, 0x0ED5, 0x816E, 0x0ED3, 0x816F, 0x2526, 0x8170, 0x0ED0,

+    0x8171, 0x0ECF, 0x8172, 0x2521, 0x8173, 0x0ED4, 0x8174, 0x0D2B,

+    0x8176, 0x2524, 0x8177, 0x251C, 0x8178, 0x0ED1, 0x8179, 0x0ED6,

+    0x817A, 0x0ED7, 0x817F, 0x107A, 0x8180, 0x1076, 0x8182, 0x107B,

+    0x8183, 0x27A0, 0x8186, 0x279F, 0x8187, 0x27A1, 0x8188, 0x1078,

+    0x8189, 0x279E, 0x818A, 0x1079, 0x818B, 0x27A4, 0x818C, 0x27A3,

+    0x818D, 0x27A2, 0x818F, 0x1077, 0x8195, 0x29D1, 0x8197, 0x29D4,

+    0x8198, 0x11EF, 0x8199, 0x29D3, 0x819A, 0x11EE, 0x819B, 0x11EA,

+    0x819C, 0x11EB, 0x819D, 0x11EC, 0x819E, 0x29D0, 0x819F, 0x29CF,

+    0x81A0, 0x11ED, 0x81A2, 0x29D2, 0x81A3, 0x29CE, 0x81A6, 0x2C30,

+    0x81A7, 0x2C3A, 0x81A8, 0x1331, 0x81A9, 0x1330, 0x81AB, 0x2C34,

+    0x81AC, 0x2C36, 0x81AE, 0x2C31, 0x81B0, 0x2C35, 0x81B1, 0x2C2F,

+    0x81B2, 0x2C38, 0x81B3, 0x132F, 0x81B4, 0x2C37, 0x81B5, 0x2C33,

+    0x81B7, 0x2C39, 0x81B9, 0x2C32, 0x81BA, 0x1450, 0x81BB, 0x2E06,

+    0x81BC, 0x2E0C, 0x81BD, 0x1454, 0x81BE, 0x1456, 0x81BF, 0x1453,

+    0x81C0, 0x1452, 0x81C2, 0x1451, 0x81C3, 0x144F, 0x81C4, 0x2E07,

+    0x81C5, 0x2E0A, 0x81C6, 0x144E, 0x81C7, 0x2E0B, 0x81C9, 0x1455,

+    0x81CA, 0x2E09, 0x81CC, 0x2E08, 0x81CD, 0x1518, 0x81CF, 0x1519,

+    0x81D0, 0x2F94, 0x81D1, 0x2F92, 0x81D2, 0x2F93, 0x81D5, 0x30ED,

+    0x81D7, 0x30EC, 0x81D8, 0x15B3, 0x81D9, 0x321C, 0x81DA, 0x1635,

+    0x81DB, 0x321B, 0x81DD, 0x32F5, 0x81DE, 0x33A5, 0x81DF, 0x16D4,

+    0x81E0, 0x34DD, 0x81E1, 0x34DE, 0x81E2, 0x1706, 0x81E3, 0x0405,

+    0x81E5, 0x0676, 0x81E6, 0x2286, 0x81E7, 0x107C, 0x81E8, 0x1457,

+    0x81E9, 0x2E0D, 0x81EA, 0x0406, 0x81EC, 0x0995, 0x81ED, 0x0994,

+    0x81EE, 0x2287, 0x81F2, 0x2C3B, 0x81F3, 0x0407, 0x81F4, 0x07E7,

+    0x81F7, 0x2288, 0x81F8, 0x2289, 0x81F9, 0x228A, 0x81FA, 0x107D,

+    0x81FB, 0x1332, 0x81FC, 0x0408, 0x81FE, 0x0677, 0x81FF, 0x1BDE,

+    0x8200, 0x0996, 0x8201, 0x1DBD, 0x8202, 0x0B71, 0x8204, 0x228B,

+    0x8205, 0x0ED9, 0x8207, 0x107E, 0x8208, 0x1333, 0x8209, 0x1458,

+    0x820A, 0x151A, 0x820B, 0x30EE, 0x820C, 0x0409, 0x820D, 0x0678,

+    0x8210, 0x0997, 0x8211, 0x2013, 0x8212, 0x0D2C, 0x8214, 0x107F,

+    0x8215, 0x27A5, 0x8216, 0x29D5, 0x821B, 0x040A, 0x821C, 0x0D2D,

+    0x821D, 0x2529, 0x821E, 0x1080, 0x821F, 0x040B, 0x8220, 0x1A2E,

+    0x8221, 0x1BDF, 0x8222, 0x07E8, 0x8225, 0x1DBF, 0x8228, 0x099A,

+    0x822A, 0x0998, 0x822B, 0x0999, 0x822C, 0x099B, 0x822F, 0x1DBE,

+    0x8232, 0x2018, 0x8233, 0x2015, 0x8234, 0x2017, 0x8235, 0x0B72,

+    0x8236, 0x0B74, 0x8237, 0x0B73, 0x8238, 0x2014, 0x8239, 0x0B75,

+    0x823A, 0x2016, 0x823C, 0x228C, 0x823D, 0x228D, 0x823F, 0x228E,

+    0x8240, 0x252C, 0x8242, 0x252D, 0x8244, 0x252B, 0x8245, 0x252E,

+    0x8247, 0x0EDA, 0x8249, 0x252A, 0x824B, 0x1081, 0x824E, 0x29DA,

+    0x824F, 0x29D6, 0x8250, 0x29D9, 0x8251, 0x29DB, 0x8252, 0x29D8,

+    0x8253, 0x29D7, 0x8255, 0x2C3C, 0x8256, 0x2C3D, 0x8257, 0x2C3E,

+    0x8258, 0x1334, 0x8259, 0x1335, 0x825A, 0x2E0F, 0x825B, 0x2E0E,

+    0x825C, 0x2E10, 0x825E, 0x2F96, 0x825F, 0x2F95, 0x8261, 0x30F0,

+    0x8263, 0x30F1, 0x8264, 0x30EF, 0x8266, 0x1636, 0x8268, 0x321D,

+    0x8269, 0x321E, 0x826B, 0x33A6, 0x826C, 0x342D, 0x826D, 0x3496,

+    0x826E, 0x040C, 0x826F, 0x0504, 0x8271, 0x1459, 0x8272, 0x040D,

+    0x8274, 0x2019, 0x8275, 0x228F, 0x8277, 0x172E, 0x8278, 0x1813,

+    0x827C, 0x1814, 0x827D, 0x1816, 0x827E, 0x040E, 0x827F, 0x1817,

+    0x8280, 0x1815, 0x8283, 0x18E5, 0x8284, 0x18E6, 0x8285, 0x18E0,

+    0x828A, 0x18E4, 0x828B, 0x0506, 0x828D, 0x0507, 0x828E, 0x18E1,

+    0x828F, 0x18DF, 0x8290, 0x18DE, 0x8291, 0x18E2, 0x8292, 0x0505,

+    0x8293, 0x18E3, 0x8294, 0x1BE0, 0x8298, 0x1A33, 0x8299, 0x067B,

+    0x829A, 0x1A32, 0x829B, 0x1A34, 0x829D, 0x067A, 0x829E, 0x1A39,

+    0x829F, 0x067E, 0x82A0, 0x1A2F, 0x82A1, 0x1A3D, 0x82A2, 0x1A43,

+    0x82A3, 0x0685, 0x82A4, 0x1A40, 0x82A5, 0x0682, 0x82A7, 0x1A36,

+    0x82A8, 0x1A3C, 0x82A9, 0x1A3E, 0x82AB, 0x1A31, 0x82AC, 0x0681,

+    0x82AD, 0x067C, 0x82AE, 0x1A37, 0x82AF, 0x0683, 0x82B0, 0x0686,

+    0x82B1, 0x0680, 0x82B3, 0x0679, 0x82B4, 0x1A3B, 0x82B5, 0x1A35,

+    0x82B6, 0x1A42, 0x82B7, 0x0688, 0x82B8, 0x0684, 0x82B9, 0x067F,

+    0x82BA, 0x1A3A, 0x82BB, 0x099C, 0x82BC, 0x1A38, 0x82BD, 0x067D,

+    0x82BE, 0x0687, 0x82C0, 0x1A30, 0x82C2, 0x1A3F, 0x82C3, 0x1A41,

+    0x82D1, 0x07F9, 0x82D2, 0x07F3, 0x82D3, 0x07FB, 0x82D4, 0x07F8,

+    0x82D5, 0x1BE7, 0x82D6, 0x1BEA, 0x82D7, 0x07F4, 0x82D9, 0x1BE1,

+    0x82DB, 0x07ED, 0x82DC, 0x07F7, 0x82DE, 0x07FA, 0x82DF, 0x07FC,

+    0x82E0, 0x1BF6, 0x82E1, 0x1BED, 0x82E3, 0x07EC, 0x82E4, 0x1BF5,

+    0x82E5, 0x07F0, 0x82E6, 0x07EE, 0x82E7, 0x07E9, 0x82E8, 0x1BE5,

+    0x82EA, 0x1BF4, 0x82EB, 0x1BE9, 0x82EC, 0x1BEC, 0x82ED, 0x1BF9,

+    0x82EF, 0x07FD, 0x82F0, 0x1BF3, 0x82F1, 0x07F5, 0x82F2, 0x1BEE,

+    0x82F3, 0x1BF8, 0x82F4, 0x1BEB, 0x82F5, 0x1BEF, 0x82F6, 0x1BF2,

+    0x82F9, 0x1BE3, 0x82FA, 0x1BF7, 0x82FB, 0x1BF1, 0x82FE, 0x1BE2,

+    0x8300, 0x1BE6, 0x8301, 0x07F6, 0x8302, 0x07F1, 0x8303, 0x07EA,

+    0x8304, 0x07EF, 0x8305, 0x07EB, 0x8306, 0x07FE, 0x8307, 0x1BE4,

+    0x8308, 0x1DD0, 0x8309, 0x07F2, 0x830C, 0x1BF0, 0x830D, 0x1A7D,

+    0x8316, 0x1DD3, 0x8317, 0x09AA, 0x8319, 0x1DC3, 0x831B, 0x1DCE,

+    0x831C, 0x1DCA, 0x831E, 0x1DDD, 0x8320, 0x1DD5, 0x8322, 0x1DCB,

+    0x8324, 0x1DD4, 0x8325, 0x1DC5, 0x8326, 0x1DC9, 0x8327, 0x1DE0,

+    0x8328, 0x09AD, 0x8329, 0x1DD8, 0x832A, 0x1DCF, 0x832B, 0x099D,

+    0x832C, 0x1DDE, 0x832D, 0x1DC1, 0x832F, 0x1DD7, 0x8331, 0x09AC,

+    0x8332, 0x09A7, 0x8333, 0x1DC0, 0x8334, 0x09A5, 0x8335, 0x09A4,

+    0x8336, 0x09A9, 0x8337, 0x1DD6, 0x8338, 0x09A1, 0x8339, 0x09A8,

+    0x833A, 0x1BE8, 0x833B, 0x2290, 0x833C, 0x1DD1, 0x833F, 0x1DC7,

+    0x8340, 0x09AB, 0x8341, 0x1DC8, 0x8342, 0x1DCC, 0x8343, 0x09AE,

+    0x8344, 0x1DC2, 0x8345, 0x1DDA, 0x8347, 0x1DD9, 0x8348, 0x1DE1,

+    0x8349, 0x09A3, 0x834A, 0x09A0, 0x834B, 0x1DDF, 0x834C, 0x1DDB,

+    0x834D, 0x1DD2, 0x834E, 0x1DCD, 0x834F, 0x09A6, 0x8350, 0x09A2,

+    0x8351, 0x1DC4, 0x8352, 0x099E, 0x8353, 0x1DDC, 0x8354, 0x099F,

+    0x8356, 0x1DC6, 0x8373, 0x201F, 0x8374, 0x2021, 0x8375, 0x2026,

+    0x8376, 0x203A, 0x8377, 0x0B83, 0x8378, 0x0B79, 0x837A, 0x201E,

+    0x837B, 0x0B84, 0x837C, 0x0B85, 0x837D, 0x2029, 0x837E, 0x2030,

+    0x837F, 0x2036, 0x8381, 0x2023, 0x8383, 0x202A, 0x8386, 0x0B86,

+    0x8387, 0x2038, 0x8388, 0x2033, 0x8389, 0x0B81, 0x838A, 0x0B7F,

+    0x838B, 0x202F, 0x838C, 0x202B, 0x838D, 0x201D, 0x838E, 0x0B76,

+    0x838F, 0x2022, 0x8390, 0x201A, 0x8392, 0x0B7E, 0x8393, 0x0B80,

+    0x8394, 0x2027, 0x8395, 0x2024, 0x8396, 0x0B7B, 0x8397, 0x2034,

+    0x8398, 0x0B78, 0x8399, 0x2025, 0x839A, 0x22B9, 0x839B, 0x202D,

+    0x839D, 0x202C, 0x839E, 0x0B77, 0x83A0, 0x0B82, 0x83A2, 0x0B7A,

+    0x83A3, 0x201B, 0x83A4, 0x2020, 0x83A5, 0x2031, 0x83A6, 0x2037,

+    0x83A7, 0x0B87, 0x83A8, 0x201C, 0x83A9, 0x2028, 0x83AA, 0x202E,

+    0x83AB, 0x0B7D, 0x83AE, 0x2039, 0x83AF, 0x2032, 0x83B0, 0x2035,

+    0x83BD, 0x0B7C, 0x83BF, 0x22A0, 0x83C0, 0x2294, 0x83C1, 0x0D35,

+    0x83C2, 0x22B1, 0x83C3, 0x22BA, 0x83C4, 0x22BD, 0x83C5, 0x0D33,

+    0x83C6, 0x229C, 0x83C7, 0x22B5, 0x83C8, 0x229D, 0x83C9, 0x22AB,

+    0x83CA, 0x0D40, 0x83CB, 0x22A7, 0x83CC, 0x0D3D, 0x83CE, 0x22A8,

+    0x83CF, 0x2291, 0x83D1, 0x22B6, 0x83D4, 0x0D46, 0x83D5, 0x22B3,

+    0x83D6, 0x22A9, 0x83D7, 0x22BF, 0x83D8, 0x22A4, 0x83D9, 0x254E,

+    0x83DB, 0x22C2, 0x83DC, 0x0D44, 0x83DD, 0x22A2, 0x83DE, 0x22AE,

+    0x83DF, 0x0D47, 0x83E0, 0x0D32, 0x83E1, 0x22A6, 0x83E2, 0x22C0,

+    0x83E3, 0x229F, 0x83E4, 0x2298, 0x83E5, 0x22A3, 0x83E7, 0x2297,

+    0x83E8, 0x2295, 0x83E9, 0x0D2E, 0x83EA, 0x22B7, 0x83EB, 0x229E,

+    0x83EC, 0x22BB, 0x83EE, 0x22BC, 0x83EF, 0x0D36, 0x83F0, 0x0D3B,

+    0x83F1, 0x0D37, 0x83F2, 0x0D3F, 0x83F3, 0x22B2, 0x83F4, 0x0D38,

+    0x83F5, 0x22AA, 0x83F6, 0x229A, 0x83F8, 0x0D30, 0x83F9, 0x2292,

+    0x83FA, 0x22B4, 0x83FB, 0x22BE, 0x83FC, 0x2299, 0x83FD, 0x0D3E,

+    0x83FE, 0x22C3, 0x83FF, 0x22A5, 0x8401, 0x22A1, 0x8403, 0x0D2F,

+    0x8404, 0x0D43, 0x8406, 0x22B0, 0x8407, 0x0D45, 0x8409, 0x22AC,

+    0x840A, 0x0D3A, 0x840B, 0x0D34, 0x840C, 0x0D3C, 0x840D, 0x0D31,

+    0x840E, 0x0D42, 0x840F, 0x22AD, 0x8410, 0x229B, 0x8411, 0x22AF,

+    0x8412, 0x2296, 0x8413, 0x22B8, 0x841B, 0x22C1, 0x8423, 0x2293,

+    0x8429, 0x254D, 0x842B, 0x2563, 0x842C, 0x0EAC, 0x842D, 0x2552,

+    0x842F, 0x2550, 0x8430, 0x253B, 0x8431, 0x0EDE, 0x8432, 0x254B,

+    0x8433, 0x255F, 0x8434, 0x2547, 0x8435, 0x0EE6, 0x8436, 0x255E,

+    0x8437, 0x2545, 0x8438, 0x0D41, 0x8439, 0x2555, 0x843A, 0x2546,

+    0x843B, 0x255C, 0x843C, 0x0EE5, 0x843D, 0x0EDD, 0x843F, 0x2530,

+    0x8440, 0x2538, 0x8442, 0x2551, 0x8443, 0x2549, 0x8444, 0x2562,

+    0x8445, 0x254C, 0x8446, 0x0EEB, 0x8447, 0x255D, 0x8449, 0x0EE2,

+    0x844B, 0x254F, 0x844C, 0x2557, 0x844D, 0x253C, 0x844E, 0x2556,

+    0x8450, 0x2567, 0x8451, 0x2537, 0x8452, 0x2558, 0x8454, 0x2565,

+    0x8456, 0x2531, 0x8457, 0x0D39, 0x8459, 0x253F, 0x845A, 0x253E,

+    0x845B, 0x0EE4, 0x845D, 0x2542, 0x845E, 0x2544, 0x845F, 0x2553,

+    0x8460, 0x2564, 0x8461, 0x0EE7, 0x8463, 0x0EE8, 0x8465, 0x2536,

+    0x8466, 0x0EE0, 0x8467, 0x253A, 0x8468, 0x2560, 0x8469, 0x0EE9,

+    0x846B, 0x0EE1, 0x846C, 0x0EE3, 0x846D, 0x0EEA, 0x846E, 0x2566,

+    0x846F, 0x2559, 0x8470, 0x2554, 0x8473, 0x2541, 0x8474, 0x2540,

+    0x8475, 0x0EDF, 0x8476, 0x2532, 0x8477, 0x0EDC, 0x8478, 0x254A,

+    0x8479, 0x2533, 0x847A, 0x2548, 0x847D, 0x253D, 0x847E, 0x2561,

+    0x8482, 0x0EDB, 0x8486, 0x2539, 0x848D, 0x2535, 0x848E, 0x255B,

+    0x848F, 0x2534, 0x8490, 0x108E, 0x8491, 0x27CD, 0x8494, 0x27BC,

+    0x8497, 0x27A6, 0x8498, 0x27C4, 0x8499, 0x1086, 0x849A, 0x27B5,

+    0x849B, 0x27BF, 0x849C, 0x1089, 0x849D, 0x27B8, 0x849E, 0x1087,

+    0x849F, 0x27A9, 0x84A0, 0x27C7, 0x84A1, 0x27A8, 0x84A2, 0x27BB,

+    0x84A4, 0x27A7, 0x84A7, 0x27B9, 0x84A8, 0x27C2, 0x84A9, 0x27C0,

+    0x84AA, 0x27B4, 0x84AB, 0x27AF, 0x84AC, 0x27AD, 0x84AE, 0x27AE,

+    0x84AF, 0x27C1, 0x84B0, 0x27CC, 0x84B1, 0x27B6, 0x84B2, 0x1088,

+    0x84B4, 0x27B1, 0x84B6, 0x27C5, 0x84B8, 0x108B, 0x84B9, 0x27B0,

+    0x84BA, 0x27AA, 0x84BB, 0x27BA, 0x84BC, 0x108F, 0x84BF, 0x1083,

+    0x84C0, 0x108C, 0x84C1, 0x27B2, 0x84C2, 0x27AC, 0x84C4, 0x1085,

+    0x84C5, 0x255A, 0x84C6, 0x1084, 0x84C7, 0x27BD, 0x84C9, 0x1082,

+    0x84CA, 0x1091, 0x84CB, 0x108A, 0x84CC, 0x27BE, 0x84CD, 0x27B3,

+    0x84CE, 0x27AB, 0x84CF, 0x27C6, 0x84D0, 0x27B7, 0x84D1, 0x1090,

+    0x84D2, 0x27CA, 0x84D3, 0x108D, 0x84D4, 0x27C9, 0x84D6, 0x27C3,

+    0x84D7, 0x27C8, 0x84DB, 0x27CB, 0x84E7, 0x2A03, 0x84E8, 0x2A04,

+    0x84E9, 0x29F7, 0x84EA, 0x29F6, 0x84EB, 0x29F2, 0x84EC, 0x11FB,

+    0x84EE, 0x11F3, 0x84EF, 0x2A06, 0x84F0, 0x2A05, 0x84F1, 0x252F,

+    0x84F2, 0x29EF, 0x84F3, 0x29F3, 0x84F4, 0x29ED, 0x84F6, 0x2A00,

+    0x84F7, 0x29F1, 0x84F9, 0x2A07, 0x84FA, 0x29EA, 0x84FB, 0x29E8,

+    0x84FC, 0x29F4, 0x84FD, 0x29FE, 0x84FE, 0x29F9, 0x84FF, 0x11FD,

+    0x8500, 0x29DF, 0x8502, 0x29FD, 0x8506, 0x11FE, 0x8507, 0x2543,

+    0x8508, 0x29EB, 0x8509, 0x29E2, 0x850A, 0x29E5, 0x850B, 0x2A0B,

+    0x850C, 0x29EC, 0x850D, 0x29E3, 0x850E, 0x29E1, 0x850F, 0x29DE,

+    0x8511, 0x11F7, 0x8512, 0x29F5, 0x8513, 0x11F6, 0x8514, 0x11FA,

+    0x8515, 0x29F0, 0x8516, 0x29F8, 0x8517, 0x11F0, 0x8518, 0x2A08,

+    0x8519, 0x2A0C, 0x851A, 0x11F2, 0x851C, 0x29E7, 0x851D, 0x29FB,

+    0x851E, 0x29FF, 0x851F, 0x29E4, 0x8520, 0x2A09, 0x8521, 0x11F9,

+    0x8523, 0x11F8, 0x8524, 0x29DC, 0x8525, 0x11FC, 0x8526, 0x2A02,

+    0x8527, 0x29E6, 0x8528, 0x29FA, 0x8529, 0x29E0, 0x852A, 0x29EE,

+    0x852B, 0x29E9, 0x852C, 0x11F4, 0x852D, 0x11F5, 0x852E, 0x29FC,

+    0x852F, 0x2A0D, 0x8530, 0x2A0A, 0x8531, 0x2A01, 0x853B, 0x29DD,

+    0x853D, 0x11F1, 0x853E, 0x2C4F, 0x8540, 0x2C46, 0x8541, 0x2C49,

+    0x8543, 0x133B, 0x8544, 0x2C4B, 0x8545, 0x2C40, 0x8546, 0x2C47,

+    0x8547, 0x2C4D, 0x8548, 0x1338, 0x8549, 0x133C, 0x854A, 0x1336,

+    0x854D, 0x2C42, 0x854E, 0x2C52, 0x8551, 0x2C4C, 0x8553, 0x2C43,

+    0x8554, 0x2C5B, 0x8555, 0x2C55, 0x8556, 0x2C3F, 0x8557, 0x2E23,

+    0x8558, 0x2C45, 0x8559, 0x1337, 0x855B, 0x2C50, 0x855D, 0x2C5A,

+    0x855E, 0x133F, 0x8560, 0x2C57, 0x8561, 0x2C44, 0x8562, 0x2C4A,

+    0x8563, 0x2C4E, 0x8564, 0x2C48, 0x8565, 0x2C5C, 0x8566, 0x2C59,

+    0x8567, 0x2C56, 0x8568, 0x1339, 0x8569, 0x133A, 0x856A, 0x133E,

+    0x856B, 0x2C41, 0x856C, 0x2C5D, 0x856D, 0x133D, 0x856E, 0x2C53,

+    0x8571, 0x2C51, 0x8575, 0x2C54, 0x8576, 0x2E30, 0x8577, 0x2E1D,

+    0x8578, 0x2E22, 0x8579, 0x2E2F, 0x857A, 0x2E21, 0x857B, 0x2E19,

+    0x857C, 0x2E1E, 0x857E, 0x145C, 0x8580, 0x2E12, 0x8581, 0x2E2A,

+    0x8582, 0x2E2C, 0x8583, 0x2E11, 0x8584, 0x145B, 0x8585, 0x2E2E,

+    0x8586, 0x2E26, 0x8587, 0x1462, 0x8588, 0x2E2D, 0x8589, 0x2E1F,

+    0x858A, 0x1464, 0x858B, 0x2E17, 0x858C, 0x2C58, 0x858D, 0x2E27,

+    0x858E, 0x2E24, 0x858F, 0x2E13, 0x8590, 0x2E32, 0x8591, 0x145E,

+    0x8594, 0x145F, 0x8595, 0x2E15, 0x8596, 0x2E25, 0x8598, 0x2E31,

+    0x8599, 0x2E28, 0x859A, 0x2E1B, 0x859B, 0x1461, 0x859C, 0x145D,

+    0x859D, 0x2E29, 0x859E, 0x2E1C, 0x859F, 0x2E33, 0x85A0, 0x2E16,

+    0x85A1, 0x2E20, 0x85A2, 0x2E2B, 0x85A3, 0x2E18, 0x85A4, 0x2E1A,

+    0x85A6, 0x1465, 0x85A7, 0x2E14, 0x85A8, 0x1463, 0x85A9, 0x151C,

+    0x85AA, 0x145A, 0x85AF, 0x1460, 0x85B0, 0x1520, 0x85B1, 0x2FA6,

+    0x85B3, 0x2F9C, 0x85B4, 0x2F97, 0x85B5, 0x2F9D, 0x85B6, 0x2FA7,

+    0x85B7, 0x2FAB, 0x85B8, 0x2FAA, 0x85B9, 0x1522, 0x85BA, 0x1521,

+    0x85BD, 0x2F9E, 0x85BE, 0x2FAC, 0x85BF, 0x2FA1, 0x85C0, 0x2F99,

+    0x85C2, 0x2F9B, 0x85C3, 0x2F9A, 0x85C4, 0x2FA0, 0x85C5, 0x2FA5,

+    0x85C6, 0x2F98, 0x85C7, 0x2F9F, 0x85C8, 0x2FA4, 0x85C9, 0x151F,

+    0x85CB, 0x2FA2, 0x85CD, 0x151D, 0x85CE, 0x2FA3, 0x85CF, 0x151B,

+    0x85D0, 0x151E, 0x85D1, 0x3101, 0x85D2, 0x2FA8, 0x85D5, 0x15B7,

+    0x85D7, 0x30F9, 0x85D8, 0x30FD, 0x85D9, 0x30F5, 0x85DA, 0x30F8,

+    0x85DC, 0x3100, 0x85DD, 0x15B5, 0x85DE, 0x3105, 0x85DF, 0x30FE,

+    0x85E1, 0x30F6, 0x85E2, 0x3106, 0x85E3, 0x30FF, 0x85E4, 0x15B8,

+    0x85E5, 0x15B9, 0x85E6, 0x3103, 0x85E8, 0x30F7, 0x85E9, 0x15B4,

+    0x85EA, 0x15B6, 0x85EB, 0x30F2, 0x85EC, 0x30FA, 0x85ED, 0x30F4,

+    0x85EF, 0x3104, 0x85F0, 0x3102, 0x85F1, 0x30F3, 0x85F2, 0x30FB,

+    0x85F6, 0x3225, 0x85F7, 0x15BA, 0x85F8, 0x30FC, 0x85F9, 0x1638,

+    0x85FA, 0x163A, 0x85FB, 0x1637, 0x85FD, 0x322A, 0x85FE, 0x3222,

+    0x85FF, 0x3220, 0x8600, 0x3224, 0x8601, 0x3221, 0x8604, 0x3226,

+    0x8605, 0x3228, 0x8606, 0x163B, 0x8607, 0x163D, 0x8609, 0x3227,

+    0x860A, 0x163E, 0x860B, 0x163C, 0x860C, 0x3229, 0x8611, 0x1639,

+    0x8617, 0x1685, 0x8618, 0x32F6, 0x8619, 0x32FC, 0x861A, 0x1687,

+    0x861B, 0x3223, 0x861C, 0x32FB, 0x861E, 0x3302, 0x861F, 0x32F9,

+    0x8620, 0x3300, 0x8621, 0x32FF, 0x8622, 0x321F, 0x8623, 0x32FA,

+    0x8624, 0x2FA9, 0x8625, 0x3303, 0x8626, 0x32F8, 0x8627, 0x32FD,

+    0x8629, 0x3301, 0x862A, 0x32F7, 0x862C, 0x33AA, 0x862D, 0x1686,

+    0x862E, 0x32FE, 0x8631, 0x3432, 0x8632, 0x33AB, 0x8633, 0x33A9,

+    0x8634, 0x33A7, 0x8635, 0x33A8, 0x8636, 0x33AC, 0x8638, 0x1707,

+    0x8639, 0x3430, 0x863A, 0x342E, 0x863B, 0x3433, 0x863C, 0x3431,

+    0x863E, 0x3434, 0x863F, 0x1708, 0x8640, 0x342F, 0x8643, 0x3497,

+    0x8646, 0x34DF, 0x8647, 0x34E0, 0x8648, 0x34E1, 0x864B, 0x353E,

+    0x864C, 0x3536, 0x864D, 0x1818, 0x864E, 0x0689, 0x8650, 0x07FF,

+    0x8652, 0x1DE3, 0x8653, 0x1DE2, 0x8654, 0x09AF, 0x8655, 0x0B88,

+    0x8656, 0x203C, 0x8659, 0x203B, 0x865B, 0x0D48, 0x865C, 0x0EED,

+    0x865E, 0x0EEC, 0x865F, 0x0EEE, 0x8661, 0x27CE, 0x8662, 0x2A0E,

+    0x8663, 0x2C5E, 0x8664, 0x2C60, 0x8665, 0x2C5F, 0x8667, 0x1466,

+    0x8668, 0x2E34, 0x8669, 0x2FAD, 0x866A, 0x351E, 0x866B, 0x040F,

+    0x866D, 0x1A46, 0x866E, 0x1A47, 0x866F, 0x1A45, 0x8670, 0x1A44,

+    0x8671, 0x068A, 0x8673, 0x1BFD, 0x8674, 0x1BFB, 0x8677, 0x1BFA,

+    0x8679, 0x0800, 0x867A, 0x0802, 0x867B, 0x0801, 0x867C, 0x1BFC,

+    0x8685, 0x1DEF, 0x8686, 0x1DEC, 0x8687, 0x1DEA, 0x868A, 0x09B0,

+    0x868B, 0x1DED, 0x868C, 0x09B5, 0x868D, 0x1DE7, 0x868E, 0x1DF6,

+    0x8690, 0x1DF8, 0x8691, 0x1DE8, 0x8693, 0x09B2, 0x8694, 0x1DF9,

+    0x8695, 0x1DF4, 0x8696, 0x1DE6, 0x8697, 0x1DEB, 0x8698, 0x1DF5,

+    0x8699, 0x1DF1, 0x869A, 0x1DEE, 0x869C, 0x09B7, 0x869D, 0x1DF7,

+    0x869E, 0x1DE9, 0x86A1, 0x1DF2, 0x86A2, 0x1DE4, 0x86A3, 0x09B6,

+    0x86A4, 0x09B3, 0x86A5, 0x1DF0, 0x86A7, 0x1DF3, 0x86A8, 0x1DE5,

+    0x86A9, 0x09B4, 0x86AA, 0x09B1, 0x86AF, 0x0B92, 0x86B0, 0x2043,

+    0x86B1, 0x0B91, 0x86B3, 0x2046, 0x86B4, 0x2049, 0x86B5, 0x0B8E,

+    0x86B6, 0x0B8C, 0x86B7, 0x203E, 0x86B8, 0x2047, 0x86B9, 0x2045,

+    0x86BA, 0x2042, 0x86BB, 0x204A, 0x86BC, 0x204B, 0x86BD, 0x204D,

+    0x86BE, 0x204E, 0x86BF, 0x203D, 0x86C0, 0x0B8B, 0x86C1, 0x2040,

+    0x86C2, 0x203F, 0x86C3, 0x204C, 0x86C4, 0x0B8D, 0x86C5, 0x2041,

+    0x86C6, 0x0B8F, 0x86C7, 0x0B8A, 0x86C8, 0x2044, 0x86C9, 0x0B93,

+    0x86CB, 0x0B90, 0x86CC, 0x2048, 0x86D0, 0x0D4F, 0x86D1, 0x22D2,

+    0x86D3, 0x22C7, 0x86D4, 0x0D4C, 0x86D6, 0x256D, 0x86D7, 0x22D0,

+    0x86D8, 0x22C4, 0x86D9, 0x0D4A, 0x86DA, 0x22C9, 0x86DB, 0x0D4D,

+    0x86DC, 0x22CD, 0x86DD, 0x22CB, 0x86DE, 0x0D50, 0x86DF, 0x0D49,

+    0x86E2, 0x22C5, 0x86E3, 0x22C8, 0x86E4, 0x0D4E, 0x86E6, 0x22C6,

+    0x86E8, 0x22D1, 0x86E9, 0x22CF, 0x86EA, 0x22CA, 0x86EB, 0x22CC,

+    0x86EC, 0x22CE, 0x86ED, 0x0D4B, 0x86F5, 0x256E, 0x86F6, 0x2574,

+    0x86F7, 0x256A, 0x86F8, 0x2570, 0x86F9, 0x0EEF, 0x86FA, 0x256C,

+    0x86FB, 0x0EF5, 0x86FE, 0x0EF4, 0x8700, 0x0EF3, 0x8701, 0x2573,

+    0x8702, 0x0EF6, 0x8703, 0x0EF7, 0x8704, 0x2569, 0x8705, 0x2576,

+    0x8706, 0x0EF8, 0x8707, 0x0EF2, 0x8708, 0x0EF1, 0x8709, 0x2572,

+    0x870A, 0x0EF9, 0x870B, 0x2568, 0x870C, 0x256B, 0x870D, 0x2575,

+    0x870E, 0x2571, 0x8711, 0x27EE, 0x8712, 0x27E3, 0x8713, 0x0EF0,

+    0x8718, 0x1098, 0x8719, 0x27D7, 0x871A, 0x27EC, 0x871B, 0x27D8,

+    0x871C, 0x1093, 0x871E, 0x27D5, 0x8720, 0x27DE, 0x8721, 0x27D6,

+    0x8722, 0x1095, 0x8723, 0x27D0, 0x8724, 0x27EB, 0x8725, 0x1096,

+    0x8726, 0x27E8, 0x8727, 0x27E9, 0x8728, 0x27D1, 0x8729, 0x109B,

+    0x872A, 0x27E0, 0x872C, 0x27DA, 0x872D, 0x27E1, 0x872E, 0x27D4,

+    0x8730, 0x27ED, 0x8731, 0x27E5, 0x8732, 0x27DF, 0x8733, 0x27CF,

+    0x8734, 0x1097, 0x8735, 0x27E6, 0x8737, 0x109A, 0x8738, 0x27EA,

+    0x873A, 0x27E4, 0x873B, 0x1094, 0x873C, 0x27E2, 0x873E, 0x27DC,

+    0x873F, 0x1092, 0x8740, 0x27D3, 0x8741, 0x27DB, 0x8742, 0x27E7,

+    0x8743, 0x27D9, 0x8746, 0x27DD, 0x874C, 0x1208, 0x874D, 0x256F,

+    0x874E, 0x2A20, 0x874F, 0x2A29, 0x8750, 0x2A1F, 0x8751, 0x2A1B,

+    0x8752, 0x2A18, 0x8753, 0x1209, 0x8754, 0x2A16, 0x8755, 0x1099,

+    0x8756, 0x2A0F, 0x8757, 0x1207, 0x8758, 0x2A15, 0x8759, 0x1206,

+    0x875A, 0x2A1A, 0x875B, 0x2A17, 0x875C, 0x2A27, 0x875D, 0x2A22,

+    0x875E, 0x2A1C, 0x875F, 0x2A21, 0x8760, 0x1202, 0x8761, 0x2A19,

+    0x8762, 0x2A2C, 0x8763, 0x2A10, 0x8764, 0x2A11, 0x8765, 0x2A28,

+    0x8766, 0x1203, 0x8767, 0x2A2D, 0x8768, 0x1205, 0x8769, 0x2A2E,

+    0x876A, 0x2A1E, 0x876B, 0x27D2, 0x876C, 0x2A24, 0x876D, 0x2A1D,

+    0x876E, 0x2A26, 0x876F, 0x2A23, 0x8773, 0x2A14, 0x8774, 0x1200,

+    0x8775, 0x2A2B, 0x8776, 0x1201, 0x8777, 0x2A12, 0x8778, 0x1204,

+    0x8779, 0x2C6B, 0x877A, 0x2A25, 0x877B, 0x2A2A, 0x8781, 0x2C68,

+    0x8782, 0x11FF, 0x8783, 0x1340, 0x8784, 0x2C72, 0x8785, 0x2C6E,

+    0x8787, 0x2C6C, 0x8788, 0x2C67, 0x8789, 0x2C76, 0x878D, 0x1344,

+    0x878F, 0x2C63, 0x8790, 0x2C6F, 0x8791, 0x2C70, 0x8792, 0x2C66,

+    0x8793, 0x2C65, 0x8794, 0x2C73, 0x8796, 0x2C69, 0x8797, 0x2C64,

+    0x8798, 0x2C6A, 0x879A, 0x2C75, 0x879B, 0x2C62, 0x879C, 0x2C74,

+    0x879D, 0x2C71, 0x879E, 0x1342, 0x879F, 0x1341, 0x87A2, 0x1343,

+    0x87A3, 0x2C6D, 0x87A4, 0x2C61, 0x87AA, 0x2E36, 0x87AB, 0x146C,

+    0x87AC, 0x2E3A, 0x87AD, 0x2E37, 0x87AE, 0x2E3E, 0x87AF, 0x2E44,

+    0x87B0, 0x2E39, 0x87B2, 0x2E4D, 0x87B3, 0x1469, 0x87B4, 0x2E47,

+    0x87B5, 0x2E3C, 0x87B6, 0x2E48, 0x87B7, 0x2E43, 0x87B8, 0x2E4A,

+    0x87B9, 0x2E3B, 0x87BA, 0x146E, 0x87BB, 0x146D, 0x87BC, 0x2E3D,

+    0x87BD, 0x2E4B, 0x87BE, 0x2E35, 0x87BF, 0x2E49, 0x87C0, 0x1467,

+    0x87C2, 0x2E41, 0x87C3, 0x2E40, 0x87C4, 0x2E45, 0x87C5, 0x2E38,

+    0x87C6, 0x146B, 0x87C8, 0x146F, 0x87C9, 0x2E3F, 0x87CA, 0x2E46,

+    0x87CB, 0x1470, 0x87CC, 0x2E42, 0x87D1, 0x1468, 0x87D2, 0x146A,

+    0x87D3, 0x2FBA, 0x87D4, 0x2FB8, 0x87D7, 0x2FBE, 0x87D8, 0x2FBC,

+    0x87D9, 0x2FBF, 0x87DB, 0x2FB1, 0x87DC, 0x2FB9, 0x87DD, 0x2FC3,

+    0x87DE, 0x2E4C, 0x87DF, 0x2FB5, 0x87E0, 0x1526, 0x87E1, 0x2A13,

+    0x87E2, 0x2FB0, 0x87E3, 0x2FBD, 0x87E4, 0x2FB7, 0x87E5, 0x2FB4,

+    0x87E6, 0x2FAF, 0x87E7, 0x2FAE, 0x87E8, 0x2FC2, 0x87EA, 0x2FB3,

+    0x87EB, 0x2FB2, 0x87EC, 0x1524, 0x87ED, 0x2FBB, 0x87EF, 0x1523,

+    0x87F2, 0x1525, 0x87F3, 0x2FB6, 0x87F4, 0x2FC1, 0x87F6, 0x310A,

+    0x87F7, 0x310B, 0x87F9, 0x15BE, 0x87FA, 0x3108, 0x87FB, 0x15BB,

+    0x87FC, 0x3110, 0x87FE, 0x15BF, 0x87FF, 0x3112, 0x8800, 0x3107,

+    0x8801, 0x2FC0, 0x8802, 0x3114, 0x8803, 0x3109, 0x8805, 0x15BC,

+    0x8806, 0x310F, 0x8808, 0x3111, 0x8809, 0x310C, 0x880A, 0x3113,

+    0x880B, 0x310E, 0x880C, 0x310D, 0x880D, 0x15BD, 0x8810, 0x322C,

+    0x8811, 0x322D, 0x8813, 0x322F, 0x8814, 0x163F, 0x8815, 0x1640,

+    0x8816, 0x3230, 0x8817, 0x322E, 0x8819, 0x322B, 0x881B, 0x3306,

+    0x881C, 0x3309, 0x881D, 0x3305, 0x881F, 0x168B, 0x8820, 0x3307,

+    0x8821, 0x168A, 0x8822, 0x1689, 0x8823, 0x1688, 0x8824, 0x3308,

+    0x8825, 0x33B1, 0x8826, 0x33AF, 0x8828, 0x33AE, 0x8829, 0x3304,

+    0x882A, 0x33B0, 0x882B, 0x330A, 0x882C, 0x33AD, 0x882E, 0x3437,

+    0x882F, 0x3415, 0x8830, 0x3435, 0x8831, 0x1709, 0x8832, 0x3436,

+    0x8833, 0x3438, 0x8835, 0x349A, 0x8836, 0x1728, 0x8837, 0x3499,

+    0x8838, 0x3498, 0x8839, 0x1729, 0x883B, 0x1747, 0x883C, 0x3508,

+    0x883D, 0x3520, 0x883E, 0x351F, 0x883F, 0x3521, 0x8840, 0x0410,

+    0x8841, 0x1BFE, 0x8843, 0x1DFA, 0x8844, 0x1DFB, 0x8848, 0x22D3,

+    0x884A, 0x330B, 0x884B, 0x349B, 0x884C, 0x0411, 0x884D, 0x0803,

+    0x884E, 0x1BFF, 0x8852, 0x204F, 0x8853, 0x0B94, 0x8855, 0x22D5,

+    0x8856, 0x22D4, 0x8857, 0x0D51, 0x8859, 0x0EFA, 0x885A, 0x2A2F,

+    0x885B, 0x120A, 0x885D, 0x120B, 0x8861, 0x1345, 0x8862, 0x172A,

+    0x8863, 0x0412, 0x8867, 0x1C00, 0x8868, 0x068C, 0x8869, 0x1C02,

+    0x886A, 0x1C01, 0x886B, 0x0804, 0x886D, 0x1DFC, 0x886F, 0x1E03,

+    0x8870, 0x09B8, 0x8871, 0x1E01, 0x8872, 0x1DFF, 0x8874, 0x1E06,

+    0x8875, 0x1DFD, 0x8876, 0x1DFE, 0x8877, 0x09B9, 0x8879, 0x09BD,

+    0x887C, 0x1E07, 0x887D, 0x09BC, 0x887E, 0x1E05, 0x887F, 0x1E02,

+    0x8880, 0x1E00, 0x8881, 0x09BA, 0x8882, 0x09BB, 0x8883, 0x1E04,

+    0x8888, 0x0B96, 0x8889, 0x2050, 0x888B, 0x0B9B, 0x888C, 0x2060,

+    0x888D, 0x0B9A, 0x888E, 0x2062, 0x8891, 0x2056, 0x8892, 0x0B98,

+    0x8893, 0x2061, 0x8895, 0x2051, 0x8896, 0x0B99, 0x8897, 0x205D,

+    0x8898, 0x2059, 0x8899, 0x205B, 0x889A, 0x2055, 0x889B, 0x205C,

+    0x889E, 0x0B95, 0x889F, 0x2058, 0x88A1, 0x2057, 0x88A2, 0x2053,

+    0x88A4, 0x205E, 0x88A7, 0x205A, 0x88A8, 0x2052, 0x88AA, 0x2054,

+    0x88AB, 0x0B97, 0x88AC, 0x205F, 0x88B1, 0x0D54, 0x88B2, 0x22E0,

+    0x88B6, 0x22DC, 0x88B7, 0x22DE, 0x88B8, 0x22D9, 0x88B9, 0x22D8,

+    0x88BA, 0x22D6, 0x88BC, 0x22DD, 0x88BD, 0x22DF, 0x88BE, 0x22DB,

+    0x88C0, 0x22DA, 0x88C1, 0x0D52, 0x88C2, 0x0D53, 0x88C9, 0x22E2,

+    0x88CA, 0x0F02, 0x88CB, 0x2578, 0x88CC, 0x257E, 0x88CD, 0x2579,

+    0x88CE, 0x257A, 0x88CF, 0x36EA, 0x88D0, 0x257F, 0x88D2, 0x0F04,

+    0x88D4, 0x0EFC, 0x88D5, 0x0F03, 0x88D6, 0x2577, 0x88D7, 0x22D7,

+    0x88D8, 0x0EFF, 0x88D9, 0x0EFD, 0x88DA, 0x257D, 0x88DB, 0x257C,

+    0x88DC, 0x0EFE, 0x88DD, 0x0F00, 0x88DE, 0x257B, 0x88DF, 0x0EFB,

+    0x88E1, 0x0F01, 0x88E7, 0x27F0, 0x88E8, 0x10A2, 0x88EB, 0x27FB,

+    0x88EC, 0x27FA, 0x88EE, 0x27F5, 0x88EF, 0x10A4, 0x88F0, 0x27F9,

+    0x88F1, 0x27F1, 0x88F2, 0x27F2, 0x88F3, 0x109C, 0x88F4, 0x109E,

+    0x88F6, 0x27F7, 0x88F7, 0x27EF, 0x88F8, 0x10A0, 0x88F9, 0x109F,

+    0x88FA, 0x27F3, 0x88FB, 0x27F8, 0x88FC, 0x27F6, 0x88FD, 0x10A1,

+    0x88FE, 0x27F4, 0x8901, 0x22E1, 0x8902, 0x109D, 0x8905, 0x2A30,

+    0x8906, 0x2A37, 0x8907, 0x120D, 0x8909, 0x2A3B, 0x890A, 0x1211,

+    0x890B, 0x2A33, 0x890C, 0x2A31, 0x890E, 0x2A3A, 0x8910, 0x120C,

+    0x8911, 0x2A39, 0x8912, 0x120E, 0x8913, 0x120F, 0x8914, 0x2A32,

+    0x8915, 0x1210, 0x8916, 0x2A38, 0x8917, 0x2A34, 0x8918, 0x2A35,

+    0x8919, 0x2A36, 0x891A, 0x10A3, 0x891E, 0x2C77, 0x891F, 0x2C83,

+    0x8921, 0x134A, 0x8922, 0x2C7E, 0x8923, 0x2C80, 0x8925, 0x1348,

+    0x8926, 0x2C78, 0x8927, 0x2C7C, 0x8929, 0x2C7F, 0x892A, 0x1346,

+    0x892B, 0x1349, 0x892C, 0x2C82, 0x892D, 0x2C7A, 0x892E, 0x2C7B,

+    0x892F, 0x2C81, 0x8930, 0x2C79, 0x8931, 0x2C7D, 0x8932, 0x1347,

+    0x8933, 0x2E4F, 0x8935, 0x2E4E, 0x8936, 0x1472, 0x8937, 0x2E54,

+    0x8938, 0x1474, 0x893B, 0x1471, 0x893C, 0x2E50, 0x893D, 0x1475,

+    0x893E, 0x2E51, 0x8941, 0x2E52, 0x8942, 0x2E55, 0x8944, 0x1473,

+    0x8946, 0x2FC8, 0x8949, 0x2FCB, 0x894B, 0x2FC5, 0x894C, 0x2FC7,

+    0x894F, 0x2FC6, 0x8950, 0x2FC9, 0x8951, 0x2FCA, 0x8952, 0x2E53,

+    0x8953, 0x2FC4, 0x8956, 0x15C2, 0x8957, 0x3118, 0x8958, 0x311B,

+    0x8959, 0x311D, 0x895A, 0x3116, 0x895B, 0x3117, 0x895C, 0x311A,

+    0x895D, 0x311C, 0x895E, 0x15C3, 0x895F, 0x15C1, 0x8960, 0x15C0,

+    0x8961, 0x3119, 0x8962, 0x3115, 0x8963, 0x3231, 0x8964, 0x1641,

+    0x8966, 0x3232, 0x8969, 0x330D, 0x896A, 0x168C, 0x896B, 0x330F,

+    0x896C, 0x168D, 0x896D, 0x330C, 0x896E, 0x330E, 0x896F, 0x16D6,

+    0x8971, 0x33B2, 0x8972, 0x16D5, 0x8973, 0x343B, 0x8974, 0x343A,

+    0x8976, 0x3439, 0x8979, 0x34E2, 0x897A, 0x34E3, 0x897B, 0x34E5,

+    0x897C, 0x34E4, 0x897E, 0x1819, 0x897F, 0x0413, 0x8981, 0x0805,

+    0x8982, 0x2063, 0x8983, 0x0D55, 0x8985, 0x2580, 0x8986, 0x1527,

+    0x8988, 0x311E, 0x898B, 0x0508, 0x898F, 0x0B9D, 0x8993, 0x0B9C,

+    0x8995, 0x22E3, 0x8996, 0x0D56, 0x8997, 0x22E5, 0x8998, 0x22E4,

+    0x899B, 0x2581, 0x899C, 0x0F05, 0x899D, 0x27FC, 0x899E, 0x27FF,

+    0x899F, 0x27FE, 0x89A1, 0x27FD, 0x89A2, 0x2A3C, 0x89A3, 0x2A3E,

+    0x89A4, 0x2A3D, 0x89A6, 0x134C, 0x89AA, 0x134B, 0x89AC, 0x1476,

+    0x89AD, 0x2E56, 0x89AE, 0x2E58, 0x89AF, 0x2E57, 0x89B2, 0x1528,

+    0x89B6, 0x3120, 0x89B7, 0x311F, 0x89B9, 0x3233, 0x89BA, 0x1642,

+    0x89BD, 0x168E, 0x89BE, 0x33B4, 0x89BF, 0x33B3, 0x89C0, 0x1748,

+    0x89D2, 0x0509, 0x89D3, 0x1C03, 0x89D4, 0x0806, 0x89D5, 0x2066,

+    0x89D6, 0x2064, 0x89D9, 0x2065, 0x89DA, 0x22E7, 0x89DB, 0x22E8,

+    0x89DC, 0x2588, 0x89DD, 0x22E6, 0x89DF, 0x2582, 0x89E0, 0x2586,

+    0x89E1, 0x2585, 0x89E2, 0x2587, 0x89E3, 0x0F06, 0x89E4, 0x2584,

+    0x89E5, 0x2583, 0x89E6, 0x2589, 0x89E8, 0x2802, 0x89E9, 0x2800,

+    0x89EB, 0x2801, 0x89EC, 0x2A41, 0x89ED, 0x2A3F, 0x89F0, 0x2A40,

+    0x89F1, 0x2C84, 0x89F2, 0x2E59, 0x89F3, 0x2E5A, 0x89F4, 0x1529,

+    0x89F6, 0x3121, 0x89F7, 0x3234, 0x89F8, 0x1643, 0x89FA, 0x3310,

+    0x89FB, 0x33B5, 0x89FC, 0x16D7, 0x89FE, 0x343C, 0x89FF, 0x34E6,

+    0x8A00, 0x050A, 0x8A02, 0x0808, 0x8A03, 0x0809, 0x8A04, 0x1C04,

+    0x8A07, 0x1C05, 0x8A08, 0x0807, 0x8A0A, 0x09C3, 0x8A0C, 0x09C1,

+    0x8A0E, 0x09C0, 0x8A0F, 0x09C7, 0x8A10, 0x09BF, 0x8A11, 0x09C8,

+    0x8A12, 0x1E08, 0x8A13, 0x09C5, 0x8A15, 0x09C2, 0x8A16, 0x09C6,

+    0x8A17, 0x09C4, 0x8A18, 0x09BE, 0x8A1B, 0x0BA5, 0x8A1D, 0x0B9F,

+    0x8A1E, 0x206A, 0x8A1F, 0x0BA4, 0x8A22, 0x0BA6, 0x8A23, 0x0BA0,

+    0x8A25, 0x0BA1, 0x8A27, 0x2068, 0x8A2A, 0x0B9E, 0x8A2C, 0x2069,

+    0x8A2D, 0x0BA3, 0x8A30, 0x2067, 0x8A31, 0x0BA2, 0x8A34, 0x0D61,

+    0x8A36, 0x0D63, 0x8A39, 0x22EB, 0x8A3A, 0x0D62, 0x8A3B, 0x0D57,

+    0x8A3C, 0x0D5B, 0x8A3E, 0x0F19, 0x8A3F, 0x258E, 0x8A40, 0x22ED,

+    0x8A41, 0x0D5C, 0x8A44, 0x22F0, 0x8A45, 0x22F1, 0x8A46, 0x0D60,

+    0x8A48, 0x22F3, 0x8A4A, 0x22F5, 0x8A4C, 0x22F6, 0x8A4D, 0x22EA,

+    0x8A4E, 0x22E9, 0x8A4F, 0x22F7, 0x8A50, 0x0D5F, 0x8A51, 0x22F4,

+    0x8A52, 0x22F2, 0x8A54, 0x0D5D, 0x8A55, 0x0D59, 0x8A56, 0x0D64,

+    0x8A57, 0x22EE, 0x8A58, 0x22EF, 0x8A59, 0x22EC, 0x8A5B, 0x0D5E,

+    0x8A5E, 0x0D5A, 0x8A60, 0x0D58, 0x8A61, 0x258D, 0x8A62, 0x0F14,

+    0x8A63, 0x0F0F, 0x8A66, 0x0F0A, 0x8A68, 0x0F1A, 0x8A69, 0x0F0B,

+    0x8A6B, 0x0F07, 0x8A6C, 0x0F16, 0x8A6D, 0x0F13, 0x8A6E, 0x0F15,

+    0x8A70, 0x0F0C, 0x8A71, 0x0F11, 0x8A72, 0x0F08, 0x8A73, 0x0F09,

+    0x8A74, 0x2595, 0x8A75, 0x2592, 0x8A76, 0x258A, 0x8A77, 0x258F,

+    0x8A79, 0x0F17, 0x8A7A, 0x2596, 0x8A7B, 0x0F18, 0x8A7C, 0x0F0E,

+    0x8A7F, 0x258C, 0x8A81, 0x2594, 0x8A82, 0x2590, 0x8A83, 0x2593,

+    0x8A84, 0x2591, 0x8A85, 0x0F12, 0x8A86, 0x258B, 0x8A87, 0x0F0D,

+    0x8A8B, 0x2805, 0x8A8C, 0x10A6, 0x8A8D, 0x10A9, 0x8A8F, 0x2807,

+    0x8A91, 0x10B1, 0x8A92, 0x2806, 0x8A93, 0x10AB, 0x8A95, 0x1216,

+    0x8A96, 0x2808, 0x8A98, 0x10B0, 0x8A99, 0x2804, 0x8A9A, 0x10B2,

+    0x8A9E, 0x10A7, 0x8AA0, 0x0F10, 0x8AA1, 0x10AA, 0x8AA3, 0x10A8,

+    0x8AA4, 0x10AC, 0x8AA5, 0x10AE, 0x8AA6, 0x10A5, 0x8AA7, 0x10B3,

+    0x8AA8, 0x10AF, 0x8AAA, 0x10AD, 0x8AAB, 0x2803, 0x8AB0, 0x121D,

+    0x8AB2, 0x1219, 0x8AB6, 0x1220, 0x8AB8, 0x2A44, 0x8AB9, 0x1221,

+    0x8ABA, 0x2A50, 0x8ABB, 0x2A49, 0x8ABC, 0x1212, 0x8ABD, 0x2A51,

+    0x8ABE, 0x2A4B, 0x8ABF, 0x121C, 0x8AC0, 0x2A4C, 0x8AC2, 0x121B,

+    0x8AC3, 0x2A4F, 0x8AC4, 0x1215, 0x8AC5, 0x2A4D, 0x8AC6, 0x2A43,

+    0x8AC7, 0x1214, 0x8AC8, 0x2C8F, 0x8AC9, 0x121A, 0x8ACB, 0x1217,

+    0x8ACD, 0x121F, 0x8ACF, 0x2A42, 0x8AD1, 0x2A46, 0x8AD2, 0x1213,

+    0x8AD3, 0x2A45, 0x8AD4, 0x2A47, 0x8AD5, 0x2A48, 0x8AD6, 0x121E,

+    0x8AD7, 0x2A4A, 0x8AD8, 0x2A4E, 0x8AD9, 0x2A52, 0x8ADB, 0x1222,

+    0x8ADC, 0x1352, 0x8ADD, 0x2C8A, 0x8ADE, 0x2C90, 0x8ADF, 0x2C8D,

+    0x8AE0, 0x2C85, 0x8AE1, 0x2C91, 0x8AE2, 0x2C86, 0x8AE4, 0x2C8C,

+    0x8AE6, 0x134D, 0x8AE7, 0x1353, 0x8AE8, 0x2C92, 0x8AEB, 0x134F,

+    0x8AED, 0x1359, 0x8AEE, 0x1354, 0x8AEF, 0x2C94, 0x8AF0, 0x2C8E,

+    0x8AF1, 0x1350, 0x8AF2, 0x2C87, 0x8AF3, 0x135A, 0x8AF4, 0x2C88,

+    0x8AF5, 0x2C89, 0x8AF6, 0x135B, 0x8AF7, 0x1358, 0x8AF8, 0x1218,

+    0x8AFA, 0x134E, 0x8AFB, 0x2C95, 0x8AFC, 0x135C, 0x8AFE, 0x1355,

+    0x8AFF, 0x2C93, 0x8B00, 0x1351, 0x8B01, 0x1356, 0x8B02, 0x1357,

+    0x8B04, 0x147E, 0x8B05, 0x2E5F, 0x8B06, 0x2E68, 0x8B07, 0x2E65,

+    0x8B08, 0x2E67, 0x8B0A, 0x147B, 0x8B0B, 0x2E60, 0x8B0D, 0x2E66,

+    0x8B0E, 0x1477, 0x8B0F, 0x2E62, 0x8B10, 0x147F, 0x8B11, 0x2E5E,

+    0x8B12, 0x2E63, 0x8B13, 0x2E6A, 0x8B14, 0x2C8B, 0x8B15, 0x2E64,

+    0x8B16, 0x2E5D, 0x8B17, 0x1478, 0x8B18, 0x2E5C, 0x8B19, 0x1479,

+    0x8B1A, 0x2E6B, 0x8B1B, 0x147A, 0x8B1C, 0x2E69, 0x8B1D, 0x147D,

+    0x8B1E, 0x2E5B, 0x8B20, 0x147C, 0x8B22, 0x2E61, 0x8B23, 0x2FCE,

+    0x8B24, 0x2FDC, 0x8B25, 0x2FD7, 0x8B26, 0x2FD9, 0x8B27, 0x2FCD,

+    0x8B28, 0x152A, 0x8B2A, 0x2FCC, 0x8B2B, 0x152D, 0x8B2C, 0x152C,

+    0x8B2E, 0x2FDB, 0x8B2F, 0x2FD3, 0x8B30, 0x2FD0, 0x8B31, 0x2FD6,

+    0x8B33, 0x2FCF, 0x8B35, 0x2FD1, 0x8B36, 0x2FDA, 0x8B37, 0x2FD8,

+    0x8B39, 0x152B, 0x8B3A, 0x2FDF, 0x8B3B, 0x2FDD, 0x8B3C, 0x2FD4,

+    0x8B3D, 0x2FDE, 0x8B3E, 0x2FD5, 0x8B40, 0x3125, 0x8B41, 0x15C4,

+    0x8B42, 0x312C, 0x8B45, 0x3313, 0x8B46, 0x15CB, 0x8B47, 0x2FD2,

+    0x8B48, 0x3123, 0x8B49, 0x15C7, 0x8B4A, 0x3124, 0x8B4B, 0x3129,

+    0x8B4E, 0x15C9, 0x8B4F, 0x15CA, 0x8B50, 0x3122, 0x8B51, 0x312B,

+    0x8B52, 0x312D, 0x8B53, 0x3126, 0x8B54, 0x3128, 0x8B55, 0x312A,

+    0x8B56, 0x3127, 0x8B57, 0x312E, 0x8B58, 0x15C6, 0x8B59, 0x15CC,

+    0x8B5A, 0x15C8, 0x8B5C, 0x15C5, 0x8B5D, 0x3237, 0x8B5F, 0x1648,

+    0x8B60, 0x3235, 0x8B63, 0x3239, 0x8B65, 0x323A, 0x8B66, 0x1646,

+    0x8B67, 0x323B, 0x8B68, 0x3238, 0x8B6A, 0x3236, 0x8B6B, 0x1649,

+    0x8B6C, 0x1645, 0x8B6D, 0x323C, 0x8B6F, 0x1647, 0x8B70, 0x1644,

+    0x8B74, 0x168F, 0x8B77, 0x1690, 0x8B78, 0x3312, 0x8B79, 0x3311,

+    0x8B7A, 0x3314, 0x8B7B, 0x3315, 0x8B7D, 0x1691, 0x8B7E, 0x33B6,

+    0x8B7F, 0x33BB, 0x8B80, 0x16D8, 0x8B82, 0x33B8, 0x8B84, 0x33B7,

+    0x8B85, 0x33BA, 0x8B86, 0x33B9, 0x8B88, 0x3440, 0x8B8A, 0x170A,

+    0x8B8B, 0x343F, 0x8B8C, 0x343D, 0x8B8E, 0x343E, 0x8B92, 0x172C,

+    0x8B93, 0x172B, 0x8B94, 0x349C, 0x8B95, 0x349D, 0x8B96, 0x172D,

+    0x8B98, 0x34E7, 0x8B99, 0x34E8, 0x8B9A, 0x1754, 0x8B9C, 0x175A,

+    0x8B9E, 0x3522, 0x8B9F, 0x353F, 0x8C37, 0x050B, 0x8C39, 0x206B,

+    0x8C3B, 0x206C, 0x8C3C, 0x2597, 0x8C3D, 0x2809, 0x8C3E, 0x2A53,

+    0x8C3F, 0x1481, 0x8C41, 0x1480, 0x8C42, 0x2FE0, 0x8C43, 0x312F,

+    0x8C45, 0x3441, 0x8C46, 0x050C, 0x8C47, 0x1E09, 0x8C48, 0x09C9,

+    0x8C49, 0x0BA7, 0x8C4A, 0x2599, 0x8C4B, 0x2598, 0x8C4C, 0x1223,

+    0x8C4D, 0x2A54, 0x8C4E, 0x1224, 0x8C4F, 0x2E6C, 0x8C50, 0x152E,

+    0x8C54, 0x1763, 0x8C55, 0x050D, 0x8C56, 0x1A48, 0x8C57, 0x1E0A,

+    0x8C5A, 0x0BA8, 0x8C5C, 0x206D, 0x8C5D, 0x206E, 0x8C5F, 0x22F8,

+    0x8C61, 0x0D65, 0x8C62, 0x0F1B, 0x8C64, 0x259B, 0x8C65, 0x259A,

+    0x8C66, 0x259C, 0x8C68, 0x280A, 0x8C69, 0x280B, 0x8C6A, 0x10B4,

+    0x8C6B, 0x135D, 0x8C6C, 0x1225, 0x8C6D, 0x135E, 0x8C6F, 0x2E70,

+    0x8C70, 0x2E6D, 0x8C71, 0x2E6F, 0x8C72, 0x2E6E, 0x8C73, 0x1482,

+    0x8C75, 0x2FE1, 0x8C76, 0x3131, 0x8C77, 0x3130, 0x8C78, 0x18E7,

+    0x8C79, 0x09CB, 0x8C7A, 0x09CA, 0x8C7B, 0x1E0B, 0x8C7D, 0x206F,

+    0x8C80, 0x22FA, 0x8C81, 0x22F9, 0x8C82, 0x0D66, 0x8C84, 0x259E,

+    0x8C85, 0x259F, 0x8C86, 0x259D, 0x8C89, 0x0F1D, 0x8C8A, 0x0F1C,

+    0x8C8C, 0x10B6, 0x8C8D, 0x10B5, 0x8C8F, 0x2A55, 0x8C90, 0x2C98,

+    0x8C91, 0x2C96, 0x8C92, 0x2C97, 0x8C93, 0x135F, 0x8C94, 0x2E72,

+    0x8C95, 0x2E71, 0x8C97, 0x2FE4, 0x8C98, 0x2FE3, 0x8C99, 0x2FE2,

+    0x8C9A, 0x3132, 0x8C9C, 0x3523, 0x8C9D, 0x050E, 0x8C9E, 0x080A,

+    0x8CA0, 0x080B, 0x8CA1, 0x09CC, 0x8CA2, 0x09CD, 0x8CA3, 0x1E0D,

+    0x8CA4, 0x1E0C, 0x8CA5, 0x2070, 0x8CA7, 0x0BAE, 0x8CA8, 0x0BAC,

+    0x8CA9, 0x0BA9, 0x8CAA, 0x0BAD, 0x8CAB, 0x0BAB, 0x8CAC, 0x0BAA,

+    0x8CAF, 0x0D67, 0x8CB0, 0x22FD, 0x8CB2, 0x0F22, 0x8CB3, 0x0D69,

+    0x8CB4, 0x0D6E, 0x8CB5, 0x22FF, 0x8CB6, 0x0D70, 0x8CB7, 0x0D6F,

+    0x8CB8, 0x0D72, 0x8CB9, 0x22FE, 0x8CBA, 0x22FB, 0x8CBB, 0x0D6C,

+    0x8CBC, 0x0D68, 0x8CBD, 0x0D6A, 0x8CBE, 0x22FC, 0x8CBF, 0x0D71,

+    0x8CC0, 0x0D6D, 0x8CC1, 0x0D6B, 0x8CC2, 0x0F24, 0x8CC3, 0x0F23,

+    0x8CC4, 0x0F21, 0x8CC5, 0x0F25, 0x8CC7, 0x0F1F, 0x8CC8, 0x0F20,

+    0x8CCA, 0x0F1E, 0x8CCC, 0x25A0, 0x8CCF, 0x280D, 0x8CD1, 0x10B8,

+    0x8CD2, 0x10B9, 0x8CD3, 0x10B7, 0x8CD5, 0x280C, 0x8CD7, 0x280E,

+    0x8CD9, 0x2A58, 0x8CDA, 0x2A5A, 0x8CDC, 0x122E, 0x8CDD, 0x2A5B,

+    0x8CDE, 0x1227, 0x8CDF, 0x2A57, 0x8CE0, 0x1226, 0x8CE1, 0x1230,

+    0x8CE2, 0x122C, 0x8CE3, 0x122D, 0x8CE4, 0x1229, 0x8CE5, 0x2A56,

+    0x8CE6, 0x1228, 0x8CE7, 0x2A5C, 0x8CE8, 0x2A59, 0x8CEA, 0x122F,

+    0x8CEC, 0x122A, 0x8CED, 0x122B, 0x8CEE, 0x2C9A, 0x8CF0, 0x2C9C,

+    0x8CF1, 0x2C9B, 0x8CF3, 0x2C9D, 0x8CF4, 0x1360, 0x8CF5, 0x2C99,

+    0x8CF8, 0x1486, 0x8CF9, 0x2E73, 0x8CFA, 0x1483, 0x8CFB, 0x1487,

+    0x8CFC, 0x1485, 0x8CFD, 0x1484, 0x8CFE, 0x2FE5, 0x8D00, 0x2FE8,

+    0x8D02, 0x2FE7, 0x8D04, 0x2FE6, 0x8D05, 0x152F, 0x8D06, 0x3133,

+    0x8D07, 0x3134, 0x8D08, 0x15CD, 0x8D09, 0x3135, 0x8D0A, 0x15CE,

+    0x8D0D, 0x164B, 0x8D0F, 0x164A, 0x8D10, 0x3316, 0x8D13, 0x1692,

+    0x8D14, 0x3317, 0x8D15, 0x33BC, 0x8D16, 0x16D9, 0x8D17, 0x16DA,

+    0x8D19, 0x3442, 0x8D1B, 0x172F, 0x8D64, 0x050F, 0x8D66, 0x0BB0,

+    0x8D67, 0x0BAF, 0x8D68, 0x25A1, 0x8D69, 0x25A2, 0x8D6B, 0x10BA,

+    0x8D6C, 0x2C9E, 0x8D6D, 0x1231, 0x8D6E, 0x2C9F, 0x8D6F, 0x2E74,

+    0x8D70, 0x0510, 0x8D72, 0x1C06, 0x8D73, 0x080D, 0x8D74, 0x080C,

+    0x8D76, 0x1E0E, 0x8D77, 0x09CE, 0x8D78, 0x1E0F, 0x8D79, 0x2073,

+    0x8D7B, 0x2072, 0x8D7D, 0x2071, 0x8D80, 0x2301, 0x8D81, 0x0D75,

+    0x8D84, 0x2300, 0x8D85, 0x0D74, 0x8D89, 0x2302, 0x8D8A, 0x0D73,

+    0x8D8C, 0x25A4, 0x8D8D, 0x25A7, 0x8D8E, 0x25A5, 0x8D8F, 0x25A6,

+    0x8D90, 0x25AA, 0x8D91, 0x25A3, 0x8D92, 0x25AB, 0x8D93, 0x25A8,

+    0x8D94, 0x25A9, 0x8D95, 0x10BC, 0x8D96, 0x280F, 0x8D99, 0x10BB,

+    0x8D9B, 0x2A60, 0x8D9C, 0x2A5E, 0x8D9F, 0x1232, 0x8DA0, 0x2A5D,

+    0x8DA1, 0x2A5F, 0x8DA3, 0x1233, 0x8DA5, 0x2CA0, 0x8DA7, 0x2CA1,

+    0x8DA8, 0x1488, 0x8DAA, 0x3137, 0x8DAB, 0x3139, 0x8DAC, 0x3136,

+    0x8DAD, 0x3138, 0x8DAE, 0x323D, 0x8DAF, 0x3318, 0x8DB2, 0x3509,

+    0x8DB3, 0x0511, 0x8DB4, 0x080E, 0x8DB5, 0x1E10, 0x8DB6, 0x1E12,

+    0x8DB7, 0x1E11, 0x8DB9, 0x2076, 0x8DBA, 0x0BB2, 0x8DBC, 0x2074,

+    0x8DBE, 0x0BB1, 0x8DBF, 0x2077, 0x8DC1, 0x2078, 0x8DC2, 0x2075,

+    0x8DC5, 0x230E, 0x8DC6, 0x0D7D, 0x8DC7, 0x2306, 0x8DC8, 0x230C,

+    0x8DCB, 0x0D78, 0x8DCC, 0x0D7B, 0x8DCD, 0x2305, 0x8DCE, 0x0D76,

+    0x8DCF, 0x2309, 0x8DD0, 0x25B1, 0x8DD1, 0x0D7A, 0x8DD3, 0x2304,

+    0x8DD5, 0x230A, 0x8DD6, 0x2307, 0x8DD7, 0x230D, 0x8DD8, 0x2303,

+    0x8DD9, 0x230B, 0x8DDA, 0x0D79, 0x8DDB, 0x0D7C, 0x8DDC, 0x2308,

+    0x8DDD, 0x0D77, 0x8DDF, 0x0F27, 0x8DE0, 0x25AD, 0x8DE1, 0x0F26,

+    0x8DE2, 0x25B4, 0x8DE3, 0x25B3, 0x8DE4, 0x0F2D, 0x8DE6, 0x0F2E,

+    0x8DE7, 0x25B5, 0x8DE8, 0x0F28, 0x8DE9, 0x25B2, 0x8DEA, 0x0F2C,

+    0x8DEB, 0x25B7, 0x8DEC, 0x25AE, 0x8DEE, 0x25B0, 0x8DEF, 0x0F29,

+    0x8DF0, 0x25AC, 0x8DF1, 0x25AF, 0x8DF2, 0x25B6, 0x8DF3, 0x0F2A,

+    0x8DF4, 0x25B8, 0x8DFA, 0x0F2B, 0x8DFC, 0x10BD, 0x8DFD, 0x2814,

+    0x8DFE, 0x281A, 0x8DFF, 0x2812, 0x8E00, 0x281B, 0x8E02, 0x2811,

+    0x8E03, 0x2816, 0x8E04, 0x281C, 0x8E05, 0x2819, 0x8E06, 0x2818,

+    0x8E07, 0x2817, 0x8E09, 0x2810, 0x8E0A, 0x2815, 0x8E0D, 0x2813,

+    0x8E0F, 0x1238, 0x8E10, 0x1235, 0x8E11, 0x2A69, 0x8E12, 0x2A6E,

+    0x8E13, 0x2A70, 0x8E14, 0x2A6D, 0x8E15, 0x2A66, 0x8E16, 0x2A68,

+    0x8E17, 0x2A72, 0x8E18, 0x2A6F, 0x8E19, 0x2A6A, 0x8E1A, 0x2A73,

+    0x8E1B, 0x2A67, 0x8E1C, 0x2A71, 0x8E1D, 0x1236, 0x8E1E, 0x123C,

+    0x8E1F, 0x123A, 0x8E20, 0x2A61, 0x8E21, 0x123B, 0x8E22, 0x1237,

+    0x8E23, 0x2A62, 0x8E24, 0x2A64, 0x8E25, 0x2A63, 0x8E26, 0x2A6B,

+    0x8E27, 0x2A6C, 0x8E29, 0x1239, 0x8E2B, 0x1234, 0x8E2E, 0x2A65,

+    0x8E30, 0x2CAB, 0x8E31, 0x1362, 0x8E33, 0x2CA2, 0x8E34, 0x1363,

+    0x8E35, 0x1366, 0x8E36, 0x2CA7, 0x8E38, 0x2CA4, 0x8E39, 0x1365,

+    0x8E3C, 0x2CA8, 0x8E3D, 0x2CA9, 0x8E3E, 0x2CA3, 0x8E3F, 0x2CAC,

+    0x8E40, 0x2CA5, 0x8E41, 0x2CAA, 0x8E42, 0x1364, 0x8E44, 0x1361,

+    0x8E45, 0x2CA6, 0x8E47, 0x2E7A, 0x8E48, 0x148B, 0x8E49, 0x1489,

+    0x8E4A, 0x148C, 0x8E4B, 0x148A, 0x8E4C, 0x2E79, 0x8E4D, 0x2E76,

+    0x8E4E, 0x2E75, 0x8E50, 0x2E78, 0x8E53, 0x2E77, 0x8E54, 0x2FF6,

+    0x8E55, 0x1535, 0x8E56, 0x2FED, 0x8E57, 0x2FEC, 0x8E59, 0x1530,

+    0x8E5A, 0x2FF2, 0x8E5B, 0x2FF1, 0x8E5C, 0x2FE9, 0x8E5D, 0x2FF4,

+    0x8E5E, 0x2FEE, 0x8E5F, 0x1534, 0x8E60, 0x2FEB, 0x8E61, 0x2FF3,

+    0x8E62, 0x2FEA, 0x8E63, 0x1531, 0x8E64, 0x1533, 0x8E65, 0x2FEF,

+    0x8E66, 0x1532, 0x8E67, 0x2FF0, 0x8E69, 0x2FF5, 0x8E6A, 0x313D,

+    0x8E6C, 0x15D3, 0x8E6D, 0x313A, 0x8E6F, 0x313E, 0x8E72, 0x15D0,

+    0x8E73, 0x313C, 0x8E74, 0x15D5, 0x8E76, 0x15D2, 0x8E78, 0x313B,

+    0x8E7A, 0x15D4, 0x8E7B, 0x313F, 0x8E7C, 0x15CF, 0x8E81, 0x164D,

+    0x8E82, 0x164F, 0x8E84, 0x3240, 0x8E85, 0x164E, 0x8E86, 0x323E,

+    0x8E87, 0x15D1, 0x8E88, 0x323F, 0x8E89, 0x164C, 0x8E8A, 0x1693,

+    0x8E8B, 0x1695, 0x8E8C, 0x331A, 0x8E8D, 0x1694, 0x8E8E, 0x3319,

+    0x8E90, 0x33C1, 0x8E91, 0x16DB, 0x8E92, 0x33C0, 0x8E93, 0x16DC,

+    0x8E94, 0x33BE, 0x8E95, 0x33BD, 0x8E96, 0x33C2, 0x8E97, 0x33C3,

+    0x8E98, 0x3443, 0x8E9A, 0x33BF, 0x8E9D, 0x34A1, 0x8E9E, 0x349E,

+    0x8E9F, 0x349F, 0x8EA0, 0x34A0, 0x8EA1, 0x1749, 0x8EA3, 0x34EB,

+    0x8EA4, 0x34EA, 0x8EA5, 0x34E9, 0x8EA6, 0x350A, 0x8EA8, 0x3537,

+    0x8EA9, 0x3524, 0x8EAA, 0x175B, 0x8EAB, 0x0512, 0x8EAC, 0x09CF,

+    0x8EB2, 0x0F2F, 0x8EBA, 0x123D, 0x8EBD, 0x2CAD, 0x8EC0, 0x1536,

+    0x8EC2, 0x3140, 0x8EC9, 0x3525, 0x8ECA, 0x0513, 0x8ECB, 0x068D,

+    0x8ECC, 0x0810, 0x8ECD, 0x080F, 0x8ECF, 0x09D2, 0x8ED1, 0x1E13,

+    0x8ED2, 0x09D0, 0x8ED3, 0x1E14, 0x8ED4, 0x09D1, 0x8ED7, 0x207D,

+    0x8ED8, 0x2079, 0x8EDB, 0x0BB3, 0x8EDC, 0x207C, 0x8EDD, 0x207B,

+    0x8EDE, 0x207A, 0x8EDF, 0x0BB4, 0x8EE0, 0x207E, 0x8EE1, 0x207F,

+    0x8EE5, 0x2315, 0x8EE6, 0x2313, 0x8EE7, 0x2317, 0x8EE8, 0x2318,

+    0x8EE9, 0x231E, 0x8EEB, 0x231A, 0x8EEC, 0x231C, 0x8EEE, 0x2314,

+    0x8EEF, 0x230F, 0x8EF1, 0x231B, 0x8EF4, 0x231D, 0x8EF5, 0x2316,

+    0x8EF6, 0x2319, 0x8EF7, 0x2310, 0x8EF8, 0x0D7F, 0x8EF9, 0x2312,

+    0x8EFA, 0x2311, 0x8EFB, 0x0D7E, 0x8EFC, 0x0D80, 0x8EFE, 0x0F32,

+    0x8EFF, 0x25BA, 0x8F00, 0x25BC, 0x8F01, 0x25BB, 0x8F02, 0x25C0,

+    0x8F03, 0x0F30, 0x8F05, 0x25BD, 0x8F06, 0x25B9, 0x8F07, 0x25BE,

+    0x8F08, 0x25BF, 0x8F09, 0x0F31, 0x8F0A, 0x0F33, 0x8F0B, 0x25C1,

+    0x8F0D, 0x2820, 0x8F0E, 0x281F, 0x8F10, 0x281D, 0x8F11, 0x281E,

+    0x8F12, 0x10BF, 0x8F13, 0x10C1, 0x8F14, 0x10BE, 0x8F15, 0x10C0,

+    0x8F16, 0x2A7A, 0x8F17, 0x2A7B, 0x8F18, 0x2A76, 0x8F1A, 0x2A77,

+    0x8F1B, 0x123F, 0x8F1C, 0x1244, 0x8F1D, 0x123E, 0x8F1E, 0x1245,

+    0x8F1F, 0x1240, 0x8F20, 0x2A78, 0x8F23, 0x2A79, 0x8F24, 0x2A75,

+    0x8F25, 0x1246, 0x8F26, 0x1242, 0x8F29, 0x1241, 0x8F2A, 0x1243,

+    0x8F2C, 0x2A74, 0x8F2E, 0x2CAF, 0x8F2F, 0x1368, 0x8F32, 0x2CB1,

+    0x8F33, 0x136A, 0x8F34, 0x2CB4, 0x8F35, 0x2CB0, 0x8F36, 0x2CAE,

+    0x8F37, 0x2CB3, 0x8F38, 0x1369, 0x8F39, 0x2CB2, 0x8F3B, 0x1367,

+    0x8F3E, 0x148E, 0x8F3F, 0x1491, 0x8F40, 0x2E7C, 0x8F42, 0x148F,

+    0x8F43, 0x2E7B, 0x8F44, 0x148D, 0x8F45, 0x1490, 0x8F46, 0x2FF7,

+    0x8F47, 0x2FF8, 0x8F48, 0x2FF9, 0x8F49, 0x1537, 0x8F4B, 0x2FFA,

+    0x8F4D, 0x1538, 0x8F4E, 0x15D7, 0x8F4F, 0x3143, 0x8F50, 0x3144,

+    0x8F51, 0x3142, 0x8F52, 0x3141, 0x8F53, 0x3145, 0x8F54, 0x15D6,

+    0x8F55, 0x3244, 0x8F56, 0x3242, 0x8F57, 0x3243, 0x8F58, 0x3245,

+    0x8F59, 0x3241, 0x8F5A, 0x3246, 0x8F5B, 0x331C, 0x8F5D, 0x331D,

+    0x8F5E, 0x331B, 0x8F5F, 0x1696, 0x8F60, 0x33C4, 0x8F61, 0x16DD,

+    0x8F62, 0x33C5, 0x8F63, 0x3445, 0x8F64, 0x3444, 0x8F9B, 0x0514,

+    0x8F9C, 0x0D81, 0x8F9F, 0x0F34, 0x8FA3, 0x10C2, 0x8FA6, 0x136C,

+    0x8FA8, 0x136B, 0x8FAD, 0x15D8, 0x8FAE, 0x162F, 0x8FAF, 0x1697,

+    0x8FB0, 0x0515, 0x8FB1, 0x09D3, 0x8FB2, 0x0F35, 0x8FB4, 0x3146,

+    0x8FB5, 0x0230, 0x8FBF, 0x18E9, 0x8FC2, 0x0516, 0x8FC4, 0x0519,

+    0x8FC5, 0x0518, 0x8FC6, 0x0517, 0x8FC9, 0x18E8, 0x8FCB, 0x1A4A,

+    0x8FCD, 0x1A4C, 0x8FCE, 0x068E, 0x8FD1, 0x0690, 0x8FD2, 0x1A49,

+    0x8FD3, 0x1A4B, 0x8FD4, 0x068F, 0x8FD5, 0x1A4E, 0x8FD6, 0x1A4D,

+    0x8FD7, 0x1A4F, 0x8FE0, 0x1C0A, 0x8FE1, 0x1C08, 0x8FE2, 0x0813,

+    0x8FE3, 0x1C07, 0x8FE4, 0x0818, 0x8FE5, 0x0815, 0x8FE6, 0x0812,

+    0x8FE8, 0x0819, 0x8FEA, 0x0814, 0x8FEB, 0x0817, 0x8FED, 0x0816,

+    0x8FEE, 0x1C09, 0x8FF0, 0x0811, 0x8FF4, 0x09D9, 0x8FF5, 0x1E16,

+    0x8FF6, 0x1E1C, 0x8FF7, 0x09D6, 0x8FF8, 0x09DD, 0x8FFA, 0x09D8,

+    0x8FFB, 0x1E19, 0x8FFC, 0x1E1B, 0x8FFD, 0x09DB, 0x8FFE, 0x1E15,

+    0x8FFF, 0x1E18, 0x9000, 0x09D7, 0x9001, 0x09D4, 0x9002, 0x1E17,

+    0x9003, 0x09DA, 0x9004, 0x1E1A, 0x9005, 0x09DC, 0x9006, 0x09D5,

+    0x900B, 0x2081, 0x900C, 0x2084, 0x900D, 0x0BB6, 0x900F, 0x0BC0,

+    0x9010, 0x0BBC, 0x9011, 0x2082, 0x9014, 0x0BC4, 0x9015, 0x0BBD,

+    0x9016, 0x0BC2, 0x9017, 0x0BB8, 0x9019, 0x0BB5, 0x901A, 0x0BB7,

+    0x901B, 0x0BC3, 0x901C, 0x2083, 0x901D, 0x0BBB, 0x901E, 0x0BBE,

+    0x901F, 0x0BBA, 0x9020, 0x0BBF, 0x9021, 0x2085, 0x9022, 0x0BC1,

+    0x9023, 0x0BB9, 0x9024, 0x2080, 0x902D, 0x231F, 0x902E, 0x0D82,

+    0x902F, 0x2321, 0x9031, 0x0D84, 0x9032, 0x0D86, 0x9034, 0x2320,

+    0x9035, 0x0D83, 0x9036, 0x0D87, 0x9038, 0x0D85, 0x903C, 0x0F3B,

+    0x903D, 0x25C6, 0x903E, 0x0F43, 0x903F, 0x25C3, 0x9041, 0x0F44,

+    0x9042, 0x0F39, 0x9044, 0x25C4, 0x9047, 0x0F3E, 0x9049, 0x25C5,

+    0x904A, 0x0F37, 0x904B, 0x0F36, 0x904D, 0x0F41, 0x904E, 0x0F40,

+    0x904F, 0x0F3F, 0x9050, 0x0F3D, 0x9051, 0x0F42, 0x9052, 0x25C2,

+    0x9053, 0x0F38, 0x9054, 0x0F3A, 0x9055, 0x0F3C, 0x9058, 0x10C4,

+    0x9059, 0x10C7, 0x905B, 0x10CB, 0x905C, 0x10C5, 0x905D, 0x10CA,

+    0x905E, 0x10C8, 0x9060, 0x10C3, 0x9062, 0x10C9, 0x9063, 0x10C6,

+    0x9067, 0x2A7F, 0x9068, 0x1249, 0x9069, 0x1247, 0x906B, 0x2A80,

+    0x906D, 0x124A, 0x906E, 0x1248, 0x906F, 0x2A7E, 0x9070, 0x2A7D,

+    0x9072, 0x1370, 0x9073, 0x2A7C, 0x9074, 0x136E, 0x9075, 0x136D,

+    0x9076, 0x2CB5, 0x9077, 0x124B, 0x9078, 0x136F, 0x9079, 0x2CB6,

+    0x907A, 0x1372, 0x907B, 0x2CB7, 0x907C, 0x1371, 0x907D, 0x1493,

+    0x907E, 0x2E7E, 0x907F, 0x1492, 0x9080, 0x1497, 0x9081, 0x1495,

+    0x9082, 0x1496, 0x9083, 0x153A, 0x9084, 0x1494, 0x9085, 0x2E7D,

+    0x9086, 0x2CB8, 0x9087, 0x1539, 0x9088, 0x153B, 0x908A, 0x15D9,

+    0x908B, 0x15DA, 0x908D, 0x3247, 0x908F, 0x170C, 0x9090, 0x170B,

+    0x9091, 0x051B, 0x9094, 0x181E, 0x9095, 0x09DE, 0x9097, 0x181B,

+    0x9098, 0x181C, 0x9099, 0x181A, 0x909B, 0x181D, 0x909E, 0x18ED,

+    0x909F, 0x18EA, 0x90A0, 0x18EF, 0x90A1, 0x18EB, 0x90A2, 0x051C,

+    0x90A3, 0x051F, 0x90A5, 0x18EC, 0x90A6, 0x051E, 0x90A7, 0x18EE,

+    0x90AA, 0x051D, 0x90AF, 0x1A52, 0x90B0, 0x1A54, 0x90B1, 0x0693,

+    0x90B2, 0x1A50, 0x90B3, 0x1A53, 0x90B4, 0x1A51, 0x90B5, 0x0691,

+    0x90B6, 0x0694, 0x90B8, 0x0692, 0x90BD, 0x1C0C, 0x90BE, 0x1C10,

+    0x90BF, 0x1C0D, 0x90C1, 0x081C, 0x90C3, 0x081D, 0x90C5, 0x1C0F,

+    0x90C7, 0x1C11, 0x90C8, 0x1C13, 0x90CA, 0x081A, 0x90CB, 0x1C12,

+    0x90CE, 0x081B, 0x90D4, 0x208C, 0x90D5, 0x1C0E, 0x90D6, 0x1E1D,

+    0x90D7, 0x1E26, 0x90D8, 0x1E24, 0x90D9, 0x1E1F, 0x90DA, 0x1E20,

+    0x90DB, 0x1E25, 0x90DC, 0x1E27, 0x90DD, 0x09E0, 0x90DF, 0x1E22,

+    0x90E0, 0x1E1E, 0x90E1, 0x09DF, 0x90E2, 0x09E1, 0x90E3, 0x1E21,

+    0x90E4, 0x1E28, 0x90E5, 0x1E23, 0x90E8, 0x0BC5, 0x90E9, 0x208F,

+    0x90EA, 0x2087, 0x90EB, 0x208D, 0x90EC, 0x208E, 0x90ED, 0x0BC6,

+    0x90EF, 0x2086, 0x90F0, 0x2088, 0x90F1, 0x1C0B, 0x90F2, 0x208A,

+    0x90F3, 0x208B, 0x90F4, 0x2089, 0x90F5, 0x0D89, 0x90F9, 0x2328,

+    0x90FA, 0x2CB9, 0x90FB, 0x2329, 0x90FC, 0x2326, 0x90FD, 0x0BC7,

+    0x90FE, 0x0D8B, 0x90FF, 0x2325, 0x9100, 0x232B, 0x9101, 0x232A,

+    0x9102, 0x0D88, 0x9103, 0x232E, 0x9104, 0x2324, 0x9105, 0x232D,

+    0x9106, 0x2322, 0x9107, 0x232C, 0x9108, 0x2327, 0x9109, 0x0D8A,

+    0x910B, 0x25CD, 0x910D, 0x25C8, 0x910E, 0x25CE, 0x910F, 0x25C9,

+    0x9110, 0x25C7, 0x9111, 0x25CA, 0x9112, 0x0F45, 0x9114, 0x25CC,

+    0x9116, 0x25CB, 0x9117, 0x0F46, 0x9118, 0x10CD, 0x9119, 0x10CC,

+    0x911A, 0x2827, 0x911B, 0x282A, 0x911C, 0x2822, 0x911D, 0x2826,

+    0x911E, 0x10CE, 0x911F, 0x2825, 0x9120, 0x2823, 0x9121, 0x2829,

+    0x9122, 0x2824, 0x9123, 0x2821, 0x9124, 0x2828, 0x9126, 0x2A86,

+    0x9127, 0x124E, 0x9128, 0x2FFB, 0x9129, 0x2A83, 0x912A, 0x2A84,

+    0x912B, 0x2A82, 0x912C, 0x2323, 0x912D, 0x124D, 0x912E, 0x2A87,

+    0x912F, 0x2A81, 0x9130, 0x124C, 0x9131, 0x124F, 0x9132, 0x2A85,

+    0x9133, 0x2CBA, 0x9134, 0x1373, 0x9135, 0x2CBB, 0x9136, 0x2CBC,

+    0x9138, 0x2E7F, 0x9139, 0x1498, 0x913A, 0x2FFC, 0x913B, 0x2FFD,

+    0x913E, 0x2FFE, 0x913F, 0x3148, 0x9140, 0x3147, 0x9141, 0x3249,

+    0x9143, 0x3248, 0x9144, 0x331F, 0x9145, 0x3320, 0x9146, 0x331E,

+    0x9147, 0x33C6, 0x9148, 0x16DE, 0x9149, 0x0520, 0x914A, 0x081F,

+    0x914B, 0x081E, 0x914C, 0x09E4, 0x914D, 0x09E3, 0x914E, 0x1E2A,

+    0x914F, 0x1E2B, 0x9150, 0x1E29, 0x9152, 0x09E2, 0x9153, 0x2093,

+    0x9155, 0x2094, 0x9156, 0x2090, 0x9157, 0x0BC8, 0x9158, 0x2091,

+    0x915A, 0x2092, 0x915F, 0x2331, 0x9160, 0x2333, 0x9161, 0x232F,

+    0x9162, 0x2332, 0x9163, 0x0D8C, 0x9164, 0x2330, 0x9165, 0x0D8D,

+    0x9168, 0x23E2, 0x9169, 0x0F49, 0x916A, 0x0F48, 0x916C, 0x0F47,

+    0x916E, 0x25CF, 0x916F, 0x25D0, 0x9172, 0x282C, 0x9173, 0x282E,

+    0x9174, 0x10D2, 0x9175, 0x10CF, 0x9177, 0x10D1, 0x9178, 0x10D0,

+    0x9179, 0x282D, 0x917A, 0x282B, 0x9180, 0x2A8E, 0x9181, 0x2A8B,

+    0x9182, 0x2A8C, 0x9183, 0x1253, 0x9184, 0x2A8D, 0x9185, 0x2A88,

+    0x9186, 0x2A89, 0x9187, 0x1250, 0x9189, 0x1251, 0x918A, 0x2A8A,

+    0x918B, 0x1252, 0x918D, 0x2CC0, 0x918F, 0x2CC1, 0x9190, 0x2CBE,

+    0x9191, 0x2CBF, 0x9192, 0x1374, 0x9193, 0x2CBD, 0x9199, 0x2E83,

+    0x919A, 0x2E80, 0x919B, 0x2E82, 0x919C, 0x149B, 0x919D, 0x2E86,

+    0x919E, 0x149A, 0x919F, 0x2E84, 0x91A0, 0x2E87, 0x91A1, 0x2E85,

+    0x91A2, 0x2E81, 0x91A3, 0x1499, 0x91A5, 0x3000, 0x91A7, 0x3001,

+    0x91A8, 0x2FFF, 0x91AA, 0x3003, 0x91AB, 0x153C, 0x91AC, 0x153D,

+    0x91AD, 0x314A, 0x91AE, 0x15DC, 0x91AF, 0x3002, 0x91B0, 0x3149,

+    0x91B1, 0x15DB, 0x91B2, 0x324C, 0x91B3, 0x324D, 0x91B4, 0x1650,

+    0x91B5, 0x324B, 0x91B7, 0x324A, 0x91B9, 0x3321, 0x91BA, 0x1698,

+    0x91BC, 0x3446, 0x91BD, 0x34A3, 0x91BE, 0x34A2, 0x91C0, 0x1730,

+    0x91C1, 0x174A, 0x91C2, 0x34A4, 0x91C3, 0x350B, 0x91C5, 0x175C,

+    0x91C6, 0x0521, 0x91C7, 0x0695, 0x91C9, 0x0F4A, 0x91CB, 0x1651,

+    0x91CC, 0x0522, 0x91CD, 0x0820, 0x91CE, 0x0BC9, 0x91CF, 0x0D8E,

+    0x91D0, 0x153E, 0x91D1, 0x0696, 0x91D3, 0x1C15, 0x91D4, 0x1C14,

+    0x91D5, 0x1E2C, 0x91D7, 0x09E7, 0x91D8, 0x09E5, 0x91D9, 0x09E9,

+    0x91DA, 0x1E2E, 0x91DC, 0x09E8, 0x91DD, 0x09E6, 0x91E2, 0x1E2D,

+    0x91E3, 0x0BCC, 0x91E4, 0x209A, 0x91E6, 0x0BCB, 0x91E7, 0x0BCD,

+    0x91E8, 0x209F, 0x91E9, 0x0BCF, 0x91EA, 0x209C, 0x91EB, 0x209D,

+    0x91EC, 0x2095, 0x91ED, 0x0BCE, 0x91EE, 0x20A0, 0x91F1, 0x2097,

+    0x91F3, 0x2098, 0x91F4, 0x2096, 0x91F5, 0x0BCA, 0x91F7, 0x209E,

+    0x91F8, 0x2099, 0x91F9, 0x209B, 0x91FD, 0x233F, 0x91FF, 0x233E,

+    0x9200, 0x233C, 0x9201, 0x2334, 0x9202, 0x2343, 0x9203, 0x2337,

+    0x9204, 0x2341, 0x9205, 0x2348, 0x9206, 0x2340, 0x9207, 0x0D96,

+    0x9209, 0x0D92, 0x920A, 0x2335, 0x920C, 0x233B, 0x920D, 0x0D94,

+    0x920F, 0x233A, 0x9210, 0x0D95, 0x9211, 0x0D97, 0x9212, 0x233D,

+    0x9214, 0x0D8F, 0x9215, 0x0D90, 0x9216, 0x2349, 0x9217, 0x2347,

+    0x9219, 0x2346, 0x921A, 0x2338, 0x921C, 0x2344, 0x921E, 0x0D93,

+    0x9223, 0x0D91, 0x9224, 0x2345, 0x9225, 0x2336, 0x9226, 0x2339,

+    0x9227, 0x2342, 0x922D, 0x2851, 0x922E, 0x25DA, 0x9230, 0x25D3,

+    0x9231, 0x25E6, 0x9232, 0x25EF, 0x9233, 0x25D6, 0x9234, 0x0F55,

+    0x9236, 0x25E3, 0x9237, 0x0F4B, 0x9238, 0x0F4D, 0x9239, 0x0F59,

+    0x923A, 0x25D4, 0x923D, 0x0F4E, 0x923E, 0x0F50, 0x923F, 0x0F5A,

+    0x9240, 0x0F4F, 0x9245, 0x0F58, 0x9246, 0x25DC, 0x9248, 0x25D1,

+    0x9249, 0x0F56, 0x924A, 0x25DB, 0x924B, 0x0F52, 0x924C, 0x25ED,

+    0x924D, 0x0F57, 0x924E, 0x25EB, 0x924F, 0x25DF, 0x9250, 0x25E9,

+    0x9251, 0x0F54, 0x9252, 0x25D2, 0x9253, 0x25EC, 0x9254, 0x25E7,

+    0x9256, 0x25EE, 0x9257, 0x0F4C, 0x925A, 0x0F5B, 0x925B, 0x0F51,

+    0x925E, 0x25D8, 0x9260, 0x25E0, 0x9261, 0x25E4, 0x9263, 0x25E8,

+    0x9264, 0x0F53, 0x9265, 0x25D7, 0x9266, 0x25D5, 0x9267, 0x25E1,

+    0x926C, 0x25DE, 0x926D, 0x25DD, 0x926F, 0x25E2, 0x9270, 0x25E5,

+    0x9272, 0x25EA, 0x9276, 0x2831, 0x9278, 0x10D3, 0x9279, 0x283B,

+    0x927A, 0x2833, 0x927B, 0x10D9, 0x927C, 0x10DD, 0x927D, 0x2844,

+    0x927E, 0x284C, 0x927F, 0x283D, 0x9280, 0x10D5, 0x9282, 0x2841,

+    0x9283, 0x25D9, 0x9285, 0x10D6, 0x9286, 0x2848, 0x9287, 0x284D,

+    0x9288, 0x2845, 0x928A, 0x2847, 0x928B, 0x2850, 0x928C, 0x2849,

+    0x928D, 0x2837, 0x928E, 0x2840, 0x9291, 0x10DE, 0x9293, 0x10DA,

+    0x9294, 0x2835, 0x9295, 0x2842, 0x9296, 0x10D8, 0x9297, 0x283C,

+    0x9298, 0x10D7, 0x9299, 0x284A, 0x929A, 0x2839, 0x929B, 0x2832,

+    0x929C, 0x10DB, 0x929D, 0x284F, 0x92A0, 0x2834, 0x92A1, 0x2846,

+    0x92A2, 0x2843, 0x92A3, 0x283E, 0x92A4, 0x2830, 0x92A5, 0x282F,

+    0x92A6, 0x2838, 0x92A7, 0x284B, 0x92A8, 0x10DC, 0x92A9, 0x284E,

+    0x92AA, 0x2836, 0x92AB, 0x283A, 0x92AC, 0x10D4, 0x92B2, 0x125F,

+    0x92B3, 0x125A, 0x92B4, 0x2AB0, 0x92B5, 0x2AAC, 0x92B6, 0x2A94,

+    0x92B7, 0x1256, 0x92B9, 0x36E9, 0x92BB, 0x1255, 0x92BC, 0x125B,

+    0x92C0, 0x2A92, 0x92C1, 0x1259, 0x92C2, 0x2A9E, 0x92C3, 0x2A90,

+    0x92C4, 0x2A91, 0x92C5, 0x1254, 0x92C6, 0x2AAF, 0x92C7, 0x125D,

+    0x92C8, 0x2AA1, 0x92C9, 0x2AA6, 0x92CA, 0x2AA0, 0x92CB, 0x2CD3,

+    0x92CC, 0x2A9C, 0x92CD, 0x2AA4, 0x92CE, 0x2AA2, 0x92CF, 0x2A95,

+    0x92D0, 0x2A8F, 0x92D1, 0x2AAA, 0x92D2, 0x125C, 0x92D3, 0x2AAB,

+    0x92D5, 0x2AA5, 0x92D7, 0x2A9A, 0x92D8, 0x2A98, 0x92D9, 0x2A93,

+    0x92DD, 0x2A9B, 0x92DE, 0x2AA8, 0x92DF, 0x2A97, 0x92E0, 0x2AA7,

+    0x92E1, 0x2AAD, 0x92E4, 0x1258, 0x92E6, 0x2AA3, 0x92E7, 0x2AA9,

+    0x92E8, 0x2A9F, 0x92E9, 0x2A99, 0x92EA, 0x1257, 0x92EE, 0x283F,

+    0x92EF, 0x2A9D, 0x92F0, 0x125E, 0x92F1, 0x2A96, 0x92F7, 0x2CD8,

+    0x92F8, 0x1377, 0x92F9, 0x2CD7, 0x92FA, 0x2CD5, 0x92FB, 0x2CE7,

+    0x92FC, 0x137B, 0x92FE, 0x2CE4, 0x92FF, 0x2CDC, 0x9300, 0x2CE6,

+    0x9301, 0x2CCE, 0x9302, 0x2CDA, 0x9304, 0x137D, 0x9306, 0x2CC6,

+    0x9308, 0x2CC4, 0x9309, 0x2CE5, 0x930B, 0x2CE3, 0x930C, 0x2CE2,

+    0x930D, 0x2CD2, 0x930E, 0x2CD1, 0x930F, 0x2CC7, 0x9310, 0x137F,

+    0x9312, 0x2CCD, 0x9313, 0x2CD6, 0x9314, 0x2CE1, 0x9315, 0x1382,

+    0x9316, 0x2CE8, 0x9318, 0x14A3, 0x9319, 0x1384, 0x931A, 0x137E,

+    0x931B, 0x2CCB, 0x931D, 0x2CD4, 0x931E, 0x2CC3, 0x931F, 0x2CC5,

+    0x9320, 0x1375, 0x9321, 0x1381, 0x9322, 0x137A, 0x9323, 0x2CCC,

+    0x9324, 0x2CDB, 0x9325, 0x2AAE, 0x9326, 0x1380, 0x9327, 0x2CC2,

+    0x9328, 0x149E, 0x9329, 0x2CDD, 0x932A, 0x2CE0, 0x932B, 0x137C,

+    0x932D, 0x2CD0, 0x932E, 0x1383, 0x932F, 0x1379, 0x9333, 0x1378,

+    0x9334, 0x2CD9, 0x9335, 0x2CDF, 0x9336, 0x1376, 0x9338, 0x2CC9,

+    0x9339, 0x2CDE, 0x933C, 0x2CCA, 0x9346, 0x2CCF, 0x9347, 0x2E8D,

+    0x9349, 0x2E92, 0x934A, 0x14A0, 0x934B, 0x14A2, 0x934C, 0x2E98,

+    0x934D, 0x149C, 0x934E, 0x2EA6, 0x934F, 0x2E9E, 0x9350, 0x2E93,

+    0x9351, 0x2E94, 0x9352, 0x2E9D, 0x9354, 0x14A9, 0x9355, 0x2E9C,

+    0x9356, 0x2E8C, 0x9357, 0x2E9B, 0x9358, 0x2E8F, 0x9359, 0x2EA7,

+    0x935A, 0x14A8, 0x935B, 0x14A6, 0x935C, 0x2E90, 0x935E, 0x2EA3,

+    0x9360, 0x2E95, 0x9361, 0x2EA2, 0x9363, 0x2EA4, 0x9364, 0x2E8B,

+    0x9365, 0x14A1, 0x9367, 0x2EA5, 0x936A, 0x2E99, 0x936C, 0x14A5,

+    0x936D, 0x2E96, 0x9370, 0x14A7, 0x9371, 0x2E9F, 0x9375, 0x149F,

+    0x9376, 0x2E91, 0x9377, 0x2EA0, 0x9379, 0x2E9A, 0x937A, 0x2CC8,

+    0x937B, 0x2EA1, 0x937C, 0x2E8E, 0x937E, 0x14A4, 0x9380, 0x3014,

+    0x9382, 0x149D, 0x9383, 0x2E89, 0x9388, 0x3011, 0x9389, 0x300A,

+    0x938A, 0x1540, 0x938C, 0x3005, 0x938D, 0x3015, 0x938E, 0x300C,

+    0x938F, 0x2E97, 0x9391, 0x3017, 0x9392, 0x3006, 0x9394, 0x153F,

+    0x9395, 0x3010, 0x9396, 0x1541, 0x9397, 0x1549, 0x9398, 0x1547,

+    0x9399, 0x3012, 0x939A, 0x1548, 0x939B, 0x3008, 0x939D, 0x3009,

+    0x939E, 0x300E, 0x939F, 0x3013, 0x93A1, 0x2E88, 0x93A2, 0x1542,

+    0x93A3, 0x301C, 0x93A4, 0x3019, 0x93A5, 0x3160, 0x93A6, 0x300F,

+    0x93A7, 0x300B, 0x93A8, 0x301A, 0x93A9, 0x3155, 0x93AA, 0x300D,

+    0x93AC, 0x1545, 0x93AE, 0x1544, 0x93AF, 0x2E8A, 0x93B0, 0x1546,

+    0x93B1, 0x3016, 0x93B2, 0x3018, 0x93B3, 0x1543, 0x93B4, 0x301B,

+    0x93B5, 0x3004, 0x93B7, 0x3007, 0x93C0, 0x315E, 0x93C2, 0x314E,

+    0x93C3, 0x15E0, 0x93C4, 0x315C, 0x93C7, 0x314C, 0x93C8, 0x15E1,

+    0x93CA, 0x3157, 0x93CC, 0x3153, 0x93CD, 0x15E6, 0x93CE, 0x315D,

+    0x93CF, 0x314D, 0x93D0, 0x3150, 0x93D1, 0x15DE, 0x93D2, 0x315F,

+    0x93D4, 0x3158, 0x93D5, 0x315B, 0x93D6, 0x15E4, 0x93D7, 0x15E9,

+    0x93D8, 0x15E7, 0x93D9, 0x3154, 0x93DA, 0x314F, 0x93DC, 0x15E2,

+    0x93DD, 0x15E3, 0x93DE, 0x314B, 0x93DF, 0x15DF, 0x93E1, 0x15DD,

+    0x93E2, 0x15E5, 0x93E3, 0x315A, 0x93E4, 0x15E8, 0x93E6, 0x3156,

+    0x93E7, 0x3161, 0x93E8, 0x15EA, 0x93EC, 0x3152, 0x93EE, 0x3159,

+    0x93F5, 0x325A, 0x93F6, 0x3269, 0x93F7, 0x325C, 0x93F8, 0x3263,

+    0x93F9, 0x3151, 0x93FA, 0x3261, 0x93FB, 0x3250, 0x93FC, 0x3267,

+    0x93FD, 0x1654, 0x93FE, 0x3254, 0x93FF, 0x3266, 0x9400, 0x325B,

+    0x9403, 0x1653, 0x9406, 0x326B, 0x9407, 0x325D, 0x9409, 0x3262,

+    0x940A, 0x3265, 0x940B, 0x324E, 0x940C, 0x3268, 0x940D, 0x3259,

+    0x940E, 0x325E, 0x940F, 0x3252, 0x9410, 0x3256, 0x9411, 0x326A,

+    0x9412, 0x3260, 0x9413, 0x324F, 0x9414, 0x3253, 0x9415, 0x3255,

+    0x9416, 0x325F, 0x9418, 0x1652, 0x9419, 0x3258, 0x9420, 0x3251,

+    0x9428, 0x3257, 0x9429, 0x3325, 0x942A, 0x3329, 0x942B, 0x169F,

+    0x942C, 0x332B, 0x942E, 0x1699, 0x9430, 0x3327, 0x9431, 0x332D,

+    0x9432, 0x169E, 0x9433, 0x169A, 0x9435, 0x169B, 0x9436, 0x3324,

+    0x9437, 0x332A, 0x9438, 0x169D, 0x9439, 0x3328, 0x943A, 0x169C,

+    0x943B, 0x3323, 0x943C, 0x3264, 0x943D, 0x3326, 0x943F, 0x3322,

+    0x9440, 0x332C, 0x9444, 0x16DF, 0x9445, 0x33CD, 0x9446, 0x33D0,

+    0x9447, 0x33CC, 0x9448, 0x33CE, 0x9449, 0x33CF, 0x944A, 0x33C9,

+    0x944B, 0x33CA, 0x944C, 0x33C7, 0x944F, 0x33CB, 0x9450, 0x33C8,

+    0x9451, 0x16E0, 0x9452, 0x16E1, 0x9455, 0x3448, 0x9457, 0x344A,

+    0x945D, 0x3449, 0x945E, 0x344B, 0x9460, 0x170E, 0x9462, 0x3447,

+    0x9463, 0x170D, 0x9464, 0x170F, 0x9468, 0x34A6, 0x9469, 0x34A7,

+    0x946A, 0x1731, 0x946B, 0x34A5, 0x946D, 0x34ED, 0x946E, 0x34EC,

+    0x946F, 0x34EE, 0x9470, 0x174C, 0x9471, 0x34EF, 0x9472, 0x174B,

+    0x9473, 0x34F0, 0x9474, 0x350C, 0x9475, 0x350F, 0x9476, 0x350E,

+    0x9477, 0x1755, 0x9478, 0x350D, 0x947C, 0x175F, 0x947D, 0x175D,

+    0x947E, 0x175E, 0x947F, 0x1764, 0x9480, 0x3539, 0x9481, 0x353A,

+    0x9482, 0x3538, 0x9483, 0x3540, 0x9577, 0x0697, 0x957A, 0x20A1,

+    0x957B, 0x234A, 0x957C, 0x2AB1, 0x957D, 0x3162, 0x9580, 0x0698,

+    0x9582, 0x0821, 0x9583, 0x09EA, 0x9586, 0x20A2, 0x9588, 0x20A3,

+    0x9589, 0x0BD0, 0x958B, 0x0D9A, 0x958C, 0x234C, 0x958D, 0x234B,

+    0x958E, 0x0D9E, 0x958F, 0x0D99, 0x9590, 0x234D, 0x9591, 0x0D9B,

+    0x9592, 0x0D9D, 0x9593, 0x0D9C, 0x9594, 0x0D98, 0x9598, 0x0F5C,

+    0x959B, 0x25F3, 0x959C, 0x25F1, 0x959E, 0x25F2, 0x959F, 0x25F0,

+    0x95A1, 0x10DF, 0x95A3, 0x10E2, 0x95A4, 0x10E4, 0x95A5, 0x10E3,

+    0x95A8, 0x10E0, 0x95A9, 0x10E1, 0x95AB, 0x2AB3, 0x95AC, 0x2AB2,

+    0x95AD, 0x1260, 0x95AE, 0x2AB4, 0x95B0, 0x2AB5, 0x95B1, 0x1261,

+    0x95B5, 0x2CF0, 0x95B6, 0x2CEE, 0x95B7, 0x2EAD, 0x95B9, 0x2CEC,

+    0x95BA, 0x2CED, 0x95BB, 0x1385, 0x95BC, 0x2CE9, 0x95BD, 0x2CF1,

+    0x95BE, 0x2CEB, 0x95BF, 0x2CEF, 0x95C0, 0x2EA9, 0x95C3, 0x2EAB,

+    0x95C5, 0x2EAC, 0x95C6, 0x14AE, 0x95C7, 0x2EA8, 0x95C8, 0x14AD,

+    0x95C9, 0x2EAA, 0x95CA, 0x14AA, 0x95CB, 0x14AB, 0x95CC, 0x14AC,

+    0x95CD, 0x2CEA, 0x95D0, 0x154C, 0x95D1, 0x301F, 0x95D2, 0x301D,

+    0x95D3, 0x301E, 0x95D4, 0x154A, 0x95D5, 0x154D, 0x95D6, 0x154B,

+    0x95DA, 0x3163, 0x95DB, 0x3164, 0x95DC, 0x15EB, 0x95DE, 0x326C,

+    0x95DF, 0x326E, 0x95E0, 0x326D, 0x95E1, 0x1655, 0x95E2, 0x16A0,

+    0x95E3, 0x3330, 0x95E4, 0x332F, 0x95E5, 0x332E, 0x961C, 0x0699,

+    0x961E, 0x17B4, 0x9620, 0x1821, 0x9621, 0x0414, 0x9622, 0x181F,

+    0x9623, 0x1822, 0x9624, 0x1820, 0x9628, 0x18F1, 0x962A, 0x0526,

+    0x962C, 0x0527, 0x962D, 0x18F3, 0x962E, 0x0524, 0x962F, 0x18F2,

+    0x9630, 0x18F0, 0x9631, 0x0525, 0x9632, 0x0523, 0x9639, 0x1A55,

+    0x963A, 0x1A58, 0x963B, 0x069C, 0x963C, 0x1A57, 0x963D, 0x1A56,

+    0x963F, 0x069B, 0x9640, 0x069A, 0x9642, 0x069E, 0x9643, 0x1A59,

+    0x9644, 0x069D, 0x964A, 0x1C1A, 0x964B, 0x0823, 0x964C, 0x0824,

+    0x964D, 0x0825, 0x964E, 0x1C1B, 0x964F, 0x1C17, 0x9650, 0x0822,

+    0x9651, 0x1C18, 0x9653, 0x1C19, 0x9654, 0x1C16, 0x9658, 0x09F1,

+    0x965B, 0x09EE, 0x965C, 0x1E2F, 0x965D, 0x09EF, 0x965E, 0x09F2,

+    0x965F, 0x1E30, 0x9661, 0x09ED, 0x9662, 0x09EB, 0x9663, 0x09EC,

+    0x9664, 0x09F0, 0x966A, 0x0BD1, 0x966B, 0x20A6, 0x966C, 0x0BD9,

+    0x966D, 0x20A5, 0x966F, 0x20A8, 0x9670, 0x0BD5, 0x9671, 0x20A7,

+    0x9672, 0x0DA6, 0x9673, 0x0BD3, 0x9674, 0x0BD6, 0x9675, 0x0BD2,

+    0x9676, 0x0BD7, 0x9677, 0x0BD8, 0x9678, 0x0BD4, 0x967C, 0x20A4,

+    0x967D, 0x0DA2, 0x967E, 0x234F, 0x9680, 0x2353, 0x9683, 0x2352,

+    0x9684, 0x0DA7, 0x9685, 0x0DA3, 0x9686, 0x0DA4, 0x9687, 0x234E,

+    0x9688, 0x2350, 0x9689, 0x2351, 0x968A, 0x0D9F, 0x968B, 0x0DA1,

+    0x968D, 0x0DA5, 0x968E, 0x0DA0, 0x9691, 0x25F6, 0x9692, 0x25F4,

+    0x9693, 0x25F5, 0x9694, 0x0F5E, 0x9695, 0x0F5F, 0x9697, 0x25F7,

+    0x9698, 0x0F5D, 0x9699, 0x10E5, 0x969B, 0x10E7, 0x969C, 0x10E6,

+    0x969E, 0x2852, 0x96A1, 0x2853, 0x96A2, 0x2AB7, 0x96A4, 0x2AB6,

+    0x96A7, 0x1386, 0x96A8, 0x1387, 0x96A9, 0x2CF2, 0x96AA, 0x1388,

+    0x96AC, 0x2EB0, 0x96AE, 0x2EAE, 0x96B0, 0x2EAF, 0x96B1, 0x14AF,

+    0x96B3, 0x3020, 0x96B4, 0x15EC, 0x96B6, 0x0231, 0x96B8, 0x14B0,

+    0x96B9, 0x069F, 0x96BB, 0x09F3, 0x96BC, 0x1E31, 0x96BF, 0x20A9,

+    0x96C0, 0x0BDA, 0x96C1, 0x0DA8, 0x96C2, 0x2354, 0x96C3, 0x2356,

+    0x96C4, 0x0DAA, 0x96C5, 0x0DA9, 0x96C6, 0x0DAB, 0x96C7, 0x0DAC,

+    0x96C8, 0x2355, 0x96C9, 0x0F62, 0x96CA, 0x0F63, 0x96CB, 0x0F61,

+    0x96CC, 0x10E8, 0x96CD, 0x0F60, 0x96CE, 0x25F8, 0x96D2, 0x10E9,

+    0x96D3, 0x2AB8, 0x96D4, 0x2CF3, 0x96D5, 0x1389, 0x96D6, 0x14B1,

+    0x96D7, 0x3021, 0x96D8, 0x3025, 0x96D9, 0x1550, 0x96DA, 0x3022,

+    0x96DB, 0x1551, 0x96DC, 0x154F, 0x96DD, 0x3026, 0x96DE, 0x1552,

+    0x96DF, 0x3024, 0x96E1, 0x3165, 0x96E2, 0x154E, 0x96E3, 0x15ED,

+    0x96E5, 0x34A8, 0x96E8, 0x06A0, 0x96E9, 0x0BDC, 0x96EA, 0x0BDB,

+    0x96EF, 0x0DAD, 0x96F0, 0x2358, 0x96F1, 0x2357, 0x96F2, 0x0DAE,

+    0x96F5, 0x25FC, 0x96F6, 0x0F67, 0x96F7, 0x0F64, 0x96F8, 0x25FB,

+    0x96F9, 0x0F66, 0x96FA, 0x25F9, 0x96FB, 0x0F65, 0x96FD, 0x25FA,

+    0x96FF, 0x2854, 0x9700, 0x10EA, 0x9702, 0x2ABB, 0x9704, 0x1262,

+    0x9705, 0x2AB9, 0x9706, 0x1263, 0x9707, 0x1264, 0x9708, 0x2ABA,

+    0x9709, 0x1265, 0x970B, 0x2CF4, 0x970D, 0x138D, 0x970E, 0x138A,

+    0x970F, 0x138F, 0x9710, 0x2CF6, 0x9711, 0x138B, 0x9712, 0x2CF5,

+    0x9713, 0x138E, 0x9716, 0x138C, 0x9718, 0x2EB3, 0x9719, 0x2EB5,

+    0x971C, 0x14B2, 0x971D, 0x2EB4, 0x971E, 0x14B3, 0x971F, 0x2EB2,

+    0x9720, 0x2EB1, 0x9722, 0x3028, 0x9723, 0x3027, 0x9724, 0x1553,

+    0x9725, 0x3029, 0x9726, 0x316A, 0x9727, 0x15EF, 0x9728, 0x3169,

+    0x9729, 0x3166, 0x972A, 0x15EE, 0x972B, 0x3167, 0x972C, 0x3168,

+    0x972E, 0x326F, 0x972F, 0x3270, 0x9730, 0x1656, 0x9732, 0x16A3,

+    0x9735, 0x3331, 0x9738, 0x16A1, 0x9739, 0x16A2, 0x973A, 0x3332,

+    0x973D, 0x16E2, 0x973E, 0x16E3, 0x973F, 0x33D1, 0x9742, 0x1732,

+    0x9743, 0x34AA, 0x9744, 0x1734, 0x9746, 0x34A9, 0x9747, 0x34AB,

+    0x9748, 0x1733, 0x9749, 0x34F1, 0x974B, 0x3526, 0x9752, 0x06A1,

+    0x9756, 0x0F68, 0x9758, 0x2855, 0x975A, 0x2ABC, 0x975B, 0x1390,

+    0x975C, 0x1391, 0x975E, 0x06A2, 0x9760, 0x1266, 0x9761, 0x15F0,

+    0x9762, 0x0826, 0x9766, 0x1392, 0x9768, 0x1710, 0x9769, 0x0827,

+    0x976A, 0x20AA, 0x976C, 0x2359, 0x976E, 0x235B, 0x9770, 0x235A,

+    0x9772, 0x2600, 0x9773, 0x25FD, 0x9774, 0x0F69, 0x9776, 0x0F6A,

+    0x9777, 0x25FE, 0x9778, 0x25FF, 0x977A, 0x2857, 0x977B, 0x285C,

+    0x977C, 0x10EB, 0x977D, 0x2856, 0x977E, 0x2858, 0x977F, 0x285F,

+    0x9780, 0x285A, 0x9781, 0x285E, 0x9782, 0x285B, 0x9783, 0x2859,

+    0x9784, 0x285D, 0x9785, 0x10EC, 0x9788, 0x2ABF, 0x978A, 0x2ABD,

+    0x978B, 0x1268, 0x978D, 0x1267, 0x978E, 0x2ABE, 0x978F, 0x1269,

+    0x9794, 0x2CF9, 0x9797, 0x2CF8, 0x9798, 0x1393, 0x9799, 0x2CF7,

+    0x979A, 0x2EB6, 0x979C, 0x2EB8, 0x979D, 0x2EBA, 0x979E, 0x2EB9,

+    0x97A0, 0x14B4, 0x97A1, 0x2EB7, 0x97A2, 0x3030, 0x97A3, 0x1554,

+    0x97A4, 0x302E, 0x97A5, 0x3031, 0x97A6, 0x1555, 0x97A8, 0x302C,

+    0x97AA, 0x302F, 0x97AB, 0x302D, 0x97AC, 0x302A, 0x97AD, 0x1556,

+    0x97AE, 0x302B, 0x97B3, 0x316B, 0x97B6, 0x316D, 0x97B7, 0x316C,

+    0x97B9, 0x3271, 0x97BB, 0x3272, 0x97BF, 0x3333, 0x97C1, 0x16E5,

+    0x97C3, 0x16E4, 0x97C4, 0x344C, 0x97C5, 0x344D, 0x97C6, 0x1735,

+    0x97C7, 0x34AC, 0x97C9, 0x1756, 0x97CB, 0x0828, 0x97CC, 0x0DAF,

+    0x97CD, 0x2861, 0x97CE, 0x2860, 0x97CF, 0x2AC1, 0x97D0, 0x2AC0,

+    0x97D3, 0x14B5, 0x97D4, 0x2EBC, 0x97D5, 0x2EBB, 0x97D6, 0x3034,

+    0x97D7, 0x3032, 0x97D8, 0x3035, 0x97D9, 0x3033, 0x97DC, 0x15F1,

+    0x97DD, 0x316E, 0x97DE, 0x316F, 0x97DF, 0x3170, 0x97E1, 0x3334,

+    0x97E3, 0x33D2, 0x97E5, 0x34AD, 0x97ED, 0x0829, 0x97F0, 0x2CFA,

+    0x97F1, 0x2EBD, 0x97F3, 0x082A, 0x97F6, 0x10ED, 0x97F8, 0x2CFB,

+    0x97F9, 0x1557, 0x97FA, 0x3036, 0x97FB, 0x15F2, 0x97FD, 0x3273,

+    0x97FE, 0x3274, 0x97FF, 0x16A4, 0x9800, 0x344E, 0x9801, 0x082B,

+    0x9802, 0x0BDF, 0x9803, 0x0BE0, 0x9804, 0x20AB, 0x9805, 0x0DB0,

+    0x9806, 0x0DB1, 0x9807, 0x235C, 0x9808, 0x0DB2, 0x980A, 0x0F6E,

+    0x980C, 0x0F70, 0x980D, 0x2602, 0x980E, 0x2603, 0x980F, 0x2601,

+    0x9810, 0x0F6B, 0x9811, 0x0F6C, 0x9812, 0x0F6F, 0x9813, 0x0F6D,

+    0x9816, 0x2862, 0x9817, 0x10EE, 0x9818, 0x10EF, 0x981B, 0x2AC8,

+    0x981C, 0x126C, 0x981D, 0x2AC3, 0x981E, 0x2AC2, 0x9820, 0x2AC7,

+    0x9821, 0x126A, 0x9824, 0x139A, 0x9826, 0x2AC4, 0x9827, 0x2AC9,

+    0x9828, 0x2AC6, 0x9829, 0x2AC5, 0x982B, 0x126B, 0x982D, 0x1398,

+    0x982F, 0x2CFD, 0x9830, 0x1394, 0x9832, 0x2CFE, 0x9835, 0x2CFC,

+    0x9837, 0x1397, 0x9838, 0x1395, 0x9839, 0x1399, 0x983B, 0x1396,

+    0x9841, 0x2EBE, 0x9843, 0x2EC3, 0x9844, 0x2EBF, 0x9845, 0x2EC2,

+    0x9846, 0x14B6, 0x9848, 0x2DF2, 0x9849, 0x2EC1, 0x984A, 0x2EC0,

+    0x984C, 0x155A, 0x984D, 0x1558, 0x984E, 0x155B, 0x984F, 0x1559,

+    0x9850, 0x3037, 0x9851, 0x3038, 0x9852, 0x3039, 0x9853, 0x155C,

+    0x9857, 0x3174, 0x9858, 0x15F4, 0x9859, 0x3172, 0x985B, 0x15F5,

+    0x985C, 0x3171, 0x985D, 0x3173, 0x985E, 0x15F3, 0x985F, 0x3278,

+    0x9860, 0x3275, 0x9862, 0x3276, 0x9863, 0x3277, 0x9864, 0x3335,

+    0x9865, 0x16A6, 0x9867, 0x16A5, 0x9869, 0x33D4, 0x986A, 0x33D3,

+    0x986B, 0x16E6, 0x986F, 0x1711, 0x9870, 0x1736, 0x9871, 0x174D,

+    0x9872, 0x34F2, 0x9873, 0x3527, 0x9874, 0x3528, 0x98A8, 0x082C,

+    0x98A9, 0x235D, 0x98AC, 0x2604, 0x98AD, 0x2863, 0x98AE, 0x2864,

+    0x98AF, 0x10F0, 0x98B1, 0x10F1, 0x98B2, 0x2ACA, 0x98B3, 0x126D,

+    0x98B6, 0x14B7, 0x98B8, 0x303A, 0x98BA, 0x155D, 0x98BB, 0x3177,

+    0x98BC, 0x15F6, 0x98BD, 0x3176, 0x98BE, 0x3178, 0x98BF, 0x3175,

+    0x98C0, 0x3338, 0x98C1, 0x3279, 0x98C2, 0x327A, 0x98C4, 0x1657,

+    0x98C6, 0x3337, 0x98C9, 0x3336, 0x98CB, 0x33D5, 0x98CC, 0x3529,

+    0x98DB, 0x082D, 0x98DF, 0x082E, 0x98E2, 0x09F4, 0x98E3, 0x1E32,

+    0x98E5, 0x20AC, 0x98E7, 0x0DB3, 0x98E9, 0x0DB6, 0x98EA, 0x0DB4,

+    0x98EB, 0x235E, 0x98ED, 0x0DB8, 0x98EF, 0x0DB5, 0x98F2, 0x0DB7,

+    0x98F4, 0x0F72, 0x98F6, 0x2605, 0x98F9, 0x2606, 0x98FA, 0x2ACC,

+    0x98FC, 0x0F71, 0x98FD, 0x0F73, 0x98FE, 0x0F74, 0x9900, 0x2866,

+    0x9902, 0x2865, 0x9903, 0x10F2, 0x9905, 0x10F3, 0x9907, 0x2867,

+    0x9908, 0x2ACB, 0x9909, 0x10F5, 0x990A, 0x126E, 0x990C, 0x10F4,

+    0x9910, 0x139B, 0x9911, 0x2ACD, 0x9912, 0x1270, 0x9913, 0x126F,

+    0x9914, 0x2ACE, 0x9915, 0x2AD1, 0x9916, 0x2ACF, 0x9917, 0x2AD0,

+    0x9918, 0x1271, 0x991A, 0x13A0, 0x991B, 0x139E, 0x991E, 0x139D,

+    0x991F, 0x2D00, 0x9921, 0x139F, 0x9924, 0x2CFF, 0x9925, 0x2EC4,

+    0x9927, 0x2D01, 0x9928, 0x139C, 0x9929, 0x2D02, 0x992A, 0x2EC7,

+    0x992B, 0x2EC5, 0x992C, 0x2EC6, 0x992D, 0x2ECB, 0x992E, 0x1561,

+    0x992F, 0x2ECA, 0x9930, 0x2ECD, 0x9931, 0x2ECC, 0x9932, 0x2EC9,

+    0x9933, 0x2EC8, 0x9935, 0x14B8, 0x993A, 0x303D, 0x993C, 0x303C,

+    0x993D, 0x1560, 0x993E, 0x155E, 0x993F, 0x155F, 0x9941, 0x303B,

+    0x9943, 0x317B, 0x9945, 0x15F7, 0x9947, 0x317A, 0x9948, 0x3179,

+    0x9949, 0x15F8, 0x994B, 0x327F, 0x994C, 0x327E, 0x994E, 0x327C,

+    0x9950, 0x327B, 0x9951, 0x1659, 0x9952, 0x1658, 0x9953, 0x3280,

+    0x9954, 0x33D6, 0x9955, 0x16E7, 0x9956, 0x333A, 0x9957, 0x16A7,

+    0x9958, 0x3339, 0x9959, 0x327D, 0x995B, 0x33D7, 0x995C, 0x1712,

+    0x995E, 0x174E, 0x995F, 0x34F3, 0x9961, 0x352A, 0x9996, 0x082F,

+    0x9997, 0x20AD, 0x9998, 0x2ECE, 0x9999, 0x0830, 0x999C, 0x2869,

+    0x999D, 0x2868, 0x999E, 0x2D03, 0x99A1, 0x2ED0, 0x99A3, 0x2ECF,

+    0x99A5, 0x1562, 0x99A6, 0x317C, 0x99A7, 0x317D, 0x99A8, 0x165A,

+    0x99AB, 0x352B, 0x99AC, 0x09F5, 0x99AD, 0x0DBA, 0x99AE, 0x0DB9,

+    0x99AF, 0x2607, 0x99B0, 0x2609, 0x99B1, 0x0F76, 0x99B2, 0x2608,

+    0x99B3, 0x0F75, 0x99B4, 0x0F77, 0x99B5, 0x260A, 0x99B9, 0x286B,

+    0x99BA, 0x286D, 0x99BB, 0x286C, 0x99BD, 0x286F, 0x99C1, 0x10F6,

+    0x99C2, 0x286E, 0x99C3, 0x286A, 0x99C7, 0x2870, 0x99C9, 0x2AD8,

+    0x99CB, 0x2ADB, 0x99CC, 0x2ADD, 0x99CD, 0x2AD3, 0x99CE, 0x2AD7,

+    0x99CF, 0x2AD4, 0x99D0, 0x1273, 0x99D1, 0x1276, 0x99D2, 0x1278,

+    0x99D3, 0x2AD5, 0x99D4, 0x2AD6, 0x99D5, 0x1277, 0x99D6, 0x2AD9,

+    0x99D7, 0x2ADC, 0x99D8, 0x2ADA, 0x99D9, 0x1279, 0x99DB, 0x1275,

+    0x99DC, 0x2AD2, 0x99DD, 0x1272, 0x99DF, 0x1274, 0x99E2, 0x13A2,

+    0x99E3, 0x2D09, 0x99E4, 0x2D07, 0x99E5, 0x2D06, 0x99E7, 0x2D0C,

+    0x99E9, 0x2D0B, 0x99EA, 0x2D0A, 0x99EC, 0x2D05, 0x99ED, 0x13A1,

+    0x99EE, 0x2D04, 0x99F0, 0x2D08, 0x99F1, 0x13A3, 0x99F4, 0x2ED3,

+    0x99F6, 0x2ED7, 0x99F7, 0x2ED4, 0x99F8, 0x2ED6, 0x99F9, 0x2ED5,

+    0x99FA, 0x2ED2, 0x99FB, 0x2ED8, 0x99FC, 0x2EDB, 0x99FD, 0x2ED9,

+    0x99FE, 0x2EDA, 0x99FF, 0x14BA, 0x9A01, 0x14B9, 0x9A02, 0x2ED1,

+    0x9A03, 0x2EDC, 0x9A04, 0x3042, 0x9A05, 0x3045, 0x9A06, 0x3047,

+    0x9A07, 0x3046, 0x9A09, 0x3040, 0x9A0A, 0x3044, 0x9A0B, 0x303F,

+    0x9A0D, 0x3041, 0x9A0E, 0x1563, 0x9A0F, 0x303E, 0x9A11, 0x3043,

+    0x9A14, 0x318A, 0x9A15, 0x317F, 0x9A16, 0x15F9, 0x9A19, 0x15FA,

+    0x9A1A, 0x317E, 0x9A1B, 0x3183, 0x9A1C, 0x3189, 0x9A1D, 0x3181,

+    0x9A1E, 0x3188, 0x9A20, 0x3185, 0x9A22, 0x3184, 0x9A23, 0x3187,

+    0x9A24, 0x3182, 0x9A25, 0x3180, 0x9A27, 0x3186, 0x9A29, 0x3287,

+    0x9A2A, 0x3285, 0x9A2B, 0x165B, 0x9A2C, 0x3284, 0x9A2D, 0x328A,

+    0x9A2E, 0x3288, 0x9A30, 0x165C, 0x9A31, 0x3283, 0x9A32, 0x3281,

+    0x9A34, 0x3282, 0x9A35, 0x165E, 0x9A36, 0x3286, 0x9A37, 0x165D,

+    0x9A38, 0x3289, 0x9A39, 0x333B, 0x9A3A, 0x3341, 0x9A3D, 0x333C,

+    0x9A3E, 0x16AB, 0x9A3F, 0x3342, 0x9A40, 0x16AA, 0x9A41, 0x3340,

+    0x9A42, 0x333F, 0x9A43, 0x16A9, 0x9A44, 0x333E, 0x9A45, 0x16A8,

+    0x9A46, 0x333D, 0x9A48, 0x33DD, 0x9A49, 0x33DF, 0x9A4A, 0x33DE,

+    0x9A4C, 0x33DB, 0x9A4D, 0x16E9, 0x9A4E, 0x33D8, 0x9A4F, 0x33DC,

+    0x9A50, 0x33E1, 0x9A52, 0x33E0, 0x9A53, 0x33D9, 0x9A54, 0x33DA,

+    0x9A55, 0x16E8, 0x9A56, 0x344F, 0x9A57, 0x1715, 0x9A59, 0x3450,

+    0x9A5A, 0x1713, 0x9A5B, 0x1714, 0x9A5E, 0x34AE, 0x9A5F, 0x1737,

+    0x9A60, 0x3510, 0x9A62, 0x1757, 0x9A64, 0x352C, 0x9A65, 0x1758,

+    0x9A66, 0x352D, 0x9A67, 0x352E, 0x9A68, 0x353C, 0x9A69, 0x353B,

+    0x9A6A, 0x1767, 0x9A6B, 0x3544, 0x9AA8, 0x09F6, 0x9AAB, 0x260C,

+    0x9AAD, 0x260B, 0x9AAF, 0x10F7, 0x9AB0, 0x10F8, 0x9AB1, 0x2871,

+    0x9AB3, 0x2ADE, 0x9AB4, 0x2D0F, 0x9AB7, 0x127A, 0x9AB8, 0x13A4,

+    0x9AB9, 0x2D0D, 0x9ABB, 0x2D10, 0x9ABC, 0x13A5, 0x9ABE, 0x2EDD,

+    0x9ABF, 0x2D0E, 0x9AC0, 0x3048, 0x9AC1, 0x1564, 0x9AC2, 0x318B,

+    0x9AC6, 0x328D, 0x9AC7, 0x328B, 0x9ACA, 0x328C, 0x9ACD, 0x3343,

+    0x9ACF, 0x16AC, 0x9AD0, 0x33E2, 0x9AD1, 0x1718, 0x9AD2, 0x16EA,

+    0x9AD3, 0x1716, 0x9AD4, 0x1717, 0x9AD5, 0x34AF, 0x9AD6, 0x174F,

+    0x9AD8, 0x09F7, 0x9ADC, 0x3049, 0x9ADF, 0x1E33, 0x9AE1, 0x0F78,

+    0x9AE3, 0x2872, 0x9AE6, 0x10F9, 0x9AE7, 0x2873, 0x9AEB, 0x2AE0,

+    0x9AEC, 0x2ADF, 0x9AED, 0x13A7, 0x9AEE, 0x127B, 0x9AEF, 0x127C,

+    0x9AF1, 0x2AE3, 0x9AF2, 0x2AE2, 0x9AF3, 0x2AE1, 0x9AF6, 0x2D11,

+    0x9AF7, 0x2D14, 0x9AF9, 0x2D13, 0x9AFA, 0x2D12, 0x9AFB, 0x13A6,

+    0x9AFC, 0x2EE1, 0x9AFD, 0x2EDF, 0x9AFE, 0x2EDE, 0x9B01, 0x2EE0,

+    0x9B03, 0x1565, 0x9B04, 0x304B, 0x9B05, 0x304C, 0x9B06, 0x1566,

+    0x9B08, 0x304A, 0x9B0A, 0x318D, 0x9B0B, 0x318C, 0x9B0C, 0x318F,

+    0x9B0D, 0x15FB, 0x9B0E, 0x318E, 0x9B10, 0x328E, 0x9B11, 0x3290,

+    0x9B12, 0x328F, 0x9B15, 0x3344, 0x9B16, 0x3347, 0x9B17, 0x3345,

+    0x9B18, 0x3346, 0x9B19, 0x33E3, 0x9B1A, 0x16EB, 0x9B1E, 0x3451,

+    0x9B1F, 0x3452, 0x9B20, 0x3453, 0x9B22, 0x1738, 0x9B23, 0x1750,

+    0x9B24, 0x352F, 0x9B25, 0x09F8, 0x9B27, 0x127D, 0x9B28, 0x13A8,

+    0x9B29, 0x304D, 0x9B2B, 0x33E4, 0x9B2E, 0x3511, 0x9B2F, 0x1E34,

+    0x9B31, 0x1768, 0x9B32, 0x09F9, 0x9B33, 0x2D15, 0x9B35, 0x304E,

+    0x9B37, 0x3190, 0x9B3A, 0x3348, 0x9B3B, 0x33E5, 0x9B3C, 0x09FA,

+    0x9B3E, 0x2874, 0x9B3F, 0x2875, 0x9B41, 0x10FA, 0x9B42, 0x10FB,

+    0x9B43, 0x2AE5, 0x9B44, 0x127F, 0x9B45, 0x127E, 0x9B46, 0x2AE4,

+    0x9B48, 0x2EE2, 0x9B4A, 0x304F, 0x9B4B, 0x3051, 0x9B4C, 0x3050,

+    0x9B4D, 0x1569, 0x9B4E, 0x1568, 0x9B4F, 0x1567, 0x9B51, 0x16AE,

+    0x9B52, 0x3349, 0x9B54, 0x16AD, 0x9B55, 0x33E7, 0x9B56, 0x33E6,

+    0x9B58, 0x1739, 0x9B59, 0x34B0, 0x9B5A, 0x0BE1, 0x9B5B, 0x260D,

+    0x9B5F, 0x2878, 0x9B60, 0x2876, 0x9B61, 0x2877, 0x9B64, 0x2AEE,

+    0x9B66, 0x2AE9, 0x9B67, 0x2AE6, 0x9B68, 0x2AED, 0x9B6C, 0x2AEF,

+    0x9B6F, 0x1281, 0x9B70, 0x2AEC, 0x9B71, 0x2AE8, 0x9B74, 0x2AE7,

+    0x9B75, 0x2AEB, 0x9B76, 0x2AEA, 0x9B77, 0x1280, 0x9B7A, 0x2D20,

+    0x9B7B, 0x2D1B, 0x9B7C, 0x2D19, 0x9B7D, 0x2D22, 0x9B7E, 0x2D1A,

+    0x9B80, 0x2D16, 0x9B82, 0x2D1C, 0x9B85, 0x2D17, 0x9B86, 0x2EEB,

+    0x9B87, 0x2D18, 0x9B88, 0x2D23, 0x9B90, 0x2D1F, 0x9B91, 0x13A9,

+    0x9B92, 0x2D1E, 0x9B93, 0x2D1D, 0x9B95, 0x2D21, 0x9B9A, 0x2EE3,

+    0x9B9B, 0x2EE6, 0x9B9E, 0x2EE5, 0x9BA0, 0x2EED, 0x9BA1, 0x2EE8,

+    0x9BA2, 0x2EEC, 0x9BA4, 0x2EEA, 0x9BA5, 0x2EE9, 0x9BA6, 0x2EE7,

+    0x9BA8, 0x2EE4, 0x9BAA, 0x14BD, 0x9BAB, 0x14BC, 0x9BAD, 0x14BE,

+    0x9BAE, 0x14BB, 0x9BAF, 0x2EEE, 0x9BB5, 0x3057, 0x9BB6, 0x305A,

+    0x9BB8, 0x3058, 0x9BB9, 0x305C, 0x9BBD, 0x305D, 0x9BBF, 0x3055,

+    0x9BC0, 0x156E, 0x9BC1, 0x3056, 0x9BC3, 0x3054, 0x9BC4, 0x305B,

+    0x9BC6, 0x3053, 0x9BC7, 0x3052, 0x9BC8, 0x156D, 0x9BC9, 0x156B,

+    0x9BCA, 0x156A, 0x9BD3, 0x3059, 0x9BD4, 0x3199, 0x9BD5, 0x319F,

+    0x9BD6, 0x15FE, 0x9BD7, 0x319A, 0x9BD9, 0x319D, 0x9BDA, 0x31A1,

+    0x9BDB, 0x15FF, 0x9BDC, 0x319C, 0x9BDE, 0x3194, 0x9BE0, 0x3193,

+    0x9BE1, 0x31A0, 0x9BE2, 0x3197, 0x9BE4, 0x3195, 0x9BE5, 0x319E,

+    0x9BE6, 0x3196, 0x9BE7, 0x15FD, 0x9BE8, 0x15FC, 0x9BEA, 0x3191,

+    0x9BEB, 0x3192, 0x9BEC, 0x319B, 0x9BF0, 0x3198, 0x9BF7, 0x3293,

+    0x9BF8, 0x3296, 0x9BFD, 0x156C, 0x9C05, 0x3294, 0x9C06, 0x329A,

+    0x9C07, 0x3298, 0x9C08, 0x3292, 0x9C09, 0x329D, 0x9C0B, 0x3291,

+    0x9C0D, 0x1660, 0x9C0E, 0x3299, 0x9C12, 0x3295, 0x9C13, 0x165F,

+    0x9C14, 0x329C, 0x9C17, 0x329B, 0x9C1C, 0x334C, 0x9C1D, 0x334B,

+    0x9C21, 0x3352, 0x9C23, 0x334E, 0x9C24, 0x3351, 0x9C25, 0x16B0,

+    0x9C28, 0x334F, 0x9C29, 0x3350, 0x9C2B, 0x334A, 0x9C2C, 0x334D,

+    0x9C2D, 0x16AF, 0x9C31, 0x16ED, 0x9C32, 0x33F2, 0x9C33, 0x33ED,

+    0x9C34, 0x33F1, 0x9C36, 0x33F4, 0x9C37, 0x33F0, 0x9C39, 0x33EC,

+    0x9C3B, 0x16EF, 0x9C3C, 0x33EF, 0x9C3D, 0x33F3, 0x9C3E, 0x16EE,

+    0x9C3F, 0x33EA, 0x9C40, 0x3297, 0x9C41, 0x33EE, 0x9C44, 0x33EB,

+    0x9C46, 0x33E8, 0x9C48, 0x33E9, 0x9C49, 0x16EC, 0x9C4A, 0x3457,

+    0x9C4B, 0x3459, 0x9C4C, 0x345C, 0x9C4D, 0x3458, 0x9C4E, 0x345D,

+    0x9C50, 0x3456, 0x9C52, 0x3454, 0x9C54, 0x1719, 0x9C55, 0x345A,

+    0x9C56, 0x171B, 0x9C57, 0x171A, 0x9C58, 0x3455, 0x9C59, 0x345B,

+    0x9C5E, 0x34B5, 0x9C5F, 0x173A, 0x9C60, 0x34B6, 0x9C62, 0x34B4,

+    0x9C63, 0x34B1, 0x9C66, 0x34B3, 0x9C67, 0x34B2, 0x9C68, 0x34F4,

+    0x9C6D, 0x34F6, 0x9C6E, 0x34F5, 0x9C71, 0x3514, 0x9C73, 0x3513,

+    0x9C74, 0x3512, 0x9C75, 0x3515, 0x9C77, 0x1760, 0x9C78, 0x1761,

+    0x9C79, 0x3541, 0x9C7A, 0x3545, 0x9CE5, 0x0BE2, 0x9CE6, 0x235F,

+    0x9CE7, 0x2610, 0x9CE9, 0x0F79, 0x9CEA, 0x260E, 0x9CED, 0x260F,

+    0x9CF1, 0x2879, 0x9CF2, 0x287A, 0x9CF3, 0x10FE, 0x9CF4, 0x10FC,

+    0x9CF5, 0x287B, 0x9CF6, 0x10FD, 0x9CF7, 0x2AF4, 0x9CF9, 0x2AF7,

+    0x9CFA, 0x2AF1, 0x9CFB, 0x2AF8, 0x9CFC, 0x2AF0, 0x9CFD, 0x2AF2,

+    0x9CFF, 0x2AF3, 0x9D00, 0x2AF6, 0x9D03, 0x1284, 0x9D04, 0x2AFB,

+    0x9D05, 0x2AFA, 0x9D06, 0x1282, 0x9D07, 0x2AF5, 0x9D08, 0x2AF9,

+    0x9D09, 0x1283, 0x9D10, 0x2D2D, 0x9D12, 0x13AE, 0x9D14, 0x2D28,

+    0x9D15, 0x13AA, 0x9D17, 0x2D25, 0x9D18, 0x2D2B, 0x9D19, 0x2D2E,

+    0x9D1B, 0x13AF, 0x9D1D, 0x2D2A, 0x9D1E, 0x2D27, 0x9D1F, 0x2D2F,

+    0x9D20, 0x2D26, 0x9D22, 0x2D2C, 0x9D23, 0x13AB, 0x9D25, 0x2D24,

+    0x9D26, 0x13AC, 0x9D28, 0x13AD, 0x9D29, 0x2D29, 0x9D2D, 0x2F00,

+    0x9D2E, 0x2EF3, 0x9D2F, 0x2EF4, 0x9D30, 0x2EF7, 0x9D31, 0x2EF5,

+    0x9D33, 0x2EEF, 0x9D36, 0x2EF2, 0x9D37, 0x2EFC, 0x9D38, 0x2EF6,

+    0x9D3B, 0x14BF, 0x9D3D, 0x2EFE, 0x9D3E, 0x2EFB, 0x9D3F, 0x14C0,

+    0x9D40, 0x2EFD, 0x9D41, 0x2EF0, 0x9D42, 0x2EF9, 0x9D43, 0x2EFA,

+    0x9D45, 0x2EF8, 0x9D4A, 0x3061, 0x9D4B, 0x3063, 0x9D4C, 0x3066,

+    0x9D4F, 0x3060, 0x9D51, 0x156F, 0x9D52, 0x3068, 0x9D53, 0x305F,

+    0x9D54, 0x3069, 0x9D56, 0x3065, 0x9D57, 0x3067, 0x9D58, 0x306B,

+    0x9D59, 0x3064, 0x9D5A, 0x306C, 0x9D5B, 0x3062, 0x9D5C, 0x305E,

+    0x9D5D, 0x1570, 0x9D5F, 0x306A, 0x9D60, 0x1571, 0x9D61, 0x1601,

+    0x9D67, 0x2EF1, 0x9D68, 0x31BB, 0x9D69, 0x31B2, 0x9D6A, 0x1603,

+    0x9D6B, 0x31AE, 0x9D6C, 0x1604, 0x9D6F, 0x31B7, 0x9D70, 0x31B1,

+    0x9D71, 0x31A7, 0x9D72, 0x1602, 0x9D73, 0x31B4, 0x9D74, 0x31AF,

+    0x9D75, 0x31B0, 0x9D77, 0x31A2, 0x9D78, 0x31A9, 0x9D79, 0x31B8,

+    0x9D7B, 0x31B5, 0x9D7D, 0x31AD, 0x9D7F, 0x31B9, 0x9D80, 0x31A8,

+    0x9D81, 0x31A3, 0x9D82, 0x31B6, 0x9D84, 0x31A5, 0x9D85, 0x31B3,

+    0x9D86, 0x31AA, 0x9D87, 0x31BA, 0x9D88, 0x31A6, 0x9D89, 0x1600,

+    0x9D8A, 0x31A4, 0x9D8B, 0x31AB, 0x9D8C, 0x31AC, 0x9D90, 0x32A4,

+    0x9D92, 0x32A2, 0x9D94, 0x32A7, 0x9D96, 0x32B3, 0x9D97, 0x32AA,

+    0x9D98, 0x32A3, 0x9D99, 0x329F, 0x9D9A, 0x32AC, 0x9D9B, 0x32A5,

+    0x9D9C, 0x32A8, 0x9D9D, 0x32A1, 0x9D9E, 0x32AF, 0x9D9F, 0x329E,

+    0x9DA0, 0x32A6, 0x9DA1, 0x32AB, 0x9DA2, 0x32AD, 0x9DA3, 0x32B0,

+    0x9DA4, 0x32A0, 0x9DA6, 0x32B4, 0x9DA7, 0x32B5, 0x9DA8, 0x32AE,

+    0x9DA9, 0x32B2, 0x9DAA, 0x32A9, 0x9DAC, 0x3362, 0x9DAD, 0x3365,

+    0x9DAF, 0x16B1, 0x9DB1, 0x3364, 0x9DB2, 0x3369, 0x9DB3, 0x3367,

+    0x9DB4, 0x16B2, 0x9DB5, 0x335E, 0x9DB6, 0x3354, 0x9DB7, 0x3353,

+    0x9DB8, 0x16B4, 0x9DB9, 0x3360, 0x9DBA, 0x3361, 0x9DBB, 0x335D,

+    0x9DBC, 0x3355, 0x9DBE, 0x335A, 0x9DBF, 0x32B1, 0x9DC1, 0x3356,

+    0x9DC2, 0x16B3, 0x9DC3, 0x335C, 0x9DC5, 0x335B, 0x9DC7, 0x3357,

+    0x9DC8, 0x3363, 0x9DCA, 0x3358, 0x9DCB, 0x33F9, 0x9DCC, 0x3366,

+    0x9DCD, 0x3368, 0x9DCE, 0x335F, 0x9DCF, 0x3359, 0x9DD0, 0x33FA,

+    0x9DD1, 0x33FC, 0x9DD2, 0x33F6, 0x9DD3, 0x16F0, 0x9DD5, 0x3403,

+    0x9DD6, 0x3401, 0x9DD7, 0x16F1, 0x9DD8, 0x3400, 0x9DD9, 0x33FF,

+    0x9DDA, 0x33F8, 0x9DDB, 0x33F5, 0x9DDC, 0x33FB, 0x9DDD, 0x3404,

+    0x9DDE, 0x33F7, 0x9DDF, 0x33FD, 0x9DE1, 0x3466, 0x9DE2, 0x346B,

+    0x9DE3, 0x3461, 0x9DE4, 0x3464, 0x9DE5, 0x171C, 0x9DE6, 0x3468,

+    0x9DE8, 0x346F, 0x9DE9, 0x33FE, 0x9DEB, 0x3462, 0x9DEC, 0x346C,

+    0x9DED, 0x3470, 0x9DEE, 0x3467, 0x9DEF, 0x3460, 0x9DF0, 0x346A,

+    0x9DF2, 0x3469, 0x9DF3, 0x346E, 0x9DF4, 0x346D, 0x9DF5, 0x3402,

+    0x9DF6, 0x3465, 0x9DF7, 0x345F, 0x9DF8, 0x3463, 0x9DF9, 0x173B,

+    0x9DFA, 0x173C, 0x9DFB, 0x345E, 0x9DFD, 0x34C1, 0x9DFE, 0x34B8,

+    0x9DFF, 0x34C0, 0x9E00, 0x34BD, 0x9E01, 0x34BE, 0x9E02, 0x34B7,

+    0x9E03, 0x34BA, 0x9E04, 0x34C2, 0x9E05, 0x34BC, 0x9E06, 0x34BB,

+    0x9E07, 0x34B9, 0x9E09, 0x34BF, 0x9E0B, 0x34F7, 0x9E0D, 0x34F8,

+    0x9E0F, 0x34FA, 0x9E10, 0x34F9, 0x9E11, 0x34FC, 0x9E12, 0x34FB,

+    0x9E13, 0x3517, 0x9E14, 0x3516, 0x9E15, 0x3530, 0x9E17, 0x3531,

+    0x9E19, 0x353D, 0x9E1A, 0x1765, 0x9E1B, 0x1769, 0x9E1D, 0x3546,

+    0x9E1E, 0x176A, 0x9E75, 0x0BE3, 0x9E79, 0x1661, 0x9E7A, 0x336A,

+    0x9E7C, 0x173D, 0x9E7D, 0x173E, 0x9E7F, 0x0BE4, 0x9E80, 0x2611,

+    0x9E82, 0x0F7A, 0x9E83, 0x2AFC, 0x9E86, 0x2D31, 0x9E87, 0x2D32,

+    0x9E88, 0x2D30, 0x9E89, 0x2F02, 0x9E8A, 0x2F01, 0x9E8B, 0x14C1,

+    0x9E8C, 0x306E, 0x9E8D, 0x2F03, 0x9E8E, 0x306D, 0x9E91, 0x31BD,

+    0x9E92, 0x1605, 0x9E93, 0x1607, 0x9E94, 0x31BC, 0x9E97, 0x1606,

+    0x9E99, 0x32B6, 0x9E9A, 0x32B8, 0x9E9B, 0x32B7, 0x9E9C, 0x336B,

+    0x9E9D, 0x16B5, 0x9E9F, 0x171D, 0x9EA0, 0x34C3, 0x9EA1, 0x34FD,

+    0x9EA4, 0x354A, 0x9EA5, 0x0BE5, 0x9EA7, 0x287C, 0x9EA9, 0x1285,

+    0x9EAD, 0x2D34, 0x9EAE, 0x2D33, 0x9EB0, 0x2F04, 0x9EB4, 0x1608,

+    0x9EB5, 0x1662, 0x9EB6, 0x3405, 0x9EB7, 0x3542, 0x9EBB, 0x0BE6,

+    0x9EBC, 0x10FF, 0x9EBE, 0x1286, 0x9EC0, 0x31BE, 0x9EC2, 0x3471,

+    0x9EC3, 0x0DBB, 0x9EC8, 0x2F05, 0x9ECC, 0x1751, 0x9ECD, 0x0DBC,

+    0x9ECE, 0x1287, 0x9ECF, 0x14C2, 0x9ED0, 0x3472, 0x9ED1, 0x0DBD,

+    0x9ED3, 0x2AFD, 0x9ED4, 0x13B1, 0x9ED5, 0x2D35, 0x9ED6, 0x2D36,

+    0x9ED8, 0x13B0, 0x9EDA, 0x2F06, 0x9EDB, 0x14C6, 0x9EDC, 0x14C4,

+    0x9EDD, 0x14C5, 0x9EDE, 0x14C3, 0x9EDF, 0x306F, 0x9EE0, 0x1572,

+    0x9EE4, 0x32BA, 0x9EE5, 0x32B9, 0x9EE6, 0x32BC, 0x9EE7, 0x32BB,

+    0x9EE8, 0x1663, 0x9EEB, 0x336C, 0x9EED, 0x336E, 0x9EEE, 0x336D,

+    0x9EEF, 0x16B6, 0x9EF0, 0x3406, 0x9EF2, 0x3473, 0x9EF3, 0x3474,

+    0x9EF4, 0x171E, 0x9EF5, 0x34FE, 0x9EF6, 0x3518, 0x9EF7, 0x1762,

+    0x9EF9, 0x2360, 0x9EFA, 0x2D37, 0x9EFB, 0x2F07, 0x9EFC, 0x31BF,

+    0x9EFD, 0x2612, 0x9EFF, 0x2F08, 0x9F00, 0x3071, 0x9F01, 0x3070,

+    0x9F06, 0x3475, 0x9F07, 0x173F, 0x9F09, 0x34FF, 0x9F0A, 0x3519,

+    0x9F0E, 0x0F7B, 0x9F0F, 0x2AFE, 0x9F10, 0x2AFF, 0x9F12, 0x2D38,

+    0x9F13, 0x0F7C, 0x9F15, 0x1573, 0x9F16, 0x3072, 0x9F18, 0x3370,

+    0x9F19, 0x16B7, 0x9F1A, 0x3371, 0x9F1B, 0x336F, 0x9F1C, 0x3476,

+    0x9F1E, 0x34C4, 0x9F20, 0x0F7D, 0x9F22, 0x2F0B, 0x9F23, 0x2F0A,

+    0x9F24, 0x2F09, 0x9F25, 0x3073, 0x9F28, 0x3077, 0x9F29, 0x3076,

+    0x9F2A, 0x3075, 0x9F2B, 0x3074, 0x9F2C, 0x1574, 0x9F2D, 0x31C0,

+    0x9F2E, 0x32BE, 0x9F2F, 0x1664, 0x9F30, 0x32BD, 0x9F31, 0x3372,

+    0x9F32, 0x3409, 0x9F33, 0x3408, 0x9F34, 0x16F2, 0x9F35, 0x3407,

+    0x9F36, 0x3479, 0x9F37, 0x3478, 0x9F38, 0x3477, 0x9F3B, 0x1100,

+    0x9F3D, 0x2D39, 0x9F3E, 0x14C7, 0x9F40, 0x31C1, 0x9F41, 0x31C2,

+    0x9F42, 0x340A, 0x9F43, 0x347A, 0x9F46, 0x34C5, 0x9F47, 0x3500,

+    0x9F48, 0x3532, 0x9F49, 0x354C, 0x9F4A, 0x1101, 0x9F4B, 0x14C8,

+    0x9F4C, 0x3078, 0x9F4D, 0x31C3, 0x9F4E, 0x3373, 0x9F4F, 0x347B,

+    0x9F52, 0x1289, 0x9F54, 0x2F0C, 0x9F55, 0x3079, 0x9F56, 0x31C4,

+    0x9F57, 0x31C5, 0x9F58, 0x31C6, 0x9F59, 0x32C3, 0x9F5B, 0x32BF,

+    0x9F5C, 0x16B8, 0x9F5D, 0x32C2, 0x9F5E, 0x32C1, 0x9F5F, 0x1665,

+    0x9F60, 0x32C0, 0x9F61, 0x1667, 0x9F63, 0x1666, 0x9F64, 0x3375,

+    0x9F65, 0x3374, 0x9F66, 0x16B9, 0x9F67, 0x16BA, 0x9F6A, 0x16F4,

+    0x9F6B, 0x340B, 0x9F6C, 0x16F3, 0x9F6E, 0x347E, 0x9F6F, 0x347F,

+    0x9F70, 0x347D, 0x9F71, 0x347C, 0x9F72, 0x1741, 0x9F74, 0x34C6,

+    0x9F75, 0x34C7, 0x9F76, 0x34C8, 0x9F77, 0x1740, 0x9F78, 0x3501,

+    0x9F79, 0x3504, 0x9F7A, 0x3503, 0x9F7B, 0x3502, 0x9F7E, 0x354B,

+    0x9F8D, 0x13B2, 0x9F90, 0x157C, 0x9F91, 0x32C4, 0x9F92, 0x3376,

+    0x9F94, 0x16F5, 0x9F95, 0x340C, 0x9F98, 0x354D, 0x9F9C, 0x13B3,

+    0x9FA0, 0x2F0D, 0x9FA2, 0x340D, 0x9FA4, 0x351A, 0xE01F, 0x083A,

+    0xE026, 0x09FD, 0xE05B, 0x030D, 0xE063, 0x016B, 0xE073, 0x0860,

+    0xE0F3, 0x0C23, 0xE12E, 0x17E4, 0xE149, 0x212F, 0xE191, 0x115F,

+    0xE1BA, 0x0C79, 0xE1C9, 0x04C3, 0xE22C, 0x18BD, 0xE22D, 0x0CBD,

+    0xE230, 0x0CA5, 0xE266, 0x0CCE, 0xE2A3, 0x0E84, 0xE2BC, 0x0120,

+    0xE2EF, 0x1BA8, 0xE33A, 0x1055, 0xE340, 0x2DE8, 0xE34F, 0x0121,

+    0xE35A, 0x106B, 0xE363, 0x1326, 0xE37C, 0x066B, 0xE37F, 0x132E,

+    0xE3C5, 0x0D35, 0xE3D7, 0x27C2, 0xE3DC, 0x22AD, 0xE417, 0x134C,

+    0xE44A, 0x09CE, 0xE478, 0x0BC7, 0xE485, 0x36E9, 0xE4C5, 0x1391,

+    0xE4DA, 0x16A4, 0xE545, 0x3072, 0xE5D2, 0x0119, 0xE5D3, 0x011A,

+    0xE5D4, 0x011C, 0xE5D5, 0x011B, 0xE5F4, 0x297C, 0xE6C6, 0x1D06,

+    0xE727, 0x29A1, 0xE7D3, 0x181B, 0xE893, 0x2B24, 0xEB40, 0x2F50,

+    0xEB42, 0x1725, 0xEB45, 0x32ED, 0xEB6E, 0x2AD9, 0xEB86, 0x1C14,

+    0xEB9E, 0x12E9, 0xEBA9, 0x2CAE, 0xEBBA, 0x1A64, 0xEBC9, 0x1404,

+    0xEBCF, 0x2324, 0xEBD2, 0x346A, 0xEBDE, 0x2291, 0xEC01, 0x1787,

+    0xEC02, 0x095F, 0xEC15, 0x1E99, 0xEC5B, 0x25C1, 0xEC5E, 0x0D0C,

+    0xECA6, 0x05E6, 0xED28, 0x0728, 0xED6E, 0x24B6, 0xED7C, 0x1806,

+    0xED9E, 0x3511, 0xEDE7, 0x0F82, 0xEE52, 0x05F2, 0xEE98, 0x247D,

+    0xF6B1, 0x01FA, 0xF6B2, 0x01FB, 0xF6B3, 0x01FC, 0xF6B4, 0x01FD,

+    0xF6B5, 0x01FE, 0xF6B6, 0x01FF, 0xF6B7, 0x0200, 0xF6B8, 0x0201,

+    0xF6B9, 0x0202, 0xF6BA, 0x0203, 0xF6BB, 0x0204, 0xF6BC, 0x0205,

+    0xF6BD, 0x0206, 0xF6BE, 0x0207, 0xF6BF, 0x0208, 0xF6C0, 0x0209,

+    0xF6C1, 0x020A, 0xF6C2, 0x020B, 0xF6C3, 0x020C, 0xF6C4, 0x020D,

+    0xF6C5, 0x020E, 0xF6C6, 0x020F, 0xF6C7, 0x0210, 0xF6C8, 0x0211,

+    0xF6C9, 0x0212, 0xF6CA, 0x0213, 0xF6CB, 0x0214, 0xF6CC, 0x0215,

+    0xF6CD, 0x0216, 0xF6CE, 0x0217, 0xF6CF, 0x0219, 0xF6D0, 0x021A,

+    0xF6D1, 0x021B, 0xF6D2, 0x021C, 0xF6D3, 0x021D, 0xF6D4, 0x021E,

+    0xF6D5, 0x021F, 0xF6D6, 0x0220, 0xF6D7, 0x0221, 0xF6D8, 0x0222,

+    0xF6D9, 0x0223, 0xF6DA, 0x0224, 0xF6DB, 0x0225, 0xF6DC, 0x0226,

+    0xF6DD, 0x0227, 0xF6DE, 0x0228, 0xF6E0, 0x022A, 0xF6E1, 0x022B,

+    0xF6E2, 0x022C, 0xF6E4, 0x022E, 0xF6E6, 0x0230, 0xF6E8, 0x35B3,

+    0xF6E9, 0x35B4, 0xF6EA, 0x35B5, 0xF6EB, 0x35B6, 0xF6EC, 0x35B7,

+    0xF6ED, 0x35B8, 0xF6F0, 0x35BA, 0xF6F1, 0x35BB, 0xF6F2, 0x35BC,

+    0xF6F3, 0x35BD, 0xF6F4, 0x35BE, 0xF6F5, 0x35BF, 0xF6F6, 0x35C0,

+    0xF6F7, 0x35C1, 0xF6F8, 0x35C2, 0xF6F9, 0x35C3, 0xF6FA, 0x35C4,

+    0xF6FB, 0x35C5, 0xF6FC, 0x35C6, 0xF6FD, 0x35C7, 0xF6FE, 0x35C8,

+    0xF6FF, 0x35C9, 0xF700, 0x35CA, 0xF701, 0x35CB, 0xF702, 0x35CC,

+    0xF703, 0x35CD, 0xF704, 0x35CE, 0xF705, 0x35CF, 0xF706, 0x35D0,

+    0xF707, 0x35D1, 0xF708, 0x35D2, 0xF709, 0x35D3, 0xF70A, 0x35D4,

+    0xF70B, 0x35D5, 0xF70C, 0x35D6, 0xF70D, 0x35D7, 0xF70E, 0x35D8,

+    0xF70F, 0x35D9, 0xF710, 0x35DA, 0xF711, 0x35DB, 0xF712, 0x35DC,

+    0xF713, 0x35DD, 0xF714, 0x35DE, 0xF715, 0x35DF, 0xF716, 0x35E0,

+    0xF717, 0x35E1, 0xF718, 0x35E2, 0xF719, 0x35E3, 0xF71A, 0x35E4,

+    0xF71B, 0x35E5, 0xF71C, 0x35E6, 0xF71D, 0x35E7, 0xF71E, 0x35E8,

+    0xF71F, 0x35E9, 0xF720, 0x35EA, 0xF721, 0x35EB, 0xF722, 0x35EC,

+    0xF723, 0x35ED, 0xF724, 0x35EE, 0xF725, 0x35EF, 0xF726, 0x35F0,

+    0xF727, 0x35F1, 0xF728, 0x35F2, 0xF729, 0x35F3, 0xF72A, 0x35F4,

+    0xF72B, 0x35F5, 0xF72C, 0x35F6, 0xF72D, 0x35F7, 0xF72E, 0x35F8,

+    0xF72F, 0x35F9, 0xF730, 0x35FA, 0xF731, 0x35FB, 0xF732, 0x35FC,

+    0xF733, 0x35FD, 0xF734, 0x35FE, 0xF735, 0x35FF, 0xF736, 0x3600,

+    0xF737, 0x3601, 0xF738, 0x3602, 0xF739, 0x3603, 0xF73A, 0x3604,

+    0xF73B, 0x3605, 0xF73C, 0x3606, 0xF73D, 0x3607, 0xF73E, 0x3608,

+    0xF73F, 0x3609, 0xF740, 0x360A, 0xF741, 0x360B, 0xF742, 0x360C,

+    0xF743, 0x360D, 0xF744, 0x360E, 0xF745, 0x360F, 0xF746, 0x3610,

+    0xF747, 0x3611, 0xF748, 0x3612, 0xF749, 0x3613, 0xF74A, 0x3614,

+    0xF74B, 0x3615, 0xF74C, 0x3616, 0xF74D, 0x3617, 0xF74E, 0x3618,

+    0xF74F, 0x3619, 0xF750, 0x361A, 0xF751, 0x361B, 0xF752, 0x361C,

+    0xF753, 0x361D, 0xF754, 0x361E, 0xF755, 0x361F, 0xF756, 0x3620,

+    0xF757, 0x3621, 0xF758, 0x3622, 0xF759, 0x3623, 0xF75A, 0x3624,

+    0xF75B, 0x3625, 0xF75C, 0x3626, 0xF75D, 0x3627, 0xF75E, 0x3628,

+    0xF75F, 0x3629, 0xF760, 0x362A, 0xF761, 0x362B, 0xF762, 0x362C,

+    0xF763, 0x362D, 0xF764, 0x362E, 0xF765, 0x362F, 0xF766, 0x3630,

+    0xF767, 0x3631, 0xF768, 0x3632, 0xF769, 0x3633, 0xF76A, 0x3634,

+    0xF76B, 0x3635, 0xF76C, 0x3636, 0xF76D, 0x3637, 0xF76E, 0x3638,

+    0xF76F, 0x3639, 0xF770, 0x363A, 0xF771, 0x363B, 0xF772, 0x363C,

+    0xF773, 0x363D, 0xF774, 0x363E, 0xF775, 0x363F, 0xF776, 0x3640,

+    0xF777, 0x3641, 0xF778, 0x3642, 0xF779, 0x3643, 0xF77A, 0x3644,

+    0xF77B, 0x3645, 0xF77C, 0x3646, 0xF77D, 0x3647, 0xF77E, 0x3648,

+    0xF77F, 0x3649, 0xF780, 0x364A, 0xF781, 0x364B, 0xF782, 0x364C,

+    0xF783, 0x364D, 0xF784, 0x364E, 0xF785, 0x364F, 0xF786, 0x3650,

+    0xF787, 0x3651, 0xF788, 0x3652, 0xF789, 0x3653, 0xF78A, 0x3654,

+    0xF78B, 0x3655, 0xF78C, 0x3656, 0xF78D, 0x3657, 0xF78E, 0x3658,

+    0xF78F, 0x3659, 0xF790, 0x365A, 0xF791, 0x365B, 0xF792, 0x365C,

+    0xF793, 0x365D, 0xF794, 0x365E, 0xF795, 0x365F, 0xF796, 0x3660,

+    0xF797, 0x3661, 0xF798, 0x3662, 0xF799, 0x3663, 0xF79A, 0x3664,

+    0xF79B, 0x3665, 0xF79C, 0x3666, 0xF79D, 0x3667, 0xF79E, 0x3668,

+    0xF79F, 0x3669, 0xF7A0, 0x366A, 0xF7A1, 0x366B, 0xF7A2, 0x366C,

+    0xF7A3, 0x366D, 0xF7A4, 0x366E, 0xF7A5, 0x366F, 0xF7A6, 0x3670,

+    0xF7A7, 0x3671, 0xF7A8, 0x3672, 0xF7A9, 0x3673, 0xF7AA, 0x3674,

+    0xF7AB, 0x3675, 0xF7AC, 0x3676, 0xF7AD, 0x3677, 0xF7AE, 0x3678,

+    0xF7AF, 0x3679, 0xF7B0, 0x367A, 0xF7B1, 0x367B, 0xF7B2, 0x367C,

+    0xF7B3, 0x367D, 0xF7B4, 0x367E, 0xF7B5, 0x367F, 0xF7B6, 0x3680,

+    0xF7B7, 0x3681, 0xF7B8, 0x3682, 0xF7B9, 0x3683, 0xF7BA, 0x3684,

+    0xF7BB, 0x3685, 0xF7BC, 0x3686, 0xF7BD, 0x3687, 0xF7BE, 0x3688,

+    0xF7BF, 0x3689, 0xF7C0, 0x368A, 0xF7C1, 0x368B, 0xF7C2, 0x368C,

+    0xF7C3, 0x368D, 0xF7C4, 0x368E, 0xF7C5, 0x368F, 0xF7C6, 0x3690,

+    0xF7C7, 0x3691, 0xF7C8, 0x3692, 0xF7C9, 0x3693, 0xF7CA, 0x3694,

+    0xF7CB, 0x3695, 0xF7CC, 0x3696, 0xF7CD, 0x3697, 0xF7CE, 0x3698,

+    0xF7CF, 0x3699, 0xF7D0, 0x369A, 0xF7D1, 0x369B, 0xF7D2, 0x369C,

+    0xF7D3, 0x369D, 0xF7D4, 0x369E, 0xF7D5, 0x369F, 0xF7D6, 0x36A0,

+    0xF7D7, 0x36A1, 0xF7D8, 0x36A2, 0xF7D9, 0x36A3, 0xF7DA, 0x36A4,

+    0xF7DB, 0x36A5, 0xF7DC, 0x36A6, 0xF7DD, 0x36A7, 0xF7DE, 0x36A8,

+    0xF7DF, 0x36A9, 0xF7E0, 0x36AA, 0xF7E1, 0x36AB, 0xF7E2, 0x36AC,

+    0xF7E3, 0x36AD, 0xF7E4, 0x36AE, 0xF7E5, 0x36AF, 0xF7E6, 0x36B0,

+    0xF7E7, 0x36B1, 0xF7E8, 0x36B2, 0xF7E9, 0x36B3, 0xF7EA, 0x36B4,

+    0xF7EB, 0x36B5, 0xF7EC, 0x36B6, 0xF7ED, 0x36B7, 0xF7EE, 0x36B8,

+    0xF817, 0x36E1, 0xF818, 0x36E2, 0xF819, 0x36E3, 0xF81A, 0x36E4,

+    0xF81B, 0x36E5, 0xF81C, 0x36E6, 0xF81D, 0x36E7, 0xFA0C, 0x0274,

+    0xFA0D, 0x2381, 0xFE30, 0x006D, 0xFE31, 0x007A, 0xFE33, 0x35AF,

+    0xFE34, 0x35B1, 0xFE35, 0x0082, 0xFE36, 0x0083, 0xFE37, 0x0086,

+    0xFE38, 0x0087, 0xFE39, 0x008A, 0xFE3A, 0x008B, 0xFE3B, 0x008E,

+    0xFE3C, 0x008F, 0xFE3D, 0x0092, 0xFE3E, 0x0093, 0xFE3F, 0x0096,

+    0xFE40, 0x0097, 0xFE41, 0x009A, 0xFE42, 0x009B, 0xFE43, 0x009E,

+    0xFE44, 0x009F, 0xFE49, 0x00C7, 0xFE4A, 0x00C8, 0xFE4B, 0x00CB,

+    0xFE4C, 0x00CC, 0xFE4D, 0x00C9, 0xFE4E, 0x00CA, 0xFE4F, 0x35B2,

+    0xFE50, 0x0070, 0xFE51, 0x0071, 0xFE52, 0x0072, 0xFE54, 0x0074,

+    0xFE55, 0x0075, 0xFE56, 0x0076, 0xFE57, 0x0077, 0xFE59, 0x00A0,

+    0xFE5A, 0x00A1, 0xFE5B, 0x00A2, 0xFE5C, 0x00A3, 0xFE5D, 0x00A4,

+    0xFE5E, 0x00A5, 0xFE5F, 0x00CD, 0xFE60, 0x00CE, 0xFE61, 0x00CF,

+    0xFE62, 0x00DF, 0xFE63, 0x00E0, 0xFE64, 0x00E1, 0xFE65, 0x00E2,

+    0xFE66, 0x00E3, 0xFE68, 0x0102, 0xFE69, 0x010C, 0xFE6A, 0x010D,

+    0xFE6B, 0x010E, 0xFF01, 0x006C, 0xFF02, 0x36E4, 0xFF03, 0x00AE,

+    0xFF04, 0x0103, 0xFF05, 0x0108, 0xFF06, 0x00AF, 0xFF07, 0x36E3,

+    0xFF08, 0x0080, 0xFF09, 0x0081, 0xFF0A, 0x00B0, 0xFF0B, 0x00D0,

+    0xFF0C, 0x0064, 0xFF0D, 0x00D1, 0xFF0E, 0x0067, 0xFF0F, 0x0101,

+    0xFF10, 0x014D, 0xFF11, 0x014E, 0xFF12, 0x014F, 0xFF13, 0x0150,

+    0xFF14, 0x0151, 0xFF15, 0x0152, 0xFF16, 0x0153, 0xFF17, 0x0154,

+    0xFF18, 0x0155, 0xFF19, 0x0156, 0xFF1A, 0x006A, 0xFF1B, 0x0069,

+    0xFF1C, 0x00D6, 0xFF1D, 0x00D8, 0xFF1E, 0x00D7, 0xFF1F, 0x006B,

+    0xFF20, 0x0109, 0xFF21, 0x016D, 0xFF22, 0x016E, 0xFF23, 0x016F,

+    0xFF24, 0x0170, 0xFF25, 0x0171, 0xFF26, 0x0172, 0xFF27, 0x0173,

+    0xFF28, 0x0174, 0xFF29, 0x0175, 0xFF2A, 0x0176, 0xFF2B, 0x0177,

+    0xFF2C, 0x0178, 0xFF2D, 0x0179, 0xFF2E, 0x017A, 0xFF2F, 0x017B,

+    0xFF30, 0x017C, 0xFF31, 0x017D, 0xFF32, 0x017E, 0xFF33, 0x017F,

+    0xFF34, 0x0180, 0xFF35, 0x0181, 0xFF36, 0x0182, 0xFF37, 0x0183,

+    0xFF38, 0x0184, 0xFF39, 0x0185, 0xFF3A, 0x0186, 0xFF3B, 0x35BE,

+    0xFF3C, 0x0102, 0xFF3D, 0x35BF, 0xFF3E, 0x35B4, 0xFF3F, 0x00C5,

+    0xFF41, 0x0187, 0xFF42, 0x0188, 0xFF43, 0x0189, 0xFF44, 0x018A,

+    0xFF45, 0x018B, 0xFF46, 0x018C, 0xFF47, 0x018D, 0xFF48, 0x018E,

+    0xFF49, 0x018F, 0xFF4A, 0x0190, 0xFF4B, 0x0191, 0xFF4C, 0x0192,

+    0xFF4D, 0x0193, 0xFF4E, 0x0194, 0xFF4F, 0x0195, 0xFF50, 0x0196,

+    0xFF51, 0x0197, 0xFF52, 0x0198, 0xFF53, 0x0199, 0xFF54, 0x019A,

+    0xFF55, 0x019B, 0xFF56, 0x019C, 0xFF57, 0x019D, 0xFF58, 0x019E,

+    0xFF59, 0x019F, 0xFF5A, 0x01A0, 0xFF5B, 0x0084, 0xFF5C, 0x0078,

+    0xFF5D, 0x0085, 0xFF5E, 0x00E4, 0xFF64, 0x0071, 0xFFE0, 0x0106,

+    0xFFE1, 0x0107, 0xFFE2, 0x36E1, 0xFFE3, 0x00C4, 0xFFE4, 0x36E2,

+    0xFFE5, 0x0104,

+};

+extern const unsigned short g_FXCMAP_UniCNS_UTF16_H_0_DWord[3 * 3] = {

+    0xD840, 0xDC8A, 0x36B2, 0xD840, 0xDCCC, 0x36B0, 0xD85D, 0xDE07, 0x36B8,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/cmaps_cns1.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/cmaps_cns1.cpp
new file mode 100644
index 0000000..5fa5a4b
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/cmaps_cns1.cpp
@@ -0,0 +1,50 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../../include/fpdfapi/fpdf_resource.h"
+#include "../../../../include/fpdfapi/fpdf_module.h"
+#include "../../fpdf_font/font_int.h"
+#include "../cmap_int.h"
+extern const FX_WORD g_FXCMAP_B5pc_H_0[];
+extern const FX_WORD g_FXCMAP_B5pc_V_0[];
+extern const FX_WORD g_FXCMAP_HKscs_B5_H_5[];
+extern const FX_WORD g_FXCMAP_HKscs_B5_V_5[];
+extern const FX_WORD g_FXCMAP_ETen_B5_H_0[];
+extern const FX_WORD g_FXCMAP_ETen_B5_V_0[];
+extern const FX_WORD g_FXCMAP_ETenms_B5_H_0[];
+extern const FX_WORD g_FXCMAP_ETenms_B5_V_0[];
+extern const FX_WORD g_FXCMAP_CNS_EUC_H_0[];
+extern const FX_WORD g_FXCMAP_CNS_EUC_H_0_DWord[];
+extern const FX_WORD g_FXCMAP_CNS_EUC_V_0[];
+extern const FX_WORD g_FXCMAP_CNS_EUC_V_0_DWord[];
+extern const FX_WORD g_FXCMAP_UniCNS_UCS2_H_3[];
+extern const FX_WORD g_FXCMAP_UniCNS_UCS2_V_3[];
+extern const FX_WORD g_FXCMAP_UniCNS_UTF16_H_0[];
+extern const FX_WORD g_FXCMAP_CNS1CID2Unicode_5[];
+const FXCMAP_CMap g_FXCMAP_CNS1_cmaps[] = {
+    { "B5pc-H", FXCMAP_CMap::Range, g_FXCMAP_B5pc_H_0, 247, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "B5pc-V", FXCMAP_CMap::Range, g_FXCMAP_B5pc_V_0, 12, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "HKscs-B5-H", FXCMAP_CMap::Range, g_FXCMAP_HKscs_B5_H_5, 1210, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "HKscs-B5-V", FXCMAP_CMap::Range, g_FXCMAP_HKscs_B5_V_5, 13, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "ETen-B5-H", FXCMAP_CMap::Range, g_FXCMAP_ETen_B5_H_0, 254, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "ETen-B5-V", FXCMAP_CMap::Range, g_FXCMAP_ETen_B5_V_0, 13, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "ETenms-B5-H", FXCMAP_CMap::Range, g_FXCMAP_ETenms_B5_H_0, 1, FXCMAP_CMap::None, NULL, 0, -2 },
+    { "ETenms-B5-V", FXCMAP_CMap::Range, g_FXCMAP_ETenms_B5_V_0, 18, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "CNS-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_H_0, 157, FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_H_0_DWord, 238, 0 },
+    { "CNS-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_V_0, 180, FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_V_0_DWord, 261, 0 },
+    { "UniCNS-UCS2-H", FXCMAP_CMap::Range, g_FXCMAP_UniCNS_UCS2_H_3, 16418, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "UniCNS-UCS2-V", FXCMAP_CMap::Range, g_FXCMAP_UniCNS_UCS2_V_3, 13, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "UniCNS-UTF16-H", FXCMAP_CMap::Single, g_FXCMAP_UniCNS_UTF16_H_0, 14557, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "UniCNS-UTF16-V", FXCMAP_CMap::Range, g_FXCMAP_UniCNS_UCS2_V_3, 13, FXCMAP_CMap::None, NULL, 0, -1 },
+};
+void CPDF_ModuleMgr::LoadEmbeddedCNS1CMaps()
+{
+    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+    pFontGlobals->m_EmbeddedCharsets[CIDSET_CNS1].m_pMapList = g_FXCMAP_CNS1_cmaps;
+    pFontGlobals->m_EmbeddedCharsets[CIDSET_CNS1].m_Count = sizeof g_FXCMAP_CNS1_cmaps / sizeof (FXCMAP_CMap);
+    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_CNS1].m_pMap = g_FXCMAP_CNS1CID2Unicode_5;
+    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_CNS1].m_Count = 19088;
+}
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/Adobe-GB1-UCS2_5.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/Adobe-GB1-UCS2_5.cpp
new file mode 100644
index 0000000..f75e66e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/Adobe-GB1-UCS2_5.cpp
@@ -0,0 +1,3794 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GB1CID2Unicode_5[30284] = {
+    0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,
+    0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
+    0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
+    0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
+    0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,
+    0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,
+    0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
+    0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,
+    0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
+    0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+    0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
+    0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,
+    0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003,
+    0x3005, 0x2014, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, 0x201C,
+    0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C,
+    0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, 0x00B1,
+    0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, 0x222A,
+    0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, 0x2312,
+    0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, 0x221D,
+    0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, 0x2234,
+    0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, 0x00A4,
+    0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, 0x25CB,
+    0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2,
+    0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x2488, 0x2489,
+    0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2491,
+    0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499,
+    0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479,
+    0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481,
+    0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461,
+    0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469,
+    0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227,
+    0x3228, 0x3229, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165,
+    0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0xFF01, 0xFF02,
+    0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A,
+    0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, 0xFF11, 0xFF12,
+    0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A,
+    0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 0xFF21, 0xFF22,
+    0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A,
+    0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32,
+    0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A,
+    0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 0xFF41, 0xFF42,
+    0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A,
+    0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52,
+    0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A,
+    0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0x3041, 0x3042, 0x3043, 0x3044,
+    0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C,
+    0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054,
+    0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C,
+    0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064,
+    0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C,
+    0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074,
+    0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C,
+    0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084,
+    0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
+    0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1,
+    0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9,
+    0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1,
+    0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9,
+    0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1,
+    0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9,
+    0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1,
+    0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9,
+    0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1,
+    0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9,
+    0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1,
+    0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x0391, 0x0392, 0x0393,
+    0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B,
+    0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4,
+    0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3,
+    0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB,
+    0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4,
+    0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0xFF0C, 0x3002, 0x3001,
+    0xFF1A, 0xFF1B, 0xFF01, 0xFF1F, 0xFE35, 0xFE36, 0xFE39, 0xFE3A,
+    0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, 0xFE44,
+    0x3016, 0x3017, 0xFE3B, 0xFE3C, 0xFE37, 0xFE38, 0xFE31, 0x2026,
+    0xFE33, 0xFE34, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415,
+    0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C,
+    0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424,
+    0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C,
+    0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434,
+    0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B,
+    0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443,
+    0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B,
+    0x044C, 0x044D, 0x044E, 0x044F, 0x0101, 0x00E1, 0x01CE, 0x00E0,
+    0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC,
+    0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9,
+    0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, 0x1E3F,
+    0x0144, 0x0148, 0x01F9, 0x0261, 0x3105, 0x3106, 0x3107, 0x3108,
+    0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, 0x3110,
+    0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118,
+    0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, 0x3120,
+    0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128,
+    0x3129, 0xE7CD, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505,
+    0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, 0x250D,
+    0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515,
+    0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, 0x251D,
+    0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525,
+    0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D,
+    0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535,
+    0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D,
+    0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545,
+    0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0x0021, 0x0022,
+    0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A,
+    0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032,
+    0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A,
+    0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042,
+    0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A,
+    0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052,
+    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A,
+    0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062,
+    0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A,
+    0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072,
+    0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A,
+    0x007B, 0x007C, 0x007D, 0x007E, 0x0101, 0x00E1, 0x01CE, 0x00E0,
+    0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC,
+    0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9,
+    0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, 0x1E3F,
+    0x0144, 0x0148, 0x01F9, 0x0261, 0x554A, 0x963F, 0x57C3, 0x6328,
+    0x54CE, 0x5509, 0x54C0, 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E,
+    0x788D, 0x7231, 0x9698, 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309,
+    0x6697, 0x5CB8, 0x80FA, 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9,
+    0x6556, 0x71AC, 0x7FF1, 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3,
+    0x82AD, 0x634C, 0x6252, 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4,
+    0x5DF4, 0x62D4, 0x8DCB, 0x9776, 0x628A, 0x8019, 0x575D, 0x9738,
+    0x7F62, 0x7238, 0x767D, 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25,
+    0x62DC, 0x7A17, 0x6591, 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881,
+    0x677F, 0x7248, 0x626E, 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E,
+    0x7ECA, 0x90A6, 0x5E2E, 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2,
+    0x78C5, 0x868C, 0x9551, 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305,
+    0x8912, 0x5265, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D,
+    0x62B1, 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891,
+    0x60B2, 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D,
+    0x72C8, 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C,
+    0x7B28, 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C,
+    0x9F3B, 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D,
+    0x6BD5, 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D,
+    0x5F0A, 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD,
+    0x8FB9, 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8,
+    0x8FA9, 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6,
+    0x618B, 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE,
+    0x6448, 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3,
+    0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, 0x6CE2,
+    0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, 0x8236,
+    0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, 0x54FA,
+    0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, 0x6016,
+    0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, 0x8E29,
+    0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, 0x6B8B,
+    0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, 0x85CF,
+    0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, 0x4FA7,
+    0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, 0x8336,
+    0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, 0x62C6,
+    0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, 0x7F20,
+    0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316, 0x573A, 0x5C1D,
+    0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, 0x655E, 0x7545, 0x5531,
+    0x5021, 0x8D85, 0x6284, 0x949E, 0x671D, 0x5632, 0x6F6E, 0x5DE2,
+    0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4, 0x63A3, 0x5F7B, 0x6F88,
+    0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668, 0x5FF1, 0x6C89, 0x9648,
+    0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE, 0x6A59, 0x6210, 0x5448,
+    0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, 0x627F, 0x901E, 0x9A8B,
+    0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, 0x6C60, 0x8FDF, 0x5F1B,
+    0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, 0x8D64, 0x7FC5, 0x65A5,
+    0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, 0x5BA0, 0x62BD, 0x916C,
+    0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, 0x4EC7, 0x7EF8, 0x7785,
+    0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71, 0x53A8, 0x8E87, 0x9504,
+    0x96CF, 0x6EC1, 0x9664, 0x695A, 0x7840, 0x50A8, 0x77D7, 0x6410,
+    0x89E6, 0x5904, 0x63E3, 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239,
+    0x5598, 0x4E32, 0x75AE, 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B,
+    0x5439, 0x708A, 0x6376, 0x9524, 0x5782, 0x6625, 0x693F, 0x9187,
+    0x5507, 0x6DF3, 0x7EAF, 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328,
+    0x78C1, 0x96CC, 0x8F9E, 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A,
+    0x8D50, 0x6B21, 0x806A, 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B,
+    0x51D1, 0x7C97, 0x918B, 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C,
+    0x6467, 0x5D14, 0x50AC, 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0,
+    0x6751, 0x5B58, 0x5BF8, 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B,
+    0x9519, 0x642D, 0x8FBE, 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446,
+    0x6B79, 0x50A3, 0x6234, 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B,
+    0x5F85, 0x902E, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8,
+    0x63B8, 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE,
+    0x5F39, 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200,
+    0x6363, 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B,
+    0x60BC, 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F,
+    0x767B, 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4,
+    0x8FEA, 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5,
+    0x5E95, 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14,
+    0x98A0, 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB,
+    0x7535, 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF,
+    0x7889, 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493,
+    0x8C03, 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0,
+    0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, 0x5B9A,
+    0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, 0x680B,
+    0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, 0x9661,
+    0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, 0x72EC,
+    0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, 0x5EA6,
+    0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, 0x7F0E,
+    0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, 0x6566,
+    0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, 0x591A,
+    0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, 0x60F0,
+    0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, 0x5A25,
+    0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, 0x800C,
+    0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0x8D30, 0x53D1,
+    0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600, 0x6CD5, 0x73D0, 0x85E9,
+    0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE, 0x9492, 0x7E41, 0x51E1,
+    0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29, 0x72AF, 0x996D, 0x6CDB,
+    0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, 0x9632, 0x59A8, 0x4EFF,
+    0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, 0x5561, 0x98DE, 0x80A5,
+    0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, 0x6CB8, 0x8D39, 0x82AC,
+    0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, 0x575F, 0x711A, 0x6C7E,
+    0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, 0x7CAA, 0x4E30, 0x5C01,
+    0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE, 0x75AF, 0x70FD, 0x9022,
+    0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4, 0x4F5B, 0x5426, 0x592B,
+    0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2, 0x8F90, 0x5E45, 0x6C1F,
+    0x7B26, 0x4F0F, 0x4FD8, 0x670D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1,
+    0x5F17, 0x752B, 0x629A, 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F,
+    0x8151, 0x5E9C, 0x8150, 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D,
+    0x5085, 0x4ED8, 0x961C, 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3,
+    0x9644, 0x5987, 0x7F1A, 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539,
+    0x6982, 0x9499, 0x76D6, 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1,
+    0x7AFF, 0x809D, 0x8D76, 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188,
+    0x521A, 0x94A2, 0x7F38, 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760,
+    0x7BD9, 0x768B, 0x9AD8, 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550,
+    0x7A3F, 0x544A, 0x54E5, 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3,
+    0x7599, 0x5272, 0x9769, 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694,
+    0x94EC, 0x4E2A, 0x5404, 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4,
+    0x5E9A, 0x7FB9, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F,
+    0x606D, 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9,
+    0x6C5E, 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF,
+    0x72D7, 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495,
+    0x7B8D, 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA,
+    0x9AA8, 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E,
+    0x74DC, 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A,
+    0x68FA, 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50,
+    0x60EF, 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4,
+    0x572D, 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1,
+    0x7678, 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA,
+    0x68CD, 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8,
+    0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, 0x9163,
+    0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, 0x558A,
+    0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, 0x710A,
+    0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, 0x8C6A,
+    0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, 0x559D,
+    0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, 0x76D2,
+    0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, 0x8D3A,
+    0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, 0x4EA8,
+    0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, 0x9E3F,
+    0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, 0x543C,
+    0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, 0x58F6,
+    0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56, 0x5F27, 0x864E,
+    0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237, 0x82B1, 0x54D7, 0x534E,
+    0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, 0x8BDD, 0x69D0, 0x5F8A,
+    0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, 0x6853, 0x8FD8, 0x7F13,
+    0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, 0x7115, 0x6DA3, 0x5BA6,
+    0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, 0x8757, 0x7C27, 0x7687,
+    0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, 0x604D, 0x8C0E, 0x7070,
+    0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4, 0x56DE, 0x6BC1, 0x6094,
+    0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F, 0x79FD, 0x4F1A, 0x70E9,
+    0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364, 0x660F, 0x5A5A, 0x9B42,
+    0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, 0x706B, 0x83B7, 0x6216,
+    0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, 0x573E, 0x57FA, 0x673A,
+    0x7578, 0x7A3D, 0x79EF, 0x7B95, 0x808C, 0x9965, 0x8FF9, 0x6FC0,
+    0x8BA5, 0x9E21, 0x59EC, 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8,
+    0x8F91, 0x7C4D, 0x96C6, 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373,
+    0x5AC9, 0x7EA7, 0x6324, 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280,
+    0x5180, 0x5B63, 0x4F0E, 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4,
+    0x5BC2, 0x8BA1, 0x8BB0, 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7,
+    0x7EAA, 0x5609, 0x67B7, 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A,
+    0x988A, 0x8D3E, 0x7532, 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6,
+    0x9A7E, 0x5AC1, 0x6B7C, 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4,
+    0x714E, 0x517C, 0x80A9, 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0,
+    0x67EC, 0x78B1, 0x7877, 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A,
+    0x51CF, 0x8350, 0x69DB, 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E,
+    0x7BAD, 0x4EF6, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85,
+    0x6DA7, 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586,
+    0x848B, 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549,
+    0x6912, 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84,
+    0x5A07, 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1,
+    0x89D2, 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F,
+    0x8F83, 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857,
+    0x9636, 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B,
+    0x7AED, 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5,
+    0x754C, 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B,
+    0x65A4, 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5,
+    0x8C28, 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78,
+    0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, 0x9CB8,
+    0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, 0x666F,
+    0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, 0x9756,
+    0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, 0x7EA0,
+    0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, 0x6551,
+    0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, 0x62D8,
+    0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, 0x77E9,
+    0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, 0x8DDD,
+    0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, 0x6350,
+    0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, 0x652B,
+    0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, 0x7EDD,
+    0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB, 0x4FCA, 0x7AE3,
+    0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, 0x5361, 0x54AF, 0x5F00,
+    0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, 0x582A, 0x52D8, 0x574E,
+    0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, 0x625B, 0x6297, 0x4EA2,
+    0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, 0x5777, 0x82DB, 0x67EF,
+    0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3, 0x54B3, 0x53EF, 0x6E34,
+    0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF, 0x5543, 0x57A6, 0x6073,
+    0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, 0x63A7, 0x62A0, 0x53E3,
+    0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, 0x82E6, 0x9177, 0x5E93,
+    0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, 0x80EF, 0x5757, 0x7B77,
+    0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, 0x7B50, 0x72C2, 0x6846,
+    0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, 0x76D4, 0x5CBF, 0x7AA5,
+    0x8475, 0x594E, 0x9B41, 0x5080, 0x9988, 0x6127, 0x6E83, 0x5764,
+    0x6606, 0x6346, 0x56F0, 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783,
+    0x62C9, 0x5587, 0x8721, 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765,
+    0x8D56, 0x84DD, 0x5A6A, 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170,
+    0x6F9C, 0x8C30, 0x63FD, 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5,
+    0x7405, 0x6994, 0x72FC, 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E,
+    0x52B3, 0x7262, 0x8001, 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D,
+    0x52D2, 0x4E50, 0x96F7, 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121,
+    0x5792, 0x64C2, 0x808B, 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7,
+    0x5398, 0x68A8, 0x7281, 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13,
+    0x7406, 0x674E, 0x91CC, 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F,
+    0x6817, 0x4E3D, 0x5389, 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088,
+    0x4F8B, 0x4FD0, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B,
+    0x7483, 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9,
+    0x601C, 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC,
+    0x7EC3, 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86,
+    0x91CF, 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597,
+    0x71CE, 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6,
+    0x6599, 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797,
+    0x78F7, 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41,
+    0x541D, 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36,
+    0x7F9A, 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4,
+    0x6E9C, 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624,
+    0x6D41, 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF,
+    0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, 0x7BD3,
+    0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, 0x63B3,
+    0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, 0x8D42,
+    0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, 0x5415,
+    0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, 0x6C2F,
+    0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, 0x6EE6,
+    0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, 0x4ED1,
+    0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, 0x9523,
+    0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, 0x5988,
+    0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, 0x5417,
+    0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, 0x9992,
+    0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B, 0x8C29, 0x8292,
+    0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, 0x732B, 0x8305, 0x951A,
+    0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, 0x5192, 0x5E3D, 0x8C8C,
+    0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885, 0x9176, 0x9709, 0x7164,
+    0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF, 0x7F8E, 0x6627, 0x5BD0,
+    0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC, 0x840C, 0x8499, 0x6AAC,
+    0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F, 0x772F, 0x919A, 0x9761,
+    0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, 0x79D8, 0x89C5, 0x6CCC,
+    0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, 0x7EF5, 0x5195, 0x514D,
+    0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, 0x63CF, 0x7784, 0x85D0,
+    0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, 0x706D, 0x6C11, 0x62BF,
+    0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, 0x879F, 0x9E23, 0x94ED,
+    0x540D, 0x547D, 0x8C2C, 0x6478, 0x6479, 0x8611, 0x6A21, 0x819C,
+    0x78E8, 0x6469, 0x9B54, 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8,
+    0x6CAB, 0x6F20, 0x5BDE, 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7,
+    0x7261, 0x4EA9, 0x59C6, 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF,
+    0x6155, 0x6728, 0x76EE, 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA,
+    0x5450, 0x94A0, 0x90A3, 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976,
+    0x8010, 0x5948, 0x5357, 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111,
+    0x607C, 0x95F9, 0x6DD6, 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD,
+    0x59AE, 0x9713, 0x502A, 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F,
+    0x817B, 0x9006, 0x6EBA, 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5,
+    0x637B, 0x5FF5, 0x5A18, 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042,
+    0x5B7D, 0x556E, 0x954A, 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE,
+    0x51DD, 0x5B81, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD,
+    0x8113, 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973,
+    0x6696, 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6,
+    0x6B27, 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A,
+    0x8DB4, 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C,
+    0x5F98, 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC,
+    0x7554, 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6,
+    0x629B, 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478,
+    0x80DA, 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B,
+    0x55B7, 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC,
+    0x68DA, 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0,
+    0x576F, 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7,
+    0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, 0x5C41,
+    0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, 0x74E2,
+    0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, 0x8058,
+    0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, 0x8BC4,
+    0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, 0x8FEB,
+    0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, 0x83E9,
+    0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, 0x66DD,
+    0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, 0x51C4,
+    0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, 0x7566,
+    0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, 0x8D77,
+    0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, 0x6C14,
+    0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0x6070, 0x6D3D,
+    0x7275, 0x6266, 0x948E, 0x94C5, 0x5343, 0x8FC1, 0x7B7E, 0x4EDF,
+    0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3, 0x524D, 0x6F5C, 0x9063,
+    0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20, 0x6B49, 0x67AA, 0x545B,
+    0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A, 0x62A2, 0x6A47, 0x9539,
+    0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, 0x4FA8, 0x5DE7, 0x9798,
+    0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, 0x5207, 0x8304, 0x4E14,
+    0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, 0x79E6, 0x7434, 0x52E4,
+    0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, 0x9752, 0x8F7B, 0x6C22,
+    0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, 0x6C30, 0x60C5, 0x9877,
+    0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB, 0x4E18, 0x90B1, 0x7403,
+    0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B, 0x533A, 0x86C6, 0x66F2,
+    0x8EAF, 0x5C48, 0x9A71, 0x6E20, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3,
+    0x53BB, 0x5708, 0x98A7, 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA,
+    0x62F3, 0x72AC, 0x5238, 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374,
+    0x9E4A, 0x69B7, 0x786E, 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3,
+    0x5189, 0x67D3, 0x74E4, 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976,
+    0x6270, 0x7ED5, 0x60F9, 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD,
+    0x97E7, 0x4EFB, 0x8BA4, 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD,
+    0x65E5, 0x620E, 0x8338, 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6,
+    0x5BB9, 0x7ED2, 0x5197, 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815,
+    0x5112, 0x5B7A, 0x5982, 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925,
+    0x8F6F, 0x962E, 0x854A, 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5,
+    0x5F31, 0x6492, 0x6D12, 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B,
+    0x4E09, 0x53C1, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414,
+    0x9A9A, 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7,
+    0x838E, 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565,
+    0x715E, 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220,
+    0x717D, 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584,
+    0x6C55, 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C,
+    0x4E0A, 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D,
+    0x52FA, 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A,
+    0x86C7, 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89,
+    0x793E, 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1,
+    0x5A20, 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE,
+    0x614E, 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3,
+    0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, 0x72EE,
+    0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, 0x62FE,
+    0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, 0x77E2,
+    0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, 0x4E16,
+    0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, 0x55DC,
+    0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, 0x5E02,
+    0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, 0x5B88,
+    0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, 0x67A2,
+    0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, 0x758F,
+    0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, 0x7F72,
+    0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, 0x675F,
+    0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31, 0x6055, 0x5237,
+    0x800D, 0x6454, 0x8870, 0x7529, 0x5E05, 0x6813, 0x62F4, 0x971C,
+    0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761, 0x7A0E, 0x542E, 0x77AC,
+    0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, 0x70C1, 0x65AF, 0x6495,
+    0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, 0x6B7B, 0x8086, 0x5BFA,
+    0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, 0x5DF3, 0x677E, 0x8038,
+    0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, 0x8BF5, 0x641C, 0x8258,
+    0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, 0x7D20, 0x901F, 0x7C9F,
+    0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, 0x8083, 0x9178, 0x849C,
+    0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5, 0x9AD3, 0x788E, 0x5C81,
+    0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59, 0x635F, 0x7B0B, 0x84D1,
+    0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22, 0x9501, 0x6240, 0x584C,
+    0x4ED6, 0x5B83, 0x5979, 0x5854, 0x736D, 0x631E, 0x8E4B, 0x8E0F,
+    0x80CE, 0x82D4, 0x62AC, 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001,
+    0x6C70, 0x574D, 0x644A, 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80,
+    0x75F0, 0x6F6D, 0x8C2D, 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3,
+    0x63A2, 0x53F9, 0x70AD, 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0,
+    0x819B, 0x5510, 0x7CD6, 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB,
+    0x638F, 0x6D9B, 0x6ED4, 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8,
+    0x9676, 0x8BA8, 0x5957, 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A,
+    0x68AF, 0x5254, 0x8E22, 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C,
+    0x4F53, 0x66FF, 0x568F, 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929,
+    0x6DFB, 0x586B, 0x7530, 0x751C, 0x606C, 0x8214, 0x8146, 0x6311,
+    0x6761, 0x8FE2, 0x773A, 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385,
+    0x542C, 0x70C3, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A,
+    0x8247, 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64,
+    0x7AE5, 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295,
+    0x5934, 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014,
+    0x6D82, 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8,
+    0x9893, 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0,
+    0x62D6, 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D,
+    0x59A5, 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03,
+    0x74E6, 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9,
+    0x987D, 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696,
+    0x60CB, 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1,
+    0x6789, 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01,
+    0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, 0x552F,
+    0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, 0x4F1F,
+    0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, 0x80C3,
+    0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, 0x536B,
+    0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, 0x7A33,
+    0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, 0x6DA1,
+    0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, 0x545C,
+    0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, 0x68A7,
+    0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, 0x821E,
+    0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, 0x52FF,
+    0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, 0x7852,
+    0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A, 0x7A00, 0x606F,
+    0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, 0x7184, 0x70EF, 0x6EAA,
+    0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, 0x4E60, 0x5AB3, 0x559C,
+    0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, 0x7EC6, 0x778E, 0x867E,
+    0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, 0x4FA0, 0x72ED, 0x4E0B,
+    0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, 0x5148, 0x4ED9, 0x9C9C,
+    0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237, 0x95F2, 0x6D8E, 0x5F26,
+    0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E, 0x53BF, 0x817A, 0x9985,
+    0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF, 0x76F8, 0x53A2, 0x9576,
+    0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61, 0x7FD4, 0x7965, 0x8BE6,
+    0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, 0x6A61, 0x50CF, 0x5411,
+    0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, 0x54EE, 0x56A3, 0x9500,
+    0x6D88, 0x5BB5, 0x6DC6, 0x6653, 0x5C0F, 0x5B5D, 0x6821, 0x8096,
+    0x5578, 0x7B11, 0x6548, 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B,
+    0x534F, 0x631F, 0x643A, 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199,
+    0x68B0, 0x5378, 0x87F9, 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51,
+    0x85AA, 0x82AF, 0x950C, 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3,
+    0x4FE1, 0x8845, 0x661F, 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211,
+    0x578B, 0x5F62, 0x90A2, 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027,
+    0x59D3, 0x5144, 0x51F6, 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A,
+    0x4F11, 0x4FEE, 0x7F9E, 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896,
+    0x7EE3, 0x589F, 0x620C, 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90,
+    0x8BB8, 0x84C4, 0x9157, 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064,
+    0x7D6E, 0x5A7F, 0x7EEA, 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC,
+    0x65CB, 0x7384, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B,
+    0x5B66, 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC,
+    0x8BE2, 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF,
+    0x900A, 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B,
+    0x82BD, 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1,
+    0x4E9A, 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0,
+    0x4E25, 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E,
+    0x708E, 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273,
+    0x5830, 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130,
+    0x5BB4, 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768,
+    0x626C, 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0,
+    0x75D2, 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476,
+    0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, 0x8200,
+    0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, 0x91CE,
+    0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, 0x814B,
+    0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, 0x4F9D,
+    0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, 0x80F0,
+    0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, 0x501A,
+    0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, 0x9091,
+    0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, 0x4EA6,
+    0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, 0x8BE3,
+    0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, 0x8335,
+    0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, 0x94F6,
+    0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690, 0x5370, 0x82F1,
+    0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, 0x83B9, 0x8424, 0x8425,
+    0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, 0x5F71, 0x9896, 0x786C,
+    0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, 0x75C8, 0x5EB8, 0x96CD,
+    0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, 0x6C38, 0x607F, 0x52C7,
+    0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7, 0x5C24, 0x7531, 0x90AE,
+    0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149, 0x6709, 0x53CB, 0x53F3,
+    0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, 0x6DE4, 0x4E8E,
+    0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, 0x4F59, 0x4FDE, 0x903E,
+    0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, 0x4E88, 0x5A31, 0x96E8,
+    0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, 0x7FBD, 0x7389, 0x57DF,
+    0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, 0x5CEA, 0x5FA1, 0x6108,
+    0x6B32, 0x72F1, 0x80B2, 0x8A89, 0x6D74, 0x5BD3, 0x88D5, 0x9884,
+    0x8C6B, 0x9A6D, 0x9E33, 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881,
+    0x539F, 0x63F4, 0x8F95, 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90,
+    0x7F18, 0x8FDC, 0x82D1, 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6,
+    0x8D8A, 0x8DC3, 0x94A5, 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605,
+    0x8018, 0x4E91, 0x90E7, 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574,
+    0x915D, 0x6655, 0x97F5, 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D,
+    0x54C9, 0x707E, 0x5BB0, 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512,
+    0x6682, 0x8D5E, 0x8D43, 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF,
+    0x85FB, 0x67A3, 0x65E9, 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020,
+    0x7682, 0x7076, 0x71E5, 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C,
+    0x600E, 0x589E, 0x618E, 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23,
+    0x672D, 0x8F67, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B,
+    0x4E4D, 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A,
+    0x5BE8, 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9,
+    0x8F97, 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9,
+    0x6E5B, 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C,
+    0x6DA8, 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634,
+    0x969C, 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69,
+    0x5146, 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99,
+    0x8005, 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F,
+    0x7504, 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9,
+    0x8BCA, 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741,
+    0x5F81, 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F,
+    0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, 0x5431,
+    0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, 0x804C,
+    0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, 0x6307,
+    0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, 0x63B7,
+    0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, 0x79E9,
+    0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, 0x4E2D,
+    0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, 0x91CD,
+    0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, 0x7CA5,
+    0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, 0x9AA4,
+    0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, 0x9010,
+    0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, 0x8457,
+    0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0x4F4F, 0x6CE8,
+    0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, 0x4E13, 0x7816, 0x8F6C,
+    0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84, 0x88C5, 0x5986, 0x649E,
+    0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD, 0x8D58, 0x5760, 0x7F00,
+    0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353, 0x684C, 0x7422, 0x8301,
+    0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A, 0x5179, 0x54A8, 0x8D44,
+    0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, 0x7C7D, 0x6ED3,
+    0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, 0x68D5, 0x8E2A, 0x5B97,
+    0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, 0x594F, 0x63CD, 0x79DF,
+    0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, 0x963B, 0x7EC4, 0x94BB,
+    0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, 0x5C0A, 0x9075, 0x6628,
+    0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, 0x5750, 0x5EA7, 0x4E8D,
+    0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, 0x4E98, 0x4E1E,
+    0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, 0x5315, 0x4E47,
+    0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, 0x9997, 0x6BD3,
+    0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, 0x4E69, 0x4E93,
+    0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, 0x539D, 0x53A3,
+    0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, 0x5326, 0x532E,
+    0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, 0x520E, 0x522D,
+    0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, 0x525C, 0x84AF,
+    0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7F54, 0x4EBB,
+    0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, 0x4EDE, 0x4F1B,
+    0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27, 0x4F09, 0x4F2B,
+    0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, 0x4F5F, 0x4F57, 0x4F32,
+    0x4F3D, 0x4F76, 0x4F74, 0x4F91, 0x4F89, 0x4F83, 0x4F8F, 0x4F7E,
+    0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA,
+    0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, 0x4FDF, 0x4FF8, 0x5029,
+    0x504C, 0x4FF3, 0x502C, 0x500F, 0x502E, 0x502D, 0x4FFE, 0x501C,
+    0x500C, 0x5025, 0x5028, 0x507E, 0x5043, 0x5055, 0x5048, 0x504E,
+    0x506C, 0x507B, 0x50A5, 0x50A7, 0x50A9, 0x50BA, 0x50D6, 0x5106,
+    0x50ED, 0x50EC, 0x50E6, 0x50EE, 0x5107, 0x510B, 0x4EDD, 0x6C3D,
+    0x4F58, 0x4F65, 0x4FCE, 0x9FA0, 0x6C46, 0x7C74, 0x516E, 0x5DFD,
+    0x9EC9, 0x9998, 0x5181, 0x5914, 0x52F9, 0x530D, 0x8A07, 0x5310,
+    0x51EB, 0x5919, 0x5155, 0x4EA0, 0x5156, 0x4EB3, 0x886E, 0x88A4,
+    0x4EB5, 0x8114, 0x88D2, 0x7980, 0x5B34, 0x8803, 0x7FB8, 0x51AB,
+    0x51B1, 0x51BD, 0x51BC, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0,
+    0x8BA6, 0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3,
+    0x8BCB, 0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8,
+    0x8BD9, 0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE,
+    0x8BF0, 0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02,
+    0x8C04, 0x8C07, 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15,
+    0x8C16, 0x8C19, 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21,
+    0x8C25, 0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33,
+    0x8C35, 0x8C36, 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631,
+    0x962A, 0x963D, 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667,
+    0x966C, 0x9672, 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097,
+    0x909B, 0x909D, 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6,
+    0x90BA, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4,
+    0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB,
+    0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F,
+    0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD,
+    0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD,
+    0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF,
+    0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729,
+    0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B,
+    0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768,
+    0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF,
+    0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9,
+    0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD, 0x580B,
+    0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, 0x5844, 0x5820,
+    0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, 0x99A8, 0x9F19,
+    0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, 0x82A8, 0x8284,
+    0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, 0x82BE, 0x82B0,
+    0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, 0x82CB, 0x82CC,
+    0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, 0x82C4, 0x82CE,
+    0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, 0x8307, 0x82DC,
+    0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, 0x8311, 0x831A,
+    0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C, 0x8351, 0x835B,
+    0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, 0x839B, 0x835E,
+    0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340, 0x8317, 0x8360,
+    0x832D, 0x833A, 0x8333, 0x8366, 0x8365, 0x8368, 0x831B, 0x8369,
+    0x836C, 0x836A, 0x836D, 0x836E, 0x83B0, 0x8378, 0x83B3, 0x83B4,
+    0x83A0, 0x83AA, 0x8393, 0x839C, 0x8385, 0x837C, 0x83B6, 0x83A9,
+    0x837D, 0x83B8, 0x837B, 0x8398, 0x839E, 0x83A8, 0x83BA, 0x83BC,
+    0x83C1, 0x8401, 0x83E5, 0x83D8, 0x5807, 0x8418, 0x840B, 0x83DD,
+    0x83FD, 0x83D6, 0x841C, 0x8438, 0x8411, 0x8406, 0x83D4, 0x83DF,
+    0x840F, 0x8403, 0x83F8, 0x83F9, 0x83EA, 0x83C5, 0x83C0, 0x8426,
+    0x83F0, 0x83E1, 0x845C, 0x8451, 0x845A, 0x8459, 0x8473, 0x8487,
+    0x8488, 0x847A, 0x8489, 0x8478, 0x843C, 0x8446, 0x8469, 0x8476,
+    0x848C, 0x848E, 0x8431, 0x846D, 0x84C1, 0x84CD, 0x84D0, 0x84E6,
+    0x84BD, 0x84D3, 0x84CA, 0x84BF, 0x84BA, 0x84E0, 0x84A1, 0x84B9,
+    0x84B4, 0x8497, 0x84E5, 0x84E3, 0x850C, 0x750D, 0x8538, 0x84F0,
+    0x8539, 0x851F, 0x853A, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559,
+    0x8548, 0x8568, 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572,
+    0x857B, 0x85A4, 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C,
+    0x8585, 0x85B9, 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF,
+    0x8627, 0x8605, 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C,
+    0x5941, 0x8037, 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25,
+    0x5C2C, 0x5C34, 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA,
+    0x62D7, 0x62EE, 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD,
+    0x63F6, 0x6371, 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A,
+    0x6369, 0x63AE, 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4,
+    0x63DE, 0x63CE, 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B,
+    0x641B, 0x6420, 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D,
+    0x6496, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0,
+    0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2,
+    0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB,
+    0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456,
+    0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494,
+    0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466,
+    0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6,
+    0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC,
+    0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF,
+    0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522,
+    0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5,
+    0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C, 0x5537,
+    0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555C, 0x558B,
+    0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, 0x559F, 0x557E,
+    0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, 0x5594, 0x5599,
+    0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, 0x55EC, 0x55D4,
+    0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, 0x55F3, 0x55CC,
+    0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E, 0x5608, 0x560C,
+    0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627, 0x562D, 0x5658,
+    0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, 0x565C, 0x564C,
+    0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, 0x567C, 0x5685,
+    0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, 0x56F5, 0x56EB,
+    0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, 0x5E0F, 0x5E19,
+    0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, 0x5E37, 0x5E44, 0x5E54,
+    0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, 0x5C8D, 0x5C90, 0x5C96,
+    0x5C88, 0x5C98, 0x5C99, 0x5C91, 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2,
+    0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4,
+    0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, 0x5D03, 0x5D27, 0x5D26,
+    0x5D2E, 0x5D24, 0x5D1E, 0x5D06, 0x5D1B, 0x5D58, 0x5D3E, 0x5D34,
+    0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A,
+    0x5D69, 0x5D74, 0x5D82, 0x5D99, 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5,
+    0x5F73, 0x5F77, 0x5F82, 0x5F87, 0x5F89, 0x5F8C, 0x5F95, 0x5F99,
+    0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, 0x8862, 0x5F61, 0x72AD,
+    0x72B0, 0x72B4, 0x72B7, 0x72B8, 0x72C3, 0x72C1, 0x72CE, 0x72CD,
+    0x72D2, 0x72E8, 0x72EF, 0x72E9, 0x72F2, 0x72F4, 0x72F7, 0x7301,
+    0x72F3, 0x7303, 0x72FA, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A,
+    0x731E, 0x731D, 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338,
+    0x7331, 0x7350, 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E,
+    0x821B, 0x5925, 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968,
+    0x9969, 0x996A, 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980,
+    0x9984, 0x9987, 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994,
+    0x9995, 0x5E80, 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9,
+    0x5EB5, 0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8,
+    0x5EEA, 0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE,
+    0x6004, 0x5FE1, 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED,
+    0x5FF8, 0x6019, 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029,
+    0x602B, 0x600A, 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A,
+    0x6042, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083,
+    0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8,
+    0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4,
+    0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7,
+    0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1,
+    0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606,
+    0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615,
+    0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35,
+    0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C,
+    0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4,
+    0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6,
+    0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE, 0x6D39,
+    0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, 0x6D19, 0x6D0E,
+    0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, 0x6D52, 0x6D54,
+    0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, 0x6D93, 0x6D94,
+    0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, 0x6DC5, 0x6DDE,
+    0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD, 0x6DD9, 0x6E16,
+    0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, 0x6E6B, 0x6EB2,
+    0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, 0x6E44, 0x6EDF,
+    0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, 0x6EA7, 0x6EBD,
+    0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, 0x6EC2, 0x6E9F,
+    0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, 0x6F2F, 0x6F36,
+    0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, 0x6F8D, 0x6F8C,
+    0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, 0x6FC9, 0x6FA7, 0x6FB9,
+    0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, 0x6FE0, 0x6FEF, 0x701A,
+    0x7023, 0x701B, 0x7039, 0x7035, 0x704F, 0x705E, 0x5B80, 0x5B84,
+    0x5B95, 0x5B93, 0x5BA5, 0x5BB8, 0x752F, 0x9A9E, 0x6434, 0x5BE4,
+    0x5BEE, 0x8930, 0x5BF0, 0x8E47, 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5,
+    0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, 0x8FF3, 0x8FE8, 0x9005,
+    0x9004, 0x900B, 0x9026, 0x9011, 0x900D, 0x9016, 0x9021, 0x9035,
+    0x9036, 0x902D, 0x902F, 0x9044, 0x9051, 0x9052, 0x9050, 0x9068,
+    0x9058, 0x9062, 0x905B, 0x66B9, 0x9074, 0x907D, 0x9082, 0x9088,
+    0x9083, 0x908B, 0x5F50, 0x5F57, 0x5F56, 0x5F58, 0x5C3B, 0x54AB,
+    0x5C50, 0x5C59, 0x5B71, 0x5C63, 0x5C66, 0x7FBC, 0x5F2A, 0x5F29,
+    0x5F2D, 0x8274, 0x5F3C, 0x9B3B, 0x5C6E, 0x5981, 0x5983, 0x598D,
+    0x59A9, 0x59AA, 0x59A3, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4,
+    0x59D2, 0x59B2, 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD,
+    0x5A08, 0x59E3, 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34,
+    0x5A11, 0x5A23, 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C,
+    0x5A62, 0x5A75, 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE,
+    0x5AEB, 0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1,
+    0x5AD6, 0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32,
+    0x5B37, 0x5B40, 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51,
+    0x5B53, 0x5B62, 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D,
+    0x9A80, 0x9A81, 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93,
+    0x9A96, 0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2,
+    0x9AA3, 0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8,
+    0x7EA9, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9,
+    0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1,
+    0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6,
+    0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08,
+    0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C,
+    0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26,
+    0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31,
+    0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095,
+    0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1,
+    0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C,
+    0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A,
+    0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C, 0x741B,
+    0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, 0x7477, 0x746D,
+    0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487, 0x748B, 0x749E,
+    0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA, 0x97EA, 0x97EB,
+    0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769, 0x67A5, 0x6787,
+    0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8, 0x679E, 0x67AD,
+    0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, 0x680A, 0x67E9,
+    0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, 0x67DD, 0x6800,
+    0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, 0x6832, 0x6833,
+    0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, 0x6883, 0x681D,
+    0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, 0x684A, 0x6849,
+    0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, 0x686B, 0x68C2,
+    0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, 0x6924, 0x68F0, 0x690B,
+    0x6901, 0x6957, 0x68E3, 0x6910, 0x6971, 0x6939, 0x6960, 0x6942,
+    0x695D, 0x6984, 0x696B, 0x6980, 0x6998, 0x6978, 0x6934, 0x69CC,
+    0x6987, 0x6988, 0x69CE, 0x6989, 0x6966, 0x6963, 0x6979, 0x699B,
+    0x69A7, 0x69BB, 0x69AB, 0x69AD, 0x69D4, 0x69B1, 0x69C1, 0x69CA,
+    0x69DF, 0x6995, 0x69E0, 0x698D, 0x69FF, 0x6A2F, 0x69ED, 0x6A17,
+    0x6A18, 0x6A65, 0x69F2, 0x6A44, 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B,
+    0x6A35, 0x6A8E, 0x6A79, 0x6A3D, 0x6A28, 0x6A58, 0x6A7C, 0x6A91,
+    0x6A90, 0x6AA9, 0x6A97, 0x6AAB, 0x7337, 0x7352, 0x6B81, 0x6B82,
+    0x6B87, 0x6B84, 0x6B92, 0x6B93, 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1,
+    0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, 0x8F72, 0x8F73, 0x8F75, 0x8F76,
+    0x8F78, 0x8F77, 0x8F79, 0x8F7A, 0x8F7C, 0x8F7E, 0x8F81, 0x8F82,
+    0x8F84, 0x8F87, 0x8F8B, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A,
+    0x8ECE, 0x620B, 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225,
+    0x6224, 0x622C, 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511,
+    0x7513, 0x6534, 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772,
+    0x6603, 0x6615, 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631,
+    0x6636, 0x6635, 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656,
+    0x6661, 0x6657, 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE,
+    0x66DB, 0x66DC, 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B,
+    0x8D3D, 0x8D40, 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D,
+    0x8D55, 0x8D59, 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF,
+    0x89D0, 0x89D1, 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E,
+    0x727F, 0x7284, 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332,
+    0x63B0, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5,
+    0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19,
+    0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555,
+    0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F,
+    0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD,
+    0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2,
+    0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1,
+    0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112,
+    0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C,
+    0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C,
+    0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191,
+    0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB, 0x81C1,
+    0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46, 0x6B59, 0x98D1,
+    0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3, 0x5F40, 0x6BC2,
+    0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6, 0x65C4, 0x65C3,
+    0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, 0x7096, 0x709D,
+    0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, 0x70CA, 0x7110,
+    0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, 0x7168, 0x7145,
+    0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, 0x71B5, 0x71A8,
+    0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, 0x7228, 0x706C,
+    0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, 0x6248, 0x6249,
+    0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, 0x7953, 0x795A,
+    0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A, 0x7985, 0x798A,
+    0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, 0x603C, 0x605D, 0x605A,
+    0x6067, 0x6041, 0x6059, 0x6063, 0x60AB, 0x6106, 0x610D, 0x615D,
+    0x61A9, 0x619D, 0x61CB, 0x61D1, 0x6206, 0x8080, 0x807F, 0x6C93,
+    0x6CF6, 0x6DFC, 0x77F6, 0x77F8, 0x7800, 0x7809, 0x7817, 0x7818,
+    0x7811, 0x65AB, 0x782D, 0x781C, 0x781D, 0x7839, 0x783A, 0x783B,
+    0x781F, 0x783C, 0x7825, 0x782C, 0x7823, 0x7829, 0x784E, 0x786D,
+    0x7856, 0x7857, 0x7826, 0x7850, 0x7847, 0x784C, 0x786A, 0x789B,
+    0x7893, 0x789A, 0x7887, 0x789C, 0x78A1, 0x78A3, 0x78B2, 0x78B9,
+    0x78A5, 0x78D4, 0x78D9, 0x78C9, 0x78EC, 0x78F2, 0x7905, 0x78F4,
+    0x7913, 0x7924, 0x791E, 0x7934, 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC,
+    0x76F1, 0x7704, 0x770D, 0x76F9, 0x7707, 0x7708, 0x771A, 0x7722,
+    0x7719, 0x772D, 0x7726, 0x7735, 0x7738, 0x7750, 0x7751, 0x7747,
+    0x7743, 0x775A, 0x7768, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D,
+    0x7780, 0x778C, 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD,
+    0x753A, 0x7540, 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579,
+    0x7583, 0x7F58, 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71,
+    0x7F79, 0x7F81, 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486,
+    0x9487, 0x948B, 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494,
+    0x9497, 0x9495, 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB,
+    0x94AA, 0x94AD, 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6,
+    0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4,
+    0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0,
+    0x94D1, 0x94D2, 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB,
+    0x94DE, 0x94DF, 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8,
+    0x94EA, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5,
+    0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506,
+    0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513,
+    0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F,
+    0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534,
+    0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535,
+    0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552,
+    0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E,
+    0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567,
+    0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572,
+    0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3,
+    0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14, 0x7A39,
+    0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688, 0x768E, 0x7693,
+    0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, 0x9E22, 0x9E28,
+    0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, 0x9E36, 0x9E38,
+    0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, 0x9E44, 0x9E46,
+    0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, 0x9E51, 0x9E55,
+    0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, 0x9E66, 0x9E67,
+    0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, 0x9E6D, 0x9E73,
+    0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC, 0x75A3, 0x75B3,
+    0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, 0x75C2, 0x75D6,
+    0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB, 0x75E7, 0x7603,
+    0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, 0x760C, 0x7617,
+    0x760A, 0x7625, 0x7618, 0x7615, 0x7619, 0x761B, 0x763C, 0x7622,
+    0x7620, 0x7640, 0x762D, 0x7630, 0x763F, 0x7635, 0x7643, 0x763E,
+    0x7633, 0x764D, 0x765E, 0x7654, 0x765C, 0x7656, 0x766B, 0x766F,
+    0x7FCA, 0x7AE6, 0x7A78, 0x7A79, 0x7A80, 0x7A86, 0x7A88, 0x7A95,
+    0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, 0x7AB3, 0x8864, 0x8869,
+    0x8872, 0x887D, 0x887F, 0x8882, 0x88A2, 0x88C6, 0x88B7, 0x88BC,
+    0x88C9, 0x88E2, 0x88CE, 0x88E3, 0x88E5, 0x88F1, 0x891A, 0x88FC,
+    0x88E8, 0x88FE, 0x88F0, 0x8921, 0x8919, 0x8913, 0x891B, 0x890A,
+    0x8934, 0x892B, 0x8936, 0x8941, 0x8966, 0x897B, 0x758B, 0x80E5,
+    0x76B2, 0x76B4, 0x77DC, 0x8012, 0x8014, 0x8016, 0x801C, 0x8020,
+    0x8022, 0x8025, 0x8026, 0x8027, 0x8029, 0x8028, 0x8031, 0x800B,
+    0x8035, 0x8043, 0x8046, 0x804D, 0x8052, 0x8069, 0x8071, 0x8983,
+    0x9878, 0x9880, 0x9883, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894,
+    0x989A, 0x989B, 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6,
+    0x864D, 0x8654, 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B,
+    0x86A8, 0x868D, 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA,
+    0x8693, 0x86A9, 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA,
+    0x86B1, 0x86AF, 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2,
+    0x86ED, 0x86F3, 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8,
+    0x86D1, 0x8703, 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709,
+    0x8723, 0x873B, 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748,
+    0x8734, 0x8731, 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D,
+    0x877E, 0x877B, 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753,
+    0x8763, 0x877C, 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8,
+    0x87D2, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB,
+    0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1,
+    0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813,
+    0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42,
+    0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04,
+    0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19,
+    0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E,
+    0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E,
+    0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8,
+    0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB,
+    0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6,
+    0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B, 0x7C1F,
+    0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, 0x8201, 0x8202,
+    0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, 0x822D, 0x822F,
+    0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, 0x823E, 0x8244,
+    0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, 0x887E, 0x8885,
+    0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F, 0x7FA7, 0x7FAF,
+    0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D, 0x7C9C, 0x7C9E,
+    0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7, 0x7CCC, 0x7CCD,
+    0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, 0x7FBF, 0x7FCE,
+    0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, 0x7FF3, 0x7CF8,
+    0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, 0x9EB4, 0x8D73,
+    0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, 0x8C47, 0x8C49,
+    0x914A, 0x9150, 0x914E, 0x914F, 0x9164, 0x9162, 0x9161, 0x9170,
+    0x9169, 0x916F, 0x917D, 0x917E, 0x9172, 0x9174, 0x9179, 0x918C,
+    0x9185, 0x9190, 0x918D, 0x9191, 0x91A2, 0x91A3, 0x91AA, 0x91AD,
+    0x91AE, 0x91AF, 0x91B5, 0x91B4, 0x91BA, 0x8C55, 0x9E7E, 0x8DB8,
+    0x8DEB, 0x8E05, 0x8E59, 0x8E69, 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA,
+    0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB,
+    0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4,
+    0x8E09, 0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23,
+    0x8E2F, 0x8E3A, 0x8E40, 0x8E39, 0x8E35, 0x8E3D, 0x8E31, 0x8E49,
+    0x8E41, 0x8E42, 0x8E51, 0x8E52, 0x8E4A, 0x8E70, 0x8E76, 0x8E7C,
+    0x8E6F, 0x8E74, 0x8E85, 0x8E8F, 0x8E94, 0x8E90, 0x8E9C, 0x8E9E,
+    0x8C78, 0x8C82, 0x8C8A, 0x8C85, 0x8C98, 0x8C94, 0x659B, 0x89D6,
+    0x89DE, 0x89DA, 0x89DC, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26,
+    0x9753, 0x96E9, 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F,
+    0x970E, 0x972A, 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85,
+    0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B,
+    0x9F0D, 0x96B9, 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0,
+    0x928E, 0x92AE, 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E,
+    0x946B, 0x9C7F, 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23,
+    0x9C8B, 0x9C8E, 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A,
+    0x9C9B, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5,
+    0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0,
+    0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA,
+    0x9CBB, 0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA,
+    0x9CCB, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4,
+    0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2,
+    0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3,
+    0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA,
+    0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1,
+    0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8,
+    0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF,
+    0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F,
+    0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B,
+    0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0,
+    0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22,
+    0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44, 0x3007,
+    0xFF5E, 0x2016, 0x3013, 0xFF0E, 0xFF1D, 0xFF3B, 0xFF3D, 0xFFE3,
+    0x00FC, 0x00A9, 0x2122, 0x2026, 0x0020, 0x769A, 0x85F9, 0x7919,
+    0x611B, 0x9AAF, 0x8956, 0x58E9, 0x7F77, 0x64FA, 0x6557, 0x9812,
+    0x8FA6, 0x7D46, 0x5E6B, 0x7D81, 0x938A, 0x8B17, 0x98FD, 0x5BF6,
+    0x5831, 0x9B91, 0x8F29, 0x8C9D, 0x92C7, 0x72FD, 0x5099, 0x618A,
+    0x7DB3, 0x7B46, 0x7562, 0x6583, 0x5E63, 0x9589, 0x908A, 0x7DE8,
+    0x8CB6, 0x8B8A, 0x8FAF, 0x8FAE, 0x6A19, 0x9C49, 0x765F, 0x7015,
+    0x6FF1, 0x8CD3, 0x64EF, 0x9905, 0x64A5, 0x9262, 0x9251, 0x99C1,
+    0x88DC, 0x8CA1, 0x53C3, 0x8836, 0x6B98, 0x615A, 0x6158, 0x71E6,
+    0x84BC, 0x8259, 0x5009, 0x6EC4, 0x53A0, 0x5074, 0x6E2C, 0x5C64,
+    0x8A6B, 0x6519, 0x647B, 0x87EC, 0x995E, 0x8B92, 0x7E8F, 0x93DF,
+    0x7523, 0x95E1, 0x986B, 0x5834, 0x5617, 0x9577, 0x511F, 0x8178,
+    0x5EE0, 0x66A2, 0x9214, 0x8ECA, 0x5FB9, 0x5875, 0x9673, 0x896F,
+    0x7A31, 0x61F2, 0x8AA0, 0x9A01, 0x9072, 0x99B3, 0x9F52, 0x71BE,
+    0x885D, 0x87F2, 0x5BF5, 0x7587, 0x8E8A, 0x7C4C, 0x7DA2, 0x919C,
+    0x92E4, 0x96DB, 0x790E, 0x5132, 0x89F8, 0x8655, 0x50B3, 0x7621,
+    0x95D6, 0x5275, 0x9318, 0x7D14, 0x7DBD, 0x8FAD, 0x8A5E, 0x8CDC,
+    0x8070, 0x5F9E, 0x53E2, 0x8EA5, 0x7AC4, 0x932F, 0x9054, 0x5E36,
+    0x8CB8, 0x64D4, 0x55AE, 0x9132, 0x64A3, 0x81BD, 0x619A, 0x8A95,
+    0x5F48, 0x7576, 0x64CB, 0x9EE8, 0x8569, 0x6A94, 0x6417, 0x5CF6,
+    0x79B1, 0x5C0E, 0x71C8, 0x9127, 0x6575, 0x6ECC, 0x905E, 0x7DE0,
+    0x985B, 0x9EDE, 0x588A, 0x96FB, 0x6FB1, 0x91E3, 0x8ABF, 0x8ADC,
+    0x91D8, 0x9802, 0x9320, 0x8A02, 0x6771, 0x52D5, 0x68DF, 0x51CD,
+    0x9B25, 0x72A2, 0x7368, 0x8B80, 0x8CED, 0x934D, 0x935B, 0x65B7,
+    0x7DDE, 0x968A, 0x5C0D, 0x5678, 0x9813, 0x920D, 0x596A, 0x58AE,
+    0x9D5D, 0x984D, 0x8A1B, 0x60E1, 0x9913, 0x5152, 0x723E, 0x990C,
+    0x8CB3, 0x767C, 0x7F70, 0x95A5, 0x792C, 0x91E9, 0x7169, 0x7BC4,
+    0x8CA9, 0x98EF, 0x8A2A, 0x7D21, 0x98DB, 0x8AB9, 0x5EE2, 0x8CBB,
+    0x7D1B, 0x58B3, 0x596E, 0x61A4, 0x7CDE, 0x8C50, 0x6953, 0x92D2,
+    0x98A8, 0x760B, 0x99AE, 0x7E2B, 0x8AF7, 0x9CF3, 0x819A, 0x8F3B,
+    0x64AB, 0x8F14, 0x8CE6, 0x5FA9, 0x8CA0, 0x8A03, 0x5A66, 0x7E1B,
+    0x8A72, 0x9223, 0x84CB, 0x5E79, 0x8D95, 0x8D1B, 0x5CA1, 0x525B,
+    0x92FC, 0x7DB1, 0x5D17, 0x93AC, 0x64F1, 0x9D3F, 0x95A3, 0x927B,
+    0x500B, 0x7D66, 0x9F94, 0x978F, 0x8CA2, 0x920E, 0x6E9D, 0x69CB,
+    0x8CFC, 0x8831, 0x9867, 0x526E, 0x95DC, 0x89C0, 0x9928, 0x6163,
+    0x8CAB, 0x5EE3, 0x898F, 0x6B78, 0x9F9C, 0x95A8, 0x8ECC, 0x8A6D,
+    0x6AC3, 0x8CB4, 0x528A, 0x8F25, 0x934B, 0x570B, 0x904E, 0x99ED,
+    0x97D3, 0x6F22, 0x865F, 0x95A1, 0x9DB4, 0x8CC0, 0x8F5F, 0x9D3B,
+    0x7D05, 0x58FA, 0x8B77, 0x6EEC, 0x5629, 0x83EF, 0x756B, 0x5283,
+    0x8A71, 0x61F7, 0x58DE, 0x6B61, 0x74B0, 0x9084, 0x7DE9, 0x8B0A,
+    0x63EE, 0x8F1D, 0x8CC4, 0x7A62, 0x6703, 0x71F4, 0x532F, 0x8AF1,
+    0x8AA8, 0x7E6A, 0x8477, 0x6E3E, 0x7372, 0x8CA8, 0x798D, 0x64CA,
+    0x6A5F, 0x7A4D, 0x9951, 0x8B4F, 0x9DC4, 0x7E3E, 0x7DDD, 0x6975,
+    0x8F2F, 0x7D1A, 0x64E0, 0x5E7E, 0x858A, 0x5291, 0x6FDF, 0x8A08,
+    0x8A18, 0x969B, 0x7E7C, 0x7D00, 0x593E, 0x83A2, 0x9830, 0x8CC8,
+    0x9240, 0x50F9, 0x99D5, 0x6BB2, 0x76E3, 0x5805, 0x7B8B, 0x9593,
+    0x8271, 0x7DD8, 0x7E6D, 0x6AA2, 0x9E7C, 0x63C0, 0x64BF, 0x7C21,
+    0x5109, 0x85A6, 0x6ABB, 0x9452, 0x8E10, 0x8CE4, 0x898B, 0x9375,
+    0x8266, 0x528D, 0x991E, 0x6F38, 0x6FFA, 0x6F97, 0x5C07, 0x6F3F,
+    0x8523, 0x69F3, 0x596C, 0x8B1B, 0x91AC, 0x81A0, 0x6F86, 0x9A55,
+    0x5B0C, 0x652A, 0x9278, 0x77EF, 0x50E5, 0x9903, 0x7E73, 0x7D5E,
+    0x8F4E, 0x8F03, 0x968E, 0x7BC0, 0x6F54, 0x7D50, 0x8AA1, 0x7DCA,
+    0x9326, 0x50C5, 0x8B39, 0x9032, 0x71FC, 0x76E1, 0x52C1, 0x8396,
+    0x9BE8, 0x9A5A, 0x7D93, 0x9838, 0x93E1, 0x5F91, 0x75D9, 0x7AF6,
+    0x7CFE, 0x820A, 0x99D2, 0x8209, 0x64DA, 0x92F8, 0x61FC, 0x5287,
+    0x9D51, 0x7D79, 0x89BA, 0x8A23, 0x7D76, 0x921E, 0x8ECD, 0x99FF,
+    0x958B, 0x51F1, 0x9846, 0x6BBB, 0x8AB2, 0x58BE, 0x61C7, 0x6473,
+    0x5EAB, 0x8932, 0x8A87, 0x584A, 0x5108, 0x5BEC, 0x7926, 0x66E0,
+    0x8667, 0x5DCB, 0x7ABA, 0x994B, 0x6F70, 0x64F4, 0x95CA, 0x881F,
+    0x81D8, 0x840A, 0x4F86, 0x8CF4, 0x85CD, 0x6B04, 0x6514, 0x7C43,
+    0x95CC, 0x862D, 0x703E, 0x8B95, 0x652C, 0x89BD, 0x61F6, 0x7E9C,
+    0x721B, 0x6FEB, 0x6488, 0x52DE, 0x6F87, 0x6A02, 0x9433, 0x58D8,
+    0x985E, 0x7C6C, 0x96E2, 0x7055, 0x88CF, 0x9BC9, 0x79AE, 0x9E97,
+    0x53B2, 0x52F5, 0x792B, 0x6B77, 0x701D, 0x96B8, 0x5006, 0x806F,
+    0x84EE, 0x9023, 0x942E, 0x6190, 0x6F23, 0x7C3E, 0x6582, 0x81C9,
+    0x93C8, 0x6200, 0x7149, 0x7DF4, 0x7CE7, 0x5169, 0x8F1B, 0x8AD2,
+    0x7642, 0x907C, 0x9410, 0x7375, 0x81E8, 0x9130, 0x9C57, 0x8CC3,
+    0x9F61, 0x9234, 0x9748, 0x5DBA, 0x9818, 0x993E, 0x5289, 0x9F8D,
+    0x807E, 0x56A8, 0x7C60, 0x58DF, 0x650F, 0x96B4, 0x6A13, 0x5A41,
+    0x645F, 0x7C0D, 0x8606, 0x76E7, 0x9871, 0x5EEC, 0x7210, 0x64C4,
+    0x6EF7, 0x865C, 0x9B6F, 0x8CC2, 0x9332, 0x9678, 0x9A62, 0x92C1,
+    0x5C62, 0x7E37, 0x616E, 0x6FFE, 0x7DD1, 0x5DD2, 0x6523, 0x5B7F,
+    0x7064, 0x4E82, 0x6384, 0x8F2A, 0x502B, 0x4F96, 0x6DEA, 0x7DB8,
+    0x8AD6, 0x863F, 0x7F85, 0x908F, 0x947C, 0x7C6E, 0x9A3E, 0x99F1,
+    0x7D61, 0x5ABD, 0x746A, 0x78BC, 0x879E, 0x99AC, 0x99E1, 0x55CE,
+    0x8CB7, 0x9EA5, 0x8CE3, 0x9081, 0x779E, 0x9945, 0x883B, 0x6EFF,
+    0x8B3E, 0x9328, 0x925A, 0x8CBF, 0x9382, 0x9580, 0x60B6, 0x5011,
+    0x9333, 0x5922, 0x8B0E, 0x5F4C, 0x8993, 0x7DBF, 0x7DEC, 0x5EDF,
+    0x6EC5, 0x61AB, 0x95A9, 0x9CF4, 0x9298, 0x8B2C, 0x8B00, 0x755D,
+    0x9209, 0x7D0D, 0x96E3, 0x6493, 0x8166, 0x60F1, 0x9B27, 0x9912,
+    0x64EC, 0x81A9, 0x6506, 0x91C0, 0x9CE5, 0x8076, 0x5699, 0x9477,
+    0x93B3, 0x6AB8, 0x7370, 0x5BE7, 0x64F0, 0x6FD8, 0x9215, 0x7D10,
+    0x81BF, 0x6FC3, 0x8FB2, 0x7627, 0x8AFE, 0x6B50, 0x9DD7, 0x6BC6,
+    0x5614, 0x6F1A, 0x76E4, 0x9F90, 0x8CE0, 0x5674, 0x9D6C, 0x9A19,
+    0x98C4, 0x983B, 0x8CA7, 0x860B, 0x6191, 0x8A55, 0x6F51, 0x9817,
+    0x64B2, 0x92EA, 0x50D5, 0x6A38, 0x8B5C, 0x81CD, 0x9F4A, 0x9A0E,
+    0x8C48, 0x5553, 0x6C23, 0x8A16, 0x727D, 0x91FA, 0x925B, 0x9077,
+    0x7C3D, 0x8B19, 0x9322, 0x9257, 0x6DFA, 0x8B74, 0x5879, 0x69CD,
+    0x55C6, 0x58BB, 0x8594, 0x6436, 0x936C, 0x6A4B, 0x55AC, 0x50D1,
+    0x7FF9, 0x7AC5, 0x7ACA, 0x6B3D, 0x89AA, 0x5BE2, 0x8F15, 0x6C2B,
+    0x50BE, 0x9803, 0x8ACB, 0x6176, 0x74CA, 0x7AAE, 0x8DA8, 0x5340,
+    0x8EC0, 0x9A45, 0x9F72, 0x9874, 0x6B0A, 0x52F8, 0x9D72, 0x78BA,
+    0x8B93, 0x9952, 0x64FE, 0x7E5E, 0x71B1, 0x97CC, 0x8A8D, 0x7D09,
+    0x69AE, 0x7D68, 0x8EDF, 0x92ED, 0x958F, 0x6F64, 0x7051, 0x85A9,
+    0x9C13, 0x8CFD, 0x5098, 0x55AA, 0x9A37, 0x6383, 0x6F80, 0x6BBA,
+    0x7D17, 0x7BE9, 0x66EC, 0x9583, 0x965D, 0x8D0D, 0x7E55, 0x50B7,
+    0x8CDE, 0x71D2, 0x7D39, 0x8CD2, 0x6368, 0x651D, 0x61FE, 0x8A2D,
+    0x7D33, 0x5BE9, 0x5B38, 0x814E, 0x6EF2, 0x8072, 0x7E69, 0x52DD,
+    0x8056, 0x5E2B, 0x7345, 0x6FD5, 0x8A69, 0x6642, 0x8755, 0x5BE6,
+    0x8B58, 0x99DB, 0x52E2, 0x9069, 0x91CB, 0x98FE, 0x8996, 0x8A66,
+    0x58FD, 0x7378, 0x6A1E, 0x8F38, 0x66F8, 0x8D16, 0x5C6C, 0x8853,
+    0x6A39, 0x7AEA, 0x6578, 0x5E25, 0x96D9, 0x8AB0, 0x9806, 0x8AAC,
+    0x78A9, 0x720D, 0x7D72, 0x98FC, 0x9B06, 0x8073, 0x616B, 0x980C,
+    0x8A1F, 0x8AA6, 0x64FB, 0x8607, 0x8A34, 0x8085, 0x96D6, 0x96A8,
+    0x7D8F, 0x6B72, 0x5B6B, 0x640D, 0x7E2E, 0x7463, 0x9396, 0x737A,
+    0x64BB, 0x81FA, 0x614B, 0x6524, 0x8CAA, 0x7671, 0x7058, 0x58C7,
+    0x8B5A, 0x8AC7, 0x5606, 0x6E6F, 0x71D9, 0x6FE4, 0x7E27, 0x8A0E,
+    0x9A30, 0x8B04, 0x92BB, 0x984C, 0x9AD4, 0x689D, 0x8CBC, 0x9435,
+    0x5EF3, 0x807D, 0x70F4, 0x9285, 0x7D71, 0x982D, 0x5716, 0x5857,
+    0x5718, 0x983D, 0x9D15, 0x99B1, 0x99DD, 0x6A62, 0x7AAA, 0x896A,
+    0x5F4E, 0x7063, 0x9811, 0x842C, 0x7DB2, 0x97CB, 0x9055, 0x570D,
+    0x7232, 0x6FF0, 0x7DAD, 0x8466, 0x5049, 0x50DE, 0x7DEF, 0x8B02,
+    0x885B, 0x805E, 0x7D0B, 0x7A69, 0x554F, 0x64BE, 0x8778, 0x6E26,
+    0x7AA9, 0x55DA, 0x93A2, 0x70CF, 0x8AA3, 0x7121, 0x856A, 0x5862,
+    0x9727, 0x52D9, 0x8AA4, 0x932B, 0x72A7, 0x8972, 0x7FD2, 0x9291,
+    0x6232, 0x7D30, 0x8766, 0x8F44, 0x5CFD, 0x4FE0, 0x72F9, 0x5687,
+    0x9341, 0x9BAE, 0x7E96, 0x8CE2, 0x929C, 0x9591, 0x986F, 0x96AA,
+    0x73FE, 0x737B, 0x7E23, 0x9921, 0x61B2, 0x7DAB, 0x9472, 0x9109,
+    0x8A73, 0x97FF, 0x9805, 0x856D, 0x56C2, 0x92B7, 0x66C9, 0x562F,
+    0x5354, 0x633E, 0x8105, 0x8AE7, 0x5BEB, 0x7009, 0x8B1D, 0x92C5,
+    0x91C1, 0x8208, 0x92B9, 0x7D89, 0x9808, 0x8A31, 0x7DD2, 0x7E8C,
+    0x8ED2, 0x61F8, 0x9078, 0x766C, 0x7D62, 0x5B78, 0x52DB, 0x8A62,
+    0x5C0B, 0x99B4, 0x8A13, 0x8A0A, 0x905C, 0x58D3, 0x9D09, 0x9D28,
+    0x555E, 0x4E9E, 0x8A1D, 0x95B9, 0x9E7D, 0x56B4, 0x9854, 0x95BB,
+    0x8277, 0x53AD, 0x786F, 0x8AFA, 0x9A57, 0x9D26, 0x694A, 0x63DA,
+    0x760D, 0x967D, 0x7662, 0x990A, 0x6A23, 0x582F, 0x8B21, 0x85E5,
+    0x723A, 0x9801, 0x696D, 0x8449, 0x91AB, 0x92A5, 0x9824, 0x907A,
+    0x5100, 0x87FB, 0x85DD, 0x5104, 0x61B6, 0x7FA9, 0x8A63, 0x8B70,
+    0x8ABC, 0x8B6F, 0x7E79, 0x852D, 0x9670, 0x9280, 0x98F2, 0x96B1,
+    0x6AFB, 0x5B30, 0x9DF9, 0x61C9, 0x7E93, 0x7469, 0x87A2, 0x71DF,
+    0x7192, 0x8805, 0x8D0F, 0x7A4E, 0x55B2, 0x64C1, 0x50AD, 0x7670,
+    0x8E34, 0x512A, 0x6182, 0x90F5, 0x923E, 0x7336, 0x8A98, 0x8F3F,
+    0x9918, 0x9B5A, 0x6F01, 0x8207, 0x5DBC, 0x8A9E, 0x9B31, 0x7344,
+    0x8B7D, 0x9810, 0x99AD, 0x9D1B, 0x6DF5, 0x8F45, 0x5712, 0x54E1,
+    0x5713, 0x7DE3, 0x9060, 0x9858, 0x7D04, 0x8E8D, 0x9470, 0x95B2,
+    0x96F2, 0x9116, 0x9695, 0x904B, 0x85F4, 0x9196, 0x6688, 0x96DC,
+    0x8F09, 0x6522, 0x66AB, 0x8D0A, 0x8D1C, 0x81DF, 0x947F, 0x68D7,
+    0x7AC8, 0x8CAC, 0x64C7, 0x5247, 0x6FA4, 0x8CCA, 0x8D08, 0x8ECB,
+    0x9358, 0x9598, 0x8A50, 0x9F4B, 0x50B5, 0x6C08, 0x76DE, 0x65AC,
+    0x8F3E, 0x5D84, 0x68E7, 0x6230, 0x7DBB, 0x5F35, 0x6F32, 0x5E33,
+    0x8CEC, 0x8139, 0x8D99, 0x87C4, 0x8F4D, 0x937A, 0x9019, 0x8C9E,
+    0x91DD, 0x5075, 0x8A3A, 0x93AE, 0x9663, 0x5E40, 0x7665, 0x912D,
+    0x8B49, 0x7E54, 0x8077, 0x57F7, 0x8879, 0x7D19, 0x646F, 0x64F2,
+    0x5E5F, 0x8CEA, 0x6EEF, 0x9418, 0x7D42, 0x7A2E, 0x816B, 0x8846,
+    0x8B05, 0x8EF8, 0x76BA, 0x665D, 0x9A5F, 0x8AF8, 0x8A85, 0x71ED,
+    0x77DA, 0x56D1, 0x8CAF, 0x9444, 0x7BC9, 0x99D0, 0x5C08, 0x78DA,
+    0x8F49, 0x8CFA, 0x6A01, 0x838A, 0x88DD, 0x599D, 0x58EF, 0x72C0,
+    0x9310, 0x8D05, 0x589C, 0x7DB4, 0x8AC4, 0x6E96, 0x6FC1, 0x8CC7,
+    0x6F2C, 0x7D9C, 0x7E3D, 0x7E31, 0x9112, 0x8A5B, 0x7D44, 0x947D,
+    0x55C7, 0x5399, 0x53B4, 0x9768, 0x8D0B, 0x532D, 0x5331, 0x8CFE,
+    0x5244, 0x528C, 0x5274, 0x50B4, 0x5000, 0x5096, 0x5115, 0x5102,
+    0x5114, 0x513C, 0x5137, 0x50E8, 0x50C2, 0x513B, 0x5110, 0x513A,
+    0x50C9, 0x7CF4, 0x9ECC, 0x56C5, 0x9CEC, 0x893B, 0x81E0, 0x8A01,
+    0x8A10, 0x8A0C, 0x8A15, 0x8B33, 0x8A4E, 0x8A25, 0x8A41, 0x8A36,
+    0x8A46, 0x8A54, 0x8A58, 0x8A52, 0x8A86, 0x8A84, 0x8A7F, 0x8A70,
+    0x8A7C, 0x8A75, 0x8A6C, 0x8A6E, 0x8ACD, 0x8AE2, 0x8A61, 0x8A9A,
+    0x8AA5, 0x8A91, 0x8A92, 0x8ACF, 0x8AD1, 0x8AC9, 0x8ADB, 0x8AD7,
+    0x8AC2, 0x8AB6, 0x8AF6, 0x8AEB, 0x8B14, 0x8B01, 0x8AE4, 0x8AED,
+    0x8AFC, 0x8AF3, 0x8AE6, 0x8AEE, 0x8ADE, 0x8B28, 0x8B9C, 0x8B16,
+    0x8B1A, 0x8B10, 0x8B2B, 0x8B2D, 0x8B56, 0x8B59, 0x8B4E, 0x8B9E,
+    0x8B6B, 0x8B96, 0x9658, 0x913A, 0x9114, 0x9134, 0x90DF, 0x9136,
+    0x9106, 0x9148, 0x82BB, 0x52F1, 0x5DF0, 0x580A, 0x58D9, 0x58E2,
+    0x58E0, 0x58DA, 0x57E1, 0x584F, 0x5816, 0x5852, 0x581D, 0x5864,
+    0x858C, 0x8553, 0x85F6, 0x83A7, 0x8407, 0x84EF, 0x82E7, 0x8622,
+    0x8526, 0x584B, 0x7162, 0x8558, 0x84FD, 0x854E, 0x8588, 0x85BA,
+    0x7296, 0x6ECE, 0x8541, 0x85CE, 0x8552, 0x84C0, 0x8452, 0x8464,
+    0x8494, 0x8435, 0x859F, 0x8555, 0x9DAF, 0x8493, 0x7E08, 0x8546,
+    0x8562, 0x851E, 0x9A40, 0x863A, 0x93A3, 0x8577, 0x861E, 0x85FA,
+    0x8604, 0x85EA, 0x861A, 0x5969, 0x5C37, 0x636B, 0x6476, 0x649F,
+    0x6451, 0x645C, 0x64B3, 0x6504, 0x6516, 0x64F7, 0x64FC, 0x651B,
+    0x5630, 0x5638, 0x56C8, 0x56A6, 0x5504, 0x54BC, 0x5680, 0x565D,
+    0x5660, 0x5635, 0x55F6, 0x5666, 0x5672, 0x568C, 0x5665, 0x561C,
+    0x562E, 0x55E9, 0x5616, 0x56C0, 0x560D, 0x56B3, 0x56C1, 0x566F,
+    0x8F61, 0x56B6, 0x5695, 0x5707, 0x5E43, 0x5E6C, 0x5E58, 0x5E57,
+    0x5D87, 0x5CF4, 0x5D50, 0x5D2C, 0x5DA7, 0x5DA0, 0x5D97, 0x5D0D,
+    0x5DB8, 0x5D81, 0x5DD4, 0x5FA0, 0x7377, 0x7341, 0x736A, 0x733B,
+    0x736B, 0x7380, 0x737C, 0x98E0, 0x9933, 0x98E9, 0x993C, 0x98EA,
+    0x98EB, 0x98ED, 0x98F4, 0x9909, 0x9911, 0x991B, 0x9937, 0x993F,
+    0x9943, 0x9948, 0x9949, 0x994A, 0x994C, 0x9962, 0x5EE1, 0x8CE1,
+    0x61FA, 0x61AE, 0x616A, 0x613E, 0x60B5, 0x6134, 0x61CC, 0x615F,
+    0x61E8, 0x60FB, 0x6137, 0x60F2, 0x6173, 0x611C, 0x6192, 0x9582,
+    0x9586, 0x95C8, 0x958E, 0x9594, 0x958C, 0x95E5, 0x95AD, 0x95AB,
+    0x9B2E, 0x95AC, 0x95BE, 0x95B6, 0x9B29, 0x95BF, 0x95BD, 0x95BC,
+    0x95C3, 0x95CB, 0x95D4, 0x95D0, 0x95D5, 0x95DE, 0x7043, 0x6F59,
+    0x7027, 0x7018, 0x6FFC, 0x6D87, 0x6D79, 0x6E5E, 0x6FAE, 0x700F,
+    0x6EF8, 0x6F6F, 0x6DF6, 0x6F7F, 0x7006, 0x6FA0, 0x700B, 0x7067,
+    0x7044, 0x7005, 0x6F77, 0x7020, 0x701F, 0x7032, 0x7028, 0x705D,
+    0x9A2B, 0x9087, 0x9015, 0x9090, 0x5C68, 0x5F33, 0x5AF5, 0x5AD7,
+    0x5B00, 0x5A6D, 0x5B08, 0x5B4C, 0x5AA7, 0x5AFB, 0x5B0B, 0x5B21,
+    0x5B2A, 0x5B19, 0x99D4, 0x99DF, 0x99D9, 0x9A36, 0x9A5B, 0x99D1,
+    0x99D8, 0x9A4D, 0x9A4A, 0x99E2, 0x9A6A, 0x9A0F, 0x9A0D, 0x9A05,
+    0x9A42, 0x9A2D, 0x9A16, 0x9A41, 0x9A2E, 0x9A38, 0x9A43, 0x9A44,
+    0x9A4F, 0x9A65, 0x9A64, 0x7CF9, 0x7D06, 0x7D02, 0x7D07, 0x7D08,
+    0x7E8A, 0x7D1C, 0x7D15, 0x7D13, 0x7D3A, 0x7D32, 0x7D31, 0x7E10,
+    0x7D3C, 0x7D40, 0x7D3F, 0x7D5D, 0x7D4E, 0x7D73, 0x7D86, 0x7D83,
+    0x7D88, 0x7DBE, 0x7DBA, 0x7DCB, 0x7DD4, 0x7DC4, 0x7D9E, 0x7DAC,
+    0x7DB9, 0x7DA3, 0x7DB0, 0x7DC7, 0x7DD9, 0x7DD7, 0x7DF9, 0x7DF2,
+    0x7E62, 0x7DE6, 0x7DF6, 0x7DF1, 0x7E0B, 0x7DE1, 0x7E09, 0x7E1D,
+    0x7E1F, 0x7E1E, 0x7E2D, 0x7E0A, 0x7E11, 0x7E7D, 0x7E39, 0x7E35,
+    0x7E32, 0x7E46, 0x7E45, 0x7E88, 0x7E5A, 0x7E52, 0x7E6E, 0x7E7E,
+    0x7E70, 0x7E6F, 0x7E98, 0x74A3, 0x744B, 0x74CF, 0x980A, 0x74BD,
+    0x743F, 0x7489, 0x74A6, 0x74D4, 0x74DA, 0x97D9, 0x97DE, 0x97DC,
+    0x69AA, 0x6AEA, 0x6898, 0x68D6, 0x6A05, 0x689F, 0x6ADB, 0x6AF3,
+    0x6AE8, 0x6ADF, 0x6A89, 0x690F, 0x6A48, 0x6968, 0x69BF, 0x6A3A,
+    0x6A9C, 0x6B12, 0x6B1E, 0x6ADD, 0x69E7, 0x6B0F, 0x6B16, 0x6AEC,
+    0x6ADA, 0x6AF8, 0x6AB3, 0x6AE7, 0x6AA3, 0x6AD3, 0x6ADE, 0x6BA4,
+    0x6B9E, 0x6BAE, 0x6BAB, 0x6BAF, 0x8ED4, 0x8EDB, 0x8EF2, 0x8EFB,
+    0x8F64, 0x8EF9, 0x8EFC, 0x8EEB, 0x8EE4, 0x8F62, 0x8EFA, 0x8EFE,
+    0x8F0A, 0x8F07, 0x8F05, 0x8F12, 0x8F26, 0x8F1E, 0x8F1F, 0x8F1C,
+    0x8F33, 0x8F46, 0x8F54, 0x6214, 0x6227, 0x750C, 0x66C7, 0x66C4,
+    0x6689, 0x66D6, 0x8CC1, 0x8CB0, 0x8CBA, 0x8CBD, 0x8D04, 0x8CB2,
+    0x8CC5, 0x8D10, 0x8CD1, 0x8CDA, 0x8CD5, 0x8CEB, 0x8CE7, 0x8CFB,
+    0x8998, 0x89AC, 0x89A1, 0x89BF, 0x89A6, 0x89AF, 0x89B2, 0x89B7,
+    0x6BFF, 0x6C0C, 0x6C2C, 0x7258, 0x6727, 0x8156, 0x81DA, 0x811B,
+    0x81BE, 0x8161, 0x81CF, 0x6B5F, 0x98AE, 0x98AF, 0x98B6, 0x98BC,
+    0x98C6, 0x98C8, 0x8F42, 0x9F4F, 0x6595, 0x716C, 0x7152, 0x7197,
+    0x71C1, 0x71DC, 0x71FE, 0x79B0, 0x798E, 0x79AA, 0x61DF, 0x6164,
+    0x61E3, 0x6207, 0x6FA9, 0x78EF, 0x78AD, 0x7868, 0x78B8, 0x792A,
+    0x7931, 0x7864, 0x78FD, 0x78E7, 0x78E3, 0x9F95, 0x7798, 0x775E,
+    0x77BC, 0x7F86, 0x7F88, 0x91D2, 0x91D3, 0x91D4, 0x91D9, 0x91D7,
+    0x91D5, 0x91F7, 0x91E7, 0x91E4, 0x9346, 0x91F5, 0x91F9, 0x9208,
+    0x9226, 0x9245, 0x9211, 0x9210, 0x9201, 0x9227, 0x9204, 0x9225,
+    0x9200, 0x923A, 0x9266, 0x9237, 0x9233, 0x9255, 0x923D, 0x9238,
+    0x925E, 0x926C, 0x926D, 0x923F, 0x9460, 0x9230, 0x9249, 0x9248,
+    0x924D, 0x922E, 0x9239, 0x9438, 0x92AC, 0x92A0, 0x927A, 0x92AA,
+    0x92EE, 0x92CF, 0x9403, 0x92E3, 0x943A, 0x92B1, 0x92A6, 0x93A7,
+    0x9296, 0x92CC, 0x92A9, 0x93F5, 0x9293, 0x927F, 0x93A9, 0x929A,
+    0x931A, 0x92AB, 0x9283, 0x940B, 0x92A8, 0x92A3, 0x9412, 0x9338,
+    0x92F1, 0x93D7, 0x92E5, 0x92F0, 0x92EF, 0x92E8, 0x92BC, 0x92DD,
+    0x92F6, 0x9426, 0x9427, 0x92C3, 0x92DF, 0x92E6, 0x9312, 0x9306,
+    0x9369, 0x931B, 0x9340, 0x9301, 0x9315, 0x932E, 0x9343, 0x9307,
+    0x9308, 0x931F, 0x9319, 0x9365, 0x9347, 0x9376, 0x9354, 0x9364,
+    0x93AA, 0x9370, 0x9384, 0x93E4, 0x93D8, 0x9428, 0x9387, 0x93CC,
+    0x9398, 0x93B8, 0x93BF, 0x93A6, 0x93B0, 0x93B5, 0x944C, 0x93E2,
+    0x93DC, 0x93DD, 0x93CD, 0x93DE, 0x93C3, 0x93C7, 0x93D1, 0x9414,
+    0x941D, 0x93F7, 0x9465, 0x9413, 0x946D, 0x9420, 0x9479, 0x93F9,
+    0x9419, 0x944A, 0x9432, 0x943F, 0x9454, 0x9463, 0x937E, 0x7A61,
+    0x9CE9, 0x9CF6, 0x9D07, 0x9D06, 0x9D23, 0x9D87, 0x9E15, 0x9D1D,
+    0x9D1F, 0x9DE5, 0x9D2F, 0x9DD9, 0x9D30, 0x9D42, 0x9E1E, 0x9D53,
+    0x9E1D, 0x9D60, 0x9D52, 0x9DF3, 0x9D5C, 0x9D61, 0x9D93, 0x9D6A,
+    0x9D6F, 0x9D89, 0x9D98, 0x9D9A, 0x9DC0, 0x9DA5, 0x9DA9, 0x9DC2,
+    0x9DBC, 0x9E1A, 0x9DD3, 0x9DDA, 0x9DEF, 0x9DE6, 0x9DF2, 0x9DF8,
+    0x9E0C, 0x9DFA, 0x9E1B, 0x7664, 0x7658, 0x7667, 0x7602, 0x7646,
+    0x7647, 0x7649, 0x761E, 0x763B, 0x766D, 0x766E, 0x7669, 0x7672,
+    0x7AC7, 0x7AB6, 0x8960, 0x8933, 0x895D, 0x8947, 0x8938, 0x8964,
+    0x76B8, 0x802E, 0x802C, 0x8079, 0x8075, 0x9807, 0x980E, 0x980F,
+    0x9821, 0x981C, 0x6F41, 0x9826, 0x9837, 0x984E, 0x9853, 0x9873,
+    0x9862, 0x9859, 0x9865, 0x986C, 0x9870, 0x87E3, 0x8806, 0x8706,
+    0x8823, 0x87F6, 0x86FA, 0x87EF, 0x8784, 0x8810, 0x87C8, 0x8811,
+    0x87BB, 0x87CE, 0x7F4C, 0x7BE4, 0x7B67, 0x7C69, 0x7BF3, 0x7C00,
+    0x7BCB, 0x7C5C, 0x7C1E, 0x7C2B, 0x7C23, 0x7C6A, 0x7C5F, 0x8264,
+    0x826B, 0x88CA, 0x7FA5, 0x7CF2, 0x7CF6, 0x7CDD, 0x7E36, 0x9EA9,
+    0x8DB2, 0x91C5, 0x91C3, 0x9E7A, 0x8E89, 0x8E4C, 0x8E92, 0x8E7A,
+    0x8E55, 0x8E9A, 0x8E8B, 0x8E93, 0x8E91, 0x8EA1, 0x8E63, 0x8EAA,
+    0x8EA6, 0x89F4, 0x89F6, 0x975A, 0x9742, 0x973D, 0x9744, 0x9F54,
+    0x9F5F, 0x9F59, 0x9F60, 0x9F5C, 0x9F66, 0x9F6C, 0x9F6A, 0x9F77,
+    0x9EFD, 0x9EFF, 0x9F09, 0x8B8E, 0x947E, 0x93E8, 0x9B77, 0x9B74,
+    0x9B81, 0x9B83, 0x9B8E, 0x9C78, 0x7A4C, 0x9B92, 0x9C5F, 0x9B90,
+    0x9BAD, 0x9B9A, 0x9BAA, 0x9B9E, 0x9C6D, 0x9BAB, 0x9B9D, 0x9C58,
+    0x9BC1, 0x9C7A, 0x9C31, 0x9C39, 0x9C23, 0x9C37, 0x9BC0, 0x9BCA,
+    0x9BC7, 0x9BFD, 0x9BD6, 0x9BEA, 0x9BEB, 0x9BE1, 0x9BE4, 0x9BE7,
+    0x9BDD, 0x9BE2, 0x9BF0, 0x9BDB, 0x9BF4, 0x9BD4, 0x9C5D, 0x9C08,
+    0x9C10, 0x9C0D, 0x9C12, 0x9C09, 0x9BFF, 0x9C20, 0x9C32, 0x9C2D,
+    0x9C28, 0x9C25, 0x9C29, 0x9C33, 0x9C3E, 0x9C48, 0x9C3B, 0x9C35,
+    0x9C45, 0x9C56, 0x9C54, 0x9C52, 0x9C67, 0x97C3, 0x97BD, 0x97C9,
+    0x9DBB, 0x9ACF, 0x9AD6, 0x9AD5, 0x9B58, 0x9B4E, 0x9957, 0x995C,
+    0x9B22, 0x9EF7, 0x9EF2, 0x896C, 0x95C6, 0x9336, 0x5F46, 0x8514,
+    0x7E94, 0x9F63, 0x5679, 0x9F15, 0x5641, 0x9AEE, 0x8907, 0x7A40,
+    0x98B3, 0x95A4, 0x9B0D, 0x8FF4, 0x5F59, 0x7A6B, 0x98E2, 0x50A2,
+    0x8591, 0x5118, 0x6372, 0x524B, 0x774F, 0x7E8D, 0x66C6, 0x77AD,
+    0x9E75, 0x56C9, 0x9EF4, 0x6FDB, 0x61DE, 0x77C7, 0x7030, 0x9EB5,
+    0x884A, 0x95E2, 0x97C6, 0x7C64, 0x7E34, 0x97A6, 0x9EAF, 0x56CC,
+    0x98B1, 0x6AAF, 0x7F4E, 0x7CF0, 0x4FC2, 0x7E6B, 0x9E79, 0x56AE,
+    0x9B1A, 0x846F, 0x79A6, 0x7C72, 0x9AD2, 0x96BB, 0x7DFB, 0x88FD,
+    0x7843, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176,
+    0x2177, 0x2178, 0x2179, 0x02CA, 0x02CB, 0x02D9, 0x2013, 0x2015,
+    0x2025, 0x2035, 0x2105, 0x2109, 0x2196, 0x2197, 0x2198, 0x2199,
+    0x2215, 0x221F, 0x2223, 0x2252, 0x2266, 0x2267, 0x22BF, 0x2550,
+    0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558,
+    0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E, 0x255F, 0x2560,
+    0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568,
+    0x2569, 0x256A, 0x256B, 0x256C, 0x256D, 0x256E, 0x256F, 0x2570,
+    0x2571, 0x2572, 0x2573, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585,
+    0x2586, 0x2587, 0x2588, 0x2589, 0x258A, 0x258B, 0x258C, 0x258D,
+    0x258E, 0x258F, 0x2593, 0x2594, 0x2595, 0x25BC, 0x25BD, 0x25E2,
+    0x25E3, 0x25E4, 0x25E5, 0x2609, 0x2295, 0x3012, 0x301D, 0x301E,
+    0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028,
+    0x3029, 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1,
+    0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4,
+    0x2121, 0x3231, 0x2010, 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE,
+    0x3006, 0x309D, 0x309E, 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D,
+    0xFE4E, 0xFE4F, 0xFE50, 0xFE51, 0xFE52, 0xFE54, 0xFE55, 0xFE56,
+    0xFE57, 0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F,
+    0xFE60, 0xFE61, 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE68,
+    0xFE69, 0xFE6A, 0xFE6B, 0x303E, 0x2FF0, 0x2FF1, 0x2FF2, 0x2FF3,
+    0x2FF4, 0x2FF5, 0x2FF6, 0x2FF7, 0x2FF8, 0x2FF9, 0x2FFA, 0x2FFB,
+    0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F,
+    0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31,
+    0x4E33, 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44,
+    0x4E46, 0x4E4A, 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62,
+    0x4E63, 0x4E64, 0x4E65, 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C,
+    0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, 0x4E74, 0x4E75, 0x4E76, 0x4E77,
+    0x4E78, 0x4E79, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, 0x4E7F, 0x4E80,
+    0x4E81, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A, 0x4E90, 0x4E96,
+    0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4EA3, 0x4EAA, 0x4EAF, 0x4EB0,
+    0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8, 0x4EB9, 0x4EBC, 0x4EBD,
+    0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0, 0x4ED2, 0x4EDA, 0x4EDB,
+    0x4EDC, 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7, 0x4EE9, 0x4EED, 0x4EEE,
+    0x4EEF, 0x4EF1, 0x4EF4, 0x4EF8, 0x4EF9, 0x4EFA, 0x4EFC, 0x4EFE,
+    0x4F00, 0x4F02, 0x4F03, 0x4F04, 0x4F05, 0x4F06, 0x4F07, 0x4F08,
+    0x4F0B, 0x4F0C, 0x4F12, 0x4F13, 0x4F14, 0x4F15, 0x4F16, 0x4F1C,
+    0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29, 0x4F2C, 0x4F2D, 0x4F2E,
+    0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, 0x4F3E, 0x4F3F,
+    0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45, 0x4F47, 0x4F48, 0x4F49,
+    0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, 0x4F61, 0x4F62,
+    0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D, 0x4F6E, 0x4F71, 0x4F72,
+    0x4F75, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, 0x4F7D, 0x4F80, 0x4F81,
+    0x4F82, 0x4F85, 0x4F87, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92,
+    0x4F93, 0x4F95, 0x4F98, 0x4F99, 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F,
+    0x4FA1, 0x4FA2, 0x4FA4, 0x4FAB, 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2,
+    0x4FB3, 0x4FB4, 0x4FB6, 0x4FB7, 0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB,
+    0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, 0x4FC1, 0x4FC6, 0x4FC7, 0x4FC8,
+    0x4FC9, 0x4FCB, 0x4FCC, 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, 0x4FD5,
+    0x4FD6, 0x4FD9, 0x4FDB, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB,
+    0x4FEC, 0x4FF0, 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9,
+    0x4FFB, 0x4FFC, 0x4FFD, 0x4FFF, 0x5001, 0x5002, 0x5003, 0x5004,
+    0x5005, 0x5007, 0x5008, 0x500A, 0x500E, 0x5010, 0x5013, 0x5015,
+    0x5016, 0x5017, 0x501B, 0x501D, 0x501E, 0x5020, 0x5022, 0x5023,
+    0x5024, 0x5027, 0x502F, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034,
+    0x5035, 0x5036, 0x5037, 0x5038, 0x5039, 0x503B, 0x503D, 0x503F,
+    0x5040, 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x504A, 0x504B,
+    0x504D, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057,
+    0x5058, 0x5059, 0x505B, 0x505D, 0x505E, 0x505F, 0x5060, 0x5061,
+    0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506A,
+    0x506B, 0x506D, 0x506E, 0x506F, 0x5070, 0x5071, 0x5072, 0x5073,
+    0x5078, 0x5079, 0x507A, 0x507C, 0x507D, 0x5081, 0x5082, 0x5083,
+    0x5084, 0x5086, 0x5087, 0x5089, 0x508A, 0x508B, 0x508C, 0x508E,
+    0x508F, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, 0x5097,
+    0x509A, 0x509B, 0x509C, 0x509D, 0x509E, 0x509F, 0x50A0, 0x50A1,
+    0x50A4, 0x50A6, 0x50AA, 0x50AB, 0x50AE, 0x50AF, 0x50B0, 0x50B1,
+    0x50B6, 0x50B8, 0x50B9, 0x50BC, 0x50BD, 0x50BF, 0x50C0, 0x50C1,
+    0x50C3, 0x50C4, 0x50C6, 0x50C7, 0x50C8, 0x50CA, 0x50CB, 0x50CC,
+    0x50CD, 0x50CE, 0x50D0, 0x50D2, 0x50D3, 0x50D4, 0x50D7, 0x50D8,
+    0x50D9, 0x50DB, 0x50DC, 0x50DD, 0x50DF, 0x50E0, 0x50E1, 0x50E2,
+    0x50E3, 0x50E4, 0x50E9, 0x50EA, 0x50EB, 0x50EF, 0x50F0, 0x50F1,
+    0x50F2, 0x50F4, 0x50F6, 0x50F7, 0x50F8, 0x50FA, 0x50FC, 0x50FD,
+    0x50FE, 0x50FF, 0x5101, 0x5103, 0x5105, 0x510A, 0x510C, 0x510D,
+    0x510E, 0x510F, 0x5111, 0x5113, 0x5116, 0x5117, 0x5119, 0x511A,
+    0x511B, 0x511C, 0x511D, 0x511E, 0x5120, 0x5122, 0x5123, 0x5124,
+    0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512B, 0x512C, 0x512D,
+    0x512E, 0x512F, 0x5130, 0x5131, 0x5133, 0x5134, 0x5135, 0x5136,
+    0x5138, 0x5139, 0x513D, 0x513E, 0x5142, 0x5147, 0x514A, 0x514C,
+    0x514E, 0x514F, 0x5150, 0x5153, 0x5157, 0x5158, 0x5159, 0x515B,
+    0x515D, 0x515E, 0x515F, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166,
+    0x5167, 0x516A, 0x516F, 0x5172, 0x517A, 0x517E, 0x517F, 0x5183,
+    0x5184, 0x5186, 0x5187, 0x518A, 0x518B, 0x518E, 0x518F, 0x5190,
+    0x5191, 0x5193, 0x5194, 0x5198, 0x519A, 0x519D, 0x519E, 0x519F,
+    0x51A1, 0x51A3, 0x51A6, 0x51A7, 0x51A8, 0x51A9, 0x51AA, 0x51AD,
+    0x51AE, 0x51B4, 0x51B8, 0x51B9, 0x51BA, 0x51BE, 0x51BF, 0x51C1,
+    0x51C2, 0x51C3, 0x51C5, 0x51C8, 0x51CA, 0x51CE, 0x51D0, 0x51D2,
+    0x51D3, 0x51D4, 0x51D5, 0x51D6, 0x51D7, 0x51D8, 0x51D9, 0x51DA,
+    0x51DC, 0x51DE, 0x51DF, 0x51E2, 0x51E3, 0x51E5, 0x51E6, 0x51E7,
+    0x51E8, 0x51E9, 0x51EA, 0x51EC, 0x51EE, 0x51F2, 0x51F4, 0x51F7,
+    0x51FE, 0x5204, 0x5205, 0x5209, 0x520B, 0x520C, 0x520F, 0x5210,
+    0x5213, 0x5214, 0x5215, 0x521C, 0x521E, 0x521F, 0x5221, 0x5222,
+    0x5223, 0x5225, 0x5226, 0x5227, 0x522A, 0x522C, 0x522F, 0x5231,
+    0x5232, 0x5234, 0x5235, 0x523C, 0x523E, 0x5245, 0x5246, 0x5248,
+    0x5249, 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258,
+    0x5259, 0x525A, 0x525D, 0x525F, 0x5260, 0x5262, 0x5263, 0x5264,
+    0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x5270, 0x5271, 0x5273,
+    0x5276, 0x5277, 0x5278, 0x5279, 0x527A, 0x527B, 0x527C, 0x527E,
+    0x5280, 0x5284, 0x5285, 0x5286, 0x528B, 0x528E, 0x528F, 0x5292,
+    0x5294, 0x5295, 0x5296, 0x5297, 0x5298, 0x5299, 0x529A, 0x529C,
+    0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AE, 0x52AF, 0x52B0, 0x52B4,
+    0x52B5, 0x52B6, 0x52B7, 0x52B8, 0x52B9, 0x52BA, 0x52BB, 0x52BC,
+    0x52BD, 0x52C0, 0x52C2, 0x52C4, 0x52C5, 0x52C6, 0x52C8, 0x52CA,
+    0x52CC, 0x52CD, 0x52CE, 0x52CF, 0x52D1, 0x52D3, 0x52D4, 0x52D7,
+    0x52DA, 0x52DC, 0x52E0, 0x52E1, 0x52E3, 0x52E5, 0x52E6, 0x52E7,
+    0x52E8, 0x52E9, 0x52EA, 0x52EB, 0x52EC, 0x52ED, 0x52EE, 0x52EF,
+    0x52F2, 0x52F3, 0x52F4, 0x52F6, 0x52F7, 0x52FB, 0x52FC, 0x52FD,
+    0x5301, 0x5302, 0x5303, 0x5304, 0x5307, 0x5309, 0x530A, 0x530B,
+    0x530C, 0x530E, 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531B,
+    0x531C, 0x531E, 0x531F, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328,
+    0x5329, 0x532B, 0x532C, 0x5330, 0x5332, 0x5333, 0x5334, 0x5335,
+    0x5336, 0x5337, 0x5338, 0x533C, 0x533D, 0x5342, 0x5344, 0x5346,
+    0x534B, 0x534C, 0x534D, 0x5350, 0x5358, 0x5359, 0x535B, 0x535D,
+    0x5365, 0x5368, 0x536A, 0x536C, 0x536D, 0x5372, 0x5376, 0x5379,
+    0x537B, 0x537C, 0x537D, 0x537E, 0x5380, 0x5381, 0x5383, 0x5387,
+    0x5388, 0x538A, 0x538E, 0x538F, 0x5390, 0x5391, 0x5392, 0x5393,
+    0x5394, 0x5396, 0x5397, 0x539B, 0x539C, 0x539E, 0x53A1, 0x53A4,
+    0x53A7, 0x53AA, 0x53AB, 0x53AC, 0x53AF, 0x53B0, 0x53B1, 0x53B3,
+    0x53B5, 0x53B7, 0x53B8, 0x53B9, 0x53BA, 0x53BC, 0x53BD, 0x53BE,
+    0x53C0, 0x53C4, 0x53C5, 0x53C6, 0x53C7, 0x53CE, 0x53CF, 0x53D0,
+    0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD, 0x53DE, 0x53E1,
+    0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF, 0x5400, 0x5402, 0x5405,
+    0x5407, 0x540B, 0x5414, 0x5418, 0x5419, 0x541A, 0x541C, 0x5422,
+    0x5424, 0x5425, 0x542A, 0x5430, 0x5433, 0x5436, 0x5437, 0x543A,
+    0x543D, 0x543F, 0x5441, 0x5442, 0x5444, 0x5445, 0x5447, 0x5449,
+    0x544C, 0x544D, 0x544E, 0x544F, 0x5451, 0x545A, 0x545D, 0x545E,
+    0x545F, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467, 0x5469, 0x546A,
+    0x546B, 0x546C, 0x546D, 0x546E, 0x546F, 0x5470, 0x5474, 0x5479,
+    0x547A, 0x547E, 0x547F, 0x5481, 0x5483, 0x5485, 0x5487, 0x5488,
+    0x5489, 0x548A, 0x548D, 0x5491, 0x5493, 0x5497, 0x5498, 0x549C,
+    0x549E, 0x549F, 0x54A0, 0x54A1, 0x54A2, 0x54A5, 0x54AE, 0x54B0,
+    0x54B2, 0x54B5, 0x54B6, 0x54B7, 0x54B9, 0x54BA, 0x54BE, 0x54C3,
+    0x54C5, 0x54CA, 0x54CB, 0x54D6, 0x54D8, 0x54DB, 0x54E0, 0x54E2,
+    0x54E3, 0x54E4, 0x54EB, 0x54EC, 0x54EF, 0x54F0, 0x54F1, 0x54F4,
+    0x54F5, 0x54F6, 0x54F7, 0x54F8, 0x54F9, 0x54FB, 0x54FE, 0x5500,
+    0x5502, 0x5503, 0x5505, 0x5508, 0x550A, 0x550B, 0x550C, 0x550D,
+    0x550E, 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519,
+    0x551A, 0x551C, 0x551D, 0x551E, 0x551F, 0x5521, 0x5525, 0x5526,
+    0x5528, 0x5529, 0x552B, 0x552D, 0x5532, 0x5534, 0x5535, 0x5536,
+    0x5538, 0x5539, 0x553A, 0x553B, 0x553D, 0x5540, 0x5542, 0x5545,
+    0x5547, 0x5548, 0x554B, 0x554C, 0x554D, 0x554E, 0x5551, 0x5552,
+    0x5554, 0x5557, 0x5558, 0x5559, 0x555A, 0x555B, 0x555D, 0x555F,
+    0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556B, 0x556F, 0x5570,
+    0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557A, 0x557D, 0x557F,
+    0x5585, 0x5586, 0x558C, 0x558D, 0x558E, 0x5590, 0x5592, 0x5593,
+    0x5595, 0x5596, 0x5597, 0x559A, 0x559B, 0x559E, 0x55A0, 0x55A1,
+    0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6, 0x55A8, 0x55A9, 0x55AB,
+    0x55AD, 0x55AF, 0x55B0, 0x55B4, 0x55B6, 0x55B8, 0x55BA, 0x55BC,
+    0x55BF, 0x55C0, 0x55C1, 0x55C2, 0x55C3, 0x55C8, 0x55CA, 0x55CB,
+    0x55CF, 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9, 0x55DB, 0x55DE,
+    0x55E0, 0x55E2, 0x55E7, 0x55ED, 0x55EE, 0x55F0, 0x55F1, 0x55F4,
+    0x55F8, 0x55F9, 0x55FA, 0x55FB, 0x55FC, 0x55FF, 0x5602, 0x5603,
+    0x5604, 0x5605, 0x5607, 0x560A, 0x560B, 0x5610, 0x5611, 0x5612,
+    0x5613, 0x5615, 0x5619, 0x561A, 0x561D, 0x5620, 0x5621, 0x5622,
+    0x5625, 0x5626, 0x5628, 0x562A, 0x562B, 0x5633, 0x5637, 0x563A,
+    0x563C, 0x563D, 0x563E, 0x5640, 0x5642, 0x5643, 0x5644, 0x5645,
+    0x5646, 0x5647, 0x5648, 0x5649, 0x564A, 0x564B, 0x564F, 0x5650,
+    0x5651, 0x5652, 0x5653, 0x5655, 0x5656, 0x565A, 0x565B, 0x565E,
+    0x565F, 0x5661, 0x5663, 0x5667, 0x566D, 0x566E, 0x5670, 0x5673,
+    0x5675, 0x5677, 0x567A, 0x567D, 0x567E, 0x567F, 0x5681, 0x5682,
+    0x5683, 0x5684, 0x5688, 0x5689, 0x568A, 0x568B, 0x568D, 0x5690,
+    0x5691, 0x5692, 0x5694, 0x5696, 0x5697, 0x5698, 0x569A, 0x569B,
+    0x569C, 0x569D, 0x569E, 0x569F, 0x56A0, 0x56A1, 0x56A2, 0x56A4,
+    0x56A5, 0x56A7, 0x56A9, 0x56AA, 0x56AB, 0x56AC, 0x56AD, 0x56B0,
+    0x56B1, 0x56B2, 0x56B5, 0x56B8, 0x56B9, 0x56BA, 0x56BB, 0x56BD,
+    0x56BE, 0x56BF, 0x56C3, 0x56C4, 0x56C6, 0x56C7, 0x56CB, 0x56CD,
+    0x56CE, 0x56CF, 0x56D0, 0x56D2, 0x56D3, 0x56D5, 0x56D6, 0x56D8,
+    0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56E9,
+    0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, 0x56F3, 0x56F6, 0x56F7,
+    0x56F8, 0x56FB, 0x56FC, 0x5700, 0x5701, 0x5702, 0x5705, 0x570C,
+    0x570E, 0x570F, 0x5710, 0x5711, 0x5714, 0x5715, 0x5717, 0x5719,
+    0x571A, 0x571B, 0x571D, 0x571E, 0x5720, 0x5721, 0x5722, 0x5724,
+    0x5725, 0x5726, 0x5727, 0x572B, 0x5731, 0x5732, 0x5734, 0x5735,
+    0x5736, 0x5737, 0x5738, 0x573C, 0x573D, 0x573F, 0x5741, 0x5743,
+    0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, 0x5752, 0x5753,
+    0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765,
+    0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775,
+    0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, 0x5780, 0x5781,
+    0x5787, 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, 0x578F, 0x5790,
+    0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579A,
+    0x579C, 0x579D, 0x579E, 0x579F, 0x57A5, 0x57A8, 0x57AA, 0x57AC,
+    0x57AF, 0x57B0, 0x57B1, 0x57B3, 0x57B5, 0x57B6, 0x57B7, 0x57B9,
+    0x57BA, 0x57BB, 0x57BC, 0x57BD, 0x57BE, 0x57BF, 0x57C0, 0x57C1,
+    0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, 0x57CA, 0x57CC,
+    0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, 0x57DB, 0x57DC,
+    0x57DE, 0x57E2, 0x57E3, 0x57E5, 0x57E6, 0x57E7, 0x57E8, 0x57E9,
+    0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, 0x57F1, 0x57F2, 0x57F3,
+    0x57F5, 0x57F6, 0x57FB, 0x57FC, 0x57FE, 0x57FF, 0x5801, 0x5803,
+    0x5804, 0x5808, 0x5809, 0x580C, 0x580E, 0x580F, 0x5810, 0x5812,
+    0x5813, 0x5814, 0x5817, 0x5818, 0x581A, 0x581B, 0x581C, 0x581F,
+    0x5822, 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582B,
+    0x582C, 0x582D, 0x582E, 0x5832, 0x5833, 0x5836, 0x5837, 0x5838,
+    0x5839, 0x583A, 0x583B, 0x583C, 0x583D, 0x583E, 0x583F, 0x5840,
+    0x5841, 0x5842, 0x5843, 0x5845, 0x5846, 0x5847, 0x5848, 0x5849,
+    0x584E, 0x5850, 0x5853, 0x5855, 0x5856, 0x5859, 0x585A, 0x585B,
+    0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5863, 0x5866, 0x5867,
+    0x5868, 0x5869, 0x586A, 0x586D, 0x586E, 0x586F, 0x5870, 0x5871,
+    0x5872, 0x5873, 0x5874, 0x5876, 0x5877, 0x5878, 0x587A, 0x587B,
+    0x587C, 0x587D, 0x587F, 0x5882, 0x5884, 0x5886, 0x5887, 0x5888,
+    0x588B, 0x588C, 0x588D, 0x588E, 0x588F, 0x5890, 0x5891, 0x5894,
+    0x5895, 0x5896, 0x5897, 0x5898, 0x589B, 0x589D, 0x58A0, 0x58A1,
+    0x58A2, 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58AA, 0x58AB,
+    0x58AC, 0x58AD, 0x58AF, 0x58B0, 0x58B1, 0x58B2, 0x58B4, 0x58B5,
+    0x58B6, 0x58B7, 0x58B8, 0x58B9, 0x58BA, 0x58BD, 0x58BF, 0x58C0,
+    0x58C2, 0x58C3, 0x58C4, 0x58C6, 0x58C8, 0x58C9, 0x58CA, 0x58CB,
+    0x58CC, 0x58CD, 0x58CE, 0x58CF, 0x58D0, 0x58D2, 0x58D4, 0x58D6,
+    0x58D7, 0x58DB, 0x58DC, 0x58DD, 0x58E1, 0x58E3, 0x58E5, 0x58E6,
+    0x58E7, 0x58E8, 0x58EA, 0x58ED, 0x58F1, 0x58F2, 0x58F4, 0x58F5,
+    0x58F7, 0x58F8, 0x58FB, 0x58FC, 0x58FE, 0x58FF, 0x5900, 0x5901,
+    0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590A, 0x590B, 0x590C,
+    0x590E, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591B,
+    0x591D, 0x591E, 0x5920, 0x5921, 0x5923, 0x5926, 0x5928, 0x592C,
+    0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B, 0x593D, 0x593F,
+    0x5940, 0x5943, 0x5945, 0x5946, 0x594A, 0x594C, 0x594D, 0x5950,
+    0x5952, 0x5953, 0x5959, 0x595B, 0x595C, 0x595D, 0x595E, 0x595F,
+    0x5961, 0x5963, 0x5964, 0x5966, 0x5967, 0x5968, 0x596B, 0x596D,
+    0x596F, 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597A, 0x597B,
+    0x597C, 0x597E, 0x597F, 0x5980, 0x5985, 0x5989, 0x598B, 0x598C,
+    0x598E, 0x598F, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599A,
+    0x599B, 0x599C, 0x599F, 0x59A0, 0x59A1, 0x59A2, 0x59A6, 0x59A7,
+    0x59AC, 0x59AD, 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5, 0x59B6,
+    0x59B7, 0x59B8, 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0, 0x59C1,
+    0x59C2, 0x59C3, 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9, 0x59CC,
+    0x59CD, 0x59CE, 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB, 0x59DE,
+    0x59DF, 0x59E0, 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7, 0x59E9,
+    0x59EA, 0x59EB, 0x59ED, 0x59EE, 0x59EF, 0x59F0, 0x59F1, 0x59F2,
+    0x59F3, 0x59F4, 0x59F5, 0x59F6, 0x59F7, 0x59F8, 0x59FA, 0x59FC,
+    0x59FD, 0x59FE, 0x5A00, 0x5A02, 0x5A0A, 0x5A0B, 0x5A0D, 0x5A0E,
+    0x5A0F, 0x5A10, 0x5A12, 0x5A14, 0x5A15, 0x5A16, 0x5A17, 0x5A19,
+    0x5A1A, 0x5A1B, 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24, 0x5A26,
+    0x5A27, 0x5A28, 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E, 0x5A2F,
+    0x5A30, 0x5A33, 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A, 0x5A3B,
+    0x5A3D, 0x5A3E, 0x5A3F, 0x5A42, 0x5A43, 0x5A44, 0x5A45, 0x5A47,
+    0x5A48, 0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, 0x5A4F, 0x5A50, 0x5A51,
+    0x5A52, 0x5A53, 0x5A54, 0x5A56, 0x5A57, 0x5A58, 0x5A59, 0x5A5B,
+    0x5A5C, 0x5A5D, 0x5A5E, 0x5A5F, 0x5A60, 0x5A61, 0x5A63, 0x5A64,
+    0x5A65, 0x5A68, 0x5A69, 0x5A6B, 0x5A6C, 0x5A6E, 0x5A6F, 0x5A70,
+    0x5A71, 0x5A72, 0x5A73, 0x5A78, 0x5A79, 0x5A7B, 0x5A7C, 0x5A7D,
+    0x5A7E, 0x5A80, 0x5A81, 0x5A82, 0x5A83, 0x5A84, 0x5A85, 0x5A86,
+    0x5A87, 0x5A88, 0x5A89, 0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, 0x5A8E,
+    0x5A8F, 0x5A90, 0x5A91, 0x5A93, 0x5A94, 0x5A95, 0x5A96, 0x5A97,
+    0x5A98, 0x5A99, 0x5A9C, 0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA1,
+    0x5AA2, 0x5AA3, 0x5AA4, 0x5AA5, 0x5AA6, 0x5AA8, 0x5AA9, 0x5AAB,
+    0x5AAC, 0x5AAD, 0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, 0x5AB4, 0x5AB6,
+    0x5AB7, 0x5AB9, 0x5ABA, 0x5ABB, 0x5ABC, 0x5ABF, 0x5AC0, 0x5AC3,
+    0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, 0x5ACA, 0x5ACB, 0x5ACD,
+    0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, 0x5AD5, 0x5AD9, 0x5ADA,
+    0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, 0x5AE2, 0x5AE4, 0x5AE5, 0x5AE7,
+    0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, 0x5AEE, 0x5AEF, 0x5AF0, 0x5AF2,
+    0x5AF3, 0x5AF4, 0x5AF6, 0x5AF7, 0x5AF8, 0x5AF9, 0x5AFA, 0x5AFC,
+    0x5AFD, 0x5AFE, 0x5AFF, 0x5B01, 0x5B02, 0x5B03, 0x5B04, 0x5B05,
+    0x5B06, 0x5B07, 0x5B0A, 0x5B0D, 0x5B0E, 0x5B0F, 0x5B10, 0x5B11,
+    0x5B12, 0x5B13, 0x5B14, 0x5B15, 0x5B18, 0x5B1A, 0x5B1B, 0x5B1C,
+    0x5B1D, 0x5B1E, 0x5B1F, 0x5B20, 0x5B22, 0x5B23, 0x5B24, 0x5B25,
+    0x5B26, 0x5B27, 0x5B28, 0x5B29, 0x5B2B, 0x5B2C, 0x5B2D, 0x5B2E,
+    0x5B2F, 0x5B31, 0x5B33, 0x5B35, 0x5B36, 0x5B39, 0x5B3A, 0x5B3B,
+    0x5B3C, 0x5B3D, 0x5B3E, 0x5B3F, 0x5B41, 0x5B42, 0x5B43, 0x5B44,
+    0x5B45, 0x5B46, 0x5B47, 0x5B48, 0x5B49, 0x5B4A, 0x5B4B, 0x5B4D,
+    0x5B4E, 0x5B4F, 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67,
+    0x5B68, 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, 0x5B77,
+    0x5B79, 0x5B7B, 0x5B7C, 0x5B7E, 0x5B82, 0x5B86, 0x5B8A, 0x5B8D,
+    0x5B8E, 0x5B90, 0x5B91, 0x5B92, 0x5B94, 0x5B96, 0x5B9F, 0x5BA7,
+    0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, 0x5BAF, 0x5BB1, 0x5BB2,
+    0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BC3, 0x5BC8,
+    0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, 0x5BCF, 0x5BD1, 0x5BD4,
+    0x5BD5, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, 0x5BDB, 0x5BDC,
+    0x5BE0, 0x5BE3, 0x5BEA, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, 0x5BF3,
+    0x5BF4, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, 0x5C02, 0x5C03, 0x5C05,
+    0x5C0C, 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E,
+    0x5C1F, 0x5C20, 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A,
+    0x5C2B, 0x5C2D, 0x5C2E, 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35,
+    0x5C36, 0x5C43, 0x5C44, 0x5C46, 0x5C47, 0x5C4C, 0x5C4D, 0x5C52,
+    0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, 0x5C5A, 0x5C5B, 0x5C5C,
+    0x5C5D, 0x5C5F, 0x5C67, 0x5C69, 0x5C6A, 0x5C6B, 0x5C6D, 0x5C70,
+    0x5C72, 0x5C73, 0x5C74, 0x5C75, 0x5C76, 0x5C77, 0x5C78, 0x5C7B,
+    0x5C7C, 0x5C7D, 0x5C7E, 0x5C80, 0x5C83, 0x5C84, 0x5C85, 0x5C86,
+    0x5C87, 0x5C89, 0x5C8A, 0x5C8B, 0x5C8E, 0x5C8F, 0x5C92, 0x5C93,
+    0x5C95, 0x5C9D, 0x5C9E, 0x5C9F, 0x5CA0, 0x5CA4, 0x5CA5, 0x5CA6,
+    0x5CA7, 0x5CA8, 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4,
+    0x5CB6, 0x5CB9, 0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2,
+    0x5CC3, 0x5CC5, 0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC,
+    0x5CCD, 0x5CCE, 0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, 0x5CD4, 0x5CD5,
+    0x5CD6, 0x5CD7, 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, 0x5CDD, 0x5CDE,
+    0x5CDF, 0x5CE0, 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, 0x5CEC,
+    0x5CEE, 0x5CEF, 0x5CF1, 0x5CF2, 0x5CF3, 0x5CF5, 0x5CF7, 0x5CF8,
+    0x5CF9, 0x5CFA, 0x5CFC, 0x5CFE, 0x5CFF, 0x5D00, 0x5D01, 0x5D04,
+    0x5D05, 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C, 0x5D0F, 0x5D10,
+    0x5D11, 0x5D12, 0x5D13, 0x5D15, 0x5D18, 0x5D19, 0x5D1A, 0x5D1C,
+    0x5D1D, 0x5D1F, 0x5D20, 0x5D21, 0x5D22, 0x5D23, 0x5D25, 0x5D28,
+    0x5D2A, 0x5D2B, 0x5D2F, 0x5D30, 0x5D31, 0x5D32, 0x5D33, 0x5D35,
+    0x5D36, 0x5D37, 0x5D38, 0x5D39, 0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F,
+    0x5D40, 0x5D41, 0x5D42, 0x5D43, 0x5D44, 0x5D45, 0x5D46, 0x5D48,
+    0x5D49, 0x5D4D, 0x5D4E, 0x5D4F, 0x5D51, 0x5D52, 0x5D53, 0x5D54,
+    0x5D55, 0x5D56, 0x5D57, 0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, 0x5D5F,
+    0x5D60, 0x5D61, 0x5D62, 0x5D63, 0x5D64, 0x5D65, 0x5D66, 0x5D67,
+    0x5D68, 0x5D6A, 0x5D6D, 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73,
+    0x5D75, 0x5D76, 0x5D77, 0x5D78, 0x5D79, 0x5D7A, 0x5D7B, 0x5D7C,
+    0x5D7D, 0x5D7E, 0x5D7F, 0x5D80, 0x5D83, 0x5D85, 0x5D86, 0x5D88,
+    0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, 0x5D8D, 0x5D8E, 0x5D8F, 0x5D90,
+    0x5D91, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D96, 0x5D98, 0x5D9A,
+    0x5D9B, 0x5D9C, 0x5D9E, 0x5D9F, 0x5DA1, 0x5DA2, 0x5DA3, 0x5DA4,
+    0x5DA5, 0x5DA6, 0x5DA8, 0x5DA9, 0x5DAA, 0x5DAB, 0x5DAC, 0x5DAD,
+    0x5DAE, 0x5DAF, 0x5DB0, 0x5DB1, 0x5DB2, 0x5DB3, 0x5DB4, 0x5DB5,
+    0x5DB6, 0x5DB9, 0x5DBB, 0x5DBD, 0x5DBE, 0x5DBF, 0x5DC0, 0x5DC1,
+    0x5DC2, 0x5DC3, 0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, 0x5DC9, 0x5DCA,
+    0x5DCC, 0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, 0x5DD3, 0x5DD5, 0x5DD6,
+    0x5DD7, 0x5DD8, 0x5DD9, 0x5DDA, 0x5DDC, 0x5DDF, 0x5DE0, 0x5DE3,
+    0x5DE4, 0x5DEA, 0x5DEC, 0x5DED, 0x5DF5, 0x5DF6, 0x5DF8, 0x5DF9,
+    0x5DFA, 0x5DFB, 0x5DFC, 0x5DFF, 0x5E00, 0x5E04, 0x5E07, 0x5E09,
+    0x5E0A, 0x5E0B, 0x5E0D, 0x5E0E, 0x5E12, 0x5E13, 0x5E17, 0x5E1E,
+    0x5E1F, 0x5E20, 0x5E21, 0x5E22, 0x5E23, 0x5E24, 0x5E28, 0x5E29,
+    0x5E2A, 0x5E2C, 0x5E2F, 0x5E30, 0x5E32, 0x5E34, 0x5E35, 0x5E39,
+    0x5E3A, 0x5E3E, 0x5E3F, 0x5E41, 0x5E46, 0x5E47, 0x5E48, 0x5E49,
+    0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F, 0x5E50, 0x5E51, 0x5E52,
+    0x5E53, 0x5E56, 0x5E59, 0x5E5A, 0x5E5C, 0x5E5D, 0x5E60, 0x5E64,
+    0x5E65, 0x5E66, 0x5E67, 0x5E68, 0x5E69, 0x5E6A, 0x5E6D, 0x5E6E,
+    0x5E6F, 0x5E70, 0x5E71, 0x5E75, 0x5E77, 0x5E81, 0x5E82, 0x5E83,
+    0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D, 0x5E8E, 0x5E92, 0x5E98,
+    0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3, 0x5EA4, 0x5EA8, 0x5EA9,
+    0x5EAA, 0x5EAC, 0x5EAE, 0x5EAF, 0x5EB0, 0x5EB1, 0x5EB2, 0x5EB4,
+    0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD, 0x5EBF, 0x5EC0, 0x5EC1, 0x5EC2,
+    0x5EC3, 0x5EC4, 0x5EC5, 0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, 0x5ECC,
+    0x5ECD, 0x5ECE, 0x5ECF, 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, 0x5ED8,
+    0x5ED9, 0x5EDA, 0x5EDC, 0x5EDD, 0x5EDE, 0x5EE4, 0x5EE5, 0x5EE6,
+    0x5EE7, 0x5EE9, 0x5EEB, 0x5EED, 0x5EEE, 0x5EEF, 0x5EF0, 0x5EF1,
+    0x5EF2, 0x5EF5, 0x5EF8, 0x5EF9, 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05,
+    0x5F06, 0x5F07, 0x5F09, 0x5F0C, 0x5F0D, 0x5F0E, 0x5F10, 0x5F12,
+    0x5F14, 0x5F16, 0x5F19, 0x5F1A, 0x5F1C, 0x5F1D, 0x5F1E, 0x5F21,
+    0x5F22, 0x5F23, 0x5F24, 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30,
+    0x5F32, 0x5F34, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, 0x5F3D, 0x5F3E,
+    0x5F3F, 0x5F41, 0x5F42, 0x5F43, 0x5F44, 0x5F45, 0x5F47, 0x5F49,
+    0x5F4A, 0x5F4B, 0x5F4D, 0x5F4F, 0x5F51, 0x5F54, 0x5F5A, 0x5F5B,
+    0x5F5C, 0x5F5E, 0x5F5F, 0x5F60, 0x5F63, 0x5F65, 0x5F67, 0x5F68,
+    0x5F6B, 0x5F6E, 0x5F6F, 0x5F72, 0x5F74, 0x5F75, 0x5F76, 0x5F78,
+    0x5F7A, 0x5F7D, 0x5F7E, 0x5F7F, 0x5F83, 0x5F86, 0x5F8D, 0x5F8E,
+    0x5F8F, 0x5F93, 0x5F94, 0x5F96, 0x5F9A, 0x5F9B, 0x5F9D, 0x5F9F,
+    0x5FA2, 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, 0x5FAB, 0x5FAC,
+    0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, 0x5FB4, 0x5FB6, 0x5FB8,
+    0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, 0x5FC0, 0x5FC1, 0x5FC2, 0x5FC7,
+    0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, 0x5FD3, 0x5FD4, 0x5FD5, 0x5FDA,
+    0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, 0x5FE2, 0x5FE3, 0x5FE5, 0x5FE6,
+    0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, 0x5FF0, 0x5FF2, 0x5FF3, 0x5FF4,
+    0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, 0x5FFC, 0x6007, 0x6008, 0x6009,
+    0x600B, 0x600C, 0x6010, 0x6011, 0x6013, 0x6017, 0x6018, 0x601A,
+    0x601E, 0x601F, 0x6022, 0x6023, 0x6024, 0x602C, 0x602D, 0x602E,
+    0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, 0x6037, 0x6038,
+    0x6039, 0x603A, 0x603D, 0x603E, 0x6040, 0x6044, 0x6045, 0x6046,
+    0x6047, 0x6048, 0x6049, 0x604A, 0x604C, 0x604E, 0x604F, 0x6051,
+    0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605B, 0x605C, 0x605E,
+    0x605F, 0x6060, 0x6061, 0x6065, 0x6066, 0x606E, 0x6071, 0x6072,
+    0x6074, 0x6075, 0x6077, 0x607E, 0x6080, 0x6081, 0x6082, 0x6085,
+    0x6086, 0x6087, 0x6088, 0x608A, 0x608B, 0x608E, 0x608F, 0x6090,
+    0x6091, 0x6093, 0x6095, 0x6097, 0x6098, 0x6099, 0x609C, 0x609E,
+    0x60A1, 0x60A2, 0x60A4, 0x60A5, 0x60A7, 0x60A9, 0x60AA, 0x60AE,
+    0x60B0, 0x60B3, 0x60B7, 0x60B9, 0x60BA, 0x60BD, 0x60BE, 0x60BF,
+    0x60C0, 0x60C1, 0x60C2, 0x60C3, 0x60C4, 0x60C7, 0x60C8, 0x60C9,
+    0x60CC, 0x60CD, 0x60CE, 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4,
+    0x60D6, 0x60D7, 0x60D9, 0x60DB, 0x60DE, 0x60E2, 0x60E3, 0x60E4,
+    0x60E5, 0x60EA, 0x60F5, 0x60F7, 0x60F8, 0x60FC, 0x60FD, 0x60FE,
+    0x60FF, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610A, 0x610B,
+    0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117,
+    0x6118, 0x6119, 0x611D, 0x611E, 0x6121, 0x6122, 0x6125, 0x6128,
+    0x6129, 0x612A, 0x612C, 0x612D, 0x612E, 0x612F, 0x6130, 0x6131,
+    0x6132, 0x6133, 0x6135, 0x6136, 0x6138, 0x6139, 0x613A, 0x613B,
+    0x613C, 0x613D, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145,
+    0x6146, 0x6147, 0x6149, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153,
+    0x6154, 0x6156, 0x6157, 0x6159, 0x615B, 0x615C, 0x615E, 0x6160,
+    0x6161, 0x6165, 0x6166, 0x6169, 0x616C, 0x616D, 0x616F, 0x6171,
+    0x6172, 0x6174, 0x6178, 0x6179, 0x617A, 0x617B, 0x617C, 0x617D,
+    0x617E, 0x617F, 0x6180, 0x6181, 0x6183, 0x6184, 0x6185, 0x6186,
+    0x6187, 0x6188, 0x6189, 0x618C, 0x618D, 0x618F, 0x6193, 0x6195,
+    0x6196, 0x6197, 0x6198, 0x6199, 0x619B, 0x619C, 0x619E, 0x619F,
+    0x61A0, 0x61A1, 0x61A2, 0x61A3, 0x61A5, 0x61A6, 0x61AA, 0x61AD,
+    0x61AF, 0x61B0, 0x61B1, 0x61B3, 0x61B4, 0x61B5, 0x61B8, 0x61B9,
+    0x61BA, 0x61BB, 0x61BC, 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3,
+    0x61C4, 0x61C5, 0x61C6, 0x61CD, 0x61CE, 0x61CF, 0x61D0, 0x61D3,
+    0x61D5, 0x61D6, 0x61D7, 0x61D8, 0x61D9, 0x61DA, 0x61DB, 0x61DC,
+    0x61DD, 0x61E0, 0x61E1, 0x61E2, 0x61E4, 0x61E5, 0x61E7, 0x61E9,
+    0x61EA, 0x61EB, 0x61EC, 0x61ED, 0x61EE, 0x61EF, 0x61F0, 0x61F1,
+    0x61F3, 0x61F4, 0x61F9, 0x61FB, 0x61FD, 0x6201, 0x6202, 0x6203,
+    0x6204, 0x6205, 0x6209, 0x6213, 0x6219, 0x621C, 0x621D, 0x621E,
+    0x6220, 0x6223, 0x6226, 0x6228, 0x6229, 0x622B, 0x622D, 0x622F,
+    0x6231, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A, 0x623B, 0x623C,
+    0x6242, 0x6244, 0x6245, 0x6246, 0x624A, 0x624F, 0x6250, 0x6255,
+    0x6256, 0x6257, 0x6259, 0x625A, 0x625C, 0x625D, 0x625E, 0x625F,
+    0x6260, 0x6261, 0x6262, 0x6264, 0x6265, 0x6268, 0x6271, 0x6272,
+    0x6274, 0x6275, 0x6277, 0x6278, 0x627A, 0x627B, 0x627D, 0x6281,
+    0x6282, 0x6283, 0x6285, 0x6286, 0x6287, 0x6288, 0x628B, 0x628C,
+    0x628D, 0x628E, 0x628F, 0x6290, 0x6294, 0x6299, 0x629C, 0x629D,
+    0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9, 0x62AA, 0x62AD, 0x62AE,
+    0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4, 0x62B6, 0x62B7, 0x62B8,
+    0x62BA, 0x62BE, 0x62C0, 0x62C1, 0x62C3, 0x62CB, 0x62CF, 0x62D1,
+    0x62D5, 0x62DD, 0x62DE, 0x62E0, 0x62E1, 0x62E4, 0x62EA, 0x62EB,
+    0x62F0, 0x62F2, 0x62F5, 0x62F8, 0x62F9, 0x62FA, 0x62FB, 0x6300,
+    0x6303, 0x6304, 0x6305, 0x6306, 0x630A, 0x630B, 0x630C, 0x630D,
+    0x630F, 0x6310, 0x6312, 0x6313, 0x6314, 0x6315, 0x6317, 0x6318,
+    0x6319, 0x631C, 0x6326, 0x6327, 0x6329, 0x632C, 0x632D, 0x632E,
+    0x6330, 0x6331, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, 0x6338,
+    0x633B, 0x633C, 0x633F, 0x6340, 0x6341, 0x6344, 0x6347, 0x6348,
+    0x634A, 0x6351, 0x6352, 0x6353, 0x6354, 0x6356, 0x6357, 0x6358,
+    0x6359, 0x635A, 0x635B, 0x635C, 0x635D, 0x6360, 0x6364, 0x6365,
+    0x6366, 0x636A, 0x636C, 0x636F, 0x6370, 0x6373, 0x6374, 0x6375,
+    0x6378, 0x6379, 0x637C, 0x637D, 0x637E, 0x637F, 0x6381, 0x6385,
+    0x6386, 0x638B, 0x638D, 0x6391, 0x6393, 0x6394, 0x6395, 0x6397,
+    0x6399, 0x639A, 0x639B, 0x639C, 0x639D, 0x639E, 0x639F, 0x63A1,
+    0x63A4, 0x63A6, 0x63AB, 0x63AF, 0x63B1, 0x63B2, 0x63B5, 0x63B6,
+    0x63B9, 0x63BB, 0x63BD, 0x63BF, 0x63C1, 0x63C2, 0x63C3, 0x63C5,
+    0x63C7, 0x63C8, 0x63CA, 0x63CB, 0x63CC, 0x63D1, 0x63D3, 0x63D4,
+    0x63D5, 0x63D7, 0x63D8, 0x63D9, 0x63DB, 0x63DC, 0x63DD, 0x63DF,
+    0x63E2, 0x63E4, 0x63E5, 0x63E6, 0x63E7, 0x63E8, 0x63EB, 0x63EC,
+    0x63EF, 0x63F0, 0x63F1, 0x63F3, 0x63F5, 0x63F7, 0x63F9, 0x63FA,
+    0x63FB, 0x63FC, 0x63FE, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408,
+    0x6409, 0x640A, 0x640E, 0x6411, 0x6412, 0x6415, 0x6416, 0x6418,
+    0x6419, 0x641A, 0x641D, 0x641F, 0x6422, 0x6423, 0x6424, 0x6425,
+    0x6427, 0x6428, 0x6429, 0x642B, 0x642E, 0x642F, 0x6430, 0x6431,
+    0x6432, 0x6433, 0x6435, 0x6437, 0x6438, 0x6439, 0x643B, 0x643C,
+    0x643E, 0x6440, 0x6442, 0x6443, 0x6449, 0x644B, 0x644C, 0x644D,
+    0x644E, 0x644F, 0x6450, 0x6453, 0x6455, 0x6456, 0x6457, 0x6459,
+    0x645A, 0x645B, 0x645D, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464,
+    0x6465, 0x6466, 0x6468, 0x646A, 0x646B, 0x646C, 0x646E, 0x6470,
+    0x6471, 0x6472, 0x6474, 0x6475, 0x6477, 0x647C, 0x647D, 0x647E,
+    0x647F, 0x6480, 0x6481, 0x6483, 0x6486, 0x6489, 0x648A, 0x648B,
+    0x648C, 0x648D, 0x648E, 0x648F, 0x6490, 0x6494, 0x6497, 0x6498,
+    0x649A, 0x649B, 0x649C, 0x649D, 0x64A0, 0x64A1, 0x64A2, 0x64A6,
+    0x64A7, 0x64A8, 0x64AA, 0x64AF, 0x64B1, 0x64B4, 0x64B6, 0x64B9,
+    0x64BD, 0x64C3, 0x64C6, 0x64C8, 0x64C9, 0x64CC, 0x64CF, 0x64D1,
+    0x64D3, 0x64D5, 0x64D6, 0x64D9, 0x64DB, 0x64DC, 0x64DD, 0x64DF,
+    0x64E1, 0x64E3, 0x64E5, 0x64E7, 0x64E8, 0x64E9, 0x64EA, 0x64EB,
+    0x64ED, 0x64EE, 0x64F3, 0x64F5, 0x64F6, 0x64F8, 0x64F9, 0x64FD,
+    0x64FF, 0x6501, 0x6502, 0x6503, 0x6505, 0x6507, 0x6508, 0x650A,
+    0x650B, 0x650C, 0x650D, 0x650E, 0x6510, 0x6511, 0x6513, 0x6515,
+    0x6517, 0x651A, 0x651C, 0x651E, 0x651F, 0x6520, 0x6521, 0x6526,
+    0x6527, 0x6528, 0x6529, 0x652D, 0x6530, 0x6531, 0x6532, 0x6533,
+    0x6537, 0x653A, 0x653C, 0x653D, 0x6540, 0x6541, 0x6542, 0x6543,
+    0x6544, 0x6546, 0x6547, 0x654A, 0x654B, 0x654D, 0x654E, 0x6550,
+    0x6552, 0x6553, 0x6554, 0x6558, 0x655A, 0x655C, 0x655F, 0x6560,
+    0x6561, 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, 0x656D,
+    0x656E, 0x656F, 0x6571, 0x6573, 0x6576, 0x6579, 0x657A, 0x657B,
+    0x657C, 0x657D, 0x657E, 0x657F, 0x6580, 0x6581, 0x6584, 0x6585,
+    0x6586, 0x6588, 0x6589, 0x658A, 0x658D, 0x658E, 0x658F, 0x6592,
+    0x6594, 0x6596, 0x6598, 0x659A, 0x659D, 0x659E, 0x65A0, 0x65A2,
+    0x65A3, 0x65A6, 0x65A8, 0x65AA, 0x65AE, 0x65B1, 0x65B2, 0x65B3,
+    0x65B4, 0x65B5, 0x65B6, 0x65B8, 0x65BA, 0x65BB, 0x65BE, 0x65BF,
+    0x65C0, 0x65C2, 0x65C7, 0x65C8, 0x65C9, 0x65CA, 0x65CD, 0x65D0,
+    0x65D1, 0x65D3, 0x65D4, 0x65D5, 0x65D8, 0x65D9, 0x65DA, 0x65DB,
+    0x65DC, 0x65DD, 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, 0x65EA,
+    0x65EB, 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB,
+    0x65FC, 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607,
+    0x6608, 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616,
+    0x6617, 0x6618, 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622,
+    0x6623, 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E,
+    0x6630, 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663A, 0x663B,
+    0x663D, 0x663F, 0x6640, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648,
+    0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, 0x6658, 0x6659,
+    0x665B, 0x665C, 0x665E, 0x6660, 0x6662, 0x6663, 0x6665, 0x6667,
+    0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671, 0x6672, 0x6673,
+    0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D, 0x667F, 0x6680,
+    0x6681, 0x6683, 0x6685, 0x6686, 0x668A, 0x668B, 0x668D, 0x668E,
+    0x668F, 0x6690, 0x6692, 0x6693, 0x6694, 0x6695, 0x6698, 0x6699,
+    0x669A, 0x669B, 0x669C, 0x669E, 0x669F, 0x66A0, 0x66A1, 0x66A3,
+    0x66A4, 0x66A5, 0x66A6, 0x66A9, 0x66AA, 0x66AC, 0x66AD, 0x66AF,
+    0x66B0, 0x66B1, 0x66B2, 0x66B3, 0x66B5, 0x66B6, 0x66B7, 0x66B8,
+    0x66BA, 0x66BB, 0x66BC, 0x66BD, 0x66BF, 0x66C0, 0x66C1, 0x66C2,
+    0x66C3, 0x66C5, 0x66C8, 0x66CA, 0x66CB, 0x66CC, 0x66CD, 0x66CE,
+    0x66CF, 0x66D0, 0x66D1, 0x66D2, 0x66D3, 0x66D4, 0x66D5, 0x66D7,
+    0x66D8, 0x66DA, 0x66DE, 0x66DF, 0x66E1, 0x66E2, 0x66E3, 0x66E4,
+    0x66E5, 0x66E7, 0x66E8, 0x66EA, 0x66EB, 0x66ED, 0x66EE, 0x66EF,
+    0x66F1, 0x66F5, 0x66F6, 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702,
+    0x6704, 0x6705, 0x6706, 0x6707, 0x670C, 0x670E, 0x670F, 0x6711,
+    0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671A, 0x671C, 0x671E,
+    0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6729, 0x672E,
+    0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, 0x673B,
+    0x673C, 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747, 0x674A,
+    0x674B, 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, 0x6759,
+    0x675A, 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766, 0x6767,
+    0x676B, 0x676C, 0x676E, 0x6774, 0x6776, 0x6778, 0x6779, 0x677A,
+    0x677B, 0x677D, 0x6780, 0x6782, 0x6783, 0x6785, 0x6786, 0x6788,
+    0x678A, 0x678C, 0x678D, 0x678E, 0x678F, 0x6791, 0x6792, 0x6793,
+    0x6794, 0x6796, 0x6799, 0x679B, 0x679F, 0x67A0, 0x67A1, 0x67A4,
+    0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1, 0x67B2, 0x67B4, 0x67B9,
+    0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE, 0x67BF, 0x67C0, 0x67C2,
+    0x67C5, 0x67C6, 0x67C7, 0x67C8, 0x67C9, 0x67CA, 0x67CB, 0x67CC,
+    0x67CD, 0x67CE, 0x67D5, 0x67D6, 0x67D7, 0x67DB, 0x67DF, 0x67E1,
+    0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8, 0x67EA, 0x67EB, 0x67ED,
+    0x67EE, 0x67F2, 0x67F5, 0x67F6, 0x67F7, 0x67F8, 0x67F9, 0x67FA,
+    0x67FB, 0x67FC, 0x67FE, 0x6801, 0x6802, 0x6803, 0x6804, 0x6806,
+    0x680D, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818, 0x6819, 0x681A,
+    0x681B, 0x681C, 0x681E, 0x681F, 0x6820, 0x6822, 0x6823, 0x6824,
+    0x6825, 0x6826, 0x6827, 0x6828, 0x682B, 0x682C, 0x682D, 0x682E,
+    0x682F, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, 0x683A, 0x683B,
+    0x683F, 0x6847, 0x684B, 0x684D, 0x684F, 0x6852, 0x6856, 0x6857,
+    0x6858, 0x6859, 0x685A, 0x685B, 0x685C, 0x685D, 0x685E, 0x685F,
+    0x686A, 0x686C, 0x686D, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872,
+    0x6873, 0x6875, 0x6878, 0x6879, 0x687A, 0x687B, 0x687C, 0x687D,
+    0x687E, 0x687F, 0x6880, 0x6882, 0x6884, 0x6887, 0x6888, 0x6889,
+    0x688A, 0x688B, 0x688C, 0x688D, 0x688E, 0x6890, 0x6891, 0x6892,
+    0x6894, 0x6895, 0x6896, 0x6899, 0x689A, 0x689B, 0x689C, 0x689E,
+    0x68A0, 0x68A1, 0x68A3, 0x68A4, 0x68A5, 0x68A9, 0x68AA, 0x68AB,
+    0x68AC, 0x68AE, 0x68B1, 0x68B2, 0x68B4, 0x68B6, 0x68B7, 0x68B8,
+    0x68B9, 0x68BA, 0x68BB, 0x68BC, 0x68BD, 0x68BE, 0x68BF, 0x68C1,
+    0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, 0x68C8, 0x68CA, 0x68CC,
+    0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, 0x68D4, 0x68D9, 0x68DB,
+    0x68DC, 0x68DD, 0x68DE, 0x68E1, 0x68E2, 0x68E4, 0x68E5, 0x68E6,
+    0x68E8, 0x68E9, 0x68EA, 0x68EB, 0x68EC, 0x68ED, 0x68EF, 0x68F2,
+    0x68F3, 0x68F4, 0x68F6, 0x68F7, 0x68F8, 0x68FB, 0x68FD, 0x68FE,
+    0x68FF, 0x6900, 0x6902, 0x6903, 0x6904, 0x6906, 0x6907, 0x6908,
+    0x6909, 0x690A, 0x690C, 0x6911, 0x6913, 0x6914, 0x6915, 0x6916,
+    0x6917, 0x6918, 0x6919, 0x691A, 0x691B, 0x691C, 0x691D, 0x691E,
+    0x6921, 0x6922, 0x6923, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929,
+    0x692A, 0x692B, 0x692C, 0x692E, 0x692F, 0x6931, 0x6932, 0x6933,
+    0x6935, 0x6936, 0x6937, 0x6938, 0x693A, 0x693B, 0x693C, 0x693E,
+    0x6940, 0x6941, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948,
+    0x6949, 0x694B, 0x694C, 0x694D, 0x694E, 0x694F, 0x6950, 0x6951,
+    0x6952, 0x6955, 0x6956, 0x6958, 0x6959, 0x695B, 0x695C, 0x695F,
+    0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6969, 0x696A, 0x696C,
+    0x696F, 0x6970, 0x6972, 0x6973, 0x6974, 0x6976, 0x697A, 0x697B,
+    0x697D, 0x697E, 0x697F, 0x6981, 0x6983, 0x6985, 0x698A, 0x698B,
+    0x698C, 0x698E, 0x698F, 0x6990, 0x6991, 0x6992, 0x6993, 0x6996,
+    0x6997, 0x6999, 0x699A, 0x699D, 0x699E, 0x699F, 0x69A0, 0x69A1,
+    0x69A2, 0x69A3, 0x69A4, 0x69A5, 0x69A6, 0x69A9, 0x69AC, 0x69AF,
+    0x69B0, 0x69B2, 0x69B3, 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA,
+    0x69BC, 0x69BD, 0x69BE, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5,
+    0x69C6, 0x69C7, 0x69C8, 0x69C9, 0x69CF, 0x69D1, 0x69D2, 0x69D3,
+    0x69D5, 0x69D6, 0x69D7, 0x69D8, 0x69D9, 0x69DA, 0x69DC, 0x69DD,
+    0x69DE, 0x69E1, 0x69E2, 0x69E3, 0x69E4, 0x69E5, 0x69E6, 0x69E8,
+    0x69E9, 0x69EA, 0x69EB, 0x69EC, 0x69EE, 0x69EF, 0x69F0, 0x69F1,
+    0x69F4, 0x69F5, 0x69F6, 0x69F7, 0x69F8, 0x69F9, 0x69FA, 0x69FB,
+    0x69FC, 0x69FE, 0x6A00, 0x6A03, 0x6A04, 0x6A06, 0x6A07, 0x6A08,
+    0x6A09, 0x6A0B, 0x6A0C, 0x6A0D, 0x6A0E, 0x6A0F, 0x6A10, 0x6A11,
+    0x6A12, 0x6A14, 0x6A15, 0x6A16, 0x6A1A, 0x6A1B, 0x6A1C, 0x6A1D,
+    0x6A20, 0x6A22, 0x6A24, 0x6A25, 0x6A26, 0x6A27, 0x6A29, 0x6A2B,
+    0x6A2C, 0x6A2D, 0x6A2E, 0x6A30, 0x6A32, 0x6A33, 0x6A34, 0x6A36,
+    0x6A37, 0x6A3B, 0x6A3C, 0x6A3F, 0x6A40, 0x6A41, 0x6A42, 0x6A43,
+    0x6A45, 0x6A46, 0x6A49, 0x6A4A, 0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F,
+    0x6A51, 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, 0x6A57, 0x6A5A,
+    0x6A5C, 0x6A5D, 0x6A5E, 0x6A60, 0x6A63, 0x6A64, 0x6A66, 0x6A67,
+    0x6A68, 0x6A69, 0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, 0x6A6E, 0x6A6F,
+    0x6A70, 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76, 0x6A77, 0x6A78,
+    0x6A7A, 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, 0x6A82, 0x6A83,
+    0x6A85, 0x6A86, 0x6A87, 0x6A88, 0x6A8A, 0x6A8B, 0x6A8C, 0x6A8D,
+    0x6A8F, 0x6A92, 0x6A93, 0x6A95, 0x6A96, 0x6A98, 0x6A99, 0x6A9A,
+    0x6A9B, 0x6A9D, 0x6A9E, 0x6A9F, 0x6AA1, 0x6AA4, 0x6AA5, 0x6AA6,
+    0x6AA7, 0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, 0x6AB0, 0x6AB1, 0x6AB2,
+    0x6AB4, 0x6AB5, 0x6AB6, 0x6AB7, 0x6AB9, 0x6ABA, 0x6ABC, 0x6ABD,
+    0x6ABE, 0x6ABF, 0x6AC0, 0x6AC1, 0x6AC2, 0x6AC4, 0x6AC5, 0x6AC6,
+    0x6AC7, 0x6AC8, 0x6AC9, 0x6ACA, 0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE,
+    0x6ACF, 0x6AD0, 0x6AD1, 0x6AD2, 0x6AD4, 0x6AD5, 0x6AD6, 0x6AD7,
+    0x6AD8, 0x6AD9, 0x6ADC, 0x6AE0, 0x6AE1, 0x6AE2, 0x6AE3, 0x6AE4,
+    0x6AE5, 0x6AE6, 0x6AE9, 0x6AEB, 0x6AED, 0x6AEE, 0x6AEF, 0x6AF0,
+    0x6AF1, 0x6AF2, 0x6AF4, 0x6AF5, 0x6AF6, 0x6AF7, 0x6AF9, 0x6AFA,
+    0x6AFC, 0x6AFD, 0x6AFE, 0x6AFF, 0x6B00, 0x6B01, 0x6B02, 0x6B03,
+    0x6B05, 0x6B06, 0x6B07, 0x6B08, 0x6B09, 0x6B0B, 0x6B0C, 0x6B0D,
+    0x6B0E, 0x6B10, 0x6B11, 0x6B13, 0x6B14, 0x6B15, 0x6B17, 0x6B18,
+    0x6B19, 0x6B1A, 0x6B1B, 0x6B1C, 0x6B1D, 0x6B1F, 0x6B25, 0x6B26,
+    0x6B28, 0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, 0x6B2D, 0x6B2E, 0x6B2F,
+    0x6B30, 0x6B31, 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38, 0x6B3B,
+    0x6B3C, 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44, 0x6B45, 0x6B48,
+    0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, 0x6B4F, 0x6B51, 0x6B52, 0x6B53,
+    0x6B54, 0x6B55, 0x6B56, 0x6B57, 0x6B58, 0x6B5A, 0x6B5B, 0x6B5C,
+    0x6B5D, 0x6B5E, 0x6B60, 0x6B68, 0x6B69, 0x6B6B, 0x6B6C, 0x6B6D,
+    0x6B6E, 0x6B6F, 0x6B70, 0x6B71, 0x6B73, 0x6B74, 0x6B75, 0x6B76,
+    0x6B7A, 0x6B7D, 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, 0x6B88, 0x6B8C,
+    0x6B8E, 0x6B8F, 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97, 0x6B99,
+    0x6B9C, 0x6B9D, 0x6B9F, 0x6BA0, 0x6BA2, 0x6BA3, 0x6BA5, 0x6BA6,
+    0x6BA7, 0x6BA8, 0x6BA9, 0x6BAC, 0x6BAD, 0x6BB0, 0x6BB1, 0x6BB6,
+    0x6BB8, 0x6BB9, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0, 0x6BC3, 0x6BC4,
+    0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, 0x6BCC, 0x6BCE, 0x6BD0, 0x6BD1,
+    0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, 0x6BDE, 0x6BDF, 0x6BE0, 0x6BE2,
+    0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, 0x6BE7, 0x6BE8, 0x6BE9, 0x6BEC,
+    0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2, 0x6BF4, 0x6BF6, 0x6BF7,
+    0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE, 0x6C00, 0x6C01, 0x6C02,
+    0x6C03, 0x6C04, 0x6C09, 0x6C0A, 0x6C0B, 0x6C0E, 0x6C12, 0x6C17,
+    0x6C1C, 0x6C1D, 0x6C1E, 0x6C20, 0x6C25, 0x6C2D, 0x6C31, 0x6C33,
+    0x6C36, 0x6C37, 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E, 0x6C3F,
+    0x6C43, 0x6C44, 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D, 0x6C4E,
+    0x6C4F, 0x6C51, 0x6C52, 0x6C53, 0x6C56, 0x6C58, 0x6C59, 0x6C5A,
+    0x6C62, 0x6C63, 0x6C65, 0x6C66, 0x6C67, 0x6C6B, 0x6C6C, 0x6C6D,
+    0x6C6E, 0x6C6F, 0x6C71, 0x6C73, 0x6C75, 0x6C77, 0x6C78, 0x6C7A,
+    0x6C7B, 0x6C7C, 0x6C7F, 0x6C80, 0x6C84, 0x6C87, 0x6C8A, 0x6C8B,
+    0x6C8D, 0x6C8E, 0x6C91, 0x6C92, 0x6C95, 0x6C96, 0x6C97, 0x6C98,
+    0x6C9A, 0x6C9C, 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, 0x6CA8, 0x6CAC,
+    0x6CAF, 0x6CB0, 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, 0x6CBA, 0x6CC0,
+    0x6CC1, 0x6CC2, 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, 0x6CCB, 0x6CCD,
+    0x6CCE, 0x6CCF, 0x6CD1, 0x6CD2, 0x6CD8, 0x6CD9, 0x6CDA, 0x6CDC,
+    0x6CDD, 0x6CDF, 0x6CE4, 0x6CE6, 0x6CE7, 0x6CE9, 0x6CEC, 0x6CED,
+    0x6CF2, 0x6CF4, 0x6CF9, 0x6CFF, 0x6D00, 0x6D02, 0x6D03, 0x6D05,
+    0x6D06, 0x6D08, 0x6D09, 0x6D0A, 0x6D0D, 0x6D0F, 0x6D10, 0x6D11,
+    0x6D13, 0x6D14, 0x6D15, 0x6D16, 0x6D18, 0x6D1C, 0x6D1D, 0x6D1F,
+    0x6D20, 0x6D21, 0x6D22, 0x6D23, 0x6D24, 0x6D26, 0x6D28, 0x6D29,
+    0x6D2C, 0x6D2D, 0x6D2F, 0x6D30, 0x6D34, 0x6D36, 0x6D37, 0x6D38,
+    0x6D3A, 0x6D3F, 0x6D40, 0x6D42, 0x6D44, 0x6D49, 0x6D4C, 0x6D50,
+    0x6D55, 0x6D56, 0x6D57, 0x6D58, 0x6D5B, 0x6D5D, 0x6D5F, 0x6D61,
+    0x6D62, 0x6D64, 0x6D65, 0x6D67, 0x6D68, 0x6D6B, 0x6D6C, 0x6D6D,
+    0x6D70, 0x6D71, 0x6D72, 0x6D73, 0x6D75, 0x6D76, 0x6D7A, 0x6D7B,
+    0x6D7D, 0x6D7E, 0x6D7F, 0x6D80, 0x6D81, 0x6D83, 0x6D84, 0x6D86,
+    0x6D8A, 0x6D8B, 0x6D8D, 0x6D8F, 0x6D90, 0x6D92, 0x6D96, 0x6D97,
+    0x6D98, 0x6D99, 0x6D9A, 0x6D9C, 0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD,
+    0x6DB0, 0x6DB1, 0x6DB3, 0x6DB4, 0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA,
+    0x6DBB, 0x6DBC, 0x6DBD, 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8,
+    0x6DC9, 0x6DCA, 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3,
+    0x6DD4, 0x6DD5, 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2,
+    0x6DE3, 0x6DE5, 0x6DE7, 0x6DE8, 0x6DE9, 0x6DED, 0x6DEF, 0x6DF0,
+    0x6DF2, 0x6DF4, 0x6DF8, 0x6DFD, 0x6DFE, 0x6DFF, 0x6E00, 0x6E01,
+    0x6E02, 0x6E03, 0x6E04, 0x6E06, 0x6E07, 0x6E08, 0x6E09, 0x6E0B,
+    0x6E0F, 0x6E12, 0x6E13, 0x6E15, 0x6E18, 0x6E19, 0x6E1B, 0x6E1C,
+    0x6E1E, 0x6E1F, 0x6E22, 0x6E27, 0x6E28, 0x6E2A, 0x6E2E, 0x6E30,
+    0x6E31, 0x6E33, 0x6E35, 0x6E36, 0x6E37, 0x6E39, 0x6E3B, 0x6E3C,
+    0x6E3D, 0x6E3F, 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, 0x6E47,
+    0x6E48, 0x6E49, 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51,
+    0x6E52, 0x6E55, 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E60,
+    0x6E61, 0x6E62, 0x6E63, 0x6E64, 0x6E65, 0x6E66, 0x6E67, 0x6E68,
+    0x6E69, 0x6E6A, 0x6E6C, 0x6E6D, 0x6E70, 0x6E71, 0x6E72, 0x6E73,
+    0x6E74, 0x6E75, 0x6E76, 0x6E77, 0x6E78, 0x6E79, 0x6E7A, 0x6E7B,
+    0x6E7C, 0x6E7D, 0x6E80, 0x6E81, 0x6E82, 0x6E84, 0x6E87, 0x6E88,
+    0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, 0x6E91, 0x6E92, 0x6E93,
+    0x6E94, 0x6E95, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, 0x6E9E, 0x6EA0,
+    0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, 0x6EA9, 0x6EAB, 0x6EAC,
+    0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, 0x6EB8, 0x6EB9, 0x6EBC,
+    0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA,
+    0x6ECD, 0x6ED0, 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC,
+    0x6EDD, 0x6EE3, 0x6EE7, 0x6EEA, 0x6EEB, 0x6EED, 0x6EEE, 0x6EF0,
+    0x6EF1, 0x6EF3, 0x6EF5, 0x6EF6, 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD,
+    0x6EFE, 0x6F00, 0x6F03, 0x6F04, 0x6F05, 0x6F07, 0x6F08, 0x6F0A,
+    0x6F0B, 0x6F0C, 0x6F0D, 0x6F0E, 0x6F10, 0x6F11, 0x6F12, 0x6F16,
+    0x6F17, 0x6F18, 0x6F19, 0x6F1B, 0x6F1C, 0x6F1D, 0x6F1E, 0x6F1F,
+    0x6F21, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2E, 0x6F30, 0x6F34,
+    0x6F35, 0x6F37, 0x6F39, 0x6F3A, 0x6F3B, 0x6F3C, 0x6F3D, 0x6F40,
+    0x6F42, 0x6F43, 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C,
+    0x6F4E, 0x6F4F, 0x6F50, 0x6F52, 0x6F53, 0x6F55, 0x6F56, 0x6F57,
+    0x6F5A, 0x6F5B, 0x6F5D, 0x6F5F, 0x6F60, 0x6F61, 0x6F63, 0x6F65,
+    0x6F67, 0x6F68, 0x6F69, 0x6F6A, 0x6F6B, 0x6F6C, 0x6F71, 0x6F73,
+    0x6F75, 0x6F76, 0x6F79, 0x6F7B, 0x6F7D, 0x6F7E, 0x6F81, 0x6F82,
+    0x6F83, 0x6F85, 0x6F8A, 0x6F8B, 0x6F8F, 0x6F90, 0x6F91, 0x6F92,
+    0x6F93, 0x6F94, 0x6F95, 0x6F96, 0x6F98, 0x6F99, 0x6F9A, 0x6F9B,
+    0x6F9D, 0x6F9E, 0x6F9F, 0x6FA2, 0x6FA3, 0x6FA5, 0x6FA6, 0x6FA8,
+    0x6FAA, 0x6FAB, 0x6FAC, 0x6FAD, 0x6FAF, 0x6FB0, 0x6FB2, 0x6FB4,
+    0x6FB5, 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE,
+    0x6FBF, 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, 0x6FCA, 0x6FCB,
+    0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD3, 0x6FD4, 0x6FD6,
+    0x6FD7, 0x6FD9, 0x6FDA, 0x6FDC, 0x6FDD, 0x6FE2, 0x6FE3, 0x6FE5,
+    0x6FE6, 0x6FE7, 0x6FE8, 0x6FE9, 0x6FEA, 0x6FEC, 0x6FED, 0x6FF2,
+    0x6FF3, 0x6FF4, 0x6FF5, 0x6FF6, 0x6FF7, 0x6FF8, 0x6FF9, 0x6FFB,
+    0x6FFD, 0x6FFF, 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7007,
+    0x7008, 0x700A, 0x700C, 0x700D, 0x700E, 0x7010, 0x7012, 0x7013,
+    0x7014, 0x7016, 0x7017, 0x7019, 0x701C, 0x701E, 0x7021, 0x7022,
+    0x7024, 0x7025, 0x7026, 0x7029, 0x702A, 0x702B, 0x702C, 0x702D,
+    0x702E, 0x702F, 0x7031, 0x7033, 0x7034, 0x7036, 0x7037, 0x7038,
+    0x703A, 0x703B, 0x703C, 0x703D, 0x703F, 0x7040, 0x7041, 0x7042,
+    0x7045, 0x7046, 0x7047, 0x7048, 0x7049, 0x704A, 0x704B, 0x704D,
+    0x704E, 0x7050, 0x7052, 0x7053, 0x7054, 0x7056, 0x7057, 0x7059,
+    0x705A, 0x705B, 0x705C, 0x705F, 0x7060, 0x7061, 0x7062, 0x7065,
+    0x7066, 0x7068, 0x7069, 0x706A, 0x706E, 0x7071, 0x7072, 0x7073,
+    0x7074, 0x7077, 0x7079, 0x707A, 0x707B, 0x707D, 0x7081, 0x7082,
+    0x7083, 0x7084, 0x7086, 0x7087, 0x7088, 0x708B, 0x708C, 0x708D,
+    0x708F, 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709A, 0x709B,
+    0x709E, 0x709F, 0x70A0, 0x70A1, 0x70A2, 0x70A3, 0x70A4, 0x70A5,
+    0x70A6, 0x70A7, 0x70A8, 0x70A9, 0x70AA, 0x70B0, 0x70B2, 0x70B4,
+    0x70B5, 0x70B6, 0x70BA, 0x70BE, 0x70BF, 0x70C4, 0x70C5, 0x70C6,
+    0x70C7, 0x70C9, 0x70CB, 0x70CC, 0x70CD, 0x70CE, 0x70D0, 0x70D1,
+    0x70D2, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D7, 0x70DA, 0x70DC,
+    0x70DD, 0x70DE, 0x70E0, 0x70E1, 0x70E2, 0x70E3, 0x70E5, 0x70EA,
+    0x70EE, 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F5, 0x70F6, 0x70F8,
+    0x70FA, 0x70FB, 0x70FC, 0x70FE, 0x70FF, 0x7100, 0x7101, 0x7102,
+    0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, 0x710B, 0x710C,
+    0x710D, 0x710E, 0x710F, 0x7111, 0x7112, 0x7114, 0x7117, 0x711B,
+    0x711C, 0x711D, 0x711E, 0x711F, 0x7120, 0x7122, 0x7123, 0x7124,
+    0x7125, 0x7127, 0x7128, 0x7129, 0x712A, 0x712B, 0x712C, 0x712D,
+    0x712E, 0x7132, 0x7133, 0x7134, 0x7135, 0x7137, 0x7138, 0x7139,
+    0x713A, 0x713B, 0x713C, 0x713D, 0x713E, 0x713F, 0x7140, 0x7141,
+    0x7142, 0x7143, 0x7144, 0x7146, 0x7147, 0x7148, 0x714B, 0x714D,
+    0x714F, 0x7150, 0x7151, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157,
+    0x7158, 0x7159, 0x715A, 0x715B, 0x715D, 0x715F, 0x7160, 0x7161,
+    0x7163, 0x7165, 0x716A, 0x716B, 0x716D, 0x716F, 0x7170, 0x7171,
+    0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717B, 0x717C, 0x717E,
+    0x717F, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, 0x7187,
+    0x7188, 0x7189, 0x718B, 0x718C, 0x718D, 0x718E, 0x7190, 0x7191,
+    0x7193, 0x7195, 0x7196, 0x719A, 0x719B, 0x719C, 0x719D, 0x719E,
+    0x71A1, 0x71A2, 0x71A3, 0x71A4, 0x71A5, 0x71A6, 0x71A7, 0x71A9,
+    0x71AA, 0x71AB, 0x71AD, 0x71AE, 0x71AF, 0x71B0, 0x71B2, 0x71B4,
+    0x71B6, 0x71B7, 0x71B8, 0x71BA, 0x71BB, 0x71BC, 0x71BD, 0x71BF,
+    0x71C0, 0x71C2, 0x71C4, 0x71C5, 0x71C6, 0x71C7, 0x71C9, 0x71CA,
+    0x71CB, 0x71CC, 0x71CD, 0x71CF, 0x71D0, 0x71D1, 0x71D3, 0x71D6,
+    0x71D7, 0x71D8, 0x71DA, 0x71DB, 0x71DD, 0x71DE, 0x71E1, 0x71E2,
+    0x71E3, 0x71E4, 0x71E8, 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71EF,
+    0x71F0, 0x71F1, 0x71F2, 0x71F3, 0x71F5, 0x71F6, 0x71F7, 0x71F8,
+    0x71FA, 0x71FB, 0x71FD, 0x71FF, 0x7200, 0x7201, 0x7202, 0x7203,
+    0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720A, 0x720B, 0x720C,
+    0x720E, 0x720F, 0x7211, 0x7212, 0x7213, 0x7214, 0x7215, 0x7216,
+    0x7217, 0x7218, 0x7219, 0x721A, 0x721C, 0x721E, 0x721F, 0x7220,
+    0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7229,
+    0x722B, 0x722D, 0x722E, 0x722F, 0x7233, 0x7234, 0x723C, 0x7240,
+    0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724A,
+    0x724B, 0x724E, 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255,
+    0x7257, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, 0x7264, 0x7265,
+    0x7268, 0x726A, 0x726B, 0x726C, 0x726D, 0x7270, 0x7271, 0x7273,
+    0x7274, 0x7276, 0x7277, 0x7278, 0x727B, 0x727C, 0x7282, 0x7283,
+    0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728C, 0x728E, 0x7290,
+    0x7291, 0x7293, 0x7294, 0x7295, 0x7297, 0x7298, 0x7299, 0x729A,
+    0x729B, 0x729C, 0x729D, 0x729E, 0x72A0, 0x72A1, 0x72A3, 0x72A4,
+    0x72A5, 0x72A6, 0x72A8, 0x72A9, 0x72AA, 0x72AB, 0x72AE, 0x72B1,
+    0x72B2, 0x72B3, 0x72B5, 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE,
+    0x72BF, 0x72C5, 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC,
+    0x72CF, 0x72D1, 0x72D3, 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA,
+    0x72DB, 0x72DC, 0x72DD, 0x72DF, 0x72E2, 0x72E3, 0x72E4, 0x72E5,
+    0x72E6, 0x72E7, 0x72EA, 0x72EB, 0x72F5, 0x72F6, 0x72FE, 0x72FF,
+    0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, 0x7309,
+    0x730B, 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312, 0x7314,
+    0x7318, 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324, 0x7326,
+    0x7327, 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333, 0x7335,
+    0x733A, 0x733C, 0x733D, 0x7340, 0x7342, 0x7343, 0x7346, 0x7347,
+    0x7348, 0x7349, 0x734A, 0x734B, 0x734C, 0x734E, 0x734F, 0x7351,
+    0x7353, 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735A, 0x735B,
+    0x735C, 0x735D, 0x735E, 0x735F, 0x7361, 0x7362, 0x7363, 0x7364,
+    0x7365, 0x7366, 0x7367, 0x7369, 0x736E, 0x7371, 0x7373, 0x7374,
+    0x7376, 0x7379, 0x737D, 0x737F, 0x7381, 0x7382, 0x7383, 0x7385,
+    0x7386, 0x7388, 0x738A, 0x738C, 0x738D, 0x738F, 0x7390, 0x7392,
+    0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, 0x739A, 0x739C,
+    0x739D, 0x739E, 0x73A0, 0x73A1, 0x73A3, 0x73A4, 0x73A5, 0x73A6,
+    0x73A7, 0x73A8, 0x73AA, 0x73AC, 0x73AD, 0x73B1, 0x73B4, 0x73B5,
+    0x73B6, 0x73B8, 0x73B9, 0x73BC, 0x73BD, 0x73BE, 0x73BF, 0x73C1,
+    0x73C3, 0x73C4, 0x73C5, 0x73C6, 0x73C7, 0x73CB, 0x73CC, 0x73CE,
+    0x73D2, 0x73D3, 0x73D4, 0x73D5, 0x73D6, 0x73D7, 0x73D8, 0x73DA,
+    0x73DB, 0x73DC, 0x73DD, 0x73DF, 0x73E1, 0x73E2, 0x73E3, 0x73E4,
+    0x73E6, 0x73E8, 0x73EA, 0x73EB, 0x73EC, 0x73EE, 0x73EF, 0x73F0,
+    0x73F1, 0x73F3, 0x73F4, 0x73F5, 0x73F6, 0x73F7, 0x73F8, 0x73F9,
+    0x73FA, 0x73FB, 0x73FC, 0x73FD, 0x73FF, 0x7400, 0x7401, 0x7402,
+    0x7404, 0x7407, 0x7408, 0x740B, 0x740C, 0x740D, 0x740E, 0x7411,
+    0x7412, 0x7413, 0x7414, 0x7415, 0x7416, 0x7417, 0x7418, 0x7419,
+    0x741C, 0x741D, 0x741E, 0x741F, 0x7420, 0x7421, 0x7423, 0x7424,
+    0x7427, 0x7429, 0x742B, 0x742D, 0x742F, 0x7431, 0x7432, 0x7437,
+    0x7438, 0x7439, 0x743A, 0x743B, 0x743D, 0x743E, 0x7440, 0x7442,
+    0x7443, 0x7444, 0x7445, 0x7446, 0x7447, 0x7448, 0x7449, 0x744A,
+    0x744C, 0x744D, 0x744E, 0x744F, 0x7450, 0x7451, 0x7452, 0x7453,
+    0x7454, 0x7456, 0x7458, 0x745D, 0x7460, 0x7461, 0x7462, 0x7464,
+    0x7465, 0x7466, 0x7467, 0x7468, 0x746B, 0x746C, 0x746E, 0x746F,
+    0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, 0x747A,
+    0x747B, 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486,
+    0x7488, 0x748A, 0x748C, 0x748D, 0x748F, 0x7491, 0x7492, 0x7493,
+    0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749A, 0x749B,
+    0x749D, 0x749F, 0x74A0, 0x74A1, 0x74A2, 0x74A4, 0x74A5, 0x74AA,
+    0x74AB, 0x74AC, 0x74AD, 0x74AE, 0x74AF, 0x74B1, 0x74B2, 0x74B3,
+    0x74B4, 0x74B5, 0x74B6, 0x74B7, 0x74B8, 0x74B9, 0x74BB, 0x74BC,
+    0x74BE, 0x74BF, 0x74C0, 0x74C1, 0x74C2, 0x74C3, 0x74C4, 0x74C5,
+    0x74C6, 0x74C7, 0x74C8, 0x74C9, 0x74CB, 0x74CC, 0x74CD, 0x74CE,
+    0x74D0, 0x74D1, 0x74D3, 0x74D5, 0x74D6, 0x74D7, 0x74D8, 0x74D9,
+    0x74DB, 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7, 0x74E8, 0x74E9,
+    0x74EA, 0x74EB, 0x74EC, 0x74ED, 0x74F0, 0x74F1, 0x74F2, 0x74F3,
+    0x74F5, 0x74F8, 0x74F9, 0x74FA, 0x74FB, 0x74FC, 0x74FD, 0x74FE,
+    0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, 0x7508,
+    0x7509, 0x750A, 0x750B, 0x750E, 0x7510, 0x7512, 0x7514, 0x7515,
+    0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520, 0x7521, 0x7522,
+    0x7524, 0x7526, 0x7527, 0x752A, 0x752E, 0x7534, 0x7536, 0x7539,
+    0x753C, 0x753D, 0x753F, 0x7541, 0x7542, 0x7543, 0x7544, 0x7546,
+    0x7547, 0x7549, 0x754A, 0x754D, 0x7550, 0x7551, 0x7552, 0x7553,
+    0x7555, 0x7556, 0x7557, 0x7558, 0x755E, 0x755F, 0x7560, 0x7561,
+    0x7563, 0x7564, 0x7567, 0x7568, 0x7569, 0x756C, 0x756D, 0x756E,
+    0x756F, 0x7570, 0x7571, 0x7573, 0x7575, 0x7577, 0x757A, 0x757B,
+    0x757C, 0x757D, 0x757E, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585,
+    0x7588, 0x7589, 0x758A, 0x758C, 0x758D, 0x758E, 0x7590, 0x7593,
+    0x7595, 0x7598, 0x759B, 0x759C, 0x759E, 0x75A2, 0x75A6, 0x75A7,
+    0x75A8, 0x75A9, 0x75AA, 0x75AD, 0x75B6, 0x75B7, 0x75BA, 0x75BB,
+    0x75BF, 0x75C0, 0x75C1, 0x75C6, 0x75CB, 0x75CC, 0x75CE, 0x75CF,
+    0x75D0, 0x75D1, 0x75D3, 0x75D7, 0x75DA, 0x75DC, 0x75DD, 0x75DF,
+    0x75E0, 0x75E1, 0x75E5, 0x75E9, 0x75EC, 0x75ED, 0x75EE, 0x75EF,
+    0x75F2, 0x75F3, 0x75F5, 0x75F6, 0x75F7, 0x75F8, 0x75FA, 0x75FB,
+    0x75FD, 0x75FE, 0x7604, 0x7606, 0x7607, 0x7608, 0x7609, 0x760E,
+    0x760F, 0x7611, 0x7612, 0x7613, 0x7614, 0x7616, 0x761A, 0x761C,
+    0x761D, 0x7623, 0x7628, 0x762C, 0x762E, 0x762F, 0x7631, 0x7632,
+    0x7636, 0x7637, 0x7639, 0x763A, 0x763D, 0x7641, 0x7644, 0x7645,
+    0x7648, 0x764A, 0x764B, 0x764E, 0x764F, 0x7650, 0x7651, 0x7652,
+    0x7653, 0x7655, 0x7657, 0x7659, 0x765A, 0x765B, 0x765D, 0x7660,
+    0x7661, 0x7666, 0x7668, 0x766A, 0x7673, 0x7674, 0x7675, 0x7676,
+    0x7677, 0x7679, 0x767A, 0x767F, 0x7680, 0x7681, 0x7683, 0x7685,
+    0x7689, 0x768A, 0x768C, 0x768D, 0x768F, 0x7690, 0x7692, 0x7694,
+    0x7695, 0x7697, 0x7698, 0x769B, 0x769C, 0x769D, 0x769E, 0x769F,
+    0x76A0, 0x76A1, 0x76A2, 0x76A3, 0x76A5, 0x76A6, 0x76A7, 0x76A8,
+    0x76A9, 0x76AA, 0x76AB, 0x76AC, 0x76AD, 0x76AF, 0x76B0, 0x76B3,
+    0x76B5, 0x76B6, 0x76B7, 0x76B9, 0x76BB, 0x76BC, 0x76BD, 0x76BE,
+    0x76C0, 0x76C1, 0x76C3, 0x76C4, 0x76C7, 0x76C9, 0x76CB, 0x76CC,
+    0x76D3, 0x76D5, 0x76D9, 0x76DA, 0x76DC, 0x76DD, 0x76E0, 0x76E2,
+    0x76E6, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC, 0x76ED, 0x76F0,
+    0x76F3, 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB, 0x76FD, 0x76FF,
+    0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770A, 0x770C, 0x770E,
+    0x770F, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, 0x7715, 0x7716,
+    0x7717, 0x7718, 0x771B, 0x771C, 0x771D, 0x771E, 0x7721, 0x7723,
+    0x7724, 0x7725, 0x7727, 0x772A, 0x772B, 0x772C, 0x772E, 0x7730,
+    0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773B, 0x773D, 0x773E,
+    0x773F, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, 0x7749, 0x774A,
+    0x774B, 0x774C, 0x774D, 0x774E, 0x7752, 0x7753, 0x7754, 0x7755,
+    0x7756, 0x7757, 0x7758, 0x7759, 0x775C, 0x775D, 0x775F, 0x7760,
+    0x7764, 0x7767, 0x7769, 0x776A, 0x776D, 0x776E, 0x776F, 0x7770,
+    0x7771, 0x7772, 0x7773, 0x7774, 0x7775, 0x7776, 0x7777, 0x7778,
+    0x777A, 0x777B, 0x777C, 0x7781, 0x7782, 0x7783, 0x7786, 0x7787,
+    0x7788, 0x7789, 0x778A, 0x778B, 0x778F, 0x7790, 0x7793, 0x7794,
+    0x7795, 0x7796, 0x7797, 0x7799, 0x779A, 0x779B, 0x779C, 0x779D,
+    0x77A1, 0x77A3, 0x77A4, 0x77A6, 0x77A8, 0x77AB, 0x77AE, 0x77AF,
+    0x77B1, 0x77B2, 0x77B4, 0x77B6, 0x77B7, 0x77B8, 0x77B9, 0x77BA,
+    0x77BE, 0x77C0, 0x77C1, 0x77C2, 0x77C3, 0x77C4, 0x77C5, 0x77C6,
+    0x77C8, 0x77C9, 0x77CA, 0x77CB, 0x77CC, 0x77CE, 0x77CF, 0x77D0,
+    0x77D1, 0x77D2, 0x77D3, 0x77D4, 0x77D5, 0x77D6, 0x77D8, 0x77D9,
+    0x77DD, 0x77DE, 0x77DF, 0x77E0, 0x77E1, 0x77E4, 0x77E6, 0x77E8,
+    0x77EA, 0x77F0, 0x77F1, 0x77F2, 0x77F4, 0x77F5, 0x77F7, 0x77F9,
+    0x77FA, 0x77FB, 0x77FC, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807,
+    0x7808, 0x780A, 0x780B, 0x780E, 0x780F, 0x7810, 0x7813, 0x7815,
+    0x7819, 0x781B, 0x781E, 0x7820, 0x7821, 0x7822, 0x7824, 0x7828,
+    0x782A, 0x782B, 0x782E, 0x782F, 0x7831, 0x7832, 0x7833, 0x7835,
+    0x7836, 0x783D, 0x783F, 0x7841, 0x7842, 0x7844, 0x7846, 0x7848,
+    0x7849, 0x784A, 0x784B, 0x784D, 0x784F, 0x7851, 0x7853, 0x7854,
+    0x7858, 0x7859, 0x785A, 0x785B, 0x785C, 0x785E, 0x785F, 0x7860,
+    0x7861, 0x7862, 0x7863, 0x7865, 0x7866, 0x7867, 0x7869, 0x7870,
+    0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879,
+    0x787A, 0x787B, 0x787D, 0x787E, 0x787F, 0x7880, 0x7881, 0x7882,
+    0x7883, 0x7884, 0x7885, 0x7886, 0x7888, 0x788A, 0x788B, 0x788F,
+    0x7890, 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789D, 0x789E,
+    0x78A0, 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78AA, 0x78AB, 0x78AC,
+    0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, 0x78BB, 0x78BD, 0x78BF,
+    0x78C0, 0x78C2, 0x78C3, 0x78C4, 0x78C6, 0x78C7, 0x78C8, 0x78CC,
+    0x78CD, 0x78CE, 0x78CF, 0x78D1, 0x78D2, 0x78D3, 0x78D6, 0x78D7,
+    0x78D8, 0x78DB, 0x78DC, 0x78DD, 0x78DE, 0x78DF, 0x78E0, 0x78E1,
+    0x78E2, 0x78E4, 0x78E5, 0x78E6, 0x78E9, 0x78EA, 0x78EB, 0x78ED,
+    0x78EE, 0x78F0, 0x78F1, 0x78F3, 0x78F5, 0x78F6, 0x78F8, 0x78F9,
+    0x78FB, 0x78FC, 0x78FE, 0x78FF, 0x7900, 0x7902, 0x7903, 0x7904,
+    0x7906, 0x7907, 0x7908, 0x7909, 0x790A, 0x790B, 0x790C, 0x790D,
+    0x790F, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, 0x7916, 0x7917,
+    0x7918, 0x791A, 0x791B, 0x791C, 0x791D, 0x791F, 0x7920, 0x7921,
+    0x7922, 0x7923, 0x7925, 0x7927, 0x7928, 0x7929, 0x792D, 0x792E,
+    0x792F, 0x7930, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938,
+    0x7939, 0x793D, 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947,
+    0x794A, 0x794B, 0x794C, 0x794D, 0x794E, 0x794F, 0x7950, 0x7951,
+    0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0x7964,
+    0x7966, 0x7969, 0x796A, 0x796B, 0x796C, 0x796E, 0x7970, 0x7971,
+    0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797B, 0x797C,
+    0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988,
+    0x7989, 0x798B, 0x798C, 0x7990, 0x7991, 0x7992, 0x7993, 0x7994,
+    0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799B, 0x799C, 0x799D,
+    0x799E, 0x799F, 0x79A0, 0x79A1, 0x79A2, 0x79A3, 0x79A4, 0x79A5,
+    0x79A8, 0x79A9, 0x79AB, 0x79AC, 0x79AD, 0x79AF, 0x79B2, 0x79B4,
+    0x79B5, 0x79B6, 0x79B7, 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4,
+    0x79C5, 0x79C7, 0x79C8, 0x79CA, 0x79CC, 0x79CE, 0x79CF, 0x79D0,
+    0x79D3, 0x79D4, 0x79D6, 0x79D7, 0x79D9, 0x79DA, 0x79DB, 0x79DC,
+    0x79DD, 0x79DE, 0x79E0, 0x79E1, 0x79E2, 0x79E5, 0x79E8, 0x79EA,
+    0x79EC, 0x79EE, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6,
+    0x79F7, 0x79F9, 0x79FA, 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04,
+    0x7A05, 0x7A07, 0x7A08, 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10,
+    0x7A11, 0x7A12, 0x7A13, 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B,
+    0x7A1C, 0x7A1D, 0x7A1F, 0x7A21, 0x7A22, 0x7A24, 0x7A25, 0x7A26,
+    0x7A27, 0x7A28, 0x7A29, 0x7A2A, 0x7A2B, 0x7A2C, 0x7A2D, 0x7A2F,
+    0x7A30, 0x7A32, 0x7A34, 0x7A35, 0x7A36, 0x7A38, 0x7A3A, 0x7A3E,
+    0x7A41, 0x7A42, 0x7A43, 0x7A44, 0x7A45, 0x7A47, 0x7A48, 0x7A49,
+    0x7A4A, 0x7A4B, 0x7A4F, 0x7A50, 0x7A52, 0x7A53, 0x7A54, 0x7A55,
+    0x7A56, 0x7A58, 0x7A59, 0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, 0x7A5E,
+    0x7A5F, 0x7A60, 0x7A63, 0x7A64, 0x7A65, 0x7A66, 0x7A67, 0x7A68,
+    0x7A6A, 0x7A6C, 0x7A6D, 0x7A6E, 0x7A6F, 0x7A71, 0x7A72, 0x7A73,
+    0x7A75, 0x7A7B, 0x7A7C, 0x7A7D, 0x7A7E, 0x7A82, 0x7A85, 0x7A87,
+    0x7A89, 0x7A8A, 0x7A8B, 0x7A8C, 0x7A8E, 0x7A8F, 0x7A90, 0x7A93,
+    0x7A94, 0x7A99, 0x7A9A, 0x7A9B, 0x7A9E, 0x7AA1, 0x7AA2, 0x7AA3,
+    0x7AA4, 0x7AA7, 0x7AAB, 0x7AAF, 0x7AB0, 0x7AB1, 0x7AB2, 0x7AB4,
+    0x7AB5, 0x7AB7, 0x7AB8, 0x7AB9, 0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE,
+    0x7AC0, 0x7AC1, 0x7AC2, 0x7AC3, 0x7AC6, 0x7AC9, 0x7ACC, 0x7ACD,
+    0x7ACE, 0x7ACF, 0x7AD0, 0x7AD1, 0x7AD2, 0x7AD3, 0x7AD4, 0x7AD5,
+    0x7AD7, 0x7AD8, 0x7ADA, 0x7ADB, 0x7ADC, 0x7ADD, 0x7AE1, 0x7AE2,
+    0x7AE4, 0x7AE7, 0x7AE8, 0x7AE9, 0x7AEB, 0x7AEC, 0x7AEE, 0x7AF0,
+    0x7AF1, 0x7AF2, 0x7AF3, 0x7AF4, 0x7AF5, 0x7AF7, 0x7AF8, 0x7AFB,
+    0x7AFC, 0x7AFE, 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09,
+    0x7B0C, 0x7B0D, 0x7B0E, 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17,
+    0x7B18, 0x7B1A, 0x7B1C, 0x7B1D, 0x7B1F, 0x7B21, 0x7B22, 0x7B23,
+    0x7B27, 0x7B29, 0x7B2D, 0x7B2F, 0x7B30, 0x7B32, 0x7B34, 0x7B35,
+    0x7B36, 0x7B37, 0x7B39, 0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41,
+    0x7B42, 0x7B43, 0x7B44, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, 0x7B53,
+    0x7B55, 0x7B57, 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, 0x7B63,
+    0x7B64, 0x7B65, 0x7B66, 0x7B68, 0x7B69, 0x7B6A, 0x7B6B, 0x7B6C,
+    0x7B6D, 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A,
+    0x7B7C, 0x7B7D, 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86,
+    0x7B87, 0x7B88, 0x7B89, 0x7B8A, 0x7B8C, 0x7B8E, 0x7B8F, 0x7B91,
+    0x7B92, 0x7B93, 0x7B96, 0x7B98, 0x7B99, 0x7B9A, 0x7B9B, 0x7B9E,
+    0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, 0x7BAE, 0x7BAF, 0x7BB0,
+    0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, 0x7BBA, 0x7BBB,
+    0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC2, 0x7BC3, 0x7BC5, 0x7BC8,
+    0x7BCA, 0x7BCD, 0x7BCE, 0x7BCF, 0x7BD0, 0x7BD2, 0x7BD4, 0x7BD5,
+    0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB, 0x7BDC, 0x7BDE, 0x7BDF, 0x7BE0,
+    0x7BE2, 0x7BE3, 0x7BE7, 0x7BE8, 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF,
+    0x7BF0, 0x7BF2, 0x7BF4, 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA,
+    0x7BFB, 0x7BFD, 0x7BFF, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05,
+    0x7C06, 0x7C08, 0x7C09, 0x7C0A, 0x7C0E, 0x7C10, 0x7C11, 0x7C12,
+    0x7C13, 0x7C14, 0x7C15, 0x7C17, 0x7C18, 0x7C19, 0x7C1A, 0x7C1B,
+    0x7C1C, 0x7C1D, 0x7C20, 0x7C22, 0x7C24, 0x7C25, 0x7C28, 0x7C29,
+    0x7C2C, 0x7C2D, 0x7C2E, 0x7C2F, 0x7C30, 0x7C31, 0x7C32, 0x7C33,
+    0x7C34, 0x7C35, 0x7C36, 0x7C37, 0x7C39, 0x7C3A, 0x7C3B, 0x7C3C,
+    0x7C42, 0x7C44, 0x7C45, 0x7C46, 0x7C47, 0x7C48, 0x7C49, 0x7C4A,
+    0x7C4B, 0x7C4E, 0x7C4F, 0x7C50, 0x7C51, 0x7C52, 0x7C53, 0x7C54,
+    0x7C55, 0x7C56, 0x7C57, 0x7C58, 0x7C59, 0x7C5A, 0x7C5B, 0x7C5D,
+    0x7C5E, 0x7C61, 0x7C62, 0x7C63, 0x7C65, 0x7C66, 0x7C67, 0x7C68,
+    0x7C6B, 0x7C6D, 0x7C6F, 0x7C70, 0x7C71, 0x7C75, 0x7C76, 0x7C77,
+    0x7C78, 0x7C79, 0x7C7A, 0x7C7E, 0x7C7F, 0x7C80, 0x7C81, 0x7C82,
+    0x7C83, 0x7C84, 0x7C85, 0x7C86, 0x7C87, 0x7C88, 0x7C8A, 0x7C8B,
+    0x7C8C, 0x7C8D, 0x7C8E, 0x7C8F, 0x7C90, 0x7C93, 0x7C94, 0x7C96,
+    0x7C99, 0x7C9A, 0x7C9B, 0x7CA0, 0x7CA1, 0x7CA3, 0x7CA6, 0x7CA7,
+    0x7CA8, 0x7CA9, 0x7CAB, 0x7CAC, 0x7CAD, 0x7CAF, 0x7CB0, 0x7CB4,
+    0x7CB5, 0x7CB6, 0x7CB7, 0x7CB8, 0x7CBA, 0x7CBB, 0x7CBF, 0x7CC0,
+    0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, 0x7CC9, 0x7CCB, 0x7CCE, 0x7CCF,
+    0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, 0x7CD4, 0x7CD8, 0x7CDA, 0x7CDB,
+    0x7CE1, 0x7CE2, 0x7CE3, 0x7CE4, 0x7CE5, 0x7CE6, 0x7CE9, 0x7CEA,
+    0x7CEB, 0x7CEC, 0x7CED, 0x7CEE, 0x7CF1, 0x7CF3, 0x7CF5, 0x7CF7,
+    0x7CFA, 0x7CFC, 0x7CFD, 0x7CFF, 0x7D01, 0x7D03, 0x7D0C, 0x7D0E,
+    0x7D0F, 0x7D11, 0x7D12, 0x7D16, 0x7D18, 0x7D1D, 0x7D1E, 0x7D1F,
+    0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, 0x7D2C,
+    0x7D2D, 0x7D2E, 0x7D34, 0x7D35, 0x7D36, 0x7D37, 0x7D38, 0x7D3B,
+    0x7D3D, 0x7D3E, 0x7D41, 0x7D43, 0x7D45, 0x7D47, 0x7D48, 0x7D49,
+    0x7D4A, 0x7D4B, 0x7D4C, 0x7D4D, 0x7D4F, 0x7D51, 0x7D52, 0x7D53,
+    0x7D54, 0x7D55, 0x7D56, 0x7D57, 0x7D58, 0x7D59, 0x7D5A, 0x7D5B,
+    0x7D5C, 0x7D5F, 0x7D60, 0x7D63, 0x7D64, 0x7D65, 0x7D67, 0x7D69,
+    0x7D6A, 0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, 0x7D70, 0x7D74, 0x7D75,
+    0x7D78, 0x7D7A, 0x7D7B, 0x7D7C, 0x7D7D, 0x7D7E, 0x7D7F, 0x7D80,
+    0x7D82, 0x7D84, 0x7D85, 0x7D87, 0x7D8A, 0x7D8B, 0x7D8C, 0x7D8D,
+    0x7D8E, 0x7D90, 0x7D91, 0x7D92, 0x7D94, 0x7D95, 0x7D96, 0x7D97,
+    0x7D98, 0x7D99, 0x7D9A, 0x7D9B, 0x7D9D, 0x7D9F, 0x7DA0, 0x7DA1,
+    0x7DA4, 0x7DA5, 0x7DA7, 0x7DA8, 0x7DA9, 0x7DAA, 0x7DAF, 0x7DB5,
+    0x7DB6, 0x7DB7, 0x7DBC, 0x7DC0, 0x7DC1, 0x7DC2, 0x7DC3, 0x7DC5,
+    0x7DC6, 0x7DC8, 0x7DC9, 0x7DCC, 0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0,
+    0x7DD3, 0x7DD5, 0x7DD6, 0x7DDA, 0x7DDB, 0x7DDC, 0x7DDF, 0x7DE2,
+    0x7DE4, 0x7DE5, 0x7DE7, 0x7DEA, 0x7DEB, 0x7DED, 0x7DEE, 0x7DF0,
+    0x7DF3, 0x7DF5, 0x7DF7, 0x7DF8, 0x7DFA, 0x7DFC, 0x7DFD, 0x7DFE,
+    0x7DFF, 0x7E00, 0x7E01, 0x7E02, 0x7E03, 0x7E04, 0x7E05, 0x7E06,
+    0x7E07, 0x7E0C, 0x7E0D, 0x7E0E, 0x7E0F, 0x7E12, 0x7E13, 0x7E14,
+    0x7E15, 0x7E16, 0x7E17, 0x7E18, 0x7E19, 0x7E1A, 0x7E1C, 0x7E20,
+    0x7E21, 0x7E22, 0x7E24, 0x7E25, 0x7E26, 0x7E28, 0x7E29, 0x7E2A,
+    0x7E2C, 0x7E2F, 0x7E30, 0x7E33, 0x7E38, 0x7E3A, 0x7E3C, 0x7E3F,
+    0x7E40, 0x7E42, 0x7E43, 0x7E44, 0x7E48, 0x7E49, 0x7E4A, 0x7E4B,
+    0x7E4C, 0x7E4D, 0x7E4E, 0x7E4F, 0x7E50, 0x7E51, 0x7E53, 0x7E56,
+    0x7E57, 0x7E58, 0x7E59, 0x7E5B, 0x7E5C, 0x7E5D, 0x7E5F, 0x7E60,
+    0x7E61, 0x7E63, 0x7E64, 0x7E65, 0x7E66, 0x7E67, 0x7E68, 0x7E6C,
+    0x7E71, 0x7E72, 0x7E74, 0x7E75, 0x7E76, 0x7E77, 0x7E78, 0x7E7A,
+    0x7E7B, 0x7E7F, 0x7E80, 0x7E81, 0x7E83, 0x7E84, 0x7E85, 0x7E86,
+    0x7E87, 0x7E89, 0x7E8B, 0x7E8E, 0x7E90, 0x7E91, 0x7E92, 0x7E95,
+    0x7E97, 0x7E99, 0x7E9A, 0x7E9D, 0x7E9E, 0x7EAE, 0x7EB4, 0x7EBB,
+    0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, 0x7EF9, 0x7F0A, 0x7F10, 0x7F1E,
+    0x7F37, 0x7F39, 0x7F3B, 0x7F3C, 0x7F3D, 0x7F3E, 0x7F3F, 0x7F40,
+    0x7F41, 0x7F43, 0x7F46, 0x7F47, 0x7F48, 0x7F49, 0x7F4A, 0x7F4B,
+    0x7F4D, 0x7F4F, 0x7F52, 0x7F53, 0x7F56, 0x7F59, 0x7F5B, 0x7F5C,
+    0x7F5D, 0x7F5E, 0x7F60, 0x7F63, 0x7F64, 0x7F65, 0x7F66, 0x7F67,
+    0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, 0x7F73, 0x7F75, 0x7F76, 0x7F78,
+    0x7F7A, 0x7F7B, 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83,
+    0x7F84, 0x7F87, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, 0x7F91,
+    0x7F92, 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99, 0x7F9B,
+    0x7F9C, 0x7FA0, 0x7FA2, 0x7FA3, 0x7FA6, 0x7FA8, 0x7FAA, 0x7FAB,
+    0x7FAC, 0x7FAD, 0x7FAE, 0x7FB1, 0x7FB3, 0x7FB4, 0x7FB5, 0x7FB6,
+    0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE, 0x7FC0, 0x7FC2, 0x7FC3, 0x7FC4,
+    0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9, 0x7FCB, 0x7FCD, 0x7FCF, 0x7FD0,
+    0x7FD1, 0x7FD3, 0x7FD6, 0x7FD7, 0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC,
+    0x7FDD, 0x7FDE, 0x7FE2, 0x7FE3, 0x7FE4, 0x7FE7, 0x7FE8, 0x7FEA,
+    0x7FEB, 0x7FEC, 0x7FED, 0x7FEF, 0x7FF2, 0x7FF4, 0x7FF5, 0x7FF6,
+    0x7FF7, 0x7FF8, 0x7FFA, 0x7FFD, 0x7FFE, 0x7FFF, 0x8002, 0x8007,
+    0x8008, 0x8009, 0x800A, 0x800E, 0x800F, 0x8011, 0x8013, 0x801A,
+    0x801B, 0x801D, 0x801E, 0x801F, 0x8021, 0x8023, 0x8024, 0x802B,
+    0x802D, 0x802F, 0x8030, 0x8032, 0x8034, 0x8039, 0x803A, 0x803C,
+    0x803E, 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049,
+    0x804E, 0x804F, 0x8050, 0x8051, 0x8053, 0x8055, 0x8057, 0x8059,
+    0x805B, 0x805C, 0x805D, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063,
+    0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806B, 0x806C, 0x806D,
+    0x806E, 0x8074, 0x8078, 0x807A, 0x807B, 0x807C, 0x8081, 0x8082,
+    0x8088, 0x808A, 0x808D, 0x808E, 0x808F, 0x8090, 0x8091, 0x8092,
+    0x8094, 0x8095, 0x8097, 0x8099, 0x809E, 0x80A3, 0x80A6, 0x80A7,
+    0x80A8, 0x80AC, 0x80B0, 0x80B3, 0x80B5, 0x80B6, 0x80B8, 0x80B9,
+    0x80BB, 0x80C5, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x80CB, 0x80CF,
+    0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x80D4, 0x80D5, 0x80D8, 0x80DF,
+    0x80E0, 0x80E2, 0x80E3, 0x80E6, 0x80EE, 0x80F5, 0x80F7, 0x80F9,
+    0x80FB, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8103, 0x8104, 0x8107,
+    0x8108, 0x810B, 0x810C, 0x8115, 0x8117, 0x8119, 0x811C, 0x811D,
+    0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126,
+    0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812D, 0x812E, 0x8130,
+    0x8133, 0x8134, 0x8135, 0x8137, 0x813A, 0x813B, 0x813C, 0x813D,
+    0x813F, 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147,
+    0x8149, 0x814D, 0x814F, 0x8152, 0x8157, 0x8158, 0x815B, 0x815C,
+    0x815D, 0x815E, 0x815F, 0x8162, 0x8163, 0x8164, 0x8168, 0x816A,
+    0x816C, 0x816F, 0x8172, 0x8173, 0x8175, 0x8176, 0x8177, 0x8181,
+    0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8189, 0x818B, 0x818C,
+    0x818D, 0x818E, 0x8190, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196,
+    0x8197, 0x8199, 0x819E, 0x819F, 0x81A1, 0x81A2, 0x81A4, 0x81A5,
+    0x81A7, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, 0x81B1,
+    0x81B2, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0x81BC,
+    0x81C4, 0x81C5, 0x81C7, 0x81C8, 0x81CB, 0x81CE, 0x81D0, 0x81D1,
+    0x81D2, 0x81D3, 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D9, 0x81DB,
+    0x81DC, 0x81DD, 0x81DE, 0x81E1, 0x81E2, 0x81E4, 0x81E5, 0x81E6,
+    0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0, 0x81F1, 0x81F2, 0x81F5,
+    0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FD, 0x81FF, 0x8203, 0x820B,
+    0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218,
+    0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227,
+    0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F, 0x8240,
+    0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A, 0x824C,
+    0x824D, 0x824E, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255,
+    0x8256, 0x8257, 0x825B, 0x825C, 0x825D, 0x825E, 0x8260, 0x8261,
+    0x8262, 0x8263, 0x8265, 0x8267, 0x8269, 0x826A, 0x826C, 0x826D,
+    0x8275, 0x8276, 0x8278, 0x827B, 0x827C, 0x8280, 0x8281, 0x8283,
+    0x8285, 0x8286, 0x8287, 0x8289, 0x828C, 0x8290, 0x8293, 0x8294,
+    0x8295, 0x8296, 0x829A, 0x829B, 0x829E, 0x82A0, 0x82A2, 0x82A3,
+    0x82A7, 0x82B2, 0x82B5, 0x82B6, 0x82BA, 0x82BC, 0x82BF, 0x82C0,
+    0x82C2, 0x82C3, 0x82C5, 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9,
+    0x82DA, 0x82DD, 0x82E2, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED,
+    0x82EE, 0x82F0, 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8, 0x82FA,
+    0x82FC, 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x830A, 0x830B, 0x830D,
+    0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831D, 0x831E,
+    0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326,
+    0x8329, 0x832A, 0x832E, 0x8330, 0x8332, 0x8337, 0x833B, 0x833D,
+    0x833E, 0x833F, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834A,
+    0x834B, 0x834C, 0x834D, 0x834E, 0x8353, 0x8355, 0x8356, 0x8357,
+    0x8358, 0x8359, 0x835D, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373,
+    0x8374, 0x8375, 0x8376, 0x8379, 0x837A, 0x837E, 0x837F, 0x8380,
+    0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838B, 0x838C,
+    0x838D, 0x838F, 0x8390, 0x8391, 0x8394, 0x8395, 0x8397, 0x8399,
+    0x839A, 0x839D, 0x839F, 0x83A1, 0x83A3, 0x83A4, 0x83A5, 0x83A6,
+    0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B5, 0x83BB, 0x83BE, 0x83BF,
+    0x83C2, 0x83C3, 0x83C4, 0x83C6, 0x83C8, 0x83C9, 0x83CB, 0x83CD,
+    0x83CE, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D5, 0x83D7, 0x83D9,
+    0x83DA, 0x83DB, 0x83DE, 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7,
+    0x83E8, 0x83EB, 0x83EC, 0x83ED, 0x83EE, 0x83F3, 0x83F4, 0x83F5,
+    0x83F6, 0x83F7, 0x83FA, 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400,
+    0x8402, 0x8405, 0x8408, 0x8409, 0x8410, 0x8412, 0x8413, 0x8414,
+    0x8415, 0x8416, 0x8417, 0x8419, 0x841A, 0x841B, 0x841E, 0x841F,
+    0x8420, 0x8421, 0x8422, 0x8423, 0x8429, 0x842A, 0x842B, 0x842D,
+    0x842E, 0x842F, 0x8430, 0x8432, 0x8433, 0x8434, 0x8436, 0x8437,
+    0x8439, 0x843A, 0x843B, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442,
+    0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x844A, 0x844B, 0x844C,
+    0x844D, 0x844E, 0x844F, 0x8450, 0x8453, 0x8454, 0x8455, 0x8456,
+    0x8458, 0x845D, 0x845E, 0x845F, 0x8460, 0x8462, 0x8465, 0x8467,
+    0x8468, 0x846A, 0x846E, 0x8470, 0x8472, 0x8474, 0x8479, 0x847B,
+    0x847C, 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484,
+    0x8485, 0x8486, 0x848A, 0x848D, 0x848F, 0x8490, 0x8491, 0x8492,
+    0x8495, 0x8496, 0x8498, 0x849A, 0x849B, 0x849D, 0x849E, 0x849F,
+    0x84A0, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, 0x84A8,
+    0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84B0, 0x84B1,
+    0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BE, 0x84C2, 0x84C3,
+    0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CC, 0x84CE, 0x84CF, 0x84D2,
+    0x84D4, 0x84D5, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0x84DB, 0x84DC,
+    0x84DE, 0x84E1, 0x84E2, 0x84E4, 0x84E7, 0x84E8, 0x84E9, 0x84EA,
+    0x84EB, 0x84ED, 0x84F1, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6,
+    0x84F7, 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x84FE, 0x8500, 0x8501,
+    0x8502, 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509,
+    0x850A, 0x850B, 0x850D, 0x850E, 0x850F, 0x8510, 0x8512, 0x8515,
+    0x8516, 0x8518, 0x8519, 0x851B, 0x851C, 0x851D, 0x8520, 0x8522,
+    0x8524, 0x8525, 0x8527, 0x8528, 0x8529, 0x852A, 0x852E, 0x852F,
+    0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, 0x8536, 0x853E,
+    0x853F, 0x8540, 0x8542, 0x8544, 0x8545, 0x8547, 0x854B, 0x854C,
+    0x854D, 0x854F, 0x8550, 0x8551, 0x8554, 0x8557, 0x855A, 0x855B,
+    0x855C, 0x855D, 0x855F, 0x8560, 0x8561, 0x8563, 0x8565, 0x8566,
+    0x8567, 0x856B, 0x856C, 0x856E, 0x856F, 0x8570, 0x8571, 0x8573,
+    0x8575, 0x8576, 0x8578, 0x857C, 0x857D, 0x857F, 0x8580, 0x8581,
+    0x8582, 0x8583, 0x8586, 0x8589, 0x858B, 0x858D, 0x858E, 0x8590,
+    0x8592, 0x8593, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859A,
+    0x859D, 0x859E, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A5, 0x85A7,
+    0x85AB, 0x85AC, 0x85AD, 0x85B1, 0x85B2, 0x85B3, 0x85B4, 0x85B5,
+    0x85B6, 0x85B8, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0,
+    0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85CA,
+    0x85CB, 0x85CC, 0x85D1, 0x85D2, 0x85D4, 0x85D6, 0x85D7, 0x85D8,
+    0x85D9, 0x85DA, 0x85DB, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2,
+    0x85E3, 0x85E6, 0x85E7, 0x85E8, 0x85EB, 0x85EC, 0x85ED, 0x85EE,
+    0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F5, 0x85F7, 0x85F8,
+    0x85FC, 0x85FD, 0x85FE, 0x8600, 0x8601, 0x8602, 0x8603, 0x8608,
+    0x8609, 0x860A, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8612,
+    0x8613, 0x8614, 0x8615, 0x8617, 0x8618, 0x8619, 0x861B, 0x861C,
+    0x861D, 0x861F, 0x8620, 0x8621, 0x8623, 0x8624, 0x8625, 0x8626,
+    0x8628, 0x862A, 0x862B, 0x862C, 0x862E, 0x862F, 0x8630, 0x8631,
+    0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8639, 0x863B,
+    0x863D, 0x863E, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645,
+    0x8646, 0x8647, 0x8648, 0x8649, 0x864A, 0x864B, 0x864C, 0x8652,
+    0x8653, 0x8656, 0x8657, 0x8658, 0x8659, 0x865B, 0x865D, 0x8660,
+    0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8668, 0x8669, 0x866A,
+    0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676,
+    0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688,
+    0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696,
+    0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0,
+    0x86A1, 0x86A2, 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2,
+    0x86B3, 0x86B7, 0x86B8, 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE,
+    0x86BF, 0x86C1, 0x86C2, 0x86C3, 0x86C5, 0x86C8, 0x86CC, 0x86CD,
+    0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, 0x86DA, 0x86DC, 0x86DD,
+    0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, 0x86E7, 0x86E8,
+    0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7, 0x86FB,
+    0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705, 0x870B, 0x870C,
+    0x870E, 0x870F, 0x8710, 0x8711, 0x8714, 0x8716, 0x8719, 0x871B,
+    0x871D, 0x871F, 0x8720, 0x8724, 0x8726, 0x8727, 0x8728, 0x872A,
+    0x872B, 0x872C, 0x872D, 0x872F, 0x8730, 0x8732, 0x8733, 0x8735,
+    0x8736, 0x8738, 0x8739, 0x873A, 0x873C, 0x873D, 0x8740, 0x8741,
+    0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874A, 0x874B, 0x874D,
+    0x874F, 0x8750, 0x8751, 0x8752, 0x8754, 0x8756, 0x8758, 0x875A,
+    0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8761, 0x8762, 0x8767,
+    0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876F, 0x8771,
+    0x8772, 0x8773, 0x8775, 0x8777, 0x8779, 0x877A, 0x877F, 0x8780,
+    0x8781, 0x8786, 0x8787, 0x8789, 0x878A, 0x878C, 0x878E, 0x878F,
+    0x8790, 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799,
+    0x879A, 0x879B, 0x879C, 0x879D, 0x87A0, 0x87A1, 0x87A3, 0x87A4,
+    0x87A5, 0x87A6, 0x87A7, 0x87A9, 0x87AA, 0x87AE, 0x87B0, 0x87B1,
+    0x87B2, 0x87B4, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BC, 0x87BE,
+    0x87BF, 0x87C1, 0x87C2, 0x87C3, 0x87C5, 0x87C7, 0x87C9, 0x87CC,
+    0x87CD, 0x87CF, 0x87D0, 0x87D4, 0x87D5, 0x87D6, 0x87D7, 0x87D8,
+    0x87D9, 0x87DA, 0x87DC, 0x87DD, 0x87DE, 0x87DF, 0x87E1, 0x87E2,
+    0x87E4, 0x87E6, 0x87E7, 0x87E8, 0x87E9, 0x87EB, 0x87ED, 0x87F0,
+    0x87F1, 0x87F3, 0x87F4, 0x87F5, 0x87F7, 0x87F8, 0x87FA, 0x87FC,
+    0x87FD, 0x87FF, 0x8800, 0x8801, 0x8802, 0x8804, 0x8807, 0x8808,
+    0x8809, 0x880B, 0x880C, 0x880D, 0x880E, 0x880F, 0x8812, 0x8814,
+    0x8817, 0x8818, 0x8819, 0x881A, 0x881C, 0x881D, 0x881E, 0x8820,
+    0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882A, 0x882B,
+    0x882C, 0x882D, 0x882E, 0x882F, 0x8830, 0x8833, 0x8834, 0x8835,
+    0x8837, 0x8838, 0x883A, 0x883D, 0x883E, 0x883F, 0x8841, 0x8842,
+    0x8843, 0x8847, 0x8848, 0x8849, 0x884B, 0x884E, 0x884F, 0x8850,
+    0x8851, 0x8852, 0x8855, 0x8856, 0x8858, 0x885A, 0x885C, 0x885E,
+    0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, 0x886F, 0x8871,
+    0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x887A, 0x887B, 0x887C,
+    0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888A, 0x888C, 0x888E,
+    0x888F, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, 0x8897, 0x8898,
+    0x8899, 0x889A, 0x889B, 0x889D, 0x889E, 0x889F, 0x88A0, 0x88A1,
+    0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, 0x88A9, 0x88AA, 0x88AC,
+    0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, 0x88B5, 0x88B6,
+    0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF, 0x88C0,
+    0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CB, 0x88CC, 0x88CD, 0x88D0,
+    0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA, 0x88DB, 0x88DE, 0x88E0,
+    0x88E1, 0x88E6, 0x88E7, 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED,
+    0x88EE, 0x88EF, 0x88F2, 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB,
+    0x88FF, 0x8900, 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8908,
+    0x8909, 0x890B, 0x890C, 0x890D, 0x890E, 0x890F, 0x8911, 0x8914,
+    0x8915, 0x8916, 0x8917, 0x8918, 0x891C, 0x891D, 0x891E, 0x891F,
+    0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929,
+    0x892C, 0x892D, 0x892E, 0x892F, 0x8931, 0x8935, 0x8937, 0x8939,
+    0x893A, 0x893C, 0x893D, 0x893E, 0x893F, 0x8940, 0x8942, 0x8943,
+    0x8945, 0x8946, 0x8948, 0x8949, 0x894A, 0x894B, 0x894C, 0x894D,
+    0x894E, 0x894F, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955,
+    0x8957, 0x8958, 0x8959, 0x895A, 0x895B, 0x895C, 0x8961, 0x8962,
+    0x8963, 0x8965, 0x8967, 0x8968, 0x8969, 0x896B, 0x896D, 0x896E,
+    0x8970, 0x8971, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978,
+    0x8979, 0x897A, 0x897C, 0x897D, 0x897E, 0x8980, 0x8982, 0x8984,
+    0x8985, 0x8987, 0x8988, 0x8989, 0x898A, 0x898C, 0x898D, 0x898E,
+    0x8990, 0x8991, 0x8992, 0x8994, 0x8995, 0x8997, 0x8999, 0x899A,
+    0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, 0x89A2, 0x89A3,
+    0x89A4, 0x89A5, 0x89A7, 0x89A8, 0x89A9, 0x89AB, 0x89AD, 0x89AE,
+    0x89B0, 0x89B1, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B8, 0x89B9,
+    0x89BB, 0x89BC, 0x89BE, 0x89C3, 0x89CD, 0x89D3, 0x89D4, 0x89D5,
+    0x89D7, 0x89D8, 0x89D9, 0x89DB, 0x89DD, 0x89DF, 0x89E0, 0x89E1,
+    0x89E2, 0x89E4, 0x89E7, 0x89E8, 0x89E9, 0x89EA, 0x89EC, 0x89ED,
+    0x89EE, 0x89F0, 0x89F1, 0x89F2, 0x89F5, 0x89F7, 0x89F9, 0x89FA,
+    0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x89FF, 0x8A04, 0x8A05, 0x8A06,
+    0x8A09, 0x8A0B, 0x8A0D, 0x8A0F, 0x8A11, 0x8A12, 0x8A14, 0x8A17,
+    0x8A19, 0x8A1A, 0x8A1C, 0x8A1E, 0x8A20, 0x8A21, 0x8A22, 0x8A24,
+    0x8A26, 0x8A27, 0x8A28, 0x8A29, 0x8A2B, 0x8A2C, 0x8A2E, 0x8A2F,
+    0x8A30, 0x8A32, 0x8A33, 0x8A35, 0x8A37, 0x8A38, 0x8A39, 0x8A3B,
+    0x8A3C, 0x8A3D, 0x8A3F, 0x8A40, 0x8A42, 0x8A43, 0x8A44, 0x8A45,
+    0x8A47, 0x8A49, 0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, 0x8A4F, 0x8A51,
+    0x8A53, 0x8A56, 0x8A57, 0x8A59, 0x8A5A, 0x8A5C, 0x8A5D, 0x8A5F,
+    0x8A60, 0x8A64, 0x8A65, 0x8A67, 0x8A68, 0x8A6A, 0x8A6F, 0x8A74,
+    0x8A76, 0x8A77, 0x8A78, 0x8A7A, 0x8A7B, 0x8A7D, 0x8A7E, 0x8A80,
+    0x8A81, 0x8A82, 0x8A83, 0x8A88, 0x8A8B, 0x8A8C, 0x8A8E, 0x8A8F,
+    0x8A90, 0x8A94, 0x8A96, 0x8A97, 0x8A99, 0x8A9B, 0x8A9C, 0x8A9D,
+    0x8A9F, 0x8AA2, 0x8AA7, 0x8AA9, 0x8AAA, 0x8AAB, 0x8AAD, 0x8AAE,
+    0x8AAF, 0x8AB1, 0x8AB3, 0x8AB4, 0x8AB5, 0x8AB7, 0x8AB8, 0x8ABA,
+    0x8ABB, 0x8ABD, 0x8ABE, 0x8AC0, 0x8AC1, 0x8AC3, 0x8AC5, 0x8AC6,
+    0x8AC8, 0x8ACA, 0x8ACC, 0x8ACE, 0x8AD0, 0x8AD3, 0x8AD4, 0x8AD5,
+    0x8AD8, 0x8AD9, 0x8ADA, 0x8ADD, 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE3,
+    0x8AE5, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEC, 0x8AEF, 0x8AF0, 0x8AF2,
+    0x8AF4, 0x8AF5, 0x8AF9, 0x8AFB, 0x8AFD, 0x8AFF, 0x8B03, 0x8B06,
+    0x8B08, 0x8B09, 0x8B0B, 0x8B0C, 0x8B0D, 0x8B0F, 0x8B11, 0x8B12,
+    0x8B13, 0x8B15, 0x8B18, 0x8B1C, 0x8B1E, 0x8B1F, 0x8B20, 0x8B22,
+    0x8B23, 0x8B24, 0x8B25, 0x8B27, 0x8B29, 0x8B2A, 0x8B2E, 0x8B2F,
+    0x8B30, 0x8B31, 0x8B32, 0x8B34, 0x8B35, 0x8B36, 0x8B37, 0x8B38,
+    0x8B3A, 0x8B3B, 0x8B3C, 0x8B3D, 0x8B3F, 0x8B40, 0x8B41, 0x8B42,
+    0x8B43, 0x8B44, 0x8B45, 0x8B46, 0x8B47, 0x8B48, 0x8B4A, 0x8B4B,
+    0x8B4C, 0x8B4D, 0x8B50, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55,
+    0x8B57, 0x8B5B, 0x8B5D, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62,
+    0x8B63, 0x8B64, 0x8B65, 0x8B67, 0x8B68, 0x8B69, 0x8B6A, 0x8B6D,
+    0x8B6E, 0x8B71, 0x8B72, 0x8B73, 0x8B75, 0x8B76, 0x8B78, 0x8B79,
+    0x8B7A, 0x8B7B, 0x8B7C, 0x8B7E, 0x8B7F, 0x8B81, 0x8B82, 0x8B83,
+    0x8B84, 0x8B85, 0x8B86, 0x8B87, 0x8B88, 0x8B89, 0x8B8B, 0x8B8C,
+    0x8B8D, 0x8B8F, 0x8B90, 0x8B91, 0x8B94, 0x8B97, 0x8B98, 0x8B99,
+    0x8B9A, 0x8B9B, 0x8B9D, 0x8B9F, 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7,
+    0x8BD0, 0x8BEA, 0x8C09, 0x8C1E, 0x8C38, 0x8C39, 0x8C3A, 0x8C3B,
+    0x8C3C, 0x8C3D, 0x8C3E, 0x8C3F, 0x8C40, 0x8C42, 0x8C43, 0x8C44,
+    0x8C45, 0x8C4A, 0x8C4B, 0x8C4D, 0x8C4E, 0x8C4F, 0x8C51, 0x8C52,
+    0x8C53, 0x8C54, 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5B, 0x8C5C,
+    0x8C5D, 0x8C5E, 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, 0x8C66,
+    0x8C67, 0x8C68, 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70,
+    0x8C71, 0x8C72, 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C,
+    0x8C7D, 0x8C7E, 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86,
+    0x8C87, 0x8C88, 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91,
+    0x8C92, 0x8C93, 0x8C95, 0x8C96, 0x8C97, 0x8C99, 0x8C9A, 0x8C9B,
+    0x8C9C, 0x8C9F, 0x8CA3, 0x8CA4, 0x8CA5, 0x8CA6, 0x8CAD, 0x8CAE,
+    0x8CB1, 0x8CB5, 0x8CB9, 0x8CBE, 0x8CC6, 0x8CC9, 0x8CCB, 0x8CCC,
+    0x8CCD, 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD4, 0x8CD6, 0x8CD7, 0x8CD8,
+    0x8CD9, 0x8CDB, 0x8CDD, 0x8CDF, 0x8CE5, 0x8CE8, 0x8CE9, 0x8CEE,
+    0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, 0x8CF5, 0x8CF6, 0x8CF7,
+    0x8CF8, 0x8CF9, 0x8CFF, 0x8D00, 0x8D01, 0x8D02, 0x8D03, 0x8D06,
+    0x8D07, 0x8D09, 0x8D0C, 0x8D0E, 0x8D11, 0x8D12, 0x8D13, 0x8D14,
+    0x8D15, 0x8D17, 0x8D18, 0x8D19, 0x8D1A, 0x8D20, 0x8D51, 0x8D52,
+    0x8D57, 0x8D5F, 0x8D65, 0x8D68, 0x8D69, 0x8D6A, 0x8D6C, 0x8D6E,
+    0x8D6F, 0x8D71, 0x8D72, 0x8D78, 0x8D79, 0x8D7A, 0x8D7B, 0x8D7C,
+    0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D82, 0x8D83, 0x8D86, 0x8D87,
+    0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, 0x8D90, 0x8D92,
+    0x8D93, 0x8D96, 0x8D97, 0x8D98, 0x8D9A, 0x8D9B, 0x8D9C, 0x8D9D,
+    0x8D9E, 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA4, 0x8DA5, 0x8DA6, 0x8DA7,
+    0x8DA9, 0x8DAA, 0x8DAB, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0,
+    0x8DB6, 0x8DB7, 0x8DB9, 0x8DBB, 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2,
+    0x8DC5, 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2,
+    0x8DD3, 0x8DD4, 0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, 0x8DE0, 0x8DE1,
+    0x8DE2, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, 0x8DEE, 0x8DF0,
+    0x8DF1, 0x8DF2, 0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, 0x8DFF, 0x8E00,
+    0x8E01, 0x8E02, 0x8E03, 0x8E04, 0x8E06, 0x8E07, 0x8E08, 0x8E0B,
+    0x8E0D, 0x8E0E, 0x8E11, 0x8E12, 0x8E13, 0x8E15, 0x8E16, 0x8E17,
+    0x8E18, 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, 0x8E20, 0x8E21, 0x8E24,
+    0x8E25, 0x8E26, 0x8E27, 0x8E28, 0x8E2B, 0x8E2D, 0x8E30, 0x8E32,
+    0x8E33, 0x8E36, 0x8E37, 0x8E38, 0x8E3B, 0x8E3C, 0x8E3E, 0x8E3F,
+    0x8E43, 0x8E45, 0x8E46, 0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, 0x8E53,
+    0x8E54, 0x8E56, 0x8E57, 0x8E58, 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D,
+    0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62, 0x8E64, 0x8E65, 0x8E67,
+    0x8E68, 0x8E6A, 0x8E6B, 0x8E6E, 0x8E71, 0x8E73, 0x8E75, 0x8E77,
+    0x8E78, 0x8E79, 0x8E7B, 0x8E7D, 0x8E7E, 0x8E80, 0x8E82, 0x8E83,
+    0x8E84, 0x8E86, 0x8E88, 0x8E8C, 0x8E8E, 0x8E95, 0x8E96, 0x8E97,
+    0x8E98, 0x8E99, 0x8E9B, 0x8E9D, 0x8E9F, 0x8EA0, 0x8EA2, 0x8EA3,
+    0x8EA4, 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAD, 0x8EAE, 0x8EB0, 0x8EB1,
+    0x8EB3, 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBB,
+    0x8EBC, 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC1, 0x8EC2, 0x8EC3, 0x8EC4,
+    0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, 0x8ECF, 0x8ED0, 0x8ED1,
+    0x8ED3, 0x8ED5, 0x8ED6, 0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, 0x8EDC,
+    0x8EDD, 0x8EDE, 0x8EE0, 0x8EE1, 0x8EE2, 0x8EE3, 0x8EE5, 0x8EE6,
+    0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEC, 0x8EED, 0x8EEE, 0x8EEF,
+    0x8EF0, 0x8EF1, 0x8EF3, 0x8EF4, 0x8EF5, 0x8EF6, 0x8EF7, 0x8EFD,
+    0x8EFF, 0x8F00, 0x8F01, 0x8F02, 0x8F04, 0x8F06, 0x8F08, 0x8F0B,
+    0x8F0C, 0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, 0x8F11, 0x8F13, 0x8F16,
+    0x8F17, 0x8F18, 0x8F19, 0x8F1A, 0x8F20, 0x8F21, 0x8F22, 0x8F23,
+    0x8F24, 0x8F27, 0x8F28, 0x8F2B, 0x8F2C, 0x8F2D, 0x8F2E, 0x8F30,
+    0x8F31, 0x8F32, 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F39, 0x8F3A,
+    0x8F3C, 0x8F3D, 0x8F40, 0x8F41, 0x8F43, 0x8F47, 0x8F48, 0x8F4A,
+    0x8F4B, 0x8F4C, 0x8F4F, 0x8F50, 0x8F51, 0x8F52, 0x8F53, 0x8F55,
+    0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, 0x8F5B, 0x8F5C, 0x8F5D,
+    0x8F5E, 0x8F60, 0x8F63, 0x8F65, 0x8F6A, 0x8F80, 0x8F8C, 0x8F92,
+    0x8F9D, 0x8FA0, 0x8FA1, 0x8FA2, 0x8FA4, 0x8FA5, 0x8FA7, 0x8FAA,
+    0x8FAC, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8, 0x8FBA, 0x8FBB,
+    0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6, 0x8FC9, 0x8FCA, 0x8FCB,
+    0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, 0x8FD6, 0x8FD7, 0x8FDA, 0x8FE0,
+    0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, 0x8FEF, 0x8FF1, 0x8FF2, 0x8FF5,
+    0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC, 0x8FFE, 0x8FFF, 0x9007, 0x9008,
+    0x900C, 0x900E, 0x9013, 0x9018, 0x901C, 0x9024, 0x9025, 0x9027,
+    0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x9030, 0x9031, 0x9033,
+    0x9034, 0x9037, 0x9039, 0x903A, 0x903D, 0x903F, 0x9040, 0x9043,
+    0x9045, 0x9046, 0x9048, 0x9049, 0x904A, 0x904C, 0x9056, 0x9059,
+    0x905A, 0x905D, 0x905F, 0x9061, 0x9064, 0x9066, 0x9067, 0x906A,
+    0x906B, 0x906C, 0x906F, 0x9070, 0x9071, 0x9073, 0x9076, 0x9079,
+    0x907B, 0x907E, 0x9085, 0x9086, 0x9089, 0x908C, 0x908D, 0x908E,
+    0x9092, 0x9094, 0x9096, 0x9098, 0x909A, 0x909C, 0x909E, 0x909F,
+    0x90A0, 0x90A4, 0x90A5, 0x90A7, 0x90A8, 0x90A9, 0x90AB, 0x90AD,
+    0x90B2, 0x90B7, 0x90BC, 0x90BD, 0x90BF, 0x90C0, 0x90C2, 0x90C3,
+    0x90C6, 0x90C8, 0x90C9, 0x90CB, 0x90CC, 0x90CD, 0x90D2, 0x90D4,
+    0x90D5, 0x90D6, 0x90D8, 0x90D9, 0x90DA, 0x90DE, 0x90E0, 0x90E3,
+    0x90E4, 0x90E5, 0x90E9, 0x90EA, 0x90EC, 0x90EE, 0x90F0, 0x90F1,
+    0x90F2, 0x90F3, 0x90F6, 0x90F7, 0x90F9, 0x90FA, 0x90FB, 0x90FC,
+    0x90FF, 0x9100, 0x9101, 0x9103, 0x9105, 0x9107, 0x9108, 0x910A,
+    0x910B, 0x910C, 0x910D, 0x910E, 0x910F, 0x9110, 0x9111, 0x9113,
+    0x9115, 0x9117, 0x9118, 0x911A, 0x911B, 0x911C, 0x911D, 0x911F,
+    0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9128, 0x9129, 0x912A,
+    0x912B, 0x912C, 0x912E, 0x9133, 0x9135, 0x9137, 0x9138, 0x913B,
+    0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, 0x9144,
+    0x9145, 0x9147, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, 0x9158,
+    0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167, 0x9168,
+    0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180, 0x9181,
+    0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E, 0x918F,
+    0x9193, 0x9194, 0x9195, 0x9197, 0x9198, 0x9199, 0x919D, 0x919E,
+    0x919F, 0x91A0, 0x91A1, 0x91A4, 0x91A5, 0x91A6, 0x91A7, 0x91A8,
+    0x91A9, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B6, 0x91B7, 0x91B8,
+    0x91B9, 0x91BB, 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C2, 0x91C4,
+    0x91C6, 0x91C8, 0x91D0, 0x91D6, 0x91DA, 0x91DB, 0x91DE, 0x91DF,
+    0x91E0, 0x91E1, 0x91E2, 0x91E5, 0x91E6, 0x91E8, 0x91EA, 0x91EB,
+    0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3,
+    0x91F4, 0x91F6, 0x91F8, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF,
+    0x9202, 0x9203, 0x9205, 0x9206, 0x9207, 0x920A, 0x920B, 0x920C,
+    0x920F, 0x9212, 0x9213, 0x9216, 0x9217, 0x9218, 0x9219, 0x921A,
+    0x921B, 0x921C, 0x921D, 0x921F, 0x9220, 0x9221, 0x9222, 0x9224,
+    0x9228, 0x9229, 0x922A, 0x922B, 0x922C, 0x922D, 0x922F, 0x9231,
+    0x9232, 0x9235, 0x9236, 0x923B, 0x923C, 0x9241, 0x9242, 0x9243,
+    0x9244, 0x9246, 0x9247, 0x924A, 0x924B, 0x924C, 0x924E, 0x924F,
+    0x9250, 0x9252, 0x9253, 0x9254, 0x9256, 0x9258, 0x9259, 0x925C,
+    0x925D, 0x925F, 0x9260, 0x9261, 0x9263, 0x9264, 0x9265, 0x9267,
+    0x9268, 0x9269, 0x926A, 0x926B, 0x926E, 0x926F, 0x9270, 0x9271,
+    0x9272, 0x9273, 0x9275, 0x9276, 0x9277, 0x9279, 0x927C, 0x927D,
+    0x927E, 0x9281, 0x9282, 0x9284, 0x9286, 0x9287, 0x9288, 0x9289,
+    0x928A, 0x928B, 0x928C, 0x928D, 0x928F, 0x9290, 0x9292, 0x9294,
+    0x9295, 0x9297, 0x9299, 0x929B, 0x929D, 0x929E, 0x929F, 0x92A1,
+    0x92A2, 0x92A4, 0x92A7, 0x92AD, 0x92AF, 0x92B0, 0x92B2, 0x92B3,
+    0x92B4, 0x92B5, 0x92B6, 0x92B8, 0x92BA, 0x92BD, 0x92BE, 0x92BF,
+    0x92C0, 0x92C2, 0x92C4, 0x92C6, 0x92C9, 0x92CA, 0x92CB, 0x92CD,
+    0x92CE, 0x92D0, 0x92D1, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7,
+    0x92D8, 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DE, 0x92E0, 0x92E1,
+    0x92E2, 0x92E7, 0x92E9, 0x92EB, 0x92EC, 0x92F2, 0x92F3, 0x92F4,
+    0x92F5, 0x92F7, 0x92F9, 0x92FA, 0x92FB, 0x92FD, 0x92FE, 0x92FF,
+    0x9300, 0x9302, 0x9303, 0x9304, 0x9305, 0x9309, 0x930A, 0x930B,
+    0x930C, 0x930D, 0x930E, 0x930F, 0x9311, 0x9313, 0x9314, 0x9316,
+    0x9317, 0x931C, 0x931D, 0x931E, 0x9321, 0x9323, 0x9324, 0x9325,
+    0x9327, 0x9329, 0x932A, 0x932C, 0x932D, 0x9330, 0x9331, 0x9334,
+    0x9335, 0x9337, 0x9339, 0x933A, 0x933B, 0x933C, 0x933D, 0x933F,
+    0x9342, 0x9344, 0x9345, 0x9348, 0x9349, 0x934A, 0x934C, 0x934E,
+    0x934F, 0x9350, 0x9351, 0x9352, 0x9353, 0x9355, 0x9356, 0x9357,
+    0x9359, 0x935A, 0x935C, 0x935D, 0x935E, 0x935F, 0x9360, 0x9361,
+    0x9362, 0x9363, 0x9366, 0x9367, 0x9368, 0x936B, 0x936D, 0x936E,
+    0x936F, 0x9371, 0x9372, 0x9373, 0x9374, 0x9377, 0x9378, 0x9379,
+    0x937B, 0x937C, 0x937D, 0x937F, 0x9380, 0x9381, 0x9383, 0x9385,
+    0x9386, 0x9388, 0x9389, 0x938B, 0x938C, 0x938D, 0x938E, 0x9390,
+    0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9397, 0x9399, 0x939A,
+    0x939B, 0x939C, 0x939D, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x93A4,
+    0x93A5, 0x93A8, 0x93AB, 0x93AD, 0x93AF, 0x93B1, 0x93B2, 0x93B4,
+    0x93B6, 0x93B7, 0x93B9, 0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE,
+    0x93C0, 0x93C1, 0x93C2, 0x93C4, 0x93C5, 0x93C6, 0x93C9, 0x93CB,
+    0x93CE, 0x93CF, 0x93D0, 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D9,
+    0x93DA, 0x93DB, 0x93E0, 0x93E3, 0x93E5, 0x93E6, 0x93E7, 0x93E9,
+    0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, 0x93F1,
+    0x93F2, 0x93F3, 0x93F4, 0x93F6, 0x93F8, 0x93FA, 0x93FB, 0x93FC,
+    0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, 0x9404, 0x9405,
+    0x9406, 0x9407, 0x9408, 0x9409, 0x940A, 0x940C, 0x940D, 0x940E,
+    0x940F, 0x9411, 0x9415, 0x9416, 0x9417, 0x941A, 0x941B, 0x941C,
+    0x941E, 0x941F, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9429,
+    0x942A, 0x942B, 0x942C, 0x942D, 0x942F, 0x9430, 0x9431, 0x9434,
+    0x9436, 0x9437, 0x9439, 0x943B, 0x943C, 0x943D, 0x9440, 0x9441,
+    0x9442, 0x9443, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944B,
+    0x944D, 0x944E, 0x944F, 0x9450, 0x9451, 0x9453, 0x9455, 0x9456,
+    0x9457, 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E,
+    0x945F, 0x9461, 0x9462, 0x9464, 0x9466, 0x9467, 0x9468, 0x9469,
+    0x946A, 0x946C, 0x946E, 0x946F, 0x9471, 0x9473, 0x9474, 0x9475,
+    0x9476, 0x9478, 0x947A, 0x947B, 0x9480, 0x9481, 0x9482, 0x9483,
+    0x9484, 0x9491, 0x9496, 0x9498, 0x94C7, 0x94CF, 0x94D3, 0x94D4,
+    0x94DA, 0x94E6, 0x94FB, 0x951C, 0x9520, 0x9527, 0x9533, 0x953D,
+    0x9543, 0x9548, 0x954B, 0x9555, 0x955A, 0x9560, 0x956E, 0x9574,
+    0x9575, 0x9578, 0x9579, 0x957A, 0x957B, 0x957C, 0x957D, 0x957E,
+    0x9581, 0x9584, 0x9585, 0x9587, 0x9588, 0x958A, 0x958D, 0x9590,
+    0x9592, 0x9595, 0x9596, 0x9597, 0x9599, 0x959A, 0x959B, 0x959C,
+    0x959D, 0x959E, 0x959F, 0x95A0, 0x95A2, 0x95A6, 0x95A7, 0x95AA,
+    0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B3, 0x95B4, 0x95B5, 0x95B7,
+    0x95B8, 0x95BA, 0x95C0, 0x95C1, 0x95C2, 0x95C4, 0x95C5, 0x95C7,
+    0x95C9, 0x95CD, 0x95CE, 0x95CF, 0x95D1, 0x95D2, 0x95D3, 0x95D7,
+    0x95D8, 0x95D9, 0x95DA, 0x95DB, 0x95DD, 0x95DF, 0x95E0, 0x95E3,
+    0x95E4, 0x95E6, 0x95E7, 0x95EC, 0x95FF, 0x9607, 0x9613, 0x9618,
+    0x961B, 0x961E, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627,
+    0x9628, 0x9629, 0x962B, 0x962C, 0x962D, 0x962F, 0x9630, 0x9637,
+    0x9638, 0x9639, 0x963A, 0x963E, 0x9641, 0x9643, 0x964A, 0x964E,
+    0x964F, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0x9659, 0x965A,
+    0x965C, 0x965E, 0x9660, 0x9665, 0x9666, 0x966B, 0x966D, 0x966E,
+    0x966F, 0x9671, 0x9679, 0x967A, 0x967B, 0x967C, 0x967E, 0x967F,
+    0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968C,
+    0x9691, 0x9692, 0x9693, 0x9696, 0x969A, 0x969D, 0x969E, 0x969F,
+    0x96A0, 0x96A1, 0x96A2, 0x96A3, 0x96A4, 0x96A5, 0x96A6, 0x96A9,
+    0x96AB, 0x96AC, 0x96AD, 0x96AE, 0x96AF, 0x96B2, 0x96B5, 0x96B7,
+    0x96BA, 0x96BF, 0x96C2, 0x96C3, 0x96C8, 0x96CA, 0x96CB, 0x96D0,
+    0x96D1, 0x96D3, 0x96D4, 0x96D7, 0x96D8, 0x96DA, 0x96DD, 0x96DE,
+    0x96DF, 0x96E1, 0x96E4, 0x96E5, 0x96E6, 0x96E7, 0x96EB, 0x96EC,
+    0x96ED, 0x96EE, 0x96F0, 0x96F1, 0x96F4, 0x96F5, 0x96F8, 0x96FA,
+    0x96FC, 0x96FD, 0x96FF, 0x9702, 0x9703, 0x9705, 0x970A, 0x970B,
+    0x970C, 0x9710, 0x9711, 0x9712, 0x9714, 0x9715, 0x9717, 0x9718,
+    0x9719, 0x971A, 0x971B, 0x971D, 0x971F, 0x9720, 0x9721, 0x9722,
+    0x9723, 0x9724, 0x9725, 0x9726, 0x9728, 0x9729, 0x972B, 0x972C,
+    0x972E, 0x972F, 0x9731, 0x9733, 0x9734, 0x9735, 0x9736, 0x9737,
+    0x973A, 0x973B, 0x973C, 0x973F, 0x9740, 0x9741, 0x9743, 0x9745,
+    0x9746, 0x9747, 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, 0x974E,
+    0x974F, 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975C,
+    0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, 0x976A, 0x976B,
+    0x976C, 0x976D, 0x976E, 0x976F, 0x9770, 0x9771, 0x9772, 0x9775,
+    0x9777, 0x9778, 0x9779, 0x977A, 0x977B, 0x977D, 0x977E, 0x977F,
+    0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, 0x9787, 0x9788,
+    0x9789, 0x978A, 0x978C, 0x978E, 0x9790, 0x9793, 0x9795, 0x9796,
+    0x9797, 0x9799, 0x979A, 0x979B, 0x979C, 0x979D, 0x979E, 0x979F,
+    0x97A1, 0x97A2, 0x97A4, 0x97A5, 0x97A7, 0x97A8, 0x97A9, 0x97AA,
+    0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3, 0x97B5, 0x97B6, 0x97B7,
+    0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, 0x97BE, 0x97BF, 0x97C0,
+    0x97C1, 0x97C2, 0x97C4, 0x97C5, 0x97C7, 0x97C8, 0x97CA, 0x97CD,
+    0x97CE, 0x97CF, 0x97D0, 0x97D1, 0x97D2, 0x97D4, 0x97D5, 0x97D6,
+    0x97D7, 0x97D8, 0x97DA, 0x97DB, 0x97DD, 0x97DF, 0x97E0, 0x97E1,
+    0x97E2, 0x97E3, 0x97E4, 0x97E5, 0x97E8, 0x97EE, 0x97EF, 0x97F0,
+    0x97F1, 0x97F2, 0x97F4, 0x97F7, 0x97F8, 0x97F9, 0x97FA, 0x97FB,
+    0x97FC, 0x97FD, 0x97FE, 0x9800, 0x9804, 0x9809, 0x980B, 0x980D,
+    0x9814, 0x9815, 0x9816, 0x9819, 0x981A, 0x981B, 0x981D, 0x981E,
+    0x981F, 0x9820, 0x9822, 0x9823, 0x9825, 0x9827, 0x9828, 0x9829,
+    0x982A, 0x982B, 0x982C, 0x982E, 0x982F, 0x9831, 0x9832, 0x9833,
+    0x9834, 0x9835, 0x9836, 0x9839, 0x983A, 0x983C, 0x983E, 0x983F,
+    0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9847, 0x9848,
+    0x9849, 0x984A, 0x984B, 0x984F, 0x9850, 0x9851, 0x9852, 0x9855,
+    0x9856, 0x9857, 0x985A, 0x985C, 0x985D, 0x985F, 0x9860, 0x9861,
+    0x9863, 0x9864, 0x9866, 0x9868, 0x9869, 0x986A, 0x986D, 0x986E,
+    0x9872, 0x988B, 0x988E, 0x9892, 0x9895, 0x9899, 0x98A3, 0x98A9,
+    0x98AA, 0x98AB, 0x98AC, 0x98AD, 0x98B0, 0x98B2, 0x98B4, 0x98B5,
+    0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, 0x98BD, 0x98BE, 0x98BF,
+    0x98C0, 0x98C1, 0x98C2, 0x98C3, 0x98C5, 0x98C7, 0x98C9, 0x98CA,
+    0x98CB, 0x98CC, 0x98CD, 0x98CF, 0x98D0, 0x98D4, 0x98D6, 0x98D7,
+    0x98DC, 0x98DD, 0x98E1, 0x98E3, 0x98E4, 0x98E5, 0x98E6, 0x98EC,
+    0x98EE, 0x98F0, 0x98F1, 0x98F3, 0x98F5, 0x98F6, 0x98F7, 0x98F8,
+    0x98F9, 0x98FA, 0x98FB, 0x98FF, 0x9900, 0x9901, 0x9902, 0x9904,
+    0x9906, 0x9907, 0x9908, 0x990B, 0x990E, 0x990F, 0x9914, 0x9915,
+    0x9916, 0x9917, 0x9919, 0x991A, 0x991C, 0x991D, 0x991F, 0x9920,
+    0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9929, 0x992A,
+    0x992B, 0x992C, 0x992D, 0x992F, 0x9930, 0x9931, 0x9932, 0x9934,
+    0x9935, 0x9936, 0x9938, 0x9939, 0x993A, 0x993B, 0x993D, 0x9940,
+    0x9941, 0x9942, 0x9944, 0x9946, 0x9947, 0x994D, 0x994E, 0x994F,
+    0x9950, 0x9953, 0x9956, 0x9958, 0x9959, 0x995A, 0x995B, 0x995D,
+    0x995F, 0x9960, 0x9961, 0x9964, 0x9966, 0x9973, 0x9978, 0x9979,
+    0x997B, 0x997E, 0x9982, 0x9983, 0x9989, 0x998C, 0x998E, 0x999A,
+    0x999B, 0x999C, 0x999D, 0x999E, 0x999F, 0x99A0, 0x99A1, 0x99A2,
+    0x99A3, 0x99A4, 0x99A6, 0x99A7, 0x99A9, 0x99AA, 0x99AB, 0x99AF,
+    0x99B0, 0x99B2, 0x99B5, 0x99B6, 0x99B7, 0x99B8, 0x99B9, 0x99BA,
+    0x99BB, 0x99BC, 0x99BD, 0x99BE, 0x99BF, 0x99C0, 0x99C2, 0x99C3,
+    0x99C4, 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9, 0x99CA, 0x99CB,
+    0x99CC, 0x99CD, 0x99CE, 0x99CF, 0x99D3, 0x99D6, 0x99D7, 0x99DA,
+    0x99DC, 0x99DE, 0x99E0, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7,
+    0x99E8, 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99EE, 0x99EF, 0x99F0,
+    0x99F2, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8, 0x99F9,
+    0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x99FE, 0x9A00, 0x9A02, 0x9A03,
+    0x9A04, 0x9A06, 0x9A07, 0x9A08, 0x9A09, 0x9A0A, 0x9A0B, 0x9A0C,
+    0x9A10, 0x9A11, 0x9A12, 0x9A13, 0x9A14, 0x9A15, 0x9A17, 0x9A18,
+    0x9A1A, 0x9A1B, 0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, 0x9A20, 0x9A21,
+    0x9A22, 0x9A23, 0x9A24, 0x9A25, 0x9A26, 0x9A27, 0x9A28, 0x9A29,
+    0x9A2A, 0x9A2C, 0x9A2F, 0x9A31, 0x9A32, 0x9A33, 0x9A34, 0x9A35,
+    0x9A39, 0x9A3A, 0x9A3B, 0x9A3C, 0x9A3D, 0x9A3F, 0x9A46, 0x9A47,
+    0x9A48, 0x9A49, 0x9A4B, 0x9A4C, 0x9A4E, 0x9A50, 0x9A51, 0x9A52,
+    0x9A53, 0x9A54, 0x9A56, 0x9A58, 0x9A59, 0x9A5C, 0x9A5D, 0x9A5E,
+    0x9A60, 0x9A61, 0x9A63, 0x9A66, 0x9A67, 0x9A68, 0x9A69, 0x9A6B,
+    0x9A72, 0x9A83, 0x9A89, 0x9A8D, 0x9A8E, 0x9A94, 0x9A95, 0x9A99,
+    0x9AA6, 0x9AA9, 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, 0x9AAE, 0x9AB2,
+    0x9AB3, 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, 0x9ABD, 0x9ABE, 0x9ABF,
+    0x9AC3, 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, 0x9AC9, 0x9ACA, 0x9ACD,
+    0x9ACE, 0x9AD0, 0x9AD7, 0x9AD9, 0x9ADA, 0x9ADB, 0x9ADC, 0x9ADD,
+    0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, 0x9AE4, 0x9AE5, 0x9AE7, 0x9AE8,
+    0x9AE9, 0x9AEA, 0x9AEC, 0x9AF0, 0x9AF1, 0x9AF2, 0x9AF3, 0x9AF4,
+    0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AFA, 0x9AFC, 0x9AFD, 0x9AFE,
+    0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B04, 0x9B05, 0x9B07, 0x9B09,
+    0x9B0A, 0x9B0B, 0x9B0C, 0x9B0E, 0x9B10, 0x9B11, 0x9B12, 0x9B14,
+    0x9B15, 0x9B16, 0x9B17, 0x9B18, 0x9B19, 0x9B1B, 0x9B1C, 0x9B1D,
+    0x9B1E, 0x9B20, 0x9B21, 0x9B24, 0x9B26, 0x9B28, 0x9B2A, 0x9B2B,
+    0x9B2C, 0x9B2D, 0x9B30, 0x9B33, 0x9B34, 0x9B35, 0x9B36, 0x9B37,
+    0x9B38, 0x9B39, 0x9B3A, 0x9B3D, 0x9B3E, 0x9B3F, 0x9B40, 0x9B46,
+    0x9B4A, 0x9B4B, 0x9B4C, 0x9B50, 0x9B52, 0x9B53, 0x9B55, 0x9B56,
+    0x9B57, 0x9B59, 0x9B5B, 0x9B5C, 0x9B5D, 0x9B5E, 0x9B5F, 0x9B60,
+    0x9B61, 0x9B62, 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68,
+    0x9B69, 0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B70, 0x9B71,
+    0x9B72, 0x9B73, 0x9B75, 0x9B76, 0x9B78, 0x9B79, 0x9B7A, 0x9B7B,
+    0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, 0x9B80, 0x9B82, 0x9B84, 0x9B85,
+    0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, 0x9B8B, 0x9B8C, 0x9B8D,
+    0x9B8F, 0x9B93, 0x9B94, 0x9B95, 0x9B96, 0x9B97, 0x9B98, 0x9B99,
+    0x9B9B, 0x9B9C, 0x9B9F, 0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, 0x9BA4,
+    0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, 0x9BA9, 0x9BAC, 0x9BAF, 0x9BB0,
+    0x9BB1, 0x9BB2, 0x9BB3, 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8,
+    0x9BB9, 0x9BBA, 0x9BBB, 0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, 0x9BC2,
+    0x9BC3, 0x9BC4, 0x9BC5, 0x9BC6, 0x9BC8, 0x9BCB, 0x9BCC, 0x9BCD,
+    0x9BCE, 0x9BCF, 0x9BD0, 0x9BD1, 0x9BD2, 0x9BD3, 0x9BD5, 0x9BD7,
+    0x9BD8, 0x9BD9, 0x9BDA, 0x9BDC, 0x9BDE, 0x9BDF, 0x9BE0, 0x9BE3,
+    0x9BE5, 0x9BE6, 0x9BE9, 0x9BEC, 0x9BED, 0x9BEE, 0x9BEF, 0x9BF1,
+    0x9BF2, 0x9BF3, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA,
+    0x9BFB, 0x9BFC, 0x9BFE, 0x9C00, 0x9C01, 0x9C02, 0x9C03, 0x9C04,
+    0x9C05, 0x9C06, 0x9C07, 0x9C0A, 0x9C0B, 0x9C0C, 0x9C0E, 0x9C0F,
+    0x9C11, 0x9C14, 0x9C15, 0x9C16, 0x9C17, 0x9C18, 0x9C19, 0x9C1A,
+    0x9C1B, 0x9C1C, 0x9C1D, 0x9C1E, 0x9C1F, 0x9C21, 0x9C22, 0x9C24,
+    0x9C26, 0x9C27, 0x9C2A, 0x9C2B, 0x9C2C, 0x9C2E, 0x9C2F, 0x9C30,
+    0x9C34, 0x9C36, 0x9C38, 0x9C3A, 0x9C3C, 0x9C3D, 0x9C3F, 0x9C40,
+    0x9C41, 0x9C42, 0x9C43, 0x9C44, 0x9C46, 0x9C47, 0x9C4A, 0x9C4B,
+    0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, 0x9C50, 0x9C51, 0x9C53, 0x9C55,
+    0x9C59, 0x9C5A, 0x9C5B, 0x9C5C, 0x9C5E, 0x9C60, 0x9C61, 0x9C62,
+    0x9C63, 0x9C64, 0x9C65, 0x9C66, 0x9C68, 0x9C69, 0x9C6A, 0x9C6B,
+    0x9C6C, 0x9C6E, 0x9C6F, 0x9C70, 0x9C71, 0x9C72, 0x9C73, 0x9C74,
+    0x9C75, 0x9C76, 0x9C77, 0x9C79, 0x9C7B, 0x9C7D, 0x9C7E, 0x9C80,
+    0x9C83, 0x9C84, 0x9C89, 0x9C8A, 0x9C8C, 0x9C8F, 0x9C93, 0x9C96,
+    0x9C97, 0x9C98, 0x9C99, 0x9C9D, 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9,
+    0x9CBE, 0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1,
+    0x9CD2, 0x9CDA, 0x9CDB, 0x9CE0, 0x9CE1, 0x9CE3, 0x9CE4, 0x9CE6,
+    0x9CE7, 0x9CE8, 0x9CEA, 0x9CEB, 0x9CED, 0x9CEE, 0x9CEF, 0x9CF0,
+    0x9CF1, 0x9CF2, 0x9CF5, 0x9CF7, 0x9CF8, 0x9CF9, 0x9CFA, 0x9CFB,
+    0x9CFC, 0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, 0x9D01, 0x9D02, 0x9D03,
+    0x9D04, 0x9D05, 0x9D08, 0x9D0A, 0x9D0B, 0x9D0C, 0x9D0D, 0x9D0E,
+    0x9D0F, 0x9D10, 0x9D11, 0x9D12, 0x9D13, 0x9D14, 0x9D16, 0x9D17,
+    0x9D18, 0x9D19, 0x9D1A, 0x9D1C, 0x9D1E, 0x9D20, 0x9D21, 0x9D22,
+    0x9D24, 0x9D25, 0x9D27, 0x9D29, 0x9D2A, 0x9D2B, 0x9D2C, 0x9D2D,
+    0x9D2E, 0x9D31, 0x9D32, 0x9D33, 0x9D34, 0x9D35, 0x9D36, 0x9D37,
+    0x9D38, 0x9D39, 0x9D3A, 0x9D3C, 0x9D3D, 0x9D3E, 0x9D40, 0x9D41,
+    0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0x9D48, 0x9D49, 0x9D4A,
+    0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, 0x9D54, 0x9D55,
+    0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A, 0x9D5B, 0x9D5E, 0x9D5F,
+    0x9D62, 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69,
+    0x9D6B, 0x9D6D, 0x9D6E, 0x9D70, 0x9D71, 0x9D73, 0x9D74, 0x9D75,
+    0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, 0x9D7B, 0x9D7C, 0x9D7D,
+    0x9D7E, 0x9D7F, 0x9D80, 0x9D81, 0x9D82, 0x9D83, 0x9D84, 0x9D85,
+    0x9D86, 0x9D88, 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F,
+    0x9D90, 0x9D91, 0x9D92, 0x9D94, 0x9D95, 0x9D96, 0x9D97, 0x9D99,
+    0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0x9DA1, 0x9DA2,
+    0x9DA3, 0x9DA4, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DAA, 0x9DAB, 0x9DAC,
+    0x9DAD, 0x9DAE, 0x9DB0, 0x9DB1, 0x9DB2, 0x9DB3, 0x9DB5, 0x9DB6,
+    0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC1,
+    0x9DC3, 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, 0x9DCB,
+    0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, 0x9DD4,
+    0x9DD5, 0x9DD6, 0x9DD8, 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF,
+    0x9DE0, 0x9DE1, 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE7, 0x9DE8, 0x9DE9,
+    0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, 0x9DEE, 0x9DF0, 0x9DF1, 0x9DF4,
+    0x9DF5, 0x9DF6, 0x9DF7, 0x9DFB, 0x9DFC, 0x9DFD, 0x9DFE, 0x9DFF,
+    0x9E00, 0x9E01, 0x9E02, 0x9E03, 0x9E04, 0x9E05, 0x9E06, 0x9E07,
+    0x9E08, 0x9E09, 0x9E0A, 0x9E0B, 0x9E0D, 0x9E0E, 0x9E0F, 0x9E10,
+    0x9E11, 0x9E12, 0x9E13, 0x9E14, 0x9E16, 0x9E17, 0x9E18, 0x9E19,
+    0x9E1C, 0x9E24, 0x9E27, 0x9E2E, 0x9E30, 0x9E34, 0x9E3B, 0x9E3C,
+    0x9E40, 0x9E4D, 0x9E50, 0x9E52, 0x9E53, 0x9E54, 0x9E56, 0x9E59,
+    0x9E5D, 0x9E5F, 0x9E60, 0x9E61, 0x9E62, 0x9E65, 0x9E6E, 0x9E6F,
+    0x9E72, 0x9E74, 0x9E76, 0x9E77, 0x9E78, 0x9E7B, 0x9E80, 0x9E81,
+    0x9E83, 0x9E84, 0x9E85, 0x9E86, 0x9E89, 0x9E8A, 0x9E8C, 0x9E8D,
+    0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E94, 0x9E95, 0x9E96, 0x9E98,
+    0x9E99, 0x9E9A, 0x9E9B, 0x9E9C, 0x9E9E, 0x9EA0, 0x9EA1, 0x9EA2,
+    0x9EA3, 0x9EA4, 0x9EA7, 0x9EA8, 0x9EAA, 0x9EAB, 0x9EAC, 0x9EAD,
+    0x9EAE, 0x9EB0, 0x9EB1, 0x9EB2, 0x9EB3, 0x9EB6, 0x9EB7, 0x9EB9,
+    0x9EBA, 0x9EBC, 0x9EBF, 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5,
+    0x9EC6, 0x9EC7, 0x9EC8, 0x9ECA, 0x9ECB, 0x9ED0, 0x9ED2, 0x9ED3,
+    0x9ED5, 0x9ED6, 0x9ED7, 0x9ED9, 0x9EDA, 0x9EE1, 0x9EE3, 0x9EE4,
+    0x9EE6, 0x9EEB, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF3,
+    0x9EF5, 0x9EF6, 0x9EF8, 0x9EFA, 0x9F00, 0x9F01, 0x9F02, 0x9F03,
+    0x9F04, 0x9F05, 0x9F06, 0x9F07, 0x9F08, 0x9F0A, 0x9F0C, 0x9F0F,
+    0x9F11, 0x9F12, 0x9F14, 0x9F16, 0x9F18, 0x9F1A, 0x9F1B, 0x9F1C,
+    0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, 0x9F23, 0x9F24, 0x9F25, 0x9F26,
+    0x9F27, 0x9F28, 0x9F29, 0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, 0x9F30,
+    0x9F31, 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A,
+    0x9F3C, 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, 0x9F45, 0x9F46,
+    0x9F47, 0x9F48, 0x9F49, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F53, 0x9F55,
+    0x9F56, 0x9F57, 0x9F58, 0x9F5A, 0x9F5B, 0x9F5D, 0x9F5E, 0x9F62,
+    0x9F64, 0x9F65, 0x9F67, 0x9F68, 0x9F69, 0x9F6B, 0x9F6D, 0x9F6E,
+    0x9F6F, 0x9F70, 0x9F71, 0x9F73, 0x9F74, 0x9F75, 0x9F76, 0x9F78,
+    0x9F79, 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F81, 0x9F82,
+    0x9F8E, 0x9F8F, 0x9F91, 0x9F92, 0x9F93, 0x9F96, 0x9F97, 0x9F98,
+    0x9F9D, 0x9F9E, 0x9FA1, 0x9FA2, 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C,
+    0xFA0D, 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18, 0xFA1F,
+    0xFA20, 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29, 0x2E81,
+    0x0000, 0x0000, 0x0000, 0x2E84, 0x3473, 0x3447, 0x2E88, 0x2E8B,
+    0x9FB4, 0x359E, 0x361A, 0x360E, 0x2E8C, 0x2E97, 0x396E, 0x3918,
+    0x9FB5, 0x39CF, 0x39DF, 0x3A73, 0x39D0, 0x9FB6, 0x9FB7, 0x3B4E,
+    0x3C6E, 0x3CE0, 0x2EA7, 0x0000, 0x9FB8, 0x2EAA, 0x4056, 0x415F,
+    0x2EAE, 0x4337, 0x2EB3, 0x2EB6, 0x2EB7, 0x0000, 0x43B1, 0x43AC,
+    0x2EBB, 0x43DD, 0x44D6, 0x4661, 0x464C, 0x9FB9, 0x4723, 0x4729,
+    0x477C, 0x478D, 0x2ECA, 0x4947, 0x497A, 0x497D, 0x4982, 0x4983,
+    0x4985, 0x4986, 0x499F, 0x499B, 0x49B7, 0x49B6, 0x9FBA, 0x0000,
+    0x4CA3, 0x4C9F, 0x4CA0, 0x4CA1, 0x4C77, 0x4CA2, 0x4D13, 0x4D14,
+    0x4D15, 0x4D16, 0x4D17, 0x4D18, 0x4D19, 0x4DAE, 0x9FBB, 0x0020,
+    0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,
+    0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,
+    0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,
+    0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,
+    0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,
+    0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
+    0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
+    0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060,
+    0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,
+    0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
+    0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
+    0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x00FC, 0x00A9,
+    0x2122, 0x2026, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,
+    0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
+    0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
+    0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
+    0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,
+    0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,
+    0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
+    0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,
+    0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
+    0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+    0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
+    0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,
+    0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, 0x00E8,
+    0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2,
+    0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, 0x01DC,
+    0x00FC, 0x00EA, 0x0251, 0x1E3F, 0x0144, 0x0148, 0x01F9, 0x0261,
+    0x0020, 0x20AC, 0x00A5, 0x20AC, 0x0024, 0x303F, 0x20AC, 0x3041,
+    0x3047, 0x3043, 0x304B, 0x304B, 0x3051, 0x3051, 0x3053, 0x3053,
+    0x3049, 0x3064, 0x3045, 0x308E, 0x3083, 0x3087, 0x3085, 0x3094,
+    0x30A1, 0x30A7, 0x30A3, 0x30F5, 0x30F6, 0x30B3, 0x30B3, 0x30A9,
+    0x30C3, 0x30A5, 0x30EE, 0x30E3, 0x30E7, 0x30E5, 0x30F7, 0x30F9,
+    0x30F8, 0x30FA, 0x30FC, 0x3033, 0x3034, 0x3035, 0x3038, 0x3039,
+    0x303A, 0x312A, 0x312B, 0x312C, 0x31A0, 0x31A1, 0x31A2, 0x31A3,
+    0x31A4, 0x31A5, 0x31A6, 0x31A7, 0x31A8, 0x31A9, 0x31AA, 0x31AB,
+    0x31AC, 0x31AD, 0x31AE, 0x31AF, 0x31B0, 0x31B1, 0x31B2, 0x31B3,
+    0x31B4, 0x31B5, 0x31B6, 0x31B7, 0x2E80, 0x2E82, 0x2E83, 0x2E85,
+    0x2E86, 0x2E87, 0x2E89, 0x2E8A, 0x2E8D, 0x2E8E, 0x2E8F, 0x2E90,
+    0x2E91, 0x2E92, 0x2E93, 0x2E94, 0x2E95, 0x2E96, 0x2E98, 0x2E99,
+    0x2E9B, 0x2E9C, 0x2E9D, 0x2E9E, 0x2E9F, 0x2EA0, 0x2EA1, 0x2EA2,
+    0x2EA3, 0x2EA4, 0x2EA5, 0x2EA6, 0x2EA8, 0x2EA9, 0x2EAB, 0x2EAC,
+    0x2EAD, 0x2EAF, 0x2EB0, 0x2EB1, 0x2EB2, 0x2EB4, 0x2EB5, 0x2EB8,
+    0x2EB9, 0x2EBA, 0x2EBC, 0x2EBD, 0x2EBE, 0x2EBF, 0x2EC0, 0x2EC1,
+    0x2EC2, 0x2EC3, 0x2EC4, 0x2EC5, 0x2EC6, 0x2EC7, 0x2EC8, 0x2EC9,
+    0x2ECB, 0x2ECC, 0x2ECD, 0x2ECE, 0x2ECF, 0x2ED0, 0x2ED1, 0x2ED2,
+    0x2ED3, 0x2ED4, 0x2ED5, 0x2ED6, 0x2ED7, 0x2ED8, 0x2ED9, 0x2EDA,
+    0x2EDB, 0x2EDC, 0x2EDD, 0x2EDE, 0x2EDF, 0x2EE0, 0x2EE1, 0x2EE2,
+    0x2EE3, 0x2EE4, 0x2EE5, 0x2EE6, 0x2EE7, 0x2EE8, 0x2EE9, 0x2EEA,
+    0x2EEB, 0x2EEC, 0x2EED, 0x2EEE, 0x2EEF, 0x2EF0, 0x2EF1, 0x2EF2,
+    0x2EF3, 0x3400, 0x3401, 0x3402, 0x3403, 0x3404, 0x3405, 0x3406,
+    0x3407, 0x3408, 0x3409, 0x340A, 0x340B, 0x340C, 0x340D, 0x340E,
+    0x340F, 0x3410, 0x3411, 0x3412, 0x3413, 0x3414, 0x3415, 0x3416,
+    0x3417, 0x3418, 0x3419, 0x341A, 0x341B, 0x341C, 0x341D, 0x341E,
+    0x341F, 0x3420, 0x3421, 0x3422, 0x3423, 0x3424, 0x3425, 0x3426,
+    0x3427, 0x3428, 0x3429, 0x342A, 0x342B, 0x342C, 0x342D, 0x342E,
+    0x342F, 0x3430, 0x3431, 0x3432, 0x3433, 0x3434, 0x3435, 0x3436,
+    0x3437, 0x3438, 0x3439, 0x343A, 0x343B, 0x343C, 0x343D, 0x343E,
+    0x343F, 0x3440, 0x3441, 0x3442, 0x3443, 0x3444, 0x3445, 0x3446,
+    0x3448, 0x3449, 0x344A, 0x344B, 0x344C, 0x344D, 0x344E, 0x344F,
+    0x3450, 0x3451, 0x3452, 0x3453, 0x3454, 0x3455, 0x3456, 0x3457,
+    0x3458, 0x3459, 0x345A, 0x345B, 0x345C, 0x345D, 0x345E, 0x345F,
+    0x3460, 0x3461, 0x3462, 0x3463, 0x3464, 0x3465, 0x3466, 0x3467,
+    0x3468, 0x3469, 0x346A, 0x346B, 0x346C, 0x346D, 0x346E, 0x346F,
+    0x3470, 0x3471, 0x3472, 0x3474, 0x3475, 0x3476, 0x3477, 0x3478,
+    0x3479, 0x347A, 0x347B, 0x347C, 0x347D, 0x347E, 0x347F, 0x3480,
+    0x3481, 0x3482, 0x3483, 0x3484, 0x3485, 0x3486, 0x3487, 0x3488,
+    0x3489, 0x348A, 0x348B, 0x348C, 0x348D, 0x348E, 0x348F, 0x3490,
+    0x3491, 0x3492, 0x3493, 0x3494, 0x3495, 0x3496, 0x3497, 0x3498,
+    0x3499, 0x349A, 0x349B, 0x349C, 0x349D, 0x349E, 0x349F, 0x34A0,
+    0x34A1, 0x34A2, 0x34A3, 0x34A4, 0x34A5, 0x34A6, 0x34A7, 0x34A8,
+    0x34A9, 0x34AA, 0x34AB, 0x34AC, 0x34AD, 0x34AE, 0x34AF, 0x34B0,
+    0x34B1, 0x34B2, 0x34B3, 0x34B4, 0x34B5, 0x34B6, 0x34B7, 0x34B8,
+    0x34B9, 0x34BA, 0x34BB, 0x34BC, 0x34BD, 0x34BE, 0x34BF, 0x34C0,
+    0x34C1, 0x34C2, 0x34C3, 0x34C4, 0x34C5, 0x34C6, 0x34C7, 0x34C8,
+    0x34C9, 0x34CA, 0x34CB, 0x34CC, 0x34CD, 0x34CE, 0x34CF, 0x34D0,
+    0x34D1, 0x34D2, 0x34D3, 0x34D4, 0x34D5, 0x34D6, 0x34D7, 0x34D8,
+    0x34D9, 0x34DA, 0x34DB, 0x34DC, 0x34DD, 0x34DE, 0x34DF, 0x34E0,
+    0x34E1, 0x34E2, 0x34E3, 0x34E4, 0x34E5, 0x34E6, 0x34E7, 0x34E8,
+    0x34E9, 0x34EA, 0x34EB, 0x34EC, 0x34ED, 0x34EE, 0x34EF, 0x34F0,
+    0x34F1, 0x34F2, 0x34F3, 0x34F4, 0x34F5, 0x34F6, 0x34F7, 0x34F8,
+    0x34F9, 0x34FA, 0x34FB, 0x34FC, 0x34FD, 0x34FE, 0x34FF, 0x3500,
+    0x3501, 0x3502, 0x3503, 0x3504, 0x3505, 0x3506, 0x3507, 0x3508,
+    0x3509, 0x350A, 0x350B, 0x350C, 0x350D, 0x350E, 0x350F, 0x3510,
+    0x3511, 0x3512, 0x3513, 0x3514, 0x3515, 0x3516, 0x3517, 0x3518,
+    0x3519, 0x351A, 0x351B, 0x351C, 0x351D, 0x351E, 0x351F, 0x3520,
+    0x3521, 0x3522, 0x3523, 0x3524, 0x3525, 0x3526, 0x3527, 0x3528,
+    0x3529, 0x352A, 0x352B, 0x352C, 0x352D, 0x352E, 0x352F, 0x3530,
+    0x3531, 0x3532, 0x3533, 0x3534, 0x3535, 0x3536, 0x3537, 0x3538,
+    0x3539, 0x353A, 0x353B, 0x353C, 0x353D, 0x353E, 0x353F, 0x3540,
+    0x3541, 0x3542, 0x3543, 0x3544, 0x3545, 0x3546, 0x3547, 0x3548,
+    0x3549, 0x354A, 0x354B, 0x354C, 0x354D, 0x354E, 0x354F, 0x3550,
+    0x3551, 0x3552, 0x3553, 0x3554, 0x3555, 0x3556, 0x3557, 0x3558,
+    0x3559, 0x355A, 0x355B, 0x355C, 0x355D, 0x355E, 0x355F, 0x3560,
+    0x3561, 0x3562, 0x3563, 0x3564, 0x3565, 0x3566, 0x3567, 0x3568,
+    0x3569, 0x356A, 0x356B, 0x356C, 0x356D, 0x356E, 0x356F, 0x3570,
+    0x3571, 0x3572, 0x3573, 0x3574, 0x3575, 0x3576, 0x3577, 0x3578,
+    0x3579, 0x357A, 0x357B, 0x357C, 0x357D, 0x357E, 0x357F, 0x3580,
+    0x3581, 0x3582, 0x3583, 0x3584, 0x3585, 0x3586, 0x3587, 0x3588,
+    0x3589, 0x358A, 0x358B, 0x358C, 0x358D, 0x358E, 0x358F, 0x3590,
+    0x3591, 0x3592, 0x3593, 0x3594, 0x3595, 0x3596, 0x3597, 0x3598,
+    0x3599, 0x359A, 0x359B, 0x359C, 0x359D, 0x359F, 0x35A0, 0x35A1,
+    0x35A2, 0x35A3, 0x35A4, 0x35A5, 0x35A6, 0x35A7, 0x35A8, 0x35A9,
+    0x35AA, 0x35AB, 0x35AC, 0x35AD, 0x35AE, 0x35AF, 0x35B0, 0x35B1,
+    0x35B2, 0x35B3, 0x35B4, 0x35B5, 0x35B6, 0x35B7, 0x35B8, 0x35B9,
+    0x35BA, 0x35BB, 0x35BC, 0x35BD, 0x35BE, 0x35BF, 0x35C0, 0x35C1,
+    0x35C2, 0x35C3, 0x35C4, 0x35C5, 0x35C6, 0x35C7, 0x35C8, 0x35C9,
+    0x35CA, 0x35CB, 0x35CC, 0x35CD, 0x35CE, 0x35CF, 0x35D0, 0x35D1,
+    0x35D2, 0x35D3, 0x35D4, 0x35D5, 0x35D6, 0x35D7, 0x35D8, 0x35D9,
+    0x35DA, 0x35DB, 0x35DC, 0x35DD, 0x35DE, 0x35DF, 0x35E0, 0x35E1,
+    0x35E2, 0x35E3, 0x35E4, 0x35E5, 0x35E6, 0x35E7, 0x35E8, 0x35E9,
+    0x35EA, 0x35EB, 0x35EC, 0x35ED, 0x35EE, 0x35EF, 0x35F0, 0x35F1,
+    0x35F2, 0x35F3, 0x35F4, 0x35F5, 0x35F6, 0x35F7, 0x35F8, 0x35F9,
+    0x35FA, 0x35FB, 0x35FC, 0x35FD, 0x35FE, 0x35FF, 0x3600, 0x3601,
+    0x3602, 0x3603, 0x3604, 0x3605, 0x3606, 0x3607, 0x3608, 0x3609,
+    0x360A, 0x360B, 0x360C, 0x360D, 0x360F, 0x3610, 0x3611, 0x3612,
+    0x3613, 0x3614, 0x3615, 0x3616, 0x3617, 0x3618, 0x3619, 0x361B,
+    0x361C, 0x361D, 0x361E, 0x361F, 0x3620, 0x3621, 0x3622, 0x3623,
+    0x3624, 0x3625, 0x3626, 0x3627, 0x3628, 0x3629, 0x362A, 0x362B,
+    0x362C, 0x362D, 0x362E, 0x362F, 0x3630, 0x3631, 0x3632, 0x3633,
+    0x3634, 0x3635, 0x3636, 0x3637, 0x3638, 0x3639, 0x363A, 0x363B,
+    0x363C, 0x363D, 0x363E, 0x363F, 0x3640, 0x3641, 0x3642, 0x3643,
+    0x3644, 0x3645, 0x3646, 0x3647, 0x3648, 0x3649, 0x364A, 0x364B,
+    0x364C, 0x364D, 0x364E, 0x364F, 0x3650, 0x3651, 0x3652, 0x3653,
+    0x3654, 0x3655, 0x3656, 0x3657, 0x3658, 0x3659, 0x365A, 0x365B,
+    0x365C, 0x365D, 0x365E, 0x365F, 0x3660, 0x3661, 0x3662, 0x3663,
+    0x3664, 0x3665, 0x3666, 0x3667, 0x3668, 0x3669, 0x366A, 0x366B,
+    0x366C, 0x366D, 0x366E, 0x366F, 0x3670, 0x3671, 0x3672, 0x3673,
+    0x3674, 0x3675, 0x3676, 0x3677, 0x3678, 0x3679, 0x367A, 0x367B,
+    0x367C, 0x367D, 0x367E, 0x367F, 0x3680, 0x3681, 0x3682, 0x3683,
+    0x3684, 0x3685, 0x3686, 0x3687, 0x3688, 0x3689, 0x368A, 0x368B,
+    0x368C, 0x368D, 0x368E, 0x368F, 0x3690, 0x3691, 0x3692, 0x3693,
+    0x3694, 0x3695, 0x3696, 0x3697, 0x3698, 0x3699, 0x369A, 0x369B,
+    0x369C, 0x369D, 0x369E, 0x369F, 0x36A0, 0x36A1, 0x36A2, 0x36A3,
+    0x36A4, 0x36A5, 0x36A6, 0x36A7, 0x36A8, 0x36A9, 0x36AA, 0x36AB,
+    0x36AC, 0x36AD, 0x36AE, 0x36AF, 0x36B0, 0x36B1, 0x36B2, 0x36B3,
+    0x36B4, 0x36B5, 0x36B6, 0x36B7, 0x36B8, 0x36B9, 0x36BA, 0x36BB,
+    0x36BC, 0x36BD, 0x36BE, 0x36BF, 0x36C0, 0x36C1, 0x36C2, 0x36C3,
+    0x36C4, 0x36C5, 0x36C6, 0x36C7, 0x36C8, 0x36C9, 0x36CA, 0x36CB,
+    0x36CC, 0x36CD, 0x36CE, 0x36CF, 0x36D0, 0x36D1, 0x36D2, 0x36D3,
+    0x36D4, 0x36D5, 0x36D6, 0x36D7, 0x36D8, 0x36D9, 0x36DA, 0x36DB,
+    0x36DC, 0x36DD, 0x36DE, 0x36DF, 0x36E0, 0x36E1, 0x36E2, 0x36E3,
+    0x36E4, 0x36E5, 0x36E6, 0x36E7, 0x36E8, 0x36E9, 0x36EA, 0x36EB,
+    0x36EC, 0x36ED, 0x36EE, 0x36EF, 0x36F0, 0x36F1, 0x36F2, 0x36F3,
+    0x36F4, 0x36F5, 0x36F6, 0x36F7, 0x36F8, 0x36F9, 0x36FA, 0x36FB,
+    0x36FC, 0x36FD, 0x36FE, 0x36FF, 0x3700, 0x3701, 0x3702, 0x3703,
+    0x3704, 0x3705, 0x3706, 0x3707, 0x3708, 0x3709, 0x370A, 0x370B,
+    0x370C, 0x370D, 0x370E, 0x370F, 0x3710, 0x3711, 0x3712, 0x3713,
+    0x3714, 0x3715, 0x3716, 0x3717, 0x3718, 0x3719, 0x371A, 0x371B,
+    0x371C, 0x371D, 0x371E, 0x371F, 0x3720, 0x3721, 0x3722, 0x3723,
+    0x3724, 0x3725, 0x3726, 0x3727, 0x3728, 0x3729, 0x372A, 0x372B,
+    0x372C, 0x372D, 0x372E, 0x372F, 0x3730, 0x3731, 0x3732, 0x3733,
+    0x3734, 0x3735, 0x3736, 0x3737, 0x3738, 0x3739, 0x373A, 0x373B,
+    0x373C, 0x373D, 0x373E, 0x373F, 0x3740, 0x3741, 0x3742, 0x3743,
+    0x3744, 0x3745, 0x3746, 0x3747, 0x3748, 0x3749, 0x374A, 0x374B,
+    0x374C, 0x374D, 0x374E, 0x374F, 0x3750, 0x3751, 0x3752, 0x3753,
+    0x3754, 0x3755, 0x3756, 0x3757, 0x3758, 0x3759, 0x375A, 0x375B,
+    0x375C, 0x375D, 0x375E, 0x375F, 0x3760, 0x3761, 0x3762, 0x3763,
+    0x3764, 0x3765, 0x3766, 0x3767, 0x3768, 0x3769, 0x376A, 0x376B,
+    0x376C, 0x376D, 0x376E, 0x376F, 0x3770, 0x3771, 0x3772, 0x3773,
+    0x3774, 0x3775, 0x3776, 0x3777, 0x3778, 0x3779, 0x377A, 0x377B,
+    0x377C, 0x377D, 0x377E, 0x377F, 0x3780, 0x3781, 0x3782, 0x3783,
+    0x3784, 0x3785, 0x3786, 0x3787, 0x3788, 0x3789, 0x378A, 0x378B,
+    0x378C, 0x378D, 0x378E, 0x378F, 0x3790, 0x3791, 0x3792, 0x3793,
+    0x3794, 0x3795, 0x3796, 0x3797, 0x3798, 0x3799, 0x379A, 0x379B,
+    0x379C, 0x379D, 0x379E, 0x379F, 0x37A0, 0x37A1, 0x37A2, 0x37A3,
+    0x37A4, 0x37A5, 0x37A6, 0x37A7, 0x37A8, 0x37A9, 0x37AA, 0x37AB,
+    0x37AC, 0x37AD, 0x37AE, 0x37AF, 0x37B0, 0x37B1, 0x37B2, 0x37B3,
+    0x37B4, 0x37B5, 0x37B6, 0x37B7, 0x37B8, 0x37B9, 0x37BA, 0x37BB,
+    0x37BC, 0x37BD, 0x37BE, 0x37BF, 0x37C0, 0x37C1, 0x37C2, 0x37C3,
+    0x37C4, 0x37C5, 0x37C6, 0x37C7, 0x37C8, 0x37C9, 0x37CA, 0x37CB,
+    0x37CC, 0x37CD, 0x37CE, 0x37CF, 0x37D0, 0x37D1, 0x37D2, 0x37D3,
+    0x37D4, 0x37D5, 0x37D6, 0x37D7, 0x37D8, 0x37D9, 0x37DA, 0x37DB,
+    0x37DC, 0x37DD, 0x37DE, 0x37DF, 0x37E0, 0x37E1, 0x37E2, 0x37E3,
+    0x37E4, 0x37E5, 0x37E6, 0x37E7, 0x37E8, 0x37E9, 0x37EA, 0x37EB,
+    0x37EC, 0x37ED, 0x37EE, 0x37EF, 0x37F0, 0x37F1, 0x37F2, 0x37F3,
+    0x37F4, 0x37F5, 0x37F6, 0x37F7, 0x37F8, 0x37F9, 0x37FA, 0x37FB,
+    0x37FC, 0x37FD, 0x37FE, 0x37FF, 0x3800, 0x3801, 0x3802, 0x3803,
+    0x3804, 0x3805, 0x3806, 0x3807, 0x3808, 0x3809, 0x380A, 0x380B,
+    0x380C, 0x380D, 0x380E, 0x380F, 0x3810, 0x3811, 0x3812, 0x3813,
+    0x3814, 0x3815, 0x3816, 0x3817, 0x3818, 0x3819, 0x381A, 0x381B,
+    0x381C, 0x381D, 0x381E, 0x381F, 0x3820, 0x3821, 0x3822, 0x3823,
+    0x3824, 0x3825, 0x3826, 0x3827, 0x3828, 0x3829, 0x382A, 0x382B,
+    0x382C, 0x382D, 0x382E, 0x382F, 0x3830, 0x3831, 0x3832, 0x3833,
+    0x3834, 0x3835, 0x3836, 0x3837, 0x3838, 0x3839, 0x383A, 0x383B,
+    0x383C, 0x383D, 0x383E, 0x383F, 0x3840, 0x3841, 0x3842, 0x3843,
+    0x3844, 0x3845, 0x3846, 0x3847, 0x3848, 0x3849, 0x384A, 0x384B,
+    0x384C, 0x384D, 0x384E, 0x384F, 0x3850, 0x3851, 0x3852, 0x3853,
+    0x3854, 0x3855, 0x3856, 0x3857, 0x3858, 0x3859, 0x385A, 0x385B,
+    0x385C, 0x385D, 0x385E, 0x385F, 0x3860, 0x3861, 0x3862, 0x3863,
+    0x3864, 0x3865, 0x3866, 0x3867, 0x3868, 0x3869, 0x386A, 0x386B,
+    0x386C, 0x386D, 0x386E, 0x386F, 0x3870, 0x3871, 0x3872, 0x3873,
+    0x3874, 0x3875, 0x3876, 0x3877, 0x3878, 0x3879, 0x387A, 0x387B,
+    0x387C, 0x387D, 0x387E, 0x387F, 0x3880, 0x3881, 0x3882, 0x3883,
+    0x3884, 0x3885, 0x3886, 0x3887, 0x3888, 0x3889, 0x388A, 0x388B,
+    0x388C, 0x388D, 0x388E, 0x388F, 0x3890, 0x3891, 0x3892, 0x3893,
+    0x3894, 0x3895, 0x3896, 0x3897, 0x3898, 0x3899, 0x389A, 0x389B,
+    0x389C, 0x389D, 0x389E, 0x389F, 0x38A0, 0x38A1, 0x38A2, 0x38A3,
+    0x38A4, 0x38A5, 0x38A6, 0x38A7, 0x38A8, 0x38A9, 0x38AA, 0x38AB,
+    0x38AC, 0x38AD, 0x38AE, 0x38AF, 0x38B0, 0x38B1, 0x38B2, 0x38B3,
+    0x38B4, 0x38B5, 0x38B6, 0x38B7, 0x38B8, 0x38B9, 0x38BA, 0x38BB,
+    0x38BC, 0x38BD, 0x38BE, 0x38BF, 0x38C0, 0x38C1, 0x38C2, 0x38C3,
+    0x38C4, 0x38C5, 0x38C6, 0x38C7, 0x38C8, 0x38C9, 0x38CA, 0x38CB,
+    0x38CC, 0x38CD, 0x38CE, 0x38CF, 0x38D0, 0x38D1, 0x38D2, 0x38D3,
+    0x38D4, 0x38D5, 0x38D6, 0x38D7, 0x38D8, 0x38D9, 0x38DA, 0x38DB,
+    0x38DC, 0x38DD, 0x38DE, 0x38DF, 0x38E0, 0x38E1, 0x38E2, 0x38E3,
+    0x38E4, 0x38E5, 0x38E6, 0x38E7, 0x38E8, 0x38E9, 0x38EA, 0x38EB,
+    0x38EC, 0x38ED, 0x38EE, 0x38EF, 0x38F0, 0x38F1, 0x38F2, 0x38F3,
+    0x38F4, 0x38F5, 0x38F6, 0x38F7, 0x38F8, 0x38F9, 0x38FA, 0x38FB,
+    0x38FC, 0x38FD, 0x38FE, 0x38FF, 0x3900, 0x3901, 0x3902, 0x3903,
+    0x3904, 0x3905, 0x3906, 0x3907, 0x3908, 0x3909, 0x390A, 0x390B,
+    0x390C, 0x390D, 0x390E, 0x390F, 0x3910, 0x3911, 0x3912, 0x3913,
+    0x3914, 0x3915, 0x3916, 0x3917, 0x3919, 0x391A, 0x391B, 0x391C,
+    0x391D, 0x391E, 0x391F, 0x3920, 0x3921, 0x3922, 0x3923, 0x3924,
+    0x3925, 0x3926, 0x3927, 0x3928, 0x3929, 0x392A, 0x392B, 0x392C,
+    0x392D, 0x392E, 0x392F, 0x3930, 0x3931, 0x3932, 0x3933, 0x3934,
+    0x3935, 0x3936, 0x3937, 0x3938, 0x3939, 0x393A, 0x393B, 0x393C,
+    0x393D, 0x393E, 0x393F, 0x3940, 0x3941, 0x3942, 0x3943, 0x3944,
+    0x3945, 0x3946, 0x3947, 0x3948, 0x3949, 0x394A, 0x394B, 0x394C,
+    0x394D, 0x394E, 0x394F, 0x3950, 0x3951, 0x3952, 0x3953, 0x3954,
+    0x3955, 0x3956, 0x3957, 0x3958, 0x3959, 0x395A, 0x395B, 0x395C,
+    0x395D, 0x395E, 0x395F, 0x3960, 0x3961, 0x3962, 0x3963, 0x3964,
+    0x3965, 0x3966, 0x3967, 0x3968, 0x3969, 0x396A, 0x396B, 0x396C,
+    0x396D, 0x396F, 0x3970, 0x3971, 0x3972, 0x3973, 0x3974, 0x3975,
+    0x3976, 0x3977, 0x3978, 0x3979, 0x397A, 0x397B, 0x397C, 0x397D,
+    0x397E, 0x397F, 0x3980, 0x3981, 0x3982, 0x3983, 0x3984, 0x3985,
+    0x3986, 0x3987, 0x3988, 0x3989, 0x398A, 0x398B, 0x398C, 0x398D,
+    0x398E, 0x398F, 0x3990, 0x3991, 0x3992, 0x3993, 0x3994, 0x3995,
+    0x3996, 0x3997, 0x3998, 0x3999, 0x399A, 0x399B, 0x399C, 0x399D,
+    0x399E, 0x399F, 0x39A0, 0x39A1, 0x39A2, 0x39A3, 0x39A4, 0x39A5,
+    0x39A6, 0x39A7, 0x39A8, 0x39A9, 0x39AA, 0x39AB, 0x39AC, 0x39AD,
+    0x39AE, 0x39AF, 0x39B0, 0x39B1, 0x39B2, 0x39B3, 0x39B4, 0x39B5,
+    0x39B6, 0x39B7, 0x39B8, 0x39B9, 0x39BA, 0x39BB, 0x39BC, 0x39BD,
+    0x39BE, 0x39BF, 0x39C0, 0x39C1, 0x39C2, 0x39C3, 0x39C4, 0x39C5,
+    0x39C6, 0x39C7, 0x39C8, 0x39C9, 0x39CA, 0x39CB, 0x39CC, 0x39CD,
+    0x39CE, 0x39D1, 0x39D2, 0x39D3, 0x39D4, 0x39D5, 0x39D6, 0x39D7,
+    0x39D8, 0x39D9, 0x39DA, 0x39DB, 0x39DC, 0x39DD, 0x39DE, 0x39E0,
+    0x39E1, 0x39E2, 0x39E3, 0x39E4, 0x39E5, 0x39E6, 0x39E7, 0x39E8,
+    0x39E9, 0x39EA, 0x39EB, 0x39EC, 0x39ED, 0x39EE, 0x39EF, 0x39F0,
+    0x39F1, 0x39F2, 0x39F3, 0x39F4, 0x39F5, 0x39F6, 0x39F7, 0x39F8,
+    0x39F9, 0x39FA, 0x39FB, 0x39FC, 0x39FD, 0x39FE, 0x39FF, 0x3A00,
+    0x3A01, 0x3A02, 0x3A03, 0x3A04, 0x3A05, 0x3A06, 0x3A07, 0x3A08,
+    0x3A09, 0x3A0A, 0x3A0B, 0x3A0C, 0x3A0D, 0x3A0E, 0x3A0F, 0x3A10,
+    0x3A11, 0x3A12, 0x3A13, 0x3A14, 0x3A15, 0x3A16, 0x3A17, 0x3A18,
+    0x3A19, 0x3A1A, 0x3A1B, 0x3A1C, 0x3A1D, 0x3A1E, 0x3A1F, 0x3A20,
+    0x3A21, 0x3A22, 0x3A23, 0x3A24, 0x3A25, 0x3A26, 0x3A27, 0x3A28,
+    0x3A29, 0x3A2A, 0x3A2B, 0x3A2C, 0x3A2D, 0x3A2E, 0x3A2F, 0x3A30,
+    0x3A31, 0x3A32, 0x3A33, 0x3A34, 0x3A35, 0x3A36, 0x3A37, 0x3A38,
+    0x3A39, 0x3A3A, 0x3A3B, 0x3A3C, 0x3A3D, 0x3A3E, 0x3A3F, 0x3A40,
+    0x3A41, 0x3A42, 0x3A43, 0x3A44, 0x3A45, 0x3A46, 0x3A47, 0x3A48,
+    0x3A49, 0x3A4A, 0x3A4B, 0x3A4C, 0x3A4D, 0x3A4E, 0x3A4F, 0x3A50,
+    0x3A51, 0x3A52, 0x3A53, 0x3A54, 0x3A55, 0x3A56, 0x3A57, 0x3A58,
+    0x3A59, 0x3A5A, 0x3A5B, 0x3A5C, 0x3A5D, 0x3A5E, 0x3A5F, 0x3A60,
+    0x3A61, 0x3A62, 0x3A63, 0x3A64, 0x3A65, 0x3A66, 0x3A67, 0x3A68,
+    0x3A69, 0x3A6A, 0x3A6B, 0x3A6C, 0x3A6D, 0x3A6E, 0x3A6F, 0x3A70,
+    0x3A71, 0x3A72, 0x3A74, 0x3A75, 0x3A76, 0x3A77, 0x3A78, 0x3A79,
+    0x3A7A, 0x3A7B, 0x3A7C, 0x3A7D, 0x3A7E, 0x3A7F, 0x3A80, 0x3A81,
+    0x3A82, 0x3A83, 0x3A84, 0x3A85, 0x3A86, 0x3A87, 0x3A88, 0x3A89,
+    0x3A8A, 0x3A8B, 0x3A8C, 0x3A8D, 0x3A8E, 0x3A8F, 0x3A90, 0x3A91,
+    0x3A92, 0x3A93, 0x3A94, 0x3A95, 0x3A96, 0x3A97, 0x3A98, 0x3A99,
+    0x3A9A, 0x3A9B, 0x3A9C, 0x3A9D, 0x3A9E, 0x3A9F, 0x3AA0, 0x3AA1,
+    0x3AA2, 0x3AA3, 0x3AA4, 0x3AA5, 0x3AA6, 0x3AA7, 0x3AA8, 0x3AA9,
+    0x3AAA, 0x3AAB, 0x3AAC, 0x3AAD, 0x3AAE, 0x3AAF, 0x3AB0, 0x3AB1,
+    0x3AB2, 0x3AB3, 0x3AB4, 0x3AB5, 0x3AB6, 0x3AB7, 0x3AB8, 0x3AB9,
+    0x3ABA, 0x3ABB, 0x3ABC, 0x3ABD, 0x3ABE, 0x3ABF, 0x3AC0, 0x3AC1,
+    0x3AC2, 0x3AC3, 0x3AC4, 0x3AC5, 0x3AC6, 0x3AC7, 0x3AC8, 0x3AC9,
+    0x3ACA, 0x3ACB, 0x3ACC, 0x3ACD, 0x3ACE, 0x3ACF, 0x3AD0, 0x3AD1,
+    0x3AD2, 0x3AD3, 0x3AD4, 0x3AD5, 0x3AD6, 0x3AD7, 0x3AD8, 0x3AD9,
+    0x3ADA, 0x3ADB, 0x3ADC, 0x3ADD, 0x3ADE, 0x3ADF, 0x3AE0, 0x3AE1,
+    0x3AE2, 0x3AE3, 0x3AE4, 0x3AE5, 0x3AE6, 0x3AE7, 0x3AE8, 0x3AE9,
+    0x3AEA, 0x3AEB, 0x3AEC, 0x3AED, 0x3AEE, 0x3AEF, 0x3AF0, 0x3AF1,
+    0x3AF2, 0x3AF3, 0x3AF4, 0x3AF5, 0x3AF6, 0x3AF7, 0x3AF8, 0x3AF9,
+    0x3AFA, 0x3AFB, 0x3AFC, 0x3AFD, 0x3AFE, 0x3AFF, 0x3B00, 0x3B01,
+    0x3B02, 0x3B03, 0x3B04, 0x3B05, 0x3B06, 0x3B07, 0x3B08, 0x3B09,
+    0x3B0A, 0x3B0B, 0x3B0C, 0x3B0D, 0x3B0E, 0x3B0F, 0x3B10, 0x3B11,
+    0x3B12, 0x3B13, 0x3B14, 0x3B15, 0x3B16, 0x3B17, 0x3B18, 0x3B19,
+    0x3B1A, 0x3B1B, 0x3B1C, 0x3B1D, 0x3B1E, 0x3B1F, 0x3B20, 0x3B21,
+    0x3B22, 0x3B23, 0x3B24, 0x3B25, 0x3B26, 0x3B27, 0x3B28, 0x3B29,
+    0x3B2A, 0x3B2B, 0x3B2C, 0x3B2D, 0x3B2E, 0x3B2F, 0x3B30, 0x3B31,
+    0x3B32, 0x3B33, 0x3B34, 0x3B35, 0x3B36, 0x3B37, 0x3B38, 0x3B39,
+    0x3B3A, 0x3B3B, 0x3B3C, 0x3B3D, 0x3B3E, 0x3B3F, 0x3B40, 0x3B41,
+    0x3B42, 0x3B43, 0x3B44, 0x3B45, 0x3B46, 0x3B47, 0x3B48, 0x3B49,
+    0x3B4A, 0x3B4B, 0x3B4C, 0x3B4D, 0x3B4F, 0x3B50, 0x3B51, 0x3B52,
+    0x3B53, 0x3B54, 0x3B55, 0x3B56, 0x3B57, 0x3B58, 0x3B59, 0x3B5A,
+    0x3B5B, 0x3B5C, 0x3B5D, 0x3B5E, 0x3B5F, 0x3B60, 0x3B61, 0x3B62,
+    0x3B63, 0x3B64, 0x3B65, 0x3B66, 0x3B67, 0x3B68, 0x3B69, 0x3B6A,
+    0x3B6B, 0x3B6C, 0x3B6D, 0x3B6E, 0x3B6F, 0x3B70, 0x3B71, 0x3B72,
+    0x3B73, 0x3B74, 0x3B75, 0x3B76, 0x3B77, 0x3B78, 0x3B79, 0x3B7A,
+    0x3B7B, 0x3B7C, 0x3B7D, 0x3B7E, 0x3B7F, 0x3B80, 0x3B81, 0x3B82,
+    0x3B83, 0x3B84, 0x3B85, 0x3B86, 0x3B87, 0x3B88, 0x3B89, 0x3B8A,
+    0x3B8B, 0x3B8C, 0x3B8D, 0x3B8E, 0x3B8F, 0x3B90, 0x3B91, 0x3B92,
+    0x3B93, 0x3B94, 0x3B95, 0x3B96, 0x3B97, 0x3B98, 0x3B99, 0x3B9A,
+    0x3B9B, 0x3B9C, 0x3B9D, 0x3B9E, 0x3B9F, 0x3BA0, 0x3BA1, 0x3BA2,
+    0x3BA3, 0x3BA4, 0x3BA5, 0x3BA6, 0x3BA7, 0x3BA8, 0x3BA9, 0x3BAA,
+    0x3BAB, 0x3BAC, 0x3BAD, 0x3BAE, 0x3BAF, 0x3BB0, 0x3BB1, 0x3BB2,
+    0x3BB3, 0x3BB4, 0x3BB5, 0x3BB6, 0x3BB7, 0x3BB8, 0x3BB9, 0x3BBA,
+    0x3BBB, 0x3BBC, 0x3BBD, 0x3BBE, 0x3BBF, 0x3BC0, 0x3BC1, 0x3BC2,
+    0x3BC3, 0x3BC4, 0x3BC5, 0x3BC6, 0x3BC7, 0x3BC8, 0x3BC9, 0x3BCA,
+    0x3BCB, 0x3BCC, 0x3BCD, 0x3BCE, 0x3BCF, 0x3BD0, 0x3BD1, 0x3BD2,
+    0x3BD3, 0x3BD4, 0x3BD5, 0x3BD6, 0x3BD7, 0x3BD8, 0x3BD9, 0x3BDA,
+    0x3BDB, 0x3BDC, 0x3BDD, 0x3BDE, 0x3BDF, 0x3BE0, 0x3BE1, 0x3BE2,
+    0x3BE3, 0x3BE4, 0x3BE5, 0x3BE6, 0x3BE7, 0x3BE8, 0x3BE9, 0x3BEA,
+    0x3BEB, 0x3BEC, 0x3BED, 0x3BEE, 0x3BEF, 0x3BF0, 0x3BF1, 0x3BF2,
+    0x3BF3, 0x3BF4, 0x3BF5, 0x3BF6, 0x3BF7, 0x3BF8, 0x3BF9, 0x3BFA,
+    0x3BFB, 0x3BFC, 0x3BFD, 0x3BFE, 0x3BFF, 0x3C00, 0x3C01, 0x3C02,
+    0x3C03, 0x3C04, 0x3C05, 0x3C06, 0x3C07, 0x3C08, 0x3C09, 0x3C0A,
+    0x3C0B, 0x3C0C, 0x3C0D, 0x3C0E, 0x3C0F, 0x3C10, 0x3C11, 0x3C12,
+    0x3C13, 0x3C14, 0x3C15, 0x3C16, 0x3C17, 0x3C18, 0x3C19, 0x3C1A,
+    0x3C1B, 0x3C1C, 0x3C1D, 0x3C1E, 0x3C1F, 0x3C20, 0x3C21, 0x3C22,
+    0x3C23, 0x3C24, 0x3C25, 0x3C26, 0x3C27, 0x3C28, 0x3C29, 0x3C2A,
+    0x3C2B, 0x3C2C, 0x3C2D, 0x3C2E, 0x3C2F, 0x3C30, 0x3C31, 0x3C32,
+    0x3C33, 0x3C34, 0x3C35, 0x3C36, 0x3C37, 0x3C38, 0x3C39, 0x3C3A,
+    0x3C3B, 0x3C3C, 0x3C3D, 0x3C3E, 0x3C3F, 0x3C40, 0x3C41, 0x3C42,
+    0x3C43, 0x3C44, 0x3C45, 0x3C46, 0x3C47, 0x3C48, 0x3C49, 0x3C4A,
+    0x3C4B, 0x3C4C, 0x3C4D, 0x3C4E, 0x3C4F, 0x3C50, 0x3C51, 0x3C52,
+    0x3C53, 0x3C54, 0x3C55, 0x3C56, 0x3C57, 0x3C58, 0x3C59, 0x3C5A,
+    0x3C5B, 0x3C5C, 0x3C5D, 0x3C5E, 0x3C5F, 0x3C60, 0x3C61, 0x3C62,
+    0x3C63, 0x3C64, 0x3C65, 0x3C66, 0x3C67, 0x3C68, 0x3C69, 0x3C6A,
+    0x3C6B, 0x3C6C, 0x3C6D, 0x3C6F, 0x3C70, 0x3C71, 0x3C72, 0x3C73,
+    0x3C74, 0x3C75, 0x3C76, 0x3C77, 0x3C78, 0x3C79, 0x3C7A, 0x3C7B,
+    0x3C7C, 0x3C7D, 0x3C7E, 0x3C7F, 0x3C80, 0x3C81, 0x3C82, 0x3C83,
+    0x3C84, 0x3C85, 0x3C86, 0x3C87, 0x3C88, 0x3C89, 0x3C8A, 0x3C8B,
+    0x3C8C, 0x3C8D, 0x3C8E, 0x3C8F, 0x3C90, 0x3C91, 0x3C92, 0x3C93,
+    0x3C94, 0x3C95, 0x3C96, 0x3C97, 0x3C98, 0x3C99, 0x3C9A, 0x3C9B,
+    0x3C9C, 0x3C9D, 0x3C9E, 0x3C9F, 0x3CA0, 0x3CA1, 0x3CA2, 0x3CA3,
+    0x3CA4, 0x3CA5, 0x3CA6, 0x3CA7, 0x3CA8, 0x3CA9, 0x3CAA, 0x3CAB,
+    0x3CAC, 0x3CAD, 0x3CAE, 0x3CAF, 0x3CB0, 0x3CB1, 0x3CB2, 0x3CB3,
+    0x3CB4, 0x3CB5, 0x3CB6, 0x3CB7, 0x3CB8, 0x3CB9, 0x3CBA, 0x3CBB,
+    0x3CBC, 0x3CBD, 0x3CBE, 0x3CBF, 0x3CC0, 0x3CC1, 0x3CC2, 0x3CC3,
+    0x3CC4, 0x3CC5, 0x3CC6, 0x3CC7, 0x3CC8, 0x3CC9, 0x3CCA, 0x3CCB,
+    0x3CCC, 0x3CCD, 0x3CCE, 0x3CCF, 0x3CD0, 0x3CD1, 0x3CD2, 0x3CD3,
+    0x3CD4, 0x3CD5, 0x3CD6, 0x3CD7, 0x3CD8, 0x3CD9, 0x3CDA, 0x3CDB,
+    0x3CDC, 0x3CDD, 0x3CDE, 0x3CDF, 0x3CE1, 0x3CE2, 0x3CE3, 0x3CE4,
+    0x3CE5, 0x3CE6, 0x3CE7, 0x3CE8, 0x3CE9, 0x3CEA, 0x3CEB, 0x3CEC,
+    0x3CED, 0x3CEE, 0x3CEF, 0x3CF0, 0x3CF1, 0x3CF2, 0x3CF3, 0x3CF4,
+    0x3CF5, 0x3CF6, 0x3CF7, 0x3CF8, 0x3CF9, 0x3CFA, 0x3CFB, 0x3CFC,
+    0x3CFD, 0x3CFE, 0x3CFF, 0x3D00, 0x3D01, 0x3D02, 0x3D03, 0x3D04,
+    0x3D05, 0x3D06, 0x3D07, 0x3D08, 0x3D09, 0x3D0A, 0x3D0B, 0x3D0C,
+    0x3D0D, 0x3D0E, 0x3D0F, 0x3D10, 0x3D11, 0x3D12, 0x3D13, 0x3D14,
+    0x3D15, 0x3D16, 0x3D17, 0x3D18, 0x3D19, 0x3D1A, 0x3D1B, 0x3D1C,
+    0x3D1D, 0x3D1E, 0x3D1F, 0x3D20, 0x3D21, 0x3D22, 0x3D23, 0x3D24,
+    0x3D25, 0x3D26, 0x3D27, 0x3D28, 0x3D29, 0x3D2A, 0x3D2B, 0x3D2C,
+    0x3D2D, 0x3D2E, 0x3D2F, 0x3D30, 0x3D31, 0x3D32, 0x3D33, 0x3D34,
+    0x3D35, 0x3D36, 0x3D37, 0x3D38, 0x3D39, 0x3D3A, 0x3D3B, 0x3D3C,
+    0x3D3D, 0x3D3E, 0x3D3F, 0x3D40, 0x3D41, 0x3D42, 0x3D43, 0x3D44,
+    0x3D45, 0x3D46, 0x3D47, 0x3D48, 0x3D49, 0x3D4A, 0x3D4B, 0x3D4C,
+    0x3D4D, 0x3D4E, 0x3D4F, 0x3D50, 0x3D51, 0x3D52, 0x3D53, 0x3D54,
+    0x3D55, 0x3D56, 0x3D57, 0x3D58, 0x3D59, 0x3D5A, 0x3D5B, 0x3D5C,
+    0x3D5D, 0x3D5E, 0x3D5F, 0x3D60, 0x3D61, 0x3D62, 0x3D63, 0x3D64,
+    0x3D65, 0x3D66, 0x3D67, 0x3D68, 0x3D69, 0x3D6A, 0x3D6B, 0x3D6C,
+    0x3D6D, 0x3D6E, 0x3D6F, 0x3D70, 0x3D71, 0x3D72, 0x3D73, 0x3D74,
+    0x3D75, 0x3D76, 0x3D77, 0x3D78, 0x3D79, 0x3D7A, 0x3D7B, 0x3D7C,
+    0x3D7D, 0x3D7E, 0x3D7F, 0x3D80, 0x3D81, 0x3D82, 0x3D83, 0x3D84,
+    0x3D85, 0x3D86, 0x3D87, 0x3D88, 0x3D89, 0x3D8A, 0x3D8B, 0x3D8C,
+    0x3D8D, 0x3D8E, 0x3D8F, 0x3D90, 0x3D91, 0x3D92, 0x3D93, 0x3D94,
+    0x3D95, 0x3D96, 0x3D97, 0x3D98, 0x3D99, 0x3D9A, 0x3D9B, 0x3D9C,
+    0x3D9D, 0x3D9E, 0x3D9F, 0x3DA0, 0x3DA1, 0x3DA2, 0x3DA3, 0x3DA4,
+    0x3DA5, 0x3DA6, 0x3DA7, 0x3DA8, 0x3DA9, 0x3DAA, 0x3DAB, 0x3DAC,
+    0x3DAD, 0x3DAE, 0x3DAF, 0x3DB0, 0x3DB1, 0x3DB2, 0x3DB3, 0x3DB4,
+    0x3DB5, 0x3DB6, 0x3DB7, 0x3DB8, 0x3DB9, 0x3DBA, 0x3DBB, 0x3DBC,
+    0x3DBD, 0x3DBE, 0x3DBF, 0x3DC0, 0x3DC1, 0x3DC2, 0x3DC3, 0x3DC4,
+    0x3DC5, 0x3DC6, 0x3DC7, 0x3DC8, 0x3DC9, 0x3DCA, 0x3DCB, 0x3DCC,
+    0x3DCD, 0x3DCE, 0x3DCF, 0x3DD0, 0x3DD1, 0x3DD2, 0x3DD3, 0x3DD4,
+    0x3DD5, 0x3DD6, 0x3DD7, 0x3DD8, 0x3DD9, 0x3DDA, 0x3DDB, 0x3DDC,
+    0x3DDD, 0x3DDE, 0x3DDF, 0x3DE0, 0x3DE1, 0x3DE2, 0x3DE3, 0x3DE4,
+    0x3DE5, 0x3DE6, 0x3DE7, 0x3DE8, 0x3DE9, 0x3DEA, 0x3DEB, 0x3DEC,
+    0x3DED, 0x3DEE, 0x3DEF, 0x3DF0, 0x3DF1, 0x3DF2, 0x3DF3, 0x3DF4,
+    0x3DF5, 0x3DF6, 0x3DF7, 0x3DF8, 0x3DF9, 0x3DFA, 0x3DFB, 0x3DFC,
+    0x3DFD, 0x3DFE, 0x3DFF, 0x3E00, 0x3E01, 0x3E02, 0x3E03, 0x3E04,
+    0x3E05, 0x3E06, 0x3E07, 0x3E08, 0x3E09, 0x3E0A, 0x3E0B, 0x3E0C,
+    0x3E0D, 0x3E0E, 0x3E0F, 0x3E10, 0x3E11, 0x3E12, 0x3E13, 0x3E14,
+    0x3E15, 0x3E16, 0x3E17, 0x3E18, 0x3E19, 0x3E1A, 0x3E1B, 0x3E1C,
+    0x3E1D, 0x3E1E, 0x3E1F, 0x3E20, 0x3E21, 0x3E22, 0x3E23, 0x3E24,
+    0x3E25, 0x3E26, 0x3E27, 0x3E28, 0x3E29, 0x3E2A, 0x3E2B, 0x3E2C,
+    0x3E2D, 0x3E2E, 0x3E2F, 0x3E30, 0x3E31, 0x3E32, 0x3E33, 0x3E34,
+    0x3E35, 0x3E36, 0x3E37, 0x3E38, 0x3E39, 0x3E3A, 0x3E3B, 0x3E3C,
+    0x3E3D, 0x3E3E, 0x3E3F, 0x3E40, 0x3E41, 0x3E42, 0x3E43, 0x3E44,
+    0x3E45, 0x3E46, 0x3E47, 0x3E48, 0x3E49, 0x3E4A, 0x3E4B, 0x3E4C,
+    0x3E4D, 0x3E4E, 0x3E4F, 0x3E50, 0x3E51, 0x3E52, 0x3E53, 0x3E54,
+    0x3E55, 0x3E56, 0x3E57, 0x3E58, 0x3E59, 0x3E5A, 0x3E5B, 0x3E5C,
+    0x3E5D, 0x3E5E, 0x3E5F, 0x3E60, 0x3E61, 0x3E62, 0x3E63, 0x3E64,
+    0x3E65, 0x3E66, 0x3E67, 0x3E68, 0x3E69, 0x3E6A, 0x3E6B, 0x3E6C,
+    0x3E6D, 0x3E6E, 0x3E6F, 0x3E70, 0x3E71, 0x3E72, 0x3E73, 0x3E74,
+    0x3E75, 0x3E76, 0x3E77, 0x3E78, 0x3E79, 0x3E7A, 0x3E7B, 0x3E7C,
+    0x3E7D, 0x3E7E, 0x3E7F, 0x3E80, 0x3E81, 0x3E82, 0x3E83, 0x3E84,
+    0x3E85, 0x3E86, 0x3E87, 0x3E88, 0x3E89, 0x3E8A, 0x3E8B, 0x3E8C,
+    0x3E8D, 0x3E8E, 0x3E8F, 0x3E90, 0x3E91, 0x3E92, 0x3E93, 0x3E94,
+    0x3E95, 0x3E96, 0x3E97, 0x3E98, 0x3E99, 0x3E9A, 0x3E9B, 0x3E9C,
+    0x3E9D, 0x3E9E, 0x3E9F, 0x3EA0, 0x3EA1, 0x3EA2, 0x3EA3, 0x3EA4,
+    0x3EA5, 0x3EA6, 0x3EA7, 0x3EA8, 0x3EA9, 0x3EAA, 0x3EAB, 0x3EAC,
+    0x3EAD, 0x3EAE, 0x3EAF, 0x3EB0, 0x3EB1, 0x3EB2, 0x3EB3, 0x3EB4,
+    0x3EB5, 0x3EB6, 0x3EB7, 0x3EB8, 0x3EB9, 0x3EBA, 0x3EBB, 0x3EBC,
+    0x3EBD, 0x3EBE, 0x3EBF, 0x3EC0, 0x3EC1, 0x3EC2, 0x3EC3, 0x3EC4,
+    0x3EC5, 0x3EC6, 0x3EC7, 0x3EC8, 0x3EC9, 0x3ECA, 0x3ECB, 0x3ECC,
+    0x3ECD, 0x3ECE, 0x3ECF, 0x3ED0, 0x3ED1, 0x3ED2, 0x3ED3, 0x3ED4,
+    0x3ED5, 0x3ED6, 0x3ED7, 0x3ED8, 0x3ED9, 0x3EDA, 0x3EDB, 0x3EDC,
+    0x3EDD, 0x3EDE, 0x3EDF, 0x3EE0, 0x3EE1, 0x3EE2, 0x3EE3, 0x3EE4,
+    0x3EE5, 0x3EE6, 0x3EE7, 0x3EE8, 0x3EE9, 0x3EEA, 0x3EEB, 0x3EEC,
+    0x3EED, 0x3EEE, 0x3EEF, 0x3EF0, 0x3EF1, 0x3EF2, 0x3EF3, 0x3EF4,
+    0x3EF5, 0x3EF6, 0x3EF7, 0x3EF8, 0x3EF9, 0x3EFA, 0x3EFB, 0x3EFC,
+    0x3EFD, 0x3EFE, 0x3EFF, 0x3F00, 0x3F01, 0x3F02, 0x3F03, 0x3F04,
+    0x3F05, 0x3F06, 0x3F07, 0x3F08, 0x3F09, 0x3F0A, 0x3F0B, 0x3F0C,
+    0x3F0D, 0x3F0E, 0x3F0F, 0x3F10, 0x3F11, 0x3F12, 0x3F13, 0x3F14,
+    0x3F15, 0x3F16, 0x3F17, 0x3F18, 0x3F19, 0x3F1A, 0x3F1B, 0x3F1C,
+    0x3F1D, 0x3F1E, 0x3F1F, 0x3F20, 0x3F21, 0x3F22, 0x3F23, 0x3F24,
+    0x3F25, 0x3F26, 0x3F27, 0x3F28, 0x3F29, 0x3F2A, 0x3F2B, 0x3F2C,
+    0x3F2D, 0x3F2E, 0x3F2F, 0x3F30, 0x3F31, 0x3F32, 0x3F33, 0x3F34,
+    0x3F35, 0x3F36, 0x3F37, 0x3F38, 0x3F39, 0x3F3A, 0x3F3B, 0x3F3C,
+    0x3F3D, 0x3F3E, 0x3F3F, 0x3F40, 0x3F41, 0x3F42, 0x3F43, 0x3F44,
+    0x3F45, 0x3F46, 0x3F47, 0x3F48, 0x3F49, 0x3F4A, 0x3F4B, 0x3F4C,
+    0x3F4D, 0x3F4E, 0x3F4F, 0x3F50, 0x3F51, 0x3F52, 0x3F53, 0x3F54,
+    0x3F55, 0x3F56, 0x3F57, 0x3F58, 0x3F59, 0x3F5A, 0x3F5B, 0x3F5C,
+    0x3F5D, 0x3F5E, 0x3F5F, 0x3F60, 0x3F61, 0x3F62, 0x3F63, 0x3F64,
+    0x3F65, 0x3F66, 0x3F67, 0x3F68, 0x3F69, 0x3F6A, 0x3F6B, 0x3F6C,
+    0x3F6D, 0x3F6E, 0x3F6F, 0x3F70, 0x3F71, 0x3F72, 0x3F73, 0x3F74,
+    0x3F75, 0x3F76, 0x3F77, 0x3F78, 0x3F79, 0x3F7A, 0x3F7B, 0x3F7C,
+    0x3F7D, 0x3F7E, 0x3F7F, 0x3F80, 0x3F81, 0x3F82, 0x3F83, 0x3F84,
+    0x3F85, 0x3F86, 0x3F87, 0x3F88, 0x3F89, 0x3F8A, 0x3F8B, 0x3F8C,
+    0x3F8D, 0x3F8E, 0x3F8F, 0x3F90, 0x3F91, 0x3F92, 0x3F93, 0x3F94,
+    0x3F95, 0x3F96, 0x3F97, 0x3F98, 0x3F99, 0x3F9A, 0x3F9B, 0x3F9C,
+    0x3F9D, 0x3F9E, 0x3F9F, 0x3FA0, 0x3FA1, 0x3FA2, 0x3FA3, 0x3FA4,
+    0x3FA5, 0x3FA6, 0x3FA7, 0x3FA8, 0x3FA9, 0x3FAA, 0x3FAB, 0x3FAC,
+    0x3FAD, 0x3FAE, 0x3FAF, 0x3FB0, 0x3FB1, 0x3FB2, 0x3FB3, 0x3FB4,
+    0x3FB5, 0x3FB6, 0x3FB7, 0x3FB8, 0x3FB9, 0x3FBA, 0x3FBB, 0x3FBC,
+    0x3FBD, 0x3FBE, 0x3FBF, 0x3FC0, 0x3FC1, 0x3FC2, 0x3FC3, 0x3FC4,
+    0x3FC5, 0x3FC6, 0x3FC7, 0x3FC8, 0x3FC9, 0x3FCA, 0x3FCB, 0x3FCC,
+    0x3FCD, 0x3FCE, 0x3FCF, 0x3FD0, 0x3FD1, 0x3FD2, 0x3FD3, 0x3FD4,
+    0x3FD5, 0x3FD6, 0x3FD7, 0x3FD8, 0x3FD9, 0x3FDA, 0x3FDB, 0x3FDC,
+    0x3FDD, 0x3FDE, 0x3FDF, 0x3FE0, 0x3FE1, 0x3FE2, 0x3FE3, 0x3FE4,
+    0x3FE5, 0x3FE6, 0x3FE7, 0x3FE8, 0x3FE9, 0x3FEA, 0x3FEB, 0x3FEC,
+    0x3FED, 0x3FEE, 0x3FEF, 0x3FF0, 0x3FF1, 0x3FF2, 0x3FF3, 0x3FF4,
+    0x3FF5, 0x3FF6, 0x3FF7, 0x3FF8, 0x3FF9, 0x3FFA, 0x3FFB, 0x3FFC,
+    0x3FFD, 0x3FFE, 0x3FFF, 0x4000, 0x4001, 0x4002, 0x4003, 0x4004,
+    0x4005, 0x4006, 0x4007, 0x4008, 0x4009, 0x400A, 0x400B, 0x400C,
+    0x400D, 0x400E, 0x400F, 0x4010, 0x4011, 0x4012, 0x4013, 0x4014,
+    0x4015, 0x4016, 0x4017, 0x4018, 0x4019, 0x401A, 0x401B, 0x401C,
+    0x401D, 0x401E, 0x401F, 0x4020, 0x4021, 0x4022, 0x4023, 0x4024,
+    0x4025, 0x4026, 0x4027, 0x4028, 0x4029, 0x402A, 0x402B, 0x402C,
+    0x402D, 0x402E, 0x402F, 0x4030, 0x4031, 0x4032, 0x4033, 0x4034,
+    0x4035, 0x4036, 0x4037, 0x4038, 0x4039, 0x403A, 0x403B, 0x403C,
+    0x403D, 0x403E, 0x403F, 0x4040, 0x4041, 0x4042, 0x4043, 0x4044,
+    0x4045, 0x4046, 0x4047, 0x4048, 0x4049, 0x404A, 0x404B, 0x404C,
+    0x404D, 0x404E, 0x404F, 0x4050, 0x4051, 0x4052, 0x4053, 0x4054,
+    0x4055, 0x4057, 0x4058, 0x4059, 0x405A, 0x405B, 0x405C, 0x405D,
+    0x405E, 0x405F, 0x4060, 0x4061, 0x4062, 0x4063, 0x4064, 0x4065,
+    0x4066, 0x4067, 0x4068, 0x4069, 0x406A, 0x406B, 0x406C, 0x406D,
+    0x406E, 0x406F, 0x4070, 0x4071, 0x4072, 0x4073, 0x4074, 0x4075,
+    0x4076, 0x4077, 0x4078, 0x4079, 0x407A, 0x407B, 0x407C, 0x407D,
+    0x407E, 0x407F, 0x4080, 0x4081, 0x4082, 0x4083, 0x4084, 0x4085,
+    0x4086, 0x4087, 0x4088, 0x4089, 0x408A, 0x408B, 0x408C, 0x408D,
+    0x408E, 0x408F, 0x4090, 0x4091, 0x4092, 0x4093, 0x4094, 0x4095,
+    0x4096, 0x4097, 0x4098, 0x4099, 0x409A, 0x409B, 0x409C, 0x409D,
+    0x409E, 0x409F, 0x40A0, 0x40A1, 0x40A2, 0x40A3, 0x40A4, 0x40A5,
+    0x40A6, 0x40A7, 0x40A8, 0x40A9, 0x40AA, 0x40AB, 0x40AC, 0x40AD,
+    0x40AE, 0x40AF, 0x40B0, 0x40B1, 0x40B2, 0x40B3, 0x40B4, 0x40B5,
+    0x40B6, 0x40B7, 0x40B8, 0x40B9, 0x40BA, 0x40BB, 0x40BC, 0x40BD,
+    0x40BE, 0x40BF, 0x40C0, 0x40C1, 0x40C2, 0x40C3, 0x40C4, 0x40C5,
+    0x40C6, 0x40C7, 0x40C8, 0x40C9, 0x40CA, 0x40CB, 0x40CC, 0x40CD,
+    0x40CE, 0x40CF, 0x40D0, 0x40D1, 0x40D2, 0x40D3, 0x40D4, 0x40D5,
+    0x40D6, 0x40D7, 0x40D8, 0x40D9, 0x40DA, 0x40DB, 0x40DC, 0x40DD,
+    0x40DE, 0x40DF, 0x40E0, 0x40E1, 0x40E2, 0x40E3, 0x40E4, 0x40E5,
+    0x40E6, 0x40E7, 0x40E8, 0x40E9, 0x40EA, 0x40EB, 0x40EC, 0x40ED,
+    0x40EE, 0x40EF, 0x40F0, 0x40F1, 0x40F2, 0x40F3, 0x40F4, 0x40F5,
+    0x40F6, 0x40F7, 0x40F8, 0x40F9, 0x40FA, 0x40FB, 0x40FC, 0x40FD,
+    0x40FE, 0x40FF, 0x4100, 0x4101, 0x4102, 0x4103, 0x4104, 0x4105,
+    0x4106, 0x4107, 0x4108, 0x4109, 0x410A, 0x410B, 0x410C, 0x410D,
+    0x410E, 0x410F, 0x4110, 0x4111, 0x4112, 0x4113, 0x4114, 0x4115,
+    0x4116, 0x4117, 0x4118, 0x4119, 0x411A, 0x411B, 0x411C, 0x411D,
+    0x411E, 0x411F, 0x4120, 0x4121, 0x4122, 0x4123, 0x4124, 0x4125,
+    0x4126, 0x4127, 0x4128, 0x4129, 0x412A, 0x412B, 0x412C, 0x412D,
+    0x412E, 0x412F, 0x4130, 0x4131, 0x4132, 0x4133, 0x4134, 0x4135,
+    0x4136, 0x4137, 0x4138, 0x4139, 0x413A, 0x413B, 0x413C, 0x413D,
+    0x413E, 0x413F, 0x4140, 0x4141, 0x4142, 0x4143, 0x4144, 0x4145,
+    0x4146, 0x4147, 0x4148, 0x4149, 0x414A, 0x414B, 0x414C, 0x414D,
+    0x414E, 0x414F, 0x4150, 0x4151, 0x4152, 0x4153, 0x4154, 0x4155,
+    0x4156, 0x4157, 0x4158, 0x4159, 0x415A, 0x415B, 0x415C, 0x415D,
+    0x415E, 0x4160, 0x4161, 0x4162, 0x4163, 0x4164, 0x4165, 0x4166,
+    0x4167, 0x4168, 0x4169, 0x416A, 0x416B, 0x416C, 0x416D, 0x416E,
+    0x416F, 0x4170, 0x4171, 0x4172, 0x4173, 0x4174, 0x4175, 0x4176,
+    0x4177, 0x4178, 0x4179, 0x417A, 0x417B, 0x417C, 0x417D, 0x417E,
+    0x417F, 0x4180, 0x4181, 0x4182, 0x4183, 0x4184, 0x4185, 0x4186,
+    0x4187, 0x4188, 0x4189, 0x418A, 0x418B, 0x418C, 0x418D, 0x418E,
+    0x418F, 0x4190, 0x4191, 0x4192, 0x4193, 0x4194, 0x4195, 0x4196,
+    0x4197, 0x4198, 0x4199, 0x419A, 0x419B, 0x419C, 0x419D, 0x419E,
+    0x419F, 0x41A0, 0x41A1, 0x41A2, 0x41A3, 0x41A4, 0x41A5, 0x41A6,
+    0x41A7, 0x41A8, 0x41A9, 0x41AA, 0x41AB, 0x41AC, 0x41AD, 0x41AE,
+    0x41AF, 0x41B0, 0x41B1, 0x41B2, 0x41B3, 0x41B4, 0x41B5, 0x41B6,
+    0x41B7, 0x41B8, 0x41B9, 0x41BA, 0x41BB, 0x41BC, 0x41BD, 0x41BE,
+    0x41BF, 0x41C0, 0x41C1, 0x41C2, 0x41C3, 0x41C4, 0x41C5, 0x41C6,
+    0x41C7, 0x41C8, 0x41C9, 0x41CA, 0x41CB, 0x41CC, 0x41CD, 0x41CE,
+    0x41CF, 0x41D0, 0x41D1, 0x41D2, 0x41D3, 0x41D4, 0x41D5, 0x41D6,
+    0x41D7, 0x41D8, 0x41D9, 0x41DA, 0x41DB, 0x41DC, 0x41DD, 0x41DE,
+    0x41DF, 0x41E0, 0x41E1, 0x41E2, 0x41E3, 0x41E4, 0x41E5, 0x41E6,
+    0x41E7, 0x41E8, 0x41E9, 0x41EA, 0x41EB, 0x41EC, 0x41ED, 0x41EE,
+    0x41EF, 0x41F0, 0x41F1, 0x41F2, 0x41F3, 0x41F4, 0x41F5, 0x41F6,
+    0x41F7, 0x41F8, 0x41F9, 0x41FA, 0x41FB, 0x41FC, 0x41FD, 0x41FE,
+    0x41FF, 0x4200, 0x4201, 0x4202, 0x4203, 0x4204, 0x4205, 0x4206,
+    0x4207, 0x4208, 0x4209, 0x420A, 0x420B, 0x420C, 0x420D, 0x420E,
+    0x420F, 0x4210, 0x4211, 0x4212, 0x4213, 0x4214, 0x4215, 0x4216,
+    0x4217, 0x4218, 0x4219, 0x421A, 0x421B, 0x421C, 0x421D, 0x421E,
+    0x421F, 0x4220, 0x4221, 0x4222, 0x4223, 0x4224, 0x4225, 0x4226,
+    0x4227, 0x4228, 0x4229, 0x422A, 0x422B, 0x422C, 0x422D, 0x422E,
+    0x422F, 0x4230, 0x4231, 0x4232, 0x4233, 0x4234, 0x4235, 0x4236,
+    0x4237, 0x4238, 0x4239, 0x423A, 0x423B, 0x423C, 0x423D, 0x423E,
+    0x423F, 0x4240, 0x4241, 0x4242, 0x4243, 0x4244, 0x4245, 0x4246,
+    0x4247, 0x4248, 0x4249, 0x424A, 0x424B, 0x424C, 0x424D, 0x424E,
+    0x424F, 0x4250, 0x4251, 0x4252, 0x4253, 0x4254, 0x4255, 0x4256,
+    0x4257, 0x4258, 0x4259, 0x425A, 0x425B, 0x425C, 0x425D, 0x425E,
+    0x425F, 0x4260, 0x4261, 0x4262, 0x4263, 0x4264, 0x4265, 0x4266,
+    0x4267, 0x4268, 0x4269, 0x426A, 0x426B, 0x426C, 0x426D, 0x426E,
+    0x426F, 0x4270, 0x4271, 0x4272, 0x4273, 0x4274, 0x4275, 0x4276,
+    0x4277, 0x4278, 0x4279, 0x427A, 0x427B, 0x427C, 0x427D, 0x427E,
+    0x427F, 0x4280, 0x4281, 0x4282, 0x4283, 0x4284, 0x4285, 0x4286,
+    0x4287, 0x4288, 0x4289, 0x428A, 0x428B, 0x428C, 0x428D, 0x428E,
+    0x428F, 0x4290, 0x4291, 0x4292, 0x4293, 0x4294, 0x4295, 0x4296,
+    0x4297, 0x4298, 0x4299, 0x429A, 0x429B, 0x429C, 0x429D, 0x429E,
+    0x429F, 0x42A0, 0x42A1, 0x42A2, 0x42A3, 0x42A4, 0x42A5, 0x42A6,
+    0x42A7, 0x42A8, 0x42A9, 0x42AA, 0x42AB, 0x42AC, 0x42AD, 0x42AE,
+    0x42AF, 0x42B0, 0x42B1, 0x42B2, 0x42B3, 0x42B4, 0x42B5, 0x42B6,
+    0x42B7, 0x42B8, 0x42B9, 0x42BA, 0x42BB, 0x42BC, 0x42BD, 0x42BE,
+    0x42BF, 0x42C0, 0x42C1, 0x42C2, 0x42C3, 0x42C4, 0x42C5, 0x42C6,
+    0x42C7, 0x42C8, 0x42C9, 0x42CA, 0x42CB, 0x42CC, 0x42CD, 0x42CE,
+    0x42CF, 0x42D0, 0x42D1, 0x42D2, 0x42D3, 0x42D4, 0x42D5, 0x42D6,
+    0x42D7, 0x42D8, 0x42D9, 0x42DA, 0x42DB, 0x42DC, 0x42DD, 0x42DE,
+    0x42DF, 0x42E0, 0x42E1, 0x42E2, 0x42E3, 0x42E4, 0x42E5, 0x42E6,
+    0x42E7, 0x42E8, 0x42E9, 0x42EA, 0x42EB, 0x42EC, 0x42ED, 0x42EE,
+    0x42EF, 0x42F0, 0x42F1, 0x42F2, 0x42F3, 0x42F4, 0x42F5, 0x42F6,
+    0x42F7, 0x42F8, 0x42F9, 0x42FA, 0x42FB, 0x42FC, 0x42FD, 0x42FE,
+    0x42FF, 0x4300, 0x4301, 0x4302, 0x4303, 0x4304, 0x4305, 0x4306,
+    0x4307, 0x4308, 0x4309, 0x430A, 0x430B, 0x430C, 0x430D, 0x430E,
+    0x430F, 0x4310, 0x4311, 0x4312, 0x4313, 0x4314, 0x4315, 0x4316,
+    0x4317, 0x4318, 0x4319, 0x431A, 0x431B, 0x431C, 0x431D, 0x431E,
+    0x431F, 0x4320, 0x4321, 0x4322, 0x4323, 0x4324, 0x4325, 0x4326,
+    0x4327, 0x4328, 0x4329, 0x432A, 0x432B, 0x432C, 0x432D, 0x432E,
+    0x432F, 0x4330, 0x4331, 0x4332, 0x4333, 0x4334, 0x4335, 0x4336,
+    0x4338, 0x4339, 0x433A, 0x433B, 0x433C, 0x433D, 0x433E, 0x433F,
+    0x4340, 0x4341, 0x4342, 0x4343, 0x4344, 0x4345, 0x4346, 0x4347,
+    0x4348, 0x4349, 0x434A, 0x434B, 0x434C, 0x434D, 0x434E, 0x434F,
+    0x4350, 0x4351, 0x4352, 0x4353, 0x4354, 0x4355, 0x4356, 0x4357,
+    0x4358, 0x4359, 0x435A, 0x435B, 0x435C, 0x435D, 0x435E, 0x435F,
+    0x4360, 0x4361, 0x4362, 0x4363, 0x4364, 0x4365, 0x4366, 0x4367,
+    0x4368, 0x4369, 0x436A, 0x436B, 0x436C, 0x436D, 0x436E, 0x436F,
+    0x4370, 0x4371, 0x4372, 0x4373, 0x4374, 0x4375, 0x4376, 0x4377,
+    0x4378, 0x4379, 0x437A, 0x437B, 0x437C, 0x437D, 0x437E, 0x437F,
+    0x4380, 0x4381, 0x4382, 0x4383, 0x4384, 0x4385, 0x4386, 0x4387,
+    0x4388, 0x4389, 0x438A, 0x438B, 0x438C, 0x438D, 0x438E, 0x438F,
+    0x4390, 0x4391, 0x4392, 0x4393, 0x4394, 0x4395, 0x4396, 0x4397,
+    0x4398, 0x4399, 0x439A, 0x439B, 0x439C, 0x439D, 0x439E, 0x439F,
+    0x43A0, 0x43A1, 0x43A2, 0x43A3, 0x43A4, 0x43A5, 0x43A6, 0x43A7,
+    0x43A8, 0x43A9, 0x43AA, 0x43AB, 0x43AD, 0x43AE, 0x43AF, 0x43B0,
+    0x43B2, 0x43B3, 0x43B4, 0x43B5, 0x43B6, 0x43B7, 0x43B8, 0x43B9,
+    0x43BA, 0x43BB, 0x43BC, 0x43BD, 0x43BE, 0x43BF, 0x43C0, 0x43C1,
+    0x43C2, 0x43C3, 0x43C4, 0x43C5, 0x43C6, 0x43C7, 0x43C8, 0x43C9,
+    0x43CA, 0x43CB, 0x43CC, 0x43CD, 0x43CE, 0x43CF, 0x43D0, 0x43D1,
+    0x43D2, 0x43D3, 0x43D4, 0x43D5, 0x43D6, 0x43D7, 0x43D8, 0x43D9,
+    0x43DA, 0x43DB, 0x43DC, 0x43DE, 0x43DF, 0x43E0, 0x43E1, 0x43E2,
+    0x43E3, 0x43E4, 0x43E5, 0x43E6, 0x43E7, 0x43E8, 0x43E9, 0x43EA,
+    0x43EB, 0x43EC, 0x43ED, 0x43EE, 0x43EF, 0x43F0, 0x43F1, 0x43F2,
+    0x43F3, 0x43F4, 0x43F5, 0x43F6, 0x43F7, 0x43F8, 0x43F9, 0x43FA,
+    0x43FB, 0x43FC, 0x43FD, 0x43FE, 0x43FF, 0x4400, 0x4401, 0x4402,
+    0x4403, 0x4404, 0x4405, 0x4406, 0x4407, 0x4408, 0x4409, 0x440A,
+    0x440B, 0x440C, 0x440D, 0x440E, 0x440F, 0x4410, 0x4411, 0x4412,
+    0x4413, 0x4414, 0x4415, 0x4416, 0x4417, 0x4418, 0x4419, 0x441A,
+    0x441B, 0x441C, 0x441D, 0x441E, 0x441F, 0x4420, 0x4421, 0x4422,
+    0x4423, 0x4424, 0x4425, 0x4426, 0x4427, 0x4428, 0x4429, 0x442A,
+    0x442B, 0x442C, 0x442D, 0x442E, 0x442F, 0x4430, 0x4431, 0x4432,
+    0x4433, 0x4434, 0x4435, 0x4436, 0x4437, 0x4438, 0x4439, 0x443A,
+    0x443B, 0x443C, 0x443D, 0x443E, 0x443F, 0x4440, 0x4441, 0x4442,
+    0x4443, 0x4444, 0x4445, 0x4446, 0x4447, 0x4448, 0x4449, 0x444A,
+    0x444B, 0x444C, 0x444D, 0x444E, 0x444F, 0x4450, 0x4451, 0x4452,
+    0x4453, 0x4454, 0x4455, 0x4456, 0x4457, 0x4458, 0x4459, 0x445A,
+    0x445B, 0x445C, 0x445D, 0x445E, 0x445F, 0x4460, 0x4461, 0x4462,
+    0x4463, 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, 0x4469, 0x446A,
+    0x446B, 0x446C, 0x446D, 0x446E, 0x446F, 0x4470, 0x4471, 0x4472,
+    0x4473, 0x4474, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479, 0x447A,
+    0x447B, 0x447C, 0x447D, 0x447E, 0x447F, 0x4480, 0x4481, 0x4482,
+    0x4483, 0x4484, 0x4485, 0x4486, 0x4487, 0x4488, 0x4489, 0x448A,
+    0x448B, 0x448C, 0x448D, 0x448E, 0x448F, 0x4490, 0x4491, 0x4492,
+    0x4493, 0x4494, 0x4495, 0x4496, 0x4497, 0x4498, 0x4499, 0x449A,
+    0x449B, 0x449C, 0x449D, 0x449E, 0x449F, 0x44A0, 0x44A1, 0x44A2,
+    0x44A3, 0x44A4, 0x44A5, 0x44A6, 0x44A7, 0x44A8, 0x44A9, 0x44AA,
+    0x44AB, 0x44AC, 0x44AD, 0x44AE, 0x44AF, 0x44B0, 0x44B1, 0x44B2,
+    0x44B3, 0x44B4, 0x44B5, 0x44B6, 0x44B7, 0x44B8, 0x44B9, 0x44BA,
+    0x44BB, 0x44BC, 0x44BD, 0x44BE, 0x44BF, 0x44C0, 0x44C1, 0x44C2,
+    0x44C3, 0x44C4, 0x44C5, 0x44C6, 0x44C7, 0x44C8, 0x44C9, 0x44CA,
+    0x44CB, 0x44CC, 0x44CD, 0x44CE, 0x44CF, 0x44D0, 0x44D1, 0x44D2,
+    0x44D3, 0x44D4, 0x44D5, 0x44D7, 0x44D8, 0x44D9, 0x44DA, 0x44DB,
+    0x44DC, 0x44DD, 0x44DE, 0x44DF, 0x44E0, 0x44E1, 0x44E2, 0x44E3,
+    0x44E4, 0x44E5, 0x44E6, 0x44E7, 0x44E8, 0x44E9, 0x44EA, 0x44EB,
+    0x44EC, 0x44ED, 0x44EE, 0x44EF, 0x44F0, 0x44F1, 0x44F2, 0x44F3,
+    0x44F4, 0x44F5, 0x44F6, 0x44F7, 0x44F8, 0x44F9, 0x44FA, 0x44FB,
+    0x44FC, 0x44FD, 0x44FE, 0x44FF, 0x4500, 0x4501, 0x4502, 0x4503,
+    0x4504, 0x4505, 0x4506, 0x4507, 0x4508, 0x4509, 0x450A, 0x450B,
+    0x450C, 0x450D, 0x450E, 0x450F, 0x4510, 0x4511, 0x4512, 0x4513,
+    0x4514, 0x4515, 0x4516, 0x4517, 0x4518, 0x4519, 0x451A, 0x451B,
+    0x451C, 0x451D, 0x451E, 0x451F, 0x4520, 0x4521, 0x4522, 0x4523,
+    0x4524, 0x4525, 0x4526, 0x4527, 0x4528, 0x4529, 0x452A, 0x452B,
+    0x452C, 0x452D, 0x452E, 0x452F, 0x4530, 0x4531, 0x4532, 0x4533,
+    0x4534, 0x4535, 0x4536, 0x4537, 0x4538, 0x4539, 0x453A, 0x453B,
+    0x453C, 0x453D, 0x453E, 0x453F, 0x4540, 0x4541, 0x4542, 0x4543,
+    0x4544, 0x4545, 0x4546, 0x4547, 0x4548, 0x4549, 0x454A, 0x454B,
+    0x454C, 0x454D, 0x454E, 0x454F, 0x4550, 0x4551, 0x4552, 0x4553,
+    0x4554, 0x4555, 0x4556, 0x4557, 0x4558, 0x4559, 0x455A, 0x455B,
+    0x455C, 0x455D, 0x455E, 0x455F, 0x4560, 0x4561, 0x4562, 0x4563,
+    0x4564, 0x4565, 0x4566, 0x4567, 0x4568, 0x4569, 0x456A, 0x456B,
+    0x456C, 0x456D, 0x456E, 0x456F, 0x4570, 0x4571, 0x4572, 0x4573,
+    0x4574, 0x4575, 0x4576, 0x4577, 0x4578, 0x4579, 0x457A, 0x457B,
+    0x457C, 0x457D, 0x457E, 0x457F, 0x4580, 0x4581, 0x4582, 0x4583,
+    0x4584, 0x4585, 0x4586, 0x4587, 0x4588, 0x4589, 0x458A, 0x458B,
+    0x458C, 0x458D, 0x458E, 0x458F, 0x4590, 0x4591, 0x4592, 0x4593,
+    0x4594, 0x4595, 0x4596, 0x4597, 0x4598, 0x4599, 0x459A, 0x459B,
+    0x459C, 0x459D, 0x459E, 0x459F, 0x45A0, 0x45A1, 0x45A2, 0x45A3,
+    0x45A4, 0x45A5, 0x45A6, 0x45A7, 0x45A8, 0x45A9, 0x45AA, 0x45AB,
+    0x45AC, 0x45AD, 0x45AE, 0x45AF, 0x45B0, 0x45B1, 0x45B2, 0x45B3,
+    0x45B4, 0x45B5, 0x45B6, 0x45B7, 0x45B8, 0x45B9, 0x45BA, 0x45BB,
+    0x45BC, 0x45BD, 0x45BE, 0x45BF, 0x45C0, 0x45C1, 0x45C2, 0x45C3,
+    0x45C4, 0x45C5, 0x45C6, 0x45C7, 0x45C8, 0x45C9, 0x45CA, 0x45CB,
+    0x45CC, 0x45CD, 0x45CE, 0x45CF, 0x45D0, 0x45D1, 0x45D2, 0x45D3,
+    0x45D4, 0x45D5, 0x45D6, 0x45D7, 0x45D8, 0x45D9, 0x45DA, 0x45DB,
+    0x45DC, 0x45DD, 0x45DE, 0x45DF, 0x45E0, 0x45E1, 0x45E2, 0x45E3,
+    0x45E4, 0x45E5, 0x45E6, 0x45E7, 0x45E8, 0x45E9, 0x45EA, 0x45EB,
+    0x45EC, 0x45ED, 0x45EE, 0x45EF, 0x45F0, 0x45F1, 0x45F2, 0x45F3,
+    0x45F4, 0x45F5, 0x45F6, 0x45F7, 0x45F8, 0x45F9, 0x45FA, 0x45FB,
+    0x45FC, 0x45FD, 0x45FE, 0x45FF, 0x4600, 0x4601, 0x4602, 0x4603,
+    0x4604, 0x4605, 0x4606, 0x4607, 0x4608, 0x4609, 0x460A, 0x460B,
+    0x460C, 0x460D, 0x460E, 0x460F, 0x4610, 0x4611, 0x4612, 0x4613,
+    0x4614, 0x4615, 0x4616, 0x4617, 0x4618, 0x4619, 0x461A, 0x461B,
+    0x461C, 0x461D, 0x461E, 0x461F, 0x4620, 0x4621, 0x4622, 0x4623,
+    0x4624, 0x4625, 0x4626, 0x4627, 0x4628, 0x4629, 0x462A, 0x462B,
+    0x462C, 0x462D, 0x462E, 0x462F, 0x4630, 0x4631, 0x4632, 0x4633,
+    0x4634, 0x4635, 0x4636, 0x4637, 0x4638, 0x4639, 0x463A, 0x463B,
+    0x463C, 0x463D, 0x463E, 0x463F, 0x4640, 0x4641, 0x4642, 0x4643,
+    0x4644, 0x4645, 0x4646, 0x4647, 0x4648, 0x4649, 0x464A, 0x464B,
+    0x464D, 0x464E, 0x464F, 0x4650, 0x4651, 0x4652, 0x4653, 0x4654,
+    0x4655, 0x4656, 0x4657, 0x4658, 0x4659, 0x465A, 0x465B, 0x465C,
+    0x465D, 0x465E, 0x465F, 0x4660, 0x4662, 0x4663, 0x4664, 0x4665,
+    0x4666, 0x4667, 0x4668, 0x4669, 0x466A, 0x466B, 0x466C, 0x466D,
+    0x466E, 0x466F, 0x4670, 0x4671, 0x4672, 0x4673, 0x4674, 0x4675,
+    0x4676, 0x4677, 0x4678, 0x4679, 0x467A, 0x467B, 0x467C, 0x467D,
+    0x467E, 0x467F, 0x4680, 0x4681, 0x4682, 0x4683, 0x4684, 0x4685,
+    0x4686, 0x4687, 0x4688, 0x4689, 0x468A, 0x468B, 0x468C, 0x468D,
+    0x468E, 0x468F, 0x4690, 0x4691, 0x4692, 0x4693, 0x4694, 0x4695,
+    0x4696, 0x4697, 0x4698, 0x4699, 0x469A, 0x469B, 0x469C, 0x469D,
+    0x469E, 0x469F, 0x46A0, 0x46A1, 0x46A2, 0x46A3, 0x46A4, 0x46A5,
+    0x46A6, 0x46A7, 0x46A8, 0x46A9, 0x46AA, 0x46AB, 0x46AC, 0x46AD,
+    0x46AE, 0x46AF, 0x46B0, 0x46B1, 0x46B2, 0x46B3, 0x46B4, 0x46B5,
+    0x46B6, 0x46B7, 0x46B8, 0x46B9, 0x46BA, 0x46BB, 0x46BC, 0x46BD,
+    0x46BE, 0x46BF, 0x46C0, 0x46C1, 0x46C2, 0x46C3, 0x46C4, 0x46C5,
+    0x46C6, 0x46C7, 0x46C8, 0x46C9, 0x46CA, 0x46CB, 0x46CC, 0x46CD,
+    0x46CE, 0x46CF, 0x46D0, 0x46D1, 0x46D2, 0x46D3, 0x46D4, 0x46D5,
+    0x46D6, 0x46D7, 0x46D8, 0x46D9, 0x46DA, 0x46DB, 0x46DC, 0x46DD,
+    0x46DE, 0x46DF, 0x46E0, 0x46E1, 0x46E2, 0x46E3, 0x46E4, 0x46E5,
+    0x46E6, 0x46E7, 0x46E8, 0x46E9, 0x46EA, 0x46EB, 0x46EC, 0x46ED,
+    0x46EE, 0x46EF, 0x46F0, 0x46F1, 0x46F2, 0x46F3, 0x46F4, 0x46F5,
+    0x46F6, 0x46F7, 0x46F8, 0x46F9, 0x46FA, 0x46FB, 0x46FC, 0x46FD,
+    0x46FE, 0x46FF, 0x4700, 0x4701, 0x4702, 0x4703, 0x4704, 0x4705,
+    0x4706, 0x4707, 0x4708, 0x4709, 0x470A, 0x470B, 0x470C, 0x470D,
+    0x470E, 0x470F, 0x4710, 0x4711, 0x4712, 0x4713, 0x4714, 0x4715,
+    0x4716, 0x4717, 0x4718, 0x4719, 0x471A, 0x471B, 0x471C, 0x471D,
+    0x471E, 0x471F, 0x4720, 0x4721, 0x4722, 0x4724, 0x4725, 0x4726,
+    0x4727, 0x4728, 0x472A, 0x472B, 0x472C, 0x472D, 0x472E, 0x472F,
+    0x4730, 0x4731, 0x4732, 0x4733, 0x4734, 0x4735, 0x4736, 0x4737,
+    0x4738, 0x4739, 0x473A, 0x473B, 0x473C, 0x473D, 0x473E, 0x473F,
+    0x4740, 0x4741, 0x4742, 0x4743, 0x4744, 0x4745, 0x4746, 0x4747,
+    0x4748, 0x4749, 0x474A, 0x474B, 0x474C, 0x474D, 0x474E, 0x474F,
+    0x4750, 0x4751, 0x4752, 0x4753, 0x4754, 0x4755, 0x4756, 0x4757,
+    0x4758, 0x4759, 0x475A, 0x475B, 0x475C, 0x475D, 0x475E, 0x475F,
+    0x4760, 0x4761, 0x4762, 0x4763, 0x4764, 0x4765, 0x4766, 0x4767,
+    0x4768, 0x4769, 0x476A, 0x476B, 0x476C, 0x476D, 0x476E, 0x476F,
+    0x4770, 0x4771, 0x4772, 0x4773, 0x4774, 0x4775, 0x4776, 0x4777,
+    0x4778, 0x4779, 0x477A, 0x477B, 0x477D, 0x477E, 0x477F, 0x4780,
+    0x4781, 0x4782, 0x4783, 0x4784, 0x4785, 0x4786, 0x4787, 0x4788,
+    0x4789, 0x478A, 0x478B, 0x478C, 0x478E, 0x478F, 0x4790, 0x4791,
+    0x4792, 0x4793, 0x4794, 0x4795, 0x4796, 0x4797, 0x4798, 0x4799,
+    0x479A, 0x479B, 0x479C, 0x479D, 0x479E, 0x479F, 0x47A0, 0x47A1,
+    0x47A2, 0x47A3, 0x47A4, 0x47A5, 0x47A6, 0x47A7, 0x47A8, 0x47A9,
+    0x47AA, 0x47AB, 0x47AC, 0x47AD, 0x47AE, 0x47AF, 0x47B0, 0x47B1,
+    0x47B2, 0x47B3, 0x47B4, 0x47B5, 0x47B6, 0x47B7, 0x47B8, 0x47B9,
+    0x47BA, 0x47BB, 0x47BC, 0x47BD, 0x47BE, 0x47BF, 0x47C0, 0x47C1,
+    0x47C2, 0x47C3, 0x47C4, 0x47C5, 0x47C6, 0x47C7, 0x47C8, 0x47C9,
+    0x47CA, 0x47CB, 0x47CC, 0x47CD, 0x47CE, 0x47CF, 0x47D0, 0x47D1,
+    0x47D2, 0x47D3, 0x47D4, 0x47D5, 0x47D6, 0x47D7, 0x47D8, 0x47D9,
+    0x47DA, 0x47DB, 0x47DC, 0x47DD, 0x47DE, 0x47DF, 0x47E0, 0x47E1,
+    0x47E2, 0x47E3, 0x47E4, 0x47E5, 0x47E6, 0x47E7, 0x47E8, 0x47E9,
+    0x47EA, 0x47EB, 0x47EC, 0x47ED, 0x47EE, 0x47EF, 0x47F0, 0x47F1,
+    0x47F2, 0x47F3, 0x47F4, 0x47F5, 0x47F6, 0x47F7, 0x47F8, 0x47F9,
+    0x47FA, 0x47FB, 0x47FC, 0x47FD, 0x47FE, 0x47FF, 0x4800, 0x4801,
+    0x4802, 0x4803, 0x4804, 0x4805, 0x4806, 0x4807, 0x4808, 0x4809,
+    0x480A, 0x480B, 0x480C, 0x480D, 0x480E, 0x480F, 0x4810, 0x4811,
+    0x4812, 0x4813, 0x4814, 0x4815, 0x4816, 0x4817, 0x4818, 0x4819,
+    0x481A, 0x481B, 0x481C, 0x481D, 0x481E, 0x481F, 0x4820, 0x4821,
+    0x4822, 0x4823, 0x4824, 0x4825, 0x4826, 0x4827, 0x4828, 0x4829,
+    0x482A, 0x482B, 0x482C, 0x482D, 0x482E, 0x482F, 0x4830, 0x4831,
+    0x4832, 0x4833, 0x4834, 0x4835, 0x4836, 0x4837, 0x4838, 0x4839,
+    0x483A, 0x483B, 0x483C, 0x483D, 0x483E, 0x483F, 0x4840, 0x4841,
+    0x4842, 0x4843, 0x4844, 0x4845, 0x4846, 0x4847, 0x4848, 0x4849,
+    0x484A, 0x484B, 0x484C, 0x484D, 0x484E, 0x484F, 0x4850, 0x4851,
+    0x4852, 0x4853, 0x4854, 0x4855, 0x4856, 0x4857, 0x4858, 0x4859,
+    0x485A, 0x485B, 0x485C, 0x485D, 0x485E, 0x485F, 0x4860, 0x4861,
+    0x4862, 0x4863, 0x4864, 0x4865, 0x4866, 0x4867, 0x4868, 0x4869,
+    0x486A, 0x486B, 0x486C, 0x486D, 0x486E, 0x486F, 0x4870, 0x4871,
+    0x4872, 0x4873, 0x4874, 0x4875, 0x4876, 0x4877, 0x4878, 0x4879,
+    0x487A, 0x487B, 0x487C, 0x487D, 0x487E, 0x487F, 0x4880, 0x4881,
+    0x4882, 0x4883, 0x4884, 0x4885, 0x4886, 0x4887, 0x4888, 0x4889,
+    0x488A, 0x488B, 0x488C, 0x488D, 0x488E, 0x488F, 0x4890, 0x4891,
+    0x4892, 0x4893, 0x4894, 0x4895, 0x4896, 0x4897, 0x4898, 0x4899,
+    0x489A, 0x489B, 0x489C, 0x489D, 0x489E, 0x489F, 0x48A0, 0x48A1,
+    0x48A2, 0x48A3, 0x48A4, 0x48A5, 0x48A6, 0x48A7, 0x48A8, 0x48A9,
+    0x48AA, 0x48AB, 0x48AC, 0x48AD, 0x48AE, 0x48AF, 0x48B0, 0x48B1,
+    0x48B2, 0x48B3, 0x48B4, 0x48B5, 0x48B6, 0x48B7, 0x48B8, 0x48B9,
+    0x48BA, 0x48BB, 0x48BC, 0x48BD, 0x48BE, 0x48BF, 0x48C0, 0x48C1,
+    0x48C2, 0x48C3, 0x48C4, 0x48C5, 0x48C6, 0x48C7, 0x48C8, 0x48C9,
+    0x48CA, 0x48CB, 0x48CC, 0x48CD, 0x48CE, 0x48CF, 0x48D0, 0x48D1,
+    0x48D2, 0x48D3, 0x48D4, 0x48D5, 0x48D6, 0x48D7, 0x48D8, 0x48D9,
+    0x48DA, 0x48DB, 0x48DC, 0x48DD, 0x48DE, 0x48DF, 0x48E0, 0x48E1,
+    0x48E2, 0x48E3, 0x48E4, 0x48E5, 0x48E6, 0x48E7, 0x48E8, 0x48E9,
+    0x48EA, 0x48EB, 0x48EC, 0x48ED, 0x48EE, 0x48EF, 0x48F0, 0x48F1,
+    0x48F2, 0x48F3, 0x48F4, 0x48F5, 0x48F6, 0x48F7, 0x48F8, 0x48F9,
+    0x48FA, 0x48FB, 0x48FC, 0x48FD, 0x48FE, 0x48FF, 0x4900, 0x4901,
+    0x4902, 0x4903, 0x4904, 0x4905, 0x4906, 0x4907, 0x4908, 0x4909,
+    0x490A, 0x490B, 0x490C, 0x490D, 0x490E, 0x490F, 0x4910, 0x4911,
+    0x4912, 0x4913, 0x4914, 0x4915, 0x4916, 0x4917, 0x4918, 0x4919,
+    0x491A, 0x491B, 0x491C, 0x491D, 0x491E, 0x491F, 0x4920, 0x4921,
+    0x4922, 0x4923, 0x4924, 0x4925, 0x4926, 0x4927, 0x4928, 0x4929,
+    0x492A, 0x492B, 0x492C, 0x492D, 0x492E, 0x492F, 0x4930, 0x4931,
+    0x4932, 0x4933, 0x4934, 0x4935, 0x4936, 0x4937, 0x4938, 0x4939,
+    0x493A, 0x493B, 0x493C, 0x493D, 0x493E, 0x493F, 0x4940, 0x4941,
+    0x4942, 0x4943, 0x4944, 0x4945, 0x4946, 0x4948, 0x4949, 0x494A,
+    0x494B, 0x494C, 0x494D, 0x494E, 0x494F, 0x4950, 0x4951, 0x4952,
+    0x4953, 0x4954, 0x4955, 0x4956, 0x4957, 0x4958, 0x4959, 0x495A,
+    0x495B, 0x495C, 0x495D, 0x495E, 0x495F, 0x4960, 0x4961, 0x4962,
+    0x4963, 0x4964, 0x4965, 0x4966, 0x4967, 0x4968, 0x4969, 0x496A,
+    0x496B, 0x496C, 0x496D, 0x496E, 0x496F, 0x4970, 0x4971, 0x4972,
+    0x4973, 0x4974, 0x4975, 0x4976, 0x4977, 0x4978, 0x4979, 0x497B,
+    0x497C, 0x497E, 0x497F, 0x4980, 0x4981, 0x4984, 0x4987, 0x4988,
+    0x4989, 0x498A, 0x498B, 0x498C, 0x498D, 0x498E, 0x498F, 0x4990,
+    0x4991, 0x4992, 0x4993, 0x4994, 0x4995, 0x4996, 0x4997, 0x4998,
+    0x4999, 0x499A, 0x499C, 0x499D, 0x499E, 0x49A0, 0x49A1, 0x49A2,
+    0x49A3, 0x49A4, 0x49A5, 0x49A6, 0x49A7, 0x49A8, 0x49A9, 0x49AA,
+    0x49AB, 0x49AC, 0x49AD, 0x49AE, 0x49AF, 0x49B0, 0x49B1, 0x49B2,
+    0x49B3, 0x49B4, 0x49B5, 0x49B8, 0x49B9, 0x49BA, 0x49BB, 0x49BC,
+    0x49BD, 0x49BE, 0x49BF, 0x49C0, 0x49C1, 0x49C2, 0x49C3, 0x49C4,
+    0x49C5, 0x49C6, 0x49C7, 0x49C8, 0x49C9, 0x49CA, 0x49CB, 0x49CC,
+    0x49CD, 0x49CE, 0x49CF, 0x49D0, 0x49D1, 0x49D2, 0x49D3, 0x49D4,
+    0x49D5, 0x49D6, 0x49D7, 0x49D8, 0x49D9, 0x49DA, 0x49DB, 0x49DC,
+    0x49DD, 0x49DE, 0x49DF, 0x49E0, 0x49E1, 0x49E2, 0x49E3, 0x49E4,
+    0x49E5, 0x49E6, 0x49E7, 0x49E8, 0x49E9, 0x49EA, 0x49EB, 0x49EC,
+    0x49ED, 0x49EE, 0x49EF, 0x49F0, 0x49F1, 0x49F2, 0x49F3, 0x49F4,
+    0x49F5, 0x49F6, 0x49F7, 0x49F8, 0x49F9, 0x49FA, 0x49FB, 0x49FC,
+    0x49FD, 0x49FE, 0x49FF, 0x4A00, 0x4A01, 0x4A02, 0x4A03, 0x4A04,
+    0x4A05, 0x4A06, 0x4A07, 0x4A08, 0x4A09, 0x4A0A, 0x4A0B, 0x4A0C,
+    0x4A0D, 0x4A0E, 0x4A0F, 0x4A10, 0x4A11, 0x4A12, 0x4A13, 0x4A14,
+    0x4A15, 0x4A16, 0x4A17, 0x4A18, 0x4A19, 0x4A1A, 0x4A1B, 0x4A1C,
+    0x4A1D, 0x4A1E, 0x4A1F, 0x4A20, 0x4A21, 0x4A22, 0x4A23, 0x4A24,
+    0x4A25, 0x4A26, 0x4A27, 0x4A28, 0x4A29, 0x4A2A, 0x4A2B, 0x4A2C,
+    0x4A2D, 0x4A2E, 0x4A2F, 0x4A30, 0x4A31, 0x4A32, 0x4A33, 0x4A34,
+    0x4A35, 0x4A36, 0x4A37, 0x4A38, 0x4A39, 0x4A3A, 0x4A3B, 0x4A3C,
+    0x4A3D, 0x4A3E, 0x4A3F, 0x4A40, 0x4A41, 0x4A42, 0x4A43, 0x4A44,
+    0x4A45, 0x4A46, 0x4A47, 0x4A48, 0x4A49, 0x4A4A, 0x4A4B, 0x4A4C,
+    0x4A4D, 0x4A4E, 0x4A4F, 0x4A50, 0x4A51, 0x4A52, 0x4A53, 0x4A54,
+    0x4A55, 0x4A56, 0x4A57, 0x4A58, 0x4A59, 0x4A5A, 0x4A5B, 0x4A5C,
+    0x4A5D, 0x4A5E, 0x4A5F, 0x4A60, 0x4A61, 0x4A62, 0x4A63, 0x4A64,
+    0x4A65, 0x4A66, 0x4A67, 0x4A68, 0x4A69, 0x4A6A, 0x4A6B, 0x4A6C,
+    0x4A6D, 0x4A6E, 0x4A6F, 0x4A70, 0x4A71, 0x4A72, 0x4A73, 0x4A74,
+    0x4A75, 0x4A76, 0x4A77, 0x4A78, 0x4A79, 0x4A7A, 0x4A7B, 0x4A7C,
+    0x4A7D, 0x4A7E, 0x4A7F, 0x4A80, 0x4A81, 0x4A82, 0x4A83, 0x4A84,
+    0x4A85, 0x4A86, 0x4A87, 0x4A88, 0x4A89, 0x4A8A, 0x4A8B, 0x4A8C,
+    0x4A8D, 0x4A8E, 0x4A8F, 0x4A90, 0x4A91, 0x4A92, 0x4A93, 0x4A94,
+    0x4A95, 0x4A96, 0x4A97, 0x4A98, 0x4A99, 0x4A9A, 0x4A9B, 0x4A9C,
+    0x4A9D, 0x4A9E, 0x4A9F, 0x4AA0, 0x4AA1, 0x4AA2, 0x4AA3, 0x4AA4,
+    0x4AA5, 0x4AA6, 0x4AA7, 0x4AA8, 0x4AA9, 0x4AAA, 0x4AAB, 0x4AAC,
+    0x4AAD, 0x4AAE, 0x4AAF, 0x4AB0, 0x4AB1, 0x4AB2, 0x4AB3, 0x4AB4,
+    0x4AB5, 0x4AB6, 0x4AB7, 0x4AB8, 0x4AB9, 0x4ABA, 0x4ABB, 0x4ABC,
+    0x4ABD, 0x4ABE, 0x4ABF, 0x4AC0, 0x4AC1, 0x4AC2, 0x4AC3, 0x4AC4,
+    0x4AC5, 0x4AC6, 0x4AC7, 0x4AC8, 0x4AC9, 0x4ACA, 0x4ACB, 0x4ACC,
+    0x4ACD, 0x4ACE, 0x4ACF, 0x4AD0, 0x4AD1, 0x4AD2, 0x4AD3, 0x4AD4,
+    0x4AD5, 0x4AD6, 0x4AD7, 0x4AD8, 0x4AD9, 0x4ADA, 0x4ADB, 0x4ADC,
+    0x4ADD, 0x4ADE, 0x4ADF, 0x4AE0, 0x4AE1, 0x4AE2, 0x4AE3, 0x4AE4,
+    0x4AE5, 0x4AE6, 0x4AE7, 0x4AE8, 0x4AE9, 0x4AEA, 0x4AEB, 0x4AEC,
+    0x4AED, 0x4AEE, 0x4AEF, 0x4AF0, 0x4AF1, 0x4AF2, 0x4AF3, 0x4AF4,
+    0x4AF5, 0x4AF6, 0x4AF7, 0x4AF8, 0x4AF9, 0x4AFA, 0x4AFB, 0x4AFC,
+    0x4AFD, 0x4AFE, 0x4AFF, 0x4B00, 0x4B01, 0x4B02, 0x4B03, 0x4B04,
+    0x4B05, 0x4B06, 0x4B07, 0x4B08, 0x4B09, 0x4B0A, 0x4B0B, 0x4B0C,
+    0x4B0D, 0x4B0E, 0x4B0F, 0x4B10, 0x4B11, 0x4B12, 0x4B13, 0x4B14,
+    0x4B15, 0x4B16, 0x4B17, 0x4B18, 0x4B19, 0x4B1A, 0x4B1B, 0x4B1C,
+    0x4B1D, 0x4B1E, 0x4B1F, 0x4B20, 0x4B21, 0x4B22, 0x4B23, 0x4B24,
+    0x4B25, 0x4B26, 0x4B27, 0x4B28, 0x4B29, 0x4B2A, 0x4B2B, 0x4B2C,
+    0x4B2D, 0x4B2E, 0x4B2F, 0x4B30, 0x4B31, 0x4B32, 0x4B33, 0x4B34,
+    0x4B35, 0x4B36, 0x4B37, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x4B3C,
+    0x4B3D, 0x4B3E, 0x4B3F, 0x4B40, 0x4B41, 0x4B42, 0x4B43, 0x4B44,
+    0x4B45, 0x4B46, 0x4B47, 0x4B48, 0x4B49, 0x4B4A, 0x4B4B, 0x4B4C,
+    0x4B4D, 0x4B4E, 0x4B4F, 0x4B50, 0x4B51, 0x4B52, 0x4B53, 0x4B54,
+    0x4B55, 0x4B56, 0x4B57, 0x4B58, 0x4B59, 0x4B5A, 0x4B5B, 0x4B5C,
+    0x4B5D, 0x4B5E, 0x4B5F, 0x4B60, 0x4B61, 0x4B62, 0x4B63, 0x4B64,
+    0x4B65, 0x4B66, 0x4B67, 0x4B68, 0x4B69, 0x4B6A, 0x4B6B, 0x4B6C,
+    0x4B6D, 0x4B6E, 0x4B6F, 0x4B70, 0x4B71, 0x4B72, 0x4B73, 0x4B74,
+    0x4B75, 0x4B76, 0x4B77, 0x4B78, 0x4B79, 0x4B7A, 0x4B7B, 0x4B7C,
+    0x4B7D, 0x4B7E, 0x4B7F, 0x4B80, 0x4B81, 0x4B82, 0x4B83, 0x4B84,
+    0x4B85, 0x4B86, 0x4B87, 0x4B88, 0x4B89, 0x4B8A, 0x4B8B, 0x4B8C,
+    0x4B8D, 0x4B8E, 0x4B8F, 0x4B90, 0x4B91, 0x4B92, 0x4B93, 0x4B94,
+    0x4B95, 0x4B96, 0x4B97, 0x4B98, 0x4B99, 0x4B9A, 0x4B9B, 0x4B9C,
+    0x4B9D, 0x4B9E, 0x4B9F, 0x4BA0, 0x4BA1, 0x4BA2, 0x4BA3, 0x4BA4,
+    0x4BA5, 0x4BA6, 0x4BA7, 0x4BA8, 0x4BA9, 0x4BAA, 0x4BAB, 0x4BAC,
+    0x4BAD, 0x4BAE, 0x4BAF, 0x4BB0, 0x4BB1, 0x4BB2, 0x4BB3, 0x4BB4,
+    0x4BB5, 0x4BB6, 0x4BB7, 0x4BB8, 0x4BB9, 0x4BBA, 0x4BBB, 0x4BBC,
+    0x4BBD, 0x4BBE, 0x4BBF, 0x4BC0, 0x4BC1, 0x4BC2, 0x4BC3, 0x4BC4,
+    0x4BC5, 0x4BC6, 0x4BC7, 0x4BC8, 0x4BC9, 0x4BCA, 0x4BCB, 0x4BCC,
+    0x4BCD, 0x4BCE, 0x4BCF, 0x4BD0, 0x4BD1, 0x4BD2, 0x4BD3, 0x4BD4,
+    0x4BD5, 0x4BD6, 0x4BD7, 0x4BD8, 0x4BD9, 0x4BDA, 0x4BDB, 0x4BDC,
+    0x4BDD, 0x4BDE, 0x4BDF, 0x4BE0, 0x4BE1, 0x4BE2, 0x4BE3, 0x4BE4,
+    0x4BE5, 0x4BE6, 0x4BE7, 0x4BE8, 0x4BE9, 0x4BEA, 0x4BEB, 0x4BEC,
+    0x4BED, 0x4BEE, 0x4BEF, 0x4BF0, 0x4BF1, 0x4BF2, 0x4BF3, 0x4BF4,
+    0x4BF5, 0x4BF6, 0x4BF7, 0x4BF8, 0x4BF9, 0x4BFA, 0x4BFB, 0x4BFC,
+    0x4BFD, 0x4BFE, 0x4BFF, 0x4C00, 0x4C01, 0x4C02, 0x4C03, 0x4C04,
+    0x4C05, 0x4C06, 0x4C07, 0x4C08, 0x4C09, 0x4C0A, 0x4C0B, 0x4C0C,
+    0x4C0D, 0x4C0E, 0x4C0F, 0x4C10, 0x4C11, 0x4C12, 0x4C13, 0x4C14,
+    0x4C15, 0x4C16, 0x4C17, 0x4C18, 0x4C19, 0x4C1A, 0x4C1B, 0x4C1C,
+    0x4C1D, 0x4C1E, 0x4C1F, 0x4C20, 0x4C21, 0x4C22, 0x4C23, 0x4C24,
+    0x4C25, 0x4C26, 0x4C27, 0x4C28, 0x4C29, 0x4C2A, 0x4C2B, 0x4C2C,
+    0x4C2D, 0x4C2E, 0x4C2F, 0x4C30, 0x4C31, 0x4C32, 0x4C33, 0x4C34,
+    0x4C35, 0x4C36, 0x4C37, 0x4C38, 0x4C39, 0x4C3A, 0x4C3B, 0x4C3C,
+    0x4C3D, 0x4C3E, 0x4C3F, 0x4C40, 0x4C41, 0x4C42, 0x4C43, 0x4C44,
+    0x4C45, 0x4C46, 0x4C47, 0x4C48, 0x4C49, 0x4C4A, 0x4C4B, 0x4C4C,
+    0x4C4D, 0x4C4E, 0x4C4F, 0x4C50, 0x4C51, 0x4C52, 0x4C53, 0x4C54,
+    0x4C55, 0x4C56, 0x4C57, 0x4C58, 0x4C59, 0x4C5A, 0x4C5B, 0x4C5C,
+    0x4C5D, 0x4C5E, 0x4C5F, 0x4C60, 0x4C61, 0x4C62, 0x4C63, 0x4C64,
+    0x4C65, 0x4C66, 0x4C67, 0x4C68, 0x4C69, 0x4C6A, 0x4C6B, 0x4C6C,
+    0x4C6D, 0x4C6E, 0x4C6F, 0x4C70, 0x4C71, 0x4C72, 0x4C73, 0x4C74,
+    0x4C75, 0x4C76, 0x4C78, 0x4C79, 0x4C7A, 0x4C7B, 0x4C7C, 0x4C7D,
+    0x4C7E, 0x4C7F, 0x4C80, 0x4C81, 0x4C82, 0x4C83, 0x4C84, 0x4C85,
+    0x4C86, 0x4C87, 0x4C88, 0x4C89, 0x4C8A, 0x4C8B, 0x4C8C, 0x4C8D,
+    0x4C8E, 0x4C8F, 0x4C90, 0x4C91, 0x4C92, 0x4C93, 0x4C94, 0x4C95,
+    0x4C96, 0x4C97, 0x4C98, 0x4C99, 0x4C9A, 0x4C9B, 0x4C9C, 0x4C9D,
+    0x4C9E, 0x4CA4, 0x4CA5, 0x4CA6, 0x4CA7, 0x4CA8, 0x4CA9, 0x4CAA,
+    0x4CAB, 0x4CAC, 0x4CAD, 0x4CAE, 0x4CAF, 0x4CB0, 0x4CB1, 0x4CB2,
+    0x4CB3, 0x4CB4, 0x4CB5, 0x4CB6, 0x4CB7, 0x4CB8, 0x4CB9, 0x4CBA,
+    0x4CBB, 0x4CBC, 0x4CBD, 0x4CBE, 0x4CBF, 0x4CC0, 0x4CC1, 0x4CC2,
+    0x4CC3, 0x4CC4, 0x4CC5, 0x4CC6, 0x4CC7, 0x4CC8, 0x4CC9, 0x4CCA,
+    0x4CCB, 0x4CCC, 0x4CCD, 0x4CCE, 0x4CCF, 0x4CD0, 0x4CD1, 0x4CD2,
+    0x4CD3, 0x4CD4, 0x4CD5, 0x4CD6, 0x4CD7, 0x4CD8, 0x4CD9, 0x4CDA,
+    0x4CDB, 0x4CDC, 0x4CDD, 0x4CDE, 0x4CDF, 0x4CE0, 0x4CE1, 0x4CE2,
+    0x4CE3, 0x4CE4, 0x4CE5, 0x4CE6, 0x4CE7, 0x4CE8, 0x4CE9, 0x4CEA,
+    0x4CEB, 0x4CEC, 0x4CED, 0x4CEE, 0x4CEF, 0x4CF0, 0x4CF1, 0x4CF2,
+    0x4CF3, 0x4CF4, 0x4CF5, 0x4CF6, 0x4CF7, 0x4CF8, 0x4CF9, 0x4CFA,
+    0x4CFB, 0x4CFC, 0x4CFD, 0x4CFE, 0x4CFF, 0x4D00, 0x4D01, 0x4D02,
+    0x4D03, 0x4D04, 0x4D05, 0x4D06, 0x4D07, 0x4D08, 0x4D09, 0x4D0A,
+    0x4D0B, 0x4D0C, 0x4D0D, 0x4D0E, 0x4D0F, 0x4D10, 0x4D11, 0x4D12,
+    0x4D1A, 0x4D1B, 0x4D1C, 0x4D1D, 0x4D1E, 0x4D1F, 0x4D20, 0x4D21,
+    0x4D22, 0x4D23, 0x4D24, 0x4D25, 0x4D26, 0x4D27, 0x4D28, 0x4D29,
+    0x4D2A, 0x4D2B, 0x4D2C, 0x4D2D, 0x4D2E, 0x4D2F, 0x4D30, 0x4D31,
+    0x4D32, 0x4D33, 0x4D34, 0x4D35, 0x4D36, 0x4D37, 0x4D38, 0x4D39,
+    0x4D3A, 0x4D3B, 0x4D3C, 0x4D3D, 0x4D3E, 0x4D3F, 0x4D40, 0x4D41,
+    0x4D42, 0x4D43, 0x4D44, 0x4D45, 0x4D46, 0x4D47, 0x4D48, 0x4D49,
+    0x4D4A, 0x4D4B, 0x4D4C, 0x4D4D, 0x4D4E, 0x4D4F, 0x4D50, 0x4D51,
+    0x4D52, 0x4D53, 0x4D54, 0x4D55, 0x4D56, 0x4D57, 0x4D58, 0x4D59,
+    0x4D5A, 0x4D5B, 0x4D5C, 0x4D5D, 0x4D5E, 0x4D5F, 0x4D60, 0x4D61,
+    0x4D62, 0x4D63, 0x4D64, 0x4D65, 0x4D66, 0x4D67, 0x4D68, 0x4D69,
+    0x4D6A, 0x4D6B, 0x4D6C, 0x4D6D, 0x4D6E, 0x4D6F, 0x4D70, 0x4D71,
+    0x4D72, 0x4D73, 0x4D74, 0x4D75, 0x4D76, 0x4D77, 0x4D78, 0x4D79,
+    0x4D7A, 0x4D7B, 0x4D7C, 0x4D7D, 0x4D7E, 0x4D7F, 0x4D80, 0x4D81,
+    0x4D82, 0x4D83, 0x4D84, 0x4D85, 0x4D86, 0x4D87, 0x4D88, 0x4D89,
+    0x4D8A, 0x4D8B, 0x4D8C, 0x4D8D, 0x4D8E, 0x4D8F, 0x4D90, 0x4D91,
+    0x4D92, 0x4D93, 0x4D94, 0x4D95, 0x4D96, 0x4D97, 0x4D98, 0x4D99,
+    0x4D9A, 0x4D9B, 0x4D9C, 0x4D9D, 0x4D9E, 0x4D9F, 0x4DA0, 0x4DA1,
+    0x4DA2, 0x4DA3, 0x4DA4, 0x4DA5, 0x4DA6, 0x4DA7, 0x4DA8, 0x4DA9,
+    0x4DAA, 0x4DAB, 0x4DAC, 0x4DAD, 0x4DAF, 0x4DB0, 0x4DB1, 0x4DB2,
+    0x4DB3, 0x4DB4, 0x4DB5, 0x20AC, 0x00A5, 0x20AC, 0x0024, 0x303F,
+    0xA000, 0xA001, 0xA002, 0xA003, 0xA004, 0xA005, 0xA006, 0xA007,
+    0xA008, 0xA009, 0xA00A, 0xA00B, 0xA00C, 0xA00D, 0xA00E, 0xA00F,
+    0xA010, 0xA011, 0xA012, 0xA013, 0xA014, 0xA015, 0xA016, 0xA017,
+    0xA018, 0xA019, 0xA01A, 0xA01B, 0xA01C, 0xA01D, 0xA01E, 0xA01F,
+    0xA020, 0xA021, 0xA022, 0xA023, 0xA024, 0xA025, 0xA026, 0xA027,
+    0xA028, 0xA029, 0xA02A, 0xA02B, 0xA02C, 0xA02D, 0xA02E, 0xA02F,
+    0xA030, 0xA031, 0xA032, 0xA033, 0xA034, 0xA035, 0xA036, 0xA037,
+    0xA038, 0xA039, 0xA03A, 0xA03B, 0xA03C, 0xA03D, 0xA03E, 0xA03F,
+    0xA040, 0xA041, 0xA042, 0xA043, 0xA044, 0xA045, 0xA046, 0xA047,
+    0xA048, 0xA049, 0xA04A, 0xA04B, 0xA04C, 0xA04D, 0xA04E, 0xA04F,
+    0xA050, 0xA051, 0xA052, 0xA053, 0xA054, 0xA055, 0xA056, 0xA057,
+    0xA058, 0xA059, 0xA05A, 0xA05B, 0xA05C, 0xA05D, 0xA05E, 0xA05F,
+    0xA060, 0xA061, 0xA062, 0xA063, 0xA064, 0xA065, 0xA066, 0xA067,
+    0xA068, 0xA069, 0xA06A, 0xA06B, 0xA06C, 0xA06D, 0xA06E, 0xA06F,
+    0xA070, 0xA071, 0xA072, 0xA073, 0xA074, 0xA075, 0xA076, 0xA077,
+    0xA078, 0xA079, 0xA07A, 0xA07B, 0xA07C, 0xA07D, 0xA07E, 0xA07F,
+    0xA080, 0xA081, 0xA082, 0xA083, 0xA084, 0xA085, 0xA086, 0xA087,
+    0xA088, 0xA089, 0xA08A, 0xA08B, 0xA08C, 0xA08D, 0xA08E, 0xA08F,
+    0xA090, 0xA091, 0xA092, 0xA093, 0xA094, 0xA095, 0xA096, 0xA097,
+    0xA098, 0xA099, 0xA09A, 0xA09B, 0xA09C, 0xA09D, 0xA09E, 0xA09F,
+    0xA0A0, 0xA0A1, 0xA0A2, 0xA0A3, 0xA0A4, 0xA0A5, 0xA0A6, 0xA0A7,
+    0xA0A8, 0xA0A9, 0xA0AA, 0xA0AB, 0xA0AC, 0xA0AD, 0xA0AE, 0xA0AF,
+    0xA0B0, 0xA0B1, 0xA0B2, 0xA0B3, 0xA0B4, 0xA0B5, 0xA0B6, 0xA0B7,
+    0xA0B8, 0xA0B9, 0xA0BA, 0xA0BB, 0xA0BC, 0xA0BD, 0xA0BE, 0xA0BF,
+    0xA0C0, 0xA0C1, 0xA0C2, 0xA0C3, 0xA0C4, 0xA0C5, 0xA0C6, 0xA0C7,
+    0xA0C8, 0xA0C9, 0xA0CA, 0xA0CB, 0xA0CC, 0xA0CD, 0xA0CE, 0xA0CF,
+    0xA0D0, 0xA0D1, 0xA0D2, 0xA0D3, 0xA0D4, 0xA0D5, 0xA0D6, 0xA0D7,
+    0xA0D8, 0xA0D9, 0xA0DA, 0xA0DB, 0xA0DC, 0xA0DD, 0xA0DE, 0xA0DF,
+    0xA0E0, 0xA0E1, 0xA0E2, 0xA0E3, 0xA0E4, 0xA0E5, 0xA0E6, 0xA0E7,
+    0xA0E8, 0xA0E9, 0xA0EA, 0xA0EB, 0xA0EC, 0xA0ED, 0xA0EE, 0xA0EF,
+    0xA0F0, 0xA0F1, 0xA0F2, 0xA0F3, 0xA0F4, 0xA0F5, 0xA0F6, 0xA0F7,
+    0xA0F8, 0xA0F9, 0xA0FA, 0xA0FB, 0xA0FC, 0xA0FD, 0xA0FE, 0xA0FF,
+    0xA100, 0xA101, 0xA102, 0xA103, 0xA104, 0xA105, 0xA106, 0xA107,
+    0xA108, 0xA109, 0xA10A, 0xA10B, 0xA10C, 0xA10D, 0xA10E, 0xA10F,
+    0xA110, 0xA111, 0xA112, 0xA113, 0xA114, 0xA115, 0xA116, 0xA117,
+    0xA118, 0xA119, 0xA11A, 0xA11B, 0xA11C, 0xA11D, 0xA11E, 0xA11F,
+    0xA120, 0xA121, 0xA122, 0xA123, 0xA124, 0xA125, 0xA126, 0xA127,
+    0xA128, 0xA129, 0xA12A, 0xA12B, 0xA12C, 0xA12D, 0xA12E, 0xA12F,
+    0xA130, 0xA131, 0xA132, 0xA133, 0xA134, 0xA135, 0xA136, 0xA137,
+    0xA138, 0xA139, 0xA13A, 0xA13B, 0xA13C, 0xA13D, 0xA13E, 0xA13F,
+    0xA140, 0xA141, 0xA142, 0xA143, 0xA144, 0xA145, 0xA146, 0xA147,
+    0xA148, 0xA149, 0xA14A, 0xA14B, 0xA14C, 0xA14D, 0xA14E, 0xA14F,
+    0xA150, 0xA151, 0xA152, 0xA153, 0xA154, 0xA155, 0xA156, 0xA157,
+    0xA158, 0xA159, 0xA15A, 0xA15B, 0xA15C, 0xA15D, 0xA15E, 0xA15F,
+    0xA160, 0xA161, 0xA162, 0xA163, 0xA164, 0xA165, 0xA166, 0xA167,
+    0xA168, 0xA169, 0xA16A, 0xA16B, 0xA16C, 0xA16D, 0xA16E, 0xA16F,
+    0xA170, 0xA171, 0xA172, 0xA173, 0xA174, 0xA175, 0xA176, 0xA177,
+    0xA178, 0xA179, 0xA17A, 0xA17B, 0xA17C, 0xA17D, 0xA17E, 0xA17F,
+    0xA180, 0xA181, 0xA182, 0xA183, 0xA184, 0xA185, 0xA186, 0xA187,
+    0xA188, 0xA189, 0xA18A, 0xA18B, 0xA18C, 0xA18D, 0xA18E, 0xA18F,
+    0xA190, 0xA191, 0xA192, 0xA193, 0xA194, 0xA195, 0xA196, 0xA197,
+    0xA198, 0xA199, 0xA19A, 0xA19B, 0xA19C, 0xA19D, 0xA19E, 0xA19F,
+    0xA1A0, 0xA1A1, 0xA1A2, 0xA1A3, 0xA1A4, 0xA1A5, 0xA1A6, 0xA1A7,
+    0xA1A8, 0xA1A9, 0xA1AA, 0xA1AB, 0xA1AC, 0xA1AD, 0xA1AE, 0xA1AF,
+    0xA1B0, 0xA1B1, 0xA1B2, 0xA1B3, 0xA1B4, 0xA1B5, 0xA1B6, 0xA1B7,
+    0xA1B8, 0xA1B9, 0xA1BA, 0xA1BB, 0xA1BC, 0xA1BD, 0xA1BE, 0xA1BF,
+    0xA1C0, 0xA1C1, 0xA1C2, 0xA1C3, 0xA1C4, 0xA1C5, 0xA1C6, 0xA1C7,
+    0xA1C8, 0xA1C9, 0xA1CA, 0xA1CB, 0xA1CC, 0xA1CD, 0xA1CE, 0xA1CF,
+    0xA1D0, 0xA1D1, 0xA1D2, 0xA1D3, 0xA1D4, 0xA1D5, 0xA1D6, 0xA1D7,
+    0xA1D8, 0xA1D9, 0xA1DA, 0xA1DB, 0xA1DC, 0xA1DD, 0xA1DE, 0xA1DF,
+    0xA1E0, 0xA1E1, 0xA1E2, 0xA1E3, 0xA1E4, 0xA1E5, 0xA1E6, 0xA1E7,
+    0xA1E8, 0xA1E9, 0xA1EA, 0xA1EB, 0xA1EC, 0xA1ED, 0xA1EE, 0xA1EF,
+    0xA1F0, 0xA1F1, 0xA1F2, 0xA1F3, 0xA1F4, 0xA1F5, 0xA1F6, 0xA1F7,
+    0xA1F8, 0xA1F9, 0xA1FA, 0xA1FB, 0xA1FC, 0xA1FD, 0xA1FE, 0xA1FF,
+    0xA200, 0xA201, 0xA202, 0xA203, 0xA204, 0xA205, 0xA206, 0xA207,
+    0xA208, 0xA209, 0xA20A, 0xA20B, 0xA20C, 0xA20D, 0xA20E, 0xA20F,
+    0xA210, 0xA211, 0xA212, 0xA213, 0xA214, 0xA215, 0xA216, 0xA217,
+    0xA218, 0xA219, 0xA21A, 0xA21B, 0xA21C, 0xA21D, 0xA21E, 0xA21F,
+    0xA220, 0xA221, 0xA222, 0xA223, 0xA224, 0xA225, 0xA226, 0xA227,
+    0xA228, 0xA229, 0xA22A, 0xA22B, 0xA22C, 0xA22D, 0xA22E, 0xA22F,
+    0xA230, 0xA231, 0xA232, 0xA233, 0xA234, 0xA235, 0xA236, 0xA237,
+    0xA238, 0xA239, 0xA23A, 0xA23B, 0xA23C, 0xA23D, 0xA23E, 0xA23F,
+    0xA240, 0xA241, 0xA242, 0xA243, 0xA244, 0xA245, 0xA246, 0xA247,
+    0xA248, 0xA249, 0xA24A, 0xA24B, 0xA24C, 0xA24D, 0xA24E, 0xA24F,
+    0xA250, 0xA251, 0xA252, 0xA253, 0xA254, 0xA255, 0xA256, 0xA257,
+    0xA258, 0xA259, 0xA25A, 0xA25B, 0xA25C, 0xA25D, 0xA25E, 0xA25F,
+    0xA260, 0xA261, 0xA262, 0xA263, 0xA264, 0xA265, 0xA266, 0xA267,
+    0xA268, 0xA269, 0xA26A, 0xA26B, 0xA26C, 0xA26D, 0xA26E, 0xA26F,
+    0xA270, 0xA271, 0xA272, 0xA273, 0xA274, 0xA275, 0xA276, 0xA277,
+    0xA278, 0xA279, 0xA27A, 0xA27B, 0xA27C, 0xA27D, 0xA27E, 0xA27F,
+    0xA280, 0xA281, 0xA282, 0xA283, 0xA284, 0xA285, 0xA286, 0xA287,
+    0xA288, 0xA289, 0xA28A, 0xA28B, 0xA28C, 0xA28D, 0xA28E, 0xA28F,
+    0xA290, 0xA291, 0xA292, 0xA293, 0xA294, 0xA295, 0xA296, 0xA297,
+    0xA298, 0xA299, 0xA29A, 0xA29B, 0xA29C, 0xA29D, 0xA29E, 0xA29F,
+    0xA2A0, 0xA2A1, 0xA2A2, 0xA2A3, 0xA2A4, 0xA2A5, 0xA2A6, 0xA2A7,
+    0xA2A8, 0xA2A9, 0xA2AA, 0xA2AB, 0xA2AC, 0xA2AD, 0xA2AE, 0xA2AF,
+    0xA2B0, 0xA2B1, 0xA2B2, 0xA2B3, 0xA2B4, 0xA2B5, 0xA2B6, 0xA2B7,
+    0xA2B8, 0xA2B9, 0xA2BA, 0xA2BB, 0xA2BC, 0xA2BD, 0xA2BE, 0xA2BF,
+    0xA2C0, 0xA2C1, 0xA2C2, 0xA2C3, 0xA2C4, 0xA2C5, 0xA2C6, 0xA2C7,
+    0xA2C8, 0xA2C9, 0xA2CA, 0xA2CB, 0xA2CC, 0xA2CD, 0xA2CE, 0xA2CF,
+    0xA2D0, 0xA2D1, 0xA2D2, 0xA2D3, 0xA2D4, 0xA2D5, 0xA2D6, 0xA2D7,
+    0xA2D8, 0xA2D9, 0xA2DA, 0xA2DB, 0xA2DC, 0xA2DD, 0xA2DE, 0xA2DF,
+    0xA2E0, 0xA2E1, 0xA2E2, 0xA2E3, 0xA2E4, 0xA2E5, 0xA2E6, 0xA2E7,
+    0xA2E8, 0xA2E9, 0xA2EA, 0xA2EB, 0xA2EC, 0xA2ED, 0xA2EE, 0xA2EF,
+    0xA2F0, 0xA2F1, 0xA2F2, 0xA2F3, 0xA2F4, 0xA2F5, 0xA2F6, 0xA2F7,
+    0xA2F8, 0xA2F9, 0xA2FA, 0xA2FB, 0xA2FC, 0xA2FD, 0xA2FE, 0xA2FF,
+    0xA300, 0xA301, 0xA302, 0xA303, 0xA304, 0xA305, 0xA306, 0xA307,
+    0xA308, 0xA309, 0xA30A, 0xA30B, 0xA30C, 0xA30D, 0xA30E, 0xA30F,
+    0xA310, 0xA311, 0xA312, 0xA313, 0xA314, 0xA315, 0xA316, 0xA317,
+    0xA318, 0xA319, 0xA31A, 0xA31B, 0xA31C, 0xA31D, 0xA31E, 0xA31F,
+    0xA320, 0xA321, 0xA322, 0xA323, 0xA324, 0xA325, 0xA326, 0xA327,
+    0xA328, 0xA329, 0xA32A, 0xA32B, 0xA32C, 0xA32D, 0xA32E, 0xA32F,
+    0xA330, 0xA331, 0xA332, 0xA333, 0xA334, 0xA335, 0xA336, 0xA337,
+    0xA338, 0xA339, 0xA33A, 0xA33B, 0xA33C, 0xA33D, 0xA33E, 0xA33F,
+    0xA340, 0xA341, 0xA342, 0xA343, 0xA344, 0xA345, 0xA346, 0xA347,
+    0xA348, 0xA349, 0xA34A, 0xA34B, 0xA34C, 0xA34D, 0xA34E, 0xA34F,
+    0xA350, 0xA351, 0xA352, 0xA353, 0xA354, 0xA355, 0xA356, 0xA357,
+    0xA358, 0xA359, 0xA35A, 0xA35B, 0xA35C, 0xA35D, 0xA35E, 0xA35F,
+    0xA360, 0xA361, 0xA362, 0xA363, 0xA364, 0xA365, 0xA366, 0xA367,
+    0xA368, 0xA369, 0xA36A, 0xA36B, 0xA36C, 0xA36D, 0xA36E, 0xA36F,
+    0xA370, 0xA371, 0xA372, 0xA373, 0xA374, 0xA375, 0xA376, 0xA377,
+    0xA378, 0xA379, 0xA37A, 0xA37B, 0xA37C, 0xA37D, 0xA37E, 0xA37F,
+    0xA380, 0xA381, 0xA382, 0xA383, 0xA384, 0xA385, 0xA386, 0xA387,
+    0xA388, 0xA389, 0xA38A, 0xA38B, 0xA38C, 0xA38D, 0xA38E, 0xA38F,
+    0xA390, 0xA391, 0xA392, 0xA393, 0xA394, 0xA395, 0xA396, 0xA397,
+    0xA398, 0xA399, 0xA39A, 0xA39B, 0xA39C, 0xA39D, 0xA39E, 0xA39F,
+    0xA3A0, 0xA3A1, 0xA3A2, 0xA3A3, 0xA3A4, 0xA3A5, 0xA3A6, 0xA3A7,
+    0xA3A8, 0xA3A9, 0xA3AA, 0xA3AB, 0xA3AC, 0xA3AD, 0xA3AE, 0xA3AF,
+    0xA3B0, 0xA3B1, 0xA3B2, 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B7,
+    0xA3B8, 0xA3B9, 0xA3BA, 0xA3BB, 0xA3BC, 0xA3BD, 0xA3BE, 0xA3BF,
+    0xA3C0, 0xA3C1, 0xA3C2, 0xA3C3, 0xA3C4, 0xA3C5, 0xA3C6, 0xA3C7,
+    0xA3C8, 0xA3C9, 0xA3CA, 0xA3CB, 0xA3CC, 0xA3CD, 0xA3CE, 0xA3CF,
+    0xA3D0, 0xA3D1, 0xA3D2, 0xA3D3, 0xA3D4, 0xA3D5, 0xA3D6, 0xA3D7,
+    0xA3D8, 0xA3D9, 0xA3DA, 0xA3DB, 0xA3DC, 0xA3DD, 0xA3DE, 0xA3DF,
+    0xA3E0, 0xA3E1, 0xA3E2, 0xA3E3, 0xA3E4, 0xA3E5, 0xA3E6, 0xA3E7,
+    0xA3E8, 0xA3E9, 0xA3EA, 0xA3EB, 0xA3EC, 0xA3ED, 0xA3EE, 0xA3EF,
+    0xA3F0, 0xA3F1, 0xA3F2, 0xA3F3, 0xA3F4, 0xA3F5, 0xA3F6, 0xA3F7,
+    0xA3F8, 0xA3F9, 0xA3FA, 0xA3FB, 0xA3FC, 0xA3FD, 0xA3FE, 0xA3FF,
+    0xA400, 0xA401, 0xA402, 0xA403, 0xA404, 0xA405, 0xA406, 0xA407,
+    0xA408, 0xA409, 0xA40A, 0xA40B, 0xA40C, 0xA40D, 0xA40E, 0xA40F,
+    0xA410, 0xA411, 0xA412, 0xA413, 0xA414, 0xA415, 0xA416, 0xA417,
+    0xA418, 0xA419, 0xA41A, 0xA41B, 0xA41C, 0xA41D, 0xA41E, 0xA41F,
+    0xA420, 0xA421, 0xA422, 0xA423, 0xA424, 0xA425, 0xA426, 0xA427,
+    0xA428, 0xA429, 0xA42A, 0xA42B, 0xA42C, 0xA42D, 0xA42E, 0xA42F,
+    0xA430, 0xA431, 0xA432, 0xA433, 0xA434, 0xA435, 0xA436, 0xA437,
+    0xA438, 0xA439, 0xA43A, 0xA43B, 0xA43C, 0xA43D, 0xA43E, 0xA43F,
+    0xA440, 0xA441, 0xA442, 0xA443, 0xA444, 0xA445, 0xA446, 0xA447,
+    0xA448, 0xA449, 0xA44A, 0xA44B, 0xA44C, 0xA44D, 0xA44E, 0xA44F,
+    0xA450, 0xA451, 0xA452, 0xA453, 0xA454, 0xA455, 0xA456, 0xA457,
+    0xA458, 0xA459, 0xA45A, 0xA45B, 0xA45C, 0xA45D, 0xA45E, 0xA45F,
+    0xA460, 0xA461, 0xA462, 0xA463, 0xA464, 0xA465, 0xA466, 0xA467,
+    0xA468, 0xA469, 0xA46A, 0xA46B, 0xA46C, 0xA46D, 0xA46E, 0xA46F,
+    0xA470, 0xA471, 0xA472, 0xA473, 0xA474, 0xA475, 0xA476, 0xA477,
+    0xA478, 0xA479, 0xA47A, 0xA47B, 0xA47C, 0xA47D, 0xA47E, 0xA47F,
+    0xA480, 0xA481, 0xA482, 0xA483, 0xA484, 0xA485, 0xA486, 0xA487,
+    0xA488, 0xA489, 0xA48A, 0xA48B, 0xA48C, 0xA490, 0xA491, 0xA492,
+    0xA493, 0xA494, 0xA495, 0xA496, 0xA497, 0xA498, 0xA499, 0xA49A,
+    0xA49B, 0xA49C, 0xA49D, 0xA49E, 0xA49F, 0xA4A0, 0xA4A1, 0xA4A2,
+    0xA4A3, 0xA4A4, 0xA4A5, 0xA4A6, 0xA4A7, 0xA4A8, 0xA4A9, 0xA4AA,
+    0xA4AB, 0xA4AC, 0xA4AD, 0xA4AE, 0xA4AF, 0xA4B0, 0xA4B1, 0xA4B2,
+    0xA4B3, 0xA4B4, 0xA4B5, 0xA4B6, 0xA4B7, 0xA4B8, 0xA4B9, 0xA4BA,
+    0xA4BB, 0xA4BC, 0xA4BD, 0xA4BE, 0xA4BF, 0xA4C0, 0xA4C1, 0xA4C2,
+    0xA4C3, 0xA4C4, 0xA4C5, 0xA4C6,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp
new file mode 100644
index 0000000..f216f8a
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp
@@ -0,0 +1,38 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_GB_EUC_H_0[90 * 3] = {

+    0x0020, 0x0020, 0x1E24, 0x0021, 0x007E, 0x032E, 0xA1A1, 0xA1FE, 0x0060,

+    0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA,

+    0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7,

+    0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A,

+    0xA7D1, 0xA7F1, 0x027B, 0xA8A1, 0xA8C0, 0x029C, 0xA8C5, 0xA8EA, 0x02BC,

+    0xA9A4, 0xA9EF, 0x02E2, 0xAAA1, 0xAAFE, 0x032E, 0xABA1, 0xABC0, 0x038C,

+    0xB0A1, 0xB0FE, 0x03AC, 0xB1A1, 0xB1FE, 0x040A, 0xB2A1, 0xB2FE, 0x0468,

+    0xB3A1, 0xB3FE, 0x04C6, 0xB4A1, 0xB4FE, 0x0524, 0xB5A1, 0xB5FE, 0x0582,

+    0xB6A1, 0xB6FE, 0x05E0, 0xB7A1, 0xB7FE, 0x063E, 0xB8A1, 0xB8FE, 0x069C,

+    0xB9A1, 0xB9FE, 0x06FA, 0xBAA1, 0xBAFE, 0x0758, 0xBBA1, 0xBBFE, 0x07B6,

+    0xBCA1, 0xBCFE, 0x0814, 0xBDA1, 0xBDFE, 0x0872, 0xBEA1, 0xBEFE, 0x08D0,

+    0xBFA1, 0xBFFE, 0x092E, 0xC0A1, 0xC0FE, 0x098C, 0xC1A1, 0xC1FE, 0x09EA,

+    0xC2A1, 0xC2FE, 0x0A48, 0xC3A1, 0xC3FE, 0x0AA6, 0xC4A1, 0xC4FE, 0x0B04,

+    0xC5A1, 0xC5FE, 0x0B62, 0xC6A1, 0xC6FE, 0x0BC0, 0xC7A1, 0xC7FE, 0x0C1E,

+    0xC8A1, 0xC8FE, 0x0C7C, 0xC9A1, 0xC9FE, 0x0CDA, 0xCAA1, 0xCAFE, 0x0D38,

+    0xCBA1, 0xCBFE, 0x0D96, 0xCCA1, 0xCCFE, 0x0DF4, 0xCDA1, 0xCDFE, 0x0E52,

+    0xCEA1, 0xCEFE, 0x0EB0, 0xCFA1, 0xCFFE, 0x0F0E, 0xD0A1, 0xD0FE, 0x0F6C,

+    0xD1A1, 0xD1FE, 0x0FCA, 0xD2A1, 0xD2FE, 0x1028, 0xD3A1, 0xD3FE, 0x1086,

+    0xD4A1, 0xD4FE, 0x10E4, 0xD5A1, 0xD5FE, 0x1142, 0xD6A1, 0xD6FE, 0x11A0,

+    0xD7A1, 0xD7F9, 0x11FE, 0xD8A1, 0xD8FE, 0x1257, 0xD9A1, 0xD9FE, 0x12B5,

+    0xDAA1, 0xDAFE, 0x1313, 0xDBA1, 0xDBFE, 0x1371, 0xDCA1, 0xDCFE, 0x13CF,

+    0xDDA1, 0xDDFE, 0x142D, 0xDEA1, 0xDEFE, 0x148B, 0xDFA1, 0xDFFE, 0x14E9,

+    0xE0A1, 0xE0FE, 0x1547, 0xE1A1, 0xE1FE, 0x15A5, 0xE2A1, 0xE2FE, 0x1603,

+    0xE3A1, 0xE3FE, 0x1661, 0xE4A1, 0xE4FE, 0x16BF, 0xE5A1, 0xE5FE, 0x171D,

+    0xE6A1, 0xE6FE, 0x177B, 0xE7A1, 0xE7FE, 0x17D9, 0xE8A1, 0xE8FE, 0x1837,

+    0xE9A1, 0xE9FE, 0x1895, 0xEAA1, 0xEAFE, 0x18F3, 0xEBA1, 0xEBFE, 0x1951,

+    0xECA1, 0xECFE, 0x19AF, 0xEDA1, 0xEDFE, 0x1A0D, 0xEEA1, 0xEEFE, 0x1A6B,

+    0xEFA1, 0xEFFE, 0x1AC9, 0xF0A1, 0xF0FE, 0x1B27, 0xF1A1, 0xF1FE, 0x1B85,

+    0xF2A1, 0xF2FE, 0x1BE3, 0xF3A1, 0xF3FE, 0x1C41, 0xF4A1, 0xF4FE, 0x1C9F,

+    0xF5A1, 0xF5FE, 0x1CFD, 0xF6A1, 0xF6FE, 0x1D5B, 0xF7A1, 0xF7FE, 0x1DB9,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp
new file mode 100644
index 0000000..d71cd35
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_GB_EUC_V_0[20 * 3] = {

+    0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,

+    0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,

+    0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,

+    0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,

+    0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,

+    0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,

+    0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp
new file mode 100644
index 0000000..c7c486b
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp
@@ -0,0 +1,1365 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_GBK_EUC_H_2[4071 * 3] = {

+    0x0020, 0x0020, 0x1E24, 0x0021, 0x007E, 0x032E, 0x8140, 0x8178, 0x2758,

+    0x8179, 0x8179, 0x2059, 0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796,

+    0x8186, 0x8186, 0x21F1, 0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2,

+    0x81EE, 0x81F5, 0x2802, 0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A,

+    0x8240, 0x8252, 0x2812, 0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825,

+    0x8262, 0x8262, 0x21B5, 0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC,

+    0x8275, 0x8279, 0x2844, 0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849,

+    0x827D, 0x827D, 0x1E62, 0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20,

+    0x8281, 0x8282, 0x284C, 0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E,

+    0x8290, 0x8290, 0x205C, 0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194,

+    0x82A6, 0x82C7, 0x286E, 0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281,

+    0x82CA, 0x82E0, 0x2890, 0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7,

+    0x82E3, 0x82E3, 0x210A, 0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8,

+    0x82ED, 0x82ED, 0x267F, 0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E,

+    0x82F3, 0x82F6, 0x28B4, 0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB,

+    0x82F9, 0x82F9, 0x226C, 0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117,

+    0x82FC, 0x82FE, 0x28B9, 0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8,

+    0x8342, 0x8344, 0x28BD, 0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0,

+    0x8348, 0x8348, 0x1FB9, 0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8,

+    0x834D, 0x8352, 0x28C5, 0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB,

+    0x8357, 0x8357, 0x20C2, 0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195,

+    0x835F, 0x8364, 0x28D4, 0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3,

+    0x8367, 0x8371, 0x28DA, 0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5,

+    0x8378, 0x8378, 0x2210, 0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF,

+    0x837B, 0x837B, 0x28EB, 0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC,

+    0x837E, 0x837E, 0x1FE4, 0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED,

+    0x8386, 0x8386, 0x22D6, 0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0,

+    0x838A, 0x838A, 0x22CE, 0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681,

+    0x838E, 0x8393, 0x28F6, 0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC,

+    0x839E, 0x839E, 0x2231, 0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93,

+    0x83A7, 0x83AA, 0x290C, 0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910,

+    0x83AE, 0x83AE, 0x22D7, 0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1,

+    0x83B1, 0x83B9, 0x2912, 0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B,

+    0x83C9, 0x83C9, 0x2025, 0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF,

+    0x83F7, 0x83FE, 0x2955, 0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9,

+    0x8451, 0x8470, 0x296D, 0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D,

+    0x8474, 0x8474, 0x2263, 0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683,

+    0x8478, 0x847E, 0x2991, 0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17,

+    0x8483, 0x848D, 0x299A, 0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5,

+    0x8492, 0x8492, 0x22CA, 0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8,

+    0x849D, 0x849D, 0x1F4F, 0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF,

+    0x84A2, 0x84A2, 0x2036, 0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4,

+    0x84A5, 0x84A5, 0x22C9, 0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5,

+    0x84A9, 0x84A9, 0x1F75, 0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE,

+    0x84C6, 0x84D2, 0x29D2, 0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF,

+    0x84D5, 0x84D5, 0x21A9, 0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6,

+    0x84D8, 0x84D8, 0x29E1, 0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003,

+    0x84DB, 0x84DC, 0x29E2, 0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4,

+    0x84EA, 0x84EA, 0x2323, 0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011,

+    0x84EF, 0x84F0, 0x29F3, 0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5,

+    0x8540, 0x8550, 0x2A02, 0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E,

+    0x8553, 0x8553, 0x2A13, 0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14,

+    0x855E, 0x855E, 0x20EF, 0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0,

+    0x8567, 0x857E, 0x2A24, 0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1,

+    0x8588, 0x858A, 0x2A43, 0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46,

+    0x8592, 0x8592, 0x21F9, 0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010,

+    0x8597, 0x8597, 0x2A4F, 0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50,

+    0x85A2, 0x85A2, 0x1E5A, 0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2,

+    0x85B3, 0x85FE, 0x2A68, 0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D,

+    0x864B, 0x8653, 0x2ABE, 0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7,

+    0x8668, 0x8668, 0x236C, 0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0,

+    0x8696, 0x8696, 0x219C, 0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9,

+    0x869A, 0x86A0, 0x2B08, 0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F,

+    0x86CA, 0x86CA, 0x210B, 0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE,

+    0x86CD, 0x86CD, 0x2B38, 0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39,

+    0x86D1, 0x86D1, 0x222C, 0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8,

+    0x86DD, 0x86DD, 0x22C0, 0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F,

+    0x86E2, 0x86E7, 0x2B48, 0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E,

+    0x86EE, 0x86EE, 0x2379, 0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372,

+    0x86F5, 0x86FE, 0x2B58, 0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62,

+    0x8744, 0x8744, 0x237C, 0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0,

+    0x874A, 0x874A, 0x2B69, 0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74,

+    0x874D, 0x874E, 0x2B6A, 0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C,

+    0x8757, 0x8757, 0x1F4C, 0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378,

+    0x875B, 0x875B, 0x21CF, 0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75,

+    0x875E, 0x875E, 0x2371, 0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369,

+    0x8761, 0x8765, 0x2B77, 0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C,

+    0x877A, 0x877A, 0x236F, 0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370,

+    0x877E, 0x877E, 0x2B91, 0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376,

+    0x8782, 0x8782, 0x2373, 0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F,

+    0x8787, 0x8787, 0x2B96, 0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97,

+    0x878A, 0x878A, 0x20B5, 0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB,

+    0x878E, 0x878E, 0x2672, 0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E,

+    0x8794, 0x8797, 0x2B9E, 0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2,

+    0x879D, 0x879D, 0x2375, 0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382,

+    0x87A4, 0x87A6, 0x2BAB, 0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE,

+    0x87B3, 0x87B3, 0x236B, 0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039,

+    0x87B6, 0x87BA, 0x2BBA, 0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF,

+    0x87BF, 0x87BF, 0x237D, 0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2,

+    0x87C2, 0x87C2, 0x2381, 0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B,

+    0x87CB, 0x87CB, 0x237E, 0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA,

+    0x87CF, 0x87CF, 0x22DB, 0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A,

+    0x87D3, 0x87D3, 0x2689, 0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697,

+    0x87D6, 0x87D9, 0x2BCF, 0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3,

+    0x87F7, 0x87F7, 0x2383, 0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF,

+    0x87FA, 0x87FA, 0x218F, 0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246,

+    0x8841, 0x8841, 0x2248, 0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E,

+    0x8845, 0x8845, 0x2BF6, 0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7,

+    0x8880, 0x88B9, 0x2C2F, 0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69,

+    0x88CC, 0x88CC, 0x228B, 0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85,

+    0x88D5, 0x88D6, 0x2C81, 0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83,

+    0x88DF, 0x88DF, 0x232C, 0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E,

+    0x88E6, 0x88F1, 0x2C8F, 0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38,

+    0x88F4, 0x88F5, 0x2C9B, 0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D,

+    0x8940, 0x894A, 0x2CA5, 0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339,

+    0x894D, 0x894D, 0x2CB0, 0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1,

+    0x8950, 0x8950, 0x232D, 0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F,

+    0x8955, 0x895C, 0x2CB5, 0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD,

+    0x895F, 0x895F, 0x232F, 0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D,

+    0x896E, 0x8970, 0x2CCB, 0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE,

+    0x897C, 0x897C, 0x1EC2, 0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA,

+    0x898B, 0x898B, 0x22B2, 0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF,

+    0x899A, 0x899D, 0x2CF2, 0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6,

+    0x89A6, 0x89A6, 0x20D9, 0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD,

+    0x89A9, 0x89AE, 0x2CFE, 0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04,

+    0x89BA, 0x89BA, 0x21ED, 0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007,

+    0x89BF, 0x89BF, 0x2326, 0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11,

+    0x89C4, 0x89C4, 0x1F52, 0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328,

+    0x89C7, 0x89C7, 0x2D14, 0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15,

+    0x89CE, 0x89CE, 0x1E2B, 0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE,

+    0x89D2, 0x89D7, 0x2D1C, 0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22,

+    0x89DB, 0x89DB, 0x2138, 0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081,

+    0x89F5, 0x89FE, 0x2D3C, 0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C,

+    0x8A42, 0x8A58, 0x2D47, 0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE,

+    0x8A5B, 0x8A5B, 0x2D5E, 0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F,

+    0x8A5E, 0x8A5E, 0x1EFA, 0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD,

+    0x8A7A, 0x8A7E, 0x2D7A, 0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F,

+    0x8AE5, 0x8AFE, 0x2DE3, 0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E,

+    0x8B45, 0x8B48, 0x2E01, 0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05,

+    0x8B7A, 0x8B7A, 0x23FC, 0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39,

+    0x8B8C, 0x8B8C, 0x2069, 0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7,

+    0x8B9F, 0x8BB2, 0x2E56, 0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A,

+    0x8BB9, 0x8BB9, 0x23FD, 0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8,

+    0x8BBF, 0x8BC5, 0x2E73, 0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A,

+    0x8BC8, 0x8BC8, 0x23FE, 0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B,

+    0x8BD4, 0x8BD4, 0x2401, 0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF,

+    0x8BDD, 0x8BE4, 0x2E8C, 0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94,

+    0x8BEB, 0x8BEB, 0x2221, 0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122,

+    0x8BF1, 0x8BFE, 0x2E9D, 0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB,

+    0x8C45, 0x8C4E, 0x2EAF, 0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9,

+    0x8C57, 0x8C57, 0x21E5, 0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057,

+    0x8C5D, 0x8C7E, 0x2EC4, 0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5,

+    0x8C8C, 0x8C8C, 0x2EF1, 0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3,

+    0x8C8F, 0x8C8F, 0x2121, 0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4,

+    0x8C92, 0x8C92, 0x1FE5, 0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A,

+    0x8C9A, 0x8C9A, 0x1E37, 0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E,

+    0x8CA3, 0x8CA3, 0x22A6, 0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00,

+    0x8CA6, 0x8CA6, 0x1EDA, 0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01,

+    0x8CC0, 0x8CC0, 0x235C, 0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050,

+    0x8CD3, 0x8CD3, 0x1E67, 0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4,

+    0x8CD6, 0x8CD8, 0x2F2B, 0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E,

+    0x8CF9, 0x8CF9, 0x1F16, 0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52,

+    0x8D73, 0x8D73, 0x2389, 0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7,

+    0x8D76, 0x8D7A, 0x2F86, 0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B,

+    0x8D80, 0x8D87, 0x2F8E, 0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96,

+    0x8D8F, 0x8D8F, 0x1F1A, 0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B,

+    0x8D9F, 0x8DB8, 0x2FAA, 0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4,

+    0x8DE2, 0x8DE2, 0x2391, 0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271,

+    0x8DE5, 0x8DE6, 0x2FED, 0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF,

+    0x8DF7, 0x8DF7, 0x238E, 0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D,

+    0x8E40, 0x8E45, 0x3004, 0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A,

+    0x8E56, 0x8E56, 0x2390, 0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033,

+    0x8E59, 0x8E59, 0x301A, 0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B,

+    0x8E68, 0x8E68, 0x1FE9, 0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055,

+    0x8E6F, 0x8E6F, 0x302D, 0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E,

+    0x8E80, 0x8E80, 0x2324, 0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143,

+    0x8E9C, 0x8E9E, 0x3056, 0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059,

+    0x8EA4, 0x8EA4, 0x2277, 0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7,

+    0x8EA8, 0x8EAB, 0x305F, 0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063,

+    0x8EAE, 0x8EAE, 0x2384, 0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387,

+    0x8EBE, 0x8EBE, 0x2386, 0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290,

+    0x8EC4, 0x8EC4, 0x3076, 0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077,

+    0x8ECD, 0x8ECD, 0x1E32, 0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E,

+    0x8ED6, 0x8ED6, 0x1F13, 0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085,

+    0x8EEC, 0x8EEC, 0x1FE0, 0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB,

+    0x8F52, 0x8F52, 0x2087, 0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE,

+    0x8F55, 0x8F55, 0x1EF6, 0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD,

+    0x8F5D, 0x8F5D, 0x2045, 0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178,

+    0x8F65, 0x8F7E, 0x30C9, 0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5,

+    0x8F87, 0x8F87, 0x30E9, 0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA,

+    0x8F95, 0x8F95, 0x266E, 0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0,

+    0x8F98, 0x8F9A, 0x30F7, 0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA,

+    0x8F9D, 0x8F9D, 0x2188, 0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C,

+    0x8FA2, 0x8FBC, 0x30FE, 0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119,

+    0x8FC4, 0x8FC4, 0x1EA1, 0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393,

+    0x8FC7, 0x8FCC, 0x3120, 0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126,

+    0x8FD8, 0x8FD8, 0x1E7C, 0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156,

+    0x9080, 0x909C, 0x3195, 0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E,

+    0x909F, 0x90B9, 0x31B2, 0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD,

+    0x90C0, 0x90C0, 0x2095, 0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2,

+    0x90C5, 0x90C5, 0x23B9, 0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28,

+    0x90DC, 0x90DC, 0x23BD, 0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5,

+    0x90EE, 0x90EF, 0x31FA, 0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC,

+    0x90F7, 0x90F7, 0x23B3, 0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209,

+    0x9142, 0x9142, 0x2162, 0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E,

+    0x914C, 0x914C, 0x3213, 0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214,

+    0x9151, 0x9151, 0x23B7, 0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F,

+    0x9155, 0x9155, 0x24DF, 0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2,

+    0x915A, 0x915A, 0x214E, 0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052,

+    0x915E, 0x9160, 0x321E, 0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221,

+    0x9163, 0x9163, 0x20EB, 0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232,

+    0x916F, 0x9175, 0x322C, 0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233,

+    0x917A, 0x917A, 0x201B, 0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE,

+    0x917D, 0x917E, 0x3236, 0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE,

+    0x9185, 0x918C, 0x323C, 0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244,

+    0x9191, 0x9191, 0x2089, 0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1,

+    0x9194, 0x9196, 0x3248, 0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B,

+    0x919B, 0x919B, 0x2214, 0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE,

+    0x91AA, 0x91AA, 0x2223, 0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B,

+    0x91BA, 0x91BA, 0x268C, 0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269,

+    0x91BF, 0x91BF, 0x24E0, 0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8,

+    0x91C4, 0x91CC, 0x326F, 0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278,

+    0x91D0, 0x91D0, 0x1FFE, 0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1,

+    0x91D3, 0x91D3, 0x327A, 0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B,

+    0x91D6, 0x91D6, 0x1FCE, 0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E,

+    0x91D9, 0x91D9, 0x2021, 0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1,

+    0x91E0, 0x91E1, 0x3282, 0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284,

+    0x91EA, 0x91EA, 0x24A4, 0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273,

+    0x91F1, 0x91F1, 0x3290, 0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291,

+    0x9240, 0x927E, 0x329D, 0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1,

+    0x92B7, 0x92CD, 0x3312, 0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329,

+    0x92D0, 0x92D0, 0x235D, 0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682,

+    0x92D5, 0x92DE, 0x332D, 0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A,

+    0x92E1, 0x92FD, 0x3337, 0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354,

+    0x9350, 0x9350, 0x21FF, 0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58,

+    0x935E, 0x936F, 0x3370, 0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382,

+    0x9376, 0x9376, 0x1EB6, 0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F,

+    0x938C, 0x938C, 0x20DB, 0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360,

+    0x939E, 0x93A4, 0x33AB, 0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2,

+    0x93A7, 0x93A7, 0x2040, 0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E,

+    0x93B5, 0x93B7, 0x33BF, 0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2,

+    0x93BB, 0x93BB, 0x235E, 0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A,

+    0x93BE, 0x93C5, 0x33C5, 0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD,

+    0x93CF, 0x93CF, 0x2093, 0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F,

+    0x93D8, 0x93DA, 0x33DC, 0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54,

+    0x93DD, 0x93E0, 0x33DF, 0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3,

+    0x93E4, 0x93E4, 0x20C0, 0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5,

+    0x93E9, 0x93E9, 0x2160, 0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D,

+    0x93EC, 0x93EC, 0x1F8E, 0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9,

+    0x93EF, 0x93EF, 0x2047, 0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262,

+    0x93F2, 0x93F3, 0x33EB, 0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2,

+    0x93F6, 0x93F9, 0x33ED, 0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1,

+    0x93FE, 0x93FE, 0x1FCC, 0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72,

+    0x9445, 0x944C, 0x33F8, 0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400,

+    0x9450, 0x9450, 0x1E52, 0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C,

+    0x9453, 0x9453, 0x228F, 0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED,

+    0x9456, 0x9457, 0x3403, 0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405,

+    0x945B, 0x945B, 0x1E2D, 0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366,

+    0x945E, 0x945E, 0x3407, 0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408,

+    0x9464, 0x9464, 0x2363, 0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A,

+    0x9467, 0x946D, 0x340D, 0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414,

+    0x9472, 0x9472, 0x1FF6, 0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364,

+    0x9475, 0x9475, 0x3418, 0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419,

+    0x9478, 0x9478, 0x2367, 0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D,

+    0x947B, 0x947E, 0x341B, 0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056,

+    0x9482, 0x9482, 0x2163, 0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9,

+    0x9488, 0x9488, 0x1FFC, 0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E,

+    0x94A2, 0x94B2, 0x343B, 0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C,

+    0x94B5, 0x94B5, 0x2142, 0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E,

+    0x94C0, 0x94C0, 0x1E43, 0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4,

+    0x94CD, 0x94D7, 0x3461, 0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C,

+    0x94E0, 0x94E0, 0x1ED7, 0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491,

+    0x9572, 0x9572, 0x212D, 0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF,

+    0x9583, 0x9583, 0x229B, 0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256,

+    0x959F, 0x959F, 0x24A8, 0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79,

+    0x95B4, 0x95B9, 0x34FF, 0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505,

+    0x95CF, 0x95CF, 0x24A7, 0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686,

+    0x95D2, 0x95D2, 0x24A6, 0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE,

+    0x95D5, 0x95E0, 0x351B, 0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527,

+    0x95E7, 0x95E7, 0x1FE7, 0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112,

+    0x95F2, 0x95F7, 0x3535, 0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B,

+    0x95FE, 0x95FE, 0x1F5C, 0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4,

+    0x9657, 0x967B, 0x3556, 0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B,

+    0x9680, 0x96FE, 0x357D, 0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A,

+    0x9768, 0x976B, 0x3623, 0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627,

+    0x976E, 0x976E, 0x246D, 0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638,

+    0x9796, 0x9796, 0x246B, 0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E,

+    0x979D, 0x979D, 0x1ECE, 0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272,

+    0x97A4, 0x97BE, 0x3658, 0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673,

+    0x97EE, 0x97EE, 0x21FE, 0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE,

+    0x97F8, 0x97FE, 0x36A9, 0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475,

+    0x9846, 0x9848, 0x36B5, 0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8,

+    0x984F, 0x984F, 0x1F6F, 0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468,

+    0x9872, 0x9872, 0x36DE, 0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF,

+    0x9880, 0x9880, 0x36EA, 0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB,

+    0x988B, 0x988B, 0x1F27, 0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4,

+    0x98A0, 0x98A0, 0x247C, 0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1,

+    0x98AB, 0x98B5, 0x3710, 0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005,

+    0x98B8, 0x98B9, 0x371B, 0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D,

+    0x98C7, 0x98C7, 0x203E, 0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C,

+    0x98CC, 0x98CF, 0x372C, 0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730,

+    0x98D3, 0x98D3, 0x2204, 0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3,

+    0x98E4, 0x98E4, 0x2140, 0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741,

+    0x98EF, 0x98EF, 0x2474, 0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD,

+    0x98F3, 0x98FE, 0x374C, 0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68,

+    0x9944, 0x9944, 0x375B, 0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C,

+    0x9966, 0x9966, 0x2472, 0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5,

+    0x996F, 0x9974, 0x3783, 0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789,

+    0x997A, 0x997A, 0x1F8B, 0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D,

+    0x9980, 0x9984, 0x3790, 0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795,

+    0x9989, 0x9989, 0x2482, 0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1,

+    0x998F, 0x9990, 0x379C, 0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E,

+    0x9999, 0x9999, 0x1F38, 0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485,

+    0x99AA, 0x99AF, 0x37B4, 0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E,

+    0x99B2, 0x99B2, 0x37BA, 0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486,

+    0x99B5, 0x99B5, 0x2471, 0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483,

+    0x99BE, 0x99BE, 0x2470, 0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469,

+    0x99C1, 0x99C1, 0x37C3, 0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4,

+    0x99C9, 0x99C9, 0x246F, 0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481,

+    0x99CF, 0x99D0, 0x37CE, 0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0,

+    0x99DA, 0x99DA, 0x1FF5, 0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4,

+    0x99E1, 0x99E4, 0x37DD, 0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1,

+    0x99E8, 0x99E8, 0x2479, 0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E,

+    0x99ED, 0x99F3, 0x37E6, 0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED,

+    0x9A40, 0x9A49, 0x37F7, 0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801,

+    0x9A57, 0x9A57, 0x20AD, 0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB,

+    0x9A66, 0x9A66, 0x381A, 0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B,

+    0x9A71, 0x9A71, 0x2159, 0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013,

+    0x9A77, 0x9A77, 0x1F33, 0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F,

+    0x9A88, 0x9A88, 0x1E5C, 0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488,

+    0x9A8D, 0x9A90, 0x383A, 0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E,

+    0x9A97, 0x9A97, 0x248A, 0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489,

+    0x9A9B, 0x9A9B, 0x248B, 0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83,

+    0x9A9F, 0x9AA1, 0x3847, 0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB,

+    0x9AA4, 0x9AA9, 0x384A, 0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850,

+    0x9AD0, 0x9AD0, 0x24C0, 0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D,

+    0x9AD7, 0x9AD9, 0x387A, 0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D,

+    0x9AE2, 0x9AE2, 0x20CA, 0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7,

+    0x9AE5, 0x9AE5, 0x24C2, 0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E,

+    0x9B80, 0x9BD0, 0x38DD, 0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E,

+    0x9BDC, 0x9BDC, 0x23DB, 0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A,

+    0x9C53, 0x9C53, 0x205E, 0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244,

+    0x9C5A, 0x9C5A, 0x23E2, 0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4,

+    0x9C5D, 0x9C74, 0x3973, 0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B,

+    0x9C79, 0x9C79, 0x1E66, 0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993,

+    0x9C86, 0x9C86, 0x1F63, 0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD,

+    0x9C9E, 0x9CAA, 0x39AF, 0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC,

+    0x9CCA, 0x9CCA, 0x22B5, 0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26,

+    0x9CD0, 0x9CE5, 0x39DE, 0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088,

+    0x9CE8, 0x9CEB, 0x39F4, 0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8,

+    0x9CEE, 0x9CEE, 0x2341, 0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B,

+    0x9CFC, 0x9CFD, 0x3A05, 0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07,

+    0x9D42, 0x9D42, 0x2124, 0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048,

+    0x9D47, 0x9D47, 0x23E0, 0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077,

+    0x9D4E, 0x9D4E, 0x3A11, 0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12,

+    0x9D61, 0x9D61, 0x20B1, 0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41,

+    0x9D69, 0x9D69, 0x201C, 0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8,

+    0x9D6F, 0x9D70, 0x3A2D, 0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F,

+    0x9D75, 0x9D75, 0x1F9B, 0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F,

+    0x9D7C, 0x9D7C, 0x3A37, 0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38,

+    0x9D80, 0x9D89, 0x3A39, 0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43,

+    0x9D8D, 0x9D8D, 0x1FB4, 0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7,

+    0x9D92, 0x9D98, 0x3A48, 0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F,

+    0x9DA1, 0x9DA1, 0x23E1, 0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56,

+    0x9DA7, 0x9DA7, 0x23EA, 0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3,

+    0x9DAD, 0x9DAD, 0x210E, 0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6,

+    0x9DB3, 0x9DB3, 0x2004, 0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D,

+    0x9DBF, 0x9DC5, 0x3A6C, 0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73,

+    0x9DC9, 0x9DC9, 0x2264, 0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2,

+    0x9DCE, 0x9DD1, 0x3A78, 0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C,

+    0x9DD5, 0x9DD5, 0x1EC4, 0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6,

+    0x9DE2, 0x9DE2, 0x20A9, 0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B,

+    0x9DF2, 0x9DF3, 0x3A97, 0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99,

+    0x9DF7, 0x9DF7, 0x268B, 0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76,

+    0x9DFB, 0x9DFC, 0x3A9D, 0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F,

+    0x9E40, 0x9E44, 0x3AA0, 0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5,

+    0x9E48, 0x9E48, 0x2191, 0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7,

+    0x9E52, 0x9E52, 0x1F9C, 0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA,

+    0x9E55, 0x9E55, 0x3AB0, 0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1,

+    0x9E5D, 0x9E5D, 0x23E9, 0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7,

+    0x9E61, 0x9E61, 0x21D5, 0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6,

+    0x9E64, 0x9E66, 0x3ABA, 0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD,

+    0x9E6C, 0x9E6C, 0x1E4F, 0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9,

+    0x9E70, 0x9E71, 0x3AC3, 0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5,

+    0x9E74, 0x9E74, 0x23EC, 0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6,

+    0x9E7B, 0x9E7B, 0x23D8, 0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB,

+    0x9E80, 0x9E84, 0x3ACD, 0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2,

+    0x9E87, 0x9E87, 0x23ED, 0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA,

+    0x9E92, 0x9E95, 0x3ADC, 0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8,

+    0x9E98, 0x9EA1, 0x3AE0, 0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA,

+    0x9EA6, 0x9EA6, 0x200B, 0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166,

+    0x9EAA, 0x9EAD, 0x3AEF, 0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3,

+    0x9EB3, 0x9EB3, 0x2189, 0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7,

+    0x9EB7, 0x9EB7, 0x23E7, 0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3,

+    0x9EF6, 0x9EFE, 0x3B36, 0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A,

+    0x9F4F, 0x9F6E, 0x3B4D, 0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D,

+    0x9F80, 0x9F91, 0x3B7C, 0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E,

+    0x9F98, 0x9F98, 0x24D6, 0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A,

+    0x9FA7, 0x9FA8, 0x3BA0, 0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2,

+    0x9FAC, 0x9FAC, 0x24D5, 0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228,

+    0x9FCA, 0x9FCC, 0x3BC0, 0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3,

+    0x9FE1, 0x9FE1, 0x20FC, 0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87,

+    0x9FEC, 0x9FED, 0x3BDF, 0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1,

+    0x9FF4, 0x9FF4, 0x1EBA, 0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119,

+    0x9FFE, 0x9FFE, 0x3BEE, 0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C,

+    0xA044, 0xA045, 0x3BF2, 0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4,

+    0xA049, 0xA049, 0x2227, 0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F,

+    0xA04F, 0xA053, 0x3BFA, 0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF,

+    0xA05A, 0xA05A, 0x1F5D, 0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC,

+    0xA062, 0xA062, 0x3C0A, 0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B,

+    0xA071, 0xA071, 0x2149, 0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046,

+    0xA075, 0xA07E, 0x3C1A, 0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24,

+    0xA091, 0xA091, 0x2190, 0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208,

+    0xA095, 0xA095, 0x3C36, 0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37,

+    0xA0A9, 0xA0A9, 0x24C3, 0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC,

+    0xA0C0, 0xA0CD, 0x3C5E, 0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C,

+    0xA0D9, 0xA0D9, 0x1ED1, 0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC,

+    0xA0DF, 0xA0ED, 0x3C7A, 0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89,

+    0xA1A1, 0xA1FE, 0x0060, 0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE,

+    0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106,

+    0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D,

+    0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B,

+    0xA840, 0xA87E, 0x26B3, 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C,

+    0xA8C5, 0xA8EA, 0x02BC, 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720,

+    0xA95C, 0xA95C, 0x2722, 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742,

+    0xA996, 0xA996, 0x1E17, 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99,

+    0xAA4D, 0xAA4D, 0x21B6, 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6,

+    0xAA71, 0xAA71, 0x2235, 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397,

+    0xAA74, 0xAA76, 0x3CC9, 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC,

+    0xAA7A, 0xAA7A, 0x223F, 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE,

+    0xAA80, 0xAA99, 0x3CD1, 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB,

+    0xAA9C, 0xAA9C, 0x2396, 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC,

+    0xAA9F, 0xAA9F, 0x20A2, 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E,

+    0xAB40, 0xAB40, 0x1F64, 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B,

+    0xAB44, 0xAB44, 0x3CF0, 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139,

+    0xAB47, 0xAB47, 0x3CF1, 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1,

+    0xAB4A, 0xAB4A, 0x239A, 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399,

+    0xAB4E, 0xAB7E, 0x3CF4, 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C,

+    0xAC40, 0xAC45, 0x3D46, 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C,

+    0xAC71, 0xAC71, 0x2460, 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C,

+    0xAC7D, 0xAC7E, 0x3D80, 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D,

+    0xAC8E, 0xAC92, 0x3D8F, 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A,

+    0xAC95, 0xACA0, 0x3D94, 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461,

+    0xAD4A, 0xAD5D, 0x3DA9, 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD,

+    0xAD61, 0xAD61, 0x2462, 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54,

+    0xAD69, 0xAD73, 0x3DC5, 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0,

+    0xAD80, 0xAD81, 0x3DDA, 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC,

+    0xAD87, 0xAD87, 0x245D, 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463,

+    0xAD8C, 0xAD90, 0x3DE3, 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8,

+    0xAE40, 0xAE53, 0x3DF7, 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B,

+    0xAE62, 0xAE62, 0x1E70, 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F,

+    0xAE81, 0xAE84, 0x3E34, 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38,

+    0xAE8B, 0xAE8B, 0x1F4E, 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1,

+    0xAE95, 0xAE9F, 0x3E45, 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50,

+    0xAF64, 0xAF64, 0x1FC6, 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE,

+    0xAF7C, 0xAF7E, 0x3E8A, 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01,

+    0xAF83, 0xAF83, 0x2200, 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2,

+    0xAF8F, 0xAF8F, 0x1E97, 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB,

+    0xAF92, 0xAF9B, 0x3E9A, 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4,

+    0xAF9F, 0xAF9F, 0x2028, 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7,

+    0xB041, 0xB042, 0x25AF, 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1,

+    0xB045, 0xB04E, 0x3EA9, 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3,

+    0xB054, 0xB054, 0x1E4E, 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202,

+    0xB058, 0xB058, 0x25AB, 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9,

+    0xB05B, 0xB05B, 0x25AD, 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6,

+    0xB05E, 0xB05E, 0x3EBB, 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4,

+    0xB062, 0xB062, 0x222F, 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7,

+    0xB065, 0xB06B, 0x3EBC, 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3,

+    0xB07D, 0xB07D, 0x1E25, 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4,

+    0xB097, 0xB097, 0x25C0, 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A,

+    0xB09A, 0xB0A0, 0x3EEC, 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3,

+    0xB14B, 0xB14B, 0x226E, 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD,

+    0xB14E, 0xB14E, 0x3EFF, 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2,

+    0xB151, 0xB151, 0x3F00, 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01,

+    0xB180, 0xB196, 0x3F2D, 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44,

+    0xB1A1, 0xB1FE, 0x040A, 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF,

+    0xB242, 0xB266, 0x3F4E, 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73,

+    0xB26D, 0xB26D, 0x2074, 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687,

+    0xB275, 0xB27E, 0x3F7E, 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88,

+    0xB289, 0xB289, 0x268D, 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0,

+    0xB29B, 0xB2A0, 0x3FA0, 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6,

+    0xB343, 0xB343, 0x1FAB, 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8,

+    0xB371, 0xB37E, 0x3FD5, 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9,

+    0xB389, 0xB38B, 0x3FEB, 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE,

+    0xB38E, 0xB38E, 0x21FA, 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6,

+    0xB440, 0xB453, 0x4001, 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015,

+    0xB458, 0xB458, 0x24E4, 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6,

+    0xB45F, 0xB45F, 0x20F7, 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B,

+    0xB462, 0xB474, 0x401E, 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031,

+    0xB47E, 0xB47E, 0x24EC, 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB,

+    0xB484, 0xB488, 0x403C, 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041,

+    0xB493, 0xB493, 0x24EA, 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524,

+    0xB540, 0xB540, 0x4057, 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058,

+    0xB54B, 0xB54B, 0x1E27, 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6,

+    0xB557, 0xB559, 0x406B, 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012,

+    0xB55C, 0xB55C, 0x1EEC, 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8,

+    0xB562, 0xB57E, 0x4072, 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66,

+    0xB59D, 0xB59D, 0x24DC, 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582,

+    0xB640, 0xB651, 0x40AE, 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0,

+    0xB655, 0xB655, 0x24DD, 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E,

+    0xB65A, 0xB65A, 0x40C5, 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8,

+    0xB65D, 0xB67E, 0x40C6, 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0,

+    0xB740, 0xB74D, 0x4109, 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117,

+    0xB751, 0xB751, 0x1E80, 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677,

+    0xB75A, 0xB763, 0x4120, 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69,

+    0xB766, 0xB766, 0x222B, 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F,

+    0xB778, 0xB778, 0x1F5B, 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B,

+    0xB781, 0xB781, 0x4140, 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141,

+    0xB7A1, 0xB7FE, 0x063E, 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0,

+    0xB844, 0xB844, 0x2186, 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED,

+    0xB847, 0xB84C, 0x4163, 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169,

+    0xB851, 0xB851, 0x1FEA, 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4,

+    0xB85B, 0xB85B, 0x20E1, 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8,

+    0xB85E, 0xB85E, 0x2260, 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2,

+    0xB861, 0xB876, 0x4176, 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C,

+    0xB880, 0xB881, 0x4193, 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195,

+    0xB8A1, 0xB8FE, 0x069C, 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41,

+    0xB951, 0xB960, 0x41C3, 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3,

+    0xB97B, 0xB97B, 0x1F86, 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF,

+    0xB99D, 0xB99D, 0x1FB3, 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF,

+    0xB9A1, 0xB9FE, 0x06FA, 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4,

+    0xBA43, 0xBA43, 0x4210, 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211,

+    0xBA56, 0xBA56, 0x25E3, 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111,

+    0xBA5A, 0xBA5F, 0x4224, 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A,

+    0xBA6A, 0xBA6A, 0x25E7, 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041,

+    0xBA75, 0xBA7E, 0x423C, 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA,

+    0xBA85, 0xBA85, 0x424A, 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B,

+    0xBA88, 0xBA88, 0x25EC, 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB,

+    0xBA8E, 0xBA9D, 0x4250, 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D,

+    0xBAA0, 0xBAA0, 0x4260, 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7,

+    0xBB41, 0xBB48, 0x4261, 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269,

+    0xBB58, 0xBB58, 0x25E9, 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE,

+    0xBB5C, 0xBB5C, 0x203A, 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693,

+    0xBB61, 0xBB64, 0x427C, 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED,

+    0xBB67, 0xBB67, 0x4280, 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281,

+    0xBB6A, 0xBB6A, 0x2065, 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3,

+    0xBB6F, 0xBB7E, 0x4285, 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6,

+    0xBC40, 0xBC51, 0x42B6, 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC,

+    0xBC54, 0xBC59, 0x42C8, 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE,

+    0xBC61, 0xBC61, 0x269B, 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3,

+    0xBC64, 0xBC64, 0x42D5, 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6,

+    0xBC67, 0xBC67, 0x25F4, 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B,

+    0xBC6A, 0xBC6C, 0x42D8, 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB,

+    0xBC6F, 0xBC6F, 0x1F7B, 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D,

+    0xBC72, 0xBC72, 0x42DD, 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48,

+    0xBC75, 0xBC75, 0x241C, 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF,

+    0xBC79, 0xBC79, 0x219A, 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091,

+    0xBC7C, 0xBC7D, 0x42DF, 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1,

+    0xBC82, 0xBC82, 0x2423, 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422,

+    0xBC85, 0xBC85, 0x42E3, 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4,

+    0xBC88, 0xBC88, 0x228D, 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8,

+    0xBC8B, 0xBC8B, 0x2421, 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3,

+    0xBC90, 0xBC99, 0x42E8, 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426,

+    0xBC9C, 0xBC9C, 0x2425, 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2,

+    0xBCA1, 0xBCFE, 0x0814, 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A,

+    0xBD43, 0xBD43, 0x2424, 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428,

+    0xBD46, 0xBD47, 0x42F8, 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429,

+    0xBD4A, 0xBD4A, 0x42FA, 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB,

+    0xBD4D, 0xBD4D, 0x22BE, 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31,

+    0xBD50, 0xBD56, 0x42FD, 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304,

+    0xBD59, 0xBD59, 0x1FB5, 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B,

+    0xBD67, 0xBD67, 0x1FAF, 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068,

+    0xBD6B, 0xBD6B, 0x21E4, 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21,

+    0xBD70, 0xBD70, 0x4316, 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317,

+    0xBD79, 0xBD79, 0x217C, 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D,

+    0xBD7C, 0xBD7D, 0x431E, 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320,

+    0xBD81, 0xBD81, 0x1FD1, 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33,

+    0xBD8A, 0xBD8A, 0x4328, 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329,

+    0xBD8E, 0xBD8E, 0x242E, 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430,

+    0xBD91, 0xBD91, 0x21DB, 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158,

+    0xBD98, 0xBD9A, 0x4331, 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334,

+    0xBDA1, 0xBDFE, 0x0872, 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9,

+    0xBE44, 0xBE44, 0x433C, 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D,

+    0xBE49, 0xBE49, 0x1E8E, 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340,

+    0xBE51, 0xBE51, 0x21C5, 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192,

+    0xBE54, 0xBE54, 0x4346, 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19,

+    0xBE57, 0xBE57, 0x218C, 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3,

+    0xBE5A, 0xBE5C, 0x4347, 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438,

+    0xBE5F, 0xBE5F, 0x2432, 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A,

+    0xBE62, 0xBE62, 0x1E9C, 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085,

+    0xBE65, 0xBE68, 0x434B, 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F,

+    0xBE6C, 0xBE6C, 0x243B, 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7,

+    0xBE70, 0xBE70, 0x2433, 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054,

+    0xBE77, 0xBE77, 0x21DE, 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434,

+    0xBE7A, 0xBE7B, 0x4359, 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89,

+    0xBE7E, 0xBE7E, 0x243C, 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E,

+    0xBE84, 0xBE84, 0x1ED8, 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF,

+    0xBE87, 0xBE87, 0x2445, 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249,

+    0xBE8A, 0xBE8B, 0x4360, 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362,

+    0xBE8E, 0xBE8E, 0x1E47, 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363,

+    0xBE92, 0xBE92, 0x2086, 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196,

+    0xBE96, 0xBE96, 0x4367, 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F,

+    0xBE99, 0xBE99, 0x4368, 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369,

+    0xBE9C, 0xBE9C, 0x2442, 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E,

+    0xBEA0, 0xBEA0, 0x436C, 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6,

+    0xBF41, 0xBF4C, 0x436D, 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446,

+    0xBF4F, 0xBF4F, 0x244B, 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379,

+    0xBF55, 0xBF55, 0x2427, 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D,

+    0xBF60, 0xBF60, 0x1F0F, 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447,

+    0xBF63, 0xBF63, 0x2449, 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387,

+    0xBF68, 0xBF68, 0x21C2, 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E,

+    0xBF6D, 0xBF6F, 0x438D, 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390,

+    0xBF72, 0xBF72, 0x244A, 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391,

+    0xBF76, 0xBF76, 0x22BB, 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393,

+    0xBF79, 0xBF79, 0x2694, 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6,

+    0xBF7C, 0xBF7C, 0x2051, 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E,

+    0xBF80, 0xBF81, 0x4395, 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D,

+    0xBF84, 0xBF88, 0x4397, 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451,

+    0xBF8B, 0xBF94, 0x439C, 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6,

+    0xBF97, 0xBF97, 0x2289, 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7,

+    0xBF9D, 0xBF9D, 0x2454, 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E,

+    0xC040, 0xC040, 0x20FB, 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440,

+    0xC045, 0xC04A, 0x43B1, 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61,

+    0xC04D, 0xC04D, 0x269D, 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A,

+    0xC050, 0xC050, 0x2456, 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458,

+    0xC053, 0xC054, 0x43B8, 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA,

+    0xC05B, 0xC05B, 0x221A, 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A,

+    0xC05F, 0xC05F, 0x244D, 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1,

+    0xC069, 0xC069, 0x2453, 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420,

+    0xC06C, 0xC06C, 0x43CA, 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685,

+    0xC06F, 0xC06F, 0x43CB, 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC,

+    0xC074, 0xC074, 0x2224, 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF,

+    0xC077, 0xC077, 0x21BA, 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A,

+    0xC07A, 0xC07B, 0x43D1, 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3,

+    0xC080, 0xC09A, 0x43D5, 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0,

+    0xC09D, 0xC09D, 0x269A, 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C,

+    0xC140, 0xC14F, 0x43F4, 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404,

+    0xC154, 0xC154, 0x1E2C, 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062,

+    0xC160, 0xC160, 0x24F1, 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2,

+    0xC163, 0xC174, 0x4412, 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424,

+    0xC178, 0xC178, 0x2215, 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C,

+    0xC195, 0xC195, 0x21AE, 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA,

+    0xC240, 0xC24D, 0x444C, 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A,

+    0xC265, 0xC265, 0x25C2, 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1,

+    0xC268, 0xC27C, 0x4471, 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486,

+    0xC280, 0xC283, 0x4487, 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B,

+    0xC293, 0xC293, 0x2017, 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125,

+    0xC296, 0xC296, 0x214D, 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4,

+    0xC299, 0xC299, 0x209D, 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A,

+    0xC29C, 0xC29C, 0x25C3, 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179,

+    0xC2A1, 0xC2FE, 0x0A48, 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E,

+    0xC343, 0xC343, 0x2155, 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2,

+    0xC37C, 0xC37E, 0x44D7, 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7,

+    0xC385, 0xC39A, 0x44DE, 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4,

+    0xC3A1, 0xC3FE, 0x0AA6, 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123,

+    0xC44A, 0xC44B, 0x4502, 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504,

+    0xC454, 0xC454, 0x24C9, 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094,

+    0xC459, 0xC45A, 0x450E, 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510,

+    0xC463, 0xC463, 0x1E77, 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06,

+    0xC478, 0xC479, 0x452A, 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C,

+    0xC480, 0xC480, 0x4530, 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531,

+    0xC491, 0xC491, 0x1EAD, 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8,

+    0xC494, 0xC497, 0x4540, 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544,

+    0xC49A, 0xC49A, 0x20C5, 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA,

+    0xC49D, 0xC4A0, 0x4546, 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A,

+    0xC544, 0xC544, 0x1FF0, 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6,

+    0xC547, 0xC54A, 0x454F, 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE,

+    0xC54D, 0xC551, 0x4553, 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558,

+    0xC55F, 0xC55F, 0x2161, 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B,

+    0xC564, 0xC564, 0x21D9, 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9,

+    0xC567, 0xC57E, 0x4567, 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61,

+    0xC594, 0xC59B, 0x4592, 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A,

+    0xC59E, 0xC59E, 0x1F98, 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62,

+    0xC640, 0xC640, 0x459D, 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E,

+    0xC644, 0xC644, 0x1F88, 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8,

+    0xC648, 0xC662, 0x45A2, 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD,

+    0xC672, 0xC672, 0x2336, 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7,

+    0xC6A1, 0xC6FE, 0x0BC0, 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB,

+    0xC767, 0xC76E, 0x461E, 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626,

+    0xC776, 0xC776, 0x1F7D, 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333,

+    0xC77C, 0xC77E, 0x4630, 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E,

+    0xC840, 0xC840, 0x4654, 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655,

+    0xC84F, 0xC84F, 0x2334, 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1,

+    0xC853, 0xC865, 0x4664, 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677,

+    0xC86E, 0xC86E, 0x2349, 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B,

+    0xC880, 0xC886, 0x468D, 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694,

+    0xC892, 0xC892, 0x2347, 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193,

+    0xC895, 0xC898, 0x469F, 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3,

+    0xC89D, 0xC89D, 0x1F62, 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C,

+    0xC940, 0xC94E, 0x46A9, 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348,

+    0xC951, 0xC96D, 0x46B8, 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5,

+    0xC970, 0xC970, 0x2345, 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12,

+    0xC978, 0xC97E, 0x46DC, 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018,

+    0xC990, 0xC990, 0x2335, 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C,

+    0xC99D, 0xC9A0, 0x46FD, 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701,

+    0xCA4E, 0xCA4E, 0x266F, 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351,

+    0xCA57, 0xCA58, 0x4716, 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718,

+    0xCA5C, 0xCA5C, 0x2338, 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B,

+    0xCA62, 0xCA6D, 0x471E, 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A,

+    0xCA72, 0xCA72, 0x234F, 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D,

+    0xCA78, 0xCA7A, 0x4731, 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331,

+    0xCA7D, 0xCA7D, 0x4734, 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735,

+    0xCA81, 0xCA81, 0x233B, 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350,

+    0xCA8A, 0xCA8D, 0x473D, 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6,

+    0xCA90, 0xCA91, 0x4741, 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743,

+    0xCA9A, 0xCA9A, 0x2355, 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38,

+    0xCB40, 0xCB42, 0x4750, 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753,

+    0xCB45, 0xCB45, 0x1F74, 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330,

+    0xCB48, 0xCB4A, 0x4755, 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758,

+    0xCB4E, 0xCB4E, 0x20DA, 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A,

+    0xCB58, 0xCB5C, 0x4762, 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767,

+    0xCB5F, 0xCB5F, 0x2107, 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F,

+    0xCB6B, 0xCB7A, 0x4772, 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343,

+    0xCB7D, 0xCB7E, 0x4782, 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212,

+    0xCB88, 0xCB8D, 0x478B, 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791,

+    0xCB92, 0xCB92, 0x2359, 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254,

+    0xCB9D, 0xCB9D, 0x479D, 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E,

+    0xCBA1, 0xCBFE, 0x0D96, 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357,

+    0xCC42, 0xCC48, 0x47A0, 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042,

+    0xCC4B, 0xCC4B, 0x2153, 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB,

+    0xCC50, 0xCC5B, 0x47AA, 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6,

+    0xCC60, 0xCC60, 0x2356, 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337,

+    0xCC65, 0xCC6C, 0x47BC, 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4,

+    0xCC79, 0xCC79, 0x2353, 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061,

+    0xCC7E, 0xCC7E, 0x47D2, 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95,

+    0xCC8F, 0xCC93, 0x47E1, 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6,

+    0xCC96, 0xCC96, 0x1F42, 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8,

+    0xCC9E, 0xCCA0, 0x47ED, 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0,

+    0xCD80, 0xCD8F, 0x482F, 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F,

+    0xCD98, 0xCD98, 0x25D7, 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52,

+    0xCE40, 0xCE66, 0x484E, 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875,

+    0xCE72, 0xCE72, 0x21B2, 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B,

+    0xCE81, 0xCE81, 0x219E, 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC,

+    0xCE88, 0xCE9A, 0x4891, 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4,

+    0xCE9E, 0xCE9E, 0x2226, 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0,

+    0xCF40, 0xCF4D, 0x48A8, 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6,

+    0xCF55, 0xCF55, 0x227B, 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE,

+    0xCF59, 0xCF5B, 0x48BE, 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1,

+    0xCF6C, 0xCF6C, 0x25D5, 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B,

+    0xCF74, 0xCF74, 0x48D6, 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7,

+    0xCF78, 0xCF78, 0x1E89, 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9,

+    0xCF7D, 0xCF7E, 0x48DC, 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211,

+    0xCF82, 0xCF88, 0x48DF, 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6,

+    0xCF8B, 0xCF92, 0x48E6, 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF,

+    0xCF95, 0xCF9D, 0x48EE, 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7,

+    0xCFA0, 0xCFA0, 0x25D8, 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8,

+    0xD04D, 0xD04D, 0x1F29, 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B,

+    0xD052, 0xD054, 0x4908, 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B,

+    0xD05C, 0xD05C, 0x2297, 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690,

+    0xD061, 0xD066, 0x4914, 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A,

+    0xD06C, 0xD06C, 0x2198, 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88,

+    0xD06F, 0xD07C, 0x491F, 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D,

+    0xD080, 0xD0A0, 0x492E, 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F,

+    0xD155, 0xD155, 0x25F1, 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C,

+    0xD15A, 0xD160, 0x4967, 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC,

+    0xD163, 0xD174, 0x496E, 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980,

+    0xD17D, 0xD17D, 0x2676, 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988,

+    0xD19D, 0xD19D, 0x1FE1, 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5,

+    0xD1A1, 0xD1FE, 0x0FCA, 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7,

+    0xD243, 0xD243, 0x22DD, 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD,

+    0xD24E, 0xD25B, 0x49B2, 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0,

+    0xD263, 0xD263, 0x25BC, 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6,

+    0xD268, 0xD268, 0x25BF, 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187,

+    0xD26E, 0xD26E, 0x49CD, 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE,

+    0xD272, 0xD272, 0x1E7F, 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD,

+    0xD276, 0xD27E, 0x49D2, 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96,

+    0xD28B, 0xD28D, 0x49E5, 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8,

+    0xD292, 0xD292, 0x2084, 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136,

+    0xD296, 0xD296, 0x49ED, 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE,

+    0xD2A0, 0xD2A0, 0x24BA, 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6,

+    0xD344, 0xD344, 0x24BC, 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4,

+    0xD349, 0xD349, 0x49FD, 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE,

+    0xD34D, 0xD34D, 0x24BD, 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE,

+    0xD351, 0xD354, 0x4A02, 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06,

+    0xD358, 0xD358, 0x1FD2, 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD,

+    0xD35C, 0xD35C, 0x4A0A, 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D,

+    0xD35F, 0xD377, 0x4A0B, 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24,

+    0xD37A, 0xD37A, 0x260A, 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94,

+    0xD37D, 0xD37E, 0x4A26, 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF,

+    0xD386, 0xD386, 0x1ECB, 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D,

+    0xD38B, 0xD38B, 0x1F77, 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB,

+    0xD38E, 0xD38E, 0x4A31, 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32,

+    0xD391, 0xD391, 0x216F, 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0,

+    0xD394, 0xD395, 0x4A34, 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36,

+    0xD398, 0xD398, 0x22E2, 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37,

+    0xD39B, 0xD39B, 0x1F78, 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2,

+    0xD39F, 0xD39F, 0x4A3A, 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086,

+    0xD440, 0xD440, 0x4A3B, 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C,

+    0xD445, 0xD445, 0x1FD3, 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5,

+    0xD448, 0xD44B, 0x4A40, 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44,

+    0xD44F, 0xD44F, 0x211F, 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD,

+    0xD454, 0xD455, 0x4A49, 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B,

+    0xD458, 0xD458, 0x22E7, 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282,

+    0xD45D, 0xD461, 0x4A4F, 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54,

+    0xD467, 0xD467, 0x22E8, 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4,

+    0xD46F, 0xD46F, 0x4A5E, 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F,

+    0xD472, 0xD472, 0x22EB, 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9,

+    0xD475, 0xD475, 0x20BD, 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA,

+    0xD479, 0xD47A, 0x4A63, 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65,

+    0xD47E, 0xD47E, 0x1E9E, 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6,

+    0xD483, 0xD483, 0x21E7, 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69,

+    0xD487, 0xD487, 0x2137, 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C,

+    0xD48B, 0xD48B, 0x4A6D, 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2,

+    0xD48E, 0xD48E, 0x1F37, 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E,

+    0xD491, 0xD491, 0x22EF, 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10,

+    0xD494, 0xD494, 0x21C8, 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1,

+    0xD497, 0xD49B, 0x4A70, 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75,

+    0xD49F, 0xD49F, 0x22EE, 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4,

+    0xD540, 0xD542, 0x4A78, 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E,

+    0xD545, 0xD545, 0x22EC, 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B,

+    0xD54A, 0xD54A, 0x20FE, 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9,

+    0xD550, 0xD550, 0x4A81, 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82,

+    0xD554, 0xD554, 0x2236, 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7,

+    0xD557, 0xD559, 0x4A85, 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88,

+    0xD55C, 0xD55C, 0x1E82, 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89,

+    0xD55F, 0xD55F, 0x21A4, 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8,

+    0xD562, 0xD562, 0x2151, 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60,

+    0xD565, 0xD567, 0x4A8B, 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E,

+    0xD56C, 0xD56C, 0x2145, 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC,

+    0xD56F, 0xD571, 0x4A92, 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95,

+    0xD575, 0xD575, 0x1EF5, 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218,

+    0xD579, 0xD57A, 0x4A99, 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B,

+    0xD57E, 0xD57E, 0x2300, 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4,

+    0xD582, 0xD583, 0x4A9E, 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0,

+    0xD586, 0xD586, 0x22FD, 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA,

+    0xD589, 0xD589, 0x4AA2, 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3,

+    0xD58C, 0xD58C, 0x22FB, 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC,

+    0xD58F, 0xD58F, 0x2027, 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060,

+    0xD594, 0xD594, 0x22FF, 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE,

+    0xD599, 0xD599, 0x1EC7, 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C,

+    0xD59C, 0xD59E, 0x4AAC, 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF,

+    0xD5A1, 0xD5FE, 0x1142, 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0,

+    0xD642, 0xD642, 0x230A, 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1,

+    0xD647, 0xD647, 0x2303, 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307,

+    0xD64A, 0xD64A, 0x230B, 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F,

+    0xD64E, 0xD64E, 0x4AB7, 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8,

+    0xD652, 0xD652, 0x2302, 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D,

+    0xD655, 0xD655, 0x4ABA, 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB,

+    0xD658, 0xD658, 0x2308, 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC,

+    0xD65B, 0xD65B, 0x4ABD, 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305,

+    0xD65E, 0xD65E, 0x2197, 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171,

+    0xD661, 0xD661, 0x2298, 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57,

+    0xD666, 0xD668, 0x4AC2, 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5,

+    0xD66B, 0xD66B, 0x2311, 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304,

+    0xD670, 0xD670, 0x4AC9, 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35,

+    0xD673, 0xD673, 0x4ACA, 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310,

+    0xD676, 0xD676, 0x1FA3, 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6,

+    0xD679, 0xD67B, 0x4ACC, 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF,

+    0xD680, 0xD682, 0x4AD1, 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4,

+    0xD686, 0xD686, 0x2312, 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313,

+    0xD689, 0xD68D, 0x4AD6, 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB,

+    0xD694, 0xD694, 0x1FBA, 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078,

+    0xD69A, 0xD6A0, 0x4AE4, 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB,

+    0xD743, 0xD743, 0x2288, 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316,

+    0xD749, 0xD749, 0x1F6B, 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314,

+    0xD751, 0xD751, 0x4AF8, 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315,

+    0xD754, 0xD754, 0x2168, 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4,

+    0xD757, 0xD763, 0x4AFA, 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07,

+    0xD767, 0xD767, 0x2219, 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09,

+    0xD76C, 0xD76C, 0x20D5, 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A,

+    0xD770, 0xD774, 0x4B0E, 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13,

+    0xD778, 0xD778, 0x1ED3, 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B,

+    0xD783, 0xD783, 0x1E49, 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B,

+    0xD788, 0xD78A, 0x4B21, 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8,

+    0xD78D, 0xD78D, 0x4B24, 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319,

+    0xD790, 0xD794, 0x4B25, 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A,

+    0xD797, 0xD797, 0x2317, 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE,

+    0xD840, 0xD84C, 0x4B34, 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41,

+    0xD853, 0xD853, 0x1EFD, 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71,

+    0xD890, 0xD890, 0x1E3B, 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81,

+    0xD893, 0xD893, 0x1F0C, 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24,

+    0xD896, 0xD899, 0x4B82, 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65,

+    0xD89C, 0xD89C, 0x1EF0, 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30,

+    0xD89F, 0xD89F, 0x2261, 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257,

+    0xD940, 0xD940, 0x4B87, 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB,

+    0xD943, 0xD943, 0x4B88, 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8,

+    0xD946, 0xD946, 0x1F39, 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48,

+    0xD949, 0xD949, 0x2070, 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A,

+    0xD94C, 0xD94C, 0x24AC, 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176,

+    0xD94F, 0xD94F, 0x24AD, 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B,

+    0xD952, 0xD952, 0x1F45, 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B,

+    0xD955, 0xD955, 0x202F, 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0,

+    0xD958, 0xD958, 0x4B8C, 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F,

+    0xD95B, 0xD95B, 0x4B8D, 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E,

+    0xD963, 0xD963, 0x24B2, 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51,

+    0xD966, 0xD966, 0x4B94, 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95,

+    0xD96C, 0xD96C, 0x24B3, 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F,

+    0xD96F, 0xD96F, 0x4B9A, 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B,

+    0xD972, 0xD972, 0x20B4, 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB,

+    0xD975, 0xD975, 0x2072, 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C,

+    0xD978, 0xD978, 0x1F0A, 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D,

+    0xD97C, 0xD97C, 0x2291, 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278,

+    0xD980, 0xD980, 0x1ED4, 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3,

+    0xD988, 0xD98C, 0x4BA5, 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7,

+    0xD98F, 0xD98F, 0x1F28, 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7,

+    0xD992, 0xD996, 0x4BAA, 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1,

+    0xD999, 0xD99A, 0x4BAF, 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1,

+    0xD99D, 0xD99D, 0x225B, 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2,

+    0xD9A0, 0xD9A0, 0x2115, 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3,

+    0xDA41, 0xDA41, 0x222A, 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4,

+    0xDA48, 0xDA48, 0x213D, 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15,

+    0xDA4E, 0xDA4E, 0x225C, 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14,

+    0xDA74, 0xDA76, 0x4BE1, 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4,

+    0xDA80, 0xDA84, 0x4BEB, 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0,

+    0xDA8E, 0xDA8E, 0x25F8, 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313,

+    0xDB40, 0xDB5F, 0x4C0A, 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A,

+    0xDB78, 0xDB78, 0x2230, 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47,

+    0xDB84, 0xDB84, 0x25FD, 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600,

+    0xDB8C, 0xDB97, 0x4C51, 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D,

+    0xDBA1, 0xDBFE, 0x1371, 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF,

+    0xDC46, 0xDC4E, 0x4C6A, 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C,

+    0xDC51, 0xDC51, 0x2602, 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D,

+    0xDC54, 0xDC54, 0x4C74, 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE,

+    0xDC57, 0xDC57, 0x2603, 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601,

+    0xDC5E, 0xDC61, 0x4C7A, 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E,

+    0xDC66, 0xDC66, 0x1EA3, 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81,

+    0xDC6B, 0xDC6B, 0x2607, 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0,

+    0xDC7D, 0xDC7E, 0x4C94, 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B,

+    0xDC88, 0xDC88, 0x2267, 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6,

+    0xDC8B, 0xDC8D, 0x4C9D, 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0,

+    0xDC90, 0xDC90, 0x248C, 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D,

+    0xDC98, 0xDC9A, 0x4CA7, 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA,

+    0xDCA0, 0xDCA0, 0x2494, 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE,

+    0xDD46, 0xDD46, 0x2493, 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E,

+    0xDD4E, 0xDD52, 0x4CBA, 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491,

+    0xDD55, 0xDD55, 0x2496, 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492,

+    0xDD58, 0xDD58, 0x4CBF, 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0,

+    0xDD5E, 0xDD5E, 0x1FB1, 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A,

+    0xDD61, 0xDD61, 0x4CC5, 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6,

+    0xDD64, 0xDD64, 0x2258, 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7,

+    0xDD6D, 0xDD6D, 0x249B, 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09,

+    0xDD70, 0xDD70, 0x20E6, 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026,

+    0xDD77, 0xDD77, 0x249F, 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D,

+    0xDD7B, 0xDD7E, 0x4CD4, 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B,

+    0xDD82, 0xDD82, 0x249C, 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A,

+    0xDD86, 0xDD86, 0x205B, 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70,

+    0xDD8C, 0xDD8E, 0x4CDF, 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2,

+    0xDD94, 0xDD94, 0x213B, 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07,

+    0xDD98, 0xDD99, 0x4CE8, 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237,

+    0xDD9C, 0xDD9D, 0x4CEA, 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC,

+    0xDDA0, 0xDDA0, 0x21B3, 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245,

+    0xDE41, 0xDE41, 0x24A1, 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8,

+    0xDE45, 0xDE47, 0x4CEF, 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0,

+    0xDE4A, 0xDE4E, 0x4CF2, 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7,

+    0xDE5A, 0xDE5A, 0x1F46, 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380,

+    0xDE5D, 0xDE5D, 0x2495, 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490,

+    0xDE60, 0xDE6A, 0x4D03, 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E,

+    0xDE6F, 0xDE6F, 0x1E9D, 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A,

+    0xDE72, 0xDE72, 0x20AA, 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D,

+    0xDE92, 0xDE92, 0x267B, 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2,

+    0xDEA0, 0xDEA0, 0x4D3B, 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E,

+    0xDF41, 0xDF41, 0x4D3C, 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D,

+    0xDF4D, 0xDF4D, 0x1FBB, 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253,

+    0xDF5D, 0xDF5D, 0x4D55, 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6,

+    0xDF60, 0xDF60, 0x218E, 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC,

+    0xDF65, 0xDF65, 0x4D59, 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A,

+    0xDF68, 0xDF68, 0x224A, 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133,

+    0xDF6E, 0xDF73, 0x4D5F, 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65,

+    0xDF77, 0xDF77, 0x20CF, 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67,

+    0xDF7A, 0xDF7A, 0x220F, 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029,

+    0xDF7D, 0xDF7D, 0x4D69, 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55,

+    0xDF81, 0xDF82, 0x4D6A, 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C,

+    0xDF85, 0xDF85, 0x1E46, 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063,

+    0xDF8A, 0xDF8A, 0x23F3, 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9,

+    0xE040, 0xE04F, 0x4D86, 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96,

+    0xE05D, 0xE05D, 0x2233, 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320,

+    0xE06A, 0xE06B, 0x4DAD, 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF,

+    0xE075, 0xE075, 0x22BC, 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C,

+    0xE078, 0xE078, 0x4DB8, 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9,

+    0xE080, 0xE086, 0x4DBE, 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5,

+    0xE08D, 0xE08D, 0x2287, 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D,

+    0xE090, 0xE090, 0x1EAB, 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D,

+    0xE093, 0xE093, 0x4DCC, 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD,

+    0xE097, 0xE097, 0x231B, 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547,

+    0xE140, 0xE141, 0x4DD8, 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA,

+    0xE164, 0xE164, 0x2255, 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F,

+    0xE169, 0xE173, 0x4DFE, 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4,

+    0xE176, 0xE17E, 0x4E09, 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B,

+    0xE185, 0xE185, 0x21D8, 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA,

+    0xE188, 0xE188, 0x4E17, 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18,

+    0xE18C, 0xE18C, 0x2134, 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3,

+    0xE191, 0xE191, 0x24F8, 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7,

+    0xE194, 0xE194, 0x1EC8, 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C,

+    0xE198, 0xE198, 0x2280, 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5,

+    0xE19F, 0xE19F, 0x24FB, 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5,

+    0xE240, 0xE240, 0x4E24, 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25,

+    0xE243, 0xE243, 0x1EED, 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD,

+    0xE250, 0xE250, 0x4E31, 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32,

+    0xE253, 0xE253, 0x24FE, 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33,

+    0xE25A, 0xE25A, 0x2508, 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38,

+    0xE25E, 0xE25E, 0x2506, 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF,

+    0xE263, 0xE263, 0x2090, 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD,

+    0xE268, 0xE268, 0x1F25, 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503,

+    0xE26B, 0xE26B, 0x2502, 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A,

+    0xE26F, 0xE26F, 0x20A6, 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5,

+    0xE279, 0xE27C, 0x4E4B, 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F,

+    0xE280, 0xE280, 0x2507, 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505,

+    0xE283, 0xE288, 0x4E50, 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56,

+    0xE28B, 0xE28B, 0x2515, 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C,

+    0xE28F, 0xE28F, 0x2031, 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B,

+    0xE293, 0xE293, 0x250F, 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509,

+    0xE296, 0xE297, 0x4E5B, 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234,

+    0xE29A, 0xE29A, 0x2513, 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D,

+    0xE2A0, 0xE2A0, 0x2501, 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61,

+    0xE342, 0xE342, 0x2517, 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63,

+    0xE347, 0xE347, 0x2518, 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56,

+    0xE34C, 0xE34E, 0x4E69, 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C,

+    0xE351, 0xE351, 0x20D3, 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A,

+    0xE355, 0xE355, 0x20CE, 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510,

+    0xE359, 0xE35B, 0x4E71, 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74,

+    0xE360, 0xE360, 0x250A, 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511,

+    0xE368, 0xE370, 0x4E7C, 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85,

+    0xE373, 0xE373, 0x251E, 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86,

+    0xE378, 0xE378, 0x252D, 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89,

+    0xE37C, 0xE37C, 0x2532, 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B,

+    0xE380, 0xE389, 0x4E8C, 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96,

+    0xE38C, 0xE38C, 0x252C, 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528,

+    0xE390, 0xE390, 0x4E99, 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A,

+    0xE393, 0xE393, 0x252F, 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC,

+    0xE396, 0xE398, 0x4E9C, 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F,

+    0xE39C, 0xE39C, 0x2535, 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D,

+    0xE39F, 0xE39F, 0x2526, 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661,

+    0xE440, 0xE440, 0x2534, 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F,

+    0xE443, 0xE443, 0x2531, 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3,

+    0xE448, 0xE448, 0x2525, 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD,

+    0xE44F, 0xE44F, 0x4EAB, 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC,

+    0xE452, 0xE452, 0x2172, 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD,

+    0xE458, 0xE458, 0x204F, 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543,

+    0xE45B, 0xE45B, 0x4EB2, 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3,

+    0xE45E, 0xE45E, 0x1E3C, 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529,

+    0xE463, 0xE464, 0x4EB7, 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9,

+    0xE468, 0xE468, 0x1EFF, 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F,

+    0xE474, 0xE474, 0x4EC5, 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6,

+    0xE479, 0xE479, 0x2523, 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A,

+    0xE47C, 0xE47C, 0x2545, 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D,

+    0xE480, 0xE480, 0x4ECA, 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB,

+    0xE484, 0xE484, 0x2103, 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C,

+    0xE487, 0xE487, 0x253B, 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD,

+    0xE48D, 0xE48D, 0x2540, 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD,

+    0xE490, 0xE492, 0x4ED2, 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5,

+    0xE498, 0xE498, 0x254B, 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547,

+    0xE49E, 0xE49F, 0x254F, 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF,

+    0xE540, 0xE545, 0x4EDE, 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4,

+    0xE548, 0xE548, 0x2546, 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C,

+    0xE54C, 0xE54D, 0x4EE7, 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552,

+    0xE550, 0xE550, 0x2530, 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9,

+    0xE555, 0xE555, 0x2551, 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC,

+    0xE558, 0xE558, 0x20D2, 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8,

+    0xE55D, 0xE55D, 0x4EF0, 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1,

+    0xE561, 0xE561, 0x21AB, 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D,

+    0xE565, 0xE565, 0x1EA5, 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C,

+    0xE569, 0xE569, 0x2080, 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D,

+    0xE56D, 0xE56D, 0x4EF9, 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA,

+    0xE575, 0xE575, 0x254A, 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00,

+    0xE578, 0xE578, 0x254E, 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC,

+    0xE57C, 0xE57C, 0x2554, 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05,

+    0xE581, 0xE581, 0x1F3C, 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5,

+    0xE584, 0xE589, 0x4F07, 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D,

+    0xE58E, 0xE58E, 0x2268, 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6,

+    0xE592, 0xE599, 0x4F12, 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553,

+    0xE59C, 0xE59E, 0x4F1A, 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D,

+    0xE5A1, 0xE5FE, 0x171D, 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E,

+    0xE644, 0xE644, 0x2559, 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97,

+    0xE64A, 0xE64A, 0x2555, 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D,

+    0xE64F, 0xE651, 0x4F28, 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B,

+    0xE656, 0xE656, 0x207C, 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A,

+    0xE659, 0xE65A, 0x4F2F, 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31,

+    0xE65E, 0xE65E, 0x1E34, 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E,

+    0xE66A, 0xE66A, 0x4F3D, 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E,

+    0xE675, 0xE675, 0x21A2, 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47,

+    0xE679, 0xE679, 0x2563, 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49,

+    0xE67C, 0xE67C, 0x252E, 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A,

+    0xE680, 0xE680, 0x1F1B, 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283,

+    0xE683, 0xE683, 0x4F4C, 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D,

+    0xE687, 0xE687, 0x20A0, 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565,

+    0xE68A, 0xE68B, 0x4F50, 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52,

+    0xE693, 0xE693, 0x2562, 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C,

+    0xE698, 0xE69A, 0x4F5B, 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020,

+    0xE69D, 0xE69E, 0x4F5E, 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A,

+    0xE6A1, 0xE6FE, 0x177B, 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E,

+    0xE744, 0xE747, 0x4F63, 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C,

+    0xE74A, 0xE74C, 0x4F67, 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B,

+    0xE750, 0xE750, 0x1E6F, 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4,

+    0xE753, 0xE753, 0x2567, 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B,

+    0xE756, 0xE758, 0x4F6C, 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F,

+    0xE766, 0xE766, 0x252B, 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571,

+    0xE769, 0xE769, 0x4F7C, 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D,

+    0xE774, 0xE774, 0x2522, 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533,

+    0xE77D, 0xE77E, 0x4F8D, 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A,

+    0xE783, 0xE783, 0x4F91, 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573,

+    0xE786, 0xE786, 0x256F, 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293,

+    0xE78B, 0xE78B, 0x2578, 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570,

+    0xE790, 0xE791, 0x4F98, 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A,

+    0xE798, 0xE799, 0x2541, 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F,

+    0xE7A0, 0xE7A0, 0x201A, 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4,

+    0xE843, 0xE843, 0x257A, 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7,

+    0xE846, 0xE846, 0x2177, 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B,

+    0xE84A, 0xE84A, 0x4FAA, 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB,

+    0xE84F, 0xE84F, 0x257B, 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3,

+    0xE855, 0xE859, 0x4FB2, 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7,

+    0xE85C, 0xE85C, 0x2566, 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93,

+    0xE863, 0xE863, 0x4FBD, 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE,

+    0xE870, 0xE870, 0x2514, 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D,

+    0xE874, 0xE874, 0x4FCB, 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC,

+    0xE87C, 0xE87C, 0x2574, 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E,

+    0xE881, 0xE881, 0x4FD4, 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5,

+    0xE887, 0xE887, 0x209F, 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576,

+    0xE88A, 0xE88B, 0x4FDA, 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF,

+    0xE88E, 0xE88E, 0x261C, 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC,

+    0xE8A1, 0xE8FE, 0x1837, 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75,

+    0xE94D, 0xE953, 0x4FF9, 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000,

+    0xE956, 0xE956, 0x23BF, 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001,

+    0xE95A, 0xE95A, 0x23C0, 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45,

+    0xE95E, 0xE95E, 0x5005, 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4,

+    0xE961, 0xE961, 0x5006, 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104,

+    0xE964, 0xE964, 0x5007, 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008,

+    0xE967, 0xE967, 0x1F87, 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009,

+    0xE96C, 0xE96C, 0x2269, 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43,

+    0xE976, 0xE976, 0x5014, 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679,

+    0xE979, 0xE979, 0x1EEB, 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35,

+    0xE97D, 0xE97D, 0x208A, 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7,

+    0xE981, 0xE981, 0x23C9, 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018,

+    0xE987, 0xE987, 0x224F, 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB,

+    0xE98C, 0xE98D, 0x501F, 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021,

+    0xE990, 0xE990, 0x21F7, 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE,

+    0xE993, 0xE993, 0x23CA, 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022,

+    0xE998, 0xE998, 0x23D0, 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C,

+    0xE99C, 0xE99C, 0x5027, 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028,

+    0xE99F, 0xE99F, 0x1FEE, 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895,

+    0xEA40, 0xEA40, 0x1FF8, 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3,

+    0xEA45, 0xEA47, 0x502C, 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4,

+    0xEA4A, 0xEA4A, 0x1E98, 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C,

+    0xEA51, 0xEA51, 0x5034, 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035,

+    0xEA55, 0xEA55, 0x1E71, 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037,

+    0xEA59, 0xEA59, 0x23C5, 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A,

+    0xEA81, 0xEA83, 0x505E, 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061,

+    0xEA87, 0xEA87, 0x2284, 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C,

+    0xEA8F, 0xEA8F, 0x5069, 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D,

+    0xEA92, 0xEA95, 0x506A, 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E,

+    0xEAA0, 0xEAA0, 0x1ED9, 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077,

+    0xEB41, 0xEB41, 0x1FB2, 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252,

+    0xEB46, 0xEB47, 0x507B, 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D,

+    0xEB53, 0xEB53, 0x2157, 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF,

+    0xEB56, 0xEB5A, 0x5088, 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D,

+    0xEB5D, 0xEB5D, 0x203D, 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015,

+    0xEB61, 0xEB61, 0x5090, 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091,

+    0xEB6D, 0xEB6D, 0x2156, 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144,

+    0xEB71, 0xEB71, 0x509D, 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257,

+    0xEB74, 0xEB77, 0x509E, 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092,

+    0xEB7A, 0xEB7E, 0x50A2, 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250,

+    0xEB86, 0xEB89, 0x50AC, 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0,

+    0xEBA1, 0xEBFE, 0x1951, 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8,

+    0xEC47, 0xEC55, 0x50CC, 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB,

+    0xEC5A, 0xEC5A, 0x260C, 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E,

+    0xEC5D, 0xEC5F, 0x50DF, 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2,

+    0xEC6E, 0xEC6E, 0x260B, 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3,

+    0xEC77, 0xEC7E, 0x50F6, 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23,

+    0xEC97, 0xECA0, 0x5114, 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E,

+    0xED46, 0xED46, 0x2695, 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E,

+    0xED59, 0xED5D, 0x5135, 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A,

+    0xED61, 0xED61, 0x2692, 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F,

+    0xED65, 0xED65, 0x513E, 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD,

+    0xED68, 0xED6D, 0x513F, 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145,

+    0xED74, 0xED74, 0x2465, 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467,

+    0xED78, 0xED78, 0x514C, 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D,

+    0xED80, 0xED90, 0x5152, 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163,

+    0xED93, 0xED93, 0x2209, 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9,

+    0xED96, 0xED96, 0x5164, 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146,

+    0xED99, 0xED99, 0x25C5, 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165,

+    0xED9C, 0xED9C, 0x245E, 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F,

+    0xED9F, 0xED9F, 0x5167, 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D,

+    0xEE40, 0xEE40, 0x25C7, 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A,

+    0xEE43, 0xEE43, 0x1E2F, 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168,

+    0xEE48, 0xEE48, 0x20BF, 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B,

+    0xEE4D, 0xEE4D, 0x25C9, 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8,

+    0xEE53, 0xEE54, 0x5172, 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174,

+    0xEE57, 0xEE57, 0x25CB, 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D,

+    0xEE5F, 0xEE60, 0x517B, 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D,

+    0xEE68, 0xEE68, 0x25CC, 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183,

+    0xEE6C, 0xEE6C, 0x20B9, 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181,

+    0xEE6F, 0xEE76, 0x5186, 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E,

+    0xEE7D, 0xEE7D, 0x2173, 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD,

+    0xEE81, 0xEE84, 0x5193, 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6,

+    0xEE87, 0xEE89, 0x5197, 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1,

+    0xEE8C, 0xEE8C, 0x519A, 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B,

+    0xEE90, 0xEE90, 0x2008, 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0,

+    0xEE95, 0xEE96, 0x51A0, 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2,

+    0xEE99, 0xEE99, 0x1F2A, 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72,

+    0xEE9E, 0xEE9E, 0x25D3, 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B,

+    0xEF40, 0xEF40, 0x21BE, 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044,

+    0xEF43, 0xEF43, 0x51A8, 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3,

+    0xEF46, 0xEF4B, 0x51A9, 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF,

+    0xEF52, 0xEF53, 0x24CC, 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698,

+    0xEF56, 0xEF56, 0x51B5, 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6,

+    0xEF5A, 0xEF5A, 0x24CE, 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF,

+    0xEF61, 0xEF67, 0x51BD, 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4,

+    0xEF6A, 0xEF6A, 0x24D0, 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1,

+    0xEF6D, 0xEF76, 0x51C6, 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0,

+    0xEF7A, 0xEF7A, 0x239B, 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E,

+    0xEF7D, 0xEF7E, 0x51D3, 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D,

+    0xEF83, 0xEF84, 0x239F, 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1,

+    0xEF87, 0xEF87, 0x51D8, 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9,

+    0xEF8B, 0xEF8B, 0x221E, 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2,

+    0xEF8E, 0xEF94, 0x51DC, 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36,

+    0xEF97, 0xEF97, 0x2135, 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD,

+    0xEF9D, 0xEF9D, 0x51E7, 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8,

+    0xEFA1, 0xEFFE, 0x1AC9, 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3,

+    0xF042, 0xF042, 0x2203, 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7,

+    0xF045, 0xF046, 0x51EC, 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097,

+    0xF049, 0xF049, 0x1EE4, 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238,

+    0xF04F, 0xF050, 0x51F2, 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4,

+    0xF054, 0xF054, 0x1F9A, 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3,

+    0xF058, 0xF05D, 0x51F8, 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE,

+    0xF068, 0xF068, 0x239C, 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6,

+    0xF06D, 0xF070, 0x520A, 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E,

+    0xF073, 0xF073, 0x2035, 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F,

+    0xF078, 0xF078, 0x23A8, 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075,

+    0xF07B, 0xF07C, 0x5213, 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB,

+    0xF081, 0xF081, 0x1FEB, 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215,

+    0xF087, 0xF087, 0x1F6A, 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219,

+    0xF08B, 0xF08B, 0x2666, 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667,

+    0xF091, 0xF091, 0x521F, 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220,

+    0xF096, 0xF096, 0x23AD, 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27,

+    0xF140, 0xF151, 0x522D, 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242,

+    0xF154, 0xF154, 0x1F02, 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183,

+    0xF158, 0xF158, 0x5241, 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9,

+    0xF15B, 0xF166, 0x5242, 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E,

+    0xF176, 0xF176, 0x22A5, 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA,

+    0xF179, 0xF179, 0x525C, 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82,

+    0xF17C, 0xF17D, 0x525D, 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404,

+    0xF181, 0xF181, 0x525F, 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260,

+    0xF184, 0xF184, 0x2184, 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403,

+    0xF187, 0xF187, 0x5262, 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B,

+    0xF18A, 0xF193, 0x5263, 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D,

+    0xF198, 0xF198, 0x2067, 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85,

+    0xF240, 0xF244, 0x5278, 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D,

+    0xF247, 0xF247, 0x1E83, 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F,

+    0xF24C, 0xF252, 0x5281, 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7,

+    0xF255, 0xF255, 0x240D, 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412,

+    0xF25D, 0xF25E, 0x528E, 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290,

+    0xF271, 0xF271, 0x23F0, 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411,

+    0xF274, 0xF274, 0x2414, 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170,

+    0xF277, 0xF27B, 0x52A3, 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C,

+    0xF27E, 0xF27E, 0x2415, 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066,

+    0xF286, 0xF286, 0x52AD, 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413,

+    0xF289, 0xF289, 0x2410, 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1,

+    0xF28D, 0xF290, 0x52AE, 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2,

+    0xF294, 0xF294, 0x2409, 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418,

+    0xF297, 0xF29B, 0x52B5, 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA,

+    0xF29E, 0xF29E, 0x21FC, 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3,

+    0xF340, 0xF340, 0x1FC1, 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD,

+    0xF345, 0xF345, 0x229C, 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E,

+    0xF349, 0xF349, 0x52C2, 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419,

+    0xF34C, 0xF34F, 0x52C3, 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7,

+    0xF361, 0xF361, 0x1E29, 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661,

+    0xF375, 0xF375, 0x52E9, 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174,

+    0xF378, 0xF378, 0x2663, 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA,

+    0xF380, 0xF38B, 0x52EF, 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB,

+    0xF3A0, 0xF3A0, 0x214C, 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E,

+    0xF445, 0xF445, 0x267A, 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0,

+    0xF451, 0xF456, 0x531D, 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323,

+    0xF459, 0xF459, 0x1ED0, 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096,

+    0xF45C, 0xF45C, 0x5325, 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326,

+    0xF462, 0xF462, 0x23C8, 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E,

+    0xF465, 0xF474, 0x532B, 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B,

+    0xF47C, 0xF47C, 0x2664, 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239,

+    0xF480, 0xF493, 0x5342, 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356,

+    0xF499, 0xF499, 0x261F, 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E,

+    0xF49D, 0xF4A0, 0x535C, 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360,

+    0xF545, 0xF545, 0x2620, 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621,

+    0xF548, 0xF551, 0x5366, 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370,

+    0xF554, 0xF554, 0x2627, 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625,

+    0xF557, 0xF55D, 0x5371, 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378,

+    0xF561, 0xF561, 0x262E, 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A,

+    0xF56E, 0xF56E, 0x262A, 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385,

+    0xF571, 0xF571, 0x2628, 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386,

+    0xF580, 0xF584, 0x5392, 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630,

+    0xF587, 0xF58B, 0x5397, 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C,

+    0xF58E, 0xF58E, 0x200D, 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D,

+    0xF599, 0xF599, 0x2645, 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A,

+    0xF59C, 0xF59F, 0x53A7, 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD,

+    0xF640, 0xF640, 0x53AB, 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC,

+    0xF645, 0xF645, 0x263D, 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF,

+    0xF648, 0xF648, 0x263E, 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F,

+    0xF64C, 0xF64C, 0x1FC0, 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B,

+    0xF650, 0xF653, 0x53B3, 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7,

+    0xF658, 0xF658, 0x2644, 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639,

+    0xF662, 0xF662, 0x53C2, 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3,

+    0xF66C, 0xF66C, 0x2647, 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB,

+    0xF671, 0xF671, 0x2649, 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648,

+    0xF675, 0xF675, 0x53D0, 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108,

+    0xF678, 0xF67E, 0x53D1, 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D,

+    0xF686, 0xF687, 0x53DD, 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF,

+    0xF68A, 0xF68A, 0x2651, 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650,

+    0xF68E, 0xF68E, 0x2652, 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F,

+    0xF693, 0xF695, 0x53E5, 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E,

+    0xF698, 0xF698, 0x2653, 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657,

+    0xF69B, 0xF69B, 0x53E9, 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA,

+    0xF69E, 0xF69E, 0x2633, 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656,

+    0xF6A1, 0xF6FE, 0x1D5B, 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654,

+    0xF743, 0xF748, 0x53EE, 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4,

+    0xF74C, 0xF74C, 0x2655, 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6,

+    0xF756, 0xF756, 0x265B, 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A,

+    0xF759, 0xF759, 0x53FF, 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E,

+    0xF75C, 0xF75C, 0x262F, 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646,

+    0xF762, 0xF762, 0x5404, 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405,

+    0xF76B, 0xF76B, 0x265C, 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C,

+    0xF772, 0xF77B, 0x5411, 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B,

+    0xF77E, 0xF77E, 0x2631, 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9,

+    0xF840, 0xF841, 0x543D, 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F,

+    0xF846, 0xF846, 0x2580, 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC,

+    0xF84A, 0xF84F, 0x5444, 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B,

+    0xF852, 0xF852, 0x544A, 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B,

+    0xF863, 0xF863, 0x2583, 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A,

+    0xF866, 0xF866, 0x21EE, 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182,

+    0xF873, 0xF877, 0x5466, 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B,

+    0xF87A, 0xF87A, 0x2587, 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588,

+    0xF87D, 0xF87E, 0x546D, 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584,

+    0xF882, 0xF883, 0x5470, 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472,

+    0xF886, 0xF886, 0x21EF, 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A,

+    0xF88E, 0xF88E, 0x258C, 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47,

+    0xF89A, 0xF89C, 0x5483, 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486,

+    0xF8A0, 0xF8A0, 0x258D, 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0,

+    0xF94F, 0xF94F, 0x2592, 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496,

+    0xF959, 0xF959, 0x2594, 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E,

+    0xF95D, 0xF95D, 0x2591, 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0,

+    0xF967, 0xF967, 0x2597, 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6,

+    0xF96A, 0xF96B, 0x54A9, 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB,

+    0xF96F, 0xF96F, 0x20F6, 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC,

+    0xF985, 0xF985, 0x2585, 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599,

+    0xF988, 0xF990, 0x54C2, 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB,

+    0xF996, 0xF996, 0x259A, 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B,

+    0xF999, 0xF9A0, 0x54D0, 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D,

+    0xFA43, 0xFA45, 0x54DA, 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD,

+    0xFA4C, 0xFA4C, 0x234C, 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44,

+    0xFA52, 0xFA57, 0x54E6, 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0,

+    0xFA5A, 0xFA5C, 0x54EC, 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF,

+    0xFA5F, 0xFA5F, 0x259F, 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C,

+    0xFA62, 0xFA6F, 0x54F1, 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF,

+    0xFA74, 0xFA74, 0x20AE, 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B,

+    0xFA77, 0xFA77, 0x25A3, 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A,

+    0xFA83, 0xFA83, 0x2589, 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D,

+    0xFA8D, 0xFA8D, 0x25A4, 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6,

+    0xFA91, 0xFA91, 0x2593, 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7,

+    0xFA97, 0xFA97, 0x2222, 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B,

+    0xFB40, 0xFB48, 0x5523, 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C,

+    0xFB52, 0xFB52, 0x2586, 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1,

+    0xFB58, 0xFB58, 0x25AA, 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590,

+    0xFB5B, 0xFB5B, 0x258E, 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688,

+    0xFB76, 0xFB78, 0x5552, 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB,

+    0xFB7B, 0xFB7B, 0x5555, 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4,

+    0xFB7E, 0xFB7E, 0x5556, 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F,

+    0xFB91, 0xFB9B, 0x5567, 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572,

+    0xFB9F, 0xFB9F, 0x25F7, 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575,

+    0xFC44, 0xFC44, 0x2696, 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F,

+    0xFC4A, 0xFC59, 0x557D, 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D,

+    0xFC63, 0xFC63, 0x1EC1, 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3,

+    0xFC69, 0xFC6E, 0x5599, 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F,

+    0xFC71, 0xFC71, 0x268A, 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669,

+    0xFC75, 0xFC76, 0x55A2, 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4,

+    0xFC80, 0xFC82, 0x55AA, 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD,

+    0xFC8A, 0xFC8A, 0x2673, 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9,

+    0xFD52, 0xFD52, 0x20C6, 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB,

+    0xFD57, 0xFD57, 0x24D3, 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE,

+    0xFD5A, 0xFD5A, 0x260F, 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611,

+    0xFD60, 0xFD61, 0x55E3, 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5,

+    0xFD65, 0xFD65, 0x2610, 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030,

+    0xFD68, 0xFD68, 0x55E7, 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8,

+    0xFD6C, 0xFD6C, 0x2614, 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616,

+    0xFD71, 0xFD71, 0x55ED, 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE,

+    0xFD78, 0xFD78, 0x20F2, 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617,

+    0xFD7E, 0xFD7E, 0x55F7, 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037,

+    0xFD89, 0xFD8A, 0x5600, 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602,

+    0xFD8F, 0xFD8F, 0x1F22, 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605,

+    0xFD94, 0xFD94, 0x1F34, 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02,

+    0xFD9E, 0xFD9E, 0x40D3, 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083,

+    0xFE40, 0xFE40, 0x1259, 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-V_2.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-V_2.cpp
new file mode 100644
index 0000000..50aadda
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-V_2.cpp
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBK_EUC_V_2[20 * 3] = {
+    0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,
+    0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,
+    0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,
+    0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,
+    0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,
+    0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,
+    0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-H_5.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-H_5.cpp
new file mode 100644
index 0000000..221301e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-H_5.cpp
@@ -0,0 +1,1706 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBK2K_H_5[4071 * 3] = {
+    0x0020, 0x007E, 0x0001, 0x8140, 0x8178, 0x2758, 0x8179, 0x8179, 0x2059,
+    0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796, 0x8186, 0x8186, 0x21F1,
+    0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2, 0x81EE, 0x81F5, 0x2802,
+    0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A, 0x8240, 0x8252, 0x2812,
+    0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825, 0x8262, 0x8262, 0x21B5,
+    0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC, 0x8275, 0x8279, 0x2844,
+    0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849, 0x827D, 0x827D, 0x1E62,
+    0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20, 0x8281, 0x8282, 0x284C,
+    0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E, 0x8290, 0x8290, 0x205C,
+    0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194, 0x82A6, 0x82C7, 0x286E,
+    0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281, 0x82CA, 0x82E0, 0x2890,
+    0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7, 0x82E3, 0x82E3, 0x210A,
+    0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8, 0x82ED, 0x82ED, 0x267F,
+    0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E, 0x82F3, 0x82F6, 0x28B4,
+    0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB, 0x82F9, 0x82F9, 0x226C,
+    0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117, 0x82FC, 0x82FE, 0x28B9,
+    0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8, 0x8342, 0x8344, 0x28BD,
+    0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0, 0x8348, 0x8348, 0x1FB9,
+    0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8, 0x834D, 0x8352, 0x28C5,
+    0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB, 0x8357, 0x8357, 0x20C2,
+    0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195, 0x835F, 0x8364, 0x28D4,
+    0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3, 0x8367, 0x8371, 0x28DA,
+    0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5, 0x8378, 0x8378, 0x2210,
+    0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF, 0x837B, 0x837B, 0x28EB,
+    0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC, 0x837E, 0x837E, 0x1FE4,
+    0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED, 0x8386, 0x8386, 0x22D6,
+    0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0, 0x838A, 0x838A, 0x22CE,
+    0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681, 0x838E, 0x8393, 0x28F6,
+    0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC, 0x839E, 0x839E, 0x2231,
+    0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93, 0x83A7, 0x83AA, 0x290C,
+    0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910, 0x83AE, 0x83AE, 0x22D7,
+    0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1, 0x83B1, 0x83B9, 0x2912,
+    0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B, 0x83C9, 0x83C9, 0x2025,
+    0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF, 0x83F7, 0x83FE, 0x2955,
+    0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9, 0x8451, 0x8470, 0x296D,
+    0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D, 0x8474, 0x8474, 0x2263,
+    0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683, 0x8478, 0x847E, 0x2991,
+    0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17, 0x8483, 0x848D, 0x299A,
+    0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5, 0x8492, 0x8492, 0x22CA,
+    0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8, 0x849D, 0x849D, 0x1F4F,
+    0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF, 0x84A2, 0x84A2, 0x2036,
+    0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4, 0x84A5, 0x84A5, 0x22C9,
+    0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5, 0x84A9, 0x84A9, 0x1F75,
+    0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE, 0x84C6, 0x84D2, 0x29D2,
+    0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF, 0x84D5, 0x84D5, 0x21A9,
+    0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6, 0x84D8, 0x84D8, 0x29E1,
+    0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003, 0x84DB, 0x84DC, 0x29E2,
+    0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4, 0x84EA, 0x84EA, 0x2323,
+    0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011, 0x84EF, 0x84F0, 0x29F3,
+    0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5, 0x8540, 0x8550, 0x2A02,
+    0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E, 0x8553, 0x8553, 0x2A13,
+    0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14, 0x855E, 0x855E, 0x20EF,
+    0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0, 0x8567, 0x857E, 0x2A24,
+    0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1, 0x8588, 0x858A, 0x2A43,
+    0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46, 0x8592, 0x8592, 0x21F9,
+    0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010, 0x8597, 0x8597, 0x2A4F,
+    0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50, 0x85A2, 0x85A2, 0x1E5A,
+    0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2, 0x85B3, 0x85FE, 0x2A68,
+    0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D, 0x864B, 0x8653, 0x2ABE,
+    0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7, 0x8668, 0x8668, 0x236C,
+    0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0, 0x8696, 0x8696, 0x219C,
+    0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9, 0x869A, 0x86A0, 0x2B08,
+    0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F, 0x86CA, 0x86CA, 0x210B,
+    0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE, 0x86CD, 0x86CD, 0x2B38,
+    0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39, 0x86D1, 0x86D1, 0x222C,
+    0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8, 0x86DD, 0x86DD, 0x22C0,
+    0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F, 0x86E2, 0x86E7, 0x2B48,
+    0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E, 0x86EE, 0x86EE, 0x2379,
+    0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372, 0x86F5, 0x86FE, 0x2B58,
+    0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62, 0x8744, 0x8744, 0x237C,
+    0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0, 0x874A, 0x874A, 0x2B69,
+    0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74, 0x874D, 0x874E, 0x2B6A,
+    0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C, 0x8757, 0x8757, 0x1F4C,
+    0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378, 0x875B, 0x875B, 0x21CF,
+    0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75, 0x875E, 0x875E, 0x2371,
+    0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369, 0x8761, 0x8765, 0x2B77,
+    0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C, 0x877A, 0x877A, 0x236F,
+    0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370, 0x877E, 0x877E, 0x2B91,
+    0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376, 0x8782, 0x8782, 0x2373,
+    0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F, 0x8787, 0x8787, 0x2B96,
+    0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97, 0x878A, 0x878A, 0x20B5,
+    0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB, 0x878E, 0x878E, 0x2672,
+    0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E, 0x8794, 0x8797, 0x2B9E,
+    0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2, 0x879D, 0x879D, 0x2375,
+    0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382, 0x87A4, 0x87A6, 0x2BAB,
+    0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE, 0x87B3, 0x87B3, 0x236B,
+    0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039, 0x87B6, 0x87BA, 0x2BBA,
+    0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF, 0x87BF, 0x87BF, 0x237D,
+    0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2, 0x87C2, 0x87C2, 0x2381,
+    0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B, 0x87CB, 0x87CB, 0x237E,
+    0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA, 0x87CF, 0x87CF, 0x22DB,
+    0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A, 0x87D3, 0x87D3, 0x2689,
+    0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697, 0x87D6, 0x87D9, 0x2BCF,
+    0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3, 0x87F7, 0x87F7, 0x2383,
+    0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF, 0x87FA, 0x87FA, 0x218F,
+    0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246, 0x8841, 0x8841, 0x2248,
+    0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E, 0x8845, 0x8845, 0x2BF6,
+    0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7, 0x8880, 0x88B9, 0x2C2F,
+    0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69, 0x88CC, 0x88CC, 0x228B,
+    0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85, 0x88D5, 0x88D6, 0x2C81,
+    0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83, 0x88DF, 0x88DF, 0x232C,
+    0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E, 0x88E6, 0x88F1, 0x2C8F,
+    0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38, 0x88F4, 0x88F5, 0x2C9B,
+    0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D, 0x8940, 0x894A, 0x2CA5,
+    0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339, 0x894D, 0x894D, 0x2CB0,
+    0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1, 0x8950, 0x8950, 0x232D,
+    0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F, 0x8955, 0x895C, 0x2CB5,
+    0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD, 0x895F, 0x895F, 0x232F,
+    0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D, 0x896E, 0x8970, 0x2CCB,
+    0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE, 0x897C, 0x897C, 0x1EC2,
+    0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA, 0x898B, 0x898B, 0x22B2,
+    0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF, 0x899A, 0x899D, 0x2CF2,
+    0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6, 0x89A6, 0x89A6, 0x20D9,
+    0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD, 0x89A9, 0x89AE, 0x2CFE,
+    0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04, 0x89BA, 0x89BA, 0x21ED,
+    0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007, 0x89BF, 0x89BF, 0x2326,
+    0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11, 0x89C4, 0x89C4, 0x1F52,
+    0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328, 0x89C7, 0x89C7, 0x2D14,
+    0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15, 0x89CE, 0x89CE, 0x1E2B,
+    0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE, 0x89D2, 0x89D7, 0x2D1C,
+    0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22, 0x89DB, 0x89DB, 0x2138,
+    0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081, 0x89F5, 0x89FE, 0x2D3C,
+    0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C, 0x8A42, 0x8A58, 0x2D47,
+    0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE, 0x8A5B, 0x8A5B, 0x2D5E,
+    0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F, 0x8A5E, 0x8A5E, 0x1EFA,
+    0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD, 0x8A7A, 0x8A7E, 0x2D7A,
+    0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F, 0x8AE5, 0x8AFE, 0x2DE3,
+    0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E, 0x8B45, 0x8B48, 0x2E01,
+    0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05, 0x8B7A, 0x8B7A, 0x23FC,
+    0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39, 0x8B8C, 0x8B8C, 0x2069,
+    0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7, 0x8B9F, 0x8BB2, 0x2E56,
+    0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A, 0x8BB9, 0x8BB9, 0x23FD,
+    0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8, 0x8BBF, 0x8BC5, 0x2E73,
+    0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A, 0x8BC8, 0x8BC8, 0x23FE,
+    0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B, 0x8BD4, 0x8BD4, 0x2401,
+    0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF, 0x8BDD, 0x8BE4, 0x2E8C,
+    0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94, 0x8BEB, 0x8BEB, 0x2221,
+    0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122, 0x8BF1, 0x8BFE, 0x2E9D,
+    0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB, 0x8C45, 0x8C4E, 0x2EAF,
+    0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9, 0x8C57, 0x8C57, 0x21E5,
+    0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057, 0x8C5D, 0x8C7E, 0x2EC4,
+    0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5, 0x8C8C, 0x8C8C, 0x2EF1,
+    0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3, 0x8C8F, 0x8C8F, 0x2121,
+    0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4, 0x8C92, 0x8C92, 0x1FE5,
+    0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A, 0x8C9A, 0x8C9A, 0x1E37,
+    0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E, 0x8CA3, 0x8CA3, 0x22A6,
+    0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00, 0x8CA6, 0x8CA6, 0x1EDA,
+    0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01, 0x8CC0, 0x8CC0, 0x235C,
+    0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050, 0x8CD3, 0x8CD3, 0x1E67,
+    0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4, 0x8CD6, 0x8CD8, 0x2F2B,
+    0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E, 0x8CF9, 0x8CF9, 0x1F16,
+    0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52, 0x8D73, 0x8D73, 0x2389,
+    0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7, 0x8D76, 0x8D7A, 0x2F86,
+    0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B, 0x8D80, 0x8D87, 0x2F8E,
+    0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96, 0x8D8F, 0x8D8F, 0x1F1A,
+    0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B, 0x8D9F, 0x8DB8, 0x2FAA,
+    0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4, 0x8DE2, 0x8DE2, 0x2391,
+    0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271, 0x8DE5, 0x8DE6, 0x2FED,
+    0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF, 0x8DF7, 0x8DF7, 0x238E,
+    0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D, 0x8E40, 0x8E45, 0x3004,
+    0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A, 0x8E56, 0x8E56, 0x2390,
+    0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033, 0x8E59, 0x8E59, 0x301A,
+    0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B, 0x8E68, 0x8E68, 0x1FE9,
+    0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055, 0x8E6F, 0x8E6F, 0x302D,
+    0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E, 0x8E80, 0x8E80, 0x2324,
+    0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143, 0x8E9C, 0x8E9E, 0x3056,
+    0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059, 0x8EA4, 0x8EA4, 0x2277,
+    0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7, 0x8EA8, 0x8EAB, 0x305F,
+    0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063, 0x8EAE, 0x8EAE, 0x2384,
+    0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387, 0x8EBE, 0x8EBE, 0x2386,
+    0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290, 0x8EC4, 0x8EC4, 0x3076,
+    0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077, 0x8ECD, 0x8ECD, 0x1E32,
+    0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E, 0x8ED6, 0x8ED6, 0x1F13,
+    0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085, 0x8EEC, 0x8EEC, 0x1FE0,
+    0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB, 0x8F52, 0x8F52, 0x2087,
+    0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE, 0x8F55, 0x8F55, 0x1EF6,
+    0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD, 0x8F5D, 0x8F5D, 0x2045,
+    0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178, 0x8F65, 0x8F7E, 0x30C9,
+    0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5, 0x8F87, 0x8F87, 0x30E9,
+    0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA, 0x8F95, 0x8F95, 0x266E,
+    0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0, 0x8F98, 0x8F9A, 0x30F7,
+    0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA, 0x8F9D, 0x8F9D, 0x2188,
+    0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C, 0x8FA2, 0x8FBC, 0x30FE,
+    0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119, 0x8FC4, 0x8FC4, 0x1EA1,
+    0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393, 0x8FC7, 0x8FCC, 0x3120,
+    0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126, 0x8FD8, 0x8FD8, 0x1E7C,
+    0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156, 0x9080, 0x909C, 0x3195,
+    0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E, 0x909F, 0x90B9, 0x31B2,
+    0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD, 0x90C0, 0x90C0, 0x2095,
+    0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2, 0x90C5, 0x90C5, 0x23B9,
+    0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28, 0x90DC, 0x90DC, 0x23BD,
+    0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5, 0x90EE, 0x90EF, 0x31FA,
+    0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC, 0x90F7, 0x90F7, 0x23B3,
+    0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209, 0x9142, 0x9142, 0x2162,
+    0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E, 0x914C, 0x914C, 0x3213,
+    0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214, 0x9151, 0x9151, 0x23B7,
+    0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F, 0x9155, 0x9155, 0x24DF,
+    0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2, 0x915A, 0x915A, 0x214E,
+    0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052, 0x915E, 0x9160, 0x321E,
+    0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221, 0x9163, 0x9163, 0x20EB,
+    0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232, 0x916F, 0x9175, 0x322C,
+    0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233, 0x917A, 0x917A, 0x201B,
+    0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE, 0x917D, 0x917E, 0x3236,
+    0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE, 0x9185, 0x918C, 0x323C,
+    0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244, 0x9191, 0x9191, 0x2089,
+    0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1, 0x9194, 0x9196, 0x3248,
+    0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B, 0x919B, 0x919B, 0x2214,
+    0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE, 0x91AA, 0x91AA, 0x2223,
+    0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B, 0x91BA, 0x91BA, 0x268C,
+    0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269, 0x91BF, 0x91BF, 0x24E0,
+    0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8, 0x91C4, 0x91CC, 0x326F,
+    0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278, 0x91D0, 0x91D0, 0x1FFE,
+    0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1, 0x91D3, 0x91D3, 0x327A,
+    0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B, 0x91D6, 0x91D6, 0x1FCE,
+    0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E, 0x91D9, 0x91D9, 0x2021,
+    0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1, 0x91E0, 0x91E1, 0x3282,
+    0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284, 0x91EA, 0x91EA, 0x24A4,
+    0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273, 0x91F1, 0x91F1, 0x3290,
+    0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291, 0x9240, 0x927E, 0x329D,
+    0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1, 0x92B7, 0x92CD, 0x3312,
+    0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329, 0x92D0, 0x92D0, 0x235D,
+    0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682, 0x92D5, 0x92DE, 0x332D,
+    0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A, 0x92E1, 0x92FD, 0x3337,
+    0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354, 0x9350, 0x9350, 0x21FF,
+    0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58, 0x935E, 0x936F, 0x3370,
+    0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382, 0x9376, 0x9376, 0x1EB6,
+    0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F, 0x938C, 0x938C, 0x20DB,
+    0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360, 0x939E, 0x93A4, 0x33AB,
+    0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2, 0x93A7, 0x93A7, 0x2040,
+    0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E, 0x93B5, 0x93B7, 0x33BF,
+    0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2, 0x93BB, 0x93BB, 0x235E,
+    0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A, 0x93BE, 0x93C5, 0x33C5,
+    0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD, 0x93CF, 0x93CF, 0x2093,
+    0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F, 0x93D8, 0x93DA, 0x33DC,
+    0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54, 0x93DD, 0x93E0, 0x33DF,
+    0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3, 0x93E4, 0x93E4, 0x20C0,
+    0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5, 0x93E9, 0x93E9, 0x2160,
+    0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D, 0x93EC, 0x93EC, 0x1F8E,
+    0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9, 0x93EF, 0x93EF, 0x2047,
+    0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262, 0x93F2, 0x93F3, 0x33EB,
+    0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2, 0x93F6, 0x93F9, 0x33ED,
+    0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1, 0x93FE, 0x93FE, 0x1FCC,
+    0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72, 0x9445, 0x944C, 0x33F8,
+    0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400, 0x9450, 0x9450, 0x1E52,
+    0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C, 0x9453, 0x9453, 0x228F,
+    0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED, 0x9456, 0x9457, 0x3403,
+    0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405, 0x945B, 0x945B, 0x1E2D,
+    0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366, 0x945E, 0x945E, 0x3407,
+    0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408, 0x9464, 0x9464, 0x2363,
+    0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A, 0x9467, 0x946D, 0x340D,
+    0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414, 0x9472, 0x9472, 0x1FF6,
+    0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364, 0x9475, 0x9475, 0x3418,
+    0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419, 0x9478, 0x9478, 0x2367,
+    0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D, 0x947B, 0x947E, 0x341B,
+    0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056, 0x9482, 0x9482, 0x2163,
+    0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9, 0x9488, 0x9488, 0x1FFC,
+    0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E, 0x94A2, 0x94B2, 0x343B,
+    0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C, 0x94B5, 0x94B5, 0x2142,
+    0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E, 0x94C0, 0x94C0, 0x1E43,
+    0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4, 0x94CD, 0x94D7, 0x3461,
+    0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C, 0x94E0, 0x94E0, 0x1ED7,
+    0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491, 0x9572, 0x9572, 0x212D,
+    0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF, 0x9583, 0x9583, 0x229B,
+    0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256, 0x959F, 0x959F, 0x24A8,
+    0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79, 0x95B4, 0x95B9, 0x34FF,
+    0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505, 0x95CF, 0x95CF, 0x24A7,
+    0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686, 0x95D2, 0x95D2, 0x24A6,
+    0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE, 0x95D5, 0x95E0, 0x351B,
+    0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527, 0x95E7, 0x95E7, 0x1FE7,
+    0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112, 0x95F2, 0x95F7, 0x3535,
+    0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B, 0x95FE, 0x95FE, 0x1F5C,
+    0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4, 0x9657, 0x967B, 0x3556,
+    0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B, 0x9680, 0x96FE, 0x357D,
+    0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A, 0x9768, 0x976B, 0x3623,
+    0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627, 0x976E, 0x976E, 0x246D,
+    0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638, 0x9796, 0x9796, 0x246B,
+    0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E, 0x979D, 0x979D, 0x1ECE,
+    0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272, 0x97A4, 0x97BE, 0x3658,
+    0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673, 0x97EE, 0x97EE, 0x21FE,
+    0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE, 0x97F8, 0x97FE, 0x36A9,
+    0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475, 0x9846, 0x9848, 0x36B5,
+    0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8, 0x984F, 0x984F, 0x1F6F,
+    0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468, 0x9872, 0x9872, 0x36DE,
+    0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF, 0x9880, 0x9880, 0x36EA,
+    0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB, 0x988B, 0x988B, 0x1F27,
+    0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4, 0x98A0, 0x98A0, 0x247C,
+    0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1, 0x98AB, 0x98B5, 0x3710,
+    0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005, 0x98B8, 0x98B9, 0x371B,
+    0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D, 0x98C7, 0x98C7, 0x203E,
+    0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C, 0x98CC, 0x98CF, 0x372C,
+    0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730, 0x98D3, 0x98D3, 0x2204,
+    0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3, 0x98E4, 0x98E4, 0x2140,
+    0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741, 0x98EF, 0x98EF, 0x2474,
+    0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD, 0x98F3, 0x98FE, 0x374C,
+    0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68, 0x9944, 0x9944, 0x375B,
+    0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C, 0x9966, 0x9966, 0x2472,
+    0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5, 0x996F, 0x9974, 0x3783,
+    0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789, 0x997A, 0x997A, 0x1F8B,
+    0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D, 0x9980, 0x9984, 0x3790,
+    0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795, 0x9989, 0x9989, 0x2482,
+    0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1, 0x998F, 0x9990, 0x379C,
+    0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E, 0x9999, 0x9999, 0x1F38,
+    0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485, 0x99AA, 0x99AF, 0x37B4,
+    0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E, 0x99B2, 0x99B2, 0x37BA,
+    0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486, 0x99B5, 0x99B5, 0x2471,
+    0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483, 0x99BE, 0x99BE, 0x2470,
+    0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469, 0x99C1, 0x99C1, 0x37C3,
+    0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4, 0x99C9, 0x99C9, 0x246F,
+    0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481, 0x99CF, 0x99D0, 0x37CE,
+    0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0, 0x99DA, 0x99DA, 0x1FF5,
+    0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4, 0x99E1, 0x99E4, 0x37DD,
+    0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1, 0x99E8, 0x99E8, 0x2479,
+    0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E, 0x99ED, 0x99F3, 0x37E6,
+    0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED, 0x9A40, 0x9A49, 0x37F7,
+    0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801, 0x9A57, 0x9A57, 0x20AD,
+    0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB, 0x9A66, 0x9A66, 0x381A,
+    0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B, 0x9A71, 0x9A71, 0x2159,
+    0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013, 0x9A77, 0x9A77, 0x1F33,
+    0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F, 0x9A88, 0x9A88, 0x1E5C,
+    0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488, 0x9A8D, 0x9A90, 0x383A,
+    0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E, 0x9A97, 0x9A97, 0x248A,
+    0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489, 0x9A9B, 0x9A9B, 0x248B,
+    0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83, 0x9A9F, 0x9AA1, 0x3847,
+    0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB, 0x9AA4, 0x9AA9, 0x384A,
+    0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850, 0x9AD0, 0x9AD0, 0x24C0,
+    0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D, 0x9AD7, 0x9AD9, 0x387A,
+    0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D, 0x9AE2, 0x9AE2, 0x20CA,
+    0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7, 0x9AE5, 0x9AE5, 0x24C2,
+    0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E, 0x9B80, 0x9BD0, 0x38DD,
+    0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E, 0x9BDC, 0x9BDC, 0x23DB,
+    0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A, 0x9C53, 0x9C53, 0x205E,
+    0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244, 0x9C5A, 0x9C5A, 0x23E2,
+    0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4, 0x9C5D, 0x9C74, 0x3973,
+    0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B, 0x9C79, 0x9C79, 0x1E66,
+    0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993, 0x9C86, 0x9C86, 0x1F63,
+    0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD, 0x9C9E, 0x9CAA, 0x39AF,
+    0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC, 0x9CCA, 0x9CCA, 0x22B5,
+    0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26, 0x9CD0, 0x9CE5, 0x39DE,
+    0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088, 0x9CE8, 0x9CEB, 0x39F4,
+    0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8, 0x9CEE, 0x9CEE, 0x2341,
+    0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B, 0x9CFC, 0x9CFD, 0x3A05,
+    0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07, 0x9D42, 0x9D42, 0x2124,
+    0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048, 0x9D47, 0x9D47, 0x23E0,
+    0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077, 0x9D4E, 0x9D4E, 0x3A11,
+    0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12, 0x9D61, 0x9D61, 0x20B1,
+    0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41, 0x9D69, 0x9D69, 0x201C,
+    0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8, 0x9D6F, 0x9D70, 0x3A2D,
+    0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F, 0x9D75, 0x9D75, 0x1F9B,
+    0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F, 0x9D7C, 0x9D7C, 0x3A37,
+    0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38, 0x9D80, 0x9D89, 0x3A39,
+    0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43, 0x9D8D, 0x9D8D, 0x1FB4,
+    0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7, 0x9D92, 0x9D98, 0x3A48,
+    0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F, 0x9DA1, 0x9DA1, 0x23E1,
+    0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56, 0x9DA7, 0x9DA7, 0x23EA,
+    0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3, 0x9DAD, 0x9DAD, 0x210E,
+    0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6, 0x9DB3, 0x9DB3, 0x2004,
+    0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D, 0x9DBF, 0x9DC5, 0x3A6C,
+    0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73, 0x9DC9, 0x9DC9, 0x2264,
+    0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2, 0x9DCE, 0x9DD1, 0x3A78,
+    0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C, 0x9DD5, 0x9DD5, 0x1EC4,
+    0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6, 0x9DE2, 0x9DE2, 0x20A9,
+    0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B, 0x9DF2, 0x9DF3, 0x3A97,
+    0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99, 0x9DF7, 0x9DF7, 0x268B,
+    0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76, 0x9DFB, 0x9DFC, 0x3A9D,
+    0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F, 0x9E40, 0x9E44, 0x3AA0,
+    0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5, 0x9E48, 0x9E48, 0x2191,
+    0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7, 0x9E52, 0x9E52, 0x1F9C,
+    0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA, 0x9E55, 0x9E55, 0x3AB0,
+    0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1, 0x9E5D, 0x9E5D, 0x23E9,
+    0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7, 0x9E61, 0x9E61, 0x21D5,
+    0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6, 0x9E64, 0x9E66, 0x3ABA,
+    0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD, 0x9E6C, 0x9E6C, 0x1E4F,
+    0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9, 0x9E70, 0x9E71, 0x3AC3,
+    0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5, 0x9E74, 0x9E74, 0x23EC,
+    0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6, 0x9E7B, 0x9E7B, 0x23D8,
+    0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB, 0x9E80, 0x9E84, 0x3ACD,
+    0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2, 0x9E87, 0x9E87, 0x23ED,
+    0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA, 0x9E92, 0x9E95, 0x3ADC,
+    0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8, 0x9E98, 0x9EA1, 0x3AE0,
+    0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA, 0x9EA6, 0x9EA6, 0x200B,
+    0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166, 0x9EAA, 0x9EAD, 0x3AEF,
+    0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3, 0x9EB3, 0x9EB3, 0x2189,
+    0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7, 0x9EB7, 0x9EB7, 0x23E7,
+    0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3, 0x9EF6, 0x9EFE, 0x3B36,
+    0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A, 0x9F4F, 0x9F6E, 0x3B4D,
+    0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D, 0x9F80, 0x9F91, 0x3B7C,
+    0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E, 0x9F98, 0x9F98, 0x24D6,
+    0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A, 0x9FA7, 0x9FA8, 0x3BA0,
+    0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2, 0x9FAC, 0x9FAC, 0x24D5,
+    0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228, 0x9FCA, 0x9FCC, 0x3BC0,
+    0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3, 0x9FE1, 0x9FE1, 0x20FC,
+    0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87, 0x9FEC, 0x9FED, 0x3BDF,
+    0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1, 0x9FF4, 0x9FF4, 0x1EBA,
+    0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119, 0x9FFE, 0x9FFE, 0x3BEE,
+    0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C, 0xA044, 0xA045, 0x3BF2,
+    0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4, 0xA049, 0xA049, 0x2227,
+    0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F, 0xA04F, 0xA053, 0x3BFA,
+    0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF, 0xA05A, 0xA05A, 0x1F5D,
+    0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC, 0xA062, 0xA062, 0x3C0A,
+    0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B, 0xA071, 0xA071, 0x2149,
+    0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046, 0xA075, 0xA07E, 0x3C1A,
+    0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24, 0xA091, 0xA091, 0x2190,
+    0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208, 0xA095, 0xA095, 0x3C36,
+    0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37, 0xA0A9, 0xA0A9, 0x24C3,
+    0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC, 0xA0C0, 0xA0CD, 0x3C5E,
+    0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C, 0xA0D9, 0xA0D9, 0x1ED1,
+    0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC, 0xA0DF, 0xA0ED, 0x3C7A,
+    0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89, 0xA1A1, 0xA1FE, 0x0060,
+    0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E3, 0xA2E3, 0x5751,
+    0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106,
+    0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D,
+    0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B,
+    0xA840, 0xA87E, 0x26B3, 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C,
+    0xA8C5, 0xA8EA, 0x02BC, 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720,
+    0xA95C, 0xA95C, 0x2722, 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742,
+    0xA996, 0xA996, 0x1E17, 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99,
+    0xAA4D, 0xAA4D, 0x21B6, 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6,
+    0xAA71, 0xAA71, 0x2235, 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397,
+    0xAA74, 0xAA76, 0x3CC9, 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC,
+    0xAA7A, 0xAA7A, 0x223F, 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE,
+    0xAA80, 0xAA99, 0x3CD1, 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB,
+    0xAA9C, 0xAA9C, 0x2396, 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC,
+    0xAA9F, 0xAA9F, 0x20A2, 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E,
+    0xAB40, 0xAB40, 0x1F64, 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B,
+    0xAB44, 0xAB44, 0x3CF0, 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139,
+    0xAB47, 0xAB47, 0x3CF1, 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1,
+    0xAB4A, 0xAB4A, 0x239A, 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399,
+    0xAB4E, 0xAB7E, 0x3CF4, 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C,
+    0xAC40, 0xAC45, 0x3D46, 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C,
+    0xAC71, 0xAC71, 0x2460, 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C,
+    0xAC7D, 0xAC7E, 0x3D80, 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D,
+    0xAC8E, 0xAC92, 0x3D8F, 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A,
+    0xAC95, 0xACA0, 0x3D94, 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461,
+    0xAD4A, 0xAD5D, 0x3DA9, 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD,
+    0xAD61, 0xAD61, 0x2462, 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54,
+    0xAD69, 0xAD73, 0x3DC5, 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0,
+    0xAD80, 0xAD81, 0x3DDA, 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC,
+    0xAD87, 0xAD87, 0x245D, 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463,
+    0xAD8C, 0xAD90, 0x3DE3, 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8,
+    0xAE40, 0xAE53, 0x3DF7, 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B,
+    0xAE62, 0xAE62, 0x1E70, 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F,
+    0xAE81, 0xAE84, 0x3E34, 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38,
+    0xAE8B, 0xAE8B, 0x1F4E, 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1,
+    0xAE95, 0xAE9F, 0x3E45, 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50,
+    0xAF64, 0xAF64, 0x1FC6, 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE,
+    0xAF7C, 0xAF7E, 0x3E8A, 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01,
+    0xAF83, 0xAF83, 0x2200, 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2,
+    0xAF8F, 0xAF8F, 0x1E97, 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB,
+    0xAF92, 0xAF9B, 0x3E9A, 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4,
+    0xAF9F, 0xAF9F, 0x2028, 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7,
+    0xB041, 0xB042, 0x25AF, 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1,
+    0xB045, 0xB04E, 0x3EA9, 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3,
+    0xB054, 0xB054, 0x1E4E, 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202,
+    0xB058, 0xB058, 0x25AB, 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9,
+    0xB05B, 0xB05B, 0x25AD, 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6,
+    0xB05E, 0xB05E, 0x3EBB, 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4,
+    0xB062, 0xB062, 0x222F, 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7,
+    0xB065, 0xB06B, 0x3EBC, 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3,
+    0xB07D, 0xB07D, 0x1E25, 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4,
+    0xB097, 0xB097, 0x25C0, 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A,
+    0xB09A, 0xB0A0, 0x3EEC, 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3,
+    0xB14B, 0xB14B, 0x226E, 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD,
+    0xB14E, 0xB14E, 0x3EFF, 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2,
+    0xB151, 0xB151, 0x3F00, 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01,
+    0xB180, 0xB196, 0x3F2D, 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44,
+    0xB1A1, 0xB1FE, 0x040A, 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF,
+    0xB242, 0xB266, 0x3F4E, 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73,
+    0xB26D, 0xB26D, 0x2074, 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687,
+    0xB275, 0xB27E, 0x3F7E, 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88,
+    0xB289, 0xB289, 0x268D, 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0,
+    0xB29B, 0xB2A0, 0x3FA0, 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6,
+    0xB343, 0xB343, 0x1FAB, 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8,
+    0xB371, 0xB37E, 0x3FD5, 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9,
+    0xB389, 0xB38B, 0x3FEB, 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE,
+    0xB38E, 0xB38E, 0x21FA, 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6,
+    0xB440, 0xB453, 0x4001, 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015,
+    0xB458, 0xB458, 0x24E4, 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6,
+    0xB45F, 0xB45F, 0x20F7, 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B,
+    0xB462, 0xB474, 0x401E, 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031,
+    0xB47E, 0xB47E, 0x24EC, 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB,
+    0xB484, 0xB488, 0x403C, 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041,
+    0xB493, 0xB493, 0x24EA, 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524,
+    0xB540, 0xB540, 0x4057, 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058,
+    0xB54B, 0xB54B, 0x1E27, 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6,
+    0xB557, 0xB559, 0x406B, 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012,
+    0xB55C, 0xB55C, 0x1EEC, 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8,
+    0xB562, 0xB57E, 0x4072, 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66,
+    0xB59D, 0xB59D, 0x24DC, 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582,
+    0xB640, 0xB651, 0x40AE, 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0,
+    0xB655, 0xB655, 0x24DD, 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E,
+    0xB65A, 0xB65A, 0x40C5, 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8,
+    0xB65D, 0xB67E, 0x40C6, 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0,
+    0xB740, 0xB74D, 0x4109, 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117,
+    0xB751, 0xB751, 0x1E80, 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677,
+    0xB75A, 0xB763, 0x4120, 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69,
+    0xB766, 0xB766, 0x222B, 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F,
+    0xB778, 0xB778, 0x1F5B, 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B,
+    0xB781, 0xB781, 0x4140, 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141,
+    0xB7A1, 0xB7FE, 0x063E, 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0,
+    0xB844, 0xB844, 0x2186, 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED,
+    0xB847, 0xB84C, 0x4163, 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169,
+    0xB851, 0xB851, 0x1FEA, 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4,
+    0xB85B, 0xB85B, 0x20E1, 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8,
+    0xB85E, 0xB85E, 0x2260, 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2,
+    0xB861, 0xB876, 0x4176, 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C,
+    0xB880, 0xB881, 0x4193, 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195,
+    0xB8A1, 0xB8FE, 0x069C, 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41,
+    0xB951, 0xB960, 0x41C3, 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3,
+    0xB97B, 0xB97B, 0x1F86, 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF,
+    0xB99D, 0xB99D, 0x1FB3, 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF,
+    0xB9A1, 0xB9FE, 0x06FA, 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4,
+    0xBA43, 0xBA43, 0x4210, 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211,
+    0xBA56, 0xBA56, 0x25E3, 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111,
+    0xBA5A, 0xBA5F, 0x4224, 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A,
+    0xBA6A, 0xBA6A, 0x25E7, 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041,
+    0xBA75, 0xBA7E, 0x423C, 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA,
+    0xBA85, 0xBA85, 0x424A, 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B,
+    0xBA88, 0xBA88, 0x25EC, 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB,
+    0xBA8E, 0xBA9D, 0x4250, 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D,
+    0xBAA0, 0xBAA0, 0x4260, 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7,
+    0xBB41, 0xBB48, 0x4261, 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269,
+    0xBB58, 0xBB58, 0x25E9, 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE,
+    0xBB5C, 0xBB5C, 0x203A, 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693,
+    0xBB61, 0xBB64, 0x427C, 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED,
+    0xBB67, 0xBB67, 0x4280, 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281,
+    0xBB6A, 0xBB6A, 0x2065, 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3,
+    0xBB6F, 0xBB7E, 0x4285, 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6,
+    0xBC40, 0xBC51, 0x42B6, 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC,
+    0xBC54, 0xBC59, 0x42C8, 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE,
+    0xBC61, 0xBC61, 0x269B, 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3,
+    0xBC64, 0xBC64, 0x42D5, 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6,
+    0xBC67, 0xBC67, 0x25F4, 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B,
+    0xBC6A, 0xBC6C, 0x42D8, 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB,
+    0xBC6F, 0xBC6F, 0x1F7B, 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D,
+    0xBC72, 0xBC72, 0x42DD, 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48,
+    0xBC75, 0xBC75, 0x241C, 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF,
+    0xBC79, 0xBC79, 0x219A, 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091,
+    0xBC7C, 0xBC7D, 0x42DF, 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1,
+    0xBC82, 0xBC82, 0x2423, 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422,
+    0xBC85, 0xBC85, 0x42E3, 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4,
+    0xBC88, 0xBC88, 0x228D, 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8,
+    0xBC8B, 0xBC8B, 0x2421, 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3,
+    0xBC90, 0xBC99, 0x42E8, 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426,
+    0xBC9C, 0xBC9C, 0x2425, 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2,
+    0xBCA1, 0xBCFE, 0x0814, 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A,
+    0xBD43, 0xBD43, 0x2424, 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428,
+    0xBD46, 0xBD47, 0x42F8, 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429,
+    0xBD4A, 0xBD4A, 0x42FA, 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB,
+    0xBD4D, 0xBD4D, 0x22BE, 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31,
+    0xBD50, 0xBD56, 0x42FD, 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304,
+    0xBD59, 0xBD59, 0x1FB5, 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B,
+    0xBD67, 0xBD67, 0x1FAF, 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068,
+    0xBD6B, 0xBD6B, 0x21E4, 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21,
+    0xBD70, 0xBD70, 0x4316, 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317,
+    0xBD79, 0xBD79, 0x217C, 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D,
+    0xBD7C, 0xBD7D, 0x431E, 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320,
+    0xBD81, 0xBD81, 0x1FD1, 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33,
+    0xBD8A, 0xBD8A, 0x4328, 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329,
+    0xBD8E, 0xBD8E, 0x242E, 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430,
+    0xBD91, 0xBD91, 0x21DB, 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158,
+    0xBD98, 0xBD9A, 0x4331, 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334,
+    0xBDA1, 0xBDFE, 0x0872, 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9,
+    0xBE44, 0xBE44, 0x433C, 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D,
+    0xBE49, 0xBE49, 0x1E8E, 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340,
+    0xBE51, 0xBE51, 0x21C5, 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192,
+    0xBE54, 0xBE54, 0x4346, 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19,
+    0xBE57, 0xBE57, 0x218C, 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3,
+    0xBE5A, 0xBE5C, 0x4347, 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438,
+    0xBE5F, 0xBE5F, 0x2432, 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A,
+    0xBE62, 0xBE62, 0x1E9C, 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085,
+    0xBE65, 0xBE68, 0x434B, 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F,
+    0xBE6C, 0xBE6C, 0x243B, 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7,
+    0xBE70, 0xBE70, 0x2433, 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054,
+    0xBE77, 0xBE77, 0x21DE, 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434,
+    0xBE7A, 0xBE7B, 0x4359, 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89,
+    0xBE7E, 0xBE7E, 0x243C, 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E,
+    0xBE84, 0xBE84, 0x1ED8, 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF,
+    0xBE87, 0xBE87, 0x2445, 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249,
+    0xBE8A, 0xBE8B, 0x4360, 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362,
+    0xBE8E, 0xBE8E, 0x1E47, 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363,
+    0xBE92, 0xBE92, 0x2086, 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196,
+    0xBE96, 0xBE96, 0x4367, 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F,
+    0xBE99, 0xBE99, 0x4368, 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369,
+    0xBE9C, 0xBE9C, 0x2442, 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E,
+    0xBEA0, 0xBEA0, 0x436C, 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6,
+    0xBF41, 0xBF4C, 0x436D, 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446,
+    0xBF4F, 0xBF4F, 0x244B, 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379,
+    0xBF55, 0xBF55, 0x2427, 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D,
+    0xBF60, 0xBF60, 0x1F0F, 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447,
+    0xBF63, 0xBF63, 0x2449, 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387,
+    0xBF68, 0xBF68, 0x21C2, 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E,
+    0xBF6D, 0xBF6F, 0x438D, 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390,
+    0xBF72, 0xBF72, 0x244A, 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391,
+    0xBF76, 0xBF76, 0x22BB, 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393,
+    0xBF79, 0xBF79, 0x2694, 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6,
+    0xBF7C, 0xBF7C, 0x2051, 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E,
+    0xBF80, 0xBF81, 0x4395, 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D,
+    0xBF84, 0xBF88, 0x4397, 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451,
+    0xBF8B, 0xBF94, 0x439C, 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6,
+    0xBF97, 0xBF97, 0x2289, 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7,
+    0xBF9D, 0xBF9D, 0x2454, 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E,
+    0xC040, 0xC040, 0x20FB, 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440,
+    0xC045, 0xC04A, 0x43B1, 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61,
+    0xC04D, 0xC04D, 0x269D, 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A,
+    0xC050, 0xC050, 0x2456, 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458,
+    0xC053, 0xC054, 0x43B8, 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA,
+    0xC05B, 0xC05B, 0x221A, 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A,
+    0xC05F, 0xC05F, 0x244D, 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1,
+    0xC069, 0xC069, 0x2453, 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420,
+    0xC06C, 0xC06C, 0x43CA, 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685,
+    0xC06F, 0xC06F, 0x43CB, 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC,
+    0xC074, 0xC074, 0x2224, 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF,
+    0xC077, 0xC077, 0x21BA, 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A,
+    0xC07A, 0xC07B, 0x43D1, 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3,
+    0xC080, 0xC09A, 0x43D5, 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0,
+    0xC09D, 0xC09D, 0x269A, 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C,
+    0xC140, 0xC14F, 0x43F4, 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404,
+    0xC154, 0xC154, 0x1E2C, 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062,
+    0xC160, 0xC160, 0x24F1, 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2,
+    0xC163, 0xC174, 0x4412, 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424,
+    0xC178, 0xC178, 0x2215, 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C,
+    0xC195, 0xC195, 0x21AE, 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA,
+    0xC240, 0xC24D, 0x444C, 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A,
+    0xC265, 0xC265, 0x25C2, 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1,
+    0xC268, 0xC27C, 0x4471, 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486,
+    0xC280, 0xC283, 0x4487, 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B,
+    0xC293, 0xC293, 0x2017, 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125,
+    0xC296, 0xC296, 0x214D, 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4,
+    0xC299, 0xC299, 0x209D, 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A,
+    0xC29C, 0xC29C, 0x25C3, 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179,
+    0xC2A1, 0xC2FE, 0x0A48, 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E,
+    0xC343, 0xC343, 0x2155, 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2,
+    0xC37C, 0xC37E, 0x44D7, 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7,
+    0xC385, 0xC39A, 0x44DE, 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4,
+    0xC3A1, 0xC3FE, 0x0AA6, 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123,
+    0xC44A, 0xC44B, 0x4502, 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504,
+    0xC454, 0xC454, 0x24C9, 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094,
+    0xC459, 0xC45A, 0x450E, 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510,
+    0xC463, 0xC463, 0x1E77, 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06,
+    0xC478, 0xC479, 0x452A, 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C,
+    0xC480, 0xC480, 0x4530, 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531,
+    0xC491, 0xC491, 0x1EAD, 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8,
+    0xC494, 0xC497, 0x4540, 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544,
+    0xC49A, 0xC49A, 0x20C5, 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA,
+    0xC49D, 0xC4A0, 0x4546, 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A,
+    0xC544, 0xC544, 0x1FF0, 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6,
+    0xC547, 0xC54A, 0x454F, 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE,
+    0xC54D, 0xC551, 0x4553, 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558,
+    0xC55F, 0xC55F, 0x2161, 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B,
+    0xC564, 0xC564, 0x21D9, 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9,
+    0xC567, 0xC57E, 0x4567, 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61,
+    0xC594, 0xC59B, 0x4592, 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A,
+    0xC59E, 0xC59E, 0x1F98, 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62,
+    0xC640, 0xC640, 0x459D, 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E,
+    0xC644, 0xC644, 0x1F88, 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8,
+    0xC648, 0xC662, 0x45A2, 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD,
+    0xC672, 0xC672, 0x2336, 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7,
+    0xC6A1, 0xC6FE, 0x0BC0, 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB,
+    0xC767, 0xC76E, 0x461E, 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626,
+    0xC776, 0xC776, 0x1F7D, 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333,
+    0xC77C, 0xC77E, 0x4630, 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E,
+    0xC840, 0xC840, 0x4654, 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655,
+    0xC84F, 0xC84F, 0x2334, 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1,
+    0xC853, 0xC865, 0x4664, 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677,
+    0xC86E, 0xC86E, 0x2349, 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B,
+    0xC880, 0xC886, 0x468D, 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694,
+    0xC892, 0xC892, 0x2347, 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193,
+    0xC895, 0xC898, 0x469F, 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3,
+    0xC89D, 0xC89D, 0x1F62, 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C,
+    0xC940, 0xC94E, 0x46A9, 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348,
+    0xC951, 0xC96D, 0x46B8, 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5,
+    0xC970, 0xC970, 0x2345, 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12,
+    0xC978, 0xC97E, 0x46DC, 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018,
+    0xC990, 0xC990, 0x2335, 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C,
+    0xC99D, 0xC9A0, 0x46FD, 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701,
+    0xCA4E, 0xCA4E, 0x266F, 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351,
+    0xCA57, 0xCA58, 0x4716, 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718,
+    0xCA5C, 0xCA5C, 0x2338, 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B,
+    0xCA62, 0xCA6D, 0x471E, 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A,
+    0xCA72, 0xCA72, 0x234F, 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D,
+    0xCA78, 0xCA7A, 0x4731, 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331,
+    0xCA7D, 0xCA7D, 0x4734, 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735,
+    0xCA81, 0xCA81, 0x233B, 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350,
+    0xCA8A, 0xCA8D, 0x473D, 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6,
+    0xCA90, 0xCA91, 0x4741, 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743,
+    0xCA9A, 0xCA9A, 0x2355, 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38,
+    0xCB40, 0xCB42, 0x4750, 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753,
+    0xCB45, 0xCB45, 0x1F74, 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330,
+    0xCB48, 0xCB4A, 0x4755, 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758,
+    0xCB4E, 0xCB4E, 0x20DA, 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A,
+    0xCB58, 0xCB5C, 0x4762, 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767,
+    0xCB5F, 0xCB5F, 0x2107, 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F,
+    0xCB6B, 0xCB7A, 0x4772, 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343,
+    0xCB7D, 0xCB7E, 0x4782, 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212,
+    0xCB88, 0xCB8D, 0x478B, 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791,
+    0xCB92, 0xCB92, 0x2359, 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254,
+    0xCB9D, 0xCB9D, 0x479D, 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E,
+    0xCBA1, 0xCBFE, 0x0D96, 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357,
+    0xCC42, 0xCC48, 0x47A0, 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042,
+    0xCC4B, 0xCC4B, 0x2153, 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB,
+    0xCC50, 0xCC5B, 0x47AA, 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6,
+    0xCC60, 0xCC60, 0x2356, 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337,
+    0xCC65, 0xCC6C, 0x47BC, 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4,
+    0xCC79, 0xCC79, 0x2353, 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061,
+    0xCC7E, 0xCC7E, 0x47D2, 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95,
+    0xCC8F, 0xCC93, 0x47E1, 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6,
+    0xCC96, 0xCC96, 0x1F42, 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8,
+    0xCC9E, 0xCCA0, 0x47ED, 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0,
+    0xCD80, 0xCD8F, 0x482F, 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F,
+    0xCD98, 0xCD98, 0x25D7, 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52,
+    0xCE40, 0xCE66, 0x484E, 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875,
+    0xCE72, 0xCE72, 0x21B2, 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B,
+    0xCE81, 0xCE81, 0x219E, 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC,
+    0xCE88, 0xCE9A, 0x4891, 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4,
+    0xCE9E, 0xCE9E, 0x2226, 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0,
+    0xCF40, 0xCF4D, 0x48A8, 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6,
+    0xCF55, 0xCF55, 0x227B, 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE,
+    0xCF59, 0xCF5B, 0x48BE, 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1,
+    0xCF6C, 0xCF6C, 0x25D5, 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B,
+    0xCF74, 0xCF74, 0x48D6, 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7,
+    0xCF78, 0xCF78, 0x1E89, 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9,
+    0xCF7D, 0xCF7E, 0x48DC, 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211,
+    0xCF82, 0xCF88, 0x48DF, 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6,
+    0xCF8B, 0xCF92, 0x48E6, 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF,
+    0xCF95, 0xCF9D, 0x48EE, 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7,
+    0xCFA0, 0xCFA0, 0x25D8, 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8,
+    0xD04D, 0xD04D, 0x1F29, 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B,
+    0xD052, 0xD054, 0x4908, 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B,
+    0xD05C, 0xD05C, 0x2297, 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690,
+    0xD061, 0xD066, 0x4914, 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A,
+    0xD06C, 0xD06C, 0x2198, 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88,
+    0xD06F, 0xD07C, 0x491F, 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D,
+    0xD080, 0xD0A0, 0x492E, 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F,
+    0xD155, 0xD155, 0x25F1, 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C,
+    0xD15A, 0xD160, 0x4967, 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC,
+    0xD163, 0xD174, 0x496E, 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980,
+    0xD17D, 0xD17D, 0x2676, 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988,
+    0xD19D, 0xD19D, 0x1FE1, 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5,
+    0xD1A1, 0xD1FE, 0x0FCA, 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7,
+    0xD243, 0xD243, 0x22DD, 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD,
+    0xD24E, 0xD25B, 0x49B2, 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0,
+    0xD263, 0xD263, 0x25BC, 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6,
+    0xD268, 0xD268, 0x25BF, 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187,
+    0xD26E, 0xD26E, 0x49CD, 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE,
+    0xD272, 0xD272, 0x1E7F, 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD,
+    0xD276, 0xD27E, 0x49D2, 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96,
+    0xD28B, 0xD28D, 0x49E5, 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8,
+    0xD292, 0xD292, 0x2084, 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136,
+    0xD296, 0xD296, 0x49ED, 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE,
+    0xD2A0, 0xD2A0, 0x24BA, 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6,
+    0xD344, 0xD344, 0x24BC, 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4,
+    0xD349, 0xD349, 0x49FD, 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE,
+    0xD34D, 0xD34D, 0x24BD, 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE,
+    0xD351, 0xD354, 0x4A02, 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06,
+    0xD358, 0xD358, 0x1FD2, 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD,
+    0xD35C, 0xD35C, 0x4A0A, 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D,
+    0xD35F, 0xD377, 0x4A0B, 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24,
+    0xD37A, 0xD37A, 0x260A, 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94,
+    0xD37D, 0xD37E, 0x4A26, 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF,
+    0xD386, 0xD386, 0x1ECB, 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D,
+    0xD38B, 0xD38B, 0x1F77, 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB,
+    0xD38E, 0xD38E, 0x4A31, 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32,
+    0xD391, 0xD391, 0x216F, 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0,
+    0xD394, 0xD395, 0x4A34, 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36,
+    0xD398, 0xD398, 0x22E2, 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37,
+    0xD39B, 0xD39B, 0x1F78, 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2,
+    0xD39F, 0xD39F, 0x4A3A, 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086,
+    0xD440, 0xD440, 0x4A3B, 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C,
+    0xD445, 0xD445, 0x1FD3, 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5,
+    0xD448, 0xD44B, 0x4A40, 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44,
+    0xD44F, 0xD44F, 0x211F, 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD,
+    0xD454, 0xD455, 0x4A49, 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B,
+    0xD458, 0xD458, 0x22E7, 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282,
+    0xD45D, 0xD461, 0x4A4F, 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54,
+    0xD467, 0xD467, 0x22E8, 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4,
+    0xD46F, 0xD46F, 0x4A5E, 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F,
+    0xD472, 0xD472, 0x22EB, 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9,
+    0xD475, 0xD475, 0x20BD, 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA,
+    0xD479, 0xD47A, 0x4A63, 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65,
+    0xD47E, 0xD47E, 0x1E9E, 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6,
+    0xD483, 0xD483, 0x21E7, 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69,
+    0xD487, 0xD487, 0x2137, 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C,
+    0xD48B, 0xD48B, 0x4A6D, 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2,
+    0xD48E, 0xD48E, 0x1F37, 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E,
+    0xD491, 0xD491, 0x22EF, 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10,
+    0xD494, 0xD494, 0x21C8, 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1,
+    0xD497, 0xD49B, 0x4A70, 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75,
+    0xD49F, 0xD49F, 0x22EE, 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4,
+    0xD540, 0xD542, 0x4A78, 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E,
+    0xD545, 0xD545, 0x22EC, 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B,
+    0xD54A, 0xD54A, 0x20FE, 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9,
+    0xD550, 0xD550, 0x4A81, 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82,
+    0xD554, 0xD554, 0x2236, 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7,
+    0xD557, 0xD559, 0x4A85, 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88,
+    0xD55C, 0xD55C, 0x1E82, 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89,
+    0xD55F, 0xD55F, 0x21A4, 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8,
+    0xD562, 0xD562, 0x2151, 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60,
+    0xD565, 0xD567, 0x4A8B, 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E,
+    0xD56C, 0xD56C, 0x2145, 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC,
+    0xD56F, 0xD571, 0x4A92, 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95,
+    0xD575, 0xD575, 0x1EF5, 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218,
+    0xD579, 0xD57A, 0x4A99, 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B,
+    0xD57E, 0xD57E, 0x2300, 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4,
+    0xD582, 0xD583, 0x4A9E, 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0,
+    0xD586, 0xD586, 0x22FD, 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA,
+    0xD589, 0xD589, 0x4AA2, 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3,
+    0xD58C, 0xD58C, 0x22FB, 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC,
+    0xD58F, 0xD58F, 0x2027, 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060,
+    0xD594, 0xD594, 0x22FF, 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE,
+    0xD599, 0xD599, 0x1EC7, 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C,
+    0xD59C, 0xD59E, 0x4AAC, 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF,
+    0xD5A1, 0xD5FE, 0x1142, 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0,
+    0xD642, 0xD642, 0x230A, 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1,
+    0xD647, 0xD647, 0x2303, 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307,
+    0xD64A, 0xD64A, 0x230B, 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F,
+    0xD64E, 0xD64E, 0x4AB7, 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8,
+    0xD652, 0xD652, 0x2302, 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D,
+    0xD655, 0xD655, 0x4ABA, 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB,
+    0xD658, 0xD658, 0x2308, 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC,
+    0xD65B, 0xD65B, 0x4ABD, 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305,
+    0xD65E, 0xD65E, 0x2197, 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171,
+    0xD661, 0xD661, 0x2298, 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57,
+    0xD666, 0xD668, 0x4AC2, 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5,
+    0xD66B, 0xD66B, 0x2311, 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304,
+    0xD670, 0xD670, 0x4AC9, 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35,
+    0xD673, 0xD673, 0x4ACA, 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310,
+    0xD676, 0xD676, 0x1FA3, 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6,
+    0xD679, 0xD67B, 0x4ACC, 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF,
+    0xD680, 0xD682, 0x4AD1, 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4,
+    0xD686, 0xD686, 0x2312, 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313,
+    0xD689, 0xD68D, 0x4AD6, 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB,
+    0xD694, 0xD694, 0x1FBA, 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078,
+    0xD69A, 0xD6A0, 0x4AE4, 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB,
+    0xD743, 0xD743, 0x2288, 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316,
+    0xD749, 0xD749, 0x1F6B, 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314,
+    0xD751, 0xD751, 0x4AF8, 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315,
+    0xD754, 0xD754, 0x2168, 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4,
+    0xD757, 0xD763, 0x4AFA, 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07,
+    0xD767, 0xD767, 0x2219, 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09,
+    0xD76C, 0xD76C, 0x20D5, 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A,
+    0xD770, 0xD774, 0x4B0E, 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13,
+    0xD778, 0xD778, 0x1ED3, 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B,
+    0xD783, 0xD783, 0x1E49, 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B,
+    0xD788, 0xD78A, 0x4B21, 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8,
+    0xD78D, 0xD78D, 0x4B24, 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319,
+    0xD790, 0xD794, 0x4B25, 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A,
+    0xD797, 0xD797, 0x2317, 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE,
+    0xD840, 0xD84C, 0x4B34, 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41,
+    0xD853, 0xD853, 0x1EFD, 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71,
+    0xD890, 0xD890, 0x1E3B, 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81,
+    0xD893, 0xD893, 0x1F0C, 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24,
+    0xD896, 0xD899, 0x4B82, 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65,
+    0xD89C, 0xD89C, 0x1EF0, 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30,
+    0xD89F, 0xD89F, 0x2261, 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257,
+    0xD940, 0xD940, 0x4B87, 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB,
+    0xD943, 0xD943, 0x4B88, 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8,
+    0xD946, 0xD946, 0x1F39, 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48,
+    0xD949, 0xD949, 0x2070, 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A,
+    0xD94C, 0xD94C, 0x24AC, 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176,
+    0xD94F, 0xD94F, 0x24AD, 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B,
+    0xD952, 0xD952, 0x1F45, 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B,
+    0xD955, 0xD955, 0x202F, 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0,
+    0xD958, 0xD958, 0x4B8C, 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F,
+    0xD95B, 0xD95B, 0x4B8D, 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E,
+    0xD963, 0xD963, 0x24B2, 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51,
+    0xD966, 0xD966, 0x4B94, 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95,
+    0xD96C, 0xD96C, 0x24B3, 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F,
+    0xD96F, 0xD96F, 0x4B9A, 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B,
+    0xD972, 0xD972, 0x20B4, 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB,
+    0xD975, 0xD975, 0x2072, 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C,
+    0xD978, 0xD978, 0x1F0A, 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D,
+    0xD97C, 0xD97C, 0x2291, 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278,
+    0xD980, 0xD980, 0x1ED4, 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3,
+    0xD988, 0xD98C, 0x4BA5, 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7,
+    0xD98F, 0xD98F, 0x1F28, 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7,
+    0xD992, 0xD996, 0x4BAA, 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1,
+    0xD999, 0xD99A, 0x4BAF, 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1,
+    0xD99D, 0xD99D, 0x225B, 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2,
+    0xD9A0, 0xD9A0, 0x2115, 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3,
+    0xDA41, 0xDA41, 0x222A, 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4,
+    0xDA48, 0xDA48, 0x213D, 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15,
+    0xDA4E, 0xDA4E, 0x225C, 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14,
+    0xDA74, 0xDA76, 0x4BE1, 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4,
+    0xDA80, 0xDA84, 0x4BEB, 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0,
+    0xDA8E, 0xDA8E, 0x25F8, 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313,
+    0xDB40, 0xDB5F, 0x4C0A, 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A,
+    0xDB78, 0xDB78, 0x2230, 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47,
+    0xDB84, 0xDB84, 0x25FD, 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600,
+    0xDB8C, 0xDB97, 0x4C51, 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D,
+    0xDBA1, 0xDBFE, 0x1371, 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF,
+    0xDC46, 0xDC4E, 0x4C6A, 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C,
+    0xDC51, 0xDC51, 0x2602, 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D,
+    0xDC54, 0xDC54, 0x4C74, 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE,
+    0xDC57, 0xDC57, 0x2603, 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601,
+    0xDC5E, 0xDC61, 0x4C7A, 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E,
+    0xDC66, 0xDC66, 0x1EA3, 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81,
+    0xDC6B, 0xDC6B, 0x2607, 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0,
+    0xDC7D, 0xDC7E, 0x4C94, 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B,
+    0xDC88, 0xDC88, 0x2267, 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6,
+    0xDC8B, 0xDC8D, 0x4C9D, 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0,
+    0xDC90, 0xDC90, 0x248C, 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D,
+    0xDC98, 0xDC9A, 0x4CA7, 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA,
+    0xDCA0, 0xDCA0, 0x2494, 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE,
+    0xDD46, 0xDD46, 0x2493, 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E,
+    0xDD4E, 0xDD52, 0x4CBA, 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491,
+    0xDD55, 0xDD55, 0x2496, 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492,
+    0xDD58, 0xDD58, 0x4CBF, 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0,
+    0xDD5E, 0xDD5E, 0x1FB1, 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A,
+    0xDD61, 0xDD61, 0x4CC5, 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6,
+    0xDD64, 0xDD64, 0x2258, 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7,
+    0xDD6D, 0xDD6D, 0x249B, 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09,
+    0xDD70, 0xDD70, 0x20E6, 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026,
+    0xDD77, 0xDD77, 0x249F, 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D,
+    0xDD7B, 0xDD7E, 0x4CD4, 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B,
+    0xDD82, 0xDD82, 0x249C, 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A,
+    0xDD86, 0xDD86, 0x205B, 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70,
+    0xDD8C, 0xDD8E, 0x4CDF, 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2,
+    0xDD94, 0xDD94, 0x213B, 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07,
+    0xDD98, 0xDD99, 0x4CE8, 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237,
+    0xDD9C, 0xDD9D, 0x4CEA, 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC,
+    0xDDA0, 0xDDA0, 0x21B3, 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245,
+    0xDE41, 0xDE41, 0x24A1, 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8,
+    0xDE45, 0xDE47, 0x4CEF, 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0,
+    0xDE4A, 0xDE4E, 0x4CF2, 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7,
+    0xDE5A, 0xDE5A, 0x1F46, 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380,
+    0xDE5D, 0xDE5D, 0x2495, 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490,
+    0xDE60, 0xDE6A, 0x4D03, 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E,
+    0xDE6F, 0xDE6F, 0x1E9D, 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A,
+    0xDE72, 0xDE72, 0x20AA, 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D,
+    0xDE92, 0xDE92, 0x267B, 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2,
+    0xDEA0, 0xDEA0, 0x4D3B, 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E,
+    0xDF41, 0xDF41, 0x4D3C, 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D,
+    0xDF4D, 0xDF4D, 0x1FBB, 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253,
+    0xDF5D, 0xDF5D, 0x4D55, 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6,
+    0xDF60, 0xDF60, 0x218E, 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC,
+    0xDF65, 0xDF65, 0x4D59, 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A,
+    0xDF68, 0xDF68, 0x224A, 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133,
+    0xDF6E, 0xDF73, 0x4D5F, 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65,
+    0xDF77, 0xDF77, 0x20CF, 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67,
+    0xDF7A, 0xDF7A, 0x220F, 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029,
+    0xDF7D, 0xDF7D, 0x4D69, 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55,
+    0xDF81, 0xDF82, 0x4D6A, 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C,
+    0xDF85, 0xDF85, 0x1E46, 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063,
+    0xDF8A, 0xDF8A, 0x23F3, 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9,
+    0xE040, 0xE04F, 0x4D86, 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96,
+    0xE05D, 0xE05D, 0x2233, 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320,
+    0xE06A, 0xE06B, 0x4DAD, 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF,
+    0xE075, 0xE075, 0x22BC, 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C,
+    0xE078, 0xE078, 0x4DB8, 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9,
+    0xE080, 0xE086, 0x4DBE, 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5,
+    0xE08D, 0xE08D, 0x2287, 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D,
+    0xE090, 0xE090, 0x1EAB, 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D,
+    0xE093, 0xE093, 0x4DCC, 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD,
+    0xE097, 0xE097, 0x231B, 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547,
+    0xE140, 0xE141, 0x4DD8, 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA,
+    0xE164, 0xE164, 0x2255, 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F,
+    0xE169, 0xE173, 0x4DFE, 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4,
+    0xE176, 0xE17E, 0x4E09, 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B,
+    0xE185, 0xE185, 0x21D8, 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA,
+    0xE188, 0xE188, 0x4E17, 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18,
+    0xE18C, 0xE18C, 0x2134, 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3,
+    0xE191, 0xE191, 0x24F8, 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7,
+    0xE194, 0xE194, 0x1EC8, 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C,
+    0xE198, 0xE198, 0x2280, 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5,
+    0xE19F, 0xE19F, 0x24FB, 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5,
+    0xE240, 0xE240, 0x4E24, 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25,
+    0xE243, 0xE243, 0x1EED, 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD,
+    0xE250, 0xE250, 0x4E31, 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32,
+    0xE253, 0xE253, 0x24FE, 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33,
+    0xE25A, 0xE25A, 0x2508, 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38,
+    0xE25E, 0xE25E, 0x2506, 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF,
+    0xE263, 0xE263, 0x2090, 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD,
+    0xE268, 0xE268, 0x1F25, 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503,
+    0xE26B, 0xE26B, 0x2502, 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A,
+    0xE26F, 0xE26F, 0x20A6, 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5,
+    0xE279, 0xE27C, 0x4E4B, 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F,
+    0xE280, 0xE280, 0x2507, 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505,
+    0xE283, 0xE288, 0x4E50, 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56,
+    0xE28B, 0xE28B, 0x2515, 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C,
+    0xE28F, 0xE28F, 0x2031, 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B,
+    0xE293, 0xE293, 0x250F, 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509,
+    0xE296, 0xE297, 0x4E5B, 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234,
+    0xE29A, 0xE29A, 0x2513, 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D,
+    0xE2A0, 0xE2A0, 0x2501, 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61,
+    0xE342, 0xE342, 0x2517, 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63,
+    0xE347, 0xE347, 0x2518, 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56,
+    0xE34C, 0xE34E, 0x4E69, 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C,
+    0xE351, 0xE351, 0x20D3, 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A,
+    0xE355, 0xE355, 0x20CE, 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510,
+    0xE359, 0xE35B, 0x4E71, 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74,
+    0xE360, 0xE360, 0x250A, 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511,
+    0xE368, 0xE370, 0x4E7C, 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85,
+    0xE373, 0xE373, 0x251E, 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86,
+    0xE378, 0xE378, 0x252D, 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89,
+    0xE37C, 0xE37C, 0x2532, 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B,
+    0xE380, 0xE389, 0x4E8C, 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96,
+    0xE38C, 0xE38C, 0x252C, 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528,
+    0xE390, 0xE390, 0x4E99, 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A,
+    0xE393, 0xE393, 0x252F, 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC,
+    0xE396, 0xE398, 0x4E9C, 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F,
+    0xE39C, 0xE39C, 0x2535, 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D,
+    0xE39F, 0xE39F, 0x2526, 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661,
+    0xE440, 0xE440, 0x2534, 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F,
+    0xE443, 0xE443, 0x2531, 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3,
+    0xE448, 0xE448, 0x2525, 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD,
+    0xE44F, 0xE44F, 0x4EAB, 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC,
+    0xE452, 0xE452, 0x2172, 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD,
+    0xE458, 0xE458, 0x204F, 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543,
+    0xE45B, 0xE45B, 0x4EB2, 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3,
+    0xE45E, 0xE45E, 0x1E3C, 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529,
+    0xE463, 0xE464, 0x4EB7, 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9,
+    0xE468, 0xE468, 0x1EFF, 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F,
+    0xE474, 0xE474, 0x4EC5, 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6,
+    0xE479, 0xE479, 0x2523, 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A,
+    0xE47C, 0xE47C, 0x2545, 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D,
+    0xE480, 0xE480, 0x4ECA, 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB,
+    0xE484, 0xE484, 0x2103, 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C,
+    0xE487, 0xE487, 0x253B, 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD,
+    0xE48D, 0xE48D, 0x2540, 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD,
+    0xE490, 0xE492, 0x4ED2, 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5,
+    0xE498, 0xE498, 0x254B, 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547,
+    0xE49E, 0xE49F, 0x254F, 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF,
+    0xE540, 0xE545, 0x4EDE, 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4,
+    0xE548, 0xE548, 0x2546, 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C,
+    0xE54C, 0xE54D, 0x4EE7, 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552,
+    0xE550, 0xE550, 0x2530, 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9,
+    0xE555, 0xE555, 0x2551, 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC,
+    0xE558, 0xE558, 0x20D2, 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8,
+    0xE55D, 0xE55D, 0x4EF0, 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1,
+    0xE561, 0xE561, 0x21AB, 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D,
+    0xE565, 0xE565, 0x1EA5, 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C,
+    0xE569, 0xE569, 0x2080, 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D,
+    0xE56D, 0xE56D, 0x4EF9, 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA,
+    0xE575, 0xE575, 0x254A, 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00,
+    0xE578, 0xE578, 0x254E, 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC,
+    0xE57C, 0xE57C, 0x2554, 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05,
+    0xE581, 0xE581, 0x1F3C, 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5,
+    0xE584, 0xE589, 0x4F07, 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D,
+    0xE58E, 0xE58E, 0x2268, 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6,
+    0xE592, 0xE599, 0x4F12, 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553,
+    0xE59C, 0xE59E, 0x4F1A, 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D,
+    0xE5A1, 0xE5FE, 0x171D, 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E,
+    0xE644, 0xE644, 0x2559, 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97,
+    0xE64A, 0xE64A, 0x2555, 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D,
+    0xE64F, 0xE651, 0x4F28, 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B,
+    0xE656, 0xE656, 0x207C, 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A,
+    0xE659, 0xE65A, 0x4F2F, 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31,
+    0xE65E, 0xE65E, 0x1E34, 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E,
+    0xE66A, 0xE66A, 0x4F3D, 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E,
+    0xE675, 0xE675, 0x21A2, 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47,
+    0xE679, 0xE679, 0x2563, 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49,
+    0xE67C, 0xE67C, 0x252E, 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A,
+    0xE680, 0xE680, 0x1F1B, 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283,
+    0xE683, 0xE683, 0x4F4C, 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D,
+    0xE687, 0xE687, 0x20A0, 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565,
+    0xE68A, 0xE68B, 0x4F50, 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52,
+    0xE693, 0xE693, 0x2562, 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C,
+    0xE698, 0xE69A, 0x4F5B, 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020,
+    0xE69D, 0xE69E, 0x4F5E, 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A,
+    0xE6A1, 0xE6FE, 0x177B, 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E,
+    0xE744, 0xE747, 0x4F63, 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C,
+    0xE74A, 0xE74C, 0x4F67, 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B,
+    0xE750, 0xE750, 0x1E6F, 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4,
+    0xE753, 0xE753, 0x2567, 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B,
+    0xE756, 0xE758, 0x4F6C, 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F,
+    0xE766, 0xE766, 0x252B, 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571,
+    0xE769, 0xE769, 0x4F7C, 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D,
+    0xE774, 0xE774, 0x2522, 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533,
+    0xE77D, 0xE77E, 0x4F8D, 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A,
+    0xE783, 0xE783, 0x4F91, 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573,
+    0xE786, 0xE786, 0x256F, 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293,
+    0xE78B, 0xE78B, 0x2578, 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570,
+    0xE790, 0xE791, 0x4F98, 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A,
+    0xE798, 0xE799, 0x2541, 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F,
+    0xE7A0, 0xE7A0, 0x201A, 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4,
+    0xE843, 0xE843, 0x257A, 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7,
+    0xE846, 0xE846, 0x2177, 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B,
+    0xE84A, 0xE84A, 0x4FAA, 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB,
+    0xE84F, 0xE84F, 0x257B, 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3,
+    0xE855, 0xE859, 0x4FB2, 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7,
+    0xE85C, 0xE85C, 0x2566, 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93,
+    0xE863, 0xE863, 0x4FBD, 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE,
+    0xE870, 0xE870, 0x2514, 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D,
+    0xE874, 0xE874, 0x4FCB, 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC,
+    0xE87C, 0xE87C, 0x2574, 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E,
+    0xE881, 0xE881, 0x4FD4, 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5,
+    0xE887, 0xE887, 0x209F, 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576,
+    0xE88A, 0xE88B, 0x4FDA, 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF,
+    0xE88E, 0xE88E, 0x261C, 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC,
+    0xE8A1, 0xE8FE, 0x1837, 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75,
+    0xE94D, 0xE953, 0x4FF9, 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000,
+    0xE956, 0xE956, 0x23BF, 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001,
+    0xE95A, 0xE95A, 0x23C0, 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45,
+    0xE95E, 0xE95E, 0x5005, 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4,
+    0xE961, 0xE961, 0x5006, 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104,
+    0xE964, 0xE964, 0x5007, 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008,
+    0xE967, 0xE967, 0x1F87, 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009,
+    0xE96C, 0xE96C, 0x2269, 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43,
+    0xE976, 0xE976, 0x5014, 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679,
+    0xE979, 0xE979, 0x1EEB, 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35,
+    0xE97D, 0xE97D, 0x208A, 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7,
+    0xE981, 0xE981, 0x23C9, 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018,
+    0xE987, 0xE987, 0x224F, 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB,
+    0xE98C, 0xE98D, 0x501F, 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021,
+    0xE990, 0xE990, 0x21F7, 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE,
+    0xE993, 0xE993, 0x23CA, 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022,
+    0xE998, 0xE998, 0x23D0, 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C,
+    0xE99C, 0xE99C, 0x5027, 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028,
+    0xE99F, 0xE99F, 0x1FEE, 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895,
+    0xEA40, 0xEA40, 0x1FF8, 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3,
+    0xEA45, 0xEA47, 0x502C, 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4,
+    0xEA4A, 0xEA4A, 0x1E98, 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C,
+    0xEA51, 0xEA51, 0x5034, 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035,
+    0xEA55, 0xEA55, 0x1E71, 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037,
+    0xEA59, 0xEA59, 0x23C5, 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A,
+    0xEA81, 0xEA83, 0x505E, 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061,
+    0xEA87, 0xEA87, 0x2284, 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C,
+    0xEA8F, 0xEA8F, 0x5069, 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D,
+    0xEA92, 0xEA95, 0x506A, 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E,
+    0xEAA0, 0xEAA0, 0x1ED9, 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077,
+    0xEB41, 0xEB41, 0x1FB2, 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252,
+    0xEB46, 0xEB47, 0x507B, 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D,
+    0xEB53, 0xEB53, 0x2157, 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF,
+    0xEB56, 0xEB5A, 0x5088, 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D,
+    0xEB5D, 0xEB5D, 0x203D, 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015,
+    0xEB61, 0xEB61, 0x5090, 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091,
+    0xEB6D, 0xEB6D, 0x2156, 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144,
+    0xEB71, 0xEB71, 0x509D, 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257,
+    0xEB74, 0xEB77, 0x509E, 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092,
+    0xEB7A, 0xEB7E, 0x50A2, 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250,
+    0xEB86, 0xEB89, 0x50AC, 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0,
+    0xEBA1, 0xEBFE, 0x1951, 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8,
+    0xEC47, 0xEC55, 0x50CC, 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB,
+    0xEC5A, 0xEC5A, 0x260C, 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E,
+    0xEC5D, 0xEC5F, 0x50DF, 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2,
+    0xEC6E, 0xEC6E, 0x260B, 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3,
+    0xEC77, 0xEC7E, 0x50F6, 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23,
+    0xEC97, 0xECA0, 0x5114, 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E,
+    0xED46, 0xED46, 0x2695, 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E,
+    0xED59, 0xED5D, 0x5135, 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A,
+    0xED61, 0xED61, 0x2692, 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F,
+    0xED65, 0xED65, 0x513E, 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD,
+    0xED68, 0xED6D, 0x513F, 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145,
+    0xED74, 0xED74, 0x2465, 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467,
+    0xED78, 0xED78, 0x514C, 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D,
+    0xED80, 0xED90, 0x5152, 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163,
+    0xED93, 0xED93, 0x2209, 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9,
+    0xED96, 0xED96, 0x5164, 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146,
+    0xED99, 0xED99, 0x25C5, 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165,
+    0xED9C, 0xED9C, 0x245E, 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F,
+    0xED9F, 0xED9F, 0x5167, 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D,
+    0xEE40, 0xEE40, 0x25C7, 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A,
+    0xEE43, 0xEE43, 0x1E2F, 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168,
+    0xEE48, 0xEE48, 0x20BF, 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B,
+    0xEE4D, 0xEE4D, 0x25C9, 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8,
+    0xEE53, 0xEE54, 0x5172, 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174,
+    0xEE57, 0xEE57, 0x25CB, 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D,
+    0xEE5F, 0xEE60, 0x517B, 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D,
+    0xEE68, 0xEE68, 0x25CC, 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183,
+    0xEE6C, 0xEE6C, 0x20B9, 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181,
+    0xEE6F, 0xEE76, 0x5186, 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E,
+    0xEE7D, 0xEE7D, 0x2173, 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD,
+    0xEE81, 0xEE84, 0x5193, 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6,
+    0xEE87, 0xEE89, 0x5197, 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1,
+    0xEE8C, 0xEE8C, 0x519A, 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B,
+    0xEE90, 0xEE90, 0x2008, 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0,
+    0xEE95, 0xEE96, 0x51A0, 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2,
+    0xEE99, 0xEE99, 0x1F2A, 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72,
+    0xEE9E, 0xEE9E, 0x25D3, 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B,
+    0xEF40, 0xEF40, 0x21BE, 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044,
+    0xEF43, 0xEF43, 0x51A8, 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3,
+    0xEF46, 0xEF4B, 0x51A9, 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF,
+    0xEF52, 0xEF53, 0x24CC, 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698,
+    0xEF56, 0xEF56, 0x51B5, 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6,
+    0xEF5A, 0xEF5A, 0x24CE, 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF,
+    0xEF61, 0xEF67, 0x51BD, 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4,
+    0xEF6A, 0xEF6A, 0x24D0, 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1,
+    0xEF6D, 0xEF76, 0x51C6, 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0,
+    0xEF7A, 0xEF7A, 0x239B, 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E,
+    0xEF7D, 0xEF7E, 0x51D3, 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D,
+    0xEF83, 0xEF84, 0x239F, 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1,
+    0xEF87, 0xEF87, 0x51D8, 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9,
+    0xEF8B, 0xEF8B, 0x221E, 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2,
+    0xEF8E, 0xEF94, 0x51DC, 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36,
+    0xEF97, 0xEF97, 0x2135, 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD,
+    0xEF9D, 0xEF9D, 0x51E7, 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8,
+    0xEFA1, 0xEFFE, 0x1AC9, 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3,
+    0xF042, 0xF042, 0x2203, 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7,
+    0xF045, 0xF046, 0x51EC, 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097,
+    0xF049, 0xF049, 0x1EE4, 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238,
+    0xF04F, 0xF050, 0x51F2, 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4,
+    0xF054, 0xF054, 0x1F9A, 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3,
+    0xF058, 0xF05D, 0x51F8, 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE,
+    0xF068, 0xF068, 0x239C, 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6,
+    0xF06D, 0xF070, 0x520A, 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E,
+    0xF073, 0xF073, 0x2035, 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F,
+    0xF078, 0xF078, 0x23A8, 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075,
+    0xF07B, 0xF07C, 0x5213, 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB,
+    0xF081, 0xF081, 0x1FEB, 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215,
+    0xF087, 0xF087, 0x1F6A, 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219,
+    0xF08B, 0xF08B, 0x2666, 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667,
+    0xF091, 0xF091, 0x521F, 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220,
+    0xF096, 0xF096, 0x23AD, 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27,
+    0xF140, 0xF151, 0x522D, 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242,
+    0xF154, 0xF154, 0x1F02, 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183,
+    0xF158, 0xF158, 0x5241, 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9,
+    0xF15B, 0xF166, 0x5242, 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E,
+    0xF176, 0xF176, 0x22A5, 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA,
+    0xF179, 0xF179, 0x525C, 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82,
+    0xF17C, 0xF17D, 0x525D, 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404,
+    0xF181, 0xF181, 0x525F, 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260,
+    0xF184, 0xF184, 0x2184, 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403,
+    0xF187, 0xF187, 0x5262, 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B,
+    0xF18A, 0xF193, 0x5263, 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D,
+    0xF198, 0xF198, 0x2067, 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85,
+    0xF240, 0xF244, 0x5278, 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D,
+    0xF247, 0xF247, 0x1E83, 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F,
+    0xF24C, 0xF252, 0x5281, 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7,
+    0xF255, 0xF255, 0x240D, 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412,
+    0xF25D, 0xF25E, 0x528E, 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290,
+    0xF271, 0xF271, 0x23F0, 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411,
+    0xF274, 0xF274, 0x2414, 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170,
+    0xF277, 0xF27B, 0x52A3, 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C,
+    0xF27E, 0xF27E, 0x2415, 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066,
+    0xF286, 0xF286, 0x52AD, 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413,
+    0xF289, 0xF289, 0x2410, 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1,
+    0xF28D, 0xF290, 0x52AE, 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2,
+    0xF294, 0xF294, 0x2409, 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418,
+    0xF297, 0xF29B, 0x52B5, 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA,
+    0xF29E, 0xF29E, 0x21FC, 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3,
+    0xF340, 0xF340, 0x1FC1, 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD,
+    0xF345, 0xF345, 0x229C, 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E,
+    0xF349, 0xF349, 0x52C2, 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419,
+    0xF34C, 0xF34F, 0x52C3, 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7,
+    0xF361, 0xF361, 0x1E29, 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661,
+    0xF375, 0xF375, 0x52E9, 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174,
+    0xF378, 0xF378, 0x2663, 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA,
+    0xF380, 0xF38B, 0x52EF, 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB,
+    0xF3A0, 0xF3A0, 0x214C, 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E,
+    0xF445, 0xF445, 0x267A, 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0,
+    0xF451, 0xF456, 0x531D, 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323,
+    0xF459, 0xF459, 0x1ED0, 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096,
+    0xF45C, 0xF45C, 0x5325, 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326,
+    0xF462, 0xF462, 0x23C8, 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E,
+    0xF465, 0xF474, 0x532B, 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B,
+    0xF47C, 0xF47C, 0x2664, 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239,
+    0xF480, 0xF493, 0x5342, 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356,
+    0xF499, 0xF499, 0x261F, 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E,
+    0xF49D, 0xF4A0, 0x535C, 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360,
+    0xF545, 0xF545, 0x2620, 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621,
+    0xF548, 0xF551, 0x5366, 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370,
+    0xF554, 0xF554, 0x2627, 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625,
+    0xF557, 0xF55D, 0x5371, 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378,
+    0xF561, 0xF561, 0x262E, 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A,
+    0xF56E, 0xF56E, 0x262A, 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385,
+    0xF571, 0xF571, 0x2628, 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386,
+    0xF580, 0xF584, 0x5392, 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630,
+    0xF587, 0xF58B, 0x5397, 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C,
+    0xF58E, 0xF58E, 0x200D, 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D,
+    0xF599, 0xF599, 0x2645, 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A,
+    0xF59C, 0xF59F, 0x53A7, 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD,
+    0xF640, 0xF640, 0x53AB, 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC,
+    0xF645, 0xF645, 0x263D, 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF,
+    0xF648, 0xF648, 0x263E, 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F,
+    0xF64C, 0xF64C, 0x1FC0, 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B,
+    0xF650, 0xF653, 0x53B3, 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7,
+    0xF658, 0xF658, 0x2644, 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639,
+    0xF662, 0xF662, 0x53C2, 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3,
+    0xF66C, 0xF66C, 0x2647, 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB,
+    0xF671, 0xF671, 0x2649, 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648,
+    0xF675, 0xF675, 0x53D0, 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108,
+    0xF678, 0xF67E, 0x53D1, 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D,
+    0xF686, 0xF687, 0x53DD, 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF,
+    0xF68A, 0xF68A, 0x2651, 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650,
+    0xF68E, 0xF68E, 0x2652, 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F,
+    0xF693, 0xF695, 0x53E5, 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E,
+    0xF698, 0xF698, 0x2653, 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657,
+    0xF69B, 0xF69B, 0x53E9, 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA,
+    0xF69E, 0xF69E, 0x2633, 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656,
+    0xF6A1, 0xF6FE, 0x1D5B, 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654,
+    0xF743, 0xF748, 0x53EE, 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4,
+    0xF74C, 0xF74C, 0x2655, 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6,
+    0xF756, 0xF756, 0x265B, 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A,
+    0xF759, 0xF759, 0x53FF, 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E,
+    0xF75C, 0xF75C, 0x262F, 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646,
+    0xF762, 0xF762, 0x5404, 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405,
+    0xF76B, 0xF76B, 0x265C, 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C,
+    0xF772, 0xF77B, 0x5411, 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B,
+    0xF77E, 0xF77E, 0x2631, 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9,
+    0xF840, 0xF841, 0x543D, 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F,
+    0xF846, 0xF846, 0x2580, 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC,
+    0xF84A, 0xF84F, 0x5444, 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B,
+    0xF852, 0xF852, 0x544A, 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B,
+    0xF863, 0xF863, 0x2583, 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A,
+    0xF866, 0xF866, 0x21EE, 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182,
+    0xF873, 0xF877, 0x5466, 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B,
+    0xF87A, 0xF87A, 0x2587, 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588,
+    0xF87D, 0xF87E, 0x546D, 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584,
+    0xF882, 0xF883, 0x5470, 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472,
+    0xF886, 0xF886, 0x21EF, 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A,
+    0xF88E, 0xF88E, 0x258C, 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47,
+    0xF89A, 0xF89C, 0x5483, 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486,
+    0xF8A0, 0xF8A0, 0x258D, 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0,
+    0xF94F, 0xF94F, 0x2592, 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496,
+    0xF959, 0xF959, 0x2594, 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E,
+    0xF95D, 0xF95D, 0x2591, 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0,
+    0xF967, 0xF967, 0x2597, 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6,
+    0xF96A, 0xF96B, 0x54A9, 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB,
+    0xF96F, 0xF96F, 0x20F6, 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC,
+    0xF985, 0xF985, 0x2585, 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599,
+    0xF988, 0xF990, 0x54C2, 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB,
+    0xF996, 0xF996, 0x259A, 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B,
+    0xF999, 0xF9A0, 0x54D0, 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D,
+    0xFA43, 0xFA45, 0x54DA, 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD,
+    0xFA4C, 0xFA4C, 0x234C, 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44,
+    0xFA52, 0xFA57, 0x54E6, 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0,
+    0xFA5A, 0xFA5C, 0x54EC, 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF,
+    0xFA5F, 0xFA5F, 0x259F, 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C,
+    0xFA62, 0xFA6F, 0x54F1, 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF,
+    0xFA74, 0xFA74, 0x20AE, 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B,
+    0xFA77, 0xFA77, 0x25A3, 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A,
+    0xFA83, 0xFA83, 0x2589, 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D,
+    0xFA8D, 0xFA8D, 0x25A4, 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6,
+    0xFA91, 0xFA91, 0x2593, 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7,
+    0xFA97, 0xFA97, 0x2222, 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B,
+    0xFB40, 0xFB48, 0x5523, 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C,
+    0xFB52, 0xFB52, 0x2586, 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1,
+    0xFB58, 0xFB58, 0x25AA, 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590,
+    0xFB5B, 0xFB5B, 0x258E, 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688,
+    0xFB76, 0xFB78, 0x5552, 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB,
+    0xFB7B, 0xFB7B, 0x5555, 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4,
+    0xFB7E, 0xFB7E, 0x5556, 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F,
+    0xFB91, 0xFB9B, 0x5567, 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572,
+    0xFB9F, 0xFB9F, 0x25F7, 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575,
+    0xFC44, 0xFC44, 0x2696, 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F,
+    0xFC4A, 0xFC59, 0x557D, 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D,
+    0xFC63, 0xFC63, 0x1EC1, 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3,
+    0xFC69, 0xFC6E, 0x5599, 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F,
+    0xFC71, 0xFC71, 0x268A, 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669,
+    0xFC75, 0xFC76, 0x55A2, 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4,
+    0xFC80, 0xFC82, 0x55AA, 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD,
+    0xFC8A, 0xFC8A, 0x2673, 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9,
+    0xFD52, 0xFD52, 0x20C6, 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB,
+    0xFD57, 0xFD57, 0x24D3, 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE,
+    0xFD5A, 0xFD5A, 0x260F, 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611,
+    0xFD60, 0xFD61, 0x55E3, 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5,
+    0xFD65, 0xFD65, 0x2610, 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030,
+    0xFD68, 0xFD68, 0x55E7, 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8,
+    0xFD6C, 0xFD6C, 0x2614, 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616,
+    0xFD71, 0xFD71, 0x55ED, 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE,
+    0xFD78, 0xFD78, 0x20F2, 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617,
+    0xFD7E, 0xFD7E, 0x55F7, 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037,
+    0xFD89, 0xFD8A, 0x5600, 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602,
+    0xFD8F, 0xFD8F, 0x1F22, 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605,
+    0xFD94, 0xFD94, 0x1F34, 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02,
+    0xFD9E, 0xFD9E, 0x40D3, 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083,
+    0xFE40, 0xFE40, 0x1259, 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,
+};
+extern const unsigned short g_FXCMAP_GBK2K_H_5_DWord[1017 * 4] = {
+    0x8130, 0x8436, 0x8436, 0x5752, 0x8138, 0xFD38, 0xFD39, 0x579C, 0x8138, 0xFE30, 0xFE39, 0x579E,
+    0x8139, 0x8130, 0x8137, 0x57A8, 0x8139, 0x8139, 0x8139, 0x57B0, 0x8139, 0x8230, 0x8239, 0x57B1,
+    0x8139, 0x8330, 0x8339, 0x57BB, 0x8139, 0x8430, 0x8439, 0x57C5, 0x8139, 0x8530, 0x8539, 0x57CF,
+    0x8139, 0x8630, 0x8639, 0x57D9, 0x8139, 0x8730, 0x8739, 0x57E3, 0x8139, 0x8830, 0x8839, 0x57ED,
+    0x8139, 0x8930, 0x8939, 0x57F7, 0x8139, 0x8B32, 0x8B32, 0x1042, 0x8139, 0x8B33, 0x8B33, 0x1263,
+    0x8139, 0x8B34, 0x8B34, 0x1272, 0x8139, 0x8B35, 0x8B35, 0x1265, 0x8139, 0x8B36, 0x8B36, 0x1059,
+    0x8139, 0x8B37, 0x8B37, 0x2793, 0x8139, 0x8B38, 0x8B38, 0x063D, 0x8139, 0x8B39, 0x8B39, 0x1303,
+    0x8139, 0x8C30, 0x8C30, 0x0CA6, 0x8139, 0x8C31, 0x8C31, 0x0638, 0x8139, 0x8C32, 0x8C32, 0x0CC6,
+    0x8139, 0x8C33, 0x8C33, 0x03D6, 0x8139, 0x8C34, 0x8C34, 0x129D, 0x8139, 0x8C35, 0x8C35, 0x1314,
+    0x8139, 0x8C36, 0x8C36, 0x130F, 0x8139, 0x8C37, 0x8C37, 0x082B, 0x8139, 0x8C38, 0x8C38, 0x1399,
+    0x8139, 0x8C39, 0x8C39, 0x0597, 0x8139, 0x8D30, 0x8D30, 0x09EF, 0x8139, 0x8D31, 0x8D31, 0x12FC,
+    0x8139, 0x8D32, 0x8D32, 0x1266, 0x8139, 0x8D33, 0x8D33, 0x1284, 0x8139, 0x8D34, 0x8D34, 0x2A1A,
+    0x8139, 0x8D35, 0x8D35, 0x0D45, 0x8139, 0x8D36, 0x8D36, 0x047E, 0x8139, 0x8D37, 0x8D37, 0x1352,
+    0x8139, 0x8D38, 0x8D38, 0x04CC, 0x8139, 0x8D39, 0x8D39, 0x139C, 0x8139, 0x8E30, 0x8E30, 0x10BB,
+    0x8139, 0x8E31, 0x8E31, 0x0967, 0x8139, 0x8E32, 0x8E32, 0x1593, 0x8139, 0x8E33, 0x8E33, 0x0E72,
+    0x8139, 0x8E34, 0x8E34, 0x0D56, 0x8139, 0x8E35, 0x8E35, 0x161C, 0x8139, 0x8E36, 0x8E36, 0x2D2D,
+    0x8139, 0x8E37, 0x8E37, 0x0F13, 0x8139, 0x8E38, 0x8E38, 0x0576, 0x8139, 0x8E39, 0x8E39, 0x0B6F,
+    0x8139, 0x8F30, 0x8F30, 0x1230, 0x8139, 0x8F31, 0x8F31, 0x172E, 0x8139, 0x8F32, 0x8F32, 0x056A,
+    0x8139, 0x8F33, 0x8F33, 0x0F6C, 0x8139, 0x8F34, 0x8F34, 0x14B6, 0x8139, 0x8F35, 0x8F35, 0x0D43,
+    0x8139, 0x8F36, 0x8F36, 0x1774, 0x8139, 0x8F37, 0x8F37, 0x0CF6, 0x8139, 0x8F38, 0x8F38, 0x1815,
+    0x8139, 0x8F39, 0x8F39, 0x06FD, 0x8139, 0x9030, 0x9030, 0x082D, 0x8139, 0x9031, 0x9031, 0x08BE,
+    0x8139, 0x9032, 0x9032, 0x06C4, 0x8139, 0x9033, 0x9033, 0x1813, 0x8139, 0x9034, 0x9034, 0x073C,
+    0x8139, 0x9035, 0x9035, 0x1398, 0x8139, 0x9036, 0x9036, 0x14AD, 0x8139, 0x9037, 0x9037, 0x14F6,
+    0x8139, 0x9038, 0x9038, 0x0706, 0x8139, 0x9039, 0x9039, 0x1762, 0x8139, 0x9130, 0x9130, 0x15EE,
+    0x8139, 0x9131, 0x9131, 0x15E0, 0x8139, 0x9132, 0x9132, 0x0F8F, 0x8139, 0x9133, 0x9133, 0x06E5,
+    0x8139, 0x9134, 0x9134, 0x3292, 0x8139, 0x9135, 0x9135, 0x0D6D, 0x8139, 0x9136, 0x9136, 0x11A6,
+    0x8139, 0x9137, 0x9137, 0x1909, 0x8139, 0x9138, 0x9138, 0x0ED3, 0x8139, 0x9139, 0x9139, 0x05F6,
+    0x8139, 0x9230, 0x9230, 0x08C0, 0x8139, 0x9231, 0x9231, 0x065A, 0x8139, 0x9232, 0x9232, 0x0EED,
+    0x8139, 0x9233, 0x9233, 0x0CB0, 0x8139, 0x9234, 0x9234, 0x10FE, 0x8139, 0x9235, 0x9235, 0x1105,
+    0x8139, 0x9236, 0x9236, 0x0B21, 0x8139, 0x9237, 0x9237, 0x0C34, 0x8139, 0x9238, 0x9238, 0x11B8,
+    0x8139, 0x9239, 0x9239, 0x0578, 0x8139, 0x9330, 0x9330, 0x19BD, 0x8139, 0x9331, 0x9331, 0x0EF2,
+    0x8139, 0x9332, 0x9332, 0x0431, 0x8139, 0x9333, 0x9333, 0x0AB0, 0x8139, 0x9334, 0x9334, 0x0D66,
+    0x8139, 0x9335, 0x9335, 0x0C17, 0x8139, 0x9336, 0x9336, 0x0DA3, 0x8139, 0x9337, 0x9337, 0x0805,
+    0x8139, 0x9338, 0x9338, 0x1203, 0x8139, 0x9339, 0x9339, 0x06B3, 0x8139, 0x9430, 0x9430, 0x1269,
+    0x8139, 0x9431, 0x9431, 0x169D, 0x8139, 0x9432, 0x9432, 0x0BCB, 0x8139, 0x9433, 0x9433, 0x0FE9,
+    0x8139, 0x9434, 0x9434, 0x0B64, 0x8139, 0x9435, 0x9435, 0x0C89, 0x8139, 0x9436, 0x9436, 0x0FC9,
+    0x8139, 0x9437, 0x9437, 0x10D6, 0x8139, 0x9438, 0x9438, 0x0728, 0x8139, 0x9439, 0x9439, 0x0E90,
+    0x8139, 0x9530, 0x9530, 0x06C5, 0x8139, 0x9531, 0x9531, 0x0D33, 0x8139, 0x9532, 0x9532, 0x10A8,
+    0x8139, 0x9533, 0x9533, 0x0E42, 0x8139, 0x9534, 0x9534, 0x1BC6, 0x8139, 0x9535, 0x9535, 0x1B60,
+    0x8139, 0x9536, 0x9536, 0x3EBF, 0x8139, 0x9537, 0x9537, 0x03E2, 0x8139, 0x9538, 0x9538, 0x0BC3,
+    0x8139, 0x9539, 0x9539, 0x0AF8, 0x8139, 0x9630, 0x9630, 0x0B22, 0x8139, 0x9631, 0x9631, 0x0AB1,
+    0x8139, 0x9632, 0x9632, 0x0D4F, 0x8139, 0x9633, 0x9633, 0x0D46, 0x8139, 0x9634, 0x9634, 0x0D55,
+    0x8139, 0x9635, 0x9635, 0x40CB, 0x8139, 0x9636, 0x9636, 0x0783, 0x8139, 0x9637, 0x9637, 0x0FD1,
+    0x8139, 0x9638, 0x9638, 0x09EB, 0x8139, 0x9639, 0x9639, 0x11F0, 0x8139, 0x9730, 0x9730, 0x0ADC,
+    0x8139, 0x9731, 0x9731, 0x1CE7, 0x8139, 0x9732, 0x9732, 0x1C5E, 0x8139, 0x9733, 0x9733, 0x0EA9,
+    0x8139, 0x9734, 0x9734, 0x101B, 0x8139, 0x9735, 0x9735, 0x10D5, 0x8139, 0x9736, 0x9736, 0x09BA,
+    0x8139, 0x9737, 0x9737, 0x0637, 0x8139, 0x9738, 0x9738, 0x1BCB, 0x8139, 0x9739, 0x9739, 0x0639,
+    0x8139, 0x9830, 0x9830, 0x1A1E, 0x8139, 0x9831, 0x9831, 0x0CBD, 0x8139, 0x9832, 0x9832, 0x04E1,
+    0x8139, 0x9833, 0x9833, 0x1231, 0x8139, 0x9834, 0x9834, 0x11C0, 0x8139, 0x9835, 0x9835, 0x08F9,
+    0x8139, 0x9836, 0x9836, 0x0D19, 0x8139, 0x9837, 0x9837, 0x1618, 0x8139, 0x9838, 0x9838, 0x11DA,
+    0x8139, 0x9839, 0x9839, 0x1CDC, 0x8139, 0x9930, 0x9930, 0x0CE4, 0x8139, 0x9931, 0x9931, 0x45A2,
+    0x8139, 0x9932, 0x9932, 0x1BF0, 0x8139, 0x9933, 0x9933, 0x050B, 0x8139, 0x9934, 0x9934, 0x0FD3,
+    0x8139, 0x9935, 0x9935, 0x0F9B, 0x8139, 0x9936, 0x9936, 0x1049, 0x8139, 0x9937, 0x9937, 0x49DC,
+    0x8139, 0x9938, 0x9938, 0x1F96, 0x8139, 0x9939, 0x9939, 0x0898, 0x8139, 0x9A30, 0x9A30, 0x0FFD,
+    0x8139, 0x9A31, 0x9A31, 0x0721, 0x8139, 0x9A32, 0x9A32, 0x05F8, 0x8139, 0x9A33, 0x9A33, 0x1D15,
+    0x8139, 0x9A34, 0x9A34, 0x1D50, 0x8139, 0x9A35, 0x9A35, 0x1E3B, 0x8139, 0x9A36, 0x9A36, 0x0505,
+    0x8139, 0x9A37, 0x9A37, 0x123C, 0x8139, 0x9A38, 0x9A38, 0x1240, 0x8139, 0x9A39, 0x9A39, 0x0D26,
+    0x8139, 0x9B30, 0x9B30, 0x1E7B, 0x8139, 0x9B31, 0x9B31, 0x0F8C, 0x8139, 0x9B32, 0x9B32, 0x04E2,
+    0x8139, 0x9B33, 0x9B33, 0x4D13, 0x8139, 0x9B34, 0x9B34, 0x105F, 0x8139, 0x9B35, 0x9B35, 0x10B4,
+    0x8139, 0x9B36, 0x9B36, 0x4E18, 0x8139, 0x9B37, 0x9B37, 0x09DA, 0x8139, 0x9B38, 0x9B38, 0x08C1,
+    0x8139, 0x9B39, 0x9B39, 0x1E75, 0x8139, 0x9C30, 0x9C30, 0x207D, 0x8139, 0x9C31, 0x9C31, 0x06B2,
+    0x8139, 0x9C32, 0x9C32, 0x09EE, 0x8139, 0x9C33, 0x9C33, 0x1D79, 0x8139, 0x9C34, 0x9C34, 0x10CF,
+    0x8139, 0x9C35, 0x9C35, 0x50EA, 0x8139, 0x9C36, 0x9C36, 0x0664, 0x8139, 0x9C37, 0x9C37, 0x0AEB,
+    0x8139, 0x9C38, 0x9C38, 0x06EA, 0x8139, 0x9C39, 0x9C39, 0x218D, 0x8139, 0x9D30, 0x9D30, 0x08F1,
+    0x8139, 0x9D31, 0x9D31, 0x107B, 0x8139, 0x9D32, 0x9D32, 0x2209, 0x8139, 0x9D33, 0x9D33, 0x1F00,
+    0x8139, 0x9D34, 0x9D34, 0x1EF4, 0x8139, 0x9D35, 0x9D35, 0x0D4A, 0x8139, 0x9D36, 0x9D36, 0x0D6E,
+    0x8139, 0x9D37, 0x9D37, 0x0F50, 0x8139, 0x9D38, 0x9D38, 0x206D, 0x8139, 0x9D39, 0x9D39, 0x0720,
+    0x8139, 0x9E30, 0x9E30, 0x06DA, 0x8139, 0x9E31, 0x9E31, 0x1DEC, 0x8139, 0x9E32, 0x9E32, 0x1ED0,
+    0x8139, 0x9E33, 0x9E33, 0x139B, 0x8139, 0x9E34, 0x9E34, 0x1260, 0x8139, 0x9E35, 0x9E35, 0x0746,
+    0x8139, 0x9E36, 0x9E36, 0x2239, 0x8139, 0x9E37, 0x9E37, 0x209C, 0x8139, 0x9E38, 0x9E38, 0x2688,
+    0x8139, 0x9E39, 0x9E39, 0x0A60, 0x8139, 0x9F30, 0x9F30, 0x2071, 0x8139, 0x9F31, 0x9F31, 0x0A90,
+    0x8139, 0x9F32, 0x9F32, 0x5586, 0x8139, 0x9F33, 0x9F33, 0x0D89, 0x8139, 0x9F34, 0x9F34, 0x0791,
+    0x8139, 0x9F35, 0x9F35, 0x1A55, 0x8139, 0x9F36, 0x9F36, 0x2618, 0x8139, 0x9F37, 0x9F37, 0x05E5,
+    0x8139, 0x9F38, 0x9F38, 0x071D, 0x8139, 0x9F39, 0x9F39, 0x0D8A, 0x8139, 0xA030, 0xA030, 0x0430,
+    0x8139, 0xA031, 0xA031, 0x20C6, 0x8139, 0xA032, 0xA032, 0x1E86, 0x8139, 0xA033, 0xA033, 0x2037,
+    0x8139, 0xA034, 0xA034, 0x1F34, 0x8139, 0xA035, 0xA035, 0x12F3, 0x8139, 0xA533, 0xA535, 0x577B,
+    0x8139, 0xA538, 0xA539, 0x577E, 0x8139, 0xA630, 0xA630, 0x5780, 0x8139, 0xA634, 0xA634, 0x5755,
+    0x8139, 0xA636, 0xA636, 0x5767, 0x8139, 0xA735, 0xA735, 0x5776, 0x8139, 0xA736, 0xA736, 0x5778,
+    0x8139, 0xA737, 0xA737, 0x5777, 0x8139, 0xA738, 0xA738, 0x5779, 0x8139, 0xA836, 0xA838, 0x5781,
+    0x8139, 0xB434, 0xB439, 0x5784, 0x8139, 0xB530, 0xB539, 0x578A, 0x8139, 0xB630, 0xB637, 0x5794,
+    0x8139, 0xEE39, 0xEE39, 0x5801, 0x8139, 0xEF30, 0xEF39, 0x5802, 0x8139, 0xF030, 0xF039, 0x580C,
+    0x8139, 0xF130, 0xF139, 0x5816, 0x8139, 0xF230, 0xF239, 0x5820, 0x8139, 0xF330, 0xF339, 0x582A,
+    0x8139, 0xF430, 0xF439, 0x5834, 0x8139, 0xF530, 0xF539, 0x583E, 0x8139, 0xF630, 0xF639, 0x5848,
+    0x8139, 0xF730, 0xF739, 0x5852, 0x8139, 0xF830, 0xF839, 0x585C, 0x8139, 0xF930, 0xF939, 0x5866,
+    0x8139, 0xFA30, 0xFA39, 0x5870, 0x8139, 0xFB30, 0xFB39, 0x587A, 0x8139, 0xFC30, 0xFC39, 0x5884,
+    0x8139, 0xFD30, 0xFD39, 0x588E, 0x8139, 0xFE30, 0xFE39, 0x5898, 0x8230, 0x8130, 0x8139, 0x58A2,
+    0x8230, 0x8230, 0x8239, 0x58AC, 0x8230, 0x8330, 0x8339, 0x58B6, 0x8230, 0x8430, 0x8439, 0x58C0,
+    0x8230, 0x8530, 0x8539, 0x58CA, 0x8230, 0x8630, 0x8639, 0x58D4, 0x8230, 0x8730, 0x8739, 0x58DE,
+    0x8230, 0x8830, 0x8839, 0x58E8, 0x8230, 0x8930, 0x8939, 0x58F2, 0x8230, 0x8A30, 0x8A39, 0x58FC,
+    0x8230, 0x8B30, 0x8B39, 0x5906, 0x8230, 0x8C30, 0x8C39, 0x5910, 0x8230, 0x8D30, 0x8D39, 0x591A,
+    0x8230, 0x8E30, 0x8E39, 0x5924, 0x8230, 0x8F30, 0x8F39, 0x592E, 0x8230, 0x9030, 0x9039, 0x5938,
+    0x8230, 0x9130, 0x9139, 0x5942, 0x8230, 0x9230, 0x9239, 0x594C, 0x8230, 0x9330, 0x9339, 0x5956,
+    0x8230, 0x9430, 0x9439, 0x5960, 0x8230, 0x9530, 0x9539, 0x596A, 0x8230, 0x9630, 0x9639, 0x5974,
+    0x8230, 0x9730, 0x9739, 0x597E, 0x8230, 0x9830, 0x9839, 0x5988, 0x8230, 0x9930, 0x9939, 0x5992,
+    0x8230, 0x9A30, 0x9A39, 0x599C, 0x8230, 0x9B30, 0x9B39, 0x59A6, 0x8230, 0x9C30, 0x9C39, 0x59B0,
+    0x8230, 0x9D30, 0x9D39, 0x59BA, 0x8230, 0x9E30, 0x9E39, 0x59C4, 0x8230, 0x9F30, 0x9F39, 0x59CE,
+    0x8230, 0xA030, 0xA039, 0x59D8, 0x8230, 0xA130, 0xA139, 0x59E2, 0x8230, 0xA230, 0xA239, 0x59EC,
+    0x8230, 0xA330, 0xA339, 0x59F6, 0x8230, 0xA430, 0xA439, 0x5A00, 0x8230, 0xA530, 0xA539, 0x5A0A,
+    0x8230, 0xA630, 0xA639, 0x5A14, 0x8230, 0xA730, 0xA739, 0x5A1E, 0x8230, 0xA830, 0xA839, 0x5A28,
+    0x8230, 0xA930, 0xA939, 0x5A32, 0x8230, 0xAA30, 0xAA39, 0x5A3C, 0x8230, 0xAB30, 0xAB39, 0x5A46,
+    0x8230, 0xAC30, 0xAC39, 0x5A50, 0x8230, 0xAD30, 0xAD39, 0x5A5A, 0x8230, 0xAE30, 0xAE39, 0x5A64,
+    0x8230, 0xAF30, 0xAF39, 0x5A6E, 0x8230, 0xB030, 0xB039, 0x5A78, 0x8230, 0xB130, 0xB139, 0x5A82,
+    0x8230, 0xB230, 0xB239, 0x5A8C, 0x8230, 0xB330, 0xB339, 0x5A96, 0x8230, 0xB430, 0xB439, 0x5AA0,
+    0x8230, 0xB530, 0xB539, 0x5AAA, 0x8230, 0xB630, 0xB639, 0x5AB4, 0x8230, 0xB730, 0xB739, 0x5ABE,
+    0x8230, 0xB830, 0xB839, 0x5AC8, 0x8230, 0xB930, 0xB939, 0x5AD2, 0x8230, 0xBA30, 0xBA39, 0x5ADC,
+    0x8230, 0xBB30, 0xBB39, 0x5AE6, 0x8230, 0xBC30, 0xBC39, 0x5AF0, 0x8230, 0xBD30, 0xBD39, 0x5AFA,
+    0x8230, 0xBE30, 0xBE39, 0x5B04, 0x8230, 0xBF30, 0xBF39, 0x5B0E, 0x8230, 0xC030, 0xC039, 0x5B18,
+    0x8230, 0xC130, 0xC139, 0x5B22, 0x8230, 0xC230, 0xC239, 0x5B2C, 0x8230, 0xC330, 0xC339, 0x5B36,
+    0x8230, 0xC430, 0xC439, 0x5B40, 0x8230, 0xC530, 0xC539, 0x5B4A, 0x8230, 0xC630, 0xC639, 0x5B54,
+    0x8230, 0xC730, 0xC739, 0x5B5E, 0x8230, 0xC830, 0xC839, 0x5B68, 0x8230, 0xC930, 0xC939, 0x5B72,
+    0x8230, 0xCA30, 0xCA39, 0x5B7C, 0x8230, 0xCB30, 0xCB39, 0x5B86, 0x8230, 0xCC30, 0xCC39, 0x5B90,
+    0x8230, 0xCD30, 0xCD39, 0x5B9A, 0x8230, 0xCE30, 0xCE39, 0x5BA4, 0x8230, 0xCF30, 0xCF39, 0x5BAE,
+    0x8230, 0xD030, 0xD039, 0x5BB8, 0x8230, 0xD130, 0xD139, 0x5BC2, 0x8230, 0xD230, 0xD239, 0x5BCC,
+    0x8230, 0xD330, 0xD339, 0x5BD6, 0x8230, 0xD430, 0xD439, 0x5BE0, 0x8230, 0xD530, 0xD539, 0x5BEA,
+    0x8230, 0xD630, 0xD639, 0x5BF4, 0x8230, 0xD730, 0xD739, 0x5BFE, 0x8230, 0xD830, 0xD839, 0x5C08,
+    0x8230, 0xD930, 0xD939, 0x5C12, 0x8230, 0xDA30, 0xDA39, 0x5C1C, 0x8230, 0xDB30, 0xDB39, 0x5C26,
+    0x8230, 0xDC30, 0xDC39, 0x5C30, 0x8230, 0xDD30, 0xDD39, 0x5C3A, 0x8230, 0xDE30, 0xDE39, 0x5C44,
+    0x8230, 0xDF30, 0xDF39, 0x5C4E, 0x8230, 0xE030, 0xE039, 0x5C58, 0x8230, 0xE130, 0xE139, 0x5C62,
+    0x8230, 0xE230, 0xE239, 0x5C6C, 0x8230, 0xE330, 0xE339, 0x5C76, 0x8230, 0xE430, 0xE439, 0x5C80,
+    0x8230, 0xE530, 0xE539, 0x5C8A, 0x8230, 0xE630, 0xE639, 0x5C94, 0x8230, 0xE730, 0xE739, 0x5C9E,
+    0x8230, 0xE830, 0xE839, 0x5CA8, 0x8230, 0xE930, 0xE939, 0x5CB2, 0x8230, 0xEA30, 0xEA39, 0x5CBC,
+    0x8230, 0xEB30, 0xEB39, 0x5CC6, 0x8230, 0xEC30, 0xEC39, 0x5CD0, 0x8230, 0xED30, 0xED39, 0x5CDA,
+    0x8230, 0xEE30, 0xEE39, 0x5CE4, 0x8230, 0xEF30, 0xEF39, 0x5CEE, 0x8230, 0xF030, 0xF039, 0x5CF8,
+    0x8230, 0xF130, 0xF139, 0x5D02, 0x8230, 0xF230, 0xF239, 0x5D0C, 0x8230, 0xF330, 0xF339, 0x5D16,
+    0x8230, 0xF430, 0xF439, 0x5D20, 0x8230, 0xF530, 0xF539, 0x5D2A, 0x8230, 0xF630, 0xF639, 0x5D34,
+    0x8230, 0xF730, 0xF739, 0x5D3E, 0x8230, 0xF830, 0xF839, 0x5D48, 0x8230, 0xF930, 0xF939, 0x5D52,
+    0x8230, 0xFA30, 0xFA39, 0x5D5C, 0x8230, 0xFB30, 0xFB39, 0x5D66, 0x8230, 0xFC30, 0xFC39, 0x5D70,
+    0x8230, 0xFD30, 0xFD39, 0x5D7A, 0x8230, 0xFE30, 0xFE39, 0x5D84, 0x8231, 0x8130, 0x8139, 0x5D8E,
+    0x8231, 0x8230, 0x8239, 0x5D98, 0x8231, 0x8330, 0x8339, 0x5DA2, 0x8231, 0x8430, 0x8439, 0x5DAC,
+    0x8231, 0x8530, 0x8539, 0x5DB6, 0x8231, 0x8630, 0x8639, 0x5DC0, 0x8231, 0x8730, 0x8739, 0x5DCA,
+    0x8231, 0x8830, 0x8839, 0x5DD4, 0x8231, 0x8930, 0x8939, 0x5DDE, 0x8231, 0x8A30, 0x8A39, 0x5DE8,
+    0x8231, 0x8B30, 0x8B39, 0x5DF2, 0x8231, 0x8C30, 0x8C39, 0x5DFC, 0x8231, 0x8D30, 0x8D39, 0x5E06,
+    0x8231, 0x8E30, 0x8E39, 0x5E10, 0x8231, 0x8F30, 0x8F39, 0x5E1A, 0x8231, 0x9030, 0x9039, 0x5E24,
+    0x8231, 0x9130, 0x9139, 0x5E2E, 0x8231, 0x9230, 0x9239, 0x5E38, 0x8231, 0x9330, 0x9339, 0x5E42,
+    0x8231, 0x9430, 0x9439, 0x5E4C, 0x8231, 0x9530, 0x9539, 0x5E56, 0x8231, 0x9630, 0x9639, 0x5E60,
+    0x8231, 0x9730, 0x9739, 0x5E6A, 0x8231, 0x9830, 0x9839, 0x5E74, 0x8231, 0x9930, 0x9939, 0x5E7E,
+    0x8231, 0x9A30, 0x9A39, 0x5E88, 0x8231, 0x9B30, 0x9B39, 0x5E92, 0x8231, 0x9C30, 0x9C39, 0x5E9C,
+    0x8231, 0x9D30, 0x9D39, 0x5EA6, 0x8231, 0x9E30, 0x9E39, 0x5EB0, 0x8231, 0x9F30, 0x9F39, 0x5EBA,
+    0x8231, 0xA030, 0xA039, 0x5EC4, 0x8231, 0xA130, 0xA139, 0x5ECE, 0x8231, 0xA230, 0xA239, 0x5ED8,
+    0x8231, 0xA330, 0xA339, 0x5EE2, 0x8231, 0xA430, 0xA439, 0x5EEC, 0x8231, 0xA530, 0xA539, 0x5EF6,
+    0x8231, 0xA630, 0xA639, 0x5F00, 0x8231, 0xA730, 0xA739, 0x5F0A, 0x8231, 0xA830, 0xA839, 0x5F14,
+    0x8231, 0xA930, 0xA939, 0x5F1E, 0x8231, 0xAA30, 0xAA39, 0x5F28, 0x8231, 0xAB30, 0xAB39, 0x5F32,
+    0x8231, 0xAC30, 0xAC39, 0x5F3C, 0x8231, 0xAD30, 0xAD39, 0x5F46, 0x8231, 0xAE30, 0xAE39, 0x5F50,
+    0x8231, 0xAF30, 0xAF39, 0x5F5A, 0x8231, 0xB030, 0xB039, 0x5F64, 0x8231, 0xB130, 0xB139, 0x5F6E,
+    0x8231, 0xB230, 0xB239, 0x5F78, 0x8231, 0xB330, 0xB339, 0x5F82, 0x8231, 0xB430, 0xB439, 0x5F8C,
+    0x8231, 0xB530, 0xB539, 0x5F96, 0x8231, 0xB630, 0xB639, 0x5FA0, 0x8231, 0xB730, 0xB739, 0x5FAA,
+    0x8231, 0xB830, 0xB839, 0x5FB4, 0x8231, 0xB930, 0xB939, 0x5FBE, 0x8231, 0xBA30, 0xBA39, 0x5FC8,
+    0x8231, 0xBB30, 0xBB39, 0x5FD2, 0x8231, 0xBC30, 0xBC39, 0x5FDC, 0x8231, 0xBD30, 0xBD39, 0x5FE6,
+    0x8231, 0xBE30, 0xBE39, 0x5FF0, 0x8231, 0xBF30, 0xBF39, 0x5FFA, 0x8231, 0xC030, 0xC039, 0x6004,
+    0x8231, 0xC130, 0xC139, 0x600E, 0x8231, 0xC230, 0xC239, 0x6018, 0x8231, 0xC330, 0xC339, 0x6022,
+    0x8231, 0xC430, 0xC439, 0x602C, 0x8231, 0xC530, 0xC539, 0x6036, 0x8231, 0xC630, 0xC639, 0x6040,
+    0x8231, 0xC730, 0xC739, 0x604A, 0x8231, 0xC830, 0xC839, 0x6054, 0x8231, 0xC930, 0xC939, 0x605E,
+    0x8231, 0xCA30, 0xCA39, 0x6068, 0x8231, 0xCB30, 0xCB39, 0x6072, 0x8231, 0xCC30, 0xCC39, 0x607C,
+    0x8231, 0xCD30, 0xCD39, 0x6086, 0x8231, 0xCE30, 0xCE39, 0x6090, 0x8231, 0xCF30, 0xCF39, 0x609A,
+    0x8231, 0xD030, 0xD039, 0x60A4, 0x8231, 0xD130, 0xD139, 0x60AE, 0x8231, 0xD230, 0xD239, 0x60B8,
+    0x8231, 0xD330, 0xD339, 0x60C2, 0x8231, 0xD430, 0xD439, 0x60CC, 0x8231, 0xD530, 0xD539, 0x60D6,
+    0x8231, 0xD630, 0xD639, 0x60E0, 0x8231, 0xD730, 0xD739, 0x60EA, 0x8231, 0xD830, 0xD839, 0x60F4,
+    0x8231, 0xD930, 0xD939, 0x60FE, 0x8231, 0xDA30, 0xDA39, 0x6108, 0x8231, 0xDB30, 0xDB39, 0x6112,
+    0x8231, 0xDC30, 0xDC39, 0x611C, 0x8231, 0xDD30, 0xDD39, 0x6126, 0x8231, 0xDE30, 0xDE39, 0x6130,
+    0x8231, 0xDF30, 0xDF39, 0x613A, 0x8231, 0xE030, 0xE039, 0x6144, 0x8231, 0xE130, 0xE139, 0x614E,
+    0x8231, 0xE230, 0xE239, 0x6158, 0x8231, 0xE330, 0xE339, 0x6162, 0x8231, 0xE430, 0xE439, 0x616C,
+    0x8231, 0xE530, 0xE539, 0x6176, 0x8231, 0xE630, 0xE639, 0x6180, 0x8231, 0xE730, 0xE739, 0x618A,
+    0x8231, 0xE830, 0xE839, 0x6194, 0x8231, 0xE930, 0xE939, 0x619E, 0x8231, 0xEA30, 0xEA39, 0x61A8,
+    0x8231, 0xEB30, 0xEB39, 0x61B2, 0x8231, 0xEC30, 0xEC39, 0x61BC, 0x8231, 0xED30, 0xED39, 0x61C6,
+    0x8231, 0xEE30, 0xEE39, 0x61D0, 0x8231, 0xEF30, 0xEF39, 0x61DA, 0x8231, 0xF030, 0xF039, 0x61E4,
+    0x8231, 0xF130, 0xF139, 0x61EE, 0x8231, 0xF230, 0xF239, 0x61F8, 0x8231, 0xF330, 0xF339, 0x6202,
+    0x8231, 0xF430, 0xF439, 0x620C, 0x8231, 0xF530, 0xF539, 0x6216, 0x8231, 0xF630, 0xF639, 0x6220,
+    0x8231, 0xF730, 0xF739, 0x622A, 0x8231, 0xF830, 0xF839, 0x6234, 0x8231, 0xF930, 0xF939, 0x623E,
+    0x8231, 0xFA30, 0xFA39, 0x6248, 0x8231, 0xFB30, 0xFB39, 0x6252, 0x8231, 0xFC30, 0xFC39, 0x625C,
+    0x8231, 0xFD30, 0xFD39, 0x6266, 0x8231, 0xFE30, 0xFE39, 0x6270, 0x8232, 0x8130, 0x8139, 0x627A,
+    0x8232, 0x8230, 0x8239, 0x6284, 0x8232, 0x8330, 0x8339, 0x628E, 0x8232, 0x8430, 0x8439, 0x6298,
+    0x8232, 0x8530, 0x8539, 0x62A2, 0x8232, 0x8630, 0x8639, 0x62AC, 0x8232, 0x8730, 0x8739, 0x62B6,
+    0x8232, 0x8830, 0x8839, 0x62C0, 0x8232, 0x8930, 0x8939, 0x62CA, 0x8232, 0x8A30, 0x8A39, 0x62D4,
+    0x8232, 0x8B30, 0x8B39, 0x62DE, 0x8232, 0x8C30, 0x8C39, 0x62E8, 0x8232, 0x8D30, 0x8D39, 0x62F2,
+    0x8232, 0x8E30, 0x8E39, 0x62FC, 0x8232, 0x8F30, 0x8F39, 0x6306, 0x8232, 0x9030, 0x9039, 0x6310,
+    0x8232, 0x9130, 0x9139, 0x631A, 0x8232, 0x9230, 0x9239, 0x6324, 0x8232, 0x9330, 0x9339, 0x632E,
+    0x8232, 0x9430, 0x9439, 0x6338, 0x8232, 0x9530, 0x9539, 0x6342, 0x8232, 0x9630, 0x9639, 0x634C,
+    0x8232, 0x9730, 0x9739, 0x6356, 0x8232, 0x9830, 0x9839, 0x6360, 0x8232, 0x9930, 0x9939, 0x636A,
+    0x8232, 0x9A30, 0x9A39, 0x6374, 0x8232, 0x9B30, 0x9B39, 0x637E, 0x8232, 0x9C30, 0x9C39, 0x6388,
+    0x8232, 0x9D30, 0x9D39, 0x6392, 0x8232, 0x9E30, 0x9E39, 0x639C, 0x8232, 0x9F30, 0x9F39, 0x63A6,
+    0x8232, 0xA030, 0xA039, 0x63B0, 0x8232, 0xA130, 0xA139, 0x63BA, 0x8232, 0xA230, 0xA239, 0x63C4,
+    0x8232, 0xA330, 0xA339, 0x63CE, 0x8232, 0xA430, 0xA439, 0x63D8, 0x8232, 0xA530, 0xA539, 0x63E2,
+    0x8232, 0xA630, 0xA639, 0x63EC, 0x8232, 0xA730, 0xA739, 0x63F6, 0x8232, 0xA830, 0xA839, 0x6400,
+    0x8232, 0xA930, 0xA939, 0x640A, 0x8232, 0xAA30, 0xAA39, 0x6414, 0x8232, 0xAB30, 0xAB39, 0x641E,
+    0x8232, 0xAC30, 0xAC39, 0x6428, 0x8232, 0xAD30, 0xAD39, 0x6432, 0x8232, 0xAE30, 0xAE39, 0x643C,
+    0x8232, 0xAF30, 0xAF39, 0x6446, 0x8232, 0xB030, 0xB039, 0x6450, 0x8232, 0xB130, 0xB139, 0x645A,
+    0x8232, 0xB230, 0xB239, 0x6464, 0x8232, 0xB330, 0xB339, 0x646E, 0x8232, 0xB430, 0xB439, 0x6478,
+    0x8232, 0xB530, 0xB539, 0x6482, 0x8232, 0xB630, 0xB639, 0x648C, 0x8232, 0xB730, 0xB739, 0x6496,
+    0x8232, 0xB830, 0xB839, 0x64A0, 0x8232, 0xB930, 0xB939, 0x64AA, 0x8232, 0xBA30, 0xBA39, 0x64B4,
+    0x8232, 0xBB30, 0xBB39, 0x64BE, 0x8232, 0xBC30, 0xBC39, 0x64C8, 0x8232, 0xBD30, 0xBD39, 0x64D2,
+    0x8232, 0xBE30, 0xBE39, 0x64DC, 0x8232, 0xBF30, 0xBF39, 0x64E6, 0x8232, 0xC030, 0xC039, 0x64F0,
+    0x8232, 0xC130, 0xC139, 0x64FA, 0x8232, 0xC230, 0xC239, 0x6504, 0x8232, 0xC330, 0xC339, 0x650E,
+    0x8232, 0xC430, 0xC439, 0x6518, 0x8232, 0xC530, 0xC539, 0x6522, 0x8232, 0xC630, 0xC639, 0x652C,
+    0x8232, 0xC730, 0xC739, 0x6536, 0x8232, 0xC830, 0xC839, 0x6540, 0x8232, 0xC930, 0xC939, 0x654A,
+    0x8232, 0xCA30, 0xCA39, 0x6554, 0x8232, 0xCB30, 0xCB39, 0x655E, 0x8232, 0xCC30, 0xCC39, 0x6568,
+    0x8232, 0xCD30, 0xCD39, 0x6572, 0x8232, 0xCE30, 0xCE39, 0x657C, 0x8232, 0xCF30, 0xCF39, 0x6586,
+    0x8232, 0xD030, 0xD039, 0x6590, 0x8232, 0xD130, 0xD139, 0x659A, 0x8232, 0xD230, 0xD239, 0x65A4,
+    0x8232, 0xD330, 0xD339, 0x65AE, 0x8232, 0xD430, 0xD439, 0x65B8, 0x8232, 0xD530, 0xD539, 0x65C2,
+    0x8232, 0xD630, 0xD639, 0x65CC, 0x8232, 0xD730, 0xD739, 0x65D6, 0x8232, 0xD830, 0xD839, 0x65E0,
+    0x8232, 0xD930, 0xD939, 0x65EA, 0x8232, 0xDA30, 0xDA39, 0x65F4, 0x8232, 0xDB30, 0xDB39, 0x65FE,
+    0x8232, 0xDC30, 0xDC39, 0x6608, 0x8232, 0xDD30, 0xDD39, 0x6612, 0x8232, 0xDE30, 0xDE39, 0x661C,
+    0x8232, 0xDF30, 0xDF39, 0x6626, 0x8232, 0xE030, 0xE039, 0x6630, 0x8232, 0xE130, 0xE139, 0x663A,
+    0x8232, 0xE230, 0xE239, 0x6644, 0x8232, 0xE330, 0xE339, 0x664E, 0x8232, 0xE430, 0xE439, 0x6658,
+    0x8232, 0xE530, 0xE539, 0x6662, 0x8232, 0xE630, 0xE639, 0x666C, 0x8232, 0xE730, 0xE739, 0x6676,
+    0x8232, 0xE830, 0xE839, 0x6680, 0x8232, 0xE930, 0xE939, 0x668A, 0x8232, 0xEA30, 0xEA39, 0x6694,
+    0x8232, 0xEB30, 0xEB39, 0x669E, 0x8232, 0xEC30, 0xEC39, 0x66A8, 0x8232, 0xED30, 0xED39, 0x66B2,
+    0x8232, 0xEE30, 0xEE39, 0x66BC, 0x8232, 0xEF30, 0xEF39, 0x66C6, 0x8232, 0xF030, 0xF039, 0x66D0,
+    0x8232, 0xF130, 0xF139, 0x66DA, 0x8232, 0xF230, 0xF239, 0x66E4, 0x8232, 0xF330, 0xF339, 0x66EE,
+    0x8232, 0xF430, 0xF439, 0x66F8, 0x8232, 0xF530, 0xF539, 0x6702, 0x8232, 0xF630, 0xF639, 0x670C,
+    0x8232, 0xF730, 0xF739, 0x6716, 0x8232, 0xF830, 0xF839, 0x6720, 0x8232, 0xF930, 0xF939, 0x672A,
+    0x8232, 0xFA30, 0xFA39, 0x6734, 0x8232, 0xFB30, 0xFB39, 0x673E, 0x8232, 0xFC30, 0xFC39, 0x6748,
+    0x8232, 0xFD30, 0xFD39, 0x6752, 0x8232, 0xFE30, 0xFE39, 0x675C, 0x8233, 0x8130, 0x8139, 0x6766,
+    0x8233, 0x8230, 0x8239, 0x6770, 0x8233, 0x8330, 0x8339, 0x677A, 0x8233, 0x8430, 0x8439, 0x6784,
+    0x8233, 0x8530, 0x8539, 0x678E, 0x8233, 0x8630, 0x8639, 0x6798, 0x8233, 0x8730, 0x8739, 0x67A2,
+    0x8233, 0x8830, 0x8839, 0x67AC, 0x8233, 0x8930, 0x8939, 0x67B6, 0x8233, 0x8A30, 0x8A39, 0x67C0,
+    0x8233, 0x8B30, 0x8B39, 0x67CA, 0x8233, 0x8C30, 0x8C39, 0x67D4, 0x8233, 0x8D30, 0x8D39, 0x67DE,
+    0x8233, 0x8E30, 0x8E39, 0x67E8, 0x8233, 0x8F30, 0x8F39, 0x67F2, 0x8233, 0x9030, 0x9039, 0x67FC,
+    0x8233, 0x9130, 0x9139, 0x6806, 0x8233, 0x9230, 0x9239, 0x6810, 0x8233, 0x9330, 0x9339, 0x681A,
+    0x8233, 0x9430, 0x9439, 0x6824, 0x8233, 0x9530, 0x9539, 0x682E, 0x8233, 0x9630, 0x9639, 0x6838,
+    0x8233, 0x9730, 0x9739, 0x6842, 0x8233, 0x9830, 0x9839, 0x684C, 0x8233, 0x9930, 0x9939, 0x6856,
+    0x8233, 0x9A30, 0x9A39, 0x6860, 0x8233, 0x9B30, 0x9B39, 0x686A, 0x8233, 0x9C30, 0x9C39, 0x6874,
+    0x8233, 0x9D30, 0x9D39, 0x687E, 0x8233, 0x9E30, 0x9E39, 0x6888, 0x8233, 0x9F30, 0x9F39, 0x6892,
+    0x8233, 0xA030, 0xA039, 0x689C, 0x8233, 0xA130, 0xA139, 0x68A6, 0x8233, 0xA230, 0xA239, 0x68B0,
+    0x8233, 0xA330, 0xA339, 0x68BA, 0x8233, 0xA430, 0xA439, 0x68C4, 0x8233, 0xA530, 0xA539, 0x68CE,
+    0x8233, 0xA630, 0xA639, 0x68D8, 0x8233, 0xA730, 0xA739, 0x68E2, 0x8233, 0xA830, 0xA839, 0x68EC,
+    0x8233, 0xA930, 0xA939, 0x68F6, 0x8233, 0xAA30, 0xAA39, 0x6900, 0x8233, 0xAB30, 0xAB39, 0x690A,
+    0x8233, 0xAC30, 0xAC39, 0x6914, 0x8233, 0xAD30, 0xAD39, 0x691E, 0x8233, 0xAE30, 0xAE39, 0x6928,
+    0x8233, 0xAF30, 0xAF39, 0x6932, 0x8233, 0xB030, 0xB039, 0x693C, 0x8233, 0xB130, 0xB139, 0x6946,
+    0x8233, 0xB230, 0xB239, 0x6950, 0x8233, 0xB330, 0xB339, 0x695A, 0x8233, 0xB430, 0xB439, 0x6964,
+    0x8233, 0xB530, 0xB539, 0x696E, 0x8233, 0xB630, 0xB639, 0x6978, 0x8233, 0xB730, 0xB739, 0x6982,
+    0x8233, 0xB830, 0xB839, 0x698C, 0x8233, 0xB930, 0xB939, 0x6996, 0x8233, 0xBA30, 0xBA39, 0x69A0,
+    0x8233, 0xBB30, 0xBB39, 0x69AA, 0x8233, 0xBC30, 0xBC39, 0x69B4, 0x8233, 0xBD30, 0xBD39, 0x69BE,
+    0x8233, 0xBE30, 0xBE39, 0x69C8, 0x8233, 0xBF30, 0xBF39, 0x69D2, 0x8233, 0xC030, 0xC039, 0x69DC,
+    0x8233, 0xC130, 0xC139, 0x69E6, 0x8233, 0xC230, 0xC239, 0x69F0, 0x8233, 0xC330, 0xC339, 0x69FA,
+    0x8233, 0xC430, 0xC439, 0x6A04, 0x8233, 0xC530, 0xC539, 0x6A0E, 0x8233, 0xC630, 0xC639, 0x6A18,
+    0x8233, 0xC730, 0xC739, 0x6A22, 0x8233, 0xC830, 0xC839, 0x6A2C, 0x8233, 0xC930, 0xC939, 0x6A36,
+    0x8233, 0xCA30, 0xCA39, 0x6A40, 0x8233, 0xCB30, 0xCB39, 0x6A4A, 0x8233, 0xCC30, 0xCC39, 0x6A54,
+    0x8233, 0xCD30, 0xCD39, 0x6A5E, 0x8233, 0xCE30, 0xCE39, 0x6A68, 0x8233, 0xCF30, 0xCF39, 0x6A72,
+    0x8233, 0xD030, 0xD039, 0x6A7C, 0x8233, 0xD130, 0xD139, 0x6A86, 0x8233, 0xD230, 0xD239, 0x6A90,
+    0x8233, 0xD330, 0xD339, 0x6A9A, 0x8233, 0xD430, 0xD439, 0x6AA4, 0x8233, 0xD530, 0xD539, 0x6AAE,
+    0x8233, 0xD630, 0xD639, 0x6AB8, 0x8233, 0xD730, 0xD739, 0x6AC2, 0x8233, 0xD830, 0xD839, 0x6ACC,
+    0x8233, 0xD930, 0xD939, 0x6AD6, 0x8233, 0xDA30, 0xDA39, 0x6AE0, 0x8233, 0xDB30, 0xDB39, 0x6AEA,
+    0x8233, 0xDC30, 0xDC39, 0x6AF4, 0x8233, 0xDD30, 0xDD39, 0x6AFE, 0x8233, 0xDE30, 0xDE39, 0x6B08,
+    0x8233, 0xDF30, 0xDF39, 0x6B12, 0x8233, 0xE030, 0xE039, 0x6B1C, 0x8233, 0xE130, 0xE139, 0x6B26,
+    0x8233, 0xE230, 0xE239, 0x6B30, 0x8233, 0xE330, 0xE339, 0x6B3A, 0x8233, 0xE430, 0xE439, 0x6B44,
+    0x8233, 0xE530, 0xE539, 0x6B4E, 0x8233, 0xE630, 0xE639, 0x6B58, 0x8233, 0xE730, 0xE739, 0x6B62,
+    0x8233, 0xE830, 0xE839, 0x6B6C, 0x8233, 0xE930, 0xE939, 0x6B76, 0x8233, 0xEA30, 0xEA39, 0x6B80,
+    0x8233, 0xEB30, 0xEB39, 0x6B8A, 0x8233, 0xEC30, 0xEC39, 0x6B94, 0x8233, 0xED30, 0xED39, 0x6B9E,
+    0x8233, 0xEE30, 0xEE39, 0x6BA8, 0x8233, 0xEF30, 0xEF39, 0x6BB2, 0x8233, 0xF030, 0xF039, 0x6BBC,
+    0x8233, 0xF130, 0xF139, 0x6BC6, 0x8233, 0xF230, 0xF239, 0x6BD0, 0x8233, 0xF330, 0xF339, 0x6BDA,
+    0x8233, 0xF430, 0xF439, 0x6BE4, 0x8233, 0xF530, 0xF539, 0x6BEE, 0x8233, 0xF630, 0xF639, 0x6BF8,
+    0x8233, 0xF730, 0xF739, 0x6C02, 0x8233, 0xF830, 0xF839, 0x6C0C, 0x8233, 0xF930, 0xF939, 0x6C16,
+    0x8233, 0xFA30, 0xFA39, 0x6C20, 0x8233, 0xFB30, 0xFB39, 0x6C2A, 0x8233, 0xFC30, 0xFC39, 0x6C34,
+    0x8233, 0xFD30, 0xFD39, 0x6C3E, 0x8233, 0xFE30, 0xFE39, 0x6C48, 0x8234, 0x8130, 0x8139, 0x6C52,
+    0x8234, 0x8230, 0x8239, 0x6C5C, 0x8234, 0x8330, 0x8339, 0x6C66, 0x8234, 0x8430, 0x8439, 0x6C70,
+    0x8234, 0x8530, 0x8539, 0x6C7A, 0x8234, 0x8630, 0x8639, 0x6C84, 0x8234, 0x8730, 0x8739, 0x6C8E,
+    0x8234, 0x8830, 0x8839, 0x6C98, 0x8234, 0x8930, 0x8939, 0x6CA2, 0x8234, 0x8A30, 0x8A39, 0x6CAC,
+    0x8234, 0x8B30, 0x8B39, 0x6CB6, 0x8234, 0x8C30, 0x8C39, 0x6CC0, 0x8234, 0x8D30, 0x8D39, 0x6CCA,
+    0x8234, 0x8E30, 0x8E39, 0x6CD4, 0x8234, 0x8F30, 0x8F39, 0x6CDE, 0x8234, 0x9030, 0x9039, 0x6CE8,
+    0x8234, 0x9130, 0x9139, 0x6CF2, 0x8234, 0x9230, 0x9239, 0x6CFC, 0x8234, 0x9330, 0x9339, 0x6D06,
+    0x8234, 0x9430, 0x9439, 0x6D10, 0x8234, 0x9530, 0x9539, 0x6D1A, 0x8234, 0x9630, 0x9639, 0x6D24,
+    0x8234, 0x9730, 0x9739, 0x6D2E, 0x8234, 0x9830, 0x9839, 0x6D38, 0x8234, 0x9930, 0x9939, 0x6D42,
+    0x8234, 0x9A30, 0x9A39, 0x6D4C, 0x8234, 0x9B30, 0x9B39, 0x6D56, 0x8234, 0x9C30, 0x9C39, 0x6D60,
+    0x8234, 0x9D30, 0x9D39, 0x6D6A, 0x8234, 0x9E30, 0x9E39, 0x6D74, 0x8234, 0x9F30, 0x9F39, 0x6D7E,
+    0x8234, 0xA030, 0xA039, 0x6D88, 0x8234, 0xA130, 0xA139, 0x6D92, 0x8234, 0xA230, 0xA239, 0x6D9C,
+    0x8234, 0xA330, 0xA339, 0x6DA6, 0x8234, 0xA430, 0xA439, 0x6DB0, 0x8234, 0xA530, 0xA539, 0x6DBA,
+    0x8234, 0xA630, 0xA639, 0x6DC4, 0x8234, 0xA730, 0xA739, 0x6DCE, 0x8234, 0xA830, 0xA839, 0x6DD8,
+    0x8234, 0xA930, 0xA939, 0x6DE2, 0x8234, 0xAA30, 0xAA39, 0x6DEC, 0x8234, 0xAB30, 0xAB39, 0x6DF6,
+    0x8234, 0xAC30, 0xAC39, 0x6E00, 0x8234, 0xAD30, 0xAD39, 0x6E0A, 0x8234, 0xAE30, 0xAE39, 0x6E14,
+    0x8234, 0xAF30, 0xAF39, 0x6E1E, 0x8234, 0xB030, 0xB039, 0x6E28, 0x8234, 0xB130, 0xB139, 0x6E32,
+    0x8234, 0xB230, 0xB239, 0x6E3C, 0x8234, 0xB330, 0xB339, 0x6E46, 0x8234, 0xB430, 0xB439, 0x6E50,
+    0x8234, 0xB530, 0xB539, 0x6E5A, 0x8234, 0xB630, 0xB639, 0x6E64, 0x8234, 0xB730, 0xB739, 0x6E6E,
+    0x8234, 0xB830, 0xB839, 0x6E78, 0x8234, 0xB930, 0xB939, 0x6E82, 0x8234, 0xBA30, 0xBA39, 0x6E8C,
+    0x8234, 0xBB30, 0xBB39, 0x6E96, 0x8234, 0xBC30, 0xBC39, 0x6EA0, 0x8234, 0xBD30, 0xBD39, 0x6EAA,
+    0x8234, 0xBE30, 0xBE39, 0x6EB4, 0x8234, 0xBF30, 0xBF39, 0x6EBE, 0x8234, 0xC030, 0xC039, 0x6EC8,
+    0x8234, 0xC130, 0xC139, 0x6ED2, 0x8234, 0xC230, 0xC239, 0x6EDC, 0x8234, 0xC330, 0xC339, 0x6EE6,
+    0x8234, 0xC430, 0xC439, 0x6EF0, 0x8234, 0xC530, 0xC539, 0x6EFA, 0x8234, 0xC630, 0xC639, 0x6F04,
+    0x8234, 0xC730, 0xC739, 0x6F0E, 0x8234, 0xC830, 0xC839, 0x6F18, 0x8234, 0xC930, 0xC939, 0x6F22,
+    0x8234, 0xCA30, 0xCA39, 0x6F2C, 0x8234, 0xCB30, 0xCB39, 0x6F36, 0x8234, 0xCC30, 0xCC39, 0x6F40,
+    0x8234, 0xCD30, 0xCD39, 0x6F4A, 0x8234, 0xCE30, 0xCE39, 0x6F54, 0x8234, 0xCF30, 0xCF39, 0x6F5E,
+    0x8234, 0xD030, 0xD039, 0x6F68, 0x8234, 0xD130, 0xD139, 0x6F72, 0x8234, 0xD230, 0xD239, 0x6F7C,
+    0x8234, 0xD330, 0xD339, 0x6F86, 0x8234, 0xD430, 0xD439, 0x6F90, 0x8234, 0xD530, 0xD539, 0x6F9A,
+    0x8234, 0xD630, 0xD639, 0x6FA4, 0x8234, 0xD730, 0xD739, 0x6FAE, 0x8234, 0xD830, 0xD839, 0x6FB8,
+    0x8234, 0xD930, 0xD939, 0x6FC2, 0x8234, 0xDA30, 0xDA39, 0x6FCC, 0x8234, 0xDB30, 0xDB39, 0x6FD6,
+    0x8234, 0xDC30, 0xDC39, 0x6FE0, 0x8234, 0xDD30, 0xDD39, 0x6FEA, 0x8234, 0xDE30, 0xDE39, 0x6FF4,
+    0x8234, 0xDF30, 0xDF39, 0x6FFE, 0x8234, 0xE030, 0xE039, 0x7008, 0x8234, 0xE130, 0xE139, 0x7012,
+    0x8234, 0xE230, 0xE239, 0x701C, 0x8234, 0xE330, 0xE339, 0x7026, 0x8234, 0xE430, 0xE439, 0x7030,
+    0x8234, 0xE530, 0xE539, 0x703A, 0x8234, 0xE630, 0xE639, 0x7044, 0x8234, 0xE730, 0xE739, 0x704E,
+    0x8234, 0xE830, 0xE839, 0x7058, 0x8234, 0xE930, 0xE939, 0x7062, 0x8234, 0xEA30, 0xEA39, 0x706C,
+    0x8234, 0xEB30, 0xEB39, 0x7076, 0x8234, 0xEC30, 0xEC39, 0x7080, 0x8234, 0xED30, 0xED39, 0x708A,
+    0x8234, 0xEE30, 0xEE39, 0x7094, 0x8234, 0xEF30, 0xEF39, 0x709E, 0x8234, 0xF030, 0xF039, 0x70A8,
+    0x8234, 0xF130, 0xF139, 0x70B2, 0x8234, 0xF230, 0xF239, 0x70BC, 0x8234, 0xF330, 0xF339, 0x70C6,
+    0x8234, 0xF430, 0xF439, 0x70D0, 0x8234, 0xF530, 0xF539, 0x70DA, 0x8234, 0xF630, 0xF639, 0x70E4,
+    0x8234, 0xF730, 0xF739, 0x70EE, 0x8234, 0xF830, 0xF839, 0x70F8, 0x8234, 0xF930, 0xF939, 0x7102,
+    0x8234, 0xFA30, 0xFA39, 0x710C, 0x8234, 0xFB30, 0xFB39, 0x7116, 0x8234, 0xFC30, 0xFC39, 0x7120,
+    0x8234, 0xFD30, 0xFD39, 0x712A, 0x8234, 0xFE30, 0xFE39, 0x7134, 0x8235, 0x8130, 0x8139, 0x713E,
+    0x8235, 0x8230, 0x8239, 0x7148, 0x8235, 0x8330, 0x8339, 0x7152, 0x8235, 0x8430, 0x8439, 0x715C,
+    0x8235, 0x8530, 0x8539, 0x7166, 0x8235, 0x8630, 0x8639, 0x7170, 0x8235, 0x8730, 0x8738, 0x717A,
+    0x8235, 0x9833, 0x9839, 0x7188, 0x8235, 0x9930, 0x9939, 0x718F, 0x8235, 0x9A30, 0x9A39, 0x7199,
+    0x8235, 0x9B30, 0x9B39, 0x71A3, 0x8235, 0x9C30, 0x9C39, 0x71AD, 0x8235, 0x9D30, 0x9D39, 0x71B7,
+    0x8235, 0x9E30, 0x9E39, 0x71C1, 0x8235, 0x9F30, 0x9F39, 0x71CB, 0x8235, 0xA030, 0xA039, 0x71D5,
+    0x8235, 0xA130, 0xA139, 0x71DF, 0x8235, 0xA230, 0xA239, 0x71E9, 0x8235, 0xA330, 0xA339, 0x71F3,
+    0x8235, 0xA430, 0xA439, 0x71FD, 0x8235, 0xA530, 0xA539, 0x7207, 0x8235, 0xA630, 0xA639, 0x7211,
+    0x8235, 0xA730, 0xA739, 0x721B, 0x8235, 0xA830, 0xA839, 0x7225, 0x8235, 0xA930, 0xA939, 0x722F,
+    0x8235, 0xAA30, 0xAA39, 0x7239, 0x8235, 0xAB30, 0xAB39, 0x7243, 0x8235, 0xAC30, 0xAC39, 0x724D,
+    0x8235, 0xAD30, 0xAD39, 0x7257, 0x8235, 0xAE30, 0xAE39, 0x7261, 0x8235, 0xAF30, 0xAF39, 0x726B,
+    0x8235, 0xB030, 0xB039, 0x7275, 0x8235, 0xB130, 0xB139, 0x727F, 0x8235, 0xB230, 0xB239, 0x7289,
+    0x8235, 0xB330, 0xB339, 0x7293, 0x8235, 0xB430, 0xB439, 0x729D, 0x8235, 0xB530, 0xB539, 0x72A7,
+    0x8235, 0xB630, 0xB639, 0x72B1, 0x8235, 0xB730, 0xB739, 0x72BB, 0x8235, 0xB830, 0xB839, 0x72C5,
+    0x8235, 0xB930, 0xB939, 0x72CF, 0x8235, 0xBA30, 0xBA39, 0x72D9, 0x8235, 0xBB30, 0xBB39, 0x72E3,
+    0x8235, 0xBC30, 0xBC39, 0x72ED, 0x8235, 0xBD30, 0xBD39, 0x72F7, 0x8235, 0xBE30, 0xBE39, 0x7301,
+    0x8235, 0xBF30, 0xBF39, 0x730B, 0x8235, 0xC030, 0xC039, 0x7315, 0x8235, 0xC130, 0xC139, 0x731F,
+    0x8235, 0xC230, 0xC239, 0x7329, 0x8235, 0xC330, 0xC339, 0x7333, 0x8235, 0xC430, 0xC439, 0x733D,
+    0x8235, 0xC530, 0xC539, 0x7347, 0x8235, 0xC630, 0xC639, 0x7351, 0x8235, 0xC730, 0xC739, 0x735B,
+    0x8235, 0xC830, 0xC839, 0x7365, 0x8235, 0xC930, 0xC939, 0x736F, 0x8235, 0xCA30, 0xCA39, 0x7379,
+    0x8235, 0xCB30, 0xCB39, 0x7383, 0x8235, 0xCC30, 0xCC39, 0x738D, 0x8235, 0xCD30, 0xCD39, 0x7397,
+    0x8235, 0xCE30, 0xCE39, 0x73A1, 0x8235, 0xCF30, 0xCF39, 0x73AB, 0x8235, 0xD030, 0xD039, 0x73B5,
+    0x8235, 0xD130, 0xD139, 0x73BF, 0x8235, 0xD230, 0xD239, 0x73C9, 0x8235, 0xD330, 0xD339, 0x73D3,
+    0x8235, 0xD430, 0xD439, 0x73DD, 0x8235, 0xD530, 0xD539, 0x73E7, 0x8235, 0xD630, 0xD639, 0x73F1,
+    0x8235, 0xD730, 0xD739, 0x73FB, 0x8235, 0xD830, 0xD839, 0x7405, 0x8235, 0xD930, 0xD939, 0x740F,
+    0x8235, 0xDA30, 0xDA39, 0x7419, 0x8235, 0xDB30, 0xDB39, 0x7423, 0x8235, 0xDC30, 0xDC39, 0x742D,
+    0x8235, 0xDD30, 0xDD39, 0x7437, 0x8235, 0xDE30, 0xDE39, 0x7441, 0x8235, 0xDF30, 0xDF39, 0x744B,
+    0x8235, 0xE030, 0xE039, 0x7455, 0x8235, 0xE130, 0xE139, 0x745F, 0x8235, 0xE230, 0xE239, 0x7469,
+    0x8235, 0xE330, 0xE339, 0x7473, 0x8235, 0xE430, 0xE439, 0x747D, 0x8235, 0xE530, 0xE539, 0x7487,
+    0x8235, 0xE630, 0xE639, 0x7491, 0x8235, 0xE730, 0xE739, 0x749B, 0x8235, 0xE830, 0xE839, 0x74A5,
+    0x8235, 0xE930, 0xE939, 0x74AF, 0x8235, 0xEA30, 0xEA39, 0x74B9, 0x8235, 0xEB30, 0xEB39, 0x74C3,
+    0x8235, 0xEC30, 0xEC39, 0x74CD, 0x8235, 0xED30, 0xED39, 0x74D7, 0x8235, 0xEE30, 0xEE39, 0x74E1,
+    0x8235, 0xEF30, 0xEF39, 0x74EB, 0x8235, 0xF030, 0xF039, 0x74F5, 0x8235, 0xF130, 0xF139, 0x74FF,
+    0x8235, 0xF230, 0xF239, 0x7509, 0x8235, 0xF330, 0xF339, 0x7513, 0x8235, 0xF430, 0xF439, 0x751D,
+    0x8235, 0xF530, 0xF539, 0x7527, 0x8235, 0xF630, 0xF639, 0x7531, 0x8235, 0xF730, 0xF739, 0x753B,
+    0x8235, 0xF830, 0xF839, 0x7545, 0x8235, 0xF930, 0xF939, 0x754F, 0x8235, 0xFA30, 0xFA39, 0x7559,
+    0x8235, 0xFB30, 0xFB39, 0x7563, 0x8235, 0xFC30, 0xFC39, 0x756D, 0x8235, 0xFD30, 0xFD39, 0x7577,
+    0x8235, 0xFE30, 0xFE39, 0x7581, 0x8236, 0x8130, 0x8139, 0x758B, 0x8236, 0x8230, 0x8239, 0x7595,
+    0x8236, 0x8330, 0x8339, 0x759F, 0x8236, 0x8430, 0x8439, 0x75A9, 0x8236, 0x8530, 0x8539, 0x75B3,
+    0x8236, 0x8630, 0x8639, 0x75BD, 0x8236, 0x8730, 0x8739, 0x75C7, 0x8236, 0x8830, 0x8839, 0x75D1,
+    0x8236, 0x8930, 0x8939, 0x75DB, 0x8236, 0x8A30, 0x8A39, 0x75E5, 0x8236, 0x8B30, 0x8B39, 0x75EF,
+    0x8236, 0x8C30, 0x8C39, 0x75F9, 0x8236, 0x8D30, 0x8D39, 0x7603, 0x8236, 0x8E30, 0x8E37, 0x760D,
+    0x8236, 0x8F31, 0x8F39, 0x7615, 0x8236, 0x9030, 0x9039, 0x761E, 0x8236, 0x9130, 0x9139, 0x7628,
+    0x8236, 0x9230, 0x9239, 0x7632, 0x8236, 0x9330, 0x9339, 0x763C, 0x8236, 0x9430, 0x9435, 0x7646,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-V_5.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-V_5.cpp
new file mode 100644
index 0000000..2fcd85b
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-V_5.cpp
@@ -0,0 +1,22 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBK2K_V_5[41 * 3] = {
+    0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,
+    0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,
+    0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,
+    0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,
+    0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,
+    0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,
+    0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F, 0xA4A1, 0xA4A1, 0x5757,
+    0xA4A3, 0xA4A3, 0x5759, 0xA4A5, 0xA4A5, 0x5762, 0xA4A7, 0xA4A7, 0x5758,
+    0xA4A9, 0xA4A9, 0x5760, 0xA4C3, 0xA4C3, 0x5761, 0xA4E3, 0xA4E3, 0x5764,
+    0xA4E5, 0xA4E5, 0x5766, 0xA4E7, 0xA4E7, 0x5765, 0xA4EE, 0xA4EE, 0x5763,
+    0xA5A1, 0xA5A1, 0x5768, 0xA5A3, 0xA5A3, 0x576A, 0xA5A5, 0xA5A5, 0x5771,
+    0xA5A7, 0xA5A7, 0x5769, 0xA5A9, 0xA5A9, 0x576F, 0xA5C3, 0xA5C3, 0x5770,
+    0xA5E3, 0xA5E3, 0x5773, 0xA5E5, 0xA5E5, 0x5775, 0xA5E7, 0xA5E7, 0x5774,
+    0xA5EE, 0xA5EE, 0x5772, 0xA960, 0xA960, 0x577A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp
new file mode 100644
index 0000000..ebb1659
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp
@@ -0,0 +1,1365 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_GBKp_EUC_H_2[4070 * 3] = {

+    0x0020, 0x007E, 0x0001, 0x8140, 0x8178, 0x2758, 0x8179, 0x8179, 0x2059,

+    0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796, 0x8186, 0x8186, 0x21F1,

+    0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2, 0x81EE, 0x81F5, 0x2802,

+    0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A, 0x8240, 0x8252, 0x2812,

+    0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825, 0x8262, 0x8262, 0x21B5,

+    0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC, 0x8275, 0x8279, 0x2844,

+    0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849, 0x827D, 0x827D, 0x1E62,

+    0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20, 0x8281, 0x8282, 0x284C,

+    0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E, 0x8290, 0x8290, 0x205C,

+    0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194, 0x82A6, 0x82C7, 0x286E,

+    0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281, 0x82CA, 0x82E0, 0x2890,

+    0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7, 0x82E3, 0x82E3, 0x210A,

+    0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8, 0x82ED, 0x82ED, 0x267F,

+    0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E, 0x82F3, 0x82F6, 0x28B4,

+    0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB, 0x82F9, 0x82F9, 0x226C,

+    0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117, 0x82FC, 0x82FE, 0x28B9,

+    0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8, 0x8342, 0x8344, 0x28BD,

+    0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0, 0x8348, 0x8348, 0x1FB9,

+    0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8, 0x834D, 0x8352, 0x28C5,

+    0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB, 0x8357, 0x8357, 0x20C2,

+    0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195, 0x835F, 0x8364, 0x28D4,

+    0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3, 0x8367, 0x8371, 0x28DA,

+    0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5, 0x8378, 0x8378, 0x2210,

+    0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF, 0x837B, 0x837B, 0x28EB,

+    0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC, 0x837E, 0x837E, 0x1FE4,

+    0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED, 0x8386, 0x8386, 0x22D6,

+    0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0, 0x838A, 0x838A, 0x22CE,

+    0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681, 0x838E, 0x8393, 0x28F6,

+    0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC, 0x839E, 0x839E, 0x2231,

+    0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93, 0x83A7, 0x83AA, 0x290C,

+    0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910, 0x83AE, 0x83AE, 0x22D7,

+    0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1, 0x83B1, 0x83B9, 0x2912,

+    0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B, 0x83C9, 0x83C9, 0x2025,

+    0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF, 0x83F7, 0x83FE, 0x2955,

+    0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9, 0x8451, 0x8470, 0x296D,

+    0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D, 0x8474, 0x8474, 0x2263,

+    0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683, 0x8478, 0x847E, 0x2991,

+    0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17, 0x8483, 0x848D, 0x299A,

+    0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5, 0x8492, 0x8492, 0x22CA,

+    0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8, 0x849D, 0x849D, 0x1F4F,

+    0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF, 0x84A2, 0x84A2, 0x2036,

+    0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4, 0x84A5, 0x84A5, 0x22C9,

+    0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5, 0x84A9, 0x84A9, 0x1F75,

+    0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE, 0x84C6, 0x84D2, 0x29D2,

+    0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF, 0x84D5, 0x84D5, 0x21A9,

+    0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6, 0x84D8, 0x84D8, 0x29E1,

+    0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003, 0x84DB, 0x84DC, 0x29E2,

+    0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4, 0x84EA, 0x84EA, 0x2323,

+    0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011, 0x84EF, 0x84F0, 0x29F3,

+    0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5, 0x8540, 0x8550, 0x2A02,

+    0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E, 0x8553, 0x8553, 0x2A13,

+    0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14, 0x855E, 0x855E, 0x20EF,

+    0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0, 0x8567, 0x857E, 0x2A24,

+    0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1, 0x8588, 0x858A, 0x2A43,

+    0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46, 0x8592, 0x8592, 0x21F9,

+    0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010, 0x8597, 0x8597, 0x2A4F,

+    0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50, 0x85A2, 0x85A2, 0x1E5A,

+    0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2, 0x85B3, 0x85FE, 0x2A68,

+    0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D, 0x864B, 0x8653, 0x2ABE,

+    0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7, 0x8668, 0x8668, 0x236C,

+    0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0, 0x8696, 0x8696, 0x219C,

+    0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9, 0x869A, 0x86A0, 0x2B08,

+    0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F, 0x86CA, 0x86CA, 0x210B,

+    0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE, 0x86CD, 0x86CD, 0x2B38,

+    0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39, 0x86D1, 0x86D1, 0x222C,

+    0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8, 0x86DD, 0x86DD, 0x22C0,

+    0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F, 0x86E2, 0x86E7, 0x2B48,

+    0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E, 0x86EE, 0x86EE, 0x2379,

+    0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372, 0x86F5, 0x86FE, 0x2B58,

+    0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62, 0x8744, 0x8744, 0x237C,

+    0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0, 0x874A, 0x874A, 0x2B69,

+    0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74, 0x874D, 0x874E, 0x2B6A,

+    0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C, 0x8757, 0x8757, 0x1F4C,

+    0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378, 0x875B, 0x875B, 0x21CF,

+    0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75, 0x875E, 0x875E, 0x2371,

+    0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369, 0x8761, 0x8765, 0x2B77,

+    0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C, 0x877A, 0x877A, 0x236F,

+    0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370, 0x877E, 0x877E, 0x2B91,

+    0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376, 0x8782, 0x8782, 0x2373,

+    0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F, 0x8787, 0x8787, 0x2B96,

+    0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97, 0x878A, 0x878A, 0x20B5,

+    0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB, 0x878E, 0x878E, 0x2672,

+    0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E, 0x8794, 0x8797, 0x2B9E,

+    0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2, 0x879D, 0x879D, 0x2375,

+    0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382, 0x87A4, 0x87A6, 0x2BAB,

+    0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE, 0x87B3, 0x87B3, 0x236B,

+    0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039, 0x87B6, 0x87BA, 0x2BBA,

+    0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF, 0x87BF, 0x87BF, 0x237D,

+    0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2, 0x87C2, 0x87C2, 0x2381,

+    0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B, 0x87CB, 0x87CB, 0x237E,

+    0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA, 0x87CF, 0x87CF, 0x22DB,

+    0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A, 0x87D3, 0x87D3, 0x2689,

+    0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697, 0x87D6, 0x87D9, 0x2BCF,

+    0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3, 0x87F7, 0x87F7, 0x2383,

+    0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF, 0x87FA, 0x87FA, 0x218F,

+    0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246, 0x8841, 0x8841, 0x2248,

+    0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E, 0x8845, 0x8845, 0x2BF6,

+    0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7, 0x8880, 0x88B9, 0x2C2F,

+    0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69, 0x88CC, 0x88CC, 0x228B,

+    0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85, 0x88D5, 0x88D6, 0x2C81,

+    0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83, 0x88DF, 0x88DF, 0x232C,

+    0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E, 0x88E6, 0x88F1, 0x2C8F,

+    0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38, 0x88F4, 0x88F5, 0x2C9B,

+    0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D, 0x8940, 0x894A, 0x2CA5,

+    0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339, 0x894D, 0x894D, 0x2CB0,

+    0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1, 0x8950, 0x8950, 0x232D,

+    0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F, 0x8955, 0x895C, 0x2CB5,

+    0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD, 0x895F, 0x895F, 0x232F,

+    0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D, 0x896E, 0x8970, 0x2CCB,

+    0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE, 0x897C, 0x897C, 0x1EC2,

+    0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA, 0x898B, 0x898B, 0x22B2,

+    0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF, 0x899A, 0x899D, 0x2CF2,

+    0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6, 0x89A6, 0x89A6, 0x20D9,

+    0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD, 0x89A9, 0x89AE, 0x2CFE,

+    0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04, 0x89BA, 0x89BA, 0x21ED,

+    0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007, 0x89BF, 0x89BF, 0x2326,

+    0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11, 0x89C4, 0x89C4, 0x1F52,

+    0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328, 0x89C7, 0x89C7, 0x2D14,

+    0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15, 0x89CE, 0x89CE, 0x1E2B,

+    0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE, 0x89D2, 0x89D7, 0x2D1C,

+    0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22, 0x89DB, 0x89DB, 0x2138,

+    0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081, 0x89F5, 0x89FE, 0x2D3C,

+    0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C, 0x8A42, 0x8A58, 0x2D47,

+    0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE, 0x8A5B, 0x8A5B, 0x2D5E,

+    0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F, 0x8A5E, 0x8A5E, 0x1EFA,

+    0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD, 0x8A7A, 0x8A7E, 0x2D7A,

+    0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F, 0x8AE5, 0x8AFE, 0x2DE3,

+    0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E, 0x8B45, 0x8B48, 0x2E01,

+    0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05, 0x8B7A, 0x8B7A, 0x23FC,

+    0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39, 0x8B8C, 0x8B8C, 0x2069,

+    0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7, 0x8B9F, 0x8BB2, 0x2E56,

+    0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A, 0x8BB9, 0x8BB9, 0x23FD,

+    0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8, 0x8BBF, 0x8BC5, 0x2E73,

+    0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A, 0x8BC8, 0x8BC8, 0x23FE,

+    0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B, 0x8BD4, 0x8BD4, 0x2401,

+    0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF, 0x8BDD, 0x8BE4, 0x2E8C,

+    0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94, 0x8BEB, 0x8BEB, 0x2221,

+    0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122, 0x8BF1, 0x8BFE, 0x2E9D,

+    0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB, 0x8C45, 0x8C4E, 0x2EAF,

+    0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9, 0x8C57, 0x8C57, 0x21E5,

+    0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057, 0x8C5D, 0x8C7E, 0x2EC4,

+    0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5, 0x8C8C, 0x8C8C, 0x2EF1,

+    0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3, 0x8C8F, 0x8C8F, 0x2121,

+    0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4, 0x8C92, 0x8C92, 0x1FE5,

+    0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A, 0x8C9A, 0x8C9A, 0x1E37,

+    0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E, 0x8CA3, 0x8CA3, 0x22A6,

+    0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00, 0x8CA6, 0x8CA6, 0x1EDA,

+    0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01, 0x8CC0, 0x8CC0, 0x235C,

+    0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050, 0x8CD3, 0x8CD3, 0x1E67,

+    0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4, 0x8CD6, 0x8CD8, 0x2F2B,

+    0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E, 0x8CF9, 0x8CF9, 0x1F16,

+    0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52, 0x8D73, 0x8D73, 0x2389,

+    0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7, 0x8D76, 0x8D7A, 0x2F86,

+    0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B, 0x8D80, 0x8D87, 0x2F8E,

+    0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96, 0x8D8F, 0x8D8F, 0x1F1A,

+    0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B, 0x8D9F, 0x8DB8, 0x2FAA,

+    0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4, 0x8DE2, 0x8DE2, 0x2391,

+    0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271, 0x8DE5, 0x8DE6, 0x2FED,

+    0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF, 0x8DF7, 0x8DF7, 0x238E,

+    0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D, 0x8E40, 0x8E45, 0x3004,

+    0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A, 0x8E56, 0x8E56, 0x2390,

+    0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033, 0x8E59, 0x8E59, 0x301A,

+    0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B, 0x8E68, 0x8E68, 0x1FE9,

+    0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055, 0x8E6F, 0x8E6F, 0x302D,

+    0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E, 0x8E80, 0x8E80, 0x2324,

+    0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143, 0x8E9C, 0x8E9E, 0x3056,

+    0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059, 0x8EA4, 0x8EA4, 0x2277,

+    0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7, 0x8EA8, 0x8EAB, 0x305F,

+    0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063, 0x8EAE, 0x8EAE, 0x2384,

+    0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387, 0x8EBE, 0x8EBE, 0x2386,

+    0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290, 0x8EC4, 0x8EC4, 0x3076,

+    0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077, 0x8ECD, 0x8ECD, 0x1E32,

+    0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E, 0x8ED6, 0x8ED6, 0x1F13,

+    0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085, 0x8EEC, 0x8EEC, 0x1FE0,

+    0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB, 0x8F52, 0x8F52, 0x2087,

+    0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE, 0x8F55, 0x8F55, 0x1EF6,

+    0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD, 0x8F5D, 0x8F5D, 0x2045,

+    0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178, 0x8F65, 0x8F7E, 0x30C9,

+    0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5, 0x8F87, 0x8F87, 0x30E9,

+    0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA, 0x8F95, 0x8F95, 0x266E,

+    0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0, 0x8F98, 0x8F9A, 0x30F7,

+    0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA, 0x8F9D, 0x8F9D, 0x2188,

+    0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C, 0x8FA2, 0x8FBC, 0x30FE,

+    0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119, 0x8FC4, 0x8FC4, 0x1EA1,

+    0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393, 0x8FC7, 0x8FCC, 0x3120,

+    0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126, 0x8FD8, 0x8FD8, 0x1E7C,

+    0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156, 0x9080, 0x909C, 0x3195,

+    0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E, 0x909F, 0x90B9, 0x31B2,

+    0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD, 0x90C0, 0x90C0, 0x2095,

+    0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2, 0x90C5, 0x90C5, 0x23B9,

+    0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28, 0x90DC, 0x90DC, 0x23BD,

+    0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5, 0x90EE, 0x90EF, 0x31FA,

+    0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC, 0x90F7, 0x90F7, 0x23B3,

+    0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209, 0x9142, 0x9142, 0x2162,

+    0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E, 0x914C, 0x914C, 0x3213,

+    0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214, 0x9151, 0x9151, 0x23B7,

+    0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F, 0x9155, 0x9155, 0x24DF,

+    0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2, 0x915A, 0x915A, 0x214E,

+    0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052, 0x915E, 0x9160, 0x321E,

+    0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221, 0x9163, 0x9163, 0x20EB,

+    0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232, 0x916F, 0x9175, 0x322C,

+    0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233, 0x917A, 0x917A, 0x201B,

+    0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE, 0x917D, 0x917E, 0x3236,

+    0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE, 0x9185, 0x918C, 0x323C,

+    0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244, 0x9191, 0x9191, 0x2089,

+    0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1, 0x9194, 0x9196, 0x3248,

+    0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B, 0x919B, 0x919B, 0x2214,

+    0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE, 0x91AA, 0x91AA, 0x2223,

+    0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B, 0x91BA, 0x91BA, 0x268C,

+    0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269, 0x91BF, 0x91BF, 0x24E0,

+    0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8, 0x91C4, 0x91CC, 0x326F,

+    0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278, 0x91D0, 0x91D0, 0x1FFE,

+    0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1, 0x91D3, 0x91D3, 0x327A,

+    0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B, 0x91D6, 0x91D6, 0x1FCE,

+    0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E, 0x91D9, 0x91D9, 0x2021,

+    0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1, 0x91E0, 0x91E1, 0x3282,

+    0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284, 0x91EA, 0x91EA, 0x24A4,

+    0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273, 0x91F1, 0x91F1, 0x3290,

+    0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291, 0x9240, 0x927E, 0x329D,

+    0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1, 0x92B7, 0x92CD, 0x3312,

+    0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329, 0x92D0, 0x92D0, 0x235D,

+    0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682, 0x92D5, 0x92DE, 0x332D,

+    0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A, 0x92E1, 0x92FD, 0x3337,

+    0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354, 0x9350, 0x9350, 0x21FF,

+    0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58, 0x935E, 0x936F, 0x3370,

+    0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382, 0x9376, 0x9376, 0x1EB6,

+    0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F, 0x938C, 0x938C, 0x20DB,

+    0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360, 0x939E, 0x93A4, 0x33AB,

+    0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2, 0x93A7, 0x93A7, 0x2040,

+    0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E, 0x93B5, 0x93B7, 0x33BF,

+    0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2, 0x93BB, 0x93BB, 0x235E,

+    0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A, 0x93BE, 0x93C5, 0x33C5,

+    0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD, 0x93CF, 0x93CF, 0x2093,

+    0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F, 0x93D8, 0x93DA, 0x33DC,

+    0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54, 0x93DD, 0x93E0, 0x33DF,

+    0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3, 0x93E4, 0x93E4, 0x20C0,

+    0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5, 0x93E9, 0x93E9, 0x2160,

+    0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D, 0x93EC, 0x93EC, 0x1F8E,

+    0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9, 0x93EF, 0x93EF, 0x2047,

+    0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262, 0x93F2, 0x93F3, 0x33EB,

+    0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2, 0x93F6, 0x93F9, 0x33ED,

+    0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1, 0x93FE, 0x93FE, 0x1FCC,

+    0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72, 0x9445, 0x944C, 0x33F8,

+    0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400, 0x9450, 0x9450, 0x1E52,

+    0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C, 0x9453, 0x9453, 0x228F,

+    0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED, 0x9456, 0x9457, 0x3403,

+    0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405, 0x945B, 0x945B, 0x1E2D,

+    0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366, 0x945E, 0x945E, 0x3407,

+    0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408, 0x9464, 0x9464, 0x2363,

+    0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A, 0x9467, 0x946D, 0x340D,

+    0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414, 0x9472, 0x9472, 0x1FF6,

+    0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364, 0x9475, 0x9475, 0x3418,

+    0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419, 0x9478, 0x9478, 0x2367,

+    0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D, 0x947B, 0x947E, 0x341B,

+    0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056, 0x9482, 0x9482, 0x2163,

+    0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9, 0x9488, 0x9488, 0x1FFC,

+    0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E, 0x94A2, 0x94B2, 0x343B,

+    0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C, 0x94B5, 0x94B5, 0x2142,

+    0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E, 0x94C0, 0x94C0, 0x1E43,

+    0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4, 0x94CD, 0x94D7, 0x3461,

+    0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C, 0x94E0, 0x94E0, 0x1ED7,

+    0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491, 0x9572, 0x9572, 0x212D,

+    0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF, 0x9583, 0x9583, 0x229B,

+    0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256, 0x959F, 0x959F, 0x24A8,

+    0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79, 0x95B4, 0x95B9, 0x34FF,

+    0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505, 0x95CF, 0x95CF, 0x24A7,

+    0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686, 0x95D2, 0x95D2, 0x24A6,

+    0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE, 0x95D5, 0x95E0, 0x351B,

+    0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527, 0x95E7, 0x95E7, 0x1FE7,

+    0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112, 0x95F2, 0x95F7, 0x3535,

+    0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B, 0x95FE, 0x95FE, 0x1F5C,

+    0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4, 0x9657, 0x967B, 0x3556,

+    0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B, 0x9680, 0x96FE, 0x357D,

+    0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A, 0x9768, 0x976B, 0x3623,

+    0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627, 0x976E, 0x976E, 0x246D,

+    0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638, 0x9796, 0x9796, 0x246B,

+    0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E, 0x979D, 0x979D, 0x1ECE,

+    0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272, 0x97A4, 0x97BE, 0x3658,

+    0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673, 0x97EE, 0x97EE, 0x21FE,

+    0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE, 0x97F8, 0x97FE, 0x36A9,

+    0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475, 0x9846, 0x9848, 0x36B5,

+    0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8, 0x984F, 0x984F, 0x1F6F,

+    0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468, 0x9872, 0x9872, 0x36DE,

+    0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF, 0x9880, 0x9880, 0x36EA,

+    0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB, 0x988B, 0x988B, 0x1F27,

+    0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4, 0x98A0, 0x98A0, 0x247C,

+    0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1, 0x98AB, 0x98B5, 0x3710,

+    0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005, 0x98B8, 0x98B9, 0x371B,

+    0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D, 0x98C7, 0x98C7, 0x203E,

+    0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C, 0x98CC, 0x98CF, 0x372C,

+    0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730, 0x98D3, 0x98D3, 0x2204,

+    0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3, 0x98E4, 0x98E4, 0x2140,

+    0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741, 0x98EF, 0x98EF, 0x2474,

+    0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD, 0x98F3, 0x98FE, 0x374C,

+    0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68, 0x9944, 0x9944, 0x375B,

+    0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C, 0x9966, 0x9966, 0x2472,

+    0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5, 0x996F, 0x9974, 0x3783,

+    0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789, 0x997A, 0x997A, 0x1F8B,

+    0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D, 0x9980, 0x9984, 0x3790,

+    0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795, 0x9989, 0x9989, 0x2482,

+    0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1, 0x998F, 0x9990, 0x379C,

+    0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E, 0x9999, 0x9999, 0x1F38,

+    0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485, 0x99AA, 0x99AF, 0x37B4,

+    0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E, 0x99B2, 0x99B2, 0x37BA,

+    0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486, 0x99B5, 0x99B5, 0x2471,

+    0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483, 0x99BE, 0x99BE, 0x2470,

+    0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469, 0x99C1, 0x99C1, 0x37C3,

+    0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4, 0x99C9, 0x99C9, 0x246F,

+    0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481, 0x99CF, 0x99D0, 0x37CE,

+    0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0, 0x99DA, 0x99DA, 0x1FF5,

+    0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4, 0x99E1, 0x99E4, 0x37DD,

+    0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1, 0x99E8, 0x99E8, 0x2479,

+    0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E, 0x99ED, 0x99F3, 0x37E6,

+    0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED, 0x9A40, 0x9A49, 0x37F7,

+    0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801, 0x9A57, 0x9A57, 0x20AD,

+    0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB, 0x9A66, 0x9A66, 0x381A,

+    0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B, 0x9A71, 0x9A71, 0x2159,

+    0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013, 0x9A77, 0x9A77, 0x1F33,

+    0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F, 0x9A88, 0x9A88, 0x1E5C,

+    0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488, 0x9A8D, 0x9A90, 0x383A,

+    0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E, 0x9A97, 0x9A97, 0x248A,

+    0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489, 0x9A9B, 0x9A9B, 0x248B,

+    0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83, 0x9A9F, 0x9AA1, 0x3847,

+    0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB, 0x9AA4, 0x9AA9, 0x384A,

+    0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850, 0x9AD0, 0x9AD0, 0x24C0,

+    0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D, 0x9AD7, 0x9AD9, 0x387A,

+    0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D, 0x9AE2, 0x9AE2, 0x20CA,

+    0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7, 0x9AE5, 0x9AE5, 0x24C2,

+    0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E, 0x9B80, 0x9BD0, 0x38DD,

+    0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E, 0x9BDC, 0x9BDC, 0x23DB,

+    0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A, 0x9C53, 0x9C53, 0x205E,

+    0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244, 0x9C5A, 0x9C5A, 0x23E2,

+    0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4, 0x9C5D, 0x9C74, 0x3973,

+    0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B, 0x9C79, 0x9C79, 0x1E66,

+    0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993, 0x9C86, 0x9C86, 0x1F63,

+    0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD, 0x9C9E, 0x9CAA, 0x39AF,

+    0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC, 0x9CCA, 0x9CCA, 0x22B5,

+    0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26, 0x9CD0, 0x9CE5, 0x39DE,

+    0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088, 0x9CE8, 0x9CEB, 0x39F4,

+    0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8, 0x9CEE, 0x9CEE, 0x2341,

+    0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B, 0x9CFC, 0x9CFD, 0x3A05,

+    0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07, 0x9D42, 0x9D42, 0x2124,

+    0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048, 0x9D47, 0x9D47, 0x23E0,

+    0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077, 0x9D4E, 0x9D4E, 0x3A11,

+    0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12, 0x9D61, 0x9D61, 0x20B1,

+    0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41, 0x9D69, 0x9D69, 0x201C,

+    0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8, 0x9D6F, 0x9D70, 0x3A2D,

+    0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F, 0x9D75, 0x9D75, 0x1F9B,

+    0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F, 0x9D7C, 0x9D7C, 0x3A37,

+    0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38, 0x9D80, 0x9D89, 0x3A39,

+    0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43, 0x9D8D, 0x9D8D, 0x1FB4,

+    0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7, 0x9D92, 0x9D98, 0x3A48,

+    0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F, 0x9DA1, 0x9DA1, 0x23E1,

+    0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56, 0x9DA7, 0x9DA7, 0x23EA,

+    0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3, 0x9DAD, 0x9DAD, 0x210E,

+    0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6, 0x9DB3, 0x9DB3, 0x2004,

+    0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D, 0x9DBF, 0x9DC5, 0x3A6C,

+    0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73, 0x9DC9, 0x9DC9, 0x2264,

+    0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2, 0x9DCE, 0x9DD1, 0x3A78,

+    0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C, 0x9DD5, 0x9DD5, 0x1EC4,

+    0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6, 0x9DE2, 0x9DE2, 0x20A9,

+    0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B, 0x9DF2, 0x9DF3, 0x3A97,

+    0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99, 0x9DF7, 0x9DF7, 0x268B,

+    0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76, 0x9DFB, 0x9DFC, 0x3A9D,

+    0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F, 0x9E40, 0x9E44, 0x3AA0,

+    0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5, 0x9E48, 0x9E48, 0x2191,

+    0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7, 0x9E52, 0x9E52, 0x1F9C,

+    0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA, 0x9E55, 0x9E55, 0x3AB0,

+    0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1, 0x9E5D, 0x9E5D, 0x23E9,

+    0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7, 0x9E61, 0x9E61, 0x21D5,

+    0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6, 0x9E64, 0x9E66, 0x3ABA,

+    0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD, 0x9E6C, 0x9E6C, 0x1E4F,

+    0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9, 0x9E70, 0x9E71, 0x3AC3,

+    0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5, 0x9E74, 0x9E74, 0x23EC,

+    0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6, 0x9E7B, 0x9E7B, 0x23D8,

+    0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB, 0x9E80, 0x9E84, 0x3ACD,

+    0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2, 0x9E87, 0x9E87, 0x23ED,

+    0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA, 0x9E92, 0x9E95, 0x3ADC,

+    0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8, 0x9E98, 0x9EA1, 0x3AE0,

+    0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA, 0x9EA6, 0x9EA6, 0x200B,

+    0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166, 0x9EAA, 0x9EAD, 0x3AEF,

+    0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3, 0x9EB3, 0x9EB3, 0x2189,

+    0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7, 0x9EB7, 0x9EB7, 0x23E7,

+    0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3, 0x9EF6, 0x9EFE, 0x3B36,

+    0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A, 0x9F4F, 0x9F6E, 0x3B4D,

+    0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D, 0x9F80, 0x9F91, 0x3B7C,

+    0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E, 0x9F98, 0x9F98, 0x24D6,

+    0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A, 0x9FA7, 0x9FA8, 0x3BA0,

+    0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2, 0x9FAC, 0x9FAC, 0x24D5,

+    0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228, 0x9FCA, 0x9FCC, 0x3BC0,

+    0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3, 0x9FE1, 0x9FE1, 0x20FC,

+    0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87, 0x9FEC, 0x9FED, 0x3BDF,

+    0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1, 0x9FF4, 0x9FF4, 0x1EBA,

+    0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119, 0x9FFE, 0x9FFE, 0x3BEE,

+    0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C, 0xA044, 0xA045, 0x3BF2,

+    0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4, 0xA049, 0xA049, 0x2227,

+    0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F, 0xA04F, 0xA053, 0x3BFA,

+    0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF, 0xA05A, 0xA05A, 0x1F5D,

+    0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC, 0xA062, 0xA062, 0x3C0A,

+    0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B, 0xA071, 0xA071, 0x2149,

+    0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046, 0xA075, 0xA07E, 0x3C1A,

+    0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24, 0xA091, 0xA091, 0x2190,

+    0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208, 0xA095, 0xA095, 0x3C36,

+    0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37, 0xA0A9, 0xA0A9, 0x24C3,

+    0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC, 0xA0C0, 0xA0CD, 0x3C5E,

+    0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C, 0xA0D9, 0xA0D9, 0x1ED1,

+    0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC, 0xA0DF, 0xA0ED, 0x3C7A,

+    0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89, 0xA1A1, 0xA1FE, 0x0060,

+    0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0,

+    0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164,

+    0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225,

+    0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, 0xA840, 0xA87E, 0x26B3,

+    0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C, 0xA8C5, 0xA8EA, 0x02BC,

+    0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720, 0xA95C, 0xA95C, 0x2722,

+    0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742, 0xA996, 0xA996, 0x1E17,

+    0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99, 0xAA4D, 0xAA4D, 0x21B6,

+    0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6, 0xAA71, 0xAA71, 0x2235,

+    0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397, 0xAA74, 0xAA76, 0x3CC9,

+    0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC, 0xAA7A, 0xAA7A, 0x223F,

+    0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE, 0xAA80, 0xAA99, 0x3CD1,

+    0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB, 0xAA9C, 0xAA9C, 0x2396,

+    0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC, 0xAA9F, 0xAA9F, 0x20A2,

+    0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E, 0xAB40, 0xAB40, 0x1F64,

+    0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B, 0xAB44, 0xAB44, 0x3CF0,

+    0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139, 0xAB47, 0xAB47, 0x3CF1,

+    0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1, 0xAB4A, 0xAB4A, 0x239A,

+    0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399, 0xAB4E, 0xAB7E, 0x3CF4,

+    0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C, 0xAC40, 0xAC45, 0x3D46,

+    0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C, 0xAC71, 0xAC71, 0x2460,

+    0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C, 0xAC7D, 0xAC7E, 0x3D80,

+    0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D, 0xAC8E, 0xAC92, 0x3D8F,

+    0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A, 0xAC95, 0xACA0, 0x3D94,

+    0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461, 0xAD4A, 0xAD5D, 0x3DA9,

+    0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD, 0xAD61, 0xAD61, 0x2462,

+    0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54, 0xAD69, 0xAD73, 0x3DC5,

+    0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0, 0xAD80, 0xAD81, 0x3DDA,

+    0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC, 0xAD87, 0xAD87, 0x245D,

+    0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463, 0xAD8C, 0xAD90, 0x3DE3,

+    0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8, 0xAE40, 0xAE53, 0x3DF7,

+    0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B, 0xAE62, 0xAE62, 0x1E70,

+    0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F, 0xAE81, 0xAE84, 0x3E34,

+    0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38, 0xAE8B, 0xAE8B, 0x1F4E,

+    0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1, 0xAE95, 0xAE9F, 0x3E45,

+    0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50, 0xAF64, 0xAF64, 0x1FC6,

+    0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE, 0xAF7C, 0xAF7E, 0x3E8A,

+    0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01, 0xAF83, 0xAF83, 0x2200,

+    0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2, 0xAF8F, 0xAF8F, 0x1E97,

+    0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB, 0xAF92, 0xAF9B, 0x3E9A,

+    0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4, 0xAF9F, 0xAF9F, 0x2028,

+    0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7, 0xB041, 0xB042, 0x25AF,

+    0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1, 0xB045, 0xB04E, 0x3EA9,

+    0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3, 0xB054, 0xB054, 0x1E4E,

+    0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202, 0xB058, 0xB058, 0x25AB,

+    0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9, 0xB05B, 0xB05B, 0x25AD,

+    0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6, 0xB05E, 0xB05E, 0x3EBB,

+    0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4, 0xB062, 0xB062, 0x222F,

+    0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7, 0xB065, 0xB06B, 0x3EBC,

+    0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3, 0xB07D, 0xB07D, 0x1E25,

+    0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4, 0xB097, 0xB097, 0x25C0,

+    0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A, 0xB09A, 0xB0A0, 0x3EEC,

+    0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3, 0xB14B, 0xB14B, 0x226E,

+    0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD, 0xB14E, 0xB14E, 0x3EFF,

+    0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2, 0xB151, 0xB151, 0x3F00,

+    0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01, 0xB180, 0xB196, 0x3F2D,

+    0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44, 0xB1A1, 0xB1FE, 0x040A,

+    0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF, 0xB242, 0xB266, 0x3F4E,

+    0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73, 0xB26D, 0xB26D, 0x2074,

+    0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687, 0xB275, 0xB27E, 0x3F7E,

+    0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88, 0xB289, 0xB289, 0x268D,

+    0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0, 0xB29B, 0xB2A0, 0x3FA0,

+    0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6, 0xB343, 0xB343, 0x1FAB,

+    0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8, 0xB371, 0xB37E, 0x3FD5,

+    0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9, 0xB389, 0xB38B, 0x3FEB,

+    0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE, 0xB38E, 0xB38E, 0x21FA,

+    0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6, 0xB440, 0xB453, 0x4001,

+    0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015, 0xB458, 0xB458, 0x24E4,

+    0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6, 0xB45F, 0xB45F, 0x20F7,

+    0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B, 0xB462, 0xB474, 0x401E,

+    0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031, 0xB47E, 0xB47E, 0x24EC,

+    0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB, 0xB484, 0xB488, 0x403C,

+    0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041, 0xB493, 0xB493, 0x24EA,

+    0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524, 0xB540, 0xB540, 0x4057,

+    0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058, 0xB54B, 0xB54B, 0x1E27,

+    0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6, 0xB557, 0xB559, 0x406B,

+    0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012, 0xB55C, 0xB55C, 0x1EEC,

+    0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8, 0xB562, 0xB57E, 0x4072,

+    0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66, 0xB59D, 0xB59D, 0x24DC,

+    0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582, 0xB640, 0xB651, 0x40AE,

+    0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0, 0xB655, 0xB655, 0x24DD,

+    0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E, 0xB65A, 0xB65A, 0x40C5,

+    0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8, 0xB65D, 0xB67E, 0x40C6,

+    0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0, 0xB740, 0xB74D, 0x4109,

+    0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117, 0xB751, 0xB751, 0x1E80,

+    0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677, 0xB75A, 0xB763, 0x4120,

+    0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69, 0xB766, 0xB766, 0x222B,

+    0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F, 0xB778, 0xB778, 0x1F5B,

+    0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B, 0xB781, 0xB781, 0x4140,

+    0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141, 0xB7A1, 0xB7FE, 0x063E,

+    0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0, 0xB844, 0xB844, 0x2186,

+    0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED, 0xB847, 0xB84C, 0x4163,

+    0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169, 0xB851, 0xB851, 0x1FEA,

+    0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4, 0xB85B, 0xB85B, 0x20E1,

+    0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8, 0xB85E, 0xB85E, 0x2260,

+    0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2, 0xB861, 0xB876, 0x4176,

+    0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C, 0xB880, 0xB881, 0x4193,

+    0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195, 0xB8A1, 0xB8FE, 0x069C,

+    0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41, 0xB951, 0xB960, 0x41C3,

+    0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3, 0xB97B, 0xB97B, 0x1F86,

+    0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF, 0xB99D, 0xB99D, 0x1FB3,

+    0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF, 0xB9A1, 0xB9FE, 0x06FA,

+    0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4, 0xBA43, 0xBA43, 0x4210,

+    0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211, 0xBA56, 0xBA56, 0x25E3,

+    0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111, 0xBA5A, 0xBA5F, 0x4224,

+    0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A, 0xBA6A, 0xBA6A, 0x25E7,

+    0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041, 0xBA75, 0xBA7E, 0x423C,

+    0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA, 0xBA85, 0xBA85, 0x424A,

+    0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B, 0xBA88, 0xBA88, 0x25EC,

+    0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB, 0xBA8E, 0xBA9D, 0x4250,

+    0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D, 0xBAA0, 0xBAA0, 0x4260,

+    0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7, 0xBB41, 0xBB48, 0x4261,

+    0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269, 0xBB58, 0xBB58, 0x25E9,

+    0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE, 0xBB5C, 0xBB5C, 0x203A,

+    0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693, 0xBB61, 0xBB64, 0x427C,

+    0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED, 0xBB67, 0xBB67, 0x4280,

+    0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281, 0xBB6A, 0xBB6A, 0x2065,

+    0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3, 0xBB6F, 0xBB7E, 0x4285,

+    0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6, 0xBC40, 0xBC51, 0x42B6,

+    0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC, 0xBC54, 0xBC59, 0x42C8,

+    0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE, 0xBC61, 0xBC61, 0x269B,

+    0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3, 0xBC64, 0xBC64, 0x42D5,

+    0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6, 0xBC67, 0xBC67, 0x25F4,

+    0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B, 0xBC6A, 0xBC6C, 0x42D8,

+    0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB, 0xBC6F, 0xBC6F, 0x1F7B,

+    0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D, 0xBC72, 0xBC72, 0x42DD,

+    0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48, 0xBC75, 0xBC75, 0x241C,

+    0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF, 0xBC79, 0xBC79, 0x219A,

+    0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091, 0xBC7C, 0xBC7D, 0x42DF,

+    0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1, 0xBC82, 0xBC82, 0x2423,

+    0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422, 0xBC85, 0xBC85, 0x42E3,

+    0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4, 0xBC88, 0xBC88, 0x228D,

+    0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8, 0xBC8B, 0xBC8B, 0x2421,

+    0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3, 0xBC90, 0xBC99, 0x42E8,

+    0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426, 0xBC9C, 0xBC9C, 0x2425,

+    0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2, 0xBCA1, 0xBCFE, 0x0814,

+    0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A, 0xBD43, 0xBD43, 0x2424,

+    0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428, 0xBD46, 0xBD47, 0x42F8,

+    0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429, 0xBD4A, 0xBD4A, 0x42FA,

+    0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB, 0xBD4D, 0xBD4D, 0x22BE,

+    0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31, 0xBD50, 0xBD56, 0x42FD,

+    0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304, 0xBD59, 0xBD59, 0x1FB5,

+    0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B, 0xBD67, 0xBD67, 0x1FAF,

+    0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068, 0xBD6B, 0xBD6B, 0x21E4,

+    0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21, 0xBD70, 0xBD70, 0x4316,

+    0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317, 0xBD79, 0xBD79, 0x217C,

+    0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D, 0xBD7C, 0xBD7D, 0x431E,

+    0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320, 0xBD81, 0xBD81, 0x1FD1,

+    0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33, 0xBD8A, 0xBD8A, 0x4328,

+    0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329, 0xBD8E, 0xBD8E, 0x242E,

+    0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430, 0xBD91, 0xBD91, 0x21DB,

+    0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158, 0xBD98, 0xBD9A, 0x4331,

+    0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334, 0xBDA1, 0xBDFE, 0x0872,

+    0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9, 0xBE44, 0xBE44, 0x433C,

+    0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D, 0xBE49, 0xBE49, 0x1E8E,

+    0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340, 0xBE51, 0xBE51, 0x21C5,

+    0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192, 0xBE54, 0xBE54, 0x4346,

+    0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19, 0xBE57, 0xBE57, 0x218C,

+    0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3, 0xBE5A, 0xBE5C, 0x4347,

+    0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438, 0xBE5F, 0xBE5F, 0x2432,

+    0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A, 0xBE62, 0xBE62, 0x1E9C,

+    0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085, 0xBE65, 0xBE68, 0x434B,

+    0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F, 0xBE6C, 0xBE6C, 0x243B,

+    0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7, 0xBE70, 0xBE70, 0x2433,

+    0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054, 0xBE77, 0xBE77, 0x21DE,

+    0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434, 0xBE7A, 0xBE7B, 0x4359,

+    0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89, 0xBE7E, 0xBE7E, 0x243C,

+    0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E, 0xBE84, 0xBE84, 0x1ED8,

+    0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF, 0xBE87, 0xBE87, 0x2445,

+    0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249, 0xBE8A, 0xBE8B, 0x4360,

+    0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362, 0xBE8E, 0xBE8E, 0x1E47,

+    0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363, 0xBE92, 0xBE92, 0x2086,

+    0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196, 0xBE96, 0xBE96, 0x4367,

+    0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F, 0xBE99, 0xBE99, 0x4368,

+    0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369, 0xBE9C, 0xBE9C, 0x2442,

+    0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E, 0xBEA0, 0xBEA0, 0x436C,

+    0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6, 0xBF41, 0xBF4C, 0x436D,

+    0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446, 0xBF4F, 0xBF4F, 0x244B,

+    0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379, 0xBF55, 0xBF55, 0x2427,

+    0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D, 0xBF60, 0xBF60, 0x1F0F,

+    0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447, 0xBF63, 0xBF63, 0x2449,

+    0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387, 0xBF68, 0xBF68, 0x21C2,

+    0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E, 0xBF6D, 0xBF6F, 0x438D,

+    0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390, 0xBF72, 0xBF72, 0x244A,

+    0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391, 0xBF76, 0xBF76, 0x22BB,

+    0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393, 0xBF79, 0xBF79, 0x2694,

+    0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6, 0xBF7C, 0xBF7C, 0x2051,

+    0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E, 0xBF80, 0xBF81, 0x4395,

+    0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D, 0xBF84, 0xBF88, 0x4397,

+    0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451, 0xBF8B, 0xBF94, 0x439C,

+    0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6, 0xBF97, 0xBF97, 0x2289,

+    0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7, 0xBF9D, 0xBF9D, 0x2454,

+    0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E, 0xC040, 0xC040, 0x20FB,

+    0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440, 0xC045, 0xC04A, 0x43B1,

+    0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61, 0xC04D, 0xC04D, 0x269D,

+    0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A, 0xC050, 0xC050, 0x2456,

+    0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458, 0xC053, 0xC054, 0x43B8,

+    0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA, 0xC05B, 0xC05B, 0x221A,

+    0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A, 0xC05F, 0xC05F, 0x244D,

+    0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1, 0xC069, 0xC069, 0x2453,

+    0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420, 0xC06C, 0xC06C, 0x43CA,

+    0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685, 0xC06F, 0xC06F, 0x43CB,

+    0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC, 0xC074, 0xC074, 0x2224,

+    0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF, 0xC077, 0xC077, 0x21BA,

+    0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A, 0xC07A, 0xC07B, 0x43D1,

+    0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3, 0xC080, 0xC09A, 0x43D5,

+    0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0, 0xC09D, 0xC09D, 0x269A,

+    0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C, 0xC140, 0xC14F, 0x43F4,

+    0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404, 0xC154, 0xC154, 0x1E2C,

+    0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062, 0xC160, 0xC160, 0x24F1,

+    0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2, 0xC163, 0xC174, 0x4412,

+    0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424, 0xC178, 0xC178, 0x2215,

+    0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C, 0xC195, 0xC195, 0x21AE,

+    0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA, 0xC240, 0xC24D, 0x444C,

+    0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A, 0xC265, 0xC265, 0x25C2,

+    0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1, 0xC268, 0xC27C, 0x4471,

+    0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486, 0xC280, 0xC283, 0x4487,

+    0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B, 0xC293, 0xC293, 0x2017,

+    0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125, 0xC296, 0xC296, 0x214D,

+    0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4, 0xC299, 0xC299, 0x209D,

+    0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A, 0xC29C, 0xC29C, 0x25C3,

+    0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179, 0xC2A1, 0xC2FE, 0x0A48,

+    0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E, 0xC343, 0xC343, 0x2155,

+    0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2, 0xC37C, 0xC37E, 0x44D7,

+    0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7, 0xC385, 0xC39A, 0x44DE,

+    0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4, 0xC3A1, 0xC3FE, 0x0AA6,

+    0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123, 0xC44A, 0xC44B, 0x4502,

+    0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504, 0xC454, 0xC454, 0x24C9,

+    0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094, 0xC459, 0xC45A, 0x450E,

+    0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510, 0xC463, 0xC463, 0x1E77,

+    0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06, 0xC478, 0xC479, 0x452A,

+    0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C, 0xC480, 0xC480, 0x4530,

+    0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531, 0xC491, 0xC491, 0x1EAD,

+    0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8, 0xC494, 0xC497, 0x4540,

+    0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544, 0xC49A, 0xC49A, 0x20C5,

+    0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA, 0xC49D, 0xC4A0, 0x4546,

+    0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A, 0xC544, 0xC544, 0x1FF0,

+    0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6, 0xC547, 0xC54A, 0x454F,

+    0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE, 0xC54D, 0xC551, 0x4553,

+    0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558, 0xC55F, 0xC55F, 0x2161,

+    0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B, 0xC564, 0xC564, 0x21D9,

+    0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9, 0xC567, 0xC57E, 0x4567,

+    0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61, 0xC594, 0xC59B, 0x4592,

+    0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A, 0xC59E, 0xC59E, 0x1F98,

+    0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62, 0xC640, 0xC640, 0x459D,

+    0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E, 0xC644, 0xC644, 0x1F88,

+    0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8, 0xC648, 0xC662, 0x45A2,

+    0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD, 0xC672, 0xC672, 0x2336,

+    0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7, 0xC6A1, 0xC6FE, 0x0BC0,

+    0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB, 0xC767, 0xC76E, 0x461E,

+    0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626, 0xC776, 0xC776, 0x1F7D,

+    0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333, 0xC77C, 0xC77E, 0x4630,

+    0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E, 0xC840, 0xC840, 0x4654,

+    0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655, 0xC84F, 0xC84F, 0x2334,

+    0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1, 0xC853, 0xC865, 0x4664,

+    0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677, 0xC86E, 0xC86E, 0x2349,

+    0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B, 0xC880, 0xC886, 0x468D,

+    0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694, 0xC892, 0xC892, 0x2347,

+    0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193, 0xC895, 0xC898, 0x469F,

+    0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3, 0xC89D, 0xC89D, 0x1F62,

+    0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C, 0xC940, 0xC94E, 0x46A9,

+    0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348, 0xC951, 0xC96D, 0x46B8,

+    0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5, 0xC970, 0xC970, 0x2345,

+    0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12, 0xC978, 0xC97E, 0x46DC,

+    0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018, 0xC990, 0xC990, 0x2335,

+    0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C, 0xC99D, 0xC9A0, 0x46FD,

+    0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701, 0xCA4E, 0xCA4E, 0x266F,

+    0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351, 0xCA57, 0xCA58, 0x4716,

+    0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718, 0xCA5C, 0xCA5C, 0x2338,

+    0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B, 0xCA62, 0xCA6D, 0x471E,

+    0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A, 0xCA72, 0xCA72, 0x234F,

+    0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D, 0xCA78, 0xCA7A, 0x4731,

+    0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331, 0xCA7D, 0xCA7D, 0x4734,

+    0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735, 0xCA81, 0xCA81, 0x233B,

+    0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350, 0xCA8A, 0xCA8D, 0x473D,

+    0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6, 0xCA90, 0xCA91, 0x4741,

+    0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743, 0xCA9A, 0xCA9A, 0x2355,

+    0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38, 0xCB40, 0xCB42, 0x4750,

+    0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753, 0xCB45, 0xCB45, 0x1F74,

+    0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330, 0xCB48, 0xCB4A, 0x4755,

+    0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758, 0xCB4E, 0xCB4E, 0x20DA,

+    0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A, 0xCB58, 0xCB5C, 0x4762,

+    0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767, 0xCB5F, 0xCB5F, 0x2107,

+    0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F, 0xCB6B, 0xCB7A, 0x4772,

+    0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343, 0xCB7D, 0xCB7E, 0x4782,

+    0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212, 0xCB88, 0xCB8D, 0x478B,

+    0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791, 0xCB92, 0xCB92, 0x2359,

+    0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254, 0xCB9D, 0xCB9D, 0x479D,

+    0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E, 0xCBA1, 0xCBFE, 0x0D96,

+    0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357, 0xCC42, 0xCC48, 0x47A0,

+    0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042, 0xCC4B, 0xCC4B, 0x2153,

+    0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB, 0xCC50, 0xCC5B, 0x47AA,

+    0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6, 0xCC60, 0xCC60, 0x2356,

+    0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337, 0xCC65, 0xCC6C, 0x47BC,

+    0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4, 0xCC79, 0xCC79, 0x2353,

+    0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061, 0xCC7E, 0xCC7E, 0x47D2,

+    0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95, 0xCC8F, 0xCC93, 0x47E1,

+    0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6, 0xCC96, 0xCC96, 0x1F42,

+    0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8, 0xCC9E, 0xCCA0, 0x47ED,

+    0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0, 0xCD80, 0xCD8F, 0x482F,

+    0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F, 0xCD98, 0xCD98, 0x25D7,

+    0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52, 0xCE40, 0xCE66, 0x484E,

+    0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875, 0xCE72, 0xCE72, 0x21B2,

+    0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B, 0xCE81, 0xCE81, 0x219E,

+    0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC, 0xCE88, 0xCE9A, 0x4891,

+    0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4, 0xCE9E, 0xCE9E, 0x2226,

+    0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0, 0xCF40, 0xCF4D, 0x48A8,

+    0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6, 0xCF55, 0xCF55, 0x227B,

+    0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE, 0xCF59, 0xCF5B, 0x48BE,

+    0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1, 0xCF6C, 0xCF6C, 0x25D5,

+    0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B, 0xCF74, 0xCF74, 0x48D6,

+    0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7, 0xCF78, 0xCF78, 0x1E89,

+    0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9, 0xCF7D, 0xCF7E, 0x48DC,

+    0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211, 0xCF82, 0xCF88, 0x48DF,

+    0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6, 0xCF8B, 0xCF92, 0x48E6,

+    0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF, 0xCF95, 0xCF9D, 0x48EE,

+    0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7, 0xCFA0, 0xCFA0, 0x25D8,

+    0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8, 0xD04D, 0xD04D, 0x1F29,

+    0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B, 0xD052, 0xD054, 0x4908,

+    0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B, 0xD05C, 0xD05C, 0x2297,

+    0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690, 0xD061, 0xD066, 0x4914,

+    0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A, 0xD06C, 0xD06C, 0x2198,

+    0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88, 0xD06F, 0xD07C, 0x491F,

+    0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D, 0xD080, 0xD0A0, 0x492E,

+    0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F, 0xD155, 0xD155, 0x25F1,

+    0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C, 0xD15A, 0xD160, 0x4967,

+    0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC, 0xD163, 0xD174, 0x496E,

+    0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980, 0xD17D, 0xD17D, 0x2676,

+    0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988, 0xD19D, 0xD19D, 0x1FE1,

+    0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5, 0xD1A1, 0xD1FE, 0x0FCA,

+    0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7, 0xD243, 0xD243, 0x22DD,

+    0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD, 0xD24E, 0xD25B, 0x49B2,

+    0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0, 0xD263, 0xD263, 0x25BC,

+    0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6, 0xD268, 0xD268, 0x25BF,

+    0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187, 0xD26E, 0xD26E, 0x49CD,

+    0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE, 0xD272, 0xD272, 0x1E7F,

+    0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD, 0xD276, 0xD27E, 0x49D2,

+    0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96, 0xD28B, 0xD28D, 0x49E5,

+    0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8, 0xD292, 0xD292, 0x2084,

+    0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136, 0xD296, 0xD296, 0x49ED,

+    0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE, 0xD2A0, 0xD2A0, 0x24BA,

+    0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6, 0xD344, 0xD344, 0x24BC,

+    0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4, 0xD349, 0xD349, 0x49FD,

+    0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE, 0xD34D, 0xD34D, 0x24BD,

+    0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE, 0xD351, 0xD354, 0x4A02,

+    0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06, 0xD358, 0xD358, 0x1FD2,

+    0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD, 0xD35C, 0xD35C, 0x4A0A,

+    0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D, 0xD35F, 0xD377, 0x4A0B,

+    0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24, 0xD37A, 0xD37A, 0x260A,

+    0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94, 0xD37D, 0xD37E, 0x4A26,

+    0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF, 0xD386, 0xD386, 0x1ECB,

+    0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D, 0xD38B, 0xD38B, 0x1F77,

+    0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB, 0xD38E, 0xD38E, 0x4A31,

+    0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32, 0xD391, 0xD391, 0x216F,

+    0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0, 0xD394, 0xD395, 0x4A34,

+    0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36, 0xD398, 0xD398, 0x22E2,

+    0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37, 0xD39B, 0xD39B, 0x1F78,

+    0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2, 0xD39F, 0xD39F, 0x4A3A,

+    0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086, 0xD440, 0xD440, 0x4A3B,

+    0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C, 0xD445, 0xD445, 0x1FD3,

+    0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5, 0xD448, 0xD44B, 0x4A40,

+    0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44, 0xD44F, 0xD44F, 0x211F,

+    0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD, 0xD454, 0xD455, 0x4A49,

+    0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B, 0xD458, 0xD458, 0x22E7,

+    0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282, 0xD45D, 0xD461, 0x4A4F,

+    0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54, 0xD467, 0xD467, 0x22E8,

+    0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4, 0xD46F, 0xD46F, 0x4A5E,

+    0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F, 0xD472, 0xD472, 0x22EB,

+    0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9, 0xD475, 0xD475, 0x20BD,

+    0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA, 0xD479, 0xD47A, 0x4A63,

+    0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65, 0xD47E, 0xD47E, 0x1E9E,

+    0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6, 0xD483, 0xD483, 0x21E7,

+    0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69, 0xD487, 0xD487, 0x2137,

+    0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C, 0xD48B, 0xD48B, 0x4A6D,

+    0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2, 0xD48E, 0xD48E, 0x1F37,

+    0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E, 0xD491, 0xD491, 0x22EF,

+    0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10, 0xD494, 0xD494, 0x21C8,

+    0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1, 0xD497, 0xD49B, 0x4A70,

+    0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75, 0xD49F, 0xD49F, 0x22EE,

+    0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4, 0xD540, 0xD542, 0x4A78,

+    0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E, 0xD545, 0xD545, 0x22EC,

+    0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B, 0xD54A, 0xD54A, 0x20FE,

+    0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9, 0xD550, 0xD550, 0x4A81,

+    0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82, 0xD554, 0xD554, 0x2236,

+    0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7, 0xD557, 0xD559, 0x4A85,

+    0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88, 0xD55C, 0xD55C, 0x1E82,

+    0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89, 0xD55F, 0xD55F, 0x21A4,

+    0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8, 0xD562, 0xD562, 0x2151,

+    0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60, 0xD565, 0xD567, 0x4A8B,

+    0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E, 0xD56C, 0xD56C, 0x2145,

+    0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC, 0xD56F, 0xD571, 0x4A92,

+    0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95, 0xD575, 0xD575, 0x1EF5,

+    0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218, 0xD579, 0xD57A, 0x4A99,

+    0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B, 0xD57E, 0xD57E, 0x2300,

+    0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4, 0xD582, 0xD583, 0x4A9E,

+    0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0, 0xD586, 0xD586, 0x22FD,

+    0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA, 0xD589, 0xD589, 0x4AA2,

+    0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3, 0xD58C, 0xD58C, 0x22FB,

+    0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC, 0xD58F, 0xD58F, 0x2027,

+    0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060, 0xD594, 0xD594, 0x22FF,

+    0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE, 0xD599, 0xD599, 0x1EC7,

+    0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C, 0xD59C, 0xD59E, 0x4AAC,

+    0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF, 0xD5A1, 0xD5FE, 0x1142,

+    0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0, 0xD642, 0xD642, 0x230A,

+    0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1, 0xD647, 0xD647, 0x2303,

+    0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307, 0xD64A, 0xD64A, 0x230B,

+    0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F, 0xD64E, 0xD64E, 0x4AB7,

+    0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8, 0xD652, 0xD652, 0x2302,

+    0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D, 0xD655, 0xD655, 0x4ABA,

+    0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB, 0xD658, 0xD658, 0x2308,

+    0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC, 0xD65B, 0xD65B, 0x4ABD,

+    0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305, 0xD65E, 0xD65E, 0x2197,

+    0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171, 0xD661, 0xD661, 0x2298,

+    0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57, 0xD666, 0xD668, 0x4AC2,

+    0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5, 0xD66B, 0xD66B, 0x2311,

+    0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304, 0xD670, 0xD670, 0x4AC9,

+    0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35, 0xD673, 0xD673, 0x4ACA,

+    0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310, 0xD676, 0xD676, 0x1FA3,

+    0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6, 0xD679, 0xD67B, 0x4ACC,

+    0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF, 0xD680, 0xD682, 0x4AD1,

+    0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4, 0xD686, 0xD686, 0x2312,

+    0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313, 0xD689, 0xD68D, 0x4AD6,

+    0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB, 0xD694, 0xD694, 0x1FBA,

+    0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078, 0xD69A, 0xD6A0, 0x4AE4,

+    0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB, 0xD743, 0xD743, 0x2288,

+    0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316, 0xD749, 0xD749, 0x1F6B,

+    0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314, 0xD751, 0xD751, 0x4AF8,

+    0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315, 0xD754, 0xD754, 0x2168,

+    0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4, 0xD757, 0xD763, 0x4AFA,

+    0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07, 0xD767, 0xD767, 0x2219,

+    0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09, 0xD76C, 0xD76C, 0x20D5,

+    0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A, 0xD770, 0xD774, 0x4B0E,

+    0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13, 0xD778, 0xD778, 0x1ED3,

+    0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B, 0xD783, 0xD783, 0x1E49,

+    0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B, 0xD788, 0xD78A, 0x4B21,

+    0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8, 0xD78D, 0xD78D, 0x4B24,

+    0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319, 0xD790, 0xD794, 0x4B25,

+    0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A, 0xD797, 0xD797, 0x2317,

+    0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE, 0xD840, 0xD84C, 0x4B34,

+    0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41, 0xD853, 0xD853, 0x1EFD,

+    0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71, 0xD890, 0xD890, 0x1E3B,

+    0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81, 0xD893, 0xD893, 0x1F0C,

+    0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24, 0xD896, 0xD899, 0x4B82,

+    0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65, 0xD89C, 0xD89C, 0x1EF0,

+    0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30, 0xD89F, 0xD89F, 0x2261,

+    0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257, 0xD940, 0xD940, 0x4B87,

+    0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB, 0xD943, 0xD943, 0x4B88,

+    0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8, 0xD946, 0xD946, 0x1F39,

+    0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48, 0xD949, 0xD949, 0x2070,

+    0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A, 0xD94C, 0xD94C, 0x24AC,

+    0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176, 0xD94F, 0xD94F, 0x24AD,

+    0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B, 0xD952, 0xD952, 0x1F45,

+    0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B, 0xD955, 0xD955, 0x202F,

+    0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0, 0xD958, 0xD958, 0x4B8C,

+    0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F, 0xD95B, 0xD95B, 0x4B8D,

+    0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E, 0xD963, 0xD963, 0x24B2,

+    0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51, 0xD966, 0xD966, 0x4B94,

+    0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95, 0xD96C, 0xD96C, 0x24B3,

+    0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F, 0xD96F, 0xD96F, 0x4B9A,

+    0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B, 0xD972, 0xD972, 0x20B4,

+    0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB, 0xD975, 0xD975, 0x2072,

+    0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C, 0xD978, 0xD978, 0x1F0A,

+    0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D, 0xD97C, 0xD97C, 0x2291,

+    0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278, 0xD980, 0xD980, 0x1ED4,

+    0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3, 0xD988, 0xD98C, 0x4BA5,

+    0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7, 0xD98F, 0xD98F, 0x1F28,

+    0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7, 0xD992, 0xD996, 0x4BAA,

+    0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1, 0xD999, 0xD99A, 0x4BAF,

+    0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1, 0xD99D, 0xD99D, 0x225B,

+    0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2, 0xD9A0, 0xD9A0, 0x2115,

+    0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3, 0xDA41, 0xDA41, 0x222A,

+    0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4, 0xDA48, 0xDA48, 0x213D,

+    0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15, 0xDA4E, 0xDA4E, 0x225C,

+    0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14, 0xDA74, 0xDA76, 0x4BE1,

+    0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4, 0xDA80, 0xDA84, 0x4BEB,

+    0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0, 0xDA8E, 0xDA8E, 0x25F8,

+    0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313, 0xDB40, 0xDB5F, 0x4C0A,

+    0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A, 0xDB78, 0xDB78, 0x2230,

+    0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47, 0xDB84, 0xDB84, 0x25FD,

+    0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600, 0xDB8C, 0xDB97, 0x4C51,

+    0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D, 0xDBA1, 0xDBFE, 0x1371,

+    0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF, 0xDC46, 0xDC4E, 0x4C6A,

+    0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C, 0xDC51, 0xDC51, 0x2602,

+    0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D, 0xDC54, 0xDC54, 0x4C74,

+    0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE, 0xDC57, 0xDC57, 0x2603,

+    0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601, 0xDC5E, 0xDC61, 0x4C7A,

+    0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E, 0xDC66, 0xDC66, 0x1EA3,

+    0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81, 0xDC6B, 0xDC6B, 0x2607,

+    0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0, 0xDC7D, 0xDC7E, 0x4C94,

+    0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B, 0xDC88, 0xDC88, 0x2267,

+    0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6, 0xDC8B, 0xDC8D, 0x4C9D,

+    0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0, 0xDC90, 0xDC90, 0x248C,

+    0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D, 0xDC98, 0xDC9A, 0x4CA7,

+    0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA, 0xDCA0, 0xDCA0, 0x2494,

+    0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE, 0xDD46, 0xDD46, 0x2493,

+    0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E, 0xDD4E, 0xDD52, 0x4CBA,

+    0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491, 0xDD55, 0xDD55, 0x2496,

+    0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492, 0xDD58, 0xDD58, 0x4CBF,

+    0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0, 0xDD5E, 0xDD5E, 0x1FB1,

+    0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A, 0xDD61, 0xDD61, 0x4CC5,

+    0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6, 0xDD64, 0xDD64, 0x2258,

+    0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7, 0xDD6D, 0xDD6D, 0x249B,

+    0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09, 0xDD70, 0xDD70, 0x20E6,

+    0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026, 0xDD77, 0xDD77, 0x249F,

+    0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D, 0xDD7B, 0xDD7E, 0x4CD4,

+    0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B, 0xDD82, 0xDD82, 0x249C,

+    0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A, 0xDD86, 0xDD86, 0x205B,

+    0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70, 0xDD8C, 0xDD8E, 0x4CDF,

+    0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2, 0xDD94, 0xDD94, 0x213B,

+    0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07, 0xDD98, 0xDD99, 0x4CE8,

+    0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237, 0xDD9C, 0xDD9D, 0x4CEA,

+    0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC, 0xDDA0, 0xDDA0, 0x21B3,

+    0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245, 0xDE41, 0xDE41, 0x24A1,

+    0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8, 0xDE45, 0xDE47, 0x4CEF,

+    0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0, 0xDE4A, 0xDE4E, 0x4CF2,

+    0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7, 0xDE5A, 0xDE5A, 0x1F46,

+    0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380, 0xDE5D, 0xDE5D, 0x2495,

+    0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490, 0xDE60, 0xDE6A, 0x4D03,

+    0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E, 0xDE6F, 0xDE6F, 0x1E9D,

+    0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A, 0xDE72, 0xDE72, 0x20AA,

+    0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D, 0xDE92, 0xDE92, 0x267B,

+    0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2, 0xDEA0, 0xDEA0, 0x4D3B,

+    0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E, 0xDF41, 0xDF41, 0x4D3C,

+    0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D, 0xDF4D, 0xDF4D, 0x1FBB,

+    0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253, 0xDF5D, 0xDF5D, 0x4D55,

+    0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6, 0xDF60, 0xDF60, 0x218E,

+    0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC, 0xDF65, 0xDF65, 0x4D59,

+    0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A, 0xDF68, 0xDF68, 0x224A,

+    0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133, 0xDF6E, 0xDF73, 0x4D5F,

+    0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65, 0xDF77, 0xDF77, 0x20CF,

+    0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67, 0xDF7A, 0xDF7A, 0x220F,

+    0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029, 0xDF7D, 0xDF7D, 0x4D69,

+    0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55, 0xDF81, 0xDF82, 0x4D6A,

+    0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C, 0xDF85, 0xDF85, 0x1E46,

+    0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063, 0xDF8A, 0xDF8A, 0x23F3,

+    0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9, 0xE040, 0xE04F, 0x4D86,

+    0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96, 0xE05D, 0xE05D, 0x2233,

+    0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320, 0xE06A, 0xE06B, 0x4DAD,

+    0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF, 0xE075, 0xE075, 0x22BC,

+    0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C, 0xE078, 0xE078, 0x4DB8,

+    0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9, 0xE080, 0xE086, 0x4DBE,

+    0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5, 0xE08D, 0xE08D, 0x2287,

+    0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D, 0xE090, 0xE090, 0x1EAB,

+    0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D, 0xE093, 0xE093, 0x4DCC,

+    0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD, 0xE097, 0xE097, 0x231B,

+    0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547, 0xE140, 0xE141, 0x4DD8,

+    0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA, 0xE164, 0xE164, 0x2255,

+    0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F, 0xE169, 0xE173, 0x4DFE,

+    0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4, 0xE176, 0xE17E, 0x4E09,

+    0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B, 0xE185, 0xE185, 0x21D8,

+    0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA, 0xE188, 0xE188, 0x4E17,

+    0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18, 0xE18C, 0xE18C, 0x2134,

+    0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3, 0xE191, 0xE191, 0x24F8,

+    0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7, 0xE194, 0xE194, 0x1EC8,

+    0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C, 0xE198, 0xE198, 0x2280,

+    0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5, 0xE19F, 0xE19F, 0x24FB,

+    0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5, 0xE240, 0xE240, 0x4E24,

+    0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25, 0xE243, 0xE243, 0x1EED,

+    0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD, 0xE250, 0xE250, 0x4E31,

+    0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32, 0xE253, 0xE253, 0x24FE,

+    0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33, 0xE25A, 0xE25A, 0x2508,

+    0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38, 0xE25E, 0xE25E, 0x2506,

+    0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF, 0xE263, 0xE263, 0x2090,

+    0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD, 0xE268, 0xE268, 0x1F25,

+    0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503, 0xE26B, 0xE26B, 0x2502,

+    0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A, 0xE26F, 0xE26F, 0x20A6,

+    0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5, 0xE279, 0xE27C, 0x4E4B,

+    0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F, 0xE280, 0xE280, 0x2507,

+    0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505, 0xE283, 0xE288, 0x4E50,

+    0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56, 0xE28B, 0xE28B, 0x2515,

+    0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C, 0xE28F, 0xE28F, 0x2031,

+    0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B, 0xE293, 0xE293, 0x250F,

+    0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509, 0xE296, 0xE297, 0x4E5B,

+    0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234, 0xE29A, 0xE29A, 0x2513,

+    0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D, 0xE2A0, 0xE2A0, 0x2501,

+    0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61, 0xE342, 0xE342, 0x2517,

+    0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63, 0xE347, 0xE347, 0x2518,

+    0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56, 0xE34C, 0xE34E, 0x4E69,

+    0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C, 0xE351, 0xE351, 0x20D3,

+    0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A, 0xE355, 0xE355, 0x20CE,

+    0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510, 0xE359, 0xE35B, 0x4E71,

+    0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74, 0xE360, 0xE360, 0x250A,

+    0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511, 0xE368, 0xE370, 0x4E7C,

+    0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85, 0xE373, 0xE373, 0x251E,

+    0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86, 0xE378, 0xE378, 0x252D,

+    0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89, 0xE37C, 0xE37C, 0x2532,

+    0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B, 0xE380, 0xE389, 0x4E8C,

+    0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96, 0xE38C, 0xE38C, 0x252C,

+    0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528, 0xE390, 0xE390, 0x4E99,

+    0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A, 0xE393, 0xE393, 0x252F,

+    0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC, 0xE396, 0xE398, 0x4E9C,

+    0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F, 0xE39C, 0xE39C, 0x2535,

+    0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D, 0xE39F, 0xE39F, 0x2526,

+    0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661, 0xE440, 0xE440, 0x2534,

+    0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F, 0xE443, 0xE443, 0x2531,

+    0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3, 0xE448, 0xE448, 0x2525,

+    0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD, 0xE44F, 0xE44F, 0x4EAB,

+    0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC, 0xE452, 0xE452, 0x2172,

+    0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD, 0xE458, 0xE458, 0x204F,

+    0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543, 0xE45B, 0xE45B, 0x4EB2,

+    0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3, 0xE45E, 0xE45E, 0x1E3C,

+    0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529, 0xE463, 0xE464, 0x4EB7,

+    0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9, 0xE468, 0xE468, 0x1EFF,

+    0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F, 0xE474, 0xE474, 0x4EC5,

+    0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6, 0xE479, 0xE479, 0x2523,

+    0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A, 0xE47C, 0xE47C, 0x2545,

+    0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D, 0xE480, 0xE480, 0x4ECA,

+    0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB, 0xE484, 0xE484, 0x2103,

+    0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C, 0xE487, 0xE487, 0x253B,

+    0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD, 0xE48D, 0xE48D, 0x2540,

+    0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD, 0xE490, 0xE492, 0x4ED2,

+    0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5, 0xE498, 0xE498, 0x254B,

+    0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547, 0xE49E, 0xE49F, 0x254F,

+    0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF, 0xE540, 0xE545, 0x4EDE,

+    0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4, 0xE548, 0xE548, 0x2546,

+    0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C, 0xE54C, 0xE54D, 0x4EE7,

+    0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552, 0xE550, 0xE550, 0x2530,

+    0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9, 0xE555, 0xE555, 0x2551,

+    0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC, 0xE558, 0xE558, 0x20D2,

+    0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8, 0xE55D, 0xE55D, 0x4EF0,

+    0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1, 0xE561, 0xE561, 0x21AB,

+    0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D, 0xE565, 0xE565, 0x1EA5,

+    0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C, 0xE569, 0xE569, 0x2080,

+    0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D, 0xE56D, 0xE56D, 0x4EF9,

+    0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA, 0xE575, 0xE575, 0x254A,

+    0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00, 0xE578, 0xE578, 0x254E,

+    0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC, 0xE57C, 0xE57C, 0x2554,

+    0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05, 0xE581, 0xE581, 0x1F3C,

+    0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5, 0xE584, 0xE589, 0x4F07,

+    0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D, 0xE58E, 0xE58E, 0x2268,

+    0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6, 0xE592, 0xE599, 0x4F12,

+    0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553, 0xE59C, 0xE59E, 0x4F1A,

+    0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D, 0xE5A1, 0xE5FE, 0x171D,

+    0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E, 0xE644, 0xE644, 0x2559,

+    0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97, 0xE64A, 0xE64A, 0x2555,

+    0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D, 0xE64F, 0xE651, 0x4F28,

+    0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B, 0xE656, 0xE656, 0x207C,

+    0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A, 0xE659, 0xE65A, 0x4F2F,

+    0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31, 0xE65E, 0xE65E, 0x1E34,

+    0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E, 0xE66A, 0xE66A, 0x4F3D,

+    0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E, 0xE675, 0xE675, 0x21A2,

+    0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47, 0xE679, 0xE679, 0x2563,

+    0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49, 0xE67C, 0xE67C, 0x252E,

+    0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A, 0xE680, 0xE680, 0x1F1B,

+    0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283, 0xE683, 0xE683, 0x4F4C,

+    0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D, 0xE687, 0xE687, 0x20A0,

+    0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565, 0xE68A, 0xE68B, 0x4F50,

+    0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52, 0xE693, 0xE693, 0x2562,

+    0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C, 0xE698, 0xE69A, 0x4F5B,

+    0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020, 0xE69D, 0xE69E, 0x4F5E,

+    0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A, 0xE6A1, 0xE6FE, 0x177B,

+    0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E, 0xE744, 0xE747, 0x4F63,

+    0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C, 0xE74A, 0xE74C, 0x4F67,

+    0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B, 0xE750, 0xE750, 0x1E6F,

+    0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4, 0xE753, 0xE753, 0x2567,

+    0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B, 0xE756, 0xE758, 0x4F6C,

+    0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F, 0xE766, 0xE766, 0x252B,

+    0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571, 0xE769, 0xE769, 0x4F7C,

+    0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D, 0xE774, 0xE774, 0x2522,

+    0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533, 0xE77D, 0xE77E, 0x4F8D,

+    0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A, 0xE783, 0xE783, 0x4F91,

+    0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573, 0xE786, 0xE786, 0x256F,

+    0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293, 0xE78B, 0xE78B, 0x2578,

+    0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570, 0xE790, 0xE791, 0x4F98,

+    0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A, 0xE798, 0xE799, 0x2541,

+    0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F, 0xE7A0, 0xE7A0, 0x201A,

+    0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4, 0xE843, 0xE843, 0x257A,

+    0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7, 0xE846, 0xE846, 0x2177,

+    0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B, 0xE84A, 0xE84A, 0x4FAA,

+    0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB, 0xE84F, 0xE84F, 0x257B,

+    0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3, 0xE855, 0xE859, 0x4FB2,

+    0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7, 0xE85C, 0xE85C, 0x2566,

+    0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93, 0xE863, 0xE863, 0x4FBD,

+    0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE, 0xE870, 0xE870, 0x2514,

+    0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D, 0xE874, 0xE874, 0x4FCB,

+    0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC, 0xE87C, 0xE87C, 0x2574,

+    0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E, 0xE881, 0xE881, 0x4FD4,

+    0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5, 0xE887, 0xE887, 0x209F,

+    0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576, 0xE88A, 0xE88B, 0x4FDA,

+    0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF, 0xE88E, 0xE88E, 0x261C,

+    0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC, 0xE8A1, 0xE8FE, 0x1837,

+    0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75, 0xE94D, 0xE953, 0x4FF9,

+    0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000, 0xE956, 0xE956, 0x23BF,

+    0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001, 0xE95A, 0xE95A, 0x23C0,

+    0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45, 0xE95E, 0xE95E, 0x5005,

+    0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4, 0xE961, 0xE961, 0x5006,

+    0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104, 0xE964, 0xE964, 0x5007,

+    0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008, 0xE967, 0xE967, 0x1F87,

+    0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009, 0xE96C, 0xE96C, 0x2269,

+    0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43, 0xE976, 0xE976, 0x5014,

+    0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679, 0xE979, 0xE979, 0x1EEB,

+    0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35, 0xE97D, 0xE97D, 0x208A,

+    0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7, 0xE981, 0xE981, 0x23C9,

+    0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018, 0xE987, 0xE987, 0x224F,

+    0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB, 0xE98C, 0xE98D, 0x501F,

+    0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021, 0xE990, 0xE990, 0x21F7,

+    0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE, 0xE993, 0xE993, 0x23CA,

+    0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022, 0xE998, 0xE998, 0x23D0,

+    0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C, 0xE99C, 0xE99C, 0x5027,

+    0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028, 0xE99F, 0xE99F, 0x1FEE,

+    0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895, 0xEA40, 0xEA40, 0x1FF8,

+    0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3, 0xEA45, 0xEA47, 0x502C,

+    0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4, 0xEA4A, 0xEA4A, 0x1E98,

+    0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C, 0xEA51, 0xEA51, 0x5034,

+    0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035, 0xEA55, 0xEA55, 0x1E71,

+    0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037, 0xEA59, 0xEA59, 0x23C5,

+    0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A, 0xEA81, 0xEA83, 0x505E,

+    0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061, 0xEA87, 0xEA87, 0x2284,

+    0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C, 0xEA8F, 0xEA8F, 0x5069,

+    0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D, 0xEA92, 0xEA95, 0x506A,

+    0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E, 0xEAA0, 0xEAA0, 0x1ED9,

+    0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077, 0xEB41, 0xEB41, 0x1FB2,

+    0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252, 0xEB46, 0xEB47, 0x507B,

+    0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D, 0xEB53, 0xEB53, 0x2157,

+    0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF, 0xEB56, 0xEB5A, 0x5088,

+    0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D, 0xEB5D, 0xEB5D, 0x203D,

+    0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015, 0xEB61, 0xEB61, 0x5090,

+    0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091, 0xEB6D, 0xEB6D, 0x2156,

+    0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144, 0xEB71, 0xEB71, 0x509D,

+    0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257, 0xEB74, 0xEB77, 0x509E,

+    0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092, 0xEB7A, 0xEB7E, 0x50A2,

+    0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250, 0xEB86, 0xEB89, 0x50AC,

+    0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0, 0xEBA1, 0xEBFE, 0x1951,

+    0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8, 0xEC47, 0xEC55, 0x50CC,

+    0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB, 0xEC5A, 0xEC5A, 0x260C,

+    0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E, 0xEC5D, 0xEC5F, 0x50DF,

+    0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2, 0xEC6E, 0xEC6E, 0x260B,

+    0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3, 0xEC77, 0xEC7E, 0x50F6,

+    0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23, 0xEC97, 0xECA0, 0x5114,

+    0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E, 0xED46, 0xED46, 0x2695,

+    0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E, 0xED59, 0xED5D, 0x5135,

+    0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A, 0xED61, 0xED61, 0x2692,

+    0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F, 0xED65, 0xED65, 0x513E,

+    0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD, 0xED68, 0xED6D, 0x513F,

+    0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145, 0xED74, 0xED74, 0x2465,

+    0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467, 0xED78, 0xED78, 0x514C,

+    0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D, 0xED80, 0xED90, 0x5152,

+    0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163, 0xED93, 0xED93, 0x2209,

+    0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9, 0xED96, 0xED96, 0x5164,

+    0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146, 0xED99, 0xED99, 0x25C5,

+    0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165, 0xED9C, 0xED9C, 0x245E,

+    0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F, 0xED9F, 0xED9F, 0x5167,

+    0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D, 0xEE40, 0xEE40, 0x25C7,

+    0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A, 0xEE43, 0xEE43, 0x1E2F,

+    0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168, 0xEE48, 0xEE48, 0x20BF,

+    0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B, 0xEE4D, 0xEE4D, 0x25C9,

+    0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8, 0xEE53, 0xEE54, 0x5172,

+    0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174, 0xEE57, 0xEE57, 0x25CB,

+    0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D, 0xEE5F, 0xEE60, 0x517B,

+    0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D, 0xEE68, 0xEE68, 0x25CC,

+    0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183, 0xEE6C, 0xEE6C, 0x20B9,

+    0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181, 0xEE6F, 0xEE76, 0x5186,

+    0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E, 0xEE7D, 0xEE7D, 0x2173,

+    0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD, 0xEE81, 0xEE84, 0x5193,

+    0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6, 0xEE87, 0xEE89, 0x5197,

+    0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1, 0xEE8C, 0xEE8C, 0x519A,

+    0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B, 0xEE90, 0xEE90, 0x2008,

+    0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0, 0xEE95, 0xEE96, 0x51A0,

+    0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2, 0xEE99, 0xEE99, 0x1F2A,

+    0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72, 0xEE9E, 0xEE9E, 0x25D3,

+    0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B, 0xEF40, 0xEF40, 0x21BE,

+    0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044, 0xEF43, 0xEF43, 0x51A8,

+    0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3, 0xEF46, 0xEF4B, 0x51A9,

+    0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF, 0xEF52, 0xEF53, 0x24CC,

+    0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698, 0xEF56, 0xEF56, 0x51B5,

+    0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6, 0xEF5A, 0xEF5A, 0x24CE,

+    0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF, 0xEF61, 0xEF67, 0x51BD,

+    0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4, 0xEF6A, 0xEF6A, 0x24D0,

+    0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1, 0xEF6D, 0xEF76, 0x51C6,

+    0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0, 0xEF7A, 0xEF7A, 0x239B,

+    0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E, 0xEF7D, 0xEF7E, 0x51D3,

+    0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D, 0xEF83, 0xEF84, 0x239F,

+    0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1, 0xEF87, 0xEF87, 0x51D8,

+    0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9, 0xEF8B, 0xEF8B, 0x221E,

+    0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2, 0xEF8E, 0xEF94, 0x51DC,

+    0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36, 0xEF97, 0xEF97, 0x2135,

+    0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD, 0xEF9D, 0xEF9D, 0x51E7,

+    0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8, 0xEFA1, 0xEFFE, 0x1AC9,

+    0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3, 0xF042, 0xF042, 0x2203,

+    0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7, 0xF045, 0xF046, 0x51EC,

+    0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097, 0xF049, 0xF049, 0x1EE4,

+    0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238, 0xF04F, 0xF050, 0x51F2,

+    0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4, 0xF054, 0xF054, 0x1F9A,

+    0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3, 0xF058, 0xF05D, 0x51F8,

+    0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE, 0xF068, 0xF068, 0x239C,

+    0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6, 0xF06D, 0xF070, 0x520A,

+    0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E, 0xF073, 0xF073, 0x2035,

+    0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F, 0xF078, 0xF078, 0x23A8,

+    0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075, 0xF07B, 0xF07C, 0x5213,

+    0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB, 0xF081, 0xF081, 0x1FEB,

+    0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215, 0xF087, 0xF087, 0x1F6A,

+    0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219, 0xF08B, 0xF08B, 0x2666,

+    0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667, 0xF091, 0xF091, 0x521F,

+    0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220, 0xF096, 0xF096, 0x23AD,

+    0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27, 0xF140, 0xF151, 0x522D,

+    0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242, 0xF154, 0xF154, 0x1F02,

+    0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183, 0xF158, 0xF158, 0x5241,

+    0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9, 0xF15B, 0xF166, 0x5242,

+    0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E, 0xF176, 0xF176, 0x22A5,

+    0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA, 0xF179, 0xF179, 0x525C,

+    0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82, 0xF17C, 0xF17D, 0x525D,

+    0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404, 0xF181, 0xF181, 0x525F,

+    0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260, 0xF184, 0xF184, 0x2184,

+    0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403, 0xF187, 0xF187, 0x5262,

+    0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B, 0xF18A, 0xF193, 0x5263,

+    0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D, 0xF198, 0xF198, 0x2067,

+    0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85, 0xF240, 0xF244, 0x5278,

+    0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D, 0xF247, 0xF247, 0x1E83,

+    0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F, 0xF24C, 0xF252, 0x5281,

+    0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7, 0xF255, 0xF255, 0x240D,

+    0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412, 0xF25D, 0xF25E, 0x528E,

+    0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290, 0xF271, 0xF271, 0x23F0,

+    0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411, 0xF274, 0xF274, 0x2414,

+    0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170, 0xF277, 0xF27B, 0x52A3,

+    0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C, 0xF27E, 0xF27E, 0x2415,

+    0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066, 0xF286, 0xF286, 0x52AD,

+    0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413, 0xF289, 0xF289, 0x2410,

+    0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1, 0xF28D, 0xF290, 0x52AE,

+    0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2, 0xF294, 0xF294, 0x2409,

+    0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418, 0xF297, 0xF29B, 0x52B5,

+    0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA, 0xF29E, 0xF29E, 0x21FC,

+    0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3, 0xF340, 0xF340, 0x1FC1,

+    0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD, 0xF345, 0xF345, 0x229C,

+    0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E, 0xF349, 0xF349, 0x52C2,

+    0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419, 0xF34C, 0xF34F, 0x52C3,

+    0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7, 0xF361, 0xF361, 0x1E29,

+    0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661, 0xF375, 0xF375, 0x52E9,

+    0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174, 0xF378, 0xF378, 0x2663,

+    0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA, 0xF380, 0xF38B, 0x52EF,

+    0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB, 0xF3A0, 0xF3A0, 0x214C,

+    0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E, 0xF445, 0xF445, 0x267A,

+    0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0, 0xF451, 0xF456, 0x531D,

+    0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323, 0xF459, 0xF459, 0x1ED0,

+    0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096, 0xF45C, 0xF45C, 0x5325,

+    0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326, 0xF462, 0xF462, 0x23C8,

+    0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E, 0xF465, 0xF474, 0x532B,

+    0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B, 0xF47C, 0xF47C, 0x2664,

+    0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239, 0xF480, 0xF493, 0x5342,

+    0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356, 0xF499, 0xF499, 0x261F,

+    0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E, 0xF49D, 0xF4A0, 0x535C,

+    0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360, 0xF545, 0xF545, 0x2620,

+    0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621, 0xF548, 0xF551, 0x5366,

+    0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370, 0xF554, 0xF554, 0x2627,

+    0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625, 0xF557, 0xF55D, 0x5371,

+    0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378, 0xF561, 0xF561, 0x262E,

+    0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A, 0xF56E, 0xF56E, 0x262A,

+    0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385, 0xF571, 0xF571, 0x2628,

+    0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386, 0xF580, 0xF584, 0x5392,

+    0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630, 0xF587, 0xF58B, 0x5397,

+    0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C, 0xF58E, 0xF58E, 0x200D,

+    0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D, 0xF599, 0xF599, 0x2645,

+    0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A, 0xF59C, 0xF59F, 0x53A7,

+    0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD, 0xF640, 0xF640, 0x53AB,

+    0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC, 0xF645, 0xF645, 0x263D,

+    0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF, 0xF648, 0xF648, 0x263E,

+    0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F, 0xF64C, 0xF64C, 0x1FC0,

+    0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B, 0xF650, 0xF653, 0x53B3,

+    0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7, 0xF658, 0xF658, 0x2644,

+    0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639, 0xF662, 0xF662, 0x53C2,

+    0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3, 0xF66C, 0xF66C, 0x2647,

+    0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB, 0xF671, 0xF671, 0x2649,

+    0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648, 0xF675, 0xF675, 0x53D0,

+    0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108, 0xF678, 0xF67E, 0x53D1,

+    0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D, 0xF686, 0xF687, 0x53DD,

+    0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF, 0xF68A, 0xF68A, 0x2651,

+    0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650, 0xF68E, 0xF68E, 0x2652,

+    0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F, 0xF693, 0xF695, 0x53E5,

+    0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E, 0xF698, 0xF698, 0x2653,

+    0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657, 0xF69B, 0xF69B, 0x53E9,

+    0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA, 0xF69E, 0xF69E, 0x2633,

+    0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656, 0xF6A1, 0xF6FE, 0x1D5B,

+    0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654, 0xF743, 0xF748, 0x53EE,

+    0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4, 0xF74C, 0xF74C, 0x2655,

+    0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6, 0xF756, 0xF756, 0x265B,

+    0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A, 0xF759, 0xF759, 0x53FF,

+    0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E, 0xF75C, 0xF75C, 0x262F,

+    0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646, 0xF762, 0xF762, 0x5404,

+    0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405, 0xF76B, 0xF76B, 0x265C,

+    0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C, 0xF772, 0xF77B, 0x5411,

+    0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B, 0xF77E, 0xF77E, 0x2631,

+    0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9, 0xF840, 0xF841, 0x543D,

+    0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F, 0xF846, 0xF846, 0x2580,

+    0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC, 0xF84A, 0xF84F, 0x5444,

+    0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B, 0xF852, 0xF852, 0x544A,

+    0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B, 0xF863, 0xF863, 0x2583,

+    0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A, 0xF866, 0xF866, 0x21EE,

+    0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182, 0xF873, 0xF877, 0x5466,

+    0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B, 0xF87A, 0xF87A, 0x2587,

+    0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588, 0xF87D, 0xF87E, 0x546D,

+    0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584, 0xF882, 0xF883, 0x5470,

+    0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472, 0xF886, 0xF886, 0x21EF,

+    0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A, 0xF88E, 0xF88E, 0x258C,

+    0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47, 0xF89A, 0xF89C, 0x5483,

+    0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486, 0xF8A0, 0xF8A0, 0x258D,

+    0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0, 0xF94F, 0xF94F, 0x2592,

+    0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496, 0xF959, 0xF959, 0x2594,

+    0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E, 0xF95D, 0xF95D, 0x2591,

+    0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0, 0xF967, 0xF967, 0x2597,

+    0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6, 0xF96A, 0xF96B, 0x54A9,

+    0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB, 0xF96F, 0xF96F, 0x20F6,

+    0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC, 0xF985, 0xF985, 0x2585,

+    0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599, 0xF988, 0xF990, 0x54C2,

+    0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB, 0xF996, 0xF996, 0x259A,

+    0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B, 0xF999, 0xF9A0, 0x54D0,

+    0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D, 0xFA43, 0xFA45, 0x54DA,

+    0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD, 0xFA4C, 0xFA4C, 0x234C,

+    0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44, 0xFA52, 0xFA57, 0x54E6,

+    0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0, 0xFA5A, 0xFA5C, 0x54EC,

+    0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF, 0xFA5F, 0xFA5F, 0x259F,

+    0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C, 0xFA62, 0xFA6F, 0x54F1,

+    0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF, 0xFA74, 0xFA74, 0x20AE,

+    0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B, 0xFA77, 0xFA77, 0x25A3,

+    0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A, 0xFA83, 0xFA83, 0x2589,

+    0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D, 0xFA8D, 0xFA8D, 0x25A4,

+    0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6, 0xFA91, 0xFA91, 0x2593,

+    0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7, 0xFA97, 0xFA97, 0x2222,

+    0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B, 0xFB40, 0xFB48, 0x5523,

+    0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C, 0xFB52, 0xFB52, 0x2586,

+    0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1, 0xFB58, 0xFB58, 0x25AA,

+    0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590, 0xFB5B, 0xFB5B, 0x258E,

+    0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688, 0xFB76, 0xFB78, 0x5552,

+    0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB, 0xFB7B, 0xFB7B, 0x5555,

+    0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4, 0xFB7E, 0xFB7E, 0x5556,

+    0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F, 0xFB91, 0xFB9B, 0x5567,

+    0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572, 0xFB9F, 0xFB9F, 0x25F7,

+    0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575, 0xFC44, 0xFC44, 0x2696,

+    0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F, 0xFC4A, 0xFC59, 0x557D,

+    0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D, 0xFC63, 0xFC63, 0x1EC1,

+    0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3, 0xFC69, 0xFC6E, 0x5599,

+    0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F, 0xFC71, 0xFC71, 0x268A,

+    0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669, 0xFC75, 0xFC76, 0x55A2,

+    0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4, 0xFC80, 0xFC82, 0x55AA,

+    0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD, 0xFC8A, 0xFC8A, 0x2673,

+    0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9, 0xFD52, 0xFD52, 0x20C6,

+    0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB, 0xFD57, 0xFD57, 0x24D3,

+    0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE, 0xFD5A, 0xFD5A, 0x260F,

+    0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611, 0xFD60, 0xFD61, 0x55E3,

+    0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5, 0xFD65, 0xFD65, 0x2610,

+    0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030, 0xFD68, 0xFD68, 0x55E7,

+    0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8, 0xFD6C, 0xFD6C, 0x2614,

+    0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616, 0xFD71, 0xFD71, 0x55ED,

+    0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE, 0xFD78, 0xFD78, 0x20F2,

+    0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617, 0xFD7E, 0xFD7E, 0x55F7,

+    0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037, 0xFD89, 0xFD8A, 0x5600,

+    0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602, 0xFD8F, 0xFD8F, 0x1F22,

+    0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605, 0xFD94, 0xFD94, 0x1F34,

+    0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02, 0xFD9E, 0xFD9E, 0x40D3,

+    0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083, 0xFE40, 0xFE40, 0x1259,

+    0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-V_2.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-V_2.cpp
new file mode 100644
index 0000000..97d9798
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-V_2.cpp
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBKp_EUC_V_2[20 * 3] = {
+    0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,
+    0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,
+    0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,
+    0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,
+    0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,
+    0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,
+    0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp
new file mode 100644
index 0000000..1b3e072
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp
@@ -0,0 +1,39 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_GBpc_EUC_H_0[91 * 3] = {

+    0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x1E20, 0x00FD, 0x00FF, 0x1E21,

+    0xA1A1, 0xA1FE, 0x0060, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0,

+    0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164,

+    0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225,

+    0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, 0xA8A1, 0xA8C0, 0x029C,

+    0xA8C5, 0xA8EA, 0x02BC, 0xA9A4, 0xA9EF, 0x02E2, 0xAAA1, 0xAAFE, 0x032E,

+    0xABA1, 0xABC0, 0x038C, 0xB0A1, 0xB0FE, 0x03AC, 0xB1A1, 0xB1FE, 0x040A,

+    0xB2A1, 0xB2FE, 0x0468, 0xB3A1, 0xB3FE, 0x04C6, 0xB4A1, 0xB4FE, 0x0524,

+    0xB5A1, 0xB5FE, 0x0582, 0xB6A1, 0xB6FE, 0x05E0, 0xB7A1, 0xB7FE, 0x063E,

+    0xB8A1, 0xB8FE, 0x069C, 0xB9A1, 0xB9FE, 0x06FA, 0xBAA1, 0xBAFE, 0x0758,

+    0xBBA1, 0xBBFE, 0x07B6, 0xBCA1, 0xBCFE, 0x0814, 0xBDA1, 0xBDFE, 0x0872,

+    0xBEA1, 0xBEFE, 0x08D0, 0xBFA1, 0xBFFE, 0x092E, 0xC0A1, 0xC0FE, 0x098C,

+    0xC1A1, 0xC1FE, 0x09EA, 0xC2A1, 0xC2FE, 0x0A48, 0xC3A1, 0xC3FE, 0x0AA6,

+    0xC4A1, 0xC4FE, 0x0B04, 0xC5A1, 0xC5FE, 0x0B62, 0xC6A1, 0xC6FE, 0x0BC0,

+    0xC7A1, 0xC7FE, 0x0C1E, 0xC8A1, 0xC8FE, 0x0C7C, 0xC9A1, 0xC9FE, 0x0CDA,

+    0xCAA1, 0xCAFE, 0x0D38, 0xCBA1, 0xCBFE, 0x0D96, 0xCCA1, 0xCCFE, 0x0DF4,

+    0xCDA1, 0xCDFE, 0x0E52, 0xCEA1, 0xCEFE, 0x0EB0, 0xCFA1, 0xCFFE, 0x0F0E,

+    0xD0A1, 0xD0FE, 0x0F6C, 0xD1A1, 0xD1FE, 0x0FCA, 0xD2A1, 0xD2FE, 0x1028,

+    0xD3A1, 0xD3FE, 0x1086, 0xD4A1, 0xD4FE, 0x10E4, 0xD5A1, 0xD5FE, 0x1142,

+    0xD6A1, 0xD6FE, 0x11A0, 0xD7A1, 0xD7F9, 0x11FE, 0xD8A1, 0xD8FE, 0x1257,

+    0xD9A1, 0xD9FE, 0x12B5, 0xDAA1, 0xDAFE, 0x1313, 0xDBA1, 0xDBFE, 0x1371,

+    0xDCA1, 0xDCFE, 0x13CF, 0xDDA1, 0xDDFE, 0x142D, 0xDEA1, 0xDEFE, 0x148B,

+    0xDFA1, 0xDFFE, 0x14E9, 0xE0A1, 0xE0FE, 0x1547, 0xE1A1, 0xE1FE, 0x15A5,

+    0xE2A1, 0xE2FE, 0x1603, 0xE3A1, 0xE3FE, 0x1661, 0xE4A1, 0xE4FE, 0x16BF,

+    0xE5A1, 0xE5FE, 0x171D, 0xE6A1, 0xE6FE, 0x177B, 0xE7A1, 0xE7FE, 0x17D9,

+    0xE8A1, 0xE8FE, 0x1837, 0xE9A1, 0xE9FE, 0x1895, 0xEAA1, 0xEAFE, 0x18F3,

+    0xEBA1, 0xEBFE, 0x1951, 0xECA1, 0xECFE, 0x19AF, 0xEDA1, 0xEDFE, 0x1A0D,

+    0xEEA1, 0xEEFE, 0x1A6B, 0xEFA1, 0xEFFE, 0x1AC9, 0xF0A1, 0xF0FE, 0x1B27,

+    0xF1A1, 0xF1FE, 0x1B85, 0xF2A1, 0xF2FE, 0x1BE3, 0xF3A1, 0xF3FE, 0x1C41,

+    0xF4A1, 0xF4FE, 0x1C9F, 0xF5A1, 0xF5FE, 0x1CFD, 0xF6A1, 0xF6FE, 0x1D5B,

+    0xF7A1, 0xF7FE, 0x1DB9,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp
new file mode 100644
index 0000000..be469f2
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_GBpc_EUC_V_0[20 * 3] = {

+    0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,

+    0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,

+    0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,

+    0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,

+    0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,

+    0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,

+    0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp
new file mode 100644
index 0000000..3000372
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp
@@ -0,0 +1,4617 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_UniGB_UCS2_H_4[13825 * 3] = {

+    0x0020, 0x007E, 0x0001, 0x00A4, 0x00A4, 0x00A7, 0x00A5, 0x00A5, 0x5752,

+    0x00A7, 0x00A7, 0x00AB, 0x00A8, 0x00A8, 0x0066, 0x00B0, 0x00B0, 0x00A2,

+    0x00B1, 0x00B1, 0x007F, 0x00D7, 0x00D7, 0x0080, 0x00E0, 0x00E0, 0x029F,

+    0x00E1, 0x00E1, 0x029D, 0x00E8, 0x00E8, 0x02A3, 0x00E9, 0x00E9, 0x02A1,

+    0x00EA, 0x00EA, 0x02B5, 0x00EC, 0x00EC, 0x02A7, 0x00ED, 0x00ED, 0x02A5,

+    0x00F2, 0x00F2, 0x02AB, 0x00F3, 0x00F3, 0x02A9, 0x00F7, 0x00F7, 0x0081,

+    0x00F9, 0x00F9, 0x02AF, 0x00FA, 0x00FA, 0x02AD, 0x00FC, 0x00FC, 0x02B4,

+    0x0101, 0x0101, 0x029C, 0x0113, 0x0113, 0x02A0, 0x011B, 0x011B, 0x02A2,

+    0x012B, 0x012B, 0x02A4, 0x014D, 0x014D, 0x02A8, 0x016B, 0x016B, 0x02AC,

+    0x01CE, 0x01CE, 0x029E, 0x01D0, 0x01D0, 0x02A6, 0x01D2, 0x01D2, 0x02AA,

+    0x01D4, 0x01D4, 0x02AE, 0x01D6, 0x01D6, 0x02B0, 0x01D8, 0x01D8, 0x02B1,

+    0x01DA, 0x01DA, 0x02B2, 0x01DC, 0x01DC, 0x02B3, 0x01F9, 0x01F9, 0x02BA,

+    0x02C7, 0x02C7, 0x0065, 0x02C9, 0x02C9, 0x0064, 0x02CA, 0x02CB, 0x26B3,

+    0x02D9, 0x02D9, 0x26B5, 0x0391, 0x03A1, 0x020D, 0x03A3, 0x03A9, 0x021E,

+    0x03B1, 0x03C1, 0x0225, 0x03C3, 0x03C9, 0x0236, 0x0401, 0x0401, 0x0260,

+    0x0410, 0x0415, 0x025A, 0x0416, 0x0435, 0x0261, 0x0436, 0x044F, 0x0282,

+    0x0451, 0x0451, 0x0281, 0x1E3F, 0x1E3F, 0x02B7, 0x2010, 0x2010, 0x2722,

+    0x2013, 0x2013, 0x26B6, 0x2014, 0x2014, 0x0069, 0x2015, 0x2015, 0x26B7,

+    0x2016, 0x2016, 0x006B, 0x2018, 0x2019, 0x006D, 0x201C, 0x201D, 0x006F,

+    0x2025, 0x2025, 0x26B8, 0x2026, 0x2026, 0x006C, 0x2030, 0x2030, 0x00AA,

+    0x2032, 0x2033, 0x00A3, 0x2035, 0x2035, 0x26B9, 0x203B, 0x203B, 0x00B8,

+    0x20AC, 0x20AC, 0x5751, 0x2103, 0x2103, 0x00A5, 0x2105, 0x2105, 0x26BA,

+    0x2109, 0x2109, 0x26BB, 0x2116, 0x2116, 0x00AC, 0x2121, 0x2121, 0x2720,

+    0x2160, 0x216B, 0x00FA, 0x2170, 0x2179, 0x26A9, 0x2190, 0x2191, 0x00BA,

+    0x2192, 0x2192, 0x00B9, 0x2193, 0x2193, 0x00BC, 0x2196, 0x2199, 0x26BC,

+    0x2208, 0x2208, 0x0089, 0x220F, 0x220F, 0x0086, 0x2211, 0x2211, 0x0085,

+    0x2215, 0x2215, 0x26C0, 0x221A, 0x221A, 0x008B, 0x221D, 0x221D, 0x0097,

+    0x221E, 0x221E, 0x009D, 0x221F, 0x221F, 0x26C1, 0x2220, 0x2220, 0x008E,

+    0x2223, 0x2223, 0x26C2, 0x2225, 0x2225, 0x008D, 0x2227, 0x2228, 0x0083,

+    0x2229, 0x2229, 0x0088, 0x222A, 0x222A, 0x0087, 0x222B, 0x222B, 0x0091,

+    0x222E, 0x222E, 0x0092, 0x2234, 0x2234, 0x009F, 0x2235, 0x2235, 0x009E,

+    0x2236, 0x2236, 0x0082, 0x2237, 0x2237, 0x008A, 0x223D, 0x223D, 0x0096,

+    0x2248, 0x2248, 0x0095, 0x224C, 0x224C, 0x0094, 0x2252, 0x2252, 0x26C3,

+    0x2260, 0x2260, 0x0098, 0x2261, 0x2261, 0x0093, 0x2264, 0x2265, 0x009B,

+    0x2266, 0x2267, 0x26C4, 0x226E, 0x226F, 0x0099, 0x2295, 0x2295, 0x2704,

+    0x2299, 0x2299, 0x0090, 0x22A5, 0x22A5, 0x008C, 0x22BF, 0x22BF, 0x26C6,

+    0x22EF, 0x22EF, 0x006C, 0x2312, 0x2312, 0x008F, 0x2460, 0x2469, 0x00E6,

+    0x2474, 0x2487, 0x00D2, 0x2488, 0x249B, 0x00BE, 0x2500, 0x254B, 0x02E2,

+    0x2550, 0x2573, 0x26C7, 0x2581, 0x258F, 0x26EB, 0x2593, 0x2595, 0x26FA,

+    0x25A0, 0x25A0, 0x00B5, 0x25A1, 0x25A1, 0x00B4, 0x25B2, 0x25B2, 0x00B7,

+    0x25B3, 0x25B3, 0x00B6, 0x25BC, 0x25BD, 0x26FD, 0x25C6, 0x25C6, 0x00B3,

+    0x25C7, 0x25C7, 0x00B2, 0x25CB, 0x25CB, 0x00AF, 0x25CE, 0x25CE, 0x00B1,

+    0x25CF, 0x25CF, 0x00B0, 0x25E2, 0x25E5, 0x26FF, 0x2605, 0x2605, 0x00AE,

+    0x2606, 0x2606, 0x00AD, 0x2609, 0x2609, 0x2703, 0x2640, 0x2640, 0x00A1,

+    0x2642, 0x2642, 0x00A0, 0x2E80, 0x2E80, 0x579C, 0x2E81, 0x2E81, 0x561F,

+    0x2E82, 0x2E83, 0x579D, 0x2E84, 0x2E84, 0x5623, 0x2E85, 0x2E87, 0x579F,

+    0x2E88, 0x2E88, 0x5626, 0x2E89, 0x2E8A, 0x57A2, 0x2E8B, 0x2E8B, 0x5627,

+    0x2E8C, 0x2E8C, 0x562C, 0x2E8D, 0x2E96, 0x57A4, 0x2E97, 0x2E97, 0x562D,

+    0x2E98, 0x2E99, 0x57AE, 0x2E9B, 0x2EA6, 0x57B0, 0x2EA7, 0x2EA7, 0x563A,

+    0x2EA8, 0x2EA9, 0x57BC, 0x2EAA, 0x2EAA, 0x563D, 0x2EAB, 0x2EAD, 0x57BE,

+    0x2EAE, 0x2EAE, 0x5640, 0x2EAF, 0x2EB2, 0x57C1, 0x2EB3, 0x2EB3, 0x5642,

+    0x2EB4, 0x2EB5, 0x57C5, 0x2EB6, 0x2EB7, 0x5643, 0x2EB8, 0x2EBA, 0x57C7,

+    0x2EBB, 0x2EBB, 0x5648, 0x2EBC, 0x2EC9, 0x57CA, 0x2ECA, 0x2ECA, 0x5652,

+    0x2ECB, 0x2EF3, 0x57D8, 0x2F00, 0x2F00, 0x1042, 0x2F01, 0x2F01, 0x1263,

+    0x2F02, 0x2F02, 0x1272, 0x2F03, 0x2F03, 0x1265, 0x2F04, 0x2F04, 0x1059,

+    0x2F05, 0x2F05, 0x2793, 0x2F06, 0x2F06, 0x063D, 0x2F07, 0x2F07, 0x1303,

+    0x2F08, 0x2F08, 0x0CA6, 0x2F09, 0x2F09, 0x0638, 0x2F0A, 0x2F0A, 0x0CC6,

+    0x2F0B, 0x2F0B, 0x03D6, 0x2F0C, 0x2F0C, 0x129D, 0x2F0D, 0x2F0D, 0x1314,

+    0x2F0E, 0x2F0E, 0x130F, 0x2F0F, 0x2F0F, 0x082B, 0x2F10, 0x2F10, 0x1399,

+    0x2F11, 0x2F11, 0x0597, 0x2F12, 0x2F12, 0x09EF, 0x2F13, 0x2F13, 0x12FC,

+    0x2F14, 0x2F14, 0x1266, 0x2F15, 0x2F15, 0x1284, 0x2F16, 0x2F16, 0x2A1A,

+    0x2F17, 0x2F17, 0x0D45, 0x2F18, 0x2F18, 0x047E, 0x2F19, 0x2F19, 0x1352,

+    0x2F1A, 0x2F1A, 0x04CC, 0x2F1B, 0x2F1B, 0x139C, 0x2F1C, 0x2F1C, 0x10BB,

+    0x2F1D, 0x2F1D, 0x0967, 0x2F1E, 0x2F1E, 0x1593, 0x2F1F, 0x2F1F, 0x0E72,

+    0x2F20, 0x2F20, 0x0D56, 0x2F21, 0x2F21, 0x161C, 0x2F22, 0x2F22, 0x2D2D,

+    0x2F23, 0x2F23, 0x0F13, 0x2F24, 0x2F24, 0x0576, 0x2F25, 0x2F25, 0x0B6F,

+    0x2F26, 0x2F26, 0x1230, 0x2F27, 0x2F27, 0x172E, 0x2F28, 0x2F28, 0x056A,

+    0x2F29, 0x2F29, 0x0F6C, 0x2F2A, 0x2F2A, 0x14B6, 0x2F2B, 0x2F2B, 0x0D43,

+    0x2F2C, 0x2F2C, 0x1774, 0x2F2D, 0x2F2D, 0x0CF6, 0x2F2E, 0x2F2E, 0x1815,

+    0x2F2F, 0x2F2F, 0x06FD, 0x2F30, 0x2F30, 0x082D, 0x2F31, 0x2F31, 0x08BE,

+    0x2F32, 0x2F32, 0x06C4, 0x2F33, 0x2F33, 0x1813, 0x2F34, 0x2F34, 0x073C,

+    0x2F35, 0x2F35, 0x1398, 0x2F36, 0x2F36, 0x14AD, 0x2F37, 0x2F37, 0x14F6,

+    0x2F38, 0x2F38, 0x0706, 0x2F39, 0x2F39, 0x1762, 0x2F3A, 0x2F3A, 0x15EE,

+    0x2F3B, 0x2F3B, 0x15E0, 0x2F3C, 0x2F3C, 0x0F8F, 0x2F3D, 0x2F3D, 0x06E5,

+    0x2F3E, 0x2F3E, 0x3292, 0x2F3F, 0x2F3F, 0x0D6D, 0x2F40, 0x2F40, 0x11A6,

+    0x2F41, 0x2F41, 0x1909, 0x2F42, 0x2F42, 0x0ED3, 0x2F43, 0x2F43, 0x05F6,

+    0x2F44, 0x2F44, 0x08C0, 0x2F45, 0x2F45, 0x065A, 0x2F46, 0x2F46, 0x0EED,

+    0x2F47, 0x2F47, 0x0CB0, 0x2F48, 0x2F48, 0x10FE, 0x2F49, 0x2F49, 0x1105,

+    0x2F4A, 0x2F4A, 0x0B21, 0x2F4B, 0x2F4B, 0x0C34, 0x2F4C, 0x2F4C, 0x11B8,

+    0x2F4D, 0x2F4D, 0x0578, 0x2F4E, 0x2F4E, 0x19BD, 0x2F4F, 0x2F4F, 0x0EF2,

+    0x2F50, 0x2F50, 0x0431, 0x2F51, 0x2F51, 0x0AB0, 0x2F52, 0x2F52, 0x0D66,

+    0x2F53, 0x2F53, 0x0C17, 0x2F54, 0x2F54, 0x0DA3, 0x2F55, 0x2F55, 0x0805,

+    0x2F56, 0x2F56, 0x1203, 0x2F57, 0x2F57, 0x06B3, 0x2F58, 0x2F58, 0x1269,

+    0x2F59, 0x2F59, 0x169D, 0x2F5A, 0x2F5A, 0x0BCB, 0x2F5B, 0x2F5B, 0x0FE9,

+    0x2F5C, 0x2F5C, 0x0B64, 0x2F5D, 0x2F5D, 0x0C89, 0x2F5E, 0x2F5E, 0x0FC9,

+    0x2F5F, 0x2F5F, 0x10D6, 0x2F60, 0x2F60, 0x0728, 0x2F61, 0x2F61, 0x0E90,

+    0x2F62, 0x2F62, 0x06C5, 0x2F63, 0x2F63, 0x0D33, 0x2F64, 0x2F64, 0x10A8,

+    0x2F65, 0x2F65, 0x0E42, 0x2F66, 0x2F66, 0x1BC6, 0x2F67, 0x2F67, 0x1B60,

+    0x2F68, 0x2F68, 0x3EBF, 0x2F69, 0x2F69, 0x03E2, 0x2F6A, 0x2F6A, 0x0BC3,

+    0x2F6B, 0x2F6B, 0x0AF8, 0x2F6C, 0x2F6C, 0x0B22, 0x2F6D, 0x2F6D, 0x0AB1,

+    0x2F6E, 0x2F6E, 0x0D4F, 0x2F6F, 0x2F6F, 0x0D46, 0x2F70, 0x2F70, 0x0D55,

+    0x2F71, 0x2F71, 0x40CB, 0x2F72, 0x2F72, 0x0783, 0x2F73, 0x2F73, 0x0FD1,

+    0x2F74, 0x2F74, 0x09EB, 0x2F75, 0x2F75, 0x11F0, 0x2F76, 0x2F76, 0x0ADC,

+    0x2F77, 0x2F77, 0x1CE7, 0x2F78, 0x2F78, 0x1C5E, 0x2F79, 0x2F79, 0x0EA9,

+    0x2F7A, 0x2F7A, 0x101B, 0x2F7B, 0x2F7B, 0x10D5, 0x2F7C, 0x2F7C, 0x09BA,

+    0x2F7D, 0x2F7D, 0x0637, 0x2F7E, 0x2F7E, 0x1BCB, 0x2F7F, 0x2F7F, 0x0639,

+    0x2F80, 0x2F80, 0x1A1E, 0x2F81, 0x2F81, 0x0CBD, 0x2F82, 0x2F82, 0x04E1,

+    0x2F83, 0x2F83, 0x1231, 0x2F84, 0x2F84, 0x11C0, 0x2F85, 0x2F85, 0x08F9,

+    0x2F86, 0x2F86, 0x0D19, 0x2F87, 0x2F87, 0x1618, 0x2F88, 0x2F88, 0x11DA,

+    0x2F89, 0x2F89, 0x1CDC, 0x2F8A, 0x2F8A, 0x0CE4, 0x2F8B, 0x2F8B, 0x45A2,

+    0x2F8C, 0x2F8C, 0x1BF0, 0x2F8D, 0x2F8D, 0x050B, 0x2F8E, 0x2F8E, 0x0FD3,

+    0x2F8F, 0x2F8F, 0x0F9B, 0x2F90, 0x2F90, 0x1049, 0x2F91, 0x2F91, 0x49DC,

+    0x2F92, 0x2F92, 0x1F96, 0x2F93, 0x2F93, 0x0898, 0x2F94, 0x2F94, 0x0FFD,

+    0x2F95, 0x2F95, 0x0721, 0x2F96, 0x2F96, 0x05F8, 0x2F97, 0x2F97, 0x1D15,

+    0x2F98, 0x2F98, 0x1D50, 0x2F99, 0x2F99, 0x1E3B, 0x2F9A, 0x2F9A, 0x0505,

+    0x2F9B, 0x2F9B, 0x123C, 0x2F9C, 0x2F9C, 0x1240, 0x2F9D, 0x2F9D, 0x0D26,

+    0x2F9E, 0x2F9E, 0x1E7B, 0x2F9F, 0x2F9F, 0x0F8C, 0x2FA0, 0x2FA0, 0x04E2,

+    0x2FA1, 0x2FA1, 0x4D13, 0x2FA2, 0x2FA2, 0x105F, 0x2FA3, 0x2FA3, 0x10B4,

+    0x2FA4, 0x2FA4, 0x4E18, 0x2FA5, 0x2FA5, 0x09DA, 0x2FA6, 0x2FA6, 0x08C1,

+    0x2FA7, 0x2FA7, 0x1E75, 0x2FA8, 0x2FA8, 0x207D, 0x2FA9, 0x2FA9, 0x06B2,

+    0x2FAA, 0x2FAA, 0x09EE, 0x2FAB, 0x2FAB, 0x1D79, 0x2FAC, 0x2FAC, 0x10CF,

+    0x2FAD, 0x2FAD, 0x50EA, 0x2FAE, 0x2FAE, 0x0664, 0x2FAF, 0x2FAF, 0x0AEB,

+    0x2FB0, 0x2FB0, 0x06EA, 0x2FB1, 0x2FB1, 0x218D, 0x2FB2, 0x2FB2, 0x08F1,

+    0x2FB3, 0x2FB3, 0x107B, 0x2FB4, 0x2FB4, 0x2209, 0x2FB5, 0x2FB5, 0x1F00,

+    0x2FB6, 0x2FB6, 0x1EF4, 0x2FB7, 0x2FB7, 0x0D4A, 0x2FB8, 0x2FB8, 0x0D6E,

+    0x2FB9, 0x2FB9, 0x0F50, 0x2FBA, 0x2FBA, 0x206D, 0x2FBB, 0x2FBB, 0x0720,

+    0x2FBC, 0x2FBC, 0x06DA, 0x2FBD, 0x2FBD, 0x1DEC, 0x2FBE, 0x2FBE, 0x1ED0,

+    0x2FBF, 0x2FBF, 0x139B, 0x2FC0, 0x2FC0, 0x1260, 0x2FC1, 0x2FC1, 0x0746,

+    0x2FC2, 0x2FC2, 0x2239, 0x2FC3, 0x2FC3, 0x209C, 0x2FC4, 0x2FC4, 0x2688,

+    0x2FC5, 0x2FC5, 0x0A60, 0x2FC6, 0x2FC6, 0x2071, 0x2FC7, 0x2FC7, 0x0A90,

+    0x2FC8, 0x2FC8, 0x5586, 0x2FC9, 0x2FC9, 0x0D89, 0x2FCA, 0x2FCA, 0x0791,

+    0x2FCB, 0x2FCB, 0x1A55, 0x2FCC, 0x2FCC, 0x2618, 0x2FCD, 0x2FCD, 0x05E5,

+    0x2FCE, 0x2FCE, 0x071D, 0x2FCF, 0x2FCF, 0x0D8A, 0x2FD0, 0x2FD0, 0x0430,

+    0x2FD1, 0x2FD1, 0x20C6, 0x2FD2, 0x2FD2, 0x1E86, 0x2FD3, 0x2FD3, 0x2037,

+    0x2FD4, 0x2FD4, 0x1F34, 0x2FD5, 0x2FD5, 0x12F3, 0x2FF0, 0x2FFB, 0x274C,

+    0x3000, 0x3002, 0x0060, 0x3003, 0x3003, 0x0067, 0x3005, 0x3005, 0x0068,

+    0x3006, 0x3006, 0x2728, 0x3007, 0x3007, 0x1E17, 0x3008, 0x300F, 0x0073,

+    0x3010, 0x3011, 0x007D, 0x3012, 0x3012, 0x2705, 0x3013, 0x3013, 0x00BD,

+    0x3014, 0x3015, 0x0071, 0x3016, 0x3017, 0x007B, 0x301D, 0x301E, 0x2706,

+    0x3021, 0x3029, 0x2708, 0x3033, 0x3035, 0x577B, 0x3038, 0x303A, 0x577E,

+    0x303E, 0x303E, 0x274B, 0x303F, 0x303F, 0x5755, 0x3041, 0x3093, 0x0164,

+    0x3094, 0x3094, 0x5767, 0x309B, 0x309C, 0x2724, 0x309D, 0x309E, 0x2729,

+    0x30A1, 0x30F6, 0x01B7, 0x30F7, 0x30FA, 0x5776, 0x30FB, 0x30FB, 0x0063,

+    0x30FC, 0x30FC, 0x2723, 0x30FD, 0x30FE, 0x2726, 0x3105, 0x3129, 0x02BC,

+    0x312A, 0x312C, 0x5781, 0x31A0, 0x31B7, 0x5784, 0x3220, 0x3229, 0x00F0,

+    0x3231, 0x3231, 0x2721, 0x32A3, 0x32A3, 0x2711, 0x338E, 0x338F, 0x2712,

+    0x339C, 0x339E, 0x2714, 0x33A1, 0x33A1, 0x2717, 0x33C4, 0x33C4, 0x2718,

+    0x33CE, 0x33CE, 0x2719, 0x33D1, 0x33D2, 0x271A, 0x33D5, 0x33D5, 0x271C,

+    0x3400, 0x3446, 0x5801, 0x3447, 0x3447, 0x5625, 0x3448, 0x3472, 0x5848,

+    0x3473, 0x3473, 0x5624, 0x3474, 0x34FF, 0x5873, 0x3500, 0x359D, 0x58FF,

+    0x359E, 0x359E, 0x5629, 0x359F, 0x35FF, 0x599D, 0x3600, 0x360D, 0x59FE,

+    0x360E, 0x360E, 0x562B, 0x360F, 0x3619, 0x5A0C, 0x361A, 0x361A, 0x562A,

+    0x361B, 0x36FF, 0x5A17, 0x3700, 0x37FF, 0x5AFC, 0x3800, 0x38FF, 0x5BFC,

+    0x3900, 0x3917, 0x5CFC, 0x3918, 0x3918, 0x562F, 0x3919, 0x396D, 0x5D14,

+    0x396E, 0x396E, 0x562E, 0x396F, 0x39CE, 0x5D69, 0x39CF, 0x39CF, 0x5631,

+    0x39D0, 0x39D0, 0x5634, 0x39D1, 0x39DE, 0x5DC9, 0x39DF, 0x39DF, 0x5632,

+    0x39E0, 0x39FF, 0x5DD7, 0x3A00, 0x3A72, 0x5DF7, 0x3A73, 0x3A73, 0x5633,

+    0x3A74, 0x3AFF, 0x5E6A, 0x3B00, 0x3B4D, 0x5EF6, 0x3B4E, 0x3B4E, 0x5637,

+    0x3B4F, 0x3BFF, 0x5F44, 0x3C00, 0x3C6D, 0x5FF5, 0x3C6E, 0x3C6E, 0x5638,

+    0x3C6F, 0x3CDF, 0x6063, 0x3CE0, 0x3CE0, 0x5639, 0x3CE1, 0x3CFF, 0x60D4,

+    0x3D00, 0x3DFF, 0x60F3, 0x3E00, 0x3EFF, 0x61F3, 0x3F00, 0x3FFF, 0x62F3,

+    0x4000, 0x4055, 0x63F3, 0x4056, 0x4056, 0x563E, 0x4057, 0x40FF, 0x6449,

+    0x4100, 0x415E, 0x64F2, 0x415F, 0x415F, 0x563F, 0x4160, 0x41FF, 0x6551,

+    0x4200, 0x42FF, 0x65F1, 0x4300, 0x4336, 0x66F1, 0x4337, 0x4337, 0x5641,

+    0x4338, 0x43AB, 0x6728, 0x43AC, 0x43AC, 0x5647, 0x43AD, 0x43B0, 0x679C,

+    0x43B1, 0x43B1, 0x5646, 0x43B2, 0x43DC, 0x67A0, 0x43DD, 0x43DD, 0x5649,

+    0x43DE, 0x43FF, 0x67CB, 0x4400, 0x44D5, 0x67ED, 0x44D6, 0x44D6, 0x564A,

+    0x44D7, 0x44FF, 0x68C3, 0x4500, 0x45FF, 0x68EC, 0x4600, 0x464B, 0x69EC,

+    0x464C, 0x464C, 0x564C, 0x464D, 0x4660, 0x6A38, 0x4661, 0x4661, 0x564B,

+    0x4662, 0x46FF, 0x6A4C, 0x4700, 0x4722, 0x6AEA, 0x4723, 0x4723, 0x564E,

+    0x4724, 0x4728, 0x6B0D, 0x4729, 0x4729, 0x564F, 0x472A, 0x477B, 0x6B12,

+    0x477C, 0x477C, 0x5650, 0x477D, 0x478C, 0x6B64, 0x478D, 0x478D, 0x5651,

+    0x478E, 0x47FF, 0x6B74, 0x4800, 0x48FF, 0x6BE6, 0x4900, 0x4946, 0x6CE6,

+    0x4947, 0x4947, 0x5653, 0x4948, 0x4979, 0x6D2D, 0x497A, 0x497A, 0x5654,

+    0x497B, 0x497C, 0x6D5F, 0x497D, 0x497D, 0x5655, 0x497E, 0x4981, 0x6D61,

+    0x4982, 0x4983, 0x5656, 0x4984, 0x4984, 0x6D65, 0x4985, 0x4986, 0x5658,

+    0x4987, 0x499A, 0x6D66, 0x499B, 0x499B, 0x565B, 0x499C, 0x499E, 0x6D7A,

+    0x499F, 0x499F, 0x565A, 0x49A0, 0x49B5, 0x6D7D, 0x49B6, 0x49B6, 0x565D,

+    0x49B7, 0x49B7, 0x565C, 0x49B8, 0x49FF, 0x6D93, 0x4A00, 0x4AFF, 0x6DDB,

+    0x4B00, 0x4BFF, 0x6EDB, 0x4C00, 0x4C76, 0x6FDB, 0x4C77, 0x4C77, 0x5664,

+    0x4C78, 0x4C9E, 0x7052, 0x4C9F, 0x4CA1, 0x5661, 0x4CA2, 0x4CA2, 0x5665,

+    0x4CA3, 0x4CA3, 0x5660, 0x4CA4, 0x4CFF, 0x7079, 0x4D00, 0x4D12, 0x70D5,

+    0x4D13, 0x4D19, 0x5666, 0x4D1A, 0x4DAD, 0x70E8, 0x4DAE, 0x4DAE, 0x566D,

+    0x4DAF, 0x4DB5, 0x717C, 0x4E00, 0x4E00, 0x1042, 0x4E01, 0x4E01, 0x05E0,

+    0x4E02, 0x4E02, 0x2758, 0x4E03, 0x4E03, 0x0BFE, 0x4E04, 0x4E06, 0x2759,

+    0x4E07, 0x4E07, 0x0EA3, 0x4E08, 0x4E08, 0x116A, 0x4E09, 0x4E09, 0x0CD8,

+    0x4E0A, 0x4E0A, 0x0D08, 0x4E0B, 0x4E0B, 0x0F2F, 0x4E0C, 0x4E0C, 0x1258,

+    0x4E0D, 0x4E0D, 0x0482, 0x4E0E, 0x4E0E, 0x10D0, 0x4E0F, 0x4E0F, 0x275C,

+    0x4E10, 0x4E10, 0x125A, 0x4E11, 0x4E11, 0x0518, 0x4E12, 0x4E12, 0x275D,

+    0x4E13, 0x4E13, 0x1205, 0x4E14, 0x4E14, 0x0C4F, 0x4E15, 0x4E15, 0x125D,

+    0x4E16, 0x4E16, 0x0D57, 0x4E17, 0x4E17, 0x275E, 0x4E18, 0x4E18, 0x0C6D,

+    0x4E19, 0x4E19, 0x0464, 0x4E1A, 0x4E1A, 0x103C, 0x4E1B, 0x4E1B, 0x0557,

+    0x4E1C, 0x4E1C, 0x05EA, 0x4E1D, 0x4E1D, 0x0DB4, 0x4E1E, 0x4E1E, 0x125F,

+    0x4E1F, 0x4E21, 0x275F, 0x4E22, 0x4E22, 0x05E9, 0x4E23, 0x4E23, 0x2762,

+    0x4E24, 0x4E24, 0x0A06, 0x4E25, 0x4E25, 0x0FF8, 0x4E26, 0x4E26, 0x2763,

+    0x4E27, 0x4E27, 0x0CDE, 0x4E28, 0x4E28, 0x1263, 0x4E29, 0x4E29, 0x2764,

+    0x4E2A, 0x4E2A, 0x06F1, 0x4E2B, 0x4E2B, 0x0FE7, 0x4E2C, 0x4E2C, 0x169C,

+    0x4E2D, 0x4E2D, 0x11CF, 0x4E2E, 0x4E2F, 0x2765, 0x4E30, 0x4E30, 0x067E,

+    0x4E31, 0x4E31, 0x2767, 0x4E32, 0x4E32, 0x0531, 0x4E33, 0x4E33, 0x2768,

+    0x4E34, 0x4E34, 0x0A22, 0x4E35, 0x4E35, 0x2769, 0x4E36, 0x4E36, 0x1272,

+    0x4E37, 0x4E37, 0x276A, 0x4E38, 0x4E38, 0x0E99, 0x4E39, 0x4E39, 0x0585,

+    0x4E3A, 0x4E3A, 0x0EB9, 0x4E3B, 0x4E3B, 0x11F6, 0x4E3C, 0x4E3C, 0x276B,

+    0x4E3D, 0x4E3D, 0x09E1, 0x4E3E, 0x4E3E, 0x0908, 0x4E3F, 0x4E3F, 0x1265,

+    0x4E40, 0x4E42, 0x276C, 0x4E43, 0x4E43, 0x0B2E, 0x4E44, 0x4E44, 0x276F,

+    0x4E45, 0x4E45, 0x08F2, 0x4E46, 0x4E46, 0x2770, 0x4E47, 0x4E47, 0x1267,

+    0x4E48, 0x4E48, 0x0AB9, 0x4E49, 0x4E49, 0x106C, 0x4E4A, 0x4E4A, 0x2771,

+    0x4E4B, 0x4E4B, 0x11AD, 0x4E4C, 0x4E4C, 0x0EE9, 0x4E4D, 0x4E4D, 0x1148,

+    0x4E4E, 0x4E4E, 0x07AC, 0x4E4F, 0x4E4F, 0x0643, 0x4E50, 0x4E50, 0x09C1,

+    0x4E51, 0x4E51, 0x2772, 0x4E52, 0x4E52, 0x0BD8, 0x4E53, 0x4E53, 0x0B93,

+    0x4E54, 0x4E54, 0x0C44, 0x4E55, 0x4E55, 0x2773, 0x4E56, 0x4E56, 0x072D,

+    0x4E57, 0x4E57, 0x2774, 0x4E58, 0x4E58, 0x04F0, 0x4E59, 0x4E59, 0x1059,

+    0x4E5A, 0x4E5B, 0x2775, 0x4E5C, 0x4E5C, 0x1275, 0x4E5D, 0x4E5D, 0x08F4,

+    0x4E5E, 0x4E5E, 0x0C11, 0x4E5F, 0x4E5F, 0x1039, 0x4E60, 0x4E60, 0x0F1D,

+    0x4E61, 0x4E61, 0x0F54, 0x4E62, 0x4E65, 0x2777, 0x4E66, 0x4E66, 0x0D80,

+    0x4E67, 0x4E68, 0x277B, 0x4E69, 0x4E69, 0x1276, 0x4E6A, 0x4E6F, 0x277D,

+    0x4E70, 0x4E70, 0x0A99, 0x4E71, 0x4E71, 0x0A79, 0x4E72, 0x4E72, 0x2783,

+    0x4E73, 0x4E73, 0x0CC4, 0x4E74, 0x4E7D, 0x2784, 0x4E7E, 0x4E7E, 0x0C29,

+    0x4E7F, 0x4E81, 0x278E, 0x4E82, 0x4E82, 0x2059, 0x4E83, 0x4E85, 0x2791,

+    0x4E86, 0x4E86, 0x0A14, 0x4E87, 0x4E87, 0x2794, 0x4E88, 0x4E88, 0x10CD,

+    0x4E89, 0x4E89, 0x119A, 0x4E8A, 0x4E8A, 0x2795, 0x4E8B, 0x4E8B, 0x0D59,

+    0x4E8C, 0x4E8C, 0x063D, 0x4E8D, 0x4E8D, 0x1257, 0x4E8E, 0x4E8E, 0x10BF,

+    0x4E8F, 0x4E8F, 0x0984, 0x4E90, 0x4E90, 0x2796, 0x4E91, 0x4E91, 0x1109,

+    0x4E92, 0x4E92, 0x07BA, 0x4E93, 0x4E93, 0x1277, 0x4E94, 0x4E94, 0x0EF4,

+    0x4E95, 0x4E95, 0x08DD, 0x4E96, 0x4E97, 0x2797, 0x4E98, 0x4E98, 0x125E,

+    0x4E99, 0x4E99, 0x2799, 0x4E9A, 0x4E9A, 0x0FF0, 0x4E9B, 0x4E9B, 0x0F74,

+    0x4E9C, 0x4E9D, 0x279A, 0x4E9E, 0x4E9E, 0x21F1, 0x4E9F, 0x4E9F, 0x1273,

+    0x4EA0, 0x4EA0, 0x1303, 0x4EA1, 0x4EA1, 0x0EA7, 0x4EA2, 0x4EA2, 0x0947,

+    0x4EA3, 0x4EA3, 0x279C, 0x4EA4, 0x4EA4, 0x088C, 0x4EA5, 0x4EA5, 0x075C,

+    0x4EA6, 0x4EA6, 0x1067, 0x4EA7, 0x4EA7, 0x04C1, 0x4EA8, 0x4EA8, 0x0797,

+    0x4EA9, 0x4EA9, 0x0B19, 0x4EAA, 0x4EAA, 0x279D, 0x4EAB, 0x4EAB, 0x0F5A,

+    0x4EAC, 0x4EAC, 0x08D8, 0x4EAD, 0x4EAD, 0x0E55, 0x4EAE, 0x4EAE, 0x0A0A,

+    0x4EAF, 0x4EB1, 0x279E, 0x4EB2, 0x4EB2, 0x0C54, 0x4EB3, 0x4EB3, 0x1305,

+    0x4EB4, 0x4EB4, 0x27A1, 0x4EB5, 0x4EB5, 0x1308, 0x4EB6, 0x4EB9, 0x27A2,

+    0x4EBA, 0x4EBA, 0x0CA6, 0x4EBB, 0x4EBB, 0x129F, 0x4EBC, 0x4EBE, 0x27A6,

+    0x4EBF, 0x4EBF, 0x1061, 0x4EC0, 0x4EC0, 0x0D49, 0x4EC1, 0x4EC1, 0x0CA5,

+    0x4EC2, 0x4EC2, 0x12A2, 0x4EC3, 0x4EC3, 0x12A0, 0x4EC4, 0x4EC4, 0x127C,

+    0x4EC5, 0x4EC5, 0x08C7, 0x4EC6, 0x4EC6, 0x0BEC, 0x4EC7, 0x4EC7, 0x0515,

+    0x4EC8, 0x4EC8, 0x27A9, 0x4EC9, 0x4EC9, 0x12A1, 0x4ECA, 0x4ECA, 0x08C2,

+    0x4ECB, 0x4ECB, 0x08BA, 0x4ECC, 0x4ECC, 0x27AA, 0x4ECD, 0x4ECD, 0x0CAF,

+    0x4ECE, 0x4ECE, 0x0556, 0x4ECF, 0x4ED0, 0x27AB, 0x4ED1, 0x4ED1, 0x0A7F,

+    0x4ED2, 0x4ED2, 0x27AD, 0x4ED3, 0x4ED3, 0x049D, 0x4ED4, 0x4ED4, 0x122D,

+    0x4ED5, 0x4ED5, 0x0D62, 0x4ED6, 0x4ED6, 0x0DF0, 0x4ED7, 0x4ED7, 0x116D,

+    0x4ED8, 0x4ED8, 0x06B1, 0x4ED9, 0x4ED9, 0x0F36, 0x4EDA, 0x4EDC, 0x27AE,

+    0x4EDD, 0x4EDD, 0x12EE, 0x4EDE, 0x4EDE, 0x12A6, 0x4EDF, 0x4EDF, 0x0C27,

+    0x4EE0, 0x4EE0, 0x27B1, 0x4EE1, 0x4EE1, 0x12A4, 0x4EE2, 0x4EE2, 0x27B2,

+    0x4EE3, 0x4EE3, 0x057D, 0x4EE4, 0x4EE4, 0x0A37, 0x4EE5, 0x4EE5, 0x105B,

+    0x4EE6, 0x4EE7, 0x27B3, 0x4EE8, 0x4EE8, 0x12A3, 0x4EE9, 0x4EE9, 0x27B5,

+    0x4EEA, 0x4EEA, 0x104E, 0x4EEB, 0x4EEB, 0x12A5, 0x4EEC, 0x4EEC, 0x0ACC,

+    0x4EED, 0x4EEF, 0x27B6, 0x4EF0, 0x4EF0, 0x101F, 0x4EF1, 0x4EF1, 0x27B9,

+    0x4EF2, 0x4EF2, 0x11D8, 0x4EF3, 0x4EF3, 0x12A8, 0x4EF4, 0x4EF4, 0x27BA,

+    0x4EF5, 0x4EF5, 0x12AB, 0x4EF6, 0x4EF6, 0x0871, 0x4EF7, 0x4EF7, 0x084E,

+    0x4EF8, 0x4EFA, 0x27BB, 0x4EFB, 0x4EFB, 0x0CA9, 0x4EFC, 0x4EFC, 0x27BE,

+    0x4EFD, 0x4EFD, 0x067A, 0x4EFE, 0x4EFE, 0x27BF, 0x4EFF, 0x4EFF, 0x065F,

+    0x4F00, 0x4F00, 0x27C0, 0x4F01, 0x4F01, 0x0C12, 0x4F02, 0x4F08, 0x27C1,

+    0x4F09, 0x4F09, 0x12AE, 0x4F0A, 0x4F0A, 0x1048, 0x4F0B, 0x4F0C, 0x27C8,

+    0x4F0D, 0x4F0D, 0x0EF8, 0x4F0E, 0x4F0E, 0x0832, 0x4F0F, 0x4F0F, 0x0699,

+    0x4F10, 0x4F10, 0x0642, 0x4F11, 0x4F11, 0x0FA8, 0x4F12, 0x4F16, 0x27CA,

+    0x4F17, 0x4F17, 0x11D9, 0x4F18, 0x4F18, 0x10AA, 0x4F19, 0x4F19, 0x0804,

+    0x4F1A, 0x4F1A, 0x07F6, 0x4F1B, 0x4F1B, 0x12A7, 0x4F1C, 0x4F1D, 0x27CF,

+    0x4F1E, 0x4F1E, 0x0CDA, 0x4F1F, 0x4F1F, 0x0EBF, 0x4F20, 0x4F20, 0x052E,

+    0x4F21, 0x4F21, 0x27D1, 0x4F22, 0x4F22, 0x12A9, 0x4F23, 0x4F23, 0x27D2,

+    0x4F24, 0x4F24, 0x0D04, 0x4F25, 0x4F25, 0x12AC, 0x4F26, 0x4F26, 0x0A7E,

+    0x4F27, 0x4F27, 0x12AD, 0x4F28, 0x4F29, 0x27D3, 0x4F2A, 0x4F2A, 0x0EC0,

+    0x4F2B, 0x4F2B, 0x12AF, 0x4F2C, 0x4F2E, 0x27D5, 0x4F2F, 0x4F2F, 0x0475,

+    0x4F30, 0x4F30, 0x0719, 0x4F31, 0x4F31, 0x27D8, 0x4F32, 0x4F32, 0x12B7,

+    0x4F33, 0x4F33, 0x27D9, 0x4F34, 0x4F34, 0x03F4, 0x4F35, 0x4F35, 0x27DA,

+    0x4F36, 0x4F36, 0x0A2F, 0x4F37, 0x4F37, 0x27DB, 0x4F38, 0x4F38, 0x0D25,

+    0x4F39, 0x4F39, 0x27DC, 0x4F3A, 0x4F3A, 0x0DBA, 0x4F3B, 0x4F3B, 0x27DD,

+    0x4F3C, 0x4F3C, 0x0DBB, 0x4F3D, 0x4F3D, 0x12B8, 0x4F3E, 0x4F42, 0x27DE,

+    0x4F43, 0x4F43, 0x05C9, 0x4F44, 0x4F45, 0x27E3, 0x4F46, 0x4F46, 0x058C,

+    0x4F47, 0x4F4C, 0x27E5, 0x4F4D, 0x4F4D, 0x0ECA, 0x4F4E, 0x4F4E, 0x05AE,

+    0x4F4F, 0x4F4F, 0x11FE, 0x4F50, 0x4F50, 0x1251, 0x4F51, 0x4F51, 0x10B8,

+    0x4F52, 0x4F52, 0x27EB, 0x4F53, 0x4F53, 0x0E38, 0x4F54, 0x4F54, 0x27EC,

+    0x4F55, 0x4F55, 0x0785, 0x4F56, 0x4F56, 0x27ED, 0x4F57, 0x4F57, 0x12B6,

+    0x4F58, 0x4F58, 0x12F0, 0x4F59, 0x4F59, 0x10C5, 0x4F5A, 0x4F5A, 0x12B3,

+    0x4F5B, 0x4F5B, 0x068D, 0x4F5C, 0x4F5C, 0x1254, 0x4F5D, 0x4F5D, 0x12B4,

+    0x4F5E, 0x4F5E, 0x12B0, 0x4F5F, 0x4F5F, 0x12B5, 0x4F60, 0x4F60, 0x0B46,

+    0x4F61, 0x4F62, 0x27EE, 0x4F63, 0x4F63, 0x109B, 0x4F64, 0x4F64, 0x12AA,

+    0x4F65, 0x4F65, 0x12F1, 0x4F66, 0x4F66, 0x27F0, 0x4F67, 0x4F67, 0x12B1,

+    0x4F68, 0x4F68, 0x27F1, 0x4F69, 0x4F69, 0x0BA6, 0x4F6A, 0x4F6B, 0x27F2,

+    0x4F6C, 0x4F6C, 0x09BB, 0x4F6D, 0x4F6E, 0x27F4, 0x4F6F, 0x4F6F, 0x1019,

+    0x4F70, 0x4F70, 0x03E6, 0x4F71, 0x4F72, 0x27F6, 0x4F73, 0x4F73, 0x0844,

+    0x4F74, 0x4F74, 0x12BA, 0x4F75, 0x4F75, 0x27F8, 0x4F76, 0x4F76, 0x12B9,

+    0x4F77, 0x4F7A, 0x27F9, 0x4F7B, 0x4F7B, 0x12C0, 0x4F7C, 0x4F7C, 0x12C2,

+    0x4F7D, 0x4F7D, 0x27FD, 0x4F7E, 0x4F7E, 0x12BF, 0x4F7F, 0x4F7F, 0x0D50,

+    0x4F80, 0x4F82, 0x27FE, 0x4F83, 0x4F83, 0x12BD, 0x4F84, 0x4F84, 0x11B5,

+    0x4F85, 0x4F85, 0x2801, 0x4F86, 0x4F86, 0x1FF2, 0x4F87, 0x4F87, 0x2802,

+    0x4F88, 0x4F88, 0x0503, 0x4F89, 0x4F89, 0x12BC, 0x4F8A, 0x4F8A, 0x2803,

+    0x4F8B, 0x4F8B, 0x09E8, 0x4F8C, 0x4F8C, 0x2804, 0x4F8D, 0x4F8D, 0x0D63,

+    0x4F8E, 0x4F8E, 0x2805, 0x4F8F, 0x4F8F, 0x12BE, 0x4F90, 0x4F90, 0x2806,

+    0x4F91, 0x4F91, 0x12BB, 0x4F92, 0x4F93, 0x2807, 0x4F94, 0x4F94, 0x12C4,

+    0x4F95, 0x4F95, 0x2809, 0x4F96, 0x4F96, 0x205D, 0x4F97, 0x4F97, 0x05F0,

+    0x4F98, 0x4F9A, 0x280A, 0x4F9B, 0x4F9B, 0x0702, 0x4F9C, 0x4F9C, 0x280D,

+    0x4F9D, 0x4F9D, 0x1047, 0x4F9E, 0x4F9F, 0x280E, 0x4FA0, 0x4FA0, 0x0F2D,

+    0x4FA1, 0x4FA2, 0x2810, 0x4FA3, 0x4FA3, 0x0A69, 0x4FA4, 0x4FA4, 0x2812,

+    0x4FA5, 0x4FA5, 0x0895, 0x4FA6, 0x4FA6, 0x118D, 0x4FA7, 0x4FA7, 0x04A7,

+    0x4FA8, 0x4FA8, 0x0C45, 0x4FA9, 0x4FA9, 0x0978, 0x4FAA, 0x4FAA, 0x12C1,

+    0x4FAB, 0x4FAB, 0x2813, 0x4FAC, 0x4FAC, 0x12C3, 0x4FAD, 0x4FAD, 0x2814,

+    0x4FAE, 0x4FAE, 0x0EF9, 0x4FAF, 0x4FAF, 0x07A5, 0x4FB0, 0x4FB4, 0x2815,

+    0x4FB5, 0x4FB5, 0x0C53, 0x4FB6, 0x4FBE, 0x281A, 0x4FBF, 0x4FBF, 0x044C,

+    0x4FC0, 0x4FC1, 0x2823, 0x4FC2, 0x4FC2, 0x269C, 0x4FC3, 0x4FC3, 0x055C,

+    0x4FC4, 0x4FC4, 0x062C, 0x4FC5, 0x4FC5, 0x12C8, 0x4FC6, 0x4FC9, 0x2825,

+    0x4FCA, 0x4FCA, 0x092E, 0x4FCB, 0x4FCD, 0x2829, 0x4FCE, 0x4FCE, 0x12F2,

+    0x4FCF, 0x4FCF, 0x0C4B, 0x4FD0, 0x4FD0, 0x09E9, 0x4FD1, 0x4FD1, 0x12CC,

+    0x4FD2, 0x4FD6, 0x282C, 0x4FD7, 0x4FD7, 0x0DCC, 0x4FD8, 0x4FD8, 0x069A,

+    0x4FD9, 0x4FD9, 0x2831, 0x4FDA, 0x4FDA, 0x12C9, 0x4FDB, 0x4FDB, 0x2832,

+    0x4FDC, 0x4FDC, 0x12CB, 0x4FDD, 0x4FDD, 0x040C, 0x4FDE, 0x4FDE, 0x10C6,

+    0x4FDF, 0x4FDF, 0x12CD, 0x4FE0, 0x4FE0, 0x21B5, 0x4FE1, 0x4FE1, 0x0F90,

+    0x4FE2, 0x4FE2, 0x2833, 0x4FE3, 0x4FE3, 0x12CA, 0x4FE4, 0x4FE5, 0x2834,

+    0x4FE6, 0x4FE6, 0x12C5, 0x4FE7, 0x4FE7, 0x2836, 0x4FE8, 0x4FE8, 0x12C6,

+    0x4FE9, 0x4FE9, 0x09F2, 0x4FEA, 0x4FEA, 0x12C7, 0x4FEB, 0x4FEC, 0x2837,

+    0x4FED, 0x4FED, 0x0866, 0x4FEE, 0x4FEE, 0x0FA9, 0x4FEF, 0x4FEF, 0x06A4,

+    0x4FF0, 0x4FF0, 0x2839, 0x4FF1, 0x4FF1, 0x0912, 0x4FF2, 0x4FF2, 0x283A,

+    0x4FF3, 0x4FF3, 0x12D1, 0x4FF4, 0x4FF7, 0x283B, 0x4FF8, 0x4FF8, 0x12CE,

+    0x4FF9, 0x4FF9, 0x283F, 0x4FFA, 0x4FFA, 0x03BE, 0x4FFB, 0x4FFD, 0x2840,

+    0x4FFE, 0x4FFE, 0x12D6, 0x4FFF, 0x4FFF, 0x2843, 0x5000, 0x5000, 0x22CC,

+    0x5001, 0x5005, 0x2844, 0x5006, 0x5006, 0x2016, 0x5007, 0x5008, 0x2849,

+    0x5009, 0x5009, 0x1E62, 0x500A, 0x500A, 0x284B, 0x500B, 0x500B, 0x1F20,

+    0x500C, 0x500C, 0x12D8, 0x500D, 0x500D, 0x041F, 0x500E, 0x500E, 0x284C,

+    0x500F, 0x500F, 0x12D3, 0x5010, 0x5010, 0x284D, 0x5011, 0x5011, 0x207F,

+    0x5012, 0x5012, 0x059A, 0x5013, 0x5013, 0x284E, 0x5014, 0x5014, 0x0922,

+    0x5015, 0x5017, 0x284F, 0x5018, 0x5018, 0x0E1B, 0x5019, 0x5019, 0x07A9,

+    0x501A, 0x501A, 0x1057, 0x501B, 0x501B, 0x2852, 0x501C, 0x501C, 0x12D7,

+    0x501D, 0x501E, 0x2853, 0x501F, 0x501F, 0x08B9, 0x5020, 0x5020, 0x2855,

+    0x5021, 0x5021, 0x04D0, 0x5022, 0x5024, 0x2856, 0x5025, 0x5025, 0x12D9,

+    0x5026, 0x5026, 0x091A, 0x5027, 0x5027, 0x2859, 0x5028, 0x5028, 0x12DA,

+    0x5029, 0x5029, 0x12CF, 0x502A, 0x502A, 0x0B42, 0x502B, 0x502B, 0x205C,

+    0x502C, 0x502C, 0x12D2, 0x502D, 0x502D, 0x12D5, 0x502E, 0x502E, 0x12D4,

+    0x502F, 0x5039, 0x285A, 0x503A, 0x503A, 0x114F, 0x503B, 0x503B, 0x2865,

+    0x503C, 0x503C, 0x11B4, 0x503D, 0x503D, 0x2866, 0x503E, 0x503E, 0x0C60,

+    0x503F, 0x5042, 0x2867, 0x5043, 0x5043, 0x12DC, 0x5044, 0x5046, 0x286B,

+    0x5047, 0x5047, 0x084C, 0x5048, 0x5048, 0x12DE, 0x5049, 0x5049, 0x2194,

+    0x504A, 0x504B, 0x286E, 0x504C, 0x504C, 0x12D0, 0x504D, 0x504D, 0x2870,

+    0x504E, 0x504E, 0x12DF, 0x504F, 0x504F, 0x0BCA, 0x5050, 0x5054, 0x2871,

+    0x5055, 0x5055, 0x12DD, 0x5056, 0x5059, 0x2876, 0x505A, 0x505A, 0x1253,

+    0x505B, 0x505B, 0x287A, 0x505C, 0x505C, 0x0E54, 0x505D, 0x5064, 0x287B,

+    0x5065, 0x5065, 0x0872, 0x5066, 0x506B, 0x2883, 0x506C, 0x506C, 0x12E0,

+    0x506D, 0x5073, 0x2889, 0x5074, 0x5074, 0x1E65, 0x5075, 0x5075, 0x2281,

+    0x5076, 0x5076, 0x0B7D, 0x5077, 0x5077, 0x0E66, 0x5078, 0x507A, 0x2890,

+    0x507B, 0x507B, 0x12E1, 0x507C, 0x507D, 0x2893, 0x507E, 0x507E, 0x12DB,

+    0x507F, 0x507F, 0x04CA, 0x5080, 0x5080, 0x098B, 0x5081, 0x5084, 0x2895,

+    0x5085, 0x5085, 0x06B0, 0x5086, 0x5087, 0x2899, 0x5088, 0x5088, 0x09E7,

+    0x5089, 0x508C, 0x289B, 0x508D, 0x508D, 0x0403, 0x508E, 0x5095, 0x289F,

+    0x5096, 0x5096, 0x22CD, 0x5097, 0x5097, 0x28A7, 0x5098, 0x5098, 0x210A,

+    0x5099, 0x5099, 0x1E3E, 0x509A, 0x50A1, 0x28A8, 0x50A2, 0x50A2, 0x267F,

+    0x50A3, 0x50A3, 0x0579, 0x50A4, 0x50A4, 0x28B0, 0x50A5, 0x50A5, 0x12E2,

+    0x50A6, 0x50A6, 0x28B1, 0x50A7, 0x50A7, 0x12E3, 0x50A8, 0x50A8, 0x0525,

+    0x50A9, 0x50A9, 0x12E4, 0x50AA, 0x50AB, 0x28B2, 0x50AC, 0x50AC, 0x0562,

+    0x50AD, 0x50AD, 0x222E, 0x50AE, 0x50B1, 0x28B4, 0x50B2, 0x50B2, 0x03CC,

+    0x50B3, 0x50B3, 0x1E96, 0x50B4, 0x50B4, 0x22CB, 0x50B5, 0x50B5, 0x226C,

+    0x50B6, 0x50B6, 0x28B8, 0x50B7, 0x50B7, 0x2117, 0x50B8, 0x50B9, 0x28B9,

+    0x50BA, 0x50BA, 0x12E5, 0x50BB, 0x50BB, 0x0CEE, 0x50BC, 0x50BD, 0x28BB,

+    0x50BE, 0x50BE, 0x20E8, 0x50BF, 0x50C1, 0x28BD, 0x50C2, 0x50C2, 0x22D4,

+    0x50C3, 0x50C4, 0x28C0, 0x50C5, 0x50C5, 0x1FB9, 0x50C6, 0x50C8, 0x28C2,

+    0x50C9, 0x50C9, 0x22D8, 0x50CA, 0x50CE, 0x28C5, 0x50CF, 0x50CF, 0x0F5E,

+    0x50D0, 0x50D0, 0x28CA, 0x50D1, 0x50D1, 0x20DF, 0x50D2, 0x50D4, 0x28CB,

+    0x50D5, 0x50D5, 0x20C2, 0x50D6, 0x50D6, 0x12E6, 0x50D7, 0x50D9, 0x28CE,

+    0x50DA, 0x50DA, 0x0A0E, 0x50DB, 0x50DD, 0x28D1, 0x50DE, 0x50DE, 0x2195,

+    0x50DF, 0x50E4, 0x28D4, 0x50E5, 0x50E5, 0x1FAC, 0x50E6, 0x50E6, 0x12EA,

+    0x50E7, 0x50E7, 0x0CE7, 0x50E8, 0x50E8, 0x22D3, 0x50E9, 0x50EB, 0x28DA,

+    0x50EC, 0x50EC, 0x12E9, 0x50ED, 0x50ED, 0x12E8, 0x50EE, 0x50EE, 0x12EB,

+    0x50EF, 0x50F2, 0x28DD, 0x50F3, 0x50F3, 0x0DD0, 0x50F4, 0x50F4, 0x28E1,

+    0x50F5, 0x50F5, 0x087A, 0x50F6, 0x50F8, 0x28E2, 0x50F9, 0x50F9, 0x1F81,

+    0x50FA, 0x50FA, 0x28E5, 0x50FB, 0x50FB, 0x0BC6, 0x50FC, 0x50FF, 0x28E6,

+    0x5100, 0x5100, 0x2210, 0x5101, 0x5101, 0x28EA, 0x5102, 0x5102, 0x22CF,

+    0x5103, 0x5103, 0x28EB, 0x5104, 0x5104, 0x2213, 0x5105, 0x5105, 0x28EC,

+    0x5106, 0x5106, 0x12E7, 0x5107, 0x5107, 0x12EC, 0x5108, 0x5108, 0x1FE4,

+    0x5109, 0x5109, 0x1F90, 0x510A, 0x510A, 0x28ED, 0x510B, 0x510B, 0x12ED,

+    0x510C, 0x510F, 0x28EE, 0x5110, 0x5110, 0x22D6, 0x5111, 0x5111, 0x28F2,

+    0x5112, 0x5112, 0x0CC0, 0x5113, 0x5113, 0x28F3, 0x5114, 0x5114, 0x22D0,

+    0x5115, 0x5115, 0x22CE, 0x5116, 0x5117, 0x28F4, 0x5118, 0x5118, 0x2681,

+    0x5119, 0x511E, 0x28F6, 0x511F, 0x511F, 0x1E76, 0x5120, 0x5120, 0x28FC,

+    0x5121, 0x5121, 0x09C7, 0x5122, 0x5129, 0x28FD, 0x512A, 0x512A, 0x2231,

+    0x512B, 0x5131, 0x2905, 0x5132, 0x5132, 0x1E93, 0x5133, 0x5136, 0x290C,

+    0x5137, 0x5137, 0x22D2, 0x5138, 0x5139, 0x2910, 0x513A, 0x513A, 0x22D7,

+    0x513B, 0x513B, 0x22D5, 0x513C, 0x513C, 0x22D1, 0x513D, 0x513E, 0x2912,

+    0x513F, 0x513F, 0x0638, 0x5140, 0x5140, 0x1259, 0x5141, 0x5141, 0x110D,

+    0x5142, 0x5142, 0x2914, 0x5143, 0x5143, 0x10ED, 0x5144, 0x5144, 0x0FA1,

+    0x5145, 0x5145, 0x0509, 0x5146, 0x5146, 0x1178, 0x5147, 0x5147, 0x2915,

+    0x5148, 0x5148, 0x0F35, 0x5149, 0x5149, 0x073B, 0x514A, 0x514A, 0x2916,

+    0x514B, 0x514B, 0x0958, 0x514C, 0x514C, 0x2917, 0x514D, 0x514D, 0x0AE7,

+    0x514E, 0x5150, 0x2918, 0x5151, 0x5151, 0x0611, 0x5152, 0x5152, 0x1EE5,

+    0x5153, 0x5153, 0x291B, 0x5154, 0x5154, 0x0E74, 0x5155, 0x5155, 0x1302,

+    0x5156, 0x5156, 0x1304, 0x5157, 0x5159, 0x291C, 0x515A, 0x515A, 0x0594,

+    0x515B, 0x515B, 0x291F, 0x515C, 0x515C, 0x05F4, 0x515D, 0x5161, 0x2920,

+    0x5162, 0x5162, 0x08D3, 0x5163, 0x5164, 0x2925, 0x5165, 0x5165, 0x0CC6,

+    0x5166, 0x5167, 0x2927, 0x5168, 0x5168, 0x0C86, 0x5169, 0x5169, 0x2025,

+    0x516A, 0x516A, 0x2929, 0x516B, 0x516B, 0x03D6, 0x516C, 0x516C, 0x0704,

+    0x516D, 0x516D, 0x0A42, 0x516E, 0x516E, 0x12F6, 0x516F, 0x516F, 0x292A,

+    0x5170, 0x5170, 0x09A7, 0x5171, 0x5171, 0x070B, 0x5172, 0x5172, 0x292B,

+    0x5173, 0x5173, 0x0731, 0x5174, 0x5174, 0x0F96, 0x5175, 0x5175, 0x0461,

+    0x5176, 0x5176, 0x0C03, 0x5177, 0x5177, 0x090E, 0x5178, 0x5178, 0x05C5,

+    0x5179, 0x5179, 0x1225, 0x517A, 0x517A, 0x292C, 0x517B, 0x517B, 0x1021,

+    0x517C, 0x517C, 0x0859, 0x517D, 0x517D, 0x0D75, 0x517E, 0x517F, 0x292D,

+    0x5180, 0x5180, 0x0830, 0x5181, 0x5181, 0x12FA, 0x5182, 0x5182, 0x129D,

+    0x5183, 0x5184, 0x292F, 0x5185, 0x5185, 0x0B3D, 0x5186, 0x5187, 0x2931,

+    0x5188, 0x5188, 0x06CF, 0x5189, 0x5189, 0x0C98, 0x518A, 0x518B, 0x2933,

+    0x518C, 0x518C, 0x04A8, 0x518D, 0x518D, 0x111C, 0x518E, 0x5191, 0x2935,

+    0x5192, 0x5192, 0x0AB5, 0x5193, 0x5194, 0x2939, 0x5195, 0x5195, 0x0AE6,

+    0x5196, 0x5196, 0x1314, 0x5197, 0x5197, 0x0CBA, 0x5198, 0x5198, 0x293B,

+    0x5199, 0x5199, 0x0F7F, 0x519A, 0x519A, 0x293C, 0x519B, 0x519B, 0x092B,

+    0x519C, 0x519C, 0x0B6A, 0x519D, 0x519F, 0x293D, 0x51A0, 0x51A0, 0x0733,

+    0x51A1, 0x51A1, 0x2940, 0x51A2, 0x51A2, 0x1315, 0x51A3, 0x51A3, 0x2941,

+    0x51A4, 0x51A4, 0x10EC, 0x51A5, 0x51A5, 0x1316, 0x51A6, 0x51AA, 0x2942,

+    0x51AB, 0x51AB, 0x130F, 0x51AC, 0x51AC, 0x05EB, 0x51AD, 0x51AE, 0x2947,

+    0x51AF, 0x51AF, 0x0688, 0x51B0, 0x51B0, 0x0462, 0x51B1, 0x51B1, 0x1310,

+    0x51B2, 0x51B2, 0x050A, 0x51B3, 0x51B3, 0x0925, 0x51B4, 0x51B4, 0x2949,

+    0x51B5, 0x51B5, 0x0983, 0x51B6, 0x51B6, 0x1038, 0x51B7, 0x51B7, 0x09CF,

+    0x51B8, 0x51BA, 0x294A, 0x51BB, 0x51BB, 0x05F2, 0x51BC, 0x51BC, 0x1312,

+    0x51BD, 0x51BD, 0x1311, 0x51BE, 0x51BF, 0x294D, 0x51C0, 0x51C0, 0x08EA,

+    0x51C1, 0x51C3, 0x294F, 0x51C4, 0x51C4, 0x0BFF, 0x51C5, 0x51C5, 0x2952,

+    0x51C6, 0x51C6, 0x1219, 0x51C7, 0x51C7, 0x1313, 0x51C8, 0x51C8, 0x2953,

+    0x51C9, 0x51C9, 0x0A02, 0x51CA, 0x51CA, 0x2954, 0x51CB, 0x51CB, 0x05D3,

+    0x51CC, 0x51CC, 0x0A31, 0x51CD, 0x51CD, 0x1ECF, 0x51CE, 0x51CE, 0x2955,

+    0x51CF, 0x51CF, 0x0868, 0x51D0, 0x51D0, 0x2956, 0x51D1, 0x51D1, 0x0558,

+    0x51D2, 0x51DA, 0x2957, 0x51DB, 0x51DB, 0x0A26, 0x51DC, 0x51DC, 0x2960,

+    0x51DD, 0x51DD, 0x0B60, 0x51DE, 0x51DF, 0x2961, 0x51E0, 0x51E0, 0x082B,

+    0x51E1, 0x51E1, 0x064F, 0x51E2, 0x51E3, 0x2963, 0x51E4, 0x51E4, 0x068C,

+    0x51E5, 0x51EA, 0x2965, 0x51EB, 0x51EB, 0x1300, 0x51EC, 0x51EC, 0x296B,

+    0x51ED, 0x51ED, 0x0BDD, 0x51EE, 0x51EE, 0x296C, 0x51EF, 0x51EF, 0x093A,

+    0x51F0, 0x51F0, 0x07E0, 0x51F1, 0x51F1, 0x1FD9, 0x51F2, 0x51F2, 0x296D,

+    0x51F3, 0x51F3, 0x05AB, 0x51F4, 0x51F4, 0x296E, 0x51F5, 0x51F5, 0x1399,

+    0x51F6, 0x51F6, 0x0FA2, 0x51F7, 0x51F7, 0x296F, 0x51F8, 0x51F8, 0x0E6A,

+    0x51F9, 0x51F9, 0x03C7, 0x51FA, 0x51FA, 0x051B, 0x51FB, 0x51FB, 0x080C,

+    0x51FC, 0x51FC, 0x139A, 0x51FD, 0x51FD, 0x0766, 0x51FE, 0x51FE, 0x2970,

+    0x51FF, 0x51FF, 0x1127, 0x5200, 0x5200, 0x0597, 0x5201, 0x5201, 0x05D4,

+    0x5202, 0x5202, 0x128C, 0x5203, 0x5203, 0x0CAB, 0x5204, 0x5205, 0x2971,

+    0x5206, 0x5206, 0x0673, 0x5207, 0x5207, 0x0C4D, 0x5208, 0x5208, 0x128D,

+    0x5209, 0x5209, 0x2973, 0x520A, 0x520A, 0x093C, 0x520B, 0x520C, 0x2974,

+    0x520D, 0x520D, 0x138B, 0x520E, 0x520E, 0x128E, 0x520F, 0x5210, 0x2976,

+    0x5211, 0x5211, 0x0F97, 0x5212, 0x5212, 0x07C3, 0x5213, 0x5215, 0x2978,

+    0x5216, 0x5216, 0x196E, 0x5217, 0x5217, 0x0A19, 0x5218, 0x5218, 0x0A3E,

+    0x5219, 0x5219, 0x1135, 0x521A, 0x521A, 0x06D0, 0x521B, 0x521B, 0x0537,

+    0x521C, 0x521C, 0x297B, 0x521D, 0x521D, 0x051A, 0x521E, 0x521F, 0x297C,

+    0x5220, 0x5220, 0x0CF7, 0x5221, 0x5223, 0x297E, 0x5224, 0x5224, 0x0B91,

+    0x5225, 0x5227, 0x2981, 0x5228, 0x5228, 0x0B9A, 0x5229, 0x5229, 0x09E6,

+    0x522A, 0x522A, 0x2984, 0x522B, 0x522B, 0x0459, 0x522C, 0x522C, 0x2985,

+    0x522D, 0x522D, 0x128F, 0x522E, 0x522E, 0x0727, 0x522F, 0x522F, 0x2986,

+    0x5230, 0x5230, 0x059E, 0x5231, 0x5232, 0x2987, 0x5233, 0x5233, 0x1290,

+    0x5234, 0x5235, 0x2989, 0x5236, 0x5236, 0x11C5, 0x5237, 0x5237, 0x0D97,

+    0x5238, 0x5238, 0x0C8A, 0x5239, 0x5239, 0x0CEB, 0x523A, 0x523A, 0x054F,

+    0x523B, 0x523B, 0x0959, 0x523C, 0x523C, 0x298B, 0x523D, 0x523D, 0x074D,

+    0x523E, 0x523E, 0x298C, 0x523F, 0x5240, 0x1291, 0x5241, 0x5241, 0x0626,

+    0x5242, 0x5242, 0x0834, 0x5243, 0x5243, 0x0E3D, 0x5244, 0x5244, 0x22C8,

+    0x5245, 0x5246, 0x298D, 0x5247, 0x5247, 0x2263, 0x5248, 0x5249, 0x298F,

+    0x524A, 0x524A, 0x0F64, 0x524B, 0x524B, 0x2683, 0x524C, 0x524C, 0x1293,

+    0x524D, 0x524D, 0x0C2D, 0x524E, 0x524F, 0x2991, 0x5250, 0x5250, 0x0729,

+    0x5251, 0x5251, 0x0874, 0x5252, 0x5253, 0x2993, 0x5254, 0x5254, 0x0E31,

+    0x5255, 0x5255, 0x2995, 0x5256, 0x5256, 0x0BE9, 0x5257, 0x525A, 0x2996,

+    0x525B, 0x525B, 0x1F17, 0x525C, 0x525C, 0x1296, 0x525D, 0x525D, 0x299A,

+    0x525E, 0x525E, 0x1294, 0x525F, 0x5260, 0x299B, 0x5261, 0x5261, 0x1295,

+    0x5262, 0x5264, 0x299D, 0x5265, 0x5265, 0x0409, 0x5266, 0x5266, 0x29A0,

+    0x5267, 0x5267, 0x0916, 0x5268, 0x5268, 0x29A1, 0x5269, 0x5269, 0x0D3A,

+    0x526A, 0x526A, 0x0867, 0x526B, 0x526D, 0x29A2, 0x526E, 0x526E, 0x1F2B,

+    0x526F, 0x526F, 0x06AC, 0x5270, 0x5271, 0x29A5, 0x5272, 0x5272, 0x06E9,

+    0x5273, 0x5273, 0x29A7, 0x5274, 0x5274, 0x22CA, 0x5275, 0x5275, 0x1E99,

+    0x5276, 0x527C, 0x29A8, 0x527D, 0x527D, 0x1298, 0x527E, 0x527E, 0x29AF,

+    0x527F, 0x527F, 0x089C, 0x5280, 0x5280, 0x29B0, 0x5281, 0x5281, 0x129A,

+    0x5282, 0x5282, 0x1299, 0x5283, 0x5283, 0x1F4F, 0x5284, 0x5286, 0x29B1,

+    0x5287, 0x5287, 0x1FCF, 0x5288, 0x5288, 0x0BBD, 0x5289, 0x5289, 0x2036,

+    0x528A, 0x528A, 0x1F3A, 0x528B, 0x528B, 0x29B4, 0x528C, 0x528C, 0x22C9,

+    0x528D, 0x528D, 0x1F99, 0x528E, 0x528F, 0x29B5, 0x5290, 0x5290, 0x129B,

+    0x5291, 0x5291, 0x1F75, 0x5292, 0x5292, 0x29B7, 0x5293, 0x5293, 0x129C,

+    0x5294, 0x529A, 0x29B8, 0x529B, 0x529B, 0x09EF, 0x529C, 0x529C, 0x29BF,

+    0x529D, 0x529D, 0x0C8B, 0x529E, 0x529E, 0x03F7, 0x529F, 0x529F, 0x06FF,

+    0x52A0, 0x52A0, 0x0846, 0x52A1, 0x52A1, 0x0F00, 0x52A2, 0x52A2, 0x138D,

+    0x52A3, 0x52A3, 0x0A1C, 0x52A4, 0x52A7, 0x29C0, 0x52A8, 0x52A8, 0x05EE,

+    0x52A9, 0x52A9, 0x11F9, 0x52AA, 0x52AA, 0x0B6D, 0x52AB, 0x52AB, 0x08AA,

+    0x52AC, 0x52AD, 0x138E, 0x52AE, 0x52B0, 0x29C4, 0x52B1, 0x52B1, 0x09E3,

+    0x52B2, 0x52B2, 0x08D1, 0x52B3, 0x52B3, 0x09B8, 0x52B4, 0x52BD, 0x29C7,

+    0x52BE, 0x52BE, 0x1390, 0x52BF, 0x52BF, 0x0D5D, 0x52C0, 0x52C0, 0x29D1,

+    0x52C1, 0x52C1, 0x1FBE, 0x52C2, 0x52C2, 0x29D2, 0x52C3, 0x52C3, 0x0471,

+    0x52C4, 0x52C6, 0x29D3, 0x52C7, 0x52C7, 0x10A7, 0x52C8, 0x52C8, 0x29D6,

+    0x52C9, 0x52C9, 0x0AE8, 0x52CA, 0x52CA, 0x29D7, 0x52CB, 0x52CB, 0x0FD4,

+    0x52CC, 0x52CF, 0x29D8, 0x52D0, 0x52D0, 0x1392, 0x52D1, 0x52D1, 0x29DC,

+    0x52D2, 0x52D2, 0x09C0, 0x52D3, 0x52D4, 0x29DD, 0x52D5, 0x52D5, 0x1ECD,

+    0x52D6, 0x52D6, 0x1393, 0x52D7, 0x52D7, 0x29DF, 0x52D8, 0x52D8, 0x093E,

+    0x52D9, 0x52D9, 0x21A9, 0x52DA, 0x52DA, 0x29E0, 0x52DB, 0x52DB, 0x21E6,

+    0x52DC, 0x52DC, 0x29E1, 0x52DD, 0x52DD, 0x2127, 0x52DE, 0x52DE, 0x2003,

+    0x52DF, 0x52DF, 0x0B1F, 0x52E0, 0x52E1, 0x29E2, 0x52E2, 0x52E2, 0x2132,

+    0x52E3, 0x52E3, 0x29E4, 0x52E4, 0x52E4, 0x0C57, 0x52E5, 0x52EF, 0x29E5,

+    0x52F0, 0x52F0, 0x1394, 0x52F1, 0x52F1, 0x2323, 0x52F2, 0x52F4, 0x29F0,

+    0x52F5, 0x52F5, 0x2011, 0x52F6, 0x52F7, 0x29F3, 0x52F8, 0x52F8, 0x20F5,

+    0x52F9, 0x52F9, 0x12FC, 0x52FA, 0x52FA, 0x0D10, 0x52FB, 0x52FD, 0x29F5,

+    0x52FE, 0x52FE, 0x070D, 0x52FF, 0x52FF, 0x0EFF, 0x5300, 0x5300, 0x110B,

+    0x5301, 0x5304, 0x29F8, 0x5305, 0x5305, 0x0407, 0x5306, 0x5306, 0x0555,

+    0x5307, 0x5307, 0x29FC, 0x5308, 0x5308, 0x0FA4, 0x5309, 0x530C, 0x29FD,

+    0x530D, 0x530D, 0x12FD, 0x530E, 0x530E, 0x2A01, 0x530F, 0x530F, 0x14B5,

+    0x5310, 0x5310, 0x12FF, 0x5311, 0x5314, 0x2A02, 0x5315, 0x5315, 0x1266,

+    0x5316, 0x5316, 0x07C4, 0x5317, 0x5317, 0x041A, 0x5318, 0x5318, 0x2A06,

+    0x5319, 0x5319, 0x04FC, 0x531A, 0x531A, 0x1284, 0x531B, 0x531C, 0x2A07,

+    0x531D, 0x531D, 0x1114, 0x531E, 0x531F, 0x2A09, 0x5320, 0x5320, 0x0884,

+    0x5321, 0x5321, 0x097C, 0x5322, 0x5322, 0x2A0B, 0x5323, 0x5323, 0x0F28,

+    0x5324, 0x5325, 0x2A0C, 0x5326, 0x5326, 0x1286, 0x5327, 0x5329, 0x2A0E,

+    0x532A, 0x532A, 0x0668, 0x532B, 0x532C, 0x2A11, 0x532D, 0x532D, 0x22C5,

+    0x532E, 0x532E, 0x1287, 0x532F, 0x532F, 0x1F5E, 0x5330, 0x5330, 0x2A13,

+    0x5331, 0x5331, 0x22C6, 0x5332, 0x5338, 0x2A14, 0x5339, 0x5339, 0x0BC4,

+    0x533A, 0x533A, 0x0C75, 0x533B, 0x533B, 0x1044, 0x533C, 0x533D, 0x2A1B,

+    0x533E, 0x533E, 0x1288, 0x533F, 0x533F, 0x0B47, 0x5340, 0x5340, 0x20EF,

+    0x5341, 0x5341, 0x0D45, 0x5342, 0x5342, 0x2A1D, 0x5343, 0x5343, 0x0C24,

+    0x5344, 0x5344, 0x2A1E, 0x5345, 0x5345, 0x125C, 0x5346, 0x5346, 0x2A1F,

+    0x5347, 0x5347, 0x0D36, 0x5348, 0x5348, 0x0EF6, 0x5349, 0x5349, 0x07F1,

+    0x534A, 0x534A, 0x03F6, 0x534B, 0x534D, 0x2A20, 0x534E, 0x534E, 0x07BF,

+    0x534F, 0x534F, 0x0F78, 0x5350, 0x5350, 0x2A23, 0x5351, 0x5351, 0x0419,

+    0x5352, 0x5352, 0x1241, 0x5353, 0x5353, 0x121C, 0x5354, 0x5354, 0x21D0,

+    0x5355, 0x5355, 0x0586, 0x5356, 0x5356, 0x0A9B, 0x5357, 0x5357, 0x0B32,

+    0x5358, 0x5359, 0x2A24, 0x535A, 0x535A, 0x0470, 0x535B, 0x535B, 0x2A26,

+    0x535C, 0x535C, 0x047E, 0x535D, 0x535D, 0x2A27, 0x535E, 0x535E, 0x044E,

+    0x535F, 0x535F, 0x14FA, 0x5360, 0x5360, 0x115D, 0x5361, 0x5361, 0x0935,

+    0x5362, 0x5362, 0x0A53, 0x5363, 0x5363, 0x128B, 0x5364, 0x5364, 0x0A58,

+    0x5365, 0x5365, 0x2A28, 0x5366, 0x5366, 0x128A, 0x5367, 0x5367, 0x0EE3,

+    0x5368, 0x5368, 0x2A29, 0x5369, 0x5369, 0x1352, 0x536A, 0x536A, 0x2A2A,

+    0x536B, 0x536B, 0x0ECF, 0x536C, 0x536D, 0x2A2B, 0x536E, 0x536E, 0x126A,

+    0x536F, 0x536F, 0x0AB3, 0x5370, 0x5370, 0x1086, 0x5371, 0x5371, 0x0EB2,

+    0x5372, 0x5372, 0x2A2D, 0x5373, 0x5373, 0x0827, 0x5374, 0x5374, 0x0C8F,

+    0x5375, 0x5375, 0x0A78, 0x5376, 0x5376, 0x2A2E, 0x5377, 0x5377, 0x091C,

+    0x5378, 0x5378, 0x0F81, 0x5379, 0x5379, 0x2A2F, 0x537A, 0x537A, 0x1353,

+    0x537B, 0x537E, 0x2A30, 0x537F, 0x537F, 0x0C61, 0x5380, 0x5381, 0x2A34,

+    0x5382, 0x5382, 0x04CC, 0x5383, 0x5383, 0x2A36, 0x5384, 0x5384, 0x0631,

+    0x5385, 0x5385, 0x0E4F, 0x5386, 0x5386, 0x09E5, 0x5387, 0x5388, 0x2A37,

+    0x5389, 0x5389, 0x09E2, 0x538A, 0x538A, 0x2A39, 0x538B, 0x538B, 0x0FE2,

+    0x538C, 0x538C, 0x100A, 0x538D, 0x538D, 0x127D, 0x538E, 0x5394, 0x2A3A,

+    0x5395, 0x5395, 0x04A5, 0x5396, 0x5397, 0x2A41, 0x5398, 0x5398, 0x09D0,

+    0x5399, 0x5399, 0x22C1, 0x539A, 0x539A, 0x07A8, 0x539B, 0x539C, 0x2A43,

+    0x539D, 0x539D, 0x127E, 0x539E, 0x539E, 0x2A45, 0x539F, 0x539F, 0x10F0,

+    0x53A0, 0x53A0, 0x1E64, 0x53A1, 0x53A1, 0x2A46, 0x53A2, 0x53A2, 0x0F4E,

+    0x53A3, 0x53A3, 0x127F, 0x53A4, 0x53A4, 0x2A47, 0x53A5, 0x53A5, 0x1280,

+    0x53A6, 0x53A6, 0x0F30, 0x53A7, 0x53A7, 0x2A48, 0x53A8, 0x53A8, 0x051D,

+    0x53A9, 0x53A9, 0x08F6, 0x53AA, 0x53AC, 0x2A49, 0x53AD, 0x53AD, 0x21F9,

+    0x53AE, 0x53AE, 0x1281, 0x53AF, 0x53B1, 0x2A4C, 0x53B2, 0x53B2, 0x2010,

+    0x53B3, 0x53B3, 0x2A4F, 0x53B4, 0x53B4, 0x22C2, 0x53B5, 0x53B5, 0x2A50,

+    0x53B6, 0x53B6, 0x139C, 0x53B7, 0x53BA, 0x2A51, 0x53BB, 0x53BB, 0x0C80,

+    0x53BC, 0x53BE, 0x2A55, 0x53BF, 0x53BF, 0x0F45, 0x53C0, 0x53C0, 0x2A58,

+    0x53C1, 0x53C1, 0x0CD9, 0x53C2, 0x53C2, 0x0495, 0x53C3, 0x53C3, 0x1E5A,

+    0x53C4, 0x53C7, 0x2A59, 0x53C8, 0x53C8, 0x10BB, 0x53C9, 0x53C9, 0x04AD,

+    0x53CA, 0x53CA, 0x0823, 0x53CB, 0x53CB, 0x10B6, 0x53CC, 0x53CC, 0x0DA0,

+    0x53CD, 0x53CD, 0x0651, 0x53CE, 0x53D0, 0x2A5D, 0x53D1, 0x53D1, 0x063F,

+    0x53D2, 0x53D3, 0x2A60, 0x53D4, 0x53D4, 0x0D7C, 0x53D5, 0x53D5, 0x2A62,

+    0x53D6, 0x53D6, 0x0C7C, 0x53D7, 0x53D7, 0x0D73, 0x53D8, 0x53D8, 0x044D,

+    0x53D9, 0x53D9, 0x0FBB, 0x53DA, 0x53DA, 0x2A63, 0x53DB, 0x53DB, 0x0B92,

+    0x53DC, 0x53DE, 0x2A64, 0x53DF, 0x53DF, 0x1395, 0x53E0, 0x53E0, 0x05DF,

+    0x53E1, 0x53E1, 0x2A67, 0x53E2, 0x53E2, 0x1EA2, 0x53E3, 0x53E3, 0x0967,

+    0x53E4, 0x53E4, 0x071E, 0x53E5, 0x53E5, 0x0913, 0x53E6, 0x53E6, 0x0A36,

+    0x53E7, 0x53E7, 0x2A68, 0x53E8, 0x53E8, 0x14FE, 0x53E9, 0x53E9, 0x14FD,

+    0x53EA, 0x53EA, 0x11BA, 0x53EB, 0x53EB, 0x08A1, 0x53EC, 0x53EC, 0x117A,

+    0x53ED, 0x53ED, 0x03D3, 0x53EE, 0x53EE, 0x05E2, 0x53EF, 0x53EF, 0x0956,

+    0x53F0, 0x53F0, 0x0DFB, 0x53F1, 0x53F1, 0x14FB, 0x53F2, 0x53F2, 0x0D4E,

+    0x53F3, 0x53F3, 0x10B7, 0x53F4, 0x53F4, 0x2A69, 0x53F5, 0x53F5, 0x1285,

+    0x53F6, 0x53F6, 0x103D, 0x53F7, 0x53F7, 0x077C, 0x53F8, 0x53F8, 0x0DB3,

+    0x53F9, 0x53F9, 0x0E11, 0x53FA, 0x53FA, 0x2A6A, 0x53FB, 0x53FB, 0x14FF,

+    0x53FC, 0x53FC, 0x05D1, 0x53FD, 0x53FD, 0x14FC, 0x53FE, 0x53FF, 0x2A6B,

+    0x5400, 0x5400, 0x2A6D, 0x5401, 0x5401, 0x10DA, 0x5402, 0x5402, 0x2A6E,

+    0x5403, 0x5403, 0x04F9, 0x5404, 0x5404, 0x06F2, 0x5405, 0x5405, 0x2A6F,

+    0x5406, 0x5406, 0x1502, 0x5407, 0x5407, 0x2A70, 0x5408, 0x5408, 0x0786,

+    0x5409, 0x5409, 0x081D, 0x540A, 0x540A, 0x05D6, 0x540B, 0x540B, 0x2A71,

+    0x540C, 0x540C, 0x0E5D, 0x540D, 0x540D, 0x0B00, 0x540E, 0x540E, 0x07AA,

+    0x540F, 0x540F, 0x09DF, 0x5410, 0x5410, 0x0E73, 0x5411, 0x5411, 0x0F5F,

+    0x5412, 0x5412, 0x1500, 0x5413, 0x5413, 0x0F32, 0x5414, 0x5414, 0x2A72,

+    0x5415, 0x5415, 0x0A67, 0x5416, 0x5416, 0x1501, 0x5417, 0x5417, 0x0A97,

+    0x5418, 0x541A, 0x2A73, 0x541B, 0x541B, 0x092C, 0x541C, 0x541C, 0x2A76,

+    0x541D, 0x541D, 0x0A28, 0x541E, 0x541E, 0x0E7D, 0x541F, 0x541F, 0x107E,

+    0x5420, 0x5420, 0x066A, 0x5421, 0x5421, 0x1509, 0x5422, 0x5422, 0x2A77,

+    0x5423, 0x5423, 0x150C, 0x5424, 0x5425, 0x2A78, 0x5426, 0x5426, 0x068E,

+    0x5427, 0x5427, 0x03D4, 0x5428, 0x5428, 0x0615, 0x5429, 0x5429, 0x0671,

+    0x542A, 0x542A, 0x2A7A, 0x542B, 0x542B, 0x0763, 0x542C, 0x542C, 0x0E50,

+    0x542D, 0x542D, 0x0961, 0x542E, 0x542E, 0x0DA6, 0x542F, 0x542F, 0x0C13,

+    0x5430, 0x5430, 0x2A7B, 0x5431, 0x5431, 0x11A7, 0x5432, 0x5432, 0x150D,

+    0x5433, 0x5433, 0x2A7C, 0x5434, 0x5434, 0x0EF1, 0x5435, 0x5435, 0x04D8,

+    0x5436, 0x5437, 0x2A7D, 0x5438, 0x5438, 0x0F0B, 0x5439, 0x5439, 0x0538,

+    0x543A, 0x543A, 0x2A7F, 0x543B, 0x543B, 0x0ED6, 0x543C, 0x543C, 0x07A7,

+    0x543D, 0x543D, 0x2A80, 0x543E, 0x543E, 0x0EF0, 0x543F, 0x543F, 0x2A81,

+    0x5440, 0x5440, 0x0FE6, 0x5441, 0x5442, 0x2A82, 0x5443, 0x5443, 0x1508,

+    0x5444, 0x5445, 0x2A84, 0x5446, 0x5446, 0x0577, 0x5447, 0x5447, 0x2A86,

+    0x5448, 0x5448, 0x04EF, 0x5449, 0x5449, 0x2A87, 0x544A, 0x544A, 0x06E1,

+    0x544B, 0x544B, 0x1503, 0x544C, 0x544F, 0x2A88, 0x5450, 0x5450, 0x0B28,

+    0x5451, 0x5451, 0x2A8C, 0x5452, 0x5454, 0x1504, 0x5455, 0x5455, 0x0B7C,

+    0x5456, 0x5456, 0x1507, 0x5457, 0x5457, 0x150A, 0x5458, 0x5458, 0x10F4,

+    0x5459, 0x5459, 0x150B, 0x545A, 0x545A, 0x2A8D, 0x545B, 0x545B, 0x0C37,

+    0x545C, 0x545C, 0x0EE7, 0x545D, 0x5461, 0x2A8E, 0x5462, 0x5462, 0x0B3B,

+    0x5463, 0x5463, 0x2A93, 0x5464, 0x5464, 0x1512, 0x5465, 0x5465, 0x2A94,

+    0x5466, 0x5466, 0x1517, 0x5467, 0x5467, 0x2A95, 0x5468, 0x5468, 0x11DB,

+    0x5469, 0x5470, 0x2A96, 0x5471, 0x5471, 0x1511, 0x5472, 0x5472, 0x1522,

+    0x5473, 0x5473, 0x0EC5, 0x5474, 0x5474, 0x2A9E, 0x5475, 0x5475, 0x077E,

+    0x5476, 0x5476, 0x1516, 0x5477, 0x5477, 0x1510, 0x5478, 0x5478, 0x0B9F,

+    0x5479, 0x547A, 0x2A9F, 0x547B, 0x547B, 0x0D24, 0x547C, 0x547C, 0x07AB,

+    0x547D, 0x547D, 0x0B01, 0x547E, 0x547F, 0x2AA1, 0x5480, 0x5480, 0x0906,

+    0x5481, 0x5481, 0x2AA3, 0x5482, 0x5482, 0x150E, 0x5483, 0x5483, 0x2AA4,

+    0x5484, 0x5484, 0x1515, 0x5485, 0x5485, 0x2AA5, 0x5486, 0x5486, 0x0B99,

+    0x5487, 0x548A, 0x2AA6, 0x548B, 0x548B, 0x1147, 0x548C, 0x548C, 0x0784,

+    0x548D, 0x548D, 0x2AAA, 0x548E, 0x548E, 0x08FB, 0x548F, 0x548F, 0x10A2,

+    0x5490, 0x5490, 0x06BB, 0x5491, 0x5491, 0x2AAB, 0x5492, 0x5492, 0x11E3,

+    0x5493, 0x5493, 0x2AAC, 0x5494, 0x5494, 0x150F, 0x5495, 0x5495, 0x0717,

+    0x5496, 0x5496, 0x0934, 0x5497, 0x5498, 0x2AAD, 0x5499, 0x5499, 0x0A45,

+    0x549A, 0x549B, 0x1513, 0x549C, 0x549C, 0x2AAF, 0x549D, 0x549D, 0x1518,

+    0x549E, 0x54A2, 0x2AB0, 0x54A3, 0x54A3, 0x1523, 0x54A4, 0x54A4, 0x152D,

+    0x54A5, 0x54A5, 0x2AB5, 0x54A6, 0x54A6, 0x151F, 0x54A7, 0x54A7, 0x151E,

+    0x54A8, 0x54A8, 0x1226, 0x54A9, 0x54AA, 0x152B, 0x54AB, 0x54AB, 0x1767,

+    0x54AC, 0x54AC, 0x102E, 0x54AD, 0x54AD, 0x151A, 0x54AE, 0x54AE, 0x2AB6,

+    0x54AF, 0x54AF, 0x0936, 0x54B0, 0x54B0, 0x2AB7, 0x54B1, 0x54B1, 0x111E,

+    0x54B2, 0x54B2, 0x2AB8, 0x54B3, 0x54B3, 0x0955, 0x54B4, 0x54B4, 0x151C,

+    0x54B5, 0x54B7, 0x2AB9, 0x54B8, 0x54B8, 0x0F39, 0x54B9, 0x54BA, 0x2ABC,

+    0x54BB, 0x54BB, 0x1525, 0x54BC, 0x54BC, 0x236D, 0x54BD, 0x54BD, 0x0FF3,

+    0x54BE, 0x54BE, 0x2ABE, 0x54BF, 0x54BF, 0x1526, 0x54C0, 0x54C0, 0x03B2,

+    0x54C1, 0x54C1, 0x0BD6, 0x54C2, 0x54C2, 0x151B, 0x54C3, 0x54C3, 0x2ABF,

+    0x54C4, 0x54C4, 0x079C, 0x54C5, 0x54C5, 0x2AC0, 0x54C6, 0x54C6, 0x061E,

+    0x54C7, 0x54C7, 0x0E8C, 0x54C8, 0x54C8, 0x0757, 0x54C9, 0x54C9, 0x1118,

+    0x54CA, 0x54CB, 0x2AC1, 0x54CC, 0x54CC, 0x1527, 0x54CD, 0x54CD, 0x0F59,

+    0x54CE, 0x54CE, 0x03B0, 0x54CF, 0x54CF, 0x152F, 0x54D0, 0x54D0, 0x1519,

+    0x54D1, 0x54D1, 0x0FEF, 0x54D2, 0x54D2, 0x151D, 0x54D3, 0x54D4, 0x1520,

+    0x54D5, 0x54D5, 0x1524, 0x54D6, 0x54D6, 0x2AC3, 0x54D7, 0x54D7, 0x07BE,

+    0x54D8, 0x54D8, 0x2AC4, 0x54D9, 0x54DA, 0x1528, 0x54DB, 0x54DB, 0x2AC5,

+    0x54DC, 0x54DC, 0x152A, 0x54DD, 0x54DD, 0x152E, 0x54DE, 0x54DE, 0x1530,

+    0x54DF, 0x54DF, 0x1099, 0x54E0, 0x54E0, 0x2AC6, 0x54E1, 0x54E1, 0x2247,

+    0x54E2, 0x54E4, 0x2AC7, 0x54E5, 0x54E5, 0x06E2, 0x54E6, 0x54E6, 0x0B77,

+    0x54E7, 0x54E7, 0x1532, 0x54E8, 0x54E8, 0x0D13, 0x54E9, 0x54E9, 0x09F1,

+    0x54EA, 0x54EA, 0x0B27, 0x54EB, 0x54EC, 0x2ACA, 0x54ED, 0x54ED, 0x096B,

+    0x54EE, 0x54EE, 0x0F65, 0x54EF, 0x54F1, 0x2ACC, 0x54F2, 0x54F2, 0x117D,

+    0x54F3, 0x54F3, 0x1536, 0x54F4, 0x54F9, 0x2ACF, 0x54FA, 0x54FA, 0x047F,

+    0x54FB, 0x54FB, 0x2AD5, 0x54FC, 0x54FC, 0x0796, 0x54FD, 0x54FD, 0x1534,

+    0x54FE, 0x54FE, 0x2AD6, 0x54FF, 0x54FF, 0x1391, 0x5500, 0x5500, 0x2AD7,

+    0x5501, 0x5501, 0x100D, 0x5502, 0x5503, 0x2AD8, 0x5504, 0x5504, 0x236C,

+    0x5505, 0x5505, 0x2ADA, 0x5506, 0x5506, 0x0DE9, 0x5507, 0x5507, 0x0540,

+    0x5508, 0x5508, 0x2ADB, 0x5509, 0x5509, 0x03B1, 0x550A, 0x550E, 0x2ADC,

+    0x550F, 0x550F, 0x1539, 0x5510, 0x5510, 0x0E19, 0x5511, 0x5511, 0x153A,

+    0x5512, 0x5513, 0x2AE1, 0x5514, 0x5514, 0x1535, 0x5515, 0x551A, 0x2AE3,

+    0x551B, 0x551B, 0x1531, 0x551C, 0x551F, 0x2AE9, 0x5520, 0x5520, 0x1533,

+    0x5521, 0x5521, 0x2AED, 0x5522, 0x5523, 0x1537, 0x5524, 0x5524, 0x07D2,

+    0x5525, 0x5526, 0x2AEE, 0x5527, 0x5527, 0x153B, 0x5528, 0x5529, 0x2AF0,

+    0x552A, 0x552A, 0x153C, 0x552B, 0x552B, 0x2AF2, 0x552C, 0x552C, 0x07B8,

+    0x552D, 0x552D, 0x2AF3, 0x552E, 0x552E, 0x0D72, 0x552F, 0x552F, 0x0EB7,

+    0x5530, 0x5530, 0x154D, 0x5531, 0x5531, 0x04CF, 0x5532, 0x5532, 0x2AF4,

+    0x5533, 0x5533, 0x154C, 0x5534, 0x5536, 0x2AF5, 0x5537, 0x5537, 0x1547,

+    0x5538, 0x553B, 0x2AF8, 0x553C, 0x553C, 0x1546, 0x553D, 0x553D, 0x2AFC,

+    0x553E, 0x553E, 0x0E8A, 0x553F, 0x553F, 0x1544, 0x5540, 0x5540, 0x2AFD,

+    0x5541, 0x5541, 0x1542, 0x5542, 0x5542, 0x2AFE, 0x5543, 0x5543, 0x095D,

+    0x5544, 0x5544, 0x1221, 0x5545, 0x5545, 0x2AFF, 0x5546, 0x5546, 0x0D05,

+    0x5547, 0x5548, 0x2B00, 0x5549, 0x5549, 0x1540, 0x554A, 0x554A, 0x03AC,

+    0x554B, 0x554E, 0x2B02, 0x554F, 0x554F, 0x219C, 0x5550, 0x5550, 0x1545,

+    0x5551, 0x5552, 0x2B06, 0x5553, 0x5553, 0x20C9, 0x5554, 0x5554, 0x2B08,

+    0x5555, 0x5555, 0x1543, 0x5556, 0x5556, 0x1548, 0x5557, 0x555B, 0x2B09,

+    0x555C, 0x555C, 0x154E, 0x555D, 0x555D, 0x2B0E, 0x555E, 0x555E, 0x21F0,

+    0x555F, 0x5560, 0x2B0F, 0x5561, 0x5561, 0x0665, 0x5562, 0x5563, 0x2B11,

+    0x5564, 0x5564, 0x0BC0, 0x5565, 0x5565, 0x0CEF, 0x5566, 0x5566, 0x099D,

+    0x5567, 0x5567, 0x153D, 0x5568, 0x5569, 0x2B13, 0x556A, 0x556A, 0x0B7F,

+    0x556B, 0x556B, 0x2B15, 0x556C, 0x556C, 0x127A, 0x556D, 0x556D, 0x1541,

+    0x556E, 0x556E, 0x0B59, 0x556F, 0x5574, 0x2B16, 0x5575, 0x5577, 0x1549,

+    0x5578, 0x5578, 0x0F70, 0x5579, 0x557A, 0x2B1C, 0x557B, 0x557B, 0x155A,

+    0x557C, 0x557C, 0x0E37, 0x557D, 0x557D, 0x2B1E, 0x557E, 0x557E, 0x1557,

+    0x557F, 0x557F, 0x2B1F, 0x5580, 0x5580, 0x0933, 0x5581, 0x5581, 0x1555,

+    0x5582, 0x5582, 0x0EC8, 0x5583, 0x5583, 0x1551, 0x5584, 0x5584, 0x0CFF,

+    0x5585, 0x5586, 0x2B20, 0x5587, 0x5587, 0x0999, 0x5588, 0x5588, 0x1554,

+    0x5589, 0x5589, 0x07A4, 0x558A, 0x558A, 0x0767, 0x558B, 0x558B, 0x154F,

+    0x558C, 0x558E, 0x2B22, 0x558F, 0x558F, 0x153E, 0x5590, 0x5590, 0x2B25,

+    0x5591, 0x5591, 0x1559, 0x5592, 0x5593, 0x2B26, 0x5594, 0x5594, 0x155E,

+    0x5595, 0x5597, 0x2B28, 0x5598, 0x5598, 0x0530, 0x5599, 0x5599, 0x155F,

+    0x559A, 0x559B, 0x2B2B, 0x559C, 0x559C, 0x0F1F, 0x559D, 0x559D, 0x077F,

+    0x559E, 0x559E, 0x2B2D, 0x559F, 0x559F, 0x1556, 0x55A0, 0x55A6, 0x2B2E,

+    0x55A7, 0x55A7, 0x0FC5, 0x55A8, 0x55A9, 0x2B35, 0x55AA, 0x55AA, 0x210B,

+    0x55AB, 0x55AB, 0x2B37, 0x55AC, 0x55AC, 0x20DE, 0x55AD, 0x55AD, 0x2B38,

+    0x55AE, 0x55AE, 0x1EAA, 0x55AF, 0x55B0, 0x2B39, 0x55B1, 0x55B1, 0x1552,

+    0x55B2, 0x55B2, 0x222C, 0x55B3, 0x55B3, 0x113E, 0x55B4, 0x55B4, 0x2B3B,

+    0x55B5, 0x55B5, 0x153F, 0x55B6, 0x55B6, 0x2B3C, 0x55B7, 0x55B7, 0x0BA8,

+    0x55B8, 0x55B8, 0x2B3D, 0x55B9, 0x55B9, 0x1553, 0x55BA, 0x55BA, 0x2B3E,

+    0x55BB, 0x55BB, 0x10DC, 0x55BC, 0x55BC, 0x2B3F, 0x55BD, 0x55BE, 0x155C,

+    0x55BF, 0x55C3, 0x2B40, 0x55C4, 0x55C4, 0x156A, 0x55C5, 0x55C5, 0x0FAC,

+    0x55C6, 0x55C6, 0x20D8, 0x55C7, 0x55C7, 0x22C0, 0x55C8, 0x55C8, 0x2B45,

+    0x55C9, 0x55C9, 0x1562, 0x55CA, 0x55CB, 0x2B46, 0x55CC, 0x55CD, 0x156F,

+    0x55CE, 0x55CE, 0x206F, 0x55CF, 0x55D0, 0x2B48, 0x55D1, 0x55D1, 0x1564,

+    0x55D2, 0x55D2, 0x1550, 0x55D3, 0x55D3, 0x0CDD, 0x55D4, 0x55D4, 0x1567,

+    0x55D5, 0x55D5, 0x2B4A, 0x55D6, 0x55D6, 0x1558, 0x55D7, 0x55D9, 0x2B4B,

+    0x55DA, 0x55DA, 0x21A1, 0x55DB, 0x55DB, 0x2B4E, 0x55DC, 0x55DC, 0x0D5F,

+    0x55DD, 0x55DD, 0x1569, 0x55DE, 0x55DE, 0x2B4F, 0x55DF, 0x55DF, 0x155B,

+    0x55E0, 0x55E0, 0x2B50, 0x55E1, 0x55E1, 0x0EDA, 0x55E2, 0x55E2, 0x2B51,

+    0x55E3, 0x55E3, 0x0DB8, 0x55E4, 0x55E4, 0x1573, 0x55E5, 0x55E5, 0x156C,

+    0x55E6, 0x55E6, 0x1568, 0x55E7, 0x55E7, 0x2B52, 0x55E8, 0x55E8, 0x1571,

+    0x55E9, 0x55E9, 0x2379, 0x55EA, 0x55EA, 0x1560, 0x55EB, 0x55EC, 0x1565,

+    0x55ED, 0x55EE, 0x2B53, 0x55EF, 0x55EF, 0x156B, 0x55F0, 0x55F1, 0x2B55,

+    0x55F2, 0x55F3, 0x156D, 0x55F4, 0x55F4, 0x2B57, 0x55F5, 0x55F5, 0x1572,

+    0x55F6, 0x55F6, 0x2372, 0x55F7, 0x55F7, 0x1561, 0x55F8, 0x55FC, 0x2B58,

+    0x55FD, 0x55FD, 0x0DC9, 0x55FE, 0x55FE, 0x157B, 0x55FF, 0x55FF, 0x2B5D,

+    0x5600, 0x5600, 0x157C, 0x5601, 0x5601, 0x1578, 0x5602, 0x5605, 0x2B5E,

+    0x5606, 0x5606, 0x216A, 0x5607, 0x5607, 0x2B62, 0x5608, 0x5608, 0x1576,

+    0x5609, 0x5609, 0x0841, 0x560A, 0x560B, 0x2B63, 0x560C, 0x560C, 0x1577,

+    0x560D, 0x560D, 0x237C, 0x560E, 0x560E, 0x06BD, 0x560F, 0x560F, 0x127B,

+    0x5610, 0x5613, 0x2B65, 0x5614, 0x5614, 0x20B0, 0x5615, 0x5615, 0x2B69,

+    0x5616, 0x5616, 0x237A, 0x5617, 0x5617, 0x1E74, 0x5618, 0x5618, 0x0FB5,

+    0x5619, 0x561A, 0x2B6A, 0x561B, 0x561B, 0x0A96, 0x561C, 0x561C, 0x2377,

+    0x561D, 0x561D, 0x2B6C, 0x561E, 0x561E, 0x1575, 0x561F, 0x561F, 0x1563,

+    0x5620, 0x5622, 0x2B6D, 0x5623, 0x5623, 0x157A, 0x5624, 0x5624, 0x1579,

+    0x5625, 0x5626, 0x2B70, 0x5627, 0x5627, 0x157D, 0x5628, 0x5628, 0x2B72,

+    0x5629, 0x5629, 0x1F4C, 0x562A, 0x562B, 0x2B73, 0x562C, 0x562C, 0x1582,

+    0x562D, 0x562D, 0x157E, 0x562E, 0x562E, 0x2378, 0x562F, 0x562F, 0x21CF,

+    0x5630, 0x5630, 0x2368, 0x5631, 0x5631, 0x11F5, 0x5632, 0x5632, 0x04D5,

+    0x5633, 0x5633, 0x2B75, 0x5634, 0x5634, 0x1249, 0x5635, 0x5635, 0x2371,

+    0x5636, 0x5636, 0x0DB0, 0x5637, 0x5637, 0x2B76, 0x5638, 0x5638, 0x2369,

+    0x5639, 0x5639, 0x1580, 0x563A, 0x563A, 0x2B77, 0x563B, 0x563B, 0x0F0A,

+    0x563C, 0x563E, 0x2B78, 0x563F, 0x563F, 0x0790, 0x5640, 0x5640, 0x2B7B,

+    0x5641, 0x5641, 0x2674, 0x5642, 0x564B, 0x2B7C, 0x564C, 0x564C, 0x1587,

+    0x564D, 0x564D, 0x1583, 0x564E, 0x564E, 0x1034, 0x564F, 0x5653, 0x2B86,

+    0x5654, 0x5654, 0x1588, 0x5655, 0x5656, 0x2B8B, 0x5657, 0x5657, 0x1581,

+    0x5658, 0x5658, 0x157F, 0x5659, 0x5659, 0x1585, 0x565A, 0x565B, 0x2B8D,

+    0x565C, 0x565C, 0x1586, 0x565D, 0x565D, 0x236F, 0x565E, 0x565F, 0x2B8F,

+    0x5660, 0x5660, 0x2370, 0x5661, 0x5661, 0x2B91, 0x5662, 0x5662, 0x1584,

+    0x5663, 0x5663, 0x2B92, 0x5664, 0x5664, 0x158A, 0x5665, 0x5665, 0x2376,

+    0x5666, 0x5666, 0x2373, 0x5667, 0x5667, 0x2B93, 0x5668, 0x5668, 0x0C16,

+    0x5669, 0x5669, 0x1262, 0x566A, 0x566A, 0x112E, 0x566B, 0x566B, 0x158C,

+    0x566C, 0x566C, 0x0D60, 0x566D, 0x566E, 0x2B94, 0x566F, 0x566F, 0x237F,

+    0x5670, 0x5670, 0x2B96, 0x5671, 0x5671, 0x158B, 0x5672, 0x5672, 0x2374,

+    0x5673, 0x5673, 0x2B97, 0x5674, 0x5674, 0x20B5, 0x5675, 0x5675, 0x2B98,

+    0x5676, 0x5676, 0x06BC, 0x5677, 0x5677, 0x2B99, 0x5678, 0x5678, 0x1EDB,

+    0x5679, 0x5679, 0x2672, 0x567A, 0x567A, 0x2B9A, 0x567B, 0x567C, 0x158D,

+    0x567D, 0x567F, 0x2B9B, 0x5680, 0x5680, 0x236E, 0x5681, 0x5684, 0x2B9E,

+    0x5685, 0x5685, 0x158F, 0x5686, 0x5686, 0x1589, 0x5687, 0x5687, 0x21B7,

+    0x5688, 0x568B, 0x2BA2, 0x568C, 0x568C, 0x2375, 0x568D, 0x568D, 0x2BA6,

+    0x568E, 0x568E, 0x0776, 0x568F, 0x568F, 0x0E3A, 0x5690, 0x5692, 0x2BA7,

+    0x5693, 0x5693, 0x1590, 0x5694, 0x5694, 0x2BAA, 0x5695, 0x5695, 0x2382,

+    0x5696, 0x5698, 0x2BAB, 0x5699, 0x5699, 0x209E, 0x569A, 0x56A2, 0x2BAE,

+    0x56A3, 0x56A3, 0x0F66, 0x56A4, 0x56A5, 0x2BB7, 0x56A6, 0x56A6, 0x236B,

+    0x56A7, 0x56A7, 0x2BB9, 0x56A8, 0x56A8, 0x2039, 0x56A9, 0x56AD, 0x2BBA,

+    0x56AE, 0x56AE, 0x269F, 0x56AF, 0x56AF, 0x1591, 0x56B0, 0x56B2, 0x2BBF,

+    0x56B3, 0x56B3, 0x237D, 0x56B4, 0x56B4, 0x21F5, 0x56B5, 0x56B5, 0x2BC2,

+    0x56B6, 0x56B6, 0x2381, 0x56B7, 0x56B7, 0x0C9D, 0x56B8, 0x56BB, 0x2BC3,

+    0x56BC, 0x56BC, 0x0891, 0x56BD, 0x56BF, 0x2BC7, 0x56C0, 0x56C0, 0x237B,

+    0x56C1, 0x56C1, 0x237E, 0x56C2, 0x56C2, 0x21CC, 0x56C3, 0x56C4, 0x2BCA,

+    0x56C5, 0x56C5, 0x22DB, 0x56C6, 0x56C7, 0x2BCC, 0x56C8, 0x56C8, 0x236A,

+    0x56C9, 0x56C9, 0x2689, 0x56CA, 0x56CA, 0x0B35, 0x56CB, 0x56CB, 0x2BCE,

+    0x56CC, 0x56CC, 0x2697, 0x56CD, 0x56D0, 0x2BCF, 0x56D1, 0x56D1, 0x22A1,

+    0x56D2, 0x56D3, 0x2BD3, 0x56D4, 0x56D4, 0x1592, 0x56D5, 0x56D6, 0x2BD5,

+    0x56D7, 0x56D7, 0x1593, 0x56D8, 0x56D9, 0x2BD7, 0x56DA, 0x56DA, 0x0C71,

+    0x56DB, 0x56DB, 0x0DB9, 0x56DC, 0x56DC, 0x2BD9, 0x56DD, 0x56DD, 0x1594,

+    0x56DE, 0x56DE, 0x07ED, 0x56DF, 0x56DF, 0x126C, 0x56E0, 0x56E0, 0x1079,

+    0x56E1, 0x56E1, 0x1595, 0x56E2, 0x56E2, 0x0E76, 0x56E3, 0x56E3, 0x2BDA,

+    0x56E4, 0x56E4, 0x0619, 0x56E5, 0x56EA, 0x2BDB, 0x56EB, 0x56EB, 0x1597,

+    0x56EC, 0x56EC, 0x2BE1, 0x56ED, 0x56ED, 0x10F3, 0x56EE, 0x56EF, 0x2BE2,

+    0x56F0, 0x56F0, 0x0992, 0x56F1, 0x56F1, 0x0554, 0x56F2, 0x56F3, 0x2BE4,

+    0x56F4, 0x56F4, 0x0EB6, 0x56F5, 0x56F5, 0x1596, 0x56F6, 0x56F8, 0x2BE6,

+    0x56F9, 0x56F9, 0x1598, 0x56FA, 0x56FA, 0x0725, 0x56FB, 0x56FC, 0x2BE9,

+    0x56FD, 0x56FD, 0x0753, 0x56FE, 0x56FE, 0x0E6D, 0x56FF, 0x56FF, 0x1599,

+    0x5700, 0x5702, 0x2BEB, 0x5703, 0x5703, 0x0BF3, 0x5704, 0x5704, 0x159A,

+    0x5705, 0x5705, 0x2BEE, 0x5706, 0x5706, 0x10F5, 0x5707, 0x5707, 0x2383,

+    0x5708, 0x5708, 0x0C81, 0x5709, 0x5709, 0x159C, 0x570A, 0x570A, 0x159B,

+    0x570B, 0x570B, 0x1F3D, 0x570C, 0x570C, 0x2BEF, 0x570D, 0x570D, 0x218F,

+    0x570E, 0x5711, 0x2BF0, 0x5712, 0x5712, 0x2246, 0x5713, 0x5713, 0x2248,

+    0x5714, 0x5715, 0x2BF4, 0x5716, 0x5716, 0x217E, 0x5717, 0x5717, 0x2BF6,

+    0x5718, 0x5718, 0x2180, 0x5719, 0x571B, 0x2BF7, 0x571C, 0x571C, 0x159D,

+    0x571D, 0x571E, 0x2BFA, 0x571F, 0x571F, 0x0E72, 0x5720, 0x5722, 0x2BFC,

+    0x5723, 0x5723, 0x0D3C, 0x5724, 0x5727, 0x2BFF, 0x5728, 0x5728, 0x111D,

+    0x5729, 0x5729, 0x13A7, 0x572A, 0x572A, 0x13A9, 0x572B, 0x572B, 0x2C03,

+    0x572C, 0x572C, 0x13A8, 0x572D, 0x572D, 0x0740, 0x572E, 0x572F, 0x13AC,

+    0x5730, 0x5730, 0x05B9, 0x5731, 0x5732, 0x2C04, 0x5733, 0x5733, 0x13AA,

+    0x5734, 0x5738, 0x2C06, 0x5739, 0x5739, 0x13AB, 0x573A, 0x573A, 0x04C6,

+    0x573B, 0x573B, 0x13AF, 0x573C, 0x573D, 0x2C0B, 0x573E, 0x573E, 0x080D,

+    0x573F, 0x573F, 0x2C0D, 0x5740, 0x5740, 0x11B6, 0x5741, 0x5741, 0x2C0E,

+    0x5742, 0x5742, 0x13B0, 0x5743, 0x5746, 0x2C0F, 0x5747, 0x5747, 0x0928,

+    0x5748, 0x5749, 0x2C13, 0x574A, 0x574A, 0x0658, 0x574B, 0x574B, 0x2C15,

+    0x574C, 0x574C, 0x13A0, 0x574D, 0x574D, 0x0E01, 0x574E, 0x574E, 0x093F,

+    0x574F, 0x574F, 0x07CA, 0x5750, 0x5750, 0x1255, 0x5751, 0x5751, 0x0960,

+    0x5752, 0x5756, 0x2C16, 0x5757, 0x5757, 0x0976, 0x5758, 0x5759, 0x2C1B,

+    0x575A, 0x575A, 0x0854, 0x575B, 0x575B, 0x0E06, 0x575C, 0x575C, 0x13AE,

+    0x575D, 0x575D, 0x03DE, 0x575E, 0x575E, 0x0EFA, 0x575F, 0x575F, 0x0675,

+    0x5760, 0x5760, 0x1216, 0x5761, 0x5761, 0x0BE1, 0x5762, 0x5763, 0x2C1D,

+    0x5764, 0x5764, 0x098F, 0x5765, 0x5765, 0x2C1F, 0x5766, 0x5766, 0x0E0C,

+    0x5767, 0x5767, 0x2C20, 0x5768, 0x5768, 0x13B7, 0x5769, 0x5769, 0x13B1,

+    0x576A, 0x576A, 0x0BD9, 0x576B, 0x576B, 0x13B3, 0x576C, 0x576C, 0x2C21,

+    0x576D, 0x576D, 0x13B8, 0x576E, 0x576E, 0x2C22, 0x576F, 0x576F, 0x0BB8,

+    0x5770, 0x5772, 0x2C23, 0x5773, 0x5773, 0x13BA, 0x5774, 0x5775, 0x2C26,

+    0x5776, 0x5776, 0x13B9, 0x5777, 0x5777, 0x094D, 0x5778, 0x577A, 0x2C28,

+    0x577B, 0x577B, 0x13B6, 0x577C, 0x577C, 0x13B5, 0x577D, 0x5781, 0x2C2B,

+    0x5782, 0x5782, 0x053C, 0x5783, 0x5783, 0x0997, 0x5784, 0x5784, 0x0A49,

+    0x5785, 0x5785, 0x13B2, 0x5786, 0x5786, 0x13B4, 0x5787, 0x578A, 0x2C30,

+    0x578B, 0x578B, 0x0F98, 0x578C, 0x578C, 0x13BD, 0x578D, 0x5791, 0x2C34,

+    0x5792, 0x5792, 0x09C8, 0x5793, 0x5793, 0x13C2, 0x5794, 0x579A, 0x2C39,

+    0x579B, 0x579B, 0x0621, 0x579C, 0x579F, 0x2C40, 0x57A0, 0x57A0, 0x13C3,

+    0x57A1, 0x57A1, 0x13A2, 0x57A2, 0x57A2, 0x0711, 0x57A3, 0x57A3, 0x10EE,

+    0x57A4, 0x57A4, 0x13BC, 0x57A5, 0x57A5, 0x2C44, 0x57A6, 0x57A6, 0x095E,

+    0x57A7, 0x57A7, 0x13C0, 0x57A8, 0x57A8, 0x2C45, 0x57A9, 0x57A9, 0x13A1,

+    0x57AA, 0x57AA, 0x2C46, 0x57AB, 0x57AB, 0x05C7, 0x57AC, 0x57AC, 0x2C47,

+    0x57AD, 0x57AD, 0x13BB, 0x57AE, 0x57AE, 0x0972, 0x57AF, 0x57B1, 0x2C48,

+    0x57B2, 0x57B2, 0x13BE, 0x57B3, 0x57B3, 0x2C4B, 0x57B4, 0x57B4, 0x13C1,

+    0x57B5, 0x57B7, 0x2C4C, 0x57B8, 0x57B8, 0x13C9, 0x57B9, 0x57C1, 0x2C4F,

+    0x57C2, 0x57C2, 0x06FA, 0x57C3, 0x57C3, 0x03AE, 0x57C4, 0x57CA, 0x2C58,

+    0x57CB, 0x57CB, 0x0A98, 0x57CC, 0x57CD, 0x2C5F, 0x57CE, 0x57CE, 0x04EC,

+    0x57CF, 0x57CF, 0x13BF, 0x57D0, 0x57D1, 0x2C61, 0x57D2, 0x57D2, 0x13C8,

+    0x57D3, 0x57D3, 0x2C63, 0x57D4, 0x57D4, 0x0BF1, 0x57D5, 0x57D5, 0x13C4,

+    0x57D6, 0x57D7, 0x2C64, 0x57D8, 0x57D8, 0x13C5, 0x57D9, 0x57D9, 0x13C7,

+    0x57DA, 0x57DA, 0x13C6, 0x57DB, 0x57DC, 0x2C66, 0x57DD, 0x57DD, 0x13CE,

+    0x57DE, 0x57DE, 0x2C68, 0x57DF, 0x57DF, 0x10D7, 0x57E0, 0x57E0, 0x0481,

+    0x57E1, 0x57E1, 0x232A, 0x57E2, 0x57E3, 0x2C69, 0x57E4, 0x57E4, 0x13CD,

+    0x57E5, 0x57EC, 0x2C6B, 0x57ED, 0x57ED, 0x13D2, 0x57EE, 0x57EE, 0x2C73,

+    0x57EF, 0x57EF, 0x13CB, 0x57F0, 0x57F3, 0x2C74, 0x57F4, 0x57F4, 0x13CA,

+    0x57F5, 0x57F6, 0x2C78, 0x57F7, 0x57F7, 0x228B, 0x57F8, 0x57F8, 0x13CC,

+    0x57F9, 0x57F9, 0x0BA1, 0x57FA, 0x57FA, 0x080E, 0x57FB, 0x57FC, 0x2C7A,

+    0x57FD, 0x57FD, 0x13D1, 0x57FE, 0x57FF, 0x2C7C, 0x5800, 0x5800, 0x13D3,

+    0x5801, 0x5801, 0x2C7E, 0x5802, 0x5802, 0x0E16, 0x5803, 0x5804, 0x2C7F,

+    0x5805, 0x5805, 0x1F85, 0x5806, 0x5806, 0x0610, 0x5807, 0x5807, 0x144C,

+    0x5808, 0x5809, 0x2C81, 0x580A, 0x580A, 0x2325, 0x580B, 0x580B, 0x13CF,

+    0x580C, 0x580C, 0x2C83, 0x580D, 0x580D, 0x13D0, 0x580E, 0x5810, 0x2C84,

+    0x5811, 0x5811, 0x0C32, 0x5812, 0x5814, 0x2C87, 0x5815, 0x5815, 0x0628,

+    0x5816, 0x5816, 0x232C, 0x5817, 0x5818, 0x2C8A, 0x5819, 0x5819, 0x13D5,

+    0x581A, 0x581C, 0x2C8C, 0x581D, 0x581D, 0x232E, 0x581E, 0x581E, 0x13D4,

+    0x581F, 0x581F, 0x2C8F, 0x5820, 0x5820, 0x13D7, 0x5821, 0x5821, 0x040D,

+    0x5822, 0x5823, 0x2C90, 0x5824, 0x5824, 0x05AD, 0x5825, 0x5829, 0x2C92,

+    0x582A, 0x582A, 0x093D, 0x582B, 0x582E, 0x2C97, 0x582F, 0x582F, 0x2205,

+    0x5830, 0x5830, 0x1008, 0x5831, 0x5831, 0x1E38, 0x5832, 0x5833, 0x2C9B,

+    0x5834, 0x5834, 0x1E73, 0x5835, 0x5835, 0x0601, 0x5836, 0x5843, 0x2C9D,

+    0x5844, 0x5844, 0x13D6, 0x5845, 0x5849, 0x2CAB, 0x584A, 0x584A, 0x1FE3,

+    0x584B, 0x584B, 0x2339, 0x584C, 0x584C, 0x0DEF, 0x584D, 0x584D, 0x19A3,

+    0x584E, 0x584E, 0x2CB0, 0x584F, 0x584F, 0x232B, 0x5850, 0x5850, 0x2CB1,

+    0x5851, 0x5851, 0x0DD1, 0x5852, 0x5852, 0x232D, 0x5853, 0x5853, 0x2CB2,

+    0x5854, 0x5854, 0x0DF3, 0x5855, 0x5856, 0x2CB3, 0x5857, 0x5857, 0x217F,

+    0x5858, 0x5858, 0x0E14, 0x5859, 0x585D, 0x2CB5, 0x585E, 0x585E, 0x0CD6,

+    0x585F, 0x5861, 0x2CBA, 0x5862, 0x5862, 0x21A7, 0x5863, 0x5863, 0x2CBD,

+    0x5864, 0x5864, 0x232F, 0x5865, 0x5865, 0x13D8, 0x5866, 0x586A, 0x2CBE,

+    0x586B, 0x586B, 0x0E41, 0x586C, 0x586C, 0x13D9, 0x586D, 0x5874, 0x2CC3,

+    0x5875, 0x5875, 0x1E7D, 0x5876, 0x5878, 0x2CCB, 0x5879, 0x5879, 0x20D6,

+    0x587A, 0x587D, 0x2CCE, 0x587E, 0x587E, 0x13A3, 0x587F, 0x587F, 0x2CD2,

+    0x5880, 0x5880, 0x13DD, 0x5881, 0x5881, 0x13DA, 0x5882, 0x5882, 0x2CD3,

+    0x5883, 0x5883, 0x08E2, 0x5884, 0x5884, 0x2CD4, 0x5885, 0x5885, 0x0D92,

+    0x5886, 0x5888, 0x2CD5, 0x5889, 0x5889, 0x13DB, 0x588A, 0x588A, 0x1EC2,

+    0x588B, 0x5891, 0x2CD8, 0x5892, 0x5892, 0x0D03, 0x5893, 0x5893, 0x0B1C,

+    0x5894, 0x5898, 0x2CDF, 0x5899, 0x5899, 0x0C3A, 0x589A, 0x589A, 0x13DC,

+    0x589B, 0x589B, 0x2CE4, 0x589C, 0x589C, 0x22B2, 0x589D, 0x589D, 0x2CE5,

+    0x589E, 0x589E, 0x1139, 0x589F, 0x589F, 0x0FB1, 0x58A0, 0x58A7, 0x2CE6,

+    0x58A8, 0x58A8, 0x0B0E, 0x58A9, 0x58A9, 0x0614, 0x58AA, 0x58AD, 0x2CEE,

+    0x58AE, 0x58AE, 0x1EDF, 0x58AF, 0x58B2, 0x2CF2, 0x58B3, 0x58B3, 0x1EF9,

+    0x58B4, 0x58BA, 0x2CF6, 0x58BB, 0x58BB, 0x20D9, 0x58BC, 0x58BC, 0x13A4,

+    0x58BD, 0x58BD, 0x2CFD, 0x58BE, 0x58BE, 0x1FDD, 0x58BF, 0x58C0, 0x2CFE,

+    0x58C1, 0x58C1, 0x0443, 0x58C2, 0x58C4, 0x2D00, 0x58C5, 0x58C5, 0x13A5,

+    0x58C6, 0x58C6, 0x2D03, 0x58C7, 0x58C7, 0x2167, 0x58C8, 0x58D0, 0x2D04,

+    0x58D1, 0x58D1, 0x13A6, 0x58D2, 0x58D2, 0x2D0D, 0x58D3, 0x58D3, 0x21ED,

+    0x58D4, 0x58D4, 0x2D0E, 0x58D5, 0x58D5, 0x0775, 0x58D6, 0x58D7, 0x2D0F,

+    0x58D8, 0x58D8, 0x2007, 0x58D9, 0x58D9, 0x2326, 0x58DA, 0x58DA, 0x2329,

+    0x58DB, 0x58DD, 0x2D11, 0x58DE, 0x58DE, 0x1F52, 0x58DF, 0x58DF, 0x203B,

+    0x58E0, 0x58E0, 0x2328, 0x58E1, 0x58E1, 0x2D14, 0x58E2, 0x58E2, 0x2327,

+    0x58E3, 0x58E3, 0x2D15, 0x58E4, 0x58E4, 0x0C9B, 0x58E5, 0x58E8, 0x2D16,

+    0x58E9, 0x58E9, 0x1E2B, 0x58EA, 0x58EA, 0x2D1A, 0x58EB, 0x58EB, 0x0D56,

+    0x58EC, 0x58EC, 0x0CA4, 0x58ED, 0x58ED, 0x2D1B, 0x58EE, 0x58EE, 0x1210,

+    0x58EF, 0x58EF, 0x22AE, 0x58F0, 0x58F0, 0x0D32, 0x58F1, 0x58F2, 0x2D1C,

+    0x58F3, 0x58F3, 0x0954, 0x58F4, 0x58F5, 0x2D1E, 0x58F6, 0x58F6, 0x07AF,

+    0x58F7, 0x58F8, 0x2D20, 0x58F9, 0x58F9, 0x1043, 0x58FA, 0x58FA, 0x1F49,

+    0x58FB, 0x58FC, 0x2D22, 0x58FD, 0x58FD, 0x2138, 0x58FE, 0x58FF, 0x2D24,

+    0x5900, 0x5901, 0x2D26, 0x5902, 0x5902, 0x161C, 0x5903, 0x5903, 0x2D28,

+    0x5904, 0x5904, 0x0529, 0x5905, 0x5906, 0x2D29, 0x5907, 0x5907, 0x0421,

+    0x5908, 0x590C, 0x2D2B, 0x590D, 0x590D, 0x06AF, 0x590E, 0x590E, 0x2D30,

+    0x590F, 0x590F, 0x0F31, 0x5910, 0x5913, 0x2D31, 0x5914, 0x5914, 0x12FB,

+    0x5915, 0x5915, 0x0F13, 0x5916, 0x5916, 0x0E93, 0x5917, 0x5918, 0x2D35,

+    0x5919, 0x5919, 0x1301, 0x591A, 0x591A, 0x061F, 0x591B, 0x591B, 0x2D37,

+    0x591C, 0x591C, 0x1040, 0x591D, 0x591E, 0x2D38, 0x591F, 0x591F, 0x0714,

+    0x5920, 0x5921, 0x2D3A, 0x5922, 0x5922, 0x2081, 0x5923, 0x5923, 0x2D3C,

+    0x5924, 0x5924, 0x161B, 0x5925, 0x5925, 0x1619, 0x5926, 0x5926, 0x2D3D,

+    0x5927, 0x5927, 0x0576, 0x5928, 0x5928, 0x2D3E, 0x5929, 0x5929, 0x0E3F,

+    0x592A, 0x592A, 0x0DFE, 0x592B, 0x592B, 0x068F, 0x592C, 0x592C, 0x2D3F,

+    0x592D, 0x592D, 0x1268, 0x592E, 0x592E, 0x1014, 0x592F, 0x592F, 0x0772,

+    0x5930, 0x5930, 0x2D40, 0x5931, 0x5931, 0x0D3E, 0x5932, 0x5933, 0x2D41,

+    0x5934, 0x5934, 0x0E68, 0x5935, 0x5936, 0x2D43, 0x5937, 0x5937, 0x104B,

+    0x5938, 0x5938, 0x0971, 0x5939, 0x5939, 0x0843, 0x593A, 0x593A, 0x0620,

+    0x593B, 0x593B, 0x2D45, 0x593C, 0x593C, 0x14AF, 0x593D, 0x593D, 0x2D46,

+    0x593E, 0x593E, 0x1F7C, 0x593F, 0x5940, 0x2D47, 0x5941, 0x5941, 0x14B0,

+    0x5942, 0x5942, 0x138C, 0x5943, 0x5943, 0x2D49, 0x5944, 0x5944, 0x1002,

+    0x5945, 0x5946, 0x2D4A, 0x5947, 0x5947, 0x0C05, 0x5948, 0x5948, 0x0B31,

+    0x5949, 0x5949, 0x068B, 0x594A, 0x594A, 0x2D4C, 0x594B, 0x594B, 0x0679,

+    0x594C, 0x594D, 0x2D4D, 0x594E, 0x594E, 0x0989, 0x594F, 0x594F, 0x123D,

+    0x5950, 0x5950, 0x2D4F, 0x5951, 0x5951, 0x0C14, 0x5952, 0x5953, 0x2D50,

+    0x5954, 0x5954, 0x0425, 0x5955, 0x5955, 0x14B2, 0x5956, 0x5956, 0x0882,

+    0x5957, 0x5957, 0x0E2A, 0x5958, 0x5958, 0x14B4, 0x5959, 0x5959, 0x2D52,

+    0x595A, 0x595A, 0x14B3, 0x595B, 0x595F, 0x2D53, 0x5960, 0x5960, 0x05CD,

+    0x5961, 0x5961, 0x2D58, 0x5962, 0x5962, 0x0D16, 0x5963, 0x5964, 0x2D59,

+    0x5965, 0x5965, 0x03CD, 0x5966, 0x5968, 0x2D5B, 0x5969, 0x5969, 0x235B,

+    0x596A, 0x596A, 0x1EDE, 0x596B, 0x596B, 0x2D5E, 0x596C, 0x596C, 0x1FA2,

+    0x596D, 0x596D, 0x2D5F, 0x596E, 0x596E, 0x1EFA, 0x596F, 0x5972, 0x2D60,

+    0x5973, 0x5973, 0x0B6F, 0x5974, 0x5974, 0x0B6C, 0x5975, 0x5975, 0x2D64,

+    0x5976, 0x5976, 0x0B2F, 0x5977, 0x5977, 0x2D65, 0x5978, 0x5978, 0x085C,

+    0x5979, 0x5979, 0x0DF2, 0x597A, 0x597C, 0x2D66, 0x597D, 0x597D, 0x077A,

+    0x597E, 0x5980, 0x2D69, 0x5981, 0x5981, 0x1775, 0x5982, 0x5982, 0x0CC2,

+    0x5983, 0x5983, 0x1776, 0x5984, 0x5984, 0x0EAE, 0x5985, 0x5985, 0x2D6C,

+    0x5986, 0x5986, 0x120E, 0x5987, 0x5987, 0x06B9, 0x5988, 0x5988, 0x0A8F,

+    0x5989, 0x5989, 0x2D6D, 0x598A, 0x598A, 0x0CAC, 0x598B, 0x598C, 0x2D6E,

+    0x598D, 0x598D, 0x1777, 0x598E, 0x5991, 0x2D70, 0x5992, 0x5992, 0x0609,

+    0x5993, 0x5993, 0x083E, 0x5994, 0x5995, 0x2D74, 0x5996, 0x5996, 0x1026,

+    0x5997, 0x5997, 0x177B, 0x5998, 0x5998, 0x2D76, 0x5999, 0x5999, 0x0AF3,

+    0x599A, 0x599C, 0x2D77, 0x599D, 0x599D, 0x22AD, 0x599E, 0x599E, 0x177E,

+    0x599F, 0x59A2, 0x2D7A, 0x59A3, 0x59A3, 0x177A, 0x59A4, 0x59A4, 0x177F,

+    0x59A5, 0x59A5, 0x0E88, 0x59A6, 0x59A7, 0x2D7E, 0x59A8, 0x59A8, 0x065E,

+    0x59A9, 0x59AA, 0x1778, 0x59AB, 0x59AB, 0x177D, 0x59AC, 0x59AD, 0x2D80,

+    0x59AE, 0x59AE, 0x0B40, 0x59AF, 0x59AF, 0x1782, 0x59B0, 0x59B1, 0x2D82,

+    0x59B2, 0x59B2, 0x1781, 0x59B3, 0x59B8, 0x2D84, 0x59B9, 0x59B9, 0x0AC8,

+    0x59BA, 0x59BA, 0x2D8A, 0x59BB, 0x59BB, 0x0BFD, 0x59BC, 0x59BD, 0x2D8B,

+    0x59BE, 0x59BE, 0x1784, 0x59BF, 0x59C5, 0x2D8D, 0x59C6, 0x59C6, 0x0B1A,

+    0x59C7, 0x59C9, 0x2D94, 0x59CA, 0x59CA, 0x177C, 0x59CB, 0x59CB, 0x0D53,

+    0x59CC, 0x59CF, 0x2D97, 0x59D0, 0x59D0, 0x08B4, 0x59D1, 0x59D1, 0x071C,

+    0x59D2, 0x59D2, 0x1780, 0x59D3, 0x59D3, 0x0FA0, 0x59D4, 0x59D4, 0x0EBE,

+    0x59D5, 0x59D6, 0x2D9B, 0x59D7, 0x59D7, 0x1783, 0x59D8, 0x59D8, 0x178A,

+    0x59D9, 0x59D9, 0x2D9D, 0x59DA, 0x59DA, 0x102D, 0x59DB, 0x59DB, 0x2D9E,

+    0x59DC, 0x59DC, 0x087B, 0x59DD, 0x59DD, 0x1787, 0x59DE, 0x59E2, 0x2D9F,

+    0x59E3, 0x59E3, 0x1789, 0x59E4, 0x59E4, 0x2DA4, 0x59E5, 0x59E5, 0x09BC,

+    0x59E6, 0x59E7, 0x2DA5, 0x59E8, 0x59E8, 0x1053, 0x59E9, 0x59EB, 0x2DA7,

+    0x59EC, 0x59EC, 0x081A, 0x59ED, 0x59F8, 0x2DAA, 0x59F9, 0x59F9, 0x178B,

+    0x59FA, 0x59FA, 0x2DB6, 0x59FB, 0x59FB, 0x107D, 0x59FC, 0x59FE, 0x2DB7,

+    0x59FF, 0x59FF, 0x1228, 0x5A00, 0x5A00, 0x2DBA, 0x5A01, 0x5A01, 0x0EAF,

+    0x5A02, 0x5A02, 0x2DBB, 0x5A03, 0x5A03, 0x0E8F, 0x5A04, 0x5A04, 0x0A4D,

+    0x5A05, 0x5A06, 0x1785, 0x5A07, 0x5A07, 0x0890, 0x5A08, 0x5A08, 0x1788,

+    0x5A09, 0x5A09, 0x178D, 0x5A0A, 0x5A0B, 0x2DBC, 0x5A0C, 0x5A0C, 0x178C,

+    0x5A0D, 0x5A10, 0x2DBE, 0x5A11, 0x5A11, 0x1790, 0x5A12, 0x5A12, 0x2DC2,

+    0x5A13, 0x5A13, 0x1792, 0x5A14, 0x5A17, 0x2DC3, 0x5A18, 0x5A18, 0x0B52,

+    0x5A19, 0x5A1B, 0x2DC7, 0x5A1C, 0x5A1C, 0x0B2B, 0x5A1D, 0x5A1E, 0x2DCA,

+    0x5A1F, 0x5A1F, 0x0919, 0x5A20, 0x5A20, 0x0D28, 0x5A21, 0x5A22, 0x2DCC,

+    0x5A23, 0x5A23, 0x1791, 0x5A24, 0x5A24, 0x2DCE, 0x5A25, 0x5A25, 0x062F,

+    0x5A26, 0x5A28, 0x2DCF, 0x5A29, 0x5A29, 0x0AE9, 0x5A2A, 0x5A30, 0x2DD2,

+    0x5A31, 0x5A31, 0x10CE, 0x5A32, 0x5A32, 0x178E, 0x5A33, 0x5A33, 0x2DD9,

+    0x5A34, 0x5A34, 0x178F, 0x5A35, 0x5A35, 0x2DDA, 0x5A36, 0x5A36, 0x0C7D,

+    0x5A37, 0x5A3B, 0x2DDB, 0x5A3C, 0x5A3C, 0x1797, 0x5A3D, 0x5A3F, 0x2DE0,

+    0x5A40, 0x5A40, 0x1793, 0x5A41, 0x5A41, 0x203F, 0x5A42, 0x5A45, 0x2DE3,

+    0x5A46, 0x5A46, 0x0BE4, 0x5A47, 0x5A48, 0x2DE7, 0x5A49, 0x5A49, 0x0EA2,

+    0x5A4A, 0x5A4A, 0x1795, 0x5A4B, 0x5A54, 0x2DE9, 0x5A55, 0x5A55, 0x1796,

+    0x5A56, 0x5A59, 0x2DF3, 0x5A5A, 0x5A5A, 0x07FE, 0x5A5B, 0x5A61, 0x2DF7,

+    0x5A62, 0x5A62, 0x1798, 0x5A63, 0x5A65, 0x2DFE, 0x5A66, 0x5A66, 0x1F0E,

+    0x5A67, 0x5A67, 0x1794, 0x5A68, 0x5A69, 0x2E01, 0x5A6A, 0x5A6A, 0x09A2,

+    0x5A6B, 0x5A6C, 0x2E03, 0x5A6D, 0x5A6D, 0x23F9, 0x5A6E, 0x5A73, 0x2E05,

+    0x5A74, 0x5A74, 0x1089, 0x5A75, 0x5A75, 0x1799, 0x5A76, 0x5A76, 0x0D2D,

+    0x5A77, 0x5A77, 0x179D, 0x5A78, 0x5A79, 0x2E0B, 0x5A7A, 0x5A7A, 0x179E,

+    0x5A7B, 0x5A7E, 0x2E0D, 0x5A7F, 0x5A7F, 0x0FC1, 0x5A80, 0x5A91, 0x2E11,

+    0x5A92, 0x5A92, 0x0AC2, 0x5A93, 0x5A99, 0x2E23, 0x5A9A, 0x5A9A, 0x0AC9,

+    0x5A9B, 0x5A9B, 0x179C, 0x5A9C, 0x5AA6, 0x2E2A, 0x5AA7, 0x5AA7, 0x23FC,

+    0x5AA8, 0x5AA9, 0x2E35, 0x5AAA, 0x5AAA, 0x179B, 0x5AAB, 0x5AB1, 0x2E37,

+    0x5AB2, 0x5AB2, 0x17A1, 0x5AB3, 0x5AB3, 0x0F1E, 0x5AB4, 0x5AB4, 0x2E3E,

+    0x5AB5, 0x5AB5, 0x19A4, 0x5AB6, 0x5AB7, 0x2E3F, 0x5AB8, 0x5AB8, 0x17A4,

+    0x5AB9, 0x5ABC, 0x2E41, 0x5ABD, 0x5ABD, 0x2069, 0x5ABE, 0x5ABE, 0x179F,

+    0x5ABF, 0x5AC0, 0x2E45, 0x5AC1, 0x5AC1, 0x0851, 0x5AC2, 0x5AC2, 0x0CE2,

+    0x5AC3, 0x5AC8, 0x2E47, 0x5AC9, 0x5AC9, 0x0828, 0x5ACA, 0x5ACB, 0x2E4D,

+    0x5ACC, 0x5ACC, 0x0F40, 0x5ACD, 0x5AD1, 0x2E4F, 0x5AD2, 0x5AD2, 0x17A2,

+    0x5AD3, 0x5AD3, 0x2E54, 0x5AD4, 0x5AD4, 0x17A3, 0x5AD5, 0x5AD5, 0x2E55,

+    0x5AD6, 0x5AD6, 0x17A8, 0x5AD7, 0x5AD7, 0x23F7, 0x5AD8, 0x5AD8, 0x17AA,

+    0x5AD9, 0x5ADB, 0x2E56, 0x5ADC, 0x5ADC, 0x17AB, 0x5ADD, 0x5ADF, 0x2E59,

+    0x5AE0, 0x5AE0, 0x17A5, 0x5AE1, 0x5AE1, 0x05B6, 0x5AE2, 0x5AE2, 0x2E5C,

+    0x5AE3, 0x5AE3, 0x17A6, 0x5AE4, 0x5AE5, 0x2E5D, 0x5AE6, 0x5AE6, 0x17A9,

+    0x5AE7, 0x5AE8, 0x2E5F, 0x5AE9, 0x5AE9, 0x0B3E, 0x5AEA, 0x5AEA, 0x2E61,

+    0x5AEB, 0x5AEB, 0x17A0, 0x5AEC, 0x5AF0, 0x2E62, 0x5AF1, 0x5AF1, 0x17A7,

+    0x5AF2, 0x5AF4, 0x2E67, 0x5AF5, 0x5AF5, 0x23F6, 0x5AF6, 0x5AFA, 0x2E6A,

+    0x5AFB, 0x5AFB, 0x23FD, 0x5AFC, 0x5AFF, 0x2E6F, 0x5B00, 0x5B00, 0x23F8,

+    0x5B01, 0x5B07, 0x2E73, 0x5B08, 0x5B08, 0x23FA, 0x5B09, 0x5B09, 0x17AC,

+    0x5B0A, 0x5B0A, 0x2E7A, 0x5B0B, 0x5B0B, 0x23FE, 0x5B0C, 0x5B0C, 0x1FA8,

+    0x5B0D, 0x5B15, 0x2E7B, 0x5B16, 0x5B16, 0x17AE, 0x5B17, 0x5B17, 0x17AD,

+    0x5B18, 0x5B18, 0x2E84, 0x5B19, 0x5B19, 0x2401, 0x5B1A, 0x5B20, 0x2E85,

+    0x5B21, 0x5B21, 0x23FF, 0x5B22, 0x5B29, 0x2E8C, 0x5B2A, 0x5B2A, 0x2400,

+    0x5B2B, 0x5B2F, 0x2E94, 0x5B30, 0x5B30, 0x2221, 0x5B31, 0x5B31, 0x2E99,

+    0x5B32, 0x5B32, 0x17AF, 0x5B33, 0x5B33, 0x2E9A, 0x5B34, 0x5B34, 0x130C,

+    0x5B35, 0x5B36, 0x2E9B, 0x5B37, 0x5B37, 0x17B0, 0x5B38, 0x5B38, 0x2122,

+    0x5B39, 0x5B3F, 0x2E9D, 0x5B40, 0x5B40, 0x17B1, 0x5B41, 0x5B4B, 0x2EA4,

+    0x5B4C, 0x5B4C, 0x23FB, 0x5B4D, 0x5B4F, 0x2EAF, 0x5B50, 0x5B50, 0x1230,

+    0x5B51, 0x5B51, 0x17B7, 0x5B52, 0x5B52, 0x2EB2, 0x5B53, 0x5B53, 0x17B8,

+    0x5B54, 0x5B54, 0x0964, 0x5B55, 0x5B55, 0x1113, 0x5B56, 0x5B56, 0x2EB3,

+    0x5B57, 0x5B57, 0x1233, 0x5B58, 0x5B58, 0x0569, 0x5B59, 0x5B59, 0x0DE4,

+    0x5B5A, 0x5B5A, 0x17B4, 0x5B5B, 0x5B5B, 0x1279, 0x5B5C, 0x5B5C, 0x122B,

+    0x5B5D, 0x5B5D, 0x0F6D, 0x5B5E, 0x5B5E, 0x2EB4, 0x5B5F, 0x5B5F, 0x0AD4,

+    0x5B60, 0x5B61, 0x2EB5, 0x5B62, 0x5B62, 0x17B9, 0x5B63, 0x5B63, 0x0831,

+    0x5B64, 0x5B64, 0x071B, 0x5B65, 0x5B65, 0x17B5, 0x5B66, 0x5B66, 0x0FD0,

+    0x5B67, 0x5B68, 0x2EB7, 0x5B69, 0x5B69, 0x0759, 0x5B6A, 0x5B6A, 0x0A76,

+    0x5B6B, 0x5B6B, 0x215A, 0x5B6C, 0x5B6C, 0x1261, 0x5B6D, 0x5B6F, 0x2EB9,

+    0x5B70, 0x5B70, 0x0D82, 0x5B71, 0x5B71, 0x176A, 0x5B72, 0x5B72, 0x2EBC,

+    0x5B73, 0x5B73, 0x17B6, 0x5B74, 0x5B74, 0x2EBD, 0x5B75, 0x5B75, 0x0692,

+    0x5B76, 0x5B77, 0x2EBE, 0x5B78, 0x5B78, 0x21E5, 0x5B79, 0x5B79, 0x2EC0,

+    0x5B7A, 0x5B7A, 0x0CC1, 0x5B7B, 0x5B7C, 0x2EC1, 0x5B7D, 0x5B7D, 0x0B58,

+    0x5B7E, 0x5B7E, 0x2EC3, 0x5B7F, 0x5B7F, 0x2057, 0x5B80, 0x5B80, 0x172E,

+    0x5B81, 0x5B81, 0x0B61, 0x5B82, 0x5B82, 0x2EC4, 0x5B83, 0x5B83, 0x0DF1,

+    0x5B84, 0x5B84, 0x172F, 0x5B85, 0x5B85, 0x114D, 0x5B86, 0x5B86, 0x2EC5,

+    0x5B87, 0x5B87, 0x10D3, 0x5B88, 0x5B88, 0x0D6F, 0x5B89, 0x5B89, 0x03BD,

+    0x5B8A, 0x5B8A, 0x2EC6, 0x5B8B, 0x5B8B, 0x0DC3, 0x5B8C, 0x5B8C, 0x0E9B,

+    0x5B8D, 0x5B8E, 0x2EC7, 0x5B8F, 0x5B8F, 0x07A1, 0x5B90, 0x5B92, 0x2EC9,

+    0x5B93, 0x5B93, 0x1731, 0x5B94, 0x5B94, 0x2ECC, 0x5B95, 0x5B95, 0x1730,

+    0x5B96, 0x5B96, 0x2ECD, 0x5B97, 0x5B97, 0x1237, 0x5B98, 0x5B98, 0x0732,

+    0x5B99, 0x5B99, 0x11E5, 0x5B9A, 0x5B9A, 0x05E7, 0x5B9B, 0x5B9B, 0x0EA1,

+    0x5B9C, 0x5B9C, 0x1052, 0x5B9D, 0x5B9D, 0x040F, 0x5B9E, 0x5B9E, 0x0D4C,

+    0x5B9F, 0x5B9F, 0x2ECE, 0x5BA0, 0x5BA0, 0x050D, 0x5BA1, 0x5BA1, 0x0D2C,

+    0x5BA2, 0x5BA2, 0x095A, 0x5BA3, 0x5BA3, 0x0FC6, 0x5BA4, 0x5BA4, 0x0D69,

+    0x5BA5, 0x5BA5, 0x1732, 0x5BA6, 0x5BA6, 0x07D7, 0x5BA7, 0x5BA9, 0x2ECF,

+    0x5BAA, 0x5BAA, 0x0F49, 0x5BAB, 0x5BAB, 0x0705, 0x5BAC, 0x5BAF, 0x2ED2,

+    0x5BB0, 0x5BB0, 0x111A, 0x5BB1, 0x5BB2, 0x2ED6, 0x5BB3, 0x5BB3, 0x075D,

+    0x5BB4, 0x5BB4, 0x1010, 0x5BB5, 0x5BB5, 0x0F69, 0x5BB6, 0x5BB6, 0x0845,

+    0x5BB7, 0x5BB7, 0x2ED8, 0x5BB8, 0x5BB8, 0x1733, 0x5BB9, 0x5BB9, 0x0CB8,

+    0x5BBA, 0x5BBC, 0x2ED9, 0x5BBD, 0x5BBD, 0x097A, 0x5BBE, 0x5BBE, 0x045F,

+    0x5BBF, 0x5BBF, 0x0DD3, 0x5BC0, 0x5BC1, 0x2EDC, 0x5BC2, 0x5BC2, 0x0838,

+    0x5BC3, 0x5BC3, 0x2EDE, 0x5BC4, 0x5BC4, 0x0837, 0x5BC5, 0x5BC5, 0x1081,

+    0x5BC6, 0x5BC6, 0x0AE1, 0x5BC7, 0x5BC7, 0x0969, 0x5BC8, 0x5BCB, 0x2EDF,

+    0x5BCC, 0x5BCC, 0x06B6, 0x5BCD, 0x5BCF, 0x2EE3, 0x5BD0, 0x5BD0, 0x0AC7,

+    0x5BD1, 0x5BD1, 0x2EE6, 0x5BD2, 0x5BD2, 0x0765, 0x5BD3, 0x5BD3, 0x10E5,

+    0x5BD4, 0x5BDC, 0x2EE7, 0x5BDD, 0x5BDD, 0x0C5B, 0x5BDE, 0x5BDE, 0x0B12,

+    0x5BDF, 0x5BDF, 0x04B3, 0x5BE0, 0x5BE0, 0x2EF0, 0x5BE1, 0x5BE1, 0x072A,

+    0x5BE2, 0x5BE2, 0x20E5, 0x5BE3, 0x5BE3, 0x2EF1, 0x5BE4, 0x5BE4, 0x1737,

+    0x5BE5, 0x5BE5, 0x0A11, 0x5BE6, 0x5BE6, 0x212F, 0x5BE7, 0x5BE7, 0x20A3,

+    0x5BE8, 0x5BE8, 0x1150, 0x5BE9, 0x5BE9, 0x2121, 0x5BEA, 0x5BEA, 0x2EF2,

+    0x5BEB, 0x5BEB, 0x21D4, 0x5BEC, 0x5BEC, 0x1FE5, 0x5BED, 0x5BED, 0x2EF3,

+    0x5BEE, 0x5BEE, 0x1738, 0x5BEF, 0x5BEF, 0x2EF4, 0x5BF0, 0x5BF0, 0x173A,

+    0x5BF1, 0x5BF4, 0x2EF5, 0x5BF5, 0x5BF5, 0x1E8A, 0x5BF6, 0x5BF6, 0x1E37,

+    0x5BF7, 0x5BF7, 0x2EF9, 0x5BF8, 0x5BF8, 0x056A, 0x5BF9, 0x5BF9, 0x0613,

+    0x5BFA, 0x5BFA, 0x0DB7, 0x5BFB, 0x5BFB, 0x0FD9, 0x5BFC, 0x5BFC, 0x059D,

+    0x5BFD, 0x5BFE, 0x2EFA, 0x5BFF, 0x5BFF, 0x0D70, 0x5C00, 0x5C00, 0x2EFC,

+    0x5C01, 0x5C01, 0x067F, 0x5C02, 0x5C03, 0x2EFD, 0x5C04, 0x5C04, 0x0D1D,

+    0x5C05, 0x5C05, 0x2EFF, 0x5C06, 0x5C06, 0x087C, 0x5C07, 0x5C07, 0x1F9E,

+    0x5C08, 0x5C08, 0x22A6, 0x5C09, 0x5C09, 0x0ECD, 0x5C0A, 0x5C0A, 0x124D,

+    0x5C0B, 0x5C0B, 0x21E8, 0x5C0C, 0x5C0C, 0x2F00, 0x5C0D, 0x5C0D, 0x1EDA,

+    0x5C0E, 0x5C0E, 0x1EB9, 0x5C0F, 0x5C0F, 0x0F6C, 0x5C10, 0x5C10, 0x2F01,

+    0x5C11, 0x5C11, 0x0D12, 0x5C12, 0x5C13, 0x2F02, 0x5C14, 0x5C14, 0x063A,

+    0x5C15, 0x5C15, 0x17B2, 0x5C16, 0x5C16, 0x0855, 0x5C17, 0x5C17, 0x2F04,

+    0x5C18, 0x5C18, 0x04E3, 0x5C19, 0x5C19, 0x2F05, 0x5C1A, 0x5C1A, 0x0D09,

+    0x5C1B, 0x5C1B, 0x2F06, 0x5C1C, 0x5C1C, 0x17B3, 0x5C1D, 0x5C1D, 0x04C7,

+    0x5C1E, 0x5C21, 0x2F07, 0x5C22, 0x5C22, 0x14B6, 0x5C23, 0x5C23, 0x2F0B,

+    0x5C24, 0x5C24, 0x10AD, 0x5C25, 0x5C25, 0x14B7, 0x5C26, 0x5C26, 0x2F0C,

+    0x5C27, 0x5C27, 0x1029, 0x5C28, 0x5C2B, 0x2F0D, 0x5C2C, 0x5C2C, 0x14B8,

+    0x5C2D, 0x5C30, 0x2F11, 0x5C31, 0x5C31, 0x08FC, 0x5C32, 0x5C33, 0x2F15,

+    0x5C34, 0x5C34, 0x14B9, 0x5C35, 0x5C36, 0x2F17, 0x5C37, 0x5C37, 0x235C,

+    0x5C38, 0x5C38, 0x0D43, 0x5C39, 0x5C39, 0x1083, 0x5C3A, 0x5C3A, 0x0504,

+    0x5C3B, 0x5C3B, 0x1766, 0x5C3C, 0x5C3C, 0x0B44, 0x5C3D, 0x5C3D, 0x08D0,

+    0x5C3E, 0x5C3E, 0x0EC1, 0x5C3F, 0x5C3F, 0x0B55, 0x5C40, 0x5C40, 0x0905,

+    0x5C41, 0x5C41, 0x0BC7, 0x5C42, 0x5C42, 0x04AA, 0x5C43, 0x5C44, 0x2F19,

+    0x5C45, 0x5C45, 0x0902, 0x5C46, 0x5C47, 0x2F1B, 0x5C48, 0x5C48, 0x0C79,

+    0x5C49, 0x5C49, 0x0E3E, 0x5C4A, 0x5C4A, 0x08BD, 0x5C4B, 0x5C4B, 0x0EEC,

+    0x5C4C, 0x5C4D, 0x2F1D, 0x5C4E, 0x5C4E, 0x0D51, 0x5C4F, 0x5C4F, 0x0BE0,

+    0x5C50, 0x5C50, 0x1768, 0x5C51, 0x5C51, 0x0F87, 0x5C52, 0x5C54, 0x2F1F,

+    0x5C55, 0x5C55, 0x115A, 0x5C56, 0x5C58, 0x2F22, 0x5C59, 0x5C59, 0x1769,

+    0x5C5A, 0x5C5D, 0x2F25, 0x5C5E, 0x5C5E, 0x0D8B, 0x5C5F, 0x5C5F, 0x2F29,

+    0x5C60, 0x5C60, 0x0E71, 0x5C61, 0x5C61, 0x0A6C, 0x5C62, 0x5C62, 0x2050,

+    0x5C63, 0x5C63, 0x176B, 0x5C64, 0x5C64, 0x1E67, 0x5C65, 0x5C65, 0x0A6B,

+    0x5C66, 0x5C66, 0x176C, 0x5C67, 0x5C67, 0x2F2A, 0x5C68, 0x5C68, 0x23F4,

+    0x5C69, 0x5C6B, 0x2F2B, 0x5C6C, 0x5C6C, 0x213E, 0x5C6D, 0x5C6D, 0x2F2E,

+    0x5C6E, 0x5C6E, 0x1774, 0x5C6F, 0x5C6F, 0x0E7E, 0x5C70, 0x5C70, 0x2F2F,

+    0x5C71, 0x5C71, 0x0CF6, 0x5C72, 0x5C78, 0x2F30, 0x5C79, 0x5C79, 0x1060,

+    0x5C7A, 0x5C7A, 0x15AC, 0x5C7B, 0x5C7E, 0x2F37, 0x5C7F, 0x5C7F, 0x10D1,

+    0x5C80, 0x5C80, 0x2F3B, 0x5C81, 0x5C81, 0x0DDF, 0x5C82, 0x5C82, 0x0C10,

+    0x5C83, 0x5C87, 0x2F3C, 0x5C88, 0x5C88, 0x15B0, 0x5C89, 0x5C8B, 0x2F41,

+    0x5C8C, 0x5C8C, 0x15AB, 0x5C8D, 0x5C8D, 0x15AD, 0x5C8E, 0x5C8F, 0x2F44,

+    0x5C90, 0x5C90, 0x15AE, 0x5C91, 0x5C91, 0x15B3, 0x5C92, 0x5C93, 0x2F46,

+    0x5C94, 0x5C94, 0x04B4, 0x5C95, 0x5C95, 0x2F48, 0x5C96, 0x5C96, 0x15AF,

+    0x5C97, 0x5C97, 0x06D5, 0x5C98, 0x5C99, 0x15B1, 0x5C9A, 0x5C9A, 0x15B4,

+    0x5C9B, 0x5C9B, 0x059B, 0x5C9C, 0x5C9C, 0x15B5, 0x5C9D, 0x5CA0, 0x2F49,

+    0x5CA1, 0x5CA1, 0x1F16, 0x5CA2, 0x5CA2, 0x15B7, 0x5CA3, 0x5CA3, 0x15BC,

+    0x5CA4, 0x5CA8, 0x2F4D, 0x5CA9, 0x5CA9, 0x0FFB, 0x5CAA, 0x5CAA, 0x2F52,

+    0x5CAB, 0x5CAB, 0x15BA, 0x5CAC, 0x5CAC, 0x15B9, 0x5CAD, 0x5CAD, 0x0A34,

+    0x5CAE, 0x5CB0, 0x2F53, 0x5CB1, 0x5CB1, 0x15BB, 0x5CB2, 0x5CB2, 0x2F56,

+    0x5CB3, 0x5CB3, 0x1103, 0x5CB4, 0x5CB4, 0x2F57, 0x5CB5, 0x5CB5, 0x15B6,

+    0x5CB6, 0x5CB6, 0x2F58, 0x5CB7, 0x5CB7, 0x15BE, 0x5CB8, 0x5CB8, 0x03C1,

+    0x5CB9, 0x5CBC, 0x2F59, 0x5CBD, 0x5CBD, 0x15B8, 0x5CBE, 0x5CBE, 0x2F5D,

+    0x5CBF, 0x5CBF, 0x0986, 0x5CC0, 0x5CC0, 0x2F5E, 0x5CC1, 0x5CC1, 0x15BD,

+    0x5CC2, 0x5CC3, 0x2F5F, 0x5CC4, 0x5CC4, 0x15BF, 0x5CC5, 0x5CCA, 0x2F61,

+    0x5CCB, 0x5CCB, 0x15C2, 0x5CCC, 0x5CD1, 0x2F67, 0x5CD2, 0x5CD2, 0x15C0,

+    0x5CD3, 0x5CD8, 0x2F6D, 0x5CD9, 0x5CD9, 0x11C4, 0x5CDA, 0x5CE0, 0x2F73,

+    0x5CE1, 0x5CE1, 0x0F2C, 0x5CE2, 0x5CE3, 0x2F7A, 0x5CE4, 0x5CE4, 0x15C1,

+    0x5CE5, 0x5CE5, 0x15C3, 0x5CE6, 0x5CE6, 0x0A74, 0x5CE7, 0x5CE7, 0x2F7C,

+    0x5CE8, 0x5CE8, 0x062A, 0x5CE9, 0x5CE9, 0x2F7D, 0x5CEA, 0x5CEA, 0x10DD,

+    0x5CEB, 0x5CEC, 0x2F7E, 0x5CED, 0x5CED, 0x0C4A, 0x5CEE, 0x5CEF, 0x2F80,

+    0x5CF0, 0x5CF0, 0x0682, 0x5CF1, 0x5CF3, 0x2F82, 0x5CF4, 0x5CF4, 0x2389,

+    0x5CF5, 0x5CF5, 0x2F85, 0x5CF6, 0x5CF6, 0x1EB7, 0x5CF7, 0x5CFA, 0x2F86,

+    0x5CFB, 0x5CFB, 0x092D, 0x5CFC, 0x5CFC, 0x2F8A, 0x5CFD, 0x5CFD, 0x21B4,

+    0x5CFE, 0x5CFF, 0x2F8B, 0x5D00, 0x5D01, 0x2F8D, 0x5D02, 0x5D03, 0x15C4,

+    0x5D04, 0x5D05, 0x2F8F, 0x5D06, 0x5D06, 0x15CB, 0x5D07, 0x5D07, 0x050C,

+    0x5D08, 0x5D0C, 0x2F91, 0x5D0D, 0x5D0D, 0x238F, 0x5D0E, 0x5D0E, 0x0C08,

+    0x5D0F, 0x5D13, 0x2F96, 0x5D14, 0x5D14, 0x0561, 0x5D15, 0x5D15, 0x2F9B,

+    0x5D16, 0x5D16, 0x0FEB, 0x5D17, 0x5D17, 0x1F1A, 0x5D18, 0x5D1A, 0x2F9C,

+    0x5D1B, 0x5D1B, 0x15CC, 0x5D1C, 0x5D1D, 0x2F9F, 0x5D1E, 0x5D1E, 0x15CA,

+    0x5D1F, 0x5D23, 0x2FA1, 0x5D24, 0x5D24, 0x15C9, 0x5D25, 0x5D25, 0x2FA6,

+    0x5D26, 0x5D26, 0x15C7, 0x5D27, 0x5D27, 0x15C6, 0x5D28, 0x5D28, 0x2FA7,

+    0x5D29, 0x5D29, 0x0429, 0x5D2A, 0x5D2B, 0x2FA8, 0x5D2C, 0x5D2C, 0x238B,

+    0x5D2D, 0x5D2D, 0x1159, 0x5D2E, 0x5D2E, 0x15C8, 0x5D2F, 0x5D33, 0x2FAA,

+    0x5D34, 0x5D34, 0x15CF, 0x5D35, 0x5D3C, 0x2FAF, 0x5D3D, 0x5D3D, 0x15D0,

+    0x5D3E, 0x5D3E, 0x15CE, 0x5D3F, 0x5D46, 0x2FB7, 0x5D47, 0x5D47, 0x1B22,

+    0x5D48, 0x5D49, 0x2FBF, 0x5D4A, 0x5D4A, 0x15D7, 0x5D4B, 0x5D4B, 0x15D6,

+    0x5D4C, 0x5D4C, 0x0C33, 0x5D4D, 0x5D4F, 0x2FC1, 0x5D50, 0x5D50, 0x238A,

+    0x5D51, 0x5D57, 0x2FC4, 0x5D58, 0x5D58, 0x15CD, 0x5D59, 0x5D5A, 0x2FCB,

+    0x5D5B, 0x5D5B, 0x15D2, 0x5D5C, 0x5D5C, 0x2FCD, 0x5D5D, 0x5D5D, 0x15D4,

+    0x5D5E, 0x5D68, 0x2FCE, 0x5D69, 0x5D69, 0x15D8, 0x5D6A, 0x5D6A, 0x2FD9,

+    0x5D6B, 0x5D6B, 0x15D5, 0x5D6C, 0x5D6C, 0x15D1, 0x5D6D, 0x5D6E, 0x2FDA,

+    0x5D6F, 0x5D6F, 0x15D3, 0x5D70, 0x5D73, 0x2FDC, 0x5D74, 0x5D74, 0x15D9,

+    0x5D75, 0x5D80, 0x2FE0, 0x5D81, 0x5D81, 0x2391, 0x5D82, 0x5D82, 0x15DA,

+    0x5D83, 0x5D83, 0x2FEC, 0x5D84, 0x5D84, 0x2271, 0x5D85, 0x5D86, 0x2FED,

+    0x5D87, 0x5D87, 0x2388, 0x5D88, 0x5D96, 0x2FEF, 0x5D97, 0x5D97, 0x238E,

+    0x5D98, 0x5D98, 0x2FFE, 0x5D99, 0x5D99, 0x15DB, 0x5D9A, 0x5D9C, 0x2FFF,

+    0x5D9D, 0x5D9D, 0x15DC, 0x5D9E, 0x5D9F, 0x3002, 0x5DA0, 0x5DA0, 0x238D,

+    0x5DA1, 0x5DA6, 0x3004, 0x5DA7, 0x5DA7, 0x238C, 0x5DA8, 0x5DB6, 0x300A,

+    0x5DB7, 0x5DB7, 0x15DE, 0x5DB8, 0x5DB8, 0x2390, 0x5DB9, 0x5DB9, 0x3019,

+    0x5DBA, 0x5DBA, 0x2033, 0x5DBB, 0x5DBB, 0x301A, 0x5DBC, 0x5DBC, 0x223C,

+    0x5DBD, 0x5DC4, 0x301B, 0x5DC5, 0x5DC5, 0x15DF, 0x5DC6, 0x5DCA, 0x3023,

+    0x5DCB, 0x5DCB, 0x1FE9, 0x5DCC, 0x5DCC, 0x3028, 0x5DCD, 0x5DCD, 0x0EB0,

+    0x5DCE, 0x5DD1, 0x3029, 0x5DD2, 0x5DD2, 0x2055, 0x5DD3, 0x5DD3, 0x302D,

+    0x5DD4, 0x5DD4, 0x2392, 0x5DD5, 0x5DDA, 0x302E, 0x5DDB, 0x5DDB, 0x1815,

+    0x5DDC, 0x5DDC, 0x3034, 0x5DDD, 0x5DDD, 0x052B, 0x5DDE, 0x5DDE, 0x11DC,

+    0x5DDF, 0x5DE0, 0x3035, 0x5DE1, 0x5DE1, 0x0FDB, 0x5DE2, 0x5DE2, 0x04D7,

+    0x5DE3, 0x5DE4, 0x3037, 0x5DE5, 0x5DE5, 0x06FD, 0x5DE6, 0x5DE6, 0x1250,

+    0x5DE7, 0x5DE7, 0x0C46, 0x5DE8, 0x5DE8, 0x090D, 0x5DE9, 0x5DE9, 0x0707,

+    0x5DEA, 0x5DEA, 0x3039, 0x5DEB, 0x5DEB, 0x0EE6, 0x5DEC, 0x5DED, 0x303A,

+    0x5DEE, 0x5DEE, 0x04B5, 0x5DEF, 0x5DEF, 0x139F, 0x5DF0, 0x5DF0, 0x2324,

+    0x5DF1, 0x5DF1, 0x082D, 0x5DF2, 0x5DF2, 0x1058, 0x5DF3, 0x5DF3, 0x0DBD,

+    0x5DF4, 0x5DF4, 0x03D8, 0x5DF5, 0x5DF6, 0x303C, 0x5DF7, 0x5DF7, 0x0F5C,

+    0x5DF8, 0x5DFC, 0x303E, 0x5DFD, 0x5DFD, 0x12F7, 0x5DFE, 0x5DFE, 0x08BE,

+    0x5DFF, 0x5DFF, 0x3043, 0x5E00, 0x5E00, 0x3044, 0x5E01, 0x5E01, 0x043B,

+    0x5E02, 0x5E02, 0x0D67, 0x5E03, 0x5E03, 0x0483, 0x5E04, 0x5E04, 0x3045,

+    0x5E05, 0x5E05, 0x0D9C, 0x5E06, 0x5E06, 0x0648, 0x5E07, 0x5E07, 0x3046,

+    0x5E08, 0x5E08, 0x0D3D, 0x5E09, 0x5E0B, 0x3047, 0x5E0C, 0x5E0C, 0x0F10,

+    0x5E0D, 0x5E0E, 0x304A, 0x5E0F, 0x5E0F, 0x159E, 0x5E10, 0x5E10, 0x116B,

+    0x5E11, 0x5E11, 0x15A1, 0x5E12, 0x5E13, 0x304C, 0x5E14, 0x5E14, 0x15A0,

+    0x5E15, 0x5E15, 0x0B82, 0x5E16, 0x5E16, 0x0E4E, 0x5E17, 0x5E17, 0x304E,

+    0x5E18, 0x5E18, 0x09FA, 0x5E19, 0x5E19, 0x159F, 0x5E1A, 0x5E1A, 0x11E2,

+    0x5E1B, 0x5E1B, 0x0476, 0x5E1C, 0x5E1C, 0x11C3, 0x5E1D, 0x5E1D, 0x05BC,

+    0x5E1E, 0x5E24, 0x304F, 0x5E25, 0x5E25, 0x2143, 0x5E26, 0x5E26, 0x057B,

+    0x5E27, 0x5E27, 0x11A0, 0x5E28, 0x5E2A, 0x3056, 0x5E2B, 0x5E2B, 0x2129,

+    0x5E2C, 0x5E2C, 0x3059, 0x5E2D, 0x5E2D, 0x0F1C, 0x5E2E, 0x5E2E, 0x03FA,

+    0x5E2F, 0x5E30, 0x305A, 0x5E31, 0x5E31, 0x15A2, 0x5E32, 0x5E32, 0x305C,

+    0x5E33, 0x5E33, 0x2277, 0x5E34, 0x5E35, 0x305D, 0x5E36, 0x5E36, 0x1EA7,

+    0x5E37, 0x5E37, 0x15A5, 0x5E38, 0x5E38, 0x04C8, 0x5E39, 0x5E3A, 0x305F,

+    0x5E3B, 0x5E3C, 0x15A3, 0x5E3D, 0x5E3D, 0x0AB6, 0x5E3E, 0x5E3F, 0x3061,

+    0x5E40, 0x5E40, 0x2285, 0x5E41, 0x5E41, 0x3063, 0x5E42, 0x5E42, 0x0AE2,

+    0x5E43, 0x5E43, 0x2384, 0x5E44, 0x5E44, 0x15A6, 0x5E45, 0x5E45, 0x0696,

+    0x5E46, 0x5E4B, 0x3064, 0x5E4C, 0x5E4C, 0x07E4, 0x5E4D, 0x5E53, 0x306A,

+    0x5E54, 0x5E54, 0x15A7, 0x5E55, 0x5E55, 0x0B1E, 0x5E56, 0x5E56, 0x3071,

+    0x5E57, 0x5E57, 0x2387, 0x5E58, 0x5E58, 0x2386, 0x5E59, 0x5E5A, 0x3072,

+    0x5E5B, 0x5E5B, 0x15A8, 0x5E5C, 0x5E5D, 0x3074, 0x5E5E, 0x5E5E, 0x15A9,

+    0x5E5F, 0x5E5F, 0x2290, 0x5E60, 0x5E60, 0x3076, 0x5E61, 0x5E61, 0x15AA,

+    0x5E62, 0x5E62, 0x0534, 0x5E63, 0x5E63, 0x1E44, 0x5E64, 0x5E6A, 0x3077,

+    0x5E6B, 0x5E6B, 0x1E32, 0x5E6C, 0x5E6C, 0x2385, 0x5E6D, 0x5E71, 0x307E,

+    0x5E72, 0x5E72, 0x06C4, 0x5E73, 0x5E73, 0x0BDC, 0x5E74, 0x5E74, 0x0B4D,

+    0x5E75, 0x5E75, 0x3083, 0x5E76, 0x5E76, 0x0469, 0x5E77, 0x5E77, 0x3084,

+    0x5E78, 0x5E78, 0x0F9D, 0x5E79, 0x5E79, 0x1F13, 0x5E7A, 0x5E7A, 0x1813,

+    0x5E7B, 0x5E7B, 0x07D8, 0x5E7C, 0x5E7C, 0x10BC, 0x5E7D, 0x5E7D, 0x10A9,

+    0x5E7E, 0x5E7E, 0x1F73, 0x5E7F, 0x5E7F, 0x073C, 0x5E80, 0x5E80, 0x1631,

+    0x5E81, 0x5E83, 0x3085, 0x5E84, 0x5E84, 0x120C, 0x5E85, 0x5E85, 0x3088,

+    0x5E86, 0x5E86, 0x0C69, 0x5E87, 0x5E87, 0x043C, 0x5E88, 0x5E89, 0x3089,

+    0x5E8A, 0x5E8A, 0x0535, 0x5E8B, 0x5E8B, 0x1633, 0x5E8C, 0x5E8E, 0x308B,

+    0x5E8F, 0x5E8F, 0x0FBD, 0x5E90, 0x5E90, 0x0A55, 0x5E91, 0x5E91, 0x1632,

+    0x5E92, 0x5E92, 0x308E, 0x5E93, 0x5E93, 0x096F, 0x5E94, 0x5E94, 0x108B,

+    0x5E95, 0x5E95, 0x05B8, 0x5E96, 0x5E96, 0x1634, 0x5E97, 0x5E97, 0x05CB,

+    0x5E98, 0x5E98, 0x308F, 0x5E99, 0x5E99, 0x0AF2, 0x5E9A, 0x5E9A, 0x06F8,

+    0x5E9B, 0x5E9B, 0x3090, 0x5E9C, 0x5E9C, 0x06A9, 0x5E9D, 0x5E9D, 0x3091,

+    0x5E9E, 0x5E9E, 0x0B94, 0x5E9F, 0x5E9F, 0x066C, 0x5EA0, 0x5EA0, 0x1636,

+    0x5EA1, 0x5EA4, 0x3092, 0x5EA5, 0x5EA5, 0x1635, 0x5EA6, 0x5EA6, 0x0607,

+    0x5EA7, 0x5EA7, 0x1256, 0x5EA8, 0x5EAA, 0x3096, 0x5EAB, 0x5EAB, 0x1FE0,

+    0x5EAC, 0x5EAC, 0x3099, 0x5EAD, 0x5EAD, 0x0E56, 0x5EAE, 0x5EB2, 0x309A,

+    0x5EB3, 0x5EB3, 0x163A, 0x5EB4, 0x5EB4, 0x309F, 0x5EB5, 0x5EB5, 0x1638,

+    0x5EB6, 0x5EB6, 0x0D93, 0x5EB7, 0x5EB7, 0x0942, 0x5EB8, 0x5EB8, 0x109E,

+    0x5EB9, 0x5EB9, 0x1637, 0x5EBA, 0x5EBD, 0x30A0, 0x5EBE, 0x5EBE, 0x1639,

+    0x5EBF, 0x5EC8, 0x30A4, 0x5EC9, 0x5EC9, 0x09F7, 0x5ECA, 0x5ECA, 0x09B3,

+    0x5ECB, 0x5ED0, 0x30AE, 0x5ED1, 0x5ED1, 0x163D, 0x5ED2, 0x5ED2, 0x163C,

+    0x5ED3, 0x5ED3, 0x0995, 0x5ED4, 0x5ED5, 0x30B4, 0x5ED6, 0x5ED6, 0x0A17,

+    0x5ED7, 0x5EDA, 0x30B6, 0x5EDB, 0x5EDB, 0x163E, 0x5EDC, 0x5EDE, 0x30BA,

+    0x5EDF, 0x5EDF, 0x2087, 0x5EE0, 0x5EE0, 0x1E78, 0x5EE1, 0x5EE1, 0x23AE,

+    0x5EE2, 0x5EE2, 0x1EF6, 0x5EE3, 0x5EE3, 0x1F31, 0x5EE4, 0x5EE7, 0x30BD,

+    0x5EE8, 0x5EE8, 0x163F, 0x5EE9, 0x5EE9, 0x30C1, 0x5EEA, 0x5EEA, 0x1640,

+    0x5EEB, 0x5EEB, 0x30C2, 0x5EEC, 0x5EEC, 0x2045, 0x5EED, 0x5EF2, 0x30C3,

+    0x5EF3, 0x5EF3, 0x2178, 0x5EF4, 0x5EF4, 0x1398, 0x5EF5, 0x5EF5, 0x30C9,

+    0x5EF6, 0x5EF6, 0x0FFC, 0x5EF7, 0x5EF7, 0x0E53, 0x5EF8, 0x5EF9, 0x30CA,

+    0x5EFA, 0x5EFA, 0x0879, 0x5EFB, 0x5EFD, 0x30CC, 0x5EFE, 0x5EFE, 0x14AD,

+    0x5EFF, 0x5EFF, 0x125B, 0x5F00, 0x5F00, 0x0937, 0x5F01, 0x5F01, 0x139D,

+    0x5F02, 0x5F02, 0x1073, 0x5F03, 0x5F03, 0x0C19, 0x5F04, 0x5F04, 0x0B6B,

+    0x5F05, 0x5F07, 0x30CF, 0x5F08, 0x5F08, 0x14AE, 0x5F09, 0x5F09, 0x30D2,

+    0x5F0A, 0x5F0A, 0x0440, 0x5F0B, 0x5F0B, 0x14F6, 0x5F0C, 0x5F0E, 0x30D3,

+    0x5F0F, 0x5F0F, 0x0D54, 0x5F10, 0x5F10, 0x30D6, 0x5F11, 0x5F11, 0x14F9,

+    0x5F12, 0x5F12, 0x30D7, 0x5F13, 0x5F13, 0x0706, 0x5F14, 0x5F14, 0x30D8,

+    0x5F15, 0x5F15, 0x1084, 0x5F16, 0x5F16, 0x30D9, 0x5F17, 0x5F17, 0x06A0,

+    0x5F18, 0x5F18, 0x07A2, 0x5F19, 0x5F1A, 0x30DA, 0x5F1B, 0x5F1B, 0x04FF,

+    0x5F1C, 0x5F1E, 0x30DC, 0x5F1F, 0x5F1F, 0x05BD, 0x5F20, 0x5F20, 0x1166,

+    0x5F21, 0x5F24, 0x30DF, 0x5F25, 0x5F25, 0x0ADB, 0x5F26, 0x5F26, 0x0F3F,

+    0x5F27, 0x5F27, 0x07B6, 0x5F28, 0x5F28, 0x30E3, 0x5F29, 0x5F29, 0x176F,

+    0x5F2A, 0x5F2A, 0x176E, 0x5F2B, 0x5F2C, 0x30E4, 0x5F2D, 0x5F2D, 0x1770,

+    0x5F2E, 0x5F2E, 0x30E6, 0x5F2F, 0x5F2F, 0x0E95, 0x5F30, 0x5F30, 0x30E7,

+    0x5F31, 0x5F31, 0x0CD0, 0x5F32, 0x5F32, 0x30E8, 0x5F33, 0x5F33, 0x23F5,

+    0x5F34, 0x5F34, 0x30E9, 0x5F35, 0x5F35, 0x2275, 0x5F36, 0x5F38, 0x30EA,

+    0x5F39, 0x5F39, 0x0590, 0x5F3A, 0x5F3A, 0x0C3C, 0x5F3B, 0x5F3B, 0x30ED,

+    0x5F3C, 0x5F3C, 0x1772, 0x5F3D, 0x5F3F, 0x30EE, 0x5F40, 0x5F40, 0x19BE,

+    0x5F41, 0x5F45, 0x30F1, 0x5F46, 0x5F46, 0x266E, 0x5F47, 0x5F47, 0x30F6,

+    0x5F48, 0x5F48, 0x1EB0, 0x5F49, 0x5F4B, 0x30F7, 0x5F4C, 0x5F4C, 0x2083,

+    0x5F4D, 0x5F4D, 0x30FA, 0x5F4E, 0x5F4E, 0x2188, 0x5F4F, 0x5F4F, 0x30FB,

+    0x5F50, 0x5F50, 0x1762, 0x5F51, 0x5F51, 0x30FC, 0x5F52, 0x5F52, 0x0742,

+    0x5F53, 0x5F53, 0x0592, 0x5F54, 0x5F54, 0x30FD, 0x5F55, 0x5F55, 0x0A63,

+    0x5F56, 0x5F56, 0x1764, 0x5F57, 0x5F57, 0x1763, 0x5F58, 0x5F58, 0x1765,

+    0x5F59, 0x5F59, 0x267C, 0x5F5A, 0x5F5C, 0x30FE, 0x5F5D, 0x5F5D, 0x1054,

+    0x5F5E, 0x5F60, 0x3101, 0x5F61, 0x5F61, 0x15EE, 0x5F62, 0x5F62, 0x0F99,

+    0x5F63, 0x5F63, 0x3104, 0x5F64, 0x5F64, 0x0E5F, 0x5F65, 0x5F65, 0x3105,

+    0x5F66, 0x5F66, 0x100E, 0x5F67, 0x5F68, 0x3106, 0x5F69, 0x5F69, 0x0491,

+    0x5F6A, 0x5F6A, 0x0454, 0x5F6B, 0x5F6B, 0x3108, 0x5F6C, 0x5F6C, 0x045B,

+    0x5F6D, 0x5F6D, 0x0BAE, 0x5F6E, 0x5F6F, 0x3109, 0x5F70, 0x5F70, 0x1164,

+    0x5F71, 0x5F71, 0x1095, 0x5F72, 0x5F72, 0x310B, 0x5F73, 0x5F73, 0x15E0,

+    0x5F74, 0x5F76, 0x310C, 0x5F77, 0x5F77, 0x15E1, 0x5F78, 0x5F78, 0x310F,

+    0x5F79, 0x5F79, 0x1062, 0x5F7A, 0x5F7A, 0x3110, 0x5F7B, 0x5F7B, 0x04DE,

+    0x5F7C, 0x5F7C, 0x0434, 0x5F7D, 0x5F7F, 0x3111, 0x5F80, 0x5F80, 0x0EAA,

+    0x5F81, 0x5F81, 0x1198, 0x5F82, 0x5F82, 0x15E2, 0x5F83, 0x5F83, 0x3114,

+    0x5F84, 0x5F84, 0x08E5, 0x5F85, 0x5F85, 0x0580, 0x5F86, 0x5F86, 0x3115,

+    0x5F87, 0x5F87, 0x15E3, 0x5F88, 0x5F88, 0x0793, 0x5F89, 0x5F89, 0x15E4,

+    0x5F8A, 0x5F8A, 0x07C7, 0x5F8B, 0x5F8B, 0x0A70, 0x5F8C, 0x5F8C, 0x15E5,

+    0x5F8D, 0x5F8F, 0x3116, 0x5F90, 0x5F90, 0x0FB7, 0x5F91, 0x5F91, 0x1FC5,

+    0x5F92, 0x5F92, 0x0E6E, 0x5F93, 0x5F94, 0x3119, 0x5F95, 0x5F95, 0x15E6,

+    0x5F96, 0x5F96, 0x311B, 0x5F97, 0x5F97, 0x05A4, 0x5F98, 0x5F98, 0x0B88,

+    0x5F99, 0x5F99, 0x15E7, 0x5F9A, 0x5F9B, 0x311C, 0x5F9C, 0x5F9C, 0x15E8,

+    0x5F9D, 0x5F9D, 0x311E, 0x5F9E, 0x5F9E, 0x1EA1, 0x5F9F, 0x5F9F, 0x311F,

+    0x5FA0, 0x5FA0, 0x2393, 0x5FA1, 0x5FA1, 0x10DE, 0x5FA2, 0x5FA7, 0x3120,

+    0x5FA8, 0x5FA8, 0x15E9, 0x5FA9, 0x5FA9, 0x1F0B, 0x5FAA, 0x5FAA, 0x0FD6,

+    0x5FAB, 0x5FAC, 0x3126, 0x5FAD, 0x5FAD, 0x15EA, 0x5FAE, 0x5FAE, 0x0EB1,

+    0x5FAF, 0x5FB4, 0x3128, 0x5FB5, 0x5FB5, 0x15EB, 0x5FB6, 0x5FB6, 0x312E,

+    0x5FB7, 0x5FB7, 0x05A3, 0x5FB8, 0x5FB8, 0x312F, 0x5FB9, 0x5FB9, 0x1E7C,

+    0x5FBA, 0x5FBB, 0x3130, 0x5FBC, 0x5FBC, 0x15EC, 0x5FBD, 0x5FBD, 0x07EA,

+    0x5FBE, 0x5FC2, 0x3132, 0x5FC3, 0x5FC3, 0x0F8F, 0x5FC4, 0x5FC4, 0x1642,

+    0x5FC5, 0x5FC5, 0x0441, 0x5FC6, 0x5FC6, 0x106B, 0x5FC7, 0x5FC8, 0x3137,

+    0x5FC9, 0x5FC9, 0x1643, 0x5FCA, 0x5FCB, 0x3139, 0x5FCC, 0x5FCC, 0x083C,

+    0x5FCD, 0x5FCD, 0x0CA7, 0x5FCE, 0x5FCE, 0x313B, 0x5FCF, 0x5FCF, 0x1645,

+    0x5FD0, 0x5FD0, 0x1A0C, 0x5FD1, 0x5FD1, 0x1A0B, 0x5FD2, 0x5FD2, 0x14F7,

+    0x5FD3, 0x5FD5, 0x313C, 0x5FD6, 0x5FD6, 0x1644, 0x5FD7, 0x5FD7, 0x11BD,

+    0x5FD8, 0x5FD8, 0x0EAD, 0x5FD9, 0x5FD9, 0x0AAB, 0x5FDA, 0x5FDC, 0x313F,

+    0x5FDD, 0x5FDD, 0x1683, 0x5FDE, 0x5FDF, 0x3142, 0x5FE0, 0x5FE0, 0x11D1,

+    0x5FE1, 0x5FE1, 0x1649, 0x5FE2, 0x5FE3, 0x3144, 0x5FE4, 0x5FE4, 0x164A,

+    0x5FE5, 0x5FE6, 0x3146, 0x5FE7, 0x5FE7, 0x10AC, 0x5FE8, 0x5FE9, 0x3148,

+    0x5FEA, 0x5FEA, 0x164E, 0x5FEB, 0x5FEB, 0x0979, 0x5FEC, 0x5FEC, 0x314A,

+    0x5FED, 0x5FED, 0x164F, 0x5FEE, 0x5FEE, 0x1647, 0x5FEF, 0x5FF0, 0x314B,

+    0x5FF1, 0x5FF1, 0x04E5, 0x5FF2, 0x5FF4, 0x314D, 0x5FF5, 0x5FF5, 0x0B51,

+    0x5FF6, 0x5FF7, 0x3150, 0x5FF8, 0x5FF8, 0x1650, 0x5FF9, 0x5FFA, 0x3152,

+    0x5FFB, 0x5FFB, 0x0F8E, 0x5FFC, 0x5FFC, 0x3154, 0x5FFD, 0x5FFD, 0x07AD,

+    0x5FFE, 0x5FFE, 0x164B, 0x5FFF, 0x5FFF, 0x067B, 0x6000, 0x6000, 0x07C8,

+    0x6001, 0x6001, 0x0DFF, 0x6002, 0x6002, 0x0DC0, 0x6003, 0x6003, 0x1646,

+    0x6004, 0x6004, 0x1648, 0x6005, 0x6006, 0x164C, 0x6007, 0x6009, 0x3155,

+    0x600A, 0x600A, 0x1659, 0x600B, 0x600C, 0x3158, 0x600D, 0x600D, 0x1656,

+    0x600E, 0x600E, 0x1138, 0x600F, 0x600F, 0x1655, 0x6010, 0x6011, 0x315A,

+    0x6012, 0x6012, 0x0B6E, 0x6013, 0x6013, 0x315C, 0x6014, 0x6014, 0x119B,

+    0x6015, 0x6015, 0x0B83, 0x6016, 0x6016, 0x0487, 0x6017, 0x6018, 0x315D,

+    0x6019, 0x6019, 0x1651, 0x601A, 0x601A, 0x315F, 0x601B, 0x601B, 0x1654,

+    0x601C, 0x601C, 0x09F8, 0x601D, 0x601D, 0x0DB1, 0x601E, 0x601F, 0x3160,

+    0x6020, 0x6020, 0x0582, 0x6021, 0x6021, 0x165B, 0x6022, 0x6024, 0x3162,

+    0x6025, 0x6025, 0x0824, 0x6026, 0x6026, 0x1653, 0x6027, 0x6027, 0x0F9F,

+    0x6028, 0x6028, 0x10FC, 0x6029, 0x6029, 0x1657, 0x602A, 0x602A, 0x072F,

+    0x602B, 0x602B, 0x1658, 0x602C, 0x602E, 0x3165, 0x602F, 0x602F, 0x0C50,

+    0x6030, 0x6034, 0x3168, 0x6035, 0x6035, 0x1652, 0x6036, 0x603A, 0x316D,

+    0x603B, 0x603B, 0x1239, 0x603C, 0x603C, 0x1A0D, 0x603D, 0x603E, 0x3172,

+    0x603F, 0x603F, 0x165A, 0x6040, 0x6040, 0x3174, 0x6041, 0x6041, 0x1A11,

+    0x6042, 0x6042, 0x1660, 0x6043, 0x6043, 0x0D68, 0x6044, 0x604A, 0x3175,

+    0x604B, 0x604B, 0x09FE, 0x604C, 0x604C, 0x317C, 0x604D, 0x604D, 0x07E5,

+    0x604E, 0x604F, 0x317D, 0x6050, 0x6050, 0x0963, 0x6051, 0x6051, 0x317F,

+    0x6052, 0x6052, 0x079A, 0x6053, 0x6054, 0x3180, 0x6055, 0x6055, 0x0D96,

+    0x6056, 0x6058, 0x3182, 0x6059, 0x6059, 0x1A12, 0x605A, 0x605A, 0x1A0F,

+    0x605B, 0x605C, 0x3185, 0x605D, 0x605D, 0x1A0E, 0x605E, 0x6061, 0x3187,

+    0x6062, 0x6062, 0x07EB, 0x6063, 0x6063, 0x1A13, 0x6064, 0x6064, 0x0FBF,

+    0x6065, 0x6066, 0x318B, 0x6067, 0x6067, 0x1A10, 0x6068, 0x6068, 0x0795,

+    0x6069, 0x6069, 0x0636, 0x606A, 0x606A, 0x1661, 0x606B, 0x606B, 0x05F1,

+    0x606C, 0x606C, 0x0E44, 0x606D, 0x606D, 0x0700, 0x606E, 0x606E, 0x318D,

+    0x606F, 0x606F, 0x0F0F, 0x6070, 0x6070, 0x0C1E, 0x6071, 0x6072, 0x318E,

+    0x6073, 0x6073, 0x095F, 0x6074, 0x6075, 0x3190, 0x6076, 0x6076, 0x0630,

+    0x6077, 0x6077, 0x3192, 0x6078, 0x6079, 0x165C, 0x607A, 0x607A, 0x165F,

+    0x607B, 0x607B, 0x165E, 0x607C, 0x607C, 0x0B38, 0x607D, 0x607D, 0x1662,

+    0x607E, 0x607E, 0x3193, 0x607F, 0x607F, 0x10A6, 0x6080, 0x6082, 0x3194,

+    0x6083, 0x6083, 0x1667, 0x6084, 0x6084, 0x0C41, 0x6085, 0x6088, 0x3197,

+    0x6089, 0x6089, 0x0F11, 0x608A, 0x608B, 0x319B, 0x608C, 0x608C, 0x1669,

+    0x608D, 0x608D, 0x076E, 0x608E, 0x6091, 0x319D, 0x6092, 0x6092, 0x1668,

+    0x6093, 0x6093, 0x31A1, 0x6094, 0x6094, 0x07EF, 0x6095, 0x6095, 0x31A2,

+    0x6096, 0x6096, 0x1663, 0x6097, 0x6099, 0x31A3, 0x609A, 0x609A, 0x1664,

+    0x609B, 0x609B, 0x166A, 0x609C, 0x609C, 0x31A6, 0x609D, 0x609D, 0x1666,

+    0x609E, 0x609E, 0x31A7, 0x609F, 0x609F, 0x0F01, 0x60A0, 0x60A0, 0x10AB,

+    0x60A1, 0x60A2, 0x31A8, 0x60A3, 0x60A3, 0x07D1, 0x60A4, 0x60A5, 0x31AA,

+    0x60A6, 0x60A6, 0x1106, 0x60A7, 0x60A7, 0x31AC, 0x60A8, 0x60A8, 0x0B5D,

+    0x60A9, 0x60AA, 0x31AD, 0x60AB, 0x60AB, 0x1A14, 0x60AC, 0x60AC, 0x0FC7,

+    0x60AD, 0x60AD, 0x1665, 0x60AE, 0x60AE, 0x31AF, 0x60AF, 0x60AF, 0x0AFA,

+    0x60B0, 0x60B0, 0x31B0, 0x60B1, 0x60B1, 0x166D, 0x60B2, 0x60B2, 0x0418,

+    0x60B3, 0x60B3, 0x31B1, 0x60B4, 0x60B4, 0x1672, 0x60B5, 0x60B5, 0x23B4,

+    0x60B6, 0x60B6, 0x207E, 0x60B7, 0x60B7, 0x31B2, 0x60B8, 0x60B8, 0x0835,

+    0x60B9, 0x60BA, 0x31B3, 0x60BB, 0x60BB, 0x166C, 0x60BC, 0x60BC, 0x05A0,

+    0x60BD, 0x60C4, 0x31B5, 0x60C5, 0x60C5, 0x0C66, 0x60C6, 0x60C6, 0x1670,

+    0x60C7, 0x60C9, 0x31BD, 0x60CA, 0x60CA, 0x08D9, 0x60CB, 0x60CB, 0x0EA0,

+    0x60CC, 0x60D0, 0x31C0, 0x60D1, 0x60D1, 0x0808, 0x60D2, 0x60D4, 0x31C5,

+    0x60D5, 0x60D5, 0x0E3B, 0x60D6, 0x60D7, 0x31C8, 0x60D8, 0x60D8, 0x166F,

+    0x60D9, 0x60D9, 0x31CA, 0x60DA, 0x60DA, 0x1671, 0x60DB, 0x60DB, 0x31CB,

+    0x60DC, 0x60DC, 0x0F14, 0x60DD, 0x60DD, 0x166E, 0x60DE, 0x60DE, 0x31CC,

+    0x60DF, 0x60DF, 0x0EB8, 0x60E0, 0x60E0, 0x07F2, 0x60E1, 0x60E1, 0x1EE3,

+    0x60E2, 0x60E5, 0x31CD, 0x60E6, 0x60E6, 0x05CC, 0x60E7, 0x60E7, 0x0914,

+    0x60E8, 0x60E8, 0x0499, 0x60E9, 0x60E9, 0x04F2, 0x60EA, 0x60EA, 0x31D1,

+    0x60EB, 0x60EB, 0x0422, 0x60EC, 0x60EC, 0x166B, 0x60ED, 0x60ED, 0x0498,

+    0x60EE, 0x60EE, 0x058D, 0x60EF, 0x60EF, 0x0738, 0x60F0, 0x60F0, 0x0627,

+    0x60F1, 0x60F1, 0x2095, 0x60F2, 0x60F2, 0x23BB, 0x60F3, 0x60F3, 0x0F58,

+    0x60F4, 0x60F4, 0x1677, 0x60F5, 0x60F5, 0x31D2, 0x60F6, 0x60F6, 0x07E1,

+    0x60F7, 0x60F8, 0x31D3, 0x60F9, 0x60F9, 0x0CA2, 0x60FA, 0x60FA, 0x0F95,

+    0x60FB, 0x60FB, 0x23B9, 0x60FC, 0x60FF, 0x31D5, 0x6100, 0x6100, 0x1678,

+    0x6101, 0x6101, 0x0513, 0x6102, 0x6105, 0x31D9, 0x6106, 0x6106, 0x1A15,

+    0x6107, 0x6107, 0x31DD, 0x6108, 0x6108, 0x10DF, 0x6109, 0x6109, 0x10C9,

+    0x610A, 0x610C, 0x31DE, 0x610D, 0x610D, 0x1A16, 0x610E, 0x610E, 0x1679,

+    0x610F, 0x610F, 0x1069, 0x6110, 0x6114, 0x31E1, 0x6115, 0x6115, 0x1675,

+    0x6116, 0x6119, 0x31E6, 0x611A, 0x611A, 0x10C3, 0x611B, 0x611B, 0x1E28,

+    0x611C, 0x611C, 0x23BD, 0x611D, 0x611E, 0x31EA, 0x611F, 0x611F, 0x06CB,

+    0x6120, 0x6120, 0x1673, 0x6121, 0x6122, 0x31EC, 0x6123, 0x6123, 0x1676,

+    0x6124, 0x6124, 0x067C, 0x6125, 0x6125, 0x31EE, 0x6126, 0x6126, 0x1674,

+    0x6127, 0x6127, 0x098D, 0x6128, 0x612A, 0x31EF, 0x612B, 0x612B, 0x167A,

+    0x612C, 0x6133, 0x31F2, 0x6134, 0x6134, 0x23B5, 0x6135, 0x6136, 0x31FA,

+    0x6137, 0x6137, 0x23BA, 0x6138, 0x613D, 0x31FC, 0x613E, 0x613E, 0x23B3,

+    0x613F, 0x613F, 0x10FB, 0x6140, 0x6147, 0x3202, 0x6148, 0x6148, 0x054B,

+    0x6149, 0x6149, 0x320A, 0x614A, 0x614A, 0x167B, 0x614B, 0x614B, 0x2162,

+    0x614C, 0x614C, 0x07DA, 0x614D, 0x614D, 0x320B, 0x614E, 0x614E, 0x0D30,

+    0x614F, 0x6150, 0x320C, 0x6151, 0x6151, 0x0D1E, 0x6152, 0x6154, 0x320E,

+    0x6155, 0x6155, 0x0B20, 0x6156, 0x6157, 0x3211, 0x6158, 0x6158, 0x1E5E,

+    0x6159, 0x6159, 0x3213, 0x615A, 0x615A, 0x1E5D, 0x615B, 0x615C, 0x3214,

+    0x615D, 0x615D, 0x1A17, 0x615E, 0x615E, 0x3216, 0x615F, 0x615F, 0x23B7,

+    0x6160, 0x6161, 0x3217, 0x6162, 0x6162, 0x0AA4, 0x6163, 0x6163, 0x1F2F,

+    0x6164, 0x6164, 0x24DF, 0x6165, 0x6166, 0x3219, 0x6167, 0x6167, 0x07F0,

+    0x6168, 0x6168, 0x093B, 0x6169, 0x6169, 0x321B, 0x616A, 0x616A, 0x23B2,

+    0x616B, 0x616B, 0x214E, 0x616C, 0x616D, 0x321C, 0x616E, 0x616E, 0x2052,

+    0x616F, 0x616F, 0x321E, 0x6170, 0x6170, 0x0ECE, 0x6171, 0x6172, 0x321F,

+    0x6173, 0x6173, 0x23BC, 0x6174, 0x6174, 0x3221, 0x6175, 0x6175, 0x167C,

+    0x6176, 0x6176, 0x20EB, 0x6177, 0x6177, 0x0943, 0x6178, 0x6181, 0x3222,

+    0x6182, 0x6182, 0x2232, 0x6183, 0x6189, 0x322C, 0x618A, 0x618A, 0x1E3F,

+    0x618B, 0x618B, 0x0458, 0x618C, 0x618D, 0x3233, 0x618E, 0x618E, 0x113A,

+    0x618F, 0x618F, 0x3235, 0x6190, 0x6190, 0x201B, 0x6191, 0x6191, 0x20BC,

+    0x6192, 0x6192, 0x23BE, 0x6193, 0x6193, 0x3236, 0x6194, 0x6194, 0x167E,

+    0x6195, 0x6199, 0x3237, 0x619A, 0x619A, 0x1EAE, 0x619B, 0x619C, 0x323C,

+    0x619D, 0x619D, 0x1A19, 0x619E, 0x61A3, 0x323E, 0x61A4, 0x61A4, 0x1EFB,

+    0x61A5, 0x61A6, 0x3244, 0x61A7, 0x61A7, 0x167F, 0x61A8, 0x61A8, 0x0760,

+    0x61A9, 0x61A9, 0x1A18, 0x61AA, 0x61AA, 0x3246, 0x61AB, 0x61AB, 0x2089,

+    0x61AC, 0x61AC, 0x167D, 0x61AD, 0x61AD, 0x3247, 0x61AE, 0x61AE, 0x23B1,

+    0x61AF, 0x61B1, 0x3248, 0x61B2, 0x61B2, 0x21C4, 0x61B3, 0x61B5, 0x324B,

+    0x61B6, 0x61B6, 0x2214, 0x61B7, 0x61B7, 0x1680, 0x61B8, 0x61BD, 0x324E,

+    0x61BE, 0x61BE, 0x076D, 0x61BF, 0x61C1, 0x3254, 0x61C2, 0x61C2, 0x05ED,

+    0x61C3, 0x61C6, 0x3257, 0x61C7, 0x61C7, 0x1FDE, 0x61C8, 0x61C8, 0x0F83,

+    0x61C9, 0x61C9, 0x2223, 0x61CA, 0x61CA, 0x03CE, 0x61CB, 0x61CB, 0x1A1A,

+    0x61CC, 0x61CC, 0x23B6, 0x61CD, 0x61D0, 0x325B, 0x61D1, 0x61D1, 0x1A1B,

+    0x61D2, 0x61D2, 0x09AC, 0x61D3, 0x61D3, 0x325F, 0x61D4, 0x61D4, 0x1681,

+    0x61D5, 0x61DD, 0x3260, 0x61DE, 0x61DE, 0x268C, 0x61DF, 0x61DF, 0x24DE,

+    0x61E0, 0x61E2, 0x3269, 0x61E3, 0x61E3, 0x24E0, 0x61E4, 0x61E5, 0x326C,

+    0x61E6, 0x61E6, 0x0B74, 0x61E7, 0x61E7, 0x326E, 0x61E8, 0x61E8, 0x23B8,

+    0x61E9, 0x61F1, 0x326F, 0x61F2, 0x61F2, 0x1E81, 0x61F3, 0x61F4, 0x3278,

+    0x61F5, 0x61F5, 0x1682, 0x61F6, 0x61F6, 0x1FFE, 0x61F7, 0x61F7, 0x1F51,

+    0x61F8, 0x61F8, 0x21E1, 0x61F9, 0x61F9, 0x327A, 0x61FA, 0x61FA, 0x23B0,

+    0x61FB, 0x61FB, 0x327B, 0x61FC, 0x61FC, 0x1FCE, 0x61FD, 0x61FD, 0x327C,

+    0x61FE, 0x61FE, 0x211E, 0x61FF, 0x61FF, 0x13E0, 0x6200, 0x6200, 0x2021,

+    0x6201, 0x6205, 0x327D, 0x6206, 0x6206, 0x1A1C, 0x6207, 0x6207, 0x24E1,

+    0x6208, 0x6208, 0x06E5, 0x6209, 0x6209, 0x3282, 0x620A, 0x620A, 0x0EFB,

+    0x620B, 0x620B, 0x18F9, 0x620C, 0x620C, 0x0FB2, 0x620D, 0x620D, 0x0D90,

+    0x620E, 0x620E, 0x0CB1, 0x620F, 0x620F, 0x0F24, 0x6210, 0x6210, 0x04EE,

+    0x6211, 0x6211, 0x0EE1, 0x6212, 0x6212, 0x08B5, 0x6213, 0x6213, 0x3283,

+    0x6214, 0x6214, 0x24A3, 0x6215, 0x6215, 0x169E, 0x6216, 0x6216, 0x0807,

+    0x6217, 0x6217, 0x18FA, 0x6218, 0x6218, 0x115E, 0x6219, 0x6219, 0x3284,

+    0x621A, 0x621A, 0x0BFC, 0x621B, 0x621B, 0x18FB, 0x621C, 0x621E, 0x3285,

+    0x621F, 0x621F, 0x18FC, 0x6220, 0x6220, 0x3288, 0x6221, 0x6221, 0x18FE,

+    0x6222, 0x6222, 0x18FD, 0x6223, 0x6223, 0x3289, 0x6224, 0x6224, 0x1900,

+    0x6225, 0x6225, 0x18FF, 0x6226, 0x6226, 0x328A, 0x6227, 0x6227, 0x24A4,

+    0x6228, 0x6229, 0x328B, 0x622A, 0x622A, 0x08A9, 0x622B, 0x622B, 0x328D,

+    0x622C, 0x622C, 0x1901, 0x622D, 0x622D, 0x328E, 0x622E, 0x622E, 0x0A65,

+    0x622F, 0x622F, 0x328F, 0x6230, 0x6230, 0x2273, 0x6231, 0x6231, 0x3290,

+    0x6232, 0x6232, 0x21B0, 0x6233, 0x6233, 0x0544, 0x6234, 0x6234, 0x057A,

+    0x6235, 0x6236, 0x3291, 0x6237, 0x6237, 0x07BC, 0x6238, 0x623C, 0x3293,

+    0x623D, 0x623D, 0x19F4, 0x623E, 0x623E, 0x19F3, 0x623F, 0x623F, 0x065C,

+    0x6240, 0x6240, 0x0DEE, 0x6241, 0x6241, 0x044B, 0x6242, 0x6242, 0x3298,

+    0x6243, 0x6243, 0x19F5, 0x6244, 0x6246, 0x3299, 0x6247, 0x6247, 0x0D01,

+    0x6248, 0x6249, 0x19F6, 0x624A, 0x624A, 0x329C, 0x624B, 0x624B, 0x0D6D,

+    0x624C, 0x624C, 0x14BA, 0x624D, 0x624D, 0x048C, 0x624E, 0x624E, 0x113D,

+    0x624F, 0x6250, 0x329D, 0x6251, 0x6251, 0x0BEA, 0x6252, 0x6252, 0x03D2,

+    0x6253, 0x6253, 0x0575, 0x6254, 0x6254, 0x0CAE, 0x6255, 0x6257, 0x329F,

+    0x6258, 0x6258, 0x0E81, 0x6259, 0x625A, 0x32A2, 0x625B, 0x625B, 0x0945,

+    0x625C, 0x6262, 0x32A4, 0x6263, 0x6263, 0x0968, 0x6264, 0x6265, 0x32AB,

+    0x6266, 0x6266, 0x0C21, 0x6267, 0x6267, 0x11B3, 0x6268, 0x6268, 0x32AD,

+    0x6269, 0x6269, 0x0994, 0x626A, 0x626A, 0x14BB, 0x626B, 0x626B, 0x0CE1,

+    0x626C, 0x626C, 0x1018, 0x626D, 0x626D, 0x0B65, 0x626E, 0x626E, 0x03F2,

+    0x626F, 0x626F, 0x04DB, 0x6270, 0x6270, 0x0CA0, 0x6271, 0x6272, 0x32AE,

+    0x6273, 0x6273, 0x03ED, 0x6274, 0x6275, 0x32B0, 0x6276, 0x6276, 0x0693,

+    0x6277, 0x6278, 0x32B2, 0x6279, 0x6279, 0x0BBB, 0x627A, 0x627B, 0x32B4,

+    0x627C, 0x627C, 0x0632, 0x627D, 0x627D, 0x32B6, 0x627E, 0x627E, 0x1173,

+    0x627F, 0x627F, 0x04F5, 0x6280, 0x6280, 0x082F, 0x6281, 0x6283, 0x32B7,

+    0x6284, 0x6284, 0x04D2, 0x6285, 0x6288, 0x32BA, 0x6289, 0x6289, 0x0920,

+    0x628A, 0x628A, 0x03DC, 0x628B, 0x6290, 0x32BE, 0x6291, 0x6291, 0x105D,

+    0x6292, 0x6292, 0x0D7A, 0x6293, 0x6293, 0x1202, 0x6294, 0x6294, 0x32C4,

+    0x6295, 0x6295, 0x0E67, 0x6296, 0x6296, 0x05F5, 0x6297, 0x6297, 0x0946,

+    0x6298, 0x6298, 0x117C, 0x6299, 0x6299, 0x32C5, 0x629A, 0x629A, 0x06A2,

+    0x629B, 0x629B, 0x0B98, 0x629C, 0x629E, 0x32C6, 0x629F, 0x629F, 0x14BC,

+    0x62A0, 0x62A0, 0x0966, 0x62A1, 0x62A1, 0x0A7C, 0x62A2, 0x62A2, 0x0C3D,

+    0x62A3, 0x62A3, 0x32C9, 0x62A4, 0x62A4, 0x07B9, 0x62A5, 0x62A5, 0x0411,

+    0x62A6, 0x62A7, 0x32CA, 0x62A8, 0x62A8, 0x0BAB, 0x62A9, 0x62AA, 0x32CC,

+    0x62AB, 0x62AB, 0x0BBC, 0x62AC, 0x62AC, 0x0DFA, 0x62AD, 0x62B0, 0x32CE,

+    0x62B1, 0x62B1, 0x0410, 0x62B2, 0x62B4, 0x32D2, 0x62B5, 0x62B5, 0x05B7,

+    0x62B6, 0x62B8, 0x32D5, 0x62B9, 0x62B9, 0x0B0B, 0x62BA, 0x62BA, 0x32D8,

+    0x62BB, 0x62BB, 0x14BD, 0x62BC, 0x62BC, 0x0FE3, 0x62BD, 0x62BD, 0x050E,

+    0x62BE, 0x62BE, 0x32D9, 0x62BF, 0x62BF, 0x0AF7, 0x62C0, 0x62C1, 0x32DA,

+    0x62C2, 0x62C2, 0x0694, 0x62C3, 0x62C3, 0x32DC, 0x62C4, 0x62C4, 0x11F3,

+    0x62C5, 0x62C5, 0x0584, 0x62C6, 0x62C6, 0x04B7, 0x62C7, 0x62C7, 0x0B17,

+    0x62C8, 0x62C8, 0x0B4C, 0x62C9, 0x62C9, 0x0998, 0x62CA, 0x62CA, 0x14BE,

+    0x62CB, 0x62CB, 0x32DD, 0x62CC, 0x62CC, 0x03F3, 0x62CD, 0x62CD, 0x0B85,

+    0x62CE, 0x62CE, 0x0A29, 0x62CF, 0x62CF, 0x32DE, 0x62D0, 0x62D0, 0x072E,

+    0x62D1, 0x62D1, 0x32DF, 0x62D2, 0x62D2, 0x090B, 0x62D3, 0x62D3, 0x0E89,

+    0x62D4, 0x62D4, 0x03D9, 0x62D5, 0x62D5, 0x32E0, 0x62D6, 0x62D6, 0x0E80,

+    0x62D7, 0x62D7, 0x14C0, 0x62D8, 0x62D8, 0x08FF, 0x62D9, 0x62D9, 0x121B,

+    0x62DA, 0x62DA, 0x14BF, 0x62DB, 0x62DB, 0x1171, 0x62DC, 0x62DC, 0x03E8,

+    0x62DD, 0x62DE, 0x32E1, 0x62DF, 0x62DF, 0x0B45, 0x62E0, 0x62E1, 0x32E3,

+    0x62E2, 0x62E2, 0x0A4A, 0x62E3, 0x62E3, 0x0863, 0x62E4, 0x62E4, 0x32E5,

+    0x62E5, 0x62E5, 0x109A, 0x62E6, 0x62E6, 0x09A4, 0x62E7, 0x62E7, 0x0B62,

+    0x62E8, 0x62E8, 0x046D, 0x62E9, 0x62E9, 0x1134, 0x62EA, 0x62EB, 0x32E6,

+    0x62EC, 0x62EC, 0x0993, 0x62ED, 0x62ED, 0x0D5A, 0x62EE, 0x62EE, 0x14C1,

+    0x62EF, 0x62EF, 0x119D, 0x62F0, 0x62F0, 0x32E8, 0x62F1, 0x62F1, 0x0709,

+    0x62F2, 0x62F2, 0x32E9, 0x62F3, 0x62F3, 0x0C88, 0x62F4, 0x62F4, 0x0D9E,

+    0x62F5, 0x62F5, 0x32EA, 0x62F6, 0x62F6, 0x14C3, 0x62F7, 0x62F7, 0x094A,

+    0x62F8, 0x62FB, 0x32EB, 0x62FC, 0x62FC, 0x0BD3, 0x62FD, 0x62FD, 0x1204,

+    0x62FE, 0x62FE, 0x0D47, 0x62FF, 0x62FF, 0x0B26, 0x6300, 0x6300, 0x32EF,

+    0x6301, 0x6301, 0x04FB, 0x6302, 0x6302, 0x072B, 0x6303, 0x6306, 0x32F0,

+    0x6307, 0x6307, 0x11B7, 0x6308, 0x6308, 0x194E, 0x6309, 0x6309, 0x03BF,

+    0x630A, 0x630D, 0x32F4, 0x630E, 0x630E, 0x0973, 0x630F, 0x6310, 0x32F8,

+    0x6311, 0x6311, 0x0E47, 0x6312, 0x6315, 0x32FA, 0x6316, 0x6316, 0x0E8B,

+    0x6317, 0x6319, 0x32FE, 0x631A, 0x631A, 0x11BE, 0x631B, 0x631B, 0x0A75,

+    0x631C, 0x631C, 0x3301, 0x631D, 0x631D, 0x0EDD, 0x631E, 0x631E, 0x0DF5,

+    0x631F, 0x631F, 0x0F79, 0x6320, 0x6320, 0x0B36, 0x6321, 0x6321, 0x0593,

+    0x6322, 0x6322, 0x14C2, 0x6323, 0x6323, 0x1196, 0x6324, 0x6324, 0x082A,

+    0x6325, 0x6325, 0x07E8, 0x6326, 0x6327, 0x3302, 0x6328, 0x6328, 0x03AF,

+    0x6329, 0x6329, 0x3304, 0x632A, 0x632A, 0x0B73, 0x632B, 0x632B, 0x056F,

+    0x632C, 0x632E, 0x3305, 0x632F, 0x632F, 0x1192, 0x6330, 0x6331, 0x3308,

+    0x6332, 0x6332, 0x194F, 0x6333, 0x6338, 0x330A, 0x6339, 0x6339, 0x14C4,

+    0x633A, 0x633A, 0x0E57, 0x633B, 0x633C, 0x3310, 0x633D, 0x633D, 0x0E9D,

+    0x633E, 0x633E, 0x21D1, 0x633F, 0x6341, 0x3312, 0x6342, 0x6342, 0x0EF5,

+    0x6343, 0x6343, 0x14C6, 0x6344, 0x6344, 0x3315, 0x6345, 0x6345, 0x0E62,

+    0x6346, 0x6346, 0x0991, 0x6347, 0x6348, 0x3316, 0x6349, 0x6349, 0x121A,

+    0x634A, 0x634A, 0x3318, 0x634B, 0x634B, 0x14C5, 0x634C, 0x634C, 0x03D1,

+    0x634D, 0x634D, 0x076B, 0x634E, 0x634E, 0x0D0C, 0x634F, 0x634F, 0x0B56,

+    0x6350, 0x6350, 0x0917, 0x6351, 0x6354, 0x3319, 0x6355, 0x6355, 0x047D,

+    0x6356, 0x635D, 0x331D, 0x635E, 0x635E, 0x09B7, 0x635F, 0x635F, 0x0DE5,

+    0x6360, 0x6360, 0x3325, 0x6361, 0x6361, 0x0864, 0x6362, 0x6362, 0x07D0,

+    0x6363, 0x6363, 0x0598, 0x6364, 0x6366, 0x3326, 0x6367, 0x6367, 0x0BB6,

+    0x6368, 0x6368, 0x211C, 0x6369, 0x6369, 0x14D0, 0x636A, 0x636A, 0x3329,

+    0x636B, 0x636B, 0x235D, 0x636C, 0x636C, 0x332A, 0x636D, 0x636D, 0x14CD,

+    0x636E, 0x636E, 0x090C, 0x636F, 0x6370, 0x332B, 0x6371, 0x6371, 0x14C9,

+    0x6372, 0x6372, 0x2682, 0x6373, 0x6375, 0x332D, 0x6376, 0x6376, 0x053A,

+    0x6377, 0x6377, 0x08AE, 0x6378, 0x6379, 0x3330, 0x637A, 0x637A, 0x14CA,

+    0x637B, 0x637B, 0x0B50, 0x637C, 0x637F, 0x3332, 0x6380, 0x6380, 0x0F33,

+    0x6381, 0x6381, 0x3336, 0x6382, 0x6382, 0x05C1, 0x6383, 0x6383, 0x210D,

+    0x6384, 0x6384, 0x205A, 0x6385, 0x6386, 0x3337, 0x6387, 0x6387, 0x061D,

+    0x6388, 0x6388, 0x0D71, 0x6389, 0x6389, 0x05D5, 0x638A, 0x638A, 0x14CF,

+    0x638B, 0x638B, 0x3339, 0x638C, 0x638C, 0x1167, 0x638D, 0x638D, 0x333A,

+    0x638E, 0x638E, 0x14CB, 0x638F, 0x638F, 0x0E20, 0x6390, 0x6390, 0x0C1D,

+    0x6391, 0x6391, 0x333B, 0x6392, 0x6392, 0x0B86, 0x6393, 0x6395, 0x333C,

+    0x6396, 0x6396, 0x103B, 0x6397, 0x6397, 0x333F, 0x6398, 0x6398, 0x0921,

+    0x6399, 0x639F, 0x3340, 0x63A0, 0x63A0, 0x0A7A, 0x63A1, 0x63A1, 0x3347,

+    0x63A2, 0x63A2, 0x0E10, 0x63A3, 0x63A3, 0x04DD, 0x63A4, 0x63A4, 0x3348,

+    0x63A5, 0x63A5, 0x08A4, 0x63A6, 0x63A6, 0x3349, 0x63A7, 0x63A7, 0x0965,

+    0x63A8, 0x63A8, 0x0E77, 0x63A9, 0x63A9, 0x1003, 0x63AA, 0x63AA, 0x056E,

+    0x63AB, 0x63AB, 0x334A, 0x63AC, 0x63AC, 0x14CE, 0x63AD, 0x63AD, 0x14C7,

+    0x63AE, 0x63AE, 0x14D1, 0x63AF, 0x63AF, 0x334B, 0x63B0, 0x63B0, 0x1950,

+    0x63B1, 0x63B2, 0x334C, 0x63B3, 0x63B3, 0x0A57, 0x63B4, 0x63B4, 0x14CC,

+    0x63B5, 0x63B6, 0x334E, 0x63B7, 0x63B7, 0x11BF, 0x63B8, 0x63B8, 0x0588,

+    0x63B9, 0x63B9, 0x3350, 0x63BA, 0x63BA, 0x04BB, 0x63BB, 0x63BB, 0x3351,

+    0x63BC, 0x63BC, 0x14D2, 0x63BD, 0x63BD, 0x3352, 0x63BE, 0x63BE, 0x14DC,

+    0x63BF, 0x63BF, 0x3353, 0x63C0, 0x63C0, 0x1F8D, 0x63C1, 0x63C3, 0x3354,

+    0x63C4, 0x63C4, 0x14D7, 0x63C5, 0x63C5, 0x3357, 0x63C6, 0x63C6, 0x14DB,

+    0x63C7, 0x63C8, 0x3358, 0x63C9, 0x63C9, 0x0CBB, 0x63CA, 0x63CC, 0x335A,

+    0x63CD, 0x63CD, 0x123E, 0x63CE, 0x63CE, 0x14D9, 0x63CF, 0x63CF, 0x0AED,

+    0x63D0, 0x63D0, 0x0E34, 0x63D1, 0x63D1, 0x335D, 0x63D2, 0x63D2, 0x04AC,

+    0x63D3, 0x63D5, 0x335E, 0x63D6, 0x63D6, 0x1045, 0x63D7, 0x63D9, 0x3361,

+    0x63DA, 0x63DA, 0x21FF, 0x63DB, 0x63DD, 0x3364, 0x63DE, 0x63DE, 0x14D8,

+    0x63DF, 0x63DF, 0x3367, 0x63E0, 0x63E0, 0x14D5, 0x63E1, 0x63E1, 0x0EE4,

+    0x63E2, 0x63E2, 0x3368, 0x63E3, 0x63E3, 0x052A, 0x63E4, 0x63E8, 0x3369,

+    0x63E9, 0x63E9, 0x0938, 0x63EA, 0x63EA, 0x08ED, 0x63EB, 0x63EC, 0x336E,

+    0x63ED, 0x63ED, 0x08A3, 0x63EE, 0x63EE, 0x1F58, 0x63EF, 0x63F1, 0x3370,

+    0x63F2, 0x63F2, 0x14D3, 0x63F3, 0x63F3, 0x3373, 0x63F4, 0x63F4, 0x10F1,

+    0x63F5, 0x63F5, 0x3374, 0x63F6, 0x63F6, 0x14C8, 0x63F7, 0x63F7, 0x3375,

+    0x63F8, 0x63F8, 0x14D4, 0x63F9, 0x63FC, 0x3376, 0x63FD, 0x63FD, 0x09AA,

+    0x63FE, 0x63FE, 0x337A, 0x63FF, 0x63FF, 0x14D6, 0x6400, 0x6400, 0x04BA,

+    0x6401, 0x6401, 0x06E4, 0x6402, 0x6402, 0x0A4E, 0x6403, 0x6404, 0x337B,

+    0x6405, 0x6405, 0x0892, 0x6406, 0x640A, 0x337D, 0x640B, 0x640B, 0x14DF,

+    0x640C, 0x640C, 0x14E2, 0x640D, 0x640D, 0x215B, 0x640E, 0x640E, 0x3382,

+    0x640F, 0x640F, 0x0472, 0x6410, 0x6410, 0x0527, 0x6411, 0x6412, 0x3383,

+    0x6413, 0x6413, 0x056D, 0x6414, 0x6414, 0x0CDF, 0x6415, 0x6416, 0x3385,

+    0x6417, 0x6417, 0x1EB6, 0x6418, 0x641A, 0x3387, 0x641B, 0x641B, 0x14E0,

+    0x641C, 0x641C, 0x0DC6, 0x641D, 0x641D, 0x338A, 0x641E, 0x641E, 0x06DE,

+    0x641F, 0x641F, 0x338B, 0x6420, 0x6420, 0x14E1, 0x6421, 0x6421, 0x14E4,

+    0x6422, 0x6425, 0x338C, 0x6426, 0x6426, 0x14E3, 0x6427, 0x6429, 0x3390,

+    0x642A, 0x642A, 0x0E15, 0x642B, 0x642B, 0x3393, 0x642C, 0x642C, 0x03EC,

+    0x642D, 0x642D, 0x0571, 0x642E, 0x6433, 0x3394, 0x6434, 0x6434, 0x1736,

+    0x6435, 0x6435, 0x339A, 0x6436, 0x6436, 0x20DB, 0x6437, 0x6439, 0x339B,

+    0x643A, 0x643A, 0x0F7A, 0x643B, 0x643C, 0x339E, 0x643D, 0x643D, 0x04B2,

+    0x643E, 0x643E, 0x33A0, 0x643F, 0x643F, 0x1951, 0x6440, 0x6440, 0x33A1,

+    0x6441, 0x6441, 0x14DE, 0x6442, 0x6443, 0x33A2, 0x6444, 0x6444, 0x0D1C,

+    0x6445, 0x6445, 0x14DD, 0x6446, 0x6446, 0x03E5, 0x6447, 0x6447, 0x1028,

+    0x6448, 0x6448, 0x0460, 0x6449, 0x6449, 0x33A4, 0x644A, 0x644A, 0x0E02,

+    0x644B, 0x6450, 0x33A5, 0x6451, 0x6451, 0x2360, 0x6452, 0x6452, 0x14DA,

+    0x6453, 0x6453, 0x33AB, 0x6454, 0x6454, 0x0D99, 0x6455, 0x6457, 0x33AC,

+    0x6458, 0x6458, 0x114B, 0x6459, 0x645B, 0x33AF, 0x645C, 0x645C, 0x2361,

+    0x645D, 0x645D, 0x33B2, 0x645E, 0x645E, 0x14E5, 0x645F, 0x645F, 0x2040,

+    0x6460, 0x6466, 0x33B3, 0x6467, 0x6467, 0x0560, 0x6468, 0x6468, 0x33BA,

+    0x6469, 0x6469, 0x0B09, 0x646A, 0x646C, 0x33BB, 0x646D, 0x646D, 0x14E7,

+    0x646E, 0x646E, 0x33BE, 0x646F, 0x646F, 0x228E, 0x6470, 0x6472, 0x33BF,

+    0x6473, 0x6473, 0x1FDF, 0x6474, 0x6475, 0x33C2, 0x6476, 0x6476, 0x235E,

+    0x6477, 0x6477, 0x33C4, 0x6478, 0x6479, 0x0B03, 0x647A, 0x647A, 0x14E9,

+    0x647B, 0x647B, 0x1E6A, 0x647C, 0x6481, 0x33C5, 0x6482, 0x6482, 0x0A15,

+    0x6483, 0x6483, 0x33CB, 0x6484, 0x6484, 0x14E6, 0x6485, 0x6485, 0x091E,

+    0x6486, 0x6486, 0x33CC, 0x6487, 0x6487, 0x0BD1, 0x6488, 0x6488, 0x2002,

+    0x6489, 0x6490, 0x33CD, 0x6491, 0x6491, 0x04EA, 0x6492, 0x6492, 0x0CD1,

+    0x6493, 0x6493, 0x2093, 0x6494, 0x6494, 0x33D5, 0x6495, 0x6495, 0x0DAF,

+    0x6496, 0x6496, 0x14E8, 0x6497, 0x6498, 0x33D6, 0x6499, 0x6499, 0x14EC,

+    0x649A, 0x649D, 0x33D8, 0x649E, 0x649E, 0x120F, 0x649F, 0x649F, 0x235F,

+    0x64A0, 0x64A2, 0x33DC, 0x64A3, 0x64A3, 0x1EAC, 0x64A4, 0x64A4, 0x04DC,

+    0x64A5, 0x64A5, 0x1E54, 0x64A6, 0x64A8, 0x33DF, 0x64A9, 0x64A9, 0x0A0C,

+    0x64AA, 0x64AA, 0x33E2, 0x64AB, 0x64AB, 0x1F08, 0x64AC, 0x64AC, 0x0C48,

+    0x64AD, 0x64AD, 0x046C, 0x64AE, 0x64AE, 0x056C, 0x64AF, 0x64AF, 0x33E3,

+    0x64B0, 0x64B0, 0x1208, 0x64B1, 0x64B1, 0x33E4, 0x64B2, 0x64B2, 0x20C0,

+    0x64B3, 0x64B3, 0x2362, 0x64B4, 0x64B4, 0x33E5, 0x64B5, 0x64B5, 0x0B4F,

+    0x64B6, 0x64B6, 0x33E6, 0x64B7, 0x64B8, 0x14EA, 0x64B9, 0x64B9, 0x33E7,

+    0x64BA, 0x64BA, 0x14ED, 0x64BB, 0x64BB, 0x2160, 0x64BC, 0x64BC, 0x076A,

+    0x64BD, 0x64BD, 0x33E8, 0x64BE, 0x64BE, 0x219D, 0x64BF, 0x64BF, 0x1F8E,

+    0x64C0, 0x64C0, 0x14EE, 0x64C1, 0x64C1, 0x222D, 0x64C2, 0x64C2, 0x09C9,

+    0x64C3, 0x64C3, 0x33E9, 0x64C4, 0x64C4, 0x2047, 0x64C5, 0x64C5, 0x0CFC,

+    0x64C6, 0x64C6, 0x33EA, 0x64C7, 0x64C7, 0x2262, 0x64C8, 0x64C9, 0x33EB,

+    0x64CA, 0x64CA, 0x1F67, 0x64CB, 0x64CB, 0x1EB2, 0x64CC, 0x64CC, 0x33ED,

+    0x64CD, 0x64CD, 0x04A0, 0x64CE, 0x64CE, 0x0C63, 0x64CF, 0x64CF, 0x33EE,

+    0x64D0, 0x64D0, 0x14EF, 0x64D1, 0x64D1, 0x33EF, 0x64D2, 0x64D2, 0x0C59,

+    0x64D3, 0x64D3, 0x33F0, 0x64D4, 0x64D4, 0x1EA9, 0x64D5, 0x64D6, 0x33F1,

+    0x64D7, 0x64D7, 0x14F0, 0x64D8, 0x64D8, 0x1952, 0x64D9, 0x64D9, 0x33F3,

+    0x64DA, 0x64DA, 0x1FCC, 0x64DB, 0x64DD, 0x33F4, 0x64DE, 0x64DE, 0x0DC8,

+    0x64DF, 0x64DF, 0x33F7, 0x64E0, 0x64E0, 0x1F72, 0x64E1, 0x64E1, 0x33F8,

+    0x64E2, 0x64E2, 0x14F2, 0x64E3, 0x64E3, 0x33F9, 0x64E4, 0x64E4, 0x14F1,

+    0x64E5, 0x64E5, 0x33FA, 0x64E6, 0x64E6, 0x0488, 0x64E7, 0x64EB, 0x33FB,

+    0x64EC, 0x64EC, 0x2098, 0x64ED, 0x64EE, 0x3400, 0x64EF, 0x64EF, 0x1E52,

+    0x64F0, 0x64F0, 0x20A4, 0x64F1, 0x64F1, 0x1F1C, 0x64F2, 0x64F2, 0x228F,

+    0x64F3, 0x64F3, 0x3402, 0x64F4, 0x64F4, 0x1FED, 0x64F5, 0x64F6, 0x3403,

+    0x64F7, 0x64F7, 0x2365, 0x64F8, 0x64F9, 0x3405, 0x64FA, 0x64FA, 0x1E2D,

+    0x64FB, 0x64FB, 0x2152, 0x64FC, 0x64FC, 0x2366, 0x64FD, 0x64FD, 0x3407,

+    0x64FE, 0x64FE, 0x20FA, 0x64FF, 0x64FF, 0x3408, 0x6500, 0x6500, 0x0B8B,

+    0x6501, 0x6503, 0x3409, 0x6504, 0x6504, 0x2363, 0x6505, 0x6505, 0x340C,

+    0x6506, 0x6506, 0x209A, 0x6507, 0x6508, 0x340D, 0x6509, 0x6509, 0x14F3,

+    0x650A, 0x650E, 0x340F, 0x650F, 0x650F, 0x203C, 0x6510, 0x6511, 0x3414,

+    0x6512, 0x6512, 0x111F, 0x6513, 0x6513, 0x3416, 0x6514, 0x6514, 0x1FF6,

+    0x6515, 0x6515, 0x3417, 0x6516, 0x6516, 0x2364, 0x6517, 0x6517, 0x3418,

+    0x6518, 0x6518, 0x0C9C, 0x6519, 0x6519, 0x1E69, 0x651A, 0x651A, 0x3419,

+    0x651B, 0x651B, 0x2367, 0x651C, 0x651C, 0x341A, 0x651D, 0x651D, 0x211D,

+    0x651E, 0x6521, 0x341B, 0x6522, 0x6522, 0x2259, 0x6523, 0x6523, 0x2056,

+    0x6524, 0x6524, 0x2163, 0x6525, 0x6525, 0x14F4, 0x6526, 0x6529, 0x341F,

+    0x652A, 0x652A, 0x1FA9, 0x652B, 0x652B, 0x091F, 0x652C, 0x652C, 0x1FFC,

+    0x652D, 0x652D, 0x3423, 0x652E, 0x652E, 0x14F5, 0x652F, 0x652F, 0x11A6,

+    0x6530, 0x6533, 0x3424, 0x6534, 0x6534, 0x1909, 0x6535, 0x6535, 0x1966,

+    0x6536, 0x6536, 0x0D6C, 0x6537, 0x6537, 0x3428, 0x6538, 0x6538, 0x12B2,

+    0x6539, 0x6539, 0x06BF, 0x653A, 0x653A, 0x3429, 0x653B, 0x653B, 0x06FE,

+    0x653C, 0x653D, 0x342A, 0x653E, 0x653E, 0x0662, 0x653F, 0x653F, 0x119F,

+    0x6540, 0x6544, 0x342C, 0x6545, 0x6545, 0x0723, 0x6546, 0x6547, 0x3431,

+    0x6548, 0x6548, 0x0F72, 0x6549, 0x6549, 0x1CCB, 0x654A, 0x654B, 0x3433,

+    0x654C, 0x654C, 0x05B1, 0x654D, 0x654E, 0x3435, 0x654F, 0x654F, 0x0AF9,

+    0x6550, 0x6550, 0x3437, 0x6551, 0x6551, 0x08F7, 0x6552, 0x6554, 0x3438,

+    0x6555, 0x6555, 0x1967, 0x6556, 0x6556, 0x03C8, 0x6557, 0x6557, 0x1E2E,

+    0x6558, 0x6558, 0x343B, 0x6559, 0x6559, 0x089D, 0x655A, 0x655A, 0x343C,

+    0x655B, 0x655B, 0x09FB, 0x655C, 0x655C, 0x343D, 0x655D, 0x655D, 0x043F,

+    0x655E, 0x655E, 0x04CD, 0x655F, 0x6561, 0x343E, 0x6562, 0x6562, 0x06CD,

+    0x6563, 0x6563, 0x0CDB, 0x6564, 0x6565, 0x3441, 0x6566, 0x6566, 0x0617,

+    0x6567, 0x656A, 0x3443, 0x656B, 0x656B, 0x1968, 0x656C, 0x656C, 0x08E3,

+    0x656D, 0x656F, 0x3447, 0x6570, 0x6570, 0x0D94, 0x6571, 0x6571, 0x344A,

+    0x6572, 0x6572, 0x0C40, 0x6573, 0x6573, 0x344B, 0x6574, 0x6574, 0x119C,

+    0x6575, 0x6575, 0x1EBC, 0x6576, 0x6576, 0x344C, 0x6577, 0x6577, 0x0690,

+    0x6578, 0x6578, 0x2142, 0x6579, 0x6581, 0x344D, 0x6582, 0x6582, 0x201E,

+    0x6583, 0x6583, 0x1E43, 0x6584, 0x6586, 0x3456, 0x6587, 0x6587, 0x0ED3,

+    0x6588, 0x658A, 0x3459, 0x658B, 0x658B, 0x114C, 0x658C, 0x658C, 0x045C,

+    0x658D, 0x658F, 0x345C, 0x6590, 0x6590, 0x19C1, 0x6591, 0x6591, 0x03EA,

+    0x6592, 0x6592, 0x345F, 0x6593, 0x6593, 0x19C3, 0x6594, 0x6594, 0x3460,

+    0x6595, 0x6595, 0x24D4, 0x6596, 0x6596, 0x3461, 0x6597, 0x6597, 0x05F6,

+    0x6598, 0x6598, 0x3462, 0x6599, 0x6599, 0x0A18, 0x659A, 0x659A, 0x3463,

+    0x659B, 0x659B, 0x1D56, 0x659C, 0x659C, 0x0F7C, 0x659D, 0x659E, 0x3464,

+    0x659F, 0x659F, 0x1186, 0x65A0, 0x65A0, 0x3466, 0x65A1, 0x65A1, 0x0EE2,

+    0x65A2, 0x65A3, 0x3467, 0x65A4, 0x65A4, 0x08C0, 0x65A5, 0x65A5, 0x0507,

+    0x65A6, 0x65A6, 0x3469, 0x65A7, 0x65A7, 0x06A6, 0x65A8, 0x65A8, 0x346A,

+    0x65A9, 0x65A9, 0x1157, 0x65AA, 0x65AA, 0x346B, 0x65AB, 0x65AB, 0x1A29,

+    0x65AC, 0x65AC, 0x226F, 0x65AD, 0x65AD, 0x060E, 0x65AE, 0x65AE, 0x346C,

+    0x65AF, 0x65AF, 0x0DAE, 0x65B0, 0x65B0, 0x0F8D, 0x65B1, 0x65B6, 0x346D,

+    0x65B7, 0x65B7, 0x1ED7, 0x65B8, 0x65B8, 0x3473, 0x65B9, 0x65B9, 0x065A,

+    0x65BA, 0x65BB, 0x3474, 0x65BC, 0x65BC, 0x19C4, 0x65BD, 0x65BD, 0x0D40,

+    0x65BE, 0x65C0, 0x3476, 0x65C1, 0x65C1, 0x0B95, 0x65C2, 0x65C2, 0x3479,

+    0x65C3, 0x65C3, 0x19C7, 0x65C4, 0x65C4, 0x19C6, 0x65C5, 0x65C5, 0x0A6A,

+    0x65C6, 0x65C6, 0x19C5, 0x65C7, 0x65CA, 0x347A, 0x65CB, 0x65CB, 0x0FC8,

+    0x65CC, 0x65CC, 0x19C8, 0x65CD, 0x65CD, 0x347E, 0x65CE, 0x65CE, 0x19C9,

+    0x65CF, 0x65CF, 0x1242, 0x65D0, 0x65D1, 0x347F, 0x65D2, 0x65D2, 0x19CA,

+    0x65D3, 0x65D5, 0x3481, 0x65D6, 0x65D6, 0x19CB, 0x65D7, 0x65D7, 0x0C0B,

+    0x65D8, 0x65DF, 0x3484, 0x65E0, 0x65E0, 0x0EED, 0x65E1, 0x65E1, 0x348C,

+    0x65E2, 0x65E2, 0x083B, 0x65E3, 0x65E4, 0x348D, 0x65E5, 0x65E5, 0x0CB0,

+    0x65E6, 0x65E6, 0x058A, 0x65E7, 0x65E7, 0x08F8, 0x65E8, 0x65E8, 0x11BB,

+    0x65E9, 0x65E9, 0x112A, 0x65EA, 0x65EB, 0x348F, 0x65EC, 0x65EC, 0x0FD7,

+    0x65ED, 0x65ED, 0x0FBC, 0x65EE, 0x65F0, 0x190A, 0x65F1, 0x65F1, 0x076C,

+    0x65F2, 0x65F5, 0x3491, 0x65F6, 0x65F6, 0x0D48, 0x65F7, 0x65F7, 0x0982,

+    0x65F8, 0x65F9, 0x3495, 0x65FA, 0x65FA, 0x0EAB, 0x65FB, 0x65FF, 0x3497,

+    0x6600, 0x6600, 0x1912, 0x6601, 0x6601, 0x349C, 0x6602, 0x6602, 0x03C5,

+    0x6603, 0x6603, 0x1910, 0x6604, 0x6605, 0x349D, 0x6606, 0x6606, 0x0990,

+    0x6607, 0x6609, 0x349F, 0x660A, 0x660A, 0x190D, 0x660B, 0x660B, 0x34A2,

+    0x660C, 0x660C, 0x04C4, 0x660D, 0x660D, 0x34A3, 0x660E, 0x660E, 0x0AFC,

+    0x660F, 0x660F, 0x07FD, 0x6610, 0x6612, 0x34A4, 0x6613, 0x6613, 0x105E,

+    0x6614, 0x6614, 0x0F03, 0x6615, 0x6615, 0x1911, 0x6616, 0x6618, 0x34A7,

+    0x6619, 0x6619, 0x190E, 0x661A, 0x661C, 0x34AA, 0x661D, 0x661D, 0x1915,

+    0x661E, 0x661E, 0x34AD, 0x661F, 0x661F, 0x0F92, 0x6620, 0x6620, 0x1098,

+    0x6621, 0x6624, 0x34AE, 0x6625, 0x6625, 0x053D, 0x6626, 0x6626, 0x34B2,

+    0x6627, 0x6627, 0x0AC6, 0x6628, 0x6628, 0x124F, 0x6629, 0x662C, 0x34B3,

+    0x662D, 0x662D, 0x1172, 0x662E, 0x662E, 0x34B7, 0x662F, 0x662F, 0x0D5E,

+    0x6630, 0x6630, 0x34B8, 0x6631, 0x6631, 0x1917, 0x6632, 0x6633, 0x34B9,

+    0x6634, 0x6634, 0x1916, 0x6635, 0x6635, 0x1919, 0x6636, 0x6636, 0x1918,

+    0x6637, 0x663B, 0x34BB, 0x663C, 0x663C, 0x11E6, 0x663D, 0x663D, 0x34C0,

+    0x663E, 0x663E, 0x0F41, 0x663F, 0x6640, 0x34C1, 0x6641, 0x6641, 0x191D,

+    0x6642, 0x6642, 0x212D, 0x6643, 0x6643, 0x07E3, 0x6644, 0x664A, 0x34C3,

+    0x664B, 0x664B, 0x08CB, 0x664C, 0x664C, 0x0D07, 0x664D, 0x664E, 0x34CA,

+    0x664F, 0x664F, 0x191E, 0x6650, 0x6651, 0x34CC, 0x6652, 0x6652, 0x0CF2,

+    0x6653, 0x6653, 0x0F6B, 0x6654, 0x6654, 0x191C, 0x6655, 0x6655, 0x1111,

+    0x6656, 0x6656, 0x191F, 0x6657, 0x6657, 0x1921, 0x6658, 0x6659, 0x34CE,

+    0x665A, 0x665A, 0x0E9E, 0x665B, 0x665C, 0x34D0, 0x665D, 0x665D, 0x229B,

+    0x665E, 0x665E, 0x34D2, 0x665F, 0x665F, 0x191B, 0x6660, 0x6660, 0x34D3,

+    0x6661, 0x6661, 0x1920, 0x6662, 0x6663, 0x34D4, 0x6664, 0x6664, 0x0EFD,

+    0x6665, 0x6665, 0x34D6, 0x6666, 0x6666, 0x07F3, 0x6667, 0x6667, 0x34D7,

+    0x6668, 0x6668, 0x04E4, 0x6669, 0x666D, 0x34D8, 0x666E, 0x666E, 0x0BF4,

+    0x666F, 0x666F, 0x08DF, 0x6670, 0x6670, 0x0F09, 0x6671, 0x6673, 0x34DD,

+    0x6674, 0x6674, 0x0C64, 0x6675, 0x6675, 0x34E0, 0x6676, 0x6676, 0x08D6,

+    0x6677, 0x6677, 0x1922, 0x6678, 0x6679, 0x34E1, 0x667A, 0x667A, 0x11C6,

+    0x667B, 0x667D, 0x34E3, 0x667E, 0x667E, 0x0A09, 0x667F, 0x6681, 0x34E6,

+    0x6682, 0x6682, 0x1120, 0x6683, 0x6683, 0x34E9, 0x6684, 0x6684, 0x1923,

+    0x6685, 0x6686, 0x34EA, 0x6687, 0x6687, 0x0F2B, 0x6688, 0x6688, 0x2256,

+    0x6689, 0x6689, 0x24A8, 0x668A, 0x668B, 0x34EC, 0x668C, 0x668C, 0x1924,

+    0x668D, 0x6690, 0x34EE, 0x6691, 0x6691, 0x0D85, 0x6692, 0x6695, 0x34F2,

+    0x6696, 0x6696, 0x0B70, 0x6697, 0x6697, 0x03C0, 0x6698, 0x669C, 0x34F6,

+    0x669D, 0x669D, 0x1926, 0x669E, 0x66A1, 0x34FB, 0x66A2, 0x66A2, 0x1E79,

+    0x66A3, 0x66A6, 0x34FF, 0x66A7, 0x66A7, 0x1925, 0x66A8, 0x66A8, 0x1CDD,

+    0x66A9, 0x66AA, 0x3503, 0x66AB, 0x66AB, 0x225A, 0x66AC, 0x66AD, 0x3505,

+    0x66AE, 0x66AE, 0x0B1D, 0x66AF, 0x66B3, 0x3507, 0x66B4, 0x66B4, 0x0412,

+    0x66B5, 0x66B8, 0x350C, 0x66B9, 0x66B9, 0x175B, 0x66BA, 0x66BD, 0x3510,

+    0x66BE, 0x66BE, 0x1927, 0x66BF, 0x66C3, 0x3514, 0x66C4, 0x66C4, 0x24A7,

+    0x66C5, 0x66C5, 0x3519, 0x66C6, 0x66C6, 0x2686, 0x66C7, 0x66C7, 0x24A6,

+    0x66C8, 0x66C8, 0x351A, 0x66C9, 0x66C9, 0x21CE, 0x66CA, 0x66D5, 0x351B,

+    0x66D6, 0x66D6, 0x24A9, 0x66D7, 0x66D8, 0x3527, 0x66D9, 0x66D9, 0x0D86,

+    0x66DA, 0x66DA, 0x3529, 0x66DB, 0x66DC, 0x1928, 0x66DD, 0x66DD, 0x0BF7,

+    0x66DE, 0x66DF, 0x352A, 0x66E0, 0x66E0, 0x1FE7, 0x66E1, 0x66E5, 0x352C,

+    0x66E6, 0x66E6, 0x192A, 0x66E7, 0x66E8, 0x3531, 0x66E9, 0x66E9, 0x192B,

+    0x66EA, 0x66EB, 0x3533, 0x66EC, 0x66EC, 0x2112, 0x66ED, 0x66EF, 0x3535,

+    0x66F0, 0x66F0, 0x10FE, 0x66F1, 0x66F1, 0x3538, 0x66F2, 0x66F2, 0x0C77,

+    0x66F3, 0x66F3, 0x103E, 0x66F4, 0x66F4, 0x06F7, 0x66F5, 0x66F6, 0x3539,

+    0x66F7, 0x66F7, 0x1914, 0x66F8, 0x66F8, 0x213C, 0x66F9, 0x66F9, 0x04A3,

+    0x66FA, 0x66FB, 0x353B, 0x66FC, 0x66FC, 0x0AA3, 0x66FD, 0x66FD, 0x353D,

+    0x66FE, 0x66FE, 0x113B, 0x66FF, 0x66FF, 0x0E39, 0x6700, 0x6700, 0x124B,

+    0x6701, 0x6702, 0x353E, 0x6703, 0x6703, 0x1F5C, 0x6704, 0x6707, 0x3540,

+    0x6708, 0x6708, 0x1105, 0x6709, 0x6709, 0x10B5, 0x670A, 0x670A, 0x1973,

+    0x670B, 0x670B, 0x0BB4, 0x670C, 0x670C, 0x3544, 0x670D, 0x670D, 0x069B,

+    0x670E, 0x670F, 0x3545, 0x6710, 0x6710, 0x1984, 0x6711, 0x6713, 0x3547,

+    0x6714, 0x6714, 0x0DAC, 0x6715, 0x6715, 0x198E, 0x6716, 0x6716, 0x354A,

+    0x6717, 0x6717, 0x09B5, 0x6718, 0x671A, 0x354B, 0x671B, 0x671B, 0x0EAC,

+    0x671C, 0x671C, 0x354E, 0x671D, 0x671D, 0x04D4, 0x671E, 0x671E, 0x354F,

+    0x671F, 0x671F, 0x0BF9, 0x6720, 0x6725, 0x3550, 0x6726, 0x6726, 0x19AC,

+    0x6727, 0x6727, 0x24C4, 0x6728, 0x6728, 0x0B21, 0x6729, 0x6729, 0x3556,

+    0x672A, 0x672A, 0x0EC3, 0x672B, 0x672B, 0x0B0C, 0x672C, 0x672C, 0x0427,

+    0x672D, 0x672D, 0x1140, 0x672E, 0x672E, 0x3557, 0x672F, 0x672F, 0x0D8C,

+    0x6730, 0x6730, 0x3558, 0x6731, 0x6731, 0x11EB, 0x6732, 0x6733, 0x3559,

+    0x6734, 0x6734, 0x0BF2, 0x6735, 0x6735, 0x0623, 0x6736, 0x6739, 0x355B,

+    0x673A, 0x673A, 0x080F, 0x673B, 0x673C, 0x355F, 0x673D, 0x673D, 0x0FAB,

+    0x673E, 0x673F, 0x3561, 0x6740, 0x6740, 0x0CEA, 0x6741, 0x6741, 0x3563,

+    0x6742, 0x6742, 0x1116, 0x6743, 0x6743, 0x0C83, 0x6744, 0x6745, 0x3564,

+    0x6746, 0x6746, 0x06C6, 0x6747, 0x6747, 0x3566, 0x6748, 0x6748, 0x1854,

+    0x6749, 0x6749, 0x0CF5, 0x674A, 0x674B, 0x3567, 0x674C, 0x674C, 0x1851,

+    0x674D, 0x674D, 0x3569, 0x674E, 0x674E, 0x09D9, 0x674F, 0x674F, 0x0F9E,

+    0x6750, 0x6750, 0x048B, 0x6751, 0x6751, 0x0568, 0x6752, 0x6752, 0x356A,

+    0x6753, 0x6753, 0x1852, 0x6754, 0x6755, 0x356B, 0x6756, 0x6756, 0x1169,

+    0x6757, 0x675B, 0x356D, 0x675C, 0x675C, 0x0604, 0x675D, 0x675D, 0x3572,

+    0x675E, 0x675E, 0x1853, 0x675F, 0x675F, 0x0D8F, 0x6760, 0x6760, 0x06D7,

+    0x6761, 0x6761, 0x0E48, 0x6762, 0x6764, 0x3573, 0x6765, 0x6765, 0x099F,

+    0x6766, 0x6767, 0x3576, 0x6768, 0x6768, 0x1017, 0x6769, 0x6769, 0x1855,

+    0x676A, 0x676A, 0x1858, 0x676B, 0x676C, 0x3578, 0x676D, 0x676D, 0x0773,

+    0x676E, 0x676E, 0x357A, 0x676F, 0x676F, 0x0416, 0x6770, 0x6770, 0x08AD,

+    0x6771, 0x6771, 0x1ECC, 0x6772, 0x6772, 0x190F, 0x6773, 0x6773, 0x1859,

+    0x6774, 0x6774, 0x357B, 0x6775, 0x6775, 0x185C, 0x6776, 0x6776, 0x357C,

+    0x6777, 0x6777, 0x1861, 0x6778, 0x677B, 0x357D, 0x677C, 0x677C, 0x1862,

+    0x677D, 0x677D, 0x3581, 0x677E, 0x677E, 0x0DBE, 0x677F, 0x677F, 0x03F0,

+    0x6780, 0x6780, 0x3582, 0x6781, 0x6781, 0x081E, 0x6782, 0x6783, 0x3583,

+    0x6784, 0x6784, 0x0712, 0x6785, 0x6786, 0x3585, 0x6787, 0x6787, 0x1857,

+    0x6788, 0x6788, 0x3587, 0x6789, 0x6789, 0x0EA8, 0x678A, 0x678A, 0x3588,

+    0x678B, 0x678B, 0x1860, 0x678C, 0x678F, 0x3589, 0x6790, 0x6790, 0x0F05,

+    0x6791, 0x6794, 0x358D, 0x6795, 0x6795, 0x118E, 0x6796, 0x6796, 0x3591,

+    0x6797, 0x6797, 0x0A1F, 0x6798, 0x6798, 0x185A, 0x6799, 0x6799, 0x3592,

+    0x679A, 0x679A, 0x0ABB, 0x679B, 0x679B, 0x3593, 0x679C, 0x679C, 0x0754,

+    0x679D, 0x679D, 0x11A5, 0x679E, 0x679E, 0x185E, 0x679F, 0x67A1, 0x3594,

+    0x67A2, 0x67A2, 0x0D77, 0x67A3, 0x67A3, 0x1129, 0x67A4, 0x67A4, 0x3597,

+    0x67A5, 0x67A5, 0x1856, 0x67A6, 0x67A6, 0x3598, 0x67A7, 0x67A7, 0x185B,

+    0x67A8, 0x67A8, 0x185D, 0x67A9, 0x67A9, 0x3599, 0x67AA, 0x67AA, 0x0C36,

+    0x67AB, 0x67AB, 0x0680, 0x67AC, 0x67AC, 0x359A, 0x67AD, 0x67AD, 0x185F,

+    0x67AE, 0x67AE, 0x359B, 0x67AF, 0x67AF, 0x096A, 0x67B0, 0x67B0, 0x1868,

+    0x67B1, 0x67B2, 0x359C, 0x67B3, 0x67B3, 0x186D, 0x67B4, 0x67B4, 0x359E,

+    0x67B5, 0x67B5, 0x186B, 0x67B6, 0x67B6, 0x084F, 0x67B7, 0x67B7, 0x0842,

+    0x67B8, 0x67B8, 0x1871, 0x67B9, 0x67C0, 0x359F, 0x67C1, 0x67C1, 0x1874,

+    0x67C2, 0x67C2, 0x35A7, 0x67C3, 0x67C3, 0x1870, 0x67C4, 0x67C4, 0x0463,

+    0x67C5, 0x67CE, 0x35A8, 0x67CF, 0x67CF, 0x03E3, 0x67D0, 0x67D0, 0x0B16,

+    0x67D1, 0x67D1, 0x06C7, 0x67D2, 0x67D2, 0x0C01, 0x67D3, 0x67D3, 0x0C99,

+    0x67D4, 0x67D4, 0x0CBC, 0x67D5, 0x67D7, 0x35B2, 0x67D8, 0x67D8, 0x1865,

+    0x67D9, 0x67D9, 0x186A, 0x67DA, 0x67DA, 0x186C, 0x67DB, 0x67DB, 0x35B5,

+    0x67DC, 0x67DC, 0x074A, 0x67DD, 0x67DD, 0x186E, 0x67DE, 0x67DE, 0x1252,

+    0x67DF, 0x67DF, 0x35B6, 0x67E0, 0x67E0, 0x0B5E, 0x67E1, 0x67E1, 0x35B7,

+    0x67E2, 0x67E2, 0x1872, 0x67E3, 0x67E4, 0x35B8, 0x67E5, 0x67E5, 0x04B0,

+    0x67E6, 0x67E8, 0x35BA, 0x67E9, 0x67E9, 0x1867, 0x67EA, 0x67EB, 0x35BD,

+    0x67EC, 0x67EC, 0x0860, 0x67ED, 0x67EE, 0x35BF, 0x67EF, 0x67EF, 0x094F,

+    0x67F0, 0x67F0, 0x1863, 0x67F1, 0x67F1, 0x11F8, 0x67F2, 0x67F2, 0x35C1,

+    0x67F3, 0x67F3, 0x0A41, 0x67F4, 0x67F4, 0x04B8, 0x67F5, 0x67FC, 0x35C2,

+    0x67FD, 0x67FD, 0x1875, 0x67FE, 0x67FE, 0x35CA, 0x67FF, 0x67FF, 0x0D58,

+    0x6800, 0x6800, 0x186F, 0x6801, 0x6804, 0x35CB, 0x6805, 0x6805, 0x1145,

+    0x6806, 0x6806, 0x35CF, 0x6807, 0x6807, 0x0453, 0x6808, 0x6808, 0x115C,

+    0x6809, 0x6809, 0x1864, 0x680A, 0x680A, 0x1866, 0x680B, 0x680B, 0x05EF,

+    0x680C, 0x680C, 0x1869, 0x680D, 0x680D, 0x35D0, 0x680E, 0x680E, 0x1873,

+    0x680F, 0x680F, 0x09A3, 0x6810, 0x6810, 0x35D1, 0x6811, 0x6811, 0x0D8E,

+    0x6812, 0x6812, 0x35D2, 0x6813, 0x6813, 0x0D9D, 0x6814, 0x6815, 0x35D3,

+    0x6816, 0x6816, 0x0BFB, 0x6817, 0x6817, 0x09E0, 0x6818, 0x681C, 0x35D5,

+    0x681D, 0x681D, 0x187F, 0x681E, 0x6820, 0x35DA, 0x6821, 0x6821, 0x0F6E,

+    0x6822, 0x6828, 0x35DD, 0x6829, 0x6829, 0x1888, 0x682A, 0x682A, 0x11E9,

+    0x682B, 0x6831, 0x35E4, 0x6832, 0x6833, 0x1876, 0x6834, 0x6836, 0x35EB,

+    0x6837, 0x6837, 0x1022, 0x6838, 0x6838, 0x0782, 0x6839, 0x6839, 0x06F4,

+    0x683A, 0x683B, 0x35EE, 0x683C, 0x683C, 0x06EC, 0x683D, 0x683D, 0x1117,

+    0x683E, 0x683E, 0x1885, 0x683F, 0x683F, 0x35F0, 0x6840, 0x6840, 0x1884,

+    0x6841, 0x6841, 0x1882, 0x6842, 0x6842, 0x0749, 0x6843, 0x6843, 0x0E25,

+    0x6844, 0x6844, 0x187C, 0x6845, 0x6845, 0x0EB5, 0x6846, 0x6846, 0x097F,

+    0x6847, 0x6847, 0x35F1, 0x6848, 0x6848, 0x03C3, 0x6849, 0x6849, 0x1887,

+    0x684A, 0x684A, 0x1886, 0x684B, 0x684B, 0x35F2, 0x684C, 0x684C, 0x121D,

+    0x684D, 0x684D, 0x35F3, 0x684E, 0x684E, 0x187A, 0x684F, 0x684F, 0x35F4,

+    0x6850, 0x6850, 0x0E5A, 0x6851, 0x6851, 0x0CDC, 0x6852, 0x6852, 0x35F5,

+    0x6853, 0x6853, 0x07CD, 0x6854, 0x6854, 0x08AC, 0x6855, 0x6855, 0x1880,

+    0x6856, 0x685F, 0x35F6, 0x6860, 0x6861, 0x1878, 0x6862, 0x6862, 0x187B,

+    0x6863, 0x6863, 0x0596, 0x6864, 0x6864, 0x187D, 0x6865, 0x6865, 0x0C42,

+    0x6866, 0x6866, 0x1881, 0x6867, 0x6867, 0x1883, 0x6868, 0x6868, 0x0881,

+    0x6869, 0x6869, 0x120B, 0x686A, 0x686A, 0x3600, 0x686B, 0x686B, 0x188E,

+    0x686C, 0x6873, 0x3601, 0x6874, 0x6874, 0x188B, 0x6875, 0x6875, 0x3609,

+    0x6876, 0x6876, 0x0E61, 0x6877, 0x6877, 0x188C, 0x6878, 0x6880, 0x360A,

+    0x6881, 0x6881, 0x0A03, 0x6882, 0x6882, 0x3613, 0x6883, 0x6883, 0x187E,

+    0x6884, 0x6884, 0x3614, 0x6885, 0x6885, 0x0ABC, 0x6886, 0x6886, 0x03FB,

+    0x6887, 0x688E, 0x3615, 0x688F, 0x688F, 0x188A, 0x6890, 0x6892, 0x361D,

+    0x6893, 0x6893, 0x188D, 0x6894, 0x6896, 0x3620, 0x6897, 0x6897, 0x06FC,

+    0x6898, 0x6898, 0x246A, 0x6899, 0x689C, 0x3623, 0x689D, 0x689D, 0x2175,

+    0x689E, 0x689E, 0x3627, 0x689F, 0x689F, 0x246D, 0x68A0, 0x68A1, 0x3628,

+    0x68A2, 0x68A2, 0x0D0B, 0x68A3, 0x68A5, 0x362A, 0x68A6, 0x68A6, 0x0AD3,

+    0x68A7, 0x68A7, 0x0EEF, 0x68A8, 0x68A8, 0x09D1, 0x68A9, 0x68AC, 0x362D,

+    0x68AD, 0x68AD, 0x0DE8, 0x68AE, 0x68AE, 0x3631, 0x68AF, 0x68AF, 0x0E30,

+    0x68B0, 0x68B0, 0x0F80, 0x68B1, 0x68B2, 0x3632, 0x68B3, 0x68B3, 0x0D78,

+    0x68B4, 0x68B4, 0x3634, 0x68B5, 0x68B5, 0x1889, 0x68B6, 0x68BF, 0x3635,

+    0x68C0, 0x68C0, 0x085F, 0x68C1, 0x68C1, 0x363F, 0x68C2, 0x68C2, 0x188F,

+    0x68C3, 0x68C8, 0x3640, 0x68C9, 0x68C9, 0x0AE3, 0x68CA, 0x68CA, 0x3646,

+    0x68CB, 0x68CB, 0x0C04, 0x68CC, 0x68CC, 0x3647, 0x68CD, 0x68CD, 0x0750,

+    0x68CE, 0x68D1, 0x3648, 0x68D2, 0x68D2, 0x03FF, 0x68D3, 0x68D4, 0x364C,

+    0x68D5, 0x68D5, 0x1235, 0x68D6, 0x68D6, 0x246B, 0x68D7, 0x68D7, 0x225F,

+    0x68D8, 0x68D8, 0x081F, 0x68D9, 0x68D9, 0x364E, 0x68DA, 0x68DA, 0x0BB0,

+    0x68DB, 0x68DE, 0x364F, 0x68DF, 0x68DF, 0x1ECE, 0x68E0, 0x68E0, 0x0E17,

+    0x68E1, 0x68E2, 0x3653, 0x68E3, 0x68E3, 0x189A, 0x68E4, 0x68E6, 0x3655,

+    0x68E7, 0x68E7, 0x2272, 0x68E8, 0x68ED, 0x3658, 0x68EE, 0x68EE, 0x0CE6,

+    0x68EF, 0x68EF, 0x365E, 0x68F0, 0x68F0, 0x1896, 0x68F1, 0x68F1, 0x09CD,

+    0x68F2, 0x68F4, 0x365F, 0x68F5, 0x68F5, 0x0950, 0x68F6, 0x68F8, 0x3662,

+    0x68F9, 0x68F9, 0x1894, 0x68FA, 0x68FA, 0x0730, 0x68FB, 0x68FB, 0x3665,

+    0x68FC, 0x68FC, 0x1891, 0x68FD, 0x68FF, 0x3666, 0x6900, 0x6900, 0x3669,

+    0x6901, 0x6901, 0x1898, 0x6902, 0x6904, 0x366A, 0x6905, 0x6905, 0x1055,

+    0x6906, 0x690A, 0x366D, 0x690B, 0x690B, 0x1897, 0x690C, 0x690C, 0x3672,

+    0x690D, 0x690D, 0x11B1, 0x690E, 0x690E, 0x1212, 0x690F, 0x690F, 0x2473,

+    0x6910, 0x6910, 0x189B, 0x6911, 0x6911, 0x3673, 0x6912, 0x6912, 0x0888,

+    0x6913, 0x691E, 0x3674, 0x691F, 0x6920, 0x1892, 0x6921, 0x6923, 0x3680,

+    0x6924, 0x6924, 0x1895, 0x6925, 0x692C, 0x3683, 0x692D, 0x692D, 0x0E87,

+    0x692E, 0x692F, 0x368B, 0x6930, 0x6930, 0x1033, 0x6931, 0x6933, 0x368D,

+    0x6934, 0x6934, 0x18A6, 0x6935, 0x6938, 0x3690, 0x6939, 0x6939, 0x189D,

+    0x693A, 0x693C, 0x3694, 0x693D, 0x693D, 0x052D, 0x693E, 0x693E, 0x3697,

+    0x693F, 0x693F, 0x053E, 0x6940, 0x6941, 0x3698, 0x6942, 0x6942, 0x189F,

+    0x6943, 0x6949, 0x369A, 0x694A, 0x694A, 0x21FE, 0x694B, 0x6952, 0x36A1,

+    0x6953, 0x6953, 0x1EFE, 0x6954, 0x6954, 0x0F73, 0x6955, 0x6956, 0x36A9,

+    0x6957, 0x6957, 0x1899, 0x6958, 0x6959, 0x36AB, 0x695A, 0x695A, 0x0523,

+    0x695B, 0x695C, 0x36AD, 0x695D, 0x695D, 0x18A0, 0x695E, 0x695E, 0x09CE,

+    0x695F, 0x695F, 0x36AF, 0x6960, 0x6960, 0x189E, 0x6961, 0x6962, 0x36B0,

+    0x6963, 0x6963, 0x18AD, 0x6964, 0x6965, 0x36B2, 0x6966, 0x6966, 0x18AC,

+    0x6967, 0x6967, 0x36B4, 0x6968, 0x6968, 0x2475, 0x6969, 0x696A, 0x36B5,

+    0x696B, 0x696B, 0x18A2, 0x696C, 0x696C, 0x36B7, 0x696D, 0x696D, 0x220A,

+    0x696E, 0x696E, 0x1890, 0x696F, 0x6970, 0x36B8, 0x6971, 0x6971, 0x189C,

+    0x6972, 0x6974, 0x36BA, 0x6975, 0x6975, 0x1F6F, 0x6976, 0x6976, 0x36BD,

+    0x6977, 0x6977, 0x0939, 0x6978, 0x6978, 0x18A5, 0x6979, 0x6979, 0x18AE,

+    0x697A, 0x697B, 0x36BE, 0x697C, 0x697C, 0x0A4C, 0x697D, 0x697F, 0x36C0,

+    0x6980, 0x6980, 0x18A3, 0x6981, 0x6981, 0x36C3, 0x6982, 0x6982, 0x06C0,

+    0x6983, 0x6983, 0x36C4, 0x6984, 0x6984, 0x18A1, 0x6985, 0x6985, 0x36C5,

+    0x6986, 0x6986, 0x10C1, 0x6987, 0x6988, 0x18A8, 0x6989, 0x6989, 0x18AB,

+    0x698A, 0x698C, 0x36C6, 0x698D, 0x698D, 0x18BB, 0x698E, 0x6993, 0x36C9,

+    0x6994, 0x6994, 0x09B1, 0x6995, 0x6995, 0x18B9, 0x6996, 0x6997, 0x36CF,

+    0x6998, 0x6998, 0x18A4, 0x6999, 0x699A, 0x36D1, 0x699B, 0x699B, 0x18AF,

+    0x699C, 0x699C, 0x03FC, 0x699D, 0x69A6, 0x36D3, 0x69A7, 0x69A7, 0x18B0,

+    0x69A8, 0x69A8, 0x1146, 0x69A9, 0x69A9, 0x36DD, 0x69AA, 0x69AA, 0x2468,

+    0x69AB, 0x69AB, 0x18B2, 0x69AC, 0x69AC, 0x36DE, 0x69AD, 0x69AD, 0x18B3,

+    0x69AE, 0x69AE, 0x2100, 0x69AF, 0x69B0, 0x36DF, 0x69B1, 0x69B1, 0x18B5,

+    0x69B2, 0x69B3, 0x36E1, 0x69B4, 0x69B4, 0x0A3A, 0x69B5, 0x69B6, 0x36E3,

+    0x69B7, 0x69B7, 0x0C91, 0x69B8, 0x69BA, 0x36E5, 0x69BB, 0x69BB, 0x18B1,

+    0x69BC, 0x69BE, 0x36E8, 0x69BF, 0x69BF, 0x2476, 0x69C0, 0x69C0, 0x36EB,

+    0x69C1, 0x69C1, 0x18B6, 0x69C2, 0x69C9, 0x36EC, 0x69CA, 0x69CA, 0x18B7,

+    0x69CB, 0x69CB, 0x1F27, 0x69CC, 0x69CC, 0x18A7, 0x69CD, 0x69CD, 0x20D7,

+    0x69CE, 0x69CE, 0x18AA, 0x69CF, 0x69CF, 0x36F4, 0x69D0, 0x69D0, 0x07C6,

+    0x69D1, 0x69D3, 0x36F5, 0x69D4, 0x69D4, 0x18B4, 0x69D5, 0x69DA, 0x36F8,

+    0x69DB, 0x69DB, 0x086A, 0x69DC, 0x69DE, 0x36FE, 0x69DF, 0x69DF, 0x18B8,

+    0x69E0, 0x69E0, 0x18BA, 0x69E1, 0x69E6, 0x3701, 0x69E7, 0x69E7, 0x247C,

+    0x69E8, 0x69EC, 0x3707, 0x69ED, 0x69ED, 0x18BE, 0x69EE, 0x69F1, 0x370C,

+    0x69F2, 0x69F2, 0x18C2, 0x69F3, 0x69F3, 0x1FA1, 0x69F4, 0x69FC, 0x3710,

+    0x69FD, 0x69FD, 0x04A2, 0x69FE, 0x69FE, 0x3719, 0x69FF, 0x69FF, 0x18BC,

+    0x6A00, 0x6A00, 0x371A, 0x6A01, 0x6A01, 0x22AA, 0x6A02, 0x6A02, 0x2005,

+    0x6A03, 0x6A04, 0x371B, 0x6A05, 0x6A05, 0x246C, 0x6A06, 0x6A09, 0x371D,

+    0x6A0A, 0x6A0A, 0x064B, 0x6A0B, 0x6A12, 0x3721, 0x6A13, 0x6A13, 0x203E,

+    0x6A14, 0x6A16, 0x3729, 0x6A17, 0x6A18, 0x18BF, 0x6A19, 0x6A19, 0x1E4C,

+    0x6A1A, 0x6A1D, 0x372C, 0x6A1E, 0x6A1E, 0x213A, 0x6A1F, 0x6A1F, 0x1162,

+    0x6A20, 0x6A20, 0x3730, 0x6A21, 0x6A21, 0x0B06, 0x6A22, 0x6A22, 0x3731,

+    0x6A23, 0x6A23, 0x2204, 0x6A24, 0x6A27, 0x3732, 0x6A28, 0x6A28, 0x18CC,

+    0x6A29, 0x6A29, 0x3736, 0x6A2A, 0x6A2A, 0x0798, 0x6A2B, 0x6A2E, 0x3737,

+    0x6A2F, 0x6A2F, 0x18BD, 0x6A30, 0x6A30, 0x373B, 0x6A31, 0x6A31, 0x1088,

+    0x6A32, 0x6A34, 0x373C, 0x6A35, 0x6A35, 0x18C8, 0x6A36, 0x6A37, 0x373F,

+    0x6A38, 0x6A38, 0x20C3, 0x6A39, 0x6A39, 0x2140, 0x6A3A, 0x6A3A, 0x2477,

+    0x6A3B, 0x6A3C, 0x3741, 0x6A3D, 0x6A3D, 0x18CB, 0x6A3E, 0x6A3E, 0x18C4,

+    0x6A3F, 0x6A43, 0x3743, 0x6A44, 0x6A44, 0x18C3, 0x6A45, 0x6A46, 0x3748,

+    0x6A47, 0x6A47, 0x0C3E, 0x6A48, 0x6A48, 0x2474, 0x6A49, 0x6A4A, 0x374A,

+    0x6A4B, 0x6A4B, 0x20DD, 0x6A4C, 0x6A4F, 0x374C, 0x6A50, 0x6A50, 0x18C6,

+    0x6A51, 0x6A57, 0x3750, 0x6A58, 0x6A58, 0x18CD, 0x6A59, 0x6A59, 0x04ED,

+    0x6A5A, 0x6A5A, 0x3757, 0x6A5B, 0x6A5B, 0x18C7, 0x6A5C, 0x6A5E, 0x3758,

+    0x6A5F, 0x6A5F, 0x1F68, 0x6A60, 0x6A60, 0x375B, 0x6A61, 0x6A61, 0x0F5D,

+    0x6A62, 0x6A62, 0x2185, 0x6A63, 0x6A64, 0x375C, 0x6A65, 0x6A65, 0x18C1,

+    0x6A66, 0x6A70, 0x375E, 0x6A71, 0x6A71, 0x051C, 0x6A72, 0x6A78, 0x3769,

+    0x6A79, 0x6A79, 0x18CA, 0x6A7A, 0x6A7B, 0x3770, 0x6A7C, 0x6A7C, 0x18CE,

+    0x6A7D, 0x6A7F, 0x3772, 0x6A80, 0x6A80, 0x0E07, 0x6A81, 0x6A83, 0x3775,

+    0x6A84, 0x6A84, 0x0F1A, 0x6A85, 0x6A88, 0x3778, 0x6A89, 0x6A89, 0x2472,

+    0x6A8A, 0x6A8D, 0x377C, 0x6A8E, 0x6A8E, 0x18C9, 0x6A8F, 0x6A8F, 0x3780,

+    0x6A90, 0x6A90, 0x18D0, 0x6A91, 0x6A91, 0x18CF, 0x6A92, 0x6A93, 0x3781,

+    0x6A94, 0x6A94, 0x1EB5, 0x6A95, 0x6A96, 0x3783, 0x6A97, 0x6A97, 0x18D2,

+    0x6A98, 0x6A9B, 0x3785, 0x6A9C, 0x6A9C, 0x2478, 0x6A9D, 0x6A9F, 0x3789,

+    0x6AA0, 0x6AA0, 0x18C5, 0x6AA1, 0x6AA1, 0x378C, 0x6AA2, 0x6AA2, 0x1F8B,

+    0x6AA3, 0x6AA3, 0x2484, 0x6AA4, 0x6AA8, 0x378D, 0x6AA9, 0x6AA9, 0x18D1,

+    0x6AAA, 0x6AAA, 0x3792, 0x6AAB, 0x6AAB, 0x18D3, 0x6AAC, 0x6AAC, 0x0ACF,

+    0x6AAD, 0x6AAE, 0x3793, 0x6AAF, 0x6AAF, 0x2699, 0x6AB0, 0x6AB2, 0x3795,

+    0x6AB3, 0x6AB3, 0x2482, 0x6AB4, 0x6AB7, 0x3798, 0x6AB8, 0x6AB8, 0x20A1,

+    0x6AB9, 0x6ABA, 0x379C, 0x6ABB, 0x6ABB, 0x1F92, 0x6ABC, 0x6AC2, 0x379E,

+    0x6AC3, 0x6AC3, 0x1F38, 0x6AC4, 0x6AD2, 0x37A5, 0x6AD3, 0x6AD3, 0x2485,

+    0x6AD4, 0x6AD9, 0x37B4, 0x6ADA, 0x6ADA, 0x2480, 0x6ADB, 0x6ADB, 0x246E,

+    0x6ADC, 0x6ADC, 0x37BA, 0x6ADD, 0x6ADD, 0x247B, 0x6ADE, 0x6ADE, 0x2486,

+    0x6ADF, 0x6ADF, 0x2471, 0x6AE0, 0x6AE6, 0x37BB, 0x6AE7, 0x6AE7, 0x2483,

+    0x6AE8, 0x6AE8, 0x2470, 0x6AE9, 0x6AE9, 0x37C2, 0x6AEA, 0x6AEA, 0x2469,

+    0x6AEB, 0x6AEB, 0x37C3, 0x6AEC, 0x6AEC, 0x247F, 0x6AED, 0x6AF2, 0x37C4,

+    0x6AF3, 0x6AF3, 0x246F, 0x6AF4, 0x6AF7, 0x37CA, 0x6AF8, 0x6AF8, 0x2481,

+    0x6AF9, 0x6AFA, 0x37CE, 0x6AFB, 0x6AFB, 0x2220, 0x6AFC, 0x6AFF, 0x37D0,

+    0x6B00, 0x6B03, 0x37D4, 0x6B04, 0x6B04, 0x1FF5, 0x6B05, 0x6B09, 0x37D8,

+    0x6B0A, 0x6B0A, 0x20F4, 0x6B0B, 0x6B0E, 0x37DD, 0x6B0F, 0x6B0F, 0x247D,

+    0x6B10, 0x6B11, 0x37E1, 0x6B12, 0x6B12, 0x2479, 0x6B13, 0x6B15, 0x37E3,

+    0x6B16, 0x6B16, 0x247E, 0x6B17, 0x6B1D, 0x37E6, 0x6B1E, 0x6B1E, 0x247A,

+    0x6B1F, 0x6B1F, 0x37ED, 0x6B20, 0x6B20, 0x0C34, 0x6B21, 0x6B21, 0x0551,

+    0x6B22, 0x6B22, 0x07CB, 0x6B23, 0x6B23, 0x0F8B, 0x6B24, 0x6B24, 0x19B1,

+    0x6B25, 0x6B26, 0x37EE, 0x6B27, 0x6B27, 0x0B78, 0x6B28, 0x6B31, 0x37F0,

+    0x6B32, 0x6B32, 0x10E0, 0x6B33, 0x6B36, 0x37FA, 0x6B37, 0x6B37, 0x19B2,

+    0x6B38, 0x6B38, 0x37FE, 0x6B39, 0x6B39, 0x19B3, 0x6B3A, 0x6B3A, 0x0BFA,

+    0x6B3B, 0x6B3C, 0x37FF, 0x6B3D, 0x6B3D, 0x20E3, 0x6B3E, 0x6B3E, 0x097B,

+    0x6B3F, 0x6B42, 0x3801, 0x6B43, 0x6B43, 0x19B4, 0x6B44, 0x6B45, 0x3805,

+    0x6B46, 0x6B46, 0x19B5, 0x6B47, 0x6B47, 0x0F75, 0x6B48, 0x6B48, 0x3807,

+    0x6B49, 0x6B49, 0x0C35, 0x6B4A, 0x6B4B, 0x3808, 0x6B4C, 0x6B4C, 0x06E3,

+    0x6B4D, 0x6B4F, 0x380A, 0x6B50, 0x6B50, 0x20AD, 0x6B51, 0x6B58, 0x380D,

+    0x6B59, 0x6B59, 0x19B6, 0x6B5A, 0x6B5E, 0x3815, 0x6B5F, 0x6B5F, 0x24CB,

+    0x6B60, 0x6B60, 0x381A, 0x6B61, 0x6B61, 0x1F53, 0x6B62, 0x6B62, 0x11B8,

+    0x6B63, 0x6B63, 0x119E, 0x6B64, 0x6B64, 0x054E, 0x6B65, 0x6B65, 0x0484,

+    0x6B66, 0x6B66, 0x0EF3, 0x6B67, 0x6B67, 0x0C06, 0x6B68, 0x6B69, 0x381B,

+    0x6B6A, 0x6B6A, 0x0E92, 0x6B6B, 0x6B71, 0x381D, 0x6B72, 0x6B72, 0x2159,

+    0x6B73, 0x6B76, 0x3824, 0x6B77, 0x6B77, 0x2013, 0x6B78, 0x6B78, 0x1F33,

+    0x6B79, 0x6B79, 0x0578, 0x6B7A, 0x6B7A, 0x3828, 0x6B7B, 0x6B7B, 0x0DB5,

+    0x6B7C, 0x6B7C, 0x0852, 0x6B7D, 0x6B80, 0x3829, 0x6B81, 0x6B82, 0x18D6,

+    0x6B83, 0x6B83, 0x1013, 0x6B84, 0x6B84, 0x18D9, 0x6B85, 0x6B85, 0x382D,

+    0x6B86, 0x6B86, 0x057C, 0x6B87, 0x6B87, 0x18D8, 0x6B88, 0x6B88, 0x382E,

+    0x6B89, 0x6B89, 0x0FDC, 0x6B8A, 0x6B8A, 0x0D79, 0x6B8B, 0x6B8B, 0x0497,

+    0x6B8C, 0x6B8C, 0x382F, 0x6B8D, 0x6B8D, 0x18DC, 0x6B8E, 0x6B91, 0x3830,

+    0x6B92, 0x6B93, 0x18DA, 0x6B94, 0x6B95, 0x3834, 0x6B96, 0x6B96, 0x11B2,

+    0x6B97, 0x6B97, 0x3836, 0x6B98, 0x6B98, 0x1E5C, 0x6B99, 0x6B99, 0x3837,

+    0x6B9A, 0x6B9B, 0x18DD, 0x6B9C, 0x6B9D, 0x3838, 0x6B9E, 0x6B9E, 0x2488,

+    0x6B9F, 0x6BA0, 0x383A, 0x6BA1, 0x6BA1, 0x18DF, 0x6BA2, 0x6BA3, 0x383C,

+    0x6BA4, 0x6BA4, 0x2487, 0x6BA5, 0x6BA9, 0x383E, 0x6BAA, 0x6BAA, 0x18E0,

+    0x6BAB, 0x6BAB, 0x248A, 0x6BAC, 0x6BAD, 0x3843, 0x6BAE, 0x6BAE, 0x2489,

+    0x6BAF, 0x6BAF, 0x248B, 0x6BB0, 0x6BB1, 0x3845, 0x6BB2, 0x6BB2, 0x1F83,

+    0x6BB3, 0x6BB3, 0x19BD, 0x6BB4, 0x6BB4, 0x0B7A, 0x6BB5, 0x6BB5, 0x060D,

+    0x6BB6, 0x6BB6, 0x3847, 0x6BB7, 0x6BB7, 0x107A, 0x6BB8, 0x6BB9, 0x3848,

+    0x6BBA, 0x6BBA, 0x210F, 0x6BBB, 0x6BBB, 0x1FDB, 0x6BBC, 0x6BBE, 0x384A,

+    0x6BBF, 0x6BBF, 0x05CF, 0x6BC0, 0x6BC0, 0x384D, 0x6BC1, 0x6BC1, 0x07EE,

+    0x6BC2, 0x6BC2, 0x19BF, 0x6BC3, 0x6BC4, 0x384E, 0x6BC5, 0x6BC5, 0x106A,

+    0x6BC6, 0x6BC6, 0x20AF, 0x6BC7, 0x6BCA, 0x3850, 0x6BCB, 0x6BCB, 0x0EF2,

+    0x6BCC, 0x6BCC, 0x3854, 0x6BCD, 0x6BCD, 0x0B1B, 0x6BCE, 0x6BCE, 0x3855,

+    0x6BCF, 0x6BCF, 0x0AC4, 0x6BD0, 0x6BD1, 0x3856, 0x6BD2, 0x6BD2, 0x05FD,

+    0x6BD3, 0x6BD3, 0x126F, 0x6BD4, 0x6BD4, 0x0431, 0x6BD5, 0x6BD5, 0x0438,

+    0x6BD6, 0x6BD6, 0x043A, 0x6BD7, 0x6BD7, 0x0BBF, 0x6BD8, 0x6BD8, 0x3858,

+    0x6BD9, 0x6BD9, 0x0439, 0x6BDA, 0x6BDA, 0x3859, 0x6BDB, 0x6BDB, 0x0AB0,

+    0x6BDC, 0x6BE0, 0x385A, 0x6BE1, 0x6BE1, 0x1152, 0x6BE2, 0x6BE9, 0x385F,

+    0x6BEA, 0x6BEA, 0x1954, 0x6BEB, 0x6BEB, 0x0778, 0x6BEC, 0x6BEE, 0x3867,

+    0x6BEF, 0x6BEF, 0x0E0D, 0x6BF0, 0x6BF2, 0x386A, 0x6BF3, 0x6BF3, 0x1955,

+    0x6BF4, 0x6BF4, 0x386D, 0x6BF5, 0x6BF5, 0x1957, 0x6BF6, 0x6BF8, 0x386E,

+    0x6BF9, 0x6BF9, 0x1958, 0x6BFA, 0x6BFC, 0x3871, 0x6BFD, 0x6BFD, 0x1956,

+    0x6BFE, 0x6BFE, 0x3874, 0x6BFF, 0x6BFF, 0x24C0, 0x6C00, 0x6C04, 0x3875,

+    0x6C05, 0x6C05, 0x1959, 0x6C06, 0x6C06, 0x195B, 0x6C07, 0x6C07, 0x195A,

+    0x6C08, 0x6C08, 0x226D, 0x6C09, 0x6C0B, 0x387A, 0x6C0C, 0x6C0C, 0x24C1,

+    0x6C0D, 0x6C0D, 0x195C, 0x6C0E, 0x6C0E, 0x387D, 0x6C0F, 0x6C0F, 0x0D66,

+    0x6C10, 0x6C10, 0x126B, 0x6C11, 0x6C11, 0x0AF6, 0x6C12, 0x6C12, 0x387E,

+    0x6C13, 0x6C13, 0x0AAA, 0x6C14, 0x6C14, 0x0C17, 0x6C15, 0x6C15, 0x195D,

+    0x6C16, 0x6C16, 0x0B2D, 0x6C17, 0x6C17, 0x387F, 0x6C18, 0x6C1A, 0x195E,

+    0x6C1B, 0x6C1B, 0x0672, 0x6C1C, 0x6C1E, 0x3880, 0x6C1F, 0x6C1F, 0x0697,

+    0x6C20, 0x6C20, 0x3883, 0x6C21, 0x6C21, 0x1961, 0x6C22, 0x6C22, 0x0C5F,

+    0x6C23, 0x6C23, 0x20CA, 0x6C24, 0x6C24, 0x1963, 0x6C25, 0x6C25, 0x3884,

+    0x6C26, 0x6C26, 0x075B, 0x6C27, 0x6C27, 0x101E, 0x6C28, 0x6C28, 0x03BC,

+    0x6C29, 0x6C29, 0x1962, 0x6C2A, 0x6C2A, 0x1964, 0x6C2B, 0x6C2B, 0x20E7,

+    0x6C2C, 0x6C2C, 0x24C2, 0x6C2D, 0x6C2D, 0x3885, 0x6C2E, 0x6C2E, 0x058B,

+    0x6C2F, 0x6C2F, 0x0A6F, 0x6C30, 0x6C30, 0x0C65, 0x6C31, 0x6C31, 0x3886,

+    0x6C32, 0x6C32, 0x1965, 0x6C33, 0x6C33, 0x3887, 0x6C34, 0x6C34, 0x0DA3,

+    0x6C35, 0x6C35, 0x169F, 0x6C36, 0x6C37, 0x3888, 0x6C38, 0x6C38, 0x10A5,

+    0x6C39, 0x6C3C, 0x388A, 0x6C3D, 0x6C3D, 0x12EF, 0x6C3E, 0x6C3F, 0x388E,

+    0x6C40, 0x6C40, 0x0E52, 0x6C41, 0x6C41, 0x11AC, 0x6C42, 0x6C42, 0x0C70,

+    0x6C43, 0x6C45, 0x3890, 0x6C46, 0x6C46, 0x12F4, 0x6C47, 0x6C47, 0x07F8,

+    0x6C48, 0x6C48, 0x3893, 0x6C49, 0x6C49, 0x0771, 0x6C4A, 0x6C4A, 0x16A2,

+    0x6C4B, 0x6C4F, 0x3894, 0x6C50, 0x6C50, 0x0F18, 0x6C51, 0x6C53, 0x3899,

+    0x6C54, 0x6C54, 0x16A0, 0x6C55, 0x6C55, 0x0D00, 0x6C56, 0x6C56, 0x389C,

+    0x6C57, 0x6C57, 0x0770, 0x6C58, 0x6C5A, 0x389D, 0x6C5B, 0x6C5B, 0x0FDD,

+    0x6C5C, 0x6C5C, 0x16A1, 0x6C5D, 0x6C5D, 0x0CC5, 0x6C5E, 0x6C5E, 0x0708,

+    0x6C5F, 0x6C5F, 0x087E, 0x6C60, 0x6C60, 0x04FD, 0x6C61, 0x6C61, 0x0EEA,

+    0x6C62, 0x6C63, 0x38A0, 0x6C64, 0x6C64, 0x0E13, 0x6C65, 0x6C67, 0x38A2,

+    0x6C68, 0x6C69, 0x16A8, 0x6C6A, 0x6C6A, 0x0EA5, 0x6C6B, 0x6C6F, 0x38A5,

+    0x6C70, 0x6C70, 0x0E00, 0x6C71, 0x6C71, 0x38AA, 0x6C72, 0x6C72, 0x0826,

+    0x6C73, 0x6C73, 0x38AB, 0x6C74, 0x6C74, 0x16AA, 0x6C75, 0x6C75, 0x38AC,

+    0x6C76, 0x6C76, 0x16AB, 0x6C77, 0x6C78, 0x38AD, 0x6C79, 0x6C79, 0x0FA5,

+    0x6C7A, 0x6C7C, 0x38AF, 0x6C7D, 0x6C7D, 0x0C1A, 0x6C7E, 0x6C7E, 0x0677,

+    0x6C7F, 0x6C80, 0x38B2, 0x6C81, 0x6C81, 0x0C5C, 0x6C82, 0x6C82, 0x1051,

+    0x6C83, 0x6C83, 0x0EE5, 0x6C84, 0x6C84, 0x38B4, 0x6C85, 0x6C85, 0x16A4,

+    0x6C86, 0x6C86, 0x16AC, 0x6C87, 0x6C87, 0x38B5, 0x6C88, 0x6C88, 0x0D2B,

+    0x6C89, 0x6C89, 0x04E6, 0x6C8A, 0x6C8B, 0x38B6, 0x6C8C, 0x6C8C, 0x16A7,

+    0x6C8D, 0x6C8E, 0x38B8, 0x6C8F, 0x6C8F, 0x0C02, 0x6C90, 0x6C90, 0x16A5,

+    0x6C91, 0x6C92, 0x38BA, 0x6C93, 0x6C93, 0x1A1F, 0x6C94, 0x6C94, 0x16A6,

+    0x6C95, 0x6C98, 0x38BC, 0x6C99, 0x6C99, 0x0CEC, 0x6C9A, 0x6C9A, 0x38C0,

+    0x6C9B, 0x6C9B, 0x0BA7, 0x6C9C, 0x6C9E, 0x38C1, 0x6C9F, 0x6C9F, 0x070E,

+    0x6CA0, 0x6CA0, 0x38C4, 0x6CA1, 0x6CA1, 0x0AC0, 0x6CA2, 0x6CA2, 0x38C5,

+    0x6CA3, 0x6CA3, 0x16A3, 0x6CA4, 0x6CA4, 0x0B7E, 0x6CA5, 0x6CA5, 0x09ED,

+    0x6CA6, 0x6CA6, 0x0A80, 0x6CA7, 0x6CA7, 0x049E, 0x6CA8, 0x6CA8, 0x38C6,

+    0x6CA9, 0x6CA9, 0x16AD, 0x6CAA, 0x6CAA, 0x07BB, 0x6CAB, 0x6CAB, 0x0B10,

+    0x6CAC, 0x6CAC, 0x38C7, 0x6CAD, 0x6CAD, 0x16B0, 0x6CAE, 0x6CAE, 0x0909,

+    0x6CAF, 0x6CB0, 0x38C8, 0x6CB1, 0x6CB1, 0x16BB, 0x6CB2, 0x6CB2, 0x16B5,

+    0x6CB3, 0x6CB3, 0x078A, 0x6CB4, 0x6CB7, 0x38CA, 0x6CB8, 0x6CB8, 0x066D,

+    0x6CB9, 0x6CB9, 0x10B2, 0x6CBA, 0x6CBA, 0x38CE, 0x6CBB, 0x6CBB, 0x11CD,

+    0x6CBC, 0x6CBC, 0x1174, 0x6CBD, 0x6CBD, 0x071A, 0x6CBE, 0x6CBE, 0x1155,

+    0x6CBF, 0x6CBF, 0x1001, 0x6CC0, 0x6CC3, 0x38CF, 0x6CC4, 0x6CC4, 0x0F84,

+    0x6CC5, 0x6CC5, 0x0C73, 0x6CC6, 0x6CC8, 0x38D3, 0x6CC9, 0x6CC9, 0x0C85,

+    0x6CCA, 0x6CCA, 0x047B, 0x6CCB, 0x6CCB, 0x38D6, 0x6CCC, 0x6CCC, 0x0ADF,

+    0x6CCD, 0x6CCF, 0x38D7, 0x6CD0, 0x6CD0, 0x16AE, 0x6CD1, 0x6CD2, 0x38DA,

+    0x6CD3, 0x6CD3, 0x16BC, 0x6CD4, 0x6CD4, 0x16AF, 0x6CD5, 0x6CD5, 0x0645,

+    0x6CD6, 0x6CD6, 0x16B7, 0x6CD7, 0x6CD7, 0x16B4, 0x6CD8, 0x6CDA, 0x38DC,

+    0x6CDB, 0x6CDB, 0x0657, 0x6CDC, 0x6CDD, 0x38DF, 0x6CDE, 0x6CDE, 0x0B63,

+    0x6CDF, 0x6CDF, 0x38E1, 0x6CE0, 0x6CE0, 0x16B6, 0x6CE1, 0x6CE1, 0x0B9E,

+    0x6CE2, 0x6CE2, 0x046F, 0x6CE3, 0x6CE3, 0x0C1B, 0x6CE4, 0x6CE4, 0x38E2,

+    0x6CE5, 0x6CE5, 0x0B43, 0x6CE6, 0x6CE7, 0x38E3, 0x6CE8, 0x6CE8, 0x11FF,

+    0x6CE9, 0x6CE9, 0x38E5, 0x6CEA, 0x6CEA, 0x09CC, 0x6CEB, 0x6CEB, 0x16B9,

+    0x6CEC, 0x6CED, 0x38E6, 0x6CEE, 0x6CEE, 0x16BA, 0x6CEF, 0x6CEF, 0x16BD,

+    0x6CF0, 0x6CF0, 0x0DFC, 0x6CF1, 0x6CF1, 0x16B3, 0x6CF2, 0x6CF2, 0x38E8,

+    0x6CF3, 0x6CF3, 0x10A3, 0x6CF4, 0x6CF4, 0x38E9, 0x6CF5, 0x6CF5, 0x042C,

+    0x6CF6, 0x6CF6, 0x1A20, 0x6CF7, 0x6CF8, 0x16B1, 0x6CF9, 0x6CF9, 0x38EA,

+    0x6CFA, 0x6CFA, 0x16B8, 0x6CFB, 0x6CFB, 0x0F85, 0x6CFC, 0x6CFC, 0x0BE2,

+    0x6CFD, 0x6CFD, 0x1136, 0x6CFE, 0x6CFE, 0x16BE, 0x6CFF, 0x6CFF, 0x38EB,

+    0x6D00, 0x6D00, 0x38EC, 0x6D01, 0x6D01, 0x08B1, 0x6D02, 0x6D03, 0x38ED,

+    0x6D04, 0x6D04, 0x16C5, 0x6D05, 0x6D06, 0x38EF, 0x6D07, 0x6D07, 0x16C4,

+    0x6D08, 0x6D0A, 0x38F1, 0x6D0B, 0x6D0B, 0x101C, 0x6D0C, 0x6D0C, 0x16C1,

+    0x6D0D, 0x6D0D, 0x38F4, 0x6D0E, 0x6D0E, 0x16C7, 0x6D0F, 0x6D11, 0x38F5,

+    0x6D12, 0x6D12, 0x0CD2, 0x6D13, 0x6D16, 0x38F8, 0x6D17, 0x6D17, 0x0F21,

+    0x6D18, 0x6D18, 0x38FC, 0x6D19, 0x6D19, 0x16C6, 0x6D1A, 0x6D1A, 0x16CC,

+    0x6D1B, 0x6D1B, 0x0A8C, 0x6D1C, 0x6D1D, 0x38FD, 0x6D1E, 0x6D1E, 0x05F3,

+    0x6D1F, 0x6D24, 0x38FF, 0x6D25, 0x6D25, 0x08C3, 0x6D26, 0x6D26, 0x3905,

+    0x6D27, 0x6D27, 0x16C0, 0x6D28, 0x6D29, 0x3906, 0x6D2A, 0x6D2A, 0x07A0,

+    0x6D2B, 0x6D2B, 0x16C8, 0x6D2C, 0x6D2D, 0x3908, 0x6D2E, 0x6D2E, 0x16CA,

+    0x6D2F, 0x6D30, 0x390A, 0x6D31, 0x6D31, 0x063C, 0x6D32, 0x6D32, 0x11DD,

+    0x6D33, 0x6D33, 0x16D0, 0x6D34, 0x6D34, 0x390C, 0x6D35, 0x6D35, 0x16CB,

+    0x6D36, 0x6D38, 0x390D, 0x6D39, 0x6D39, 0x16BF, 0x6D3A, 0x6D3A, 0x3910,

+    0x6D3B, 0x6D3B, 0x0803, 0x6D3C, 0x6D3C, 0x0E8E, 0x6D3D, 0x6D3D, 0x0C1F,

+    0x6D3E, 0x6D3E, 0x0B8A, 0x6D3F, 0x6D40, 0x3911, 0x6D41, 0x6D41, 0x0A40,

+    0x6D42, 0x6D42, 0x3913, 0x6D43, 0x6D43, 0x16C2, 0x6D44, 0x6D44, 0x3914,

+    0x6D45, 0x6D45, 0x0C30, 0x6D46, 0x6D46, 0x087D, 0x6D47, 0x6D47, 0x088E,

+    0x6D48, 0x6D48, 0x16C3, 0x6D49, 0x6D49, 0x3915, 0x6D4A, 0x6D4A, 0x1224,

+    0x6D4B, 0x6D4B, 0x04A9, 0x6D4C, 0x6D4C, 0x3916, 0x6D4D, 0x6D4D, 0x16C9,

+    0x6D4E, 0x6D4E, 0x0836, 0x6D4F, 0x6D4F, 0x16CD, 0x6D50, 0x6D50, 0x3917,

+    0x6D51, 0x6D51, 0x0800, 0x6D52, 0x6D52, 0x16CE, 0x6D53, 0x6D53, 0x0B69,

+    0x6D54, 0x6D54, 0x16CF, 0x6D55, 0x6D58, 0x3918, 0x6D59, 0x6D59, 0x1184,

+    0x6D5A, 0x6D5A, 0x0930, 0x6D5B, 0x6D5B, 0x391C, 0x6D5C, 0x6D5C, 0x16D8,

+    0x6D5D, 0x6D5D, 0x391D, 0x6D5E, 0x6D5E, 0x16D5, 0x6D5F, 0x6D5F, 0x391E,

+    0x6D60, 0x6D60, 0x16D9, 0x6D61, 0x6D62, 0x391F, 0x6D63, 0x6D63, 0x16DB,

+    0x6D64, 0x6D65, 0x3921, 0x6D66, 0x6D66, 0x0BF5, 0x6D67, 0x6D68, 0x3923,

+    0x6D69, 0x6D69, 0x077D, 0x6D6A, 0x6D6A, 0x09B6, 0x6D6B, 0x6D6D, 0x3925,

+    0x6D6E, 0x6D6E, 0x069C, 0x6D6F, 0x6D6F, 0x16D2, 0x6D70, 0x6D73, 0x3928,

+    0x6D74, 0x6D74, 0x10E4, 0x6D75, 0x6D76, 0x392C, 0x6D77, 0x6D77, 0x075A,

+    0x6D78, 0x6D78, 0x08CF, 0x6D79, 0x6D79, 0x23DC, 0x6D7A, 0x6D7B, 0x392E,

+    0x6D7C, 0x6D7C, 0x16DA, 0x6D7D, 0x6D81, 0x3930, 0x6D82, 0x6D82, 0x0E70,

+    0x6D83, 0x6D84, 0x3935, 0x6D85, 0x6D85, 0x0B5C, 0x6D86, 0x6D86, 0x3937,

+    0x6D87, 0x6D87, 0x23DB, 0x6D88, 0x6D88, 0x0F68, 0x6D89, 0x6D89, 0x0D1F,

+    0x6D8A, 0x6D8B, 0x3938, 0x6D8C, 0x6D8C, 0x10A4, 0x6D8D, 0x6D8D, 0x393A,

+    0x6D8E, 0x6D8E, 0x0F3E, 0x6D8F, 0x6D90, 0x393B, 0x6D91, 0x6D91, 0x16D1,

+    0x6D92, 0x6D92, 0x393D, 0x6D93, 0x6D94, 0x16D6, 0x6D95, 0x6D95, 0x0E3C,

+    0x6D96, 0x6D9A, 0x393E, 0x6D9B, 0x6D9B, 0x0E21, 0x6D9C, 0x6D9C, 0x3943,

+    0x6D9D, 0x6D9D, 0x09BF, 0x6D9E, 0x6D9E, 0x16D3, 0x6D9F, 0x6D9F, 0x09F9,

+    0x6DA0, 0x6DA0, 0x16D4, 0x6DA1, 0x6DA1, 0x0EDF, 0x6DA2, 0x6DA2, 0x3944,

+    0x6DA3, 0x6DA3, 0x07D6, 0x6DA4, 0x6DA4, 0x05B4, 0x6DA5, 0x6DA5, 0x3945,

+    0x6DA6, 0x6DA6, 0x0CCE, 0x6DA7, 0x6DA7, 0x0878, 0x6DA8, 0x6DA8, 0x1168,

+    0x6DA9, 0x6DA9, 0x0CE5, 0x6DAA, 0x6DAA, 0x069D, 0x6DAB, 0x6DAB, 0x16E8,

+    0x6DAC, 0x6DAD, 0x3946, 0x6DAE, 0x6DAE, 0x16EA, 0x6DAF, 0x6DAF, 0x0FED,

+    0x6DB0, 0x6DB1, 0x3948, 0x6DB2, 0x6DB2, 0x1041, 0x6DB3, 0x6DB4, 0x394A,

+    0x6DB5, 0x6DB5, 0x0764, 0x6DB6, 0x6DB7, 0x394C, 0x6DB8, 0x6DB8, 0x078B,

+    0x6DB9, 0x6DBE, 0x394E, 0x6DBF, 0x6DBF, 0x16E1, 0x6DC0, 0x6DC0, 0x05CE,

+    0x6DC1, 0x6DC3, 0x3954, 0x6DC4, 0x6DC4, 0x122A, 0x6DC5, 0x6DC5, 0x16DE,

+    0x6DC6, 0x6DC6, 0x0F6A, 0x6DC7, 0x6DC7, 0x16DD, 0x6DC8, 0x6DCA, 0x3957,

+    0x6DCB, 0x6DCB, 0x0A25, 0x6DCC, 0x6DCC, 0x0E1D, 0x6DCD, 0x6DD0, 0x395A,

+    0x6DD1, 0x6DD1, 0x0D7E, 0x6DD2, 0x6DD5, 0x395E, 0x6DD6, 0x6DD6, 0x0B3A,

+    0x6DD7, 0x6DD7, 0x3962, 0x6DD8, 0x6DD8, 0x0E27, 0x6DD9, 0x6DD9, 0x16E6,

+    0x6DDA, 0x6DDC, 0x3963, 0x6DDD, 0x6DDD, 0x16E5, 0x6DDE, 0x6DDE, 0x16DF,

+    0x6DDF, 0x6DDF, 0x3966, 0x6DE0, 0x6DE0, 0x16E2, 0x6DE1, 0x6DE1, 0x058E,

+    0x6DE2, 0x6DE3, 0x3967, 0x6DE4, 0x6DE4, 0x10BE, 0x6DE5, 0x6DE5, 0x3969,

+    0x6DE6, 0x6DE6, 0x16E4, 0x6DE7, 0x6DE9, 0x396A, 0x6DEA, 0x6DEA, 0x205E,

+    0x6DEB, 0x6DEB, 0x1080, 0x6DEC, 0x6DEC, 0x0566, 0x6DED, 0x6DED, 0x396D,

+    0x6DEE, 0x6DEE, 0x07C9, 0x6DEF, 0x6DF0, 0x396E, 0x6DF1, 0x6DF1, 0x0D27,

+    0x6DF2, 0x6DF2, 0x3970, 0x6DF3, 0x6DF3, 0x0541, 0x6DF4, 0x6DF4, 0x3971,

+    0x6DF5, 0x6DF5, 0x2244, 0x6DF6, 0x6DF6, 0x23E2, 0x6DF7, 0x6DF7, 0x0801,

+    0x6DF8, 0x6DF8, 0x3972, 0x6DF9, 0x6DF9, 0x0FF6, 0x6DFA, 0x6DFA, 0x20D4,

+    0x6DFB, 0x6DFB, 0x0E40, 0x6DFC, 0x6DFC, 0x1A21, 0x6DFD, 0x6DFF, 0x3973,

+    0x6E00, 0x6E04, 0x3976, 0x6E05, 0x6E05, 0x0C62, 0x6E06, 0x6E09, 0x397B,

+    0x6E0A, 0x6E0A, 0x10EB, 0x6E0B, 0x6E0B, 0x397F, 0x6E0C, 0x6E0C, 0x16E9,

+    0x6E0D, 0x6E0D, 0x1232, 0x6E0E, 0x6E0E, 0x16E0, 0x6E0F, 0x6E0F, 0x3980,

+    0x6E10, 0x6E10, 0x0876, 0x6E11, 0x6E11, 0x16E3, 0x6E12, 0x6E13, 0x3981,

+    0x6E14, 0x6E14, 0x10CB, 0x6E15, 0x6E15, 0x3983, 0x6E16, 0x6E16, 0x16E7,

+    0x6E17, 0x6E17, 0x0D31, 0x6E18, 0x6E19, 0x3984, 0x6E1A, 0x6E1A, 0x16DC,

+    0x6E1B, 0x6E1C, 0x3986, 0x6E1D, 0x6E1D, 0x10CA, 0x6E1E, 0x6E1F, 0x3988,

+    0x6E20, 0x6E20, 0x0C7B, 0x6E21, 0x6E21, 0x0608, 0x6E22, 0x6E22, 0x398A,

+    0x6E23, 0x6E23, 0x113F, 0x6E24, 0x6E24, 0x047A, 0x6E25, 0x6E25, 0x16F5,

+    0x6E26, 0x6E26, 0x219F, 0x6E27, 0x6E28, 0x398B, 0x6E29, 0x6E29, 0x0ED1,

+    0x6E2A, 0x6E2A, 0x398D, 0x6E2B, 0x6E2B, 0x16EB, 0x6E2C, 0x6E2C, 0x1E66,

+    0x6E2D, 0x6E2D, 0x0ECB, 0x6E2E, 0x6E2E, 0x398E, 0x6E2F, 0x6E2F, 0x06D6,

+    0x6E30, 0x6E31, 0x398F, 0x6E32, 0x6E32, 0x16F4, 0x6E33, 0x6E33, 0x3991,

+    0x6E34, 0x6E34, 0x0957, 0x6E35, 0x6E37, 0x3992, 0x6E38, 0x6E38, 0x10B3,

+    0x6E39, 0x6E39, 0x3995, 0x6E3A, 0x6E3A, 0x0AF1, 0x6E3B, 0x6E3D, 0x3996,

+    0x6E3E, 0x6E3E, 0x1F63, 0x6E3F, 0x6E42, 0x3999, 0x6E43, 0x6E43, 0x0B89,

+    0x6E44, 0x6E44, 0x16F6, 0x6E45, 0x6E4C, 0x399D, 0x6E4D, 0x6E4D, 0x0E75,

+    0x6E4E, 0x6E4E, 0x16ED, 0x6E4F, 0x6E52, 0x39A5, 0x6E53, 0x6E54, 0x16F2,

+    0x6E55, 0x6E55, 0x39A9, 0x6E56, 0x6E56, 0x07B5, 0x6E57, 0x6E57, 0x39AA,

+    0x6E58, 0x6E58, 0x0F53, 0x6E59, 0x6E5A, 0x39AB, 0x6E5B, 0x6E5B, 0x1160,

+    0x6E5C, 0x6E5D, 0x39AD, 0x6E5E, 0x6E5E, 0x23DD, 0x6E5F, 0x6E5F, 0x16F0,

+    0x6E60, 0x6E6A, 0x39AF, 0x6E6B, 0x6E6B, 0x16EE, 0x6E6C, 0x6E6D, 0x39BA,

+    0x6E6E, 0x6E6E, 0x16EC, 0x6E6F, 0x6E6F, 0x216B, 0x6E70, 0x6E7D, 0x39BC,

+    0x6E7E, 0x6E7E, 0x0E96, 0x6E7F, 0x6E7F, 0x0D41, 0x6E80, 0x6E82, 0x39CA,

+    0x6E83, 0x6E83, 0x098E, 0x6E84, 0x6E84, 0x39CD, 0x6E85, 0x6E85, 0x0877,

+    0x6E86, 0x6E86, 0x16F1, 0x6E87, 0x6E88, 0x39CE, 0x6E89, 0x6E89, 0x06C3,

+    0x6E8A, 0x6E8E, 0x39D0, 0x6E8F, 0x6E8F, 0x1705, 0x6E90, 0x6E90, 0x10F7,

+    0x6E91, 0x6E95, 0x39D5, 0x6E96, 0x6E96, 0x22B5, 0x6E97, 0x6E97, 0x39DA,

+    0x6E98, 0x6E98, 0x16F9, 0x6E99, 0x6E9B, 0x39DB, 0x6E9C, 0x6E9C, 0x0A38,

+    0x6E9D, 0x6E9D, 0x1F26, 0x6E9E, 0x6E9E, 0x39DE, 0x6E9F, 0x6E9F, 0x1707,

+    0x6EA0, 0x6EA1, 0x39DF, 0x6EA2, 0x6EA2, 0x106E, 0x6EA3, 0x6EA4, 0x39E1,

+    0x6EA5, 0x6EA5, 0x16FD, 0x6EA6, 0x6EA6, 0x39E3, 0x6EA7, 0x6EA7, 0x16FE,

+    0x6EA8, 0x6EA9, 0x39E4, 0x6EAA, 0x6EAA, 0x0F17, 0x6EAB, 0x6EAE, 0x39E6,

+    0x6EAF, 0x6EAF, 0x0DD2, 0x6EB0, 0x6EB0, 0x39EA, 0x6EB1, 0x6EB1, 0x16F8,

+    0x6EB2, 0x6EB2, 0x16EF, 0x6EB3, 0x6EB3, 0x39EB, 0x6EB4, 0x6EB4, 0x1703,

+    0x6EB5, 0x6EB5, 0x39EC, 0x6EB6, 0x6EB6, 0x0CB7, 0x6EB7, 0x6EB7, 0x1701,

+    0x6EB8, 0x6EB9, 0x39ED, 0x6EBA, 0x6EBA, 0x0B4A, 0x6EBB, 0x6EBB, 0x1700,

+    0x6EBC, 0x6EBC, 0x39EF, 0x6EBD, 0x6EBD, 0x16FF, 0x6EBE, 0x6EC0, 0x39F0,

+    0x6EC1, 0x6EC1, 0x0521, 0x6EC2, 0x6EC2, 0x1706, 0x6EC3, 0x6EC3, 0x39F3,

+    0x6EC4, 0x6EC4, 0x1E63, 0x6EC5, 0x6EC5, 0x2088, 0x6EC6, 0x6EC6, 0x39F4,

+    0x6EC7, 0x6EC7, 0x05C2, 0x6EC8, 0x6ECA, 0x39F5, 0x6ECB, 0x6ECB, 0x1229,

+    0x6ECC, 0x6ECC, 0x1EBD, 0x6ECD, 0x6ECD, 0x39F8, 0x6ECE, 0x6ECE, 0x2341,

+    0x6ECF, 0x6ECF, 0x1704, 0x6ED0, 0x6ED0, 0x39F9, 0x6ED1, 0x6ED1, 0x07C1,

+    0x6ED2, 0x6ED2, 0x39FA, 0x6ED3, 0x6ED3, 0x122F, 0x6ED4, 0x6ED4, 0x0E22,

+    0x6ED5, 0x6ED5, 0x19A8, 0x6ED6, 0x6ED6, 0x39FB, 0x6ED7, 0x6ED7, 0x1702,

+    0x6ED8, 0x6ED9, 0x39FC, 0x6EDA, 0x6EDA, 0x074F, 0x6EDB, 0x6EDD, 0x39FE,

+    0x6EDE, 0x6EDE, 0x11CC, 0x6EDF, 0x6EDF, 0x16F7, 0x6EE0, 0x6EE0, 0x16FA,

+    0x6EE1, 0x6EE1, 0x0AA1, 0x6EE2, 0x6EE2, 0x16FC, 0x6EE3, 0x6EE3, 0x3A01,

+    0x6EE4, 0x6EE4, 0x0A72, 0x6EE5, 0x6EE5, 0x09AF, 0x6EE6, 0x6EE6, 0x0A77,

+    0x6EE7, 0x6EE7, 0x3A02, 0x6EE8, 0x6EE8, 0x045E, 0x6EE9, 0x6EE9, 0x0E05,

+    0x6EEA, 0x6EEB, 0x3A03, 0x6EEC, 0x6EEC, 0x1F4B, 0x6EED, 0x6EEE, 0x3A05,

+    0x6EEF, 0x6EEF, 0x2292, 0x6EF0, 0x6EF1, 0x3A07, 0x6EF2, 0x6EF2, 0x2124,

+    0x6EF3, 0x6EF3, 0x3A09, 0x6EF4, 0x6EF4, 0x05AF, 0x6EF5, 0x6EF6, 0x3A0A,

+    0x6EF7, 0x6EF7, 0x2048, 0x6EF8, 0x6EF8, 0x23E0, 0x6EF9, 0x6EF9, 0x170D,

+    0x6EFA, 0x6EFE, 0x3A0C, 0x6EFF, 0x6EFF, 0x2077, 0x6F00, 0x6F00, 0x3A11,

+    0x6F01, 0x6F01, 0x223A, 0x6F02, 0x6F02, 0x0BCE, 0x6F03, 0x6F05, 0x3A12,

+    0x6F06, 0x6F06, 0x0C00, 0x6F07, 0x6F08, 0x3A15, 0x6F09, 0x6F09, 0x1713,

+    0x6F0A, 0x6F0E, 0x3A17, 0x6F0F, 0x6F0F, 0x0A50, 0x6F10, 0x6F12, 0x3A1C,

+    0x6F13, 0x6F13, 0x09D7, 0x6F14, 0x6F14, 0x1006, 0x6F15, 0x6F15, 0x170C,

+    0x6F16, 0x6F19, 0x3A1F, 0x6F1A, 0x6F1A, 0x20B1, 0x6F1B, 0x6F1F, 0x3A23,

+    0x6F20, 0x6F20, 0x0B11, 0x6F21, 0x6F21, 0x3A28, 0x6F22, 0x6F22, 0x1F41,

+    0x6F23, 0x6F23, 0x201C, 0x6F24, 0x6F24, 0x170B, 0x6F25, 0x6F28, 0x3A29,

+    0x6F29, 0x6F29, 0x1714, 0x6F2A, 0x6F2A, 0x1712, 0x6F2B, 0x6F2B, 0x0AA5,

+    0x6F2C, 0x6F2C, 0x22B8, 0x6F2D, 0x6F2D, 0x16FB, 0x6F2E, 0x6F2E, 0x3A2D,

+    0x6F2F, 0x6F2F, 0x170E, 0x6F30, 0x6F30, 0x3A2E, 0x6F31, 0x6F31, 0x0D95,

+    0x6F32, 0x6F32, 0x2276, 0x6F33, 0x6F33, 0x1165, 0x6F34, 0x6F35, 0x3A2F,

+    0x6F36, 0x6F36, 0x170F, 0x6F37, 0x6F37, 0x3A31, 0x6F38, 0x6F38, 0x1F9B,

+    0x6F39, 0x6F3D, 0x3A32, 0x6F3E, 0x6F3E, 0x1023, 0x6F3F, 0x6F3F, 0x1F9F,

+    0x6F40, 0x6F40, 0x3A37, 0x6F41, 0x6F41, 0x25CA, 0x6F42, 0x6F45, 0x3A38,

+    0x6F46, 0x6F47, 0x1709, 0x6F48, 0x6F4A, 0x3A3C, 0x6F4B, 0x6F4B, 0x1710,

+    0x6F4C, 0x6F4C, 0x3A3F, 0x6F4D, 0x6F4D, 0x0EBA, 0x6F4E, 0x6F50, 0x3A40,

+    0x6F51, 0x6F51, 0x20BE, 0x6F52, 0x6F53, 0x3A43, 0x6F54, 0x6F54, 0x1FB4,

+    0x6F55, 0x6F57, 0x3A45, 0x6F58, 0x6F58, 0x0B8C, 0x6F59, 0x6F59, 0x23D7,

+    0x6F5A, 0x6F5B, 0x3A48, 0x6F5C, 0x6F5C, 0x0C2E, 0x6F5D, 0x6F5D, 0x3A4A,

+    0x6F5E, 0x6F5E, 0x0A61, 0x6F5F, 0x6F61, 0x3A4B, 0x6F62, 0x6F62, 0x1708,

+    0x6F63, 0x6F63, 0x3A4E, 0x6F64, 0x6F64, 0x2105, 0x6F65, 0x6F65, 0x3A4F,

+    0x6F66, 0x6F66, 0x0A13, 0x6F67, 0x6F6C, 0x3A50, 0x6F6D, 0x6F6D, 0x0E09,

+    0x6F6E, 0x6F6E, 0x04D6, 0x6F6F, 0x6F6F, 0x23E1, 0x6F70, 0x6F70, 0x1FEC,

+    0x6F71, 0x6F71, 0x3A56, 0x6F72, 0x6F72, 0x1719, 0x6F73, 0x6F73, 0x3A57,

+    0x6F74, 0x6F74, 0x1711, 0x6F75, 0x6F76, 0x3A58, 0x6F77, 0x6F77, 0x23EA,

+    0x6F78, 0x6F78, 0x1718, 0x6F79, 0x6F79, 0x3A5A, 0x6F7A, 0x6F7A, 0x171B,

+    0x6F7B, 0x6F7B, 0x3A5B, 0x6F7C, 0x6F7C, 0x171A, 0x6F7D, 0x6F7E, 0x3A5C,

+    0x6F7F, 0x6F7F, 0x23E3, 0x6F80, 0x6F80, 0x210E, 0x6F81, 0x6F83, 0x3A5E,

+    0x6F84, 0x6F84, 0x04F3, 0x6F85, 0x6F85, 0x3A61, 0x6F86, 0x6F86, 0x1FA6,

+    0x6F87, 0x6F87, 0x2004, 0x6F88, 0x6F88, 0x04DF, 0x6F89, 0x6F89, 0x1715,

+    0x6F8A, 0x6F8B, 0x3A62, 0x6F8C, 0x6F8C, 0x1717, 0x6F8D, 0x6F8D, 0x1716,

+    0x6F8E, 0x6F8E, 0x0BAD, 0x6F8F, 0x6F96, 0x3A64, 0x6F97, 0x6F97, 0x1F9D,

+    0x6F98, 0x6F9B, 0x3A6C, 0x6F9C, 0x6F9C, 0x09A8, 0x6F9D, 0x6F9F, 0x3A70,

+    0x6FA0, 0x6FA0, 0x23E5, 0x6FA1, 0x6FA1, 0x112B, 0x6FA2, 0x6FA3, 0x3A73,

+    0x6FA4, 0x6FA4, 0x2264, 0x6FA5, 0x6FA6, 0x3A75, 0x6FA7, 0x6FA7, 0x171E,

+    0x6FA8, 0x6FA8, 0x3A77, 0x6FA9, 0x6FA9, 0x24E2, 0x6FAA, 0x6FAD, 0x3A78,

+    0x6FAE, 0x6FAE, 0x23DE, 0x6FAF, 0x6FB0, 0x3A7C, 0x6FB1, 0x6FB1, 0x1EC4,

+    0x6FB2, 0x6FB2, 0x3A7E, 0x6FB3, 0x6FB3, 0x03CF, 0x6FB4, 0x6FB5, 0x3A7F,

+    0x6FB6, 0x6FB6, 0x1720, 0x6FB7, 0x6FB8, 0x3A81, 0x6FB9, 0x6FB9, 0x171F,

+    0x6FBA, 0x6FBF, 0x3A83, 0x6FC0, 0x6FC0, 0x0817, 0x6FC1, 0x6FC1, 0x22B6,

+    0x6FC2, 0x6FC2, 0x1721, 0x6FC3, 0x6FC3, 0x20A9, 0x6FC4, 0x6FC8, 0x3A89,

+    0x6FC9, 0x6FC9, 0x171D, 0x6FCA, 0x6FD0, 0x3A8E, 0x6FD1, 0x6FD1, 0x171C,

+    0x6FD2, 0x6FD2, 0x045D, 0x6FD3, 0x6FD4, 0x3A95, 0x6FD5, 0x6FD5, 0x212B,

+    0x6FD6, 0x6FD7, 0x3A97, 0x6FD8, 0x6FD8, 0x20A5, 0x6FD9, 0x6FDA, 0x3A99,

+    0x6FDB, 0x6FDB, 0x268B, 0x6FDC, 0x6FDD, 0x3A9B, 0x6FDE, 0x6FDE, 0x1724,

+    0x6FDF, 0x6FDF, 0x1F76, 0x6FE0, 0x6FE0, 0x1725, 0x6FE1, 0x6FE1, 0x1722,

+    0x6FE2, 0x6FE3, 0x3A9D, 0x6FE4, 0x6FE4, 0x216D, 0x6FE5, 0x6FEA, 0x3A9F,

+    0x6FEB, 0x6FEB, 0x2001, 0x6FEC, 0x6FED, 0x3AA5, 0x6FEE, 0x6FEE, 0x1723,

+    0x6FEF, 0x6FEF, 0x1726, 0x6FF0, 0x6FF0, 0x2191, 0x6FF1, 0x6FF1, 0x1E50,

+    0x6FF2, 0x6FF9, 0x3AA7, 0x6FFA, 0x6FFA, 0x1F9C, 0x6FFB, 0x6FFB, 0x3AAF,

+    0x6FFC, 0x6FFC, 0x23DA, 0x6FFD, 0x6FFD, 0x3AB0, 0x6FFE, 0x6FFE, 0x2053,

+    0x6FFF, 0x6FFF, 0x3AB1, 0x7000, 0x7004, 0x3AB2, 0x7005, 0x7005, 0x23E9,

+    0x7006, 0x7006, 0x23E4, 0x7007, 0x7008, 0x3AB7, 0x7009, 0x7009, 0x21D5,

+    0x700A, 0x700A, 0x3AB9, 0x700B, 0x700B, 0x23E6, 0x700C, 0x700E, 0x3ABA,

+    0x700F, 0x700F, 0x23DF, 0x7010, 0x7010, 0x3ABD, 0x7011, 0x7011, 0x0BF8,

+    0x7012, 0x7014, 0x3ABE, 0x7015, 0x7015, 0x1E4F, 0x7016, 0x7017, 0x3AC1,

+    0x7018, 0x7018, 0x23D9, 0x7019, 0x7019, 0x3AC3, 0x701A, 0x701A, 0x1727,

+    0x701B, 0x701B, 0x1729, 0x701C, 0x701C, 0x3AC4, 0x701D, 0x701D, 0x2014,

+    0x701E, 0x701E, 0x3AC5, 0x701F, 0x701F, 0x23EC, 0x7020, 0x7020, 0x23EB,

+    0x7021, 0x7022, 0x3AC6, 0x7023, 0x7023, 0x1728, 0x7024, 0x7026, 0x3AC8,

+    0x7027, 0x7027, 0x23D8, 0x7028, 0x7028, 0x23EE, 0x7029, 0x702F, 0x3ACB,

+    0x7030, 0x7030, 0x268E, 0x7031, 0x7031, 0x3AD2, 0x7032, 0x7032, 0x23ED,

+    0x7033, 0x7034, 0x3AD3, 0x7035, 0x7035, 0x172B, 0x7036, 0x7038, 0x3AD5,

+    0x7039, 0x7039, 0x172A, 0x703A, 0x703D, 0x3AD8, 0x703E, 0x703E, 0x1FFA,

+    0x703F, 0x7042, 0x3ADC, 0x7043, 0x7043, 0x23D6, 0x7044, 0x7044, 0x23E8,

+    0x7045, 0x704B, 0x3AE0, 0x704C, 0x704C, 0x0739, 0x704D, 0x704E, 0x3AE7,

+    0x704F, 0x704F, 0x172C, 0x7050, 0x7050, 0x3AE9, 0x7051, 0x7051, 0x2106,

+    0x7052, 0x7054, 0x3AEA, 0x7055, 0x7055, 0x200B, 0x7056, 0x7057, 0x3AED,

+    0x7058, 0x7058, 0x2166, 0x7059, 0x705C, 0x3AEF, 0x705D, 0x705D, 0x23EF,

+    0x705E, 0x705E, 0x172D, 0x705F, 0x7062, 0x3AF3, 0x7063, 0x7063, 0x2189,

+    0x7064, 0x7064, 0x2058, 0x7065, 0x7066, 0x3AF7, 0x7067, 0x7067, 0x23E7,

+    0x7068, 0x706A, 0x3AF9, 0x706B, 0x706B, 0x0805, 0x706C, 0x706C, 0x19EF,

+    0x706D, 0x706D, 0x0AF5, 0x706E, 0x706E, 0x3AFC, 0x706F, 0x706F, 0x05A7,

+    0x7070, 0x7070, 0x07E7, 0x7071, 0x7074, 0x3AFD, 0x7075, 0x7075, 0x0A32,

+    0x7076, 0x7076, 0x1131, 0x7077, 0x7077, 0x3B01, 0x7078, 0x7078, 0x08F3,

+    0x7079, 0x707B, 0x3B02, 0x707C, 0x707C, 0x1223, 0x707D, 0x707D, 0x3B05,

+    0x707E, 0x707E, 0x1119, 0x707F, 0x707F, 0x049A, 0x7080, 0x7080, 0x19CC,

+    0x7081, 0x7084, 0x3B06, 0x7085, 0x7085, 0x1913, 0x7086, 0x7088, 0x3B0A,

+    0x7089, 0x7089, 0x0A56, 0x708A, 0x708A, 0x0539, 0x708B, 0x708D, 0x3B0D,

+    0x708E, 0x708E, 0x1000, 0x708F, 0x7091, 0x3B10, 0x7092, 0x7092, 0x04D9,

+    0x7093, 0x7093, 0x3B13, 0x7094, 0x7094, 0x0C8D, 0x7095, 0x7095, 0x0948,

+    0x7096, 0x7096, 0x19CE, 0x7097, 0x7098, 0x3B14, 0x7099, 0x7099, 0x11CA,

+    0x709A, 0x709B, 0x3B16, 0x709C, 0x709C, 0x19CD, 0x709D, 0x709D, 0x19CF,

+    0x709E, 0x70AA, 0x3B18, 0x70AB, 0x70AB, 0x19D3, 0x70AC, 0x70AC, 0x0915,

+    0x70AD, 0x70AD, 0x0E12, 0x70AE, 0x70AE, 0x0B9B, 0x70AF, 0x70AF, 0x08EB,

+    0x70B0, 0x70B0, 0x3B25, 0x70B1, 0x70B1, 0x19D4, 0x70B2, 0x70B2, 0x3B26,

+    0x70B3, 0x70B3, 0x0467, 0x70B4, 0x70B6, 0x3B27, 0x70B7, 0x70B7, 0x19D2,

+    0x70B8, 0x70B8, 0x1149, 0x70B9, 0x70B9, 0x05C4, 0x70BA, 0x70BA, 0x3B2A,

+    0x70BB, 0x70BB, 0x19D0, 0x70BC, 0x70BC, 0x09FF, 0x70BD, 0x70BD, 0x0508,

+    0x70BE, 0x70BF, 0x3B2B, 0x70C0, 0x70C0, 0x19D1, 0x70C1, 0x70C1, 0x0DAD,

+    0x70C2, 0x70C2, 0x09AE, 0x70C3, 0x70C3, 0x0E51, 0x70C4, 0x70C7, 0x3B2D,

+    0x70C8, 0x70C8, 0x0A1B, 0x70C9, 0x70C9, 0x3B31, 0x70CA, 0x70CA, 0x19D6,

+    0x70CB, 0x70CE, 0x3B32, 0x70CF, 0x70CF, 0x21A3, 0x70D0, 0x70D7, 0x3B36,

+    0x70D8, 0x70D8, 0x079D, 0x70D9, 0x70D9, 0x09BE, 0x70DA, 0x70DA, 0x3B3E,

+    0x70DB, 0x70DB, 0x11F1, 0x70DC, 0x70DE, 0x3B3F, 0x70DF, 0x70DF, 0x0FF5,

+    0x70E0, 0x70E3, 0x3B42, 0x70E4, 0x70E4, 0x094B, 0x70E5, 0x70E5, 0x3B46,

+    0x70E6, 0x70E6, 0x0650, 0x70E7, 0x70E7, 0x0D0E, 0x70E8, 0x70E8, 0x19D5,

+    0x70E9, 0x70E9, 0x07F7, 0x70EA, 0x70EA, 0x3B47, 0x70EB, 0x70EB, 0x0E1F,

+    0x70EC, 0x70EC, 0x08CE, 0x70ED, 0x70ED, 0x0CA3, 0x70EE, 0x70EE, 0x3B48,

+    0x70EF, 0x70EF, 0x0F16, 0x70F0, 0x70F3, 0x3B49, 0x70F4, 0x70F4, 0x217A,

+    0x70F5, 0x70F6, 0x3B4D, 0x70F7, 0x70F7, 0x0E9A, 0x70F8, 0x70F8, 0x3B4F,

+    0x70F9, 0x70F9, 0x0BAC, 0x70FA, 0x70FC, 0x3B50, 0x70FD, 0x70FD, 0x0686,

+    0x70FE, 0x70FF, 0x3B53, 0x7100, 0x7108, 0x3B55, 0x7109, 0x7109, 0x0FF2,

+    0x710A, 0x710A, 0x076F, 0x710B, 0x710F, 0x3B5E, 0x7110, 0x7110, 0x19D7,

+    0x7111, 0x7112, 0x3B63, 0x7113, 0x7113, 0x19D8, 0x7114, 0x7114, 0x3B65,

+    0x7115, 0x7115, 0x07D5, 0x7116, 0x7116, 0x19D9, 0x7117, 0x7117, 0x3B66,

+    0x7118, 0x7118, 0x19F0, 0x7119, 0x7119, 0x0423, 0x711A, 0x711A, 0x0676,

+    0x711B, 0x7120, 0x3B67, 0x7121, 0x7121, 0x21A5, 0x7122, 0x7125, 0x3B6D,

+    0x7126, 0x7126, 0x088A, 0x7127, 0x712E, 0x3B71, 0x712F, 0x712F, 0x19DA,

+    0x7130, 0x7130, 0x100F, 0x7131, 0x7131, 0x19DB, 0x7132, 0x7135, 0x3B79,

+    0x7136, 0x7136, 0x0C96, 0x7137, 0x7144, 0x3B7D, 0x7145, 0x7145, 0x19DF,

+    0x7146, 0x7148, 0x3B8B, 0x7149, 0x7149, 0x2022, 0x714A, 0x714A, 0x19E1,

+    0x714B, 0x714B, 0x3B8E, 0x714C, 0x714C, 0x07E2, 0x714D, 0x714D, 0x3B8F,

+    0x714E, 0x714E, 0x0858, 0x714F, 0x7151, 0x3B90, 0x7152, 0x7152, 0x24D6,

+    0x7153, 0x715B, 0x3B93, 0x715C, 0x715C, 0x19DD, 0x715D, 0x715D, 0x3B9C,

+    0x715E, 0x715E, 0x0CF0, 0x715F, 0x7161, 0x3B9D, 0x7162, 0x7162, 0x233A,

+    0x7163, 0x7163, 0x3BA0, 0x7164, 0x7164, 0x0ABF, 0x7165, 0x7165, 0x3BA1,

+    0x7166, 0x7166, 0x19F1, 0x7167, 0x7167, 0x1176, 0x7168, 0x7168, 0x19DE,

+    0x7169, 0x7169, 0x1EEE, 0x716A, 0x716B, 0x3BA2, 0x716C, 0x716C, 0x24D5,

+    0x716D, 0x716D, 0x3BA4, 0x716E, 0x716E, 0x11F2, 0x716F, 0x7171, 0x3BA5,

+    0x7172, 0x7172, 0x19E0, 0x7173, 0x7173, 0x19DC, 0x7174, 0x7177, 0x3BA8,

+    0x7178, 0x7178, 0x19E2, 0x7179, 0x7179, 0x3BAC, 0x717A, 0x717A, 0x19E3,

+    0x717B, 0x717C, 0x3BAD, 0x717D, 0x717D, 0x0CF8, 0x717E, 0x7183, 0x3BAF,

+    0x7184, 0x7184, 0x0F15, 0x7185, 0x7189, 0x3BB5, 0x718A, 0x718A, 0x0FA7,

+    0x718B, 0x718E, 0x3BBA, 0x718F, 0x718F, 0x0FD5, 0x7190, 0x7191, 0x3BBE,

+    0x7192, 0x7192, 0x2228, 0x7193, 0x7193, 0x3BC0, 0x7194, 0x7194, 0x0CB6,

+    0x7195, 0x7196, 0x3BC1, 0x7197, 0x7197, 0x24D7, 0x7198, 0x7198, 0x19E4,

+    0x7199, 0x7199, 0x0F04, 0x719A, 0x719E, 0x3BC3, 0x719F, 0x719F, 0x0D83,

+    0x71A0, 0x71A0, 0x19E8, 0x71A1, 0x71A7, 0x3BC8, 0x71A8, 0x71A8, 0x19E7,

+    0x71A9, 0x71AB, 0x3BCF, 0x71AC, 0x71AC, 0x03C9, 0x71AD, 0x71B0, 0x3BD2,

+    0x71B1, 0x71B1, 0x20FC, 0x71B2, 0x71B2, 0x3BD6, 0x71B3, 0x71B3, 0x19E5,

+    0x71B4, 0x71B4, 0x3BD7, 0x71B5, 0x71B5, 0x19E6, 0x71B6, 0x71B8, 0x3BD8,

+    0x71B9, 0x71B9, 0x19F2, 0x71BA, 0x71BD, 0x3BDB, 0x71BE, 0x71BE, 0x1E87,

+    0x71BF, 0x71C0, 0x3BDF, 0x71C1, 0x71C1, 0x24D8, 0x71C2, 0x71C2, 0x3BE1,

+    0x71C3, 0x71C3, 0x0C97, 0x71C4, 0x71C7, 0x3BE2, 0x71C8, 0x71C8, 0x1EBA,

+    0x71C9, 0x71CD, 0x3BE6, 0x71CE, 0x71CE, 0x0A10, 0x71CF, 0x71D1, 0x3BEB,

+    0x71D2, 0x71D2, 0x2119, 0x71D3, 0x71D3, 0x3BEE, 0x71D4, 0x71D4, 0x19EA,

+    0x71D5, 0x71D5, 0x1009, 0x71D6, 0x71D8, 0x3BEF, 0x71D9, 0x71D9, 0x216C,

+    0x71DA, 0x71DB, 0x3BF2, 0x71DC, 0x71DC, 0x24D9, 0x71DD, 0x71DE, 0x3BF4,

+    0x71DF, 0x71DF, 0x2227, 0x71E0, 0x71E0, 0x19E9, 0x71E1, 0x71E4, 0x3BF6,

+    0x71E5, 0x71E5, 0x1132, 0x71E6, 0x71E6, 0x1E5F, 0x71E7, 0x71E7, 0x19EB,

+    0x71E8, 0x71EC, 0x3BFA, 0x71ED, 0x71ED, 0x229F, 0x71EE, 0x71EE, 0x1396,

+    0x71EF, 0x71F3, 0x3BFF, 0x71F4, 0x71F4, 0x1F5D, 0x71F5, 0x71F8, 0x3C04,

+    0x71F9, 0x71F9, 0x19EC, 0x71FA, 0x71FB, 0x3C08, 0x71FC, 0x71FC, 0x1FBC,

+    0x71FD, 0x71FD, 0x3C0A, 0x71FE, 0x71FE, 0x24DA, 0x71FF, 0x71FF, 0x3C0B,

+    0x7200, 0x7205, 0x3C0C, 0x7206, 0x7206, 0x0415, 0x7207, 0x720C, 0x3C12,

+    0x720D, 0x720D, 0x2149, 0x720E, 0x720F, 0x3C18, 0x7210, 0x7210, 0x2046,

+    0x7211, 0x721A, 0x3C1A, 0x721B, 0x721B, 0x2000, 0x721C, 0x721C, 0x3C24,

+    0x721D, 0x721D, 0x19ED, 0x721E, 0x7227, 0x3C25, 0x7228, 0x7228, 0x19EE,

+    0x7229, 0x7229, 0x3C2F, 0x722A, 0x722A, 0x1203, 0x722B, 0x722B, 0x3C30,

+    0x722C, 0x722C, 0x0B81, 0x722D, 0x722F, 0x3C31, 0x7230, 0x7230, 0x196C,

+    0x7231, 0x7231, 0x03B9, 0x7232, 0x7232, 0x2190, 0x7233, 0x7234, 0x3C34,

+    0x7235, 0x7235, 0x0923, 0x7236, 0x7236, 0x06B3, 0x7237, 0x7237, 0x1036,

+    0x7238, 0x7238, 0x03E1, 0x7239, 0x7239, 0x05DA, 0x723A, 0x723A, 0x2208,

+    0x723B, 0x723B, 0x1269, 0x723C, 0x723C, 0x3C36, 0x723D, 0x723D, 0x0DA1,

+    0x723E, 0x723E, 0x1EE6, 0x723F, 0x723F, 0x169D, 0x7240, 0x7246, 0x3C37,

+    0x7247, 0x7247, 0x0BCB, 0x7248, 0x7248, 0x03F1, 0x7249, 0x724B, 0x3C3E,

+    0x724C, 0x724C, 0x0B87, 0x724D, 0x724D, 0x1969, 0x724E, 0x7251, 0x3C41,

+    0x7252, 0x7252, 0x196A, 0x7253, 0x7255, 0x3C45, 0x7256, 0x7256, 0x196B,

+    0x7257, 0x7257, 0x3C48, 0x7258, 0x7258, 0x24C3, 0x7259, 0x7259, 0x0FE9,

+    0x725A, 0x725A, 0x3C49, 0x725B, 0x725B, 0x0B64, 0x725C, 0x725C, 0x3C4A,

+    0x725D, 0x725D, 0x1944, 0x725E, 0x725E, 0x3C4B, 0x725F, 0x725F, 0x0B15,

+    0x7260, 0x7260, 0x3C4C, 0x7261, 0x7261, 0x0B18, 0x7262, 0x7262, 0x09B9,

+    0x7263, 0x7265, 0x3C4D, 0x7266, 0x7266, 0x1945, 0x7267, 0x7267, 0x0B24,

+    0x7268, 0x7268, 0x3C50, 0x7269, 0x7269, 0x0EFE, 0x726A, 0x726D, 0x3C51,

+    0x726E, 0x726E, 0x1942, 0x726F, 0x726F, 0x1946, 0x7270, 0x7271, 0x3C55,

+    0x7272, 0x7272, 0x0D35, 0x7273, 0x7274, 0x3C57, 0x7275, 0x7275, 0x0C20,

+    0x7276, 0x7278, 0x3C59, 0x7279, 0x7279, 0x0E2B, 0x727A, 0x727A, 0x0F0D,

+    0x727B, 0x727C, 0x3C5C, 0x727D, 0x727D, 0x20CC, 0x727E, 0x727F, 0x1947,

+    0x7280, 0x7280, 0x0F19, 0x7281, 0x7281, 0x09D2, 0x7282, 0x7283, 0x3C5E,

+    0x7284, 0x7284, 0x1949, 0x7285, 0x7289, 0x3C60, 0x728A, 0x728A, 0x05FE,

+    0x728B, 0x728B, 0x194A, 0x728C, 0x728C, 0x3C65, 0x728D, 0x728D, 0x194B,

+    0x728E, 0x728E, 0x3C66, 0x728F, 0x728F, 0x194C, 0x7290, 0x7291, 0x3C67,

+    0x7292, 0x7292, 0x194D, 0x7293, 0x7295, 0x3C69, 0x7296, 0x7296, 0x2340,

+    0x7297, 0x729E, 0x3C6C, 0x729F, 0x729F, 0x1943, 0x72A0, 0x72A1, 0x3C74,

+    0x72A2, 0x72A2, 0x1ED1, 0x72A3, 0x72A6, 0x3C76, 0x72A7, 0x72A7, 0x21AC,

+    0x72A8, 0x72AB, 0x3C7A, 0x72AC, 0x72AC, 0x0C89, 0x72AD, 0x72AD, 0x15EF,

+    0x72AE, 0x72AE, 0x3C7E, 0x72AF, 0x72AF, 0x0655, 0x72B0, 0x72B0, 0x15F0,

+    0x72B1, 0x72B3, 0x3C7F, 0x72B4, 0x72B4, 0x15F1, 0x72B5, 0x72B5, 0x3C82,

+    0x72B6, 0x72B6, 0x1211, 0x72B7, 0x72B8, 0x15F2, 0x72B9, 0x72B9, 0x10B1,

+    0x72BA, 0x72BF, 0x3C83, 0x72C0, 0x72C0, 0x22AF, 0x72C1, 0x72C1, 0x15F5,

+    0x72C2, 0x72C2, 0x097E, 0x72C3, 0x72C3, 0x15F4, 0x72C4, 0x72C4, 0x05B3,

+    0x72C5, 0x72C7, 0x3C89, 0x72C8, 0x72C8, 0x0420, 0x72C9, 0x72CC, 0x3C8C,

+    0x72CD, 0x72CD, 0x15F7, 0x72CE, 0x72CE, 0x15F6, 0x72CF, 0x72CF, 0x3C90,

+    0x72D0, 0x72D0, 0x07B3, 0x72D1, 0x72D1, 0x3C91, 0x72D2, 0x72D2, 0x15F8,

+    0x72D3, 0x72D6, 0x3C92, 0x72D7, 0x72D7, 0x0710, 0x72D8, 0x72D8, 0x3C96,

+    0x72D9, 0x72D9, 0x0900, 0x72DA, 0x72DD, 0x3C97, 0x72DE, 0x72DE, 0x0B5F,

+    0x72DF, 0x72DF, 0x3C9B, 0x72E0, 0x72E0, 0x0794, 0x72E1, 0x72E1, 0x0897,

+    0x72E2, 0x72E7, 0x3C9C, 0x72E8, 0x72E8, 0x15F9, 0x72E9, 0x72E9, 0x15FB,

+    0x72EA, 0x72EB, 0x3CA2, 0x72EC, 0x72EC, 0x05FF, 0x72ED, 0x72ED, 0x0F2E,

+    0x72EE, 0x72EE, 0x0D3F, 0x72EF, 0x72EF, 0x15FA, 0x72F0, 0x72F0, 0x1199,

+    0x72F1, 0x72F1, 0x10E1, 0x72F2, 0x72F2, 0x15FC, 0x72F3, 0x72F3, 0x1600,

+    0x72F4, 0x72F4, 0x15FD, 0x72F5, 0x72F6, 0x3CA4, 0x72F7, 0x72F7, 0x15FE,

+    0x72F8, 0x72F8, 0x09D5, 0x72F9, 0x72F9, 0x21B6, 0x72FA, 0x72FB, 0x1602,

+    0x72FC, 0x72FC, 0x09B2, 0x72FD, 0x72FD, 0x1E3D, 0x72FE, 0x72FF, 0x3CA6,

+    0x7300, 0x7300, 0x3CA8, 0x7301, 0x7301, 0x15FF, 0x7302, 0x7302, 0x3CA9,

+    0x7303, 0x7303, 0x1601, 0x7304, 0x7309, 0x3CAA, 0x730A, 0x730A, 0x1607,

+    0x730B, 0x730D, 0x3CB0, 0x730E, 0x730E, 0x0A1D, 0x730F, 0x7312, 0x3CB3,

+    0x7313, 0x7313, 0x1605, 0x7314, 0x7314, 0x3CB7, 0x7315, 0x7315, 0x160A,

+    0x7316, 0x7316, 0x04C5, 0x7317, 0x7317, 0x1604, 0x7318, 0x731A, 0x3CB8,

+    0x731B, 0x731B, 0x0AD2, 0x731C, 0x731C, 0x0489, 0x731D, 0x731D, 0x1609,

+    0x731E, 0x731E, 0x1608, 0x731F, 0x7320, 0x3CBB, 0x7321, 0x7321, 0x1606,

+    0x7322, 0x7322, 0x160B, 0x7323, 0x7324, 0x3CBD, 0x7325, 0x7325, 0x160D,

+    0x7326, 0x7328, 0x3CBF, 0x7329, 0x7329, 0x0F94, 0x732A, 0x732A, 0x11EC,

+    0x732B, 0x732B, 0x0AAD, 0x732C, 0x732C, 0x160E, 0x732D, 0x732D, 0x3CC2,

+    0x732E, 0x732E, 0x0F44, 0x732F, 0x7330, 0x3CC3, 0x7331, 0x7331, 0x1610,

+    0x7332, 0x7333, 0x3CC5, 0x7334, 0x7334, 0x07A6, 0x7335, 0x7335, 0x3CC7,

+    0x7336, 0x7336, 0x2235, 0x7337, 0x7337, 0x18D4, 0x7338, 0x7338, 0x160F,

+    0x7339, 0x7339, 0x160C, 0x733A, 0x733A, 0x3CC8, 0x733B, 0x733B, 0x2397,

+    0x733C, 0x733D, 0x3CC9, 0x733E, 0x733E, 0x07C0, 0x733F, 0x733F, 0x10F6,

+    0x7340, 0x7340, 0x3CCB, 0x7341, 0x7341, 0x2395, 0x7342, 0x7343, 0x3CCC,

+    0x7344, 0x7344, 0x223F, 0x7345, 0x7345, 0x212A, 0x7346, 0x734C, 0x3CCE,

+    0x734D, 0x734D, 0x1612, 0x734E, 0x734F, 0x3CD5, 0x7350, 0x7350, 0x1611,

+    0x7351, 0x7351, 0x3CD7, 0x7352, 0x7352, 0x18D5, 0x7353, 0x7356, 0x3CD8,

+    0x7357, 0x7357, 0x1613, 0x7358, 0x735F, 0x3CDC, 0x7360, 0x7360, 0x1614,

+    0x7361, 0x7367, 0x3CE4, 0x7368, 0x7368, 0x1ED2, 0x7369, 0x7369, 0x3CEB,

+    0x736A, 0x736A, 0x2396, 0x736B, 0x736B, 0x2398, 0x736C, 0x736C, 0x1615,

+    0x736D, 0x736D, 0x0DF4, 0x736E, 0x736E, 0x3CEC, 0x736F, 0x736F, 0x1616,

+    0x7370, 0x7370, 0x20A2, 0x7371, 0x7371, 0x3CED, 0x7372, 0x7372, 0x1F64,

+    0x7373, 0x7374, 0x3CEE, 0x7375, 0x7375, 0x202B, 0x7376, 0x7376, 0x3CF0,

+    0x7377, 0x7377, 0x2394, 0x7378, 0x7378, 0x2139, 0x7379, 0x7379, 0x3CF1,

+    0x737A, 0x737A, 0x215F, 0x737B, 0x737B, 0x21C1, 0x737C, 0x737C, 0x239A,

+    0x737D, 0x737D, 0x3CF2, 0x737E, 0x737E, 0x1617, 0x737F, 0x737F, 0x3CF3,

+    0x7380, 0x7380, 0x2399, 0x7381, 0x7383, 0x3CF4, 0x7384, 0x7384, 0x0FC9,

+    0x7385, 0x7386, 0x3CF7, 0x7387, 0x7387, 0x0A71, 0x7388, 0x7388, 0x3CF9,

+    0x7389, 0x7389, 0x10D6, 0x738A, 0x738A, 0x3CFA, 0x738B, 0x738B, 0x0EA6,

+    0x738C, 0x738D, 0x3CFB, 0x738E, 0x738E, 0x1818, 0x738F, 0x7390, 0x3CFD,

+    0x7391, 0x7391, 0x1819, 0x7392, 0x7395, 0x3CFF, 0x7396, 0x7396, 0x08F0,

+    0x7397, 0x739A, 0x3D03, 0x739B, 0x739B, 0x0A91, 0x739C, 0x739E, 0x3D07,

+    0x739F, 0x739F, 0x181C, 0x73A0, 0x73A1, 0x3D0A, 0x73A2, 0x73A2, 0x181B,

+    0x73A3, 0x73A8, 0x3D0C, 0x73A9, 0x73A9, 0x0E97, 0x73AA, 0x73AA, 0x3D12,

+    0x73AB, 0x73AB, 0x0ABA, 0x73AC, 0x73AD, 0x3D13, 0x73AE, 0x73AE, 0x181A,

+    0x73AF, 0x73AF, 0x07CC, 0x73B0, 0x73B0, 0x0F43, 0x73B1, 0x73B1, 0x3D15,

+    0x73B2, 0x73B2, 0x0A2A, 0x73B3, 0x73B3, 0x1821, 0x73B4, 0x73B6, 0x3D16,

+    0x73B7, 0x73B7, 0x1820, 0x73B8, 0x73B9, 0x3D19, 0x73BA, 0x73BA, 0x182C,

+    0x73BB, 0x73BB, 0x046A, 0x73BC, 0x73BF, 0x3D1B, 0x73C0, 0x73C0, 0x1822,

+    0x73C1, 0x73C1, 0x3D1F, 0x73C2, 0x73C2, 0x181E, 0x73C3, 0x73C7, 0x3D20,

+    0x73C8, 0x73C8, 0x1824, 0x73C9, 0x73C9, 0x1823, 0x73CA, 0x73CA, 0x0CF3,

+    0x73CB, 0x73CC, 0x3D25, 0x73CD, 0x73CD, 0x1185, 0x73CE, 0x73CE, 0x3D27,

+    0x73CF, 0x73CF, 0x181D, 0x73D0, 0x73D0, 0x0646, 0x73D1, 0x73D1, 0x181F,

+    0x73D2, 0x73D8, 0x3D28, 0x73D9, 0x73D9, 0x1826, 0x73DA, 0x73DD, 0x3D2F,

+    0x73DE, 0x73DE, 0x182B, 0x73DF, 0x73DF, 0x3D33, 0x73E0, 0x73E0, 0x11E8,

+    0x73E1, 0x73E4, 0x3D34, 0x73E5, 0x73E5, 0x1825, 0x73E6, 0x73E6, 0x3D38,

+    0x73E7, 0x73E7, 0x182A, 0x73E8, 0x73E8, 0x3D39, 0x73E9, 0x73E9, 0x1829,

+    0x73EA, 0x73EC, 0x3D3A, 0x73ED, 0x73ED, 0x03EB, 0x73EE, 0x73F1, 0x3D3D,

+    0x73F2, 0x73F2, 0x182D, 0x73F3, 0x73FD, 0x3D41, 0x73FE, 0x73FE, 0x21C0,

+    0x73FF, 0x73FF, 0x3D4C, 0x7400, 0x7402, 0x3D4D, 0x7403, 0x7403, 0x0C6F,

+    0x7404, 0x7404, 0x3D50, 0x7405, 0x7405, 0x09B0, 0x7406, 0x7406, 0x09D8,

+    0x7407, 0x7408, 0x3D51, 0x7409, 0x7409, 0x0A39, 0x740A, 0x740A, 0x1828,

+    0x740B, 0x740E, 0x3D53, 0x740F, 0x740F, 0x182E, 0x7410, 0x7410, 0x0DEB,

+    0x7411, 0x7419, 0x3D57, 0x741A, 0x741A, 0x1838, 0x741B, 0x741B, 0x1837,

+    0x741C, 0x7421, 0x3D60, 0x7422, 0x7422, 0x121E, 0x7423, 0x7424, 0x3D66,

+    0x7425, 0x7425, 0x1832, 0x7426, 0x7426, 0x1831, 0x7427, 0x7427, 0x3D68,

+    0x7428, 0x7428, 0x1833, 0x7429, 0x7429, 0x3D69, 0x742A, 0x742A, 0x182F,

+    0x742B, 0x742B, 0x3D6A, 0x742C, 0x742C, 0x1836, 0x742D, 0x742D, 0x3D6B,

+    0x742E, 0x742E, 0x1835, 0x742F, 0x742F, 0x3D6C, 0x7430, 0x7430, 0x1834,

+    0x7431, 0x7432, 0x3D6D, 0x7433, 0x7433, 0x0A1E, 0x7434, 0x7434, 0x0C56,

+    0x7435, 0x7435, 0x0BBE, 0x7436, 0x7436, 0x0B84, 0x7437, 0x743B, 0x3D6F,

+    0x743C, 0x743C, 0x0C6A, 0x743D, 0x743E, 0x3D74, 0x743F, 0x743F, 0x2460,

+    0x7440, 0x7440, 0x3D76, 0x7441, 0x7441, 0x1839, 0x7442, 0x744A, 0x3D77,

+    0x744B, 0x744B, 0x245C, 0x744C, 0x7454, 0x3D80, 0x7455, 0x7455, 0x183C,

+    0x7456, 0x7456, 0x3D89, 0x7457, 0x7457, 0x183B, 0x7458, 0x7458, 0x3D8A,

+    0x7459, 0x7459, 0x183D, 0x745A, 0x745A, 0x07AE, 0x745B, 0x745B, 0x1830,

+    0x745C, 0x745C, 0x183A, 0x745D, 0x745D, 0x3D8B, 0x745E, 0x745E, 0x0CCB,

+    0x745F, 0x745F, 0x0CE3, 0x7460, 0x7462, 0x3D8C, 0x7463, 0x7463, 0x215D,

+    0x7464, 0x7468, 0x3D8F, 0x7469, 0x7469, 0x2225, 0x746A, 0x746A, 0x206A,

+    0x746B, 0x746C, 0x3D94, 0x746D, 0x746D, 0x183F, 0x746E, 0x746F, 0x3D96,

+    0x7470, 0x7470, 0x073E, 0x7471, 0x7475, 0x3D98, 0x7476, 0x7476, 0x1027,

+    0x7477, 0x7477, 0x183E, 0x7478, 0x747D, 0x3D9D, 0x747E, 0x747E, 0x1840,

+    0x747F, 0x747F, 0x3DA3, 0x7480, 0x7481, 0x1843, 0x7482, 0x7482, 0x3DA4,

+    0x7483, 0x7483, 0x09F0, 0x7484, 0x7486, 0x3DA5, 0x7487, 0x7487, 0x1845,

+    0x7488, 0x7488, 0x3DA8, 0x7489, 0x7489, 0x2461, 0x748A, 0x748A, 0x3DA9,

+    0x748B, 0x748B, 0x1846, 0x748C, 0x748D, 0x3DAA, 0x748E, 0x748E, 0x1842,

+    0x748F, 0x748F, 0x3DAC, 0x7490, 0x7490, 0x184A, 0x7491, 0x749B, 0x3DAD,

+    0x749C, 0x749C, 0x1841, 0x749D, 0x749D, 0x3DB8, 0x749E, 0x749E, 0x1847,

+    0x749F, 0x74A2, 0x3DB9, 0x74A3, 0x74A3, 0x245B, 0x74A4, 0x74A5, 0x3DBD,

+    0x74A6, 0x74A6, 0x2462, 0x74A7, 0x74A7, 0x184B, 0x74A8, 0x74A9, 0x1848,

+    0x74AA, 0x74AF, 0x3DBF, 0x74B0, 0x74B0, 0x1F54, 0x74B1, 0x74B9, 0x3DC5,

+    0x74BA, 0x74BA, 0x184D, 0x74BB, 0x74BC, 0x3DCE, 0x74BD, 0x74BD, 0x245F,

+    0x74BE, 0x74C9, 0x3DD0, 0x74CA, 0x74CA, 0x20EC, 0x74CB, 0x74CE, 0x3DDC,

+    0x74CF, 0x74CF, 0x245D, 0x74D0, 0x74D1, 0x3DE0, 0x74D2, 0x74D2, 0x184C,

+    0x74D3, 0x74D3, 0x3DE2, 0x74D4, 0x74D4, 0x2463, 0x74D5, 0x74D9, 0x3DE3,

+    0x74DA, 0x74DA, 0x2464, 0x74DB, 0x74DB, 0x3DE8, 0x74DC, 0x74DC, 0x0728,

+    0x74DD, 0x74DD, 0x3DE9, 0x74DE, 0x74DE, 0x1B32, 0x74DF, 0x74DF, 0x3DEA,

+    0x74E0, 0x74E0, 0x1B33, 0x74E1, 0x74E1, 0x3DEB, 0x74E2, 0x74E2, 0x0BCF,

+    0x74E3, 0x74E3, 0x03F5, 0x74E4, 0x74E4, 0x0C9A, 0x74E5, 0x74E5, 0x3DEC,

+    0x74E6, 0x74E6, 0x0E90, 0x74E7, 0x74ED, 0x3DED, 0x74EE, 0x74EE, 0x0EDC,

+    0x74EF, 0x74EF, 0x1903, 0x74F0, 0x74F3, 0x3DF4, 0x74F4, 0x74F4, 0x1904,

+    0x74F5, 0x74F5, 0x3DF8, 0x74F6, 0x74F6, 0x0BDE, 0x74F7, 0x74F7, 0x054C,

+    0x74F8, 0x74FE, 0x3DF9, 0x74FF, 0x74FF, 0x1905, 0x7500, 0x7503, 0x3E00,

+    0x7504, 0x7504, 0x1188, 0x7505, 0x750B, 0x3E04, 0x750C, 0x750C, 0x24A5,

+    0x750D, 0x750D, 0x1485, 0x750E, 0x750E, 0x3E0B, 0x750F, 0x750F, 0x1906,

+    0x7510, 0x7510, 0x3E0C, 0x7511, 0x7511, 0x1907, 0x7512, 0x7512, 0x3E0D,

+    0x7513, 0x7513, 0x1908, 0x7514, 0x7517, 0x3E0E, 0x7518, 0x7518, 0x06C5,

+    0x7519, 0x7519, 0x14F8, 0x751A, 0x751A, 0x0D2E, 0x751B, 0x751B, 0x3E12,

+    0x751C, 0x751C, 0x0E43, 0x751D, 0x751E, 0x3E13, 0x751F, 0x751F, 0x0D33,

+    0x7520, 0x7522, 0x3E15, 0x7523, 0x7523, 0x1E70, 0x7524, 0x7524, 0x3E18,

+    0x7525, 0x7525, 0x0D34, 0x7526, 0x7527, 0x3E19, 0x7528, 0x7528, 0x10A8,

+    0x7529, 0x7529, 0x0D9B, 0x752A, 0x752A, 0x3E1B, 0x752B, 0x752B, 0x06A1,

+    0x752C, 0x752C, 0x1B34, 0x752D, 0x752D, 0x042B, 0x752E, 0x752E, 0x3E1C,

+    0x752F, 0x752F, 0x1734, 0x7530, 0x7530, 0x0E42, 0x7531, 0x7531, 0x10AE,

+    0x7532, 0x7532, 0x084A, 0x7533, 0x7533, 0x0D23, 0x7534, 0x7534, 0x3E1D,

+    0x7535, 0x7535, 0x05C8, 0x7536, 0x7536, 0x3E1E, 0x7537, 0x7537, 0x0B33,

+    0x7538, 0x7538, 0x05CA, 0x7539, 0x7539, 0x3E1F, 0x753A, 0x753A, 0x1A78,

+    0x753B, 0x753B, 0x07C2, 0x753C, 0x753D, 0x3E20, 0x753E, 0x753E, 0x1816,

+    0x753F, 0x753F, 0x3E22, 0x7540, 0x7540, 0x1A79, 0x7541, 0x7544, 0x3E23,

+    0x7545, 0x7545, 0x04CE, 0x7546, 0x7547, 0x3E27, 0x7548, 0x7548, 0x1A7C,

+    0x7549, 0x754A, 0x3E29, 0x754B, 0x754B, 0x1A7B, 0x754C, 0x754C, 0x08B8,

+    0x754D, 0x754D, 0x3E2B, 0x754E, 0x754E, 0x1A7A, 0x754F, 0x754F, 0x0EC6,

+    0x7550, 0x7553, 0x3E2C, 0x7554, 0x7554, 0x0B90, 0x7555, 0x7558, 0x3E30,

+    0x7559, 0x7559, 0x0A3D, 0x755A, 0x755A, 0x139E, 0x755B, 0x755B, 0x1A7D,

+    0x755C, 0x755C, 0x0FBE, 0x755D, 0x755D, 0x208F, 0x755E, 0x7561, 0x3E34,

+    0x7562, 0x7562, 0x1E42, 0x7563, 0x7564, 0x3E38, 0x7565, 0x7565, 0x0A7B,

+    0x7566, 0x7566, 0x0C07, 0x7567, 0x7569, 0x3E3A, 0x756A, 0x756A, 0x0649,

+    0x756B, 0x756B, 0x1F4E, 0x756C, 0x7571, 0x3E3D, 0x7572, 0x7572, 0x1A7E,

+    0x7573, 0x7573, 0x3E43, 0x7574, 0x7574, 0x0510, 0x7575, 0x7575, 0x3E44,

+    0x7576, 0x7576, 0x1EB1, 0x7577, 0x7577, 0x3E45, 0x7578, 0x7578, 0x0810,

+    0x7579, 0x7579, 0x1A7F, 0x757A, 0x757E, 0x3E46, 0x757F, 0x757F, 0x1814,

+    0x7580, 0x7582, 0x3E4B, 0x7583, 0x7583, 0x1A80, 0x7584, 0x7585, 0x3E4E,

+    0x7586, 0x7586, 0x087F, 0x7587, 0x7587, 0x1E8B, 0x7588, 0x758A, 0x3E50,

+    0x758B, 0x758B, 0x1BC6, 0x758C, 0x758E, 0x3E53, 0x758F, 0x758F, 0x0D7F,

+    0x7590, 0x7590, 0x3E56, 0x7591, 0x7591, 0x1050, 0x7592, 0x7592, 0x1B60,

+    0x7593, 0x7593, 0x3E57, 0x7594, 0x7594, 0x1B61, 0x7595, 0x7595, 0x3E58,

+    0x7596, 0x7596, 0x1B62, 0x7597, 0x7597, 0x0A0F, 0x7598, 0x7598, 0x3E59,

+    0x7599, 0x7599, 0x06E8, 0x759A, 0x759A, 0x08FD, 0x759B, 0x759C, 0x3E5A,

+    0x759D, 0x759D, 0x1B64, 0x759E, 0x759E, 0x3E5C, 0x759F, 0x759F, 0x0B72,

+    0x75A0, 0x75A0, 0x1B63, 0x75A1, 0x75A1, 0x101A, 0x75A2, 0x75A2, 0x3E5D,

+    0x75A3, 0x75A3, 0x1B66, 0x75A4, 0x75A4, 0x03D7, 0x75A5, 0x75A5, 0x08BB,

+    0x75A6, 0x75AA, 0x3E5E, 0x75AB, 0x75AB, 0x1066, 0x75AC, 0x75AC, 0x1B65,

+    0x75AD, 0x75AD, 0x3E63, 0x75AE, 0x75AE, 0x0532, 0x75AF, 0x75AF, 0x0685,

+    0x75B0, 0x75B0, 0x1B6C, 0x75B1, 0x75B1, 0x1B6B, 0x75B2, 0x75B2, 0x0BC2,

+    0x75B3, 0x75B4, 0x1B67, 0x75B5, 0x75B5, 0x0546, 0x75B6, 0x75B7, 0x3E64,

+    0x75B8, 0x75B8, 0x1B69, 0x75B9, 0x75B9, 0x118F, 0x75BA, 0x75BB, 0x3E66,

+    0x75BC, 0x75BC, 0x0E2E, 0x75BD, 0x75BD, 0x0901, 0x75BE, 0x75BE, 0x0825,

+    0x75BF, 0x75C1, 0x3E68, 0x75C2, 0x75C2, 0x1B6E, 0x75C3, 0x75C3, 0x1B6D,

+    0x75C4, 0x75C4, 0x1B6A, 0x75C5, 0x75C5, 0x0468, 0x75C6, 0x75C6, 0x3E6B,

+    0x75C7, 0x75C7, 0x11A1, 0x75C8, 0x75C8, 0x109D, 0x75C9, 0x75C9, 0x08E6,

+    0x75CA, 0x75CA, 0x0C87, 0x75CB, 0x75CC, 0x3E6C, 0x75CD, 0x75CD, 0x1B70,

+    0x75CE, 0x75D1, 0x3E6E, 0x75D2, 0x75D2, 0x1020, 0x75D3, 0x75D3, 0x3E72,

+    0x75D4, 0x75D4, 0x11CB, 0x75D5, 0x75D5, 0x0792, 0x75D6, 0x75D6, 0x1B6F,

+    0x75D7, 0x75D7, 0x3E73, 0x75D8, 0x75D8, 0x05FA, 0x75D9, 0x75D9, 0x1FC6,

+    0x75DA, 0x75DA, 0x3E74, 0x75DB, 0x75DB, 0x0E65, 0x75DC, 0x75DD, 0x3E75,

+    0x75DE, 0x75DE, 0x0BC5, 0x75DF, 0x75E1, 0x3E77, 0x75E2, 0x75E2, 0x09EA,

+    0x75E3, 0x75E3, 0x1B71, 0x75E4, 0x75E4, 0x1B74, 0x75E5, 0x75E5, 0x3E7A,

+    0x75E6, 0x75E6, 0x1B73, 0x75E7, 0x75E7, 0x1B76, 0x75E8, 0x75E8, 0x1B72,

+    0x75E9, 0x75E9, 0x3E7B, 0x75EA, 0x75EA, 0x07D3, 0x75EB, 0x75EB, 0x1B75,

+    0x75EC, 0x75EF, 0x3E7C, 0x75F0, 0x75F0, 0x0E08, 0x75F1, 0x75F1, 0x1B78,

+    0x75F2, 0x75F3, 0x3E80, 0x75F4, 0x75F4, 0x04FA, 0x75F5, 0x75F8, 0x3E82,

+    0x75F9, 0x75F9, 0x043D, 0x75FA, 0x75FB, 0x3E86, 0x75FC, 0x75FC, 0x1B79,

+    0x75FD, 0x75FE, 0x3E88, 0x75FF, 0x75FF, 0x1B7A, 0x7600, 0x7600, 0x1B7C,

+    0x7601, 0x7601, 0x0564, 0x7602, 0x7602, 0x25AE, 0x7603, 0x7603, 0x1B77,

+    0x7604, 0x7604, 0x3E8A, 0x7605, 0x7605, 0x1B7D, 0x7606, 0x7609, 0x3E8B,

+    0x760A, 0x760A, 0x1B80, 0x760B, 0x760B, 0x1F01, 0x760C, 0x760C, 0x1B7E,

+    0x760D, 0x760D, 0x2200, 0x760E, 0x760F, 0x3E8F, 0x7610, 0x7610, 0x1B7B,

+    0x7611, 0x7614, 0x3E91, 0x7615, 0x7615, 0x1B83, 0x7616, 0x7616, 0x3E95,

+    0x7617, 0x7617, 0x1B7F, 0x7618, 0x7618, 0x1B82, 0x7619, 0x7619, 0x1B84,

+    0x761A, 0x761A, 0x3E96, 0x761B, 0x761B, 0x1B85, 0x761C, 0x761D, 0x3E97,

+    0x761E, 0x761E, 0x25B2, 0x761F, 0x761F, 0x0ED0, 0x7620, 0x7620, 0x1B88,

+    0x7621, 0x7621, 0x1E97, 0x7622, 0x7622, 0x1B87, 0x7623, 0x7623, 0x3E99,

+    0x7624, 0x7624, 0x0A3F, 0x7625, 0x7625, 0x1B81, 0x7626, 0x7626, 0x0D74,

+    0x7627, 0x7627, 0x20AB, 0x7628, 0x7628, 0x3E9A, 0x7629, 0x7629, 0x0574,

+    0x762A, 0x762A, 0x045A, 0x762B, 0x762B, 0x0E04, 0x762C, 0x762C, 0x3E9B,

+    0x762D, 0x762D, 0x1B8A, 0x762E, 0x762F, 0x3E9C, 0x7630, 0x7630, 0x1B8B,

+    0x7631, 0x7632, 0x3E9E, 0x7633, 0x7633, 0x1B90, 0x7634, 0x7634, 0x116F,

+    0x7635, 0x7635, 0x1B8D, 0x7636, 0x7637, 0x3EA0, 0x7638, 0x7638, 0x0C8E,

+    0x7639, 0x763A, 0x3EA2, 0x763B, 0x763B, 0x25B3, 0x763C, 0x763C, 0x1B86,

+    0x763D, 0x763D, 0x3EA4, 0x763E, 0x763E, 0x1B8F, 0x763F, 0x763F, 0x1B8C,

+    0x7640, 0x7640, 0x1B89, 0x7641, 0x7641, 0x3EA5, 0x7642, 0x7642, 0x2028,

+    0x7643, 0x7643, 0x1B8E, 0x7644, 0x7645, 0x3EA6, 0x7646, 0x7647, 0x25AF,

+    0x7648, 0x7648, 0x3EA8, 0x7649, 0x7649, 0x25B1, 0x764A, 0x764B, 0x3EA9,

+    0x764C, 0x764C, 0x03B4, 0x764D, 0x764D, 0x1B91, 0x764E, 0x7653, 0x3EAB,

+    0x7654, 0x7654, 0x1B93, 0x7655, 0x7655, 0x3EB1, 0x7656, 0x7656, 0x1B95,

+    0x7657, 0x7657, 0x3EB2, 0x7658, 0x7658, 0x25AC, 0x7659, 0x765B, 0x3EB3,

+    0x765C, 0x765C, 0x1B94, 0x765D, 0x765D, 0x3EB6, 0x765E, 0x765E, 0x1B92,

+    0x765F, 0x765F, 0x1E4E, 0x7660, 0x7661, 0x3EB7, 0x7662, 0x7662, 0x2202,

+    0x7663, 0x7663, 0x0FCB, 0x7664, 0x7664, 0x25AB, 0x7665, 0x7665, 0x2286,

+    0x7666, 0x7666, 0x3EB9, 0x7667, 0x7667, 0x25AD, 0x7668, 0x7668, 0x3EBA,

+    0x7669, 0x7669, 0x25B6, 0x766A, 0x766A, 0x3EBB, 0x766B, 0x766B, 0x1B96,

+    0x766C, 0x766C, 0x21E3, 0x766D, 0x766E, 0x25B4, 0x766F, 0x766F, 0x1B97,

+    0x7670, 0x7670, 0x222F, 0x7671, 0x7671, 0x2165, 0x7672, 0x7672, 0x25B7,

+    0x7673, 0x7677, 0x3EBC, 0x7678, 0x7678, 0x0748, 0x7679, 0x767A, 0x3EC1,

+    0x767B, 0x767B, 0x05A8, 0x767C, 0x767C, 0x1EE9, 0x767D, 0x767D, 0x03E2,

+    0x767E, 0x767E, 0x03E4, 0x767F, 0x7681, 0x3EC3, 0x7682, 0x7682, 0x1130,

+    0x7683, 0x7683, 0x3EC6, 0x7684, 0x7684, 0x05A5, 0x7685, 0x7685, 0x3EC7,

+    0x7686, 0x7686, 0x08A5, 0x7687, 0x7687, 0x07DF, 0x7688, 0x7688, 0x1B2D,

+    0x7689, 0x768A, 0x3EC8, 0x768B, 0x768B, 0x06D9, 0x768C, 0x768D, 0x3ECA,

+    0x768E, 0x768E, 0x1B2E, 0x768F, 0x7690, 0x3ECC, 0x7691, 0x7691, 0x03B3,

+    0x7692, 0x7692, 0x3ECE, 0x7693, 0x7693, 0x1B2F, 0x7694, 0x7695, 0x3ECF,

+    0x7696, 0x7696, 0x0E9F, 0x7697, 0x7698, 0x3ED1, 0x7699, 0x7699, 0x1B30,

+    0x769A, 0x769A, 0x1E25, 0x769B, 0x76A3, 0x3ED3, 0x76A4, 0x76A4, 0x1B31,

+    0x76A5, 0x76AD, 0x3EDC, 0x76AE, 0x76AE, 0x0BC3, 0x76AF, 0x76B0, 0x3EE5,

+    0x76B1, 0x76B1, 0x11E4, 0x76B2, 0x76B2, 0x1BC8, 0x76B3, 0x76B3, 0x3EE7,

+    0x76B4, 0x76B4, 0x1BC9, 0x76B5, 0x76B7, 0x3EE8, 0x76B8, 0x76B8, 0x25C0,

+    0x76B9, 0x76B9, 0x3EEB, 0x76BA, 0x76BA, 0x229A, 0x76BB, 0x76BE, 0x3EEC,

+    0x76BF, 0x76BF, 0x0AF8, 0x76C0, 0x76C1, 0x3EF0, 0x76C2, 0x76C2, 0x10C0,

+    0x76C3, 0x76C4, 0x3EF2, 0x76C5, 0x76C5, 0x11D0, 0x76C6, 0x76C6, 0x0BA9,

+    0x76C7, 0x76C7, 0x3EF4, 0x76C8, 0x76C8, 0x1094, 0x76C9, 0x76C9, 0x3EF5,

+    0x76CA, 0x76CA, 0x106D, 0x76CB, 0x76CC, 0x3EF6, 0x76CD, 0x76CD, 0x1A8B,

+    0x76CE, 0x76CE, 0x03C6, 0x76CF, 0x76CF, 0x1156, 0x76D0, 0x76D0, 0x0FF7,

+    0x76D1, 0x76D1, 0x0853, 0x76D2, 0x76D2, 0x0787, 0x76D3, 0x76D3, 0x3EF8,

+    0x76D4, 0x76D4, 0x0985, 0x76D5, 0x76D5, 0x3EF9, 0x76D6, 0x76D6, 0x06C2,

+    0x76D7, 0x76D7, 0x05A2, 0x76D8, 0x76D8, 0x0B8D, 0x76D9, 0x76DA, 0x3EFA,

+    0x76DB, 0x76DB, 0x0D39, 0x76DC, 0x76DD, 0x3EFC, 0x76DE, 0x76DE, 0x226E,

+    0x76DF, 0x76DF, 0x0AD0, 0x76E0, 0x76E0, 0x3EFE, 0x76E1, 0x76E1, 0x1FBD,

+    0x76E2, 0x76E2, 0x3EFF, 0x76E3, 0x76E3, 0x1F84, 0x76E4, 0x76E4, 0x20B2,

+    0x76E5, 0x76E5, 0x1A8C, 0x76E6, 0x76E6, 0x3F00, 0x76E7, 0x76E7, 0x2043,

+    0x76E8, 0x76ED, 0x3F01, 0x76EE, 0x76EE, 0x0B22, 0x76EF, 0x76EF, 0x05E1,

+    0x76F0, 0x76F0, 0x3F07, 0x76F1, 0x76F1, 0x1A58, 0x76F2, 0x76F2, 0x0AA9,

+    0x76F3, 0x76F3, 0x3F08, 0x76F4, 0x76F4, 0x11B0, 0x76F5, 0x76F7, 0x3F09,

+    0x76F8, 0x76F8, 0x0F4D, 0x76F9, 0x76F9, 0x1A5B, 0x76FA, 0x76FB, 0x3F0C,

+    0x76FC, 0x76FC, 0x0B8F, 0x76FD, 0x76FD, 0x3F0E, 0x76FE, 0x76FE, 0x061B,

+    0x76FF, 0x76FF, 0x3F0F, 0x7700, 0x7700, 0x3F10, 0x7701, 0x7701, 0x0D38,

+    0x7702, 0x7703, 0x3F11, 0x7704, 0x7704, 0x1A59, 0x7705, 0x7706, 0x3F13,

+    0x7707, 0x7708, 0x1A5C, 0x7709, 0x7709, 0x0AC1, 0x770A, 0x770A, 0x3F15,

+    0x770B, 0x770B, 0x0941, 0x770C, 0x770C, 0x3F16, 0x770D, 0x770D, 0x1A5A,

+    0x770E, 0x7718, 0x3F17, 0x7719, 0x7719, 0x1A60, 0x771A, 0x771A, 0x1A5E,

+    0x771B, 0x771E, 0x3F22, 0x771F, 0x771F, 0x1187, 0x7720, 0x7720, 0x0AE4,

+    0x7721, 0x7721, 0x3F26, 0x7722, 0x7722, 0x1A5F, 0x7723, 0x7725, 0x3F27,

+    0x7726, 0x7726, 0x1A62, 0x7727, 0x7727, 0x3F2A, 0x7728, 0x7728, 0x1144,

+    0x7729, 0x7729, 0x0FCC, 0x772A, 0x772C, 0x3F2B, 0x772D, 0x772D, 0x1A61,

+    0x772E, 0x772E, 0x3F2E, 0x772F, 0x772F, 0x0AD5, 0x7730, 0x7734, 0x3F2F,

+    0x7735, 0x7735, 0x1A63, 0x7736, 0x7736, 0x0981, 0x7737, 0x7737, 0x091B,

+    0x7738, 0x7738, 0x1A64, 0x7739, 0x7739, 0x3F34, 0x773A, 0x773A, 0x0E4A,

+    0x773B, 0x773B, 0x3F35, 0x773C, 0x773C, 0x1004, 0x773D, 0x773F, 0x3F36,

+    0x7740, 0x7740, 0x1222, 0x7741, 0x7741, 0x1197, 0x7742, 0x7742, 0x3F39,

+    0x7743, 0x7743, 0x1A68, 0x7744, 0x7746, 0x3F3A, 0x7747, 0x7747, 0x1A67,

+    0x7748, 0x774E, 0x3F3D, 0x774F, 0x774F, 0x2684, 0x7750, 0x7751, 0x1A65,

+    0x7752, 0x7759, 0x3F44, 0x775A, 0x775A, 0x1A69, 0x775B, 0x775B, 0x08D5,

+    0x775C, 0x775D, 0x3F4C, 0x775E, 0x775E, 0x24EF, 0x775F, 0x7760, 0x3F4E,

+    0x7761, 0x7761, 0x0DA4, 0x7762, 0x7762, 0x1A6B, 0x7763, 0x7763, 0x05FC,

+    0x7764, 0x7764, 0x3F50, 0x7765, 0x7765, 0x1A6C, 0x7766, 0x7766, 0x0B23,

+    0x7767, 0x7767, 0x3F51, 0x7768, 0x7768, 0x1A6A, 0x7769, 0x776A, 0x3F52,

+    0x776B, 0x776B, 0x08AF, 0x776C, 0x776C, 0x048E, 0x776D, 0x7778, 0x3F54,

+    0x7779, 0x7779, 0x0602, 0x777A, 0x777C, 0x3F60, 0x777D, 0x777D, 0x1A6F,

+    0x777E, 0x777E, 0x1270, 0x777F, 0x777F, 0x1A6D, 0x7780, 0x7780, 0x1A70,

+    0x7781, 0x7783, 0x3F63, 0x7784, 0x7784, 0x0AEE, 0x7785, 0x7785, 0x0517,

+    0x7786, 0x778B, 0x3F66, 0x778C, 0x778C, 0x1A71, 0x778D, 0x778D, 0x1A6E,

+    0x778E, 0x778E, 0x0F26, 0x778F, 0x7790, 0x3F6C, 0x7791, 0x7791, 0x1A72,

+    0x7792, 0x7792, 0x0A9E, 0x7793, 0x7797, 0x3F6E, 0x7798, 0x7798, 0x24EE,

+    0x7799, 0x779D, 0x3F73, 0x779E, 0x779E, 0x2074, 0x779F, 0x77A0, 0x1A73,

+    0x77A1, 0x77A1, 0x3F78, 0x77A2, 0x77A2, 0x1495, 0x77A3, 0x77A4, 0x3F79,

+    0x77A5, 0x77A5, 0x0BD2, 0x77A6, 0x77A6, 0x3F7B, 0x77A7, 0x77A7, 0x0C43,

+    0x77A8, 0x77A8, 0x3F7C, 0x77A9, 0x77A9, 0x11F4, 0x77AA, 0x77AA, 0x05AA,

+    0x77AB, 0x77AB, 0x3F7D, 0x77AC, 0x77AC, 0x0DA7, 0x77AD, 0x77AD, 0x2687,

+    0x77AE, 0x77AF, 0x3F7E, 0x77B0, 0x77B0, 0x1A75, 0x77B1, 0x77B2, 0x3F80,

+    0x77B3, 0x77B3, 0x0E5C, 0x77B4, 0x77B4, 0x3F82, 0x77B5, 0x77B5, 0x1A76,

+    0x77B6, 0x77BA, 0x3F83, 0x77BB, 0x77BB, 0x1151, 0x77BC, 0x77BC, 0x24F0,

+    0x77BD, 0x77BD, 0x1A77, 0x77BE, 0x77BE, 0x3F88, 0x77BF, 0x77BF, 0x1D7E,

+    0x77C0, 0x77C6, 0x3F89, 0x77C7, 0x77C7, 0x268D, 0x77C8, 0x77CC, 0x3F90,

+    0x77CD, 0x77CD, 0x1397, 0x77CE, 0x77D6, 0x3F95, 0x77D7, 0x77D7, 0x0526,

+    0x77D8, 0x77D9, 0x3F9E, 0x77DA, 0x77DA, 0x22A0, 0x77DB, 0x77DB, 0x0AB1,

+    0x77DC, 0x77DC, 0x1BCA, 0x77DD, 0x77E1, 0x3FA0, 0x77E2, 0x77E2, 0x0D4F,

+    0x77E3, 0x77E3, 0x105A, 0x77E4, 0x77E4, 0x3FA5, 0x77E5, 0x77E5, 0x11A9,

+    0x77E6, 0x77E6, 0x3FA6, 0x77E7, 0x77E7, 0x1B1A, 0x77E8, 0x77E8, 0x3FA7,

+    0x77E9, 0x77E9, 0x0907, 0x77EA, 0x77EA, 0x3FA8, 0x77EB, 0x77EB, 0x0894,

+    0x77EC, 0x77EC, 0x1B1B, 0x77ED, 0x77ED, 0x060B, 0x77EE, 0x77EE, 0x03B6,

+    0x77EF, 0x77EF, 0x1FAB, 0x77F0, 0x77F2, 0x3FA9, 0x77F3, 0x77F3, 0x0D46,

+    0x77F4, 0x77F5, 0x3FAC, 0x77F6, 0x77F6, 0x1A22, 0x77F7, 0x77F7, 0x3FAE,

+    0x77F8, 0x77F8, 0x1A23, 0x77F9, 0x77FC, 0x3FAF, 0x77FD, 0x77FD, 0x0F08,

+    0x77FE, 0x77FE, 0x064C, 0x77FF, 0x77FF, 0x0980, 0x7800, 0x7800, 0x1A24,

+    0x7801, 0x7801, 0x0A92, 0x7802, 0x7802, 0x0CE9, 0x7803, 0x7808, 0x3FB3,

+    0x7809, 0x7809, 0x1A25, 0x780A, 0x780B, 0x3FB9, 0x780C, 0x780C, 0x0C15,

+    0x780D, 0x780D, 0x0940, 0x780E, 0x7810, 0x3FBB, 0x7811, 0x7811, 0x1A28,

+    0x7812, 0x7812, 0x0BB9, 0x7813, 0x7813, 0x3FBE, 0x7814, 0x7814, 0x0FF9,

+    0x7815, 0x7815, 0x3FBF, 0x7816, 0x7816, 0x1206, 0x7817, 0x7818, 0x1A26,

+    0x7819, 0x7819, 0x3FC0, 0x781A, 0x781A, 0x100B, 0x781B, 0x781B, 0x3FC1,

+    0x781C, 0x781D, 0x1A2B, 0x781E, 0x781E, 0x3FC2, 0x781F, 0x781F, 0x1A30,

+    0x7820, 0x7822, 0x3FC3, 0x7823, 0x7823, 0x1A34, 0x7824, 0x7824, 0x3FC6,

+    0x7825, 0x7825, 0x1A32, 0x7826, 0x7826, 0x1A3A, 0x7827, 0x7827, 0x1189,

+    0x7828, 0x7828, 0x3FC7, 0x7829, 0x7829, 0x1A35, 0x782A, 0x782B, 0x3FC8,

+    0x782C, 0x782C, 0x1A33, 0x782D, 0x782D, 0x1A2A, 0x782E, 0x782F, 0x3FCA,

+    0x7830, 0x7830, 0x0BAA, 0x7831, 0x7833, 0x3FCC, 0x7834, 0x7834, 0x0BE5,

+    0x7835, 0x7836, 0x3FCF, 0x7837, 0x7837, 0x0D22, 0x7838, 0x7838, 0x1115,

+    0x7839, 0x783B, 0x1A2D, 0x783C, 0x783C, 0x1A31, 0x783D, 0x783D, 0x3FD1,

+    0x783E, 0x783E, 0x09E4, 0x783F, 0x783F, 0x3FD2, 0x7840, 0x7840, 0x0524,

+    0x7841, 0x7842, 0x3FD3, 0x7843, 0x7843, 0x26A8, 0x7844, 0x7844, 0x3FD5,

+    0x7845, 0x7845, 0x0741, 0x7846, 0x7846, 0x3FD6, 0x7847, 0x7847, 0x1A3C,

+    0x7848, 0x784B, 0x3FD7, 0x784C, 0x784C, 0x1A3D, 0x784D, 0x784D, 0x3FDB,

+    0x784E, 0x784E, 0x1A36, 0x784F, 0x784F, 0x3FDC, 0x7850, 0x7850, 0x1A3B,

+    0x7851, 0x7851, 0x3FDD, 0x7852, 0x7852, 0x0F07, 0x7853, 0x7854, 0x3FDE,

+    0x7855, 0x7855, 0x0DAB, 0x7856, 0x7857, 0x1A38, 0x7858, 0x785C, 0x3FE0,

+    0x785D, 0x785D, 0x0F62, 0x785E, 0x7863, 0x3FE5, 0x7864, 0x7864, 0x24E9,

+    0x7865, 0x7867, 0x3FEB, 0x7868, 0x7868, 0x24E5, 0x7869, 0x7869, 0x3FEE,

+    0x786A, 0x786A, 0x1A3E, 0x786B, 0x786B, 0x0A3B, 0x786C, 0x786C, 0x1097,

+    0x786D, 0x786D, 0x1A37, 0x786E, 0x786E, 0x0C92, 0x786F, 0x786F, 0x21FA,

+    0x7870, 0x7876, 0x3FEF, 0x7877, 0x7877, 0x0862, 0x7878, 0x787B, 0x3FF6,

+    0x787C, 0x787C, 0x0BB1, 0x787D, 0x7886, 0x3FFA, 0x7887, 0x7887, 0x1A42,

+    0x7888, 0x7888, 0x4004, 0x7889, 0x7889, 0x05D0, 0x788A, 0x788B, 0x4005,

+    0x788C, 0x788C, 0x0A5C, 0x788D, 0x788D, 0x03B8, 0x788E, 0x788E, 0x0DDE,

+    0x788F, 0x7890, 0x4007, 0x7891, 0x7891, 0x0417, 0x7892, 0x7892, 0x4009,

+    0x7893, 0x7893, 0x1A40, 0x7894, 0x7896, 0x400A, 0x7897, 0x7897, 0x0E9C,

+    0x7898, 0x7898, 0x05C3, 0x7899, 0x7899, 0x400D, 0x789A, 0x789A, 0x1A41,

+    0x789B, 0x789B, 0x1A3F, 0x789C, 0x789C, 0x1A43, 0x789D, 0x789E, 0x400E,

+    0x789F, 0x789F, 0x05DB, 0x78A0, 0x78A0, 0x4010, 0x78A1, 0x78A1, 0x1A44,

+    0x78A2, 0x78A2, 0x4011, 0x78A3, 0x78A3, 0x1A45, 0x78A4, 0x78A4, 0x4012,

+    0x78A5, 0x78A5, 0x1A48, 0x78A6, 0x78A6, 0x4013, 0x78A7, 0x78A7, 0x0435,

+    0x78A8, 0x78A8, 0x4014, 0x78A9, 0x78A9, 0x2148, 0x78AA, 0x78AC, 0x4015,

+    0x78AD, 0x78AD, 0x24E4, 0x78AE, 0x78AF, 0x4018, 0x78B0, 0x78B0, 0x0BB7,

+    0x78B1, 0x78B1, 0x0861, 0x78B2, 0x78B2, 0x1A46, 0x78B3, 0x78B3, 0x0E0F,

+    0x78B4, 0x78B4, 0x04B1, 0x78B5, 0x78B7, 0x401A, 0x78B8, 0x78B8, 0x24E6,

+    0x78B9, 0x78B9, 0x1A47, 0x78BA, 0x78BA, 0x20F7, 0x78BB, 0x78BB, 0x401D,

+    0x78BC, 0x78BC, 0x206B, 0x78BD, 0x78BD, 0x401E, 0x78BE, 0x78BE, 0x0B4E,

+    0x78BF, 0x78C0, 0x401F, 0x78C1, 0x78C1, 0x0548, 0x78C2, 0x78C4, 0x4021,

+    0x78C5, 0x78C5, 0x0400, 0x78C6, 0x78C8, 0x4024, 0x78C9, 0x78C9, 0x1A4B,

+    0x78CA, 0x78CA, 0x09C5, 0x78CB, 0x78CB, 0x056B, 0x78CC, 0x78CF, 0x4027,

+    0x78D0, 0x78D0, 0x0B8E, 0x78D1, 0x78D3, 0x402B, 0x78D4, 0x78D4, 0x1A49,

+    0x78D5, 0x78D5, 0x0951, 0x78D6, 0x78D8, 0x402E, 0x78D9, 0x78D9, 0x1A4A,

+    0x78DA, 0x78DA, 0x22A7, 0x78DB, 0x78E2, 0x4031, 0x78E3, 0x78E3, 0x24EC,

+    0x78E4, 0x78E6, 0x4039, 0x78E7, 0x78E7, 0x24EB, 0x78E8, 0x78E8, 0x0B08,

+    0x78E9, 0x78EB, 0x403C, 0x78EC, 0x78EC, 0x1A4C, 0x78ED, 0x78EE, 0x403F,

+    0x78EF, 0x78EF, 0x24E3, 0x78F0, 0x78F1, 0x4041, 0x78F2, 0x78F2, 0x1A4D,

+    0x78F3, 0x78F3, 0x4043, 0x78F4, 0x78F4, 0x1A4F, 0x78F5, 0x78F6, 0x4044,

+    0x78F7, 0x78F7, 0x0A20, 0x78F8, 0x78F9, 0x4046, 0x78FA, 0x78FA, 0x07DC,

+    0x78FB, 0x78FC, 0x4048, 0x78FD, 0x78FD, 0x24EA, 0x78FE, 0x78FF, 0x404A,

+    0x7900, 0x7900, 0x404C, 0x7901, 0x7901, 0x0889, 0x7902, 0x7904, 0x404D,

+    0x7905, 0x7905, 0x1A4E, 0x7906, 0x790D, 0x4050, 0x790E, 0x790E, 0x1E92,

+    0x790F, 0x7912, 0x4058, 0x7913, 0x7913, 0x1A50, 0x7914, 0x7918, 0x405C,

+    0x7919, 0x7919, 0x1E27, 0x791A, 0x791D, 0x4061, 0x791E, 0x791E, 0x1A52,

+    0x791F, 0x7923, 0x4065, 0x7924, 0x7924, 0x1A51, 0x7925, 0x7925, 0x406A,

+    0x7926, 0x7926, 0x1FE6, 0x7927, 0x7929, 0x406B, 0x792A, 0x792A, 0x24E7,

+    0x792B, 0x792B, 0x2012, 0x792C, 0x792C, 0x1EEC, 0x792D, 0x7930, 0x406E,

+    0x7931, 0x7931, 0x24E8, 0x7932, 0x7933, 0x4072, 0x7934, 0x7934, 0x1A53,

+    0x7935, 0x7939, 0x4074, 0x793A, 0x793A, 0x0D55, 0x793B, 0x793B, 0x19F8,

+    0x793C, 0x793C, 0x09DC, 0x793D, 0x793D, 0x4079, 0x793E, 0x793E, 0x0D20,

+    0x793F, 0x793F, 0x407A, 0x7940, 0x7940, 0x19F9, 0x7941, 0x7941, 0x0C0D,

+    0x7942, 0x7945, 0x407B, 0x7946, 0x7946, 0x19FA, 0x7947, 0x7947, 0x407F,

+    0x7948, 0x7948, 0x0C0C, 0x7949, 0x7949, 0x19FB, 0x794A, 0x7952, 0x4080,

+    0x7953, 0x7953, 0x19FE, 0x7954, 0x7955, 0x4089, 0x7956, 0x7956, 0x1243,

+    0x7957, 0x7957, 0x1A01, 0x7958, 0x7959, 0x408B, 0x795A, 0x795A, 0x19FF,

+    0x795B, 0x795C, 0x19FC, 0x795D, 0x795D, 0x1200, 0x795E, 0x795E, 0x0D2A,

+    0x795F, 0x795F, 0x0DE3, 0x7960, 0x7960, 0x1A02, 0x7961, 0x7961, 0x408D,

+    0x7962, 0x7962, 0x1A00, 0x7963, 0x7964, 0x408E, 0x7965, 0x7965, 0x0F56,

+    0x7966, 0x7966, 0x4090, 0x7967, 0x7967, 0x1A04, 0x7968, 0x7968, 0x0BD0,

+    0x7969, 0x796C, 0x4091, 0x796D, 0x796D, 0x0833, 0x796E, 0x796E, 0x4095,

+    0x796F, 0x796F, 0x1A03, 0x7970, 0x7976, 0x4096, 0x7977, 0x7977, 0x059C,

+    0x7978, 0x7978, 0x080B, 0x7979, 0x7979, 0x409D, 0x797A, 0x797A, 0x1A05,

+    0x797B, 0x797F, 0x409E, 0x7980, 0x7980, 0x130B, 0x7981, 0x7981, 0x08CC,

+    0x7982, 0x7983, 0x40A3, 0x7984, 0x7984, 0x0A62, 0x7985, 0x7985, 0x1A06,

+    0x7986, 0x7989, 0x40A5, 0x798A, 0x798A, 0x1A07, 0x798B, 0x798C, 0x40A9,

+    0x798D, 0x798D, 0x1F66, 0x798E, 0x798E, 0x24DC, 0x798F, 0x798F, 0x069E,

+    0x7990, 0x7999, 0x40AB, 0x799A, 0x799A, 0x1A08, 0x799B, 0x79A5, 0x40B5,

+    0x79A6, 0x79A6, 0x26A2, 0x79A7, 0x79A7, 0x1A09, 0x79A8, 0x79A9, 0x40C0,

+    0x79AA, 0x79AA, 0x24DD, 0x79AB, 0x79AD, 0x40C2, 0x79AE, 0x79AE, 0x200E,

+    0x79AF, 0x79AF, 0x40C5, 0x79B0, 0x79B0, 0x24DB, 0x79B1, 0x79B1, 0x1EB8,

+    0x79B2, 0x79B2, 0x40C6, 0x79B3, 0x79B3, 0x1A0A, 0x79B4, 0x79B8, 0x40C7,

+    0x79B9, 0x79B9, 0x10D2, 0x79BA, 0x79BA, 0x1264, 0x79BB, 0x79BB, 0x09D6,

+    0x79BC, 0x79BC, 0x40CC, 0x79BD, 0x79BD, 0x0C5A, 0x79BE, 0x79BE, 0x0783,

+    0x79BF, 0x79BF, 0x40CD, 0x79C0, 0x79C0, 0x0FAE, 0x79C1, 0x79C1, 0x0DB2,

+    0x79C2, 0x79C2, 0x40CE, 0x79C3, 0x79C3, 0x0E6B, 0x79C4, 0x79C5, 0x40CF,

+    0x79C6, 0x79C6, 0x06CC, 0x79C7, 0x79C8, 0x40D1, 0x79C9, 0x79C9, 0x0465,

+    0x79CA, 0x79CA, 0x40D3, 0x79CB, 0x79CB, 0x0C6C, 0x79CC, 0x79CC, 0x40D4,

+    0x79CD, 0x79CD, 0x11D5, 0x79CE, 0x79D0, 0x40D5, 0x79D1, 0x79D1, 0x0953,

+    0x79D2, 0x79D2, 0x0AF0, 0x79D3, 0x79D4, 0x40D8, 0x79D5, 0x79D5, 0x1B1D,

+    0x79D6, 0x79D7, 0x40DA, 0x79D8, 0x79D8, 0x0ADD, 0x79D9, 0x79DE, 0x40DC,

+    0x79DF, 0x79DF, 0x123F, 0x79E0, 0x79E2, 0x40E2, 0x79E3, 0x79E3, 0x1B1F,

+    0x79E4, 0x79E4, 0x04F8, 0x79E5, 0x79E5, 0x40E5, 0x79E6, 0x79E6, 0x0C55,

+    0x79E7, 0x79E7, 0x1016, 0x79E8, 0x79E8, 0x40E6, 0x79E9, 0x79E9, 0x11C7,

+    0x79EA, 0x79EA, 0x40E7, 0x79EB, 0x79EB, 0x1B20, 0x79EC, 0x79EC, 0x40E8,

+    0x79ED, 0x79ED, 0x1B1E, 0x79EE, 0x79EE, 0x40E9, 0x79EF, 0x79EF, 0x0812,

+    0x79F0, 0x79F0, 0x04EB, 0x79F1, 0x79F7, 0x40EA, 0x79F8, 0x79F8, 0x08A6,

+    0x79F9, 0x79FA, 0x40F1, 0x79FB, 0x79FB, 0x104D, 0x79FC, 0x79FC, 0x40F3,

+    0x79FD, 0x79FD, 0x07F5, 0x79FE, 0x79FF, 0x40F4, 0x7A00, 0x7A00, 0x0F0E,

+    0x7A01, 0x7A01, 0x40F6, 0x7A02, 0x7A02, 0x1B24, 0x7A03, 0x7A03, 0x1B23,

+    0x7A04, 0x7A05, 0x40F7, 0x7A06, 0x7A06, 0x1B21, 0x7A07, 0x7A0A, 0x40F9,

+    0x7A0B, 0x7A0B, 0x04F1, 0x7A0C, 0x7A0C, 0x40FD, 0x7A0D, 0x7A0D, 0x0D0D,

+    0x7A0E, 0x7A0E, 0x0DA5, 0x7A0F, 0x7A13, 0x40FE, 0x7A14, 0x7A14, 0x1B26,

+    0x7A15, 0x7A16, 0x4103, 0x7A17, 0x7A17, 0x03E9, 0x7A18, 0x7A19, 0x4105,

+    0x7A1A, 0x7A1A, 0x11C8, 0x7A1B, 0x7A1D, 0x4107, 0x7A1E, 0x7A1E, 0x1B25,

+    0x7A1F, 0x7A1F, 0x410A, 0x7A20, 0x7A20, 0x0512, 0x7A21, 0x7A22, 0x410B,

+    0x7A23, 0x7A23, 0x1D8F, 0x7A24, 0x7A2D, 0x410D, 0x7A2E, 0x7A2E, 0x2295,

+    0x7A2F, 0x7A30, 0x4117, 0x7A31, 0x7A31, 0x1E80, 0x7A32, 0x7A32, 0x4119,

+    0x7A33, 0x7A33, 0x0ED7, 0x7A34, 0x7A36, 0x411A, 0x7A37, 0x7A37, 0x1B28,

+    0x7A38, 0x7A38, 0x411D, 0x7A39, 0x7A39, 0x1B27, 0x7A3A, 0x7A3A, 0x411E,

+    0x7A3B, 0x7A3B, 0x059F, 0x7A3C, 0x7A3C, 0x084D, 0x7A3D, 0x7A3D, 0x0811,

+    0x7A3E, 0x7A3E, 0x411F, 0x7A3F, 0x7A3F, 0x06E0, 0x7A40, 0x7A40, 0x2677,

+    0x7A41, 0x7A45, 0x4120, 0x7A46, 0x7A46, 0x0B25, 0x7A47, 0x7A4B, 0x4125,

+    0x7A4C, 0x7A4C, 0x2624, 0x7A4D, 0x7A4D, 0x1F69, 0x7A4E, 0x7A4E, 0x222B,

+    0x7A4F, 0x7A50, 0x412A, 0x7A51, 0x7A51, 0x1B29, 0x7A52, 0x7A56, 0x412C,

+    0x7A57, 0x7A57, 0x0DE0, 0x7A58, 0x7A60, 0x4131, 0x7A61, 0x7A61, 0x257F,

+    0x7A62, 0x7A62, 0x1F5B, 0x7A63, 0x7A68, 0x413A, 0x7A69, 0x7A69, 0x219B,

+    0x7A6A, 0x7A6A, 0x4140, 0x7A6B, 0x7A6B, 0x267D, 0x7A6C, 0x7A6F, 0x4141,

+    0x7A70, 0x7A70, 0x1B2C, 0x7A71, 0x7A73, 0x4145, 0x7A74, 0x7A74, 0x0FD1,

+    0x7A75, 0x7A75, 0x4148, 0x7A76, 0x7A76, 0x08EE, 0x7A77, 0x7A77, 0x0C6B,

+    0x7A78, 0x7A79, 0x1B9A, 0x7A7A, 0x7A7A, 0x0962, 0x7A7B, 0x7A7E, 0x4149,

+    0x7A7F, 0x7A7F, 0x052C, 0x7A80, 0x7A80, 0x1B9C, 0x7A81, 0x7A81, 0x0E6C,

+    0x7A82, 0x7A82, 0x414D, 0x7A83, 0x7A83, 0x0C51, 0x7A84, 0x7A84, 0x114E,

+    0x7A85, 0x7A85, 0x414E, 0x7A86, 0x7A86, 0x1B9D, 0x7A87, 0x7A87, 0x414F,

+    0x7A88, 0x7A88, 0x1B9E, 0x7A89, 0x7A8C, 0x4150, 0x7A8D, 0x7A8D, 0x0C4C,

+    0x7A8E, 0x7A90, 0x4154, 0x7A91, 0x7A91, 0x102B, 0x7A92, 0x7A92, 0x11CE,

+    0x7A93, 0x7A94, 0x4157, 0x7A95, 0x7A95, 0x1B9F, 0x7A96, 0x7A96, 0x08A2,

+    0x7A97, 0x7A97, 0x0533, 0x7A98, 0x7A98, 0x08EC, 0x7A99, 0x7A9B, 0x4159,

+    0x7A9C, 0x7A9C, 0x055F, 0x7A9D, 0x7A9D, 0x0EE0, 0x7A9E, 0x7A9E, 0x415C,

+    0x7A9F, 0x7A9F, 0x096C, 0x7AA0, 0x7AA0, 0x1BA1, 0x7AA1, 0x7AA4, 0x415D,

+    0x7AA5, 0x7AA5, 0x0987, 0x7AA6, 0x7AA6, 0x1BA0, 0x7AA7, 0x7AA7, 0x4161,

+    0x7AA8, 0x7AA8, 0x1BA3, 0x7AA9, 0x7AA9, 0x21A0, 0x7AAA, 0x7AAA, 0x2186,

+    0x7AAB, 0x7AAB, 0x4162, 0x7AAC, 0x7AAC, 0x1BA2, 0x7AAD, 0x7AAD, 0x1BA4,

+    0x7AAE, 0x7AAE, 0x20ED, 0x7AAF, 0x7AB2, 0x4163, 0x7AB3, 0x7AB3, 0x1BA5,

+    0x7AB4, 0x7AB5, 0x4167, 0x7AB6, 0x7AB6, 0x25B9, 0x7AB7, 0x7AB9, 0x4169,

+    0x7ABA, 0x7ABA, 0x1FEA, 0x7ABB, 0x7ABE, 0x416C, 0x7ABF, 0x7ABF, 0x0A47,

+    0x7AC0, 0x7AC3, 0x4170, 0x7AC4, 0x7AC4, 0x1EA4, 0x7AC5, 0x7AC5, 0x20E1,

+    0x7AC6, 0x7AC6, 0x4174, 0x7AC7, 0x7AC7, 0x25B8, 0x7AC8, 0x7AC8, 0x2260,

+    0x7AC9, 0x7AC9, 0x4175, 0x7ACA, 0x7ACA, 0x20E2, 0x7ACB, 0x7ACB, 0x09EB,

+    0x7ACC, 0x7AD5, 0x4176, 0x7AD6, 0x7AD6, 0x0D91, 0x7AD7, 0x7AD8, 0x4180,

+    0x7AD9, 0x7AD9, 0x115F, 0x7ADA, 0x7ADD, 0x4182, 0x7ADE, 0x7ADE, 0x08E9,

+    0x7ADF, 0x7ADF, 0x08E8, 0x7AE0, 0x7AE0, 0x1163, 0x7AE1, 0x7AE2, 0x4186,

+    0x7AE3, 0x7AE3, 0x092F, 0x7AE4, 0x7AE4, 0x4188, 0x7AE5, 0x7AE5, 0x0E60,

+    0x7AE6, 0x7AE6, 0x1B99, 0x7AE7, 0x7AE9, 0x4189, 0x7AEA, 0x7AEA, 0x2141,

+    0x7AEB, 0x7AEC, 0x418C, 0x7AED, 0x7AED, 0x08B0, 0x7AEE, 0x7AEE, 0x418E,

+    0x7AEF, 0x7AEF, 0x060A, 0x7AF0, 0x7AF5, 0x418F, 0x7AF6, 0x7AF6, 0x1FC7,

+    0x7AF7, 0x7AF8, 0x4195, 0x7AF9, 0x7AF9, 0x11F0, 0x7AFA, 0x7AFA, 0x1C63,

+    0x7AFB, 0x7AFC, 0x4197, 0x7AFD, 0x7AFD, 0x1C64, 0x7AFE, 0x7AFE, 0x4199,

+    0x7AFF, 0x7AFF, 0x06C8, 0x7B00, 0x7B02, 0x419A, 0x7B03, 0x7B04, 0x1C66,

+    0x7B05, 0x7B05, 0x419D, 0x7B06, 0x7B06, 0x03D5, 0x7B07, 0x7B07, 0x419E,

+    0x7B08, 0x7B08, 0x1C65, 0x7B09, 0x7B09, 0x419F, 0x7B0A, 0x7B0A, 0x1C69,

+    0x7B0B, 0x7B0B, 0x0DE6, 0x7B0C, 0x7B0E, 0x41A0, 0x7B0F, 0x7B0F, 0x1C6B,

+    0x7B10, 0x7B10, 0x41A3, 0x7B11, 0x7B11, 0x0F71, 0x7B12, 0x7B13, 0x41A4,

+    0x7B14, 0x7B14, 0x0433, 0x7B15, 0x7B15, 0x1C68, 0x7B16, 0x7B18, 0x41A6,

+    0x7B19, 0x7B19, 0x1C6F, 0x7B1A, 0x7B1A, 0x41A9, 0x7B1B, 0x7B1B, 0x05B2,

+    0x7B1C, 0x7B1D, 0x41AA, 0x7B1E, 0x7B1E, 0x1C77, 0x7B1F, 0x7B1F, 0x41AC,

+    0x7B20, 0x7B20, 0x1C72, 0x7B21, 0x7B23, 0x41AD, 0x7B24, 0x7B24, 0x1C74,

+    0x7B25, 0x7B25, 0x1C73, 0x7B26, 0x7B26, 0x0698, 0x7B27, 0x7B27, 0x41B0,

+    0x7B28, 0x7B28, 0x0428, 0x7B29, 0x7B29, 0x41B1, 0x7B2A, 0x7B2A, 0x1C6E,

+    0x7B2B, 0x7B2B, 0x1C6A, 0x7B2C, 0x7B2C, 0x05BB, 0x7B2D, 0x7B2D, 0x41B2,

+    0x7B2E, 0x7B2E, 0x1C70, 0x7B2F, 0x7B30, 0x41B3, 0x7B31, 0x7B31, 0x1C71,

+    0x7B32, 0x7B32, 0x41B5, 0x7B33, 0x7B33, 0x1C75, 0x7B34, 0x7B37, 0x41B6,

+    0x7B38, 0x7B38, 0x1C6D, 0x7B39, 0x7B39, 0x41BA, 0x7B3A, 0x7B3A, 0x0856,

+    0x7B3B, 0x7B3B, 0x41BB, 0x7B3C, 0x7B3C, 0x0A46, 0x7B3D, 0x7B3D, 0x41BC,

+    0x7B3E, 0x7B3E, 0x1C76, 0x7B3F, 0x7B44, 0x41BD, 0x7B45, 0x7B45, 0x1C7A,

+    0x7B46, 0x7B46, 0x1E41, 0x7B47, 0x7B47, 0x1C6C, 0x7B48, 0x7B48, 0x41C3,

+    0x7B49, 0x7B49, 0x05A9, 0x7B4A, 0x7B4A, 0x41C4, 0x7B4B, 0x7B4B, 0x08BF,

+    0x7B4C, 0x7B4C, 0x1C7C, 0x7B4D, 0x7B4E, 0x41C5, 0x7B4F, 0x7B4F, 0x0641,

+    0x7B50, 0x7B50, 0x097D, 0x7B51, 0x7B51, 0x11FD, 0x7B52, 0x7B52, 0x0E63,

+    0x7B53, 0x7B53, 0x41C7, 0x7B54, 0x7B54, 0x0573, 0x7B55, 0x7B55, 0x41C8,

+    0x7B56, 0x7B56, 0x04A6, 0x7B57, 0x7B57, 0x41C9, 0x7B58, 0x7B58, 0x1C78,

+    0x7B59, 0x7B59, 0x41CA, 0x7B5A, 0x7B5A, 0x1C79, 0x7B5B, 0x7B5B, 0x0CF1,

+    0x7B5C, 0x7B5C, 0x41CB, 0x7B5D, 0x7B5D, 0x1C7D, 0x7B5E, 0x7B5F, 0x41CC,

+    0x7B60, 0x7B60, 0x1C7E, 0x7B61, 0x7B61, 0x41CE, 0x7B62, 0x7B62, 0x1C81,

+    0x7B63, 0x7B66, 0x41CF, 0x7B67, 0x7B67, 0x25E4, 0x7B68, 0x7B6D, 0x41D3,

+    0x7B6E, 0x7B6E, 0x1C7F, 0x7B6F, 0x7B70, 0x41D9, 0x7B71, 0x7B71, 0x1C83,

+    0x7B72, 0x7B72, 0x1C82, 0x7B73, 0x7B74, 0x41DB, 0x7B75, 0x7B75, 0x1C7B,

+    0x7B76, 0x7B76, 0x41DD, 0x7B77, 0x7B77, 0x0977, 0x7B78, 0x7B78, 0x41DE,

+    0x7B79, 0x7B79, 0x0514, 0x7B7A, 0x7B7A, 0x41DF, 0x7B7B, 0x7B7B, 0x1C80,

+    0x7B7C, 0x7B7D, 0x41E0, 0x7B7E, 0x7B7E, 0x0C26, 0x7B7F, 0x7B7F, 0x41E2,

+    0x7B80, 0x7B80, 0x0865, 0x7B81, 0x7B84, 0x41E3, 0x7B85, 0x7B85, 0x1C8B,

+    0x7B86, 0x7B8A, 0x41E7, 0x7B8B, 0x7B8B, 0x1F86, 0x7B8C, 0x7B8C, 0x41EC,

+    0x7B8D, 0x7B8D, 0x0718, 0x7B8E, 0x7B8F, 0x41ED, 0x7B90, 0x7B90, 0x1C84,

+    0x7B91, 0x7B93, 0x41EF, 0x7B94, 0x7B94, 0x0474, 0x7B95, 0x7B95, 0x0813,

+    0x7B96, 0x7B96, 0x41F2, 0x7B97, 0x7B97, 0x0DD8, 0x7B98, 0x7B9B, 0x41F3,

+    0x7B9C, 0x7B9C, 0x1C8D, 0x7B9D, 0x7B9D, 0x1C89, 0x7B9E, 0x7BA0, 0x41F7,

+    0x7BA1, 0x7BA1, 0x0735, 0x7BA2, 0x7BA2, 0x1C8E, 0x7BA3, 0x7BA5, 0x41FA,

+    0x7BA6, 0x7BA7, 0x1C85, 0x7BA8, 0x7BA8, 0x1C8A, 0x7BA9, 0x7BA9, 0x0A88,

+    0x7BAA, 0x7BAA, 0x1C8C, 0x7BAB, 0x7BAB, 0x1C8F, 0x7BAC, 0x7BAC, 0x1C88,

+    0x7BAD, 0x7BAD, 0x0870, 0x7BAE, 0x7BB0, 0x41FD, 0x7BB1, 0x7BB1, 0x0F51,

+    0x7BB2, 0x7BB3, 0x4200, 0x7BB4, 0x7BB4, 0x1C90, 0x7BB5, 0x7BB7, 0x4202,

+    0x7BB8, 0x7BB8, 0x1C87, 0x7BB9, 0x7BBF, 0x4205, 0x7BC0, 0x7BC0, 0x1FB3,

+    0x7BC1, 0x7BC1, 0x1C92, 0x7BC2, 0x7BC3, 0x420C, 0x7BC4, 0x7BC4, 0x1EEF,

+    0x7BC5, 0x7BC5, 0x420E, 0x7BC6, 0x7BC6, 0x120A, 0x7BC7, 0x7BC7, 0x0BC9,

+    0x7BC8, 0x7BC8, 0x420F, 0x7BC9, 0x7BC9, 0x22A4, 0x7BCA, 0x7BCA, 0x4210,

+    0x7BCB, 0x7BCB, 0x25E8, 0x7BCC, 0x7BCC, 0x1C93, 0x7BCD, 0x7BD0, 0x4211,

+    0x7BD1, 0x7BD1, 0x1C91, 0x7BD2, 0x7BD2, 0x4215, 0x7BD3, 0x7BD3, 0x0A4F,

+    0x7BD4, 0x7BD8, 0x4216, 0x7BD9, 0x7BD9, 0x06D8, 0x7BDA, 0x7BDA, 0x1C95,

+    0x7BDB, 0x7BDC, 0x421B, 0x7BDD, 0x7BDD, 0x1C94, 0x7BDE, 0x7BE0, 0x421D,

+    0x7BE1, 0x7BE1, 0x055E, 0x7BE2, 0x7BE3, 0x4220, 0x7BE4, 0x7BE4, 0x25E3,

+    0x7BE5, 0x7BE6, 0x1C96, 0x7BE7, 0x7BE8, 0x4222, 0x7BE9, 0x7BE9, 0x2111,

+    0x7BEA, 0x7BEA, 0x1C98, 0x7BEB, 0x7BED, 0x4224, 0x7BEE, 0x7BEE, 0x09A5,

+    0x7BEF, 0x7BF0, 0x4227, 0x7BF1, 0x7BF1, 0x09D4, 0x7BF2, 0x7BF2, 0x4229,

+    0x7BF3, 0x7BF3, 0x25E6, 0x7BF4, 0x7BF6, 0x422A, 0x7BF7, 0x7BF7, 0x0BB2,

+    0x7BF8, 0x7BFB, 0x422D, 0x7BFC, 0x7BFC, 0x1C9B, 0x7BFD, 0x7BFD, 0x4231,

+    0x7BFE, 0x7BFE, 0x1C9A, 0x7BFF, 0x7BFF, 0x4232, 0x7C00, 0x7C00, 0x25E7,

+    0x7C01, 0x7C06, 0x4233, 0x7C07, 0x7C07, 0x055B, 0x7C08, 0x7C0A, 0x4239,

+    0x7C0B, 0x7C0B, 0x1C9E, 0x7C0C, 0x7C0C, 0x1C99, 0x7C0D, 0x7C0D, 0x2041,

+    0x7C0E, 0x7C0E, 0x423C, 0x7C0F, 0x7C0F, 0x1C9C, 0x7C10, 0x7C15, 0x423D,

+    0x7C16, 0x7C16, 0x1C9D, 0x7C17, 0x7C1D, 0x4243, 0x7C1E, 0x7C1E, 0x25EA,

+    0x7C1F, 0x7C1F, 0x1C9F, 0x7C20, 0x7C20, 0x424A, 0x7C21, 0x7C21, 0x1F8F,

+    0x7C22, 0x7C22, 0x424B, 0x7C23, 0x7C23, 0x25EC, 0x7C24, 0x7C25, 0x424C,

+    0x7C26, 0x7C26, 0x1CA1, 0x7C27, 0x7C27, 0x07DE, 0x7C28, 0x7C29, 0x424E,

+    0x7C2A, 0x7C2A, 0x1CA0, 0x7C2B, 0x7C2B, 0x25EB, 0x7C2C, 0x7C37, 0x4250,

+    0x7C38, 0x7C38, 0x1CA2, 0x7C39, 0x7C3C, 0x425C, 0x7C3D, 0x7C3D, 0x20D0,

+    0x7C3E, 0x7C3E, 0x201D, 0x7C3F, 0x7C3F, 0x0485, 0x7C40, 0x7C40, 0x1CA4,

+    0x7C41, 0x7C41, 0x1CA3, 0x7C42, 0x7C42, 0x4260, 0x7C43, 0x7C43, 0x1FF7,

+    0x7C44, 0x7C4B, 0x4261, 0x7C4C, 0x7C4C, 0x1E8D, 0x7C4D, 0x7C4D, 0x0821,

+    0x7C4E, 0x7C5B, 0x4269, 0x7C5C, 0x7C5C, 0x25E9, 0x7C5D, 0x7C5E, 0x4277,

+    0x7C5F, 0x7C5F, 0x25EE, 0x7C60, 0x7C60, 0x203A, 0x7C61, 0x7C63, 0x4279,

+    0x7C64, 0x7C64, 0x2693, 0x7C65, 0x7C68, 0x427C, 0x7C69, 0x7C69, 0x25E5,

+    0x7C6A, 0x7C6A, 0x25ED, 0x7C6B, 0x7C6B, 0x4280, 0x7C6C, 0x7C6C, 0x2009,

+    0x7C6D, 0x7C6D, 0x4281, 0x7C6E, 0x7C6E, 0x2065, 0x7C6F, 0x7C71, 0x4282,

+    0x7C72, 0x7C72, 0x26A3, 0x7C73, 0x7C73, 0x0ADC, 0x7C74, 0x7C74, 0x12F5,

+    0x7C75, 0x7C7A, 0x4285, 0x7C7B, 0x7C7B, 0x09CB, 0x7C7C, 0x7C7C, 0x1CCA,

+    0x7C7D, 0x7C7D, 0x122E, 0x7C7E, 0x7C88, 0x428B, 0x7C89, 0x7C89, 0x0678,

+    0x7C8A, 0x7C90, 0x4296, 0x7C91, 0x7C91, 0x1CCC, 0x7C92, 0x7C92, 0x09EC,

+    0x7C93, 0x7C94, 0x429D, 0x7C95, 0x7C95, 0x0BE8, 0x7C96, 0x7C96, 0x429F,

+    0x7C97, 0x7C97, 0x0559, 0x7C98, 0x7C98, 0x1154, 0x7C99, 0x7C9B, 0x42A0,

+    0x7C9C, 0x7C9C, 0x1CCE, 0x7C9D, 0x7C9D, 0x1CCD, 0x7C9E, 0x7C9E, 0x1CCF,

+    0x7C9F, 0x7C9F, 0x0DCF, 0x7CA0, 0x7CA1, 0x42A3, 0x7CA2, 0x7CA2, 0x1CD0,

+    0x7CA3, 0x7CA3, 0x42A5, 0x7CA4, 0x7CA4, 0x1104, 0x7CA5, 0x7CA5, 0x11DF,

+    0x7CA6, 0x7CA9, 0x42A6, 0x7CAA, 0x7CAA, 0x067D, 0x7CAB, 0x7CAD, 0x42AA,

+    0x7CAE, 0x7CAE, 0x0A01, 0x7CAF, 0x7CB0, 0x42AD, 0x7CB1, 0x7CB1, 0x0A04,

+    0x7CB2, 0x7CB2, 0x1CD1, 0x7CB3, 0x7CB3, 0x08DB, 0x7CB4, 0x7CB8, 0x42AF,

+    0x7CB9, 0x7CB9, 0x0565, 0x7CBA, 0x7CBB, 0x42B4, 0x7CBC, 0x7CBD, 0x1CD2,

+    0x7CBE, 0x7CBE, 0x08DA, 0x7CBF, 0x7CC0, 0x42B6, 0x7CC1, 0x7CC1, 0x1CD4,

+    0x7CC2, 0x7CC4, 0x42B8, 0x7CC5, 0x7CC5, 0x1CD9, 0x7CC6, 0x7CC6, 0x42BB,

+    0x7CC7, 0x7CC7, 0x1CD5, 0x7CC8, 0x7CC8, 0x1CD8, 0x7CC9, 0x7CC9, 0x42BC,

+    0x7CCA, 0x7CCA, 0x07B4, 0x7CCB, 0x7CCB, 0x42BD, 0x7CCC, 0x7CCD, 0x1CD6,

+    0x7CCE, 0x7CD4, 0x42BE, 0x7CD5, 0x7CD5, 0x06DD, 0x7CD6, 0x7CD6, 0x0E1A,

+    0x7CD7, 0x7CD7, 0x1CDA, 0x7CD8, 0x7CD8, 0x42C5, 0x7CD9, 0x7CD9, 0x04A1,

+    0x7CDA, 0x7CDB, 0x42C6, 0x7CDC, 0x7CDC, 0x0AD8, 0x7CDD, 0x7CDD, 0x25F5,

+    0x7CDE, 0x7CDE, 0x1EFC, 0x7CDF, 0x7CDF, 0x1126, 0x7CE0, 0x7CE0, 0x0944,

+    0x7CE1, 0x7CE6, 0x42C8, 0x7CE7, 0x7CE7, 0x2024, 0x7CE8, 0x7CE8, 0x1CDB,

+    0x7CE9, 0x7CEE, 0x42CE, 0x7CEF, 0x7CEF, 0x0B75, 0x7CF0, 0x7CF0, 0x269B,

+    0x7CF1, 0x7CF1, 0x42D4, 0x7CF2, 0x7CF2, 0x25F3, 0x7CF3, 0x7CF3, 0x42D5,

+    0x7CF4, 0x7CF4, 0x22D9, 0x7CF5, 0x7CF5, 0x42D6, 0x7CF6, 0x7CF6, 0x25F4,

+    0x7CF7, 0x7CF7, 0x42D7, 0x7CF8, 0x7CF8, 0x1CE7, 0x7CF9, 0x7CF9, 0x241B,

+    0x7CFA, 0x7CFA, 0x42D8, 0x7CFB, 0x7CFB, 0x0F22, 0x7CFC, 0x7CFD, 0x42D9,

+    0x7CFE, 0x7CFE, 0x1FC8, 0x7CFF, 0x7CFF, 0x42DB, 0x7D00, 0x7D00, 0x1F7B,

+    0x7D01, 0x7D01, 0x42DC, 0x7D02, 0x7D02, 0x241D, 0x7D03, 0x7D03, 0x42DD,

+    0x7D04, 0x7D04, 0x224C, 0x7D05, 0x7D05, 0x1F48, 0x7D06, 0x7D06, 0x241C,

+    0x7D07, 0x7D08, 0x241E, 0x7D09, 0x7D09, 0x20FF, 0x7D0A, 0x7D0A, 0x0ED8,

+    0x7D0B, 0x7D0B, 0x219A, 0x7D0C, 0x7D0C, 0x42DE, 0x7D0D, 0x7D0D, 0x2091,

+    0x7D0E, 0x7D0F, 0x42DF, 0x7D10, 0x7D10, 0x20A7, 0x7D11, 0x7D12, 0x42E1,

+    0x7D13, 0x7D13, 0x2423, 0x7D14, 0x7D14, 0x1E9B, 0x7D15, 0x7D15, 0x2422,

+    0x7D16, 0x7D16, 0x42E3, 0x7D17, 0x7D17, 0x2110, 0x7D18, 0x7D18, 0x42E4,

+    0x7D19, 0x7D19, 0x228D, 0x7D1A, 0x7D1A, 0x1F71, 0x7D1B, 0x7D1B, 0x1EF8,

+    0x7D1C, 0x7D1C, 0x2421, 0x7D1D, 0x7D1F, 0x42E5, 0x7D20, 0x7D20, 0x0DCD,

+    0x7D21, 0x7D21, 0x1EF3, 0x7D22, 0x7D22, 0x0DEC, 0x7D23, 0x7D26, 0x42E8,

+    0x7D27, 0x7D27, 0x08C5, 0x7D28, 0x7D2A, 0x42EC, 0x7D2B, 0x7D2B, 0x122C,

+    0x7D2C, 0x7D2E, 0x42EF, 0x7D2F, 0x7D2F, 0x09C6, 0x7D30, 0x7D30, 0x21B1,

+    0x7D31, 0x7D31, 0x2426, 0x7D32, 0x7D32, 0x2425, 0x7D33, 0x7D33, 0x2120,

+    0x7D34, 0x7D38, 0x42F2, 0x7D39, 0x7D39, 0x211A, 0x7D3A, 0x7D3A, 0x2424,

+    0x7D3B, 0x7D3B, 0x42F7, 0x7D3C, 0x7D3C, 0x2428, 0x7D3D, 0x7D3E, 0x42F8,

+    0x7D3F, 0x7D3F, 0x242A, 0x7D40, 0x7D40, 0x2429, 0x7D41, 0x7D41, 0x42FA,

+    0x7D42, 0x7D42, 0x2294, 0x7D43, 0x7D43, 0x42FB, 0x7D44, 0x7D44, 0x22BE,

+    0x7D45, 0x7D45, 0x42FC, 0x7D46, 0x7D46, 0x1E31, 0x7D47, 0x7D4D, 0x42FD,

+    0x7D4E, 0x7D4E, 0x242C, 0x7D4F, 0x7D4F, 0x4304, 0x7D50, 0x7D50, 0x1FB5,

+    0x7D51, 0x7D5C, 0x4305, 0x7D5D, 0x7D5D, 0x242B, 0x7D5E, 0x7D5E, 0x1FAF,

+    0x7D5F, 0x7D60, 0x4311, 0x7D61, 0x7D61, 0x2068, 0x7D62, 0x7D62, 0x21E4,

+    0x7D63, 0x7D65, 0x4313, 0x7D66, 0x7D66, 0x1F21, 0x7D67, 0x7D67, 0x4316,

+    0x7D68, 0x7D68, 0x2101, 0x7D69, 0x7D6D, 0x4317, 0x7D6E, 0x7D6E, 0x0FC0,

+    0x7D6F, 0x7D70, 0x431C, 0x7D71, 0x7D71, 0x217C, 0x7D72, 0x7D72, 0x214A,

+    0x7D73, 0x7D73, 0x242D, 0x7D74, 0x7D75, 0x431E, 0x7D76, 0x7D76, 0x1FD4,

+    0x7D77, 0x7D77, 0x1CE8, 0x7D78, 0x7D78, 0x4320, 0x7D79, 0x7D79, 0x1FD1,

+    0x7D7A, 0x7D80, 0x4321, 0x7D81, 0x7D81, 0x1E33, 0x7D82, 0x7D82, 0x4328,

+    0x7D83, 0x7D83, 0x242F, 0x7D84, 0x7D85, 0x4329, 0x7D86, 0x7D86, 0x242E,

+    0x7D87, 0x7D87, 0x432B, 0x7D88, 0x7D88, 0x2430, 0x7D89, 0x7D89, 0x21DB,

+    0x7D8A, 0x7D8E, 0x432C, 0x7D8F, 0x7D8F, 0x2158, 0x7D90, 0x7D92, 0x4331,

+    0x7D93, 0x7D93, 0x1FC2, 0x7D94, 0x7D9B, 0x4334, 0x7D9C, 0x7D9C, 0x22B9,

+    0x7D9D, 0x7D9D, 0x433C, 0x7D9E, 0x7D9E, 0x2436, 0x7D9F, 0x7DA1, 0x433D,

+    0x7DA2, 0x7DA2, 0x1E8E, 0x7DA3, 0x7DA3, 0x2439, 0x7DA4, 0x7DA5, 0x4340,

+    0x7DA6, 0x7DA6, 0x1CE9, 0x7DA7, 0x7DAA, 0x4342, 0x7DAB, 0x7DAB, 0x21C5,

+    0x7DAC, 0x7DAC, 0x2437, 0x7DAD, 0x7DAD, 0x2192, 0x7DAE, 0x7DAE, 0x1CEA,

+    0x7DAF, 0x7DAF, 0x4346, 0x7DB0, 0x7DB0, 0x243A, 0x7DB1, 0x7DB1, 0x1F19,

+    0x7DB2, 0x7DB2, 0x218C, 0x7DB3, 0x7DB3, 0x1E40, 0x7DB4, 0x7DB4, 0x22B3,

+    0x7DB5, 0x7DB7, 0x4347, 0x7DB8, 0x7DB8, 0x205F, 0x7DB9, 0x7DB9, 0x2438,

+    0x7DBA, 0x7DBA, 0x2432, 0x7DBB, 0x7DBB, 0x2274, 0x7DBC, 0x7DBC, 0x434A,

+    0x7DBD, 0x7DBD, 0x1E9C, 0x7DBE, 0x7DBE, 0x2431, 0x7DBF, 0x7DBF, 0x2085,

+    0x7DC0, 0x7DC3, 0x434B, 0x7DC4, 0x7DC4, 0x2435, 0x7DC5, 0x7DC6, 0x434F,

+    0x7DC7, 0x7DC7, 0x243B, 0x7DC8, 0x7DC9, 0x4351, 0x7DCA, 0x7DCA, 0x1FB7,

+    0x7DCB, 0x7DCB, 0x2433, 0x7DCC, 0x7DD0, 0x4353, 0x7DD1, 0x7DD1, 0x2054,

+    0x7DD2, 0x7DD2, 0x21DE, 0x7DD3, 0x7DD3, 0x4358, 0x7DD4, 0x7DD4, 0x2434,

+    0x7DD5, 0x7DD6, 0x4359, 0x7DD7, 0x7DD7, 0x243D, 0x7DD8, 0x7DD8, 0x1F89,

+    0x7DD9, 0x7DD9, 0x243C, 0x7DDA, 0x7DDC, 0x435B, 0x7DDD, 0x7DDD, 0x1F6E,

+    0x7DDE, 0x7DDE, 0x1ED8, 0x7DDF, 0x7DDF, 0x435E, 0x7DE0, 0x7DE0, 0x1EBF,

+    0x7DE1, 0x7DE1, 0x2445, 0x7DE2, 0x7DE2, 0x435F, 0x7DE3, 0x7DE3, 0x2249,

+    0x7DE4, 0x7DE5, 0x4360, 0x7DE6, 0x7DE6, 0x2441, 0x7DE7, 0x7DE7, 0x4362,

+    0x7DE8, 0x7DE8, 0x1E47, 0x7DE9, 0x7DE9, 0x1F56, 0x7DEA, 0x7DEB, 0x4363,

+    0x7DEC, 0x7DEC, 0x2086, 0x7DED, 0x7DEE, 0x4365, 0x7DEF, 0x7DEF, 0x2196,

+    0x7DF0, 0x7DF0, 0x4367, 0x7DF1, 0x7DF1, 0x2443, 0x7DF2, 0x7DF2, 0x243F,

+    0x7DF3, 0x7DF3, 0x4368, 0x7DF4, 0x7DF4, 0x2023, 0x7DF5, 0x7DF5, 0x4369,

+    0x7DF6, 0x7DF6, 0x2442, 0x7DF7, 0x7DF8, 0x436A, 0x7DF9, 0x7DF9, 0x243E,

+    0x7DFA, 0x7DFA, 0x436C, 0x7DFB, 0x7DFB, 0x26A6, 0x7DFC, 0x7DFF, 0x436D,

+    0x7E00, 0x7E07, 0x4371, 0x7E08, 0x7E08, 0x234E, 0x7E09, 0x7E09, 0x2446,

+    0x7E0A, 0x7E0A, 0x244B, 0x7E0B, 0x7E0B, 0x2444, 0x7E0C, 0x7E0F, 0x4379,

+    0x7E10, 0x7E10, 0x2427, 0x7E11, 0x7E11, 0x244C, 0x7E12, 0x7E1A, 0x437D,

+    0x7E1B, 0x7E1B, 0x1F0F, 0x7E1C, 0x7E1C, 0x4386, 0x7E1D, 0x7E1D, 0x2447,

+    0x7E1E, 0x7E1E, 0x2449, 0x7E1F, 0x7E1F, 0x2448, 0x7E20, 0x7E22, 0x4387,

+    0x7E23, 0x7E23, 0x21C2, 0x7E24, 0x7E26, 0x438A, 0x7E27, 0x7E27, 0x216E,

+    0x7E28, 0x7E2A, 0x438D, 0x7E2B, 0x7E2B, 0x1F03, 0x7E2C, 0x7E2C, 0x4390,

+    0x7E2D, 0x7E2D, 0x244A, 0x7E2E, 0x7E2E, 0x215C, 0x7E2F, 0x7E30, 0x4391,

+    0x7E31, 0x7E31, 0x22BB, 0x7E32, 0x7E32, 0x2450, 0x7E33, 0x7E33, 0x4393,

+    0x7E34, 0x7E34, 0x2694, 0x7E35, 0x7E35, 0x244F, 0x7E36, 0x7E36, 0x25F6,

+    0x7E37, 0x7E37, 0x2051, 0x7E38, 0x7E38, 0x4394, 0x7E39, 0x7E39, 0x244E,

+    0x7E3A, 0x7E3A, 0x4395, 0x7E3B, 0x7E3B, 0x1DFB, 0x7E3C, 0x7E3C, 0x4396,

+    0x7E3D, 0x7E3D, 0x22BA, 0x7E3E, 0x7E3E, 0x1F6D, 0x7E3F, 0x7E40, 0x4397,

+    0x7E41, 0x7E41, 0x064E, 0x7E42, 0x7E44, 0x4399, 0x7E45, 0x7E45, 0x2452,

+    0x7E46, 0x7E46, 0x2451, 0x7E47, 0x7E47, 0x1CEB, 0x7E48, 0x7E51, 0x439C,

+    0x7E52, 0x7E52, 0x2455, 0x7E53, 0x7E53, 0x43A6, 0x7E54, 0x7E54, 0x2289,

+    0x7E55, 0x7E55, 0x2116, 0x7E56, 0x7E59, 0x43A7, 0x7E5A, 0x7E5A, 0x2454,

+    0x7E5B, 0x7E5D, 0x43AB, 0x7E5E, 0x7E5E, 0x20FB, 0x7E5F, 0x7E61, 0x43AE,

+    0x7E62, 0x7E62, 0x2440, 0x7E63, 0x7E68, 0x43B1, 0x7E69, 0x7E69, 0x2126,

+    0x7E6A, 0x7E6A, 0x1F61, 0x7E6B, 0x7E6B, 0x269D, 0x7E6C, 0x7E6C, 0x43B7,

+    0x7E6D, 0x7E6D, 0x1F8A, 0x7E6E, 0x7E6E, 0x2456, 0x7E6F, 0x7E6F, 0x2459,

+    0x7E70, 0x7E70, 0x2458, 0x7E71, 0x7E72, 0x43B8, 0x7E73, 0x7E73, 0x1FAE,

+    0x7E74, 0x7E78, 0x43BA, 0x7E79, 0x7E79, 0x221A, 0x7E7A, 0x7E7B, 0x43BF,

+    0x7E7C, 0x7E7C, 0x1F7A, 0x7E7D, 0x7E7D, 0x244D, 0x7E7E, 0x7E7E, 0x2457,

+    0x7E7F, 0x7E81, 0x43C1, 0x7E82, 0x7E82, 0x1248, 0x7E83, 0x7E87, 0x43C4,

+    0x7E88, 0x7E88, 0x2453, 0x7E89, 0x7E89, 0x43C9, 0x7E8A, 0x7E8A, 0x2420,

+    0x7E8B, 0x7E8B, 0x43CA, 0x7E8C, 0x7E8C, 0x21DF, 0x7E8D, 0x7E8D, 0x2685,

+    0x7E8E, 0x7E8E, 0x43CB, 0x7E8F, 0x7E8F, 0x1E6E, 0x7E90, 0x7E92, 0x43CC,

+    0x7E93, 0x7E93, 0x2224, 0x7E94, 0x7E94, 0x2670, 0x7E95, 0x7E95, 0x43CF,

+    0x7E96, 0x7E96, 0x21BA, 0x7E97, 0x7E97, 0x43D0, 0x7E98, 0x7E98, 0x245A,

+    0x7E99, 0x7E9A, 0x43D1, 0x7E9B, 0x7E9B, 0x1CEC, 0x7E9C, 0x7E9C, 0x1FFF,

+    0x7E9D, 0x7E9E, 0x43D3, 0x7E9F, 0x7E9F, 0x17D3, 0x7EA0, 0x7EA0, 0x08EF,

+    0x7EA1, 0x7EA1, 0x17D4, 0x7EA2, 0x7EA2, 0x07A3, 0x7EA3, 0x7EA3, 0x17D5,

+    0x7EA4, 0x7EA4, 0x0F38, 0x7EA5, 0x7EA5, 0x17D6, 0x7EA6, 0x7EA6, 0x10FF,

+    0x7EA7, 0x7EA7, 0x0829, 0x7EA8, 0x7EA9, 0x17D7, 0x7EAA, 0x7EAA, 0x0840,

+    0x7EAB, 0x7EAB, 0x0CAD, 0x7EAC, 0x7EAC, 0x0EC2, 0x7EAD, 0x7EAD, 0x17D9,

+    0x7EAE, 0x7EAE, 0x43D5, 0x7EAF, 0x7EAF, 0x0542, 0x7EB0, 0x7EB0, 0x17DA,

+    0x7EB1, 0x7EB1, 0x0CED, 0x7EB2, 0x7EB2, 0x06D4, 0x7EB3, 0x7EB3, 0x0B2C,

+    0x7EB4, 0x7EB4, 0x43D6, 0x7EB5, 0x7EB5, 0x123A, 0x7EB6, 0x7EB6, 0x0A81,

+    0x7EB7, 0x7EB7, 0x0674, 0x7EB8, 0x7EB8, 0x11BC, 0x7EB9, 0x7EB9, 0x0ED5,

+    0x7EBA, 0x7EBA, 0x0661, 0x7EBB, 0x7EBC, 0x43D7, 0x7EBD, 0x7EBD, 0x0B67,

+    0x7EBE, 0x7EBE, 0x17DB, 0x7EBF, 0x7EBF, 0x0F4C, 0x7EC0, 0x7EC2, 0x17DC,

+    0x7EC3, 0x7EC3, 0x0A00, 0x7EC4, 0x7EC4, 0x1246, 0x7EC5, 0x7EC5, 0x0D29,

+    0x7EC6, 0x7EC6, 0x0F25, 0x7EC7, 0x7EC7, 0x11AE, 0x7EC8, 0x7EC8, 0x11D4,

+    0x7EC9, 0x7EC9, 0x17DF, 0x7ECA, 0x7ECA, 0x03F8, 0x7ECB, 0x7ECC, 0x17E0,

+    0x7ECD, 0x7ECD, 0x0D15, 0x7ECE, 0x7ECE, 0x1076, 0x7ECF, 0x7ECF, 0x08DC,

+    0x7ED0, 0x7ED0, 0x17E2, 0x7ED1, 0x7ED1, 0x03FE, 0x7ED2, 0x7ED2, 0x0CB9,

+    0x7ED3, 0x7ED3, 0x08B2, 0x7ED4, 0x7ED4, 0x17E3, 0x7ED5, 0x7ED5, 0x0CA1,

+    0x7ED6, 0x7ED6, 0x43D9, 0x7ED7, 0x7ED7, 0x17E4, 0x7ED8, 0x7ED8, 0x07FB,

+    0x7ED9, 0x7ED9, 0x06F3, 0x7EDA, 0x7EDA, 0x0FCD, 0x7EDB, 0x7EDB, 0x17E5,

+    0x7EDC, 0x7EDC, 0x0A8E, 0x7EDD, 0x7EDD, 0x0927, 0x7EDE, 0x7EDE, 0x089B,

+    0x7EDF, 0x7EDF, 0x0E64, 0x7EE0, 0x7EE1, 0x17E6, 0x7EE2, 0x7EE2, 0x091D,

+    0x7EE3, 0x7EE3, 0x0FB0, 0x7EE4, 0x7EE4, 0x43DA, 0x7EE5, 0x7EE5, 0x0DDC,

+    0x7EE6, 0x7EE6, 0x0E23, 0x7EE7, 0x7EE7, 0x083F, 0x7EE8, 0x7EE8, 0x17E8,

+    0x7EE9, 0x7EE9, 0x081B, 0x7EEA, 0x7EEA, 0x0FC2, 0x7EEB, 0x7EEB, 0x17E9,

+    0x7EEC, 0x7EEC, 0x43DB, 0x7EED, 0x7EED, 0x0FC3, 0x7EEE, 0x7EEF, 0x17EA,

+    0x7EF0, 0x7EF0, 0x0545, 0x7EF1, 0x7EF2, 0x17EC, 0x7EF3, 0x7EF3, 0x0D37,

+    0x7EF4, 0x7EF4, 0x0EBB, 0x7EF5, 0x7EF5, 0x0AE5, 0x7EF6, 0x7EF6, 0x17EF,

+    0x7EF7, 0x7EF7, 0x042A, 0x7EF8, 0x7EF8, 0x0516, 0x7EF9, 0x7EF9, 0x43DC,

+    0x7EFA, 0x7EFB, 0x17F0, 0x7EFC, 0x7EFC, 0x1238, 0x7EFD, 0x7EFD, 0x1161,

+    0x7EFE, 0x7EFE, 0x17F2, 0x7EFF, 0x7EFF, 0x0A73, 0x7F00, 0x7F00, 0x1217,

+    0x7F01, 0x7F03, 0x17F3, 0x7F04, 0x7F04, 0x085D, 0x7F05, 0x7F05, 0x0AEA,

+    0x7F06, 0x7F06, 0x09AD, 0x7F07, 0x7F08, 0x17F6, 0x7F09, 0x7F09, 0x081C,

+    0x7F0A, 0x7F0A, 0x43DD, 0x7F0B, 0x7F0C, 0x17F8, 0x7F0D, 0x7F0D, 0x17EE,

+    0x7F0E, 0x7F0E, 0x060F, 0x7F0F, 0x7F0F, 0x17FA, 0x7F10, 0x7F10, 0x43DE,

+    0x7F11, 0x7F12, 0x17FB, 0x7F13, 0x7F13, 0x07CF, 0x7F14, 0x7F14, 0x05BF,

+    0x7F15, 0x7F15, 0x0A6D, 0x7F16, 0x7F16, 0x0449, 0x7F17, 0x7F17, 0x17FD,

+    0x7F18, 0x7F18, 0x10F8, 0x7F19, 0x7F19, 0x17FE, 0x7F1A, 0x7F1A, 0x06BA,

+    0x7F1B, 0x7F1B, 0x1800, 0x7F1C, 0x7F1C, 0x17FF, 0x7F1D, 0x7F1D, 0x0689,

+    0x7F1E, 0x7F1E, 0x43DF, 0x7F1F, 0x7F1F, 0x1801, 0x7F20, 0x7F20, 0x04BF,

+    0x7F21, 0x7F27, 0x1802, 0x7F28, 0x7F28, 0x108C, 0x7F29, 0x7F29, 0x0DEA,

+    0x7F2A, 0x7F2D, 0x1809, 0x7F2E, 0x7F2E, 0x0D02, 0x7F2F, 0x7F33, 0x180D,

+    0x7F34, 0x7F34, 0x089A, 0x7F35, 0x7F35, 0x1812, 0x7F36, 0x7F36, 0x1C5E,

+    0x7F37, 0x7F37, 0x43E0, 0x7F38, 0x7F38, 0x06D2, 0x7F39, 0x7F39, 0x43E1,

+    0x7F3A, 0x7F3A, 0x0C8C, 0x7F3B, 0x7F41, 0x43E2, 0x7F42, 0x7F42, 0x1C5F,

+    0x7F43, 0x7F43, 0x43E9, 0x7F44, 0x7F45, 0x1C60, 0x7F46, 0x7F4B, 0x43EA,

+    0x7F4C, 0x7F4C, 0x25E2, 0x7F4D, 0x7F4D, 0x43F0, 0x7F4E, 0x7F4E, 0x269A,

+    0x7F4F, 0x7F4F, 0x43F1, 0x7F50, 0x7F50, 0x0737, 0x7F51, 0x7F51, 0x0EA9,

+    0x7F52, 0x7F53, 0x43F2, 0x7F54, 0x7F54, 0x129E, 0x7F55, 0x7F55, 0x0768,

+    0x7F56, 0x7F56, 0x43F4, 0x7F57, 0x7F57, 0x0A85, 0x7F58, 0x7F58, 0x1A81,

+    0x7F59, 0x7F59, 0x43F5, 0x7F5A, 0x7F5A, 0x0640, 0x7F5B, 0x7F5E, 0x43F6,

+    0x7F5F, 0x7F5F, 0x1A83, 0x7F60, 0x7F60, 0x43FA, 0x7F61, 0x7F61, 0x1A82,

+    0x7F62, 0x7F62, 0x03E0, 0x7F63, 0x7F67, 0x43FB, 0x7F68, 0x7F68, 0x1A85,

+    0x7F69, 0x7F69, 0x1177, 0x7F6A, 0x7F6A, 0x124C, 0x7F6B, 0x7F6D, 0x4400,

+    0x7F6E, 0x7F6E, 0x11C2, 0x7F6F, 0x7F6F, 0x4403, 0x7F70, 0x7F70, 0x1EEA,

+    0x7F71, 0x7F71, 0x1A87, 0x7F72, 0x7F72, 0x0D87, 0x7F73, 0x7F73, 0x4404,

+    0x7F74, 0x7F74, 0x1A86, 0x7F75, 0x7F76, 0x4405, 0x7F77, 0x7F77, 0x1E2C,

+    0x7F78, 0x7F78, 0x4407, 0x7F79, 0x7F79, 0x1A88, 0x7F7A, 0x7F7D, 0x4408,

+    0x7F7E, 0x7F7E, 0x1A8A, 0x7F7F, 0x7F80, 0x440C, 0x7F81, 0x7F81, 0x1A89,

+    0x7F82, 0x7F84, 0x440E, 0x7F85, 0x7F85, 0x2062, 0x7F86, 0x7F86, 0x24F1,

+    0x7F87, 0x7F87, 0x4411, 0x7F88, 0x7F88, 0x24F2, 0x7F89, 0x7F89, 0x4412,

+    0x7F8A, 0x7F8A, 0x101B, 0x7F8B, 0x7F8B, 0x4413, 0x7F8C, 0x7F8C, 0x0C39,

+    0x7F8D, 0x7F8D, 0x4414, 0x7F8E, 0x7F8E, 0x0AC5, 0x7F8F, 0x7F93, 0x4415,

+    0x7F94, 0x7F94, 0x06DC, 0x7F95, 0x7F99, 0x441A, 0x7F9A, 0x7F9A, 0x0A30,

+    0x7F9B, 0x7F9C, 0x441F, 0x7F9D, 0x7F9D, 0x1CC4, 0x7F9E, 0x7F9E, 0x0FAA,

+    0x7F9F, 0x7F9F, 0x1CC5, 0x7FA0, 0x7FA0, 0x4421, 0x7FA1, 0x7FA1, 0x0F48,

+    0x7FA2, 0x7FA3, 0x4422, 0x7FA4, 0x7FA4, 0x0C95, 0x7FA5, 0x7FA5, 0x25F2,

+    0x7FA6, 0x7FA6, 0x4424, 0x7FA7, 0x7FA7, 0x1CC6, 0x7FA8, 0x7FA8, 0x4425,

+    0x7FA9, 0x7FA9, 0x2215, 0x7FAA, 0x7FAE, 0x4426, 0x7FAF, 0x7FB0, 0x1CC7,

+    0x7FB1, 0x7FB1, 0x442B, 0x7FB2, 0x7FB2, 0x1CC9, 0x7FB3, 0x7FB7, 0x442C,

+    0x7FB8, 0x7FB8, 0x130E, 0x7FB9, 0x7FB9, 0x06F9, 0x7FBA, 0x7FBB, 0x4431,

+    0x7FBC, 0x7FBC, 0x176D, 0x7FBD, 0x7FBD, 0x10D5, 0x7FBE, 0x7FBE, 0x4433,

+    0x7FBF, 0x7FBF, 0x1CDE, 0x7FC0, 0x7FC0, 0x4434, 0x7FC1, 0x7FC1, 0x0EDB,

+    0x7FC2, 0x7FC4, 0x4435, 0x7FC5, 0x7FC5, 0x0506, 0x7FC6, 0x7FC9, 0x4438,

+    0x7FCA, 0x7FCA, 0x1B98, 0x7FCB, 0x7FCB, 0x443C, 0x7FCC, 0x7FCC, 0x1075,

+    0x7FCD, 0x7FCD, 0x443D, 0x7FCE, 0x7FCE, 0x1CDF, 0x7FCF, 0x7FD1, 0x443E,

+    0x7FD2, 0x7FD2, 0x21AE, 0x7FD3, 0x7FD3, 0x4441, 0x7FD4, 0x7FD4, 0x0F55,

+    0x7FD5, 0x7FD5, 0x1CE0, 0x7FD6, 0x7FD7, 0x4442, 0x7FD8, 0x7FD8, 0x0C49,

+    0x7FD9, 0x7FDE, 0x4444, 0x7FDF, 0x7FDF, 0x05B5, 0x7FE0, 0x7FE0, 0x0567,

+    0x7FE1, 0x7FE1, 0x1CE2, 0x7FE2, 0x7FE4, 0x444A, 0x7FE5, 0x7FE5, 0x1CE1,

+    0x7FE6, 0x7FE6, 0x1CE3, 0x7FE7, 0x7FE8, 0x444D, 0x7FE9, 0x7FE9, 0x1CE4,

+    0x7FEA, 0x7FED, 0x444F, 0x7FEE, 0x7FEE, 0x1CE5, 0x7FEF, 0x7FEF, 0x4453,

+    0x7FF0, 0x7FF0, 0x0769, 0x7FF1, 0x7FF1, 0x03CA, 0x7FF2, 0x7FF2, 0x4454,

+    0x7FF3, 0x7FF3, 0x1CE6, 0x7FF4, 0x7FF8, 0x4455, 0x7FF9, 0x7FF9, 0x20E0,

+    0x7FFA, 0x7FFA, 0x445A, 0x7FFB, 0x7FFB, 0x064A, 0x7FFC, 0x7FFC, 0x1074,

+    0x7FFD, 0x7FFF, 0x445B, 0x8000, 0x8000, 0x1032, 0x8001, 0x8001, 0x09BA,

+    0x8002, 0x8002, 0x445E, 0x8003, 0x8003, 0x0949, 0x8004, 0x8004, 0x1953,

+    0x8005, 0x8005, 0x1180, 0x8006, 0x8006, 0x191A, 0x8007, 0x800A, 0x445F,

+    0x800B, 0x800B, 0x1BD7, 0x800C, 0x800C, 0x0637, 0x800D, 0x800D, 0x0D98,

+    0x800E, 0x800F, 0x4463, 0x8010, 0x8010, 0x0B30, 0x8011, 0x8011, 0x4465,

+    0x8012, 0x8012, 0x1BCB, 0x8013, 0x8013, 0x4466, 0x8014, 0x8014, 0x1BCC,

+    0x8015, 0x8015, 0x06F6, 0x8016, 0x8016, 0x1BCD, 0x8017, 0x8017, 0x077B,

+    0x8018, 0x8018, 0x1108, 0x8019, 0x8019, 0x03DD, 0x801A, 0x801B, 0x4467,

+    0x801C, 0x801C, 0x1BCE, 0x801D, 0x801F, 0x4469, 0x8020, 0x8020, 0x1BCF,

+    0x8021, 0x8021, 0x446C, 0x8022, 0x8022, 0x1BD0, 0x8023, 0x8024, 0x446D,

+    0x8025, 0x8027, 0x1BD1, 0x8028, 0x8028, 0x1BD5, 0x8029, 0x8029, 0x1BD4,

+    0x802A, 0x802A, 0x0B96, 0x802B, 0x802B, 0x446F, 0x802C, 0x802C, 0x25C2,

+    0x802D, 0x802D, 0x4470, 0x802E, 0x802E, 0x25C1, 0x802F, 0x8030, 0x4471,

+    0x8031, 0x8031, 0x1BD6, 0x8032, 0x8032, 0x4473, 0x8033, 0x8033, 0x0639,

+    0x8034, 0x8034, 0x4474, 0x8035, 0x8035, 0x1BD8, 0x8036, 0x8036, 0x1035,

+    0x8037, 0x8037, 0x14B1, 0x8038, 0x8038, 0x0DBF, 0x8039, 0x803A, 0x4475,

+    0x803B, 0x803B, 0x0501, 0x803C, 0x803C, 0x4477, 0x803D, 0x803D, 0x0583,

+    0x803E, 0x803E, 0x4478, 0x803F, 0x803F, 0x06FB, 0x8040, 0x8041, 0x4479,

+    0x8042, 0x8042, 0x0B57, 0x8043, 0x8043, 0x1BD9, 0x8044, 0x8045, 0x447B,

+    0x8046, 0x8046, 0x1BDA, 0x8047, 0x8049, 0x447D, 0x804A, 0x804A, 0x0A0D,

+    0x804B, 0x804B, 0x0A44, 0x804C, 0x804C, 0x11AF, 0x804D, 0x804D, 0x1BDB,

+    0x804E, 0x8051, 0x4480, 0x8052, 0x8052, 0x1BDC, 0x8053, 0x8053, 0x4484,

+    0x8054, 0x8054, 0x09F3, 0x8055, 0x8055, 0x4485, 0x8056, 0x8056, 0x2128,

+    0x8057, 0x8057, 0x4486, 0x8058, 0x8058, 0x0BD7, 0x8059, 0x8059, 0x4487,

+    0x805A, 0x805A, 0x090A, 0x805B, 0x805D, 0x4488, 0x805E, 0x805E, 0x2199,

+    0x805F, 0x8068, 0x448B, 0x8069, 0x8069, 0x1BDD, 0x806A, 0x806A, 0x0552,

+    0x806B, 0x806E, 0x4495, 0x806F, 0x806F, 0x2017, 0x8070, 0x8070, 0x1EA0,

+    0x8071, 0x8071, 0x1BDE, 0x8072, 0x8072, 0x2125, 0x8073, 0x8073, 0x214D,

+    0x8074, 0x8074, 0x4499, 0x8075, 0x8075, 0x25C4, 0x8076, 0x8076, 0x209D,

+    0x8077, 0x8077, 0x228A, 0x8078, 0x8078, 0x449A, 0x8079, 0x8079, 0x25C3,

+    0x807A, 0x807C, 0x449B, 0x807D, 0x807D, 0x2179, 0x807E, 0x807E, 0x2038,

+    0x807F, 0x807F, 0x1A1E, 0x8080, 0x8080, 0x1A1D, 0x8081, 0x8082, 0x449E,

+    0x8083, 0x8083, 0x0DD5, 0x8084, 0x8084, 0x1065, 0x8085, 0x8085, 0x2155,

+    0x8086, 0x8086, 0x0DB6, 0x8087, 0x8087, 0x1179, 0x8088, 0x8088, 0x44A0,

+    0x8089, 0x8089, 0x0CBD, 0x808A, 0x808A, 0x44A1, 0x808B, 0x808B, 0x09CA,

+    0x808C, 0x808C, 0x0814, 0x808D, 0x8092, 0x44A2, 0x8093, 0x8093, 0x1971,

+    0x8094, 0x8095, 0x44A8, 0x8096, 0x8096, 0x0F6F, 0x8097, 0x8097, 0x44AA,

+    0x8098, 0x8098, 0x11E1, 0x8099, 0x8099, 0x44AB, 0x809A, 0x809A, 0x0606,

+    0x809B, 0x809B, 0x06D3, 0x809C, 0x809C, 0x1970, 0x809D, 0x809D, 0x06C9,

+    0x809E, 0x809E, 0x44AC, 0x809F, 0x809F, 0x196F, 0x80A0, 0x80A0, 0x04CB,

+    0x80A1, 0x80A1, 0x0722, 0x80A2, 0x80A2, 0x11AA, 0x80A3, 0x80A3, 0x44AD,

+    0x80A4, 0x80A4, 0x0691, 0x80A5, 0x80A5, 0x0667, 0x80A6, 0x80A8, 0x44AE,

+    0x80A9, 0x80A9, 0x085A, 0x80AA, 0x80AA, 0x065B, 0x80AB, 0x80AB, 0x1976,

+    0x80AC, 0x80AC, 0x44B1, 0x80AD, 0x80AD, 0x1977, 0x80AE, 0x80AE, 0x03C4,

+    0x80AF, 0x80AF, 0x095C, 0x80B0, 0x80B0, 0x44B2, 0x80B1, 0x80B1, 0x1975,

+    0x80B2, 0x80B2, 0x10E2, 0x80B3, 0x80B3, 0x44B3, 0x80B4, 0x80B4, 0x1978,

+    0x80B5, 0x80B6, 0x44B4, 0x80B7, 0x80B7, 0x1979, 0x80B8, 0x80B9, 0x44B6,

+    0x80BA, 0x80BA, 0x066B, 0x80BB, 0x80BB, 0x44B8, 0x80BC, 0x80BC, 0x1972,

+    0x80BD, 0x80BD, 0x1974, 0x80BE, 0x80BE, 0x0D2F, 0x80BF, 0x80BF, 0x11D6,

+    0x80C0, 0x80C0, 0x116E, 0x80C1, 0x80C1, 0x0F7D, 0x80C2, 0x80C2, 0x197F,

+    0x80C3, 0x80C3, 0x0EC7, 0x80C4, 0x80C4, 0x1980, 0x80C5, 0x80C5, 0x44B9,

+    0x80C6, 0x80C6, 0x0589, 0x80C7, 0x80CB, 0x44BA, 0x80CC, 0x80CC, 0x041C,

+    0x80CD, 0x80CD, 0x1982, 0x80CE, 0x80CE, 0x0DF8, 0x80CF, 0x80D5, 0x44BF,

+    0x80D6, 0x80D6, 0x0B97, 0x80D7, 0x80D7, 0x1983, 0x80D8, 0x80D8, 0x44C6,

+    0x80D9, 0x80D9, 0x1981, 0x80DA, 0x80DA, 0x0BA0, 0x80DB, 0x80DB, 0x197E,

+    0x80DC, 0x80DC, 0x0D3B, 0x80DD, 0x80DD, 0x1985, 0x80DE, 0x80DE, 0x0406,

+    0x80DF, 0x80E0, 0x44C7, 0x80E1, 0x80E1, 0x07B1, 0x80E2, 0x80E3, 0x44C9,

+    0x80E4, 0x80E4, 0x126D, 0x80E5, 0x80E5, 0x1BC7, 0x80E6, 0x80E6, 0x44CB,

+    0x80E7, 0x80EA, 0x197A, 0x80EB, 0x80EB, 0x1986, 0x80EC, 0x80EC, 0x179A,

+    0x80ED, 0x80ED, 0x1989, 0x80EE, 0x80EE, 0x44CC, 0x80EF, 0x80EF, 0x0975,

+    0x80F0, 0x80F0, 0x104F, 0x80F1, 0x80F1, 0x1987, 0x80F2, 0x80F2, 0x198C,

+    0x80F3, 0x80F3, 0x06E7, 0x80F4, 0x80F4, 0x1988, 0x80F5, 0x80F5, 0x44CD,

+    0x80F6, 0x80F6, 0x088B, 0x80F7, 0x80F7, 0x44CE, 0x80F8, 0x80F8, 0x0FA3,

+    0x80F9, 0x80F9, 0x44CF, 0x80FA, 0x80FA, 0x03C2, 0x80FB, 0x80FB, 0x44D0,

+    0x80FC, 0x80FC, 0x198D, 0x80FD, 0x80FD, 0x0B3F, 0x80FE, 0x80FF, 0x44D1,

+    0x8100, 0x8101, 0x44D3, 0x8102, 0x8102, 0x11AB, 0x8103, 0x8104, 0x44D5,

+    0x8105, 0x8105, 0x21D2, 0x8106, 0x8106, 0x0563, 0x8107, 0x8108, 0x44D7,

+    0x8109, 0x8109, 0x0A9D, 0x810A, 0x810A, 0x082C, 0x810B, 0x810C, 0x44D9,

+    0x810D, 0x810E, 0x198A, 0x810F, 0x810F, 0x1123, 0x8110, 0x8110, 0x0C09,

+    0x8111, 0x8111, 0x0B37, 0x8112, 0x8112, 0x198F, 0x8113, 0x8113, 0x0B68,

+    0x8114, 0x8114, 0x1309, 0x8115, 0x8115, 0x44DB, 0x8116, 0x8116, 0x0478,

+    0x8117, 0x8117, 0x44DC, 0x8118, 0x8118, 0x1994, 0x8119, 0x8119, 0x44DD,

+    0x811A, 0x811A, 0x0896, 0x811B, 0x811B, 0x24C7, 0x811C, 0x811D, 0x44DE,

+    0x811E, 0x811E, 0x1992, 0x811F, 0x812B, 0x44E0, 0x812C, 0x812C, 0x1993,

+    0x812D, 0x812E, 0x44ED, 0x812F, 0x812F, 0x06A7, 0x8130, 0x8130, 0x44EF,

+    0x8131, 0x8131, 0x0E82, 0x8132, 0x8132, 0x1995, 0x8133, 0x8135, 0x44F0,

+    0x8136, 0x8136, 0x1991, 0x8137, 0x8137, 0x44F3, 0x8138, 0x8138, 0x09FC,

+    0x8139, 0x8139, 0x2279, 0x813A, 0x813D, 0x44F4, 0x813E, 0x813E, 0x0BC1,

+    0x813F, 0x8145, 0x44F8, 0x8146, 0x8146, 0x0E46, 0x8147, 0x8147, 0x44FF,

+    0x8148, 0x8148, 0x1996, 0x8149, 0x8149, 0x4500, 0x814A, 0x814A, 0x099B,

+    0x814B, 0x814B, 0x103F, 0x814C, 0x814C, 0x1997, 0x814D, 0x814D, 0x4501,

+    0x814E, 0x814E, 0x2123, 0x814F, 0x814F, 0x4502, 0x8150, 0x8150, 0x06AA,

+    0x8151, 0x8151, 0x06A8, 0x8152, 0x8152, 0x4503, 0x8153, 0x8153, 0x1998,

+    0x8154, 0x8154, 0x0C38, 0x8155, 0x8155, 0x0EA4, 0x8156, 0x8156, 0x24C5,

+    0x8157, 0x8158, 0x4504, 0x8159, 0x815A, 0x199A, 0x815B, 0x815F, 0x4506,

+    0x8160, 0x8160, 0x199D, 0x8161, 0x8161, 0x24C9, 0x8162, 0x8164, 0x450B,

+    0x8165, 0x8165, 0x0F93, 0x8166, 0x8166, 0x2094, 0x8167, 0x8167, 0x19A2,

+    0x8168, 0x8168, 0x450E, 0x8169, 0x8169, 0x199E, 0x816A, 0x816A, 0x450F,

+    0x816B, 0x816B, 0x2296, 0x816C, 0x816C, 0x4510, 0x816D, 0x816D, 0x19A1,

+    0x816E, 0x816E, 0x0CD4, 0x816F, 0x816F, 0x4511, 0x8170, 0x8170, 0x1025,

+    0x8171, 0x8171, 0x199C, 0x8172, 0x8173, 0x4512, 0x8174, 0x8174, 0x1999,

+    0x8175, 0x8177, 0x4514, 0x8178, 0x8178, 0x1E77, 0x8179, 0x8179, 0x06B4,

+    0x817A, 0x817A, 0x0F46, 0x817B, 0x817B, 0x0B48, 0x817C, 0x817D, 0x199F,

+    0x817E, 0x817E, 0x0E2D, 0x817F, 0x817F, 0x0E79, 0x8180, 0x8180, 0x03FD,

+    0x8181, 0x8181, 0x4517, 0x8182, 0x8182, 0x19A6, 0x8183, 0x8187, 0x4518,

+    0x8188, 0x8188, 0x19A5, 0x8189, 0x8189, 0x451D, 0x818A, 0x818A, 0x0479,

+    0x818B, 0x818E, 0x451E, 0x818F, 0x818F, 0x06DB, 0x8190, 0x8190, 0x4522,

+    0x8191, 0x8191, 0x19A7, 0x8192, 0x8197, 0x4523, 0x8198, 0x8198, 0x0455,

+    0x8199, 0x8199, 0x4529, 0x819A, 0x819A, 0x1F06, 0x819B, 0x819B, 0x0E18,

+    0x819C, 0x819C, 0x0B07, 0x819D, 0x819D, 0x0F12, 0x819E, 0x819F, 0x452A,

+    0x81A0, 0x81A0, 0x1FA5, 0x81A1, 0x81A2, 0x452C, 0x81A3, 0x81A3, 0x19A9,

+    0x81A4, 0x81A5, 0x452E, 0x81A6, 0x81A6, 0x19B0, 0x81A7, 0x81A7, 0x4530,

+    0x81A8, 0x81A8, 0x0BB3, 0x81A9, 0x81A9, 0x2099, 0x81AA, 0x81AA, 0x19AA,

+    0x81AB, 0x81B2, 0x4531, 0x81B3, 0x81B3, 0x0CFE, 0x81B4, 0x81B9, 0x4539,

+    0x81BA, 0x81BA, 0x1641, 0x81BB, 0x81BB, 0x19AE, 0x81BC, 0x81BC, 0x453F,

+    0x81BD, 0x81BD, 0x1EAD, 0x81BE, 0x81BE, 0x24C8, 0x81BF, 0x81BF, 0x20A8,

+    0x81C0, 0x81C0, 0x0E7F, 0x81C1, 0x81C1, 0x19AF, 0x81C2, 0x81C2, 0x0444,

+    0x81C3, 0x81C3, 0x109C, 0x81C4, 0x81C5, 0x4540, 0x81C6, 0x81C6, 0x1063,

+    0x81C7, 0x81C8, 0x4542, 0x81C9, 0x81C9, 0x201F, 0x81CA, 0x81CA, 0x19AD,

+    0x81CB, 0x81CB, 0x4544, 0x81CC, 0x81CC, 0x19AB, 0x81CD, 0x81CD, 0x20C5,

+    0x81CE, 0x81CE, 0x4545, 0x81CF, 0x81CF, 0x24CA, 0x81D0, 0x81D7, 0x4546,

+    0x81D8, 0x81D8, 0x1FF0, 0x81D9, 0x81D9, 0x454E, 0x81DA, 0x81DA, 0x24C6,

+    0x81DB, 0x81DE, 0x454F, 0x81DF, 0x81DF, 0x225D, 0x81E0, 0x81E0, 0x22DE,

+    0x81E1, 0x81E2, 0x4553, 0x81E3, 0x81E3, 0x04E1, 0x81E4, 0x81E6, 0x4555,

+    0x81E7, 0x81E7, 0x1902, 0x81E8, 0x81E8, 0x202C, 0x81E9, 0x81E9, 0x4558,

+    0x81EA, 0x81EA, 0x1231, 0x81EB, 0x81EB, 0x4559, 0x81EC, 0x81EC, 0x1CA9,

+    0x81ED, 0x81ED, 0x0519, 0x81EE, 0x81F2, 0x455A, 0x81F3, 0x81F4, 0x11C0,

+    0x81F5, 0x81F9, 0x455F, 0x81FA, 0x81FA, 0x2161, 0x81FB, 0x81FB, 0x118A,

+    0x81FC, 0x81FC, 0x08F9, 0x81FD, 0x81FD, 0x4564, 0x81FE, 0x81FE, 0x1CA5,

+    0x81FF, 0x81FF, 0x4565, 0x8200, 0x8200, 0x102F, 0x8201, 0x8202, 0x1CA6,

+    0x8203, 0x8203, 0x4566, 0x8204, 0x8204, 0x1CA8, 0x8205, 0x8205, 0x08FA,

+    0x8206, 0x8206, 0x10C4, 0x8207, 0x8207, 0x223B, 0x8208, 0x8208, 0x21D9,

+    0x8209, 0x8209, 0x1FCB, 0x820A, 0x820A, 0x1FC9, 0x820B, 0x820B, 0x4567,

+    0x820C, 0x820D, 0x0D19, 0x820E, 0x820F, 0x4568, 0x8210, 0x8210, 0x1C62,

+    0x8211, 0x8211, 0x456A, 0x8212, 0x8212, 0x0D7D, 0x8213, 0x8213, 0x456B,

+    0x8214, 0x8214, 0x0E45, 0x8215, 0x821A, 0x456C, 0x821B, 0x821B, 0x1618,

+    0x821C, 0x821C, 0x0DA9, 0x821D, 0x821D, 0x4572, 0x821E, 0x821E, 0x0EF7,

+    0x821F, 0x821F, 0x11DA, 0x8220, 0x8220, 0x4573, 0x8221, 0x8223, 0x1CAB,

+    0x8224, 0x8227, 0x4574, 0x8228, 0x8228, 0x1CB0, 0x8229, 0x8229, 0x4578,

+    0x822A, 0x822A, 0x0774, 0x822B, 0x822B, 0x1CB1, 0x822C, 0x822C, 0x03EE,

+    0x822D, 0x822D, 0x1CAE, 0x822E, 0x822E, 0x4579, 0x822F, 0x822F, 0x1CAF,

+    0x8230, 0x8230, 0x0873, 0x8231, 0x8231, 0x049C, 0x8232, 0x8232, 0x457A,

+    0x8233, 0x8234, 0x1CB4, 0x8235, 0x8235, 0x0625, 0x8236, 0x8236, 0x0477,

+    0x8237, 0x8237, 0x0F3C, 0x8238, 0x8238, 0x1CB2, 0x8239, 0x8239, 0x052F,

+    0x823A, 0x823A, 0x457B, 0x823B, 0x823B, 0x1CB3, 0x823C, 0x823D, 0x457C,

+    0x823E, 0x823E, 0x1CB6, 0x823F, 0x8243, 0x457E, 0x8244, 0x8244, 0x1CB7,

+    0x8245, 0x8246, 0x4583, 0x8247, 0x8247, 0x0E58, 0x8248, 0x8248, 0x4585,

+    0x8249, 0x8249, 0x1CB8, 0x824A, 0x824A, 0x4586, 0x824B, 0x824B, 0x1CB9,

+    0x824C, 0x824E, 0x4587, 0x824F, 0x824F, 0x1CBA, 0x8250, 0x8257, 0x458A,

+    0x8258, 0x8258, 0x0DC7, 0x8259, 0x8259, 0x1E61, 0x825A, 0x825A, 0x1CBB,

+    0x825B, 0x825E, 0x4592, 0x825F, 0x825F, 0x1CBC, 0x8260, 0x8263, 0x4596,

+    0x8264, 0x8264, 0x25EF, 0x8265, 0x8265, 0x459A, 0x8266, 0x8266, 0x1F98,

+    0x8267, 0x8267, 0x459B, 0x8268, 0x8268, 0x1CBD, 0x8269, 0x826A, 0x459C,

+    0x826B, 0x826B, 0x25F0, 0x826C, 0x826D, 0x459E, 0x826E, 0x826E, 0x1CDC,

+    0x826F, 0x826F, 0x0A05, 0x8270, 0x8270, 0x085B, 0x8271, 0x8271, 0x1F88,

+    0x8272, 0x8272, 0x0CE4, 0x8273, 0x8273, 0x1007, 0x8274, 0x8274, 0x1771,

+    0x8275, 0x8276, 0x45A0, 0x8277, 0x8277, 0x21F8, 0x8278, 0x8278, 0x45A2,

+    0x8279, 0x8279, 0x13E1, 0x827A, 0x827A, 0x105C, 0x827B, 0x827C, 0x45A3,

+    0x827D, 0x827D, 0x13E2, 0x827E, 0x827E, 0x03B7, 0x827F, 0x827F, 0x13E3,

+    0x8280, 0x8281, 0x45A5, 0x8282, 0x8282, 0x08AB, 0x8283, 0x8283, 0x45A7,

+    0x8284, 0x8284, 0x13E7, 0x8285, 0x8287, 0x45A8, 0x8288, 0x8288, 0x1278,

+    0x8289, 0x8289, 0x45AB, 0x828A, 0x828A, 0x13E5, 0x828B, 0x828B, 0x10D8,

+    0x828C, 0x828C, 0x45AC, 0x828D, 0x828D, 0x0D0F, 0x828E, 0x828E, 0x13E8,

+    0x828F, 0x828F, 0x13E4, 0x8290, 0x8290, 0x45AD, 0x8291, 0x8291, 0x13E9,

+    0x8292, 0x8292, 0x0AA7, 0x8293, 0x8296, 0x45AE, 0x8297, 0x8297, 0x13EA,

+    0x8298, 0x8298, 0x13F3, 0x8299, 0x8299, 0x13EB, 0x829A, 0x829B, 0x45B2,

+    0x829C, 0x829C, 0x0EEE, 0x829D, 0x829D, 0x11A4, 0x829E, 0x829E, 0x45B4,

+    0x829F, 0x829F, 0x13FD, 0x82A0, 0x82A0, 0x45B5, 0x82A1, 0x82A1, 0x13FB,

+    0x82A2, 0x82A3, 0x45B6, 0x82A4, 0x82A4, 0x1400, 0x82A5, 0x82A5, 0x08B7,

+    0x82A6, 0x82A6, 0x0A52, 0x82A7, 0x82A7, 0x45B8, 0x82A8, 0x82A8, 0x13E6,

+    0x82A9, 0x82A9, 0x13F9, 0x82AA, 0x82AA, 0x13FC, 0x82AB, 0x82AB, 0x13EC,

+    0x82AC, 0x82AC, 0x066F, 0x82AD, 0x82AD, 0x03D0, 0x82AE, 0x82AE, 0x13F5,

+    0x82AF, 0x82AF, 0x0F89, 0x82B0, 0x82B0, 0x13EF, 0x82B1, 0x82B1, 0x07BD,

+    0x82B2, 0x82B2, 0x45B9, 0x82B3, 0x82B3, 0x0659, 0x82B4, 0x82B4, 0x13FA,

+    0x82B5, 0x82B6, 0x45BA, 0x82B7, 0x82B7, 0x13F4, 0x82B8, 0x82B8, 0x13ED,

+    0x82B9, 0x82B9, 0x0C58, 0x82BA, 0x82BA, 0x45BC, 0x82BB, 0x82BB, 0x2322,

+    0x82BC, 0x82BC, 0x45BD, 0x82BD, 0x82BD, 0x0FE8, 0x82BE, 0x82BE, 0x13EE,

+    0x82BF, 0x82C0, 0x45BE, 0x82C1, 0x82C1, 0x13F8, 0x82C2, 0x82C3, 0x45C0,

+    0x82C4, 0x82C4, 0x13FE, 0x82C5, 0x82C6, 0x45C2, 0x82C7, 0x82C7, 0x0EBC,

+    0x82C8, 0x82C8, 0x13F0, 0x82C9, 0x82C9, 0x45C4, 0x82CA, 0x82CA, 0x13F1,

+    0x82CB, 0x82CC, 0x13F6, 0x82CD, 0x82CD, 0x049B, 0x82CE, 0x82CE, 0x13FF,

+    0x82CF, 0x82CF, 0x0DCA, 0x82D0, 0x82D0, 0x45C5, 0x82D1, 0x82D1, 0x10FA,

+    0x82D2, 0x82D2, 0x1409, 0x82D3, 0x82D3, 0x140D, 0x82D4, 0x82D4, 0x0DF9,

+    0x82D5, 0x82D5, 0x1414, 0x82D6, 0x82D6, 0x45C6, 0x82D7, 0x82D7, 0x0AEC,

+    0x82D8, 0x82D8, 0x140A, 0x82D9, 0x82DA, 0x45C7, 0x82DB, 0x82DB, 0x094E,

+    0x82DC, 0x82DC, 0x1407, 0x82DD, 0x82DD, 0x45C9, 0x82DE, 0x82DE, 0x0405,

+    0x82DF, 0x82DF, 0x070F, 0x82E0, 0x82E0, 0x1413, 0x82E1, 0x82E1, 0x1401,

+    0x82E2, 0x82E2, 0x45CA, 0x82E3, 0x82E3, 0x13F2, 0x82E4, 0x82E4, 0x1404,

+    0x82E5, 0x82E5, 0x0CCF, 0x82E6, 0x82E6, 0x096D, 0x82E7, 0x82E7, 0x2336,

+    0x82E8, 0x82EA, 0x45CB, 0x82EB, 0x82EB, 0x0CF4, 0x82EC, 0x82EE, 0x45CE,

+    0x82EF, 0x82EF, 0x0426, 0x82F0, 0x82F0, 0x45D1, 0x82F1, 0x82F1, 0x1087,

+    0x82F2, 0x82F3, 0x45D2, 0x82F4, 0x82F4, 0x1408, 0x82F5, 0x82F6, 0x45D4,

+    0x82F7, 0x82F7, 0x1403, 0x82F8, 0x82F8, 0x45D6, 0x82F9, 0x82F9, 0x0BDA,

+    0x82FA, 0x82FA, 0x45D7, 0x82FB, 0x82FB, 0x140C, 0x82FC, 0x82FF, 0x45D8,

+    0x8300, 0x8300, 0x45DC, 0x8301, 0x8301, 0x121F, 0x8302, 0x8302, 0x0AB4,

+    0x8303, 0x8303, 0x0653, 0x8304, 0x8304, 0x0C4E, 0x8305, 0x8305, 0x0AAE,

+    0x8306, 0x8306, 0x1410, 0x8307, 0x8307, 0x1406, 0x8308, 0x8308, 0x1419,

+    0x8309, 0x8309, 0x1402, 0x830A, 0x830B, 0x45DD, 0x830C, 0x830C, 0x140B,

+    0x830D, 0x830D, 0x45DF, 0x830E, 0x830E, 0x08D4, 0x830F, 0x830F, 0x1405,

+    0x8310, 0x8310, 0x45E0, 0x8311, 0x8311, 0x140E, 0x8312, 0x8313, 0x45E1,

+    0x8314, 0x8315, 0x1411, 0x8316, 0x8316, 0x45E3, 0x8317, 0x8317, 0x1426,

+    0x8318, 0x8319, 0x45E4, 0x831A, 0x831A, 0x140F, 0x831B, 0x831B, 0x142E,

+    0x831C, 0x831C, 0x1415, 0x831D, 0x8326, 0x45E6, 0x8327, 0x8327, 0x085E,

+    0x8328, 0x8328, 0x0547, 0x8329, 0x832A, 0x45F0, 0x832B, 0x832B, 0x0AA8,

+    0x832C, 0x832C, 0x04AE, 0x832D, 0x832D, 0x1428, 0x832E, 0x832E, 0x45F2,

+    0x832F, 0x832F, 0x1420, 0x8330, 0x8330, 0x45F3, 0x8331, 0x8331, 0x141D,

+    0x8332, 0x8332, 0x45F4, 0x8333, 0x8333, 0x142A, 0x8334, 0x8334, 0x141C,

+    0x8335, 0x8335, 0x1077, 0x8336, 0x8336, 0x04AF, 0x8337, 0x8337, 0x45F5,

+    0x8338, 0x8338, 0x0CB2, 0x8339, 0x8339, 0x0CBE, 0x833A, 0x833A, 0x1429,

+    0x833B, 0x833B, 0x45F6, 0x833C, 0x833C, 0x141B, 0x833D, 0x833F, 0x45F7,

+    0x8340, 0x8340, 0x1425, 0x8341, 0x8342, 0x45FA, 0x8343, 0x8343, 0x1423,

+    0x8344, 0x8345, 0x45FC, 0x8346, 0x8346, 0x08D2, 0x8347, 0x8347, 0x1422,

+    0x8348, 0x8348, 0x45FE, 0x8349, 0x8349, 0x04A4, 0x834A, 0x834E, 0x45FF,

+    0x834F, 0x834F, 0x1421, 0x8350, 0x8350, 0x0869, 0x8351, 0x8351, 0x1416,

+    0x8352, 0x8352, 0x07D9, 0x8353, 0x8353, 0x4604, 0x8354, 0x8354, 0x09DE,

+    0x8355, 0x8359, 0x4605, 0x835A, 0x835A, 0x0847, 0x835B, 0x835C, 0x1417,

+    0x835D, 0x835D, 0x460A, 0x835E, 0x835E, 0x141F, 0x835F, 0x835F, 0x1424,

+    0x8360, 0x8360, 0x1427, 0x8361, 0x8361, 0x0595, 0x8362, 0x8362, 0x460B,

+    0x8363, 0x8363, 0x0CB4, 0x8364, 0x8364, 0x07FC, 0x8365, 0x8365, 0x142C,

+    0x8366, 0x8366, 0x142B, 0x8367, 0x8367, 0x1090, 0x8368, 0x8368, 0x142D,

+    0x8369, 0x8369, 0x142F, 0x836A, 0x836A, 0x1431, 0x836B, 0x836B, 0x1078,

+    0x836C, 0x836C, 0x1430, 0x836D, 0x836E, 0x1432, 0x836F, 0x836F, 0x1030,

+    0x8370, 0x8376, 0x460C, 0x8377, 0x8377, 0x0780, 0x8378, 0x8378, 0x1435,

+    0x8379, 0x837A, 0x4613, 0x837B, 0x837B, 0x1442, 0x837C, 0x837C, 0x143D,

+    0x837D, 0x837D, 0x1440, 0x837E, 0x8384, 0x4615, 0x8385, 0x8385, 0x143C,

+    0x8386, 0x8386, 0x0BED, 0x8387, 0x8388, 0x461C, 0x8389, 0x8389, 0x09DD,

+    0x838A, 0x838A, 0x22AB, 0x838B, 0x838D, 0x461E, 0x838E, 0x838E, 0x0CE8,

+    0x838F, 0x8391, 0x4621, 0x8392, 0x8392, 0x141A, 0x8393, 0x8393, 0x143A,

+    0x8394, 0x8395, 0x4624, 0x8396, 0x8396, 0x1FBF, 0x8397, 0x8397, 0x4626,

+    0x8398, 0x8398, 0x1443, 0x8399, 0x839A, 0x4627, 0x839B, 0x839B, 0x141E,

+    0x839C, 0x839C, 0x143B, 0x839D, 0x839D, 0x4629, 0x839E, 0x839E, 0x1444,

+    0x839F, 0x839F, 0x462A, 0x83A0, 0x83A0, 0x1438, 0x83A1, 0x83A1, 0x462B,

+    0x83A2, 0x83A2, 0x1F7D, 0x83A3, 0x83A6, 0x462C, 0x83A7, 0x83A7, 0x2333,

+    0x83A8, 0x83A8, 0x1445, 0x83A9, 0x83A9, 0x143F, 0x83AA, 0x83AA, 0x1439,

+    0x83AB, 0x83AB, 0x0B0D, 0x83AC, 0x83AF, 0x4630, 0x83B0, 0x83B0, 0x1434,

+    0x83B1, 0x83B1, 0x099E, 0x83B2, 0x83B2, 0x09F4, 0x83B3, 0x83B4, 0x1436,

+    0x83B5, 0x83B5, 0x4634, 0x83B6, 0x83B6, 0x143E, 0x83B7, 0x83B7, 0x0806,

+    0x83B8, 0x83B8, 0x1441, 0x83B9, 0x83B9, 0x108D, 0x83BA, 0x83BA, 0x1446,

+    0x83BB, 0x83BB, 0x4635, 0x83BC, 0x83BC, 0x1447, 0x83BD, 0x83BD, 0x0AAC,

+    0x83BE, 0x83BF, 0x4636, 0x83C0, 0x83C0, 0x145E, 0x83C1, 0x83C1, 0x1448,

+    0x83C2, 0x83C4, 0x4638, 0x83C5, 0x83C5, 0x145D, 0x83C6, 0x83C6, 0x463B,

+    0x83C7, 0x83C7, 0x0716, 0x83C8, 0x83C9, 0x463C, 0x83CA, 0x83CA, 0x0904,

+    0x83CB, 0x83CB, 0x463E, 0x83CC, 0x83CC, 0x0929, 0x83CD, 0x83CE, 0x463F,

+    0x83CF, 0x83CF, 0x0781, 0x83D0, 0x83D3, 0x4641, 0x83D4, 0x83D4, 0x1456,

+    0x83D5, 0x83D5, 0x4645, 0x83D6, 0x83D6, 0x1451, 0x83D7, 0x83D7, 0x4646,

+    0x83D8, 0x83D8, 0x144B, 0x83D9, 0x83DB, 0x4647, 0x83DC, 0x83DC, 0x0492,

+    0x83DD, 0x83DD, 0x144F, 0x83DE, 0x83DE, 0x464A, 0x83DF, 0x83DF, 0x1457,

+    0x83E0, 0x83E0, 0x046B, 0x83E1, 0x83E1, 0x1461, 0x83E2, 0x83E4, 0x464B,

+    0x83E5, 0x83E5, 0x144A, 0x83E6, 0x83E8, 0x464E, 0x83E9, 0x83E9, 0x0BEF,

+    0x83EA, 0x83EA, 0x145C, 0x83EB, 0x83EE, 0x4651, 0x83EF, 0x83EF, 0x1F4D,

+    0x83F0, 0x83F0, 0x1460, 0x83F1, 0x83F1, 0x0A2B, 0x83F2, 0x83F2, 0x0663,

+    0x83F3, 0x83F7, 0x4655, 0x83F8, 0x83F9, 0x145A, 0x83FA, 0x83FC, 0x465A,

+    0x83FD, 0x83FD, 0x1450, 0x83FE, 0x83FF, 0x465D, 0x8400, 0x8400, 0x465F,

+    0x8401, 0x8401, 0x1449, 0x8402, 0x8402, 0x4660, 0x8403, 0x8403, 0x1459,

+    0x8404, 0x8404, 0x0E24, 0x8405, 0x8405, 0x4661, 0x8406, 0x8406, 0x1455,

+    0x8407, 0x8407, 0x2334, 0x8408, 0x8409, 0x4662, 0x840A, 0x840A, 0x1FF1,

+    0x840B, 0x840B, 0x144E, 0x840C, 0x840C, 0x0ACD, 0x840D, 0x840D, 0x0BDB,

+    0x840E, 0x840E, 0x0EBD, 0x840F, 0x840F, 0x1458, 0x8410, 0x8410, 0x4664,

+    0x8411, 0x8411, 0x1454, 0x8412, 0x8417, 0x4665, 0x8418, 0x8418, 0x144D,

+    0x8419, 0x841B, 0x466B, 0x841C, 0x841C, 0x1452, 0x841D, 0x841D, 0x0A83,

+    0x841E, 0x8423, 0x466E, 0x8424, 0x8425, 0x108E, 0x8426, 0x8426, 0x145F,

+    0x8427, 0x8427, 0x0F61, 0x8428, 0x8428, 0x0CD3, 0x8429, 0x842B, 0x4674,

+    0x842C, 0x842C, 0x218B, 0x842D, 0x8430, 0x4677, 0x8431, 0x8431, 0x1472,

+    0x8432, 0x8434, 0x467B, 0x8435, 0x8435, 0x2349, 0x8436, 0x8437, 0x467E,

+    0x8438, 0x8438, 0x1453, 0x8439, 0x843B, 0x4680, 0x843C, 0x843C, 0x146C,

+    0x843D, 0x843D, 0x0A8B, 0x843E, 0x8445, 0x4683, 0x8446, 0x8446, 0x146D,

+    0x8447, 0x8448, 0x468B, 0x8449, 0x8449, 0x220B, 0x844A, 0x8450, 0x468D,

+    0x8451, 0x8451, 0x1463, 0x8452, 0x8452, 0x2346, 0x8453, 0x8456, 0x4694,

+    0x8457, 0x8457, 0x11F7, 0x8458, 0x8458, 0x4698, 0x8459, 0x8459, 0x1465,

+    0x845A, 0x845A, 0x1464, 0x845B, 0x845B, 0x06EB, 0x845C, 0x845C, 0x1462,

+    0x845D, 0x8460, 0x4699, 0x8461, 0x8461, 0x0BEE, 0x8462, 0x8462, 0x469D,

+    0x8463, 0x8463, 0x05EC, 0x8464, 0x8464, 0x2347, 0x8465, 0x8465, 0x469E,

+    0x8466, 0x8466, 0x2193, 0x8467, 0x8468, 0x469F, 0x8469, 0x8469, 0x146E,

+    0x846A, 0x846A, 0x46A1, 0x846B, 0x846B, 0x07B0, 0x846C, 0x846C, 0x1124,

+    0x846D, 0x846D, 0x1473, 0x846E, 0x846E, 0x46A2, 0x846F, 0x846F, 0x26A1,

+    0x8470, 0x8470, 0x46A3, 0x8471, 0x8471, 0x0553, 0x8472, 0x8472, 0x46A4,

+    0x8473, 0x8473, 0x1466, 0x8474, 0x8474, 0x46A5, 0x8475, 0x8475, 0x0988,

+    0x8476, 0x8476, 0x146F, 0x8477, 0x8477, 0x1F62, 0x8478, 0x8478, 0x146B,

+    0x8479, 0x8479, 0x46A6, 0x847A, 0x847A, 0x1469, 0x847B, 0x8481, 0x46A7,

+    0x8482, 0x8482, 0x05BA, 0x8483, 0x8486, 0x46AE, 0x8487, 0x8488, 0x1467,

+    0x8489, 0x8489, 0x146A, 0x848A, 0x848A, 0x46B2, 0x848B, 0x848B, 0x0880,

+    0x848C, 0x848C, 0x1470, 0x848D, 0x848D, 0x46B3, 0x848E, 0x848E, 0x1471,

+    0x848F, 0x8492, 0x46B4, 0x8493, 0x8493, 0x234D, 0x8494, 0x8494, 0x2348,

+    0x8495, 0x8496, 0x46B8, 0x8497, 0x8497, 0x1481, 0x8498, 0x8498, 0x46BA,

+    0x8499, 0x8499, 0x0ACE, 0x849A, 0x849B, 0x46BB, 0x849C, 0x849C, 0x0DD7,

+    0x849D, 0x84A0, 0x46BD, 0x84A1, 0x84A1, 0x147E, 0x84A2, 0x84AE, 0x46C1,

+    0x84AF, 0x84AF, 0x1297, 0x84B0, 0x84B1, 0x46CE, 0x84B2, 0x84B2, 0x0BF0,

+    0x84B3, 0x84B3, 0x46D0, 0x84B4, 0x84B4, 0x1480, 0x84B5, 0x84B7, 0x46D1,

+    0x84B8, 0x84B8, 0x1195, 0x84B9, 0x84B9, 0x147F, 0x84BA, 0x84BA, 0x147C,

+    0x84BB, 0x84BB, 0x46D4, 0x84BC, 0x84BC, 0x1E60, 0x84BD, 0x84BD, 0x1478,

+    0x84BE, 0x84BE, 0x46D5, 0x84BF, 0x84BF, 0x147B, 0x84C0, 0x84C0, 0x2345,

+    0x84C1, 0x84C1, 0x1474, 0x84C2, 0x84C3, 0x46D6, 0x84C4, 0x84C4, 0x0FB9,

+    0x84C5, 0x84C8, 0x46D8, 0x84C9, 0x84C9, 0x0CB3, 0x84CA, 0x84CA, 0x147A,

+    0x84CB, 0x84CB, 0x1F12, 0x84CC, 0x84CC, 0x46DC, 0x84CD, 0x84CD, 0x1475,

+    0x84CE, 0x84CF, 0x46DD, 0x84D0, 0x84D0, 0x1476, 0x84D1, 0x84D1, 0x0DE7,

+    0x84D2, 0x84D2, 0x46DF, 0x84D3, 0x84D3, 0x1479, 0x84D4, 0x84D5, 0x46E0,

+    0x84D6, 0x84D6, 0x0436, 0x84D7, 0x84DC, 0x46E2, 0x84DD, 0x84DD, 0x09A1,

+    0x84DE, 0x84DE, 0x46E8, 0x84DF, 0x84DF, 0x082E, 0x84E0, 0x84E0, 0x147D,

+    0x84E1, 0x84E2, 0x46E9, 0x84E3, 0x84E3, 0x1483, 0x84E4, 0x84E4, 0x46EB,

+    0x84E5, 0x84E5, 0x1482, 0x84E6, 0x84E6, 0x1477, 0x84E7, 0x84EB, 0x46EC,

+    0x84EC, 0x84EC, 0x0BAF, 0x84ED, 0x84ED, 0x46F1, 0x84EE, 0x84EE, 0x2018,

+    0x84EF, 0x84EF, 0x2335, 0x84F0, 0x84F0, 0x1487, 0x84F1, 0x84FB, 0x46F2,

+    0x84FC, 0x84FC, 0x148E, 0x84FD, 0x84FD, 0x233C, 0x84FE, 0x84FE, 0x46FD,

+    0x84FF, 0x84FF, 0x148D, 0x8500, 0x850B, 0x46FE, 0x850C, 0x850C, 0x1484,

+    0x850D, 0x8510, 0x470A, 0x8511, 0x8511, 0x0AF4, 0x8512, 0x8512, 0x470E,

+    0x8513, 0x8513, 0x0AA2, 0x8514, 0x8514, 0x266F, 0x8515, 0x8516, 0x470F,

+    0x8517, 0x8517, 0x1182, 0x8518, 0x8519, 0x4711, 0x851A, 0x851A, 0x0EC4,

+    0x851B, 0x851D, 0x4713, 0x851E, 0x851E, 0x2351, 0x851F, 0x851F, 0x1489,

+    0x8520, 0x8520, 0x4716, 0x8521, 0x8521, 0x0493, 0x8522, 0x8522, 0x4717,

+    0x8523, 0x8523, 0x1FA0, 0x8524, 0x8525, 0x4718, 0x8526, 0x8526, 0x2338,

+    0x8527, 0x852A, 0x471A, 0x852B, 0x852B, 0x0B4B, 0x852C, 0x852C, 0x0D76,

+    0x852D, 0x852D, 0x221B, 0x852E, 0x8536, 0x471E, 0x8537, 0x8537, 0x0C3B,

+    0x8538, 0x8538, 0x1486, 0x8539, 0x8539, 0x1488, 0x853A, 0x853A, 0x148A,

+    0x853B, 0x853B, 0x148C, 0x853C, 0x853C, 0x03B5, 0x853D, 0x853D, 0x0437,

+    0x853E, 0x8540, 0x4727, 0x8541, 0x8541, 0x2342, 0x8542, 0x8542, 0x472A,

+    0x8543, 0x8543, 0x1496, 0x8544, 0x8545, 0x472B, 0x8546, 0x8546, 0x234F,

+    0x8547, 0x8547, 0x472D, 0x8548, 0x8548, 0x1490, 0x8549, 0x8549, 0x0887,

+    0x854A, 0x854A, 0x0CCA, 0x854B, 0x854D, 0x472E, 0x854E, 0x854E, 0x233D,

+    0x854F, 0x8551, 0x4731, 0x8552, 0x8552, 0x2344, 0x8553, 0x8553, 0x2331,

+    0x8554, 0x8554, 0x4734, 0x8555, 0x8555, 0x234B, 0x8556, 0x8556, 0x148B,

+    0x8557, 0x8557, 0x4735, 0x8558, 0x8558, 0x233B, 0x8559, 0x8559, 0x148F,

+    0x855A, 0x855D, 0x4736, 0x855E, 0x855E, 0x1493, 0x855F, 0x8561, 0x473A,

+    0x8562, 0x8562, 0x2350, 0x8563, 0x8563, 0x473D, 0x8564, 0x8564, 0x1492,

+    0x8565, 0x8567, 0x473E, 0x8568, 0x8568, 0x1491, 0x8569, 0x8569, 0x1EB4,

+    0x856A, 0x856A, 0x21A6, 0x856B, 0x856C, 0x4741, 0x856D, 0x856D, 0x21CB,

+    0x856E, 0x8571, 0x4743, 0x8572, 0x8572, 0x1497, 0x8573, 0x8573, 0x4747,

+    0x8574, 0x8574, 0x110F, 0x8575, 0x8576, 0x4748, 0x8577, 0x8577, 0x2355,

+    0x8578, 0x8578, 0x474A, 0x8579, 0x8579, 0x149D, 0x857A, 0x857A, 0x1494,

+    0x857B, 0x857B, 0x1498, 0x857C, 0x857D, 0x474B, 0x857E, 0x857E, 0x09C4,

+    0x857F, 0x8583, 0x474D, 0x8584, 0x8584, 0x040A, 0x8585, 0x8585, 0x14A0,

+    0x8586, 0x8586, 0x4752, 0x8587, 0x8587, 0x149B, 0x8588, 0x8588, 0x233E,

+    0x8589, 0x8589, 0x4753, 0x858A, 0x858A, 0x1F74, 0x858B, 0x858B, 0x4754,

+    0x858C, 0x858C, 0x2330, 0x858D, 0x858E, 0x4755, 0x858F, 0x858F, 0x149C,

+    0x8590, 0x8590, 0x4757, 0x8591, 0x8591, 0x2680, 0x8592, 0x8593, 0x4758,

+    0x8594, 0x8594, 0x20DA, 0x8595, 0x859A, 0x475A, 0x859B, 0x859B, 0x0FCF,

+    0x859C, 0x859C, 0x149F, 0x859D, 0x859E, 0x4760, 0x859F, 0x859F, 0x234A,

+    0x85A0, 0x85A3, 0x4762, 0x85A4, 0x85A4, 0x1499, 0x85A5, 0x85A5, 0x4766,

+    0x85A6, 0x85A6, 0x1F91, 0x85A7, 0x85A7, 0x4767, 0x85A8, 0x85A8, 0x149A,

+    0x85A9, 0x85A9, 0x2107, 0x85AA, 0x85AA, 0x0F88, 0x85AB, 0x85AD, 0x4768,

+    0x85AE, 0x85AE, 0x149E, 0x85AF, 0x85AF, 0x0D84, 0x85B0, 0x85B0, 0x14A3,

+    0x85B1, 0x85B6, 0x476B, 0x85B7, 0x85B7, 0x14A2, 0x85B8, 0x85B8, 0x4771,

+    0x85B9, 0x85B9, 0x14A1, 0x85BA, 0x85BA, 0x233F, 0x85BB, 0x85C0, 0x4772,

+    0x85C1, 0x85C1, 0x14A5, 0x85C2, 0x85C8, 0x4778, 0x85C9, 0x85C9, 0x08B6,

+    0x85CA, 0x85CC, 0x477F, 0x85CD, 0x85CD, 0x1FF4, 0x85CE, 0x85CE, 0x2343,

+    0x85CF, 0x85CF, 0x049F, 0x85D0, 0x85D0, 0x0AEF, 0x85D1, 0x85D2, 0x4782,

+    0x85D3, 0x85D3, 0x14A4, 0x85D4, 0x85D4, 0x4784, 0x85D5, 0x85D5, 0x0B7B,

+    0x85D6, 0x85DB, 0x4785, 0x85DC, 0x85DC, 0x14A6, 0x85DD, 0x85DD, 0x2212,

+    0x85DE, 0x85E3, 0x478B, 0x85E4, 0x85E4, 0x0E2C, 0x85E5, 0x85E5, 0x2207,

+    0x85E6, 0x85E8, 0x4791, 0x85E9, 0x85E9, 0x0647, 0x85EA, 0x85EA, 0x2359,

+    0x85EB, 0x85F3, 0x4794, 0x85F4, 0x85F4, 0x2254, 0x85F5, 0x85F5, 0x479D,

+    0x85F6, 0x85F6, 0x2332, 0x85F7, 0x85F8, 0x479E, 0x85F9, 0x85F9, 0x1E26,

+    0x85FA, 0x85FA, 0x2357, 0x85FB, 0x85FB, 0x1128, 0x85FC, 0x85FE, 0x47A0,

+    0x85FF, 0x85FF, 0x14A7, 0x8600, 0x8603, 0x47A3, 0x8604, 0x8604, 0x2358,

+    0x8605, 0x8605, 0x14A9, 0x8606, 0x8606, 0x2042, 0x8607, 0x8607, 0x2153,

+    0x8608, 0x860A, 0x47A7, 0x860B, 0x860B, 0x20BB, 0x860C, 0x8610, 0x47AA,

+    0x8611, 0x8611, 0x0B05, 0x8612, 0x8615, 0x47AF, 0x8616, 0x8616, 0x14AB,

+    0x8617, 0x8619, 0x47B3, 0x861A, 0x861A, 0x235A, 0x861B, 0x861D, 0x47B6,

+    0x861E, 0x861E, 0x2356, 0x861F, 0x8621, 0x47B9, 0x8622, 0x8622, 0x2337,

+    0x8623, 0x8626, 0x47BC, 0x8627, 0x8627, 0x14A8, 0x8628, 0x8628, 0x47C0,

+    0x8629, 0x8629, 0x14AA, 0x862A, 0x862C, 0x47C1, 0x862D, 0x862D, 0x1FF9,

+    0x862E, 0x8637, 0x47C4, 0x8638, 0x8638, 0x115B, 0x8639, 0x8639, 0x47CE,

+    0x863A, 0x863A, 0x2353, 0x863B, 0x863B, 0x47CF, 0x863C, 0x863C, 0x14AC,

+    0x863D, 0x863E, 0x47D0, 0x863F, 0x863F, 0x2061, 0x8640, 0x864C, 0x47D2,

+    0x864D, 0x864D, 0x1BF0, 0x864E, 0x864E, 0x07B7, 0x864F, 0x864F, 0x0A59,

+    0x8650, 0x8650, 0x0B71, 0x8651, 0x8651, 0x0A6E, 0x8652, 0x8653, 0x47DF,

+    0x8654, 0x8654, 0x1BF1, 0x8655, 0x8655, 0x1E95, 0x8656, 0x8659, 0x47E1,

+    0x865A, 0x865A, 0x0FB4, 0x865B, 0x865B, 0x47E5, 0x865C, 0x865C, 0x2049,

+    0x865D, 0x865D, 0x47E6, 0x865E, 0x865E, 0x10C2, 0x865F, 0x865F, 0x1F42,

+    0x8660, 0x8661, 0x47E7, 0x8662, 0x8662, 0x196D, 0x8663, 0x8666, 0x47E9,

+    0x8667, 0x8667, 0x1FE8, 0x8668, 0x866A, 0x47ED, 0x866B, 0x866B, 0x050B,

+    0x866C, 0x866C, 0x1BF2, 0x866D, 0x866D, 0x47F0, 0x866E, 0x866E, 0x1BF3,

+    0x866F, 0x8670, 0x47F1, 0x8671, 0x8671, 0x0D44, 0x8672, 0x8678, 0x47F3,

+    0x8679, 0x8679, 0x079E, 0x867A, 0x867A, 0x1BF5, 0x867B, 0x867B, 0x1BF7,

+    0x867C, 0x867C, 0x1BF6, 0x867D, 0x867D, 0x0DD9, 0x867E, 0x867E, 0x0F27,

+    0x867F, 0x867F, 0x1BF4, 0x8680, 0x8680, 0x0D4B, 0x8681, 0x8681, 0x1056,

+    0x8682, 0x8682, 0x0A93, 0x8683, 0x8689, 0x47FA, 0x868A, 0x868A, 0x0ED2,

+    0x868B, 0x868B, 0x1BFA, 0x868C, 0x868C, 0x0401, 0x868D, 0x868D, 0x1BF9,

+    0x868E, 0x8692, 0x4801, 0x8693, 0x8693, 0x1C00, 0x8694, 0x8694, 0x4806,

+    0x8695, 0x8695, 0x0496, 0x8696, 0x869B, 0x4807, 0x869C, 0x869C, 0x0FEA,

+    0x869D, 0x869D, 0x1BFC, 0x869E, 0x86A2, 0x480D, 0x86A3, 0x86A3, 0x1BFE,

+    0x86A4, 0x86A4, 0x112C, 0x86A5, 0x86A6, 0x4812, 0x86A7, 0x86A7, 0x1BFD,

+    0x86A8, 0x86A8, 0x1BF8, 0x86A9, 0x86A9, 0x1C01, 0x86AA, 0x86AA, 0x1BFF,

+    0x86AB, 0x86AB, 0x4814, 0x86AC, 0x86AC, 0x1BFB, 0x86AD, 0x86AE, 0x4815,

+    0x86AF, 0x86AF, 0x1C09, 0x86B0, 0x86B0, 0x1C06, 0x86B1, 0x86B1, 0x1C08,

+    0x86B2, 0x86B3, 0x4817, 0x86B4, 0x86B4, 0x1C0C, 0x86B5, 0x86B5, 0x1C04,

+    0x86B6, 0x86B6, 0x1C02, 0x86B7, 0x86B9, 0x4819, 0x86BA, 0x86BA, 0x1C07,

+    0x86BB, 0x86BF, 0x481C, 0x86C0, 0x86C0, 0x11FA, 0x86C1, 0x86C3, 0x4821,

+    0x86C4, 0x86C4, 0x1C03, 0x86C5, 0x86C5, 0x4824, 0x86C6, 0x86C6, 0x0C76,

+    0x86C7, 0x86C7, 0x0D18, 0x86C8, 0x86C8, 0x4825, 0x86C9, 0x86C9, 0x1C0A,

+    0x86CA, 0x86CA, 0x071F, 0x86CB, 0x86CB, 0x0591, 0x86CC, 0x86CD, 0x4826,

+    0x86CE, 0x86CE, 0x1C05, 0x86CF, 0x86CF, 0x1C0B, 0x86D0, 0x86D0, 0x1C12,

+    0x86D1, 0x86D1, 0x1C18, 0x86D2, 0x86D3, 0x4828, 0x86D4, 0x86D4, 0x07EC,

+    0x86D5, 0x86D7, 0x482A, 0x86D8, 0x86D8, 0x1C17, 0x86D9, 0x86D9, 0x0E8D,

+    0x86DA, 0x86DA, 0x482D, 0x86DB, 0x86DB, 0x11EA, 0x86DC, 0x86DD, 0x482E,

+    0x86DE, 0x86DE, 0x1C14, 0x86DF, 0x86DF, 0x1C16, 0x86E0, 0x86E3, 0x4830,

+    0x86E4, 0x86E4, 0x06ED, 0x86E5, 0x86E8, 0x4834, 0x86E9, 0x86E9, 0x1C0D,

+    0x86EA, 0x86EC, 0x4838, 0x86ED, 0x86ED, 0x1C10, 0x86EE, 0x86EE, 0x0AA0,

+    0x86EF, 0x86EF, 0x483B, 0x86F0, 0x86F0, 0x117E, 0x86F1, 0x86F2, 0x1C0E,

+    0x86F3, 0x86F3, 0x1C11, 0x86F4, 0x86F4, 0x1C15, 0x86F5, 0x86F7, 0x483C,

+    0x86F8, 0x86F8, 0x1C1B, 0x86F9, 0x86F9, 0x10A1, 0x86FA, 0x86FA, 0x25DA,

+    0x86FB, 0x86FD, 0x483F, 0x86FE, 0x86FE, 0x0629, 0x86FF, 0x86FF, 0x4842,

+    0x8700, 0x8700, 0x0D88, 0x8701, 0x8701, 0x4843, 0x8702, 0x8702, 0x0681,

+    0x8703, 0x8703, 0x1C19, 0x8704, 0x8705, 0x4844, 0x8706, 0x8706, 0x25D7,

+    0x8707, 0x8707, 0x1C1A, 0x8708, 0x8708, 0x1C1C, 0x8709, 0x8709, 0x1C1F,

+    0x870A, 0x870A, 0x1C1D, 0x870B, 0x870C, 0x4846, 0x870D, 0x870D, 0x1C1E,

+    0x870E, 0x8711, 0x4848, 0x8712, 0x8712, 0x0FFA, 0x8713, 0x8713, 0x1C13,

+    0x8714, 0x8714, 0x484C, 0x8715, 0x8715, 0x0E7A, 0x8716, 0x8716, 0x484D,

+    0x8717, 0x8717, 0x0EDE, 0x8718, 0x8718, 0x11A8, 0x8719, 0x8719, 0x484E,

+    0x871A, 0x871A, 0x1C25, 0x871B, 0x871B, 0x484F, 0x871C, 0x871C, 0x0AE0,

+    0x871D, 0x871D, 0x4850, 0x871E, 0x871E, 0x1C22, 0x871F, 0x8720, 0x4851,

+    0x8721, 0x8721, 0x099A, 0x8722, 0x8722, 0x1C2E, 0x8723, 0x8723, 0x1C20,

+    0x8724, 0x8724, 0x4853, 0x8725, 0x8725, 0x1C23, 0x8726, 0x8728, 0x4854,

+    0x8729, 0x8729, 0x1C2A, 0x872A, 0x872D, 0x4857, 0x872E, 0x872E, 0x1C24,

+    0x872F, 0x8730, 0x485B, 0x8731, 0x8731, 0x1C29, 0x8732, 0x8733, 0x485D,

+    0x8734, 0x8734, 0x1C28, 0x8735, 0x8736, 0x485F, 0x8737, 0x8737, 0x1C2B,

+    0x8738, 0x873A, 0x4861, 0x873B, 0x873B, 0x1C21, 0x873C, 0x873D, 0x4864,

+    0x873E, 0x873E, 0x1C26, 0x873F, 0x873F, 0x1C2C, 0x8740, 0x8746, 0x4866,

+    0x8747, 0x8747, 0x1091, 0x8748, 0x8748, 0x1C27, 0x8749, 0x8749, 0x04BC,

+    0x874A, 0x874B, 0x486D, 0x874C, 0x874C, 0x1C34, 0x874D, 0x874D, 0x486F,

+    0x874E, 0x874E, 0x0F76, 0x874F, 0x8752, 0x4870, 0x8753, 0x8753, 0x1C37,

+    0x8754, 0x8754, 0x4874, 0x8755, 0x8755, 0x212E, 0x8756, 0x8756, 0x4875,

+    0x8757, 0x8757, 0x07DD, 0x8758, 0x8758, 0x4876, 0x8759, 0x8759, 0x1C3B,

+    0x875A, 0x875F, 0x4877, 0x8760, 0x8760, 0x1C32, 0x8761, 0x8762, 0x487D,

+    0x8763, 0x8763, 0x1C38, 0x8764, 0x8764, 0x1C3A, 0x8765, 0x8765, 0x1C3C,

+    0x8766, 0x8766, 0x21B2, 0x8767, 0x876D, 0x487F, 0x876E, 0x876E, 0x1C35,

+    0x876F, 0x876F, 0x4886, 0x8770, 0x8770, 0x1C33, 0x8771, 0x8773, 0x4887,

+    0x8774, 0x8774, 0x07B2, 0x8775, 0x8775, 0x488A, 0x8776, 0x8776, 0x05DC,

+    0x8777, 0x8777, 0x488B, 0x8778, 0x8778, 0x219E, 0x8779, 0x877A, 0x488C,

+    0x877B, 0x877B, 0x1C31, 0x877C, 0x877C, 0x1C39, 0x877D, 0x877E, 0x1C2F,

+    0x877F, 0x8781, 0x488E, 0x8782, 0x8782, 0x1C2D, 0x8783, 0x8783, 0x1C46,

+    0x8784, 0x8784, 0x25DC, 0x8785, 0x8785, 0x1C43, 0x8786, 0x8787, 0x4891,

+    0x8788, 0x8788, 0x1C42, 0x8789, 0x878A, 0x4893, 0x878B, 0x878B, 0x1C36,

+    0x878C, 0x878C, 0x4895, 0x878D, 0x878D, 0x0CB5, 0x878E, 0x8792, 0x4896,

+    0x8793, 0x8793, 0x1C3D, 0x8794, 0x8796, 0x489B, 0x8797, 0x8797, 0x1C45,

+    0x8798, 0x879D, 0x489E, 0x879E, 0x879E, 0x206C, 0x879F, 0x879F, 0x0AFD,

+    0x87A0, 0x87A1, 0x48A4, 0x87A2, 0x87A2, 0x2226, 0x87A3, 0x87A7, 0x48A6,

+    0x87A8, 0x87A8, 0x1C3F, 0x87A9, 0x87AA, 0x48AB, 0x87AB, 0x87AB, 0x1C47,

+    0x87AC, 0x87AC, 0x1C49, 0x87AD, 0x87AD, 0x1C44, 0x87AE, 0x87AE, 0x48AD,

+    0x87AF, 0x87AF, 0x1C3E, 0x87B0, 0x87B2, 0x48AE, 0x87B3, 0x87B3, 0x1C4B,

+    0x87B4, 0x87B4, 0x48B1, 0x87B5, 0x87B5, 0x1C4A, 0x87B6, 0x87B9, 0x48B2,

+    0x87BA, 0x87BA, 0x0A84, 0x87BB, 0x87BB, 0x25E0, 0x87BC, 0x87BC, 0x48B6,

+    0x87BD, 0x87BD, 0x1C4E, 0x87BE, 0x87BF, 0x48B7, 0x87C0, 0x87C0, 0x1C50,

+    0x87C1, 0x87C3, 0x48B9, 0x87C4, 0x87C4, 0x227B, 0x87C5, 0x87C5, 0x48BC,

+    0x87C6, 0x87C6, 0x1C41, 0x87C7, 0x87C7, 0x48BD, 0x87C8, 0x87C8, 0x25DE,

+    0x87C9, 0x87C9, 0x48BE, 0x87CA, 0x87CA, 0x1C51, 0x87CB, 0x87CB, 0x1C4C,

+    0x87CC, 0x87CD, 0x48BF, 0x87CE, 0x87CE, 0x25E1, 0x87CF, 0x87D0, 0x48C1,

+    0x87D1, 0x87D1, 0x1C4F, 0x87D2, 0x87D2, 0x1C40, 0x87D3, 0x87D3, 0x1C4D,

+    0x87D4, 0x87DA, 0x48C3, 0x87DB, 0x87DB, 0x1C52, 0x87DC, 0x87DF, 0x48CA,

+    0x87E0, 0x87E0, 0x1C54, 0x87E1, 0x87E2, 0x48CE, 0x87E3, 0x87E3, 0x25D5,

+    0x87E4, 0x87E4, 0x48D0, 0x87E5, 0x87E5, 0x1C48, 0x87E6, 0x87E9, 0x48D1,

+    0x87EA, 0x87EA, 0x1C53, 0x87EB, 0x87EB, 0x48D5, 0x87EC, 0x87EC, 0x1E6B,

+    0x87ED, 0x87ED, 0x48D6, 0x87EE, 0x87EE, 0x1C55, 0x87EF, 0x87EF, 0x25DB,

+    0x87F0, 0x87F1, 0x48D7, 0x87F2, 0x87F2, 0x1E89, 0x87F3, 0x87F5, 0x48D9,

+    0x87F6, 0x87F6, 0x25D9, 0x87F7, 0x87F8, 0x48DC, 0x87F9, 0x87F9, 0x0F82,

+    0x87FA, 0x87FA, 0x48DE, 0x87FB, 0x87FB, 0x2211, 0x87FC, 0x87FD, 0x48DF,

+    0x87FE, 0x87FE, 0x1C58, 0x87FF, 0x87FF, 0x48E1, 0x8800, 0x8802, 0x48E2,

+    0x8803, 0x8803, 0x130D, 0x8804, 0x8804, 0x48E5, 0x8805, 0x8805, 0x2229,

+    0x8806, 0x8806, 0x25D6, 0x8807, 0x8809, 0x48E6, 0x880A, 0x880A, 0x1C59,

+    0x880B, 0x880F, 0x48E9, 0x8810, 0x8810, 0x25DD, 0x8811, 0x8811, 0x25DF,

+    0x8812, 0x8812, 0x48EE, 0x8813, 0x8813, 0x1C57, 0x8814, 0x8814, 0x48EF,

+    0x8815, 0x8815, 0x0CBF, 0x8816, 0x8816, 0x1C56, 0x8817, 0x881A, 0x48F0,

+    0x881B, 0x881B, 0x1C5A, 0x881C, 0x881E, 0x48F4, 0x881F, 0x881F, 0x1FEF,

+    0x8820, 0x8820, 0x48F7, 0x8821, 0x8821, 0x1C5B, 0x8822, 0x8822, 0x0543,

+    0x8823, 0x8823, 0x25D8, 0x8824, 0x8830, 0x48F8, 0x8831, 0x8831, 0x1F29,

+    0x8832, 0x8832, 0x1A8D, 0x8833, 0x8835, 0x4905, 0x8836, 0x8836, 0x1E5B,

+    0x8837, 0x8838, 0x4908, 0x8839, 0x8839, 0x1C5C, 0x883A, 0x883A, 0x490A,

+    0x883B, 0x883B, 0x2076, 0x883C, 0x883C, 0x1C5D, 0x883D, 0x883F, 0x490B,

+    0x8840, 0x8840, 0x0FD3, 0x8841, 0x8843, 0x490E, 0x8844, 0x8844, 0x1CAA,

+    0x8845, 0x8845, 0x0F91, 0x8846, 0x8846, 0x2297, 0x8847, 0x8849, 0x4911,

+    0x884A, 0x884A, 0x2690, 0x884B, 0x884B, 0x4914, 0x884C, 0x884C, 0x0F9B,

+    0x884D, 0x884D, 0x1005, 0x884E, 0x8852, 0x4915, 0x8853, 0x8853, 0x213F,

+    0x8854, 0x8854, 0x0F3B, 0x8855, 0x8856, 0x491A, 0x8857, 0x8857, 0x08A7,

+    0x8858, 0x8858, 0x491C, 0x8859, 0x8859, 0x0FEC, 0x885A, 0x885A, 0x491D,

+    0x885B, 0x885B, 0x2198, 0x885C, 0x885C, 0x491E, 0x885D, 0x885D, 0x1E88,

+    0x885E, 0x8860, 0x491F, 0x8861, 0x8861, 0x0799, 0x8862, 0x8862, 0x15ED,

+    0x8863, 0x8863, 0x1049, 0x8864, 0x8864, 0x1BA6, 0x8865, 0x8865, 0x0480,

+    0x8866, 0x8867, 0x4922, 0x8868, 0x8868, 0x0456, 0x8869, 0x8869, 0x1BA7,

+    0x886A, 0x886A, 0x4924, 0x886B, 0x886B, 0x0CF9, 0x886C, 0x886C, 0x04E9,

+    0x886D, 0x886D, 0x4925, 0x886E, 0x886E, 0x1306, 0x886F, 0x886F, 0x4926,

+    0x8870, 0x8870, 0x0D9A, 0x8871, 0x8871, 0x4927, 0x8872, 0x8872, 0x1BA8,

+    0x8873, 0x8876, 0x4928, 0x8877, 0x8877, 0x11D3, 0x8878, 0x8878, 0x492C,

+    0x8879, 0x8879, 0x228C, 0x887A, 0x887C, 0x492D, 0x887D, 0x887D, 0x1BA9,

+    0x887E, 0x887E, 0x1CBE, 0x887F, 0x887F, 0x1BAA, 0x8880, 0x8880, 0x4930,

+    0x8881, 0x8881, 0x10EF, 0x8882, 0x8882, 0x1BAB, 0x8883, 0x8883, 0x4931,

+    0x8884, 0x8884, 0x03CB, 0x8885, 0x8885, 0x1CBF, 0x8886, 0x8887, 0x4932,

+    0x8888, 0x8888, 0x1CC0, 0x8889, 0x888A, 0x4934, 0x888B, 0x888B, 0x057F,

+    0x888C, 0x888C, 0x4936, 0x888D, 0x888D, 0x0B9C, 0x888E, 0x8891, 0x4937,

+    0x8892, 0x8892, 0x0E0E, 0x8893, 0x8895, 0x493B, 0x8896, 0x8896, 0x0FAF,

+    0x8897, 0x889B, 0x493E, 0x889C, 0x889C, 0x0E91, 0x889D, 0x88A1, 0x4943,

+    0x88A2, 0x88A2, 0x1BAC, 0x88A3, 0x88A3, 0x4948, 0x88A4, 0x88A4, 0x1307,

+    0x88A5, 0x88AA, 0x4949, 0x88AB, 0x88AB, 0x0424, 0x88AC, 0x88AC, 0x494F,

+    0x88AD, 0x88AD, 0x0F1B, 0x88AE, 0x88B0, 0x4950, 0x88B1, 0x88B1, 0x069F,

+    0x88B2, 0x88B6, 0x4953, 0x88B7, 0x88B7, 0x1BAE, 0x88B8, 0x88BB, 0x4958,

+    0x88BC, 0x88BC, 0x1BAF, 0x88BD, 0x88C0, 0x495C, 0x88C1, 0x88C1, 0x048A,

+    0x88C2, 0x88C2, 0x0A1A, 0x88C3, 0x88C4, 0x4960, 0x88C5, 0x88C5, 0x120D,

+    0x88C6, 0x88C6, 0x1BAD, 0x88C7, 0x88C8, 0x4962, 0x88C9, 0x88C9, 0x1BB0,

+    0x88CA, 0x88CA, 0x25F1, 0x88CB, 0x88CD, 0x4964, 0x88CE, 0x88CE, 0x1BB2,

+    0x88CF, 0x88CF, 0x200C, 0x88D0, 0x88D1, 0x4967, 0x88D2, 0x88D2, 0x130A,

+    0x88D3, 0x88D3, 0x4969, 0x88D4, 0x88D4, 0x1068, 0x88D5, 0x88D5, 0x10E6,

+    0x88D6, 0x88D7, 0x496A, 0x88D8, 0x88D8, 0x1CC1, 0x88D9, 0x88D9, 0x0C94,

+    0x88DA, 0x88DB, 0x496C, 0x88DC, 0x88DC, 0x1E58, 0x88DD, 0x88DD, 0x22AC,

+    0x88DE, 0x88DE, 0x496E, 0x88DF, 0x88DF, 0x1CC2, 0x88E0, 0x88E1, 0x496F,

+    0x88E2, 0x88E2, 0x1BB1, 0x88E3, 0x88E3, 0x1BB3, 0x88E4, 0x88E4, 0x0970,

+    0x88E5, 0x88E5, 0x1BB4, 0x88E6, 0x88E7, 0x4971, 0x88E8, 0x88E8, 0x1BB8,

+    0x88E9, 0x88EF, 0x4973, 0x88F0, 0x88F0, 0x1BBA, 0x88F1, 0x88F1, 0x1BB5,

+    0x88F2, 0x88F2, 0x497A, 0x88F3, 0x88F3, 0x0D0A, 0x88F4, 0x88F4, 0x0BA2,

+    0x88F5, 0x88F7, 0x497B, 0x88F8, 0x88F8, 0x0A8A, 0x88F9, 0x88F9, 0x0755,

+    0x88FA, 0x88FB, 0x497E, 0x88FC, 0x88FC, 0x1BB7, 0x88FD, 0x88FD, 0x26A7,

+    0x88FE, 0x88FE, 0x1BB9, 0x88FF, 0x88FF, 0x4980, 0x8900, 0x8901, 0x4981,

+    0x8902, 0x8902, 0x072C, 0x8903, 0x8906, 0x4983, 0x8907, 0x8907, 0x2676,

+    0x8908, 0x8909, 0x4987, 0x890A, 0x890A, 0x1BBF, 0x890B, 0x890F, 0x4989,

+    0x8910, 0x8910, 0x078D, 0x8911, 0x8911, 0x498E, 0x8912, 0x8912, 0x0408,

+    0x8913, 0x8913, 0x1BBD, 0x8914, 0x8918, 0x498F, 0x8919, 0x8919, 0x1BBC,

+    0x891A, 0x891A, 0x1BB6, 0x891B, 0x891B, 0x1BBE, 0x891C, 0x8920, 0x4994,

+    0x8921, 0x8921, 0x1BBB, 0x8922, 0x8924, 0x4999, 0x8925, 0x8925, 0x0CC7,

+    0x8926, 0x8929, 0x499C, 0x892A, 0x892A, 0x0E7B, 0x892B, 0x892B, 0x1BC1,

+    0x892C, 0x892F, 0x49A0, 0x8930, 0x8930, 0x1739, 0x8931, 0x8931, 0x49A4,

+    0x8932, 0x8932, 0x1FE1, 0x8933, 0x8933, 0x25BB, 0x8934, 0x8934, 0x1BC0,

+    0x8935, 0x8935, 0x49A5, 0x8936, 0x8936, 0x1BC2, 0x8937, 0x8937, 0x49A6,

+    0x8938, 0x8938, 0x25BE, 0x8939, 0x893A, 0x49A7, 0x893B, 0x893B, 0x22DD,

+    0x893C, 0x8940, 0x49A9, 0x8941, 0x8941, 0x1BC3, 0x8942, 0x8943, 0x49AE,

+    0x8944, 0x8944, 0x0F52, 0x8945, 0x8946, 0x49B0, 0x8947, 0x8947, 0x25BD,

+    0x8948, 0x8955, 0x49B2, 0x8956, 0x8956, 0x1E2A, 0x8957, 0x895C, 0x49C0,

+    0x895D, 0x895D, 0x25BC, 0x895E, 0x895E, 0x1CC3, 0x895F, 0x895F, 0x08C4,

+    0x8960, 0x8960, 0x25BA, 0x8961, 0x8963, 0x49C6, 0x8964, 0x8964, 0x25BF,

+    0x8965, 0x8965, 0x49C9, 0x8966, 0x8966, 0x1BC4, 0x8967, 0x8969, 0x49CA,

+    0x896A, 0x896A, 0x2187, 0x896B, 0x896B, 0x49CD, 0x896C, 0x896C, 0x266B,

+    0x896D, 0x896E, 0x49CE, 0x896F, 0x896F, 0x1E7F, 0x8970, 0x8971, 0x49D0,

+    0x8972, 0x8972, 0x21AD, 0x8973, 0x897A, 0x49D2, 0x897B, 0x897B, 0x1BC5,

+    0x897C, 0x897E, 0x49DA, 0x897F, 0x897F, 0x0F06, 0x8980, 0x8980, 0x49DD,

+    0x8981, 0x8981, 0x1031, 0x8982, 0x8982, 0x49DE, 0x8983, 0x8983, 0x1BDF,

+    0x8984, 0x8985, 0x49DF, 0x8986, 0x8986, 0x06AD, 0x8987, 0x898A, 0x49E1,

+    0x898B, 0x898B, 0x1F96, 0x898C, 0x898E, 0x49E5, 0x898F, 0x898F, 0x1F32,

+    0x8990, 0x8992, 0x49E8, 0x8993, 0x8993, 0x2084, 0x8994, 0x8995, 0x49EB,

+    0x8996, 0x8996, 0x2136, 0x8997, 0x8997, 0x49ED, 0x8998, 0x8998, 0x24B8,

+    0x8999, 0x89A0, 0x49EE, 0x89A1, 0x89A1, 0x24BA, 0x89A2, 0x89A5, 0x49F6,

+    0x89A6, 0x89A6, 0x24BC, 0x89A7, 0x89A9, 0x49FA, 0x89AA, 0x89AA, 0x20E4,

+    0x89AB, 0x89AB, 0x49FD, 0x89AC, 0x89AC, 0x24B9, 0x89AD, 0x89AE, 0x49FE,

+    0x89AF, 0x89AF, 0x24BD, 0x89B0, 0x89B1, 0x4A00, 0x89B2, 0x89B2, 0x24BE,

+    0x89B3, 0x89B6, 0x4A02, 0x89B7, 0x89B7, 0x24BF, 0x89B8, 0x89B9, 0x4A06,

+    0x89BA, 0x89BA, 0x1FD2, 0x89BB, 0x89BC, 0x4A08, 0x89BD, 0x89BD, 0x1FFD,

+    0x89BE, 0x89BE, 0x4A0A, 0x89BF, 0x89BF, 0x24BB, 0x89C0, 0x89C0, 0x1F2D,

+    0x89C1, 0x89C1, 0x086E, 0x89C2, 0x89C2, 0x0734, 0x89C3, 0x89C3, 0x4A0B,

+    0x89C4, 0x89C4, 0x073F, 0x89C5, 0x89C5, 0x0ADE, 0x89C6, 0x89C6, 0x0D6A,

+    0x89C7, 0x89C7, 0x193A, 0x89C8, 0x89C8, 0x09AB, 0x89C9, 0x89C9, 0x0924,

+    0x89CA, 0x89CC, 0x193B, 0x89CD, 0x89CD, 0x4A0C, 0x89CE, 0x89D1, 0x193E,

+    0x89D2, 0x89D2, 0x0898, 0x89D3, 0x89D5, 0x4A0D, 0x89D6, 0x89D6, 0x1D57,

+    0x89D7, 0x89D9, 0x4A10, 0x89DA, 0x89DA, 0x1D59, 0x89DB, 0x89DB, 0x4A13,

+    0x89DC, 0x89DC, 0x1D5A, 0x89DD, 0x89DD, 0x4A14, 0x89DE, 0x89DE, 0x1D58,

+    0x89DF, 0x89E2, 0x4A15, 0x89E3, 0x89E3, 0x08B3, 0x89E4, 0x89E4, 0x4A19,

+    0x89E5, 0x89E5, 0x1D5B, 0x89E6, 0x89E6, 0x0528, 0x89E7, 0x89EA, 0x4A1A,

+    0x89EB, 0x89EB, 0x1D5C, 0x89EC, 0x89EE, 0x4A1E, 0x89EF, 0x89EF, 0x1D5D,

+    0x89F0, 0x89F2, 0x4A21, 0x89F3, 0x89F3, 0x19C0, 0x89F4, 0x89F4, 0x2609,

+    0x89F5, 0x89F5, 0x4A24, 0x89F6, 0x89F6, 0x260A, 0x89F7, 0x89F7, 0x4A25,

+    0x89F8, 0x89F8, 0x1E94, 0x89F9, 0x89FF, 0x4A26, 0x8A00, 0x8A00, 0x0FFD,

+    0x8A01, 0x8A01, 0x22DF, 0x8A02, 0x8A02, 0x1ECB, 0x8A03, 0x8A03, 0x1F0D,

+    0x8A04, 0x8A06, 0x4A2D, 0x8A07, 0x8A07, 0x12FE, 0x8A08, 0x8A08, 0x1F77,

+    0x8A09, 0x8A09, 0x4A30, 0x8A0A, 0x8A0A, 0x21EB, 0x8A0B, 0x8A0B, 0x4A31,

+    0x8A0C, 0x8A0C, 0x22E1, 0x8A0D, 0x8A0D, 0x4A32, 0x8A0E, 0x8A0E, 0x216F,

+    0x8A0F, 0x8A0F, 0x4A33, 0x8A10, 0x8A10, 0x22E0, 0x8A11, 0x8A12, 0x4A34,

+    0x8A13, 0x8A13, 0x21EA, 0x8A14, 0x8A14, 0x4A36, 0x8A15, 0x8A15, 0x22E2,

+    0x8A16, 0x8A16, 0x20CB, 0x8A17, 0x8A17, 0x4A37, 0x8A18, 0x8A18, 0x1F78,

+    0x8A19, 0x8A1A, 0x4A38, 0x8A1B, 0x8A1B, 0x1EE2, 0x8A1C, 0x8A1C, 0x4A3A,

+    0x8A1D, 0x8A1D, 0x21F2, 0x8A1E, 0x8A1E, 0x4A3B, 0x8A1F, 0x8A1F, 0x2150,

+    0x8A20, 0x8A22, 0x4A3C, 0x8A23, 0x8A23, 0x1FD3, 0x8A24, 0x8A24, 0x4A3F,

+    0x8A25, 0x8A25, 0x22E5, 0x8A26, 0x8A29, 0x4A40, 0x8A2A, 0x8A2A, 0x1EF2,

+    0x8A2B, 0x8A2C, 0x4A44, 0x8A2D, 0x8A2D, 0x211F, 0x8A2E, 0x8A30, 0x4A46,

+    0x8A31, 0x8A31, 0x21DD, 0x8A32, 0x8A33, 0x4A49, 0x8A34, 0x8A34, 0x2154,

+    0x8A35, 0x8A35, 0x4A4B, 0x8A36, 0x8A36, 0x22E7, 0x8A37, 0x8A39, 0x4A4C,

+    0x8A3A, 0x8A3A, 0x2282, 0x8A3B, 0x8A3D, 0x4A4F, 0x8A3E, 0x8A3E, 0x1D5E,

+    0x8A3F, 0x8A40, 0x4A52, 0x8A41, 0x8A41, 0x22E6, 0x8A42, 0x8A45, 0x4A54,

+    0x8A46, 0x8A46, 0x22E8, 0x8A47, 0x8A47, 0x4A58, 0x8A48, 0x8A48, 0x1A84,

+    0x8A49, 0x8A4D, 0x4A59, 0x8A4E, 0x8A4E, 0x22E4, 0x8A4F, 0x8A4F, 0x4A5E,

+    0x8A50, 0x8A50, 0x226A, 0x8A51, 0x8A51, 0x4A5F, 0x8A52, 0x8A52, 0x22EB,

+    0x8A53, 0x8A53, 0x4A60, 0x8A54, 0x8A54, 0x22E9, 0x8A55, 0x8A55, 0x20BD,

+    0x8A56, 0x8A57, 0x4A61, 0x8A58, 0x8A58, 0x22EA, 0x8A59, 0x8A5A, 0x4A63,

+    0x8A5B, 0x8A5B, 0x22BD, 0x8A5C, 0x8A5D, 0x4A65, 0x8A5E, 0x8A5E, 0x1E9E,

+    0x8A5F, 0x8A60, 0x4A67, 0x8A61, 0x8A61, 0x22F6, 0x8A62, 0x8A62, 0x21E7,

+    0x8A63, 0x8A63, 0x2216, 0x8A64, 0x8A65, 0x4A69, 0x8A66, 0x8A66, 0x2137,

+    0x8A67, 0x8A68, 0x4A6B, 0x8A69, 0x8A69, 0x212C, 0x8A6A, 0x8A6A, 0x4A6D,

+    0x8A6B, 0x8A6B, 0x1E68, 0x8A6C, 0x8A6C, 0x22F2, 0x8A6D, 0x8A6D, 0x1F37,

+    0x8A6E, 0x8A6E, 0x22F3, 0x8A6F, 0x8A6F, 0x4A6E, 0x8A70, 0x8A70, 0x22EF,

+    0x8A71, 0x8A71, 0x1F50, 0x8A72, 0x8A72, 0x1F10, 0x8A73, 0x8A73, 0x21C8,

+    0x8A74, 0x8A74, 0x4A6F, 0x8A75, 0x8A75, 0x22F1, 0x8A76, 0x8A78, 0x4A70,

+    0x8A79, 0x8A79, 0x1153, 0x8A7A, 0x8A7B, 0x4A73, 0x8A7C, 0x8A7C, 0x22F0,

+    0x8A7D, 0x8A7E, 0x4A75, 0x8A7F, 0x8A7F, 0x22EE, 0x8A80, 0x8A83, 0x4A77,

+    0x8A84, 0x8A84, 0x22ED, 0x8A85, 0x8A85, 0x229E, 0x8A86, 0x8A86, 0x22EC,

+    0x8A87, 0x8A87, 0x1FE2, 0x8A88, 0x8A88, 0x4A7B, 0x8A89, 0x8A89, 0x10E3,

+    0x8A8A, 0x8A8A, 0x0E2F, 0x8A8B, 0x8A8C, 0x4A7C, 0x8A8D, 0x8A8D, 0x20FE,

+    0x8A8E, 0x8A90, 0x4A7E, 0x8A91, 0x8A92, 0x22F9, 0x8A93, 0x8A93, 0x0D5B,

+    0x8A94, 0x8A94, 0x4A81, 0x8A95, 0x8A95, 0x1EAF, 0x8A96, 0x8A97, 0x4A82,

+    0x8A98, 0x8A98, 0x2236, 0x8A99, 0x8A99, 0x4A84, 0x8A9A, 0x8A9A, 0x22F7,

+    0x8A9B, 0x8A9D, 0x4A85, 0x8A9E, 0x8A9E, 0x223D, 0x8A9F, 0x8A9F, 0x4A88,

+    0x8AA0, 0x8AA0, 0x1E82, 0x8AA1, 0x8AA1, 0x1FB6, 0x8AA2, 0x8AA2, 0x4A89,

+    0x8AA3, 0x8AA3, 0x21A4, 0x8AA4, 0x8AA4, 0x21AA, 0x8AA5, 0x8AA5, 0x22F8,

+    0x8AA6, 0x8AA6, 0x2151, 0x8AA7, 0x8AA7, 0x4A8A, 0x8AA8, 0x8AA8, 0x1F60,

+    0x8AA9, 0x8AAB, 0x4A8B, 0x8AAC, 0x8AAC, 0x2147, 0x8AAD, 0x8AAF, 0x4A8E,

+    0x8AB0, 0x8AB0, 0x2145, 0x8AB1, 0x8AB1, 0x4A91, 0x8AB2, 0x8AB2, 0x1FDC,

+    0x8AB3, 0x8AB5, 0x4A92, 0x8AB6, 0x8AB6, 0x2301, 0x8AB7, 0x8AB8, 0x4A95,

+    0x8AB9, 0x8AB9, 0x1EF5, 0x8ABA, 0x8ABB, 0x4A97, 0x8ABC, 0x8ABC, 0x2218,

+    0x8ABD, 0x8ABE, 0x4A99, 0x8ABF, 0x8ABF, 0x1EC6, 0x8AC0, 0x8AC1, 0x4A9B,

+    0x8AC2, 0x8AC2, 0x2300, 0x8AC3, 0x8AC3, 0x4A9D, 0x8AC4, 0x8AC4, 0x22B4,

+    0x8AC5, 0x8AC6, 0x4A9E, 0x8AC7, 0x8AC7, 0x2169, 0x8AC8, 0x8AC8, 0x4AA0,

+    0x8AC9, 0x8AC9, 0x22FD, 0x8ACA, 0x8ACA, 0x4AA1, 0x8ACB, 0x8ACB, 0x20EA,

+    0x8ACC, 0x8ACC, 0x4AA2, 0x8ACD, 0x8ACD, 0x22F4, 0x8ACE, 0x8ACE, 0x4AA3,

+    0x8ACF, 0x8ACF, 0x22FB, 0x8AD0, 0x8AD0, 0x4AA4, 0x8AD1, 0x8AD1, 0x22FC,

+    0x8AD2, 0x8AD2, 0x2027, 0x8AD3, 0x8AD5, 0x4AA5, 0x8AD6, 0x8AD6, 0x2060,

+    0x8AD7, 0x8AD7, 0x22FF, 0x8AD8, 0x8ADA, 0x4AA8, 0x8ADB, 0x8ADB, 0x22FE,

+    0x8ADC, 0x8ADC, 0x1EC7, 0x8ADD, 0x8ADD, 0x4AAB, 0x8ADE, 0x8ADE, 0x230C,

+    0x8ADF, 0x8AE1, 0x4AAC, 0x8AE2, 0x8AE2, 0x22F5, 0x8AE3, 0x8AE3, 0x4AAF,

+    0x8AE4, 0x8AE4, 0x2306, 0x8AE5, 0x8AE5, 0x4AB0, 0x8AE6, 0x8AE6, 0x230A,

+    0x8AE7, 0x8AE7, 0x21D3, 0x8AE8, 0x8AEA, 0x4AB1, 0x8AEB, 0x8AEB, 0x2303,

+    0x8AEC, 0x8AEC, 0x4AB4, 0x8AED, 0x8AED, 0x2307, 0x8AEE, 0x8AEE, 0x230B,

+    0x8AEF, 0x8AF0, 0x4AB5, 0x8AF1, 0x8AF1, 0x1F5F, 0x8AF2, 0x8AF2, 0x4AB7,

+    0x8AF3, 0x8AF3, 0x2309, 0x8AF4, 0x8AF5, 0x4AB8, 0x8AF6, 0x8AF6, 0x2302,

+    0x8AF7, 0x8AF7, 0x1F04, 0x8AF8, 0x8AF8, 0x229D, 0x8AF9, 0x8AF9, 0x4ABA,

+    0x8AFA, 0x8AFA, 0x21FB, 0x8AFB, 0x8AFB, 0x4ABB, 0x8AFC, 0x8AFC, 0x2308,

+    0x8AFD, 0x8AFD, 0x4ABC, 0x8AFE, 0x8AFE, 0x20AC, 0x8AFF, 0x8AFF, 0x4ABD,

+    0x8B00, 0x8B00, 0x208E, 0x8B01, 0x8B01, 0x2305, 0x8B02, 0x8B02, 0x2197,

+    0x8B03, 0x8B03, 0x4ABE, 0x8B04, 0x8B04, 0x2171, 0x8B05, 0x8B05, 0x2298,

+    0x8B06, 0x8B06, 0x4ABF, 0x8B07, 0x8B07, 0x173C, 0x8B08, 0x8B09, 0x4AC0,

+    0x8B0A, 0x8B0A, 0x1F57, 0x8B0B, 0x8B0D, 0x4AC2, 0x8B0E, 0x8B0E, 0x2082,

+    0x8B0F, 0x8B0F, 0x4AC5, 0x8B10, 0x8B10, 0x2311, 0x8B11, 0x8B13, 0x4AC6,

+    0x8B14, 0x8B14, 0x2304, 0x8B15, 0x8B15, 0x4AC9, 0x8B16, 0x8B16, 0x230F,

+    0x8B17, 0x8B17, 0x1E35, 0x8B18, 0x8B18, 0x4ACA, 0x8B19, 0x8B19, 0x20D1,

+    0x8B1A, 0x8B1A, 0x2310, 0x8B1B, 0x8B1B, 0x1FA3, 0x8B1C, 0x8B1C, 0x4ACB,

+    0x8B1D, 0x8B1D, 0x21D6, 0x8B1E, 0x8B20, 0x4ACC, 0x8B21, 0x8B21, 0x2206,

+    0x8B22, 0x8B25, 0x4ACF, 0x8B26, 0x8B26, 0x1D5F, 0x8B27, 0x8B27, 0x4AD3,

+    0x8B28, 0x8B28, 0x230D, 0x8B29, 0x8B2A, 0x4AD4, 0x8B2B, 0x8B2B, 0x2312,

+    0x8B2C, 0x8B2C, 0x208D, 0x8B2D, 0x8B2D, 0x2313, 0x8B2E, 0x8B32, 0x4AD6,

+    0x8B33, 0x8B33, 0x22E3, 0x8B34, 0x8B38, 0x4ADB, 0x8B39, 0x8B39, 0x1FBA,

+    0x8B3A, 0x8B3D, 0x4AE0, 0x8B3E, 0x8B3E, 0x2078, 0x8B3F, 0x8B48, 0x4AE4,

+    0x8B49, 0x8B49, 0x2288, 0x8B4A, 0x8B4D, 0x4AEE, 0x8B4E, 0x8B4E, 0x2316,

+    0x8B4F, 0x8B4F, 0x1F6B, 0x8B50, 0x8B55, 0x4AF2, 0x8B56, 0x8B56, 0x2314,

+    0x8B57, 0x8B57, 0x4AF8, 0x8B58, 0x8B58, 0x2130, 0x8B59, 0x8B59, 0x2315,

+    0x8B5A, 0x8B5A, 0x2168, 0x8B5B, 0x8B5B, 0x4AF9, 0x8B5C, 0x8B5C, 0x20C4,

+    0x8B5D, 0x8B65, 0x4AFA, 0x8B66, 0x8B66, 0x08DE, 0x8B67, 0x8B6A, 0x4B03,

+    0x8B6B, 0x8B6B, 0x2318, 0x8B6C, 0x8B6C, 0x0BC8, 0x8B6D, 0x8B6E, 0x4B07,

+    0x8B6F, 0x8B6F, 0x2219, 0x8B70, 0x8B70, 0x2217, 0x8B71, 0x8B73, 0x4B09,

+    0x8B74, 0x8B74, 0x20D5, 0x8B75, 0x8B76, 0x4B0C, 0x8B77, 0x8B77, 0x1F4A,

+    0x8B78, 0x8B7C, 0x4B0E, 0x8B7D, 0x8B7D, 0x2240, 0x8B7E, 0x8B7F, 0x4B13,

+    0x8B80, 0x8B80, 0x1ED3, 0x8B81, 0x8B89, 0x4B15, 0x8B8A, 0x8B8A, 0x1E49,

+    0x8B8B, 0x8B8D, 0x4B1E, 0x8B8E, 0x8B8E, 0x261B, 0x8B8F, 0x8B91, 0x4B21,

+    0x8B92, 0x8B92, 0x1E6D, 0x8B93, 0x8B93, 0x20F8, 0x8B94, 0x8B94, 0x4B24,

+    0x8B95, 0x8B95, 0x1FFB, 0x8B96, 0x8B96, 0x2319, 0x8B97, 0x8B9B, 0x4B25,

+    0x8B9C, 0x8B9C, 0x230E, 0x8B9D, 0x8B9D, 0x4B2A, 0x8B9E, 0x8B9E, 0x2317,

+    0x8B9F, 0x8B9F, 0x4B2B, 0x8BA0, 0x8BA0, 0x1317, 0x8BA1, 0x8BA1, 0x0839,

+    0x8BA2, 0x8BA2, 0x05E8, 0x8BA3, 0x8BA3, 0x06B7, 0x8BA4, 0x8BA4, 0x0CAA,

+    0x8BA5, 0x8BA5, 0x0818, 0x8BA6, 0x8BA7, 0x1318, 0x8BA8, 0x8BA8, 0x0E29,

+    0x8BA9, 0x8BA9, 0x0C9E, 0x8BAA, 0x8BAA, 0x131A, 0x8BAB, 0x8BAB, 0x0C1C,

+    0x8BAC, 0x8BAC, 0x4B2C, 0x8BAD, 0x8BAD, 0x0FDE, 0x8BAE, 0x8BAE, 0x1070,

+    0x8BAF, 0x8BAF, 0x0FDF, 0x8BB0, 0x8BB0, 0x083A, 0x8BB1, 0x8BB1, 0x4B2D,

+    0x8BB2, 0x8BB2, 0x0883, 0x8BB3, 0x8BB3, 0x07F9, 0x8BB4, 0x8BB5, 0x131B,

+    0x8BB6, 0x8BB6, 0x0FF1, 0x8BB7, 0x8BB7, 0x131D, 0x8BB8, 0x8BB8, 0x0FB8,

+    0x8BB9, 0x8BB9, 0x062E, 0x8BBA, 0x8BBA, 0x0A82, 0x8BBB, 0x8BBB, 0x4B2E,

+    0x8BBC, 0x8BBC, 0x0DC4, 0x8BBD, 0x8BBD, 0x068A, 0x8BBE, 0x8BBE, 0x0D21,

+    0x8BBF, 0x8BBF, 0x0660, 0x8BC0, 0x8BC0, 0x0926, 0x8BC1, 0x8BC1, 0x11A3,

+    0x8BC2, 0x8BC3, 0x131E, 0x8BC4, 0x8BC4, 0x0BDF, 0x8BC5, 0x8BC5, 0x1244,

+    0x8BC6, 0x8BC6, 0x0D4D, 0x8BC7, 0x8BC7, 0x4B2F, 0x8BC8, 0x8BC8, 0x114A,

+    0x8BC9, 0x8BC9, 0x0DD4, 0x8BCA, 0x8BCA, 0x1190, 0x8BCB, 0x8BCB, 0x1320,

+    0x8BCC, 0x8BCC, 0x11DE, 0x8BCD, 0x8BCD, 0x054D, 0x8BCE, 0x8BCE, 0x1322,

+    0x8BCF, 0x8BCF, 0x1321, 0x8BD0, 0x8BD0, 0x4B30, 0x8BD1, 0x8BD1, 0x1072,

+    0x8BD2, 0x8BD4, 0x1323, 0x8BD5, 0x8BD5, 0x0D6B, 0x8BD6, 0x8BD6, 0x1326,

+    0x8BD7, 0x8BD7, 0x0D42, 0x8BD8, 0x8BD9, 0x1327, 0x8BDA, 0x8BDA, 0x04F4,

+    0x8BDB, 0x8BDB, 0x11EE, 0x8BDC, 0x8BDC, 0x1329, 0x8BDD, 0x8BDD, 0x07C5,

+    0x8BDE, 0x8BDE, 0x058F, 0x8BDF, 0x8BE0, 0x132A, 0x8BE1, 0x8BE1, 0x0747,

+    0x8BE2, 0x8BE2, 0x0FD8, 0x8BE3, 0x8BE3, 0x106F, 0x8BE4, 0x8BE4, 0x132C,

+    0x8BE5, 0x8BE5, 0x06BE, 0x8BE6, 0x8BE6, 0x0F57, 0x8BE7, 0x8BE7, 0x04B6,

+    0x8BE8, 0x8BE9, 0x132D, 0x8BEA, 0x8BEA, 0x4B31, 0x8BEB, 0x8BEB, 0x08BC,

+    0x8BEC, 0x8BEC, 0x0EEB, 0x8BED, 0x8BED, 0x10D4, 0x8BEE, 0x8BEE, 0x132F,

+    0x8BEF, 0x8BEF, 0x0F02, 0x8BF0, 0x8BF0, 0x1330, 0x8BF1, 0x8BF1, 0x10BA,

+    0x8BF2, 0x8BF2, 0x07FA, 0x8BF3, 0x8BF3, 0x1331, 0x8BF4, 0x8BF4, 0x0DAA,

+    0x8BF5, 0x8BF5, 0x0DC5, 0x8BF6, 0x8BF6, 0x1332, 0x8BF7, 0x8BF7, 0x0C68,

+    0x8BF8, 0x8BF8, 0x11ED, 0x8BF9, 0x8BF9, 0x1333, 0x8BFA, 0x8BFA, 0x0B76,

+    0x8BFB, 0x8BFB, 0x0600, 0x8BFC, 0x8BFC, 0x1334, 0x8BFD, 0x8BFD, 0x0669,

+    0x8BFE, 0x8BFE, 0x095B, 0x8BFF, 0x8BFF, 0x1335, 0x8C00, 0x8C00, 0x1336,

+    0x8C01, 0x8C01, 0x0DA2, 0x8C02, 0x8C02, 0x1337, 0x8C03, 0x8C03, 0x05D8,

+    0x8C04, 0x8C04, 0x1338, 0x8C05, 0x8C05, 0x0A0B, 0x8C06, 0x8C06, 0x1218,

+    0x8C07, 0x8C07, 0x1339, 0x8C08, 0x8C08, 0x0E0B, 0x8C09, 0x8C09, 0x4B32,

+    0x8C0A, 0x8C0A, 0x1071, 0x8C0B, 0x8C0B, 0x0B14, 0x8C0C, 0x8C0C, 0x133A,

+    0x8C0D, 0x8C0D, 0x05DE, 0x8C0E, 0x8C0E, 0x07E6, 0x8C0F, 0x8C0F, 0x133B,

+    0x8C10, 0x8C10, 0x0F7E, 0x8C11, 0x8C12, 0x133C, 0x8C13, 0x8C13, 0x0ECC,

+    0x8C14, 0x8C16, 0x133E, 0x8C17, 0x8C17, 0x04BE, 0x8C18, 0x8C18, 0x1343,

+    0x8C19, 0x8C19, 0x1341, 0x8C1A, 0x8C1A, 0x1011, 0x8C1B, 0x8C1B, 0x1342,

+    0x8C1C, 0x8C1C, 0x0ADA, 0x8C1D, 0x8C1D, 0x1344, 0x8C1E, 0x8C1E, 0x4B33,

+    0x8C1F, 0x8C21, 0x1345, 0x8C22, 0x8C22, 0x0F86, 0x8C23, 0x8C23, 0x102C,

+    0x8C24, 0x8C24, 0x0404, 0x8C25, 0x8C25, 0x1348, 0x8C26, 0x8C26, 0x0C28,

+    0x8C27, 0x8C27, 0x1349, 0x8C28, 0x8C28, 0x08C8, 0x8C29, 0x8C29, 0x0AA6,

+    0x8C2A, 0x8C2B, 0x134A, 0x8C2C, 0x8C2C, 0x0B02, 0x8C2D, 0x8C2D, 0x0E0A,

+    0x8C2E, 0x8C2F, 0x134C, 0x8C30, 0x8C30, 0x09A9, 0x8C31, 0x8C31, 0x0BF6,

+    0x8C32, 0x8C33, 0x134E, 0x8C34, 0x8C34, 0x0C31, 0x8C35, 0x8C36, 0x1350,

+    0x8C37, 0x8C37, 0x0721, 0x8C38, 0x8C40, 0x4B34, 0x8C41, 0x8C41, 0x0802,

+    0x8C42, 0x8C45, 0x4B3D, 0x8C46, 0x8C46, 0x05F8, 0x8C47, 0x8C47, 0x1CF6,

+    0x8C48, 0x8C48, 0x20C8, 0x8C49, 0x8C49, 0x1CF7, 0x8C4A, 0x8C4B, 0x4B41,

+    0x8C4C, 0x8C4C, 0x0E94, 0x8C4D, 0x8C4F, 0x4B43, 0x8C50, 0x8C50, 0x1EFD,

+    0x8C51, 0x8C54, 0x4B46, 0x8C55, 0x8C55, 0x1D15, 0x8C56, 0x8C59, 0x4B4A,

+    0x8C5A, 0x8C5A, 0x1990, 0x8C5B, 0x8C60, 0x4B4E, 0x8C61, 0x8C61, 0x0F60,

+    0x8C62, 0x8C62, 0x07D4, 0x8C63, 0x8C69, 0x4B54, 0x8C6A, 0x8C6A, 0x0777,

+    0x8C6B, 0x8C6B, 0x10E8, 0x8C6C, 0x8C72, 0x4B5B, 0x8C73, 0x8C73, 0x15DD,

+    0x8C74, 0x8C77, 0x4B62, 0x8C78, 0x8C78, 0x1D50, 0x8C79, 0x8C79, 0x0413,

+    0x8C7A, 0x8C7A, 0x04B9, 0x8C7B, 0x8C81, 0x4B66, 0x8C82, 0x8C82, 0x1D51,

+    0x8C83, 0x8C84, 0x4B6D, 0x8C85, 0x8C85, 0x1D53, 0x8C86, 0x8C88, 0x4B6F,

+    0x8C89, 0x8C89, 0x0788, 0x8C8A, 0x8C8A, 0x1D52, 0x8C8B, 0x8C8B, 0x4B72,

+    0x8C8C, 0x8C8C, 0x0AB7, 0x8C8D, 0x8C93, 0x4B73, 0x8C94, 0x8C94, 0x1D55,

+    0x8C95, 0x8C97, 0x4B7A, 0x8C98, 0x8C98, 0x1D54, 0x8C99, 0x8C9C, 0x4B7D,

+    0x8C9D, 0x8C9D, 0x1E3B, 0x8C9E, 0x8C9E, 0x227F, 0x8C9F, 0x8C9F, 0x4B81,

+    0x8CA0, 0x8CA0, 0x1F0C, 0x8CA1, 0x8CA1, 0x1E59, 0x8CA2, 0x8CA2, 0x1F24,

+    0x8CA3, 0x8CA6, 0x4B82, 0x8CA7, 0x8CA7, 0x20BA, 0x8CA8, 0x8CA8, 0x1F65,

+    0x8CA9, 0x8CA9, 0x1EF0, 0x8CAA, 0x8CAA, 0x2164, 0x8CAB, 0x8CAB, 0x1F30,

+    0x8CAC, 0x8CAC, 0x2261, 0x8CAD, 0x8CAE, 0x4B86, 0x8CAF, 0x8CAF, 0x22A2,

+    0x8CB0, 0x8CB0, 0x24AB, 0x8CB1, 0x8CB1, 0x4B88, 0x8CB2, 0x8CB2, 0x24AF,

+    0x8CB3, 0x8CB3, 0x1EE8, 0x8CB4, 0x8CB4, 0x1F39, 0x8CB5, 0x8CB5, 0x4B89,

+    0x8CB6, 0x8CB6, 0x1E48, 0x8CB7, 0x8CB7, 0x2070, 0x8CB8, 0x8CB8, 0x1EA8,

+    0x8CB9, 0x8CB9, 0x4B8A, 0x8CBA, 0x8CBA, 0x24AC, 0x8CBB, 0x8CBB, 0x1EF7,

+    0x8CBC, 0x8CBC, 0x2176, 0x8CBD, 0x8CBD, 0x24AD, 0x8CBE, 0x8CBE, 0x4B8B,

+    0x8CBF, 0x8CBF, 0x207B, 0x8CC0, 0x8CC0, 0x1F45, 0x8CC1, 0x8CC1, 0x24AA,

+    0x8CC2, 0x8CC2, 0x204B, 0x8CC3, 0x8CC3, 0x202F, 0x8CC4, 0x8CC4, 0x1F5A,

+    0x8CC5, 0x8CC5, 0x24B0, 0x8CC6, 0x8CC6, 0x4B8C, 0x8CC7, 0x8CC7, 0x22B7,

+    0x8CC8, 0x8CC8, 0x1F7F, 0x8CC9, 0x8CC9, 0x4B8D, 0x8CCA, 0x8CCA, 0x2265,

+    0x8CCB, 0x8CD0, 0x4B8E, 0x8CD1, 0x8CD1, 0x24B2, 0x8CD2, 0x8CD2, 0x211B,

+    0x8CD3, 0x8CD3, 0x1E51, 0x8CD4, 0x8CD4, 0x4B94, 0x8CD5, 0x8CD5, 0x24B4,

+    0x8CD6, 0x8CD9, 0x4B95, 0x8CDA, 0x8CDA, 0x24B3, 0x8CDB, 0x8CDB, 0x4B99,

+    0x8CDC, 0x8CDC, 0x1E9F, 0x8CDD, 0x8CDD, 0x4B9A, 0x8CDE, 0x8CDE, 0x2118,

+    0x8CDF, 0x8CDF, 0x4B9B, 0x8CE0, 0x8CE0, 0x20B4, 0x8CE1, 0x8CE1, 0x23AF,

+    0x8CE2, 0x8CE2, 0x21BB, 0x8CE3, 0x8CE3, 0x2072, 0x8CE4, 0x8CE4, 0x1F95,

+    0x8CE5, 0x8CE5, 0x4B9C, 0x8CE6, 0x8CE6, 0x1F0A, 0x8CE7, 0x8CE7, 0x24B6,

+    0x8CE8, 0x8CE9, 0x4B9D, 0x8CEA, 0x8CEA, 0x2291, 0x8CEB, 0x8CEB, 0x24B5,

+    0x8CEC, 0x8CEC, 0x2278, 0x8CED, 0x8CED, 0x1ED4, 0x8CEE, 0x8CF3, 0x4B9F,

+    0x8CF4, 0x8CF4, 0x1FF3, 0x8CF5, 0x8CF9, 0x4BA5, 0x8CFA, 0x8CFA, 0x22A9,

+    0x8CFB, 0x8CFB, 0x24B7, 0x8CFC, 0x8CFC, 0x1F28, 0x8CFD, 0x8CFD, 0x2109,

+    0x8CFE, 0x8CFE, 0x22C7, 0x8CFF, 0x8CFF, 0x4BAA, 0x8D00, 0x8D03, 0x4BAB,

+    0x8D04, 0x8D04, 0x24AE, 0x8D05, 0x8D05, 0x22B1, 0x8D06, 0x8D07, 0x4BAF,

+    0x8D08, 0x8D08, 0x2266, 0x8D09, 0x8D09, 0x4BB1, 0x8D0A, 0x8D0A, 0x225B,

+    0x8D0B, 0x8D0B, 0x22C4, 0x8D0C, 0x8D0C, 0x4BB2, 0x8D0D, 0x8D0D, 0x2115,

+    0x8D0E, 0x8D0E, 0x4BB3, 0x8D0F, 0x8D0F, 0x222A, 0x8D10, 0x8D10, 0x24B1,

+    0x8D11, 0x8D15, 0x4BB4, 0x8D16, 0x8D16, 0x213D, 0x8D17, 0x8D1A, 0x4BB9,

+    0x8D1B, 0x8D1B, 0x1F15, 0x8D1C, 0x8D1C, 0x225C, 0x8D1D, 0x8D1D, 0x041D,

+    0x8D1E, 0x8D1E, 0x118B, 0x8D1F, 0x8D1F, 0x06B5, 0x8D20, 0x8D20, 0x4BBD,

+    0x8D21, 0x8D21, 0x070A, 0x8D22, 0x8D22, 0x048D, 0x8D23, 0x8D23, 0x1133,

+    0x8D24, 0x8D24, 0x0F3A, 0x8D25, 0x8D25, 0x03E7, 0x8D26, 0x8D26, 0x116C,

+    0x8D27, 0x8D27, 0x080A, 0x8D28, 0x8D28, 0x11C9, 0x8D29, 0x8D29, 0x0654,

+    0x8D2A, 0x8D2A, 0x0E03, 0x8D2B, 0x8D2B, 0x0BD5, 0x8D2C, 0x8D2C, 0x044A,

+    0x8D2D, 0x8D2D, 0x0713, 0x8D2E, 0x8D2E, 0x11FB, 0x8D2F, 0x8D2F, 0x073A,

+    0x8D30, 0x8D30, 0x063E, 0x8D31, 0x8D31, 0x086D, 0x8D32, 0x8D33, 0x192C,

+    0x8D34, 0x8D34, 0x0E4C, 0x8D35, 0x8D35, 0x074C, 0x8D36, 0x8D36, 0x192E,

+    0x8D37, 0x8D37, 0x057E, 0x8D38, 0x8D38, 0x0AB8, 0x8D39, 0x8D39, 0x066E,

+    0x8D3A, 0x8D3A, 0x078F, 0x8D3B, 0x8D3B, 0x192F, 0x8D3C, 0x8D3C, 0x1137,

+    0x8D3D, 0x8D3D, 0x1930, 0x8D3E, 0x8D3E, 0x0849, 0x8D3F, 0x8D3F, 0x07F4,

+    0x8D40, 0x8D40, 0x1931, 0x8D41, 0x8D41, 0x0A27, 0x8D42, 0x8D42, 0x0A5F,

+    0x8D43, 0x8D43, 0x1122, 0x8D44, 0x8D44, 0x1227, 0x8D45, 0x8D46, 0x1932,

+    0x8D47, 0x8D47, 0x1936, 0x8D48, 0x8D49, 0x1934, 0x8D4A, 0x8D4A, 0x0D17,

+    0x8D4B, 0x8D4B, 0x06AE, 0x8D4C, 0x8D4C, 0x0603, 0x8D4D, 0x8D4D, 0x1937,

+    0x8D4E, 0x8D4E, 0x0D81, 0x8D4F, 0x8D4F, 0x0D06, 0x8D50, 0x8D50, 0x0550,

+    0x8D51, 0x8D52, 0x4BBE, 0x8D53, 0x8D53, 0x163B, 0x8D54, 0x8D54, 0x0BA3,

+    0x8D55, 0x8D55, 0x1938, 0x8D56, 0x8D56, 0x09A0, 0x8D57, 0x8D57, 0x4BC0,

+    0x8D58, 0x8D58, 0x1215, 0x8D59, 0x8D59, 0x1939, 0x8D5A, 0x8D5A, 0x1209,

+    0x8D5B, 0x8D5B, 0x0CD7, 0x8D5C, 0x8D5C, 0x1289, 0x8D5D, 0x8D5D, 0x1283,

+    0x8D5E, 0x8D5E, 0x1121, 0x8D5F, 0x8D5F, 0x4BC1, 0x8D60, 0x8D60, 0x113C,

+    0x8D61, 0x8D61, 0x0CFD, 0x8D62, 0x8D62, 0x1093, 0x8D63, 0x8D63, 0x06CE,

+    0x8D64, 0x8D64, 0x0505, 0x8D65, 0x8D65, 0x4BC2, 0x8D66, 0x8D66, 0x0D1B,

+    0x8D67, 0x8D67, 0x1CF4, 0x8D68, 0x8D6A, 0x4BC3, 0x8D6B, 0x8D6B, 0x078C,

+    0x8D6C, 0x8D6C, 0x4BC6, 0x8D6D, 0x8D6D, 0x1CF5, 0x8D6E, 0x8D6F, 0x4BC7,

+    0x8D70, 0x8D70, 0x123C, 0x8D71, 0x8D72, 0x4BC9, 0x8D73, 0x8D73, 0x1CEF,

+    0x8D74, 0x8D74, 0x06AB, 0x8D75, 0x8D75, 0x1175, 0x8D76, 0x8D76, 0x06CA,

+    0x8D77, 0x8D77, 0x0C0F, 0x8D78, 0x8D80, 0x4BCB, 0x8D81, 0x8D81, 0x04E8,

+    0x8D82, 0x8D83, 0x4BD4, 0x8D84, 0x8D84, 0x1CF0, 0x8D85, 0x8D85, 0x04D1,

+    0x8D86, 0x8D89, 0x4BD6, 0x8D8A, 0x8D8A, 0x1100, 0x8D8B, 0x8D8B, 0x0C74,

+    0x8D8C, 0x8D90, 0x4BDA, 0x8D91, 0x8D91, 0x1CF2, 0x8D92, 0x8D93, 0x4BDF,

+    0x8D94, 0x8D94, 0x1CF1, 0x8D95, 0x8D95, 0x1F14, 0x8D96, 0x8D98, 0x4BE1,

+    0x8D99, 0x8D99, 0x227A, 0x8D9A, 0x8D9E, 0x4BE4, 0x8D9F, 0x8D9F, 0x0E1E,

+    0x8DA0, 0x8DA2, 0x4BE9, 0x8DA3, 0x8DA3, 0x0C7F, 0x8DA4, 0x8DA7, 0x4BEC,

+    0x8DA8, 0x8DA8, 0x20EE, 0x8DA9, 0x8DB0, 0x4BF0, 0x8DB1, 0x8DB1, 0x1CF3,

+    0x8DB2, 0x8DB2, 0x25F8, 0x8DB3, 0x8DB3, 0x1240, 0x8DB4, 0x8DB4, 0x0B80,

+    0x8DB5, 0x8DB5, 0x1D1C, 0x8DB6, 0x8DB7, 0x4BF8, 0x8DB8, 0x8DB8, 0x1D17,

+    0x8DB9, 0x8DB9, 0x4BFA, 0x8DBA, 0x8DBA, 0x1D1F, 0x8DBB, 0x8DBB, 0x4BFB,

+    0x8DBC, 0x8DBC, 0x1D1E, 0x8DBD, 0x8DBD, 0x4BFC, 0x8DBE, 0x8DBE, 0x11B9,

+    0x8DBF, 0x8DBF, 0x1D1D, 0x8DC0, 0x8DC2, 0x4BFD, 0x8DC3, 0x8DC3, 0x1101,

+    0x8DC4, 0x8DC4, 0x1D20, 0x8DC5, 0x8DC5, 0x4C00, 0x8DC6, 0x8DC6, 0x1D28,

+    0x8DC7, 0x8DCA, 0x4C01, 0x8DCB, 0x8DCB, 0x03DA, 0x8DCC, 0x8DCC, 0x05D9,

+    0x8DCD, 0x8DCD, 0x4C05, 0x8DCE, 0x8DCF, 0x1D25, 0x8DD0, 0x8DD0, 0x4C06,

+    0x8DD1, 0x8DD1, 0x0B9D, 0x8DD2, 0x8DD5, 0x4C07, 0x8DD6, 0x8DD7, 0x1D21,

+    0x8DD8, 0x8DD9, 0x4C0B, 0x8DDA, 0x8DDA, 0x1D23, 0x8DDB, 0x8DDB, 0x1D27,

+    0x8DDC, 0x8DDC, 0x4C0D, 0x8DDD, 0x8DDD, 0x090F, 0x8DDE, 0x8DDE, 0x1D24,

+    0x8DDF, 0x8DDF, 0x06F5, 0x8DE0, 0x8DE2, 0x4C0E, 0x8DE3, 0x8DE3, 0x1D2C,

+    0x8DE4, 0x8DE4, 0x1D2F, 0x8DE5, 0x8DE7, 0x4C11, 0x8DE8, 0x8DE8, 0x0974,

+    0x8DE9, 0x8DE9, 0x4C14, 0x8DEA, 0x8DEA, 0x074B, 0x8DEB, 0x8DEB, 0x1D18,

+    0x8DEC, 0x8DEC, 0x1D29, 0x8DED, 0x8DEE, 0x4C15, 0x8DEF, 0x8DEF, 0x0A5E,

+    0x8DF0, 0x8DF2, 0x4C17, 0x8DF3, 0x8DF3, 0x0E4B, 0x8DF4, 0x8DF4, 0x4C1A,

+    0x8DF5, 0x8DF5, 0x086C, 0x8DF6, 0x8DF6, 0x4C1B, 0x8DF7, 0x8DF8, 0x1D2A,

+    0x8DF9, 0x8DF9, 0x1D2D, 0x8DFA, 0x8DFA, 0x0624, 0x8DFB, 0x8DFB, 0x1D2E,

+    0x8DFC, 0x8DFC, 0x4C1C, 0x8DFD, 0x8DFD, 0x1D31, 0x8DFE, 0x8DFF, 0x4C1D,

+    0x8E00, 0x8E04, 0x4C1F, 0x8E05, 0x8E05, 0x1D19, 0x8E06, 0x8E08, 0x4C24,

+    0x8E09, 0x8E09, 0x1D30, 0x8E0A, 0x8E0A, 0x10A0, 0x8E0B, 0x8E0B, 0x4C27,

+    0x8E0C, 0x8E0C, 0x0511, 0x8E0D, 0x8E0E, 0x4C28, 0x8E0F, 0x8E0F, 0x0DF7,

+    0x8E10, 0x8E10, 0x1F94, 0x8E11, 0x8E13, 0x4C2A, 0x8E14, 0x8E14, 0x1D32,

+    0x8E15, 0x8E1C, 0x4C2D, 0x8E1D, 0x8E1D, 0x1D33, 0x8E1E, 0x8E1E, 0x0910,

+    0x8E1F, 0x8E1F, 0x1D34, 0x8E20, 0x8E21, 0x4C35, 0x8E22, 0x8E22, 0x0E32,

+    0x8E23, 0x8E23, 0x1D37, 0x8E24, 0x8E28, 0x4C37, 0x8E29, 0x8E29, 0x048F,

+    0x8E2A, 0x8E2A, 0x1236, 0x8E2B, 0x8E2B, 0x4C3C, 0x8E2C, 0x8E2C, 0x1D35,

+    0x8E2D, 0x8E2D, 0x4C3D, 0x8E2E, 0x8E2E, 0x1D36, 0x8E2F, 0x8E2F, 0x1D38,

+    0x8E30, 0x8E30, 0x4C3E, 0x8E31, 0x8E31, 0x1D3E, 0x8E32, 0x8E33, 0x4C3F,

+    0x8E34, 0x8E34, 0x2230, 0x8E35, 0x8E35, 0x1D3C, 0x8E36, 0x8E38, 0x4C41,

+    0x8E39, 0x8E39, 0x1D3B, 0x8E3A, 0x8E3A, 0x1D39, 0x8E3B, 0x8E3C, 0x4C44,

+    0x8E3D, 0x8E3D, 0x1D3D, 0x8E3E, 0x8E3F, 0x4C46, 0x8E40, 0x8E40, 0x1D3A,

+    0x8E41, 0x8E42, 0x1D40, 0x8E43, 0x8E43, 0x4C48, 0x8E44, 0x8E44, 0x0E36,

+    0x8E45, 0x8E46, 0x4C49, 0x8E47, 0x8E47, 0x173B, 0x8E48, 0x8E48, 0x0599,

+    0x8E49, 0x8E49, 0x1D3F, 0x8E4A, 0x8E4A, 0x1D44, 0x8E4B, 0x8E4B, 0x0DF6,

+    0x8E4C, 0x8E4C, 0x25FD, 0x8E4D, 0x8E50, 0x4C4B, 0x8E51, 0x8E52, 0x1D42,

+    0x8E53, 0x8E54, 0x4C4F, 0x8E55, 0x8E55, 0x2600, 0x8E56, 0x8E58, 0x4C51,

+    0x8E59, 0x8E59, 0x1D1A, 0x8E5A, 0x8E62, 0x4C54, 0x8E63, 0x8E63, 0x2606,

+    0x8E64, 0x8E65, 0x4C5D, 0x8E66, 0x8E66, 0x042D, 0x8E67, 0x8E68, 0x4C5F,

+    0x8E69, 0x8E69, 0x1D1B, 0x8E6A, 0x8E6B, 0x4C61, 0x8E6C, 0x8E6C, 0x05A6,

+    0x8E6D, 0x8E6D, 0x04AB, 0x8E6E, 0x8E6E, 0x4C63, 0x8E6F, 0x8E6F, 0x1D48,

+    0x8E70, 0x8E70, 0x1D45, 0x8E71, 0x8E71, 0x4C64, 0x8E72, 0x8E72, 0x0616,

+    0x8E73, 0x8E73, 0x4C65, 0x8E74, 0x8E74, 0x1D49, 0x8E75, 0x8E75, 0x4C66,

+    0x8E76, 0x8E76, 0x1D46, 0x8E77, 0x8E79, 0x4C67, 0x8E7A, 0x8E7A, 0x25FF,

+    0x8E7B, 0x8E7B, 0x4C6A, 0x8E7C, 0x8E7C, 0x1D47, 0x8E7D, 0x8E7E, 0x4C6B,

+    0x8E7F, 0x8E7F, 0x055D, 0x8E80, 0x8E80, 0x4C6D, 0x8E81, 0x8E81, 0x112D,

+    0x8E82, 0x8E84, 0x4C6E, 0x8E85, 0x8E85, 0x1D4A, 0x8E86, 0x8E86, 0x4C71,

+    0x8E87, 0x8E87, 0x051E, 0x8E88, 0x8E88, 0x4C72, 0x8E89, 0x8E89, 0x25FC,

+    0x8E8A, 0x8E8A, 0x1E8C, 0x8E8B, 0x8E8B, 0x2602, 0x8E8C, 0x8E8C, 0x4C73,

+    0x8E8D, 0x8E8D, 0x224D, 0x8E8E, 0x8E8E, 0x4C74, 0x8E8F, 0x8E8F, 0x1D4B,

+    0x8E90, 0x8E90, 0x1D4D, 0x8E91, 0x8E91, 0x2604, 0x8E92, 0x8E92, 0x25FE,

+    0x8E93, 0x8E93, 0x2603, 0x8E94, 0x8E94, 0x1D4C, 0x8E95, 0x8E99, 0x4C75,

+    0x8E9A, 0x8E9A, 0x2601, 0x8E9B, 0x8E9B, 0x4C7A, 0x8E9C, 0x8E9C, 0x1D4E,

+    0x8E9D, 0x8E9D, 0x4C7B, 0x8E9E, 0x8E9E, 0x1D4F, 0x8E9F, 0x8EA0, 0x4C7C,

+    0x8EA1, 0x8EA1, 0x2605, 0x8EA2, 0x8EA4, 0x4C7E, 0x8EA5, 0x8EA5, 0x1EA3,

+    0x8EA6, 0x8EA6, 0x2608, 0x8EA7, 0x8EA9, 0x4C81, 0x8EAA, 0x8EAA, 0x2607,

+    0x8EAB, 0x8EAB, 0x0D26, 0x8EAC, 0x8EAC, 0x0703, 0x8EAD, 0x8EAE, 0x4C84,

+    0x8EAF, 0x8EAF, 0x0C78, 0x8EB0, 0x8EB1, 0x4C86, 0x8EB2, 0x8EB2, 0x0622,

+    0x8EB3, 0x8EB9, 0x4C88, 0x8EBA, 0x8EBA, 0x0E1C, 0x8EBB, 0x8EBF, 0x4C8F,

+    0x8EC0, 0x8EC0, 0x20F0, 0x8EC1, 0x8EC9, 0x4C94, 0x8ECA, 0x8ECA, 0x1E7B,

+    0x8ECB, 0x8ECB, 0x2267, 0x8ECC, 0x8ECC, 0x1F36, 0x8ECD, 0x8ECD, 0x1FD6,

+    0x8ECE, 0x8ECE, 0x18F8, 0x8ECF, 0x8ED1, 0x4C9D, 0x8ED2, 0x8ED2, 0x21E0,

+    0x8ED3, 0x8ED3, 0x4CA0, 0x8ED4, 0x8ED4, 0x248C, 0x8ED5, 0x8EDA, 0x4CA1,

+    0x8EDB, 0x8EDB, 0x248D, 0x8EDC, 0x8EDE, 0x4CA7, 0x8EDF, 0x8EDF, 0x2102,

+    0x8EE0, 0x8EE3, 0x4CAA, 0x8EE4, 0x8EE4, 0x2494, 0x8EE5, 0x8EEA, 0x4CAE,

+    0x8EEB, 0x8EEB, 0x2493, 0x8EEC, 0x8EF1, 0x4CB4, 0x8EF2, 0x8EF2, 0x248E,

+    0x8EF3, 0x8EF7, 0x4CBA, 0x8EF8, 0x8EF8, 0x2299, 0x8EF9, 0x8EF9, 0x2491,

+    0x8EFA, 0x8EFA, 0x2496, 0x8EFB, 0x8EFB, 0x248F, 0x8EFC, 0x8EFC, 0x2492,

+    0x8EFD, 0x8EFD, 0x4CBF, 0x8EFE, 0x8EFE, 0x2497, 0x8EFF, 0x8EFF, 0x4CC0,

+    0x8F00, 0x8F02, 0x4CC1, 0x8F03, 0x8F03, 0x1FB1, 0x8F04, 0x8F04, 0x4CC4,

+    0x8F05, 0x8F05, 0x249A, 0x8F06, 0x8F06, 0x4CC5, 0x8F07, 0x8F07, 0x2499,

+    0x8F08, 0x8F08, 0x4CC6, 0x8F09, 0x8F09, 0x2258, 0x8F0A, 0x8F0A, 0x2498,

+    0x8F0B, 0x8F11, 0x4CC7, 0x8F12, 0x8F12, 0x249B, 0x8F13, 0x8F13, 0x4CCE,

+    0x8F14, 0x8F14, 0x1F09, 0x8F15, 0x8F15, 0x20E6, 0x8F16, 0x8F1A, 0x4CCF,

+    0x8F1B, 0x8F1B, 0x2026, 0x8F1C, 0x8F1C, 0x249F, 0x8F1D, 0x8F1D, 0x1F59,

+    0x8F1E, 0x8F1F, 0x249D, 0x8F20, 0x8F24, 0x4CD4, 0x8F25, 0x8F25, 0x1F3B,

+    0x8F26, 0x8F26, 0x249C, 0x8F27, 0x8F28, 0x4CD9, 0x8F29, 0x8F29, 0x1E3A,

+    0x8F2A, 0x8F2A, 0x205B, 0x8F2B, 0x8F2E, 0x4CDB, 0x8F2F, 0x8F2F, 0x1F70,

+    0x8F30, 0x8F32, 0x4CDF, 0x8F33, 0x8F33, 0x24A0, 0x8F34, 0x8F37, 0x4CE2,

+    0x8F38, 0x8F38, 0x213B, 0x8F39, 0x8F3A, 0x4CE6, 0x8F3B, 0x8F3B, 0x1F07,

+    0x8F3C, 0x8F3D, 0x4CE8, 0x8F3E, 0x8F3E, 0x2270, 0x8F3F, 0x8F3F, 0x2237,

+    0x8F40, 0x8F41, 0x4CEA, 0x8F42, 0x8F42, 0x24D2, 0x8F43, 0x8F43, 0x4CEC,

+    0x8F44, 0x8F44, 0x21B3, 0x8F45, 0x8F45, 0x2245, 0x8F46, 0x8F46, 0x24A1,

+    0x8F47, 0x8F48, 0x4CED, 0x8F49, 0x8F49, 0x22A8, 0x8F4A, 0x8F4C, 0x4CEF,

+    0x8F4D, 0x8F4D, 0x227C, 0x8F4E, 0x8F4E, 0x1FB0, 0x8F4F, 0x8F53, 0x4CF2,

+    0x8F54, 0x8F54, 0x24A2, 0x8F55, 0x8F5E, 0x4CF7, 0x8F5F, 0x8F5F, 0x1F46,

+    0x8F60, 0x8F60, 0x4D01, 0x8F61, 0x8F61, 0x2380, 0x8F62, 0x8F62, 0x2495,

+    0x8F63, 0x8F63, 0x4D02, 0x8F64, 0x8F64, 0x2490, 0x8F65, 0x8F65, 0x4D03,

+    0x8F66, 0x8F66, 0x04DA, 0x8F67, 0x8F67, 0x1141, 0x8F68, 0x8F68, 0x0745,

+    0x8F69, 0x8F69, 0x0FC4, 0x8F6A, 0x8F6A, 0x4D04, 0x8F6B, 0x8F6B, 0x18E1,

+    0x8F6C, 0x8F6C, 0x1207, 0x8F6D, 0x8F6D, 0x18E2, 0x8F6E, 0x8F6E, 0x0A7D,

+    0x8F6F, 0x8F6F, 0x0CC8, 0x8F70, 0x8F70, 0x079B, 0x8F71, 0x8F73, 0x18E3,

+    0x8F74, 0x8F74, 0x11E0, 0x8F75, 0x8F76, 0x18E6, 0x8F77, 0x8F77, 0x18E9,

+    0x8F78, 0x8F78, 0x18E8, 0x8F79, 0x8F7A, 0x18EA, 0x8F7B, 0x8F7B, 0x0C5E,

+    0x8F7C, 0x8F7C, 0x18EC, 0x8F7D, 0x8F7D, 0x111B, 0x8F7E, 0x8F7E, 0x18ED,

+    0x8F7F, 0x8F7F, 0x089F, 0x8F80, 0x8F80, 0x4D05, 0x8F81, 0x8F82, 0x18EE,

+    0x8F83, 0x8F83, 0x08A0, 0x8F84, 0x8F84, 0x18F0, 0x8F85, 0x8F85, 0x06A3,

+    0x8F86, 0x8F86, 0x0A07, 0x8F87, 0x8F87, 0x18F1, 0x8F88, 0x8F88, 0x041B,

+    0x8F89, 0x8F89, 0x07E9, 0x8F8A, 0x8F8A, 0x074E, 0x8F8B, 0x8F8B, 0x18F2,

+    0x8F8C, 0x8F8C, 0x4D06, 0x8F8D, 0x8F8F, 0x18F3, 0x8F90, 0x8F90, 0x0695,

+    0x8F91, 0x8F91, 0x0820, 0x8F92, 0x8F92, 0x4D07, 0x8F93, 0x8F93, 0x0D7B,

+    0x8F94, 0x8F94, 0x1574, 0x8F95, 0x8F95, 0x10F2, 0x8F96, 0x8F96, 0x0F2A,

+    0x8F97, 0x8F97, 0x1158, 0x8F98, 0x8F98, 0x18F6, 0x8F99, 0x8F99, 0x117F,

+    0x8F9A, 0x8F9A, 0x18F7, 0x8F9B, 0x8F9B, 0x0F8C, 0x8F9C, 0x8F9C, 0x0715,

+    0x8F9D, 0x8F9D, 0x4D08, 0x8F9E, 0x8F9E, 0x054A, 0x8F9F, 0x8F9F, 0x0442,

+    0x8FA0, 0x8FA2, 0x4D09, 0x8FA3, 0x8FA3, 0x099C, 0x8FA4, 0x8FA5, 0x4D0C,

+    0x8FA6, 0x8FA6, 0x1E30, 0x8FA7, 0x8FA7, 0x4D0E, 0x8FA8, 0x8FA9, 0x044F,

+    0x8FAA, 0x8FAA, 0x4D0F, 0x8FAB, 0x8FAB, 0x0451, 0x8FAC, 0x8FAC, 0x4D10,

+    0x8FAD, 0x8FAD, 0x1E9D, 0x8FAE, 0x8FAE, 0x1E4B, 0x8FAF, 0x8FAF, 0x1E4A,

+    0x8FB0, 0x8FB0, 0x04E2, 0x8FB1, 0x8FB1, 0x0CC3, 0x8FB2, 0x8FB2, 0x20AA,

+    0x8FB3, 0x8FB5, 0x4D11, 0x8FB6, 0x8FB6, 0x173D, 0x8FB7, 0x8FB8, 0x4D14,

+    0x8FB9, 0x8FB9, 0x0448, 0x8FBA, 0x8FBC, 0x4D16, 0x8FBD, 0x8FBD, 0x0A12,

+    0x8FBE, 0x8FBE, 0x0572, 0x8FBF, 0x8FC0, 0x4D19, 0x8FC1, 0x8FC1, 0x0C25,

+    0x8FC2, 0x8FC2, 0x10BD, 0x8FC3, 0x8FC3, 0x4D1B, 0x8FC4, 0x8FC4, 0x0C18,

+    0x8FC5, 0x8FC5, 0x0FE1, 0x8FC6, 0x8FC6, 0x4D1C, 0x8FC7, 0x8FC7, 0x0756,

+    0x8FC8, 0x8FC8, 0x0A9C, 0x8FC9, 0x8FCD, 0x4D1D, 0x8FCE, 0x8FCE, 0x1092,

+    0x8FCF, 0x8FCF, 0x4D22, 0x8FD0, 0x8FD0, 0x110E, 0x8FD1, 0x8FD1, 0x08CD,

+    0x8FD2, 0x8FD2, 0x4D23, 0x8FD3, 0x8FD3, 0x173E, 0x8FD4, 0x8FD4, 0x0652,

+    0x8FD5, 0x8FD5, 0x173F, 0x8FD6, 0x8FD7, 0x4D24, 0x8FD8, 0x8FD8, 0x07CE,

+    0x8FD9, 0x8FD9, 0x1183, 0x8FDA, 0x8FDA, 0x4D26, 0x8FDB, 0x8FDB, 0x08C9,

+    0x8FDC, 0x8FDC, 0x10F9, 0x8FDD, 0x8FDD, 0x0EB4, 0x8FDE, 0x8FDE, 0x09F5,

+    0x8FDF, 0x8FDF, 0x04FE, 0x8FE0, 0x8FE1, 0x4D27, 0x8FE2, 0x8FE2, 0x0E49,

+    0x8FE3, 0x8FE3, 0x4D29, 0x8FE4, 0x8FE4, 0x1742, 0x8FE5, 0x8FE5, 0x1740,

+    0x8FE6, 0x8FE6, 0x1744, 0x8FE7, 0x8FE7, 0x4D2A, 0x8FE8, 0x8FE8, 0x1746,

+    0x8FE9, 0x8FE9, 0x1743, 0x8FEA, 0x8FEA, 0x05B0, 0x8FEB, 0x8FEB, 0x0BE7,

+    0x8FEC, 0x8FEC, 0x4D2B, 0x8FED, 0x8FED, 0x05DD, 0x8FEE, 0x8FEE, 0x1741,

+    0x8FEF, 0x8FEF, 0x4D2C, 0x8FF0, 0x8FF0, 0x0D8D, 0x8FF1, 0x8FF2, 0x4D2D,

+    0x8FF3, 0x8FF3, 0x1745, 0x8FF4, 0x8FF4, 0x267B, 0x8FF5, 0x8FF6, 0x4D2F,

+    0x8FF7, 0x8FF7, 0x0AD9, 0x8FF8, 0x8FF8, 0x042E, 0x8FF9, 0x8FF9, 0x0816,

+    0x8FFA, 0x8FFC, 0x4D31, 0x8FFD, 0x8FFD, 0x1214, 0x8FFE, 0x8FFF, 0x4D34,

+    0x9000, 0x9000, 0x0E7C, 0x9001, 0x9001, 0x0DC2, 0x9002, 0x9002, 0x0D61,

+    0x9003, 0x9003, 0x0E26, 0x9004, 0x9004, 0x1748, 0x9005, 0x9005, 0x1747,

+    0x9006, 0x9006, 0x0B49, 0x9007, 0x9008, 0x4D36, 0x9009, 0x9009, 0x0FCA,

+    0x900A, 0x900A, 0x0FE0, 0x900B, 0x900B, 0x1749, 0x900C, 0x900C, 0x4D38,

+    0x900D, 0x900D, 0x174C, 0x900E, 0x900E, 0x4D39, 0x900F, 0x900F, 0x0E69,

+    0x9010, 0x9010, 0x11EF, 0x9011, 0x9011, 0x174B, 0x9012, 0x9012, 0x05BE,

+    0x9013, 0x9013, 0x4D3A, 0x9014, 0x9014, 0x0E6F, 0x9015, 0x9015, 0x23F2,

+    0x9016, 0x9016, 0x174D, 0x9017, 0x9017, 0x05F9, 0x9018, 0x9018, 0x4D3B,

+    0x9019, 0x9019, 0x227E, 0x901A, 0x901A, 0x0E59, 0x901B, 0x901B, 0x073D,

+    0x901C, 0x901C, 0x4D3C, 0x901D, 0x901D, 0x0D5C, 0x901E, 0x901E, 0x04F6,

+    0x901F, 0x901F, 0x0DCE, 0x9020, 0x9020, 0x112F, 0x9021, 0x9021, 0x174E,

+    0x9022, 0x9022, 0x0687, 0x9023, 0x9023, 0x2019, 0x9024, 0x9025, 0x4D3D,

+    0x9026, 0x9026, 0x174A, 0x9027, 0x902C, 0x4D3F, 0x902D, 0x902D, 0x1751,

+    0x902E, 0x902E, 0x0581, 0x902F, 0x902F, 0x1752, 0x9030, 0x9031, 0x4D45,

+    0x9032, 0x9032, 0x1FBB, 0x9033, 0x9034, 0x4D47, 0x9035, 0x9036, 0x174F,

+    0x9037, 0x9037, 0x4D49, 0x9038, 0x9038, 0x1064, 0x9039, 0x903A, 0x4D4A,

+    0x903B, 0x903B, 0x0A86, 0x903C, 0x903C, 0x042F, 0x903D, 0x903D, 0x4D4C,

+    0x903E, 0x903E, 0x10C7, 0x903F, 0x9040, 0x4D4D, 0x9041, 0x9041, 0x061C,

+    0x9042, 0x9042, 0x0DE1, 0x9043, 0x9043, 0x4D4F, 0x9044, 0x9044, 0x1753,

+    0x9045, 0x9046, 0x4D50, 0x9047, 0x9047, 0x10DB, 0x9048, 0x904A, 0x4D52,

+    0x904B, 0x904B, 0x2253, 0x904C, 0x904C, 0x4D55, 0x904D, 0x904D, 0x0452,

+    0x904E, 0x904E, 0x1F3E, 0x904F, 0x904F, 0x0633, 0x9050, 0x9050, 0x1756,

+    0x9051, 0x9052, 0x1754, 0x9053, 0x9053, 0x05A1, 0x9054, 0x9054, 0x1EA6,

+    0x9055, 0x9055, 0x218E, 0x9056, 0x9056, 0x4D56, 0x9057, 0x9057, 0x104C,

+    0x9058, 0x9058, 0x1758, 0x9059, 0x905A, 0x4D57, 0x905B, 0x905B, 0x175A,

+    0x905C, 0x905C, 0x21EC, 0x905D, 0x905D, 0x4D59, 0x905E, 0x905E, 0x1EBE,

+    0x905F, 0x905F, 0x4D5A, 0x9060, 0x9060, 0x224A, 0x9061, 0x9061, 0x4D5B,

+    0x9062, 0x9062, 0x1759, 0x9063, 0x9063, 0x0C2F, 0x9064, 0x9064, 0x4D5C,

+    0x9065, 0x9065, 0x102A, 0x9066, 0x9067, 0x4D5D, 0x9068, 0x9068, 0x1757,

+    0x9069, 0x9069, 0x2133, 0x906A, 0x906C, 0x4D5F, 0x906D, 0x906D, 0x1125,

+    0x906E, 0x906E, 0x117B, 0x906F, 0x9071, 0x4D62, 0x9072, 0x9072, 0x1E84,

+    0x9073, 0x9073, 0x4D65, 0x9074, 0x9074, 0x175C, 0x9075, 0x9075, 0x124E,

+    0x9076, 0x9076, 0x4D66, 0x9077, 0x9077, 0x20CF, 0x9078, 0x9078, 0x21E2,

+    0x9079, 0x9079, 0x4D67, 0x907A, 0x907A, 0x220F, 0x907B, 0x907B, 0x4D68,

+    0x907C, 0x907C, 0x2029, 0x907D, 0x907D, 0x175D, 0x907E, 0x907E, 0x4D69,

+    0x907F, 0x907F, 0x0445, 0x9080, 0x9080, 0x1024, 0x9081, 0x9081, 0x2073,

+    0x9082, 0x9082, 0x175E, 0x9083, 0x9083, 0x1760, 0x9084, 0x9084, 0x1F55,

+    0x9085, 0x9086, 0x4D6A, 0x9087, 0x9087, 0x23F1, 0x9088, 0x9088, 0x175F,

+    0x9089, 0x9089, 0x4D6C, 0x908A, 0x908A, 0x1E46, 0x908B, 0x908B, 0x1761,

+    0x908C, 0x908E, 0x4D6D, 0x908F, 0x908F, 0x2063, 0x9090, 0x9090, 0x23F3,

+    0x9091, 0x9091, 0x105F, 0x9092, 0x9092, 0x4D70, 0x9093, 0x9093, 0x05AC,

+    0x9094, 0x9094, 0x4D71, 0x9095, 0x9095, 0x1817, 0x9096, 0x9096, 0x4D72,

+    0x9097, 0x9097, 0x1367, 0x9098, 0x9098, 0x4D73, 0x9099, 0x9099, 0x136A,

+    0x909A, 0x909A, 0x4D74, 0x909B, 0x909B, 0x1368, 0x909C, 0x909C, 0x4D75,

+    0x909D, 0x909D, 0x1369, 0x909E, 0x90A0, 0x4D76, 0x90A1, 0x90A1, 0x136C,

+    0x90A2, 0x90A2, 0x0F9A, 0x90A3, 0x90A3, 0x0B2A, 0x90A4, 0x90A5, 0x4D79,

+    0x90A6, 0x90A6, 0x03F9, 0x90A7, 0x90A9, 0x4D7B, 0x90AA, 0x90AA, 0x0F7B,

+    0x90AB, 0x90AB, 0x4D7E, 0x90AC, 0x90AC, 0x136B, 0x90AD, 0x90AD, 0x4D7F,

+    0x90AE, 0x90AE, 0x10AF, 0x90AF, 0x90AF, 0x0761, 0x90B0, 0x90B0, 0x1372,

+    0x90B1, 0x90B1, 0x0C6E, 0x90B2, 0x90B2, 0x4D80, 0x90B3, 0x90B3, 0x136E,

+    0x90B4, 0x90B4, 0x136D, 0x90B5, 0x90B5, 0x0D14, 0x90B6, 0x90B6, 0x136F,

+    0x90B7, 0x90B7, 0x4D81, 0x90B8, 0x90B8, 0x1371, 0x90B9, 0x90B9, 0x123B,

+    0x90BA, 0x90BA, 0x1370, 0x90BB, 0x90BB, 0x0A23, 0x90BC, 0x90BD, 0x4D82,

+    0x90BE, 0x90BE, 0x1375, 0x90BF, 0x90C0, 0x4D84, 0x90C1, 0x90C1, 0x10D9,

+    0x90C2, 0x90C3, 0x4D86, 0x90C4, 0x90C4, 0x1377, 0x90C5, 0x90C5, 0x1374,

+    0x90C6, 0x90C6, 0x4D88, 0x90C7, 0x90C7, 0x1378, 0x90C8, 0x90C9, 0x4D89,

+    0x90CA, 0x90CA, 0x088D, 0x90CB, 0x90CD, 0x4D8B, 0x90CE, 0x90CE, 0x09B4,

+    0x90CF, 0x90CF, 0x1373, 0x90D0, 0x90D0, 0x1376, 0x90D1, 0x90D1, 0x11A2,

+    0x90D2, 0x90D2, 0x4D8E, 0x90D3, 0x90D3, 0x1379, 0x90D4, 0x90D6, 0x4D8F,

+    0x90D7, 0x90D7, 0x137D, 0x90D8, 0x90DA, 0x4D92, 0x90DB, 0x90DB, 0x137E,

+    0x90DC, 0x90DC, 0x137C, 0x90DD, 0x90DD, 0x0779, 0x90DE, 0x90DE, 0x4D95,

+    0x90DF, 0x90DF, 0x231E, 0x90E0, 0x90E0, 0x4D96, 0x90E1, 0x90E1, 0x0931,

+    0x90E2, 0x90E2, 0x137B, 0x90E3, 0x90E5, 0x4D97, 0x90E6, 0x90E6, 0x137A,

+    0x90E7, 0x90E7, 0x110A, 0x90E8, 0x90E8, 0x0486, 0x90E9, 0x90EA, 0x4D9A,

+    0x90EB, 0x90EB, 0x137F, 0x90EC, 0x90EC, 0x4D9C, 0x90ED, 0x90ED, 0x0752,

+    0x90EE, 0x90EE, 0x4D9D, 0x90EF, 0x90EF, 0x1380, 0x90F0, 0x90F3, 0x4D9E,

+    0x90F4, 0x90F4, 0x04E0, 0x90F5, 0x90F5, 0x2233, 0x90F6, 0x90F7, 0x4DA2,

+    0x90F8, 0x90F8, 0x0587, 0x90F9, 0x90FC, 0x4DA4, 0x90FD, 0x90FD, 0x05FB,

+    0x90FE, 0x90FE, 0x1381, 0x90FF, 0x90FF, 0x4DA8, 0x9100, 0x9101, 0x4DA9,

+    0x9102, 0x9102, 0x0634, 0x9103, 0x9103, 0x4DAB, 0x9104, 0x9104, 0x1382,

+    0x9105, 0x9105, 0x4DAC, 0x9106, 0x9106, 0x2320, 0x9107, 0x9108, 0x4DAD,

+    0x9109, 0x9109, 0x21C7, 0x910A, 0x9111, 0x4DAF, 0x9112, 0x9112, 0x22BC,

+    0x9113, 0x9113, 0x4DB7, 0x9114, 0x9114, 0x231C, 0x9115, 0x9115, 0x4DB8,

+    0x9116, 0x9116, 0x2251, 0x9117, 0x9118, 0x4DB9, 0x9119, 0x9119, 0x0432,

+    0x911A, 0x911D, 0x4DBB, 0x911E, 0x911E, 0x1384, 0x911F, 0x9121, 0x4DBF,

+    0x9122, 0x9122, 0x1383, 0x9123, 0x9123, 0x1385, 0x9124, 0x9126, 0x4DC2,

+    0x9127, 0x9127, 0x1EBB, 0x9128, 0x912C, 0x4DC5, 0x912D, 0x912D, 0x2287,

+    0x912E, 0x912E, 0x4DCA, 0x912F, 0x912F, 0x1387, 0x9130, 0x9130, 0x202D,

+    0x9131, 0x9131, 0x1386, 0x9132, 0x9132, 0x1EAB, 0x9133, 0x9133, 0x4DCB,

+    0x9134, 0x9134, 0x231D, 0x9135, 0x9135, 0x4DCC, 0x9136, 0x9136, 0x231F,

+    0x9137, 0x9138, 0x4DCD, 0x9139, 0x9139, 0x1388, 0x913A, 0x913A, 0x231B,

+    0x913B, 0x9142, 0x4DCF, 0x9143, 0x9143, 0x1389, 0x9144, 0x9145, 0x4DD7,

+    0x9146, 0x9146, 0x138A, 0x9147, 0x9147, 0x4DD9, 0x9148, 0x9148, 0x2321,

+    0x9149, 0x9149, 0x10B4, 0x914A, 0x914A, 0x1CF8, 0x914B, 0x914B, 0x0C72,

+    0x914C, 0x914C, 0x1220, 0x914D, 0x914D, 0x0BA5, 0x914E, 0x914F, 0x1CFA,

+    0x9150, 0x9150, 0x1CF9, 0x9151, 0x9151, 0x4DDA, 0x9152, 0x9152, 0x08F5,

+    0x9153, 0x9156, 0x4DDB, 0x9157, 0x9157, 0x0FBA, 0x9158, 0x9159, 0x4DDF,

+    0x915A, 0x915A, 0x0670, 0x915B, 0x915C, 0x4DE1, 0x915D, 0x915D, 0x1110,

+    0x915E, 0x915E, 0x0DFD, 0x915F, 0x9160, 0x4DE3, 0x9161, 0x9161, 0x1CFE,

+    0x9162, 0x9162, 0x1CFD, 0x9163, 0x9163, 0x075F, 0x9164, 0x9164, 0x1CFC,

+    0x9165, 0x9165, 0x0DCB, 0x9166, 0x9168, 0x4DE5, 0x9169, 0x9169, 0x1D00,

+    0x916A, 0x916A, 0x09BD, 0x916B, 0x916B, 0x4DE8, 0x916C, 0x916C, 0x050F,

+    0x916D, 0x916D, 0x4DE9, 0x916E, 0x916E, 0x0E5B, 0x916F, 0x916F, 0x1D01,

+    0x9170, 0x9170, 0x1CFF, 0x9171, 0x9171, 0x0885, 0x9172, 0x9172, 0x1D04,

+    0x9173, 0x9173, 0x4DEA, 0x9174, 0x9174, 0x1D05, 0x9175, 0x9175, 0x089E,

+    0x9176, 0x9176, 0x0ABD, 0x9177, 0x9177, 0x096E, 0x9178, 0x9178, 0x0DD6,

+    0x9179, 0x9179, 0x1D06, 0x917A, 0x917C, 0x4DEB, 0x917D, 0x917E, 0x1D02,

+    0x917F, 0x917F, 0x0B53, 0x9180, 0x9184, 0x4DEE, 0x9185, 0x9185, 0x1D08,

+    0x9186, 0x9186, 0x4DF3, 0x9187, 0x9187, 0x053F, 0x9188, 0x9188, 0x4DF4,

+    0x9189, 0x9189, 0x124A, 0x918A, 0x918A, 0x4DF5, 0x918B, 0x918B, 0x055A,

+    0x918C, 0x918C, 0x1D07, 0x918D, 0x918D, 0x1D0A, 0x918E, 0x918F, 0x4DF6,

+    0x9190, 0x9190, 0x1D09, 0x9191, 0x9191, 0x1D0B, 0x9192, 0x9192, 0x0F9C,

+    0x9193, 0x9195, 0x4DF8, 0x9196, 0x9196, 0x2255, 0x9197, 0x9199, 0x4DFB,

+    0x919A, 0x919A, 0x0AD6, 0x919B, 0x919B, 0x0C84, 0x919C, 0x919C, 0x1E8F,

+    0x919D, 0x91A1, 0x4DFE, 0x91A2, 0x91A3, 0x1D0C, 0x91A4, 0x91A9, 0x4E03,

+    0x91AA, 0x91AA, 0x1D0E, 0x91AB, 0x91AB, 0x220C, 0x91AC, 0x91AC, 0x1FA4,

+    0x91AD, 0x91AF, 0x1D0F, 0x91B0, 0x91B3, 0x4E09, 0x91B4, 0x91B4, 0x1D13,

+    0x91B5, 0x91B5, 0x1D12, 0x91B6, 0x91B9, 0x4E0D, 0x91BA, 0x91BA, 0x1D14,

+    0x91BB, 0x91BF, 0x4E11, 0x91C0, 0x91C0, 0x209B, 0x91C1, 0x91C1, 0x21D8,

+    0x91C2, 0x91C2, 0x4E16, 0x91C3, 0x91C3, 0x25FA, 0x91C4, 0x91C4, 0x4E17,

+    0x91C5, 0x91C5, 0x25F9, 0x91C6, 0x91C6, 0x4E18, 0x91C7, 0x91C7, 0x0490,

+    0x91C8, 0x91C8, 0x4E19, 0x91C9, 0x91C9, 0x10B9, 0x91CA, 0x91CA, 0x0D64,

+    0x91CB, 0x91CB, 0x2134, 0x91CC, 0x91CC, 0x09DA, 0x91CD, 0x91CD, 0x11D7,

+    0x91CE, 0x91CE, 0x1037, 0x91CF, 0x91CF, 0x0A08, 0x91D0, 0x91D0, 0x4E1A,

+    0x91D1, 0x91D1, 0x08C1, 0x91D2, 0x91D4, 0x24F3, 0x91D5, 0x91D5, 0x24F8,

+    0x91D6, 0x91D6, 0x4E1B, 0x91D7, 0x91D7, 0x24F7, 0x91D8, 0x91D8, 0x1EC8,

+    0x91D9, 0x91D9, 0x24F6, 0x91DA, 0x91DB, 0x4E1C, 0x91DC, 0x91DC, 0x06A5,

+    0x91DD, 0x91DD, 0x2280, 0x91DE, 0x91E2, 0x4E1E, 0x91E3, 0x91E3, 0x1EC5,

+    0x91E4, 0x91E4, 0x24FB, 0x91E5, 0x91E6, 0x4E23, 0x91E7, 0x91E7, 0x24FA,

+    0x91E8, 0x91E8, 0x4E25, 0x91E9, 0x91E9, 0x1EED, 0x91EA, 0x91F4, 0x4E26,

+    0x91F5, 0x91F5, 0x24FD, 0x91F6, 0x91F6, 0x4E31, 0x91F7, 0x91F7, 0x24F9,

+    0x91F8, 0x91F8, 0x4E32, 0x91F9, 0x91F9, 0x24FE, 0x91FA, 0x91FA, 0x20CD,

+    0x91FB, 0x91FF, 0x4E33, 0x9200, 0x9200, 0x2508, 0x9201, 0x9201, 0x2504,

+    0x9202, 0x9203, 0x4E38, 0x9204, 0x9204, 0x2506, 0x9205, 0x9207, 0x4E3A,

+    0x9208, 0x9208, 0x24FF, 0x9209, 0x9209, 0x2090, 0x920A, 0x920C, 0x4E3D,

+    0x920D, 0x920D, 0x1EDD, 0x920E, 0x920E, 0x1F25, 0x920F, 0x920F, 0x4E40,

+    0x9210, 0x9210, 0x2503, 0x9211, 0x9211, 0x2502, 0x9212, 0x9213, 0x4E41,

+    0x9214, 0x9214, 0x1E7A, 0x9215, 0x9215, 0x20A6, 0x9216, 0x921D, 0x4E43,

+    0x921E, 0x921E, 0x1FD5, 0x921F, 0x9222, 0x4E4B, 0x9223, 0x9223, 0x1F11,

+    0x9224, 0x9224, 0x4E4F, 0x9225, 0x9225, 0x2507, 0x9226, 0x9226, 0x2500,

+    0x9227, 0x9227, 0x2505, 0x9228, 0x922D, 0x4E50, 0x922E, 0x922E, 0x2519,

+    0x922F, 0x922F, 0x4E56, 0x9230, 0x9230, 0x2515, 0x9231, 0x9232, 0x4E57,

+    0x9233, 0x9233, 0x250C, 0x9234, 0x9234, 0x2031, 0x9235, 0x9236, 0x4E59,

+    0x9237, 0x9237, 0x250B, 0x9238, 0x9238, 0x250F, 0x9239, 0x9239, 0x251A,

+    0x923A, 0x923A, 0x2509, 0x923B, 0x923C, 0x4E5B, 0x923D, 0x923D, 0x250E,

+    0x923E, 0x923E, 0x2234, 0x923F, 0x923F, 0x2513, 0x9240, 0x9240, 0x1F80,

+    0x9241, 0x9244, 0x4E5D, 0x9245, 0x9245, 0x2501, 0x9246, 0x9247, 0x4E61,

+    0x9248, 0x9248, 0x2517, 0x9249, 0x9249, 0x2516, 0x924A, 0x924C, 0x4E63,

+    0x924D, 0x924D, 0x2518, 0x924E, 0x9250, 0x4E66, 0x9251, 0x9251, 0x1E56,

+    0x9252, 0x9254, 0x4E69, 0x9255, 0x9255, 0x250D, 0x9256, 0x9256, 0x4E6C,

+    0x9257, 0x9257, 0x20D3, 0x9258, 0x9259, 0x4E6D, 0x925A, 0x925A, 0x207A,

+    0x925B, 0x925B, 0x20CE, 0x925C, 0x925D, 0x4E6F, 0x925E, 0x925E, 0x2510,

+    0x925F, 0x9261, 0x4E71, 0x9262, 0x9262, 0x1E55, 0x9263, 0x9265, 0x4E74,

+    0x9266, 0x9266, 0x250A, 0x9267, 0x926B, 0x4E77, 0x926C, 0x926D, 0x2511,

+    0x926E, 0x9273, 0x4E7C, 0x9274, 0x9274, 0x086B, 0x9275, 0x9277, 0x4E82,

+    0x9278, 0x9278, 0x1FAA, 0x9279, 0x9279, 0x4E85, 0x927A, 0x927A, 0x251E,

+    0x927B, 0x927B, 0x1F1F, 0x927C, 0x927E, 0x4E86, 0x927F, 0x927F, 0x252D,

+    0x9280, 0x9280, 0x221D, 0x9281, 0x9282, 0x4E89, 0x9283, 0x9283, 0x2532,

+    0x9284, 0x9284, 0x4E8B, 0x9285, 0x9285, 0x217B, 0x9286, 0x928D, 0x4E8C,

+    0x928E, 0x928E, 0x1D80, 0x928F, 0x9290, 0x4E94, 0x9291, 0x9291, 0x21AF,

+    0x9292, 0x9292, 0x4E96, 0x9293, 0x9293, 0x252C, 0x9294, 0x9295, 0x4E97,

+    0x9296, 0x9296, 0x2528, 0x9297, 0x9297, 0x4E99, 0x9298, 0x9298, 0x208C,

+    0x9299, 0x9299, 0x4E9A, 0x929A, 0x929A, 0x252F, 0x929B, 0x929B, 0x4E9B,

+    0x929C, 0x929C, 0x21BC, 0x929D, 0x929F, 0x4E9C, 0x92A0, 0x92A0, 0x251D,

+    0x92A1, 0x92A2, 0x4E9F, 0x92A3, 0x92A3, 0x2535, 0x92A4, 0x92A4, 0x4EA1,

+    0x92A5, 0x92A5, 0x220D, 0x92A6, 0x92A6, 0x2526, 0x92A7, 0x92A7, 0x4EA2,

+    0x92A8, 0x92A8, 0x2534, 0x92A9, 0x92A9, 0x252A, 0x92AA, 0x92AA, 0x251F,

+    0x92AB, 0x92AB, 0x2531, 0x92AC, 0x92AC, 0x251C, 0x92AD, 0x92AD, 0x4EA3,

+    0x92AE, 0x92AE, 0x1D81, 0x92AF, 0x92B0, 0x4EA4, 0x92B1, 0x92B1, 0x2525,

+    0x92B2, 0x92B6, 0x4EA6, 0x92B7, 0x92B7, 0x21CD, 0x92B8, 0x92B8, 0x4EAB,

+    0x92B9, 0x92B9, 0x21DA, 0x92BA, 0x92BA, 0x4EAC, 0x92BB, 0x92BB, 0x2172,

+    0x92BC, 0x92BC, 0x253E, 0x92BD, 0x92C0, 0x4EAD, 0x92C1, 0x92C1, 0x204F,

+    0x92C2, 0x92C2, 0x4EB1, 0x92C3, 0x92C3, 0x2543, 0x92C4, 0x92C4, 0x4EB2,

+    0x92C5, 0x92C5, 0x21D7, 0x92C6, 0x92C6, 0x4EB3, 0x92C7, 0x92C7, 0x1E3C,

+    0x92C8, 0x92C8, 0x1D82, 0x92C9, 0x92CB, 0x4EB4, 0x92CC, 0x92CC, 0x2529,

+    0x92CD, 0x92CE, 0x4EB7, 0x92CF, 0x92CF, 0x2521, 0x92D0, 0x92D1, 0x4EB9,

+    0x92D2, 0x92D2, 0x1EFF, 0x92D3, 0x92DC, 0x4EBB, 0x92DD, 0x92DD, 0x253F,

+    0x92DE, 0x92DE, 0x4EC5, 0x92DF, 0x92DF, 0x2544, 0x92E0, 0x92E2, 0x4EC6,

+    0x92E3, 0x92E3, 0x2523, 0x92E4, 0x92E4, 0x1E90, 0x92E5, 0x92E5, 0x253A,

+    0x92E6, 0x92E6, 0x2545, 0x92E7, 0x92E7, 0x4EC9, 0x92E8, 0x92E8, 0x253D,

+    0x92E9, 0x92E9, 0x4ECA, 0x92EA, 0x92EA, 0x20C1, 0x92EB, 0x92EC, 0x4ECB,

+    0x92ED, 0x92ED, 0x2103, 0x92EE, 0x92EE, 0x2520, 0x92EF, 0x92EF, 0x253C,

+    0x92F0, 0x92F0, 0x253B, 0x92F1, 0x92F1, 0x2538, 0x92F2, 0x92F5, 0x4ECD,

+    0x92F6, 0x92F6, 0x2540, 0x92F7, 0x92F7, 0x4ED1, 0x92F8, 0x92F8, 0x1FCD,

+    0x92F9, 0x92FB, 0x4ED2, 0x92FC, 0x92FC, 0x1F18, 0x92FD, 0x92FF, 0x4ED5,

+    0x9300, 0x9300, 0x4ED8, 0x9301, 0x9301, 0x254B, 0x9302, 0x9305, 0x4ED9,

+    0x9306, 0x9306, 0x2547, 0x9307, 0x9308, 0x254F, 0x9309, 0x930F, 0x4EDD,

+    0x9310, 0x9310, 0x22B0, 0x9311, 0x9311, 0x4EE4, 0x9312, 0x9312, 0x2546,

+    0x9313, 0x9314, 0x4EE5, 0x9315, 0x9315, 0x254C, 0x9316, 0x9317, 0x4EE7,

+    0x9318, 0x9318, 0x1E9A, 0x9319, 0x9319, 0x2552, 0x931A, 0x931A, 0x2530,

+    0x931B, 0x931B, 0x2549, 0x931C, 0x931E, 0x4EE9, 0x931F, 0x931F, 0x2551,

+    0x9320, 0x9320, 0x1ECA, 0x9321, 0x9321, 0x4EEC, 0x9322, 0x9322, 0x20D2,

+    0x9323, 0x9325, 0x4EED, 0x9326, 0x9326, 0x1FB8, 0x9327, 0x9327, 0x4EF0,

+    0x9328, 0x9328, 0x2079, 0x9329, 0x932A, 0x4EF1, 0x932B, 0x932B, 0x21AB,

+    0x932C, 0x932D, 0x4EF3, 0x932E, 0x932E, 0x254D, 0x932F, 0x932F, 0x1EA5,

+    0x9330, 0x9331, 0x4EF5, 0x9332, 0x9332, 0x204C, 0x9333, 0x9333, 0x2080,

+    0x9334, 0x9335, 0x4EF7, 0x9336, 0x9336, 0x266D, 0x9337, 0x9337, 0x4EF9,

+    0x9338, 0x9338, 0x2537, 0x9339, 0x933D, 0x4EFA, 0x933E, 0x933E, 0x1D83,

+    0x933F, 0x933F, 0x4EFF, 0x9340, 0x9340, 0x254A, 0x9341, 0x9341, 0x21B8,

+    0x9342, 0x9342, 0x4F00, 0x9343, 0x9343, 0x254E, 0x9344, 0x9345, 0x4F01,

+    0x9346, 0x9346, 0x24FC, 0x9347, 0x9347, 0x2554, 0x9348, 0x934A, 0x4F03,

+    0x934B, 0x934B, 0x1F3C, 0x934C, 0x934C, 0x4F06, 0x934D, 0x934D, 0x1ED5,

+    0x934E, 0x9353, 0x4F07, 0x9354, 0x9354, 0x2556, 0x9355, 0x9357, 0x4F0D,

+    0x9358, 0x9358, 0x2268, 0x9359, 0x935A, 0x4F10, 0x935B, 0x935B, 0x1ED6,

+    0x935C, 0x9363, 0x4F12, 0x9364, 0x9364, 0x2557, 0x9365, 0x9365, 0x2553,

+    0x9366, 0x9368, 0x4F1A, 0x9369, 0x9369, 0x2548, 0x936A, 0x936A, 0x1D84,

+    0x936B, 0x936B, 0x4F1D, 0x936C, 0x936C, 0x20DC, 0x936D, 0x936F, 0x4F1E,

+    0x9370, 0x9370, 0x2559, 0x9371, 0x9374, 0x4F21, 0x9375, 0x9375, 0x1F97,

+    0x9376, 0x9376, 0x2555, 0x9377, 0x9379, 0x4F25, 0x937A, 0x937A, 0x227D,

+    0x937B, 0x937D, 0x4F28, 0x937E, 0x937E, 0x257E, 0x937F, 0x9381, 0x4F2B,

+    0x9382, 0x9382, 0x207C, 0x9383, 0x9383, 0x4F2E, 0x9384, 0x9384, 0x255A,

+    0x9385, 0x9386, 0x4F2F, 0x9387, 0x9387, 0x255E, 0x9388, 0x9389, 0x4F31,

+    0x938A, 0x938A, 0x1E34, 0x938B, 0x938E, 0x4F33, 0x938F, 0x938F, 0x1D86,

+    0x9390, 0x9395, 0x4F37, 0x9396, 0x9396, 0x215E, 0x9397, 0x9397, 0x4F3D,

+    0x9398, 0x9398, 0x2560, 0x9399, 0x93A1, 0x4F3E, 0x93A2, 0x93A2, 0x21A2,

+    0x93A3, 0x93A3, 0x2354, 0x93A4, 0x93A5, 0x4F47, 0x93A6, 0x93A6, 0x2563,

+    0x93A7, 0x93A7, 0x2527, 0x93A8, 0x93A8, 0x4F49, 0x93A9, 0x93A9, 0x252E,

+    0x93AA, 0x93AA, 0x2558, 0x93AB, 0x93AB, 0x4F4A, 0x93AC, 0x93AC, 0x1F1B,

+    0x93AD, 0x93AD, 0x4F4B, 0x93AE, 0x93AE, 0x2283, 0x93AF, 0x93AF, 0x4F4C,

+    0x93B0, 0x93B0, 0x2564, 0x93B1, 0x93B2, 0x4F4D, 0x93B3, 0x93B3, 0x20A0,

+    0x93B4, 0x93B4, 0x4F4F, 0x93B5, 0x93B5, 0x2565, 0x93B6, 0x93B7, 0x4F50,

+    0x93B8, 0x93B8, 0x2561, 0x93B9, 0x93BE, 0x4F52, 0x93BF, 0x93BF, 0x2562,

+    0x93C0, 0x93C2, 0x4F58, 0x93C3, 0x93C3, 0x256C, 0x93C4, 0x93C6, 0x4F5B,

+    0x93C7, 0x93C7, 0x256D, 0x93C8, 0x93C8, 0x2020, 0x93C9, 0x93C9, 0x4F5E,

+    0x93CA, 0x93CA, 0x1D85, 0x93CB, 0x93CB, 0x4F5F, 0x93CC, 0x93CC, 0x255F,

+    0x93CD, 0x93CD, 0x256A, 0x93CE, 0x93D0, 0x4F60, 0x93D1, 0x93D1, 0x256E,

+    0x93D2, 0x93D5, 0x4F63, 0x93D6, 0x93D6, 0x1E01, 0x93D7, 0x93D7, 0x2539,

+    0x93D8, 0x93D8, 0x255C, 0x93D9, 0x93DB, 0x4F67, 0x93DC, 0x93DD, 0x2568,

+    0x93DE, 0x93DE, 0x256B, 0x93DF, 0x93DF, 0x1E6F, 0x93E0, 0x93E0, 0x4F6A,

+    0x93E1, 0x93E1, 0x1FC4, 0x93E2, 0x93E2, 0x2567, 0x93E3, 0x93E3, 0x4F6B,

+    0x93E4, 0x93E4, 0x255B, 0x93E5, 0x93E7, 0x4F6C, 0x93E8, 0x93E8, 0x261D,

+    0x93E9, 0x93F4, 0x4F6F, 0x93F5, 0x93F5, 0x252B, 0x93F6, 0x93F6, 0x4F7B,

+    0x93F7, 0x93F7, 0x2571, 0x93F8, 0x93F8, 0x4F7C, 0x93F9, 0x93F9, 0x2577,

+    0x93FA, 0x93FF, 0x4F7D, 0x9400, 0x9402, 0x4F83, 0x9403, 0x9403, 0x2522,

+    0x9404, 0x940A, 0x4F86, 0x940B, 0x940B, 0x2533, 0x940C, 0x940F, 0x4F8D,

+    0x9410, 0x9410, 0x202A, 0x9411, 0x9411, 0x4F91, 0x9412, 0x9412, 0x2536,

+    0x9413, 0x9413, 0x2573, 0x9414, 0x9414, 0x256F, 0x9415, 0x9417, 0x4F92,

+    0x9418, 0x9418, 0x2293, 0x9419, 0x9419, 0x2578, 0x941A, 0x941C, 0x4F95,

+    0x941D, 0x941D, 0x2570, 0x941E, 0x941F, 0x4F98, 0x9420, 0x9420, 0x2575,

+    0x9421, 0x9425, 0x4F9A, 0x9426, 0x9427, 0x2541, 0x9428, 0x9428, 0x255D,

+    0x9429, 0x942D, 0x4F9F, 0x942E, 0x942E, 0x201A, 0x942F, 0x9431, 0x4FA4,

+    0x9432, 0x9432, 0x257A, 0x9433, 0x9433, 0x2006, 0x9434, 0x9434, 0x4FA7,

+    0x9435, 0x9435, 0x2177, 0x9436, 0x9437, 0x4FA8, 0x9438, 0x9438, 0x251B,

+    0x9439, 0x9439, 0x4FAA, 0x943A, 0x943A, 0x2524, 0x943B, 0x943D, 0x4FAB,

+    0x943E, 0x943E, 0x1D87, 0x943F, 0x943F, 0x257B, 0x9440, 0x9443, 0x4FAE,

+    0x9444, 0x9444, 0x22A3, 0x9445, 0x9449, 0x4FB2, 0x944A, 0x944A, 0x2579,

+    0x944B, 0x944B, 0x4FB7, 0x944C, 0x944C, 0x2566, 0x944D, 0x9451, 0x4FB8,

+    0x9452, 0x9452, 0x1F93, 0x9453, 0x9453, 0x4FBD, 0x9454, 0x9454, 0x257C,

+    0x9455, 0x945F, 0x4FBE, 0x9460, 0x9460, 0x2514, 0x9461, 0x9462, 0x4FC9,

+    0x9463, 0x9463, 0x257D, 0x9464, 0x9464, 0x4FCB, 0x9465, 0x9465, 0x2572,

+    0x9466, 0x946A, 0x4FCC, 0x946B, 0x946B, 0x1D88, 0x946C, 0x946C, 0x4FD1,

+    0x946D, 0x946D, 0x2574, 0x946E, 0x946F, 0x4FD2, 0x9470, 0x9470, 0x224E,

+    0x9471, 0x9471, 0x4FD4, 0x9472, 0x9472, 0x21C6, 0x9473, 0x9476, 0x4FD5,

+    0x9477, 0x9477, 0x209F, 0x9478, 0x9478, 0x4FD9, 0x9479, 0x9479, 0x2576,

+    0x947A, 0x947B, 0x4FDA, 0x947C, 0x947C, 0x2064, 0x947D, 0x947D, 0x22BF,

+    0x947E, 0x947E, 0x261C, 0x947F, 0x947F, 0x225E, 0x9480, 0x9484, 0x4FDC,

+    0x9485, 0x9487, 0x1A8E, 0x9488, 0x9488, 0x118C, 0x9489, 0x9489, 0x05E3,

+    0x948A, 0x948A, 0x1A92, 0x948B, 0x948B, 0x1A91, 0x948C, 0x948D, 0x1A93,

+    0x948E, 0x948E, 0x0C22, 0x948F, 0x9490, 0x1A95, 0x9491, 0x9491, 0x4FE1,

+    0x9492, 0x9492, 0x064D, 0x9493, 0x9493, 0x05D7, 0x9494, 0x9494, 0x1A97,

+    0x9495, 0x9495, 0x1A99, 0x9496, 0x9496, 0x4FE2, 0x9497, 0x9497, 0x1A98,

+    0x9498, 0x9498, 0x4FE3, 0x9499, 0x9499, 0x06C1, 0x949A, 0x949C, 0x1A9A,

+    0x949D, 0x949D, 0x061A, 0x949E, 0x949E, 0x04D3, 0x949F, 0x949F, 0x11D2,

+    0x94A0, 0x94A0, 0x0B29, 0x94A1, 0x94A1, 0x041E, 0x94A2, 0x94A2, 0x06D1,

+    0x94A3, 0x94A4, 0x1A9D, 0x94A5, 0x94A5, 0x1102, 0x94A6, 0x94A6, 0x0C52,

+    0x94A7, 0x94A7, 0x092A, 0x94A8, 0x94A8, 0x0EE8, 0x94A9, 0x94A9, 0x070C,

+    0x94AA, 0x94AA, 0x1AA0, 0x94AB, 0x94AB, 0x1A9F, 0x94AC, 0x94AC, 0x1AA2,

+    0x94AD, 0x94AD, 0x1AA1, 0x94AE, 0x94AE, 0x0B66, 0x94AF, 0x94B0, 0x1AA3,

+    0x94B1, 0x94B1, 0x0C2B, 0x94B2, 0x94B2, 0x1AA5, 0x94B3, 0x94B3, 0x0C2C,

+    0x94B4, 0x94B4, 0x1AA6, 0x94B5, 0x94B5, 0x046E, 0x94B6, 0x94BA, 0x1AA7,

+    0x94BB, 0x94BB, 0x1247, 0x94BC, 0x94BD, 0x1AAC, 0x94BE, 0x94BE, 0x084B,

+    0x94BF, 0x94BF, 0x1AAE, 0x94C0, 0x94C0, 0x10B0, 0x94C1, 0x94C1, 0x0E4D,

+    0x94C2, 0x94C2, 0x0473, 0x94C3, 0x94C3, 0x0A2E, 0x94C4, 0x94C4, 0x1AAF,

+    0x94C5, 0x94C5, 0x0C23, 0x94C6, 0x94C6, 0x0AB2, 0x94C7, 0x94C7, 0x4FE4,

+    0x94C8, 0x94CE, 0x1AB0, 0x94CF, 0x94CF, 0x4FE5, 0x94D0, 0x94D2, 0x1AB7,

+    0x94D3, 0x94D4, 0x4FE6, 0x94D5, 0x94D7, 0x1ABA, 0x94D8, 0x94D8, 0x1ABE,

+    0x94D9, 0x94D9, 0x1ABD, 0x94DA, 0x94DA, 0x4FE8, 0x94DB, 0x94DB, 0x1ABF,

+    0x94DC, 0x94DC, 0x0E5E, 0x94DD, 0x94DD, 0x0A68, 0x94DE, 0x94E0, 0x1AC0,

+    0x94E1, 0x94E1, 0x1142, 0x94E2, 0x94E2, 0x1AC3, 0x94E3, 0x94E3, 0x0F20,

+    0x94E4, 0x94E5, 0x1AC4, 0x94E6, 0x94E6, 0x4FE9, 0x94E7, 0x94E8, 0x1AC6,

+    0x94E9, 0x94E9, 0x1AC9, 0x94EA, 0x94EA, 0x1AC8, 0x94EB, 0x94EB, 0x1ACA,

+    0x94EC, 0x94EC, 0x06F0, 0x94ED, 0x94ED, 0x0AFF, 0x94EE, 0x94EF, 0x1ACB,

+    0x94F0, 0x94F0, 0x0893, 0x94F1, 0x94F1, 0x1046, 0x94F2, 0x94F2, 0x04C0,

+    0x94F3, 0x94F5, 0x1ACD, 0x94F6, 0x94F6, 0x107F, 0x94F7, 0x94F7, 0x1AD0,

+    0x94F8, 0x94F8, 0x11FC, 0x94F9, 0x94F9, 0x1AD1, 0x94FA, 0x94FA, 0x0BEB,

+    0x94FB, 0x94FB, 0x4FEA, 0x94FC, 0x94FD, 0x1AD2, 0x94FE, 0x94FE, 0x09FD,

+    0x94FF, 0x94FF, 0x1AD4, 0x9500, 0x9500, 0x0F67, 0x9501, 0x9501, 0x0DED,

+    0x9502, 0x9502, 0x1AD6, 0x9503, 0x9503, 0x1AD5, 0x9504, 0x9504, 0x051F,

+    0x9505, 0x9505, 0x0751, 0x9506, 0x9507, 0x1AD7, 0x9508, 0x9508, 0x0FAD,

+    0x9509, 0x950A, 0x1AD9, 0x950B, 0x950B, 0x0683, 0x950C, 0x950C, 0x0F8A,

+    0x950D, 0x950F, 0x1ADB, 0x9510, 0x9510, 0x0CCC, 0x9511, 0x9511, 0x0E33,

+    0x9512, 0x9516, 0x1ADE, 0x9517, 0x9517, 0x1181, 0x9518, 0x9518, 0x1AE3,

+    0x9519, 0x9519, 0x0570, 0x951A, 0x951A, 0x0AAF, 0x951B, 0x951B, 0x1AE4,

+    0x951C, 0x951C, 0x4FEB, 0x951D, 0x951F, 0x1AE5, 0x9520, 0x9520, 0x4FEC,

+    0x9521, 0x9521, 0x0F0C, 0x9522, 0x9522, 0x1AE8, 0x9523, 0x9523, 0x0A87,

+    0x9524, 0x9524, 0x053B, 0x9525, 0x9525, 0x1213, 0x9526, 0x9526, 0x08C6,

+    0x9527, 0x9527, 0x4FED, 0x9528, 0x9528, 0x0F34, 0x9529, 0x9529, 0x1AEB,

+    0x952A, 0x952B, 0x1AE9, 0x952C, 0x952C, 0x1AEC, 0x952D, 0x952D, 0x05E6,

+    0x952E, 0x952E, 0x086F, 0x952F, 0x952F, 0x0911, 0x9530, 0x9530, 0x0AD1,

+    0x9531, 0x9532, 0x1AED, 0x9533, 0x9533, 0x4FEE, 0x9534, 0x9534, 0x1AEF,

+    0x9535, 0x9535, 0x1AF7, 0x9536, 0x9538, 0x1AF0, 0x9539, 0x9539, 0x0C3F,

+    0x953A, 0x953A, 0x1B19, 0x953B, 0x953B, 0x060C, 0x953C, 0x953C, 0x1AF3,

+    0x953D, 0x953D, 0x4FEF, 0x953E, 0x953F, 0x1AF4, 0x9540, 0x9540, 0x0605,

+    0x9541, 0x9541, 0x0AC3, 0x9542, 0x9542, 0x1AF6, 0x9543, 0x9543, 0x4FF0,

+    0x9544, 0x9546, 0x1AF8, 0x9547, 0x9547, 0x1193, 0x9548, 0x9548, 0x4FF1,

+    0x9549, 0x9549, 0x1AFB, 0x954A, 0x954A, 0x0B5A, 0x954B, 0x954B, 0x4FF2,

+    0x954C, 0x954C, 0x1AFC, 0x954D, 0x954D, 0x0B5B, 0x954E, 0x954F, 0x1AFD,

+    0x9550, 0x9550, 0x06DF, 0x9551, 0x9551, 0x0402, 0x9552, 0x9554, 0x1AFF,

+    0x9555, 0x9555, 0x4FF3, 0x9556, 0x9559, 0x1B02, 0x955A, 0x955A, 0x4FF4,

+    0x955B, 0x955B, 0x1B06, 0x955C, 0x955C, 0x08E4, 0x955D, 0x955D, 0x1B09,

+    0x955E, 0x955F, 0x1B07, 0x9560, 0x9560, 0x4FF5, 0x9561, 0x9562, 0x1B0A,

+    0x9563, 0x9563, 0x0A16, 0x9564, 0x956C, 0x1B0C, 0x956D, 0x956D, 0x09C3,

+    0x956E, 0x956E, 0x4FF6, 0x956F, 0x956F, 0x1B15, 0x9570, 0x9570, 0x09F6,

+    0x9571, 0x9573, 0x1B16, 0x9574, 0x9575, 0x4FF7, 0x9576, 0x9576, 0x0F4F,

+    0x9577, 0x9577, 0x1E75, 0x9578, 0x957E, 0x4FF9, 0x957F, 0x957F, 0x04C9,

+    0x9580, 0x9580, 0x207D, 0x9581, 0x9581, 0x5000, 0x9582, 0x9582, 0x23BF,

+    0x9583, 0x9583, 0x2113, 0x9584, 0x9585, 0x5001, 0x9586, 0x9586, 0x23C0,

+    0x9587, 0x9588, 0x5003, 0x9589, 0x9589, 0x1E45, 0x958A, 0x958A, 0x5005,

+    0x958B, 0x958B, 0x1FD8, 0x958C, 0x958C, 0x23C4, 0x958D, 0x958D, 0x5006,

+    0x958E, 0x958E, 0x23C2, 0x958F, 0x958F, 0x2104, 0x9590, 0x9590, 0x5007,

+    0x9591, 0x9591, 0x21BD, 0x9592, 0x9592, 0x5008, 0x9593, 0x9593, 0x1F87,

+    0x9594, 0x9594, 0x23C3, 0x9595, 0x9597, 0x5009, 0x9598, 0x9598, 0x2269,

+    0x9599, 0x95A0, 0x500C, 0x95A1, 0x95A1, 0x1F43, 0x95A2, 0x95A2, 0x5014,

+    0x95A3, 0x95A3, 0x1F1E, 0x95A4, 0x95A4, 0x2679, 0x95A5, 0x95A5, 0x1EEB,

+    0x95A6, 0x95A7, 0x5015, 0x95A8, 0x95A8, 0x1F35, 0x95A9, 0x95A9, 0x208A,

+    0x95AA, 0x95AA, 0x5017, 0x95AB, 0x95AB, 0x23C7, 0x95AC, 0x95AC, 0x23C9,

+    0x95AD, 0x95AD, 0x23C6, 0x95AE, 0x95B1, 0x5018, 0x95B2, 0x95B2, 0x224F,

+    0x95B3, 0x95B5, 0x501C, 0x95B6, 0x95B6, 0x23CB, 0x95B7, 0x95B8, 0x501F,

+    0x95B9, 0x95B9, 0x21F3, 0x95BA, 0x95BA, 0x5021, 0x95BB, 0x95BB, 0x21F7,

+    0x95BC, 0x95BC, 0x23CF, 0x95BD, 0x95BD, 0x23CE, 0x95BE, 0x95BE, 0x23CA,

+    0x95BF, 0x95BF, 0x23CD, 0x95C0, 0x95C2, 0x5022, 0x95C3, 0x95C3, 0x23D0,

+    0x95C4, 0x95C5, 0x5025, 0x95C6, 0x95C6, 0x266C, 0x95C7, 0x95C7, 0x5027,

+    0x95C8, 0x95C8, 0x23C1, 0x95C9, 0x95C9, 0x5028, 0x95CA, 0x95CA, 0x1FEE,

+    0x95CB, 0x95CB, 0x23D1, 0x95CC, 0x95CC, 0x1FF8, 0x95CD, 0x95CF, 0x5029,

+    0x95D0, 0x95D0, 0x23D3, 0x95D1, 0x95D3, 0x502C, 0x95D4, 0x95D4, 0x23D2,

+    0x95D5, 0x95D5, 0x23D4, 0x95D6, 0x95D6, 0x1E98, 0x95D7, 0x95DB, 0x502F,

+    0x95DC, 0x95DC, 0x1F2C, 0x95DD, 0x95DD, 0x5034, 0x95DE, 0x95DE, 0x23D5,

+    0x95DF, 0x95E0, 0x5035, 0x95E1, 0x95E1, 0x1E71, 0x95E2, 0x95E2, 0x2691,

+    0x95E3, 0x95E4, 0x5037, 0x95E5, 0x95E5, 0x23C5, 0x95E6, 0x95E7, 0x5039,

+    0x95E8, 0x95E8, 0x0ACA, 0x95E9, 0x95E9, 0x1685, 0x95EA, 0x95EA, 0x0CFA,

+    0x95EB, 0x95EB, 0x1686, 0x95EC, 0x95EC, 0x503B, 0x95ED, 0x95ED, 0x043E,

+    0x95EE, 0x95EE, 0x0ED9, 0x95EF, 0x95EF, 0x0536, 0x95F0, 0x95F0, 0x0CCD,

+    0x95F1, 0x95F1, 0x1687, 0x95F2, 0x95F2, 0x0F3D, 0x95F3, 0x95F3, 0x1688,

+    0x95F4, 0x95F4, 0x0857, 0x95F5, 0x95F6, 0x1689, 0x95F7, 0x95F7, 0x0ACB,

+    0x95F8, 0x95F8, 0x1143, 0x95F9, 0x95F9, 0x0B39, 0x95FA, 0x95FA, 0x0744,

+    0x95FB, 0x95FB, 0x0ED4, 0x95FC, 0x95FC, 0x168B, 0x95FD, 0x95FD, 0x0AFB,

+    0x95FE, 0x95FE, 0x168C, 0x95FF, 0x95FF, 0x503C, 0x9600, 0x9600, 0x0644,

+    0x9601, 0x9601, 0x06EE, 0x9602, 0x9602, 0x0789, 0x9603, 0x9604, 0x168D,

+    0x9605, 0x9605, 0x1107, 0x9606, 0x9606, 0x168F, 0x9607, 0x9607, 0x503D,

+    0x9608, 0x9608, 0x1690, 0x9609, 0x9609, 0x0FF4, 0x960A, 0x960D, 0x1691,

+    0x960E, 0x960E, 0x0FFF, 0x960F, 0x960F, 0x1695, 0x9610, 0x9610, 0x04C2,

+    0x9611, 0x9611, 0x09A6, 0x9612, 0x9612, 0x1696, 0x9613, 0x9613, 0x503E,

+    0x9614, 0x9614, 0x0996, 0x9615, 0x9617, 0x1697, 0x9618, 0x9618, 0x503F,

+    0x9619, 0x961A, 0x169A, 0x961B, 0x961B, 0x5040, 0x961C, 0x961C, 0x06B2,

+    0x961D, 0x961D, 0x1354, 0x961E, 0x961E, 0x5041, 0x961F, 0x961F, 0x0612,

+    0x9620, 0x9620, 0x5042, 0x9621, 0x9621, 0x1356, 0x9622, 0x9622, 0x1355,

+    0x9623, 0x9629, 0x5043, 0x962A, 0x962A, 0x1358, 0x962B, 0x962D, 0x504A,

+    0x962E, 0x962E, 0x0CC9, 0x962F, 0x9630, 0x504D, 0x9631, 0x9631, 0x1357,

+    0x9632, 0x9632, 0x065D, 0x9633, 0x9633, 0x101D, 0x9634, 0x9634, 0x107C,

+    0x9635, 0x9635, 0x1194, 0x9636, 0x9636, 0x08A8, 0x9637, 0x963A, 0x504F,

+    0x963B, 0x963B, 0x1245, 0x963C, 0x963C, 0x135A, 0x963D, 0x963D, 0x1359,

+    0x963E, 0x963E, 0x5053, 0x963F, 0x963F, 0x03AD, 0x9640, 0x9640, 0x0E84,

+    0x9641, 0x9641, 0x5054, 0x9642, 0x9642, 0x135B, 0x9643, 0x9643, 0x5055,

+    0x9644, 0x9644, 0x06B8, 0x9645, 0x9645, 0x083D, 0x9646, 0x9646, 0x0A64,

+    0x9647, 0x9647, 0x0A4B, 0x9648, 0x9648, 0x04E7, 0x9649, 0x9649, 0x135C,

+    0x964A, 0x964A, 0x5056, 0x964B, 0x964B, 0x0A51, 0x964C, 0x964C, 0x0B13,

+    0x964D, 0x964D, 0x0886, 0x964E, 0x964F, 0x5057, 0x9650, 0x9650, 0x0F4B,

+    0x9651, 0x9653, 0x5059, 0x9654, 0x9654, 0x135D, 0x9655, 0x9655, 0x0CFB,

+    0x9656, 0x9657, 0x505C, 0x9658, 0x9658, 0x231A, 0x9659, 0x965A, 0x505E,

+    0x965B, 0x965B, 0x0446, 0x965C, 0x965C, 0x5060, 0x965D, 0x965D, 0x2114,

+    0x965E, 0x965E, 0x5061, 0x965F, 0x965F, 0x135E, 0x9660, 0x9660, 0x5062,

+    0x9661, 0x9661, 0x05F7, 0x9662, 0x9662, 0x10FD, 0x9663, 0x9663, 0x2284,

+    0x9664, 0x9664, 0x0522, 0x9665, 0x9666, 0x5063, 0x9667, 0x9667, 0x135F,

+    0x9668, 0x9668, 0x110C, 0x9669, 0x9669, 0x0F42, 0x966A, 0x966A, 0x0BA4,

+    0x966B, 0x966B, 0x5065, 0x966C, 0x966C, 0x1360, 0x966D, 0x966F, 0x5066,

+    0x9670, 0x9670, 0x221C, 0x9671, 0x9671, 0x5069, 0x9672, 0x9672, 0x1361,

+    0x9673, 0x9673, 0x1E7E, 0x9674, 0x9674, 0x1362, 0x9675, 0x9675, 0x0A33,

+    0x9676, 0x9676, 0x0E28, 0x9677, 0x9677, 0x0F4A, 0x9678, 0x9678, 0x204D,

+    0x9679, 0x967C, 0x506A, 0x967D, 0x967D, 0x2201, 0x967E, 0x9684, 0x506E,

+    0x9685, 0x9685, 0x10CC, 0x9686, 0x9686, 0x0A48, 0x9687, 0x9687, 0x5075,

+    0x9688, 0x9688, 0x1363, 0x9689, 0x9689, 0x5076, 0x968A, 0x968A, 0x1ED9,

+    0x968B, 0x968B, 0x0DDA, 0x968C, 0x968C, 0x5077, 0x968D, 0x968D, 0x1364,

+    0x968E, 0x968E, 0x1FB2, 0x968F, 0x968F, 0x0DDB, 0x9690, 0x9690, 0x1085,

+    0x9691, 0x9693, 0x5078, 0x9694, 0x9694, 0x06EF, 0x9695, 0x9695, 0x2252,

+    0x9696, 0x9696, 0x507B, 0x9697, 0x9697, 0x1365, 0x9698, 0x9698, 0x03BA,

+    0x9699, 0x9699, 0x0F23, 0x969A, 0x969A, 0x507C, 0x969B, 0x969B, 0x1F79,

+    0x969C, 0x969C, 0x1170, 0x969D, 0x96A6, 0x507D, 0x96A7, 0x96A7, 0x0DE2,

+    0x96A8, 0x96A8, 0x2157, 0x96A9, 0x96A9, 0x5087, 0x96AA, 0x96AA, 0x21BF,

+    0x96AB, 0x96AF, 0x5088, 0x96B0, 0x96B0, 0x1366, 0x96B1, 0x96B1, 0x221F,

+    0x96B2, 0x96B2, 0x508D, 0x96B3, 0x96B3, 0x1684, 0x96B4, 0x96B4, 0x203D,

+    0x96B5, 0x96B5, 0x508E, 0x96B6, 0x96B6, 0x09EE, 0x96B7, 0x96B7, 0x508F,

+    0x96B8, 0x96B8, 0x2015, 0x96B9, 0x96B9, 0x1D79, 0x96BA, 0x96BA, 0x5090,

+    0x96BB, 0x96BB, 0x26A5, 0x96BC, 0x96BD, 0x1D7A, 0x96BE, 0x96BE, 0x0B34,

+    0x96BF, 0x96BF, 0x5091, 0x96C0, 0x96C0, 0x0C93, 0x96C1, 0x96C1, 0x100C,

+    0x96C2, 0x96C3, 0x5092, 0x96C4, 0x96C4, 0x0FA6, 0x96C5, 0x96C5, 0x0FEE,

+    0x96C6, 0x96C6, 0x0822, 0x96C7, 0x96C7, 0x0726, 0x96C8, 0x96C8, 0x5094,

+    0x96C9, 0x96C9, 0x1B1C, 0x96CA, 0x96CB, 0x5095, 0x96CC, 0x96CC, 0x0549,

+    0x96CD, 0x96CD, 0x109F, 0x96CE, 0x96CE, 0x1D7C, 0x96CF, 0x96CF, 0x0520,

+    0x96D0, 0x96D1, 0x5097, 0x96D2, 0x96D2, 0x1D7D, 0x96D3, 0x96D4, 0x5099,

+    0x96D5, 0x96D5, 0x05D2, 0x96D6, 0x96D6, 0x2156, 0x96D7, 0x96D8, 0x509B,

+    0x96D9, 0x96D9, 0x2144, 0x96DA, 0x96DA, 0x509D, 0x96DB, 0x96DB, 0x1E91,

+    0x96DC, 0x96DC, 0x2257, 0x96DD, 0x96DF, 0x509E, 0x96E0, 0x96E0, 0x1D7F,

+    0x96E1, 0x96E1, 0x50A1, 0x96E2, 0x96E2, 0x200A, 0x96E3, 0x96E3, 0x2092,

+    0x96E4, 0x96E7, 0x50A2, 0x96E8, 0x96E8, 0x10CF, 0x96E9, 0x96E9, 0x1D61,

+    0x96EA, 0x96EA, 0x0FD2, 0x96EB, 0x96EE, 0x50A6, 0x96EF, 0x96EF, 0x1D63,

+    0x96F0, 0x96F1, 0x50AA, 0x96F2, 0x96F2, 0x2250, 0x96F3, 0x96F3, 0x1D62,

+    0x96F4, 0x96F5, 0x50AC, 0x96F6, 0x96F6, 0x0A2C, 0x96F7, 0x96F7, 0x09C2,

+    0x96F8, 0x96F8, 0x50AE, 0x96F9, 0x96F9, 0x040B, 0x96FA, 0x96FA, 0x50AF,

+    0x96FB, 0x96FB, 0x1EC3, 0x96FC, 0x96FD, 0x50B0, 0x96FE, 0x96FE, 0x0EFC,

+    0x96FF, 0x96FF, 0x50B2, 0x9700, 0x9700, 0x0FB3, 0x9701, 0x9701, 0x1D65,

+    0x9702, 0x9703, 0x50B3, 0x9704, 0x9704, 0x0F63, 0x9705, 0x9705, 0x50B5,

+    0x9706, 0x9706, 0x1D64, 0x9707, 0x9707, 0x1191, 0x9708, 0x9708, 0x1D66,

+    0x9709, 0x9709, 0x0ABE, 0x970A, 0x970C, 0x50B6, 0x970D, 0x970D, 0x0809,

+    0x970E, 0x970E, 0x1D68, 0x970F, 0x970F, 0x1D67, 0x9710, 0x9712, 0x50B9,

+    0x9713, 0x9713, 0x0B41, 0x9714, 0x9715, 0x50BC, 0x9716, 0x9716, 0x0A21,

+    0x9717, 0x971B, 0x50BE, 0x971C, 0x971C, 0x0D9F, 0x971D, 0x971D, 0x50C3,

+    0x971E, 0x971E, 0x0F29, 0x971F, 0x9726, 0x50C4, 0x9727, 0x9727, 0x21A8,

+    0x9728, 0x9729, 0x50CC, 0x972A, 0x972A, 0x1D69, 0x972B, 0x972C, 0x50CE,

+    0x972D, 0x972D, 0x1D6A, 0x972E, 0x972F, 0x50D0, 0x9730, 0x9730, 0x1D6B,

+    0x9731, 0x9731, 0x50D2, 0x9732, 0x9732, 0x0A5D, 0x9733, 0x9737, 0x50D3,

+    0x9738, 0x9738, 0x03DF, 0x9739, 0x9739, 0x0BBA, 0x973A, 0x973C, 0x50D8,

+    0x973D, 0x973D, 0x260D, 0x973E, 0x973E, 0x1D6C, 0x973F, 0x9741, 0x50DB,

+    0x9742, 0x9742, 0x260C, 0x9743, 0x9743, 0x50DE, 0x9744, 0x9744, 0x260E,

+    0x9745, 0x9747, 0x50DF, 0x9748, 0x9748, 0x2032, 0x9749, 0x9751, 0x50E2,

+    0x9752, 0x9752, 0x0C5D, 0x9753, 0x9753, 0x1D60, 0x9754, 0x9755, 0x50EB,

+    0x9756, 0x9756, 0x08E7, 0x9757, 0x9758, 0x50ED, 0x9759, 0x9759, 0x08E1,

+    0x975A, 0x975A, 0x260B, 0x975B, 0x975B, 0x05C6, 0x975C, 0x975D, 0x50EF,

+    0x975E, 0x975E, 0x0664, 0x975F, 0x975F, 0x50F1, 0x9760, 0x9760, 0x094C,

+    0x9761, 0x9761, 0x0AD7, 0x9762, 0x9762, 0x0AEB, 0x9763, 0x9764, 0x50F2,

+    0x9765, 0x9765, 0x1282, 0x9766, 0x9767, 0x50F4, 0x9768, 0x9768, 0x22C3,

+    0x9769, 0x9769, 0x06EA, 0x976A, 0x9772, 0x50F6, 0x9773, 0x9773, 0x08CA,

+    0x9774, 0x9774, 0x0FCE, 0x9775, 0x9775, 0x50FF, 0x9776, 0x9776, 0x03DB,

+    0x9777, 0x977B, 0x5100, 0x977C, 0x977C, 0x1DC8, 0x977D, 0x9784, 0x5105,

+    0x9785, 0x9785, 0x1DC9, 0x9786, 0x978A, 0x510D, 0x978B, 0x978B, 0x0F77,

+    0x978C, 0x978C, 0x5112, 0x978D, 0x978D, 0x03BB, 0x978E, 0x978E, 0x5113,

+    0x978F, 0x978F, 0x1F23, 0x9790, 0x9790, 0x5114, 0x9791, 0x9792, 0x1DCA,

+    0x9793, 0x9793, 0x5115, 0x9794, 0x9794, 0x1DCC, 0x9795, 0x9797, 0x5116,

+    0x9798, 0x9798, 0x0C47, 0x9799, 0x979F, 0x5119, 0x97A0, 0x97A0, 0x08FE,

+    0x97A1, 0x97A2, 0x5120, 0x97A3, 0x97A3, 0x1DCF, 0x97A4, 0x97A5, 0x5122,

+    0x97A6, 0x97A6, 0x2695, 0x97A7, 0x97AA, 0x5124, 0x97AB, 0x97AB, 0x1DCE,

+    0x97AC, 0x97AC, 0x5128, 0x97AD, 0x97AD, 0x0447, 0x97AE, 0x97AE, 0x5129,

+    0x97AF, 0x97AF, 0x1DCD, 0x97B0, 0x97B1, 0x512A, 0x97B2, 0x97B2, 0x1DD0,

+    0x97B3, 0x97B3, 0x512C, 0x97B4, 0x97B4, 0x1DD1, 0x97B5, 0x97BC, 0x512D,

+    0x97BD, 0x97BD, 0x265E, 0x97BE, 0x97C2, 0x5135, 0x97C3, 0x97C3, 0x265D,

+    0x97C4, 0x97C5, 0x513A, 0x97C6, 0x97C6, 0x2692, 0x97C7, 0x97C8, 0x513C,

+    0x97C9, 0x97C9, 0x265F, 0x97CA, 0x97CA, 0x513E, 0x97CB, 0x97CB, 0x218D,

+    0x97CC, 0x97CC, 0x20FD, 0x97CD, 0x97D2, 0x513F, 0x97D3, 0x97D3, 0x1F40,

+    0x97D4, 0x97D8, 0x5145, 0x97D9, 0x97D9, 0x2465, 0x97DA, 0x97DB, 0x514A,

+    0x97DC, 0x97DC, 0x2467, 0x97DD, 0x97DD, 0x514C, 0x97DE, 0x97DE, 0x2466,

+    0x97DF, 0x97E5, 0x514D, 0x97E6, 0x97E6, 0x0EB3, 0x97E7, 0x97E7, 0x0CA8,

+    0x97E8, 0x97E8, 0x5154, 0x97E9, 0x97E9, 0x0762, 0x97EA, 0x97EC, 0x184E,

+    0x97ED, 0x97ED, 0x08F1, 0x97EE, 0x97F2, 0x5155, 0x97F3, 0x97F3, 0x107B,

+    0x97F4, 0x97F4, 0x515A, 0x97F5, 0x97F5, 0x1112, 0x97F6, 0x97F6, 0x0D11,

+    0x97F7, 0x97FE, 0x515B, 0x97FF, 0x97FF, 0x21C9, 0x9800, 0x9800, 0x5163,

+    0x9801, 0x9801, 0x2209, 0x9802, 0x9802, 0x1EC9, 0x9803, 0x9803, 0x20E9,

+    0x9804, 0x9804, 0x5164, 0x9805, 0x9805, 0x21CA, 0x9806, 0x9806, 0x2146,

+    0x9807, 0x9807, 0x25C5, 0x9808, 0x9808, 0x21DC, 0x9809, 0x9809, 0x5165,

+    0x980A, 0x980A, 0x245E, 0x980B, 0x980B, 0x5166, 0x980C, 0x980C, 0x214F,

+    0x980D, 0x980D, 0x5167, 0x980E, 0x980F, 0x25C6, 0x9810, 0x9810, 0x2241,

+    0x9811, 0x9811, 0x218A, 0x9812, 0x9812, 0x1E2F, 0x9813, 0x9813, 0x1EDC,

+    0x9814, 0x9816, 0x5168, 0x9817, 0x9817, 0x20BF, 0x9818, 0x9818, 0x2034,

+    0x9819, 0x981B, 0x516B, 0x981C, 0x981C, 0x25C9, 0x981D, 0x9820, 0x516E,

+    0x9821, 0x9821, 0x25C8, 0x9822, 0x9823, 0x5172, 0x9824, 0x9824, 0x220E,

+    0x9825, 0x9825, 0x5174, 0x9826, 0x9826, 0x25CB, 0x9827, 0x982C, 0x5175,

+    0x982D, 0x982D, 0x217D, 0x982E, 0x982F, 0x517B, 0x9830, 0x9830, 0x1F7E,

+    0x9831, 0x9836, 0x517D, 0x9837, 0x9837, 0x25CC, 0x9838, 0x9838, 0x1FC3,

+    0x9839, 0x983A, 0x5183, 0x983B, 0x983B, 0x20B9, 0x983C, 0x983C, 0x5185,

+    0x983D, 0x983D, 0x2181, 0x983E, 0x9845, 0x5186, 0x9846, 0x9846, 0x1FDA,

+    0x9847, 0x984B, 0x518E, 0x984C, 0x984C, 0x2173, 0x984D, 0x984D, 0x1EE1,

+    0x984E, 0x984E, 0x25CD, 0x984F, 0x9852, 0x5193, 0x9853, 0x9853, 0x25CE,

+    0x9854, 0x9854, 0x21F6, 0x9855, 0x9857, 0x5197, 0x9858, 0x9858, 0x224B,

+    0x9859, 0x9859, 0x25D1, 0x985A, 0x985A, 0x519A, 0x985B, 0x985B, 0x1EC0,

+    0x985C, 0x985D, 0x519B, 0x985E, 0x985E, 0x2008, 0x985F, 0x9861, 0x519D,

+    0x9862, 0x9862, 0x25D0, 0x9863, 0x9864, 0x51A0, 0x9865, 0x9865, 0x25D2,

+    0x9866, 0x9866, 0x51A2, 0x9867, 0x9867, 0x1F2A, 0x9868, 0x986A, 0x51A3,

+    0x986B, 0x986B, 0x1E72, 0x986C, 0x986C, 0x25D3, 0x986D, 0x986E, 0x51A6,

+    0x986F, 0x986F, 0x21BE, 0x9870, 0x9870, 0x25D4, 0x9871, 0x9871, 0x2044,

+    0x9872, 0x9872, 0x51A8, 0x9873, 0x9873, 0x25CF, 0x9874, 0x9874, 0x20F3,

+    0x9875, 0x9875, 0x103A, 0x9876, 0x9876, 0x05E4, 0x9877, 0x9877, 0x0C67,

+    0x9878, 0x9878, 0x1BE0, 0x9879, 0x9879, 0x0F5B, 0x987A, 0x987A, 0x0DA8,

+    0x987B, 0x987B, 0x0FB6, 0x987C, 0x987C, 0x1827, 0x987D, 0x987D, 0x0E98,

+    0x987E, 0x987E, 0x0724, 0x987F, 0x987F, 0x0618, 0x9880, 0x9880, 0x1BE1,

+    0x9881, 0x9881, 0x03EF, 0x9882, 0x9882, 0x0DC1, 0x9883, 0x9883, 0x1BE2,

+    0x9884, 0x9884, 0x10E7, 0x9885, 0x9885, 0x0A54, 0x9886, 0x9886, 0x0A35,

+    0x9887, 0x9887, 0x0BE3, 0x9888, 0x9888, 0x08E0, 0x9889, 0x9889, 0x1BE3,

+    0x988A, 0x988A, 0x0848, 0x988B, 0x988B, 0x51A9, 0x988C, 0x988D, 0x1BE4,

+    0x988E, 0x988E, 0x51AA, 0x988F, 0x988F, 0x1BE6, 0x9890, 0x9890, 0x104A,

+    0x9891, 0x9891, 0x0BD4, 0x9892, 0x9892, 0x51AB, 0x9893, 0x9893, 0x0E78,

+    0x9894, 0x9894, 0x1BE7, 0x9895, 0x9895, 0x51AC, 0x9896, 0x9896, 0x1096,

+    0x9897, 0x9897, 0x0952, 0x9898, 0x9898, 0x0E35, 0x9899, 0x9899, 0x51AD,

+    0x989A, 0x989B, 0x1BE8, 0x989C, 0x989C, 0x0FFE, 0x989D, 0x989D, 0x062D,

+    0x989E, 0x989F, 0x1BEA, 0x98A0, 0x98A0, 0x05C0, 0x98A1, 0x98A2, 0x1BEC,

+    0x98A3, 0x98A3, 0x51AE, 0x98A4, 0x98A4, 0x04C3, 0x98A5, 0x98A6, 0x1BEE,

+    0x98A7, 0x98A7, 0x0C82, 0x98A8, 0x98A8, 0x1F00, 0x98A9, 0x98AD, 0x51AF,

+    0x98AE, 0x98AF, 0x24CC, 0x98B0, 0x98B0, 0x51B4, 0x98B1, 0x98B1, 0x2698,

+    0x98B2, 0x98B2, 0x51B5, 0x98B3, 0x98B3, 0x2678, 0x98B4, 0x98B5, 0x51B6,

+    0x98B6, 0x98B6, 0x24CE, 0x98B7, 0x98BB, 0x51B8, 0x98BC, 0x98BC, 0x24CF,

+    0x98BD, 0x98C3, 0x51BD, 0x98C4, 0x98C4, 0x20B8, 0x98C5, 0x98C5, 0x51C4,

+    0x98C6, 0x98C6, 0x24D0, 0x98C7, 0x98C7, 0x51C5, 0x98C8, 0x98C8, 0x24D1,

+    0x98C9, 0x98CD, 0x51C6, 0x98CE, 0x98CE, 0x0684, 0x98CF, 0x98D0, 0x51CB,

+    0x98D1, 0x98D3, 0x19B7, 0x98D4, 0x98D4, 0x51CD, 0x98D5, 0x98D5, 0x19BA,

+    0x98D6, 0x98D7, 0x51CE, 0x98D8, 0x98D8, 0x0BCD, 0x98D9, 0x98DA, 0x19BB,

+    0x98DB, 0x98DB, 0x1EF4, 0x98DC, 0x98DD, 0x51D0, 0x98DE, 0x98DE, 0x0666,

+    0x98DF, 0x98DF, 0x0D4A, 0x98E0, 0x98E0, 0x239B, 0x98E1, 0x98E1, 0x51D2,

+    0x98E2, 0x98E2, 0x267E, 0x98E3, 0x98E6, 0x51D3, 0x98E7, 0x98E7, 0x161A,

+    0x98E8, 0x98E8, 0x1DE7, 0x98E9, 0x98E9, 0x239D, 0x98EA, 0x98EB, 0x239F,

+    0x98EC, 0x98EC, 0x51D7, 0x98ED, 0x98ED, 0x23A1, 0x98EE, 0x98EE, 0x51D8,

+    0x98EF, 0x98EF, 0x1EF1, 0x98F0, 0x98F1, 0x51D9, 0x98F2, 0x98F2, 0x221E,

+    0x98F3, 0x98F3, 0x51DB, 0x98F4, 0x98F4, 0x23A2, 0x98F5, 0x98FB, 0x51DC,

+    0x98FC, 0x98FC, 0x214B, 0x98FD, 0x98FD, 0x1E36, 0x98FE, 0x98FE, 0x2135,

+    0x98FF, 0x98FF, 0x51E3, 0x9900, 0x9902, 0x51E4, 0x9903, 0x9903, 0x1FAD,

+    0x9904, 0x9904, 0x51E7, 0x9905, 0x9905, 0x1E53, 0x9906, 0x9908, 0x51E8,

+    0x9909, 0x9909, 0x23A3, 0x990A, 0x990A, 0x2203, 0x990B, 0x990B, 0x51EB,

+    0x990C, 0x990C, 0x1EE7, 0x990D, 0x990D, 0x1DE8, 0x990E, 0x990F, 0x51EC,

+    0x9910, 0x9910, 0x0494, 0x9911, 0x9911, 0x23A4, 0x9912, 0x9912, 0x2097,

+    0x9913, 0x9913, 0x1EE4, 0x9914, 0x9917, 0x51EE, 0x9918, 0x9918, 0x2238,

+    0x9919, 0x991A, 0x51F2, 0x991B, 0x991B, 0x23A5, 0x991C, 0x991D, 0x51F4,

+    0x991E, 0x991E, 0x1F9A, 0x991F, 0x9920, 0x51F6, 0x9921, 0x9921, 0x21C3,

+    0x9922, 0x9927, 0x51F8, 0x9928, 0x9928, 0x1F2E, 0x9929, 0x992D, 0x51FE,

+    0x992E, 0x992E, 0x1DE9, 0x992F, 0x9932, 0x5203, 0x9933, 0x9933, 0x239C,

+    0x9934, 0x9936, 0x5207, 0x9937, 0x9937, 0x23A6, 0x9938, 0x993B, 0x520A,

+    0x993C, 0x993C, 0x239E, 0x993D, 0x993D, 0x520E, 0x993E, 0x993E, 0x2035,

+    0x993F, 0x993F, 0x23A7, 0x9940, 0x9942, 0x520F, 0x9943, 0x9943, 0x23A8,

+    0x9944, 0x9944, 0x5212, 0x9945, 0x9945, 0x2075, 0x9946, 0x9947, 0x5213,

+    0x9948, 0x994A, 0x23A9, 0x994B, 0x994B, 0x1FEB, 0x994C, 0x994C, 0x23AC,

+    0x994D, 0x9950, 0x5215, 0x9951, 0x9951, 0x1F6A, 0x9952, 0x9952, 0x20F9,

+    0x9953, 0x9953, 0x5219, 0x9954, 0x9954, 0x1DEB, 0x9955, 0x9955, 0x1DEA,

+    0x9956, 0x9956, 0x521A, 0x9957, 0x9957, 0x2666, 0x9958, 0x995B, 0x521B,

+    0x995C, 0x995C, 0x2667, 0x995D, 0x995D, 0x521F, 0x995E, 0x995E, 0x1E6C,

+    0x995F, 0x9961, 0x5220, 0x9962, 0x9962, 0x23AD, 0x9963, 0x9963, 0x161D,

+    0x9964, 0x9964, 0x5223, 0x9965, 0x9965, 0x0815, 0x9966, 0x9966, 0x5224,

+    0x9967, 0x996C, 0x161E, 0x996D, 0x996D, 0x0656, 0x996E, 0x996E, 0x1082,

+    0x996F, 0x996F, 0x0875, 0x9970, 0x9970, 0x0D65, 0x9971, 0x9971, 0x040E,

+    0x9972, 0x9972, 0x0DBC, 0x9973, 0x9973, 0x5225, 0x9974, 0x9974, 0x1624,

+    0x9975, 0x9975, 0x063B, 0x9976, 0x9976, 0x0C9F, 0x9977, 0x9977, 0x1625,

+    0x9978, 0x9979, 0x5226, 0x997A, 0x997A, 0x0899, 0x997B, 0x997B, 0x5228,

+    0x997C, 0x997C, 0x0466, 0x997D, 0x997D, 0x1626, 0x997E, 0x997E, 0x5229,

+    0x997F, 0x997F, 0x0635, 0x9980, 0x9980, 0x1627, 0x9981, 0x9981, 0x0B3C,

+    0x9982, 0x9983, 0x522A, 0x9984, 0x9984, 0x1628, 0x9985, 0x9985, 0x0F47,

+    0x9986, 0x9986, 0x0736, 0x9987, 0x9987, 0x1629, 0x9988, 0x9988, 0x098C,

+    0x9989, 0x9989, 0x522C, 0x998A, 0x998A, 0x162A, 0x998B, 0x998B, 0x04BD,

+    0x998C, 0x998C, 0x522D, 0x998D, 0x998D, 0x162B, 0x998E, 0x998E, 0x522E,

+    0x998F, 0x998F, 0x0A3C, 0x9990, 0x9991, 0x162C, 0x9992, 0x9992, 0x0A9F,

+    0x9993, 0x9995, 0x162E, 0x9996, 0x9996, 0x0D6E, 0x9997, 0x9997, 0x126E,

+    0x9998, 0x9998, 0x12F9, 0x9999, 0x9999, 0x0F50, 0x999A, 0x99A4, 0x522F,

+    0x99A5, 0x99A5, 0x1B2B, 0x99A6, 0x99A7, 0x523A, 0x99A8, 0x99A8, 0x13DE,

+    0x99A9, 0x99AB, 0x523C, 0x99AC, 0x99AC, 0x206D, 0x99AD, 0x99AD, 0x2242,

+    0x99AE, 0x99AE, 0x1F02, 0x99AF, 0x99B0, 0x523F, 0x99B1, 0x99B1, 0x2183,

+    0x99B2, 0x99B2, 0x5241, 0x99B3, 0x99B3, 0x1E85, 0x99B4, 0x99B4, 0x21E9,

+    0x99B5, 0x99C0, 0x5242, 0x99C1, 0x99C1, 0x1E57, 0x99C2, 0x99CF, 0x524E,

+    0x99D0, 0x99D0, 0x22A5, 0x99D1, 0x99D1, 0x2407, 0x99D2, 0x99D2, 0x1FCA,

+    0x99D3, 0x99D3, 0x525C, 0x99D4, 0x99D4, 0x2402, 0x99D5, 0x99D5, 0x1F82,

+    0x99D6, 0x99D7, 0x525D, 0x99D8, 0x99D8, 0x2408, 0x99D9, 0x99D9, 0x2404,

+    0x99DA, 0x99DA, 0x525F, 0x99DB, 0x99DB, 0x2131, 0x99DC, 0x99DC, 0x5260,

+    0x99DD, 0x99DD, 0x2184, 0x99DE, 0x99DE, 0x5261, 0x99DF, 0x99DF, 0x2403,

+    0x99E0, 0x99E0, 0x5262, 0x99E1, 0x99E1, 0x206E, 0x99E2, 0x99E2, 0x240B,

+    0x99E3, 0x99EC, 0x5263, 0x99ED, 0x99ED, 0x1F3F, 0x99EE, 0x99F0, 0x526D,

+    0x99F1, 0x99F1, 0x2067, 0x99F2, 0x99FE, 0x5270, 0x99FF, 0x99FF, 0x1FD7,

+    0x9A00, 0x9A00, 0x527D, 0x9A01, 0x9A01, 0x1E83, 0x9A02, 0x9A04, 0x527E,

+    0x9A05, 0x9A05, 0x240F, 0x9A06, 0x9A0C, 0x5281, 0x9A0D, 0x9A0D, 0x240E,

+    0x9A0E, 0x9A0E, 0x20C7, 0x9A0F, 0x9A0F, 0x240D, 0x9A10, 0x9A15, 0x5288,

+    0x9A16, 0x9A16, 0x2412, 0x9A17, 0x9A18, 0x528E, 0x9A19, 0x9A19, 0x20B7,

+    0x9A1A, 0x9A2A, 0x5290, 0x9A2B, 0x9A2B, 0x23F0, 0x9A2C, 0x9A2C, 0x52A1,

+    0x9A2D, 0x9A2D, 0x2411, 0x9A2E, 0x9A2E, 0x2414, 0x9A2F, 0x9A2F, 0x52A2,

+    0x9A30, 0x9A30, 0x2170, 0x9A31, 0x9A35, 0x52A3, 0x9A36, 0x9A36, 0x2405,

+    0x9A37, 0x9A37, 0x210C, 0x9A38, 0x9A38, 0x2415, 0x9A39, 0x9A3D, 0x52A8,

+    0x9A3E, 0x9A3E, 0x2066, 0x9A3F, 0x9A3F, 0x52AD, 0x9A40, 0x9A40, 0x2352,

+    0x9A41, 0x9A41, 0x2413, 0x9A42, 0x9A42, 0x2410, 0x9A43, 0x9A44, 0x2416,

+    0x9A45, 0x9A45, 0x20F1, 0x9A46, 0x9A49, 0x52AE, 0x9A4A, 0x9A4A, 0x240A,

+    0x9A4B, 0x9A4C, 0x52B2, 0x9A4D, 0x9A4D, 0x2409, 0x9A4E, 0x9A4E, 0x52B4,

+    0x9A4F, 0x9A4F, 0x2418, 0x9A50, 0x9A54, 0x52B5, 0x9A55, 0x9A55, 0x1FA7,

+    0x9A56, 0x9A56, 0x52BA, 0x9A57, 0x9A57, 0x21FC, 0x9A58, 0x9A59, 0x52BB,

+    0x9A5A, 0x9A5A, 0x1FC1, 0x9A5B, 0x9A5B, 0x2406, 0x9A5C, 0x9A5E, 0x52BD,

+    0x9A5F, 0x9A5F, 0x229C, 0x9A60, 0x9A61, 0x52C0, 0x9A62, 0x9A62, 0x204E,

+    0x9A63, 0x9A63, 0x52C2, 0x9A64, 0x9A64, 0x241A, 0x9A65, 0x9A65, 0x2419,

+    0x9A66, 0x9A69, 0x52C3, 0x9A6A, 0x9A6A, 0x240C, 0x9A6B, 0x9A6B, 0x52C7,

+    0x9A6C, 0x9A6C, 0x0A94, 0x9A6D, 0x9A6D, 0x10E9, 0x9A6E, 0x9A6E, 0x0E85,

+    0x9A6F, 0x9A6F, 0x0FDA, 0x9A70, 0x9A70, 0x0500, 0x9A71, 0x9A71, 0x0C7A,

+    0x9A72, 0x9A72, 0x52C8, 0x9A73, 0x9A73, 0x047C, 0x9A74, 0x9A74, 0x0A66,

+    0x9A75, 0x9A75, 0x17BA, 0x9A76, 0x9A76, 0x0D52, 0x9A77, 0x9A78, 0x17BB,

+    0x9A79, 0x9A79, 0x0903, 0x9A7A, 0x9A7A, 0x17BD, 0x9A7B, 0x9A7B, 0x1201,

+    0x9A7C, 0x9A7C, 0x0E86, 0x9A7D, 0x9A7D, 0x17BF, 0x9A7E, 0x9A7E, 0x0850,

+    0x9A7F, 0x9A7F, 0x17BE, 0x9A80, 0x9A81, 0x17C0, 0x9A82, 0x9A82, 0x0A95,

+    0x9A83, 0x9A83, 0x52C9, 0x9A84, 0x9A84, 0x088F, 0x9A85, 0x9A85, 0x17C2,

+    0x9A86, 0x9A86, 0x0A8D, 0x9A87, 0x9A87, 0x075E, 0x9A88, 0x9A88, 0x17C3,

+    0x9A89, 0x9A89, 0x52CA, 0x9A8A, 0x9A8A, 0x17C4, 0x9A8B, 0x9A8B, 0x04F7,

+    0x9A8C, 0x9A8C, 0x1012, 0x9A8D, 0x9A8E, 0x52CB, 0x9A8F, 0x9A8F, 0x0932,

+    0x9A90, 0x9A90, 0x17C5, 0x9A91, 0x9A91, 0x0C0E, 0x9A92, 0x9A93, 0x17C6,

+    0x9A94, 0x9A95, 0x52CD, 0x9A96, 0x9A96, 0x17C8, 0x9A97, 0x9A97, 0x0BCC,

+    0x9A98, 0x9A98, 0x17C9, 0x9A99, 0x9A99, 0x52CF, 0x9A9A, 0x9A9A, 0x0CE0,

+    0x9A9B, 0x9A9D, 0x17CA, 0x9A9E, 0x9A9E, 0x1735, 0x9A9F, 0x9AA0, 0x17CD,

+    0x9AA1, 0x9AA1, 0x0A89, 0x9AA2, 0x9AA3, 0x17CF, 0x9AA4, 0x9AA4, 0x11E7,

+    0x9AA5, 0x9AA5, 0x17D1, 0x9AA6, 0x9AA6, 0x52D0, 0x9AA7, 0x9AA7, 0x17D2,

+    0x9AA8, 0x9AA8, 0x0720, 0x9AA9, 0x9AAE, 0x52D1, 0x9AAF, 0x9AAF, 0x1E29,

+    0x9AB0, 0x9AB0, 0x1DD3, 0x9AB1, 0x9AB1, 0x1DD2, 0x9AB2, 0x9AB5, 0x52D7,

+    0x9AB6, 0x9AB6, 0x1DD6, 0x9AB7, 0x9AB7, 0x1DD4, 0x9AB8, 0x9AB8, 0x0758,

+    0x9AB9, 0x9AB9, 0x52DB, 0x9ABA, 0x9ABA, 0x1DD7, 0x9ABB, 0x9ABB, 0x52DC,

+    0x9ABC, 0x9ABC, 0x1DD8, 0x9ABD, 0x9ABF, 0x52DD, 0x9AC0, 0x9AC0, 0x1DDA,

+    0x9AC1, 0x9AC1, 0x1DD9, 0x9AC2, 0x9AC2, 0x1DDC, 0x9AC3, 0x9AC4, 0x52E0,

+    0x9AC5, 0x9AC5, 0x1DDB, 0x9AC6, 0x9ACA, 0x52E2, 0x9ACB, 0x9ACC, 0x1DDD,

+    0x9ACD, 0x9ACE, 0x52E7, 0x9ACF, 0x9ACF, 0x2661, 0x9AD0, 0x9AD0, 0x52E9,

+    0x9AD1, 0x9AD1, 0x1DDF, 0x9AD2, 0x9AD2, 0x26A4, 0x9AD3, 0x9AD3, 0x0DDD,

+    0x9AD4, 0x9AD4, 0x2174, 0x9AD5, 0x9AD5, 0x2663, 0x9AD6, 0x9AD6, 0x2662,

+    0x9AD7, 0x9AD7, 0x52EA, 0x9AD8, 0x9AD8, 0x06DA, 0x9AD9, 0x9ADE, 0x52EB,

+    0x9ADF, 0x9ADF, 0x1DEC, 0x9AE0, 0x9AE0, 0x52F1, 0x9AE1, 0x9AE1, 0x1DED,

+    0x9AE2, 0x9AE5, 0x52F2, 0x9AE6, 0x9AE6, 0x1DEE, 0x9AE7, 0x9AEA, 0x52F6,

+    0x9AEB, 0x9AEB, 0x1DF0, 0x9AEC, 0x9AEC, 0x52FA, 0x9AED, 0x9AED, 0x1DF2,

+    0x9AEE, 0x9AEE, 0x2675, 0x9AEF, 0x9AEF, 0x1DEF, 0x9AF0, 0x9AF8, 0x52FB,

+    0x9AF9, 0x9AF9, 0x1DF3, 0x9AFA, 0x9AFA, 0x5304, 0x9AFB, 0x9AFB, 0x1DF1,

+    0x9AFC, 0x9AFF, 0x5305, 0x9B00, 0x9B02, 0x5309, 0x9B03, 0x9B03, 0x1234,

+    0x9B04, 0x9B05, 0x530C, 0x9B06, 0x9B06, 0x214C, 0x9B07, 0x9B07, 0x530E,

+    0x9B08, 0x9B08, 0x1DF4, 0x9B09, 0x9B0C, 0x530F, 0x9B0D, 0x9B0D, 0x267A,

+    0x9B0E, 0x9B0E, 0x5313, 0x9B0F, 0x9B0F, 0x1DF5, 0x9B10, 0x9B12, 0x5314,

+    0x9B13, 0x9B13, 0x1DF6, 0x9B14, 0x9B19, 0x5317, 0x9B1A, 0x9B1A, 0x26A0,

+    0x9B1B, 0x9B1E, 0x531D, 0x9B1F, 0x9B1F, 0x1DF7, 0x9B20, 0x9B21, 0x5321,

+    0x9B22, 0x9B22, 0x2668, 0x9B23, 0x9B23, 0x1DF8, 0x9B24, 0x9B24, 0x5323,

+    0x9B25, 0x9B25, 0x1ED0, 0x9B26, 0x9B26, 0x5324, 0x9B27, 0x9B27, 0x2096,

+    0x9B28, 0x9B28, 0x5325, 0x9B29, 0x9B29, 0x23CC, 0x9B2A, 0x9B2D, 0x5326,

+    0x9B2E, 0x9B2E, 0x23C8, 0x9B2F, 0x9B2F, 0x139B, 0x9B30, 0x9B30, 0x532A,

+    0x9B31, 0x9B31, 0x223E, 0x9B32, 0x9B32, 0x1260, 0x9B33, 0x9B3A, 0x532B,

+    0x9B3B, 0x9B3B, 0x1773, 0x9B3C, 0x9B3C, 0x0746, 0x9B3D, 0x9B40, 0x5333,

+    0x9B41, 0x9B41, 0x098A, 0x9B42, 0x9B42, 0x07FF, 0x9B43, 0x9B43, 0x1DE1,

+    0x9B44, 0x9B44, 0x0BE6, 0x9B45, 0x9B45, 0x1DE0, 0x9B46, 0x9B46, 0x5337,

+    0x9B47, 0x9B47, 0x1DE2, 0x9B48, 0x9B48, 0x1DE4, 0x9B49, 0x9B49, 0x1DE3,

+    0x9B4A, 0x9B4C, 0x5338, 0x9B4D, 0x9B4D, 0x1DE5, 0x9B4E, 0x9B4E, 0x2665,

+    0x9B4F, 0x9B4F, 0x0EC9, 0x9B50, 0x9B50, 0x533B, 0x9B51, 0x9B51, 0x1DE6,

+    0x9B52, 0x9B53, 0x533C, 0x9B54, 0x9B54, 0x0B0A, 0x9B55, 0x9B57, 0x533E,

+    0x9B58, 0x9B58, 0x2664, 0x9B59, 0x9B59, 0x5341, 0x9B5A, 0x9B5A, 0x2239,

+    0x9B5B, 0x9B6E, 0x5342, 0x9B6F, 0x9B6F, 0x204A, 0x9B70, 0x9B73, 0x5356,

+    0x9B74, 0x9B74, 0x261F, 0x9B75, 0x9B76, 0x535A, 0x9B77, 0x9B77, 0x261E,

+    0x9B78, 0x9B80, 0x535C, 0x9B81, 0x9B81, 0x2620, 0x9B82, 0x9B82, 0x5365,

+    0x9B83, 0x9B83, 0x2621, 0x9B84, 0x9B8D, 0x5366, 0x9B8E, 0x9B8E, 0x2622,

+    0x9B8F, 0x9B8F, 0x5370, 0x9B90, 0x9B90, 0x2627, 0x9B91, 0x9B91, 0x1E39,

+    0x9B92, 0x9B92, 0x2625, 0x9B93, 0x9B99, 0x5371, 0x9B9A, 0x9B9A, 0x2629,

+    0x9B9B, 0x9B9C, 0x5378, 0x9B9D, 0x9B9D, 0x262E, 0x9B9E, 0x9B9E, 0x262B,

+    0x9B9F, 0x9BA9, 0x537A, 0x9BAA, 0x9BAA, 0x262A, 0x9BAB, 0x9BAB, 0x262D,

+    0x9BAC, 0x9BAC, 0x5385, 0x9BAD, 0x9BAD, 0x2628, 0x9BAE, 0x9BAE, 0x21B9,

+    0x9BAF, 0x9BBF, 0x5386, 0x9BC0, 0x9BC0, 0x2636, 0x9BC1, 0x9BC1, 0x2630,

+    0x9BC2, 0x9BC6, 0x5397, 0x9BC7, 0x9BC7, 0x2638, 0x9BC8, 0x9BC8, 0x539C,

+    0x9BC9, 0x9BC9, 0x200D, 0x9BCA, 0x9BCA, 0x2637, 0x9BCB, 0x9BD3, 0x539D,

+    0x9BD4, 0x9BD4, 0x2645, 0x9BD5, 0x9BD5, 0x53A6, 0x9BD6, 0x9BD6, 0x263A,

+    0x9BD7, 0x9BDA, 0x53A7, 0x9BDB, 0x9BDB, 0x2643, 0x9BDC, 0x9BDC, 0x53AB,

+    0x9BDD, 0x9BDD, 0x2640, 0x9BDE, 0x9BE0, 0x53AC, 0x9BE1, 0x9BE1, 0x263D,

+    0x9BE2, 0x9BE2, 0x2641, 0x9BE3, 0x9BE3, 0x53AF, 0x9BE4, 0x9BE4, 0x263E,

+    0x9BE5, 0x9BE6, 0x53B0, 0x9BE7, 0x9BE7, 0x263F, 0x9BE8, 0x9BE8, 0x1FC0,

+    0x9BE9, 0x9BE9, 0x53B2, 0x9BEA, 0x9BEB, 0x263B, 0x9BEC, 0x9BEF, 0x53B3,

+    0x9BF0, 0x9BF0, 0x2642, 0x9BF1, 0x9BF3, 0x53B7, 0x9BF4, 0x9BF4, 0x2644,

+    0x9BF5, 0x9BFC, 0x53BA, 0x9BFD, 0x9BFD, 0x2639, 0x9BFE, 0x9BFE, 0x53C2,

+    0x9BFF, 0x9BFF, 0x264C, 0x9C00, 0x9C07, 0x53C3, 0x9C08, 0x9C08, 0x2647,

+    0x9C09, 0x9C09, 0x264B, 0x9C0A, 0x9C0C, 0x53CB, 0x9C0D, 0x9C0D, 0x2649,

+    0x9C0E, 0x9C0F, 0x53CE, 0x9C10, 0x9C10, 0x2648, 0x9C11, 0x9C11, 0x53D0,

+    0x9C12, 0x9C12, 0x264A, 0x9C13, 0x9C13, 0x2108, 0x9C14, 0x9C1F, 0x53D1,

+    0x9C20, 0x9C20, 0x264D, 0x9C21, 0x9C22, 0x53DD, 0x9C23, 0x9C23, 0x2634,

+    0x9C24, 0x9C24, 0x53DF, 0x9C25, 0x9C25, 0x2651, 0x9C26, 0x9C27, 0x53E0,

+    0x9C28, 0x9C28, 0x2650, 0x9C29, 0x9C29, 0x2652, 0x9C2A, 0x9C2C, 0x53E2,

+    0x9C2D, 0x9C2D, 0x264F, 0x9C2E, 0x9C30, 0x53E5, 0x9C31, 0x9C31, 0x2632,

+    0x9C32, 0x9C32, 0x264E, 0x9C33, 0x9C33, 0x2653, 0x9C34, 0x9C34, 0x53E8,

+    0x9C35, 0x9C35, 0x2657, 0x9C36, 0x9C36, 0x53E9, 0x9C37, 0x9C37, 0x2635,

+    0x9C38, 0x9C38, 0x53EA, 0x9C39, 0x9C39, 0x2633, 0x9C3A, 0x9C3A, 0x53EB,

+    0x9C3B, 0x9C3B, 0x2656, 0x9C3C, 0x9C3D, 0x53EC, 0x9C3E, 0x9C3E, 0x2654,

+    0x9C3F, 0x9C44, 0x53EE, 0x9C45, 0x9C45, 0x2658, 0x9C46, 0x9C47, 0x53F4,

+    0x9C48, 0x9C48, 0x2655, 0x9C49, 0x9C49, 0x1E4D, 0x9C4A, 0x9C51, 0x53F6,

+    0x9C52, 0x9C52, 0x265B, 0x9C53, 0x9C53, 0x53FE, 0x9C54, 0x9C54, 0x265A,

+    0x9C55, 0x9C55, 0x53FF, 0x9C56, 0x9C56, 0x2659, 0x9C57, 0x9C57, 0x202E,

+    0x9C58, 0x9C58, 0x262F, 0x9C59, 0x9C5C, 0x5400, 0x9C5D, 0x9C5D, 0x2646,

+    0x9C5E, 0x9C5E, 0x5404, 0x9C5F, 0x9C5F, 0x2626, 0x9C60, 0x9C66, 0x5405,

+    0x9C67, 0x9C67, 0x265C, 0x9C68, 0x9C6C, 0x540C, 0x9C6D, 0x9C6D, 0x262C,

+    0x9C6E, 0x9C77, 0x5411, 0x9C78, 0x9C78, 0x2623, 0x9C79, 0x9C79, 0x541B,

+    0x9C7A, 0x9C7A, 0x2631, 0x9C7B, 0x9C7B, 0x541C, 0x9C7C, 0x9C7C, 0x10C8,

+    0x9C7D, 0x9C7E, 0x541D, 0x9C7F, 0x9C7F, 0x1D89, 0x9C80, 0x9C80, 0x541F,

+    0x9C81, 0x9C81, 0x0A5A, 0x9C82, 0x9C82, 0x1D8A, 0x9C83, 0x9C84, 0x5420,

+    0x9C85, 0x9C88, 0x1D8B, 0x9C89, 0x9C8A, 0x5422, 0x9C8B, 0x9C8B, 0x1D90,

+    0x9C8C, 0x9C8C, 0x5424, 0x9C8D, 0x9C8D, 0x0414, 0x9C8E, 0x9C8E, 0x1D91,

+    0x9C8F, 0x9C8F, 0x5425, 0x9C90, 0x9C92, 0x1D92, 0x9C93, 0x9C93, 0x5426,

+    0x9C94, 0x9C95, 0x1D95, 0x9C96, 0x9C99, 0x5427, 0x9C9A, 0x9C9B, 0x1D97,

+    0x9C9C, 0x9C9C, 0x0F37, 0x9C9D, 0x9C9D, 0x542B, 0x9C9E, 0x9CA3, 0x1D99,

+    0x9CA4, 0x9CA4, 0x09DB, 0x9CA5, 0x9CA9, 0x1D9F, 0x9CAA, 0x9CAA, 0x542C,

+    0x9CAB, 0x9CAB, 0x1DA4, 0x9CAC, 0x9CAC, 0x542D, 0x9CAD, 0x9CAE, 0x1DA5,

+    0x9CAF, 0x9CAF, 0x542E, 0x9CB0, 0x9CB7, 0x1DA7, 0x9CB8, 0x9CB8, 0x08D7,

+    0x9CB9, 0x9CB9, 0x542F, 0x9CBA, 0x9CBD, 0x1DAF, 0x9CBE, 0x9CC2, 0x5430,

+    0x9CC3, 0x9CC3, 0x0CD5, 0x9CC4, 0x9CC7, 0x1DB3, 0x9CC8, 0x9CC9, 0x5435,

+    0x9CCA, 0x9CD0, 0x1DB7, 0x9CD1, 0x9CD2, 0x5437, 0x9CD3, 0x9CD5, 0x1DBE,

+    0x9CD6, 0x9CD6, 0x0457, 0x9CD7, 0x9CD9, 0x1DC1, 0x9CDA, 0x9CDB, 0x5439,

+    0x9CDC, 0x9CDD, 0x1DC4, 0x9CDE, 0x9CDE, 0x0A24, 0x9CDF, 0x9CDF, 0x1DC6,

+    0x9CE0, 0x9CE1, 0x543B, 0x9CE2, 0x9CE2, 0x1DC7, 0x9CE3, 0x9CE4, 0x543D,

+    0x9CE5, 0x9CE5, 0x209C, 0x9CE6, 0x9CE8, 0x543F, 0x9CE9, 0x9CE9, 0x2580,

+    0x9CEA, 0x9CEB, 0x5442, 0x9CEC, 0x9CEC, 0x22DC, 0x9CED, 0x9CF2, 0x5444,

+    0x9CF3, 0x9CF3, 0x1F05, 0x9CF4, 0x9CF4, 0x208B, 0x9CF5, 0x9CF5, 0x544A,

+    0x9CF6, 0x9CF6, 0x2581, 0x9CF7, 0x9CFF, 0x544B, 0x9D00, 0x9D05, 0x5454,

+    0x9D06, 0x9D06, 0x2583, 0x9D07, 0x9D07, 0x2582, 0x9D08, 0x9D08, 0x545A,

+    0x9D09, 0x9D09, 0x21EE, 0x9D0A, 0x9D14, 0x545B, 0x9D15, 0x9D15, 0x2182,

+    0x9D16, 0x9D1A, 0x5466, 0x9D1B, 0x9D1B, 0x2243, 0x9D1C, 0x9D1C, 0x546B,

+    0x9D1D, 0x9D1D, 0x2587, 0x9D1E, 0x9D1E, 0x546C, 0x9D1F, 0x9D1F, 0x2588,

+    0x9D20, 0x9D22, 0x546D, 0x9D23, 0x9D23, 0x2584, 0x9D24, 0x9D25, 0x5470,

+    0x9D26, 0x9D26, 0x21FD, 0x9D27, 0x9D27, 0x5472, 0x9D28, 0x9D28, 0x21EF,

+    0x9D29, 0x9D2E, 0x5473, 0x9D2F, 0x9D2F, 0x258A, 0x9D30, 0x9D30, 0x258C,

+    0x9D31, 0x9D3A, 0x5479, 0x9D3B, 0x9D3B, 0x1F47, 0x9D3C, 0x9D3E, 0x5483,

+    0x9D3F, 0x9D3F, 0x1F1D, 0x9D40, 0x9D41, 0x5486, 0x9D42, 0x9D42, 0x258D,

+    0x9D43, 0x9D50, 0x5488, 0x9D51, 0x9D51, 0x1FD0, 0x9D52, 0x9D52, 0x2592,

+    0x9D53, 0x9D53, 0x258F, 0x9D54, 0x9D5B, 0x5496, 0x9D5C, 0x9D5C, 0x2594,

+    0x9D5D, 0x9D5D, 0x1EE0, 0x9D5E, 0x9D5F, 0x549E, 0x9D60, 0x9D60, 0x2591,

+    0x9D61, 0x9D61, 0x2595, 0x9D62, 0x9D69, 0x54A0, 0x9D6A, 0x9D6A, 0x2597,

+    0x9D6B, 0x9D6B, 0x54A8, 0x9D6C, 0x9D6C, 0x20B6, 0x9D6D, 0x9D6E, 0x54A9,

+    0x9D6F, 0x9D6F, 0x2598, 0x9D70, 0x9D71, 0x54AB, 0x9D72, 0x9D72, 0x20F6,

+    0x9D73, 0x9D86, 0x54AD, 0x9D87, 0x9D87, 0x2585, 0x9D88, 0x9D88, 0x54C1,

+    0x9D89, 0x9D89, 0x2599, 0x9D8A, 0x9D92, 0x54C2, 0x9D93, 0x9D93, 0x2596,

+    0x9D94, 0x9D97, 0x54CB, 0x9D98, 0x9D98, 0x259A, 0x9D99, 0x9D99, 0x54CF,

+    0x9D9A, 0x9D9A, 0x259B, 0x9D9B, 0x9DA4, 0x54D0, 0x9DA5, 0x9DA5, 0x259D,

+    0x9DA6, 0x9DA8, 0x54DA, 0x9DA9, 0x9DA9, 0x259E, 0x9DAA, 0x9DAE, 0x54DD,

+    0x9DAF, 0x9DAF, 0x234C, 0x9DB0, 0x9DB3, 0x54E2, 0x9DB4, 0x9DB4, 0x1F44,

+    0x9DB5, 0x9DBA, 0x54E6, 0x9DBB, 0x9DBB, 0x2660, 0x9DBC, 0x9DBC, 0x25A0,

+    0x9DBD, 0x9DBF, 0x54EC, 0x9DC0, 0x9DC0, 0x259C, 0x9DC1, 0x9DC1, 0x54EF,

+    0x9DC2, 0x9DC2, 0x259F, 0x9DC3, 0x9DC3, 0x54F0, 0x9DC4, 0x9DC4, 0x1F6C,

+    0x9DC5, 0x9DD2, 0x54F1, 0x9DD3, 0x9DD3, 0x25A2, 0x9DD4, 0x9DD6, 0x54FF,

+    0x9DD7, 0x9DD7, 0x20AE, 0x9DD8, 0x9DD8, 0x5502, 0x9DD9, 0x9DD9, 0x258B,

+    0x9DDA, 0x9DDA, 0x25A3, 0x9DDB, 0x9DE4, 0x5503, 0x9DE5, 0x9DE5, 0x2589,

+    0x9DE6, 0x9DE6, 0x25A5, 0x9DE7, 0x9DEE, 0x550D, 0x9DEF, 0x9DEF, 0x25A4,

+    0x9DF0, 0x9DF1, 0x5515, 0x9DF2, 0x9DF2, 0x25A6, 0x9DF3, 0x9DF3, 0x2593,

+    0x9DF4, 0x9DF7, 0x5517, 0x9DF8, 0x9DF8, 0x25A7, 0x9DF9, 0x9DF9, 0x2222,

+    0x9DFA, 0x9DFA, 0x25A9, 0x9DFB, 0x9DFF, 0x551B, 0x9E00, 0x9E0B, 0x5520,

+    0x9E0C, 0x9E0C, 0x25A8, 0x9E0D, 0x9E14, 0x552C, 0x9E15, 0x9E15, 0x2586,

+    0x9E16, 0x9E19, 0x5534, 0x9E1A, 0x9E1A, 0x25A1, 0x9E1B, 0x9E1B, 0x25AA,

+    0x9E1C, 0x9E1C, 0x5538, 0x9E1D, 0x9E1D, 0x2590, 0x9E1E, 0x9E1E, 0x258E,

+    0x9E1F, 0x9E1F, 0x0B54, 0x9E20, 0x9E20, 0x1B35, 0x9E21, 0x9E21, 0x0819,

+    0x9E22, 0x9E22, 0x1B36, 0x9E23, 0x9E23, 0x0AFE, 0x9E24, 0x9E24, 0x5539,

+    0x9E25, 0x9E25, 0x0B79, 0x9E26, 0x9E26, 0x0FE4, 0x9E27, 0x9E27, 0x553A,

+    0x9E28, 0x9E2C, 0x1B37, 0x9E2D, 0x9E2D, 0x0FE5, 0x9E2E, 0x9E2E, 0x553B,

+    0x9E2F, 0x9E2F, 0x1015, 0x9E30, 0x9E30, 0x553C, 0x9E31, 0x9E31, 0x1B3D,

+    0x9E32, 0x9E32, 0x1B3C, 0x9E33, 0x9E33, 0x10EA, 0x9E34, 0x9E34, 0x553D,

+    0x9E35, 0x9E35, 0x0E83, 0x9E36, 0x9E36, 0x1B3E, 0x9E37, 0x9E37, 0x1B40,

+    0x9E38, 0x9E38, 0x1B3F, 0x9E39, 0x9E3A, 0x1B41, 0x9E3B, 0x9E3C, 0x553E,

+    0x9E3D, 0x9E3D, 0x06E6, 0x9E3E, 0x9E3E, 0x1B43, 0x9E3F, 0x9E3F, 0x079F,

+    0x9E40, 0x9E40, 0x5540, 0x9E41, 0x9E42, 0x1B44, 0x9E43, 0x9E43, 0x0918,

+    0x9E44, 0x9E44, 0x1B46, 0x9E45, 0x9E45, 0x062B, 0x9E46, 0x9E49, 0x1B47,

+    0x9E4A, 0x9E4A, 0x0C90, 0x9E4B, 0x9E4C, 0x1B4B, 0x9E4D, 0x9E4D, 0x5541,

+    0x9E4E, 0x9E4E, 0x1B4D, 0x9E4F, 0x9E4F, 0x0BB5, 0x9E50, 0x9E50, 0x5542,

+    0x9E51, 0x9E51, 0x1B4E, 0x9E52, 0x9E54, 0x5543, 0x9E55, 0x9E55, 0x1B4F,

+    0x9E56, 0x9E56, 0x5546, 0x9E57, 0x9E57, 0x1B50, 0x9E58, 0x9E58, 0x1DD5,

+    0x9E59, 0x9E59, 0x5547, 0x9E5A, 0x9E5C, 0x1B51, 0x9E5D, 0x9E5D, 0x5548,

+    0x9E5E, 0x9E5E, 0x1B54, 0x9E5F, 0x9E62, 0x5549, 0x9E63, 0x9E63, 0x1B55,

+    0x9E64, 0x9E64, 0x078E, 0x9E65, 0x9E65, 0x554D, 0x9E66, 0x9E6C, 0x1B56,

+    0x9E6D, 0x9E6D, 0x1B5E, 0x9E6E, 0x9E6F, 0x554E, 0x9E70, 0x9E70, 0x108A,

+    0x9E71, 0x9E71, 0x1B5D, 0x9E72, 0x9E72, 0x5550, 0x9E73, 0x9E73, 0x1B5F,

+    0x9E74, 0x9E74, 0x5551, 0x9E75, 0x9E75, 0x2688, 0x9E76, 0x9E78, 0x5552,

+    0x9E79, 0x9E79, 0x269E, 0x9E7A, 0x9E7A, 0x25FB, 0x9E7B, 0x9E7B, 0x5555,

+    0x9E7C, 0x9E7C, 0x1F8C, 0x9E7D, 0x9E7D, 0x21F4, 0x9E7E, 0x9E7E, 0x1D16,

+    0x9E7F, 0x9E7F, 0x0A60, 0x9E80, 0x9E81, 0x5556, 0x9E82, 0x9E82, 0x1DFC,

+    0x9E83, 0x9E86, 0x5558, 0x9E87, 0x9E88, 0x1DFD, 0x9E89, 0x9E8A, 0x555C,

+    0x9E8B, 0x9E8B, 0x1DFF, 0x9E8C, 0x9E91, 0x555E, 0x9E92, 0x9E92, 0x1E00,

+    0x9E93, 0x9E93, 0x0A5B, 0x9E94, 0x9E96, 0x5564, 0x9E97, 0x9E97, 0x200F,

+    0x9E98, 0x9E9C, 0x5567, 0x9E9D, 0x9E9D, 0x1E02, 0x9E9E, 0x9E9E, 0x556C,

+    0x9E9F, 0x9E9F, 0x1E03, 0x9EA0, 0x9EA4, 0x556D, 0x9EA5, 0x9EA5, 0x2071,

+    0x9EA6, 0x9EA6, 0x0A9A, 0x9EA7, 0x9EA8, 0x5572, 0x9EA9, 0x9EA9, 0x25F7,

+    0x9EAA, 0x9EAE, 0x5574, 0x9EAF, 0x9EAF, 0x2696, 0x9EB0, 0x9EB3, 0x5579,

+    0x9EB4, 0x9EB4, 0x1CEE, 0x9EB5, 0x9EB5, 0x268F, 0x9EB6, 0x9EB7, 0x557D,

+    0x9EB8, 0x9EB8, 0x1CED, 0x9EB9, 0x9EBA, 0x557F, 0x9EBB, 0x9EBB, 0x0A90,

+    0x9EBC, 0x9EBC, 0x5581, 0x9EBD, 0x9EBE, 0x1DF9, 0x9EBF, 0x9EC3, 0x5582,

+    0x9EC4, 0x9EC4, 0x07DB, 0x9EC5, 0x9EC8, 0x5587, 0x9EC9, 0x9EC9, 0x12F8,

+    0x9ECA, 0x9ECB, 0x558B, 0x9ECC, 0x9ECC, 0x22DA, 0x9ECD, 0x9ECD, 0x0D89,

+    0x9ECE, 0x9ECE, 0x09D3, 0x9ECF, 0x9ECF, 0x1B2A, 0x9ED0, 0x9ED0, 0x558D,

+    0x9ED1, 0x9ED1, 0x0791, 0x9ED2, 0x9ED3, 0x558E, 0x9ED4, 0x9ED4, 0x0C2A,

+    0x9ED5, 0x9ED7, 0x5590, 0x9ED8, 0x9ED8, 0x0B0F, 0x9ED9, 0x9EDA, 0x5593,

+    0x9EDB, 0x9EDD, 0x1E04, 0x9EDE, 0x9EDE, 0x1EC1, 0x9EDF, 0x9EDF, 0x1E08,

+    0x9EE0, 0x9EE0, 0x1E07, 0x9EE1, 0x9EE1, 0x5595, 0x9EE2, 0x9EE2, 0x1E09,

+    0x9EE3, 0x9EE4, 0x5596, 0x9EE5, 0x9EE5, 0x1E0C, 0x9EE6, 0x9EE6, 0x5598,

+    0x9EE7, 0x9EE7, 0x1E0B, 0x9EE8, 0x9EE8, 0x1EB3, 0x9EE9, 0x9EE9, 0x1E0A,

+    0x9EEA, 0x9EEA, 0x1E0D, 0x9EEB, 0x9EEE, 0x5599, 0x9EEF, 0x9EEF, 0x1E0E,

+    0x9EF0, 0x9EF1, 0x559D, 0x9EF2, 0x9EF2, 0x266A, 0x9EF3, 0x9EF3, 0x559F,

+    0x9EF4, 0x9EF4, 0x268A, 0x9EF5, 0x9EF6, 0x55A0, 0x9EF7, 0x9EF7, 0x2669,

+    0x9EF8, 0x9EF8, 0x55A2, 0x9EF9, 0x9EF9, 0x1A55, 0x9EFA, 0x9EFA, 0x55A3,

+    0x9EFB, 0x9EFC, 0x1A56, 0x9EFD, 0x9EFD, 0x2618, 0x9EFE, 0x9EFE, 0x1D76,

+    0x9EFF, 0x9EFF, 0x2619, 0x9F00, 0x9F08, 0x55A4, 0x9F09, 0x9F09, 0x261A,

+    0x9F0A, 0x9F0A, 0x55AD, 0x9F0B, 0x9F0B, 0x1D77, 0x9F0C, 0x9F0C, 0x55AE,

+    0x9F0D, 0x9F0D, 0x1D78, 0x9F0E, 0x9F0E, 0x05E5, 0x9F0F, 0x9F0F, 0x55AF,

+    0x9F10, 0x9F10, 0x1274, 0x9F11, 0x9F12, 0x55B0, 0x9F13, 0x9F13, 0x071D,

+    0x9F14, 0x9F14, 0x55B2, 0x9F15, 0x9F15, 0x2673, 0x9F16, 0x9F16, 0x55B3,

+    0x9F17, 0x9F17, 0x1271, 0x9F18, 0x9F18, 0x55B4, 0x9F19, 0x9F19, 0x13DF,

+    0x9F1A, 0x9F1F, 0x55B5, 0x9F20, 0x9F20, 0x0D8A, 0x9F21, 0x9F21, 0x55BB,

+    0x9F22, 0x9F22, 0x1E0F, 0x9F23, 0x9F2B, 0x55BC, 0x9F2C, 0x9F2C, 0x1E10,

+    0x9F2D, 0x9F2E, 0x55C5, 0x9F2F, 0x9F2F, 0x1E11, 0x9F30, 0x9F36, 0x55C7,

+    0x9F37, 0x9F37, 0x1E13, 0x9F38, 0x9F38, 0x55CE, 0x9F39, 0x9F39, 0x1E12,

+    0x9F3A, 0x9F3A, 0x55CF, 0x9F3B, 0x9F3B, 0x0430, 0x9F3C, 0x9F3C, 0x55D0,

+    0x9F3D, 0x9F3E, 0x1E14, 0x9F3F, 0x9F43, 0x55D1, 0x9F44, 0x9F44, 0x1E16,

+    0x9F45, 0x9F49, 0x55D6, 0x9F4A, 0x9F4A, 0x20C6, 0x9F4B, 0x9F4B, 0x226B,

+    0x9F4C, 0x9F4E, 0x55DB, 0x9F4F, 0x9F4F, 0x24D3, 0x9F50, 0x9F50, 0x0C0A,

+    0x9F51, 0x9F51, 0x19C2, 0x9F52, 0x9F52, 0x1E86, 0x9F53, 0x9F53, 0x55DE,

+    0x9F54, 0x9F54, 0x260F, 0x9F55, 0x9F58, 0x55DF, 0x9F59, 0x9F59, 0x2611,

+    0x9F5A, 0x9F5B, 0x55E3, 0x9F5C, 0x9F5C, 0x2613, 0x9F5D, 0x9F5E, 0x55E5,

+    0x9F5F, 0x9F5F, 0x2610, 0x9F60, 0x9F60, 0x2612, 0x9F61, 0x9F61, 0x2030,

+    0x9F62, 0x9F62, 0x55E7, 0x9F63, 0x9F63, 0x2671, 0x9F64, 0x9F65, 0x55E8,

+    0x9F66, 0x9F66, 0x2614, 0x9F67, 0x9F69, 0x55EA, 0x9F6A, 0x9F6A, 0x2616,

+    0x9F6B, 0x9F6B, 0x55ED, 0x9F6C, 0x9F6C, 0x2615, 0x9F6D, 0x9F71, 0x55EE,

+    0x9F72, 0x9F72, 0x20F2, 0x9F73, 0x9F76, 0x55F3, 0x9F77, 0x9F77, 0x2617,

+    0x9F78, 0x9F7E, 0x55F7, 0x9F7F, 0x9F7F, 0x0502, 0x9F80, 0x9F80, 0x1D6D,

+    0x9F81, 0x9F82, 0x55FE, 0x9F83, 0x9F83, 0x1D6E, 0x9F84, 0x9F84, 0x0A2D,

+    0x9F85, 0x9F8A, 0x1D6F, 0x9F8B, 0x9F8B, 0x0C7E, 0x9F8C, 0x9F8C, 0x1D75,

+    0x9F8D, 0x9F8D, 0x2037, 0x9F8E, 0x9F8F, 0x5600, 0x9F90, 0x9F90, 0x20B3,

+    0x9F91, 0x9F93, 0x5602, 0x9F94, 0x9F94, 0x1F22, 0x9F95, 0x9F95, 0x24ED,

+    0x9F96, 0x9F98, 0x5605, 0x9F99, 0x9F99, 0x0A43, 0x9F9A, 0x9F9A, 0x0701,

+    0x9F9B, 0x9F9B, 0x1A54, 0x9F9C, 0x9F9C, 0x1F34, 0x9F9D, 0x9F9E, 0x5608,

+    0x9F9F, 0x9F9F, 0x0743, 0x9FA0, 0x9FA0, 0x12F3, 0x9FA1, 0x9FA5, 0x560A,

+    0xE816, 0xE818, 0x5620, 0xE81E, 0xE81E, 0x5628, 0xE826, 0xE826, 0x5630,

+    0xE82B, 0xE82C, 0x5635, 0xE831, 0xE832, 0x563B, 0xE83B, 0xE83B, 0x5645,

+    0xE843, 0xE843, 0x564D, 0xE854, 0xE855, 0x565E, 0xE864, 0xE864, 0x566E,

+    0xF92C, 0xF92C, 0x560F, 0xFA0D, 0xFA0F, 0x5610, 0xFA11, 0xFA11, 0x5613,

+    0xFA13, 0xFA14, 0x5614, 0xFA18, 0xFA18, 0x5616, 0xFA1F, 0xFA21, 0x5617,

+    0xFA23, 0xFA24, 0x561A, 0xFA27, 0xFA29, 0x561C, 0xFE30, 0xFE30, 0x271D,

+    0xFE49, 0xFE52, 0x272B, 0xFE54, 0xFE57, 0x2735, 0xFE59, 0xFE66, 0x2739,

+    0xFE68, 0xFE6B, 0x2747, 0xFF01, 0xFF03, 0x0106, 0xFF04, 0xFF04, 0x00A6,

+    0xFF05, 0xFF5D, 0x010A, 0xFF5E, 0xFF5E, 0x006A, 0xFFE0, 0xFFE1, 0x00A8,

+    0xFFE2, 0xFFE2, 0x271E, 0xFFE3, 0xFFE3, 0x0163, 0xFFE4, 0xFFE4, 0x271F,

+    0xFFE5, 0xFFE5, 0x0109,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-V_4.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-V_4.cpp
new file mode 100644
index 0000000..9891a69
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-V_4.cpp
@@ -0,0 +1,16 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniGB_UCS2_V_4[24 * 3] = {
+    0x2014, 0x2014, 0x0256, 0x2026, 0x2026, 0x0257, 0x2225, 0x2225, 0x1E1C,
+    0x3001, 0x3001, 0x023F, 0x3002, 0x3002, 0x023E, 0x3008, 0x300F, 0x0248,
+    0x3010, 0x3011, 0x0252, 0x3013, 0x3013, 0x1E1A, 0x3014, 0x3015, 0x0246,
+    0x3016, 0x3017, 0x0250, 0xFF01, 0xFF01, 0x0242, 0xFF08, 0xFF09, 0x0244,
+    0xFF0C, 0xFF0C, 0x023D, 0xFF0E, 0xFF0E, 0x1E1B, 0xFF1A, 0xFF1B, 0x0240,
+    0xFF1D, 0xFF1D, 0x1E1C, 0xFF1F, 0xFF1F, 0x0243, 0xFF3B, 0xFF3B, 0x1E1D,
+    0xFF3D, 0xFF3D, 0x1E1E, 0xFF3F, 0xFF3F, 0x0258, 0xFF5B, 0xFF5B, 0x0254,
+    0xFF5D, 0xFF5D, 0x0255, 0xFF5E, 0xFF5E, 0x1E18, 0xFFE3, 0xFFE3, 0x1E1F,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/cmaps_gb1.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/cmaps_gb1.cpp
new file mode 100644
index 0000000..b0739b1
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/cmaps_gb1.cpp
@@ -0,0 +1,48 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../../include/fpdfapi/fpdf_resource.h"
+#include "../../../../include/fpdfapi/fpdf_module.h"
+#include "../../fpdf_font/font_int.h"
+#include "../cmap_int.h"
+extern const FX_WORD g_FXCMAP_GB_EUC_H_0[];
+extern const FX_WORD g_FXCMAP_GB_EUC_V_0[];
+extern const FX_WORD g_FXCMAP_GBpc_EUC_H_0[];
+extern const FX_WORD g_FXCMAP_GBpc_EUC_V_0[];
+extern const FX_WORD g_FXCMAP_GBK_EUC_H_2[];
+extern const FX_WORD g_FXCMAP_GBK_EUC_V_2[];
+extern const FX_WORD g_FXCMAP_GBKp_EUC_H_2[];
+extern const FX_WORD g_FXCMAP_GBKp_EUC_V_2[];
+extern const FX_WORD g_FXCMAP_GBK2K_H_5[];
+extern const FX_WORD g_FXCMAP_GBK2K_H_5_DWord[];
+extern const FX_WORD g_FXCMAP_GBK2K_V_5[];
+extern const FX_WORD g_FXCMAP_UniGB_UCS2_H_4[];
+extern const FX_WORD g_FXCMAP_UniGB_UCS2_V_4[];
+extern const FX_WORD g_FXCMAP_GB1CID2Unicode_5[];
+static const FXCMAP_CMap g_FXCMAP_GB1_cmaps[] = {
+    { "GB-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_GB_EUC_H_0, 90, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "GB-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_GB_EUC_V_0, 20, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "GBpc-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_GBpc_EUC_H_0, 91, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "GBpc-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_GBpc_EUC_V_0, 20, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "GBK-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_GBK_EUC_H_2, 4071, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "GBK-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_GBK_EUC_V_2, 20, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "GBKp-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_GBKp_EUC_H_2, 4070, FXCMAP_CMap::None, NULL, 0, -2 },
+    { "GBKp-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_GBKp_EUC_V_2, 20, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "GBK2K-H", FXCMAP_CMap::Range, g_FXCMAP_GBK2K_H_5, 4071, FXCMAP_CMap::Single, g_FXCMAP_GBK2K_H_5_DWord, 1017, -4 },
+    { "GBK2K-V", FXCMAP_CMap::Range, g_FXCMAP_GBK2K_V_5, 41, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "UniGB-UCS2-H", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_H_4, 13825, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "UniGB-UCS2-V", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_V_4, 24, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "UniGB-UTF16-H", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_H_4, 13825, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "UniGB-UTF16-V", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_V_4, 24, FXCMAP_CMap::None, NULL, 0, -1 },
+};
+void CPDF_ModuleMgr::LoadEmbeddedGB1CMaps()
+{
+    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+    pFontGlobals->m_EmbeddedCharsets[CIDSET_GB1].m_pMapList = g_FXCMAP_GB1_cmaps;
+    pFontGlobals->m_EmbeddedCharsets[CIDSET_GB1].m_Count = sizeof g_FXCMAP_GB1_cmaps / sizeof (FXCMAP_CMap);
+    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_GB1].m_pMap = g_FXCMAP_GB1CID2Unicode_5;
+    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_GB1].m_Count = 30284;
+}
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp
new file mode 100644
index 0000000..9399e63
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp
@@ -0,0 +1,82 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_83pv_RKSJ_H_1[222 * 3] = {

+    0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x0061, 0x00A0, 0x00DF, 0x0146,

+    0x00FD, 0x00FD, 0x0098, 0x00FE, 0x00FE, 0x00E4, 0x00FF, 0x00FF, 0x007C,

+    0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,

+    0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,

+    0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,

+    0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,

+    0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,

+    0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,

+    0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,

+    0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,

+    0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,

+    0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,

+    0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,

+    0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,

+    0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,

+    0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,

+    0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,

+    0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,

+    0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8540, 0x857E, 0x00E8,

+    0x8580, 0x8580, 0x0186, 0x8581, 0x859E, 0x0128, 0x859F, 0x85DD, 0x0147,

+    0x85DE, 0x85FC, 0x0187, 0x8640, 0x867E, 0x01A6, 0x8680, 0x8691, 0x01E5,

+    0x8692, 0x8692, 0x0127, 0x8693, 0x869E, 0x01F7, 0x86A2, 0x86ED, 0x1D37,

+    0x8740, 0x875D, 0x1D83, 0x875F, 0x8775, 0x1DA1, 0x8780, 0x878F, 0x1DB8,

+    0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9, 0x8792, 0x8792, 0x0301,

+    0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300, 0x879B, 0x879C, 0x1DCF,

+    0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3, 0x8980, 0x89FC, 0x0502,

+    0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE, 0x8B40, 0x8B7E, 0x063B,

+    0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7, 0x8C80, 0x8CFC, 0x0736,

+    0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2, 0x8E40, 0x8E7E, 0x086F,

+    0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B, 0x8F80, 0x8FFC, 0x096A,

+    0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26, 0x9140, 0x917E, 0x0AA3,

+    0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F, 0x9280, 0x92FC, 0x0B9E,

+    0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A, 0x9440, 0x947E, 0x0CD7,

+    0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93, 0x9580, 0x95FC, 0x0DD2,

+    0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E, 0x9740, 0x977E, 0x0F0B,

+    0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7, 0x989F, 0x98FC, 0x0FFA,

+    0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A7E, 0x1114,

+    0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0, 0x9B80, 0x9BFC, 0x120F,

+    0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB, 0x9D40, 0x9D7E, 0x1348,

+    0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404, 0x9E80, 0x9EFC, 0x1443,

+    0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF, 0xE040, 0xE07E, 0x157C,

+    0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638, 0xE180, 0xE1FC, 0x1677,

+    0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733, 0xE340, 0xE37E, 0x17B0,

+    0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C, 0xE480, 0xE4FC, 0x18AB,

+    0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967, 0xE640, 0xE67E, 0x19E4,

+    0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0, 0xE780, 0xE7FC, 0x1ADF,

+    0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B, 0xE940, 0xE97E, 0x1C18,

+    0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4, 0xEA80, 0xEAA2, 0x1D13,

+    0xEAA3, 0xEAA4, 0x205C, 0xEB40, 0xEB40, 0x0279, 0xEB41, 0xEB42, 0x1ECF,

+    0xEB43, 0xEB4F, 0x027C, 0xEB50, 0xEB51, 0x1ED1, 0xEB52, 0xEB5A, 0x028B,

+    0xEB5B, 0xEB5D, 0x1ED3, 0xEB5E, 0xEB5F, 0x0297, 0xEB60, 0xEB64, 0x1ED6,

+    0xEB65, 0xEB68, 0x029E, 0xEB69, 0xEB7A, 0x1EDB, 0xEB7B, 0xEB7E, 0x02B4,

+    0xEB80, 0xEB80, 0x02B8, 0xEB81, 0xEB81, 0x1EED, 0xEB82, 0xEBAC, 0x02BA,

+    0xEBB8, 0xEBBF, 0x02E5, 0xEBC8, 0xEBCE, 0x02ED, 0xEBDA, 0xEBE8, 0x02F4,

+    0xEBF0, 0xEBF7, 0x0303, 0xEBFC, 0xEBFC, 0x030B, 0xEC4F, 0xEC58, 0x030C,

+    0xEC60, 0xEC79, 0x0316, 0xEC81, 0xEC9A, 0x0330, 0xEC9F, 0xEC9F, 0x1EEE,

+    0xECA0, 0xECA0, 0x034B, 0xECA1, 0xECA1, 0x1EEF, 0xECA2, 0xECA2, 0x034D,

+    0xECA3, 0xECA3, 0x1EF0, 0xECA4, 0xECA4, 0x034F, 0xECA5, 0xECA5, 0x1EF1,

+    0xECA6, 0xECA6, 0x0351, 0xECA7, 0xECA7, 0x1EF2, 0xECA8, 0xECC0, 0x0353,

+    0xECC1, 0xECC1, 0x1EF3, 0xECC2, 0xECE0, 0x036D, 0xECE1, 0xECE1, 0x1EF4,

+    0xECE2, 0xECE2, 0x038D, 0xECE3, 0xECE3, 0x1EF5, 0xECE4, 0xECE4, 0x038F,

+    0xECE5, 0xECE5, 0x1EF6, 0xECE6, 0xECEB, 0x0391, 0xECEC, 0xECEC, 0x1EF7,

+    0xECED, 0xECF1, 0x0398, 0xED40, 0xED40, 0x1EF8, 0xED41, 0xED41, 0x039E,

+    0xED42, 0xED42, 0x1EF9, 0xED43, 0xED43, 0x03A0, 0xED44, 0xED44, 0x1EFA,

+    0xED45, 0xED45, 0x03A2, 0xED46, 0xED46, 0x1EFB, 0xED47, 0xED47, 0x03A4,

+    0xED48, 0xED48, 0x1EFC, 0xED49, 0xED61, 0x03A6, 0xED62, 0xED62, 0x1EFD,

+    0xED63, 0xED7E, 0x03C0, 0xED80, 0xED82, 0x03DC, 0xED83, 0xED83, 0x1EFE,

+    0xED84, 0xED84, 0x03E0, 0xED85, 0xED85, 0x1EFF, 0xED86, 0xED86, 0x03E2,

+    0xED87, 0xED87, 0x1F00, 0xED88, 0xED8D, 0x03E4, 0xED8E, 0xED8E, 0x1F01,

+    0xED8F, 0xED94, 0x03EB, 0xED95, 0xED96, 0x1F02, 0xED9F, 0xEDB6, 0x03F3,

+    0xEDBF, 0xEDD6, 0x040B, 0xEE40, 0xEE5D, 0x1D83, 0xEE5F, 0xEE6E, 0x1F04,

+    0xEE6F, 0xEE75, 0x1DB1, 0xEE80, 0xEE81, 0x1F14, 0xEE82, 0xEE8F, 0x1DBA,

+    0xEE90, 0xEE90, 0x02FA, 0xEE91, 0xEE91, 0x02F9, 0xEE92, 0xEE92, 0x0301,

+    0xEE93, 0xEE99, 0x1DC8, 0xEE9A, 0xEE9A, 0x0300, 0xEE9B, 0xEE9C, 0x1DCF,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp
new file mode 100644
index 0000000..f41ca62
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp
@@ -0,0 +1,65 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_90ms_RKSJ_H_2[171 * 3] = {

+    0x0020, 0x007D, 0x00E7, 0x007E, 0x007E, 0x0277, 0x00A0, 0x00DF, 0x0146,

+    0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,

+    0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,

+    0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,

+    0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,

+    0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,

+    0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,

+    0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,

+    0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,

+    0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,

+    0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,

+    0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,

+    0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,

+    0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,

+    0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,

+    0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,

+    0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,

+    0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8740, 0x875D, 0x1D83,

+    0x875F, 0x8760, 0x1DA1, 0x8761, 0x8761, 0x1F66, 0x8762, 0x8762, 0x1DA4,

+    0x8763, 0x8763, 0x1F68, 0x8764, 0x8764, 0x1DA6, 0x8765, 0x8765, 0x1F6A,

+    0x8766, 0x8767, 0x1DA8, 0x8768, 0x8768, 0x1F6C, 0x8769, 0x876A, 0x1DAB,

+    0x876B, 0x876B, 0x1F6B, 0x876C, 0x876D, 0x1DAE, 0x876E, 0x876E, 0x1F6F,

+    0x876F, 0x8775, 0x1DB1, 0x877E, 0x877E, 0x2083, 0x8780, 0x8783, 0x1DB8,

+    0x8784, 0x8784, 0x1F77, 0x8785, 0x878F, 0x1DBD, 0x8790, 0x8790, 0x02FA,

+    0x8791, 0x8791, 0x02F9, 0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8,

+    0x879A, 0x879A, 0x0300, 0x879B, 0x879C, 0x1DCF, 0x889F, 0x88FC, 0x0465,

+    0x8940, 0x897E, 0x04C3, 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F,

+    0x8A80, 0x8AFC, 0x05BE, 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A,

+    0x8C40, 0x8C7E, 0x06F7, 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3,

+    0x8D80, 0x8DFC, 0x07F2, 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE,

+    0x8F40, 0x8F7E, 0x092B, 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7,

+    0x9080, 0x90FC, 0x0A26, 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2,

+    0x9240, 0x927E, 0x0B5F, 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B,

+    0x9380, 0x93FC, 0x0C5A, 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16,

+    0x9540, 0x957E, 0x0D93, 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F,

+    0x9680, 0x96FC, 0x0E8E, 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A,

+    0x9840, 0x9872, 0x0FC7, 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058,

+    0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153,

+    0x9B40, 0x9B7E, 0x11D0, 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C,

+    0x9C80, 0x9CFC, 0x12CB, 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387,

+    0x9E40, 0x9E7E, 0x1404, 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0,

+    0x9F80, 0x9FFC, 0x14FF, 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB,

+    0xE140, 0xE17E, 0x1638, 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4,

+    0xE280, 0xE2FC, 0x1733, 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF,

+    0xE440, 0xE47E, 0x186C, 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928,

+    0xE580, 0xE5FC, 0x1967, 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23,

+    0xE740, 0xE77E, 0x1AA0, 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C,

+    0xE880, 0xE8FC, 0x1B9B, 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57,

+    0xEA40, 0xEA7E, 0x1CD4, 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C,

+    0xED40, 0xED7E, 0x20A7, 0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9,

+    0xEDB5, 0xEDFC, 0x211A, 0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1,

+    0xEEEF, 0xEEF8, 0x1F9C, 0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45,

+    0xFA40, 0xFA49, 0x1F9C, 0xFA4A, 0xFA53, 0x1D97, 0xFA54, 0xFA54, 0x02EF,

+    0xFA55, 0xFA57, 0x1F45, 0xFA58, 0xFA58, 0x1DC2, 0xFA59, 0xFA59, 0x1DBA,

+    0xFA5A, 0xFA5A, 0x1F77, 0xFA5B, 0xFA5B, 0x0300, 0xFA5C, 0xFA7E, 0x20A7,

+    0xFA80, 0xFACF, 0x20CA, 0xFAD0, 0xFAD0, 0x07C9, 0xFAD1, 0xFAFC, 0x211A,

+    0xFB40, 0xFB7E, 0x2146, 0xFB80, 0xFBFC, 0x2185, 0xFC40, 0xFC4B, 0x2202,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-V_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-V_2.cpp
new file mode 100644
index 0000000..caf81ed
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-V_2.cpp
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_90ms_RKSJ_V_2[78 * 3] = {
+    0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,
+    0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6,
+    0x8169, 0x817A, 0x1EDB, 0x8181, 0x8181, 0x1EED, 0x81A8, 0x81A8, 0x02E3,
+    0x81A9, 0x81A9, 0x02E2, 0x81AA, 0x81AB, 0x02E0, 0x81AC, 0x81AC, 0x204E,
+    0x829F, 0x829F, 0x1EEE, 0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0,
+    0x82A5, 0x82A5, 0x1EF1, 0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3,
+    0x82E1, 0x82E1, 0x1EF4, 0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6,
+    0x82EC, 0x82EC, 0x1EF7, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9,
+    0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC,
+    0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF,
+    0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02,
+    0x849F, 0x849F, 0x1D39, 0x84A0, 0x84A0, 0x1D37, 0x84A1, 0x84A1, 0x1D47,
+    0x84A2, 0x84A2, 0x1D4F, 0x84A3, 0x84A3, 0x1D4B, 0x84A4, 0x84A4, 0x1D43,
+    0x84A5, 0x84A5, 0x1D63, 0x84A6, 0x84A6, 0x1D5B, 0x84A7, 0x84A7, 0x1D6B,
+    0x84A8, 0x84A8, 0x1D53, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D3A,
+    0x84AB, 0x84AB, 0x1D38, 0x84AC, 0x84AC, 0x1D4A, 0x84AD, 0x84AD, 0x1D52,
+    0x84AE, 0x84AE, 0x1D4E, 0x84AF, 0x84AF, 0x1D46, 0x84B0, 0x84B0, 0x1D6A,
+    0x84B1, 0x84B1, 0x1D62, 0x84B2, 0x84B2, 0x1D72, 0x84B3, 0x84B3, 0x1D5A,
+    0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D66, 0x84B6, 0x84B6, 0x1D5F,
+    0x84B7, 0x84B7, 0x1D6E, 0x84B8, 0x84B8, 0x1D57, 0x84B9, 0x84B9, 0x1D79,
+    0x84BA, 0x84BA, 0x1D67, 0x84BB, 0x84BB, 0x1D5C, 0x84BC, 0x84BC, 0x1D6F,
+    0x84BD, 0x84BD, 0x1D54, 0x84BE, 0x84BE, 0x1D76, 0x875F, 0x8760, 0x1F04,
+    0x8761, 0x8761, 0x2089, 0x8762, 0x8762, 0x1F07, 0x8763, 0x8763, 0x2093,
+    0x8764, 0x8764, 0x1F09, 0x8765, 0x8765, 0x2092, 0x8766, 0x8767, 0x1F0B,
+    0x8768, 0x8768, 0x2098, 0x8769, 0x876A, 0x1F0E, 0x876B, 0x876B, 0x209C,
+    0x876C, 0x876D, 0x1F11, 0x876E, 0x876E, 0x209D, 0x8780, 0x8781, 0x1F14,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp
new file mode 100644
index 0000000..d0d8c2d
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp
@@ -0,0 +1,65 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_90msp_RKSJ_H_2[170 * 3] = {

+    0x0020, 0x007E, 0x0001, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,

+    0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, 0x81C8, 0x81CE, 0x02ED,

+    0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, 0x81FC, 0x81FC, 0x030B,

+    0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,

+    0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, 0x8380, 0x8396, 0x03DC,

+    0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, 0x8440, 0x8460, 0x0423,

+    0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, 0x849F, 0x849F, 0x1D37,

+    0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43, 0x84A2, 0x84A2, 0x1D47,

+    0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B, 0x84A5, 0x84A5, 0x1D53,

+    0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B, 0x84A8, 0x84A8, 0x1D6B,

+    0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38, 0x84AB, 0x84AB, 0x1D3A,

+    0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A, 0x84AE, 0x84AE, 0x1D52,

+    0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A, 0x84B1, 0x84B1, 0x1D6A,

+    0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72, 0x84B4, 0x84B4, 0x1D82,

+    0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66, 0x84B7, 0x84B7, 0x1D5F,

+    0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76, 0x84BA, 0x84BA, 0x1D54,

+    0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C, 0x84BD, 0x84BD, 0x1D6F,

+    0x84BE, 0x84BE, 0x1D79, 0x8740, 0x875D, 0x1D83, 0x875F, 0x8760, 0x1DA1,

+    0x8761, 0x8761, 0x1F66, 0x8762, 0x8762, 0x1DA4, 0x8763, 0x8763, 0x1F68,

+    0x8764, 0x8764, 0x1DA6, 0x8765, 0x8765, 0x1F6A, 0x8766, 0x8767, 0x1DA8,

+    0x8768, 0x8768, 0x1F6C, 0x8769, 0x876A, 0x1DAB, 0x876B, 0x876B, 0x1F6B,

+    0x876C, 0x876D, 0x1DAE, 0x876E, 0x876E, 0x1F6F, 0x876F, 0x8775, 0x1DB1,

+    0x877E, 0x877E, 0x2083, 0x8780, 0x8783, 0x1DB8, 0x8784, 0x8784, 0x1F77,

+    0x8785, 0x878F, 0x1DBD, 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9,

+    0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300,

+    0x879B, 0x879C, 0x1DCF, 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3,

+    0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE,

+    0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7,

+    0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2,

+    0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B,

+    0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26,

+    0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F,

+    0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A,

+    0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93,

+    0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E,

+    0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7,

+    0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097,

+    0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0,

+    0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB,

+    0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404,

+    0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF,

+    0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638,

+    0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733,

+    0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C,

+    0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967,

+    0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0,

+    0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B,

+    0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4,

+    0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, 0xED40, 0xED7E, 0x20A7,

+    0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9, 0xEDB5, 0xEDFC, 0x211A,

+    0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1, 0xEEEF, 0xEEF8, 0x1F9C,

+    0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45, 0xFA40, 0xFA49, 0x1F9C,

+    0xFA4A, 0xFA53, 0x1D97, 0xFA54, 0xFA54, 0x02EF, 0xFA55, 0xFA57, 0x1F45,

+    0xFA58, 0xFA58, 0x1DC2, 0xFA59, 0xFA59, 0x1DBA, 0xFA5A, 0xFA5A, 0x1F77,

+    0xFA5B, 0xFA5B, 0x0300, 0xFA5C, 0xFA7E, 0x20A7, 0xFA80, 0xFACF, 0x20CA,

+    0xFAD0, 0xFAD0, 0x07C9, 0xFAD1, 0xFAFC, 0x211A, 0xFB40, 0xFB7E, 0x2146,

+    0xFB80, 0xFBFC, 0x2185, 0xFC40, 0xFC4B, 0x2202,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-V_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-V_2.cpp
new file mode 100644
index 0000000..f558c6a
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-V_2.cpp
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_90msp_RKSJ_V_2[78 * 3] = {
+    0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,
+    0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6,
+    0x8169, 0x817A, 0x1EDB, 0x8181, 0x8181, 0x1EED, 0x81A8, 0x81A8, 0x02E3,
+    0x81A9, 0x81A9, 0x02E2, 0x81AA, 0x81AB, 0x02E0, 0x81AC, 0x81AC, 0x204E,
+    0x829F, 0x829F, 0x1EEE, 0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0,
+    0x82A5, 0x82A5, 0x1EF1, 0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3,
+    0x82E1, 0x82E1, 0x1EF4, 0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6,
+    0x82EC, 0x82EC, 0x1EF7, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9,
+    0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC,
+    0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF,
+    0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02,
+    0x849F, 0x849F, 0x1D39, 0x84A0, 0x84A0, 0x1D37, 0x84A1, 0x84A1, 0x1D47,
+    0x84A2, 0x84A2, 0x1D4F, 0x84A3, 0x84A3, 0x1D4B, 0x84A4, 0x84A4, 0x1D43,
+    0x84A5, 0x84A5, 0x1D63, 0x84A6, 0x84A6, 0x1D5B, 0x84A7, 0x84A7, 0x1D6B,
+    0x84A8, 0x84A8, 0x1D53, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D3A,
+    0x84AB, 0x84AB, 0x1D38, 0x84AC, 0x84AC, 0x1D4A, 0x84AD, 0x84AD, 0x1D52,
+    0x84AE, 0x84AE, 0x1D4E, 0x84AF, 0x84AF, 0x1D46, 0x84B0, 0x84B0, 0x1D6A,
+    0x84B1, 0x84B1, 0x1D62, 0x84B2, 0x84B2, 0x1D72, 0x84B3, 0x84B3, 0x1D5A,
+    0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D66, 0x84B6, 0x84B6, 0x1D5F,
+    0x84B7, 0x84B7, 0x1D6E, 0x84B8, 0x84B8, 0x1D57, 0x84B9, 0x84B9, 0x1D79,
+    0x84BA, 0x84BA, 0x1D67, 0x84BB, 0x84BB, 0x1D5C, 0x84BC, 0x84BC, 0x1D6F,
+    0x84BD, 0x84BD, 0x1D54, 0x84BE, 0x84BE, 0x1D76, 0x875F, 0x8760, 0x1F04,
+    0x8761, 0x8761, 0x2089, 0x8762, 0x8762, 0x1F07, 0x8763, 0x8763, 0x2093,
+    0x8764, 0x8764, 0x1F09, 0x8765, 0x8765, 0x2092, 0x8766, 0x8767, 0x1F0B,
+    0x8768, 0x8768, 0x2098, 0x8769, 0x876A, 0x1F0E, 0x876B, 0x876B, 0x209C,
+    0x876C, 0x876D, 0x1F11, 0x876E, 0x876E, 0x209D, 0x8780, 0x8781, 0x1F14,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp
new file mode 100644
index 0000000..504d4dc
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp
@@ -0,0 +1,96 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_90pv_RKSJ_H_1[263 * 3] = {

+    0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x0061, 0x00A0, 0x00DF, 0x0146,

+    0x00FD, 0x00FD, 0x0098, 0x00FE, 0x00FE, 0x00E4, 0x00FF, 0x00FF, 0x007C,

+    0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,

+    0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,

+    0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,

+    0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,

+    0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,

+    0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,

+    0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,

+    0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,

+    0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,

+    0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,

+    0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,

+    0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,

+    0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,

+    0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,

+    0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,

+    0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,

+    0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8540, 0x8553, 0x1D83,

+    0x855E, 0x8571, 0x1F87, 0x857C, 0x857E, 0x205E, 0x8580, 0x8585, 0x2061,

+    0x8591, 0x859A, 0x1F7D, 0x859F, 0x85A8, 0x1D97, 0x85A9, 0x85AA, 0x2021,

+    0x85AB, 0x85AD, 0x2067, 0x85B3, 0x85BC, 0x1F9C, 0x85BD, 0x85C1, 0x206A,

+    0x85DB, 0x85F4, 0x1FB0, 0x8640, 0x8640, 0x1DB1, 0x8641, 0x8641, 0x1FFA,

+    0x8642, 0x8642, 0x1DB2, 0x8643, 0x8643, 0x1F54, 0x8644, 0x8644, 0x1F56,

+    0x8645, 0x8645, 0x206F, 0x8646, 0x8646, 0x1DB7, 0x8647, 0x8647, 0x1F57,

+    0x8648, 0x8648, 0x1DB3, 0x8649, 0x8649, 0x1F55, 0x864A, 0x864A, 0x1DB4,

+    0x864B, 0x864B, 0x2070, 0x864C, 0x864D, 0x1DB5, 0x864E, 0x864E, 0x1F65,

+    0x864F, 0x8655, 0x1F58, 0x8656, 0x8656, 0x2071, 0x8657, 0x8657, 0x1F64,

+    0x8658, 0x8659, 0x1F62, 0x865A, 0x865C, 0x1F5F, 0x865D, 0x865D, 0x2072,

+    0x869B, 0x869D, 0x1DBA, 0x869E, 0x869E, 0x2073, 0x869F, 0x869F, 0x1F52,

+    0x86A0, 0x86A1, 0x1F50, 0x86A2, 0x86A2, 0x1F53, 0x86A3, 0x86A3, 0x2013,

+    0x86A4, 0x86A4, 0x2015, 0x86A5, 0x86A5, 0x2014, 0x86A6, 0x86A6, 0x2016,

+    0x86B3, 0x86B3, 0x1F7A, 0x86B4, 0x86B4, 0x1F78, 0x86B5, 0x86B5, 0x2074,

+    0x86C7, 0x86CA, 0x201B, 0x86CB, 0x86CE, 0x2075, 0x86CF, 0x86CF, 0x1F4E,

+    0x86D0, 0x86D0, 0x1F4D, 0x86D1, 0x86D1, 0x1F4C, 0x86D2, 0x86D2, 0x1F4B,

+    0x86D3, 0x86D6, 0x200E, 0x8740, 0x8746, 0x2005, 0x8747, 0x8747, 0x1FD6,

+    0x8748, 0x8748, 0x200C, 0x8749, 0x8749, 0x1FD1, 0x874A, 0x874A, 0x1FCA,

+    0x874B, 0x874B, 0x1DC4, 0x874C, 0x874C, 0x1FD7, 0x874D, 0x874D, 0x1DC2,

+    0x874E, 0x874E, 0x1FD2, 0x874F, 0x874F, 0x1FCD, 0x8750, 0x8750, 0x1DC3,

+    0x8751, 0x8751, 0x1FD5, 0x8752, 0x8752, 0x1FD3, 0x8753, 0x8753, 0x1FCF,

+    0x8754, 0x8754, 0x1FD4, 0x8755, 0x8755, 0x1FD0, 0x8756, 0x8757, 0x1FCB,

+    0x8758, 0x8758, 0x1FCE, 0x8791, 0x8792, 0x207D, 0x8793, 0x8797, 0x1DBD,

+    0x8798, 0x8798, 0x1FDA, 0x8799, 0x8799, 0x1FE5, 0x879A, 0x879A, 0x207F,

+    0x879B, 0x879B, 0x1FDE, 0x879C, 0x879C, 0x1FFF, 0x879D, 0x879D, 0x2080,

+    0x879E, 0x879E, 0x201F, 0x879F, 0x879F, 0x1DA1, 0x87A0, 0x87A0, 0x1F66,

+    0x87A1, 0x87A1, 0x1DA4, 0x87A2, 0x87A2, 0x1DA2, 0x87A3, 0x87A3, 0x1F67,

+    0x87A4, 0x87A4, 0x1FF7, 0x87A5, 0x87A6, 0x2087, 0x87A7, 0x87A7, 0x1F6A,

+    0x87A8, 0x87A8, 0x1DA8, 0x87A9, 0x87AA, 0x1F68, 0x87AB, 0x87AB, 0x1DA6,

+    0x87AC, 0x87AC, 0x1DA9, 0x87AD, 0x87AD, 0x1DAF, 0x87AE, 0x87AE, 0x1F6E,

+    0x87AF, 0x87AF, 0x1F6C, 0x87B0, 0x87B0, 0x1DAB, 0x87B1, 0x87B1, 0x1F6D,

+    0x87B2, 0x87B2, 0x1F6B, 0x87B3, 0x87B3, 0x1DAC, 0x87B4, 0x87B4, 0x1F6F,

+    0x87B5, 0x87B5, 0x1DAE, 0x87BD, 0x87BD, 0x1F70, 0x87BE, 0x87BF, 0x1F73,

+    0x87C0, 0x87C1, 0x1F71, 0x87E5, 0x87E7, 0x1DC5, 0x87E8, 0x87E8, 0x2083,

+    0x87FA, 0x87FA, 0x1F76, 0x87FB, 0x87FC, 0x2081, 0x8840, 0x8840, 0x1DC8,

+    0x8841, 0x8842, 0x1DCD, 0x8854, 0x8855, 0x1DB8, 0x8868, 0x8868, 0x1F16,

+    0x886A, 0x886D, 0x2079, 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3,

+    0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE,

+    0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7,

+    0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2,

+    0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B,

+    0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26,

+    0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F,

+    0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A,

+    0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93,

+    0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E,

+    0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7,

+    0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097,

+    0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0,

+    0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB,

+    0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404,

+    0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF,

+    0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638,

+    0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733,

+    0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C,

+    0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967,

+    0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0,

+    0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B,

+    0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4,

+    0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, 0xEB41, 0xEB42, 0x1ECF,

+    0xEB50, 0xEB51, 0x1ED1, 0xEB5B, 0xEB5D, 0x1ED3, 0xEB60, 0xEB64, 0x1ED6,

+    0xEB69, 0xEB7A, 0x1EDB, 0xEB81, 0xEB81, 0x1EED, 0xEC9F, 0xEC9F, 0x1EEE,

+    0xECA1, 0xECA1, 0x1EEF, 0xECA3, 0xECA3, 0x1EF0, 0xECA5, 0xECA5, 0x1EF1,

+    0xECA7, 0xECA7, 0x1EF2, 0xECC1, 0xECC1, 0x1EF3, 0xECE1, 0xECE1, 0x1EF4,

+    0xECE3, 0xECE3, 0x1EF5, 0xECE5, 0xECE5, 0x1EF6, 0xECEC, 0xECEC, 0x1EF7,

+    0xED40, 0xED40, 0x1EF8, 0xED42, 0xED42, 0x1EF9, 0xED44, 0xED44, 0x1EFA,

+    0xED46, 0xED46, 0x1EFB, 0xED48, 0xED48, 0x1EFC, 0xED62, 0xED62, 0x1EFD,

+    0xED83, 0xED83, 0x1EFE, 0xED85, 0xED85, 0x1EFF, 0xED87, 0xED87, 0x1F00,

+    0xED8E, 0xED8E, 0x1F01, 0xED95, 0xED96, 0x1F02,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp
new file mode 100644
index 0000000..fd580d5
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp
@@ -0,0 +1,220 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_Add_RKSJ_H_1[635 * 3] = {

+    0x0020, 0x007E, 0x00E7, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,

+    0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, 0x81C8, 0x81CE, 0x02ED,

+    0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, 0x81FC, 0x81FC, 0x030B,

+    0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,

+    0x829F, 0x82F1, 0x034A, 0x82F2, 0x82F4, 0x1F16, 0x8340, 0x837E, 0x039D,

+    0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,

+    0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,

+    0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,

+    0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,

+    0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,

+    0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,

+    0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,

+    0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,

+    0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,

+    0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,

+    0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,

+    0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,

+    0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x889F, 0x889F, 0x0465,

+    0x88A0, 0x88A0, 0x1DD1, 0x88A1, 0x88AF, 0x0467, 0x88B0, 0x88B0, 0x1F19,

+    0x88B1, 0x88B8, 0x0477, 0x88B9, 0x88B9, 0x1DD2, 0x88BA, 0x88EB, 0x0480,

+    0x88EC, 0x88EC, 0x1DD3, 0x88ED, 0x88EE, 0x04B3, 0x88EF, 0x88EF, 0x1F1A,

+    0x88F0, 0x88F0, 0x04B6, 0x88F1, 0x88F1, 0x1DD4, 0x88F2, 0x88F9, 0x04B8,

+    0x88FA, 0x88FA, 0x1DD5, 0x88FB, 0x88FC, 0x04C1, 0x8940, 0x8948, 0x04C3,

+    0x8949, 0x8949, 0x1DD6, 0x894A, 0x8951, 0x04CD, 0x8952, 0x8952, 0x1F1B,

+    0x8953, 0x8953, 0x04D6, 0x8954, 0x8954, 0x1DD7, 0x8955, 0x8957, 0x04D8,

+    0x8958, 0x8958, 0x1F1C, 0x8959, 0x895B, 0x04DC, 0x895C, 0x895C, 0x1DDA,

+    0x895D, 0x8960, 0x04E0, 0x8961, 0x8961, 0x1DDB, 0x8962, 0x897E, 0x04E5,

+    0x8980, 0x898A, 0x0502, 0x898B, 0x898B, 0x1DDC, 0x898C, 0x89A5, 0x050E,

+    0x89A6, 0x89A6, 0x1DDD, 0x89A7, 0x89A7, 0x0529, 0x89A8, 0x89A8, 0x1DDE,

+    0x89A9, 0x89DD, 0x052B, 0x89DE, 0x89DE, 0x1DDF, 0x89DF, 0x89E4, 0x0561,

+    0x89E5, 0x89E5, 0x1F1D, 0x89E6, 0x89F7, 0x0568, 0x89F8, 0x89F8, 0x1DE0,

+    0x89F9, 0x89FC, 0x057B, 0x8A40, 0x8A40, 0x057F, 0x8A41, 0x8A41, 0x1DE2,

+    0x8A42, 0x8A7E, 0x0581, 0x8A80, 0x8A8A, 0x05BE, 0x8A8B, 0x8A8B, 0x1DE4,

+    0x8A8C, 0x8A92, 0x05CA, 0x8A93, 0x8A93, 0x1DE5, 0x8A94, 0x8A99, 0x05D2,

+    0x8A9A, 0x8A9A, 0x1DE6, 0x8A9B, 0x8ABF, 0x05D9, 0x8AC0, 0x8AC0, 0x1DE7,

+    0x8AC1, 0x8ACA, 0x05FF, 0x8ACB, 0x8ACB, 0x1DE8, 0x8ACC, 0x8AE2, 0x060A,

+    0x8AE3, 0x8AE3, 0x1DE9, 0x8AE4, 0x8AFC, 0x0622, 0x8B40, 0x8B49, 0x063B,

+    0x8B4A, 0x8B4A, 0x1DEA, 0x8B4B, 0x8B5E, 0x0646, 0x8B5F, 0x8B5F, 0x1DEB,

+    0x8B60, 0x8B7E, 0x065B, 0x8B80, 0x8B81, 0x067A, 0x8B82, 0x8B82, 0x1F1E,

+    0x8B83, 0x8B87, 0x067D, 0x8B88, 0x8B88, 0x1F1F, 0x8B89, 0x8B9F, 0x0683,

+    0x8BA0, 0x8BA0, 0x1DEC, 0x8BA1, 0x8BA7, 0x069B, 0x8BA8, 0x8BA8, 0x1DED,

+    0x8BA9, 0x8BBF, 0x06A3, 0x8BC0, 0x8BC0, 0x1F20, 0x8BC1, 0x8BCC, 0x06BB,

+    0x8BCD, 0x8BCD, 0x1DEE, 0x8BCE, 0x8BEA, 0x06C8, 0x8BEB, 0x8BEB, 0x1DEF,

+    0x8BEC, 0x8BF1, 0x06E6, 0x8BF2, 0x8BF2, 0x1DF0, 0x8BF3, 0x8BF8, 0x06ED,

+    0x8BF9, 0x8BF9, 0x1DF1, 0x8BFA, 0x8BFA, 0x06F4, 0x8BFB, 0x8BFB, 0x1DF2,

+    0x8BFC, 0x8BFC, 0x06F6, 0x8C40, 0x8C55, 0x06F7, 0x8C56, 0x8C56, 0x1DF4,

+    0x8C57, 0x8C70, 0x070E, 0x8C71, 0x8C71, 0x1DF7, 0x8C72, 0x8C7E, 0x0729,

+    0x8C80, 0x8C90, 0x0736, 0x8C91, 0x8C91, 0x1DFA, 0x8C92, 0x8C9C, 0x0748,

+    0x8C9D, 0x8C9D, 0x1F21, 0x8C9E, 0x8C9E, 0x1DFC, 0x8C9F, 0x8CB1, 0x0755,

+    0x8CB2, 0x8CB2, 0x1DFD, 0x8CB3, 0x8CBE, 0x0769, 0x8CBF, 0x8CBF, 0x1DFE,

+    0x8CC0, 0x8CFC, 0x0776, 0x8D40, 0x8D49, 0x07B3, 0x8D4A, 0x8D4A, 0x1DFF,

+    0x8D4B, 0x8D7E, 0x07BE, 0x8D80, 0x8D8C, 0x07F2, 0x8D8D, 0x8D8D, 0x1E02,

+    0x8D8E, 0x8D93, 0x0800, 0x8D94, 0x8D94, 0x1E03, 0x8D95, 0x8D98, 0x0807,

+    0x8D99, 0x8D99, 0x1E04, 0x8D9A, 0x8DD0, 0x080C, 0x8DD1, 0x8DD1, 0x1E05,

+    0x8DD2, 0x8DE4, 0x0844, 0x8DE5, 0x8DE5, 0x1E06, 0x8DE6, 0x8DF1, 0x0858,

+    0x8DF2, 0x8DF2, 0x1E07, 0x8DF3, 0x8DFC, 0x0865, 0x8E40, 0x8E45, 0x086F,

+    0x8E46, 0x8E46, 0x1E08, 0x8E47, 0x8E48, 0x0876, 0x8E49, 0x8E49, 0x1E09,

+    0x8E4A, 0x8E4A, 0x0879, 0x8E4B, 0x8E4B, 0x1E0A, 0x8E4C, 0x8E57, 0x087B,

+    0x8E58, 0x8E58, 0x1E0B, 0x8E59, 0x8E5F, 0x0888, 0x8E60, 0x8E60, 0x1F22,

+    0x8E61, 0x8E7E, 0x0890, 0x8E80, 0x8EC5, 0x08AE, 0x8EC6, 0x8EC6, 0x1E0D,

+    0x8EC7, 0x8EDA, 0x08F5, 0x8EDB, 0x8EDC, 0x1E0F, 0x8EDD, 0x8EFC, 0x090B,

+    0x8F40, 0x8F49, 0x092B, 0x8F4A, 0x8F4A, 0x1E11, 0x8F4B, 0x8F54, 0x0936,

+    0x8F55, 0x8F55, 0x1E12, 0x8F56, 0x8F7E, 0x0941, 0x8F80, 0x8F8B, 0x096A,

+    0x8F8C, 0x8F8C, 0x1E13, 0x8F8D, 0x8F91, 0x0977, 0x8F92, 0x8F93, 0x1E15,

+    0x8F94, 0x8FA2, 0x097E, 0x8FA3, 0x8FA3, 0x1E17, 0x8FA4, 0x8FB0, 0x098E,

+    0x8FB1, 0x8FB1, 0x1E18, 0x8FB2, 0x8FD2, 0x099C, 0x8FD3, 0x8FD3, 0x1E1A,

+    0x8FD4, 0x8FDC, 0x09BE, 0x8FDD, 0x8FDD, 0x1E1B, 0x8FDE, 0x8FE1, 0x09C8,

+    0x8FE2, 0x8FE2, 0x1E1C, 0x8FE3, 0x8FFC, 0x09CD, 0x9040, 0x9048, 0x09E7,

+    0x9049, 0x9049, 0x1E1D, 0x904A, 0x9077, 0x09F1, 0x9078, 0x9078, 0x1F23,

+    0x9079, 0x907E, 0x0A20, 0x9080, 0x9080, 0x1E1F, 0x9081, 0x909F, 0x0A27,

+    0x90A0, 0x90A0, 0x1E21, 0x90A1, 0x90E3, 0x0A47, 0x90E4, 0x90E4, 0x1E23,

+    0x90E5, 0x90EE, 0x0A8B, 0x90EF, 0x90EF, 0x1E24, 0x90F0, 0x90F6, 0x0A96,

+    0x90F7, 0x90F7, 0x1E26, 0x90F8, 0x90F8, 0x1F24, 0x90F9, 0x90F9, 0x0A9F,

+    0x90FA, 0x90FB, 0x1F25, 0x90FC, 0x90FC, 0x0AA2, 0x9140, 0x9145, 0x0AA3,

+    0x9146, 0x9146, 0x1E28, 0x9147, 0x9157, 0x0AAA, 0x9158, 0x9158, 0x1E29,

+    0x9159, 0x916A, 0x0ABC, 0x916B, 0x916B, 0x1E2A, 0x916C, 0x916D, 0x0ACF,

+    0x916E, 0x916E, 0x1E2B, 0x916F, 0x917D, 0x0AD2, 0x917E, 0x917E, 0x1E2C,

+    0x9180, 0x9188, 0x0AE2, 0x9189, 0x9189, 0x1E2D, 0x918A, 0x91B4, 0x0AEC,

+    0x91B5, 0x91B5, 0x1F27, 0x91B6, 0x91BA, 0x0B18, 0x91BB, 0x91BB, 0x1E2E,

+    0x91BC, 0x91CA, 0x0B1E, 0x91CB, 0x91CB, 0x1E2F, 0x91CC, 0x91D9, 0x0B2E,

+    0x91DA, 0x91DA, 0x1E30, 0x91DB, 0x91E0, 0x0B3D, 0x91E1, 0x91E1, 0x1E31,

+    0x91E2, 0x91EC, 0x0B44, 0x91ED, 0x91ED, 0x1E32, 0x91EE, 0x91FA, 0x0B50,

+    0x91FB, 0x91FB, 0x1E35, 0x91FC, 0x91FC, 0x0B5E, 0x9240, 0x9245, 0x0B5F,

+    0x9246, 0x9246, 0x1E36, 0x9247, 0x9247, 0x0B66, 0x9248, 0x9248, 0x1E37,

+    0x9249, 0x924B, 0x0B68, 0x924C, 0x924D, 0x1E39, 0x924E, 0x925B, 0x0B6D,

+    0x925C, 0x925C, 0x1E3B, 0x925D, 0x927E, 0x0B7C, 0x9280, 0x928F, 0x0B9E,

+    0x9290, 0x9290, 0x1E3C, 0x9291, 0x9294, 0x0BAF, 0x9295, 0x9295, 0x1E3D,

+    0x9296, 0x929B, 0x0BB4, 0x929C, 0x929C, 0x1E3E, 0x929D, 0x92BA, 0x0BBB,

+    0x92BB, 0x92BB, 0x1E3F, 0x92BC, 0x92C5, 0x0BDA, 0x92C6, 0x92C6, 0x1E40,

+    0x92C7, 0x92C7, 0x0BE5, 0x92C8, 0x92C8, 0x1E41, 0x92C9, 0x92CC, 0x0BE7,

+    0x92CD, 0x92CD, 0x1E43, 0x92CE, 0x92FC, 0x0BEC, 0x9340, 0x9340, 0x0C1B,

+    0x9341, 0x9341, 0x1E44, 0x9342, 0x9345, 0x0C1D, 0x9346, 0x9346, 0x1E45,

+    0x9347, 0x934C, 0x0C22, 0x934D, 0x934D, 0x1E46, 0x934E, 0x9354, 0x0C29,

+    0x9355, 0x9355, 0x1E47, 0x9356, 0x935D, 0x0C31, 0x935E, 0x935E, 0x1E48,

+    0x935F, 0x9366, 0x0C3A, 0x9367, 0x9367, 0x1E49, 0x9368, 0x9369, 0x0C43,

+    0x936A, 0x936A, 0x1E4A, 0x936B, 0x936F, 0x0C46, 0x9370, 0x9370, 0x1F28,

+    0x9371, 0x9371, 0x1E4C, 0x9372, 0x937E, 0x0C4D, 0x9380, 0x9383, 0x0C5A,

+    0x9384, 0x9384, 0x1E4D, 0x9385, 0x9397, 0x0C5F, 0x9398, 0x9398, 0x1E4E,

+    0x9399, 0x93BF, 0x0C73, 0x93C0, 0x93C0, 0x1E50, 0x93C1, 0x93D1, 0x0C9B,

+    0x93D2, 0x93D2, 0x1E51, 0x93D3, 0x93D8, 0x0CAD, 0x93D9, 0x93D9, 0x1E53,

+    0x93DA, 0x93E3, 0x0CB4, 0x93E4, 0x93E5, 0x1E56, 0x93E6, 0x93E7, 0x0CC0,

+    0x93E8, 0x93E8, 0x1E58, 0x93E9, 0x93F3, 0x0CC3, 0x93F4, 0x93F4, 0x1EC0,

+    0x93F5, 0x93FC, 0x0CCF, 0x9440, 0x9447, 0x0CD7, 0x9448, 0x9448, 0x1E59,

+    0x9449, 0x9449, 0x1F29, 0x944A, 0x9457, 0x0CE1, 0x9458, 0x9458, 0x1E5A,

+    0x9459, 0x9475, 0x0CF0, 0x9476, 0x9476, 0x1E5B, 0x9477, 0x947E, 0x0D0E,

+    0x9480, 0x9486, 0x0D16, 0x9487, 0x9487, 0x1E5C, 0x9488, 0x9488, 0x0D1E,

+    0x9489, 0x9489, 0x1E5D, 0x948A, 0x948C, 0x0D20, 0x948D, 0x948D, 0x1E5E,

+    0x948E, 0x94A1, 0x0D24, 0x94A2, 0x94A2, 0x1E5F, 0x94A3, 0x94AB, 0x0D39,

+    0x94AC, 0x94AC, 0x1E60, 0x94AD, 0x94AD, 0x0D43, 0x94AE, 0x94AE, 0x1E61,

+    0x94AF, 0x94BD, 0x0D45, 0x94BE, 0x94BE, 0x1F2A, 0x94BF, 0x94D1, 0x0D55,

+    0x94D2, 0x94D2, 0x1E62, 0x94D3, 0x94F2, 0x0D69, 0x94F3, 0x94F3, 0x1E64,

+    0x94F4, 0x94FC, 0x0D8A, 0x9540, 0x9540, 0x0D93, 0x9541, 0x9542, 0x1E65,

+    0x9543, 0x954D, 0x0D96, 0x954E, 0x954E, 0x1E67, 0x954F, 0x9550, 0x0DA2,

+    0x9551, 0x9551, 0x1E68, 0x9552, 0x9553, 0x0DA5, 0x9554, 0x9554, 0x1E69,

+    0x9555, 0x955E, 0x0DA8, 0x955F, 0x955F, 0x1E6A, 0x9560, 0x956C, 0x0DB3,

+    0x956D, 0x956D, 0x1E6B, 0x956E, 0x957E, 0x0DC1, 0x9580, 0x95C0, 0x0DD2,

+    0x95C1, 0x95C1, 0x1E6D, 0x95C2, 0x95CA, 0x0E14, 0x95CB, 0x95CB, 0x1E6E,

+    0x95CC, 0x95D0, 0x0E1E, 0x95D1, 0x95D1, 0x1F2B, 0x95D2, 0x95D7, 0x0E24,

+    0x95D8, 0x95D8, 0x1E6F, 0x95D9, 0x95F6, 0x0E2B, 0x95F7, 0x95F7, 0x1E70,

+    0x95F8, 0x95FC, 0x0E4A, 0x9640, 0x9647, 0x0E4F, 0x9648, 0x9648, 0x1E72,

+    0x9649, 0x9669, 0x0E58, 0x966A, 0x966A, 0x1E73, 0x966B, 0x967E, 0x0E7A,

+    0x9680, 0x968F, 0x0E8E, 0x9690, 0x9690, 0x1E74, 0x9691, 0x9697, 0x0E9F,

+    0x9698, 0x9698, 0x1F2C, 0x9699, 0x96CA, 0x0EA7, 0x96CB, 0x96CB, 0x1E75,

+    0x96CC, 0x96D6, 0x0EDA, 0x96D7, 0x96D7, 0x1E76, 0x96D8, 0x96DC, 0x0EE6,

+    0x96DD, 0x96DD, 0x1E77, 0x96DE, 0x96DF, 0x0EEC, 0x96E0, 0x96E0, 0x1E78,

+    0x96E1, 0x96F7, 0x0EEF, 0x96F8, 0x96F8, 0x1E79, 0x96F9, 0x96F9, 0x0F07,

+    0x96FA, 0x96FA, 0x1E7A, 0x96FB, 0x96FC, 0x0F09, 0x9740, 0x9750, 0x0F0B,

+    0x9751, 0x9751, 0x1E7C, 0x9752, 0x976E, 0x0F1D, 0x976F, 0x976F, 0x1E7D,

+    0x9770, 0x9772, 0x0F3B, 0x9773, 0x9773, 0x1E7E, 0x9774, 0x977E, 0x0F3F,

+    0x9780, 0x9788, 0x0F4A, 0x9789, 0x9789, 0x1E7F, 0x978A, 0x97F7, 0x0F54,

+    0x97F8, 0x97F9, 0x1E81, 0x97FA, 0x97FA, 0x1F2D, 0x97FB, 0x97FC, 0x0FC5,

+    0x9840, 0x9840, 0x1E83, 0x9841, 0x984F, 0x0FC8, 0x9850, 0x9850, 0x1E84,

+    0x9851, 0x9857, 0x0FD8, 0x9858, 0x9858, 0x1E85, 0x9859, 0x9872, 0x0FE0,

+    0x989F, 0x98FC, 0x0FFA, 0x9940, 0x9940, 0x1058, 0x9941, 0x9941, 0x1F2E,

+    0x9942, 0x995B, 0x105A, 0x995C, 0x995C, 0x1E86, 0x995D, 0x996B, 0x1075,

+    0x996C, 0x996C, 0x1E89, 0x996D, 0x997E, 0x1085, 0x9980, 0x99B5, 0x1097,

+    0x99B6, 0x99B6, 0x1F2F, 0x99B7, 0x99FC, 0x10CE, 0x9A40, 0x9A4E, 0x1114,

+    0x9A4F, 0x9A4F, 0x1E8A, 0x9A50, 0x9A58, 0x1124, 0x9A59, 0x9A59, 0x1E8B,

+    0x9A5A, 0x9A66, 0x112E, 0x9A67, 0x9A67, 0x1F30, 0x9A68, 0x9A7C, 0x113C,

+    0x9A7D, 0x9A7D, 0x1E8D, 0x9A7E, 0x9A7E, 0x1152, 0x9A80, 0x9A8A, 0x1153,

+    0x9A8B, 0x9A8B, 0x1E8E, 0x9A8C, 0x9A8C, 0x1F31, 0x9A8D, 0x9AC1, 0x1160,

+    0x9AC2, 0x9AC2, 0x1E8F, 0x9AC3, 0x9AC3, 0x1F32, 0x9AC4, 0x9AE9, 0x1197,

+    0x9AEA, 0x9AEA, 0x1F33, 0x9AEB, 0x9AFC, 0x11BE, 0x9B40, 0x9B5B, 0x11D0,

+    0x9B5C, 0x9B5C, 0x1E90, 0x9B5D, 0x9B7E, 0x11ED, 0x9B80, 0x9B82, 0x120F,

+    0x9B83, 0x9B83, 0x1E91, 0x9B84, 0x9B97, 0x1213, 0x9B98, 0x9B98, 0x1F34,

+    0x9B99, 0x9B9F, 0x1228, 0x9BA0, 0x9BA0, 0x1E92, 0x9BA1, 0x9BFA, 0x1230,

+    0x9BFB, 0x9BFC, 0x1F35, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CA1, 0x12CB,

+    0x9CA2, 0x9CA2, 0x1E94, 0x9CA3, 0x9CFC, 0x12EE, 0x9D40, 0x9D46, 0x1348,

+    0x9D47, 0x9D47, 0x1F37, 0x9D48, 0x9D7E, 0x1350, 0x9D80, 0x9D80, 0x1E95,

+    0x9D81, 0x9D8B, 0x1388, 0x9D8C, 0x9D8C, 0x1E96, 0x9D8D, 0x9DB6, 0x1394,

+    0x9DB7, 0x9DB7, 0x1E97, 0x9DB8, 0x9DF7, 0x13BF, 0x9DF8, 0x9DF8, 0x1F38,

+    0x9DF9, 0x9DFC, 0x1400, 0x9E40, 0x9E63, 0x1404, 0x9E64, 0x9E64, 0x1E99,

+    0x9E65, 0x9E7E, 0x1429, 0x9E80, 0x9E8A, 0x1443, 0x9E8B, 0x9E8B, 0x1E9B,

+    0x9E8C, 0x9EFC, 0x144F, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9F80, 0x14FF,

+    0x9F81, 0x9F81, 0x1F39, 0x9F82, 0x9FCD, 0x1501, 0x9FCE, 0x9FCE, 0x1E9D,

+    0x9FCF, 0x9FD3, 0x154E, 0x9FD4, 0x9FD4, 0x1F3A, 0x9FD5, 0x9FF3, 0x1554,

+    0x9FF4, 0x9FF4, 0x1F3B, 0x9FF5, 0x9FFC, 0x1574, 0xE040, 0xE07E, 0x157C,

+    0xE080, 0xE092, 0x15BB, 0xE093, 0xE093, 0x1E9E, 0xE094, 0xE0A3, 0x15CF,

+    0xE0A4, 0xE0A4, 0x1E9F, 0xE0A5, 0xE0DC, 0x15E0, 0xE0DD, 0xE0DD, 0x1EA0,

+    0xE0DE, 0xE0FC, 0x1619, 0xE140, 0xE149, 0x1638, 0xE14A, 0xE14A, 0x1EA1,

+    0xE14B, 0xE17E, 0x1643, 0xE180, 0xE1EC, 0x1677, 0xE1ED, 0xE1ED, 0x1EA5,

+    0xE1EE, 0xE1FC, 0x16E5, 0xE240, 0xE268, 0x16F4, 0xE269, 0xE269, 0x1EA6,

+    0xE26A, 0xE272, 0x171E, 0xE273, 0xE273, 0x1EA7, 0xE274, 0xE277, 0x1728,

+    0xE278, 0xE278, 0x1F3C, 0xE279, 0xE27E, 0x172D, 0xE280, 0xE2B6, 0x1733,

+    0xE2B7, 0xE2B7, 0x1EA8, 0xE2B8, 0xE2BD, 0x176B, 0xE2BE, 0xE2BE, 0x1F3D,

+    0xE2BF, 0xE2E1, 0x1772, 0xE2E2, 0xE2E2, 0x1EA9, 0xE2E3, 0xE2EB, 0x1796,

+    0xE2EC, 0xE2EC, 0x1EAA, 0xE2ED, 0xE2FC, 0x17A0, 0xE340, 0xE357, 0x17B0,

+    0xE358, 0xE358, 0x1EAB, 0xE359, 0xE359, 0x17C9, 0xE35A, 0xE35A, 0x1EAC,

+    0xE35B, 0xE364, 0x17CB, 0xE365, 0xE365, 0x1EAD, 0xE366, 0xE37E, 0x17D6,

+    0xE380, 0xE3C6, 0x17EF, 0xE3C7, 0xE3C7, 0x1F3E, 0xE3C8, 0xE3FC, 0x1837,

+    0xE440, 0xE47E, 0x186C, 0xE480, 0xE483, 0x18AB, 0xE484, 0xE484, 0x1EAF,

+    0xE485, 0xE488, 0x18B0, 0xE489, 0xE489, 0x1EB0, 0xE48A, 0xE491, 0x18B5,

+    0xE492, 0xE492, 0x1EB1, 0xE493, 0xE4B8, 0x18BE, 0xE4B9, 0xE4B9, 0x1EB3,

+    0xE4BA, 0xE4CA, 0x18E5, 0xE4CB, 0xE4CB, 0x1F3F, 0xE4CC, 0xE4FC, 0x18F7,

+    0xE540, 0xE57E, 0x1928, 0xE580, 0xE59D, 0x1967, 0xE59E, 0xE59E, 0x1F40,

+    0xE59F, 0xE5B9, 0x1986, 0xE5BA, 0xE5BB, 0x1F41, 0xE5BC, 0xE5EC, 0x19A3,

+    0xE5ED, 0xE5ED, 0x1EB8, 0xE5EE, 0xE5FC, 0x19D5, 0xE640, 0xE650, 0x19E4,

+    0xE651, 0xE651, 0x1EB9, 0xE652, 0xE67E, 0x19F6, 0xE680, 0xE685, 0x1A23,

+    0xE686, 0xE686, 0x1EBA, 0xE687, 0xE6E6, 0x1A2A, 0xE6E7, 0xE6E7, 0x1EBC,

+    0xE6E8, 0xE6FC, 0x1A8B, 0xE740, 0xE76C, 0x1AA0, 0xE76D, 0xE76D, 0x1EBE,

+    0xE76E, 0xE77E, 0x1ACE, 0xE780, 0xE7A6, 0x1ADF, 0xE7A7, 0xE7A7, 0x1EC1,

+    0xE7A8, 0xE7BA, 0x1B07, 0xE7BB, 0xE7BB, 0x1EC2, 0xE7BC, 0xE7FC, 0x1B1B,

+    0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8CE, 0x1B9B, 0xE8CF, 0xE8CF, 0x1EC7,

+    0xE8D0, 0xE8FC, 0x1BEB, 0xE940, 0xE977, 0x1C18, 0xE978, 0xE978, 0x1F43,

+    0xE979, 0xE97E, 0x1C51, 0xE980, 0xE9AA, 0x1C57, 0xE9AB, 0xE9AB, 0x1ECA,

+    0xE9AC, 0xE9B9, 0x1C83, 0xE9BA, 0xE9BA, 0x1ECB, 0xE9BB, 0xE9CB, 0x1C92,

+    0xE9CC, 0xE9CC, 0x1ECC, 0xE9CD, 0xE9FC, 0x1CA4, 0xEA40, 0xEA6F, 0x1CD4,

+    0xEA70, 0xEA70, 0x1ECD, 0xEA71, 0xEA71, 0x1F44, 0xEA72, 0xEA7E, 0x1D06,

+    0xEA80, 0xEA9C, 0x1D13, 0xEA9D, 0xEA9D, 0x1ECE, 0xEA9E, 0xEAA2, 0x1D31,

+    0xEAA3, 0xEAA4, 0x205C, 0xEC40, 0xEC42, 0x1F45, 0xEC46, 0xEC46, 0x1F48,

+    0xEC47, 0xEC47, 0x0300, 0xEC48, 0xEC48, 0x02FA, 0xEC49, 0xEC49, 0x02F9,

+    0xEC4D, 0xEC57, 0x1F49, 0xEC5B, 0xEC5D, 0x1DB1, 0xEC5E, 0xEC5E, 0x1F54,

+    0xEC5F, 0xEC5F, 0x1DB7, 0xEC60, 0xEC62, 0x1F55, 0xEC63, 0xEC65, 0x1DB4,

+    0xEC66, 0xEC6F, 0x1F58, 0xEC70, 0xEC70, 0x0303, 0xEC71, 0xEC71, 0x1F62,

+    0xEC72, 0xEC72, 0x0304, 0xEC73, 0xEC74, 0x1F63, 0xEC76, 0xEC76, 0x1F65,

+    0xEC78, 0xEC78, 0x1DA4, 0xEC79, 0xEC79, 0x1DA1, 0xEC7A, 0xEC7A, 0x1F66,

+    0xEC7B, 0xEC7B, 0x1DA2, 0xEC7C, 0xEC7E, 0x1F67, 0xEC80, 0xEC80, 0x1DA6,

+    0xEC81, 0xEC81, 0x1F6A, 0xEC82, 0xEC82, 0x1DA8, 0xEC83, 0xEC83, 0x1DAC,

+    0xEC84, 0xEC84, 0x1F6B, 0xEC85, 0xEC85, 0x1DAE, 0xEC86, 0xEC86, 0x1DAB,

+    0xEC87, 0xEC88, 0x1F6C, 0xEC89, 0xEC89, 0x1DAF, 0xEC8A, 0xEC90, 0x1F6E,

+    0xEC94, 0xEC99, 0x1F75, 0xEC9A, 0xEC9A, 0x1DBA, 0xEC9B, 0xEC9B, 0x1F7B,

+    0xEC9E, 0xEC9E, 0x1F7C, 0xECA7, 0xECB0, 0x1F7D, 0xECB2, 0xECC5, 0x1F87,

+    0xECC7, 0xECDA, 0x1D83, 0xECDB, 0xECDB, 0x1F9B, 0xECDC, 0xECE5, 0x1D97,

+    0xECE9, 0xECFC, 0x1F9C, 0xED40, 0xED59, 0x1FB0, 0xED64, 0xED64, 0x1F16,

+    0xED68, 0xED69, 0x1FCA, 0xED6A, 0xED6A, 0x1DC4, 0xED6B, 0xED6D, 0x1FCC,

+    0xED6E, 0xED6E, 0x1DC3, 0xED6F, 0xED73, 0x1FCF, 0xED74, 0xED74, 0x1DC2,

+    0xED75, 0xED78, 0x1FD4, 0xED7C, 0xED7E, 0x1FD8, 0xED80, 0xED8A, 0x1FDB,

+    0xED8F, 0xED9E, 0x1FE6, 0xEF40, 0xEF41, 0x1ECF, 0xEF42, 0xEF42, 0x204C,

+    0xEF43, 0xEF43, 0x2052, 0xEF44, 0xEF4D, 0x1ED1, 0xEF4E, 0xEF4E, 0x205A,

+    0xEF4F, 0xEF4F, 0x2053, 0xEF50, 0xEF50, 0x2058, 0xEF51, 0xEF51, 0x2055,

+    0xEF52, 0xEF63, 0x1EDB, 0xEF64, 0xEF79, 0x1EEE, 0xEF7A, 0xEF7B, 0x2048,

+    0xEF8D, 0xEF90, 0x02E0, 0xEF91, 0xEF94, 0x1FF6,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp
new file mode 100644
index 0000000..8736184
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp
@@ -0,0 +1,27 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_Add_RKSJ_V_1[57 * 3] = {

+    0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,

+    0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6,

+    0x8165, 0x8165, 0x205A, 0x8166, 0x8166, 0x2053, 0x8167, 0x8167, 0x2058,

+    0x8168, 0x8168, 0x2055, 0x8169, 0x817A, 0x1EDB, 0x829F, 0x829F, 0x1EEE,

+    0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0, 0x82A5, 0x82A5, 0x1EF1,

+    0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3, 0x82E1, 0x82E1, 0x1EF4,

+    0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6, 0x82EC, 0x82EC, 0x1EF7,

+    0x82F3, 0x82F4, 0x2048, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9,

+    0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC,

+    0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF,

+    0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02,

+    0xEC78, 0xEC78, 0x1F07, 0xEC79, 0xEC79, 0x1F04, 0xEC7A, 0xEC7A, 0x2089,

+    0xEC7B, 0xEC7B, 0x1F05, 0xEC7C, 0xEC7C, 0x208A, 0xEC7D, 0xEC7E, 0x2093,

+    0xEC80, 0xEC80, 0x1F09, 0xEC81, 0xEC81, 0x2092, 0xEC82, 0xEC82, 0x1F0B,

+    0xEC83, 0xEC83, 0x1F0F, 0xEC84, 0xEC84, 0x209C, 0xEC85, 0xEC85, 0x1F11,

+    0xEC86, 0xEC86, 0x1F0E, 0xEC87, 0xEC87, 0x2098, 0xEC88, 0xEC88, 0x209B,

+    0xEC89, 0xEC89, 0x1F12, 0xEC8A, 0xEC8A, 0x2097, 0xEC8B, 0xEC8C, 0x209D,

+    0xEC8D, 0xEC8D, 0x20A6, 0xEC8E, 0xEC8E, 0x20A5, 0xEC8F, 0xEC8F, 0x20A1,

+    0xEC90, 0xEC90, 0x20A4, 0xEC95, 0xEC95, 0x2084, 0xEF92, 0xEF92, 0x208D,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp
new file mode 100644
index 0000000..e0080a1
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp
@@ -0,0 +1,1939 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_Japan1CID2Unicode_4[15444] = {

+    0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,

+    0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,

+    0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,

+    0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,

+    0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,

+    0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,

+    0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,

+    0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E,

+    0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,

+    0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,

+    0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,

+    0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303,

+    0x02BC, 0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3,

+    0x2044, 0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A,

+    0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022,

+    0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301,

+    0x0302, 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B,

+    0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152,

+    0x00BA, 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D,

+    0x00A9, 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5,

+    0x00B9, 0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3,

+    0x00C4, 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC,

+    0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4,

+    0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD,

+    0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7,

+    0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,

+    0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,

+    0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160,

+    0x0178, 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x0020,

+    0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,

+    0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,

+    0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,

+    0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,

+    0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,

+    0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,

+    0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,

+    0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060,

+    0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,

+    0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,

+    0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,

+    0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0xFF60, 0xFF61,

+    0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69,

+    0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71,

+    0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79,

+    0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81,

+    0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89,

+    0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91,

+    0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99,

+    0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, 0xFF40, 0x30F0,

+    0x30F1, 0x30EE, 0x30AB, 0x30B1, 0x30F4, 0x30AC, 0x30AE, 0x30B0,

+    0x30B2, 0x30B4, 0x30B6, 0x30B8, 0x30BA, 0x30BC, 0x30BE, 0x30C0,

+    0x30C2, 0x30C5, 0x30C7, 0x30C9, 0x30D0, 0x30D1, 0x30D3, 0x30D4,

+    0x30D6, 0x30D7, 0x30D9, 0x30DA, 0x30DC, 0x30DD, 0xFF60, 0x301D,

+    0x301E, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506,

+    0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E,

+    0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516,

+    0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E,

+    0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526,

+    0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E,

+    0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536,

+    0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E,

+    0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546,

+    0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0x2032, 0x00A8, 0x2036,

+    0x005B, 0x005D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300E, 0x300F,

+    0x3010, 0x3011, 0x2012, 0xFF60, 0x3092, 0x3041, 0x3043, 0x3045,

+    0x3047, 0x3049, 0x3083, 0x3085, 0x3087, 0x3063, 0x3042, 0x3044,

+    0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,

+    0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,

+    0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,

+    0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,

+    0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,

+    0x308D, 0x308F, 0x3093, 0x3090, 0x3091, 0x308E, 0x304C, 0x304E,

+    0x3050, 0x3052, 0x3054, 0x3056, 0x3068, 0x305A, 0x305C, 0x305E,

+    0x3060, 0x3062, 0x3065, 0x3067, 0x3069, 0x3070, 0x3071, 0x3073,

+    0x3074, 0x3076, 0x3077, 0x3079, 0x307A, 0x307C, 0x307D, 0x00C4,

+    0x00F9, 0x00E9, 0x00ED, 0x00DF, 0x00E7, 0x00C7, 0x00D1, 0x00F1,

+    0x00A2, 0x00A3, 0x00F3, 0x00FA, 0x00A1, 0x00BF, 0x00BD, 0x00D6,

+    0x00DC, 0x00E4, 0x00EB, 0x00EF, 0x00F6, 0x00DC, 0x00E2, 0x00EA,

+    0x00EE, 0x00F4, 0x00FC, 0x00E0, 0x00E9, 0x25B2, 0x00E1, 0x007E,

+    0x0030, 0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A,

+    0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8,

+    0xFF3E, 0x203E, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003,

+    0x4EDD, 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F,

+    0xFF3C, 0xFF5E, 0x2016, 0xFF5C, 0x2026, 0x2025, 0x2018, 0x2019,

+    0x201C, 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D,

+    0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D,

+    0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, 0xFF0D, 0x00B1, 0x00D7,

+    0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E,

+    0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5,

+    0xFF04, 0x00A2, 0x00A3, 0xFF05, 0xFF03, 0xFF06, 0xFF0A, 0xFF20,

+    0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6,

+    0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x203B, 0x3012,

+    0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x2208, 0x220B, 0x2286,

+    0x2287, 0x2282, 0x2283, 0x222A, 0x2229, 0x2227, 0x2228, 0x00AC,

+    0x21D2, 0x21D4, 0x2200, 0x2203, 0x2220, 0x22A5, 0x2312, 0x2202,

+    0x2207, 0x2261, 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D,

+    0x2235, 0x222B, 0x222C, 0x212B, 0x2030, 0x266F, 0x266D, 0x266A,

+    0x2020, 0x2021, 0x00B6, 0x25EF, 0xFF10, 0xFF11, 0xFF12, 0xFF13,

+    0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF21, 0xFF22,

+    0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A,

+    0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32,

+    0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A,

+    0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48,

+    0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50,

+    0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58,

+    0xFF59, 0xFF5A, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046,

+    0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E,

+    0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056,

+    0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E,

+    0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066,

+    0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E,

+    0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076,

+    0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E,

+    0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086,

+    0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E,

+    0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, 0x30A3,

+    0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB,

+    0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3,

+    0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB,

+    0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3,

+    0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB,

+    0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3,

+    0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB,

+    0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3,

+    0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB,

+    0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3,

+    0x30F4, 0x30F5, 0x30F6, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395,

+    0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D,

+    0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6,

+    0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5,

+    0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD,

+    0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6,

+    0x03C7, 0x03C8, 0x03C9, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414,

+    0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B,

+    0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423,

+    0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B,

+    0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433,

+    0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A,

+    0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442,

+    0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A,

+    0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x4E9C, 0x5516, 0x5A03,

+    0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, 0x8475, 0x831C,

+    0x7A50, 0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, 0x82A6, 0x9BF5,

+    0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 0x59D0, 0x867B, 0x98F4,

+    0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, 0x5B89, 0x5EB5,

+    0x6309, 0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, 0x4EE5, 0x4F0A,

+    0x4F4D, 0x4F9D, 0x5049, 0x56F2, 0x5937, 0x59D4, 0x5A01, 0x5C09,

+    0x60DF, 0x610F, 0x6170, 0x6613, 0x6905, 0x70BA, 0x754F, 0x7570,

+    0x79FB, 0x7DAD, 0x7DEF, 0x80C3, 0x840E, 0x8863, 0x8B02, 0x9055,

+    0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, 0x80B2, 0x90C1, 0x78EF,

+    0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, 0x828B, 0x9C2F,

+    0x5141, 0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, 0x5F15, 0x98F2,

+    0x6DEB, 0x80E4, 0x852D, 0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B,

+    0x53F3, 0x5B87, 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 0x9D5C,

+    0x7ABA, 0x4E11, 0x7893, 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D,

+    0x851A, 0x9C3B, 0x59E5, 0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642,

+    0x4E91, 0x904B, 0x96F2, 0x834F, 0x990C, 0x53E1, 0x55B6, 0x5B30,

+    0x5F71, 0x6620, 0x66F3, 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B,

+    0x76C8, 0x7A4E, 0x9834, 0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2,

+    0x75AB, 0x76CA, 0x99C5, 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 0x698E,

+    0x53AD, 0x5186, 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028,

+    0x63A9, 0x63F4, 0x6CBF, 0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5,

+    0x733F, 0x7E01, 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 0x9D1B,

+    0x5869, 0x65BC, 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80,

+    0x5FDC, 0x62BC, 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1,

+    0x8956, 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104,

+    0x5C4B, 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378,

+    0x6069, 0x6E29, 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55,

+    0x4F3D, 0x4FA1, 0x4F73, 0x52A0, 0x53EF, 0x5609, 0x590F, 0x5AC1,

+    0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3,

+    0x706B, 0x73C2, 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB,

+    0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 0x8AB2, 0x5629, 0x8CA8,

+    0x8FE6, 0x904E, 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259,

+    0x753B, 0x81E5, 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5,

+    0x4ECB, 0x4F1A, 0x89E3, 0x56DE, 0x584A, 0x58CA, 0x5EFB, 0x5FEB,

+    0x602A, 0x6094, 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539, 0x9B41,

+    0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686, 0x7D75, 0x82A5,

+    0x87F9, 0x958B, 0x968E, 0x8C9D, 0x51F1, 0x52BE, 0x5916, 0x54B3,

+    0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, 0x84CB, 0x8857,

+    0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, 0x57A3, 0x67FF,

+    0x86CE, 0x920E, 0x5283, 0x5687, 0x5404, 0x5ED3, 0x62E1, 0x64B9,

+    0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, 0x899A, 0x89D2,

+    0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769, 0x5B66, 0x5CB3,

+    0x697D, 0x984D, 0x984E, 0x639B, 0x7B20, 0x6A2B, 0x6A7F, 0x68B6,

+    0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC, 0x6D3B, 0x6E07,

+    0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39, 0x53F6, 0x691B,

+    0x6A3A, 0x9784, 0x682A, 0x515C, 0x7AC3, 0x84B2, 0x91DC, 0x938C,

+    0x565B, 0x9D28, 0x6822, 0x8305, 0x8431, 0x7CA5, 0x5208, 0x82C5,

+    0x74E6, 0x4E7E, 0x4F83, 0x51A0, 0x5BD2, 0x520A, 0x52D8, 0x52E7,

+    0x5DFB, 0x559A, 0x582A, 0x59E6, 0x5B8C, 0x5B98, 0x5BDB, 0x5E72,

+    0x5E79, 0x60A3, 0x611F, 0x6163, 0x61BE, 0x63DB, 0x6562, 0x67D1,

+    0x6853, 0x68FA, 0x6B3E, 0x6B53, 0x6C57, 0x6F22, 0x6F97, 0x6F45,

+    0x74B0, 0x7518, 0x76E3, 0x770B, 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9,

+    0x7F36, 0x7FF0, 0x809D, 0x8266, 0x839E, 0x89B3, 0x8ACC, 0x8CAB,

+    0x9084, 0x9451, 0x9593, 0x9591, 0x95A2, 0x9665, 0x97D3, 0x9928,

+    0x8218, 0x4E38, 0x542B, 0x5CB8, 0x5DCC, 0x73A9, 0x764C, 0x773C,

+    0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, 0x9811, 0x9854, 0x9858, 0x4F01,

+    0x4F0E, 0x5371, 0x559C, 0x5668, 0x57FA, 0x5947, 0x5B09, 0x5BC4,

+    0x5C90, 0x5E0C, 0x5E7E, 0x5FCC, 0x63EE, 0x673A, 0x65D7, 0x65E2,

+    0x671F, 0x68CB, 0x68C4, 0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D,

+    0x757F, 0x7948, 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 0x8A18,

+    0x8CB4, 0x8D77, 0x8ECC, 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80,

+    0x507D, 0x5100, 0x5993, 0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A,

+    0x72A0, 0x7591, 0x7947, 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 0x63AC,

+    0x83CA, 0x97A0, 0x5409, 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70,

+    0x7827, 0x6775, 0x9ECD, 0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006,

+    0x4E18, 0x4E45, 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 0x5F13,

+    0x6025, 0x6551, 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403,

+    0x7A76, 0x7AAE, 0x7B08, 0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B,

+    0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 0x865A,

+    0x8A31, 0x8DDD, 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB,

+    0x4EAC, 0x4F9B, 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6,

+    0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, 0x5883, 0x5CE1, 0x5F37,

+    0x5F4A, 0x602F, 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1,

+    0x72C2, 0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7,

+    0x93E1, 0x97FF, 0x9957, 0x9A5A, 0x4EF0, 0x51DD, 0x5C2D, 0x6681,

+    0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5,

+    0x52E4, 0x5747, 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434,

+    0x7981, 0x79BD, 0x7B4B, 0x7DCA, 0x82B9, 0x83CC, 0x887F, 0x895F,

+    0x8B39, 0x8FD1, 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5,

+    0x533A, 0x72D7, 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8,

+    0x99D2, 0x5177, 0x611A, 0x865E, 0x55B0, 0x7A7A, 0x5076, 0x5BD3,

+    0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48, 0x6398,

+    0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, 0x9688, 0x7C82,

+    0x6817, 0x7E70, 0x6851, 0x936C, 0x52F2, 0x541B, 0x85AB, 0x8A13,

+    0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, 0x4FC2, 0x50BE,

+    0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, 0x5951, 0x5F62,

+    0x5F84, 0x6075, 0x6176, 0x6167, 0x61A9, 0x63B2, 0x643A, 0x656C,

+    0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB, 0x7D4C, 0x7D99,

+    0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08, 0x8A63, 0x8B66,

+    0x8EFD, 0x981A, 0x9D8F, 0x82B8, 0x8FCE, 0x9BE8, 0x5287, 0x621F,

+    0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, 0x6C7A, 0x6F54,

+    0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, 0x5039, 0x5026,

+    0x5065, 0x517C, 0x5238, 0x5263, 0x55A7, 0x570F, 0x5805, 0x5ACC,

+    0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372, 0x691C, 0x6A29, 0x727D,

+    0x72AC, 0x732E, 0x7814, 0x786F, 0x7D79, 0x770C, 0x80A9, 0x898B,

+    0x8B19, 0x8CE2, 0x8ED2, 0x9063, 0x9375, 0x967A, 0x9855, 0x9A13,

+    0x9E78, 0x5143, 0x539F, 0x53B3, 0x5E7B, 0x5F26, 0x6E1B, 0x6E90,

+    0x7384, 0x73FE, 0x7D43, 0x8237, 0x8A00, 0x8AFA, 0x9650, 0x4E4E,

+    0x500B, 0x53E4, 0x547C, 0x56FA, 0x59D1, 0x5B64, 0x5DF1, 0x5EAB,

+    0x5F27, 0x6238, 0x6545, 0x67AF, 0x6E56, 0x72D0, 0x7CCA, 0x88B4,

+    0x80A1, 0x80E1, 0x83F0, 0x864E, 0x8A87, 0x8DE8, 0x9237, 0x96C7,

+    0x9867, 0x9F13, 0x4E94, 0x4E92, 0x4F0D, 0x5348, 0x5449, 0x543E,

+    0x5A2F, 0x5F8C, 0x5FA1, 0x609F, 0x68A7, 0x6A8E, 0x745A, 0x7881,

+    0x8A9E, 0x8AA4, 0x8B77, 0x9190, 0x4E5E, 0x9BC9, 0x4EA4, 0x4F7C,

+    0x4FAF, 0x5019, 0x5016, 0x5149, 0x516C, 0x529F, 0x52B9, 0x52FE,

+    0x539A, 0x53E3, 0x5411, 0x540E, 0x5589, 0x5751, 0x57A2, 0x597D,

+    0x5B54, 0x5B5D, 0x5B8F, 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 0x5E83,

+    0x5E9A, 0x5EB7, 0x5F18, 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7,

+    0x653B, 0x6602, 0x6643, 0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB,

+    0x6C5F, 0x6D2A, 0x6D69, 0x6E2F, 0x6E9D, 0x7532, 0x7687, 0x786C,

+    0x7A3F, 0x7CE0, 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003,

+    0x80AF, 0x80B1, 0x8154, 0x818F, 0x822A, 0x8352, 0x884C, 0x8861,

+    0x8B1B, 0x8CA2, 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 0x92FC,

+    0x95A4, 0x964D, 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB,

+    0x53F7, 0x5408, 0x58D5, 0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9,

+    0x514B, 0x523B, 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 0x9ED2,

+    0x7344, 0x6F09, 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB,

+    0x8FBC, 0x6B64, 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A,

+    0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 0x68B1, 0x6DF7, 0x75D5,

+    0x7D3A, 0x826E, 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F,

+    0x5DE6, 0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396,

+    0x88DF, 0x5750, 0x5EA7, 0x632B, 0x50B5, 0x50AC, 0x518D, 0x6700,

+    0x54C9, 0x585E, 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D,

+    0x6B73, 0x6E08, 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D,

+    0x658E, 0x7D30, 0x83DC, 0x88C1, 0x8F09, 0x969B, 0x5264, 0x5728,

+    0x6750, 0x7F6A, 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A,

+    0x80B4, 0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A,

+    0x548B, 0x643E, 0x6628, 0x6714, 0x67F5, 0x7A84, 0x7B56, 0x7D22,

+    0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237, 0x5BDF,

+    0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, 0x96D1, 0x7690,

+    0x9BD6, 0x634C, 0x9306, 0x9BAB, 0x76BF, 0x6652, 0x4E09, 0x5098,

+    0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F, 0x71E6, 0x73CA,

+    0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB, 0x9178, 0x9910,

+    0x65AC, 0x66AB, 0x6B8B, 0x4ED5, 0x4ED4, 0x4F3A, 0x4F7F, 0x523A,

+    0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB, 0x59C9, 0x59FF,

+    0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, 0x6307, 0x652F,

+    0x5B5C, 0x65AF, 0x65BD, 0x65E8, 0x679D, 0x6B62, 0x6B7B, 0x6C0F,

+    0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, 0x80A2, 0x8102,

+    0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, 0x8AEE, 0x8CC7,

+    0x8CDC, 0x96CC, 0x98FC, 0x6B6F, 0x4E8B, 0x4F3C, 0x4F8D, 0x5150,

+    0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642, 0x6B21, 0x6ECB, 0x6CBB,

+    0x723E, 0x74BD, 0x75D4, 0x78C1, 0x793A, 0x800C, 0x8033, 0x81EA,

+    0x8494, 0x8F9E, 0x6C50, 0x9E7F, 0x5F0F, 0x8B58, 0x9D2B, 0x7AFA,

+    0x8EF8, 0x5B8D, 0x96EB, 0x4E03, 0x53F1, 0x57F7, 0x5931, 0x5AC9,

+    0x5BA4, 0x6089, 0x6E7F, 0x6F06, 0x75BE, 0x8CEA, 0x5B9F, 0x8500,

+    0x7BE0, 0x5072, 0x67F4, 0x829D, 0x5C61, 0x854A, 0x7E1E, 0x820E,

+    0x5199, 0x5C04, 0x6368, 0x8D66, 0x659C, 0x716E, 0x793E, 0x7D17,

+    0x8005, 0x8B1D, 0x8ECA, 0x906E, 0x86C7, 0x90AA, 0x501F, 0x52FA,

+    0x5C3A, 0x6753, 0x707C, 0x7235, 0x914C, 0x91C8, 0x932B, 0x82E5,

+    0x5BC2, 0x5F31, 0x60F9, 0x4E3B, 0x53D6, 0x5B88, 0x624B, 0x6731,

+    0x6B8A, 0x72E9, 0x73E0, 0x7A2E, 0x816B, 0x8DA3, 0x9152, 0x9996,

+    0x5112, 0x53D7, 0x546A, 0x5BFF, 0x6388, 0x6A39, 0x7DAC, 0x9700,

+    0x56DA, 0x53CE, 0x5468, 0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101,

+    0x62FE, 0x6D32, 0x79C0, 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 0x81ED,

+    0x821F, 0x8490, 0x8846, 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031,

+    0x914B, 0x916C, 0x96C6, 0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341,

+    0x5F93, 0x620E, 0x67D4, 0x6C41, 0x6E0B, 0x7363, 0x7E26, 0x91CD,

+    0x9283, 0x53D4, 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B,

+    0x587E, 0x719F, 0x51FA, 0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625,

+    0x77AC, 0x7AE3, 0x821C, 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 0x696F,

+    0x6B89, 0x6DF3, 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075,

+    0x9187, 0x9806, 0x51E6, 0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A,

+    0x5EB6, 0x7DD2, 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 0x52A9,

+    0x53D9, 0x5973, 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7,

+    0x511F, 0x52DD, 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531,

+    0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 0x5C06, 0x5C0F, 0x5C11,

+    0x5C1A, 0x5E84, 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB,

+    0x638C, 0x6377, 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2,

+    0x6A1F, 0x6A35, 0x6CBC, 0x6D88, 0x6E09, 0x6E58, 0x713C, 0x7126,

+    0x7167, 0x75C7, 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0,

+    0x7B11, 0x7CA7, 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D,

+    0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 0x8C61, 0x8CDE, 0x91A4,

+    0x9266, 0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E,

+    0x4E57, 0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38,

+    0x60C5, 0x64FE, 0x6761, 0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63,

+    0x84B8, 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE, 0x62ED,

+    0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272, 0x89E6, 0x98DF,

+    0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5, 0x5507, 0x5A20,

+    0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B, 0x68EE,

+    0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, 0x79E6,

+    0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, 0x8EAB, 0x8F9B,

+    0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, 0x58EC,

+    0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D,

+    0x7B25, 0x8ACF, 0x9808, 0x9162, 0x56F3, 0x53A8, 0x9017, 0x5439,

+    0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, 0x7C8B, 0x7FE0,

+    0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F, 0x745E, 0x9AC4,

+    0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB, 0x636E, 0x6749,

+    0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, 0x6F84, 0x647A, 0x5BF8,

+    0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, 0x52E2, 0x59D3,

+    0x5F81, 0x6027, 0x6210, 0x653F, 0x6574, 0x661F, 0x6674, 0x68F2,

+    0x6816, 0x6B63, 0x6E05, 0x7272, 0x751F, 0x76DB, 0x7CBE, 0x8056,

+    0x58F0, 0x88FD, 0x897F, 0x8AA0, 0x8A93, 0x8ACB, 0x901D, 0x9192,

+    0x9752, 0x9759, 0x6589, 0x7A0E, 0x8106, 0x96BB, 0x5E2D, 0x60DC,

+    0x621A, 0x65A5, 0x6614, 0x6790, 0x77F3, 0x7A4D, 0x7C4D, 0x7E3E,

+    0x810A, 0x8CAC, 0x8D64, 0x8DE1, 0x8E5F, 0x78A9, 0x5207, 0x62D9,

+    0x63A5, 0x6442, 0x6298, 0x8A2D, 0x7A83, 0x7BC0, 0x8AAC, 0x96EA,

+    0x7D76, 0x820C, 0x8749, 0x4ED9, 0x5148, 0x5343, 0x5360, 0x5BA3,

+    0x5C02, 0x5C16, 0x5DDD, 0x6226, 0x6247, 0x64B0, 0x6813, 0x6834,

+    0x6CC9, 0x6D45, 0x6D17, 0x67D3, 0x6F5C, 0x714E, 0x717D, 0x65CB,

+    0x7A7F, 0x7BAD, 0x7DDA, 0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239,

+    0x85A6, 0x8A6E, 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 0x9291,

+    0x9583, 0x9BAE, 0x524D, 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985,

+    0x7E55, 0x81B3, 0x7CCE, 0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE,

+    0x66FD, 0x695A, 0x72D9, 0x758F, 0x758E, 0x790E, 0x7956, 0x79DF,

+    0x7C97, 0x7D20, 0x7D44, 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20,

+    0x50E7, 0x5275, 0x53CC, 0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F,

+    0x723D, 0x5B8B, 0x5C64, 0x531D, 0x60E3, 0x60F3, 0x635C, 0x6383,

+    0x633F, 0x63BB, 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD,

+    0x6F15, 0x71E5, 0x4E89, 0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF,

+    0x7D9C, 0x8061, 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 0x88C5,

+    0x8D70, 0x9001, 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897,

+    0x618E, 0x81D3, 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247,

+    0x5373, 0x606F, 0x6349, 0x675F, 0x6E2C, 0x8DB3, 0x901F, 0x4FD7,

+    0x5C5E, 0x8CCA, 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3,

+    0x5B58, 0x5B6B, 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A,

+    0x592A, 0x6C70, 0x8A51, 0x553E, 0x5815, 0x59A5, 0x60F0, 0x6253,

+    0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806,

+    0x5BFE, 0x8010, 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234,

+    0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 0x82D4, 0x888B, 0x8CB8,

+    0x9000, 0x902E, 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927,

+    0x7B2C, 0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544,

+    0x5B85, 0x6258, 0x629E, 0x62D3, 0x6CA2, 0x6FEF, 0x7422, 0x8A17,

+    0x9438, 0x6FC1, 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA, 0x53E9,

+    0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD, 0x7AEA, 0x8FBF,

+    0x68DA, 0x8C37, 0x72F8, 0x9C48, 0x6A3D, 0x8AB0, 0x4E39, 0x5358,

+    0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, 0x6DE1, 0x6E5B,

+    0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, 0x80C6, 0x86CB,

+    0x8A95, 0x935B, 0x56E3, 0x58C7, 0x5F3E, 0x65AD, 0x6696, 0x6A80,

+    0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, 0x5F1B, 0x6065,

+    0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, 0x8718, 0x9045,

+    0x99B3, 0x7BC9, 0x755C, 0x7AF9, 0x7B51, 0x84C4, 0x9010, 0x79E9,

+    0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2, 0x5B99, 0x5FE0,

+    0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877, 0x8A3B, 0x914E,

+    0x92F3, 0x99D0, 0x6A17, 0x7026, 0x732A, 0x82E7, 0x8457, 0x8CAF,

+    0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5, 0x5E16, 0x5E33, 0x5E81,

+    0x5F14, 0x5F35, 0x5F6B, 0x5FB4, 0x61F2, 0x6311, 0x66A2, 0x671D,

+    0x6F6E, 0x7252, 0x753A, 0x773A, 0x8074, 0x8139, 0x8178, 0x8776,

+    0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, 0x929A, 0x9577, 0x9802, 0x9CE5,

+    0x52C5, 0x6357, 0x76F4, 0x6715, 0x6C88, 0x73CD, 0x8CC3, 0x93AE,

+    0x9673, 0x6D25, 0x589C, 0x690E, 0x69CC, 0x8FFD, 0x939A, 0x75DB,

+    0x901A, 0x585A, 0x6802, 0x63B4, 0x69FB, 0x4F43, 0x6F2C, 0x67D8,

+    0x8FBB, 0x8526, 0x7DB4, 0x9354, 0x693F, 0x6F70, 0x576A, 0x58F7,

+    0x5B2C, 0x7D2C, 0x722A, 0x540A, 0x91E3, 0x9DB4, 0x4EAD, 0x4F4E,

+    0x505C, 0x5075, 0x5243, 0x8C9E, 0x5448, 0x5824, 0x5B9A, 0x5E1D,

+    0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, 0x608C, 0x62B5, 0x633A, 0x63D0,

+    0x68AF, 0x6C40, 0x7887, 0x798E, 0x7A0B, 0x7DE0, 0x8247, 0x8A02,

+    0x8AE6, 0x8E44, 0x9013, 0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5,

+    0x6458, 0x64E2, 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 0x93D1,

+    0x6EBA, 0x54F2, 0x5FB9, 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178,

+    0x586B, 0x5929, 0x5C55, 0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC,

+    0x8EE2, 0x985B, 0x70B9, 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 0x96FB,

+    0x514E, 0x5410, 0x5835, 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597,

+    0x675C, 0x6E21, 0x767B, 0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D,

+    0x7825, 0x783A, 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, 0x5012,

+    0x515A, 0x51AC, 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957,

+    0x5B95, 0x5CF6, 0x5D8B, 0x60BC, 0x6295, 0x642D, 0x6771, 0x6843,

+    0x68BC, 0x68DF, 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 0x71C8,

+    0x5F53, 0x75D8, 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71,

+    0x5230, 0x8463, 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F,

+    0x9003, 0x900F, 0x9419, 0x9676, 0x982D, 0x9A30, 0x95D8, 0x50CD,

+    0x52D5, 0x540C, 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3,

+    0x7AE5, 0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F,

+    0x5F97, 0x5FB3, 0x6D9C, 0x7279, 0x7763, 0x79BF, 0x7BE4, 0x6BD2,

+    0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A,

+    0x9CF6, 0x82EB, 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7,

+    0x6566, 0x6C8C, 0x8C5A, 0x9041, 0x9813, 0x5451, 0x66C7, 0x920D,

+    0x5948, 0x90A3, 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058,

+    0x637A, 0x934B, 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960,

+    0x8EDF, 0x96E3, 0x6C5D, 0x4E8C, 0x5C3C, 0x5F10, 0x8FE9, 0x5302,

+    0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165, 0x5982,

+    0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, 0x6FE1, 0x79B0,

+    0x7962, 0x5BE7, 0x8471, 0x732B, 0x71B1, 0x5E74, 0x5FF5, 0x637B,

+    0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, 0x57DC, 0x56A2,

+    0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, 0x8FB2, 0x8997,

+    0x86A4, 0x5DF4, 0x628A, 0x64AD, 0x8987, 0x6777, 0x6CE2, 0x6D3E,

+    0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC, 0x4FF3, 0x5EC3,

+    0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C, 0x80CC, 0x80BA,

+    0x8F29, 0x914D, 0x500D, 0x57F9, 0x5A92, 0x6885, 0x6973, 0x7164,

+    0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019, 0x877F, 0x79E4,

+    0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, 0x67CF, 0x6CCA,

+    0x767D, 0x7B94, 0x7C95, 0x8236, 0x8584, 0x8FEB, 0x66DD, 0x6F20,

+    0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6, 0x51FD, 0x7BB1, 0x7872,

+    0x7BB8, 0x8087, 0x7B48, 0x6AE8, 0x5E61, 0x808C, 0x7551, 0x7560,

+    0x516B, 0x9262, 0x6E8C, 0x767A, 0x9197, 0x9AEA, 0x4F10, 0x7F70,

+    0x629C, 0x7B4F, 0x95A5, 0x9CE9, 0x567A, 0x5859, 0x86E4, 0x96BC,

+    0x4F34, 0x5224, 0x534A, 0x53CD, 0x53DB, 0x5E06, 0x642C, 0x6591,

+    0x677F, 0x6C3E, 0x6C4E, 0x7248, 0x72AF, 0x73ED, 0x7554, 0x7E41,

+    0x822C, 0x85E9, 0x8CA9, 0x7BC4, 0x91C6, 0x7169, 0x9812, 0x98EF,

+    0x633D, 0x6669, 0x756A, 0x76E4, 0x78D0, 0x8543, 0x86EE, 0x532A,

+    0x5351, 0x5426, 0x5983, 0x5E87, 0x5F7C, 0x60B2, 0x6249, 0x6279,

+    0x62AB, 0x6590, 0x6BD4, 0x6CCC, 0x75B2, 0x76AE, 0x7891, 0x79D8,

+    0x7DCB, 0x7F77, 0x80A5, 0x88AB, 0x8AB9, 0x8CBB, 0x907F, 0x975E,

+    0x98DB, 0x6A0B, 0x7C38, 0x5099, 0x5C3E, 0x5FAE, 0x6787, 0x6BD8,

+    0x7435, 0x7709, 0x7F8E, 0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B,

+    0x9AED, 0x5F66, 0x819D, 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 0x7562,

+    0x7B46, 0x903C, 0x6867, 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C,

+    0x4FF5, 0x5F6A, 0x6A19, 0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868,

+    0x8A55, 0x8C79, 0x5EDF, 0x63CF, 0x75C5, 0x79D2, 0x82D7, 0x9328,

+    0x92F2, 0x849C, 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C,

+    0x7015, 0x8CA7, 0x8CD3, 0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8,

+    0x57E0, 0x592B, 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 0x6016,

+    0x6276, 0x6577, 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150,

+    0x819A, 0x8299, 0x8B5C, 0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644,

+    0x4FAE, 0x64AB, 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 0x5C01,

+    0x6953, 0x98A8, 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45,

+    0x670D, 0x798F, 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255,

+    0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 0x543B, 0x5674, 0x58B3,

+    0x61A4, 0x626E, 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0,

+    0x6587, 0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73,

+    0x5F0A, 0x67C4, 0x4E26, 0x853D, 0x9589, 0x965B, 0x7C73, 0x9801,

+    0x50FB, 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86,

+    0x504F, 0x5909, 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D,

+    0x4FBF, 0x52C9, 0x5A29, 0x5F01, 0x97AD, 0x4FDD, 0x8217, 0x92EA,

+    0x5703, 0x6355, 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF,

+    0x5893, 0x6155, 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023,

+    0x4FF8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5B9D, 0x5CF0, 0x5CEF,

+    0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B, 0x6CD5,

+    0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, 0x840C, 0x84EC,

+    0x8702, 0x8912, 0x8A2A, 0x8C4A, 0x90A6, 0x92D2, 0x98FD, 0x9CF3,

+    0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, 0x59A8, 0x5E3D,

+    0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0, 0x68D2, 0x5192,

+    0x7D21, 0x80AA, 0x81A8, 0x8B00, 0x8C8C, 0x8CBF, 0x927E, 0x9632,

+    0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8, 0x64B2, 0x6734,

+    0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1, 0x6B86, 0x5800,

+    0x5E4C, 0x5954, 0x672C, 0x7FFB, 0x51E1, 0x76C6, 0x6469, 0x78E8,

+    0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, 0x6BCE, 0x54E9,

+    0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, 0x9C52, 0x685D,

+    0x4EA6, 0x4FE3, 0x53C8, 0x62B9, 0x672B, 0x6CAB, 0x8FC4, 0x4FAD,

+    0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80, 0x6F2B, 0x8513, 0x5473,

+    0x672A, 0x9B45, 0x5DF3, 0x7B95, 0x5CAC, 0x5BC6, 0x871C, 0x6E4A,

+    0x84D1, 0x7A14, 0x8108, 0x5999, 0x7C8D, 0x6C11, 0x7720, 0x52D9,

+    0x5922, 0x7121, 0x725F, 0x77DB, 0x9727, 0x9D61, 0x690B, 0x5A7F,

+    0x5A18, 0x51A5, 0x540D, 0x547D, 0x660E, 0x76DF, 0x8FF7, 0x9298,

+    0x9CF4, 0x59EA, 0x725D, 0x6EC5, 0x514D, 0x68C9, 0x7DBF, 0x7DEC,

+    0x9762, 0x9EBA, 0x6478, 0x6A21, 0x8302, 0x5984, 0x5B5F, 0x6BDB,

+    0x731B, 0x76F2, 0x7DB2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ED9,

+    0x76EE, 0x6762, 0x52FF, 0x9905, 0x5C24, 0x623B, 0x7C7E, 0x8CB0,

+    0x554F, 0x60B6, 0x7D0B, 0x9580, 0x5301, 0x4E5F, 0x51B6, 0x591C,

+    0x723A, 0x8036, 0x91CE, 0x5F25, 0x77E2, 0x5384, 0x5F79, 0x7D04,

+    0x85AC, 0x8A33, 0x8E8D, 0x9756, 0x67F3, 0x85AE, 0x9453, 0x6109,

+    0x6108, 0x6CB9, 0x7652, 0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A,

+    0x52C7, 0x53CB, 0x5BA5, 0x5E7D, 0x60A0, 0x6182, 0x63D6, 0x6709,

+    0x67DA, 0x6E67, 0x6D8C, 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5,

+    0x8A98, 0x904A, 0x9091, 0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88,

+    0x4F59, 0x4E0E, 0x8A89, 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 0x5996,

+    0x5BB9, 0x5EB8, 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8,

+    0x6D0B, 0x6EB6, 0x7194, 0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449,

+    0x84C9, 0x8981, 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 0x617E,

+    0x6291, 0x6B32, 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85,

+    0x87BA, 0x88F8, 0x6765, 0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61,

+    0x843D, 0x916A, 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 0x85CD,

+    0x862D, 0x89A7, 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406,

+    0x7483, 0x75E2, 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B,

+    0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 0x5289, 0x6D41, 0x6E9C,

+    0x7409, 0x7559, 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6,

+    0x616E, 0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC,

+    0x5BEE, 0x6599, 0x6881, 0x6DBC, 0x731F, 0x7642, 0x77AD, 0x7A1C,

+    0x7CE7, 0x826F, 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B,

+    0x7DD1, 0x502B, 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8,

+    0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, 0x5841, 0x6D99, 0x7D2F,

+    0x985E, 0x4EE4, 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C,

+    0x73B2, 0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97,

+    0x9F62, 0x66A6, 0x6B74, 0x5217, 0x52A3, 0x70C8, 0x88C2, 0x5EC9,

+    0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F, 0x84EE,

+    0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, 0x8CC2, 0x8DEF,

+    0x9732, 0x52B4, 0x5A41, 0x5ECA, 0x5F04, 0x6717, 0x697C, 0x6994,

+    0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001, 0x807E, 0x874B,

+    0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332, 0x8AD6, 0x502D,

+    0x548C, 0x8A71, 0x6B6A, 0x8CC4, 0x8107, 0x60D1, 0x67A0, 0x9DF2,

+    0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, 0x6900, 0x6E7E,

+    0x7897, 0x8155, 0x5F0C, 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36,

+    0x4E3C, 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 0x4E85, 0x8C6B,

+    0x4E8A, 0x8212, 0x5F0D, 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2,

+    0x4EB0, 0x4EB3, 0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2,

+    0x4ED7, 0x4EDE, 0x4EED, 0x4EDF, 0x4EF7, 0x4F09, 0x4F5A, 0x4F30,

+    0x4F5B, 0x4F5D, 0x4F57, 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98,

+    0x4F7B, 0x4F69, 0x4F70, 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118,

+    0x4FD4, 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, 0x4FD1, 0x4FDA, 0x4FD0,

+    0x4FE4, 0x4FE5, 0x501A, 0x5028, 0x5014, 0x502A, 0x5025, 0x5005,

+    0x4F1C, 0x4FF6, 0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011,

+    0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505A,

+    0x5056, 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2,

+    0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, 0x50ED,

+    0x50E3, 0x50EE, 0x50F9, 0x50F5, 0x5109, 0x5101, 0x5102, 0x5116,

+    0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C, 0x513B,

+    0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8, 0x5169,

+    0x516A, 0x516E, 0x5180, 0x5182, 0x56D8, 0x518C, 0x5189, 0x518F,

+    0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2, 0x51A9,

+    0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, 0x51BD,

+    0x51C5, 0x51C9, 0x51DB, 0x51E0, 0x8655, 0x51E9, 0x51ED, 0x51F0,

+    0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, 0x522A,

+    0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, 0x525E,

+    0x5254, 0x526A, 0x5274, 0x5269, 0x5273, 0x527F, 0x527D, 0x528D,

+    0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8, 0x8FA7, 0x52AC,

+    0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD, 0x52D7, 0x52DE, 0x52E3,

+    0x52E6, 0x98ED, 0x52E0, 0x52F3, 0x52F5, 0x52F8, 0x52F9, 0x5306,

+    0x5308, 0x7538, 0x530D, 0x5310, 0x530F, 0x5315, 0x531A, 0x5323,

+    0x532F, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4E17,

+    0x5349, 0x534D, 0x51D6, 0x535E, 0x5369, 0x536E, 0x5918, 0x537B,

+    0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, 0x53A5, 0x53AE, 0x53B0,

+    0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF, 0x66FC, 0x71EE, 0x53EE,

+    0x53E8, 0x53ED, 0x53FA, 0x5401, 0x543D, 0x5440, 0x542C, 0x542D,

+    0x543C, 0x542E, 0x5436, 0x5429, 0x541D, 0x544E, 0x548F, 0x5475,

+    0x548E, 0x545F, 0x5471, 0x5477, 0x5470, 0x5492, 0x547B, 0x5480,

+    0x5476, 0x5484, 0x5490, 0x5486, 0x54C7, 0x54A2, 0x54B8, 0x54A5,

+    0x54AC, 0x54C4, 0x54C8, 0x54A8, 0x54AB, 0x54C2, 0x54A4, 0x54BE,

+    0x54BC, 0x54D8, 0x54E5, 0x54E6, 0x550F, 0x5514, 0x54FD, 0x54EE,

+    0x54ED, 0x54FA, 0x54E2, 0x5539, 0x5540, 0x5563, 0x554C, 0x552E,

+    0x555C, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555D, 0x5599,

+    0x5580, 0x54AF, 0x558A, 0x559F, 0x557B, 0x557E, 0x5598, 0x559E,

+    0x55AE, 0x557C, 0x5583, 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5,

+    0x55DF, 0x55C4, 0x55DC, 0x55E4, 0x55D4, 0x5614, 0x55F7, 0x5616,

+    0x55FE, 0x55FD, 0x561B, 0x55F9, 0x564E, 0x5650, 0x71DF, 0x5634,

+    0x5636, 0x5632, 0x5638, 0x566B, 0x5664, 0x562F, 0x566C, 0x566A,

+    0x5686, 0x5680, 0x568A, 0x56A0, 0x5694, 0x568F, 0x56A5, 0x56AE,

+    0x56B6, 0x56B4, 0x56C2, 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8,

+    0x56CE, 0x56D1, 0x56D3, 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF,

+    0x5704, 0x5709, 0x5708, 0x570B, 0x570D, 0x5713, 0x5718, 0x5716,

+    0x55C7, 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 0x573B, 0x5740,

+    0x574F, 0x5769, 0x57C0, 0x5788, 0x5761, 0x577F, 0x5789, 0x5793,

+    0x57A0, 0x57B3, 0x57A4, 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4,

+    0x57D2, 0x57D3, 0x580A, 0x57D6, 0x57E3, 0x580B, 0x5819, 0x581D,

+    0x5872, 0x5821, 0x5862, 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D,

+    0x5879, 0x5885, 0x58B9, 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB,

+    0x58B8, 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 0x58D9, 0x58D8,

+    0x58E5, 0x58DC, 0x58E4, 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB,

+    0x58FC, 0x58FD, 0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925,

+    0x592C, 0x592D, 0x5932, 0x5938, 0x593E, 0x7AD2, 0x5955, 0x5950,

+    0x594E, 0x595A, 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969,

+    0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, 0x59C6,

+    0x59E8, 0x59DC, 0x598D, 0x59D9, 0x59DA, 0x5A25, 0x5A1F, 0x5A11,

+    0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35, 0x5A36,

+    0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2, 0x5ABD,

+    0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 0x5AD6, 0x5AFA, 0x5AFB, 0x5B0C,

+    0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, 0x5B43,

+    0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, 0x5B69,

+    0x5B70, 0x5B73, 0x5B75, 0x5B78, 0x6588, 0x5B7A, 0x5B80, 0x5B83,

+    0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, 0x5BE4,

+    0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, 0x5BF3,

+    0x5C05, 0x5C07, 0x5C08, 0x5C0D, 0x5C13, 0x5C20, 0x5C22, 0x5C28,

+    0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53, 0x5C50, 0x5C4F,

+    0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, 0x5C79, 0x5C8C, 0x5C91,

+    0x5C94, 0x599B, 0x5CAB, 0x5CBB, 0x5CB6, 0x5CBC, 0x5CB7, 0x5CC5,

+    0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, 0x5CFA, 0x5CED, 0x5D8C,

+    0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, 0x5D1F, 0x5D1B, 0x5D11,

+    0x5D14, 0x5D22, 0x5D1A, 0x5D19, 0x5D18, 0x5D4C, 0x5D52, 0x5D4E,

+    0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87, 0x5D84, 0x5D82, 0x5DA2,

+    0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90, 0x5DB7, 0x5DBC, 0x5DC9,

+    0x5DCD, 0x5DD3, 0x5DD2, 0x5DD6, 0x5DDB, 0x5DEB, 0x5DF2, 0x5DF5,

+    0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, 0x5E36, 0x5E37, 0x5E44,

+    0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, 0x5E5F, 0x5E62, 0x5E64,

+    0x5E47, 0x5E75, 0x5E76, 0x5E7A, 0x9EBC, 0x5E7F, 0x5EA0, 0x5EC1,

+    0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF, 0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA,

+    0x5EDB, 0x5EE2, 0x5EE1, 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3,

+    0x5EF0, 0x5EF4, 0x5EF8, 0x5EFE, 0x5F03, 0x5F09, 0x5F5D, 0x5F5C,

+    0x5F0B, 0x5F11, 0x5F16, 0x5F29, 0x5F2D, 0x5F38, 0x5F41, 0x5F48,

+    0x5F4C, 0x5F4E, 0x5F2F, 0x5F51, 0x5F56, 0x5F57, 0x5F59, 0x5F61,

+    0x5F6D, 0x5F73, 0x5F77, 0x5F83, 0x5F82, 0x5F7F, 0x5F8A, 0x5F88,

+    0x5F91, 0x5F87, 0x5F9E, 0x5F99, 0x5F98, 0x5FA0, 0x5FA8, 0x5FAD,

+    0x5FBC, 0x5FD6, 0x5FFB, 0x5FE4, 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3,

+    0x5FFF, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600E, 0x6031,

+    0x601B, 0x6015, 0x602B, 0x6026, 0x600F, 0x603A, 0x605A, 0x6041,

+    0x606A, 0x6077, 0x605F, 0x604A, 0x6046, 0x604D, 0x6063, 0x6043,

+    0x6064, 0x6042, 0x606C, 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7,

+    0x6083, 0x609A, 0x6084, 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7,

+    0x608B, 0x60E1, 0x60B8, 0x60E0, 0x60D3, 0x60B4, 0x5FF0, 0x60BD,

+    0x60C6, 0x60B5, 0x60D8, 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7,

+    0x6100, 0x60F4, 0x60FA, 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D,

+    0x610E, 0x6147, 0x613E, 0x6128, 0x6127, 0x614A, 0x613F, 0x613C,

+    0x612C, 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158,

+    0x6159, 0x615A, 0x616B, 0x6174, 0x616F, 0x6165, 0x6171, 0x615F,

+    0x615D, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61AC, 0x6194,

+    0x619A, 0x618A, 0x6191, 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9,

+    0x61F7, 0x61C8, 0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD,

+    0x61E6, 0x61E3, 0x61F6, 0x61FA, 0x61F4, 0x61FF, 0x61FD, 0x61FC,

+    0x61FE, 0x6200, 0x6208, 0x6209, 0x620D, 0x620C, 0x6214, 0x621B,

+    0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233, 0x6241,

+    0x624E, 0x625E, 0x6263, 0x625B, 0x6260, 0x6268, 0x627C, 0x6282,

+    0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, 0x6294,

+    0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, 0x62C8,

+    0x62DC, 0x62CC, 0x62CA, 0x62C2, 0x62C7, 0x629B, 0x62C9, 0x630C,

+    0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, 0x6350,

+    0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, 0x63AB,

+    0x6376, 0x63A3, 0x638F, 0x6389, 0x639F, 0x63B5, 0x636B, 0x6369,

+    0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2, 0x63F6,

+    0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651D,

+    0x6417, 0x6428, 0x640F, 0x6467, 0x646F, 0x6476, 0x644E, 0x652A,

+    0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC, 0x64DA, 0x64D2,

+    0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, 0x64F1, 0x64E7, 0x8209,

+    0x64E0, 0x64E1, 0x62AC, 0x64E3, 0x64EF, 0x652C, 0x64F6, 0x64F4,

+    0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518, 0x651C, 0x6505, 0x6524,

+    0x6523, 0x652B, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754B,

+    0x6548, 0x6556, 0x6555, 0x654D, 0x6558, 0x655E, 0x655D, 0x6572,

+    0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B, 0x659F, 0x65AB, 0x65B7,

+    0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, 0x65D2, 0x65DB, 0x65D9,

+    0x65E0, 0x65E1, 0x65F1, 0x6772, 0x660A, 0x6603, 0x65FB, 0x6773,

+    0x6635, 0x6636, 0x6634, 0x661C, 0x664F, 0x6644, 0x6649, 0x6641,

+    0x665E, 0x665D, 0x6664, 0x6667, 0x6668, 0x665F, 0x6662, 0x6670,

+    0x6683, 0x6688, 0x668E, 0x6689, 0x6684, 0x6698, 0x669D, 0x66C1,

+    0x66B9, 0x66C9, 0x66BE, 0x66BC, 0x66C4, 0x66B8, 0x66D6, 0x66DA,

+    0x66E0, 0x663F, 0x66E6, 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F,

+    0x6716, 0x671E, 0x6726, 0x6727, 0x9738, 0x672E, 0x673F, 0x6736,

+    0x6741, 0x6738, 0x6737, 0x6746, 0x675E, 0x6760, 0x6759, 0x6763,

+    0x6764, 0x6789, 0x6770, 0x67A9, 0x677C, 0x676A, 0x678C, 0x678B,

+    0x67A6, 0x67A1, 0x6785, 0x67B7, 0x67EF, 0x67B4, 0x67EC, 0x67B3,

+    0x67E9, 0x67B8, 0x67E4, 0x67DE, 0x67DD, 0x67E2, 0x67EE, 0x67B9,

+    0x67CE, 0x67C6, 0x67E7, 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840,

+    0x684D, 0x6832, 0x684E, 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877,

+    0x687F, 0x689F, 0x688F, 0x68AD, 0x6894, 0x689D, 0x689B, 0x6883,

+    0x6AAE, 0x68B9, 0x6874, 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D,

+    0x687E, 0x6901, 0x68CA, 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1,

+    0x690C, 0x68CD, 0x68D4, 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904,

+    0x68D7, 0x68E3, 0x6925, 0x68F9, 0x68E0, 0x68EF, 0x6928, 0x692A,

+    0x691A, 0x6923, 0x6921, 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978,

+    0x696B, 0x6954, 0x697E, 0x696E, 0x6939, 0x6974, 0x693D, 0x6959,

+    0x6930, 0x6961, 0x695E, 0x695D, 0x6981, 0x696A, 0x69B2, 0x69AE,

+    0x69D0, 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA,

+    0x69DD, 0x69BB, 0x69C3, 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C,

+    0x6995, 0x69B4, 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 0x69FF, 0x6B0A,

+    0x69F9, 0x69F2, 0x69E7, 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14,

+    0x69EB, 0x6A0A, 0x6A12, 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C,

+    0x6A72, 0x6A36, 0x6A78, 0x6A47, 0x6A62, 0x6A59, 0x6A66, 0x6A48,

+    0x6A38, 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3,

+    0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, 0x6AAC,

+    0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 0x6ADA, 0x6AEA, 0x6AFB, 0x6B05,

+    0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, 0x6B37,

+    0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, 0x6B59,

+    0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 0x6B78, 0x6B79, 0x6B7F, 0x6B80,

+    0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, 0x6BAA,

+    0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC, 0x6BC6,

+    0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 0x6BEB, 0x6BF3, 0x6BEF, 0x9EBE,

+    0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E, 0x6C55,

+    0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, 0x6C7E,

+    0x6C68, 0x6C73, 0x6C92, 0x6C90, 0x6CC4, 0x6CF1, 0x6CD3, 0x6CBD,

+    0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE, 0x6CBA, 0x6CDB,

+    0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, 0x6D36, 0x6D2B, 0x6D3D,

+    0x6D38, 0x6D19, 0x6D35, 0x6D33, 0x6D12, 0x6D0C, 0x6D63, 0x6D93,

+    0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E, 0x6D95, 0x6FE4, 0x6D85,

+    0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7, 0x6DE6, 0x6DB8, 0x6DC6,

+    0x6DEC, 0x6DDE, 0x6DCC, 0x6DE8, 0x6DD2, 0x6DC5, 0x6DFA, 0x6DD9,

+    0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, 0x6E6E, 0x6E2E, 0x6E19,

+    0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, 0x6E2B, 0x6E76, 0x6E4D,

+    0x6E1F, 0x6E43, 0x6E3A, 0x6E4E, 0x6E24, 0x6EFF, 0x6E1D, 0x6E38,

+    0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, 0x6ED3, 0x6EBD, 0x6EAF,

+    0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, 0x6EA5, 0x6EC2, 0x6E9F,

+    0x6F41, 0x6F11, 0x704C, 0x6EEC, 0x6EF8, 0x6EFE, 0x6F3F, 0x6EF2,

+    0x6F31, 0x6EEF, 0x6F32, 0x6ECC, 0x6F3E, 0x6F13, 0x6EF7, 0x6F86,

+    0x6F7A, 0x6F78, 0x6F81, 0x6F80, 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D,

+    0x6F82, 0x6F7C, 0x6F58, 0x6F8E, 0x6F91, 0x6FC2, 0x6F66, 0x6FB3,

+    0x6FA3, 0x6FA1, 0x6FA4, 0x6FB9, 0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5,

+    0x6FEC, 0x6FD4, 0x6FD8, 0x6FF1, 0x6FEE, 0x6FDB, 0x7009, 0x700B,

+    0x6FFA, 0x7011, 0x7001, 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74,

+    0x701D, 0x7018, 0x701F, 0x7030, 0x703E, 0x7032, 0x7051, 0x7063,

+    0x7099, 0x7092, 0x70AF, 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE,

+    0x70DF, 0x70CB, 0x70DD, 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119,

+    0x7165, 0x7155, 0x7188, 0x7166, 0x7162, 0x714C, 0x7156, 0x716C,

+    0x718F, 0x71FB, 0x7184, 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9,

+    0x71BE, 0x71D2, 0x71C9, 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7,

+    0x71F5, 0x71FC, 0x71F9, 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228,

+    0x722D, 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 0x723F, 0x7240,

+    0x7246, 0x724B, 0x7258, 0x7274, 0x727E, 0x7282, 0x7281, 0x7287,

+    0x7292, 0x7296, 0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6,

+    0x72C4, 0x72CE, 0x72D2, 0x72E2, 0x72E0, 0x72E1, 0x72F9, 0x72F7,

+    0x500F, 0x7317, 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F,

+    0x7329, 0x7325, 0x733E, 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A,

+    0x7368, 0x7370, 0x7378, 0x7375, 0x737B, 0x737A, 0x73C8, 0x73B3,

+    0x73CE, 0x73BB, 0x73C0, 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405,

+    0x746F, 0x7425, 0x73F8, 0x7432, 0x743A, 0x7455, 0x743F, 0x745F,

+    0x7459, 0x7441, 0x745C, 0x7469, 0x7470, 0x7463, 0x746A, 0x7476,

+    0x747E, 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1,

+    0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, 0x74F1,

+    0x74F8, 0x74F7, 0x7504, 0x7503, 0x7505, 0x750C, 0x750E, 0x750D,

+    0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, 0x754D,

+    0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564, 0x7567,

+    0x756B, 0x756D, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758A,

+    0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3, 0x75C2,

+    0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1, 0x75CD,

+    0x75CA, 0x75D2, 0x75D9, 0x75E3, 0x75DE, 0x75FE, 0x75FF, 0x75FC,

+    0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, 0x7609,

+    0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630,

+    0x763B, 0x7647, 0x7648, 0x7646, 0x765C, 0x7658, 0x7661, 0x7662,

+    0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670, 0x7672, 0x7676,

+    0x7678, 0x767C, 0x7680, 0x7683, 0x7688, 0x768B, 0x768E, 0x7696,

+    0x7693, 0x7699, 0x769A, 0x76B0, 0x76B4, 0x76B8, 0x76B9, 0x76BA,

+    0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, 0x76E1, 0x76E5, 0x76E7,

+    0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724,

+    0x771E, 0x7725, 0x7726, 0x771B, 0x7737, 0x7738, 0x7747, 0x775A,

+    0x7768, 0x776B, 0x775B, 0x7765, 0x777F, 0x777E, 0x7779, 0x778E,

+    0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, 0x77B6, 0x77B9, 0x77BF,

+    0x77BC, 0x77BD, 0x77BB, 0x77C7, 0x77CD, 0x77D7, 0x77DA, 0x77DC,

+    0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812, 0x7926, 0x7820, 0x792A,

+    0x7845, 0x788E, 0x7874, 0x7886, 0x787C, 0x789A, 0x788C, 0x78A3,

+    0x78B5, 0x78AA, 0x78AF, 0x78D1, 0x78C6, 0x78CB, 0x78D4, 0x78BE,

+    0x78BC, 0x78C5, 0x78CA, 0x78EC, 0x78E7, 0x78DA, 0x78FD, 0x78F4,

+    0x7907, 0x7912, 0x7911, 0x7919, 0x792C, 0x792B, 0x7940, 0x7960,

+    0x7957, 0x795F, 0x795A, 0x7955, 0x7953, 0x797A, 0x797F, 0x798A,

+    0x799D, 0x79A7, 0x9F4B, 0x79AA, 0x79AE, 0x79B3, 0x79B9, 0x79BA,

+    0x79C9, 0x79D5, 0x79E7, 0x79EC, 0x79E1, 0x79E3, 0x7A08, 0x7A0D,

+    0x7A18, 0x7A19, 0x7A20, 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E,

+    0x7A37, 0x7A43, 0x7A57, 0x7A49, 0x7A61, 0x7A62, 0x7A69, 0x9F9D,

+    0x7A70, 0x7A79, 0x7A7D, 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96,

+    0x7AA9, 0x7AC8, 0x7AB0, 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083,

+    0x7AC7, 0x7ACA, 0x7ACD, 0x7ACF, 0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA,

+    0x7ADD, 0x7AE1, 0x7AE2, 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F,

+    0x7B0A, 0x7B06, 0x7B33, 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28,

+    0x7B36, 0x7B50, 0x7B7A, 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45,

+    0x7B75, 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 0x7B6C, 0x7B6E,

+    0x7B9D, 0x7B98, 0x7B9F, 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92,

+    0x7B8F, 0x7B5D, 0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4,

+    0x7BC6, 0x7BDD, 0x7BE9, 0x7C11, 0x7C14, 0x7BE6, 0x7BE5, 0x7C60,

+    0x7C00, 0x7C07, 0x7C13, 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6,

+    0x7C23, 0x7C27, 0x7C2A, 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C,

+    0x7C43, 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, 0x7C5F, 0x7C64,

+    0x7C56, 0x7C65, 0x7C6C, 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD,

+    0x7CA2, 0x7CAB, 0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE,

+    0x7CB9, 0x7CBD, 0x7CC0, 0x7CC5, 0x7CC2, 0x7CD8, 0x7CD2, 0x7CDC,

+    0x7CE2, 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06,

+    0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, 0x7D32,

+    0x7D3F, 0x7D35, 0x7D46, 0x7D73, 0x7D56, 0x7D4E, 0x7D72, 0x7D68,

+    0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F, 0x7D7D,

+    0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD, 0x7DAB,

+    0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 0x7DB8, 0x7D9F, 0x7DB0, 0x7DD8,

+    0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, 0x7E0A,

+    0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, 0x7E22,

+    0x7E46, 0x7E66, 0x7E3B, 0x7E35, 0x7E39, 0x7E43, 0x7E37, 0x7E32,

+    0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, 0x7E79,

+    0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, 0x8FAE,

+    0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 0x7E92, 0x7E90, 0x7E93, 0x7E94,

+    0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A, 0x7F45, 0x7F4C,

+    0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, 0x7F54, 0x7F58, 0x7F5F,

+    0x7F60, 0x7F68, 0x7F69, 0x7F67, 0x7F78, 0x7F82, 0x7F86, 0x7F83,

+    0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, 0x7F9D, 0x7F9A, 0x7FA3,

+    0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, 0x7FB8, 0x8B71, 0x7FC5,

+    0x7FC6, 0x7FCA, 0x7FD5, 0x7FD4, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FF3,

+    0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B, 0x8012, 0x8018, 0x8019,

+    0x801C, 0x8021, 0x8028, 0x803F, 0x803B, 0x804A, 0x8046, 0x8052,

+    0x8058, 0x805A, 0x805F, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070,

+    0x8076, 0x8079, 0x807D, 0x807F, 0x8084, 0x8086, 0x8085, 0x809B,

+    0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, 0x80DB, 0x80E5, 0x80D9,

+    0x80DD, 0x80C4, 0x80DA, 0x80D6, 0x8109, 0x80EF, 0x80F1, 0x811B,

+    0x8129, 0x8123, 0x812F, 0x814B, 0x968B, 0x8146, 0x813E, 0x8153,

+    0x8151, 0x80FC, 0x8171, 0x816E, 0x8165, 0x8166, 0x8174, 0x8183,

+    0x8188, 0x818A, 0x8180, 0x8182, 0x81A0, 0x8195, 0x81A4, 0x81A3,

+    0x815F, 0x8193, 0x81A9, 0x81B0, 0x81B5, 0x81BE, 0x81B8, 0x81BD,

+    0x81C0, 0x81C2, 0x81BA, 0x81C9, 0x81CD, 0x81D1, 0x81D9, 0x81D8,

+    0x81C8, 0x81DA, 0x81DF, 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE,

+    0x8201, 0x8202, 0x8205, 0x8207, 0x820A, 0x820D, 0x8210, 0x8216,

+    0x8229, 0x822B, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825D,

+    0x825A, 0x825F, 0x8264, 0x8262, 0x8268, 0x826A, 0x826B, 0x822E,

+    0x8271, 0x8277, 0x8278, 0x827E, 0x828D, 0x8292, 0x82AB, 0x829F,

+    0x82BB, 0x82AC, 0x82E1, 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3,

+    0x82FA, 0x8393, 0x8303, 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC,

+    0x8309, 0x82D9, 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340,

+    0x8339, 0x8350, 0x8345, 0x832F, 0x832B, 0x8317, 0x8318, 0x8385,

+    0x839A, 0x83AA, 0x839F, 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387,

+    0x838A, 0x837C, 0x83B5, 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8,

+    0x83F4, 0x8413, 0x83EB, 0x83CE, 0x83FD, 0x8403, 0x83D8, 0x840B,

+    0x83C1, 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420,

+    0x83BD, 0x8438, 0x8506, 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A,

+    0x8484, 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 0x8469, 0x8446,

+    0x842C, 0x846F, 0x8479, 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF,

+    0x849F, 0x84D9, 0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6,

+    0x84D6, 0x84A1, 0x8521, 0x84FF, 0x84F4, 0x8517, 0x8518, 0x852C,

+    0x851F, 0x8515, 0x8514, 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548,

+    0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588, 0x8591,

+    0x858A, 0x85A8, 0x856D, 0x8594, 0x859B, 0x85EA, 0x8587, 0x859C,

+    0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9, 0x85D0,

+    0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, 0x860B,

+    0x85FE, 0x85FA, 0x8606, 0x8622, 0x861A, 0x8630, 0x863F, 0x864D,

+    0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, 0x86A9,

+    0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, 0x86B0,

+    0x86C9, 0x8823, 0x86AB, 0x86D4, 0x86DE, 0x86E9, 0x86EC, 0x86DF,

+    0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86FB,

+    0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F, 0x8737,

+    0x873B, 0x8725, 0x8729, 0x871A, 0x8760, 0x875F, 0x8778, 0x874C,

+    0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759, 0x8753, 0x8763,

+    0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, 0x87AF, 0x87CB, 0x87BD,

+    0x87C0, 0x87D0, 0x96D6, 0x87AB, 0x87C4, 0x87B3, 0x87C7, 0x87C6,

+    0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, 0x880D, 0x87FE, 0x87F6,

+    0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821,

+    0x8831, 0x8836, 0x8839, 0x8827, 0x883B, 0x8844, 0x8842, 0x8852,

+    0x8859, 0x885E, 0x8862, 0x886B, 0x8881, 0x887E, 0x889E, 0x8875,

+    0x887D, 0x88B5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88AE, 0x8899,

+    0x88A2, 0x888D, 0x88A4, 0x88B0, 0x88BF, 0x88B1, 0x88C3, 0x88C4,

+    0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, 0x8902, 0x88FC, 0x88F4,

+    0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, 0x8913, 0x8943, 0x891E,

+    0x8925, 0x892A, 0x892B, 0x8941, 0x8944, 0x893B, 0x8936, 0x8938,

+    0x894C, 0x891D, 0x8960, 0x895E, 0x8966, 0x8964, 0x896D, 0x896A,

+    0x896F, 0x8974, 0x8977, 0x897E, 0x8983, 0x8988, 0x898A, 0x8993,

+    0x8998, 0x89A1, 0x89A9, 0x89A6, 0x89AC, 0x89AF, 0x89B2, 0x89BA,

+    0x89BD, 0x89BF, 0x89C0, 0x89DA, 0x89DC, 0x89DD, 0x89E7, 0x89F4,

+    0x89F8, 0x8A03, 0x8A16, 0x8A10, 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25,

+    0x8A36, 0x8A41, 0x8A5B, 0x8A52, 0x8A46, 0x8A48, 0x8A7C, 0x8A6D,

+    0x8A6C, 0x8A62, 0x8A85, 0x8A82, 0x8A84, 0x8AA8, 0x8AA1, 0x8A91,

+    0x8AA5, 0x8AA6, 0x8A9A, 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA,

+    0x8AEB, 0x8AF3, 0x8AE7, 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2,

+    0x8AF7, 0x8ADE, 0x8ADB, 0x8B0C, 0x8B07, 0x8B1A, 0x8AE1, 0x8B16,

+    0x8B10, 0x8B17, 0x8B20, 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E,

+    0x8B28, 0x8B41, 0x8B4C, 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B,

+    0x8B5A, 0x8B6B, 0x8B5F, 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80,

+    0x8B8C, 0x8B8E, 0x8B92, 0x8B93, 0x8B96, 0x8B99, 0x8B9A, 0x8C3A,

+    0x8C41, 0x8C3F, 0x8C48, 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62,

+    0x8C6C, 0x8C78, 0x8C7A, 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D,

+    0x8C8E, 0x8C94, 0x8C7C, 0x8C98, 0x621D, 0x8CAD, 0x8CAA, 0x8CBD,

+    0x8CB2, 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3,

+    0x8CDA, 0x8CFD, 0x8CFA, 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07,

+    0x8D0F, 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 0x8D14, 0x8D16,

+    0x8D67, 0x8D6D, 0x8D71, 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE,

+    0x8DBA, 0x8DCF, 0x8DDA, 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA,

+    0x8DEB, 0x8DDF, 0x8DE3, 0x8DFC, 0x8E08, 0x8E09, 0x8DFF, 0x8E1D,

+    0x8E1E, 0x8E10, 0x8E1F, 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A,

+    0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64, 0x8E60,

+    0x8E2A, 0x8E63, 0x8E55, 0x8E76, 0x8E72, 0x8E7C, 0x8E81, 0x8E87,

+    0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, 0x8E99,

+    0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, 0x8EC5,

+    0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 0x8EFC, 0x8EFB, 0x8EEB, 0x8EFE,

+    0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, 0x8F1F,

+    0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45, 0x8F42,

+    0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 0x8F4E, 0x8F57, 0x8F5C, 0x8F62,

+    0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF, 0x8FB7,

+    0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4, 0x9005,

+    0x8FF9, 0x8FFA, 0x9011, 0x9015, 0x9021, 0x900D, 0x901E, 0x9016,

+    0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8, 0x904F, 0x9050,

+    0x9051, 0x9052, 0x900E, 0x9049, 0x903E, 0x9056, 0x9058, 0x905E,

+    0x9068, 0x906F, 0x9076, 0x96A8, 0x9072, 0x9082, 0x907D, 0x9081,

+    0x9080, 0x908A, 0x9089, 0x908F, 0x90A8, 0x90AF, 0x90B1, 0x90B5,

+    0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102, 0x9112, 0x9119, 0x9132,

+    0x9130, 0x914A, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173,

+    0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, 0x91AB, 0x91AF, 0x91AA,

+    0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, 0x91C9, 0x91CB, 0x91D0,

+    0x91D6, 0x91DF, 0x91E1, 0x91DB, 0x91FC, 0x91F5, 0x91F6, 0x921E,

+    0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, 0x925E, 0x9257, 0x9245,

+    0x9249, 0x9264, 0x9248, 0x9295, 0x923F, 0x924B, 0x9250, 0x929C,

+    0x9296, 0x9293, 0x929B, 0x925A, 0x92CF, 0x92B9, 0x92B7, 0x92E9,

+    0x930F, 0x92FA, 0x9344, 0x932E, 0x9319, 0x9322, 0x931A, 0x9323,

+    0x933A, 0x9335, 0x933B, 0x935C, 0x9360, 0x937C, 0x936E, 0x9356,

+    0x93B0, 0x93AC, 0x93AD, 0x9394, 0x93B9, 0x93D6, 0x93D7, 0x93E8,

+    0x93E5, 0x93D8, 0x93C3, 0x93DD, 0x93D0, 0x93C8, 0x93E4, 0x941A,

+    0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942B, 0x9435,

+    0x9421, 0x943A, 0x9441, 0x9452, 0x9444, 0x945B, 0x9460, 0x9462,

+    0x945E, 0x946A, 0x9229, 0x9470, 0x9475, 0x9477, 0x947D, 0x945A,

+    0x947C, 0x947E, 0x9481, 0x947F, 0x9582, 0x9587, 0x958A, 0x9594,

+    0x9596, 0x9598, 0x9599, 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC,

+    0x95BB, 0x95B9, 0x95BE, 0x95CA, 0x6FF6, 0x95C3, 0x95CD, 0x95CC,

+    0x95D5, 0x95D4, 0x95D6, 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621,

+    0x9628, 0x962E, 0x962F, 0x9642, 0x964C, 0x964F, 0x964B, 0x9677,

+    0x965C, 0x965E, 0x965D, 0x965F, 0x9666, 0x9672, 0x966C, 0x968D,

+    0x9698, 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, 0x96B2, 0x96B0,

+    0x96B4, 0x96B6, 0x96B8, 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD,

+    0x894D, 0x96DC, 0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708,

+    0x9713, 0x970E, 0x9711, 0x970F, 0x9716, 0x9719, 0x9724, 0x972A,

+    0x9730, 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742,

+    0x9749, 0x975C, 0x9760, 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B,

+    0x9771, 0x9779, 0x9785, 0x977C, 0x9781, 0x977A, 0x9786, 0x978B,

+    0x978F, 0x9790, 0x979C, 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4,

+    0x97C3, 0x97C6, 0x97C8, 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2,

+    0x7ADF, 0x97F6, 0x97F5, 0x980F, 0x980C, 0x9838, 0x9824, 0x9821,

+    0x9837, 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, 0x9870,

+    0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, 0x98C4,

+    0x98C3, 0x98C6, 0x98E9, 0x98EB, 0x9903, 0x9909, 0x9912, 0x9914,

+    0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, 0x992E,

+    0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, 0x9951,

+    0x9952, 0x994C, 0x9955, 0x9997, 0x9998, 0x99A5, 0x99AD, 0x99AE,

+    0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED, 0x99EE,

+    0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05, 0x99E2,

+    0x9A19, 0x9A2B, 0x9A37, 0x9A45, 0x9A42, 0x9A40, 0x9A43, 0x9A3E,

+    0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, 0x9A64,

+    0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, 0x9ACF,

+    0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 0x9ADF, 0x9AE2, 0x9AE3, 0x9AE6,

+    0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7, 0x9AFB, 0x9B06,

+    0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23, 0x9B25, 0x9B27, 0x9B28,

+    0x9B29, 0x9B2A, 0x9B2E, 0x9B2F, 0x9B32, 0x9B44, 0x9B43, 0x9B4F,

+    0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74, 0x9B93, 0x9B83, 0x9B91,

+    0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, 0x9BB4, 0x9BC0, 0x9BCA,

+    0x9BB9, 0x9BC6, 0x9BCF, 0x9BD1, 0x9BD2, 0x9BE3, 0x9BE2, 0x9BE4,

+    0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, 0x9BF0, 0x9C15, 0x9C14,

+    0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, 0x9C12, 0x9C0A, 0x9C04,

+    0x9C2E, 0x9C1B, 0x9C25, 0x9C24, 0x9C21, 0x9C30, 0x9C47, 0x9C32,

+    0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, 0x9C76, 0x9C78, 0x9CE7,

+    0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB, 0x9D03, 0x9D06, 0x9D2A,

+    0x9D26, 0x9DAF, 0x9D23, 0x9D1F, 0x9D44, 0x9D15, 0x9D12, 0x9D41,

+    0x9D3F, 0x9D3E, 0x9D46, 0x9D48, 0x9D5D, 0x9D5E, 0x9D64, 0x9D51,

+    0x9D50, 0x9D59, 0x9D72, 0x9D89, 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A,

+    0x9D9A, 0x9DA4, 0x9DA9, 0x9DB2, 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8,

+    0x9DBA, 0x9DC6, 0x9DCF, 0x9DC2, 0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6,

+    0x9DED, 0x9DEF, 0x9DFD, 0x9E1A, 0x9E1B, 0x9E1E, 0x9E75, 0x9E79,

+    0x9E7D, 0x9E81, 0x9E88, 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91,

+    0x9E9D, 0x9EA5, 0x9EA9, 0x9EB8, 0x9EAA, 0x9EAD, 0x9761, 0x9ECC,

+    0x9ECE, 0x9ECF, 0x9ED0, 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0,

+    0x9EE5, 0x9EE8, 0x9EEF, 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB,

+    0x9EFC, 0x9EFD, 0x9F07, 0x9F08, 0x76B7, 0x9F15, 0x9F21, 0x9F2C,

+    0x9F3E, 0x9F4A, 0x9F52, 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61,

+    0x9F66, 0x9F67, 0x9F6C, 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95,

+    0x9F9C, 0x9FA0, 0x582F, 0x69C7, 0x9059, 0x7464, 0x2642, 0x2500,

+    0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508,

+    0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510,

+    0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518,

+    0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520,

+    0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528,

+    0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530,

+    0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538,

+    0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540,

+    0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548,

+    0x2549, 0x254A, 0x254B, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464,

+    0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A, 0x246B, 0x246C,

+    0x246D, 0x246E, 0x246F, 0x2470, 0x2471, 0x2472, 0x2473, 0x2160,

+    0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,

+    0x2169, 0x3349, 0x3314, 0x3322, 0x334D, 0x3318, 0x3327, 0x3303,

+    0x3336, 0x3351, 0x3357, 0x330D, 0x3326, 0x3323, 0x332B, 0x334A,

+    0x333B, 0x339C, 0x339D, 0x339E, 0x338E, 0x338F, 0x33C4, 0x33A1,

+    0x301D, 0x301F, 0x2116, 0x33CD, 0x2121, 0x32A4, 0x32A5, 0x32A6,

+    0x32A7, 0x32A8, 0x3231, 0x3232, 0x3239, 0x337E, 0x337D, 0x337C,

+    0x222E, 0x2211, 0x221A, 0x22A5, 0x2220, 0x221F, 0x22BF, 0x2229,

+    0x222A, 0x555E, 0x98F4, 0x6EA2, 0x9C2F, 0x6DEB, 0x8FC2, 0x6B1D,

+    0x53A9, 0x958F, 0x5642, 0x990C, 0x7130, 0x8956, 0x9DD7, 0x8FE6,

+    0x6062, 0x62D0, 0x6666, 0x559D, 0x845B, 0x9784, 0x5699, 0x6F97,

+    0x7FF0, 0x7FEB, 0x5FBD, 0x7947, 0x4FE0, 0x537F, 0x50C5, 0x8EC0,

+    0x55B0, 0x6ADB, 0x5C51, 0x9774, 0x7941, 0x6167, 0x7A3D, 0x7E6B,

+    0x834A, 0x9699, 0x5026, 0x5ACC, 0x6372, 0x9E7C, 0x8AFA, 0x5DF7,

+    0x663B, 0x6E9D, 0x9EB4, 0x9D60, 0x7511, 0x91C7, 0x698A, 0x6805,

+    0x85A9, 0x9BD6, 0x9306, 0x73CA, 0x53F1, 0x5C62, 0x906E, 0x6753,

+    0x707C, 0x7E61, 0x914B, 0x66D9, 0x6E1A, 0x85AF, 0x85F7, 0x54E8,

+    0x5EE0, 0x68A2, 0x8523, 0x91AC, 0x9798, 0x8755, 0x9771, 0x9017,

+    0x7FE0, 0x647A, 0x901D, 0x87EC, 0x64B0, 0x6813, 0x714E, 0x717D,

+    0x8A6E, 0x564C, 0x9061, 0x5275, 0x6414, 0x7626, 0x905C, 0x9A52,

+    0x817F, 0x9EDB, 0x5544, 0x6FEF, 0x7422, 0x86F8, 0x5DFD, 0x8FBF,

+    0x68DA, 0x9C48, 0x6A3D, 0x7C1E, 0x8A3B, 0x7026, 0x51CB, 0x6357,

+    0x69CC, 0x939A, 0x585A, 0x6451, 0x912D, 0x64E2, 0x6EBA, 0x5861,

+    0x985A, 0x5835, 0x5C60, 0x83DF, 0x8CED, 0x5858, 0x79B1, 0x9D07,

+    0x7006, 0x701E, 0x5678, 0x9041, 0x9813, 0x90A3, 0x8B0E, 0x7058,

+    0x6962, 0x79B0, 0x56CA, 0x724C, 0x9019, 0x79E4, 0x525D, 0x7BB8,

+    0x6F51, 0x91B1, 0x633D, 0x6249, 0x6A0B, 0x67CA, 0x7A17, 0x903C,

+    0x5A9B, 0x8B2C, 0x5EDF, 0x7015, 0x983B, 0x853D, 0x77A5, 0x5A29,

+    0x5E96, 0x6CE1, 0x84EC, 0x9830, 0x9C52, 0x9EB5, 0x5132, 0x9905,

+    0x7C7E, 0x9453, 0x6108, 0x7652, 0x7337, 0x7194, 0x8000, 0x840A,

+    0x907C, 0x6F23, 0x7149, 0x84EE, 0x6994, 0x881F, 0x5154, 0x5189,

+    0x5195, 0x51A4, 0x5539, 0x5533, 0x55E4, 0x5632, 0x56A5, 0x580B,

+    0x5ABE, 0x5BC3, 0x5C5B, 0x5E64, 0x6097, 0x6369, 0x6406, 0x6522,

+    0x6583, 0x67A6, 0x67B4, 0x689B, 0x688E, 0x6E6E, 0x71D7, 0x7228,

+    0x73CE, 0x7504, 0x750D, 0x7515, 0x7693, 0x787C, 0x7A31, 0x9F9D,

+    0x7B99, 0x7C90, 0x7CAE, 0x7D9B, 0x7DAE, 0x7D9F, 0x7FD4, 0x822E,

+    0x828D, 0x82D2, 0x8323, 0x8375, 0x8517, 0x853E, 0x8782, 0x87D2,

+    0x890A, 0x89AF, 0x8ADE, 0x8B41, 0x8DDA, 0x8E09, 0x8F13, 0x8FEA,

+    0x8FE9, 0x9058, 0x6248, 0x91C1, 0x95BB, 0x7762, 0x9724, 0x9760,

+    0x976D, 0x9824, 0x9B2E, 0x9B97, 0x9BF2, 0x9EAA, 0x9F9C, 0x3001,

+    0x3002, 0x203E, 0xFF3F, 0x30FC, 0x2015, 0x2010, 0x301C, 0x2016,

+    0xFF5C, 0x2026, 0x2025, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B,

+    0xFF3D, 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C,

+    0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0xFF1D, 0x3041, 0x3043,

+    0x3045, 0x3047, 0x3049, 0x3063, 0x3083, 0x3085, 0x3087, 0x308E,

+    0x30A1, 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30C3, 0x30E3, 0x30E5,

+    0x30E7, 0x30EE, 0x30F5, 0x30F6, 0x3349, 0x3314, 0x3322, 0x334D,

+    0x3318, 0x3327, 0x3303, 0x3336, 0x3351, 0x3357, 0x330D, 0x3326,

+    0x3323, 0x332B, 0x334A, 0x333B, 0x301D, 0x301E, 0x3094, 0x304B,

+    0x3051, 0x82A6, 0x8328, 0x5653, 0x53A9, 0x7259, 0x6C72, 0x7B08,

+    0x9957, 0x62F3, 0x9910, 0x976D, 0x717D, 0x7A7F, 0x7BAD, 0x63C3,

+    0x83DF, 0x7962, 0x53DB, 0x7BC7, 0x8FC4, 0x7C3E, 0x50CA, 0x5315,

+    0x55A9, 0x56AE, 0x5819, 0x591B, 0x5C28, 0x5ED0, 0x5ECF, 0x6241,

+    0x66C1, 0x6C08, 0x6E23, 0x6EEC, 0x7A97, 0x7BDD, 0x7FE9, 0x8422,

+    0x8759, 0x880E, 0x87D2, 0x9A19, 0x9EAD, 0xFFE4, 0xFF07, 0xFF02,

+    0x11A8, 0x25C1, 0x25B7, 0x21E9, 0x21E7, 0x21E6, 0x21E8, 0x25A2,

+    0x2667, 0x2661, 0x2664, 0x2662, 0x33A0, 0x33A2, 0x33A4, 0x33A5,

+    0x3397, 0x2113, 0x3398, 0x33B3, 0x33B2, 0x33B1, 0x33B0, 0x3385,

+    0x3386, 0x3387, 0x33CB, 0x3390, 0x33D4, 0x3396, 0x3322, 0x3316,

+    0x3318, 0x3315, 0x3303, 0x3323, 0x3357, 0x3342, 0x3339, 0x333B,

+    0x3300, 0x3331, 0x3347, 0x331E, 0x332A, 0x33CD, 0x337F, 0x2121,

+    0x260E, 0x3036, 0x3020, 0x00A9, 0x00AE, 0x0000, 0x2488, 0x2489,

+    0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2474,

+    0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C,

+    0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484,

+    0x2485, 0x2486, 0x2487, 0x3251, 0x2170, 0x2171, 0x2172, 0x2173,

+    0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x3252, 0x3253,

+    0x3254, 0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325A, 0x325B,

+    0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, 0x24A2, 0x24A3,

+    0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA, 0x24AB,

+    0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3,

+    0x24B4, 0x24B5, 0x3243, 0x323D, 0x323F, 0x3234, 0x3238, 0x3233,

+    0x323C, 0x3242, 0x323E, 0x3236, 0x3235, 0x323B, 0x3240, 0x323A,

+    0x32B0, 0x32AD, 0x32A9, 0x32AF, 0x3294, 0x32AA, 0x3298, 0x32AB,

+    0x3292, 0x3291, 0x3293, 0x32AC, 0x32AE, 0x3296, 0x23A9, 0x23A8,

+    0x23A7, 0xFE38, 0x23AD, 0x23AC, 0x23AB, 0xFE38, 0x23AB, 0x23AC,

+    0x23AD, 0xFE38, 0x23A7, 0x23A8, 0x23A9, 0xFE38, 0x33CC, 0x3305,

+    0x00BD, 0x00BC, 0x339F, 0x33A3, 0x33A6, 0xFFFD, 0xFFFD, 0x329E,

+    0x3388, 0x3389, 0x33C8, 0x222D, 0x5370, 0x3230, 0x322A, 0x322B,

+    0x322C, 0x322D, 0x322E, 0x322F, 0x3237, 0x3241, 0x27A1, 0x21E6,

+    0x21E7, 0x21E9, 0x25C9, 0x2660, 0x2665, 0x2663, 0x2666, 0x2600,

+    0x2601, 0x2602, 0x2603, 0x261E, 0x261C, 0x261D, 0x261F, 0x3299,

+    0x24EA, 0x216A, 0x216B, 0xFF10, 0xFF10, 0x3000, 0x2581, 0x2582,

+    0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258F, 0x258E,

+    0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x2594, 0x2595, 0x256D,

+    0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, 0x25E2,

+    0x25E3, 0x25E5, 0x25E4, 0x25CF, 0x0ED0, 0x2571, 0x2572, 0x2573,

+    0x304B, 0x3051, 0x9022, 0x8FBB, 0xFF0C, 0x00B0, 0x3013, 0x309C,

+    0x309B, 0x02CF, 0xFF0E, 0x2018, 0x2019, 0x201C, 0x201D, 0x201C,

+    0x201E, 0x2018, 0x201A, 0x02BA, 0x51DC, 0x7199, 0x2776, 0x2777,

+    0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x0000,

+    0x0000, 0x0000, 0x217A, 0x217B, 0x0000, 0x0000, 0x0000, 0x217F,

+    0x210A, 0x2109, 0x0000, 0x0000, 0x3004, 0x21C6, 0x21C4, 0x21C5,

+    0x0000, 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x5927, 0x5C0F, 0x329D,

+    0x63A7, 0x0000, 0x0000, 0x337B, 0x337F, 0x0000, 0x0000, 0x3333,

+    0x334E, 0x3322, 0x3316, 0x3305, 0x3305, 0x3305, 0x3333, 0x334E,

+    0x334E, 0x334E, 0x3303, 0x3318, 0x3315, 0x3339, 0x3339, 0x3339,

+    0x3357, 0x3342, 0x3342, 0x3342, 0x3323, 0x333B, 0x3300, 0x331E,

+    0x331E, 0x331E, 0x332A, 0x332A, 0x332A, 0x3347, 0x3331, 0x7E8A,

+    0x891C, 0x9348, 0x9288, 0x84DC, 0x4FC9, 0x70BB, 0x6631, 0x68C8,

+    0x92F9, 0x66FB, 0x5F45, 0x4E28, 0x4EE1, 0x4EFC, 0x4F00, 0x4F03,

+    0x4F39, 0x4F56, 0x4F92, 0x4F8A, 0x4F9A, 0x4F94, 0x4FCD, 0x5040,

+    0x5022, 0x4FFF, 0x501E, 0x5046, 0x5070, 0x5042, 0x5094, 0x50F4,

+    0x50D8, 0x514A, 0x5164, 0x519D, 0x51BE, 0x51EC, 0x5215, 0x529C,

+    0x52A6, 0x52C0, 0x52DB, 0x5300, 0x5307, 0x5324, 0x5372, 0x5393,

+    0x53B2, 0x53DD, 0xFA0E, 0x549C, 0x548A, 0x54A9, 0x54FF, 0x5586,

+    0x5759, 0x5765, 0x57AC, 0x57C8, 0x57C7, 0xFA0F, 0xFA10, 0x589E,

+    0x58B2, 0x590B, 0x5953, 0x595B, 0x595D, 0x5963, 0x59A4, 0x59BA,

+    0x5B56, 0x5BC0, 0x752F, 0x5BD8, 0x5BEC, 0x5C1E, 0x5CA6, 0x5CBA,

+    0x5CF5, 0x5D27, 0x5D53, 0xFA11, 0x5D42, 0x5D6D, 0x5DB8, 0x5DB9,

+    0x5DD0, 0x5F21, 0x5F34, 0x5F67, 0x5FB7, 0x5FDE, 0x605D, 0x6085,

+    0x608A, 0x60DE, 0x60D5, 0x6120, 0x60F2, 0x6111, 0x6137, 0x6130,

+    0x6198, 0x6213, 0x62A6, 0x63F5, 0x6460, 0x649D, 0x64CE, 0x654E,

+    0x6600, 0x6615, 0x6609, 0x662E, 0x661E, 0x6624, 0x6665, 0x6657,

+    0x6659, 0xFA12, 0x6673, 0x6699, 0x66A0, 0x66B2, 0x66BF, 0x66FA,

+    0x670E, 0xF929, 0x6766, 0x67BB, 0x6852, 0x67C0, 0x6801, 0x6844,

+    0x68CF, 0xFA13, 0x6968, 0xFA14, 0x6998, 0x69E2, 0x6A30, 0x6A6B,

+    0x6A46, 0x6A73, 0x6A7E, 0x6AE2, 0x6AE4, 0x6BD6, 0x6C3F, 0x6C5C,

+    0x6C86, 0x6C6F, 0x6CDA, 0x6D04, 0x6D87, 0x6D6F, 0x6D96, 0x6DAC,

+    0x6DCF, 0x6DF8, 0x6DF2, 0x6DFC, 0x6E39, 0x6E5C, 0x6E27, 0x6E3C,

+    0x6EBF, 0x6F88, 0x6FB5, 0x6FF5, 0x7005, 0x7007, 0x7028, 0x7085,

+    0x70AB, 0x710F, 0x7104, 0x715C, 0x7146, 0x7147, 0xFA15, 0x71C1,

+    0x71FE, 0x72B1, 0x72BE, 0x7324, 0xFA16, 0x7377, 0x73BD, 0x73C9,

+    0x73D6, 0x73E3, 0x73D2, 0x7407, 0x73F5, 0x7426, 0x742A, 0x7429,

+    0x742E, 0x7462, 0x7489, 0x749F, 0x7501, 0x756F, 0x7682, 0x769C,

+    0x769E, 0x769B, 0x76A6, 0xFA17, 0x7746, 0x52AF, 0x7821, 0x784E,

+    0x7864, 0x787A, 0x7930, 0xFA18, 0xFA19, 0xFA1A, 0x7994, 0xFA1B,

+    0x799B, 0x7AD1, 0x7AE7, 0xFA1C, 0x7AEB, 0x7B9E, 0xFA1D, 0x7D48,

+    0x7D5C, 0x7DB7, 0x7DA0, 0x7DD6, 0x7E52, 0x7F47, 0x7FA1, 0xFA1E,

+    0x8301, 0x8362, 0x837F, 0x83C7, 0x83F6, 0x8448, 0x84B4, 0x8553,

+    0x8559, 0x856B, 0xFA1F, 0x85B0, 0xFA20, 0xFA21, 0x8807, 0x88F5,

+    0x8A12, 0x8A37, 0x8A79, 0x8AA7, 0x8ABE, 0x8ADF, 0xFA22, 0x8AF6,

+    0x8B53, 0x8B7F, 0x8CF0, 0x8CF4, 0x8D12, 0x8D76, 0xFA23, 0x8ECF,

+    0xFA24, 0xFA25, 0x9067, 0x90DE, 0xFA26, 0x9115, 0x9127, 0x91DA,

+    0x91D7, 0x91DE, 0x91ED, 0x91EE, 0x91E4, 0x91E5, 0x9206, 0x9210,

+    0x920A, 0x923A, 0x9240, 0x923C, 0x924E, 0x9259, 0x9251, 0x9239,

+    0x9267, 0x92A7, 0x9277, 0x9278, 0x92E7, 0x92D7, 0x92D9, 0x92D0,

+    0xFA27, 0x92D5, 0x92E0, 0x92D3, 0x9325, 0x9321, 0x92FB, 0xFA28,

+    0x931E, 0x92FF, 0x931D, 0x9302, 0x9370, 0x9357, 0x93A4, 0x93C6,

+    0x93DE, 0x93F8, 0x9431, 0x9445, 0x9448, 0x9592, 0xF9DC, 0xFA29,

+    0x969D, 0x96AF, 0x9733, 0x973B, 0x9743, 0x974D, 0x974F, 0x9751,

+    0x9755, 0x9857, 0x9865, 0xFA2A, 0xFA2B, 0x9927, 0xFA2C, 0x999E,

+    0x9A4E, 0x9AD9, 0x9ADC, 0x9B75, 0x9B72, 0x9B8F, 0x9BB1, 0x9BBB,

+    0x9C00, 0x9D70, 0x9D6B, 0xFA2D, 0x9E19, 0x9ED1, 0x00AC, 0x005C,

+    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,

+    0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,

+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,

+    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,

+    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,

+    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,

+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,

+    0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F,

+    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,

+    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,

+    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,

+    0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC,

+    0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044,

+    0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01,

+    0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022, 0x201A,

+    0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301, 0x0302,

+    0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B, 0x0328,

+    0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, 0x00BA,

+    0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9,

+    0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9,

+    0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4,

+    0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD,

+    0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,

+    0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE,

+    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8,

+    0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0,

+    0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F9,

+    0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178,

+    0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x2002, 0x0021,

+    0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029,

+    0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,

+    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,

+    0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,

+    0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,

+    0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,

+    0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,

+    0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,

+    0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,

+    0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,

+    0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,

+    0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0xFF40, 0x2032, 0x00A8,

+    0x2036, 0x00C4, 0x00F9, 0x00E9, 0x00ED, 0x00DF, 0x00E7, 0x00C7,

+    0x00D1, 0x00F1, 0x00A2, 0x00A3, 0x00F3, 0x00FA, 0x00A1, 0x00BF,

+    0x00BD, 0x00D6, 0x00DC, 0x00E4, 0x00EB, 0x00EF, 0x00F6, 0x00DC,

+    0x00E2, 0x00EA, 0x00EE, 0x00F4, 0x00FC, 0x00E0, 0x00E9, 0x00E1,

+    0x007E, 0x0030, 0x00AC, 0x005C, 0xFF60, 0xFF61, 0xFF62, 0xFF63,

+    0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69, 0xFF6A, 0xFF6B,

+    0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71, 0xFF72, 0xFF73,

+    0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79, 0xFF7A, 0xFF7B,

+    0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81, 0xFF82, 0xFF83,

+    0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B,

+    0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91, 0xFF92, 0xFF93,

+    0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B,

+    0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, 0x30F0, 0x30F1, 0x30EE, 0x30AB,

+    0x30B1, 0x30F4, 0x30AC, 0x30AE, 0x30B0, 0x30B2, 0x30B4, 0x30B6,

+    0x30B8, 0x30BA, 0x30BC, 0x30BE, 0x30C0, 0x30C2, 0x30C5, 0x30C7,

+    0x30C9, 0x30D0, 0x30D1, 0x30D3, 0x30D4, 0x30D6, 0x30D7, 0x30D9,

+    0x30DA, 0x30DC, 0x30DD, 0xFF60, 0x3092, 0x3041, 0x3043, 0x3045,

+    0x3047, 0x3049, 0x3083, 0x3085, 0x3087, 0x3063, 0x3042, 0x3044,

+    0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,

+    0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,

+    0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,

+    0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,

+    0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,

+    0x308D, 0x308F, 0x3093, 0x3090, 0x3091, 0x308E, 0x304C, 0x304E,

+    0x3050, 0x3052, 0x3054, 0x3056, 0x3068, 0x305A, 0x305C, 0x305E,

+    0x3060, 0x3062, 0x3065, 0x3067, 0x3069, 0x3070, 0x3071, 0x3073,

+    0x3074, 0x3076, 0x3077, 0x3079, 0x307A, 0x307C, 0x307D, 0x301D,

+    0x301E, 0x005B, 0x005D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300E,

+    0x300F, 0x3010, 0x3011, 0x2012, 0xFF60, 0x2500, 0x2501, 0x2502,

+    0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A,

+    0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512,

+    0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A,

+    0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522,

+    0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A,

+    0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532,

+    0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A,

+    0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542,

+    0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A,

+    0x254B, 0x25B2, 0x20AC, 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03,

+    0xFB04, 0x0101, 0x012B, 0x016B, 0x0113, 0x014D, 0x0100, 0x012A,

+    0x016A, 0x0112, 0x014C, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153,

+    0x2154, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079,

+    0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,

+    0x2088, 0x2089, 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, 0x0000,

+    0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B,

+    0x0000, 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, 0x0000, 0x01D4,

+    0x016F, 0x0169, 0x0251, 0x0251, 0x0251, 0x01FD, 0x00E6, 0x0254,

+    0x0254, 0x0254, 0x0259, 0x0259, 0x0259, 0x025A, 0x025A, 0x025A,

+    0x025B, 0x025B, 0x025B, 0x006A, 0x014B, 0x0275, 0x028C, 0x028C,

+    0x028C, 0x0292, 0x0283, 0x02D0, 0x0020, 0x0021, 0x0022, 0x0023,

+    0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B,

+    0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033,

+    0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B,

+    0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043,

+    0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B,

+    0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053,

+    0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B,

+    0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063,

+    0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,

+    0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073,

+    0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B,

+    0x00A6, 0x007D, 0x0303, 0x02BC, 0x005C, 0x02BB, 0x007C, 0x007E,

+    0x00A1, 0x00A2, 0x00A3, 0x2044, 0x0192, 0x00A7, 0x00A4, 0x201C,

+    0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021,

+    0x00B7, 0x00B6, 0x2022, 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026,

+    0x2030, 0x00BF, 0x0301, 0x0302, 0x00AF, 0x0306, 0x0307, 0x0308,

+    0x030A, 0x00B8, 0x030B, 0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA,

+    0x0141, 0x00D8, 0x0152, 0x00BA, 0x00E6, 0x0131, 0x0142, 0x00F8,

+    0x0153, 0x00DF, 0x002D, 0x00A9, 0x00AC, 0x00AE, 0x00B0, 0x00B1,

+    0x00B2, 0x00B3, 0x00B5, 0x00B9, 0x00BC, 0x00BD, 0x00BE, 0x00C0,

+    0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C7, 0x00C8, 0x00C9,

+    0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1,

+    0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA,

+    0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3,

+    0x00E4, 0x00E5, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC,

+    0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4,

+    0x00F5, 0x00F6, 0x00F7, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD,

+    0x00FE, 0x00FF, 0x0160, 0x0178, 0x017D, 0x0305, 0x0161, 0x2122,

+    0x017E, 0x0030, 0x20AC, 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03,

+    0xFB04, 0x0101, 0x012B, 0x016B, 0x0113, 0x014D, 0x0100, 0x012A,

+    0x016A, 0x0112, 0x014C, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153,

+    0x2154, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079,

+    0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,

+    0x2088, 0x2089, 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, 0x0000,

+    0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B,

+    0x0000, 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, 0x0000, 0x01D4,

+    0x016F, 0x0169, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,

+    0x0036, 0x0037, 0x0038, 0x0039, 0x0336, 0x002D, 0x003D, 0x002C,

+    0x0028, 0x0029, 0x002E, 0x002F, 0x003A, 0x003B, 0x0030, 0x0031,

+    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,

+    0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F,

+    0x003A, 0x003B, 0x00B7, 0x20AC, 0x0000, 0x2153, 0x2154, 0x00BE,

+    0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215A, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x215B, 0x215C, 0x215D, 0x215E,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,

+    0x0038, 0x0039, 0x0030, 0x2163, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2170, 0x2171,

+    0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179,

+    0x217A, 0x217B, 0x0000, 0x0000, 0x0000, 0x2160, 0x2161, 0x2162,

+    0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A,

+    0x216B, 0x0000, 0x0000, 0x0000, 0x0041, 0x0042, 0x0043, 0x0044,

+    0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,

+    0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,

+    0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044,

+    0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,

+    0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,

+    0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,

+    0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,

+    0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,

+    0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4,

+    0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3,

+    0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4,

+    0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,

+    0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1,

+    0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,

+    0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x3220, 0x3221,

+    0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x55B6, 0x5408, 0x6CEB, 0x554F, 0x7B54, 0x4F8B,

+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,

+    0x0038, 0x0039, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,

+    0x0036, 0x0037, 0x0038, 0x0039, 0x3063, 0x624D, 0x3007, 0x4E00,

+    0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D,

+    0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D,

+    0x4E03, 0x516B, 0x4E5D, 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09,

+    0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x3064, 0x624D,

+    0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B,

+    0x4E5D, 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94,

+    0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x30B3, 0x3063, 0x30C3,

+    0x30A9, 0x0000, 0x0000, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464,

+    0x2465, 0x2466, 0x2467, 0x2468, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x24D0, 0x24D1, 0x24D2, 0x24D3, 0x24D4, 0x24D5, 0x24D6,

+    0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, 0x24DC, 0x24DD, 0x24DE,

+    0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, 0x24E4, 0x24E5, 0x24E6,

+    0x24E7, 0x24E8, 0x24E9, 0x24B6, 0x24B7, 0x24B8, 0x24B9, 0x24BA,

+    0x24BB, 0x24BC, 0x24BD, 0x24BE, 0x24BF, 0x24C0, 0x24C1, 0x24C2,

+    0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, 0x24C8, 0x24C9, 0x24CA,

+    0x24CB, 0x24CC, 0x24CD, 0x24CE, 0x24CF, 0x3042, 0x3044, 0x3046,

+    0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055,

+    0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066,

+    0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072,

+    0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082,

+    0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D,

+    0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x32D0, 0x32D1, 0x32D2,

+    0x32D3, 0x32D4, 0x32D5, 0x32D6, 0x32D7, 0x32D8, 0x32D9, 0x32DA,

+    0x32DB, 0x32DC, 0x32DD, 0x32DE, 0x32DF, 0x32E0, 0x32E1, 0x32E2,

+    0x32E3, 0x32E4, 0x32E5, 0x32E6, 0x32E7, 0x32E8, 0x32E9, 0x32EA,

+    0x32EB, 0x32EC, 0x32ED, 0x32EE, 0x32EF, 0x32F0, 0x32F1, 0x32F2,

+    0x32F3, 0x32F4, 0x32F5, 0x32F6, 0x32F7, 0x32F8, 0x32F9, 0x32FA,

+    0x32FB, 0x32FC, 0x32FD, 0x32FE, 0x30F3, 0x3280, 0x3281, 0x3282,

+    0x3283, 0x3284, 0x3285, 0x3286, 0x3287, 0x3288, 0x3289, 0x3290,

+    0x328A, 0x328B, 0x328C, 0x328D, 0x328E, 0x328F, 0x8ABF, 0x329F,

+    0x526F, 0x6E1B, 0x6A19, 0x6B20, 0x57FA, 0x7981, 0x32A0, 0x32A1,

+    0x329B, 0x329A, 0x32A3, 0x32A2, 0x3297, 0x51FA, 0x329C, 0x3295,

+    0x6E08, 0x5897, 0x554F, 0x7B54, 0x4F8B, 0x96FB, 0x25CC, 0x0030,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063,

+    0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,

+    0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073,

+    0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041,

+    0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,

+    0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,

+    0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,

+    0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D,

+    0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D,

+    0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C,

+    0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E,

+    0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089,

+    0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092,

+    0x3093, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD,

+    0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD,

+    0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC,

+    0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE,

+    0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9,

+    0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2,

+    0x30F3, 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F,

+    0x554F, 0x7B54, 0x4F8B, 0x25CF, 0x0030, 0x0000, 0x0031, 0x0000,

+    0x0032, 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035, 0x0000,

+    0x0036, 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,

+    0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D,

+    0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075,

+    0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043,

+    0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B,

+    0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053,

+    0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042,

+    0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051,

+    0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061,

+    0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E,

+    0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080,

+    0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B,

+    0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2,

+    0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1,

+    0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1,

+    0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE,

+    0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0,

+    0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB,

+    0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x65E5,

+    0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x8CA0, 0x52DD,

+    0x554F, 0x7B54, 0x4F8B, 0x25A1, 0x25A1, 0x0030, 0x0000, 0x0031,

+    0x0000, 0x0032, 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035,

+    0x0000, 0x0036, 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064,

+    0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C,

+    0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,

+    0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042,

+    0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A,

+    0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052,

+    0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A,

+    0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F,

+    0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F,

+    0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D,

+    0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F,

+    0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A,

+    0x308B, 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093,

+    0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF,

+    0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF,

+    0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD,

+    0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF,

+    0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA,

+    0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3,

+    0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F,

+    0x7B54, 0x4F8B, 0x25A0, 0x0030, 0x0000, 0x0031, 0x0000, 0x0032,

+    0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035, 0x0000, 0x0036,

+    0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,

+    0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,

+    0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,

+    0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043, 0x0044,

+    0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,

+    0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,

+    0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044,

+    0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,

+    0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,

+    0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,

+    0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,

+    0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,

+    0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4,

+    0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3,

+    0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4,

+    0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,

+    0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1,

+    0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,

+    0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x65E5, 0x6708,

+    0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F, 0x7B54, 0x4F8B,

+    0x0030, 0x0000, 0x0031, 0x0000, 0x0032, 0x0000, 0x0033, 0x0000,

+    0x0034, 0x0000, 0x0035, 0x0000, 0x0036, 0x0000, 0x0037, 0x0000,

+    0x0038, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061,

+    0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,

+    0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,

+    0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,

+    0x007A, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,

+    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,

+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,

+    0x0058, 0x0059, 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A,

+    0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059,

+    0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A,

+    0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078,

+    0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086,

+    0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3090,

+    0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA,

+    0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9,

+    0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA,

+    0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8,

+    0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6,

+    0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0,

+    0x30F1, 0x30F2, 0x30F3, 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728,

+    0x91D1, 0x571F, 0x554F, 0x7B54, 0x4F8B, 0x25A0, 0x33C2, 0x33CD,

+    0x2116, 0x0000, 0x33D8, 0x33DA, 0x2121, 0x2122, 0x0000, 0x2100,

+    0x33C2, 0x0000, 0x33C4, 0x2105, 0x3397, 0x3371, 0x3398, 0x2113,

+    0x338D, 0x339B, 0x3396, 0x0000, 0x0000, 0x33D7, 0x33D8, 0x0000,

+    0x0000, 0x0000, 0x3301, 0x3302, 0x3304, 0x3306, 0x0000, 0x3308,

+    0x0000, 0x3307, 0x330A, 0x0000, 0x3309, 0x0000, 0x330B, 0x0000,

+    0x330C, 0x330E, 0x330F, 0x3310, 0x3311, 0x3312, 0x3313, 0x0000,

+    0x3317, 0x0000, 0x3319, 0x0000, 0x331A, 0x331B, 0x331C, 0x331D,

+    0x331F, 0x3320, 0x3321, 0x3324, 0x0000, 0x3325, 0x0000, 0x0000,

+    0x3328, 0x3329, 0x0000, 0x332D, 0x0000, 0x0000, 0x332E, 0x332F,

+    0x3330, 0x3332, 0x0000, 0x0000, 0x3334, 0x3335, 0x333C, 0x0000,

+    0x0000, 0x0000, 0x3337, 0x0000, 0x3338, 0x333A, 0x333D, 0x3341,

+    0x333E, 0x333F, 0x3340, 0x3343, 0x3344, 0x3345, 0x3346, 0x3348,

+    0x334B, 0x334C, 0x334F, 0x3350, 0x0000, 0x0000, 0x3352, 0x3354,

+    0x0000, 0x0000, 0x3353, 0x3355, 0x3356, 0x0000, 0x3301, 0x3302,

+    0x3304, 0x3306, 0x0000, 0x3308, 0x0000, 0x3307, 0x330A, 0x0000,

+    0x3309, 0x0000, 0x330B, 0x0000, 0x330C, 0x330E, 0x330F, 0x3310,

+    0x3311, 0x3312, 0x3313, 0x0000, 0x3317, 0x0000, 0x3319, 0x0000,

+    0x331A, 0x331B, 0x331C, 0x331D, 0x331F, 0x3320, 0x3321, 0x3324,

+    0x0000, 0x3325, 0x0000, 0x0000, 0x3328, 0x3329, 0x0000, 0x332D,

+    0x0000, 0x0000, 0x332E, 0x332F, 0x3330, 0x3332, 0x0000, 0x0000,

+    0x3334, 0x3335, 0x333C, 0x0000, 0x0000, 0x0000, 0x3337, 0x0000,

+    0x3338, 0x333A, 0x333D, 0x3341, 0x333E, 0x333F, 0x3340, 0x3343,

+    0x3344, 0x3345, 0x3346, 0x3348, 0x334B, 0x334C, 0x334F, 0x3350,

+    0x0000, 0x0000, 0x3352, 0x3354, 0x0000, 0x0000, 0x3353, 0x3355,

+    0x3356, 0x337E, 0x337D, 0x337C, 0x337B, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x002D,

+    0x003D, 0x2103, 0x2640, 0x2642, 0x3013, 0x3012, 0x300C, 0x300D,

+    0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF08, 0xFF09,

+    0x301D, 0x301E, 0x2018, 0x2019, 0x201C, 0x201D, 0x0027, 0x0022,

+    0x0000, 0x2135, 0x03D0, 0x220A, 0x210F, 0x00B5, 0x03C6, 0x03DB,

+    0x03D1, 0xFFFD, 0x2668, 0x2669, 0x266C, 0xFF1A, 0x00A9, 0x00A9,

+    0x00AE, 0x00AE, 0x303B, 0x303B, 0x3033, 0x3034, 0x3035, 0x203C,

+    0x2049, 0x0021, 0x203C, 0x2049, 0x244A, 0x0000, 0x2213, 0x2260,

+    0x2243, 0x2272, 0x2273, 0x300C, 0x300D, 0x300E, 0x300F, 0x301A,

+    0x301B, 0x3018, 0x3019, 0xFF5F, 0xFF60, 0x300C, 0x300D, 0x300E,

+    0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF5F, 0xFF60, 0x239B,

+    0x239D, 0x239E, 0x23A0, 0x239D, 0x239B, 0x23A0, 0x239E, 0x23A1,

+    0x23A3, 0x23A4, 0x23A6, 0x23A3, 0x23A1, 0x23A6, 0x23A4, 0x23A1,

+    0x23A3, 0x23A4, 0x23A6, 0x23A3, 0x23A1, 0x23A6, 0x23A4, 0xFF5C,

+    0x2015, 0x301D, 0x301E, 0x2018, 0x2019, 0x2018, 0x2019, 0x2702,

+    0x2702, 0x2702, 0x2702, 0x303D, 0x3012, 0x309F, 0x534D, 0x2207,

+    0x2205, 0x22A0, 0x2296, 0x2298, 0x2295, 0x2297, 0x229E, 0x2295,

+    0x0021, 0x25B3, 0x25C0, 0x25B6, 0x21E6, 0x21E8, 0x21E7, 0x21E9,

+    0x21D0, 0x2194, 0x2198, 0x2199, 0x2196, 0x2197, 0x21CC, 0x21C6,

+    0x21C4, 0x21C5, 0x2190, 0x2192, 0x2191, 0x2193, 0x2194, 0x2195,

+    0x2504, 0x2506, 0x3030, 0x2307, 0x3030, 0x2307, 0x3030, 0x2307,

+    0x3030, 0x2307, 0x3030, 0x2307, 0x2740, 0x273F, 0x25A1, 0x25A0,

+    0x25A1, 0x25A1, 0x25A1, 0x25A1, 0x25A1, 0x25AB, 0x25A0, 0x25AA,

+    0x271A, 0x271A, 0x25C7, 0x25C6, 0x25C7, 0x25C7, 0x25C7, 0x25C7,

+    0x25C7, 0x25C6, 0x25C6, 0x25CE, 0x25C9, 0x25CB, 0x25E6, 0x25CF,

+    0x2022, 0x2756, 0x2756, 0x2756, 0x2756, 0x3008, 0x3009, 0x3008,

+    0x3009, 0x300A, 0x300B, 0x300A, 0x300B, 0x3053, 0x3053, 0x30B3,

+    0x30B3, 0x309D, 0x309E, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045,

+    0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304B, 0x304C,

+    0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3051, 0x3052, 0x3053,

+    0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A,

+    0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062,

+    0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A,

+    0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072,

+    0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A,

+    0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082,

+    0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A,

+    0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092,

+    0x3093, 0x3094, 0x30FD, 0x30FE, 0x30FC, 0x30A1, 0x30A2, 0x30A3,

+    0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30F5,

+    0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30F6, 0x30B1,

+    0x30B2, 0x30B3, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8,

+    0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0,

+    0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8,

+    0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0,

+    0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8,

+    0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0,

+    0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8,

+    0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0,

+    0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA,

+    0x309D, 0x309E, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046,

+    0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304B, 0x304C, 0x304D,

+    0x304E, 0x304F, 0x3050, 0x3051, 0x3051, 0x3052, 0x3053, 0x3053,

+    0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B,

+    0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063,

+    0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B,

+    0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073,

+    0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B,

+    0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083,

+    0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B,

+    0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093,

+    0x3094, 0x30FD, 0x30FE, 0x30FC, 0x30A1, 0x30A2, 0x30A3, 0x30A4,

+    0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30F5, 0x30AB,

+    0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30F6, 0x30B1, 0x30B2,

+    0x30B3, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9,

+    0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1,

+    0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9,

+    0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1,

+    0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9,

+    0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1,

+    0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9,

+    0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1,

+    0x30F2, 0x30F3, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x3001,

+    0x3002, 0x30FB, 0xFF0A, 0x203B, 0x25CB, 0x25CE, 0x25C9, 0x25B3,

+    0x25B2, 0x30FD, 0x30FE, 0x309D, 0x309E, 0xFF08, 0xFF09, 0x3014,

+    0x3015, 0xFF08, 0xFF09, 0x3014, 0x3015, 0x0030, 0x0031, 0x0032,

+    0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x3041,

+    0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049,

+    0x304A, 0x304B, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050,

+    0x3051, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,

+    0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,

+    0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,

+    0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,

+    0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,

+    0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,

+    0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,

+    0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,

+    0x3090, 0x3091, 0x3092, 0x3093, 0x3094, 0x3041, 0x3043, 0x3045,

+    0x3047, 0x3049, 0x304B, 0x3051, 0x3063, 0x3083, 0x3085, 0x3087,

+    0x308E, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7,

+    0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30F5, 0x30AC, 0x30AD, 0x30AE,

+    0x30AF, 0x30B0, 0x30B1, 0x30F6, 0x30B2, 0x30B3, 0x30B4, 0x30B5,

+    0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD,

+    0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5,

+    0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD,

+    0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5,

+    0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD,

+    0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5,

+    0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED,

+    0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30A1,

+    0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30F5, 0x30F6, 0x30C3, 0x30E3,

+    0x30E5, 0x30E7, 0x30EE, 0x30FC, 0x30FC, 0x6CE8, 0x20AC, 0x2126,

+    0x2032, 0x2033, 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, 0x016B,

+    0x0113, 0x014D, 0x0100, 0x012A, 0x016A, 0x0112, 0x014C, 0x215B,

+    0x215C, 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, 0x2074, 0x2075,

+    0x2076, 0x2077, 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083,

+    0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A,

+    0x0000, 0x1EBC, 0x01CF, 0x0000, 0x0128, 0x01D1, 0x0000, 0x01D3,

+    0x016E, 0x0168, 0x01CE, 0x011B, 0x0000, 0x1EBD, 0x01D0, 0x0000,

+    0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, 0x0169, 0x0251, 0x0251,

+    0x0251, 0x01FD, 0x00E6, 0x0254, 0x0254, 0x0254, 0x0259, 0x0259,

+    0x0259, 0x025A, 0x025A, 0x025A, 0x025B, 0x025B, 0x025B, 0x006A,

+    0x014B, 0x0275, 0x028C, 0x028C, 0x028C, 0x0292, 0x0283, 0x02D0,

+    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,

+    0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,

+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,

+    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,

+    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,

+    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,

+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,

+    0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F,

+    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,

+    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,

+    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,

+    0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC,

+    0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044,

+    0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01,

+    0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022, 0x201A,

+    0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301, 0x0302,

+    0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B, 0x0328,

+    0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, 0x00BA,

+    0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9,

+    0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9,

+    0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4,

+    0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD,

+    0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,

+    0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE,

+    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8,

+    0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0,

+    0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F9,

+    0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178,

+    0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x20AC, 0x2126,

+    0x2032, 0x2033, 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, 0x016B,

+    0x0113, 0x014D, 0x0100, 0x012A, 0x016A, 0x0112, 0x014C, 0x215B,

+    0x215C, 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, 0x2074, 0x2075,

+    0x2076, 0x2077, 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083,

+    0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A,

+    0x0000, 0x1EBC, 0x01CF, 0x0000, 0x0128, 0x01D1, 0x0000, 0x01D3,

+    0x016E, 0x0168, 0x01CE, 0x011B, 0x0000, 0x1EBD, 0x01D0, 0x0000,

+    0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, 0x0169, 0x0030, 0x0031,

+    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,

+    0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F,

+    0x003A, 0x003B, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,

+    0x0036, 0x0037, 0x0038, 0x0039, 0x0336, 0x002D, 0x003D, 0x002C,

+    0x0028, 0x0029, 0x002E, 0x002F, 0x003A, 0x003B, 0x00B7, 0x002D,

+    0x003D, 0x2103, 0x2640, 0x2642, 0x3013, 0x3012, 0x300C, 0x300D,

+    0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF08, 0xFF09,

+    0x301D, 0x301E, 0x2018, 0x2019, 0x201C, 0x201D, 0x0027, 0x0022,

+    0x9038, 0x8B01, 0x7DE3, 0x9EC3, 0x6EAB, 0x798D, 0x6094, 0x6D77,

+    0x6168, 0x6982, 0x6E34, 0x8910, 0x6F22, 0x5668, 0x65E2, 0x7948,

+    0x865B, 0x97FF, 0x52E4, 0x8B39, 0x63ED, 0x64CA, 0x784F, 0x7A40,

+    0x6BBA, 0x7949, 0x8996, 0x716E, 0x793E, 0x8005, 0x81ED, 0x795D,

+    0x6691, 0x7F72, 0x6D89, 0x72C0, 0x613C, 0x771E, 0x7BC0, 0x7956,

+    0x50E7, 0x5C64, 0x5DE2, 0x618E, 0x8D08, 0x537D, 0x5606, 0x8457,

+    0x5FB5, 0x61F2, 0x93AD, 0x798E, 0x9B2D, 0x7A81, 0x96E3, 0x6885,

+    0x7E41, 0x6669, 0x5351, 0x7891, 0x8CD3, 0x654F, 0x4FAE, 0x5002,

+    0x5840, 0x52C9, 0x6B65, 0x58A8, 0x6BCF, 0x514D, 0x623E, 0x7950,

+    0x6B04, 0x9686, 0x865C, 0x6DDA, 0x985E, 0x66C6, 0x6B77, 0x7DF4,

+    0x934A, 0x5ECA, 0x9304, 0x6982, 0x51B4, 0x634C, 0x86DB, 0x9089,

+    0x9022, 0x5049, 0x7DEF, 0x9055, 0x53A9, 0x990C, 0x885B, 0x5EF6,

+    0x6CBF, 0x925B, 0x7FC1, 0x82BD, 0x96C5, 0x5BB3, 0x6168, 0x6982,

+    0x6BBB, 0x6562, 0x8CAB, 0x5DCC, 0x9811, 0x5E30, 0x8ECC, 0x7AAE,

+    0x5747, 0x5091, 0x7A74, 0x5065, 0x5EFA, 0x9237, 0x6A8E, 0x4EA4,

+    0x516C, 0x66F4, 0x6821, 0x786C, 0x7D5E, 0x8003, 0x8CFC, 0x964D,

+    0x62F7, 0x7F6A, 0x4F7F, 0x53F2, 0x59C9, 0x8B1D, 0x90AA, 0x53CE,

+    0x8F2F, 0x67D4, 0x77AC, 0x821C, 0x696F, 0x677E, 0x8A1F, 0x4E08,

+    0x57F4, 0x690D, 0x8077, 0x89AA, 0x9042, 0x636E, 0x6442, 0x8239,

+    0x7DCF, 0x8061, 0x50CF, 0x8A95, 0x6065, 0x5146, 0x773A, 0x8074,

+    0x8DF3, 0x5EAD, 0x5EF7, 0x8247, 0x6843, 0x9003, 0x6D3E, 0x6392,

+    0x8F29, 0x73ED, 0x9812, 0x60B2, 0x6249, 0x6590, 0x7DCB, 0x8AB9,

+    0x8CA7, 0x7236, 0x847A, 0x5206, 0x5674, 0x61A4, 0x7C89, 0x7D1B,

+    0x96F0, 0x853D, 0x4FBF, 0x6367, 0x76C6, 0x685D, 0x8108, 0x8036,

+    0x7FFC, 0x540F, 0x96A3, 0x9E9F, 0x9E97, 0x806F, 0x807E, 0x6E7E,

+    0x5085, 0x5193, 0x51DB, 0x5315, 0x5340, 0x96D9, 0x55A9, 0x56C1,

+    0x570D, 0x58AB, 0x59DA, 0x5A36, 0x5ABE, 0x5D4E, 0x5D87, 0x5DC9,

+    0x5DD3, 0x5F2D, 0x5F98, 0x60D8, 0x613D, 0x61FE, 0x6268, 0x62CF,

+    0x651D, 0x640F, 0x64F2, 0x655D, 0x665F, 0x67A9, 0x67E7, 0x696B,

+    0x6930, 0x69A7, 0x6A44, 0x6A90, 0x6C08, 0x6C13, 0x6E23, 0x6F11,

+    0x6EFE, 0x6F3E, 0x71FF, 0x73E5, 0x7432, 0x745F, 0x74E0, 0x750C,

+    0x7672, 0x792A, 0x78D4, 0x79BA, 0x7A19, 0x7A95, 0x7CF2, 0x7D73,

+    0x7DDD, 0x7E35, 0x7FAE, 0x7FE1, 0x805A, 0x805F, 0x8073, 0x8070,

+    0x8076, 0x8153, 0x818A, 0x81B5, 0x81CD, 0x83F2, 0x8555, 0x85D5,

+    0x871A, 0x8836, 0x889E, 0x88D8, 0x88F4, 0x892B, 0x893B, 0x896A,

+    0x896F, 0x8A1D, 0x8D05, 0x8D0F, 0x9F4E, 0x8E91, 0x8EA1, 0x9052,

+    0x900E, 0x9130, 0x9156, 0x9158, 0x9165, 0x9173, 0x9172, 0x91A2,

+    0x91AF, 0x91AA, 0x91B4, 0x91BA, 0x9477, 0x9698, 0x973D, 0x9760,

+    0x9771, 0x980C, 0x9873, 0x98C3, 0x9A45, 0x9B4D, 0x9B58, 0x9BC6,

+    0x9BE1, 0x9BF1, 0x9D48, 0x9DCF, 0x9F08, 0x6271, 0x6697, 0x610F,

+    0x8863, 0x9055, 0x907A, 0x78EF, 0x54E1, 0x2ED7, 0x2EBD, 0x53A9,

+    0x74DC, 0x904B, 0x990C, 0x885E, 0x92B3, 0x95B1, 0x5EF6, 0x63F4,

+    0x6CBF, 0x7159, 0x9060, 0x925B, 0x65BC, 0x5F80, 0x7FC1, 0x5378,

+    0x97F3, 0x5316, 0x82B1, 0x83D3, 0x8CA8, 0x904E, 0x82BD, 0x96C5,

+    0x9913, 0x5EFB, 0x7070, 0x5BB3, 0x6168, 0x6168, 0x6168, 0x69EA,

+    0x6982, 0x676E, 0x89D2, 0x9694, 0x5272, 0x8F44, 0x938C, 0x82C5,

+    0x5BD2, 0x74B0, 0x7DE9, 0x7F36, 0x9084, 0x9592, 0x97D3, 0x8218,

+    0x5371, 0x559C, 0x3402, 0x3402, 0x5E7E, 0x65E3, 0x671F, 0x6A5F,

+    0x8D77, 0x98E2, 0x5409, 0x55AB, 0x8650, 0x9006, 0x53CA, 0x5438,

+    0x6025, 0x7D1A, 0x5DE8, 0x62D2, 0x8DDD, 0x9B5A, 0x9B5A, 0x537F,

+    0x5F3A, 0x6050, 0x69C1, 0x6A4B, 0x6A4B, 0x9115, 0x97FF, 0x9957,

+    0x6681, 0x2EA9, 0x8FD1, 0x5036, 0x77E9, 0x5177, 0x865E, 0x7A7A,

+    0x9047, 0x6ADB, 0x5553, 0x5951, 0x6075, 0x6167, 0x8FCE, 0x5091,

+    0x6F54, 0x7A74, 0x2EBC, 0x2EBC, 0x517C, 0x5238, 0x61B2, 0x6743,

+    0x80A9, 0x8B19, 0x9063, 0x539F, 0x8A01, 0x6236, 0x96C7, 0x9867,

+    0x5433, 0x5A1B, 0x8AA4, 0x5DE5, 0x614C, 0x6285, 0x63A7, 0x69CB,

+    0x6D69, 0x6E2F, 0x8015, 0x8154, 0x8352, 0x8B1B, 0x8CFC, 0x543F,

+    0x9177, 0x8170, 0x7511, 0x8FBC, 0x4ECA, 0x9396, 0x5EA7, 0x5F69,

+    0x63A1, 0x6B72, 0x83DC, 0x51B4, 0x54B2, 0x524A, 0x7522, 0x9910,

+    0x59FF, 0x59FF, 0x5DFF, 0x8AEE, 0x8AEE, 0x8CC7, 0x8CC7, 0x6B21,

+    0x6B21, 0x6ECB, 0x73BA, 0x53F1, 0x6368, 0x659C, 0x90AA, 0x52FA,

+    0x7235, 0x7235, 0x914C, 0x5F31, 0x4E3B, 0x53D7, 0x6388, 0x5468,

+    0x7D42, 0x7FD2, 0x8846, 0x9031, 0x4F4F, 0x8853, 0x8FF0, 0x5DE1,

+    0x9075, 0x9075, 0x6240, 0x66F8, 0x5973, 0x52DD, 0x5546, 0x5BB5,

+    0x5C06, 0x2E8C, 0x2E8D, 0x5C19, 0x6D88, 0x785D, 0x8096, 0x4E08,

+    0x5B82, 0x57CE, 0x60C5, 0x57F4, 0x98FE, 0x690D, 0x6B96, 0x98DF,

+    0x98E0, 0x2EDE, 0x378D, 0x4FB5, 0x2E97, 0x6D78, 0x771F, 0x9032,

+    0x4EBB, 0x4EBA, 0x5203, 0x5C0B, 0x8A0A, 0x8A0A, 0x8FC5, 0x8870,

+    0x9042, 0x351F, 0x52E2, 0x6210, 0x76DB, 0x8056, 0x8980, 0x8AA0,

+    0x8ACB, 0x975C, 0x975C, 0x7A05, 0x8106, 0x96BB, 0x7C4D, 0x7BC0,

+    0x8AAA, 0x96EA, 0x7D76, 0x6247, 0x6F98, 0x7FA1, 0x8239, 0x9078,

+    0x9077, 0x524D, 0x5168, 0x6383, 0x63F7, 0x7626, 0x8D70, 0x9001,

+    0x906D, 0x9020, 0x2ECA, 0x901F, 0x8CCA, 0x5C0A, 0x5C0A, 0x59A5,

+    0x6CF0, 0x9000, 0x902E, 0x968A, 0x9BDB, 0x5927, 0x3427, 0x7027,

+    0x9054, 0x812B, 0x4E39, 0x6B4E, 0x70AD, 0x8A95, 0x6696, 0x5024,

+    0x7F6E, 0x7BC9, 0x2EAE, 0x7B51, 0x9010, 0x67F1, 0x6CE8, 0x99D0,

+    0x5F6B, 0x5FB5, 0x61F2, 0x671D, 0x6F6E, 0x8ABF, 0x76F4, 0x6715,

+    0x6715, 0x589C, 0x8FFD, 0x901A, 0x576A, 0x91E3, 0x5448, 0x5E1D,

+    0x7A0B, 0x7684, 0x9069, 0x8FED, 0x6DFB, 0x514E, 0x9014, 0x783A,

+    0x5721, 0x571F, 0x51AC, 0x5510, 0x7CD6, 0x85E4, 0x8B04, 0x9003,

+    0x900F, 0x9A30, 0x5C0E, 0x9053, 0x5451, 0x3B88, 0x5167, 0x8089,

+    0x4E73, 0x5FCD, 0x8A8D, 0x5BE7, 0x7D0D, 0x8987, 0x6D3E, 0x80BA,

+    0x535A, 0x8584, 0x8FEB, 0x7E1B, 0x8087, 0x4E37, 0x6F51, 0x91B1,

+    0x4F34, 0x5224, 0x534A, 0x5E06, 0x7554, 0x6669, 0x8543, 0x907F,

+    0x5FAE, 0x9F3B, 0x5339, 0x2EAA, 0x5F65, 0x59EC, 0x59EB, 0x8A55,

+    0x5E99, 0x75C5, 0x5A66, 0x6577, 0x6D6E, 0x8CA0, 0x8CA0, 0x670D,

+    0x8986, 0x4E19, 0x5E63, 0x5E73, 0x5F0A, 0x8511, 0x504F, 0x7DE8,

+    0x8FD4, 0x904D, 0x7C3F, 0x5305, 0x5D29, 0x62B1, 0x670B, 0x7832,

+    0x7E2B, 0x80DE, 0x840C, 0x90A6, 0x90A6, 0x98FD, 0x9D6C, 0x4EA1,

+    0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x671B, 0x671B, 0x5192, 0x6469,

+    0x7FFB, 0x51E1, 0x78E8, 0x9B54, 0x2FC7, 0x69D9, 0x685D, 0x4FE3,

+    0x53C8, 0x7E6D, 0x9EBF, 0x8108, 0x660E, 0x76DF, 0x8FF7, 0x5984,

+    0x52D0, 0x76F2, 0x8017, 0x623E, 0x7D0B, 0x9580, 0x7D04, 0x8E8D,

+    0x687A, 0x687A, 0x6801, 0x6109, 0x8AED, 0x8F38, 0x52C7, 0x6709,

+    0x7336, 0x7336, 0x7337, 0x88D5, 0x904A, 0x66DC, 0x2EB7, 0x8981,

+    0x990A, 0x7FCC, 0x7FFC, 0x8EB6, 0x862D, 0x7387, 0x9F8D, 0x9F8D,

+    0x65C5, 0x6881, 0x71D0, 0x96A3, 0x9C57, 0x9E9F, 0x7C7B, 0x5EC9,

+    0x6190, 0x9023, 0x6717, 0x8002, 0x8107, 0x50CA, 0x511A, 0x5154,

+    0x5195, 0x2E87, 0x528D, 0x52D7, 0x52F9, 0x5349, 0x353E, 0x53DF,

+    0x66FC, 0x5533, 0x55E4, 0x5455, 0x56C0, 0x5939, 0x5A1C, 0x5AC2,

+    0x5B73, 0x5BC3, 0x5C14, 0x37E2, 0x5CE6, 0x5E54, 0x4E48, 0x5EE3,

+    0x6097, 0x62D4, 0x62CC, 0x641C, 0x63C6, 0x6428, 0x8209, 0x631B,

+    0x665F, 0x665F, 0x6663, 0x66F5, 0x675E, 0x689D, 0x688D, 0x69F6,

+    0x6961, 0x5BE8, 0x5BE8, 0x69BB, 0x6BCC, 0x6F11, 0x6E17, 0x6F98,

+    0x6CAA, 0x6CAA, 0x701B, 0x7162, 0x723B, 0x4E2C, 0x731C, 0x74CA,

+    0x74EF, 0x7575, 0x75EC, 0x764E, 0x3FB1, 0x776A, 0x77A9, 0x7940,

+    0x7953, 0x7953, 0x9F4B, 0x79AE, 0x9083, 0x7B53, 0x7C11, 0x7C14,

+    0x4264, 0x7C50, 0x7C58, 0x7D46, 0x7D63, 0x7E22, 0x7E22, 0x7E48,

+    0x7E35, 0x7E43, 0x7E8C, 0x7F50, 0x7F51, 0x7F51, 0x7F51, 0x7FC5,

+    0x7FC6, 0x7FE9, 0x8141, 0x4453, 0x8258, 0x8279, 0x2EBF, 0x2EC0,

+    0x82E3, 0x5179, 0x83A2, 0x8420, 0x83BD, 0x84F4, 0x856D, 0x8587,

+    0x85F4, 0x4E55, 0x8737, 0x873B, 0x8805, 0x87BD, 0x867D, 0x8836,

+    0x8944, 0x88C6, 0x89BD, 0x8ADB, 0x8B3E, 0x8B5A, 0x8D73, 0x8D99,

+    0x8DCB, 0x8E34, 0x8E4A, 0x8FEF, 0x9087, 0x8FFA, 0x901E, 0x9035,

+    0x9050, 0x8FC8, 0x9081, 0x908A, 0x908A, 0x908A, 0x908A, 0x908A,

+    0x908A, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089,

+    0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x92CF, 0x93DD, 0x95BC,

+    0x9621, 0x96B2, 0x975C, 0x9839, 0x98EB, 0x9903, 0x9909, 0x9945,

+    0x9945, 0x994B, 0x9A08, 0x9A5F, 0x9A65, 0x9AEF, 0x9B18, 0x9BDF,

+    0x9D09, 0x9D08, 0x9EA5, 0x9ECC, 0x9F08, 0x9F4A, 0x9F63, 0x9F67,

+    0x9F6C, 0x7199, 0x7199, 0x891C, 0x68C8, 0x66FB, 0x5F45, 0x5300,

+    0x5389, 0x5953, 0xFA11, 0x6852, 0x6A73, 0x6D87, 0xFA15, 0x8A12,

+    0x4E04, 0x4E05, 0x4E1F, 0x4E2B, 0x4E2F, 0x4E30, 0x4E40, 0x4E41,

+    0x4E44, 0x4E5A, 0x4E7F, 0x4E8D, 0x4E96, 0x4EB9, 0x4ED0, 0x4EE0,

+    0x4EFD, 0x4EFF, 0x4F0B, 0x4F15, 0x4F60, 0x4F3B, 0x4F49, 0x4F54,

+    0x4F7A, 0x4F7D, 0x4F7E, 0x4F97, 0x4FBE, 0x4FCF, 0x4FFD, 0x5000,

+    0x5001, 0x5010, 0x501B, 0x5027, 0x502E, 0x5057, 0x5066, 0x506A,

+    0x503B, 0x508F, 0x5096, 0x509C, 0x50CC, 0x50E6, 0x50E9, 0x50EF,

+    0x5108, 0x510B, 0x5110, 0x511B, 0x511E, 0x515F, 0x51A1, 0x51BC,

+    0x51DE, 0x51EE, 0x51F4, 0x5201, 0x5202, 0x5213, 0x5249, 0x5261,

+    0x5266, 0x5293, 0x52C8, 0x52F0, 0x530A, 0x530B, 0x533E, 0x534C,

+    0x534B, 0x5361, 0x536C, 0x53AB, 0x53DA, 0x53E6, 0x53F5, 0x5427,

+    0x544D, 0x5466, 0x546B, 0x5474, 0x548D, 0x5496, 0x54A1, 0x54AD,

+    0x54B9, 0x54BF, 0x54C6, 0x54CD, 0x550E, 0x552B, 0x5535, 0x554A,

+    0x5560, 0x5561, 0x5588, 0x558E, 0x5608, 0x560E, 0x560F, 0x5637,

+    0x563F, 0x5649, 0x564B, 0x564F, 0x5666, 0x5669, 0x566F, 0x5671,

+    0x5672, 0x5695, 0x569A, 0x56AC, 0x56AD, 0x56B1, 0x56C9, 0x56DD,

+    0x56E4, 0x570A, 0x5715, 0x5723, 0x572F, 0x5733, 0x5734, 0x574C,

+    0x5770, 0x578C, 0x579C, 0x57B8, 0x57E6, 0x57ED, 0x57F5, 0x57F6,

+    0x57FF, 0x5809, 0x5820, 0x5832, 0x587C, 0x5880, 0x58A9, 0x58CE,

+    0x58D0, 0x58D4, 0x58DA, 0x58E9, 0x590C, 0x5924, 0x592F, 0x5961,

+    0x596D, 0x59CA, 0x59D2, 0x59DD, 0x59E3, 0x59E4, 0x5A04, 0x5A0C,

+    0x5A23, 0x5A47, 0x5A55, 0x5A63, 0x5A6D, 0x5A7E, 0x5A9E, 0x5AA7,

+    0x5AAC, 0x5AB3, 0x5AE0, 0x5B00, 0x5B19, 0x5B25, 0x5B2D, 0x5B41,

+    0x5B7C, 0x5B7E, 0x5B7F, 0x5B8A, 0x5C23, 0x5C2B, 0x5C30, 0x5C63,

+    0x5C69, 0x5C7C, 0x5CCB, 0x5CD2, 0x5CF4, 0x5D24, 0x5D26, 0x5D43,

+    0x5D46, 0x5D4A, 0x5D92, 0x5D94, 0x5D99, 0x5DA0, 0x5DD8, 0x5DE0,

+    0x5DF8, 0x5E00, 0x5E12, 0x5E14, 0x5E15, 0x5E18, 0x5E2E, 0x5E58,

+    0x5E6B, 0x5E6C, 0x5EA8, 0x5EAA, 0x5EBE, 0x5EBF, 0x5ECB, 0x5ED2,

+    0x5F07, 0x5F0E, 0x5F1C, 0x5F1D, 0x5F22, 0x5F28, 0x5F36, 0x5F3B,

+    0x5F40, 0x5F50, 0x5F58, 0x5F64, 0x5F89, 0x5F9C, 0x5FA7, 0x5FA4,

+    0x5FAF, 0x5FB8, 0x5FC4, 0x5FC9, 0x5FE1, 0x5FE9, 0x5FED, 0x5FFC,

+    0x6017, 0x601A, 0x6033, 0x6061, 0x607F, 0x609E, 0x60A4, 0x60B0,

+    0x60CB, 0x60DB, 0x60F8, 0x6112, 0x6113, 0x6114, 0x611C, 0x617C,

+    0x618D, 0x619F, 0x61A8, 0x61C2, 0x61DF, 0x6215, 0x6229, 0x6243,

+    0x6246, 0x624C, 0x6251, 0x6256, 0x62C4, 0x62FC, 0x630A, 0x630D,

+    0x6318, 0x6339, 0x6342, 0x6343, 0x6365, 0x6374, 0x637D, 0x6384,

+    0x6387, 0x6390, 0x639E, 0x63D1, 0x63DC, 0x6409, 0x6410, 0x6422,

+    0x6454, 0x645B, 0x646D, 0x647B, 0x64BE, 0x64BF, 0x64E5, 0x64F7,

+    0x64FB, 0x6504, 0x6516, 0x6519, 0x6547, 0x6567, 0x6581, 0x6585,

+    0x65C2, 0x65F0, 0x65F2, 0x662C, 0x664C, 0x665B, 0x665C, 0x6661,

+    0x666B, 0x6677, 0x66A4, 0x66C8, 0x66EC, 0x6705, 0x6713, 0x6733,

+    0x6748, 0x674C, 0x6776, 0x677B, 0x67B0, 0x67B2, 0x67F9, 0x67D7,

+    0x67D9, 0x67F0, 0x682C, 0x6830, 0x6831, 0x685B, 0x6872, 0x6875,

+    0x687A, 0x6884, 0x68A5, 0x68B2, 0x68D0, 0x68D6, 0x68E8, 0x68ED,

+    0x68F0, 0x68F1, 0x68FC, 0x6911, 0x6913, 0x6935, 0x693B, 0x6957,

+    0x6963, 0x6972, 0x697F, 0x6980, 0x69A6, 0x69AD, 0x69B7, 0x69D6,

+    0x69D7, 0x6A01, 0x6A0F, 0x6A15, 0x6A28, 0x6A34, 0x6A3E, 0x6A45,

+    0x6A50, 0x6A51, 0x6A56, 0x6A5B, 0x6A83, 0x6A89, 0x6A91, 0x6A9D,

+    0x6A9E, 0x6A9F, 0x6ADC, 0x6AE7, 0x6AEC, 0x6B1E, 0x6B24, 0x6B35,

+    0x6B46, 0x6B56, 0x6B60, 0x6B82, 0x6BBE, 0x6BE1, 0x6BF1, 0x6C10,

+    0x6C33, 0x6C35, 0x6C3A, 0x6C59, 0x6C76, 0x6C7B, 0x6C85, 0x6C95,

+    0x6C9C, 0x6CD0, 0x6CD4, 0x6CD6, 0x6CE0, 0x6CEB, 0x6CEC, 0x6CEE,

+    0x6D0A, 0x6D0E, 0x6D11, 0x6D2E, 0x6D57, 0x6D5E, 0x6D65, 0x6D82,

+    0x6DBF, 0x6DC4, 0x6DCA, 0x6DD6, 0x6DE9, 0x6E22, 0x6E51, 0x6EC7,

+    0x6ECA, 0x6ECE, 0x6EFD, 0x6F1A, 0x6F2A, 0x6F2F, 0x6F33, 0x6F5A,

+    0x6F5E, 0x6F62, 0x6F7D, 0x6F8B, 0x6F8D, 0x6F92, 0x6F94, 0x6F9A,

+    0x6FA7, 0x6FA8, 0x6FB6, 0x6FDA, 0x6FDE, 0x6FF9, 0x7039, 0x703C,

+    0x704A, 0x7054, 0x705D, 0x705E, 0x7064, 0x706C, 0x707E, 0x7081,

+    0x7095, 0x70B7, 0x70D3, 0x70D4, 0x70D8, 0x70DC, 0x7107, 0x7120,

+    0x7131, 0x714A, 0x7152, 0x7160, 0x7179, 0x7192, 0x71B3, 0x71CB,

+    0x71D3, 0x71D6, 0x7200, 0x721D, 0x722B, 0x7238, 0x7241, 0x7253,

+    0x7255, 0x7256, 0x725C, 0x728D, 0x72AD, 0x72B4, 0x72C7, 0x72FB,

+    0x7304, 0x7305, 0x7328, 0x7331, 0x7343, 0x736C, 0x737C, 0x7383,

+    0x7385, 0x7386, 0x7395, 0x739E, 0x739F, 0x73A0, 0x73A6, 0x73AB,

+    0x73B5, 0x73B7, 0x73BC, 0x73CF, 0x73D9, 0x73E9, 0x73F4, 0x73FD,

+    0x7404, 0x740A, 0x741A, 0x741B, 0x7424, 0x7428, 0x742C, 0x742F,

+    0x7430, 0x7431, 0x7439, 0x7444, 0x7447, 0x744B, 0x744D, 0x7451,

+    0x7457, 0x7466, 0x746B, 0x7471, 0x7480, 0x7485, 0x7486, 0x7487,

+    0x7490, 0x7498, 0x749C, 0x74A0, 0x74A3, 0x74A8, 0x74AB, 0x74B5,

+    0x74BF, 0x74C8, 0x74DA, 0x74DE, 0x754E, 0x7579, 0x7581, 0x7590,

+    0x7592, 0x7593, 0x75B4, 0x75E4, 0x75F9, 0x7600, 0x760A, 0x7615,

+    0x7616, 0x7619, 0x761E, 0x762D, 0x7635, 0x7643, 0x764B, 0x7665,

+    0x766D, 0x766F, 0x7671, 0x7674, 0x76A4, 0x76A5, 0x76C5, 0x76CC,

+    0x76EC, 0x76FC, 0x7734, 0x7736, 0x775C, 0x775F, 0x7760, 0x7772,

+    0x777D, 0x7795, 0x77AA, 0x77E6, 0x77F0, 0x77F4, 0x7806, 0x7822,

+    0x782D, 0x782E, 0x7830, 0x7835, 0x7868, 0x789E, 0x78C8, 0x78CC,

+    0x78CE, 0x78E4, 0x78E0, 0x78E1, 0x78F2, 0x78F7, 0x78FB, 0x7931,

+    0x7934, 0x793B, 0x793D, 0x7945, 0x795B, 0x795C, 0x798B, 0x7996,

+    0x7998, 0x79B8, 0x79BB, 0x79CA, 0x79DA, 0x7A03, 0x7A09, 0x7A11,

+    0x7A1E, 0x7A2D, 0x7A39, 0x7A45, 0x7A4C, 0x7A5D, 0x7A60, 0x7A6D,

+    0x7A78, 0x7AA0, 0x7AA3, 0x7AB3, 0x7ABB, 0x7ABC, 0x7AC6, 0x7B07,

+    0x7B14, 0x7B27, 0x7B31, 0x7B47, 0x7B4E, 0x7B60, 0x7B69, 0x7B6D,

+    0x7B72, 0x7B91, 0x7BAF, 0x7BD7, 0x7BD9, 0x7C0B, 0x7C0F, 0x7C20,

+    0x7C26, 0x7C31, 0x7C36, 0x7C51, 0x7C59, 0x7C67, 0x7C6E, 0x7C70,

+    0x7CBC, 0x7CBF, 0x7CC8, 0x7CC9, 0x7CD7, 0x7CD9, 0x7CDD, 0x7CEB,

+    0x7D07, 0x7D08, 0x7D09, 0x7D13, 0x7D1D, 0x7D23, 0x7D41, 0x7D53,

+    0x7D59, 0x7D5D, 0x7D7A, 0x7D86, 0x7D8B, 0x7D8C, 0x7DCC, 0x7DEB,

+    0x7DF1, 0x7DF9, 0x7E08, 0x7E11, 0x7E15, 0x7E20, 0x7E47, 0x7E62,

+    0x7E6E, 0x7E73, 0x7E8D, 0x7E91, 0x7E98, 0x7F44, 0x7F4F, 0x7F52,

+    0x7F53, 0x7F61, 0x7F91, 0x7FBF, 0x7FCE, 0x7FDF, 0x7FE5, 0x7FEC,

+    0x7FEE, 0x7FEF, 0x7FFA, 0x800E, 0x8011, 0x8014, 0x8024, 0x8026,

+    0x803A, 0x803C, 0x8060, 0x8071, 0x8075, 0x809E, 0x80A6, 0x80AB,

+    0x80D7, 0x80D8, 0x8116, 0x8118, 0x813A, 0x814A, 0x814C, 0x8181,

+    0x8184, 0x81B4, 0x81CF, 0x81F9, 0x8203, 0x8221, 0x8232, 0x8234,

+    0x8246, 0x824B, 0x824F, 0x828E, 0x82AE, 0x82B7, 0x82BE, 0x82C6,

+    0x82FE, 0x8343, 0x8351, 0x8355, 0x8386, 0x838D, 0x8392, 0x8398,

+    0x83A9, 0x83BF, 0x83C0, 0x83EA, 0x840F, 0x8411, 0x844A, 0x8476,

+    0x84A8, 0x84AF, 0x84C0, 0x84C2, 0x84F0, 0x84FD, 0x850C, 0x8534,

+    0x855E, 0x858F, 0x85B7, 0x85CE, 0x85AD, 0x8612, 0x8629, 0x8652,

+    0x8663, 0x866C, 0x866F, 0x867A, 0x868D, 0x8691, 0x8698, 0x86A7,

+    0x86A8, 0x86FA, 0x86FD, 0x870B, 0x8713, 0x8719, 0x871E, 0x8728,

+    0x873E, 0x8771, 0x8788, 0x8799, 0x87AC, 0x87AD, 0x87B5, 0x87D6,

+    0x87EB, 0x87ED, 0x8801, 0x8803, 0x8806, 0x880B, 0x8814, 0x881C,

+    0x8856, 0x885F, 0x8864, 0x8898, 0x88AA, 0x88BD, 0x88BE, 0x88CA,

+    0x88D2, 0x88DB, 0x88F0, 0x88F1, 0x8906, 0x8918, 0x8919, 0x891A,

+    0x8927, 0x8930, 0x893E, 0x897B, 0x89D4, 0x89D6, 0x89E5, 0x89F1,

+    0x8A07, 0x8A0F, 0x8A15, 0x8A22, 0x8A4E, 0x8A7F, 0x8AF4, 0x8B1F,

+    0x8B37, 0x8B43, 0x8B44, 0x8B54, 0x8B9C, 0x8B9E, 0x8C47, 0x8C54,

+    0x8C73, 0x8CA4, 0x8CD9, 0x8CE1, 0x8CF8, 0x8CFE, 0x8D1B, 0x8D69,

+    0x8D6C, 0x8D84, 0x8D8D, 0x8D95, 0x8DA6, 0x8DC6, 0x8DCE, 0x8DE4,

+    0x8DEC, 0x8E20, 0x8E4B, 0x8E6C, 0x8E70, 0x8E7A, 0x8E92, 0x8EAE,

+    0x8EB3, 0x8ED1, 0x8ED4, 0x8EF9, 0x8F17, 0x8F36, 0x8FA6, 0x8FB5,

+    0x8FB6, 0x8FC6, 0x8FE0, 0x8FE4, 0x8FF6, 0x9002, 0x902C, 0x9044,

+    0x9088, 0x9095, 0x9099, 0x909B, 0x90A2, 0x90B4, 0x90D7, 0x90DD,

+    0x90F4, 0x9117, 0x911C, 0x9131, 0x913A, 0x913D, 0x9148, 0x915B,

+    0x9161, 0x9164, 0x918E, 0x919E, 0x91A8, 0x91AD, 0x91AE, 0x91B2,

+    0x91BC, 0x91F0, 0x91F7, 0x91FB, 0x9207, 0x9228, 0x9233, 0x9238,

+    0x9243, 0x9247, 0x924F, 0x9260, 0x92C2, 0x92CB, 0x92CC, 0x92DF,

+    0x930D, 0x9315, 0x931F, 0x9327, 0x9347, 0x9352, 0x9365, 0x936A,

+    0x936D, 0x939B, 0x93BA, 0x93A9, 0x93C1, 0x93CA, 0x93E2, 0x93FA,

+    0x93FD, 0x940F, 0x9434, 0x943F, 0x9455, 0x946B, 0x9472, 0x9578,

+    0x95A6, 0x95A9, 0x95AB, 0x95B4, 0x95BD, 0x95DA, 0x961D, 0x9641,

+    0x9658, 0x9684, 0x96A4, 0x96A9, 0x96D2, 0x5DB2, 0x96DE, 0x96E9,

+    0x96F1, 0x9702, 0x9709, 0x975A, 0x9763, 0x976E, 0x9773, 0x979A,

+    0x97A2, 0x97B5, 0x97B6, 0x97D9, 0x97DE, 0x97F4, 0x980A, 0x980E,

+    0x981E, 0x9823, 0x982B, 0x983E, 0x9852, 0x9853, 0x9859, 0x986C,

+    0x98B8, 0x98BA, 0x98BF, 0x98C8, 0x98E5, 0x9932, 0x9933, 0x9940,

+    0x994D, 0x995C, 0x995F, 0x99B1, 0x99B9, 0x99BA, 0x99C9, 0x9A02,

+    0x9A16, 0x9A24, 0x9A27, 0x9A2D, 0x9A2E, 0x9A36, 0x9A38, 0x9A4A,

+    0x9A56, 0x9AB5, 0x9AB6, 0x9AF9, 0x9B03, 0x9B20, 0x9B33, 0x9B34,

+    0x9B73, 0x9B79, 0x9BA7, 0x9BC1, 0x9BC7, 0x9BD7, 0x9BE7, 0x9BEB,

+    0x9BF7, 0x9BFA, 0x9BFD, 0x9C0B, 0x9C27, 0x9C2A, 0x9C36, 0x9C41,

+    0x9C53, 0x9C63, 0x9C6A, 0x9C77, 0x9D02, 0x9D42, 0x9D47, 0x9D63,

+    0x9D69, 0x9D7C, 0x9D7E, 0x9D8D, 0x9DB1, 0x9DC3, 0x9DC7, 0x9DD6,

+    0x9DDF, 0x9DEB, 0x9DF4, 0x9E15, 0x9E1D, 0x9EA4, 0x9EA8, 0x9EAC,

+    0x9EE7, 0x9EEE, 0x9F10, 0x9F12, 0x9F17, 0x9F19, 0x9F2F, 0x9F37,

+    0x9F39, 0x9F41, 0x9F45, 0x9F57, 0x9F68, 0x9F71, 0x9F75, 0x9F90,

+    0x9F94, 0x9FA2, 0x4E30, 0x3405, 0x4F60, 0x5620, 0x5ECB, 0x2E95,

+    0x60A4, 0x69D7, 0x6B24, 0x6FF9, 0x6EE6, 0x71B3, 0x2EA4, 0x7AC6,

+    0x7F61, 0x8071, 0x809E, 0x2ECC, 0x91F0, 0x5DB2, 0x97DE, 0x4FD3,

+    0x50D9, 0x50F0, 0x51C3, 0x5676, 0x6A54, 0x6D01, 0x6DD0, 0x6E42,

+    0x6ED9, 0x73E4, 0x7421, 0x756C, 0x7851, 0x87F5, 0xFFFD, 0x73A8,

+    0x3AF3, 0x34DB, 0x440C, 0x3E8A, 0xFFFD, 0xFFFD, 0x4BE8, 0xFFFD,

+    0x3EDA, 0x3B22, 0xFFFD, 0x457A, 0x4093, 0xFFFD, 0x4665, 0x4103,

+    0x4293, 0x46AE, 0x3488, 0xFFFD,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp
new file mode 100644
index 0000000..f0e01e1
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp
@@ -0,0 +1,48 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_EUC_H_1[120 * 3] = {

+    0x0020, 0x007E, 0x00E7, 0x8EA0, 0x8EDF, 0x0146, 0xA1A1, 0xA1FE, 0x0279,

+    0xA2A1, 0xA2AE, 0x02D7, 0xA2BA, 0xA2C1, 0x02E5, 0xA2CA, 0xA2D0, 0x02ED,

+    0xA2DC, 0xA2EA, 0x02F4, 0xA2F2, 0xA2F9, 0x0303, 0xA2FE, 0xA2FE, 0x030B,

+    0xA3B0, 0xA3B9, 0x030C, 0xA3C1, 0xA3DA, 0x0316, 0xA3E1, 0xA3FA, 0x0330,

+    0xA4A1, 0xA4F3, 0x034A, 0xA5A1, 0xA5F6, 0x039D, 0xA6A1, 0xA6B8, 0x03F3,

+    0xA6C1, 0xA6D8, 0x040B, 0xA7A1, 0xA7C1, 0x0423, 0xA7D1, 0xA7F1, 0x0444,

+    0xA8A1, 0xA8A1, 0x1D37, 0xA8A2, 0xA8A2, 0x1D39, 0xA8A3, 0xA8A3, 0x1D43,

+    0xA8A4, 0xA8A4, 0x1D47, 0xA8A5, 0xA8A5, 0x1D4F, 0xA8A6, 0xA8A6, 0x1D4B,

+    0xA8A7, 0xA8A7, 0x1D53, 0xA8A8, 0xA8A8, 0x1D63, 0xA8A9, 0xA8A9, 0x1D5B,

+    0xA8AA, 0xA8AA, 0x1D6B, 0xA8AB, 0xA8AB, 0x1D73, 0xA8AC, 0xA8AC, 0x1D38,

+    0xA8AD, 0xA8AD, 0x1D3A, 0xA8AE, 0xA8AE, 0x1D46, 0xA8AF, 0xA8AF, 0x1D4A,

+    0xA8B0, 0xA8B0, 0x1D52, 0xA8B1, 0xA8B1, 0x1D4E, 0xA8B2, 0xA8B2, 0x1D5A,

+    0xA8B3, 0xA8B3, 0x1D6A, 0xA8B4, 0xA8B4, 0x1D62, 0xA8B5, 0xA8B5, 0x1D72,

+    0xA8B6, 0xA8B6, 0x1D82, 0xA8B7, 0xA8B7, 0x1D57, 0xA8B8, 0xA8B8, 0x1D66,

+    0xA8B9, 0xA8B9, 0x1D5F, 0xA8BA, 0xA8BA, 0x1D6E, 0xA8BB, 0xA8BB, 0x1D76,

+    0xA8BC, 0xA8BC, 0x1D54, 0xA8BD, 0xA8BD, 0x1D67, 0xA8BE, 0xA8BE, 0x1D5C,

+    0xA8BF, 0xA8BF, 0x1D6F, 0xA8C0, 0xA8C0, 0x1D79, 0xB0A1, 0xB0FE, 0x0465,

+    0xB1A1, 0xB1FE, 0x04C3, 0xB2A1, 0xB2FE, 0x0521, 0xB3A1, 0xB3FE, 0x057F,

+    0xB4A1, 0xB4FE, 0x05DD, 0xB5A1, 0xB5FE, 0x063B, 0xB6A1, 0xB6FE, 0x0699,

+    0xB7A1, 0xB7FE, 0x06F7, 0xB8A1, 0xB8FE, 0x0755, 0xB9A1, 0xB9FE, 0x07B3,

+    0xBAA1, 0xBAFE, 0x0811, 0xBBA1, 0xBBFE, 0x086F, 0xBCA1, 0xBCFE, 0x08CD,

+    0xBDA1, 0xBDFE, 0x092B, 0xBEA1, 0xBEFE, 0x0989, 0xBFA1, 0xBFFE, 0x09E7,

+    0xC0A1, 0xC0FE, 0x0A45, 0xC1A1, 0xC1FE, 0x0AA3, 0xC2A1, 0xC2FE, 0x0B01,

+    0xC3A1, 0xC3FE, 0x0B5F, 0xC4A1, 0xC4FE, 0x0BBD, 0xC5A1, 0xC5FE, 0x0C1B,

+    0xC6A1, 0xC6FE, 0x0C79, 0xC7A1, 0xC7FE, 0x0CD7, 0xC8A1, 0xC8FE, 0x0D35,

+    0xC9A1, 0xC9FE, 0x0D93, 0xCAA1, 0xCAFE, 0x0DF1, 0xCBA1, 0xCBFE, 0x0E4F,

+    0xCCA1, 0xCCFE, 0x0EAD, 0xCDA1, 0xCDFE, 0x0F0B, 0xCEA1, 0xCEFE, 0x0F69,

+    0xCFA1, 0xCFD3, 0x0FC7, 0xD0A1, 0xD0FE, 0x0FFA, 0xD1A1, 0xD1FE, 0x1058,

+    0xD2A1, 0xD2FE, 0x10B6, 0xD3A1, 0xD3FE, 0x1114, 0xD4A1, 0xD4FE, 0x1172,

+    0xD5A1, 0xD5FE, 0x11D0, 0xD6A1, 0xD6FE, 0x122E, 0xD7A1, 0xD7FE, 0x128C,

+    0xD8A1, 0xD8FE, 0x12EA, 0xD9A1, 0xD9FE, 0x1348, 0xDAA1, 0xDAFE, 0x13A6,

+    0xDBA1, 0xDBFE, 0x1404, 0xDCA1, 0xDCFE, 0x1462, 0xDDA1, 0xDDFE, 0x14C0,

+    0xDEA1, 0xDEFE, 0x151E, 0xDFA1, 0xDFFE, 0x157C, 0xE0A1, 0xE0FE, 0x15DA,

+    0xE1A1, 0xE1FE, 0x1638, 0xE2A1, 0xE2FE, 0x1696, 0xE3A1, 0xE3FE, 0x16F4,

+    0xE4A1, 0xE4FE, 0x1752, 0xE5A1, 0xE5FE, 0x17B0, 0xE6A1, 0xE6FE, 0x180E,

+    0xE7A1, 0xE7FE, 0x186C, 0xE8A1, 0xE8FE, 0x18CA, 0xE9A1, 0xE9FE, 0x1928,

+    0xEAA1, 0xEAFE, 0x1986, 0xEBA1, 0xEBFE, 0x19E4, 0xECA1, 0xECFE, 0x1A42,

+    0xEDA1, 0xEDFE, 0x1AA0, 0xEEA1, 0xEEFE, 0x1AFE, 0xEFA1, 0xEFFE, 0x1B5C,

+    0xF0A1, 0xF0FE, 0x1BBA, 0xF1A1, 0xF1FE, 0x1C18, 0xF2A1, 0xF2FE, 0x1C76,

+    0xF3A1, 0xF3FE, 0x1CD4, 0xF4A1, 0xF4A4, 0x1D32, 0xF4A5, 0xF4A6, 0x205C,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-V_1.cpp
new file mode 100644
index 0000000..3b4fb79
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-V_1.cpp
@@ -0,0 +1,17 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_EUC_V_1[27 * 3] = {
+    0xA1A2, 0xA1A3, 0x1ECF, 0xA1B1, 0xA1B2, 0x1ED1, 0xA1BC, 0xA1BE, 0x1ED3,
+    0xA1C1, 0xA1C5, 0x1ED6, 0xA1CA, 0xA1DB, 0x1EDB, 0xA1E1, 0xA1E1, 0x1EED,
+    0xA4A1, 0xA4A1, 0x1EEE, 0xA4A3, 0xA4A3, 0x1EEF, 0xA4A5, 0xA4A5, 0x1EF0,
+    0xA4A7, 0xA4A7, 0x1EF1, 0xA4A9, 0xA4A9, 0x1EF2, 0xA4C3, 0xA4C3, 0x1EF3,
+    0xA4E3, 0xA4E3, 0x1EF4, 0xA4E5, 0xA4E5, 0x1EF5, 0xA4E7, 0xA4E7, 0x1EF6,
+    0xA4EE, 0xA4EE, 0x1EF7, 0xA5A1, 0xA5A1, 0x1EF8, 0xA5A3, 0xA5A3, 0x1EF9,
+    0xA5A5, 0xA5A5, 0x1EFA, 0xA5A7, 0xA5A7, 0x1EFB, 0xA5A9, 0xA5A9, 0x1EFC,
+    0xA5C3, 0xA5C3, 0x1EFD, 0xA5E3, 0xA5E3, 0x1EFE, 0xA5E5, 0xA5E5, 0x1EFF,
+    0xA5E7, 0xA5E7, 0x1F00, 0xA5EE, 0xA5EE, 0x1F01, 0xA5F5, 0xA5F6, 0x1F02,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-H_2.cpp
new file mode 100644
index 0000000..a269ba6
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-H_2.cpp
@@ -0,0 +1,230 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_Ext_RKSJ_H_2[665 * 3] = {
+    0x0020, 0x007E, 0x00E7, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,
+    0x8180, 0x8188, 0x02B8, 0x8189, 0x8189, 0x1D36, 0x818A, 0x81AC, 0x02C2,
+    0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,
+    0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, 0x8380, 0x8396, 0x03DC,
+    0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, 0x8440, 0x8460, 0x0423,
+    0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, 0x8540, 0x857E, 0x00E8,
+    0x8580, 0x8580, 0x0186, 0x8581, 0x859E, 0x0128, 0x859F, 0x85DD, 0x0147,
+    0x85DE, 0x85FC, 0x0187, 0x8640, 0x867E, 0x01A6, 0x8680, 0x8691, 0x01E5,
+    0x8692, 0x8692, 0x0127, 0x8693, 0x869E, 0x01F7, 0x86A2, 0x86ED, 0x1D37,
+    0x8740, 0x875D, 0x1D83, 0x875F, 0x8775, 0x1DA1, 0x877E, 0x877E, 0x2083,
+    0x8780, 0x878F, 0x1DB8, 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9,
+    0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300,
+    0x879B, 0x879C, 0x1DCF, 0x889F, 0x889F, 0x0465, 0x88A0, 0x88A0, 0x1DD1,
+    0x88A1, 0x88B0, 0x0467, 0x88B1, 0x88B1, 0x1CA2, 0x88B2, 0x88B8, 0x0478,
+    0x88B9, 0x88B9, 0x1DD2, 0x88BA, 0x88EB, 0x0480, 0x88EC, 0x88EC, 0x1DD3,
+    0x88ED, 0x88F0, 0x04B3, 0x88F1, 0x88F1, 0x1DD4, 0x88F2, 0x88F9, 0x04B8,
+    0x88FA, 0x88FA, 0x1DD5, 0x88FB, 0x88FC, 0x04C1, 0x8940, 0x8948, 0x04C3,
+    0x8949, 0x8949, 0x1DD6, 0x894A, 0x8953, 0x04CD, 0x8954, 0x8954, 0x1DD7,
+    0x8955, 0x8957, 0x04D8, 0x8958, 0x8958, 0x1DD8, 0x8959, 0x895A, 0x04DC,
+    0x895B, 0x895C, 0x1DD9, 0x895D, 0x8960, 0x04E0, 0x8961, 0x8961, 0x1DDB,
+    0x8962, 0x897E, 0x04E5, 0x8980, 0x898A, 0x0502, 0x898B, 0x898B, 0x1DDC,
+    0x898C, 0x89A5, 0x050E, 0x89A6, 0x89A6, 0x1DDD, 0x89A7, 0x89A7, 0x1CC9,
+    0x89A8, 0x89A8, 0x1DDE, 0x89A9, 0x89DD, 0x052B, 0x89DE, 0x89DE, 0x1DDF,
+    0x89DF, 0x89F7, 0x0561, 0x89F8, 0x89F8, 0x1DE0, 0x89F9, 0x89FA, 0x057B,
+    0x89FB, 0x89FB, 0x1DE1, 0x89FC, 0x89FC, 0x057E, 0x8A40, 0x8A40, 0x057F,
+    0x8A41, 0x8A41, 0x1DE2, 0x8A42, 0x8A60, 0x0581, 0x8A61, 0x8A61, 0x1961,
+    0x8A62, 0x8A67, 0x05A1, 0x8A68, 0x8A68, 0x139F, 0x8A69, 0x8A7E, 0x05A8,
+    0x8A80, 0x8A84, 0x05BE, 0x8A85, 0x8A85, 0x1DE3, 0x8A86, 0x8A8A, 0x05C4,
+    0x8A8B, 0x8A8B, 0x1DE4, 0x8A8C, 0x8A92, 0x05CA, 0x8A93, 0x8A93, 0x1DE5,
+    0x8A94, 0x8A95, 0x05D2, 0x8A96, 0x8A96, 0x1731, 0x8A97, 0x8A99, 0x05D5,
+    0x8A9A, 0x8A9A, 0x1DE6, 0x8A9B, 0x8ABF, 0x05D9, 0x8AC0, 0x8AC0, 0x1DE7,
+    0x8AC1, 0x8AC1, 0x1572, 0x8AC2, 0x8ACA, 0x0600, 0x8ACB, 0x8ACB, 0x1DE8,
+    0x8ACC, 0x8ACF, 0x060A, 0x8AD0, 0x8AD0, 0x1A20, 0x8AD1, 0x8AE2, 0x060F,
+    0x8AE3, 0x8AE3, 0x1DE9, 0x8AE4, 0x8AFC, 0x0622, 0x8B40, 0x8B49, 0x063B,
+    0x8B4A, 0x8B4A, 0x1DEA, 0x8B4B, 0x8B5E, 0x0646, 0x8B5F, 0x8B5F, 0x1DEB,
+    0x8B60, 0x8B7E, 0x065B, 0x8B80, 0x8B9F, 0x067A, 0x8BA0, 0x8BA0, 0x1DEC,
+    0x8BA1, 0x8BA7, 0x069B, 0x8BA8, 0x8BA8, 0x1DED, 0x8BA9, 0x8BC3, 0x06A3,
+    0x8BC4, 0x8BC4, 0x1D32, 0x8BC5, 0x8BCC, 0x06BF, 0x8BCD, 0x8BCD, 0x1DEE,
+    0x8BCE, 0x8BEA, 0x06C8, 0x8BEB, 0x8BEB, 0x1DEF, 0x8BEC, 0x8BF1, 0x06E6,
+    0x8BF2, 0x8BF2, 0x1DF0, 0x8BF3, 0x8BF8, 0x06ED, 0x8BF9, 0x8BF9, 0x1DF1,
+    0x8BFA, 0x8BFA, 0x06F4, 0x8BFB, 0x8BFB, 0x1DF2, 0x8BFC, 0x8BFC, 0x06F6,
+    0x8C40, 0x8C42, 0x06F7, 0x8C43, 0x8C43, 0x1DF3, 0x8C44, 0x8C55, 0x06FB,
+    0x8C56, 0x8C56, 0x1DF4, 0x8C57, 0x8C63, 0x070E, 0x8C64, 0x8C64, 0x1DF5,
+    0x8C65, 0x8C6C, 0x071C, 0x8C6D, 0x8C6D, 0x1DF6, 0x8C6E, 0x8C70, 0x0725,
+    0x8C71, 0x8C71, 0x1DF7, 0x8C72, 0x8C73, 0x0729, 0x8C74, 0x8C74, 0x1DF8,
+    0x8C75, 0x8C79, 0x072C, 0x8C7A, 0x8C7A, 0x1C0D, 0x8C7B, 0x8C7E, 0x0732,
+    0x8C80, 0x8C83, 0x0736, 0x8C84, 0x8C84, 0x1DF9, 0x8C85, 0x8C90, 0x073B,
+    0x8C91, 0x8C91, 0x1DFA, 0x8C92, 0x8C98, 0x0748, 0x8C99, 0x8C99, 0x1DFB,
+    0x8C9A, 0x8C9D, 0x0750, 0x8C9E, 0x8C9E, 0x1DFC, 0x8C9F, 0x8CB1, 0x0755,
+    0x8CB2, 0x8CB2, 0x1DFD, 0x8CB3, 0x8CBE, 0x0769, 0x8CBF, 0x8CBF, 0x1DFE,
+    0x8CC0, 0x8CFC, 0x0776, 0x8D40, 0x8D49, 0x07B3, 0x8D4A, 0x8D4A, 0x1DFF,
+    0x8D4B, 0x8D55, 0x07BE, 0x8D56, 0x8D56, 0x1E00, 0x8D57, 0x8D60, 0x07CA,
+    0x8D61, 0x8D61, 0x1E01, 0x8D62, 0x8D7A, 0x07D5, 0x8D7B, 0x8D7B, 0x16DD,
+    0x8D7C, 0x8D7E, 0x07EF, 0x8D80, 0x8D8C, 0x07F2, 0x8D8D, 0x8D8D, 0x1E02,
+    0x8D8E, 0x8D93, 0x0800, 0x8D94, 0x8D94, 0x1E03, 0x8D95, 0x8D98, 0x0807,
+    0x8D99, 0x8D99, 0x1E04, 0x8D9A, 0x8DD0, 0x080C, 0x8DD1, 0x8DD1, 0x1E05,
+    0x8DD2, 0x8DE4, 0x0844, 0x8DE5, 0x8DE5, 0x1E06, 0x8DE6, 0x8DF1, 0x0858,
+    0x8DF2, 0x8DF2, 0x1E07, 0x8DF3, 0x8DFC, 0x0865, 0x8E40, 0x8E45, 0x086F,
+    0x8E46, 0x8E46, 0x1E08, 0x8E47, 0x8E48, 0x0876, 0x8E49, 0x8E49, 0x1E09,
+    0x8E4A, 0x8E4A, 0x0879, 0x8E4B, 0x8E4B, 0x1E0A, 0x8E4C, 0x8E57, 0x087B,
+    0x8E58, 0x8E58, 0x1E0B, 0x8E59, 0x8E7E, 0x0888, 0x8E80, 0x8EB5, 0x08AE,
+    0x8EB6, 0x8EB6, 0x1E0C, 0x8EB7, 0x8EC5, 0x08E5, 0x8EC6, 0x8EC6, 0x1E0D,
+    0x8EC7, 0x8EC7, 0x1929, 0x8EC8, 0x8ED4, 0x08F6, 0x8ED5, 0x8ED5, 0x1E0E,
+    0x8ED6, 0x8EDA, 0x0904, 0x8EDB, 0x8EDC, 0x1E0F, 0x8EDD, 0x8EFC, 0x090B,
+    0x8F40, 0x8F49, 0x092B, 0x8F4A, 0x8F4A, 0x1E11, 0x8F4B, 0x8F54, 0x0936,
+    0x8F55, 0x8F55, 0x1E12, 0x8F56, 0x8F7E, 0x0941, 0x8F80, 0x8F8B, 0x096A,
+    0x8F8C, 0x8F8D, 0x1E13, 0x8F8E, 0x8F91, 0x0978, 0x8F92, 0x8F93, 0x1E15,
+    0x8F94, 0x8FA2, 0x097E, 0x8FA3, 0x8FA3, 0x1E17, 0x8FA4, 0x8FB0, 0x098E,
+    0x8FB1, 0x8FB1, 0x1E18, 0x8FB2, 0x8FBC, 0x099C, 0x8FBD, 0x8FBD, 0x1E19,
+    0x8FBE, 0x8FD2, 0x09A8, 0x8FD3, 0x8FD3, 0x1E1A, 0x8FD4, 0x8FDC, 0x09BE,
+    0x8FDD, 0x8FDD, 0x1E1B, 0x8FDE, 0x8FE1, 0x09C8, 0x8FE2, 0x8FE2, 0x1E1C,
+    0x8FE3, 0x8FFC, 0x09CD, 0x9040, 0x9048, 0x09E7, 0x9049, 0x9049, 0x1E1D,
+    0x904A, 0x9077, 0x09F1, 0x9078, 0x9078, 0x1E1E, 0x9079, 0x907E, 0x0A20,
+    0x9080, 0x9080, 0x1E1F, 0x9081, 0x9088, 0x0A27, 0x9089, 0x9089, 0x1E20,
+    0x908A, 0x909F, 0x0A30, 0x90A0, 0x90A0, 0x1E21, 0x90A1, 0x90BF, 0x0A47,
+    0x90C0, 0x90C0, 0x1E22, 0x90C1, 0x90E3, 0x0A67, 0x90E4, 0x90E4, 0x1E23,
+    0x90E5, 0x90EE, 0x0A8B, 0x90EF, 0x90F0, 0x1E24, 0x90F1, 0x90F6, 0x0A97,
+    0x90F7, 0x90F8, 0x1E26, 0x90F9, 0x90FC, 0x0A9F, 0x9140, 0x9145, 0x0AA3,
+    0x9146, 0x9146, 0x1E28, 0x9147, 0x9147, 0x1A6E, 0x9148, 0x9157, 0x0AAB,
+    0x9158, 0x9158, 0x1E29, 0x9159, 0x916A, 0x0ABC, 0x916B, 0x916B, 0x1E2A,
+    0x916C, 0x916D, 0x0ACF, 0x916E, 0x916E, 0x1E2B, 0x916F, 0x917D, 0x0AD2,
+    0x917E, 0x917E, 0x1E2C, 0x9180, 0x9188, 0x0AE2, 0x9189, 0x9189, 0x1E2D,
+    0x918A, 0x91BA, 0x0AEC, 0x91BB, 0x91BB, 0x1E2E, 0x91BC, 0x91CA, 0x0B1E,
+    0x91CB, 0x91CB, 0x1E2F, 0x91CC, 0x91D9, 0x0B2E, 0x91DA, 0x91DA, 0x1E30,
+    0x91DB, 0x91E0, 0x0B3D, 0x91E1, 0x91E1, 0x1E31, 0x91E2, 0x91EC, 0x0B44,
+    0x91ED, 0x91ED, 0x1E32, 0x91EE, 0x91F2, 0x0B50, 0x91F3, 0x91F4, 0x1E33,
+    0x91F5, 0x91FA, 0x0B57, 0x91FB, 0x91FB, 0x1E35, 0x91FC, 0x91FC, 0x0B5E,
+    0x9240, 0x9245, 0x0B5F, 0x9246, 0x9246, 0x1E36, 0x9247, 0x9247, 0x0B66,
+    0x9248, 0x9249, 0x1E37, 0x924A, 0x924B, 0x0B69, 0x924C, 0x924D, 0x1E39,
+    0x924E, 0x925B, 0x0B6D, 0x925C, 0x925C, 0x1E3B, 0x925D, 0x927E, 0x0B7C,
+    0x9280, 0x928F, 0x0B9E, 0x9290, 0x9290, 0x1E3C, 0x9291, 0x9294, 0x0BAF,
+    0x9295, 0x9295, 0x1E3D, 0x9296, 0x929B, 0x0BB4, 0x929C, 0x929C, 0x1E3E,
+    0x929D, 0x92BA, 0x0BBB, 0x92BB, 0x92BB, 0x1E3F, 0x92BC, 0x92C5, 0x0BDA,
+    0x92C6, 0x92C6, 0x1E40, 0x92C7, 0x92C7, 0x0BE5, 0x92C8, 0x92C8, 0x1E41,
+    0x92C9, 0x92CA, 0x0BE7, 0x92CB, 0x92CB, 0x1E42, 0x92CC, 0x92CC, 0x0BEA,
+    0x92CD, 0x92CD, 0x1E43, 0x92CE, 0x92D8, 0x0BEC, 0x92D9, 0x92D9, 0x11B5,
+    0x92DA, 0x92FC, 0x0BF8, 0x9340, 0x9340, 0x0C1B, 0x9341, 0x9341, 0x1E44,
+    0x9342, 0x9345, 0x0C1D, 0x9346, 0x9346, 0x1E45, 0x9347, 0x934C, 0x0C22,
+    0x934D, 0x934D, 0x1E46, 0x934E, 0x9354, 0x0C29, 0x9355, 0x9355, 0x1E47,
+    0x9356, 0x935D, 0x0C31, 0x935E, 0x935E, 0x1E48, 0x935F, 0x9366, 0x0C3A,
+    0x9367, 0x9367, 0x1E49, 0x9368, 0x9369, 0x0C43, 0x936A, 0x936A, 0x1E4A,
+    0x936B, 0x936F, 0x0C46, 0x9370, 0x9371, 0x1E4B, 0x9372, 0x9375, 0x0C4D,
+    0x9376, 0x9376, 0x16DF, 0x9377, 0x937E, 0x0C52, 0x9380, 0x9383, 0x0C5A,
+    0x9384, 0x9384, 0x1E4D, 0x9385, 0x938D, 0x0C5F, 0x938E, 0x938E, 0x1450,
+    0x938F, 0x9392, 0x0C69, 0x9393, 0x9393, 0x1536, 0x9394, 0x9397, 0x0C6E,
+    0x9398, 0x9398, 0x1E4E, 0x9399, 0x93BB, 0x0C73, 0x93BC, 0x93BC, 0x1E4F,
+    0x93BD, 0x93BF, 0x0C97, 0x93C0, 0x93C0, 0x1E50, 0x93C1, 0x93D1, 0x0C9B,
+    0x93D2, 0x93D3, 0x1E51, 0x93D4, 0x93D8, 0x0CAE, 0x93D9, 0x93DA, 0x1E53,
+    0x93DB, 0x93DE, 0x0CB5, 0x93DF, 0x93DF, 0x1E55, 0x93E0, 0x93E3, 0x0CBA,
+    0x93E4, 0x93E5, 0x1E56, 0x93E6, 0x93E7, 0x0CC0, 0x93E8, 0x93E8, 0x1E58,
+    0x93E9, 0x93F3, 0x0CC3, 0x93F4, 0x93F4, 0x1AED, 0x93F5, 0x93FC, 0x0CCF,
+    0x9440, 0x9447, 0x0CD7, 0x9448, 0x9448, 0x1E59, 0x9449, 0x9457, 0x0CE0,
+    0x9458, 0x9458, 0x1E5A, 0x9459, 0x9475, 0x0CF0, 0x9476, 0x9476, 0x1E5B,
+    0x9477, 0x947E, 0x0D0E, 0x9480, 0x9486, 0x0D16, 0x9487, 0x9487, 0x1E5C,
+    0x9488, 0x9488, 0x1989, 0x9489, 0x9489, 0x1E5D, 0x948A, 0x948C, 0x0D20,
+    0x948D, 0x948D, 0x1E5E, 0x948E, 0x94A1, 0x0D24, 0x94A2, 0x94A2, 0x1E5F,
+    0x94A3, 0x94AB, 0x0D39, 0x94AC, 0x94AC, 0x1E60, 0x94AD, 0x94AD, 0x0D43,
+    0x94AE, 0x94AE, 0x1E61, 0x94AF, 0x94D1, 0x0D45, 0x94D2, 0x94D2, 0x1E62,
+    0x94D3, 0x94DF, 0x0D69, 0x94E0, 0x94E0, 0x1E63, 0x94E1, 0x94F2, 0x0D77,
+    0x94F3, 0x94F3, 0x1E64, 0x94F4, 0x94FC, 0x0D8A, 0x9540, 0x9540, 0x0D93,
+    0x9541, 0x9542, 0x1E65, 0x9543, 0x954D, 0x0D96, 0x954E, 0x954E, 0x1E67,
+    0x954F, 0x954F, 0x143B, 0x9550, 0x9550, 0x0DA3, 0x9551, 0x9551, 0x1E68,
+    0x9552, 0x9553, 0x0DA5, 0x9554, 0x9554, 0x1E69, 0x9555, 0x955E, 0x0DA8,
+    0x955F, 0x955F, 0x1E6A, 0x9560, 0x956C, 0x0DB3, 0x956D, 0x956D, 0x1E6B,
+    0x956E, 0x956F, 0x0DC1, 0x9570, 0x9570, 0x1E6C, 0x9571, 0x957E, 0x0DC4,
+    0x9580, 0x95C0, 0x0DD2, 0x95C1, 0x95C1, 0x1E6D, 0x95C2, 0x95CA, 0x0E14,
+    0x95CB, 0x95CB, 0x1E6E, 0x95CC, 0x95D7, 0x0E1E, 0x95D8, 0x95D8, 0x1E6F,
+    0x95D9, 0x95F6, 0x0E2B, 0x95F7, 0x95F7, 0x1E70, 0x95F8, 0x95FC, 0x0E4A,
+    0x9640, 0x9640, 0x0E4F, 0x9641, 0x9641, 0x1E71, 0x9642, 0x9647, 0x0E51,
+    0x9648, 0x9648, 0x1E72, 0x9649, 0x9669, 0x0E58, 0x966A, 0x966A, 0x1E73,
+    0x966B, 0x967E, 0x0E7A, 0x9680, 0x9689, 0x0E8E, 0x968A, 0x968A, 0x1D33,
+    0x968B, 0x968F, 0x0E99, 0x9690, 0x9690, 0x1E74, 0x9691, 0x9698, 0x0E9F,
+    0x9699, 0x9699, 0x102F, 0x969A, 0x96CA, 0x0EA8, 0x96CB, 0x96CB, 0x1E75,
+    0x96CC, 0x96D6, 0x0EDA, 0x96D7, 0x96D7, 0x1E76, 0x96D8, 0x96DC, 0x0EE6,
+    0x96DD, 0x96DD, 0x1E77, 0x96DE, 0x96DF, 0x0EEC, 0x96E0, 0x96E0, 0x1E78,
+    0x96E1, 0x96F6, 0x0EEF, 0x96F7, 0x96F7, 0x1935, 0x96F8, 0x96F8, 0x1E79,
+    0x96F9, 0x96F9, 0x0F07, 0x96FA, 0x96FA, 0x1E7A, 0x96FB, 0x96FB, 0x0F09,
+    0x96FC, 0x96FC, 0x1E7B, 0x9740, 0x9750, 0x0F0B, 0x9751, 0x9751, 0x1E7C,
+    0x9752, 0x976E, 0x0F1D, 0x976F, 0x976F, 0x1E7D, 0x9770, 0x9772, 0x0F3B,
+    0x9773, 0x9773, 0x1E7E, 0x9774, 0x9778, 0x0F3F, 0x9779, 0x9779, 0x1D34,
+    0x977A, 0x977E, 0x0F45, 0x9780, 0x9788, 0x0F4A, 0x9789, 0x9789, 0x1E7F,
+    0x978A, 0x97C8, 0x0F54, 0x97C9, 0x97C9, 0x1E80, 0x97CA, 0x97F7, 0x0F94,
+    0x97F8, 0x97F9, 0x1E81, 0x97FA, 0x97FC, 0x0FC4, 0x9840, 0x9840, 0x1E83,
+    0x9841, 0x984F, 0x0FC8, 0x9850, 0x9850, 0x1E84, 0x9851, 0x9854, 0x0FD8,
+    0x9855, 0x9855, 0x1777, 0x9856, 0x9857, 0x0FDD, 0x9858, 0x9858, 0x1E85,
+    0x9859, 0x9872, 0x0FE0, 0x989F, 0x98D3, 0x0FFA, 0x98D4, 0x98D4, 0x0EA7,
+    0x98D5, 0x98FC, 0x1030, 0x9940, 0x995B, 0x1058, 0x995C, 0x995C, 0x1E86,
+    0x995D, 0x9965, 0x1075, 0x9966, 0x9966, 0x1E87, 0x9967, 0x9969, 0x107F,
+    0x996A, 0x996A, 0x1E88, 0x996B, 0x996B, 0x1083, 0x996C, 0x996C, 0x1E89,
+    0x996D, 0x997E, 0x1085, 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A4E, 0x1114,
+    0x9A4F, 0x9A4F, 0x1E8A, 0x9A50, 0x9A58, 0x1124, 0x9A59, 0x9A59, 0x1E8B,
+    0x9A5A, 0x9A6E, 0x112E, 0x9A6F, 0x9A6F, 0x1E8C, 0x9A70, 0x9A7C, 0x1144,
+    0x9A7D, 0x9A7D, 0x1E8D, 0x9A7E, 0x9A7E, 0x1152, 0x9A80, 0x9A8A, 0x1153,
+    0x9A8B, 0x9A8B, 0x1E8E, 0x9A8C, 0x9AC1, 0x115F, 0x9AC2, 0x9AC2, 0x1E8F,
+    0x9AC3, 0x9AE1, 0x1196, 0x9AE2, 0x9AE2, 0x0BF7, 0x9AE3, 0x9AFC, 0x11B6,
+    0x9B40, 0x9B5B, 0x11D0, 0x9B5C, 0x9B5C, 0x1E90, 0x9B5D, 0x9B7E, 0x11ED,
+    0x9B80, 0x9B82, 0x120F, 0x9B83, 0x9B83, 0x1E91, 0x9B84, 0x9B9F, 0x1213,
+    0x9BA0, 0x9BA0, 0x1E92, 0x9BA1, 0x9BEF, 0x1230, 0x9BF0, 0x9BF0, 0x1E93,
+    0x9BF1, 0x9BFC, 0x1280, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CA1, 0x12CB,
+    0x9CA2, 0x9CA2, 0x1E94, 0x9CA3, 0x9CFC, 0x12EE, 0x9D40, 0x9D7E, 0x1348,
+    0x9D80, 0x9D80, 0x1E95, 0x9D81, 0x9D8B, 0x1388, 0x9D8C, 0x9D8C, 0x1E96,
+    0x9D8D, 0x9D97, 0x1394, 0x9D98, 0x9D98, 0x05A7, 0x9D99, 0x9DB6, 0x13A0,
+    0x9DB7, 0x9DB7, 0x1E97, 0x9DB8, 0x9DCA, 0x13BF, 0x9DCB, 0x9DCB, 0x1E98,
+    0x9DCC, 0x9DFC, 0x13D3, 0x9E40, 0x9E63, 0x1404, 0x9E64, 0x9E64, 0x1E99,
+    0x9E65, 0x9E68, 0x1429, 0x9E69, 0x9E69, 0x1E9A, 0x9E6A, 0x9E76, 0x142E,
+    0x9E77, 0x9E77, 0x0DA2, 0x9E78, 0x9E7E, 0x143C, 0x9E80, 0x9E8A, 0x1443,
+    0x9E8B, 0x9E8B, 0x1E9B, 0x9E8C, 0x9E8C, 0x144F, 0x9E8D, 0x9E8D, 0x0C68,
+    0x9E8E, 0x9E93, 0x1451, 0x9E94, 0x9E94, 0x1E9C, 0x9E95, 0x9EFC, 0x1458,
+    0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FB6, 0x14FF, 0x9FB7, 0x9FB7, 0x0C6D,
+    0x9FB8, 0x9FCD, 0x1537, 0x9FCE, 0x9FCE, 0x1E9D, 0x9FCF, 0x9FF2, 0x154E,
+    0x9FF3, 0x9FF3, 0x05FF, 0x9FF4, 0x9FFC, 0x1573, 0xE040, 0xE07E, 0x157C,
+    0xE080, 0xE092, 0x15BB, 0xE093, 0xE093, 0x1E9E, 0xE094, 0xE0A3, 0x15CF,
+    0xE0A4, 0xE0A4, 0x1E9F, 0xE0A5, 0xE0DC, 0x15E0, 0xE0DD, 0xE0DD, 0x1EA0,
+    0xE0DE, 0xE0F3, 0x1619, 0xE0F4, 0xE0F4, 0x1D35, 0xE0F5, 0xE0FC, 0x1630,
+    0xE140, 0xE149, 0x1638, 0xE14A, 0xE14A, 0x1EA1, 0xE14B, 0xE14E, 0x1643,
+    0xE14F, 0xE150, 0x1EA2, 0xE151, 0xE17E, 0x1649, 0xE180, 0xE1A8, 0x1677,
+    0xE1A9, 0xE1A9, 0x1EA4, 0xE1AA, 0xE1E5, 0x16A1, 0xE1E6, 0xE1E6, 0x07EE,
+    0xE1E7, 0xE1E7, 0x16DE, 0xE1E8, 0xE1E8, 0x0C51, 0xE1E9, 0xE1EC, 0x16E0,
+    0xE1ED, 0xE1ED, 0x1EA5, 0xE1EE, 0xE1FC, 0x16E5, 0xE240, 0xE268, 0x16F4,
+    0xE269, 0xE269, 0x1EA6, 0xE26A, 0xE272, 0x171E, 0xE273, 0xE273, 0x1EA7,
+    0xE274, 0xE27C, 0x1728, 0xE27D, 0xE27D, 0x05D4, 0xE27E, 0xE27E, 0x1732,
+    0xE280, 0xE2B6, 0x1733, 0xE2B7, 0xE2B7, 0x1EA8, 0xE2B8, 0xE2C3, 0x176B,
+    0xE2C4, 0xE2C4, 0x0FDC, 0xE2C5, 0xE2E1, 0x1778, 0xE2E2, 0xE2E2, 0x1EA9,
+    0xE2E3, 0xE2EB, 0x1796, 0xE2EC, 0xE2EC, 0x1EAA, 0xE2ED, 0xE2FC, 0x17A0,
+    0xE340, 0xE357, 0x17B0, 0xE358, 0xE358, 0x1EAB, 0xE359, 0xE359, 0x17C9,
+    0xE35A, 0xE35A, 0x1EAC, 0xE35B, 0xE364, 0x17CB, 0xE365, 0xE365, 0x1EAD,
+    0xE366, 0xE37E, 0x17D6, 0xE380, 0xE3C3, 0x17EF, 0xE3C4, 0xE3C4, 0x1EAE,
+    0xE3C5, 0xE3FC, 0x1834, 0xE440, 0xE47E, 0x186C, 0xE480, 0xE483, 0x18AB,
+    0xE484, 0xE484, 0x1EAF, 0xE485, 0xE488, 0x18B0, 0xE489, 0xE489, 0x1EB0,
+    0xE48A, 0xE491, 0x18B5, 0xE492, 0xE492, 0x1EB1, 0xE493, 0xE4B1, 0x18BE,
+    0xE4B2, 0xE4B2, 0x1EB2, 0xE4B3, 0xE4B8, 0x18DE, 0xE4B9, 0xE4B9, 0x1EB3,
+    0xE4BA, 0xE4F1, 0x18E5, 0xE4F2, 0xE4F2, 0x1EB4, 0xE4F3, 0xE4FC, 0x191E,
+    0xE540, 0xE540, 0x1928, 0xE541, 0xE541, 0x08F5, 0xE542, 0xE54C, 0x192A,
+    0xE54D, 0xE54D, 0x0F05, 0xE54E, 0xE55A, 0x1936, 0xE55B, 0xE55B, 0x1EB5,
+    0xE55C, 0xE578, 0x1944, 0xE579, 0xE579, 0x05A0, 0xE57A, 0xE57E, 0x1962,
+    0xE580, 0xE5A1, 0x1967, 0xE5A2, 0xE5A2, 0x0D1E, 0xE5A3, 0xE5A4, 0x198A,
+    0xE5A5, 0xE5A5, 0x1EB6, 0xE5A6, 0xE5BA, 0x198D, 0xE5BB, 0xE5BB, 0x1EB7,
+    0xE5BC, 0xE5EC, 0x19A3, 0xE5ED, 0xE5ED, 0x1EB8, 0xE5EE, 0xE5FC, 0x19D5,
+    0xE640, 0xE650, 0x19E4, 0xE651, 0xE651, 0x1EB9, 0xE652, 0xE67B, 0x19F6,
+    0xE67C, 0xE67C, 0x060E, 0xE67D, 0xE67E, 0x1A21, 0xE680, 0xE685, 0x1A23,
+    0xE686, 0xE686, 0x1EBA, 0xE687, 0xE695, 0x1A2A, 0xE696, 0xE696, 0x1EBB,
+    0xE697, 0xE6CA, 0x1A3A, 0xE6CB, 0xE6CB, 0x0AAA, 0xE6CC, 0xE6E6, 0x1A6F,
+    0xE6E7, 0xE6E7, 0x1EBC, 0xE6E8, 0xE6F1, 0x1A8B, 0xE6F2, 0xE6F2, 0x1EBD,
+    0xE6F3, 0xE6FC, 0x1A96, 0xE740, 0xE76C, 0x1AA0, 0xE76D, 0xE76D, 0x1EBE,
+    0xE76E, 0xE77E, 0x1ACE, 0xE780, 0xE78B, 0x1ADF, 0xE78C, 0xE78C, 0x1EBF,
+    0xE78D, 0xE78D, 0x1AEC, 0xE78E, 0xE78E, 0x1EC0, 0xE78F, 0xE7A6, 0x1AEE,
+    0xE7A7, 0xE7A7, 0x1EC1, 0xE7A8, 0xE7BA, 0x1B07, 0xE7BB, 0xE7BB, 0x1EC2,
+    0xE7BC, 0xE7D4, 0x1B1B, 0xE7D5, 0xE7D5, 0x1EC3, 0xE7D6, 0xE7FC, 0x1B35,
+    0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE884, 0x1B9B, 0xE885, 0xE885, 0x1EC4,
+    0xE886, 0xE8B0, 0x1BA1, 0xE8B1, 0xE8B1, 0x1EC5, 0xE8B2, 0xE8C2, 0x1BCD,
+    0xE8C3, 0xE8C3, 0x1EC6, 0xE8C4, 0xE8CE, 0x1BDF, 0xE8CF, 0xE8CF, 0x1EC7,
+    0xE8D0, 0xE8D4, 0x1BEB, 0xE8D5, 0xE8D5, 0x1EC8, 0xE8D6, 0xE8F1, 0x1BF1,
+    0xE8F2, 0xE8F2, 0x0731, 0xE8F3, 0xE8F3, 0x1EC9, 0xE8F4, 0xE8FC, 0x1C0F,
+    0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9AA, 0x1C57, 0xE9AB, 0xE9AB, 0x1ECA,
+    0xE9AC, 0xE9B9, 0x1C83, 0xE9BA, 0xE9BA, 0x1ECB, 0xE9BB, 0xE9CA, 0x1C92,
+    0xE9CB, 0xE9CB, 0x0477, 0xE9CC, 0xE9CC, 0x1ECC, 0xE9CD, 0xE9F1, 0x1CA4,
+    0xE9F2, 0xE9F2, 0x0529, 0xE9F3, 0xE9FC, 0x1CCA, 0xEA40, 0xEA6F, 0x1CD4,
+    0xEA70, 0xEA70, 0x1ECD, 0xEA71, 0xEA7E, 0x1D05, 0xEA80, 0xEA9C, 0x1D13,
+    0xEA9D, 0xEA9D, 0x1ECE, 0xEA9E, 0xEA9E, 0x1D31, 0xED40, 0xED7E, 0x20A7,
+    0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9, 0xEDB5, 0xEDFC, 0x211A,
+    0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1, 0xEEEF, 0xEEF8, 0x1F9C,
+    0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-V_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-V_2.cpp
new file mode 100644
index 0000000..d57dce9
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-V_2.cpp
@@ -0,0 +1,21 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_Ext_RKSJ_V_2[39 * 3] = {
+    0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,
+    0x814A, 0x814A, 0x2050, 0x814B, 0x814B, 0x204F, 0x815B, 0x815D, 0x1ED3,
+    0x8160, 0x8164, 0x1ED6, 0x8165, 0x8165, 0x2059, 0x8166, 0x8166, 0x2054,
+    0x8167, 0x8167, 0x2057, 0x8168, 0x8168, 0x2056, 0x8169, 0x817A, 0x1EDB,
+    0x818B, 0x818B, 0x204D, 0x818C, 0x818C, 0x2051, 0x818D, 0x818D, 0x205B,
+    0x81AC, 0x81AC, 0x204E, 0x829F, 0x829F, 0x1EEE, 0x82A1, 0x82A1, 0x1EEF,
+    0x82A3, 0x82A3, 0x1EF0, 0x82A5, 0x82A5, 0x1EF1, 0x82A7, 0x82A7, 0x1EF2,
+    0x82C1, 0x82C1, 0x1EF3, 0x82E1, 0x82E1, 0x1EF4, 0x82E3, 0x82E3, 0x1EF5,
+    0x82E5, 0x82E5, 0x1EF6, 0x82EC, 0x82EC, 0x1EF7, 0x8340, 0x8340, 0x1EF8,
+    0x8342, 0x8342, 0x1EF9, 0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB,
+    0x8348, 0x8348, 0x1EFC, 0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE,
+    0x8385, 0x8385, 0x1EFF, 0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01,
+    0x8395, 0x8396, 0x1F02, 0x875F, 0x876E, 0x1F04, 0x8780, 0x8781, 0x1F14,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp
new file mode 100644
index 0000000..e14e699
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp
@@ -0,0 +1,48 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_H_1[118 * 3] = {

+    0x2121, 0x217E, 0x0279, 0x2221, 0x222E, 0x02D7, 0x223A, 0x2241, 0x02E5,

+    0x224A, 0x2250, 0x02ED, 0x225C, 0x226A, 0x02F4, 0x2272, 0x2279, 0x0303,

+    0x227E, 0x227E, 0x030B, 0x2330, 0x2339, 0x030C, 0x2341, 0x235A, 0x0316,

+    0x2361, 0x237A, 0x0330, 0x2421, 0x2473, 0x034A, 0x2521, 0x2576, 0x039D,

+    0x2621, 0x2638, 0x03F3, 0x2641, 0x2658, 0x040B, 0x2721, 0x2741, 0x0423,

+    0x2751, 0x2771, 0x0444, 0x2821, 0x2821, 0x1D37, 0x2822, 0x2822, 0x1D39,

+    0x2823, 0x2823, 0x1D43, 0x2824, 0x2824, 0x1D47, 0x2825, 0x2825, 0x1D4F,

+    0x2826, 0x2826, 0x1D4B, 0x2827, 0x2827, 0x1D53, 0x2828, 0x2828, 0x1D63,

+    0x2829, 0x2829, 0x1D5B, 0x282A, 0x282A, 0x1D6B, 0x282B, 0x282B, 0x1D73,

+    0x282C, 0x282C, 0x1D38, 0x282D, 0x282D, 0x1D3A, 0x282E, 0x282E, 0x1D46,

+    0x282F, 0x282F, 0x1D4A, 0x2830, 0x2830, 0x1D52, 0x2831, 0x2831, 0x1D4E,

+    0x2832, 0x2832, 0x1D5A, 0x2833, 0x2833, 0x1D6A, 0x2834, 0x2834, 0x1D62,

+    0x2835, 0x2835, 0x1D72, 0x2836, 0x2836, 0x1D82, 0x2837, 0x2837, 0x1D57,

+    0x2838, 0x2838, 0x1D66, 0x2839, 0x2839, 0x1D5F, 0x283A, 0x283A, 0x1D6E,

+    0x283B, 0x283B, 0x1D76, 0x283C, 0x283C, 0x1D54, 0x283D, 0x283D, 0x1D67,

+    0x283E, 0x283E, 0x1D5C, 0x283F, 0x283F, 0x1D6F, 0x2840, 0x2840, 0x1D79,

+    0x3021, 0x307E, 0x0465, 0x3121, 0x317E, 0x04C3, 0x3221, 0x327E, 0x0521,

+    0x3321, 0x337E, 0x057F, 0x3421, 0x347E, 0x05DD, 0x3521, 0x357E, 0x063B,

+    0x3621, 0x367E, 0x0699, 0x3721, 0x377E, 0x06F7, 0x3821, 0x387E, 0x0755,

+    0x3921, 0x397E, 0x07B3, 0x3A21, 0x3A7E, 0x0811, 0x3B21, 0x3B7E, 0x086F,

+    0x3C21, 0x3C7E, 0x08CD, 0x3D21, 0x3D7E, 0x092B, 0x3E21, 0x3E7E, 0x0989,

+    0x3F21, 0x3F7E, 0x09E7, 0x4021, 0x407E, 0x0A45, 0x4121, 0x417E, 0x0AA3,

+    0x4221, 0x427E, 0x0B01, 0x4321, 0x437E, 0x0B5F, 0x4421, 0x447E, 0x0BBD,

+    0x4521, 0x457E, 0x0C1B, 0x4621, 0x467E, 0x0C79, 0x4721, 0x477E, 0x0CD7,

+    0x4821, 0x487E, 0x0D35, 0x4921, 0x497E, 0x0D93, 0x4A21, 0x4A7E, 0x0DF1,

+    0x4B21, 0x4B7E, 0x0E4F, 0x4C21, 0x4C7E, 0x0EAD, 0x4D21, 0x4D7E, 0x0F0B,

+    0x4E21, 0x4E7E, 0x0F69, 0x4F21, 0x4F53, 0x0FC7, 0x5021, 0x507E, 0x0FFA,

+    0x5121, 0x517E, 0x1058, 0x5221, 0x527E, 0x10B6, 0x5321, 0x537E, 0x1114,

+    0x5421, 0x547E, 0x1172, 0x5521, 0x557E, 0x11D0, 0x5621, 0x567E, 0x122E,

+    0x5721, 0x577E, 0x128C, 0x5821, 0x587E, 0x12EA, 0x5921, 0x597E, 0x1348,

+    0x5A21, 0x5A7E, 0x13A6, 0x5B21, 0x5B7E, 0x1404, 0x5C21, 0x5C7E, 0x1462,

+    0x5D21, 0x5D7E, 0x14C0, 0x5E21, 0x5E7E, 0x151E, 0x5F21, 0x5F7E, 0x157C,

+    0x6021, 0x607E, 0x15DA, 0x6121, 0x617E, 0x1638, 0x6221, 0x627E, 0x1696,

+    0x6321, 0x637E, 0x16F4, 0x6421, 0x647E, 0x1752, 0x6521, 0x657E, 0x17B0,

+    0x6621, 0x667E, 0x180E, 0x6721, 0x677E, 0x186C, 0x6821, 0x687E, 0x18CA,

+    0x6921, 0x697E, 0x1928, 0x6A21, 0x6A7E, 0x1986, 0x6B21, 0x6B7E, 0x19E4,

+    0x6C21, 0x6C7E, 0x1A42, 0x6D21, 0x6D7E, 0x1AA0, 0x6E21, 0x6E7E, 0x1AFE,

+    0x6F21, 0x6F7E, 0x1B5C, 0x7021, 0x707E, 0x1BBA, 0x7121, 0x717E, 0x1C18,

+    0x7221, 0x727E, 0x1C76, 0x7321, 0x737E, 0x1CD4, 0x7421, 0x7424, 0x1D32,

+    0x7425, 0x7426, 0x205C,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp
new file mode 100644
index 0000000..9983758
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniJIS_UCS2_HW_H_4[4 * 3] = {
+    0x0020, 0x005B, 0x00E7, 0x005C, 0x005C, 0x220F, 0x005D, 0x007E, 0x0124,
+    0x00A5, 0x00A5, 0x0123,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp
new file mode 100644
index 0000000..a59420a
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp
@@ -0,0 +1,75 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_UniJIS_UCS2_HW_V_4[199 * 3] = {

+    0x0020, 0x005B, 0x00E7, 0x005C, 0x005C, 0x220F, 0x005D, 0x007E, 0x0124,

+    0x00A5, 0x00A5, 0x0123, 0x00B0, 0x00B0, 0x204D, 0x2010, 0x2010, 0x1ED5,

+    0x2015, 0x2015, 0x1ED4, 0x2016, 0x2016, 0x1ED7, 0x2018, 0x2019, 0x2059,

+    0x201C, 0x201D, 0x2057, 0x2025, 0x2025, 0x1EDA, 0x2026, 0x2026, 0x1ED9,

+    0x2032, 0x2032, 0x2051, 0x2033, 0x2033, 0x205B, 0x2190, 0x2190, 0x02E2,

+    0x2191, 0x2191, 0x02E0, 0x2192, 0x2192, 0x02E3, 0x2193, 0x2193, 0x02E1,

+    0x2195, 0x2195, 0x2FB6, 0x21C4, 0x21C4, 0x2077, 0x21C5, 0x21C5, 0x2076,

+    0x21C6, 0x21C6, 0x2078, 0x21E6, 0x21E6, 0x1F4C, 0x21E7, 0x21E7, 0x1F4E,

+    0x21E8, 0x21E8, 0x1F4B, 0x21E9, 0x21E9, 0x1F4D, 0x2225, 0x2225, 0x1ED7,

+    0x223C, 0x223C, 0x1ED6, 0x22EF, 0x22EF, 0x1ED9, 0x2500, 0x2501, 0x1D39,

+    0x2502, 0x2503, 0x1D37, 0x2504, 0x2505, 0x1D3D, 0x2506, 0x2507, 0x1D3B,

+    0x2508, 0x2509, 0x1D41, 0x250A, 0x250B, 0x1D3F, 0x250C, 0x250C, 0x1D47,

+    0x250D, 0x250D, 0x1D49, 0x250E, 0x250E, 0x1D48, 0x250F, 0x250F, 0x1D4A,

+    0x2510, 0x2510, 0x1D4F, 0x2511, 0x2511, 0x1D51, 0x2512, 0x2512, 0x1D50,

+    0x2513, 0x2513, 0x1D52, 0x2514, 0x2514, 0x1D43, 0x2515, 0x2515, 0x1D45,

+    0x2516, 0x2516, 0x1D44, 0x2517, 0x2517, 0x1D46, 0x2518, 0x2518, 0x1D4B,

+    0x2519, 0x2519, 0x1D4D, 0x251A, 0x251A, 0x1D4C, 0x251B, 0x251B, 0x1D4E,

+    0x251C, 0x251C, 0x1D63, 0x251D, 0x251D, 0x1D67, 0x251E, 0x251E, 0x1D65,

+    0x251F, 0x251F, 0x1D64, 0x2520, 0x2520, 0x1D66, 0x2521, 0x2521, 0x1D69,

+    0x2522, 0x2522, 0x1D68, 0x2523, 0x2524, 0x1D6A, 0x2525, 0x2525, 0x1D6F,

+    0x2526, 0x2526, 0x1D6D, 0x2527, 0x2527, 0x1D6C, 0x2528, 0x2528, 0x1D6E,

+    0x2529, 0x2529, 0x1D71, 0x252A, 0x252A, 0x1D70, 0x252B, 0x252B, 0x1D72,

+    0x252C, 0x252C, 0x1D5B, 0x252D, 0x252F, 0x1D5D, 0x2530, 0x2530, 0x1D5C,

+    0x2531, 0x2533, 0x1D60, 0x2534, 0x2534, 0x1D53, 0x2535, 0x2537, 0x1D55,

+    0x2538, 0x2538, 0x1D54, 0x2539, 0x253B, 0x1D58, 0x253D, 0x253F, 0x1D77,

+    0x2540, 0x2540, 0x1D75, 0x2541, 0x2541, 0x1D74, 0x2542, 0x2542, 0x1D76,

+    0x2543, 0x2543, 0x1D7B, 0x2544, 0x2544, 0x1D7D, 0x2545, 0x2545, 0x1D7A,

+    0x2546, 0x2546, 0x1D7C, 0x2547, 0x2547, 0x1D81, 0x2548, 0x2548, 0x1D80,

+    0x2549, 0x254A, 0x1D7E, 0x261C, 0x261C, 0x201D, 0x261D, 0x261D, 0x201B,

+    0x261E, 0x261E, 0x201E, 0x261F, 0x261F, 0x201C, 0x2702, 0x2702, 0x2F92,

+    0x27A1, 0x27A1, 0x2011, 0x3001, 0x3002, 0x1ECF, 0x3008, 0x3011, 0x1EE3,

+    0x3013, 0x3013, 0x204E, 0x3014, 0x3015, 0x1EDD, 0x301C, 0x301C, 0x1ED6,

+    0x301D, 0x301D, 0x1F14, 0x301F, 0x301F, 0x1F15, 0x3041, 0x3041, 0x1EEE,

+    0x3043, 0x3043, 0x1EEF, 0x3045, 0x3045, 0x1EF0, 0x3047, 0x3047, 0x1EF1,

+    0x3049, 0x3049, 0x1EF2, 0x3063, 0x3063, 0x1EF3, 0x3083, 0x3083, 0x1EF4,

+    0x3085, 0x3085, 0x1EF5, 0x3087, 0x3087, 0x1EF6, 0x308E, 0x308E, 0x1EF7,

+    0x309B, 0x309B, 0x2050, 0x309C, 0x309C, 0x204F, 0x30A1, 0x30A1, 0x1EF8,

+    0x30A3, 0x30A3, 0x1EF9, 0x30A5, 0x30A5, 0x1EFA, 0x30A7, 0x30A7, 0x1EFB,

+    0x30A9, 0x30A9, 0x1EFC, 0x30C3, 0x30C3, 0x1EFD, 0x30E3, 0x30E3, 0x1EFE,

+    0x30E5, 0x30E5, 0x1EFF, 0x30E7, 0x30E7, 0x1F00, 0x30EE, 0x30EE, 0x1F01,

+    0x30F5, 0x30F6, 0x1F02, 0x30FC, 0x30FC, 0x1ED3, 0x3300, 0x3300, 0x209E,

+    0x3301, 0x3302, 0x2EB6, 0x3303, 0x3303, 0x2092, 0x3304, 0x3304, 0x2EB8,

+    0x3305, 0x3305, 0x208D, 0x3306, 0x3306, 0x2EB9, 0x3307, 0x3307, 0x2EBD,

+    0x3308, 0x3308, 0x2EBB, 0x3309, 0x3309, 0x2EC0, 0x330A, 0x330A, 0x2EBE,

+    0x330B, 0x330B, 0x2EC2, 0x330C, 0x330C, 0x2EC4, 0x330D, 0x330D, 0x1F0E,

+    0x330E, 0x3313, 0x2EC5, 0x3314, 0x3314, 0x1F05, 0x3315, 0x3315, 0x2094,

+    0x3316, 0x3316, 0x208A, 0x3317, 0x3317, 0x2ECC, 0x3318, 0x3318, 0x2093,

+    0x3319, 0x3319, 0x2ECE, 0x331A, 0x331D, 0x2ED0, 0x331E, 0x331E, 0x20A1,

+    0x331F, 0x3321, 0x2ED4, 0x3322, 0x3322, 0x2089, 0x3323, 0x3323, 0x209C,

+    0x3324, 0x3324, 0x2ED7, 0x3325, 0x3325, 0x2ED9, 0x3326, 0x3326, 0x1F0F,

+    0x3327, 0x3327, 0x1F09, 0x3328, 0x3329, 0x2EDC, 0x332A, 0x332A, 0x20A4,

+    0x332B, 0x332B, 0x1F11, 0x332D, 0x332D, 0x2EDF, 0x332E, 0x3330, 0x2EE2,

+    0x3331, 0x3331, 0x20A6, 0x3332, 0x3332, 0x2EE5, 0x3333, 0x3333, 0x208E,

+    0x3334, 0x3335, 0x2EE8, 0x3336, 0x3336, 0x1F0B, 0x3337, 0x3337, 0x2EEE,

+    0x3338, 0x3338, 0x2EF0, 0x3339, 0x3339, 0x2097, 0x333A, 0x333A, 0x2EF1,

+    0x333B, 0x333B, 0x209D, 0x333C, 0x333C, 0x2EEA, 0x333D, 0x333D, 0x2EF2,

+    0x333E, 0x3340, 0x2EF4, 0x3341, 0x3341, 0x2EF3, 0x3342, 0x3342, 0x209B,

+    0x3343, 0x3346, 0x2EF7, 0x3347, 0x3347, 0x20A5, 0x3348, 0x3348, 0x2EFB,

+    0x3349, 0x3349, 0x1F04, 0x334A, 0x334A, 0x1F12, 0x334B, 0x334C, 0x2EFC,

+    0x334D, 0x334D, 0x1F07, 0x334E, 0x334E, 0x2091, 0x334F, 0x3350, 0x2EFE,

+    0x3351, 0x3351, 0x1F0C, 0x3352, 0x3352, 0x2F02, 0x3353, 0x3353, 0x2F06,

+    0x3354, 0x3354, 0x2F03, 0x3355, 0x3356, 0x2F07, 0x3357, 0x3357, 0x2098,

+    0x337F, 0x337F, 0x2084, 0xFF08, 0xFF09, 0x1EDB, 0xFF0C, 0xFF0C, 0x204C,

+    0xFF0E, 0xFF0E, 0x2052, 0xFF1D, 0xFF1D, 0x1EED, 0xFF3B, 0xFF3B, 0x1EDF,

+    0xFF3D, 0xFF3D, 0x1EE0, 0xFF3F, 0xFF3F, 0x1ED2, 0xFF5B, 0xFF5B, 0x1EE1,

+    0xFF5C, 0xFF5C, 0x1ED8, 0xFF5D, 0xFF5D, 0x1EE2, 0xFF5E, 0xFF5E, 0x1ED6,

+    0xFFE3, 0xFFE3, 0x1ED1,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp
new file mode 100644
index 0000000..35f0b71
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp
@@ -0,0 +1,2451 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_UniJIS_UCS2_H_4[9772 * 2] = {

+    0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,

+    0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,

+    0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,

+    0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,

+    0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,

+    0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,

+    0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,

+    0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,

+    0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,

+    0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,

+    0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,

+    0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,

+    0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,

+    0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,

+    0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,

+    0x005C, 0x0061, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,

+    0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,

+    0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,

+    0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,

+    0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,

+    0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,

+    0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,

+    0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,

+    0x007C, 0x005D, 0x007D, 0x005E, 0x007E, 0x005F, 0x00A1, 0x0065,

+    0x00A2, 0x0066, 0x00A3, 0x0067, 0x00A4, 0x006B, 0x00A5, 0x003D,

+    0x00A6, 0x0063, 0x00A7, 0x02D0, 0x00A8, 0x0287, 0x00A9, 0x0098,

+    0x00AA, 0x008C, 0x00AB, 0x006D, 0x00AC, 0x0099, 0x00AD, 0x0097,

+    0x00AE, 0x009A, 0x00AF, 0x0081, 0x00B0, 0x02C3, 0x00B1, 0x02B6,

+    0x00B2, 0x009D, 0x00B3, 0x009E, 0x00B4, 0x0285, 0x00B5, 0x009F,

+    0x00B6, 0x030A, 0x00B7, 0x0075, 0x00B8, 0x0086, 0x00B9, 0x00A0,

+    0x00BA, 0x0090, 0x00BB, 0x007B, 0x00BC, 0x00A1, 0x00BD, 0x00A2,

+    0x00BE, 0x00A3, 0x00BF, 0x007E, 0x00C0, 0x00A4, 0x00C1, 0x00A5,

+    0x00C2, 0x00A6, 0x00C3, 0x00A7, 0x00C4, 0x00A8, 0x00C5, 0x00A9,

+    0x00C6, 0x008B, 0x00C7, 0x00AA, 0x00C8, 0x00AB, 0x00C9, 0x00AC,

+    0x00CA, 0x00AD, 0x00CB, 0x00AE, 0x00CC, 0x00AF, 0x00CD, 0x00B0,

+    0x00CE, 0x00B1, 0x00CF, 0x00B2, 0x00D0, 0x00B3, 0x00D1, 0x00B4,

+    0x00D2, 0x00B5, 0x00D3, 0x00B6, 0x00D4, 0x00B7, 0x00D5, 0x00B8,

+    0x00D6, 0x00B9, 0x00D7, 0x02B7, 0x00D8, 0x008E, 0x00D9, 0x00BB,

+    0x00DA, 0x00BC, 0x00DB, 0x00BD, 0x00DC, 0x00BE, 0x00DD, 0x00BF,

+    0x00DE, 0x00C0, 0x00DF, 0x0096, 0x00E0, 0x00C1, 0x00E1, 0x00C2,

+    0x00E2, 0x00C3, 0x00E3, 0x00C4, 0x00E4, 0x00C5, 0x00E5, 0x00C6,

+    0x00E6, 0x0091, 0x00E7, 0x00C7, 0x00E8, 0x00C8, 0x00E9, 0x00C9,

+    0x00EA, 0x00CA, 0x00EB, 0x00CB, 0x00EC, 0x00CC, 0x00ED, 0x00CD,

+    0x00EE, 0x00CE, 0x00EF, 0x00CF, 0x00F0, 0x00D0, 0x00F1, 0x00D1,

+    0x00F2, 0x00D2, 0x00F3, 0x00D3, 0x00F4, 0x00D4, 0x00F5, 0x00D5,

+    0x00F6, 0x00D6, 0x00F7, 0x02B8, 0x00F8, 0x0094, 0x00F9, 0x00D8,

+    0x00FA, 0x00D9, 0x00FB, 0x00DA, 0x00FC, 0x00DB, 0x00FD, 0x00DC,

+    0x00FE, 0x00DD, 0x00FF, 0x00DE, 0x0100, 0x2496, 0x0101, 0x2491,

+    0x0112, 0x2499, 0x0113, 0x2494, 0x011A, 0x24B3, 0x011B, 0x24BF,

+    0x0127, 0x2F3C, 0x0128, 0x24B8, 0x0129, 0x24C4, 0x012A, 0x2497,

+    0x012B, 0x2492, 0x0131, 0x0092, 0x0141, 0x008D, 0x0142, 0x0093,

+    0x014B, 0x24DC, 0x014C, 0x249A, 0x014D, 0x2495, 0x0152, 0x008F,

+    0x0153, 0x0095, 0x0160, 0x00DF, 0x0161, 0x00E3, 0x0168, 0x24BD,

+    0x0169, 0x24C9, 0x016A, 0x2498, 0x016B, 0x2493, 0x016E, 0x24BC,

+    0x016F, 0x24C8, 0x0178, 0x00E0, 0x017D, 0x00E1, 0x017E, 0x00E5,

+    0x01C0, 0x0063, 0x01CD, 0x24B2, 0x01CE, 0x24BE, 0x01CF, 0x24B6,

+    0x01D0, 0x24C2, 0x01D1, 0x24B9, 0x01D2, 0x24C5, 0x01D3, 0x24BB,

+    0x01D4, 0x24C7, 0x01FD, 0x24CD, 0x0251, 0x24CA, 0x0254, 0x24CF,

+    0x0259, 0x24D2, 0x025A, 0x24D5, 0x025B, 0x24D8, 0x0275, 0x24DD,

+    0x0283, 0x24E2, 0x028C, 0x24DE, 0x0292, 0x24E1, 0x02D0, 0x24E3,

+    0x0300, 0x0041, 0x0301, 0x007F, 0x0302, 0x0080, 0x0303, 0x005F,

+    0x0304, 0x0081, 0x0305, 0x00E2, 0x0306, 0x0082, 0x0307, 0x0083,

+    0x0308, 0x0084, 0x030A, 0x0085, 0x030B, 0x0087, 0x030C, 0x0089,

+    0x0327, 0x0086, 0x0328, 0x0088, 0x0332, 0x0040, 0x0336, 0x008A,

+    0x0361, 0x02F6, 0x0391, 0x03F3, 0x0392, 0x03F4, 0x0393, 0x03F5,

+    0x0394, 0x03F6, 0x0395, 0x03F7, 0x0396, 0x03F8, 0x0397, 0x03F9,

+    0x0398, 0x03FA, 0x0399, 0x03FB, 0x039A, 0x03FC, 0x039B, 0x03FD,

+    0x039C, 0x03FE, 0x039D, 0x03FF, 0x039E, 0x0400, 0x039F, 0x0401,

+    0x03A0, 0x0402, 0x03A1, 0x0403, 0x03A3, 0x0404, 0x03A4, 0x0405,

+    0x03A5, 0x0406, 0x03A6, 0x0407, 0x03A7, 0x0408, 0x03A8, 0x0409,

+    0x03A9, 0x040A, 0x03B1, 0x040B, 0x03B2, 0x040C, 0x03B3, 0x040D,

+    0x03B4, 0x040E, 0x03B5, 0x040F, 0x03B6, 0x0410, 0x03B7, 0x0411,

+    0x03B8, 0x0412, 0x03B9, 0x0413, 0x03BA, 0x0414, 0x03BB, 0x0415,

+    0x03BC, 0x0416, 0x03BD, 0x0417, 0x03BE, 0x0418, 0x03BF, 0x0419,

+    0x03C0, 0x041A, 0x03C1, 0x041B, 0x03C3, 0x041C, 0x03C4, 0x041D,

+    0x03C5, 0x041E, 0x03C6, 0x041F, 0x03C7, 0x0420, 0x03C8, 0x0421,

+    0x03C9, 0x0422, 0x03D0, 0x2F3A, 0x03D1, 0x2F40, 0x03DB, 0x2F3F,

+    0x0401, 0x0429, 0x0410, 0x0423, 0x0411, 0x0424, 0x0412, 0x0425,

+    0x0413, 0x0426, 0x0414, 0x0427, 0x0415, 0x0428, 0x0416, 0x042A,

+    0x0417, 0x042B, 0x0418, 0x042C, 0x0419, 0x042D, 0x041A, 0x042E,

+    0x041B, 0x042F, 0x041C, 0x0430, 0x041D, 0x0431, 0x041E, 0x0432,

+    0x041F, 0x0433, 0x0420, 0x0434, 0x0421, 0x0435, 0x0422, 0x0436,

+    0x0423, 0x0437, 0x0424, 0x0438, 0x0425, 0x0439, 0x0426, 0x043A,

+    0x0427, 0x043B, 0x0428, 0x043C, 0x0429, 0x043D, 0x042A, 0x043E,

+    0x042B, 0x043F, 0x042C, 0x0440, 0x042D, 0x0441, 0x042E, 0x0442,

+    0x042F, 0x0443, 0x0430, 0x0444, 0x0431, 0x0445, 0x0432, 0x0446,

+    0x0433, 0x0447, 0x0434, 0x0448, 0x0435, 0x0449, 0x0436, 0x044B,

+    0x0437, 0x044C, 0x0438, 0x044D, 0x0439, 0x044E, 0x043A, 0x044F,

+    0x043B, 0x0450, 0x043C, 0x0451, 0x043D, 0x0452, 0x043E, 0x0453,

+    0x043F, 0x0454, 0x0440, 0x0455, 0x0441, 0x0456, 0x0442, 0x0457,

+    0x0443, 0x0458, 0x0444, 0x0459, 0x0445, 0x045A, 0x0446, 0x045B,

+    0x0447, 0x045C, 0x0448, 0x045D, 0x0449, 0x045E, 0x044A, 0x045F,

+    0x044B, 0x0460, 0x044C, 0x0461, 0x044D, 0x0462, 0x044E, 0x0463,

+    0x044F, 0x0464, 0x0451, 0x044A, 0x045B, 0x2F3C, 0x1EBC, 0x24B5,

+    0x1EBD, 0x24C1, 0x2002, 0x00E7, 0x2003, 0x0279, 0x2010, 0x0296,

+    0x2011, 0x000E, 0x2012, 0x0072, 0x2013, 0x0072, 0x2014, 0x008A,

+    0x2015, 0x0295, 0x2016, 0x029A, 0x2018, 0x029E, 0x2019, 0x029F,

+    0x201A, 0x0078, 0x201C, 0x02A0, 0x201D, 0x02A1, 0x201E, 0x0079,

+    0x2020, 0x0308, 0x2021, 0x0309, 0x2022, 0x0077, 0x2025, 0x029D,

+    0x2026, 0x029C, 0x2030, 0x0304, 0x2032, 0x02C4, 0x2033, 0x02C5,

+    0x2039, 0x006E, 0x203A, 0x006F, 0x203B, 0x02DE, 0x203C, 0x2F4F,

+    0x203E, 0x0145, 0x2044, 0x0068, 0x2049, 0x2F50, 0x2070, 0x24A1,

+    0x2074, 0x24A2, 0x2075, 0x24A3, 0x2076, 0x24A4, 0x2077, 0x24A5,

+    0x2078, 0x24A6, 0x2079, 0x24A7, 0x2080, 0x24A8, 0x2081, 0x24A9,

+    0x2082, 0x24AA, 0x2083, 0x24AB, 0x2084, 0x24AC, 0x2085, 0x24AD,

+    0x2086, 0x24AE, 0x2087, 0x24AF, 0x2088, 0x24B0, 0x2089, 0x24B1,

+    0x20AC, 0x248A, 0x20DD, 0x030B, 0x2100, 0x2E4F, 0x2103, 0x02C6,

+    0x2105, 0x2E53, 0x2109, 0x2071, 0x210A, 0x2070, 0x210F, 0x2F3C,

+    0x2113, 0x1F59, 0x2116, 0x1DBA, 0x2121, 0x1F77, 0x2122, 0x00E4,

+    0x2126, 0x248B, 0x212B, 0x0303, 0x2135, 0x2F39, 0x2153, 0x249F,

+    0x2154, 0x24A0, 0x215B, 0x249B, 0x215C, 0x249C, 0x215D, 0x249D,

+    0x215E, 0x249E, 0x2160, 0x1D97, 0x2161, 0x1D98, 0x2162, 0x1D99,

+    0x2163, 0x1D9A, 0x2164, 0x1D9B, 0x2165, 0x1D9C, 0x2166, 0x1D9D,

+    0x2167, 0x1D9E, 0x2168, 0x1D9F, 0x2169, 0x1DA0, 0x216A, 0x2021,

+    0x216B, 0x2022, 0x2170, 0x1F9C, 0x2171, 0x1F9D, 0x2172, 0x1F9E,

+    0x2173, 0x1F9F, 0x2174, 0x1FA0, 0x2175, 0x1FA1, 0x2176, 0x1FA2,

+    0x2177, 0x1FA3, 0x2178, 0x1FA4, 0x2179, 0x1FA5, 0x217A, 0x206A,

+    0x217B, 0x206B, 0x217F, 0x206F, 0x2190, 0x02E1, 0x2191, 0x02E2,

+    0x2192, 0x02E0, 0x2193, 0x02E3, 0x2194, 0x2FA9, 0x2195, 0x2FB7,

+    0x2196, 0x2FAC, 0x2197, 0x2FAD, 0x2198, 0x2FAA, 0x2199, 0x2FAB,

+    0x21C4, 0x2076, 0x21C5, 0x2077, 0x21C6, 0x2075, 0x21CC, 0x2FAE,

+    0x21D0, 0x2FA8, 0x21D2, 0x02F0, 0x21D4, 0x02F1, 0x21E6, 0x1F4D,

+    0x21E7, 0x1F4C, 0x21E8, 0x1F4E, 0x21E9, 0x1F4B, 0x2200, 0x02F2,

+    0x2202, 0x02F7, 0x2203, 0x02F3, 0x2205, 0x2F98, 0x2207, 0x02F8,

+    0x2208, 0x02E5, 0x220A, 0x2F3B, 0x220B, 0x02E6, 0x2211, 0x1DC9,

+    0x2212, 0x02B5, 0x2213, 0x2F56, 0x221A, 0x02FD, 0x221D, 0x02FF,

+    0x221E, 0x02BF, 0x221F, 0x1DCD, 0x2220, 0x02F4, 0x2225, 0x029A,

+    0x2227, 0x02ED, 0x2228, 0x02EE, 0x2229, 0x02EC, 0x222A, 0x02EB,

+    0x222B, 0x0301, 0x222C, 0x0302, 0x222D, 0x2003, 0x222E, 0x1DC8,

+    0x2234, 0x02C0, 0x2235, 0x0300, 0x223C, 0x0299, 0x223D, 0x02FE,

+    0x2243, 0x2F58, 0x2252, 0x02FA, 0x2260, 0x02BA, 0x2261, 0x02F9,

+    0x2266, 0x02BD, 0x2267, 0x02BE, 0x226A, 0x02FB, 0x226B, 0x02FC,

+    0x2272, 0x2F59, 0x2273, 0x2F5A, 0x2282, 0x02E9, 0x2283, 0x02EA,

+    0x2286, 0x02E7, 0x2287, 0x02E8, 0x2295, 0x2F9C, 0x2296, 0x2F9A,

+    0x2297, 0x2F9D, 0x2298, 0x2F9B, 0x229D, 0x2F9A, 0x229E, 0x2F9E,

+    0x22A0, 0x2F99, 0x22A5, 0x02F5, 0x22BF, 0x1DCE, 0x22EE, 0x1ED9,

+    0x22EF, 0x029C, 0x2300, 0x2F98, 0x2307, 0x2FBB, 0x2312, 0x02F6,

+    0x244A, 0x2F54, 0x2460, 0x1D83, 0x2461, 0x1D84, 0x2462, 0x1D85,

+    0x2463, 0x1D86, 0x2464, 0x1D87, 0x2465, 0x1D88, 0x2466, 0x1D89,

+    0x2467, 0x1D8A, 0x2468, 0x1D8B, 0x2469, 0x1D8C, 0x246A, 0x1D8D,

+    0x246B, 0x1D8E, 0x246C, 0x1D8F, 0x246D, 0x1D90, 0x246E, 0x1D91,

+    0x246F, 0x1D92, 0x2470, 0x1D93, 0x2471, 0x1D94, 0x2472, 0x1D95,

+    0x2473, 0x1D96, 0x2474, 0x1F87, 0x2475, 0x1F88, 0x2476, 0x1F89,

+    0x2477, 0x1F8A, 0x2478, 0x1F8B, 0x2479, 0x1F8C, 0x247A, 0x1F8D,

+    0x247B, 0x1F8E, 0x247C, 0x1F8F, 0x247D, 0x1F90, 0x247E, 0x1F91,

+    0x247F, 0x1F92, 0x2480, 0x1F93, 0x2481, 0x1F94, 0x2482, 0x1F95,

+    0x2483, 0x1F96, 0x2484, 0x1F97, 0x2485, 0x1F98, 0x2486, 0x1F99,

+    0x2487, 0x1F9A, 0x2488, 0x1F7E, 0x2489, 0x1F7F, 0x248A, 0x1F80,

+    0x248B, 0x1F81, 0x248C, 0x1F82, 0x248D, 0x1F83, 0x248E, 0x1F84,

+    0x248F, 0x1F85, 0x2490, 0x1F86, 0x249C, 0x1FB0, 0x249D, 0x1FB1,

+    0x249E, 0x1FB2, 0x249F, 0x1FB3, 0x24A0, 0x1FB4, 0x24A1, 0x1FB5,

+    0x24A2, 0x1FB6, 0x24A3, 0x1FB7, 0x24A4, 0x1FB8, 0x24A5, 0x1FB9,

+    0x24A6, 0x1FBA, 0x24A7, 0x1FBB, 0x24A8, 0x1FBC, 0x24A9, 0x1FBD,

+    0x24AA, 0x1FBE, 0x24AB, 0x1FBF, 0x24AC, 0x1FC0, 0x24AD, 0x1FC1,

+    0x24AE, 0x1FC2, 0x24AF, 0x1FC3, 0x24B0, 0x1FC4, 0x24B1, 0x1FC5,

+    0x24B2, 0x1FC6, 0x24B3, 0x1FC7, 0x24B4, 0x1FC8, 0x24B5, 0x1FC9,

+    0x24B6, 0x2863, 0x24B7, 0x2864, 0x24B8, 0x2865, 0x24B9, 0x2866,

+    0x24BA, 0x2867, 0x24BB, 0x2868, 0x24BC, 0x2869, 0x24BD, 0x286A,

+    0x24BE, 0x286B, 0x24BF, 0x286C, 0x24C0, 0x286D, 0x24C1, 0x286E,

+    0x24C2, 0x286F, 0x24C3, 0x2870, 0x24C4, 0x2871, 0x24C5, 0x2872,

+    0x24C6, 0x2873, 0x24C7, 0x2874, 0x24C8, 0x2875, 0x24C9, 0x2876,

+    0x24CA, 0x2877, 0x24CB, 0x2878, 0x24CC, 0x2879, 0x24CD, 0x287A,

+    0x24CE, 0x287B, 0x24CF, 0x287C, 0x24D0, 0x2849, 0x24D1, 0x284A,

+    0x24D2, 0x284B, 0x24D3, 0x284C, 0x24D4, 0x284D, 0x24D5, 0x284E,

+    0x24D6, 0x284F, 0x24D7, 0x2850, 0x24D8, 0x2851, 0x24D9, 0x2852,

+    0x24DA, 0x2853, 0x24DB, 0x2854, 0x24DC, 0x2855, 0x24DD, 0x2856,

+    0x24DE, 0x2857, 0x24DF, 0x2858, 0x24E0, 0x2859, 0x24E1, 0x285A,

+    0x24E2, 0x285B, 0x24E3, 0x285C, 0x24E4, 0x285D, 0x24E5, 0x285E,

+    0x24E6, 0x285F, 0x24E7, 0x2860, 0x24E8, 0x2861, 0x24E9, 0x2862,

+    0x24EA, 0x2020, 0x2500, 0x1D37, 0x2501, 0x1D38, 0x2502, 0x1D39,

+    0x2503, 0x1D3A, 0x2504, 0x1D3B, 0x2505, 0x1D3C, 0x2506, 0x1D3D,

+    0x2507, 0x1D3E, 0x2508, 0x1D3F, 0x2509, 0x1D40, 0x250A, 0x1D41,

+    0x250B, 0x1D42, 0x250C, 0x1D43, 0x250D, 0x1D44, 0x250E, 0x1D45,

+    0x250F, 0x1D46, 0x2510, 0x1D47, 0x2511, 0x1D48, 0x2512, 0x1D49,

+    0x2513, 0x1D4A, 0x2514, 0x1D4B, 0x2515, 0x1D4C, 0x2516, 0x1D4D,

+    0x2517, 0x1D4E, 0x2518, 0x1D4F, 0x2519, 0x1D50, 0x251A, 0x1D51,

+    0x251B, 0x1D52, 0x251C, 0x1D53, 0x251D, 0x1D54, 0x251E, 0x1D55,

+    0x251F, 0x1D56, 0x2520, 0x1D57, 0x2521, 0x1D58, 0x2522, 0x1D59,

+    0x2523, 0x1D5A, 0x2524, 0x1D5B, 0x2525, 0x1D5C, 0x2526, 0x1D5D,

+    0x2527, 0x1D5E, 0x2528, 0x1D5F, 0x2529, 0x1D60, 0x252A, 0x1D61,

+    0x252B, 0x1D62, 0x252C, 0x1D63, 0x252D, 0x1D64, 0x252E, 0x1D65,

+    0x252F, 0x1D66, 0x2530, 0x1D67, 0x2531, 0x1D68, 0x2532, 0x1D69,

+    0x2533, 0x1D6A, 0x2534, 0x1D6B, 0x2535, 0x1D6C, 0x2536, 0x1D6D,

+    0x2537, 0x1D6E, 0x2538, 0x1D6F, 0x2539, 0x1D70, 0x253A, 0x1D71,

+    0x253B, 0x1D72, 0x253C, 0x1D73, 0x253D, 0x1D74, 0x253E, 0x1D75,

+    0x253F, 0x1D76, 0x2540, 0x1D77, 0x2541, 0x1D78, 0x2542, 0x1D79,

+    0x2543, 0x1D7A, 0x2544, 0x1D7B, 0x2545, 0x1D7C, 0x2546, 0x1D7D,

+    0x2547, 0x1D7E, 0x2548, 0x1D7F, 0x2549, 0x1D80, 0x254A, 0x1D81,

+    0x254B, 0x1D82, 0x2550, 0x203B, 0x255E, 0x203C, 0x2561, 0x203E,

+    0x256A, 0x203D, 0x256D, 0x2037, 0x256E, 0x2038, 0x256F, 0x203A,

+    0x2570, 0x2039, 0x2571, 0x2045, 0x2572, 0x2046, 0x2573, 0x2047,

+    0x2581, 0x2026, 0x2582, 0x2027, 0x2583, 0x2028, 0x2584, 0x2029,

+    0x2585, 0x202A, 0x2586, 0x202B, 0x2587, 0x202C, 0x2588, 0x202D,

+    0x2589, 0x2034, 0x258A, 0x2033, 0x258B, 0x2032, 0x258C, 0x2031,

+    0x258D, 0x2030, 0x258E, 0x202F, 0x258F, 0x202E, 0x2594, 0x2035,

+    0x2595, 0x2036, 0x25A0, 0x02D9, 0x25A1, 0x02D8, 0x25A2, 0x1F4F,

+    0x25AA, 0x2FCF, 0x25AB, 0x2FCD, 0x25B2, 0x02DB, 0x25B3, 0x02DA,

+    0x25B6, 0x2FA3, 0x25B7, 0x1F4A, 0x25BC, 0x02DD, 0x25BD, 0x02DC,

+    0x25C0, 0x2FA2, 0x25C1, 0x1F49, 0x25C6, 0x02D7, 0x25C7, 0x02D6,

+    0x25C9, 0x2012, 0x25CB, 0x02D3, 0x25CC, 0x2906, 0x25CE, 0x02D5,

+    0x25CF, 0x02D4, 0x25E2, 0x203F, 0x25E3, 0x2040, 0x25E4, 0x2042,

+    0x25E5, 0x2041, 0x25E6, 0x2FDE, 0x25EF, 0x030B, 0x2600, 0x2017,

+    0x2601, 0x2018, 0x2602, 0x2019, 0x2603, 0x201A, 0x2605, 0x02D2,

+    0x2606, 0x02D1, 0x260E, 0x1F78, 0x2612, 0x2F99, 0x261C, 0x201C,

+    0x261D, 0x201D, 0x261E, 0x201B, 0x261F, 0x201E, 0x2640, 0x02C2,

+    0x2642, 0x02C1, 0x2660, 0x2013, 0x2661, 0x1F51, 0x2662, 0x1F53,

+    0x2663, 0x2015, 0x2664, 0x1F52, 0x2665, 0x2014, 0x2666, 0x2016,

+    0x2667, 0x1F50, 0x2668, 0x2F42, 0x2669, 0x2F43, 0x266A, 0x0307,

+    0x266C, 0x2F44, 0x266D, 0x0306, 0x266F, 0x0305, 0x2702, 0x2F90,

+    0x271A, 0x2FD1, 0x2756, 0x2FE3, 0x2776, 0x205E, 0x2777, 0x205F,

+    0x2778, 0x2060, 0x2779, 0x2061, 0x277A, 0x2062, 0x277B, 0x2063,

+    0x277C, 0x2064, 0x277D, 0x2065, 0x277E, 0x2066, 0x27A1, 0x200E,

+    0x2E83, 0x37E1, 0x2E85, 0x3620, 0x2E87, 0x3719, 0x2E89, 0x3814,

+    0x2E8B, 0x371E, 0x2E8C, 0x3609, 0x2E8D, 0x360A, 0x2E8E, 0x1071,

+    0x2E8F, 0x388C, 0x2E90, 0x1226, 0x2E92, 0x0EB2, 0x2E93, 0x1283,

+    0x2E94, 0x12AB, 0x2E95, 0x3C1F, 0x2E96, 0x38C2, 0x2E97, 0x361C,

+    0x2E98, 0x38E1, 0x2E99, 0x13C3, 0x2E9B, 0x13E1, 0x2E9F, 0x0E3C,

+    0x2EA0, 0x0EBD, 0x2EA1, 0x3961, 0x2EA2, 0x3962, 0x2EA3, 0x399D,

+    0x2EA4, 0x3C26, 0x2EA6, 0x374D, 0x2EA8, 0x39BC, 0x2EA9, 0x35A1,

+    0x2EAA, 0x36AB, 0x2EAB, 0x3A97, 0x2EAC, 0x08D4, 0x2EAD, 0x3A39,

+    0x2EAE, 0x3662, 0x2EB1, 0x3A98, 0x2EB2, 0x3A97, 0x2EB3, 0x376D,

+    0x2EB7, 0x36FE, 0x2EB9, 0x3713, 0x2EBC, 0x35B3, 0x2EBD, 0x354E,

+    0x2EBE, 0x3775, 0x2EBF, 0x3776, 0x2EC0, 0x3777, 0x2EC1, 0x078B,

+    0x2EC2, 0x3B0A, 0x2EC3, 0x362E, 0x2EC4, 0x0A62, 0x2EC6, 0x3572,

+    0x2ECA, 0x364A, 0x2ECC, 0x3C2B, 0x2ECD, 0x3B50, 0x2ECF, 0x3B9E,

+    0x2ED1, 0x0BD5, 0x2ED2, 0x3B97, 0x2ED6, 0x3B9E, 0x2ED7, 0x354D,

+    0x2ED8, 0x0A68, 0x2EDD, 0x3617, 0x2EDE, 0x3619, 0x2EDF, 0x3618,

+    0x2EE4, 0x064E, 0x2EE8, 0x0D34, 0x2EE9, 0x052B, 0x2EEB, 0x0A6A,

+    0x2EED, 0x08C3, 0x2EEF, 0x0F7D, 0x2EF2, 0x064F, 0x2F00, 0x04B0,

+    0x2F01, 0x20B3, 0x2F02, 0x0FFF, 0x2F03, 0x1001, 0x2F04, 0x0535,

+    0x2F05, 0x1006, 0x2F06, 0x0CCB, 0x2F07, 0x100E, 0x2F08, 0x0A13,

+    0x2F09, 0x1070, 0x2F0A, 0x0CD6, 0x2F0B, 0x0D40, 0x2F0C, 0x107B,

+    0x2F0D, 0x1083, 0x2F0E, 0x1089, 0x2F0F, 0x1093, 0x2F10, 0x1098,

+    0x2F11, 0x0C5B, 0x2F12, 0x0F97, 0x2F13, 0x10C6, 0x2F14, 0x10CD,

+    0x2F15, 0x10CE, 0x2F16, 0x10D3, 0x2F17, 0x0947, 0x2F18, 0x0E7C,

+    0x2F19, 0x10DC, 0x2F1A, 0x10E1, 0x2F1B, 0x10E8, 0x2F1C, 0x0EA2,

+    0x2F1D, 0x07B1, 0x2F1E, 0x116B, 0x2F1F, 0x0C54, 0x2F20, 0x089C,

+    0x2F21, 0x11BA, 0x2F22, 0x11BB, 0x2F23, 0x0F26, 0x2F24, 0x0B47,

+    0x2F25, 0x0981, 0x2F26, 0x08A0, 0x2F27, 0x120E, 0x2F28, 0x0A47,

+    0x2F29, 0x0996, 0x2F2A, 0x1226, 0x2F2B, 0x1228, 0x2F2C, 0x1232,

+    0x2F2D, 0x0881, 0x2F2E, 0x126C, 0x2F2F, 0x07BB, 0x2F30, 0x077E,

+    0x2F31, 0x06CA, 0x2F32, 0x05EF, 0x2F33, 0x1283, 0x2F34, 0x1285,

+    0x2F35, 0x1299, 0x2F36, 0x129B, 0x2F37, 0x12A0, 0x2F38, 0x0677,

+    0x2F39, 0x38B9, 0x2F3A, 0x12AF, 0x2F3B, 0x12B1, 0x2F3C, 0x09FA,

+    0x2F3D, 0x1342, 0x2F3E, 0x0781, 0x2F3F, 0x0916, 0x2F40, 0x08A7,

+    0x2F41, 0x13C2, 0x2F42, 0x0E08, 0x2F43, 0x0C47, 0x2F44, 0x06CC,

+    0x2F45, 0x0E4D, 0x2F46, 0x13E0, 0x2F47, 0x0CD4, 0x2F48, 0x140C,

+    0x2F49, 0x0744, 0x2F4A, 0x0EE6, 0x2F4B, 0x073D, 0x2F4C, 0x08AD,

+    0x2F4D, 0x14E5, 0x2F4E, 0x14F4, 0x2F4F, 0x14F8, 0x2F50, 0x0D7A,

+    0x2F51, 0x0EDF, 0x2F52, 0x08AF, 0x2F53, 0x1502, 0x2F54, 0x0A2B,

+    0x2F55, 0x0550, 0x2F56, 0x0BFA, 0x2F57, 0x0DD5, 0x2F58, 0x15E4,

+    0x2F59, 0x15E6, 0x2F5A, 0x0E22, 0x2F5B, 0x0567, 0x2F5C, 0x0687,

+    0x2F5D, 0x0758, 0x2F5E, 0x0770, 0x2F5F, 0x06C4, 0x2F60, 0x04DD,

+    0x2F61, 0x05E0, 0x2F62, 0x0601, 0x2F63, 0x0A5C, 0x2F64, 0x0F3B,

+    0x2F65, 0x0C3E, 0x2F66, 0x0D97, 0x2F67, 0x3A00, 0x2F68, 0x1697,

+    0x2F69, 0x0D28, 0x2F6A, 0x0D7D, 0x2F6B, 0x087C, 0x2F6C, 0x0EE8,

+    0x2F6D, 0x0EC3, 0x2F6E, 0x0EFC, 0x2F6F, 0x0A74, 0x2F70, 0x08D4,

+    0x2F71, 0x3A41, 0x2F72, 0x0553, 0x2F73, 0x0740, 0x2F74, 0x0F71,

+    0x2F75, 0x0B9B, 0x2F76, 0x0E16, 0x2F77, 0x08B3, 0x2F78, 0x0608,

+    0x2F79, 0x1813, 0x2F7A, 0x0F3D, 0x2F7B, 0x04CB, 0x2F7C, 0x0FDD,

+    0x2F7D, 0x08D5, 0x2F7E, 0x183D, 0x2F7F, 0x08D6, 0x2F80, 0x1853,

+    0x2F81, 0x0CD1, 0x2F82, 0x0A09, 0x2F83, 0x08D7, 0x2F84, 0x08B8,

+    0x2F85, 0x04D3, 0x2F86, 0x0A89, 0x2F87, 0x0AA6, 0x2F88, 0x0938,

+    0x2F89, 0x0821, 0x2F8A, 0x09ED, 0x2F8B, 0x18B2, 0x2F8C, 0x194F,

+    0x2F8D, 0x0BAC, 0x2F8E, 0x0742, 0x2F8F, 0x07E6, 0x2F90, 0x04A5,

+    0x2F91, 0x19EB, 0x2F92, 0x075F, 0x2F93, 0x05AF, 0x2F94, 0x0774,

+    0x2F95, 0x0B69, 0x2F96, 0x0C7E, 0x2F97, 0x1A56, 0x2F98, 0x1A59,

+    0x2F99, 0x058B, 0x2F9A, 0x0A7A, 0x2F9B, 0x0AF8, 0x2F9C, 0x0B0D,

+    0x2F9D, 0x0A0E, 0x2F9E, 0x0902, 0x2F9F, 0x0A0F, 0x2FA0, 0x0B62,

+    0x2FA1, 0x3B4F, 0x2FA2, 0x0F22, 0x2FA3, 0x0CAB, 0x2FA4, 0x0D64,

+    0x2FA5, 0x0F6C, 0x2FA6, 0x06DA, 0x2FA7, 0x0BD5, 0x2FA8, 0x0EF3,

+    0x2FA9, 0x0DDE, 0x2FAA, 0x1BC9, 0x2FAB, 0x1BCB, 0x2FAC, 0x04CD,

+    0x2FAD, 0x21F7, 0x2FAE, 0x0D87, 0x2FAF, 0x0ED8, 0x2FB0, 0x05B5,

+    0x2FB1, 0x1C03, 0x2FB2, 0x1C05, 0x2FB3, 0x053B, 0x2FB4, 0x0E17,

+    0x2FB5, 0x0DE9, 0x2FB6, 0x0D88, 0x2FB7, 0x09EF, 0x2FB8, 0x091F,

+    0x2FB9, 0x07F3, 0x2FBA, 0x0D05, 0x2FBB, 0x080E, 0x2FBC, 0x07F4,

+    0x2FBD, 0x1C6C, 0x2FBE, 0x1C7D, 0x2FBF, 0x1C83, 0x2FC0, 0x1C84,

+    0x2FC1, 0x064E, 0x2FC2, 0x0695, 0x2FC3, 0x0BD7, 0x2FC4, 0x1CF6,

+    0x2FC5, 0x08DB, 0x2FC6, 0x1D01, 0x2FC7, 0x0E91, 0x2FC8, 0x340B,

+    0x2FC9, 0x066A, 0x2FCA, 0x0807, 0x2FCB, 0x1D16, 0x2FCC, 0x1D19,

+    0x2FCD, 0x0C1E, 0x2FCE, 0x0791, 0x2FCF, 0x0ACF, 0x2FD0, 0x0D93,

+    0x2FD1, 0x1D21, 0x2FD2, 0x1D22, 0x2FD3, 0x0F7E, 0x2FD4, 0x1D30,

+    0x2FD5, 0x1D31, 0x3000, 0x0279, 0x3001, 0x027A, 0x3002, 0x027B,

+    0x3003, 0x028F, 0x3004, 0x2074, 0x3005, 0x0291, 0x3006, 0x0292,

+    0x3007, 0x0293, 0x3008, 0x02AA, 0x3009, 0x02AB, 0x300A, 0x02AC,

+    0x300B, 0x02AD, 0x300C, 0x02AE, 0x300D, 0x02AF, 0x300E, 0x02B0,

+    0x300F, 0x02B1, 0x3010, 0x02B2, 0x3011, 0x02B3, 0x3012, 0x02DF,

+    0x3013, 0x02E4, 0x3014, 0x02A4, 0x3015, 0x02A5, 0x301C, 0x0299,

+    0x301D, 0x1DB8, 0x301F, 0x1DB9, 0x3020, 0x1F7A, 0x3030, 0x2FBA,

+    0x3033, 0x2F4C, 0x3034, 0x2F4D, 0x3035, 0x2F4E, 0x3036, 0x1F79,

+    0x3041, 0x034A, 0x3042, 0x034B, 0x3043, 0x034C, 0x3044, 0x034D,

+    0x3045, 0x034E, 0x3046, 0x034F, 0x3047, 0x0350, 0x3048, 0x0351,

+    0x3049, 0x0352, 0x304A, 0x0353, 0x304B, 0x0354, 0x304C, 0x0355,

+    0x304D, 0x0356, 0x304E, 0x0357, 0x304F, 0x0358, 0x3050, 0x0359,

+    0x3051, 0x035A, 0x3052, 0x035B, 0x3053, 0x035C, 0x3054, 0x035D,

+    0x3055, 0x035E, 0x3056, 0x035F, 0x3057, 0x0360, 0x3058, 0x0361,

+    0x3059, 0x0362, 0x305A, 0x0363, 0x305B, 0x0364, 0x305C, 0x0365,

+    0x305D, 0x0366, 0x305E, 0x0367, 0x305F, 0x0368, 0x3060, 0x0369,

+    0x3061, 0x036A, 0x3062, 0x036B, 0x3063, 0x036C, 0x3064, 0x036D,

+    0x3065, 0x036E, 0x3066, 0x036F, 0x3067, 0x0370, 0x3068, 0x0371,

+    0x3069, 0x0372, 0x306A, 0x0373, 0x306B, 0x0374, 0x306C, 0x0375,

+    0x306D, 0x0376, 0x306E, 0x0377, 0x306F, 0x0378, 0x3070, 0x0379,

+    0x3071, 0x037A, 0x3072, 0x037B, 0x3073, 0x037C, 0x3074, 0x037D,

+    0x3075, 0x037E, 0x3076, 0x037F, 0x3077, 0x0380, 0x3078, 0x0381,

+    0x3079, 0x0382, 0x307A, 0x0383, 0x307B, 0x0384, 0x307C, 0x0385,

+    0x307D, 0x0386, 0x307E, 0x0387, 0x307F, 0x0388, 0x3080, 0x0389,

+    0x3081, 0x038A, 0x3082, 0x038B, 0x3083, 0x038C, 0x3084, 0x038D,

+    0x3085, 0x038E, 0x3086, 0x038F, 0x3087, 0x0390, 0x3088, 0x0391,

+    0x3089, 0x0392, 0x308A, 0x0393, 0x308B, 0x0394, 0x308C, 0x0395,

+    0x308D, 0x0396, 0x308E, 0x0397, 0x308F, 0x0398, 0x3090, 0x0399,

+    0x3091, 0x039A, 0x3092, 0x039B, 0x3093, 0x039C, 0x3094, 0x1F16,

+    0x309B, 0x0283, 0x309C, 0x0284, 0x309D, 0x028D, 0x309E, 0x028E,

+    0x30A1, 0x039D, 0x30A2, 0x039E, 0x30A3, 0x039F, 0x30A4, 0x03A0,

+    0x30A5, 0x03A1, 0x30A6, 0x03A2, 0x30A7, 0x03A3, 0x30A8, 0x03A4,

+    0x30A9, 0x03A5, 0x30AA, 0x03A6, 0x30AB, 0x03A7, 0x30AC, 0x03A8,

+    0x30AD, 0x03A9, 0x30AE, 0x03AA, 0x30AF, 0x03AB, 0x30B0, 0x03AC,

+    0x30B1, 0x03AD, 0x30B2, 0x03AE, 0x30B3, 0x03AF, 0x30B4, 0x03B0,

+    0x30B5, 0x03B1, 0x30B6, 0x03B2, 0x30B7, 0x03B3, 0x30B8, 0x03B4,

+    0x30B9, 0x03B5, 0x30BA, 0x03B6, 0x30BB, 0x03B7, 0x30BC, 0x03B8,

+    0x30BD, 0x03B9, 0x30BE, 0x03BA, 0x30BF, 0x03BB, 0x30C0, 0x03BC,

+    0x30C1, 0x03BD, 0x30C2, 0x03BE, 0x30C3, 0x03BF, 0x30C4, 0x03C0,

+    0x30C5, 0x03C1, 0x30C6, 0x03C2, 0x30C7, 0x03C3, 0x30C8, 0x03C4,

+    0x30C9, 0x03C5, 0x30CA, 0x03C6, 0x30CB, 0x03C7, 0x30CC, 0x03C8,

+    0x30CD, 0x03C9, 0x30CE, 0x03CA, 0x30CF, 0x03CB, 0x30D0, 0x03CC,

+    0x30D1, 0x03CD, 0x30D2, 0x03CE, 0x30D3, 0x03CF, 0x30D4, 0x03D0,

+    0x30D5, 0x03D1, 0x30D6, 0x03D2, 0x30D7, 0x03D3, 0x30D8, 0x03D4,

+    0x30D9, 0x03D5, 0x30DA, 0x03D6, 0x30DB, 0x03D7, 0x30DC, 0x03D8,

+    0x30DD, 0x03D9, 0x30DE, 0x03DA, 0x30DF, 0x03DB, 0x30E0, 0x03DC,

+    0x30E1, 0x03DD, 0x30E2, 0x03DE, 0x30E3, 0x03DF, 0x30E4, 0x03E0,

+    0x30E5, 0x03E1, 0x30E6, 0x03E2, 0x30E7, 0x03E3, 0x30E8, 0x03E4,

+    0x30E9, 0x03E5, 0x30EA, 0x03E6, 0x30EB, 0x03E7, 0x30EC, 0x03E8,

+    0x30ED, 0x03E9, 0x30EE, 0x03EA, 0x30EF, 0x03EB, 0x30F0, 0x03EC,

+    0x30F1, 0x03ED, 0x30F2, 0x03EE, 0x30F3, 0x03EF, 0x30F4, 0x03F0,

+    0x30F5, 0x03F1, 0x30F6, 0x03F2, 0x30F7, 0x2079, 0x30F8, 0x207A,

+    0x30F9, 0x207B, 0x30FA, 0x207C, 0x30FB, 0x027E, 0x30FC, 0x0294,

+    0x30FD, 0x028B, 0x30FE, 0x028C, 0x3220, 0x278E, 0x3221, 0x278F,

+    0x3222, 0x2790, 0x3223, 0x2791, 0x3224, 0x2792, 0x3225, 0x2793,

+    0x3226, 0x2794, 0x3227, 0x2795, 0x3228, 0x2796, 0x3229, 0x2797,

+    0x322A, 0x2006, 0x322B, 0x2007, 0x322C, 0x2008, 0x322D, 0x2009,

+    0x322E, 0x200A, 0x322F, 0x200B, 0x3230, 0x2005, 0x3231, 0x1DC2,

+    0x3232, 0x1DC3, 0x3233, 0x1FCF, 0x3234, 0x1FCD, 0x3235, 0x1FD4,

+    0x3236, 0x1FD3, 0x3237, 0x200C, 0x3238, 0x1FCE, 0x3239, 0x1DC4,

+    0x323A, 0x1FD7, 0x323B, 0x1FD5, 0x323C, 0x1FD0, 0x323D, 0x1FCB,

+    0x323E, 0x1FD2, 0x323F, 0x1FCC, 0x3240, 0x1FD6, 0x3241, 0x200D,

+    0x3242, 0x1FD1, 0x3243, 0x1FCA, 0x3280, 0x28DD, 0x3281, 0x28DE,

+    0x3282, 0x28DF, 0x3283, 0x28E0, 0x3284, 0x28E1, 0x3285, 0x28E2,

+    0x3286, 0x28E3, 0x3287, 0x28E4, 0x3288, 0x28E5, 0x3289, 0x28E6,

+    0x328A, 0x28E8, 0x328B, 0x28E9, 0x328C, 0x28EA, 0x328D, 0x28EB,

+    0x328E, 0x28EC, 0x328F, 0x28ED, 0x3290, 0x28E7, 0x3291, 0x1FE1,

+    0x3292, 0x1FE0, 0x3293, 0x1FE2, 0x3294, 0x1FDC, 0x3295, 0x28FF,

+    0x3296, 0x1FE5, 0x3297, 0x28FC, 0x3298, 0x1FDE, 0x3299, 0x201F,

+    0x329A, 0x28F9, 0x329B, 0x28F8, 0x329C, 0x28FE, 0x329D, 0x207F,

+    0x329E, 0x1FFF, 0x329F, 0x28EF, 0x32A0, 0x28F6, 0x32A1, 0x28F7,

+    0x32A2, 0x28FB, 0x32A3, 0x28FA, 0x32A4, 0x1DBD, 0x32A5, 0x1DBE,

+    0x32A6, 0x1DBF, 0x32A7, 0x1DC0, 0x32A8, 0x1DC1, 0x32A9, 0x1FDA,

+    0x32AA, 0x1FDD, 0x32AB, 0x1FDF, 0x32AC, 0x1FE3, 0x32AD, 0x1FD9,

+    0x32AE, 0x1FE4, 0x32AF, 0x1FDB, 0x32B0, 0x1FD8, 0x32D0, 0x28AD,

+    0x32D1, 0x28AE, 0x32D2, 0x28AF, 0x32D3, 0x28B0, 0x32D4, 0x28B1,

+    0x32D5, 0x28B2, 0x32D6, 0x28B3, 0x32D7, 0x28B4, 0x32D8, 0x28B5,

+    0x32D9, 0x28B6, 0x32DA, 0x28B7, 0x32DB, 0x28B8, 0x32DC, 0x28B9,

+    0x32DD, 0x28BA, 0x32DE, 0x28BB, 0x32DF, 0x28BC, 0x32E0, 0x28BD,

+    0x32E1, 0x28BE, 0x32E2, 0x28BF, 0x32E3, 0x28C0, 0x32E4, 0x28C1,

+    0x32E5, 0x28C2, 0x32E6, 0x28C3, 0x32E7, 0x28C4, 0x32E8, 0x28C5,

+    0x32E9, 0x28C6, 0x32EA, 0x28C7, 0x32EB, 0x28C8, 0x32EC, 0x28C9,

+    0x32ED, 0x28CA, 0x32EE, 0x28CB, 0x32EF, 0x28CC, 0x32F0, 0x28CD,

+    0x32F1, 0x28CE, 0x32F2, 0x28CF, 0x32F3, 0x28D0, 0x32F4, 0x28D1,

+    0x32F5, 0x28D2, 0x32F6, 0x28D3, 0x32F7, 0x28D4, 0x32F8, 0x28D5,

+    0x32F9, 0x28D6, 0x32FA, 0x28D7, 0x32FB, 0x28D8, 0x32FC, 0x28D9,

+    0x32FD, 0x28DA, 0x32FE, 0x28DB, 0x3300, 0x1F70, 0x3301, 0x2E62,

+    0x3302, 0x2E63, 0x3303, 0x1F6A, 0x3304, 0x2E64, 0x3305, 0x1FF7,

+    0x3306, 0x2E65, 0x3307, 0x2E69, 0x3308, 0x2E67, 0x3309, 0x2E6C,

+    0x330A, 0x2E6A, 0x330B, 0x2E6E, 0x330C, 0x2E70, 0x330D, 0x1DAB,

+    0x330E, 0x2E71, 0x330F, 0x2E72, 0x3310, 0x2E73, 0x3311, 0x2E74,

+    0x3312, 0x2E75, 0x3313, 0x2E76, 0x3314, 0x1DA2, 0x3315, 0x1F69,

+    0x3316, 0x1F67, 0x3317, 0x2E78, 0x3318, 0x1F68, 0x3319, 0x2E7A,

+    0x331A, 0x2E7C, 0x331B, 0x2E7D, 0x331C, 0x2E7E, 0x331D, 0x2E7F,

+    0x331E, 0x1F73, 0x331F, 0x2E80, 0x3320, 0x2E81, 0x3321, 0x2E82,

+    0x3322, 0x1F66, 0x3323, 0x1F6B, 0x3324, 0x2E83, 0x3325, 0x2E85,

+    0x3326, 0x1DAC, 0x3327, 0x1DA6, 0x3328, 0x2E88, 0x3329, 0x2E89,

+    0x332A, 0x1F74, 0x332B, 0x1DAE, 0x332D, 0x2E8B, 0x332E, 0x2E8E,

+    0x332F, 0x2E8F, 0x3330, 0x2E90, 0x3331, 0x1F71, 0x3332, 0x2E91,

+    0x3333, 0x2087, 0x3334, 0x2E94, 0x3335, 0x2E95, 0x3336, 0x1DA8,

+    0x3337, 0x2E9A, 0x3338, 0x2E9C, 0x3339, 0x1F6E, 0x333A, 0x2E9D,

+    0x333B, 0x1F6F, 0x333C, 0x2E96, 0x333D, 0x2E9E, 0x333E, 0x2EA0,

+    0x333F, 0x2EA1, 0x3340, 0x2EA2, 0x3341, 0x2E9F, 0x3342, 0x1F6D,

+    0x3343, 0x2EA3, 0x3344, 0x2EA4, 0x3345, 0x2EA5, 0x3346, 0x2EA6,

+    0x3347, 0x1F72, 0x3348, 0x2EA7, 0x3349, 0x1DA1, 0x334A, 0x1DAF,

+    0x334B, 0x2EA8, 0x334C, 0x2EA9, 0x334D, 0x1DA4, 0x334E, 0x2088,

+    0x334F, 0x2EAA, 0x3350, 0x2EAB, 0x3351, 0x1DA9, 0x3352, 0x2EAE,

+    0x3353, 0x2EB2, 0x3354, 0x2EAF, 0x3355, 0x2EB3, 0x3356, 0x2EB4,

+    0x3357, 0x1F6C, 0x3371, 0x2E55, 0x337B, 0x2083, 0x337C, 0x1DC7,

+    0x337D, 0x1DC6, 0x337E, 0x1DC5, 0x337F, 0x1F76, 0x3385, 0x1F5F,

+    0x3386, 0x1F60, 0x3387, 0x1F61, 0x3388, 0x2000, 0x3389, 0x2001,

+    0x338D, 0x2E58, 0x338E, 0x1DB4, 0x338F, 0x1DB5, 0x3390, 0x1F63,

+    0x3396, 0x1F65, 0x3397, 0x1F58, 0x3398, 0x1F5A, 0x339B, 0x2E59,

+    0x339C, 0x1DB1, 0x339D, 0x1DB2, 0x339E, 0x1DB3, 0x339F, 0x1FFA,

+    0x33A0, 0x1F54, 0x33A1, 0x1DB7, 0x33A2, 0x1F55, 0x33A3, 0x1FFB,

+    0x33A4, 0x1F56, 0x33A5, 0x1F57, 0x33A6, 0x1FFC, 0x33B0, 0x1F5E,

+    0x33B1, 0x1F5D, 0x33B2, 0x1F5C, 0x33B3, 0x1F5B, 0x33C2, 0x2E50,

+    0x33C4, 0x1DB6, 0x33C8, 0x2002, 0x33CB, 0x1F62, 0x33CC, 0x1FF6,

+    0x33CD, 0x1DBB, 0x33D4, 0x1F64, 0x33D7, 0x2E5D, 0x33D8, 0x2E5E,

+    0x33DA, 0x2E4B, 0x3402, 0x3582, 0x3405, 0x3C1B, 0x3427, 0x3656,

+    0x3488, 0x3C52, 0x34DB, 0x3C41, 0x351F, 0x3629, 0x353E, 0x371E,

+    0x378D, 0x361A, 0x37E2, 0x372B, 0x3AF3, 0x3C40, 0x3B22, 0x3C49,

+    0x3B88, 0x368D, 0x3E8A, 0x3C43, 0x3EDA, 0x3C48, 0x3FB1, 0x3754,

+    0x4093, 0x3C4C, 0x4103, 0x3C4F, 0x4264, 0x3760, 0x4293, 0x3C50,

+    0x440C, 0x3C42, 0x4453, 0x3773, 0x457A, 0x3C4B, 0x4665, 0x3C4E,

+    0x46AE, 0x3C51, 0x4BE8, 0x3C46, 0x4E00, 0x04B0, 0x4E01, 0x0BB8,

+    0x4E03, 0x08E3, 0x4E04, 0x37D8, 0x4E05, 0x37D9, 0x4E07, 0x0EAA,

+    0x4E08, 0x09CE, 0x4E09, 0x087E, 0x4E0A, 0x09CD, 0x4E0B, 0x053C,

+    0x4E0D, 0x0DC6, 0x4E0E, 0x0F29, 0x4E10, 0x0FFB, 0x4E11, 0x04D1,

+    0x4E14, 0x05CC, 0x4E15, 0x0FFC, 0x4E16, 0x0A48, 0x4E17, 0x10D7,

+    0x4E18, 0x0670, 0x4E19, 0x0E0A, 0x4E1E, 0x09CF, 0x4E1F, 0x37DA,

+    0x4E21, 0x0F86, 0x4E26, 0x0E12, 0x4E28, 0x20B3, 0x4E2A, 0x0FFD,

+    0x4E2B, 0x37DB, 0x4E2C, 0x374D, 0x4E2D, 0x0BA4, 0x4E2F, 0x37DC,

+    0x4E30, 0x37DD, 0x4E31, 0x0FFE, 0x4E32, 0x06F2, 0x4E36, 0x0FFF,

+    0x4E37, 0x369D, 0x4E38, 0x0619, 0x4E39, 0x0B6E, 0x4E3B, 0x0913,

+    0x4E3C, 0x1000, 0x4E3F, 0x1001, 0x4E40, 0x37DE, 0x4E41, 0x37DF,

+    0x4E42, 0x1002, 0x4E43, 0x0CEB, 0x4E44, 0x37E0, 0x4E45, 0x0671,

+    0x4E48, 0x372E, 0x4E4B, 0x0CED, 0x4E4D, 0x0CBB, 0x4E4E, 0x0777,

+    0x4E4F, 0x0E61, 0x4E55, 0x1950, 0x4E56, 0x1003, 0x4E57, 0x09D0,

+    0x4E58, 0x1004, 0x4E59, 0x0535, 0x4E5A, 0x37E1, 0x4E5D, 0x06DD,

+    0x4E5E, 0x07A4, 0x4E5F, 0x0EF5, 0x4E62, 0x1233, 0x4E71, 0x0F5A,

+    0x4E73, 0x0CD5, 0x4E7E, 0x05E1, 0x4E7F, 0x37E2, 0x4E80, 0x064F,

+    0x4E82, 0x1005, 0x4E85, 0x1006, 0x4E86, 0x0F83, 0x4E88, 0x0F27,

+    0x4E89, 0x0AEA, 0x4E8A, 0x1008, 0x4E8B, 0x08C4, 0x4E8C, 0x0CCB,

+    0x4E8D, 0x37E3, 0x4E8E, 0x100B, 0x4E91, 0x04E0, 0x4E92, 0x0793,

+    0x4E94, 0x0792, 0x4E95, 0x04AA, 0x4E96, 0x37E4, 0x4E98, 0x0FF1,

+    0x4E99, 0x0FF0, 0x4E9B, 0x0823, 0x4E9C, 0x0465, 0x4E9E, 0x100C,

+    0x4E9F, 0x100D, 0x4EA0, 0x100E, 0x4EA1, 0x0E62, 0x4EA2, 0x100F,

+    0x4EA4, 0x07A6, 0x4EA5, 0x04AB, 0x4EA6, 0x0EA0, 0x4EA8, 0x0696,

+    0x4EAB, 0x0697, 0x4EAC, 0x0698, 0x4EAD, 0x0BFE, 0x4EAE, 0x0F84,

+    0x4EB0, 0x1010, 0x4EB3, 0x1011, 0x4EB6, 0x1012, 0x4EB9, 0x37E5,

+    0x4EBA, 0x0A13, 0x4EBB, 0x3620, 0x4EC0, 0x0944, 0x4EC1, 0x0A14,

+    0x4EC2, 0x1017, 0x4EC4, 0x1015, 0x4EC6, 0x1016, 0x4EC7, 0x0672,

+    0x4ECA, 0x0813, 0x4ECB, 0x0570, 0x4ECD, 0x1014, 0x4ECE, 0x1013,

+    0x4ECF, 0x0DF9, 0x4ED0, 0x37E6, 0x4ED4, 0x0894, 0x4ED5, 0x0893,

+    0x4ED6, 0x0B1E, 0x4ED7, 0x1018, 0x4ED8, 0x0DC7, 0x4ED9, 0x0A8B,

+    0x4EDD, 0x0290, 0x4EDE, 0x1019, 0x4EDF, 0x101B, 0x4EE0, 0x37E7,

+    0x4EE1, 0x20B4, 0x4EE3, 0x0B45, 0x4EE4, 0x0FA9, 0x4EE5, 0x048E,

+    0x4EED, 0x101A, 0x4EEE, 0x053E, 0x4EF0, 0x06BC, 0x4EF2, 0x0BA5,

+    0x4EF6, 0x0745, 0x4EF7, 0x101C, 0x4EFB, 0x0CDA, 0x4EFC, 0x20B5,

+    0x4EFD, 0x37E8, 0x4EFF, 0x37E9, 0x4F00, 0x20B6, 0x4F01, 0x0627,

+    0x4F03, 0x20B7, 0x4F09, 0x101D, 0x4F0A, 0x048F, 0x4F0B, 0x37EA,

+    0x4F0D, 0x0794, 0x4F0E, 0x0628, 0x4F0F, 0x0DEC, 0x4F10, 0x0D46,

+    0x4F11, 0x0673, 0x4F15, 0x37EB, 0x4F1A, 0x0571, 0x4F1C, 0x1040,

+    0x4F1D, 0x0C3B, 0x4F2F, 0x0D22, 0x4F30, 0x101F, 0x4F34, 0x0D50,

+    0x4F36, 0x0FAA, 0x4F38, 0x09F3, 0x4F39, 0x20B8, 0x4F3A, 0x0895,

+    0x4F3B, 0x37ED, 0x4F3C, 0x08C5, 0x4F3D, 0x0540, 0x4F43, 0x0BED,

+    0x4F46, 0x0B60, 0x4F47, 0x1023, 0x4F49, 0x37EE, 0x4F4D, 0x0490,

+    0x4F4E, 0x0BFF, 0x4F4F, 0x0945, 0x4F50, 0x0824, 0x4F51, 0x0F0E,

+    0x4F53, 0x0B2E, 0x4F54, 0x37EF, 0x4F55, 0x053F, 0x4F56, 0x20B9,

+    0x4F57, 0x1022, 0x4F59, 0x0F28, 0x4F5A, 0x101E, 0x4F5B, 0x1020,

+    0x4F5C, 0x085E, 0x4F5D, 0x1021, 0x4F5E, 0x11D3, 0x4F60, 0x37EC,

+    0x4F69, 0x1029, 0x4F6F, 0x102C, 0x4F70, 0x102A, 0x4F73, 0x0542,

+    0x4F75, 0x0E0B, 0x4F76, 0x1024, 0x4F7A, 0x37F0, 0x4F7B, 0x1028,

+    0x4F7C, 0x07A7, 0x4F7D, 0x37F1, 0x4F7E, 0x37F2, 0x4F7F, 0x0896,

+    0x4F83, 0x05E2, 0x4F86, 0x102D, 0x4F88, 0x1025, 0x4F8A, 0x20BB,

+    0x4F8B, 0x0FAB, 0x4F8D, 0x08C6, 0x4F8F, 0x1026, 0x4F91, 0x102B,

+    0x4F92, 0x20BA, 0x4F94, 0x20BD, 0x4F96, 0x102E, 0x4F97, 0x37F3,

+    0x4F98, 0x1027, 0x4F9A, 0x20BC, 0x4F9B, 0x0699, 0x4F9D, 0x0491,

+    0x4FA0, 0x069A, 0x4FA1, 0x0541, 0x4FAB, 0x11D4, 0x4FAD, 0x0EA7,

+    0x4FAE, 0x0DE0, 0x4FAF, 0x07A8, 0x4FB5, 0x09F5, 0x4FB6, 0x0F7F,

+    0x4FBE, 0x37F4, 0x4FBF, 0x0E28, 0x4FC2, 0x070E, 0x4FC3, 0x0B05,

+    0x4FC4, 0x0564, 0x4FC9, 0x20AC, 0x4FCA, 0x095D, 0x4FCD, 0x20BE,

+    0x4FCE, 0x1032, 0x4FCF, 0x37F5, 0x4FD0, 0x1037, 0x4FD1, 0x1035,

+    0x4FD3, 0x3C2F, 0x4FD4, 0x1030, 0x4FD7, 0x0B0F, 0x4FD8, 0x1033,

+    0x4FDA, 0x1036, 0x4FDB, 0x1034, 0x4FDD, 0x0E2D, 0x4FDF, 0x1031,

+    0x4FE0, 0x1DEC, 0x4FE1, 0x09F4, 0x4FE3, 0x0EA1, 0x4FE4, 0x1038,

+    0x4FE5, 0x1039, 0x4FEE, 0x092E, 0x4FEF, 0x1046, 0x4FF3, 0x0D06,

+    0x4FF5, 0x0DA8, 0x4FF6, 0x1041, 0x4FF8, 0x0E40, 0x4FFA, 0x0536,

+    0x4FFD, 0x37F6, 0x4FFE, 0x1045, 0x4FFF, 0x20C1, 0x5000, 0x37F7,

+    0x5001, 0x37F8, 0x5002, 0x3447, 0x5005, 0x103F, 0x5006, 0x1048,

+    0x5009, 0x0AD4, 0x500B, 0x0778, 0x500D, 0x0D12, 0x500F, 0x1600,

+    0x5010, 0x37F9, 0x5011, 0x1047, 0x5012, 0x0C57, 0x5014, 0x103C,

+    0x5016, 0x07AA, 0x5019, 0x07A9, 0x501A, 0x103A, 0x501B, 0x37FA,

+    0x501E, 0x20C2, 0x501F, 0x0906, 0x5021, 0x1042, 0x5022, 0x20C0,

+    0x5023, 0x0E3F, 0x5024, 0x0B8B, 0x5025, 0x103E, 0x5026, 0x0747,

+    0x5027, 0x37FB, 0x5028, 0x103B, 0x5029, 0x1043, 0x502A, 0x103D,

+    0x502B, 0x0F99, 0x502C, 0x1044, 0x502D, 0x0FE7, 0x502E, 0x37FC,

+    0x5036, 0x06DE, 0x5039, 0x0746, 0x503B, 0x3800, 0x5040, 0x20BF,

+    0x5042, 0x20C5, 0x5043, 0x1049, 0x5046, 0x20C3, 0x5047, 0x104A,

+    0x5048, 0x104E, 0x5049, 0x0492, 0x504F, 0x0E20, 0x5050, 0x104D,

+    0x5055, 0x104C, 0x5056, 0x1050, 0x5057, 0x37FD, 0x505A, 0x104F,

+    0x505C, 0x0C00, 0x5065, 0x0748, 0x5066, 0x37FE, 0x506A, 0x37FF,

+    0x506C, 0x1051, 0x5070, 0x20C4, 0x5072, 0x08F1, 0x5074, 0x0B06,

+    0x5075, 0x0C01, 0x5076, 0x06EE, 0x5078, 0x1052, 0x507D, 0x0650,

+    0x5080, 0x1053, 0x5085, 0x1055, 0x508D, 0x0E63, 0x508F, 0x3801,

+    0x5091, 0x073C, 0x5094, 0x20C6, 0x5096, 0x3802, 0x5098, 0x087F,

+    0x5099, 0x0D8B, 0x509A, 0x1054, 0x509C, 0x3803, 0x50AC, 0x0835,

+    0x50AD, 0x0F2D, 0x50B2, 0x1057, 0x50B3, 0x105A, 0x50B4, 0x1056,

+    0x50B5, 0x0834, 0x50B7, 0x0987, 0x50BE, 0x070F, 0x50C2, 0x105B,

+    0x50C5, 0x06C7, 0x50C9, 0x1058, 0x50CA, 0x1059, 0x50CC, 0x3804,

+    0x50CD, 0x0C87, 0x50CF, 0x0AFE, 0x50D1, 0x069B, 0x50D5, 0x0E7B,

+    0x50D6, 0x105C, 0x50D8, 0x20C8, 0x50D9, 0x3C30, 0x50DA, 0x0F85,

+    0x50DE, 0x105D, 0x50E3, 0x1060, 0x50E5, 0x105E, 0x50E6, 0x3805,

+    0x50E7, 0x0AD0, 0x50E9, 0x3806, 0x50ED, 0x105F, 0x50EE, 0x1061,

+    0x50EF, 0x3807, 0x50F0, 0x3C31, 0x50F4, 0x20C7, 0x50F5, 0x1063,

+    0x50F9, 0x1062, 0x50FB, 0x0E18, 0x5100, 0x0651, 0x5101, 0x1065,

+    0x5102, 0x1066, 0x5104, 0x052F, 0x5108, 0x3808, 0x5109, 0x1064,

+    0x510B, 0x3809, 0x5110, 0x380A, 0x5112, 0x0920, 0x5114, 0x1069,

+    0x5115, 0x1068, 0x5116, 0x1067, 0x5118, 0x102F, 0x511A, 0x106A,

+    0x511B, 0x380B, 0x511E, 0x380C, 0x511F, 0x0988, 0x5121, 0x106B,

+    0x512A, 0x0F0F, 0x5132, 0x0EE5, 0x5137, 0x106D, 0x513A, 0x106C,

+    0x513B, 0x106F, 0x513C, 0x106E, 0x513F, 0x1070, 0x5140, 0x1071,

+    0x5141, 0x04B8, 0x5143, 0x0769, 0x5144, 0x0711, 0x5145, 0x0946,

+    0x5146, 0x0BB9, 0x5147, 0x069C, 0x5148, 0x0A8C, 0x5149, 0x07AB,

+    0x514A, 0x20C9, 0x514B, 0x0800, 0x514C, 0x1073, 0x514D, 0x0ED4,

+    0x514E, 0x0C40, 0x5150, 0x08C7, 0x5152, 0x1072, 0x5154, 0x1074,

+    0x515A, 0x0C58, 0x515C, 0x05D3, 0x515F, 0x380D, 0x5162, 0x1075,

+    0x5164, 0x20CA, 0x5165, 0x0CD6, 0x5167, 0x368E, 0x5168, 0x0AB6,

+    0x5169, 0x1077, 0x516A, 0x1078, 0x516B, 0x0D40, 0x516C, 0x07AC,

+    0x516D, 0x0FE1, 0x516E, 0x1079, 0x5171, 0x069E, 0x5175, 0x0E0C,

+    0x5176, 0x0B16, 0x5177, 0x06E9, 0x5178, 0x0C2F, 0x5179, 0x3779,

+    0x517C, 0x0749, 0x5180, 0x107A, 0x5182, 0x107B, 0x5185, 0x0CBA,

+    0x5186, 0x0501, 0x5189, 0x107E, 0x518A, 0x086D, 0x518C, 0x107D,

+    0x518D, 0x0836, 0x518F, 0x107F, 0x5190, 0x185B, 0x5191, 0x1080,

+    0x5192, 0x0E6F, 0x5193, 0x1081, 0x5195, 0x1082, 0x5196, 0x1083,

+    0x5197, 0x09D1, 0x5199, 0x08F8, 0x519D, 0x20CB, 0x51A0, 0x05E3,

+    0x51A1, 0x380E, 0x51A2, 0x1086, 0x51A4, 0x1084, 0x51A5, 0x0EC9,

+    0x51A6, 0x1085, 0x51A8, 0x0DCC, 0x51A9, 0x1087, 0x51AA, 0x1088,

+    0x51AB, 0x1089, 0x51AC, 0x0C59, 0x51B0, 0x108D, 0x51B1, 0x108B,

+    0x51B2, 0x108C, 0x51B3, 0x108A, 0x51B4, 0x0853, 0x51B5, 0x108E,

+    0x51B6, 0x0EF6, 0x51B7, 0x0FAC, 0x51BC, 0x380F, 0x51BD, 0x108F,

+    0x51BE, 0x20CC, 0x51C3, 0x3C32, 0x51C4, 0x0A4C, 0x51C5, 0x1090,

+    0x51C6, 0x0964, 0x51C9, 0x1091, 0x51CB, 0x0BBA, 0x51CC, 0x0F87,

+    0x51CD, 0x0C5A, 0x51D6, 0x10DA, 0x51DB, 0x1092, 0x51DC, 0x205C,

+    0x51DD, 0x06BD, 0x51DE, 0x3810, 0x51E0, 0x1093, 0x51E1, 0x0E8C,

+    0x51E6, 0x0972, 0x51E7, 0x0B5C, 0x51E9, 0x1095, 0x51EA, 0x0CBC,

+    0x51EC, 0x20CD, 0x51ED, 0x1096, 0x51EE, 0x3811, 0x51F0, 0x1097,

+    0x51F1, 0x058C, 0x51F4, 0x3812, 0x51F5, 0x1098, 0x51F6, 0x069F,

+    0x51F8, 0x0CA4, 0x51F9, 0x051C, 0x51FA, 0x095A, 0x51FD, 0x0D35,

+    0x51FE, 0x1099, 0x5200, 0x0C5B, 0x5201, 0x3813, 0x5202, 0x3814,

+    0x5203, 0x0A15, 0x5204, 0x109A, 0x5206, 0x0DFC, 0x5207, 0x0A7E,

+    0x5208, 0x05DE, 0x520A, 0x05E5, 0x520B, 0x109B, 0x520E, 0x109D,

+    0x5211, 0x0710, 0x5213, 0x3815, 0x5214, 0x109C, 0x5215, 0x20CE,

+    0x5217, 0x0FBB, 0x521D, 0x0973, 0x5224, 0x0D51, 0x5225, 0x0E1C,

+    0x5227, 0x109E, 0x5229, 0x0F62, 0x522A, 0x109F, 0x522E, 0x10A0,

+    0x5230, 0x0C78, 0x5233, 0x10A1, 0x5236, 0x0A4D, 0x5237, 0x086E,

+    0x5238, 0x074A, 0x5239, 0x10A2, 0x523A, 0x0897, 0x523B, 0x0801,

+    0x5243, 0x0C02, 0x5244, 0x10A4, 0x5247, 0x0B07, 0x5249, 0x3816,

+    0x524A, 0x085F, 0x524B, 0x10A5, 0x524C, 0x10A6, 0x524D, 0x0AB2,

+    0x524F, 0x10A3, 0x5254, 0x10A8, 0x5256, 0x0E64, 0x525B, 0x07F6,

+    0x525D, 0x1E5E, 0x525E, 0x10A7, 0x5261, 0x3817, 0x5263, 0x074B,

+    0x5264, 0x084E, 0x5265, 0x0D23, 0x5266, 0x3818, 0x5269, 0x10AB,

+    0x526A, 0x10A9, 0x526F, 0x0DED, 0x5270, 0x09D2, 0x5271, 0x10B2,

+    0x5272, 0x05C2, 0x5273, 0x10AC, 0x5274, 0x10AA, 0x5275, 0x0AD1,

+    0x527D, 0x10AE, 0x527F, 0x10AD, 0x5283, 0x05A2, 0x5287, 0x0736,

+    0x5288, 0x10B3, 0x5289, 0x0F75, 0x528D, 0x10AF, 0x5291, 0x10B4,

+    0x5292, 0x10B1, 0x5293, 0x3819, 0x5294, 0x10B0, 0x529B, 0x0F97,

+    0x529C, 0x20CF, 0x529F, 0x07AD, 0x52A0, 0x0543, 0x52A3, 0x0FBC,

+    0x52A6, 0x20D0, 0x52A9, 0x097F, 0x52AA, 0x0C52, 0x52AB, 0x07F7,

+    0x52AC, 0x10B7, 0x52AD, 0x10B8, 0x52AF, 0x217D, 0x52B1, 0x0FAD,

+    0x52B4, 0x0FD1, 0x52B5, 0x10BA, 0x52B9, 0x07AE, 0x52BC, 0x10B9,

+    0x52BE, 0x058D, 0x52C0, 0x20D1, 0x52C1, 0x10BB, 0x52C3, 0x0E84,

+    0x52C5, 0x0BD8, 0x52C7, 0x0F10, 0x52C8, 0x381A, 0x52C9, 0x0E29,

+    0x52CD, 0x10BC, 0x52D0, 0x36E8, 0x52D2, 0x1BEE, 0x52D5, 0x0C88,

+    0x52D7, 0x10BD, 0x52D8, 0x05E6, 0x52D9, 0x0EBF, 0x52DB, 0x20D2,

+    0x52DD, 0x0989, 0x52DE, 0x10BE, 0x52DF, 0x0E37, 0x52E0, 0x10C2,

+    0x52E2, 0x0A4E, 0x52E3, 0x10BF, 0x52E4, 0x06C8, 0x52E6, 0x10C0,

+    0x52E7, 0x05E7, 0x52F0, 0x381B, 0x52F2, 0x0704, 0x52F3, 0x10C3,

+    0x52F5, 0x10C4, 0x52F8, 0x10C5, 0x52F9, 0x10C6, 0x52FA, 0x0907,

+    0x52FE, 0x07AF, 0x52FF, 0x0EEA, 0x5300, 0x20D3, 0x5301, 0x0EF4,

+    0x5302, 0x0CCF, 0x5305, 0x0E41, 0x5306, 0x10C7, 0x5307, 0x20D4,

+    0x5308, 0x10C8, 0x530A, 0x381C, 0x530B, 0x381D, 0x530D, 0x10CA,

+    0x530F, 0x10CC, 0x5310, 0x10CB, 0x5315, 0x10CD, 0x5316, 0x053D,

+    0x5317, 0x0E7A, 0x5319, 0x086C, 0x531A, 0x10CE, 0x531D, 0x0ADB,

+    0x5320, 0x098A, 0x5321, 0x06A1, 0x5323, 0x10CF, 0x5324, 0x20D5,

+    0x532A, 0x0D6F, 0x532F, 0x10D0, 0x5331, 0x10D1, 0x5333, 0x10D2,

+    0x5338, 0x10D3, 0x5339, 0x0D96, 0x533A, 0x06E0, 0x533B, 0x04A9,

+    0x533E, 0x381E, 0x533F, 0x0C97, 0x5340, 0x10D4, 0x5341, 0x0947,

+    0x5343, 0x0A8D, 0x5345, 0x10D6, 0x5346, 0x10D5, 0x5347, 0x098B,

+    0x5348, 0x0795, 0x5349, 0x10D8, 0x534A, 0x0D52, 0x534B, 0x3820,

+    0x534C, 0x381F, 0x534D, 0x10D9, 0x5351, 0x0D70, 0x5352, 0x0B14,

+    0x5353, 0x0B4E, 0x5354, 0x06A0, 0x5357, 0x0CC6, 0x5358, 0x0B6F,

+    0x535A, 0x0D24, 0x535C, 0x0E7C, 0x535E, 0x10DB, 0x5360, 0x0A8E,

+    0x5361, 0x3821, 0x5366, 0x070B, 0x5369, 0x10DC, 0x536C, 0x3822,

+    0x536E, 0x10DD, 0x536F, 0x04CE, 0x5370, 0x04B9, 0x5371, 0x0629,

+    0x5372, 0x20D6, 0x5373, 0x0B08, 0x5374, 0x066B, 0x5375, 0x0F5B,

+    0x5377, 0x10E0, 0x5378, 0x0537, 0x537B, 0x10DF, 0x537D, 0x3435,

+    0x537F, 0x06A2, 0x5382, 0x10E1, 0x5384, 0x0EFD, 0x5389, 0x37D0,

+    0x5393, 0x20D7, 0x5396, 0x10E2, 0x5398, 0x0F9A, 0x539A, 0x07B0,

+    0x539F, 0x076A, 0x53A0, 0x10E3, 0x53A5, 0x10E5, 0x53A6, 0x10E4,

+    0x53A8, 0x0A25, 0x53A9, 0x04DB, 0x53AB, 0x3823, 0x53AD, 0x0500,

+    0x53AE, 0x10E6, 0x53B0, 0x10E7, 0x53B2, 0x20D8, 0x53B3, 0x076B,

+    0x53B6, 0x10E8, 0x53BB, 0x0688, 0x53C2, 0x0880, 0x53C3, 0x10E9,

+    0x53C8, 0x0EA2, 0x53C9, 0x0825, 0x53CA, 0x0674, 0x53CB, 0x0F11,

+    0x53CC, 0x0AD2, 0x53CD, 0x0D53, 0x53CE, 0x0929, 0x53D4, 0x0951,

+    0x53D6, 0x0914, 0x53D7, 0x0921, 0x53D9, 0x0980, 0x53DA, 0x3824,

+    0x53DB, 0x0D54, 0x53DD, 0x20D9, 0x53DF, 0x10EC, 0x53E1, 0x04E5,

+    0x53E2, 0x0AD3, 0x53E3, 0x07B1, 0x53E4, 0x0779, 0x53E5, 0x06DF,

+    0x53E6, 0x3825, 0x53E8, 0x10F0, 0x53E9, 0x0B5F, 0x53EA, 0x0B5E,

+    0x53EB, 0x06A3, 0x53EC, 0x098C, 0x53ED, 0x10F1, 0x53EE, 0x10EF,

+    0x53EF, 0x0544, 0x53F0, 0x0B46, 0x53F1, 0x08E4, 0x53F2, 0x0899,

+    0x53F3, 0x04C8, 0x53F5, 0x3826, 0x53F6, 0x05CE, 0x53F7, 0x07F8,

+    0x53F8, 0x0898, 0x53FA, 0x10F2, 0x5401, 0x10F3, 0x5403, 0x0663,

+    0x5404, 0x05A4, 0x5408, 0x07F9, 0x5409, 0x0662, 0x540A, 0x0BFB,

+    0x540B, 0x04C7, 0x540C, 0x0C89, 0x540D, 0x0ECA, 0x540E, 0x07B3,

+    0x540F, 0x0F63, 0x5410, 0x0C41, 0x5411, 0x07B2, 0x541B, 0x0705,

+    0x541D, 0x10FC, 0x541F, 0x06DB, 0x5420, 0x0E78, 0x5426, 0x0D71,

+    0x5427, 0x3827, 0x5429, 0x10FB, 0x542B, 0x061A, 0x542C, 0x10F6,

+    0x542D, 0x10F7, 0x542E, 0x10F9, 0x5433, 0x35C0, 0x5436, 0x10FA,

+    0x5438, 0x0675, 0x5439, 0x0A27, 0x543B, 0x0DFD, 0x543C, 0x10F8,

+    0x543D, 0x10F4, 0x543E, 0x0797, 0x543F, 0x35CF, 0x5440, 0x10F5,

+    0x5442, 0x0FCA, 0x5446, 0x0E42, 0x5448, 0x0C04, 0x5449, 0x0796,

+    0x544A, 0x0802, 0x544D, 0x3828, 0x544E, 0x10FD, 0x5451, 0x0CB5,

+    0x5455, 0x3723, 0x545F, 0x1101, 0x5466, 0x3829, 0x5468, 0x092A,

+    0x546A, 0x0922, 0x546B, 0x382A, 0x5470, 0x1104, 0x5471, 0x1102,

+    0x5473, 0x0EAF, 0x5474, 0x382B, 0x5475, 0x10FF, 0x5476, 0x1108,

+    0x5477, 0x1103, 0x547B, 0x1106, 0x547C, 0x077A, 0x547D, 0x0ECB,

+    0x5480, 0x1107, 0x5484, 0x1109, 0x5486, 0x110B, 0x548A, 0x20DC,

+    0x548B, 0x0860, 0x548C, 0x0FE8, 0x548D, 0x382C, 0x548E, 0x1100,

+    0x548F, 0x10FE, 0x5490, 0x110A, 0x5492, 0x1105, 0x5496, 0x382D,

+    0x549C, 0x20DB, 0x54A1, 0x382E, 0x54A2, 0x110D, 0x54A4, 0x1116,

+    0x54A5, 0x110F, 0x54A8, 0x1113, 0x54A9, 0x20DD, 0x54AB, 0x1114,

+    0x54AC, 0x1110, 0x54AD, 0x382F, 0x54AF, 0x1131, 0x54B2, 0x0859,

+    0x54B3, 0x058F, 0x54B8, 0x110E, 0x54B9, 0x3830, 0x54BC, 0x1118,

+    0x54BD, 0x04BA, 0x54BE, 0x1117, 0x54BF, 0x3831, 0x54C0, 0x0469,

+    0x54C1, 0x0DBC, 0x54C2, 0x1115, 0x54C4, 0x1111, 0x54C6, 0x3832,

+    0x54C7, 0x110C, 0x54C8, 0x1112, 0x54C9, 0x0838, 0x54CD, 0x3833,

+    0x54D8, 0x1119, 0x54E1, 0x04BB, 0x54E2, 0x1122, 0x54E5, 0x111A,

+    0x54E6, 0x111B, 0x54E8, 0x098D, 0x54E9, 0x0E97, 0x54ED, 0x1120,

+    0x54EE, 0x111F, 0x54F2, 0x0C29, 0x54FA, 0x1121, 0x54FD, 0x111E,

+    0x54FF, 0x20DE, 0x5504, 0x04D6, 0x5506, 0x0826, 0x5507, 0x09F6,

+    0x550E, 0x3834, 0x550F, 0x111C, 0x5510, 0x0C5C, 0x5514, 0x111D,

+    0x5516, 0x0466, 0x552B, 0x3835, 0x552E, 0x1127, 0x552F, 0x0F0D,

+    0x5531, 0x098F, 0x5533, 0x112D, 0x5535, 0x3836, 0x5538, 0x112C,

+    0x5539, 0x1123, 0x553E, 0x0B23, 0x5540, 0x1124, 0x5544, 0x0B4F,

+    0x5545, 0x1129, 0x5546, 0x098E, 0x554A, 0x3837, 0x554C, 0x1126,

+    0x554F, 0x0EF0, 0x5553, 0x0712, 0x5556, 0x112A, 0x5557, 0x112B,

+    0x555C, 0x1128, 0x555D, 0x112E, 0x555E, 0x1DD1, 0x5560, 0x3838,

+    0x5561, 0x3839, 0x5563, 0x1125, 0x557B, 0x1134, 0x557C, 0x1139,

+    0x557E, 0x1135, 0x5580, 0x1130, 0x5583, 0x113A, 0x5584, 0x0AB3,

+    0x5586, 0x20DF, 0x5587, 0x113C, 0x5588, 0x383A, 0x5589, 0x07B4,

+    0x558A, 0x1132, 0x558B, 0x0BBB, 0x558E, 0x383B, 0x5598, 0x1136,

+    0x5599, 0x112F, 0x559A, 0x05E9, 0x559C, 0x062A, 0x559D, 0x05C3,

+    0x559E, 0x1137, 0x559F, 0x1133, 0x55A7, 0x074C, 0x55A8, 0x113D,

+    0x55A9, 0x113B, 0x55AA, 0x0AD5, 0x55AB, 0x0664, 0x55AC, 0x06A4,

+    0x55AE, 0x1138, 0x55B0, 0x06EC, 0x55B6, 0x04E6, 0x55C4, 0x1141,

+    0x55C5, 0x113F, 0x55C7, 0x1178, 0x55D4, 0x1144, 0x55DA, 0x113E,

+    0x55DC, 0x1142, 0x55DF, 0x1140, 0x55E3, 0x089A, 0x55E4, 0x1143,

+    0x55F7, 0x1146, 0x55F9, 0x114B, 0x55FD, 0x1149, 0x55FE, 0x1148,

+    0x5606, 0x0B70, 0x5608, 0x383C, 0x5609, 0x0545, 0x560E, 0x383D,

+    0x560F, 0x383E, 0x5614, 0x1145, 0x5616, 0x1147, 0x5617, 0x0990,

+    0x5618, 0x04D5, 0x561B, 0x114A, 0x5620, 0x3C1D, 0x5629, 0x055E,

+    0x562F, 0x1155, 0x5631, 0x09E4, 0x5632, 0x1151, 0x5634, 0x114F,

+    0x5636, 0x1150, 0x5637, 0x383F, 0x5638, 0x1152, 0x563F, 0x3840,

+    0x5642, 0x04DF, 0x5649, 0x3841, 0x564B, 0x3842, 0x564C, 0x0ABB,

+    0x564E, 0x114C, 0x564F, 0x3843, 0x5650, 0x114D, 0x5653, 0x1F1B,

+    0x565B, 0x05D8, 0x5664, 0x1154, 0x5666, 0x3844, 0x5668, 0x062B,

+    0x5669, 0x3845, 0x566A, 0x1157, 0x566B, 0x1153, 0x566C, 0x1156,

+    0x566F, 0x3846, 0x5671, 0x3847, 0x5672, 0x3848, 0x5674, 0x0DFE,

+    0x5676, 0x3C33, 0x5678, 0x0CAD, 0x567A, 0x0D4C, 0x5680, 0x1159,

+    0x5686, 0x1158, 0x5687, 0x05A3, 0x568A, 0x115A, 0x568F, 0x115D,

+    0x5694, 0x115C, 0x5695, 0x3849, 0x5699, 0x1DE6, 0x569A, 0x384A,

+    0x56A0, 0x115B, 0x56A2, 0x0CEF, 0x56A5, 0x115E, 0x56AC, 0x384B,

+    0x56AD, 0x384C, 0x56AE, 0x115F, 0x56B1, 0x384D, 0x56B4, 0x1161,

+    0x56B6, 0x1160, 0x56BC, 0x1163, 0x56C0, 0x1166, 0x56C1, 0x1164,

+    0x56C2, 0x1162, 0x56C3, 0x1165, 0x56C8, 0x1167, 0x56C9, 0x384E,

+    0x56CA, 0x1E5A, 0x56CE, 0x1168, 0x56D1, 0x1169, 0x56D3, 0x116A,

+    0x56D7, 0x116B, 0x56D8, 0x107C, 0x56DA, 0x0928, 0x56DB, 0x089B,

+    0x56DD, 0x384F, 0x56DE, 0x0573, 0x56E0, 0x04BC, 0x56E3, 0x0B82,

+    0x56E4, 0x3850, 0x56EE, 0x116C, 0x56F0, 0x0814, 0x56F2, 0x0493,

+    0x56F3, 0x0A24, 0x56F9, 0x116D, 0x56FA, 0x077B, 0x56FD, 0x0803,

+    0x56FF, 0x116F, 0x5700, 0x116E, 0x5703, 0x0E30, 0x5704, 0x1170,

+    0x5708, 0x1172, 0x5709, 0x1171, 0x570A, 0x3851, 0x570B, 0x1173,

+    0x570D, 0x1174, 0x570F, 0x074D, 0x5712, 0x0502, 0x5713, 0x1175,

+    0x5715, 0x3852, 0x5716, 0x1177, 0x5718, 0x1176, 0x571C, 0x1179,

+    0x571F, 0x0C54, 0x5721, 0x3680, 0x5723, 0x3853, 0x5726, 0x117A,

+    0x5727, 0x0479, 0x5728, 0x084F, 0x572D, 0x0713, 0x572F, 0x3854,

+    0x5730, 0x0B8D, 0x5733, 0x3855, 0x5734, 0x3856, 0x5737, 0x117B,

+    0x5738, 0x117C, 0x573B, 0x117E, 0x5740, 0x117F, 0x5742, 0x0854,

+    0x5747, 0x06C9, 0x574A, 0x0E65, 0x574C, 0x3857, 0x574E, 0x117D,

+    0x574F, 0x1180, 0x5750, 0x0831, 0x5751, 0x07B5, 0x5759, 0x20E0,

+    0x5761, 0x1184, 0x5764, 0x0815, 0x5765, 0x20E1, 0x5766, 0x0B71,

+    0x5769, 0x1181, 0x576A, 0x0BF6, 0x5770, 0x3858, 0x577F, 0x1185,

+    0x5782, 0x0A28, 0x5788, 0x1183, 0x5789, 0x1186, 0x578B, 0x0715,

+    0x578C, 0x3859, 0x5793, 0x1187, 0x579C, 0x385A, 0x57A0, 0x1188,

+    0x57A2, 0x07B6, 0x57A3, 0x059E, 0x57A4, 0x118A, 0x57AA, 0x118B,

+    0x57AC, 0x20E2, 0x57B0, 0x118C, 0x57B3, 0x1189, 0x57B8, 0x385B,

+    0x57C0, 0x1182, 0x57C3, 0x118D, 0x57C6, 0x118E, 0x57C7, 0x20E4,

+    0x57C8, 0x20E3, 0x57CB, 0x0E92, 0x57CE, 0x09D3, 0x57D2, 0x1190,

+    0x57D3, 0x1191, 0x57D4, 0x118F, 0x57D6, 0x1193, 0x57DC, 0x0CEE,

+    0x57DF, 0x04AC, 0x57E0, 0x0DC8, 0x57E3, 0x1194, 0x57E6, 0x385C,

+    0x57ED, 0x385D, 0x57F4, 0x09E5, 0x57F5, 0x385E, 0x57F6, 0x385F,

+    0x57F7, 0x08E5, 0x57F9, 0x0D13, 0x57FA, 0x062C, 0x57FC, 0x085B,

+    0x57FF, 0x3860, 0x5800, 0x0E87, 0x5802, 0x0C8A, 0x5805, 0x074E,

+    0x5806, 0x0B2F, 0x5809, 0x3861, 0x580A, 0x1192, 0x580B, 0x1195,

+    0x5815, 0x0B24, 0x5819, 0x1196, 0x581D, 0x1197, 0x5820, 0x3862,

+    0x5821, 0x1199, 0x5824, 0x0C05, 0x582A, 0x05EA, 0x582F, 0x1D32,

+    0x5830, 0x0503, 0x5831, 0x0E43, 0x5832, 0x3863, 0x5834, 0x09D4,

+    0x5835, 0x0C42, 0x583A, 0x0856, 0x583D, 0x119F, 0x5840, 0x0E0D,

+    0x5841, 0x0FA5, 0x584A, 0x0574, 0x584B, 0x119B, 0x5851, 0x0ABC,

+    0x5852, 0x119E, 0x5854, 0x0C5D, 0x5857, 0x0C43, 0x5858, 0x0C5E,

+    0x5859, 0x0D4D, 0x585A, 0x0BE9, 0x585E, 0x0839, 0x5861, 0x1E47,

+    0x5862, 0x119A, 0x5869, 0x0518, 0x586B, 0x0C30, 0x5870, 0x119C,

+    0x5872, 0x1198, 0x5875, 0x0A16, 0x5879, 0x11A0, 0x587C, 0x3864,

+    0x587E, 0x0958, 0x5880, 0x3865, 0x5883, 0x06A5, 0x5885, 0x11A1,

+    0x5893, 0x0E38, 0x5897, 0x0AFF, 0x589C, 0x0BE2, 0x589E, 0x20E7,

+    0x589F, 0x11A3, 0x58A8, 0x0E7D, 0x58A9, 0x3866, 0x58AB, 0x11A4,

+    0x58AE, 0x11A9, 0x58B2, 0x20E8, 0x58B3, 0x0DFF, 0x58B8, 0x11A8,

+    0x58B9, 0x11A2, 0x58BA, 0x11A5, 0x58BB, 0x11A7, 0x58BE, 0x0816,

+    0x58C1, 0x0E19, 0x58C5, 0x11AA, 0x58C7, 0x0B83, 0x58CA, 0x0575,

+    0x58CC, 0x09D5, 0x58CE, 0x3867, 0x58D0, 0x3868, 0x58D1, 0x11AC,

+    0x58D3, 0x11AB, 0x58D4, 0x3869, 0x58D5, 0x07FA, 0x58D7, 0x11AD,

+    0x58D8, 0x11AF, 0x58D9, 0x11AE, 0x58DA, 0x386A, 0x58DC, 0x11B1,

+    0x58DE, 0x11A6, 0x58DF, 0x11B3, 0x58E4, 0x11B2, 0x58E5, 0x11B0,

+    0x58E9, 0x386B, 0x58EB, 0x089C, 0x58EC, 0x0A17, 0x58EE, 0x0AD6,

+    0x58EF, 0x11B4, 0x58F0, 0x0A60, 0x58F1, 0x04B1, 0x58F2, 0x0D1A,

+    0x58F7, 0x0BF7, 0x58F9, 0x11B6, 0x58FA, 0x11B5, 0x58FB, 0x11B7,

+    0x58FC, 0x11B8, 0x58FD, 0x11B9, 0x5902, 0x11BA, 0x5909, 0x0E21,

+    0x590A, 0x11BB, 0x590B, 0x20E9, 0x590C, 0x386C, 0x590F, 0x0546,

+    0x5910, 0x11BC, 0x5915, 0x0F26, 0x5916, 0x058E, 0x5918, 0x10DE,

+    0x5919, 0x0952, 0x591A, 0x0B1F, 0x591B, 0x11BD, 0x591C, 0x0EF7,

+    0x5922, 0x0EC0, 0x5924, 0x386D, 0x5925, 0x11BF, 0x5927, 0x0B47,

+    0x5929, 0x0C31, 0x592A, 0x0B20, 0x592B, 0x0DC9, 0x592C, 0x11C0,

+    0x592D, 0x11C1, 0x592E, 0x051D, 0x592F, 0x386E, 0x5931, 0x08E6,

+    0x5932, 0x11C2, 0x5937, 0x0494, 0x5938, 0x11C3, 0x5939, 0x3725,

+    0x593E, 0x11C4, 0x5944, 0x0504, 0x5947, 0x062D, 0x5948, 0x0CB8,

+    0x5949, 0x0E44, 0x594E, 0x11C8, 0x594F, 0x0AD7, 0x5950, 0x11C7,

+    0x5951, 0x0716, 0x5953, 0x20EA, 0x5954, 0x0E89, 0x5955, 0x11C6,

+    0x5957, 0x0C5F, 0x5958, 0x11CA, 0x595A, 0x11C9, 0x595B, 0x20EB,

+    0x595D, 0x20EC, 0x5960, 0x11CC, 0x5961, 0x386F, 0x5962, 0x11CB,

+    0x5963, 0x20ED, 0x5965, 0x051E, 0x5967, 0x11CD, 0x5968, 0x0991,

+    0x5969, 0x11CF, 0x596A, 0x0B63, 0x596C, 0x11CE, 0x596D, 0x3870,

+    0x596E, 0x0E03, 0x5973, 0x0981, 0x5974, 0x0C55, 0x5978, 0x11D0,

+    0x597D, 0x07B7, 0x5981, 0x11D1, 0x5982, 0x0CD7, 0x5983, 0x0D72,

+    0x5984, 0x0EDD, 0x598A, 0x0CDB, 0x598D, 0x11DA, 0x5993, 0x0652,

+    0x5996, 0x0F2F, 0x5999, 0x0EBB, 0x599B, 0x1239, 0x599D, 0x11D2,

+    0x59A3, 0x11D5, 0x59A4, 0x20EE, 0x59A5, 0x0B25, 0x59A8, 0x0E66,

+    0x59AC, 0x0C44, 0x59B2, 0x11D6, 0x59B9, 0x0E93, 0x59BA, 0x20EF,

+    0x59BB, 0x083A, 0x59BE, 0x0992, 0x59C6, 0x11D7, 0x59C9, 0x089E,

+    0x59CA, 0x3871, 0x59CB, 0x089D, 0x59D0, 0x047D, 0x59D1, 0x077C,

+    0x59D2, 0x3872, 0x59D3, 0x0A4F, 0x59D4, 0x0495, 0x59D9, 0x11DB,

+    0x59DA, 0x11DC, 0x59DC, 0x11D9, 0x59DD, 0x3873, 0x59E3, 0x3874,

+    0x59E4, 0x3875, 0x59E5, 0x04DA, 0x59E6, 0x05EB, 0x59E8, 0x11D8,

+    0x59EA, 0x0ED1, 0x59EB, 0x0DA3, 0x59EC, 0x36AD, 0x59F6, 0x046C,

+    0x59FB, 0x04BD, 0x59FF, 0x089F, 0x5A01, 0x0496, 0x5A03, 0x0467,

+    0x5A04, 0x3876, 0x5A09, 0x11E1, 0x5A0C, 0x3877, 0x5A11, 0x11DF,

+    0x5A18, 0x0EC8, 0x5A1A, 0x11E2, 0x5A1B, 0x35C1, 0x5A1C, 0x11E0,

+    0x5A1F, 0x11DE, 0x5A20, 0x09F7, 0x5A23, 0x3878, 0x5A25, 0x11DD,

+    0x5A29, 0x0E2A, 0x5A2F, 0x0798, 0x5A35, 0x11E6, 0x5A36, 0x11E7,

+    0x5A3C, 0x0993, 0x5A40, 0x11E3, 0x5A41, 0x0FD2, 0x5A46, 0x0D02,

+    0x5A47, 0x3879, 0x5A49, 0x11E5, 0x5A55, 0x387A, 0x5A5A, 0x0817,

+    0x5A62, 0x11E8, 0x5A63, 0x387B, 0x5A66, 0x0DCA, 0x5A6A, 0x11E9,

+    0x5A6C, 0x11E4, 0x5A6D, 0x387C, 0x5A7E, 0x387D, 0x5A7F, 0x0EC7,

+    0x5A92, 0x0D14, 0x5A9A, 0x11EA, 0x5A9B, 0x0DA4, 0x5A9E, 0x387E,

+    0x5AA7, 0x387F, 0x5AAC, 0x3880, 0x5AB3, 0x3881, 0x5ABC, 0x11EB,

+    0x5ABD, 0x11EF, 0x5ABE, 0x11EC, 0x5AC1, 0x0547, 0x5AC2, 0x11EE,

+    0x5AC9, 0x08E7, 0x5ACB, 0x11ED, 0x5ACC, 0x074F, 0x5AD0, 0x11FB,

+    0x5AD6, 0x11F4, 0x5AD7, 0x11F1, 0x5AE0, 0x3882, 0x5AE1, 0x0BA2,

+    0x5AE3, 0x11F0, 0x5AE6, 0x11F2, 0x5AE9, 0x11F3, 0x5AFA, 0x11F5,

+    0x5AFB, 0x11F6, 0x5B00, 0x3883, 0x5B09, 0x062E, 0x5B0B, 0x11F8,

+    0x5B0C, 0x11F7, 0x5B16, 0x11F9, 0x5B19, 0x3884, 0x5B22, 0x09D6,

+    0x5B25, 0x3885, 0x5B2A, 0x11FC, 0x5B2C, 0x0BF8, 0x5B2D, 0x3886,

+    0x5B30, 0x04E7, 0x5B32, 0x11FA, 0x5B36, 0x11FD, 0x5B3E, 0x11FE,

+    0x5B40, 0x1201, 0x5B41, 0x3887, 0x5B43, 0x11FF, 0x5B45, 0x1200,

+    0x5B50, 0x08A0, 0x5B51, 0x1202, 0x5B54, 0x07B8, 0x5B55, 0x1203,

+    0x5B56, 0x20F0, 0x5B57, 0x08C8, 0x5B58, 0x0B18, 0x5B5A, 0x1204,

+    0x5B5B, 0x1205, 0x5B5C, 0x08A8, 0x5B5D, 0x07B9, 0x5B5F, 0x0EDE,

+    0x5B63, 0x0642, 0x5B64, 0x077D, 0x5B65, 0x1206, 0x5B66, 0x05B6,

+    0x5B69, 0x1207, 0x5B6B, 0x0B19, 0x5B70, 0x1208, 0x5B71, 0x1230,

+    0x5B73, 0x1209, 0x5B75, 0x120A, 0x5B78, 0x120B, 0x5B7A, 0x120D,

+    0x5B7C, 0x3888, 0x5B7E, 0x3889, 0x5B7F, 0x388A, 0x5B80, 0x120E,

+    0x5B82, 0x3610, 0x5B83, 0x120F, 0x5B85, 0x0B50, 0x5B87, 0x04C9,

+    0x5B88, 0x0915, 0x5B89, 0x0486, 0x5B8A, 0x388B, 0x5B8B, 0x0AD9,

+    0x5B8C, 0x05EC, 0x5B8D, 0x08E1, 0x5B8F, 0x07BA, 0x5B95, 0x0C60,

+    0x5B97, 0x092B, 0x5B98, 0x05ED, 0x5B99, 0x0BA6, 0x5B9A, 0x0C06,

+    0x5B9B, 0x047C, 0x5B9C, 0x0653, 0x5B9D, 0x0E45, 0x5B9F, 0x08EE,

+    0x5BA2, 0x066C, 0x5BA3, 0x0A8F, 0x5BA4, 0x08E8, 0x5BA5, 0x0F12,

+    0x5BA6, 0x1210, 0x5BAE, 0x0676, 0x5BB0, 0x083B, 0x5BB3, 0x0590,

+    0x5BB4, 0x0505, 0x5BB5, 0x0994, 0x5BB6, 0x0548, 0x5BB8, 0x1211,

+    0x5BB9, 0x0F30, 0x5BBF, 0x0953, 0x5BC0, 0x20F1, 0x5BC2, 0x0910,

+    0x5BC3, 0x1212, 0x5BC4, 0x062F, 0x5BC5, 0x0CAA, 0x5BC6, 0x0EB5,

+    0x5BC7, 0x1213, 0x5BC9, 0x1214, 0x5BCC, 0x0DCB, 0x5BD0, 0x1216,

+    0x5BD2, 0x05E4, 0x5BD3, 0x06EF, 0x5BD4, 0x1215, 0x5BD8, 0x20F3,

+    0x5BDB, 0x05EE, 0x5BDD, 0x09F8, 0x5BDE, 0x121A, 0x5BDF, 0x086F,

+    0x5BE1, 0x0549, 0x5BE2, 0x1219, 0x5BE4, 0x1217, 0x5BE5, 0x121B,

+    0x5BE6, 0x1218, 0x5BE7, 0x0CE1, 0x5BE8, 0x148E, 0x5BE9, 0x09F9,

+    0x5BEB, 0x121C, 0x5BEC, 0x20F4, 0x5BEE, 0x0F88, 0x5BF0, 0x121D,

+    0x5BF3, 0x121F, 0x5BF5, 0x0BBC, 0x5BF6, 0x121E, 0x5BF8, 0x0A47,

+    0x5BFA, 0x08C9, 0x5BFE, 0x0B30, 0x5BFF, 0x0923, 0x5C01, 0x0DE7,

+    0x5C02, 0x0A90, 0x5C04, 0x08F9, 0x5C05, 0x1220, 0x5C06, 0x0995,

+    0x5C07, 0x1221, 0x5C08, 0x1222, 0x5C09, 0x0497, 0x5C0A, 0x0B1A,

+    0x5C0B, 0x0A18, 0x5C0D, 0x1223, 0x5C0E, 0x0C8B, 0x5C0F, 0x0996,

+    0x5C11, 0x0997, 0x5C13, 0x1224, 0x5C14, 0x372A, 0x5C16, 0x0A91,

+    0x5C19, 0x360B, 0x5C1A, 0x0998, 0x5C1E, 0x20F5, 0x5C20, 0x1225,

+    0x5C22, 0x1226, 0x5C23, 0x388C, 0x5C24, 0x0EEC, 0x5C28, 0x1227,

+    0x5C2B, 0x388D, 0x5C2D, 0x06BE, 0x5C30, 0x388E, 0x5C31, 0x092C,

+    0x5C38, 0x1228, 0x5C39, 0x1229, 0x5C3A, 0x0908, 0x5C3B, 0x09F2,

+    0x5C3C, 0x0CCC, 0x5C3D, 0x0A1A, 0x5C3E, 0x0D8C, 0x5C3F, 0x0CD8,

+    0x5C40, 0x06C1, 0x5C41, 0x122A, 0x5C45, 0x0689, 0x5C46, 0x122B,

+    0x5C48, 0x06F6, 0x5C4A, 0x0CA7, 0x5C4B, 0x0530, 0x5C4D, 0x08A1,

+    0x5C4E, 0x122C, 0x5C4F, 0x122F, 0x5C50, 0x122E, 0x5C51, 0x06F5,

+    0x5C53, 0x122D, 0x5C55, 0x0C32, 0x5C5B, 0x1E92, 0x5C5E, 0x0B10,

+    0x5C60, 0x0C45, 0x5C61, 0x08F4, 0x5C62, 0x1E0D, 0x5C63, 0x388F,

+    0x5C64, 0x0ADA, 0x5C65, 0x0F64, 0x5C69, 0x3890, 0x5C6C, 0x1231,

+    0x5C6E, 0x1232, 0x5C6F, 0x0CAE, 0x5C71, 0x0881, 0x5C76, 0x1234,

+    0x5C79, 0x1235, 0x5C7C, 0x3891, 0x5C8C, 0x1236, 0x5C90, 0x0630,

+    0x5C91, 0x1237, 0x5C94, 0x1238, 0x5CA1, 0x052C, 0x5CA6, 0x20F6,

+    0x5CA8, 0x0ABD, 0x5CA9, 0x0620, 0x5CAB, 0x123A, 0x5CAC, 0x0EB4,

+    0x5CB1, 0x0B32, 0x5CB3, 0x05B7, 0x5CB6, 0x123C, 0x5CB7, 0x123E,

+    0x5CB8, 0x061B, 0x5CBA, 0x20F7, 0x5CBB, 0x123B, 0x5CBC, 0x123D,

+    0x5CBE, 0x1240, 0x5CC5, 0x123F, 0x5CC7, 0x1241, 0x5CCB, 0x3892,

+    0x5CD2, 0x3893, 0x5CD9, 0x1242, 0x5CE0, 0x0C95, 0x5CE1, 0x06A6,

+    0x5CE6, 0x372C, 0x5CE8, 0x0565, 0x5CE9, 0x1243, 0x5CEA, 0x1248,

+    0x5CED, 0x1246, 0x5CEF, 0x0E47, 0x5CF0, 0x0E46, 0x5CF4, 0x3894,

+    0x5CF5, 0x20F8, 0x5CF6, 0x0C61, 0x5CFA, 0x1245, 0x5CFB, 0x095E,

+    0x5CFD, 0x1244, 0x5D07, 0x0A38, 0x5D0B, 0x1249, 0x5D0E, 0x085A,

+    0x5D11, 0x124F, 0x5D14, 0x1250, 0x5D15, 0x124A, 0x5D16, 0x0591,

+    0x5D17, 0x124B, 0x5D18, 0x1254, 0x5D19, 0x1253, 0x5D1A, 0x1252,

+    0x5D1B, 0x124E, 0x5D1F, 0x124D, 0x5D22, 0x1251, 0x5D24, 0x3895,

+    0x5D26, 0x3896, 0x5D27, 0x20F9, 0x5D29, 0x0E48, 0x5D42, 0x20FC,

+    0x5D43, 0x3897, 0x5D46, 0x3898, 0x5D4A, 0x3899, 0x5D4B, 0x1258,

+    0x5D4C, 0x1255, 0x5D4E, 0x1257, 0x5D50, 0x0F5C, 0x5D52, 0x1256,

+    0x5D53, 0x20FA, 0x5D5C, 0x124C, 0x5D69, 0x0A39, 0x5D6C, 0x1259,

+    0x5D6D, 0x20FD, 0x5D6F, 0x0827, 0x5D73, 0x125A, 0x5D76, 0x125B,

+    0x5D82, 0x125E, 0x5D84, 0x125D, 0x5D87, 0x125C, 0x5D8B, 0x0C62,

+    0x5D8C, 0x1247, 0x5D90, 0x1264, 0x5D92, 0x389A, 0x5D94, 0x389B,

+    0x5D99, 0x389C, 0x5D9D, 0x1260, 0x5DA0, 0x389D, 0x5DA2, 0x125F,

+    0x5DAC, 0x1261, 0x5DAE, 0x1262, 0x5DB2, 0x3BA5, 0x5DB7, 0x1265,

+    0x5DB8, 0x20FE, 0x5DB9, 0x20FF, 0x5DBA, 0x0FAE, 0x5DBC, 0x1266,

+    0x5DBD, 0x1263, 0x5DC9, 0x1267, 0x5DCC, 0x061C, 0x5DCD, 0x1268,

+    0x5DD0, 0x2100, 0x5DD2, 0x126A, 0x5DD3, 0x1269, 0x5DD6, 0x126B,

+    0x5DD8, 0x389E, 0x5DDB, 0x126C, 0x5DDD, 0x0A92, 0x5DDE, 0x092D,

+    0x5DE0, 0x389F, 0x5DE1, 0x096E, 0x5DE2, 0x3432, 0x5DE3, 0x0AE5,

+    0x5DE5, 0x07BB, 0x5DE6, 0x0828, 0x5DE7, 0x07BC, 0x5DE8, 0x068A,

+    0x5DEB, 0x126D, 0x5DEE, 0x0829, 0x5DF1, 0x077E, 0x5DF2, 0x126E,

+    0x5DF3, 0x0EB2, 0x5DF4, 0x0CF9, 0x5DF5, 0x126F, 0x5DF7, 0x07BD,

+    0x5DF8, 0x38A0, 0x5DFB, 0x05E8, 0x5DFD, 0x0B65, 0x5DFE, 0x06CA,

+    0x5DFF, 0x35E2, 0x5E00, 0x38A1, 0x5E02, 0x08A2, 0x5E03, 0x0DCD,

+    0x5E06, 0x0D55, 0x5E0B, 0x1270, 0x5E0C, 0x0631, 0x5E11, 0x1273,

+    0x5E12, 0x38A2, 0x5E14, 0x38A3, 0x5E15, 0x38A4, 0x5E16, 0x0BBD,

+    0x5E18, 0x38A5, 0x5E19, 0x1272, 0x5E1A, 0x1271, 0x5E1B, 0x1274,

+    0x5E1D, 0x0C07, 0x5E25, 0x0A29, 0x5E2B, 0x08A3, 0x5E2D, 0x0A6E,

+    0x5E2E, 0x38A6, 0x5E2F, 0x0B33, 0x5E30, 0x063C, 0x5E33, 0x0BBE,

+    0x5E36, 0x1275, 0x5E37, 0x1276, 0x5E38, 0x09D7, 0x5E3D, 0x0E67,

+    0x5E40, 0x1279, 0x5E43, 0x1278, 0x5E44, 0x1277, 0x5E45, 0x0DEF,

+    0x5E47, 0x1280, 0x5E4C, 0x0E88, 0x5E4E, 0x127A, 0x5E54, 0x127C,

+    0x5E55, 0x0E99, 0x5E57, 0x127B, 0x5E58, 0x38A7, 0x5E5F, 0x127D,

+    0x5E61, 0x0D3C, 0x5E62, 0x127E, 0x5E63, 0x0E0E, 0x5E64, 0x127F,

+    0x5E6B, 0x38A8, 0x5E6C, 0x38A9, 0x5E72, 0x05EF, 0x5E73, 0x0E0F,

+    0x5E74, 0x0CE5, 0x5E75, 0x1281, 0x5E76, 0x1282, 0x5E78, 0x07BE,

+    0x5E79, 0x05F0, 0x5E7A, 0x1283, 0x5E7B, 0x076C, 0x5E7C, 0x0F2E,

+    0x5E7D, 0x0F13, 0x5E7E, 0x0632, 0x5E7F, 0x1285, 0x5E81, 0x0BBF,

+    0x5E83, 0x07BF, 0x5E84, 0x0999, 0x5E87, 0x0D73, 0x5E8A, 0x099A,

+    0x5E8F, 0x0982, 0x5E95, 0x0C08, 0x5E96, 0x0E49, 0x5E97, 0x0C33,

+    0x5E99, 0x36B0, 0x5E9A, 0x07C0, 0x5E9C, 0x0DCE, 0x5EA0, 0x1286,

+    0x5EA6, 0x0C53, 0x5EA7, 0x0832, 0x5EA8, 0x38AA, 0x5EAA, 0x38AB,

+    0x5EAB, 0x077F, 0x5EAD, 0x0C09, 0x5EB5, 0x0487, 0x5EB6, 0x0978,

+    0x5EB7, 0x07C1, 0x5EB8, 0x0F31, 0x5EBE, 0x38AC, 0x5EBF, 0x38AD,

+    0x5EC1, 0x1287, 0x5EC2, 0x1288, 0x5EC3, 0x0D07, 0x5EC8, 0x1289,

+    0x5EC9, 0x0FBF, 0x5ECA, 0x0FD3, 0x5ECB, 0x38AE, 0x5ECF, 0x128B,

+    0x5ED0, 0x128A, 0x5ED2, 0x38AF, 0x5ED3, 0x05A5, 0x5ED6, 0x128C,

+    0x5EDA, 0x128F, 0x5EDB, 0x1290, 0x5EDD, 0x128E, 0x5EDF, 0x0DB2,

+    0x5EE0, 0x099B, 0x5EE1, 0x1292, 0x5EE2, 0x1291, 0x5EE3, 0x128D,

+    0x5EE8, 0x1293, 0x5EE9, 0x1294, 0x5EEC, 0x1295, 0x5EF0, 0x1298,

+    0x5EF1, 0x1296, 0x5EF3, 0x1297, 0x5EF4, 0x1299, 0x5EF6, 0x0506,

+    0x5EF7, 0x0C0A, 0x5EF8, 0x129A, 0x5EFA, 0x0750, 0x5EFB, 0x0576,

+    0x5EFC, 0x0CEC, 0x5EFE, 0x129B, 0x5EFF, 0x0CD3, 0x5F01, 0x0E2B,

+    0x5F03, 0x129C, 0x5F04, 0x0FD4, 0x5F07, 0x38B0, 0x5F09, 0x129D,

+    0x5F0A, 0x0E10, 0x5F0B, 0x12A0, 0x5F0C, 0x0FFA, 0x5F0D, 0x100A,

+    0x5F0E, 0x38B1, 0x5F0F, 0x08DC, 0x5F10, 0x0CCD, 0x5F11, 0x12A1,

+    0x5F13, 0x0677, 0x5F14, 0x0BC0, 0x5F15, 0x04BE, 0x5F16, 0x12A2,

+    0x5F17, 0x0DF6, 0x5F18, 0x07C2, 0x5F1B, 0x0B8E, 0x5F1C, 0x38B2,

+    0x5F1D, 0x38B3, 0x5F1F, 0x0C0B, 0x5F21, 0x2101, 0x5F22, 0x38B4,

+    0x5F25, 0x0EFB, 0x5F26, 0x076D, 0x5F27, 0x0780, 0x5F28, 0x38B5,

+    0x5F29, 0x12A3, 0x5F2D, 0x12A4, 0x5F2F, 0x12AA, 0x5F31, 0x0911,

+    0x5F34, 0x2102, 0x5F35, 0x0BC1, 0x5F36, 0x38B6, 0x5F37, 0x06A7,

+    0x5F38, 0x12A5, 0x5F3A, 0x3598, 0x5F3B, 0x38B7, 0x5F3C, 0x0D9D,

+    0x5F3E, 0x0B84, 0x5F40, 0x38B8, 0x5F41, 0x12A6, 0x5F45, 0x20B2,

+    0x5F48, 0x12A7, 0x5F4A, 0x06A8, 0x5F4C, 0x12A8, 0x5F4E, 0x12A9,

+    0x5F50, 0x38B9, 0x5F51, 0x12AB, 0x5F53, 0x0C70, 0x5F56, 0x12AC,

+    0x5F57, 0x12AD, 0x5F58, 0x38BA, 0x5F59, 0x12AE, 0x5F5C, 0x129F,

+    0x5F5D, 0x129E, 0x5F61, 0x12AF, 0x5F62, 0x0717, 0x5F64, 0x38BB,

+    0x5F65, 0x36AC, 0x5F66, 0x0D99, 0x5F67, 0x2103, 0x5F69, 0x083C,

+    0x5F6A, 0x0DA9, 0x5F6B, 0x0BC2, 0x5F6C, 0x0DBD, 0x5F6D, 0x12B0,

+    0x5F70, 0x099C, 0x5F71, 0x04E8, 0x5F73, 0x12B1, 0x5F77, 0x12B2,

+    0x5F79, 0x0EFE, 0x5F7C, 0x0D74, 0x5F7F, 0x12B5, 0x5F80, 0x051F,

+    0x5F81, 0x0A50, 0x5F82, 0x12B4, 0x5F83, 0x12B3, 0x5F84, 0x0718,

+    0x5F85, 0x0B34, 0x5F87, 0x12B9, 0x5F88, 0x12B7, 0x5F89, 0x38BC,

+    0x5F8A, 0x12B6, 0x5F8B, 0x0F6F, 0x5F8C, 0x0799, 0x5F90, 0x0983,

+    0x5F91, 0x12B8, 0x5F92, 0x0C46, 0x5F93, 0x0948, 0x5F97, 0x0C98,

+    0x5F98, 0x12BC, 0x5F99, 0x12BB, 0x5F9C, 0x38BD, 0x5F9E, 0x12BA,

+    0x5FA0, 0x12BD, 0x5FA1, 0x079A, 0x5FA4, 0x38BF, 0x5FA7, 0x38BE,

+    0x5FA8, 0x12BE, 0x5FA9, 0x0DEE, 0x5FAA, 0x0965, 0x5FAD, 0x12BF,

+    0x5FAE, 0x0D8D, 0x5FAF, 0x38C0, 0x5FB3, 0x0C99, 0x5FB4, 0x0BC3,

+    0x5FB5, 0x3438, 0x5FB7, 0x2104, 0x5FB8, 0x38C1, 0x5FB9, 0x0C2A,

+    0x5FBC, 0x12C0, 0x5FBD, 0x0645, 0x5FC3, 0x09FA, 0x5FC4, 0x38C2,

+    0x5FC5, 0x0D9E, 0x5FC9, 0x38C3, 0x5FCC, 0x0633, 0x5FCD, 0x0CDC,

+    0x5FD6, 0x12C1, 0x5FD7, 0x08A4, 0x5FD8, 0x0E68, 0x5FD9, 0x0E69,

+    0x5FDC, 0x0520, 0x5FDD, 0x12C6, 0x5FDE, 0x2105, 0x5FE0, 0x0BA7,

+    0x5FE1, 0x38C4, 0x5FE4, 0x12C3, 0x5FE9, 0x38C5, 0x5FEB, 0x0577,

+    0x5FED, 0x38C6, 0x5FF0, 0x12F6, 0x5FF1, 0x12C5, 0x5FF5, 0x0CE6,

+    0x5FF8, 0x12C4, 0x5FFB, 0x12C2, 0x5FFC, 0x38C7, 0x5FFD, 0x080C,

+    0x5FFF, 0x12C8, 0x600E, 0x12CE, 0x600F, 0x12D4, 0x6010, 0x12CC,

+    0x6012, 0x0C56, 0x6015, 0x12D1, 0x6016, 0x0DCF, 0x6017, 0x38C8,

+    0x6019, 0x12CB, 0x601A, 0x38C9, 0x601B, 0x12D0, 0x601C, 0x0FAF,

+    0x601D, 0x08A5, 0x6020, 0x0B35, 0x6021, 0x12C9, 0x6025, 0x0678,

+    0x6026, 0x12D3, 0x6027, 0x0A51, 0x6028, 0x0507, 0x6029, 0x12CD,

+    0x602A, 0x0578, 0x602B, 0x12D2, 0x602F, 0x06A9, 0x6031, 0x12CF,

+    0x6033, 0x38CA, 0x603A, 0x12D5, 0x6041, 0x12D7, 0x6042, 0x12E1,

+    0x6043, 0x12DF, 0x6046, 0x12DC, 0x604A, 0x12DB, 0x604B, 0x0FC0,

+    0x604D, 0x12DD, 0x6050, 0x06AA, 0x6052, 0x07C3, 0x6055, 0x0984,

+    0x6059, 0x12E4, 0x605A, 0x12D6, 0x605D, 0x2106, 0x605F, 0x12DA,

+    0x6060, 0x12CA, 0x6061, 0x38CB, 0x6062, 0x057A, 0x6063, 0x12DE,

+    0x6064, 0x12E0, 0x6065, 0x0B8F, 0x6068, 0x0818, 0x6069, 0x0538,

+    0x606A, 0x12D8, 0x606B, 0x12E3, 0x606C, 0x12E2, 0x606D, 0x06AB,

+    0x606F, 0x0B09, 0x6070, 0x05C4, 0x6075, 0x0719, 0x6077, 0x12D9,

+    0x607F, 0x38CC, 0x6081, 0x12E5, 0x6083, 0x12E8, 0x6084, 0x12EA,

+    0x6085, 0x2107, 0x6089, 0x08E9, 0x608A, 0x2108, 0x608B, 0x12F0,

+    0x608C, 0x0C0C, 0x608D, 0x12E6, 0x6092, 0x12EE, 0x6094, 0x0579,

+    0x6096, 0x12EC, 0x6097, 0x12ED, 0x609A, 0x12E9, 0x609B, 0x12EB,

+    0x609E, 0x38CD, 0x609F, 0x079B, 0x60A0, 0x0F14, 0x60A3, 0x05F1,

+    0x60A4, 0x38CE, 0x60A6, 0x04FB, 0x60A7, 0x12EF, 0x60A9, 0x0CF0,

+    0x60AA, 0x0471, 0x60B0, 0x38CF, 0x60B2, 0x0D75, 0x60B3, 0x12C7,

+    0x60B4, 0x12F5, 0x60B5, 0x12F9, 0x60B6, 0x0EF1, 0x60B8, 0x12F2,

+    0x60BC, 0x0C63, 0x60BD, 0x12F7, 0x60C5, 0x09D8, 0x60C6, 0x12F8,

+    0x60C7, 0x0CAF, 0x60CB, 0x38D0, 0x60D1, 0x0FED, 0x60D3, 0x12F4,

+    0x60D5, 0x210A, 0x60D8, 0x12FA, 0x60DA, 0x080D, 0x60DB, 0x38D1,

+    0x60DC, 0x0A6F, 0x60DE, 0x2109, 0x60DF, 0x0498, 0x60E0, 0x12F3,

+    0x60E1, 0x12F1, 0x60E3, 0x0ADC, 0x60E7, 0x12E7, 0x60E8, 0x0882,

+    0x60F0, 0x0B26, 0x60F1, 0x1306, 0x60F2, 0x210C, 0x60F3, 0x0ADD,

+    0x60F4, 0x1301, 0x60F6, 0x12FE, 0x60F7, 0x12FF, 0x60F8, 0x38D2,

+    0x60F9, 0x0912, 0x60FA, 0x1302, 0x60FB, 0x1305, 0x6100, 0x1300,

+    0x6101, 0x092F, 0x6103, 0x1303, 0x6106, 0x12FD, 0x6108, 0x0F08,

+    0x6109, 0x0F07, 0x610D, 0x1307, 0x610E, 0x1308, 0x610F, 0x0499,

+    0x6111, 0x210D, 0x6112, 0x38D3, 0x6113, 0x38D4, 0x6114, 0x38D5,

+    0x6115, 0x12FC, 0x611A, 0x06EA, 0x611B, 0x046A, 0x611C, 0x38D6,

+    0x611F, 0x05F2, 0x6120, 0x210B, 0x6121, 0x1304, 0x6127, 0x130C,

+    0x6128, 0x130B, 0x612C, 0x1310, 0x6130, 0x210F, 0x6134, 0x1311,

+    0x6137, 0x210E, 0x613C, 0x130F, 0x613D, 0x1312, 0x613E, 0x130A,

+    0x613F, 0x130E, 0x6142, 0x1313, 0x6144, 0x1314, 0x6147, 0x1309,

+    0x6148, 0x08CA, 0x614A, 0x130D, 0x614B, 0x0B36, 0x614C, 0x07C4,

+    0x614D, 0x12FB, 0x614E, 0x09FB, 0x6153, 0x1321, 0x6155, 0x0E39,

+    0x6158, 0x1317, 0x6159, 0x1318, 0x615A, 0x1319, 0x615D, 0x1320,

+    0x615F, 0x131F, 0x6162, 0x0EAB, 0x6163, 0x05F3, 0x6165, 0x131D,

+    0x6167, 0x071B, 0x6168, 0x0592, 0x616B, 0x131A, 0x616E, 0x0F80,

+    0x616F, 0x131C, 0x6170, 0x049A, 0x6171, 0x131E, 0x6173, 0x1315,

+    0x6174, 0x131B, 0x6175, 0x1322, 0x6176, 0x071A, 0x6177, 0x1316,

+    0x617C, 0x38D7, 0x617E, 0x0F47, 0x6182, 0x0F15, 0x6187, 0x1325,

+    0x618A, 0x1329, 0x618D, 0x38D8, 0x618E, 0x0B00, 0x6190, 0x0FC1,

+    0x6191, 0x132A, 0x6194, 0x1327, 0x6196, 0x1324, 0x6198, 0x2110,

+    0x6199, 0x1323, 0x619A, 0x1328, 0x619F, 0x38D9, 0x61A4, 0x0E00,

+    0x61A7, 0x0C8C, 0x61A8, 0x38DA, 0x61A9, 0x071C, 0x61AB, 0x132B,

+    0x61AC, 0x1326, 0x61AE, 0x132C, 0x61B2, 0x0751, 0x61B6, 0x0531,

+    0x61BA, 0x1334, 0x61BE, 0x05F4, 0x61C2, 0x38DB, 0x61C3, 0x1332,

+    0x61C6, 0x1333, 0x61C7, 0x0819, 0x61C8, 0x1331, 0x61C9, 0x132F,

+    0x61CA, 0x132E, 0x61CB, 0x1335, 0x61CC, 0x132D, 0x61CD, 0x1337,

+    0x61D0, 0x057B, 0x61DF, 0x38DC, 0x61E3, 0x1339, 0x61E6, 0x1338,

+    0x61F2, 0x0BC4, 0x61F4, 0x133C, 0x61F6, 0x133A, 0x61F7, 0x1330,

+    0x61F8, 0x0752, 0x61FA, 0x133B, 0x61FC, 0x133F, 0x61FD, 0x133E,

+    0x61FE, 0x1340, 0x61FF, 0x133D, 0x6200, 0x1341, 0x6208, 0x1342,

+    0x6209, 0x1343, 0x620A, 0x0E3A, 0x620C, 0x1345, 0x620D, 0x1344,

+    0x620E, 0x0949, 0x6210, 0x0A52, 0x6211, 0x0566, 0x6212, 0x057C,

+    0x6213, 0x2111, 0x6214, 0x1346, 0x6215, 0x38DD, 0x6216, 0x0483,

+    0x621A, 0x0A70, 0x621B, 0x1347, 0x621D, 0x1A64, 0x621E, 0x1348,

+    0x621F, 0x0737, 0x6221, 0x1349, 0x6226, 0x0A93, 0x6229, 0x38DE,

+    0x622A, 0x134A, 0x622E, 0x134B, 0x622F, 0x0654, 0x6230, 0x134C,

+    0x6232, 0x134D, 0x6233, 0x134E, 0x6234, 0x0B37, 0x6236, 0x35BD,

+    0x6238, 0x0781, 0x623B, 0x0EED, 0x623E, 0x344E, 0x623F, 0x0E6A,

+    0x6240, 0x0974, 0x6241, 0x134F, 0x6243, 0x38DF, 0x6246, 0x38E0,

+    0x6247, 0x0A94, 0x6248, 0x1B1A, 0x6249, 0x0D76, 0x624B, 0x0916,

+    0x624C, 0x38E1, 0x624D, 0x083D, 0x624E, 0x1350, 0x6251, 0x38E2,

+    0x6253, 0x0B27, 0x6255, 0x0DF7, 0x6256, 0x38E3, 0x6258, 0x0B51,

+    0x625B, 0x1353, 0x625E, 0x1351, 0x6260, 0x1354, 0x6263, 0x1352,

+    0x6268, 0x1355, 0x626E, 0x0E01, 0x6271, 0x047B, 0x6276, 0x0DD0,

+    0x6279, 0x0D77, 0x627C, 0x1356, 0x627E, 0x1359, 0x627F, 0x099D,

+    0x6280, 0x0655, 0x6282, 0x1357, 0x6283, 0x135E, 0x6284, 0x099E,

+    0x6285, 0x35C5, 0x6289, 0x1358, 0x628A, 0x0CFA, 0x6291, 0x0F48,

+    0x6292, 0x135A, 0x6293, 0x135B, 0x6294, 0x135F, 0x6295, 0x0C64,

+    0x6296, 0x135C, 0x6297, 0x07C5, 0x6298, 0x0A82, 0x629B, 0x136D,

+    0x629C, 0x0D48, 0x629E, 0x0B52, 0x62A6, 0x2112, 0x62AB, 0x0D78,

+    0x62AC, 0x13B2, 0x62B1, 0x0E4A, 0x62B5, 0x0C0D, 0x62B9, 0x0EA3,

+    0x62BB, 0x1362, 0x62BC, 0x0521, 0x62BD, 0x0BA8, 0x62C2, 0x136B,

+    0x62C4, 0x38E4, 0x62C5, 0x0B72, 0x62C6, 0x1365, 0x62C7, 0x136C,

+    0x62C8, 0x1367, 0x62C9, 0x136E, 0x62CA, 0x136A, 0x62CC, 0x1369,

+    0x62CD, 0x0D25, 0x62CF, 0x1363, 0x62D0, 0x057D, 0x62D1, 0x1361,

+    0x62D2, 0x068B, 0x62D3, 0x0B53, 0x62D4, 0x135D, 0x62D7, 0x1360,

+    0x62D8, 0x07C6, 0x62D9, 0x0A7F, 0x62DB, 0x099F, 0x62DC, 0x1368,

+    0x62DD, 0x0D08, 0x62E0, 0x068C, 0x62E1, 0x05A6, 0x62EC, 0x05C5,

+    0x62ED, 0x09E7, 0x62EE, 0x1370, 0x62EF, 0x1375, 0x62F1, 0x1371,

+    0x62F3, 0x0753, 0x62F5, 0x1376, 0x62F6, 0x0870, 0x62F7, 0x07FB,

+    0x62FC, 0x38E5, 0x62FE, 0x0930, 0x62FF, 0x1364, 0x6301, 0x08CB,

+    0x6302, 0x1373, 0x6307, 0x08A6, 0x6308, 0x1374, 0x6309, 0x0488,

+    0x630A, 0x38E6, 0x630C, 0x136F, 0x630D, 0x38E7, 0x6311, 0x0BC5,

+    0x6318, 0x38E8, 0x6319, 0x068D, 0x631B, 0x3737, 0x631F, 0x06AC,

+    0x6327, 0x1372, 0x6328, 0x046B, 0x632B, 0x0833, 0x632F, 0x09FC,

+    0x6339, 0x38E9, 0x633A, 0x0C0E, 0x633D, 0x0D68, 0x633E, 0x1378,

+    0x633F, 0x0AE0, 0x6342, 0x38EA, 0x6343, 0x38EB, 0x6349, 0x0B0A,

+    0x634C, 0x0879, 0x634D, 0x1379, 0x634F, 0x137B, 0x6350, 0x1377,

+    0x6355, 0x0E31, 0x6357, 0x0BD9, 0x635C, 0x0ADE, 0x6365, 0x38EC,

+    0x6367, 0x0E4B, 0x6368, 0x08FA, 0x6369, 0x1387, 0x636B, 0x1386,

+    0x636E, 0x0A3E, 0x6372, 0x0754, 0x6374, 0x38ED, 0x6376, 0x1380,

+    0x6377, 0x09A1, 0x637A, 0x0CC0, 0x637B, 0x0CE7, 0x637D, 0x38EE,

+    0x6380, 0x137E, 0x6383, 0x0ADF, 0x6384, 0x38EF, 0x6387, 0x38F0,

+    0x6388, 0x0924, 0x6389, 0x1383, 0x638C, 0x09A0, 0x638E, 0x137D,

+    0x638F, 0x1382, 0x6390, 0x38F1, 0x6392, 0x0D09, 0x6396, 0x137C,

+    0x6398, 0x06F7, 0x639B, 0x05BB, 0x639E, 0x38F2, 0x639F, 0x1384,

+    0x63A0, 0x0F73, 0x63A1, 0x083E, 0x63A2, 0x0B73, 0x63A3, 0x1381,

+    0x63A5, 0x0A80, 0x63A7, 0x07C7, 0x63A8, 0x0A2A, 0x63A9, 0x0508,

+    0x63AA, 0x0ABE, 0x63AB, 0x137F, 0x63AC, 0x065F, 0x63B2, 0x071D,

+    0x63B4, 0x0BEB, 0x63B5, 0x1385, 0x63BB, 0x0AE1, 0x63BE, 0x1388,

+    0x63C0, 0x138A, 0x63C3, 0x0B17, 0x63C4, 0x1390, 0x63C6, 0x138B,

+    0x63C9, 0x138D, 0x63CF, 0x0DB3, 0x63D0, 0x0C0F, 0x63D1, 0x38F3,

+    0x63D2, 0x138E, 0x63D6, 0x0F16, 0x63DA, 0x0F32, 0x63DB, 0x05F5,

+    0x63DC, 0x38F4, 0x63E1, 0x0472, 0x63E3, 0x138C, 0x63E9, 0x1389,

+    0x63ED, 0x341C, 0x63EE, 0x0634, 0x63F4, 0x0509, 0x63F5, 0x2113,

+    0x63F6, 0x138F, 0x63F7, 0x3644, 0x63FA, 0x0F33, 0x6406, 0x1393,

+    0x6409, 0x38F5, 0x640D, 0x0B1B, 0x640F, 0x139A, 0x6410, 0x38F6,

+    0x6413, 0x1394, 0x6414, 0x1E2C, 0x6416, 0x1391, 0x6417, 0x1398,

+    0x641C, 0x137A, 0x6422, 0x38F7, 0x6426, 0x1395, 0x6428, 0x1399,

+    0x642C, 0x0D56, 0x642D, 0x0C65, 0x6434, 0x1392, 0x6436, 0x1396,

+    0x643A, 0x071E, 0x643E, 0x0861, 0x6442, 0x0A81, 0x644E, 0x139E,

+    0x6451, 0x1E43, 0x6454, 0x38F8, 0x6458, 0x0C20, 0x645B, 0x38F9,

+    0x6460, 0x2114, 0x6467, 0x139B, 0x6469, 0x0E8E, 0x646D, 0x38FA,

+    0x646F, 0x139C, 0x6476, 0x139D, 0x6478, 0x0EDA, 0x647A, 0x0A46,

+    0x647B, 0x38FB, 0x6483, 0x0738, 0x6488, 0x13A4, 0x6492, 0x0883,

+    0x6493, 0x13A1, 0x6495, 0x13A0, 0x649A, 0x0CE8, 0x649D, 0x2115,

+    0x649E, 0x0C8D, 0x64A4, 0x0C2B, 0x64A5, 0x13A2, 0x64A9, 0x13A3,

+    0x64AB, 0x0DE1, 0x64AD, 0x0CFB, 0x64AE, 0x0871, 0x64B0, 0x0A95,

+    0x64B2, 0x0E7E, 0x64B9, 0x05A7, 0x64BB, 0x13AA, 0x64BC, 0x13A5,

+    0x64BE, 0x38FC, 0x64BF, 0x38FD, 0x64C1, 0x0F34, 0x64C2, 0x13AC,

+    0x64C5, 0x13A8, 0x64C7, 0x13A9, 0x64CA, 0x341D, 0x64CD, 0x0AE2,

+    0x64CE, 0x2116, 0x64D2, 0x13A7, 0x64D4, 0x1366, 0x64D8, 0x13AB,

+    0x64DA, 0x13A6, 0x64E0, 0x13B0, 0x64E1, 0x13B1, 0x64E2, 0x0C21,

+    0x64E3, 0x13B3, 0x64E5, 0x38FE, 0x64E6, 0x0872, 0x64E7, 0x13AE,

+    0x64EC, 0x0656, 0x64EF, 0x13B4, 0x64F1, 0x13AD, 0x64F2, 0x13B8,

+    0x64F4, 0x13B7, 0x64F6, 0x13B6, 0x64F7, 0x38FF, 0x64FA, 0x13B9,

+    0x64FB, 0x3900, 0x64FD, 0x13BB, 0x64FE, 0x09D9, 0x6500, 0x13BA,

+    0x6504, 0x3901, 0x6505, 0x13BE, 0x6516, 0x3902, 0x6518, 0x13BC,

+    0x6519, 0x3903, 0x651C, 0x13BD, 0x651D, 0x1397, 0x6522, 0x1E97,

+    0x6523, 0x13C0, 0x6524, 0x13BF, 0x652A, 0x139F, 0x652B, 0x13C1,

+    0x652C, 0x13B5, 0x652F, 0x08A7, 0x6534, 0x13C2, 0x6535, 0x13C3,

+    0x6536, 0x13C5, 0x6537, 0x13C4, 0x6538, 0x13C6, 0x6539, 0x057E,

+    0x653B, 0x07C8, 0x653E, 0x0E4C, 0x653F, 0x0A53, 0x6545, 0x0782,

+    0x6547, 0x3904, 0x6548, 0x13C8, 0x654D, 0x13CB, 0x654E, 0x2117,

+    0x654F, 0x0DC4, 0x6551, 0x0679, 0x6555, 0x13CA, 0x6556, 0x13C9,

+    0x6557, 0x0D0A, 0x6558, 0x13CC, 0x6559, 0x06AD, 0x655D, 0x13CE,

+    0x655E, 0x13CD, 0x6562, 0x05F6, 0x6563, 0x0884, 0x6566, 0x0CB0,

+    0x6567, 0x3905, 0x656C, 0x071F, 0x6570, 0x0A3A, 0x6572, 0x13CF,

+    0x6574, 0x0A54, 0x6575, 0x0C22, 0x6577, 0x0DD1, 0x6578, 0x13D0,

+    0x6581, 0x3906, 0x6582, 0x13D1, 0x6583, 0x13D2, 0x6585, 0x3907,

+    0x6587, 0x0E08, 0x6588, 0x120C, 0x6589, 0x0A6A, 0x658C, 0x0DBE,

+    0x658E, 0x0848, 0x6590, 0x0D79, 0x6591, 0x0D57, 0x6597, 0x0C47,

+    0x6599, 0x0F89, 0x659B, 0x13D4, 0x659C, 0x08FC, 0x659F, 0x13D5,

+    0x65A1, 0x047A, 0x65A4, 0x06CC, 0x65A5, 0x0A71, 0x65A7, 0x0DD2,

+    0x65AB, 0x13D6, 0x65AC, 0x0890, 0x65AD, 0x0B85, 0x65AF, 0x08A9,

+    0x65B0, 0x09FD, 0x65B7, 0x13D7, 0x65B9, 0x0E4D, 0x65BC, 0x0519,

+    0x65BD, 0x08AA, 0x65C1, 0x13DA, 0x65C2, 0x3908, 0x65C3, 0x13D8,

+    0x65C4, 0x13DB, 0x65C5, 0x0F81, 0x65C6, 0x13D9, 0x65CB, 0x0A9F,

+    0x65CC, 0x13DC, 0x65CF, 0x0B12, 0x65D2, 0x13DD, 0x65D7, 0x0636,

+    0x65D9, 0x13DF, 0x65DB, 0x13DE, 0x65E0, 0x13E0, 0x65E1, 0x13E1,

+    0x65E2, 0x0637, 0x65E3, 0x3585, 0x65E5, 0x0CD4, 0x65E6, 0x0B74,

+    0x65E7, 0x0686, 0x65E8, 0x08AB, 0x65E9, 0x0AE3, 0x65EC, 0x0966,

+    0x65ED, 0x0474, 0x65F0, 0x3909, 0x65F1, 0x13E2, 0x65F2, 0x390A,

+    0x65FA, 0x0522, 0x65FB, 0x13E6, 0x6600, 0x2118, 0x6602, 0x07C9,

+    0x6603, 0x13E5, 0x6606, 0x081B, 0x6607, 0x09A2, 0x6609, 0x211A,

+    0x660A, 0x13E4, 0x660C, 0x09A3, 0x660E, 0x0ECC, 0x660F, 0x081A,

+    0x6613, 0x049B, 0x6614, 0x0A72, 0x6615, 0x2119, 0x661C, 0x13EB,

+    0x661E, 0x211C, 0x661F, 0x0A55, 0x6620, 0x04E9, 0x6624, 0x211D,

+    0x6625, 0x095F, 0x6627, 0x0E94, 0x6628, 0x0862, 0x662C, 0x390B,

+    0x662D, 0x09A4, 0x662E, 0x211B, 0x662F, 0x0A4B, 0x6631, 0x20AE,

+    0x6634, 0x13EA, 0x6635, 0x13E8, 0x6636, 0x13E9, 0x663B, 0x1E00,

+    0x663C, 0x0BA9, 0x663F, 0x1409, 0x6641, 0x13EF, 0x6642, 0x08CC,

+    0x6643, 0x07CA, 0x6644, 0x13ED, 0x6649, 0x13EE, 0x664B, 0x09FE,

+    0x664C, 0x390C, 0x664F, 0x13EC, 0x6652, 0x087D, 0x6657, 0x211F,

+    0x6659, 0x2120, 0x665B, 0x390D, 0x665C, 0x390E, 0x665D, 0x13F1,

+    0x665E, 0x13F0, 0x665F, 0x13F5, 0x6661, 0x390F, 0x6662, 0x13F6,

+    0x6663, 0x373A, 0x6664, 0x13F2, 0x6665, 0x211E, 0x6666, 0x0580,

+    0x6667, 0x13F3, 0x6668, 0x13F4, 0x6669, 0x0D69, 0x666B, 0x3910,

+    0x666E, 0x0DD3, 0x666F, 0x0720, 0x6670, 0x13F7, 0x6673, 0x2122,

+    0x6674, 0x0A56, 0x6676, 0x09A5, 0x6677, 0x3911, 0x667A, 0x0B90,

+    0x6681, 0x06BF, 0x6683, 0x13F8, 0x6684, 0x13FC, 0x6687, 0x054B,

+    0x6688, 0x13F9, 0x6689, 0x13FB, 0x668E, 0x13FA, 0x6691, 0x0975,

+    0x6696, 0x0B86, 0x6697, 0x0489, 0x6698, 0x13FD, 0x6699, 0x2123,

+    0x669D, 0x13FE, 0x66A0, 0x2124, 0x66A2, 0x0BC6, 0x66A4, 0x3912,

+    0x66A6, 0x0FB9, 0x66AB, 0x0891, 0x66AE, 0x0E3B, 0x66B2, 0x2125,

+    0x66B4, 0x0E6B, 0x66B8, 0x1405, 0x66B9, 0x1400, 0x66BC, 0x1403,

+    0x66BE, 0x1402, 0x66BF, 0x2126, 0x66C1, 0x13FF, 0x66C4, 0x1404,

+    0x66C6, 0x3455, 0x66C7, 0x0CB6, 0x66C8, 0x3913, 0x66C9, 0x1401,

+    0x66D6, 0x1406, 0x66D9, 0x0976, 0x66DA, 0x1407, 0x66DC, 0x0F35,

+    0x66DD, 0x0D2E, 0x66E0, 0x1408, 0x66E6, 0x140A, 0x66E9, 0x140B,

+    0x66EC, 0x3914, 0x66F0, 0x140C, 0x66F2, 0x06C2, 0x66F3, 0x04EA,

+    0x66F4, 0x07CB, 0x66F5, 0x140D, 0x66F7, 0x140E, 0x66F8, 0x097B,

+    0x66F9, 0x0AE4, 0x66FA, 0x2127, 0x66FB, 0x20B1, 0x66FC, 0x10ED,

+    0x66FD, 0x0AC0, 0x66FE, 0x0ABF, 0x66FF, 0x0B38, 0x6700, 0x0837,

+    0x6703, 0x104B, 0x6705, 0x3915, 0x6708, 0x0744, 0x6709, 0x0F17,

+    0x670B, 0x0E4E, 0x670D, 0x0DF0, 0x670E, 0x2128, 0x670F, 0x140F,

+    0x6713, 0x3916, 0x6714, 0x0863, 0x6715, 0x0BDB, 0x6716, 0x1410,

+    0x6717, 0x0FD5, 0x671B, 0x0E6C, 0x671D, 0x0BC7, 0x671E, 0x1411,

+    0x671F, 0x0638, 0x6726, 0x1412, 0x6727, 0x1413, 0x6728, 0x0EE6,

+    0x672A, 0x0EB0, 0x672B, 0x0EA4, 0x672C, 0x0E8A, 0x672D, 0x0873,

+    0x672E, 0x1415, 0x6731, 0x0917, 0x6733, 0x3917, 0x6734, 0x0E7F,

+    0x6736, 0x1417, 0x6737, 0x141A, 0x6738, 0x1419, 0x673A, 0x0635,

+    0x673D, 0x067A, 0x673F, 0x1416, 0x6741, 0x1418, 0x6743, 0x35B7,

+    0x6746, 0x141B, 0x6748, 0x3918, 0x6749, 0x0A3F, 0x674C, 0x3919,

+    0x674E, 0x0F65, 0x674F, 0x048D, 0x6750, 0x0850, 0x6751, 0x0B1C,

+    0x6753, 0x0909, 0x6756, 0x09DB, 0x6759, 0x141E, 0x675C, 0x0C48,

+    0x675E, 0x141C, 0x675F, 0x0B0B, 0x6760, 0x141D, 0x6761, 0x09DA,

+    0x6762, 0x0EE9, 0x6763, 0x141F, 0x6764, 0x1420, 0x6765, 0x0F52,

+    0x6766, 0x212A, 0x676A, 0x1425, 0x676D, 0x07CC, 0x676E, 0x3571,

+    0x676F, 0x0D0B, 0x6770, 0x1422, 0x6771, 0x0C66, 0x6772, 0x13E3,

+    0x6773, 0x13E7, 0x6775, 0x0669, 0x6776, 0x391A, 0x6777, 0x0CFD,

+    0x677B, 0x391B, 0x677C, 0x1424, 0x677E, 0x09A6, 0x677F, 0x0D58,

+    0x6785, 0x142A, 0x6787, 0x0D8E, 0x6789, 0x1421, 0x678B, 0x1427,

+    0x678C, 0x1426, 0x6790, 0x0A73, 0x6795, 0x0E9B, 0x6797, 0x0F9B,

+    0x679A, 0x0E95, 0x679C, 0x054C, 0x679D, 0x08AC, 0x67A0, 0x0FEE,

+    0x67A1, 0x1429, 0x67A2, 0x0A3B, 0x67A6, 0x1428, 0x67A9, 0x1423,

+    0x67AF, 0x0783, 0x67B0, 0x391C, 0x67B2, 0x391D, 0x67B3, 0x142F,

+    0x67B4, 0x142D, 0x67B6, 0x054D, 0x67B7, 0x142B, 0x67B8, 0x1431,

+    0x67B9, 0x1437, 0x67BB, 0x212B, 0x67C0, 0x212D, 0x67C1, 0x0B28,

+    0x67C4, 0x0E11, 0x67C6, 0x1439, 0x67CA, 0x0D94, 0x67CE, 0x1438,

+    0x67CF, 0x0D26, 0x67D0, 0x0E6D, 0x67D1, 0x05F7, 0x67D3, 0x0A9B,

+    0x67D4, 0x094A, 0x67D7, 0x391F, 0x67D8, 0x0BEF, 0x67D9, 0x3920,

+    0x67DA, 0x0F18, 0x67DD, 0x1434, 0x67DE, 0x1433, 0x67E2, 0x1435,

+    0x67E4, 0x1432, 0x67E7, 0x143A, 0x67E9, 0x1430, 0x67EC, 0x142E,

+    0x67EE, 0x1436, 0x67EF, 0x142C, 0x67F0, 0x3921, 0x67F1, 0x0BAA,

+    0x67F3, 0x0F04, 0x67F4, 0x08F2, 0x67F5, 0x0864, 0x67F9, 0x391E,

+    0x67FB, 0x082A, 0x67FE, 0x0E9D, 0x67FF, 0x059F, 0x6801, 0x212E,

+    0x6802, 0x0BEA, 0x6803, 0x0CA2, 0x6804, 0x04EB, 0x6805, 0x1E07,

+    0x6813, 0x0A96, 0x6816, 0x0A58, 0x6817, 0x0700, 0x681E, 0x143C,

+    0x6821, 0x07CD, 0x6822, 0x05DA, 0x6829, 0x143E, 0x682A, 0x05D2,

+    0x682B, 0x1444, 0x682C, 0x3922, 0x6830, 0x3923, 0x6831, 0x3924,

+    0x6832, 0x1441, 0x6834, 0x0A97, 0x6838, 0x05A9, 0x6839, 0x081C,

+    0x683C, 0x05A8, 0x683D, 0x083F, 0x6840, 0x143F, 0x6841, 0x073B,

+    0x6842, 0x0721, 0x6843, 0x0C67, 0x6844, 0x212F, 0x6846, 0x143D,

+    0x6848, 0x048A, 0x684D, 0x1440, 0x684E, 0x1442, 0x6850, 0x06C5,

+    0x6851, 0x0702, 0x6852, 0x212C, 0x6853, 0x05F8, 0x6854, 0x0665,

+    0x6859, 0x1445, 0x685B, 0x3925, 0x685C, 0x0869, 0x685D, 0x0E9F,

+    0x685F, 0x0885, 0x6863, 0x1446, 0x6867, 0x0DA2, 0x6872, 0x3926,

+    0x6874, 0x1452, 0x6875, 0x3927, 0x6876, 0x0533, 0x6877, 0x1447,

+    0x687A, 0x3928, 0x687E, 0x1458, 0x687F, 0x1448, 0x6881, 0x0F8A,

+    0x6883, 0x144F, 0x6884, 0x3929, 0x6885, 0x0D15, 0x688D, 0x1457,

+    0x688E, 0x1E9C, 0x688F, 0x144A, 0x6893, 0x0478, 0x6894, 0x144C,

+    0x6897, 0x07CE, 0x689B, 0x144E, 0x689D, 0x144D, 0x689F, 0x1449,

+    0x68A0, 0x1454, 0x68A2, 0x09A7, 0x68A5, 0x392A, 0x68A6, 0x11BE,

+    0x68A7, 0x079C, 0x68A8, 0x0F66, 0x68AD, 0x144B, 0x68AF, 0x0C10,

+    0x68B0, 0x0581, 0x68B1, 0x081D, 0x68B2, 0x392B, 0x68B3, 0x1443,

+    0x68B5, 0x1453, 0x68B6, 0x05BF, 0x68B9, 0x1451, 0x68BA, 0x1455,

+    0x68BC, 0x0C68, 0x68C4, 0x063A, 0x68C6, 0x1473, 0x68C8, 0x20AF,

+    0x68C9, 0x0ED5, 0x68CA, 0x145A, 0x68CB, 0x0639, 0x68CD, 0x1461,

+    0x68CF, 0x2130, 0x68D0, 0x392C, 0x68D2, 0x0E6E, 0x68D4, 0x1462,

+    0x68D5, 0x1464, 0x68D6, 0x392D, 0x68D7, 0x1468, 0x68D8, 0x145C,

+    0x68DA, 0x0B68, 0x68DF, 0x0C69, 0x68E0, 0x146C, 0x68E1, 0x145F,

+    0x68E3, 0x1469, 0x68E7, 0x1463, 0x68E8, 0x392E, 0x68ED, 0x392F,

+    0x68EE, 0x09FF, 0x68EF, 0x146D, 0x68F0, 0x3930, 0x68F1, 0x3931,

+    0x68F2, 0x0A57, 0x68F9, 0x146B, 0x68FA, 0x05F9, 0x68FC, 0x3932,

+    0x6900, 0x0FF6, 0x6901, 0x1459, 0x6904, 0x1467, 0x6905, 0x049C,

+    0x6908, 0x145B, 0x690B, 0x0EC6, 0x690C, 0x1460, 0x690D, 0x09E8,

+    0x690E, 0x0BE3, 0x690F, 0x1456, 0x6911, 0x3933, 0x6912, 0x1466,

+    0x6913, 0x3934, 0x6919, 0x0A40, 0x691A, 0x1470, 0x691B, 0x05CF,

+    0x691C, 0x0755, 0x6921, 0x1472, 0x6922, 0x145D, 0x6923, 0x1471,

+    0x6925, 0x146A, 0x6926, 0x145E, 0x6928, 0x146E, 0x692A, 0x146F,

+    0x6930, 0x1480, 0x6934, 0x0CA6, 0x6935, 0x3935, 0x6936, 0x1465,

+    0x6939, 0x147C, 0x693B, 0x3936, 0x693D, 0x147E, 0x693F, 0x0BF4,

+    0x694A, 0x0F36, 0x6953, 0x0DE8, 0x6954, 0x1479, 0x6955, 0x0B2A,

+    0x6957, 0x3937, 0x6959, 0x147F, 0x695A, 0x0AC1, 0x695C, 0x1476,

+    0x695D, 0x1483, 0x695E, 0x1482, 0x6960, 0x0CC7, 0x6961, 0x1481,

+    0x6962, 0x0CC2, 0x6963, 0x3938, 0x6968, 0x2132, 0x696A, 0x1485,

+    0x696B, 0x1478, 0x696D, 0x06C0, 0x696E, 0x147B, 0x696F, 0x0967,

+    0x6972, 0x3939, 0x6973, 0x0D16, 0x6974, 0x147D, 0x6975, 0x06C3,

+    0x6977, 0x1475, 0x6978, 0x1477, 0x6979, 0x1474, 0x697C, 0x0FD6,

+    0x697D, 0x05B8, 0x697E, 0x147A, 0x697F, 0x393A, 0x6980, 0x393B,

+    0x6981, 0x1484, 0x6982, 0x0593, 0x698A, 0x0857, 0x698E, 0x04FF,

+    0x6991, 0x1495, 0x6994, 0x0FD7, 0x6995, 0x1498, 0x6998, 0x2134,

+    0x699B, 0x0A00, 0x699C, 0x1497, 0x69A0, 0x1496, 0x69A6, 0x393C,

+    0x69A7, 0x1493, 0x69AD, 0x393D, 0x69AE, 0x1487, 0x69B1, 0x14A4,

+    0x69B2, 0x1486, 0x69B4, 0x1499, 0x69B7, 0x393E, 0x69BB, 0x1491,

+    0x69BE, 0x148C, 0x69BF, 0x1489, 0x69C1, 0x148A, 0x69C3, 0x1492,

+    0x69C7, 0x1D33, 0x69CA, 0x148F, 0x69CB, 0x07CF, 0x69CC, 0x0BE4,

+    0x69CD, 0x0AE6, 0x69CE, 0x148D, 0x69D0, 0x1488, 0x69D3, 0x148B,

+    0x69D6, 0x393F, 0x69D7, 0x3940, 0x69D8, 0x0F37, 0x69D9, 0x0E98,

+    0x69DD, 0x1490, 0x69DE, 0x149A, 0x69E2, 0x2135, 0x69E7, 0x14A2,

+    0x69E8, 0x149B, 0x69EA, 0x356F, 0x69EB, 0x14A8, 0x69ED, 0x14A6,

+    0x69F2, 0x14A1, 0x69F6, 0x373F, 0x69F9, 0x14A0, 0x69FB, 0x0BEC,

+    0x69FD, 0x0AE7, 0x69FF, 0x149E, 0x6A01, 0x3941, 0x6A02, 0x149C,

+    0x6A05, 0x14A3, 0x6A0A, 0x14A9, 0x6A0B, 0x0D89, 0x6A0C, 0x14AF,

+    0x6A0F, 0x3942, 0x6A12, 0x14AA, 0x6A13, 0x14AD, 0x6A14, 0x14A7,

+    0x6A15, 0x3943, 0x6A17, 0x0BB2, 0x6A19, 0x0DAA, 0x6A1B, 0x149D,

+    0x6A1E, 0x14A5, 0x6A1F, 0x09A8, 0x6A21, 0x0EDB, 0x6A22, 0x14B9,

+    0x6A23, 0x14AC, 0x6A28, 0x3944, 0x6A29, 0x0756, 0x6A2A, 0x0523,

+    0x6A2B, 0x05BD, 0x6A2E, 0x1494, 0x6A30, 0x2136, 0x6A34, 0x3945,

+    0x6A35, 0x09A9, 0x6A36, 0x14B1, 0x6A38, 0x14B8, 0x6A39, 0x0925,

+    0x6A3A, 0x05D0, 0x6A3D, 0x0B6C, 0x6A3E, 0x3946, 0x6A44, 0x14AE,

+    0x6A45, 0x3947, 0x6A46, 0x2138, 0x6A47, 0x14B3, 0x6A48, 0x14B7,

+    0x6A4B, 0x06AE, 0x6A50, 0x3948, 0x6A51, 0x3949, 0x6A54, 0x3C34,

+    0x6A56, 0x394A, 0x6A58, 0x0666, 0x6A59, 0x14B5, 0x6A5B, 0x394B,

+    0x6A5F, 0x063B, 0x6A61, 0x0CA3, 0x6A62, 0x14B4, 0x6A66, 0x14B6,

+    0x6A6B, 0x2137, 0x6A72, 0x14B0, 0x6A73, 0x2139, 0x6A78, 0x14B2,

+    0x6A7E, 0x213A, 0x6A7F, 0x05BE, 0x6A80, 0x0B87, 0x6A83, 0x394C,

+    0x6A84, 0x14BD, 0x6A89, 0x394D, 0x6A8D, 0x14BB, 0x6A8E, 0x079D,

+    0x6A90, 0x14BA, 0x6A91, 0x394E, 0x6A97, 0x14C0, 0x6A9C, 0x143B,

+    0x6A9D, 0x394F, 0x6A9E, 0x3950, 0x6A9F, 0x3951, 0x6AA0, 0x14BC,

+    0x6AA2, 0x14BE, 0x6AA3, 0x14BF, 0x6AAA, 0x14CB, 0x6AAC, 0x14C7,

+    0x6AAE, 0x1450, 0x6AB3, 0x14C6, 0x6AB8, 0x14C5, 0x6ABB, 0x14C2,

+    0x6AC1, 0x14AB, 0x6AC2, 0x14C4, 0x6AC3, 0x14C3, 0x6AD1, 0x14C9,

+    0x6AD3, 0x0FCC, 0x6ADA, 0x14CC, 0x6ADB, 0x06F3, 0x6ADC, 0x3952,

+    0x6ADE, 0x14C8, 0x6ADF, 0x14CA, 0x6AE2, 0x213B, 0x6AE4, 0x213C,

+    0x6AE7, 0x3953, 0x6AE8, 0x0D3B, 0x6AEA, 0x14CD, 0x6AEC, 0x3954,

+    0x6AFA, 0x14D1, 0x6AFB, 0x14CE, 0x6B04, 0x0F5D, 0x6B05, 0x14CF,

+    0x6B0A, 0x149F, 0x6B12, 0x14D2, 0x6B16, 0x14D3, 0x6B1D, 0x04D7,

+    0x6B1E, 0x3955, 0x6B1F, 0x14D5, 0x6B20, 0x073D, 0x6B21, 0x08CD,

+    0x6B23, 0x06CD, 0x6B24, 0x3956, 0x6B27, 0x0524, 0x6B32, 0x0F49,

+    0x6B35, 0x3957, 0x6B37, 0x14D7, 0x6B38, 0x14D6, 0x6B39, 0x14D9,

+    0x6B3A, 0x0657, 0x6B3D, 0x06CE, 0x6B3E, 0x05FA, 0x6B43, 0x14DC,

+    0x6B46, 0x3958, 0x6B47, 0x14DB, 0x6B49, 0x14DD, 0x6B4C, 0x054E,

+    0x6B4E, 0x0B75, 0x6B50, 0x14DE, 0x6B53, 0x05FB, 0x6B54, 0x14E0,

+    0x6B56, 0x3959, 0x6B59, 0x14DF, 0x6B5B, 0x14E1, 0x6B5F, 0x14E2,

+    0x6B60, 0x395A, 0x6B61, 0x14E3, 0x6B62, 0x08AD, 0x6B63, 0x0A59,

+    0x6B64, 0x0811, 0x6B65, 0x344A, 0x6B66, 0x0DE2, 0x6B69, 0x0E32,

+    0x6B6A, 0x0FEA, 0x6B6F, 0x08C3, 0x6B72, 0x35D9, 0x6B73, 0x0840,

+    0x6B74, 0x0FBA, 0x6B77, 0x3456, 0x6B78, 0x14E4, 0x6B79, 0x14E5,

+    0x6B7B, 0x08AE, 0x6B7F, 0x14E6, 0x6B80, 0x14E7, 0x6B82, 0x395B,

+    0x6B83, 0x14E9, 0x6B84, 0x14E8, 0x6B86, 0x0E86, 0x6B89, 0x0968,

+    0x6B8A, 0x0918, 0x6B8B, 0x0892, 0x6B8D, 0x14EA, 0x6B95, 0x14EC,

+    0x6B96, 0x09E9, 0x6B98, 0x14EB, 0x6B9E, 0x14ED, 0x6BA4, 0x14EE,

+    0x6BAA, 0x14EF, 0x6BAB, 0x14F0, 0x6BAF, 0x14F1, 0x6BB1, 0x14F3,

+    0x6BB2, 0x14F2, 0x6BB3, 0x14F4, 0x6BB4, 0x0525, 0x6BB5, 0x0B88,

+    0x6BB7, 0x14F5, 0x6BBA, 0x0874, 0x6BBB, 0x05AA, 0x6BBC, 0x14F6,

+    0x6BBE, 0x395C, 0x6BBF, 0x0C3C, 0x6BC0, 0x119D, 0x6BC5, 0x063D,

+    0x6BC6, 0x14F7, 0x6BCB, 0x14F8, 0x6BCC, 0x3744, 0x6BCD, 0x0E3C,

+    0x6BCE, 0x0E96, 0x6BCF, 0x344C, 0x6BD2, 0x0C9F, 0x6BD3, 0x14F9,

+    0x6BD4, 0x0D7A, 0x6BD6, 0x213D, 0x6BD8, 0x0D8F, 0x6BDB, 0x0EDF,

+    0x6BDF, 0x14FA, 0x6BE1, 0x395D, 0x6BEB, 0x14FC, 0x6BEC, 0x14FB,

+    0x6BEF, 0x14FE, 0x6BF1, 0x395E, 0x6BF3, 0x14FD, 0x6C08, 0x1500,

+    0x6C0F, 0x08AF, 0x6C10, 0x395F, 0x6C11, 0x0EBD, 0x6C13, 0x1501,

+    0x6C14, 0x1502, 0x6C17, 0x063E, 0x6C1B, 0x1503, 0x6C23, 0x1505,

+    0x6C24, 0x1504, 0x6C33, 0x3960, 0x6C34, 0x0A2B, 0x6C35, 0x3961,

+    0x6C37, 0x0DAB, 0x6C38, 0x04EC, 0x6C3A, 0x3962, 0x6C3E, 0x0D59,

+    0x6C3F, 0x213E, 0x6C40, 0x0C11, 0x6C41, 0x094B, 0x6C42, 0x067B,

+    0x6C4E, 0x0D5A, 0x6C50, 0x08DA, 0x6C55, 0x1507, 0x6C57, 0x05FC,

+    0x6C59, 0x3963, 0x6C5A, 0x051A, 0x6C5C, 0x213F, 0x6C5D, 0x0CCA,

+    0x6C5E, 0x1506, 0x6C5F, 0x07D0, 0x6C60, 0x0B91, 0x6C62, 0x1508,

+    0x6C68, 0x1510, 0x6C6A, 0x1509, 0x6C6F, 0x2141, 0x6C70, 0x0B21,

+    0x6C72, 0x067C, 0x6C73, 0x1511, 0x6C76, 0x3964, 0x6C7A, 0x073E,

+    0x6C7B, 0x3965, 0x6C7D, 0x063F, 0x6C7E, 0x150F, 0x6C81, 0x150D,

+    0x6C82, 0x150A, 0x6C83, 0x0F4A, 0x6C85, 0x3966, 0x6C86, 0x2140,

+    0x6C88, 0x0BDC, 0x6C8C, 0x0CB1, 0x6C8D, 0x150B, 0x6C90, 0x1513,

+    0x6C92, 0x1512, 0x6C93, 0x06F9, 0x6C95, 0x3967, 0x6C96, 0x052D,

+    0x6C99, 0x082B, 0x6C9A, 0x150C, 0x6C9B, 0x150E, 0x6C9C, 0x3968,

+    0x6CA1, 0x0E85, 0x6CA2, 0x0B54, 0x6CAA, 0x3749, 0x6CAB, 0x0EA5,

+    0x6CAE, 0x151B, 0x6CB1, 0x151C, 0x6CB3, 0x054F, 0x6CB8, 0x0DF8,

+    0x6CB9, 0x0F09, 0x6CBA, 0x151E, 0x6CBB, 0x08CF, 0x6CBC, 0x09AA,

+    0x6CBD, 0x1517, 0x6CBE, 0x151D, 0x6CBF, 0x050A, 0x6CC1, 0x06AF,

+    0x6CC4, 0x1514, 0x6CC5, 0x1519, 0x6CC9, 0x0A98, 0x6CCA, 0x0D27,

+    0x6CCC, 0x0D7B, 0x6CD0, 0x3969, 0x6CD3, 0x1516, 0x6CD4, 0x396A,

+    0x6CD5, 0x0E4F, 0x6CD6, 0x396B, 0x6CD7, 0x1518, 0x6CD9, 0x1521,

+    0x6CDA, 0x2142, 0x6CDB, 0x151F, 0x6CDD, 0x151A, 0x6CE0, 0x396C,

+    0x6CE1, 0x0E50, 0x6CE2, 0x0CFE, 0x6CE3, 0x067D, 0x6CE5, 0x0C1F,

+    0x6CE8, 0x0BAB, 0x6CEA, 0x1522, 0x6CEB, 0x396D, 0x6CEC, 0x396E,

+    0x6CEE, 0x396F, 0x6CEF, 0x1520, 0x6CF0, 0x0B39, 0x6CF1, 0x1515,

+    0x6CF3, 0x04ED, 0x6D01, 0x3C35, 0x6D04, 0x2143, 0x6D0A, 0x3970,

+    0x6D0B, 0x0F38, 0x6D0C, 0x152D, 0x6D0E, 0x3971, 0x6D11, 0x3972,

+    0x6D12, 0x152C, 0x6D17, 0x0A9A, 0x6D19, 0x1529, 0x6D1B, 0x0F56,

+    0x6D1E, 0x0C8E, 0x6D1F, 0x1523, 0x6D25, 0x0BE1, 0x6D29, 0x04EE,

+    0x6D2A, 0x07D1, 0x6D2B, 0x1526, 0x6D2E, 0x3973, 0x6D32, 0x0931,

+    0x6D33, 0x152B, 0x6D35, 0x152A, 0x6D36, 0x1525, 0x6D38, 0x1528,

+    0x6D3B, 0x05C6, 0x6D3D, 0x1527, 0x6D3E, 0x0CFF, 0x6D41, 0x0F76,

+    0x6D44, 0x09DC, 0x6D45, 0x0A99, 0x6D57, 0x3974, 0x6D59, 0x1533,

+    0x6D5A, 0x1531, 0x6D5C, 0x0DBF, 0x6D5E, 0x3975, 0x6D63, 0x152E,

+    0x6D64, 0x1530, 0x6D65, 0x3976, 0x6D66, 0x04DC, 0x6D69, 0x07D2,

+    0x6D6A, 0x0FD8, 0x6D6C, 0x059B, 0x6D6E, 0x0DD4, 0x6D6F, 0x2145,

+    0x6D74, 0x0F4B, 0x6D77, 0x0582, 0x6D78, 0x0A01, 0x6D79, 0x1532,

+    0x6D82, 0x3977, 0x6D85, 0x1537, 0x6D87, 0x2144, 0x6D88, 0x09AB,

+    0x6D89, 0x342A, 0x6D8C, 0x0F1A, 0x6D8E, 0x1534, 0x6D93, 0x152F,

+    0x6D95, 0x1535, 0x6D96, 0x2146, 0x6D99, 0x0FA6, 0x6D9B, 0x0C6D,

+    0x6D9C, 0x0C9A, 0x6DAC, 0x2147, 0x6DAF, 0x0594, 0x6DB2, 0x04F7,

+    0x6DB5, 0x153B, 0x6DB8, 0x153E, 0x6DBC, 0x0F8B, 0x6DBF, 0x3978,

+    0x6DC0, 0x0F4E, 0x6DC4, 0x3979, 0x6DC5, 0x1545, 0x6DC6, 0x153F,

+    0x6DC7, 0x153C, 0x6DCA, 0x397A, 0x6DCB, 0x0F9C, 0x6DCC, 0x1542,

+    0x6DCF, 0x2148, 0x6DD0, 0x3C36, 0x6DD1, 0x0954, 0x6DD2, 0x1544,

+    0x6DD5, 0x1549, 0x6DD6, 0x397B, 0x6DD8, 0x0C6B, 0x6DD9, 0x1547,

+    0x6DDA, 0x3453, 0x6DDE, 0x1541, 0x6DE1, 0x0B76, 0x6DE4, 0x1548,

+    0x6DE6, 0x153D, 0x6DE8, 0x1543, 0x6DE9, 0x397C, 0x6DEA, 0x154A,

+    0x6DEB, 0x04C0, 0x6DEC, 0x1540, 0x6DEE, 0x154B, 0x6DF1, 0x0A02,

+    0x6DF2, 0x214A, 0x6DF3, 0x0969, 0x6DF5, 0x0DF5, 0x6DF7, 0x081E,

+    0x6DF8, 0x2149, 0x6DF9, 0x1538, 0x6DFA, 0x1546, 0x6DFB, 0x0C34,

+    0x6DFC, 0x214B, 0x6E05, 0x0A5A, 0x6E07, 0x05C7, 0x6E08, 0x0841,

+    0x6E09, 0x09AC, 0x6E0A, 0x153A, 0x6E0B, 0x094C, 0x6E13, 0x0722,

+    0x6E15, 0x1539, 0x6E17, 0x3746, 0x6E19, 0x154F, 0x6E1A, 0x0977,

+    0x6E1B, 0x076E, 0x6E1D, 0x155E, 0x6E1F, 0x1558, 0x6E20, 0x068E,

+    0x6E21, 0x0C49, 0x6E22, 0x397D, 0x6E23, 0x1553, 0x6E24, 0x155C,

+    0x6E25, 0x0473, 0x6E26, 0x04D4, 0x6E27, 0x214E, 0x6E29, 0x0539,

+    0x6E2B, 0x1555, 0x6E2C, 0x0B0C, 0x6E2D, 0x154C, 0x6E2E, 0x154E,

+    0x6E2F, 0x07D3, 0x6E34, 0x3412, 0x6E38, 0x155F, 0x6E39, 0x214C,

+    0x6E3A, 0x155A, 0x6E3C, 0x214F, 0x6E3E, 0x1552, 0x6E42, 0x3C37,

+    0x6E43, 0x1559, 0x6E4A, 0x0EB7, 0x6E4D, 0x1557, 0x6E4E, 0x155B,

+    0x6E51, 0x397E, 0x6E56, 0x0784, 0x6E58, 0x09AD, 0x6E5B, 0x0B77,

+    0x6E5C, 0x214D, 0x6E5F, 0x1551, 0x6E67, 0x0F19, 0x6E6B, 0x1554,

+    0x6E6E, 0x154D, 0x6E6F, 0x0C6C, 0x6E72, 0x1550, 0x6E76, 0x1556,

+    0x6E7E, 0x0FF7, 0x6E7F, 0x08EA, 0x6E80, 0x0EAC, 0x6E82, 0x1560,

+    0x6E8C, 0x0D42, 0x6E8F, 0x156C, 0x6E90, 0x076F, 0x6E96, 0x096A,

+    0x6E98, 0x1562, 0x6E9C, 0x0F77, 0x6E9D, 0x07D4, 0x6E9F, 0x156F,

+    0x6EA2, 0x04B2, 0x6EA5, 0x156D, 0x6EAA, 0x1561, 0x6EAB, 0x340C,

+    0x6EAF, 0x1567, 0x6EB2, 0x1569, 0x6EB6, 0x0F39, 0x6EB7, 0x1564,

+    0x6EBA, 0x0C28, 0x6EBD, 0x1566, 0x6EBF, 0x2150, 0x6EC2, 0x156E,

+    0x6EC4, 0x1568, 0x6EC5, 0x0ED3, 0x6EC7, 0x397F, 0x6EC9, 0x1563,

+    0x6ECA, 0x3980, 0x6ECB, 0x08CE, 0x6ECC, 0x157B, 0x6ECE, 0x3981,

+    0x6ED1, 0x05C8, 0x6ED3, 0x1565, 0x6ED4, 0x156A, 0x6ED5, 0x156B,

+    0x6ED9, 0x3C38, 0x6EDD, 0x0B4C, 0x6EDE, 0x0B3A, 0x6EE6, 0x3C24,

+    0x6EEC, 0x1573, 0x6EEF, 0x1579, 0x6EF2, 0x1577, 0x6EF4, 0x0C23,

+    0x6EF7, 0x157E, 0x6EF8, 0x1574, 0x6EFD, 0x3982, 0x6EFE, 0x1575,

+    0x6EFF, 0x155D, 0x6F01, 0x0693, 0x6F02, 0x0DAC, 0x6F06, 0x08EB,

+    0x6F09, 0x0809, 0x6F0F, 0x0FD9, 0x6F11, 0x1571, 0x6F13, 0x157D,

+    0x6F14, 0x050B, 0x6F15, 0x0AE8, 0x6F1A, 0x3983, 0x6F20, 0x0D2F,

+    0x6F22, 0x05FD, 0x6F23, 0x0FC2, 0x6F2A, 0x3984, 0x6F2B, 0x0EAD,

+    0x6F2C, 0x0BEE, 0x6F2F, 0x3985, 0x6F31, 0x1578, 0x6F32, 0x157A,

+    0x6F33, 0x3986, 0x6F38, 0x0AB4, 0x6F3E, 0x157C, 0x6F3F, 0x1576,

+    0x6F41, 0x1570, 0x6F45, 0x05FF, 0x6F51, 0x1E60, 0x6F54, 0x073F,

+    0x6F58, 0x158A, 0x6F5A, 0x3987, 0x6F5B, 0x1585, 0x6F5C, 0x0A9C,

+    0x6F5E, 0x3988, 0x6F5F, 0x05C1, 0x6F62, 0x3989, 0x6F64, 0x096B,

+    0x6F66, 0x158E, 0x6F6D, 0x1587, 0x6F6E, 0x0BC8, 0x6F6F, 0x1584,

+    0x6F70, 0x0BF5, 0x6F74, 0x15A7, 0x6F78, 0x1581, 0x6F7A, 0x1580,

+    0x6F7C, 0x1589, 0x6F7D, 0x398A, 0x6F80, 0x1583, 0x6F81, 0x1582,

+    0x6F82, 0x1588, 0x6F84, 0x0A45, 0x6F86, 0x157F, 0x6F88, 0x2151,

+    0x6F8B, 0x398B, 0x6F8D, 0x398C, 0x6F8E, 0x158B, 0x6F91, 0x158C,

+    0x6F92, 0x398D, 0x6F94, 0x398E, 0x6F97, 0x05FE, 0x6F98, 0x363C,

+    0x6F9A, 0x398F, 0x6FA1, 0x1591, 0x6FA3, 0x1590, 0x6FA4, 0x1592,

+    0x6FA7, 0x3990, 0x6FA8, 0x3991, 0x6FAA, 0x1595, 0x6FB1, 0x0C3D,

+    0x6FB3, 0x158F, 0x6FB5, 0x2152, 0x6FB6, 0x3992, 0x6FB9, 0x1593,

+    0x6FC0, 0x0739, 0x6FC1, 0x0B59, 0x6FC2, 0x158D, 0x6FC3, 0x0CF1,

+    0x6FC6, 0x1594, 0x6FD4, 0x1599, 0x6FD5, 0x1597, 0x6FD8, 0x159A,

+    0x6FDA, 0x3993, 0x6FDB, 0x159D, 0x6FDE, 0x3994, 0x6FDF, 0x1596,

+    0x6FE0, 0x07FC, 0x6FE1, 0x0CDE, 0x6FE4, 0x1536, 0x6FEB, 0x0F5E,

+    0x6FEC, 0x1598, 0x6FEE, 0x159C, 0x6FEF, 0x0B55, 0x6FF1, 0x159B,

+    0x6FF3, 0x1586, 0x6FF5, 0x2153, 0x6FF6, 0x1BA4, 0x6FF9, 0x3995,

+    0x6FFA, 0x15A0, 0x6FFE, 0x15A4, 0x7001, 0x15A2, 0x7005, 0x2154,

+    0x7006, 0x1E50, 0x7007, 0x2155, 0x7009, 0x159E, 0x700B, 0x159F,

+    0x700F, 0x15A3, 0x7011, 0x15A1, 0x7015, 0x0DC0, 0x7018, 0x15A9,

+    0x701A, 0x15A6, 0x701B, 0x15A5, 0x701D, 0x15A8, 0x701E, 0x0CAC,

+    0x701F, 0x15AA, 0x7026, 0x0BB3, 0x7027, 0x0B4D, 0x7028, 0x2156,

+    0x702C, 0x0A49, 0x7030, 0x15AB, 0x7032, 0x15AD, 0x7039, 0x3996,

+    0x703C, 0x3997, 0x703E, 0x15AC, 0x704A, 0x3998, 0x704C, 0x1572,

+    0x7051, 0x15AE, 0x7054, 0x3999, 0x7058, 0x0CBF, 0x705D, 0x399A,

+    0x705E, 0x399B, 0x7063, 0x15AF, 0x7064, 0x399C, 0x706B, 0x0550,

+    0x706C, 0x399D, 0x706F, 0x0C6E, 0x7070, 0x0583, 0x7078, 0x067E,

+    0x707C, 0x090A, 0x707D, 0x0842, 0x707E, 0x399E, 0x7081, 0x399F,

+    0x7085, 0x2157, 0x7089, 0x0FCD, 0x708A, 0x0A2C, 0x708E, 0x050C,

+    0x7092, 0x15B1, 0x7095, 0x39A0, 0x7099, 0x15B0, 0x70AB, 0x2158,

+    0x70AC, 0x15B4, 0x70AD, 0x0B78, 0x70AE, 0x15B7, 0x70AF, 0x15B2,

+    0x70B3, 0x15B6, 0x70B7, 0x39A1, 0x70B8, 0x15B5, 0x70B9, 0x0C3A,

+    0x70BA, 0x049D, 0x70BB, 0x20AD, 0x70C8, 0x0FBD, 0x70CB, 0x15B9,

+    0x70CF, 0x04CA, 0x70D3, 0x39A2, 0x70D4, 0x39A3, 0x70D8, 0x39A4,

+    0x70D9, 0x15BB, 0x70DC, 0x39A5, 0x70DD, 0x15BA, 0x70DF, 0x15B8,

+    0x70F1, 0x15B3, 0x70F9, 0x0E51, 0x70FD, 0x15BD, 0x7104, 0x215A,

+    0x7107, 0x39A6, 0x7109, 0x15BC, 0x710F, 0x2159, 0x7114, 0x050D,

+    0x7119, 0x15BF, 0x711A, 0x0E02, 0x711C, 0x15BE, 0x7120, 0x39A7,

+    0x7121, 0x0EC1, 0x7126, 0x09AF, 0x7130, 0x1DDC, 0x7131, 0x39A8,

+    0x7136, 0x0AB5, 0x713C, 0x09AE, 0x7146, 0x215C, 0x7147, 0x215D,

+    0x7149, 0x0FC3, 0x714A, 0x39A9, 0x714C, 0x15C5, 0x714E, 0x0A9D,

+    0x7152, 0x39AA, 0x7155, 0x15C1, 0x7156, 0x15C6, 0x7159, 0x050E,

+    0x715C, 0x215B, 0x7160, 0x39AB, 0x7162, 0x15C4, 0x7164, 0x0D17,

+    0x7165, 0x15C0, 0x7166, 0x15C3, 0x7167, 0x09B0, 0x7169, 0x0D65,

+    0x716C, 0x15C7, 0x716E, 0x08FD, 0x7179, 0x39AC, 0x717D, 0x0A9E,

+    0x7184, 0x15CA, 0x7188, 0x15C2, 0x718A, 0x06FD, 0x718F, 0x15C8,

+    0x7192, 0x39AD, 0x7194, 0x0F3A, 0x7195, 0x15CB, 0x7199, 0x205D,

+    0x719F, 0x0959, 0x71A8, 0x15CC, 0x71AC, 0x15CD, 0x71B1, 0x0CE4,

+    0x71B3, 0x39AE, 0x71B9, 0x15CF, 0x71BE, 0x15D0, 0x71C1, 0x215F,

+    0x71C3, 0x0CE9, 0x71C8, 0x0C6F, 0x71C9, 0x15D2, 0x71CB, 0x39AF,

+    0x71CE, 0x15D4, 0x71D0, 0x0F9D, 0x71D2, 0x15D1, 0x71D3, 0x39B0,

+    0x71D4, 0x15D3, 0x71D5, 0x050F, 0x71D6, 0x39B1, 0x71D7, 0x15CE,

+    0x71DF, 0x114E, 0x71E0, 0x15D5, 0x71E5, 0x0AE9, 0x71E6, 0x0886,

+    0x71E7, 0x15D7, 0x71EC, 0x15D6, 0x71ED, 0x09EA, 0x71EE, 0x10EE,

+    0x71F5, 0x15D8, 0x71F9, 0x15DA, 0x71FB, 0x15C9, 0x71FC, 0x15D9,

+    0x71FE, 0x2160, 0x71FF, 0x15DB, 0x7200, 0x39B2, 0x7206, 0x0D30,

+    0x720D, 0x15DC, 0x7210, 0x15DD, 0x721B, 0x15DE, 0x721D, 0x39B3,

+    0x7228, 0x15DF, 0x722A, 0x0BFA, 0x722B, 0x39B4, 0x722C, 0x15E1,

+    0x722D, 0x15E0, 0x7230, 0x15E2, 0x7232, 0x15E3, 0x7235, 0x090B,

+    0x7236, 0x0DD5, 0x7238, 0x39B5, 0x723A, 0x0EF8, 0x723B, 0x15E4,

+    0x723C, 0x15E5, 0x723D, 0x0AD8, 0x723E, 0x08D0, 0x723F, 0x15E6,

+    0x7240, 0x15E7, 0x7241, 0x39B6, 0x7246, 0x15E8, 0x7247, 0x0E22,

+    0x7248, 0x0D5B, 0x724B, 0x15E9, 0x724C, 0x0D0D, 0x7252, 0x0BC9,

+    0x7253, 0x39B7, 0x7255, 0x39B8, 0x7256, 0x39B9, 0x7258, 0x15EA,

+    0x7259, 0x0567, 0x725B, 0x0687, 0x725C, 0x39BA, 0x725D, 0x0ED2,

+    0x725F, 0x0EC2, 0x7261, 0x0534, 0x7262, 0x0FDA, 0x7267, 0x0E80,

+    0x7269, 0x0DFA, 0x7272, 0x0A5B, 0x7274, 0x15EB, 0x7279, 0x0C9B,

+    0x727D, 0x0757, 0x727E, 0x15EC, 0x7280, 0x0844, 0x7281, 0x15EE,

+    0x7282, 0x15ED, 0x7287, 0x15EF, 0x728D, 0x39BB, 0x7292, 0x15F0,

+    0x7296, 0x15F1, 0x72A0, 0x0658, 0x72A2, 0x15F2, 0x72A7, 0x15F3,

+    0x72AC, 0x0758, 0x72AD, 0x39BC, 0x72AF, 0x0D5C, 0x72B1, 0x2161,

+    0x72B2, 0x15F5, 0x72B4, 0x39BD, 0x72B6, 0x09DD, 0x72B9, 0x15F4,

+    0x72BE, 0x2162, 0x72C0, 0x342B, 0x72C2, 0x06B0, 0x72C3, 0x15F6,

+    0x72C4, 0x15F8, 0x72C6, 0x15F7, 0x72C7, 0x39BE, 0x72CE, 0x15F9,

+    0x72D0, 0x0785, 0x72D2, 0x15FA, 0x72D7, 0x06E1, 0x72D9, 0x0AC2,

+    0x72DB, 0x080F, 0x72E0, 0x15FC, 0x72E1, 0x15FD, 0x72E2, 0x15FB,

+    0x72E9, 0x0919, 0x72EC, 0x0CA0, 0x72ED, 0x06B1, 0x72F7, 0x15FF,

+    0x72F8, 0x0B6A, 0x72F9, 0x15FE, 0x72FB, 0x39BF, 0x72FC, 0x0FDB,

+    0x72FD, 0x0D18, 0x7304, 0x39C0, 0x7305, 0x39C1, 0x730A, 0x1602,

+    0x7316, 0x1604, 0x7317, 0x1601, 0x731B, 0x0EE0, 0x731C, 0x1603,

+    0x731D, 0x1605, 0x731F, 0x0F8C, 0x7324, 0x2163, 0x7325, 0x1609,

+    0x7328, 0x39C2, 0x7329, 0x1608, 0x732A, 0x0BB4, 0x732B, 0x0CE3,

+    0x732E, 0x0759, 0x732F, 0x1607, 0x7331, 0x39C3, 0x7334, 0x1606,

+    0x7336, 0x0F1B, 0x7337, 0x0F1C, 0x733E, 0x160A, 0x733F, 0x0510,

+    0x7343, 0x39C4, 0x7344, 0x0808, 0x7345, 0x08B0, 0x734E, 0x160B,

+    0x734F, 0x160C, 0x7357, 0x160E, 0x7363, 0x094D, 0x7368, 0x1610,

+    0x736A, 0x160F, 0x736C, 0x39C5, 0x7370, 0x1611, 0x7372, 0x05AB,

+    0x7375, 0x1613, 0x7377, 0x2165, 0x7378, 0x1612, 0x737A, 0x1615,

+    0x737B, 0x1614, 0x737C, 0x39C6, 0x7383, 0x39C7, 0x7384, 0x0770,

+    0x7385, 0x39C8, 0x7386, 0x39C9, 0x7387, 0x0F70, 0x7389, 0x06C4,

+    0x738B, 0x0526, 0x7395, 0x39CA, 0x7396, 0x06E2, 0x739E, 0x39CB,

+    0x739F, 0x39CC, 0x73A0, 0x39CD, 0x73A6, 0x39CE, 0x73A8, 0x3C3F,

+    0x73A9, 0x061D, 0x73AB, 0x39CF, 0x73B2, 0x0FB0, 0x73B3, 0x1617,

+    0x73B5, 0x39D0, 0x73B7, 0x39D1, 0x73BA, 0x35EA, 0x73BB, 0x1619,

+    0x73BC, 0x39D2, 0x73BD, 0x2166, 0x73C0, 0x161A, 0x73C2, 0x0551,

+    0x73C8, 0x1616, 0x73C9, 0x2167, 0x73CA, 0x0887, 0x73CD, 0x0BDD,

+    0x73CE, 0x1618, 0x73CF, 0x39D3, 0x73D2, 0x216A, 0x73D6, 0x2168,

+    0x73D9, 0x39D4, 0x73DE, 0x161D, 0x73E0, 0x091A, 0x73E3, 0x2169,

+    0x73E4, 0x3C39, 0x73E5, 0x161B, 0x73E9, 0x39D5, 0x73EA, 0x0714,

+    0x73ED, 0x0D5D, 0x73EE, 0x161C, 0x73F1, 0x1637, 0x73F4, 0x39D6,

+    0x73F5, 0x216C, 0x73F8, 0x1622, 0x73FD, 0x39D7, 0x73FE, 0x0771,

+    0x7403, 0x067F, 0x7404, 0x39D8, 0x7405, 0x161F, 0x7406, 0x0F67,

+    0x7407, 0x216B, 0x7409, 0x0F78, 0x740A, 0x39D9, 0x741A, 0x39DA,

+    0x741B, 0x39DB, 0x7421, 0x3C3A, 0x7422, 0x0B56, 0x7424, 0x39DC,

+    0x7425, 0x1621, 0x7426, 0x216D, 0x7428, 0x39DD, 0x7429, 0x216F,

+    0x742A, 0x216E, 0x742C, 0x39DE, 0x742E, 0x2170, 0x742F, 0x39DF,

+    0x7430, 0x39E0, 0x7431, 0x39E1, 0x7432, 0x1623, 0x7433, 0x0F9E,

+    0x7434, 0x06CF, 0x7435, 0x0D90, 0x7436, 0x0D00, 0x7439, 0x39E2,

+    0x743A, 0x1624, 0x743F, 0x1626, 0x7441, 0x1629, 0x7444, 0x39E3,

+    0x7447, 0x39E4, 0x744B, 0x39E5, 0x744D, 0x39E6, 0x7451, 0x39E7,

+    0x7455, 0x1625, 0x7457, 0x39E8, 0x7459, 0x1628, 0x745A, 0x079E,

+    0x745B, 0x04EF, 0x745C, 0x162A, 0x745E, 0x0A36, 0x745F, 0x1627,

+    0x7460, 0x0FA4, 0x7462, 0x2171, 0x7463, 0x162D, 0x7464, 0x1D35,

+    0x7466, 0x39E9, 0x7469, 0x162B, 0x746A, 0x162E, 0x746B, 0x39EA,

+    0x746F, 0x1620, 0x7470, 0x162C, 0x7471, 0x39EB, 0x7473, 0x082C,

+    0x7476, 0x162F, 0x747E, 0x1630, 0x7480, 0x39EC, 0x7483, 0x0F68,

+    0x7485, 0x39ED, 0x7486, 0x39EE, 0x7487, 0x39EF, 0x7489, 0x2172,

+    0x748B, 0x1631, 0x7490, 0x39F0, 0x7498, 0x39F1, 0x749C, 0x39F2,

+    0x749E, 0x1632, 0x749F, 0x2173, 0x74A0, 0x39F3, 0x74A2, 0x161E,

+    0x74A3, 0x39F4, 0x74A7, 0x1633, 0x74A8, 0x39F5, 0x74AB, 0x39F6,

+    0x74B0, 0x0600, 0x74B5, 0x39F7, 0x74BD, 0x08D1, 0x74BF, 0x39F8,

+    0x74C8, 0x39F9, 0x74CA, 0x1634, 0x74CF, 0x1635, 0x74D4, 0x1636,

+    0x74DA, 0x39FA, 0x74DC, 0x04DD, 0x74DE, 0x39FB, 0x74E0, 0x1638,

+    0x74E2, 0x0DAD, 0x74E3, 0x1639, 0x74E6, 0x05E0, 0x74E7, 0x163A,

+    0x74E9, 0x163B, 0x74EE, 0x163C, 0x74EF, 0x3750, 0x74F0, 0x163E,

+    0x74F1, 0x163F, 0x74F2, 0x163D, 0x74F6, 0x0DC5, 0x74F7, 0x1641,

+    0x74F8, 0x1640, 0x7501, 0x2174, 0x7503, 0x1643, 0x7504, 0x1642,

+    0x7505, 0x1644, 0x750C, 0x1645, 0x750D, 0x1647, 0x750E, 0x1646,

+    0x7511, 0x080B, 0x7513, 0x1649, 0x7515, 0x1648, 0x7518, 0x0601,

+    0x751A, 0x0A19, 0x751C, 0x0C36, 0x751E, 0x164A, 0x751F, 0x0A5C,

+    0x7522, 0x35DE, 0x7523, 0x0888, 0x7525, 0x051B, 0x7526, 0x164B,

+    0x7528, 0x0F3B, 0x752B, 0x0E33, 0x752C, 0x164C, 0x752F, 0x20F2,

+    0x7530, 0x0C3E, 0x7531, 0x0F1D, 0x7532, 0x07D5, 0x7533, 0x0A03,

+    0x7537, 0x0B89, 0x7538, 0x10C9, 0x753A, 0x0BCA, 0x753B, 0x0568,

+    0x753C, 0x164D, 0x7544, 0x164E, 0x7546, 0x1653, 0x7549, 0x1651,

+    0x754A, 0x1650, 0x754B, 0x13C7, 0x754C, 0x0584, 0x754D, 0x164F,

+    0x754E, 0x39FC, 0x754F, 0x049E, 0x7551, 0x0D3E, 0x7554, 0x0D5E,

+    0x7559, 0x0F79, 0x755A, 0x1654, 0x755B, 0x1652, 0x755C, 0x0B9A,

+    0x755D, 0x0A4A, 0x7560, 0x0D3F, 0x7562, 0x0D9F, 0x7564, 0x1656,

+    0x7565, 0x0F74, 0x7566, 0x0723, 0x7567, 0x1657, 0x7569, 0x1655,

+    0x756A, 0x0D6A, 0x756B, 0x1658, 0x756C, 0x3C3B, 0x756D, 0x1659,

+    0x756F, 0x2175, 0x7570, 0x049F, 0x7573, 0x09DE, 0x7574, 0x165E,

+    0x7575, 0x3751, 0x7576, 0x165B, 0x7577, 0x0CC5, 0x7578, 0x165A,

+    0x7579, 0x39FD, 0x757F, 0x0640, 0x7581, 0x39FE, 0x7582, 0x1661,

+    0x7586, 0x165C, 0x7587, 0x165D, 0x7589, 0x1660, 0x758A, 0x165F,

+    0x758B, 0x0D97, 0x758E, 0x0AC4, 0x758F, 0x0AC3, 0x7590, 0x39FF,

+    0x7591, 0x0659, 0x7592, 0x3A00, 0x7593, 0x3A01, 0x7594, 0x1662,

+    0x759A, 0x1663, 0x759D, 0x1664, 0x75A3, 0x1666, 0x75A5, 0x1665,

+    0x75AB, 0x04F8, 0x75B1, 0x166E, 0x75B2, 0x0D7C, 0x75B3, 0x1668,

+    0x75B4, 0x3A02, 0x75B5, 0x166A, 0x75B8, 0x166C, 0x75B9, 0x0A04,

+    0x75BC, 0x166D, 0x75BD, 0x166B, 0x75BE, 0x08EC, 0x75C2, 0x1667,

+    0x75C3, 0x1669, 0x75C5, 0x0DB4, 0x75C7, 0x09B1, 0x75CA, 0x1670,

+    0x75CD, 0x166F, 0x75D2, 0x1671, 0x75D4, 0x08D2, 0x75D5, 0x081F,

+    0x75D8, 0x0C71, 0x75D9, 0x1672, 0x75DB, 0x0BE7, 0x75DE, 0x1674,

+    0x75E2, 0x0F69, 0x75E3, 0x1673, 0x75E4, 0x3A03, 0x75E9, 0x0AEB,

+    0x75EC, 0x3752, 0x75F0, 0x1679, 0x75F2, 0x167B, 0x75F3, 0x167C,

+    0x75F4, 0x0B92, 0x75F9, 0x3A04, 0x75FA, 0x167A, 0x75FC, 0x1677,

+    0x75FE, 0x1675, 0x75FF, 0x1676, 0x7600, 0x3A05, 0x7601, 0x1678,

+    0x7609, 0x167F, 0x760A, 0x3A06, 0x760B, 0x167D, 0x760D, 0x167E,

+    0x7615, 0x3A07, 0x7616, 0x3A08, 0x7619, 0x3A09, 0x761E, 0x3A0A,

+    0x761F, 0x1680, 0x7620, 0x1682, 0x7621, 0x1683, 0x7622, 0x1684,

+    0x7624, 0x1685, 0x7626, 0x1E2D, 0x7627, 0x1681, 0x762D, 0x3A0B,

+    0x7630, 0x1687, 0x7634, 0x1686, 0x7635, 0x3A0C, 0x763B, 0x1688,

+    0x7642, 0x0F8D, 0x7643, 0x3A0D, 0x7646, 0x168B, 0x7647, 0x1689,

+    0x7648, 0x168A, 0x764B, 0x3A0E, 0x764C, 0x061E, 0x764E, 0x3753,

+    0x7652, 0x0F0A, 0x7656, 0x0E1A, 0x7658, 0x168D, 0x765C, 0x168C,

+    0x7661, 0x168E, 0x7662, 0x168F, 0x7665, 0x3A0F, 0x7667, 0x1693,

+    0x7668, 0x1690, 0x7669, 0x1691, 0x766A, 0x1692, 0x766C, 0x1694,

+    0x766D, 0x3A10, 0x766F, 0x3A11, 0x7670, 0x1695, 0x7671, 0x3A12,

+    0x7672, 0x1696, 0x7674, 0x3A13, 0x7676, 0x1697, 0x7678, 0x1698,

+    0x767A, 0x0D43, 0x767B, 0x0C4A, 0x767C, 0x1699, 0x767D, 0x0D28,

+    0x767E, 0x0DA6, 0x7680, 0x169A, 0x7682, 0x2176, 0x7683, 0x169B,

+    0x7684, 0x0C24, 0x7686, 0x0585, 0x7687, 0x07D6, 0x7688, 0x169C,

+    0x768B, 0x169D, 0x768E, 0x169E, 0x7690, 0x0877, 0x7693, 0x16A0,

+    0x7696, 0x169F, 0x7699, 0x16A1, 0x769A, 0x16A2, 0x769B, 0x2179,

+    0x769C, 0x2177, 0x769E, 0x2178, 0x76A4, 0x3A14, 0x76A5, 0x3A15,

+    0x76A6, 0x217A, 0x76AE, 0x0D7D, 0x76B0, 0x16A3, 0x76B4, 0x16A4,

+    0x76B7, 0x1D1C, 0x76B8, 0x16A5, 0x76B9, 0x16A6, 0x76BA, 0x16A7,

+    0x76BF, 0x087C, 0x76C2, 0x16A8, 0x76C3, 0x0D0C, 0x76C5, 0x3A16,

+    0x76C6, 0x0E8D, 0x76C8, 0x04F0, 0x76CA, 0x04F9, 0x76CC, 0x3A17,

+    0x76CD, 0x16A9, 0x76D2, 0x16AB, 0x76D6, 0x16AA, 0x76D7, 0x0C6A,

+    0x76DB, 0x0A5D, 0x76DC, 0x14D8, 0x76DE, 0x16AC, 0x76DF, 0x0ECD,

+    0x76E1, 0x16AD, 0x76E3, 0x0602, 0x76E4, 0x0D6B, 0x76E5, 0x16AE,

+    0x76E7, 0x16AF, 0x76EA, 0x16B0, 0x76EC, 0x3A18, 0x76EE, 0x0EE8,

+    0x76F2, 0x0EE1, 0x76F4, 0x0BDA, 0x76F8, 0x0AEC, 0x76FB, 0x16B2,

+    0x76FC, 0x3A19, 0x76FE, 0x096C, 0x7701, 0x09B2, 0x7704, 0x16B5,

+    0x7707, 0x16B4, 0x7708, 0x16B3, 0x7709, 0x0D91, 0x770B, 0x0603,

+    0x770C, 0x075D, 0x771B, 0x16BB, 0x771E, 0x16B8, 0x771F, 0x0A05,

+    0x7720, 0x0EBE, 0x7724, 0x16B7, 0x7725, 0x16B9, 0x7726, 0x16BA,

+    0x7729, 0x16B6, 0x7734, 0x3A1A, 0x7736, 0x3A1B, 0x7737, 0x16BC,

+    0x7738, 0x16BD, 0x773A, 0x0BCB, 0x773C, 0x061F, 0x7740, 0x0BA3,

+    0x7746, 0x217C, 0x7747, 0x16BE, 0x775A, 0x16BF, 0x775B, 0x16C2,

+    0x775C, 0x3A1C, 0x775F, 0x3A1D, 0x7760, 0x3A1E, 0x7761, 0x0A2D,

+    0x7762, 0x1EC5, 0x7763, 0x0C9C, 0x7765, 0x16C3, 0x7766, 0x0E81,

+    0x7768, 0x16C0, 0x776A, 0x3755, 0x776B, 0x16C1, 0x7772, 0x3A1F,

+    0x7779, 0x16C6, 0x777D, 0x3A20, 0x777E, 0x16C5, 0x777F, 0x16C4,

+    0x778B, 0x16C8, 0x778E, 0x16C7, 0x7791, 0x16C9, 0x7795, 0x3A21,

+    0x779E, 0x16CB, 0x77A0, 0x16CA, 0x77A5, 0x0E1D, 0x77A9, 0x3756,

+    0x77AA, 0x3A22, 0x77AC, 0x0960, 0x77AD, 0x0F8E, 0x77B0, 0x16CC,

+    0x77B3, 0x0C8F, 0x77B6, 0x16CD, 0x77B9, 0x16CE, 0x77BB, 0x16D2,

+    0x77BC, 0x16D0, 0x77BD, 0x16D1, 0x77BF, 0x16CF, 0x77C7, 0x16D3,

+    0x77CD, 0x16D4, 0x77D7, 0x16D5, 0x77DA, 0x16D6, 0x77DB, 0x0EC3,

+    0x77DC, 0x16D7, 0x77E2, 0x0EFC, 0x77E3, 0x16D8, 0x77E5, 0x0B8C,

+    0x77E6, 0x3A23, 0x77E7, 0x0D20, 0x77E9, 0x06E3, 0x77ED, 0x0B79,

+    0x77EE, 0x16D9, 0x77EF, 0x06B2, 0x77F0, 0x3A24, 0x77F3, 0x0A74,

+    0x77F4, 0x3A25, 0x77FC, 0x16DA, 0x7802, 0x082D, 0x7806, 0x3A26,

+    0x780C, 0x16DB, 0x7812, 0x16DC, 0x7814, 0x075A, 0x7815, 0x0845,

+    0x7820, 0x16DE, 0x7821, 0x217E, 0x7822, 0x3A27, 0x7825, 0x0C50,

+    0x7826, 0x0846, 0x7827, 0x0668, 0x782D, 0x3A28, 0x782E, 0x3A29,

+    0x7830, 0x3A2A, 0x7832, 0x0E52, 0x7834, 0x0D01, 0x7835, 0x3A2B,

+    0x783A, 0x0C51, 0x783F, 0x07EE, 0x7845, 0x16E0, 0x784E, 0x217F,

+    0x784F, 0x341E, 0x7851, 0x3C3C, 0x785D, 0x09B3, 0x7864, 0x2180,

+    0x7868, 0x3A2C, 0x786B, 0x0F7A, 0x786C, 0x07D7, 0x786F, 0x075B,

+    0x7872, 0x0D37, 0x7874, 0x16E2, 0x787A, 0x2181, 0x787C, 0x16E4,

+    0x7881, 0x079F, 0x7886, 0x16E3, 0x7887, 0x0C12, 0x788C, 0x16E6,

+    0x788D, 0x0595, 0x788E, 0x16E1, 0x7891, 0x0D7E, 0x7893, 0x04D2,

+    0x7895, 0x085C, 0x7897, 0x0FF8, 0x789A, 0x16E5, 0x789E, 0x3A2D,

+    0x78A3, 0x16E7, 0x78A7, 0x0E1B, 0x78A9, 0x0A7D, 0x78AA, 0x16E9,

+    0x78AF, 0x16EA, 0x78B5, 0x16E8, 0x78BA, 0x05AC, 0x78BC, 0x16F0,

+    0x78BE, 0x16EF, 0x78C1, 0x08D3, 0x78C5, 0x16F1, 0x78C6, 0x16EC,

+    0x78C8, 0x3A2E, 0x78CA, 0x16F2, 0x78CB, 0x16ED, 0x78CC, 0x3A2F,

+    0x78CE, 0x3A30, 0x78D0, 0x0D6C, 0x78D1, 0x16EB, 0x78D4, 0x16EE,

+    0x78DA, 0x16F5, 0x78E0, 0x3A32, 0x78E1, 0x3A33, 0x78E4, 0x3A31,

+    0x78E7, 0x16F4, 0x78E8, 0x0E8F, 0x78EC, 0x16F3, 0x78EF, 0x04AF,

+    0x78F2, 0x3A34, 0x78F4, 0x16F7, 0x78F7, 0x3A35, 0x78FB, 0x3A36,

+    0x78FD, 0x16F6, 0x7901, 0x09B4, 0x7907, 0x16F8, 0x790E, 0x0AC5,

+    0x7911, 0x16FA, 0x7912, 0x16F9, 0x7919, 0x16FB, 0x7926, 0x16DD,

+    0x792A, 0x16DF, 0x792B, 0x16FD, 0x792C, 0x16FC, 0x7930, 0x2182,

+    0x7931, 0x3A37, 0x7934, 0x3A38, 0x793A, 0x08D4, 0x793B, 0x3A39,

+    0x793C, 0x0FB1, 0x793D, 0x3A3A, 0x793E, 0x08FE, 0x7940, 0x16FE,

+    0x7941, 0x070D, 0x7945, 0x3A3B, 0x7947, 0x065A, 0x7948, 0x0641,

+    0x7949, 0x08B1, 0x7950, 0x0F1E, 0x7953, 0x1704, 0x7955, 0x1703,

+    0x7956, 0x0AC6, 0x7957, 0x1700, 0x795A, 0x1702, 0x795B, 0x3A3C,

+    0x795C, 0x3A3D, 0x795D, 0x0955, 0x795E, 0x0A06, 0x795F, 0x1701,

+    0x7960, 0x16FF, 0x7962, 0x0CE0, 0x7965, 0x09B5, 0x7968, 0x0DAE,

+    0x796D, 0x0847, 0x7977, 0x0C72, 0x797A, 0x1705, 0x797F, 0x1706,

+    0x7980, 0x171C, 0x7981, 0x06D0, 0x7984, 0x0FE3, 0x7985, 0x0AB7,

+    0x798A, 0x1707, 0x798B, 0x3A3E, 0x798D, 0x0552, 0x798E, 0x0C13,

+    0x798F, 0x0DF1, 0x7994, 0x2186, 0x7996, 0x3A3F, 0x7998, 0x3A40,

+    0x799B, 0x2188, 0x799D, 0x1708, 0x79A6, 0x0694, 0x79A7, 0x1709,

+    0x79AA, 0x170B, 0x79AE, 0x170C, 0x79B0, 0x0CDF, 0x79B1, 0x1E4E,

+    0x79B3, 0x170D, 0x79B8, 0x3A41, 0x79B9, 0x170E, 0x79BA, 0x170F,

+    0x79BB, 0x3A42, 0x79BD, 0x06D1, 0x79BE, 0x0553, 0x79BF, 0x0C9D,

+    0x79C0, 0x0932, 0x79C1, 0x08B2, 0x79C9, 0x1710, 0x79CA, 0x3A43,

+    0x79CB, 0x0933, 0x79D1, 0x054A, 0x79D2, 0x0DB5, 0x79D5, 0x1711,

+    0x79D8, 0x0D7F, 0x79DA, 0x3A44, 0x79DF, 0x0AC7, 0x79E1, 0x1714,

+    0x79E3, 0x1715, 0x79E4, 0x0D1F, 0x79E6, 0x0A07, 0x79E7, 0x1712,

+    0x79E9, 0x0B9F, 0x79EC, 0x1713, 0x79F0, 0x09B6, 0x79FB, 0x04A0,

+    0x7A00, 0x0643, 0x7A03, 0x3A45, 0x7A05, 0x3633, 0x7A08, 0x1716,

+    0x7A09, 0x3A46, 0x7A0B, 0x0C14, 0x7A0D, 0x1717, 0x7A0E, 0x0A6B,

+    0x7A11, 0x3A47, 0x7A14, 0x0EB9, 0x7A17, 0x0D95, 0x7A18, 0x1718,

+    0x7A19, 0x1719, 0x7A1A, 0x0B93, 0x7A1C, 0x0F8F, 0x7A1E, 0x3A48,

+    0x7A1F, 0x171B, 0x7A20, 0x171A, 0x7A2D, 0x3A49, 0x7A2E, 0x091B,

+    0x7A31, 0x171D, 0x7A32, 0x04B4, 0x7A37, 0x1720, 0x7A39, 0x3A4A,

+    0x7A3B, 0x171E, 0x7A3C, 0x0554, 0x7A3D, 0x0724, 0x7A3E, 0x171F,

+    0x7A3F, 0x07D8, 0x7A40, 0x0804, 0x7A42, 0x0E36, 0x7A43, 0x1721,

+    0x7A45, 0x3A4B, 0x7A46, 0x0E82, 0x7A49, 0x1723, 0x7A4C, 0x3A4C,

+    0x7A4D, 0x0A75, 0x7A4E, 0x04F1, 0x7A4F, 0x053A, 0x7A50, 0x0470,

+    0x7A57, 0x1722, 0x7A5D, 0x3A4D, 0x7A60, 0x3A4E, 0x7A61, 0x1724,

+    0x7A62, 0x1725, 0x7A63, 0x09DF, 0x7A69, 0x1726, 0x7A6B, 0x05AD,

+    0x7A6D, 0x3A4F, 0x7A70, 0x1728, 0x7A74, 0x0740, 0x7A76, 0x0680,

+    0x7A78, 0x3A50, 0x7A79, 0x1729, 0x7A7A, 0x06ED, 0x7A7D, 0x172A,

+    0x7A7F, 0x0AA0, 0x7A81, 0x0CA5, 0x7A83, 0x0A84, 0x7A84, 0x0865,

+    0x7A88, 0x172B, 0x7A92, 0x0BA0, 0x7A93, 0x0AED, 0x7A95, 0x172D,

+    0x7A96, 0x172F, 0x7A97, 0x172C, 0x7A98, 0x172E, 0x7A9F, 0x06F8,

+    0x7AA0, 0x3A51, 0x7AA3, 0x3A52, 0x7AA9, 0x1730, 0x7AAA, 0x06FC,

+    0x7AAE, 0x0681, 0x7AAF, 0x0F3C, 0x7AB0, 0x1732, 0x7AB3, 0x3A53,

+    0x7AB6, 0x1733, 0x7ABA, 0x04D0, 0x7ABB, 0x3A54, 0x7ABC, 0x3A55,

+    0x7ABF, 0x1736, 0x7AC3, 0x05D4, 0x7AC4, 0x1735, 0x7AC5, 0x1734,

+    0x7AC6, 0x3A56, 0x7AC7, 0x1738, 0x7AC8, 0x1731, 0x7ACA, 0x1739,

+    0x7ACB, 0x0F71, 0x7ACD, 0x173A, 0x7ACF, 0x173B, 0x7AD1, 0x2189,

+    0x7AD2, 0x11C5, 0x7AD3, 0x173D, 0x7AD5, 0x173C, 0x7AD9, 0x173E,

+    0x7ADA, 0x173F, 0x7ADC, 0x0F7D, 0x7ADD, 0x1740, 0x7ADF, 0x1C08,

+    0x7AE0, 0x09B7, 0x7AE1, 0x1741, 0x7AE2, 0x1742, 0x7AE3, 0x0961,

+    0x7AE5, 0x0C90, 0x7AE6, 0x1743, 0x7AE7, 0x218A, 0x7AEA, 0x0B66,

+    0x7AEB, 0x218C, 0x7AED, 0x1744, 0x7AEF, 0x0B7A, 0x7AF0, 0x1745,

+    0x7AF6, 0x069D, 0x7AF8, 0x1076, 0x7AF9, 0x0B9B, 0x7AFA, 0x08DF,

+    0x7AFF, 0x0604, 0x7B02, 0x1746, 0x7B04, 0x1753, 0x7B06, 0x1749,

+    0x7B07, 0x3A57, 0x7B08, 0x0682, 0x7B0A, 0x1748, 0x7B0B, 0x1755,

+    0x7B0F, 0x1747, 0x7B11, 0x09B8, 0x7B14, 0x3A58, 0x7B18, 0x174B,

+    0x7B19, 0x174C, 0x7B1B, 0x0C25, 0x7B1E, 0x174D, 0x7B20, 0x05BC,

+    0x7B25, 0x0A20, 0x7B26, 0x0DD6, 0x7B27, 0x3A59, 0x7B28, 0x174F,

+    0x7B2C, 0x0B48, 0x7B31, 0x3A5A, 0x7B33, 0x174A, 0x7B35, 0x174E,

+    0x7B36, 0x1750, 0x7B39, 0x086B, 0x7B45, 0x1757, 0x7B46, 0x0DA0,

+    0x7B47, 0x3A5B, 0x7B48, 0x0D3A, 0x7B49, 0x0C73, 0x7B4B, 0x06D2,

+    0x7B4C, 0x1756, 0x7B4D, 0x1754, 0x7B4E, 0x3A5C, 0x7B4F, 0x0D49,

+    0x7B50, 0x1751, 0x7B51, 0x0B9C, 0x7B52, 0x0C75, 0x7B53, 0x375D,

+    0x7B54, 0x0C74, 0x7B56, 0x0866, 0x7B5D, 0x1769, 0x7B60, 0x3A5D,

+    0x7B65, 0x1759, 0x7B67, 0x175B, 0x7B69, 0x3A5E, 0x7B6C, 0x175E,

+    0x7B6D, 0x3A5F, 0x7B6E, 0x175F, 0x7B70, 0x175C, 0x7B71, 0x175D,

+    0x7B72, 0x3A60, 0x7B74, 0x175A, 0x7B75, 0x1758, 0x7B7A, 0x1752,

+    0x7B86, 0x0E1F, 0x7B87, 0x0555, 0x7B8B, 0x1766, 0x7B8D, 0x1763,

+    0x7B8F, 0x1768, 0x7B91, 0x3A61, 0x7B92, 0x1767, 0x7B94, 0x0D29,

+    0x7B95, 0x0EB3, 0x7B97, 0x0889, 0x7B98, 0x1761, 0x7B99, 0x176A,

+    0x7B9A, 0x1765, 0x7B9C, 0x1764, 0x7B9D, 0x1760, 0x7B9E, 0x218D,

+    0x7B9F, 0x1762, 0x7BA1, 0x0605, 0x7BAA, 0x0B7B, 0x7BAD, 0x0AA1,

+    0x7BAF, 0x3A62, 0x7BB1, 0x0D36, 0x7BB4, 0x176F, 0x7BB8, 0x0D38,

+    0x7BC0, 0x0A85, 0x7BC1, 0x176C, 0x7BC4, 0x0D63, 0x7BC6, 0x1770,

+    0x7BC7, 0x0E23, 0x7BC9, 0x0B99, 0x7BCB, 0x176B, 0x7BCC, 0x176D,

+    0x7BCF, 0x176E, 0x7BD7, 0x3A63, 0x7BD9, 0x3A64, 0x7BDD, 0x1771,

+    0x7BE0, 0x08F0, 0x7BE4, 0x0C9E, 0x7BE5, 0x1776, 0x7BE6, 0x1775,

+    0x7BE9, 0x1772, 0x7BED, 0x0FDC, 0x7BF3, 0x177B, 0x7BF6, 0x177F,

+    0x7BF7, 0x177C, 0x7C00, 0x1778, 0x7C07, 0x1779, 0x7C0B, 0x3A65,

+    0x7C0D, 0x177E, 0x7C0F, 0x3A66, 0x7C11, 0x1773, 0x7C12, 0x10EA,

+    0x7C13, 0x177A, 0x7C14, 0x1774, 0x7C17, 0x177D, 0x7C1E, 0x1E3B,

+    0x7C1F, 0x1783, 0x7C20, 0x3A67, 0x7C21, 0x0606, 0x7C23, 0x1780,

+    0x7C26, 0x3A68, 0x7C27, 0x1781, 0x7C2A, 0x1782, 0x7C2B, 0x1785,

+    0x7C31, 0x3A69, 0x7C36, 0x3A6A, 0x7C37, 0x1784, 0x7C38, 0x0D8A,

+    0x7C3D, 0x1786, 0x7C3E, 0x0FC4, 0x7C3F, 0x0E3D, 0x7C40, 0x178B,

+    0x7C43, 0x1788, 0x7C4C, 0x1787, 0x7C4D, 0x0A76, 0x7C4F, 0x178A,

+    0x7C50, 0x178C, 0x7C51, 0x3A6B, 0x7C54, 0x1789, 0x7C56, 0x1790,

+    0x7C58, 0x178D, 0x7C59, 0x3A6C, 0x7C5F, 0x178E, 0x7C60, 0x1777,

+    0x7C64, 0x178F, 0x7C65, 0x1791, 0x7C67, 0x3A6D, 0x7C6C, 0x1792,

+    0x7C6E, 0x3A6E, 0x7C70, 0x3A6F, 0x7C73, 0x0E16, 0x7C75, 0x1793,

+    0x7C7B, 0x370E, 0x7C7E, 0x0EEE, 0x7C81, 0x06C6, 0x7C82, 0x06FF,

+    0x7C83, 0x1794, 0x7C89, 0x0E04, 0x7C8B, 0x0A2E, 0x7C8D, 0x0EBC,

+    0x7C90, 0x1795, 0x7C92, 0x0F7B, 0x7C95, 0x0D2A, 0x7C97, 0x0AC8,

+    0x7C98, 0x0CEA, 0x7C9B, 0x0957, 0x7C9F, 0x0484, 0x7CA1, 0x179A,

+    0x7CA2, 0x1798, 0x7CA4, 0x1796, 0x7CA5, 0x05DD, 0x7CA7, 0x09B9,

+    0x7CA8, 0x179B, 0x7CAB, 0x1799, 0x7CAD, 0x1797, 0x7CAE, 0x179F,

+    0x7CB1, 0x179E, 0x7CB2, 0x179D, 0x7CB3, 0x179C, 0x7CB9, 0x17A0,

+    0x7CBC, 0x3A70, 0x7CBD, 0x17A1, 0x7CBE, 0x0A5E, 0x7CBF, 0x3A71,

+    0x7CC0, 0x17A2, 0x7CC2, 0x17A4, 0x7CC5, 0x17A3, 0x7CC8, 0x3A72,

+    0x7CC9, 0x3A73, 0x7CCA, 0x0786, 0x7CCE, 0x0ABA, 0x7CD2, 0x17A6,

+    0x7CD6, 0x0C76, 0x7CD7, 0x3A74, 0x7CD8, 0x17A5, 0x7CD9, 0x3A75,

+    0x7CDC, 0x17A7, 0x7CDD, 0x3A76, 0x7CDE, 0x0E05, 0x7CDF, 0x0AEE,

+    0x7CE0, 0x07D9, 0x7CE2, 0x17A8, 0x7CE7, 0x0F90, 0x7CEB, 0x3A77,

+    0x7CEF, 0x17AA, 0x7CF2, 0x17AB, 0x7CF4, 0x17AC, 0x7CF6, 0x17AD,

+    0x7CF8, 0x08B3, 0x7CFA, 0x17AE, 0x7CFB, 0x0725, 0x7CFE, 0x0684,

+    0x7D00, 0x0644, 0x7D02, 0x17B0, 0x7D04, 0x0EFF, 0x7D05, 0x07DA,

+    0x7D06, 0x17AF, 0x7D07, 0x3A78, 0x7D08, 0x3A79, 0x7D09, 0x3A7A,

+    0x7D0A, 0x17B3, 0x7D0B, 0x0EF2, 0x7D0D, 0x0CF2, 0x7D10, 0x0DA5,

+    0x7D13, 0x3A7B, 0x7D14, 0x096D, 0x7D15, 0x17B2, 0x7D17, 0x08FF,

+    0x7D18, 0x07DB, 0x7D19, 0x08B4, 0x7D1A, 0x0683, 0x7D1B, 0x0E06,

+    0x7D1C, 0x17B1, 0x7D1D, 0x3A7C, 0x7D20, 0x0AC9, 0x7D21, 0x0E70,

+    0x7D22, 0x0867, 0x7D23, 0x3A7D, 0x7D2B, 0x08B5, 0x7D2C, 0x0BF9,

+    0x7D2E, 0x17B6, 0x7D2F, 0x0FA7, 0x7D30, 0x0849, 0x7D32, 0x17B7,

+    0x7D33, 0x0A08, 0x7D35, 0x17B9, 0x7D39, 0x09BA, 0x7D3A, 0x0820,

+    0x7D3F, 0x17B8, 0x7D41, 0x3A7E, 0x7D42, 0x0934, 0x7D43, 0x0772,

+    0x7D44, 0x0ACA, 0x7D45, 0x17B4, 0x7D46, 0x17BA, 0x7D48, 0x218F,

+    0x7D4B, 0x17B5, 0x7D4C, 0x0726, 0x7D4E, 0x17BD, 0x7D4F, 0x17C1,

+    0x7D50, 0x0741, 0x7D53, 0x3A7F, 0x7D56, 0x17BC, 0x7D59, 0x3A80,

+    0x7D5B, 0x17C5, 0x7D5C, 0x2190, 0x7D5D, 0x3A81, 0x7D5E, 0x07DC,

+    0x7D61, 0x0F57, 0x7D62, 0x0480, 0x7D63, 0x17C2, 0x7D66, 0x0685,

+    0x7D68, 0x17BF, 0x7D6E, 0x17C0, 0x7D71, 0x0C77, 0x7D72, 0x17BE,

+    0x7D73, 0x17BB, 0x7D75, 0x0586, 0x7D76, 0x0A88, 0x7D79, 0x075C,

+    0x7D7A, 0x3A82, 0x7D7D, 0x17C7, 0x7D86, 0x3A83, 0x7D89, 0x17C4,

+    0x7D8B, 0x3A84, 0x7D8C, 0x3A85, 0x7D8F, 0x17C6, 0x7D93, 0x17C3,

+    0x7D99, 0x0727, 0x7D9A, 0x0B13, 0x7D9B, 0x17C8, 0x7D9C, 0x0AF0,

+    0x7D9F, 0x17D5, 0x7DA0, 0x2192, 0x7DA2, 0x17D1, 0x7DA3, 0x17CB,

+    0x7DAB, 0x17CF, 0x7DAC, 0x0926, 0x7DAD, 0x04A1, 0x7DAE, 0x17CA,

+    0x7DAF, 0x17D2, 0x7DB0, 0x17D6, 0x7DB1, 0x07DD, 0x7DB2, 0x0EE2,

+    0x7DB4, 0x0BF2, 0x7DB5, 0x17CC, 0x7DB7, 0x2191, 0x7DB8, 0x17D4,

+    0x7DBA, 0x17C9, 0x7DBB, 0x0B7C, 0x7DBD, 0x17CE, 0x7DBE, 0x0481,

+    0x7DBF, 0x0ED6, 0x7DC7, 0x17CD, 0x7DCA, 0x06D3, 0x7DCB, 0x0D80,

+    0x7DCC, 0x3A86, 0x7DCF, 0x0AEF, 0x7DD1, 0x0F98, 0x7DD2, 0x0979,

+    0x7DD5, 0x17FD, 0x7DD6, 0x2193, 0x7DD8, 0x17D7, 0x7DDA, 0x0AA2,

+    0x7DDC, 0x17D3, 0x7DDD, 0x17D8, 0x7DDE, 0x17DA, 0x7DE0, 0x0C15,

+    0x7DE1, 0x17DD, 0x7DE3, 0x340A, 0x7DE4, 0x17D9, 0x7DE8, 0x0E24,

+    0x7DE9, 0x0607, 0x7DEB, 0x3A87, 0x7DEC, 0x0ED7, 0x7DEF, 0x04A2,

+    0x7DF1, 0x3A88, 0x7DF2, 0x17DC, 0x7DF4, 0x0FC5, 0x7DF9, 0x3A89,

+    0x7DFB, 0x17DB, 0x7E01, 0x0511, 0x7E04, 0x0CC4, 0x7E05, 0x17DE,

+    0x7E08, 0x3A8A, 0x7E09, 0x17E5, 0x7E0A, 0x17DF, 0x7E0B, 0x17E6,

+    0x7E11, 0x3A8B, 0x7E12, 0x17E2, 0x7E15, 0x3A8C, 0x7E1B, 0x0D31,

+    0x7E1E, 0x08F6, 0x7E1F, 0x17E4, 0x7E20, 0x3A8D, 0x7E21, 0x17E1,

+    0x7E22, 0x17E7, 0x7E23, 0x17E0, 0x7E26, 0x094E, 0x7E2B, 0x0E53,

+    0x7E2E, 0x0956, 0x7E31, 0x17E3, 0x7E32, 0x17EF, 0x7E35, 0x17EB,

+    0x7E37, 0x17EE, 0x7E39, 0x17EC, 0x7E3A, 0x17F0, 0x7E3B, 0x17EA,

+    0x7E3D, 0x17D0, 0x7E3E, 0x0A77, 0x7E41, 0x0D5F, 0x7E43, 0x17ED,

+    0x7E46, 0x17E8, 0x7E47, 0x3A8E, 0x7E48, 0x3767, 0x7E4A, 0x0AA3,

+    0x7E4B, 0x0728, 0x7E4D, 0x0935, 0x7E52, 0x2194, 0x7E54, 0x09EB,

+    0x7E55, 0x0AB8, 0x7E56, 0x17F3, 0x7E59, 0x17F5, 0x7E5A, 0x17F6,

+    0x7E5D, 0x17F2, 0x7E5E, 0x17F4, 0x7E61, 0x1E11, 0x7E62, 0x3A8F,

+    0x7E66, 0x17E9, 0x7E67, 0x17F1, 0x7E69, 0x17F9, 0x7E6A, 0x17F8,

+    0x7E6B, 0x1DF7, 0x7E6D, 0x0EA8, 0x7E6E, 0x3A90, 0x7E70, 0x0701,

+    0x7E73, 0x3A91, 0x7E79, 0x17F7, 0x7E7B, 0x17FB, 0x7E7C, 0x17FA,

+    0x7E7D, 0x17FE, 0x7E7F, 0x1800, 0x7E82, 0x088A, 0x7E83, 0x17FC,

+    0x7E88, 0x1801, 0x7E89, 0x1802, 0x7E8A, 0x20A7, 0x7E8C, 0x1803,

+    0x7E8D, 0x3A92, 0x7E8E, 0x1809, 0x7E8F, 0x0C35, 0x7E90, 0x1805,

+    0x7E91, 0x3A93, 0x7E92, 0x1804, 0x7E93, 0x1806, 0x7E94, 0x1807,

+    0x7E96, 0x1808, 0x7E98, 0x3A94, 0x7E9B, 0x180A, 0x7E9C, 0x180B,

+    0x7F36, 0x0608, 0x7F38, 0x180C, 0x7F3A, 0x180D, 0x7F44, 0x3A95,

+    0x7F45, 0x180E, 0x7F47, 0x2195, 0x7F4C, 0x180F, 0x7F4D, 0x1810,

+    0x7F4E, 0x1811, 0x7F4F, 0x3A96, 0x7F50, 0x1812, 0x7F51, 0x1813,

+    0x7F52, 0x3A97, 0x7F53, 0x3A98, 0x7F54, 0x1815, 0x7F55, 0x1814,

+    0x7F58, 0x1816, 0x7F5F, 0x1817, 0x7F60, 0x1818, 0x7F61, 0x3A99,

+    0x7F67, 0x181B, 0x7F68, 0x1819, 0x7F69, 0x181A, 0x7F6A, 0x0851,

+    0x7F6B, 0x0729, 0x7F6E, 0x0B94, 0x7F70, 0x0D47, 0x7F72, 0x097A,

+    0x7F75, 0x0D03, 0x7F77, 0x0D81, 0x7F78, 0x181C, 0x7F79, 0x1336,

+    0x7F82, 0x181D, 0x7F83, 0x181F, 0x7F85, 0x0F4F, 0x7F86, 0x181E,

+    0x7F87, 0x1821, 0x7F88, 0x1820, 0x7F8A, 0x0F3D, 0x7F8C, 0x1822,

+    0x7F8E, 0x0D92, 0x7F91, 0x3A9A, 0x7F94, 0x1823, 0x7F9A, 0x1826,

+    0x7F9D, 0x1825, 0x7F9E, 0x1824, 0x7FA1, 0x2196, 0x7FA3, 0x1827,

+    0x7FA4, 0x0708, 0x7FA8, 0x0AA4, 0x7FA9, 0x065B, 0x7FAE, 0x182B,

+    0x7FAF, 0x1828, 0x7FB2, 0x1829, 0x7FB6, 0x182C, 0x7FB8, 0x182D,

+    0x7FB9, 0x182A, 0x7FBD, 0x04CB, 0x7FBF, 0x3A9B, 0x7FC1, 0x0527,

+    0x7FC5, 0x182F, 0x7FC6, 0x1830, 0x7FCA, 0x1831, 0x7FCC, 0x0F4C,

+    0x7FCE, 0x3A9C, 0x7FD2, 0x0936, 0x7FD4, 0x1833, 0x7FD5, 0x1832,

+    0x7FDF, 0x3A9D, 0x7FE0, 0x0A2F, 0x7FE1, 0x1834, 0x7FE5, 0x3A9E,

+    0x7FE6, 0x1835, 0x7FE9, 0x1836, 0x7FEB, 0x0621, 0x7FEC, 0x3A9F,

+    0x7FEE, 0x3AA0, 0x7FEF, 0x3AA1, 0x7FF0, 0x0609, 0x7FF3, 0x1837,

+    0x7FF9, 0x1838, 0x7FFA, 0x3AA2, 0x7FFB, 0x0E8B, 0x7FFC, 0x0F4D,

+    0x8000, 0x0F3E, 0x8001, 0x0FDD, 0x8002, 0x3713, 0x8003, 0x07DF,

+    0x8004, 0x183B, 0x8005, 0x0900, 0x8006, 0x183A, 0x800B, 0x183C,

+    0x800C, 0x08D5, 0x800E, 0x3AA3, 0x8010, 0x0B31, 0x8011, 0x3AA4,

+    0x8012, 0x183D, 0x8014, 0x3AA5, 0x8015, 0x07DE, 0x8017, 0x0EE3,

+    0x8018, 0x183E, 0x8019, 0x183F, 0x801C, 0x1840, 0x8021, 0x1841,

+    0x8024, 0x3AA6, 0x8026, 0x3AA7, 0x8028, 0x1842, 0x8033, 0x08D6,

+    0x8036, 0x0EF9, 0x803A, 0x3AA8, 0x803B, 0x1844, 0x803C, 0x3AA9,

+    0x803D, 0x0B7D, 0x803F, 0x1843, 0x8046, 0x1846, 0x804A, 0x1845,

+    0x8052, 0x1847, 0x8056, 0x0A5F, 0x8058, 0x1848, 0x805A, 0x1849,

+    0x805E, 0x0E09, 0x805F, 0x184A, 0x8060, 0x3AAA, 0x8061, 0x0AF1,

+    0x8062, 0x184B, 0x8068, 0x184C, 0x806F, 0x0FC6, 0x8070, 0x184F,

+    0x8071, 0x3AAB, 0x8072, 0x184E, 0x8073, 0x184D, 0x8074, 0x0BCC,

+    0x8075, 0x3AAC, 0x8076, 0x1850, 0x8077, 0x09EC, 0x8079, 0x1851,

+    0x807D, 0x1852, 0x807E, 0x0FDE, 0x807F, 0x1853, 0x8084, 0x1854,

+    0x8085, 0x1856, 0x8086, 0x1855, 0x8087, 0x0D39, 0x8089, 0x0CD1,

+    0x808B, 0x0FE4, 0x808C, 0x0D3D, 0x8093, 0x1858, 0x8096, 0x09BB,

+    0x8098, 0x0D9C, 0x809A, 0x1859, 0x809B, 0x1857, 0x809D, 0x060A,

+    0x809E, 0x3AAD, 0x80A1, 0x0788, 0x80A2, 0x08B6, 0x80A5, 0x0D82,

+    0x80A6, 0x3AAE, 0x80A9, 0x075E, 0x80AA, 0x0E71, 0x80AB, 0x3AAF,

+    0x80AC, 0x185C, 0x80AD, 0x185A, 0x80AF, 0x07E0, 0x80B1, 0x07E1,

+    0x80B2, 0x04AD, 0x80B4, 0x0858, 0x80BA, 0x0D0F, 0x80C3, 0x04A3,

+    0x80C4, 0x1861, 0x80C6, 0x0B7E, 0x80CC, 0x0D0E, 0x80CE, 0x0B3B,

+    0x80D6, 0x1863, 0x80D7, 0x3AB0, 0x80D8, 0x3AB1, 0x80D9, 0x185F,

+    0x80DA, 0x1862, 0x80DB, 0x185D, 0x80DD, 0x1860, 0x80DE, 0x0E54,

+    0x80E1, 0x0789, 0x80E4, 0x04C1, 0x80E5, 0x185E, 0x80EF, 0x1865,

+    0x80F1, 0x1866, 0x80F4, 0x0C91, 0x80F8, 0x06B3, 0x80FC, 0x1871,

+    0x80FD, 0x0CF3, 0x8102, 0x08B7, 0x8105, 0x06B4, 0x8106, 0x0A6C,

+    0x8107, 0x0FEC, 0x8108, 0x0EBA, 0x8109, 0x1864, 0x810A, 0x0A78,

+    0x8116, 0x3AB2, 0x8118, 0x3AB3, 0x811A, 0x066D, 0x811B, 0x1867,

+    0x8123, 0x1869, 0x8129, 0x1868, 0x812B, 0x3659, 0x812F, 0x186A,

+    0x8131, 0x0B64, 0x8133, 0x0CF4, 0x8139, 0x0BCD, 0x813A, 0x3AB4,

+    0x813E, 0x186E, 0x8141, 0x3772, 0x8146, 0x186D, 0x814A, 0x3AB5,

+    0x814B, 0x186B, 0x814C, 0x3AB6, 0x814E, 0x0A1B, 0x8150, 0x0DD7,

+    0x8151, 0x1870, 0x8153, 0x186F, 0x8154, 0x07E2, 0x8155, 0x0FF9,

+    0x815F, 0x1880, 0x8165, 0x1874, 0x8166, 0x1875, 0x816B, 0x091C,

+    0x816E, 0x1873, 0x8170, 0x080A, 0x8171, 0x1872, 0x8174, 0x1876,

+    0x8178, 0x0BCE, 0x8179, 0x0DF2, 0x817A, 0x0AA5, 0x817F, 0x0B3C,

+    0x8180, 0x187A, 0x8181, 0x3AB7, 0x8182, 0x187B, 0x8183, 0x1877,

+    0x8184, 0x3AB8, 0x8188, 0x1878, 0x818A, 0x1879, 0x818F, 0x07E3,

+    0x8193, 0x1881, 0x8195, 0x187D, 0x819A, 0x0DD8, 0x819C, 0x0E9A,

+    0x819D, 0x0D9A, 0x81A0, 0x187C, 0x81A3, 0x187F, 0x81A4, 0x187E,

+    0x81A8, 0x0E72, 0x81A9, 0x1882, 0x81B0, 0x1883, 0x81B3, 0x0AB9,

+    0x81B4, 0x3AB9, 0x81B5, 0x1884, 0x81B8, 0x1886, 0x81BA, 0x188A,

+    0x81BD, 0x1887, 0x81BE, 0x1885, 0x81BF, 0x0CF5, 0x81C0, 0x1888,

+    0x81C2, 0x1889, 0x81C6, 0x0532, 0x81C8, 0x1890, 0x81C9, 0x188B,

+    0x81CD, 0x188C, 0x81CF, 0x3ABA, 0x81D1, 0x188D, 0x81D3, 0x0B01,

+    0x81D8, 0x188F, 0x81D9, 0x188E, 0x81DA, 0x1891, 0x81DF, 0x1892,

+    0x81E0, 0x1893, 0x81E3, 0x0A09, 0x81E5, 0x0569, 0x81E7, 0x1894,

+    0x81E8, 0x0F9F, 0x81EA, 0x08D7, 0x81ED, 0x0937, 0x81F3, 0x08B8,

+    0x81F4, 0x0B95, 0x81F9, 0x3ABB, 0x81FA, 0x1895, 0x81FB, 0x1896,

+    0x81FC, 0x04D3, 0x81FE, 0x1897, 0x8201, 0x1898, 0x8202, 0x1899,

+    0x8203, 0x3ABC, 0x8205, 0x189A, 0x8207, 0x189B, 0x8208, 0x06B5,

+    0x8209, 0x13AF, 0x820A, 0x189C, 0x820C, 0x0A89, 0x820D, 0x189D,

+    0x820E, 0x08F7, 0x8210, 0x189E, 0x8212, 0x1009, 0x8216, 0x189F,

+    0x8217, 0x0E2E, 0x8218, 0x0618, 0x821B, 0x0AA6, 0x821C, 0x0962,

+    0x821E, 0x0DE3, 0x821F, 0x0938, 0x8221, 0x3ABD, 0x8229, 0x18A0,

+    0x822A, 0x07E4, 0x822B, 0x18A1, 0x822C, 0x0D60, 0x822E, 0x18AF,

+    0x8232, 0x3ABE, 0x8233, 0x18A3, 0x8234, 0x3ABF, 0x8235, 0x0B29,

+    0x8236, 0x0D2B, 0x8237, 0x0773, 0x8238, 0x18A2, 0x8239, 0x0AA7,

+    0x8240, 0x18A4, 0x8246, 0x3AC0, 0x8247, 0x0C16, 0x824B, 0x3AC1,

+    0x824F, 0x3AC2, 0x8258, 0x18A6, 0x8259, 0x18A5, 0x825A, 0x18A8,

+    0x825D, 0x18A7, 0x825F, 0x18A9, 0x8262, 0x18AB, 0x8264, 0x18AA,

+    0x8266, 0x060B, 0x8268, 0x18AC, 0x826A, 0x18AD, 0x826B, 0x18AE,

+    0x826E, 0x0821, 0x826F, 0x0F91, 0x8271, 0x18B0, 0x8272, 0x09ED,

+    0x8276, 0x0512, 0x8277, 0x18B1, 0x8278, 0x18B2, 0x8279, 0x3775,

+    0x827E, 0x18B3, 0x828B, 0x04B6, 0x828D, 0x18B4, 0x828E, 0x3AC3,

+    0x8292, 0x18B5, 0x8299, 0x0DD9, 0x829D, 0x08F3, 0x829F, 0x18B7,

+    0x82A5, 0x0587, 0x82A6, 0x0476, 0x82AB, 0x18B6, 0x82AC, 0x18B9,

+    0x82AD, 0x0D04, 0x82AE, 0x3AC4, 0x82AF, 0x0A0A, 0x82B1, 0x0556,

+    0x82B3, 0x0E55, 0x82B7, 0x3AC5, 0x82B8, 0x0733, 0x82B9, 0x06D4,

+    0x82BB, 0x18B8, 0x82BD, 0x056A, 0x82BE, 0x3AC6, 0x82C5, 0x05DF,

+    0x82C6, 0x3AC7, 0x82D1, 0x0513, 0x82D2, 0x18BD, 0x82D3, 0x0FB2,

+    0x82D4, 0x0B3D, 0x82D7, 0x0DB6, 0x82D9, 0x18C9, 0x82DB, 0x0557,

+    0x82DC, 0x18C7, 0x82DE, 0x18C5, 0x82DF, 0x18BC, 0x82E1, 0x18BA,

+    0x82E3, 0x18BB, 0x82E5, 0x090F, 0x82E6, 0x06E4, 0x82E7, 0x0BB5,

+    0x82EB, 0x0CA9, 0x82F1, 0x04F3, 0x82F3, 0x18BF, 0x82F4, 0x18BE,

+    0x82F9, 0x18C4, 0x82FA, 0x18C0, 0x82FB, 0x18C3, 0x82FE, 0x3AC8,

+    0x8301, 0x2198, 0x8302, 0x0EDC, 0x8303, 0x18C2, 0x8304, 0x0558,

+    0x8305, 0x05DB, 0x8306, 0x18C6, 0x8309, 0x18C8, 0x830E, 0x072A,

+    0x8316, 0x18CC, 0x8317, 0x18D5, 0x8318, 0x18D6, 0x831C, 0x046F,

+    0x8323, 0x18DD, 0x8328, 0x04B5, 0x832B, 0x18D4, 0x832F, 0x18D3,

+    0x8331, 0x18CE, 0x8332, 0x18CD, 0x8334, 0x18CB, 0x8335, 0x18CA,

+    0x8336, 0x0BA1, 0x8338, 0x0B5B, 0x8339, 0x18D0, 0x8340, 0x18CF,

+    0x8343, 0x3AC9, 0x8345, 0x18D2, 0x8349, 0x0AF2, 0x834A, 0x072B,

+    0x834F, 0x04E3, 0x8350, 0x18D1, 0x8351, 0x3ACA, 0x8352, 0x07E5,

+    0x8355, 0x3ACB, 0x8358, 0x0AF3, 0x8362, 0x2199, 0x8373, 0x18E3,

+    0x8375, 0x18E4, 0x8377, 0x0559, 0x837B, 0x052E, 0x837C, 0x18E1,

+    0x837F, 0x219A, 0x8385, 0x18D7, 0x8386, 0x3ACC, 0x8387, 0x18DF,

+    0x8389, 0x18E6, 0x838A, 0x18E0, 0x838D, 0x3ACD, 0x838E, 0x18DE,

+    0x8392, 0x3ACE, 0x8393, 0x18C1, 0x8396, 0x18DC, 0x8398, 0x3ACF,

+    0x839A, 0x18D8, 0x839E, 0x060C, 0x839F, 0x18DA, 0x83A0, 0x18E5,

+    0x83A2, 0x18DB, 0x83A8, 0x18E7, 0x83A9, 0x3AD0, 0x83AA, 0x18D9,

+    0x83AB, 0x0D32, 0x83B1, 0x0F53, 0x83B5, 0x18E2, 0x83BD, 0x18F8,

+    0x83BF, 0x3AD1, 0x83C0, 0x3AD2, 0x83C1, 0x18F0, 0x83C5, 0x0A41,

+    0x83C7, 0x219B, 0x83CA, 0x0660, 0x83CC, 0x06D5, 0x83CE, 0x18EB,

+    0x83D3, 0x055B, 0x83D6, 0x09BC, 0x83D8, 0x18EE, 0x83DC, 0x084A,

+    0x83DF, 0x0C4B, 0x83E0, 0x18F3, 0x83E9, 0x0E3E, 0x83EA, 0x3AD3,

+    0x83EB, 0x18EA, 0x83EF, 0x055A, 0x83F0, 0x078A, 0x83F1, 0x0D9B,

+    0x83F2, 0x18F4, 0x83F4, 0x18E8, 0x83F6, 0x219C, 0x83F7, 0x18F1,

+    0x83FB, 0x18FB, 0x83FD, 0x18EC, 0x8403, 0x18ED, 0x8404, 0x0C92,

+    0x8407, 0x18F2, 0x840A, 0x1E7F, 0x840B, 0x18EF, 0x840C, 0x0E56,

+    0x840D, 0x18F5, 0x840E, 0x04A4, 0x840F, 0x3AD4, 0x8411, 0x3AD5,

+    0x8413, 0x18E9, 0x8420, 0x18F7, 0x8422, 0x18F6, 0x8429, 0x0D21,

+    0x842A, 0x18FD, 0x842C, 0x1908, 0x8431, 0x05DC, 0x8435, 0x190B,

+    0x8438, 0x18F9, 0x843C, 0x18FE, 0x843D, 0x0F58, 0x8446, 0x1907,

+    0x8448, 0x219D, 0x8449, 0x0F3F, 0x844A, 0x3AD6, 0x844E, 0x0F72,

+    0x8457, 0x0BB6, 0x845B, 0x05C9, 0x8461, 0x0DE4, 0x8462, 0x190D,

+    0x8463, 0x0C79, 0x8466, 0x0475, 0x8469, 0x1906, 0x846B, 0x1902,

+    0x846C, 0x0AF4, 0x846D, 0x18FC, 0x846E, 0x1904, 0x846F, 0x1909,

+    0x8471, 0x0CE2, 0x8475, 0x046E, 0x8476, 0x3AD7, 0x8477, 0x1901,

+    0x8479, 0x190A, 0x847A, 0x0DEA, 0x8482, 0x1905, 0x8484, 0x1900,

+    0x848B, 0x09BD, 0x8490, 0x0939, 0x8494, 0x08D8, 0x8499, 0x0EE4,

+    0x849C, 0x0DB9, 0x849F, 0x1910, 0x84A1, 0x1919, 0x84A8, 0x3AD8,

+    0x84AD, 0x1903, 0x84AF, 0x3AD9, 0x84B2, 0x05D5, 0x84B4, 0x219E,

+    0x84B8, 0x09E0, 0x84B9, 0x190E, 0x84BB, 0x1913, 0x84BC, 0x0AF5,

+    0x84BF, 0x190F, 0x84C0, 0x3ADA, 0x84C1, 0x1916, 0x84C2, 0x3ADB,

+    0x84C4, 0x0B9D, 0x84C6, 0x1917, 0x84C9, 0x0F40, 0x84CA, 0x190C,

+    0x84CB, 0x0596, 0x84CD, 0x1912, 0x84D0, 0x1915, 0x84D1, 0x0EB8,

+    0x84D6, 0x1918, 0x84D9, 0x1911, 0x84DA, 0x1914, 0x84DC, 0x20AB,

+    0x84EC, 0x0E57, 0x84EE, 0x0FC7, 0x84F0, 0x3ADC, 0x84F4, 0x191C,

+    0x84FC, 0x1923, 0x84FD, 0x3ADD, 0x84FF, 0x191B, 0x8500, 0x08EF,

+    0x8506, 0x18FA, 0x850C, 0x3ADE, 0x8511, 0x0E1E, 0x8513, 0x0EAE,

+    0x8514, 0x1922, 0x8515, 0x1921, 0x8517, 0x191D, 0x8518, 0x191E,

+    0x851A, 0x04D8, 0x851F, 0x1920, 0x8521, 0x191A, 0x8523, 0x1E1A,

+    0x8526, 0x0BF1, 0x852C, 0x191F, 0x852D, 0x04C2, 0x8534, 0x3ADF,

+    0x8535, 0x0B02, 0x853D, 0x0E13, 0x853E, 0x1EB5, 0x8540, 0x1924,

+    0x8541, 0x1928, 0x8543, 0x0D6D, 0x8548, 0x1927, 0x8549, 0x09BE,

+    0x854A, 0x08F5, 0x854B, 0x192A, 0x854E, 0x06B6, 0x8553, 0x219F,

+    0x8555, 0x192B, 0x8557, 0x0DEB, 0x8558, 0x1926, 0x8559, 0x21A0,

+    0x855A, 0x18FF, 0x855E, 0x3AE0, 0x8563, 0x1925, 0x8568, 0x0FF5,

+    0x8569, 0x0C7A, 0x856A, 0x0DE5, 0x856B, 0x21A1, 0x856D, 0x1932,

+    0x8577, 0x1938, 0x857E, 0x1939, 0x8580, 0x192C, 0x8584, 0x0D2C,

+    0x8587, 0x1936, 0x8588, 0x192E, 0x858A, 0x1930, 0x858F, 0x3AE1,

+    0x8590, 0x193A, 0x8591, 0x192F, 0x8594, 0x1933, 0x8597, 0x0514,

+    0x8599, 0x0CBD, 0x859B, 0x1934, 0x859C, 0x1937, 0x85A4, 0x192D,

+    0x85A6, 0x0AA8, 0x85A8, 0x1931, 0x85A9, 0x0875, 0x85AA, 0x0A0B,

+    0x85AB, 0x0706, 0x85AC, 0x0F00, 0x85AD, 0x3AE4, 0x85AE, 0x0F05,

+    0x85AF, 0x097C, 0x85B0, 0x21A3, 0x85B7, 0x3AE2, 0x85B9, 0x193E,

+    0x85BA, 0x193C, 0x85C1, 0x0FF4, 0x85C9, 0x193B, 0x85CD, 0x0F5F,

+    0x85CE, 0x3AE3, 0x85CF, 0x193D, 0x85D0, 0x193F, 0x85D5, 0x1940,

+    0x85DC, 0x1943, 0x85DD, 0x1941, 0x85E4, 0x0C7B, 0x85E5, 0x1942,

+    0x85E9, 0x0D61, 0x85EA, 0x1935, 0x85F4, 0x3780, 0x85F7, 0x097D,

+    0x85F9, 0x1944, 0x85FA, 0x1949, 0x85FB, 0x0AF6, 0x85FE, 0x1948,

+    0x8602, 0x1929, 0x8606, 0x194A, 0x8607, 0x0ACB, 0x860A, 0x1945,

+    0x860B, 0x1947, 0x8612, 0x3AE5, 0x8613, 0x1946, 0x8616, 0x14D0,

+    0x8617, 0x14C1, 0x861A, 0x194C, 0x8622, 0x194B, 0x8629, 0x3AE6,

+    0x862D, 0x0F60, 0x862F, 0x16B1, 0x8630, 0x194D, 0x863F, 0x194E,

+    0x864D, 0x194F, 0x864E, 0x078B, 0x8650, 0x066E, 0x8652, 0x3AE7,

+    0x8654, 0x1951, 0x8655, 0x1094, 0x865A, 0x068F, 0x865B, 0x3418,

+    0x865C, 0x0F82, 0x865E, 0x06EB, 0x865F, 0x1952, 0x8663, 0x3AE8,

+    0x8667, 0x1953, 0x866B, 0x0BAC, 0x866C, 0x3AE9, 0x866F, 0x3AEA,

+    0x8671, 0x1954, 0x8679, 0x0CD2, 0x867A, 0x3AEB, 0x867B, 0x047E,

+    0x867D, 0x3786, 0x868A, 0x0563, 0x868B, 0x1959, 0x868C, 0x195A,

+    0x868D, 0x3AEC, 0x8691, 0x3AED, 0x8693, 0x1955, 0x8695, 0x088B,

+    0x8698, 0x3AEE, 0x86A3, 0x1956, 0x86A4, 0x0CF8, 0x86A7, 0x3AEF,

+    0x86A8, 0x3AF0, 0x86A9, 0x1957, 0x86AA, 0x1958, 0x86AB, 0x1962,

+    0x86AF, 0x195C, 0x86B0, 0x195F, 0x86B6, 0x195B, 0x86C4, 0x195D,

+    0x86C6, 0x195E, 0x86C7, 0x0904, 0x86C9, 0x1960, 0x86CB, 0x0B7F,

+    0x86CD, 0x072C, 0x86CE, 0x05A0, 0x86D4, 0x1963, 0x86D9, 0x059D,

+    0x86DB, 0x1968, 0x86DE, 0x1964, 0x86DF, 0x1967, 0x86E4, 0x0D4E,

+    0x86E9, 0x1965, 0x86EC, 0x1966, 0x86ED, 0x0DBA, 0x86EE, 0x0D6E,

+    0x86EF, 0x1969, 0x86F8, 0x0B5D, 0x86F9, 0x1973, 0x86FA, 0x3AF1,

+    0x86FB, 0x196F, 0x86FD, 0x3AF2, 0x86FE, 0x056B, 0x8700, 0x196D,

+    0x8702, 0x0E58, 0x8703, 0x196E, 0x8706, 0x196B, 0x8708, 0x196C,

+    0x8709, 0x1971, 0x870A, 0x1974, 0x870B, 0x3AF3, 0x870D, 0x1972,

+    0x8711, 0x1970, 0x8712, 0x196A, 0x8713, 0x3AF4, 0x8718, 0x0B96,

+    0x8719, 0x3AF5, 0x871A, 0x197B, 0x871C, 0x0EB6, 0x871E, 0x3AF6,

+    0x8725, 0x1979, 0x8728, 0x3AF7, 0x8729, 0x197A, 0x8734, 0x1975,

+    0x8737, 0x1977, 0x873B, 0x1978, 0x873E, 0x3AF8, 0x873F, 0x1976,

+    0x8749, 0x0A8A, 0x874B, 0x0FDF, 0x874C, 0x197F, 0x874E, 0x1980,

+    0x8753, 0x1986, 0x8755, 0x09F0, 0x8757, 0x1982, 0x8759, 0x1985,

+    0x875F, 0x197D, 0x8760, 0x197C, 0x8763, 0x1987, 0x8766, 0x055C,

+    0x8768, 0x1983, 0x876A, 0x1988, 0x876E, 0x1984, 0x8771, 0x3AF9,

+    0x8774, 0x1981, 0x8776, 0x0BCF, 0x8778, 0x197E, 0x877F, 0x0D1E,

+    0x8782, 0x198C, 0x8788, 0x3AFA, 0x878D, 0x0F25, 0x8799, 0x3AFB,

+    0x879F, 0x198B, 0x87A2, 0x198A, 0x87AB, 0x1993, 0x87AC, 0x3AFC,

+    0x87AD, 0x3AFD, 0x87AF, 0x198D, 0x87B3, 0x1995, 0x87B5, 0x3AFE,

+    0x87BA, 0x0F50, 0x87BB, 0x1998, 0x87BD, 0x198F, 0x87C0, 0x1990,

+    0x87C4, 0x1994, 0x87C6, 0x1997, 0x87C7, 0x1996, 0x87CB, 0x198E,

+    0x87D0, 0x1991, 0x87D2, 0x19A2, 0x87D6, 0x3AFF, 0x87E0, 0x199B,

+    0x87EB, 0x3B00, 0x87EC, 0x1E23, 0x87ED, 0x3B01, 0x87EF, 0x1999,

+    0x87F2, 0x199A, 0x87F5, 0x3C3D, 0x87F6, 0x199F, 0x87F7, 0x19A0,

+    0x87F9, 0x0588, 0x87FB, 0x065C, 0x87FE, 0x199E, 0x8801, 0x3B02,

+    0x8803, 0x3B03, 0x8805, 0x1989, 0x8806, 0x3B04, 0x8807, 0x21A6,

+    0x880B, 0x3B05, 0x880D, 0x199D, 0x880E, 0x19A1, 0x880F, 0x199C,

+    0x8811, 0x19A3, 0x8814, 0x3B06, 0x8815, 0x19A5, 0x8816, 0x19A4,

+    0x881C, 0x3B07, 0x881F, 0x1E85, 0x8821, 0x19A7, 0x8822, 0x19A6,

+    0x8823, 0x1961, 0x8827, 0x19AB, 0x8831, 0x19A8, 0x8836, 0x19A9,

+    0x8839, 0x19AA, 0x883B, 0x19AC, 0x8840, 0x0742, 0x8842, 0x19AE,

+    0x8844, 0x19AD, 0x8846, 0x093A, 0x884C, 0x07E6, 0x884D, 0x1524,

+    0x8852, 0x19AF, 0x8853, 0x095B, 0x8856, 0x3B08, 0x8857, 0x0597,

+    0x8859, 0x19B0, 0x885B, 0x04F4, 0x885D, 0x09BF, 0x885E, 0x19B1,

+    0x885F, 0x3B09, 0x8861, 0x07E7, 0x8862, 0x19B2, 0x8863, 0x04A5,

+    0x8864, 0x3B0A, 0x8868, 0x0DAF, 0x886B, 0x19B3, 0x8870, 0x0A30,

+    0x8872, 0x19BA, 0x8875, 0x19B7, 0x8877, 0x0BAD, 0x887D, 0x19B8,

+    0x887E, 0x19B5, 0x887F, 0x06D6, 0x8881, 0x19B4, 0x8882, 0x19BB,

+    0x8888, 0x070C, 0x888B, 0x0B3E, 0x888D, 0x19C1, 0x8892, 0x19BD,

+    0x8896, 0x0B15, 0x8897, 0x19BC, 0x8898, 0x3B0B, 0x8899, 0x19BF,

+    0x889E, 0x19B6, 0x88A2, 0x19C0, 0x88A4, 0x19C2, 0x88AA, 0x3B0C,

+    0x88AB, 0x0D83, 0x88AE, 0x19BE, 0x88B0, 0x19C3, 0x88B1, 0x19C5,

+    0x88B4, 0x0787, 0x88B5, 0x19B9, 0x88B7, 0x0485, 0x88BD, 0x3B0D,

+    0x88BE, 0x3B0E, 0x88BF, 0x19C4, 0x88C1, 0x084B, 0x88C2, 0x0FBE,

+    0x88C3, 0x19C6, 0x88C4, 0x19C7, 0x88C5, 0x0AF7, 0x88C6, 0x3789,

+    0x88CA, 0x3B0F, 0x88CF, 0x0F6A, 0x88D2, 0x3B10, 0x88D4, 0x19C8,

+    0x88D5, 0x0F1F, 0x88D8, 0x19C9, 0x88D9, 0x19CA, 0x88DB, 0x3B11,

+    0x88DC, 0x0E34, 0x88DD, 0x19CB, 0x88DF, 0x0830, 0x88E1, 0x0F6B,

+    0x88E8, 0x19D0, 0x88F0, 0x3B12, 0x88F1, 0x3B13, 0x88F2, 0x19D1,

+    0x88F3, 0x09C0, 0x88F4, 0x19CF, 0x88F5, 0x21A7, 0x88F8, 0x0F51,

+    0x88F9, 0x19CC, 0x88FC, 0x19CE, 0x88FD, 0x0A61, 0x88FE, 0x0A44,

+    0x8902, 0x19CD, 0x8904, 0x19D2, 0x8906, 0x3B14, 0x8907, 0x0DF3,

+    0x890A, 0x19D4, 0x890C, 0x19D3, 0x8910, 0x05CA, 0x8912, 0x0E59,

+    0x8913, 0x19D5, 0x8918, 0x3B15, 0x8919, 0x3B16, 0x891A, 0x3B17,

+    0x891C, 0x20A8, 0x891D, 0x19E1, 0x891E, 0x19D7, 0x8925, 0x19D8,

+    0x8927, 0x3B18, 0x892A, 0x19D9, 0x892B, 0x19DA, 0x8930, 0x3B19,

+    0x8936, 0x19DE, 0x8938, 0x19DF, 0x893B, 0x19DD, 0x893E, 0x3B1A,

+    0x8941, 0x19DB, 0x8943, 0x19D6, 0x8944, 0x19DC, 0x894C, 0x19E0,

+    0x894D, 0x1BD0, 0x8956, 0x0528, 0x895E, 0x19E3, 0x895F, 0x06D7,

+    0x8960, 0x19E2, 0x8964, 0x19E5, 0x8966, 0x19E4, 0x896A, 0x19E7,

+    0x896D, 0x19E6, 0x896F, 0x19E8, 0x8972, 0x093B, 0x8974, 0x19E9,

+    0x8977, 0x19EA, 0x897B, 0x3B1B, 0x897E, 0x19EB, 0x897F, 0x0A62,

+    0x8980, 0x362E, 0x8981, 0x0F41, 0x8983, 0x19EC, 0x8986, 0x0DF4,

+    0x8987, 0x0CFC, 0x8988, 0x19ED, 0x898A, 0x19EE, 0x898B, 0x075F,

+    0x898F, 0x0646, 0x8993, 0x19EF, 0x8996, 0x08B9, 0x8997, 0x0CF7,

+    0x8998, 0x19F0, 0x899A, 0x05AE, 0x89A1, 0x19F1, 0x89A6, 0x19F3,

+    0x89A7, 0x0F61, 0x89A9, 0x19F2, 0x89AA, 0x0A0C, 0x89AC, 0x19F4,

+    0x89AF, 0x19F5, 0x89B2, 0x19F6, 0x89B3, 0x060D, 0x89BA, 0x19F7,

+    0x89BD, 0x19F8, 0x89BF, 0x19F9, 0x89C0, 0x19FA, 0x89D2, 0x05AF,

+    0x89D4, 0x3B1C, 0x89D6, 0x3B1D, 0x89DA, 0x19FB, 0x89DC, 0x19FC,

+    0x89DD, 0x19FD, 0x89E3, 0x0572, 0x89E5, 0x3B1E, 0x89E6, 0x09EE,

+    0x89E7, 0x19FE, 0x89F1, 0x3B1F, 0x89F4, 0x19FF, 0x89F8, 0x1A00,

+    0x8A00, 0x0774, 0x8A01, 0x35BC, 0x8A02, 0x0C17, 0x8A03, 0x1A01,

+    0x8A07, 0x3B20, 0x8A08, 0x072D, 0x8A0A, 0x0A1C, 0x8A0C, 0x1A04,

+    0x8A0E, 0x0C7C, 0x8A0F, 0x3B21, 0x8A10, 0x1A03, 0x8A12, 0x21A8,

+    0x8A13, 0x0707, 0x8A15, 0x3B22, 0x8A16, 0x1A02, 0x8A17, 0x0B57,

+    0x8A18, 0x0647, 0x8A1B, 0x1A05, 0x8A1D, 0x1A06, 0x8A1F, 0x09C1,

+    0x8A22, 0x3B23, 0x8A23, 0x0743, 0x8A25, 0x1A07, 0x8A2A, 0x0E5A,

+    0x8A2D, 0x0A83, 0x8A31, 0x0690, 0x8A33, 0x0F01, 0x8A34, 0x0ACC,

+    0x8A36, 0x1A08, 0x8A37, 0x21A9, 0x8A3A, 0x0A0D, 0x8A3B, 0x0BAE,

+    0x8A3C, 0x09C2, 0x8A41, 0x1A09, 0x8A46, 0x1A0C, 0x8A48, 0x1A0D,

+    0x8A4E, 0x3B24, 0x8A50, 0x082E, 0x8A51, 0x0B22, 0x8A52, 0x1A0B,

+    0x8A54, 0x09C3, 0x8A55, 0x0DB0, 0x8A5B, 0x1A0A, 0x8A5E, 0x08BA,

+    0x8A60, 0x04F5, 0x8A62, 0x1A11, 0x8A63, 0x072E, 0x8A66, 0x08BC,

+    0x8A69, 0x08BB, 0x8A6B, 0x0FF3, 0x8A6C, 0x1A10, 0x8A6D, 0x1A0F,

+    0x8A6E, 0x0AA9, 0x8A70, 0x0667, 0x8A71, 0x0FE9, 0x8A72, 0x0598,

+    0x8A73, 0x09C4, 0x8A79, 0x21AA, 0x8A7C, 0x1A0E, 0x8A7F, 0x3B25,

+    0x8A82, 0x1A13, 0x8A84, 0x1A14, 0x8A85, 0x1A12, 0x8A87, 0x078C,

+    0x8A89, 0x0F2A, 0x8A8C, 0x08BD, 0x8A8D, 0x0CDD, 0x8A91, 0x1A17,

+    0x8A93, 0x0A64, 0x8A95, 0x0B80, 0x8A98, 0x0F20, 0x8A9A, 0x1A1A,

+    0x8A9E, 0x07A0, 0x8AA0, 0x0A63, 0x8AA1, 0x1A16, 0x8AA3, 0x1A1B,

+    0x8AA4, 0x07A1, 0x8AA5, 0x1A18, 0x8AA6, 0x1A19, 0x8AA7, 0x21AB,

+    0x8AA8, 0x1A15, 0x8AAA, 0x3638, 0x8AAC, 0x0A86, 0x8AAD, 0x0CA1,

+    0x8AB0, 0x0B6D, 0x8AB2, 0x055D, 0x8AB9, 0x0D84, 0x8ABC, 0x065D,

+    0x8ABE, 0x21AC, 0x8ABF, 0x0BD0, 0x8AC2, 0x1A1E, 0x8AC4, 0x1A1C,

+    0x8AC7, 0x0B8A, 0x8ACB, 0x0A65, 0x8ACC, 0x060E, 0x8ACD, 0x1A1D,

+    0x8ACF, 0x0A21, 0x8AD2, 0x0F92, 0x8AD6, 0x0FE6, 0x8ADA, 0x1A1F,

+    0x8ADB, 0x1A2A, 0x8ADC, 0x0BD1, 0x8ADE, 0x1A29, 0x8ADF, 0x21AD,

+    0x8AE0, 0x1A26, 0x8AE1, 0x1A2E, 0x8AE2, 0x1A27, 0x8AE4, 0x1A23,

+    0x8AE6, 0x0C18, 0x8AE7, 0x1A22, 0x8AEB, 0x1A20, 0x8AED, 0x0F0B,

+    0x8AEE, 0x08BE, 0x8AF1, 0x1A24, 0x8AF3, 0x1A21, 0x8AF4, 0x3B26,

+    0x8AF6, 0x21AF, 0x8AF7, 0x1A28, 0x8AF8, 0x097E, 0x8AFA, 0x0775,

+    0x8AFE, 0x0B5A, 0x8B00, 0x0E73, 0x8B01, 0x04FC, 0x8B02, 0x04A6,

+    0x8B04, 0x0C7D, 0x8B07, 0x1A2C, 0x8B0C, 0x1A2B, 0x8B0E, 0x0CBE,

+    0x8B10, 0x1A30, 0x8B14, 0x1A25, 0x8B16, 0x1A2F, 0x8B17, 0x1A31,

+    0x8B19, 0x0760, 0x8B1A, 0x1A2D, 0x8B1B, 0x07E8, 0x8B1D, 0x0901,

+    0x8B1F, 0x3B27, 0x8B20, 0x1A32, 0x8B21, 0x0F42, 0x8B26, 0x1A35,

+    0x8B28, 0x1A38, 0x8B2B, 0x1A36, 0x8B2C, 0x0DA7, 0x8B33, 0x1A33,

+    0x8B37, 0x3B28, 0x8B39, 0x06D8, 0x8B3E, 0x1A37, 0x8B41, 0x1A39,

+    0x8B43, 0x3B29, 0x8B44, 0x3B2A, 0x8B49, 0x1A3D, 0x8B4C, 0x1A3A,

+    0x8B4E, 0x1A3C, 0x8B4F, 0x1A3B, 0x8B53, 0x21B0, 0x8B54, 0x3B2B,

+    0x8B56, 0x1A3E, 0x8B58, 0x08DD, 0x8B5A, 0x1A40, 0x8B5B, 0x1A3F,

+    0x8B5C, 0x0DDA, 0x8B5F, 0x1A42, 0x8B66, 0x072F, 0x8B6B, 0x1A41,

+    0x8B6C, 0x1A43, 0x8B6F, 0x1A44, 0x8B70, 0x065E, 0x8B71, 0x182E,

+    0x8B72, 0x09E1, 0x8B74, 0x1A45, 0x8B77, 0x07A2, 0x8B7D, 0x1A46,

+    0x8B7F, 0x21B1, 0x8B80, 0x1A47, 0x8B83, 0x088C, 0x8B8A, 0x13D3,

+    0x8B8C, 0x1A48, 0x8B8E, 0x1A49, 0x8B90, 0x093C, 0x8B92, 0x1A4A,

+    0x8B93, 0x1A4B, 0x8B96, 0x1A4C, 0x8B99, 0x1A4D, 0x8B9A, 0x1A4E,

+    0x8B9C, 0x3B2C, 0x8B9E, 0x3B2D, 0x8C37, 0x0B69, 0x8C3A, 0x1A4F,

+    0x8C3F, 0x1A51, 0x8C41, 0x1A50, 0x8C46, 0x0C7E, 0x8C47, 0x3B2E,

+    0x8C48, 0x1A52, 0x8C4A, 0x0E5B, 0x8C4C, 0x1A53, 0x8C4E, 0x1A54,

+    0x8C50, 0x1A55, 0x8C54, 0x3B2F, 0x8C55, 0x1A56, 0x8C5A, 0x0CB2,

+    0x8C61, 0x09C5, 0x8C62, 0x1A57, 0x8C6A, 0x07FD, 0x8C6B, 0x1007,

+    0x8C6C, 0x1A58, 0x8C73, 0x3B30, 0x8C78, 0x1A59, 0x8C79, 0x0DB1,

+    0x8C7A, 0x1A5A, 0x8C7C, 0x1A62, 0x8C82, 0x1A5B, 0x8C85, 0x1A5D,

+    0x8C89, 0x1A5C, 0x8C8A, 0x1A5E, 0x8C8C, 0x0E74, 0x8C8D, 0x1A5F,

+    0x8C8E, 0x1A60, 0x8C94, 0x1A61, 0x8C98, 0x1A63, 0x8C9D, 0x058B,

+    0x8C9E, 0x0C03, 0x8CA0, 0x0DDB, 0x8CA1, 0x0852, 0x8CA2, 0x07E9,

+    0x8CA4, 0x3B31, 0x8CA7, 0x0DC1, 0x8CA8, 0x055F, 0x8CA9, 0x0D62,

+    0x8CAA, 0x1A66, 0x8CAB, 0x060F, 0x8CAC, 0x0A79, 0x8CAD, 0x1A65,

+    0x8CAE, 0x1A6A, 0x8CAF, 0x0BB7, 0x8CB0, 0x0EEF, 0x8CB2, 0x1A68,

+    0x8CB3, 0x1A69, 0x8CB4, 0x0648, 0x8CB6, 0x1A6B, 0x8CB7, 0x0D19,

+    0x8CB8, 0x0B3F, 0x8CBB, 0x0D85, 0x8CBC, 0x0C37, 0x8CBD, 0x1A67,

+    0x8CBF, 0x0E75, 0x8CC0, 0x056C, 0x8CC1, 0x1A6D, 0x8CC2, 0x0FCE,

+    0x8CC3, 0x0BDE, 0x8CC4, 0x0FEB, 0x8CC7, 0x08BF, 0x8CC8, 0x1A6C,

+    0x8CCA, 0x0B11, 0x8CCD, 0x1A7D, 0x8CCE, 0x0AAA, 0x8CD1, 0x0CD0,

+    0x8CD3, 0x0DC2, 0x8CD9, 0x3B32, 0x8CDA, 0x1A70, 0x8CDB, 0x088D,

+    0x8CDC, 0x08C0, 0x8CDE, 0x09C6, 0x8CE0, 0x0D1B, 0x8CE1, 0x3B33,

+    0x8CE2, 0x0761, 0x8CE3, 0x1A6F, 0x8CE4, 0x1A6E, 0x8CE6, 0x0DDC,

+    0x8CEA, 0x08ED, 0x8CED, 0x0C4C, 0x8CF0, 0x21B2, 0x8CF4, 0x21B3,

+    0x8CF8, 0x3B34, 0x8CFA, 0x1A72, 0x8CFB, 0x1A73, 0x8CFC, 0x07EA,

+    0x8CFD, 0x1A71, 0x8CFE, 0x3B35, 0x8D04, 0x1A74, 0x8D05, 0x1A75,

+    0x8D07, 0x1A77, 0x8D08, 0x0B03, 0x8D0A, 0x1A76, 0x8D0B, 0x0622,

+    0x8D0D, 0x1A79, 0x8D0F, 0x1A78, 0x8D10, 0x1A7A, 0x8D12, 0x21B4,

+    0x8D13, 0x1A7C, 0x8D14, 0x1A7E, 0x8D16, 0x1A7F, 0x8D1B, 0x3B36,

+    0x8D64, 0x0A7A, 0x8D66, 0x08FB, 0x8D67, 0x1A80, 0x8D69, 0x3B37,

+    0x8D6B, 0x05B0, 0x8D6C, 0x3B38, 0x8D6D, 0x1A81, 0x8D70, 0x0AF8,

+    0x8D71, 0x1A82, 0x8D73, 0x1A83, 0x8D74, 0x0DDD, 0x8D76, 0x21B5,

+    0x8D77, 0x0649, 0x8D81, 0x1A84, 0x8D84, 0x3B39, 0x8D85, 0x0BD2,

+    0x8D8A, 0x04FD, 0x8D8D, 0x3B3A, 0x8D95, 0x3B3B, 0x8D99, 0x1A85,

+    0x8DA3, 0x091D, 0x8DA6, 0x3B3C, 0x8DA8, 0x0A3C, 0x8DB3, 0x0B0D,

+    0x8DBA, 0x1A88, 0x8DBE, 0x1A87, 0x8DC2, 0x1A86, 0x8DC6, 0x3B3D,

+    0x8DCB, 0x1A8E, 0x8DCC, 0x1A8C, 0x8DCE, 0x3B3E, 0x8DCF, 0x1A89,

+    0x8DD6, 0x1A8B, 0x8DDA, 0x1A8A, 0x8DDB, 0x1A8D, 0x8DDD, 0x0691,

+    0x8DDF, 0x1A91, 0x8DE1, 0x0A7B, 0x8DE3, 0x1A92, 0x8DE4, 0x3B3F,

+    0x8DE8, 0x078D, 0x8DEA, 0x1A8F, 0x8DEB, 0x1A90, 0x8DEC, 0x3B40,

+    0x8DEF, 0x0FCF, 0x8DF3, 0x0BD3, 0x8DF5, 0x0AAB, 0x8DFC, 0x1A93,

+    0x8DFF, 0x1A96, 0x8E08, 0x1A94, 0x8E09, 0x1A95, 0x8E0A, 0x0F43,

+    0x8E0F, 0x0C7F, 0x8E10, 0x1A99, 0x8E1D, 0x1A97, 0x8E1E, 0x1A98,

+    0x8E1F, 0x1A9A, 0x8E20, 0x3B41, 0x8E2A, 0x1AA8, 0x8E30, 0x1A9D,

+    0x8E34, 0x1A9E, 0x8E35, 0x1A9C, 0x8E42, 0x1A9B, 0x8E44, 0x0C19,

+    0x8E47, 0x1AA0, 0x8E48, 0x1AA4, 0x8E49, 0x1AA1, 0x8E4A, 0x1A9F,

+    0x8E4B, 0x3B42, 0x8E4C, 0x1AA2, 0x8E50, 0x1AA3, 0x8E55, 0x1AAA,

+    0x8E59, 0x1AA5, 0x8E5F, 0x0A7C, 0x8E60, 0x1AA7, 0x8E63, 0x1AA9,

+    0x8E64, 0x1AA6, 0x8E6C, 0x3B43, 0x8E70, 0x3B44, 0x8E72, 0x1AAC,

+    0x8E74, 0x093D, 0x8E76, 0x1AAB, 0x8E7A, 0x3B45, 0x8E7C, 0x1AAD,

+    0x8E81, 0x1AAE, 0x8E84, 0x1AB1, 0x8E85, 0x1AB0, 0x8E87, 0x1AAF,

+    0x8E8A, 0x1AB3, 0x8E8B, 0x1AB2, 0x8E8D, 0x0F02, 0x8E91, 0x1AB5,

+    0x8E92, 0x3B46, 0x8E93, 0x1AB4, 0x8E94, 0x1AB6, 0x8E99, 0x1AB7,

+    0x8EA1, 0x1AB9, 0x8EAA, 0x1AB8, 0x8EAB, 0x0A0E, 0x8EAC, 0x1ABA,

+    0x8EAE, 0x3B47, 0x8EAF, 0x06E5, 0x8EB0, 0x1ABB, 0x8EB1, 0x1ABD,

+    0x8EB3, 0x3B48, 0x8EB6, 0x3703, 0x8EBE, 0x1ABE, 0x8EC0, 0x1DEF,

+    0x8EC5, 0x1ABF, 0x8EC6, 0x1ABC, 0x8EC8, 0x1AC0, 0x8ECA, 0x0902,

+    0x8ECB, 0x1AC1, 0x8ECC, 0x064A, 0x8ECD, 0x0709, 0x8ECF, 0x21B7,

+    0x8ED1, 0x3B49, 0x8ED2, 0x0762, 0x8ED4, 0x3B4A, 0x8EDB, 0x1AC2,

+    0x8EDF, 0x0CC8, 0x8EE2, 0x0C38, 0x8EE3, 0x1AC3, 0x8EEB, 0x1AC6,

+    0x8EF8, 0x08E0, 0x8EF9, 0x3B4B, 0x8EFB, 0x1AC5, 0x8EFC, 0x1AC4,

+    0x8EFD, 0x0730, 0x8EFE, 0x1AC7, 0x8F03, 0x05B1, 0x8F05, 0x1AC9,

+    0x8F09, 0x084C, 0x8F0A, 0x1AC8, 0x8F0C, 0x1AD1, 0x8F12, 0x1ACB,

+    0x8F13, 0x1ACD, 0x8F14, 0x0E35, 0x8F15, 0x1ACA, 0x8F17, 0x3B4C,

+    0x8F19, 0x1ACC, 0x8F1B, 0x1AD0, 0x8F1C, 0x1ACE, 0x8F1D, 0x064B,

+    0x8F1F, 0x1ACF, 0x8F26, 0x1AD2, 0x8F29, 0x0D10, 0x8F2A, 0x0FA0,

+    0x8F2F, 0x093E, 0x8F33, 0x1AD3, 0x8F36, 0x3B4D, 0x8F38, 0x0F0C,

+    0x8F39, 0x1AD5, 0x8F3B, 0x1AD4, 0x8F3E, 0x1AD8, 0x8F3F, 0x0F2B,

+    0x8F42, 0x1AD7, 0x8F44, 0x05CB, 0x8F45, 0x1AD6, 0x8F46, 0x1ADB,

+    0x8F49, 0x1ADA, 0x8F4C, 0x1AD9, 0x8F4D, 0x0C2C, 0x8F4E, 0x1ADC,

+    0x8F57, 0x1ADD, 0x8F5C, 0x1ADE, 0x8F5F, 0x07FE, 0x8F61, 0x06FB,

+    0x8F62, 0x1ADF, 0x8F63, 0x1AE0, 0x8F64, 0x1AE1, 0x8F9B, 0x0A0F,

+    0x8F9C, 0x1AE2, 0x8F9E, 0x08D9, 0x8F9F, 0x1AE3, 0x8FA3, 0x1AE4,

+    0x8FA6, 0x3B4E, 0x8FA7, 0x10B6, 0x8FA8, 0x10B5, 0x8FAD, 0x1AE5,

+    0x8FAE, 0x17FF, 0x8FAF, 0x1AE6, 0x8FB0, 0x0B62, 0x8FB1, 0x09F1,

+    0x8FB2, 0x0CF6, 0x8FB5, 0x3B4F, 0x8FB6, 0x3B50, 0x8FB7, 0x1AE7,

+    0x8FBA, 0x0E25, 0x8FBB, 0x0BF0, 0x8FBC, 0x0810, 0x8FBF, 0x0B67,

+    0x8FC2, 0x04CC, 0x8FC4, 0x0EA6, 0x8FC5, 0x0A1D, 0x8FC6, 0x3B51,

+    0x8FC8, 0x3799, 0x8FCE, 0x0734, 0x8FD1, 0x06D9, 0x8FD4, 0x0E26,

+    0x8FDA, 0x1AE8, 0x8FE0, 0x3B52, 0x8FE2, 0x1AEA, 0x8FE4, 0x3B53,

+    0x8FE5, 0x1AE9, 0x8FE6, 0x0560, 0x8FE9, 0x0CCE, 0x8FEA, 0x1AEB,

+    0x8FEB, 0x0D2D, 0x8FED, 0x0C2D, 0x8FEF, 0x1AEC, 0x8FF0, 0x095C,

+    0x8FF4, 0x1AEE, 0x8FF6, 0x3B54, 0x8FF7, 0x0ECE, 0x8FF8, 0x1AFD,

+    0x8FF9, 0x1AF0, 0x8FFA, 0x1AF1, 0x8FFD, 0x0BE5, 0x9000, 0x0B40,

+    0x9001, 0x0AF9, 0x9002, 0x3B55, 0x9003, 0x0C80, 0x9005, 0x1AEF,

+    0x9006, 0x066F, 0x900B, 0x1AF8, 0x900D, 0x1AF5, 0x900E, 0x1B02,

+    0x900F, 0x0C81, 0x9010, 0x0B9E, 0x9011, 0x1AF2, 0x9013, 0x0C1A,

+    0x9014, 0x0C4D, 0x9015, 0x1AF3, 0x9016, 0x1AF7, 0x9017, 0x0A26,

+    0x9019, 0x0D1D, 0x901A, 0x0BE8, 0x901D, 0x0A66, 0x901E, 0x1AF6,

+    0x901F, 0x0B0E, 0x9020, 0x0B04, 0x9021, 0x1AF4, 0x9022, 0x046D,

+    0x9023, 0x0FC8, 0x9027, 0x1AF9, 0x902C, 0x3B56, 0x902E, 0x0B41,

+    0x9031, 0x093F, 0x9032, 0x0A10, 0x9035, 0x1AFB, 0x9036, 0x1AFA,

+    0x9038, 0x04B3, 0x9039, 0x1AFC, 0x903C, 0x0DA1, 0x903E, 0x1B04,

+    0x9041, 0x0CB3, 0x9042, 0x0A31, 0x9044, 0x3B57, 0x9045, 0x0B97,

+    0x9047, 0x06F0, 0x9049, 0x1B03, 0x904A, 0x0F21, 0x904B, 0x04E1,

+    0x904D, 0x0E27, 0x904E, 0x0561, 0x904F, 0x1AFE, 0x9050, 0x1AFF,

+    0x9051, 0x1B00, 0x9052, 0x1B01, 0x9053, 0x0C93, 0x9054, 0x0B61,

+    0x9055, 0x04A7, 0x9056, 0x1B05, 0x9058, 0x1B06, 0x9059, 0x1D34,

+    0x905C, 0x0B1D, 0x905E, 0x1B07, 0x9060, 0x0515, 0x9061, 0x0ACE,

+    0x9063, 0x0763, 0x9065, 0x0F44, 0x9067, 0x21BA, 0x9068, 0x1B08,

+    0x9069, 0x0C26, 0x906D, 0x0AFA, 0x906E, 0x0903, 0x906F, 0x1B09,

+    0x9072, 0x1B0C, 0x9075, 0x096F, 0x9076, 0x1B0A, 0x9077, 0x0AAD,

+    0x9078, 0x0AAC, 0x907A, 0x04A8, 0x907C, 0x0F93, 0x907D, 0x1B0E,

+    0x907F, 0x0D86, 0x9080, 0x1B10, 0x9081, 0x1B0F, 0x9082, 0x1B0D,

+    0x9083, 0x1737, 0x9084, 0x0610, 0x9087, 0x1AED, 0x9088, 0x3B58,

+    0x9089, 0x1B12, 0x908A, 0x1B11, 0x908F, 0x1B13, 0x9091, 0x0F22,

+    0x9095, 0x3B59, 0x9099, 0x3B5A, 0x909B, 0x3B5B, 0x90A2, 0x3B5C,

+    0x90A3, 0x0CB9, 0x90A6, 0x0E5C, 0x90A8, 0x1B14, 0x90AA, 0x0905,

+    0x90AF, 0x1B15, 0x90B1, 0x1B16, 0x90B4, 0x3B5D, 0x90B5, 0x1B17,

+    0x90B8, 0x0C1B, 0x90C1, 0x04AE, 0x90CA, 0x07EB, 0x90CE, 0x0FE0,

+    0x90D7, 0x3B5E, 0x90DB, 0x1B1B, 0x90DD, 0x3B5F, 0x90DE, 0x21BB,

+    0x90E1, 0x070A, 0x90E2, 0x1B18, 0x90E4, 0x1B19, 0x90E8, 0x0DE6,

+    0x90ED, 0x05B2, 0x90F4, 0x3B60, 0x90F5, 0x0F23, 0x90F7, 0x06B7,

+    0x90FD, 0x0C4E, 0x9102, 0x1B1C, 0x9112, 0x1B1D, 0x9115, 0x21BD,

+    0x9117, 0x3B61, 0x9119, 0x1B1E, 0x911C, 0x3B62, 0x9127, 0x21BE,

+    0x912D, 0x0C1C, 0x9130, 0x1B20, 0x9131, 0x3B63, 0x9132, 0x1B1F,

+    0x913A, 0x3B64, 0x913D, 0x3B65, 0x9148, 0x3B66, 0x9149, 0x0CAB,

+    0x914A, 0x1B21, 0x914B, 0x0940, 0x914C, 0x090C, 0x914D, 0x0D11,

+    0x914E, 0x0BAF, 0x9152, 0x091E, 0x9154, 0x0A32, 0x9156, 0x1B22,

+    0x9158, 0x1B23, 0x915B, 0x3B67, 0x9161, 0x3B68, 0x9162, 0x0A23,

+    0x9163, 0x1B24, 0x9164, 0x3B69, 0x9165, 0x1B25, 0x9169, 0x1B26,

+    0x916A, 0x0F59, 0x916C, 0x0941, 0x9172, 0x1B28, 0x9173, 0x1B27,

+    0x9175, 0x07EC, 0x9177, 0x0805, 0x9178, 0x088E, 0x9182, 0x1B2B,

+    0x9187, 0x0970, 0x9189, 0x1B2A, 0x918B, 0x1B29, 0x918D, 0x0B49,

+    0x918E, 0x3B6A, 0x9190, 0x07A3, 0x9192, 0x0A67, 0x9197, 0x0D44,

+    0x919C, 0x0943, 0x919E, 0x3B6B, 0x91A2, 0x1B2C, 0x91A4, 0x09C7,

+    0x91A8, 0x3B6C, 0x91AA, 0x1B2F, 0x91AB, 0x1B2D, 0x91AC, 0x1E1B,

+    0x91AD, 0x3B6D, 0x91AE, 0x3B6E, 0x91AF, 0x1B2E, 0x91B1, 0x1E61,

+    0x91B2, 0x3B6F, 0x91B4, 0x1B31, 0x91B5, 0x1B30, 0x91B8, 0x09E2,

+    0x91BA, 0x1B32, 0x91BC, 0x3B70, 0x91C0, 0x1B33, 0x91C1, 0x1B34,

+    0x91C6, 0x0D64, 0x91C7, 0x0843, 0x91C8, 0x090D, 0x91C9, 0x1B35,

+    0x91CB, 0x1B36, 0x91CC, 0x0F6C, 0x91CD, 0x094F, 0x91CE, 0x0EFA,

+    0x91CF, 0x0F94, 0x91D0, 0x1B37, 0x91D1, 0x06DA, 0x91D6, 0x1B38,

+    0x91D7, 0x21C0, 0x91D8, 0x0C1D, 0x91DA, 0x21BF, 0x91DB, 0x1B3B,

+    0x91DC, 0x05D6, 0x91DD, 0x0A11, 0x91DE, 0x21C1, 0x91DF, 0x1B39,

+    0x91E1, 0x1B3A, 0x91E3, 0x0BFC, 0x91E4, 0x21C4, 0x91E5, 0x21C5,

+    0x91E6, 0x0E83, 0x91E7, 0x06F4, 0x91ED, 0x21C2, 0x91EE, 0x21C3,

+    0x91F0, 0x3B71, 0x91F5, 0x1B3D, 0x91F6, 0x1B3E, 0x91F7, 0x3B72,

+    0x91FB, 0x3B73, 0x91FC, 0x1B3C, 0x91FF, 0x1B40, 0x9206, 0x21C6,

+    0x9207, 0x3B74, 0x920A, 0x21C8, 0x920D, 0x0CB7, 0x920E, 0x05A1,

+    0x9210, 0x21C7, 0x9211, 0x1B44, 0x9214, 0x1B41, 0x9215, 0x1B43,

+    0x921E, 0x1B3F, 0x9228, 0x3B75, 0x9229, 0x1B8A, 0x922C, 0x1B42,

+    0x9233, 0x3B76, 0x9234, 0x0FB3, 0x9237, 0x078E, 0x9238, 0x3B77,

+    0x9239, 0x21CF, 0x923A, 0x21C9, 0x923C, 0x21CB, 0x923F, 0x1B4C,

+    0x9240, 0x21CA, 0x9243, 0x3B78, 0x9244, 0x0C2E, 0x9245, 0x1B47,

+    0x9247, 0x3B79, 0x9248, 0x1B4A, 0x9249, 0x1B48, 0x924B, 0x1B4D,

+    0x924E, 0x21CC, 0x924F, 0x3B7A, 0x9250, 0x1B4E, 0x9251, 0x21CE,

+    0x9257, 0x1B46, 0x9259, 0x21CD, 0x925A, 0x1B53, 0x925B, 0x0516,

+    0x925E, 0x1B45, 0x9260, 0x3B7B, 0x9262, 0x0D41, 0x9264, 0x1B49,

+    0x9266, 0x09C8, 0x9267, 0x21D0, 0x9271, 0x07ED, 0x9277, 0x21D2,

+    0x9278, 0x21D3, 0x927E, 0x0E76, 0x9280, 0x06DC, 0x9283, 0x0950,

+    0x9285, 0x0C94, 0x9288, 0x20AA, 0x9291, 0x0AAF, 0x9293, 0x1B51,

+    0x9295, 0x1B4B, 0x9296, 0x1B50, 0x9298, 0x0ECF, 0x929A, 0x0BD4,

+    0x929B, 0x1B52, 0x929C, 0x1B4F, 0x92A7, 0x21D1, 0x92AD, 0x0AAE,

+    0x92B3, 0x3554, 0x92B7, 0x1B56, 0x92B9, 0x1B55, 0x92C2, 0x3B7C,

+    0x92CB, 0x3B7D, 0x92CC, 0x3B7E, 0x92CF, 0x1B54, 0x92D0, 0x21D7,

+    0x92D2, 0x0E5D, 0x92D3, 0x21DB, 0x92D5, 0x21D9, 0x92D7, 0x21D5,

+    0x92D9, 0x21D6, 0x92DF, 0x3B7F, 0x92E0, 0x21DA, 0x92E4, 0x0985,

+    0x92E7, 0x21D4, 0x92E9, 0x1B57, 0x92EA, 0x0E2F, 0x92ED, 0x04F6,

+    0x92F2, 0x0DB8, 0x92F3, 0x0BB0, 0x92F8, 0x0692, 0x92F9, 0x20B0,

+    0x92FA, 0x1B59, 0x92FB, 0x21DE, 0x92FC, 0x07EF, 0x92FF, 0x21E1,

+    0x9302, 0x21E3, 0x9304, 0x345A, 0x9306, 0x087A, 0x930D, 0x3B80,

+    0x930F, 0x1B58, 0x9310, 0x0A33, 0x9315, 0x3B81, 0x9318, 0x0A34,

+    0x9319, 0x1B5C, 0x931A, 0x1B5E, 0x931D, 0x21E2, 0x931E, 0x21E0,

+    0x931F, 0x3B82, 0x9320, 0x09E3, 0x9321, 0x21DD, 0x9322, 0x1B5D,

+    0x9323, 0x1B5F, 0x9325, 0x21DC, 0x9326, 0x06CB, 0x9327, 0x3B83,

+    0x9328, 0x0DB7, 0x932B, 0x090E, 0x932C, 0x0FC9, 0x932E, 0x1B5B,

+    0x932F, 0x0868, 0x9332, 0x0FE5, 0x9335, 0x1B61, 0x933A, 0x1B60,

+    0x933B, 0x1B62, 0x9344, 0x1B5A, 0x9347, 0x3B84, 0x9348, 0x20A9,

+    0x934A, 0x3458, 0x934B, 0x0CC1, 0x934D, 0x0C4F, 0x9352, 0x3B85,

+    0x9354, 0x0BF3, 0x9356, 0x1B67, 0x9357, 0x21E5, 0x935B, 0x0B81,

+    0x935C, 0x1B63, 0x9360, 0x1B64, 0x9365, 0x3B86, 0x936A, 0x3B87,

+    0x936C, 0x0703, 0x936D, 0x3B88, 0x936E, 0x1B66, 0x9370, 0x21E4,

+    0x9375, 0x0764, 0x937C, 0x1B65, 0x937E, 0x09C9, 0x938C, 0x05D7,

+    0x9394, 0x1B6B, 0x9396, 0x082F, 0x9397, 0x0AFB, 0x939A, 0x0BE6,

+    0x939B, 0x3B89, 0x93A4, 0x21E6, 0x93A7, 0x0599, 0x93A9, 0x3B8B,

+    0x93AC, 0x1B69, 0x93AD, 0x1B6A, 0x93AE, 0x0BDF, 0x93B0, 0x1B68,

+    0x93B9, 0x1B6C, 0x93BA, 0x3B8A, 0x93C1, 0x3B8C, 0x93C3, 0x1B72,

+    0x93C6, 0x21E7, 0x93C8, 0x1B75, 0x93CA, 0x3B8D, 0x93D0, 0x1B74,

+    0x93D1, 0x0C27, 0x93D6, 0x1B6D, 0x93D7, 0x1B6E, 0x93D8, 0x1B71,

+    0x93DD, 0x1B73, 0x93DE, 0x21E8, 0x93E1, 0x06B8, 0x93E2, 0x3B8E,

+    0x93E4, 0x1B76, 0x93E5, 0x1B70, 0x93E8, 0x1B6F, 0x93F8, 0x21E9,

+    0x93FA, 0x3B8F, 0x93FD, 0x3B90, 0x9403, 0x1B7A, 0x9407, 0x1B7B,

+    0x940F, 0x3B91, 0x9410, 0x1B7C, 0x9413, 0x1B79, 0x9414, 0x1B78,

+    0x9418, 0x09CA, 0x9419, 0x0C82, 0x941A, 0x1B77, 0x9421, 0x1B80,

+    0x942B, 0x1B7E, 0x9431, 0x21EA, 0x9434, 0x3B92, 0x9435, 0x1B7F,

+    0x9436, 0x1B7D, 0x9438, 0x0B58, 0x943A, 0x1B81, 0x943F, 0x3B93,

+    0x9441, 0x1B82, 0x9444, 0x1B84, 0x9445, 0x21EB, 0x9448, 0x21EC,

+    0x9451, 0x0611, 0x9452, 0x1B83, 0x9453, 0x0F06, 0x9455, 0x3B94,

+    0x945A, 0x1B8F, 0x945B, 0x1B85, 0x945E, 0x1B88, 0x9460, 0x1B86,

+    0x9462, 0x1B87, 0x946A, 0x1B89, 0x946B, 0x3B95, 0x9470, 0x1B8B,

+    0x9472, 0x3B96, 0x9475, 0x1B8C, 0x9477, 0x1B8D, 0x947C, 0x1B90,

+    0x947D, 0x1B8E, 0x947E, 0x1B91, 0x947F, 0x1B93, 0x9481, 0x1B92,

+    0x9577, 0x0BD5, 0x9578, 0x3B97, 0x9580, 0x0EF3, 0x9582, 0x1B94,

+    0x9583, 0x0AB0, 0x9587, 0x1B95, 0x9589, 0x0E14, 0x958A, 0x1B96,

+    0x958B, 0x0589, 0x958F, 0x04DE, 0x9591, 0x0613, 0x9592, 0x21ED,

+    0x9593, 0x0612, 0x9594, 0x1B97, 0x9596, 0x1B98, 0x9598, 0x1B99,

+    0x9599, 0x1B9A, 0x95A0, 0x1B9B, 0x95A2, 0x0614, 0x95A3, 0x05B3,

+    0x95A4, 0x07F0, 0x95A5, 0x0D4A, 0x95A6, 0x3B98, 0x95A7, 0x1B9D,

+    0x95A8, 0x1B9C, 0x95A9, 0x3B99, 0x95AB, 0x3B9A, 0x95AD, 0x1B9E,

+    0x95B1, 0x3555, 0x95B2, 0x04FE, 0x95B4, 0x3B9B, 0x95B9, 0x1BA1,

+    0x95BB, 0x1BA0, 0x95BC, 0x1B9F, 0x95BD, 0x3B9C, 0x95BE, 0x1BA2,

+    0x95C3, 0x1BA5, 0x95C7, 0x048B, 0x95CA, 0x1BA3, 0x95CC, 0x1BA7,

+    0x95CD, 0x1BA6, 0x95D4, 0x1BA9, 0x95D5, 0x1BA8, 0x95D6, 0x1BAA,

+    0x95D8, 0x0C86, 0x95DA, 0x3B9D, 0x95DC, 0x1BAB, 0x95E1, 0x1BAC,

+    0x95E2, 0x1BAE, 0x95E5, 0x1BAD, 0x961C, 0x0DDE, 0x961D, 0x3B9E,

+    0x9621, 0x1BAF, 0x9628, 0x1BB0, 0x962A, 0x0855, 0x962E, 0x1BB1,

+    0x962F, 0x1BB2, 0x9632, 0x0E77, 0x963B, 0x0ACD, 0x963F, 0x0468,

+    0x9640, 0x0B2B, 0x9641, 0x3B9F, 0x9642, 0x1BB3, 0x9644, 0x0DDF,

+    0x964B, 0x1BB6, 0x964C, 0x1BB4, 0x964D, 0x07F1, 0x964F, 0x1BB5,

+    0x9650, 0x0776, 0x9658, 0x3BA0, 0x965B, 0x0E15, 0x965C, 0x1BB8,

+    0x965D, 0x1BBA, 0x965E, 0x1BB9, 0x965F, 0x1BBB, 0x9662, 0x04C3,

+    0x9663, 0x0A1E, 0x9664, 0x0986, 0x9665, 0x0615, 0x9666, 0x1BBC,

+    0x966A, 0x0D1C, 0x966C, 0x1BBE, 0x9670, 0x04C4, 0x9672, 0x1BBD,

+    0x9673, 0x0BE0, 0x9675, 0x0F95, 0x9676, 0x0C83, 0x9677, 0x1BB7,

+    0x9678, 0x0F6E, 0x967A, 0x0765, 0x967D, 0x0F45, 0x9684, 0x3BA1,

+    0x9685, 0x06F1, 0x9686, 0x0F7C, 0x9688, 0x06FE, 0x968A, 0x0B42,

+    0x968B, 0x186C, 0x968D, 0x1BBF, 0x968E, 0x058A, 0x968F, 0x0A35,

+    0x9694, 0x05B4, 0x9695, 0x1BC1, 0x9697, 0x1BC2, 0x9698, 0x1BC0,

+    0x9699, 0x073A, 0x969B, 0x084D, 0x969C, 0x09CB, 0x969D, 0x21F0,

+    0x96A0, 0x04C5, 0x96A3, 0x0FA1, 0x96A4, 0x3BA2, 0x96A7, 0x1BC4,

+    0x96A8, 0x1B0B, 0x96A9, 0x3BA3, 0x96AA, 0x1BC3, 0x96AF, 0x21F1,

+    0x96B0, 0x1BC7, 0x96B1, 0x1BC5, 0x96B2, 0x1BC6, 0x96B4, 0x1BC8,

+    0x96B6, 0x1BC9, 0x96B7, 0x0FB4, 0x96B8, 0x1BCA, 0x96B9, 0x1BCB,

+    0x96BB, 0x0A6D, 0x96BC, 0x0D4F, 0x96C0, 0x0A43, 0x96C1, 0x0623,

+    0x96C4, 0x0F24, 0x96C5, 0x056D, 0x96C6, 0x0942, 0x96C7, 0x078F,

+    0x96C9, 0x1BCE, 0x96CB, 0x1BCD, 0x96CC, 0x08C1, 0x96CD, 0x1BCF,

+    0x96CE, 0x1BCC, 0x96D1, 0x0876, 0x96D2, 0x3BA4, 0x96D5, 0x1BD3,

+    0x96D6, 0x1992, 0x96D9, 0x10EB, 0x96DB, 0x0A3D, 0x96DC, 0x1BD1,

+    0x96DE, 0x3BA6, 0x96E2, 0x0F6D, 0x96E3, 0x0CC9, 0x96E8, 0x04CD,

+    0x96E9, 0x3BA7, 0x96EA, 0x0A87, 0x96EB, 0x08E2, 0x96F0, 0x0E07,

+    0x96F1, 0x3BA8, 0x96F2, 0x04E2, 0x96F6, 0x0FB5, 0x96F7, 0x0F55,

+    0x96F9, 0x1BD4, 0x96FB, 0x0C3F, 0x9700, 0x0927, 0x9702, 0x3BA9,

+    0x9704, 0x1BD5, 0x9706, 0x1BD6, 0x9707, 0x0A12, 0x9708, 0x1BD7,

+    0x9709, 0x3BAA, 0x970A, 0x0FB6, 0x970D, 0x1BD2, 0x970E, 0x1BD9,

+    0x970F, 0x1BDB, 0x9711, 0x1BDA, 0x9713, 0x1BD8, 0x9716, 0x1BDC,

+    0x9719, 0x1BDD, 0x971C, 0x0AFC, 0x971E, 0x0562, 0x9724, 0x1BDE,

+    0x9727, 0x0EC4, 0x972A, 0x1BDF, 0x9730, 0x1BE0, 0x9732, 0x0FD0,

+    0x9733, 0x21F2, 0x9738, 0x1414, 0x9739, 0x1BE1, 0x973B, 0x21F3,

+    0x973D, 0x1BE2, 0x973E, 0x1BE3, 0x9742, 0x1BE7, 0x9743, 0x21F4,

+    0x9744, 0x1BE4, 0x9746, 0x1BE5, 0x9748, 0x1BE6, 0x9749, 0x1BE8,

+    0x974D, 0x21F5, 0x974F, 0x21F6, 0x9751, 0x21F7, 0x9752, 0x0A68,

+    0x9755, 0x21F8, 0x9756, 0x0F03, 0x9759, 0x0A69, 0x975A, 0x3BAB,

+    0x975C, 0x1BE9, 0x975E, 0x0D87, 0x9760, 0x1BEA, 0x9761, 0x1D06,

+    0x9762, 0x0ED8, 0x9763, 0x3BAC, 0x9764, 0x1BEB, 0x9766, 0x1BEC,

+    0x9768, 0x1BED, 0x9769, 0x05B5, 0x976B, 0x1BEF, 0x976D, 0x0A1F,

+    0x976E, 0x3BAD, 0x9771, 0x1BF0, 0x9773, 0x3BAE, 0x9774, 0x06FA,

+    0x9779, 0x1BF1, 0x977A, 0x1BF5, 0x977C, 0x1BF3, 0x9781, 0x1BF4,

+    0x9784, 0x05D1, 0x9785, 0x1BF2, 0x9786, 0x1BF6, 0x978B, 0x1BF7,

+    0x978D, 0x048C, 0x978F, 0x1BF8, 0x9790, 0x1BF9, 0x9798, 0x09CC,

+    0x979A, 0x3BAF, 0x979C, 0x1BFA, 0x97A0, 0x0661, 0x97A2, 0x3BB0,

+    0x97A3, 0x1BFD, 0x97A6, 0x1BFC, 0x97A8, 0x1BFB, 0x97AB, 0x1A34,

+    0x97AD, 0x0E2C, 0x97B3, 0x1BFE, 0x97B4, 0x1BFF, 0x97B5, 0x3BB1,

+    0x97B6, 0x3BB2, 0x97C3, 0x1C00, 0x97C6, 0x1C01, 0x97C8, 0x1C02,

+    0x97CB, 0x1C03, 0x97D3, 0x0616, 0x97D9, 0x3BB3, 0x97DC, 0x1C04,

+    0x97DE, 0x3BB4, 0x97ED, 0x1C05, 0x97EE, 0x0CD9, 0x97F2, 0x1C07,

+    0x97F3, 0x053B, 0x97F4, 0x3BB5, 0x97F5, 0x1C0A, 0x97F6, 0x1C09,

+    0x97FB, 0x04C6, 0x97FF, 0x06B9, 0x9801, 0x0E17, 0x9802, 0x0BD6,

+    0x9803, 0x0812, 0x9805, 0x07F2, 0x9806, 0x0971, 0x9808, 0x0A22,

+    0x980A, 0x3BB6, 0x980C, 0x1C0C, 0x980E, 0x3BB7, 0x980F, 0x1C0B,

+    0x9810, 0x0F2C, 0x9811, 0x0624, 0x9812, 0x0D66, 0x9813, 0x0CB4,

+    0x9817, 0x0A42, 0x9818, 0x0F96, 0x981A, 0x0731, 0x981E, 0x3BB8,

+    0x9821, 0x1C0F, 0x9823, 0x3BB9, 0x9824, 0x1C0E, 0x982B, 0x3BBA,

+    0x982C, 0x0E79, 0x982D, 0x0C84, 0x9830, 0x1E73, 0x9834, 0x04F2,

+    0x9837, 0x1C10, 0x9838, 0x1C0D, 0x9839, 0x37B3, 0x983B, 0x0DC3,

+    0x983C, 0x0F54, 0x983D, 0x1C11, 0x983E, 0x3BBB, 0x9846, 0x1C12,

+    0x984B, 0x1C14, 0x984C, 0x0B4A, 0x984D, 0x05B9, 0x984E, 0x05BA,

+    0x984F, 0x1C13, 0x9852, 0x3BBC, 0x9853, 0x3BBD, 0x9854, 0x0625,

+    0x9855, 0x0766, 0x9857, 0x21F9, 0x9858, 0x0626, 0x9859, 0x3BBE,

+    0x985A, 0x1E48, 0x985B, 0x0C39, 0x985E, 0x0FA8, 0x9865, 0x21FA,

+    0x9867, 0x0790, 0x986B, 0x1C15, 0x986C, 0x3BBF, 0x986F, 0x1C16,

+    0x9870, 0x1C17, 0x9871, 0x1C18, 0x9873, 0x1C1A, 0x9874, 0x1C19,

+    0x98A8, 0x0DE9, 0x98AA, 0x1C1B, 0x98AF, 0x1C1C, 0x98B1, 0x1C1D,

+    0x98B6, 0x1C1E, 0x98B8, 0x3BC0, 0x98BA, 0x3BC1, 0x98BF, 0x3BC2,

+    0x98C3, 0x1C20, 0x98C4, 0x1C1F, 0x98C6, 0x1C21, 0x98C8, 0x3BC3,

+    0x98DB, 0x0D88, 0x98DC, 0x1839, 0x98DF, 0x09EF, 0x98E0, 0x3618,

+    0x98E2, 0x064C, 0x98E5, 0x3BC4, 0x98E9, 0x1C22, 0x98EB, 0x1C23,

+    0x98ED, 0x10C1, 0x98EE, 0x14DA, 0x98EF, 0x0D67, 0x98F2, 0x04BF,

+    0x98F4, 0x047F, 0x98FC, 0x08C2, 0x98FD, 0x0E5E, 0x98FE, 0x09E6,

+    0x9903, 0x1C24, 0x9905, 0x0EEB, 0x9909, 0x1C25, 0x990A, 0x0F46,

+    0x990C, 0x04E4, 0x9910, 0x088F, 0x9912, 0x1C26, 0x9913, 0x056E,

+    0x9914, 0x1C27, 0x9918, 0x1C28, 0x991D, 0x1C2A, 0x991E, 0x1C2B,

+    0x9920, 0x1C2D, 0x9921, 0x1C29, 0x9924, 0x1C2C, 0x9927, 0x21FD,

+    0x9928, 0x0617, 0x992C, 0x1C2E, 0x992E, 0x1C2F, 0x9932, 0x3BC5,

+    0x9933, 0x3BC6, 0x993D, 0x1C30, 0x993E, 0x1C31, 0x9940, 0x3BC7,

+    0x9942, 0x1C32, 0x9945, 0x1C34, 0x9949, 0x1C33, 0x994B, 0x1C36,

+    0x994C, 0x1C39, 0x994D, 0x3BC8, 0x9950, 0x1C35, 0x9951, 0x1C37,

+    0x9952, 0x1C38, 0x9955, 0x1C3A, 0x9957, 0x06BA, 0x995C, 0x3BC9,

+    0x995F, 0x3BCA, 0x9996, 0x091F, 0x9997, 0x1C3B, 0x9998, 0x1C3C,

+    0x9999, 0x07F3, 0x999E, 0x21FF, 0x99A5, 0x1C3D, 0x99A8, 0x059C,

+    0x99AC, 0x0D05, 0x99AD, 0x1C3E, 0x99AE, 0x1C3F, 0x99B1, 0x3BCB,

+    0x99B3, 0x0B98, 0x99B4, 0x0CC3, 0x99B9, 0x3BCC, 0x99BA, 0x3BCD,

+    0x99BC, 0x1C40, 0x99C1, 0x0D33, 0x99C4, 0x0B2C, 0x99C5, 0x04FA,

+    0x99C6, 0x06E6, 0x99C8, 0x06E7, 0x99C9, 0x3BCE, 0x99D0, 0x0BB1,

+    0x99D1, 0x1C45, 0x99D2, 0x06E8, 0x99D5, 0x056F, 0x99D8, 0x1C44,

+    0x99DB, 0x1C42, 0x99DD, 0x1C43, 0x99DF, 0x1C41, 0x99E2, 0x1C4F,

+    0x99ED, 0x1C46, 0x99EE, 0x1C47, 0x99F1, 0x1C48, 0x99F2, 0x1C49,

+    0x99F8, 0x1C4B, 0x99FB, 0x1C4A, 0x99FF, 0x0963, 0x9A01, 0x1C4C,

+    0x9A02, 0x3BCF, 0x9A05, 0x1C4E, 0x9A08, 0x37BA, 0x9A0E, 0x064D,

+    0x9A0F, 0x1C4D, 0x9A12, 0x0AFD, 0x9A13, 0x0767, 0x9A16, 0x3BD0,

+    0x9A19, 0x1C50, 0x9A24, 0x3BD1, 0x9A27, 0x3BD2, 0x9A28, 0x0B2D,

+    0x9A2B, 0x1C51, 0x9A2D, 0x3BD3, 0x9A2E, 0x3BD4, 0x9A30, 0x0C85,

+    0x9A36, 0x3BD5, 0x9A37, 0x1C52, 0x9A38, 0x3BD6, 0x9A3E, 0x1C57,

+    0x9A40, 0x1C55, 0x9A42, 0x1C54, 0x9A43, 0x1C56, 0x9A45, 0x1C53,

+    0x9A4A, 0x3BD7, 0x9A4D, 0x1C59, 0x9A4E, 0x2200, 0x9A52, 0x1E2F,

+    0x9A55, 0x1C58, 0x9A56, 0x3BD8, 0x9A57, 0x1C5B, 0x9A5A, 0x06BB,

+    0x9A5B, 0x1C5A, 0x9A5F, 0x1C5C, 0x9A62, 0x1C5D, 0x9A64, 0x1C5F,

+    0x9A65, 0x1C5E, 0x9A69, 0x1C60, 0x9A6A, 0x1C62, 0x9A6B, 0x1C61,

+    0x9AA8, 0x080E, 0x9AAD, 0x1C63, 0x9AB0, 0x1C64, 0x9AB5, 0x3BD9,

+    0x9AB6, 0x3BDA, 0x9AB8, 0x059A, 0x9ABC, 0x1C65, 0x9AC0, 0x1C66,

+    0x9AC4, 0x0A37, 0x9ACF, 0x1C67, 0x9AD1, 0x1C68, 0x9AD3, 0x1C69,

+    0x9AD4, 0x1C6A, 0x9AD8, 0x07F4, 0x9AD9, 0x2201, 0x9ADC, 0x2202,

+    0x9ADE, 0x1C6B, 0x9ADF, 0x1C6C, 0x9AE2, 0x1C6D, 0x9AE3, 0x1C6E,

+    0x9AE6, 0x1C6F, 0x9AEA, 0x0D45, 0x9AEB, 0x1C71, 0x9AED, 0x0D98,

+    0x9AEE, 0x1C72, 0x9AEF, 0x1C70, 0x9AF1, 0x1C74, 0x9AF4, 0x1C73,

+    0x9AF7, 0x1C75, 0x9AF9, 0x3BDB, 0x9AFB, 0x1C76, 0x9B03, 0x3BDC,

+    0x9B06, 0x1C77, 0x9B18, 0x1C78, 0x9B1A, 0x1C79, 0x9B1F, 0x1C7A,

+    0x9B20, 0x3BDD, 0x9B22, 0x1C7B, 0x9B23, 0x1C7C, 0x9B25, 0x1C7D,

+    0x9B27, 0x1C7E, 0x9B28, 0x1C7F, 0x9B29, 0x1C80, 0x9B2A, 0x1C81,

+    0x9B2D, 0x343C, 0x9B2E, 0x1C82, 0x9B2F, 0x1C83, 0x9B31, 0x14D4,

+    0x9B32, 0x1C84, 0x9B33, 0x3BDE, 0x9B34, 0x3BDF, 0x9B3B, 0x17A9,

+    0x9B3C, 0x064E, 0x9B41, 0x057F, 0x9B42, 0x0822, 0x9B43, 0x1C86,

+    0x9B44, 0x1C85, 0x9B45, 0x0EB1, 0x9B4D, 0x1C88, 0x9B4E, 0x1C89,

+    0x9B4F, 0x1C87, 0x9B51, 0x1C8A, 0x9B54, 0x0E90, 0x9B58, 0x1C8B,

+    0x9B5A, 0x0695, 0x9B6F, 0x0FCB, 0x9B72, 0x2204, 0x9B73, 0x3BE0,

+    0x9B74, 0x1C8C, 0x9B75, 0x2203, 0x9B79, 0x3BE1, 0x9B83, 0x1C8E,

+    0x9B8E, 0x0482, 0x9B8F, 0x2205, 0x9B91, 0x1C8F, 0x9B92, 0x0DFB,

+    0x9B93, 0x1C8D, 0x9B96, 0x1C90, 0x9B97, 0x1C91, 0x9B9F, 0x1C92,

+    0x9BA0, 0x1C93, 0x9BA7, 0x3BE2, 0x9BA8, 0x1C94, 0x9BAA, 0x0E9C,

+    0x9BAB, 0x087B, 0x9BAD, 0x086A, 0x9BAE, 0x0AB1, 0x9BB1, 0x2206,

+    0x9BB4, 0x1C95, 0x9BB9, 0x1C98, 0x9BBB, 0x2207, 0x9BC0, 0x1C96,

+    0x9BC1, 0x3BE3, 0x9BC6, 0x1C99, 0x9BC7, 0x3BE4, 0x9BC9, 0x07A5,

+    0x9BCA, 0x1C97, 0x9BCF, 0x1C9A, 0x9BD1, 0x1C9B, 0x9BD2, 0x1C9C,

+    0x9BD4, 0x1CA0, 0x9BD6, 0x0878, 0x9BD7, 0x3BE5, 0x9BDB, 0x0B44,

+    0x9BDF, 0x37BF, 0x9BE1, 0x1CA1, 0x9BE2, 0x1C9E, 0x9BE3, 0x1C9D,

+    0x9BE4, 0x1C9F, 0x9BE7, 0x3BE6, 0x9BE8, 0x0735, 0x9BEB, 0x3BE7,

+    0x9BF0, 0x1CA5, 0x9BF1, 0x1CA4, 0x9BF2, 0x1CA3, 0x9BF5, 0x0477,

+    0x9BF7, 0x3BE8, 0x9BFA, 0x3BE9, 0x9BFD, 0x3BEA, 0x9C00, 0x2208,

+    0x9C04, 0x1CAF, 0x9C06, 0x1CAB, 0x9C08, 0x1CAC, 0x9C09, 0x1CA8,

+    0x9C0A, 0x1CAE, 0x9C0B, 0x3BEB, 0x9C0C, 0x1CAA, 0x9C0D, 0x05C0,

+    0x9C10, 0x0FF2, 0x9C12, 0x1CAD, 0x9C13, 0x1CA9, 0x9C14, 0x1CA7,

+    0x9C15, 0x1CA6, 0x9C1B, 0x1CB1, 0x9C21, 0x1CB4, 0x9C24, 0x1CB3,

+    0x9C25, 0x1CB2, 0x9C27, 0x3BEC, 0x9C2A, 0x3BED, 0x9C2D, 0x0DBB,

+    0x9C2E, 0x1CB0, 0x9C2F, 0x04B7, 0x9C30, 0x1CB5, 0x9C32, 0x1CB7,

+    0x9C36, 0x3BEE, 0x9C39, 0x05CD, 0x9C3A, 0x1CA2, 0x9C3B, 0x04D9,

+    0x9C3E, 0x1CB9, 0x9C41, 0x3BEF, 0x9C46, 0x1CB8, 0x9C47, 0x1CB6,

+    0x9C48, 0x0B6B, 0x9C52, 0x0E9E, 0x9C53, 0x3BF0, 0x9C57, 0x0FA2,

+    0x9C5A, 0x1CBA, 0x9C60, 0x1CBB, 0x9C63, 0x3BF1, 0x9C67, 0x1CBC,

+    0x9C6A, 0x3BF2, 0x9C76, 0x1CBD, 0x9C77, 0x3BF3, 0x9C78, 0x1CBE,

+    0x9CE5, 0x0BD7, 0x9CE7, 0x1CBF, 0x9CE9, 0x0D4B, 0x9CEB, 0x1CC4,

+    0x9CEC, 0x1CC0, 0x9CF0, 0x1CC1, 0x9CF3, 0x0E5F, 0x9CF4, 0x0ED0,

+    0x9CF6, 0x0CA8, 0x9D02, 0x3BF4, 0x9D03, 0x1CC5, 0x9D06, 0x1CC6,

+    0x9D07, 0x0C96, 0x9D08, 0x1CC3, 0x9D09, 0x1CC2, 0x9D0E, 0x052A,

+    0x9D12, 0x1CCE, 0x9D15, 0x1CCD, 0x9D1B, 0x0517, 0x9D1F, 0x1CCB,

+    0x9D23, 0x1CCA, 0x9D26, 0x1CC8, 0x9D28, 0x05D9, 0x9D2A, 0x1CC7,

+    0x9D2B, 0x08DE, 0x9D2C, 0x0529, 0x9D3B, 0x07F5, 0x9D3E, 0x1CD1,

+    0x9D3F, 0x1CD0, 0x9D41, 0x1CCF, 0x9D42, 0x3BF5, 0x9D44, 0x1CCC,

+    0x9D46, 0x1CD2, 0x9D47, 0x3BF6, 0x9D48, 0x1CD3, 0x9D50, 0x1CD8,

+    0x9D51, 0x1CD7, 0x9D59, 0x1CD9, 0x9D5C, 0x04CF, 0x9D5D, 0x1CD4,

+    0x9D5E, 0x1CD5, 0x9D60, 0x0806, 0x9D61, 0x0EC5, 0x9D63, 0x3BF7,

+    0x9D64, 0x1CD6, 0x9D69, 0x3BF8, 0x9D6B, 0x220A, 0x9D6C, 0x0E60,

+    0x9D6F, 0x1CDE, 0x9D70, 0x2209, 0x9D72, 0x1CDA, 0x9D7A, 0x1CDF,

+    0x9D7C, 0x3BF9, 0x9D7E, 0x3BFA, 0x9D87, 0x1CDC, 0x9D89, 0x1CDB,

+    0x9D8D, 0x3BFB, 0x9D8F, 0x0732, 0x9D9A, 0x1CE0, 0x9DA4, 0x1CE1,

+    0x9DA9, 0x1CE2, 0x9DAB, 0x1CDD, 0x9DAF, 0x1CC9, 0x9DB1, 0x3BFC,

+    0x9DB2, 0x1CE3, 0x9DB4, 0x0BFD, 0x9DB8, 0x1CE7, 0x9DBA, 0x1CE8,

+    0x9DBB, 0x1CE6, 0x9DC1, 0x1CE5, 0x9DC2, 0x1CEB, 0x9DC3, 0x3BFD,

+    0x9DC4, 0x1CE4, 0x9DC6, 0x1CE9, 0x9DC7, 0x3BFE, 0x9DCF, 0x1CEA,

+    0x9DD3, 0x1CED, 0x9DD6, 0x3BFF, 0x9DD7, 0x1DDE, 0x9DD9, 0x1CEC,

+    0x9DDF, 0x3C00, 0x9DE6, 0x1CEF, 0x9DEB, 0x3C01, 0x9DED, 0x1CF0,

+    0x9DEF, 0x1CF1, 0x9DF2, 0x0FEF, 0x9DF4, 0x3C02, 0x9DF8, 0x1CEE,

+    0x9DF9, 0x0B4B, 0x9DFA, 0x085D, 0x9DFD, 0x1CF2, 0x9E15, 0x3C03,

+    0x9E19, 0x220C, 0x9E1A, 0x1CF3, 0x9E1B, 0x1CF4, 0x9E1D, 0x3C04,

+    0x9E1E, 0x1CF5, 0x9E75, 0x1CF6, 0x9E78, 0x0768, 0x9E79, 0x1CF7,

+    0x9E7C, 0x1DFD, 0x9E7D, 0x1CF8, 0x9E7F, 0x08DB, 0x9E81, 0x1CF9,

+    0x9E88, 0x1CFA, 0x9E8B, 0x1CFB, 0x9E8C, 0x1CFC, 0x9E91, 0x1CFF,

+    0x9E92, 0x1CFD, 0x9E93, 0x0FE2, 0x9E95, 0x1CFE, 0x9E97, 0x0FB7,

+    0x9E9D, 0x1D00, 0x9E9F, 0x0FA3, 0x9EA4, 0x3C05, 0x9EA5, 0x1D01,

+    0x9EA6, 0x0D34, 0x9EA8, 0x3C06, 0x9EA9, 0x1D02, 0x9EAA, 0x1D04,

+    0x9EAC, 0x3C07, 0x9EAD, 0x1D05, 0x9EB4, 0x1E02, 0x9EB5, 0x1E75,

+    0x9EB8, 0x1D03, 0x9EB9, 0x07FF, 0x9EBA, 0x0ED9, 0x9EBB, 0x0E91,

+    0x9EBC, 0x1284, 0x9EBE, 0x14FF, 0x9EBF, 0x0EA9, 0x9EC3, 0x340B,

+    0x9EC4, 0x052B, 0x9ECC, 0x1D07, 0x9ECD, 0x066A, 0x9ECE, 0x1D08,

+    0x9ECF, 0x1D09, 0x9ED0, 0x1D0A, 0x9ED1, 0x220D, 0x9ED2, 0x0807,

+    0x9ED4, 0x1D0B, 0x9ED8, 0x160D, 0x9ED9, 0x0EE7, 0x9EDB, 0x0B43,

+    0x9EDC, 0x1D0C, 0x9EDD, 0x1D0E, 0x9EDE, 0x1D0D, 0x9EE0, 0x1D0F,

+    0x9EE5, 0x1D10, 0x9EE7, 0x3C08, 0x9EE8, 0x1D11, 0x9EEE, 0x3C09,

+    0x9EEF, 0x1D12, 0x9EF4, 0x1D13, 0x9EF6, 0x1D14, 0x9EF7, 0x1D15,

+    0x9EF9, 0x1D16, 0x9EFB, 0x1D17, 0x9EFC, 0x1D18, 0x9EFD, 0x1D19,

+    0x9F07, 0x1D1A, 0x9F08, 0x1D1B, 0x9F0E, 0x0C1E, 0x9F10, 0x3C0A,

+    0x9F12, 0x3C0B, 0x9F13, 0x0791, 0x9F15, 0x1D1D, 0x9F17, 0x3C0C,

+    0x9F19, 0x3C0D, 0x9F20, 0x0ACF, 0x9F21, 0x1D1E, 0x9F2C, 0x1D1F,

+    0x9F2F, 0x3C0E, 0x9F37, 0x3C0F, 0x9F39, 0x3C10, 0x9F3B, 0x0D93,

+    0x9F3E, 0x1D20, 0x9F41, 0x3C11, 0x9F45, 0x3C12, 0x9F4A, 0x1D21,

+    0x9F4B, 0x170A, 0x9F4E, 0x1A7B, 0x9F4F, 0x1C06, 0x9F52, 0x1D22,

+    0x9F54, 0x1D23, 0x9F57, 0x3C13, 0x9F5F, 0x1D25, 0x9F60, 0x1D26,

+    0x9F61, 0x1D27, 0x9F62, 0x0FB8, 0x9F63, 0x1D24, 0x9F66, 0x1D28,

+    0x9F67, 0x1D29, 0x9F68, 0x3C14, 0x9F6A, 0x1D2B, 0x9F6C, 0x1D2A,

+    0x9F71, 0x3C15, 0x9F72, 0x1D2D, 0x9F75, 0x3C16, 0x9F76, 0x1D2E,

+    0x9F77, 0x1D2C, 0x9F8D, 0x0F7E, 0x9F90, 0x3C17, 0x9F94, 0x3C18,

+    0x9F95, 0x1D2F, 0x9F9C, 0x1D30, 0x9F9D, 0x1727, 0x9FA0, 0x1D31,

+    0x9FA2, 0x3C19, 0xF929, 0x2129, 0xF9DC, 0x21EE, 0xFA0E, 0x20DA,

+    0xFA0F, 0x20E5, 0xFA10, 0x20E6, 0xFA11, 0x20FB, 0xFA12, 0x2121,

+    0xFA13, 0x2131, 0xFA14, 0x2133, 0xFA15, 0x215E, 0xFA16, 0x2164,

+    0xFA17, 0x217B, 0xFA18, 0x2183, 0xFA19, 0x2184, 0xFA1A, 0x2185,

+    0xFA1B, 0x2187, 0xFA1C, 0x218B, 0xFA1D, 0x218E, 0xFA1E, 0x2197,

+    0xFA1F, 0x21A2, 0xFA20, 0x21A4, 0xFA21, 0x21A5, 0xFA22, 0x21AE,

+    0xFA23, 0x21B6, 0xFA24, 0x21B8, 0xFA25, 0x21B9, 0xFA26, 0x21BC,

+    0xFA27, 0x21D8, 0xFA28, 0x21DF, 0xFA29, 0x21EF, 0xFA2A, 0x21FB,

+    0xFA2B, 0x21FC, 0xFA2C, 0x21FE, 0xFA2D, 0x220B, 0xFB00, 0x248E,

+    0xFB01, 0x0070, 0xFB02, 0x0071, 0xFB03, 0x248F, 0xFB04, 0x2490,

+    0xFE30, 0x1EDA, 0xFE31, 0x1ED4, 0xFE32, 0x1ED5, 0xFE33, 0x1ED2,

+    0xFE35, 0x1EDB, 0xFE36, 0x1EDC, 0xFE37, 0x1EE1, 0xFE38, 0x1EE2,

+    0xFE39, 0x1EDD, 0xFE3A, 0x1EDE, 0xFE3B, 0x1EEB, 0xFE3C, 0x1EEC,

+    0xFE3D, 0x1EE5, 0xFE3E, 0x1EE6, 0xFE3F, 0x1EE3, 0xFE40, 0x1EE4,

+    0xFE41, 0x1EE7, 0xFE42, 0x1EE8, 0xFE43, 0x1EE9, 0xFE44, 0x1EEA,

+    0xFF01, 0x0282, 0xFF02, 0x1F47, 0xFF03, 0x02CC, 0xFF04, 0x02C8,

+    0xFF05, 0x02CB, 0xFF06, 0x02CD, 0xFF07, 0x1F46, 0xFF08, 0x02A2,

+    0xFF09, 0x02A3, 0xFF0A, 0x02CE, 0xFF0B, 0x02B4, 0xFF0C, 0x027C,

+    0xFF0D, 0x02B5, 0xFF0E, 0x027D, 0xFF0F, 0x0297, 0xFF10, 0x030C,

+    0xFF11, 0x030D, 0xFF12, 0x030E, 0xFF13, 0x030F, 0xFF14, 0x0310,

+    0xFF15, 0x0311, 0xFF16, 0x0312, 0xFF17, 0x0313, 0xFF18, 0x0314,

+    0xFF19, 0x0315, 0xFF1A, 0x027F, 0xFF1B, 0x0280, 0xFF1C, 0x02BB,

+    0xFF1D, 0x02B9, 0xFF1E, 0x02BC, 0xFF1F, 0x0281, 0xFF20, 0x02CF,

+    0xFF21, 0x0316, 0xFF22, 0x0317, 0xFF23, 0x0318, 0xFF24, 0x0319,

+    0xFF25, 0x031A, 0xFF26, 0x031B, 0xFF27, 0x031C, 0xFF28, 0x031D,

+    0xFF29, 0x031E, 0xFF2A, 0x031F, 0xFF2B, 0x0320, 0xFF2C, 0x0321,

+    0xFF2D, 0x0322, 0xFF2E, 0x0323, 0xFF2F, 0x0324, 0xFF30, 0x0325,

+    0xFF31, 0x0326, 0xFF32, 0x0327, 0xFF33, 0x0328, 0xFF34, 0x0329,

+    0xFF35, 0x032A, 0xFF36, 0x032B, 0xFF37, 0x032C, 0xFF38, 0x032D,

+    0xFF39, 0x032E, 0xFF3A, 0x032F, 0xFF3B, 0x02A6, 0xFF3C, 0x0298,

+    0xFF3D, 0x02A7, 0xFF3E, 0x0288, 0xFF3F, 0x028A, 0xFF40, 0x0286,

+    0xFF41, 0x0330, 0xFF42, 0x0331, 0xFF43, 0x0332, 0xFF44, 0x0333,

+    0xFF45, 0x0334, 0xFF46, 0x0335, 0xFF47, 0x0336, 0xFF48, 0x0337,

+    0xFF49, 0x0338, 0xFF4A, 0x0339, 0xFF4B, 0x033A, 0xFF4C, 0x033B,

+    0xFF4D, 0x033C, 0xFF4E, 0x033D, 0xFF4F, 0x033E, 0xFF50, 0x033F,

+    0xFF51, 0x0340, 0xFF52, 0x0341, 0xFF53, 0x0342, 0xFF54, 0x0343,

+    0xFF55, 0x0344, 0xFF56, 0x0345, 0xFF57, 0x0346, 0xFF58, 0x0347,

+    0xFF59, 0x0348, 0xFF5A, 0x0349, 0xFF5B, 0x02A8, 0xFF5C, 0x029B,

+    0xFF5D, 0x02A9, 0xFF5E, 0x0299, 0xFF61, 0x0147, 0xFF62, 0x0148,

+    0xFF63, 0x0149, 0xFF64, 0x014A, 0xFF65, 0x014B, 0xFF66, 0x014C,

+    0xFF67, 0x014D, 0xFF68, 0x014E, 0xFF69, 0x014F, 0xFF6A, 0x0150,

+    0xFF6B, 0x0151, 0xFF6C, 0x0152, 0xFF6D, 0x0153, 0xFF6E, 0x0154,

+    0xFF6F, 0x0155, 0xFF70, 0x0156, 0xFF71, 0x0157, 0xFF72, 0x0158,

+    0xFF73, 0x0159, 0xFF74, 0x015A, 0xFF75, 0x015B, 0xFF76, 0x015C,

+    0xFF77, 0x015D, 0xFF78, 0x015E, 0xFF79, 0x015F, 0xFF7A, 0x0160,

+    0xFF7B, 0x0161, 0xFF7C, 0x0162, 0xFF7D, 0x0163, 0xFF7E, 0x0164,

+    0xFF7F, 0x0165, 0xFF80, 0x0166, 0xFF81, 0x0167, 0xFF82, 0x0168,

+    0xFF83, 0x0169, 0xFF84, 0x016A, 0xFF85, 0x016B, 0xFF86, 0x016C,

+    0xFF87, 0x016D, 0xFF88, 0x016E, 0xFF89, 0x016F, 0xFF8A, 0x0170,

+    0xFF8B, 0x0171, 0xFF8C, 0x0172, 0xFF8D, 0x0173, 0xFF8E, 0x0174,

+    0xFF8F, 0x0175, 0xFF90, 0x0176, 0xFF91, 0x0177, 0xFF92, 0x0178,

+    0xFF93, 0x0179, 0xFF94, 0x017A, 0xFF95, 0x017B, 0xFF96, 0x017C,

+    0xFF97, 0x017D, 0xFF98, 0x017E, 0xFF99, 0x017F, 0xFF9A, 0x0180,

+    0xFF9B, 0x0181, 0xFF9C, 0x0182, 0xFF9D, 0x0183, 0xFF9E, 0x0184,

+    0xFF9F, 0x0185, 0xFFE0, 0x02C9, 0xFFE1, 0x02CA, 0xFFE2, 0x02EF,

+    0xFFE3, 0x0289, 0xFFE4, 0x1F45, 0xFFE5, 0x02C7, 0xFFE8, 0x0143,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp
new file mode 100644
index 0000000..52f1008
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp
@@ -0,0 +1,71 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_UniJIS_UCS2_V_4[251 * 2] = {

+    0x00B0, 0x204D, 0x2010, 0x1ED5, 0x2015, 0x1ED4, 0x2016, 0x1ED7,

+    0x2018, 0x2059, 0x2019, 0x205A, 0x201C, 0x2057, 0x201D, 0x2058,

+    0x2025, 0x1EDA, 0x2026, 0x1ED9, 0x2032, 0x2051, 0x2033, 0x205B,

+    0x2190, 0x02E2, 0x2191, 0x02E0, 0x2192, 0x02E3, 0x2193, 0x02E1,

+    0x2195, 0x2FB6, 0x21C4, 0x2077, 0x21C5, 0x2076, 0x21C6, 0x2078,

+    0x21E6, 0x1F4C, 0x21E7, 0x1F4E, 0x21E8, 0x1F4B, 0x21E9, 0x1F4D,

+    0x2225, 0x1ED7, 0x223C, 0x1ED6, 0x22EF, 0x1ED9, 0x2500, 0x1D39,

+    0x2501, 0x1D3A, 0x2502, 0x1D37, 0x2503, 0x1D38, 0x2504, 0x1D3D,

+    0x2505, 0x1D3E, 0x2506, 0x1D3B, 0x2507, 0x1D3C, 0x2508, 0x1D41,

+    0x2509, 0x1D42, 0x250A, 0x1D3F, 0x250B, 0x1D40, 0x250C, 0x1D47,

+    0x250D, 0x1D49, 0x250E, 0x1D48, 0x250F, 0x1D4A, 0x2510, 0x1D4F,

+    0x2511, 0x1D51, 0x2512, 0x1D50, 0x2513, 0x1D52, 0x2514, 0x1D43,

+    0x2515, 0x1D45, 0x2516, 0x1D44, 0x2517, 0x1D46, 0x2518, 0x1D4B,

+    0x2519, 0x1D4D, 0x251A, 0x1D4C, 0x251B, 0x1D4E, 0x251C, 0x1D63,

+    0x251D, 0x1D67, 0x251E, 0x1D65, 0x251F, 0x1D64, 0x2520, 0x1D66,

+    0x2521, 0x1D69, 0x2522, 0x1D68, 0x2523, 0x1D6A, 0x2524, 0x1D6B,

+    0x2525, 0x1D6F, 0x2526, 0x1D6D, 0x2527, 0x1D6C, 0x2528, 0x1D6E,

+    0x2529, 0x1D71, 0x252A, 0x1D70, 0x252B, 0x1D72, 0x252C, 0x1D5B,

+    0x252D, 0x1D5D, 0x252E, 0x1D5E, 0x252F, 0x1D5F, 0x2530, 0x1D5C,

+    0x2531, 0x1D60, 0x2532, 0x1D61, 0x2533, 0x1D62, 0x2534, 0x1D53,

+    0x2535, 0x1D55, 0x2536, 0x1D56, 0x2537, 0x1D57, 0x2538, 0x1D54,

+    0x2539, 0x1D58, 0x253A, 0x1D59, 0x253B, 0x1D5A, 0x253D, 0x1D77,

+    0x253E, 0x1D78, 0x253F, 0x1D79, 0x2540, 0x1D75, 0x2541, 0x1D74,

+    0x2542, 0x1D76, 0x2543, 0x1D7B, 0x2544, 0x1D7D, 0x2545, 0x1D7A,

+    0x2546, 0x1D7C, 0x2547, 0x1D81, 0x2548, 0x1D80, 0x2549, 0x1D7E,

+    0x254A, 0x1D7F, 0x261C, 0x201D, 0x261D, 0x201B, 0x261E, 0x201E,

+    0x261F, 0x201C, 0x2702, 0x2F92, 0x27A1, 0x2011, 0x3001, 0x1ECF,

+    0x3002, 0x1ED0, 0x3008, 0x1EE3, 0x3009, 0x1EE4, 0x300A, 0x1EE5,

+    0x300B, 0x1EE6, 0x300C, 0x1EE7, 0x300D, 0x1EE8, 0x300E, 0x1EE9,

+    0x300F, 0x1EEA, 0x3010, 0x1EEB, 0x3011, 0x1EEC, 0x3013, 0x204E,

+    0x3014, 0x1EDD, 0x3015, 0x1EDE, 0x301C, 0x1ED6, 0x301D, 0x1F14,

+    0x301F, 0x1F15, 0x3041, 0x1EEE, 0x3043, 0x1EEF, 0x3045, 0x1EF0,

+    0x3047, 0x1EF1, 0x3049, 0x1EF2, 0x3063, 0x1EF3, 0x3083, 0x1EF4,

+    0x3085, 0x1EF5, 0x3087, 0x1EF6, 0x308E, 0x1EF7, 0x309B, 0x2050,

+    0x309C, 0x204F, 0x30A1, 0x1EF8, 0x30A3, 0x1EF9, 0x30A5, 0x1EFA,

+    0x30A7, 0x1EFB, 0x30A9, 0x1EFC, 0x30C3, 0x1EFD, 0x30E3, 0x1EFE,

+    0x30E5, 0x1EFF, 0x30E7, 0x1F00, 0x30EE, 0x1F01, 0x30F5, 0x1F02,

+    0x30F6, 0x1F03, 0x30FC, 0x1ED3, 0x3300, 0x209E, 0x3301, 0x2EB6,

+    0x3302, 0x2EB7, 0x3303, 0x2092, 0x3304, 0x2EB8, 0x3305, 0x208D,

+    0x3306, 0x2EB9, 0x3307, 0x2EBD, 0x3308, 0x2EBB, 0x3309, 0x2EC0,

+    0x330A, 0x2EBE, 0x330B, 0x2EC2, 0x330C, 0x2EC4, 0x330D, 0x1F0E,

+    0x330E, 0x2EC5, 0x330F, 0x2EC6, 0x3310, 0x2EC7, 0x3311, 0x2EC8,

+    0x3312, 0x2EC9, 0x3313, 0x2ECA, 0x3314, 0x1F05, 0x3315, 0x2094,

+    0x3316, 0x208A, 0x3317, 0x2ECC, 0x3318, 0x2093, 0x3319, 0x2ECE,

+    0x331A, 0x2ED0, 0x331B, 0x2ED1, 0x331C, 0x2ED2, 0x331D, 0x2ED3,

+    0x331E, 0x20A1, 0x331F, 0x2ED4, 0x3320, 0x2ED5, 0x3321, 0x2ED6,

+    0x3322, 0x2089, 0x3323, 0x209C, 0x3324, 0x2ED7, 0x3325, 0x2ED9,

+    0x3326, 0x1F0F, 0x3327, 0x1F09, 0x3328, 0x2EDC, 0x3329, 0x2EDD,

+    0x332A, 0x20A4, 0x332B, 0x1F11, 0x332D, 0x2EDF, 0x332E, 0x2EE2,

+    0x332F, 0x2EE3, 0x3330, 0x2EE4, 0x3331, 0x20A6, 0x3332, 0x2EE5,

+    0x3333, 0x208E, 0x3334, 0x2EE8, 0x3335, 0x2EE9, 0x3336, 0x1F0B,

+    0x3337, 0x2EEE, 0x3338, 0x2EF0, 0x3339, 0x2097, 0x333A, 0x2EF1,

+    0x333B, 0x209D, 0x333C, 0x2EEA, 0x333D, 0x2EF2, 0x333E, 0x2EF4,

+    0x333F, 0x2EF5, 0x3340, 0x2EF6, 0x3341, 0x2EF3, 0x3342, 0x209B,

+    0x3343, 0x2EF7, 0x3344, 0x2EF8, 0x3345, 0x2EF9, 0x3346, 0x2EFA,

+    0x3347, 0x20A5, 0x3348, 0x2EFB, 0x3349, 0x1F04, 0x334A, 0x1F12,

+    0x334B, 0x2EFC, 0x334C, 0x2EFD, 0x334D, 0x1F07, 0x334E, 0x2091,

+    0x334F, 0x2EFE, 0x3350, 0x2EFF, 0x3351, 0x1F0C, 0x3352, 0x2F02,

+    0x3353, 0x2F06, 0x3354, 0x2F03, 0x3355, 0x2F07, 0x3356, 0x2F08,

+    0x3357, 0x2098, 0x337F, 0x2084, 0xFF08, 0x1EDB, 0xFF09, 0x1EDC,

+    0xFF0C, 0x204C, 0xFF0E, 0x2052, 0xFF1D, 0x1EED, 0xFF3B, 0x1EDF,

+    0xFF3D, 0x1EE0, 0xFF3F, 0x1ED2, 0xFF5B, 0x1EE1, 0xFF5C, 0x1ED8,

+    0xFF5D, 0x1EE2, 0xFF5E, 0x1ED6, 0xFFE3, 0x1ED1,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp
new file mode 100644
index 0000000..1cc2312
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp
@@ -0,0 +1,3449 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_UniJIS_UTF16_H_5[13241 * 2] = {

+    0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,

+    0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,

+    0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,

+    0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,

+    0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,

+    0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,

+    0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,

+    0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,

+    0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,

+    0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,

+    0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,

+    0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,

+    0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,

+    0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,

+    0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,

+    0x005C, 0x0061, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,

+    0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,

+    0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,

+    0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,

+    0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,

+    0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,

+    0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,

+    0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,

+    0x007C, 0x0063, 0x007D, 0x005E, 0x007E, 0x0064, 0x00A0, 0x0001,

+    0x00A1, 0x0065, 0x00A2, 0x0066, 0x00A3, 0x0067, 0x00A4, 0x006B,

+    0x00A5, 0x003D, 0x00A6, 0x005D, 0x00A7, 0x02D0, 0x00A8, 0x0287,

+    0x00A9, 0x0098, 0x00AA, 0x008C, 0x00AB, 0x006D, 0x00AC, 0x0099,

+    0x00AD, 0x0097, 0x00AE, 0x009A, 0x00AF, 0x0081, 0x00B0, 0x02C3,

+    0x00B1, 0x02B6, 0x00B2, 0x009D, 0x00B3, 0x009E, 0x00B4, 0x0285,

+    0x00B5, 0x009F, 0x00B6, 0x030A, 0x00B7, 0x0075, 0x00B8, 0x0086,

+    0x00B9, 0x00A0, 0x00BA, 0x0090, 0x00BB, 0x007B, 0x00BC, 0x00A1,

+    0x00BD, 0x00A2, 0x00BE, 0x00A3, 0x00BF, 0x007E, 0x00C0, 0x00A4,

+    0x00C1, 0x00A5, 0x00C2, 0x00A6, 0x00C3, 0x00A7, 0x00C4, 0x00A8,

+    0x00C5, 0x00A9, 0x00C6, 0x008B, 0x00C7, 0x00AA, 0x00C8, 0x00AB,

+    0x00C9, 0x00AC, 0x00CA, 0x00AD, 0x00CB, 0x00AE, 0x00CC, 0x00AF,

+    0x00CD, 0x00B0, 0x00CE, 0x00B1, 0x00CF, 0x00B2, 0x00D0, 0x00B3,

+    0x00D1, 0x00B4, 0x00D2, 0x00B5, 0x00D3, 0x00B6, 0x00D4, 0x00B7,

+    0x00D5, 0x00B8, 0x00D6, 0x00B9, 0x00D7, 0x02B7, 0x00D8, 0x008E,

+    0x00D9, 0x00BB, 0x00DA, 0x00BC, 0x00DB, 0x00BD, 0x00DC, 0x00BE,

+    0x00DD, 0x00BF, 0x00DE, 0x00C0, 0x00DF, 0x0096, 0x00E0, 0x00C1,

+    0x00E1, 0x00C2, 0x00E2, 0x00C3, 0x00E3, 0x00C4, 0x00E4, 0x00C5,

+    0x00E5, 0x00C6, 0x00E6, 0x0091, 0x00E7, 0x00C7, 0x00E8, 0x00C8,

+    0x00E9, 0x00C9, 0x00EA, 0x00CA, 0x00EB, 0x00CB, 0x00EC, 0x00CC,

+    0x00ED, 0x00CD, 0x00EE, 0x00CE, 0x00EF, 0x00CF, 0x00F0, 0x00D0,

+    0x00F1, 0x00D1, 0x00F2, 0x00D2, 0x00F3, 0x00D3, 0x00F4, 0x00D4,

+    0x00F5, 0x00D5, 0x00F6, 0x00D6, 0x00F7, 0x02B8, 0x00F8, 0x0094,

+    0x00F9, 0x00D8, 0x00FA, 0x00D9, 0x00FB, 0x00DA, 0x00FC, 0x00DB,

+    0x00FD, 0x00DC, 0x00FE, 0x00DD, 0x00FF, 0x00DE, 0x0100, 0x2496,

+    0x0101, 0x2491, 0x0102, 0x3D8C, 0x0103, 0x3D99, 0x0104, 0x3D79,

+    0x0105, 0x3D81, 0x0106, 0x3D8E, 0x0107, 0x3D9B, 0x0108, 0x3DA7,

+    0x0109, 0x3DAD, 0x010C, 0x3D8F, 0x010D, 0x3D9C, 0x010E, 0x3D91,

+    0x010F, 0x3D9E, 0x0111, 0x3D9F, 0x0112, 0x2499, 0x0113, 0x2494,

+    0x0118, 0x3D90, 0x0119, 0x3D9D, 0x011A, 0x24B3, 0x011B, 0x24BF,

+    0x011C, 0x3DA8, 0x011D, 0x3DAE, 0x0124, 0x3DA9, 0x0125, 0x3DAF,

+    0x0127, 0x3DC8, 0x0128, 0x24B8, 0x0129, 0x24C4, 0x012A, 0x2497,

+    0x012B, 0x2492, 0x0131, 0x0092, 0x0134, 0x3DAA, 0x0135, 0x3DB0,

+    0x0139, 0x3D8D, 0x013A, 0x3D9A, 0x013D, 0x3D7B, 0x013E, 0x3D83,

+    0x0141, 0x008D, 0x0142, 0x0093, 0x0143, 0x3D92, 0x0144, 0x3DA0,

+    0x0147, 0x3D93, 0x0148, 0x3DA1, 0x014B, 0x24DC, 0x014C, 0x249A,

+    0x014D, 0x2495, 0x0150, 0x3D94, 0x0151, 0x3DA2, 0x0152, 0x008F,

+    0x0153, 0x0095, 0x0154, 0x3D8B, 0x0155, 0x3D98, 0x0158, 0x3D95,

+    0x0159, 0x3DA3, 0x015A, 0x3D7C, 0x015B, 0x3D84, 0x015C, 0x3DAB,

+    0x015D, 0x3DB1, 0x015E, 0x3D7D, 0x015F, 0x3D86, 0x0160, 0x00DF,

+    0x0161, 0x00E3, 0x0162, 0x3D97, 0x0163, 0x3DA5, 0x0164, 0x3D7E,

+    0x0165, 0x3D87, 0x0168, 0x24BD, 0x0169, 0x24C9, 0x016A, 0x2498,

+    0x016B, 0x2493, 0x016C, 0x3DAC, 0x016D, 0x3DB2, 0x016E, 0x24BC,

+    0x016F, 0x24C8, 0x0170, 0x3D96, 0x0171, 0x3DA4, 0x0178, 0x00E0,

+    0x0179, 0x3D7F, 0x017A, 0x3D88, 0x017B, 0x3D80, 0x017C, 0x3D8A,

+    0x017D, 0x00E1, 0x017E, 0x00E5, 0x0192, 0x0069, 0x0193, 0x3DD2,

+    0x01C2, 0x3DCD, 0x01CD, 0x24B2, 0x01CE, 0x24BE, 0x01CF, 0x24B6,

+    0x01D0, 0x24C2, 0x01D1, 0x24B9, 0x01D2, 0x24C5, 0x01D3, 0x24BB,

+    0x01D4, 0x24C7, 0x01D6, 0x3D75, 0x01D8, 0x3D76, 0x01DA, 0x3D77,

+    0x01DC, 0x3D78, 0x01F8, 0x3D73, 0x01F9, 0x3D74, 0x01FD, 0x24CD,

+    0x0250, 0x3DD8, 0x0251, 0x24CA, 0x0252, 0x3DDC, 0x0253, 0x3DCE,

+    0x0254, 0x24CF, 0x0255, 0x3DE1, 0x0256, 0x3DBA, 0x0257, 0x3DCF,

+    0x0258, 0x3DD5, 0x0259, 0x24D2, 0x025A, 0x24D5, 0x025B, 0x24D8,

+    0x025C, 0x3DD6, 0x025E, 0x3DD7, 0x025F, 0x3DC1, 0x0260, 0x3DD1,

+    0x0261, 0x3DC5, 0x0262, 0x3E0B, 0x0263, 0x3E0C, 0x0264, 0x3DDB,

+    0x0265, 0x3DDE, 0x0266, 0x3DCB, 0x0267, 0x3DE4, 0x0268, 0x3DD3,

+    0x026A, 0x3E0D, 0x026C, 0x3DB6, 0x026D, 0x3DC0, 0x026E, 0x3DB7,

+    0x026F, 0x3DD9, 0x0270, 0x3DC6, 0x0271, 0x3DB3, 0x0272, 0x3DC2,

+    0x0273, 0x3DBB, 0x0274, 0x3E0E, 0x0275, 0x24DD, 0x0276, 0x3E0F,

+    0x0278, 0x3E10, 0x0279, 0x3DB8, 0x027A, 0x3DE3, 0x027B, 0x3DBF,

+    0x027D, 0x3DBC, 0x027E, 0x3DB5, 0x0280, 0x3E11, 0x0281, 0x3DC7,

+    0x0282, 0x3DBD, 0x0283, 0x24E2, 0x0284, 0x3DD0, 0x0288, 0x3DB9,

+    0x0289, 0x3DD4, 0x028A, 0x3DDA, 0x028B, 0x3DB4, 0x028C, 0x24DE,

+    0x028D, 0x3DDD, 0x028E, 0x3DC4, 0x028F, 0x3E12, 0x0290, 0x3DBE,

+    0x0291, 0x3DE2, 0x0292, 0x24E1, 0x0294, 0x3DCA, 0x0295, 0x3DC9,

+    0x0298, 0x3DCC, 0x0299, 0x3E13, 0x029C, 0x3E14, 0x029D, 0x3DC3,

+    0x029F, 0x3E15, 0x02A1, 0x3DE0, 0x02A2, 0x3DDF, 0x02B0, 0x3E16,

+    0x02B2, 0x3E17, 0x02B7, 0x3E18, 0x02BB, 0x0062, 0x02BC, 0x0060,

+    0x02C1, 0x3E19, 0x02C6, 0x0080, 0x02C7, 0x3D85, 0x02C8, 0x3DE6,

+    0x02CC, 0x3DE7, 0x02D0, 0x24E3, 0x02D1, 0x3DE8, 0x02D8, 0x3D7A,

+    0x02D9, 0x3DA6, 0x02DA, 0x0085, 0x02DB, 0x3D82, 0x02DC, 0x005F,

+    0x02DD, 0x3D89, 0x02DE, 0x3DFB, 0x02E0, 0x3E1A, 0x02E1, 0x3E1B,

+    0x02E5, 0x3DEB, 0x02E6, 0x3DEC, 0x02E7, 0x3DED, 0x02E8, 0x3DEE,

+    0x02E9, 0x3DEF, 0x0300, 0x0041, 0x0301, 0x007F, 0x0302, 0x0080,

+    0x0303, 0x005F, 0x0304, 0x0081, 0x0305, 0x00E2, 0x0306, 0x0082,

+    0x0307, 0x0083, 0x0308, 0x0084, 0x030A, 0x0085, 0x030B, 0x0087,

+    0x030C, 0x0089, 0x030F, 0x3DEA, 0x0318, 0x3E02, 0x0319, 0x3E03,

+    0x031A, 0x3E07, 0x031C, 0x3DF5, 0x031D, 0x3E00, 0x031E, 0x3E01,

+    0x031F, 0x3DF6, 0x0320, 0x3DF7, 0x0324, 0x3DFC, 0x0325, 0x3DF2,

+    0x0327, 0x0086, 0x0328, 0x0088, 0x0329, 0x3DF9, 0x032A, 0x3E04,

+    0x032C, 0x3DF3, 0x032F, 0x3DFA, 0x0330, 0x3DFD, 0x0332, 0x0040,

+    0x0334, 0x3DFF, 0x0336, 0x008A, 0x0339, 0x3DF4, 0x033A, 0x3E05,

+    0x033B, 0x3E06, 0x033C, 0x3DFE, 0x033D, 0x3DF8, 0x0361, 0x3DE5,

+    0x0391, 0x03F3, 0x0392, 0x03F4, 0x0393, 0x03F5, 0x0394, 0x03F6,

+    0x0395, 0x03F7, 0x0396, 0x03F8, 0x0397, 0x03F9, 0x0398, 0x03FA,

+    0x0399, 0x03FB, 0x039A, 0x03FC, 0x039B, 0x03FD, 0x039C, 0x03FE,

+    0x039D, 0x03FF, 0x039E, 0x0400, 0x039F, 0x0401, 0x03A0, 0x0402,

+    0x03A1, 0x0403, 0x03A3, 0x0404, 0x03A4, 0x0405, 0x03A5, 0x0406,

+    0x03A6, 0x0407, 0x03A7, 0x0408, 0x03A8, 0x0409, 0x03A9, 0x040A,

+    0x03B1, 0x040B, 0x03B2, 0x040C, 0x03B3, 0x040D, 0x03B4, 0x040E,

+    0x03B5, 0x040F, 0x03B6, 0x0410, 0x03B7, 0x0411, 0x03B8, 0x0412,

+    0x03B9, 0x0413, 0x03BA, 0x0414, 0x03BB, 0x0415, 0x03BC, 0x0416,

+    0x03BD, 0x0417, 0x03BE, 0x0418, 0x03BF, 0x0419, 0x03C0, 0x041A,

+    0x03C1, 0x041B, 0x03C2, 0x3F5E, 0x03C3, 0x041C, 0x03C4, 0x041D,

+    0x03C5, 0x041E, 0x03C6, 0x041F, 0x03C7, 0x0420, 0x03C8, 0x0421,

+    0x03C9, 0x0422, 0x03D0, 0x2F3A, 0x03D1, 0x2F40, 0x03D5, 0x2F3E,

+    0x03DB, 0x2F3F, 0x0401, 0x0429, 0x0410, 0x0423, 0x0411, 0x0424,

+    0x0412, 0x0425, 0x0413, 0x0426, 0x0414, 0x0427, 0x0415, 0x0428,

+    0x0416, 0x042A, 0x0417, 0x042B, 0x0418, 0x042C, 0x0419, 0x042D,

+    0x041A, 0x042E, 0x041B, 0x042F, 0x041C, 0x0430, 0x041D, 0x0431,

+    0x041E, 0x0432, 0x041F, 0x0433, 0x0420, 0x0434, 0x0421, 0x0435,

+    0x0422, 0x0436, 0x0423, 0x0437, 0x0424, 0x0438, 0x0425, 0x0439,

+    0x0426, 0x043A, 0x0427, 0x043B, 0x0428, 0x043C, 0x0429, 0x043D,

+    0x042A, 0x043E, 0x042B, 0x043F, 0x042C, 0x0440, 0x042D, 0x0441,

+    0x042E, 0x0442, 0x042F, 0x0443, 0x0430, 0x0444, 0x0431, 0x0445,

+    0x0432, 0x0446, 0x0433, 0x0447, 0x0434, 0x0448, 0x0435, 0x0449,

+    0x0436, 0x044B, 0x0437, 0x044C, 0x0438, 0x044D, 0x0439, 0x044E,

+    0x043A, 0x044F, 0x043B, 0x0450, 0x043C, 0x0451, 0x043D, 0x0452,

+    0x043E, 0x0453, 0x043F, 0x0454, 0x0440, 0x0455, 0x0441, 0x0456,

+    0x0442, 0x0457, 0x0443, 0x0458, 0x0444, 0x0459, 0x0445, 0x045A,

+    0x0446, 0x045B, 0x0447, 0x045C, 0x0448, 0x045D, 0x0449, 0x045E,

+    0x044A, 0x045F, 0x044B, 0x0460, 0x044C, 0x0461, 0x044D, 0x0462,

+    0x044E, 0x0463, 0x044F, 0x0464, 0x0451, 0x044A, 0x1E3E, 0x3D71,

+    0x1E3F, 0x3D72, 0x1EBC, 0x24B5, 0x1EBD, 0x24C1, 0x1F70, 0x24CC,

+    0x1F71, 0x24CB, 0x1F72, 0x24DA, 0x1F73, 0x24D9, 0x2002, 0x00E7,

+    0x2003, 0x0279, 0x2010, 0x0296, 0x2011, 0x000E, 0x2012, 0x0072,

+    0x2013, 0x0072, 0x2014, 0x008A, 0x2015, 0x0295, 0x2016, 0x029A,

+    0x2018, 0x0062, 0x2019, 0x0060, 0x201A, 0x0078, 0x201C, 0x006C,

+    0x201D, 0x007A, 0x201E, 0x0079, 0x2020, 0x0308, 0x2021, 0x0309,

+    0x2022, 0x0077, 0x2025, 0x029D, 0x2026, 0x029C, 0x2030, 0x0304,

+    0x2032, 0x02C4, 0x2033, 0x02C5, 0x2039, 0x006E, 0x203A, 0x006F,

+    0x203B, 0x02DE, 0x203C, 0x2F4F, 0x203E, 0x00E2, 0x203F, 0x3DE9,

+    0x2042, 0x3F9A, 0x2044, 0x0068, 0x2047, 0x3F96, 0x2048, 0x3F97,

+    0x2049, 0x2F50, 0x2051, 0x3F99, 0x2070, 0x24A1, 0x2074, 0x24A2,

+    0x2075, 0x24A3, 0x2076, 0x24A4, 0x2077, 0x24A5, 0x2078, 0x24A6,

+    0x2079, 0x24A7, 0x2080, 0x24A8, 0x2081, 0x24A9, 0x2082, 0x24AA,

+    0x2083, 0x24AB, 0x2084, 0x24AC, 0x2085, 0x24AD, 0x2086, 0x24AE,

+    0x2087, 0x24AF, 0x2088, 0x24B0, 0x2089, 0x24B1, 0x20AC, 0x248A,

+    0x20DD, 0x3FC8, 0x20DE, 0x2B1B, 0x2100, 0x2E4F, 0x2103, 0x02C6,

+    0x2105, 0x2E53, 0x2109, 0x2071, 0x210A, 0x2070, 0x210F, 0x2F3C,

+    0x2113, 0x1F59, 0x2116, 0x1DBA, 0x2121, 0x1F77, 0x2122, 0x00E4,

+    0x2126, 0x248B, 0x2127, 0x3C9B, 0x212B, 0x0303, 0x2135, 0x2F39,

+    0x213B, 0x2073, 0x2153, 0x249F, 0x2154, 0x24A0, 0x2155, 0x3D6F,

+    0x2156, 0x2639, 0x2157, 0x263A, 0x2158, 0x263B, 0x2159, 0x263C,

+    0x215A, 0x263D, 0x215B, 0x249B, 0x215C, 0x249C, 0x215D, 0x249D,

+    0x215E, 0x249E, 0x2160, 0x1D97, 0x2161, 0x1D98, 0x2162, 0x1D99,

+    0x2163, 0x1D9A, 0x2164, 0x1D9B, 0x2165, 0x1D9C, 0x2166, 0x1D9D,

+    0x2167, 0x1D9E, 0x2168, 0x1D9F, 0x2169, 0x1DA0, 0x216A, 0x2021,

+    0x216B, 0x2022, 0x2170, 0x1F9C, 0x2171, 0x1F9D, 0x2172, 0x1F9E,

+    0x2173, 0x1F9F, 0x2174, 0x1FA0, 0x2175, 0x1FA1, 0x2176, 0x1FA2,

+    0x2177, 0x1FA3, 0x2178, 0x1FA4, 0x2179, 0x1FA5, 0x217A, 0x206A,

+    0x217B, 0x206B, 0x217F, 0x206F, 0x2190, 0x02E1, 0x2191, 0x02E2,

+    0x2192, 0x02E0, 0x2193, 0x02E3, 0x2194, 0x2FA9, 0x2196, 0x2FAC,

+    0x2197, 0x2FAD, 0x2198, 0x2FAA, 0x2199, 0x2FAB, 0x21C4, 0x2076,

+    0x21C5, 0x2077, 0x21C6, 0x2075, 0x21CB, 0x2FAF, 0x21CC, 0x2FAE,

+    0x21D0, 0x2FA8, 0x21D2, 0x02F0, 0x21D4, 0x02F1, 0x21E6, 0x1F4D,

+    0x21E7, 0x1F4C, 0x21E8, 0x1F4E, 0x21E9, 0x1F4B, 0x2200, 0x02F2,

+    0x2202, 0x02F7, 0x2203, 0x02F3, 0x2205, 0x2F98, 0x2207, 0x02F8,

+    0x2208, 0x02E5, 0x2209, 0x3C74, 0x220A, 0x2F3B, 0x220B, 0x02E6,

+    0x2211, 0x1DC9, 0x2212, 0x02B5, 0x2213, 0x2F56, 0x2219, 0x0075,

+    0x221A, 0x02FD, 0x221D, 0x02FF, 0x221E, 0x02BF, 0x221F, 0x1DCD,

+    0x2220, 0x02F4, 0x2225, 0x3C81, 0x2226, 0x3C82, 0x2227, 0x02ED,

+    0x2228, 0x02EE, 0x2229, 0x02EC, 0x222A, 0x02EB, 0x222B, 0x0301,

+    0x222C, 0x0302, 0x222D, 0x2003, 0x222E, 0x1DC8, 0x2234, 0x02C0,

+    0x2235, 0x0300, 0x223C, 0x0064, 0x223D, 0x02FE, 0x2243, 0x2F58,

+    0x2245, 0x3C93, 0x2248, 0x3C94, 0x2252, 0x02FA, 0x2260, 0x02BA,

+    0x2261, 0x02F9, 0x2262, 0x3C91, 0x2266, 0x02BD, 0x2267, 0x02BE,

+    0x226A, 0x02FB, 0x226B, 0x02FC, 0x2272, 0x2F59, 0x2273, 0x2F5A,

+    0x2276, 0x3C95, 0x2277, 0x3C96, 0x2282, 0x02E9, 0x2283, 0x02EA,

+    0x2284, 0x3C70, 0x2285, 0x3C71, 0x2286, 0x02E7, 0x2287, 0x02E8,

+    0x228A, 0x3C72, 0x228B, 0x3C73, 0x2295, 0x2F9C, 0x2296, 0x2F9A,

+    0x2297, 0x2F9D, 0x2298, 0x2F9B, 0x229E, 0x3E22, 0x22A0, 0x2F99,

+    0x22A5, 0x02F5, 0x22BF, 0x1DCE, 0x22DA, 0x3D6D, 0x22DB, 0x3D6E,

+    0x2305, 0x3C76, 0x2306, 0x3C77, 0x2307, 0x2FBB, 0x2312, 0x02F6,

+    0x2318, 0x3D70, 0x239B, 0x2F6F, 0x239C, 0x2F87, 0x239D, 0x2F70,

+    0x239E, 0x2F71, 0x239F, 0x2F87, 0x23A0, 0x2F72, 0x23A1, 0x2F77,

+    0x23A2, 0x2F87, 0x23A3, 0x2F78, 0x23A4, 0x2F79, 0x23A5, 0x2F87,

+    0x23A6, 0x2F7A, 0x23A7, 0x1FF2, 0x23A8, 0x1FF3, 0x23A9, 0x1FF4,

+    0x23AA, 0x2F87, 0x23AB, 0x1FEE, 0x23AC, 0x1FEF, 0x23AD, 0x1FF0,

+    0x23B0, 0x3FB8, 0x23B1, 0x3FB9, 0x23BE, 0x3F7D, 0x23BF, 0x3F7E,

+    0x23C0, 0x3F7F, 0x23C1, 0x3F80, 0x23C2, 0x3F81, 0x23C3, 0x3F82,

+    0x23C4, 0x3F83, 0x23C5, 0x3F84, 0x23C6, 0x3F85, 0x23C7, 0x3F86,

+    0x23C8, 0x3F87, 0x23C9, 0x3F88, 0x23CA, 0x3F89, 0x23CB, 0x3F8A,

+    0x23CC, 0x3F8B, 0x23CE, 0x3F91, 0x2423, 0x3F90, 0x2460, 0x1D83,

+    0x2461, 0x1D84, 0x2462, 0x1D85, 0x2463, 0x1D86, 0x2464, 0x1D87,

+    0x2465, 0x1D88, 0x2466, 0x1D89, 0x2467, 0x1D8A, 0x2468, 0x1D8B,

+    0x2469, 0x1D8C, 0x246A, 0x1D8D, 0x246B, 0x1D8E, 0x246C, 0x1D8F,

+    0x246D, 0x1D90, 0x246E, 0x1D91, 0x246F, 0x1D92, 0x2470, 0x1D93,

+    0x2471, 0x1D94, 0x2472, 0x1D95, 0x2473, 0x1D96, 0x2474, 0x1F87,

+    0x2475, 0x1F88, 0x2476, 0x1F89, 0x2477, 0x1F8A, 0x2478, 0x1F8B,

+    0x2479, 0x1F8C, 0x247A, 0x1F8D, 0x247B, 0x1F8E, 0x247C, 0x1F8F,

+    0x247D, 0x1F90, 0x247E, 0x1F91, 0x247F, 0x1F92, 0x2480, 0x1F93,

+    0x2481, 0x1F94, 0x2482, 0x1F95, 0x2483, 0x1F96, 0x2484, 0x1F97,

+    0x2485, 0x1F98, 0x2486, 0x1F99, 0x2487, 0x1F9A, 0x2488, 0x1F7E,

+    0x2489, 0x1F7F, 0x248A, 0x1F80, 0x248B, 0x1F81, 0x248C, 0x1F82,

+    0x248D, 0x1F83, 0x248E, 0x1F84, 0x248F, 0x1F85, 0x2490, 0x1F86,

+    0x249C, 0x1FB0, 0x249D, 0x1FB1, 0x249E, 0x1FB2, 0x249F, 0x1FB3,

+    0x24A0, 0x1FB4, 0x24A1, 0x1FB5, 0x24A2, 0x1FB6, 0x24A3, 0x1FB7,

+    0x24A4, 0x1FB8, 0x24A5, 0x1FB9, 0x24A6, 0x1FBA, 0x24A7, 0x1FBB,

+    0x24A8, 0x1FBC, 0x24A9, 0x1FBD, 0x24AA, 0x1FBE, 0x24AB, 0x1FBF,

+    0x24AC, 0x1FC0, 0x24AD, 0x1FC1, 0x24AE, 0x1FC2, 0x24AF, 0x1FC3,

+    0x24B0, 0x1FC4, 0x24B1, 0x1FC5, 0x24B2, 0x1FC6, 0x24B3, 0x1FC7,

+    0x24B4, 0x1FC8, 0x24B5, 0x1FC9, 0x24B6, 0x2863, 0x24B7, 0x2864,

+    0x24B8, 0x2865, 0x24B9, 0x2866, 0x24BA, 0x2867, 0x24BB, 0x2868,

+    0x24BC, 0x2869, 0x24BD, 0x286A, 0x24BE, 0x286B, 0x24BF, 0x286C,

+    0x24C0, 0x286D, 0x24C1, 0x286E, 0x24C2, 0x286F, 0x24C3, 0x2870,

+    0x24C4, 0x2871, 0x24C5, 0x2872, 0x24C6, 0x2873, 0x24C7, 0x2874,

+    0x24C8, 0x2875, 0x24C9, 0x2876, 0x24CA, 0x2877, 0x24CB, 0x2878,

+    0x24CC, 0x2879, 0x24CD, 0x287A, 0x24CE, 0x287B, 0x24CF, 0x287C,

+    0x24D0, 0x2849, 0x24D1, 0x284A, 0x24D2, 0x284B, 0x24D3, 0x284C,

+    0x24D4, 0x284D, 0x24D5, 0x284E, 0x24D6, 0x284F, 0x24D7, 0x2850,

+    0x24D8, 0x2851, 0x24D9, 0x2852, 0x24DA, 0x2853, 0x24DB, 0x2854,

+    0x24DC, 0x2855, 0x24DD, 0x2856, 0x24DE, 0x2857, 0x24DF, 0x2858,

+    0x24E0, 0x2859, 0x24E1, 0x285A, 0x24E2, 0x285B, 0x24E3, 0x285C,

+    0x24E4, 0x285D, 0x24E5, 0x285E, 0x24E6, 0x285F, 0x24E7, 0x2860,

+    0x24E8, 0x2861, 0x24E9, 0x2862, 0x24EA, 0x2020, 0x24EB, 0x2913,

+    0x24EC, 0x2914, 0x24ED, 0x2915, 0x24EE, 0x2916, 0x24EF, 0x2917,

+    0x24F0, 0x2918, 0x24F1, 0x2919, 0x24F2, 0x291A, 0x24F3, 0x291B,

+    0x24F4, 0x291C, 0x24F5, 0x3F5F, 0x24F6, 0x3F60, 0x24F7, 0x3F61,

+    0x24F8, 0x3F62, 0x24F9, 0x3F63, 0x24FA, 0x3F64, 0x24FB, 0x3F65,

+    0x24FC, 0x3F66, 0x24FD, 0x3F67, 0x24FE, 0x3F68, 0x24FF, 0x2907,

+    0x2500, 0x1D37, 0x2501, 0x1D38, 0x2502, 0x1D39, 0x2503, 0x1D3A,

+    0x2504, 0x1D3B, 0x2505, 0x1D3C, 0x2506, 0x1D3D, 0x2507, 0x1D3E,

+    0x2508, 0x1D3F, 0x2509, 0x1D40, 0x250A, 0x1D41, 0x250B, 0x1D42,

+    0x250C, 0x1D43, 0x250D, 0x1D44, 0x250E, 0x1D45, 0x250F, 0x1D46,

+    0x2510, 0x1D47, 0x2511, 0x1D48, 0x2512, 0x1D49, 0x2513, 0x1D4A,

+    0x2514, 0x1D4B, 0x2515, 0x1D4C, 0x2516, 0x1D4D, 0x2517, 0x1D4E,

+    0x2518, 0x1D4F, 0x2519, 0x1D50, 0x251A, 0x1D51, 0x251B, 0x1D52,

+    0x251C, 0x1D53, 0x251D, 0x1D54, 0x251E, 0x1D55, 0x251F, 0x1D56,

+    0x2520, 0x1D57, 0x2521, 0x1D58, 0x2522, 0x1D59, 0x2523, 0x1D5A,

+    0x2524, 0x1D5B, 0x2525, 0x1D5C, 0x2526, 0x1D5D, 0x2527, 0x1D5E,

+    0x2528, 0x1D5F, 0x2529, 0x1D60, 0x252A, 0x1D61, 0x252B, 0x1D62,

+    0x252C, 0x1D63, 0x252D, 0x1D64, 0x252E, 0x1D65, 0x252F, 0x1D66,

+    0x2530, 0x1D67, 0x2531, 0x1D68, 0x2532, 0x1D69, 0x2533, 0x1D6A,

+    0x2534, 0x1D6B, 0x2535, 0x1D6C, 0x2536, 0x1D6D, 0x2537, 0x1D6E,

+    0x2538, 0x1D6F, 0x2539, 0x1D70, 0x253A, 0x1D71, 0x253B, 0x1D72,

+    0x253C, 0x1D73, 0x253D, 0x1D74, 0x253E, 0x1D75, 0x253F, 0x1D76,

+    0x2540, 0x1D77, 0x2541, 0x1D78, 0x2542, 0x1D79, 0x2543, 0x1D7A,

+    0x2544, 0x1D7B, 0x2545, 0x1D7C, 0x2546, 0x1D7D, 0x2547, 0x1D7E,

+    0x2548, 0x1D7F, 0x2549, 0x1D80, 0x254A, 0x1D81, 0x254B, 0x1D82,

+    0x2550, 0x203B, 0x255E, 0x203C, 0x2561, 0x203E, 0x256A, 0x203D,

+    0x256D, 0x2037, 0x256E, 0x2038, 0x256F, 0x203A, 0x2570, 0x2039,

+    0x2571, 0x2045, 0x2572, 0x2046, 0x2573, 0x2047, 0x2581, 0x2026,

+    0x2582, 0x2027, 0x2583, 0x2028, 0x2584, 0x2029, 0x2585, 0x202A,

+    0x2586, 0x202B, 0x2587, 0x202C, 0x2588, 0x202D, 0x2589, 0x2034,

+    0x258A, 0x2033, 0x258B, 0x2032, 0x258C, 0x2031, 0x258D, 0x2030,

+    0x258E, 0x202F, 0x258F, 0x202E, 0x2594, 0x2035, 0x2595, 0x2036,

+    0x25A0, 0x02D9, 0x25A1, 0x02D8, 0x25A2, 0x1F4F, 0x25AA, 0x2FCF,

+    0x25AB, 0x2FCD, 0x25B1, 0x3F6B, 0x25B2, 0x02DB, 0x25B3, 0x02DA,

+    0x25B6, 0x2FA3, 0x25B7, 0x1F4A, 0x25BC, 0x02DD, 0x25BD, 0x02DC,

+    0x25C0, 0x2FA2, 0x25C1, 0x1F49, 0x25C6, 0x02D7, 0x25C7, 0x02D6,

+    0x25C9, 0x2012, 0x25CB, 0x02D3, 0x25CC, 0x2906, 0x25CE, 0x02D5,

+    0x25CF, 0x02D4, 0x25D0, 0x3F92, 0x25D1, 0x3F93, 0x25D2, 0x3F94,

+    0x25D3, 0x3F95, 0x25E2, 0x203F, 0x25E3, 0x2040, 0x25E4, 0x2042,

+    0x25E5, 0x2041, 0x25E6, 0x2FDE, 0x25EF, 0x030B, 0x2600, 0x2017,

+    0x2601, 0x2018, 0x2602, 0x2019, 0x2603, 0x201A, 0x2605, 0x02D2,

+    0x2606, 0x02D1, 0x260E, 0x1F78, 0x2616, 0x3F69, 0x2617, 0x3F6A,

+    0x261C, 0x201C, 0x261D, 0x201D, 0x261E, 0x201B, 0x261F, 0x201E,

+    0x2640, 0x02C2, 0x2642, 0x02C1, 0x2660, 0x2013, 0x2661, 0x1F51,

+    0x2662, 0x1F53, 0x2663, 0x2015, 0x2664, 0x1F52, 0x2665, 0x2014,

+    0x2666, 0x2016, 0x2667, 0x1F50, 0x2668, 0x2F42, 0x2669, 0x2F43,

+    0x266A, 0x0307, 0x266B, 0x3F48, 0x266C, 0x2F44, 0x266D, 0x0306,

+    0x266E, 0x3F47, 0x266F, 0x0305, 0x2672, 0x3FBA, 0x2673, 0x3FBB,

+    0x2674, 0x3FBC, 0x2675, 0x3FBD, 0x2676, 0x3FBE, 0x2677, 0x3FBF,

+    0x2678, 0x3FC0, 0x2679, 0x3FC1, 0x267A, 0x3FC2, 0x267B, 0x3FC3,

+    0x267C, 0x3FC4, 0x267D, 0x3FC5, 0x26A0, 0x2FA0, 0x2702, 0x2F90,

+    0x2713, 0x3F8E, 0x271A, 0x2FD1, 0x273F, 0x2FC5, 0x2740, 0x2FC4,

+    0x2756, 0x2FE3, 0x2776, 0x205E, 0x2777, 0x205F, 0x2778, 0x2060,

+    0x2779, 0x2061, 0x277A, 0x2062, 0x277B, 0x2063, 0x277C, 0x2064,

+    0x277D, 0x2065, 0x277E, 0x2066, 0x277F, 0x2912, 0x27A1, 0x200E,

+    0x2934, 0x3F49, 0x2935, 0x3F4A, 0x29BF, 0x3F4B, 0x29FA, 0x3F4F,

+    0x29FB, 0x3F50, 0x2B05, 0x200F, 0x2B06, 0x2010, 0x2B07, 0x2011,

+    0x2E83, 0x37E1, 0x2E85, 0x3620, 0x2E87, 0x3719, 0x2E89, 0x3814,

+    0x2E8B, 0x371E, 0x2E8C, 0x3609, 0x2E8D, 0x360A, 0x2E8E, 0x1071,

+    0x2E8F, 0x388C, 0x2E90, 0x1226, 0x2E92, 0x0EB2, 0x2E93, 0x1283,

+    0x2E94, 0x12AB, 0x2E95, 0x3C1F, 0x2E96, 0x38C2, 0x2E97, 0x361C,

+    0x2E98, 0x38E1, 0x2E99, 0x13C3, 0x2E9B, 0x13E1, 0x2E9E, 0x45E5,

+    0x2E9F, 0x0E3C, 0x2EA0, 0x0EBD, 0x2EA1, 0x3961, 0x2EA2, 0x3962,

+    0x2EA3, 0x399D, 0x2EA4, 0x3C26, 0x2EA6, 0x374D, 0x2EA8, 0x39BC,

+    0x2EA9, 0x35A1, 0x2EAA, 0x36AB, 0x2EAB, 0x3A97, 0x2EAC, 0x4ABA,

+    0x2EAD, 0x3A39, 0x2EAE, 0x3662, 0x2EB1, 0x3A98, 0x2EB2, 0x3A97,

+    0x2EB3, 0x376D, 0x2EB7, 0x36FE, 0x2EB9, 0x3713, 0x2EBC, 0x35B3,

+    0x2EBD, 0x354E, 0x2EBE, 0x3775, 0x2EBF, 0x3776, 0x2EC0, 0x3777,

+    0x2EC1, 0x078B, 0x2EC2, 0x3B0A, 0x2EC3, 0x362E, 0x2EC4, 0x0A62,

+    0x2EC6, 0x3572, 0x2ECA, 0x364A, 0x2ECC, 0x3C2B, 0x2ECD, 0x3B50,

+    0x2ECF, 0x3B9E, 0x2ED1, 0x0BD5, 0x2ED2, 0x3B97, 0x2ED6, 0x3B9E,

+    0x2ED7, 0x354D, 0x2ED8, 0x0A68, 0x2EDD, 0x3617, 0x2EDE, 0x3619,

+    0x2EDF, 0x3618, 0x2EE4, 0x064E, 0x2EE8, 0x0D34, 0x2EE9, 0x052B,

+    0x2EEB, 0x0A6A, 0x2EED, 0x08C3, 0x2EEF, 0x0F7D, 0x2EF2, 0x064F,

+    0x2F00, 0x04B0, 0x2F01, 0x20B3, 0x2F02, 0x0FFF, 0x2F03, 0x1001,

+    0x2F04, 0x0535, 0x2F05, 0x1006, 0x2F06, 0x0CCB, 0x2F07, 0x100E,

+    0x2F08, 0x0A13, 0x2F09, 0x1070, 0x2F0A, 0x0CD6, 0x2F0B, 0x0D40,

+    0x2F0C, 0x107B, 0x2F0D, 0x1083, 0x2F0E, 0x1089, 0x2F0F, 0x1093,

+    0x2F10, 0x1098, 0x2F11, 0x0C5B, 0x2F12, 0x0F97, 0x2F13, 0x10C6,

+    0x2F14, 0x10CD, 0x2F15, 0x10CE, 0x2F16, 0x10D3, 0x2F17, 0x0947,

+    0x2F18, 0x0E7C, 0x2F19, 0x10DC, 0x2F1A, 0x10E1, 0x2F1B, 0x10E8,

+    0x2F1C, 0x0EA2, 0x2F1D, 0x07B1, 0x2F1E, 0x116B, 0x2F1F, 0x0C54,

+    0x2F20, 0x089C, 0x2F21, 0x11BA, 0x2F22, 0x11BB, 0x2F23, 0x0F26,

+    0x2F24, 0x0B47, 0x2F25, 0x0981, 0x2F26, 0x08A0, 0x2F27, 0x120E,

+    0x2F28, 0x0A47, 0x2F29, 0x0996, 0x2F2A, 0x1226, 0x2F2B, 0x1228,

+    0x2F2C, 0x1232, 0x2F2D, 0x0881, 0x2F2E, 0x126C, 0x2F2F, 0x07BB,

+    0x2F30, 0x077E, 0x2F31, 0x06CA, 0x2F32, 0x05EF, 0x2F33, 0x1283,

+    0x2F34, 0x1285, 0x2F35, 0x1299, 0x2F36, 0x129B, 0x2F37, 0x12A0,

+    0x2F38, 0x0677, 0x2F39, 0x38B9, 0x2F3A, 0x12AF, 0x2F3B, 0x12B1,

+    0x2F3C, 0x09FA, 0x2F3D, 0x1342, 0x2F3E, 0x0781, 0x2F3F, 0x0916,

+    0x2F40, 0x08A7, 0x2F41, 0x13C2, 0x2F42, 0x0E08, 0x2F43, 0x0C47,

+    0x2F44, 0x06CC, 0x2F45, 0x0E4D, 0x2F46, 0x13E0, 0x2F47, 0x0CD4,

+    0x2F48, 0x140C, 0x2F49, 0x0744, 0x2F4A, 0x0EE6, 0x2F4B, 0x073D,

+    0x2F4C, 0x08AD, 0x2F4D, 0x14E5, 0x2F4E, 0x14F4, 0x2F4F, 0x14F8,

+    0x2F50, 0x0D7A, 0x2F51, 0x0EDF, 0x2F52, 0x08AF, 0x2F53, 0x1502,

+    0x2F54, 0x0A2B, 0x2F55, 0x0550, 0x2F56, 0x0BFA, 0x2F57, 0x0DD5,

+    0x2F58, 0x15E4, 0x2F59, 0x15E6, 0x2F5A, 0x0E22, 0x2F5B, 0x0567,

+    0x2F5C, 0x0687, 0x2F5D, 0x0758, 0x2F5E, 0x0770, 0x2F5F, 0x06C4,

+    0x2F60, 0x04DD, 0x2F61, 0x05E0, 0x2F62, 0x0601, 0x2F63, 0x0A5C,

+    0x2F64, 0x0F3B, 0x2F65, 0x0C3E, 0x2F66, 0x0D97, 0x2F67, 0x3A00,

+    0x2F68, 0x1697, 0x2F69, 0x0D28, 0x2F6A, 0x0D7D, 0x2F6B, 0x087C,

+    0x2F6C, 0x0EE8, 0x2F6D, 0x0EC3, 0x2F6E, 0x0EFC, 0x2F6F, 0x0A74,

+    0x2F70, 0x08D4, 0x2F71, 0x3A41, 0x2F72, 0x0553, 0x2F73, 0x0740,

+    0x2F74, 0x0F71, 0x2F75, 0x0B9B, 0x2F76, 0x0E16, 0x2F77, 0x08B3,

+    0x2F78, 0x0608, 0x2F79, 0x1813, 0x2F7A, 0x0F3D, 0x2F7B, 0x04CB,

+    0x2F7C, 0x0FDD, 0x2F7D, 0x08D5, 0x2F7E, 0x183D, 0x2F7F, 0x08D6,

+    0x2F80, 0x1853, 0x2F81, 0x0CD1, 0x2F82, 0x0A09, 0x2F83, 0x08D7,

+    0x2F84, 0x08B8, 0x2F85, 0x04D3, 0x2F86, 0x0A89, 0x2F87, 0x0AA6,

+    0x2F88, 0x0938, 0x2F89, 0x0821, 0x2F8A, 0x09ED, 0x2F8B, 0x18B2,

+    0x2F8C, 0x194F, 0x2F8D, 0x0BAC, 0x2F8E, 0x0742, 0x2F8F, 0x07E6,

+    0x2F90, 0x04A5, 0x2F91, 0x19EB, 0x2F92, 0x075F, 0x2F93, 0x05AF,

+    0x2F94, 0x0774, 0x2F95, 0x0B69, 0x2F96, 0x0C7E, 0x2F97, 0x1A56,

+    0x2F98, 0x1A59, 0x2F99, 0x058B, 0x2F9A, 0x0A7A, 0x2F9B, 0x0AF8,

+    0x2F9C, 0x0B0D, 0x2F9D, 0x0A0E, 0x2F9E, 0x0902, 0x2F9F, 0x0A0F,

+    0x2FA0, 0x0B62, 0x2FA1, 0x3B4F, 0x2FA2, 0x0F22, 0x2FA3, 0x0CAB,

+    0x2FA4, 0x0D64, 0x2FA5, 0x0F6C, 0x2FA6, 0x06DA, 0x2FA7, 0x0BD5,

+    0x2FA8, 0x0EF3, 0x2FA9, 0x0DDE, 0x2FAA, 0x1BC9, 0x2FAB, 0x1BCB,

+    0x2FAC, 0x04CD, 0x2FAD, 0x21F7, 0x2FAE, 0x0D87, 0x2FAF, 0x0ED8,

+    0x2FB0, 0x05B5, 0x2FB1, 0x1C03, 0x2FB2, 0x1C05, 0x2FB3, 0x053B,

+    0x2FB4, 0x0E17, 0x2FB5, 0x0DE9, 0x2FB6, 0x0D88, 0x2FB7, 0x09EF,

+    0x2FB8, 0x091F, 0x2FB9, 0x07F3, 0x2FBA, 0x0D05, 0x2FBB, 0x080E,

+    0x2FBC, 0x07F4, 0x2FBD, 0x1C6C, 0x2FBE, 0x1C7D, 0x2FBF, 0x1C83,

+    0x2FC0, 0x1C84, 0x2FC1, 0x064E, 0x2FC2, 0x0695, 0x2FC3, 0x0BD7,

+    0x2FC4, 0x1CF6, 0x2FC5, 0x08DB, 0x2FC6, 0x1D01, 0x2FC7, 0x0E91,

+    0x2FC8, 0x340B, 0x2FC9, 0x066A, 0x2FCA, 0x0807, 0x2FCB, 0x1D16,

+    0x2FCC, 0x1D19, 0x2FCD, 0x0C1E, 0x2FCE, 0x0791, 0x2FCF, 0x0ACF,

+    0x2FD0, 0x0D93, 0x2FD1, 0x1D21, 0x2FD2, 0x1D22, 0x2FD3, 0x0F7E,

+    0x2FD4, 0x1D30, 0x2FD5, 0x1D31, 0x3000, 0x0279, 0x3001, 0x027A,

+    0x3002, 0x027B, 0x3003, 0x028F, 0x3004, 0x2074, 0x3005, 0x0291,

+    0x3006, 0x0292, 0x3007, 0x0293, 0x3008, 0x02AA, 0x3009, 0x02AB,

+    0x300A, 0x02AC, 0x300B, 0x02AD, 0x300C, 0x02AE, 0x300D, 0x02AF,

+    0x300E, 0x02B0, 0x300F, 0x02B1, 0x3010, 0x02B2, 0x3011, 0x02B3,

+    0x3012, 0x02DF, 0x3013, 0x02E4, 0x3014, 0x02A4, 0x3015, 0x02A5,

+    0x3016, 0x3F45, 0x3017, 0x3F46, 0x3018, 0x2F61, 0x3019, 0x2F62,

+    0x301C, 0x0299, 0x301D, 0x1DB8, 0x301F, 0x1DB9, 0x3020, 0x1F7A,

+    0x3030, 0x2FBA, 0x3033, 0x2F4C, 0x3034, 0x2F4D, 0x3035, 0x2F4E,

+    0x3036, 0x1F79, 0x303B, 0x2F4A, 0x303C, 0x3F42, 0x303D, 0x2F93,

+    0x3041, 0x034A, 0x3042, 0x034B, 0x3043, 0x034C, 0x3044, 0x034D,

+    0x3045, 0x034E, 0x3046, 0x034F, 0x3047, 0x0350, 0x3048, 0x0351,

+    0x3049, 0x0352, 0x304A, 0x0353, 0x304B, 0x0354, 0x304C, 0x0355,

+    0x304D, 0x0356, 0x304E, 0x0357, 0x304F, 0x0358, 0x3050, 0x0359,

+    0x3051, 0x035A, 0x3052, 0x035B, 0x3053, 0x035C, 0x3054, 0x035D,

+    0x3055, 0x035E, 0x3056, 0x035F, 0x3057, 0x0360, 0x3058, 0x0361,

+    0x3059, 0x0362, 0x305A, 0x0363, 0x305B, 0x0364, 0x305C, 0x0365,

+    0x305D, 0x0366, 0x305E, 0x0367, 0x305F, 0x0368, 0x3060, 0x0369,

+    0x3061, 0x036A, 0x3062, 0x036B, 0x3063, 0x036C, 0x3064, 0x036D,

+    0x3065, 0x036E, 0x3066, 0x036F, 0x3067, 0x0370, 0x3068, 0x0371,

+    0x3069, 0x0372, 0x306A, 0x0373, 0x306B, 0x0374, 0x306C, 0x0375,

+    0x306D, 0x0376, 0x306E, 0x0377, 0x306F, 0x0378, 0x3070, 0x0379,

+    0x3071, 0x037A, 0x3072, 0x037B, 0x3073, 0x037C, 0x3074, 0x037D,

+    0x3075, 0x037E, 0x3076, 0x037F, 0x3077, 0x0380, 0x3078, 0x0381,

+    0x3079, 0x0382, 0x307A, 0x0383, 0x307B, 0x0384, 0x307C, 0x0385,

+    0x307D, 0x0386, 0x307E, 0x0387, 0x307F, 0x0388, 0x3080, 0x0389,

+    0x3081, 0x038A, 0x3082, 0x038B, 0x3083, 0x038C, 0x3084, 0x038D,

+    0x3085, 0x038E, 0x3086, 0x038F, 0x3087, 0x0390, 0x3088, 0x0391,

+    0x3089, 0x0392, 0x308A, 0x0393, 0x308B, 0x0394, 0x308C, 0x0395,

+    0x308D, 0x0396, 0x308E, 0x0397, 0x308F, 0x0398, 0x3090, 0x0399,

+    0x3091, 0x039A, 0x3092, 0x039B, 0x3093, 0x039C, 0x3094, 0x1F16,

+    0x3095, 0x1F17, 0x3096, 0x1F18, 0x3099, 0x3FC6, 0x309A, 0x3FC7,

+    0x309B, 0x0283, 0x309C, 0x0284, 0x309D, 0x028D, 0x309E, 0x028E,

+    0x309F, 0x2F95, 0x30A0, 0x3F4D, 0x30A1, 0x039D, 0x30A2, 0x039E,

+    0x30A3, 0x039F, 0x30A4, 0x03A0, 0x30A5, 0x03A1, 0x30A6, 0x03A2,

+    0x30A7, 0x03A3, 0x30A8, 0x03A4, 0x30A9, 0x03A5, 0x30AA, 0x03A6,

+    0x30AB, 0x03A7, 0x30AC, 0x03A8, 0x30AD, 0x03A9, 0x30AE, 0x03AA,

+    0x30AF, 0x03AB, 0x30B0, 0x03AC, 0x30B1, 0x03AD, 0x30B2, 0x03AE,

+    0x30B3, 0x03AF, 0x30B4, 0x03B0, 0x30B5, 0x03B1, 0x30B6, 0x03B2,

+    0x30B7, 0x03B3, 0x30B8, 0x03B4, 0x30B9, 0x03B5, 0x30BA, 0x03B6,

+    0x30BB, 0x03B7, 0x30BC, 0x03B8, 0x30BD, 0x03B9, 0x30BE, 0x03BA,

+    0x30BF, 0x03BB, 0x30C0, 0x03BC, 0x30C1, 0x03BD, 0x30C2, 0x03BE,

+    0x30C3, 0x03BF, 0x30C4, 0x03C0, 0x30C5, 0x03C1, 0x30C6, 0x03C2,

+    0x30C7, 0x03C3, 0x30C8, 0x03C4, 0x30C9, 0x03C5, 0x30CA, 0x03C6,

+    0x30CB, 0x03C7, 0x30CC, 0x03C8, 0x30CD, 0x03C9, 0x30CE, 0x03CA,

+    0x30CF, 0x03CB, 0x30D0, 0x03CC, 0x30D1, 0x03CD, 0x30D2, 0x03CE,

+    0x30D3, 0x03CF, 0x30D4, 0x03D0, 0x30D5, 0x03D1, 0x30D6, 0x03D2,

+    0x30D7, 0x03D3, 0x30D8, 0x03D4, 0x30D9, 0x03D5, 0x30DA, 0x03D6,

+    0x30DB, 0x03D7, 0x30DC, 0x03D8, 0x30DD, 0x03D9, 0x30DE, 0x03DA,

+    0x30DF, 0x03DB, 0x30E0, 0x03DC, 0x30E1, 0x03DD, 0x30E2, 0x03DE,

+    0x30E3, 0x03DF, 0x30E4, 0x03E0, 0x30E5, 0x03E1, 0x30E6, 0x03E2,

+    0x30E7, 0x03E3, 0x30E8, 0x03E4, 0x30E9, 0x03E5, 0x30EA, 0x03E6,

+    0x30EB, 0x03E7, 0x30EC, 0x03E8, 0x30ED, 0x03E9, 0x30EE, 0x03EA,

+    0x30EF, 0x03EB, 0x30F0, 0x03EC, 0x30F1, 0x03ED, 0x30F2, 0x03EE,

+    0x30F3, 0x03EF, 0x30F4, 0x03F0, 0x30F5, 0x03F1, 0x30F6, 0x03F2,

+    0x30F7, 0x2079, 0x30F8, 0x207A, 0x30F9, 0x207B, 0x30FA, 0x207C,

+    0x30FB, 0x027E, 0x30FC, 0x0294, 0x30FD, 0x028B, 0x30FE, 0x028C,

+    0x30FF, 0x3F43, 0x3190, 0x3F9B, 0x3191, 0x3F9C, 0x3192, 0x3F9D,

+    0x3193, 0x3F9E, 0x3194, 0x3F9F, 0x3195, 0x3FA0, 0x3196, 0x3FA1,

+    0x3197, 0x3FA2, 0x3198, 0x3FA3, 0x3199, 0x3FA4, 0x319A, 0x3FA5,

+    0x319B, 0x3FA6, 0x319C, 0x3FA7, 0x319D, 0x3FA8, 0x319E, 0x3FA9,

+    0x319F, 0x3FAA, 0x31F0, 0x3F6C, 0x31F1, 0x3F6D, 0x31F2, 0x3F6E,

+    0x31F3, 0x3F6F, 0x31F4, 0x3F70, 0x31F5, 0x3F71, 0x31F6, 0x3F72,

+    0x31F7, 0x3F73, 0x31F8, 0x3F74, 0x31F9, 0x3F75, 0x31FA, 0x3F77,

+    0x31FB, 0x3F78, 0x31FC, 0x3F79, 0x31FD, 0x3F7A, 0x31FE, 0x3F7B,

+    0x31FF, 0x3F7C, 0x3220, 0x278E, 0x3221, 0x278F, 0x3222, 0x2790,

+    0x3223, 0x2791, 0x3224, 0x2792, 0x3225, 0x2793, 0x3226, 0x2794,

+    0x3227, 0x2795, 0x3228, 0x2796, 0x3229, 0x2797, 0x322A, 0x2006,

+    0x322B, 0x2007, 0x322C, 0x2008, 0x322D, 0x2009, 0x322E, 0x200A,

+    0x322F, 0x200B, 0x3230, 0x2005, 0x3231, 0x1DC2, 0x3232, 0x1DC3,

+    0x3233, 0x1FCF, 0x3234, 0x1FCD, 0x3235, 0x1FD4, 0x3236, 0x1FD3,

+    0x3237, 0x200C, 0x3238, 0x1FCE, 0x3239, 0x1DC4, 0x323A, 0x1FD7,

+    0x323B, 0x1FD5, 0x323C, 0x1FD0, 0x323D, 0x1FCB, 0x323E, 0x1FD2,

+    0x323F, 0x1FCC, 0x3240, 0x1FD6, 0x3241, 0x200D, 0x3242, 0x1FD1,

+    0x3243, 0x1FCA, 0x3251, 0x1F9B, 0x3252, 0x1FA6, 0x3253, 0x1FA7,

+    0x3254, 0x1FA8, 0x3255, 0x1FA9, 0x3256, 0x1FAA, 0x3257, 0x1FAB,

+    0x3258, 0x1FAC, 0x3259, 0x1FAD, 0x325A, 0x1FAE, 0x325B, 0x1FAF,

+    0x325C, 0x2804, 0x325D, 0x2805, 0x325E, 0x2806, 0x325F, 0x2807,

+    0x3280, 0x28DD, 0x3281, 0x28DE, 0x3282, 0x28DF, 0x3283, 0x28E0,

+    0x3284, 0x28E1, 0x3285, 0x28E2, 0x3286, 0x28E3, 0x3287, 0x28E4,

+    0x3288, 0x28E5, 0x3289, 0x28E6, 0x328A, 0x28E8, 0x328B, 0x28E9,

+    0x328C, 0x28EA, 0x328D, 0x28EB, 0x328E, 0x28EC, 0x328F, 0x28ED,

+    0x3290, 0x28E7, 0x3291, 0x1FE1, 0x3292, 0x1FE0, 0x3293, 0x1FE2,

+    0x3294, 0x1FDC, 0x3295, 0x28FF, 0x3296, 0x1FE5, 0x3297, 0x28FC,

+    0x3298, 0x1FDE, 0x3299, 0x201F, 0x329A, 0x28F9, 0x329B, 0x28F8,

+    0x329C, 0x28FE, 0x329D, 0x207F, 0x329E, 0x1FFF, 0x329F, 0x28EF,

+    0x32A0, 0x28F6, 0x32A1, 0x28F7, 0x32A2, 0x28FB, 0x32A3, 0x28FA,

+    0x32A4, 0x1DBD, 0x32A5, 0x1DBE, 0x32A6, 0x1DBF, 0x32A7, 0x1DC0,

+    0x32A8, 0x1DC1, 0x32A9, 0x1FDA, 0x32AA, 0x1FDD, 0x32AB, 0x1FDF,

+    0x32AC, 0x1FE3, 0x32AD, 0x1FD9, 0x32AE, 0x1FE4, 0x32AF, 0x1FDB,

+    0x32B0, 0x1FD8, 0x32B1, 0x2808, 0x32B2, 0x2809, 0x32B3, 0x280A,

+    0x32B4, 0x280B, 0x32B5, 0x280C, 0x32B6, 0x280D, 0x32B7, 0x280E,

+    0x32B8, 0x280F, 0x32B9, 0x2810, 0x32BA, 0x2811, 0x32BB, 0x2812,

+    0x32BC, 0x2813, 0x32BD, 0x2814, 0x32BE, 0x2815, 0x32BF, 0x2816,

+    0x32D0, 0x28AD, 0x32D1, 0x28AE, 0x32D2, 0x28AF, 0x32D3, 0x28B0,

+    0x32D4, 0x28B1, 0x32D5, 0x28B2, 0x32D6, 0x28B3, 0x32D7, 0x28B4,

+    0x32D8, 0x28B5, 0x32D9, 0x28B6, 0x32DA, 0x28B7, 0x32DB, 0x28B8,

+    0x32DC, 0x28B9, 0x32DD, 0x28BA, 0x32DE, 0x28BB, 0x32DF, 0x28BC,

+    0x32E0, 0x28BD, 0x32E1, 0x28BE, 0x32E2, 0x28BF, 0x32E3, 0x28C0,

+    0x32E4, 0x28C1, 0x32E5, 0x28C2, 0x32E6, 0x28C3, 0x32E7, 0x28C4,

+    0x32E8, 0x28C5, 0x32E9, 0x28C6, 0x32EA, 0x28C7, 0x32EB, 0x28C8,

+    0x32EC, 0x28C9, 0x32ED, 0x28CA, 0x32EE, 0x28CB, 0x32EF, 0x28CC,

+    0x32F0, 0x28CD, 0x32F1, 0x28CE, 0x32F2, 0x28CF, 0x32F3, 0x28D0,

+    0x32F4, 0x28D1, 0x32F5, 0x28D2, 0x32F6, 0x28D3, 0x32F7, 0x28D4,

+    0x32F8, 0x28D5, 0x32F9, 0x28D6, 0x32FA, 0x28D7, 0x32FB, 0x28D8,

+    0x32FC, 0x28D9, 0x32FD, 0x28DA, 0x32FE, 0x28DB, 0x3300, 0x1F70,

+    0x3301, 0x2E62, 0x3302, 0x2E63, 0x3303, 0x1F6A, 0x3304, 0x2E64,

+    0x3305, 0x1FF7, 0x3306, 0x2E65, 0x3307, 0x2E69, 0x3308, 0x2E67,

+    0x3309, 0x2E6C, 0x330A, 0x2E6A, 0x330B, 0x2E6E, 0x330C, 0x2E70,

+    0x330D, 0x1DAB, 0x330E, 0x2E71, 0x330F, 0x2E72, 0x3310, 0x2E73,

+    0x3311, 0x2E74, 0x3312, 0x2E75, 0x3313, 0x2E76, 0x3314, 0x1DA2,

+    0x3315, 0x1F69, 0x3316, 0x1F67, 0x3317, 0x2E78, 0x3318, 0x1F68,

+    0x3319, 0x2E7A, 0x331A, 0x2E7C, 0x331B, 0x2E7D, 0x331C, 0x2E7E,

+    0x331D, 0x2E7F, 0x331E, 0x1F73, 0x331F, 0x2E80, 0x3320, 0x2E81,

+    0x3321, 0x2E82, 0x3322, 0x1F66, 0x3323, 0x1F6B, 0x3324, 0x2E83,

+    0x3325, 0x2E85, 0x3326, 0x1DAC, 0x3327, 0x1DA6, 0x3328, 0x2E88,

+    0x3329, 0x2E89, 0x332A, 0x1F74, 0x332B, 0x1DAE, 0x332D, 0x2E8B,

+    0x332E, 0x2E8E, 0x332F, 0x2E8F, 0x3330, 0x2E90, 0x3331, 0x1F71,

+    0x3332, 0x2E91, 0x3333, 0x2087, 0x3334, 0x2E94, 0x3335, 0x2E95,

+    0x3336, 0x1DA8, 0x3337, 0x2E9A, 0x3338, 0x2E9C, 0x3339, 0x1F6E,

+    0x333A, 0x2E9D, 0x333B, 0x1F6F, 0x333C, 0x2E96, 0x333D, 0x2E9E,

+    0x333E, 0x2EA0, 0x333F, 0x2EA1, 0x3340, 0x2EA2, 0x3341, 0x2E9F,

+    0x3342, 0x1F6D, 0x3343, 0x2EA3, 0x3344, 0x2EA4, 0x3345, 0x2EA5,

+    0x3346, 0x2EA6, 0x3347, 0x1F72, 0x3348, 0x2EA7, 0x3349, 0x1DA1,

+    0x334A, 0x1DAF, 0x334B, 0x2EA8, 0x334C, 0x2EA9, 0x334D, 0x1DA4,

+    0x334E, 0x2088, 0x334F, 0x2EAA, 0x3350, 0x2EAB, 0x3351, 0x1DA9,

+    0x3352, 0x2EAE, 0x3353, 0x2EB2, 0x3354, 0x2EAF, 0x3355, 0x2EB3,

+    0x3356, 0x2EB4, 0x3357, 0x1F6C, 0x3371, 0x2E55, 0x337B, 0x2083,

+    0x337C, 0x1DC7, 0x337D, 0x1DC6, 0x337E, 0x1DC5, 0x337F, 0x1F76,

+    0x3385, 0x1F5F, 0x3386, 0x1F60, 0x3387, 0x1F61, 0x3388, 0x2000,

+    0x3389, 0x2001, 0x338D, 0x2E58, 0x338E, 0x1DB4, 0x338F, 0x1DB5,

+    0x3390, 0x1F63, 0x3396, 0x1F65, 0x3397, 0x1F58, 0x3398, 0x1F5A,

+    0x339B, 0x2E59, 0x339C, 0x1DB1, 0x339D, 0x1DB2, 0x339E, 0x1DB3,

+    0x339F, 0x1FFA, 0x33A0, 0x1F54, 0x33A1, 0x1DB7, 0x33A2, 0x1F55,

+    0x33A3, 0x1FFB, 0x33A4, 0x1F56, 0x33A5, 0x1F57, 0x33A6, 0x1FFC,

+    0x33B0, 0x1F5E, 0x33B1, 0x1F5D, 0x33B2, 0x1F5C, 0x33B3, 0x1F5B,

+    0x33C2, 0x2E50, 0x33C4, 0x1DB6, 0x33C8, 0x2002, 0x33CB, 0x1F62,

+    0x33CC, 0x1FF6, 0x33CD, 0x1DBB, 0x33D4, 0x1F64, 0x33D7, 0x2E5D,

+    0x33D8, 0x2E5E, 0x33DA, 0x2E4B, 0x3402, 0x3582, 0x3405, 0x3C1B,

+    0x3406, 0x435A, 0x3427, 0x3656, 0x342C, 0x435E, 0x342E, 0x3788,

+    0x3468, 0x36DF, 0x346A, 0x4375, 0x3488, 0x3C52, 0x3492, 0x438E,

+    0x34B5, 0x4199, 0x34BC, 0x4397, 0x34C1, 0x47D0, 0x34C7, 0x439B,

+    0x34DB, 0x3C41, 0x351F, 0x3629, 0x353E, 0x371E, 0x355D, 0x43BD,

+    0x355E, 0x43BE, 0x3563, 0x43C0, 0x356E, 0x43C4, 0x35A6, 0x43D9,

+    0x35A8, 0x43DB, 0x35C5, 0x43E1, 0x35DA, 0x43EA, 0x35DE, 0x4E63,

+    0x35F4, 0x43F3, 0x3605, 0x43FA, 0x3614, 0x4ABB, 0x364A, 0x4421,

+    0x3691, 0x4441, 0x3696, 0x4445, 0x3699, 0x4443, 0x36CF, 0x4456,

+    0x3761, 0x4478, 0x3762, 0x4479, 0x376B, 0x447D, 0x376C, 0x447C,

+    0x3775, 0x4480, 0x378D, 0x361A, 0x37C1, 0x448E, 0x37E2, 0x372B,

+    0x37E8, 0x44A2, 0x37F4, 0x44A5, 0x37FD, 0x44A8, 0x3800, 0x44AA,

+    0x382F, 0x44B4, 0x3836, 0x44B5, 0x3840, 0x44B6, 0x385C, 0x44BA,

+    0x3861, 0x44BC, 0x38A1, 0x4ECB, 0x38AD, 0x4ABC, 0x38FA, 0x361C,

+    0x3917, 0x44D9, 0x391A, 0x44DC, 0x396F, 0x44EB, 0x39A4, 0x4E9A,

+    0x39B8, 0x4E9B, 0x3A5C, 0x4E9F, 0x3A6E, 0x4531, 0x3A73, 0x4534,

+    0x3A85, 0x4EAE, 0x3AC4, 0x4EA7, 0x3ACB, 0x4EA8, 0x3AD6, 0x4543,

+    0x3AD7, 0x455E, 0x3AEA, 0x454D, 0x3AF3, 0x3C40, 0x3B0E, 0x4558,

+    0x3B1A, 0x455C, 0x3B1C, 0x455D, 0x3B22, 0x3C49, 0x3B6D, 0x458C,

+    0x3B77, 0x4585, 0x3B87, 0x45A2, 0x3B88, 0x368D, 0x3B8D, 0x45A4,

+    0x3BA4, 0x45AA, 0x3BB6, 0x420E, 0x3BC3, 0x420F, 0x3BCD, 0x45B8,

+    0x3BF0, 0x45C9, 0x3BF3, 0x4EB7, 0x3C0F, 0x4217, 0x3C26, 0x45DF,

+    0x3CC3, 0x45FC, 0x3CD2, 0x4601, 0x3D11, 0x4625, 0x3D1E, 0x4630,

+    0x3D31, 0x4EBE, 0x3D4E, 0x1DE7, 0x3D64, 0x464A, 0x3D9A, 0x4658,

+    0x3DC0, 0x466A, 0x3DCC, 0x4ABD, 0x3DD4, 0x466F, 0x3E05, 0x467B,

+    0x3E3F, 0x4248, 0x3E40, 0x4ECA, 0x3E60, 0x468B, 0x3E66, 0x468D,

+    0x3E68, 0x468E, 0x3E83, 0x4695, 0x3E8A, 0x3C43, 0x3E94, 0x469B,

+    0x3EDA, 0x3C48, 0x3F57, 0x46CB, 0x3F72, 0x4258, 0x3F75, 0x46D9,

+    0x3F77, 0x46DB, 0x3FAE, 0x46ED, 0x3FB1, 0x3754, 0x3FC9, 0x46F8,

+    0x3FD7, 0x46FD, 0x3FDC, 0x4ABE, 0x4039, 0x470F, 0x4058, 0x4716,

+    0x4093, 0x3C4C, 0x4103, 0x3C4F, 0x4105, 0x473B, 0x4148, 0x4747,

+    0x414F, 0x474A, 0x4163, 0x474E, 0x41B4, 0x475D, 0x41BF, 0x4760,

+    0x41E6, 0x476B, 0x41EE, 0x476F, 0x41F3, 0x476C, 0x4207, 0x4776,

+    0x420E, 0x4779, 0x4264, 0x3760, 0x4293, 0x3C50, 0x42C6, 0x479F,

+    0x42D6, 0x47AA, 0x42DD, 0x47AE, 0x4302, 0x47BC, 0x432B, 0x47C9,

+    0x4343, 0x47CB, 0x43EE, 0x47F7, 0x43F0, 0x47FA, 0x4408, 0x4800,

+    0x440C, 0x3C42, 0x4417, 0x4802, 0x441C, 0x4803, 0x4422, 0x4805,

+    0x4453, 0x3773, 0x445B, 0x42A4, 0x4476, 0x481C, 0x447A, 0x481D,

+    0x4491, 0x4823, 0x44B3, 0x483E, 0x44BE, 0x483C, 0x44D4, 0x483D,

+    0x4508, 0x485C, 0x450D, 0x4858, 0x4525, 0x377E, 0x4543, 0x486C,

+    0x457A, 0x3C4B, 0x459D, 0x42D4, 0x45B8, 0x48A0, 0x45BE, 0x4ABF,

+    0x45E5, 0x48BA, 0x45EA, 0x42D9, 0x460F, 0x48CA, 0x4610, 0x4AC0,

+    0x4641, 0x48D8, 0x4665, 0x3C4E, 0x46A1, 0x48E9, 0x46AE, 0x3C51,

+    0x46AF, 0x48ED, 0x470C, 0x4902, 0x471F, 0x4EFB, 0x4764, 0x4918,

+    0x47E6, 0x3790, 0x47FD, 0x4924, 0x4816, 0x492E, 0x481E, 0x4F01,

+    0x4844, 0x42F5, 0x484E, 0x493A, 0x48B5, 0x495B, 0x49B0, 0x431F,

+    0x49E7, 0x49D2, 0x49FA, 0x49D6, 0x4A04, 0x49DB, 0x4A29, 0x49DE,

+    0x4ABC, 0x49F6, 0x4B38, 0x35DF, 0x4B3B, 0x4A0E, 0x4B7E, 0x4AC1,

+    0x4BC2, 0x4A33, 0x4BCA, 0x4A35, 0x4BD2, 0x4A37, 0x4BE8, 0x3C46,

+    0x4C17, 0x4334, 0x4C20, 0x4A48, 0x4C38, 0x4AC2, 0x4CC4, 0x4A84,

+    0x4CD1, 0x4A87, 0x4CE1, 0x4AC3, 0x4D07, 0x4A9B, 0x4D77, 0x4AAB,

+    0x4E00, 0x04B0, 0x4E01, 0x0BB8, 0x4E02, 0x4352, 0x4E03, 0x08E3,

+    0x4E04, 0x37D8, 0x4E05, 0x37D9, 0x4E07, 0x0EAA, 0x4E08, 0x09CE,

+    0x4E09, 0x087E, 0x4E0A, 0x09CD, 0x4E0B, 0x053C, 0x4E0C, 0x4AC4,

+    0x4E0D, 0x0DC6, 0x4E0E, 0x0F29, 0x4E0F, 0x4353, 0x4E10, 0x0FFB,

+    0x4E11, 0x04D1, 0x4E12, 0x4354, 0x4E14, 0x05CC, 0x4E15, 0x0FFC,

+    0x4E16, 0x0A48, 0x4E17, 0x10D7, 0x4E18, 0x0670, 0x4E19, 0x0E0A,

+    0x4E1E, 0x09CF, 0x4E1F, 0x37DA, 0x4E21, 0x0F86, 0x4E23, 0x4AC5,

+    0x4E24, 0x4AC6, 0x4E26, 0x0E12, 0x4E28, 0x20B3, 0x4E29, 0x4355,

+    0x4E2A, 0x0FFD, 0x4E2B, 0x37DB, 0x4E2C, 0x374D, 0x4E2D, 0x0BA4,

+    0x4E2E, 0x4356, 0x4E2F, 0x37DC, 0x4E30, 0x37DD, 0x4E31, 0x0FFE,

+    0x4E32, 0x06F2, 0x4E36, 0x0FFF, 0x4E37, 0x369D, 0x4E38, 0x0619,

+    0x4E39, 0x0B6E, 0x4E3B, 0x0913, 0x4E3C, 0x1000, 0x4E3F, 0x1001,

+    0x4E40, 0x37DE, 0x4E41, 0x37DF, 0x4E42, 0x1002, 0x4E43, 0x0CEB,

+    0x4E44, 0x37E0, 0x4E45, 0x0671, 0x4E47, 0x4357, 0x4E48, 0x372E,

+    0x4E4B, 0x0CED, 0x4E4D, 0x0CBB, 0x4E4E, 0x0777, 0x4E4F, 0x0E61,

+    0x4E51, 0x4359, 0x4E55, 0x1950, 0x4E56, 0x1003, 0x4E57, 0x09D0,

+    0x4E58, 0x1004, 0x4E59, 0x0535, 0x4E5A, 0x37E1, 0x4E5D, 0x06DD,

+    0x4E5E, 0x07A4, 0x4E5F, 0x0EF5, 0x4E62, 0x1233, 0x4E69, 0x435C,

+    0x4E71, 0x0F5A, 0x4E73, 0x0CD5, 0x4E79, 0x4AC7, 0x4E7E, 0x05E1,

+    0x4E7F, 0x37E2, 0x4E80, 0x064F, 0x4E82, 0x1005, 0x4E85, 0x1006,

+    0x4E86, 0x0F83, 0x4E88, 0x0F27, 0x4E89, 0x0AEA, 0x4E8A, 0x1008,

+    0x4E8B, 0x08C4, 0x4E8C, 0x0CCB, 0x4E8D, 0x37E3, 0x4E8E, 0x100B,

+    0x4E91, 0x04E0, 0x4E92, 0x0793, 0x4E94, 0x0792, 0x4E95, 0x04AA,

+    0x4E96, 0x37E4, 0x4E98, 0x0FF1, 0x4E99, 0x0FF0, 0x4E9B, 0x0823,

+    0x4E9C, 0x0465, 0x4E9D, 0x435D, 0x4E9E, 0x100C, 0x4E9F, 0x100D,

+    0x4EA0, 0x100E, 0x4EA1, 0x0E62, 0x4EA2, 0x100F, 0x4EA4, 0x07A6,

+    0x4EA5, 0x04AB, 0x4EA6, 0x0EA0, 0x4EA8, 0x0696, 0x4EAB, 0x0697,

+    0x4EAC, 0x0698, 0x4EAD, 0x0BFE, 0x4EAE, 0x0F84, 0x4EB0, 0x1010,

+    0x4EB3, 0x1011, 0x4EB6, 0x1012, 0x4EB9, 0x37E5, 0x4EBA, 0x0A13,

+    0x4EBB, 0x3620, 0x4EBC, 0x435F, 0x4EC0, 0x0944, 0x4EC1, 0x0A14,

+    0x4EC2, 0x1017, 0x4EC3, 0x4360, 0x4EC4, 0x1015, 0x4EC6, 0x1016,

+    0x4EC7, 0x0672, 0x4EC8, 0x4361, 0x4ECA, 0x0813, 0x4ECB, 0x0570,

+    0x4ECD, 0x1014, 0x4ECE, 0x1013, 0x4ECF, 0x0DF9, 0x4ED0, 0x37E6,

+    0x4ED4, 0x0894, 0x4ED5, 0x0893, 0x4ED6, 0x0B1E, 0x4ED7, 0x1018,

+    0x4ED8, 0x0DC7, 0x4ED9, 0x0A8B, 0x4EDA, 0x4363, 0x4EDD, 0x0290,

+    0x4EDE, 0x1019, 0x4EDF, 0x101B, 0x4EE0, 0x37E7, 0x4EE1, 0x20B4,

+    0x4EE3, 0x0B45, 0x4EE4, 0x0FA9, 0x4EE5, 0x048E, 0x4EEB, 0x4362,

+    0x4EED, 0x101A, 0x4EEE, 0x053E, 0x4EF0, 0x06BC, 0x4EF1, 0x4364,

+    0x4EF2, 0x0BA5, 0x4EF3, 0x4AC8, 0x4EF5, 0x4365, 0x4EF6, 0x0745,

+    0x4EF7, 0x101C, 0x4EFB, 0x0CDA, 0x4EFC, 0x20B5, 0x4EFD, 0x37E8,

+    0x4EFF, 0x37E9, 0x4F00, 0x20B6, 0x4F01, 0x0627, 0x4F03, 0x20B7,

+    0x4F09, 0x101D, 0x4F0A, 0x048F, 0x4F0B, 0x37EA, 0x4F0C, 0x4AC9,

+    0x4F0D, 0x0794, 0x4F0E, 0x0628, 0x4F0F, 0x0DEC, 0x4F10, 0x0D46,

+    0x4F11, 0x0673, 0x4F15, 0x37EB, 0x4F16, 0x4366, 0x4F19, 0x4ACA,

+    0x4F1A, 0x0571, 0x4F1C, 0x1040, 0x4F1D, 0x0C3B, 0x4F2B, 0x4ACB,

+    0x4F2E, 0x4ACC, 0x4F2F, 0x0D22, 0x4F30, 0x101F, 0x4F31, 0x4ACD,

+    0x4F34, 0x0D50, 0x4F36, 0x0FAA, 0x4F37, 0x4368, 0x4F38, 0x09F3,

+    0x4F39, 0x20B8, 0x4F3A, 0x0895, 0x4F3B, 0x37ED, 0x4F3C, 0x08C5,

+    0x4F3D, 0x0540, 0x4F3E, 0x4369, 0x4F43, 0x0BED, 0x4F46, 0x0B60,

+    0x4F47, 0x1023, 0x4F48, 0x418B, 0x4F49, 0x37EE, 0x4F4D, 0x0490,

+    0x4F4E, 0x0BFF, 0x4F4F, 0x0945, 0x4F50, 0x0824, 0x4F51, 0x0F0E,

+    0x4F53, 0x0B2E, 0x4F54, 0x37EF, 0x4F55, 0x053F, 0x4F56, 0x20B9,

+    0x4F57, 0x1022, 0x4F58, 0x436A, 0x4F59, 0x0F28, 0x4F5A, 0x101E,

+    0x4F5B, 0x1020, 0x4F5C, 0x085E, 0x4F5D, 0x1021, 0x4F5E, 0x11D3,

+    0x4F5F, 0x418C, 0x4F60, 0x37EC, 0x4F64, 0x4367, 0x4F69, 0x1029,

+    0x4F6A, 0x418D, 0x4F6C, 0x418E, 0x4F6F, 0x102C, 0x4F70, 0x102A,

+    0x4F73, 0x0542, 0x4F75, 0x0E0B, 0x4F76, 0x1024, 0x4F77, 0x436C,

+    0x4F78, 0x436D, 0x4F7A, 0x37F0, 0x4F7B, 0x1028, 0x4F7C, 0x07A7,

+    0x4F7D, 0x37F1, 0x4F7E, 0x37F2, 0x4F7F, 0x0896, 0x4F82, 0x436E,

+    0x4F83, 0x05E2, 0x4F84, 0x4ACE, 0x4F85, 0x436F, 0x4F86, 0x102D,

+    0x4F88, 0x1025, 0x4F8A, 0x20BB, 0x4F8B, 0x0FAB, 0x4F8D, 0x08C6,

+    0x4F8F, 0x1026, 0x4F91, 0x102B, 0x4F92, 0x20BA, 0x4F94, 0x20BD,

+    0x4F96, 0x102E, 0x4F97, 0x37F3, 0x4F98, 0x1027, 0x4F9A, 0x20BC,

+    0x4F9B, 0x0699, 0x4F9D, 0x0491, 0x4F9E, 0x4ACF, 0x4FA0, 0x069A,

+    0x4FA1, 0x0541, 0x4FAB, 0x11D4, 0x4FAD, 0x0EA7, 0x4FAE, 0x0DE0,

+    0x4FAF, 0x07A8, 0x4FB2, 0x4371, 0x4FB5, 0x09F5, 0x4FB6, 0x0F7F,

+    0x4FB7, 0x4AD0, 0x4FBE, 0x37F4, 0x4FBF, 0x0E28, 0x4FC2, 0x070E,

+    0x4FC3, 0x0B05, 0x4FC4, 0x0564, 0x4FC5, 0x4372, 0x4FC9, 0x20AC,

+    0x4FCA, 0x095D, 0x4FCB, 0x4373, 0x4FCD, 0x20BE, 0x4FCE, 0x1032,

+    0x4FCF, 0x37F5, 0x4FD0, 0x1037, 0x4FD1, 0x1035, 0x4FD2, 0x4374,

+    0x4FD3, 0x3C2F, 0x4FD4, 0x1030, 0x4FD7, 0x0B0F, 0x4FD8, 0x1033,

+    0x4FDA, 0x1036, 0x4FDB, 0x1034, 0x4FDD, 0x0E2D, 0x4FDF, 0x1031,

+    0x4FE0, 0x1DEC, 0x4FE1, 0x09F4, 0x4FE3, 0x0EA1, 0x4FE4, 0x1038,

+    0x4FE5, 0x1039, 0x4FE6, 0x4370, 0x4FEE, 0x092E, 0x4FEF, 0x1046,

+    0x4FF1, 0x35A3, 0x4FF2, 0x4376, 0x4FF3, 0x0D06, 0x4FF5, 0x0DA8,

+    0x4FF6, 0x1041, 0x4FF8, 0x0E40, 0x4FFA, 0x0536, 0x4FFD, 0x37F6,

+    0x4FFE, 0x1045, 0x4FFF, 0x20C1, 0x5000, 0x37F7, 0x5001, 0x37F8,

+    0x5002, 0x4F4B, 0x5004, 0x4AD1, 0x5005, 0x103F, 0x5006, 0x1048,

+    0x5009, 0x0AD4, 0x500B, 0x0778, 0x500C, 0x4AD2, 0x500D, 0x0D12,

+    0x500E, 0x418F, 0x500F, 0x1600, 0x5010, 0x37F9, 0x5011, 0x1047,

+    0x5012, 0x0C57, 0x5013, 0x4377, 0x5014, 0x103C, 0x5016, 0x07AA,

+    0x5018, 0x4190, 0x5019, 0x07A9, 0x501A, 0x103A, 0x501B, 0x37FA,

+    0x501C, 0x4378, 0x501E, 0x20C2, 0x501F, 0x0906, 0x5021, 0x1042,

+    0x5022, 0x20C0, 0x5023, 0x0E3F, 0x5024, 0x0B8B, 0x5025, 0x103E,

+    0x5026, 0x0747, 0x5027, 0x37FB, 0x5028, 0x103B, 0x5029, 0x1043,

+    0x502A, 0x103D, 0x502B, 0x0F99, 0x502C, 0x1044, 0x502D, 0x0FE7,

+    0x502E, 0x37FC, 0x5036, 0x06DE, 0x5039, 0x0746, 0x503B, 0x3800,

+    0x5040, 0x20BF, 0x5041, 0x4191, 0x5042, 0x20C5, 0x5043, 0x1049,

+    0x5046, 0x20C3, 0x5047, 0x104A, 0x5048, 0x104E, 0x5049, 0x0492,

+    0x504C, 0x4AD3, 0x504E, 0x4379, 0x504F, 0x0E20, 0x5050, 0x104D,

+    0x5053, 0x437A, 0x5055, 0x104C, 0x5056, 0x1050, 0x5057, 0x37FD,

+    0x505A, 0x104F, 0x505C, 0x0C00, 0x505F, 0x4AD4, 0x5062, 0x4AD5,

+    0x5063, 0x437B, 0x5065, 0x0748, 0x5066, 0x37FE, 0x506A, 0x37FF,

+    0x506C, 0x1051, 0x5070, 0x20C4, 0x5072, 0x08F1, 0x5074, 0x0B06,

+    0x5075, 0x0C01, 0x5076, 0x06EE, 0x5077, 0x4AD6, 0x5078, 0x1052,

+    0x507D, 0x0650, 0x5080, 0x1053, 0x5085, 0x1055, 0x5088, 0x437D,

+    0x508D, 0x0E63, 0x508E, 0x4AD7, 0x508F, 0x3801, 0x5091, 0x073C,

+    0x5092, 0x437E, 0x5093, 0x437F, 0x5094, 0x20C6, 0x5095, 0x4380,

+    0x5096, 0x3802, 0x5098, 0x087F, 0x5099, 0x0D8B, 0x509A, 0x1054,

+    0x509C, 0x3803, 0x509E, 0x4AD8, 0x50A2, 0x4AD9, 0x50A3, 0x437C,

+    0x50AA, 0x4381, 0x50AC, 0x0835, 0x50AD, 0x0F2D, 0x50B1, 0x4383,

+    0x50B2, 0x1057, 0x50B3, 0x105A, 0x50B4, 0x1056, 0x50B5, 0x0834,

+    0x50B7, 0x0987, 0x50BA, 0x4384, 0x50BB, 0x4385, 0x50BE, 0x070F,

+    0x50C2, 0x105B, 0x50C3, 0x4ADA, 0x50C4, 0x4386, 0x50C5, 0x06C7,

+    0x50C7, 0x4387, 0x50C9, 0x1058, 0x50CA, 0x1059, 0x50CC, 0x3804,

+    0x50CD, 0x0C87, 0x50CE, 0x438A, 0x50CF, 0x0AFE, 0x50D0, 0x4193,

+    0x50D1, 0x069B, 0x50D4, 0x438C, 0x50D5, 0x0E7B, 0x50D6, 0x105C,

+    0x50D8, 0x20C8, 0x50D9, 0x3C30, 0x50DA, 0x0F85, 0x50DE, 0x105D,

+    0x50E1, 0x438D, 0x50E3, 0x1060, 0x50E5, 0x105E, 0x50E6, 0x3805,

+    0x50E7, 0x0AD0, 0x50E8, 0x4ADB, 0x50E9, 0x3806, 0x50ED, 0x105F,

+    0x50EE, 0x1061, 0x50EF, 0x3807, 0x50F0, 0x3C31, 0x50F1, 0x4ADC,

+    0x50F2, 0x4192, 0x50F3, 0x4388, 0x50F4, 0x20C7, 0x50F5, 0x1063,

+    0x50F9, 0x1062, 0x50FB, 0x0E18, 0x50FE, 0x4ADD, 0x5100, 0x0651,

+    0x5101, 0x1065, 0x5102, 0x1066, 0x5103, 0x4195, 0x5104, 0x052F,

+    0x5106, 0x4194, 0x5107, 0x4ADE, 0x5108, 0x3808, 0x5109, 0x1064,

+    0x510B, 0x3809, 0x510C, 0x4ADF, 0x510D, 0x4AE0, 0x510E, 0x4AE1,

+    0x5110, 0x380A, 0x5112, 0x0920, 0x5114, 0x1069, 0x5115, 0x1068,

+    0x5116, 0x1067, 0x5117, 0x4390, 0x5118, 0x102F, 0x511A, 0x106A,

+    0x511B, 0x380B, 0x511E, 0x380C, 0x511F, 0x0988, 0x5121, 0x106B,

+    0x512A, 0x0F0F, 0x5132, 0x0EE5, 0x5133, 0x4AE2, 0x5135, 0x4196,

+    0x5137, 0x106D, 0x5138, 0x4AE3, 0x513A, 0x106C, 0x513B, 0x106F,

+    0x513C, 0x106E, 0x513F, 0x1070, 0x5140, 0x1071, 0x5141, 0x04B8,

+    0x5143, 0x0769, 0x5144, 0x0711, 0x5145, 0x0946, 0x5146, 0x0BB9,

+    0x5147, 0x069C, 0x5148, 0x0A8C, 0x5149, 0x07AB, 0x514A, 0x20C9,

+    0x514B, 0x0800, 0x514C, 0x1073, 0x514D, 0x0ED4, 0x514E, 0x0C40,

+    0x5150, 0x08C7, 0x5152, 0x1072, 0x5154, 0x1074, 0x5155, 0x4197,

+    0x5157, 0x4198, 0x515A, 0x0C58, 0x515C, 0x05D3, 0x515F, 0x380D,

+    0x5160, 0x4392, 0x5162, 0x1075, 0x5164, 0x20CA, 0x5165, 0x0CD6,

+    0x5167, 0x368E, 0x5168, 0x0AB6, 0x5169, 0x1077, 0x516A, 0x1078,

+    0x516B, 0x0D40, 0x516C, 0x07AC, 0x516D, 0x0FE1, 0x516E, 0x1079,

+    0x5171, 0x069E, 0x5173, 0x4394, 0x5174, 0x4AE4, 0x5175, 0x0E0C,

+    0x5176, 0x0B16, 0x5177, 0x06E9, 0x5178, 0x0C2F, 0x5179, 0x3779,

+    0x517B, 0x47D9, 0x517C, 0x0749, 0x5180, 0x107A, 0x5182, 0x107B,

+    0x5183, 0x4395, 0x5184, 0x4AE5, 0x5185, 0x0CBA, 0x5186, 0x0501,

+    0x5189, 0x107E, 0x518A, 0x086D, 0x518B, 0x4396, 0x518C, 0x107D,

+    0x518D, 0x0836, 0x518F, 0x107F, 0x5190, 0x185B, 0x5191, 0x1080,

+    0x5192, 0x0E6F, 0x5193, 0x1081, 0x5195, 0x1082, 0x5196, 0x1083,

+    0x5197, 0x09D1, 0x5198, 0x4398, 0x5199, 0x08F8, 0x519D, 0x20CB,

+    0x51A0, 0x05E3, 0x51A1, 0x380E, 0x51A2, 0x1086, 0x51A3, 0x4399,

+    0x51A4, 0x1084, 0x51A5, 0x0EC9, 0x51A6, 0x1085, 0x51A8, 0x0DCC,

+    0x51A9, 0x1087, 0x51AA, 0x1088, 0x51AB, 0x1089, 0x51AC, 0x0C59,

+    0x51AD, 0x439A, 0x51B0, 0x108D, 0x51B1, 0x108B, 0x51B2, 0x108C,

+    0x51B3, 0x108A, 0x51B4, 0x0853, 0x51B5, 0x108E, 0x51B6, 0x0EF6,

+    0x51B7, 0x0FAC, 0x51B8, 0x4AE6, 0x51BA, 0x4AE7, 0x51BC, 0x380F,

+    0x51BD, 0x108F, 0x51BE, 0x20CC, 0x51C3, 0x3C32, 0x51C4, 0x0A4C,

+    0x51C5, 0x1090, 0x51C6, 0x0964, 0x51C8, 0x4AE8, 0x51C9, 0x1091,

+    0x51CA, 0x419A, 0x51CB, 0x0BBA, 0x51CC, 0x0F87, 0x51CD, 0x0C5A,

+    0x51CF, 0x4AE9, 0x51D1, 0x4AEA, 0x51D3, 0x4AEB, 0x51D4, 0x4AEC,

+    0x51D6, 0x10DA, 0x51D8, 0x4AED, 0x51DB, 0x1092, 0x51DC, 0x205C,

+    0x51DD, 0x06BD, 0x51DE, 0x4F4C, 0x51DF, 0x4AEE, 0x51E0, 0x1093,

+    0x51E1, 0x0E8C, 0x51E2, 0x419B, 0x51E6, 0x0972, 0x51E7, 0x0B5C,

+    0x51E9, 0x1095, 0x51EA, 0x0CBC, 0x51EC, 0x20CD, 0x51ED, 0x1096,

+    0x51EE, 0x3811, 0x51F0, 0x1097, 0x51F1, 0x058C, 0x51F3, 0x439D,

+    0x51F4, 0x3812, 0x51F5, 0x1098, 0x51F6, 0x069F, 0x51F8, 0x0CA4,

+    0x51F9, 0x051C, 0x51FA, 0x095A, 0x51FD, 0x0D35, 0x51FE, 0x1099,

+    0x5200, 0x0C5B, 0x5201, 0x3813, 0x5202, 0x3814, 0x5203, 0x0A15,

+    0x5204, 0x109A, 0x5205, 0x4AEF, 0x5206, 0x0DFC, 0x5207, 0x0A7E,

+    0x5208, 0x05DE, 0x520A, 0x05E5, 0x520B, 0x109B, 0x520E, 0x109D,

+    0x5211, 0x0710, 0x5212, 0x439E, 0x5213, 0x3815, 0x5214, 0x109C,

+    0x5215, 0x20CE, 0x5216, 0x439F, 0x5217, 0x0FBB, 0x521D, 0x0973,

+    0x5224, 0x0D51, 0x5225, 0x0E1C, 0x5226, 0x4AF0, 0x5227, 0x109E,

+    0x5228, 0x4AF1, 0x5229, 0x0F62, 0x522A, 0x109F, 0x522B, 0x4AF2,

+    0x522E, 0x10A0, 0x5230, 0x0C78, 0x5231, 0x4AF3, 0x5232, 0x4AF4,

+    0x5233, 0x10A1, 0x5235, 0x4AF5, 0x5236, 0x0A4D, 0x5237, 0x086E,

+    0x5238, 0x074A, 0x5239, 0x10A2, 0x523A, 0x0897, 0x523B, 0x0801,

+    0x523C, 0x4AF6, 0x5243, 0x0C02, 0x5244, 0x10A4, 0x5247, 0x0B07,

+    0x5249, 0x3816, 0x524A, 0x085F, 0x524B, 0x10A5, 0x524C, 0x10A6,

+    0x524D, 0x0AB2, 0x524F, 0x10A3, 0x5254, 0x10A8, 0x5255, 0x43A1,

+    0x5256, 0x0E64, 0x5257, 0x419C, 0x525A, 0x4AF7, 0x525B, 0x07F6,

+    0x525C, 0x43A2, 0x525D, 0x1E5E, 0x525E, 0x10A7, 0x5260, 0x4AF8,

+    0x5261, 0x3817, 0x5263, 0x074B, 0x5264, 0x084E, 0x5265, 0x0D23,

+    0x5266, 0x3818, 0x5269, 0x10AB, 0x526A, 0x10A9, 0x526C, 0x43A3,

+    0x526E, 0x4AF9, 0x526F, 0x0DED, 0x5270, 0x09D2, 0x5271, 0x10B2,

+    0x5272, 0x05C2, 0x5273, 0x10AC, 0x5274, 0x10AA, 0x5275, 0x0AD1,

+    0x5277, 0x43A4, 0x5278, 0x4AFA, 0x5279, 0x4AFB, 0x527D, 0x10AE,

+    0x527F, 0x10AD, 0x5282, 0x43A6, 0x5283, 0x05A2, 0x5284, 0x43A5,

+    0x5287, 0x0736, 0x5288, 0x10B3, 0x5289, 0x0F75, 0x528A, 0x4AFC,

+    0x528C, 0x4AFD, 0x528D, 0x10AF, 0x5291, 0x10B4, 0x5292, 0x10B1,

+    0x5293, 0x3819, 0x5294, 0x10B0, 0x5298, 0x43A8, 0x529B, 0x0F97,

+    0x529C, 0x20CF, 0x529F, 0x07AD, 0x52A0, 0x0543, 0x52A3, 0x0FBC,

+    0x52A4, 0x43AA, 0x52A6, 0x20D0, 0x52A9, 0x097F, 0x52AA, 0x0C52,

+    0x52AB, 0x07F7, 0x52AC, 0x10B7, 0x52AD, 0x10B8, 0x52AF, 0x217D,

+    0x52B1, 0x0FAD, 0x52B4, 0x0FD1, 0x52B5, 0x10BA, 0x52B9, 0x07AE,

+    0x52BA, 0x43AB, 0x52BB, 0x43AC, 0x52BC, 0x10B9, 0x52BE, 0x058D,

+    0x52C0, 0x20D1, 0x52C1, 0x10BB, 0x52C3, 0x0E84, 0x52C5, 0x0BD8,

+    0x52C7, 0x0F10, 0x52C8, 0x381A, 0x52C9, 0x0E29, 0x52CA, 0x43AD,

+    0x52CC, 0x419D, 0x52CD, 0x10BC, 0x52D0, 0x36E8, 0x52D1, 0x43AE,

+    0x52D2, 0x1BEE, 0x52D5, 0x0C88, 0x52D6, 0x419E, 0x52D7, 0x10BD,

+    0x52D8, 0x05E6, 0x52D9, 0x0EBF, 0x52DB, 0x20D2, 0x52DD, 0x0989,

+    0x52DE, 0x10BE, 0x52DF, 0x0E37, 0x52E0, 0x10C2, 0x52E1, 0x4AFE,

+    0x52E2, 0x0A4E, 0x52E3, 0x10BF, 0x52E4, 0x06C8, 0x52E6, 0x10C0,

+    0x52E7, 0x05E7, 0x52E9, 0x4AFF, 0x52F0, 0x381B, 0x52F1, 0x4B00,

+    0x52F2, 0x0704, 0x52F3, 0x10C3, 0x52F5, 0x10C4, 0x52F7, 0x43B0,

+    0x52F8, 0x10C5, 0x52F9, 0x10C6, 0x52FA, 0x0907, 0x52FB, 0x419F,

+    0x52FE, 0x07AF, 0x52FF, 0x0EEA, 0x5300, 0x20D3, 0x5301, 0x0EF4,

+    0x5302, 0x0CCF, 0x5303, 0x4B01, 0x5305, 0x0E41, 0x5306, 0x10C7,

+    0x5307, 0x4F4D, 0x5308, 0x10C8, 0x530A, 0x381C, 0x530B, 0x381D,

+    0x530D, 0x10CA, 0x530F, 0x10CC, 0x5310, 0x10CB, 0x5311, 0x4B02,

+    0x5315, 0x10CD, 0x5316, 0x053D, 0x5317, 0x0E7A, 0x5319, 0x086C,

+    0x531A, 0x10CE, 0x531C, 0x41A0, 0x531D, 0x0ADB, 0x531F, 0x4B03,

+    0x5320, 0x098A, 0x5321, 0x06A1, 0x5323, 0x10CF, 0x5324, 0x20D5,

+    0x532A, 0x0D6F, 0x532D, 0x4B04, 0x532F, 0x10D0, 0x5331, 0x10D1,

+    0x5332, 0x4B05, 0x5333, 0x10D2, 0x5335, 0x43B1, 0x5338, 0x10D3,

+    0x5339, 0x0D96, 0x533A, 0x06E0, 0x533B, 0x04A9, 0x533D, 0x4B06,

+    0x533E, 0x381E, 0x533F, 0x0C97, 0x5340, 0x10D4, 0x5341, 0x0947,

+    0x5342, 0x43B2, 0x5343, 0x0A8D, 0x5345, 0x10D6, 0x5346, 0x10D5,

+    0x5347, 0x098B, 0x5348, 0x0795, 0x5349, 0x10D8, 0x534A, 0x0D52,

+    0x534B, 0x3820, 0x534C, 0x381F, 0x534D, 0x10D9, 0x5351, 0x0D70,

+    0x5352, 0x0B14, 0x5353, 0x0B4E, 0x5354, 0x06A0, 0x5357, 0x0CC6,

+    0x5358, 0x0B6F, 0x535A, 0x0D24, 0x535C, 0x0E7C, 0x535E, 0x10DB,

+    0x5360, 0x0A8E, 0x5361, 0x3821, 0x5363, 0x41A1, 0x5365, 0x4B07,

+    0x5366, 0x070B, 0x5367, 0x43B5, 0x5369, 0x10DC, 0x536C, 0x3822,

+    0x536D, 0x4B08, 0x536E, 0x10DD, 0x536F, 0x04CE, 0x5370, 0x04B9,

+    0x5371, 0x0629, 0x5372, 0x20D6, 0x5373, 0x0B08, 0x5374, 0x066B,

+    0x5375, 0x0F5B, 0x5377, 0x10E0, 0x5378, 0x0537, 0x5379, 0x4B09,

+    0x537A, 0x43B6, 0x537B, 0x10DF, 0x537D, 0x3435, 0x537E, 0x4B0A,

+    0x537F, 0x06A2, 0x5382, 0x10E1, 0x5384, 0x0EFD, 0x5389, 0x37D0,

+    0x5393, 0x20D7, 0x5394, 0x4B0B, 0x5396, 0x10E2, 0x5398, 0x0F9A,

+    0x5399, 0x4B0C, 0x539A, 0x07B0, 0x539D, 0x41A2, 0x539F, 0x076A,

+    0x53A0, 0x10E3, 0x53A4, 0x43B7, 0x53A5, 0x10E5, 0x53A6, 0x10E4,

+    0x53A8, 0x0A25, 0x53A9, 0x04DB, 0x53AA, 0x4B0D, 0x53AB, 0x3823,

+    0x53AD, 0x0500, 0x53AE, 0x10E6, 0x53AF, 0x4B0E, 0x53B0, 0x10E7,

+    0x53B2, 0x20D8, 0x53B3, 0x076B, 0x53B4, 0x43B8, 0x53B6, 0x10E8,

+    0x53B7, 0x43BA, 0x53BA, 0x4B0F, 0x53BB, 0x0688, 0x53C0, 0x43BB,

+    0x53C1, 0x4B10, 0x53C2, 0x0880, 0x53C3, 0x10E9, 0x53C4, 0x4B11,

+    0x53C5, 0x4B12, 0x53C8, 0x0EA2, 0x53C9, 0x0825, 0x53CA, 0x0674,

+    0x53CB, 0x0F11, 0x53CC, 0x0AD2, 0x53CD, 0x0D53, 0x53CE, 0x0929,

+    0x53D4, 0x0951, 0x53D5, 0x43BF, 0x53D6, 0x0914, 0x53D7, 0x0921,

+    0x53D9, 0x0980, 0x53DA, 0x3824, 0x53DB, 0x0D54, 0x53DD, 0x20D9,

+    0x53DF, 0x10EC, 0x53E0, 0x4B13, 0x53E1, 0x04E5, 0x53E2, 0x0AD3,

+    0x53E3, 0x07B1, 0x53E4, 0x0779, 0x53E5, 0x06DF, 0x53E6, 0x3825,

+    0x53E8, 0x10F0, 0x53E9, 0x0B5F, 0x53EA, 0x0B5E, 0x53EB, 0x06A3,

+    0x53EC, 0x098C, 0x53ED, 0x10F1, 0x53EE, 0x10EF, 0x53EF, 0x0544,

+    0x53F0, 0x0B46, 0x53F1, 0x08E4, 0x53F2, 0x0899, 0x53F3, 0x04C8,

+    0x53F4, 0x43C1, 0x53F5, 0x3826, 0x53F6, 0x05CE, 0x53F7, 0x07F8,

+    0x53F8, 0x0898, 0x53FA, 0x10F2, 0x5401, 0x10F3, 0x5403, 0x0663,

+    0x5404, 0x05A4, 0x5408, 0x07F9, 0x5409, 0x0662, 0x540A, 0x0BFB,

+    0x540B, 0x04C7, 0x540C, 0x0C89, 0x540D, 0x0ECA, 0x540E, 0x07B3,

+    0x540F, 0x0F63, 0x5410, 0x0C41, 0x5411, 0x07B2, 0x5412, 0x41A3,

+    0x5413, 0x4B14, 0x541B, 0x0705, 0x541D, 0x10FC, 0x541E, 0x368C,

+    0x541F, 0x06DB, 0x5420, 0x0E78, 0x5424, 0x43C2, 0x5426, 0x0D71,

+    0x5427, 0x3827, 0x5428, 0x43C3, 0x5429, 0x10FB, 0x542A, 0x4B15,

+    0x542B, 0x061A, 0x542C, 0x10F6, 0x542D, 0x10F7, 0x542E, 0x10F9,

+    0x5431, 0x4B16, 0x5433, 0x35C0, 0x5434, 0x4B17, 0x5435, 0x4B18,

+    0x5436, 0x10FA, 0x5438, 0x0675, 0x5439, 0x0A27, 0x543B, 0x0DFD,

+    0x543C, 0x10F8, 0x543D, 0x10F4, 0x543E, 0x0797, 0x543F, 0x35CF,

+    0x5440, 0x10F5, 0x5442, 0x0FCA, 0x5443, 0x43C5, 0x5446, 0x0E42,

+    0x5448, 0x0C04, 0x5449, 0x0796, 0x544A, 0x0802, 0x544C, 0x4B19,

+    0x544D, 0x3828, 0x544E, 0x10FD, 0x5451, 0x0CB5, 0x5455, 0x3723,

+    0x545F, 0x1101, 0x5462, 0x43C6, 0x5466, 0x3829, 0x5468, 0x092A,

+    0x546A, 0x0922, 0x546B, 0x382A, 0x546C, 0x43C7, 0x5470, 0x1104,

+    0x5471, 0x1102, 0x5473, 0x0EAF, 0x5474, 0x382B, 0x5475, 0x10FF,

+    0x5476, 0x1108, 0x5477, 0x1103, 0x547B, 0x1106, 0x547C, 0x077A,

+    0x547D, 0x0ECB, 0x547F, 0x41A4, 0x5480, 0x1107, 0x5484, 0x1109,

+    0x5486, 0x110B, 0x5488, 0x41A5, 0x548A, 0x20DC, 0x548B, 0x0860,

+    0x548C, 0x0FE8, 0x548D, 0x382C, 0x548E, 0x1100, 0x548F, 0x10FE,

+    0x5490, 0x110A, 0x5492, 0x1105, 0x5495, 0x43C8, 0x5496, 0x382D,

+    0x549C, 0x20DB, 0x54A0, 0x43C9, 0x54A1, 0x382E, 0x54A2, 0x110D,

+    0x54A4, 0x1116, 0x54A5, 0x110F, 0x54A6, 0x43CA, 0x54A7, 0x4B1A,

+    0x54A8, 0x1113, 0x54A9, 0x20DD, 0x54AA, 0x4B1B, 0x54AB, 0x1114,

+    0x54AC, 0x1110, 0x54AD, 0x382F, 0x54AE, 0x43CB, 0x54AF, 0x1131,

+    0x54B1, 0x4B1C, 0x54B2, 0x0859, 0x54B3, 0x058F, 0x54B7, 0x43CC,

+    0x54B8, 0x110E, 0x54B9, 0x3830, 0x54BA, 0x43CD, 0x54BB, 0x4B1D,

+    0x54BC, 0x1118, 0x54BD, 0x04BA, 0x54BE, 0x1117, 0x54BF, 0x3831,

+    0x54C0, 0x0469, 0x54C1, 0x0DBC, 0x54C2, 0x1115, 0x54C3, 0x43CE,

+    0x54C4, 0x1111, 0x54C6, 0x3832, 0x54C7, 0x110C, 0x54C8, 0x1112,

+    0x54C9, 0x0838, 0x54CD, 0x3833, 0x54CE, 0x4B1E, 0x54D8, 0x1119,

+    0x54E1, 0x04BB, 0x54E2, 0x1122, 0x54E5, 0x111A, 0x54E6, 0x111B,

+    0x54E8, 0x098D, 0x54E9, 0x0E97, 0x54EA, 0x4B1F, 0x54EC, 0x43D0,

+    0x54ED, 0x1120, 0x54EE, 0x111F, 0x54EF, 0x43D1, 0x54F1, 0x43D2,

+    0x54F2, 0x0C29, 0x54F3, 0x43D3, 0x54FA, 0x1121, 0x54FC, 0x4B20,

+    0x54FD, 0x111E, 0x54FF, 0x20DE, 0x5500, 0x43D4, 0x5501, 0x43D5,

+    0x5504, 0x04D6, 0x5505, 0x4B21, 0x5506, 0x0826, 0x5507, 0x09F6,

+    0x5508, 0x4B22, 0x5509, 0x43D6, 0x550E, 0x3834, 0x550F, 0x111C,

+    0x5510, 0x0C5C, 0x5514, 0x111D, 0x5515, 0x4B23, 0x5516, 0x0466,

+    0x5527, 0x4B24, 0x552A, 0x4B25, 0x552B, 0x3835, 0x552E, 0x1127,

+    0x552F, 0x0F0D, 0x5531, 0x098F, 0x5533, 0x112D, 0x5535, 0x3836,

+    0x5536, 0x4B26, 0x5538, 0x112C, 0x5539, 0x1123, 0x553C, 0x43D7,

+    0x553E, 0x0B23, 0x5540, 0x1124, 0x5541, 0x43D8, 0x5544, 0x0B4F,

+    0x5545, 0x1129, 0x5546, 0x098E, 0x5547, 0x43DA, 0x554A, 0x3837,

+    0x554C, 0x1126, 0x554F, 0x0EF0, 0x5550, 0x41A6, 0x5551, 0x4B27,

+    0x5553, 0x0712, 0x5556, 0x112A, 0x5557, 0x112B, 0x555C, 0x1128,

+    0x555D, 0x112E, 0x555E, 0x1DD1, 0x5560, 0x3838, 0x5561, 0x4F54,

+    0x5563, 0x1125, 0x5564, 0x43DC, 0x5566, 0x4B28, 0x557B, 0x1134,

+    0x557C, 0x1139, 0x557D, 0x43DE, 0x557E, 0x1135, 0x5580, 0x1130,

+    0x5581, 0x41A7, 0x5582, 0x43DF, 0x5583, 0x113A, 0x5584, 0x0AB3,

+    0x5586, 0x20DF, 0x5587, 0x113C, 0x5588, 0x383A, 0x5589, 0x07B4,

+    0x558A, 0x1132, 0x558B, 0x0BBB, 0x558E, 0x383B, 0x558F, 0x4B29,

+    0x5591, 0x43E0, 0x5592, 0x4B2A, 0x5594, 0x4B2B, 0x5598, 0x1136,

+    0x5599, 0x112F, 0x559A, 0x05E9, 0x559C, 0x062A, 0x559D, 0x05C3,

+    0x559E, 0x1137, 0x559F, 0x1133, 0x55A4, 0x4B2C, 0x55A7, 0x074C,

+    0x55A8, 0x113D, 0x55A9, 0x113B, 0x55AA, 0x0AD5, 0x55AB, 0x0664,

+    0x55AC, 0x06A4, 0x55AD, 0x41A8, 0x55AE, 0x1138, 0x55B0, 0x06EC,

+    0x55B2, 0x4B2D, 0x55B6, 0x04E6, 0x55BF, 0x43E5, 0x55C3, 0x4B2E,

+    0x55C4, 0x1141, 0x55C5, 0x113F, 0x55C6, 0x4B2F, 0x55C7, 0x1178,

+    0x55C9, 0x43E6, 0x55CC, 0x43E7, 0x55CE, 0x41A9, 0x55D1, 0x43E8,

+    0x55D2, 0x43E2, 0x55D3, 0x4B30, 0x55D4, 0x1144, 0x55DA, 0x113E,

+    0x55DB, 0x4B31, 0x55DC, 0x1142, 0x55DD, 0x43E9, 0x55DF, 0x1140,

+    0x55E2, 0x43EB, 0x55E3, 0x089A, 0x55E4, 0x1143, 0x55E9, 0x43ED,

+    0x55EC, 0x4B32, 0x55EE, 0x4B33, 0x55F1, 0x4B34, 0x55F6, 0x4B35,

+    0x55F7, 0x1146, 0x55F8, 0x4B36, 0x55F9, 0x114B, 0x55FD, 0x1149,

+    0x55FE, 0x1148, 0x5605, 0x4B37, 0x5606, 0x0B70, 0x5607, 0x43F0,

+    0x5608, 0x383C, 0x5609, 0x0545, 0x560D, 0x4B38, 0x560E, 0x383D,

+    0x560F, 0x383E, 0x5610, 0x43F1, 0x5611, 0x4B39, 0x5612, 0x4B3A,

+    0x5614, 0x1145, 0x5616, 0x1147, 0x5617, 0x0990, 0x5618, 0x04D5,

+    0x561B, 0x114A, 0x5620, 0x3C1D, 0x5628, 0x43EE, 0x5629, 0x055E,

+    0x562C, 0x4B3B, 0x562F, 0x1155, 0x5630, 0x43F2, 0x5631, 0x09E4,

+    0x5632, 0x1151, 0x5634, 0x114F, 0x5635, 0x4B3C, 0x5636, 0x1150,

+    0x5637, 0x383F, 0x5638, 0x1152, 0x5639, 0x4B3D, 0x563B, 0x41AA,

+    0x563D, 0x43F4, 0x563F, 0x3840, 0x5640, 0x43F5, 0x5642, 0x04DF,

+    0x5647, 0x43F6, 0x5649, 0x3841, 0x564B, 0x3842, 0x564C, 0x0ABB,

+    0x564D, 0x4B3E, 0x564E, 0x114C, 0x564F, 0x3843, 0x5650, 0x114D,

+    0x5653, 0x1F1B, 0x5654, 0x4B3F, 0x565B, 0x05D8, 0x565E, 0x43F7,

+    0x5660, 0x43F8, 0x5664, 0x1154, 0x5666, 0x3844, 0x5668, 0x062B,

+    0x5669, 0x3845, 0x566A, 0x1157, 0x566B, 0x1153, 0x566C, 0x1156,

+    0x566D, 0x43F9, 0x566F, 0x3846, 0x5671, 0x3847, 0x5672, 0x3848,

+    0x5674, 0x0DFE, 0x5676, 0x3C33, 0x5678, 0x0CAD, 0x567A, 0x0D4C,

+    0x5680, 0x1159, 0x5685, 0x4B40, 0x5686, 0x1158, 0x5687, 0x05A3,

+    0x5688, 0x43FB, 0x568A, 0x115A, 0x568C, 0x43FC, 0x568F, 0x115D,

+    0x5694, 0x115C, 0x5695, 0x3849, 0x5699, 0x1DE6, 0x569A, 0x384A,

+    0x569D, 0x43FD, 0x569E, 0x41AB, 0x569F, 0x4B41, 0x56A0, 0x115B,

+    0x56A2, 0x0CEF, 0x56A5, 0x115E, 0x56A6, 0x4B42, 0x56A8, 0x43FE,

+    0x56A9, 0x41AC, 0x56AC, 0x384B, 0x56AD, 0x384C, 0x56AE, 0x115F,

+    0x56B1, 0x384D, 0x56B2, 0x43FF, 0x56B3, 0x41AD, 0x56B4, 0x1161,

+    0x56B6, 0x1160, 0x56B7, 0x4B43, 0x56BC, 0x1163, 0x56C0, 0x1166,

+    0x56C1, 0x1164, 0x56C2, 0x1162, 0x56C3, 0x1165, 0x56C5, 0x4400,

+    0x56C8, 0x1167, 0x56C9, 0x384E, 0x56CA, 0x1E5A, 0x56CC, 0x4B44,

+    0x56CD, 0x4401, 0x56CE, 0x1168, 0x56CF, 0x4B45, 0x56D1, 0x1169,

+    0x56D3, 0x116A, 0x56D7, 0x116B, 0x56D8, 0x107C, 0x56D9, 0x4B46,

+    0x56DA, 0x0928, 0x56DB, 0x089B, 0x56DD, 0x384F, 0x56DE, 0x0573,

+    0x56DF, 0x4402, 0x56E0, 0x04BC, 0x56E1, 0x4B47, 0x56E3, 0x0B82,

+    0x56E4, 0x3850, 0x56E8, 0x4403, 0x56EB, 0x4B48, 0x56ED, 0x4B49,

+    0x56EE, 0x116C, 0x56F0, 0x0814, 0x56F1, 0x4B4A, 0x56F2, 0x0493,

+    0x56F3, 0x0A24, 0x56F6, 0x4404, 0x56F7, 0x4405, 0x56F9, 0x116D,

+    0x56FA, 0x077B, 0x56FD, 0x0803, 0x56FF, 0x116F, 0x5700, 0x116E,

+    0x5703, 0x0E30, 0x5704, 0x1170, 0x5707, 0x4B4B, 0x5708, 0x1172,

+    0x5709, 0x1171, 0x570A, 0x3851, 0x570B, 0x1173, 0x570C, 0x4B4C,

+    0x570D, 0x1174, 0x570F, 0x074D, 0x5712, 0x0502, 0x5713, 0x1175,

+    0x5715, 0x3852, 0x5716, 0x1177, 0x5718, 0x1176, 0x571A, 0x4B4D,

+    0x571B, 0x4B4E, 0x571C, 0x1179, 0x571D, 0x4B4F, 0x571F, 0x0C54,

+    0x5721, 0x3680, 0x5723, 0x3853, 0x5726, 0x117A, 0x5727, 0x0479,

+    0x5728, 0x084F, 0x5729, 0x4408, 0x572C, 0x4B50, 0x572D, 0x0713,

+    0x572E, 0x4B51, 0x572F, 0x3854, 0x5730, 0x0B8D, 0x5733, 0x3855,

+    0x5734, 0x3856, 0x5737, 0x117B, 0x5738, 0x117C, 0x573B, 0x117E,

+    0x573D, 0x4B52, 0x573E, 0x4B53, 0x5740, 0x117F, 0x5742, 0x0854,

+    0x5745, 0x440A, 0x5746, 0x440B, 0x5747, 0x06C9, 0x574A, 0x0E65,

+    0x574C, 0x3857, 0x574D, 0x440C, 0x574E, 0x117D, 0x574F, 0x1180,

+    0x5750, 0x0831, 0x5751, 0x07B5, 0x5759, 0x20E0, 0x575F, 0x4B54,

+    0x5761, 0x1184, 0x5764, 0x0815, 0x5765, 0x20E1, 0x5766, 0x0B71,

+    0x5768, 0x440E, 0x5769, 0x1181, 0x576A, 0x0BF6, 0x576B, 0x4B55,

+    0x576D, 0x4B56, 0x576F, 0x440F, 0x5770, 0x3858, 0x5773, 0x4410,

+    0x5774, 0x4411, 0x5775, 0x4412, 0x5777, 0x41AE, 0x577A, 0x4B57,

+    0x577B, 0x4413, 0x577C, 0x41AF, 0x577F, 0x1185, 0x5782, 0x0A28,

+    0x5783, 0x4B58, 0x5788, 0x1183, 0x5789, 0x1186, 0x578B, 0x0715,

+    0x578C, 0x3859, 0x5793, 0x1187, 0x5797, 0x4B59, 0x579A, 0x4416,

+    0x579C, 0x385A, 0x579D, 0x4417, 0x579E, 0x4418, 0x57A0, 0x1188,

+    0x57A2, 0x07B6, 0x57A3, 0x059E, 0x57A4, 0x118A, 0x57A8, 0x4419,

+    0x57AA, 0x118B, 0x57AC, 0x20E2, 0x57AE, 0x4B5A, 0x57B0, 0x118C,

+    0x57B3, 0x1189, 0x57B8, 0x385B, 0x57C0, 0x1182, 0x57C3, 0x118D,

+    0x57C6, 0x118E, 0x57C7, 0x20E4, 0x57C8, 0x20E3, 0x57CB, 0x0E92,

+    0x57CC, 0x441C, 0x57CE, 0x09D3, 0x57CF, 0x41B1, 0x57D2, 0x1190,

+    0x57D3, 0x1191, 0x57D4, 0x118F, 0x57D5, 0x4B5B, 0x57D6, 0x1193,

+    0x57D7, 0x441A, 0x57DC, 0x0CEE, 0x57DE, 0x441F, 0x57DF, 0x04AC,

+    0x57E0, 0x0DC8, 0x57E3, 0x1194, 0x57E4, 0x41B2, 0x57E6, 0x385C,

+    0x57E7, 0x4B5C, 0x57ED, 0x385D, 0x57F0, 0x4420, 0x57F4, 0x09E5,

+    0x57F5, 0x385E, 0x57F6, 0x385F, 0x57F7, 0x08E5, 0x57F8, 0x4422,

+    0x57F9, 0x0D13, 0x57FA, 0x062C, 0x57FB, 0x4423, 0x57FC, 0x085B,

+    0x57FD, 0x4424, 0x57FF, 0x3860, 0x5800, 0x0E87, 0x5802, 0x0C8A,

+    0x5804, 0x4425, 0x5805, 0x074E, 0x5806, 0x0B2F, 0x5809, 0x3861,

+    0x580A, 0x1192, 0x580B, 0x1195, 0x580D, 0x4B5D, 0x5815, 0x0B24,

+    0x5819, 0x1196, 0x581D, 0x1197, 0x581E, 0x4426, 0x5820, 0x3862,

+    0x5821, 0x1199, 0x5824, 0x0C05, 0x5826, 0x4B5E, 0x5827, 0x4427,

+    0x582A, 0x05EA, 0x582F, 0x1D32, 0x5830, 0x0503, 0x5831, 0x0E43,

+    0x5832, 0x3863, 0x5834, 0x09D4, 0x5835, 0x0C42, 0x5839, 0x4428,

+    0x583A, 0x0856, 0x583D, 0x119F, 0x5840, 0x0E0D, 0x5841, 0x0FA5,

+    0x5849, 0x442A, 0x584A, 0x0574, 0x584B, 0x119B, 0x584C, 0x442B,

+    0x584D, 0x4B5F, 0x584F, 0x4B60, 0x5851, 0x0ABC, 0x5852, 0x119E,

+    0x5854, 0x0C5D, 0x5857, 0x0C43, 0x5858, 0x0C5E, 0x5859, 0x0D4D,

+    0x585A, 0x0BE9, 0x585E, 0x0839, 0x585F, 0x4B61, 0x5861, 0x1E47,

+    0x5862, 0x119A, 0x5864, 0x41B3, 0x5867, 0x442C, 0x5869, 0x0518,

+    0x586B, 0x0C30, 0x586D, 0x4B62, 0x5870, 0x119C, 0x5872, 0x1198,

+    0x5875, 0x0A16, 0x5879, 0x11A0, 0x587C, 0x3864, 0x587E, 0x0958,

+    0x587F, 0x4B63, 0x5880, 0x3865, 0x5881, 0x4B64, 0x5883, 0x06A5,

+    0x5885, 0x11A1, 0x5889, 0x41B4, 0x588A, 0x442D, 0x588B, 0x442E,

+    0x588D, 0x442F, 0x588F, 0x4430, 0x5890, 0x4431, 0x5893, 0x0E38,

+    0x5894, 0x4432, 0x5897, 0x0AFF, 0x5898, 0x4B65, 0x589C, 0x0BE2,

+    0x589D, 0x4433, 0x589E, 0x20E7, 0x589F, 0x11A3, 0x58A8, 0x0E7D,

+    0x58A9, 0x3866, 0x58AA, 0x4434, 0x58AB, 0x11A4, 0x58AE, 0x11A9,

+    0x58B1, 0x4435, 0x58B2, 0x20E8, 0x58B3, 0x0DFF, 0x58B8, 0x11A8,

+    0x58B9, 0x11A2, 0x58BA, 0x11A5, 0x58BB, 0x11A7, 0x58BC, 0x4B66,

+    0x58BE, 0x0816, 0x58C1, 0x0E19, 0x58C3, 0x4437, 0x58C5, 0x11AA,

+    0x58C7, 0x0B83, 0x58CA, 0x0575, 0x58CC, 0x09D5, 0x58CD, 0x4438,

+    0x58CE, 0x3867, 0x58D0, 0x3868, 0x58D1, 0x11AC, 0x58D2, 0x41B6,

+    0x58D3, 0x11AB, 0x58D4, 0x3869, 0x58D5, 0x07FA, 0x58D7, 0x11AD,

+    0x58D8, 0x11AF, 0x58D9, 0x11AE, 0x58DA, 0x386A, 0x58DC, 0x11B1,

+    0x58DE, 0x11A6, 0x58DF, 0x11B3, 0x58E0, 0x41B7, 0x58E2, 0x4439,

+    0x58E4, 0x11B2, 0x58E5, 0x11B0, 0x58E9, 0x386B, 0x58EB, 0x089C,

+    0x58EC, 0x0A17, 0x58EE, 0x0AD6, 0x58EF, 0x11B4, 0x58F0, 0x0A60,

+    0x58F1, 0x04B1, 0x58F2, 0x0D1A, 0x58F3, 0x443A, 0x58F4, 0x443B,

+    0x58F7, 0x0BF7, 0x58F9, 0x11B6, 0x58FA, 0x11B5, 0x58FB, 0x11B7,

+    0x58FC, 0x11B8, 0x58FD, 0x11B9, 0x5902, 0x11BA, 0x5905, 0x443C,

+    0x5906, 0x443D, 0x5909, 0x0E21, 0x590A, 0x11BB, 0x590B, 0x20E9,

+    0x590C, 0x386C, 0x590D, 0x443E, 0x590F, 0x0546, 0x5910, 0x11BC,

+    0x5914, 0x443F, 0x5915, 0x0F26, 0x5916, 0x058E, 0x5918, 0x10DE,

+    0x5919, 0x0952, 0x591A, 0x0B1F, 0x591B, 0x11BD, 0x591C, 0x0EF7,

+    0x591F, 0x4B67, 0x5922, 0x0EC0, 0x5923, 0x4B68, 0x5924, 0x386D,

+    0x5925, 0x11BF, 0x5927, 0x0B47, 0x5929, 0x0C31, 0x592A, 0x0B20,

+    0x592B, 0x0DC9, 0x592C, 0x11C0, 0x592D, 0x11C1, 0x592E, 0x051D,

+    0x592F, 0x386E, 0x5931, 0x08E6, 0x5932, 0x11C2, 0x5937, 0x0494,

+    0x5938, 0x11C3, 0x5939, 0x3725, 0x593D, 0x4442, 0x593E, 0x11C4,

+    0x5944, 0x0504, 0x5946, 0x4444, 0x5947, 0x062D, 0x5948, 0x0CB8,

+    0x5949, 0x0E44, 0x594E, 0x11C8, 0x594F, 0x0AD7, 0x5950, 0x11C7,

+    0x5951, 0x0716, 0x5953, 0x20EA, 0x5954, 0x0E89, 0x5955, 0x11C6,

+    0x5957, 0x0C5F, 0x5958, 0x11CA, 0x5959, 0x4B69, 0x595A, 0x11C9,

+    0x595B, 0x20EB, 0x595D, 0x20EC, 0x595F, 0x4447, 0x5960, 0x11CC,

+    0x5961, 0x386F, 0x5962, 0x11CB, 0x5963, 0x20ED, 0x5965, 0x051E,

+    0x5967, 0x11CD, 0x5968, 0x0991, 0x5969, 0x11CF, 0x596A, 0x0B63,

+    0x596C, 0x11CE, 0x596D, 0x3870, 0x596E, 0x0E03, 0x5973, 0x0981,

+    0x5974, 0x0C55, 0x5975, 0x4449, 0x5976, 0x444A, 0x5978, 0x11D0,

+    0x5979, 0x4B6A, 0x597C, 0x444B, 0x597D, 0x07B7, 0x5981, 0x11D1,

+    0x5982, 0x0CD7, 0x5983, 0x0D72, 0x5984, 0x0EDD, 0x598A, 0x0CDB,

+    0x598B, 0x41B9, 0x598D, 0x11DA, 0x5992, 0x41BA, 0x5993, 0x0652,

+    0x5996, 0x0F2F, 0x5997, 0x4B6B, 0x5999, 0x0EBB, 0x599B, 0x1239,

+    0x599D, 0x11D2, 0x599F, 0x444C, 0x59A3, 0x11D5, 0x59A4, 0x20EE,

+    0x59A5, 0x0B25, 0x59A8, 0x0E66, 0x59AC, 0x0C44, 0x59AE, 0x444D,

+    0x59AF, 0x4B6C, 0x59B2, 0x11D6, 0x59B3, 0x4B6D, 0x59B9, 0x0E93,

+    0x59BA, 0x20EF, 0x59BB, 0x083A, 0x59BC, 0x444E, 0x59BE, 0x0992,

+    0x59C3, 0x41BB, 0x59C6, 0x11D7, 0x59C8, 0x444F, 0x59C9, 0x089E,

+    0x59CA, 0x3871, 0x59CB, 0x089D, 0x59CD, 0x4450, 0x59D0, 0x047D,

+    0x59D1, 0x077C, 0x59D2, 0x3872, 0x59D3, 0x0A4F, 0x59D4, 0x0495,

+    0x59D9, 0x11DB, 0x59DA, 0x11DC, 0x59DC, 0x11D9, 0x59DD, 0x3873,

+    0x59DE, 0x4451, 0x59DF, 0x4B6E, 0x59E3, 0x3874, 0x59E4, 0x3875,

+    0x59E5, 0x04DA, 0x59E6, 0x05EB, 0x59E7, 0x4452, 0x59E8, 0x11D8,

+    0x59EA, 0x0ED1, 0x59EB, 0x0DA3, 0x59EC, 0x36AD, 0x59EE, 0x4453,

+    0x59F1, 0x4B6F, 0x59F6, 0x046C, 0x59F8, 0x4B70, 0x59FB, 0x04BD,

+    0x59FF, 0x089F, 0x5A01, 0x0496, 0x5A03, 0x0467, 0x5A04, 0x3876,

+    0x5A09, 0x11E1, 0x5A0C, 0x3877, 0x5A0D, 0x4457, 0x5A11, 0x11DF,

+    0x5A13, 0x41BC, 0x5A17, 0x4458, 0x5A18, 0x0EC8, 0x5A1A, 0x11E2,

+    0x5A1B, 0x35C1, 0x5A1C, 0x11E0, 0x5A1F, 0x11DE, 0x5A20, 0x09F7,

+    0x5A23, 0x3878, 0x5A25, 0x11DD, 0x5A27, 0x4459, 0x5A29, 0x0E2A,

+    0x5A2D, 0x445A, 0x5A2F, 0x0798, 0x5A35, 0x11E6, 0x5A36, 0x11E7,

+    0x5A3C, 0x0993, 0x5A40, 0x11E3, 0x5A41, 0x0FD2, 0x5A46, 0x0D02,

+    0x5A47, 0x3879, 0x5A49, 0x11E5, 0x5A55, 0x387A, 0x5A5A, 0x0817,

+    0x5A62, 0x11E8, 0x5A63, 0x387B, 0x5A65, 0x445B, 0x5A66, 0x0DCA,

+    0x5A67, 0x41BD, 0x5A6A, 0x11E9, 0x5A6C, 0x11E4, 0x5A6D, 0x387C,

+    0x5A77, 0x41BE, 0x5A7A, 0x445C, 0x5A7E, 0x387D, 0x5A7F, 0x0EC7,

+    0x5A84, 0x41BF, 0x5A8B, 0x445D, 0x5A92, 0x0D14, 0x5A9A, 0x11EA,

+    0x5A9B, 0x0DA4, 0x5A9C, 0x445E, 0x5A9E, 0x387E, 0x5A9F, 0x445F,

+    0x5AA0, 0x4460, 0x5AA2, 0x4461, 0x5AA7, 0x387F, 0x5AAC, 0x3880,

+    0x5AB1, 0x4462, 0x5AB2, 0x4B71, 0x5AB3, 0x3881, 0x5AB5, 0x4463,

+    0x5AB8, 0x4B72, 0x5ABA, 0x4464, 0x5ABC, 0x11EB, 0x5ABD, 0x11EF,

+    0x5ABE, 0x11EC, 0x5ABF, 0x4465, 0x5AC1, 0x0547, 0x5AC2, 0x11EE,

+    0x5AC4, 0x41C0, 0x5AC9, 0x08E7, 0x5ACB, 0x11ED, 0x5ACC, 0x074F,

+    0x5AD0, 0x11FB, 0x5AD6, 0x11F4, 0x5AD7, 0x11F1, 0x5ADA, 0x4466,

+    0x5ADC, 0x4467, 0x5AE0, 0x3882, 0x5AE1, 0x0BA2, 0x5AE3, 0x11F0,

+    0x5AE5, 0x4468, 0x5AE6, 0x11F2, 0x5AE9, 0x11F3, 0x5AEA, 0x4B73,

+    0x5AEE, 0x446A, 0x5AF0, 0x4469, 0x5AF5, 0x446B, 0x5AF6, 0x4B74,

+    0x5AFA, 0x11F5, 0x5AFB, 0x11F6, 0x5B00, 0x3883, 0x5B08, 0x446C,

+    0x5B09, 0x062E, 0x5B0B, 0x11F8, 0x5B0C, 0x11F7, 0x5B16, 0x11F9,

+    0x5B17, 0x446D, 0x5B19, 0x3884, 0x5B1B, 0x4B75, 0x5B1D, 0x4B76,

+    0x5B21, 0x4B77, 0x5B22, 0x09D6, 0x5B25, 0x3885, 0x5B2A, 0x11FC,

+    0x5B2C, 0x0BF8, 0x5B2D, 0x3886, 0x5B30, 0x04E7, 0x5B32, 0x11FA,

+    0x5B34, 0x446E, 0x5B36, 0x11FD, 0x5B38, 0x4B78, 0x5B3E, 0x11FE,

+    0x5B40, 0x1201, 0x5B41, 0x3887, 0x5B43, 0x11FF, 0x5B45, 0x1200,

+    0x5B4C, 0x446F, 0x5B50, 0x08A0, 0x5B51, 0x1202, 0x5B52, 0x4470,

+    0x5B54, 0x07B8, 0x5B55, 0x1203, 0x5B56, 0x20F0, 0x5B57, 0x08C8,

+    0x5B58, 0x0B18, 0x5B5A, 0x1204, 0x5B5B, 0x1205, 0x5B5C, 0x08A8,

+    0x5B5D, 0x07B9, 0x5B5F, 0x0EDE, 0x5B63, 0x0642, 0x5B64, 0x077D,

+    0x5B65, 0x1206, 0x5B66, 0x05B6, 0x5B68, 0x4471, 0x5B69, 0x1207,

+    0x5B6B, 0x0B19, 0x5B6F, 0x4472, 0x5B70, 0x1208, 0x5B71, 0x1230,

+    0x5B73, 0x1209, 0x5B75, 0x120A, 0x5B76, 0x3728, 0x5B78, 0x120B,

+    0x5B7A, 0x120D, 0x5B7C, 0x3888, 0x5B7D, 0x41C2, 0x5B7E, 0x3889,

+    0x5B7F, 0x388A, 0x5B80, 0x120E, 0x5B81, 0x4473, 0x5B82, 0x3610,

+    0x5B83, 0x120F, 0x5B84, 0x4474, 0x5B85, 0x0B50, 0x5B87, 0x04C9,

+    0x5B88, 0x0915, 0x5B89, 0x0486, 0x5B8A, 0x388B, 0x5B8B, 0x0AD9,

+    0x5B8C, 0x05EC, 0x5B8D, 0x08E1, 0x5B8F, 0x07BA, 0x5B93, 0x41C3,

+    0x5B95, 0x0C60, 0x5B96, 0x4476, 0x5B97, 0x092B, 0x5B98, 0x05ED,

+    0x5B99, 0x0BA6, 0x5B9A, 0x0C06, 0x5B9B, 0x047C, 0x5B9C, 0x0653,

+    0x5B9D, 0x0E45, 0x5B9F, 0x08EE, 0x5BA2, 0x066C, 0x5BA3, 0x0A8F,

+    0x5BA4, 0x08E8, 0x5BA5, 0x0F12, 0x5BA6, 0x1210, 0x5BAC, 0x4477,

+    0x5BAE, 0x0676, 0x5BB0, 0x083B, 0x5BB3, 0x0590, 0x5BB4, 0x0505,

+    0x5BB5, 0x0994, 0x5BB6, 0x0548, 0x5BB7, 0x4B79, 0x5BB8, 0x1211,

+    0x5BB9, 0x0F30, 0x5BBF, 0x0953, 0x5BC0, 0x20F1, 0x5BC2, 0x0910,

+    0x5BC3, 0x1212, 0x5BC4, 0x062F, 0x5BC5, 0x0CAA, 0x5BC6, 0x0EB5,

+    0x5BC7, 0x1213, 0x5BC9, 0x1214, 0x5BCC, 0x0DCB, 0x5BCE, 0x447A,

+    0x5BD0, 0x1216, 0x5BD2, 0x05E4, 0x5BD3, 0x06EF, 0x5BD4, 0x1215,

+    0x5BD6, 0x447B, 0x5BD7, 0x4B7A, 0x5BD8, 0x20F3, 0x5BDB, 0x05EE,

+    0x5BDD, 0x09F8, 0x5BDE, 0x121A, 0x5BDF, 0x086F, 0x5BE0, 0x4B7B,

+    0x5BE1, 0x0549, 0x5BE2, 0x1219, 0x5BE4, 0x1217, 0x5BE5, 0x121B,

+    0x5BE6, 0x1218, 0x5BE7, 0x0CE1, 0x5BE8, 0x148E, 0x5BE9, 0x09F9,

+    0x5BEB, 0x121C, 0x5BEC, 0x4F4E, 0x5BEE, 0x0F88, 0x5BF0, 0x121D,

+    0x5BF1, 0x447E, 0x5BF3, 0x121F, 0x5BF5, 0x0BBC, 0x5BF6, 0x121E,

+    0x5BF8, 0x0A47, 0x5BFA, 0x08C9, 0x5BFD, 0x447F, 0x5BFE, 0x0B30,

+    0x5BFF, 0x0923, 0x5C01, 0x0DE7, 0x5C02, 0x0A90, 0x5C03, 0x4481,

+    0x5C04, 0x08F9, 0x5C05, 0x1220, 0x5C06, 0x0995, 0x5C07, 0x1221,

+    0x5C08, 0x1222, 0x5C09, 0x0497, 0x5C0A, 0x0B1A, 0x5C0B, 0x0A18,

+    0x5C0D, 0x1223, 0x5C0E, 0x0C8B, 0x5C0F, 0x0996, 0x5C11, 0x0997,

+    0x5C12, 0x41C4, 0x5C13, 0x1224, 0x5C14, 0x372A, 0x5C16, 0x0A91,

+    0x5C19, 0x360B, 0x5C1A, 0x0998, 0x5C1E, 0x20F5, 0x5C1F, 0x4B7C,

+    0x5C20, 0x1225, 0x5C22, 0x1226, 0x5C23, 0x388C, 0x5C24, 0x0EEC,

+    0x5C28, 0x1227, 0x5C29, 0x4482, 0x5C2A, 0x4B7D, 0x5C2B, 0x388D,

+    0x5C2C, 0x4B7E, 0x5C2D, 0x06BE, 0x5C30, 0x388E, 0x5C31, 0x092C,

+    0x5C36, 0x4B7F, 0x5C38, 0x1228, 0x5C39, 0x1229, 0x5C3A, 0x0908,

+    0x5C3B, 0x09F2, 0x5C3C, 0x0CCC, 0x5C3D, 0x0A1A, 0x5C3E, 0x0D8C,

+    0x5C3F, 0x0CD8, 0x5C40, 0x06C1, 0x5C41, 0x122A, 0x5C45, 0x0689,

+    0x5C46, 0x122B, 0x5C48, 0x06F6, 0x5C4A, 0x0CA7, 0x5C4B, 0x0530,

+    0x5C4D, 0x08A1, 0x5C4E, 0x122C, 0x5C4F, 0x122F, 0x5C50, 0x122E,

+    0x5C51, 0x06F5, 0x5C53, 0x122D, 0x5C55, 0x0C32, 0x5C59, 0x4B80,

+    0x5C5B, 0x1E92, 0x5C5C, 0x4B81, 0x5C5E, 0x0B10, 0x5C5F, 0x4484,

+    0x5C60, 0x0C45, 0x5C61, 0x08F4, 0x5C62, 0x1E0D, 0x5C63, 0x388F,

+    0x5C64, 0x0ADA, 0x5C65, 0x0F64, 0x5C67, 0x4485, 0x5C68, 0x4486,

+    0x5C69, 0x3890, 0x5C6C, 0x1231, 0x5C6D, 0x4B82, 0x5C6E, 0x1232,

+    0x5C6F, 0x0CAE, 0x5C70, 0x4487, 0x5C71, 0x0881, 0x5C76, 0x1234,

+    0x5C79, 0x1235, 0x5C7A, 0x41C7, 0x5C7C, 0x3891, 0x5C88, 0x448C,

+    0x5C8A, 0x448D, 0x5C8C, 0x1236, 0x5C8F, 0x41C8, 0x5C90, 0x0630,

+    0x5C91, 0x1237, 0x5C94, 0x1238, 0x5C9F, 0x41C9, 0x5CA0, 0x4491,

+    0x5CA1, 0x052C, 0x5CA2, 0x4492, 0x5CA3, 0x41CA, 0x5CA6, 0x20F6,

+    0x5CA7, 0x4493, 0x5CA8, 0x0ABD, 0x5CA9, 0x0620, 0x5CAA, 0x41CB,

+    0x5CAB, 0x123A, 0x5CAC, 0x0EB4, 0x5CAD, 0x4495, 0x5CB1, 0x0B32,

+    0x5CB3, 0x05B7, 0x5CB5, 0x4496, 0x5CB6, 0x123C, 0x5CB7, 0x123E,

+    0x5CB8, 0x061B, 0x5CBA, 0x20F7, 0x5CBB, 0x123B, 0x5CBC, 0x123D,

+    0x5CBE, 0x1240, 0x5CC5, 0x123F, 0x5CC7, 0x1241, 0x5CC9, 0x4498,

+    0x5CCB, 0x3892, 0x5CD0, 0x41CC, 0x5CD2, 0x3893, 0x5CD9, 0x1242,

+    0x5CDD, 0x4B83, 0x5CE0, 0x0C95, 0x5CE1, 0x06A6, 0x5CE6, 0x372C,

+    0x5CE8, 0x0565, 0x5CE9, 0x1243, 0x5CEA, 0x1248, 0x5CED, 0x1246,

+    0x5CEF, 0x0E47, 0x5CF0, 0x0E46, 0x5CF4, 0x3894, 0x5CF5, 0x20F8,

+    0x5CF6, 0x0C61, 0x5CFA, 0x1245, 0x5CFB, 0x095E, 0x5CFD, 0x1244,

+    0x5D01, 0x4B84, 0x5D06, 0x449B, 0x5D07, 0x0A38, 0x5D0B, 0x1249,

+    0x5D0D, 0x41CE, 0x5D0E, 0x085A, 0x5D10, 0x449C, 0x5D11, 0x124F,

+    0x5D14, 0x1250, 0x5D15, 0x124A, 0x5D16, 0x0591, 0x5D17, 0x124B,

+    0x5D18, 0x1254, 0x5D19, 0x1253, 0x5D1A, 0x1252, 0x5D1B, 0x124E,

+    0x5D1D, 0x449E, 0x5D1F, 0x124D, 0x5D20, 0x449F, 0x5D22, 0x1251,

+    0x5D24, 0x3895, 0x5D26, 0x3896, 0x5D27, 0x20F9, 0x5D29, 0x0E48,

+    0x5D2B, 0x449D, 0x5D31, 0x44A0, 0x5D34, 0x4B85, 0x5D39, 0x44A1,

+    0x5D3D, 0x4B86, 0x5D42, 0x20FC, 0x5D43, 0x3897, 0x5D46, 0x3898,

+    0x5D47, 0x41CF, 0x5D4A, 0x3899, 0x5D4B, 0x1258, 0x5D4C, 0x1255,

+    0x5D4E, 0x1257, 0x5D50, 0x0F5C, 0x5D52, 0x1256, 0x5D53, 0x20FA,

+    0x5D59, 0x4B87, 0x5D5C, 0x124C, 0x5D61, 0x44A3, 0x5D69, 0x0A39,

+    0x5D6A, 0x44A4, 0x5D6C, 0x1259, 0x5D6D, 0x20FD, 0x5D6F, 0x0827,

+    0x5D70, 0x44A6, 0x5D73, 0x125A, 0x5D76, 0x125B, 0x5D7E, 0x4B88,

+    0x5D81, 0x41D0, 0x5D82, 0x125E, 0x5D83, 0x4B89, 0x5D84, 0x125D,

+    0x5D87, 0x125C, 0x5D88, 0x44A9, 0x5D8B, 0x0C62, 0x5D8C, 0x1247,

+    0x5D90, 0x1264, 0x5D92, 0x389A, 0x5D94, 0x389B, 0x5D97, 0x44AB,

+    0x5D99, 0x389C, 0x5D9D, 0x1260, 0x5DA0, 0x389D, 0x5DA2, 0x125F,

+    0x5DA4, 0x41D1, 0x5DA7, 0x41D2, 0x5DAC, 0x1261, 0x5DAE, 0x1262,

+    0x5DB0, 0x44AC, 0x5DB2, 0x3C2D, 0x5DB4, 0x44AD, 0x5DB7, 0x1265,

+    0x5DB8, 0x20FE, 0x5DB9, 0x20FF, 0x5DBA, 0x0FAE, 0x5DBC, 0x1266,

+    0x5DBD, 0x1263, 0x5DC7, 0x4B8A, 0x5DC9, 0x1267, 0x5DCB, 0x41D3,

+    0x5DCC, 0x061C, 0x5DCD, 0x1268, 0x5DD0, 0x2100, 0x5DD1, 0x44AF,

+    0x5DD2, 0x126A, 0x5DD3, 0x1269, 0x5DD6, 0x126B, 0x5DD7, 0x44B0,

+    0x5DD8, 0x389E, 0x5DDB, 0x126C, 0x5DDD, 0x0A92, 0x5DDE, 0x092D,

+    0x5DE0, 0x389F, 0x5DE1, 0x096E, 0x5DE2, 0x3432, 0x5DE3, 0x0AE5,

+    0x5DE4, 0x44B2, 0x5DE5, 0x07BB, 0x5DE6, 0x0828, 0x5DE7, 0x07BC,

+    0x5DE8, 0x068A, 0x5DE9, 0x44B3, 0x5DEB, 0x126D, 0x5DEE, 0x0829,

+    0x5DF1, 0x077E, 0x5DF2, 0x126E, 0x5DF3, 0x0EB2, 0x5DF4, 0x0CF9,

+    0x5DF5, 0x126F, 0x5DF7, 0x07BD, 0x5DF8, 0x38A0, 0x5DF9, 0x4B8B,

+    0x5DFB, 0x05E8, 0x5DFD, 0x0B65, 0x5DFE, 0x06CA, 0x5DFF, 0x35E2,

+    0x5E00, 0x38A1, 0x5E02, 0x08A2, 0x5E03, 0x0DCD, 0x5E06, 0x0D55,

+    0x5E0B, 0x1270, 0x5E0C, 0x0631, 0x5E11, 0x1273, 0x5E12, 0x38A2,

+    0x5E14, 0x38A3, 0x5E15, 0x38A4, 0x5E16, 0x0BBD, 0x5E18, 0x38A5,

+    0x5E19, 0x1272, 0x5E1A, 0x1271, 0x5E1B, 0x1274, 0x5E1D, 0x0C07,

+    0x5E1F, 0x44B7, 0x5E25, 0x0A29, 0x5E28, 0x4B8C, 0x5E2B, 0x08A3,

+    0x5E2D, 0x0A6E, 0x5E2E, 0x38A6, 0x5E2F, 0x0B33, 0x5E30, 0x063C,

+    0x5E32, 0x4B8D, 0x5E33, 0x0BBE, 0x5E35, 0x4B8E, 0x5E36, 0x1275,

+    0x5E37, 0x1276, 0x5E38, 0x09D7, 0x5E3D, 0x0E67, 0x5E3E, 0x44B8,

+    0x5E40, 0x1279, 0x5E43, 0x1278, 0x5E44, 0x1277, 0x5E45, 0x0DEF,

+    0x5E47, 0x1280, 0x5E49, 0x44B9, 0x5E4C, 0x0E88, 0x5E4E, 0x127A,

+    0x5E54, 0x127C, 0x5E55, 0x0E99, 0x5E56, 0x44BB, 0x5E57, 0x127B,

+    0x5E58, 0x38A7, 0x5E5B, 0x4B8F, 0x5E5E, 0x41D4, 0x5E5F, 0x127D,

+    0x5E61, 0x0D3C, 0x5E62, 0x127E, 0x5E63, 0x0E0E, 0x5E64, 0x127F,

+    0x5E68, 0x4B90, 0x5E6A, 0x4B91, 0x5E6B, 0x38A8, 0x5E6C, 0x38A9,

+    0x5E6D, 0x44BD, 0x5E6E, 0x44BE, 0x5E72, 0x05EF, 0x5E73, 0x0E0F,

+    0x5E74, 0x0CE5, 0x5E75, 0x1281, 0x5E76, 0x1282, 0x5E77, 0x4B92,

+    0x5E78, 0x07BE, 0x5E79, 0x05F0, 0x5E7A, 0x1283, 0x5E7B, 0x076C,

+    0x5E7C, 0x0F2E, 0x5E7D, 0x0F13, 0x5E7E, 0x0632, 0x5E7F, 0x1285,

+    0x5E80, 0x4B93, 0x5E81, 0x0BBF, 0x5E83, 0x07BF, 0x5E84, 0x0999,

+    0x5E87, 0x0D73, 0x5E8A, 0x099A, 0x5E8B, 0x4B94, 0x5E8F, 0x0982,

+    0x5E95, 0x0C08, 0x5E96, 0x0E49, 0x5E97, 0x0C33, 0x5E99, 0x36B0,

+    0x5E9A, 0x07C0, 0x5E9C, 0x0DCE, 0x5EA0, 0x1286, 0x5EA5, 0x44C0,

+    0x5EA6, 0x0C53, 0x5EA7, 0x0832, 0x5EA8, 0x38AA, 0x5EAA, 0x38AB,

+    0x5EAB, 0x077F, 0x5EAC, 0x44C1, 0x5EAD, 0x0C09, 0x5EB3, 0x4B95,

+    0x5EB5, 0x0487, 0x5EB6, 0x0978, 0x5EB7, 0x07C1, 0x5EB8, 0x0F31,

+    0x5EB9, 0x44C2, 0x5EBD, 0x4B96, 0x5EBE, 0x38AC, 0x5EBF, 0x38AD,

+    0x5EC1, 0x1287, 0x5EC2, 0x1288, 0x5EC3, 0x0D07, 0x5EC6, 0x44C3,

+    0x5EC8, 0x1289, 0x5EC9, 0x0FBF, 0x5ECA, 0x0FD3, 0x5ECB, 0x3C1E,

+    0x5ECF, 0x128B, 0x5ED0, 0x128A, 0x5ED1, 0x4B97, 0x5ED2, 0x38AF,

+    0x5ED3, 0x05A5, 0x5ED4, 0x4B98, 0x5ED5, 0x4B99, 0x5ED6, 0x128C,

+    0x5ED9, 0x44C4, 0x5EDA, 0x128F, 0x5EDB, 0x1290, 0x5EDD, 0x128E,

+    0x5EDF, 0x0DB2, 0x5EE0, 0x099B, 0x5EE1, 0x1292, 0x5EE2, 0x1291,

+    0x5EE3, 0x128D, 0x5EE8, 0x1293, 0x5EE9, 0x1294, 0x5EEC, 0x1295,

+    0x5EF0, 0x1298, 0x5EF1, 0x1296, 0x5EF3, 0x1297, 0x5EF4, 0x1299,

+    0x5EF6, 0x0506, 0x5EF7, 0x0C0A, 0x5EF8, 0x129A, 0x5EF9, 0x41D5,

+    0x5EFA, 0x0750, 0x5EFB, 0x0576, 0x5EFC, 0x0CEC, 0x5EFD, 0x44C6,

+    0x5EFE, 0x129B, 0x5EFF, 0x0CD3, 0x5F00, 0x41D6, 0x5F01, 0x0E2B,

+    0x5F02, 0x41D7, 0x5F03, 0x129C, 0x5F04, 0x0FD4, 0x5F07, 0x38B0,

+    0x5F08, 0x44C7, 0x5F09, 0x129D, 0x5F0A, 0x0E10, 0x5F0B, 0x12A0,

+    0x5F0C, 0x0FFA, 0x5F0D, 0x100A, 0x5F0E, 0x38B1, 0x5F0F, 0x08DC,

+    0x5F10, 0x0CCD, 0x5F11, 0x12A1, 0x5F13, 0x0677, 0x5F14, 0x0BC0,

+    0x5F15, 0x04BE, 0x5F16, 0x12A2, 0x5F17, 0x0DF6, 0x5F18, 0x07C2,

+    0x5F1B, 0x0B8E, 0x5F1C, 0x38B2, 0x5F1D, 0x38B3, 0x5F1E, 0x44C9,

+    0x5F1F, 0x0C0B, 0x5F21, 0x2101, 0x5F22, 0x38B4, 0x5F23, 0x41D8,

+    0x5F25, 0x0EFB, 0x5F26, 0x076D, 0x5F27, 0x0780, 0x5F28, 0x38B5,

+    0x5F29, 0x12A3, 0x5F2D, 0x12A4, 0x5F2F, 0x12AA, 0x5F31, 0x0911,

+    0x5F34, 0x2102, 0x5F35, 0x0BC1, 0x5F36, 0x38B6, 0x5F37, 0x06A7,

+    0x5F38, 0x12A5, 0x5F3A, 0x3598, 0x5F3B, 0x38B7, 0x5F3C, 0x0D9D,

+    0x5F3D, 0x41D9, 0x5F3E, 0x0B84, 0x5F40, 0x38B8, 0x5F41, 0x12A6,

+    0x5F45, 0x20B2, 0x5F47, 0x44CA, 0x5F48, 0x12A7, 0x5F4A, 0x06A8,

+    0x5F4C, 0x12A8, 0x5F4D, 0x4B9A, 0x5F4E, 0x12A9, 0x5F50, 0x38B9,

+    0x5F51, 0x12AB, 0x5F53, 0x0C70, 0x5F54, 0x41DA, 0x5F56, 0x12AC,

+    0x5F57, 0x12AD, 0x5F58, 0x38BA, 0x5F59, 0x12AE, 0x5F5C, 0x129F,

+    0x5F5D, 0x129E, 0x5F61, 0x12AF, 0x5F62, 0x0717, 0x5F63, 0x44CB,

+    0x5F64, 0x38BB, 0x5F65, 0x36AC, 0x5F66, 0x0D99, 0x5F67, 0x2103,

+    0x5F69, 0x083C, 0x5F6A, 0x0DA9, 0x5F6B, 0x0BC2, 0x5F6C, 0x0DBD,

+    0x5F6D, 0x12B0, 0x5F70, 0x099C, 0x5F71, 0x04E8, 0x5F72, 0x44CC,

+    0x5F73, 0x12B1, 0x5F77, 0x12B2, 0x5F79, 0x0EFE, 0x5F7C, 0x0D74,

+    0x5F7D, 0x41DB, 0x5F7E, 0x44CD, 0x5F7F, 0x12B5, 0x5F80, 0x051F,

+    0x5F81, 0x0A50, 0x5F82, 0x12B4, 0x5F83, 0x12B3, 0x5F84, 0x0718,

+    0x5F85, 0x0B34, 0x5F87, 0x12B9, 0x5F88, 0x12B7, 0x5F89, 0x38BC,

+    0x5F8A, 0x12B6, 0x5F8B, 0x0F6F, 0x5F8C, 0x0799, 0x5F8F, 0x44CE,

+    0x5F90, 0x0983, 0x5F91, 0x12B8, 0x5F92, 0x0C46, 0x5F93, 0x0948,

+    0x5F97, 0x0C98, 0x5F98, 0x12BC, 0x5F99, 0x12BB, 0x5F9C, 0x38BD,

+    0x5F9E, 0x12BA, 0x5FA0, 0x12BD, 0x5FA1, 0x079A, 0x5FA2, 0x44CF,

+    0x5FA4, 0x38BF, 0x5FA7, 0x38BE, 0x5FA8, 0x12BE, 0x5FA9, 0x0DEE,

+    0x5FAA, 0x0965, 0x5FAC, 0x4B9B, 0x5FAD, 0x12BF, 0x5FAE, 0x0D8D,

+    0x5FAF, 0x38C0, 0x5FB3, 0x0C99, 0x5FB4, 0x0BC3, 0x5FB5, 0x3438,

+    0x5FB7, 0x2104, 0x5FB8, 0x38C1, 0x5FB9, 0x0C2A, 0x5FBC, 0x12C0,

+    0x5FBD, 0x0645, 0x5FC3, 0x09FA, 0x5FC4, 0x38C2, 0x5FC5, 0x0D9E,

+    0x5FC7, 0x44D0, 0x5FC9, 0x38C3, 0x5FCB, 0x44D1, 0x5FCC, 0x0633,

+    0x5FCD, 0x0CDC, 0x5FD2, 0x44D2, 0x5FD3, 0x44D3, 0x5FD4, 0x44D4,

+    0x5FD6, 0x12C1, 0x5FD7, 0x08A4, 0x5FD8, 0x0E68, 0x5FD9, 0x0E69,

+    0x5FDC, 0x0520, 0x5FDD, 0x12C6, 0x5FDE, 0x2105, 0x5FE0, 0x0BA7,

+    0x5FE1, 0x38C4, 0x5FE2, 0x44D5, 0x5FE4, 0x12C3, 0x5FE9, 0x38C5,

+    0x5FEA, 0x4B9C, 0x5FEB, 0x0577, 0x5FED, 0x38C6, 0x5FEE, 0x44D6,

+    0x5FEF, 0x44D7, 0x5FF0, 0x12F6, 0x5FF1, 0x12C5, 0x5FF3, 0x44D8,

+    0x5FF5, 0x0CE6, 0x5FF8, 0x12C4, 0x5FFB, 0x12C2, 0x5FFC, 0x38C7,

+    0x5FFD, 0x080C, 0x5FFF, 0x12C8, 0x6007, 0x4B9D, 0x600D, 0x41DC,

+    0x600E, 0x12CE, 0x600F, 0x12D4, 0x6010, 0x12CC, 0x6012, 0x0C56,

+    0x6014, 0x41DD, 0x6015, 0x12D1, 0x6016, 0x0DCF, 0x6017, 0x38C8,

+    0x6018, 0x41DE, 0x6019, 0x12CB, 0x601A, 0x38C9, 0x601B, 0x12D0,

+    0x601C, 0x0FAF, 0x601D, 0x08A5, 0x6020, 0x0B35, 0x6021, 0x12C9,

+    0x6022, 0x44DA, 0x6024, 0x44DB, 0x6025, 0x0678, 0x6026, 0x12D3,

+    0x6027, 0x0A51, 0x6028, 0x0507, 0x6029, 0x12CD, 0x602A, 0x0578,

+    0x602B, 0x12D2, 0x602F, 0x06A9, 0x6031, 0x12CF, 0x6033, 0x38CA,

+    0x6035, 0x41DF, 0x603A, 0x12D5, 0x6041, 0x12D7, 0x6042, 0x12E1,

+    0x6043, 0x12DF, 0x6046, 0x12DC, 0x6047, 0x41E0, 0x6049, 0x4B9E,

+    0x604A, 0x12DB, 0x604B, 0x0FC0, 0x604C, 0x44DD, 0x604D, 0x12DD,

+    0x6050, 0x06AA, 0x6052, 0x07C3, 0x6054, 0x4B9F, 0x6055, 0x0984,

+    0x6059, 0x12E4, 0x605A, 0x12D6, 0x605D, 0x2106, 0x605F, 0x12DA,

+    0x6060, 0x12CA, 0x6061, 0x38CB, 0x6062, 0x057A, 0x6063, 0x12DE,

+    0x6064, 0x12E0, 0x6065, 0x0B8F, 0x6067, 0x4BA0, 0x6068, 0x0818,

+    0x6069, 0x0538, 0x606A, 0x12D8, 0x606B, 0x12E3, 0x606C, 0x12E2,

+    0x606D, 0x06AB, 0x606F, 0x0B09, 0x6070, 0x05C4, 0x6075, 0x0719,

+    0x6077, 0x12D9, 0x607F, 0x38CC, 0x6081, 0x12E5, 0x6083, 0x12E8,

+    0x6084, 0x12EA, 0x6085, 0x2107, 0x6089, 0x08E9, 0x608A, 0x2108,

+    0x608B, 0x12F0, 0x608C, 0x0C0C, 0x608D, 0x12E6, 0x6092, 0x12EE,

+    0x6094, 0x0579, 0x6095, 0x44DE, 0x6096, 0x12EC, 0x6097, 0x12ED,

+    0x609A, 0x12E9, 0x609B, 0x12EB, 0x609D, 0x41E1, 0x609E, 0x38CD,

+    0x609F, 0x079B, 0x60A0, 0x0F14, 0x60A3, 0x05F1, 0x60A4, 0x38CE,

+    0x60A6, 0x04FB, 0x60A7, 0x12EF, 0x60A8, 0x44DF, 0x60A9, 0x0CF0,

+    0x60AA, 0x0471, 0x60B0, 0x38CF, 0x60B1, 0x44E1, 0x60B2, 0x0D75,

+    0x60B3, 0x12C7, 0x60B4, 0x12F5, 0x60B5, 0x12F9, 0x60B6, 0x0EF1,

+    0x60B8, 0x12F2, 0x60BB, 0x4BA1, 0x60BC, 0x0C63, 0x60BD, 0x12F7,

+    0x60BE, 0x44E2, 0x60C4, 0x4BA2, 0x60C5, 0x09D8, 0x60C6, 0x12F8,

+    0x60C7, 0x0CAF, 0x60C8, 0x44E3, 0x60CB, 0x38D0, 0x60D1, 0x0FED,

+    0x60D3, 0x12F4, 0x60D4, 0x41E2, 0x60D5, 0x210A, 0x60D8, 0x12FA,

+    0x60D9, 0x44E4, 0x60DA, 0x080D, 0x60DB, 0x38D1, 0x60DC, 0x0A6F,

+    0x60DD, 0x41E3, 0x60DE, 0x2109, 0x60DF, 0x0498, 0x60E0, 0x12F3,

+    0x60E1, 0x12F1, 0x60E3, 0x0ADC, 0x60E7, 0x12E7, 0x60E8, 0x0882,

+    0x60EE, 0x44E5, 0x60F0, 0x0B26, 0x60F1, 0x1306, 0x60F2, 0x210C,

+    0x60F3, 0x0ADD, 0x60F4, 0x1301, 0x60F5, 0x44E6, 0x60F6, 0x12FE,

+    0x60F7, 0x12FF, 0x60F8, 0x38D2, 0x60F9, 0x0912, 0x60FA, 0x1302,

+    0x60FB, 0x1305, 0x60FD, 0x4BA3, 0x6100, 0x1300, 0x6101, 0x092F,

+    0x6103, 0x1303, 0x6106, 0x12FD, 0x6108, 0x0F08, 0x6109, 0x0F07,

+    0x610A, 0x4BA4, 0x610D, 0x1307, 0x610E, 0x1308, 0x610F, 0x0499,

+    0x6110, 0x44E7, 0x6111, 0x210D, 0x6112, 0x38D3, 0x6113, 0x38D4,

+    0x6114, 0x38D5, 0x6115, 0x12FC, 0x6116, 0x4BA5, 0x6119, 0x44E8,

+    0x611A, 0x06EA, 0x611B, 0x046A, 0x611C, 0x38D6, 0x611E, 0x44E9,

+    0x611F, 0x05F2, 0x6120, 0x210B, 0x6121, 0x1304, 0x6127, 0x130C,

+    0x6128, 0x130B, 0x612A, 0x4BA6, 0x612B, 0x41E4, 0x612C, 0x1310,

+    0x6130, 0x210F, 0x6134, 0x1311, 0x6136, 0x4BA7, 0x6137, 0x210E,

+    0x613A, 0x44EA, 0x613C, 0x130F, 0x613D, 0x1312, 0x613E, 0x130A,

+    0x613F, 0x130E, 0x6141, 0x44EC, 0x6142, 0x1313, 0x6144, 0x1314,

+    0x6146, 0x44ED, 0x6147, 0x1309, 0x6148, 0x08CA, 0x614A, 0x130D,

+    0x614B, 0x0B36, 0x614C, 0x07C4, 0x614D, 0x12FB, 0x614E, 0x09FB,

+    0x6153, 0x1321, 0x6155, 0x0E39, 0x6158, 0x1317, 0x6159, 0x1318,

+    0x615A, 0x1319, 0x615D, 0x1320, 0x615E, 0x4BA8, 0x615F, 0x131F,

+    0x6160, 0x44EE, 0x6162, 0x0EAB, 0x6163, 0x05F3, 0x6164, 0x4BA9,

+    0x6165, 0x131D, 0x6167, 0x071B, 0x6168, 0x0592, 0x616B, 0x131A,

+    0x616E, 0x0F80, 0x616F, 0x131C, 0x6170, 0x049A, 0x6171, 0x131E,

+    0x6173, 0x1315, 0x6174, 0x131B, 0x6175, 0x1322, 0x6176, 0x071A,

+    0x6177, 0x1316, 0x617B, 0x4BAA, 0x617C, 0x38D7, 0x617D, 0x4BAB,

+    0x617E, 0x0F47, 0x617F, 0x4BAC, 0x6182, 0x0F15, 0x6187, 0x1325,

+    0x618A, 0x1329, 0x618D, 0x38D8, 0x618E, 0x0B00, 0x6190, 0x0FC1,

+    0x6191, 0x132A, 0x6192, 0x44F0, 0x6193, 0x44F1, 0x6194, 0x1327,

+    0x6196, 0x1324, 0x6197, 0x44F2, 0x6198, 0x2110, 0x6199, 0x1323,

+    0x619A, 0x1328, 0x619D, 0x4BAD, 0x619F, 0x38D9, 0x61A4, 0x0E00,

+    0x61A5, 0x44F3, 0x61A7, 0x0C8C, 0x61A8, 0x38DA, 0x61A9, 0x071C,

+    0x61AB, 0x132B, 0x61AC, 0x1326, 0x61AD, 0x44F4, 0x61AE, 0x132C,

+    0x61B2, 0x0751, 0x61B6, 0x0531, 0x61B8, 0x4BAE, 0x61B9, 0x41E6,

+    0x61BA, 0x1334, 0x61BC, 0x41E5, 0x61BE, 0x05F4, 0x61C2, 0x38DB,

+    0x61C3, 0x1332, 0x61C6, 0x1333, 0x61C7, 0x0819, 0x61C8, 0x1331,

+    0x61C9, 0x132F, 0x61CA, 0x132E, 0x61CB, 0x1335, 0x61CC, 0x132D,

+    0x61CD, 0x1337, 0x61D0, 0x057B, 0x61D5, 0x44F6, 0x61DC, 0x4BAF,

+    0x61DD, 0x44F7, 0x61DF, 0x38DC, 0x61E2, 0x4BB0, 0x61E3, 0x1339,

+    0x61E5, 0x4BB1, 0x61E6, 0x1338, 0x61E8, 0x4BB2, 0x61F2, 0x0BC4,

+    0x61F4, 0x133C, 0x61F5, 0x44F8, 0x61F6, 0x133A, 0x61F7, 0x1330,

+    0x61F8, 0x0752, 0x61FA, 0x133B, 0x61FC, 0x133F, 0x61FD, 0x133E,

+    0x61FE, 0x1340, 0x61FF, 0x133D, 0x6200, 0x1341, 0x6204, 0x4BB3,

+    0x6207, 0x4BB4, 0x6208, 0x1342, 0x6209, 0x1343, 0x620A, 0x0E3A,

+    0x620C, 0x1345, 0x620D, 0x1344, 0x620E, 0x0949, 0x6210, 0x0A52,

+    0x6211, 0x0566, 0x6212, 0x057C, 0x6213, 0x2111, 0x6214, 0x1346,

+    0x6215, 0x38DD, 0x6216, 0x0483, 0x621A, 0x0A70, 0x621B, 0x1347,

+    0x621D, 0x1A64, 0x621E, 0x1348, 0x621F, 0x0737, 0x6221, 0x1349,

+    0x6222, 0x41E7, 0x6223, 0x44FA, 0x6226, 0x0A93, 0x6229, 0x38DE,

+    0x622A, 0x134A, 0x622E, 0x134B, 0x622F, 0x0654, 0x6230, 0x134C,

+    0x6231, 0x4BB5, 0x6232, 0x134D, 0x6233, 0x134E, 0x6234, 0x0B37,

+    0x6236, 0x35BD, 0x6238, 0x0781, 0x6239, 0x4BB6, 0x623B, 0x0EED,

+    0x623D, 0x4BB7, 0x623E, 0x344E, 0x623F, 0x0E6A, 0x6240, 0x0974,

+    0x6241, 0x134F, 0x6243, 0x38DF, 0x6246, 0x38E0, 0x6247, 0x0A94,

+    0x6248, 0x1B1A, 0x6249, 0x0D76, 0x624B, 0x0916, 0x624C, 0x38E1,

+    0x624D, 0x083D, 0x624E, 0x1350, 0x6251, 0x38E2, 0x6252, 0x44FB,

+    0x6253, 0x0B27, 0x6255, 0x0DF7, 0x6256, 0x38E3, 0x6258, 0x0B51,

+    0x625A, 0x41E8, 0x625B, 0x1353, 0x625E, 0x1351, 0x6260, 0x1354,

+    0x6261, 0x44FC, 0x6263, 0x1352, 0x6264, 0x44FD, 0x6268, 0x1355,

+    0x626D, 0x44FF, 0x626E, 0x0E01, 0x626F, 0x41E9, 0x6271, 0x047B,

+    0x6273, 0x4500, 0x6276, 0x0DD0, 0x6279, 0x0D77, 0x627A, 0x4BB8,

+    0x627B, 0x44FE, 0x627C, 0x1356, 0x627E, 0x1359, 0x627F, 0x099D,

+    0x6280, 0x0655, 0x6282, 0x1357, 0x6283, 0x135E, 0x6284, 0x099E,

+    0x6285, 0x35C5, 0x6289, 0x1358, 0x628A, 0x0CFA, 0x6290, 0x4BB9,

+    0x6291, 0x0F48, 0x6292, 0x135A, 0x6293, 0x135B, 0x6294, 0x135F,

+    0x6295, 0x0C64, 0x6296, 0x135C, 0x6297, 0x07C5, 0x6298, 0x0A82,

+    0x6299, 0x4501, 0x629B, 0x136D, 0x629C, 0x0D48, 0x629E, 0x0B52,

+    0x62A6, 0x2112, 0x62A8, 0x4BBA, 0x62AB, 0x0D78, 0x62AC, 0x13B2,

+    0x62B1, 0x0E4A, 0x62B5, 0x0C0D, 0x62B9, 0x0EA3, 0x62BB, 0x1362,

+    0x62BC, 0x0521, 0x62BD, 0x0BA8, 0x62C2, 0x136B, 0x62C4, 0x38E4,

+    0x62C5, 0x0B72, 0x62C6, 0x1365, 0x62C7, 0x136C, 0x62C8, 0x1367,

+    0x62C9, 0x136E, 0x62CA, 0x136A, 0x62CC, 0x1369, 0x62CD, 0x0D25,

+    0x62CF, 0x1363, 0x62D0, 0x057D, 0x62D1, 0x1361, 0x62D2, 0x068B,

+    0x62D3, 0x0B53, 0x62D4, 0x135D, 0x62D5, 0x4502, 0x62D6, 0x41EA,

+    0x62D7, 0x1360, 0x62D8, 0x07C6, 0x62D9, 0x0A7F, 0x62DA, 0x4BBB,

+    0x62DB, 0x099F, 0x62DC, 0x1368, 0x62DD, 0x0D08, 0x62E0, 0x068C,

+    0x62E1, 0x05A6, 0x62EC, 0x05C5, 0x62ED, 0x09E7, 0x62EE, 0x1370,

+    0x62EF, 0x1375, 0x62F1, 0x1371, 0x62F3, 0x0753, 0x62F4, 0x4BBC,

+    0x62F5, 0x1376, 0x62F6, 0x0870, 0x62F7, 0x07FB, 0x62FC, 0x38E5,

+    0x62FD, 0x4504, 0x62FE, 0x0930, 0x62FF, 0x1364, 0x6301, 0x08CB,

+    0x6302, 0x1373, 0x6303, 0x4505, 0x6307, 0x08A6, 0x6308, 0x1374,

+    0x6309, 0x0488, 0x630A, 0x38E6, 0x630C, 0x136F, 0x630D, 0x38E7,

+    0x6310, 0x4506, 0x6311, 0x0BC5, 0x6316, 0x4BBD, 0x6318, 0x38E8,

+    0x6319, 0x068D, 0x631B, 0x3737, 0x631F, 0x06AC, 0x6327, 0x1372,

+    0x6328, 0x046B, 0x632A, 0x4BBE, 0x632B, 0x0833, 0x632F, 0x09FC,

+    0x6332, 0x4509, 0x6335, 0x450A, 0x6336, 0x4BBF, 0x6339, 0x38E9,

+    0x633A, 0x0C0E, 0x633B, 0x450B, 0x633C, 0x450C, 0x633D, 0x0D68,

+    0x633E, 0x1378, 0x633F, 0x0AE0, 0x6341, 0x450D, 0x6342, 0x38EA,

+    0x6343, 0x38EB, 0x6344, 0x450E, 0x6346, 0x4BC0, 0x6349, 0x0B0A,

+    0x634B, 0x4BC1, 0x634C, 0x0879, 0x634D, 0x1379, 0x634E, 0x450F,

+    0x634F, 0x137B, 0x6350, 0x1377, 0x6353, 0x4BC2, 0x6355, 0x0E31,

+    0x6357, 0x0BD9, 0x6359, 0x4511, 0x635C, 0x0ADE, 0x6365, 0x38EC,

+    0x6367, 0x0E4B, 0x6368, 0x08FA, 0x6369, 0x1387, 0x636B, 0x1386,

+    0x636C, 0x4514, 0x636E, 0x0A3E, 0x6371, 0x4BC3, 0x6372, 0x0754,

+    0x6374, 0x38ED, 0x6375, 0x4BC4, 0x6376, 0x1380, 0x6377, 0x09A1,

+    0x637A, 0x0CC0, 0x637B, 0x0CE7, 0x637C, 0x41EB, 0x637D, 0x38EE,

+    0x637F, 0x4BC5, 0x6380, 0x137E, 0x6382, 0x4BC6, 0x6383, 0x0ADF,

+    0x6384, 0x38EF, 0x6387, 0x38F0, 0x6388, 0x0924, 0x6389, 0x1383,

+    0x638A, 0x4BC7, 0x638C, 0x09A0, 0x638E, 0x137D, 0x638F, 0x1382,

+    0x6390, 0x38F1, 0x6392, 0x0D09, 0x6394, 0x4517, 0x6396, 0x137C,

+    0x6398, 0x06F7, 0x6399, 0x4515, 0x639B, 0x05BB, 0x639E, 0x38F2,

+    0x639F, 0x1384, 0x63A0, 0x0F73, 0x63A1, 0x083E, 0x63A2, 0x0B73,

+    0x63A3, 0x1381, 0x63A5, 0x0A80, 0x63A7, 0x07C7, 0x63A8, 0x0A2A,

+    0x63A9, 0x0508, 0x63AA, 0x0ABE, 0x63AB, 0x137F, 0x63AC, 0x065F,

+    0x63AE, 0x4BC8, 0x63AF, 0x4BC9, 0x63B2, 0x071D, 0x63B4, 0x0BEB,

+    0x63B5, 0x1385, 0x63BB, 0x0AE1, 0x63BD, 0x4518, 0x63BE, 0x1388,

+    0x63C0, 0x138A, 0x63C3, 0x0B17, 0x63C4, 0x1390, 0x63C6, 0x138B,

+    0x63C9, 0x138D, 0x63CF, 0x0DB3, 0x63D0, 0x0C0F, 0x63D1, 0x38F3,

+    0x63D2, 0x138E, 0x63D4, 0x4519, 0x63D5, 0x451A, 0x63D6, 0x0F16,

+    0x63DA, 0x0F32, 0x63DB, 0x05F5, 0x63DC, 0x38F4, 0x63E0, 0x451B,

+    0x63E1, 0x0472, 0x63E3, 0x138C, 0x63E5, 0x41EC, 0x63E9, 0x1389,

+    0x63EA, 0x4BCA, 0x63EB, 0x451C, 0x63EC, 0x451D, 0x63ED, 0x341C,

+    0x63EE, 0x0634, 0x63F2, 0x451E, 0x63F4, 0x0509, 0x63F5, 0x2113,

+    0x63F6, 0x138F, 0x63F7, 0x3644, 0x63F8, 0x4BCB, 0x63F9, 0x4BCC,

+    0x63FA, 0x0F33, 0x6406, 0x1393, 0x6409, 0x38F5, 0x640D, 0x0B1B,

+    0x640F, 0x139A, 0x6410, 0x38F6, 0x6412, 0x4BCD, 0x6413, 0x1394,

+    0x6414, 0x1E2C, 0x6416, 0x1391, 0x6417, 0x1398, 0x6418, 0x4BCE,

+    0x641C, 0x137A, 0x641E, 0x451F, 0x6420, 0x4BCF, 0x6422, 0x38F7,

+    0x6424, 0x4BD0, 0x6425, 0x4520, 0x6426, 0x1395, 0x6428, 0x1399,

+    0x6429, 0x4521, 0x642A, 0x4BD1, 0x642C, 0x0D56, 0x642D, 0x0C65,

+    0x642F, 0x4522, 0x6434, 0x1392, 0x6435, 0x4BD2, 0x6436, 0x1396,

+    0x643A, 0x071E, 0x643D, 0x4BD3, 0x643E, 0x0861, 0x643F, 0x4BD4,

+    0x6442, 0x0A81, 0x644E, 0x139E, 0x6451, 0x1E43, 0x6452, 0x4BD5,

+    0x6454, 0x38F8, 0x6458, 0x0C20, 0x645A, 0x4523, 0x645B, 0x38F9,

+    0x645D, 0x4524, 0x645F, 0x4BD6, 0x6460, 0x2114, 0x6467, 0x139B,

+    0x6469, 0x0E8E, 0x646D, 0x38FA, 0x646F, 0x139C, 0x6473, 0x4525,

+    0x6474, 0x4BD7, 0x6476, 0x139D, 0x6478, 0x0EDA, 0x6479, 0x41ED,

+    0x647A, 0x0A46, 0x647B, 0x38FB, 0x647D, 0x4526, 0x6483, 0x0738,

+    0x6487, 0x4527, 0x6488, 0x13A4, 0x6490, 0x4BD8, 0x6491, 0x4528,

+    0x6492, 0x0883, 0x6493, 0x13A1, 0x6495, 0x13A0, 0x6498, 0x4BD9,

+    0x6499, 0x4BDA, 0x649A, 0x0CE8, 0x649D, 0x2115, 0x649E, 0x0C8D,

+    0x649F, 0x4529, 0x64A4, 0x0C2B, 0x64A5, 0x13A2, 0x64A9, 0x13A3,

+    0x64AB, 0x0DE1, 0x64AC, 0x4BDB, 0x64AD, 0x0CFB, 0x64AE, 0x0871,

+    0x64B0, 0x0A95, 0x64B2, 0x0E7E, 0x64B3, 0x4BDC, 0x64B9, 0x05A7,

+    0x64BB, 0x13AA, 0x64BC, 0x13A5, 0x64BE, 0x38FC, 0x64BF, 0x38FD,

+    0x64C1, 0x0F34, 0x64C2, 0x13AC, 0x64C4, 0x41EE, 0x64C5, 0x13A8,

+    0x64C7, 0x13A9, 0x64CA, 0x341D, 0x64CB, 0x452A, 0x64CC, 0x452B,

+    0x64CD, 0x0AE2, 0x64CE, 0x2116, 0x64D0, 0x41EF, 0x64D2, 0x13A7,

+    0x64D4, 0x1366, 0x64D5, 0x452C, 0x64D7, 0x452D, 0x64D8, 0x13AB,

+    0x64DA, 0x13A6, 0x64E0, 0x13B0, 0x64E1, 0x13B1, 0x64E2, 0x0C21,

+    0x64E3, 0x13B3, 0x64E4, 0x452F, 0x64E5, 0x38FE, 0x64E6, 0x0872,

+    0x64E7, 0x13AE, 0x64EC, 0x0656, 0x64ED, 0x4BDD, 0x64EF, 0x13B4,

+    0x64F0, 0x4BDE, 0x64F1, 0x13AD, 0x64F2, 0x13B8, 0x64F4, 0x13B7,

+    0x64F6, 0x13B6, 0x64F7, 0x38FF, 0x64FA, 0x13B9, 0x64FB, 0x3900,

+    0x64FD, 0x13BB, 0x64FE, 0x09D9, 0x64FF, 0x4530, 0x6500, 0x13BA,

+    0x6504, 0x3901, 0x6505, 0x13BE, 0x650F, 0x4532, 0x6514, 0x4533,

+    0x6516, 0x3902, 0x6518, 0x13BC, 0x6519, 0x3903, 0x651B, 0x4BDF,

+    0x651C, 0x13BD, 0x651D, 0x1397, 0x651E, 0x4535, 0x651F, 0x4BE0,

+    0x6522, 0x1E97, 0x6523, 0x13C0, 0x6524, 0x13BF, 0x6529, 0x41F0,

+    0x652A, 0x139F, 0x652B, 0x13C1, 0x652C, 0x13B5, 0x652E, 0x4BE1,

+    0x652F, 0x08A7, 0x6532, 0x4536, 0x6534, 0x13C2, 0x6535, 0x13C3,

+    0x6536, 0x13C5, 0x6537, 0x13C4, 0x6538, 0x13C6, 0x6539, 0x057E,

+    0x653B, 0x07C8, 0x653E, 0x0E4C, 0x653F, 0x0A53, 0x6544, 0x4537,

+    0x6545, 0x0782, 0x6547, 0x3904, 0x6548, 0x13C8, 0x6549, 0x4BE2,

+    0x654D, 0x13CB, 0x654E, 0x2117, 0x654F, 0x0DC4, 0x6551, 0x0679,

+    0x6554, 0x4538, 0x6555, 0x13CA, 0x6556, 0x13C9, 0x6557, 0x0D0A,

+    0x6558, 0x13CC, 0x6559, 0x06AD, 0x655D, 0x13CE, 0x655E, 0x13CD,

+    0x6560, 0x4BE3, 0x6562, 0x05F6, 0x6563, 0x0884, 0x6566, 0x0CB0,

+    0x6567, 0x3905, 0x656B, 0x4539, 0x656C, 0x071F, 0x6570, 0x0A3A,

+    0x6572, 0x13CF, 0x6574, 0x0A54, 0x6575, 0x0C22, 0x6577, 0x0DD1,

+    0x6578, 0x13D0, 0x657A, 0x453A, 0x6581, 0x3906, 0x6582, 0x13D1,

+    0x6583, 0x13D2, 0x6584, 0x453B, 0x6585, 0x3907, 0x6587, 0x0E08,

+    0x6588, 0x120C, 0x6589, 0x0A6A, 0x658A, 0x453C, 0x658C, 0x0DBE,

+    0x658E, 0x0848, 0x6590, 0x0D79, 0x6591, 0x0D57, 0x6592, 0x4BE4,

+    0x6595, 0x4BE5, 0x6597, 0x0C47, 0x6599, 0x0F89, 0x659B, 0x13D4,

+    0x659C, 0x08FC, 0x659D, 0x41F1, 0x659F, 0x13D5, 0x65A1, 0x047A,

+    0x65A4, 0x06CC, 0x65A5, 0x0A71, 0x65A7, 0x0DD2, 0x65AB, 0x13D6,

+    0x65AC, 0x0890, 0x65AD, 0x0B85, 0x65AF, 0x08A9, 0x65B0, 0x09FD,

+    0x65B2, 0x453D, 0x65B4, 0x4BE6, 0x65B5, 0x453E, 0x65B7, 0x13D7,

+    0x65B8, 0x453F, 0x65B9, 0x0E4D, 0x65BC, 0x0519, 0x65BD, 0x08AA,

+    0x65BE, 0x4BE7, 0x65BF, 0x4540, 0x65C1, 0x13DA, 0x65C2, 0x3908,

+    0x65C3, 0x13D8, 0x65C4, 0x13DB, 0x65C5, 0x0F81, 0x65C6, 0x13D9,

+    0x65C8, 0x4BE8, 0x65C9, 0x4541, 0x65CB, 0x0A9F, 0x65CC, 0x13DC,

+    0x65CE, 0x4BE9, 0x65CF, 0x0B12, 0x65D0, 0x4BEA, 0x65D2, 0x13DD,

+    0x65D4, 0x4542, 0x65D7, 0x0636, 0x65D9, 0x13DF, 0x65DB, 0x13DE,

+    0x65DF, 0x4BEB, 0x65E0, 0x13E0, 0x65E1, 0x13E1, 0x65E2, 0x0637,

+    0x65E3, 0x3585, 0x65E5, 0x0CD4, 0x65E6, 0x0B74, 0x65E7, 0x0686,

+    0x65E8, 0x08AB, 0x65E9, 0x0AE3, 0x65EC, 0x0966, 0x65ED, 0x0474,

+    0x65F0, 0x3909, 0x65F1, 0x13E2, 0x65F2, 0x390A, 0x65F9, 0x4544,

+    0x65FA, 0x0522, 0x65FB, 0x13E6, 0x65FC, 0x4545, 0x6600, 0x2118,

+    0x6602, 0x07C9, 0x6603, 0x13E5, 0x6604, 0x4546, 0x6606, 0x081B,

+    0x6607, 0x09A2, 0x6608, 0x4547, 0x6609, 0x211A, 0x660A, 0x13E4,

+    0x660C, 0x09A3, 0x660E, 0x0ECC, 0x660F, 0x081A, 0x6613, 0x049B,

+    0x6614, 0x0A72, 0x6615, 0x2119, 0x661C, 0x13EB, 0x661E, 0x4F50,

+    0x661F, 0x0A55, 0x6620, 0x04E9, 0x6621, 0x4548, 0x6622, 0x41F3,

+    0x6624, 0x211D, 0x6625, 0x095F, 0x6627, 0x0E94, 0x6628, 0x0862,

+    0x662A, 0x4549, 0x662B, 0x41F4, 0x662C, 0x390B, 0x662D, 0x09A4,

+    0x662E, 0x211B, 0x662F, 0x0A4B, 0x6630, 0x41F5, 0x6631, 0x20AE,

+    0x6633, 0x41F6, 0x6634, 0x13EA, 0x6635, 0x13E8, 0x6636, 0x13E9,

+    0x663A, 0x41F2, 0x663B, 0x1E00, 0x663C, 0x0BA9, 0x663F, 0x1409,

+    0x6641, 0x13EF, 0x6642, 0x08CC, 0x6643, 0x07CA, 0x6644, 0x13ED,

+    0x6645, 0x454A, 0x6648, 0x41F7, 0x6649, 0x13EE, 0x664B, 0x09FE,

+    0x664C, 0x390C, 0x664E, 0x454C, 0x664F, 0x13EC, 0x6651, 0x454B,

+    0x6652, 0x087D, 0x6657, 0x211F, 0x6659, 0x2120, 0x665A, 0x3441,

+    0x665B, 0x390D, 0x665C, 0x390E, 0x665D, 0x13F1, 0x665E, 0x13F0,

+    0x665F, 0x13F5, 0x6661, 0x390F, 0x6662, 0x13F6, 0x6663, 0x373A,

+    0x6664, 0x13F2, 0x6665, 0x211E, 0x6666, 0x0580, 0x6667, 0x13F3,

+    0x6668, 0x13F4, 0x6669, 0x0D69, 0x666A, 0x4551, 0x666B, 0x3910,

+    0x666C, 0x4552, 0x666D, 0x4553, 0x666E, 0x0DD3, 0x666F, 0x0720,

+    0x6670, 0x13F7, 0x6673, 0x2122, 0x6674, 0x0A56, 0x6676, 0x09A5,

+    0x6677, 0x41F9, 0x6678, 0x41FA, 0x667A, 0x0B90, 0x667B, 0x4554,

+    0x667E, 0x4BEC, 0x6680, 0x4555, 0x6681, 0x06BF, 0x6683, 0x13F8,

+    0x6684, 0x13FC, 0x6687, 0x054B, 0x6688, 0x13F9, 0x6689, 0x13FB,

+    0x668B, 0x4BED, 0x668C, 0x4BEE, 0x668D, 0x41FB, 0x668E, 0x13FA,

+    0x6690, 0x4556, 0x6691, 0x0975, 0x6692, 0x4557, 0x6696, 0x0B86,

+    0x6697, 0x0489, 0x6698, 0x13FD, 0x6699, 0x2123, 0x669D, 0x13FE,

+    0x66A0, 0x2124, 0x66A2, 0x0BC6, 0x66A4, 0x3912, 0x66A6, 0x0FB9,

+    0x66AB, 0x0891, 0x66AD, 0x4559, 0x66AE, 0x0E3B, 0x66B1, 0x455A,

+    0x66B2, 0x2125, 0x66B3, 0x4BEF, 0x66B4, 0x0E6B, 0x66B5, 0x455B,

+    0x66B8, 0x1405, 0x66B9, 0x1400, 0x66BB, 0x41FC, 0x66BC, 0x1403,

+    0x66BE, 0x1402, 0x66BF, 0x2126, 0x66C0, 0x4BF0, 0x66C1, 0x13FF,

+    0x66C4, 0x1404, 0x66C6, 0x3455, 0x66C7, 0x0CB6, 0x66C8, 0x3913,

+    0x66C9, 0x1401, 0x66CF, 0x4BF1, 0x66D6, 0x1406, 0x66D9, 0x0976,

+    0x66DA, 0x1407, 0x66DB, 0x41FD, 0x66DC, 0x0F35, 0x66DD, 0x0D2E,

+    0x66E0, 0x1408, 0x66E6, 0x140A, 0x66E8, 0x41FE, 0x66E9, 0x140B,

+    0x66EC, 0x3914, 0x66F0, 0x140C, 0x66F2, 0x06C2, 0x66F3, 0x04EA,

+    0x66F4, 0x07CB, 0x66F5, 0x140D, 0x66F7, 0x140E, 0x66F8, 0x097B,

+    0x66F9, 0x0AE4, 0x66FA, 0x2127, 0x66FB, 0x20B1, 0x66FC, 0x10ED,

+    0x66FD, 0x0AC0, 0x66FE, 0x0ABF, 0x66FF, 0x0B38, 0x6700, 0x0837,

+    0x6701, 0x455F, 0x6703, 0x104B, 0x6705, 0x3915, 0x6708, 0x0744,

+    0x6709, 0x0F17, 0x670B, 0x0E4E, 0x670D, 0x0DF0, 0x670E, 0x2128,

+    0x670F, 0x140F, 0x6712, 0x4560, 0x6713, 0x3916, 0x6714, 0x0863,

+    0x6715, 0x0BDB, 0x6716, 0x1410, 0x6717, 0x0FD5, 0x6719, 0x4562,

+    0x671B, 0x0E6C, 0x671D, 0x0BC7, 0x671E, 0x1411, 0x671F, 0x0638,

+    0x6725, 0x4BF2, 0x6726, 0x1412, 0x6727, 0x1413, 0x6728, 0x0EE6,

+    0x672A, 0x0EB0, 0x672B, 0x0EA4, 0x672C, 0x0E8A, 0x672D, 0x0873,

+    0x672E, 0x1415, 0x6731, 0x0917, 0x6733, 0x3917, 0x6734, 0x0E7F,

+    0x6735, 0x4BF3, 0x6736, 0x1417, 0x6737, 0x141A, 0x6738, 0x1419,

+    0x673A, 0x0635, 0x673D, 0x067A, 0x673F, 0x1416, 0x6741, 0x1418,

+    0x6743, 0x35B7, 0x6746, 0x141B, 0x6747, 0x41FF, 0x6748, 0x3918,

+    0x6749, 0x0A3F, 0x674C, 0x3919, 0x674D, 0x4565, 0x674E, 0x0F65,

+    0x674F, 0x048D, 0x6750, 0x0850, 0x6751, 0x0B1C, 0x6753, 0x0909,

+    0x6754, 0x4566, 0x6755, 0x4BF4, 0x6756, 0x09DB, 0x6759, 0x141E,

+    0x675C, 0x0C48, 0x675D, 0x4567, 0x675E, 0x141C, 0x675F, 0x0B0B,

+    0x6760, 0x141D, 0x6761, 0x09DA, 0x6762, 0x0EE9, 0x6763, 0x141F,

+    0x6764, 0x1420, 0x6765, 0x0F52, 0x6766, 0x212A, 0x676A, 0x1425,

+    0x676D, 0x07CC, 0x676E, 0x3571, 0x676F, 0x0D0B, 0x6770, 0x1422,

+    0x6771, 0x0C66, 0x6772, 0x13E3, 0x6773, 0x13E7, 0x6774, 0x456B,

+    0x6775, 0x0669, 0x6776, 0x391A, 0x6777, 0x0CFD, 0x677B, 0x391B,

+    0x677C, 0x1424, 0x677E, 0x09A6, 0x677F, 0x0D58, 0x6780, 0x4BF5,

+    0x6781, 0x4200, 0x6785, 0x142A, 0x6787, 0x0D8E, 0x6789, 0x1421,

+    0x678B, 0x1427, 0x678C, 0x1426, 0x678F, 0x4BF6, 0x6790, 0x0A73,

+    0x6791, 0x4BF7, 0x6792, 0x456D, 0x6793, 0x4201, 0x6795, 0x0E9B,

+    0x6797, 0x0F9B, 0x6798, 0x4202, 0x679A, 0x0E95, 0x679B, 0x4203,

+    0x679C, 0x054C, 0x679D, 0x08AC, 0x67A0, 0x0FEE, 0x67A1, 0x1429,

+    0x67A2, 0x0A3B, 0x67A4, 0x4BF8, 0x67A6, 0x1428, 0x67A9, 0x1423,

+    0x67AF, 0x0783, 0x67B0, 0x391C, 0x67B1, 0x4BF9, 0x67B2, 0x391D,

+    0x67B3, 0x142F, 0x67B4, 0x142D, 0x67B5, 0x4BFA, 0x67B6, 0x054D,

+    0x67B7, 0x142B, 0x67B8, 0x1431, 0x67B9, 0x1437, 0x67BB, 0x212B,

+    0x67BE, 0x4BFB, 0x67C0, 0x212D, 0x67C1, 0x0B28, 0x67C3, 0x4571,

+    0x67C4, 0x0E11, 0x67C6, 0x1439, 0x67C8, 0x4572, 0x67CA, 0x0D94,

+    0x67CE, 0x1438, 0x67CF, 0x0D26, 0x67D0, 0x0E6D, 0x67D1, 0x05F7,

+    0x67D2, 0x4573, 0x67D3, 0x0A9B, 0x67D4, 0x094A, 0x67D7, 0x391F,

+    0x67D8, 0x0BEF, 0x67D9, 0x3920, 0x67DA, 0x0F18, 0x67DB, 0x4574,

+    0x67DD, 0x1434, 0x67DE, 0x1433, 0x67E2, 0x1435, 0x67E4, 0x1432,

+    0x67E7, 0x143A, 0x67E9, 0x1430, 0x67EC, 0x142E, 0x67EE, 0x1436,

+    0x67EF, 0x142C, 0x67F0, 0x3921, 0x67F1, 0x0BAA, 0x67F3, 0x0F04,

+    0x67F4, 0x08F2, 0x67F5, 0x0864, 0x67F7, 0x4575, 0x67F9, 0x391E,

+    0x67FA, 0x1E9A, 0x67FB, 0x082A, 0x67FC, 0x4204, 0x67FE, 0x0E9D,

+    0x67FF, 0x059F, 0x6801, 0x36F2, 0x6802, 0x0BEA, 0x6803, 0x0CA2,

+    0x6804, 0x04EB, 0x6805, 0x1E07, 0x6810, 0x4570, 0x6813, 0x0A96,

+    0x6816, 0x0A58, 0x6817, 0x0700, 0x6818, 0x4579, 0x681D, 0x4205,

+    0x681E, 0x143C, 0x681F, 0x457A, 0x6821, 0x07CD, 0x6822, 0x05DA,

+    0x6828, 0x4BFC, 0x6829, 0x143E, 0x682A, 0x05D2, 0x682B, 0x1444,

+    0x682C, 0x3922, 0x682D, 0x457B, 0x6830, 0x3923, 0x6831, 0x3924,

+    0x6832, 0x1441, 0x6833, 0x457D, 0x6834, 0x0A97, 0x6838, 0x05A9,

+    0x6839, 0x081C, 0x683B, 0x457E, 0x683C, 0x05A8, 0x683D, 0x083F,

+    0x683E, 0x457F, 0x6840, 0x143F, 0x6841, 0x073B, 0x6842, 0x0721,

+    0x6843, 0x0C67, 0x6844, 0x212F, 0x6845, 0x4580, 0x6846, 0x143D,

+    0x6848, 0x048A, 0x6849, 0x4581, 0x684C, 0x4582, 0x684D, 0x1440,

+    0x684E, 0x1442, 0x6850, 0x06C5, 0x6851, 0x0702, 0x6852, 0x212C,

+    0x6853, 0x05F8, 0x6854, 0x0665, 0x6855, 0x4583, 0x6857, 0x4584,

+    0x6859, 0x1445, 0x685B, 0x3925, 0x685C, 0x0869, 0x685D, 0x0E9F,

+    0x685F, 0x0885, 0x6863, 0x1446, 0x6867, 0x0DA2, 0x686B, 0x4586,

+    0x686E, 0x4587, 0x6872, 0x3926, 0x6874, 0x1452, 0x6875, 0x3927,

+    0x6876, 0x0533, 0x6877, 0x1447, 0x687A, 0x3928, 0x687C, 0x4588,

+    0x687E, 0x1458, 0x687F, 0x1448, 0x6881, 0x0F8A, 0x6882, 0x4589,

+    0x6883, 0x144F, 0x6884, 0x3929, 0x6885, 0x0D15, 0x6886, 0x4BFD,

+    0x688D, 0x1457, 0x688E, 0x1E9C, 0x688F, 0x144A, 0x6890, 0x458A,

+    0x6893, 0x0478, 0x6894, 0x144C, 0x6896, 0x458B, 0x6897, 0x07CE,

+    0x6898, 0x458D, 0x6899, 0x458E, 0x689A, 0x458F, 0x689B, 0x144E,

+    0x689C, 0x4590, 0x689D, 0x144D, 0x689F, 0x1449, 0x68A0, 0x1454,

+    0x68A2, 0x09A7, 0x68A3, 0x4206, 0x68A5, 0x392A, 0x68A6, 0x11BE,

+    0x68A7, 0x079C, 0x68A8, 0x0F66, 0x68AA, 0x4591, 0x68AB, 0x4592,

+    0x68AD, 0x144B, 0x68AF, 0x0C10, 0x68B0, 0x0581, 0x68B1, 0x081D,

+    0x68B2, 0x392B, 0x68B3, 0x1443, 0x68B4, 0x4593, 0x68B5, 0x1453,

+    0x68B6, 0x05BF, 0x68B9, 0x1451, 0x68BA, 0x1455, 0x68BB, 0x4594,

+    0x68BC, 0x0C68, 0x68C3, 0x4598, 0x68C4, 0x063A, 0x68C5, 0x4599,

+    0x68C6, 0x1473, 0x68C8, 0x20AF, 0x68C9, 0x0ED5, 0x68CA, 0x145A,

+    0x68CB, 0x0639, 0x68CC, 0x459A, 0x68CD, 0x1461, 0x68CF, 0x2130,

+    0x68D0, 0x392C, 0x68D2, 0x0E6E, 0x68D4, 0x1462, 0x68D5, 0x1464,

+    0x68D6, 0x392D, 0x68D7, 0x1468, 0x68D8, 0x145C, 0x68D9, 0x459B,

+    0x68DA, 0x0B68, 0x68DF, 0x0C69, 0x68E0, 0x146C, 0x68E1, 0x145F,

+    0x68E3, 0x1469, 0x68E4, 0x459C, 0x68E5, 0x459D, 0x68E7, 0x1463,

+    0x68E8, 0x392E, 0x68EB, 0x4BFE, 0x68EC, 0x459E, 0x68ED, 0x392F,

+    0x68EE, 0x09FF, 0x68EF, 0x146D, 0x68F0, 0x3930, 0x68F1, 0x3931,

+    0x68F2, 0x0A57, 0x68F5, 0x4BFF, 0x68F7, 0x459F, 0x68F9, 0x146B,

+    0x68FA, 0x05F9, 0x68FB, 0x4595, 0x68FC, 0x3932, 0x6900, 0x0FF6,

+    0x6901, 0x1459, 0x6903, 0x45A0, 0x6904, 0x1467, 0x6905, 0x049C,

+    0x6907, 0x45A1, 0x6908, 0x145B, 0x690A, 0x4207, 0x690B, 0x0EC6,

+    0x690C, 0x1460, 0x690D, 0x09E8, 0x690E, 0x0BE3, 0x690F, 0x1456,

+    0x6911, 0x3933, 0x6912, 0x1466, 0x6913, 0x3934, 0x6917, 0x4C00,

+    0x6919, 0x0A40, 0x691A, 0x1470, 0x691B, 0x05CF, 0x691C, 0x0755,

+    0x6921, 0x1472, 0x6922, 0x145D, 0x6923, 0x1471, 0x6925, 0x146A,

+    0x6926, 0x145E, 0x6928, 0x146E, 0x692A, 0x146F, 0x6930, 0x1480,

+    0x6933, 0x4C01, 0x6934, 0x0CA6, 0x6935, 0x3935, 0x6936, 0x1465,

+    0x6938, 0x4C02, 0x6939, 0x147C, 0x693B, 0x3936, 0x693D, 0x147E,

+    0x693F, 0x0BF4, 0x6942, 0x420A, 0x6946, 0x45A5, 0x6949, 0x4208,

+    0x694A, 0x0F36, 0x6953, 0x0DE8, 0x6954, 0x1479, 0x6955, 0x0B2A,

+    0x6957, 0x3937, 0x6959, 0x147F, 0x695A, 0x0AC1, 0x695B, 0x4C03,

+    0x695C, 0x1476, 0x695D, 0x1483, 0x695E, 0x1482, 0x6960, 0x0CC7,

+    0x6961, 0x1481, 0x6962, 0x0CC2, 0x6963, 0x3938, 0x6964, 0x420B,

+    0x6965, 0x4C04, 0x6968, 0x2132, 0x6969, 0x45A6, 0x696A, 0x1485,

+    0x696B, 0x1478, 0x696C, 0x45A7, 0x696D, 0x06C0, 0x696E, 0x147B,

+    0x696F, 0x0967, 0x6972, 0x3939, 0x6973, 0x0D16, 0x6974, 0x147D,

+    0x6975, 0x06C3, 0x6977, 0x1475, 0x6978, 0x1477, 0x6979, 0x1474,

+    0x697A, 0x45A8, 0x697C, 0x0FD6, 0x697D, 0x05B8, 0x697E, 0x147A,

+    0x697F, 0x393A, 0x6980, 0x393B, 0x6981, 0x1484, 0x6982, 0x0593,

+    0x6986, 0x3740, 0x698A, 0x0857, 0x698E, 0x04FF, 0x6991, 0x1495,

+    0x6992, 0x45A9, 0x6994, 0x0FD7, 0x6995, 0x1498, 0x6996, 0x45AB,

+    0x6998, 0x2134, 0x699B, 0x0A00, 0x699C, 0x1497, 0x69A0, 0x1496,

+    0x69A5, 0x420C, 0x69A6, 0x393C, 0x69A7, 0x1493, 0x69A8, 0x4C05,

+    0x69AB, 0x4C06, 0x69AD, 0x393D, 0x69AE, 0x1487, 0x69AF, 0x4C07,

+    0x69B0, 0x45AC, 0x69B1, 0x14A4, 0x69B2, 0x1486, 0x69B4, 0x1499,

+    0x69B7, 0x393E, 0x69BA, 0x45AD, 0x69BB, 0x1491, 0x69BC, 0x45AE,

+    0x69BE, 0x148C, 0x69BF, 0x1489, 0x69C0, 0x45AF, 0x69C1, 0x148A,

+    0x69C3, 0x1492, 0x69C7, 0x1D33, 0x69CA, 0x148F, 0x69CB, 0x07CF,

+    0x69CC, 0x0BE4, 0x69CD, 0x0AE6, 0x69CE, 0x148D, 0x69CF, 0x420D,

+    0x69D0, 0x1488, 0x69D1, 0x45B0, 0x69D3, 0x148B, 0x69D6, 0x393F,

+    0x69D7, 0x3940, 0x69D8, 0x0F37, 0x69D9, 0x0E98, 0x69DD, 0x1490,

+    0x69DE, 0x149A, 0x69E2, 0x2135, 0x69E3, 0x45B4, 0x69E5, 0x4C08,

+    0x69E7, 0x14A2, 0x69E8, 0x149B, 0x69E9, 0x4210, 0x69EA, 0x3411,

+    0x69EB, 0x14A8, 0x69ED, 0x14A6, 0x69EE, 0x45B5, 0x69EF, 0x45B6,

+    0x69F1, 0x4C09, 0x69F2, 0x14A1, 0x69F3, 0x45B7, 0x69F4, 0x45B9,

+    0x69F5, 0x4211, 0x69F6, 0x373F, 0x69F9, 0x14A0, 0x69FB, 0x0BEC,

+    0x69FD, 0x0AE7, 0x69FE, 0x45BA, 0x69FF, 0x149E, 0x6A01, 0x3941,

+    0x6A02, 0x149C, 0x6A05, 0x14A3, 0x6A0A, 0x14A9, 0x6A0B, 0x0D89,

+    0x6A0C, 0x14AF, 0x6A0F, 0x3942, 0x6A11, 0x45BB, 0x6A12, 0x14AA,

+    0x6A13, 0x14AD, 0x6A14, 0x14A7, 0x6A15, 0x3943, 0x6A17, 0x0BB2,

+    0x6A19, 0x0DAA, 0x6A1A, 0x45BC, 0x6A1B, 0x149D, 0x6A1D, 0x45BD,

+    0x6A1E, 0x14A5, 0x6A1F, 0x09A8, 0x6A21, 0x0EDB, 0x6A22, 0x14B9,

+    0x6A23, 0x14AC, 0x6A28, 0x3944, 0x6A29, 0x0756, 0x6A2A, 0x0523,

+    0x6A2B, 0x05BD, 0x6A2E, 0x1494, 0x6A30, 0x2136, 0x6A32, 0x45BF,

+    0x6A33, 0x45C0, 0x6A34, 0x3945, 0x6A35, 0x09A9, 0x6A36, 0x14B1,

+    0x6A38, 0x14B8, 0x6A39, 0x0925, 0x6A3A, 0x05D0, 0x6A3B, 0x4213,

+    0x6A3D, 0x0B6C, 0x6A3E, 0x3946, 0x6A3F, 0x45C1, 0x6A44, 0x14AE,

+    0x6A45, 0x3947, 0x6A46, 0x2138, 0x6A47, 0x14B3, 0x6A48, 0x14B7,

+    0x6A49, 0x45C2, 0x6A4A, 0x4C0A, 0x6A4B, 0x06AE, 0x6A4E, 0x45C4,

+    0x6A50, 0x3948, 0x6A51, 0x3949, 0x6A52, 0x45C5, 0x6A54, 0x3C34,

+    0x6A55, 0x4C0B, 0x6A56, 0x394A, 0x6A58, 0x0666, 0x6A59, 0x14B5,

+    0x6A5B, 0x394B, 0x6A5F, 0x063B, 0x6A61, 0x0CA3, 0x6A62, 0x14B4,

+    0x6A64, 0x45C6, 0x6A66, 0x14B6, 0x6A67, 0x4C0C, 0x6A6B, 0x2137,

+    0x6A71, 0x4C0D, 0x6A72, 0x14B0, 0x6A73, 0x2139, 0x6A78, 0x14B2,

+    0x6A7A, 0x45C3, 0x6A7E, 0x213A, 0x6A7F, 0x05BE, 0x6A80, 0x0B87,

+    0x6A83, 0x394C, 0x6A84, 0x14BD, 0x6A89, 0x394D, 0x6A8B, 0x45C8,

+    0x6A8D, 0x14BB, 0x6A8E, 0x079D, 0x6A90, 0x14BA, 0x6A91, 0x394E,

+    0x6A94, 0x4215, 0x6A97, 0x14C0, 0x6A9C, 0x143B, 0x6A9D, 0x394F,

+    0x6A9E, 0x3950, 0x6A9F, 0x3951, 0x6AA0, 0x14BC, 0x6AA1, 0x45CA,

+    0x6AA2, 0x14BE, 0x6AA3, 0x14BF, 0x6AA5, 0x4216, 0x6AAA, 0x14CB,

+    0x6AAB, 0x45CC, 0x6AAC, 0x14C7, 0x6AAE, 0x1450, 0x6AAF, 0x4C0E,

+    0x6AB3, 0x14C6, 0x6AB8, 0x14C5, 0x6ABB, 0x14C2, 0x6ABD, 0x45CD,

+    0x6AC1, 0x14AB, 0x6AC2, 0x14C4, 0x6AC3, 0x14C3, 0x6AC6, 0x45CE,

+    0x6AC8, 0x4C0F, 0x6AC9, 0x4C10, 0x6AD0, 0x45D0, 0x6AD1, 0x14C9,

+    0x6AD3, 0x0FCC, 0x6AD4, 0x45CF, 0x6ADA, 0x14CC, 0x6ADB, 0x06F3,

+    0x6ADC, 0x3952, 0x6ADD, 0x45D1, 0x6ADE, 0x14C8, 0x6ADF, 0x14CA,

+    0x6AE2, 0x213B, 0x6AE4, 0x213C, 0x6AE7, 0x3953, 0x6AE8, 0x0D3B,

+    0x6AEA, 0x14CD, 0x6AEC, 0x3954, 0x6AF1, 0x45D4, 0x6AF2, 0x45D5,

+    0x6AF3, 0x45D6, 0x6AF8, 0x4EB8, 0x6AFA, 0x14D1, 0x6AFB, 0x14CE,

+    0x6AFD, 0x45D7, 0x6B03, 0x4C11, 0x6B04, 0x0F5D, 0x6B05, 0x14CF,

+    0x6B0A, 0x149F, 0x6B0B, 0x45D9, 0x6B0F, 0x45DA, 0x6B10, 0x45DB,

+    0x6B11, 0x45DC, 0x6B12, 0x14D2, 0x6B16, 0x14D3, 0x6B17, 0x45DE,

+    0x6B1B, 0x4218, 0x6B1D, 0x04D7, 0x6B1E, 0x3955, 0x6B1F, 0x14D5,

+    0x6B20, 0x073D, 0x6B21, 0x08CD, 0x6B23, 0x06CD, 0x6B24, 0x3956,

+    0x6B27, 0x0524, 0x6B2C, 0x4219, 0x6B2F, 0x45E0, 0x6B32, 0x0F49,

+    0x6B35, 0x3957, 0x6B37, 0x14D7, 0x6B38, 0x14D6, 0x6B39, 0x14D9,

+    0x6B3A, 0x0657, 0x6B3B, 0x4C12, 0x6B3D, 0x06CE, 0x6B3E, 0x05FA,

+    0x6B3F, 0x4C13, 0x6B43, 0x14DC, 0x6B46, 0x3958, 0x6B47, 0x14DB,

+    0x6B49, 0x14DD, 0x6B4A, 0x45E1, 0x6B4C, 0x054E, 0x6B4E, 0x0B75,

+    0x6B50, 0x14DE, 0x6B53, 0x05FB, 0x6B54, 0x14E0, 0x6B56, 0x3959,

+    0x6B58, 0x45E2, 0x6B59, 0x14DF, 0x6B5B, 0x14E1, 0x6B5F, 0x14E2,

+    0x6B60, 0x395A, 0x6B61, 0x14E3, 0x6B62, 0x08AD, 0x6B63, 0x0A59,

+    0x6B64, 0x0811, 0x6B65, 0x344A, 0x6B66, 0x0DE2, 0x6B67, 0x421A,

+    0x6B69, 0x0E32, 0x6B6A, 0x0FEA, 0x6B6C, 0x45E3, 0x6B6F, 0x08C3,

+    0x6B72, 0x35D9, 0x6B73, 0x0840, 0x6B74, 0x0FBA, 0x6B75, 0x45E4,

+    0x6B77, 0x3456, 0x6B78, 0x14E4, 0x6B79, 0x14E5, 0x6B7A, 0x45E5,

+    0x6B7B, 0x08AE, 0x6B7D, 0x4C14, 0x6B7E, 0x4C15, 0x6B7F, 0x14E6,

+    0x6B80, 0x14E7, 0x6B81, 0x45E6, 0x6B82, 0x395B, 0x6B83, 0x14E9,

+    0x6B84, 0x14E8, 0x6B86, 0x0E86, 0x6B89, 0x0968, 0x6B8A, 0x0918,

+    0x6B8B, 0x0892, 0x6B8D, 0x14EA, 0x6B95, 0x14EC, 0x6B96, 0x09E9,

+    0x6B98, 0x14EB, 0x6B9B, 0x45E7, 0x6B9E, 0x14ED, 0x6BA4, 0x14EE,

+    0x6BA9, 0x421B, 0x6BAA, 0x14EF, 0x6BAB, 0x14F0, 0x6BAD, 0x421C,

+    0x6BAE, 0x45E8, 0x6BAF, 0x14F1, 0x6BB0, 0x4C16, 0x6BB1, 0x14F3,

+    0x6BB2, 0x14F2, 0x6BB3, 0x14F4, 0x6BB4, 0x0525, 0x6BB5, 0x0B88,

+    0x6BB7, 0x14F5, 0x6BBA, 0x0874, 0x6BBB, 0x05AA, 0x6BBC, 0x14F6,

+    0x6BBD, 0x45EA, 0x6BBE, 0x395C, 0x6BBF, 0x0C3C, 0x6BC0, 0x119D,

+    0x6BC5, 0x063D, 0x6BC6, 0x14F7, 0x6BC7, 0x45EB, 0x6BC8, 0x45EC,

+    0x6BC9, 0x45ED, 0x6BCB, 0x14F8, 0x6BCC, 0x3744, 0x6BCD, 0x0E3C,

+    0x6BCE, 0x0E96, 0x6BCF, 0x344C, 0x6BD2, 0x0C9F, 0x6BD3, 0x14F9,

+    0x6BD4, 0x0D7A, 0x6BD6, 0x213D, 0x6BD7, 0x421D, 0x6BD8, 0x0D8F,

+    0x6BDA, 0x45EE, 0x6BDB, 0x0EDF, 0x6BDF, 0x14FA, 0x6BE1, 0x395D,

+    0x6BE6, 0x45EF, 0x6BE7, 0x45F0, 0x6BEB, 0x14FC, 0x6BEC, 0x14FB,

+    0x6BEE, 0x45F1, 0x6BEF, 0x14FE, 0x6BF1, 0x395E, 0x6BF3, 0x14FD,

+    0x6BF7, 0x4C17, 0x6BF9, 0x4C18, 0x6BFF, 0x421E, 0x6C02, 0x45F2,

+    0x6C04, 0x4C19, 0x6C05, 0x421F, 0x6C08, 0x1500, 0x6C09, 0x4C1A,

+    0x6C0A, 0x45F3, 0x6C0D, 0x4C1B, 0x6C0E, 0x45F4, 0x6C0F, 0x08AF,

+    0x6C10, 0x395F, 0x6C11, 0x0EBD, 0x6C13, 0x1501, 0x6C14, 0x1502,

+    0x6C17, 0x063E, 0x6C1B, 0x1503, 0x6C23, 0x1505, 0x6C24, 0x1504,

+    0x6C2C, 0x4C1C, 0x6C33, 0x3960, 0x6C34, 0x0A2B, 0x6C35, 0x3961,

+    0x6C36, 0x45F5, 0x6C37, 0x0DAB, 0x6C38, 0x04EC, 0x6C3A, 0x4F55,

+    0x6C3E, 0x0D59, 0x6C3F, 0x213E, 0x6C40, 0x0C11, 0x6C41, 0x094B,

+    0x6C42, 0x067B, 0x6C4A, 0x4C1D, 0x6C4D, 0x45F7, 0x6C4E, 0x0D5A,

+    0x6C50, 0x08DA, 0x6C52, 0x4C1E, 0x6C54, 0x4C1F, 0x6C55, 0x1507,

+    0x6C57, 0x05FC, 0x6C59, 0x3963, 0x6C5A, 0x051A, 0x6C5B, 0x45F8,

+    0x6C5C, 0x213F, 0x6C5D, 0x0CCA, 0x6C5E, 0x1506, 0x6C5F, 0x07D0,

+    0x6C60, 0x0B91, 0x6C62, 0x1508, 0x6C67, 0x460A, 0x6C68, 0x1510,

+    0x6C6A, 0x1509, 0x6C6D, 0x45F9, 0x6C6F, 0x2141, 0x6C70, 0x0B21,

+    0x6C72, 0x067C, 0x6C73, 0x1511, 0x6C74, 0x4220, 0x6C76, 0x3964,

+    0x6C79, 0x4C20, 0x6C7A, 0x073E, 0x6C7B, 0x3965, 0x6C7D, 0x063F,

+    0x6C7E, 0x150F, 0x6C81, 0x150D, 0x6C82, 0x150A, 0x6C83, 0x0F4A,

+    0x6C84, 0x45FA, 0x6C85, 0x3966, 0x6C86, 0x2140, 0x6C88, 0x0BDC,

+    0x6C89, 0x45FB, 0x6C8C, 0x0CB1, 0x6C8D, 0x150B, 0x6C90, 0x1513,

+    0x6C92, 0x1512, 0x6C93, 0x06F9, 0x6C94, 0x45FD, 0x6C95, 0x3967,

+    0x6C96, 0x052D, 0x6C97, 0x45FE, 0x6C98, 0x4221, 0x6C99, 0x082B,

+    0x6C9A, 0x150C, 0x6C9B, 0x150E, 0x6C9C, 0x3968, 0x6CA1, 0x0E85,

+    0x6CA2, 0x0B54, 0x6CAA, 0x3749, 0x6CAB, 0x0EA5, 0x6CAC, 0x4C21,

+    0x6CAD, 0x45FF, 0x6CAE, 0x151B, 0x6CB1, 0x151C, 0x6CB3, 0x054F,

+    0x6CB4, 0x4C22, 0x6CB8, 0x0DF8, 0x6CB9, 0x0F09, 0x6CBA, 0x151E,

+    0x6CBB, 0x08CF, 0x6CBC, 0x09AA, 0x6CBD, 0x1517, 0x6CBE, 0x151D,

+    0x6CBF, 0x050A, 0x6CC1, 0x06AF, 0x6CC2, 0x4600, 0x6CC4, 0x1514,

+    0x6CC5, 0x1519, 0x6CC6, 0x4223, 0x6CC9, 0x0A98, 0x6CCA, 0x0D27,

+    0x6CCC, 0x0D7B, 0x6CD0, 0x3969, 0x6CD2, 0x4C23, 0x6CD3, 0x1516,

+    0x6CD4, 0x396A, 0x6CD5, 0x0E4F, 0x6CD6, 0x396B, 0x6CD7, 0x1518,

+    0x6CD9, 0x1521, 0x6CDA, 0x2142, 0x6CDB, 0x151F, 0x6CDC, 0x4602,

+    0x6CDD, 0x151A, 0x6CE0, 0x396C, 0x6CE1, 0x0E50, 0x6CE2, 0x0CFE,

+    0x6CE3, 0x067D, 0x6CE5, 0x0C1F, 0x6CE8, 0x0BAB, 0x6CE9, 0x4603,

+    0x6CEA, 0x1522, 0x6CEB, 0x396D, 0x6CEC, 0x396E, 0x6CED, 0x4604,

+    0x6CEE, 0x396F, 0x6CEF, 0x1520, 0x6CF0, 0x0B39, 0x6CF1, 0x1515,

+    0x6CF3, 0x04ED, 0x6CFB, 0x4222, 0x6D00, 0x4606, 0x6D01, 0x3C35,

+    0x6D04, 0x2143, 0x6D0A, 0x3970, 0x6D0B, 0x0F38, 0x6D0C, 0x152D,

+    0x6D0E, 0x3971, 0x6D11, 0x3972, 0x6D12, 0x152C, 0x6D17, 0x0A9A,

+    0x6D19, 0x1529, 0x6D1B, 0x0F56, 0x6D1E, 0x0C8E, 0x6D1F, 0x1523,

+    0x6D24, 0x4607, 0x6D25, 0x0BE1, 0x6D26, 0x4608, 0x6D27, 0x4609,

+    0x6D29, 0x04EE, 0x6D2A, 0x07D1, 0x6D2B, 0x1526, 0x6D2E, 0x3973,

+    0x6D2F, 0x460B, 0x6D31, 0x4224, 0x6D32, 0x0931, 0x6D33, 0x152B,

+    0x6D34, 0x461E, 0x6D35, 0x152A, 0x6D36, 0x1525, 0x6D38, 0x1528,

+    0x6D39, 0x4225, 0x6D3B, 0x05C6, 0x6D3C, 0x460C, 0x6D3D, 0x1527,

+    0x6D3E, 0x0CFF, 0x6D3F, 0x4226, 0x6D41, 0x0F76, 0x6D44, 0x09DC,

+    0x6D45, 0x0A99, 0x6D57, 0x3974, 0x6D58, 0x4227, 0x6D59, 0x1533,

+    0x6D5A, 0x1531, 0x6D5B, 0x460D, 0x6D5C, 0x0DBF, 0x6D5E, 0x3975,

+    0x6D60, 0x460E, 0x6D61, 0x4C24, 0x6D63, 0x152E, 0x6D64, 0x1530,

+    0x6D65, 0x3976, 0x6D66, 0x04DC, 0x6D69, 0x07D2, 0x6D6A, 0x0FD8,

+    0x6D6C, 0x059B, 0x6D6E, 0x0DD4, 0x6D6F, 0x2145, 0x6D70, 0x460F,

+    0x6D74, 0x0F4B, 0x6D77, 0x0582, 0x6D78, 0x0A01, 0x6D79, 0x1532,

+    0x6D7C, 0x4C25, 0x6D80, 0x4610, 0x6D81, 0x4611, 0x6D82, 0x3977,

+    0x6D85, 0x1537, 0x6D87, 0x2144, 0x6D88, 0x09AB, 0x6D89, 0x342A,

+    0x6D8A, 0x4612, 0x6D8C, 0x0F1A, 0x6D8D, 0x4613, 0x6D8E, 0x1534,

+    0x6D91, 0x4614, 0x6D93, 0x152F, 0x6D94, 0x4228, 0x6D95, 0x1535,

+    0x6D96, 0x2146, 0x6D98, 0x4615, 0x6D99, 0x0FA6, 0x6D9B, 0x0C6D,

+    0x6D9C, 0x0C9A, 0x6DAA, 0x4229, 0x6DAB, 0x461A, 0x6DAC, 0x2147,

+    0x6DAE, 0x461B, 0x6DAF, 0x0594, 0x6DB2, 0x04F7, 0x6DB4, 0x461C,

+    0x6DB5, 0x153B, 0x6DB8, 0x153E, 0x6DB9, 0x4C26, 0x6DBC, 0x0F8B,

+    0x6DBF, 0x3978, 0x6DC0, 0x0F4E, 0x6DC2, 0x461D, 0x6DC4, 0x3979,

+    0x6DC5, 0x1545, 0x6DC6, 0x153F, 0x6DC7, 0x153C, 0x6DC8, 0x461F,

+    0x6DCA, 0x397A, 0x6DCB, 0x0F9C, 0x6DCC, 0x1542, 0x6DCE, 0x4620,

+    0x6DCF, 0x2148, 0x6DD0, 0x3C36, 0x6DD1, 0x0954, 0x6DD2, 0x1544,

+    0x6DD5, 0x1549, 0x6DD6, 0x397B, 0x6DD8, 0x0C6B, 0x6DD9, 0x1547,

+    0x6DDA, 0x3453, 0x6DDB, 0x422A, 0x6DDD, 0x422B, 0x6DDE, 0x1541,

+    0x6DDF, 0x4621, 0x6DE1, 0x0B76, 0x6DE4, 0x1548, 0x6DE6, 0x153D,

+    0x6DE8, 0x1543, 0x6DE9, 0x397C, 0x6DEA, 0x154A, 0x6DEB, 0x04C0,

+    0x6DEC, 0x1540, 0x6DEE, 0x154B, 0x6DF0, 0x4C27, 0x6DF1, 0x0A02,

+    0x6DF2, 0x214A, 0x6DF3, 0x0969, 0x6DF5, 0x0DF5, 0x6DF6, 0x4622,

+    0x6DF7, 0x081E, 0x6DF8, 0x2149, 0x6DF9, 0x1538, 0x6DFA, 0x1546,

+    0x6DFB, 0x0C34, 0x6DFC, 0x214B, 0x6E05, 0x0A5A, 0x6E07, 0x05C7,

+    0x6E08, 0x0841, 0x6E09, 0x09AC, 0x6E0A, 0x153A, 0x6E0B, 0x094C,

+    0x6E13, 0x0722, 0x6E15, 0x1539, 0x6E17, 0x3746, 0x6E19, 0x154F,

+    0x6E1A, 0x0977, 0x6E1B, 0x076E, 0x6E1D, 0x155E, 0x6E1E, 0x4624,

+    0x6E1F, 0x1558, 0x6E20, 0x068E, 0x6E21, 0x0C49, 0x6E22, 0x397D,

+    0x6E23, 0x1553, 0x6E24, 0x155C, 0x6E25, 0x0473, 0x6E26, 0x04D4,

+    0x6E27, 0x214E, 0x6E29, 0x0539, 0x6E2B, 0x1555, 0x6E2C, 0x0B0C,

+    0x6E2D, 0x154C, 0x6E2E, 0x154E, 0x6E2F, 0x07D3, 0x6E32, 0x4626,

+    0x6E34, 0x3412, 0x6E36, 0x4623, 0x6E38, 0x155F, 0x6E39, 0x214C,

+    0x6E3A, 0x155A, 0x6E3C, 0x214F, 0x6E3E, 0x1552, 0x6E42, 0x3C37,

+    0x6E43, 0x1559, 0x6E44, 0x422C, 0x6E45, 0x4C28, 0x6E48, 0x4627,

+    0x6E49, 0x4628, 0x6E4A, 0x0EB7, 0x6E4B, 0x4629, 0x6E4C, 0x462A,

+    0x6E4D, 0x1557, 0x6E4E, 0x155B, 0x6E4F, 0x462B, 0x6E51, 0x397E,

+    0x6E53, 0x462C, 0x6E54, 0x462D, 0x6E56, 0x0784, 0x6E57, 0x462E,

+    0x6E58, 0x09AD, 0x6E5B, 0x0B77, 0x6E5C, 0x214D, 0x6E5E, 0x422D,

+    0x6E5F, 0x1551, 0x6E63, 0x462F, 0x6E67, 0x0F19, 0x6E6B, 0x1554,

+    0x6E6E, 0x154D, 0x6E6F, 0x0C6C, 0x6E72, 0x1550, 0x6E73, 0x4C29,

+    0x6E76, 0x1556, 0x6E7B, 0x4C2A, 0x6E7D, 0x4C2B, 0x6E7E, 0x0FF7,

+    0x6E7F, 0x08EA, 0x6E80, 0x0EAC, 0x6E82, 0x1560, 0x6E89, 0x4C2C,

+    0x6E8C, 0x0D42, 0x6E8F, 0x156C, 0x6E90, 0x076F, 0x6E93, 0x4631,

+    0x6E96, 0x096A, 0x6E98, 0x1562, 0x6E9C, 0x0F77, 0x6E9D, 0x07D4,

+    0x6E9F, 0x156F, 0x6EA2, 0x04B2, 0x6EA5, 0x156D, 0x6EA7, 0x4632,

+    0x6EAA, 0x1561, 0x6EAB, 0x340C, 0x6EAF, 0x1567, 0x6EB1, 0x422E,

+    0x6EB2, 0x1569, 0x6EB4, 0x4633, 0x6EB6, 0x0F39, 0x6EB7, 0x1564,

+    0x6EBA, 0x0C28, 0x6EBC, 0x4C2D, 0x6EBD, 0x1566, 0x6EBF, 0x2150,

+    0x6EC1, 0x422F, 0x6EC2, 0x156E, 0x6EC3, 0x4634, 0x6EC4, 0x1568,

+    0x6EC5, 0x0ED3, 0x6EC7, 0x397F, 0x6EC9, 0x1563, 0x6ECA, 0x3980,

+    0x6ECB, 0x08CE, 0x6ECC, 0x157B, 0x6ECE, 0x3981, 0x6ED1, 0x05C8,

+    0x6ED3, 0x1565, 0x6ED4, 0x156A, 0x6ED5, 0x156B, 0x6ED9, 0x3C38,

+    0x6EDA, 0x4C2E, 0x6EDB, 0x4C2F, 0x6EDD, 0x0B4C, 0x6EDE, 0x0B3A,

+    0x6EE6, 0x3C24, 0x6EEB, 0x4636, 0x6EEC, 0x1573, 0x6EEF, 0x1579,

+    0x6EF2, 0x1577, 0x6EF4, 0x0C23, 0x6EF7, 0x157E, 0x6EF8, 0x1574,

+    0x6EF9, 0x4637, 0x6EFB, 0x4638, 0x6EFD, 0x3982, 0x6EFE, 0x1575,

+    0x6EFF, 0x155D, 0x6F01, 0x0693, 0x6F02, 0x0DAC, 0x6F06, 0x08EB,

+    0x6F09, 0x0809, 0x6F0A, 0x4639, 0x6F0C, 0x463A, 0x6F0F, 0x0FD9,

+    0x6F10, 0x4230, 0x6F11, 0x1571, 0x6F13, 0x157D, 0x6F14, 0x050B,

+    0x6F15, 0x0AE8, 0x6F18, 0x463B, 0x6F1A, 0x3983, 0x6F20, 0x0D2F,

+    0x6F22, 0x05FD, 0x6F23, 0x0FC2, 0x6F25, 0x463C, 0x6F26, 0x4C30,

+    0x6F29, 0x4C31, 0x6F2A, 0x3984, 0x6F2B, 0x0EAD, 0x6F2C, 0x0BEE,

+    0x6F2F, 0x3985, 0x6F30, 0x4C32, 0x6F31, 0x1578, 0x6F32, 0x157A,

+    0x6F33, 0x3986, 0x6F35, 0x4635, 0x6F36, 0x463D, 0x6F38, 0x0AB4,

+    0x6F3C, 0x463E, 0x6F3E, 0x157C, 0x6F3F, 0x1576, 0x6F41, 0x1570,

+    0x6F45, 0x05FF, 0x6F51, 0x1E60, 0x6F52, 0x4640, 0x6F54, 0x073F,

+    0x6F57, 0x4641, 0x6F58, 0x158A, 0x6F59, 0x4231, 0x6F5A, 0x3987,

+    0x6F5B, 0x1585, 0x6F5C, 0x0A9C, 0x6F5E, 0x3988, 0x6F5F, 0x05C1,

+    0x6F60, 0x4642, 0x6F61, 0x4232, 0x6F62, 0x3989, 0x6F64, 0x096B,

+    0x6F66, 0x158E, 0x6F68, 0x4643, 0x6F6D, 0x1587, 0x6F6E, 0x0BC8,

+    0x6F6F, 0x1584, 0x6F70, 0x0BF5, 0x6F74, 0x15A7, 0x6F78, 0x1581,

+    0x6F7A, 0x1580, 0x6F7C, 0x1589, 0x6F7D, 0x398A, 0x6F7E, 0x4233,

+    0x6F80, 0x1583, 0x6F81, 0x1582, 0x6F82, 0x1588, 0x6F84, 0x0A45,

+    0x6F86, 0x157F, 0x6F87, 0x4C33, 0x6F88, 0x2151, 0x6F8B, 0x398B,

+    0x6F8C, 0x4234, 0x6F8D, 0x398C, 0x6F8E, 0x158B, 0x6F90, 0x4644,

+    0x6F91, 0x158C, 0x6F92, 0x398D, 0x6F94, 0x398E, 0x6F96, 0x4645,

+    0x6F97, 0x05FE, 0x6F98, 0x363C, 0x6F9A, 0x398F, 0x6F9D, 0x4C34,

+    0x6F9F, 0x4647, 0x6FA0, 0x4235, 0x6FA1, 0x1591, 0x6FA3, 0x1590,

+    0x6FA4, 0x1592, 0x6FA5, 0x4648, 0x6FA7, 0x3990, 0x6FA8, 0x3991,

+    0x6FAA, 0x1595, 0x6FAE, 0x4C35, 0x6FAF, 0x4649, 0x6FB1, 0x0C3D,

+    0x6FB3, 0x158F, 0x6FB5, 0x2152, 0x6FB6, 0x3992, 0x6FB7, 0x4C36,

+    0x6FB9, 0x1593, 0x6FBC, 0x4236, 0x6FBE, 0x4646, 0x6FC0, 0x0739,

+    0x6FC1, 0x0B59, 0x6FC2, 0x158D, 0x6FC3, 0x0CF1, 0x6FC6, 0x1594,

+    0x6FC7, 0x4237, 0x6FC8, 0x464B, 0x6FC9, 0x464C, 0x6FCA, 0x4238,

+    0x6FD4, 0x1599, 0x6FD5, 0x1597, 0x6FD8, 0x159A, 0x6FDA, 0x3993,

+    0x6FDB, 0x159D, 0x6FDE, 0x3994, 0x6FDF, 0x1596, 0x6FE0, 0x07FC,

+    0x6FE1, 0x0CDE, 0x6FE4, 0x1536, 0x6FE9, 0x464D, 0x6FEB, 0x0F5E,

+    0x6FEC, 0x1598, 0x6FEE, 0x159C, 0x6FEF, 0x0B55, 0x6FF0, 0x4239,

+    0x6FF1, 0x159B, 0x6FF3, 0x1586, 0x6FF5, 0x2153, 0x6FF6, 0x1BA4,

+    0x6FF9, 0x3C23, 0x6FFA, 0x15A0, 0x6FFC, 0x464F, 0x6FFE, 0x15A4,

+    0x7000, 0x4650, 0x7001, 0x15A2, 0x7005, 0x2154, 0x7006, 0x1E50,

+    0x7007, 0x2155, 0x7009, 0x159E, 0x700A, 0x4651, 0x700B, 0x159F,

+    0x700D, 0x4C37, 0x700F, 0x15A3, 0x7011, 0x15A1, 0x7015, 0x0DC0,

+    0x7018, 0x15A9, 0x701A, 0x15A6, 0x701B, 0x15A5, 0x701D, 0x15A8,

+    0x701E, 0x0CAC, 0x701F, 0x15AA, 0x7020, 0x4C38, 0x7023, 0x4652,

+    0x7026, 0x0BB3, 0x7027, 0x0B4D, 0x7028, 0x2156, 0x702C, 0x0A49,

+    0x7030, 0x15AB, 0x7032, 0x15AD, 0x7039, 0x3996, 0x703A, 0x4654,

+    0x703C, 0x3997, 0x703E, 0x15AC, 0x7043, 0x4655, 0x7047, 0x4656,

+    0x7049, 0x4C39, 0x704A, 0x4F52, 0x704B, 0x4657, 0x704C, 0x1572,

+    0x704E, 0x423A, 0x7051, 0x15AE, 0x7054, 0x3999, 0x7058, 0x0CBF,

+    0x705D, 0x399A, 0x705E, 0x399B, 0x7063, 0x15AF, 0x7064, 0x399C,

+    0x7065, 0x4659, 0x7069, 0x465A, 0x706B, 0x0550, 0x706C, 0x399D,

+    0x706E, 0x465B, 0x706F, 0x0C6E, 0x7070, 0x0583, 0x7075, 0x423B,

+    0x7076, 0x465C, 0x7078, 0x067E, 0x707C, 0x090A, 0x707D, 0x0842,

+    0x707E, 0x399E, 0x7081, 0x399F, 0x7085, 0x2157, 0x7086, 0x465D,

+    0x7089, 0x0FCD, 0x708A, 0x0A2C, 0x708E, 0x050C, 0x7092, 0x15B1,

+    0x7095, 0x39A0, 0x7097, 0x465E, 0x7098, 0x4C3A, 0x7099, 0x15B0,

+    0x709F, 0x4660, 0x70A4, 0x423C, 0x70AB, 0x2158, 0x70AC, 0x15B4,

+    0x70AD, 0x0B78, 0x70AE, 0x15B7, 0x70AF, 0x15B2, 0x70B0, 0x4C3B,

+    0x70B1, 0x4661, 0x70B3, 0x15B6, 0x70B7, 0x39A1, 0x70B8, 0x15B5,

+    0x70B9, 0x0C3A, 0x70BA, 0x049D, 0x70BB, 0x20AD, 0x70C8, 0x0FBD,

+    0x70CA, 0x4664, 0x70CB, 0x15B9, 0x70CF, 0x04CA, 0x70D1, 0x4665,

+    0x70D3, 0x39A2, 0x70D4, 0x39A3, 0x70D5, 0x4C3C, 0x70D6, 0x4C3D,

+    0x70D8, 0x39A4, 0x70D9, 0x15BB, 0x70DC, 0x39A5, 0x70DD, 0x15BA,

+    0x70DF, 0x15B8, 0x70E4, 0x423D, 0x70EC, 0x4663, 0x70F1, 0x15B3,

+    0x70F9, 0x0E51, 0x70FD, 0x15BD, 0x7103, 0x4666, 0x7104, 0x215A,

+    0x7106, 0x4667, 0x7107, 0x39A6, 0x7108, 0x4668, 0x7109, 0x15BC,

+    0x710C, 0x4669, 0x710F, 0x2159, 0x7114, 0x050D, 0x7119, 0x15BF,

+    0x711A, 0x0E02, 0x711C, 0x15BE, 0x711E, 0x423F, 0x7120, 0x39A7,

+    0x7121, 0x0EC1, 0x7126, 0x09AF, 0x712B, 0x423E, 0x712E, 0x4240,

+    0x712F, 0x466B, 0x7130, 0x1DDC, 0x7131, 0x39A8, 0x7136, 0x0AB5,

+    0x713C, 0x09AE, 0x7145, 0x4C3E, 0x7146, 0x215C, 0x7147, 0x215D,

+    0x7149, 0x0FC3, 0x714A, 0x39A9, 0x714C, 0x15C5, 0x714E, 0x0A9D,

+    0x7150, 0x466C, 0x7151, 0x4241, 0x7152, 0x39AA, 0x7153, 0x466D,

+    0x7155, 0x15C1, 0x7156, 0x15C6, 0x7159, 0x050E, 0x715C, 0x215B,

+    0x715E, 0x466E, 0x7160, 0x39AB, 0x7162, 0x15C4, 0x7164, 0x0D17,

+    0x7165, 0x15C0, 0x7166, 0x15C3, 0x7167, 0x09B0, 0x7168, 0x4242,

+    0x7169, 0x0D65, 0x716C, 0x15C7, 0x716E, 0x08FD, 0x7179, 0x39AC,

+    0x717D, 0x0A9E, 0x7180, 0x4671, 0x7184, 0x15CA, 0x7185, 0x4243,

+    0x7187, 0x4244, 0x7188, 0x15C2, 0x718A, 0x06FD, 0x718F, 0x15C8,

+    0x7192, 0x39AD, 0x7194, 0x0F3A, 0x7195, 0x15CB, 0x7196, 0x4670,

+    0x7199, 0x205D, 0x719B, 0x4672, 0x719F, 0x0959, 0x71A0, 0x4673,

+    0x71A2, 0x4674, 0x71A8, 0x15CC, 0x71AC, 0x15CD, 0x71AE, 0x4675,

+    0x71AF, 0x4676, 0x71B1, 0x0CE4, 0x71B2, 0x4C3F, 0x71B3, 0x3C25,

+    0x71B9, 0x15CF, 0x71BA, 0x4245, 0x71BE, 0x15D0, 0x71C1, 0x215F,

+    0x71C3, 0x0CE9, 0x71C4, 0x4246, 0x71C8, 0x0C6F, 0x71C9, 0x15D2,

+    0x71CB, 0x39AF, 0x71CE, 0x15D4, 0x71D0, 0x0F9D, 0x71D2, 0x15D1,

+    0x71D3, 0x39B0, 0x71D4, 0x15D3, 0x71D5, 0x050F, 0x71D6, 0x39B1,

+    0x71D7, 0x15CE, 0x71D9, 0x4678, 0x71DC, 0x4679, 0x71DF, 0x114E,

+    0x71E0, 0x15D5, 0x71E5, 0x0AE9, 0x71E6, 0x0886, 0x71E7, 0x15D7,

+    0x71EC, 0x15D6, 0x71ED, 0x09EA, 0x71EE, 0x10EE, 0x71F4, 0x4C40,

+    0x71F5, 0x15D8, 0x71F9, 0x15DA, 0x71FB, 0x15C9, 0x71FC, 0x15D9,

+    0x71FE, 0x2160, 0x71FF, 0x15DB, 0x7200, 0x39B2, 0x7206, 0x0D30,

+    0x7207, 0x467A, 0x720D, 0x15DC, 0x7210, 0x15DD, 0x7215, 0x4247,

+    0x7217, 0x4C41, 0x721B, 0x15DE, 0x721D, 0x39B3, 0x721F, 0x4C42,

+    0x7228, 0x15DF, 0x722A, 0x0BFA, 0x722B, 0x39B4, 0x722C, 0x15E1,

+    0x722D, 0x15E0, 0x7230, 0x15E2, 0x7232, 0x15E3, 0x7234, 0x467C,

+    0x7235, 0x090B, 0x7236, 0x0DD5, 0x7238, 0x39B5, 0x7239, 0x467D,

+    0x723A, 0x0EF8, 0x723B, 0x15E4, 0x723C, 0x15E5, 0x723D, 0x0AD8,

+    0x723E, 0x08D0, 0x723F, 0x15E6, 0x7240, 0x15E7, 0x7241, 0x39B6,

+    0x7242, 0x467E, 0x7243, 0x4C43, 0x7246, 0x15E8, 0x7247, 0x0E22,

+    0x7248, 0x0D5B, 0x724B, 0x15E9, 0x724C, 0x0D0D, 0x724F, 0x4C44,

+    0x7250, 0x4C45, 0x7252, 0x0BC9, 0x7253, 0x39B7, 0x7255, 0x39B8,

+    0x7256, 0x39B9, 0x7257, 0x467F, 0x7258, 0x15EA, 0x7259, 0x0567,

+    0x725A, 0x4C46, 0x725B, 0x0687, 0x725C, 0x39BA, 0x725D, 0x0ED2,

+    0x725F, 0x0EC2, 0x7260, 0x4C47, 0x7261, 0x0534, 0x7262, 0x0FDA,

+    0x7263, 0x4680, 0x7267, 0x0E80, 0x7268, 0x4C48, 0x7269, 0x0DFA,

+    0x726E, 0x4682, 0x726F, 0x4683, 0x7272, 0x0A5B, 0x7274, 0x15EB,

+    0x7277, 0x4C49, 0x7278, 0x4684, 0x7279, 0x0C9B, 0x727D, 0x0757,

+    0x727E, 0x15EC, 0x727F, 0x4685, 0x7280, 0x0844, 0x7281, 0x15EE,

+    0x7282, 0x15ED, 0x7284, 0x4C4A, 0x7287, 0x15EF, 0x728D, 0x39BB,

+    0x728E, 0x4686, 0x7292, 0x15F0, 0x7296, 0x15F1, 0x729B, 0x4249,

+    0x72A0, 0x0658, 0x72A2, 0x15F2, 0x72A7, 0x15F3, 0x72AC, 0x0758,

+    0x72AD, 0x39BC, 0x72AE, 0x4688, 0x72AF, 0x0D5C, 0x72B0, 0x4689,

+    0x72B1, 0x2161, 0x72B2, 0x15F5, 0x72B4, 0x39BD, 0x72B6, 0x09DD,

+    0x72B9, 0x15F4, 0x72BE, 0x2162, 0x72C0, 0x342B, 0x72C1, 0x468A,

+    0x72C2, 0x06B0, 0x72C3, 0x15F6, 0x72C4, 0x15F8, 0x72C6, 0x15F7,

+    0x72C7, 0x39BE, 0x72C9, 0x4C4B, 0x72CC, 0x468C, 0x72CE, 0x15F9,

+    0x72D0, 0x0785, 0x72D2, 0x15FA, 0x72D7, 0x06E1, 0x72D9, 0x0AC2,

+    0x72DB, 0x080F, 0x72E0, 0x15FC, 0x72E1, 0x15FD, 0x72E2, 0x15FB,

+    0x72E5, 0x4C4C, 0x72E9, 0x0919, 0x72EC, 0x0CA0, 0x72ED, 0x06B1,

+    0x72F3, 0x468F, 0x72F4, 0x4C4D, 0x72F7, 0x15FF, 0x72F8, 0x0B6A,

+    0x72F9, 0x15FE, 0x72FA, 0x4690, 0x72FB, 0x39BF, 0x72FC, 0x0FDB,

+    0x72FD, 0x0D18, 0x7302, 0x4C4E, 0x7304, 0x39C0, 0x7305, 0x39C1,

+    0x7307, 0x4691, 0x730A, 0x1602, 0x730B, 0x4C4F, 0x7312, 0x4692,

+    0x7316, 0x1604, 0x7317, 0x1601, 0x7318, 0x4693, 0x7319, 0x4694,

+    0x731B, 0x0EE0, 0x731C, 0x1603, 0x731D, 0x1605, 0x731E, 0x4C50,

+    0x731F, 0x0F8C, 0x7322, 0x4C51, 0x7324, 0x2163, 0x7325, 0x1609,

+    0x7327, 0x424B, 0x7328, 0x39C2, 0x7329, 0x1608, 0x732A, 0x0BB4,

+    0x732B, 0x0CE3, 0x732C, 0x4697, 0x732E, 0x0759, 0x732F, 0x1607,

+    0x7331, 0x39C3, 0x7333, 0x4698, 0x7334, 0x1606, 0x7336, 0x0F1B,

+    0x7337, 0x0F1C, 0x7339, 0x4696, 0x733A, 0x4C52, 0x733B, 0x4C53,

+    0x733D, 0x4699, 0x733E, 0x160A, 0x733F, 0x0510, 0x7343, 0x39C4,

+    0x7344, 0x0808, 0x7345, 0x08B0, 0x734D, 0x4C54, 0x734E, 0x160B,

+    0x734F, 0x160C, 0x7350, 0x424C, 0x7352, 0x469A, 0x7357, 0x160E,

+    0x7358, 0x4C55, 0x7363, 0x094D, 0x7366, 0x424D, 0x7367, 0x4C56,

+    0x7368, 0x1610, 0x736A, 0x160F, 0x736B, 0x469C, 0x736C, 0x39C5,

+    0x736E, 0x469E, 0x736F, 0x469F, 0x7370, 0x1611, 0x7371, 0x46A0,

+    0x7372, 0x05AB, 0x7375, 0x1613, 0x7377, 0x2165, 0x7378, 0x1612,

+    0x737A, 0x1615, 0x737B, 0x1614, 0x737C, 0x39C6, 0x7381, 0x46A1,

+    0x7383, 0x39C7, 0x7384, 0x0770, 0x7385, 0x39C8, 0x7386, 0x39C9,

+    0x7387, 0x0F70, 0x7389, 0x06C4, 0x738A, 0x46A2, 0x738B, 0x0526,

+    0x7394, 0x46A3, 0x7395, 0x39CA, 0x7396, 0x06E2, 0x7398, 0x46A4,

+    0x739C, 0x46A5, 0x739E, 0x39CB, 0x739F, 0x39CC, 0x73A0, 0x39CD,

+    0x73A2, 0x424E, 0x73A5, 0x46A6, 0x73A6, 0x39CE, 0x73A8, 0x3C3F,

+    0x73A9, 0x061D, 0x73AB, 0x39CF, 0x73B2, 0x0FB0, 0x73B3, 0x1617,

+    0x73B5, 0x39D0, 0x73B7, 0x39D1, 0x73B9, 0x46A7, 0x73BA, 0x35EA,

+    0x73BB, 0x1619, 0x73BC, 0x39D2, 0x73BD, 0x2166, 0x73BF, 0x46A8,

+    0x73C0, 0x161A, 0x73C2, 0x0551, 0x73C5, 0x46A9, 0x73C8, 0x1616,

+    0x73C9, 0x2167, 0x73CA, 0x0887, 0x73CB, 0x46AA, 0x73CD, 0x0BDD,

+    0x73CE, 0x1618, 0x73CF, 0x39D3, 0x73D2, 0x216A, 0x73D6, 0x2168,

+    0x73D9, 0x39D4, 0x73DE, 0x161D, 0x73E0, 0x091A, 0x73E1, 0x46AB,

+    0x73E3, 0x2169, 0x73E4, 0x3C39, 0x73E5, 0x161B, 0x73E7, 0x46AC,

+    0x73E9, 0x39D5, 0x73EA, 0x0714, 0x73ED, 0x0D5D, 0x73EE, 0x161C,

+    0x73F1, 0x1637, 0x73F4, 0x39D6, 0x73F5, 0x216C, 0x73F8, 0x1622,

+    0x73F9, 0x46AD, 0x73FA, 0x46AF, 0x73FD, 0x39D7, 0x73FE, 0x0771,

+    0x7401, 0x46B0, 0x7403, 0x067F, 0x7404, 0x39D8, 0x7405, 0x161F,

+    0x7406, 0x0F67, 0x7407, 0x216B, 0x7409, 0x0F78, 0x740A, 0x39D9,

+    0x7413, 0x46AE, 0x741A, 0x39DA, 0x741B, 0x39DB, 0x7421, 0x3C3A,

+    0x7422, 0x0B56, 0x7424, 0x39DC, 0x7425, 0x1621, 0x7426, 0x216D,

+    0x7428, 0x39DD, 0x7429, 0x216F, 0x742A, 0x216E, 0x742B, 0x424F,

+    0x742C, 0x39DE, 0x742E, 0x2170, 0x742F, 0x39DF, 0x7430, 0x39E0,

+    0x7431, 0x39E1, 0x7432, 0x1623, 0x7433, 0x0F9E, 0x7434, 0x06CF,

+    0x7435, 0x0D90, 0x7436, 0x0D00, 0x7439, 0x39E2, 0x743A, 0x1624,

+    0x743F, 0x1626, 0x7440, 0x46B2, 0x7441, 0x1629, 0x7443, 0x46B3,

+    0x7444, 0x39E3, 0x7446, 0x4250, 0x7447, 0x39E4, 0x744B, 0x39E5,

+    0x744D, 0x39E6, 0x7451, 0x39E7, 0x7452, 0x46B4, 0x7453, 0x46B1,

+    0x7455, 0x1625, 0x7457, 0x39E8, 0x7459, 0x1628, 0x745A, 0x079E,

+    0x745B, 0x04EF, 0x745C, 0x162A, 0x745D, 0x46B5, 0x745E, 0x0A36,

+    0x745F, 0x1627, 0x7460, 0x0FA4, 0x7462, 0x4251, 0x7463, 0x162D,

+    0x7464, 0x1D35, 0x7466, 0x39E9, 0x7469, 0x162B, 0x746A, 0x162E,

+    0x746B, 0x39EA, 0x746D, 0x4252, 0x746F, 0x1620, 0x7470, 0x162C,

+    0x7471, 0x39EB, 0x7472, 0x4C57, 0x7473, 0x082C, 0x7476, 0x162F,

+    0x747E, 0x1630, 0x7480, 0x39EC, 0x7481, 0x46B6, 0x7483, 0x0F68,

+    0x7485, 0x39ED, 0x7486, 0x39EE, 0x7487, 0x39EF, 0x7488, 0x46B7,

+    0x7489, 0x2172, 0x748B, 0x1631, 0x7490, 0x39F0, 0x7492, 0x46B9,

+    0x7497, 0x46BA, 0x7498, 0x39F1, 0x7499, 0x46BB, 0x749C, 0x39F2,

+    0x749E, 0x1632, 0x749F, 0x2173, 0x74A0, 0x39F3, 0x74A1, 0x46BC,

+    0x74A2, 0x161E, 0x74A3, 0x39F4, 0x74A5, 0x46BD, 0x74A6, 0x4253,

+    0x74A7, 0x1633, 0x74A8, 0x39F5, 0x74A9, 0x4254, 0x74AA, 0x46BE,

+    0x74AB, 0x39F6, 0x74AF, 0x4C58, 0x74B0, 0x0600, 0x74B5, 0x39F7,

+    0x74B9, 0x46BF, 0x74BA, 0x46C1, 0x74BB, 0x46C0, 0x74BD, 0x08D1,

+    0x74BF, 0x39F8, 0x74C8, 0x39F9, 0x74C9, 0x4255, 0x74CA, 0x1634,

+    0x74CF, 0x1635, 0x74D4, 0x1636, 0x74D6, 0x46C2, 0x74D8, 0x46C3,

+    0x74DA, 0x39FA, 0x74DC, 0x04DD, 0x74DE, 0x39FB, 0x74DF, 0x4C59,

+    0x74E0, 0x1638, 0x74E2, 0x0DAD, 0x74E3, 0x1639, 0x74E4, 0x4C5A,

+    0x74E6, 0x05E0, 0x74E7, 0x163A, 0x74E9, 0x163B, 0x74EB, 0x46C4,

+    0x74EE, 0x163C, 0x74EF, 0x3750, 0x74F0, 0x163E, 0x74F1, 0x163F,

+    0x74F2, 0x163D, 0x74F4, 0x4C5B, 0x74F6, 0x0DC5, 0x74F7, 0x1641,

+    0x74F8, 0x1640, 0x74FA, 0x46C6, 0x74FB, 0x4C5C, 0x74FF, 0x4256,

+    0x7501, 0x2174, 0x7503, 0x1643, 0x7504, 0x1642, 0x7505, 0x1644,

+    0x750C, 0x1645, 0x750D, 0x1647, 0x750E, 0x1646, 0x7511, 0x080B,

+    0x7513, 0x1649, 0x7515, 0x1648, 0x7516, 0x4C5D, 0x7517, 0x4257,

+    0x7518, 0x0601, 0x751A, 0x0A19, 0x751C, 0x0C36, 0x751E, 0x164A,

+    0x751F, 0x0A5C, 0x7520, 0x46C8, 0x7521, 0x4C5E, 0x7522, 0x35DE,

+    0x7523, 0x0888, 0x7524, 0x46C9, 0x7525, 0x051B, 0x7526, 0x164B,

+    0x7528, 0x0F3B, 0x752A, 0x46CA, 0x752B, 0x0E33, 0x752C, 0x164C,

+    0x752F, 0x20F2, 0x7530, 0x0C3E, 0x7531, 0x0F1D, 0x7532, 0x07D5,

+    0x7533, 0x0A03, 0x7537, 0x0B89, 0x7538, 0x10C9, 0x753A, 0x0BCA,

+    0x753B, 0x0568, 0x753C, 0x164D, 0x753D, 0x46CD, 0x753E, 0x46CE,

+    0x753F, 0x4C5F, 0x7540, 0x46CF, 0x7544, 0x164E, 0x7546, 0x1653,

+    0x7548, 0x46D0, 0x7549, 0x1651, 0x754A, 0x1650, 0x754B, 0x13C7,

+    0x754C, 0x0584, 0x754D, 0x164F, 0x754E, 0x39FC, 0x754F, 0x049E,

+    0x7550, 0x46D1, 0x7551, 0x0D3E, 0x7552, 0x46D2, 0x7554, 0x0D5E,

+    0x7559, 0x0F79, 0x755A, 0x1654, 0x755B, 0x1652, 0x755C, 0x0B9A,

+    0x755D, 0x0A4A, 0x755E, 0x4C60, 0x7560, 0x0D3F, 0x7562, 0x0D9F,

+    0x7564, 0x1656, 0x7565, 0x0F74, 0x7566, 0x0723, 0x7567, 0x1657,

+    0x7569, 0x1655, 0x756A, 0x0D6A, 0x756B, 0x1658, 0x756C, 0x3C3B,

+    0x756D, 0x1659, 0x756F, 0x2175, 0x7570, 0x049F, 0x7571, 0x46D4,

+    0x7572, 0x46D3, 0x7573, 0x09DE, 0x7574, 0x165E, 0x7575, 0x3751,

+    0x7576, 0x165B, 0x7577, 0x0CC5, 0x7578, 0x165A, 0x7579, 0x39FD,

+    0x757A, 0x46D5, 0x757D, 0x46D6, 0x757E, 0x46D7, 0x757F, 0x0640,

+    0x7581, 0x39FE, 0x7582, 0x1661, 0x7586, 0x165C, 0x7587, 0x165D,

+    0x7589, 0x1660, 0x758A, 0x165F, 0x758B, 0x0D97, 0x758C, 0x46D8,

+    0x758E, 0x0AC4, 0x758F, 0x0AC3, 0x7590, 0x39FF, 0x7591, 0x0659,

+    0x7592, 0x3A00, 0x7593, 0x3A01, 0x7594, 0x1662, 0x7599, 0x4C61,

+    0x759A, 0x1663, 0x759D, 0x1664, 0x75A2, 0x46DA, 0x75A3, 0x1666,

+    0x75A4, 0x4C62, 0x75A5, 0x1665, 0x75AB, 0x04F8, 0x75B0, 0x46DC,

+    0x75B1, 0x166E, 0x75B2, 0x0D7C, 0x75B3, 0x1668, 0x75B4, 0x3A02,

+    0x75B5, 0x166A, 0x75B7, 0x46DD, 0x75B8, 0x166C, 0x75B9, 0x0A04,

+    0x75BC, 0x166D, 0x75BD, 0x166B, 0x75BE, 0x08EC, 0x75BF, 0x46DE,

+    0x75C0, 0x46DF, 0x75C1, 0x4C63, 0x75C2, 0x1667, 0x75C3, 0x1669,

+    0x75C4, 0x4C64, 0x75C5, 0x0DB4, 0x75C6, 0x46E0, 0x75C7, 0x09B1,

+    0x75CA, 0x1670, 0x75CC, 0x4C65, 0x75CD, 0x166F, 0x75CE, 0x4259,

+    0x75CF, 0x46E1, 0x75D2, 0x1671, 0x75D3, 0x46E2, 0x75D4, 0x08D2,

+    0x75D5, 0x081F, 0x75D7, 0x4C66, 0x75D8, 0x0C71, 0x75D9, 0x1672,

+    0x75DB, 0x0BE7, 0x75DC, 0x4C67, 0x75DD, 0x46E3, 0x75DE, 0x1674,

+    0x75DF, 0x46E4, 0x75E0, 0x46E5, 0x75E1, 0x4C68, 0x75E2, 0x0F69,

+    0x75E3, 0x1673, 0x75E4, 0x3A03, 0x75E7, 0x46E6, 0x75E9, 0x0AEB,

+    0x75EC, 0x3752, 0x75EE, 0x46E7, 0x75EF, 0x4C69, 0x75F0, 0x1679,

+    0x75F1, 0x46E8, 0x75F2, 0x167B, 0x75F3, 0x167C, 0x75F4, 0x0B92,

+    0x75F9, 0x3A04, 0x75FA, 0x167A, 0x75FC, 0x1677, 0x75FE, 0x1675,

+    0x75FF, 0x1676, 0x7600, 0x3A05, 0x7601, 0x1678, 0x7602, 0x425A,

+    0x7603, 0x46E9, 0x7604, 0x4C6A, 0x7607, 0x46EB, 0x7608, 0x425B,

+    0x7609, 0x167F, 0x760A, 0x3A06, 0x760B, 0x167D, 0x760C, 0x4C6B,

+    0x760D, 0x167E, 0x760F, 0x46EC, 0x7613, 0x46EF, 0x7615, 0x3A07,

+    0x7616, 0x3A08, 0x7618, 0x46EA, 0x7619, 0x3A09, 0x761B, 0x46F0,

+    0x761C, 0x46F1, 0x761D, 0x4C6C, 0x761E, 0x3A0A, 0x761F, 0x1680,

+    0x7620, 0x1682, 0x7621, 0x1683, 0x7622, 0x1684, 0x7624, 0x1685,

+    0x7625, 0x46F3, 0x7626, 0x3645, 0x7627, 0x1681, 0x7628, 0x46F4,

+    0x762D, 0x3A0B, 0x7630, 0x1687, 0x7632, 0x4C6D, 0x7633, 0x46F6,

+    0x7634, 0x1686, 0x7635, 0x3A0C, 0x7638, 0x4C6E, 0x763B, 0x1688,

+    0x763C, 0x46F5, 0x7641, 0x46F9, 0x7642, 0x0F8D, 0x7643, 0x3A0D,

+    0x7645, 0x4C6F, 0x7646, 0x168B, 0x7647, 0x1689, 0x7648, 0x168A,

+    0x7649, 0x46FB, 0x764A, 0x4C70, 0x764B, 0x3A0E, 0x764C, 0x061E,

+    0x764E, 0x3753, 0x7652, 0x0F0A, 0x7655, 0x46FC, 0x7656, 0x0E1A,

+    0x7658, 0x168D, 0x765C, 0x168C, 0x765F, 0x4C71, 0x7661, 0x168E,

+    0x7662, 0x168F, 0x7664, 0x425C, 0x7665, 0x3A0F, 0x7667, 0x1693,

+    0x7668, 0x1690, 0x7669, 0x1691, 0x766A, 0x1692, 0x766C, 0x1694,

+    0x766D, 0x3A10, 0x766E, 0x46FE, 0x766F, 0x3A11, 0x7670, 0x1695,

+    0x7671, 0x3A12, 0x7672, 0x1696, 0x7674, 0x3A13, 0x7676, 0x1697,

+    0x7678, 0x1698, 0x767A, 0x0D43, 0x767B, 0x0C4A, 0x767C, 0x1699,

+    0x767D, 0x0D28, 0x767E, 0x0DA6, 0x7680, 0x169A, 0x7681, 0x425D,

+    0x7682, 0x2176, 0x7683, 0x169B, 0x7684, 0x0C24, 0x7686, 0x0585,

+    0x7687, 0x07D6, 0x7688, 0x169C, 0x768B, 0x169D, 0x768E, 0x169E,

+    0x7690, 0x0877, 0x7693, 0x16A0, 0x7695, 0x46FF, 0x7696, 0x169F,

+    0x7699, 0x16A1, 0x769A, 0x16A2, 0x769B, 0x2179, 0x769C, 0x2177,

+    0x769D, 0x425E, 0x769E, 0x2178, 0x76A0, 0x4701, 0x76A1, 0x4700,

+    0x76A4, 0x3A14, 0x76A5, 0x3A15, 0x76A6, 0x217A, 0x76A7, 0x4702,

+    0x76A8, 0x4703, 0x76AA, 0x425F, 0x76AD, 0x4C72, 0x76AE, 0x0D7D,

+    0x76AF, 0x4704, 0x76B0, 0x16A3, 0x76B4, 0x16A4, 0x76B6, 0x4260,

+    0x76B7, 0x1D1C, 0x76B8, 0x16A5, 0x76B9, 0x16A6, 0x76BA, 0x16A7,

+    0x76BD, 0x4C73, 0x76BF, 0x087C, 0x76C2, 0x16A8, 0x76C3, 0x0D0C,

+    0x76C5, 0x3A16, 0x76C6, 0x0E8D, 0x76C8, 0x04F0, 0x76C9, 0x4706,

+    0x76CA, 0x04F9, 0x76CC, 0x3A17, 0x76CD, 0x16A9, 0x76CE, 0x4261,

+    0x76D2, 0x16AB, 0x76D4, 0x4262, 0x76D6, 0x16AA, 0x76D7, 0x0C6A,

+    0x76D9, 0x4C74, 0x76DB, 0x0A5D, 0x76DC, 0x14D8, 0x76DE, 0x16AC,

+    0x76DF, 0x0ECD, 0x76E1, 0x16AD, 0x76E3, 0x0602, 0x76E4, 0x0D6B,

+    0x76E5, 0x16AE, 0x76E6, 0x4263, 0x76E7, 0x16AF, 0x76E8, 0x4708,

+    0x76EA, 0x16B0, 0x76EB, 0x4C75, 0x76EC, 0x3A18, 0x76EE, 0x0EE8,

+    0x76F0, 0x4C76, 0x76F1, 0x4264, 0x76F2, 0x0EE1, 0x76F4, 0x0BDA,

+    0x76F8, 0x0AEC, 0x76F9, 0x4C77, 0x76FB, 0x16B2, 0x76FC, 0x3A19,

+    0x76FE, 0x096C, 0x7700, 0x4C78, 0x7701, 0x09B2, 0x7704, 0x16B5,

+    0x7707, 0x16B4, 0x7708, 0x16B3, 0x7709, 0x0D91, 0x770A, 0x4265,

+    0x770B, 0x0603, 0x770C, 0x075D, 0x770E, 0x4C79, 0x7717, 0x470A,

+    0x7719, 0x4266, 0x771A, 0x470B, 0x771B, 0x16BB, 0x771E, 0x16B8,

+    0x771F, 0x0A05, 0x7720, 0x0EBE, 0x7722, 0x4C7A, 0x7724, 0x16B7,

+    0x7725, 0x16B9, 0x7726, 0x16BA, 0x7728, 0x4C7B, 0x7729, 0x16B6,

+    0x772D, 0x470C, 0x772F, 0x4C7C, 0x7734, 0x3A1A, 0x7735, 0x470D,

+    0x7736, 0x3A1B, 0x7737, 0x16BC, 0x7738, 0x16BD, 0x7739, 0x4C7D,

+    0x773A, 0x0BCB, 0x773C, 0x061F, 0x773E, 0x4C7E, 0x7740, 0x0BA3,

+    0x7745, 0x4C7F, 0x7746, 0x217C, 0x7747, 0x16BE, 0x774A, 0x4C80,

+    0x774D, 0x4267, 0x774E, 0x4268, 0x774F, 0x4C81, 0x7758, 0x4712,

+    0x775A, 0x16BF, 0x775B, 0x16C2, 0x775C, 0x3A1C, 0x775E, 0x4C82,

+    0x775F, 0x3A1D, 0x7760, 0x3A1E, 0x7761, 0x0A2D, 0x7762, 0x1EC5,

+    0x7763, 0x0C9C, 0x7764, 0x4C83, 0x7765, 0x16C3, 0x7766, 0x0E81,

+    0x7767, 0x4C84, 0x7768, 0x16C0, 0x776A, 0x3755, 0x776B, 0x16C1,

+    0x776C, 0x4C85, 0x7772, 0x3A1F, 0x7779, 0x16C6, 0x777A, 0x4269,

+    0x777C, 0x4714, 0x777D, 0x3A20, 0x777E, 0x16C5, 0x777F, 0x16C4,

+    0x7780, 0x426A, 0x7784, 0x4C86, 0x778B, 0x16C8, 0x778C, 0x4C87,

+    0x778D, 0x4C88, 0x778E, 0x16C7, 0x7791, 0x16C9, 0x7794, 0x426B,

+    0x7795, 0x3A21, 0x7796, 0x4C89, 0x779A, 0x4717, 0x779E, 0x16CB,

+    0x779F, 0x4718, 0x77A0, 0x16CA, 0x77A2, 0x4719, 0x77A4, 0x471A,

+    0x77A5, 0x0E1D, 0x77A7, 0x4C8A, 0x77A9, 0x3756, 0x77AA, 0x3A22,

+    0x77AC, 0x0960, 0x77AD, 0x0F8E, 0x77AF, 0x4C8B, 0x77B0, 0x16CC,

+    0x77B3, 0x0C8F, 0x77B6, 0x16CD, 0x77B7, 0x4C8C, 0x77B9, 0x16CE,

+    0x77BB, 0x16D2, 0x77BC, 0x16D0, 0x77BD, 0x16D1, 0x77BE, 0x4C8D,

+    0x77BF, 0x16CF, 0x77C7, 0x16D3, 0x77C9, 0x4C8E, 0x77CD, 0x16D4,

+    0x77D1, 0x4C8F, 0x77D7, 0x16D5, 0x77D9, 0x4C90, 0x77DA, 0x16D6,

+    0x77DB, 0x0EC3, 0x77DC, 0x16D7, 0x77DE, 0x471B, 0x77DF, 0x471C,

+    0x77E0, 0x426C, 0x77E2, 0x0EFC, 0x77E3, 0x16D8, 0x77E4, 0x471D,

+    0x77E5, 0x0B8C, 0x77E6, 0x3A23, 0x77E7, 0x0D20, 0x77E9, 0x06E3,

+    0x77EA, 0x471E, 0x77EC, 0x471F, 0x77ED, 0x0B79, 0x77EE, 0x16D9,

+    0x77EF, 0x06B2, 0x77F0, 0x3A24, 0x77F1, 0x4C91, 0x77F3, 0x0A74,

+    0x77F4, 0x3A25, 0x77FB, 0x4720, 0x77FC, 0x16DA, 0x7802, 0x082D,

+    0x7805, 0x4722, 0x7806, 0x3A26, 0x7809, 0x4723, 0x780C, 0x16DB,

+    0x780D, 0x4724, 0x7812, 0x16DC, 0x7814, 0x075A, 0x7815, 0x0845,

+    0x7819, 0x4725, 0x7820, 0x16DE, 0x7821, 0x217E, 0x7822, 0x3A27,

+    0x7825, 0x0C50, 0x7826, 0x0846, 0x7827, 0x0668, 0x782C, 0x4726,

+    0x782D, 0x3A28, 0x782E, 0x3A29, 0x7830, 0x3A2A, 0x7832, 0x0E52,

+    0x7834, 0x0D01, 0x7835, 0x3A2B, 0x7837, 0x4C92, 0x783A, 0x0C51,

+    0x783F, 0x07EE, 0x7843, 0x426E, 0x7845, 0x16E0, 0x7847, 0x4727,

+    0x784E, 0x217F, 0x784F, 0x341E, 0x7851, 0x3C3C, 0x785C, 0x4C93,

+    0x785D, 0x09B3, 0x7864, 0x2180, 0x7868, 0x3A2C, 0x786A, 0x4728,

+    0x786B, 0x0F7A, 0x786C, 0x07D7, 0x786E, 0x426F, 0x786F, 0x075B,

+    0x7872, 0x0D37, 0x7874, 0x16E2, 0x787A, 0x2181, 0x787C, 0x16E4,

+    0x787E, 0x4C94, 0x7881, 0x079F, 0x7886, 0x16E3, 0x7887, 0x0C12,

+    0x788A, 0x472A, 0x788C, 0x16E6, 0x788D, 0x0595, 0x788E, 0x16E1,

+    0x7891, 0x0D7E, 0x7893, 0x04D2, 0x7894, 0x472B, 0x7895, 0x085C,

+    0x7897, 0x0FF8, 0x7898, 0x4C95, 0x789A, 0x16E5, 0x789D, 0x472D,

+    0x789E, 0x3A2D, 0x789F, 0x472E, 0x78A1, 0x4C96, 0x78A3, 0x16E7,

+    0x78A4, 0x472C, 0x78A7, 0x0E1B, 0x78A9, 0x0A7D, 0x78AA, 0x16E9,

+    0x78AD, 0x4272, 0x78AF, 0x16EA, 0x78B0, 0x4270, 0x78B1, 0x4C97,

+    0x78B3, 0x4C98, 0x78B5, 0x16E8, 0x78BA, 0x05AC, 0x78BB, 0x472F,

+    0x78BC, 0x16F0, 0x78BE, 0x16EF, 0x78C1, 0x08D3, 0x78C5, 0x16F1,

+    0x78C6, 0x16EC, 0x78C8, 0x3A2E, 0x78C9, 0x4C99, 0x78CA, 0x16F2,

+    0x78CB, 0x16ED, 0x78CC, 0x3A2F, 0x78CE, 0x3A30, 0x78D0, 0x0D6C,

+    0x78D1, 0x16EB, 0x78D3, 0x4C9A, 0x78D4, 0x16EE, 0x78D5, 0x4730,

+    0x78DA, 0x16F5, 0x78E0, 0x3A32, 0x78E1, 0x3A33, 0x78E4, 0x3A31,

+    0x78E6, 0x4731, 0x78E7, 0x16F4, 0x78E8, 0x0E8F, 0x78EC, 0x16F3,

+    0x78EF, 0x04AF, 0x78F2, 0x3A34, 0x78F4, 0x16F7, 0x78F7, 0x3A35,

+    0x78F9, 0x4732, 0x78FA, 0x4733, 0x78FB, 0x3A36, 0x78FD, 0x16F6,

+    0x78FE, 0x4734, 0x7900, 0x4273, 0x7901, 0x09B4, 0x7907, 0x16F8,

+    0x790C, 0x4C9B, 0x790E, 0x0AC5, 0x7910, 0x4736, 0x7911, 0x16FA,

+    0x7912, 0x16F9, 0x7919, 0x16FB, 0x791B, 0x4737, 0x791C, 0x4274,

+    0x791F, 0x4C9C, 0x7925, 0x4738, 0x7926, 0x16DD, 0x7927, 0x4C9D,

+    0x7928, 0x4C9E, 0x792A, 0x16DF, 0x792B, 0x16FD, 0x792C, 0x16FC,

+    0x792E, 0x4275, 0x7930, 0x2182, 0x7931, 0x3A37, 0x7934, 0x4276,

+    0x793A, 0x08D4, 0x793B, 0x3A39, 0x793C, 0x0FB1, 0x793D, 0x3A3A,

+    0x793E, 0x08FE, 0x793F, 0x4C9F, 0x7940, 0x16FE, 0x7941, 0x070D,

+    0x7942, 0x4CA0, 0x7945, 0x3A3B, 0x7946, 0x4277, 0x7947, 0x065A,

+    0x7948, 0x0641, 0x7949, 0x08B1, 0x794A, 0x4739, 0x7950, 0x0F1E,

+    0x7953, 0x1704, 0x7954, 0x4CA1, 0x7955, 0x1703, 0x7956, 0x0AC6,

+    0x7957, 0x1700, 0x7958, 0x473A, 0x795A, 0x1702, 0x795B, 0x3A3C,

+    0x795C, 0x3A3D, 0x795D, 0x0955, 0x795E, 0x0A06, 0x795F, 0x1701,

+    0x7960, 0x16FF, 0x7962, 0x0CE0, 0x7965, 0x09B5, 0x7967, 0x473C,

+    0x7968, 0x0DAE, 0x796B, 0x4CA2, 0x796D, 0x0847, 0x7972, 0x473D,

+    0x7977, 0x0C72, 0x7979, 0x4278, 0x797A, 0x1705, 0x797C, 0x4CA3,

+    0x797F, 0x1706, 0x7980, 0x171C, 0x7981, 0x06D0, 0x7984, 0x0FE3,

+    0x7985, 0x0AB7, 0x798A, 0x1707, 0x798B, 0x3A3E, 0x798D, 0x0552,

+    0x798E, 0x0C13, 0x798F, 0x0DF1, 0x7994, 0x2186, 0x7995, 0x473E,

+    0x7996, 0x3A3F, 0x7998, 0x3A40, 0x799B, 0x2188, 0x799D, 0x1708,

+    0x79A1, 0x473F, 0x79A6, 0x0694, 0x79A7, 0x1709, 0x79A9, 0x4740,

+    0x79AA, 0x170B, 0x79AB, 0x4CA4, 0x79AE, 0x170C, 0x79B0, 0x0CDF,

+    0x79B1, 0x1E4E, 0x79B3, 0x170D, 0x79B4, 0x4741, 0x79B8, 0x3A41,

+    0x79B9, 0x170E, 0x79BA, 0x170F, 0x79BB, 0x3A42, 0x79BD, 0x06D1,

+    0x79BE, 0x0553, 0x79BF, 0x0C9D, 0x79C0, 0x0932, 0x79C1, 0x08B2,

+    0x79C2, 0x4742, 0x79C4, 0x4CA5, 0x79C7, 0x4743, 0x79C8, 0x4279,

+    0x79C9, 0x1710, 0x79CA, 0x3A43, 0x79CB, 0x0933, 0x79CC, 0x4744,

+    0x79CD, 0x4745, 0x79D1, 0x054A, 0x79D2, 0x0DB5, 0x79D4, 0x427B,

+    0x79D5, 0x1711, 0x79D6, 0x4746, 0x79D8, 0x0D7F, 0x79DA, 0x3A44,

+    0x79DE, 0x427C, 0x79DF, 0x0AC7, 0x79E1, 0x1714, 0x79E3, 0x1715,

+    0x79E4, 0x0D1F, 0x79E6, 0x0A07, 0x79E7, 0x1712, 0x79E9, 0x0B9F,

+    0x79EA, 0x4CA6, 0x79EB, 0x427D, 0x79EC, 0x1713, 0x79ED, 0x427E,

+    0x79F0, 0x09B6, 0x79FB, 0x04A0, 0x7A00, 0x0643, 0x7A02, 0x4CA7,

+    0x7A03, 0x3A45, 0x7A05, 0x3633, 0x7A08, 0x1716, 0x7A09, 0x3A46,

+    0x7A0A, 0x474B, 0x7A0B, 0x0C14, 0x7A0C, 0x4CA8, 0x7A0D, 0x1717,

+    0x7A0E, 0x0A6B, 0x7A11, 0x3A47, 0x7A14, 0x0EB9, 0x7A15, 0x474C,

+    0x7A17, 0x0D95, 0x7A18, 0x1718, 0x7A19, 0x1719, 0x7A1A, 0x0B93,

+    0x7A1B, 0x474D, 0x7A1C, 0x0F8F, 0x7A1E, 0x3A48, 0x7A1F, 0x171B,

+    0x7A20, 0x171A, 0x7A2D, 0x3A49, 0x7A2E, 0x091B, 0x7A30, 0x4CA9,

+    0x7A31, 0x171D, 0x7A32, 0x04B4, 0x7A37, 0x1720, 0x7A38, 0x474F,

+    0x7A39, 0x3A4A, 0x7A3A, 0x4CAA, 0x7A3B, 0x171E, 0x7A3C, 0x0554,

+    0x7A3D, 0x0724, 0x7A3E, 0x171F, 0x7A3F, 0x07D8, 0x7A40, 0x0804,

+    0x7A42, 0x0E36, 0x7A43, 0x1721, 0x7A44, 0x4CAB, 0x7A45, 0x3A4B,

+    0x7A46, 0x0E82, 0x7A47, 0x4750, 0x7A49, 0x1723, 0x7A4C, 0x3A4C,

+    0x7A4D, 0x0A75, 0x7A4E, 0x04F1, 0x7A4F, 0x053A, 0x7A50, 0x0470,

+    0x7A56, 0x4751, 0x7A57, 0x1722, 0x7A59, 0x4752, 0x7A5C, 0x4753,

+    0x7A5D, 0x3A4D, 0x7A5F, 0x4754, 0x7A60, 0x4F56, 0x7A61, 0x1724,

+    0x7A62, 0x1725, 0x7A63, 0x09DF, 0x7A67, 0x4755, 0x7A69, 0x1726,

+    0x7A6A, 0x4756, 0x7A6B, 0x05AD, 0x7A6D, 0x3A4F, 0x7A70, 0x1728,

+    0x7A74, 0x0740, 0x7A75, 0x4757, 0x7A76, 0x0680, 0x7A78, 0x3A50,

+    0x7A79, 0x1729, 0x7A7A, 0x06ED, 0x7A7D, 0x172A, 0x7A7F, 0x0AA0,

+    0x7A80, 0x4CAC, 0x7A81, 0x0CA5, 0x7A82, 0x4758, 0x7A83, 0x0A84,

+    0x7A84, 0x0865, 0x7A85, 0x427F, 0x7A86, 0x4CAD, 0x7A88, 0x172B,

+    0x7A8A, 0x4759, 0x7A90, 0x475A, 0x7A92, 0x0BA0, 0x7A93, 0x0AED,

+    0x7A94, 0x4CAE, 0x7A95, 0x172D, 0x7A96, 0x172F, 0x7A97, 0x172C,

+    0x7A98, 0x172E, 0x7A9F, 0x06F8, 0x7AA0, 0x3A51, 0x7AA3, 0x3A52,

+    0x7AA9, 0x1730, 0x7AAA, 0x06FC, 0x7AAC, 0x475B, 0x7AAE, 0x0681,

+    0x7AAF, 0x0F3C, 0x7AB0, 0x1732, 0x7AB3, 0x3A53, 0x7AB5, 0x4CAF,

+    0x7AB6, 0x1733, 0x7AB9, 0x475E, 0x7ABA, 0x04D0, 0x7ABB, 0x3A54,

+    0x7ABC, 0x3A55, 0x7ABD, 0x4CB0, 0x7ABE, 0x475F, 0x7ABF, 0x1736,

+    0x7AC3, 0x05D4, 0x7AC4, 0x1735, 0x7AC5, 0x1734, 0x7AC6, 0x3A56,

+    0x7AC7, 0x1738, 0x7AC8, 0x1731, 0x7ACA, 0x1739, 0x7ACB, 0x0F71,

+    0x7ACC, 0x4761, 0x7ACD, 0x173A, 0x7ACE, 0x4281, 0x7ACF, 0x173B,

+    0x7AD1, 0x2189, 0x7AD2, 0x11C5, 0x7AD3, 0x173D, 0x7AD5, 0x173C,

+    0x7AD9, 0x173E, 0x7ADA, 0x173F, 0x7ADC, 0x0F7D, 0x7ADD, 0x1740,

+    0x7ADF, 0x1C08, 0x7AE0, 0x09B7, 0x7AE1, 0x1741, 0x7AE2, 0x1742,

+    0x7AE3, 0x0961, 0x7AE5, 0x0C90, 0x7AE6, 0x1743, 0x7AE7, 0x218A,

+    0x7AE8, 0x4762, 0x7AEA, 0x0B66, 0x7AEB, 0x218C, 0x7AED, 0x1744,

+    0x7AEF, 0x0B7A, 0x7AF0, 0x1745, 0x7AF4, 0x4763, 0x7AF6, 0x069D,

+    0x7AF8, 0x1076, 0x7AF9, 0x0B9B, 0x7AFA, 0x08DF, 0x7AFD, 0x4282,

+    0x7AFE, 0x4CB1, 0x7AFF, 0x0604, 0x7B02, 0x1746, 0x7B04, 0x1753,

+    0x7B06, 0x1749, 0x7B07, 0x3A57, 0x7B08, 0x0682, 0x7B0A, 0x1748,

+    0x7B0B, 0x1755, 0x7B0F, 0x1747, 0x7B11, 0x09B8, 0x7B12, 0x4283,

+    0x7B14, 0x3A58, 0x7B18, 0x174B, 0x7B19, 0x174C, 0x7B1B, 0x0C25,

+    0x7B1E, 0x174D, 0x7B20, 0x05BC, 0x7B25, 0x0A20, 0x7B26, 0x0DD6,

+    0x7B27, 0x3A59, 0x7B28, 0x174F, 0x7B2A, 0x4768, 0x7B2B, 0x4CB2,

+    0x7B2C, 0x0B48, 0x7B2D, 0x4284, 0x7B2E, 0x4769, 0x7B2F, 0x476A,

+    0x7B31, 0x3A5A, 0x7B33, 0x174A, 0x7B35, 0x174E, 0x7B36, 0x1750,

+    0x7B39, 0x086B, 0x7B3B, 0x4285, 0x7B3D, 0x4767, 0x7B41, 0x476E,

+    0x7B45, 0x1757, 0x7B46, 0x0DA0, 0x7B47, 0x3A5B, 0x7B48, 0x0D3A,

+    0x7B49, 0x0C73, 0x7B4B, 0x06D2, 0x7B4C, 0x1756, 0x7B4D, 0x1754,

+    0x7B4E, 0x3A5C, 0x7B4F, 0x0D49, 0x7B50, 0x1751, 0x7B51, 0x0B9C,

+    0x7B52, 0x0C75, 0x7B53, 0x375D, 0x7B54, 0x0C74, 0x7B55, 0x4770,

+    0x7B56, 0x0866, 0x7B5D, 0x1769, 0x7B60, 0x3A5D, 0x7B64, 0x4772,

+    0x7B65, 0x1759, 0x7B66, 0x4773, 0x7B67, 0x175B, 0x7B69, 0x3A5E,

+    0x7B6C, 0x175E, 0x7B6D, 0x3A5F, 0x7B6E, 0x175F, 0x7B6F, 0x4286,

+    0x7B70, 0x175C, 0x7B71, 0x175D, 0x7B72, 0x3A60, 0x7B73, 0x4774,

+    0x7B74, 0x175A, 0x7B75, 0x1758, 0x7B77, 0x4CB3, 0x7B79, 0x4771,

+    0x7B7A, 0x1752, 0x7B7F, 0x476D, 0x7B86, 0x0E1F, 0x7B87, 0x0555,

+    0x7B8B, 0x1766, 0x7B8D, 0x1763, 0x7B8F, 0x1768, 0x7B90, 0x4777,

+    0x7B91, 0x3A61, 0x7B92, 0x1767, 0x7B94, 0x0D29, 0x7B95, 0x0EB3,

+    0x7B97, 0x0889, 0x7B98, 0x1761, 0x7B99, 0x176A, 0x7B9A, 0x1765,

+    0x7B9B, 0x4778, 0x7B9C, 0x1764, 0x7B9D, 0x1760, 0x7B9E, 0x218D,

+    0x7B9F, 0x1762, 0x7BA0, 0x4CB4, 0x7BA1, 0x0605, 0x7BAA, 0x0B7B,

+    0x7BAC, 0x4CB5, 0x7BAD, 0x0AA1, 0x7BAF, 0x3A62, 0x7BB0, 0x4CB6,

+    0x7BB1, 0x0D36, 0x7BB4, 0x176F, 0x7BB5, 0x477A, 0x7BB8, 0x0D38,

+    0x7BBC, 0x477B, 0x7BC0, 0x0A85, 0x7BC1, 0x176C, 0x7BC4, 0x0D63,

+    0x7BC5, 0x477C, 0x7BC6, 0x1770, 0x7BC7, 0x0E23, 0x7BC9, 0x0B99,

+    0x7BCA, 0x477D, 0x7BCB, 0x176B, 0x7BCC, 0x176D, 0x7BCF, 0x176E,

+    0x7BD4, 0x4780, 0x7BD6, 0x4781, 0x7BD7, 0x3A63, 0x7BD9, 0x3A64,

+    0x7BDA, 0x4782, 0x7BDD, 0x1771, 0x7BE0, 0x08F0, 0x7BE4, 0x0C9E,

+    0x7BE5, 0x1776, 0x7BE6, 0x1775, 0x7BE8, 0x4CB7, 0x7BE9, 0x1772,

+    0x7BEA, 0x4783, 0x7BED, 0x0FDC, 0x7BF0, 0x4784, 0x7BF2, 0x4CB8,

+    0x7BF3, 0x177B, 0x7BF6, 0x177F, 0x7BF7, 0x177C, 0x7BF8, 0x4CB9,

+    0x7BFC, 0x4CBA, 0x7BFE, 0x4CBB, 0x7C00, 0x1778, 0x7C01, 0x4287,

+    0x7C03, 0x4785, 0x7C07, 0x1779, 0x7C09, 0x4CBC, 0x7C0B, 0x3A65,

+    0x7C0D, 0x177E, 0x7C0E, 0x4786, 0x7C0F, 0x3A66, 0x7C11, 0x1773,

+    0x7C12, 0x10EA, 0x7C13, 0x177A, 0x7C14, 0x1774, 0x7C17, 0x177D,

+    0x7C1E, 0x1E3B, 0x7C1F, 0x1783, 0x7C20, 0x3A67, 0x7C21, 0x0606,

+    0x7C23, 0x1780, 0x7C26, 0x3A68, 0x7C27, 0x1781, 0x7C28, 0x4CBD,

+    0x7C2A, 0x1782, 0x7C2B, 0x1785, 0x7C2F, 0x4CBE, 0x7C31, 0x3A69,

+    0x7C33, 0x4288, 0x7C36, 0x3A6A, 0x7C37, 0x1784, 0x7C38, 0x0D8A,

+    0x7C3D, 0x1786, 0x7C3E, 0x0FC4, 0x7C3F, 0x0E3D, 0x7C40, 0x178B,

+    0x7C42, 0x4CBF, 0x7C43, 0x1788, 0x7C45, 0x4787, 0x7C4A, 0x4788,

+    0x7C4C, 0x1787, 0x7C4D, 0x0A76, 0x7C4F, 0x178A, 0x7C50, 0x178C,

+    0x7C51, 0x3A6B, 0x7C52, 0x4CC0, 0x7C53, 0x4CC1, 0x7C54, 0x1789,

+    0x7C56, 0x1790, 0x7C57, 0x4789, 0x7C58, 0x178D, 0x7C59, 0x3A6C,

+    0x7C5B, 0x4CC2, 0x7C5C, 0x4CC3, 0x7C5D, 0x4CC4, 0x7C5E, 0x478A,

+    0x7C5F, 0x178E, 0x7C60, 0x1777, 0x7C61, 0x478B, 0x7C64, 0x178F,

+    0x7C65, 0x1791, 0x7C67, 0x3A6D, 0x7C69, 0x478C, 0x7C6C, 0x1792,

+    0x7C6D, 0x428A, 0x7C6E, 0x3A6E, 0x7C6F, 0x478D, 0x7C70, 0x3A6F,

+    0x7C72, 0x4CC5, 0x7C73, 0x0E16, 0x7C75, 0x1793, 0x7C79, 0x428B,

+    0x7C7B, 0x370E, 0x7C7D, 0x4CC6, 0x7C7E, 0x0EEE, 0x7C81, 0x06C6,

+    0x7C82, 0x06FF, 0x7C83, 0x1794, 0x7C87, 0x4CC7, 0x7C89, 0x0E04,

+    0x7C8B, 0x0A2E, 0x7C8D, 0x0EBC, 0x7C8F, 0x428C, 0x7C90, 0x1795,

+    0x7C92, 0x0F7B, 0x7C94, 0x428D, 0x7C95, 0x0D2A, 0x7C97, 0x0AC8,

+    0x7C98, 0x0CEA, 0x7C9B, 0x0957, 0x7C9E, 0x4CC8, 0x7C9F, 0x0484,

+    0x7CA0, 0x428E, 0x7CA1, 0x179A, 0x7CA2, 0x1798, 0x7CA4, 0x1796,

+    0x7CA5, 0x05DD, 0x7CA6, 0x4791, 0x7CA7, 0x09B9, 0x7CA8, 0x179B,

+    0x7CAB, 0x1799, 0x7CAD, 0x1797, 0x7CAE, 0x179F, 0x7CB1, 0x179E,

+    0x7CB2, 0x179D, 0x7CB3, 0x179C, 0x7CB6, 0x4793, 0x7CB7, 0x4794,

+    0x7CB9, 0x17A0, 0x7CBA, 0x4CC9, 0x7CBC, 0x3A70, 0x7CBD, 0x17A1,

+    0x7CBE, 0x0A5E, 0x7CBF, 0x3A71, 0x7CC0, 0x17A2, 0x7CC2, 0x17A4,

+    0x7CC4, 0x4796, 0x7CC5, 0x17A3, 0x7CC7, 0x4CCA, 0x7CC8, 0x3A72,

+    0x7CC9, 0x3A73, 0x7CCA, 0x0786, 0x7CCD, 0x4798, 0x7CCE, 0x0ABA,

+    0x7CD2, 0x17A6, 0x7CD3, 0x4CCB, 0x7CD5, 0x428F, 0x7CD6, 0x0C76,

+    0x7CD7, 0x3A74, 0x7CD8, 0x17A5, 0x7CD9, 0x3A75, 0x7CDA, 0x4CCC,

+    0x7CDC, 0x17A7, 0x7CDD, 0x3A76, 0x7CDE, 0x0E05, 0x7CDF, 0x0AEE,

+    0x7CE0, 0x07D9, 0x7CE2, 0x17A8, 0x7CE6, 0x479B, 0x7CE7, 0x0F90,

+    0x7CEB, 0x3A77, 0x7CEF, 0x17AA, 0x7CF2, 0x17AB, 0x7CF4, 0x17AC,

+    0x7CF5, 0x479D, 0x7CF6, 0x17AD, 0x7CF8, 0x08B3, 0x7CFA, 0x17AE,

+    0x7CFB, 0x0725, 0x7CFE, 0x0684, 0x7D00, 0x0644, 0x7D02, 0x17B0,

+    0x7D03, 0x479E, 0x7D04, 0x0EFF, 0x7D05, 0x07DA, 0x7D06, 0x17AF,

+    0x7D07, 0x3A78, 0x7D08, 0x3A79, 0x7D09, 0x3A7A, 0x7D0A, 0x17B3,

+    0x7D0B, 0x0EF2, 0x7D0D, 0x0CF2, 0x7D10, 0x0DA5, 0x7D12, 0x47A0,

+    0x7D13, 0x3A7B, 0x7D14, 0x096D, 0x7D15, 0x17B2, 0x7D17, 0x08FF,

+    0x7D18, 0x07DB, 0x7D19, 0x08B4, 0x7D1A, 0x0683, 0x7D1B, 0x0E06,

+    0x7D1C, 0x17B1, 0x7D1D, 0x3A7C, 0x7D1E, 0x47A1, 0x7D20, 0x0AC9,

+    0x7D21, 0x0E70, 0x7D22, 0x0867, 0x7D23, 0x3A7D, 0x7D2B, 0x08B5,

+    0x7D2C, 0x0BF9, 0x7D2E, 0x17B6, 0x7D2F, 0x0FA7, 0x7D30, 0x0849,

+    0x7D31, 0x4290, 0x7D32, 0x17B7, 0x7D33, 0x0A08, 0x7D35, 0x17B9,

+    0x7D39, 0x09BA, 0x7D3A, 0x0820, 0x7D3C, 0x4CCD, 0x7D3D, 0x47A4,

+    0x7D3E, 0x47A5, 0x7D3F, 0x17B8, 0x7D40, 0x47A6, 0x7D41, 0x3A7E,

+    0x7D42, 0x0934, 0x7D43, 0x0772, 0x7D44, 0x0ACA, 0x7D45, 0x17B4,

+    0x7D46, 0x17BA, 0x7D47, 0x47A7, 0x7D48, 0x218F, 0x7D4B, 0x17B5,

+    0x7D4C, 0x0726, 0x7D4D, 0x4CCE, 0x7D4E, 0x17BD, 0x7D4F, 0x17C1,

+    0x7D50, 0x0741, 0x7D53, 0x3A7F, 0x7D55, 0x363A, 0x7D56, 0x17BC,

+    0x7D59, 0x3A80, 0x7D5A, 0x47AB, 0x7D5B, 0x17C5, 0x7D5C, 0x4291,

+    0x7D5D, 0x3A81, 0x7D5E, 0x07DC, 0x7D61, 0x0F57, 0x7D62, 0x0480,

+    0x7D63, 0x17C2, 0x7D66, 0x0685, 0x7D68, 0x17BF, 0x7D6A, 0x47AC,

+    0x7D6E, 0x17C0, 0x7D70, 0x47AD, 0x7D71, 0x0C77, 0x7D72, 0x17BE,

+    0x7D73, 0x17BB, 0x7D75, 0x0586, 0x7D76, 0x0A88, 0x7D79, 0x075C,

+    0x7D7A, 0x3A82, 0x7D7D, 0x17C7, 0x7D7F, 0x47AF, 0x7D82, 0x4CCF,

+    0x7D83, 0x4292, 0x7D85, 0x4CD0, 0x7D86, 0x3A83, 0x7D88, 0x47B1,

+    0x7D89, 0x17C4, 0x7D8B, 0x3A84, 0x7D8C, 0x3A85, 0x7D8D, 0x4CD1,

+    0x7D8F, 0x17C6, 0x7D91, 0x4CD2, 0x7D93, 0x17C3, 0x7D97, 0x47B2,

+    0x7D99, 0x0727, 0x7D9A, 0x0B13, 0x7D9B, 0x17C8, 0x7D9C, 0x0AF0,

+    0x7D9D, 0x47B4, 0x7D9E, 0x4CD3, 0x7D9F, 0x17D5, 0x7DA0, 0x2192,

+    0x7DA2, 0x17D1, 0x7DA3, 0x17CB, 0x7DA6, 0x4293, 0x7DA7, 0x47B5,

+    0x7DAA, 0x47B6, 0x7DAB, 0x17CF, 0x7DAC, 0x0926, 0x7DAD, 0x04A1,

+    0x7DAE, 0x17CA, 0x7DAF, 0x17D2, 0x7DB0, 0x17D6, 0x7DB1, 0x07DD,

+    0x7DB2, 0x0EE2, 0x7DB3, 0x4CD4, 0x7DB4, 0x0BF2, 0x7DB5, 0x17CC,

+    0x7DB6, 0x47B7, 0x7DB7, 0x2191, 0x7DB8, 0x17D4, 0x7DB9, 0x4CD5,

+    0x7DBA, 0x17C9, 0x7DBB, 0x0B7C, 0x7DBD, 0x17CE, 0x7DBE, 0x0481,

+    0x7DBF, 0x0ED6, 0x7DC0, 0x47B8, 0x7DC2, 0x4294, 0x7DC7, 0x17CD,

+    0x7DCA, 0x06D3, 0x7DCB, 0x0D80, 0x7DCC, 0x3A86, 0x7DCF, 0x0AEF,

+    0x7DD0, 0x4CD6, 0x7DD1, 0x0F98, 0x7DD2, 0x0979, 0x7DD5, 0x17FD,

+    0x7DD6, 0x2193, 0x7DD7, 0x47B9, 0x7DD8, 0x17D7, 0x7DD9, 0x47BA,

+    0x7DDA, 0x0AA2, 0x7DDC, 0x17D3, 0x7DDD, 0x17D8, 0x7DDE, 0x17DA,

+    0x7DE0, 0x0C15, 0x7DE1, 0x17DD, 0x7DE3, 0x340A, 0x7DE4, 0x17D9,

+    0x7DE5, 0x4CD7, 0x7DE6, 0x47BB, 0x7DE8, 0x0E24, 0x7DE9, 0x0607,

+    0x7DEB, 0x3A87, 0x7DEC, 0x0ED7, 0x7DEF, 0x04A2, 0x7DF1, 0x3A88,

+    0x7DF2, 0x17DC, 0x7DF4, 0x0FC5, 0x7DF5, 0x4CD8, 0x7DF6, 0x4CD9,

+    0x7DF9, 0x3A89, 0x7DFB, 0x17DB, 0x7E01, 0x0511, 0x7E04, 0x0CC4,

+    0x7E05, 0x17DE, 0x7E08, 0x3A8A, 0x7E09, 0x17E5, 0x7E0A, 0x17DF,

+    0x7E0B, 0x17E6, 0x7E10, 0x47BF, 0x7E11, 0x3A8B, 0x7E12, 0x17E2,

+    0x7E15, 0x3A8C, 0x7E17, 0x47C0, 0x7E1B, 0x0D31, 0x7E1D, 0x47C1,

+    0x7E1E, 0x08F6, 0x7E1F, 0x17E4, 0x7E20, 0x3A8D, 0x7E21, 0x17E1,

+    0x7E22, 0x17E7, 0x7E23, 0x17E0, 0x7E26, 0x094E, 0x7E27, 0x47C2,

+    0x7E28, 0x4295, 0x7E2B, 0x0E53, 0x7E2C, 0x47C3, 0x7E2E, 0x0956,

+    0x7E2F, 0x4CDA, 0x7E31, 0x17E3, 0x7E32, 0x17EF, 0x7E35, 0x17EB,

+    0x7E36, 0x4CDB, 0x7E37, 0x17EE, 0x7E39, 0x17EC, 0x7E3A, 0x17F0,

+    0x7E3B, 0x17EA, 0x7E3D, 0x17D0, 0x7E3E, 0x0A77, 0x7E41, 0x0D5F,

+    0x7E43, 0x17ED, 0x7E44, 0x4CDC, 0x7E45, 0x47C4, 0x7E46, 0x17E8,

+    0x7E47, 0x3A8E, 0x7E48, 0x3767, 0x7E4A, 0x0AA3, 0x7E4B, 0x0728,

+    0x7E4D, 0x0935, 0x7E52, 0x2194, 0x7E54, 0x09EB, 0x7E55, 0x0AB8,

+    0x7E56, 0x17F3, 0x7E59, 0x17F5, 0x7E5A, 0x17F6, 0x7E5D, 0x17F2,

+    0x7E5E, 0x17F4, 0x7E61, 0x1E11, 0x7E62, 0x3A8F, 0x7E66, 0x17E9,

+    0x7E67, 0x17F1, 0x7E69, 0x17F9, 0x7E6A, 0x17F8, 0x7E6B, 0x1DF7,

+    0x7E6D, 0x0EA8, 0x7E6E, 0x3A90, 0x7E6F, 0x4CDD, 0x7E70, 0x0701,

+    0x7E73, 0x3A91, 0x7E75, 0x47C5, 0x7E78, 0x4CDE, 0x7E79, 0x17F7,

+    0x7E7B, 0x17FB, 0x7E7C, 0x17FA, 0x7E7D, 0x17FE, 0x7E7E, 0x47C6,

+    0x7E7F, 0x1800, 0x7E81, 0x4CDF, 0x7E82, 0x088A, 0x7E83, 0x17FC,

+    0x7E86, 0x47C7, 0x7E87, 0x47C8, 0x7E88, 0x1801, 0x7E89, 0x1802,

+    0x7E8A, 0x20A7, 0x7E8C, 0x1803, 0x7E8D, 0x3A92, 0x7E8E, 0x1809,

+    0x7E8F, 0x0C35, 0x7E90, 0x1805, 0x7E91, 0x3A93, 0x7E92, 0x1804,

+    0x7E93, 0x1806, 0x7E94, 0x1807, 0x7E96, 0x1808, 0x7E98, 0x3A94,

+    0x7E9A, 0x47CA, 0x7E9B, 0x180A, 0x7E9C, 0x180B, 0x7F36, 0x0608,

+    0x7F38, 0x180C, 0x7F3A, 0x180D, 0x7F3B, 0x47CD, 0x7F3C, 0x47CC,

+    0x7F3D, 0x4CE0, 0x7F3E, 0x47CE, 0x7F43, 0x47CF, 0x7F44, 0x3A95,

+    0x7F45, 0x180E, 0x7F47, 0x2195, 0x7F4C, 0x180F, 0x7F4D, 0x1810,

+    0x7F4E, 0x1811, 0x7F4F, 0x3A96, 0x7F50, 0x1812, 0x7F51, 0x1813,

+    0x7F52, 0x3A97, 0x7F53, 0x3A98, 0x7F54, 0x1815, 0x7F55, 0x1814,

+    0x7F58, 0x1816, 0x7F5B, 0x4CE1, 0x7F5D, 0x4CE2, 0x7F5F, 0x1817,

+    0x7F60, 0x1818, 0x7F61, 0x3A99, 0x7F63, 0x47D3, 0x7F64, 0x47D4,

+    0x7F65, 0x4CE3, 0x7F67, 0x181B, 0x7F68, 0x1819, 0x7F69, 0x181A,

+    0x7F6A, 0x0851, 0x7F6B, 0x0729, 0x7F6D, 0x47D5, 0x7F6E, 0x0B94,

+    0x7F70, 0x0D47, 0x7F71, 0x4CE4, 0x7F72, 0x097A, 0x7F75, 0x0D03,

+    0x7F77, 0x0D81, 0x7F78, 0x181C, 0x7F79, 0x1336, 0x7F7D, 0x47D6,

+    0x7F7E, 0x47D7, 0x7F7F, 0x4CE5, 0x7F80, 0x4CE6, 0x7F82, 0x181D,

+    0x7F83, 0x181F, 0x7F85, 0x0F4F, 0x7F86, 0x181E, 0x7F87, 0x1821,

+    0x7F88, 0x1820, 0x7F8A, 0x0F3D, 0x7F8B, 0x4CE7, 0x7F8C, 0x1822,

+    0x7F8E, 0x0D92, 0x7F90, 0x47D8, 0x7F91, 0x3A9A, 0x7F94, 0x1823,

+    0x7F96, 0x47DB, 0x7F97, 0x4296, 0x7F9A, 0x1826, 0x7F9C, 0x47DC,

+    0x7F9D, 0x1825, 0x7F9E, 0x1824, 0x7FA1, 0x2196, 0x7FA2, 0x4CE8,

+    0x7FA3, 0x1827, 0x7FA4, 0x0708, 0x7FA8, 0x0AA4, 0x7FA9, 0x065B,

+    0x7FAD, 0x47DD, 0x7FAE, 0x182B, 0x7FAF, 0x1828, 0x7FB2, 0x1829,

+    0x7FB6, 0x182C, 0x7FB8, 0x182D, 0x7FB9, 0x182A, 0x7FBD, 0x04CB,

+    0x7FBF, 0x3A9B, 0x7FC1, 0x0527, 0x7FC3, 0x47DF, 0x7FC5, 0x182F,

+    0x7FC6, 0x1830, 0x7FCA, 0x1831, 0x7FCC, 0x0F4C, 0x7FCE, 0x3A9C,

+    0x7FCF, 0x47E0, 0x7FD2, 0x0936, 0x7FD4, 0x1833, 0x7FD5, 0x1832,

+    0x7FDB, 0x4297, 0x7FDF, 0x3A9D, 0x7FE0, 0x0A2F, 0x7FE1, 0x1834,

+    0x7FE3, 0x47E1, 0x7FE5, 0x3A9E, 0x7FE6, 0x1835, 0x7FE9, 0x1836,

+    0x7FEB, 0x0621, 0x7FEC, 0x3A9F, 0x7FEE, 0x3AA0, 0x7FEF, 0x3AA1,

+    0x7FF0, 0x0609, 0x7FF2, 0x47E2, 0x7FF3, 0x1837, 0x7FF9, 0x1838,

+    0x7FFA, 0x3AA2, 0x7FFB, 0x0E8B, 0x7FFC, 0x0F4D, 0x7FFD, 0x4CE9,

+    0x7FFE, 0x4CEA, 0x7FFF, 0x4CEB, 0x8000, 0x0F3E, 0x8001, 0x0FDD,

+    0x8002, 0x3713, 0x8003, 0x07DF, 0x8004, 0x183B, 0x8005, 0x0900,

+    0x8006, 0x183A, 0x8007, 0x4CEC, 0x8008, 0x47E4, 0x800A, 0x47E3,

+    0x800B, 0x183C, 0x800C, 0x08D5, 0x800D, 0x4CED, 0x800E, 0x3AA3,

+    0x8010, 0x0B31, 0x8011, 0x3AA4, 0x8012, 0x183D, 0x8014, 0x3AA5,

+    0x8015, 0x07DE, 0x8016, 0x47E5, 0x8017, 0x0EE3, 0x8018, 0x183E,

+    0x8019, 0x183F, 0x801C, 0x1840, 0x801E, 0x4CEE, 0x8021, 0x1841,

+    0x8024, 0x3AA6, 0x8026, 0x3AA7, 0x8028, 0x1842, 0x802C, 0x47E6,

+    0x8030, 0x47E7, 0x8033, 0x08D6, 0x8035, 0x4298, 0x8036, 0x0EF9,

+    0x8037, 0x4299, 0x8039, 0x4CEF, 0x803A, 0x3AA8, 0x803B, 0x1844,

+    0x803C, 0x3AA9, 0x803D, 0x0B7D, 0x803F, 0x1843, 0x8043, 0x47E8,

+    0x8046, 0x1846, 0x804A, 0x1845, 0x8052, 0x1847, 0x8056, 0x0A5F,

+    0x8058, 0x1848, 0x805A, 0x1849, 0x805E, 0x0E09, 0x805F, 0x184A,

+    0x8060, 0x3AAA, 0x8061, 0x0AF1, 0x8062, 0x184B, 0x8066, 0x47E9,

+    0x8068, 0x184C, 0x806F, 0x0FC6, 0x8070, 0x184F, 0x8071, 0x3AAB,

+    0x8072, 0x184E, 0x8073, 0x184D, 0x8074, 0x0BCC, 0x8075, 0x3AAC,

+    0x8076, 0x1850, 0x8077, 0x09EC, 0x8079, 0x1851, 0x807B, 0x47EA,

+    0x807D, 0x1852, 0x807E, 0x0FDE, 0x807F, 0x1853, 0x8084, 0x1854,

+    0x8085, 0x1856, 0x8086, 0x1855, 0x8087, 0x0D39, 0x8088, 0x4CF0,

+    0x8089, 0x0CD1, 0x808B, 0x0FE4, 0x808C, 0x0D3D, 0x808E, 0x4CF1,

+    0x8093, 0x1858, 0x8096, 0x09BB, 0x8098, 0x0D9C, 0x8099, 0x47EB,

+    0x809A, 0x1859, 0x809B, 0x1857, 0x809C, 0x47EC, 0x809D, 0x060A,

+    0x809E, 0x3AAD, 0x80A1, 0x0788, 0x80A2, 0x08B6, 0x80A4, 0x47ED,

+    0x80A5, 0x0D82, 0x80A6, 0x3AAE, 0x80A7, 0x47EE, 0x80A9, 0x075E,

+    0x80AA, 0x0E71, 0x80AB, 0x3AAF, 0x80AC, 0x185C, 0x80AD, 0x185A,

+    0x80AF, 0x07E0, 0x80B1, 0x07E1, 0x80B2, 0x04AD, 0x80B4, 0x0858,

+    0x80B8, 0x47EF, 0x80BA, 0x0D0F, 0x80C3, 0x04A3, 0x80C4, 0x1861,

+    0x80C5, 0x47F1, 0x80C6, 0x0B7E, 0x80CA, 0x429A, 0x80CC, 0x0D0E,

+    0x80CE, 0x0B3B, 0x80CF, 0x4CF2, 0x80D4, 0x4CF3, 0x80D5, 0x47F2,

+    0x80D6, 0x1863, 0x80D7, 0x3AB0, 0x80D8, 0x3AB1, 0x80D9, 0x185F,

+    0x80DA, 0x1862, 0x80DB, 0x185D, 0x80DD, 0x1860, 0x80DE, 0x0E54,

+    0x80E0, 0x429B, 0x80E1, 0x0789, 0x80E4, 0x04C1, 0x80E5, 0x185E,

+    0x80E6, 0x47F3, 0x80ED, 0x4CF4, 0x80EF, 0x1865, 0x80F0, 0x4CF5,

+    0x80F1, 0x1866, 0x80F3, 0x429C, 0x80F4, 0x0C91, 0x80F5, 0x47F5,

+    0x80F7, 0x4CF6, 0x80F8, 0x06B3, 0x80FA, 0x4CF7, 0x80FB, 0x47F6,

+    0x80FC, 0x1871, 0x80FD, 0x0CF3, 0x80FE, 0x4CF8, 0x8102, 0x08B7,

+    0x8103, 0x4CF9, 0x8105, 0x06B4, 0x8106, 0x0A6C, 0x8107, 0x0FEC,

+    0x8108, 0x0EBA, 0x8109, 0x1864, 0x810A, 0x0A78, 0x810D, 0x47F4,

+    0x8116, 0x3AB2, 0x8117, 0x4CFA, 0x8118, 0x3AB3, 0x811A, 0x066D,

+    0x811B, 0x1867, 0x811E, 0x47F9, 0x8123, 0x1869, 0x8124, 0x47FB,

+    0x8127, 0x47FC, 0x8129, 0x1868, 0x812B, 0x3659, 0x812C, 0x47FD,

+    0x812F, 0x186A, 0x8130, 0x4CFB, 0x8131, 0x0B64, 0x8133, 0x0CF4,

+    0x8135, 0x47F8, 0x8139, 0x0BCD, 0x813A, 0x3AB4, 0x813D, 0x47FF,

+    0x813E, 0x186E, 0x8141, 0x3772, 0x8146, 0x186D, 0x814A, 0x3AB5,

+    0x814B, 0x186B, 0x814C, 0x3AB6, 0x814E, 0x0A1B, 0x8150, 0x0DD7,

+    0x8151, 0x1870, 0x8153, 0x186F, 0x8154, 0x07E2, 0x8155, 0x0FF9,

+    0x8157, 0x4CFC, 0x815F, 0x1880, 0x8160, 0x429D, 0x8165, 0x1874,

+    0x8166, 0x1875, 0x8167, 0x429E, 0x8168, 0x429F, 0x8169, 0x4801,

+    0x816B, 0x091C, 0x816D, 0x42A0, 0x816E, 0x1873, 0x816F, 0x4CFD,

+    0x8170, 0x080A, 0x8171, 0x1872, 0x8173, 0x4CFE, 0x8174, 0x1876,

+    0x8178, 0x0BCE, 0x8179, 0x0DF2, 0x817A, 0x0AA5, 0x817F, 0x0B3C,

+    0x8180, 0x187A, 0x8181, 0x3AB7, 0x8182, 0x187B, 0x8183, 0x1877,

+    0x8184, 0x3AB8, 0x8185, 0x4804, 0x8188, 0x1878, 0x818A, 0x1879,

+    0x818B, 0x4CFF, 0x818F, 0x07E3, 0x8190, 0x4D00, 0x8193, 0x1881,

+    0x8195, 0x187D, 0x8198, 0x4806, 0x819A, 0x0DD8, 0x819B, 0x4D01,

+    0x819C, 0x0E9A, 0x819D, 0x0D9A, 0x819E, 0x4D02, 0x81A0, 0x187C,

+    0x81A3, 0x187F, 0x81A4, 0x187E, 0x81A8, 0x0E72, 0x81A9, 0x1882,

+    0x81B0, 0x1883, 0x81B2, 0x4807, 0x81B3, 0x0AB9, 0x81B4, 0x3AB9,

+    0x81B5, 0x1884, 0x81B8, 0x1886, 0x81BA, 0x188A, 0x81BB, 0x42A1,

+    0x81BD, 0x1887, 0x81BE, 0x1885, 0x81BF, 0x0CF5, 0x81C0, 0x1888,

+    0x81C1, 0x4808, 0x81C2, 0x1889, 0x81C3, 0x4809, 0x81C6, 0x0532,

+    0x81C8, 0x1890, 0x81C9, 0x188B, 0x81CA, 0x42A2, 0x81CB, 0x4D03,

+    0x81CD, 0x188C, 0x81CF, 0x3ABA, 0x81D1, 0x188D, 0x81D3, 0x0B01,

+    0x81D5, 0x4D04, 0x81D6, 0x480A, 0x81D7, 0x42A3, 0x81D8, 0x188F,

+    0x81D9, 0x188E, 0x81DA, 0x1891, 0x81DB, 0x480B, 0x81DD, 0x4D05,

+    0x81DE, 0x4D06, 0x81DF, 0x1892, 0x81E0, 0x1893, 0x81E1, 0x4D07,

+    0x81E3, 0x0A09, 0x81E4, 0x480D, 0x81E5, 0x0569, 0x81E7, 0x1894,

+    0x81E8, 0x0F9F, 0x81EA, 0x08D7, 0x81EC, 0x480F, 0x81ED, 0x0937,

+    0x81EF, 0x4D08, 0x81F3, 0x08B8, 0x81F4, 0x0B95, 0x81F6, 0x4D09,

+    0x81F9, 0x3ABB, 0x81FA, 0x1895, 0x81FB, 0x1896, 0x81FC, 0x04D3,

+    0x81FD, 0x4810, 0x81FE, 0x1897, 0x81FF, 0x4811, 0x8200, 0x4D0A,

+    0x8201, 0x1898, 0x8202, 0x1899, 0x8203, 0x3ABC, 0x8204, 0x4813,

+    0x8205, 0x189A, 0x8207, 0x189B, 0x8208, 0x06B5, 0x8209, 0x13AF,

+    0x820A, 0x189C, 0x820B, 0x4D0B, 0x820C, 0x0A89, 0x820D, 0x189D,

+    0x820E, 0x08F7, 0x8210, 0x189E, 0x8212, 0x1009, 0x8213, 0x4D0C,

+    0x8214, 0x4D0D, 0x8216, 0x189F, 0x8217, 0x0E2E, 0x8218, 0x0618,

+    0x8219, 0x4815, 0x821A, 0x4D0E, 0x821B, 0x0AA6, 0x821C, 0x0962,

+    0x821E, 0x0DE3, 0x821F, 0x0938, 0x8221, 0x3ABD, 0x8222, 0x4816,

+    0x8229, 0x18A0, 0x822A, 0x07E4, 0x822B, 0x18A1, 0x822C, 0x0D60,

+    0x822E, 0x18AF, 0x8232, 0x3ABE, 0x8233, 0x18A3, 0x8234, 0x3ABF,

+    0x8235, 0x0B29, 0x8236, 0x0D2B, 0x8237, 0x0773, 0x8238, 0x18A2,

+    0x8239, 0x0AA7, 0x823A, 0x4D0F, 0x823C, 0x4818, 0x8240, 0x18A4,

+    0x8244, 0x4D10, 0x8245, 0x481A, 0x8246, 0x3AC0, 0x8247, 0x0C16,

+    0x8249, 0x4819, 0x824B, 0x3AC1, 0x824F, 0x3AC2, 0x8257, 0x481E,

+    0x8258, 0x18A6, 0x8259, 0x18A5, 0x825A, 0x18A8, 0x825C, 0x4820,

+    0x825D, 0x18A7, 0x825F, 0x18A9, 0x8260, 0x42A5, 0x8262, 0x18AB,

+    0x8263, 0x4821, 0x8264, 0x18AA, 0x8266, 0x060B, 0x8268, 0x18AC,

+    0x826A, 0x18AD, 0x826B, 0x18AE, 0x826D, 0x4D11, 0x826E, 0x0821,

+    0x826F, 0x0F91, 0x8271, 0x18B0, 0x8272, 0x09ED, 0x8274, 0x42A6,

+    0x8276, 0x0512, 0x8277, 0x18B1, 0x8278, 0x18B2, 0x8279, 0x3775,

+    0x827D, 0x4824, 0x827E, 0x18B3, 0x827F, 0x4825, 0x8283, 0x4826,

+    0x8284, 0x4D12, 0x8289, 0x4D13, 0x828A, 0x4827, 0x828B, 0x04B6,

+    0x828D, 0x18B4, 0x828E, 0x3AC3, 0x8291, 0x4D14, 0x8292, 0x18B5,

+    0x8293, 0x4828, 0x8299, 0x0DD9, 0x829D, 0x08F3, 0x829F, 0x18B7,

+    0x82A1, 0x42A8, 0x82A3, 0x42A9, 0x82A4, 0x42AA, 0x82A5, 0x0587,

+    0x82A6, 0x0476, 0x82A7, 0x4829, 0x82A8, 0x482A, 0x82A9, 0x42AB,

+    0x82AA, 0x4D15, 0x82AB, 0x18B6, 0x82AC, 0x18B9, 0x82AD, 0x0D04,

+    0x82AE, 0x3AC4, 0x82AF, 0x0A0A, 0x82B0, 0x4D16, 0x82B1, 0x0556,

+    0x82B2, 0x482B, 0x82B3, 0x0E55, 0x82B4, 0x482C, 0x82B7, 0x3AC5,

+    0x82B8, 0x0733, 0x82B9, 0x06D4, 0x82BA, 0x482D, 0x82BB, 0x18B8,

+    0x82BC, 0x482E, 0x82BD, 0x056A, 0x82BE, 0x3AC6, 0x82BF, 0x42AC,

+    0x82C5, 0x05DF, 0x82C6, 0x3AC7, 0x82D0, 0x4D17, 0x82D1, 0x0513,

+    0x82D2, 0x18BD, 0x82D3, 0x0FB2, 0x82D4, 0x0B3D, 0x82D5, 0x42AD,

+    0x82D7, 0x0DB6, 0x82D9, 0x18C9, 0x82DB, 0x0557, 0x82DC, 0x18C7,

+    0x82DE, 0x18C5, 0x82DF, 0x18BC, 0x82E1, 0x18BA, 0x82E2, 0x482F,

+    0x82E3, 0x18BB, 0x82E5, 0x090F, 0x82E6, 0x06E4, 0x82E7, 0x0BB5,

+    0x82E8, 0x4830, 0x82EA, 0x4D18, 0x82EB, 0x0CA9, 0x82EF, 0x4D19,

+    0x82F1, 0x04F3, 0x82F3, 0x18BF, 0x82F4, 0x18BE, 0x82F6, 0x4D1A,

+    0x82F7, 0x4831, 0x82F9, 0x18C4, 0x82FA, 0x18C0, 0x82FB, 0x18C3,

+    0x82FD, 0x42AE, 0x82FE, 0x3AC8, 0x8300, 0x42AF, 0x8301, 0x2198,

+    0x8302, 0x0EDC, 0x8303, 0x18C2, 0x8304, 0x0558, 0x8305, 0x05DB,

+    0x8306, 0x18C6, 0x8307, 0x4832, 0x8308, 0x4833, 0x8309, 0x18C8,

+    0x830C, 0x4834, 0x830E, 0x072A, 0x8316, 0x18CC, 0x8317, 0x18D5,

+    0x8318, 0x18D6, 0x831B, 0x4836, 0x831C, 0x046F, 0x831D, 0x4837,

+    0x8322, 0x42B0, 0x8323, 0x18DD, 0x8328, 0x04B5, 0x832B, 0x18D4,

+    0x832D, 0x42B1, 0x832F, 0x18D3, 0x8330, 0x4838, 0x8331, 0x18CE,

+    0x8332, 0x18CD, 0x8334, 0x18CB, 0x8335, 0x18CA, 0x8336, 0x0BA1,

+    0x8338, 0x0B5B, 0x8339, 0x18D0, 0x833A, 0x42B2, 0x833C, 0x4839,

+    0x8340, 0x18CF, 0x8343, 0x3AC9, 0x8344, 0x483A, 0x8345, 0x18D2,

+    0x8346, 0x1DF8, 0x8347, 0x42B3, 0x8349, 0x0AF2, 0x834A, 0x072B,

+    0x834F, 0x04E3, 0x8350, 0x18D1, 0x8351, 0x3ACA, 0x8352, 0x07E5,

+    0x8354, 0x4835, 0x8355, 0x3ACB, 0x8356, 0x4D1B, 0x8357, 0x483B,

+    0x8358, 0x0AF3, 0x835A, 0x377A, 0x8362, 0x2199, 0x8363, 0x456F,

+    0x8373, 0x18E3, 0x8375, 0x18E4, 0x8377, 0x0559, 0x8378, 0x4D1C,

+    0x837B, 0x052E, 0x837C, 0x18E1, 0x837D, 0x42B4, 0x837F, 0x219A,

+    0x8385, 0x18D7, 0x8386, 0x3ACC, 0x8387, 0x18DF, 0x8389, 0x18E6,

+    0x838A, 0x18E0, 0x838D, 0x3ACD, 0x838E, 0x18DE, 0x8392, 0x3ACE,

+    0x8393, 0x18C1, 0x8394, 0x483F, 0x8395, 0x4840, 0x8396, 0x18DC,

+    0x8398, 0x3ACF, 0x839A, 0x18D8, 0x839B, 0x4841, 0x839D, 0x4842,

+    0x839E, 0x060C, 0x839F, 0x18DA, 0x83A0, 0x18E5, 0x83A2, 0x18DB,

+    0x83A7, 0x42B5, 0x83A8, 0x18E7, 0x83A9, 0x3AD0, 0x83AA, 0x18D9,

+    0x83AB, 0x0D32, 0x83B1, 0x0F53, 0x83B5, 0x18E2, 0x83BD, 0x18F8,

+    0x83BF, 0x3AD1, 0x83C0, 0x3AD2, 0x83C1, 0x18F0, 0x83C5, 0x0A41,

+    0x83C7, 0x219B, 0x83C9, 0x4843, 0x83CA, 0x0660, 0x83CC, 0x06D5,

+    0x83CE, 0x18EB, 0x83CF, 0x42B6, 0x83D0, 0x4844, 0x83D1, 0x42B7,

+    0x83D3, 0x055B, 0x83D4, 0x4845, 0x83D6, 0x09BC, 0x83D8, 0x18EE,

+    0x83DC, 0x084A, 0x83DD, 0x4846, 0x83DF, 0x0C4B, 0x83E0, 0x18F3,

+    0x83E1, 0x42B8, 0x83E5, 0x4847, 0x83E9, 0x0E3E, 0x83EA, 0x3AD3,

+    0x83EB, 0x18EA, 0x83EF, 0x055A, 0x83F0, 0x078A, 0x83F1, 0x0D9B,

+    0x83F2, 0x18F4, 0x83F4, 0x18E8, 0x83F6, 0x219C, 0x83F7, 0x18F1,

+    0x83F8, 0x4D1D, 0x83F9, 0x4848, 0x83FB, 0x18FB, 0x83FC, 0x4D1E,

+    0x83FD, 0x18EC, 0x8401, 0x42B9, 0x8403, 0x18ED, 0x8404, 0x0C92,

+    0x8406, 0x42BA, 0x8407, 0x18F2, 0x840A, 0x1E7F, 0x840B, 0x18EF,

+    0x840C, 0x0E56, 0x840D, 0x18F5, 0x840E, 0x04A4, 0x840F, 0x3AD4,

+    0x8411, 0x3AD5, 0x8413, 0x18E9, 0x8415, 0x4849, 0x8417, 0x484B,

+    0x8420, 0x18F7, 0x8422, 0x18F6, 0x8429, 0x0D21, 0x842A, 0x18FD,

+    0x842C, 0x1908, 0x8431, 0x05DC, 0x8435, 0x190B, 0x8438, 0x18F9,

+    0x8439, 0x484C, 0x843C, 0x18FE, 0x843D, 0x0F58, 0x8446, 0x1907,

+    0x8448, 0x219D, 0x8449, 0x0F3F, 0x844A, 0x3AD6, 0x844E, 0x0F72,

+    0x844F, 0x484D, 0x8451, 0x484E, 0x8452, 0x484F, 0x8457, 0x0BB6,

+    0x8458, 0x4D1F, 0x8459, 0x4850, 0x845A, 0x4851, 0x845B, 0x05C9,

+    0x845C, 0x4852, 0x845F, 0x42BB, 0x8461, 0x0DE4, 0x8462, 0x190D,

+    0x8463, 0x0C79, 0x8465, 0x4854, 0x8466, 0x0475, 0x8469, 0x1906,

+    0x846B, 0x1902, 0x846C, 0x0AF4, 0x846D, 0x18FC, 0x846E, 0x1904,

+    0x846F, 0x1909, 0x8470, 0x42BC, 0x8471, 0x0CE2, 0x8473, 0x42BD,

+    0x8475, 0x046E, 0x8476, 0x3AD7, 0x8477, 0x1901, 0x8478, 0x4855,

+    0x8479, 0x190A, 0x847A, 0x0DEA, 0x847C, 0x4856, 0x8481, 0x4857,

+    0x8482, 0x1905, 0x8484, 0x1900, 0x8485, 0x42BE, 0x848B, 0x09BD,

+    0x8490, 0x0939, 0x8493, 0x4D20, 0x8494, 0x08D8, 0x8497, 0x4859,

+    0x8499, 0x0EE4, 0x849C, 0x0DB9, 0x849E, 0x42BF, 0x849F, 0x1910,

+    0x84A1, 0x1919, 0x84A6, 0x485A, 0x84A8, 0x3AD8, 0x84AD, 0x1903,

+    0x84AF, 0x3AD9, 0x84B1, 0x4D21, 0x84B2, 0x05D5, 0x84B4, 0x219E,

+    0x84B8, 0x09E0, 0x84B9, 0x190E, 0x84BA, 0x42C0, 0x84BB, 0x1913,

+    0x84BC, 0x0AF5, 0x84BD, 0x4D22, 0x84BE, 0x485B, 0x84BF, 0x190F,

+    0x84C0, 0x3ADA, 0x84C1, 0x1916, 0x84C2, 0x3ADB, 0x84C4, 0x0B9D,

+    0x84C6, 0x1917, 0x84C9, 0x0F40, 0x84CA, 0x190C, 0x84CB, 0x0596,

+    0x84CD, 0x1912, 0x84CE, 0x485D, 0x84CF, 0x485E, 0x84D0, 0x1915,

+    0x84D1, 0x0EB8, 0x84D3, 0x485F, 0x84D6, 0x1918, 0x84D9, 0x1911,

+    0x84DA, 0x1914, 0x84DC, 0x20AB, 0x84E7, 0x4861, 0x84EA, 0x4862,

+    0x84EC, 0x0E57, 0x84EE, 0x0FC7, 0x84EF, 0x4863, 0x84F0, 0x3ADC,

+    0x84F1, 0x4864, 0x84F4, 0x191C, 0x84FA, 0x4865, 0x84FB, 0x4D23,

+    0x84FC, 0x1923, 0x84FD, 0x3ADD, 0x84FF, 0x191B, 0x8500, 0x08EF,

+    0x8506, 0x18FA, 0x850C, 0x3ADE, 0x8511, 0x0E1E, 0x8513, 0x0EAE,

+    0x8514, 0x1922, 0x8515, 0x1921, 0x8517, 0x191D, 0x8518, 0x191E,

+    0x851A, 0x04D8, 0x851B, 0x4866, 0x851E, 0x42C3, 0x851F, 0x1920,

+    0x8521, 0x191A, 0x8523, 0x1E1A, 0x8524, 0x4867, 0x8525, 0x4868,

+    0x8526, 0x0BF1, 0x852B, 0x4869, 0x852C, 0x191F, 0x852D, 0x04C2,

+    0x852F, 0x42C4, 0x8532, 0x42C2, 0x8534, 0x3ADF, 0x8535, 0x0B02,

+    0x853D, 0x0E13, 0x853E, 0x1EB5, 0x8540, 0x1924, 0x8541, 0x1928,

+    0x8543, 0x0D6D, 0x8546, 0x4D24, 0x8548, 0x1927, 0x8549, 0x09BE,

+    0x854A, 0x08F5, 0x854B, 0x192A, 0x854E, 0x06B6, 0x854F, 0x486A,

+    0x8551, 0x486D, 0x8553, 0x219F, 0x8555, 0x192B, 0x8556, 0x4D25,

+    0x8557, 0x0DEB, 0x8558, 0x1926, 0x8559, 0x21A0, 0x855A, 0x18FF,

+    0x855D, 0x4D26, 0x855E, 0x3AE0, 0x8561, 0x486E, 0x8562, 0x486F,

+    0x8563, 0x1925, 0x8564, 0x42C5, 0x8568, 0x0FF5, 0x8569, 0x0C7A,

+    0x856A, 0x0DE5, 0x856B, 0x21A1, 0x856D, 0x1932, 0x856F, 0x486B,

+    0x8577, 0x1938, 0x857A, 0x42C6, 0x857B, 0x4871, 0x857D, 0x4872,

+    0x857E, 0x1939, 0x857F, 0x4873, 0x8580, 0x192C, 0x8581, 0x4874,

+    0x8584, 0x0D2C, 0x8585, 0x4D27, 0x8586, 0x4875, 0x8587, 0x1936,

+    0x8588, 0x192E, 0x858A, 0x1930, 0x858C, 0x42C7, 0x858F, 0x3AE1,

+    0x8590, 0x193A, 0x8591, 0x192F, 0x8593, 0x4876, 0x8594, 0x1933,

+    0x8597, 0x0514, 0x8598, 0x4D28, 0x8599, 0x0CBD, 0x859B, 0x1934,

+    0x859C, 0x1937, 0x859D, 0x4877, 0x859F, 0x4878, 0x85A2, 0x42C8,

+    0x85A4, 0x192D, 0x85A6, 0x0AA8, 0x85A8, 0x1931, 0x85A9, 0x0875,

+    0x85AA, 0x0A0B, 0x85AB, 0x0706, 0x85AC, 0x0F00, 0x85AD, 0x3AE4,

+    0x85AE, 0x0F05, 0x85AF, 0x097C, 0x85B0, 0x21A3, 0x85B7, 0x3AE2,

+    0x85B9, 0x193E, 0x85BA, 0x193C, 0x85BC, 0x487C, 0x85C1, 0x0FF4,

+    0x85C7, 0x487D, 0x85C9, 0x193B, 0x85CA, 0x487E, 0x85CB, 0x42C9,

+    0x85CD, 0x0F5F, 0x85CE, 0x3AE3, 0x85CF, 0x193D, 0x85D0, 0x193F,

+    0x85D5, 0x1940, 0x85D8, 0x487F, 0x85D9, 0x4880, 0x85DC, 0x1943,

+    0x85DD, 0x1941, 0x85DF, 0x4881, 0x85E1, 0x4882, 0x85E4, 0x0C7B,

+    0x85E5, 0x1942, 0x85E6, 0x4883, 0x85E9, 0x0D61, 0x85EA, 0x1935,

+    0x85ED, 0x42CA, 0x85F4, 0x3780, 0x85F6, 0x4884, 0x85F7, 0x097D,

+    0x85F9, 0x1944, 0x85FA, 0x1949, 0x85FB, 0x0AF6, 0x85FE, 0x1948,

+    0x85FF, 0x42CB, 0x8600, 0x4885, 0x8602, 0x1929, 0x8604, 0x42CC,

+    0x8605, 0x42CD, 0x8606, 0x194A, 0x8607, 0x0ACB, 0x860A, 0x1945,

+    0x860B, 0x1947, 0x8610, 0x42CE, 0x8611, 0x4886, 0x8612, 0x3AE5,

+    0x8613, 0x1946, 0x8616, 0x14D0, 0x8617, 0x14C1, 0x8618, 0x42D0,

+    0x861A, 0x194C, 0x861E, 0x4887, 0x8621, 0x4888, 0x8622, 0x194B,

+    0x8624, 0x4889, 0x8627, 0x488A, 0x8629, 0x3AE6, 0x862D, 0x0F60,

+    0x862F, 0x16B1, 0x8630, 0x194D, 0x8638, 0x42D1, 0x8639, 0x488C,

+    0x863C, 0x488D, 0x863F, 0x194E, 0x8640, 0x488F, 0x8641, 0x41B8,

+    0x8642, 0x4D29, 0x8646, 0x4D2A, 0x864D, 0x194F, 0x864E, 0x078B,

+    0x8650, 0x066E, 0x8652, 0x3AE7, 0x8653, 0x4890, 0x8654, 0x1951,

+    0x8655, 0x1094, 0x8656, 0x4891, 0x8657, 0x42D2, 0x865A, 0x068F,

+    0x865B, 0x3418, 0x865C, 0x0F82, 0x865E, 0x06EB, 0x865F, 0x1952,

+    0x8662, 0x42D3, 0x8663, 0x3AE8, 0x8667, 0x1953, 0x866B, 0x0BAC,

+    0x866C, 0x3AE9, 0x866F, 0x3AEA, 0x8671, 0x1954, 0x8675, 0x42D5,

+    0x8677, 0x4892, 0x8679, 0x0CD2, 0x867A, 0x3AEB, 0x867B, 0x047E,

+    0x867D, 0x3786, 0x8687, 0x4893, 0x8689, 0x4894, 0x868A, 0x0563,

+    0x868B, 0x1959, 0x868C, 0x195A, 0x868D, 0x3AEC, 0x8691, 0x3AED,

+    0x8693, 0x1955, 0x8695, 0x088B, 0x8698, 0x3AEE, 0x869C, 0x4895,

+    0x869D, 0x4896, 0x86A3, 0x1956, 0x86A4, 0x0CF8, 0x86A7, 0x3AEF,

+    0x86A8, 0x3AF0, 0x86A9, 0x1957, 0x86AA, 0x1958, 0x86AB, 0x1962,

+    0x86AF, 0x195C, 0x86B0, 0x195F, 0x86B1, 0x4897, 0x86B3, 0x4898,

+    0x86B6, 0x195B, 0x86B8, 0x42D6, 0x86C0, 0x4D2B, 0x86C1, 0x4899,

+    0x86C3, 0x489A, 0x86C4, 0x195D, 0x86C6, 0x195E, 0x86C7, 0x0904,

+    0x86C9, 0x1960, 0x86CB, 0x0B7F, 0x86CD, 0x072C, 0x86CE, 0x05A0,

+    0x86D1, 0x489B, 0x86D4, 0x1963, 0x86D5, 0x489C, 0x86D7, 0x489D,

+    0x86D9, 0x059D, 0x86DB, 0x1968, 0x86DE, 0x1964, 0x86DF, 0x1967,

+    0x86E3, 0x489E, 0x86E4, 0x0D4E, 0x86E6, 0x489F, 0x86E9, 0x1965,

+    0x86EC, 0x1966, 0x86ED, 0x0DBA, 0x86EE, 0x0D6E, 0x86EF, 0x1969,

+    0x86F8, 0x0B5D, 0x86F9, 0x1973, 0x86FA, 0x3AF1, 0x86FB, 0x196F,

+    0x86FC, 0x42D7, 0x86FD, 0x3AF2, 0x86FE, 0x056B, 0x8700, 0x196D,

+    0x8702, 0x0E58, 0x8703, 0x196E, 0x8705, 0x48A1, 0x8706, 0x196B,

+    0x8707, 0x48A2, 0x8708, 0x196C, 0x8709, 0x1971, 0x870A, 0x1974,

+    0x870B, 0x3AF3, 0x870D, 0x1972, 0x870E, 0x48A3, 0x8710, 0x48A4,

+    0x8711, 0x1970, 0x8712, 0x196A, 0x8713, 0x3AF4, 0x8714, 0x4D2C,

+    0x8718, 0x0B96, 0x8719, 0x3AF5, 0x871A, 0x197B, 0x871C, 0x0EB6,

+    0x871E, 0x3AF6, 0x871F, 0x48A5, 0x8721, 0x48A6, 0x8722, 0x4D2D,

+    0x8723, 0x48A7, 0x8725, 0x1979, 0x8728, 0x3AF7, 0x8729, 0x197A,

+    0x872E, 0x4D2E, 0x8731, 0x48A8, 0x8734, 0x1975, 0x8737, 0x1977,

+    0x8739, 0x4D2F, 0x873A, 0x48A9, 0x873B, 0x1978, 0x873E, 0x3AF8,

+    0x873F, 0x1976, 0x8740, 0x48AA, 0x8743, 0x48AB, 0x8749, 0x0A8A,

+    0x874B, 0x0FDF, 0x874C, 0x197F, 0x874E, 0x1980, 0x8751, 0x48AC,

+    0x8753, 0x1986, 0x8755, 0x09F0, 0x8757, 0x1982, 0x8758, 0x48AD,

+    0x8759, 0x1985, 0x875D, 0x4D30, 0x875F, 0x197D, 0x8760, 0x197C,

+    0x8763, 0x1987, 0x8764, 0x48AE, 0x8765, 0x48AF, 0x8766, 0x055C,

+    0x8768, 0x1983, 0x876A, 0x1988, 0x876E, 0x1984, 0x8771, 0x3AF9,

+    0x8772, 0x48B0, 0x8774, 0x1981, 0x8776, 0x0BCF, 0x8778, 0x197E,

+    0x877B, 0x4D31, 0x877C, 0x48B1, 0x877F, 0x0D1E, 0x8782, 0x198C,

+    0x8787, 0x42D8, 0x8788, 0x3AFA, 0x8789, 0x48B5, 0x878B, 0x48B6,

+    0x878C, 0x4D32, 0x878D, 0x0F25, 0x878E, 0x4D33, 0x8793, 0x48B7,

+    0x8797, 0x4D34, 0x8798, 0x4D35, 0x8799, 0x3AFB, 0x879E, 0x4D36,

+    0x879F, 0x198B, 0x87A0, 0x48B8, 0x87A2, 0x198A, 0x87A3, 0x4D37,

+    0x87A7, 0x48B4, 0x87AB, 0x1993, 0x87AC, 0x3AFC, 0x87AD, 0x3AFD,

+    0x87AE, 0x4D38, 0x87AF, 0x198D, 0x87B3, 0x1995, 0x87B5, 0x3AFE,

+    0x87BA, 0x0F50, 0x87BB, 0x1998, 0x87BD, 0x198F, 0x87BE, 0x48BB,

+    0x87BF, 0x4D39, 0x87C0, 0x1990, 0x87C1, 0x48BD, 0x87C4, 0x1994,

+    0x87C6, 0x1997, 0x87C7, 0x1996, 0x87C9, 0x4D3A, 0x87CB, 0x198E,

+    0x87CE, 0x48BE, 0x87D0, 0x1991, 0x87D2, 0x19A2, 0x87D6, 0x3AFF,

+    0x87DA, 0x4D3B, 0x87DF, 0x48BF, 0x87E0, 0x199B, 0x87E3, 0x48C1,

+    0x87E5, 0x48C2, 0x87E6, 0x48C3, 0x87EA, 0x48C4, 0x87EB, 0x3B00,

+    0x87EC, 0x1E23, 0x87ED, 0x3B01, 0x87EF, 0x1999, 0x87F2, 0x199A,

+    0x87F5, 0x3C3D, 0x87F6, 0x199F, 0x87F7, 0x19A0, 0x87F9, 0x0588,

+    0x87FB, 0x065C, 0x87FE, 0x199E, 0x8801, 0x3B02, 0x8803, 0x4F58,

+    0x8805, 0x1989, 0x8806, 0x3B04, 0x8807, 0x21A6, 0x880A, 0x42DA,

+    0x880B, 0x3B05, 0x880D, 0x199D, 0x880E, 0x19A1, 0x880F, 0x199C,

+    0x8810, 0x42DB, 0x8811, 0x19A3, 0x8813, 0x48C5, 0x8814, 0x3B06,

+    0x8815, 0x19A5, 0x8816, 0x19A4, 0x8818, 0x4D3C, 0x881B, 0x4D3D,

+    0x881C, 0x3B07, 0x881F, 0x1E85, 0x8821, 0x19A7, 0x8822, 0x19A6,

+    0x8823, 0x1961, 0x8827, 0x19AB, 0x8828, 0x48C6, 0x882D, 0x4D3E,

+    0x882E, 0x48C7, 0x8831, 0x19A8, 0x8832, 0x48C8, 0x8836, 0x19A9,

+    0x8839, 0x19AA, 0x883A, 0x4D3F, 0x883B, 0x19AC, 0x883C, 0x48C9,

+    0x8840, 0x0742, 0x8842, 0x19AE, 0x8844, 0x19AD, 0x8845, 0x4D40,

+    0x8846, 0x093A, 0x884A, 0x48CB, 0x884B, 0x4D41, 0x884C, 0x07E6,

+    0x884D, 0x1524, 0x884E, 0x4D42, 0x8852, 0x19AF, 0x8853, 0x095B,

+    0x8855, 0x4D43, 0x8856, 0x3B08, 0x8857, 0x0597, 0x8858, 0x48CC,

+    0x8859, 0x19B0, 0x885A, 0x4D44, 0x885B, 0x04F4, 0x885D, 0x09BF,

+    0x885E, 0x19B1, 0x885F, 0x3B09, 0x8861, 0x07E7, 0x8862, 0x19B2,

+    0x8863, 0x04A5, 0x8864, 0x3B0A, 0x8868, 0x0DAF, 0x8869, 0x48CF,

+    0x886B, 0x19B3, 0x886E, 0x4D45, 0x886F, 0x48D1, 0x8870, 0x0A30,

+    0x8872, 0x19BA, 0x8875, 0x19B7, 0x8877, 0x0BAD, 0x887D, 0x19B8,

+    0x887E, 0x19B5, 0x887F, 0x06D6, 0x8881, 0x19B4, 0x8882, 0x19BB,

+    0x8888, 0x070C, 0x888B, 0x0B3E, 0x888D, 0x19C1, 0x8892, 0x19BD,

+    0x8896, 0x0B15, 0x8897, 0x19BC, 0x8898, 0x3B0B, 0x8899, 0x19BF,

+    0x889A, 0x4D46, 0x889B, 0x4D47, 0x889C, 0x4D48, 0x889E, 0x19B6,

+    0x88A0, 0x48D2, 0x88A2, 0x19C0, 0x88A4, 0x19C2, 0x88AA, 0x3B0C,

+    0x88AB, 0x0D83, 0x88AE, 0x19BE, 0x88B0, 0x19C3, 0x88B1, 0x19C5,

+    0x88B4, 0x0787, 0x88B5, 0x19B9, 0x88B7, 0x0485, 0x88BC, 0x48D3,

+    0x88BD, 0x3B0D, 0x88BE, 0x3B0E, 0x88BF, 0x19C4, 0x88C0, 0x48D4,

+    0x88C1, 0x084B, 0x88C2, 0x0FBE, 0x88C3, 0x19C6, 0x88C4, 0x19C7,

+    0x88C5, 0x0AF7, 0x88C6, 0x3789, 0x88CA, 0x3B0F, 0x88CD, 0x4D49,

+    0x88CE, 0x42DC, 0x88CF, 0x0F6A, 0x88D1, 0x48D6, 0x88D2, 0x3B10,

+    0x88D3, 0x48D7, 0x88D4, 0x19C8, 0x88D5, 0x0F1F, 0x88D8, 0x19C9,

+    0x88D9, 0x19CA, 0x88DB, 0x3B11, 0x88DC, 0x0E34, 0x88DD, 0x19CB,

+    0x88DF, 0x0830, 0x88E0, 0x4D4A, 0x88E1, 0x0F6B, 0x88E8, 0x19D0,

+    0x88EF, 0x4D4B, 0x88F0, 0x3B12, 0x88F1, 0x3B13, 0x88F2, 0x19D1,

+    0x88F3, 0x09C0, 0x88F4, 0x19CF, 0x88F5, 0x21A7, 0x88F8, 0x0F51,

+    0x88F9, 0x19CC, 0x88FC, 0x19CE, 0x88FD, 0x0A61, 0x88FE, 0x0A44,

+    0x8901, 0x48D9, 0x8902, 0x19CD, 0x8904, 0x19D2, 0x8906, 0x3B14,

+    0x8907, 0x0DF3, 0x890A, 0x19D4, 0x890C, 0x19D3, 0x890E, 0x4D4C,

+    0x890F, 0x4D4D, 0x8910, 0x05CA, 0x8912, 0x0E59, 0x8913, 0x19D5,

+    0x8918, 0x3B15, 0x8919, 0x3B16, 0x891A, 0x3B17, 0x891C, 0x20A8,

+    0x891D, 0x19E1, 0x891E, 0x19D7, 0x8925, 0x19D8, 0x8926, 0x4D4E,

+    0x8927, 0x3B18, 0x892A, 0x19D9, 0x892B, 0x19DA, 0x8930, 0x3B19,

+    0x8932, 0x42DE, 0x8935, 0x4D4F, 0x8936, 0x19DE, 0x8937, 0x48DB,

+    0x8938, 0x19DF, 0x8939, 0x42DF, 0x893B, 0x19DD, 0x893E, 0x3B1A,

+    0x8940, 0x42E0, 0x8941, 0x19DB, 0x8942, 0x48DD, 0x8943, 0x19D6,

+    0x8944, 0x19DC, 0x8945, 0x48DE, 0x8949, 0x48DF, 0x894C, 0x19E0,

+    0x894D, 0x1BD0, 0x8956, 0x0528, 0x895A, 0x4D50, 0x895C, 0x4D51,

+    0x895E, 0x19E3, 0x895F, 0x06D7, 0x8960, 0x19E2, 0x8962, 0x48E1,

+    0x8964, 0x19E5, 0x8966, 0x19E4, 0x896A, 0x19E7, 0x896B, 0x4D52,

+    0x896D, 0x19E6, 0x896F, 0x19E8, 0x8970, 0x4D53, 0x8972, 0x093B,

+    0x8974, 0x19E9, 0x8977, 0x19EA, 0x897B, 0x3B1B, 0x897C, 0x4D54,

+    0x897E, 0x19EB, 0x897F, 0x0A62, 0x8980, 0x362E, 0x8981, 0x0F41,

+    0x8983, 0x19EC, 0x8986, 0x0DF4, 0x8987, 0x0CFC, 0x8988, 0x19ED,

+    0x8989, 0x48E2, 0x898A, 0x19EE, 0x898B, 0x075F, 0x898F, 0x0646,

+    0x8990, 0x48E3, 0x8993, 0x19EF, 0x8994, 0x42E1, 0x8996, 0x08B9,

+    0x8997, 0x0CF7, 0x8998, 0x19F0, 0x899A, 0x05AE, 0x899F, 0x48E4,

+    0x89A1, 0x19F1, 0x89A5, 0x4D55, 0x89A6, 0x19F3, 0x89A7, 0x0F61,

+    0x89A9, 0x19F2, 0x89AA, 0x0A0C, 0x89AC, 0x19F4, 0x89AF, 0x19F5,

+    0x89B0, 0x48E5, 0x89B2, 0x19F6, 0x89B3, 0x060D, 0x89B5, 0x4D56,

+    0x89B7, 0x48E6, 0x89BA, 0x19F7, 0x89BC, 0x4D57, 0x89BD, 0x19F8,

+    0x89BF, 0x19F9, 0x89C0, 0x19FA, 0x89D2, 0x05AF, 0x89D4, 0x3B1C,

+    0x89D5, 0x4D58, 0x89D6, 0x3B1D, 0x89D8, 0x48E7, 0x89DA, 0x19FB,

+    0x89DC, 0x19FC, 0x89DD, 0x19FD, 0x89E3, 0x0572, 0x89E5, 0x3B1E,

+    0x89E6, 0x09EE, 0x89E7, 0x19FE, 0x89EB, 0x48E8, 0x89F1, 0x3B1F,

+    0x89F3, 0x48EA, 0x89F4, 0x19FF, 0x89F6, 0x42E2, 0x89F8, 0x1A00,

+    0x89FD, 0x48EB, 0x89FF, 0x48EC, 0x8A00, 0x0774, 0x8A01, 0x35BC,

+    0x8A02, 0x0C17, 0x8A03, 0x1A01, 0x8A07, 0x3B20, 0x8A08, 0x072D,

+    0x8A0A, 0x0A1C, 0x8A0C, 0x1A04, 0x8A0E, 0x0C7C, 0x8A0F, 0x3B21,

+    0x8A10, 0x1A03, 0x8A11, 0x48EE, 0x8A12, 0x21A8, 0x8A13, 0x0707,

+    0x8A14, 0x48EF, 0x8A15, 0x3B22, 0x8A16, 0x1A02, 0x8A17, 0x0B57,

+    0x8A18, 0x0647, 0x8A1B, 0x1A05, 0x8A1D, 0x1A06, 0x8A1F, 0x09C1,

+    0x8A21, 0x48F1, 0x8A22, 0x3B23, 0x8A23, 0x0743, 0x8A25, 0x1A07,

+    0x8A2A, 0x0E5A, 0x8A2D, 0x0A83, 0x8A31, 0x0690, 0x8A33, 0x0F01,

+    0x8A34, 0x0ACC, 0x8A35, 0x48F2, 0x8A36, 0x1A08, 0x8A37, 0x21A9,

+    0x8A3A, 0x0A0D, 0x8A3B, 0x0BAE, 0x8A3C, 0x09C2, 0x8A3E, 0x48F3,

+    0x8A41, 0x1A09, 0x8A45, 0x48F4, 0x8A46, 0x1A0C, 0x8A47, 0x42E3,

+    0x8A48, 0x1A0D, 0x8A49, 0x4D59, 0x8A4D, 0x48F5, 0x8A4E, 0x3B24,

+    0x8A50, 0x082E, 0x8A51, 0x0B22, 0x8A52, 0x1A0B, 0x8A54, 0x09C3,

+    0x8A55, 0x0DB0, 0x8A57, 0x4D5A, 0x8A58, 0x48F6, 0x8A5B, 0x1A0A,

+    0x8A5D, 0x42E4, 0x8A5E, 0x08BA, 0x8A60, 0x04F5, 0x8A61, 0x42E5,

+    0x8A62, 0x1A11, 0x8A63, 0x072E, 0x8A66, 0x08BC, 0x8A67, 0x4D5B,

+    0x8A69, 0x08BB, 0x8A6B, 0x0FF3, 0x8A6C, 0x1A10, 0x8A6D, 0x1A0F,

+    0x8A6E, 0x0AA9, 0x8A70, 0x0667, 0x8A71, 0x0FE9, 0x8A72, 0x0598,

+    0x8A73, 0x09C4, 0x8A75, 0x42E6, 0x8A79, 0x21AA, 0x8A7C, 0x1A0E,

+    0x8A7E, 0x4D5C, 0x8A7F, 0x3B25, 0x8A82, 0x1A13, 0x8A84, 0x1A14,

+    0x8A85, 0x1A12, 0x8A86, 0x4D5D, 0x8A87, 0x078C, 0x8A89, 0x0F2A,

+    0x8A8C, 0x08BD, 0x8A8D, 0x0CDD, 0x8A90, 0x48F8, 0x8A91, 0x1A17,

+    0x8A93, 0x0A64, 0x8A95, 0x0B80, 0x8A96, 0x4D5E, 0x8A98, 0x0F20,

+    0x8A9A, 0x1A1A, 0x8A9E, 0x07A0, 0x8AA0, 0x0A63, 0x8AA1, 0x1A16,

+    0x8AA3, 0x1A1B, 0x8AA4, 0x07A1, 0x8AA5, 0x1A18, 0x8AA6, 0x1A19,

+    0x8AA7, 0x21AB, 0x8AA8, 0x1A15, 0x8AAA, 0x3638, 0x8AAC, 0x0A86,

+    0x8AAD, 0x0CA1, 0x8AAE, 0x48F7, 0x8AB0, 0x0B6D, 0x8AB2, 0x055D,

+    0x8AB6, 0x4D5F, 0x8AB7, 0x48F9, 0x8AB9, 0x0D84, 0x8ABC, 0x065D,

+    0x8ABE, 0x21AC, 0x8ABF, 0x0BD0, 0x8AC2, 0x1A1E, 0x8AC4, 0x1A1C,

+    0x8AC7, 0x0B8A, 0x8AC9, 0x4D60, 0x8ACB, 0x0A65, 0x8ACC, 0x060E,

+    0x8ACD, 0x1A1D, 0x8ACF, 0x0A21, 0x8AD0, 0x42E7, 0x8AD1, 0x4D61,

+    0x8AD2, 0x0F92, 0x8AD6, 0x0FE6, 0x8AD7, 0x48FA, 0x8ADA, 0x1A1F,

+    0x8ADB, 0x1A2A, 0x8ADC, 0x0BD1, 0x8ADD, 0x4D62, 0x8ADE, 0x1A29,

+    0x8ADF, 0x21AD, 0x8AE0, 0x1A26, 0x8AE1, 0x1A2E, 0x8AE2, 0x1A27,

+    0x8AE4, 0x1A23, 0x8AE6, 0x0C18, 0x8AE7, 0x1A22, 0x8AEB, 0x1A20,

+    0x8AEC, 0x4D63, 0x8AED, 0x0F0B, 0x8AEE, 0x08BE, 0x8AF1, 0x1A24,

+    0x8AF3, 0x1A21, 0x8AF4, 0x3B26, 0x8AF5, 0x4D64, 0x8AF6, 0x21AF,

+    0x8AF7, 0x1A28, 0x8AF8, 0x097E, 0x8AFA, 0x0775, 0x8AFC, 0x48FB,

+    0x8AFE, 0x0B5A, 0x8B00, 0x0E73, 0x8B01, 0x04FC, 0x8B02, 0x04A6,

+    0x8B04, 0x0C7D, 0x8B05, 0x48FE, 0x8B06, 0x4D65, 0x8B07, 0x1A2C,

+    0x8B0A, 0x48FD, 0x8B0C, 0x1A2B, 0x8B0D, 0x48FF, 0x8B0E, 0x0CBE,

+    0x8B0F, 0x4D66, 0x8B10, 0x1A30, 0x8B11, 0x4D67, 0x8B14, 0x1A25,

+    0x8B16, 0x1A2F, 0x8B17, 0x1A31, 0x8B19, 0x0760, 0x8B1A, 0x1A2D,

+    0x8B1B, 0x07E8, 0x8B1C, 0x4900, 0x8B1D, 0x0901, 0x8B1F, 0x3B27,

+    0x8B20, 0x1A32, 0x8B21, 0x0F42, 0x8B26, 0x1A35, 0x8B28, 0x1A38,

+    0x8B2B, 0x1A36, 0x8B2C, 0x0DA7, 0x8B2D, 0x4901, 0x8B33, 0x1A33,

+    0x8B37, 0x3B28, 0x8B39, 0x06D8, 0x8B3E, 0x1A37, 0x8B41, 0x1A39,

+    0x8B43, 0x3B29, 0x8B44, 0x3B2A, 0x8B45, 0x4D68, 0x8B46, 0x42E8,

+    0x8B49, 0x1A3D, 0x8B4C, 0x1A3A, 0x8B4E, 0x1A3C, 0x8B4F, 0x1A3B,

+    0x8B51, 0x4903, 0x8B52, 0x4D69, 0x8B53, 0x21B0, 0x8B54, 0x3B2B,

+    0x8B56, 0x1A3E, 0x8B58, 0x08DD, 0x8B59, 0x42E9, 0x8B5A, 0x1A40,

+    0x8B5B, 0x1A3F, 0x8B5C, 0x0DDA, 0x8B5E, 0x4904, 0x8B5F, 0x1A42,

+    0x8B66, 0x072F, 0x8B69, 0x42EA, 0x8B6B, 0x1A41, 0x8B6C, 0x1A43,

+    0x8B6D, 0x4D6A, 0x8B6F, 0x1A44, 0x8B70, 0x065E, 0x8B71, 0x182E,

+    0x8B72, 0x09E1, 0x8B74, 0x1A45, 0x8B76, 0x4905, 0x8B77, 0x07A2,

+    0x8B78, 0x4D6B, 0x8B7C, 0x4D6C, 0x8B7D, 0x1A46, 0x8B7E, 0x4D6D,

+    0x8B7F, 0x21B1, 0x8B80, 0x1A47, 0x8B81, 0x4906, 0x8B83, 0x088C,

+    0x8B85, 0x4D6E, 0x8B8A, 0x13D3, 0x8B8B, 0x4907, 0x8B8C, 0x1A48,

+    0x8B8E, 0x1A49, 0x8B90, 0x093C, 0x8B92, 0x1A4A, 0x8B93, 0x1A4B,

+    0x8B94, 0x4908, 0x8B95, 0x4909, 0x8B96, 0x1A4C, 0x8B99, 0x1A4D,

+    0x8B9A, 0x1A4E, 0x8B9C, 0x3B2C, 0x8B9D, 0x42EB, 0x8B9E, 0x3B2D,

+    0x8B9F, 0x4D6F, 0x8C37, 0x0B69, 0x8C39, 0x490A, 0x8C3A, 0x1A4F,

+    0x8C3D, 0x490C, 0x8C3F, 0x1A51, 0x8C41, 0x1A50, 0x8C45, 0x490F,

+    0x8C46, 0x0C7E, 0x8C47, 0x3B2E, 0x8C48, 0x1A52, 0x8C49, 0x42EC,

+    0x8C4A, 0x0E5B, 0x8C4B, 0x4D70, 0x8C4C, 0x1A53, 0x8C4E, 0x1A54,

+    0x8C4F, 0x4910, 0x8C50, 0x1A55, 0x8C53, 0x4D71, 0x8C54, 0x3B2F,

+    0x8C55, 0x1A56, 0x8C57, 0x4911, 0x8C5A, 0x0CB2, 0x8C61, 0x09C5,

+    0x8C62, 0x1A57, 0x8C68, 0x42ED, 0x8C69, 0x4912, 0x8C6A, 0x07FD,

+    0x8C6B, 0x1007, 0x8C6C, 0x1A58, 0x8C6D, 0x4913, 0x8C73, 0x3B30,

+    0x8C78, 0x1A59, 0x8C79, 0x0DB1, 0x8C7A, 0x1A5A, 0x8C7B, 0x4D72,

+    0x8C7C, 0x1A62, 0x8C82, 0x1A5B, 0x8C85, 0x1A5D, 0x8C89, 0x1A5C,

+    0x8C8A, 0x1A5E, 0x8C8C, 0x0E74, 0x8C8D, 0x1A5F, 0x8C8E, 0x1A60,

+    0x8C92, 0x4916, 0x8C93, 0x4915, 0x8C94, 0x1A61, 0x8C98, 0x1A63,

+    0x8C99, 0x4917, 0x8C9B, 0x4919, 0x8C9D, 0x058B, 0x8C9E, 0x0C03,

+    0x8C9F, 0x354C, 0x8CA0, 0x0DDB, 0x8CA1, 0x0852, 0x8CA2, 0x07E9,

+    0x8CA4, 0x3B31, 0x8CA7, 0x0DC1, 0x8CA8, 0x055F, 0x8CA9, 0x0D62,

+    0x8CAA, 0x1A66, 0x8CAB, 0x060F, 0x8CAC, 0x0A79, 0x8CAD, 0x1A65,

+    0x8CAE, 0x1A6A, 0x8CAF, 0x0BB7, 0x8CB0, 0x0EEF, 0x8CB2, 0x1A68,

+    0x8CB3, 0x1A69, 0x8CB4, 0x0648, 0x8CB6, 0x1A6B, 0x8CB7, 0x0D19,

+    0x8CB8, 0x0B3F, 0x8CBA, 0x4D73, 0x8CBB, 0x0D85, 0x8CBC, 0x0C37,

+    0x8CBD, 0x1A67, 0x8CBF, 0x0E75, 0x8CC0, 0x056C, 0x8CC1, 0x1A6D,

+    0x8CC2, 0x0FCE, 0x8CC3, 0x0BDE, 0x8CC4, 0x0FEB, 0x8CC5, 0x4D74,

+    0x8CC7, 0x08BF, 0x8CC8, 0x1A6C, 0x8CC9, 0x4D75, 0x8CCA, 0x0B11,

+    0x8CCD, 0x1A7D, 0x8CCE, 0x0AAA, 0x8CD1, 0x0CD0, 0x8CD2, 0x4D76,

+    0x8CD3, 0x0DC2, 0x8CD5, 0x491B, 0x8CD6, 0x491A, 0x8CD9, 0x3B32,

+    0x8CDA, 0x1A70, 0x8CDB, 0x088D, 0x8CDC, 0x08C0, 0x8CDE, 0x09C6,

+    0x8CE0, 0x0D1B, 0x8CE1, 0x3B33, 0x8CE2, 0x0761, 0x8CE3, 0x1A6F,

+    0x8CE4, 0x1A6E, 0x8CE6, 0x0DDC, 0x8CEA, 0x08ED, 0x8CEC, 0x4D77,

+    0x8CED, 0x0C4C, 0x8CF0, 0x21B2, 0x8CF1, 0x491D, 0x8CF4, 0x21B3,

+    0x8CF5, 0x4D78, 0x8CF7, 0x4D79, 0x8CF8, 0x3B34, 0x8CFA, 0x1A72,

+    0x8CFB, 0x1A73, 0x8CFC, 0x07EA, 0x8CFD, 0x1A71, 0x8CFE, 0x3B35,

+    0x8D01, 0x4D7A, 0x8D03, 0x4D7B, 0x8D04, 0x1A74, 0x8D05, 0x1A75,

+    0x8D07, 0x1A77, 0x8D08, 0x0B03, 0x8D09, 0x491F, 0x8D0A, 0x1A76,

+    0x8D0B, 0x0622, 0x8D0D, 0x1A79, 0x8D0E, 0x4920, 0x8D0F, 0x1A78,

+    0x8D10, 0x1A7A, 0x8D12, 0x21B4, 0x8D13, 0x1A7C, 0x8D14, 0x1A7E,

+    0x8D16, 0x1A7F, 0x8D17, 0x4D7C, 0x8D1B, 0x3B36, 0x8D1C, 0x4D7D,

+    0x8D64, 0x0A7A, 0x8D66, 0x08FB, 0x8D67, 0x1A80, 0x8D69, 0x3B37,

+    0x8D6B, 0x05B0, 0x8D6C, 0x3B38, 0x8D6D, 0x1A81, 0x8D6E, 0x4D7E,

+    0x8D70, 0x0AF8, 0x8D71, 0x1A82, 0x8D73, 0x1A83, 0x8D74, 0x0DDD,

+    0x8D76, 0x21B5, 0x8D77, 0x0649, 0x8D81, 0x1A84, 0x8D84, 0x3B39,

+    0x8D85, 0x0BD2, 0x8D8A, 0x04FD, 0x8D8D, 0x3B3A, 0x8D91, 0x4D7F,

+    0x8D95, 0x3B3B, 0x8D99, 0x1A85, 0x8D9F, 0x4D80, 0x8DA3, 0x091D,

+    0x8DA6, 0x3B3C, 0x8DA8, 0x0A3C, 0x8DAB, 0x4D81, 0x8DAF, 0x42EE,

+    0x8DB2, 0x4D82, 0x8DB3, 0x0B0D, 0x8DBA, 0x1A88, 0x8DBE, 0x1A87,

+    0x8DC2, 0x1A86, 0x8DC6, 0x3B3D, 0x8DC8, 0x4921, 0x8DCB, 0x1A8E,

+    0x8DCC, 0x1A8C, 0x8DCE, 0x3B3E, 0x8DCF, 0x1A89, 0x8DD1, 0x42EF,

+    0x8DD5, 0x4D83, 0x8DD6, 0x1A8B, 0x8DD7, 0x42F0, 0x8DD9, 0x4922,

+    0x8DDA, 0x1A8A, 0x8DDB, 0x1A8D, 0x8DDD, 0x0691, 0x8DDF, 0x1A91,

+    0x8DE1, 0x0A7B, 0x8DE3, 0x1A92, 0x8DE4, 0x3B3F, 0x8DE7, 0x4D84,

+    0x8DE8, 0x078D, 0x8DEA, 0x1A8F, 0x8DEB, 0x1A90, 0x8DEC, 0x3B40,

+    0x8DEF, 0x0FCF, 0x8DF1, 0x4D85, 0x8DF2, 0x4D86, 0x8DF3, 0x0BD3,

+    0x8DF4, 0x4D87, 0x8DF5, 0x0AAB, 0x8DFC, 0x1A93, 0x8DFD, 0x4925,

+    0x8DFF, 0x1A96, 0x8E01, 0x4D88, 0x8E06, 0x4926, 0x8E08, 0x1A94,

+    0x8E09, 0x1A95, 0x8E0A, 0x0F43, 0x8E0B, 0x4D89, 0x8E0C, 0x4923,

+    0x8E0F, 0x0C7F, 0x8E10, 0x1A99, 0x8E14, 0x4928, 0x8E16, 0x4929,

+    0x8E1D, 0x1A97, 0x8E1E, 0x1A98, 0x8E1F, 0x1A9A, 0x8E20, 0x3B41,

+    0x8E21, 0x492A, 0x8E22, 0x492B, 0x8E23, 0x42F1, 0x8E26, 0x4D8A,

+    0x8E27, 0x492C, 0x8E2A, 0x1AA8, 0x8E30, 0x1A9D, 0x8E31, 0x4D8B,

+    0x8E34, 0x1A9E, 0x8E35, 0x1A9C, 0x8E36, 0x492F, 0x8E39, 0x4930,

+    0x8E3D, 0x42F2, 0x8E40, 0x4D8C, 0x8E41, 0x4D8D, 0x8E42, 0x1A9B,

+    0x8E44, 0x0C19, 0x8E47, 0x1AA0, 0x8E48, 0x1AA4, 0x8E49, 0x1AA1,

+    0x8E4A, 0x1A9F, 0x8E4B, 0x3B42, 0x8E4C, 0x1AA2, 0x8E4D, 0x4D8E,

+    0x8E4F, 0x4D8F, 0x8E50, 0x1AA3, 0x8E54, 0x4931, 0x8E55, 0x1AAA,

+    0x8E59, 0x1AA5, 0x8E5C, 0x4D90, 0x8E5F, 0x0A7C, 0x8E60, 0x1AA7,

+    0x8E61, 0x4D91, 0x8E62, 0x4932, 0x8E63, 0x1AA9, 0x8E64, 0x1AA6,

+    0x8E69, 0x4D92, 0x8E6C, 0x3B43, 0x8E6D, 0x4933, 0x8E6F, 0x4934,

+    0x8E70, 0x3B44, 0x8E71, 0x4D93, 0x8E72, 0x1AAC, 0x8E74, 0x093D,

+    0x8E75, 0x4D94, 0x8E76, 0x1AAB, 0x8E77, 0x4D95, 0x8E7A, 0x3B45,

+    0x8E7B, 0x42F3, 0x8E7C, 0x1AAD, 0x8E81, 0x1AAE, 0x8E84, 0x1AB1,

+    0x8E85, 0x1AB0, 0x8E87, 0x1AAF, 0x8E89, 0x4D96, 0x8E8A, 0x1AB3,

+    0x8E8B, 0x1AB2, 0x8E8D, 0x0F02, 0x8E90, 0x4D97, 0x8E91, 0x1AB5,

+    0x8E92, 0x3B46, 0x8E93, 0x1AB4, 0x8E94, 0x1AB6, 0x8E95, 0x4D98,

+    0x8E98, 0x4935, 0x8E99, 0x1AB7, 0x8E9A, 0x4D99, 0x8E9E, 0x4936,

+    0x8EA1, 0x1AB9, 0x8EA7, 0x4D9A, 0x8EA9, 0x4D9B, 0x8EAA, 0x1AB8,

+    0x8EAB, 0x0A0E, 0x8EAC, 0x1ABA, 0x8EAD, 0x4D9C, 0x8EAE, 0x3B47,

+    0x8EAF, 0x06E5, 0x8EB0, 0x1ABB, 0x8EB1, 0x1ABD, 0x8EB3, 0x3B48,

+    0x8EB5, 0x4937, 0x8EB6, 0x3703, 0x8EBB, 0x4938, 0x8EBE, 0x1ABE,

+    0x8EC0, 0x1DEF, 0x8EC5, 0x1ABF, 0x8EC6, 0x1ABC, 0x8EC8, 0x1AC0,

+    0x8ECA, 0x0902, 0x8ECB, 0x1AC1, 0x8ECC, 0x064A, 0x8ECD, 0x0709,

+    0x8ECF, 0x21B7, 0x8ED1, 0x3B49, 0x8ED2, 0x0762, 0x8ED4, 0x3B4A,

+    0x8EDB, 0x1AC2, 0x8EDF, 0x0CC8, 0x8EE2, 0x0C38, 0x8EE3, 0x1AC3,

+    0x8EE8, 0x4D9D, 0x8EEB, 0x1AC6, 0x8EF0, 0x4D9E, 0x8EF8, 0x08E0,

+    0x8EF9, 0x3B4B, 0x8EFA, 0x42F6, 0x8EFB, 0x1AC5, 0x8EFC, 0x1AC4,

+    0x8EFD, 0x0730, 0x8EFE, 0x1AC7, 0x8F00, 0x493C, 0x8F03, 0x05B1,

+    0x8F05, 0x1AC9, 0x8F07, 0x4D9F, 0x8F08, 0x493D, 0x8F09, 0x084C,

+    0x8F0A, 0x1AC8, 0x8F0C, 0x1AD1, 0x8F12, 0x1ACB, 0x8F13, 0x1ACD,

+    0x8F14, 0x0E35, 0x8F15, 0x1ACA, 0x8F17, 0x3B4C, 0x8F18, 0x4DA0,

+    0x8F19, 0x1ACC, 0x8F1B, 0x1AD0, 0x8F1C, 0x1ACE, 0x8F1D, 0x064B,

+    0x8F1E, 0x42F7, 0x8F1F, 0x1ACF, 0x8F25, 0x4DA1, 0x8F26, 0x1AD2,

+    0x8F27, 0x4DA2, 0x8F29, 0x0D10, 0x8F2A, 0x0FA0, 0x8F2B, 0x493E,

+    0x8F2C, 0x4DA3, 0x8F2D, 0x42F8, 0x8F2F, 0x093E, 0x8F33, 0x1AD3,

+    0x8F35, 0x4DA4, 0x8F36, 0x3B4D, 0x8F38, 0x0F0C, 0x8F39, 0x1AD5,

+    0x8F3A, 0x4DA5, 0x8F3B, 0x1AD4, 0x8F3E, 0x1AD8, 0x8F3F, 0x0F2B,

+    0x8F40, 0x493F, 0x8F42, 0x1AD7, 0x8F43, 0x4DA6, 0x8F44, 0x05CB,

+    0x8F45, 0x1AD6, 0x8F46, 0x1ADB, 0x8F47, 0x4DA7, 0x8F49, 0x1ADA,

+    0x8F4A, 0x4940, 0x8F4C, 0x1AD9, 0x8F4D, 0x0C2C, 0x8F4E, 0x1ADC,

+    0x8F51, 0x4DA8, 0x8F54, 0x42F9, 0x8F55, 0x4DA9, 0x8F57, 0x1ADD,

+    0x8F58, 0x4941, 0x8F5C, 0x1ADE, 0x8F5F, 0x07FE, 0x8F61, 0x06FB,

+    0x8F62, 0x1ADF, 0x8F63, 0x1AE0, 0x8F64, 0x1AE1, 0x8F9B, 0x0A0F,

+    0x8F9C, 0x1AE2, 0x8F9E, 0x08D9, 0x8F9F, 0x1AE3, 0x8FA0, 0x4DAA,

+    0x8FA1, 0x4DAB, 0x8FA2, 0x4DAC, 0x8FA3, 0x1AE4, 0x8FA4, 0x4943,

+    0x8FA5, 0x4DAD, 0x8FA6, 0x3B4E, 0x8FA7, 0x10B6, 0x8FA8, 0x10B5,

+    0x8FAD, 0x1AE5, 0x8FAE, 0x17FF, 0x8FAF, 0x1AE6, 0x8FB0, 0x0B62,

+    0x8FB1, 0x09F1, 0x8FB2, 0x0CF6, 0x8FB4, 0x4944, 0x8FB5, 0x3B4F,

+    0x8FB6, 0x3B50, 0x8FB7, 0x1AE7, 0x8FBA, 0x0E25, 0x8FBB, 0x0BF0,

+    0x8FBC, 0x0810, 0x8FBF, 0x0B67, 0x8FC1, 0x4946, 0x8FC2, 0x04CC,

+    0x8FC4, 0x0EA6, 0x8FC5, 0x0A1D, 0x8FC6, 0x4947, 0x8FC8, 0x3799,

+    0x8FCA, 0x4949, 0x8FCD, 0x494A, 0x8FCE, 0x0734, 0x8FD1, 0x06D9,

+    0x8FD3, 0x494B, 0x8FD4, 0x0E26, 0x8FD5, 0x494C, 0x8FDA, 0x1AE8,

+    0x8FE0, 0x3B52, 0x8FE2, 0x1AEA, 0x8FE4, 0x3B53, 0x8FE5, 0x1AE9,

+    0x8FE6, 0x0560, 0x8FE8, 0x42FB, 0x8FE9, 0x0CCE, 0x8FEA, 0x1AEB,

+    0x8FEB, 0x0D2D, 0x8FED, 0x0C2D, 0x8FEE, 0x42FC, 0x8FEF, 0x1AEC,

+    0x8FF0, 0x095C, 0x8FF1, 0x494D, 0x8FF4, 0x1AEE, 0x8FF5, 0x494E,

+    0x8FF6, 0x3B54, 0x8FF7, 0x0ECE, 0x8FF8, 0x1AFD, 0x8FF9, 0x1AF0,

+    0x8FFA, 0x1AF1, 0x8FFB, 0x494F, 0x8FFD, 0x0BE5, 0x9000, 0x0B40,

+    0x9001, 0x0AF9, 0x9002, 0x3B55, 0x9003, 0x0C80, 0x9004, 0x4DAE,

+    0x9005, 0x1AEF, 0x9006, 0x066F, 0x9008, 0x42FD, 0x900B, 0x1AF8,

+    0x900C, 0x4950, 0x900D, 0x1AF5, 0x900E, 0x1B02, 0x900F, 0x0C81,

+    0x9010, 0x0B9E, 0x9011, 0x1AF2, 0x9013, 0x0C1A, 0x9014, 0x0C4D,

+    0x9015, 0x1AF3, 0x9016, 0x1AF7, 0x9017, 0x0A26, 0x9019, 0x0D1D,

+    0x901A, 0x0BE8, 0x901B, 0x4DAF, 0x901D, 0x0A66, 0x901E, 0x1AF6,

+    0x901F, 0x0B0E, 0x9020, 0x0B04, 0x9021, 0x1AF4, 0x9022, 0x046D,

+    0x9023, 0x0FC8, 0x9027, 0x1AF9, 0x902C, 0x3B56, 0x902D, 0x42FE,

+    0x902E, 0x0B41, 0x902F, 0x4DB0, 0x9031, 0x093F, 0x9032, 0x0A10,

+    0x9035, 0x1AFB, 0x9036, 0x1AFA, 0x9037, 0x4951, 0x9038, 0x04B3,

+    0x9039, 0x1AFC, 0x903C, 0x0DA1, 0x903E, 0x1B04, 0x9041, 0x0CB3,

+    0x9042, 0x0A31, 0x9043, 0x4953, 0x9044, 0x3B57, 0x9045, 0x0B97,

+    0x9047, 0x06F0, 0x9049, 0x1B03, 0x904A, 0x0F21, 0x904B, 0x04E1,

+    0x904C, 0x4DB1, 0x904D, 0x0E27, 0x904E, 0x0561, 0x904F, 0x1AFE,

+    0x9050, 0x1AFF, 0x9051, 0x1B00, 0x9052, 0x1B01, 0x9053, 0x0C93,

+    0x9054, 0x0B61, 0x9055, 0x04A7, 0x9056, 0x1B05, 0x9058, 0x1B06,

+    0x9059, 0x1D34, 0x905B, 0x4DB2, 0x905C, 0x0B1D, 0x905D, 0x4954,

+    0x905E, 0x1B07, 0x9060, 0x0515, 0x9061, 0x0ACE, 0x9063, 0x0763,

+    0x9065, 0x0F44, 0x9067, 0x21BA, 0x9068, 0x1B08, 0x9069, 0x0C26,

+    0x906D, 0x0AFA, 0x906E, 0x0903, 0x906F, 0x1B09, 0x9070, 0x4DB3,

+    0x9072, 0x1B0C, 0x9074, 0x4DB4, 0x9075, 0x096F, 0x9076, 0x1B0A,

+    0x9077, 0x0AAD, 0x9078, 0x0AAC, 0x9079, 0x4DB5, 0x907A, 0x04A8,

+    0x907C, 0x0F93, 0x907D, 0x1B0E, 0x907F, 0x0D86, 0x9080, 0x1B10,

+    0x9081, 0x1B0F, 0x9082, 0x1B0D, 0x9083, 0x1737, 0x9084, 0x0610,

+    0x9085, 0x4957, 0x9087, 0x1AED, 0x9088, 0x3B58, 0x9089, 0x1B12,

+    0x908A, 0x1B11, 0x908B, 0x4DB6, 0x908C, 0x4958, 0x908F, 0x1B13,

+    0x9090, 0x4959, 0x9091, 0x0F22, 0x9095, 0x3B59, 0x9097, 0x42FF,

+    0x9098, 0x4DB7, 0x9099, 0x3B5A, 0x909B, 0x3B5B, 0x90A0, 0x4DB8,

+    0x90A1, 0x495A, 0x90A2, 0x3B5C, 0x90A3, 0x0CB9, 0x90A6, 0x0E5C,

+    0x90A8, 0x1B14, 0x90AA, 0x0905, 0x90AF, 0x1B15, 0x90B0, 0x495C,

+    0x90B1, 0x1B16, 0x90B2, 0x4DB9, 0x90B3, 0x4300, 0x90B4, 0x3B5D,

+    0x90B5, 0x1B17, 0x90B6, 0x495D, 0x90B8, 0x0C1B, 0x90BD, 0x4DBA,

+    0x90BE, 0x4301, 0x90C1, 0x04AE, 0x90C3, 0x495E, 0x90C4, 0x4302,

+    0x90C5, 0x4303, 0x90C7, 0x4304, 0x90C8, 0x495F, 0x90C9, 0x4DBB,

+    0x90CA, 0x07EB, 0x90CE, 0x0FE0, 0x90D7, 0x3B5E, 0x90DB, 0x1B1B,

+    0x90DC, 0x4961, 0x90DD, 0x3B5F, 0x90DE, 0x21BB, 0x90DF, 0x4962,

+    0x90E1, 0x070A, 0x90E2, 0x1B18, 0x90E4, 0x1B19, 0x90E8, 0x0DE6,

+    0x90EB, 0x4967, 0x90ED, 0x05B2, 0x90EF, 0x4305, 0x90F0, 0x4DBC,

+    0x90F2, 0x4965, 0x90F4, 0x3B60, 0x90F5, 0x0F23, 0x90F6, 0x4964,

+    0x90F7, 0x06B7, 0x90FD, 0x0C4E, 0x90FE, 0x4968, 0x90FF, 0x4969,

+    0x9100, 0x4966, 0x9102, 0x1B1C, 0x9104, 0x496A, 0x9105, 0x4DBD,

+    0x9106, 0x496B, 0x9112, 0x1B1D, 0x9114, 0x4306, 0x9115, 0x21BD,

+    0x9116, 0x4307, 0x9117, 0x3B61, 0x9118, 0x496C, 0x9119, 0x1B1E,

+    0x911C, 0x3B62, 0x911E, 0x496D, 0x9122, 0x4308, 0x9123, 0x4309,

+    0x9125, 0x4DBE, 0x9127, 0x21BE, 0x912D, 0x0C1C, 0x912F, 0x430A,

+    0x9130, 0x1B20, 0x9131, 0x3B63, 0x9132, 0x1B1F, 0x9134, 0x430B,

+    0x9137, 0x496E, 0x9139, 0x496F, 0x913A, 0x3B64, 0x913D, 0x3B65,

+    0x9146, 0x4970, 0x9147, 0x4971, 0x9148, 0x3B66, 0x9149, 0x0CAB,

+    0x914A, 0x1B21, 0x914B, 0x0940, 0x914C, 0x090C, 0x914D, 0x0D11,

+    0x914E, 0x0BAF, 0x9152, 0x091E, 0x9154, 0x0A32, 0x9156, 0x1B22,

+    0x9157, 0x4972, 0x9158, 0x1B23, 0x9159, 0x4973, 0x915A, 0x4DBF,

+    0x915B, 0x3B67, 0x9161, 0x3B68, 0x9162, 0x0A23, 0x9163, 0x1B24,

+    0x9164, 0x3B69, 0x9165, 0x1B25, 0x9167, 0x4DC0, 0x9169, 0x1B26,

+    0x916A, 0x0F59, 0x916C, 0x0941, 0x9172, 0x1B28, 0x9173, 0x1B27,

+    0x9174, 0x4974, 0x9175, 0x07EC, 0x9177, 0x0805, 0x9178, 0x088E,

+    0x9179, 0x4975, 0x917A, 0x4DC1, 0x9182, 0x1B2B, 0x9183, 0x430C,

+    0x9185, 0x4976, 0x9187, 0x0970, 0x9189, 0x1B2A, 0x918A, 0x4DC2,

+    0x918B, 0x1B29, 0x918D, 0x0B49, 0x918E, 0x3B6A, 0x9190, 0x07A3,

+    0x9191, 0x4DC3, 0x9192, 0x0A67, 0x9195, 0x4DC4, 0x9197, 0x0D44,

+    0x919C, 0x0943, 0x919E, 0x3B6B, 0x91A2, 0x1B2C, 0x91A4, 0x09C7,

+    0x91A8, 0x3B6C, 0x91AA, 0x1B2F, 0x91AB, 0x1B2D, 0x91AC, 0x1E1B,

+    0x91AD, 0x3B6D, 0x91AE, 0x3B6E, 0x91AF, 0x1B2E, 0x91B0, 0x4DC5,

+    0x91B1, 0x1E61, 0x91B2, 0x3B6F, 0x91B3, 0x4977, 0x91B4, 0x1B31,

+    0x91B5, 0x1B30, 0x91B6, 0x4978, 0x91B8, 0x09E2, 0x91BA, 0x1B32,

+    0x91BB, 0x4DC6, 0x91BC, 0x3B70, 0x91BD, 0x4DC7, 0x91C0, 0x1B33,

+    0x91C1, 0x1B34, 0x91C2, 0x4DC8, 0x91C3, 0x4979, 0x91C4, 0x497A,

+    0x91C5, 0x4DC9, 0x91C6, 0x0D64, 0x91C7, 0x0843, 0x91C8, 0x090D,

+    0x91C9, 0x1B35, 0x91CB, 0x1B36, 0x91CC, 0x0F6C, 0x91CD, 0x094F,

+    0x91CE, 0x0EFA, 0x91CF, 0x0F94, 0x91D0, 0x1B37, 0x91D1, 0x06DA,

+    0x91D6, 0x1B38, 0x91D7, 0x21C0, 0x91D8, 0x0C1D, 0x91DA, 0x21BF,

+    0x91DB, 0x1B3B, 0x91DC, 0x05D6, 0x91DD, 0x0A11, 0x91DE, 0x21C1,

+    0x91DF, 0x1B39, 0x91E1, 0x1B3A, 0x91E3, 0x0BFC, 0x91E4, 0x21C4,

+    0x91E5, 0x21C5, 0x91E6, 0x0E83, 0x91E7, 0x06F4, 0x91EC, 0x497D,

+    0x91ED, 0x21C2, 0x91EE, 0x21C3, 0x91F0, 0x3B71, 0x91F1, 0x430D,

+    0x91F5, 0x1B3D, 0x91F6, 0x1B3E, 0x91F7, 0x3B72, 0x91FB, 0x3B73,

+    0x91FC, 0x1B3C, 0x91FF, 0x1B40, 0x9200, 0x4DCA, 0x9201, 0x497E,

+    0x9206, 0x21C6, 0x9207, 0x3B74, 0x9209, 0x4DCB, 0x920A, 0x21C8,

+    0x920D, 0x0CB7, 0x920E, 0x05A1, 0x9210, 0x21C7, 0x9211, 0x1B44,

+    0x9214, 0x1B41, 0x9215, 0x1B43, 0x9216, 0x497F, 0x9217, 0x4980,

+    0x921E, 0x1B3F, 0x9223, 0x4DCC, 0x9228, 0x3B75, 0x9229, 0x1B8A,

+    0x922C, 0x1B42, 0x9233, 0x3B76, 0x9234, 0x0FB3, 0x9237, 0x078E,

+    0x9238, 0x3B77, 0x9239, 0x21CF, 0x923A, 0x21C9, 0x923C, 0x21CB,

+    0x923F, 0x1B4C, 0x9240, 0x21CA, 0x9242, 0x4982, 0x9243, 0x3B78,

+    0x9244, 0x0C2E, 0x9245, 0x1B47, 0x9247, 0x3B79, 0x9248, 0x1B4A,

+    0x9249, 0x1B48, 0x924A, 0x4983, 0x924B, 0x1B4D, 0x924E, 0x21CC,

+    0x924F, 0x3B7A, 0x9250, 0x1B4E, 0x9251, 0x21CE, 0x9256, 0x4984,

+    0x9257, 0x1B46, 0x9259, 0x21CD, 0x925A, 0x1B53, 0x925B, 0x0516,

+    0x925E, 0x1B45, 0x9260, 0x3B7B, 0x9261, 0x4985, 0x9262, 0x0D41,

+    0x9264, 0x1B49, 0x9265, 0x4986, 0x9266, 0x09C8, 0x9267, 0x21D0,

+    0x9268, 0x4987, 0x9271, 0x07ED, 0x9276, 0x4DCD, 0x9277, 0x21D2,

+    0x9278, 0x21D3, 0x927C, 0x4989, 0x927D, 0x498A, 0x927E, 0x0E76,

+    0x927F, 0x498B, 0x9280, 0x06DC, 0x9283, 0x0950, 0x9285, 0x0C94,

+    0x9288, 0x20AA, 0x9289, 0x498C, 0x928D, 0x498D, 0x928E, 0x4DCE,

+    0x9291, 0x0AAF, 0x9293, 0x1B51, 0x9295, 0x1B4B, 0x9296, 0x1B50,

+    0x9297, 0x498E, 0x9298, 0x0ECF, 0x9299, 0x498F, 0x929A, 0x0BD4,

+    0x929B, 0x1B52, 0x929C, 0x1B4F, 0x929F, 0x4990, 0x92A7, 0x21D1,

+    0x92AB, 0x4991, 0x92AD, 0x0AAE, 0x92AF, 0x4DCF, 0x92B2, 0x4994,

+    0x92B3, 0x3554, 0x92B7, 0x1B56, 0x92B9, 0x1B55, 0x92BB, 0x4DD0,

+    0x92BC, 0x4DD1, 0x92BF, 0x4995, 0x92C0, 0x4996, 0x92C1, 0x4DD2,

+    0x92C2, 0x3B7C, 0x92C3, 0x4DD3, 0x92C5, 0x4DD4, 0x92C6, 0x4997,

+    0x92C8, 0x4DD5, 0x92CB, 0x3B7D, 0x92CC, 0x3B7E, 0x92CE, 0x4998,

+    0x92CF, 0x1B54, 0x92D0, 0x21D7, 0x92D2, 0x0E5D, 0x92D3, 0x21DB,

+    0x92D5, 0x21D9, 0x92D7, 0x21D5, 0x92D9, 0x21D6, 0x92DF, 0x3B7F,

+    0x92E0, 0x21DA, 0x92E4, 0x0985, 0x92E5, 0x4999, 0x92E7, 0x21D4,

+    0x92E9, 0x1B57, 0x92EA, 0x0E2F, 0x92ED, 0x04F6, 0x92F2, 0x0DB8,

+    0x92F3, 0x0BB0, 0x92F7, 0x499D, 0x92F8, 0x0692, 0x92F9, 0x20B0,

+    0x92FA, 0x1B59, 0x92FB, 0x21DE, 0x92FC, 0x07EF, 0x92FF, 0x21E1,

+    0x9302, 0x21E3, 0x9304, 0x345A, 0x9306, 0x087A, 0x930D, 0x3B80,

+    0x930F, 0x1B58, 0x9310, 0x0A33, 0x9311, 0x499A, 0x9314, 0x4DD6,

+    0x9315, 0x3B81, 0x9318, 0x0A34, 0x9319, 0x1B5C, 0x931A, 0x1B5E,

+    0x931D, 0x21E2, 0x931E, 0x21E0, 0x931F, 0x3B82, 0x9320, 0x09E3,

+    0x9321, 0x21DD, 0x9322, 0x1B5D, 0x9323, 0x1B5F, 0x9325, 0x21DC,

+    0x9326, 0x06CB, 0x9327, 0x3B83, 0x9328, 0x0DB7, 0x9329, 0x499E,

+    0x932B, 0x090E, 0x932C, 0x0FC9, 0x932E, 0x1B5B, 0x932F, 0x0868,

+    0x9332, 0x0FE5, 0x9333, 0x4DD7, 0x9335, 0x1B61, 0x9336, 0x4DD8,

+    0x933A, 0x1B60, 0x933B, 0x1B62, 0x9344, 0x1B5A, 0x9347, 0x3B84,

+    0x9348, 0x20A9, 0x9349, 0x430E, 0x934A, 0x3458, 0x934B, 0x0CC1,

+    0x934D, 0x0C4F, 0x9351, 0x49A1, 0x9352, 0x3B85, 0x9354, 0x0BF3,

+    0x9356, 0x1B67, 0x9357, 0x21E5, 0x9358, 0x4DD9, 0x935A, 0x49A2,

+    0x935B, 0x0B81, 0x935C, 0x1B63, 0x9360, 0x1B64, 0x9364, 0x430F,

+    0x9365, 0x4310, 0x936A, 0x3B87, 0x936B, 0x49A3, 0x936C, 0x0703,

+    0x936D, 0x3B88, 0x936E, 0x1B66, 0x9370, 0x21E4, 0x9371, 0x49A4,

+    0x9373, 0x49A5, 0x9375, 0x0764, 0x937C, 0x1B65, 0x937E, 0x09C9,

+    0x937F, 0x4DDA, 0x9382, 0x4DDB, 0x9388, 0x49A9, 0x938A, 0x4DDC,

+    0x938B, 0x49AA, 0x938C, 0x05D7, 0x938F, 0x49AB, 0x9394, 0x1B6B,

+    0x9396, 0x082F, 0x9397, 0x0AFB, 0x939A, 0x0BE6, 0x939B, 0x3B89,

+    0x939E, 0x49AC, 0x93A1, 0x49A6, 0x93A3, 0x4311, 0x93A4, 0x21E6,

+    0x93A7, 0x0599, 0x93A9, 0x3B8B, 0x93AC, 0x1B69, 0x93AD, 0x1B6A,

+    0x93AE, 0x0BDF, 0x93B0, 0x1B68, 0x93B9, 0x1B6C, 0x93BA, 0x3B8A,

+    0x93BB, 0x4DDD, 0x93C1, 0x3B8C, 0x93C3, 0x1B72, 0x93C6, 0x21E7,

+    0x93C7, 0x49B1, 0x93C8, 0x1B75, 0x93CA, 0x3B8D, 0x93CC, 0x4DDE,

+    0x93D0, 0x1B74, 0x93D1, 0x0C27, 0x93D6, 0x1B6D, 0x93D7, 0x1B6E,

+    0x93D8, 0x1B71, 0x93DC, 0x49B2, 0x93DD, 0x1B73, 0x93DE, 0x21E8,

+    0x93DF, 0x4312, 0x93E1, 0x06B8, 0x93E2, 0x3B8E, 0x93E4, 0x1B76,

+    0x93E5, 0x1B70, 0x93E6, 0x4DDF, 0x93E7, 0x49B3, 0x93E8, 0x1B6F,

+    0x93F1, 0x49B0, 0x93F5, 0x49AD, 0x93F8, 0x21E9, 0x93F9, 0x4DE0,

+    0x93FA, 0x3B8F, 0x93FB, 0x49B7, 0x93FD, 0x3B90, 0x9402, 0x4DE1,

+    0x9403, 0x1B7A, 0x9404, 0x4313, 0x9407, 0x1B7B, 0x9409, 0x49B4,

+    0x940D, 0x4DE2, 0x940E, 0x4DE3, 0x940F, 0x3B91, 0x9410, 0x1B7C,

+    0x9413, 0x1B79, 0x9414, 0x1B78, 0x9416, 0x49B5, 0x9417, 0x49B6,

+    0x9418, 0x09CA, 0x9419, 0x0C82, 0x941A, 0x1B77, 0x9421, 0x1B80,

+    0x942B, 0x1B7E, 0x942E, 0x4DE4, 0x9431, 0x21EA, 0x9432, 0x49B8,

+    0x9433, 0x4314, 0x9434, 0x3B92, 0x9435, 0x1B7F, 0x9436, 0x1B7D,

+    0x9438, 0x0B58, 0x943A, 0x1B81, 0x943B, 0x49B9, 0x943F, 0x3B93,

+    0x9441, 0x1B82, 0x9444, 0x1B84, 0x9445, 0x21EB, 0x9448, 0x21EC,

+    0x944A, 0x4315, 0x944C, 0x4DE5, 0x9451, 0x0611, 0x9452, 0x1B83,

+    0x9453, 0x0F06, 0x9455, 0x3B94, 0x945A, 0x1B8F, 0x945B, 0x1B85,

+    0x945E, 0x1B88, 0x9460, 0x1B86, 0x9462, 0x1B87, 0x9463, 0x4316,

+    0x946A, 0x1B89, 0x946B, 0x3B95, 0x946D, 0x49BC, 0x946F, 0x49BD,

+    0x9470, 0x1B8B, 0x9471, 0x4317, 0x9472, 0x3B96, 0x9475, 0x1B8C,

+    0x9477, 0x1B8D, 0x947C, 0x1B90, 0x947D, 0x1B8E, 0x947E, 0x1B91,

+    0x947F, 0x1B93, 0x9481, 0x1B92, 0x9577, 0x0BD5, 0x9578, 0x3B97,

+    0x9579, 0x49BE, 0x9580, 0x0EF3, 0x9582, 0x1B94, 0x9583, 0x0AB0,

+    0x9586, 0x49BF, 0x9587, 0x1B95, 0x9588, 0x4DE6, 0x9589, 0x0E14,

+    0x958A, 0x1B96, 0x958B, 0x0589, 0x958C, 0x49C0, 0x958D, 0x49C1,

+    0x958E, 0x4318, 0x958F, 0x04DE, 0x9591, 0x0613, 0x9592, 0x21ED,

+    0x9593, 0x0612, 0x9594, 0x1B97, 0x9596, 0x1B98, 0x9598, 0x1B99,

+    0x9599, 0x1B9A, 0x959F, 0x4319, 0x95A0, 0x1B9B, 0x95A1, 0x4DE7,

+    0x95A2, 0x0614, 0x95A3, 0x05B3, 0x95A4, 0x07F0, 0x95A5, 0x0D4A,

+    0x95A6, 0x3B98, 0x95A7, 0x1B9D, 0x95A8, 0x1B9C, 0x95A9, 0x3B99,

+    0x95AB, 0x4F59, 0x95AC, 0x431A, 0x95AD, 0x1B9E, 0x95B1, 0x3555,

+    0x95B2, 0x04FE, 0x95B4, 0x3B9B, 0x95B6, 0x431B, 0x95B9, 0x1BA1,

+    0x95BB, 0x1BA0, 0x95BC, 0x1B9F, 0x95BD, 0x3B9C, 0x95BE, 0x1BA2,

+    0x95BF, 0x4DE8, 0x95C3, 0x1BA5, 0x95C6, 0x4DE9, 0x95C7, 0x048B,

+    0x95C8, 0x49C4, 0x95C9, 0x4DEA, 0x95CA, 0x1BA3, 0x95CB, 0x431C,

+    0x95CC, 0x1BA7, 0x95CD, 0x1BA6, 0x95D0, 0x431D, 0x95D1, 0x4DEB,

+    0x95D2, 0x4DEC, 0x95D3, 0x431E, 0x95D4, 0x1BA9, 0x95D5, 0x1BA8,

+    0x95D6, 0x1BAA, 0x95D8, 0x0C86, 0x95DA, 0x3B9D, 0x95DC, 0x1BAB,

+    0x95DE, 0x4320, 0x95E0, 0x4DED, 0x95E1, 0x1BAC, 0x95E2, 0x1BAE,

+    0x95E4, 0x4DEE, 0x95E5, 0x1BAD, 0x95E6, 0x4DEF, 0x961C, 0x0DDE,

+    0x961D, 0x3B9E, 0x9621, 0x1BAF, 0x9624, 0x4DF0, 0x9628, 0x1BB0,

+    0x962A, 0x0855, 0x962C, 0x49C7, 0x962E, 0x1BB1, 0x962F, 0x1BB2,

+    0x9631, 0x4DF1, 0x9632, 0x0E77, 0x9633, 0x49C8, 0x9634, 0x49C9,

+    0x9638, 0x4DF2, 0x963B, 0x0ACD, 0x963C, 0x49CB, 0x963D, 0x4DF3,

+    0x963F, 0x0468, 0x9640, 0x0B2B, 0x9641, 0x3B9F, 0x9642, 0x1BB3,

+    0x9644, 0x0DDF, 0x964B, 0x1BB6, 0x964C, 0x1BB4, 0x964D, 0x07F1,

+    0x964F, 0x1BB5, 0x9650, 0x0776, 0x9654, 0x4DF4, 0x9658, 0x3BA0,

+    0x965B, 0x0E15, 0x965C, 0x1BB8, 0x965D, 0x1BBA, 0x965E, 0x1BB9,

+    0x965F, 0x1BBB, 0x9661, 0x49CC, 0x9662, 0x04C3, 0x9663, 0x0A1E,

+    0x9664, 0x0986, 0x9665, 0x0615, 0x9666, 0x1BBC, 0x966A, 0x0D1C,

+    0x966C, 0x1BBE, 0x9670, 0x04C4, 0x9672, 0x1BBD, 0x9673, 0x0BE0,

+    0x9674, 0x4DF5, 0x9675, 0x0F95, 0x9676, 0x0C83, 0x9677, 0x1BB7,

+    0x9678, 0x0F6E, 0x967A, 0x0765, 0x967B, 0x4DF6, 0x967D, 0x0F45,

+    0x967F, 0x4DF7, 0x9681, 0x4DF8, 0x9682, 0x49CE, 0x9683, 0x4DF9,

+    0x9684, 0x3BA1, 0x9685, 0x06F1, 0x9686, 0x0F7C, 0x9688, 0x06FE,

+    0x9689, 0x4DFA, 0x968A, 0x0B42, 0x968B, 0x186C, 0x968D, 0x1BBF,

+    0x968E, 0x058A, 0x968F, 0x0A35, 0x9694, 0x05B4, 0x9695, 0x1BC1,

+    0x9696, 0x4DFB, 0x9697, 0x1BC2, 0x9698, 0x1BC0, 0x9699, 0x073A,

+    0x969A, 0x49D0, 0x969B, 0x084D, 0x969C, 0x09CB, 0x969D, 0x21F0,

+    0x96A0, 0x04C5, 0x96A3, 0x0FA1, 0x96A4, 0x3BA2, 0x96A5, 0x4321,

+    0x96A7, 0x1BC4, 0x96A8, 0x1B0B, 0x96A9, 0x3BA3, 0x96AA, 0x1BC3,

+    0x96AE, 0x4DFC, 0x96AF, 0x21F1, 0x96B0, 0x1BC7, 0x96B1, 0x1BC5,

+    0x96B2, 0x1BC6, 0x96B3, 0x49D3, 0x96B4, 0x1BC8, 0x96B6, 0x1BC9,

+    0x96B7, 0x0FB4, 0x96B8, 0x1BCA, 0x96B9, 0x1BCB, 0x96BA, 0x49D4,

+    0x96BB, 0x0A6D, 0x96BC, 0x0D4F, 0x96BD, 0x49D5, 0x96C0, 0x0A43,

+    0x96C1, 0x0623, 0x96C4, 0x0F24, 0x96C5, 0x056D, 0x96C6, 0x0942,

+    0x96C7, 0x078F, 0x96C9, 0x1BCE, 0x96CB, 0x1BCD, 0x96CC, 0x08C1,

+    0x96CD, 0x1BCF, 0x96CE, 0x1BCC, 0x96D1, 0x0876, 0x96D2, 0x3BA4,

+    0x96D5, 0x1BD3, 0x96D6, 0x1992, 0x96D8, 0x49D8, 0x96D9, 0x10EB,

+    0x96DA, 0x49D9, 0x96DB, 0x0A3D, 0x96DC, 0x1BD1, 0x96DD, 0x49DA,

+    0x96DE, 0x3BA6, 0x96E2, 0x0F6D, 0x96E3, 0x0CC9, 0x96E8, 0x04CD,

+    0x96E9, 0x3BA7, 0x96EA, 0x0A87, 0x96EB, 0x08E2, 0x96EF, 0x4322,

+    0x96F0, 0x0E07, 0x96F1, 0x3BA8, 0x96F2, 0x04E2, 0x96F6, 0x0FB5,

+    0x96F7, 0x0F55, 0x96F9, 0x1BD4, 0x96FB, 0x0C3F, 0x9700, 0x0927,

+    0x9702, 0x3BA9, 0x9703, 0x4DFD, 0x9704, 0x1BD5, 0x9706, 0x1BD6,

+    0x9707, 0x0A12, 0x9708, 0x1BD7, 0x9709, 0x3BAA, 0x970A, 0x0FB6,

+    0x970D, 0x1BD2, 0x970E, 0x1BD9, 0x970F, 0x1BDB, 0x9711, 0x1BDA,

+    0x9713, 0x1BD8, 0x9714, 0x49DC, 0x9716, 0x1BDC, 0x9719, 0x1BDD,

+    0x971B, 0x4DFE, 0x971C, 0x0AFC, 0x971E, 0x0562, 0x9721, 0x4DFF,

+    0x9722, 0x4E00, 0x9723, 0x49DD, 0x9724, 0x1BDE, 0x9727, 0x0EC4,

+    0x9728, 0x4E01, 0x972A, 0x1BDF, 0x9730, 0x1BE0, 0x9731, 0x4E02,

+    0x9732, 0x0FD0, 0x9733, 0x21F2, 0x9736, 0x49DF, 0x9738, 0x1414,

+    0x9739, 0x1BE1, 0x973B, 0x21F3, 0x973D, 0x1BE2, 0x973E, 0x1BE3,

+    0x9741, 0x49E0, 0x9742, 0x1BE7, 0x9743, 0x21F4, 0x9744, 0x1BE4,

+    0x9746, 0x1BE5, 0x9747, 0x49E1, 0x9748, 0x1BE6, 0x9749, 0x1BE8,

+    0x974D, 0x21F5, 0x974E, 0x4323, 0x974F, 0x21F6, 0x9751, 0x21F7,

+    0x9752, 0x0A68, 0x9755, 0x4F5A, 0x9756, 0x0F03, 0x9757, 0x49E2,

+    0x9759, 0x0A69, 0x975A, 0x3BAB, 0x975B, 0x49E3, 0x975C, 0x1BE9,

+    0x975E, 0x0D87, 0x9760, 0x1BEA, 0x9761, 0x1D06, 0x9762, 0x0ED8,

+    0x9763, 0x3BAC, 0x9764, 0x1BEB, 0x9766, 0x1BEC, 0x9767, 0x4E03,

+    0x9768, 0x1BED, 0x9769, 0x05B5, 0x976A, 0x49E4, 0x976B, 0x1BEF,

+    0x976D, 0x0A1F, 0x976E, 0x3BAD, 0x9771, 0x1BF0, 0x9773, 0x3BAE,

+    0x9774, 0x06FA, 0x9776, 0x4E04, 0x9779, 0x1BF1, 0x977A, 0x1BF5,

+    0x977C, 0x1BF3, 0x977D, 0x4E05, 0x977F, 0x4E06, 0x9781, 0x1BF4,

+    0x9784, 0x05D1, 0x9785, 0x1BF2, 0x9786, 0x1BF6, 0x978B, 0x1BF7,

+    0x978D, 0x048C, 0x978F, 0x1BF8, 0x9790, 0x1BF9, 0x9795, 0x4324,

+    0x9796, 0x49E7, 0x9798, 0x09CC, 0x9799, 0x4E07, 0x979A, 0x3BAF,

+    0x979C, 0x1BFA, 0x979E, 0x49E8, 0x979F, 0x4E08, 0x97A0, 0x0661,

+    0x97A2, 0x3BB0, 0x97A3, 0x1BFD, 0x97A6, 0x1BFC, 0x97A8, 0x1BFB,

+    0x97AB, 0x1A34, 0x97AC, 0x4E09, 0x97AD, 0x0E2C, 0x97AE, 0x4325,

+    0x97B1, 0x49E9, 0x97B2, 0x49EA, 0x97B3, 0x1BFE, 0x97B4, 0x1BFF,

+    0x97B5, 0x3BB1, 0x97B6, 0x3BB2, 0x97B9, 0x4E0A, 0x97BA, 0x4326,

+    0x97BE, 0x49EB, 0x97C1, 0x4327, 0x97C3, 0x1C00, 0x97C6, 0x1C01,

+    0x97C8, 0x1C02, 0x97C9, 0x4328, 0x97CB, 0x1C03, 0x97CC, 0x49EC,

+    0x97CD, 0x4E0B, 0x97D1, 0x49ED, 0x97D3, 0x0616, 0x97D4, 0x49EE,

+    0x97D8, 0x49EF, 0x97D9, 0x3BB3, 0x97DB, 0x4329, 0x97DC, 0x1C04,

+    0x97DE, 0x3BB4, 0x97E0, 0x4E0C, 0x97E1, 0x49F0, 0x97ED, 0x1C05,

+    0x97EE, 0x0CD9, 0x97EF, 0x4E0D, 0x97F1, 0x49F1, 0x97F2, 0x1C07,

+    0x97F3, 0x053B, 0x97F4, 0x3BB5, 0x97F5, 0x1C0A, 0x97F6, 0x1C09,

+    0x97FB, 0x04C6, 0x97FF, 0x06B9, 0x9801, 0x0E17, 0x9802, 0x0BD6,

+    0x9803, 0x0812, 0x9804, 0x49F2, 0x9805, 0x07F2, 0x9806, 0x0971,

+    0x9807, 0x4E0E, 0x9808, 0x0A22, 0x980A, 0x3BB6, 0x980C, 0x1C0C,

+    0x980D, 0x49F3, 0x980E, 0x3BB7, 0x980F, 0x1C0B, 0x9810, 0x0F2C,

+    0x9811, 0x0624, 0x9812, 0x0D66, 0x9813, 0x0CB4, 0x9814, 0x49F4,

+    0x9816, 0x49F5, 0x9817, 0x0A42, 0x9818, 0x0F96, 0x981A, 0x0731,

+    0x981E, 0x3BB8, 0x9821, 0x1C0F, 0x9823, 0x3BB9, 0x9824, 0x1C0E,

+    0x9825, 0x49FA, 0x9826, 0x4E0F, 0x982B, 0x3BBA, 0x982C, 0x0E79,

+    0x982D, 0x0C84, 0x982E, 0x4E10, 0x9830, 0x1E73, 0x9832, 0x49F8,

+    0x9833, 0x49F9, 0x9834, 0x04F2, 0x9837, 0x1C10, 0x9838, 0x1C0D,

+    0x9839, 0x37B3, 0x983B, 0x0DC3, 0x983C, 0x0F54, 0x983D, 0x1C11,

+    0x983E, 0x3BBB, 0x9846, 0x1C12, 0x9847, 0x49FB, 0x984B, 0x1C14,

+    0x984C, 0x0B4A, 0x984D, 0x05B9, 0x984E, 0x05BA, 0x984F, 0x1C13,

+    0x9852, 0x3BBC, 0x9853, 0x3BBD, 0x9854, 0x0625, 0x9855, 0x0766,

+    0x9856, 0x432A, 0x9857, 0x21F9, 0x9858, 0x0626, 0x9859, 0x3BBE,

+    0x985A, 0x1E48, 0x985B, 0x0C39, 0x985E, 0x0FA8, 0x9862, 0x4E11,

+    0x9863, 0x4E12, 0x9865, 0x21FA, 0x9866, 0x49FC, 0x9867, 0x0790,

+    0x986B, 0x1C15, 0x986C, 0x3BBF, 0x986F, 0x1C16, 0x9870, 0x1C17,

+    0x9871, 0x1C18, 0x9873, 0x1C1A, 0x9874, 0x1C19, 0x98A8, 0x0DE9,

+    0x98AA, 0x1C1B, 0x98AB, 0x49FD, 0x98AD, 0x49FE, 0x98AF, 0x1C1C,

+    0x98B0, 0x49FF, 0x98B1, 0x1C1D, 0x98B4, 0x4E13, 0x98B6, 0x1C1E,

+    0x98B7, 0x4A01, 0x98B8, 0x3BC0, 0x98BA, 0x3BC1, 0x98BB, 0x4A02,

+    0x98BC, 0x4A03, 0x98BF, 0x3BC2, 0x98C2, 0x4A04, 0x98C3, 0x1C20,

+    0x98C4, 0x1C1F, 0x98C5, 0x4E14, 0x98C6, 0x1C21, 0x98C7, 0x4A05,

+    0x98C8, 0x3BC3, 0x98CB, 0x4A06, 0x98DB, 0x0D88, 0x98DC, 0x1839,

+    0x98DF, 0x09EF, 0x98E0, 0x3618, 0x98E1, 0x4A07, 0x98E2, 0x064C,

+    0x98E3, 0x4A08, 0x98E5, 0x3BC4, 0x98E7, 0x432B, 0x98E9, 0x1C22,

+    0x98EA, 0x4A09, 0x98EB, 0x1C23, 0x98ED, 0x10C1, 0x98EE, 0x14DA,

+    0x98EF, 0x0D67, 0x98F0, 0x4A0A, 0x98F1, 0x4A0B, 0x98F2, 0x04BF,

+    0x98F3, 0x4A0C, 0x98F4, 0x047F, 0x98FC, 0x08C2, 0x98FD, 0x0E5E,

+    0x98FE, 0x09E6, 0x9902, 0x4E15, 0x9903, 0x1C24, 0x9905, 0x0EEB,

+    0x9908, 0x4A0D, 0x9909, 0x1C25, 0x990A, 0x0F46, 0x990C, 0x04E4,

+    0x9910, 0x088F, 0x9911, 0x4E16, 0x9912, 0x1C26, 0x9913, 0x056E,

+    0x9914, 0x1C27, 0x9915, 0x4E17, 0x9916, 0x4A10, 0x9917, 0x4A11,

+    0x9918, 0x1C28, 0x991A, 0x4A13, 0x991B, 0x4A14, 0x991C, 0x4A15,

+    0x991D, 0x1C2A, 0x991E, 0x1C2B, 0x9920, 0x1C2D, 0x9921, 0x1C29,

+    0x9924, 0x1C2C, 0x9927, 0x21FD, 0x9928, 0x0617, 0x992C, 0x1C2E,

+    0x992E, 0x1C2F, 0x9931, 0x4A17, 0x9932, 0x3BC5, 0x9933, 0x3BC6,

+    0x9935, 0x4E18, 0x993A, 0x4A18, 0x993B, 0x4A19, 0x993C, 0x4A1A,

+    0x993D, 0x1C30, 0x993E, 0x1C31, 0x9940, 0x3BC7, 0x9941, 0x4A1B,

+    0x9942, 0x1C32, 0x9945, 0x1C34, 0x9946, 0x4A1C, 0x9948, 0x4E19,

+    0x9949, 0x1C33, 0x994B, 0x1C36, 0x994C, 0x1C39, 0x994D, 0x3BC8,

+    0x994E, 0x4A1D, 0x9950, 0x1C35, 0x9951, 0x1C37, 0x9952, 0x1C38,

+    0x9954, 0x4E1A, 0x9955, 0x1C3A, 0x9957, 0x06BA, 0x9958, 0x432C,

+    0x995C, 0x3BC9, 0x995E, 0x4E1B, 0x995F, 0x3BCA, 0x9960, 0x4A1E,

+    0x9996, 0x091F, 0x9997, 0x1C3B, 0x9998, 0x1C3C, 0x9999, 0x07F3,

+    0x999E, 0x21FF, 0x99A3, 0x4A1F, 0x99A5, 0x1C3D, 0x99A6, 0x4A20,

+    0x99A8, 0x059C, 0x99AC, 0x0D05, 0x99AD, 0x1C3E, 0x99AE, 0x1C3F,

+    0x99B1, 0x3BCB, 0x99B3, 0x0B98, 0x99B4, 0x0CC3, 0x99B9, 0x3BCC,

+    0x99BA, 0x3BCD, 0x99BC, 0x1C40, 0x99BD, 0x4A21, 0x99BF, 0x4A22,

+    0x99C1, 0x0D33, 0x99C3, 0x4A23, 0x99C4, 0x0B2C, 0x99C5, 0x04FA,

+    0x99C6, 0x06E6, 0x99C8, 0x06E7, 0x99C9, 0x3BCE, 0x99D0, 0x0BB1,

+    0x99D1, 0x1C45, 0x99D2, 0x06E8, 0x99D4, 0x4A24, 0x99D5, 0x056F,

+    0x99D8, 0x1C44, 0x99D9, 0x4A25, 0x99DB, 0x1C42, 0x99DD, 0x1C43,

+    0x99DE, 0x4A26, 0x99DF, 0x1C41, 0x99E1, 0x4E1C, 0x99E2, 0x1C4F,

+    0x99ED, 0x1C46, 0x99EE, 0x1C47, 0x99F0, 0x4A28, 0x99F1, 0x1C48,

+    0x99F2, 0x1C49, 0x99F8, 0x1C4B, 0x99F9, 0x4A29, 0x99FB, 0x1C4A,

+    0x99FC, 0x4A2A, 0x99FF, 0x0963, 0x9A01, 0x1C4C, 0x9A02, 0x3BCF,

+    0x9A03, 0x432D, 0x9A05, 0x1C4E, 0x9A08, 0x37BA, 0x9A0A, 0x4A2B,

+    0x9A0C, 0x4E1D, 0x9A0E, 0x064D, 0x9A0F, 0x1C4D, 0x9A10, 0x4E1E,

+    0x9A11, 0x4A2C, 0x9A12, 0x0AFD, 0x9A13, 0x0767, 0x9A16, 0x3BD0,

+    0x9A19, 0x1C50, 0x9A1A, 0x4A2D, 0x9A20, 0x4A2E, 0x9A23, 0x4E1F,

+    0x9A24, 0x3BD1, 0x9A27, 0x3BD2, 0x9A28, 0x0B2D, 0x9A2B, 0x1C51,

+    0x9A2D, 0x3BD3, 0x9A2E, 0x3BD4, 0x9A30, 0x0C85, 0x9A31, 0x4A2F,

+    0x9A36, 0x3BD5, 0x9A37, 0x1C52, 0x9A38, 0x3BD6, 0x9A3E, 0x1C57,

+    0x9A40, 0x1C55, 0x9A41, 0x4E20, 0x9A42, 0x1C54, 0x9A43, 0x1C56,

+    0x9A44, 0x4A30, 0x9A45, 0x1C53, 0x9A4A, 0x3BD7, 0x9A4C, 0x4A31,

+    0x9A4D, 0x1C59, 0x9A4E, 0x2200, 0x9A51, 0x4E21, 0x9A52, 0x1E2F,

+    0x9A55, 0x1C58, 0x9A56, 0x3BD8, 0x9A57, 0x1C5B, 0x9A58, 0x4A32,

+    0x9A5A, 0x06BB, 0x9A5B, 0x1C5A, 0x9A5F, 0x1C5C, 0x9A62, 0x1C5D,

+    0x9A64, 0x1C5F, 0x9A65, 0x1C5E, 0x9A69, 0x1C60, 0x9A6A, 0x1C62,

+    0x9A6B, 0x1C61, 0x9AA8, 0x080E, 0x9AAD, 0x1C63, 0x9AAF, 0x4A34,

+    0x9AB0, 0x1C64, 0x9AB5, 0x3BD9, 0x9AB6, 0x3BDA, 0x9AB7, 0x4A36,

+    0x9AB8, 0x059A, 0x9AB9, 0x4A38, 0x9ABC, 0x1C65, 0x9ABD, 0x4E22,

+    0x9ABE, 0x4E23, 0x9AC0, 0x1C66, 0x9AC1, 0x432E, 0x9AC3, 0x432F,

+    0x9AC4, 0x0A37, 0x9AC6, 0x4A3A, 0x9ACE, 0x4330, 0x9ACF, 0x1C67,

+    0x9AD0, 0x4A3B, 0x9AD1, 0x1C68, 0x9AD2, 0x4A3C, 0x9AD3, 0x1C69,

+    0x9AD4, 0x1C6A, 0x9AD5, 0x4A3D, 0x9AD6, 0x4331, 0x9AD8, 0x07F4,

+    0x9AD9, 0x2201, 0x9ADC, 0x2202, 0x9ADE, 0x1C6B, 0x9ADF, 0x1C6C,

+    0x9AE0, 0x4A3E, 0x9AE2, 0x1C6D, 0x9AE3, 0x1C6E, 0x9AE5, 0x4A3F,

+    0x9AE6, 0x1C6F, 0x9AE9, 0x4A40, 0x9AEA, 0x0D45, 0x9AEB, 0x1C71,

+    0x9AED, 0x0D98, 0x9AEE, 0x1C72, 0x9AEF, 0x1C70, 0x9AF1, 0x1C74,

+    0x9AF4, 0x1C73, 0x9AF7, 0x1C75, 0x9AF9, 0x3BDB, 0x9AFB, 0x1C76,

+    0x9B01, 0x4E24, 0x9B02, 0x4332, 0x9B03, 0x3BDC, 0x9B06, 0x1C77,

+    0x9B08, 0x4333, 0x9B09, 0x4E25, 0x9B0B, 0x4E26, 0x9B0C, 0x4A41,

+    0x9B0D, 0x4E27, 0x9B0E, 0x4E28, 0x9B10, 0x4A42, 0x9B12, 0x4A43,

+    0x9B16, 0x4A44, 0x9B18, 0x1C78, 0x9B19, 0x4E29, 0x9B1A, 0x1C79,

+    0x9B1C, 0x4A45, 0x9B1D, 0x4F49, 0x9B1F, 0x1C7A, 0x9B20, 0x3BDD,

+    0x9B22, 0x1C7B, 0x9B23, 0x1C7C, 0x9B25, 0x1C7D, 0x9B27, 0x1C7E,

+    0x9B28, 0x1C7F, 0x9B29, 0x1C80, 0x9B2A, 0x1C81, 0x9B2B, 0x4A46,

+    0x9B2C, 0x4F4A, 0x9B2D, 0x4335, 0x9B2E, 0x1C82, 0x9B2F, 0x1C83,

+    0x9B31, 0x14D4, 0x9B32, 0x1C84, 0x9B33, 0x3BDE, 0x9B34, 0x3BDF,

+    0x9B35, 0x4E2A, 0x9B3B, 0x17A9, 0x9B3C, 0x064E, 0x9B3D, 0x4A47,

+    0x9B41, 0x057F, 0x9B42, 0x0822, 0x9B43, 0x1C86, 0x9B44, 0x1C85,

+    0x9B45, 0x0EB1, 0x9B48, 0x4E2B, 0x9B4B, 0x4A49, 0x9B4D, 0x1C88,

+    0x9B4E, 0x1C89, 0x9B4F, 0x1C87, 0x9B51, 0x1C8A, 0x9B54, 0x0E90,

+    0x9B55, 0x4E2C, 0x9B58, 0x1C8B, 0x9B5A, 0x0695, 0x9B5E, 0x4336,

+    0x9B63, 0x4A4A, 0x9B65, 0x4A4B, 0x9B66, 0x4337, 0x9B68, 0x4E2D,

+    0x9B6B, 0x4A4C, 0x9B6C, 0x4A4D, 0x9B6F, 0x0FCB, 0x9B72, 0x2204,

+    0x9B73, 0x3BE0, 0x9B74, 0x1C8C, 0x9B75, 0x2203, 0x9B76, 0x4A4E,

+    0x9B77, 0x4A4F, 0x9B79, 0x3BE1, 0x9B80, 0x4E2E, 0x9B83, 0x1C8E,

+    0x9B84, 0x4338, 0x9B86, 0x4E2F, 0x9B8A, 0x4339, 0x9B8E, 0x0482,

+    0x9B8F, 0x2205, 0x9B90, 0x4E30, 0x9B91, 0x1C8F, 0x9B92, 0x0DFB,

+    0x9B93, 0x1C8D, 0x9B96, 0x1C90, 0x9B97, 0x1C91, 0x9B9D, 0x4E31,

+    0x9B9E, 0x433A, 0x9B9F, 0x1C92, 0x9BA0, 0x1C93, 0x9BA6, 0x4A50,

+    0x9BA7, 0x3BE2, 0x9BA8, 0x1C94, 0x9BAA, 0x0E9C, 0x9BAB, 0x087B,

+    0x9BAC, 0x4A51, 0x9BAD, 0x086A, 0x9BAE, 0x0AB1, 0x9BB0, 0x4E32,

+    0x9BB1, 0x2206, 0x9BB2, 0x4A53, 0x9BB4, 0x1C95, 0x9BB8, 0x4A54,

+    0x9BB9, 0x1C98, 0x9BBB, 0x2207, 0x9BBE, 0x4A55, 0x9BBF, 0x4E33,

+    0x9BC0, 0x1C96, 0x9BC1, 0x3BE3, 0x9BC6, 0x1C99, 0x9BC7, 0x3BE4,

+    0x9BC8, 0x4E34, 0x9BC9, 0x07A5, 0x9BCA, 0x1C97, 0x9BCE, 0x433B,

+    0x9BCF, 0x1C9A, 0x9BD1, 0x1C9B, 0x9BD2, 0x1C9C, 0x9BD4, 0x1CA0,

+    0x9BD6, 0x0878, 0x9BD7, 0x3BE5, 0x9BD8, 0x4A57, 0x9BDB, 0x0B44,

+    0x9BDD, 0x4A58, 0x9BDF, 0x37BF, 0x9BE1, 0x1CA1, 0x9BE2, 0x1C9E,

+    0x9BE3, 0x1C9D, 0x9BE4, 0x1C9F, 0x9BE5, 0x433C, 0x9BE7, 0x3BE6,

+    0x9BE8, 0x0735, 0x9BEA, 0x4A59, 0x9BEB, 0x3BE7, 0x9BEE, 0x4A5B,

+    0x9BEF, 0x4A5A, 0x9BF0, 0x1CA5, 0x9BF1, 0x1CA4, 0x9BF2, 0x1CA3,

+    0x9BF3, 0x4A56, 0x9BF5, 0x0477, 0x9BF7, 0x3BE8, 0x9BF8, 0x433D,

+    0x9BFA, 0x3BE9, 0x9BFD, 0x3BEA, 0x9BFF, 0x4E35, 0x9C00, 0x2208,

+    0x9C02, 0x4E36, 0x9C04, 0x1CAF, 0x9C06, 0x1CAB, 0x9C08, 0x1CAC,

+    0x9C09, 0x1CA8, 0x9C0A, 0x1CAE, 0x9C0B, 0x3BEB, 0x9C0C, 0x1CAA,

+    0x9C0D, 0x05C0, 0x9C10, 0x0FF2, 0x9C12, 0x1CAD, 0x9C13, 0x1CA9,

+    0x9C14, 0x1CA7, 0x9C15, 0x1CA6, 0x9C16, 0x4A5F, 0x9C18, 0x4A60,

+    0x9C19, 0x4A61, 0x9C1A, 0x4A62, 0x9C1B, 0x1CB1, 0x9C1C, 0x4E37,

+    0x9C1D, 0x4A63, 0x9C21, 0x1CB4, 0x9C22, 0x4A64, 0x9C23, 0x433E,

+    0x9C24, 0x1CB3, 0x9C25, 0x1CB2, 0x9C27, 0x3BEC, 0x9C29, 0x4A65,

+    0x9C2A, 0x3BED, 0x9C2D, 0x0DBB, 0x9C2E, 0x1CB0, 0x9C2F, 0x04B7,

+    0x9C30, 0x1CB5, 0x9C31, 0x4A67, 0x9C32, 0x1CB7, 0x9C35, 0x4E38,

+    0x9C36, 0x3BEE, 0x9C37, 0x4A68, 0x9C39, 0x05CD, 0x9C3A, 0x1CA2,

+    0x9C3B, 0x04D9, 0x9C3E, 0x1CB9, 0x9C41, 0x3BEF, 0x9C44, 0x4E39,

+    0x9C45, 0x4A69, 0x9C46, 0x1CB8, 0x9C47, 0x1CB6, 0x9C48, 0x0B6B,

+    0x9C49, 0x4A6C, 0x9C4A, 0x4A6D, 0x9C4F, 0x433F, 0x9C50, 0x4340,

+    0x9C52, 0x0E9E, 0x9C53, 0x3BF0, 0x9C54, 0x4A6F, 0x9C56, 0x4E3A,

+    0x9C57, 0x0FA2, 0x9C58, 0x4A70, 0x9C5A, 0x1CBA, 0x9C5B, 0x4A71,

+    0x9C5C, 0x4A6A, 0x9C5D, 0x4A72, 0x9C5F, 0x4A73, 0x9C60, 0x1CBB,

+    0x9C61, 0x4E3B, 0x9C63, 0x3BF1, 0x9C65, 0x4341, 0x9C67, 0x1CBC,

+    0x9C68, 0x4E3C, 0x9C69, 0x4A74, 0x9C6A, 0x4A75, 0x9C6B, 0x4A76,

+    0x9C6D, 0x4A77, 0x9C6E, 0x4A78, 0x9C70, 0x3BF2, 0x9C72, 0x4A79,

+    0x9C75, 0x4A7A, 0x9C76, 0x1CBD, 0x9C77, 0x3BF3, 0x9C78, 0x1CBE,

+    0x9C7A, 0x4A7B, 0x9CE5, 0x0BD7, 0x9CE6, 0x4A7C, 0x9CE7, 0x1CBF,

+    0x9CE9, 0x0D4B, 0x9CEB, 0x1CC4, 0x9CEC, 0x1CC0, 0x9CF0, 0x1CC1,

+    0x9CF2, 0x4A7D, 0x9CF3, 0x0E5F, 0x9CF4, 0x0ED0, 0x9CF6, 0x0CA8,

+    0x9D02, 0x3BF4, 0x9D03, 0x1CC5, 0x9D06, 0x1CC6, 0x9D07, 0x0C96,

+    0x9D08, 0x1CC3, 0x9D09, 0x1CC2, 0x9D0B, 0x4A7E, 0x9D0E, 0x052A,

+    0x9D11, 0x4A80, 0x9D12, 0x1CCE, 0x9D15, 0x1CCD, 0x9D17, 0x4A81,

+    0x9D18, 0x4A82, 0x9D1B, 0x0517, 0x9D1D, 0x4342, 0x9D1E, 0x4343,

+    0x9D1F, 0x1CCB, 0x9D23, 0x1CCA, 0x9D26, 0x1CC8, 0x9D28, 0x05D9,

+    0x9D2A, 0x1CC7, 0x9D2B, 0x08DE, 0x9D2C, 0x0529, 0x9D30, 0x4E3D,

+    0x9D32, 0x4A86, 0x9D3B, 0x07F5, 0x9D3D, 0x4E3E, 0x9D3E, 0x1CD1,

+    0x9D3F, 0x1CD0, 0x9D41, 0x1CCF, 0x9D42, 0x3BF5, 0x9D43, 0x4344,

+    0x9D44, 0x1CCC, 0x9D46, 0x1CD2, 0x9D47, 0x3BF6, 0x9D48, 0x1CD3,

+    0x9D4A, 0x4A88, 0x9D50, 0x1CD8, 0x9D51, 0x1CD7, 0x9D52, 0x4345,

+    0x9D59, 0x1CD9, 0x9D5C, 0x04CF, 0x9D5D, 0x1CD4, 0x9D5E, 0x1CD5,

+    0x9D5F, 0x4A89, 0x9D60, 0x0806, 0x9D61, 0x0EC5, 0x9D62, 0x4A8A,

+    0x9D63, 0x3BF7, 0x9D64, 0x1CD6, 0x9D69, 0x3BF8, 0x9D6A, 0x4E3F,

+    0x9D6B, 0x220A, 0x9D6C, 0x0E60, 0x9D6F, 0x1CDE, 0x9D70, 0x2209,

+    0x9D72, 0x1CDA, 0x9D73, 0x4A8D, 0x9D76, 0x4A8E, 0x9D77, 0x4A8F,

+    0x9D7A, 0x1CDF, 0x9D7B, 0x4E40, 0x9D7C, 0x3BF9, 0x9D7E, 0x3BFA,

+    0x9D84, 0x4A90, 0x9D87, 0x1CDC, 0x9D89, 0x1CDB, 0x9D8A, 0x4346,

+    0x9D8D, 0x3BFB, 0x9D8F, 0x0732, 0x9D96, 0x4347, 0x9D99, 0x4A91,

+    0x9D9A, 0x1CE0, 0x9DA1, 0x4A92, 0x9DA4, 0x1CE1, 0x9DA9, 0x1CE2,

+    0x9DAB, 0x1CDD, 0x9DAC, 0x4349, 0x9DAF, 0x1CC9, 0x9DB1, 0x3BFC,

+    0x9DB2, 0x1CE3, 0x9DB4, 0x0BFD, 0x9DB5, 0x4A94, 0x9DB8, 0x1CE7,

+    0x9DB9, 0x4A95, 0x9DBA, 0x1CE8, 0x9DBB, 0x1CE6, 0x9DBC, 0x434A,

+    0x9DBD, 0x4A96, 0x9DBF, 0x4A93, 0x9DC0, 0x4348, 0x9DC1, 0x1CE5,

+    0x9DC2, 0x1CEB, 0x9DC3, 0x3BFD, 0x9DC4, 0x1CE4, 0x9DC6, 0x1CE9,

+    0x9DC7, 0x3BFE, 0x9DC9, 0x4A97, 0x9DCF, 0x1CEA, 0x9DD3, 0x1CED,

+    0x9DD6, 0x3BFF, 0x9DD7, 0x1DDE, 0x9DD9, 0x1CEC, 0x9DDA, 0x4A98,

+    0x9DDF, 0x3C00, 0x9DE0, 0x4A99, 0x9DE3, 0x4A9A, 0x9DE5, 0x4E41,

+    0x9DE6, 0x1CEF, 0x9DE7, 0x434C, 0x9DE9, 0x4E42, 0x9DEB, 0x3C01,

+    0x9DED, 0x1CF0, 0x9DEF, 0x1CF1, 0x9DF2, 0x0FEF, 0x9DF3, 0x4E43,

+    0x9DF4, 0x3C02, 0x9DF8, 0x1CEE, 0x9DF9, 0x0B4B, 0x9DFA, 0x085D,

+    0x9DFD, 0x1CF2, 0x9E02, 0x4A9D, 0x9E07, 0x434D, 0x9E0A, 0x4A9C,

+    0x9E0D, 0x4A9E, 0x9E15, 0x3C03, 0x9E19, 0x220C, 0x9E1A, 0x1CF3,

+    0x9E1B, 0x1CF4, 0x9E1C, 0x4A9F, 0x9E1D, 0x3C04, 0x9E1E, 0x1CF5,

+    0x9E75, 0x1CF6, 0x9E78, 0x0768, 0x9E79, 0x1CF7, 0x9E7A, 0x4E44,

+    0x9E7B, 0x4AA0, 0x9E7C, 0x1DFD, 0x9E7D, 0x1CF8, 0x9E7F, 0x08DB,

+    0x9E80, 0x4AA2, 0x9E81, 0x1CF9, 0x9E82, 0x4E45, 0x9E83, 0x4E46,

+    0x9E84, 0x4E47, 0x9E85, 0x4AA3, 0x9E88, 0x1CFA, 0x9E8B, 0x1CFB,

+    0x9E8C, 0x1CFC, 0x9E91, 0x1CFF, 0x9E92, 0x1CFD, 0x9E93, 0x0FE2,

+    0x9E95, 0x1CFE, 0x9E97, 0x0FB7, 0x9E9B, 0x4AA4, 0x9E9D, 0x1D00,

+    0x9E9E, 0x434E, 0x9E9F, 0x0FA3, 0x9EA4, 0x3C05, 0x9EA5, 0x1D01,

+    0x9EA6, 0x0D34, 0x9EA8, 0x3C06, 0x9EA9, 0x1D02, 0x9EAA, 0x1D04,

+    0x9EAC, 0x3C07, 0x9EAD, 0x1D05, 0x9EAF, 0x434F, 0x9EB0, 0x4E48,

+    0x9EB4, 0x1E02, 0x9EB5, 0x1E75, 0x9EB8, 0x1D03, 0x9EB9, 0x07FF,

+    0x9EBA, 0x0ED9, 0x9EBB, 0x0E91, 0x9EBC, 0x1284, 0x9EBD, 0x4AA6,

+    0x9EBE, 0x14FF, 0x9EBF, 0x0EA9, 0x9EC3, 0x340B, 0x9EC4, 0x052B,

+    0x9ECC, 0x1D07, 0x9ECD, 0x066A, 0x9ECE, 0x1D08, 0x9ECF, 0x1D09,

+    0x9ED0, 0x1D0A, 0x9ED1, 0x220D, 0x9ED2, 0x0807, 0x9ED4, 0x1D0B,

+    0x9ED8, 0x160D, 0x9ED9, 0x0EE7, 0x9EDB, 0x0B43, 0x9EDC, 0x1D0C,

+    0x9EDD, 0x1D0E, 0x9EDE, 0x1D0D, 0x9EDF, 0x4AA8, 0x9EE0, 0x1D0F,

+    0x9EE4, 0x4E49, 0x9EE5, 0x1D10, 0x9EE7, 0x3C08, 0x9EE8, 0x1D11,

+    0x9EEE, 0x3C09, 0x9EEF, 0x1D12, 0x9EF0, 0x4E4A, 0x9EF2, 0x4E4B,

+    0x9EF4, 0x1D13, 0x9EF6, 0x1D14, 0x9EF7, 0x1D15, 0x9EF9, 0x1D16,

+    0x9EFB, 0x1D17, 0x9EFC, 0x1D18, 0x9EFD, 0x1D19, 0x9EFF, 0x4AA9,

+    0x9F02, 0x4AAA, 0x9F03, 0x4AAC, 0x9F07, 0x1D1A, 0x9F08, 0x1D1B,

+    0x9F09, 0x4E4C, 0x9F0E, 0x0C1E, 0x9F0F, 0x4E4D, 0x9F10, 0x3C0A,

+    0x9F12, 0x3C0B, 0x9F13, 0x0791, 0x9F14, 0x4E4E, 0x9F15, 0x1D1D,

+    0x9F17, 0x3C0C, 0x9F19, 0x3C0D, 0x9F1B, 0x4E4F, 0x9F20, 0x0ACF,

+    0x9F21, 0x1D1E, 0x9F22, 0x4E50, 0x9F26, 0x4E51, 0x9F2A, 0x4E52,

+    0x9F2B, 0x4E53, 0x9F2C, 0x1D1F, 0x9F2F, 0x3C0E, 0x9F34, 0x4E54,

+    0x9F37, 0x3C0F, 0x9F39, 0x3C10, 0x9F3A, 0x4AAD, 0x9F3B, 0x0D93,

+    0x9F3D, 0x4AAE, 0x9F3E, 0x1D20, 0x9F41, 0x3C11, 0x9F45, 0x3C12,

+    0x9F46, 0x4AAF, 0x9F4A, 0x1D21, 0x9F4B, 0x170A, 0x9F4E, 0x1A7B,

+    0x9F4F, 0x1C06, 0x9F52, 0x1D22, 0x9F53, 0x4AB0, 0x9F54, 0x1D23,

+    0x9F55, 0x4AB1, 0x9F57, 0x3C13, 0x9F58, 0x4AB2, 0x9F5A, 0x4E55,

+    0x9F5D, 0x4AB4, 0x9F5F, 0x1D25, 0x9F60, 0x1D26, 0x9F61, 0x1D27,

+    0x9F62, 0x0FB8, 0x9F63, 0x1D24, 0x9F66, 0x1D28, 0x9F67, 0x1D29,

+    0x9F68, 0x3C14, 0x9F69, 0x4AB6, 0x9F6A, 0x1D2B, 0x9F6C, 0x1D2A,

+    0x9F6D, 0x4AB7, 0x9F6F, 0x4E56, 0x9F70, 0x4AB8, 0x9F71, 0x3C15,

+    0x9F72, 0x1D2D, 0x9F75, 0x3C16, 0x9F76, 0x1D2E, 0x9F77, 0x1D2C,

+    0x9F8D, 0x0F7E, 0x9F90, 0x3C17, 0x9F94, 0x3C18, 0x9F95, 0x1D2F,

+    0x9F97, 0x4350, 0x9F9C, 0x1D30, 0x9F9D, 0x1727, 0x9F9E, 0x4E57,

+    0x9FA0, 0x1D31, 0x9FA2, 0x3C19, 0x9FA5, 0x4E58, 0xF860, 0x3C54,

+    0xF861, 0x3C55, 0xF862, 0x3C56, 0xF87A, 0x3C57, 0xF87F, 0x3C58,

+    0xF909, 0x35AB, 0xF91D, 0x3450, 0xF91F, 0x3704, 0xF928, 0x4F4F,

+    0xF929, 0x4F51, 0xF936, 0x3452, 0xF95F, 0x3693, 0xF970, 0x3420,

+    0xF983, 0x3708, 0xF992, 0x1E81, 0xF993, 0x1E82, 0xF999, 0x1E83,

+    0xF99A, 0x3711, 0xF9A2, 0x370F, 0xF9C3, 0x1E80, 0xF9D0, 0x3454,

+    0xF9DC, 0x3451, 0xF9EC, 0x1E46, 0xFA03, 0x3684, 0xFA0E, 0x20DA,

+    0xFA0F, 0x20E5, 0xFA10, 0x1E42, 0xFA11, 0x37D2, 0xFA12, 0x2121,

+    0xFA13, 0x2131, 0xFA14, 0x2133, 0xFA15, 0x4F53, 0xFA16, 0x2164,

+    0xFA17, 0x217B, 0xFA18, 0x2183, 0xFA19, 0x2184, 0xFA1A, 0x2185,

+    0xFA1B, 0x2187, 0xFA1C, 0x218B, 0xFA1D, 0x218E, 0xFA1E, 0x2197,

+    0xFA1F, 0x21A2, 0xFA20, 0x21A4, 0xFA21, 0x21A5, 0xFA22, 0x21AE,

+    0xFA23, 0x21B6, 0xFA24, 0x4948, 0xFA25, 0x21B9, 0xFA26, 0x21BC,

+    0xFA27, 0x21D8, 0xFA28, 0x21DF, 0xFA29, 0x21EF, 0xFA2A, 0x21FB,

+    0xFA2B, 0x21FC, 0xFA2C, 0x21FE, 0xFA2D, 0x220B, 0xFA30, 0x3446,

+    0xFA31, 0x3430, 0xFA32, 0x344D, 0xFA33, 0x3449, 0xFA34, 0x341A,

+    0xFA35, 0x3442, 0xFA36, 0x1DE3, 0xFA37, 0x3436, 0xFA38, 0x3415,

+    0xFA39, 0x3448, 0xFA3A, 0x344B, 0xFA3B, 0x3431, 0xFA3C, 0x41C5,

+    0xFA3D, 0x340E, 0xFA3E, 0x3410, 0xFA3F, 0x3433, 0xFA40, 0x3439,

+    0xFA41, 0x3445, 0xFA42, 0x3416, 0xFA43, 0x3428, 0xFA44, 0x343F,

+    0xFA45, 0x340F, 0xFA46, 0x1E14, 0xFA47, 0x3414, 0xFA48, 0x3423,

+    0xFA49, 0x3C26, 0xFA4A, 0x1E34, 0xFA4B, 0x3443, 0xFA4C, 0x3424,

+    0xFA4D, 0x3421, 0xFA4E, 0x3417, 0xFA4F, 0x344F, 0xFA50, 0x342F,

+    0xFA51, 0x3427, 0xFA52, 0x340D, 0xFA53, 0x343B, 0xFA54, 0x341F,

+    0xFA55, 0x343D, 0xFA56, 0x342E, 0xFA57, 0x3457, 0xFA58, 0x47BE,

+    0xFA59, 0x3440, 0xFA5A, 0x3429, 0xFA5B, 0x3425, 0xFA5C, 0x3426,

+    0xFA5D, 0x3777, 0xFA5E, 0x3776, 0xFA5F, 0x3437, 0xFA60, 0x3413,

+    0xFA61, 0x3422, 0xFA62, 0x3409, 0xFA63, 0x341B, 0xFA64, 0x3444,

+    0xFA65, 0x3434, 0xFA66, 0x3C2B, 0xFA67, 0x3408, 0xFA68, 0x343E,

+    0xFA69, 0x3419, 0xFA6A, 0x1E6C, 0xFB00, 0x248E, 0xFB01, 0x0070,

+    0xFB02, 0x0071, 0xFB03, 0x248F, 0xFB04, 0x2490, 0xFE30, 0x1EDA,

+    0xFE31, 0x1ED4, 0xFE32, 0x1ED5, 0xFE33, 0x1ED2, 0xFE35, 0x1EDB,

+    0xFE36, 0x1EDC, 0xFE37, 0x1EE1, 0xFE38, 0x1EE2, 0xFE39, 0x1EDD,

+    0xFE3A, 0x1EDE, 0xFE3B, 0x1EEB, 0xFE3C, 0x1EEC, 0xFE3D, 0x1EE5,

+    0xFE3E, 0x1EE6, 0xFE3F, 0x1EE3, 0xFE40, 0x1EE4, 0xFE41, 0x1EE7,

+    0xFE42, 0x1EE8, 0xFE43, 0x1EE9, 0xFE44, 0x1EEA, 0xFE45, 0x315F,

+    0xFE46, 0x3160, 0xFE47, 0x1EDF, 0xFE48, 0x1EE0, 0xFF01, 0x0282,

+    0xFF02, 0x1F47, 0xFF03, 0x02CC, 0xFF04, 0x02C8, 0xFF05, 0x02CB,

+    0xFF06, 0x02CD, 0xFF07, 0x1F46, 0xFF08, 0x02A2, 0xFF09, 0x02A3,

+    0xFF0A, 0x02CE, 0xFF0B, 0x02B4, 0xFF0C, 0x027C, 0xFF0D, 0x02B5,

+    0xFF0E, 0x027D, 0xFF0F, 0x0297, 0xFF10, 0x030C, 0xFF11, 0x030D,

+    0xFF12, 0x030E, 0xFF13, 0x030F, 0xFF14, 0x0310, 0xFF15, 0x0311,

+    0xFF16, 0x0312, 0xFF17, 0x0313, 0xFF18, 0x0314, 0xFF19, 0x0315,

+    0xFF1A, 0x027F, 0xFF1B, 0x0280, 0xFF1C, 0x02BB, 0xFF1D, 0x02B9,

+    0xFF1E, 0x02BC, 0xFF1F, 0x0281, 0xFF20, 0x02CF, 0xFF21, 0x0316,

+    0xFF22, 0x0317, 0xFF23, 0x0318, 0xFF24, 0x0319, 0xFF25, 0x031A,

+    0xFF26, 0x031B, 0xFF27, 0x031C, 0xFF28, 0x031D, 0xFF29, 0x031E,

+    0xFF2A, 0x031F, 0xFF2B, 0x0320, 0xFF2C, 0x0321, 0xFF2D, 0x0322,

+    0xFF2E, 0x0323, 0xFF2F, 0x0324, 0xFF30, 0x0325, 0xFF31, 0x0326,

+    0xFF32, 0x0327, 0xFF33, 0x0328, 0xFF34, 0x0329, 0xFF35, 0x032A,

+    0xFF36, 0x032B, 0xFF37, 0x032C, 0xFF38, 0x032D, 0xFF39, 0x032E,

+    0xFF3A, 0x032F, 0xFF3B, 0x02A6, 0xFF3C, 0x0298, 0xFF3D, 0x02A7,

+    0xFF3E, 0x0288, 0xFF3F, 0x028A, 0xFF40, 0x0286, 0xFF41, 0x0330,

+    0xFF42, 0x0331, 0xFF43, 0x0332, 0xFF44, 0x0333, 0xFF45, 0x0334,

+    0xFF46, 0x0335, 0xFF47, 0x0336, 0xFF48, 0x0337, 0xFF49, 0x0338,

+    0xFF4A, 0x0339, 0xFF4B, 0x033A, 0xFF4C, 0x033B, 0xFF4D, 0x033C,

+    0xFF4E, 0x033D, 0xFF4F, 0x033E, 0xFF50, 0x033F, 0xFF51, 0x0340,

+    0xFF52, 0x0341, 0xFF53, 0x0342, 0xFF54, 0x0343, 0xFF55, 0x0344,

+    0xFF56, 0x0345, 0xFF57, 0x0346, 0xFF58, 0x0347, 0xFF59, 0x0348,

+    0xFF5A, 0x0349, 0xFF5B, 0x02A8, 0xFF5C, 0x029B, 0xFF5D, 0x02A9,

+    0xFF5E, 0x0299, 0xFF5F, 0x2F63, 0xFF60, 0x2F64, 0xFF61, 0x0147,

+    0xFF62, 0x0148, 0xFF63, 0x0149, 0xFF64, 0x014A, 0xFF65, 0x014B,

+    0xFF66, 0x014C, 0xFF67, 0x014D, 0xFF68, 0x014E, 0xFF69, 0x014F,

+    0xFF6A, 0x0150, 0xFF6B, 0x0151, 0xFF6C, 0x0152, 0xFF6D, 0x0153,

+    0xFF6E, 0x0154, 0xFF6F, 0x0155, 0xFF70, 0x0156, 0xFF71, 0x0157,

+    0xFF72, 0x0158, 0xFF73, 0x0159, 0xFF74, 0x015A, 0xFF75, 0x015B,

+    0xFF76, 0x015C, 0xFF77, 0x015D, 0xFF78, 0x015E, 0xFF79, 0x015F,

+    0xFF7A, 0x0160, 0xFF7B, 0x0161, 0xFF7C, 0x0162, 0xFF7D, 0x0163,

+    0xFF7E, 0x0164, 0xFF7F, 0x0165, 0xFF80, 0x0166, 0xFF81, 0x0167,

+    0xFF82, 0x0168, 0xFF83, 0x0169, 0xFF84, 0x016A, 0xFF85, 0x016B,

+    0xFF86, 0x016C, 0xFF87, 0x016D, 0xFF88, 0x016E, 0xFF89, 0x016F,

+    0xFF8A, 0x0170, 0xFF8B, 0x0171, 0xFF8C, 0x0172, 0xFF8D, 0x0173,

+    0xFF8E, 0x0174, 0xFF8F, 0x0175, 0xFF90, 0x0176, 0xFF91, 0x0177,

+    0xFF92, 0x0178, 0xFF93, 0x0179, 0xFF94, 0x017A, 0xFF95, 0x017B,

+    0xFF96, 0x017C, 0xFF97, 0x017D, 0xFF98, 0x017E, 0xFF99, 0x017F,

+    0xFF9A, 0x0180, 0xFF9B, 0x0181, 0xFF9C, 0x0182, 0xFF9D, 0x0183,

+    0xFF9E, 0x0184, 0xFF9F, 0x0185, 0xFFE0, 0x02C9, 0xFFE1, 0x02CA,

+    0xFFE2, 0x02EF, 0xFFE3, 0x0289, 0xFFE4, 0x1F45, 0xFFE5, 0x02C7,

+    0xFFE8, 0x0143,

+};

+extern const unsigned short g_FXCMAP_UniJIS_UTF16_H_5_DWord[384 * 3] = {

+    0xD840, 0xDC0B, 0x360F, 0xD840, 0xDC89, 0x4351, 0xD840, 0xDC8A, 0x371C,

+    0xD840, 0xDCA2, 0x4358, 0xD840, 0xDCA4, 0x435B, 0xD840, 0xDCB0, 0x3781,

+    0xD840, 0xDCF5, 0x4E59, 0xD840, 0xDD58, 0x4E6B, 0xD840, 0xDDA2, 0x3621,

+    0xD840, 0xDE13, 0x436B, 0xD840, 0xDF2B, 0x4382, 0xD840, 0xDF71, 0x438B,

+    0xD840, 0xDF81, 0x4389, 0xD840, 0xDFF9, 0x438F, 0xD841, 0xDC4A, 0x4391,

+    0xD841, 0xDD09, 0x4393, 0xD841, 0xDDB1, 0x4E70, 0xD841, 0xDDD6, 0x439C,

+    0xD841, 0xDE11, 0x37D6, 0xD841, 0xDE28, 0x3719, 0xD841, 0xDEEC, 0x4E73,

+    0xD841, 0xDF4F, 0x43A0, 0xD842, 0xDC07, 0x43A7, 0xD842, 0xDC3A, 0x43A9,

+    0xD842, 0xDCB9, 0x43AF, 0xD842, 0xDD0E, 0x34D3, 0xD842, 0xDD7C, 0x43B3,

+    0xD842, 0xDD9D, 0x43B4, 0xD842, 0xDE64, 0x35BB, 0xD842, 0xDED3, 0x43B9,

+    0xD842, 0xDF1D, 0x43BC, 0xD842, 0xDF9F, 0x35EB, 0xD842, 0xDFB7, 0x358A,

+    0xD843, 0xDD45, 0x43CF, 0xD843, 0xDD58, 0x4E7A, 0xD843, 0xDDE1, 0x43DD,

+    0xD843, 0xDE64, 0x43EC, 0xD843, 0xDE6D, 0x43E4, 0xD843, 0xDE95, 0x43E3,

+    0xD843, 0xDF5F, 0x43EF, 0xD844, 0xDE01, 0x4406, 0xD844, 0xDE3D, 0x3681,

+    0xD844, 0xDE55, 0x4407, 0xD844, 0xDE74, 0x440D, 0xD844, 0xDE7B, 0x4409,

+    0xD844, 0xDED7, 0x4415, 0xD844, 0xDEE4, 0x4414, 0xD844, 0xDEFD, 0x441B,

+    0xD844, 0xDF1B, 0x41B0, 0xD844, 0xDF36, 0x441D, 0xD844, 0xDF44, 0x441E,

+    0xD844, 0xDFC4, 0x4429, 0xD845, 0xDC6D, 0x4436, 0xD845, 0xDC6E, 0x41B5,

+    0xD845, 0xDDD7, 0x4440, 0xD845, 0xDE47, 0x4448, 0xD845, 0xDEB4, 0x41C6,

+    0xD845, 0xDF06, 0x4454, 0xD845, 0xDF42, 0x4455, 0xD846, 0xDCBD, 0x41C1,

+    0xD846, 0xDDC3, 0x4475, 0xD846, 0xDE1A, 0x1E91, 0xD847, 0xDC56, 0x4483,

+    0xD847, 0xDD2D, 0x4488, 0xD847, 0xDD45, 0x4489, 0xD847, 0xDD62, 0x448B,

+    0xD847, 0xDD78, 0x448A, 0xD847, 0xDD92, 0x4494, 0xD847, 0xDD9C, 0x4490,

+    0xD847, 0xDDA1, 0x448F, 0xD847, 0xDDB7, 0x4497, 0xD847, 0xDDE0, 0x4499,

+    0xD847, 0xDE33, 0x449A, 0xD847, 0xDE34, 0x41CD, 0xD847, 0xDF1E, 0x44A7,

+    0xD847, 0xDF76, 0x44AE, 0xD847, 0xDFFA, 0x44B1, 0xD848, 0xDD7B, 0x44BF,

+    0xD848, 0xDE18, 0x4AA1, 0xD848, 0xDF1E, 0x44C5, 0xD848, 0xDFAD, 0x44C8,

+    0xD849, 0xDE09, 0x3C53, 0xD849, 0xDEF3, 0x44E0, 0xD84A, 0xDC5B, 0x44EF,

+    0xD84A, 0xDCAB, 0x44F5, 0xD84A, 0xDD8F, 0x44F9, 0xD84A, 0xDEB8, 0x4503,

+    0xD84A, 0xDF46, 0x4510, 0xD84A, 0xDF4F, 0x4507, 0xD84A, 0xDF50, 0x4508,

+    0xD84A, 0xDFA6, 0x4513, 0xD84B, 0xDC1D, 0x4512, 0xD84B, 0xDC24, 0x4516,

+    0xD84B, 0xDDE1, 0x452E, 0xD84B, 0xDE42, 0x4E9C, 0xD84B, 0xDFEB, 0x4EA2,

+    0xD84C, 0xDDB6, 0x4550, 0xD84C, 0xDDC3, 0x454E, 0xD84C, 0xDDC4, 0x41F8,

+    0xD84C, 0xDDF5, 0x454F, 0xD84C, 0xDF72, 0x4561, 0xD84C, 0xDFD0, 0x4568,

+    0xD84C, 0xDFD2, 0x4564, 0xD84C, 0xDFD3, 0x4563, 0xD84C, 0xDFD5, 0x456A,

+    0xD84C, 0xDFDA, 0x456C, 0xD84C, 0xDFDF, 0x456E, 0xD84C, 0xDFE4, 0x4569,

+    0xD84C, 0xDFFE, 0x3C3E, 0xD84D, 0xDC4A, 0x4576, 0xD84D, 0xDC4B, 0x4578,

+    0xD84D, 0xDC51, 0x4577, 0xD84D, 0xDC65, 0x457C, 0xD84D, 0xDCE4, 0x4596,

+    0xD84D, 0xDD5A, 0x4597, 0xD84D, 0xDD94, 0x45A3, 0xD84D, 0xDDC4, 0x4209,

+    0xD84D, 0xDE38, 0x45B3, 0xD84D, 0xDE39, 0x45B1, 0xD84D, 0xDE3A, 0x3C21,

+    0xD84D, 0xDE47, 0x45B2, 0xD84D, 0xDF0C, 0x45C7, 0xD84D, 0xDF1C, 0x45BE,

+    0xD84D, 0xDF3F, 0x4212, 0xD84D, 0xDF63, 0x4214, 0xD84D, 0xDF64, 0x45CB,

+    0xD84D, 0xDFE7, 0x45D3, 0xD84D, 0xDFFF, 0x45D2, 0xD84E, 0xDC24, 0x45D8,

+    0xD84E, 0xDC3D, 0x45DD, 0xD84E, 0xDE98, 0x45E9, 0xD84F, 0xDC7F, 0x45F6,

+    0xD84F, 0xDCBE, 0x37D5, 0xD84F, 0xDCFE, 0x3650, 0xD84F, 0xDD00, 0x4605,

+    0xD84F, 0xDD0E, 0x47DA, 0xD84F, 0xDD40, 0x4616, 0xD84F, 0xDDD3, 0x4619,

+    0xD84F, 0xDDF9, 0x4618, 0xD84F, 0xDDFA, 0x4617, 0xD84F, 0xDF7E, 0x463F,

+    0xD850, 0xDC4B, 0x4EC8, 0xD850, 0xDC96, 0x464E, 0xD850, 0xDD03, 0x4653,

+    0xD850, 0xDDC6, 0x465F, 0xD850, 0xDDFE, 0x4662, 0xD850, 0xDEEE, 0x37CA,

+    0xD850, 0xDFBC, 0x4677, 0xD850, 0xDFD0, 0x1E9E, 0xD851, 0xDE29, 0x4681,

+    0xD851, 0xDEA5, 0x4687, 0xD851, 0xDFF1, 0x424A, 0xD852, 0xDC96, 0x469D,

+    0xD852, 0xDE4D, 0x46B8, 0xD852, 0xDF56, 0x46C5, 0xD852, 0xDF6F, 0x46C7,

+    0xD853, 0xDC16, 0x46CC, 0xD853, 0xDD14, 0x36AB, 0xD853, 0xDE04, 0x4E5A,

+    0xD853, 0xDE0E, 0x46EE, 0xD853, 0xDE37, 0x46F2, 0xD853, 0xDE6A, 0x46F7,

+    0xD853, 0xDE8B, 0x46FA, 0xD853, 0xDFF2, 0x4E5B, 0xD854, 0xDC4A, 0x4705,

+    0xD854, 0xDC55, 0x4707, 0xD854, 0xDD22, 0x4709, 0xD854, 0xDDA9, 0x470E,

+    0xD854, 0xDDCD, 0x4711, 0xD854, 0xDDE5, 0x4710, 0xD854, 0xDE1E, 0x4713,

+    0xD854, 0xDE4C, 0x4715, 0xD855, 0xDC2E, 0x4721, 0xD855, 0xDC8E, 0x426D,

+    0xD855, 0xDCD9, 0x4729, 0xD855, 0xDD0E, 0x4271, 0xD855, 0xDDA7, 0x4735,

+    0xD855, 0xDE7F, 0x36FB, 0xD855, 0xDF71, 0x427A, 0xD855, 0xDFA9, 0x4748,

+    0xD855, 0xDFB4, 0x4749, 0xD856, 0xDC74, 0x1DF6, 0xD856, 0xDDC4, 0x4280,

+    0xD856, 0xDDCC, 0x4E90, 0xD856, 0xDDD4, 0x475C, 0xD856, 0xDEE3, 0x4765,

+    0xD856, 0xDEE4, 0x4764, 0xD856, 0xDEF1, 0x4766, 0xD856, 0xDFB2, 0x4775,

+    0xD857, 0xDC4B, 0x477E, 0xD857, 0xDC64, 0x477F, 0xD857, 0xDDA1, 0x4289,

+    0xD857, 0xDE2E, 0x478E, 0xD857, 0xDE56, 0x478F, 0xD857, 0xDE62, 0x4792,

+    0xD857, 0xDE65, 0x4790, 0xD857, 0xDEC2, 0x4797, 0xD857, 0xDED8, 0x4795,

+    0xD857, 0xDEE8, 0x4799, 0xD857, 0xDF23, 0x479A, 0xD857, 0xDF5C, 0x479C,

+    0xD857, 0xDFD4, 0x47A3, 0xD857, 0xDFE0, 0x47A2, 0xD857, 0xDFFB, 0x47A9,

+    0xD858, 0xDC0C, 0x47A8, 0xD858, 0xDC17, 0x47B0, 0xD858, 0xDC60, 0x47B3,

+    0xD858, 0xDCED, 0x47BD, 0xD858, 0xDE70, 0x47D1, 0xD858, 0xDE86, 0x47D2,

+    0xD858, 0xDF4C, 0x4F57, 0xD859, 0xDC02, 0x47DE, 0xD859, 0xDE7E, 0x47F0,

+    0xD859, 0xDEB0, 0x3714, 0xD859, 0xDF1D, 0x47FE, 0xD85A, 0xDCDD, 0x480C,

+    0xD85A, 0xDCEA, 0x480E, 0xD85A, 0xDD51, 0x354E, 0xD85A, 0xDD6F, 0x4812,

+    0xD85A, 0xDD99, 0x3736, 0xD85A, 0xDDDD, 0x4814, 0xD85A, 0xDE1E, 0x4817,

+    0xD85A, 0xDE58, 0x481B, 0xD85A, 0xDE8C, 0x481F, 0xD85A, 0xDEB7, 0x4822,

+    0xD85A, 0xDEFF, 0x42A7, 0xD85B, 0xDC29, 0x4446, 0xD85B, 0xDC73, 0x484A,

+    0xD85B, 0xDC9E, 0x4EEE, 0xD85B, 0xDCDD, 0x4853, 0xD85B, 0xDE40, 0x42C1,

+    0xD85B, 0xDE65, 0x4860, 0xD85B, 0xDF94, 0x4870, 0xD85B, 0xDFF6, 0x487A,

+    0xD85B, 0xDFF7, 0x487B, 0xD85B, 0xDFF8, 0x4879, 0xD85C, 0xDCF4, 0x42CF,

+    0xD85C, 0xDD0D, 0x488B, 0xD85C, 0xDD39, 0x488E, 0xD85C, 0xDFDA, 0x48B3,

+    0xD85C, 0xDFDB, 0x48B2, 0xD85C, 0xDFFE, 0x48B9, 0xD85D, 0xDC10, 0x48BC,

+    0xD85D, 0xDC49, 0x48C0, 0xD85D, 0xDE14, 0x48CE, 0xD85D, 0xDE15, 0x48CD,

+    0xD85D, 0xDE31, 0x48D0, 0xD85D, 0xDE84, 0x42DD, 0xD85D, 0xDE93, 0x48D5,

+    0xD85D, 0xDF0E, 0x48DA, 0xD85D, 0xDF23, 0x48DC, 0xD85D, 0xDF52, 0x48E0,

+    0xD85E, 0xDD85, 0x48F0, 0xD85E, 0xDDB4, 0x4EA5, 0xD85E, 0xDE84, 0x48FC,

+    0xD85E, 0xDFB3, 0x490B, 0xD85E, 0xDFBE, 0x490D, 0xD85E, 0xDFC7, 0x490E,

+    0xD85F, 0xDC3C, 0x4EFC, 0xD85F, 0xDCB8, 0x4914, 0xD85F, 0xDD73, 0x4E5C,

+    0xD85F, 0xDDA0, 0x491C, 0xD85F, 0xDE10, 0x491E, 0xD85F, 0xDFB7, 0x364A,

+    0xD860, 0xDC8A, 0x4927, 0xD860, 0xDCBB, 0x492D, 0xD860, 0xDE77, 0x42F4,

+    0xD860, 0xDE82, 0x4939, 0xD860, 0xDEF3, 0x493B, 0xD860, 0xDFCD, 0x42FA,

+    0xD861, 0xDC0C, 0x4942, 0xD861, 0xDC55, 0x4945, 0xD861, 0xDD6B, 0x4952,

+    0xD861, 0xDDC8, 0x4955, 0xD861, 0xDDC9, 0x4956, 0xD861, 0xDED7, 0x4960,

+    0xD861, 0xDEFA, 0x4963, 0xD862, 0xDD46, 0x497C, 0xD862, 0xDD49, 0x497B,

+    0xD862, 0xDD6B, 0x4981, 0xD862, 0xDD87, 0x37AD, 0xD862, 0xDD88, 0x4988,

+    0xD862, 0xDDBA, 0x4992, 0xD862, 0xDDBB, 0x4993, 0xD862, 0xDE1E, 0x499B,

+    0xD862, 0xDE29, 0x499C, 0xD862, 0xDE43, 0x49A0, 0xD862, 0xDE71, 0x499F,

+    0xD862, 0xDE99, 0x49A7, 0xD862, 0xDECD, 0x49A8, 0xD862, 0xDEDD, 0x49AF,

+    0xD862, 0xDEE4, 0x49AE, 0xD862, 0xDFC1, 0x49BA, 0xD862, 0xDFEF, 0x49BB,

+    0xD863, 0xDCDD, 0x1DD9, 0xD863, 0xDD10, 0x49C2, 0xD863, 0xDD71, 0x49C3,

+    0xD863, 0xDDFB, 0x49C5, 0xD863, 0xDE17, 0x37B0, 0xD863, 0xDE1F, 0x49C6,

+    0xD863, 0xDE36, 0x49CA, 0xD863, 0xDE89, 0x49CD, 0xD863, 0xDEEB, 0x49CF,

+    0xD863, 0xDEF6, 0x1DF9, 0xD863, 0xDF32, 0x49D1, 0xD863, 0xDFF8, 0x49D7,

+    0xD864, 0xDEA0, 0x49E5, 0xD864, 0xDEB1, 0x49E6, 0xD865, 0xDC90, 0x49F7,

+    0xD865, 0xDDCF, 0x4A00, 0xD865, 0xDE7F, 0x3619, 0xD865, 0xDEF0, 0x4A0F,

+    0xD865, 0xDF19, 0x4A12, 0xD865, 0xDF50, 0x4A16, 0xD866, 0xDCC6, 0x4A27,

+    0xD866, 0xDE72, 0x4A39, 0xD867, 0xDD4B, 0x3595, 0xD867, 0xDDDB, 0x4A52,

+    0xD867, 0xDE15, 0x4A5C, 0xD867, 0xDE3D, 0x4F5B, 0xD867, 0xDE49, 0x4A5E,

+    0xD867, 0xDE8A, 0x4A5D, 0xD867, 0xDEC4, 0x4A66, 0xD867, 0xDEDB, 0x4A6E,

+    0xD867, 0xDEE9, 0x4A6B, 0xD867, 0xDFCE, 0x4A7F, 0xD867, 0xDFD7, 0x4A7F,

+    0xD868, 0xDC1A, 0x4A85, 0xD868, 0xDC2F, 0x4A83, 0xD868, 0xDC82, 0x4A8C,

+    0xD868, 0xDCF9, 0x4A8B, 0xD868, 0xDD90, 0x434B, 0xD868, 0xDEB2, 0x4E68,

+    0xD868, 0xDF8C, 0x4AA5, 0xD869, 0xDC37, 0x4AA7, 0xD869, 0xDDF1, 0x4AB3,

+    0xD869, 0xDE02, 0x4AB5, 0xD869, 0xDE1A, 0x4F5C, 0xD869, 0xDEB2, 0x4AB9,

+    0xD87E, 0xDC04, 0x3C1C, 0xD87E, 0xDC0F, 0x1E86, 0xD87E, 0xDC15, 0x4E5D,

+    0xD87E, 0xDC18, 0x1E89, 0xD87E, 0xDC1A, 0x3682, 0xD87E, 0xDC22, 0x3574,

+    0xD87E, 0xDC28, 0x35EF, 0xD87E, 0xDC2C, 0x371D, 0xD87E, 0xDC33, 0x3597,

+    0xD87E, 0xDC3F, 0x35F7, 0xD87E, 0xDC46, 0x4E5E, 0xD87E, 0xDC52, 0x3611,

+    0xD87E, 0xDC62, 0x36AE, 0xD87E, 0xDC6D, 0x3729, 0xD87E, 0xDC73, 0x3608,

+    0xD87E, 0xDC77, 0x1E4A, 0xD87E, 0xDC84, 0x1E36, 0xD87E, 0xDC99, 0x4E5F,

+    0xD87E, 0xDC9A, 0x3668, 0xD87E, 0xDCA6, 0x4E60, 0xD87E, 0xDCAC, 0x35B6,

+    0xD87E, 0xDCB2, 0x362B, 0xD87E, 0xDCB6, 0x3731, 0xD87E, 0xDCD3, 0x1E88,

+    0xD87E, 0xDCDB, 0x373C, 0xD87E, 0xDCDC, 0x1E0F, 0xD87E, 0xDCE1, 0x37D3,

+    0xD87E, 0xDCE5, 0x4E61, 0xD87E, 0xDCEA, 0x356F, 0xD87E, 0xDCED, 0x1DF1,

+    0xD87E, 0xDCFC, 0x3558, 0xD87E, 0xDD03, 0x35C8, 0xD87E, 0xDD0B, 0x35E9,

+    0xD87E, 0xDD0F, 0x366C, 0xD87E, 0xDD1A, 0x365C, 0xD87E, 0xDD20, 0x1E9F,

+    0xD87E, 0xDD21, 0x35F1, 0xD87E, 0xDD45, 0x342D, 0xD87E, 0xDD47, 0x361E,

+    0xD87E, 0xDD6C, 0x3764, 0xD87E, 0xDD95, 0x3566, 0xD87E, 0xDDD0, 0x36F4,

+    0xD87E, 0xDDDE, 0x4E62, 0xD87E, 0xDDDF, 0x36F5, 0xD87E, 0xDDF4, 0x3BA5,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp
new file mode 100644
index 0000000..ac83c75
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp
@@ -0,0 +1,81 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_UniJIS_UTF16_V_5[289 * 2] = {

+    0x00B0, 0x204D, 0x2010, 0x1ED5, 0x2015, 0x1ED4, 0x2016, 0x1ED7,

+    0x2025, 0x1EDA, 0x2026, 0x1ED9, 0x2032, 0x2051, 0x2033, 0x205B,

+    0x2190, 0x02E2, 0x2191, 0x02E0, 0x2192, 0x02E3, 0x2193, 0x02E1,

+    0x21C4, 0x2077, 0x21C5, 0x2076, 0x21C6, 0x2078, 0x21E6, 0x1F4C,

+    0x21E7, 0x1F4E, 0x21E8, 0x1F4B, 0x21E9, 0x1F4D, 0x239B, 0x2F74,

+    0x239C, 0x2F88, 0x239D, 0x2F73, 0x239E, 0x2F76, 0x239F, 0x2F88,

+    0x23A0, 0x2F75, 0x23A1, 0x2F7C, 0x23A2, 0x2F88, 0x23A3, 0x2F7B,

+    0x23A4, 0x2F7E, 0x23A5, 0x2F88, 0x23A6, 0x2F7D, 0x23A7, 0x1FE8,

+    0x23A8, 0x1FE7, 0x23A9, 0x1FE6, 0x23AA, 0x2F88, 0x23AB, 0x1FEC,

+    0x23AC, 0x1FEB, 0x23AD, 0x1FEA, 0x23B0, 0x3FDE, 0x23B1, 0x3FDF,

+    0x2500, 0x1D39, 0x2501, 0x1D3A, 0x2502, 0x1D37, 0x2503, 0x1D38,

+    0x2504, 0x1D3D, 0x2505, 0x1D3E, 0x2506, 0x1D3B, 0x2507, 0x1D3C,

+    0x2508, 0x1D41, 0x2509, 0x1D42, 0x250A, 0x1D3F, 0x250B, 0x1D40,

+    0x250C, 0x1D47, 0x250D, 0x1D49, 0x250E, 0x1D48, 0x250F, 0x1D4A,

+    0x2510, 0x1D4F, 0x2511, 0x1D51, 0x2512, 0x1D50, 0x2513, 0x1D52,

+    0x2514, 0x1D43, 0x2515, 0x1D45, 0x2516, 0x1D44, 0x2517, 0x1D46,

+    0x2518, 0x1D4B, 0x2519, 0x1D4D, 0x251A, 0x1D4C, 0x251B, 0x1D4E,

+    0x251C, 0x1D63, 0x251D, 0x1D67, 0x251E, 0x1D65, 0x251F, 0x1D64,

+    0x2520, 0x1D66, 0x2521, 0x1D69, 0x2522, 0x1D68, 0x2523, 0x1D6A,

+    0x2524, 0x1D6B, 0x2525, 0x1D6F, 0x2526, 0x1D6D, 0x2527, 0x1D6C,

+    0x2528, 0x1D6E, 0x2529, 0x1D71, 0x252A, 0x1D70, 0x252B, 0x1D72,

+    0x252C, 0x1D5B, 0x252D, 0x1D5D, 0x252E, 0x1D5E, 0x252F, 0x1D5F,

+    0x2530, 0x1D5C, 0x2531, 0x1D60, 0x2532, 0x1D61, 0x2533, 0x1D62,

+    0x2534, 0x1D53, 0x2535, 0x1D55, 0x2536, 0x1D56, 0x2537, 0x1D57,

+    0x2538, 0x1D54, 0x2539, 0x1D58, 0x253A, 0x1D59, 0x253B, 0x1D5A,

+    0x253D, 0x1D77, 0x253E, 0x1D78, 0x253F, 0x1D79, 0x2540, 0x1D75,

+    0x2541, 0x1D74, 0x2542, 0x1D76, 0x2543, 0x1D7B, 0x2544, 0x1D7D,

+    0x2545, 0x1D7A, 0x2546, 0x1D7C, 0x2547, 0x1D81, 0x2548, 0x1D80,

+    0x2549, 0x1D7E, 0x254A, 0x1D7F, 0x261C, 0x201D, 0x261D, 0x201B,

+    0x261E, 0x201E, 0x261F, 0x201C, 0x2702, 0x2F92, 0x27A1, 0x2011,

+    0x3001, 0x1ECF, 0x3002, 0x1ED0, 0x3008, 0x1EE3, 0x3009, 0x1EE4,

+    0x300A, 0x1EE5, 0x300B, 0x1EE6, 0x300C, 0x1EE7, 0x300D, 0x1EE8,

+    0x300E, 0x1EE9, 0x300F, 0x1EEA, 0x3010, 0x1EEB, 0x3011, 0x1EEC,

+    0x3014, 0x1EDD, 0x3015, 0x1EDE, 0x3016, 0x3FC9, 0x3017, 0x3FCA,

+    0x3018, 0x2F6B, 0x3019, 0x2F6C, 0x301C, 0x1ED6, 0x301D, 0x1F14,

+    0x301F, 0x1F15, 0x303B, 0x2F4B, 0x3041, 0x1EEE, 0x3043, 0x1EEF,

+    0x3045, 0x1EF0, 0x3047, 0x1EF1, 0x3049, 0x1EF2, 0x3063, 0x1EF3,

+    0x3083, 0x1EF4, 0x3085, 0x1EF5, 0x3087, 0x1EF6, 0x308E, 0x1EF7,

+    0x3095, 0x2048, 0x3096, 0x2049, 0x309B, 0x2050, 0x309C, 0x204F,

+    0x30A0, 0x3FCB, 0x30A1, 0x1EF8, 0x30A3, 0x1EF9, 0x30A5, 0x1EFA,

+    0x30A7, 0x1EFB, 0x30A9, 0x1EFC, 0x30C3, 0x1EFD, 0x30E3, 0x1EFE,

+    0x30E5, 0x1EFF, 0x30E7, 0x1F00, 0x30EE, 0x1F01, 0x30F5, 0x1F02,

+    0x30F6, 0x1F03, 0x30FC, 0x1ED3, 0x31F0, 0x3FCD, 0x31F1, 0x3FCE,

+    0x31F2, 0x3FCF, 0x31F3, 0x3FD0, 0x31F4, 0x3FD1, 0x31F5, 0x3FD2,

+    0x31F6, 0x3FD3, 0x31F7, 0x3FD4, 0x31F8, 0x3FD5, 0x31F9, 0x3FD6,

+    0x31FA, 0x3FD8, 0x31FB, 0x3FD9, 0x31FC, 0x3FDA, 0x31FD, 0x3FDB,

+    0x31FE, 0x3FDC, 0x31FF, 0x3FDD, 0x3300, 0x209E, 0x3301, 0x2EB6,

+    0x3302, 0x2EB7, 0x3303, 0x2092, 0x3304, 0x2EB8, 0x3305, 0x208D,

+    0x3306, 0x2EB9, 0x3307, 0x2EBD, 0x3308, 0x2EBB, 0x3309, 0x2EC0,

+    0x330A, 0x2EBE, 0x330B, 0x2EC2, 0x330C, 0x2EC4, 0x330D, 0x1F0E,

+    0x330E, 0x2EC5, 0x330F, 0x2EC6, 0x3310, 0x2EC7, 0x3311, 0x2EC8,

+    0x3312, 0x2EC9, 0x3313, 0x2ECA, 0x3314, 0x1F05, 0x3315, 0x2094,

+    0x3316, 0x208A, 0x3317, 0x2ECC, 0x3318, 0x2093, 0x3319, 0x2ECE,

+    0x331A, 0x2ED0, 0x331B, 0x2ED1, 0x331C, 0x2ED2, 0x331D, 0x2ED3,

+    0x331E, 0x20A1, 0x331F, 0x2ED4, 0x3320, 0x2ED5, 0x3321, 0x2ED6,

+    0x3322, 0x2089, 0x3323, 0x209C, 0x3324, 0x2ED7, 0x3325, 0x2ED9,

+    0x3326, 0x1F0F, 0x3327, 0x1F09, 0x3328, 0x2EDC, 0x3329, 0x2EDD,

+    0x332A, 0x20A4, 0x332B, 0x1F11, 0x332D, 0x2EDF, 0x332E, 0x2EE2,

+    0x332F, 0x2EE3, 0x3330, 0x2EE4, 0x3331, 0x20A6, 0x3332, 0x2EE5,

+    0x3333, 0x208E, 0x3334, 0x2EE8, 0x3335, 0x2EE9, 0x3336, 0x1F0B,

+    0x3337, 0x2EEE, 0x3338, 0x2EF0, 0x3339, 0x2097, 0x333A, 0x2EF1,

+    0x333B, 0x209D, 0x333C, 0x2EEA, 0x333D, 0x2EF2, 0x333E, 0x2EF4,

+    0x333F, 0x2EF5, 0x3340, 0x2EF6, 0x3341, 0x2EF3, 0x3342, 0x209B,

+    0x3343, 0x2EF7, 0x3344, 0x2EF8, 0x3345, 0x2EF9, 0x3346, 0x2EFA,

+    0x3347, 0x20A5, 0x3348, 0x2EFB, 0x3349, 0x1F04, 0x334A, 0x1F12,

+    0x334B, 0x2EFC, 0x334C, 0x2EFD, 0x334D, 0x1F07, 0x334E, 0x2091,

+    0x334F, 0x2EFE, 0x3350, 0x2EFF, 0x3351, 0x1F0C, 0x3352, 0x2F02,

+    0x3353, 0x2F06, 0x3354, 0x2F03, 0x3355, 0x2F07, 0x3356, 0x2F08,

+    0x3357, 0x2098, 0x337F, 0x2084, 0xFF08, 0x1EDB, 0xFF09, 0x1EDC,

+    0xFF0C, 0x204C, 0xFF0E, 0x2052, 0xFF1D, 0x1EED, 0xFF3B, 0x1EDF,

+    0xFF3D, 0x1EE0, 0xFF3F, 0x1ED2, 0xFF5B, 0x1EE1, 0xFF5C, 0x1ED8,

+    0xFF5D, 0x1EE2, 0xFF5E, 0x1ED6, 0xFF5F, 0x2F6D, 0xFF60, 0x2F6E,

+    0xFFE3, 0x1ED1,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/V_1.cpp
new file mode 100644
index 0000000..b9c00b6
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/V_1.cpp
@@ -0,0 +1,17 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_V_1[27 * 3] = {
+    0x2122, 0x2123, 0x1ECF, 0x2131, 0x2132, 0x1ED1, 0x213C, 0x213E, 0x1ED3,
+    0x2141, 0x2145, 0x1ED6, 0x214A, 0x215B, 0x1EDB, 0x2161, 0x2161, 0x1EED,
+    0x2421, 0x2421, 0x1EEE, 0x2423, 0x2423, 0x1EEF, 0x2425, 0x2425, 0x1EF0,
+    0x2427, 0x2427, 0x1EF1, 0x2429, 0x2429, 0x1EF2, 0x2443, 0x2443, 0x1EF3,
+    0x2463, 0x2463, 0x1EF4, 0x2465, 0x2465, 0x1EF5, 0x2467, 0x2467, 0x1EF6,
+    0x246E, 0x246E, 0x1EF7, 0x2521, 0x2521, 0x1EF8, 0x2523, 0x2523, 0x1EF9,
+    0x2525, 0x2525, 0x1EFA, 0x2527, 0x2527, 0x1EFB, 0x2529, 0x2529, 0x1EFC,
+    0x2543, 0x2543, 0x1EFD, 0x2563, 0x2563, 0x1EFE, 0x2565, 0x2565, 0x1EFF,
+    0x2567, 0x2567, 0x1F00, 0x256E, 0x256E, 0x1F01, 0x2575, 0x2576, 0x1F02,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/cmaps_japan1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/cmaps_japan1.cpp
new file mode 100644
index 0000000..80a47cc
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/cmaps_japan1.cpp
@@ -0,0 +1,62 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../../include/fpdfapi/fpdf_resource.h"
+#include "../../../../include/fpdfapi/fpdf_module.h"
+#include "../../fpdf_font/font_int.h"
+#include "../cmap_int.h"
+extern const FX_WORD g_FXCMAP_83pv_RKSJ_H_1[];
+extern const FX_WORD g_FXCMAP_90ms_RKSJ_H_2[];
+extern const FX_WORD g_FXCMAP_90ms_RKSJ_V_2[];
+extern const FX_WORD g_FXCMAP_90msp_RKSJ_H_2[];
+extern const FX_WORD g_FXCMAP_90msp_RKSJ_V_2[];
+extern const FX_WORD g_FXCMAP_90pv_RKSJ_H_1[];
+extern const FX_WORD g_FXCMAP_Add_RKSJ_H_1[];
+extern const FX_WORD g_FXCMAP_Add_RKSJ_V_1[];
+extern const FX_WORD g_FXCMAP_EUC_H_1[];
+extern const FX_WORD g_FXCMAP_EUC_V_1[];
+extern const FX_WORD g_FXCMAP_Ext_RKSJ_H_2[];
+extern const FX_WORD g_FXCMAP_Ext_RKSJ_V_2[];
+extern const FX_WORD g_FXCMAP_H_1[];
+extern const FX_WORD g_FXCMAP_V_1[];
+extern const FX_WORD g_FXCMAP_UniJIS_UCS2_H_4[];
+extern const FX_WORD g_FXCMAP_UniJIS_UCS2_V_4[];
+extern const FX_WORD g_FXCMAP_UniJIS_UCS2_HW_H_4[];
+extern const FX_WORD g_FXCMAP_UniJIS_UCS2_HW_V_4[];
+extern const FX_WORD g_FXCMAP_UniJIS_UTF16_H_0[];
+extern const FX_WORD g_FXCMAP_UniJIS_UTF16_H_0_DWord[];
+extern const FX_WORD g_FXCMAP_UniJIS_UTF16_V_0[];
+extern const FX_WORD g_FXCMAP_Japan1CID2Unicode_4[];
+static const FXCMAP_CMap g_FXCMAP_Japan1_cmaps[] = {
+    { "83pv-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_83pv_RKSJ_H_1, 222, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "90ms-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_90ms_RKSJ_H_2, 171, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "90ms-RKSJ-V", FXCMAP_CMap::Range, g_FXCMAP_90ms_RKSJ_V_2, 78, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "90msp-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_90msp_RKSJ_H_2, 170, FXCMAP_CMap::None, NULL, 0, -2 },
+    { "90msp-RKSJ-V", FXCMAP_CMap::Range, g_FXCMAP_90msp_RKSJ_V_2, 78, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "90pv-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_90pv_RKSJ_H_1, 263, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "Add-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_Add_RKSJ_H_1, 635, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "Add-RKSJ-V", FXCMAP_CMap::Range, g_FXCMAP_Add_RKSJ_V_1, 57, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "EUC-H", FXCMAP_CMap::Range, g_FXCMAP_EUC_H_1, 120, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "EUC-V", FXCMAP_CMap::Range, g_FXCMAP_EUC_V_1, 27, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "Ext-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_Ext_RKSJ_H_2, 665, FXCMAP_CMap::None, NULL, 0, -4 },
+    { "Ext-RKSJ-V", FXCMAP_CMap::Range, g_FXCMAP_Ext_RKSJ_V_2, 39, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "H", FXCMAP_CMap::Range, g_FXCMAP_H_1, 118, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "V", FXCMAP_CMap::Range, g_FXCMAP_V_1, 27, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "UniJIS-UCS2-H", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_H_4, 9772, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "UniJIS-UCS2-V", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_V_4, 251, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "UniJIS-UCS2-HW-H", FXCMAP_CMap::Range, g_FXCMAP_UniJIS_UCS2_HW_H_4, 4, FXCMAP_CMap::None, NULL, 0, -2 },
+    { "UniJIS-UCS2-HW-V", FXCMAP_CMap::Range, g_FXCMAP_UniJIS_UCS2_HW_V_4, 199, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "UniJIS-UTF16-H", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_H_4, 9772, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "UniJIS-UTF16-V", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_V_4, 251, FXCMAP_CMap::None, NULL, 0, -1 },
+};
+void CPDF_ModuleMgr::LoadEmbeddedJapan1CMaps()
+{
+    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+    pFontGlobals->m_EmbeddedCharsets[CIDSET_JAPAN1].m_pMapList = g_FXCMAP_Japan1_cmaps;
+    pFontGlobals->m_EmbeddedCharsets[CIDSET_JAPAN1].m_Count = sizeof g_FXCMAP_Japan1_cmaps / sizeof (FXCMAP_CMap);
+    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_JAPAN1].m_pMap = g_FXCMAP_Japan1CID2Unicode_4;
+    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_JAPAN1].m_Count = 15444;
+}
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp
new file mode 100644
index 0000000..f5f7a99
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp
@@ -0,0 +1,2302 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_Korea1CID2Unicode_2[18352] = {

+    0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,

+    0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,

+    0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,

+    0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,

+    0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,

+    0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,

+    0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,

+    0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,

+    0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,

+    0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,

+    0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,

+    0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,

+    0x20A9, 0x2010, 0x00A9, 0x2122, 0x22EF, 0x3000, 0x3001, 0x3002,

+    0x00B7, 0x2025, 0x2026, 0x00A8, 0x3003, 0x2013, 0x2014, 0x2016,

+    0xFF3C, 0x223C, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014, 0x3015,

+    0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F,

+    0x3010, 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2260, 0x2264, 0x2265,

+    0x221E, 0x2234, 0x00B0, 0x2032, 0x2033, 0x2103, 0x212B, 0xFFE0,

+    0xFFE1, 0xFFE5, 0x2642, 0x2640, 0x2220, 0x22A5, 0x2312, 0x2202,

+    0x2207, 0x2261, 0x2252, 0x00A7, 0x203B, 0x2606, 0x2605, 0x25CB,

+    0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2,

+    0x25BD, 0x25BC, 0x2192, 0x2190, 0x2191, 0x2193, 0x2194, 0x3013,

+    0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C,

+    0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229,

+    0x2227, 0x2228, 0xFFE2, 0x21D2, 0x21D4, 0x2200, 0x2203, 0x00B4,

+    0x02DC, 0x02C7, 0x02D8, 0x02DD, 0x02DA, 0x02D9, 0x00B8, 0x02DB,

+    0x00A1, 0x00BF, 0x2236, 0x222E, 0x2211, 0x220F, 0x00A4, 0x2109,

+    0x2030, 0x25C1, 0x25C0, 0x25B7, 0x25B6, 0x2664, 0x2660, 0x2661,

+    0x2665, 0x2667, 0x2663, 0x2299, 0x25C8, 0x25A3, 0x25D0, 0x25D1,

+    0x2592, 0x25A4, 0x25A5, 0x25A8, 0x25A7, 0x25A6, 0x25A9, 0x2668,

+    0x260F, 0x260E, 0x261C, 0x261E, 0x00B6, 0x2020, 0x2021, 0x2195,

+    0x2197, 0x2199, 0x2196, 0x2198, 0x266D, 0x2669, 0x266A, 0x266C,

+    0x327F, 0x321C, 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8, 0x2121,

+    0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, 0xFF08,

+    0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10,

+    0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18,

+    0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20,

+    0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28,

+    0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30,

+    0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38,

+    0xFF39, 0xFF3A, 0xFF3B, 0xFFE6, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40,

+    0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48,

+    0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50,

+    0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58,

+    0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0x3131, 0x3132,

+    0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313A,

+    0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141, 0x3142,

+    0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A,

+    0x314B, 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, 0x3151, 0x3152,

+    0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315A,

+    0x315B, 0x315C, 0x315D, 0x315E, 0x315F, 0x3160, 0x3161, 0x3162,

+    0x3163, 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, 0x316A, 0x316B,

+    0x316C, 0x316D, 0x316E, 0x316F, 0x3170, 0x3171, 0x3172, 0x3173,

+    0x3174, 0x3175, 0x3176, 0x3177, 0x3178, 0x3179, 0x317A, 0x317B,

+    0x317C, 0x317D, 0x317E, 0x317F, 0x3180, 0x3181, 0x3182, 0x3183,

+    0x3184, 0x3185, 0x3186, 0x3187, 0x3188, 0x3189, 0x318A, 0x318B,

+    0x318C, 0x318D, 0x318E, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174,

+    0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x2160, 0x2161, 0x2162,

+    0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x0391,

+    0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399,

+    0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1,

+    0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1,

+    0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9,

+    0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1,

+    0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x2500,

+    0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524,

+    0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, 0x251B, 0x2517,

+    0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 0x2528,

+    0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542, 0x2512,

+    0x2511, 0x251A, 0x2519, 0x2516, 0x2515, 0x250E, 0x250D, 0x251E,

+    0x251F, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252A, 0x252D,

+    0x252E, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253A, 0x253D,

+    0x253E, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547,

+    0x2548, 0x2549, 0x254A, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398,

+    0x33C4, 0x33A3, 0x33A4, 0x33A5, 0x33A6, 0x3399, 0x339A, 0x339B,

+    0x339C, 0x339D, 0x339E, 0x339F, 0x33A0, 0x33A1, 0x33A2, 0x33CA,

+    0x338D, 0x338E, 0x338F, 0x33CF, 0x3388, 0x3389, 0x33C8, 0x33A7,

+    0x33A8, 0x33B0, 0x33B1, 0x33B2, 0x33B3, 0x33B4, 0x33B5, 0x33B6,

+    0x33B7, 0x33B8, 0x33B9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384,

+    0x33BA, 0x33BB, 0x33BC, 0x33BD, 0x33BE, 0x33BF, 0x3390, 0x3391,

+    0x3392, 0x3393, 0x3394, 0x2126, 0x33C0, 0x33C1, 0x338A, 0x338B,

+    0x338C, 0x33D6, 0x33C5, 0x33AD, 0x33AE, 0x33AF, 0x33DB, 0x33A9,

+    0x33AA, 0x33AB, 0x33AC, 0x33DD, 0x33D0, 0x33D3, 0x33C3, 0x33C9,

+    0x33DC, 0x33C6, 0x00C6, 0x00D0, 0x00AA, 0x0126, 0x0132, 0x013F,

+    0x0141, 0x00D8, 0x0152, 0x00BA, 0x00DE, 0x0166, 0x014A, 0x3260,

+    0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, 0x3268,

+    0x3269, 0x326A, 0x326B, 0x326C, 0x326D, 0x326E, 0x326F, 0x3270,

+    0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, 0x3278,

+    0x3279, 0x327A, 0x327B, 0x24D0, 0x24D1, 0x24D2, 0x24D3, 0x24D4,

+    0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, 0x24DC,

+    0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, 0x24E4,

+    0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x2460, 0x2461, 0x2462,

+    0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A,

+    0x246B, 0x246C, 0x246D, 0x246E, 0x00BD, 0x2153, 0x2154, 0x00BC,

+    0x00BE, 0x215B, 0x215C, 0x215D, 0x215E, 0x00E6, 0x0111, 0x00F0,

+    0x0127, 0x0131, 0x0133, 0x0138, 0x0140, 0x0142, 0x00F8, 0x0153,

+    0x00DF, 0x00FE, 0x0167, 0x014B, 0x0149, 0x3200, 0x3201, 0x3202,

+    0x3203, 0x3204, 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, 0x320A,

+    0x320B, 0x320C, 0x320D, 0x320E, 0x320F, 0x3210, 0x3211, 0x3212,

+    0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219, 0x321A,

+    0x321B, 0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, 0x24A2,

+    0x24A3, 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA,

+    0x24AB, 0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2,

+    0x24B3, 0x24B4, 0x24B5, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478,

+    0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480,

+    0x2481, 0x2482, 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x207F, 0x2081,

+    0x2082, 0x2083, 0x2084, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045,

+    0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D,

+    0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055,

+    0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D,

+    0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065,

+    0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D,

+    0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075,

+    0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D,

+    0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085,

+    0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D,

+    0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2,

+    0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA,

+    0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2,

+    0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA,

+    0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2,

+    0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA,

+    0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2,

+    0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA,

+    0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2,

+    0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA,

+    0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2,

+    0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x0410, 0x0411, 0x0412, 0x0413,

+    0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A,

+    0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422,

+    0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A,

+    0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432,

+    0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439,

+    0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441,

+    0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449,

+    0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0xAC00, 0xAC01,

+    0xAC04, 0xAC07, 0xAC08, 0xAC09, 0xAC0A, 0xAC10, 0xAC11, 0xAC12,

+    0xAC13, 0xAC14, 0xAC15, 0xAC16, 0xAC17, 0xAC19, 0xAC1A, 0xAC1B,

+    0xAC1C, 0xAC1D, 0xAC20, 0xAC24, 0xAC2C, 0xAC2D, 0xAC2F, 0xAC30,

+    0xAC31, 0xAC38, 0xAC39, 0xAC3C, 0xAC40, 0xAC4B, 0xAC4D, 0xAC54,

+    0xAC58, 0xAC5C, 0xAC70, 0xAC71, 0xAC74, 0xAC77, 0xAC78, 0xAC7A,

+    0xAC80, 0xAC81, 0xAC83, 0xAC84, 0xAC85, 0xAC86, 0xAC89, 0xAC8A,

+    0xAC8B, 0xAC8C, 0xAC90, 0xAC94, 0xAC9C, 0xAC9D, 0xAC9F, 0xACA0,

+    0xACA1, 0xACA8, 0xACA9, 0xACAA, 0xACAC, 0xACAF, 0xACB0, 0xACB8,

+    0xACB9, 0xACBB, 0xACBC, 0xACBD, 0xACC1, 0xACC4, 0xACC8, 0xACCC,

+    0xACD5, 0xACD7, 0xACE0, 0xACE1, 0xACE4, 0xACE7, 0xACE8, 0xACEA,

+    0xACEC, 0xACEF, 0xACF0, 0xACF1, 0xACF3, 0xACF5, 0xACF6, 0xACFC,

+    0xACFD, 0xAD00, 0xAD04, 0xAD06, 0xAD0C, 0xAD0D, 0xAD0F, 0xAD11,

+    0xAD18, 0xAD1C, 0xAD20, 0xAD29, 0xAD2C, 0xAD2D, 0xAD34, 0xAD35,

+    0xAD38, 0xAD3C, 0xAD44, 0xAD45, 0xAD47, 0xAD49, 0xAD50, 0xAD54,

+    0xAD58, 0xAD61, 0xAD63, 0xAD6C, 0xAD6D, 0xAD70, 0xAD73, 0xAD74,

+    0xAD75, 0xAD76, 0xAD7B, 0xAD7C, 0xAD7D, 0xAD7F, 0xAD81, 0xAD82,

+    0xAD88, 0xAD89, 0xAD8C, 0xAD90, 0xAD9C, 0xAD9D, 0xADA4, 0xADB7,

+    0xADC0, 0xADC1, 0xADC4, 0xADC8, 0xADD0, 0xADD1, 0xADD3, 0xADDC,

+    0xADE0, 0xADE4, 0xADF8, 0xADF9, 0xADFC, 0xADFF, 0xAE00, 0xAE01,

+    0xAE08, 0xAE09, 0xAE0B, 0xAE0D, 0xAE14, 0xAE30, 0xAE31, 0xAE34,

+    0xAE37, 0xAE38, 0xAE3A, 0xAE40, 0xAE41, 0xAE43, 0xAE45, 0xAE46,

+    0xAE4A, 0xAE4C, 0xAE4D, 0xAE4E, 0xAE50, 0xAE54, 0xAE56, 0xAE5C,

+    0xAE5D, 0xAE5F, 0xAE60, 0xAE61, 0xAE65, 0xAE68, 0xAE69, 0xAE6C,

+    0xAE70, 0xAE78, 0xAE79, 0xAE7B, 0xAE7C, 0xAE7D, 0xAE84, 0xAE85,

+    0xAE8C, 0xAEBC, 0xAEBD, 0xAEBE, 0xAEC0, 0xAEC4, 0xAECC, 0xAECD,

+    0xAECF, 0xAED0, 0xAED1, 0xAED8, 0xAED9, 0xAEDC, 0xAEE8, 0xAEEB,

+    0xAEED, 0xAEF4, 0xAEF8, 0xAEFC, 0xAF07, 0xAF08, 0xAF0D, 0xAF10,

+    0xAF2C, 0xAF2D, 0xAF30, 0xAF32, 0xAF34, 0xAF3C, 0xAF3D, 0xAF3F,

+    0xAF41, 0xAF42, 0xAF43, 0xAF48, 0xAF49, 0xAF50, 0xAF5C, 0xAF5D,

+    0xAF64, 0xAF65, 0xAF79, 0xAF80, 0xAF84, 0xAF88, 0xAF90, 0xAF91,

+    0xAF95, 0xAF9C, 0xAFB8, 0xAFB9, 0xAFBC, 0xAFC0, 0xAFC7, 0xAFC8,

+    0xAFC9, 0xAFCB, 0xAFCD, 0xAFCE, 0xAFD4, 0xAFDC, 0xAFE8, 0xAFE9,

+    0xAFF0, 0xAFF1, 0xAFF4, 0xAFF8, 0xB000, 0xB001, 0xB004, 0xB00C,

+    0xB010, 0xB014, 0xB01C, 0xB01D, 0xB028, 0xB044, 0xB045, 0xB048,

+    0xB04A, 0xB04C, 0xB04E, 0xB053, 0xB054, 0xB055, 0xB057, 0xB059,

+    0xB05D, 0xB07C, 0xB07D, 0xB080, 0xB084, 0xB08C, 0xB08D, 0xB08F,

+    0xB091, 0xB098, 0xB099, 0xB09A, 0xB09C, 0xB09F, 0xB0A0, 0xB0A1,

+    0xB0A2, 0xB0A8, 0xB0A9, 0xB0AB, 0xB0AC, 0xB0AD, 0xB0AE, 0xB0AF,

+    0xB0B1, 0xB0B3, 0xB0B4, 0xB0B5, 0xB0B8, 0xB0BC, 0xB0C4, 0xB0C5,

+    0xB0C7, 0xB0C8, 0xB0C9, 0xB0D0, 0xB0D1, 0xB0D4, 0xB0D8, 0xB0E0,

+    0xB0E5, 0xB108, 0xB109, 0xB10B, 0xB10C, 0xB110, 0xB112, 0xB113,

+    0xB118, 0xB119, 0xB11B, 0xB11C, 0xB11D, 0xB123, 0xB124, 0xB125,

+    0xB128, 0xB12C, 0xB134, 0xB135, 0xB137, 0xB138, 0xB139, 0xB140,

+    0xB141, 0xB144, 0xB148, 0xB150, 0xB151, 0xB154, 0xB155, 0xB158,

+    0xB15C, 0xB160, 0xB178, 0xB179, 0xB17C, 0xB180, 0xB182, 0xB188,

+    0xB189, 0xB18B, 0xB18D, 0xB192, 0xB193, 0xB194, 0xB198, 0xB19C,

+    0xB1A8, 0xB1CC, 0xB1D0, 0xB1D4, 0xB1DC, 0xB1DD, 0xB1DF, 0xB1E8,

+    0xB1E9, 0xB1EC, 0xB1F0, 0xB1F9, 0xB1FB, 0xB1FD, 0xB204, 0xB205,

+    0xB208, 0xB20B, 0xB20C, 0xB214, 0xB215, 0xB217, 0xB219, 0xB220,

+    0xB234, 0xB23C, 0xB258, 0xB25C, 0xB260, 0xB268, 0xB269, 0xB274,

+    0xB275, 0xB27C, 0xB284, 0xB285, 0xB289, 0xB290, 0xB291, 0xB294,

+    0xB298, 0xB299, 0xB29A, 0xB2A0, 0xB2A1, 0xB2A3, 0xB2A5, 0xB2A6,

+    0xB2AA, 0xB2AC, 0xB2B0, 0xB2B4, 0xB2C8, 0xB2C9, 0xB2CC, 0xB2D0,

+    0xB2D2, 0xB2D8, 0xB2D9, 0xB2DB, 0xB2DD, 0xB2E2, 0xB2E4, 0xB2E5,

+    0xB2E6, 0xB2E8, 0xB2EB, 0xB2EC, 0xB2ED, 0xB2EE, 0xB2EF, 0xB2F3,

+    0xB2F4, 0xB2F5, 0xB2F7, 0xB2F8, 0xB2F9, 0xB2FA, 0xB2FB, 0xB2FF,

+    0xB300, 0xB301, 0xB304, 0xB308, 0xB310, 0xB311, 0xB313, 0xB314,

+    0xB315, 0xB31C, 0xB354, 0xB355, 0xB356, 0xB358, 0xB35B, 0xB35C,

+    0xB35E, 0xB35F, 0xB364, 0xB365, 0xB367, 0xB369, 0xB36B, 0xB36E,

+    0xB370, 0xB371, 0xB374, 0xB378, 0xB380, 0xB381, 0xB383, 0xB384,

+    0xB385, 0xB38C, 0xB390, 0xB394, 0xB3A0, 0xB3A1, 0xB3A8, 0xB3AC,

+    0xB3C4, 0xB3C5, 0xB3C8, 0xB3CB, 0xB3CC, 0xB3CE, 0xB3D0, 0xB3D4,

+    0xB3D5, 0xB3D7, 0xB3D9, 0xB3DB, 0xB3DD, 0xB3E0, 0xB3E4, 0xB3E8,

+    0xB3FC, 0xB410, 0xB418, 0xB41C, 0xB420, 0xB428, 0xB429, 0xB42B,

+    0xB434, 0xB450, 0xB451, 0xB454, 0xB458, 0xB460, 0xB461, 0xB463,

+    0xB465, 0xB46C, 0xB480, 0xB488, 0xB49D, 0xB4A4, 0xB4A8, 0xB4AC,

+    0xB4B5, 0xB4B7, 0xB4B9, 0xB4C0, 0xB4C4, 0xB4C8, 0xB4D0, 0xB4D5,

+    0xB4DC, 0xB4DD, 0xB4E0, 0xB4E3, 0xB4E4, 0xB4E6, 0xB4EC, 0xB4ED,

+    0xB4EF, 0xB4F1, 0xB4F8, 0xB514, 0xB515, 0xB518, 0xB51B, 0xB51C,

+    0xB524, 0xB525, 0xB527, 0xB528, 0xB529, 0xB52A, 0xB530, 0xB531,

+    0xB534, 0xB538, 0xB540, 0xB541, 0xB543, 0xB544, 0xB545, 0xB54B,

+    0xB54C, 0xB54D, 0xB550, 0xB554, 0xB55C, 0xB55D, 0xB55F, 0xB560,

+    0xB561, 0xB5A0, 0xB5A1, 0xB5A4, 0xB5A8, 0xB5AA, 0xB5AB, 0xB5B0,

+    0xB5B1, 0xB5B3, 0xB5B4, 0xB5B5, 0xB5BB, 0xB5BC, 0xB5BD, 0xB5C0,

+    0xB5C4, 0xB5CC, 0xB5CD, 0xB5CF, 0xB5D0, 0xB5D1, 0xB5D8, 0xB5EC,

+    0xB610, 0xB611, 0xB614, 0xB618, 0xB625, 0xB62C, 0xB634, 0xB648,

+    0xB664, 0xB668, 0xB69C, 0xB69D, 0xB6A0, 0xB6A4, 0xB6AB, 0xB6AC,

+    0xB6B1, 0xB6D4, 0xB6F0, 0xB6F4, 0xB6F8, 0xB700, 0xB701, 0xB705,

+    0xB728, 0xB729, 0xB72C, 0xB72F, 0xB730, 0xB738, 0xB739, 0xB73B,

+    0xB744, 0xB748, 0xB74C, 0xB754, 0xB755, 0xB760, 0xB764, 0xB768,

+    0xB770, 0xB771, 0xB773, 0xB775, 0xB77C, 0xB77D, 0xB780, 0xB784,

+    0xB78C, 0xB78D, 0xB78F, 0xB790, 0xB791, 0xB792, 0xB796, 0xB797,

+    0xB798, 0xB799, 0xB79C, 0xB7A0, 0xB7A8, 0xB7A9, 0xB7AB, 0xB7AC,

+    0xB7AD, 0xB7B4, 0xB7B5, 0xB7B8, 0xB7C7, 0xB7C9, 0xB7EC, 0xB7ED,

+    0xB7F0, 0xB7F4, 0xB7FC, 0xB7FD, 0xB7FF, 0xB800, 0xB801, 0xB807,

+    0xB808, 0xB809, 0xB80C, 0xB810, 0xB818, 0xB819, 0xB81B, 0xB81D,

+    0xB824, 0xB825, 0xB828, 0xB82C, 0xB834, 0xB835, 0xB837, 0xB838,

+    0xB839, 0xB840, 0xB844, 0xB851, 0xB853, 0xB85C, 0xB85D, 0xB860,

+    0xB864, 0xB86C, 0xB86D, 0xB86F, 0xB871, 0xB878, 0xB87C, 0xB88D,

+    0xB8A8, 0xB8B0, 0xB8B4, 0xB8B8, 0xB8C0, 0xB8C1, 0xB8C3, 0xB8C5,

+    0xB8CC, 0xB8D0, 0xB8D4, 0xB8DD, 0xB8DF, 0xB8E1, 0xB8E8, 0xB8E9,

+    0xB8EC, 0xB8F0, 0xB8F8, 0xB8F9, 0xB8FB, 0xB8FD, 0xB904, 0xB918,

+    0xB920, 0xB93C, 0xB93D, 0xB940, 0xB944, 0xB94C, 0xB94F, 0xB951,

+    0xB958, 0xB959, 0xB95C, 0xB960, 0xB968, 0xB969, 0xB96B, 0xB96D,

+    0xB974, 0xB975, 0xB978, 0xB97C, 0xB984, 0xB985, 0xB987, 0xB989,

+    0xB98A, 0xB98D, 0xB98E, 0xB9AC, 0xB9AD, 0xB9B0, 0xB9B4, 0xB9BC,

+    0xB9BD, 0xB9BF, 0xB9C1, 0xB9C8, 0xB9C9, 0xB9CC, 0xB9CE, 0xB9CF,

+    0xB9D0, 0xB9D1, 0xB9D2, 0xB9D8, 0xB9D9, 0xB9DB, 0xB9DD, 0xB9DE,

+    0xB9E1, 0xB9E3, 0xB9E4, 0xB9E5, 0xB9E8, 0xB9EC, 0xB9F4, 0xB9F5,

+    0xB9F7, 0xB9F8, 0xB9F9, 0xB9FA, 0xBA00, 0xBA01, 0xBA08, 0xBA15,

+    0xBA38, 0xBA39, 0xBA3C, 0xBA40, 0xBA42, 0xBA48, 0xBA49, 0xBA4B,

+    0xBA4D, 0xBA4E, 0xBA53, 0xBA54, 0xBA55, 0xBA58, 0xBA5C, 0xBA64,

+    0xBA65, 0xBA67, 0xBA68, 0xBA69, 0xBA70, 0xBA71, 0xBA74, 0xBA78,

+    0xBA83, 0xBA84, 0xBA85, 0xBA87, 0xBA8C, 0xBAA8, 0xBAA9, 0xBAAB,

+    0xBAAC, 0xBAB0, 0xBAB2, 0xBAB8, 0xBAB9, 0xBABB, 0xBABD, 0xBAC4,

+    0xBAC8, 0xBAD8, 0xBAD9, 0xBAFC, 0xBB00, 0xBB04, 0xBB0D, 0xBB0F,

+    0xBB11, 0xBB18, 0xBB1C, 0xBB20, 0xBB29, 0xBB2B, 0xBB34, 0xBB35,

+    0xBB36, 0xBB38, 0xBB3B, 0xBB3C, 0xBB3D, 0xBB3E, 0xBB44, 0xBB45,

+    0xBB47, 0xBB49, 0xBB4D, 0xBB4F, 0xBB50, 0xBB54, 0xBB58, 0xBB61,

+    0xBB63, 0xBB6C, 0xBB88, 0xBB8C, 0xBB90, 0xBBA4, 0xBBA8, 0xBBAC,

+    0xBBB4, 0xBBB7, 0xBBC0, 0xBBC4, 0xBBC8, 0xBBD0, 0xBBD3, 0xBBF8,

+    0xBBF9, 0xBBFC, 0xBBFF, 0xBC00, 0xBC02, 0xBC08, 0xBC09, 0xBC0B,

+    0xBC0C, 0xBC0D, 0xBC0F, 0xBC11, 0xBC14, 0xBC15, 0xBC16, 0xBC17,

+    0xBC18, 0xBC1B, 0xBC1C, 0xBC1D, 0xBC1E, 0xBC1F, 0xBC24, 0xBC25,

+    0xBC27, 0xBC29, 0xBC2D, 0xBC30, 0xBC31, 0xBC34, 0xBC38, 0xBC40,

+    0xBC41, 0xBC43, 0xBC44, 0xBC45, 0xBC49, 0xBC4C, 0xBC4D, 0xBC50,

+    0xBC5D, 0xBC84, 0xBC85, 0xBC88, 0xBC8B, 0xBC8C, 0xBC8E, 0xBC94,

+    0xBC95, 0xBC97, 0xBC99, 0xBC9A, 0xBCA0, 0xBCA1, 0xBCA4, 0xBCA7,

+    0xBCA8, 0xBCB0, 0xBCB1, 0xBCB3, 0xBCB4, 0xBCB5, 0xBCBC, 0xBCBD,

+    0xBCC0, 0xBCC4, 0xBCCD, 0xBCCF, 0xBCD0, 0xBCD1, 0xBCD5, 0xBCD8,

+    0xBCDC, 0xBCF4, 0xBCF5, 0xBCF6, 0xBCF8, 0xBCFC, 0xBD04, 0xBD05,

+    0xBD07, 0xBD09, 0xBD10, 0xBD14, 0xBD24, 0xBD2C, 0xBD40, 0xBD48,

+    0xBD49, 0xBD4C, 0xBD50, 0xBD58, 0xBD59, 0xBD64, 0xBD68, 0xBD80,

+    0xBD81, 0xBD84, 0xBD87, 0xBD88, 0xBD89, 0xBD8A, 0xBD90, 0xBD91,

+    0xBD93, 0xBD95, 0xBD99, 0xBD9A, 0xBD9C, 0xBDA4, 0xBDB0, 0xBDB8,

+    0xBDD4, 0xBDD5, 0xBDD8, 0xBDDC, 0xBDE9, 0xBDF0, 0xBDF4, 0xBDF8,

+    0xBE00, 0xBE03, 0xBE05, 0xBE0C, 0xBE0D, 0xBE10, 0xBE14, 0xBE1C,

+    0xBE1D, 0xBE1F, 0xBE44, 0xBE45, 0xBE48, 0xBE4C, 0xBE4E, 0xBE54,

+    0xBE55, 0xBE57, 0xBE59, 0xBE5A, 0xBE5B, 0xBE60, 0xBE61, 0xBE64,

+    0xBE68, 0xBE6A, 0xBE70, 0xBE71, 0xBE73, 0xBE74, 0xBE75, 0xBE7B,

+    0xBE7C, 0xBE7D, 0xBE80, 0xBE84, 0xBE8C, 0xBE8D, 0xBE8F, 0xBE90,

+    0xBE91, 0xBE98, 0xBE99, 0xBEA8, 0xBED0, 0xBED1, 0xBED4, 0xBED7,

+    0xBED8, 0xBEE0, 0xBEE3, 0xBEE4, 0xBEE5, 0xBEEC, 0xBF01, 0xBF08,

+    0xBF09, 0xBF18, 0xBF19, 0xBF1B, 0xBF1C, 0xBF1D, 0xBF40, 0xBF41,

+    0xBF44, 0xBF48, 0xBF50, 0xBF51, 0xBF55, 0xBF94, 0xBFB0, 0xBFC5,

+    0xBFCC, 0xBFCD, 0xBFD0, 0xBFD4, 0xBFDC, 0xBFDF, 0xBFE1, 0xC03C,

+    0xC051, 0xC058, 0xC05C, 0xC060, 0xC068, 0xC069, 0xC090, 0xC091,

+    0xC094, 0xC098, 0xC0A0, 0xC0A1, 0xC0A3, 0xC0A5, 0xC0AC, 0xC0AD,

+    0xC0AF, 0xC0B0, 0xC0B3, 0xC0B4, 0xC0B5, 0xC0B6, 0xC0BC, 0xC0BD,

+    0xC0BF, 0xC0C0, 0xC0C1, 0xC0C5, 0xC0C8, 0xC0C9, 0xC0CC, 0xC0D0,

+    0xC0D8, 0xC0D9, 0xC0DB, 0xC0DC, 0xC0DD, 0xC0E4, 0xC0E5, 0xC0E8,

+    0xC0EC, 0xC0F4, 0xC0F5, 0xC0F7, 0xC0F9, 0xC100, 0xC104, 0xC108,

+    0xC110, 0xC115, 0xC11C, 0xC11D, 0xC11E, 0xC11F, 0xC120, 0xC123,

+    0xC124, 0xC126, 0xC127, 0xC12C, 0xC12D, 0xC12F, 0xC130, 0xC131,

+    0xC136, 0xC138, 0xC139, 0xC13C, 0xC140, 0xC148, 0xC149, 0xC14B,

+    0xC14C, 0xC14D, 0xC154, 0xC155, 0xC158, 0xC15C, 0xC164, 0xC165,

+    0xC167, 0xC168, 0xC169, 0xC170, 0xC174, 0xC178, 0xC185, 0xC18C,

+    0xC18D, 0xC18E, 0xC190, 0xC194, 0xC196, 0xC19C, 0xC19D, 0xC19F,

+    0xC1A1, 0xC1A5, 0xC1A8, 0xC1A9, 0xC1AC, 0xC1B0, 0xC1BD, 0xC1C4,

+    0xC1C8, 0xC1CC, 0xC1D4, 0xC1D7, 0xC1D8, 0xC1E0, 0xC1E4, 0xC1E8,

+    0xC1F0, 0xC1F1, 0xC1F3, 0xC1FC, 0xC1FD, 0xC200, 0xC204, 0xC20C,

+    0xC20D, 0xC20F, 0xC211, 0xC218, 0xC219, 0xC21C, 0xC21F, 0xC220,

+    0xC228, 0xC229, 0xC22B, 0xC22D, 0xC22F, 0xC231, 0xC232, 0xC234,

+    0xC248, 0xC250, 0xC251, 0xC254, 0xC258, 0xC260, 0xC265, 0xC26C,

+    0xC26D, 0xC270, 0xC274, 0xC27C, 0xC27D, 0xC27F, 0xC281, 0xC288,

+    0xC289, 0xC290, 0xC298, 0xC29B, 0xC29D, 0xC2A4, 0xC2A5, 0xC2A8,

+    0xC2AC, 0xC2AD, 0xC2B4, 0xC2B5, 0xC2B7, 0xC2B9, 0xC2DC, 0xC2DD,

+    0xC2E0, 0xC2E3, 0xC2E4, 0xC2EB, 0xC2EC, 0xC2ED, 0xC2EF, 0xC2F1,

+    0xC2F6, 0xC2F8, 0xC2F9, 0xC2FB, 0xC2FC, 0xC300, 0xC308, 0xC309,

+    0xC30C, 0xC30D, 0xC313, 0xC314, 0xC315, 0xC318, 0xC31C, 0xC324,

+    0xC325, 0xC328, 0xC329, 0xC345, 0xC368, 0xC369, 0xC36C, 0xC370,

+    0xC372, 0xC378, 0xC379, 0xC37C, 0xC37D, 0xC384, 0xC388, 0xC38C,

+    0xC3C0, 0xC3D8, 0xC3D9, 0xC3DC, 0xC3DF, 0xC3E0, 0xC3E2, 0xC3E8,

+    0xC3E9, 0xC3ED, 0xC3F4, 0xC3F5, 0xC3F8, 0xC408, 0xC410, 0xC424,

+    0xC42C, 0xC430, 0xC434, 0xC43C, 0xC43D, 0xC448, 0xC464, 0xC465,

+    0xC468, 0xC46C, 0xC474, 0xC475, 0xC479, 0xC480, 0xC494, 0xC49C,

+    0xC4B8, 0xC4BC, 0xC4E9, 0xC4F0, 0xC4F1, 0xC4F4, 0xC4F8, 0xC4FA,

+    0xC4FF, 0xC500, 0xC501, 0xC50C, 0xC510, 0xC514, 0xC51C, 0xC528,

+    0xC529, 0xC52C, 0xC530, 0xC538, 0xC539, 0xC53B, 0xC53D, 0xC544,

+    0xC545, 0xC548, 0xC549, 0xC54A, 0xC54C, 0xC54D, 0xC54E, 0xC553,

+    0xC554, 0xC555, 0xC557, 0xC558, 0xC559, 0xC55D, 0xC55E, 0xC560,

+    0xC561, 0xC564, 0xC568, 0xC570, 0xC571, 0xC573, 0xC574, 0xC575,

+    0xC57C, 0xC57D, 0xC580, 0xC584, 0xC587, 0xC58C, 0xC58D, 0xC58F,

+    0xC591, 0xC595, 0xC597, 0xC598, 0xC59C, 0xC5A0, 0xC5A9, 0xC5B4,

+    0xC5B5, 0xC5B8, 0xC5B9, 0xC5BB, 0xC5BC, 0xC5BD, 0xC5BE, 0xC5C4,

+    0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9, 0xC5CA, 0xC5CC, 0xC5CE,

+    0xC5D0, 0xC5D1, 0xC5D4, 0xC5D8, 0xC5E0, 0xC5E1, 0xC5E3, 0xC5E5,

+    0xC5EC, 0xC5ED, 0xC5EE, 0xC5F0, 0xC5F4, 0xC5F6, 0xC5F7, 0xC5FC,

+    0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, 0xC605, 0xC606, 0xC607,

+    0xC608, 0xC60C, 0xC610, 0xC618, 0xC619, 0xC61B, 0xC61C, 0xC624,

+    0xC625, 0xC628, 0xC62C, 0xC62D, 0xC62E, 0xC630, 0xC633, 0xC634,

+    0xC635, 0xC637, 0xC639, 0xC63B, 0xC640, 0xC641, 0xC644, 0xC648,

+    0xC650, 0xC651, 0xC653, 0xC654, 0xC655, 0xC65C, 0xC65D, 0xC660,

+    0xC66C, 0xC66F, 0xC671, 0xC678, 0xC679, 0xC67C, 0xC680, 0xC688,

+    0xC689, 0xC68B, 0xC68D, 0xC694, 0xC695, 0xC698, 0xC69C, 0xC6A4,

+    0xC6A5, 0xC6A7, 0xC6A9, 0xC6B0, 0xC6B1, 0xC6B4, 0xC6B8, 0xC6B9,

+    0xC6BA, 0xC6C0, 0xC6C1, 0xC6C3, 0xC6C5, 0xC6CC, 0xC6CD, 0xC6D0,

+    0xC6D4, 0xC6DC, 0xC6DD, 0xC6E0, 0xC6E1, 0xC6E8, 0xC6E9, 0xC6EC,

+    0xC6F0, 0xC6F8, 0xC6F9, 0xC6FD, 0xC704, 0xC705, 0xC708, 0xC70C,

+    0xC714, 0xC715, 0xC717, 0xC719, 0xC720, 0xC721, 0xC724, 0xC728,

+    0xC730, 0xC731, 0xC733, 0xC735, 0xC737, 0xC73C, 0xC73D, 0xC740,

+    0xC744, 0xC74A, 0xC74C, 0xC74D, 0xC74F, 0xC751, 0xC752, 0xC753,

+    0xC754, 0xC755, 0xC756, 0xC757, 0xC758, 0xC75C, 0xC760, 0xC768,

+    0xC76B, 0xC774, 0xC775, 0xC778, 0xC77C, 0xC77D, 0xC77E, 0xC783,

+    0xC784, 0xC785, 0xC787, 0xC788, 0xC789, 0xC78A, 0xC78E, 0xC790,

+    0xC791, 0xC794, 0xC796, 0xC797, 0xC798, 0xC79A, 0xC7A0, 0xC7A1,

+    0xC7A3, 0xC7A4, 0xC7A5, 0xC7A6, 0xC7AC, 0xC7AD, 0xC7B0, 0xC7B4,

+    0xC7BC, 0xC7BD, 0xC7BF, 0xC7C0, 0xC7C1, 0xC7C8, 0xC7C9, 0xC7CC,

+    0xC7CE, 0xC7D0, 0xC7D8, 0xC7DD, 0xC7E4, 0xC7E8, 0xC7EC, 0xC800,

+    0xC801, 0xC804, 0xC808, 0xC80A, 0xC810, 0xC811, 0xC813, 0xC815,

+    0xC816, 0xC81C, 0xC81D, 0xC820, 0xC824, 0xC82C, 0xC82D, 0xC82F,

+    0xC831, 0xC838, 0xC83C, 0xC840, 0xC848, 0xC849, 0xC84C, 0xC84D,

+    0xC854, 0xC870, 0xC871, 0xC874, 0xC878, 0xC87A, 0xC880, 0xC881,

+    0xC883, 0xC885, 0xC886, 0xC887, 0xC88B, 0xC88C, 0xC88D, 0xC894,

+    0xC89D, 0xC89F, 0xC8A1, 0xC8A8, 0xC8BC, 0xC8BD, 0xC8C4, 0xC8C8,

+    0xC8CC, 0xC8D4, 0xC8D5, 0xC8D7, 0xC8D9, 0xC8E0, 0xC8E1, 0xC8E4,

+    0xC8F5, 0xC8FC, 0xC8FD, 0xC900, 0xC904, 0xC905, 0xC906, 0xC90C,

+    0xC90D, 0xC90F, 0xC911, 0xC918, 0xC92C, 0xC934, 0xC950, 0xC951,

+    0xC954, 0xC958, 0xC960, 0xC961, 0xC963, 0xC96C, 0xC970, 0xC974,

+    0xC97C, 0xC988, 0xC989, 0xC98C, 0xC990, 0xC998, 0xC999, 0xC99B,

+    0xC99D, 0xC9C0, 0xC9C1, 0xC9C4, 0xC9C7, 0xC9C8, 0xC9CA, 0xC9D0,

+    0xC9D1, 0xC9D3, 0xC9D5, 0xC9D6, 0xC9D9, 0xC9DA, 0xC9DC, 0xC9DD,

+    0xC9E0, 0xC9E2, 0xC9E4, 0xC9E7, 0xC9EC, 0xC9ED, 0xC9EF, 0xC9F0,

+    0xC9F1, 0xC9F8, 0xC9F9, 0xC9FC, 0xCA00, 0xCA08, 0xCA09, 0xCA0B,

+    0xCA0C, 0xCA0D, 0xCA14, 0xCA18, 0xCA29, 0xCA4C, 0xCA4D, 0xCA50,

+    0xCA54, 0xCA5C, 0xCA5D, 0xCA5F, 0xCA60, 0xCA61, 0xCA68, 0xCA7D,

+    0xCA84, 0xCA98, 0xCABC, 0xCABD, 0xCAC0, 0xCAC4, 0xCACC, 0xCACD,

+    0xCACF, 0xCAD1, 0xCAD3, 0xCAD8, 0xCAD9, 0xCAE0, 0xCAEC, 0xCAF4,

+    0xCB08, 0xCB10, 0xCB14, 0xCB18, 0xCB20, 0xCB21, 0xCB41, 0xCB48,

+    0xCB49, 0xCB4C, 0xCB50, 0xCB58, 0xCB59, 0xCB5D, 0xCB64, 0xCB78,

+    0xCB79, 0xCB9C, 0xCBB8, 0xCBD4, 0xCBE4, 0xCBE7, 0xCBE9, 0xCC0C,

+    0xCC0D, 0xCC10, 0xCC14, 0xCC1C, 0xCC1D, 0xCC21, 0xCC22, 0xCC27,

+    0xCC28, 0xCC29, 0xCC2C, 0xCC2E, 0xCC30, 0xCC38, 0xCC39, 0xCC3B,

+    0xCC3C, 0xCC3D, 0xCC3E, 0xCC44, 0xCC45, 0xCC48, 0xCC4C, 0xCC54,

+    0xCC55, 0xCC57, 0xCC58, 0xCC59, 0xCC60, 0xCC64, 0xCC66, 0xCC68,

+    0xCC70, 0xCC75, 0xCC98, 0xCC99, 0xCC9C, 0xCCA0, 0xCCA8, 0xCCA9,

+    0xCCAB, 0xCCAC, 0xCCAD, 0xCCB4, 0xCCB5, 0xCCB8, 0xCCBC, 0xCCC4,

+    0xCCC5, 0xCCC7, 0xCCC9, 0xCCD0, 0xCCD4, 0xCCE4, 0xCCEC, 0xCCF0,

+    0xCD01, 0xCD08, 0xCD09, 0xCD0C, 0xCD10, 0xCD18, 0xCD19, 0xCD1B,

+    0xCD1D, 0xCD24, 0xCD28, 0xCD2C, 0xCD39, 0xCD5C, 0xCD60, 0xCD64,

+    0xCD6C, 0xCD6D, 0xCD6F, 0xCD71, 0xCD78, 0xCD88, 0xCD94, 0xCD95,

+    0xCD98, 0xCD9C, 0xCDA4, 0xCDA5, 0xCDA7, 0xCDA9, 0xCDB0, 0xCDC4,

+    0xCDCC, 0xCDD0, 0xCDE8, 0xCDEC, 0xCDF0, 0xCDF8, 0xCDF9, 0xCDFB,

+    0xCDFD, 0xCE04, 0xCE08, 0xCE0C, 0xCE14, 0xCE19, 0xCE20, 0xCE21,

+    0xCE24, 0xCE28, 0xCE30, 0xCE31, 0xCE33, 0xCE35, 0xCE58, 0xCE59,

+    0xCE5C, 0xCE5F, 0xCE60, 0xCE61, 0xCE68, 0xCE69, 0xCE6B, 0xCE6D,

+    0xCE74, 0xCE75, 0xCE78, 0xCE7C, 0xCE84, 0xCE85, 0xCE87, 0xCE89,

+    0xCE90, 0xCE91, 0xCE94, 0xCE98, 0xCEA0, 0xCEA1, 0xCEA3, 0xCEA4,

+    0xCEA5, 0xCEAC, 0xCEAD, 0xCEC1, 0xCEE4, 0xCEE5, 0xCEE8, 0xCEEB,

+    0xCEEC, 0xCEF4, 0xCEF5, 0xCEF7, 0xCEF8, 0xCEF9, 0xCF00, 0xCF01,

+    0xCF04, 0xCF08, 0xCF10, 0xCF11, 0xCF13, 0xCF15, 0xCF1C, 0xCF20,

+    0xCF24, 0xCF2C, 0xCF2D, 0xCF2F, 0xCF30, 0xCF31, 0xCF38, 0xCF54,

+    0xCF55, 0xCF58, 0xCF5C, 0xCF64, 0xCF65, 0xCF67, 0xCF69, 0xCF70,

+    0xCF71, 0xCF74, 0xCF78, 0xCF80, 0xCF85, 0xCF8C, 0xCFA1, 0xCFA8,

+    0xCFB0, 0xCFC4, 0xCFE0, 0xCFE1, 0xCFE4, 0xCFE8, 0xCFF0, 0xCFF1,

+    0xCFF3, 0xCFF5, 0xCFFC, 0xD000, 0xD004, 0xD011, 0xD018, 0xD02D,

+    0xD034, 0xD035, 0xD038, 0xD03C, 0xD044, 0xD045, 0xD047, 0xD049,

+    0xD050, 0xD054, 0xD058, 0xD060, 0xD06C, 0xD06D, 0xD070, 0xD074,

+    0xD07C, 0xD07D, 0xD081, 0xD0A4, 0xD0A5, 0xD0A8, 0xD0AC, 0xD0B4,

+    0xD0B5, 0xD0B7, 0xD0B9, 0xD0C0, 0xD0C1, 0xD0C4, 0xD0C8, 0xD0C9,

+    0xD0D0, 0xD0D1, 0xD0D3, 0xD0D4, 0xD0D5, 0xD0DC, 0xD0DD, 0xD0E0,

+    0xD0E4, 0xD0EC, 0xD0ED, 0xD0EF, 0xD0F0, 0xD0F1, 0xD0F8, 0xD10D,

+    0xD130, 0xD131, 0xD134, 0xD138, 0xD13A, 0xD140, 0xD141, 0xD143,

+    0xD144, 0xD145, 0xD14C, 0xD14D, 0xD150, 0xD154, 0xD15C, 0xD15D,

+    0xD15F, 0xD161, 0xD168, 0xD16C, 0xD17C, 0xD184, 0xD188, 0xD1A0,

+    0xD1A1, 0xD1A4, 0xD1A8, 0xD1B0, 0xD1B1, 0xD1B3, 0xD1B5, 0xD1BA,

+    0xD1BC, 0xD1C0, 0xD1D8, 0xD1F4, 0xD1F8, 0xD207, 0xD209, 0xD210,

+    0xD22C, 0xD22D, 0xD230, 0xD234, 0xD23C, 0xD23D, 0xD23F, 0xD241,

+    0xD248, 0xD25C, 0xD264, 0xD280, 0xD281, 0xD284, 0xD288, 0xD290,

+    0xD291, 0xD295, 0xD29C, 0xD2A0, 0xD2A4, 0xD2AC, 0xD2B1, 0xD2B8,

+    0xD2B9, 0xD2BC, 0xD2BF, 0xD2C0, 0xD2C2, 0xD2C8, 0xD2C9, 0xD2CB,

+    0xD2D4, 0xD2D8, 0xD2DC, 0xD2E4, 0xD2E5, 0xD2F0, 0xD2F1, 0xD2F4,

+    0xD2F8, 0xD300, 0xD301, 0xD303, 0xD305, 0xD30C, 0xD30D, 0xD30E,

+    0xD310, 0xD314, 0xD316, 0xD31C, 0xD31D, 0xD31F, 0xD320, 0xD321,

+    0xD325, 0xD328, 0xD329, 0xD32C, 0xD330, 0xD338, 0xD339, 0xD33B,

+    0xD33C, 0xD33D, 0xD344, 0xD345, 0xD37C, 0xD37D, 0xD380, 0xD384,

+    0xD38C, 0xD38D, 0xD38F, 0xD390, 0xD391, 0xD398, 0xD399, 0xD39C,

+    0xD3A0, 0xD3A8, 0xD3A9, 0xD3AB, 0xD3AD, 0xD3B4, 0xD3B8, 0xD3BC,

+    0xD3C4, 0xD3C5, 0xD3C8, 0xD3C9, 0xD3D0, 0xD3D8, 0xD3E1, 0xD3E3,

+    0xD3EC, 0xD3ED, 0xD3F0, 0xD3F4, 0xD3FC, 0xD3FD, 0xD3FF, 0xD401,

+    0xD408, 0xD41D, 0xD440, 0xD444, 0xD45C, 0xD460, 0xD464, 0xD46D,

+    0xD46F, 0xD478, 0xD479, 0xD47C, 0xD47F, 0xD480, 0xD482, 0xD488,

+    0xD489, 0xD48B, 0xD48D, 0xD494, 0xD4A9, 0xD4CC, 0xD4D0, 0xD4D4,

+    0xD4DC, 0xD4DF, 0xD4E8, 0xD4EC, 0xD4F0, 0xD4F8, 0xD4FB, 0xD4FD,

+    0xD504, 0xD508, 0xD50C, 0xD514, 0xD515, 0xD517, 0xD53C, 0xD53D,

+    0xD540, 0xD544, 0xD54C, 0xD54D, 0xD54F, 0xD551, 0xD558, 0xD559,

+    0xD55C, 0xD560, 0xD565, 0xD568, 0xD569, 0xD56B, 0xD56D, 0xD574,

+    0xD575, 0xD578, 0xD57C, 0xD584, 0xD585, 0xD587, 0xD588, 0xD589,

+    0xD590, 0xD5A5, 0xD5C8, 0xD5C9, 0xD5CC, 0xD5D0, 0xD5D2, 0xD5D8,

+    0xD5D9, 0xD5DB, 0xD5DD, 0xD5E4, 0xD5E5, 0xD5E8, 0xD5EC, 0xD5F4,

+    0xD5F5, 0xD5F7, 0xD5F9, 0xD600, 0xD601, 0xD604, 0xD608, 0xD610,

+    0xD611, 0xD613, 0xD614, 0xD615, 0xD61C, 0xD620, 0xD624, 0xD62D,

+    0xD638, 0xD639, 0xD63C, 0xD640, 0xD645, 0xD648, 0xD649, 0xD64B,

+    0xD64D, 0xD651, 0xD654, 0xD655, 0xD658, 0xD65C, 0xD667, 0xD669,

+    0xD670, 0xD671, 0xD674, 0xD683, 0xD685, 0xD68C, 0xD68D, 0xD690,

+    0xD694, 0xD69D, 0xD69F, 0xD6A1, 0xD6A8, 0xD6AC, 0xD6B0, 0xD6B9,

+    0xD6BB, 0xD6C4, 0xD6C5, 0xD6C8, 0xD6CC, 0xD6D1, 0xD6D4, 0xD6D7,

+    0xD6D9, 0xD6E0, 0xD6E4, 0xD6E8, 0xD6F0, 0xD6F5, 0xD6FC, 0xD6FD,

+    0xD700, 0xD704, 0xD711, 0xD718, 0xD719, 0xD71C, 0xD720, 0xD728,

+    0xD729, 0xD72B, 0xD72D, 0xD734, 0xD735, 0xD738, 0xD73C, 0xD744,

+    0xD747, 0xD749, 0xD750, 0xD751, 0xD754, 0xD756, 0xD757, 0xD758,

+    0xD759, 0xD760, 0xD761, 0xD763, 0xD765, 0xD769, 0xD76C, 0xD770,

+    0xD774, 0xD77C, 0xD77D, 0xD781, 0xD788, 0xD789, 0xD78C, 0xD790,

+    0xD798, 0xD799, 0xD79B, 0xD79D, 0x4F3D, 0x4F73, 0x5047, 0x50F9,

+    0x52A0, 0x53EF, 0x5475, 0x54E5, 0x5609, 0x5AC1, 0x5BB6, 0x6687,

+    0x67B6, 0x67B7, 0x67EF, 0x6B4C, 0x73C2, 0x75C2, 0x7A3C, 0x82DB,

+    0x8304, 0x8857, 0x8888, 0x8A36, 0x8CC8, 0x8DCF, 0x8EFB, 0x8FE6,

+    0x99D5, 0x523B, 0x5374, 0x5404, 0x606A, 0x6164, 0x6BBC, 0x73CF,

+    0x811A, 0x89BA, 0x89D2, 0x95A3, 0x4F83, 0x520A, 0x58BE, 0x5978,

+    0x59E6, 0x5E72, 0x5E79, 0x61C7, 0x63C0, 0x6746, 0x67EC, 0x687F,

+    0x6F97, 0x764E, 0x770B, 0x78F5, 0x7A08, 0x7AFF, 0x7C21, 0x809D,

+    0x826E, 0x8271, 0x8AEB, 0x9593, 0x4E6B, 0x559D, 0x66F7, 0x6E34,

+    0x78A3, 0x7AED, 0x845B, 0x8910, 0x874E, 0x97A8, 0x52D8, 0x574E,

+    0x582A, 0x5D4C, 0x611F, 0x61BE, 0x6221, 0x6562, 0x67D1, 0x6A44,

+    0x6E1B, 0x7518, 0x75B3, 0x76E3, 0x77B0, 0x7D3A, 0x90AF, 0x9451,

+    0x9452, 0x9F95, 0x5323, 0x5CAC, 0x7532, 0x80DB, 0x9240, 0x9598,

+    0x525B, 0x5808, 0x59DC, 0x5CA1, 0x5D17, 0x5EB7, 0x5F3A, 0x5F4A,

+    0x6177, 0x6C5F, 0x757A, 0x7586, 0x7CE0, 0x7D73, 0x7DB1, 0x7F8C,

+    0x8154, 0x8221, 0x8591, 0x8941, 0x8B1B, 0x92FC, 0x964D, 0x9C47,

+    0x4ECB, 0x4EF7, 0x500B, 0x51F1, 0x584F, 0x6137, 0x613E, 0x6168,

+    0x6539, 0x69EA, 0x6F11, 0x75A5, 0x7686, 0x76D6, 0x7B87, 0x82A5,

+    0x84CB, 0x93A7, 0x958B, 0x5580, 0x5BA2, 0x5751, 0x7CB3, 0x7FB9,

+    0x91B5, 0x5028, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x636E, 0x64DA,

+    0x64E7, 0x6E20, 0x70AC, 0x795B, 0x8DDD, 0x8E1E, 0x907D, 0x9245,

+    0x92F8, 0x4E7E, 0x4EF6, 0x5065, 0x5DFE, 0x5EFA, 0x6106, 0x6957,

+    0x8171, 0x8654, 0x8E47, 0x9375, 0x9A2B, 0x4E5E, 0x5091, 0x6770,

+    0x6840, 0x5109, 0x528D, 0x5292, 0x6AA2, 0x77BC, 0x9210, 0x9ED4,

+    0x52AB, 0x602F, 0x8FF2, 0x5048, 0x61A9, 0x63ED, 0x64CA, 0x683C,

+    0x6A84, 0x6FC0, 0x8188, 0x89A1, 0x9694, 0x5805, 0x727D, 0x72AC,

+    0x7504, 0x7D79, 0x7E6D, 0x80A9, 0x898B, 0x8B74, 0x9063, 0x9D51,

+    0x6289, 0x6C7A, 0x6F54, 0x7D50, 0x7F3A, 0x8A23, 0x517C, 0x614A,

+    0x7B9D, 0x8B19, 0x9257, 0x938C, 0x4EAC, 0x4FD3, 0x501E, 0x50BE,

+    0x5106, 0x52C1, 0x52CD, 0x537F, 0x5770, 0x5883, 0x5E9A, 0x5F91,

+    0x6176, 0x61AC, 0x64CE, 0x656C, 0x666F, 0x66BB, 0x66F4, 0x6897,

+    0x6D87, 0x7085, 0x70F1, 0x749F, 0x74A5, 0x74CA, 0x75D9, 0x786C,

+    0x78EC, 0x7ADF, 0x7AF6, 0x7D45, 0x7D93, 0x8015, 0x803F, 0x811B,

+    0x8396, 0x8B66, 0x8F15, 0x9015, 0x93E1, 0x9803, 0x9838, 0x9A5A,

+    0x9BE8, 0x4FC2, 0x5553, 0x583A, 0x5951, 0x5B63, 0x5C46, 0x60B8,

+    0x6212, 0x6842, 0x68B0, 0x68E8, 0x6EAA, 0x754C, 0x7678, 0x78CE,

+    0x7A3D, 0x7CFB, 0x7E6B, 0x7E7C, 0x8A08, 0x8AA1, 0x8C3F, 0x968E,

+    0x9DC4, 0x53E4, 0x53E9, 0x544A, 0x5471, 0x56FA, 0x59D1, 0x5B64,

+    0x5C3B, 0x5EAB, 0x62F7, 0x6537, 0x6545, 0x6572, 0x66A0, 0x67AF,

+    0x69C1, 0x6CBD, 0x75FC, 0x7690, 0x777E, 0x7A3F, 0x7F94, 0x8003,

+    0x80A1, 0x818F, 0x82E6, 0x82FD, 0x83F0, 0x85C1, 0x8831, 0x88B4,

+    0x8AA5, 0x8F9C, 0x932E, 0x96C7, 0x9867, 0x9AD8, 0x9F13, 0x54ED,

+    0x659B, 0x66F2, 0x688F, 0x7A40, 0x8C37, 0x9D60, 0x56F0, 0x5764,

+    0x5D11, 0x6606, 0x68B1, 0x68CD, 0x6EFE, 0x7428, 0x889E, 0x9BE4,

+    0x6C68, 0x9AA8, 0x4F9B, 0x516C, 0x5171, 0x529F, 0x5B54, 0x5DE5,

+    0x6050, 0x606D, 0x62F1, 0x63A7, 0x653B, 0x73D9, 0x7A7A, 0x86A3,

+    0x8CA2, 0x978F, 0x4E32, 0x5BE1, 0x6208, 0x679C, 0x74DC, 0x79D1,

+    0x83D3, 0x8A87, 0x8AB2, 0x8DE8, 0x904E, 0x934B, 0x9846, 0x5ED3,

+    0x69E8, 0x85FF, 0x90ED, 0x51A0, 0x5B98, 0x5BEC, 0x6163, 0x68FA,

+    0x6B3E, 0x704C, 0x742F, 0x74D8, 0x7BA1, 0x7F50, 0x83C5, 0x89C0,

+    0x8CAB, 0x95DC, 0x9928, 0x522E, 0x605D, 0x62EC, 0x9002, 0x4F8A,

+    0x5149, 0x5321, 0x58D9, 0x5EE3, 0x66E0, 0x6D38, 0x709A, 0x72C2,

+    0x73D6, 0x7B50, 0x80F1, 0x945B, 0x5366, 0x639B, 0x7F6B, 0x4E56,

+    0x5080, 0x584A, 0x58DE, 0x602A, 0x6127, 0x62D0, 0x69D0, 0x9B41,

+    0x5B8F, 0x7D18, 0x80B1, 0x8F5F, 0x4EA4, 0x50D1, 0x54AC, 0x55AC,

+    0x5B0C, 0x5DA0, 0x5DE7, 0x652A, 0x654E, 0x6821, 0x6A4B, 0x72E1,

+    0x768E, 0x77EF, 0x7D5E, 0x7FF9, 0x81A0, 0x854E, 0x86DF, 0x8F03,

+    0x8F4E, 0x90CA, 0x9903, 0x9A55, 0x9BAB, 0x4E18, 0x4E45, 0x4E5D,

+    0x4EC7, 0x4FF1, 0x5177, 0x52FE, 0x5340, 0x53E3, 0x53E5, 0x548E,

+    0x5614, 0x5775, 0x57A2, 0x5BC7, 0x5D87, 0x5ED0, 0x61FC, 0x62D8,

+    0x6551, 0x67B8, 0x67E9, 0x69CB, 0x6B50, 0x6BC6, 0x6BEC, 0x6C42,

+    0x6E9D, 0x7078, 0x72D7, 0x7396, 0x7403, 0x77BF, 0x77E9, 0x7A76,

+    0x7D7F, 0x8009, 0x81FC, 0x8205, 0x820A, 0x82DF, 0x8862, 0x8B33,

+    0x8CFC, 0x8EC0, 0x9011, 0x90B1, 0x9264, 0x92B6, 0x99D2, 0x9A45,

+    0x9CE9, 0x9DD7, 0x9F9C, 0x570B, 0x5C40, 0x83CA, 0x97A0, 0x97AB,

+    0x9EB4, 0x541B, 0x7A98, 0x7FA4, 0x88D9, 0x8ECD, 0x90E1, 0x5800,

+    0x5C48, 0x6398, 0x7A9F, 0x5BAE, 0x5F13, 0x7A79, 0x7AAE, 0x828E,

+    0x8EAC, 0x5026, 0x5238, 0x52F8, 0x5377, 0x5708, 0x62F3, 0x6372,

+    0x6B0A, 0x6DC3, 0x7737, 0x53A5, 0x7357, 0x8568, 0x8E76, 0x95D5,

+    0x673A, 0x6AC3, 0x6F70, 0x8A6D, 0x8ECC, 0x994B, 0x6677, 0x6B78,

+    0x8CB4, 0x9B3C, 0x53EB, 0x572D, 0x594E, 0x63C6, 0x69FB, 0x73EA,

+    0x7845, 0x7ABA, 0x7AC5, 0x7CFE, 0x8475, 0x898F, 0x8D73, 0x9035,

+    0x95A8, 0x52FB, 0x5747, 0x7547, 0x7B60, 0x83CC, 0x921E, 0x6A58,

+    0x514B, 0x524B, 0x5287, 0x621F, 0x68D8, 0x6975, 0x9699, 0x50C5,

+    0x52A4, 0x52E4, 0x61C3, 0x65A4, 0x6839, 0x69FF, 0x747E, 0x7B4B,

+    0x82B9, 0x83EB, 0x89B2, 0x8B39, 0x8FD1, 0x9949, 0x4ECA, 0x5997,

+    0x64D2, 0x6611, 0x6A8E, 0x7434, 0x7981, 0x79BD, 0x82A9, 0x887E,

+    0x887F, 0x895F, 0x9326, 0x4F0B, 0x53CA, 0x6025, 0x6271, 0x6C72,

+    0x7D1A, 0x7D66, 0x4E98, 0x5162, 0x77DC, 0x80AF, 0x4F01, 0x4F0E,

+    0x5176, 0x5180, 0x55DC, 0x5668, 0x573B, 0x57FA, 0x57FC, 0x5914,

+    0x5947, 0x5993, 0x5BC4, 0x5C90, 0x5D0E, 0x5DF1, 0x5E7E, 0x5FCC,

+    0x6280, 0x65D7, 0x65E3, 0x671E, 0x671F, 0x675E, 0x68CB, 0x68C4,

+    0x6A5F, 0x6B3A, 0x6C23, 0x6C7D, 0x6C82, 0x6DC7, 0x7398, 0x7426,

+    0x742A, 0x7482, 0x74A3, 0x7578, 0x757F, 0x7881, 0x78EF, 0x7941,

+    0x7947, 0x7948, 0x797A, 0x7B95, 0x7D00, 0x7DBA, 0x7F88, 0x8006,

+    0x802D, 0x808C, 0x8A18, 0x8B4F, 0x8C48, 0x8D77, 0x9321, 0x9324,

+    0x98E2, 0x9951, 0x9A0E, 0x9A0F, 0x9A65, 0x9E92, 0x7DCA, 0x4F76,

+    0x5409, 0x62EE, 0x6854, 0x91D1, 0x55AB, 0x513A, 0x5A1C, 0x61E6,

+    0x62CF, 0x62FF, 0x90A3, 0x8AFE, 0x6696, 0x7156, 0x96E3, 0x634F,

+    0x637A, 0x5357, 0x678F, 0x6960, 0x6E73, 0x7537, 0x7D0D, 0x8872,

+    0x56CA, 0x5A18, 0x4E43, 0x5167, 0x5948, 0x67F0, 0x8010, 0x5973,

+    0x5E74, 0x649A, 0x79CA, 0x5FF5, 0x606C, 0x62C8, 0x637B, 0x5BE7,

+    0x5BD7, 0x52AA, 0x5974, 0x5F29, 0x6012, 0x7459, 0x99D1, 0x6FC3,

+    0x81BF, 0x8FB2, 0x60F1, 0x8166, 0x5C3F, 0x5AE9, 0x8A25, 0x677B,

+    0x7D10, 0x80FD, 0x5C3C, 0x6CE5, 0x533F, 0x6EBA, 0x591A, 0x8336,

+    0x4E39, 0x4EB6, 0x4F46, 0x55AE, 0x5718, 0x58C7, 0x5F56, 0x65B7,

+    0x65E6, 0x6A80, 0x6BB5, 0x6E4D, 0x77ED, 0x7AEF, 0x7C1E, 0x7DDE,

+    0x86CB, 0x8892, 0x9132, 0x935B, 0x64BB, 0x6FBE, 0x737A, 0x75B8,

+    0x9054, 0x5556, 0x574D, 0x61BA, 0x64D4, 0x66C7, 0x6DE1, 0x6E5B,

+    0x6F6D, 0x6FB9, 0x75F0, 0x8043, 0x81BD, 0x8541, 0x8983, 0x8AC7,

+    0x8B5A, 0x931F, 0x6C93, 0x7553, 0x7B54, 0x8E0F, 0x905D, 0x5510,

+    0x5802, 0x5858, 0x5E62, 0x6207, 0x649E, 0x68E0, 0x7576, 0x7CD6,

+    0x87B3, 0x9EE8, 0x4EE3, 0x5788, 0x576E, 0x5927, 0x5C0D, 0x5CB1,

+    0x5E36, 0x5F85, 0x6234, 0x64E1, 0x73B3, 0x81FA, 0x888B, 0x8CB8,

+    0x968A, 0x9EDB, 0x5B85, 0x5FB7, 0x60B3, 0x5012, 0x5200, 0x5230,

+    0x5716, 0x5835, 0x5857, 0x5C0E, 0x5C60, 0x5CF6, 0x5D8B, 0x5EA6,

+    0x5F92, 0x60BC, 0x6311, 0x6389, 0x6417, 0x6843, 0x68F9, 0x6AC2,

+    0x6DD8, 0x6E21, 0x6ED4, 0x6FE4, 0x71FE, 0x76DC, 0x7779, 0x79B1,

+    0x7A3B, 0x8404, 0x89A9, 0x8CED, 0x8DF3, 0x8E48, 0x9003, 0x9014,

+    0x9053, 0x90FD, 0x934D, 0x9676, 0x97DC, 0x6BD2, 0x7006, 0x7258,

+    0x72A2, 0x7368, 0x7763, 0x79BF, 0x7BE4, 0x7E9B, 0x8B80, 0x58A9,

+    0x60C7, 0x6566, 0x65FD, 0x66BE, 0x6C8C, 0x711E, 0x71C9, 0x8C5A,

+    0x9813, 0x4E6D, 0x7A81, 0x4EDD, 0x51AC, 0x51CD, 0x52D5, 0x540C,

+    0x61A7, 0x6771, 0x6850, 0x68DF, 0x6D1E, 0x6F7C, 0x75BC, 0x77B3,

+    0x7AE5, 0x80F4, 0x8463, 0x9285, 0x515C, 0x6597, 0x675C, 0x6793,

+    0x75D8, 0x7AC7, 0x8373, 0x8C46, 0x9017, 0x982D, 0x5C6F, 0x81C0,

+    0x829A, 0x9041, 0x906F, 0x920D, 0x5F97, 0x5D9D, 0x6A59, 0x71C8,

+    0x767B, 0x7B49, 0x85E4, 0x8B04, 0x9127, 0x9A30, 0x5587, 0x61F6,

+    0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0x6D1B, 0x70D9,

+    0x73DE, 0x7D61, 0x843D, 0x916A, 0x99F1, 0x4E82, 0x5375, 0x6B04,

+    0x6B12, 0x703E, 0x721B, 0x862D, 0x9E1E, 0x524C, 0x8FA3, 0x5D50,

+    0x64E5, 0x652C, 0x6B16, 0x6FEB, 0x7C43, 0x7E9C, 0x85CD, 0x8964,

+    0x89BD, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, 0x6D6A, 0x72FC,

+    0x7405, 0x746F, 0x8782, 0x90DE, 0x4F86, 0x5D0D, 0x5FA0, 0x840A,

+    0x51B7, 0x63A0, 0x7565, 0x4EAE, 0x5006, 0x5169, 0x51C9, 0x6881,

+    0x6A11, 0x7CAE, 0x7CB1, 0x7CE7, 0x826F, 0x8AD2, 0x8F1B, 0x91CF,

+    0x4FB6, 0x5137, 0x52F5, 0x5442, 0x5EEC, 0x616E, 0x623E, 0x65C5,

+    0x6ADA, 0x6FFE, 0x792A, 0x85DC, 0x8823, 0x95AD, 0x9A62, 0x9A6A,

+    0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x701D, 0x792B, 0x8F62,

+    0x9742, 0x6190, 0x6200, 0x6523, 0x6F23, 0x7149, 0x7489, 0x7DF4,

+    0x806F, 0x84EE, 0x8F26, 0x9023, 0x934A, 0x51BD, 0x5217, 0x52A3,

+    0x6D0C, 0x70C8, 0x88C2, 0x5EC9, 0x6582, 0x6BAE, 0x6FC2, 0x7C3E,

+    0x7375, 0x4EE4, 0x4F36, 0x56F9, 0x5CBA, 0x5DBA, 0x601C, 0x73B2,

+    0x7B2D, 0x7F9A, 0x7FCE, 0x8046, 0x901E, 0x9234, 0x96F6, 0x9748,

+    0x9818, 0x9F61, 0x4F8B, 0x6FA7, 0x79AE, 0x91B4, 0x96B7, 0x52DE,

+    0x6488, 0x64C4, 0x6AD3, 0x6F5E, 0x7018, 0x7210, 0x76E7, 0x8001,

+    0x8606, 0x865C, 0x8DEF, 0x8F05, 0x9732, 0x9B6F, 0x9DFA, 0x9E75,

+    0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x9E93, 0x8AD6,

+    0x58DF, 0x5F04, 0x6727, 0x7027, 0x74CF, 0x7C60, 0x807E, 0x5121,

+    0x7028, 0x7262, 0x78CA, 0x8CC2, 0x8CDA, 0x8CF4, 0x96F7, 0x4E86,

+    0x50DA, 0x5BEE, 0x5ED6, 0x6599, 0x71CE, 0x7642, 0x77AD, 0x804A,

+    0x84FC, 0x907C, 0x9B27, 0x9F8D, 0x58D8, 0x5A41, 0x5C62, 0x6A13,

+    0x6DDA, 0x6F0F, 0x763B, 0x7D2F, 0x7E37, 0x851E, 0x8938, 0x93E4,

+    0x964B, 0x5289, 0x65D2, 0x67F3, 0x69B4, 0x6D41, 0x6E9C, 0x700F,

+    0x7409, 0x7460, 0x7559, 0x7624, 0x786B, 0x8B2C, 0x985E, 0x516D,

+    0x622E, 0x9678, 0x4F96, 0x502B, 0x5D19, 0x6DEA, 0x7DB8, 0x8F2A,

+    0x5F8B, 0x6144, 0x6817, 0x9686, 0x52D2, 0x808B, 0x51DC, 0x51CC,

+    0x695E, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x4FDA, 0x5229, 0x5398,

+    0x540F, 0x550E, 0x5C65, 0x60A7, 0x674E, 0x68A8, 0x6D6C, 0x7281,

+    0x72F8, 0x7406, 0x7483, 0x75E2, 0x7C6C, 0x7F79, 0x7FB8, 0x8389,

+    0x88CF, 0x88E1, 0x91CC, 0x91D0, 0x96E2, 0x9BC9, 0x541D, 0x6F7E,

+    0x71D0, 0x7498, 0x85FA, 0x8EAA, 0x96A3, 0x9C57, 0x9E9F, 0x6797,

+    0x6DCB, 0x7433, 0x81E8, 0x9716, 0x782C, 0x7ACB, 0x7B20, 0x7C92,

+    0x6469, 0x746A, 0x75F2, 0x78BC, 0x78E8, 0x99AC, 0x9B54, 0x9EBB,

+    0x5BDE, 0x5E55, 0x6F20, 0x819C, 0x83AB, 0x9088, 0x4E07, 0x534D,

+    0x5A29, 0x5DD2, 0x5F4E, 0x6162, 0x633D, 0x6669, 0x66FC, 0x6EFF,

+    0x6F2B, 0x7063, 0x779E, 0x842C, 0x8513, 0x883B, 0x8F13, 0x9945,

+    0x9C3B, 0x551C, 0x62B9, 0x672B, 0x6CAB, 0x8309, 0x896A, 0x977A,

+    0x4EA1, 0x5984, 0x5FD8, 0x5FD9, 0x671B, 0x7DB2, 0x7F54, 0x8292,

+    0x832B, 0x83BD, 0x8F1E, 0x9099, 0x57CB, 0x59B9, 0x5A92, 0x5BD0,

+    0x6627, 0x679A, 0x6885, 0x6BCF, 0x7164, 0x7F75, 0x8CB7, 0x8CE3,

+    0x9081, 0x9B45, 0x8108, 0x8C8A, 0x964C, 0x9A40, 0x9EA5, 0x5B5F,

+    0x6C13, 0x731B, 0x76F2, 0x76DF, 0x840C, 0x51AA, 0x8993, 0x514D,

+    0x5195, 0x52C9, 0x68C9, 0x6C94, 0x7704, 0x7720, 0x7DBF, 0x7DEC,

+    0x9762, 0x9EB5, 0x6EC5, 0x8511, 0x51A5, 0x540D, 0x547D, 0x660E,

+    0x669D, 0x6927, 0x6E9F, 0x76BF, 0x7791, 0x8317, 0x84C2, 0x879F,

+    0x9169, 0x9298, 0x9CF4, 0x8882, 0x4FAE, 0x5192, 0x52DF, 0x59C6,

+    0x5E3D, 0x6155, 0x6478, 0x6479, 0x66AE, 0x67D0, 0x6A21, 0x6BCD,

+    0x6BDB, 0x725F, 0x7261, 0x7441, 0x7738, 0x77DB, 0x8017, 0x82BC,

+    0x8305, 0x8B00, 0x8B28, 0x8C8C, 0x6728, 0x6C90, 0x7267, 0x76EE,

+    0x7766, 0x7A46, 0x9DA9, 0x6B7F, 0x6C92, 0x5922, 0x6726, 0x8499,

+    0x536F, 0x5893, 0x5999, 0x5EDF, 0x63CF, 0x6634, 0x6773, 0x6E3A,

+    0x732B, 0x7AD7, 0x82D7, 0x9328, 0x52D9, 0x5DEB, 0x61AE, 0x61CB,

+    0x620A, 0x62C7, 0x64AB, 0x65E0, 0x6959, 0x6B66, 0x6BCB, 0x7121,

+    0x73F7, 0x755D, 0x7E46, 0x821E, 0x8302, 0x856A, 0x8AA3, 0x8CBF,

+    0x9727, 0x9D61, 0x58A8, 0x9ED8, 0x5011, 0x520E, 0x543B, 0x554F,

+    0x6587, 0x6C76, 0x7D0A, 0x7D0B, 0x805E, 0x868A, 0x9580, 0x96EF,

+    0x52FF, 0x6C95, 0x7269, 0x5473, 0x5A9A, 0x5C3E, 0x5D4B, 0x5F4C,

+    0x5FAE, 0x672A, 0x68B6, 0x6963, 0x6E3C, 0x6E44, 0x7709, 0x7C73,

+    0x7F8E, 0x8587, 0x8B0E, 0x8FF7, 0x9761, 0x9EF4, 0x5CB7, 0x60B6,

+    0x610D, 0x61AB, 0x654F, 0x65FB, 0x65FC, 0x6C11, 0x6CEF, 0x739F,

+    0x73C9, 0x7DE1, 0x9594, 0x5BC6, 0x871C, 0x8B10, 0x525D, 0x535A,

+    0x62CD, 0x640F, 0x64B2, 0x6734, 0x6A38, 0x6CCA, 0x73C0, 0x749E,

+    0x7B94, 0x7C95, 0x7E1B, 0x818A, 0x8236, 0x8584, 0x8FEB, 0x96F9,

+    0x99C1, 0x4F34, 0x534A, 0x53CD, 0x53DB, 0x62CC, 0x642C, 0x6500,

+    0x6591, 0x69C3, 0x6CEE, 0x6F58, 0x73ED, 0x7554, 0x7622, 0x76E4,

+    0x76FC, 0x78D0, 0x78FB, 0x792C, 0x7D46, 0x822C, 0x87E0, 0x8FD4,

+    0x9812, 0x98EF, 0x52C3, 0x62D4, 0x64A5, 0x6E24, 0x6F51, 0x767C,

+    0x8DCB, 0x91B1, 0x9262, 0x9AEE, 0x9B43, 0x5023, 0x508D, 0x574A,

+    0x59A8, 0x5C28, 0x5E47, 0x5F77, 0x623F, 0x653E, 0x65B9, 0x65C1,

+    0x6609, 0x678B, 0x699C, 0x6EC2, 0x78C5, 0x7D21, 0x80AA, 0x8180,

+    0x822B, 0x82B3, 0x84A1, 0x868C, 0x8A2A, 0x8B17, 0x90A6, 0x9632,

+    0x9F90, 0x500D, 0x4FF3, 0x57F9, 0x5F98, 0x62DC, 0x6392, 0x676F,

+    0x6E43, 0x7119, 0x76C3, 0x80CC, 0x80DA, 0x88F4, 0x88F5, 0x8919,

+    0x8CE0, 0x8F29, 0x914D, 0x966A, 0x4F2F, 0x4F70, 0x5E1B, 0x67CF,

+    0x6822, 0x767D, 0x767E, 0x9B44, 0x5E61, 0x6A0A, 0x7169, 0x71D4,

+    0x756A, 0x7E41, 0x8543, 0x85E9, 0x98DC, 0x4F10, 0x7B4F, 0x7F70,

+    0x95A5, 0x51E1, 0x5E06, 0x68B5, 0x6C3E, 0x6C4E, 0x6CDB, 0x72AF,

+    0x7BC4, 0x8303, 0x6CD5, 0x743A, 0x50FB, 0x5288, 0x58C1, 0x64D8,

+    0x6A97, 0x74A7, 0x7656, 0x78A7, 0x8617, 0x95E2, 0x9739, 0x535E,

+    0x5F01, 0x8B8A, 0x8FA8, 0x8FAF, 0x908A, 0x5225, 0x77A5, 0x9C49,

+    0x9F08, 0x4E19, 0x5002, 0x5175, 0x5C5B, 0x5E77, 0x661E, 0x663A,

+    0x67C4, 0x68C5, 0x70B3, 0x7501, 0x75C5, 0x79C9, 0x7ADD, 0x8F27,

+    0x9920, 0x9A08, 0x4FDD, 0x5821, 0x5831, 0x5BF6, 0x666E, 0x6B65,

+    0x6D11, 0x6E7A, 0x6F7D, 0x73E4, 0x752B, 0x83E9, 0x88DC, 0x8913,

+    0x8B5C, 0x8F14, 0x4F0F, 0x50D5, 0x5310, 0x535C, 0x5B93, 0x5FA9,

+    0x670D, 0x798F, 0x8179, 0x832F, 0x8514, 0x8907, 0x8986, 0x8F39,

+    0x8F3B, 0x99A5, 0x9C12, 0x672C, 0x4E76, 0x4FF8, 0x5949, 0x5C01,

+    0x5CEF, 0x5CF0, 0x6367, 0x68D2, 0x70FD, 0x71A2, 0x742B, 0x7E2B,

+    0x84EC, 0x8702, 0x9022, 0x92D2, 0x9CF3, 0x4E0D, 0x4ED8, 0x4FEF,

+    0x5085, 0x5256, 0x526F, 0x5426, 0x5490, 0x57E0, 0x592B, 0x5A66,

+    0x5B5A, 0x5B75, 0x5BCC, 0x5E9C, 0x6276, 0x6577, 0x65A7, 0x6D6E,

+    0x6EA5, 0x7236, 0x7B26, 0x7C3F, 0x7F36, 0x8150, 0x8151, 0x819A,

+    0x8240, 0x8299, 0x83A9, 0x8A03, 0x8CA0, 0x8CE6, 0x8CFB, 0x8D74,

+    0x8DBA, 0x90E8, 0x91DC, 0x961C, 0x9644, 0x99D9, 0x9CE7, 0x5317,

+    0x5206, 0x5429, 0x5674, 0x58B3, 0x5954, 0x596E, 0x5FFF, 0x61A4,

+    0x626E, 0x6610, 0x6C7E, 0x711A, 0x76C6, 0x7C89, 0x7CDE, 0x7D1B,

+    0x82AC, 0x8CC1, 0x96F0, 0x4F5B, 0x5F17, 0x5F7F, 0x62C2, 0x5D29,

+    0x670B, 0x68DA, 0x787C, 0x7E43, 0x9D6C, 0x4E15, 0x5099, 0x5315,

+    0x532A, 0x5351, 0x5983, 0x5A62, 0x5E87, 0x60B2, 0x618A, 0x6249,

+    0x6279, 0x6590, 0x6787, 0x69A7, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8,

+    0x6CB8, 0x7435, 0x75FA, 0x7812, 0x7891, 0x79D5, 0x79D8, 0x7C83,

+    0x7DCB, 0x7FE1, 0x80A5, 0x813E, 0x81C2, 0x83F2, 0x871A, 0x88E8,

+    0x8AB9, 0x8B6C, 0x8CBB, 0x9119, 0x975E, 0x98DB, 0x9F3B, 0x56AC,

+    0x5B2A, 0x5F6C, 0x658C, 0x6AB3, 0x6BAF, 0x6D5C, 0x6FF1, 0x7015,

+    0x725D, 0x73AD, 0x8CA7, 0x8CD3, 0x983B, 0x6191, 0x6C37, 0x8058,

+    0x9A01, 0x4E4D, 0x4E8B, 0x4E9B, 0x4ED5, 0x4F3A, 0x4F3C, 0x4F7F,

+    0x4FDF, 0x50FF, 0x53F2, 0x53F8, 0x5506, 0x55E3, 0x56DB, 0x58EB,

+    0x5962, 0x5A11, 0x5BEB, 0x5BFA, 0x5C04, 0x5DF3, 0x5E2B, 0x5F99,

+    0x601D, 0x6368, 0x659C, 0x65AF, 0x67F6, 0x67FB, 0x68AD, 0x6B7B,

+    0x6C99, 0x6CD7, 0x6E23, 0x7009, 0x7345, 0x7802, 0x793E, 0x7940,

+    0x7960, 0x79C1, 0x7BE9, 0x7D17, 0x7D72, 0x8086, 0x820D, 0x838E,

+    0x84D1, 0x86C7, 0x88DF, 0x8A50, 0x8A5E, 0x8B1D, 0x8CDC, 0x8D66,

+    0x8FAD, 0x90AA, 0x98FC, 0x99DF, 0x9E9D, 0x524A, 0x6714, 0x5098,

+    0x522A, 0x5C71, 0x6563, 0x6C55, 0x73CA, 0x7523, 0x759D, 0x7B97,

+    0x849C, 0x9178, 0x9730, 0x4E77, 0x6492, 0x6BBA, 0x715E, 0x85A9,

+    0x4E09, 0x6749, 0x68EE, 0x6E17, 0x829F, 0x8518, 0x886B, 0x63F7,

+    0x6F81, 0x9212, 0x98AF, 0x4E0A, 0x50B7, 0x50CF, 0x511F, 0x5546,

+    0x55AA, 0x5617, 0x5B40, 0x5C19, 0x5CE0, 0x5E38, 0x5E8A, 0x5EA0,

+    0x5EC2, 0x60F3, 0x6851, 0x6A61, 0x6E58, 0x723D, 0x7240, 0x72C0,

+    0x76F8, 0x7965, 0x7BB1, 0x7FD4, 0x88F3, 0x89F4, 0x8A73, 0x8C61,

+    0x8CDE, 0x971C, 0x585E, 0x74BD, 0x8CFD, 0x55C7, 0x7A61, 0x7D22,

+    0x8272, 0x7272, 0x751F, 0x7525, 0x7B19, 0x5885, 0x58FB, 0x5DBC,

+    0x5E8F, 0x5EB6, 0x5F90, 0x6055, 0x6292, 0x637F, 0x654D, 0x6691,

+    0x66D9, 0x66F8, 0x6816, 0x68F2, 0x7280, 0x745E, 0x7B6E, 0x7D6E,

+    0x7DD6, 0x7F72, 0x80E5, 0x8212, 0x85AF, 0x897F, 0x8A93, 0x901D,

+    0x92E4, 0x9ECD, 0x9F20, 0x5915, 0x596D, 0x5E2D, 0x60DC, 0x6614,

+    0x6673, 0x6790, 0x6C50, 0x6DC5, 0x6F5F, 0x77F3, 0x78A9, 0x84C6,

+    0x91CB, 0x932B, 0x4ED9, 0x50CA, 0x5148, 0x5584, 0x5B0B, 0x5BA3,

+    0x6247, 0x657E, 0x65CB, 0x6E32, 0x717D, 0x7401, 0x7444, 0x7487,

+    0x74BF, 0x766C, 0x79AA, 0x7DDA, 0x7E55, 0x7FA8, 0x817A, 0x81B3,

+    0x8239, 0x861A, 0x87EC, 0x8A75, 0x8DE3, 0x9078, 0x9291, 0x9425,

+    0x994D, 0x9BAE, 0x5368, 0x5C51, 0x6954, 0x6CC4, 0x6D29, 0x6E2B,

+    0x820C, 0x859B, 0x893B, 0x8A2D, 0x8AAA, 0x96EA, 0x9F67, 0x5261,

+    0x66B9, 0x6BB2, 0x7E96, 0x87FE, 0x8D0D, 0x9583, 0x965D, 0x651D,

+    0x6D89, 0x71EE, 0x57CE, 0x59D3, 0x5BAC, 0x6027, 0x60FA, 0x6210,

+    0x661F, 0x665F, 0x7329, 0x73F9, 0x76DB, 0x7701, 0x7B6C, 0x8056,

+    0x8072, 0x8165, 0x8AA0, 0x9192, 0x4E16, 0x52E2, 0x6B72, 0x6D17,

+    0x7A05, 0x7B39, 0x7D30, 0x8CB0, 0x53EC, 0x562F, 0x5851, 0x5BB5,

+    0x5C0F, 0x5C11, 0x5DE2, 0x6240, 0x6383, 0x6414, 0x662D, 0x68B3,

+    0x6CBC, 0x6D88, 0x6EAF, 0x701F, 0x70A4, 0x71D2, 0x7526, 0x758F,

+    0x758E, 0x7619, 0x7B11, 0x7BE0, 0x7C2B, 0x7D20, 0x7D39, 0x852C,

+    0x856D, 0x8607, 0x8A34, 0x900D, 0x9061, 0x90B5, 0x92B7, 0x97F6,

+    0x9A37, 0x4FD7, 0x5C6C, 0x675F, 0x6D91, 0x7C9F, 0x7E8C, 0x8B16,

+    0x8D16, 0x901F, 0x5B6B, 0x5DFD, 0x640D, 0x84C0, 0x905C, 0x98E1,

+    0x7387, 0x5B8B, 0x609A, 0x677E, 0x6DDE, 0x8A1F, 0x8AA6, 0x9001,

+    0x980C, 0x5237, 0x7051, 0x788E, 0x9396, 0x8870, 0x91D7, 0x4FEE,

+    0x53D7, 0x55FD, 0x56DA, 0x5782, 0x58FD, 0x5AC2, 0x5B88, 0x5CAB,

+    0x5CC0, 0x5E25, 0x6101, 0x620D, 0x624B, 0x6388, 0x641C, 0x6536,

+    0x6578, 0x6A39, 0x6B8A, 0x6C34, 0x6D19, 0x6F31, 0x71E7, 0x72E9,

+    0x7378, 0x7407, 0x74B2, 0x7626, 0x7761, 0x79C0, 0x7A57, 0x7AEA,

+    0x7CB9, 0x7D8F, 0x7DAC, 0x7E61, 0x7F9E, 0x8129, 0x8331, 0x8490,

+    0x84DA, 0x85EA, 0x8896, 0x8AB0, 0x8B90, 0x8F38, 0x9042, 0x9083,

+    0x916C, 0x9296, 0x92B9, 0x968B, 0x96A7, 0x96A8, 0x96D6, 0x9700,

+    0x9808, 0x9996, 0x9AD3, 0x9B1A, 0x53D4, 0x587E, 0x5919, 0x5B70,

+    0x5BBF, 0x6DD1, 0x6F5A, 0x719F, 0x7421, 0x74B9, 0x8085, 0x83FD,

+    0x5DE1, 0x5F87, 0x5FAA, 0x6042, 0x65EC, 0x6812, 0x696F, 0x6A53,

+    0x6B89, 0x6D35, 0x6DF3, 0x73E3, 0x76FE, 0x77AC, 0x7B4D, 0x7D14,

+    0x8123, 0x821C, 0x8340, 0x84F4, 0x8563, 0x8A62, 0x8AC4, 0x9187,

+    0x931E, 0x9806, 0x99B4, 0x620C, 0x8853, 0x8FF0, 0x9265, 0x5D07,

+    0x5D27, 0x5D69, 0x745F, 0x819D, 0x8768, 0x6FD5, 0x62FE, 0x7FD2,

+    0x8936, 0x8972, 0x4E1E, 0x4E58, 0x50E7, 0x52DD, 0x5347, 0x627F,

+    0x6607, 0x7E69, 0x8805, 0x965E, 0x4F8D, 0x5319, 0x5636, 0x59CB,

+    0x5AA4, 0x5C38, 0x5C4E, 0x5C4D, 0x5E02, 0x5F11, 0x6043, 0x65BD,

+    0x662F, 0x6642, 0x67BE, 0x67F4, 0x731C, 0x77E2, 0x793A, 0x7FC5,

+    0x8494, 0x84CD, 0x8996, 0x8A66, 0x8A69, 0x8AE1, 0x8C55, 0x8C7A,

+    0x57F4, 0x5BD4, 0x5F0F, 0x606F, 0x62ED, 0x690D, 0x6B96, 0x6E5C,

+    0x7184, 0x7BD2, 0x8755, 0x8B58, 0x8EFE, 0x98DF, 0x98FE, 0x4F38,

+    0x4F81, 0x4FE1, 0x547B, 0x5A20, 0x5BB8, 0x613C, 0x65B0, 0x6668,

+    0x71FC, 0x7533, 0x795E, 0x7D33, 0x814E, 0x81E3, 0x8398, 0x85AA,

+    0x85CE, 0x8703, 0x8A0A, 0x8EAB, 0x8F9B, 0x8FC5, 0x5931, 0x5BA4,

+    0x5BE6, 0x6089, 0x5BE9, 0x5C0B, 0x5FC3, 0x6C81, 0x6DF1, 0x700B,

+    0x751A, 0x82AF, 0x8AF6, 0x4EC0, 0x5341, 0x96D9, 0x6C0F, 0x4E9E,

+    0x4FC4, 0x5152, 0x555E, 0x5A25, 0x5CE8, 0x6211, 0x7259, 0x82BD,

+    0x83AA, 0x86FE, 0x8859, 0x8A1D, 0x963F, 0x96C5, 0x9913, 0x9D09,

+    0x9D5D, 0x580A, 0x5CB3, 0x5DBD, 0x5E44, 0x60E1, 0x6115, 0x63E1,

+    0x6A02, 0x6E25, 0x9102, 0x9354, 0x984E, 0x9C10, 0x9F77, 0x5B89,

+    0x5CB8, 0x6309, 0x664F, 0x6848, 0x773C, 0x96C1, 0x978D, 0x9854,

+    0x9B9F, 0x65A1, 0x8B01, 0x8ECB, 0x95BC, 0x5535, 0x5CA9, 0x5DD6,

+    0x5EB5, 0x6697, 0x764C, 0x83F4, 0x95C7, 0x58D3, 0x62BC, 0x72CE,

+    0x9D28, 0x4EF0, 0x592E, 0x600F, 0x663B, 0x6B83, 0x79E7, 0x9D26,

+    0x5393, 0x54C0, 0x57C3, 0x5D16, 0x611B, 0x66D6, 0x6DAF, 0x788D,

+    0x827E, 0x9698, 0x9744, 0x5384, 0x627C, 0x6396, 0x6DB2, 0x7E0A,

+    0x814B, 0x984D, 0x6AFB, 0x7F4C, 0x9DAF, 0x9E1A, 0x4E5F, 0x503B,

+    0x51B6, 0x591C, 0x60F9, 0x63F6, 0x6930, 0x723A, 0x8036, 0x91CE,

+    0x5F31, 0x7D04, 0x82E5, 0x846F, 0x84BB, 0x85E5, 0x8E8D, 0x4F6F,

+    0x58E4, 0x5B43, 0x6059, 0x63DA, 0x6518, 0x656D, 0x6698, 0x694A,

+    0x6A23, 0x6D0B, 0x7001, 0x716C, 0x75D2, 0x760D, 0x79B3, 0x7A70,

+    0x7F8A, 0x8944, 0x8B93, 0x91C0, 0x967D, 0x990A, 0x5704, 0x5FA1,

+    0x65BC, 0x6F01, 0x7600, 0x79A6, 0x8A9E, 0x99AD, 0x9B5A, 0x9F6C,

+    0x5104, 0x61B6, 0x6291, 0x6A8D, 0x81C6, 0x5043, 0x5830, 0x5F66,

+    0x7109, 0x8A00, 0x8AFA, 0x5B7C, 0x8616, 0x4FFA, 0x513C, 0x56B4,

+    0x5944, 0x63A9, 0x6DF9, 0x5DAA, 0x696D, 0x5186, 0x4E88, 0x4F59,

+    0x5982, 0x6B5F, 0x6C5D, 0x74B5, 0x7916, 0x8207, 0x8245, 0x8339,

+    0x8F3F, 0x8F5D, 0x9918, 0x4EA6, 0x57DF, 0x5F79, 0x6613, 0x75AB,

+    0x7E79, 0x8B6F, 0x9006, 0x9A5B, 0x56A5, 0x5827, 0x59F8, 0x5A1F,

+    0x5BB4, 0x5EF6, 0x6350, 0x633B, 0x693D, 0x6C87, 0x6CBF, 0x6D8E,

+    0x6D93, 0x6DF5, 0x6F14, 0x70DF, 0x7136, 0x7159, 0x71C3, 0x71D5,

+    0x784F, 0x786F, 0x7B75, 0x7DE3, 0x7E2F, 0x884D, 0x8EDF, 0x925B,

+    0x9CF6, 0x6085, 0x6D85, 0x71B1, 0x95B1, 0x53AD, 0x67D3, 0x708E,

+    0x7130, 0x7430, 0x8276, 0x82D2, 0x95BB, 0x9AE5, 0x9E7D, 0x66C4,

+    0x71C1, 0x8449, 0x584B, 0x5DB8, 0x5F71, 0x6620, 0x668E, 0x6979,

+    0x69AE, 0x6C38, 0x6CF3, 0x6E36, 0x6F41, 0x6FDA, 0x701B, 0x702F,

+    0x7150, 0x71DF, 0x7370, 0x745B, 0x74D4, 0x76C8, 0x7A4E, 0x7E93,

+    0x82F1, 0x8A60, 0x8FCE, 0x9348, 0x9719, 0x4E42, 0x502A, 0x5208,

+    0x53E1, 0x66F3, 0x6C6D, 0x6FCA, 0x730A, 0x777F, 0x7A62, 0x82AE,

+    0x85DD, 0x8602, 0x88D4, 0x8A63, 0x8B7D, 0x8C6B, 0x92B3, 0x9713,

+    0x9810, 0x4E94, 0x4F0D, 0x4FC9, 0x50B2, 0x5348, 0x543E, 0x5433,

+    0x55DA, 0x5862, 0x58BA, 0x5967, 0x5A1B, 0x5BE4, 0x609F, 0x61CA,

+    0x6556, 0x65FF, 0x6664, 0x68A7, 0x6C5A, 0x6FB3, 0x70CF, 0x71AC,

+    0x7352, 0x7B7D, 0x8708, 0x8AA4, 0x9C32, 0x9F07, 0x5C4B, 0x6C83,

+    0x7344, 0x7389, 0x923A, 0x6EAB, 0x7465, 0x761F, 0x7A69, 0x7E15,

+    0x860A, 0x5140, 0x58C5, 0x64C1, 0x74EE, 0x7515, 0x7670, 0x7FC1,

+    0x9095, 0x96CD, 0x9954, 0x6E26, 0x74E6, 0x7AA9, 0x7AAA, 0x81E5,

+    0x86D9, 0x8778, 0x8A1B, 0x5A49, 0x5B8C, 0x5B9B, 0x68A1, 0x6900,

+    0x6D63, 0x73A9, 0x7413, 0x742C, 0x7897, 0x7DE9, 0x7FEB, 0x8118,

+    0x8155, 0x839E, 0x8C4C, 0x962E, 0x9811, 0x66F0, 0x5F80, 0x65FA,

+    0x6789, 0x6C6A, 0x738B, 0x502D, 0x5A03, 0x6B6A, 0x77EE, 0x5916,

+    0x5D6C, 0x5DCD, 0x7325, 0x754F, 0x50E5, 0x51F9, 0x582F, 0x592D,

+    0x5996, 0x59DA, 0x5BE5, 0x5DA2, 0x62D7, 0x6416, 0x6493, 0x64FE,

+    0x66DC, 0x6A48, 0x71FF, 0x7464, 0x7A88, 0x7AAF, 0x7E47, 0x7E5E,

+    0x8000, 0x8170, 0x87EF, 0x8981, 0x8B20, 0x9059, 0x9080, 0x9952,

+    0x617E, 0x6B32, 0x6D74, 0x7E1F, 0x8925, 0x8FB1, 0x4FD1, 0x50AD,

+    0x5197, 0x52C7, 0x57C7, 0x5889, 0x5BB9, 0x5EB8, 0x6142, 0x6995,

+    0x6D8C, 0x6E67, 0x6EB6, 0x7194, 0x7462, 0x7528, 0x752C, 0x8073,

+    0x8338, 0x84C9, 0x8E0A, 0x9394, 0x93DE, 0x4E8E, 0x4F51, 0x5076,

+    0x512A, 0x53C8, 0x53CB, 0x53F3, 0x5B87, 0x5BD3, 0x5C24, 0x611A,

+    0x6182, 0x65F4, 0x725B, 0x7397, 0x7440, 0x76C2, 0x7950, 0x7991,

+    0x79B9, 0x7D06, 0x7FBD, 0x828B, 0x85D5, 0x865E, 0x8FC2, 0x9047,

+    0x90F5, 0x91EA, 0x9685, 0x96E8, 0x96E9, 0x52D6, 0x5F67, 0x65ED,

+    0x6631, 0x682F, 0x715C, 0x7A36, 0x90C1, 0x980A, 0x4E91, 0x6A52,

+    0x6B9E, 0x6F90, 0x7189, 0x8018, 0x82B8, 0x8553, 0x904B, 0x9695,

+    0x96F2, 0x97FB, 0x851A, 0x9B31, 0x4E90, 0x718A, 0x96C4, 0x5143,

+    0x539F, 0x54E1, 0x5713, 0x5712, 0x57A3, 0x5A9B, 0x5AC4, 0x5BC3,

+    0x6028, 0x613F, 0x63F4, 0x6C85, 0x6D39, 0x6E72, 0x6E90, 0x7230,

+    0x733F, 0x7457, 0x82D1, 0x8881, 0x8F45, 0x9060, 0x9662, 0x9858,

+    0x9D1B, 0x6708, 0x8D8A, 0x925E, 0x4F4D, 0x5049, 0x50DE, 0x5371,

+    0x570D, 0x59D4, 0x5A01, 0x5C09, 0x6170, 0x6690, 0x6E2D, 0x7232,

+    0x744B, 0x7DEF, 0x80C3, 0x840E, 0x8466, 0x853F, 0x875F, 0x885B,

+    0x8918, 0x8B02, 0x9055, 0x97CB, 0x9B4F, 0x4E73, 0x4F91, 0x5112,

+    0x516A, 0x552F, 0x55A9, 0x5B7A, 0x5BA5, 0x5E7C, 0x5E7D, 0x5EBE,

+    0x60A0, 0x60DF, 0x6108, 0x6109, 0x63C4, 0x6538, 0x6709, 0x67D4,

+    0x67DA, 0x6961, 0x6962, 0x6CB9, 0x6D27, 0x6E38, 0x6FE1, 0x7336,

+    0x7337, 0x745C, 0x7531, 0x7652, 0x7DAD, 0x81FE, 0x8438, 0x88D5,

+    0x8A98, 0x8ADB, 0x8AED, 0x8E30, 0x8E42, 0x904A, 0x903E, 0x907A,

+    0x9149, 0x91C9, 0x936E, 0x5809, 0x6BD3, 0x8089, 0x80B2, 0x5141,

+    0x596B, 0x5C39, 0x6F64, 0x73A7, 0x80E4, 0x8D07, 0x9217, 0x958F,

+    0x807F, 0x620E, 0x701C, 0x7D68, 0x878D, 0x57A0, 0x6069, 0x6147,

+    0x6BB7, 0x8ABE, 0x9280, 0x96B1, 0x4E59, 0x541F, 0x6DEB, 0x852D,

+    0x9670, 0x97F3, 0x98EE, 0x63D6, 0x6CE3, 0x9091, 0x51DD, 0x61C9,

+    0x81BA, 0x9DF9, 0x4F9D, 0x501A, 0x5100, 0x5B9C, 0x610F, 0x61FF,

+    0x64EC, 0x6905, 0x6BC5, 0x7591, 0x77E3, 0x7FA9, 0x8264, 0x858F,

+    0x87FB, 0x8863, 0x8ABC, 0x8B70, 0x91AB, 0x4E8C, 0x4EE5, 0x4F0A,

+    0x5937, 0x59E8, 0x5DF2, 0x5F1B, 0x5F5B, 0x6021, 0x723E, 0x73E5,

+    0x7570, 0x75CD, 0x79FB, 0x800C, 0x8033, 0x8084, 0x82E1, 0x8351,

+    0x8CBD, 0x8CB3, 0x9087, 0x98F4, 0x990C, 0x7037, 0x76CA, 0x7FCA,

+    0x7FCC, 0x7FFC, 0x8B1A, 0x4EBA, 0x4EC1, 0x5203, 0x5370, 0x54BD,

+    0x56E0, 0x59FB, 0x5BC5, 0x5F15, 0x5FCD, 0x6E6E, 0x7D6A, 0x8335,

+    0x8693, 0x8A8D, 0x976D, 0x9777, 0x4E00, 0x4F5A, 0x4F7E, 0x58F9,

+    0x65E5, 0x6EA2, 0x9038, 0x93B0, 0x99B9, 0x4EFB, 0x58EC, 0x598A,

+    0x59D9, 0x6041, 0x7A14, 0x834F, 0x8CC3, 0x5165, 0x5344, 0x4ECD,

+    0x5269, 0x5B55, 0x82BF, 0x4ED4, 0x523A, 0x54A8, 0x59C9, 0x59FF,

+    0x5B50, 0x5B57, 0x5B5C, 0x6063, 0x6148, 0x6ECB, 0x7099, 0x716E,

+    0x7386, 0x74F7, 0x75B5, 0x78C1, 0x7D2B, 0x8005, 0x81EA, 0x8328,

+    0x8517, 0x85C9, 0x8AEE, 0x8CC7, 0x96CC, 0x4F5C, 0x52FA, 0x56BC,

+    0x65AB, 0x6628, 0x707C, 0x70B8, 0x7235, 0x7DBD, 0x828D, 0x914C,

+    0x96C0, 0x9D72, 0x5B71, 0x68E7, 0x6B98, 0x6F7A, 0x76DE, 0x5C91,

+    0x66AB, 0x6F5B, 0x7BB4, 0x7C2A, 0x8836, 0x96DC, 0x4E08, 0x4ED7,

+    0x5320, 0x5834, 0x58BB, 0x58EF, 0x596C, 0x5C07, 0x5E33, 0x5E84,

+    0x5F35, 0x638C, 0x66B2, 0x6756, 0x6A1F, 0x6AA3, 0x6B0C, 0x6F3F,

+    0x7246, 0x7350, 0x748B, 0x7AE0, 0x7CA7, 0x8178, 0x81DF, 0x81E7,

+    0x838A, 0x846C, 0x8523, 0x8594, 0x85CF, 0x88DD, 0x8D13, 0x91AC,

+    0x9577, 0x969C, 0x518D, 0x54C9, 0x5728, 0x5BB0, 0x624D, 0x6750,

+    0x683D, 0x6893, 0x6E3D, 0x6ED3, 0x707D, 0x7E21, 0x88C1, 0x8CA1,

+    0x8F09, 0x9F4B, 0x9F4E, 0x722D, 0x7B8F, 0x8ACD, 0x931A, 0x4F47,

+    0x4F4E, 0x5132, 0x5480, 0x59D0, 0x5E95, 0x62B5, 0x6775, 0x696E,

+    0x6A17, 0x6CAE, 0x6E1A, 0x72D9, 0x732A, 0x75BD, 0x7BB8, 0x7D35,

+    0x82E7, 0x83F9, 0x8457, 0x85F7, 0x8A5B, 0x8CAF, 0x8E87, 0x9019,

+    0x90B8, 0x96CE, 0x9F5F, 0x52E3, 0x540A, 0x5AE1, 0x5BC2, 0x6458,

+    0x6575, 0x6EF4, 0x72C4, 0x7684, 0x7A4D, 0x7B1B, 0x7C4D, 0x7E3E,

+    0x7FDF, 0x837B, 0x8B2B, 0x8CCA, 0x8D64, 0x8DE1, 0x8E5F, 0x8FEA,

+    0x8FF9, 0x9069, 0x93D1, 0x4F43, 0x4F7A, 0x50B3, 0x5168, 0x5178,

+    0x524D, 0x526A, 0x5861, 0x587C, 0x5960, 0x5C08, 0x5C55, 0x5EDB,

+    0x609B, 0x6230, 0x6813, 0x6BBF, 0x6C08, 0x6FB1, 0x714E, 0x7420,

+    0x7530, 0x7538, 0x7551, 0x7672, 0x7B4C, 0x7B8B, 0x7BAD, 0x7BC6,

+    0x7E8F, 0x8A6E, 0x8F3E, 0x8F49, 0x923F, 0x9293, 0x9322, 0x942B,

+    0x96FB, 0x985A, 0x986B, 0x991E, 0x5207, 0x622A, 0x6298, 0x6D59,

+    0x7664, 0x7ACA, 0x7BC0, 0x7D76, 0x5360, 0x5CBE, 0x5E97, 0x6F38,

+    0x70B9, 0x7C98, 0x9711, 0x9B8E, 0x9EDE, 0x63A5, 0x647A, 0x8776,

+    0x4E01, 0x4E95, 0x4EAD, 0x505C, 0x5075, 0x5448, 0x59C3, 0x5B9A,

+    0x5E40, 0x5EAD, 0x5EF7, 0x5F81, 0x60C5, 0x633A, 0x653F, 0x6574,

+    0x65CC, 0x6676, 0x6678, 0x67FE, 0x6968, 0x6A89, 0x6B63, 0x6C40,

+    0x6DC0, 0x6DE8, 0x6E1F, 0x6E5E, 0x701E, 0x70A1, 0x738E, 0x73FD,

+    0x753A, 0x775B, 0x7887, 0x798E, 0x7A0B, 0x7A7D, 0x7CBE, 0x7D8E,

+    0x8247, 0x8A02, 0x8AEA, 0x8C9E, 0x912D, 0x914A, 0x91D8, 0x9266,

+    0x92CC, 0x9320, 0x9706, 0x9756, 0x975C, 0x9802, 0x9F0E, 0x5236,

+    0x5291, 0x557C, 0x5824, 0x5E1D, 0x5F1F, 0x608C, 0x63D0, 0x68AF,

+    0x6FDF, 0x796D, 0x7B2C, 0x81CD, 0x85BA, 0x88FD, 0x8AF8, 0x8E44,

+    0x918D, 0x9664, 0x969B, 0x973D, 0x984C, 0x9F4A, 0x4FCE, 0x5146,

+    0x51CB, 0x52A9, 0x5632, 0x5F14, 0x5F6B, 0x63AA, 0x64CD, 0x65E9,

+    0x6641, 0x66FA, 0x66F9, 0x671D, 0x689D, 0x68D7, 0x69FD, 0x6F15,

+    0x6F6E, 0x7167, 0x71E5, 0x722A, 0x74AA, 0x773A, 0x7956, 0x795A,

+    0x79DF, 0x7A20, 0x7A95, 0x7C97, 0x7CDF, 0x7D44, 0x7E70, 0x8087,

+    0x85FB, 0x86A4, 0x8A54, 0x8ABF, 0x8D99, 0x8E81, 0x9020, 0x906D,

+    0x91E3, 0x963B, 0x96D5, 0x9CE5, 0x65CF, 0x7C07, 0x8DB3, 0x93C3,

+    0x5B58, 0x5C0A, 0x5352, 0x62D9, 0x731D, 0x5027, 0x5B97, 0x5F9E,

+    0x60B0, 0x616B, 0x68D5, 0x6DD9, 0x742E, 0x7A2E, 0x7D42, 0x7D9C,

+    0x7E31, 0x816B, 0x8E2A, 0x8E35, 0x937E, 0x9418, 0x4F50, 0x5750,

+    0x5DE6, 0x5EA7, 0x632B, 0x7F6A, 0x4E3B, 0x4F4F, 0x4F8F, 0x505A,

+    0x59DD, 0x80C4, 0x546A, 0x5468, 0x55FE, 0x594F, 0x5B99, 0x5DDE,

+    0x5EDA, 0x665D, 0x6731, 0x67F1, 0x682A, 0x6CE8, 0x6D32, 0x6E4A,

+    0x6F8D, 0x70B7, 0x73E0, 0x7587, 0x7C4C, 0x7D02, 0x7D2C, 0x7DA2,

+    0x821F, 0x86DB, 0x8A3B, 0x8A85, 0x8D70, 0x8E8A, 0x8F33, 0x9031,

+    0x914E, 0x9152, 0x9444, 0x99D0, 0x7AF9, 0x7CA5, 0x4FCA, 0x5101,

+    0x51C6, 0x57C8, 0x5BEF, 0x5CFB, 0x6659, 0x6A3D, 0x6D5A, 0x6E96,

+    0x6FEC, 0x710C, 0x756F, 0x7AE3, 0x8822, 0x9021, 0x9075, 0x96CB,

+    0x99FF, 0x8301, 0x4E2D, 0x4EF2, 0x8846, 0x91CD, 0x537D, 0x6ADB,

+    0x696B, 0x6C41, 0x847A, 0x589E, 0x618E, 0x66FE, 0x62EF, 0x70DD,

+    0x7511, 0x75C7, 0x7E52, 0x84B8, 0x8B49, 0x8D08, 0x4E4B, 0x53EA,

+    0x54AB, 0x5730, 0x5740, 0x5FD7, 0x6301, 0x6307, 0x646F, 0x652F,

+    0x65E8, 0x667A, 0x679D, 0x67B3, 0x6B62, 0x6C60, 0x6C9A, 0x6F2C,

+    0x77E5, 0x7825, 0x7949, 0x7957, 0x7D19, 0x80A2, 0x8102, 0x81F3,

+    0x829D, 0x82B7, 0x8718, 0x8A8C, 0x8D04, 0x8DBE, 0x9072, 0x76F4,

+    0x7A19, 0x7A37, 0x7E54, 0x8077, 0x5507, 0x55D4, 0x5875, 0x632F,

+    0x6422, 0x6649, 0x664B, 0x686D, 0x699B, 0x6B84, 0x6D25, 0x6EB1,

+    0x73CD, 0x7468, 0x74A1, 0x755B, 0x75B9, 0x76E1, 0x771E, 0x778B,

+    0x79E6, 0x7E09, 0x7E1D, 0x81FB, 0x852F, 0x8897, 0x8A3A, 0x8CD1,

+    0x8EEB, 0x8FB0, 0x9032, 0x93AD, 0x9663, 0x9673, 0x9707, 0x4F84,

+    0x53F1, 0x59EA, 0x5AC9, 0x5E19, 0x684E, 0x74C6, 0x75BE, 0x79E9,

+    0x7A92, 0x81A3, 0x86ED, 0x8CEA, 0x8DCC, 0x8FED, 0x659F, 0x6715,

+    0x57F7, 0x6F57, 0x7DDD, 0x8F2F, 0x93F6, 0x96C6, 0x5FB5, 0x61F2,

+    0x6F84, 0x4E14, 0x4F98, 0x501F, 0x53C9, 0x55DF, 0x5D6F, 0x5DEE,

+    0x6B21, 0x6B64, 0x78CB, 0x7B9A, 0x8E49, 0x8ECA, 0x906E, 0x6349,

+    0x643E, 0x7740, 0x7A84, 0x932F, 0x947F, 0x9F6A, 0x64B0, 0x6FAF,

+    0x71E6, 0x74A8, 0x74DA, 0x7AC4, 0x7C12, 0x7E82, 0x7CB2, 0x7E98,

+    0x8B9A, 0x8D0A, 0x947D, 0x9910, 0x994C, 0x5239, 0x5BDF, 0x64E6,

+    0x672D, 0x7D2E, 0x50ED, 0x53C3, 0x5879, 0x6158, 0x6159, 0x61FA,

+    0x65AC, 0x7AD9, 0x8B92, 0x8B96, 0x5009, 0x5021, 0x5275, 0x5531,

+    0x5A3C, 0x5EE0, 0x5F70, 0x6134, 0x655E, 0x660C, 0x6636, 0x66A2,

+    0x69CD, 0x6EC4, 0x6F32, 0x7316, 0x7621, 0x7A93, 0x8139, 0x8259,

+    0x83D6, 0x84BC, 0x50B5, 0x57F0, 0x5BC0, 0x5BE8, 0x5F69, 0x63A1,

+    0x7826, 0x7DB5, 0x83DC, 0x8521, 0x91C7, 0x91F5, 0x518A, 0x67F5,

+    0x7B56, 0x8CAC, 0x51C4, 0x59BB, 0x60BD, 0x8655, 0x501C, 0x5254,

+    0x5C3A, 0x617D, 0x621A, 0x62D3, 0x64F2, 0x65A5, 0x6ECC, 0x7620,

+    0x810A, 0x8E60, 0x965F, 0x96BB, 0x4EDF, 0x5343, 0x5598, 0x5929,

+    0x5DDD, 0x64C5, 0x6CC9, 0x6DFA, 0x7394, 0x7A7F, 0x821B, 0x85A6,

+    0x8CE4, 0x8E10, 0x9077, 0x91E7, 0x95E1, 0x9621, 0x97C6, 0x51F8,

+    0x54F2, 0x5586, 0x5FB9, 0x64A4, 0x6F88, 0x7DB4, 0x8F1F, 0x8F4D,

+    0x9435, 0x50C9, 0x5C16, 0x6CBE, 0x6DFB, 0x751B, 0x77BB, 0x7C3D,

+    0x7C64, 0x8A79, 0x8AC2, 0x581E, 0x59BE, 0x5E16, 0x6377, 0x7252,

+    0x758A, 0x776B, 0x8ADC, 0x8CBC, 0x8F12, 0x5EF3, 0x6674, 0x6DF8,

+    0x807D, 0x83C1, 0x8ACB, 0x9751, 0x9BD6, 0x5243, 0x66FF, 0x6D95,

+    0x6EEF, 0x7DE0, 0x8AE6, 0x902E, 0x905E, 0x9AD4, 0x521D, 0x527F,

+    0x54E8, 0x6194, 0x6284, 0x62DB, 0x68A2, 0x6912, 0x695A, 0x6A35,

+    0x7092, 0x7126, 0x785D, 0x7901, 0x790E, 0x79D2, 0x7A0D, 0x8096,

+    0x8278, 0x82D5, 0x8349, 0x8549, 0x8C82, 0x8D85, 0x9162, 0x918B,

+    0x91AE, 0x4FC3, 0x56D1, 0x71ED, 0x77D7, 0x8700, 0x89F8, 0x5BF8,

+    0x5FD6, 0x6751, 0x90A8, 0x53E2, 0x585A, 0x5BF5, 0x60A4, 0x6181,

+    0x6460, 0x7E3D, 0x8070, 0x8525, 0x9283, 0x64AE, 0x50AC, 0x5D14,

+    0x6700, 0x589C, 0x62BD, 0x63A8, 0x690E, 0x6978, 0x6A1E, 0x6E6B,

+    0x76BA, 0x79CB, 0x82BB, 0x8429, 0x8ACF, 0x8DA8, 0x8FFD, 0x9112,

+    0x914B, 0x919C, 0x9310, 0x9318, 0x939A, 0x96DB, 0x9A36, 0x9C0D,

+    0x4E11, 0x755C, 0x795D, 0x7AFA, 0x7B51, 0x7BC9, 0x7E2E, 0x84C4,

+    0x8E59, 0x8E74, 0x8EF8, 0x9010, 0x6625, 0x693F, 0x7443, 0x51FA,

+    0x672E, 0x9EDC, 0x5145, 0x5FE0, 0x6C96, 0x87F2, 0x885D, 0x8877,

+    0x60B4, 0x81B5, 0x8403, 0x8D05, 0x53D6, 0x5439, 0x5634, 0x5A36,

+    0x5C31, 0x708A, 0x7FE0, 0x805A, 0x8106, 0x81ED, 0x8DA3, 0x9189,

+    0x9A5F, 0x9DF2, 0x5074, 0x4EC4, 0x53A0, 0x60FB, 0x6E2C, 0x5C64,

+    0x4F88, 0x5024, 0x55E4, 0x5CD9, 0x5E5F, 0x6065, 0x6894, 0x6CBB,

+    0x6DC4, 0x71BE, 0x75D4, 0x75F4, 0x7661, 0x7A1A, 0x7A49, 0x7DC7,

+    0x7DFB, 0x7F6E, 0x81F4, 0x86A9, 0x8F1C, 0x96C9, 0x99B3, 0x9F52,

+    0x5247, 0x52C5, 0x98ED, 0x89AA, 0x4E03, 0x67D2, 0x6F06, 0x4FB5,

+    0x5BE2, 0x6795, 0x6C88, 0x6D78, 0x741B, 0x7827, 0x91DD, 0x937C,

+    0x87C4, 0x79E4, 0x7A31, 0x5FEB, 0x4ED6, 0x54A4, 0x553E, 0x58AE,

+    0x59A5, 0x60F0, 0x6253, 0x62D6, 0x6736, 0x6955, 0x8235, 0x9640,

+    0x99B1, 0x99DD, 0x502C, 0x5353, 0x5544, 0x577C, 0x6258, 0x64E2,

+    0x666B, 0x67DD, 0x6FC1, 0x6FEF, 0x7422, 0x7438, 0x8A17, 0x9438,

+    0x5451, 0x5606, 0x5766, 0x5F48, 0x619A, 0x6B4E, 0x7058, 0x70AD,

+    0x7DBB, 0x8A95, 0x596A, 0x812B, 0x63A2, 0x7708, 0x803D, 0x8CAA,

+    0x5854, 0x642D, 0x69BB, 0x5B95, 0x5E11, 0x6E6F, 0x8569, 0x514C,

+    0x53F0, 0x592A, 0x6020, 0x614B, 0x6B86, 0x6C70, 0x6CF0, 0x7B1E,

+    0x80CE, 0x82D4, 0x8DC6, 0x90B0, 0x98B1, 0x64C7, 0x6FA4, 0x6491,

+    0x6504, 0x514E, 0x5410, 0x571F, 0x8A0E, 0x615F, 0x6876, 0x75DB,

+    0x7B52, 0x7D71, 0x901A, 0x5806, 0x69CC, 0x817F, 0x892A, 0x9000,

+    0x9839, 0x5078, 0x5957, 0x59AC, 0x6295, 0x900F, 0x9B2A, 0x615D,

+    0x7279, 0x95D6, 0x5761, 0x5A46, 0x5DF4, 0x628A, 0x64AD, 0x64FA,

+    0x6777, 0x6CE2, 0x6D3E, 0x722C, 0x7436, 0x7834, 0x7F77, 0x82AD,

+    0x8DDB, 0x9817, 0x5224, 0x5742, 0x677F, 0x7248, 0x74E3, 0x8CA9,

+    0x8FA6, 0x9211, 0x962A, 0x516B, 0x53ED, 0x634C, 0x4F69, 0x5504,

+    0x6096, 0x6557, 0x6C9B, 0x6D7F, 0x724C, 0x72FD, 0x7A17, 0x8987,

+    0x8C9D, 0x5F6D, 0x6F8E, 0x70F9, 0x81A8, 0x610E, 0x4FBF, 0x504F,

+    0x6241, 0x7247, 0x7BC7, 0x7DE8, 0x7FE9, 0x904D, 0x97AD, 0x9A19,

+    0x8CB6, 0x576A, 0x5E73, 0x67B0, 0x840D, 0x8A55, 0x5420, 0x5B16,

+    0x5E63, 0x5EE2, 0x5F0A, 0x6583, 0x80BA, 0x853D, 0x9589, 0x965B,

+    0x4F48, 0x5305, 0x530D, 0x530F, 0x5486, 0x54FA, 0x5703, 0x5E03,

+    0x6016, 0x629B, 0x62B1, 0x6355, 0x6CE1, 0x6D66, 0x75B1, 0x7832,

+    0x80DE, 0x812F, 0x82DE, 0x8461, 0x84B2, 0x888D, 0x8912, 0x900B,

+    0x92EA, 0x98FD, 0x9B91, 0x5E45, 0x66B4, 0x66DD, 0x7011, 0x7206,

+    0x4FF5, 0x527D, 0x5F6A, 0x6153, 0x6753, 0x6A19, 0x6F02, 0x74E2,

+    0x7968, 0x8868, 0x8C79, 0x98C7, 0x98C4, 0x9A43, 0x54C1, 0x7A1F,

+    0x6953, 0x8AF7, 0x8C4A, 0x98A8, 0x99AE, 0x5F7C, 0x62AB, 0x75B2,

+    0x76AE, 0x88AB, 0x907F, 0x9642, 0x5339, 0x5F3C, 0x5FC5, 0x6CCC,

+    0x73CC, 0x7562, 0x758B, 0x7B46, 0x82FE, 0x999D, 0x4E4F, 0x903C,

+    0x4E0B, 0x4F55, 0x53A6, 0x590F, 0x5EC8, 0x6630, 0x6CB3, 0x7455,

+    0x8377, 0x8766, 0x8CC0, 0x9050, 0x971E, 0x9C15, 0x58D1, 0x5B78,

+    0x8650, 0x8B14, 0x9DB4, 0x5BD2, 0x6068, 0x608D, 0x65F1, 0x6C57,

+    0x6F22, 0x6FA3, 0x701A, 0x7F55, 0x7FF0, 0x9591, 0x9592, 0x9650,

+    0x97D3, 0x5272, 0x8F44, 0x51FD, 0x542B, 0x54B8, 0x5563, 0x558A,

+    0x6ABB, 0x6DB5, 0x7DD8, 0x8266, 0x929C, 0x9677, 0x9E79, 0x5408,

+    0x54C8, 0x76D2, 0x86E4, 0x95A4, 0x95D4, 0x965C, 0x4EA2, 0x4F09,

+    0x59EE, 0x5AE6, 0x5DF7, 0x6052, 0x6297, 0x676D, 0x6841, 0x6C86,

+    0x6E2F, 0x7F38, 0x809B, 0x822A, 0x9805, 0x4EA5, 0x5055, 0x54B3,

+    0x5793, 0x595A, 0x5B69, 0x5BB3, 0x61C8, 0x6977, 0x6D77, 0x7023,

+    0x87F9, 0x89E3, 0x8A72, 0x8AE7, 0x9082, 0x99ED, 0x9AB8, 0x52BE,

+    0x6838, 0x5016, 0x5E78, 0x674F, 0x8347, 0x884C, 0x4EAB, 0x5411,

+    0x56AE, 0x73E6, 0x9115, 0x97FF, 0x9909, 0x9957, 0x9999, 0x5653,

+    0x589F, 0x865B, 0x8A31, 0x61B2, 0x6AF6, 0x737B, 0x8ED2, 0x6B47,

+    0x96AA, 0x9A57, 0x5955, 0x7200, 0x8D6B, 0x9769, 0x4FD4, 0x5CF4,

+    0x5F26, 0x61F8, 0x665B, 0x6CEB, 0x70AB, 0x7384, 0x73B9, 0x73FE,

+    0x7729, 0x774D, 0x7D43, 0x7D62, 0x7E23, 0x8237, 0x8852, 0x8CE2,

+    0x9249, 0x986F, 0x5B51, 0x7A74, 0x8840, 0x9801, 0x5ACC, 0x4FE0,

+    0x5354, 0x593E, 0x5CFD, 0x633E, 0x6D79, 0x72F9, 0x8105, 0x8107,

+    0x83A2, 0x92CF, 0x9830, 0x4EA8, 0x5144, 0x5211, 0x578B, 0x5F62,

+    0x6CC2, 0x6ECE, 0x7005, 0x7050, 0x70AF, 0x7192, 0x73E9, 0x7469,

+    0x834A, 0x87A2, 0x8861, 0x9008, 0x90A2, 0x93A3, 0x99A8, 0x516E,

+    0x5F57, 0x60E0, 0x6167, 0x66B3, 0x8559, 0x8E4A, 0x91AF, 0x978B,

+    0x4E4E, 0x4E92, 0x547C, 0x58D5, 0x58FA, 0x597D, 0x5CB5, 0x5F27,

+    0x6236, 0x6248, 0x660A, 0x6667, 0x6BEB, 0x6D69, 0x6DCF, 0x6E56,

+    0x6EF8, 0x6F94, 0x6FE0, 0x6FE9, 0x705D, 0x72D0, 0x7425, 0x745A,

+    0x74E0, 0x7693, 0x795C, 0x7CCA, 0x7E1E, 0x80E1, 0x82A6, 0x846B,

+    0x84BF, 0x864E, 0x865F, 0x8774, 0x8B77, 0x8C6A, 0x93AC, 0x9800,

+    0x9865, 0x60D1, 0x6216, 0x9177, 0x5A5A, 0x660F, 0x6DF7, 0x6E3E,

+    0x743F, 0x9B42, 0x5FFD, 0x60DA, 0x7B0F, 0x54C4, 0x5F18, 0x6C5E,

+    0x6CD3, 0x6D2A, 0x70D8, 0x7D05, 0x8679, 0x8A0C, 0x9D3B, 0x5316,

+    0x548C, 0x5B05, 0x6A3A, 0x706B, 0x7575, 0x798D, 0x79BE, 0x82B1,

+    0x83EF, 0x8A71, 0x8B41, 0x8CA8, 0x9774, 0x64F4, 0x652B, 0x78BA,

+    0x78BB, 0x7A6B, 0x4E38, 0x559A, 0x5950, 0x5BA6, 0x5E7B, 0x60A3,

+    0x63DB, 0x6B61, 0x6665, 0x6853, 0x6E19, 0x7165, 0x74B0, 0x7D08,

+    0x9084, 0x9A69, 0x9C25, 0x6D3B, 0x6ED1, 0x733E, 0x8C41, 0x95CA,

+    0x51F0, 0x5E4C, 0x5FA8, 0x604D, 0x60F6, 0x6130, 0x614C, 0x6643,

+    0x6644, 0x69A5, 0x6CC1, 0x6E5F, 0x6EC9, 0x6F62, 0x714C, 0x749C,

+    0x7687, 0x7BC1, 0x7C27, 0x8352, 0x8757, 0x9051, 0x968D, 0x9EC3,

+    0x532F, 0x56DE, 0x5EFB, 0x5F8A, 0x6062, 0x6094, 0x61F7, 0x6666,

+    0x6703, 0x6A9C, 0x6DEE, 0x6FAE, 0x7070, 0x736A, 0x7E6A, 0x81BE,

+    0x8334, 0x86D4, 0x8AA8, 0x8CC4, 0x5283, 0x7372, 0x5B96, 0x6A6B,

+    0x9404, 0x54EE, 0x5686, 0x5B5D, 0x6548, 0x6585, 0x66C9, 0x689F,

+    0x6D8D, 0x6DC6, 0x723B, 0x80B4, 0x9175, 0x9A4D, 0x4FAF, 0x5019,

+    0x539A, 0x540E, 0x543C, 0x5589, 0x55C5, 0x5E3F, 0x5F8C, 0x673D,

+    0x7166, 0x73DD, 0x9005, 0x52DB, 0x52F3, 0x5864, 0x58CE, 0x7104,

+    0x718F, 0x71FB, 0x85B0, 0x8A13, 0x6688, 0x85A8, 0x55A7, 0x6684,

+    0x714A, 0x8431, 0x5349, 0x5599, 0x6BC1, 0x5F59, 0x5FBD, 0x63EE,

+    0x6689, 0x7147, 0x8AF1, 0x8F1D, 0x9EBE, 0x4F11, 0x643A, 0x70CB,

+    0x7566, 0x8667, 0x6064, 0x8B4E, 0x9DF8, 0x5147, 0x51F6, 0x5308,

+    0x6D36, 0x80F8, 0x9ED1, 0x6615, 0x6B23, 0x7098, 0x75D5, 0x5403,

+    0x5C79, 0x7D07, 0x8A16, 0x6B20, 0x6B3D, 0x6B46, 0x5438, 0x6070,

+    0x6D3D, 0x7FD5, 0x8208, 0x50D6, 0x51DE, 0x559C, 0x566B, 0x56CD,

+    0x59EC, 0x5B09, 0x5E0C, 0x6199, 0x6198, 0x6231, 0x665E, 0x66E6,

+    0x7199, 0x71B9, 0x71BA, 0x72A7, 0x79A7, 0x7A00, 0x7FB2, 0x8A70,

+    0x3001, 0x3002, 0x2025, 0x00AD, 0x2015, 0x2225, 0xFF5E, 0x3014,

+    0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E,

+    0x300F, 0x3010, 0x3011, 0x3013, 0xFF01, 0xFF08, 0xFF09, 0xFF0C,

+    0xFF0E, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF3B,

+    0xFF3D, 0xFF3F, 0xFF5B, 0xFF5C, 0xFF5D, 0xFF5E, 0x0020, 0x0021,

+    0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029,

+    0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,

+    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,

+    0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,

+    0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,

+    0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,

+    0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,

+    0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,

+    0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,

+    0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,

+    0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,

+    0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x007E, 0x005C, 0x231C,

+    0x231F, 0x0000, 0x0000, 0x0000, 0x0000, 0x300E, 0x300F, 0x300A,

+    0x300B, 0x3008, 0x3009, 0x0028, 0x0029, 0x0000, 0x0000, 0x0028,

+    0x0029, 0x0028, 0x0029, 0x0000, 0x0000, 0x0028, 0x0029, 0x0000,

+    0x0000, 0x3016, 0x3017, 0x3016, 0x3017, 0x3018, 0x3019, 0x005B,

+    0x005D, 0x0000, 0x0000, 0x263E, 0x263D, 0x2021, 0x2021, 0x2020,

+    0x2021, 0x0000, 0x2217, 0x0000, 0x0000, 0x201F, 0x201B, 0x02D6,

+    0x02D7, 0x00D7, 0x221E, 0x0000, 0x00B1, 0x2213, 0x003E, 0x003C,

+    0x003D, 0x2260, 0x207D, 0x207E, 0x007B, 0x007D, 0x0000, 0x0000,

+    0x2229, 0x222A, 0x2282, 0x2208, 0x03A3, 0x0021, 0x0000, 0x3021,

+    0x3022, 0x3023, 0x0000, 0x0000, 0x0000, 0x4E03, 0x0000, 0x0000,

+    0x5341, 0x0000, 0x0000, 0x0027, 0x3014, 0x3015, 0x002A, 0x0000,

+    0x2217, 0x002A, 0xCDCD, 0x3001, 0x3002, 0x0028, 0x0029, 0x0028,

+    0x0029, 0x0028, 0x0029, 0x3016, 0x3017, 0x3010, 0x3011, 0x0000,

+    0x0000, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,

+    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x00B6, 0x0000, 0x0000,

+    0x22EF, 0x2237, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,

+    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x278A, 0x278B,

+    0x278C, 0x278D, 0x278E, 0x278F, 0x2790, 0x2791, 0x2792, 0x2793,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x0029, 0x24B6, 0x24B7, 0x24B8, 0x24B9,

+    0x24BA, 0x24BB, 0x24BC, 0x24BD, 0x24BE, 0x24BF, 0x24C0, 0x24C1,

+    0x24C2, 0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, 0x24C8, 0x24C9,

+    0x24CA, 0x24CB, 0x24CC, 0x24CD, 0x24CE, 0x24CF, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D,

+    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,

+    0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,

+    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x22CF, 0x22CE, 0x22CF, 0x22CE, 0x2280,

+    0x2281, 0x2270, 0x2271, 0x2272, 0x2273, 0x0000, 0x228A, 0x0000,

+    0x228B, 0x2276, 0x2277, 0x2279, 0x22DA, 0x22DB, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x2221, 0x2245, 0x2243, 0x2248, 0x0000, 0x22A4,

+    0x22AB, 0x0000, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x0000, 0x2460, 0x2461, 0x2462,

+    0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x0029, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,

+    0x0029, 0x0029, 0x0021, 0x00B0, 0x0027, 0x0022, 0x2034, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x0000, 0x0000, 0x2020, 0x2020, 0x2021,

+    0x2020, 0x00A7, 0x0023, 0x002A, 0x002A, 0x0000, 0x0000, 0x2042,

+    0x002A, 0x0000, 0x0000, 0x2042, 0x002A, 0x0000, 0x0000, 0x2022,

+    0x20DF, 0x20DF, 0x0000, 0x20DF, 0x3008, 0x3009, 0x300A, 0x300B,

+    0x261C, 0x261E, 0x0000, 0x0000, 0x20DE, 0x0000, 0x20DE, 0x20DE,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x20DD, 0x20DD, 0x271A, 0x2716,

+    0x0000, 0x25EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x25CC,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20A9, 0x0000, 0x0000,

+    0x262F, 0x0000, 0x262F, 0x262F, 0x0000, 0x0000, 0x0000, 0x3020,

+    0x0000, 0x2776, 0x2777, 0x2778, 0x2779, 0x277A, 0x277B, 0x277C,

+    0x277D, 0x277E, 0x277F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0029, 0x0029, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x2642, 0x22A9, 0x3036, 0x25CB, 0x25D3,

+    0x25A1, 0x2302, 0x0000, 0x25AD, 0x25AD, 0x0000, 0x0000, 0x0000,

+    0x25C7, 0x0000, 0x0000, 0x2206, 0x22BF, 0x231E, 0x0000, 0x2225,

+    0x2226, 0x0000, 0x2253, 0x2251, 0x2266, 0x2267, 0x2213, 0x2295,

+    0x2296, 0x2297, 0x20DD, 0x2314, 0x0000, 0x0000, 0x2262, 0x0000,

+    0x25B1, 0x0000, 0x2222, 0x2250, 0x00D8, 0x234A, 0x22A3, 0x0338,

+    0x0000, 0x226E, 0x226F, 0x2285, 0x2284, 0x2209, 0x220C, 0x22BB,

+    0x0016, 0x225A, 0x2306, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x329E, 0x0000, 0x203C, 0x003F, 0x0000, 0x003F, 0x22C4,

+    0x25C7, 0x22C4, 0x25C6, 0x25AB, 0x25A1, 0x25AB, 0x25A0, 0x25E6,

+    0x25CB, 0x25E6, 0x25CF, 0x25BD, 0x25B3, 0x25B7, 0x25C1, 0x2726,

+    0x25CF, 0x25A0, 0x0000, 0x25CA, 0x3231, 0x3239, 0x33CB, 0x2483,

+    0x2494, 0x2495, 0x2496, 0x2497, 0x0029, 0x0029, 0x0029, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x2192, 0x2190,

+    0x2191, 0x2193, 0x2196, 0x2197, 0x2198, 0x2199, 0x21D0, 0x21CF,

+    0x21CD, 0x21D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x2794, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x279C, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x27BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x21D1, 0x21D3,

+    0x0000, 0x279E, 0x0000, 0x0000, 0x0000, 0x279E, 0x0000, 0x0000,

+    0x21B5, 0x21B1, 0x0000, 0x21B4, 0x21B0, 0x21B3, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x21E6, 0x21E8, 0x21E7, 0x21E9, 0x21BC, 0x21C0, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x21C0, 0x21BC, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x21C4, 0x21C5, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,

+    0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,

+    0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,

+    0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,

+    0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,

+    0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,

+    0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x0029,

+    0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x3294, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x32A5, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x0029, 0x0029, 0x0029, 0x0029, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x2794, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E0, 0x21E1,

+    0x21E2, 0x21E3, 0x0000, 0x27A1, 0x0000, 0x0000, 0x21E6, 0x21E8,

+    0x21E7, 0x21E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x261D, 0x261F,

+    0x0000, 0x0000, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,

+    0x20DD, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,

+    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D,

+    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,

+    0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,

+    0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x3290, 0x328A, 0x328B, 0x328C,

+    0x328D, 0x328E, 0x328F, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,

+    0x20DE, 0x20DE, 0x300C, 0x300D, 0x300E, 0x300F, 0x21E8, 0x21E6,

+    0x21E7, 0x21E9, 0x0022, 0x301F, 0x301D, 0x2036, 0x0060, 0x3001,

+    0x0000, 0x0021, 0x3021, 0x002C, 0x3002, 0xAC02, 0xAC03, 0xAC05,

+    0xAC06, 0xAC0B, 0xAC0C, 0xAC0D, 0xAC0E, 0xAC0F, 0xAC18, 0xAC1E,

+    0xAC1F, 0xAC21, 0xAC22, 0xAC23, 0xAC25, 0xAC26, 0xAC27, 0xAC28,

+    0xAC29, 0xAC2A, 0xAC2B, 0xAC2E, 0xAC32, 0xAC33, 0xAC34, 0xAC35,

+    0xAC36, 0xAC37, 0xAC3A, 0xAC3B, 0xAC3D, 0xAC3E, 0xAC3F, 0xAC41,

+    0xAC42, 0xAC43, 0xAC44, 0xAC45, 0xAC46, 0xAC47, 0xAC48, 0xAC49,

+    0xAC4A, 0xAC4C, 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xAC52, 0xAC53,

+    0xAC55, 0xAC56, 0xAC57, 0xAC59, 0xAC5A, 0xAC5B, 0xAC5D, 0xAC5E,

+    0xAC5F, 0xAC60, 0xAC61, 0xAC62, 0xAC63, 0xAC64, 0xAC65, 0xAC66,

+    0xAC67, 0xAC68, 0xAC69, 0xAC6A, 0xAC6B, 0xAC6C, 0xAC6D, 0xAC6E,

+    0xAC6F, 0xAC72, 0xAC73, 0xAC75, 0xAC76, 0xAC79, 0xAC7B, 0xAC7C,

+    0xAC7D, 0xAC7E, 0xAC7F, 0xAC82, 0xAC87, 0xAC88, 0xAC8D, 0xAC8E,

+    0xAC8F, 0xAC91, 0xAC92, 0xAC93, 0xAC95, 0xAC96, 0xAC97, 0xAC98,

+    0xAC99, 0xAC9A, 0xAC9B, 0xAC9E, 0xACA2, 0xACA3, 0xACA4, 0xACA5,

+    0xACA6, 0xACA7, 0xACAB, 0xACAD, 0xACAE, 0xACB1, 0xACB2, 0xACB3,

+    0xACB4, 0xACB5, 0xACB6, 0xACB7, 0xACBA, 0xACBE, 0xACBF, 0xACC0,

+    0xACC2, 0xACC3, 0xACC5, 0xACC6, 0xACC7, 0xACC9, 0xACCA, 0xACCB,

+    0xACCD, 0xACCE, 0xACCF, 0xACD0, 0xACD1, 0xACD2, 0xACD3, 0xACD4,

+    0xACD6, 0xACD8, 0xACD9, 0xACDA, 0xACDB, 0xACDC, 0xACDD, 0xACDE,

+    0xACDF, 0xACE2, 0xACE3, 0xACE5, 0xACE6, 0xACE9, 0xACEB, 0xACED,

+    0xACEE, 0xACF2, 0xACF4, 0xACF7, 0xACF8, 0xACF9, 0xACFA, 0xACFB,

+    0xACFE, 0xACFF, 0xAD01, 0xAD02, 0xAD03, 0xAD05, 0xAD07, 0xAD08,

+    0xAD09, 0xAD0A, 0xAD0B, 0xAD0E, 0xAD10, 0xAD12, 0xAD13, 0xAD14,

+    0xAD15, 0xAD16, 0xAD17, 0xAD19, 0xAD1A, 0xAD1B, 0xAD1D, 0xAD1E,

+    0xAD1F, 0xAD21, 0xAD22, 0xAD23, 0xAD24, 0xAD25, 0xAD26, 0xAD27,

+    0xAD28, 0xAD2A, 0xAD2B, 0xAD2E, 0xAD2F, 0xAD30, 0xAD31, 0xAD32,

+    0xAD33, 0xAD36, 0xAD37, 0xAD39, 0xAD3A, 0xAD3B, 0xAD3D, 0xAD3E,

+    0xAD3F, 0xAD40, 0xAD41, 0xAD42, 0xAD43, 0xAD46, 0xAD48, 0xAD4A,

+    0xAD4B, 0xAD4C, 0xAD4D, 0xAD4E, 0xAD4F, 0xAD51, 0xAD52, 0xAD53,

+    0xAD55, 0xAD56, 0xAD57, 0xAD59, 0xAD5A, 0xAD5B, 0xAD5C, 0xAD5D,

+    0xAD5E, 0xAD5F, 0xAD60, 0xAD62, 0xAD64, 0xAD65, 0xAD66, 0xAD67,

+    0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6E, 0xAD6F, 0xAD71, 0xAD72,

+    0xAD77, 0xAD78, 0xAD79, 0xAD7A, 0xAD7E, 0xAD80, 0xAD83, 0xAD84,

+    0xAD85, 0xAD86, 0xAD87, 0xAD8A, 0xAD8B, 0xAD8D, 0xAD8E, 0xAD8F,

+    0xAD91, 0xAD92, 0xAD93, 0xAD94, 0xAD95, 0xAD96, 0xAD97, 0xAD98,

+    0xAD99, 0xAD9A, 0xAD9B, 0xAD9E, 0xAD9F, 0xADA0, 0xADA1, 0xADA2,

+    0xADA3, 0xADA5, 0xADA6, 0xADA7, 0xADA8, 0xADA9, 0xADAA, 0xADAB,

+    0xADAC, 0xADAD, 0xADAE, 0xADAF, 0xADB0, 0xADB1, 0xADB2, 0xADB3,

+    0xADB4, 0xADB5, 0xADB6, 0xADB8, 0xADB9, 0xADBA, 0xADBB, 0xADBC,

+    0xADBD, 0xADBE, 0xADBF, 0xADC2, 0xADC3, 0xADC5, 0xADC6, 0xADC7,

+    0xADC9, 0xADCA, 0xADCB, 0xADCC, 0xADCD, 0xADCE, 0xADCF, 0xADD2,

+    0xADD4, 0xADD5, 0xADD6, 0xADD7, 0xADD8, 0xADD9, 0xADDA, 0xADDB,

+    0xADDD, 0xADDE, 0xADDF, 0xADE1, 0xADE2, 0xADE3, 0xADE5, 0xADE6,

+    0xADE7, 0xADE8, 0xADE9, 0xADEA, 0xADEB, 0xADEC, 0xADED, 0xADEE,

+    0xADEF, 0xADF0, 0xADF1, 0xADF2, 0xADF3, 0xADF4, 0xADF5, 0xADF6,

+    0xADF7, 0xADFA, 0xADFB, 0xADFD, 0xADFE, 0xAE02, 0xAE03, 0xAE04,

+    0xAE05, 0xAE06, 0xAE07, 0xAE0A, 0xAE0C, 0xAE0E, 0xAE0F, 0xAE10,

+    0xAE11, 0xAE12, 0xAE13, 0xAE15, 0xAE16, 0xAE17, 0xAE18, 0xAE19,

+    0xAE1A, 0xAE1B, 0xAE1C, 0xAE1D, 0xAE1E, 0xAE1F, 0xAE20, 0xAE21,

+    0xAE22, 0xAE23, 0xAE24, 0xAE25, 0xAE26, 0xAE27, 0xAE28, 0xAE29,

+    0xAE2A, 0xAE2B, 0xAE2C, 0xAE2D, 0xAE2E, 0xAE2F, 0xAE32, 0xAE33,

+    0xAE35, 0xAE36, 0xAE39, 0xAE3B, 0xAE3C, 0xAE3D, 0xAE3E, 0xAE3F,

+    0xAE42, 0xAE44, 0xAE47, 0xAE48, 0xAE49, 0xAE4B, 0xAE4F, 0xAE51,

+    0xAE52, 0xAE53, 0xAE55, 0xAE57, 0xAE58, 0xAE59, 0xAE5A, 0xAE5B,

+    0xAE5E, 0xAE62, 0xAE63, 0xAE64, 0xAE66, 0xAE67, 0xAE6A, 0xAE6B,

+    0xAE6D, 0xAE6E, 0xAE6F, 0xAE71, 0xAE72, 0xAE73, 0xAE74, 0xAE75,

+    0xAE76, 0xAE77, 0xAE7A, 0xAE7E, 0xAE7F, 0xAE80, 0xAE81, 0xAE82,

+    0xAE83, 0xAE86, 0xAE87, 0xAE88, 0xAE89, 0xAE8A, 0xAE8B, 0xAE8D,

+    0xAE8E, 0xAE8F, 0xAE90, 0xAE91, 0xAE92, 0xAE93, 0xAE94, 0xAE95,

+    0xAE96, 0xAE97, 0xAE98, 0xAE99, 0xAE9A, 0xAE9B, 0xAE9C, 0xAE9D,

+    0xAE9E, 0xAE9F, 0xAEA0, 0xAEA1, 0xAEA2, 0xAEA3, 0xAEA4, 0xAEA5,

+    0xAEA6, 0xAEA7, 0xAEA8, 0xAEA9, 0xAEAA, 0xAEAB, 0xAEAC, 0xAEAD,

+    0xAEAE, 0xAEAF, 0xAEB0, 0xAEB1, 0xAEB2, 0xAEB3, 0xAEB4, 0xAEB5,

+    0xAEB6, 0xAEB7, 0xAEB8, 0xAEB9, 0xAEBA, 0xAEBB, 0xAEBF, 0xAEC1,

+    0xAEC2, 0xAEC3, 0xAEC5, 0xAEC6, 0xAEC7, 0xAEC8, 0xAEC9, 0xAECA,

+    0xAECB, 0xAECE, 0xAED2, 0xAED3, 0xAED4, 0xAED5, 0xAED6, 0xAED7,

+    0xAEDA, 0xAEDB, 0xAEDD, 0xAEDE, 0xAEDF, 0xAEE0, 0xAEE1, 0xAEE2,

+    0xAEE3, 0xAEE4, 0xAEE5, 0xAEE6, 0xAEE7, 0xAEE9, 0xAEEA, 0xAEEC,

+    0xAEEE, 0xAEEF, 0xAEF0, 0xAEF1, 0xAEF2, 0xAEF3, 0xAEF5, 0xAEF6,

+    0xAEF7, 0xAEF9, 0xAEFA, 0xAEFB, 0xAEFD, 0xAEFE, 0xAEFF, 0xAF00,

+    0xAF01, 0xAF02, 0xAF03, 0xAF04, 0xAF05, 0xAF06, 0xAF09, 0xAF0A,

+    0xAF0B, 0xAF0C, 0xAF0E, 0xAF0F, 0xAF11, 0xAF12, 0xAF13, 0xAF14,

+    0xAF15, 0xAF16, 0xAF17, 0xAF18, 0xAF19, 0xAF1A, 0xAF1B, 0xAF1C,

+    0xAF1D, 0xAF1E, 0xAF1F, 0xAF20, 0xAF21, 0xAF22, 0xAF23, 0xAF24,

+    0xAF25, 0xAF26, 0xAF27, 0xAF28, 0xAF29, 0xAF2A, 0xAF2B, 0xAF2E,

+    0xAF2F, 0xAF31, 0xAF33, 0xAF35, 0xAF36, 0xAF37, 0xAF38, 0xAF39,

+    0xAF3A, 0xAF3B, 0xAF3E, 0xAF40, 0xAF44, 0xAF45, 0xAF46, 0xAF47,

+    0xAF4A, 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E, 0xAF4F, 0xAF51, 0xAF52,

+    0xAF53, 0xAF54, 0xAF55, 0xAF56, 0xAF57, 0xAF58, 0xAF59, 0xAF5A,

+    0xAF5B, 0xAF5E, 0xAF5F, 0xAF60, 0xAF61, 0xAF62, 0xAF63, 0xAF66,

+    0xAF67, 0xAF68, 0xAF69, 0xAF6A, 0xAF6B, 0xAF6C, 0xAF6D, 0xAF6E,

+    0xAF6F, 0xAF70, 0xAF71, 0xAF72, 0xAF73, 0xAF74, 0xAF75, 0xAF76,

+    0xAF77, 0xAF78, 0xAF7A, 0xAF7B, 0xAF7C, 0xAF7D, 0xAF7E, 0xAF7F,

+    0xAF81, 0xAF82, 0xAF83, 0xAF85, 0xAF86, 0xAF87, 0xAF89, 0xAF8A,

+    0xAF8B, 0xAF8C, 0xAF8D, 0xAF8E, 0xAF8F, 0xAF92, 0xAF93, 0xAF94,

+    0xAF96, 0xAF97, 0xAF98, 0xAF99, 0xAF9A, 0xAF9B, 0xAF9D, 0xAF9E,

+    0xAF9F, 0xAFA0, 0xAFA1, 0xAFA2, 0xAFA3, 0xAFA4, 0xAFA5, 0xAFA6,

+    0xAFA7, 0xAFA8, 0xAFA9, 0xAFAA, 0xAFAB, 0xAFAC, 0xAFAD, 0xAFAE,

+    0xAFAF, 0xAFB0, 0xAFB1, 0xAFB2, 0xAFB3, 0xAFB4, 0xAFB5, 0xAFB6,

+    0xAFB7, 0xAFBA, 0xAFBB, 0xAFBD, 0xAFBE, 0xAFBF, 0xAFC1, 0xAFC2,

+    0xAFC3, 0xAFC4, 0xAFC5, 0xAFC6, 0xAFCA, 0xAFCC, 0xAFCF, 0xAFD0,

+    0xAFD1, 0xAFD2, 0xAFD3, 0xAFD5, 0xAFD6, 0xAFD7, 0xAFD8, 0xAFD9,

+    0xAFDA, 0xAFDB, 0xAFDD, 0xAFDE, 0xAFDF, 0xAFE0, 0xAFE1, 0xAFE2,

+    0xAFE3, 0xAFE4, 0xAFE5, 0xAFE6, 0xAFE7, 0xAFEA, 0xAFEB, 0xAFEC,

+    0xAFED, 0xAFEE, 0xAFEF, 0xAFF2, 0xAFF3, 0xAFF5, 0xAFF6, 0xAFF7,

+    0xAFF9, 0xAFFA, 0xAFFB, 0xAFFC, 0xAFFD, 0xAFFE, 0xAFFF, 0xB002,

+    0xB003, 0xB005, 0xB006, 0xB007, 0xB008, 0xB009, 0xB00A, 0xB00B,

+    0xB00D, 0xB00E, 0xB00F, 0xB011, 0xB012, 0xB013, 0xB015, 0xB016,

+    0xB017, 0xB018, 0xB019, 0xB01A, 0xB01B, 0xB01E, 0xB01F, 0xB020,

+    0xB021, 0xB022, 0xB023, 0xB024, 0xB025, 0xB026, 0xB027, 0xB029,

+    0xB02A, 0xB02B, 0xB02C, 0xB02D, 0xB02E, 0xB02F, 0xB030, 0xB031,

+    0xB032, 0xB033, 0xB034, 0xB035, 0xB036, 0xB037, 0xB038, 0xB039,

+    0xB03A, 0xB03B, 0xB03C, 0xB03D, 0xB03E, 0xB03F, 0xB040, 0xB041,

+    0xB042, 0xB043, 0xB046, 0xB047, 0xB049, 0xB04B, 0xB04D, 0xB04F,

+    0xB050, 0xB051, 0xB052, 0xB056, 0xB058, 0xB05A, 0xB05B, 0xB05C,

+    0xB05E, 0xB05F, 0xB060, 0xB061, 0xB062, 0xB063, 0xB064, 0xB065,

+    0xB066, 0xB067, 0xB068, 0xB069, 0xB06A, 0xB06B, 0xB06C, 0xB06D,

+    0xB06E, 0xB06F, 0xB070, 0xB071, 0xB072, 0xB073, 0xB074, 0xB075,

+    0xB076, 0xB077, 0xB078, 0xB079, 0xB07A, 0xB07B, 0xB07E, 0xB07F,

+    0xB081, 0xB082, 0xB083, 0xB085, 0xB086, 0xB087, 0xB088, 0xB089,

+    0xB08A, 0xB08B, 0xB08E, 0xB090, 0xB092, 0xB093, 0xB094, 0xB095,

+    0xB096, 0xB097, 0xB09B, 0xB09D, 0xB09E, 0xB0A3, 0xB0A4, 0xB0A5,

+    0xB0A6, 0xB0A7, 0xB0AA, 0xB0B0, 0xB0B2, 0xB0B6, 0xB0B7, 0xB0B9,

+    0xB0BA, 0xB0BB, 0xB0BD, 0xB0BE, 0xB0BF, 0xB0C0, 0xB0C1, 0xB0C2,

+    0xB0C3, 0xB0C6, 0xB0CA, 0xB0CB, 0xB0CC, 0xB0CD, 0xB0CE, 0xB0CF,

+    0xB0D2, 0xB0D3, 0xB0D5, 0xB0D6, 0xB0D7, 0xB0D9, 0xB0DA, 0xB0DB,

+    0xB0DC, 0xB0DD, 0xB0DE, 0xB0DF, 0xB0E1, 0xB0E2, 0xB0E3, 0xB0E4,

+    0xB0E6, 0xB0E7, 0xB0E8, 0xB0E9, 0xB0EA, 0xB0EB, 0xB0EC, 0xB0ED,

+    0xB0EE, 0xB0EF, 0xB0F0, 0xB0F1, 0xB0F2, 0xB0F3, 0xB0F4, 0xB0F5,

+    0xB0F6, 0xB0F7, 0xB0F8, 0xB0F9, 0xB0FA, 0xB0FB, 0xB0FC, 0xB0FD,

+    0xB0FE, 0xB0FF, 0xB100, 0xB101, 0xB102, 0xB103, 0xB104, 0xB105,

+    0xB106, 0xB107, 0xB10A, 0xB10D, 0xB10E, 0xB10F, 0xB111, 0xB114,

+    0xB115, 0xB116, 0xB117, 0xB11A, 0xB11E, 0xB11F, 0xB120, 0xB121,

+    0xB122, 0xB126, 0xB127, 0xB129, 0xB12A, 0xB12B, 0xB12D, 0xB12E,

+    0xB12F, 0xB130, 0xB131, 0xB132, 0xB133, 0xB136, 0xB13A, 0xB13B,

+    0xB13C, 0xB13D, 0xB13E, 0xB13F, 0xB142, 0xB143, 0xB145, 0xB146,

+    0xB147, 0xB149, 0xB14A, 0xB14B, 0xB14C, 0xB14D, 0xB14E, 0xB14F,

+    0xB152, 0xB153, 0xB156, 0xB157, 0xB159, 0xB15A, 0xB15B, 0xB15D,

+    0xB15E, 0xB15F, 0xB161, 0xB162, 0xB163, 0xB164, 0xB165, 0xB166,

+    0xB167, 0xB168, 0xB169, 0xB16A, 0xB16B, 0xB16C, 0xB16D, 0xB16E,

+    0xB16F, 0xB170, 0xB171, 0xB172, 0xB173, 0xB174, 0xB175, 0xB176,

+    0xB177, 0xB17A, 0xB17B, 0xB17D, 0xB17E, 0xB17F, 0xB181, 0xB183,

+    0xB184, 0xB185, 0xB186, 0xB187, 0xB18A, 0xB18C, 0xB18E, 0xB18F,

+    0xB190, 0xB191, 0xB195, 0xB196, 0xB197, 0xB199, 0xB19A, 0xB19B,

+    0xB19D, 0xB19E, 0xB19F, 0xB1A0, 0xB1A1, 0xB1A2, 0xB1A3, 0xB1A4,

+    0xB1A5, 0xB1A6, 0xB1A7, 0xB1A9, 0xB1AA, 0xB1AB, 0xB1AC, 0xB1AD,

+    0xB1AE, 0xB1AF, 0xB1B0, 0xB1B1, 0xB1B2, 0xB1B3, 0xB1B4, 0xB1B5,

+    0xB1B6, 0xB1B7, 0xB1B8, 0xB1B9, 0xB1BA, 0xB1BB, 0xB1BC, 0xB1BD,

+    0xB1BE, 0xB1BF, 0xB1C0, 0xB1C1, 0xB1C2, 0xB1C3, 0xB1C4, 0xB1C5,

+    0xB1C6, 0xB1C7, 0xB1C8, 0xB1C9, 0xB1CA, 0xB1CB, 0xB1CD, 0xB1CE,

+    0xB1CF, 0xB1D1, 0xB1D2, 0xB1D3, 0xB1D5, 0xB1D6, 0xB1D7, 0xB1D8,

+    0xB1D9, 0xB1DA, 0xB1DB, 0xB1DE, 0xB1E0, 0xB1E1, 0xB1E2, 0xB1E3,

+    0xB1E4, 0xB1E5, 0xB1E6, 0xB1E7, 0xB1EA, 0xB1EB, 0xB1ED, 0xB1EE,

+    0xB1EF, 0xB1F1, 0xB1F2, 0xB1F3, 0xB1F4, 0xB1F5, 0xB1F6, 0xB1F7,

+    0xB1F8, 0xB1FA, 0xB1FC, 0xB1FE, 0xB1FF, 0xB200, 0xB201, 0xB202,

+    0xB203, 0xB206, 0xB207, 0xB209, 0xB20A, 0xB20D, 0xB20E, 0xB20F,

+    0xB210, 0xB211, 0xB212, 0xB213, 0xB216, 0xB218, 0xB21A, 0xB21B,

+    0xB21C, 0xB21D, 0xB21E, 0xB21F, 0xB221, 0xB222, 0xB223, 0xB224,

+    0xB225, 0xB226, 0xB227, 0xB228, 0xB229, 0xB22A, 0xB22B, 0xB22C,

+    0xB22D, 0xB22E, 0xB22F, 0xB230, 0xB231, 0xB232, 0xB233, 0xB235,

+    0xB236, 0xB237, 0xB238, 0xB239, 0xB23A, 0xB23B, 0xB23D, 0xB23E,

+    0xB23F, 0xB240, 0xB241, 0xB242, 0xB243, 0xB244, 0xB245, 0xB246,

+    0xB247, 0xB248, 0xB249, 0xB24A, 0xB24B, 0xB24C, 0xB24D, 0xB24E,

+    0xB24F, 0xB250, 0xB251, 0xB252, 0xB253, 0xB254, 0xB255, 0xB256,

+    0xB257, 0xB259, 0xB25A, 0xB25B, 0xB25D, 0xB25E, 0xB25F, 0xB261,

+    0xB262, 0xB263, 0xB264, 0xB265, 0xB266, 0xB267, 0xB26A, 0xB26B,

+    0xB26C, 0xB26D, 0xB26E, 0xB26F, 0xB270, 0xB271, 0xB272, 0xB273,

+    0xB276, 0xB277, 0xB278, 0xB279, 0xB27A, 0xB27B, 0xB27D, 0xB27E,

+    0xB27F, 0xB280, 0xB281, 0xB282, 0xB283, 0xB286, 0xB287, 0xB288,

+    0xB28A, 0xB28B, 0xB28C, 0xB28D, 0xB28E, 0xB28F, 0xB292, 0xB293,

+    0xB295, 0xB296, 0xB297, 0xB29B, 0xB29C, 0xB29D, 0xB29E, 0xB29F,

+    0xB2A2, 0xB2A4, 0xB2A7, 0xB2A8, 0xB2A9, 0xB2AB, 0xB2AD, 0xB2AE,

+    0xB2AF, 0xB2B1, 0xB2B2, 0xB2B3, 0xB2B5, 0xB2B6, 0xB2B7, 0xB2B8,

+    0xB2B9, 0xB2BA, 0xB2BB, 0xB2BC, 0xB2BD, 0xB2BE, 0xB2BF, 0xB2C0,

+    0xB2C1, 0xB2C2, 0xB2C3, 0xB2C4, 0xB2C5, 0xB2C6, 0xB2C7, 0xB2CA,

+    0xB2CB, 0xB2CD, 0xB2CE, 0xB2CF, 0xB2D1, 0xB2D3, 0xB2D4, 0xB2D5,

+    0xB2D6, 0xB2D7, 0xB2DA, 0xB2DC, 0xB2DE, 0xB2DF, 0xB2E0, 0xB2E1,

+    0xB2E3, 0xB2E7, 0xB2E9, 0xB2EA, 0xB2F0, 0xB2F1, 0xB2F2, 0xB2F6,

+    0xB2FC, 0xB2FD, 0xB2FE, 0xB302, 0xB303, 0xB305, 0xB306, 0xB307,

+    0xB309, 0xB30A, 0xB30B, 0xB30C, 0xB30D, 0xB30E, 0xB30F, 0xB312,

+    0xB316, 0xB317, 0xB318, 0xB319, 0xB31A, 0xB31B, 0xB31D, 0xB31E,

+    0xB31F, 0xB320, 0xB321, 0xB322, 0xB323, 0xB324, 0xB325, 0xB326,

+    0xB327, 0xB328, 0xB329, 0xB32A, 0xB32B, 0xB32C, 0xB32D, 0xB32E,

+    0xB32F, 0xB330, 0xB331, 0xB332, 0xB333, 0xB334, 0xB335, 0xB336,

+    0xB337, 0xB338, 0xB339, 0xB33A, 0xB33B, 0xB33C, 0xB33D, 0xB33E,

+    0xB33F, 0xB340, 0xB341, 0xB342, 0xB343, 0xB344, 0xB345, 0xB346,

+    0xB347, 0xB348, 0xB349, 0xB34A, 0xB34B, 0xB34C, 0xB34D, 0xB34E,

+    0xB34F, 0xB350, 0xB351, 0xB352, 0xB353, 0xB357, 0xB359, 0xB35A,

+    0xB35D, 0xB360, 0xB361, 0xB362, 0xB363, 0xB366, 0xB368, 0xB36A,

+    0xB36C, 0xB36D, 0xB36F, 0xB372, 0xB373, 0xB375, 0xB376, 0xB377,

+    0xB379, 0xB37A, 0xB37B, 0xB37C, 0xB37D, 0xB37E, 0xB37F, 0xB382,

+    0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, 0xB38D, 0xB38E,

+    0xB38F, 0xB391, 0xB392, 0xB393, 0xB395, 0xB396, 0xB397, 0xB398,

+    0xB399, 0xB39A, 0xB39B, 0xB39C, 0xB39D, 0xB39E, 0xB39F, 0xB3A2,

+    0xB3A3, 0xB3A4, 0xB3A5, 0xB3A6, 0xB3A7, 0xB3A9, 0xB3AA, 0xB3AB,

+    0xB3AD, 0xB3AE, 0xB3AF, 0xB3B0, 0xB3B1, 0xB3B2, 0xB3B3, 0xB3B4,

+    0xB3B5, 0xB3B6, 0xB3B7, 0xB3B8, 0xB3B9, 0xB3BA, 0xB3BB, 0xB3BC,

+    0xB3BD, 0xB3BE, 0xB3BF, 0xB3C0, 0xB3C1, 0xB3C2, 0xB3C3, 0xB3C6,

+    0xB3C7, 0xB3C9, 0xB3CA, 0xB3CD, 0xB3CF, 0xB3D1, 0xB3D2, 0xB3D3,

+    0xB3D6, 0xB3D8, 0xB3DA, 0xB3DC, 0xB3DE, 0xB3DF, 0xB3E1, 0xB3E2,

+    0xB3E3, 0xB3E5, 0xB3E6, 0xB3E7, 0xB3E9, 0xB3EA, 0xB3EB, 0xB3EC,

+    0xB3ED, 0xB3EE, 0xB3EF, 0xB3F0, 0xB3F1, 0xB3F2, 0xB3F3, 0xB3F4,

+    0xB3F5, 0xB3F6, 0xB3F7, 0xB3F8, 0xB3F9, 0xB3FA, 0xB3FB, 0xB3FD,

+    0xB3FE, 0xB3FF, 0xB400, 0xB401, 0xB402, 0xB403, 0xB404, 0xB405,

+    0xB406, 0xB407, 0xB408, 0xB409, 0xB40A, 0xB40B, 0xB40C, 0xB40D,

+    0xB40E, 0xB40F, 0xB411, 0xB412, 0xB413, 0xB414, 0xB415, 0xB416,

+    0xB417, 0xB419, 0xB41A, 0xB41B, 0xB41D, 0xB41E, 0xB41F, 0xB421,

+    0xB422, 0xB423, 0xB424, 0xB425, 0xB426, 0xB427, 0xB42A, 0xB42C,

+    0xB42D, 0xB42E, 0xB42F, 0xB430, 0xB431, 0xB432, 0xB433, 0xB435,

+    0xB436, 0xB437, 0xB438, 0xB439, 0xB43A, 0xB43B, 0xB43C, 0xB43D,

+    0xB43E, 0xB43F, 0xB440, 0xB441, 0xB442, 0xB443, 0xB444, 0xB445,

+    0xB446, 0xB447, 0xB448, 0xB449, 0xB44A, 0xB44B, 0xB44C, 0xB44D,

+    0xB44E, 0xB44F, 0xB452, 0xB453, 0xB455, 0xB456, 0xB457, 0xB459,

+    0xB45A, 0xB45B, 0xB45C, 0xB45D, 0xB45E, 0xB45F, 0xB462, 0xB464,

+    0xB466, 0xB467, 0xB468, 0xB469, 0xB46A, 0xB46B, 0xB46D, 0xB46E,

+    0xB46F, 0xB470, 0xB471, 0xB472, 0xB473, 0xB474, 0xB475, 0xB476,

+    0xB477, 0xB478, 0xB479, 0xB47A, 0xB47B, 0xB47C, 0xB47D, 0xB47E,

+    0xB47F, 0xB481, 0xB482, 0xB483, 0xB484, 0xB485, 0xB486, 0xB487,

+    0xB489, 0xB48A, 0xB48B, 0xB48C, 0xB48D, 0xB48E, 0xB48F, 0xB490,

+    0xB491, 0xB492, 0xB493, 0xB494, 0xB495, 0xB496, 0xB497, 0xB498,

+    0xB499, 0xB49A, 0xB49B, 0xB49C, 0xB49E, 0xB49F, 0xB4A0, 0xB4A1,

+    0xB4A2, 0xB4A3, 0xB4A5, 0xB4A6, 0xB4A7, 0xB4A9, 0xB4AA, 0xB4AB,

+    0xB4AD, 0xB4AE, 0xB4AF, 0xB4B0, 0xB4B1, 0xB4B2, 0xB4B3, 0xB4B4,

+    0xB4B6, 0xB4B8, 0xB4BA, 0xB4BB, 0xB4BC, 0xB4BD, 0xB4BE, 0xB4BF,

+    0xB4C1, 0xB4C2, 0xB4C3, 0xB4C5, 0xB4C6, 0xB4C7, 0xB4C9, 0xB4CA,

+    0xB4CB, 0xB4CC, 0xB4CD, 0xB4CE, 0xB4CF, 0xB4D1, 0xB4D2, 0xB4D3,

+    0xB4D4, 0xB4D6, 0xB4D7, 0xB4D8, 0xB4D9, 0xB4DA, 0xB4DB, 0xB4DE,

+    0xB4DF, 0xB4E1, 0xB4E2, 0xB4E5, 0xB4E7, 0xB4E8, 0xB4E9, 0xB4EA,

+    0xB4EB, 0xB4EE, 0xB4F0, 0xB4F2, 0xB4F3, 0xB4F4, 0xB4F5, 0xB4F6,

+    0xB4F7, 0xB4F9, 0xB4FA, 0xB4FB, 0xB4FC, 0xB4FD, 0xB4FE, 0xB4FF,

+    0xB500, 0xB501, 0xB502, 0xB503, 0xB504, 0xB505, 0xB506, 0xB507,

+    0xB508, 0xB509, 0xB50A, 0xB50B, 0xB50C, 0xB50D, 0xB50E, 0xB50F,

+    0xB510, 0xB511, 0xB512, 0xB513, 0xB516, 0xB517, 0xB519, 0xB51A,

+    0xB51D, 0xB51E, 0xB51F, 0xB520, 0xB521, 0xB522, 0xB523, 0xB526,

+    0xB52B, 0xB52C, 0xB52D, 0xB52E, 0xB52F, 0xB532, 0xB533, 0xB535,

+    0xB536, 0xB537, 0xB539, 0xB53A, 0xB53B, 0xB53C, 0xB53D, 0xB53E,

+    0xB53F, 0xB542, 0xB546, 0xB547, 0xB548, 0xB549, 0xB54A, 0xB54E,

+    0xB54F, 0xB551, 0xB552, 0xB553, 0xB555, 0xB556, 0xB557, 0xB558,

+    0xB559, 0xB55A, 0xB55B, 0xB55E, 0xB562, 0xB563, 0xB564, 0xB565,

+    0xB566, 0xB567, 0xB568, 0xB569, 0xB56A, 0xB56B, 0xB56C, 0xB56D,

+    0xB56E, 0xB56F, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575,

+    0xB576, 0xB577, 0xB578, 0xB579, 0xB57A, 0xB57B, 0xB57C, 0xB57D,

+    0xB57E, 0xB57F, 0xB580, 0xB581, 0xB582, 0xB583, 0xB584, 0xB585,

+    0xB586, 0xB587, 0xB588, 0xB589, 0xB58A, 0xB58B, 0xB58C, 0xB58D,

+    0xB58E, 0xB58F, 0xB590, 0xB591, 0xB592, 0xB593, 0xB594, 0xB595,

+    0xB596, 0xB597, 0xB598, 0xB599, 0xB59A, 0xB59B, 0xB59C, 0xB59D,

+    0xB59E, 0xB59F, 0xB5A2, 0xB5A3, 0xB5A5, 0xB5A6, 0xB5A7, 0xB5A9,

+    0xB5AC, 0xB5AD, 0xB5AE, 0xB5AF, 0xB5B2, 0xB5B6, 0xB5B7, 0xB5B8,

+    0xB5B9, 0xB5BA, 0xB5BE, 0xB5BF, 0xB5C1, 0xB5C2, 0xB5C3, 0xB5C5,

+    0xB5C6, 0xB5C7, 0xB5C8, 0xB5C9, 0xB5CA, 0xB5CB, 0xB5CE, 0xB5D2,

+    0xB5D3, 0xB5D4, 0xB5D5, 0xB5D6, 0xB5D7, 0xB5D9, 0xB5DA, 0xB5DB,

+    0xB5DC, 0xB5DD, 0xB5DE, 0xB5DF, 0xB5E0, 0xB5E1, 0xB5E2, 0xB5E3,

+    0xB5E4, 0xB5E5, 0xB5E6, 0xB5E7, 0xB5E8, 0xB5E9, 0xB5EA, 0xB5EB,

+    0xB5ED, 0xB5EE, 0xB5EF, 0xB5F0, 0xB5F1, 0xB5F2, 0xB5F3, 0xB5F4,

+    0xB5F5, 0xB5F6, 0xB5F7, 0xB5F8, 0xB5F9, 0xB5FA, 0xB5FB, 0xB5FC,

+    0xB5FD, 0xB5FE, 0xB5FF, 0xB600, 0xB601, 0xB602, 0xB603, 0xB604,

+    0xB605, 0xB606, 0xB607, 0xB608, 0xB609, 0xB60A, 0xB60B, 0xB60C,

+    0xB60D, 0xB60E, 0xB60F, 0xB612, 0xB613, 0xB615, 0xB616, 0xB617,

+    0xB619, 0xB61A, 0xB61B, 0xB61C, 0xB61D, 0xB61E, 0xB61F, 0xB620,

+    0xB621, 0xB622, 0xB623, 0xB624, 0xB626, 0xB627, 0xB628, 0xB629,

+    0xB62A, 0xB62B, 0xB62D, 0xB62E, 0xB62F, 0xB630, 0xB631, 0xB632,

+    0xB633, 0xB635, 0xB636, 0xB637, 0xB638, 0xB639, 0xB63A, 0xB63B,

+    0xB63C, 0xB63D, 0xB63E, 0xB63F, 0xB640, 0xB641, 0xB642, 0xB643,

+    0xB644, 0xB645, 0xB646, 0xB647, 0xB649, 0xB64A, 0xB64B, 0xB64C,

+    0xB64D, 0xB64E, 0xB64F, 0xB650, 0xB651, 0xB652, 0xB653, 0xB654,

+    0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A, 0xB65B, 0xB65C,

+    0xB65D, 0xB65E, 0xB65F, 0xB660, 0xB661, 0xB662, 0xB663, 0xB665,

+    0xB666, 0xB667, 0xB669, 0xB66A, 0xB66B, 0xB66C, 0xB66D, 0xB66E,

+    0xB66F, 0xB670, 0xB671, 0xB672, 0xB673, 0xB674, 0xB675, 0xB676,

+    0xB677, 0xB678, 0xB679, 0xB67A, 0xB67B, 0xB67C, 0xB67D, 0xB67E,

+    0xB67F, 0xB680, 0xB681, 0xB682, 0xB683, 0xB684, 0xB685, 0xB686,

+    0xB687, 0xB688, 0xB689, 0xB68A, 0xB68B, 0xB68C, 0xB68D, 0xB68E,

+    0xB68F, 0xB690, 0xB691, 0xB692, 0xB693, 0xB694, 0xB695, 0xB696,

+    0xB697, 0xB698, 0xB699, 0xB69A, 0xB69B, 0xB69E, 0xB69F, 0xB6A1,

+    0xB6A2, 0xB6A3, 0xB6A5, 0xB6A6, 0xB6A7, 0xB6A8, 0xB6A9, 0xB6AA,

+    0xB6AD, 0xB6AE, 0xB6AF, 0xB6B0, 0xB6B2, 0xB6B3, 0xB6B4, 0xB6B5,

+    0xB6B6, 0xB6B7, 0xB6B8, 0xB6B9, 0xB6BA, 0xB6BB, 0xB6BC, 0xB6BD,

+    0xB6BE, 0xB6BF, 0xB6C0, 0xB6C1, 0xB6C2, 0xB6C3, 0xB6C4, 0xB6C5,

+    0xB6C6, 0xB6C7, 0xB6C8, 0xB6C9, 0xB6CA, 0xB6CB, 0xB6CC, 0xB6CD,

+    0xB6CE, 0xB6CF, 0xB6D0, 0xB6D1, 0xB6D2, 0xB6D3, 0xB6D5, 0xB6D6,

+    0xB6D7, 0xB6D8, 0xB6D9, 0xB6DA, 0xB6DB, 0xB6DC, 0xB6DD, 0xB6DE,

+    0xB6DF, 0xB6E0, 0xB6E1, 0xB6E2, 0xB6E3, 0xB6E4, 0xB6E5, 0xB6E6,

+    0xB6E7, 0xB6E8, 0xB6E9, 0xB6EA, 0xB6EB, 0xB6EC, 0xB6ED, 0xB6EE,

+    0xB6EF, 0xB6F1, 0xB6F2, 0xB6F3, 0xB6F5, 0xB6F6, 0xB6F7, 0xB6F9,

+    0xB6FA, 0xB6FB, 0xB6FC, 0xB6FD, 0xB6FE, 0xB6FF, 0xB702, 0xB703,

+    0xB704, 0xB706, 0xB707, 0xB708, 0xB709, 0xB70A, 0xB70B, 0xB70C,

+    0xB70D, 0xB70E, 0xB70F, 0xB710, 0xB711, 0xB712, 0xB713, 0xB714,

+    0xB715, 0xB716, 0xB717, 0xB718, 0xB719, 0xB71A, 0xB71B, 0xB71C,

+    0xB71D, 0xB71E, 0xB71F, 0xB720, 0xB721, 0xB722, 0xB723, 0xB724,

+    0xB725, 0xB726, 0xB727, 0xB72A, 0xB72B, 0xB72D, 0xB72E, 0xB731,

+    0xB732, 0xB733, 0xB734, 0xB735, 0xB736, 0xB737, 0xB73A, 0xB73C,

+    0xB73D, 0xB73E, 0xB73F, 0xB740, 0xB741, 0xB742, 0xB743, 0xB745,

+    0xB746, 0xB747, 0xB749, 0xB74A, 0xB74B, 0xB74D, 0xB74E, 0xB74F,

+    0xB750, 0xB751, 0xB752, 0xB753, 0xB756, 0xB757, 0xB758, 0xB759,

+    0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xB75F, 0xB761, 0xB762,

+    0xB763, 0xB765, 0xB766, 0xB767, 0xB769, 0xB76A, 0xB76B, 0xB76C,

+    0xB76D, 0xB76E, 0xB76F, 0xB772, 0xB774, 0xB776, 0xB777, 0xB778,

+    0xB779, 0xB77A, 0xB77B, 0xB77E, 0xB77F, 0xB781, 0xB782, 0xB783,

+    0xB785, 0xB786, 0xB787, 0xB788, 0xB789, 0xB78A, 0xB78B, 0xB78E,

+    0xB793, 0xB794, 0xB795, 0xB79A, 0xB79B, 0xB79D, 0xB79E, 0xB79F,

+    0xB7A1, 0xB7A2, 0xB7A3, 0xB7A4, 0xB7A5, 0xB7A6, 0xB7A7, 0xB7AA,

+    0xB7AE, 0xB7AF, 0xB7B0, 0xB7B1, 0xB7B2, 0xB7B3, 0xB7B6, 0xB7B7,

+    0xB7B9, 0xB7BA, 0xB7BB, 0xB7BC, 0xB7BD, 0xB7BE, 0xB7BF, 0xB7C0,

+    0xB7C1, 0xB7C2, 0xB7C3, 0xB7C4, 0xB7C5, 0xB7C6, 0xB7C8, 0xB7CA,

+    0xB7CB, 0xB7CC, 0xB7CD, 0xB7CE, 0xB7CF, 0xB7D0, 0xB7D1, 0xB7D2,

+    0xB7D3, 0xB7D4, 0xB7D5, 0xB7D6, 0xB7D7, 0xB7D8, 0xB7D9, 0xB7DA,

+    0xB7DB, 0xB7DC, 0xB7DD, 0xB7DE, 0xB7DF, 0xB7E0, 0xB7E1, 0xB7E2,

+    0xB7E3, 0xB7E4, 0xB7E5, 0xB7E6, 0xB7E7, 0xB7E8, 0xB7E9, 0xB7EA,

+    0xB7EB, 0xB7EE, 0xB7EF, 0xB7F1, 0xB7F2, 0xB7F3, 0xB7F5, 0xB7F6,

+    0xB7F7, 0xB7F8, 0xB7F9, 0xB7FA, 0xB7FB, 0xB7FE, 0xB802, 0xB803,

+    0xB804, 0xB805, 0xB806, 0xB80A, 0xB80B, 0xB80D, 0xB80E, 0xB80F,

+    0xB811, 0xB812, 0xB813, 0xB814, 0xB815, 0xB816, 0xB817, 0xB81A,

+    0xB81C, 0xB81E, 0xB81F, 0xB820, 0xB821, 0xB822, 0xB823, 0xB826,

+    0xB827, 0xB829, 0xB82A, 0xB82B, 0xB82D, 0xB82E, 0xB82F, 0xB830,

+    0xB831, 0xB832, 0xB833, 0xB836, 0xB83A, 0xB83B, 0xB83C, 0xB83D,

+    0xB83E, 0xB83F, 0xB841, 0xB842, 0xB843, 0xB845, 0xB846, 0xB847,

+    0xB848, 0xB849, 0xB84A, 0xB84B, 0xB84C, 0xB84D, 0xB84E, 0xB84F,

+    0xB850, 0xB852, 0xB854, 0xB855, 0xB856, 0xB857, 0xB858, 0xB859,

+    0xB85A, 0xB85B, 0xB85E, 0xB85F, 0xB861, 0xB862, 0xB863, 0xB865,

+    0xB866, 0xB867, 0xB868, 0xB869, 0xB86A, 0xB86B, 0xB86E, 0xB870,

+    0xB872, 0xB873, 0xB874, 0xB875, 0xB876, 0xB877, 0xB879, 0xB87A,

+    0xB87B, 0xB87D, 0xB87E, 0xB87F, 0xB880, 0xB881, 0xB882, 0xB883,

+    0xB884, 0xB885, 0xB886, 0xB887, 0xB888, 0xB889, 0xB88A, 0xB88B,

+    0xB88C, 0xB88E, 0xB88F, 0xB890, 0xB891, 0xB892, 0xB893, 0xB894,

+    0xB895, 0xB896, 0xB897, 0xB898, 0xB899, 0xB89A, 0xB89B, 0xB89C,

+    0xB89D, 0xB89E, 0xB89F, 0xB8A0, 0xB8A1, 0xB8A2, 0xB8A3, 0xB8A4,

+    0xB8A5, 0xB8A6, 0xB8A7, 0xB8A9, 0xB8AA, 0xB8AB, 0xB8AC, 0xB8AD,

+    0xB8AE, 0xB8AF, 0xB8B1, 0xB8B2, 0xB8B3, 0xB8B5, 0xB8B6, 0xB8B7,

+    0xB8B9, 0xB8BA, 0xB8BB, 0xB8BC, 0xB8BD, 0xB8BE, 0xB8BF, 0xB8C2,

+    0xB8C4, 0xB8C6, 0xB8C7, 0xB8C8, 0xB8C9, 0xB8CA, 0xB8CB, 0xB8CD,

+    0xB8CE, 0xB8CF, 0xB8D1, 0xB8D2, 0xB8D3, 0xB8D5, 0xB8D6, 0xB8D7,

+    0xB8D8, 0xB8D9, 0xB8DA, 0xB8DB, 0xB8DC, 0xB8DE, 0xB8E0, 0xB8E2,

+    0xB8E3, 0xB8E4, 0xB8E5, 0xB8E6, 0xB8E7, 0xB8EA, 0xB8EB, 0xB8ED,

+    0xB8EE, 0xB8EF, 0xB8F1, 0xB8F2, 0xB8F3, 0xB8F4, 0xB8F5, 0xB8F6,

+    0xB8F7, 0xB8FA, 0xB8FC, 0xB8FE, 0xB8FF, 0xB900, 0xB901, 0xB902,

+    0xB903, 0xB905, 0xB906, 0xB907, 0xB908, 0xB909, 0xB90A, 0xB90B,

+    0xB90C, 0xB90D, 0xB90E, 0xB90F, 0xB910, 0xB911, 0xB912, 0xB913,

+    0xB914, 0xB915, 0xB916, 0xB917, 0xB919, 0xB91A, 0xB91B, 0xB91C,

+    0xB91D, 0xB91E, 0xB91F, 0xB921, 0xB922, 0xB923, 0xB924, 0xB925,

+    0xB926, 0xB927, 0xB928, 0xB929, 0xB92A, 0xB92B, 0xB92C, 0xB92D,

+    0xB92E, 0xB92F, 0xB930, 0xB931, 0xB932, 0xB933, 0xB934, 0xB935,

+    0xB936, 0xB937, 0xB938, 0xB939, 0xB93A, 0xB93B, 0xB93E, 0xB93F,

+    0xB941, 0xB942, 0xB943, 0xB945, 0xB946, 0xB947, 0xB948, 0xB949,

+    0xB94A, 0xB94B, 0xB94D, 0xB94E, 0xB950, 0xB952, 0xB953, 0xB954,

+    0xB955, 0xB956, 0xB957, 0xB95A, 0xB95B, 0xB95D, 0xB95E, 0xB95F,

+    0xB961, 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, 0xB96A,

+    0xB96C, 0xB96E, 0xB96F, 0xB970, 0xB971, 0xB972, 0xB973, 0xB976,

+    0xB977, 0xB979, 0xB97A, 0xB97B, 0xB97D, 0xB97E, 0xB97F, 0xB980,

+    0xB981, 0xB982, 0xB983, 0xB986, 0xB988, 0xB98B, 0xB98C, 0xB98F,

+    0xB990, 0xB991, 0xB992, 0xB993, 0xB994, 0xB995, 0xB996, 0xB997,

+    0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C, 0xB99D, 0xB99E, 0xB99F,

+    0xB9A0, 0xB9A1, 0xB9A2, 0xB9A3, 0xB9A4, 0xB9A5, 0xB9A6, 0xB9A7,

+    0xB9A8, 0xB9A9, 0xB9AA, 0xB9AB, 0xB9AE, 0xB9AF, 0xB9B1, 0xB9B2,

+    0xB9B3, 0xB9B5, 0xB9B6, 0xB9B7, 0xB9B8, 0xB9B9, 0xB9BA, 0xB9BB,

+    0xB9BE, 0xB9C0, 0xB9C2, 0xB9C3, 0xB9C4, 0xB9C5, 0xB9C6, 0xB9C7,

+    0xB9CA, 0xB9CB, 0xB9CD, 0xB9D3, 0xB9D4, 0xB9D5, 0xB9D6, 0xB9D7,

+    0xB9DA, 0xB9DC, 0xB9DF, 0xB9E0, 0xB9E2, 0xB9E6, 0xB9E7, 0xB9E9,

+    0xB9EA, 0xB9EB, 0xB9ED, 0xB9EE, 0xB9EF, 0xB9F0, 0xB9F1, 0xB9F2,

+    0xB9F3, 0xB9F6, 0xB9FB, 0xB9FC, 0xB9FD, 0xB9FE, 0xB9FF, 0xBA02,

+    0xBA03, 0xBA04, 0xBA05, 0xBA06, 0xBA07, 0xBA09, 0xBA0A, 0xBA0B,

+    0xBA0C, 0xBA0D, 0xBA0E, 0xBA0F, 0xBA10, 0xBA11, 0xBA12, 0xBA13,

+    0xBA14, 0xBA16, 0xBA17, 0xBA18, 0xBA19, 0xBA1A, 0xBA1B, 0xBA1C,

+    0xBA1D, 0xBA1E, 0xBA1F, 0xBA20, 0xBA21, 0xBA22, 0xBA23, 0xBA24,

+    0xBA25, 0xBA26, 0xBA27, 0xBA28, 0xBA29, 0xBA2A, 0xBA2B, 0xBA2C,

+    0xBA2D, 0xBA2E, 0xBA2F, 0xBA30, 0xBA31, 0xBA32, 0xBA33, 0xBA34,

+    0xBA35, 0xBA36, 0xBA37, 0xBA3A, 0xBA3B, 0xBA3D, 0xBA3E, 0xBA3F,

+    0xBA41, 0xBA43, 0xBA44, 0xBA45, 0xBA46, 0xBA47, 0xBA4A, 0xBA4C,

+    0xBA4F, 0xBA50, 0xBA51, 0xBA52, 0xBA56, 0xBA57, 0xBA59, 0xBA5A,

+    0xBA5B, 0xBA5D, 0xBA5E, 0xBA5F, 0xBA60, 0xBA61, 0xBA62, 0xBA63,

+    0xBA66, 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, 0xBA72,

+    0xBA73, 0xBA75, 0xBA76, 0xBA77, 0xBA79, 0xBA7A, 0xBA7B, 0xBA7C,

+    0xBA7D, 0xBA7E, 0xBA7F, 0xBA80, 0xBA81, 0xBA82, 0xBA86, 0xBA88,

+    0xBA89, 0xBA8A, 0xBA8B, 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, 0xBA91,

+    0xBA92, 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99,

+    0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, 0xBA9E, 0xBA9F, 0xBAA0, 0xBAA1,

+    0xBAA2, 0xBAA3, 0xBAA4, 0xBAA5, 0xBAA6, 0xBAA7, 0xBAAA, 0xBAAD,

+    0xBAAE, 0xBAAF, 0xBAB1, 0xBAB3, 0xBAB4, 0xBAB5, 0xBAB6, 0xBAB7,

+    0xBABA, 0xBABC, 0xBABE, 0xBABF, 0xBAC0, 0xBAC1, 0xBAC2, 0xBAC3,

+    0xBAC5, 0xBAC6, 0xBAC7, 0xBAC9, 0xBACA, 0xBACB, 0xBACC, 0xBACD,

+    0xBACE, 0xBACF, 0xBAD0, 0xBAD1, 0xBAD2, 0xBAD3, 0xBAD4, 0xBAD5,

+    0xBAD6, 0xBAD7, 0xBADA, 0xBADB, 0xBADC, 0xBADD, 0xBADE, 0xBADF,

+    0xBAE0, 0xBAE1, 0xBAE2, 0xBAE3, 0xBAE4, 0xBAE5, 0xBAE6, 0xBAE7,

+    0xBAE8, 0xBAE9, 0xBAEA, 0xBAEB, 0xBAEC, 0xBAED, 0xBAEE, 0xBAEF,

+    0xBAF0, 0xBAF1, 0xBAF2, 0xBAF3, 0xBAF4, 0xBAF5, 0xBAF6, 0xBAF7,

+    0xBAF8, 0xBAF9, 0xBAFA, 0xBAFB, 0xBAFD, 0xBAFE, 0xBAFF, 0xBB01,

+    0xBB02, 0xBB03, 0xBB05, 0xBB06, 0xBB07, 0xBB08, 0xBB09, 0xBB0A,

+    0xBB0B, 0xBB0C, 0xBB0E, 0xBB10, 0xBB12, 0xBB13, 0xBB14, 0xBB15,

+    0xBB16, 0xBB17, 0xBB19, 0xBB1A, 0xBB1B, 0xBB1D, 0xBB1E, 0xBB1F,

+    0xBB21, 0xBB22, 0xBB23, 0xBB24, 0xBB25, 0xBB26, 0xBB27, 0xBB28,

+    0xBB2A, 0xBB2C, 0xBB2D, 0xBB2E, 0xBB2F, 0xBB30, 0xBB31, 0xBB32,

+    0xBB33, 0xBB37, 0xBB39, 0xBB3A, 0xBB3F, 0xBB40, 0xBB41, 0xBB42,

+    0xBB43, 0xBB46, 0xBB48, 0xBB4A, 0xBB4B, 0xBB4C, 0xBB4E, 0xBB51,

+    0xBB52, 0xBB53, 0xBB55, 0xBB56, 0xBB57, 0xBB59, 0xBB5A, 0xBB5B,

+    0xBB5C, 0xBB5D, 0xBB5E, 0xBB5F, 0xBB60, 0xBB62, 0xBB64, 0xBB65,

+    0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, 0xBB6D, 0xBB6E,

+    0xBB6F, 0xBB70, 0xBB71, 0xBB72, 0xBB73, 0xBB74, 0xBB75, 0xBB76,

+    0xBB77, 0xBB78, 0xBB79, 0xBB7A, 0xBB7B, 0xBB7C, 0xBB7D, 0xBB7E,

+    0xBB7F, 0xBB80, 0xBB81, 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86,

+    0xBB87, 0xBB89, 0xBB8A, 0xBB8B, 0xBB8D, 0xBB8E, 0xBB8F, 0xBB91,

+    0xBB92, 0xBB93, 0xBB94, 0xBB95, 0xBB96, 0xBB97, 0xBB98, 0xBB99,

+    0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D, 0xBB9E, 0xBB9F, 0xBBA0, 0xBBA1,

+    0xBBA2, 0xBBA3, 0xBBA5, 0xBBA6, 0xBBA7, 0xBBA9, 0xBBAA, 0xBBAB,

+    0xBBAD, 0xBBAE, 0xBBAF, 0xBBB0, 0xBBB1, 0xBBB2, 0xBBB3, 0xBBB5,

+    0xBBB6, 0xBBB8, 0xBBB9, 0xBBBA, 0xBBBB, 0xBBBC, 0xBBBD, 0xBBBE,

+    0xBBBF, 0xBBC1, 0xBBC2, 0xBBC3, 0xBBC5, 0xBBC6, 0xBBC7, 0xBBC9,

+    0xBBCA, 0xBBCB, 0xBBCC, 0xBBCD, 0xBBCE, 0xBBCF, 0xBBD1, 0xBBD2,

+    0xBBD4, 0xBBD5, 0xBBD6, 0xBBD7, 0xBBD8, 0xBBD9, 0xBBDA, 0xBBDB,

+    0xBBDC, 0xBBDD, 0xBBDE, 0xBBDF, 0xBBE0, 0xBBE1, 0xBBE2, 0xBBE3,

+    0xBBE4, 0xBBE5, 0xBBE6, 0xBBE7, 0xBBE8, 0xBBE9, 0xBBEA, 0xBBEB,

+    0xBBEC, 0xBBED, 0xBBEE, 0xBBEF, 0xBBF0, 0xBBF1, 0xBBF2, 0xBBF3,

+    0xBBF4, 0xBBF5, 0xBBF6, 0xBBF7, 0xBBFA, 0xBBFB, 0xBBFD, 0xBBFE,

+    0xBC01, 0xBC03, 0xBC04, 0xBC05, 0xBC06, 0xBC07, 0xBC0A, 0xBC0E,

+    0xBC10, 0xBC12, 0xBC13, 0xBC19, 0xBC1A, 0xBC20, 0xBC21, 0xBC22,

+    0xBC23, 0xBC26, 0xBC28, 0xBC2A, 0xBC2B, 0xBC2C, 0xBC2E, 0xBC2F,

+    0xBC32, 0xBC33, 0xBC35, 0xBC36, 0xBC37, 0xBC39, 0xBC3A, 0xBC3B,

+    0xBC3C, 0xBC3D, 0xBC3E, 0xBC3F, 0xBC42, 0xBC46, 0xBC47, 0xBC48,

+    0xBC4A, 0xBC4B, 0xBC4E, 0xBC4F, 0xBC51, 0xBC52, 0xBC53, 0xBC54,

+    0xBC55, 0xBC56, 0xBC57, 0xBC58, 0xBC59, 0xBC5A, 0xBC5B, 0xBC5C,

+    0xBC5E, 0xBC5F, 0xBC60, 0xBC61, 0xBC62, 0xBC63, 0xBC64, 0xBC65,

+    0xBC66, 0xBC67, 0xBC68, 0xBC69, 0xBC6A, 0xBC6B, 0xBC6C, 0xBC6D,

+    0xBC6E, 0xBC6F, 0xBC70, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75,

+    0xBC76, 0xBC77, 0xBC78, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D,

+    0xBC7E, 0xBC7F, 0xBC80, 0xBC81, 0xBC82, 0xBC83, 0xBC86, 0xBC87,

+    0xBC89, 0xBC8A, 0xBC8D, 0xBC8F, 0xBC90, 0xBC91, 0xBC92, 0xBC93,

+    0xBC96, 0xBC98, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F, 0xBCA2,

+    0xBCA3, 0xBCA5, 0xBCA6, 0xBCA9, 0xBCAA, 0xBCAB, 0xBCAC, 0xBCAD,

+    0xBCAE, 0xBCAF, 0xBCB2, 0xBCB6, 0xBCB7, 0xBCB8, 0xBCB9, 0xBCBA,

+    0xBCBB, 0xBCBE, 0xBCBF, 0xBCC1, 0xBCC2, 0xBCC3, 0xBCC5, 0xBCC6,

+    0xBCC7, 0xBCC8, 0xBCC9, 0xBCCA, 0xBCCB, 0xBCCC, 0xBCCE, 0xBCD2,

+    0xBCD3, 0xBCD4, 0xBCD6, 0xBCD7, 0xBCD9, 0xBCDA, 0xBCDB, 0xBCDD,

+    0xBCDE, 0xBCDF, 0xBCE0, 0xBCE1, 0xBCE2, 0xBCE3, 0xBCE4, 0xBCE5,

+    0xBCE6, 0xBCE7, 0xBCE8, 0xBCE9, 0xBCEA, 0xBCEB, 0xBCEC, 0xBCED,

+    0xBCEE, 0xBCEF, 0xBCF0, 0xBCF1, 0xBCF2, 0xBCF3, 0xBCF7, 0xBCF9,

+    0xBCFA, 0xBCFB, 0xBCFD, 0xBCFE, 0xBCFF, 0xBD00, 0xBD01, 0xBD02,

+    0xBD03, 0xBD06, 0xBD08, 0xBD0A, 0xBD0B, 0xBD0C, 0xBD0D, 0xBD0E,

+    0xBD0F, 0xBD11, 0xBD12, 0xBD13, 0xBD15, 0xBD16, 0xBD17, 0xBD18,

+    0xBD19, 0xBD1A, 0xBD1B, 0xBD1C, 0xBD1D, 0xBD1E, 0xBD1F, 0xBD20,

+    0xBD21, 0xBD22, 0xBD23, 0xBD25, 0xBD26, 0xBD27, 0xBD28, 0xBD29,

+    0xBD2A, 0xBD2B, 0xBD2D, 0xBD2E, 0xBD2F, 0xBD30, 0xBD31, 0xBD32,

+    0xBD33, 0xBD34, 0xBD35, 0xBD36, 0xBD37, 0xBD38, 0xBD39, 0xBD3A,

+    0xBD3B, 0xBD3C, 0xBD3D, 0xBD3E, 0xBD3F, 0xBD41, 0xBD42, 0xBD43,

+    0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD4A, 0xBD4B, 0xBD4D, 0xBD4E,

+    0xBD4F, 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, 0xBD56, 0xBD57,

+    0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, 0xBD5E, 0xBD5F, 0xBD60, 0xBD61,

+    0xBD62, 0xBD63, 0xBD65, 0xBD66, 0xBD67, 0xBD69, 0xBD6A, 0xBD6B,

+    0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, 0xBD72, 0xBD73,

+    0xBD74, 0xBD75, 0xBD76, 0xBD77, 0xBD78, 0xBD79, 0xBD7A, 0xBD7B,

+    0xBD7C, 0xBD7D, 0xBD7E, 0xBD7F, 0xBD82, 0xBD83, 0xBD85, 0xBD86,

+    0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F, 0xBD92, 0xBD94, 0xBD96,

+    0xBD97, 0xBD98, 0xBD9B, 0xBD9D, 0xBD9E, 0xBD9F, 0xBDA0, 0xBDA1,

+    0xBDA2, 0xBDA3, 0xBDA5, 0xBDA6, 0xBDA7, 0xBDA8, 0xBDA9, 0xBDAA,

+    0xBDAB, 0xBDAC, 0xBDAD, 0xBDAE, 0xBDAF, 0xBDB1, 0xBDB2, 0xBDB3,

+    0xBDB4, 0xBDB5, 0xBDB6, 0xBDB7, 0xBDB9, 0xBDBA, 0xBDBB, 0xBDBC,

+    0xBDBD, 0xBDBE, 0xBDBF, 0xBDC0, 0xBDC1, 0xBDC2, 0xBDC3, 0xBDC4,

+    0xBDC5, 0xBDC6, 0xBDC7, 0xBDC8, 0xBDC9, 0xBDCA, 0xBDCB, 0xBDCC,

+    0xBDCD, 0xBDCE, 0xBDCF, 0xBDD0, 0xBDD1, 0xBDD2, 0xBDD3, 0xBDD6,

+    0xBDD7, 0xBDD9, 0xBDDA, 0xBDDB, 0xBDDD, 0xBDDE, 0xBDDF, 0xBDE0,

+    0xBDE1, 0xBDE2, 0xBDE3, 0xBDE4, 0xBDE5, 0xBDE6, 0xBDE7, 0xBDE8,

+    0xBDEA, 0xBDEB, 0xBDEC, 0xBDED, 0xBDEE, 0xBDEF, 0xBDF1, 0xBDF2,

+    0xBDF3, 0xBDF5, 0xBDF6, 0xBDF7, 0xBDF9, 0xBDFA, 0xBDFB, 0xBDFC,

+    0xBDFD, 0xBDFE, 0xBDFF, 0xBE01, 0xBE02, 0xBE04, 0xBE06, 0xBE07,

+    0xBE08, 0xBE09, 0xBE0A, 0xBE0B, 0xBE0E, 0xBE0F, 0xBE11, 0xBE12,

+    0xBE13, 0xBE15, 0xBE16, 0xBE17, 0xBE18, 0xBE19, 0xBE1A, 0xBE1B,

+    0xBE1E, 0xBE20, 0xBE21, 0xBE22, 0xBE23, 0xBE24, 0xBE25, 0xBE26,

+    0xBE27, 0xBE28, 0xBE29, 0xBE2A, 0xBE2B, 0xBE2C, 0xBE2D, 0xBE2E,

+    0xBE2F, 0xBE30, 0xBE31, 0xBE32, 0xBE33, 0xBE34, 0xBE35, 0xBE36,

+    0xBE37, 0xBE38, 0xBE39, 0xBE3A, 0xBE3B, 0xBE3C, 0xBE3D, 0xBE3E,

+    0xBE3F, 0xBE40, 0xBE41, 0xBE42, 0xBE43, 0xBE46, 0xBE47, 0xBE49,

+    0xBE4A, 0xBE4B, 0xBE4D, 0xBE4F, 0xBE50, 0xBE51, 0xBE52, 0xBE53,

+    0xBE56, 0xBE58, 0xBE5C, 0xBE5D, 0xBE5E, 0xBE5F, 0xBE62, 0xBE63,

+    0xBE65, 0xBE66, 0xBE67, 0xBE69, 0xBE6B, 0xBE6C, 0xBE6D, 0xBE6E,

+    0xBE6F, 0xBE72, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7E,

+    0xBE7F, 0xBE81, 0xBE82, 0xBE83, 0xBE85, 0xBE86, 0xBE87, 0xBE88,

+    0xBE89, 0xBE8A, 0xBE8B, 0xBE8E, 0xBE92, 0xBE93, 0xBE94, 0xBE95,

+    0xBE96, 0xBE97, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, 0xBE9E, 0xBE9F,

+    0xBEA0, 0xBEA1, 0xBEA2, 0xBEA3, 0xBEA4, 0xBEA5, 0xBEA6, 0xBEA7,

+    0xBEA9, 0xBEAA, 0xBEAB, 0xBEAC, 0xBEAD, 0xBEAE, 0xBEAF, 0xBEB0,

+    0xBEB1, 0xBEB2, 0xBEB3, 0xBEB4, 0xBEB5, 0xBEB6, 0xBEB7, 0xBEB8,

+    0xBEB9, 0xBEBA, 0xBEBB, 0xBEBC, 0xBEBD, 0xBEBE, 0xBEBF, 0xBEC0,

+    0xBEC1, 0xBEC2, 0xBEC3, 0xBEC4, 0xBEC5, 0xBEC6, 0xBEC7, 0xBEC8,

+    0xBEC9, 0xBECA, 0xBECB, 0xBECC, 0xBECD, 0xBECE, 0xBECF, 0xBED2,

+    0xBED3, 0xBED5, 0xBED6, 0xBED9, 0xBEDA, 0xBEDB, 0xBEDC, 0xBEDD,

+    0xBEDE, 0xBEDF, 0xBEE1, 0xBEE2, 0xBEE6, 0xBEE7, 0xBEE8, 0xBEE9,

+    0xBEEA, 0xBEEB, 0xBEED, 0xBEEE, 0xBEEF, 0xBEF0, 0xBEF1, 0xBEF2,

+    0xBEF3, 0xBEF4, 0xBEF5, 0xBEF6, 0xBEF7, 0xBEF8, 0xBEF9, 0xBEFA,

+    0xBEFB, 0xBEFC, 0xBEFD, 0xBEFE, 0xBEFF, 0xBF00, 0xBF02, 0xBF03,

+    0xBF04, 0xBF05, 0xBF06, 0xBF07, 0xBF0A, 0xBF0B, 0xBF0C, 0xBF0D,

+    0xBF0E, 0xBF0F, 0xBF10, 0xBF11, 0xBF12, 0xBF13, 0xBF14, 0xBF15,

+    0xBF16, 0xBF17, 0xBF1A, 0xBF1E, 0xBF1F, 0xBF20, 0xBF21, 0xBF22,

+    0xBF23, 0xBF24, 0xBF25, 0xBF26, 0xBF27, 0xBF28, 0xBF29, 0xBF2A,

+    0xBF2B, 0xBF2C, 0xBF2D, 0xBF2E, 0xBF2F, 0xBF30, 0xBF31, 0xBF32,

+    0xBF33, 0xBF34, 0xBF35, 0xBF36, 0xBF37, 0xBF38, 0xBF39, 0xBF3A,

+    0xBF3B, 0xBF3C, 0xBF3D, 0xBF3E, 0xBF3F, 0xBF42, 0xBF43, 0xBF45,

+    0xBF46, 0xBF47, 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E,

+    0xBF4F, 0xBF52, 0xBF53, 0xBF54, 0xBF56, 0xBF57, 0xBF58, 0xBF59,

+    0xBF5A, 0xBF5B, 0xBF5C, 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61,

+    0xBF62, 0xBF63, 0xBF64, 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69,

+    0xBF6A, 0xBF6B, 0xBF6C, 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71,

+    0xBF72, 0xBF73, 0xBF74, 0xBF75, 0xBF76, 0xBF77, 0xBF78, 0xBF79,

+    0xBF7A, 0xBF7B, 0xBF7C, 0xBF7D, 0xBF7E, 0xBF7F, 0xBF80, 0xBF81,

+    0xBF82, 0xBF83, 0xBF84, 0xBF85, 0xBF86, 0xBF87, 0xBF88, 0xBF89,

+    0xBF8A, 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90, 0xBF91,

+    0xBF92, 0xBF93, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A,

+    0xBF9B, 0xBF9C, 0xBF9D, 0xBF9E, 0xBF9F, 0xBFA0, 0xBFA1, 0xBFA2,

+    0xBFA3, 0xBFA4, 0xBFA5, 0xBFA6, 0xBFA7, 0xBFA8, 0xBFA9, 0xBFAA,

+    0xBFAB, 0xBFAC, 0xBFAD, 0xBFAE, 0xBFAF, 0xBFB1, 0xBFB2, 0xBFB3,

+    0xBFB4, 0xBFB5, 0xBFB6, 0xBFB7, 0xBFB8, 0xBFB9, 0xBFBA, 0xBFBB,

+    0xBFBC, 0xBFBD, 0xBFBE, 0xBFBF, 0xBFC0, 0xBFC1, 0xBFC2, 0xBFC3,

+    0xBFC4, 0xBFC6, 0xBFC7, 0xBFC8, 0xBFC9, 0xBFCA, 0xBFCB, 0xBFCE,

+    0xBFCF, 0xBFD1, 0xBFD2, 0xBFD3, 0xBFD5, 0xBFD6, 0xBFD7, 0xBFD8,

+    0xBFD9, 0xBFDA, 0xBFDB, 0xBFDD, 0xBFDE, 0xBFE0, 0xBFE2, 0xBFE3,

+    0xBFE4, 0xBFE5, 0xBFE6, 0xBFE7, 0xBFE8, 0xBFE9, 0xBFEA, 0xBFEB,

+    0xBFEC, 0xBFED, 0xBFEE, 0xBFEF, 0xBFF0, 0xBFF1, 0xBFF2, 0xBFF3,

+    0xBFF4, 0xBFF5, 0xBFF6, 0xBFF7, 0xBFF8, 0xBFF9, 0xBFFA, 0xBFFB,

+    0xBFFC, 0xBFFD, 0xBFFE, 0xBFFF, 0xC000, 0xC001, 0xC002, 0xC003,

+    0xC004, 0xC005, 0xC006, 0xC007, 0xC008, 0xC009, 0xC00A, 0xC00B,

+    0xC00C, 0xC00D, 0xC00E, 0xC00F, 0xC010, 0xC011, 0xC012, 0xC013,

+    0xC014, 0xC015, 0xC016, 0xC017, 0xC018, 0xC019, 0xC01A, 0xC01B,

+    0xC01C, 0xC01D, 0xC01E, 0xC01F, 0xC020, 0xC021, 0xC022, 0xC023,

+    0xC024, 0xC025, 0xC026, 0xC027, 0xC028, 0xC029, 0xC02A, 0xC02B,

+    0xC02C, 0xC02D, 0xC02E, 0xC02F, 0xC030, 0xC031, 0xC032, 0xC033,

+    0xC034, 0xC035, 0xC036, 0xC037, 0xC038, 0xC039, 0xC03A, 0xC03B,

+    0xC03D, 0xC03E, 0xC03F, 0xC040, 0xC041, 0xC042, 0xC043, 0xC044,

+    0xC045, 0xC046, 0xC047, 0xC048, 0xC049, 0xC04A, 0xC04B, 0xC04C,

+    0xC04D, 0xC04E, 0xC04F, 0xC050, 0xC052, 0xC053, 0xC054, 0xC055,

+    0xC056, 0xC057, 0xC059, 0xC05A, 0xC05B, 0xC05D, 0xC05E, 0xC05F,

+    0xC061, 0xC062, 0xC063, 0xC064, 0xC065, 0xC066, 0xC067, 0xC06A,

+    0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070, 0xC071, 0xC072,

+    0xC073, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, 0xC079, 0xC07A,

+    0xC07B, 0xC07C, 0xC07D, 0xC07E, 0xC07F, 0xC080, 0xC081, 0xC082,

+    0xC083, 0xC084, 0xC085, 0xC086, 0xC087, 0xC088, 0xC089, 0xC08A,

+    0xC08B, 0xC08C, 0xC08D, 0xC08E, 0xC08F, 0xC092, 0xC093, 0xC095,

+    0xC096, 0xC097, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E,

+    0xC09F, 0xC0A2, 0xC0A4, 0xC0A6, 0xC0A7, 0xC0A8, 0xC0A9, 0xC0AA,

+    0xC0AB, 0xC0AE, 0xC0B1, 0xC0B2, 0xC0B7, 0xC0B8, 0xC0B9, 0xC0BA,

+    0xC0BB, 0xC0BE, 0xC0C2, 0xC0C3, 0xC0C4, 0xC0C6, 0xC0C7, 0xC0CA,

+    0xC0CB, 0xC0CD, 0xC0CE, 0xC0CF, 0xC0D1, 0xC0D2, 0xC0D3, 0xC0D4,

+    0xC0D5, 0xC0D6, 0xC0D7, 0xC0DA, 0xC0DE, 0xC0DF, 0xC0E0, 0xC0E1,

+    0xC0E2, 0xC0E3, 0xC0E6, 0xC0E7, 0xC0E9, 0xC0EA, 0xC0EB, 0xC0ED,

+    0xC0EE, 0xC0EF, 0xC0F0, 0xC0F1, 0xC0F2, 0xC0F3, 0xC0F6, 0xC0F8,

+    0xC0FA, 0xC0FB, 0xC0FC, 0xC0FD, 0xC0FE, 0xC0FF, 0xC101, 0xC102,

+    0xC103, 0xC105, 0xC106, 0xC107, 0xC109, 0xC10A, 0xC10B, 0xC10C,

+    0xC10D, 0xC10E, 0xC10F, 0xC111, 0xC112, 0xC113, 0xC114, 0xC116,

+    0xC117, 0xC118, 0xC119, 0xC11A, 0xC11B, 0xC121, 0xC122, 0xC125,

+    0xC128, 0xC129, 0xC12A, 0xC12B, 0xC12E, 0xC132, 0xC133, 0xC134,

+    0xC135, 0xC137, 0xC13A, 0xC13B, 0xC13D, 0xC13E, 0xC13F, 0xC141,

+    0xC142, 0xC143, 0xC144, 0xC145, 0xC146, 0xC147, 0xC14A, 0xC14E,

+    0xC14F, 0xC150, 0xC151, 0xC152, 0xC153, 0xC156, 0xC157, 0xC159,

+    0xC15A, 0xC15B, 0xC15D, 0xC15E, 0xC15F, 0xC160, 0xC161, 0xC162,

+    0xC163, 0xC166, 0xC16A, 0xC16B, 0xC16C, 0xC16D, 0xC16E, 0xC16F,

+    0xC171, 0xC172, 0xC173, 0xC175, 0xC176, 0xC177, 0xC179, 0xC17A,

+    0xC17B, 0xC17C, 0xC17D, 0xC17E, 0xC17F, 0xC180, 0xC181, 0xC182,

+    0xC183, 0xC184, 0xC186, 0xC187, 0xC188, 0xC189, 0xC18A, 0xC18B,

+    0xC18F, 0xC191, 0xC192, 0xC193, 0xC195, 0xC197, 0xC198, 0xC199,

+    0xC19A, 0xC19B, 0xC19E, 0xC1A0, 0xC1A2, 0xC1A3, 0xC1A4, 0xC1A6,

+    0xC1A7, 0xC1AA, 0xC1AB, 0xC1AD, 0xC1AE, 0xC1AF, 0xC1B1, 0xC1B2,

+    0xC1B3, 0xC1B4, 0xC1B5, 0xC1B6, 0xC1B7, 0xC1B8, 0xC1B9, 0xC1BA,

+    0xC1BB, 0xC1BC, 0xC1BE, 0xC1BF, 0xC1C0, 0xC1C1, 0xC1C2, 0xC1C3,

+    0xC1C5, 0xC1C6, 0xC1C7, 0xC1C9, 0xC1CA, 0xC1CB, 0xC1CD, 0xC1CE,

+    0xC1CF, 0xC1D0, 0xC1D1, 0xC1D2, 0xC1D3, 0xC1D5, 0xC1D6, 0xC1D9,

+    0xC1DA, 0xC1DB, 0xC1DC, 0xC1DD, 0xC1DE, 0xC1DF, 0xC1E1, 0xC1E2,

+    0xC1E3, 0xC1E5, 0xC1E6, 0xC1E7, 0xC1E9, 0xC1EA, 0xC1EB, 0xC1EC,

+    0xC1ED, 0xC1EE, 0xC1EF, 0xC1F2, 0xC1F4, 0xC1F5, 0xC1F6, 0xC1F7,

+    0xC1F8, 0xC1F9, 0xC1FA, 0xC1FB, 0xC1FE, 0xC1FF, 0xC201, 0xC202,

+    0xC203, 0xC205, 0xC206, 0xC207, 0xC208, 0xC209, 0xC20A, 0xC20B,

+    0xC20E, 0xC210, 0xC212, 0xC213, 0xC214, 0xC215, 0xC216, 0xC217,

+    0xC21A, 0xC21B, 0xC21D, 0xC21E, 0xC221, 0xC222, 0xC223, 0xC224,

+    0xC225, 0xC226, 0xC227, 0xC22A, 0xC22C, 0xC22E, 0xC230, 0xC233,

+    0xC235, 0xC236, 0xC237, 0xC238, 0xC239, 0xC23A, 0xC23B, 0xC23C,

+    0xC23D, 0xC23E, 0xC23F, 0xC240, 0xC241, 0xC242, 0xC243, 0xC244,

+    0xC245, 0xC246, 0xC247, 0xC249, 0xC24A, 0xC24B, 0xC24C, 0xC24D,

+    0xC24E, 0xC24F, 0xC252, 0xC253, 0xC255, 0xC256, 0xC257, 0xC259,

+    0xC25A, 0xC25B, 0xC25C, 0xC25D, 0xC25E, 0xC25F, 0xC261, 0xC262,

+    0xC263, 0xC264, 0xC266, 0xC267, 0xC268, 0xC269, 0xC26A, 0xC26B,

+    0xC26E, 0xC26F, 0xC271, 0xC272, 0xC273, 0xC275, 0xC276, 0xC277,

+    0xC278, 0xC279, 0xC27A, 0xC27B, 0xC27E, 0xC280, 0xC282, 0xC283,

+    0xC284, 0xC285, 0xC286, 0xC287, 0xC28A, 0xC28B, 0xC28C, 0xC28D,

+    0xC28E, 0xC28F, 0xC291, 0xC292, 0xC293, 0xC294, 0xC295, 0xC296,

+    0xC297, 0xC299, 0xC29A, 0xC29C, 0xC29E, 0xC29F, 0xC2A0, 0xC2A1,

+    0xC2A2, 0xC2A3, 0xC2A6, 0xC2A7, 0xC2A9, 0xC2AA, 0xC2AB, 0xC2AE,

+    0xC2AF, 0xC2B0, 0xC2B1, 0xC2B2, 0xC2B3, 0xC2B6, 0xC2B8, 0xC2BA,

+    0xC2BB, 0xC2BC, 0xC2BD, 0xC2BE, 0xC2BF, 0xC2C0, 0xC2C1, 0xC2C2,

+    0xC2C3, 0xC2C4, 0xC2C5, 0xC2C6, 0xC2C7, 0xC2C8, 0xC2C9, 0xC2CA,

+    0xC2CB, 0xC2CC, 0xC2CD, 0xC2CE, 0xC2CF, 0xC2D0, 0xC2D1, 0xC2D2,

+    0xC2D3, 0xC2D4, 0xC2D5, 0xC2D6, 0xC2D7, 0xC2D8, 0xC2D9, 0xC2DA,

+    0xC2DB, 0xC2DE, 0xC2DF, 0xC2E1, 0xC2E2, 0xC2E5, 0xC2E6, 0xC2E7,

+    0xC2E8, 0xC2E9, 0xC2EA, 0xC2EE, 0xC2F0, 0xC2F2, 0xC2F3, 0xC2F4,

+    0xC2F5, 0xC2F7, 0xC2FA, 0xC2FD, 0xC2FE, 0xC2FF, 0xC301, 0xC302,

+    0xC303, 0xC304, 0xC305, 0xC306, 0xC307, 0xC30A, 0xC30B, 0xC30E,

+    0xC30F, 0xC310, 0xC311, 0xC312, 0xC316, 0xC317, 0xC319, 0xC31A,

+    0xC31B, 0xC31D, 0xC31E, 0xC31F, 0xC320, 0xC321, 0xC322, 0xC323,

+    0xC326, 0xC327, 0xC32A, 0xC32B, 0xC32C, 0xC32D, 0xC32E, 0xC32F,

+    0xC330, 0xC331, 0xC332, 0xC333, 0xC334, 0xC335, 0xC336, 0xC337,

+    0xC338, 0xC339, 0xC33A, 0xC33B, 0xC33C, 0xC33D, 0xC33E, 0xC33F,

+    0xC340, 0xC341, 0xC342, 0xC343, 0xC344, 0xC346, 0xC347, 0xC348,

+    0xC349, 0xC34A, 0xC34B, 0xC34C, 0xC34D, 0xC34E, 0xC34F, 0xC350,

+    0xC351, 0xC352, 0xC353, 0xC354, 0xC355, 0xC356, 0xC357, 0xC358,

+    0xC359, 0xC35A, 0xC35B, 0xC35C, 0xC35D, 0xC35E, 0xC35F, 0xC360,

+    0xC361, 0xC362, 0xC363, 0xC364, 0xC365, 0xC366, 0xC367, 0xC36A,

+    0xC36B, 0xC36D, 0xC36E, 0xC36F, 0xC371, 0xC373, 0xC374, 0xC375,

+    0xC376, 0xC377, 0xC37A, 0xC37B, 0xC37E, 0xC37F, 0xC380, 0xC381,

+    0xC382, 0xC383, 0xC385, 0xC386, 0xC387, 0xC389, 0xC38A, 0xC38B,

+    0xC38D, 0xC38E, 0xC38F, 0xC390, 0xC391, 0xC392, 0xC393, 0xC394,

+    0xC395, 0xC396, 0xC397, 0xC398, 0xC399, 0xC39A, 0xC39B, 0xC39C,

+    0xC39D, 0xC39E, 0xC39F, 0xC3A0, 0xC3A1, 0xC3A2, 0xC3A3, 0xC3A4,

+    0xC3A5, 0xC3A6, 0xC3A7, 0xC3A8, 0xC3A9, 0xC3AA, 0xC3AB, 0xC3AC,

+    0xC3AD, 0xC3AE, 0xC3AF, 0xC3B0, 0xC3B1, 0xC3B2, 0xC3B3, 0xC3B4,

+    0xC3B5, 0xC3B6, 0xC3B7, 0xC3B8, 0xC3B9, 0xC3BA, 0xC3BB, 0xC3BC,

+    0xC3BD, 0xC3BE, 0xC3BF, 0xC3C1, 0xC3C2, 0xC3C3, 0xC3C4, 0xC3C5,

+    0xC3C6, 0xC3C7, 0xC3C8, 0xC3C9, 0xC3CA, 0xC3CB, 0xC3CC, 0xC3CD,

+    0xC3CE, 0xC3CF, 0xC3D0, 0xC3D1, 0xC3D2, 0xC3D3, 0xC3D4, 0xC3D5,

+    0xC3D6, 0xC3D7, 0xC3DA, 0xC3DB, 0xC3DD, 0xC3DE, 0xC3E1, 0xC3E3,

+    0xC3E4, 0xC3E5, 0xC3E6, 0xC3E7, 0xC3EA, 0xC3EB, 0xC3EC, 0xC3EE,

+    0xC3EF, 0xC3F0, 0xC3F1, 0xC3F2, 0xC3F3, 0xC3F6, 0xC3F7, 0xC3F9,

+    0xC3FA, 0xC3FB, 0xC3FC, 0xC3FD, 0xC3FE, 0xC3FF, 0xC400, 0xC401,

+    0xC402, 0xC403, 0xC404, 0xC405, 0xC406, 0xC407, 0xC409, 0xC40A,

+    0xC40B, 0xC40C, 0xC40D, 0xC40E, 0xC40F, 0xC411, 0xC412, 0xC413,

+    0xC414, 0xC415, 0xC416, 0xC417, 0xC418, 0xC419, 0xC41A, 0xC41B,

+    0xC41C, 0xC41D, 0xC41E, 0xC41F, 0xC420, 0xC421, 0xC422, 0xC423,

+    0xC425, 0xC426, 0xC427, 0xC428, 0xC429, 0xC42A, 0xC42B, 0xC42D,

+    0xC42E, 0xC42F, 0xC431, 0xC432, 0xC433, 0xC435, 0xC436, 0xC437,

+    0xC438, 0xC439, 0xC43A, 0xC43B, 0xC43E, 0xC43F, 0xC440, 0xC441,

+    0xC442, 0xC443, 0xC444, 0xC445, 0xC446, 0xC447, 0xC449, 0xC44A,

+    0xC44B, 0xC44C, 0xC44D, 0xC44E, 0xC44F, 0xC450, 0xC451, 0xC452,

+    0xC453, 0xC454, 0xC455, 0xC456, 0xC457, 0xC458, 0xC459, 0xC45A,

+    0xC45B, 0xC45C, 0xC45D, 0xC45E, 0xC45F, 0xC460, 0xC461, 0xC462,

+    0xC463, 0xC466, 0xC467, 0xC469, 0xC46A, 0xC46B, 0xC46D, 0xC46E,

+    0xC46F, 0xC470, 0xC471, 0xC472, 0xC473, 0xC476, 0xC477, 0xC478,

+    0xC47A, 0xC47B, 0xC47C, 0xC47D, 0xC47E, 0xC47F, 0xC481, 0xC482,

+    0xC483, 0xC484, 0xC485, 0xC486, 0xC487, 0xC488, 0xC489, 0xC48A,

+    0xC48B, 0xC48C, 0xC48D, 0xC48E, 0xC48F, 0xC490, 0xC491, 0xC492,

+    0xC493, 0xC495, 0xC496, 0xC497, 0xC498, 0xC499, 0xC49A, 0xC49B,

+    0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC4A1, 0xC4A2, 0xC4A3, 0xC4A4,

+    0xC4A5, 0xC4A6, 0xC4A7, 0xC4A8, 0xC4A9, 0xC4AA, 0xC4AB, 0xC4AC,

+    0xC4AD, 0xC4AE, 0xC4AF, 0xC4B0, 0xC4B1, 0xC4B2, 0xC4B3, 0xC4B4,

+    0xC4B5, 0xC4B6, 0xC4B7, 0xC4B9, 0xC4BA, 0xC4BB, 0xC4BD, 0xC4BE,

+    0xC4BF, 0xC4C0, 0xC4C1, 0xC4C2, 0xC4C3, 0xC4C4, 0xC4C5, 0xC4C6,

+    0xC4C7, 0xC4C8, 0xC4C9, 0xC4CA, 0xC4CB, 0xC4CC, 0xC4CD, 0xC4CE,

+    0xC4CF, 0xC4D0, 0xC4D1, 0xC4D2, 0xC4D3, 0xC4D4, 0xC4D5, 0xC4D6,

+    0xC4D7, 0xC4D8, 0xC4D9, 0xC4DA, 0xC4DB, 0xC4DC, 0xC4DD, 0xC4DE,

+    0xC4DF, 0xC4E0, 0xC4E1, 0xC4E2, 0xC4E3, 0xC4E4, 0xC4E5, 0xC4E6,

+    0xC4E7, 0xC4E8, 0xC4EA, 0xC4EB, 0xC4EC, 0xC4ED, 0xC4EE, 0xC4EF,

+    0xC4F2, 0xC4F3, 0xC4F5, 0xC4F6, 0xC4F7, 0xC4F9, 0xC4FB, 0xC4FC,

+    0xC4FD, 0xC4FE, 0xC502, 0xC503, 0xC504, 0xC505, 0xC506, 0xC507,

+    0xC508, 0xC509, 0xC50A, 0xC50B, 0xC50D, 0xC50E, 0xC50F, 0xC511,

+    0xC512, 0xC513, 0xC515, 0xC516, 0xC517, 0xC518, 0xC519, 0xC51A,

+    0xC51B, 0xC51D, 0xC51E, 0xC51F, 0xC520, 0xC521, 0xC522, 0xC523,

+    0xC524, 0xC525, 0xC526, 0xC527, 0xC52A, 0xC52B, 0xC52D, 0xC52E,

+    0xC52F, 0xC531, 0xC532, 0xC533, 0xC534, 0xC535, 0xC536, 0xC537,

+    0xC53A, 0xC53C, 0xC53E, 0xC53F, 0xC540, 0xC541, 0xC542, 0xC543,

+    0xC546, 0xC547, 0xC54B, 0xC54F, 0xC550, 0xC551, 0xC552, 0xC556,

+    0xC55A, 0xC55B, 0xC55C, 0xC55F, 0xC562, 0xC563, 0xC565, 0xC566,

+    0xC567, 0xC569, 0xC56A, 0xC56B, 0xC56C, 0xC56D, 0xC56E, 0xC56F,

+    0xC572, 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC57B, 0xC57E,

+    0xC57F, 0xC581, 0xC582, 0xC583, 0xC585, 0xC586, 0xC588, 0xC589,

+    0xC58A, 0xC58B, 0xC58E, 0xC590, 0xC592, 0xC593, 0xC594, 0xC596,

+    0xC599, 0xC59A, 0xC59B, 0xC59D, 0xC59E, 0xC59F, 0xC5A1, 0xC5A2,

+    0xC5A3, 0xC5A4, 0xC5A5, 0xC5A6, 0xC5A7, 0xC5A8, 0xC5AA, 0xC5AB,

+    0xC5AC, 0xC5AD, 0xC5AE, 0xC5AF, 0xC5B0, 0xC5B1, 0xC5B2, 0xC5B3,

+    0xC5B6, 0xC5B7, 0xC5BA, 0xC5BF, 0xC5C0, 0xC5C1, 0xC5C2, 0xC5C3,

+    0xC5CB, 0xC5CD, 0xC5CF, 0xC5D2, 0xC5D3, 0xC5D5, 0xC5D6, 0xC5D7,

+    0xC5D9, 0xC5DA, 0xC5DB, 0xC5DC, 0xC5DD, 0xC5DE, 0xC5DF, 0xC5E2,

+    0xC5E4, 0xC5E6, 0xC5E7, 0xC5E8, 0xC5E9, 0xC5EA, 0xC5EB, 0xC5EF,

+    0xC5F1, 0xC5F2, 0xC5F3, 0xC5F5, 0xC5F8, 0xC5F9, 0xC5FA, 0xC5FB,

+    0xC602, 0xC603, 0xC604, 0xC609, 0xC60A, 0xC60B, 0xC60D, 0xC60E,

+    0xC60F, 0xC611, 0xC612, 0xC613, 0xC614, 0xC615, 0xC616, 0xC617,

+    0xC61A, 0xC61D, 0xC61E, 0xC61F, 0xC620, 0xC621, 0xC622, 0xC623,

+    0xC626, 0xC627, 0xC629, 0xC62A, 0xC62B, 0xC62F, 0xC631, 0xC632,

+    0xC636, 0xC638, 0xC63A, 0xC63C, 0xC63D, 0xC63E, 0xC63F, 0xC642,

+    0xC643, 0xC645, 0xC646, 0xC647, 0xC649, 0xC64A, 0xC64B, 0xC64C,

+    0xC64D, 0xC64E, 0xC64F, 0xC652, 0xC656, 0xC657, 0xC658, 0xC659,

+    0xC65A, 0xC65B, 0xC65E, 0xC65F, 0xC661, 0xC662, 0xC663, 0xC664,

+    0xC665, 0xC666, 0xC667, 0xC668, 0xC669, 0xC66A, 0xC66B, 0xC66D,

+    0xC66E, 0xC670, 0xC672, 0xC673, 0xC674, 0xC675, 0xC676, 0xC677,

+    0xC67A, 0xC67B, 0xC67D, 0xC67E, 0xC67F, 0xC681, 0xC682, 0xC683,

+    0xC684, 0xC685, 0xC686, 0xC687, 0xC68A, 0xC68C, 0xC68E, 0xC68F,

+    0xC690, 0xC691, 0xC692, 0xC693, 0xC696, 0xC697, 0xC699, 0xC69A,

+    0xC69B, 0xC69D, 0xC69E, 0xC69F, 0xC6A0, 0xC6A1, 0xC6A2, 0xC6A3,

+    0xC6A6, 0xC6A8, 0xC6AA, 0xC6AB, 0xC6AC, 0xC6AD, 0xC6AE, 0xC6AF,

+    0xC6B2, 0xC6B3, 0xC6B5, 0xC6B6, 0xC6B7, 0xC6BB, 0xC6BC, 0xC6BD,

+    0xC6BE, 0xC6BF, 0xC6C2, 0xC6C4, 0xC6C6, 0xC6C7, 0xC6C8, 0xC6C9,

+    0xC6CA, 0xC6CB, 0xC6CE, 0xC6CF, 0xC6D1, 0xC6D2, 0xC6D3, 0xC6D5,

+    0xC6D6, 0xC6D7, 0xC6D8, 0xC6D9, 0xC6DA, 0xC6DB, 0xC6DE, 0xC6DF,

+    0xC6E2, 0xC6E3, 0xC6E4, 0xC6E5, 0xC6E6, 0xC6E7, 0xC6EA, 0xC6EB,

+    0xC6ED, 0xC6EE, 0xC6EF, 0xC6F1, 0xC6F2, 0xC6F3, 0xC6F4, 0xC6F5,

+    0xC6F6, 0xC6F7, 0xC6FA, 0xC6FB, 0xC6FC, 0xC6FE, 0xC6FF, 0xC700,

+    0xC701, 0xC702, 0xC703, 0xC706, 0xC707, 0xC709, 0xC70A, 0xC70B,

+    0xC70D, 0xC70E, 0xC70F, 0xC710, 0xC711, 0xC712, 0xC713, 0xC716,

+    0xC718, 0xC71A, 0xC71B, 0xC71C, 0xC71D, 0xC71E, 0xC71F, 0xC722,

+    0xC723, 0xC725, 0xC726, 0xC727, 0xC729, 0xC72A, 0xC72B, 0xC72C,

+    0xC72D, 0xC72E, 0xC72F, 0xC732, 0xC734, 0xC736, 0xC738, 0xC739,

+    0xC73A, 0xC73B, 0xC73E, 0xC73F, 0xC741, 0xC742, 0xC743, 0xC745,

+    0xC746, 0xC747, 0xC748, 0xC749, 0xC74B, 0xC74E, 0xC750, 0xC759,

+    0xC75A, 0xC75B, 0xC75D, 0xC75E, 0xC75F, 0xC761, 0xC762, 0xC763,

+    0xC764, 0xC765, 0xC766, 0xC767, 0xC769, 0xC76A, 0xC76C, 0xC76D,

+    0xC76E, 0xC76F, 0xC770, 0xC771, 0xC772, 0xC773, 0xC776, 0xC777,

+    0xC779, 0xC77A, 0xC77B, 0xC77F, 0xC780, 0xC781, 0xC782, 0xC786,

+    0xC78B, 0xC78C, 0xC78D, 0xC78F, 0xC792, 0xC793, 0xC795, 0xC799,

+    0xC79B, 0xC79C, 0xC79D, 0xC79E, 0xC79F, 0xC7A2, 0xC7A7, 0xC7A8,

+    0xC7A9, 0xC7AA, 0xC7AB, 0xC7AE, 0xC7AF, 0xC7B1, 0xC7B2, 0xC7B3,

+    0xC7B5, 0xC7B6, 0xC7B7, 0xC7B8, 0xC7B9, 0xC7BA, 0xC7BB, 0xC7BE,

+    0xC7C2, 0xC7C3, 0xC7C4, 0xC7C5, 0xC7C6, 0xC7C7, 0xC7CA, 0xC7CB,

+    0xC7CD, 0xC7CF, 0xC7D1, 0xC7D2, 0xC7D3, 0xC7D4, 0xC7D5, 0xC7D6,

+    0xC7D7, 0xC7D9, 0xC7DA, 0xC7DB, 0xC7DC, 0xC7DE, 0xC7DF, 0xC7E0,

+    0xC7E1, 0xC7E2, 0xC7E3, 0xC7E5, 0xC7E6, 0xC7E7, 0xC7E9, 0xC7EA,

+    0xC7EB, 0xC7ED, 0xC7EE, 0xC7EF, 0xC7F0, 0xC7F1, 0xC7F2, 0xC7F3,

+    0xC7F4, 0xC7F5, 0xC7F6, 0xC7F7, 0xC7F8, 0xC7F9, 0xC7FA, 0xC7FB,

+    0xC7FC, 0xC7FD, 0xC7FE, 0xC7FF, 0xC802, 0xC803, 0xC805, 0xC806,

+    0xC807, 0xC809, 0xC80B, 0xC80C, 0xC80D, 0xC80E, 0xC80F, 0xC812,

+    0xC814, 0xC817, 0xC818, 0xC819, 0xC81A, 0xC81B, 0xC81E, 0xC81F,

+    0xC821, 0xC822, 0xC823, 0xC825, 0xC826, 0xC827, 0xC828, 0xC829,

+    0xC82A, 0xC82B, 0xC82E, 0xC830, 0xC832, 0xC833, 0xC834, 0xC835,

+    0xC836, 0xC837, 0xC839, 0xC83A, 0xC83B, 0xC83D, 0xC83E, 0xC83F,

+    0xC841, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846, 0xC847, 0xC84A,

+    0xC84B, 0xC84E, 0xC84F, 0xC850, 0xC851, 0xC852, 0xC853, 0xC855,

+    0xC856, 0xC857, 0xC858, 0xC859, 0xC85A, 0xC85B, 0xC85C, 0xC85D,

+    0xC85E, 0xC85F, 0xC860, 0xC861, 0xC862, 0xC863, 0xC864, 0xC865,

+    0xC866, 0xC867, 0xC868, 0xC869, 0xC86A, 0xC86B, 0xC86C, 0xC86D,

+    0xC86E, 0xC86F, 0xC872, 0xC873, 0xC875, 0xC876, 0xC877, 0xC879,

+    0xC87B, 0xC87C, 0xC87D, 0xC87E, 0xC87F, 0xC882, 0xC884, 0xC888,

+    0xC889, 0xC88A, 0xC88E, 0xC88F, 0xC890, 0xC891, 0xC892, 0xC893,

+    0xC895, 0xC896, 0xC897, 0xC898, 0xC899, 0xC89A, 0xC89B, 0xC89C,

+    0xC89E, 0xC8A0, 0xC8A2, 0xC8A3, 0xC8A4, 0xC8A5, 0xC8A6, 0xC8A7,

+    0xC8A9, 0xC8AA, 0xC8AB, 0xC8AC, 0xC8AD, 0xC8AE, 0xC8AF, 0xC8B0,

+    0xC8B1, 0xC8B2, 0xC8B3, 0xC8B4, 0xC8B5, 0xC8B6, 0xC8B7, 0xC8B8,

+    0xC8B9, 0xC8BA, 0xC8BB, 0xC8BE, 0xC8BF, 0xC8C0, 0xC8C1, 0xC8C2,

+    0xC8C3, 0xC8C5, 0xC8C6, 0xC8C7, 0xC8C9, 0xC8CA, 0xC8CB, 0xC8CD,

+    0xC8CE, 0xC8CF, 0xC8D0, 0xC8D1, 0xC8D2, 0xC8D3, 0xC8D6, 0xC8D8,

+    0xC8DA, 0xC8DB, 0xC8DC, 0xC8DD, 0xC8DE, 0xC8DF, 0xC8E2, 0xC8E3,

+    0xC8E5, 0xC8E6, 0xC8E7, 0xC8E8, 0xC8E9, 0xC8EA, 0xC8EB, 0xC8EC,

+    0xC8ED, 0xC8EE, 0xC8EF, 0xC8F0, 0xC8F1, 0xC8F2, 0xC8F3, 0xC8F4,

+    0xC8F6, 0xC8F7, 0xC8F8, 0xC8F9, 0xC8FA, 0xC8FB, 0xC8FE, 0xC8FF,

+    0xC901, 0xC902, 0xC903, 0xC907, 0xC908, 0xC909, 0xC90A, 0xC90B,

+    0xC90E, 0xC910, 0xC912, 0xC913, 0xC914, 0xC915, 0xC916, 0xC917,

+    0xC919, 0xC91A, 0xC91B, 0xC91C, 0xC91D, 0xC91E, 0xC91F, 0xC920,

+    0xC921, 0xC922, 0xC923, 0xC924, 0xC925, 0xC926, 0xC927, 0xC928,

+    0xC929, 0xC92A, 0xC92B, 0xC92D, 0xC92E, 0xC92F, 0xC930, 0xC931,

+    0xC932, 0xC933, 0xC935, 0xC936, 0xC937, 0xC938, 0xC939, 0xC93A,

+    0xC93B, 0xC93C, 0xC93D, 0xC93E, 0xC93F, 0xC940, 0xC941, 0xC942,

+    0xC943, 0xC944, 0xC945, 0xC946, 0xC947, 0xC948, 0xC949, 0xC94A,

+    0xC94B, 0xC94C, 0xC94D, 0xC94E, 0xC94F, 0xC952, 0xC953, 0xC955,

+    0xC956, 0xC957, 0xC959, 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E,

+    0xC95F, 0xC962, 0xC964, 0xC965, 0xC966, 0xC967, 0xC968, 0xC969,

+    0xC96A, 0xC96B, 0xC96D, 0xC96E, 0xC96F, 0xC971, 0xC972, 0xC973,

+    0xC975, 0xC976, 0xC977, 0xC978, 0xC979, 0xC97A, 0xC97B, 0xC97D,

+    0xC97E, 0xC97F, 0xC980, 0xC981, 0xC982, 0xC983, 0xC984, 0xC985,

+    0xC986, 0xC987, 0xC98A, 0xC98B, 0xC98D, 0xC98E, 0xC98F, 0xC991,

+    0xC992, 0xC993, 0xC994, 0xC995, 0xC996, 0xC997, 0xC99A, 0xC99C,

+    0xC99E, 0xC99F, 0xC9A0, 0xC9A1, 0xC9A2, 0xC9A3, 0xC9A4, 0xC9A5,

+    0xC9A6, 0xC9A7, 0xC9A8, 0xC9A9, 0xC9AA, 0xC9AB, 0xC9AC, 0xC9AD,

+    0xC9AE, 0xC9AF, 0xC9B0, 0xC9B1, 0xC9B2, 0xC9B3, 0xC9B4, 0xC9B5,

+    0xC9B6, 0xC9B7, 0xC9B8, 0xC9B9, 0xC9BA, 0xC9BB, 0xC9BC, 0xC9BD,

+    0xC9BE, 0xC9BF, 0xC9C2, 0xC9C3, 0xC9C5, 0xC9C6, 0xC9C9, 0xC9CB,

+    0xC9CC, 0xC9CD, 0xC9CE, 0xC9CF, 0xC9D2, 0xC9D4, 0xC9D7, 0xC9D8,

+    0xC9DB, 0xC9DE, 0xC9DF, 0xC9E1, 0xC9E3, 0xC9E5, 0xC9E6, 0xC9E8,

+    0xC9E9, 0xC9EA, 0xC9EB, 0xC9EE, 0xC9F2, 0xC9F3, 0xC9F4, 0xC9F5,

+    0xC9F6, 0xC9F7, 0xC9FA, 0xC9FB, 0xC9FD, 0xC9FE, 0xC9FF, 0xCA01,

+    0xCA02, 0xCA03, 0xCA04, 0xCA05, 0xCA06, 0xCA07, 0xCA0A, 0xCA0E,

+    0xCA0F, 0xCA10, 0xCA11, 0xCA12, 0xCA13, 0xCA15, 0xCA16, 0xCA17,

+    0xCA19, 0xCA1A, 0xCA1B, 0xCA1C, 0xCA1D, 0xCA1E, 0xCA1F, 0xCA20,

+    0xCA21, 0xCA22, 0xCA23, 0xCA24, 0xCA25, 0xCA26, 0xCA27, 0xCA28,

+    0xCA2A, 0xCA2B, 0xCA2C, 0xCA2D, 0xCA2E, 0xCA2F, 0xCA30, 0xCA31,

+    0xCA32, 0xCA33, 0xCA34, 0xCA35, 0xCA36, 0xCA37, 0xCA38, 0xCA39,

+    0xCA3A, 0xCA3B, 0xCA3C, 0xCA3D, 0xCA3E, 0xCA3F, 0xCA40, 0xCA41,

+    0xCA42, 0xCA43, 0xCA44, 0xCA45, 0xCA46, 0xCA47, 0xCA48, 0xCA49,

+    0xCA4A, 0xCA4B, 0xCA4E, 0xCA4F, 0xCA51, 0xCA52, 0xCA53, 0xCA55,

+    0xCA56, 0xCA57, 0xCA58, 0xCA59, 0xCA5A, 0xCA5B, 0xCA5E, 0xCA62,

+    0xCA63, 0xCA64, 0xCA65, 0xCA66, 0xCA67, 0xCA69, 0xCA6A, 0xCA6B,

+    0xCA6C, 0xCA6D, 0xCA6E, 0xCA6F, 0xCA70, 0xCA71, 0xCA72, 0xCA73,

+    0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78, 0xCA79, 0xCA7A, 0xCA7B,

+    0xCA7C, 0xCA7E, 0xCA7F, 0xCA80, 0xCA81, 0xCA82, 0xCA83, 0xCA85,

+    0xCA86, 0xCA87, 0xCA88, 0xCA89, 0xCA8A, 0xCA8B, 0xCA8C, 0xCA8D,

+    0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92, 0xCA93, 0xCA94, 0xCA95,

+    0xCA96, 0xCA97, 0xCA99, 0xCA9A, 0xCA9B, 0xCA9C, 0xCA9D, 0xCA9E,

+    0xCA9F, 0xCAA0, 0xCAA1, 0xCAA2, 0xCAA3, 0xCAA4, 0xCAA5, 0xCAA6,

+    0xCAA7, 0xCAA8, 0xCAA9, 0xCAAA, 0xCAAB, 0xCAAC, 0xCAAD, 0xCAAE,

+    0xCAAF, 0xCAB0, 0xCAB1, 0xCAB2, 0xCAB3, 0xCAB4, 0xCAB5, 0xCAB6,

+    0xCAB7, 0xCAB8, 0xCAB9, 0xCABA, 0xCABB, 0xCABE, 0xCABF, 0xCAC1,

+    0xCAC2, 0xCAC3, 0xCAC5, 0xCAC6, 0xCAC7, 0xCAC8, 0xCAC9, 0xCACA,

+    0xCACB, 0xCACE, 0xCAD0, 0xCAD2, 0xCAD4, 0xCAD5, 0xCAD6, 0xCAD7,

+    0xCADA, 0xCADB, 0xCADC, 0xCADD, 0xCADE, 0xCADF, 0xCAE1, 0xCAE2,

+    0xCAE3, 0xCAE4, 0xCAE5, 0xCAE6, 0xCAE7, 0xCAE8, 0xCAE9, 0xCAEA,

+    0xCAEB, 0xCAED, 0xCAEE, 0xCAEF, 0xCAF0, 0xCAF1, 0xCAF2, 0xCAF3,

+    0xCAF5, 0xCAF6, 0xCAF7, 0xCAF8, 0xCAF9, 0xCAFA, 0xCAFB, 0xCAFC,

+    0xCAFD, 0xCAFE, 0xCAFF, 0xCB00, 0xCB01, 0xCB02, 0xCB03, 0xCB04,

+    0xCB05, 0xCB06, 0xCB07, 0xCB09, 0xCB0A, 0xCB0B, 0xCB0C, 0xCB0D,

+    0xCB0E, 0xCB0F, 0xCB11, 0xCB12, 0xCB13, 0xCB15, 0xCB16, 0xCB17,

+    0xCB19, 0xCB1A, 0xCB1B, 0xCB1C, 0xCB1D, 0xCB1E, 0xCB1F, 0xCB22,

+    0xCB23, 0xCB24, 0xCB25, 0xCB26, 0xCB27, 0xCB28, 0xCB29, 0xCB2A,

+    0xCB2B, 0xCB2C, 0xCB2D, 0xCB2E, 0xCB2F, 0xCB30, 0xCB31, 0xCB32,

+    0xCB33, 0xCB34, 0xCB35, 0xCB36, 0xCB37, 0xCB38, 0xCB39, 0xCB3A,

+    0xCB3B, 0xCB3C, 0xCB3D, 0xCB3E, 0xCB3F, 0xCB40, 0xCB42, 0xCB43,

+    0xCB44, 0xCB45, 0xCB46, 0xCB47, 0xCB4A, 0xCB4B, 0xCB4D, 0xCB4E,

+    0xCB4F, 0xCB51, 0xCB52, 0xCB53, 0xCB54, 0xCB55, 0xCB56, 0xCB57,

+    0xCB5A, 0xCB5B, 0xCB5C, 0xCB5E, 0xCB5F, 0xCB60, 0xCB61, 0xCB62,

+    0xCB63, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xCB69, 0xCB6A, 0xCB6B,

+    0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F, 0xCB70, 0xCB71, 0xCB72, 0xCB73,

+    0xCB74, 0xCB75, 0xCB76, 0xCB77, 0xCB7A, 0xCB7B, 0xCB7C, 0xCB7D,

+    0xCB7E, 0xCB7F, 0xCB80, 0xCB81, 0xCB82, 0xCB83, 0xCB84, 0xCB85,

+    0xCB86, 0xCB87, 0xCB88, 0xCB89, 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D,

+    0xCB8E, 0xCB8F, 0xCB90, 0xCB91, 0xCB92, 0xCB93, 0xCB94, 0xCB95,

+    0xCB96, 0xCB97, 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, 0xCB9D, 0xCB9E,

+    0xCB9F, 0xCBA0, 0xCBA1, 0xCBA2, 0xCBA3, 0xCBA4, 0xCBA5, 0xCBA6,

+    0xCBA7, 0xCBA8, 0xCBA9, 0xCBAA, 0xCBAB, 0xCBAC, 0xCBAD, 0xCBAE,

+    0xCBAF, 0xCBB0, 0xCBB1, 0xCBB2, 0xCBB3, 0xCBB4, 0xCBB5, 0xCBB6,

+    0xCBB7, 0xCBB9, 0xCBBA, 0xCBBB, 0xCBBC, 0xCBBD, 0xCBBE, 0xCBBF,

+    0xCBC0, 0xCBC1, 0xCBC2, 0xCBC3, 0xCBC4, 0xCBC5, 0xCBC6, 0xCBC7,

+    0xCBC8, 0xCBC9, 0xCBCA, 0xCBCB, 0xCBCC, 0xCBCD, 0xCBCE, 0xCBCF,

+    0xCBD0, 0xCBD1, 0xCBD2, 0xCBD3, 0xCBD5, 0xCBD6, 0xCBD7, 0xCBD8,

+    0xCBD9, 0xCBDA, 0xCBDB, 0xCBDC, 0xCBDD, 0xCBDE, 0xCBDF, 0xCBE0,

+    0xCBE1, 0xCBE2, 0xCBE3, 0xCBE5, 0xCBE6, 0xCBE8, 0xCBEA, 0xCBEB,

+    0xCBEC, 0xCBED, 0xCBEE, 0xCBEF, 0xCBF0, 0xCBF1, 0xCBF2, 0xCBF3,

+    0xCBF4, 0xCBF5, 0xCBF6, 0xCBF7, 0xCBF8, 0xCBF9, 0xCBFA, 0xCBFB,

+    0xCBFC, 0xCBFD, 0xCBFE, 0xCBFF, 0xCC00, 0xCC01, 0xCC02, 0xCC03,

+    0xCC04, 0xCC05, 0xCC06, 0xCC07, 0xCC08, 0xCC09, 0xCC0A, 0xCC0B,

+    0xCC0E, 0xCC0F, 0xCC11, 0xCC12, 0xCC13, 0xCC15, 0xCC16, 0xCC17,

+    0xCC18, 0xCC19, 0xCC1A, 0xCC1B, 0xCC1E, 0xCC1F, 0xCC20, 0xCC23,

+    0xCC24, 0xCC25, 0xCC26, 0xCC2A, 0xCC2B, 0xCC2D, 0xCC2F, 0xCC31,

+    0xCC32, 0xCC33, 0xCC34, 0xCC35, 0xCC36, 0xCC37, 0xCC3A, 0xCC3F,

+    0xCC40, 0xCC41, 0xCC42, 0xCC43, 0xCC46, 0xCC47, 0xCC49, 0xCC4A,

+    0xCC4B, 0xCC4D, 0xCC4E, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, 0xCC53,

+    0xCC56, 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, 0xCC61,

+    0xCC62, 0xCC63, 0xCC65, 0xCC67, 0xCC69, 0xCC6A, 0xCC6B, 0xCC6C,

+    0xCC6D, 0xCC6E, 0xCC6F, 0xCC71, 0xCC72, 0xCC73, 0xCC74, 0xCC76,

+    0xCC77, 0xCC78, 0xCC79, 0xCC7A, 0xCC7B, 0xCC7C, 0xCC7D, 0xCC7E,

+    0xCC7F, 0xCC80, 0xCC81, 0xCC82, 0xCC83, 0xCC84, 0xCC85, 0xCC86,

+    0xCC87, 0xCC88, 0xCC89, 0xCC8A, 0xCC8B, 0xCC8C, 0xCC8D, 0xCC8E,

+    0xCC8F, 0xCC90, 0xCC91, 0xCC92, 0xCC93, 0xCC94, 0xCC95, 0xCC96,

+    0xCC97, 0xCC9A, 0xCC9B, 0xCC9D, 0xCC9E, 0xCC9F, 0xCCA1, 0xCCA2,

+    0xCCA3, 0xCCA4, 0xCCA5, 0xCCA6, 0xCCA7, 0xCCAA, 0xCCAE, 0xCCAF,

+    0xCCB0, 0xCCB1, 0xCCB2, 0xCCB3, 0xCCB6, 0xCCB7, 0xCCB9, 0xCCBA,

+    0xCCBB, 0xCCBD, 0xCCBE, 0xCCBF, 0xCCC0, 0xCCC1, 0xCCC2, 0xCCC3,

+    0xCCC6, 0xCCC8, 0xCCCA, 0xCCCB, 0xCCCC, 0xCCCD, 0xCCCE, 0xCCCF,

+    0xCCD1, 0xCCD2, 0xCCD3, 0xCCD5, 0xCCD6, 0xCCD7, 0xCCD8, 0xCCD9,

+    0xCCDA, 0xCCDB, 0xCCDC, 0xCCDD, 0xCCDE, 0xCCDF, 0xCCE0, 0xCCE1,

+    0xCCE2, 0xCCE3, 0xCCE5, 0xCCE6, 0xCCE7, 0xCCE8, 0xCCE9, 0xCCEA,

+    0xCCEB, 0xCCED, 0xCCEE, 0xCCEF, 0xCCF1, 0xCCF2, 0xCCF3, 0xCCF4,

+    0xCCF5, 0xCCF6, 0xCCF7, 0xCCF8, 0xCCF9, 0xCCFA, 0xCCFB, 0xCCFC,

+    0xCCFD, 0xCCFE, 0xCCFF, 0xCD00, 0xCD02, 0xCD03, 0xCD04, 0xCD05,

+    0xCD06, 0xCD07, 0xCD0A, 0xCD0B, 0xCD0D, 0xCD0E, 0xCD0F, 0xCD11,

+    0xCD12, 0xCD13, 0xCD14, 0xCD15, 0xCD16, 0xCD17, 0xCD1A, 0xCD1C,

+    0xCD1E, 0xCD1F, 0xCD20, 0xCD21, 0xCD22, 0xCD23, 0xCD25, 0xCD26,

+    0xCD27, 0xCD29, 0xCD2A, 0xCD2B, 0xCD2D, 0xCD2E, 0xCD2F, 0xCD30,

+    0xCD31, 0xCD32, 0xCD33, 0xCD34, 0xCD35, 0xCD36, 0xCD37, 0xCD38,

+    0xCD3A, 0xCD3B, 0xCD3C, 0xCD3D, 0xCD3E, 0xCD3F, 0xCD40, 0xCD41,

+    0xCD42, 0xCD43, 0xCD44, 0xCD45, 0xCD46, 0xCD47, 0xCD48, 0xCD49,

+    0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E, 0xCD4F, 0xCD50, 0xCD51,

+    0xCD52, 0xCD53, 0xCD54, 0xCD55, 0xCD56, 0xCD57, 0xCD58, 0xCD59,

+    0xCD5A, 0xCD5B, 0xCD5D, 0xCD5E, 0xCD5F, 0xCD61, 0xCD62, 0xCD63,

+    0xCD65, 0xCD66, 0xCD67, 0xCD68, 0xCD69, 0xCD6A, 0xCD6B, 0xCD6E,

+    0xCD70, 0xCD72, 0xCD73, 0xCD74, 0xCD75, 0xCD76, 0xCD77, 0xCD79,

+    0xCD7A, 0xCD7B, 0xCD7C, 0xCD7D, 0xCD7E, 0xCD7F, 0xCD80, 0xCD81,

+    0xCD82, 0xCD83, 0xCD84, 0xCD85, 0xCD86, 0xCD87, 0xCD89, 0xCD8A,

+    0xCD8B, 0xCD8C, 0xCD8D, 0xCD8E, 0xCD8F, 0xCD90, 0xCD91, 0xCD92,

+    0xCD93, 0xCD96, 0xCD97, 0xCD99, 0xCD9A, 0xCD9B, 0xCD9D, 0xCD9E,

+    0xCD9F, 0xCDA0, 0xCDA1, 0xCDA2, 0xCDA3, 0xCDA6, 0xCDA8, 0xCDAA,

+    0xCDAB, 0xCDAC, 0xCDAD, 0xCDAE, 0xCDAF, 0xCDB1, 0xCDB2, 0xCDB3,

+    0xCDB4, 0xCDB5, 0xCDB6, 0xCDB7, 0xCDB8, 0xCDB9, 0xCDBA, 0xCDBB,

+    0xCDBC, 0xCDBD, 0xCDBE, 0xCDBF, 0xCDC0, 0xCDC1, 0xCDC2, 0xCDC3,

+    0xCDC5, 0xCDC6, 0xCDC7, 0xCDC8, 0xCDC9, 0xCDCA, 0xCDCB, 0xCDCD,

+    0xCDCE, 0xCDCF, 0xCDD1, 0xCDD2, 0xCDD3, 0xCDD4, 0xCDD5, 0xCDD6,

+    0xCDD7, 0xCDD8, 0xCDD9, 0xCDDA, 0xCDDB, 0xCDDC, 0xCDDD, 0xCDDE,

+    0xCDDF, 0xCDE0, 0xCDE1, 0xCDE2, 0xCDE3, 0xCDE4, 0xCDE5, 0xCDE6,

+    0xCDE7, 0xCDE9, 0xCDEA, 0xCDEB, 0xCDED, 0xCDEE, 0xCDEF, 0xCDF1,

+    0xCDF2, 0xCDF3, 0xCDF4, 0xCDF5, 0xCDF6, 0xCDF7, 0xCDFA, 0xCDFC,

+    0xCDFE, 0xCDFF, 0xCE00, 0xCE01, 0xCE02, 0xCE03, 0xCE05, 0xCE06,

+    0xCE07, 0xCE09, 0xCE0A, 0xCE0B, 0xCE0D, 0xCE0E, 0xCE0F, 0xCE10,

+    0xCE11, 0xCE12, 0xCE13, 0xCE15, 0xCE16, 0xCE17, 0xCE18, 0xCE1A,

+    0xCE1B, 0xCE1C, 0xCE1D, 0xCE1E, 0xCE1F, 0xCE22, 0xCE23, 0xCE25,

+    0xCE26, 0xCE27, 0xCE29, 0xCE2A, 0xCE2B, 0xCE2C, 0xCE2D, 0xCE2E,

+    0xCE2F, 0xCE32, 0xCE34, 0xCE36, 0xCE37, 0xCE38, 0xCE39, 0xCE3A,

+    0xCE3B, 0xCE3C, 0xCE3D, 0xCE3E, 0xCE3F, 0xCE40, 0xCE41, 0xCE42,

+    0xCE43, 0xCE44, 0xCE45, 0xCE46, 0xCE47, 0xCE48, 0xCE49, 0xCE4A,

+    0xCE4B, 0xCE4C, 0xCE4D, 0xCE4E, 0xCE4F, 0xCE50, 0xCE51, 0xCE52,

+    0xCE53, 0xCE54, 0xCE55, 0xCE56, 0xCE57, 0xCE5A, 0xCE5B, 0xCE5D,

+    0xCE5E, 0xCE62, 0xCE63, 0xCE64, 0xCE65, 0xCE66, 0xCE67, 0xCE6A,

+    0xCE6C, 0xCE6E, 0xCE6F, 0xCE70, 0xCE71, 0xCE72, 0xCE73, 0xCE76,

+    0xCE77, 0xCE79, 0xCE7A, 0xCE7B, 0xCE7D, 0xCE7E, 0xCE7F, 0xCE80,

+    0xCE81, 0xCE82, 0xCE83, 0xCE86, 0xCE88, 0xCE8A, 0xCE8B, 0xCE8C,

+    0xCE8D, 0xCE8E, 0xCE8F, 0xCE92, 0xCE93, 0xCE95, 0xCE96, 0xCE97,

+    0xCE99, 0xCE9A, 0xCE9B, 0xCE9C, 0xCE9D, 0xCE9E, 0xCE9F, 0xCEA2,

+    0xCEA6, 0xCEA7, 0xCEA8, 0xCEA9, 0xCEAA, 0xCEAB, 0xCEAE, 0xCEAF,

+    0xCEB0, 0xCEB1, 0xCEB2, 0xCEB3, 0xCEB4, 0xCEB5, 0xCEB6, 0xCEB7,

+    0xCEB8, 0xCEB9, 0xCEBA, 0xCEBB, 0xCEBC, 0xCEBD, 0xCEBE, 0xCEBF,

+    0xCEC0, 0xCEC2, 0xCEC3, 0xCEC4, 0xCEC5, 0xCEC6, 0xCEC7, 0xCEC8,

+    0xCEC9, 0xCECA, 0xCECB, 0xCECC, 0xCECD, 0xCECE, 0xCECF, 0xCED0,

+    0xCED1, 0xCED2, 0xCED3, 0xCED4, 0xCED5, 0xCED6, 0xCED7, 0xCED8,

+    0xCED9, 0xCEDA, 0xCEDB, 0xCEDC, 0xCEDD, 0xCEDE, 0xCEDF, 0xCEE0,

+    0xCEE1, 0xCEE2, 0xCEE3, 0xCEE6, 0xCEE7, 0xCEE9, 0xCEEA, 0xCEED,

+    0xCEEE, 0xCEEF, 0xCEF0, 0xCEF1, 0xCEF2, 0xCEF3, 0xCEF6, 0xCEFA,

+    0xCEFB, 0xCEFC, 0xCEFD, 0xCEFE, 0xCEFF, 0xCF02, 0xCF03, 0xCF05,

+    0xCF06, 0xCF07, 0xCF09, 0xCF0A, 0xCF0B, 0xCF0C, 0xCF0D, 0xCF0E,

+    0xCF0F, 0xCF12, 0xCF14, 0xCF16, 0xCF17, 0xCF18, 0xCF19, 0xCF1A,

+    0xCF1B, 0xCF1D, 0xCF1E, 0xCF1F, 0xCF21, 0xCF22, 0xCF23, 0xCF25,

+    0xCF26, 0xCF27, 0xCF28, 0xCF29, 0xCF2A, 0xCF2B, 0xCF2E, 0xCF32,

+    0xCF33, 0xCF34, 0xCF35, 0xCF36, 0xCF37, 0xCF39, 0xCF3A, 0xCF3B,

+    0xCF3C, 0xCF3D, 0xCF3E, 0xCF3F, 0xCF40, 0xCF41, 0xCF42, 0xCF43,

+    0xCF44, 0xCF45, 0xCF46, 0xCF47, 0xCF48, 0xCF49, 0xCF4A, 0xCF4B,

+    0xCF4C, 0xCF4D, 0xCF4E, 0xCF4F, 0xCF50, 0xCF51, 0xCF52, 0xCF53,

+    0xCF56, 0xCF57, 0xCF59, 0xCF5A, 0xCF5B, 0xCF5D, 0xCF5E, 0xCF5F,

+    0xCF60, 0xCF61, 0xCF62, 0xCF63, 0xCF66, 0xCF68, 0xCF6A, 0xCF6B,

+    0xCF6C, 0xCF6D, 0xCF6E, 0xCF6F, 0xCF72, 0xCF73, 0xCF75, 0xCF76,

+    0xCF77, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, 0xCF7E, 0xCF7F,

+    0xCF81, 0xCF82, 0xCF83, 0xCF84, 0xCF86, 0xCF87, 0xCF88, 0xCF89,

+    0xCF8A, 0xCF8B, 0xCF8D, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92,

+    0xCF93, 0xCF94, 0xCF95, 0xCF96, 0xCF97, 0xCF98, 0xCF99, 0xCF9A,

+    0xCF9B, 0xCF9C, 0xCF9D, 0xCF9E, 0xCF9F, 0xCFA0, 0xCFA2, 0xCFA3,

+    0xCFA4, 0xCFA5, 0xCFA6, 0xCFA7, 0xCFA9, 0xCFAA, 0xCFAB, 0xCFAC,

+    0xCFAD, 0xCFAE, 0xCFAF, 0xCFB1, 0xCFB2, 0xCFB3, 0xCFB4, 0xCFB5,

+    0xCFB6, 0xCFB7, 0xCFB8, 0xCFB9, 0xCFBA, 0xCFBB, 0xCFBC, 0xCFBD,

+    0xCFBE, 0xCFBF, 0xCFC0, 0xCFC1, 0xCFC2, 0xCFC3, 0xCFC5, 0xCFC6,

+    0xCFC7, 0xCFC8, 0xCFC9, 0xCFCA, 0xCFCB, 0xCFCC, 0xCFCD, 0xCFCE,

+    0xCFCF, 0xCFD0, 0xCFD1, 0xCFD2, 0xCFD3, 0xCFD4, 0xCFD5, 0xCFD6,

+    0xCFD7, 0xCFD8, 0xCFD9, 0xCFDA, 0xCFDB, 0xCFDC, 0xCFDD, 0xCFDE,

+    0xCFDF, 0xCFE2, 0xCFE3, 0xCFE5, 0xCFE6, 0xCFE7, 0xCFE9, 0xCFEA,

+    0xCFEB, 0xCFEC, 0xCFED, 0xCFEE, 0xCFEF, 0xCFF2, 0xCFF4, 0xCFF6,

+    0xCFF7, 0xCFF8, 0xCFF9, 0xCFFA, 0xCFFB, 0xCFFD, 0xCFFE, 0xCFFF,

+    0xD001, 0xD002, 0xD003, 0xD005, 0xD006, 0xD007, 0xD008, 0xD009,

+    0xD00A, 0xD00B, 0xD00C, 0xD00D, 0xD00E, 0xD00F, 0xD010, 0xD012,

+    0xD013, 0xD014, 0xD015, 0xD016, 0xD017, 0xD019, 0xD01A, 0xD01B,

+    0xD01C, 0xD01D, 0xD01E, 0xD01F, 0xD020, 0xD021, 0xD022, 0xD023,

+    0xD024, 0xD025, 0xD026, 0xD027, 0xD028, 0xD029, 0xD02A, 0xD02B,

+    0xD02C, 0xD02E, 0xD02F, 0xD030, 0xD031, 0xD032, 0xD033, 0xD036,

+    0xD037, 0xD039, 0xD03A, 0xD03B, 0xD03D, 0xD03E, 0xD03F, 0xD040,

+    0xD041, 0xD042, 0xD043, 0xD046, 0xD048, 0xD04A, 0xD04B, 0xD04C,

+    0xD04D, 0xD04E, 0xD04F, 0xD051, 0xD052, 0xD053, 0xD055, 0xD056,

+    0xD057, 0xD059, 0xD05A, 0xD05B, 0xD05C, 0xD05D, 0xD05E, 0xD05F,

+    0xD061, 0xD062, 0xD063, 0xD064, 0xD065, 0xD066, 0xD067, 0xD068,

+    0xD069, 0xD06A, 0xD06B, 0xD06E, 0xD06F, 0xD071, 0xD072, 0xD073,

+    0xD075, 0xD076, 0xD077, 0xD078, 0xD079, 0xD07A, 0xD07B, 0xD07E,

+    0xD07F, 0xD080, 0xD082, 0xD083, 0xD084, 0xD085, 0xD086, 0xD087,

+    0xD088, 0xD089, 0xD08A, 0xD08B, 0xD08C, 0xD08D, 0xD08E, 0xD08F,

+    0xD090, 0xD091, 0xD092, 0xD093, 0xD094, 0xD095, 0xD096, 0xD097,

+    0xD098, 0xD099, 0xD09A, 0xD09B, 0xD09C, 0xD09D, 0xD09E, 0xD09F,

+    0xD0A0, 0xD0A1, 0xD0A2, 0xD0A3, 0xD0A6, 0xD0A7, 0xD0A9, 0xD0AA,

+    0xD0AB, 0xD0AD, 0xD0AE, 0xD0AF, 0xD0B0, 0xD0B1, 0xD0B2, 0xD0B3,

+    0xD0B6, 0xD0B8, 0xD0BA, 0xD0BB, 0xD0BC, 0xD0BD, 0xD0BE, 0xD0BF,

+    0xD0C2, 0xD0C3, 0xD0C5, 0xD0C6, 0xD0C7, 0xD0CA, 0xD0CB, 0xD0CC,

+    0xD0CD, 0xD0CE, 0xD0CF, 0xD0D2, 0xD0D6, 0xD0D7, 0xD0D8, 0xD0D9,

+    0xD0DA, 0xD0DB, 0xD0DE, 0xD0DF, 0xD0E1, 0xD0E2, 0xD0E3, 0xD0E5,

+    0xD0E6, 0xD0E7, 0xD0E8, 0xD0E9, 0xD0EA, 0xD0EB, 0xD0EE, 0xD0F2,

+    0xD0F3, 0xD0F4, 0xD0F5, 0xD0F6, 0xD0F7, 0xD0F9, 0xD0FA, 0xD0FB,

+    0xD0FC, 0xD0FD, 0xD0FE, 0xD0FF, 0xD100, 0xD101, 0xD102, 0xD103,

+    0xD104, 0xD105, 0xD106, 0xD107, 0xD108, 0xD109, 0xD10A, 0xD10B,

+    0xD10C, 0xD10E, 0xD10F, 0xD110, 0xD111, 0xD112, 0xD113, 0xD114,

+    0xD115, 0xD116, 0xD117, 0xD118, 0xD119, 0xD11A, 0xD11B, 0xD11C,

+    0xD11D, 0xD11E, 0xD11F, 0xD120, 0xD121, 0xD122, 0xD123, 0xD124,

+    0xD125, 0xD126, 0xD127, 0xD128, 0xD129, 0xD12A, 0xD12B, 0xD12C,

+    0xD12D, 0xD12E, 0xD12F, 0xD132, 0xD133, 0xD135, 0xD136, 0xD137,

+    0xD139, 0xD13B, 0xD13C, 0xD13D, 0xD13E, 0xD13F, 0xD142, 0xD146,

+    0xD147, 0xD148, 0xD149, 0xD14A, 0xD14B, 0xD14E, 0xD14F, 0xD151,

+    0xD152, 0xD153, 0xD155, 0xD156, 0xD157, 0xD158, 0xD159, 0xD15A,

+    0xD15B, 0xD15E, 0xD160, 0xD162, 0xD163, 0xD164, 0xD165, 0xD166,

+    0xD167, 0xD169, 0xD16A, 0xD16B, 0xD16D, 0xD16E, 0xD16F, 0xD170,

+    0xD171, 0xD172, 0xD173, 0xD174, 0xD175, 0xD176, 0xD177, 0xD178,

+    0xD179, 0xD17A, 0xD17B, 0xD17D, 0xD17E, 0xD17F, 0xD180, 0xD181,

+    0xD182, 0xD183, 0xD185, 0xD186, 0xD187, 0xD189, 0xD18A, 0xD18B,

+    0xD18C, 0xD18D, 0xD18E, 0xD18F, 0xD190, 0xD191, 0xD192, 0xD193,

+    0xD194, 0xD195, 0xD196, 0xD197, 0xD198, 0xD199, 0xD19A, 0xD19B,

+    0xD19C, 0xD19D, 0xD19E, 0xD19F, 0xD1A2, 0xD1A3, 0xD1A5, 0xD1A6,

+    0xD1A7, 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE, 0xD1AF,

+    0xD1B2, 0xD1B4, 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, 0xD1BB, 0xD1BD,

+    0xD1BE, 0xD1BF, 0xD1C1, 0xD1C2, 0xD1C3, 0xD1C4, 0xD1C5, 0xD1C6,

+    0xD1C7, 0xD1C8, 0xD1C9, 0xD1CA, 0xD1CB, 0xD1CC, 0xD1CD, 0xD1CE,

+    0xD1CF, 0xD1D0, 0xD1D1, 0xD1D2, 0xD1D3, 0xD1D4, 0xD1D5, 0xD1D6,

+    0xD1D7, 0xD1D9, 0xD1DA, 0xD1DB, 0xD1DC, 0xD1DD, 0xD1DE, 0xD1DF,

+    0xD1E0, 0xD1E1, 0xD1E2, 0xD1E3, 0xD1E4, 0xD1E5, 0xD1E6, 0xD1E7,

+    0xD1E8, 0xD1E9, 0xD1EA, 0xD1EB, 0xD1EC, 0xD1ED, 0xD1EE, 0xD1EF,

+    0xD1F0, 0xD1F1, 0xD1F2, 0xD1F3, 0xD1F5, 0xD1F6, 0xD1F7, 0xD1F9,

+    0xD1FA, 0xD1FB, 0xD1FC, 0xD1FD, 0xD1FE, 0xD1FF, 0xD200, 0xD201,

+    0xD202, 0xD203, 0xD204, 0xD205, 0xD206, 0xD208, 0xD20A, 0xD20B,

+    0xD20C, 0xD20D, 0xD20E, 0xD20F, 0xD211, 0xD212, 0xD213, 0xD214,

+    0xD215, 0xD216, 0xD217, 0xD218, 0xD219, 0xD21A, 0xD21B, 0xD21C,

+    0xD21D, 0xD21E, 0xD21F, 0xD220, 0xD221, 0xD222, 0xD223, 0xD224,

+    0xD225, 0xD226, 0xD227, 0xD228, 0xD229, 0xD22A, 0xD22B, 0xD22E,

+    0xD22F, 0xD231, 0xD232, 0xD233, 0xD235, 0xD236, 0xD237, 0xD238,

+    0xD239, 0xD23A, 0xD23B, 0xD23E, 0xD240, 0xD242, 0xD243, 0xD244,

+    0xD245, 0xD246, 0xD247, 0xD249, 0xD24A, 0xD24B, 0xD24C, 0xD24D,

+    0xD24E, 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, 0xD254, 0xD255,

+    0xD256, 0xD257, 0xD258, 0xD259, 0xD25A, 0xD25B, 0xD25D, 0xD25E,

+    0xD25F, 0xD260, 0xD261, 0xD262, 0xD263, 0xD265, 0xD266, 0xD267,

+    0xD268, 0xD269, 0xD26A, 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F,

+    0xD270, 0xD271, 0xD272, 0xD273, 0xD274, 0xD275, 0xD276, 0xD277,

+    0xD278, 0xD279, 0xD27A, 0xD27B, 0xD27C, 0xD27D, 0xD27E, 0xD27F,

+    0xD282, 0xD283, 0xD285, 0xD286, 0xD287, 0xD289, 0xD28A, 0xD28B,

+    0xD28C, 0xD28D, 0xD28E, 0xD28F, 0xD292, 0xD293, 0xD294, 0xD296,

+    0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29D, 0xD29E, 0xD29F,

+    0xD2A1, 0xD2A2, 0xD2A3, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, 0xD2A9,

+    0xD2AA, 0xD2AB, 0xD2AD, 0xD2AE, 0xD2AF, 0xD2B0, 0xD2B2, 0xD2B3,

+    0xD2B4, 0xD2B5, 0xD2B6, 0xD2B7, 0xD2BA, 0xD2BB, 0xD2BD, 0xD2BE,

+    0xD2C1, 0xD2C3, 0xD2C4, 0xD2C5, 0xD2C6, 0xD2C7, 0xD2CA, 0xD2CC,

+    0xD2CD, 0xD2CE, 0xD2CF, 0xD2D0, 0xD2D1, 0xD2D2, 0xD2D3, 0xD2D5,

+    0xD2D6, 0xD2D7, 0xD2D9, 0xD2DA, 0xD2DB, 0xD2DD, 0xD2DE, 0xD2DF,

+    0xD2E0, 0xD2E1, 0xD2E2, 0xD2E3, 0xD2E6, 0xD2E7, 0xD2E8, 0xD2E9,

+    0xD2EA, 0xD2EB, 0xD2EC, 0xD2ED, 0xD2EE, 0xD2EF, 0xD2F2, 0xD2F3,

+    0xD2F5, 0xD2F6, 0xD2F7, 0xD2F9, 0xD2FA, 0xD2FB, 0xD2FC, 0xD2FD,

+    0xD2FE, 0xD2FF, 0xD302, 0xD304, 0xD306, 0xD307, 0xD308, 0xD309,

+    0xD30A, 0xD30B, 0xD30F, 0xD311, 0xD312, 0xD313, 0xD315, 0xD317,

+    0xD318, 0xD319, 0xD31A, 0xD31B, 0xD31E, 0xD322, 0xD323, 0xD324,

+    0xD326, 0xD327, 0xD32A, 0xD32B, 0xD32D, 0xD32E, 0xD32F, 0xD331,

+    0xD332, 0xD333, 0xD334, 0xD335, 0xD336, 0xD337, 0xD33A, 0xD33E,

+    0xD33F, 0xD340, 0xD341, 0xD342, 0xD343, 0xD346, 0xD347, 0xD348,

+    0xD349, 0xD34A, 0xD34B, 0xD34C, 0xD34D, 0xD34E, 0xD34F, 0xD350,

+    0xD351, 0xD352, 0xD353, 0xD354, 0xD355, 0xD356, 0xD357, 0xD358,

+    0xD359, 0xD35A, 0xD35B, 0xD35C, 0xD35D, 0xD35E, 0xD35F, 0xD360,

+    0xD361, 0xD362, 0xD363, 0xD364, 0xD365, 0xD366, 0xD367, 0xD368,

+    0xD369, 0xD36A, 0xD36B, 0xD36C, 0xD36D, 0xD36E, 0xD36F, 0xD370,

+    0xD371, 0xD372, 0xD373, 0xD374, 0xD375, 0xD376, 0xD377, 0xD378,

+    0xD379, 0xD37A, 0xD37B, 0xD37E, 0xD37F, 0xD381, 0xD382, 0xD383,

+    0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A, 0xD38B, 0xD38E,

+    0xD392, 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, 0xD39A, 0xD39B,

+    0xD39D, 0xD39E, 0xD39F, 0xD3A1, 0xD3A2, 0xD3A3, 0xD3A4, 0xD3A5,

+    0xD3A6, 0xD3A7, 0xD3AA, 0xD3AC, 0xD3AE, 0xD3AF, 0xD3B0, 0xD3B1,

+    0xD3B2, 0xD3B3, 0xD3B5, 0xD3B6, 0xD3B7, 0xD3B9, 0xD3BA, 0xD3BB,

+    0xD3BD, 0xD3BE, 0xD3BF, 0xD3C0, 0xD3C1, 0xD3C2, 0xD3C3, 0xD3C6,

+    0xD3C7, 0xD3CA, 0xD3CB, 0xD3CC, 0xD3CD, 0xD3CE, 0xD3CF, 0xD3D1,

+    0xD3D2, 0xD3D3, 0xD3D4, 0xD3D5, 0xD3D6, 0xD3D7, 0xD3D9, 0xD3DA,

+    0xD3DB, 0xD3DC, 0xD3DD, 0xD3DE, 0xD3DF, 0xD3E0, 0xD3E2, 0xD3E4,

+    0xD3E5, 0xD3E6, 0xD3E7, 0xD3E8, 0xD3E9, 0xD3EA, 0xD3EB, 0xD3EE,

+    0xD3EF, 0xD3F1, 0xD3F2, 0xD3F3, 0xD3F5, 0xD3F6, 0xD3F7, 0xD3F8,

+    0xD3F9, 0xD3FA, 0xD3FB, 0xD3FE, 0xD400, 0xD402, 0xD403, 0xD404,

+    0xD405, 0xD406, 0xD407, 0xD409, 0xD40A, 0xD40B, 0xD40C, 0xD40D,

+    0xD40E, 0xD40F, 0xD410, 0xD411, 0xD412, 0xD413, 0xD414, 0xD415,

+    0xD416, 0xD417, 0xD418, 0xD419, 0xD41A, 0xD41B, 0xD41C, 0xD41E,

+    0xD41F, 0xD420, 0xD421, 0xD422, 0xD423, 0xD424, 0xD425, 0xD426,

+    0xD427, 0xD428, 0xD429, 0xD42A, 0xD42B, 0xD42C, 0xD42D, 0xD42E,

+    0xD42F, 0xD430, 0xD431, 0xD432, 0xD433, 0xD434, 0xD435, 0xD436,

+    0xD437, 0xD438, 0xD439, 0xD43A, 0xD43B, 0xD43C, 0xD43D, 0xD43E,

+    0xD43F, 0xD441, 0xD442, 0xD443, 0xD445, 0xD446, 0xD447, 0xD448,

+    0xD449, 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E, 0xD44F, 0xD450,

+    0xD451, 0xD452, 0xD453, 0xD454, 0xD455, 0xD456, 0xD457, 0xD458,

+    0xD459, 0xD45A, 0xD45B, 0xD45D, 0xD45E, 0xD45F, 0xD461, 0xD462,

+    0xD463, 0xD465, 0xD466, 0xD467, 0xD468, 0xD469, 0xD46A, 0xD46B,

+    0xD46C, 0xD46E, 0xD470, 0xD471, 0xD472, 0xD473, 0xD474, 0xD475,

+    0xD476, 0xD477, 0xD47A, 0xD47B, 0xD47D, 0xD47E, 0xD481, 0xD483,

+    0xD484, 0xD485, 0xD486, 0xD487, 0xD48A, 0xD48C, 0xD48E, 0xD48F,

+    0xD490, 0xD491, 0xD492, 0xD493, 0xD495, 0xD496, 0xD497, 0xD498,

+    0xD499, 0xD49A, 0xD49B, 0xD49C, 0xD49D, 0xD49E, 0xD49F, 0xD4A0,

+    0xD4A1, 0xD4A2, 0xD4A3, 0xD4A4, 0xD4A5, 0xD4A6, 0xD4A7, 0xD4A8,

+    0xD4AA, 0xD4AB, 0xD4AC, 0xD4AD, 0xD4AE, 0xD4AF, 0xD4B0, 0xD4B1,

+    0xD4B2, 0xD4B3, 0xD4B4, 0xD4B5, 0xD4B6, 0xD4B7, 0xD4B8, 0xD4B9,

+    0xD4BA, 0xD4BB, 0xD4BC, 0xD4BD, 0xD4BE, 0xD4BF, 0xD4C0, 0xD4C1,

+    0xD4C2, 0xD4C3, 0xD4C4, 0xD4C5, 0xD4C6, 0xD4C7, 0xD4C8, 0xD4C9,

+    0xD4CA, 0xD4CB, 0xD4CD, 0xD4CE, 0xD4CF, 0xD4D1, 0xD4D2, 0xD4D3,

+    0xD4D5, 0xD4D6, 0xD4D7, 0xD4D8, 0xD4D9, 0xD4DA, 0xD4DB, 0xD4DD,

+    0xD4DE, 0xD4E0, 0xD4E1, 0xD4E2, 0xD4E3, 0xD4E4, 0xD4E5, 0xD4E6,

+    0xD4E7, 0xD4E9, 0xD4EA, 0xD4EB, 0xD4ED, 0xD4EE, 0xD4EF, 0xD4F1,

+    0xD4F2, 0xD4F3, 0xD4F4, 0xD4F5, 0xD4F6, 0xD4F7, 0xD4F9, 0xD4FA,

+    0xD4FC, 0xD4FE, 0xD4FF, 0xD500, 0xD501, 0xD502, 0xD503, 0xD505,

+    0xD506, 0xD507, 0xD509, 0xD50A, 0xD50B, 0xD50D, 0xD50E, 0xD50F,

+    0xD510, 0xD511, 0xD512, 0xD513, 0xD516, 0xD518, 0xD519, 0xD51A,

+    0xD51B, 0xD51C, 0xD51D, 0xD51E, 0xD51F, 0xD520, 0xD521, 0xD522,

+    0xD523, 0xD524, 0xD525, 0xD526, 0xD527, 0xD528, 0xD529, 0xD52A,

+    0xD52B, 0xD52C, 0xD52D, 0xD52E, 0xD52F, 0xD530, 0xD531, 0xD532,

+    0xD533, 0xD534, 0xD535, 0xD536, 0xD537, 0xD538, 0xD539, 0xD53A,

+    0xD53B, 0xD53E, 0xD53F, 0xD541, 0xD542, 0xD543, 0xD545, 0xD546,

+    0xD547, 0xD548, 0xD549, 0xD54A, 0xD54B, 0xD54E, 0xD550, 0xD552,

+    0xD553, 0xD554, 0xD555, 0xD556, 0xD557, 0xD55A, 0xD55B, 0xD55D,

+    0xD55E, 0xD55F, 0xD561, 0xD562, 0xD563, 0xD564, 0xD566, 0xD567,

+    0xD56A, 0xD56C, 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573,

+    0xD576, 0xD577, 0xD579, 0xD57A, 0xD57B, 0xD57D, 0xD57E, 0xD57F,

+    0xD580, 0xD581, 0xD582, 0xD583, 0xD586, 0xD58A, 0xD58B, 0xD58C,

+    0xD58D, 0xD58E, 0xD58F, 0xD591, 0xD592, 0xD593, 0xD594, 0xD595,

+    0xD596, 0xD597, 0xD598, 0xD599, 0xD59A, 0xD59B, 0xD59C, 0xD59D,

+    0xD59E, 0xD59F, 0xD5A0, 0xD5A1, 0xD5A2, 0xD5A3, 0xD5A4, 0xD5A6,

+    0xD5A7, 0xD5A8, 0xD5A9, 0xD5AA, 0xD5AB, 0xD5AC, 0xD5AD, 0xD5AE,

+    0xD5AF, 0xD5B0, 0xD5B1, 0xD5B2, 0xD5B3, 0xD5B4, 0xD5B5, 0xD5B6,

+    0xD5B7, 0xD5B8, 0xD5B9, 0xD5BA, 0xD5BB, 0xD5BC, 0xD5BD, 0xD5BE,

+    0xD5BF, 0xD5C0, 0xD5C1, 0xD5C2, 0xD5C3, 0xD5C4, 0xD5C5, 0xD5C6,

+    0xD5C7, 0xD5CA, 0xD5CB, 0xD5CD, 0xD5CE, 0xD5CF, 0xD5D1, 0xD5D3,

+    0xD5D4, 0xD5D5, 0xD5D6, 0xD5D7, 0xD5DA, 0xD5DC, 0xD5DE, 0xD5DF,

+    0xD5E0, 0xD5E1, 0xD5E2, 0xD5E3, 0xD5E6, 0xD5E7, 0xD5E9, 0xD5EA,

+    0xD5EB, 0xD5ED, 0xD5EE, 0xD5EF, 0xD5F0, 0xD5F1, 0xD5F2, 0xD5F3,

+    0xD5F6, 0xD5F8, 0xD5FA, 0xD5FB, 0xD5FC, 0xD5FD, 0xD5FE, 0xD5FF,

+    0xD602, 0xD603, 0xD605, 0xD606, 0xD607, 0xD609, 0xD60A, 0xD60B,

+    0xD60C, 0xD60D, 0xD60E, 0xD60F, 0xD612, 0xD616, 0xD617, 0xD618,

+    0xD619, 0xD61A, 0xD61B, 0xD61D, 0xD61E, 0xD61F, 0xD621, 0xD622,

+    0xD623, 0xD625, 0xD626, 0xD627, 0xD628, 0xD629, 0xD62A, 0xD62B,

+    0xD62C, 0xD62E, 0xD62F, 0xD630, 0xD631, 0xD632, 0xD633, 0xD634,

+    0xD635, 0xD636, 0xD637, 0xD63A, 0xD63B, 0xD63D, 0xD63E, 0xD63F,

+    0xD641, 0xD642, 0xD643, 0xD644, 0xD646, 0xD647, 0xD64A, 0xD64C,

+    0xD64E, 0xD64F, 0xD650, 0xD652, 0xD653, 0xD656, 0xD657, 0xD659,

+    0xD65A, 0xD65B, 0xD65D, 0xD65E, 0xD65F, 0xD660, 0xD661, 0xD662,

+    0xD663, 0xD664, 0xD665, 0xD666, 0xD668, 0xD66A, 0xD66B, 0xD66C,

+    0xD66D, 0xD66E, 0xD66F, 0xD672, 0xD673, 0xD675, 0xD676, 0xD677,

+    0xD678, 0xD679, 0xD67A, 0xD67B, 0xD67C, 0xD67D, 0xD67E, 0xD67F,

+    0xD680, 0xD681, 0xD682, 0xD684, 0xD686, 0xD687, 0xD688, 0xD689,

+    0xD68A, 0xD68B, 0xD68E, 0xD68F, 0xD691, 0xD692, 0xD693, 0xD695,

+    0xD696, 0xD697, 0xD698, 0xD699, 0xD69A, 0xD69B, 0xD69C, 0xD69E,

+    0xD6A0, 0xD6A2, 0xD6A3, 0xD6A4, 0xD6A5, 0xD6A6, 0xD6A7, 0xD6A9,

+    0xD6AA, 0xD6AB, 0xD6AD, 0xD6AE, 0xD6AF, 0xD6B1, 0xD6B2, 0xD6B3,

+    0xD6B4, 0xD6B5, 0xD6B6, 0xD6B7, 0xD6B8, 0xD6BA, 0xD6BC, 0xD6BD,

+    0xD6BE, 0xD6BF, 0xD6C0, 0xD6C1, 0xD6C2, 0xD6C3, 0xD6C6, 0xD6C7,

+    0xD6C9, 0xD6CA, 0xD6CB, 0xD6CD, 0xD6CE, 0xD6CF, 0xD6D0, 0xD6D2,

+    0xD6D3, 0xD6D5, 0xD6D6, 0xD6D8, 0xD6DA, 0xD6DB, 0xD6DC, 0xD6DD,

+    0xD6DE, 0xD6DF, 0xD6E1, 0xD6E2, 0xD6E3, 0xD6E5, 0xD6E6, 0xD6E7,

+    0xD6E9, 0xD6EA, 0xD6EB, 0xD6EC, 0xD6ED, 0xD6EE, 0xD6EF, 0xD6F1,

+    0xD6F2, 0xD6F3, 0xD6F4, 0xD6F6, 0xD6F7, 0xD6F8, 0xD6F9, 0xD6FA,

+    0xD6FB, 0xD6FE, 0xD6FF, 0xD701, 0xD702, 0xD703, 0xD705, 0xD706,

+    0xD707, 0xD708, 0xD709, 0xD70A, 0xD70B, 0xD70C, 0xD70D, 0xD70E,

+    0xD70F, 0xD710, 0xD712, 0xD713, 0xD714, 0xD715, 0xD716, 0xD717,

+    0xD71A, 0xD71B, 0xD71D, 0xD71E, 0xD71F, 0xD721, 0xD722, 0xD723,

+    0xD724, 0xD725, 0xD726, 0xD727, 0xD72A, 0xD72C, 0xD72E, 0xD72F,

+    0xD730, 0xD731, 0xD732, 0xD733, 0xD736, 0xD737, 0xD739, 0xD73A,

+    0xD73B, 0xD73D, 0xD73E, 0xD73F, 0xD740, 0xD741, 0xD742, 0xD743,

+    0xD745, 0xD746, 0xD748, 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E,

+    0xD74F, 0xD752, 0xD753, 0xD755, 0xD75A, 0xD75B, 0xD75C, 0xD75D,

+    0xD75E, 0xD75F, 0xD762, 0xD764, 0xD766, 0xD767, 0xD768, 0xD76A,

+    0xD76B, 0xD76D, 0xD76E, 0xD76F, 0xD771, 0xD772, 0xD773, 0xD775,

+    0xD776, 0xD777, 0xD778, 0xD779, 0xD77A, 0xD77B, 0xD77E, 0xD77F,

+    0xD780, 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, 0xD78A,

+    0xD78B, 0xD78D, 0xD78E, 0xD78F, 0xD791, 0xD792, 0xD793, 0xD794,

+    0xD795, 0xD796, 0xD797, 0xD79A, 0xD79C, 0xD79E, 0xD79F, 0xD7A0,

+    0xD7A1, 0xD7A2, 0xD7A3, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024,

+    0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C,

+    0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034,

+    0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C,

+    0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044,

+    0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,

+    0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,

+    0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C,

+    0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064,

+    0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C,

+    0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,

+    0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C,

+    0x007D, 0x007E, 0x20A9, 0x2010, 0x00A9, 0x2122, 0x22EF, 0x0020,

+    0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,

+    0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,

+    0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,

+    0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,

+    0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,

+    0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,

+    0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,

+    0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060,

+    0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,

+    0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,

+    0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,

+    0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x007E, 0x005C,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp
new file mode 100644
index 0000000..cd26123
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp
@@ -0,0 +1,164 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_KSC_EUC_H_0[467 * 3] = {

+    0x0020, 0x007E, 0x1F9E, 0xA1A1, 0xA1FE, 0x0065, 0xA2A1, 0xA2E5, 0x00C3,

+    0xA3A1, 0xA3FE, 0x0108, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,

+    0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,

+    0xA5E1, 0xA5F8, 0x01EF, 0xA6A1, 0xA6E4, 0x0207, 0xA7A1, 0xA7EF, 0x024B,

+    0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,

+    0xA8B1, 0xA8FE, 0x02A7, 0xA9A1, 0xA9FE, 0x02F5, 0xAAA1, 0xAAF3, 0x0353,

+    0xABA1, 0xABF6, 0x03A6, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,

+    0xB0A1, 0xB0FE, 0x043E, 0xB1A1, 0xB1FE, 0x049C, 0xB2A1, 0xB2FE, 0x04FA,

+    0xB3A1, 0xB3FE, 0x0558, 0xB4A1, 0xB4FE, 0x05B6, 0xB5A1, 0xB5FE, 0x0614,

+    0xB6A1, 0xB6FE, 0x0672, 0xB7A1, 0xB7FE, 0x06D0, 0xB8A1, 0xB8FE, 0x072E,

+    0xB9A1, 0xB9FE, 0x078C, 0xBAA1, 0xBAFE, 0x07EA, 0xBBA1, 0xBBFE, 0x0848,

+    0xBCA1, 0xBCFE, 0x08A6, 0xBDA1, 0xBDFE, 0x0904, 0xBEA1, 0xBEFE, 0x0962,

+    0xBFA1, 0xBFFE, 0x09C0, 0xC0A1, 0xC0FE, 0x0A1E, 0xC1A1, 0xC1FE, 0x0A7C,

+    0xC2A1, 0xC2FE, 0x0ADA, 0xC3A1, 0xC3FE, 0x0B38, 0xC4A1, 0xC4FE, 0x0B96,

+    0xC5A1, 0xC5FE, 0x0BF4, 0xC6A1, 0xC6FE, 0x0C52, 0xC7A1, 0xC7FE, 0x0CB0,

+    0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, 0xCBA1, 0xCBCF, 0x0DCA,

+    0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, 0xCBD6, 0xCBD6, 0x0E5E,

+    0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, 0xCBE8, 0xCBFE, 0x0E0E,

+    0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, 0xCDCF, 0xCDCF, 0x0D84,

+    0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, 0xCDE9, 0xCDFE, 0x0EC9,

+    0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, 0xCEAE, 0xCEFE, 0x0EEB,

+    0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, 0xCFFC, 0xCFFE, 0x0F96,

+    0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, 0xD0A3, 0xD0B7, 0x0F9A,

+    0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, 0xD0D0, 0xD0D0, 0x0E7C,

+    0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, 0xD0DE, 0xD0FE, 0x0FD2,

+    0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, 0xD1D5, 0xD1D5, 0x103C,

+    0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, 0xD1D9, 0xD1DA, 0x1028,

+    0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, 0xD1E2, 0xD1E2, 0x16A8,

+    0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, 0xD1E7, 0xD1E7, 0x102B,

+    0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, 0xD1ED, 0xD1ED, 0x1127,

+    0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, 0xD1F1, 0xD1F1, 0x102E,

+    0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, 0xD1F6, 0xD1F6, 0x112F,

+    0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, 0xD1FB, 0xD1FB, 0x1035,

+    0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, 0xD2A1, 0xD2A1, 0x1036,

+    0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, 0xD2A7, 0xD2AA, 0x113C,

+    0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, 0xD2AD, 0xD2AD, 0x1144,

+    0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, 0xD2B3, 0xD2BD, 0x103F,

+    0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, 0xD2C2, 0xD2C3, 0x11A1,

+    0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, 0xD2C6, 0xD2CA, 0x11A6,

+    0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, 0xD2CD, 0xD2CE, 0x11AD,

+    0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, 0xD2D8, 0xD2D8, 0x104F,

+    0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, 0xD2DE, 0xD2DF, 0x11C1,

+    0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, 0xD2E2, 0xD2E2, 0x11C6,

+    0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, 0xD2E5, 0xD2E8, 0x11D6,

+    0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, 0xD2EC, 0xD2EF, 0x1055,

+    0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, 0xD2F6, 0xD2F6, 0x1059,

+    0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, 0xD3A1, 0xD3FE, 0x1060,

+    0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, 0xD4E7, 0xD4FB, 0x1103,

+    0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, 0xD5A1, 0xD5A4, 0x111A,

+    0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, 0xD5AB, 0xD5AB, 0x102B,

+    0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, 0xD5AF, 0xD5FE, 0x1125,

+    0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, 0xD6B9, 0xD6CC, 0x118C,

+    0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, 0xD7A1, 0xD7CA, 0x11D1,

+    0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, 0xD7E4, 0xD7E4, 0x1918,

+    0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, 0xD9A1, 0xD9FE, 0x128B,

+    0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, 0xDBC5, 0xDBC5, 0x141F,

+    0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, 0xDBE5, 0xDBFE, 0x1389,

+    0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, 0xDCA6, 0xDCFE, 0x13A7,

+    0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, 0xDDA6, 0xDDD4, 0x1404,

+    0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, 0xDDF4, 0xDDF4, 0x1DB7,

+    0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, 0xDEFC, 0xDEFC, 0x15D0,

+    0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, 0xDFA1, 0xDFB2, 0x14B7,

+    0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, 0xDFE1, 0xDFE1, 0x14F2,

+    0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, 0xDFE9, 0xDFFE, 0x14FC,

+    0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, 0xE0F2, 0xE0FE, 0x1562,

+    0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, 0xE1AE, 0xE1EC, 0x157B,

+    0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, 0xE2A1, 0xE2FE, 0x15CB,

+    0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, 0xE3F6, 0xE3FE, 0x167D,

+    0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, 0xE4A9, 0xE4A9, 0x162E,

+    0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, 0xE5AE, 0xE5AE, 0x16F2,

+    0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, 0xE5B3, 0xE5B8, 0x16F1,

+    0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, 0xE5BB, 0xE5BC, 0x114D,

+    0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, 0xE5C5, 0xE5CD, 0x16FF,

+    0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, 0xE5D0, 0xE5D0, 0x1154,

+    0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, 0xE5D3, 0xE5D5, 0x170A,

+    0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, 0xE5FA, 0xE5FB, 0x115A,

+    0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, 0xE5FE, 0xE5FE, 0x115C,

+    0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, 0xE6A4, 0xE6A4, 0x1161,

+    0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, 0xE6A8, 0xE6AC, 0x1735,

+    0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, 0xE6AF, 0xE6B1, 0x1167,

+    0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, 0xE6B4, 0xE6B6, 0x173C,

+    0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, 0xE6BC, 0xE6BC, 0x116F,

+    0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, 0xE6C5, 0xE6C5, 0x1749,

+    0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, 0xE6CA, 0xE6CA, 0x1041,

+    0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, 0xE6D3, 0xE6D5, 0x1753,

+    0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, 0xE6D9, 0xE6D9, 0x1176,

+    0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, 0xE6DD, 0xE6DE, 0x175A,

+    0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, 0xE6E1, 0xE6E1, 0x1178,

+    0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, 0xE6E5, 0xE6E5, 0x1179,

+    0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, 0xE6E8, 0xE6E8, 0x117C,

+    0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, 0xE6EC, 0xE6EC, 0x192F,

+    0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, 0xE6F0, 0xE6F0, 0x1763,

+    0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, 0xE6F3, 0xE6F4, 0x1764,

+    0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, 0xE6F7, 0xE6F7, 0x1046,

+    0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, 0xE6FA, 0xE6FE, 0x1767,

+    0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, 0xE7A6, 0xE7A6, 0x1188,

+    0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, 0xE7AA, 0xE7AA, 0x118B,

+    0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, 0xE7AD, 0xE7AD, 0x118D,

+    0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, 0xE7B1, 0xE7BE, 0x1775,

+    0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, 0xE7C1, 0xE7C1, 0x1E67,

+    0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, 0xE7C7, 0xE7C7, 0x1193,

+    0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, 0xE7CC, 0xE7CC, 0x178B,

+    0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, 0xE7CF, 0xE7D0, 0x1197,

+    0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, 0xE7D4, 0xE7DE, 0x178F,

+    0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, 0xE7E4, 0xE7E4, 0x119D,

+    0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, 0xE7E7, 0xE7F6, 0x179F,

+    0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, 0xE8A1, 0xE8E6, 0x17B6,

+    0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, 0xE8F0, 0xE8F0, 0x11C9,

+    0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, 0xE8F7, 0xE8F7, 0x11CB,

+    0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, 0xE8FA, 0xE8FA, 0x1809,

+    0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, 0xE8FE, 0xE8FE, 0x11CD,

+    0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, 0xE9A8, 0xE9AB, 0x1812,

+    0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, 0xE9CC, 0xE9CC, 0x11D3,

+    0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, 0xE9F8, 0xE9FE, 0x185F,

+    0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, 0xEAC2, 0xEAE4, 0x1886,

+    0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, 0xEAF4, 0xEAF4, 0x1057,

+    0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, 0xEAF8, 0xEAFB, 0x18B9,

+    0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, 0xEAFE, 0xEAFE, 0x11E6,

+    0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, 0xEBA5, 0xEBA6, 0x18C1,

+    0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, 0xEBA9, 0xEBA9, 0x11EC,

+    0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, 0xEBBA, 0xEBBB, 0x11EE,

+    0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, 0xEBBE, 0xEBC0, 0x18D4,

+    0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, 0xEBC3, 0xEBC5, 0x18D7,

+    0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, 0xEBCC, 0xEBCC, 0x11F7,

+    0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, 0xEBD2, 0xEBD2, 0x15B0,

+    0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, 0xEBD9, 0xEBFE, 0x18E5,

+    0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, 0xECA7, 0xECA7, 0x1208,

+    0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, 0xECAB, 0xECAE, 0x1912,

+    0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, 0xECB2, 0xECB2, 0x105B,

+    0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, 0xECB6, 0xECB7, 0x1918,

+    0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, 0xECBA, 0xECBA, 0x1215,

+    0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, 0xECC2, 0xECC4, 0x1920,

+    0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, 0xECC7, 0xECC8, 0x1923,

+    0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, 0xECD5, 0xECD5, 0x121E,

+    0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, 0xECDF, 0xECE0, 0x1936,

+    0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, 0xECE4, 0xECE4, 0x1224,

+    0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, 0xECE9, 0xECF6, 0x193C,

+    0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, 0xECFA, 0xECFA, 0x122A,

+    0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, 0xEDA4, 0xEDED, 0x194F,

+    0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, 0xEEA1, 0xEEDA, 0x19A9,

+    0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, 0xEFA1, 0xEFFE, 0x1A06,

+    0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, 0xF2A1, 0xF2BC, 0x1B20,

+    0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, 0xF2FA, 0xF2FA, 0x168B,

+    0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, 0xF3B1, 0xF3B1, 0x105F,

+    0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, 0xF4A7, 0xF4A7, 0x1954,

+    0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, 0xF4EF, 0xF4FE, 0x1C25,

+    0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, 0xF6F4, 0xF6F4, 0x10B7,

+    0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, 0xF6F7, 0xF6FE, 0x1CE7,

+    0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, 0xF7B9, 0xF7C7, 0x1D06,

+    0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, 0xF7D3, 0xF7D3, 0x10F4,

+    0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, 0xF8DB, 0xF8DB, 0x1D94,

+    0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, 0xF8F1, 0xF8FE, 0x1D98,

+    0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, 0xFAA2, 0xFAA2, 0x0DE6,

+    0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, 0xFAE7, 0xFAFE, 0x1E47,

+    0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, 0xFCA9, 0xFCA9, 0x0EE7,

+    0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp
new file mode 100644
index 0000000..e75a6a3
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_KSC_EUC_V_0[16 * 3] = {

+    0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, 0x2080,

+    0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, 0xA1BD, 0x1F7F,

+    0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, 0xA3A8, 0xA3A9, 0x1F8D,

+    0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, 0x1F90, 0xA3BA, 0xA3BF, 0x1F91,

+    0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99,

+    0xA3FB, 0xA3FE, 0x1F9A,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp
new file mode 100644
index 0000000..d95bab8
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp
@@ -0,0 +1,233 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_KSCms_UHC_HW_H_1[675 * 3] = {

+    0x0020, 0x007E, 0x1F9E, 0x8141, 0x815A, 0x2475, 0x8161, 0x817A, 0x248F,

+    0x8181, 0x81FE, 0x24A9, 0x8241, 0x825A, 0x2527, 0x8261, 0x827A, 0x2541,

+    0x8281, 0x82FE, 0x255B, 0x8341, 0x835A, 0x25D9, 0x8361, 0x837A, 0x25F3,

+    0x8381, 0x83FE, 0x260D, 0x8441, 0x845A, 0x268B, 0x8461, 0x847A, 0x26A5,

+    0x8481, 0x84FE, 0x26BF, 0x8541, 0x855A, 0x273D, 0x8561, 0x857A, 0x2757,

+    0x8581, 0x85FE, 0x2771, 0x8641, 0x865A, 0x27EF, 0x8661, 0x867A, 0x2809,

+    0x8681, 0x86FE, 0x2823, 0x8741, 0x875A, 0x28A1, 0x8761, 0x877A, 0x28BB,

+    0x8781, 0x87FE, 0x28D5, 0x8841, 0x885A, 0x2953, 0x8861, 0x887A, 0x296D,

+    0x8881, 0x88FE, 0x2987, 0x8941, 0x895A, 0x2A05, 0x8961, 0x897A, 0x2A1F,

+    0x8981, 0x89FE, 0x2A39, 0x8A41, 0x8A5A, 0x2AB7, 0x8A61, 0x8A7A, 0x2AD1,

+    0x8A81, 0x8AFE, 0x2AEB, 0x8B41, 0x8B5A, 0x2B69, 0x8B61, 0x8B7A, 0x2B83,

+    0x8B81, 0x8BFE, 0x2B9D, 0x8C41, 0x8C5A, 0x2C1B, 0x8C61, 0x8C7A, 0x2C35,

+    0x8C81, 0x8CFE, 0x2C4F, 0x8D41, 0x8D5A, 0x2CCD, 0x8D61, 0x8D7A, 0x2CE7,

+    0x8D81, 0x8DFE, 0x2D01, 0x8E41, 0x8E5A, 0x2D7F, 0x8E61, 0x8E7A, 0x2D99,

+    0x8E81, 0x8EFE, 0x2DB3, 0x8F41, 0x8F5A, 0x2E31, 0x8F61, 0x8F7A, 0x2E4B,

+    0x8F81, 0x8FFE, 0x2E65, 0x9041, 0x905A, 0x2EE3, 0x9061, 0x907A, 0x2EFD,

+    0x9081, 0x90FE, 0x2F17, 0x9141, 0x915A, 0x2F95, 0x9161, 0x917A, 0x2FAF,

+    0x9181, 0x91FE, 0x2FC9, 0x9241, 0x925A, 0x3047, 0x9261, 0x927A, 0x3061,

+    0x9281, 0x92FE, 0x307B, 0x9341, 0x935A, 0x30F9, 0x9361, 0x937A, 0x3113,

+    0x9381, 0x93FE, 0x312D, 0x9441, 0x945A, 0x31AB, 0x9461, 0x947A, 0x31C5,

+    0x9481, 0x94FE, 0x31DF, 0x9541, 0x955A, 0x325D, 0x9561, 0x957A, 0x3277,

+    0x9581, 0x95FE, 0x3291, 0x9641, 0x965A, 0x330F, 0x9661, 0x967A, 0x3329,

+    0x9681, 0x96FE, 0x3343, 0x9741, 0x975A, 0x33C1, 0x9761, 0x977A, 0x33DB,

+    0x9781, 0x97FE, 0x33F5, 0x9841, 0x985A, 0x3473, 0x9861, 0x987A, 0x348D,

+    0x9881, 0x98FE, 0x34A7, 0x9941, 0x995A, 0x3525, 0x9961, 0x997A, 0x353F,

+    0x9981, 0x99FE, 0x3559, 0x9A41, 0x9A5A, 0x35D7, 0x9A61, 0x9A7A, 0x35F1,

+    0x9A81, 0x9AFE, 0x360B, 0x9B41, 0x9B5A, 0x3689, 0x9B61, 0x9B7A, 0x36A3,

+    0x9B81, 0x9BFE, 0x36BD, 0x9C41, 0x9C5A, 0x373B, 0x9C61, 0x9C7A, 0x3755,

+    0x9C81, 0x9CFE, 0x376F, 0x9D41, 0x9D5A, 0x37ED, 0x9D61, 0x9D7A, 0x3807,

+    0x9D81, 0x9DFE, 0x3821, 0x9E41, 0x9E5A, 0x389F, 0x9E61, 0x9E7A, 0x38B9,

+    0x9E81, 0x9EFE, 0x38D3, 0x9F41, 0x9F5A, 0x3951, 0x9F61, 0x9F7A, 0x396B,

+    0x9F81, 0x9FFE, 0x3985, 0xA041, 0xA05A, 0x3A03, 0xA061, 0xA07A, 0x3A1D,

+    0xA081, 0xA0FE, 0x3A37, 0xA141, 0xA15A, 0x3AB5, 0xA161, 0xA17A, 0x3ACF,

+    0xA181, 0xA1A0, 0x3AE9, 0xA1A1, 0xA1FE, 0x0065, 0xA241, 0xA25A, 0x3B09,

+    0xA261, 0xA27A, 0x3B23, 0xA281, 0xA2A0, 0x3B3D, 0xA2A1, 0xA2E5, 0x00C3,

+    0xA341, 0xA35A, 0x3B5D, 0xA361, 0xA37A, 0x3B77, 0xA381, 0xA3A0, 0x3B91,

+    0xA3A1, 0xA3FE, 0x0108, 0xA441, 0xA45A, 0x3BB1, 0xA461, 0xA47A, 0x3BCB,

+    0xA481, 0xA4A0, 0x3BE5, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,

+    0xA541, 0xA55A, 0x3C05, 0xA561, 0xA57A, 0x3C1F, 0xA581, 0xA5A0, 0x3C39,

+    0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,

+    0xA5E1, 0xA5F8, 0x01EF, 0xA641, 0xA65A, 0x3C59, 0xA661, 0xA67A, 0x3C73,

+    0xA681, 0xA6A0, 0x3C8D, 0xA6A1, 0xA6E4, 0x0207, 0xA741, 0xA75A, 0x3CAD,

+    0xA761, 0xA77A, 0x3CC7, 0xA781, 0xA7A0, 0x3CE1, 0xA7A1, 0xA7EF, 0x024B,

+    0xA841, 0xA85A, 0x3D01, 0xA861, 0xA87A, 0x3D1B, 0xA881, 0xA8A0, 0x3D35,

+    0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,

+    0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA95A, 0x3D55, 0xA961, 0xA97A, 0x3D6F,

+    0xA981, 0xA9A0, 0x3D89, 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA5A, 0x3DA9,

+    0xAA61, 0xAA7A, 0x3DC3, 0xAA81, 0xAAA0, 0x3DDD, 0xAAA1, 0xAAF3, 0x0353,

+    0xAB41, 0xAB5A, 0x3DFD, 0xAB61, 0xAB7A, 0x3E17, 0xAB81, 0xABA0, 0x3E31,

+    0xABA1, 0xABF6, 0x03A6, 0xAC41, 0xAC5A, 0x3E51, 0xAC61, 0xAC7A, 0x3E6B,

+    0xAC81, 0xACA0, 0x3E85, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,

+    0xAD41, 0xAD5A, 0x3EA5, 0xAD61, 0xAD7A, 0x3EBF, 0xAD81, 0xADA0, 0x3ED9,

+    0xAE41, 0xAE5A, 0x3EF9, 0xAE61, 0xAE7A, 0x3F13, 0xAE81, 0xAEA0, 0x3F2D,

+    0xAF41, 0xAF5A, 0x3F4D, 0xAF61, 0xAF7A, 0x3F67, 0xAF81, 0xAFA0, 0x3F81,

+    0xB041, 0xB05A, 0x3FA1, 0xB061, 0xB07A, 0x3FBB, 0xB081, 0xB0A0, 0x3FD5,

+    0xB0A1, 0xB0FE, 0x043E, 0xB141, 0xB15A, 0x3FF5, 0xB161, 0xB17A, 0x400F,

+    0xB181, 0xB1A0, 0x4029, 0xB1A1, 0xB1FE, 0x049C, 0xB241, 0xB25A, 0x4049,

+    0xB261, 0xB27A, 0x4063, 0xB281, 0xB2A0, 0x407D, 0xB2A1, 0xB2FE, 0x04FA,

+    0xB341, 0xB35A, 0x409D, 0xB361, 0xB37A, 0x40B7, 0xB381, 0xB3A0, 0x40D1,

+    0xB3A1, 0xB3FE, 0x0558, 0xB441, 0xB45A, 0x40F1, 0xB461, 0xB47A, 0x410B,

+    0xB481, 0xB4A0, 0x4125, 0xB4A1, 0xB4FE, 0x05B6, 0xB541, 0xB55A, 0x4145,

+    0xB561, 0xB57A, 0x415F, 0xB581, 0xB5A0, 0x4179, 0xB5A1, 0xB5FE, 0x0614,

+    0xB641, 0xB65A, 0x4199, 0xB661, 0xB67A, 0x41B3, 0xB681, 0xB6A0, 0x41CD,

+    0xB6A1, 0xB6FE, 0x0672, 0xB741, 0xB75A, 0x41ED, 0xB761, 0xB77A, 0x4207,

+    0xB781, 0xB7A0, 0x4221, 0xB7A1, 0xB7FE, 0x06D0, 0xB841, 0xB85A, 0x4241,

+    0xB861, 0xB87A, 0x425B, 0xB881, 0xB8A0, 0x4275, 0xB8A1, 0xB8FE, 0x072E,

+    0xB941, 0xB95A, 0x4295, 0xB961, 0xB97A, 0x42AF, 0xB981, 0xB9A0, 0x42C9,

+    0xB9A1, 0xB9FE, 0x078C, 0xBA41, 0xBA5A, 0x42E9, 0xBA61, 0xBA7A, 0x4303,

+    0xBA81, 0xBAA0, 0x431D, 0xBAA1, 0xBAFE, 0x07EA, 0xBB41, 0xBB5A, 0x433D,

+    0xBB61, 0xBB7A, 0x4357, 0xBB81, 0xBBA0, 0x4371, 0xBBA1, 0xBBFE, 0x0848,

+    0xBC41, 0xBC5A, 0x4391, 0xBC61, 0xBC7A, 0x43AB, 0xBC81, 0xBCA0, 0x43C5,

+    0xBCA1, 0xBCFE, 0x08A6, 0xBD41, 0xBD5A, 0x43E5, 0xBD61, 0xBD7A, 0x43FF,

+    0xBD81, 0xBDA0, 0x4419, 0xBDA1, 0xBDFE, 0x0904, 0xBE41, 0xBE5A, 0x4439,

+    0xBE61, 0xBE7A, 0x4453, 0xBE81, 0xBEA0, 0x446D, 0xBEA1, 0xBEFE, 0x0962,

+    0xBF41, 0xBF5A, 0x448D, 0xBF61, 0xBF7A, 0x44A7, 0xBF81, 0xBFA0, 0x44C1,

+    0xBFA1, 0xBFFE, 0x09C0, 0xC041, 0xC05A, 0x44E1, 0xC061, 0xC07A, 0x44FB,

+    0xC081, 0xC0A0, 0x4515, 0xC0A1, 0xC0FE, 0x0A1E, 0xC141, 0xC15A, 0x4535,

+    0xC161, 0xC17A, 0x454F, 0xC181, 0xC1A0, 0x4569, 0xC1A1, 0xC1FE, 0x0A7C,

+    0xC241, 0xC25A, 0x4589, 0xC261, 0xC27A, 0x45A3, 0xC281, 0xC2A0, 0x45BD,

+    0xC2A1, 0xC2FE, 0x0ADA, 0xC341, 0xC35A, 0x45DD, 0xC361, 0xC37A, 0x45F7,

+    0xC381, 0xC3A0, 0x4611, 0xC3A1, 0xC3FE, 0x0B38, 0xC441, 0xC45A, 0x4631,

+    0xC461, 0xC47A, 0x464B, 0xC481, 0xC4A0, 0x4665, 0xC4A1, 0xC4FE, 0x0B96,

+    0xC541, 0xC55A, 0x4685, 0xC561, 0xC57A, 0x469F, 0xC581, 0xC5A0, 0x46B9,

+    0xC5A1, 0xC5FE, 0x0BF4, 0xC641, 0xC652, 0x46D9, 0xC6A1, 0xC6FE, 0x0C52,

+    0xC7A1, 0xC7FE, 0x0CB0, 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C,

+    0xCBA1, 0xCBCF, 0x0DCA, 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9,

+    0xCBD6, 0xCBD6, 0x0E5E, 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D,

+    0xCBE8, 0xCBFE, 0x0E0E, 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83,

+    0xCDCF, 0xCDCF, 0x0D84, 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC,

+    0xCDE9, 0xCDFE, 0x0EC9, 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA,

+    0xCEAE, 0xCEFE, 0x0EEB, 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E,

+    0xCFFC, 0xCFFE, 0x0F96, 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A,

+    0xD0A3, 0xD0B7, 0x0F9A, 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF,

+    0xD0D0, 0xD0D0, 0x0E7C, 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023,

+    0xD0DE, 0xD0FE, 0x0FD2, 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116,

+    0xD1D5, 0xD1D5, 0x103C, 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117,

+    0xD1D9, 0xD1DA, 0x1028, 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A,

+    0xD1E2, 0xD1E2, 0x16A8, 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122,

+    0xD1E7, 0xD1E7, 0x102B, 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C,

+    0xD1ED, 0xD1ED, 0x1127, 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A,

+    0xD1F1, 0xD1F1, 0x102E, 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F,

+    0xD1F6, 0xD1F6, 0x112F, 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133,

+    0xD1FB, 0xD1FB, 0x1035, 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139,

+    0xD2A1, 0xD2A1, 0x1036, 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037,

+    0xD2A7, 0xD2AA, 0x113C, 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A,

+    0xD2AD, 0xD2AD, 0x1144, 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148,

+    0xD2B3, 0xD2BD, 0x103F, 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A,

+    0xD2C2, 0xD2C3, 0x11A1, 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D,

+    0xD2C6, 0xD2CA, 0x11A6, 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E,

+    0xD2CD, 0xD2CE, 0x11AD, 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7,

+    0xD2D8, 0xD2D8, 0x104F, 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050,

+    0xD2DE, 0xD2DF, 0x11C1, 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3,

+    0xD2E2, 0xD2E2, 0x11C6, 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4,

+    0xD2E5, 0xD2E8, 0x11D6, 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0,

+    0xD2EC, 0xD2EF, 0x1055, 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201,

+    0xD2F6, 0xD2F6, 0x1059, 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A,

+    0xD3A1, 0xD3FE, 0x1060, 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE,

+    0xD4E7, 0xD4FB, 0x1103, 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118,

+    0xD5A1, 0xD5A4, 0x111A, 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E,

+    0xD5AB, 0xD5AB, 0x102B, 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060,

+    0xD5AF, 0xD5FE, 0x1125, 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047,

+    0xD6B9, 0xD6CC, 0x118C, 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0,

+    0xD7A1, 0xD7CA, 0x11D1, 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB,

+    0xD7E4, 0xD7E4, 0x1918, 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D,

+    0xD9A1, 0xD9FE, 0x128B, 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347,

+    0xDBC5, 0xDBC5, 0x141F, 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A,

+    0xDBE5, 0xDBFE, 0x1389, 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E,

+    0xDCA6, 0xDCFE, 0x13A7, 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7,

+    0xDDA6, 0xDDD4, 0x1404, 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433,

+    0xDDF4, 0xDDF4, 0x1DB7, 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B,

+    0xDEFC, 0xDEFC, 0x15D0, 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7,

+    0xDFA1, 0xDFB2, 0x14B7, 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9,

+    0xDFE1, 0xDFE1, 0x14F2, 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D,

+    0xDFE9, 0xDFFE, 0x14FC, 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771,

+    0xE0F2, 0xE0FE, 0x1562, 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554,

+    0xE1AE, 0xE1EC, 0x157B, 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA,

+    0xE2A1, 0xE2FE, 0x15CB, 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61,

+    0xE3F6, 0xE3FE, 0x167D, 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686,

+    0xE4A9, 0xE4A9, 0x162E, 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2,

+    0xE5AE, 0xE5AE, 0x16F2, 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149,

+    0xE5B3, 0xE5B8, 0x16F1, 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7,

+    0xE5BB, 0xE5BC, 0x114D, 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F,

+    0xE5C5, 0xE5CD, 0x16FF, 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708,

+    0xE5D0, 0xE5D0, 0x1154, 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155,

+    0xE5D3, 0xE5D5, 0x170A, 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D,

+    0xE5FA, 0xE5FB, 0x115A, 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730,

+    0xE5FE, 0xE5FE, 0x115C, 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731,

+    0xE6A4, 0xE6A4, 0x1161, 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162,

+    0xE6A8, 0xE6AC, 0x1735, 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A,

+    0xE6AF, 0xE6B1, 0x1167, 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A,

+    0xE6B4, 0xE6B6, 0x173C, 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F,

+    0xE6BC, 0xE6BC, 0x116F, 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040,

+    0xE6C5, 0xE6C5, 0x1749, 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A,

+    0xE6CA, 0xE6CA, 0x1041, 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174,

+    0xE6D3, 0xE6D5, 0x1753, 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756,

+    0xE6D9, 0xE6D9, 0x1176, 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042,

+    0xE6DD, 0xE6DE, 0x175A, 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C,

+    0xE6E1, 0xE6E1, 0x1178, 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A,

+    0xE6E5, 0xE6E5, 0x1179, 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F,

+    0xE6E8, 0xE6E8, 0x117C, 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E,

+    0xE6EC, 0xE6EC, 0x192F, 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181,

+    0xE6F0, 0xE6F0, 0x1763, 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554,

+    0xE6F3, 0xE6F4, 0x1764, 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043,

+    0xE6F7, 0xE6F7, 0x1046, 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185,

+    0xE6FA, 0xE6FE, 0x1767, 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C,

+    0xE7A6, 0xE7A6, 0x1188, 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189,

+    0xE7AA, 0xE7AA, 0x118B, 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047,

+    0xE7AD, 0xE7AD, 0x118D, 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E,

+    0xE7B1, 0xE7BE, 0x1775, 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783,

+    0xE7C1, 0xE7C1, 0x1E67, 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191,

+    0xE7C7, 0xE7C7, 0x1193, 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195,

+    0xE7CC, 0xE7CC, 0x178B, 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C,

+    0xE7CF, 0xE7D0, 0x1197, 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A,

+    0xE7D4, 0xE7DE, 0x178F, 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A,

+    0xE7E4, 0xE7E4, 0x119D, 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E,

+    0xE7E7, 0xE7F6, 0x179F, 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF,

+    0xE8A1, 0xE8E6, 0x17B6, 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC,

+    0xE8F0, 0xE8F0, 0x11C9, 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803,

+    0xE8F7, 0xE8F7, 0x11CB, 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8,

+    0xE8FA, 0xE8FA, 0x1809, 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A,

+    0xE8FE, 0xE8FE, 0x11CD, 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0,

+    0xE9A8, 0xE9AB, 0x1812, 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816,

+    0xE9CC, 0xE9CC, 0x11D3, 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34,

+    0xE9F8, 0xE9FE, 0x185F, 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB,

+    0xEAC2, 0xEAE4, 0x1886, 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9,

+    0xEAF4, 0xEAF4, 0x1057, 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3,

+    0xEAF8, 0xEAFB, 0x18B9, 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD,

+    0xEAFE, 0xEAFE, 0x11E6, 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8,

+    0xEBA5, 0xEBA6, 0x18C1, 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3,

+    0xEBA9, 0xEBA9, 0x11EC, 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4,

+    0xEBBA, 0xEBBB, 0x11EE, 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0,

+    0xEBBE, 0xEBC0, 0x18D4, 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3,

+    0xEBC3, 0xEBC5, 0x18D7, 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA,

+    0xEBCC, 0xEBCC, 0x11F7, 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8,

+    0xEBD2, 0xEBD2, 0x15B0, 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB,

+    0xEBD9, 0xEBFE, 0x18E5, 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206,

+    0xECA7, 0xECA7, 0x1208, 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A,

+    0xECAB, 0xECAE, 0x1912, 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C,

+    0xECB2, 0xECB2, 0x105B, 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211,

+    0xECB6, 0xECB7, 0x1918, 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A,

+    0xECBA, 0xECBA, 0x1215, 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218,

+    0xECC2, 0xECC4, 0x1920, 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C,

+    0xECC7, 0xECC8, 0x1923, 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925,

+    0xECD5, 0xECD5, 0x121E, 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220,

+    0xECDF, 0xECE0, 0x1936, 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938,

+    0xECE4, 0xECE4, 0x1224, 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225,

+    0xECE9, 0xECF6, 0x193C, 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A,

+    0xECFA, 0xECFA, 0x122A, 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D,

+    0xEDA4, 0xEDED, 0x194F, 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999,

+    0xEEA1, 0xEEDA, 0x19A9, 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3,

+    0xEFA1, 0xEFFE, 0x1A06, 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2,

+    0xF2A1, 0xF2BC, 0x1B20, 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C,

+    0xF2FA, 0xF2FA, 0x168B, 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C,

+    0xF3B1, 0xF3B1, 0x105F, 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9,

+    0xF4A7, 0xF4A7, 0x1954, 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C,

+    0xF4EF, 0xF4FE, 0x1C25, 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93,

+    0xF6F4, 0xF6F4, 0x10B7, 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3,

+    0xF6F7, 0xF6FE, 0x1CE7, 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097,

+    0xF7B9, 0xF7C7, 0x1D06, 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15,

+    0xF7D3, 0xF7D3, 0x10F4, 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A,

+    0xF8DB, 0xF8DB, 0x1D94, 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0,

+    0xF8F1, 0xF8FE, 0x1D98, 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D,

+    0xFAA2, 0xFAA2, 0x0DE6, 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C,

+    0xFAE7, 0xFAFE, 0x1E47, 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD,

+    0xFCA9, 0xFCA9, 0x0EE7, 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-V_1.cpp
new file mode 100644
index 0000000..0730561
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-V_1.cpp
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSCms_UHC_HW_V_1[16 * 3] = {
+    0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, 0x2080,
+    0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, 0xA1BD, 0x1F7F,
+    0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, 0xA3A8, 0xA3A9, 0x1F8D,
+    0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, 0x1F90, 0xA3BA, 0xA3BF, 0x1F91,
+    0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99,
+    0xA3FB, 0xA3FE, 0x1F9A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp
new file mode 100644
index 0000000..6464f2f
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp
@@ -0,0 +1,233 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_KSCms_UHC_H_1[675 * 3] = {

+    0x0020, 0x007E, 0x0001, 0x8141, 0x815A, 0x2475, 0x8161, 0x817A, 0x248F,

+    0x8181, 0x81FE, 0x24A9, 0x8241, 0x825A, 0x2527, 0x8261, 0x827A, 0x2541,

+    0x8281, 0x82FE, 0x255B, 0x8341, 0x835A, 0x25D9, 0x8361, 0x837A, 0x25F3,

+    0x8381, 0x83FE, 0x260D, 0x8441, 0x845A, 0x268B, 0x8461, 0x847A, 0x26A5,

+    0x8481, 0x84FE, 0x26BF, 0x8541, 0x855A, 0x273D, 0x8561, 0x857A, 0x2757,

+    0x8581, 0x85FE, 0x2771, 0x8641, 0x865A, 0x27EF, 0x8661, 0x867A, 0x2809,

+    0x8681, 0x86FE, 0x2823, 0x8741, 0x875A, 0x28A1, 0x8761, 0x877A, 0x28BB,

+    0x8781, 0x87FE, 0x28D5, 0x8841, 0x885A, 0x2953, 0x8861, 0x887A, 0x296D,

+    0x8881, 0x88FE, 0x2987, 0x8941, 0x895A, 0x2A05, 0x8961, 0x897A, 0x2A1F,

+    0x8981, 0x89FE, 0x2A39, 0x8A41, 0x8A5A, 0x2AB7, 0x8A61, 0x8A7A, 0x2AD1,

+    0x8A81, 0x8AFE, 0x2AEB, 0x8B41, 0x8B5A, 0x2B69, 0x8B61, 0x8B7A, 0x2B83,

+    0x8B81, 0x8BFE, 0x2B9D, 0x8C41, 0x8C5A, 0x2C1B, 0x8C61, 0x8C7A, 0x2C35,

+    0x8C81, 0x8CFE, 0x2C4F, 0x8D41, 0x8D5A, 0x2CCD, 0x8D61, 0x8D7A, 0x2CE7,

+    0x8D81, 0x8DFE, 0x2D01, 0x8E41, 0x8E5A, 0x2D7F, 0x8E61, 0x8E7A, 0x2D99,

+    0x8E81, 0x8EFE, 0x2DB3, 0x8F41, 0x8F5A, 0x2E31, 0x8F61, 0x8F7A, 0x2E4B,

+    0x8F81, 0x8FFE, 0x2E65, 0x9041, 0x905A, 0x2EE3, 0x9061, 0x907A, 0x2EFD,

+    0x9081, 0x90FE, 0x2F17, 0x9141, 0x915A, 0x2F95, 0x9161, 0x917A, 0x2FAF,

+    0x9181, 0x91FE, 0x2FC9, 0x9241, 0x925A, 0x3047, 0x9261, 0x927A, 0x3061,

+    0x9281, 0x92FE, 0x307B, 0x9341, 0x935A, 0x30F9, 0x9361, 0x937A, 0x3113,

+    0x9381, 0x93FE, 0x312D, 0x9441, 0x945A, 0x31AB, 0x9461, 0x947A, 0x31C5,

+    0x9481, 0x94FE, 0x31DF, 0x9541, 0x955A, 0x325D, 0x9561, 0x957A, 0x3277,

+    0x9581, 0x95FE, 0x3291, 0x9641, 0x965A, 0x330F, 0x9661, 0x967A, 0x3329,

+    0x9681, 0x96FE, 0x3343, 0x9741, 0x975A, 0x33C1, 0x9761, 0x977A, 0x33DB,

+    0x9781, 0x97FE, 0x33F5, 0x9841, 0x985A, 0x3473, 0x9861, 0x987A, 0x348D,

+    0x9881, 0x98FE, 0x34A7, 0x9941, 0x995A, 0x3525, 0x9961, 0x997A, 0x353F,

+    0x9981, 0x99FE, 0x3559, 0x9A41, 0x9A5A, 0x35D7, 0x9A61, 0x9A7A, 0x35F1,

+    0x9A81, 0x9AFE, 0x360B, 0x9B41, 0x9B5A, 0x3689, 0x9B61, 0x9B7A, 0x36A3,

+    0x9B81, 0x9BFE, 0x36BD, 0x9C41, 0x9C5A, 0x373B, 0x9C61, 0x9C7A, 0x3755,

+    0x9C81, 0x9CFE, 0x376F, 0x9D41, 0x9D5A, 0x37ED, 0x9D61, 0x9D7A, 0x3807,

+    0x9D81, 0x9DFE, 0x3821, 0x9E41, 0x9E5A, 0x389F, 0x9E61, 0x9E7A, 0x38B9,

+    0x9E81, 0x9EFE, 0x38D3, 0x9F41, 0x9F5A, 0x3951, 0x9F61, 0x9F7A, 0x396B,

+    0x9F81, 0x9FFE, 0x3985, 0xA041, 0xA05A, 0x3A03, 0xA061, 0xA07A, 0x3A1D,

+    0xA081, 0xA0FE, 0x3A37, 0xA141, 0xA15A, 0x3AB5, 0xA161, 0xA17A, 0x3ACF,

+    0xA181, 0xA1A0, 0x3AE9, 0xA1A1, 0xA1FE, 0x0065, 0xA241, 0xA25A, 0x3B09,

+    0xA261, 0xA27A, 0x3B23, 0xA281, 0xA2A0, 0x3B3D, 0xA2A1, 0xA2E5, 0x00C3,

+    0xA341, 0xA35A, 0x3B5D, 0xA361, 0xA37A, 0x3B77, 0xA381, 0xA3A0, 0x3B91,

+    0xA3A1, 0xA3FE, 0x0108, 0xA441, 0xA45A, 0x3BB1, 0xA461, 0xA47A, 0x3BCB,

+    0xA481, 0xA4A0, 0x3BE5, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,

+    0xA541, 0xA55A, 0x3C05, 0xA561, 0xA57A, 0x3C1F, 0xA581, 0xA5A0, 0x3C39,

+    0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,

+    0xA5E1, 0xA5F8, 0x01EF, 0xA641, 0xA65A, 0x3C59, 0xA661, 0xA67A, 0x3C73,

+    0xA681, 0xA6A0, 0x3C8D, 0xA6A1, 0xA6E4, 0x0207, 0xA741, 0xA75A, 0x3CAD,

+    0xA761, 0xA77A, 0x3CC7, 0xA781, 0xA7A0, 0x3CE1, 0xA7A1, 0xA7EF, 0x024B,

+    0xA841, 0xA85A, 0x3D01, 0xA861, 0xA87A, 0x3D1B, 0xA881, 0xA8A0, 0x3D35,

+    0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,

+    0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA95A, 0x3D55, 0xA961, 0xA97A, 0x3D6F,

+    0xA981, 0xA9A0, 0x3D89, 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA5A, 0x3DA9,

+    0xAA61, 0xAA7A, 0x3DC3, 0xAA81, 0xAAA0, 0x3DDD, 0xAAA1, 0xAAF3, 0x0353,

+    0xAB41, 0xAB5A, 0x3DFD, 0xAB61, 0xAB7A, 0x3E17, 0xAB81, 0xABA0, 0x3E31,

+    0xABA1, 0xABF6, 0x03A6, 0xAC41, 0xAC5A, 0x3E51, 0xAC61, 0xAC7A, 0x3E6B,

+    0xAC81, 0xACA0, 0x3E85, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,

+    0xAD41, 0xAD5A, 0x3EA5, 0xAD61, 0xAD7A, 0x3EBF, 0xAD81, 0xADA0, 0x3ED9,

+    0xAE41, 0xAE5A, 0x3EF9, 0xAE61, 0xAE7A, 0x3F13, 0xAE81, 0xAEA0, 0x3F2D,

+    0xAF41, 0xAF5A, 0x3F4D, 0xAF61, 0xAF7A, 0x3F67, 0xAF81, 0xAFA0, 0x3F81,

+    0xB041, 0xB05A, 0x3FA1, 0xB061, 0xB07A, 0x3FBB, 0xB081, 0xB0A0, 0x3FD5,

+    0xB0A1, 0xB0FE, 0x043E, 0xB141, 0xB15A, 0x3FF5, 0xB161, 0xB17A, 0x400F,

+    0xB181, 0xB1A0, 0x4029, 0xB1A1, 0xB1FE, 0x049C, 0xB241, 0xB25A, 0x4049,

+    0xB261, 0xB27A, 0x4063, 0xB281, 0xB2A0, 0x407D, 0xB2A1, 0xB2FE, 0x04FA,

+    0xB341, 0xB35A, 0x409D, 0xB361, 0xB37A, 0x40B7, 0xB381, 0xB3A0, 0x40D1,

+    0xB3A1, 0xB3FE, 0x0558, 0xB441, 0xB45A, 0x40F1, 0xB461, 0xB47A, 0x410B,

+    0xB481, 0xB4A0, 0x4125, 0xB4A1, 0xB4FE, 0x05B6, 0xB541, 0xB55A, 0x4145,

+    0xB561, 0xB57A, 0x415F, 0xB581, 0xB5A0, 0x4179, 0xB5A1, 0xB5FE, 0x0614,

+    0xB641, 0xB65A, 0x4199, 0xB661, 0xB67A, 0x41B3, 0xB681, 0xB6A0, 0x41CD,

+    0xB6A1, 0xB6FE, 0x0672, 0xB741, 0xB75A, 0x41ED, 0xB761, 0xB77A, 0x4207,

+    0xB781, 0xB7A0, 0x4221, 0xB7A1, 0xB7FE, 0x06D0, 0xB841, 0xB85A, 0x4241,

+    0xB861, 0xB87A, 0x425B, 0xB881, 0xB8A0, 0x4275, 0xB8A1, 0xB8FE, 0x072E,

+    0xB941, 0xB95A, 0x4295, 0xB961, 0xB97A, 0x42AF, 0xB981, 0xB9A0, 0x42C9,

+    0xB9A1, 0xB9FE, 0x078C, 0xBA41, 0xBA5A, 0x42E9, 0xBA61, 0xBA7A, 0x4303,

+    0xBA81, 0xBAA0, 0x431D, 0xBAA1, 0xBAFE, 0x07EA, 0xBB41, 0xBB5A, 0x433D,

+    0xBB61, 0xBB7A, 0x4357, 0xBB81, 0xBBA0, 0x4371, 0xBBA1, 0xBBFE, 0x0848,

+    0xBC41, 0xBC5A, 0x4391, 0xBC61, 0xBC7A, 0x43AB, 0xBC81, 0xBCA0, 0x43C5,

+    0xBCA1, 0xBCFE, 0x08A6, 0xBD41, 0xBD5A, 0x43E5, 0xBD61, 0xBD7A, 0x43FF,

+    0xBD81, 0xBDA0, 0x4419, 0xBDA1, 0xBDFE, 0x0904, 0xBE41, 0xBE5A, 0x4439,

+    0xBE61, 0xBE7A, 0x4453, 0xBE81, 0xBEA0, 0x446D, 0xBEA1, 0xBEFE, 0x0962,

+    0xBF41, 0xBF5A, 0x448D, 0xBF61, 0xBF7A, 0x44A7, 0xBF81, 0xBFA0, 0x44C1,

+    0xBFA1, 0xBFFE, 0x09C0, 0xC041, 0xC05A, 0x44E1, 0xC061, 0xC07A, 0x44FB,

+    0xC081, 0xC0A0, 0x4515, 0xC0A1, 0xC0FE, 0x0A1E, 0xC141, 0xC15A, 0x4535,

+    0xC161, 0xC17A, 0x454F, 0xC181, 0xC1A0, 0x4569, 0xC1A1, 0xC1FE, 0x0A7C,

+    0xC241, 0xC25A, 0x4589, 0xC261, 0xC27A, 0x45A3, 0xC281, 0xC2A0, 0x45BD,

+    0xC2A1, 0xC2FE, 0x0ADA, 0xC341, 0xC35A, 0x45DD, 0xC361, 0xC37A, 0x45F7,

+    0xC381, 0xC3A0, 0x4611, 0xC3A1, 0xC3FE, 0x0B38, 0xC441, 0xC45A, 0x4631,

+    0xC461, 0xC47A, 0x464B, 0xC481, 0xC4A0, 0x4665, 0xC4A1, 0xC4FE, 0x0B96,

+    0xC541, 0xC55A, 0x4685, 0xC561, 0xC57A, 0x469F, 0xC581, 0xC5A0, 0x46B9,

+    0xC5A1, 0xC5FE, 0x0BF4, 0xC641, 0xC652, 0x46D9, 0xC6A1, 0xC6FE, 0x0C52,

+    0xC7A1, 0xC7FE, 0x0CB0, 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C,

+    0xCBA1, 0xCBCF, 0x0DCA, 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9,

+    0xCBD6, 0xCBD6, 0x0E5E, 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D,

+    0xCBE8, 0xCBFE, 0x0E0E, 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83,

+    0xCDCF, 0xCDCF, 0x0D84, 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC,

+    0xCDE9, 0xCDFE, 0x0EC9, 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA,

+    0xCEAE, 0xCEFE, 0x0EEB, 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E,

+    0xCFFC, 0xCFFE, 0x0F96, 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A,

+    0xD0A3, 0xD0B7, 0x0F9A, 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF,

+    0xD0D0, 0xD0D0, 0x0E7C, 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023,

+    0xD0DE, 0xD0FE, 0x0FD2, 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116,

+    0xD1D5, 0xD1D5, 0x103C, 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117,

+    0xD1D9, 0xD1DA, 0x1028, 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A,

+    0xD1E2, 0xD1E2, 0x16A8, 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122,

+    0xD1E7, 0xD1E7, 0x102B, 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C,

+    0xD1ED, 0xD1ED, 0x1127, 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A,

+    0xD1F1, 0xD1F1, 0x102E, 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F,

+    0xD1F6, 0xD1F6, 0x112F, 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133,

+    0xD1FB, 0xD1FB, 0x1035, 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139,

+    0xD2A1, 0xD2A1, 0x1036, 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037,

+    0xD2A7, 0xD2AA, 0x113C, 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A,

+    0xD2AD, 0xD2AD, 0x1144, 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148,

+    0xD2B3, 0xD2BD, 0x103F, 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A,

+    0xD2C2, 0xD2C3, 0x11A1, 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D,

+    0xD2C6, 0xD2CA, 0x11A6, 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E,

+    0xD2CD, 0xD2CE, 0x11AD, 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7,

+    0xD2D8, 0xD2D8, 0x104F, 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050,

+    0xD2DE, 0xD2DF, 0x11C1, 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3,

+    0xD2E2, 0xD2E2, 0x11C6, 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4,

+    0xD2E5, 0xD2E8, 0x11D6, 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0,

+    0xD2EC, 0xD2EF, 0x1055, 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201,

+    0xD2F6, 0xD2F6, 0x1059, 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A,

+    0xD3A1, 0xD3FE, 0x1060, 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE,

+    0xD4E7, 0xD4FB, 0x1103, 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118,

+    0xD5A1, 0xD5A4, 0x111A, 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E,

+    0xD5AB, 0xD5AB, 0x102B, 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060,

+    0xD5AF, 0xD5FE, 0x1125, 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047,

+    0xD6B9, 0xD6CC, 0x118C, 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0,

+    0xD7A1, 0xD7CA, 0x11D1, 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB,

+    0xD7E4, 0xD7E4, 0x1918, 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D,

+    0xD9A1, 0xD9FE, 0x128B, 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347,

+    0xDBC5, 0xDBC5, 0x141F, 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A,

+    0xDBE5, 0xDBFE, 0x1389, 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E,

+    0xDCA6, 0xDCFE, 0x13A7, 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7,

+    0xDDA6, 0xDDD4, 0x1404, 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433,

+    0xDDF4, 0xDDF4, 0x1DB7, 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B,

+    0xDEFC, 0xDEFC, 0x15D0, 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7,

+    0xDFA1, 0xDFB2, 0x14B7, 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9,

+    0xDFE1, 0xDFE1, 0x14F2, 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D,

+    0xDFE9, 0xDFFE, 0x14FC, 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771,

+    0xE0F2, 0xE0FE, 0x1562, 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554,

+    0xE1AE, 0xE1EC, 0x157B, 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA,

+    0xE2A1, 0xE2FE, 0x15CB, 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61,

+    0xE3F6, 0xE3FE, 0x167D, 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686,

+    0xE4A9, 0xE4A9, 0x162E, 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2,

+    0xE5AE, 0xE5AE, 0x16F2, 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149,

+    0xE5B3, 0xE5B8, 0x16F1, 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7,

+    0xE5BB, 0xE5BC, 0x114D, 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F,

+    0xE5C5, 0xE5CD, 0x16FF, 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708,

+    0xE5D0, 0xE5D0, 0x1154, 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155,

+    0xE5D3, 0xE5D5, 0x170A, 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D,

+    0xE5FA, 0xE5FB, 0x115A, 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730,

+    0xE5FE, 0xE5FE, 0x115C, 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731,

+    0xE6A4, 0xE6A4, 0x1161, 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162,

+    0xE6A8, 0xE6AC, 0x1735, 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A,

+    0xE6AF, 0xE6B1, 0x1167, 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A,

+    0xE6B4, 0xE6B6, 0x173C, 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F,

+    0xE6BC, 0xE6BC, 0x116F, 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040,

+    0xE6C5, 0xE6C5, 0x1749, 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A,

+    0xE6CA, 0xE6CA, 0x1041, 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174,

+    0xE6D3, 0xE6D5, 0x1753, 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756,

+    0xE6D9, 0xE6D9, 0x1176, 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042,

+    0xE6DD, 0xE6DE, 0x175A, 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C,

+    0xE6E1, 0xE6E1, 0x1178, 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A,

+    0xE6E5, 0xE6E5, 0x1179, 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F,

+    0xE6E8, 0xE6E8, 0x117C, 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E,

+    0xE6EC, 0xE6EC, 0x192F, 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181,

+    0xE6F0, 0xE6F0, 0x1763, 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554,

+    0xE6F3, 0xE6F4, 0x1764, 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043,

+    0xE6F7, 0xE6F7, 0x1046, 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185,

+    0xE6FA, 0xE6FE, 0x1767, 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C,

+    0xE7A6, 0xE7A6, 0x1188, 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189,

+    0xE7AA, 0xE7AA, 0x118B, 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047,

+    0xE7AD, 0xE7AD, 0x118D, 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E,

+    0xE7B1, 0xE7BE, 0x1775, 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783,

+    0xE7C1, 0xE7C1, 0x1E67, 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191,

+    0xE7C7, 0xE7C7, 0x1193, 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195,

+    0xE7CC, 0xE7CC, 0x178B, 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C,

+    0xE7CF, 0xE7D0, 0x1197, 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A,

+    0xE7D4, 0xE7DE, 0x178F, 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A,

+    0xE7E4, 0xE7E4, 0x119D, 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E,

+    0xE7E7, 0xE7F6, 0x179F, 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF,

+    0xE8A1, 0xE8E6, 0x17B6, 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC,

+    0xE8F0, 0xE8F0, 0x11C9, 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803,

+    0xE8F7, 0xE8F7, 0x11CB, 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8,

+    0xE8FA, 0xE8FA, 0x1809, 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A,

+    0xE8FE, 0xE8FE, 0x11CD, 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0,

+    0xE9A8, 0xE9AB, 0x1812, 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816,

+    0xE9CC, 0xE9CC, 0x11D3, 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34,

+    0xE9F8, 0xE9FE, 0x185F, 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB,

+    0xEAC2, 0xEAE4, 0x1886, 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9,

+    0xEAF4, 0xEAF4, 0x1057, 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3,

+    0xEAF8, 0xEAFB, 0x18B9, 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD,

+    0xEAFE, 0xEAFE, 0x11E6, 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8,

+    0xEBA5, 0xEBA6, 0x18C1, 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3,

+    0xEBA9, 0xEBA9, 0x11EC, 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4,

+    0xEBBA, 0xEBBB, 0x11EE, 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0,

+    0xEBBE, 0xEBC0, 0x18D4, 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3,

+    0xEBC3, 0xEBC5, 0x18D7, 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA,

+    0xEBCC, 0xEBCC, 0x11F7, 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8,

+    0xEBD2, 0xEBD2, 0x15B0, 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB,

+    0xEBD9, 0xEBFE, 0x18E5, 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206,

+    0xECA7, 0xECA7, 0x1208, 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A,

+    0xECAB, 0xECAE, 0x1912, 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C,

+    0xECB2, 0xECB2, 0x105B, 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211,

+    0xECB6, 0xECB7, 0x1918, 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A,

+    0xECBA, 0xECBA, 0x1215, 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218,

+    0xECC2, 0xECC4, 0x1920, 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C,

+    0xECC7, 0xECC8, 0x1923, 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925,

+    0xECD5, 0xECD5, 0x121E, 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220,

+    0xECDF, 0xECE0, 0x1936, 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938,

+    0xECE4, 0xECE4, 0x1224, 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225,

+    0xECE9, 0xECF6, 0x193C, 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A,

+    0xECFA, 0xECFA, 0x122A, 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D,

+    0xEDA4, 0xEDED, 0x194F, 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999,

+    0xEEA1, 0xEEDA, 0x19A9, 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3,

+    0xEFA1, 0xEFFE, 0x1A06, 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2,

+    0xF2A1, 0xF2BC, 0x1B20, 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C,

+    0xF2FA, 0xF2FA, 0x168B, 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C,

+    0xF3B1, 0xF3B1, 0x105F, 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9,

+    0xF4A7, 0xF4A7, 0x1954, 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C,

+    0xF4EF, 0xF4FE, 0x1C25, 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93,

+    0xF6F4, 0xF6F4, 0x10B7, 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3,

+    0xF6F7, 0xF6FE, 0x1CE7, 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097,

+    0xF7B9, 0xF7C7, 0x1D06, 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15,

+    0xF7D3, 0xF7D3, 0x10F4, 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A,

+    0xF8DB, 0xF8DB, 0x1D94, 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0,

+    0xF8F1, 0xF8FE, 0x1D98, 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D,

+    0xFAA2, 0xFAA2, 0x0DE6, 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C,

+    0xFAE7, 0xFAFE, 0x1E47, 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD,

+    0xFCA9, 0xFCA9, 0x0EE7, 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-V_1.cpp
new file mode 100644
index 0000000..70f1d45
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-V_1.cpp
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSCms_UHC_V_1[16 * 3] = {
+    0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, 0x2080,
+    0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, 0xA1BD, 0x1F7F,
+    0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, 0xA3A8, 0xA3A9, 0x1F8D,
+    0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, 0x1F90, 0xA3BA, 0xA3BF, 0x1F91,
+    0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99,
+    0xA3FB, 0xA3FE, 0x1F9A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp
new file mode 100644
index 0000000..b062fc6
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp
@@ -0,0 +1,178 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_KSCpc_EUC_H_0[509 * 3] = {

+    0x0020, 0x007E, 0x0001, 0x0081, 0x0083, 0x0060, 0x00FE, 0x00FF, 0x0063,

+    0xA141, 0xA17D, 0x1FFF, 0xA181, 0xA19A, 0x203C, 0xA19C, 0xA1A0, 0x2056,

+    0xA1A1, 0xA1A1, 0x0065, 0xA1A2, 0xA1A3, 0x205B, 0xA1A4, 0xA1FE, 0x0068,

+    0xA241, 0xA24C, 0x205D, 0xA2A1, 0xA2E5, 0x00C3, 0xA2E6, 0xA2FE, 0x2069,

+    0xA341, 0xA37D, 0x2082, 0xA381, 0xA39F, 0x20BF, 0xA3A1, 0xA3FE, 0x0108,

+    0xA441, 0xA47D, 0x20DE, 0xA481, 0xA49F, 0x211B, 0xA4A1, 0xA4D3, 0x0166,

+    0xA4D5, 0xA4FE, 0x0199, 0xA541, 0xA57D, 0x213A, 0xA581, 0xA58B, 0x2177,

+    0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,

+    0xA5DA, 0xA5DE, 0x2182, 0xA5E1, 0xA5F8, 0x01EF, 0xA5F9, 0xA5FC, 0x2187,

+    0xA641, 0xA67D, 0x218B, 0xA681, 0xA68A, 0x21C8, 0xA68D, 0xA693, 0x21D2,

+    0xA696, 0xA69B, 0x21D9, 0xA69E, 0xA69F, 0x21DF, 0xA6A1, 0xA6E4, 0x0207,

+    0xA6E5, 0xA6FE, 0x21E1, 0xA741, 0xA77D, 0x21FB, 0xA781, 0xA79F, 0x2238,

+    0xA7A1, 0xA7EF, 0x024B, 0xA7F0, 0xA7FE, 0x2257, 0xA841, 0xA87D, 0x2266,

+    0xA881, 0xA89F, 0x22A3, 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E,

+    0xA8A8, 0xA8AF, 0x029F, 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA974, 0x22C2,

+    0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA7D, 0x22F6, 0xAA81, 0xAA9F, 0x2333,

+    0xAAA1, 0xAAF3, 0x0353, 0xAAF4, 0xAAFE, 0x2352, 0xAB41, 0xAB7D, 0x235D,

+    0xAB81, 0xAB9F, 0x239A, 0xABA1, 0xABF6, 0x03A6, 0xABF7, 0xABFA, 0x23B9,

+    0xABFB, 0xABFD, 0x2472, 0xAC41, 0xAC7D, 0x23BD, 0xAC81, 0xAC97, 0x23FA,

+    0xACA1, 0xACC1, 0x03FC, 0xACC2, 0xACD0, 0x2411, 0xACD1, 0xACF1, 0x041D,

+    0xACF2, 0xACF6, 0x2420, 0xAD41, 0xAD7D, 0x2425, 0xADA1, 0xADB0, 0x2462,

+    0xB0A1, 0xB0FE, 0x043E, 0xB1A1, 0xB1FE, 0x049C, 0xB2A1, 0xB2FE, 0x04FA,

+    0xB3A1, 0xB3FE, 0x0558, 0xB4A1, 0xB4FE, 0x05B6, 0xB5A1, 0xB5FE, 0x0614,

+    0xB6A1, 0xB6FE, 0x0672, 0xB7A1, 0xB7FE, 0x06D0, 0xB8A1, 0xB8FE, 0x072E,

+    0xB9A1, 0xB9FE, 0x078C, 0xBAA1, 0xBAFE, 0x07EA, 0xBBA1, 0xBBFE, 0x0848,

+    0xBCA1, 0xBCFE, 0x08A6, 0xBDA1, 0xBDFE, 0x0904, 0xBEA1, 0xBEFE, 0x0962,

+    0xBFA1, 0xBFFE, 0x09C0, 0xC0A1, 0xC0FE, 0x0A1E, 0xC1A1, 0xC1FE, 0x0A7C,

+    0xC2A1, 0xC2FE, 0x0ADA, 0xC3A1, 0xC3FE, 0x0B38, 0xC4A1, 0xC4FE, 0x0B96,

+    0xC5A1, 0xC5FE, 0x0BF4, 0xC6A1, 0xC6FE, 0x0C52, 0xC7A1, 0xC7FE, 0x0CB0,

+    0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, 0xCBA1, 0xCBCF, 0x0DCA,

+    0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, 0xCBD6, 0xCBD6, 0x0E5E,

+    0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, 0xCBE8, 0xCBFE, 0x0E0E,

+    0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, 0xCDCF, 0xCDCF, 0x0D84,

+    0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, 0xCDE9, 0xCDFE, 0x0EC9,

+    0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, 0xCEAE, 0xCEFE, 0x0EEB,

+    0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, 0xCFFC, 0xCFFE, 0x0F96,

+    0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, 0xD0A3, 0xD0B7, 0x0F9A,

+    0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, 0xD0D0, 0xD0D0, 0x0E7C,

+    0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, 0xD0DE, 0xD0FE, 0x0FD2,

+    0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, 0xD1D5, 0xD1D5, 0x103C,

+    0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, 0xD1D9, 0xD1DA, 0x1028,

+    0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, 0xD1E2, 0xD1E2, 0x16A8,

+    0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, 0xD1E7, 0xD1E7, 0x102B,

+    0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, 0xD1ED, 0xD1ED, 0x1127,

+    0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, 0xD1F1, 0xD1F1, 0x102E,

+    0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, 0xD1F6, 0xD1F6, 0x112F,

+    0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, 0xD1FB, 0xD1FB, 0x1035,

+    0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, 0xD2A1, 0xD2A1, 0x1036,

+    0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, 0xD2A7, 0xD2AA, 0x113C,

+    0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, 0xD2AD, 0xD2AD, 0x1144,

+    0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, 0xD2B3, 0xD2BD, 0x103F,

+    0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, 0xD2C2, 0xD2C3, 0x11A1,

+    0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, 0xD2C6, 0xD2CA, 0x11A6,

+    0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, 0xD2CD, 0xD2CE, 0x11AD,

+    0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, 0xD2D8, 0xD2D8, 0x104F,

+    0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, 0xD2DE, 0xD2DF, 0x11C1,

+    0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, 0xD2E2, 0xD2E2, 0x11C6,

+    0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, 0xD2E5, 0xD2E8, 0x11D6,

+    0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, 0xD2EC, 0xD2EF, 0x1055,

+    0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, 0xD2F6, 0xD2F6, 0x1059,

+    0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, 0xD3A1, 0xD3FE, 0x1060,

+    0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, 0xD4E7, 0xD4FB, 0x1103,

+    0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, 0xD5A1, 0xD5A4, 0x111A,

+    0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, 0xD5AB, 0xD5AB, 0x102B,

+    0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, 0xD5AF, 0xD5FE, 0x1125,

+    0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, 0xD6B9, 0xD6CC, 0x118C,

+    0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, 0xD7A1, 0xD7CA, 0x11D1,

+    0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, 0xD7E4, 0xD7E4, 0x1918,

+    0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, 0xD9A1, 0xD9FE, 0x128B,

+    0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, 0xDBC5, 0xDBC5, 0x141F,

+    0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, 0xDBE5, 0xDBFE, 0x1389,

+    0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, 0xDCA6, 0xDCFE, 0x13A7,

+    0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, 0xDDA6, 0xDDD4, 0x1404,

+    0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, 0xDDF4, 0xDDF4, 0x1DB7,

+    0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, 0xDEFC, 0xDEFC, 0x15D0,

+    0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, 0xDFA1, 0xDFB2, 0x14B7,

+    0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, 0xDFE1, 0xDFE1, 0x14F2,

+    0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, 0xDFE9, 0xDFFE, 0x14FC,

+    0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, 0xE0F2, 0xE0FE, 0x1562,

+    0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, 0xE1AE, 0xE1EC, 0x157B,

+    0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, 0xE2A1, 0xE2FE, 0x15CB,

+    0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, 0xE3F6, 0xE3FE, 0x167D,

+    0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, 0xE4A9, 0xE4A9, 0x162E,

+    0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, 0xE5AE, 0xE5AE, 0x16F2,

+    0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, 0xE5B3, 0xE5B8, 0x16F1,

+    0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, 0xE5BB, 0xE5BC, 0x114D,

+    0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, 0xE5C5, 0xE5CD, 0x16FF,

+    0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, 0xE5D0, 0xE5D0, 0x1154,

+    0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, 0xE5D3, 0xE5D5, 0x170A,

+    0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, 0xE5FA, 0xE5FB, 0x115A,

+    0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, 0xE5FE, 0xE5FE, 0x115C,

+    0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, 0xE6A4, 0xE6A4, 0x1161,

+    0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, 0xE6A8, 0xE6AC, 0x1735,

+    0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, 0xE6AF, 0xE6B1, 0x1167,

+    0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, 0xE6B4, 0xE6B6, 0x173C,

+    0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, 0xE6BC, 0xE6BC, 0x116F,

+    0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, 0xE6C5, 0xE6C5, 0x1749,

+    0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, 0xE6CA, 0xE6CA, 0x1041,

+    0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, 0xE6D3, 0xE6D5, 0x1753,

+    0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, 0xE6D9, 0xE6D9, 0x1176,

+    0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, 0xE6DD, 0xE6DE, 0x175A,

+    0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, 0xE6E1, 0xE6E1, 0x1178,

+    0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, 0xE6E5, 0xE6E5, 0x1179,

+    0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, 0xE6E8, 0xE6E8, 0x117C,

+    0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, 0xE6EC, 0xE6EC, 0x192F,

+    0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, 0xE6F0, 0xE6F0, 0x1763,

+    0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, 0xE6F3, 0xE6F4, 0x1764,

+    0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, 0xE6F7, 0xE6F7, 0x1046,

+    0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, 0xE6FA, 0xE6FE, 0x1767,

+    0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, 0xE7A6, 0xE7A6, 0x1188,

+    0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, 0xE7AA, 0xE7AA, 0x118B,

+    0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, 0xE7AD, 0xE7AD, 0x118D,

+    0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, 0xE7B1, 0xE7BE, 0x1775,

+    0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, 0xE7C1, 0xE7C1, 0x1E67,

+    0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, 0xE7C7, 0xE7C7, 0x1193,

+    0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, 0xE7CC, 0xE7CC, 0x178B,

+    0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, 0xE7CF, 0xE7D0, 0x1197,

+    0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, 0xE7D4, 0xE7DE, 0x178F,

+    0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, 0xE7E4, 0xE7E4, 0x119D,

+    0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, 0xE7E7, 0xE7F6, 0x179F,

+    0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, 0xE8A1, 0xE8E6, 0x17B6,

+    0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, 0xE8F0, 0xE8F0, 0x11C9,

+    0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, 0xE8F7, 0xE8F7, 0x11CB,

+    0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, 0xE8FA, 0xE8FA, 0x1809,

+    0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, 0xE8FE, 0xE8FE, 0x11CD,

+    0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, 0xE9A8, 0xE9AB, 0x1812,

+    0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, 0xE9CC, 0xE9CC, 0x11D3,

+    0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, 0xE9F8, 0xE9FE, 0x185F,

+    0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, 0xEAC2, 0xEAE4, 0x1886,

+    0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, 0xEAF4, 0xEAF4, 0x1057,

+    0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, 0xEAF8, 0xEAFB, 0x18B9,

+    0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, 0xEAFE, 0xEAFE, 0x11E6,

+    0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, 0xEBA5, 0xEBA6, 0x18C1,

+    0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, 0xEBA9, 0xEBA9, 0x11EC,

+    0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, 0xEBBA, 0xEBBB, 0x11EE,

+    0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, 0xEBBE, 0xEBC0, 0x18D4,

+    0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, 0xEBC3, 0xEBC5, 0x18D7,

+    0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, 0xEBCC, 0xEBCC, 0x11F7,

+    0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, 0xEBD2, 0xEBD2, 0x15B0,

+    0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, 0xEBD9, 0xEBFE, 0x18E5,

+    0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, 0xECA7, 0xECA7, 0x1208,

+    0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, 0xECAB, 0xECAE, 0x1912,

+    0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, 0xECB2, 0xECB2, 0x105B,

+    0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, 0xECB6, 0xECB7, 0x1918,

+    0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, 0xECBA, 0xECBA, 0x1215,

+    0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, 0xECC2, 0xECC4, 0x1920,

+    0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, 0xECC7, 0xECC8, 0x1923,

+    0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, 0xECD5, 0xECD5, 0x121E,

+    0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, 0xECDF, 0xECE0, 0x1936,

+    0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, 0xECE4, 0xECE4, 0x1224,

+    0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, 0xECE9, 0xECF6, 0x193C,

+    0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, 0xECFA, 0xECFA, 0x122A,

+    0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, 0xEDA4, 0xEDED, 0x194F,

+    0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, 0xEEA1, 0xEEDA, 0x19A9,

+    0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, 0xEFA1, 0xEFFE, 0x1A06,

+    0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, 0xF2A1, 0xF2BC, 0x1B20,

+    0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, 0xF2FA, 0xF2FA, 0x168B,

+    0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, 0xF3B1, 0xF3B1, 0x105F,

+    0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, 0xF4A7, 0xF4A7, 0x1954,

+    0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, 0xF4EF, 0xF4FE, 0x1C25,

+    0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, 0xF6F4, 0xF6F4, 0x10B7,

+    0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, 0xF6F7, 0xF6FE, 0x1CE7,

+    0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, 0xF7B9, 0xF7C7, 0x1D06,

+    0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, 0xF7D3, 0xF7D3, 0x10F4,

+    0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, 0xF8DB, 0xF8DB, 0x1D94,

+    0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, 0xF8F1, 0xF8FE, 0x1D98,

+    0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, 0xFAA2, 0xFAA2, 0x0DE6,

+    0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, 0xFAE7, 0xFAFE, 0x1E47,

+    0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, 0xFCA9, 0xFCA9, 0x0EE7,

+    0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp
new file mode 100644
index 0000000..62b6ea5
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp
@@ -0,0 +1,2806 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_UniKS_UCS2_H_1[8394 * 3] = {

+    0x0020, 0x007E, 0x0001, 0x00A1, 0x00A1, 0x00D0, 0x00A4, 0x00A4, 0x00D6,

+    0x00A7, 0x00A7, 0x009B, 0x00A8, 0x00A8, 0x006B, 0x00AA, 0x00AA, 0x029C,

+    0x00AB, 0x00AB, 0x00B0, 0x00B0, 0x00B0, 0x008A, 0x00B1, 0x00B1, 0x0082,

+    0x00B2, 0x00B3, 0x034B, 0x00B4, 0x00B4, 0x00C7, 0x00B6, 0x00B6, 0x00F4,

+    0x00B8, 0x00B8, 0x00CE, 0x00B9, 0x00B9, 0x034A, 0x00BA, 0x00BA, 0x02A3,

+    0x00BB, 0x00BB, 0x00B1, 0x00BC, 0x00BC, 0x02EF, 0x00BD, 0x00BD, 0x02EC,

+    0x00BE, 0x00BE, 0x02F0, 0x00BF, 0x00BF, 0x00D1, 0x00C6, 0x00C6, 0x029A,

+    0x00D0, 0x00D0, 0x029B, 0x00D7, 0x00D7, 0x0083, 0x00D8, 0x00D8, 0x02A1,

+    0x00DE, 0x00DE, 0x02A4, 0x00DF, 0x00DF, 0x0300, 0x00E6, 0x00E6, 0x02F5,

+    0x00F0, 0x00F0, 0x02F7, 0x00F7, 0x00F7, 0x0084, 0x00F8, 0x00F8, 0x02FE,

+    0x00FE, 0x00FE, 0x0301, 0x0111, 0x0111, 0x02F6, 0x0126, 0x0126, 0x029D,

+    0x0127, 0x0127, 0x02F8, 0x0131, 0x0131, 0x02F9, 0x0132, 0x0132, 0x029E,

+    0x0133, 0x0133, 0x02FA, 0x0138, 0x0138, 0x02FB, 0x013F, 0x013F, 0x029F,

+    0x0140, 0x0140, 0x02FC, 0x0141, 0x0141, 0x02A0, 0x0142, 0x0142, 0x02FD,

+    0x0149, 0x0149, 0x0304, 0x014A, 0x014A, 0x02A6, 0x014B, 0x014B, 0x0303,

+    0x0152, 0x0152, 0x02A2, 0x0153, 0x0153, 0x02FF, 0x0166, 0x0166, 0x02A5,

+    0x0167, 0x0167, 0x0302, 0x02BC, 0x02BC, 0x2053, 0x02C7, 0x02C7, 0x00C9,

+    0x02D8, 0x02D8, 0x00CA, 0x02D9, 0x02D9, 0x00CD, 0x02DA, 0x02DA, 0x00CC,

+    0x02DB, 0x02DB, 0x00CF, 0x02DC, 0x02DC, 0x00C8, 0x02DD, 0x02DD, 0x00CB,

+    0x0391, 0x03A1, 0x01D7, 0x03A3, 0x03A9, 0x01E8, 0x03B1, 0x03C1, 0x01EF,

+    0x03C3, 0x03C9, 0x0200, 0x0401, 0x0401, 0x0402, 0x0410, 0x0415, 0x03FC,

+    0x0416, 0x0435, 0x0403, 0x0436, 0x044F, 0x0424, 0x0451, 0x0451, 0x0423,

+    0x2013, 0x2014, 0x006D, 0x2016, 0x2016, 0x006F, 0x2018, 0x2019, 0x0072,

+    0x201B, 0x201B, 0x202E, 0x201C, 0x201D, 0x0074, 0x201F, 0x201F, 0x202D,

+    0x2020, 0x2021, 0x00F5, 0x2022, 0x2022, 0x219F, 0x2025, 0x2026, 0x0069,

+    0x2030, 0x2030, 0x00D8, 0x2032, 0x2033, 0x008B, 0x2034, 0x2034, 0x2186,

+    0x2035, 0x2035, 0x246E, 0x2036, 0x2036, 0x246C, 0x2039, 0x203A, 0x21A4,

+    0x203B, 0x203B, 0x009C, 0x203C, 0x203C, 0x223B, 0x2042, 0x2042, 0x2197,

+    0x2074, 0x2074, 0x034D, 0x207A, 0x207B, 0x202F, 0x207C, 0x207C, 0x2038,

+    0x207D, 0x207E, 0x203A, 0x207F, 0x207F, 0x034E, 0x2081, 0x2084, 0x034F,

+    0x2103, 0x2103, 0x008D, 0x2109, 0x2109, 0x00D7, 0x2113, 0x2113, 0x024E,

+    0x2116, 0x2116, 0x0102, 0x2121, 0x2121, 0x0107, 0x2122, 0x2122, 0x0104,

+    0x2126, 0x2126, 0x0283, 0x212B, 0x212B, 0x008E, 0x2153, 0x2154, 0x02ED,

+    0x215B, 0x215E, 0x02F1, 0x2160, 0x2169, 0x01CD, 0x2170, 0x2179, 0x01C3,

+    0x2190, 0x2191, 0x00AB, 0x2192, 0x2192, 0x00AA, 0x2193, 0x2194, 0x00AD,

+    0x2195, 0x2195, 0x00F7, 0x2196, 0x2196, 0x00FA, 0x2197, 0x2197, 0x00F8,

+    0x2198, 0x2198, 0x00FB, 0x2199, 0x2199, 0x00F9, 0x21B0, 0x21B0, 0x22A4,

+    0x21B1, 0x21B1, 0x22A1, 0x21B2, 0x21B2, 0x22A0, 0x21B3, 0x21B3, 0x22A5,

+    0x21B4, 0x21B4, 0x22A3, 0x21BC, 0x21BC, 0x22B4, 0x21C0, 0x21C0, 0x22B5,

+    0x21C4, 0x21C5, 0x22C0, 0x21CD, 0x21CD, 0x2270, 0x21CF, 0x21CF, 0x226F,

+    0x21D0, 0x21D0, 0x226E, 0x21D1, 0x21D1, 0x2296, 0x21D2, 0x21D2, 0x00C3,

+    0x21D3, 0x21D3, 0x2297, 0x21D4, 0x21D4, 0x00C4, 0x21E0, 0x21E0, 0x23E6,

+    0x21E1, 0x21E1, 0x23E8, 0x21E2, 0x21E2, 0x23E7, 0x21E3, 0x21E3, 0x23E9,

+    0x21E6, 0x21E6, 0x23EE, 0x21E7, 0x21E7, 0x23F0, 0x21E8, 0x21E8, 0x23EF,

+    0x21E9, 0x21E9, 0x23F1, 0x2200, 0x2200, 0x00C5, 0x2202, 0x2202, 0x0097,

+    0x2203, 0x2203, 0x00C6, 0x2206, 0x2206, 0x220B, 0x2207, 0x2207, 0x0098,

+    0x2208, 0x2208, 0x00B8, 0x2209, 0x2209, 0x222D, 0x220B, 0x220B, 0x00B9,

+    0x220C, 0x220C, 0x222E, 0x220F, 0x220F, 0x00D5, 0x2211, 0x2211, 0x00D4,

+    0x2213, 0x2213, 0x2216, 0x221A, 0x221A, 0x00B2, 0x221D, 0x221D, 0x00B4,

+    0x221E, 0x221E, 0x0088, 0x221F, 0x221F, 0x220D, 0x2220, 0x2220, 0x0094,

+    0x2222, 0x2222, 0x2222, 0x2225, 0x2226, 0x220F, 0x2227, 0x2228, 0x00C0,

+    0x2229, 0x2229, 0x00BF, 0x222A, 0x222A, 0x00BE, 0x222B, 0x222C, 0x00B6,

+    0x222E, 0x222E, 0x00D3, 0x2234, 0x2234, 0x0089, 0x2235, 0x2235, 0x00B5,

+    0x2236, 0x2236, 0x00D2, 0x2237, 0x2237, 0x2081, 0x223D, 0x223D, 0x00B3,

+    0x2243, 0x2243, 0x2134, 0x2245, 0x2245, 0x2133, 0x2248, 0x2248, 0x2135,

+    0x2250, 0x2250, 0x2223, 0x2251, 0x2251, 0x2213, 0x2252, 0x2252, 0x009A,

+    0x2253, 0x2253, 0x2212, 0x225A, 0x225A, 0x2231, 0x2260, 0x2260, 0x0085,

+    0x2261, 0x2261, 0x0099, 0x2262, 0x2262, 0x221E, 0x2264, 0x2265, 0x0086,

+    0x2266, 0x2267, 0x2214, 0x226E, 0x226F, 0x2229, 0x2270, 0x2273, 0x2121,

+    0x2276, 0x2277, 0x2129, 0x2279, 0x2279, 0x212B, 0x227A, 0x227B, 0x211B,

+    0x2280, 0x2281, 0x211F, 0x2282, 0x2283, 0x00BC, 0x2284, 0x2284, 0x222C,

+    0x2285, 0x2285, 0x222B, 0x2286, 0x2287, 0x00BA, 0x228A, 0x228A, 0x2126,

+    0x228B, 0x228B, 0x2128, 0x2295, 0x2297, 0x2217, 0x22A3, 0x22A3, 0x2226,

+    0x22A4, 0x22A4, 0x2137, 0x22A5, 0x22A5, 0x0095, 0x22BB, 0x22BC, 0x222F,

+    0x22CE, 0x22CF, 0x211D, 0x22DA, 0x22DB, 0x212C, 0x22EE, 0x22EE, 0x2080,

+    0x22EF, 0x22EF, 0x006A, 0x2306, 0x2306, 0x2232, 0x2312, 0x2312, 0x0096,

+    0x2314, 0x2314, 0x221B, 0x2460, 0x246E, 0x02DD, 0x246F, 0x2473, 0x2257,

+    0x2474, 0x2482, 0x033B, 0x2483, 0x2487, 0x2352, 0x249C, 0x24B5, 0x0321,

+    0x24B6, 0x24CF, 0x20C4, 0x24D0, 0x24E9, 0x02C3, 0x2500, 0x2500, 0x0207,

+    0x2501, 0x2501, 0x0212, 0x2502, 0x2502, 0x0208, 0x2503, 0x2503, 0x0213,

+    0x250C, 0x250C, 0x0209, 0x250D, 0x250D, 0x022E, 0x250E, 0x250E, 0x022D,

+    0x250F, 0x250F, 0x0214, 0x2510, 0x2510, 0x020A, 0x2511, 0x2511, 0x0228,

+    0x2512, 0x2512, 0x0227, 0x2513, 0x2513, 0x0215, 0x2514, 0x2514, 0x020C,

+    0x2515, 0x2515, 0x022C, 0x2516, 0x2516, 0x022B, 0x2517, 0x2517, 0x0217,

+    0x2518, 0x2518, 0x020B, 0x2519, 0x2519, 0x022A, 0x251A, 0x251A, 0x0229,

+    0x251B, 0x251B, 0x0216, 0x251C, 0x251C, 0x020D, 0x251D, 0x251D, 0x0222,

+    0x251E, 0x251F, 0x022F, 0x2520, 0x2520, 0x021D, 0x2521, 0x2522, 0x0231,

+    0x2523, 0x2523, 0x0218, 0x2524, 0x2524, 0x020F, 0x2525, 0x2525, 0x0224,

+    0x2526, 0x2527, 0x0233, 0x2528, 0x2528, 0x021F, 0x2529, 0x252A, 0x0235,

+    0x252B, 0x252B, 0x021A, 0x252C, 0x252C, 0x020E, 0x252D, 0x252E, 0x0237,

+    0x252F, 0x252F, 0x021E, 0x2530, 0x2530, 0x0223, 0x2531, 0x2532, 0x0239,

+    0x2533, 0x2533, 0x0219, 0x2534, 0x2534, 0x0210, 0x2535, 0x2536, 0x023B,

+    0x2537, 0x2537, 0x0220, 0x2538, 0x2538, 0x0225, 0x2539, 0x253A, 0x023D,

+    0x253B, 0x253B, 0x021B, 0x253C, 0x253C, 0x0211, 0x253D, 0x253E, 0x023F,

+    0x253F, 0x253F, 0x0221, 0x2540, 0x2541, 0x0241, 0x2542, 0x2542, 0x0226,

+    0x2543, 0x254A, 0x0243, 0x254B, 0x254B, 0x021C, 0x2592, 0x2592, 0x00E8,

+    0x25A0, 0x25A0, 0x00A5, 0x25A1, 0x25A1, 0x00A4, 0x25A3, 0x25A3, 0x00E5,

+    0x25A4, 0x25A5, 0x00E9, 0x25A6, 0x25A6, 0x00ED, 0x25A7, 0x25A7, 0x00EC,

+    0x25A8, 0x25A8, 0x00EB, 0x25A9, 0x25A9, 0x00EE, 0x25B1, 0x25B1, 0x2220,

+    0x25B2, 0x25B2, 0x00A7, 0x25B3, 0x25B3, 0x00A6, 0x25B5, 0x25B5, 0x224C,

+    0x25B6, 0x25B6, 0x00DC, 0x25B7, 0x25B7, 0x00DB, 0x25B9, 0x25B9, 0x224D,

+    0x25BC, 0x25BC, 0x00A9, 0x25BD, 0x25BD, 0x00A8, 0x25BF, 0x25BF, 0x224B,

+    0x25C0, 0x25C0, 0x00DA, 0x25C1, 0x25C1, 0x00D9, 0x25C3, 0x25C3, 0x224E,

+    0x25C6, 0x25C6, 0x00A3, 0x25C7, 0x25C7, 0x00A2, 0x25C8, 0x25C8, 0x00E4,

+    0x25C9, 0x25C9, 0x00E3, 0x25CA, 0x25CA, 0x2253, 0x25CB, 0x25CB, 0x009F,

+    0x25CC, 0x25CC, 0x21BF, 0x25CE, 0x25CE, 0x00A1, 0x25CF, 0x25CF, 0x00A0,

+    0x25D0, 0x25D1, 0x00E6, 0x25E6, 0x25E6, 0x2247, 0x25EF, 0x25EF, 0x21B9,

+    0x2605, 0x2605, 0x009E, 0x2606, 0x2606, 0x009D, 0x260E, 0x260E, 0x00F1,

+    0x260F, 0x260F, 0x00F0, 0x261C, 0x261C, 0x00F2, 0x261D, 0x261D, 0x2406,

+    0x261E, 0x261E, 0x00F3, 0x261F, 0x261F, 0x2407, 0x262F, 0x262F, 0x21D8,

+    0x2640, 0x2640, 0x0093, 0x2642, 0x2642, 0x0092, 0x2660, 0x2661, 0x00DE,

+    0x2663, 0x2663, 0x00E2, 0x2664, 0x2664, 0x00DD, 0x2665, 0x2665, 0x00E0,

+    0x2667, 0x2667, 0x00E1, 0x2668, 0x2668, 0x00EF, 0x2669, 0x266A, 0x00FD,

+    0x266C, 0x266C, 0x00FF, 0x266D, 0x266D, 0x00FC, 0x266F, 0x266F, 0x2192,

+    0x2716, 0x2716, 0x21B7, 0x271A, 0x271A, 0x21B6, 0x273D, 0x273D, 0x219C,

+    0x2756, 0x2756, 0x21BD, 0x2776, 0x277F, 0x21E1, 0x278A, 0x2793, 0x2096,

+    0x3000, 0x3002, 0x0065, 0x3003, 0x3003, 0x006C, 0x3008, 0x3011, 0x0078,

+    0x3012, 0x3012, 0x21FC, 0x3013, 0x3013, 0x00AF, 0x3014, 0x3015, 0x0076,

+    0x3016, 0x3019, 0x201B, 0x301E, 0x301F, 0x246A, 0x3020, 0x3020, 0x21DF,

+    0x3036, 0x3036, 0x21FD, 0x3041, 0x3093, 0x0353, 0x30A1, 0x30F6, 0x03A6,

+    0x30FB, 0x30FB, 0x0068, 0x30FC, 0x30FC, 0x2472, 0x3131, 0x3163, 0x0166,

+    0x3164, 0x3164, 0x0065, 0x3165, 0x318E, 0x0199, 0x3200, 0x321B, 0x0305,

+    0x321C, 0x321C, 0x0101, 0x3231, 0x3231, 0x2254, 0x3239, 0x3239, 0x2255,

+    0x3260, 0x327B, 0x02A7, 0x327F, 0x327F, 0x0100, 0x328A, 0x328F, 0x2455,

+    0x3290, 0x3290, 0x2454, 0x3294, 0x3294, 0x2378, 0x329E, 0x329E, 0x2239,

+    0x32A5, 0x32A5, 0x2388, 0x3380, 0x3384, 0x0273, 0x3388, 0x3389, 0x0264,

+    0x338A, 0x338C, 0x0286, 0x338D, 0x338F, 0x0260, 0x3390, 0x3394, 0x027E,

+    0x3395, 0x3397, 0x024B, 0x3398, 0x3398, 0x024F, 0x3399, 0x33A2, 0x0255,

+    0x33A3, 0x33A6, 0x0251, 0x33A7, 0x33A8, 0x0267, 0x33A9, 0x33AC, 0x028F,

+    0x33AD, 0x33AF, 0x028B, 0x33B0, 0x33B9, 0x0269, 0x33BA, 0x33BF, 0x0278,

+    0x33C0, 0x33C1, 0x0284, 0x33C2, 0x33C2, 0x0105, 0x33C3, 0x33C3, 0x0296,

+    0x33C4, 0x33C4, 0x0250, 0x33C5, 0x33C5, 0x028A, 0x33C6, 0x33C6, 0x0299,

+    0x33C7, 0x33C7, 0x0103, 0x33C8, 0x33C8, 0x0266, 0x33C9, 0x33C9, 0x0297,

+    0x33CA, 0x33CA, 0x025F, 0x33CB, 0x33CB, 0x2256, 0x33CF, 0x33CF, 0x0263,

+    0x33D0, 0x33D0, 0x0294, 0x33D3, 0x33D3, 0x0295, 0x33D6, 0x33D6, 0x0289,

+    0x33D8, 0x33D8, 0x0106, 0x33DB, 0x33DB, 0x028E, 0x33DC, 0x33DC, 0x0298,

+    0x33DD, 0x33DD, 0x0293, 0x4E00, 0x4E00, 0x193C, 0x4E01, 0x4E01, 0x1A30,

+    0x4E03, 0x4E03, 0x1CC4, 0x4E07, 0x4E07, 0x123E, 0x4E08, 0x4E08, 0x1986,

+    0x4E09, 0x4E09, 0x14C8, 0x4E0A, 0x4E0A, 0x14D3, 0x4E0B, 0x4E0B, 0x1DC0,

+    0x4E0D, 0x4E0D, 0x13F5, 0x4E11, 0x4E11, 0x1C78, 0x4E14, 0x4E14, 0x1B81,

+    0x4E15, 0x4E15, 0x143D, 0x4E16, 0x4E16, 0x1574, 0x4E18, 0x4E18, 0x0F35,

+    0x4E19, 0x4E19, 0x13B1, 0x4E1E, 0x4E1E, 0x1632, 0x4E2D, 0x4E2D, 0x1B0A,

+    0x4E32, 0x4E32, 0x0EDA, 0x4E38, 0x4E38, 0x1ECA, 0x4E39, 0x4E39, 0x1060,

+    0x4E3B, 0x4E3B, 0x1ACC, 0x4E42, 0x4E42, 0x178D, 0x4E43, 0x4E43, 0x103A,

+    0x4E45, 0x4E45, 0x0F36, 0x4E4B, 0x4E4B, 0x1B1E, 0x4E4D, 0x4E4D, 0x1479,

+    0x4E4E, 0x4E4E, 0x1E78, 0x4E4F, 0x4E4F, 0x1DBE, 0x4E56, 0x4E56, 0x0F0F,

+    0x4E58, 0x4E58, 0x1633, 0x4E59, 0x4E59, 0x18EC, 0x4E5D, 0x4E5D, 0x0F37,

+    0x4E5E, 0x4E5E, 0x0E1D, 0x4E5F, 0x4E5F, 0x16E6, 0x4E6B, 0x4E6B, 0x0DAC,

+    0x4E6D, 0x4E6D, 0x10E9, 0x4E73, 0x4E73, 0x18A5, 0x4E76, 0x4E76, 0x13E4,

+    0x4E77, 0x4E77, 0x14C3, 0x4E7E, 0x4E7E, 0x0E11, 0x4E82, 0x4E82, 0x1125,

+    0x4E86, 0x4E86, 0x11C7, 0x4E88, 0x4E88, 0x172E, 0x4E8B, 0x4E8B, 0x147A,

+    0x4E8C, 0x4E8C, 0x190D, 0x4E8E, 0x4E8E, 0x1835, 0x4E90, 0x4E90, 0x186C,

+    0x4E91, 0x4E91, 0x185E, 0x4E92, 0x4E92, 0x1E79, 0x4E94, 0x4E94, 0x17A1,

+    0x4E95, 0x4E95, 0x1A31, 0x4E98, 0x4E98, 0x0FDA, 0x4E9B, 0x4E9B, 0x147B,

+    0x4E9E, 0x4E9E, 0x168F, 0x4EA1, 0x4EA1, 0x1258, 0x4EA2, 0x4EA2, 0x1DF6,

+    0x4EA4, 0x4EA4, 0x0F1C, 0x4EA5, 0x4EA5, 0x1E05, 0x4EA6, 0x4EA6, 0x173B,

+    0x4EA8, 0x4EA8, 0x1E5B, 0x4EAB, 0x4EAB, 0x1E1E, 0x4EAC, 0x4EAC, 0x0E4C,

+    0x4EAD, 0x4EAD, 0x1A32, 0x4EAE, 0x4EAE, 0x114B, 0x4EB6, 0x4EB6, 0x1061,

+    0x4EBA, 0x4EBA, 0x192B, 0x4EC0, 0x4EC0, 0x168B, 0x4EC1, 0x4EC1, 0x192C,

+    0x4EC4, 0x4EC4, 0x1CA3, 0x4EC7, 0x4EC7, 0x0F38, 0x4ECA, 0x4ECA, 0x0FC6,

+    0x4ECB, 0x4ECB, 0x0DE8, 0x4ECD, 0x4ECD, 0x194F, 0x4ED4, 0x4ED4, 0x1953,

+    0x4ED5, 0x4ED5, 0x147C, 0x4ED6, 0x4ED6, 0x1CD4, 0x4ED7, 0x4ED7, 0x1987,

+    0x4ED8, 0x4ED8, 0x13F6, 0x4ED9, 0x4ED9, 0x152A, 0x4EDD, 0x4EDD, 0x10EB,

+    0x4EDF, 0x4EDF, 0x1BEC, 0x4EE3, 0x4EE3, 0x109A, 0x4EE4, 0x4EE4, 0x1189,

+    0x4EE5, 0x4EE5, 0x190E, 0x4EF0, 0x4EF0, 0x16C9, 0x4EF2, 0x4EF2, 0x1B0B,

+    0x4EF6, 0x4EF6, 0x0E12, 0x4EF7, 0x4EF7, 0x0DE9, 0x4EFB, 0x4EFB, 0x1945,

+    0x4F01, 0x4F01, 0x0FDE, 0x4F09, 0x4F09, 0x1DF7, 0x4F0A, 0x4F0A, 0x190F,

+    0x4F0B, 0x4F0B, 0x0FD3, 0x4F0D, 0x4F0D, 0x17A2, 0x4F0E, 0x4F0E, 0x0FDF,

+    0x4F0F, 0x4F0F, 0x13D2, 0x4F10, 0x4F10, 0x138D, 0x4F11, 0x4F11, 0x1F45,

+    0x4F2F, 0x4F2F, 0x137C, 0x4F34, 0x4F34, 0x1329, 0x4F36, 0x4F36, 0x118A,

+    0x4F38, 0x4F38, 0x1667, 0x4F3A, 0x4F3A, 0x147D, 0x4F3C, 0x4F3C, 0x147E,

+    0x4F3D, 0x4F3D, 0x0D6C, 0x4F43, 0x4F43, 0x19F3, 0x4F46, 0x4F46, 0x1062,

+    0x4F47, 0x4F47, 0x19BF, 0x4F48, 0x4F48, 0x1D78, 0x4F4D, 0x4F4D, 0x188C,

+    0x4F4E, 0x4F4E, 0x19C0, 0x4F4F, 0x4F4F, 0x1ACD, 0x4F50, 0x4F50, 0x1AC6,

+    0x4F51, 0x4F51, 0x1836, 0x4F55, 0x4F55, 0x1DC1, 0x4F59, 0x4F59, 0x172F,

+    0x4F5A, 0x4F5A, 0x193D, 0x4F5B, 0x4F5B, 0x1433, 0x4F5C, 0x4F5C, 0x196D,

+    0x4F69, 0x4F69, 0x1D4E, 0x4F6F, 0x4F6F, 0x16F7, 0x4F70, 0x4F70, 0x137D,

+    0x4F73, 0x4F73, 0x0D6D, 0x4F76, 0x4F76, 0x101F, 0x4F7A, 0x4F7A, 0x19F4,

+    0x4F7E, 0x4F7E, 0x193E, 0x4F7F, 0x4F7F, 0x147F, 0x4F81, 0x4F81, 0x1668,

+    0x4F83, 0x4F83, 0x0D94, 0x4F84, 0x4F84, 0x1B67, 0x4F86, 0x4F86, 0x1144,

+    0x4F88, 0x4F88, 0x1CA8, 0x4F8A, 0x4F8A, 0x0EFF, 0x4F8B, 0x4F8B, 0x119A,

+    0x4F8D, 0x4F8D, 0x163C, 0x4F8F, 0x4F8F, 0x1ACE, 0x4F91, 0x4F91, 0x18A6,

+    0x4F96, 0x4F96, 0x11F2, 0x4F98, 0x4F98, 0x1B82, 0x4F9B, 0x4F9B, 0x0ECA,

+    0x4F9D, 0x4F9D, 0x18FA, 0x4FAE, 0x4FAE, 0x129C, 0x4FAF, 0x4FAF, 0x1F1E,

+    0x4FB5, 0x4FB5, 0x1CC7, 0x4FB6, 0x4FB6, 0x1158, 0x4FBF, 0x4FBF, 0x1D5E,

+    0x4FC2, 0x4FC2, 0x0E79, 0x4FC3, 0x4FC3, 0x1C49, 0x4FC4, 0x4FC4, 0x1690,

+    0x4FC9, 0x4FC9, 0x17A3, 0x4FCA, 0x4FCA, 0x1AF6, 0x4FCE, 0x4FCE, 0x1A7E,

+    0x4FD1, 0x4FD1, 0x181E, 0x4FD3, 0x4FD3, 0x0E4D, 0x4FD4, 0x4FD4, 0x1E36,

+    0x4FD7, 0x4FD7, 0x15A1, 0x4FDA, 0x4FDA, 0x1205, 0x4FDD, 0x4FDD, 0x13C2,

+    0x4FDF, 0x4FDF, 0x1480, 0x4FE0, 0x4FE0, 0x1E4F, 0x4FE1, 0x4FE1, 0x1669,

+    0x4FEE, 0x4FEE, 0x15BF, 0x4FEF, 0x4FEF, 0x13F7, 0x4FF1, 0x4FF1, 0x0F39,

+    0x4FF3, 0x4FF3, 0x136A, 0x4FF5, 0x4FF5, 0x1D98, 0x4FF8, 0x4FF8, 0x13E5,

+    0x4FFA, 0x4FFA, 0x1725, 0x5002, 0x5002, 0x13B2, 0x5006, 0x5006, 0x114C,

+    0x5009, 0x5009, 0x1BB4, 0x500B, 0x500B, 0x0DEA, 0x500D, 0x500D, 0x1369,

+    0x5011, 0x5011, 0x12E4, 0x5012, 0x5012, 0x10AD, 0x5016, 0x5016, 0x1E19,

+    0x5019, 0x5019, 0x1F1F, 0x501A, 0x501A, 0x18FB, 0x501C, 0x501C, 0x1BDE,

+    0x501E, 0x501E, 0x0E4E, 0x501F, 0x501F, 0x1B83, 0x5021, 0x5021, 0x1BB5,

+    0x5023, 0x5023, 0x134D, 0x5024, 0x5024, 0x1CA9, 0x5026, 0x5026, 0x0F81,

+    0x5027, 0x5027, 0x1AB5, 0x5028, 0x5028, 0x0E01, 0x502A, 0x502A, 0x178E,

+    0x502B, 0x502B, 0x11F3, 0x502C, 0x502C, 0x1CE2, 0x502D, 0x502D, 0x17F3,

+    0x503B, 0x503B, 0x16E7, 0x5043, 0x5043, 0x171D, 0x5047, 0x5047, 0x0D6E,

+    0x5048, 0x5048, 0x0E2B, 0x5049, 0x5049, 0x188D, 0x504F, 0x504F, 0x1D5F,

+    0x5055, 0x5055, 0x1E06, 0x505A, 0x505A, 0x1ACF, 0x505C, 0x505C, 0x1A33,

+    0x5065, 0x5065, 0x0E13, 0x5074, 0x5074, 0x1CA2, 0x5075, 0x5075, 0x1A34,

+    0x5076, 0x5076, 0x1837, 0x5078, 0x5078, 0x1D29, 0x5080, 0x5080, 0x0F10,

+    0x5085, 0x5085, 0x13F8, 0x508D, 0x508D, 0x134E, 0x5091, 0x5091, 0x0E1E,

+    0x5098, 0x5098, 0x14B7, 0x5099, 0x5099, 0x143E, 0x50AC, 0x50AC, 0x1C5E,

+    0x50AD, 0x50AD, 0x181F, 0x50B2, 0x50B2, 0x17A4, 0x50B3, 0x50B3, 0x19F5,

+    0x50B5, 0x50B5, 0x1BCA, 0x50B7, 0x50B7, 0x14D4, 0x50BE, 0x50BE, 0x0E4F,

+    0x50C5, 0x50C5, 0x0FB7, 0x50C9, 0x50C9, 0x1C09, 0x50CA, 0x50CA, 0x152B,

+    0x50CF, 0x50CF, 0x14D5, 0x50D1, 0x50D1, 0x0F1D, 0x50D5, 0x50D5, 0x13D3,

+    0x50D6, 0x50D6, 0x1F63, 0x50DA, 0x50DA, 0x11C8, 0x50DE, 0x50DE, 0x188E,

+    0x50E5, 0x50E5, 0x17FC, 0x50E7, 0x50E7, 0x1634, 0x50ED, 0x50ED, 0x1BAA,

+    0x50F9, 0x50F9, 0x0D6F, 0x50FB, 0x50FB, 0x139C, 0x50FF, 0x50FF, 0x1481,

+    0x5100, 0x5100, 0x18FC, 0x5101, 0x5101, 0x1AF7, 0x5104, 0x5104, 0x1718,

+    0x5106, 0x5106, 0x0E50, 0x5109, 0x5109, 0x0E21, 0x5112, 0x5112, 0x18A7,

+    0x511F, 0x511F, 0x14D6, 0x5121, 0x5121, 0x11BF, 0x512A, 0x512A, 0x1838,

+    0x5132, 0x5132, 0x19C1, 0x5137, 0x5137, 0x1159, 0x513A, 0x513A, 0x1025,

+    0x513C, 0x513C, 0x1726, 0x5140, 0x5140, 0x17C9, 0x5141, 0x5141, 0x18D7,

+    0x5143, 0x5143, 0x186F, 0x5144, 0x5144, 0x1E5C, 0x5145, 0x5145, 0x1C8A,

+    0x5146, 0x5146, 0x1A7F, 0x5147, 0x5147, 0x1F4D, 0x5148, 0x5148, 0x152C,

+    0x5149, 0x5149, 0x0F00, 0x514B, 0x514B, 0x0FB0, 0x514C, 0x514C, 0x1D07,

+    0x514D, 0x514D, 0x127F, 0x514E, 0x514E, 0x1D19, 0x5152, 0x5152, 0x1691,

+    0x515C, 0x515C, 0x10FC, 0x5162, 0x5162, 0x0FDB, 0x5165, 0x5165, 0x194D,

+    0x5167, 0x5167, 0x103B, 0x5168, 0x5168, 0x19F6, 0x5169, 0x5169, 0x114D,

+    0x516A, 0x516A, 0x18A8, 0x516B, 0x516B, 0x1D4B, 0x516C, 0x516C, 0x0ECB,

+    0x516D, 0x516D, 0x11EF, 0x516E, 0x516E, 0x1E6F, 0x5171, 0x5171, 0x0ECC,

+    0x5175, 0x5175, 0x13B3, 0x5176, 0x5176, 0x0FE0, 0x5177, 0x5177, 0x0F3A,

+    0x5178, 0x5178, 0x19F7, 0x517C, 0x517C, 0x0E46, 0x5180, 0x5180, 0x0FE1,

+    0x5186, 0x5186, 0x172D, 0x518A, 0x518A, 0x1BD6, 0x518D, 0x518D, 0x19AA,

+    0x5192, 0x5192, 0x129D, 0x5195, 0x5195, 0x1280, 0x5197, 0x5197, 0x1820,

+    0x51A0, 0x51A0, 0x0EEB, 0x51A5, 0x51A5, 0x128C, 0x51AA, 0x51AA, 0x127D,

+    0x51AC, 0x51AC, 0x10EC, 0x51B6, 0x51B6, 0x16E8, 0x51B7, 0x51B7, 0x1148,

+    0x51BD, 0x51BD, 0x117D, 0x51C4, 0x51C4, 0x1BDA, 0x51C6, 0x51C6, 0x1AF8,

+    0x51C9, 0x51C9, 0x114E, 0x51CB, 0x51CB, 0x1A80, 0x51CC, 0x51CC, 0x11FF,

+    0x51CD, 0x51CD, 0x10ED, 0x51DC, 0x51DC, 0x11FE, 0x51DD, 0x51DD, 0x18F6,

+    0x51DE, 0x51DE, 0x1F64, 0x51E1, 0x51E1, 0x1391, 0x51F0, 0x51F0, 0x1EE0,

+    0x51F1, 0x51F1, 0x0DEB, 0x51F6, 0x51F6, 0x1F4E, 0x51F8, 0x51F8, 0x1BFF,

+    0x51F9, 0x51F9, 0x17FD, 0x51FA, 0x51FA, 0x1C87, 0x51FD, 0x51FD, 0x1DE3,

+    0x5200, 0x5200, 0x10AE, 0x5203, 0x5203, 0x192D, 0x5206, 0x5206, 0x1420,

+    0x5207, 0x5207, 0x1A1C, 0x5208, 0x5208, 0x178F, 0x520A, 0x520A, 0x0D95,

+    0x520E, 0x520E, 0x12E5, 0x5211, 0x5211, 0x1E5D, 0x5217, 0x5217, 0x117E,

+    0x521D, 0x521D, 0x1C2E, 0x5224, 0x5224, 0x1D42, 0x5225, 0x5225, 0x13AD,

+    0x5229, 0x5229, 0x1206, 0x522A, 0x522A, 0x14B8, 0x522E, 0x522E, 0x0EFB,

+    0x5230, 0x5230, 0x10AF, 0x5236, 0x5236, 0x1A67, 0x5237, 0x5237, 0x15B9,

+    0x5238, 0x5238, 0x0F82, 0x5239, 0x5239, 0x1BA5, 0x523A, 0x523A, 0x1954,

+    0x523B, 0x523B, 0x0D89, 0x5243, 0x5243, 0x1C25, 0x5247, 0x5247, 0x1CC0,

+    0x524A, 0x524A, 0x14B5, 0x524B, 0x524B, 0x0FB1, 0x524C, 0x524C, 0x112D,

+    0x524D, 0x524D, 0x19F8, 0x5254, 0x5254, 0x1BDF, 0x5256, 0x5256, 0x13F9,

+    0x525B, 0x525B, 0x0DD0, 0x525D, 0x525D, 0x1316, 0x5261, 0x5261, 0x1557,

+    0x5269, 0x5269, 0x1950, 0x526A, 0x526A, 0x19F9, 0x526F, 0x526F, 0x13FA,

+    0x5272, 0x5272, 0x1DE1, 0x5275, 0x5275, 0x1BB6, 0x527D, 0x527D, 0x1D99,

+    0x527F, 0x527F, 0x1C2F, 0x5283, 0x5283, 0x1F0C, 0x5287, 0x5287, 0x0FB2,

+    0x5288, 0x5288, 0x139D, 0x5289, 0x5289, 0x11E1, 0x528D, 0x528D, 0x0E22,

+    0x5291, 0x5291, 0x1A68, 0x5292, 0x5292, 0x0E23, 0x529B, 0x529B, 0x116A,

+    0x529F, 0x529F, 0x0ECD, 0x52A0, 0x52A0, 0x0D70, 0x52A3, 0x52A3, 0x117F,

+    0x52A4, 0x52A4, 0x0FB8, 0x52A9, 0x52A9, 0x1A81, 0x52AA, 0x52AA, 0x1049,

+    0x52AB, 0x52AB, 0x0E28, 0x52BE, 0x52BE, 0x1E17, 0x52C1, 0x52C1, 0x0E51,

+    0x52C3, 0x52C3, 0x1342, 0x52C5, 0x52C5, 0x1CC1, 0x52C7, 0x52C7, 0x1821,

+    0x52C9, 0x52C9, 0x1281, 0x52CD, 0x52CD, 0x0E52, 0x52D2, 0x52D2, 0x11FC,

+    0x52D5, 0x52D5, 0x10EE, 0x52D6, 0x52D6, 0x1855, 0x52D8, 0x52D8, 0x0DB6,

+    0x52D9, 0x52D9, 0x12CC, 0x52DB, 0x52DB, 0x1F2B, 0x52DD, 0x52DD, 0x1635,

+    0x52DE, 0x52DE, 0x119F, 0x52DF, 0x52DF, 0x129E, 0x52E2, 0x52E2, 0x1575,

+    0x52E3, 0x52E3, 0x19DB, 0x52E4, 0x52E4, 0x0FB9, 0x52F3, 0x52F3, 0x1F2C,

+    0x52F5, 0x52F5, 0x115A, 0x52F8, 0x52F8, 0x0F83, 0x52FA, 0x52FA, 0x196E,

+    0x52FB, 0x52FB, 0x0FA9, 0x52FE, 0x52FE, 0x0F3B, 0x52FF, 0x52FF, 0x12F0,

+    0x5305, 0x5305, 0x1D79, 0x5308, 0x5308, 0x1F4F, 0x530D, 0x530D, 0x1D7A,

+    0x530F, 0x530F, 0x1D7B, 0x5310, 0x5310, 0x13D4, 0x5315, 0x5315, 0x143F,

+    0x5316, 0x5316, 0x1EB7, 0x5317, 0x5317, 0x141F, 0x5319, 0x5319, 0x163D,

+    0x5320, 0x5320, 0x1988, 0x5321, 0x5321, 0x0F01, 0x5323, 0x5323, 0x0DCA,

+    0x532A, 0x532A, 0x1440, 0x532F, 0x532F, 0x1EF8, 0x5339, 0x5339, 0x1DB4,

+    0x533F, 0x533F, 0x105C, 0x5340, 0x5340, 0x0F3C, 0x5341, 0x5341, 0x168C,

+    0x5343, 0x5343, 0x1BED, 0x5344, 0x5344, 0x194E, 0x5347, 0x5347, 0x1636,

+    0x5348, 0x5348, 0x17A5, 0x5349, 0x5349, 0x1F3A, 0x534A, 0x534A, 0x132A,

+    0x534D, 0x534D, 0x123F, 0x5351, 0x5351, 0x1441, 0x5352, 0x5352, 0x1AB2,

+    0x5353, 0x5353, 0x1CE3, 0x5354, 0x5354, 0x1E50, 0x5357, 0x5357, 0x1031,

+    0x535A, 0x535A, 0x1317, 0x535C, 0x535C, 0x13D5, 0x535E, 0x535E, 0x13A7,

+    0x5360, 0x5360, 0x1A24, 0x5366, 0x5366, 0x0F0C, 0x5368, 0x5368, 0x154A,

+    0x536F, 0x536F, 0x12C0, 0x5370, 0x5370, 0x192E, 0x5371, 0x5371, 0x188F,

+    0x5374, 0x5374, 0x0D8A, 0x5375, 0x5375, 0x1126, 0x5377, 0x5377, 0x0F84,

+    0x537D, 0x537D, 0x1B0E, 0x537F, 0x537F, 0x0E53, 0x5384, 0x5384, 0x16DB,

+    0x5393, 0x5393, 0x16D0, 0x5398, 0x5398, 0x1207, 0x539A, 0x539A, 0x1F20,

+    0x539F, 0x539F, 0x1870, 0x53A0, 0x53A0, 0x1CA4, 0x53A5, 0x53A5, 0x0F8B,

+    0x53A6, 0x53A6, 0x1DC2, 0x53AD, 0x53AD, 0x1765, 0x53BB, 0x53BB, 0x0E02,

+    0x53C3, 0x53C3, 0x1BAB, 0x53C8, 0x53C8, 0x1839, 0x53C9, 0x53C9, 0x1B84,

+    0x53CA, 0x53CA, 0x0FD4, 0x53CB, 0x53CB, 0x183A, 0x53CD, 0x53CD, 0x132B,

+    0x53D4, 0x53D4, 0x15FC, 0x53D6, 0x53D6, 0x1C94, 0x53D7, 0x53D7, 0x15C0,

+    0x53DB, 0x53DB, 0x132C, 0x53E1, 0x53E1, 0x1790, 0x53E2, 0x53E2, 0x1C53,

+    0x53E3, 0x53E3, 0x0F3D, 0x53E4, 0x53E4, 0x0E91, 0x53E5, 0x53E5, 0x0F3E,

+    0x53E9, 0x53E9, 0x0E92, 0x53EA, 0x53EA, 0x1B1F, 0x53EB, 0x53EB, 0x0F9A,

+    0x53EC, 0x53EC, 0x157C, 0x53ED, 0x53ED, 0x1D4C, 0x53EF, 0x53EF, 0x0D71,

+    0x53F0, 0x53F0, 0x1D08, 0x53F1, 0x53F1, 0x1B68, 0x53F2, 0x53F2, 0x1482,

+    0x53F3, 0x53F3, 0x183B, 0x53F8, 0x53F8, 0x1483, 0x5403, 0x5403, 0x1F57,

+    0x5404, 0x5404, 0x0D8B, 0x5408, 0x5408, 0x1DEF, 0x5409, 0x5409, 0x1020,

+    0x540A, 0x540A, 0x19DC, 0x540C, 0x540C, 0x10EF, 0x540D, 0x540D, 0x128D,

+    0x540E, 0x540E, 0x1F21, 0x540F, 0x540F, 0x1208, 0x5410, 0x5410, 0x1D1A,

+    0x5411, 0x5411, 0x1E1F, 0x541B, 0x541B, 0x0F71, 0x541D, 0x541D, 0x121E,

+    0x541F, 0x541F, 0x18ED, 0x5420, 0x5420, 0x1D6E, 0x5426, 0x5426, 0x13FB,

+    0x5429, 0x5429, 0x1421, 0x542B, 0x542B, 0x1DE4, 0x5433, 0x5433, 0x17A7,

+    0x5438, 0x5438, 0x1F5E, 0x5439, 0x5439, 0x1C95, 0x543B, 0x543B, 0x12E6,

+    0x543C, 0x543C, 0x1F22, 0x543E, 0x543E, 0x17A6, 0x5442, 0x5442, 0x115B,

+    0x5448, 0x5448, 0x1A35, 0x544A, 0x544A, 0x0E93, 0x5451, 0x5451, 0x1CF0,

+    0x5468, 0x5468, 0x1AD3, 0x546A, 0x546A, 0x1AD2, 0x5471, 0x5471, 0x0E94,

+    0x5473, 0x5473, 0x12F3, 0x5475, 0x5475, 0x0D72, 0x547B, 0x547B, 0x166A,

+    0x547C, 0x547C, 0x1E7A, 0x547D, 0x547D, 0x128E, 0x5480, 0x5480, 0x19C2,

+    0x5486, 0x5486, 0x1D7C, 0x548C, 0x548C, 0x1EB8, 0x548E, 0x548E, 0x0F3F,

+    0x5490, 0x5490, 0x13FC, 0x54A4, 0x54A4, 0x1CD5, 0x54A8, 0x54A8, 0x1955,

+    0x54AB, 0x54AB, 0x1B20, 0x54AC, 0x54AC, 0x0F1E, 0x54B3, 0x54B3, 0x1E07,

+    0x54B8, 0x54B8, 0x1DE5, 0x54BD, 0x54BD, 0x192F, 0x54C0, 0x54C0, 0x16D1,

+    0x54C1, 0x54C1, 0x1DA6, 0x54C4, 0x54C4, 0x1EAD, 0x54C8, 0x54C8, 0x1DF0,

+    0x54C9, 0x54C9, 0x19AB, 0x54E1, 0x54E1, 0x1871, 0x54E5, 0x54E5, 0x0D73,

+    0x54E8, 0x54E8, 0x1C30, 0x54ED, 0x54ED, 0x0EB7, 0x54EE, 0x54EE, 0x1F11,

+    0x54F2, 0x54F2, 0x1C00, 0x54FA, 0x54FA, 0x1D7D, 0x5504, 0x5504, 0x1D4F,

+    0x5506, 0x5506, 0x1484, 0x5507, 0x5507, 0x1B44, 0x550E, 0x550E, 0x1209,

+    0x5510, 0x5510, 0x108F, 0x551C, 0x551C, 0x1251, 0x552F, 0x552F, 0x18A9,

+    0x5531, 0x5531, 0x1BB7, 0x5535, 0x5535, 0x16BD, 0x553E, 0x553E, 0x1CD6,

+    0x5544, 0x5544, 0x1CE4, 0x5546, 0x5546, 0x14D7, 0x554F, 0x554F, 0x12E7,

+    0x5553, 0x5553, 0x0E7A, 0x5556, 0x5556, 0x1079, 0x555E, 0x555E, 0x1692,

+    0x5563, 0x5563, 0x1DE6, 0x557C, 0x557C, 0x1A69, 0x5580, 0x5580, 0x0DFB,

+    0x5584, 0x5584, 0x152D, 0x5586, 0x5586, 0x1C01, 0x5587, 0x5587, 0x1116,

+    0x5589, 0x5589, 0x1F23, 0x558A, 0x558A, 0x1DE7, 0x5598, 0x5598, 0x1BEE,

+    0x5599, 0x5599, 0x1F3B, 0x559A, 0x559A, 0x1ECB, 0x559C, 0x559C, 0x1F65,

+    0x559D, 0x559D, 0x0DAD, 0x55A7, 0x55A7, 0x1F36, 0x55A9, 0x55A9, 0x18AA,

+    0x55AA, 0x55AA, 0x14D8, 0x55AB, 0x55AB, 0x1024, 0x55AC, 0x55AC, 0x0F1F,

+    0x55AE, 0x55AE, 0x1063, 0x55C5, 0x55C5, 0x1F24, 0x55C7, 0x55C7, 0x14F5,

+    0x55D4, 0x55D4, 0x1B45, 0x55DA, 0x55DA, 0x17A8, 0x55DC, 0x55DC, 0x0FE2,

+    0x55DF, 0x55DF, 0x1B85, 0x55E3, 0x55E3, 0x1485, 0x55E4, 0x55E4, 0x1CAA,

+    0x55FD, 0x55FD, 0x15C1, 0x55FE, 0x55FE, 0x1AD4, 0x5606, 0x5606, 0x1CF1,

+    0x5609, 0x5609, 0x0D74, 0x5614, 0x5614, 0x0F40, 0x5617, 0x5617, 0x14D9,

+    0x562F, 0x562F, 0x157D, 0x5632, 0x5632, 0x1A82, 0x5634, 0x5634, 0x1C96,

+    0x5636, 0x5636, 0x163E, 0x5653, 0x5653, 0x1E27, 0x5668, 0x5668, 0x0FE3,

+    0x566B, 0x566B, 0x1F66, 0x5674, 0x5674, 0x1422, 0x5686, 0x5686, 0x1F12,

+    0x56A5, 0x56A5, 0x1744, 0x56AC, 0x56AC, 0x1467, 0x56AE, 0x56AE, 0x1E20,

+    0x56B4, 0x56B4, 0x1727, 0x56BC, 0x56BC, 0x196F, 0x56CA, 0x56CA, 0x1038,

+    0x56CD, 0x56CD, 0x1F67, 0x56D1, 0x56D1, 0x1C4A, 0x56DA, 0x56DA, 0x15C2,

+    0x56DB, 0x56DB, 0x1486, 0x56DE, 0x56DE, 0x1EF9, 0x56E0, 0x56E0, 0x1930,

+    0x56F0, 0x56F0, 0x0EBE, 0x56F9, 0x56F9, 0x118B, 0x56FA, 0x56FA, 0x0E95,

+    0x5703, 0x5703, 0x1D7E, 0x5704, 0x5704, 0x170E, 0x5708, 0x5708, 0x0F85,

+    0x570B, 0x570B, 0x0F6B, 0x570D, 0x570D, 0x1890, 0x5712, 0x5712, 0x1873,

+    0x5713, 0x5713, 0x1872, 0x5716, 0x5716, 0x10B0, 0x5718, 0x5718, 0x1064,

+    0x571F, 0x571F, 0x1D1B, 0x5728, 0x5728, 0x19AC, 0x572D, 0x572D, 0x0F9B,

+    0x5730, 0x5730, 0x1B21, 0x573B, 0x573B, 0x0FE4, 0x5740, 0x5740, 0x1B22,

+    0x5742, 0x5742, 0x1D43, 0x5747, 0x5747, 0x0FAA, 0x574A, 0x574A, 0x134F,

+    0x574D, 0x574D, 0x107A, 0x574E, 0x574E, 0x0DB7, 0x5750, 0x5750, 0x1AC7,

+    0x5751, 0x5751, 0x0DFD, 0x5761, 0x5761, 0x1D32, 0x5764, 0x5764, 0x0EBF,

+    0x5766, 0x5766, 0x1CF2, 0x576A, 0x576A, 0x1D69, 0x576E, 0x576E, 0x109C,

+    0x5770, 0x5770, 0x0E54, 0x5775, 0x5775, 0x0F41, 0x577C, 0x577C, 0x1CE5,

+    0x5782, 0x5782, 0x15C3, 0x5788, 0x5788, 0x109B, 0x578B, 0x578B, 0x1E5E,

+    0x5793, 0x5793, 0x1E08, 0x57A0, 0x57A0, 0x18E5, 0x57A2, 0x57A2, 0x0F42,

+    0x57A3, 0x57A3, 0x1874, 0x57C3, 0x57C3, 0x16D2, 0x57C7, 0x57C7, 0x1822,

+    0x57C8, 0x57C8, 0x1AF9, 0x57CB, 0x57CB, 0x1264, 0x57CE, 0x57CE, 0x1562,

+    0x57DF, 0x57DF, 0x173C, 0x57E0, 0x57E0, 0x13FD, 0x57F0, 0x57F0, 0x1BCB,

+    0x57F4, 0x57F4, 0x1658, 0x57F7, 0x57F7, 0x1B78, 0x57F9, 0x57F9, 0x136B,

+    0x57FA, 0x57FA, 0x0FE5, 0x57FC, 0x57FC, 0x0FE6, 0x5800, 0x5800, 0x0F77,

+    0x5802, 0x5802, 0x1090, 0x5805, 0x5805, 0x0E35, 0x5806, 0x5806, 0x1D23,

+    0x5808, 0x5808, 0x0DD1, 0x5809, 0x5809, 0x18D3, 0x580A, 0x580A, 0x16A1,

+    0x581E, 0x581E, 0x1C13, 0x5821, 0x5821, 0x13C3, 0x5824, 0x5824, 0x1A6A,

+    0x5827, 0x5827, 0x1745, 0x582A, 0x582A, 0x0DB8, 0x582F, 0x582F, 0x17FE,

+    0x5830, 0x5830, 0x171E, 0x5831, 0x5831, 0x13C4, 0x5834, 0x5834, 0x1989,

+    0x5835, 0x5835, 0x10B1, 0x583A, 0x583A, 0x0E7B, 0x584A, 0x584A, 0x0F11,

+    0x584B, 0x584B, 0x1772, 0x584F, 0x584F, 0x0DEC, 0x5851, 0x5851, 0x157E,

+    0x5854, 0x5854, 0x1D00, 0x5857, 0x5857, 0x10B2, 0x5858, 0x5858, 0x1091,

+    0x585A, 0x585A, 0x1C54, 0x585E, 0x585E, 0x14F2, 0x5861, 0x5861, 0x19FA,

+    0x5862, 0x5862, 0x17A9, 0x5864, 0x5864, 0x1F2D, 0x5875, 0x5875, 0x1B46,

+    0x5879, 0x5879, 0x1BAC, 0x587C, 0x587C, 0x19FB, 0x587E, 0x587E, 0x15FD,

+    0x5883, 0x5883, 0x0E55, 0x5885, 0x5885, 0x14FD, 0x5889, 0x5889, 0x1823,

+    0x5893, 0x5893, 0x12C1, 0x589C, 0x589C, 0x1C61, 0x589E, 0x589E, 0x1B13,

+    0x589F, 0x589F, 0x1E28, 0x58A8, 0x58A8, 0x12E2, 0x58A9, 0x58A9, 0x10DF,

+    0x58AE, 0x58AE, 0x1CD7, 0x58B3, 0x58B3, 0x1423, 0x58BA, 0x58BA, 0x17AA,

+    0x58BB, 0x58BB, 0x198A, 0x58BE, 0x58BE, 0x0D96, 0x58C1, 0x58C1, 0x139E,

+    0x58C5, 0x58C5, 0x17CA, 0x58C7, 0x58C7, 0x1065, 0x58CE, 0x58CE, 0x1F2E,

+    0x58D1, 0x58D1, 0x1DCE, 0x58D3, 0x58D3, 0x16C5, 0x58D5, 0x58D5, 0x1E7B,

+    0x58D8, 0x58D8, 0x11D4, 0x58D9, 0x58D9, 0x0F02, 0x58DE, 0x58DE, 0x0F12,

+    0x58DF, 0x58DF, 0x11B8, 0x58E4, 0x58E4, 0x16F8, 0x58EB, 0x58EB, 0x1487,

+    0x58EC, 0x58EC, 0x1946, 0x58EF, 0x58EF, 0x198B, 0x58F9, 0x58F9, 0x193F,

+    0x58FA, 0x58FA, 0x1E7C, 0x58FB, 0x58FB, 0x14FE, 0x58FD, 0x58FD, 0x15C4,

+    0x590F, 0x590F, 0x1DC3, 0x5914, 0x5914, 0x0FE7, 0x5915, 0x5915, 0x151B,

+    0x5916, 0x5916, 0x17F7, 0x5919, 0x5919, 0x15FE, 0x591A, 0x591A, 0x105E,

+    0x591C, 0x591C, 0x16E9, 0x5922, 0x5922, 0x12BD, 0x5927, 0x5927, 0x109D,

+    0x5929, 0x5929, 0x1BEF, 0x592A, 0x592A, 0x1D09, 0x592B, 0x592B, 0x13FE,

+    0x592D, 0x592D, 0x17FF, 0x592E, 0x592E, 0x16CA, 0x5931, 0x5931, 0x167E,

+    0x5937, 0x5937, 0x1910, 0x593E, 0x593E, 0x1E51, 0x5944, 0x5944, 0x1728,

+    0x5947, 0x5947, 0x0FE8, 0x5948, 0x5948, 0x103C, 0x5949, 0x5949, 0x13E6,

+    0x594E, 0x594E, 0x0F9C, 0x594F, 0x594F, 0x1AD5, 0x5950, 0x5950, 0x1ECC,

+    0x5951, 0x5951, 0x0E7C, 0x5954, 0x5954, 0x1424, 0x5955, 0x5955, 0x1E32,

+    0x5957, 0x5957, 0x1D2A, 0x595A, 0x595A, 0x1E09, 0x5960, 0x5960, 0x19FC,

+    0x5962, 0x5962, 0x1488, 0x5967, 0x5967, 0x17AB, 0x596A, 0x596A, 0x1CFA,

+    0x596B, 0x596B, 0x18D8, 0x596C, 0x596C, 0x198C, 0x596D, 0x596D, 0x151C,

+    0x596E, 0x596E, 0x1425, 0x5973, 0x5973, 0x103F, 0x5974, 0x5974, 0x104A,

+    0x5978, 0x5978, 0x0D97, 0x597D, 0x597D, 0x1E7D, 0x5982, 0x5982, 0x1730,

+    0x5983, 0x5983, 0x1442, 0x5984, 0x5984, 0x1259, 0x598A, 0x598A, 0x1947,

+    0x5993, 0x5993, 0x0FE9, 0x5996, 0x5996, 0x1800, 0x5997, 0x5997, 0x0FC7,

+    0x5999, 0x5999, 0x12C2, 0x59A5, 0x59A5, 0x1CD8, 0x59A8, 0x59A8, 0x1350,

+    0x59AC, 0x59AC, 0x1D2B, 0x59B9, 0x59B9, 0x1265, 0x59BB, 0x59BB, 0x1BDB,

+    0x59BE, 0x59BE, 0x1C14, 0x59C3, 0x59C3, 0x1A36, 0x59C6, 0x59C6, 0x129F,

+    0x59C9, 0x59C9, 0x1956, 0x59CB, 0x59CB, 0x163F, 0x59D0, 0x59D0, 0x19C3,

+    0x59D1, 0x59D1, 0x0E96, 0x59D3, 0x59D3, 0x1563, 0x59D4, 0x59D4, 0x1891,

+    0x59D9, 0x59D9, 0x1948, 0x59DA, 0x59DA, 0x1801, 0x59DC, 0x59DC, 0x0DD2,

+    0x59DD, 0x59DD, 0x1AD0, 0x59E6, 0x59E6, 0x0D98, 0x59E8, 0x59E8, 0x1911,

+    0x59EA, 0x59EA, 0x1B69, 0x59EC, 0x59EC, 0x1F68, 0x59EE, 0x59EE, 0x1DF8,

+    0x59F8, 0x59F8, 0x1746, 0x59FB, 0x59FB, 0x1931, 0x59FF, 0x59FF, 0x1957,

+    0x5A01, 0x5A01, 0x1892, 0x5A03, 0x5A03, 0x17F4, 0x5A11, 0x5A11, 0x1489,

+    0x5A18, 0x5A18, 0x1039, 0x5A1B, 0x5A1B, 0x17AC, 0x5A1C, 0x5A1C, 0x1026,

+    0x5A1F, 0x5A1F, 0x1747, 0x5A20, 0x5A20, 0x166B, 0x5A25, 0x5A25, 0x1693,

+    0x5A29, 0x5A29, 0x1240, 0x5A36, 0x5A36, 0x1C97, 0x5A3C, 0x5A3C, 0x1BB8,

+    0x5A41, 0x5A41, 0x11D5, 0x5A46, 0x5A46, 0x1D33, 0x5A49, 0x5A49, 0x17DB,

+    0x5A5A, 0x5A5A, 0x1EA4, 0x5A62, 0x5A62, 0x1443, 0x5A66, 0x5A66, 0x13FF,

+    0x5A92, 0x5A92, 0x1266, 0x5A9A, 0x5A9A, 0x12F4, 0x5A9B, 0x5A9B, 0x1875,

+    0x5AA4, 0x5AA4, 0x1640, 0x5AC1, 0x5AC1, 0x0D75, 0x5AC2, 0x5AC2, 0x15C5,

+    0x5AC4, 0x5AC4, 0x1876, 0x5AC9, 0x5AC9, 0x1B6A, 0x5ACC, 0x5ACC, 0x1E4E,

+    0x5AE1, 0x5AE1, 0x19DD, 0x5AE6, 0x5AE6, 0x1DF9, 0x5AE9, 0x5AE9, 0x1055,

+    0x5B05, 0x5B05, 0x1EB9, 0x5B09, 0x5B09, 0x1F69, 0x5B0B, 0x5B0B, 0x152E,

+    0x5B0C, 0x5B0C, 0x0F20, 0x5B16, 0x5B16, 0x1D6F, 0x5B2A, 0x5B2A, 0x1468,

+    0x5B40, 0x5B40, 0x14DA, 0x5B43, 0x5B43, 0x16F9, 0x5B50, 0x5B50, 0x1958,

+    0x5B51, 0x5B51, 0x1E4A, 0x5B54, 0x5B54, 0x0ECE, 0x5B55, 0x5B55, 0x1951,

+    0x5B57, 0x5B57, 0x1959, 0x5B58, 0x5B58, 0x1AB0, 0x5B5A, 0x5B5A, 0x1400,

+    0x5B5C, 0x5B5C, 0x195A, 0x5B5D, 0x5B5D, 0x1F13, 0x5B5F, 0x5B5F, 0x1277,

+    0x5B63, 0x5B63, 0x0E7D, 0x5B64, 0x5B64, 0x0E97, 0x5B69, 0x5B69, 0x1E0A,

+    0x5B6B, 0x5B6B, 0x15AA, 0x5B70, 0x5B70, 0x15FF, 0x5B71, 0x5B71, 0x197A,

+    0x5B75, 0x5B75, 0x1401, 0x5B78, 0x5B78, 0x1DCF, 0x5B7A, 0x5B7A, 0x18AB,

+    0x5B7C, 0x5B7C, 0x1723, 0x5B85, 0x5B85, 0x10AA, 0x5B87, 0x5B87, 0x183C,

+    0x5B88, 0x5B88, 0x15C6, 0x5B89, 0x5B89, 0x16AF, 0x5B8B, 0x5B8B, 0x15B1,

+    0x5B8C, 0x5B8C, 0x17DC, 0x5B8F, 0x5B8F, 0x0F18, 0x5B93, 0x5B93, 0x13D6,

+    0x5B95, 0x5B95, 0x1D03, 0x5B96, 0x5B96, 0x1F0E, 0x5B97, 0x5B97, 0x1AB6,

+    0x5B98, 0x5B98, 0x0EEC, 0x5B99, 0x5B99, 0x1AD6, 0x5B9A, 0x5B9A, 0x1A37,

+    0x5B9B, 0x5B9B, 0x17DD, 0x5B9C, 0x5B9C, 0x18FD, 0x5BA2, 0x5BA2, 0x0DFC,

+    0x5BA3, 0x5BA3, 0x152F, 0x5BA4, 0x5BA4, 0x167F, 0x5BA5, 0x5BA5, 0x18AC,

+    0x5BA6, 0x5BA6, 0x1ECD, 0x5BAC, 0x5BAC, 0x1564, 0x5BAE, 0x5BAE, 0x0F7B,

+    0x5BB0, 0x5BB0, 0x19AD, 0x5BB3, 0x5BB3, 0x1E0B, 0x5BB4, 0x5BB4, 0x1748,

+    0x5BB5, 0x5BB5, 0x157F, 0x5BB6, 0x5BB6, 0x0D76, 0x5BB8, 0x5BB8, 0x166C,

+    0x5BB9, 0x5BB9, 0x1824, 0x5BBF, 0x5BBF, 0x1600, 0x5BC0, 0x5BC0, 0x1BCC,

+    0x5BC2, 0x5BC2, 0x19DE, 0x5BC3, 0x5BC3, 0x1877, 0x5BC4, 0x5BC4, 0x0FEA,

+    0x5BC5, 0x5BC5, 0x1932, 0x5BC6, 0x5BC6, 0x1313, 0x5BC7, 0x5BC7, 0x0F43,

+    0x5BCC, 0x5BCC, 0x1402, 0x5BD0, 0x5BD0, 0x1267, 0x5BD2, 0x5BD2, 0x1DD3,

+    0x5BD3, 0x5BD3, 0x183D, 0x5BD4, 0x5BD4, 0x1659, 0x5BD7, 0x5BD7, 0x1048,

+    0x5BDE, 0x5BDE, 0x1238, 0x5BDF, 0x5BDF, 0x1BA6, 0x5BE1, 0x5BE1, 0x0EDB,

+    0x5BE2, 0x5BE2, 0x1CC8, 0x5BE4, 0x5BE4, 0x17AD, 0x5BE5, 0x5BE5, 0x1802,

+    0x5BE6, 0x5BE6, 0x1680, 0x5BE7, 0x5BE7, 0x1047, 0x5BE8, 0x5BE8, 0x1BCD,

+    0x5BE9, 0x5BE9, 0x1682, 0x5BEB, 0x5BEB, 0x148A, 0x5BEC, 0x5BEC, 0x0EED,

+    0x5BEE, 0x5BEE, 0x11C9, 0x5BEF, 0x5BEF, 0x1AFA, 0x5BF5, 0x5BF5, 0x1C55,

+    0x5BF6, 0x5BF6, 0x13C5, 0x5BF8, 0x5BF8, 0x1C4F, 0x5BFA, 0x5BFA, 0x148B,

+    0x5C01, 0x5C01, 0x13E7, 0x5C04, 0x5C04, 0x148C, 0x5C07, 0x5C07, 0x198D,

+    0x5C08, 0x5C08, 0x19FD, 0x5C09, 0x5C09, 0x1893, 0x5C0A, 0x5C0A, 0x1AB1,

+    0x5C0B, 0x5C0B, 0x1683, 0x5C0D, 0x5C0D, 0x109E, 0x5C0E, 0x5C0E, 0x10B3,

+    0x5C0F, 0x5C0F, 0x1580, 0x5C11, 0x5C11, 0x1581, 0x5C16, 0x5C16, 0x1C0A,

+    0x5C19, 0x5C19, 0x14DB, 0x5C24, 0x5C24, 0x183E, 0x5C28, 0x5C28, 0x1351,

+    0x5C31, 0x5C31, 0x1C98, 0x5C38, 0x5C38, 0x1641, 0x5C39, 0x5C39, 0x18D9,

+    0x5C3A, 0x5C3A, 0x1BE0, 0x5C3B, 0x5C3B, 0x0E98, 0x5C3C, 0x5C3C, 0x105A,

+    0x5C3E, 0x5C3E, 0x12F5, 0x5C3F, 0x5C3F, 0x1054, 0x5C40, 0x5C40, 0x0F6C,

+    0x5C45, 0x5C45, 0x0E03, 0x5C46, 0x5C46, 0x0E7E, 0x5C48, 0x5C48, 0x0F78,

+    0x5C4B, 0x5C4B, 0x17BE, 0x5C4D, 0x5C4D, 0x1643, 0x5C4E, 0x5C4E, 0x1642,

+    0x5C51, 0x5C51, 0x154B, 0x5C55, 0x5C55, 0x19FE, 0x5C5B, 0x5C5B, 0x13B4,

+    0x5C60, 0x5C60, 0x10B4, 0x5C62, 0x5C62, 0x11D6, 0x5C64, 0x5C64, 0x1CA7,

+    0x5C65, 0x5C65, 0x120A, 0x5C6C, 0x5C6C, 0x15A2, 0x5C6F, 0x5C6F, 0x1106,

+    0x5C71, 0x5C71, 0x14B9, 0x5C79, 0x5C79, 0x1F58, 0x5C90, 0x5C90, 0x0FEB,

+    0x5C91, 0x5C91, 0x197F, 0x5CA1, 0x5CA1, 0x0DD3, 0x5CA9, 0x5CA9, 0x16BE,

+    0x5CAB, 0x5CAB, 0x15C7, 0x5CAC, 0x5CAC, 0x0DCB, 0x5CB1, 0x5CB1, 0x109F,

+    0x5CB3, 0x5CB3, 0x16A2, 0x5CB5, 0x5CB5, 0x1E7E, 0x5CB7, 0x5CB7, 0x1306,

+    0x5CB8, 0x5CB8, 0x16B0, 0x5CBA, 0x5CBA, 0x118C, 0x5CBE, 0x5CBE, 0x1A25,

+    0x5CC0, 0x5CC0, 0x15C8, 0x5CD9, 0x5CD9, 0x1CAB, 0x5CE0, 0x5CE0, 0x14DC,

+    0x5CE8, 0x5CE8, 0x1694, 0x5CEF, 0x5CF0, 0x13E8, 0x5CF4, 0x5CF4, 0x1E37,

+    0x5CF6, 0x5CF6, 0x10B5, 0x5CFB, 0x5CFB, 0x1AFB, 0x5CFD, 0x5CFD, 0x1E52,

+    0x5D07, 0x5D07, 0x1627, 0x5D0D, 0x5D0D, 0x1145, 0x5D0E, 0x5D0E, 0x0FEC,

+    0x5D11, 0x5D11, 0x0EC0, 0x5D14, 0x5D14, 0x1C5F, 0x5D16, 0x5D16, 0x16D3,

+    0x5D17, 0x5D17, 0x0DD4, 0x5D19, 0x5D19, 0x11F4, 0x5D27, 0x5D27, 0x1628,

+    0x5D29, 0x5D29, 0x1437, 0x5D4B, 0x5D4B, 0x12F6, 0x5D4C, 0x5D4C, 0x0DB9,

+    0x5D50, 0x5D50, 0x112F, 0x5D69, 0x5D69, 0x1629, 0x5D6C, 0x5D6C, 0x17F8,

+    0x5D6F, 0x5D6F, 0x1B86, 0x5D87, 0x5D87, 0x0F44, 0x5D8B, 0x5D8B, 0x10B6,

+    0x5D9D, 0x5D9D, 0x110D, 0x5DA0, 0x5DA0, 0x0F21, 0x5DA2, 0x5DA2, 0x1803,

+    0x5DAA, 0x5DAA, 0x172B, 0x5DB8, 0x5DB8, 0x1773, 0x5DBA, 0x5DBA, 0x118D,

+    0x5DBC, 0x5DBC, 0x14FF, 0x5DBD, 0x5DBD, 0x16A3, 0x5DCD, 0x5DCD, 0x17F9,

+    0x5DD2, 0x5DD2, 0x1241, 0x5DD6, 0x5DD6, 0x16BF, 0x5DDD, 0x5DDD, 0x1BF0,

+    0x5DDE, 0x5DDE, 0x1AD7, 0x5DE1, 0x5DE1, 0x1608, 0x5DE2, 0x5DE2, 0x1582,

+    0x5DE5, 0x5DE5, 0x0ECF, 0x5DE6, 0x5DE6, 0x1AC8, 0x5DE7, 0x5DE7, 0x0F22,

+    0x5DE8, 0x5DE8, 0x0E04, 0x5DEB, 0x5DEB, 0x12CD, 0x5DEE, 0x5DEE, 0x1B87,

+    0x5DF1, 0x5DF1, 0x0FED, 0x5DF2, 0x5DF2, 0x1912, 0x5DF3, 0x5DF3, 0x148D,

+    0x5DF4, 0x5DF4, 0x1D34, 0x5DF7, 0x5DF7, 0x1DFA, 0x5DFD, 0x5DFD, 0x15AB,

+    0x5DFE, 0x5DFE, 0x0E14, 0x5E02, 0x5E02, 0x1644, 0x5E03, 0x5E03, 0x1D7F,

+    0x5E06, 0x5E06, 0x1392, 0x5E0C, 0x5E0C, 0x1F6A, 0x5E11, 0x5E11, 0x1D04,

+    0x5E16, 0x5E16, 0x1C15, 0x5E19, 0x5E19, 0x1B6B, 0x5E1B, 0x5E1B, 0x137E,

+    0x5E1D, 0x5E1D, 0x1A6B, 0x5E25, 0x5E25, 0x15C9, 0x5E2B, 0x5E2B, 0x148E,

+    0x5E2D, 0x5E2D, 0x151D, 0x5E33, 0x5E33, 0x198E, 0x5E36, 0x5E36, 0x10A0,

+    0x5E38, 0x5E38, 0x14DD, 0x5E3D, 0x5E3D, 0x12A0, 0x5E3F, 0x5E3F, 0x1F25,

+    0x5E40, 0x5E40, 0x1A38, 0x5E44, 0x5E44, 0x16A4, 0x5E45, 0x5E45, 0x1D93,

+    0x5E47, 0x5E47, 0x1352, 0x5E4C, 0x5E4C, 0x1EE1, 0x5E55, 0x5E55, 0x1239,

+    0x5E5F, 0x5E5F, 0x1CAC, 0x5E61, 0x5E61, 0x1384, 0x5E62, 0x5E62, 0x1092,

+    0x5E63, 0x5E63, 0x1D70, 0x5E72, 0x5E72, 0x0D99, 0x5E73, 0x5E73, 0x1D6A,

+    0x5E74, 0x5E74, 0x1040, 0x5E77, 0x5E77, 0x13B5, 0x5E78, 0x5E78, 0x1E1A,

+    0x5E79, 0x5E79, 0x0D9A, 0x5E7B, 0x5E7B, 0x1ECE, 0x5E7C, 0x5E7D, 0x18AD,

+    0x5E7E, 0x5E7E, 0x0FEE, 0x5E84, 0x5E84, 0x198F, 0x5E87, 0x5E87, 0x1444,

+    0x5E8A, 0x5E8A, 0x14DE, 0x5E8F, 0x5E8F, 0x1500, 0x5E95, 0x5E95, 0x19C4,

+    0x5E97, 0x5E97, 0x1A26, 0x5E9A, 0x5E9A, 0x0E56, 0x5E9C, 0x5E9C, 0x1403,

+    0x5EA0, 0x5EA0, 0x14DF, 0x5EA6, 0x5EA6, 0x10B7, 0x5EA7, 0x5EA7, 0x1AC9,

+    0x5EAB, 0x5EAB, 0x0E99, 0x5EAD, 0x5EAD, 0x1A39, 0x5EB5, 0x5EB5, 0x16C0,

+    0x5EB6, 0x5EB6, 0x1501, 0x5EB7, 0x5EB7, 0x0DD5, 0x5EB8, 0x5EB8, 0x1825,

+    0x5EBE, 0x5EBE, 0x18AF, 0x5EC2, 0x5EC2, 0x14E0, 0x5EC8, 0x5EC8, 0x1DC4,

+    0x5EC9, 0x5EC9, 0x1183, 0x5ECA, 0x5ECA, 0x113C, 0x5ED0, 0x5ED0, 0x0F45,

+    0x5ED3, 0x5ED3, 0x0EE7, 0x5ED6, 0x5ED6, 0x11CA, 0x5EDA, 0x5EDA, 0x1AD8,

+    0x5EDB, 0x5EDB, 0x19FF, 0x5EDF, 0x5EDF, 0x12C3, 0x5EE0, 0x5EE0, 0x1BB9,

+    0x5EE2, 0x5EE2, 0x1D71, 0x5EE3, 0x5EE3, 0x0F03, 0x5EEC, 0x5EEC, 0x115C,

+    0x5EF3, 0x5EF3, 0x1C1D, 0x5EF6, 0x5EF6, 0x1749, 0x5EF7, 0x5EF7, 0x1A3A,

+    0x5EFA, 0x5EFA, 0x0E15, 0x5EFB, 0x5EFB, 0x1EFA, 0x5F01, 0x5F01, 0x13A8,

+    0x5F04, 0x5F04, 0x11B9, 0x5F0A, 0x5F0A, 0x1D72, 0x5F0F, 0x5F0F, 0x165A,

+    0x5F11, 0x5F11, 0x1645, 0x5F13, 0x5F13, 0x0F7C, 0x5F14, 0x5F14, 0x1A83,

+    0x5F15, 0x5F15, 0x1933, 0x5F17, 0x5F17, 0x1434, 0x5F18, 0x5F18, 0x1EAE,

+    0x5F1B, 0x5F1B, 0x1913, 0x5F1F, 0x5F1F, 0x1A6C, 0x5F26, 0x5F26, 0x1E38,

+    0x5F27, 0x5F27, 0x1E7F, 0x5F29, 0x5F29, 0x104B, 0x5F31, 0x5F31, 0x16F0,

+    0x5F35, 0x5F35, 0x1990, 0x5F3A, 0x5F3A, 0x0DD6, 0x5F3C, 0x5F3C, 0x1DB5,

+    0x5F48, 0x5F48, 0x1CF3, 0x5F4A, 0x5F4A, 0x0DD7, 0x5F4C, 0x5F4C, 0x12F7,

+    0x5F4E, 0x5F4E, 0x1242, 0x5F56, 0x5F56, 0x1066, 0x5F57, 0x5F57, 0x1E70,

+    0x5F59, 0x5F59, 0x1F3D, 0x5F5B, 0x5F5B, 0x1914, 0x5F62, 0x5F62, 0x1E5F,

+    0x5F66, 0x5F66, 0x171F, 0x5F67, 0x5F67, 0x1856, 0x5F69, 0x5F69, 0x1BCE,

+    0x5F6A, 0x5F6A, 0x1D9A, 0x5F6B, 0x5F6B, 0x1A84, 0x5F6C, 0x5F6C, 0x1469,

+    0x5F6D, 0x5F6D, 0x1D59, 0x5F70, 0x5F70, 0x1BBA, 0x5F71, 0x5F71, 0x1774,

+    0x5F77, 0x5F77, 0x1353, 0x5F79, 0x5F79, 0x173D, 0x5F7C, 0x5F7C, 0x1DAD,

+    0x5F7F, 0x5F7F, 0x1435, 0x5F80, 0x5F80, 0x17EE, 0x5F81, 0x5F81, 0x1A3B,

+    0x5F85, 0x5F85, 0x10A1, 0x5F87, 0x5F87, 0x1609, 0x5F8A, 0x5F8A, 0x1EFB,

+    0x5F8B, 0x5F8B, 0x11F8, 0x5F8C, 0x5F8C, 0x1F26, 0x5F90, 0x5F90, 0x1502,

+    0x5F91, 0x5F91, 0x0E57, 0x5F92, 0x5F92, 0x10B8, 0x5F97, 0x5F97, 0x110C,

+    0x5F98, 0x5F98, 0x136C, 0x5F99, 0x5F99, 0x148F, 0x5F9E, 0x5F9E, 0x1AB7,

+    0x5FA0, 0x5FA0, 0x1146, 0x5FA1, 0x5FA1, 0x170F, 0x5FA8, 0x5FA8, 0x1EE2,

+    0x5FA9, 0x5FA9, 0x13D7, 0x5FAA, 0x5FAA, 0x160A, 0x5FAE, 0x5FAE, 0x12F8,

+    0x5FB5, 0x5FB5, 0x1B7E, 0x5FB7, 0x5FB7, 0x10AB, 0x5FB9, 0x5FB9, 0x1C02,

+    0x5FBD, 0x5FBD, 0x1F3E, 0x5FC3, 0x5FC3, 0x1684, 0x5FC5, 0x5FC5, 0x1DB6,

+    0x5FCC, 0x5FCC, 0x0FEF, 0x5FCD, 0x5FCD, 0x1934, 0x5FD6, 0x5FD6, 0x1C50,

+    0x5FD7, 0x5FD7, 0x1B23, 0x5FD8, 0x5FD9, 0x125A, 0x5FE0, 0x5FE0, 0x1C8B,

+    0x5FEB, 0x5FEB, 0x1CD3, 0x5FF5, 0x5FF5, 0x1043, 0x5FFD, 0x5FFD, 0x1EAA,

+    0x5FFF, 0x5FFF, 0x1426, 0x600F, 0x600F, 0x16CB, 0x6012, 0x6012, 0x104C,

+    0x6016, 0x6016, 0x1D80, 0x601C, 0x601C, 0x118E, 0x601D, 0x601D, 0x1490,

+    0x6020, 0x6020, 0x1D0A, 0x6021, 0x6021, 0x1915, 0x6025, 0x6025, 0x0FD5,

+    0x6027, 0x6027, 0x1565, 0x6028, 0x6028, 0x1878, 0x602A, 0x602A, 0x0F13,

+    0x602F, 0x602F, 0x0E29, 0x6041, 0x6041, 0x1949, 0x6042, 0x6042, 0x160B,

+    0x6043, 0x6043, 0x1646, 0x604D, 0x604D, 0x1EE3, 0x6050, 0x6050, 0x0ED0,

+    0x6052, 0x6052, 0x1DFB, 0x6055, 0x6055, 0x1503, 0x6059, 0x6059, 0x16FA,

+    0x605D, 0x605D, 0x0EFC, 0x6062, 0x6062, 0x1EFC, 0x6063, 0x6063, 0x195B,

+    0x6064, 0x6064, 0x1F4A, 0x6065, 0x6065, 0x1CAD, 0x6068, 0x6068, 0x1DD4,

+    0x6069, 0x6069, 0x18E6, 0x606A, 0x606A, 0x0D8C, 0x606C, 0x606C, 0x1044,

+    0x606D, 0x606D, 0x0ED1, 0x606F, 0x606F, 0x165B, 0x6070, 0x6070, 0x1F5F,

+    0x6085, 0x6085, 0x1761, 0x6089, 0x6089, 0x1681, 0x608C, 0x608C, 0x1A6D,

+    0x608D, 0x608D, 0x1DD5, 0x6094, 0x6094, 0x1EFD, 0x6096, 0x6096, 0x1D50,

+    0x609A, 0x609A, 0x15B2, 0x609B, 0x609B, 0x1A00, 0x609F, 0x609F, 0x17AE,

+    0x60A0, 0x60A0, 0x18B0, 0x60A3, 0x60A3, 0x1ECF, 0x60A4, 0x60A4, 0x1C56,

+    0x60A7, 0x60A7, 0x120B, 0x60B0, 0x60B0, 0x1AB8, 0x60B2, 0x60B2, 0x1445,

+    0x60B3, 0x60B3, 0x10AC, 0x60B4, 0x60B4, 0x1C90, 0x60B6, 0x60B6, 0x1307,

+    0x60B8, 0x60B8, 0x0E7F, 0x60BC, 0x60BC, 0x10B9, 0x60BD, 0x60BD, 0x1BDC,

+    0x60C5, 0x60C5, 0x1A3C, 0x60C7, 0x60C7, 0x10E0, 0x60D1, 0x60D1, 0x1EA1,

+    0x60DA, 0x60DA, 0x1EAB, 0x60DC, 0x60DC, 0x151E, 0x60DF, 0x60DF, 0x18B1,

+    0x60E0, 0x60E0, 0x1E71, 0x60E1, 0x60E1, 0x16A5, 0x60F0, 0x60F0, 0x1CD9,

+    0x60F1, 0x60F1, 0x1052, 0x60F3, 0x60F3, 0x14E1, 0x60F6, 0x60F6, 0x1EE4,

+    0x60F9, 0x60F9, 0x16EA, 0x60FA, 0x60FA, 0x1566, 0x60FB, 0x60FB, 0x1CA5,

+    0x6101, 0x6101, 0x15CA, 0x6106, 0x6106, 0x0E16, 0x6108, 0x6109, 0x18B2,

+    0x610D, 0x610D, 0x1308, 0x610E, 0x610E, 0x1D5D, 0x610F, 0x610F, 0x18FE,

+    0x6115, 0x6115, 0x16A6, 0x611A, 0x611A, 0x183F, 0x611B, 0x611B, 0x16D4,

+    0x611F, 0x611F, 0x0DBA, 0x6127, 0x6127, 0x0F14, 0x6130, 0x6130, 0x1EE5,

+    0x6134, 0x6134, 0x1BBB, 0x6137, 0x6137, 0x0DED, 0x613C, 0x613C, 0x166D,

+    0x613E, 0x613E, 0x0DEE, 0x613F, 0x613F, 0x1879, 0x6142, 0x6142, 0x1826,

+    0x6144, 0x6144, 0x11F9, 0x6147, 0x6147, 0x18E7, 0x6148, 0x6148, 0x195C,

+    0x614A, 0x614A, 0x0E47, 0x614B, 0x614B, 0x1D0B, 0x614C, 0x614C, 0x1EE6,

+    0x6153, 0x6153, 0x1D9B, 0x6155, 0x6155, 0x12A1, 0x6158, 0x6159, 0x1BAD,

+    0x615D, 0x615D, 0x1D2F, 0x615F, 0x615F, 0x1D1D, 0x6162, 0x6162, 0x1243,

+    0x6163, 0x6163, 0x0EEE, 0x6164, 0x6164, 0x0D8D, 0x6167, 0x6167, 0x1E72,

+    0x6168, 0x6168, 0x0DEF, 0x616B, 0x616B, 0x1AB9, 0x616E, 0x616E, 0x115D,

+    0x6170, 0x6170, 0x1894, 0x6176, 0x6176, 0x0E58, 0x6177, 0x6177, 0x0DD8,

+    0x617D, 0x617D, 0x1BE1, 0x617E, 0x617E, 0x1818, 0x6181, 0x6181, 0x1C57,

+    0x6182, 0x6182, 0x1840, 0x618A, 0x618A, 0x1446, 0x618E, 0x618E, 0x1B14,

+    0x6190, 0x6190, 0x1171, 0x6191, 0x6191, 0x1475, 0x6194, 0x6194, 0x1C31,

+    0x6198, 0x6198, 0x1F6C, 0x6199, 0x6199, 0x1F6B, 0x619A, 0x619A, 0x1CF4,

+    0x61A4, 0x61A4, 0x1427, 0x61A7, 0x61A7, 0x10F0, 0x61A9, 0x61A9, 0x0E2C,

+    0x61AB, 0x61AB, 0x1309, 0x61AC, 0x61AC, 0x0E59, 0x61AE, 0x61AE, 0x12CE,

+    0x61B2, 0x61B2, 0x1E2B, 0x61B6, 0x61B6, 0x1719, 0x61BA, 0x61BA, 0x107B,

+    0x61BE, 0x61BE, 0x0DBB, 0x61C3, 0x61C3, 0x0FBA, 0x61C7, 0x61C7, 0x0D9B,

+    0x61C8, 0x61C8, 0x1E0C, 0x61C9, 0x61C9, 0x18F7, 0x61CA, 0x61CA, 0x17AF,

+    0x61CB, 0x61CB, 0x12CF, 0x61E6, 0x61E6, 0x1027, 0x61F2, 0x61F2, 0x1B7F,

+    0x61F6, 0x61F6, 0x1117, 0x61F7, 0x61F7, 0x1EFE, 0x61F8, 0x61F8, 0x1E39,

+    0x61FA, 0x61FA, 0x1BAF, 0x61FC, 0x61FC, 0x0F46, 0x61FF, 0x61FF, 0x18FF,

+    0x6200, 0x6200, 0x1172, 0x6207, 0x6207, 0x1093, 0x6208, 0x6208, 0x0EDC,

+    0x620A, 0x620A, 0x12D0, 0x620C, 0x620C, 0x1623, 0x620D, 0x620D, 0x15CB,

+    0x620E, 0x620E, 0x18E1, 0x6210, 0x6210, 0x1567, 0x6211, 0x6211, 0x1695,

+    0x6212, 0x6212, 0x0E80, 0x6216, 0x6216, 0x1EA2, 0x621A, 0x621A, 0x1BE2,

+    0x621F, 0x621F, 0x0FB3, 0x6221, 0x6221, 0x0DBC, 0x622A, 0x622A, 0x1A1D,

+    0x622E, 0x622E, 0x11F0, 0x6230, 0x6230, 0x1A01, 0x6231, 0x6231, 0x1F6D,

+    0x6234, 0x6234, 0x10A2, 0x6236, 0x6236, 0x1E80, 0x623E, 0x623E, 0x115E,

+    0x623F, 0x623F, 0x1354, 0x6240, 0x6240, 0x1583, 0x6241, 0x6241, 0x1D60,

+    0x6247, 0x6247, 0x1530, 0x6248, 0x6248, 0x1E81, 0x6249, 0x6249, 0x1447,

+    0x624B, 0x624B, 0x15CC, 0x624D, 0x624D, 0x19AE, 0x6253, 0x6253, 0x1CDA,

+    0x6258, 0x6258, 0x1CE6, 0x626E, 0x626E, 0x1428, 0x6271, 0x6271, 0x0FD6,

+    0x6276, 0x6276, 0x1404, 0x6279, 0x6279, 0x1448, 0x627C, 0x627C, 0x16DC,

+    0x627F, 0x627F, 0x1637, 0x6280, 0x6280, 0x0FF0, 0x6284, 0x6284, 0x1C32,

+    0x6289, 0x6289, 0x0E40, 0x628A, 0x628A, 0x1D35, 0x6291, 0x6291, 0x171A,

+    0x6292, 0x6292, 0x1504, 0x6295, 0x6295, 0x1D2C, 0x6297, 0x6297, 0x1DFC,

+    0x6298, 0x6298, 0x1A1E, 0x629B, 0x629B, 0x1D81, 0x62AB, 0x62AB, 0x1DAE,

+    0x62B1, 0x62B1, 0x1D82, 0x62B5, 0x62B5, 0x19C5, 0x62B9, 0x62B9, 0x1252,

+    0x62BC, 0x62BC, 0x16C6, 0x62BD, 0x62BD, 0x1C62, 0x62C2, 0x62C2, 0x1436,

+    0x62C7, 0x62C7, 0x12D1, 0x62C8, 0x62C8, 0x1045, 0x62C9, 0x62C9, 0x1139,

+    0x62CC, 0x62CC, 0x132D, 0x62CD, 0x62CD, 0x1318, 0x62CF, 0x62CF, 0x1028,

+    0x62D0, 0x62D0, 0x0F15, 0x62D2, 0x62D2, 0x0E05, 0x62D3, 0x62D3, 0x1BE3,

+    0x62D4, 0x62D4, 0x1343, 0x62D6, 0x62D6, 0x1CDB, 0x62D7, 0x62D7, 0x1804,

+    0x62D8, 0x62D8, 0x0F47, 0x62D9, 0x62D9, 0x1AB3, 0x62DB, 0x62DB, 0x1C33,

+    0x62DC, 0x62DC, 0x136D, 0x62EC, 0x62EC, 0x0EFD, 0x62ED, 0x62ED, 0x165C,

+    0x62EE, 0x62EE, 0x1021, 0x62EF, 0x62EF, 0x1B16, 0x62F1, 0x62F1, 0x0ED2,

+    0x62F3, 0x62F3, 0x0F86, 0x62F7, 0x62F7, 0x0E9A, 0x62FE, 0x62FE, 0x162E,

+    0x62FF, 0x62FF, 0x1029, 0x6301, 0x6301, 0x1B24, 0x6307, 0x6307, 0x1B25,

+    0x6309, 0x6309, 0x16B1, 0x6311, 0x6311, 0x10BA, 0x632B, 0x632B, 0x1ACA,

+    0x632F, 0x632F, 0x1B47, 0x633A, 0x633A, 0x1A3D, 0x633B, 0x633B, 0x174B,

+    0x633D, 0x633D, 0x1244, 0x633E, 0x633E, 0x1E53, 0x6349, 0x6349, 0x1B8F,

+    0x634C, 0x634C, 0x1D4D, 0x634F, 0x634F, 0x102F, 0x6350, 0x6350, 0x174A,

+    0x6355, 0x6355, 0x1D83, 0x6367, 0x6367, 0x13EA, 0x6368, 0x6368, 0x1491,

+    0x636E, 0x636E, 0x0E06, 0x6372, 0x6372, 0x0F87, 0x6377, 0x6377, 0x1C16,

+    0x637A, 0x637A, 0x1030, 0x637B, 0x637B, 0x1046, 0x637F, 0x637F, 0x1505,

+    0x6383, 0x6383, 0x1584, 0x6388, 0x6388, 0x15CD, 0x6389, 0x6389, 0x10BB,

+    0x638C, 0x638C, 0x1991, 0x6392, 0x6392, 0x136E, 0x6396, 0x6396, 0x16DD,

+    0x6398, 0x6398, 0x0F79, 0x639B, 0x639B, 0x0F0D, 0x63A0, 0x63A0, 0x1149,

+    0x63A1, 0x63A1, 0x1BCF, 0x63A2, 0x63A2, 0x1CFC, 0x63A5, 0x63A5, 0x1A2D,

+    0x63A7, 0x63A7, 0x0ED3, 0x63A8, 0x63A8, 0x1C63, 0x63A9, 0x63A9, 0x1729,

+    0x63AA, 0x63AA, 0x1A85, 0x63C0, 0x63C0, 0x0D9C, 0x63C4, 0x63C4, 0x18B4,

+    0x63C6, 0x63C6, 0x0F9D, 0x63CF, 0x63CF, 0x12C4, 0x63D0, 0x63D0, 0x1A6E,

+    0x63D6, 0x63D6, 0x18F3, 0x63DA, 0x63DA, 0x16FB, 0x63DB, 0x63DB, 0x1ED0,

+    0x63E1, 0x63E1, 0x16A7, 0x63ED, 0x63ED, 0x0E2D, 0x63EE, 0x63EE, 0x1F3F,

+    0x63F4, 0x63F4, 0x187A, 0x63F6, 0x63F6, 0x16EB, 0x63F7, 0x63F7, 0x14CF,

+    0x640D, 0x640D, 0x15AC, 0x640F, 0x640F, 0x1319, 0x6414, 0x6414, 0x1585,

+    0x6416, 0x6416, 0x1805, 0x6417, 0x6417, 0x10BC, 0x641C, 0x641C, 0x15CE,

+    0x6422, 0x6422, 0x1B48, 0x642C, 0x642C, 0x132E, 0x642D, 0x642D, 0x1D01,

+    0x643A, 0x643A, 0x1F46, 0x643E, 0x643E, 0x1B90, 0x6458, 0x6458, 0x19DF,

+    0x6460, 0x6460, 0x1C58, 0x6469, 0x6469, 0x1230, 0x646F, 0x646F, 0x1B26,

+    0x6478, 0x6479, 0x12A2, 0x647A, 0x647A, 0x1A2E, 0x6488, 0x6488, 0x11A0,

+    0x6491, 0x6491, 0x1D17, 0x6492, 0x6492, 0x14C4, 0x6493, 0x6493, 0x1806,

+    0x649A, 0x649A, 0x1041, 0x649E, 0x649E, 0x1094, 0x64A4, 0x64A4, 0x1C03,

+    0x64A5, 0x64A5, 0x1344, 0x64AB, 0x64AB, 0x12D2, 0x64AD, 0x64AD, 0x1D36,

+    0x64AE, 0x64AE, 0x1C5D, 0x64B0, 0x64B0, 0x1B96, 0x64B2, 0x64B2, 0x131A,

+    0x64BB, 0x64BB, 0x1074, 0x64C1, 0x64C1, 0x17CB, 0x64C4, 0x64C4, 0x11A1,

+    0x64C5, 0x64C5, 0x1BF1, 0x64C7, 0x64C7, 0x1D15, 0x64CA, 0x64CA, 0x0E2E,

+    0x64CD, 0x64CD, 0x1A86, 0x64CE, 0x64CE, 0x0E5A, 0x64D2, 0x64D2, 0x0FC8,

+    0x64D4, 0x64D4, 0x107C, 0x64D8, 0x64D8, 0x139F, 0x64DA, 0x64DA, 0x0E07,

+    0x64E1, 0x64E1, 0x10A3, 0x64E2, 0x64E2, 0x1CE7, 0x64E5, 0x64E5, 0x1130,

+    0x64E6, 0x64E6, 0x1BA7, 0x64E7, 0x64E7, 0x0E08, 0x64EC, 0x64EC, 0x1900,

+    0x64F2, 0x64F2, 0x1BE4, 0x64F4, 0x64F4, 0x1EC5, 0x64FA, 0x64FA, 0x1D37,

+    0x64FE, 0x64FE, 0x1807, 0x6500, 0x6500, 0x132F, 0x6504, 0x6504, 0x1D18,

+    0x6518, 0x6518, 0x16FC, 0x651D, 0x651D, 0x155F, 0x6523, 0x6523, 0x1173,

+    0x652A, 0x652A, 0x0F23, 0x652B, 0x652B, 0x1EC6, 0x652C, 0x652C, 0x1131,

+    0x652F, 0x652F, 0x1B27, 0x6536, 0x6536, 0x15CF, 0x6537, 0x6537, 0x0E9B,

+    0x6538, 0x6538, 0x18B5, 0x6539, 0x6539, 0x0DF0, 0x653B, 0x653B, 0x0ED4,

+    0x653E, 0x653E, 0x1355, 0x653F, 0x653F, 0x1A3E, 0x6545, 0x6545, 0x0E9C,

+    0x6548, 0x6548, 0x1F14, 0x654D, 0x654D, 0x1506, 0x654E, 0x654E, 0x0F24,

+    0x654F, 0x654F, 0x130A, 0x6551, 0x6551, 0x0F48, 0x6556, 0x6556, 0x17B0,

+    0x6557, 0x6557, 0x1D51, 0x655E, 0x655E, 0x1BBC, 0x6562, 0x6562, 0x0DBD,

+    0x6563, 0x6563, 0x14BA, 0x6566, 0x6566, 0x10E1, 0x656C, 0x656C, 0x0E5B,

+    0x656D, 0x656D, 0x16FD, 0x6572, 0x6572, 0x0E9D, 0x6574, 0x6574, 0x1A3F,

+    0x6575, 0x6575, 0x19E0, 0x6577, 0x6577, 0x1405, 0x6578, 0x6578, 0x15D0,

+    0x657E, 0x657E, 0x1531, 0x6582, 0x6582, 0x1184, 0x6583, 0x6583, 0x1D73,

+    0x6585, 0x6585, 0x1F15, 0x6587, 0x6587, 0x12E8, 0x658C, 0x658C, 0x146A,

+    0x6590, 0x6590, 0x1449, 0x6591, 0x6591, 0x1330, 0x6597, 0x6597, 0x10FD,

+    0x6599, 0x6599, 0x11CB, 0x659B, 0x659B, 0x0EB8, 0x659C, 0x659C, 0x1492,

+    0x659F, 0x659F, 0x1B76, 0x65A1, 0x65A1, 0x16B9, 0x65A4, 0x65A4, 0x0FBB,

+    0x65A5, 0x65A5, 0x1BE5, 0x65A7, 0x65A7, 0x1406, 0x65AB, 0x65AB, 0x1970,

+    0x65AC, 0x65AC, 0x1BB0, 0x65AF, 0x65AF, 0x1493, 0x65B0, 0x65B0, 0x166E,

+    0x65B7, 0x65B7, 0x1067, 0x65B9, 0x65B9, 0x1356, 0x65BC, 0x65BC, 0x1710,

+    0x65BD, 0x65BD, 0x1647, 0x65C1, 0x65C1, 0x1357, 0x65C5, 0x65C5, 0x115F,

+    0x65CB, 0x65CB, 0x1532, 0x65CC, 0x65CC, 0x1A40, 0x65CF, 0x65CF, 0x1AAC,

+    0x65D2, 0x65D2, 0x11E2, 0x65D7, 0x65D7, 0x0FF1, 0x65E0, 0x65E0, 0x12D3,

+    0x65E3, 0x65E3, 0x0FF2, 0x65E5, 0x65E5, 0x1940, 0x65E6, 0x65E6, 0x1068,

+    0x65E8, 0x65E8, 0x1B28, 0x65E9, 0x65E9, 0x1A87, 0x65EC, 0x65EC, 0x160C,

+    0x65ED, 0x65ED, 0x1857, 0x65F1, 0x65F1, 0x1DD6, 0x65F4, 0x65F4, 0x1841,

+    0x65FA, 0x65FA, 0x17EF, 0x65FB, 0x65FC, 0x130B, 0x65FD, 0x65FD, 0x10E2,

+    0x65FF, 0x65FF, 0x17B1, 0x6606, 0x6606, 0x0EC1, 0x6607, 0x6607, 0x1638,

+    0x6609, 0x6609, 0x1358, 0x660A, 0x660A, 0x1E82, 0x660C, 0x660C, 0x1BBD,

+    0x660E, 0x660E, 0x128F, 0x660F, 0x660F, 0x1EA5, 0x6610, 0x6610, 0x1429,

+    0x6611, 0x6611, 0x0FC9, 0x6613, 0x6613, 0x173E, 0x6614, 0x6614, 0x151F,

+    0x6615, 0x6615, 0x1F53, 0x661E, 0x661E, 0x13B6, 0x661F, 0x661F, 0x1568,

+    0x6620, 0x6620, 0x1775, 0x6625, 0x6625, 0x1C84, 0x6627, 0x6627, 0x1268,

+    0x6628, 0x6628, 0x1971, 0x662D, 0x662D, 0x1586, 0x662F, 0x662F, 0x1648,

+    0x6630, 0x6630, 0x1DC5, 0x6631, 0x6631, 0x1858, 0x6634, 0x6634, 0x12C5,

+    0x6636, 0x6636, 0x1BBE, 0x663A, 0x663A, 0x13B7, 0x663B, 0x663B, 0x16CC,

+    0x6641, 0x6641, 0x1A88, 0x6642, 0x6642, 0x1649, 0x6643, 0x6644, 0x1EE7,

+    0x6649, 0x6649, 0x1B49, 0x664B, 0x664B, 0x1B4A, 0x664F, 0x664F, 0x16B2,

+    0x6659, 0x6659, 0x1AFC, 0x665B, 0x665B, 0x1E3A, 0x665D, 0x665D, 0x1AD9,

+    0x665E, 0x665E, 0x1F6E, 0x665F, 0x665F, 0x1569, 0x6664, 0x6664, 0x17B2,

+    0x6665, 0x6665, 0x1ED2, 0x6666, 0x6666, 0x1EFF, 0x6667, 0x6667, 0x1E83,

+    0x6668, 0x6668, 0x166F, 0x6669, 0x6669, 0x1245, 0x666B, 0x666B, 0x1CE8,

+    0x666E, 0x666E, 0x13C6, 0x666F, 0x666F, 0x0E5C, 0x6673, 0x6673, 0x1520,

+    0x6674, 0x6674, 0x1C1E, 0x6676, 0x6676, 0x1A41, 0x6677, 0x6677, 0x0F96,

+    0x6678, 0x6678, 0x1A42, 0x667A, 0x667A, 0x1B29, 0x6684, 0x6684, 0x1F37,

+    0x6687, 0x6687, 0x0D77, 0x6688, 0x6688, 0x1F34, 0x6689, 0x6689, 0x1F40,

+    0x668E, 0x668E, 0x1776, 0x6690, 0x6690, 0x1895, 0x6691, 0x6691, 0x1507,

+    0x6696, 0x6696, 0x102C, 0x6697, 0x6697, 0x16C1, 0x6698, 0x6698, 0x16FE,

+    0x669D, 0x669D, 0x1290, 0x66A0, 0x66A0, 0x0E9E, 0x66A2, 0x66A2, 0x1BBF,

+    0x66AB, 0x66AB, 0x1980, 0x66AE, 0x66AE, 0x12A4, 0x66B2, 0x66B2, 0x1992,

+    0x66B3, 0x66B3, 0x1E73, 0x66B4, 0x66B4, 0x1D94, 0x66B9, 0x66B9, 0x1558,

+    0x66BB, 0x66BB, 0x0E5D, 0x66BE, 0x66BE, 0x10E3, 0x66C4, 0x66C4, 0x176F,

+    0x66C6, 0x66C6, 0x116B, 0x66C7, 0x66C7, 0x107D, 0x66C9, 0x66C9, 0x1F16,

+    0x66D6, 0x66D6, 0x16D5, 0x66D9, 0x66D9, 0x1508, 0x66DC, 0x66DC, 0x1808,

+    0x66DD, 0x66DD, 0x1D95, 0x66E0, 0x66E0, 0x0F04, 0x66E6, 0x66E6, 0x1F6F,

+    0x66F0, 0x66F0, 0x17ED, 0x66F2, 0x66F2, 0x0EB9, 0x66F3, 0x66F3, 0x1791,

+    0x66F4, 0x66F4, 0x0E5E, 0x66F7, 0x66F7, 0x0DAE, 0x66F8, 0x66F8, 0x1509,

+    0x66F9, 0x66F9, 0x1A8A, 0x66FA, 0x66FA, 0x1A89, 0x66FC, 0x66FC, 0x1246,

+    0x66FE, 0x66FE, 0x1B15, 0x66FF, 0x66FF, 0x1C26, 0x6700, 0x6700, 0x1C60,

+    0x6703, 0x6703, 0x1F00, 0x6708, 0x6708, 0x1889, 0x6709, 0x6709, 0x18B6,

+    0x670B, 0x670B, 0x1438, 0x670D, 0x670D, 0x13D8, 0x6714, 0x6714, 0x14B6,

+    0x6715, 0x6715, 0x1B77, 0x6717, 0x6717, 0x113D, 0x671B, 0x671B, 0x125C,

+    0x671D, 0x671D, 0x1A8B, 0x671E, 0x671F, 0x0FF3, 0x6726, 0x6726, 0x12BE,

+    0x6727, 0x6727, 0x11BA, 0x6728, 0x6728, 0x12B4, 0x672A, 0x672A, 0x12F9,

+    0x672B, 0x672B, 0x1253, 0x672C, 0x672C, 0x13E3, 0x672D, 0x672D, 0x1BA8,

+    0x672E, 0x672E, 0x1C88, 0x6731, 0x6731, 0x1ADA, 0x6734, 0x6734, 0x131B,

+    0x6736, 0x6736, 0x1CDC, 0x673A, 0x673A, 0x0F90, 0x673D, 0x673D, 0x1F27,

+    0x6746, 0x6746, 0x0D9D, 0x6749, 0x6749, 0x14C9, 0x674E, 0x674E, 0x120C,

+    0x674F, 0x674F, 0x1E1B, 0x6750, 0x6750, 0x19AF, 0x6751, 0x6751, 0x1C51,

+    0x6753, 0x6753, 0x1D9C, 0x6756, 0x6756, 0x1993, 0x675C, 0x675C, 0x10FE,

+    0x675E, 0x675E, 0x0FF5, 0x675F, 0x675F, 0x15A3, 0x676D, 0x676D, 0x1DFD,

+    0x676F, 0x676F, 0x136F, 0x6770, 0x6770, 0x0E1F, 0x6771, 0x6771, 0x10F1,

+    0x6773, 0x6773, 0x12C6, 0x6775, 0x6775, 0x19C6, 0x6777, 0x6777, 0x1D38,

+    0x677B, 0x677B, 0x1057, 0x677E, 0x677E, 0x15B3, 0x677F, 0x677F, 0x1D44,

+    0x6787, 0x6787, 0x144A, 0x6789, 0x6789, 0x17F0, 0x678B, 0x678B, 0x1359,

+    0x678F, 0x678F, 0x1032, 0x6790, 0x6790, 0x1521, 0x6793, 0x6793, 0x10FF,

+    0x6795, 0x6795, 0x1CC9, 0x6797, 0x6797, 0x1227, 0x679A, 0x679A, 0x1269,

+    0x679C, 0x679C, 0x0EDD, 0x679D, 0x679D, 0x1B2A, 0x67AF, 0x67AF, 0x0E9F,

+    0x67B0, 0x67B0, 0x1D6B, 0x67B3, 0x67B3, 0x1B2B, 0x67B6, 0x67B7, 0x0D78,

+    0x67B8, 0x67B8, 0x0F49, 0x67BE, 0x67BE, 0x164A, 0x67C4, 0x67C4, 0x13B8,

+    0x67CF, 0x67CF, 0x137F, 0x67D0, 0x67D0, 0x12A5, 0x67D1, 0x67D1, 0x0DBE,

+    0x67D2, 0x67D2, 0x1CC5, 0x67D3, 0x67D3, 0x1766, 0x67D4, 0x67D4, 0x18B7,

+    0x67DA, 0x67DA, 0x18B8, 0x67DD, 0x67DD, 0x1CE9, 0x67E9, 0x67E9, 0x0F4A,

+    0x67EC, 0x67EC, 0x0D9E, 0x67EF, 0x67EF, 0x0D7A, 0x67F0, 0x67F0, 0x103D,

+    0x67F1, 0x67F1, 0x1ADB, 0x67F3, 0x67F3, 0x11E3, 0x67F4, 0x67F4, 0x164B,

+    0x67F5, 0x67F5, 0x1BD7, 0x67F6, 0x67F6, 0x1494, 0x67FB, 0x67FB, 0x1495,

+    0x67FE, 0x67FE, 0x1A43, 0x6812, 0x6812, 0x160D, 0x6813, 0x6813, 0x1A02,

+    0x6816, 0x6816, 0x150A, 0x6817, 0x6817, 0x11FA, 0x6821, 0x6821, 0x0F25,

+    0x6822, 0x6822, 0x1380, 0x682A, 0x682A, 0x1ADC, 0x682F, 0x682F, 0x1859,

+    0x6838, 0x6838, 0x1E18, 0x6839, 0x6839, 0x0FBC, 0x683C, 0x683C, 0x0E2F,

+    0x683D, 0x683D, 0x19B0, 0x6840, 0x6840, 0x0E20, 0x6841, 0x6841, 0x1DFE,

+    0x6842, 0x6842, 0x0E81, 0x6843, 0x6843, 0x10BD, 0x6848, 0x6848, 0x16B3,

+    0x684E, 0x684E, 0x1B6C, 0x6850, 0x6850, 0x10F2, 0x6851, 0x6851, 0x14E2,

+    0x6853, 0x6853, 0x1ED3, 0x6854, 0x6854, 0x1022, 0x686D, 0x686D, 0x1B4B,

+    0x6876, 0x6876, 0x1D1E, 0x687F, 0x687F, 0x0D9F, 0x6881, 0x6881, 0x114F,

+    0x6885, 0x6885, 0x126A, 0x688F, 0x688F, 0x0EBA, 0x6893, 0x6893, 0x19B1,

+    0x6894, 0x6894, 0x1CAE, 0x6897, 0x6897, 0x0E5F, 0x689D, 0x689D, 0x1A8C,

+    0x689F, 0x689F, 0x1F17, 0x68A1, 0x68A1, 0x17DE, 0x68A2, 0x68A2, 0x1C34,

+    0x68A7, 0x68A7, 0x17B3, 0x68A8, 0x68A8, 0x120D, 0x68AD, 0x68AD, 0x1496,

+    0x68AF, 0x68AF, 0x1A6F, 0x68B0, 0x68B0, 0x0E82, 0x68B1, 0x68B1, 0x0EC2,

+    0x68B3, 0x68B3, 0x1587, 0x68B5, 0x68B5, 0x1393, 0x68B6, 0x68B6, 0x12FA,

+    0x68C4, 0x68C4, 0x0FF7, 0x68C5, 0x68C5, 0x13B9, 0x68C9, 0x68C9, 0x1282,

+    0x68CB, 0x68CB, 0x0FF6, 0x68CD, 0x68CD, 0x0EC3, 0x68D2, 0x68D2, 0x13EB,

+    0x68D5, 0x68D5, 0x1ABA, 0x68D7, 0x68D7, 0x1A8D, 0x68D8, 0x68D8, 0x0FB4,

+    0x68DA, 0x68DA, 0x1439, 0x68DF, 0x68DF, 0x10F3, 0x68E0, 0x68E0, 0x1095,

+    0x68E7, 0x68E7, 0x197B, 0x68E8, 0x68E8, 0x0E83, 0x68EE, 0x68EE, 0x14CA,

+    0x68F2, 0x68F2, 0x150B, 0x68F9, 0x68F9, 0x10BE, 0x68FA, 0x68FA, 0x0EEF,

+    0x6900, 0x6900, 0x17DF, 0x6905, 0x6905, 0x1901, 0x690D, 0x690D, 0x165D,

+    0x690E, 0x690E, 0x1C64, 0x6912, 0x6912, 0x1C35, 0x6927, 0x6927, 0x1291,

+    0x6930, 0x6930, 0x16EC, 0x693D, 0x693D, 0x174C, 0x693F, 0x693F, 0x1C85,

+    0x694A, 0x694A, 0x16FF, 0x6953, 0x6953, 0x1DA8, 0x6954, 0x6954, 0x154C,

+    0x6955, 0x6955, 0x1CDD, 0x6957, 0x6957, 0x0E17, 0x6959, 0x6959, 0x12D4,

+    0x695A, 0x695A, 0x1C36, 0x695E, 0x695E, 0x1200, 0x6960, 0x6960, 0x1033,

+    0x6961, 0x6962, 0x18B9, 0x6963, 0x6963, 0x12FB, 0x6968, 0x6968, 0x1A44,

+    0x696B, 0x696B, 0x1B10, 0x696D, 0x696D, 0x172C, 0x696E, 0x696E, 0x19C7,

+    0x696F, 0x696F, 0x160E, 0x6975, 0x6975, 0x0FB5, 0x6977, 0x6977, 0x1E0D,

+    0x6978, 0x6978, 0x1C65, 0x6979, 0x6979, 0x1777, 0x6995, 0x6995, 0x1827,

+    0x699B, 0x699B, 0x1B4C, 0x699C, 0x699C, 0x135A, 0x69A5, 0x69A5, 0x1EE9,

+    0x69A7, 0x69A7, 0x144B, 0x69AE, 0x69AE, 0x1778, 0x69B4, 0x69B4, 0x11E4,

+    0x69BB, 0x69BB, 0x1D02, 0x69C1, 0x69C1, 0x0EA0, 0x69C3, 0x69C3, 0x1331,

+    0x69CB, 0x69CB, 0x0F4B, 0x69CC, 0x69CC, 0x1D24, 0x69CD, 0x69CD, 0x1BC0,

+    0x69D0, 0x69D0, 0x0F16, 0x69E8, 0x69E8, 0x0EE8, 0x69EA, 0x69EA, 0x0DF1,

+    0x69FB, 0x69FB, 0x0F9E, 0x69FD, 0x69FD, 0x1A8E, 0x69FF, 0x69FF, 0x0FBD,

+    0x6A02, 0x6A02, 0x16A8, 0x6A0A, 0x6A0A, 0x1385, 0x6A11, 0x6A11, 0x1150,

+    0x6A13, 0x6A13, 0x11D7, 0x6A17, 0x6A17, 0x19C8, 0x6A19, 0x6A19, 0x1D9D,

+    0x6A1E, 0x6A1E, 0x1C66, 0x6A1F, 0x6A1F, 0x1994, 0x6A21, 0x6A21, 0x12A6,

+    0x6A23, 0x6A23, 0x1700, 0x6A35, 0x6A35, 0x1C37, 0x6A38, 0x6A38, 0x131C,

+    0x6A39, 0x6A39, 0x15D1, 0x6A3A, 0x6A3A, 0x1EBA, 0x6A3D, 0x6A3D, 0x1AFD,

+    0x6A44, 0x6A44, 0x0DBF, 0x6A48, 0x6A48, 0x1809, 0x6A4B, 0x6A4B, 0x0F26,

+    0x6A52, 0x6A52, 0x185F, 0x6A53, 0x6A53, 0x160F, 0x6A58, 0x6A58, 0x0FAF,

+    0x6A59, 0x6A59, 0x110E, 0x6A5F, 0x6A5F, 0x0FF8, 0x6A61, 0x6A61, 0x14E3,

+    0x6A6B, 0x6A6B, 0x1F0F, 0x6A80, 0x6A80, 0x1069, 0x6A84, 0x6A84, 0x0E30,

+    0x6A89, 0x6A89, 0x1A45, 0x6A8D, 0x6A8D, 0x171B, 0x6A8E, 0x6A8E, 0x0FCA,

+    0x6A97, 0x6A97, 0x13A0, 0x6A9C, 0x6A9C, 0x1F01, 0x6AA2, 0x6AA2, 0x0E24,

+    0x6AA3, 0x6AA3, 0x1995, 0x6AB3, 0x6AB3, 0x146B, 0x6ABB, 0x6ABB, 0x1DE8,

+    0x6AC2, 0x6AC2, 0x10BF, 0x6AC3, 0x6AC3, 0x0F91, 0x6AD3, 0x6AD3, 0x11A2,

+    0x6ADA, 0x6ADA, 0x1160, 0x6ADB, 0x6ADB, 0x1B0F, 0x6AF6, 0x6AF6, 0x1E2C,

+    0x6AFB, 0x6AFB, 0x16E2, 0x6B04, 0x6B04, 0x1127, 0x6B0A, 0x6B0A, 0x0F88,

+    0x6B0C, 0x6B0C, 0x1996, 0x6B12, 0x6B12, 0x1128, 0x6B16, 0x6B16, 0x1132,

+    0x6B20, 0x6B20, 0x1F5B, 0x6B21, 0x6B21, 0x1B88, 0x6B23, 0x6B23, 0x1F54,

+    0x6B32, 0x6B32, 0x1819, 0x6B3A, 0x6B3A, 0x0FF9, 0x6B3D, 0x6B3D, 0x1F5C,

+    0x6B3E, 0x6B3E, 0x0EF0, 0x6B46, 0x6B46, 0x1F5D, 0x6B47, 0x6B47, 0x1E2F,

+    0x6B4C, 0x6B4C, 0x0D7B, 0x6B4E, 0x6B4E, 0x1CF5, 0x6B50, 0x6B50, 0x0F4C,

+    0x6B5F, 0x6B5F, 0x1731, 0x6B61, 0x6B61, 0x1ED1, 0x6B62, 0x6B62, 0x1B2C,

+    0x6B63, 0x6B63, 0x1A46, 0x6B64, 0x6B64, 0x1B89, 0x6B65, 0x6B65, 0x13C7,

+    0x6B66, 0x6B66, 0x12D5, 0x6B6A, 0x6B6A, 0x17F5, 0x6B72, 0x6B72, 0x1576,

+    0x6B77, 0x6B77, 0x116C, 0x6B78, 0x6B78, 0x0F97, 0x6B7B, 0x6B7B, 0x1497,

+    0x6B7F, 0x6B7F, 0x12BB, 0x6B83, 0x6B83, 0x16CD, 0x6B84, 0x6B84, 0x1B4D,

+    0x6B86, 0x6B86, 0x1D0C, 0x6B89, 0x6B89, 0x1610, 0x6B8A, 0x6B8A, 0x15D2,

+    0x6B96, 0x6B96, 0x165E, 0x6B98, 0x6B98, 0x197C, 0x6B9E, 0x6B9E, 0x1860,

+    0x6BAE, 0x6BAE, 0x1185, 0x6BAF, 0x6BAF, 0x146C, 0x6BB2, 0x6BB2, 0x1559,

+    0x6BB5, 0x6BB5, 0x106A, 0x6BB7, 0x6BB7, 0x18E8, 0x6BBA, 0x6BBA, 0x14C5,

+    0x6BBC, 0x6BBC, 0x0D8E, 0x6BBF, 0x6BBF, 0x1A03, 0x6BC1, 0x6BC1, 0x1F3C,

+    0x6BC5, 0x6BC5, 0x1902, 0x6BC6, 0x6BC6, 0x0F4D, 0x6BCB, 0x6BCB, 0x12D6,

+    0x6BCD, 0x6BCD, 0x12A7, 0x6BCF, 0x6BCF, 0x126B, 0x6BD2, 0x6BD2, 0x10D5,

+    0x6BD3, 0x6BD3, 0x18D4, 0x6BD4, 0x6BD4, 0x144C, 0x6BD6, 0x6BD8, 0x144D,

+    0x6BDB, 0x6BDB, 0x12A8, 0x6BEB, 0x6BEB, 0x1E84, 0x6BEC, 0x6BEC, 0x0F4E,

+    0x6C08, 0x6C08, 0x1A04, 0x6C0F, 0x6C0F, 0x168E, 0x6C11, 0x6C11, 0x130D,

+    0x6C13, 0x6C13, 0x1278, 0x6C23, 0x6C23, 0x0FFA, 0x6C34, 0x6C34, 0x15D3,

+    0x6C37, 0x6C37, 0x1476, 0x6C38, 0x6C38, 0x1779, 0x6C3E, 0x6C3E, 0x1394,

+    0x6C40, 0x6C40, 0x1A47, 0x6C41, 0x6C41, 0x1B11, 0x6C42, 0x6C42, 0x0F4F,

+    0x6C4E, 0x6C4E, 0x1395, 0x6C50, 0x6C50, 0x1522, 0x6C55, 0x6C55, 0x14BB,

+    0x6C57, 0x6C57, 0x1DD7, 0x6C5A, 0x6C5A, 0x17B4, 0x6C5D, 0x6C5D, 0x1732,

+    0x6C5E, 0x6C5E, 0x1EAF, 0x6C5F, 0x6C5F, 0x0DD9, 0x6C60, 0x6C60, 0x1B2D,

+    0x6C68, 0x6C68, 0x0EC8, 0x6C6A, 0x6C6A, 0x17F1, 0x6C6D, 0x6C6D, 0x1792,

+    0x6C70, 0x6C70, 0x1D0D, 0x6C72, 0x6C72, 0x0FD7, 0x6C76, 0x6C76, 0x12E9,

+    0x6C7A, 0x6C7A, 0x0E41, 0x6C7D, 0x6C7D, 0x0FFB, 0x6C7E, 0x6C7E, 0x142A,

+    0x6C81, 0x6C81, 0x1685, 0x6C82, 0x6C82, 0x0FFC, 0x6C83, 0x6C83, 0x17BF,

+    0x6C85, 0x6C85, 0x187B, 0x6C86, 0x6C86, 0x1DFF, 0x6C87, 0x6C87, 0x174D,

+    0x6C88, 0x6C88, 0x1CCA, 0x6C8C, 0x6C8C, 0x10E4, 0x6C90, 0x6C90, 0x12B5,

+    0x6C92, 0x6C92, 0x12BC, 0x6C93, 0x6C93, 0x108A, 0x6C94, 0x6C94, 0x1283,

+    0x6C95, 0x6C95, 0x12F1, 0x6C96, 0x6C96, 0x1C8C, 0x6C99, 0x6C99, 0x1498,

+    0x6C9A, 0x6C9A, 0x1B2E, 0x6C9B, 0x6C9B, 0x1D52, 0x6CAB, 0x6CAB, 0x1254,

+    0x6CAE, 0x6CAE, 0x19C9, 0x6CB3, 0x6CB3, 0x1DC6, 0x6CB8, 0x6CB8, 0x1450,

+    0x6CB9, 0x6CB9, 0x18BB, 0x6CBB, 0x6CBB, 0x1CAF, 0x6CBC, 0x6CBC, 0x1588,

+    0x6CBD, 0x6CBD, 0x0EA1, 0x6CBE, 0x6CBE, 0x1C0B, 0x6CBF, 0x6CBF, 0x174E,

+    0x6CC1, 0x6CC1, 0x1EEA, 0x6CC2, 0x6CC2, 0x1E60, 0x6CC4, 0x6CC4, 0x154D,

+    0x6CC9, 0x6CC9, 0x1BF2, 0x6CCA, 0x6CCA, 0x131D, 0x6CCC, 0x6CCC, 0x1DB7,

+    0x6CD3, 0x6CD3, 0x1EB0, 0x6CD5, 0x6CD5, 0x139A, 0x6CD7, 0x6CD7, 0x1499,

+    0x6CDB, 0x6CDB, 0x1396, 0x6CE1, 0x6CE1, 0x1D84, 0x6CE2, 0x6CE2, 0x1D39,

+    0x6CE3, 0x6CE3, 0x18F4, 0x6CE5, 0x6CE5, 0x105B, 0x6CE8, 0x6CE8, 0x1ADD,

+    0x6CEB, 0x6CEB, 0x1E3B, 0x6CEE, 0x6CEE, 0x1332, 0x6CEF, 0x6CEF, 0x130E,

+    0x6CF0, 0x6CF0, 0x1D0E, 0x6CF3, 0x6CF3, 0x177A, 0x6D0B, 0x6D0B, 0x1701,

+    0x6D0C, 0x6D0C, 0x1180, 0x6D11, 0x6D11, 0x13C8, 0x6D17, 0x6D17, 0x1577,

+    0x6D19, 0x6D19, 0x15D4, 0x6D1B, 0x6D1B, 0x111E, 0x6D1E, 0x6D1E, 0x10F4,

+    0x6D25, 0x6D25, 0x1B4E, 0x6D27, 0x6D27, 0x18BC, 0x6D29, 0x6D29, 0x154E,

+    0x6D2A, 0x6D2A, 0x1EB1, 0x6D32, 0x6D32, 0x1ADE, 0x6D35, 0x6D35, 0x1611,

+    0x6D36, 0x6D36, 0x1F50, 0x6D38, 0x6D38, 0x0F05, 0x6D39, 0x6D39, 0x187C,

+    0x6D3B, 0x6D3B, 0x1EDB, 0x6D3D, 0x6D3D, 0x1F60, 0x6D3E, 0x6D3E, 0x1D3A,

+    0x6D41, 0x6D41, 0x11E5, 0x6D59, 0x6D59, 0x1A1F, 0x6D5A, 0x6D5A, 0x1AFE,

+    0x6D5C, 0x6D5C, 0x146D, 0x6D63, 0x6D63, 0x17E0, 0x6D66, 0x6D66, 0x1D85,

+    0x6D69, 0x6D69, 0x1E85, 0x6D6A, 0x6D6A, 0x113E, 0x6D6C, 0x6D6C, 0x120E,

+    0x6D6E, 0x6D6E, 0x1407, 0x6D74, 0x6D74, 0x181A, 0x6D77, 0x6D77, 0x1E0E,

+    0x6D78, 0x6D78, 0x1CCB, 0x6D79, 0x6D79, 0x1E54, 0x6D7F, 0x6D7F, 0x1D53,

+    0x6D85, 0x6D85, 0x1762, 0x6D87, 0x6D87, 0x0E60, 0x6D88, 0x6D88, 0x1589,

+    0x6D89, 0x6D89, 0x1560, 0x6D8C, 0x6D8C, 0x1828, 0x6D8D, 0x6D8D, 0x1F18,

+    0x6D8E, 0x6D8E, 0x174F, 0x6D91, 0x6D91, 0x15A4, 0x6D93, 0x6D93, 0x1750,

+    0x6D95, 0x6D95, 0x1C27, 0x6DAF, 0x6DAF, 0x16D6, 0x6DB2, 0x6DB2, 0x16DE,

+    0x6DB5, 0x6DB5, 0x1DE9, 0x6DC0, 0x6DC0, 0x1A48, 0x6DC3, 0x6DC3, 0x0F89,

+    0x6DC4, 0x6DC4, 0x1CB0, 0x6DC5, 0x6DC5, 0x1523, 0x6DC6, 0x6DC6, 0x1F19,

+    0x6DC7, 0x6DC7, 0x0FFD, 0x6DCB, 0x6DCB, 0x1228, 0x6DCF, 0x6DCF, 0x1E86,

+    0x6DD1, 0x6DD1, 0x1601, 0x6DD8, 0x6DD8, 0x10C0, 0x6DD9, 0x6DD9, 0x1ABB,

+    0x6DDA, 0x6DDA, 0x11D8, 0x6DDE, 0x6DDE, 0x15B4, 0x6DE1, 0x6DE1, 0x107E,

+    0x6DE8, 0x6DE8, 0x1A49, 0x6DEA, 0x6DEA, 0x11F5, 0x6DEB, 0x6DEB, 0x18EE,

+    0x6DEE, 0x6DEE, 0x1F02, 0x6DF1, 0x6DF1, 0x1686, 0x6DF3, 0x6DF3, 0x1612,

+    0x6DF5, 0x6DF5, 0x1751, 0x6DF7, 0x6DF7, 0x1EA6, 0x6DF8, 0x6DF8, 0x1C1F,

+    0x6DF9, 0x6DF9, 0x172A, 0x6DFA, 0x6DFA, 0x1BF3, 0x6DFB, 0x6DFB, 0x1C0C,

+    0x6E17, 0x6E17, 0x14CB, 0x6E19, 0x6E19, 0x1ED4, 0x6E1A, 0x6E1A, 0x19CA,

+    0x6E1B, 0x6E1B, 0x0DC0, 0x6E1F, 0x6E1F, 0x1A4A, 0x6E20, 0x6E20, 0x0E09,

+    0x6E21, 0x6E21, 0x10C1, 0x6E23, 0x6E23, 0x149A, 0x6E24, 0x6E24, 0x1345,

+    0x6E25, 0x6E25, 0x16A9, 0x6E26, 0x6E26, 0x17D3, 0x6E2B, 0x6E2B, 0x154F,

+    0x6E2C, 0x6E2C, 0x1CA6, 0x6E2D, 0x6E2D, 0x1896, 0x6E2F, 0x6E2F, 0x1E00,

+    0x6E32, 0x6E32, 0x1533, 0x6E34, 0x6E34, 0x0DAF, 0x6E36, 0x6E36, 0x177B,

+    0x6E38, 0x6E38, 0x18BD, 0x6E3A, 0x6E3A, 0x12C7, 0x6E3C, 0x6E3C, 0x12FC,

+    0x6E3D, 0x6E3D, 0x19B2, 0x6E3E, 0x6E3E, 0x1EA7, 0x6E43, 0x6E43, 0x1370,

+    0x6E44, 0x6E44, 0x12FD, 0x6E4A, 0x6E4A, 0x1ADF, 0x6E4D, 0x6E4D, 0x106B,

+    0x6E56, 0x6E56, 0x1E87, 0x6E58, 0x6E58, 0x14E4, 0x6E5B, 0x6E5B, 0x107F,

+    0x6E5C, 0x6E5C, 0x165F, 0x6E5E, 0x6E5E, 0x1A4B, 0x6E5F, 0x6E5F, 0x1EEB,

+    0x6E67, 0x6E67, 0x1829, 0x6E6B, 0x6E6B, 0x1C67, 0x6E6E, 0x6E6E, 0x1935,

+    0x6E6F, 0x6E6F, 0x1D05, 0x6E72, 0x6E72, 0x187D, 0x6E73, 0x6E73, 0x1034,

+    0x6E7A, 0x6E7A, 0x13C9, 0x6E90, 0x6E90, 0x187E, 0x6E96, 0x6E96, 0x1AFF,

+    0x6E9C, 0x6E9C, 0x11E6, 0x6E9D, 0x6E9D, 0x0F50, 0x6E9F, 0x6E9F, 0x1292,

+    0x6EA2, 0x6EA2, 0x1941, 0x6EA5, 0x6EA5, 0x1408, 0x6EAA, 0x6EAA, 0x0E84,

+    0x6EAB, 0x6EAB, 0x17C3, 0x6EAF, 0x6EAF, 0x158A, 0x6EB1, 0x6EB1, 0x1B4F,

+    0x6EB6, 0x6EB6, 0x182A, 0x6EBA, 0x6EBA, 0x105D, 0x6EC2, 0x6EC2, 0x135B,

+    0x6EC4, 0x6EC4, 0x1BC1, 0x6EC5, 0x6EC5, 0x128A, 0x6EC9, 0x6EC9, 0x1EEC,

+    0x6ECB, 0x6ECB, 0x195D, 0x6ECC, 0x6ECC, 0x1BE6, 0x6ECE, 0x6ECE, 0x1E61,

+    0x6ED1, 0x6ED1, 0x1EDC, 0x6ED3, 0x6ED3, 0x19B3, 0x6ED4, 0x6ED4, 0x10C2,

+    0x6EEF, 0x6EEF, 0x1C28, 0x6EF4, 0x6EF4, 0x19E1, 0x6EF8, 0x6EF8, 0x1E88,

+    0x6EFE, 0x6EFE, 0x0EC4, 0x6EFF, 0x6EFF, 0x1247, 0x6F01, 0x6F01, 0x1711,

+    0x6F02, 0x6F02, 0x1D9E, 0x6F06, 0x6F06, 0x1CC6, 0x6F0F, 0x6F0F, 0x11D9,

+    0x6F11, 0x6F11, 0x0DF2, 0x6F14, 0x6F14, 0x1752, 0x6F15, 0x6F15, 0x1A8F,

+    0x6F20, 0x6F20, 0x123A, 0x6F22, 0x6F22, 0x1DD8, 0x6F23, 0x6F23, 0x1174,

+    0x6F2B, 0x6F2B, 0x1248, 0x6F2C, 0x6F2C, 0x1B2F, 0x6F31, 0x6F31, 0x15D5,

+    0x6F32, 0x6F32, 0x1BC2, 0x6F38, 0x6F38, 0x1A27, 0x6F3F, 0x6F3F, 0x1997,

+    0x6F41, 0x6F41, 0x177C, 0x6F51, 0x6F51, 0x1346, 0x6F54, 0x6F54, 0x0E42,

+    0x6F57, 0x6F57, 0x1B79, 0x6F58, 0x6F58, 0x1333, 0x6F5A, 0x6F5A, 0x1602,

+    0x6F5B, 0x6F5B, 0x1981, 0x6F5E, 0x6F5E, 0x11A3, 0x6F5F, 0x6F5F, 0x1524,

+    0x6F62, 0x6F62, 0x1EED, 0x6F64, 0x6F64, 0x18DA, 0x6F6D, 0x6F6D, 0x1080,

+    0x6F6E, 0x6F6E, 0x1A90, 0x6F70, 0x6F70, 0x0F92, 0x6F7A, 0x6F7A, 0x197D,

+    0x6F7C, 0x6F7C, 0x10F5, 0x6F7D, 0x6F7D, 0x13CA, 0x6F7E, 0x6F7E, 0x121F,

+    0x6F81, 0x6F81, 0x14D0, 0x6F84, 0x6F84, 0x1B80, 0x6F88, 0x6F88, 0x1C04,

+    0x6F8D, 0x6F8D, 0x1AE0, 0x6F8E, 0x6F8E, 0x1D5A, 0x6F90, 0x6F90, 0x1861,

+    0x6F94, 0x6F94, 0x1E89, 0x6F97, 0x6F97, 0x0DA0, 0x6FA3, 0x6FA3, 0x1DD9,

+    0x6FA4, 0x6FA4, 0x1D16, 0x6FA7, 0x6FA7, 0x119B, 0x6FAE, 0x6FAE, 0x1F03,

+    0x6FAF, 0x6FAF, 0x1B97, 0x6FB1, 0x6FB1, 0x1A05, 0x6FB3, 0x6FB3, 0x17B5,

+    0x6FB9, 0x6FB9, 0x1081, 0x6FBE, 0x6FBE, 0x1075, 0x6FC0, 0x6FC0, 0x0E31,

+    0x6FC1, 0x6FC1, 0x1CEA, 0x6FC2, 0x6FC2, 0x1186, 0x6FC3, 0x6FC3, 0x104F,

+    0x6FCA, 0x6FCA, 0x1793, 0x6FD5, 0x6FD5, 0x162D, 0x6FDA, 0x6FDA, 0x177D,

+    0x6FDF, 0x6FDF, 0x1A70, 0x6FE0, 0x6FE0, 0x1E8A, 0x6FE1, 0x6FE1, 0x18BE,

+    0x6FE4, 0x6FE4, 0x10C3, 0x6FE9, 0x6FE9, 0x1E8B, 0x6FEB, 0x6FEB, 0x1133,

+    0x6FEC, 0x6FEC, 0x1B00, 0x6FEF, 0x6FEF, 0x1CEB, 0x6FF1, 0x6FF1, 0x146E,

+    0x6FFE, 0x6FFE, 0x1161, 0x7001, 0x7001, 0x1702, 0x7005, 0x7005, 0x1E62,

+    0x7006, 0x7006, 0x10D6, 0x7009, 0x7009, 0x149B, 0x700B, 0x700B, 0x1687,

+    0x700F, 0x700F, 0x11E7, 0x7011, 0x7011, 0x1D96, 0x7015, 0x7015, 0x146F,

+    0x7018, 0x7018, 0x11A4, 0x701A, 0x701A, 0x1DDA, 0x701B, 0x701B, 0x177E,

+    0x701C, 0x701C, 0x18E2, 0x701D, 0x701D, 0x116D, 0x701E, 0x701E, 0x1A4C,

+    0x701F, 0x701F, 0x158B, 0x7023, 0x7023, 0x1E0F, 0x7027, 0x7027, 0x11BB,

+    0x7028, 0x7028, 0x11C0, 0x702F, 0x702F, 0x177F, 0x7037, 0x7037, 0x1925,

+    0x703E, 0x703E, 0x1129, 0x704C, 0x704C, 0x0EF1, 0x7050, 0x7050, 0x1E63,

+    0x7051, 0x7051, 0x15BA, 0x7058, 0x7058, 0x1CF6, 0x705D, 0x705D, 0x1E8C,

+    0x7063, 0x7063, 0x1249, 0x706B, 0x706B, 0x1EBB, 0x7070, 0x7070, 0x1F04,

+    0x7078, 0x7078, 0x0F51, 0x707C, 0x707C, 0x1972, 0x707D, 0x707D, 0x19B4,

+    0x7085, 0x7085, 0x0E61, 0x708A, 0x708A, 0x1C99, 0x708E, 0x708E, 0x1767,

+    0x7092, 0x7092, 0x1C38, 0x7098, 0x7098, 0x1F55, 0x7099, 0x7099, 0x195E,

+    0x709A, 0x709A, 0x0F06, 0x70A1, 0x70A1, 0x1A4D, 0x70A4, 0x70A4, 0x158C,

+    0x70AB, 0x70AB, 0x1E3C, 0x70AC, 0x70AC, 0x0E0A, 0x70AD, 0x70AD, 0x1CF7,

+    0x70AF, 0x70AF, 0x1E64, 0x70B3, 0x70B3, 0x13BA, 0x70B7, 0x70B7, 0x1AE1,

+    0x70B8, 0x70B8, 0x1973, 0x70B9, 0x70B9, 0x1A28, 0x70C8, 0x70C8, 0x1181,

+    0x70CB, 0x70CB, 0x1F47, 0x70CF, 0x70CF, 0x17B6, 0x70D8, 0x70D8, 0x1EB2,

+    0x70D9, 0x70D9, 0x111F, 0x70DD, 0x70DD, 0x1B17, 0x70DF, 0x70DF, 0x1753,

+    0x70F1, 0x70F1, 0x0E62, 0x70F9, 0x70F9, 0x1D5B, 0x70FD, 0x70FD, 0x13EC,

+    0x7104, 0x7104, 0x1F2F, 0x7109, 0x7109, 0x1720, 0x710C, 0x710C, 0x1B01,

+    0x7119, 0x7119, 0x1371, 0x711A, 0x711A, 0x142B, 0x711E, 0x711E, 0x10E5,

+    0x7121, 0x7121, 0x12D7, 0x7126, 0x7126, 0x1C39, 0x7130, 0x7130, 0x1768,

+    0x7136, 0x7136, 0x1754, 0x7147, 0x7147, 0x1F41, 0x7149, 0x7149, 0x1175,

+    0x714A, 0x714A, 0x1F38, 0x714C, 0x714C, 0x1EEE, 0x714E, 0x714E, 0x1A06,

+    0x7150, 0x7150, 0x1780, 0x7156, 0x7156, 0x102D, 0x7159, 0x7159, 0x1755,

+    0x715C, 0x715C, 0x185A, 0x715E, 0x715E, 0x14C6, 0x7164, 0x7164, 0x126C,

+    0x7165, 0x7165, 0x1ED5, 0x7166, 0x7166, 0x1F28, 0x7167, 0x7167, 0x1A91,

+    0x7169, 0x7169, 0x1386, 0x716C, 0x716C, 0x1703, 0x716E, 0x716E, 0x195F,

+    0x717D, 0x717D, 0x1534, 0x7184, 0x7184, 0x1660, 0x7189, 0x7189, 0x1862,

+    0x718A, 0x718A, 0x186D, 0x718F, 0x718F, 0x1F30, 0x7192, 0x7192, 0x1E65,

+    0x7194, 0x7194, 0x182B, 0x7199, 0x7199, 0x1F70, 0x719F, 0x719F, 0x1603,

+    0x71A2, 0x71A2, 0x13ED, 0x71AC, 0x71AC, 0x17B7, 0x71B1, 0x71B1, 0x1763,

+    0x71B9, 0x71BA, 0x1F71, 0x71BE, 0x71BE, 0x1CB1, 0x71C1, 0x71C1, 0x1770,

+    0x71C3, 0x71C3, 0x1756, 0x71C8, 0x71C8, 0x110F, 0x71C9, 0x71C9, 0x10E6,

+    0x71CE, 0x71CE, 0x11CC, 0x71D0, 0x71D0, 0x1220, 0x71D2, 0x71D2, 0x158D,

+    0x71D4, 0x71D4, 0x1387, 0x71D5, 0x71D5, 0x1757, 0x71DF, 0x71DF, 0x1781,

+    0x71E5, 0x71E5, 0x1A92, 0x71E6, 0x71E6, 0x1B98, 0x71E7, 0x71E7, 0x15D6,

+    0x71ED, 0x71ED, 0x1C4B, 0x71EE, 0x71EE, 0x1561, 0x71FB, 0x71FB, 0x1F31,

+    0x71FC, 0x71FC, 0x1670, 0x71FE, 0x71FE, 0x10C4, 0x71FF, 0x71FF, 0x180A,

+    0x7200, 0x7200, 0x1E33, 0x7206, 0x7206, 0x1D97, 0x7210, 0x7210, 0x11A5,

+    0x721B, 0x721B, 0x112A, 0x722A, 0x722A, 0x1A93, 0x722C, 0x722C, 0x1D3B,

+    0x722D, 0x722D, 0x19BB, 0x7230, 0x7230, 0x187F, 0x7232, 0x7232, 0x1897,

+    0x7235, 0x7235, 0x1974, 0x7236, 0x7236, 0x1409, 0x723A, 0x723A, 0x16ED,

+    0x723B, 0x723B, 0x1F1A, 0x723D, 0x723D, 0x14E5, 0x723E, 0x723E, 0x1916,

+    0x7240, 0x7240, 0x14E6, 0x7246, 0x7246, 0x1998, 0x7247, 0x7247, 0x1D61,

+    0x7248, 0x7248, 0x1D45, 0x724C, 0x724C, 0x1D54, 0x7252, 0x7252, 0x1C17,

+    0x7258, 0x7258, 0x10D7, 0x7259, 0x7259, 0x1696, 0x725B, 0x725B, 0x1842,

+    0x725D, 0x725D, 0x1470, 0x725F, 0x725F, 0x12A9, 0x7261, 0x7261, 0x12AA,

+    0x7262, 0x7262, 0x11C1, 0x7267, 0x7267, 0x12B6, 0x7269, 0x7269, 0x12F2,

+    0x7272, 0x7272, 0x14F9, 0x7279, 0x7279, 0x1D30, 0x727D, 0x727D, 0x0E36,

+    0x7280, 0x7280, 0x150C, 0x7281, 0x7281, 0x120F, 0x72A2, 0x72A2, 0x10D8,

+    0x72A7, 0x72A7, 0x1F73, 0x72AC, 0x72AC, 0x0E37, 0x72AF, 0x72AF, 0x1397,

+    0x72C0, 0x72C0, 0x14E7, 0x72C2, 0x72C2, 0x0F07, 0x72C4, 0x72C4, 0x19E2,

+    0x72CE, 0x72CE, 0x16C7, 0x72D0, 0x72D0, 0x1E8D, 0x72D7, 0x72D7, 0x0F52,

+    0x72D9, 0x72D9, 0x19CB, 0x72E1, 0x72E1, 0x0F27, 0x72E9, 0x72E9, 0x15D7,

+    0x72F8, 0x72F8, 0x1210, 0x72F9, 0x72F9, 0x1E55, 0x72FC, 0x72FC, 0x113F,

+    0x72FD, 0x72FD, 0x1D55, 0x730A, 0x730A, 0x1794, 0x7316, 0x7316, 0x1BC3,

+    0x731B, 0x731B, 0x1279, 0x731C, 0x731C, 0x164C, 0x731D, 0x731D, 0x1AB4,

+    0x7325, 0x7325, 0x17FA, 0x7329, 0x7329, 0x156A, 0x732A, 0x732A, 0x19CC,

+    0x732B, 0x732B, 0x12C8, 0x7336, 0x7337, 0x18BF, 0x733E, 0x733E, 0x1EDD,

+    0x733F, 0x733F, 0x1880, 0x7344, 0x7344, 0x17C0, 0x7345, 0x7345, 0x149C,

+    0x7350, 0x7350, 0x1999, 0x7352, 0x7352, 0x17B8, 0x7357, 0x7357, 0x0F8C,

+    0x7368, 0x7368, 0x10D9, 0x736A, 0x736A, 0x1F05, 0x7370, 0x7370, 0x1782,

+    0x7372, 0x7372, 0x1F0D, 0x7375, 0x7375, 0x1188, 0x7378, 0x7378, 0x15D8,

+    0x737A, 0x737A, 0x1076, 0x737B, 0x737B, 0x1E2D, 0x7384, 0x7384, 0x1E3D,

+    0x7386, 0x7386, 0x1960, 0x7387, 0x7387, 0x15B0, 0x7389, 0x7389, 0x17C1,

+    0x738B, 0x738B, 0x17F2, 0x738E, 0x738E, 0x1A4E, 0x7394, 0x7394, 0x1BF4,

+    0x7396, 0x7396, 0x0F53, 0x7397, 0x7397, 0x1843, 0x7398, 0x7398, 0x0FFE,

+    0x739F, 0x739F, 0x130F, 0x73A7, 0x73A7, 0x18DB, 0x73A9, 0x73A9, 0x17E1,

+    0x73AD, 0x73AD, 0x1471, 0x73B2, 0x73B2, 0x118F, 0x73B3, 0x73B3, 0x10A4,

+    0x73B9, 0x73B9, 0x1E3E, 0x73C0, 0x73C0, 0x131E, 0x73C2, 0x73C2, 0x0D7C,

+    0x73C9, 0x73C9, 0x1310, 0x73CA, 0x73CA, 0x14BC, 0x73CC, 0x73CC, 0x1DB8,

+    0x73CD, 0x73CD, 0x1B50, 0x73CF, 0x73CF, 0x0D8F, 0x73D6, 0x73D6, 0x0F08,

+    0x73D9, 0x73D9, 0x0ED5, 0x73DD, 0x73DD, 0x1F29, 0x73DE, 0x73DE, 0x1120,

+    0x73E0, 0x73E0, 0x1AE2, 0x73E3, 0x73E3, 0x1613, 0x73E4, 0x73E4, 0x13CB,

+    0x73E5, 0x73E5, 0x1917, 0x73E6, 0x73E6, 0x1E21, 0x73E9, 0x73E9, 0x1E66,

+    0x73EA, 0x73EA, 0x0F9F, 0x73ED, 0x73ED, 0x1334, 0x73F7, 0x73F7, 0x12D8,

+    0x73F9, 0x73F9, 0x156B, 0x73FD, 0x73FD, 0x1A4F, 0x73FE, 0x73FE, 0x1E3F,

+    0x7401, 0x7401, 0x1535, 0x7403, 0x7403, 0x0F54, 0x7405, 0x7405, 0x1140,

+    0x7406, 0x7406, 0x1211, 0x7407, 0x7407, 0x15D9, 0x7409, 0x7409, 0x11E8,

+    0x7413, 0x7413, 0x17E2, 0x741B, 0x741B, 0x1CCC, 0x7420, 0x7420, 0x1A07,

+    0x7421, 0x7421, 0x1604, 0x7422, 0x7422, 0x1CEC, 0x7425, 0x7425, 0x1E8E,

+    0x7426, 0x7426, 0x0FFF, 0x7428, 0x7428, 0x0EC5, 0x742A, 0x742A, 0x1000,

+    0x742B, 0x742B, 0x13EE, 0x742C, 0x742C, 0x17E3, 0x742E, 0x742E, 0x1ABC,

+    0x742F, 0x742F, 0x0EF2, 0x7430, 0x7430, 0x1769, 0x7433, 0x7433, 0x1229,

+    0x7434, 0x7434, 0x0FCB, 0x7435, 0x7435, 0x1451, 0x7436, 0x7436, 0x1D3C,

+    0x7438, 0x7438, 0x1CED, 0x743A, 0x743A, 0x139B, 0x743F, 0x743F, 0x1EA8,

+    0x7440, 0x7440, 0x1844, 0x7441, 0x7441, 0x12AB, 0x7443, 0x7443, 0x1C86,

+    0x7444, 0x7444, 0x1536, 0x744B, 0x744B, 0x1898, 0x7455, 0x7455, 0x1DC7,

+    0x7457, 0x7457, 0x1881, 0x7459, 0x7459, 0x104D, 0x745A, 0x745A, 0x1E8F,

+    0x745B, 0x745B, 0x1783, 0x745C, 0x745C, 0x18C1, 0x745E, 0x745E, 0x150D,

+    0x745F, 0x745F, 0x162A, 0x7460, 0x7460, 0x11E9, 0x7462, 0x7462, 0x182C,

+    0x7464, 0x7464, 0x180B, 0x7465, 0x7465, 0x17C4, 0x7468, 0x7468, 0x1B51,

+    0x7469, 0x7469, 0x1E67, 0x746A, 0x746A, 0x1231, 0x746F, 0x746F, 0x1141,

+    0x747E, 0x747E, 0x0FBE, 0x7482, 0x7482, 0x1001, 0x7483, 0x7483, 0x1212,

+    0x7487, 0x7487, 0x1537, 0x7489, 0x7489, 0x1176, 0x748B, 0x748B, 0x199A,

+    0x7498, 0x7498, 0x1221, 0x749C, 0x749C, 0x1EEF, 0x749E, 0x749E, 0x131F,

+    0x749F, 0x749F, 0x0E63, 0x74A1, 0x74A1, 0x1B52, 0x74A3, 0x74A3, 0x1002,

+    0x74A5, 0x74A5, 0x0E64, 0x74A7, 0x74A7, 0x13A1, 0x74A8, 0x74A8, 0x1B99,

+    0x74AA, 0x74AA, 0x1A94, 0x74B0, 0x74B0, 0x1ED6, 0x74B2, 0x74B2, 0x15DA,

+    0x74B5, 0x74B5, 0x1733, 0x74B9, 0x74B9, 0x1605, 0x74BD, 0x74BD, 0x14F3,

+    0x74BF, 0x74BF, 0x1538, 0x74C6, 0x74C6, 0x1B6D, 0x74CA, 0x74CA, 0x0E65,

+    0x74CF, 0x74CF, 0x11BC, 0x74D4, 0x74D4, 0x1784, 0x74D8, 0x74D8, 0x0EF3,

+    0x74DA, 0x74DA, 0x1B9A, 0x74DC, 0x74DC, 0x0EDE, 0x74E0, 0x74E0, 0x1E90,

+    0x74E2, 0x74E2, 0x1D9F, 0x74E3, 0x74E3, 0x1D46, 0x74E6, 0x74E6, 0x17D4,

+    0x74EE, 0x74EE, 0x17CC, 0x74F7, 0x74F7, 0x1961, 0x7501, 0x7501, 0x13BB,

+    0x7504, 0x7504, 0x0E38, 0x7511, 0x7511, 0x1B18, 0x7515, 0x7515, 0x17CD,

+    0x7518, 0x7518, 0x0DC1, 0x751A, 0x751A, 0x1688, 0x751B, 0x751B, 0x1C0D,

+    0x751F, 0x751F, 0x14FA, 0x7523, 0x7523, 0x14BD, 0x7525, 0x7525, 0x14FB,

+    0x7526, 0x7526, 0x158E, 0x7528, 0x7528, 0x182D, 0x752B, 0x752B, 0x13CC,

+    0x752C, 0x752C, 0x182E, 0x7530, 0x7530, 0x1A08, 0x7531, 0x7531, 0x18C2,

+    0x7532, 0x7532, 0x0DCC, 0x7533, 0x7533, 0x1671, 0x7537, 0x7537, 0x1035,

+    0x7538, 0x7538, 0x1A09, 0x753A, 0x753A, 0x1A50, 0x7547, 0x7547, 0x0FAB,

+    0x754C, 0x754C, 0x0E85, 0x754F, 0x754F, 0x17FB, 0x7551, 0x7551, 0x1A0A,

+    0x7553, 0x7553, 0x108B, 0x7554, 0x7554, 0x1335, 0x7559, 0x7559, 0x11EA,

+    0x755B, 0x755B, 0x1B53, 0x755C, 0x755C, 0x1C79, 0x755D, 0x755D, 0x12D9,

+    0x7562, 0x7562, 0x1DB9, 0x7565, 0x7565, 0x114A, 0x7566, 0x7566, 0x1F48,

+    0x756A, 0x756A, 0x1388, 0x756F, 0x756F, 0x1B02, 0x7570, 0x7570, 0x1918,

+    0x7575, 0x7575, 0x1EBC, 0x7576, 0x7576, 0x1096, 0x7578, 0x7578, 0x1003,

+    0x757A, 0x757A, 0x0DDA, 0x757F, 0x757F, 0x1004, 0x7586, 0x7586, 0x0DDB,

+    0x7587, 0x7587, 0x1AE3, 0x758A, 0x758A, 0x1C18, 0x758B, 0x758B, 0x1DBA,

+    0x758E, 0x758E, 0x1590, 0x758F, 0x758F, 0x158F, 0x7591, 0x7591, 0x1903,

+    0x759D, 0x759D, 0x14BE, 0x75A5, 0x75A5, 0x0DF3, 0x75AB, 0x75AB, 0x173F,

+    0x75B1, 0x75B1, 0x1D86, 0x75B2, 0x75B2, 0x1DAF, 0x75B3, 0x75B3, 0x0DC2,

+    0x75B5, 0x75B5, 0x1962, 0x75B8, 0x75B8, 0x1077, 0x75B9, 0x75B9, 0x1B54,

+    0x75BC, 0x75BC, 0x10F6, 0x75BD, 0x75BD, 0x19CD, 0x75BE, 0x75BE, 0x1B6E,

+    0x75C2, 0x75C2, 0x0D7D, 0x75C5, 0x75C5, 0x13BC, 0x75C7, 0x75C7, 0x1B19,

+    0x75CD, 0x75CD, 0x1919, 0x75D2, 0x75D2, 0x1704, 0x75D4, 0x75D4, 0x1CB2,

+    0x75D5, 0x75D5, 0x1F56, 0x75D8, 0x75D8, 0x1100, 0x75D9, 0x75D9, 0x0E66,

+    0x75DB, 0x75DB, 0x1D1F, 0x75E2, 0x75E2, 0x1213, 0x75F0, 0x75F0, 0x1082,

+    0x75F2, 0x75F2, 0x1232, 0x75F4, 0x75F4, 0x1CB3, 0x75FA, 0x75FA, 0x1452,

+    0x75FC, 0x75FC, 0x0EA2, 0x7600, 0x7600, 0x1712, 0x760D, 0x760D, 0x1705,

+    0x7619, 0x7619, 0x1591, 0x761F, 0x761F, 0x17C5, 0x7620, 0x7620, 0x1BE7,

+    0x7621, 0x7621, 0x1BC4, 0x7622, 0x7622, 0x1336, 0x7624, 0x7624, 0x11EB,

+    0x7626, 0x7626, 0x15DB, 0x763B, 0x763B, 0x11DA, 0x7642, 0x7642, 0x11CD,

+    0x764C, 0x764C, 0x16C2, 0x764E, 0x764E, 0x0DA1, 0x7652, 0x7652, 0x18C3,

+    0x7656, 0x7656, 0x13A2, 0x7661, 0x7661, 0x1CB4, 0x7664, 0x7664, 0x1A20,

+    0x7669, 0x7669, 0x1118, 0x766C, 0x766C, 0x1539, 0x7670, 0x7670, 0x17CE,

+    0x7672, 0x7672, 0x1A0B, 0x7678, 0x7678, 0x0E86, 0x767B, 0x767B, 0x1110,

+    0x767C, 0x767C, 0x1347, 0x767D, 0x767E, 0x1381, 0x7684, 0x7684, 0x19E3,

+    0x7686, 0x7686, 0x0DF4, 0x7687, 0x7687, 0x1EF0, 0x768E, 0x768E, 0x0F28,

+    0x7690, 0x7690, 0x0EA3, 0x7693, 0x7693, 0x1E91, 0x76AE, 0x76AE, 0x1DB0,

+    0x76BA, 0x76BA, 0x1C68, 0x76BF, 0x76BF, 0x1293, 0x76C2, 0x76C2, 0x1845,

+    0x76C3, 0x76C3, 0x1372, 0x76C6, 0x76C6, 0x142C, 0x76C8, 0x76C8, 0x1785,

+    0x76CA, 0x76CA, 0x1926, 0x76D2, 0x76D2, 0x1DF1, 0x76D6, 0x76D6, 0x0DF5,

+    0x76DB, 0x76DB, 0x156C, 0x76DC, 0x76DC, 0x10C5, 0x76DE, 0x76DE, 0x197E,

+    0x76DF, 0x76DF, 0x127B, 0x76E1, 0x76E1, 0x1B55, 0x76E3, 0x76E3, 0x0DC3,

+    0x76E4, 0x76E4, 0x1337, 0x76E7, 0x76E7, 0x11A6, 0x76EE, 0x76EE, 0x12B7,

+    0x76F2, 0x76F2, 0x127A, 0x76F4, 0x76F4, 0x1B3F, 0x76F8, 0x76F8, 0x14E8,

+    0x76FC, 0x76FC, 0x1338, 0x76FE, 0x76FE, 0x1614, 0x7701, 0x7701, 0x156D,

+    0x7704, 0x7704, 0x1284, 0x7708, 0x7708, 0x1CFD, 0x7709, 0x7709, 0x12FE,

+    0x770B, 0x770B, 0x0DA2, 0x771E, 0x771E, 0x1B56, 0x7720, 0x7720, 0x1285,

+    0x7729, 0x7729, 0x1E40, 0x7737, 0x7737, 0x0F8A, 0x7738, 0x7738, 0x12AC,

+    0x773A, 0x773A, 0x1A95, 0x773C, 0x773C, 0x16B4, 0x7740, 0x7740, 0x1B91,

+    0x774D, 0x774D, 0x1E41, 0x775B, 0x775B, 0x1A51, 0x7761, 0x7761, 0x15DC,

+    0x7763, 0x7763, 0x10DA, 0x7766, 0x7766, 0x12B8, 0x776B, 0x776B, 0x1C19,

+    0x7779, 0x7779, 0x10C6, 0x777E, 0x777E, 0x0EA4, 0x777F, 0x777F, 0x1795,

+    0x778B, 0x778B, 0x1B57, 0x7791, 0x7791, 0x1294, 0x779E, 0x779E, 0x124A,

+    0x77A5, 0x77A5, 0x13AE, 0x77AC, 0x77AC, 0x1615, 0x77AD, 0x77AD, 0x11CE,

+    0x77B0, 0x77B0, 0x0DC4, 0x77B3, 0x77B3, 0x10F7, 0x77BB, 0x77BB, 0x1C0E,

+    0x77BC, 0x77BC, 0x0E25, 0x77BF, 0x77BF, 0x0F55, 0x77D7, 0x77D7, 0x1C4C,

+    0x77DB, 0x77DB, 0x12AD, 0x77DC, 0x77DC, 0x0FDC, 0x77E2, 0x77E2, 0x164D,

+    0x77E3, 0x77E3, 0x1904, 0x77E5, 0x77E5, 0x1B30, 0x77E9, 0x77E9, 0x0F56,

+    0x77ED, 0x77ED, 0x106C, 0x77EE, 0x77EE, 0x17F6, 0x77EF, 0x77EF, 0x0F29,

+    0x77F3, 0x77F3, 0x1525, 0x7802, 0x7802, 0x149D, 0x7812, 0x7812, 0x1453,

+    0x7825, 0x7825, 0x1B31, 0x7826, 0x7826, 0x1BD0, 0x7827, 0x7827, 0x1CCD,

+    0x782C, 0x782C, 0x122C, 0x7832, 0x7832, 0x1D87, 0x7834, 0x7834, 0x1D3D,

+    0x7845, 0x7845, 0x0FA0, 0x784F, 0x784F, 0x1758, 0x785D, 0x785D, 0x1C3A,

+    0x786B, 0x786B, 0x11EC, 0x786C, 0x786C, 0x0E67, 0x786F, 0x786F, 0x1759,

+    0x787C, 0x787C, 0x143A, 0x7881, 0x7881, 0x1005, 0x7887, 0x7887, 0x1A52,

+    0x788C, 0x788C, 0x11B0, 0x788D, 0x788D, 0x16D7, 0x788E, 0x788E, 0x15BB,

+    0x7891, 0x7891, 0x1454, 0x7897, 0x7897, 0x17E4, 0x78A3, 0x78A3, 0x0DB0,

+    0x78A7, 0x78A7, 0x13A3, 0x78A9, 0x78A9, 0x1526, 0x78BA, 0x78BB, 0x1EC7,

+    0x78BC, 0x78BC, 0x1233, 0x78C1, 0x78C1, 0x1963, 0x78C5, 0x78C5, 0x135C,

+    0x78CA, 0x78CA, 0x11C2, 0x78CB, 0x78CB, 0x1B8A, 0x78CE, 0x78CE, 0x0E87,

+    0x78D0, 0x78D0, 0x1339, 0x78E8, 0x78E8, 0x1234, 0x78EC, 0x78EC, 0x0E68,

+    0x78EF, 0x78EF, 0x1006, 0x78F5, 0x78F5, 0x0DA3, 0x78FB, 0x78FB, 0x133A,

+    0x7901, 0x7901, 0x1C3B, 0x790E, 0x790E, 0x1C3C, 0x7916, 0x7916, 0x1734,

+    0x792A, 0x792A, 0x1162, 0x792B, 0x792B, 0x116E, 0x792C, 0x792C, 0x133B,

+    0x793A, 0x793A, 0x164E, 0x793E, 0x793E, 0x149E, 0x7940, 0x7940, 0x149F,

+    0x7941, 0x7941, 0x1007, 0x7947, 0x7948, 0x1008, 0x7949, 0x7949, 0x1B32,

+    0x7950, 0x7950, 0x1846, 0x7956, 0x7956, 0x1A96, 0x7957, 0x7957, 0x1B33,

+    0x795A, 0x795A, 0x1A97, 0x795B, 0x795B, 0x0E0B, 0x795C, 0x795C, 0x1E92,

+    0x795D, 0x795D, 0x1C7A, 0x795E, 0x795E, 0x1672, 0x7960, 0x7960, 0x14A0,

+    0x7965, 0x7965, 0x14E9, 0x7968, 0x7968, 0x1DA0, 0x796D, 0x796D, 0x1A71,

+    0x797A, 0x797A, 0x100A, 0x797F, 0x797F, 0x11B1, 0x7981, 0x7981, 0x0FCC,

+    0x798D, 0x798D, 0x1EBD, 0x798E, 0x798E, 0x1A53, 0x798F, 0x798F, 0x13D9,

+    0x7991, 0x7991, 0x1847, 0x79A6, 0x79A6, 0x1713, 0x79A7, 0x79A7, 0x1F74,

+    0x79AA, 0x79AA, 0x153A, 0x79AE, 0x79AE, 0x119C, 0x79B1, 0x79B1, 0x10C7,

+    0x79B3, 0x79B3, 0x1706, 0x79B9, 0x79B9, 0x1848, 0x79BD, 0x79BD, 0x0FCD,

+    0x79BE, 0x79BE, 0x1EBE, 0x79BF, 0x79BF, 0x10DB, 0x79C0, 0x79C0, 0x15DD,

+    0x79C1, 0x79C1, 0x14A1, 0x79C9, 0x79C9, 0x13BD, 0x79CA, 0x79CA, 0x1042,

+    0x79CB, 0x79CB, 0x1C69, 0x79D1, 0x79D1, 0x0EDF, 0x79D2, 0x79D2, 0x1C3D,

+    0x79D5, 0x79D5, 0x1455, 0x79D8, 0x79D8, 0x1456, 0x79DF, 0x79DF, 0x1A98,

+    0x79E4, 0x79E4, 0x1CD1, 0x79E6, 0x79E6, 0x1B58, 0x79E7, 0x79E7, 0x16CE,

+    0x79E9, 0x79E9, 0x1B6F, 0x79FB, 0x79FB, 0x191A, 0x7A00, 0x7A00, 0x1F75,

+    0x7A05, 0x7A05, 0x1578, 0x7A08, 0x7A08, 0x0DA4, 0x7A0B, 0x7A0B, 0x1A54,

+    0x7A0D, 0x7A0D, 0x1C3E, 0x7A14, 0x7A14, 0x194A, 0x7A17, 0x7A17, 0x1D56,

+    0x7A19, 0x7A19, 0x1B40, 0x7A1A, 0x7A1A, 0x1CB5, 0x7A1C, 0x7A1C, 0x1201,

+    0x7A1F, 0x7A1F, 0x1DA7, 0x7A20, 0x7A20, 0x1A99, 0x7A2E, 0x7A2E, 0x1ABD,

+    0x7A31, 0x7A31, 0x1CD2, 0x7A36, 0x7A36, 0x185B, 0x7A37, 0x7A37, 0x1B41,

+    0x7A3B, 0x7A3B, 0x10C8, 0x7A3C, 0x7A3C, 0x0D7E, 0x7A3D, 0x7A3D, 0x0E88,

+    0x7A3F, 0x7A3F, 0x0EA5, 0x7A40, 0x7A40, 0x0EBB, 0x7A46, 0x7A46, 0x12B9,

+    0x7A49, 0x7A49, 0x1CB6, 0x7A4D, 0x7A4D, 0x19E4, 0x7A4E, 0x7A4E, 0x1786,

+    0x7A57, 0x7A57, 0x15DE, 0x7A61, 0x7A61, 0x14F6, 0x7A62, 0x7A62, 0x1796,

+    0x7A69, 0x7A69, 0x17C6, 0x7A6B, 0x7A6B, 0x1EC9, 0x7A70, 0x7A70, 0x1707,

+    0x7A74, 0x7A74, 0x1E4B, 0x7A76, 0x7A76, 0x0F57, 0x7A79, 0x7A79, 0x0F7D,

+    0x7A7A, 0x7A7A, 0x0ED6, 0x7A7D, 0x7A7D, 0x1A55, 0x7A7F, 0x7A7F, 0x1BF5,

+    0x7A81, 0x7A81, 0x10EA, 0x7A84, 0x7A84, 0x1B92, 0x7A88, 0x7A88, 0x180C,

+    0x7A92, 0x7A92, 0x1B70, 0x7A93, 0x7A93, 0x1BC5, 0x7A95, 0x7A95, 0x1A9A,

+    0x7A98, 0x7A98, 0x0F72, 0x7A9F, 0x7A9F, 0x0F7A, 0x7AA9, 0x7AAA, 0x17D5,

+    0x7AAE, 0x7AAE, 0x0F7E, 0x7AAF, 0x7AAF, 0x180D, 0x7ABA, 0x7ABA, 0x0FA1,

+    0x7AC4, 0x7AC4, 0x1B9B, 0x7AC5, 0x7AC5, 0x0FA2, 0x7AC7, 0x7AC7, 0x1101,

+    0x7ACA, 0x7ACA, 0x1A21, 0x7ACB, 0x7ACB, 0x122D, 0x7AD7, 0x7AD7, 0x12C9,

+    0x7AD9, 0x7AD9, 0x1BB1, 0x7ADD, 0x7ADD, 0x13BE, 0x7ADF, 0x7ADF, 0x0E69,

+    0x7AE0, 0x7AE0, 0x199B, 0x7AE3, 0x7AE3, 0x1B03, 0x7AE5, 0x7AE5, 0x10F8,

+    0x7AEA, 0x7AEA, 0x15DF, 0x7AED, 0x7AED, 0x0DB1, 0x7AEF, 0x7AEF, 0x106D,

+    0x7AF6, 0x7AF6, 0x0E6A, 0x7AF9, 0x7AF9, 0x1AF4, 0x7AFA, 0x7AFA, 0x1C7B,

+    0x7AFF, 0x7AFF, 0x0DA5, 0x7B0F, 0x7B0F, 0x1EAC, 0x7B11, 0x7B11, 0x1592,

+    0x7B19, 0x7B19, 0x14FC, 0x7B1B, 0x7B1B, 0x19E5, 0x7B1E, 0x7B1E, 0x1D0F,

+    0x7B20, 0x7B20, 0x122E, 0x7B26, 0x7B26, 0x140A, 0x7B2C, 0x7B2C, 0x1A72,

+    0x7B2D, 0x7B2D, 0x1190, 0x7B39, 0x7B39, 0x1579, 0x7B46, 0x7B46, 0x1DBB,

+    0x7B49, 0x7B49, 0x1111, 0x7B4B, 0x7B4B, 0x0FBF, 0x7B4C, 0x7B4C, 0x1A0C,

+    0x7B4D, 0x7B4D, 0x1616, 0x7B4F, 0x7B4F, 0x138E, 0x7B50, 0x7B50, 0x0F09,

+    0x7B51, 0x7B51, 0x1C7C, 0x7B52, 0x7B52, 0x1D20, 0x7B54, 0x7B54, 0x108C,

+    0x7B56, 0x7B56, 0x1BD8, 0x7B60, 0x7B60, 0x0FAC, 0x7B6C, 0x7B6C, 0x156E,

+    0x7B6E, 0x7B6E, 0x150E, 0x7B75, 0x7B75, 0x175A, 0x7B7D, 0x7B7D, 0x17B9,

+    0x7B87, 0x7B87, 0x0DF6, 0x7B8B, 0x7B8B, 0x1A0D, 0x7B8F, 0x7B8F, 0x19BC,

+    0x7B94, 0x7B94, 0x1320, 0x7B95, 0x7B95, 0x100B, 0x7B97, 0x7B97, 0x14BF,

+    0x7B9A, 0x7B9A, 0x1B8B, 0x7B9D, 0x7B9D, 0x0E48, 0x7BA1, 0x7BA1, 0x0EF4,

+    0x7BAD, 0x7BAD, 0x1A0E, 0x7BB1, 0x7BB1, 0x14EA, 0x7BB4, 0x7BB4, 0x1982,

+    0x7BB8, 0x7BB8, 0x19CE, 0x7BC0, 0x7BC0, 0x1A22, 0x7BC1, 0x7BC1, 0x1EF1,

+    0x7BC4, 0x7BC4, 0x1398, 0x7BC6, 0x7BC6, 0x1A0F, 0x7BC7, 0x7BC7, 0x1D62,

+    0x7BC9, 0x7BC9, 0x1C7D, 0x7BD2, 0x7BD2, 0x1661, 0x7BE0, 0x7BE0, 0x1593,

+    0x7BE4, 0x7BE4, 0x10DC, 0x7BE9, 0x7BE9, 0x14A2, 0x7C07, 0x7C07, 0x1AAD,

+    0x7C12, 0x7C12, 0x1B9C, 0x7C1E, 0x7C1E, 0x106E, 0x7C21, 0x7C21, 0x0DA6,

+    0x7C27, 0x7C27, 0x1EF2, 0x7C2A, 0x7C2A, 0x1983, 0x7C2B, 0x7C2B, 0x1594,

+    0x7C3D, 0x7C3D, 0x1C0F, 0x7C3E, 0x7C3E, 0x1187, 0x7C3F, 0x7C3F, 0x140B,

+    0x7C43, 0x7C43, 0x1134, 0x7C4C, 0x7C4C, 0x1AE4, 0x7C4D, 0x7C4D, 0x19E6,

+    0x7C60, 0x7C60, 0x11BD, 0x7C64, 0x7C64, 0x1C10, 0x7C6C, 0x7C6C, 0x1214,

+    0x7C73, 0x7C73, 0x12FF, 0x7C83, 0x7C83, 0x1457, 0x7C89, 0x7C89, 0x142D,

+    0x7C92, 0x7C92, 0x122F, 0x7C95, 0x7C95, 0x1321, 0x7C97, 0x7C97, 0x1A9B,

+    0x7C98, 0x7C98, 0x1A29, 0x7C9F, 0x7C9F, 0x15A5, 0x7CA5, 0x7CA5, 0x1AF5,

+    0x7CA7, 0x7CA7, 0x199C, 0x7CAE, 0x7CAE, 0x1151, 0x7CB1, 0x7CB1, 0x1152,

+    0x7CB2, 0x7CB2, 0x1B9E, 0x7CB3, 0x7CB3, 0x0DFE, 0x7CB9, 0x7CB9, 0x15E0,

+    0x7CBE, 0x7CBE, 0x1A56, 0x7CCA, 0x7CCA, 0x1E93, 0x7CD6, 0x7CD6, 0x1097,

+    0x7CDE, 0x7CDE, 0x142E, 0x7CDF, 0x7CDF, 0x1A9C, 0x7CE0, 0x7CE0, 0x0DDC,

+    0x7CE7, 0x7CE7, 0x1153, 0x7CFB, 0x7CFB, 0x0E89, 0x7CFE, 0x7CFE, 0x0FA3,

+    0x7D00, 0x7D00, 0x100C, 0x7D02, 0x7D02, 0x1AE5, 0x7D04, 0x7D04, 0x16F1,

+    0x7D05, 0x7D05, 0x1EB3, 0x7D06, 0x7D06, 0x1849, 0x7D07, 0x7D07, 0x1F59,

+    0x7D08, 0x7D08, 0x1ED7, 0x7D0A, 0x7D0B, 0x12EA, 0x7D0D, 0x7D0D, 0x1036,

+    0x7D10, 0x7D10, 0x1058, 0x7D14, 0x7D14, 0x1617, 0x7D17, 0x7D17, 0x14A3,

+    0x7D18, 0x7D18, 0x0F19, 0x7D19, 0x7D19, 0x1B34, 0x7D1A, 0x7D1A, 0x0FD8,

+    0x7D1B, 0x7D1B, 0x142F, 0x7D20, 0x7D20, 0x1595, 0x7D21, 0x7D21, 0x135D,

+    0x7D22, 0x7D22, 0x14F7, 0x7D2B, 0x7D2B, 0x1964, 0x7D2C, 0x7D2C, 0x1AE6,

+    0x7D2E, 0x7D2E, 0x1BA9, 0x7D2F, 0x7D2F, 0x11DB, 0x7D30, 0x7D30, 0x157A,

+    0x7D33, 0x7D33, 0x1673, 0x7D35, 0x7D35, 0x19CF, 0x7D39, 0x7D39, 0x1596,

+    0x7D3A, 0x7D3A, 0x0DC5, 0x7D42, 0x7D42, 0x1ABE, 0x7D43, 0x7D43, 0x1E42,

+    0x7D44, 0x7D44, 0x1A9D, 0x7D45, 0x7D45, 0x0E6B, 0x7D46, 0x7D46, 0x133C,

+    0x7D50, 0x7D50, 0x0E43, 0x7D5E, 0x7D5E, 0x0F2A, 0x7D61, 0x7D61, 0x1121,

+    0x7D62, 0x7D62, 0x1E43, 0x7D66, 0x7D66, 0x0FD9, 0x7D68, 0x7D68, 0x18E3,

+    0x7D6A, 0x7D6A, 0x1936, 0x7D6E, 0x7D6E, 0x150F, 0x7D71, 0x7D71, 0x1D21,

+    0x7D72, 0x7D72, 0x14A4, 0x7D73, 0x7D73, 0x0DDD, 0x7D76, 0x7D76, 0x1A23,

+    0x7D79, 0x7D79, 0x0E39, 0x7D7F, 0x7D7F, 0x0F58, 0x7D8E, 0x7D8E, 0x1A57,

+    0x7D8F, 0x7D8F, 0x15E1, 0x7D93, 0x7D93, 0x0E6C, 0x7D9C, 0x7D9C, 0x1ABF,

+    0x7DA0, 0x7DA0, 0x11B2, 0x7DA2, 0x7DA2, 0x1AE7, 0x7DAC, 0x7DAC, 0x15E2,

+    0x7DAD, 0x7DAD, 0x18C4, 0x7DB1, 0x7DB1, 0x0DDE, 0x7DB2, 0x7DB2, 0x125D,

+    0x7DB4, 0x7DB4, 0x1C05, 0x7DB5, 0x7DB5, 0x1BD1, 0x7DB8, 0x7DB8, 0x11F6,

+    0x7DBA, 0x7DBA, 0x100D, 0x7DBB, 0x7DBB, 0x1CF8, 0x7DBD, 0x7DBD, 0x1975,

+    0x7DBE, 0x7DBE, 0x1202, 0x7DBF, 0x7DBF, 0x1286, 0x7DC7, 0x7DC7, 0x1CB7,

+    0x7DCA, 0x7DCA, 0x101E, 0x7DCB, 0x7DCB, 0x1458, 0x7DD6, 0x7DD6, 0x1510,

+    0x7DD8, 0x7DD8, 0x1DEA, 0x7DDA, 0x7DDA, 0x153B, 0x7DDD, 0x7DDD, 0x1B7A,

+    0x7DDE, 0x7DDE, 0x106F, 0x7DE0, 0x7DE0, 0x1C29, 0x7DE1, 0x7DE1, 0x1311,

+    0x7DE3, 0x7DE3, 0x175B, 0x7DE8, 0x7DE8, 0x1D63, 0x7DE9, 0x7DE9, 0x17E5,

+    0x7DEC, 0x7DEC, 0x1287, 0x7DEF, 0x7DEF, 0x1899, 0x7DF4, 0x7DF4, 0x1177,

+    0x7DFB, 0x7DFB, 0x1CB8, 0x7E09, 0x7E09, 0x1B59, 0x7E0A, 0x7E0A, 0x16DF,

+    0x7E15, 0x7E15, 0x17C7, 0x7E1B, 0x7E1B, 0x1322, 0x7E1D, 0x7E1D, 0x1B5A,

+    0x7E1E, 0x7E1E, 0x1E94, 0x7E1F, 0x7E1F, 0x181B, 0x7E21, 0x7E21, 0x19B5,

+    0x7E23, 0x7E23, 0x1E44, 0x7E2B, 0x7E2B, 0x13EF, 0x7E2E, 0x7E2E, 0x1C7E,

+    0x7E2F, 0x7E2F, 0x175C, 0x7E31, 0x7E31, 0x1AC0, 0x7E37, 0x7E37, 0x11DC,

+    0x7E3D, 0x7E3D, 0x1C59, 0x7E3E, 0x7E3E, 0x19E7, 0x7E41, 0x7E41, 0x1389,

+    0x7E43, 0x7E43, 0x143B, 0x7E46, 0x7E46, 0x12DA, 0x7E47, 0x7E47, 0x180E,

+    0x7E52, 0x7E52, 0x1B1A, 0x7E54, 0x7E54, 0x1B42, 0x7E55, 0x7E55, 0x153C,

+    0x7E5E, 0x7E5E, 0x180F, 0x7E61, 0x7E61, 0x15E3, 0x7E69, 0x7E69, 0x1639,

+    0x7E6A, 0x7E6A, 0x1F06, 0x7E6B, 0x7E6B, 0x0E8A, 0x7E6D, 0x7E6D, 0x0E3A,

+    0x7E70, 0x7E70, 0x1A9E, 0x7E79, 0x7E79, 0x1740, 0x7E7C, 0x7E7C, 0x0E8B,

+    0x7E82, 0x7E82, 0x1B9D, 0x7E8C, 0x7E8C, 0x15A6, 0x7E8F, 0x7E8F, 0x1A10,

+    0x7E93, 0x7E93, 0x1787, 0x7E96, 0x7E96, 0x155A, 0x7E98, 0x7E98, 0x1B9F,

+    0x7E9B, 0x7E9B, 0x10DD, 0x7E9C, 0x7E9C, 0x1135, 0x7F36, 0x7F36, 0x140C,

+    0x7F38, 0x7F38, 0x1E01, 0x7F3A, 0x7F3A, 0x0E44, 0x7F4C, 0x7F4C, 0x16E3,

+    0x7F50, 0x7F50, 0x0EF5, 0x7F54, 0x7F54, 0x125E, 0x7F55, 0x7F55, 0x1DDB,

+    0x7F6A, 0x7F6A, 0x1ACB, 0x7F6B, 0x7F6B, 0x0F0E, 0x7F6E, 0x7F6E, 0x1CB9,

+    0x7F70, 0x7F70, 0x138F, 0x7F72, 0x7F72, 0x1511, 0x7F75, 0x7F75, 0x126D,

+    0x7F77, 0x7F77, 0x1D3E, 0x7F79, 0x7F79, 0x1215, 0x7F85, 0x7F85, 0x1119,

+    0x7F88, 0x7F88, 0x100E, 0x7F8A, 0x7F8A, 0x1708, 0x7F8C, 0x7F8C, 0x0DDF,

+    0x7F8E, 0x7F8E, 0x1300, 0x7F94, 0x7F94, 0x0EA6, 0x7F9A, 0x7F9A, 0x1191,

+    0x7F9E, 0x7F9E, 0x15E4, 0x7FA4, 0x7FA4, 0x0F73, 0x7FA8, 0x7FA8, 0x153D,

+    0x7FA9, 0x7FA9, 0x1905, 0x7FB2, 0x7FB2, 0x1F76, 0x7FB8, 0x7FB8, 0x1216,

+    0x7FB9, 0x7FB9, 0x0DFF, 0x7FBD, 0x7FBD, 0x184A, 0x7FC1, 0x7FC1, 0x17CF,

+    0x7FC5, 0x7FC5, 0x164F, 0x7FCA, 0x7FCA, 0x1927, 0x7FCC, 0x7FCC, 0x1928,

+    0x7FCE, 0x7FCE, 0x1192, 0x7FD2, 0x7FD2, 0x162F, 0x7FD4, 0x7FD4, 0x14EB,

+    0x7FD5, 0x7FD5, 0x1F61, 0x7FDF, 0x7FDF, 0x19E8, 0x7FE0, 0x7FE0, 0x1C9A,

+    0x7FE1, 0x7FE1, 0x1459, 0x7FE9, 0x7FE9, 0x1D64, 0x7FEB, 0x7FEB, 0x17E6,

+    0x7FF0, 0x7FF0, 0x1DDC, 0x7FF9, 0x7FF9, 0x0F2B, 0x7FFC, 0x7FFC, 0x1929,

+    0x8000, 0x8000, 0x1810, 0x8001, 0x8001, 0x11A7, 0x8003, 0x8003, 0x0EA7,

+    0x8005, 0x8005, 0x1965, 0x8006, 0x8006, 0x100F, 0x8009, 0x8009, 0x0F59,

+    0x800C, 0x800C, 0x191B, 0x8010, 0x8010, 0x103E, 0x8015, 0x8015, 0x0E6D,

+    0x8017, 0x8017, 0x12AE, 0x8018, 0x8018, 0x1863, 0x802D, 0x802D, 0x1010,

+    0x8033, 0x8033, 0x191C, 0x8036, 0x8036, 0x16EE, 0x803D, 0x803D, 0x1CFE,

+    0x803F, 0x803F, 0x0E6E, 0x8043, 0x8043, 0x1083, 0x8046, 0x8046, 0x1193,

+    0x804A, 0x804A, 0x11CF, 0x8056, 0x8056, 0x156F, 0x8058, 0x8058, 0x1477,

+    0x805A, 0x805A, 0x1C9B, 0x805E, 0x805E, 0x12EC, 0x806F, 0x806F, 0x1178,

+    0x8070, 0x8070, 0x1C5A, 0x8072, 0x8072, 0x1570, 0x8073, 0x8073, 0x182F,

+    0x8077, 0x8077, 0x1B43, 0x807D, 0x807D, 0x1C20, 0x807E, 0x807E, 0x11BE,

+    0x807F, 0x807F, 0x18E0, 0x8084, 0x8084, 0x191D, 0x8085, 0x8085, 0x1606,

+    0x8086, 0x8086, 0x14A5, 0x8087, 0x8087, 0x1A9F, 0x8089, 0x8089, 0x18D5,

+    0x808B, 0x808B, 0x11FD, 0x808C, 0x808C, 0x1011, 0x8096, 0x8096, 0x1C3F,

+    0x809B, 0x809B, 0x1E02, 0x809D, 0x809D, 0x0DA7, 0x80A1, 0x80A1, 0x0EA8,

+    0x80A2, 0x80A2, 0x1B35, 0x80A5, 0x80A5, 0x145A, 0x80A9, 0x80A9, 0x0E3B,

+    0x80AA, 0x80AA, 0x135E, 0x80AF, 0x80AF, 0x0FDD, 0x80B1, 0x80B1, 0x0F1A,

+    0x80B2, 0x80B2, 0x18D6, 0x80B4, 0x80B4, 0x1F1B, 0x80BA, 0x80BA, 0x1D74,

+    0x80C3, 0x80C3, 0x189A, 0x80C4, 0x80C4, 0x1AD1, 0x80CC, 0x80CC, 0x1373,

+    0x80CE, 0x80CE, 0x1D10, 0x80DA, 0x80DA, 0x1374, 0x80DB, 0x80DB, 0x0DCD,

+    0x80DE, 0x80DE, 0x1D88, 0x80E1, 0x80E1, 0x1E95, 0x80E4, 0x80E4, 0x18DC,

+    0x80E5, 0x80E5, 0x1512, 0x80F1, 0x80F1, 0x0F0A, 0x80F4, 0x80F4, 0x10F9,

+    0x80F8, 0x80F8, 0x1F51, 0x80FD, 0x80FD, 0x1059, 0x8102, 0x8102, 0x1B36,

+    0x8105, 0x8105, 0x1E56, 0x8106, 0x8106, 0x1C9C, 0x8107, 0x8107, 0x1E57,

+    0x8108, 0x8108, 0x1272, 0x810A, 0x810A, 0x1BE8, 0x8118, 0x8118, 0x17E7,

+    0x811A, 0x811A, 0x0D90, 0x811B, 0x811B, 0x0E6F, 0x8123, 0x8123, 0x1618,

+    0x8129, 0x8129, 0x15E5, 0x812B, 0x812B, 0x1CFB, 0x812F, 0x812F, 0x1D89,

+    0x8139, 0x8139, 0x1BC6, 0x813E, 0x813E, 0x145B, 0x814B, 0x814B, 0x16E0,

+    0x814E, 0x814E, 0x1674, 0x8150, 0x8151, 0x140D, 0x8154, 0x8154, 0x0DE0,

+    0x8155, 0x8155, 0x17E8, 0x8165, 0x8165, 0x1571, 0x8166, 0x8166, 0x1053,

+    0x816B, 0x816B, 0x1AC1, 0x8170, 0x8170, 0x1811, 0x8171, 0x8171, 0x0E18,

+    0x8178, 0x8178, 0x199D, 0x8179, 0x8179, 0x13DA, 0x817A, 0x817A, 0x153E,

+    0x817F, 0x817F, 0x1D25, 0x8180, 0x8180, 0x135F, 0x8188, 0x8188, 0x0E32,

+    0x818A, 0x818A, 0x1323, 0x818F, 0x818F, 0x0EA9, 0x819A, 0x819A, 0x140F,

+    0x819C, 0x819C, 0x123B, 0x819D, 0x819D, 0x162B, 0x81A0, 0x81A0, 0x0F2C,

+    0x81A3, 0x81A3, 0x1B71, 0x81A8, 0x81A8, 0x1D5C, 0x81B3, 0x81B3, 0x153F,

+    0x81B5, 0x81B5, 0x1C91, 0x81BA, 0x81BA, 0x18F8, 0x81BD, 0x81BD, 0x1084,

+    0x81BE, 0x81BE, 0x1F07, 0x81BF, 0x81BF, 0x1050, 0x81C0, 0x81C0, 0x1107,

+    0x81C2, 0x81C2, 0x145C, 0x81C6, 0x81C6, 0x171C, 0x81CD, 0x81CD, 0x1A73,

+    0x81D8, 0x81D8, 0x113A, 0x81DF, 0x81DF, 0x199E, 0x81E3, 0x81E3, 0x1675,

+    0x81E5, 0x81E5, 0x17D7, 0x81E7, 0x81E7, 0x199F, 0x81E8, 0x81E8, 0x122A,

+    0x81EA, 0x81EA, 0x1966, 0x81ED, 0x81ED, 0x1C9D, 0x81F3, 0x81F3, 0x1B37,

+    0x81F4, 0x81F4, 0x1CBA, 0x81FA, 0x81FA, 0x10A5, 0x81FB, 0x81FB, 0x1B5B,

+    0x81FC, 0x81FC, 0x0F5A, 0x81FE, 0x81FE, 0x18C5, 0x8205, 0x8205, 0x0F5B,

+    0x8207, 0x8207, 0x1735, 0x8208, 0x8208, 0x1F62, 0x820A, 0x820A, 0x0F5C,

+    0x820C, 0x820C, 0x1550, 0x820D, 0x820D, 0x14A6, 0x8212, 0x8212, 0x1513,

+    0x821B, 0x821B, 0x1BF6, 0x821C, 0x821C, 0x1619, 0x821E, 0x821E, 0x12DB,

+    0x821F, 0x821F, 0x1AE8, 0x8221, 0x8221, 0x0DE1, 0x822A, 0x822A, 0x1E03,

+    0x822B, 0x822B, 0x1360, 0x822C, 0x822C, 0x133D, 0x8235, 0x8235, 0x1CDE,

+    0x8236, 0x8236, 0x1324, 0x8237, 0x8237, 0x1E45, 0x8239, 0x8239, 0x1540,

+    0x8240, 0x8240, 0x1410, 0x8245, 0x8245, 0x1736, 0x8247, 0x8247, 0x1A58,

+    0x8259, 0x8259, 0x1BC7, 0x8264, 0x8264, 0x1906, 0x8266, 0x8266, 0x1DEB,

+    0x826E, 0x826E, 0x0DA8, 0x826F, 0x826F, 0x1154, 0x8271, 0x8271, 0x0DA9,

+    0x8272, 0x8272, 0x14F8, 0x8276, 0x8276, 0x176A, 0x8278, 0x8278, 0x1C40,

+    0x827E, 0x827E, 0x16D8, 0x828B, 0x828B, 0x184B, 0x828D, 0x828D, 0x1976,

+    0x828E, 0x828E, 0x0F7F, 0x8292, 0x8292, 0x125F, 0x8299, 0x8299, 0x1411,

+    0x829A, 0x829A, 0x1108, 0x829D, 0x829D, 0x1B38, 0x829F, 0x829F, 0x14CC,

+    0x82A5, 0x82A5, 0x0DF7, 0x82A6, 0x82A6, 0x1E96, 0x82A9, 0x82A9, 0x0FCE,

+    0x82AC, 0x82AC, 0x1430, 0x82AD, 0x82AD, 0x1D3F, 0x82AE, 0x82AE, 0x1797,

+    0x82AF, 0x82AF, 0x1689, 0x82B1, 0x82B1, 0x1EBF, 0x82B3, 0x82B3, 0x1361,

+    0x82B7, 0x82B7, 0x1B39, 0x82B8, 0x82B8, 0x1864, 0x82B9, 0x82B9, 0x0FC0,

+    0x82BB, 0x82BB, 0x1C6A, 0x82BC, 0x82BC, 0x12AF, 0x82BD, 0x82BD, 0x1697,

+    0x82BF, 0x82BF, 0x1952, 0x82D1, 0x82D1, 0x1882, 0x82D2, 0x82D2, 0x176B,

+    0x82D4, 0x82D4, 0x1D11, 0x82D5, 0x82D5, 0x1C41, 0x82D7, 0x82D7, 0x12CA,

+    0x82DB, 0x82DB, 0x0D7F, 0x82DE, 0x82DE, 0x1D8A, 0x82DF, 0x82DF, 0x0F5D,

+    0x82E1, 0x82E1, 0x191E, 0x82E5, 0x82E5, 0x16F2, 0x82E6, 0x82E6, 0x0EAA,

+    0x82E7, 0x82E7, 0x19D0, 0x82F1, 0x82F1, 0x1788, 0x82FD, 0x82FD, 0x0EAB,

+    0x82FE, 0x82FE, 0x1DBC, 0x8301, 0x8301, 0x1B09, 0x8302, 0x8302, 0x12DC,

+    0x8303, 0x8303, 0x1399, 0x8304, 0x8304, 0x0D80, 0x8305, 0x8305, 0x12B0,

+    0x8309, 0x8309, 0x1255, 0x8317, 0x8317, 0x1295, 0x8328, 0x8328, 0x1967,

+    0x832B, 0x832B, 0x1260, 0x832F, 0x832F, 0x13DB, 0x8331, 0x8331, 0x15E6,

+    0x8334, 0x8334, 0x1F08, 0x8335, 0x8335, 0x1937, 0x8336, 0x8336, 0x105F,

+    0x8338, 0x8338, 0x1830, 0x8339, 0x8339, 0x1737, 0x8340, 0x8340, 0x161A,

+    0x8347, 0x8347, 0x1E1C, 0x8349, 0x8349, 0x1C42, 0x834A, 0x834A, 0x1E68,

+    0x834F, 0x834F, 0x194B, 0x8351, 0x8351, 0x191F, 0x8352, 0x8352, 0x1EF3,

+    0x8373, 0x8373, 0x1102, 0x8377, 0x8377, 0x1DC8, 0x837B, 0x837B, 0x19E9,

+    0x8389, 0x8389, 0x1217, 0x838A, 0x838A, 0x19A0, 0x838E, 0x838E, 0x14A7,

+    0x8396, 0x8396, 0x0E70, 0x8398, 0x8398, 0x1676, 0x839E, 0x839E, 0x17E9,

+    0x83A2, 0x83A2, 0x1E58, 0x83A9, 0x83A9, 0x1412, 0x83AA, 0x83AA, 0x1698,

+    0x83AB, 0x83AB, 0x123C, 0x83BD, 0x83BD, 0x1261, 0x83C1, 0x83C1, 0x1C21,

+    0x83C5, 0x83C5, 0x0EF6, 0x83C9, 0x83C9, 0x11B3, 0x83CA, 0x83CA, 0x0F6D,

+    0x83CC, 0x83CC, 0x0FAD, 0x83D3, 0x83D3, 0x0EE0, 0x83D6, 0x83D6, 0x1BC8,

+    0x83DC, 0x83DC, 0x1BD2, 0x83E9, 0x83E9, 0x13CD, 0x83EB, 0x83EB, 0x0FC1,

+    0x83EF, 0x83EF, 0x1EC0, 0x83F0, 0x83F0, 0x0EAC, 0x83F1, 0x83F1, 0x1203,

+    0x83F2, 0x83F2, 0x145D, 0x83F4, 0x83F4, 0x16C3, 0x83F9, 0x83F9, 0x19D1,

+    0x83FD, 0x83FD, 0x1607, 0x8403, 0x8403, 0x1C92, 0x8404, 0x8404, 0x10C9,

+    0x840A, 0x840A, 0x1147, 0x840C, 0x840C, 0x127C, 0x840D, 0x840D, 0x1D6C,

+    0x840E, 0x840E, 0x189B, 0x8429, 0x8429, 0x1C6B, 0x842C, 0x842C, 0x124B,

+    0x8431, 0x8431, 0x1F39, 0x8438, 0x8438, 0x18C6, 0x843D, 0x843D, 0x1122,

+    0x8449, 0x8449, 0x1771, 0x8457, 0x8457, 0x19D2, 0x845B, 0x845B, 0x0DB2,

+    0x8461, 0x8461, 0x1D8B, 0x8463, 0x8463, 0x10FA, 0x8466, 0x8466, 0x189C,

+    0x846B, 0x846B, 0x1E97, 0x846C, 0x846C, 0x19A1, 0x846F, 0x846F, 0x16F3,

+    0x8475, 0x8475, 0x0FA4, 0x847A, 0x847A, 0x1B12, 0x8490, 0x8490, 0x15E7,

+    0x8494, 0x8494, 0x1650, 0x8499, 0x8499, 0x12BF, 0x849C, 0x849C, 0x14C0,

+    0x84A1, 0x84A1, 0x1362, 0x84B2, 0x84B2, 0x1D8C, 0x84B8, 0x84B8, 0x1B1B,

+    0x84BB, 0x84BB, 0x16F4, 0x84BC, 0x84BC, 0x1BC9, 0x84BF, 0x84BF, 0x1E98,

+    0x84C0, 0x84C0, 0x15AD, 0x84C2, 0x84C2, 0x1296, 0x84C4, 0x84C4, 0x1C7F,

+    0x84C6, 0x84C6, 0x1527, 0x84C9, 0x84C9, 0x1831, 0x84CB, 0x84CB, 0x0DF8,

+    0x84CD, 0x84CD, 0x1651, 0x84D1, 0x84D1, 0x14A8, 0x84DA, 0x84DA, 0x15E8,

+    0x84EC, 0x84EC, 0x13F0, 0x84EE, 0x84EE, 0x1179, 0x84F4, 0x84F4, 0x161B,

+    0x84FC, 0x84FC, 0x11D0, 0x8511, 0x8511, 0x128B, 0x8513, 0x8513, 0x124C,

+    0x8514, 0x8514, 0x13DC, 0x8517, 0x8517, 0x1968, 0x8518, 0x8518, 0x14CD,

+    0x851A, 0x851A, 0x186A, 0x851E, 0x851E, 0x11DD, 0x8521, 0x8521, 0x1BD3,

+    0x8523, 0x8523, 0x19A2, 0x8525, 0x8525, 0x1C5B, 0x852C, 0x852C, 0x1597,

+    0x852D, 0x852D, 0x18EF, 0x852F, 0x852F, 0x1B5C, 0x853D, 0x853D, 0x1D75,

+    0x853F, 0x853F, 0x189D, 0x8541, 0x8541, 0x1085, 0x8543, 0x8543, 0x138A,

+    0x8549, 0x8549, 0x1C43, 0x854E, 0x854E, 0x0F2D, 0x8553, 0x8553, 0x1865,

+    0x8559, 0x8559, 0x1E74, 0x8563, 0x8563, 0x161C, 0x8568, 0x8568, 0x0F8D,

+    0x8569, 0x8569, 0x1D06, 0x856A, 0x856A, 0x12DD, 0x856D, 0x856D, 0x1598,

+    0x8584, 0x8584, 0x1325, 0x8587, 0x8587, 0x1301, 0x858F, 0x858F, 0x1907,

+    0x8591, 0x8591, 0x0DE2, 0x8594, 0x8594, 0x19A3, 0x859B, 0x859B, 0x1551,

+    0x85A6, 0x85A6, 0x1BF7, 0x85A8, 0x85A8, 0x1F35, 0x85A9, 0x85A9, 0x14C7,

+    0x85AA, 0x85AA, 0x1677, 0x85AF, 0x85AF, 0x1514, 0x85B0, 0x85B0, 0x1F32,

+    0x85BA, 0x85BA, 0x1A74, 0x85C1, 0x85C1, 0x0EAD, 0x85C9, 0x85C9, 0x1969,

+    0x85CD, 0x85CD, 0x1136, 0x85CE, 0x85CE, 0x1678, 0x85CF, 0x85CF, 0x19A4,

+    0x85D5, 0x85D5, 0x184C, 0x85DC, 0x85DC, 0x1163, 0x85DD, 0x85DD, 0x1798,

+    0x85E4, 0x85E4, 0x1112, 0x85E5, 0x85E5, 0x16F5, 0x85E9, 0x85E9, 0x138B,

+    0x85EA, 0x85EA, 0x15E9, 0x85F7, 0x85F7, 0x19D3, 0x85FA, 0x85FA, 0x1222,

+    0x85FB, 0x85FB, 0x1AA0, 0x85FF, 0x85FF, 0x0EE9, 0x8602, 0x8602, 0x1799,

+    0x8606, 0x8606, 0x11A8, 0x8607, 0x8607, 0x1599, 0x860A, 0x860A, 0x17C8,

+    0x8616, 0x8616, 0x1724, 0x8617, 0x8617, 0x13A4, 0x861A, 0x861A, 0x1541,

+    0x862D, 0x862D, 0x112B, 0x863F, 0x863F, 0x111A, 0x864E, 0x864E, 0x1E99,

+    0x8650, 0x8650, 0x1DD0, 0x8654, 0x8654, 0x0E19, 0x8655, 0x8655, 0x1BDD,

+    0x865B, 0x865B, 0x1E29, 0x865C, 0x865C, 0x11A9, 0x865E, 0x865E, 0x184D,

+    0x865F, 0x865F, 0x1E9A, 0x8667, 0x8667, 0x1F49, 0x8679, 0x8679, 0x1EB4,

+    0x868A, 0x868A, 0x12ED, 0x868C, 0x868C, 0x1363, 0x8693, 0x8693, 0x1938,

+    0x86A3, 0x86A3, 0x0ED7, 0x86A4, 0x86A4, 0x1AA1, 0x86A9, 0x86A9, 0x1CBB,

+    0x86C7, 0x86C7, 0x14A9, 0x86CB, 0x86CB, 0x1070, 0x86D4, 0x86D4, 0x1F09,

+    0x86D9, 0x86D9, 0x17D8, 0x86DB, 0x86DB, 0x1AE9, 0x86DF, 0x86DF, 0x0F2E,

+    0x86E4, 0x86E4, 0x1DF2, 0x86ED, 0x86ED, 0x1B72, 0x86FE, 0x86FE, 0x1699,

+    0x8700, 0x8700, 0x1C4D, 0x8702, 0x8702, 0x13F1, 0x8703, 0x8703, 0x1679,

+    0x8708, 0x8708, 0x17BA, 0x8718, 0x8718, 0x1B3A, 0x871A, 0x871A, 0x145E,

+    0x871C, 0x871C, 0x1314, 0x874E, 0x874E, 0x0DB4, 0x8755, 0x8755, 0x1662,

+    0x8757, 0x8757, 0x1EF4, 0x875F, 0x875F, 0x189E, 0x8766, 0x8766, 0x1DC9,

+    0x8768, 0x8768, 0x162C, 0x8774, 0x8774, 0x1E9B, 0x8776, 0x8776, 0x1A2F,

+    0x8778, 0x8778, 0x17D9, 0x8782, 0x8782, 0x1142, 0x878D, 0x878D, 0x18E4,

+    0x879F, 0x879F, 0x1297, 0x87A2, 0x87A2, 0x1E69, 0x87B3, 0x87B3, 0x1098,

+    0x87BA, 0x87BA, 0x111B, 0x87C4, 0x87C4, 0x1CD0, 0x87E0, 0x87E0, 0x133E,

+    0x87EC, 0x87EC, 0x1542, 0x87EF, 0x87EF, 0x1812, 0x87F2, 0x87F2, 0x1C8D,

+    0x87F9, 0x87F9, 0x1E10, 0x87FB, 0x87FB, 0x1908, 0x87FE, 0x87FE, 0x155B,

+    0x8805, 0x8805, 0x163A, 0x881F, 0x881F, 0x113B, 0x8822, 0x8822, 0x1B04,

+    0x8823, 0x8823, 0x1164, 0x8831, 0x8831, 0x0EAE, 0x8836, 0x8836, 0x1984,

+    0x883B, 0x883B, 0x124D, 0x8840, 0x8840, 0x1E4C, 0x8846, 0x8846, 0x1B0C,

+    0x884C, 0x884C, 0x1E1D, 0x884D, 0x884D, 0x175D, 0x8852, 0x8852, 0x1E46,

+    0x8853, 0x8853, 0x1624, 0x8857, 0x8857, 0x0D81, 0x8859, 0x8859, 0x169A,

+    0x885B, 0x885B, 0x189F, 0x885D, 0x885D, 0x1C8E, 0x8861, 0x8861, 0x1E6A,

+    0x8862, 0x8862, 0x0F5E, 0x8863, 0x8863, 0x1909, 0x8868, 0x8868, 0x1DA1,

+    0x886B, 0x886B, 0x14CE, 0x8870, 0x8870, 0x15BD, 0x8872, 0x8872, 0x1037,

+    0x8877, 0x8877, 0x1C8F, 0x887E, 0x887F, 0x0FCF, 0x8881, 0x8881, 0x1883,

+    0x8882, 0x8882, 0x129B, 0x8888, 0x8888, 0x0D82, 0x888B, 0x888B, 0x10A6,

+    0x888D, 0x888D, 0x1D8D, 0x8892, 0x8892, 0x1071, 0x8896, 0x8896, 0x15EA,

+    0x8897, 0x8897, 0x1B5D, 0x889E, 0x889E, 0x0EC6, 0x88AB, 0x88AB, 0x1DB1,

+    0x88B4, 0x88B4, 0x0EAF, 0x88C1, 0x88C1, 0x19B6, 0x88C2, 0x88C2, 0x1182,

+    0x88CF, 0x88CF, 0x1218, 0x88D4, 0x88D4, 0x179A, 0x88D5, 0x88D5, 0x18C7,

+    0x88D9, 0x88D9, 0x0F74, 0x88DC, 0x88DC, 0x13CE, 0x88DD, 0x88DD, 0x19A5,

+    0x88DF, 0x88DF, 0x14AA, 0x88E1, 0x88E1, 0x1219, 0x88E8, 0x88E8, 0x145F,

+    0x88F3, 0x88F3, 0x14EC, 0x88F4, 0x88F5, 0x1375, 0x88F8, 0x88F8, 0x111C,

+    0x88FD, 0x88FD, 0x1A75, 0x8907, 0x8907, 0x13DD, 0x8910, 0x8910, 0x0DB3,

+    0x8912, 0x8912, 0x1D8E, 0x8913, 0x8913, 0x13CF, 0x8918, 0x8918, 0x18A0,

+    0x8919, 0x8919, 0x1377, 0x8925, 0x8925, 0x181C, 0x892A, 0x892A, 0x1D26,

+    0x8936, 0x8936, 0x1630, 0x8938, 0x8938, 0x11DE, 0x893B, 0x893B, 0x1552,

+    0x8941, 0x8941, 0x0DE3, 0x8944, 0x8944, 0x1709, 0x895F, 0x895F, 0x0FD1,

+    0x8964, 0x8964, 0x1137, 0x896A, 0x896A, 0x1256, 0x8972, 0x8972, 0x1631,

+    0x897F, 0x897F, 0x1515, 0x8981, 0x8981, 0x1813, 0x8983, 0x8983, 0x1086,

+    0x8986, 0x8986, 0x13DE, 0x8987, 0x8987, 0x1D57, 0x898B, 0x898B, 0x0E3C,

+    0x898F, 0x898F, 0x0FA5, 0x8993, 0x8993, 0x127E, 0x8996, 0x8996, 0x1652,

+    0x89A1, 0x89A1, 0x0E33, 0x89A9, 0x89A9, 0x10CA, 0x89AA, 0x89AA, 0x1CC3,

+    0x89B2, 0x89B2, 0x0FC2, 0x89BA, 0x89BA, 0x0D91, 0x89BD, 0x89BD, 0x1138,

+    0x89C0, 0x89C0, 0x0EF7, 0x89D2, 0x89D2, 0x0D92, 0x89E3, 0x89E3, 0x1E11,

+    0x89F4, 0x89F4, 0x14ED, 0x89F8, 0x89F8, 0x1C4E, 0x8A00, 0x8A00, 0x1721,

+    0x8A02, 0x8A02, 0x1A59, 0x8A03, 0x8A03, 0x1413, 0x8A08, 0x8A08, 0x0E8C,

+    0x8A0A, 0x8A0A, 0x167A, 0x8A0C, 0x8A0C, 0x1EB5, 0x8A0E, 0x8A0E, 0x1D1C,

+    0x8A13, 0x8A13, 0x1F33, 0x8A16, 0x8A16, 0x1F5A, 0x8A17, 0x8A17, 0x1CEE,

+    0x8A18, 0x8A18, 0x1012, 0x8A1B, 0x8A1B, 0x17DA, 0x8A1D, 0x8A1D, 0x169B,

+    0x8A1F, 0x8A1F, 0x15B5, 0x8A23, 0x8A23, 0x0E45, 0x8A25, 0x8A25, 0x1056,

+    0x8A2A, 0x8A2A, 0x1364, 0x8A2D, 0x8A2D, 0x1553, 0x8A31, 0x8A31, 0x1E2A,

+    0x8A34, 0x8A34, 0x159A, 0x8A36, 0x8A36, 0x0D83, 0x8A3A, 0x8A3A, 0x1B5E,

+    0x8A3B, 0x8A3B, 0x1AEA, 0x8A50, 0x8A50, 0x14AB, 0x8A54, 0x8A54, 0x1AA2,

+    0x8A55, 0x8A55, 0x1D6D, 0x8A5B, 0x8A5B, 0x19D4, 0x8A5E, 0x8A5E, 0x14AC,

+    0x8A60, 0x8A60, 0x1789, 0x8A62, 0x8A62, 0x161D, 0x8A63, 0x8A63, 0x179B,

+    0x8A66, 0x8A66, 0x1653, 0x8A69, 0x8A69, 0x1654, 0x8A6D, 0x8A6D, 0x0F93,

+    0x8A6E, 0x8A6E, 0x1A11, 0x8A70, 0x8A70, 0x1F77, 0x8A71, 0x8A71, 0x1EC1,

+    0x8A72, 0x8A72, 0x1E12, 0x8A73, 0x8A73, 0x14EE, 0x8A75, 0x8A75, 0x1543,

+    0x8A79, 0x8A79, 0x1C11, 0x8A85, 0x8A85, 0x1AEB, 0x8A87, 0x8A87, 0x0EE1,

+    0x8A8C, 0x8A8C, 0x1B3B, 0x8A8D, 0x8A8D, 0x1939, 0x8A93, 0x8A93, 0x1516,

+    0x8A95, 0x8A95, 0x1CF9, 0x8A98, 0x8A98, 0x18C8, 0x8A9E, 0x8A9E, 0x1714,

+    0x8AA0, 0x8AA0, 0x1572, 0x8AA1, 0x8AA1, 0x0E8D, 0x8AA3, 0x8AA3, 0x12DE,

+    0x8AA4, 0x8AA4, 0x17BB, 0x8AA5, 0x8AA5, 0x0EB0, 0x8AA6, 0x8AA6, 0x15B6,

+    0x8AA8, 0x8AA8, 0x1F0A, 0x8AAA, 0x8AAA, 0x1554, 0x8AB0, 0x8AB0, 0x15EB,

+    0x8AB2, 0x8AB2, 0x0EE2, 0x8AB9, 0x8AB9, 0x1460, 0x8ABC, 0x8ABC, 0x190A,

+    0x8ABE, 0x8ABE, 0x18E9, 0x8ABF, 0x8ABF, 0x1AA3, 0x8AC2, 0x8AC2, 0x1C12,

+    0x8AC4, 0x8AC4, 0x161E, 0x8AC7, 0x8AC7, 0x1087, 0x8ACB, 0x8ACB, 0x1C22,

+    0x8ACD, 0x8ACD, 0x19BD, 0x8ACF, 0x8ACF, 0x1C6C, 0x8AD2, 0x8AD2, 0x1155,

+    0x8AD6, 0x8AD6, 0x11B7, 0x8ADB, 0x8ADB, 0x18C9, 0x8ADC, 0x8ADC, 0x1C1A,

+    0x8AE1, 0x8AE1, 0x1655, 0x8AE6, 0x8AE6, 0x1C2A, 0x8AE7, 0x8AE7, 0x1E13,

+    0x8AEA, 0x8AEA, 0x1A5A, 0x8AEB, 0x8AEB, 0x0DAA, 0x8AED, 0x8AED, 0x18CA,

+    0x8AEE, 0x8AEE, 0x196A, 0x8AF1, 0x8AF1, 0x1F42, 0x8AF6, 0x8AF6, 0x168A,

+    0x8AF7, 0x8AF7, 0x1DA9, 0x8AF8, 0x8AF8, 0x1A76, 0x8AFA, 0x8AFA, 0x1722,

+    0x8AFE, 0x8AFE, 0x102B, 0x8B00, 0x8B00, 0x12B1, 0x8B01, 0x8B01, 0x16BA,

+    0x8B02, 0x8B02, 0x18A1, 0x8B04, 0x8B04, 0x1113, 0x8B0E, 0x8B0E, 0x1302,

+    0x8B10, 0x8B10, 0x1315, 0x8B14, 0x8B14, 0x1DD1, 0x8B16, 0x8B16, 0x15A7,

+    0x8B17, 0x8B17, 0x1365, 0x8B19, 0x8B19, 0x0E49, 0x8B1A, 0x8B1A, 0x192A,

+    0x8B1B, 0x8B1B, 0x0DE4, 0x8B1D, 0x8B1D, 0x14AD, 0x8B20, 0x8B20, 0x1814,

+    0x8B28, 0x8B28, 0x12B2, 0x8B2B, 0x8B2B, 0x19EA, 0x8B2C, 0x8B2C, 0x11ED,

+    0x8B33, 0x8B33, 0x0F5F, 0x8B39, 0x8B39, 0x0FC3, 0x8B41, 0x8B41, 0x1EC2,

+    0x8B49, 0x8B49, 0x1B1C, 0x8B4E, 0x8B4E, 0x1F4B, 0x8B4F, 0x8B4F, 0x1013,

+    0x8B58, 0x8B58, 0x1663, 0x8B5A, 0x8B5A, 0x1088, 0x8B5C, 0x8B5C, 0x13D0,

+    0x8B66, 0x8B66, 0x0E71, 0x8B6C, 0x8B6C, 0x1461, 0x8B6F, 0x8B6F, 0x1741,

+    0x8B70, 0x8B70, 0x190B, 0x8B74, 0x8B74, 0x0E3D, 0x8B77, 0x8B77, 0x1E9C,

+    0x8B7D, 0x8B7D, 0x179C, 0x8B80, 0x8B80, 0x10DE, 0x8B8A, 0x8B8A, 0x13A9,

+    0x8B90, 0x8B90, 0x15EC, 0x8B92, 0x8B92, 0x1BB2, 0x8B93, 0x8B93, 0x170A,

+    0x8B96, 0x8B96, 0x1BB3, 0x8B9A, 0x8B9A, 0x1BA0, 0x8C37, 0x8C37, 0x0EBC,

+    0x8C3F, 0x8C3F, 0x0E8E, 0x8C41, 0x8C41, 0x1EDE, 0x8C46, 0x8C46, 0x1103,

+    0x8C48, 0x8C48, 0x1014, 0x8C4A, 0x8C4A, 0x1DAA, 0x8C4C, 0x8C4C, 0x17EA,

+    0x8C55, 0x8C55, 0x1656, 0x8C5A, 0x8C5A, 0x10E7, 0x8C61, 0x8C61, 0x14EF,

+    0x8C6A, 0x8C6A, 0x1E9D, 0x8C6B, 0x8C6B, 0x179D, 0x8C79, 0x8C79, 0x1DA2,

+    0x8C7A, 0x8C7A, 0x1657, 0x8C82, 0x8C82, 0x1C44, 0x8C8A, 0x8C8A, 0x1273,

+    0x8C8C, 0x8C8C, 0x12B3, 0x8C9D, 0x8C9D, 0x1D58, 0x8C9E, 0x8C9E, 0x1A5B,

+    0x8CA0, 0x8CA0, 0x1414, 0x8CA1, 0x8CA1, 0x19B7, 0x8CA2, 0x8CA2, 0x0ED8,

+    0x8CA7, 0x8CA7, 0x1472, 0x8CA8, 0x8CA8, 0x1EC3, 0x8CA9, 0x8CA9, 0x1D47,

+    0x8CAA, 0x8CAA, 0x1CFF, 0x8CAB, 0x8CAB, 0x0EF8, 0x8CAC, 0x8CAC, 0x1BD9,

+    0x8CAF, 0x8CAF, 0x19D5, 0x8CB0, 0x8CB0, 0x157B, 0x8CB3, 0x8CB3, 0x1921,

+    0x8CB4, 0x8CB4, 0x0F98, 0x8CB6, 0x8CB6, 0x1D68, 0x8CB7, 0x8CB7, 0x126E,

+    0x8CB8, 0x8CB8, 0x10A7, 0x8CBB, 0x8CBB, 0x1462, 0x8CBC, 0x8CBC, 0x1C1B,

+    0x8CBD, 0x8CBD, 0x1920, 0x8CBF, 0x8CBF, 0x12DF, 0x8CC0, 0x8CC0, 0x1DCA,

+    0x8CC1, 0x8CC1, 0x1431, 0x8CC2, 0x8CC2, 0x11C3, 0x8CC3, 0x8CC3, 0x194C,

+    0x8CC4, 0x8CC4, 0x1F0B, 0x8CC7, 0x8CC7, 0x196B, 0x8CC8, 0x8CC8, 0x0D84,

+    0x8CCA, 0x8CCA, 0x19EB, 0x8CD1, 0x8CD1, 0x1B5F, 0x8CD3, 0x8CD3, 0x1473,

+    0x8CDA, 0x8CDA, 0x11C4, 0x8CDC, 0x8CDC, 0x14AE, 0x8CDE, 0x8CDE, 0x14F0,

+    0x8CE0, 0x8CE0, 0x1378, 0x8CE2, 0x8CE2, 0x1E47, 0x8CE3, 0x8CE3, 0x126F,

+    0x8CE4, 0x8CE4, 0x1BF8, 0x8CE6, 0x8CE6, 0x1415, 0x8CEA, 0x8CEA, 0x1B73,

+    0x8CED, 0x8CED, 0x10CB, 0x8CF4, 0x8CF4, 0x11C5, 0x8CFB, 0x8CFB, 0x1416,

+    0x8CFC, 0x8CFC, 0x0F60, 0x8CFD, 0x8CFD, 0x14F4, 0x8D04, 0x8D04, 0x1B3C,

+    0x8D05, 0x8D05, 0x1C93, 0x8D07, 0x8D07, 0x18DD, 0x8D08, 0x8D08, 0x1B1D,

+    0x8D0A, 0x8D0A, 0x1BA1, 0x8D0D, 0x8D0D, 0x155C, 0x8D13, 0x8D13, 0x19A6,

+    0x8D16, 0x8D16, 0x15A8, 0x8D64, 0x8D64, 0x19EC, 0x8D66, 0x8D66, 0x14AF,

+    0x8D6B, 0x8D6B, 0x1E34, 0x8D70, 0x8D70, 0x1AEC, 0x8D73, 0x8D73, 0x0FA6,

+    0x8D74, 0x8D74, 0x1417, 0x8D77, 0x8D77, 0x1015, 0x8D85, 0x8D85, 0x1C45,

+    0x8D8A, 0x8D8A, 0x188A, 0x8D99, 0x8D99, 0x1AA4, 0x8DA3, 0x8DA3, 0x1C9E,

+    0x8DA8, 0x8DA8, 0x1C6D, 0x8DB3, 0x8DB3, 0x1AAE, 0x8DBA, 0x8DBA, 0x1418,

+    0x8DBE, 0x8DBE, 0x1B3D, 0x8DC6, 0x8DC6, 0x1D12, 0x8DCB, 0x8DCB, 0x1348,

+    0x8DCC, 0x8DCC, 0x1B74, 0x8DCF, 0x8DCF, 0x0D85, 0x8DDB, 0x8DDB, 0x1D40,

+    0x8DDD, 0x8DDD, 0x0E0C, 0x8DE1, 0x8DE1, 0x19ED, 0x8DE3, 0x8DE3, 0x1544,

+    0x8DE8, 0x8DE8, 0x0EE3, 0x8DEF, 0x8DEF, 0x11AA, 0x8DF3, 0x8DF3, 0x10CC,

+    0x8E0A, 0x8E0A, 0x1832, 0x8E0F, 0x8E0F, 0x108D, 0x8E10, 0x8E10, 0x1BF9,

+    0x8E1E, 0x8E1E, 0x0E0D, 0x8E2A, 0x8E2A, 0x1AC2, 0x8E30, 0x8E30, 0x18CB,

+    0x8E35, 0x8E35, 0x1AC3, 0x8E42, 0x8E42, 0x18CC, 0x8E44, 0x8E44, 0x1A77,

+    0x8E47, 0x8E47, 0x0E1A, 0x8E48, 0x8E48, 0x10CD, 0x8E49, 0x8E49, 0x1B8C,

+    0x8E4A, 0x8E4A, 0x1E75, 0x8E59, 0x8E59, 0x1C80, 0x8E5F, 0x8E5F, 0x19EE,

+    0x8E60, 0x8E60, 0x1BE9, 0x8E74, 0x8E74, 0x1C81, 0x8E76, 0x8E76, 0x0F8E,

+    0x8E81, 0x8E81, 0x1AA5, 0x8E87, 0x8E87, 0x19D6, 0x8E8A, 0x8E8A, 0x1AED,

+    0x8E8D, 0x8E8D, 0x16F6, 0x8EAA, 0x8EAA, 0x1223, 0x8EAB, 0x8EAB, 0x167B,

+    0x8EAC, 0x8EAC, 0x0F80, 0x8EC0, 0x8EC0, 0x0F61, 0x8ECA, 0x8ECA, 0x1B8D,

+    0x8ECB, 0x8ECB, 0x16BB, 0x8ECC, 0x8ECC, 0x0F94, 0x8ECD, 0x8ECD, 0x0F75,

+    0x8ED2, 0x8ED2, 0x1E2E, 0x8EDF, 0x8EDF, 0x175E, 0x8EEB, 0x8EEB, 0x1B60,

+    0x8EF8, 0x8EF8, 0x1C82, 0x8EFB, 0x8EFB, 0x0D86, 0x8EFE, 0x8EFE, 0x1664,

+    0x8F03, 0x8F03, 0x0F2F, 0x8F05, 0x8F05, 0x11AB, 0x8F09, 0x8F09, 0x19B8,

+    0x8F12, 0x8F12, 0x1C1C, 0x8F13, 0x8F13, 0x124E, 0x8F14, 0x8F14, 0x13D1,

+    0x8F15, 0x8F15, 0x0E72, 0x8F1B, 0x8F1B, 0x1156, 0x8F1C, 0x8F1C, 0x1CBC,

+    0x8F1D, 0x8F1D, 0x1F43, 0x8F1E, 0x8F1E, 0x1262, 0x8F1F, 0x8F1F, 0x1C06,

+    0x8F26, 0x8F26, 0x117A, 0x8F27, 0x8F27, 0x13BF, 0x8F29, 0x8F29, 0x1379,

+    0x8F2A, 0x8F2A, 0x11F7, 0x8F2F, 0x8F2F, 0x1B7B, 0x8F33, 0x8F33, 0x1AEE,

+    0x8F38, 0x8F38, 0x15ED, 0x8F39, 0x8F39, 0x13DF, 0x8F3B, 0x8F3B, 0x13E0,

+    0x8F3E, 0x8F3E, 0x1A12, 0x8F3F, 0x8F3F, 0x1738, 0x8F44, 0x8F44, 0x1DE2,

+    0x8F45, 0x8F45, 0x1884, 0x8F49, 0x8F49, 0x1A13, 0x8F4D, 0x8F4D, 0x1C07,

+    0x8F4E, 0x8F4E, 0x0F30, 0x8F5D, 0x8F5D, 0x1739, 0x8F5F, 0x8F5F, 0x0F1B,

+    0x8F62, 0x8F62, 0x116F, 0x8F9B, 0x8F9B, 0x167C, 0x8F9C, 0x8F9C, 0x0EB1,

+    0x8FA3, 0x8FA3, 0x112E, 0x8FA6, 0x8FA6, 0x1D48, 0x8FA8, 0x8FA8, 0x13AA,

+    0x8FAD, 0x8FAD, 0x14B0, 0x8FAF, 0x8FAF, 0x13AB, 0x8FB0, 0x8FB0, 0x1B61,

+    0x8FB1, 0x8FB1, 0x181D, 0x8FB2, 0x8FB2, 0x1051, 0x8FC2, 0x8FC2, 0x184E,

+    0x8FC5, 0x8FC5, 0x167D, 0x8FCE, 0x8FCE, 0x178A, 0x8FD1, 0x8FD1, 0x0FC4,

+    0x8FD4, 0x8FD4, 0x133F, 0x8FE6, 0x8FE6, 0x0D87, 0x8FEA, 0x8FEA, 0x19EF,

+    0x8FEB, 0x8FEB, 0x1326, 0x8FED, 0x8FED, 0x1B75, 0x8FF0, 0x8FF0, 0x1625,

+    0x8FF2, 0x8FF2, 0x0E2A, 0x8FF7, 0x8FF7, 0x1303, 0x8FF9, 0x8FF9, 0x19F0,

+    0x8FFD, 0x8FFD, 0x1C6E, 0x9000, 0x9000, 0x1D27, 0x9001, 0x9001, 0x15B7,

+    0x9002, 0x9002, 0x0EFE, 0x9003, 0x9003, 0x10CE, 0x9005, 0x9005, 0x1F2A,

+    0x9006, 0x9006, 0x1742, 0x9008, 0x9008, 0x1E6B, 0x900B, 0x900B, 0x1D8F,

+    0x900D, 0x900D, 0x159B, 0x900F, 0x900F, 0x1D2D, 0x9010, 0x9010, 0x1C83,

+    0x9011, 0x9011, 0x0F62, 0x9014, 0x9014, 0x10CF, 0x9015, 0x9015, 0x0E73,

+    0x9017, 0x9017, 0x1104, 0x9019, 0x9019, 0x19D7, 0x901A, 0x901A, 0x1D22,

+    0x901D, 0x901D, 0x1517, 0x901E, 0x901E, 0x1194, 0x901F, 0x901F, 0x15A9,

+    0x9020, 0x9020, 0x1AA6, 0x9021, 0x9021, 0x1B05, 0x9022, 0x9022, 0x13F2,

+    0x9023, 0x9023, 0x117B, 0x902E, 0x902E, 0x1C2B, 0x9031, 0x9031, 0x1AEF,

+    0x9032, 0x9032, 0x1B62, 0x9035, 0x9035, 0x0FA7, 0x9038, 0x9038, 0x1942,

+    0x903C, 0x903C, 0x1DBF, 0x903E, 0x903E, 0x18CE, 0x9041, 0x9041, 0x1109,

+    0x9042, 0x9042, 0x15EE, 0x9047, 0x9047, 0x184F, 0x904A, 0x904A, 0x18CD,

+    0x904B, 0x904B, 0x1866, 0x904D, 0x904D, 0x1D65, 0x904E, 0x904E, 0x0EE4,

+    0x9050, 0x9050, 0x1DCB, 0x9051, 0x9051, 0x1EF5, 0x9053, 0x9053, 0x10D0,

+    0x9054, 0x9054, 0x1078, 0x9055, 0x9055, 0x18A2, 0x9059, 0x9059, 0x1815,

+    0x905C, 0x905C, 0x15AE, 0x905D, 0x905D, 0x108E, 0x905E, 0x905E, 0x1C2C,

+    0x9060, 0x9060, 0x1885, 0x9061, 0x9061, 0x159C, 0x9063, 0x9063, 0x0E3E,

+    0x9069, 0x9069, 0x19F1, 0x906D, 0x906D, 0x1AA7, 0x906E, 0x906E, 0x1B8E,

+    0x906F, 0x906F, 0x110A, 0x9072, 0x9072, 0x1B3E, 0x9075, 0x9075, 0x1B06,

+    0x9077, 0x9077, 0x1BFA, 0x9078, 0x9078, 0x1545, 0x907A, 0x907A, 0x18CF,

+    0x907C, 0x907C, 0x11D1, 0x907D, 0x907D, 0x0E0E, 0x907F, 0x907F, 0x1DB2,

+    0x9080, 0x9080, 0x1816, 0x9081, 0x9081, 0x1270, 0x9082, 0x9082, 0x1E14,

+    0x9083, 0x9083, 0x15EF, 0x9084, 0x9084, 0x1ED8, 0x9087, 0x9087, 0x1922,

+    0x9088, 0x9088, 0x123D, 0x908A, 0x908A, 0x13AC, 0x908F, 0x908F, 0x111D,

+    0x9091, 0x9091, 0x18F5, 0x9095, 0x9095, 0x17D0, 0x9099, 0x9099, 0x1263,

+    0x90A2, 0x90A2, 0x1E6C, 0x90A3, 0x90A3, 0x102A, 0x90A6, 0x90A6, 0x1366,

+    0x90A8, 0x90A8, 0x1C52, 0x90AA, 0x90AA, 0x14B1, 0x90AF, 0x90AF, 0x0DC6,

+    0x90B0, 0x90B0, 0x1D13, 0x90B1, 0x90B1, 0x0F63, 0x90B5, 0x90B5, 0x159D,

+    0x90B8, 0x90B8, 0x19D8, 0x90C1, 0x90C1, 0x185C, 0x90CA, 0x90CA, 0x0F31,

+    0x90DE, 0x90DE, 0x1143, 0x90E1, 0x90E1, 0x0F76, 0x90E8, 0x90E8, 0x1419,

+    0x90ED, 0x90ED, 0x0EEA, 0x90F5, 0x90F5, 0x1850, 0x90FD, 0x90FD, 0x10D1,

+    0x9102, 0x9102, 0x16AA, 0x9112, 0x9112, 0x1C6F, 0x9115, 0x9115, 0x1E22,

+    0x9119, 0x9119, 0x1463, 0x9127, 0x9127, 0x1114, 0x912D, 0x912D, 0x1A5C,

+    0x9132, 0x9132, 0x1072, 0x9149, 0x9149, 0x18D0, 0x914A, 0x914A, 0x1A5D,

+    0x914B, 0x914B, 0x1C70, 0x914C, 0x914C, 0x1977, 0x914D, 0x914D, 0x137A,

+    0x914E, 0x914E, 0x1AF0, 0x9152, 0x9152, 0x1AF1, 0x9162, 0x9162, 0x1C46,

+    0x9169, 0x9169, 0x1298, 0x916A, 0x916A, 0x1123, 0x916C, 0x916C, 0x15F0,

+    0x9175, 0x9175, 0x1F1C, 0x9177, 0x9177, 0x1EA3, 0x9178, 0x9178, 0x14C1,

+    0x9187, 0x9187, 0x161F, 0x9189, 0x9189, 0x1C9F, 0x918B, 0x918B, 0x1C47,

+    0x918D, 0x918D, 0x1A78, 0x9192, 0x9192, 0x1573, 0x919C, 0x919C, 0x1C71,

+    0x91AB, 0x91AB, 0x190C, 0x91AC, 0x91AC, 0x19A7, 0x91AE, 0x91AE, 0x1C48,

+    0x91AF, 0x91AF, 0x1E76, 0x91B1, 0x91B1, 0x1349, 0x91B4, 0x91B4, 0x119D,

+    0x91B5, 0x91B5, 0x0E00, 0x91C0, 0x91C0, 0x170B, 0x91C7, 0x91C7, 0x1BD4,

+    0x91C9, 0x91C9, 0x18D1, 0x91CB, 0x91CB, 0x1528, 0x91CC, 0x91CC, 0x121A,

+    0x91CD, 0x91CD, 0x1B0D, 0x91CE, 0x91CE, 0x16EF, 0x91CF, 0x91CF, 0x1157,

+    0x91D0, 0x91D0, 0x121B, 0x91D1, 0x91D1, 0x1023, 0x91D7, 0x91D7, 0x15BE,

+    0x91D8, 0x91D8, 0x1A5E, 0x91DC, 0x91DC, 0x141A, 0x91DD, 0x91DD, 0x1CCE,

+    0x91E3, 0x91E3, 0x1AA8, 0x91E7, 0x91E7, 0x1BFB, 0x91EA, 0x91EA, 0x1851,

+    0x91F5, 0x91F5, 0x1BD5, 0x920D, 0x920D, 0x110B, 0x9210, 0x9210, 0x0E26,

+    0x9211, 0x9211, 0x1D49, 0x9212, 0x9212, 0x14D1, 0x9217, 0x9217, 0x18DE,

+    0x921E, 0x921E, 0x0FAE, 0x9234, 0x9234, 0x1195, 0x923A, 0x923A, 0x17C2,

+    0x923F, 0x923F, 0x1A14, 0x9240, 0x9240, 0x0DCE, 0x9245, 0x9245, 0x0E0F,

+    0x9249, 0x9249, 0x1E48, 0x9257, 0x9257, 0x0E4A, 0x925B, 0x925B, 0x175F,

+    0x925E, 0x925E, 0x188B, 0x9262, 0x9262, 0x134A, 0x9264, 0x9264, 0x0F64,

+    0x9265, 0x9265, 0x1626, 0x9266, 0x9266, 0x1A5F, 0x9280, 0x9280, 0x18EA,

+    0x9283, 0x9283, 0x1C5C, 0x9285, 0x9285, 0x10FB, 0x9291, 0x9291, 0x1546,

+    0x9293, 0x9293, 0x1A15, 0x9296, 0x9296, 0x15F1, 0x9298, 0x9298, 0x1299,

+    0x929C, 0x929C, 0x1DEC, 0x92B3, 0x92B3, 0x179E, 0x92B6, 0x92B6, 0x0F65,

+    0x92B7, 0x92B7, 0x159E, 0x92B9, 0x92B9, 0x15F2, 0x92CC, 0x92CC, 0x1A60,

+    0x92CF, 0x92CF, 0x1E59, 0x92D2, 0x92D2, 0x13F3, 0x92E4, 0x92E4, 0x1518,

+    0x92EA, 0x92EA, 0x1D90, 0x92F8, 0x92F8, 0x0E10, 0x92FC, 0x92FC, 0x0DE5,

+    0x9304, 0x9304, 0x11B4, 0x9310, 0x9310, 0x1C72, 0x9318, 0x9318, 0x1C73,

+    0x931A, 0x931A, 0x19BE, 0x931E, 0x931E, 0x1620, 0x931F, 0x931F, 0x1089,

+    0x9320, 0x9320, 0x1A61, 0x9321, 0x9321, 0x1016, 0x9322, 0x9322, 0x1A16,

+    0x9324, 0x9324, 0x1017, 0x9326, 0x9326, 0x0FD2, 0x9328, 0x9328, 0x12CB,

+    0x932B, 0x932B, 0x1529, 0x932E, 0x932E, 0x0EB2, 0x932F, 0x932F, 0x1B93,

+    0x9348, 0x9348, 0x178B, 0x934A, 0x934A, 0x117C, 0x934B, 0x934B, 0x0EE5,

+    0x934D, 0x934D, 0x10D2, 0x9354, 0x9354, 0x16AB, 0x935B, 0x935B, 0x1073,

+    0x936E, 0x936E, 0x18D2, 0x9375, 0x9375, 0x0E1B, 0x937C, 0x937C, 0x1CCF,

+    0x937E, 0x937E, 0x1AC4, 0x938C, 0x938C, 0x0E4B, 0x9394, 0x9394, 0x1833,

+    0x9396, 0x9396, 0x15BC, 0x939A, 0x939A, 0x1C74, 0x93A3, 0x93A3, 0x1E6D,

+    0x93A7, 0x93A7, 0x0DF9, 0x93AC, 0x93AC, 0x1E9E, 0x93AD, 0x93AD, 0x1B63,

+    0x93B0, 0x93B0, 0x1943, 0x93C3, 0x93C3, 0x1AAF, 0x93D1, 0x93D1, 0x19F2,

+    0x93DE, 0x93DE, 0x1834, 0x93E1, 0x93E1, 0x0E74, 0x93E4, 0x93E4, 0x11DF,

+    0x93F6, 0x93F6, 0x1B7C, 0x9404, 0x9404, 0x1F10, 0x9418, 0x9418, 0x1AC5,

+    0x9425, 0x9425, 0x1547, 0x942B, 0x942B, 0x1A17, 0x9435, 0x9435, 0x1C08,

+    0x9438, 0x9438, 0x1CEF, 0x9444, 0x9444, 0x1AF2, 0x9451, 0x9452, 0x0DC7,

+    0x945B, 0x945B, 0x0F0B, 0x947D, 0x947D, 0x1BA2, 0x947F, 0x947F, 0x1B94,

+    0x9577, 0x9577, 0x19A8, 0x9580, 0x9580, 0x12EE, 0x9583, 0x9583, 0x155D,

+    0x9589, 0x9589, 0x1D76, 0x958B, 0x958B, 0x0DFA, 0x958F, 0x958F, 0x18DF,

+    0x9591, 0x9592, 0x1DDD, 0x9593, 0x9593, 0x0DAB, 0x9594, 0x9594, 0x1312,

+    0x9598, 0x9598, 0x0DCF, 0x95A3, 0x95A3, 0x0D93, 0x95A4, 0x95A4, 0x1DF3,

+    0x95A5, 0x95A5, 0x1390, 0x95A8, 0x95A8, 0x0FA8, 0x95AD, 0x95AD, 0x1165,

+    0x95B1, 0x95B1, 0x1764, 0x95BB, 0x95BB, 0x176C, 0x95BC, 0x95BC, 0x16BC,

+    0x95C7, 0x95C7, 0x16C4, 0x95CA, 0x95CA, 0x1EDF, 0x95D4, 0x95D4, 0x1DF4,

+    0x95D5, 0x95D5, 0x0F8F, 0x95D6, 0x95D6, 0x1D31, 0x95DC, 0x95DC, 0x0EF9,

+    0x95E1, 0x95E1, 0x1BFC, 0x95E2, 0x95E2, 0x13A5, 0x961C, 0x961C, 0x141B,

+    0x9621, 0x9621, 0x1BFD, 0x962A, 0x962A, 0x1D4A, 0x962E, 0x962E, 0x17EB,

+    0x9632, 0x9632, 0x1367, 0x963B, 0x963B, 0x1AA9, 0x963F, 0x963F, 0x169C,

+    0x9640, 0x9640, 0x1CDF, 0x9642, 0x9642, 0x1DB3, 0x9644, 0x9644, 0x141C,

+    0x964B, 0x964B, 0x11E0, 0x964C, 0x964C, 0x1274, 0x964D, 0x964D, 0x0DE6,

+    0x9650, 0x9650, 0x1DDF, 0x965B, 0x965B, 0x1D77, 0x965C, 0x965C, 0x1DF5,

+    0x965D, 0x965D, 0x155E, 0x965E, 0x965E, 0x163B, 0x965F, 0x965F, 0x1BEA,

+    0x9662, 0x9662, 0x1886, 0x9663, 0x9663, 0x1B64, 0x9664, 0x9664, 0x1A79,

+    0x966A, 0x966A, 0x137B, 0x9670, 0x9670, 0x18F0, 0x9673, 0x9673, 0x1B65,

+    0x9675, 0x9675, 0x1204, 0x9676, 0x9676, 0x10D3, 0x9677, 0x9677, 0x1DED,

+    0x9678, 0x9678, 0x11F1, 0x967D, 0x967D, 0x170C, 0x9685, 0x9685, 0x1852,

+    0x9686, 0x9686, 0x11FB, 0x968A, 0x968A, 0x10A8, 0x968B, 0x968B, 0x15F3,

+    0x968D, 0x968D, 0x1EF6, 0x968E, 0x968E, 0x0E8F, 0x9694, 0x9694, 0x0E34,

+    0x9695, 0x9695, 0x1867, 0x9698, 0x9698, 0x16D9, 0x9699, 0x9699, 0x0FB6,

+    0x969B, 0x969B, 0x1A7A, 0x969C, 0x969C, 0x19A9, 0x96A3, 0x96A3, 0x1224,

+    0x96A7, 0x96A8, 0x15F4, 0x96AA, 0x96AA, 0x1E30, 0x96B1, 0x96B1, 0x18EB,

+    0x96B7, 0x96B7, 0x119E, 0x96BB, 0x96BB, 0x1BEB, 0x96C0, 0x96C0, 0x1978,

+    0x96C1, 0x96C1, 0x16B5, 0x96C4, 0x96C4, 0x186E, 0x96C5, 0x96C5, 0x169D,

+    0x96C6, 0x96C6, 0x1B7D, 0x96C7, 0x96C7, 0x0EB3, 0x96C9, 0x96C9, 0x1CBD,

+    0x96CB, 0x96CB, 0x1B07, 0x96CC, 0x96CC, 0x196C, 0x96CD, 0x96CD, 0x17D1,

+    0x96CE, 0x96CE, 0x19D9, 0x96D5, 0x96D5, 0x1AAA, 0x96D6, 0x96D6, 0x15F6,

+    0x96D9, 0x96D9, 0x168D, 0x96DB, 0x96DB, 0x1C75, 0x96DC, 0x96DC, 0x1985,

+    0x96E2, 0x96E2, 0x121C, 0x96E3, 0x96E3, 0x102E, 0x96E8, 0x96E9, 0x1853,

+    0x96EA, 0x96EA, 0x1555, 0x96EF, 0x96EF, 0x12EF, 0x96F0, 0x96F0, 0x1432,

+    0x96F2, 0x96F2, 0x1868, 0x96F6, 0x96F6, 0x1196, 0x96F7, 0x96F7, 0x11C6,

+    0x96F9, 0x96F9, 0x1327, 0x96FB, 0x96FB, 0x1A18, 0x9700, 0x9700, 0x15F7,

+    0x9706, 0x9706, 0x1A62, 0x9707, 0x9707, 0x1B66, 0x9711, 0x9711, 0x1A2A,

+    0x9713, 0x9713, 0x179F, 0x9716, 0x9716, 0x122B, 0x9719, 0x9719, 0x178C,

+    0x971C, 0x971C, 0x14F1, 0x971E, 0x971E, 0x1DCC, 0x9727, 0x9727, 0x12E0,

+    0x9730, 0x9730, 0x14C2, 0x9732, 0x9732, 0x11AC, 0x9739, 0x9739, 0x13A6,

+    0x973D, 0x973D, 0x1A7B, 0x9742, 0x9742, 0x1170, 0x9744, 0x9744, 0x16DA,

+    0x9748, 0x9748, 0x1197, 0x9751, 0x9751, 0x1C23, 0x9756, 0x9756, 0x1A63,

+    0x975C, 0x975C, 0x1A64, 0x975E, 0x975E, 0x1464, 0x9761, 0x9761, 0x1304,

+    0x9762, 0x9762, 0x1288, 0x9769, 0x9769, 0x1E35, 0x976D, 0x976D, 0x193A,

+    0x9774, 0x9774, 0x1EC4, 0x9777, 0x9777, 0x193B, 0x977A, 0x977A, 0x1257,

+    0x978B, 0x978B, 0x1E77, 0x978D, 0x978D, 0x16B6, 0x978F, 0x978F, 0x0ED9,

+    0x97A0, 0x97A0, 0x0F6E, 0x97A8, 0x97A8, 0x0DB5, 0x97AB, 0x97AB, 0x0F6F,

+    0x97AD, 0x97AD, 0x1D66, 0x97C6, 0x97C6, 0x1BFE, 0x97CB, 0x97CB, 0x18A3,

+    0x97D3, 0x97D3, 0x1DE0, 0x97DC, 0x97DC, 0x10D4, 0x97F3, 0x97F3, 0x18F1,

+    0x97F6, 0x97F6, 0x159F, 0x97FB, 0x97FB, 0x1869, 0x97FF, 0x97FF, 0x1E23,

+    0x9800, 0x9800, 0x1E9F, 0x9801, 0x9801, 0x1E4D, 0x9802, 0x9802, 0x1A65,

+    0x9803, 0x9803, 0x0E75, 0x9805, 0x9805, 0x1E04, 0x9806, 0x9806, 0x1621,

+    0x9808, 0x9808, 0x15F8, 0x980A, 0x980A, 0x185D, 0x980C, 0x980C, 0x15B8,

+    0x9810, 0x9810, 0x17A0, 0x9811, 0x9811, 0x17EC, 0x9812, 0x9812, 0x1340,

+    0x9813, 0x9813, 0x10E8, 0x9817, 0x9817, 0x1D41, 0x9818, 0x9818, 0x1198,

+    0x982D, 0x982D, 0x1105, 0x9830, 0x9830, 0x1E5A, 0x9838, 0x9838, 0x0E76,

+    0x9839, 0x9839, 0x1D28, 0x983B, 0x983B, 0x1474, 0x9846, 0x9846, 0x0EE6,

+    0x984C, 0x984C, 0x1A7C, 0x984D, 0x984D, 0x16E1, 0x984E, 0x984E, 0x16AC,

+    0x9854, 0x9854, 0x16B7, 0x9858, 0x9858, 0x1887, 0x985A, 0x985A, 0x1A19,

+    0x985E, 0x985E, 0x11EE, 0x9865, 0x9865, 0x1EA0, 0x9867, 0x9867, 0x0EB4,

+    0x986B, 0x986B, 0x1A1A, 0x986F, 0x986F, 0x1E49, 0x98A8, 0x98A8, 0x1DAB,

+    0x98AF, 0x98AF, 0x14D2, 0x98B1, 0x98B1, 0x1D14, 0x98C4, 0x98C4, 0x1DA4,

+    0x98C7, 0x98C7, 0x1DA3, 0x98DB, 0x98DB, 0x1465, 0x98DC, 0x98DC, 0x138C,

+    0x98DF, 0x98DF, 0x1665, 0x98E1, 0x98E1, 0x15AF, 0x98E2, 0x98E2, 0x1018,

+    0x98ED, 0x98ED, 0x1CC2, 0x98EE, 0x98EE, 0x18F2, 0x98EF, 0x98EF, 0x1341,

+    0x98F4, 0x98F4, 0x1923, 0x98FC, 0x98FC, 0x14B2, 0x98FD, 0x98FD, 0x1D91,

+    0x98FE, 0x98FE, 0x1666, 0x9903, 0x9903, 0x0F32, 0x9909, 0x9909, 0x1E24,

+    0x990A, 0x990A, 0x170D, 0x990C, 0x990C, 0x1924, 0x9910, 0x9910, 0x1BA3,

+    0x9913, 0x9913, 0x169E, 0x9918, 0x9918, 0x173A, 0x991E, 0x991E, 0x1A1B,

+    0x9920, 0x9920, 0x13C0, 0x9928, 0x9928, 0x0EFA, 0x9945, 0x9945, 0x124F,

+    0x9949, 0x9949, 0x0FC5, 0x994B, 0x994B, 0x0F95, 0x994C, 0x994C, 0x1BA4,

+    0x994D, 0x994D, 0x1548, 0x9951, 0x9951, 0x1019, 0x9952, 0x9952, 0x1817,

+    0x9954, 0x9954, 0x17D2, 0x9957, 0x9957, 0x1E25, 0x9996, 0x9996, 0x15F9,

+    0x9999, 0x9999, 0x1E26, 0x999D, 0x999D, 0x1DBD, 0x99A5, 0x99A5, 0x13E1,

+    0x99A8, 0x99A8, 0x1E6E, 0x99AC, 0x99AC, 0x1235, 0x99AD, 0x99AD, 0x1715,

+    0x99AE, 0x99AE, 0x1DAC, 0x99B1, 0x99B1, 0x1CE0, 0x99B3, 0x99B3, 0x1CBE,

+    0x99B4, 0x99B4, 0x1622, 0x99B9, 0x99B9, 0x1944, 0x99C1, 0x99C1, 0x1328,

+    0x99D0, 0x99D0, 0x1AF3, 0x99D1, 0x99D1, 0x104E, 0x99D2, 0x99D2, 0x0F66,

+    0x99D5, 0x99D5, 0x0D88, 0x99D9, 0x99D9, 0x141D, 0x99DD, 0x99DD, 0x1CE1,

+    0x99DF, 0x99DF, 0x14B3, 0x99ED, 0x99ED, 0x1E15, 0x99F1, 0x99F1, 0x1124,

+    0x99FF, 0x99FF, 0x1B08, 0x9A01, 0x9A01, 0x1478, 0x9A08, 0x9A08, 0x13C1,

+    0x9A0E, 0x9A0F, 0x101A, 0x9A19, 0x9A19, 0x1D67, 0x9A2B, 0x9A2B, 0x0E1C,

+    0x9A30, 0x9A30, 0x1115, 0x9A36, 0x9A36, 0x1C76, 0x9A37, 0x9A37, 0x15A0,

+    0x9A40, 0x9A40, 0x1275, 0x9A43, 0x9A43, 0x1DA5, 0x9A45, 0x9A45, 0x0F67,

+    0x9A4D, 0x9A4D, 0x1F1D, 0x9A55, 0x9A55, 0x0F33, 0x9A57, 0x9A57, 0x1E31,

+    0x9A5A, 0x9A5A, 0x0E77, 0x9A5B, 0x9A5B, 0x1743, 0x9A5F, 0x9A5F, 0x1CA0,

+    0x9A62, 0x9A62, 0x1166, 0x9A65, 0x9A65, 0x101C, 0x9A69, 0x9A69, 0x1ED9,

+    0x9A6A, 0x9A6A, 0x1167, 0x9AA8, 0x9AA8, 0x0EC9, 0x9AB8, 0x9AB8, 0x1E16,

+    0x9AD3, 0x9AD3, 0x15FA, 0x9AD4, 0x9AD4, 0x1C2D, 0x9AD8, 0x9AD8, 0x0EB5,

+    0x9AE5, 0x9AE5, 0x176D, 0x9AEE, 0x9AEE, 0x134B, 0x9B1A, 0x9B1A, 0x15FB,

+    0x9B27, 0x9B27, 0x11D2, 0x9B2A, 0x9B2A, 0x1D2E, 0x9B31, 0x9B31, 0x186B,

+    0x9B3C, 0x9B3C, 0x0F99, 0x9B41, 0x9B41, 0x0F17, 0x9B42, 0x9B42, 0x1EA9,

+    0x9B43, 0x9B43, 0x134C, 0x9B44, 0x9B44, 0x1383, 0x9B45, 0x9B45, 0x1271,

+    0x9B4F, 0x9B4F, 0x18A4, 0x9B54, 0x9B54, 0x1236, 0x9B5A, 0x9B5A, 0x1716,

+    0x9B6F, 0x9B6F, 0x11AD, 0x9B8E, 0x9B8E, 0x1A2B, 0x9B91, 0x9B91, 0x1D92,

+    0x9B9F, 0x9B9F, 0x16B8, 0x9BAB, 0x9BAB, 0x0F34, 0x9BAE, 0x9BAE, 0x1549,

+    0x9BC9, 0x9BC9, 0x121D, 0x9BD6, 0x9BD6, 0x1C24, 0x9BE4, 0x9BE4, 0x0EC7,

+    0x9BE8, 0x9BE8, 0x0E78, 0x9C0D, 0x9C0D, 0x1C77, 0x9C10, 0x9C10, 0x16AD,

+    0x9C12, 0x9C12, 0x13E2, 0x9C15, 0x9C15, 0x1DCD, 0x9C25, 0x9C25, 0x1EDA,

+    0x9C32, 0x9C32, 0x17BC, 0x9C3B, 0x9C3B, 0x1250, 0x9C47, 0x9C47, 0x0DE7,

+    0x9C49, 0x9C49, 0x13AF, 0x9C57, 0x9C57, 0x1225, 0x9CE5, 0x9CE5, 0x1AAB,

+    0x9CE7, 0x9CE7, 0x141E, 0x9CE9, 0x9CE9, 0x0F68, 0x9CF3, 0x9CF3, 0x13F4,

+    0x9CF4, 0x9CF4, 0x129A, 0x9CF6, 0x9CF6, 0x1760, 0x9D09, 0x9D09, 0x169F,

+    0x9D1B, 0x9D1B, 0x1888, 0x9D26, 0x9D26, 0x16CF, 0x9D28, 0x9D28, 0x16C8,

+    0x9D3B, 0x9D3B, 0x1EB6, 0x9D51, 0x9D51, 0x0E3F, 0x9D5D, 0x9D5D, 0x16A0,

+    0x9D60, 0x9D60, 0x0EBD, 0x9D61, 0x9D61, 0x12E1, 0x9D6C, 0x9D6C, 0x143C,

+    0x9D72, 0x9D72, 0x1979, 0x9DA9, 0x9DA9, 0x12BA, 0x9DAF, 0x9DAF, 0x16E4,

+    0x9DB4, 0x9DB4, 0x1DD2, 0x9DC4, 0x9DC4, 0x0E90, 0x9DD7, 0x9DD7, 0x0F69,

+    0x9DF2, 0x9DF2, 0x1CA1, 0x9DF8, 0x9DF8, 0x1F4C, 0x9DF9, 0x9DF9, 0x18F9,

+    0x9DFA, 0x9DFA, 0x11AE, 0x9E1A, 0x9E1A, 0x16E5, 0x9E1E, 0x9E1E, 0x112C,

+    0x9E75, 0x9E75, 0x11AF, 0x9E79, 0x9E79, 0x1DEE, 0x9E7D, 0x9E7D, 0x176E,

+    0x9E7F, 0x9E7F, 0x11B5, 0x9E92, 0x9E92, 0x101D, 0x9E93, 0x9E93, 0x11B6,

+    0x9E97, 0x9E97, 0x1168, 0x9E9D, 0x9E9D, 0x14B4, 0x9E9F, 0x9E9F, 0x1226,

+    0x9EA5, 0x9EA5, 0x1276, 0x9EB4, 0x9EB4, 0x0F70, 0x9EB5, 0x9EB5, 0x1289,

+    0x9EBB, 0x9EBB, 0x1237, 0x9EBE, 0x9EBE, 0x1F44, 0x9EC3, 0x9EC3, 0x1EF7,

+    0x9ECD, 0x9ECD, 0x1519, 0x9ECE, 0x9ECE, 0x1169, 0x9ED1, 0x9ED1, 0x1F52,

+    0x9ED4, 0x9ED4, 0x0E27, 0x9ED8, 0x9ED8, 0x12E3, 0x9EDB, 0x9EDB, 0x10A9,

+    0x9EDC, 0x9EDC, 0x1C89, 0x9EDE, 0x9EDE, 0x1A2C, 0x9EE8, 0x9EE8, 0x1099,

+    0x9EF4, 0x9EF4, 0x1305, 0x9F07, 0x9F07, 0x17BD, 0x9F08, 0x9F08, 0x13B0,

+    0x9F0E, 0x9F0E, 0x1A66, 0x9F13, 0x9F13, 0x0EB6, 0x9F20, 0x9F20, 0x151A,

+    0x9F3B, 0x9F3B, 0x1466, 0x9F4A, 0x9F4A, 0x1A7D, 0x9F4B, 0x9F4B, 0x19B9,

+    0x9F4E, 0x9F4E, 0x19BA, 0x9F52, 0x9F52, 0x1CBF, 0x9F5F, 0x9F5F, 0x19DA,

+    0x9F61, 0x9F61, 0x1199, 0x9F67, 0x9F67, 0x1556, 0x9F6A, 0x9F6A, 0x1B95,

+    0x9F6C, 0x9F6C, 0x1717, 0x9F77, 0x9F77, 0x16AE, 0x9F8D, 0x9F8D, 0x11D3,

+    0x9F90, 0x9F90, 0x1368, 0x9F95, 0x9F95, 0x0DC9, 0x9F9C, 0x9F9C, 0x0F6A,

+    0xAC00, 0xAC01, 0x043E, 0xAC02, 0xAC03, 0x2475, 0xAC04, 0xAC04, 0x0440,

+    0xAC05, 0xAC06, 0x2477, 0xAC07, 0xAC0A, 0x0441, 0xAC0B, 0xAC0F, 0x2479,

+    0xAC10, 0xAC17, 0x0445, 0xAC18, 0xAC18, 0x247E, 0xAC19, 0xAC1D, 0x044D,

+    0xAC1E, 0xAC1F, 0x247F, 0xAC20, 0xAC20, 0x0452, 0xAC21, 0xAC23, 0x2481,

+    0xAC24, 0xAC24, 0x0453, 0xAC25, 0xAC2B, 0x2484, 0xAC2C, 0xAC2D, 0x0454,

+    0xAC2E, 0xAC2E, 0x248B, 0xAC2F, 0xAC31, 0x0456, 0xAC32, 0xAC37, 0x248C,

+    0xAC38, 0xAC39, 0x0459, 0xAC3A, 0xAC3B, 0x2492, 0xAC3C, 0xAC3C, 0x045B,

+    0xAC3D, 0xAC3F, 0x2494, 0xAC40, 0xAC40, 0x045C, 0xAC41, 0xAC4A, 0x2497,

+    0xAC4B, 0xAC4B, 0x045D, 0xAC4C, 0xAC4C, 0x24A1, 0xAC4D, 0xAC4D, 0x045E,

+    0xAC4E, 0xAC53, 0x24A2, 0xAC54, 0xAC54, 0x045F, 0xAC55, 0xAC57, 0x24A8,

+    0xAC58, 0xAC58, 0x0460, 0xAC59, 0xAC5B, 0x24AB, 0xAC5C, 0xAC5C, 0x0461,

+    0xAC5D, 0xAC6F, 0x24AE, 0xAC70, 0xAC71, 0x0462, 0xAC72, 0xAC73, 0x24C1,

+    0xAC74, 0xAC74, 0x0464, 0xAC75, 0xAC76, 0x24C3, 0xAC77, 0xAC78, 0x0465,

+    0xAC79, 0xAC79, 0x24C5, 0xAC7A, 0xAC7A, 0x0467, 0xAC7B, 0xAC7F, 0x24C6,

+    0xAC80, 0xAC81, 0x0468, 0xAC82, 0xAC82, 0x24CB, 0xAC83, 0xAC86, 0x046A,

+    0xAC87, 0xAC88, 0x24CC, 0xAC89, 0xAC8C, 0x046E, 0xAC8D, 0xAC8F, 0x24CE,

+    0xAC90, 0xAC90, 0x0472, 0xAC91, 0xAC93, 0x24D1, 0xAC94, 0xAC94, 0x0473,

+    0xAC95, 0xAC9B, 0x24D4, 0xAC9C, 0xAC9D, 0x0474, 0xAC9E, 0xAC9E, 0x24DB,

+    0xAC9F, 0xACA1, 0x0476, 0xACA2, 0xACA7, 0x24DC, 0xACA8, 0xACAA, 0x0479,

+    0xACAB, 0xACAB, 0x24E2, 0xACAC, 0xACAC, 0x047C, 0xACAD, 0xACAE, 0x24E3,

+    0xACAF, 0xACB0, 0x047D, 0xACB1, 0xACB7, 0x24E5, 0xACB8, 0xACB9, 0x047F,

+    0xACBA, 0xACBA, 0x24EC, 0xACBB, 0xACBD, 0x0481, 0xACBE, 0xACC0, 0x24ED,

+    0xACC1, 0xACC1, 0x0484, 0xACC2, 0xACC3, 0x24F0, 0xACC4, 0xACC4, 0x0485,

+    0xACC5, 0xACC7, 0x24F2, 0xACC8, 0xACC8, 0x0486, 0xACC9, 0xACCB, 0x24F5,

+    0xACCC, 0xACCC, 0x0487, 0xACCD, 0xACD4, 0x24F8, 0xACD5, 0xACD5, 0x0488,

+    0xACD6, 0xACD6, 0x2500, 0xACD7, 0xACD7, 0x0489, 0xACD8, 0xACDF, 0x2501,

+    0xACE0, 0xACE1, 0x048A, 0xACE2, 0xACE3, 0x2509, 0xACE4, 0xACE4, 0x048C,

+    0xACE5, 0xACE6, 0x250B, 0xACE7, 0xACE8, 0x048D, 0xACE9, 0xACE9, 0x250D,

+    0xACEA, 0xACEA, 0x048F, 0xACEB, 0xACEB, 0x250E, 0xACEC, 0xACEC, 0x0490,

+    0xACED, 0xACEE, 0x250F, 0xACEF, 0xACF1, 0x0491, 0xACF2, 0xACF2, 0x2511,

+    0xACF3, 0xACF3, 0x0494, 0xACF4, 0xACF4, 0x2512, 0xACF5, 0xACF6, 0x0495,

+    0xACF7, 0xACFB, 0x2513, 0xACFC, 0xACFD, 0x0497, 0xACFE, 0xACFF, 0x2518,

+    0xAD00, 0xAD00, 0x0499, 0xAD01, 0xAD03, 0x251A, 0xAD04, 0xAD04, 0x049A,

+    0xAD05, 0xAD05, 0x251D, 0xAD06, 0xAD06, 0x049B, 0xAD07, 0xAD0B, 0x251E,

+    0xAD0C, 0xAD0D, 0x049C, 0xAD0E, 0xAD0E, 0x2523, 0xAD0F, 0xAD0F, 0x049E,

+    0xAD10, 0xAD10, 0x2524, 0xAD11, 0xAD11, 0x049F, 0xAD12, 0xAD17, 0x2525,

+    0xAD18, 0xAD18, 0x04A0, 0xAD19, 0xAD1B, 0x252B, 0xAD1C, 0xAD1C, 0x04A1,

+    0xAD1D, 0xAD1F, 0x252E, 0xAD20, 0xAD20, 0x04A2, 0xAD21, 0xAD28, 0x2531,

+    0xAD29, 0xAD29, 0x04A3, 0xAD2A, 0xAD2B, 0x2539, 0xAD2C, 0xAD2D, 0x04A4,

+    0xAD2E, 0xAD33, 0x253B, 0xAD34, 0xAD35, 0x04A6, 0xAD36, 0xAD37, 0x2541,

+    0xAD38, 0xAD38, 0x04A8, 0xAD39, 0xAD3B, 0x2543, 0xAD3C, 0xAD3C, 0x04A9,

+    0xAD3D, 0xAD43, 0x2546, 0xAD44, 0xAD45, 0x04AA, 0xAD46, 0xAD46, 0x254D,

+    0xAD47, 0xAD47, 0x04AC, 0xAD48, 0xAD48, 0x254E, 0xAD49, 0xAD49, 0x04AD,

+    0xAD4A, 0xAD4F, 0x254F, 0xAD50, 0xAD50, 0x04AE, 0xAD51, 0xAD53, 0x2555,

+    0xAD54, 0xAD54, 0x04AF, 0xAD55, 0xAD57, 0x2558, 0xAD58, 0xAD58, 0x04B0,

+    0xAD59, 0xAD60, 0x255B, 0xAD61, 0xAD61, 0x04B1, 0xAD62, 0xAD62, 0x2563,

+    0xAD63, 0xAD63, 0x04B2, 0xAD64, 0xAD6B, 0x2564, 0xAD6C, 0xAD6D, 0x04B3,

+    0xAD6E, 0xAD6F, 0x256C, 0xAD70, 0xAD70, 0x04B5, 0xAD71, 0xAD72, 0x256E,

+    0xAD73, 0xAD76, 0x04B6, 0xAD77, 0xAD7A, 0x2570, 0xAD7B, 0xAD7D, 0x04BA,

+    0xAD7E, 0xAD7E, 0x2574, 0xAD7F, 0xAD7F, 0x04BD, 0xAD80, 0xAD80, 0x2575,

+    0xAD81, 0xAD82, 0x04BE, 0xAD83, 0xAD87, 0x2576, 0xAD88, 0xAD89, 0x04C0,

+    0xAD8A, 0xAD8B, 0x257B, 0xAD8C, 0xAD8C, 0x04C2, 0xAD8D, 0xAD8F, 0x257D,

+    0xAD90, 0xAD90, 0x04C3, 0xAD91, 0xAD9B, 0x2580, 0xAD9C, 0xAD9D, 0x04C4,

+    0xAD9E, 0xADA3, 0x258B, 0xADA4, 0xADA4, 0x04C6, 0xADA5, 0xADB6, 0x2591,

+    0xADB7, 0xADB7, 0x04C7, 0xADB8, 0xADBF, 0x25A3, 0xADC0, 0xADC1, 0x04C8,

+    0xADC2, 0xADC3, 0x25AB, 0xADC4, 0xADC4, 0x04CA, 0xADC5, 0xADC7, 0x25AD,

+    0xADC8, 0xADC8, 0x04CB, 0xADC9, 0xADCF, 0x25B0, 0xADD0, 0xADD1, 0x04CC,

+    0xADD2, 0xADD2, 0x25B7, 0xADD3, 0xADD3, 0x04CE, 0xADD4, 0xADDB, 0x25B8,

+    0xADDC, 0xADDC, 0x04CF, 0xADDD, 0xADDF, 0x25C0, 0xADE0, 0xADE0, 0x04D0,

+    0xADE1, 0xADE3, 0x25C3, 0xADE4, 0xADE4, 0x04D1, 0xADE5, 0xADF7, 0x25C6,

+    0xADF8, 0xADF9, 0x04D2, 0xADFA, 0xADFB, 0x25D9, 0xADFC, 0xADFC, 0x04D4,

+    0xADFD, 0xADFE, 0x25DB, 0xADFF, 0xADFF, 0x04D5, 0xAE00, 0xAE01, 0x04D6,

+    0xAE02, 0xAE07, 0x25DD, 0xAE08, 0xAE09, 0x04D8, 0xAE0A, 0xAE0A, 0x25E3,

+    0xAE0B, 0xAE0B, 0x04DA, 0xAE0C, 0xAE0C, 0x25E4, 0xAE0D, 0xAE0D, 0x04DB,

+    0xAE0E, 0xAE13, 0x25E5, 0xAE14, 0xAE14, 0x04DC, 0xAE15, 0xAE2F, 0x25EB,

+    0xAE30, 0xAE31, 0x04DD, 0xAE32, 0xAE33, 0x2606, 0xAE34, 0xAE34, 0x04DF,

+    0xAE35, 0xAE36, 0x2608, 0xAE37, 0xAE38, 0x04E0, 0xAE39, 0xAE39, 0x260A,

+    0xAE3A, 0xAE3A, 0x04E2, 0xAE3B, 0xAE3F, 0x260B, 0xAE40, 0xAE41, 0x04E3,

+    0xAE42, 0xAE42, 0x2610, 0xAE43, 0xAE43, 0x04E5, 0xAE44, 0xAE44, 0x2611,

+    0xAE45, 0xAE46, 0x04E6, 0xAE47, 0xAE49, 0x2612, 0xAE4A, 0xAE4A, 0x04E8,

+    0xAE4B, 0xAE4B, 0x2615, 0xAE4C, 0xAE4E, 0x04E9, 0xAE4F, 0xAE4F, 0x2616,

+    0xAE50, 0xAE50, 0x04EC, 0xAE51, 0xAE53, 0x2617, 0xAE54, 0xAE54, 0x04ED,

+    0xAE55, 0xAE55, 0x261A, 0xAE56, 0xAE56, 0x04EE, 0xAE57, 0xAE5B, 0x261B,

+    0xAE5C, 0xAE5D, 0x04EF, 0xAE5E, 0xAE5E, 0x2620, 0xAE5F, 0xAE61, 0x04F1,

+    0xAE62, 0xAE64, 0x2621, 0xAE65, 0xAE65, 0x04F4, 0xAE66, 0xAE67, 0x2624,

+    0xAE68, 0xAE69, 0x04F5, 0xAE6A, 0xAE6B, 0x2626, 0xAE6C, 0xAE6C, 0x04F7,

+    0xAE6D, 0xAE6F, 0x2628, 0xAE70, 0xAE70, 0x04F8, 0xAE71, 0xAE77, 0x262B,

+    0xAE78, 0xAE79, 0x04F9, 0xAE7A, 0xAE7A, 0x2632, 0xAE7B, 0xAE7D, 0x04FB,

+    0xAE7E, 0xAE83, 0x2633, 0xAE84, 0xAE85, 0x04FE, 0xAE86, 0xAE8B, 0x2639,

+    0xAE8C, 0xAE8C, 0x0500, 0xAE8D, 0xAEBB, 0x263F, 0xAEBC, 0xAEBE, 0x0501,

+    0xAEBF, 0xAEBF, 0x266E, 0xAEC0, 0xAEC0, 0x0504, 0xAEC1, 0xAEC3, 0x266F,

+    0xAEC4, 0xAEC4, 0x0505, 0xAEC5, 0xAECB, 0x2672, 0xAECC, 0xAECD, 0x0506,

+    0xAECE, 0xAECE, 0x2679, 0xAECF, 0xAED1, 0x0508, 0xAED2, 0xAED7, 0x267A,

+    0xAED8, 0xAED9, 0x050B, 0xAEDA, 0xAEDB, 0x2680, 0xAEDC, 0xAEDC, 0x050D,

+    0xAEDD, 0xAEE7, 0x2682, 0xAEE8, 0xAEE8, 0x050E, 0xAEE9, 0xAEEA, 0x268D,

+    0xAEEB, 0xAEEB, 0x050F, 0xAEEC, 0xAEEC, 0x268F, 0xAEED, 0xAEED, 0x0510,

+    0xAEEE, 0xAEF3, 0x2690, 0xAEF4, 0xAEF4, 0x0511, 0xAEF5, 0xAEF7, 0x2696,

+    0xAEF8, 0xAEF8, 0x0512, 0xAEF9, 0xAEFB, 0x2699, 0xAEFC, 0xAEFC, 0x0513,

+    0xAEFD, 0xAEFF, 0x269C, 0xAF00, 0xAF06, 0x269F, 0xAF07, 0xAF08, 0x0514,

+    0xAF09, 0xAF0C, 0x26A6, 0xAF0D, 0xAF0D, 0x0516, 0xAF0E, 0xAF0F, 0x26AA,

+    0xAF10, 0xAF10, 0x0517, 0xAF11, 0xAF2B, 0x26AC, 0xAF2C, 0xAF2D, 0x0518,

+    0xAF2E, 0xAF2F, 0x26C7, 0xAF30, 0xAF30, 0x051A, 0xAF31, 0xAF31, 0x26C9,

+    0xAF32, 0xAF32, 0x051B, 0xAF33, 0xAF33, 0x26CA, 0xAF34, 0xAF34, 0x051C,

+    0xAF35, 0xAF3B, 0x26CB, 0xAF3C, 0xAF3D, 0x051D, 0xAF3E, 0xAF3E, 0x26D2,

+    0xAF3F, 0xAF3F, 0x051F, 0xAF40, 0xAF40, 0x26D3, 0xAF41, 0xAF43, 0x0520,

+    0xAF44, 0xAF47, 0x26D4, 0xAF48, 0xAF49, 0x0523, 0xAF4A, 0xAF4F, 0x26D8,

+    0xAF50, 0xAF50, 0x0525, 0xAF51, 0xAF5B, 0x26DE, 0xAF5C, 0xAF5D, 0x0526,

+    0xAF5E, 0xAF63, 0x26E9, 0xAF64, 0xAF65, 0x0528, 0xAF66, 0xAF78, 0x26EF,

+    0xAF79, 0xAF79, 0x052A, 0xAF7A, 0xAF7F, 0x2702, 0xAF80, 0xAF80, 0x052B,

+    0xAF81, 0xAF83, 0x2708, 0xAF84, 0xAF84, 0x052C, 0xAF85, 0xAF87, 0x270B,

+    0xAF88, 0xAF88, 0x052D, 0xAF89, 0xAF8F, 0x270E, 0xAF90, 0xAF91, 0x052E,

+    0xAF92, 0xAF94, 0x2715, 0xAF95, 0xAF95, 0x0530, 0xAF96, 0xAF9B, 0x2718,

+    0xAF9C, 0xAF9C, 0x0531, 0xAF9D, 0xAFB7, 0x271E, 0xAFB8, 0xAFB9, 0x0532,

+    0xAFBA, 0xAFBB, 0x2739, 0xAFBC, 0xAFBC, 0x0534, 0xAFBD, 0xAFBF, 0x273B,

+    0xAFC0, 0xAFC0, 0x0535, 0xAFC1, 0xAFC6, 0x273E, 0xAFC7, 0xAFC9, 0x0536,

+    0xAFCA, 0xAFCA, 0x2744, 0xAFCB, 0xAFCB, 0x0539, 0xAFCC, 0xAFCC, 0x2745,

+    0xAFCD, 0xAFCE, 0x053A, 0xAFCF, 0xAFD3, 0x2746, 0xAFD4, 0xAFD4, 0x053C,

+    0xAFD5, 0xAFDB, 0x274B, 0xAFDC, 0xAFDC, 0x053D, 0xAFDD, 0xAFE7, 0x2752,

+    0xAFE8, 0xAFE9, 0x053E, 0xAFEA, 0xAFEF, 0x275D, 0xAFF0, 0xAFF1, 0x0540,

+    0xAFF2, 0xAFF3, 0x2763, 0xAFF4, 0xAFF4, 0x0542, 0xAFF5, 0xAFF7, 0x2765,

+    0xAFF8, 0xAFF8, 0x0543, 0xAFF9, 0xAFFF, 0x2768, 0xB000, 0xB001, 0x0544,

+    0xB002, 0xB003, 0x276F, 0xB004, 0xB004, 0x0546, 0xB005, 0xB00B, 0x2771,

+    0xB00C, 0xB00C, 0x0547, 0xB00D, 0xB00F, 0x2778, 0xB010, 0xB010, 0x0548,

+    0xB011, 0xB013, 0x277B, 0xB014, 0xB014, 0x0549, 0xB015, 0xB01B, 0x277E,

+    0xB01C, 0xB01D, 0x054A, 0xB01E, 0xB027, 0x2785, 0xB028, 0xB028, 0x054C,

+    0xB029, 0xB043, 0x278F, 0xB044, 0xB045, 0x054D, 0xB046, 0xB047, 0x27AA,

+    0xB048, 0xB048, 0x054F, 0xB049, 0xB049, 0x27AC, 0xB04A, 0xB04A, 0x0550,

+    0xB04B, 0xB04B, 0x27AD, 0xB04C, 0xB04C, 0x0551, 0xB04D, 0xB04D, 0x27AE,

+    0xB04E, 0xB04E, 0x0552, 0xB04F, 0xB052, 0x27AF, 0xB053, 0xB055, 0x0553,

+    0xB056, 0xB056, 0x27B3, 0xB057, 0xB057, 0x0556, 0xB058, 0xB058, 0x27B4,

+    0xB059, 0xB059, 0x0557, 0xB05A, 0xB05C, 0x27B5, 0xB05D, 0xB05D, 0x0558,

+    0xB05E, 0xB07B, 0x27B8, 0xB07C, 0xB07D, 0x0559, 0xB07E, 0xB07F, 0x27D6,

+    0xB080, 0xB080, 0x055B, 0xB081, 0xB083, 0x27D8, 0xB084, 0xB084, 0x055C,

+    0xB085, 0xB08B, 0x27DB, 0xB08C, 0xB08D, 0x055D, 0xB08E, 0xB08E, 0x27E2,

+    0xB08F, 0xB08F, 0x055F, 0xB090, 0xB090, 0x27E3, 0xB091, 0xB091, 0x0560,

+    0xB092, 0xB097, 0x27E4, 0xB098, 0xB09A, 0x0561, 0xB09B, 0xB09B, 0x27EA,

+    0xB09C, 0xB09C, 0x0564, 0xB09D, 0xB09E, 0x27EB, 0xB09F, 0xB0A2, 0x0565,

+    0xB0A3, 0xB0A7, 0x27ED, 0xB0A8, 0xB0A9, 0x0569, 0xB0AA, 0xB0AA, 0x27F2,

+    0xB0AB, 0xB0AF, 0x056B, 0xB0B0, 0xB0B0, 0x27F3, 0xB0B1, 0xB0B1, 0x0570,

+    0xB0B2, 0xB0B2, 0x27F4, 0xB0B3, 0xB0B5, 0x0571, 0xB0B6, 0xB0B7, 0x27F5,

+    0xB0B8, 0xB0B8, 0x0574, 0xB0B9, 0xB0BB, 0x27F7, 0xB0BC, 0xB0BC, 0x0575,

+    0xB0BD, 0xB0C3, 0x27FA, 0xB0C4, 0xB0C5, 0x0576, 0xB0C6, 0xB0C6, 0x2801,

+    0xB0C7, 0xB0C9, 0x0578, 0xB0CA, 0xB0CF, 0x2802, 0xB0D0, 0xB0D1, 0x057B,

+    0xB0D2, 0xB0D3, 0x2808, 0xB0D4, 0xB0D4, 0x057D, 0xB0D5, 0xB0D7, 0x280A,

+    0xB0D8, 0xB0D8, 0x057E, 0xB0D9, 0xB0DF, 0x280D, 0xB0E0, 0xB0E0, 0x057F,

+    0xB0E1, 0xB0E4, 0x2814, 0xB0E5, 0xB0E5, 0x0580, 0xB0E6, 0xB0FF, 0x2818,

+    0xB100, 0xB107, 0x2832, 0xB108, 0xB109, 0x0581, 0xB10A, 0xB10A, 0x283A,

+    0xB10B, 0xB10C, 0x0583, 0xB10D, 0xB10F, 0x283B, 0xB110, 0xB110, 0x0585,

+    0xB111, 0xB111, 0x283E, 0xB112, 0xB113, 0x0586, 0xB114, 0xB117, 0x283F,

+    0xB118, 0xB119, 0x0588, 0xB11A, 0xB11A, 0x2843, 0xB11B, 0xB11D, 0x058A,

+    0xB11E, 0xB122, 0x2844, 0xB123, 0xB125, 0x058D, 0xB126, 0xB127, 0x2849,

+    0xB128, 0xB128, 0x0590, 0xB129, 0xB12B, 0x284B, 0xB12C, 0xB12C, 0x0591,

+    0xB12D, 0xB133, 0x284E, 0xB134, 0xB135, 0x0592, 0xB136, 0xB136, 0x2855,

+    0xB137, 0xB139, 0x0594, 0xB13A, 0xB13F, 0x2856, 0xB140, 0xB141, 0x0597,

+    0xB142, 0xB143, 0x285C, 0xB144, 0xB144, 0x0599, 0xB145, 0xB147, 0x285E,

+    0xB148, 0xB148, 0x059A, 0xB149, 0xB14F, 0x2861, 0xB150, 0xB151, 0x059B,

+    0xB152, 0xB153, 0x2868, 0xB154, 0xB155, 0x059D, 0xB156, 0xB157, 0x286A,

+    0xB158, 0xB158, 0x059F, 0xB159, 0xB15B, 0x286C, 0xB15C, 0xB15C, 0x05A0,

+    0xB15D, 0xB15F, 0x286F, 0xB160, 0xB160, 0x05A1, 0xB161, 0xB177, 0x2872,

+    0xB178, 0xB179, 0x05A2, 0xB17A, 0xB17B, 0x2889, 0xB17C, 0xB17C, 0x05A4,

+    0xB17D, 0xB17F, 0x288B, 0xB180, 0xB180, 0x05A5, 0xB181, 0xB181, 0x288E,

+    0xB182, 0xB182, 0x05A6, 0xB183, 0xB187, 0x288F, 0xB188, 0xB189, 0x05A7,

+    0xB18A, 0xB18A, 0x2894, 0xB18B, 0xB18B, 0x05A9, 0xB18C, 0xB18C, 0x2895,

+    0xB18D, 0xB18D, 0x05AA, 0xB18E, 0xB191, 0x2896, 0xB192, 0xB194, 0x05AB,

+    0xB195, 0xB197, 0x289A, 0xB198, 0xB198, 0x05AE, 0xB199, 0xB19B, 0x289D,

+    0xB19C, 0xB19C, 0x05AF, 0xB19D, 0xB1A7, 0x28A0, 0xB1A8, 0xB1A8, 0x05B0,

+    0xB1A9, 0xB1CB, 0x28AB, 0xB1CC, 0xB1CC, 0x05B1, 0xB1CD, 0xB1CF, 0x28CE,

+    0xB1D0, 0xB1D0, 0x05B2, 0xB1D1, 0xB1D3, 0x28D1, 0xB1D4, 0xB1D4, 0x05B3,

+    0xB1D5, 0xB1DB, 0x28D4, 0xB1DC, 0xB1DD, 0x05B4, 0xB1DE, 0xB1DE, 0x28DB,

+    0xB1DF, 0xB1DF, 0x05B6, 0xB1E0, 0xB1E7, 0x28DC, 0xB1E8, 0xB1E9, 0x05B7,

+    0xB1EA, 0xB1EB, 0x28E4, 0xB1EC, 0xB1EC, 0x05B9, 0xB1ED, 0xB1EF, 0x28E6,

+    0xB1F0, 0xB1F0, 0x05BA, 0xB1F1, 0xB1F8, 0x28E9, 0xB1F9, 0xB1F9, 0x05BB,

+    0xB1FA, 0xB1FA, 0x28F1, 0xB1FB, 0xB1FB, 0x05BC, 0xB1FC, 0xB1FC, 0x28F2,

+    0xB1FD, 0xB1FD, 0x05BD, 0xB1FE, 0xB1FF, 0x28F3, 0xB200, 0xB203, 0x28F5,

+    0xB204, 0xB205, 0x05BE, 0xB206, 0xB207, 0x28F9, 0xB208, 0xB208, 0x05C0,

+    0xB209, 0xB20A, 0x28FB, 0xB20B, 0xB20C, 0x05C1, 0xB20D, 0xB213, 0x28FD,

+    0xB214, 0xB215, 0x05C3, 0xB216, 0xB216, 0x2904, 0xB217, 0xB217, 0x05C5,

+    0xB218, 0xB218, 0x2905, 0xB219, 0xB219, 0x05C6, 0xB21A, 0xB21F, 0x2906,

+    0xB220, 0xB220, 0x05C7, 0xB221, 0xB233, 0x290C, 0xB234, 0xB234, 0x05C8,

+    0xB235, 0xB23B, 0x291F, 0xB23C, 0xB23C, 0x05C9, 0xB23D, 0xB257, 0x2926,

+    0xB258, 0xB258, 0x05CA, 0xB259, 0xB25B, 0x2941, 0xB25C, 0xB25C, 0x05CB,

+    0xB25D, 0xB25F, 0x2944, 0xB260, 0xB260, 0x05CC, 0xB261, 0xB267, 0x2947,

+    0xB268, 0xB269, 0x05CD, 0xB26A, 0xB273, 0x294E, 0xB274, 0xB275, 0x05CF,

+    0xB276, 0xB27B, 0x2958, 0xB27C, 0xB27C, 0x05D1, 0xB27D, 0xB283, 0x295E,

+    0xB284, 0xB285, 0x05D2, 0xB286, 0xB288, 0x2965, 0xB289, 0xB289, 0x05D4,

+    0xB28A, 0xB28F, 0x2968, 0xB290, 0xB291, 0x05D5, 0xB292, 0xB293, 0x296E,

+    0xB294, 0xB294, 0x05D7, 0xB295, 0xB297, 0x2970, 0xB298, 0xB29A, 0x05D8,

+    0xB29B, 0xB29F, 0x2973, 0xB2A0, 0xB2A1, 0x05DB, 0xB2A2, 0xB2A2, 0x2978,

+    0xB2A3, 0xB2A3, 0x05DD, 0xB2A4, 0xB2A4, 0x2979, 0xB2A5, 0xB2A6, 0x05DE,

+    0xB2A7, 0xB2A9, 0x297A, 0xB2AA, 0xB2AA, 0x05E0, 0xB2AB, 0xB2AB, 0x297D,

+    0xB2AC, 0xB2AC, 0x05E1, 0xB2AD, 0xB2AF, 0x297E, 0xB2B0, 0xB2B0, 0x05E2,

+    0xB2B1, 0xB2B3, 0x2981, 0xB2B4, 0xB2B4, 0x05E3, 0xB2B5, 0xB2C7, 0x2984,

+    0xB2C8, 0xB2C9, 0x05E4, 0xB2CA, 0xB2CB, 0x2997, 0xB2CC, 0xB2CC, 0x05E6,

+    0xB2CD, 0xB2CF, 0x2999, 0xB2D0, 0xB2D0, 0x05E7, 0xB2D1, 0xB2D1, 0x299C,

+    0xB2D2, 0xB2D2, 0x05E8, 0xB2D3, 0xB2D7, 0x299D, 0xB2D8, 0xB2D9, 0x05E9,

+    0xB2DA, 0xB2DA, 0x29A2, 0xB2DB, 0xB2DB, 0x05EB, 0xB2DC, 0xB2DC, 0x29A3,

+    0xB2DD, 0xB2DD, 0x05EC, 0xB2DE, 0xB2E1, 0x29A4, 0xB2E2, 0xB2E2, 0x05ED,

+    0xB2E3, 0xB2E3, 0x29A8, 0xB2E4, 0xB2E6, 0x05EE, 0xB2E7, 0xB2E7, 0x29A9,

+    0xB2E8, 0xB2E8, 0x05F1, 0xB2E9, 0xB2EA, 0x29AA, 0xB2EB, 0xB2EF, 0x05F2,

+    0xB2F0, 0xB2F2, 0x29AC, 0xB2F3, 0xB2F5, 0x05F7, 0xB2F6, 0xB2F6, 0x29AF,

+    0xB2F7, 0xB2FB, 0x05FA, 0xB2FC, 0xB2FE, 0x29B0, 0xB2FF, 0xB2FF, 0x05FF,

+    0xB300, 0xB301, 0x0600, 0xB302, 0xB303, 0x29B3, 0xB304, 0xB304, 0x0602,

+    0xB305, 0xB307, 0x29B5, 0xB308, 0xB308, 0x0603, 0xB309, 0xB30F, 0x29B8,

+    0xB310, 0xB311, 0x0604, 0xB312, 0xB312, 0x29BF, 0xB313, 0xB315, 0x0606,

+    0xB316, 0xB31B, 0x29C0, 0xB31C, 0xB31C, 0x0609, 0xB31D, 0xB353, 0x29C6,

+    0xB354, 0xB356, 0x060A, 0xB357, 0xB357, 0x29FD, 0xB358, 0xB358, 0x060D,

+    0xB359, 0xB35A, 0x29FE, 0xB35B, 0xB35C, 0x060E, 0xB35D, 0xB35D, 0x2A00,

+    0xB35E, 0xB35F, 0x0610, 0xB360, 0xB363, 0x2A01, 0xB364, 0xB365, 0x0612,

+    0xB366, 0xB366, 0x2A05, 0xB367, 0xB367, 0x0614, 0xB368, 0xB368, 0x2A06,

+    0xB369, 0xB369, 0x0615, 0xB36A, 0xB36A, 0x2A07, 0xB36B, 0xB36B, 0x0616,

+    0xB36C, 0xB36D, 0x2A08, 0xB36E, 0xB36E, 0x0617, 0xB36F, 0xB36F, 0x2A0A,

+    0xB370, 0xB371, 0x0618, 0xB372, 0xB373, 0x2A0B, 0xB374, 0xB374, 0x061A,

+    0xB375, 0xB377, 0x2A0D, 0xB378, 0xB378, 0x061B, 0xB379, 0xB37F, 0x2A10,

+    0xB380, 0xB381, 0x061C, 0xB382, 0xB382, 0x2A17, 0xB383, 0xB385, 0x061E,

+    0xB386, 0xB38B, 0x2A18, 0xB38C, 0xB38C, 0x0621, 0xB38D, 0xB38F, 0x2A1E,

+    0xB390, 0xB390, 0x0622, 0xB391, 0xB393, 0x2A21, 0xB394, 0xB394, 0x0623,

+    0xB395, 0xB39F, 0x2A24, 0xB3A0, 0xB3A1, 0x0624, 0xB3A2, 0xB3A7, 0x2A2F,

+    0xB3A8, 0xB3A8, 0x0626, 0xB3A9, 0xB3AB, 0x2A35, 0xB3AC, 0xB3AC, 0x0627,

+    0xB3AD, 0xB3C3, 0x2A38, 0xB3C4, 0xB3C5, 0x0628, 0xB3C6, 0xB3C7, 0x2A4F,

+    0xB3C8, 0xB3C8, 0x062A, 0xB3C9, 0xB3CA, 0x2A51, 0xB3CB, 0xB3CC, 0x062B,

+    0xB3CD, 0xB3CD, 0x2A53, 0xB3CE, 0xB3CE, 0x062D, 0xB3CF, 0xB3CF, 0x2A54,

+    0xB3D0, 0xB3D0, 0x062E, 0xB3D1, 0xB3D3, 0x2A55, 0xB3D4, 0xB3D5, 0x062F,

+    0xB3D6, 0xB3D6, 0x2A58, 0xB3D7, 0xB3D7, 0x0631, 0xB3D8, 0xB3D8, 0x2A59,

+    0xB3D9, 0xB3D9, 0x0632, 0xB3DA, 0xB3DA, 0x2A5A, 0xB3DB, 0xB3DB, 0x0633,

+    0xB3DC, 0xB3DC, 0x2A5B, 0xB3DD, 0xB3DD, 0x0634, 0xB3DE, 0xB3DF, 0x2A5C,

+    0xB3E0, 0xB3E0, 0x0635, 0xB3E1, 0xB3E3, 0x2A5E, 0xB3E4, 0xB3E4, 0x0636,

+    0xB3E5, 0xB3E7, 0x2A61, 0xB3E8, 0xB3E8, 0x0637, 0xB3E9, 0xB3FB, 0x2A64,

+    0xB3FC, 0xB3FC, 0x0638, 0xB3FD, 0xB3FF, 0x2A77, 0xB400, 0xB40F, 0x2A7A,

+    0xB410, 0xB410, 0x0639, 0xB411, 0xB417, 0x2A8A, 0xB418, 0xB418, 0x063A,

+    0xB419, 0xB41B, 0x2A91, 0xB41C, 0xB41C, 0x063B, 0xB41D, 0xB41F, 0x2A94,

+    0xB420, 0xB420, 0x063C, 0xB421, 0xB427, 0x2A97, 0xB428, 0xB429, 0x063D,

+    0xB42A, 0xB42A, 0x2A9E, 0xB42B, 0xB42B, 0x063F, 0xB42C, 0xB433, 0x2A9F,

+    0xB434, 0xB434, 0x0640, 0xB435, 0xB44F, 0x2AA7, 0xB450, 0xB451, 0x0641,

+    0xB452, 0xB453, 0x2AC2, 0xB454, 0xB454, 0x0643, 0xB455, 0xB457, 0x2AC4,

+    0xB458, 0xB458, 0x0644, 0xB459, 0xB45F, 0x2AC7, 0xB460, 0xB461, 0x0645,

+    0xB462, 0xB462, 0x2ACE, 0xB463, 0xB463, 0x0647, 0xB464, 0xB464, 0x2ACF,

+    0xB465, 0xB465, 0x0648, 0xB466, 0xB46B, 0x2AD0, 0xB46C, 0xB46C, 0x0649,

+    0xB46D, 0xB47F, 0x2AD6, 0xB480, 0xB480, 0x064A, 0xB481, 0xB487, 0x2AE9,

+    0xB488, 0xB488, 0x064B, 0xB489, 0xB49C, 0x2AF0, 0xB49D, 0xB49D, 0x064C,

+    0xB49E, 0xB4A3, 0x2B04, 0xB4A4, 0xB4A4, 0x064D, 0xB4A5, 0xB4A7, 0x2B0A,

+    0xB4A8, 0xB4A8, 0x064E, 0xB4A9, 0xB4AB, 0x2B0D, 0xB4AC, 0xB4AC, 0x064F,

+    0xB4AD, 0xB4B4, 0x2B10, 0xB4B5, 0xB4B5, 0x0650, 0xB4B6, 0xB4B6, 0x2B18,

+    0xB4B7, 0xB4B7, 0x0651, 0xB4B8, 0xB4B8, 0x2B19, 0xB4B9, 0xB4B9, 0x0652,

+    0xB4BA, 0xB4BF, 0x2B1A, 0xB4C0, 0xB4C0, 0x0653, 0xB4C1, 0xB4C3, 0x2B20,

+    0xB4C4, 0xB4C4, 0x0654, 0xB4C5, 0xB4C7, 0x2B23, 0xB4C8, 0xB4C8, 0x0655,

+    0xB4C9, 0xB4CF, 0x2B26, 0xB4D0, 0xB4D0, 0x0656, 0xB4D1, 0xB4D4, 0x2B2D,

+    0xB4D5, 0xB4D5, 0x0657, 0xB4D6, 0xB4DB, 0x2B31, 0xB4DC, 0xB4DD, 0x0658,

+    0xB4DE, 0xB4DF, 0x2B37, 0xB4E0, 0xB4E0, 0x065A, 0xB4E1, 0xB4E2, 0x2B39,

+    0xB4E3, 0xB4E4, 0x065B, 0xB4E5, 0xB4E5, 0x2B3B, 0xB4E6, 0xB4E6, 0x065D,

+    0xB4E7, 0xB4EB, 0x2B3C, 0xB4EC, 0xB4ED, 0x065E, 0xB4EE, 0xB4EE, 0x2B41,

+    0xB4EF, 0xB4EF, 0x0660, 0xB4F0, 0xB4F0, 0x2B42, 0xB4F1, 0xB4F1, 0x0661,

+    0xB4F2, 0xB4F7, 0x2B43, 0xB4F8, 0xB4F8, 0x0662, 0xB4F9, 0xB4FF, 0x2B49,

+    0xB500, 0xB513, 0x2B50, 0xB514, 0xB515, 0x0663, 0xB516, 0xB517, 0x2B64,

+    0xB518, 0xB518, 0x0665, 0xB519, 0xB51A, 0x2B66, 0xB51B, 0xB51C, 0x0666,

+    0xB51D, 0xB523, 0x2B68, 0xB524, 0xB525, 0x0668, 0xB526, 0xB526, 0x2B6F,

+    0xB527, 0xB52A, 0x066A, 0xB52B, 0xB52F, 0x2B70, 0xB530, 0xB531, 0x066E,

+    0xB532, 0xB533, 0x2B75, 0xB534, 0xB534, 0x0670, 0xB535, 0xB537, 0x2B77,

+    0xB538, 0xB538, 0x0671, 0xB539, 0xB53F, 0x2B7A, 0xB540, 0xB541, 0x0672,

+    0xB542, 0xB542, 0x2B81, 0xB543, 0xB545, 0x0674, 0xB546, 0xB54A, 0x2B82,

+    0xB54B, 0xB54D, 0x0677, 0xB54E, 0xB54F, 0x2B87, 0xB550, 0xB550, 0x067A,

+    0xB551, 0xB553, 0x2B89, 0xB554, 0xB554, 0x067B, 0xB555, 0xB55B, 0x2B8C,

+    0xB55C, 0xB55D, 0x067C, 0xB55E, 0xB55E, 0x2B93, 0xB55F, 0xB561, 0x067E,

+    0xB562, 0xB59F, 0x2B94, 0xB5A0, 0xB5A1, 0x0681, 0xB5A2, 0xB5A3, 0x2BD2,

+    0xB5A4, 0xB5A4, 0x0683, 0xB5A5, 0xB5A7, 0x2BD4, 0xB5A8, 0xB5A8, 0x0684,

+    0xB5A9, 0xB5A9, 0x2BD7, 0xB5AA, 0xB5AB, 0x0685, 0xB5AC, 0xB5AF, 0x2BD8,

+    0xB5B0, 0xB5B1, 0x0687, 0xB5B2, 0xB5B2, 0x2BDC, 0xB5B3, 0xB5B5, 0x0689,

+    0xB5B6, 0xB5BA, 0x2BDD, 0xB5BB, 0xB5BD, 0x068C, 0xB5BE, 0xB5BF, 0x2BE2,

+    0xB5C0, 0xB5C0, 0x068F, 0xB5C1, 0xB5C3, 0x2BE4, 0xB5C4, 0xB5C4, 0x0690,

+    0xB5C5, 0xB5CB, 0x2BE7, 0xB5CC, 0xB5CD, 0x0691, 0xB5CE, 0xB5CE, 0x2BEE,

+    0xB5CF, 0xB5D1, 0x0693, 0xB5D2, 0xB5D7, 0x2BEF, 0xB5D8, 0xB5D8, 0x0696,

+    0xB5D9, 0xB5EB, 0x2BF5, 0xB5EC, 0xB5EC, 0x0697, 0xB5ED, 0xB5FF, 0x2C08,

+    0xB600, 0xB60F, 0x2C1B, 0xB610, 0xB611, 0x0698, 0xB612, 0xB613, 0x2C2B,

+    0xB614, 0xB614, 0x069A, 0xB615, 0xB617, 0x2C2D, 0xB618, 0xB618, 0x069B,

+    0xB619, 0xB624, 0x2C30, 0xB625, 0xB625, 0x069C, 0xB626, 0xB62B, 0x2C3C,

+    0xB62C, 0xB62C, 0x069D, 0xB62D, 0xB633, 0x2C42, 0xB634, 0xB634, 0x069E,

+    0xB635, 0xB647, 0x2C49, 0xB648, 0xB648, 0x069F, 0xB649, 0xB663, 0x2C5C,

+    0xB664, 0xB664, 0x06A0, 0xB665, 0xB667, 0x2C77, 0xB668, 0xB668, 0x06A1,

+    0xB669, 0xB69B, 0x2C7A, 0xB69C, 0xB69D, 0x06A2, 0xB69E, 0xB69F, 0x2CAD,

+    0xB6A0, 0xB6A0, 0x06A4, 0xB6A1, 0xB6A3, 0x2CAF, 0xB6A4, 0xB6A4, 0x06A5,

+    0xB6A5, 0xB6AA, 0x2CB2, 0xB6AB, 0xB6AC, 0x06A6, 0xB6AD, 0xB6B0, 0x2CB8,

+    0xB6B1, 0xB6B1, 0x06A8, 0xB6B2, 0xB6D3, 0x2CBC, 0xB6D4, 0xB6D4, 0x06A9,

+    0xB6D5, 0xB6EF, 0x2CDE, 0xB6F0, 0xB6F0, 0x06AA, 0xB6F1, 0xB6F3, 0x2CF9,

+    0xB6F4, 0xB6F4, 0x06AB, 0xB6F5, 0xB6F7, 0x2CFC, 0xB6F8, 0xB6F8, 0x06AC,

+    0xB6F9, 0xB6FF, 0x2CFF, 0xB700, 0xB701, 0x06AD, 0xB702, 0xB704, 0x2D06,

+    0xB705, 0xB705, 0x06AF, 0xB706, 0xB727, 0x2D09, 0xB728, 0xB729, 0x06B0,

+    0xB72A, 0xB72B, 0x2D2B, 0xB72C, 0xB72C, 0x06B2, 0xB72D, 0xB72E, 0x2D2D,

+    0xB72F, 0xB730, 0x06B3, 0xB731, 0xB737, 0x2D2F, 0xB738, 0xB739, 0x06B5,

+    0xB73A, 0xB73A, 0x2D36, 0xB73B, 0xB73B, 0x06B7, 0xB73C, 0xB743, 0x2D37,

+    0xB744, 0xB744, 0x06B8, 0xB745, 0xB747, 0x2D3F, 0xB748, 0xB748, 0x06B9,

+    0xB749, 0xB74B, 0x2D42, 0xB74C, 0xB74C, 0x06BA, 0xB74D, 0xB753, 0x2D45,

+    0xB754, 0xB755, 0x06BB, 0xB756, 0xB75F, 0x2D4C, 0xB760, 0xB760, 0x06BD,

+    0xB761, 0xB763, 0x2D56, 0xB764, 0xB764, 0x06BE, 0xB765, 0xB767, 0x2D59,

+    0xB768, 0xB768, 0x06BF, 0xB769, 0xB76F, 0x2D5C, 0xB770, 0xB771, 0x06C0,

+    0xB772, 0xB772, 0x2D63, 0xB773, 0xB773, 0x06C2, 0xB774, 0xB774, 0x2D64,

+    0xB775, 0xB775, 0x06C3, 0xB776, 0xB77B, 0x2D65, 0xB77C, 0xB77D, 0x06C4,

+    0xB77E, 0xB77F, 0x2D6B, 0xB780, 0xB780, 0x06C6, 0xB781, 0xB783, 0x2D6D,

+    0xB784, 0xB784, 0x06C7, 0xB785, 0xB78B, 0x2D70, 0xB78C, 0xB78D, 0x06C8,

+    0xB78E, 0xB78E, 0x2D77, 0xB78F, 0xB792, 0x06CA, 0xB793, 0xB795, 0x2D78,

+    0xB796, 0xB799, 0x06CE, 0xB79A, 0xB79B, 0x2D7B, 0xB79C, 0xB79C, 0x06D2,

+    0xB79D, 0xB79F, 0x2D7D, 0xB7A0, 0xB7A0, 0x06D3, 0xB7A1, 0xB7A7, 0x2D80,

+    0xB7A8, 0xB7A9, 0x06D4, 0xB7AA, 0xB7AA, 0x2D87, 0xB7AB, 0xB7AD, 0x06D6,

+    0xB7AE, 0xB7B3, 0x2D88, 0xB7B4, 0xB7B5, 0x06D9, 0xB7B6, 0xB7B7, 0x2D8E,

+    0xB7B8, 0xB7B8, 0x06DB, 0xB7B9, 0xB7C6, 0x2D90, 0xB7C7, 0xB7C7, 0x06DC,

+    0xB7C8, 0xB7C8, 0x2D9E, 0xB7C9, 0xB7C9, 0x06DD, 0xB7CA, 0xB7EB, 0x2D9F,

+    0xB7EC, 0xB7ED, 0x06DE, 0xB7EE, 0xB7EF, 0x2DC1, 0xB7F0, 0xB7F0, 0x06E0,

+    0xB7F1, 0xB7F3, 0x2DC3, 0xB7F4, 0xB7F4, 0x06E1, 0xB7F5, 0xB7FB, 0x2DC6,

+    0xB7FC, 0xB7FD, 0x06E2, 0xB7FE, 0xB7FE, 0x2DCD, 0xB7FF, 0xB7FF, 0x06E4,

+    0xB800, 0xB801, 0x06E5, 0xB802, 0xB806, 0x2DCE, 0xB807, 0xB809, 0x06E7,

+    0xB80A, 0xB80B, 0x2DD3, 0xB80C, 0xB80C, 0x06EA, 0xB80D, 0xB80F, 0x2DD5,

+    0xB810, 0xB810, 0x06EB, 0xB811, 0xB817, 0x2DD8, 0xB818, 0xB819, 0x06EC,

+    0xB81A, 0xB81A, 0x2DDF, 0xB81B, 0xB81B, 0x06EE, 0xB81C, 0xB81C, 0x2DE0,

+    0xB81D, 0xB81D, 0x06EF, 0xB81E, 0xB823, 0x2DE1, 0xB824, 0xB825, 0x06F0,

+    0xB826, 0xB827, 0x2DE7, 0xB828, 0xB828, 0x06F2, 0xB829, 0xB82B, 0x2DE9,

+    0xB82C, 0xB82C, 0x06F3, 0xB82D, 0xB833, 0x2DEC, 0xB834, 0xB835, 0x06F4,

+    0xB836, 0xB836, 0x2DF3, 0xB837, 0xB839, 0x06F6, 0xB83A, 0xB83F, 0x2DF4,

+    0xB840, 0xB840, 0x06F9, 0xB841, 0xB843, 0x2DFA, 0xB844, 0xB844, 0x06FA,

+    0xB845, 0xB850, 0x2DFD, 0xB851, 0xB851, 0x06FB, 0xB852, 0xB852, 0x2E09,

+    0xB853, 0xB853, 0x06FC, 0xB854, 0xB85B, 0x2E0A, 0xB85C, 0xB85D, 0x06FD,

+    0xB85E, 0xB85F, 0x2E12, 0xB860, 0xB860, 0x06FF, 0xB861, 0xB863, 0x2E14,

+    0xB864, 0xB864, 0x0700, 0xB865, 0xB86B, 0x2E17, 0xB86C, 0xB86D, 0x0701,

+    0xB86E, 0xB86E, 0x2E1E, 0xB86F, 0xB86F, 0x0703, 0xB870, 0xB870, 0x2E1F,

+    0xB871, 0xB871, 0x0704, 0xB872, 0xB877, 0x2E20, 0xB878, 0xB878, 0x0705,

+    0xB879, 0xB87B, 0x2E26, 0xB87C, 0xB87C, 0x0706, 0xB87D, 0xB88C, 0x2E29,

+    0xB88D, 0xB88D, 0x0707, 0xB88E, 0xB8A7, 0x2E39, 0xB8A8, 0xB8A8, 0x0708,

+    0xB8A9, 0xB8AF, 0x2E53, 0xB8B0, 0xB8B0, 0x0709, 0xB8B1, 0xB8B3, 0x2E5A,

+    0xB8B4, 0xB8B4, 0x070A, 0xB8B5, 0xB8B7, 0x2E5D, 0xB8B8, 0xB8B8, 0x070B,

+    0xB8B9, 0xB8BF, 0x2E60, 0xB8C0, 0xB8C1, 0x070C, 0xB8C2, 0xB8C2, 0x2E67,

+    0xB8C3, 0xB8C3, 0x070E, 0xB8C4, 0xB8C4, 0x2E68, 0xB8C5, 0xB8C5, 0x070F,

+    0xB8C6, 0xB8CB, 0x2E69, 0xB8CC, 0xB8CC, 0x0710, 0xB8CD, 0xB8CF, 0x2E6F,

+    0xB8D0, 0xB8D0, 0x0711, 0xB8D1, 0xB8D3, 0x2E72, 0xB8D4, 0xB8D4, 0x0712,

+    0xB8D5, 0xB8DC, 0x2E75, 0xB8DD, 0xB8DD, 0x0713, 0xB8DE, 0xB8DE, 0x2E7D,

+    0xB8DF, 0xB8DF, 0x0714, 0xB8E0, 0xB8E0, 0x2E7E, 0xB8E1, 0xB8E1, 0x0715,

+    0xB8E2, 0xB8E7, 0x2E7F, 0xB8E8, 0xB8E9, 0x0716, 0xB8EA, 0xB8EB, 0x2E85,

+    0xB8EC, 0xB8EC, 0x0718, 0xB8ED, 0xB8EF, 0x2E87, 0xB8F0, 0xB8F0, 0x0719,

+    0xB8F1, 0xB8F7, 0x2E8A, 0xB8F8, 0xB8F9, 0x071A, 0xB8FA, 0xB8FA, 0x2E91,

+    0xB8FB, 0xB8FB, 0x071C, 0xB8FC, 0xB8FC, 0x2E92, 0xB8FD, 0xB8FD, 0x071D,

+    0xB8FE, 0xB8FF, 0x2E93, 0xB900, 0xB903, 0x2E95, 0xB904, 0xB904, 0x071E,

+    0xB905, 0xB917, 0x2E99, 0xB918, 0xB918, 0x071F, 0xB919, 0xB91F, 0x2EAC,

+    0xB920, 0xB920, 0x0720, 0xB921, 0xB93B, 0x2EB3, 0xB93C, 0xB93D, 0x0721,

+    0xB93E, 0xB93F, 0x2ECE, 0xB940, 0xB940, 0x0723, 0xB941, 0xB943, 0x2ED0,

+    0xB944, 0xB944, 0x0724, 0xB945, 0xB94B, 0x2ED3, 0xB94C, 0xB94C, 0x0725,

+    0xB94D, 0xB94E, 0x2EDA, 0xB94F, 0xB94F, 0x0726, 0xB950, 0xB950, 0x2EDC,

+    0xB951, 0xB951, 0x0727, 0xB952, 0xB957, 0x2EDD, 0xB958, 0xB959, 0x0728,

+    0xB95A, 0xB95B, 0x2EE3, 0xB95C, 0xB95C, 0x072A, 0xB95D, 0xB95F, 0x2EE5,

+    0xB960, 0xB960, 0x072B, 0xB961, 0xB967, 0x2EE8, 0xB968, 0xB969, 0x072C,

+    0xB96A, 0xB96A, 0x2EEF, 0xB96B, 0xB96B, 0x072E, 0xB96C, 0xB96C, 0x2EF0,

+    0xB96D, 0xB96D, 0x072F, 0xB96E, 0xB973, 0x2EF1, 0xB974, 0xB975, 0x0730,

+    0xB976, 0xB977, 0x2EF7, 0xB978, 0xB978, 0x0732, 0xB979, 0xB97B, 0x2EF9,

+    0xB97C, 0xB97C, 0x0733, 0xB97D, 0xB983, 0x2EFC, 0xB984, 0xB985, 0x0734,

+    0xB986, 0xB986, 0x2F03, 0xB987, 0xB987, 0x0736, 0xB988, 0xB988, 0x2F04,

+    0xB989, 0xB98A, 0x0737, 0xB98B, 0xB98C, 0x2F05, 0xB98D, 0xB98E, 0x0739,

+    0xB98F, 0xB9AB, 0x2F07, 0xB9AC, 0xB9AD, 0x073B, 0xB9AE, 0xB9AF, 0x2F24,

+    0xB9B0, 0xB9B0, 0x073D, 0xB9B1, 0xB9B3, 0x2F26, 0xB9B4, 0xB9B4, 0x073E,

+    0xB9B5, 0xB9BB, 0x2F29, 0xB9BC, 0xB9BD, 0x073F, 0xB9BE, 0xB9BE, 0x2F30,

+    0xB9BF, 0xB9BF, 0x0741, 0xB9C0, 0xB9C0, 0x2F31, 0xB9C1, 0xB9C1, 0x0742,

+    0xB9C2, 0xB9C7, 0x2F32, 0xB9C8, 0xB9C9, 0x0743, 0xB9CA, 0xB9CB, 0x2F38,

+    0xB9CC, 0xB9CC, 0x0745, 0xB9CD, 0xB9CD, 0x2F3A, 0xB9CE, 0xB9D2, 0x0746,

+    0xB9D3, 0xB9D7, 0x2F3B, 0xB9D8, 0xB9D9, 0x074B, 0xB9DA, 0xB9DA, 0x2F40,

+    0xB9DB, 0xB9DB, 0x074D, 0xB9DC, 0xB9DC, 0x2F41, 0xB9DD, 0xB9DE, 0x074E,

+    0xB9DF, 0xB9E0, 0x2F42, 0xB9E1, 0xB9E1, 0x0750, 0xB9E2, 0xB9E2, 0x2F44,

+    0xB9E3, 0xB9E5, 0x0751, 0xB9E6, 0xB9E7, 0x2F45, 0xB9E8, 0xB9E8, 0x0754,

+    0xB9E9, 0xB9EB, 0x2F47, 0xB9EC, 0xB9EC, 0x0755, 0xB9ED, 0xB9F3, 0x2F4A,

+    0xB9F4, 0xB9F5, 0x0756, 0xB9F6, 0xB9F6, 0x2F51, 0xB9F7, 0xB9FA, 0x0758,

+    0xB9FB, 0xB9FF, 0x2F52, 0xBA00, 0xBA01, 0x075C, 0xBA02, 0xBA07, 0x2F57,

+    0xBA08, 0xBA08, 0x075E, 0xBA09, 0xBA14, 0x2F5D, 0xBA15, 0xBA15, 0x075F,

+    0xBA16, 0xBA37, 0x2F69, 0xBA38, 0xBA39, 0x0760, 0xBA3A, 0xBA3B, 0x2F8B,

+    0xBA3C, 0xBA3C, 0x0762, 0xBA3D, 0xBA3F, 0x2F8D, 0xBA40, 0xBA40, 0x0763,

+    0xBA41, 0xBA41, 0x2F90, 0xBA42, 0xBA42, 0x0764, 0xBA43, 0xBA47, 0x2F91,

+    0xBA48, 0xBA49, 0x0765, 0xBA4A, 0xBA4A, 0x2F96, 0xBA4B, 0xBA4B, 0x0767,

+    0xBA4C, 0xBA4C, 0x2F97, 0xBA4D, 0xBA4E, 0x0768, 0xBA4F, 0xBA52, 0x2F98,

+    0xBA53, 0xBA55, 0x076A, 0xBA56, 0xBA57, 0x2F9C, 0xBA58, 0xBA58, 0x076D,

+    0xBA59, 0xBA5B, 0x2F9E, 0xBA5C, 0xBA5C, 0x076E, 0xBA5D, 0xBA63, 0x2FA1,

+    0xBA64, 0xBA65, 0x076F, 0xBA66, 0xBA66, 0x2FA8, 0xBA67, 0xBA69, 0x0771,

+    0xBA6A, 0xBA6F, 0x2FA9, 0xBA70, 0xBA71, 0x0774, 0xBA72, 0xBA73, 0x2FAF,

+    0xBA74, 0xBA74, 0x0776, 0xBA75, 0xBA77, 0x2FB1, 0xBA78, 0xBA78, 0x0777,

+    0xBA79, 0xBA82, 0x2FB4, 0xBA83, 0xBA85, 0x0778, 0xBA86, 0xBA86, 0x2FBE,

+    0xBA87, 0xBA87, 0x077B, 0xBA88, 0xBA8B, 0x2FBF, 0xBA8C, 0xBA8C, 0x077C,

+    0xBA8D, 0xBAA7, 0x2FC3, 0xBAA8, 0xBAA9, 0x077D, 0xBAAA, 0xBAAA, 0x2FDE,

+    0xBAAB, 0xBAAC, 0x077F, 0xBAAD, 0xBAAF, 0x2FDF, 0xBAB0, 0xBAB0, 0x0781,

+    0xBAB1, 0xBAB1, 0x2FE2, 0xBAB2, 0xBAB2, 0x0782, 0xBAB3, 0xBAB7, 0x2FE3,

+    0xBAB8, 0xBAB9, 0x0783, 0xBABA, 0xBABA, 0x2FE8, 0xBABB, 0xBABB, 0x0785,

+    0xBABC, 0xBABC, 0x2FE9, 0xBABD, 0xBABD, 0x0786, 0xBABE, 0xBAC3, 0x2FEA,

+    0xBAC4, 0xBAC4, 0x0787, 0xBAC5, 0xBAC7, 0x2FF0, 0xBAC8, 0xBAC8, 0x0788,

+    0xBAC9, 0xBAD7, 0x2FF3, 0xBAD8, 0xBAD9, 0x0789, 0xBADA, 0xBAFB, 0x3002,

+    0xBAFC, 0xBAFC, 0x078B, 0xBAFD, 0xBAFF, 0x3024, 0xBB00, 0xBB00, 0x078C,

+    0xBB01, 0xBB03, 0x3027, 0xBB04, 0xBB04, 0x078D, 0xBB05, 0xBB0C, 0x302A,

+    0xBB0D, 0xBB0D, 0x078E, 0xBB0E, 0xBB0E, 0x3032, 0xBB0F, 0xBB0F, 0x078F,

+    0xBB10, 0xBB10, 0x3033, 0xBB11, 0xBB11, 0x0790, 0xBB12, 0xBB17, 0x3034,

+    0xBB18, 0xBB18, 0x0791, 0xBB19, 0xBB1B, 0x303A, 0xBB1C, 0xBB1C, 0x0792,

+    0xBB1D, 0xBB1F, 0x303D, 0xBB20, 0xBB20, 0x0793, 0xBB21, 0xBB28, 0x3040,

+    0xBB29, 0xBB29, 0x0794, 0xBB2A, 0xBB2A, 0x3048, 0xBB2B, 0xBB2B, 0x0795,

+    0xBB2C, 0xBB33, 0x3049, 0xBB34, 0xBB36, 0x0796, 0xBB37, 0xBB37, 0x3051,

+    0xBB38, 0xBB38, 0x0799, 0xBB39, 0xBB3A, 0x3052, 0xBB3B, 0xBB3E, 0x079A,

+    0xBB3F, 0xBB43, 0x3054, 0xBB44, 0xBB45, 0x079E, 0xBB46, 0xBB46, 0x3059,

+    0xBB47, 0xBB47, 0x07A0, 0xBB48, 0xBB48, 0x305A, 0xBB49, 0xBB49, 0x07A1,

+    0xBB4A, 0xBB4C, 0x305B, 0xBB4D, 0xBB4D, 0x07A2, 0xBB4E, 0xBB4E, 0x305E,

+    0xBB4F, 0xBB50, 0x07A3, 0xBB51, 0xBB53, 0x305F, 0xBB54, 0xBB54, 0x07A5,

+    0xBB55, 0xBB57, 0x3062, 0xBB58, 0xBB58, 0x07A6, 0xBB59, 0xBB60, 0x3065,

+    0xBB61, 0xBB61, 0x07A7, 0xBB62, 0xBB62, 0x306D, 0xBB63, 0xBB63, 0x07A8,

+    0xBB64, 0xBB6B, 0x306E, 0xBB6C, 0xBB6C, 0x07A9, 0xBB6D, 0xBB87, 0x3076,

+    0xBB88, 0xBB88, 0x07AA, 0xBB89, 0xBB8B, 0x3091, 0xBB8C, 0xBB8C, 0x07AB,

+    0xBB8D, 0xBB8F, 0x3094, 0xBB90, 0xBB90, 0x07AC, 0xBB91, 0xBBA3, 0x3097,

+    0xBBA4, 0xBBA4, 0x07AD, 0xBBA5, 0xBBA7, 0x30AA, 0xBBA8, 0xBBA8, 0x07AE,

+    0xBBA9, 0xBBAB, 0x30AD, 0xBBAC, 0xBBAC, 0x07AF, 0xBBAD, 0xBBB3, 0x30B0,

+    0xBBB4, 0xBBB4, 0x07B0, 0xBBB5, 0xBBB6, 0x30B7, 0xBBB7, 0xBBB7, 0x07B1,

+    0xBBB8, 0xBBBF, 0x30B9, 0xBBC0, 0xBBC0, 0x07B2, 0xBBC1, 0xBBC3, 0x30C1,

+    0xBBC4, 0xBBC4, 0x07B3, 0xBBC5, 0xBBC7, 0x30C4, 0xBBC8, 0xBBC8, 0x07B4,

+    0xBBC9, 0xBBCF, 0x30C7, 0xBBD0, 0xBBD0, 0x07B5, 0xBBD1, 0xBBD2, 0x30CE,

+    0xBBD3, 0xBBD3, 0x07B6, 0xBBD4, 0xBBF7, 0x30D0, 0xBBF8, 0xBBF9, 0x07B7,

+    0xBBFA, 0xBBFB, 0x30F4, 0xBBFC, 0xBBFC, 0x07B9, 0xBBFD, 0xBBFE, 0x30F6,

+    0xBBFF, 0xBBFF, 0x07BA, 0xBC00, 0xBC00, 0x07BB, 0xBC01, 0xBC01, 0x30F8,

+    0xBC02, 0xBC02, 0x07BC, 0xBC03, 0xBC07, 0x30F9, 0xBC08, 0xBC09, 0x07BD,

+    0xBC0A, 0xBC0A, 0x30FE, 0xBC0B, 0xBC0D, 0x07BF, 0xBC0E, 0xBC0E, 0x30FF,

+    0xBC0F, 0xBC0F, 0x07C2, 0xBC10, 0xBC10, 0x3100, 0xBC11, 0xBC11, 0x07C3,

+    0xBC12, 0xBC13, 0x3101, 0xBC14, 0xBC18, 0x07C4, 0xBC19, 0xBC1A, 0x3103,

+    0xBC1B, 0xBC1F, 0x07C9, 0xBC20, 0xBC23, 0x3105, 0xBC24, 0xBC25, 0x07CE,

+    0xBC26, 0xBC26, 0x3109, 0xBC27, 0xBC27, 0x07D0, 0xBC28, 0xBC28, 0x310A,

+    0xBC29, 0xBC29, 0x07D1, 0xBC2A, 0xBC2C, 0x310B, 0xBC2D, 0xBC2D, 0x07D2,

+    0xBC2E, 0xBC2F, 0x310E, 0xBC30, 0xBC31, 0x07D3, 0xBC32, 0xBC33, 0x3110,

+    0xBC34, 0xBC34, 0x07D5, 0xBC35, 0xBC37, 0x3112, 0xBC38, 0xBC38, 0x07D6,

+    0xBC39, 0xBC3F, 0x3115, 0xBC40, 0xBC41, 0x07D7, 0xBC42, 0xBC42, 0x311C,

+    0xBC43, 0xBC45, 0x07D9, 0xBC46, 0xBC48, 0x311D, 0xBC49, 0xBC49, 0x07DC,

+    0xBC4A, 0xBC4B, 0x3120, 0xBC4C, 0xBC4D, 0x07DD, 0xBC4E, 0xBC4F, 0x3122,

+    0xBC50, 0xBC50, 0x07DF, 0xBC51, 0xBC5C, 0x3124, 0xBC5D, 0xBC5D, 0x07E0,

+    0xBC5E, 0xBC83, 0x3130, 0xBC84, 0xBC85, 0x07E1, 0xBC86, 0xBC87, 0x3156,

+    0xBC88, 0xBC88, 0x07E3, 0xBC89, 0xBC8A, 0x3158, 0xBC8B, 0xBC8C, 0x07E4,

+    0xBC8D, 0xBC8D, 0x315A, 0xBC8E, 0xBC8E, 0x07E6, 0xBC8F, 0xBC93, 0x315B,

+    0xBC94, 0xBC95, 0x07E7, 0xBC96, 0xBC96, 0x3160, 0xBC97, 0xBC97, 0x07E9,

+    0xBC98, 0xBC98, 0x3161, 0xBC99, 0xBC9A, 0x07EA, 0xBC9B, 0xBC9F, 0x3162,

+    0xBCA0, 0xBCA1, 0x07EC, 0xBCA2, 0xBCA3, 0x3167, 0xBCA4, 0xBCA4, 0x07EE,

+    0xBCA5, 0xBCA6, 0x3169, 0xBCA7, 0xBCA8, 0x07EF, 0xBCA9, 0xBCAF, 0x316B,

+    0xBCB0, 0xBCB1, 0x07F1, 0xBCB2, 0xBCB2, 0x3172, 0xBCB3, 0xBCB5, 0x07F3,

+    0xBCB6, 0xBCBB, 0x3173, 0xBCBC, 0xBCBD, 0x07F6, 0xBCBE, 0xBCBF, 0x3179,

+    0xBCC0, 0xBCC0, 0x07F8, 0xBCC1, 0xBCC3, 0x317B, 0xBCC4, 0xBCC4, 0x07F9,

+    0xBCC5, 0xBCCC, 0x317E, 0xBCCD, 0xBCCD, 0x07FA, 0xBCCE, 0xBCCE, 0x3186,

+    0xBCCF, 0xBCD1, 0x07FB, 0xBCD2, 0xBCD4, 0x3187, 0xBCD5, 0xBCD5, 0x07FE,

+    0xBCD6, 0xBCD7, 0x318A, 0xBCD8, 0xBCD8, 0x07FF, 0xBCD9, 0xBCDB, 0x318C,

+    0xBCDC, 0xBCDC, 0x0800, 0xBCDD, 0xBCF3, 0x318F, 0xBCF4, 0xBCF6, 0x0801,

+    0xBCF7, 0xBCF7, 0x31A6, 0xBCF8, 0xBCF8, 0x0804, 0xBCF9, 0xBCFB, 0x31A7,

+    0xBCFC, 0xBCFC, 0x0805, 0xBCFD, 0xBCFF, 0x31AA, 0xBD00, 0xBD03, 0x31AD,

+    0xBD04, 0xBD05, 0x0806, 0xBD06, 0xBD06, 0x31B1, 0xBD07, 0xBD07, 0x0808,

+    0xBD08, 0xBD08, 0x31B2, 0xBD09, 0xBD09, 0x0809, 0xBD0A, 0xBD0F, 0x31B3,

+    0xBD10, 0xBD10, 0x080A, 0xBD11, 0xBD13, 0x31B9, 0xBD14, 0xBD14, 0x080B,

+    0xBD15, 0xBD23, 0x31BC, 0xBD24, 0xBD24, 0x080C, 0xBD25, 0xBD2B, 0x31CB,

+    0xBD2C, 0xBD2C, 0x080D, 0xBD2D, 0xBD3F, 0x31D2, 0xBD40, 0xBD40, 0x080E,

+    0xBD41, 0xBD47, 0x31E5, 0xBD48, 0xBD49, 0x080F, 0xBD4A, 0xBD4B, 0x31EC,

+    0xBD4C, 0xBD4C, 0x0811, 0xBD4D, 0xBD4F, 0x31EE, 0xBD50, 0xBD50, 0x0812,

+    0xBD51, 0xBD57, 0x31F1, 0xBD58, 0xBD59, 0x0813, 0xBD5A, 0xBD63, 0x31F8,

+    0xBD64, 0xBD64, 0x0815, 0xBD65, 0xBD67, 0x3202, 0xBD68, 0xBD68, 0x0816,

+    0xBD69, 0xBD7F, 0x3205, 0xBD80, 0xBD81, 0x0817, 0xBD82, 0xBD83, 0x321C,

+    0xBD84, 0xBD84, 0x0819, 0xBD85, 0xBD86, 0x321E, 0xBD87, 0xBD8A, 0x081A,

+    0xBD8B, 0xBD8F, 0x3220, 0xBD90, 0xBD91, 0x081E, 0xBD92, 0xBD92, 0x3225,

+    0xBD93, 0xBD93, 0x0820, 0xBD94, 0xBD94, 0x3226, 0xBD95, 0xBD95, 0x0821,

+    0xBD96, 0xBD98, 0x3227, 0xBD99, 0xBD9A, 0x0822, 0xBD9B, 0xBD9B, 0x322A,

+    0xBD9C, 0xBD9C, 0x0824, 0xBD9D, 0xBDA3, 0x322B, 0xBDA4, 0xBDA4, 0x0825,

+    0xBDA5, 0xBDAF, 0x3232, 0xBDB0, 0xBDB0, 0x0826, 0xBDB1, 0xBDB7, 0x323D,

+    0xBDB8, 0xBDB8, 0x0827, 0xBDB9, 0xBDD3, 0x3244, 0xBDD4, 0xBDD5, 0x0828,

+    0xBDD6, 0xBDD7, 0x325F, 0xBDD8, 0xBDD8, 0x082A, 0xBDD9, 0xBDDB, 0x3261,

+    0xBDDC, 0xBDDC, 0x082B, 0xBDDD, 0xBDE8, 0x3264, 0xBDE9, 0xBDE9, 0x082C,

+    0xBDEA, 0xBDEF, 0x3270, 0xBDF0, 0xBDF0, 0x082D, 0xBDF1, 0xBDF3, 0x3276,

+    0xBDF4, 0xBDF4, 0x082E, 0xBDF5, 0xBDF7, 0x3279, 0xBDF8, 0xBDF8, 0x082F,

+    0xBDF9, 0xBDFF, 0x327C, 0xBE00, 0xBE00, 0x0830, 0xBE01, 0xBE02, 0x3283,

+    0xBE03, 0xBE03, 0x0831, 0xBE04, 0xBE04, 0x3285, 0xBE05, 0xBE05, 0x0832,

+    0xBE06, 0xBE0B, 0x3286, 0xBE0C, 0xBE0D, 0x0833, 0xBE0E, 0xBE0F, 0x328C,

+    0xBE10, 0xBE10, 0x0835, 0xBE11, 0xBE13, 0x328E, 0xBE14, 0xBE14, 0x0836,

+    0xBE15, 0xBE1B, 0x3291, 0xBE1C, 0xBE1D, 0x0837, 0xBE1E, 0xBE1E, 0x3298,

+    0xBE1F, 0xBE1F, 0x0839, 0xBE20, 0xBE43, 0x3299, 0xBE44, 0xBE45, 0x083A,

+    0xBE46, 0xBE47, 0x32BD, 0xBE48, 0xBE48, 0x083C, 0xBE49, 0xBE4B, 0x32BF,

+    0xBE4C, 0xBE4C, 0x083D, 0xBE4D, 0xBE4D, 0x32C2, 0xBE4E, 0xBE4E, 0x083E,

+    0xBE4F, 0xBE53, 0x32C3, 0xBE54, 0xBE55, 0x083F, 0xBE56, 0xBE56, 0x32C8,

+    0xBE57, 0xBE57, 0x0841, 0xBE58, 0xBE58, 0x32C9, 0xBE59, 0xBE5B, 0x0842,

+    0xBE5C, 0xBE5F, 0x32CA, 0xBE60, 0xBE61, 0x0845, 0xBE62, 0xBE63, 0x32CE,

+    0xBE64, 0xBE64, 0x0847, 0xBE65, 0xBE67, 0x32D0, 0xBE68, 0xBE68, 0x0848,

+    0xBE69, 0xBE69, 0x32D3, 0xBE6A, 0xBE6A, 0x0849, 0xBE6B, 0xBE6F, 0x32D4,

+    0xBE70, 0xBE71, 0x084A, 0xBE72, 0xBE72, 0x32D9, 0xBE73, 0xBE75, 0x084C,

+    0xBE76, 0xBE7A, 0x32DA, 0xBE7B, 0xBE7D, 0x084F, 0xBE7E, 0xBE7F, 0x32DF,

+    0xBE80, 0xBE80, 0x0852, 0xBE81, 0xBE83, 0x32E1, 0xBE84, 0xBE84, 0x0853,

+    0xBE85, 0xBE8B, 0x32E4, 0xBE8C, 0xBE8D, 0x0854, 0xBE8E, 0xBE8E, 0x32EB,

+    0xBE8F, 0xBE91, 0x0856, 0xBE92, 0xBE97, 0x32EC, 0xBE98, 0xBE99, 0x0859,

+    0xBE9A, 0xBEA7, 0x32F2, 0xBEA8, 0xBEA8, 0x085B, 0xBEA9, 0xBECF, 0x3300,

+    0xBED0, 0xBED1, 0x085C, 0xBED2, 0xBED3, 0x3327, 0xBED4, 0xBED4, 0x085E,

+    0xBED5, 0xBED6, 0x3329, 0xBED7, 0xBED8, 0x085F, 0xBED9, 0xBEDF, 0x332B,

+    0xBEE0, 0xBEE0, 0x0861, 0xBEE1, 0xBEE2, 0x3332, 0xBEE3, 0xBEE5, 0x0862,

+    0xBEE6, 0xBEEB, 0x3334, 0xBEEC, 0xBEEC, 0x0865, 0xBEED, 0xBEFF, 0x333A,

+    0xBF00, 0xBF00, 0x334D, 0xBF01, 0xBF01, 0x0866, 0xBF02, 0xBF07, 0x334E,

+    0xBF08, 0xBF09, 0x0867, 0xBF0A, 0xBF17, 0x3354, 0xBF18, 0xBF19, 0x0869,

+    0xBF1A, 0xBF1A, 0x3362, 0xBF1B, 0xBF1D, 0x086B, 0xBF1E, 0xBF3F, 0x3363,

+    0xBF40, 0xBF41, 0x086E, 0xBF42, 0xBF43, 0x3385, 0xBF44, 0xBF44, 0x0870,

+    0xBF45, 0xBF47, 0x3387, 0xBF48, 0xBF48, 0x0871, 0xBF49, 0xBF4F, 0x338A,

+    0xBF50, 0xBF51, 0x0872, 0xBF52, 0xBF54, 0x3391, 0xBF55, 0xBF55, 0x0874,

+    0xBF56, 0xBF93, 0x3394, 0xBF94, 0xBF94, 0x0875, 0xBF95, 0xBFAF, 0x33D2,

+    0xBFB0, 0xBFB0, 0x0876, 0xBFB1, 0xBFC4, 0x33ED, 0xBFC5, 0xBFC5, 0x0877,

+    0xBFC6, 0xBFCB, 0x3401, 0xBFCC, 0xBFCD, 0x0878, 0xBFCE, 0xBFCF, 0x3407,

+    0xBFD0, 0xBFD0, 0x087A, 0xBFD1, 0xBFD3, 0x3409, 0xBFD4, 0xBFD4, 0x087B,

+    0xBFD5, 0xBFDB, 0x340C, 0xBFDC, 0xBFDC, 0x087C, 0xBFDD, 0xBFDE, 0x3413,

+    0xBFDF, 0xBFDF, 0x087D, 0xBFE0, 0xBFE0, 0x3415, 0xBFE1, 0xBFE1, 0x087E,

+    0xBFE2, 0xBFFF, 0x3416, 0xC000, 0xC03B, 0x3434, 0xC03C, 0xC03C, 0x087F,

+    0xC03D, 0xC050, 0x3470, 0xC051, 0xC051, 0x0880, 0xC052, 0xC057, 0x3484,

+    0xC058, 0xC058, 0x0881, 0xC059, 0xC05B, 0x348A, 0xC05C, 0xC05C, 0x0882,

+    0xC05D, 0xC05F, 0x348D, 0xC060, 0xC060, 0x0883, 0xC061, 0xC067, 0x3490,

+    0xC068, 0xC069, 0x0884, 0xC06A, 0xC08F, 0x3497, 0xC090, 0xC091, 0x0886,

+    0xC092, 0xC093, 0x34BD, 0xC094, 0xC094, 0x0888, 0xC095, 0xC097, 0x34BF,

+    0xC098, 0xC098, 0x0889, 0xC099, 0xC09F, 0x34C2, 0xC0A0, 0xC0A1, 0x088A,

+    0xC0A2, 0xC0A2, 0x34C9, 0xC0A3, 0xC0A3, 0x088C, 0xC0A4, 0xC0A4, 0x34CA,

+    0xC0A5, 0xC0A5, 0x088D, 0xC0A6, 0xC0AB, 0x34CB, 0xC0AC, 0xC0AD, 0x088E,

+    0xC0AE, 0xC0AE, 0x34D1, 0xC0AF, 0xC0B0, 0x0890, 0xC0B1, 0xC0B2, 0x34D2,

+    0xC0B3, 0xC0B6, 0x0892, 0xC0B7, 0xC0BB, 0x34D4, 0xC0BC, 0xC0BD, 0x0896,

+    0xC0BE, 0xC0BE, 0x34D9, 0xC0BF, 0xC0C1, 0x0898, 0xC0C2, 0xC0C4, 0x34DA,

+    0xC0C5, 0xC0C5, 0x089B, 0xC0C6, 0xC0C7, 0x34DD, 0xC0C8, 0xC0C9, 0x089C,

+    0xC0CA, 0xC0CB, 0x34DF, 0xC0CC, 0xC0CC, 0x089E, 0xC0CD, 0xC0CF, 0x34E1,

+    0xC0D0, 0xC0D0, 0x089F, 0xC0D1, 0xC0D7, 0x34E4, 0xC0D8, 0xC0D9, 0x08A0,

+    0xC0DA, 0xC0DA, 0x34EB, 0xC0DB, 0xC0DD, 0x08A2, 0xC0DE, 0xC0E3, 0x34EC,

+    0xC0E4, 0xC0E5, 0x08A5, 0xC0E6, 0xC0E7, 0x34F2, 0xC0E8, 0xC0E8, 0x08A7,

+    0xC0E9, 0xC0EB, 0x34F4, 0xC0EC, 0xC0EC, 0x08A8, 0xC0ED, 0xC0F3, 0x34F7,

+    0xC0F4, 0xC0F5, 0x08A9, 0xC0F6, 0xC0F6, 0x34FE, 0xC0F7, 0xC0F7, 0x08AB,

+    0xC0F8, 0xC0F8, 0x34FF, 0xC0F9, 0xC0F9, 0x08AC, 0xC0FA, 0xC0FF, 0x3500,

+    0xC100, 0xC100, 0x08AD, 0xC101, 0xC103, 0x3506, 0xC104, 0xC104, 0x08AE,

+    0xC105, 0xC107, 0x3509, 0xC108, 0xC108, 0x08AF, 0xC109, 0xC10F, 0x350C,

+    0xC110, 0xC110, 0x08B0, 0xC111, 0xC114, 0x3513, 0xC115, 0xC115, 0x08B1,

+    0xC116, 0xC11B, 0x3517, 0xC11C, 0xC120, 0x08B2, 0xC121, 0xC122, 0x351D,

+    0xC123, 0xC124, 0x08B7, 0xC125, 0xC125, 0x351F, 0xC126, 0xC127, 0x08B9,

+    0xC128, 0xC12B, 0x3520, 0xC12C, 0xC12D, 0x08BB, 0xC12E, 0xC12E, 0x3524,

+    0xC12F, 0xC131, 0x08BD, 0xC132, 0xC135, 0x3525, 0xC136, 0xC136, 0x08C0,

+    0xC137, 0xC137, 0x3529, 0xC138, 0xC139, 0x08C1, 0xC13A, 0xC13B, 0x352A,

+    0xC13C, 0xC13C, 0x08C3, 0xC13D, 0xC13F, 0x352C, 0xC140, 0xC140, 0x08C4,

+    0xC141, 0xC147, 0x352F, 0xC148, 0xC149, 0x08C5, 0xC14A, 0xC14A, 0x3536,

+    0xC14B, 0xC14D, 0x08C7, 0xC14E, 0xC153, 0x3537, 0xC154, 0xC155, 0x08CA,

+    0xC156, 0xC157, 0x353D, 0xC158, 0xC158, 0x08CC, 0xC159, 0xC15B, 0x353F,

+    0xC15C, 0xC15C, 0x08CD, 0xC15D, 0xC163, 0x3542, 0xC164, 0xC165, 0x08CE,

+    0xC166, 0xC166, 0x3549, 0xC167, 0xC169, 0x08D0, 0xC16A, 0xC16F, 0x354A,

+    0xC170, 0xC170, 0x08D3, 0xC171, 0xC173, 0x3550, 0xC174, 0xC174, 0x08D4,

+    0xC175, 0xC177, 0x3553, 0xC178, 0xC178, 0x08D5, 0xC179, 0xC184, 0x3556,

+    0xC185, 0xC185, 0x08D6, 0xC186, 0xC18B, 0x3562, 0xC18C, 0xC18E, 0x08D7,

+    0xC18F, 0xC18F, 0x3568, 0xC190, 0xC190, 0x08DA, 0xC191, 0xC193, 0x3569,

+    0xC194, 0xC194, 0x08DB, 0xC195, 0xC195, 0x356C, 0xC196, 0xC196, 0x08DC,

+    0xC197, 0xC19B, 0x356D, 0xC19C, 0xC19D, 0x08DD, 0xC19E, 0xC19E, 0x3572,

+    0xC19F, 0xC19F, 0x08DF, 0xC1A0, 0xC1A0, 0x3573, 0xC1A1, 0xC1A1, 0x08E0,

+    0xC1A2, 0xC1A4, 0x3574, 0xC1A5, 0xC1A5, 0x08E1, 0xC1A6, 0xC1A7, 0x3577,

+    0xC1A8, 0xC1A9, 0x08E2, 0xC1AA, 0xC1AB, 0x3579, 0xC1AC, 0xC1AC, 0x08E4,

+    0xC1AD, 0xC1AF, 0x357B, 0xC1B0, 0xC1B0, 0x08E5, 0xC1B1, 0xC1BC, 0x357E,

+    0xC1BD, 0xC1BD, 0x08E6, 0xC1BE, 0xC1C3, 0x358A, 0xC1C4, 0xC1C4, 0x08E7,

+    0xC1C5, 0xC1C7, 0x3590, 0xC1C8, 0xC1C8, 0x08E8, 0xC1C9, 0xC1CB, 0x3593,

+    0xC1CC, 0xC1CC, 0x08E9, 0xC1CD, 0xC1D3, 0x3596, 0xC1D4, 0xC1D4, 0x08EA,

+    0xC1D5, 0xC1D6, 0x359D, 0xC1D7, 0xC1D8, 0x08EB, 0xC1D9, 0xC1DF, 0x359F,

+    0xC1E0, 0xC1E0, 0x08ED, 0xC1E1, 0xC1E3, 0x35A6, 0xC1E4, 0xC1E4, 0x08EE,

+    0xC1E5, 0xC1E7, 0x35A9, 0xC1E8, 0xC1E8, 0x08EF, 0xC1E9, 0xC1EF, 0x35AC,

+    0xC1F0, 0xC1F1, 0x08F0, 0xC1F2, 0xC1F2, 0x35B3, 0xC1F3, 0xC1F3, 0x08F2,

+    0xC1F4, 0xC1FB, 0x35B4, 0xC1FC, 0xC1FD, 0x08F3, 0xC1FE, 0xC1FF, 0x35BC,

+    0xC200, 0xC200, 0x08F5, 0xC201, 0xC203, 0x35BE, 0xC204, 0xC204, 0x08F6,

+    0xC205, 0xC20B, 0x35C1, 0xC20C, 0xC20D, 0x08F7, 0xC20E, 0xC20E, 0x35C8,

+    0xC20F, 0xC20F, 0x08F9, 0xC210, 0xC210, 0x35C9, 0xC211, 0xC211, 0x08FA,

+    0xC212, 0xC217, 0x35CA, 0xC218, 0xC219, 0x08FB, 0xC21A, 0xC21B, 0x35D0,

+    0xC21C, 0xC21C, 0x08FD, 0xC21D, 0xC21E, 0x35D2, 0xC21F, 0xC220, 0x08FE,

+    0xC221, 0xC227, 0x35D4, 0xC228, 0xC229, 0x0900, 0xC22A, 0xC22A, 0x35DB,

+    0xC22B, 0xC22B, 0x0902, 0xC22C, 0xC22C, 0x35DC, 0xC22D, 0xC22D, 0x0903,

+    0xC22E, 0xC22E, 0x35DD, 0xC22F, 0xC22F, 0x0904, 0xC230, 0xC230, 0x35DE,

+    0xC231, 0xC232, 0x0905, 0xC233, 0xC233, 0x35DF, 0xC234, 0xC234, 0x0907,

+    0xC235, 0xC247, 0x35E0, 0xC248, 0xC248, 0x0908, 0xC249, 0xC24F, 0x35F3,

+    0xC250, 0xC251, 0x0909, 0xC252, 0xC253, 0x35FA, 0xC254, 0xC254, 0x090B,

+    0xC255, 0xC257, 0x35FC, 0xC258, 0xC258, 0x090C, 0xC259, 0xC25F, 0x35FF,

+    0xC260, 0xC260, 0x090D, 0xC261, 0xC264, 0x3606, 0xC265, 0xC265, 0x090E,

+    0xC266, 0xC26B, 0x360A, 0xC26C, 0xC26D, 0x090F, 0xC26E, 0xC26F, 0x3610,

+    0xC270, 0xC270, 0x0911, 0xC271, 0xC273, 0x3612, 0xC274, 0xC274, 0x0912,

+    0xC275, 0xC27B, 0x3615, 0xC27C, 0xC27D, 0x0913, 0xC27E, 0xC27E, 0x361C,

+    0xC27F, 0xC27F, 0x0915, 0xC280, 0xC280, 0x361D, 0xC281, 0xC281, 0x0916,

+    0xC282, 0xC287, 0x361E, 0xC288, 0xC289, 0x0917, 0xC28A, 0xC28F, 0x3624,

+    0xC290, 0xC290, 0x0919, 0xC291, 0xC297, 0x362A, 0xC298, 0xC298, 0x091A,

+    0xC299, 0xC29A, 0x3631, 0xC29B, 0xC29B, 0x091B, 0xC29C, 0xC29C, 0x3633,

+    0xC29D, 0xC29D, 0x091C, 0xC29E, 0xC2A3, 0x3634, 0xC2A4, 0xC2A5, 0x091D,

+    0xC2A6, 0xC2A7, 0x363A, 0xC2A8, 0xC2A8, 0x091F, 0xC2A9, 0xC2AB, 0x363C,

+    0xC2AC, 0xC2AD, 0x0920, 0xC2AE, 0xC2B3, 0x363F, 0xC2B4, 0xC2B5, 0x0922,

+    0xC2B6, 0xC2B6, 0x3645, 0xC2B7, 0xC2B7, 0x0924, 0xC2B8, 0xC2B8, 0x3646,

+    0xC2B9, 0xC2B9, 0x0925, 0xC2BA, 0xC2DB, 0x3647, 0xC2DC, 0xC2DD, 0x0926,

+    0xC2DE, 0xC2DF, 0x3669, 0xC2E0, 0xC2E0, 0x0928, 0xC2E1, 0xC2E2, 0x366B,

+    0xC2E3, 0xC2E4, 0x0929, 0xC2E5, 0xC2EA, 0x366D, 0xC2EB, 0xC2ED, 0x092B,

+    0xC2EE, 0xC2EE, 0x3673, 0xC2EF, 0xC2EF, 0x092E, 0xC2F0, 0xC2F0, 0x3674,

+    0xC2F1, 0xC2F1, 0x092F, 0xC2F2, 0xC2F5, 0x3675, 0xC2F6, 0xC2F6, 0x0930,

+    0xC2F7, 0xC2F7, 0x3679, 0xC2F8, 0xC2F9, 0x0931, 0xC2FA, 0xC2FA, 0x367A,

+    0xC2FB, 0xC2FC, 0x0933, 0xC2FD, 0xC2FF, 0x367B, 0xC300, 0xC300, 0x0935,

+    0xC301, 0xC307, 0x367E, 0xC308, 0xC309, 0x0936, 0xC30A, 0xC30B, 0x3685,

+    0xC30C, 0xC30D, 0x0938, 0xC30E, 0xC312, 0x3687, 0xC313, 0xC315, 0x093A,

+    0xC316, 0xC317, 0x368C, 0xC318, 0xC318, 0x093D, 0xC319, 0xC31B, 0x368E,

+    0xC31C, 0xC31C, 0x093E, 0xC31D, 0xC323, 0x3691, 0xC324, 0xC325, 0x093F,

+    0xC326, 0xC327, 0x3698, 0xC328, 0xC329, 0x0941, 0xC32A, 0xC344, 0x369A,

+    0xC345, 0xC345, 0x0943, 0xC346, 0xC367, 0x36B5, 0xC368, 0xC369, 0x0944,

+    0xC36A, 0xC36B, 0x36D7, 0xC36C, 0xC36C, 0x0946, 0xC36D, 0xC36F, 0x36D9,

+    0xC370, 0xC370, 0x0947, 0xC371, 0xC371, 0x36DC, 0xC372, 0xC372, 0x0948,

+    0xC373, 0xC377, 0x36DD, 0xC378, 0xC379, 0x0949, 0xC37A, 0xC37B, 0x36E2,

+    0xC37C, 0xC37D, 0x094B, 0xC37E, 0xC383, 0x36E4, 0xC384, 0xC384, 0x094D,

+    0xC385, 0xC387, 0x36EA, 0xC388, 0xC388, 0x094E, 0xC389, 0xC38B, 0x36ED,

+    0xC38C, 0xC38C, 0x094F, 0xC38D, 0xC3BF, 0x36F0, 0xC3C0, 0xC3C0, 0x0950,

+    0xC3C1, 0xC3D7, 0x3723, 0xC3D8, 0xC3D9, 0x0951, 0xC3DA, 0xC3DB, 0x373A,

+    0xC3DC, 0xC3DC, 0x0953, 0xC3DD, 0xC3DE, 0x373C, 0xC3DF, 0xC3E0, 0x0954,

+    0xC3E1, 0xC3E1, 0x373E, 0xC3E2, 0xC3E2, 0x0956, 0xC3E3, 0xC3E7, 0x373F,

+    0xC3E8, 0xC3E9, 0x0957, 0xC3EA, 0xC3EC, 0x3744, 0xC3ED, 0xC3ED, 0x0959,

+    0xC3EE, 0xC3F3, 0x3747, 0xC3F4, 0xC3F5, 0x095A, 0xC3F6, 0xC3F7, 0x374D,

+    0xC3F8, 0xC3F8, 0x095C, 0xC3F9, 0xC3FF, 0x374F, 0xC400, 0xC407, 0x3756,

+    0xC408, 0xC408, 0x095D, 0xC409, 0xC40F, 0x375E, 0xC410, 0xC410, 0x095E,

+    0xC411, 0xC423, 0x3765, 0xC424, 0xC424, 0x095F, 0xC425, 0xC42B, 0x3778,

+    0xC42C, 0xC42C, 0x0960, 0xC42D, 0xC42F, 0x377F, 0xC430, 0xC430, 0x0961,

+    0xC431, 0xC433, 0x3782, 0xC434, 0xC434, 0x0962, 0xC435, 0xC43B, 0x3785,

+    0xC43C, 0xC43D, 0x0963, 0xC43E, 0xC447, 0x378C, 0xC448, 0xC448, 0x0965,

+    0xC449, 0xC463, 0x3796, 0xC464, 0xC465, 0x0966, 0xC466, 0xC467, 0x37B1,

+    0xC468, 0xC468, 0x0968, 0xC469, 0xC46B, 0x37B3, 0xC46C, 0xC46C, 0x0969,

+    0xC46D, 0xC473, 0x37B6, 0xC474, 0xC475, 0x096A, 0xC476, 0xC478, 0x37BD,

+    0xC479, 0xC479, 0x096C, 0xC47A, 0xC47F, 0x37C0, 0xC480, 0xC480, 0x096D,

+    0xC481, 0xC493, 0x37C6, 0xC494, 0xC494, 0x096E, 0xC495, 0xC49B, 0x37D9,

+    0xC49C, 0xC49C, 0x096F, 0xC49D, 0xC4B7, 0x37E0, 0xC4B8, 0xC4B8, 0x0970,

+    0xC4B9, 0xC4BB, 0x37FB, 0xC4BC, 0xC4BC, 0x0971, 0xC4BD, 0xC4E8, 0x37FE,

+    0xC4E9, 0xC4E9, 0x0972, 0xC4EA, 0xC4EF, 0x382A, 0xC4F0, 0xC4F1, 0x0973,

+    0xC4F2, 0xC4F3, 0x3830, 0xC4F4, 0xC4F4, 0x0975, 0xC4F5, 0xC4F7, 0x3832,

+    0xC4F8, 0xC4F8, 0x0976, 0xC4F9, 0xC4F9, 0x3835, 0xC4FA, 0xC4FA, 0x0977,

+    0xC4FB, 0xC4FE, 0x3836, 0xC4FF, 0xC4FF, 0x0978, 0xC500, 0xC501, 0x0979,

+    0xC502, 0xC50B, 0x383A, 0xC50C, 0xC50C, 0x097B, 0xC50D, 0xC50F, 0x3844,

+    0xC510, 0xC510, 0x097C, 0xC511, 0xC513, 0x3847, 0xC514, 0xC514, 0x097D,

+    0xC515, 0xC51B, 0x384A, 0xC51C, 0xC51C, 0x097E, 0xC51D, 0xC527, 0x3851,

+    0xC528, 0xC529, 0x097F, 0xC52A, 0xC52B, 0x385C, 0xC52C, 0xC52C, 0x0981,

+    0xC52D, 0xC52F, 0x385E, 0xC530, 0xC530, 0x0982, 0xC531, 0xC537, 0x3861,

+    0xC538, 0xC539, 0x0983, 0xC53A, 0xC53A, 0x3868, 0xC53B, 0xC53B, 0x0985,

+    0xC53C, 0xC53C, 0x3869, 0xC53D, 0xC53D, 0x0986, 0xC53E, 0xC543, 0x386A,

+    0xC544, 0xC545, 0x0987, 0xC546, 0xC547, 0x3870, 0xC548, 0xC54A, 0x0989,

+    0xC54B, 0xC54B, 0x3872, 0xC54C, 0xC54E, 0x098C, 0xC54F, 0xC552, 0x3873,

+    0xC553, 0xC555, 0x098F, 0xC556, 0xC556, 0x3877, 0xC557, 0xC559, 0x0992,

+    0xC55A, 0xC55C, 0x3878, 0xC55D, 0xC55E, 0x0995, 0xC55F, 0xC55F, 0x387B,

+    0xC560, 0xC561, 0x0997, 0xC562, 0xC563, 0x387C, 0xC564, 0xC564, 0x0999,

+    0xC565, 0xC567, 0x387E, 0xC568, 0xC568, 0x099A, 0xC569, 0xC56F, 0x3881,

+    0xC570, 0xC571, 0x099B, 0xC572, 0xC572, 0x3888, 0xC573, 0xC575, 0x099D,

+    0xC576, 0xC57B, 0x3889, 0xC57C, 0xC57D, 0x09A0, 0xC57E, 0xC57F, 0x388F,

+    0xC580, 0xC580, 0x09A2, 0xC581, 0xC583, 0x3891, 0xC584, 0xC584, 0x09A3,

+    0xC585, 0xC586, 0x3894, 0xC587, 0xC587, 0x09A4, 0xC588, 0xC58B, 0x3896,

+    0xC58C, 0xC58D, 0x09A5, 0xC58E, 0xC58E, 0x389A, 0xC58F, 0xC58F, 0x09A7,

+    0xC590, 0xC590, 0x389B, 0xC591, 0xC591, 0x09A8, 0xC592, 0xC594, 0x389C,

+    0xC595, 0xC595, 0x09A9, 0xC596, 0xC596, 0x389F, 0xC597, 0xC598, 0x09AA,

+    0xC599, 0xC59B, 0x38A0, 0xC59C, 0xC59C, 0x09AC, 0xC59D, 0xC59F, 0x38A3,

+    0xC5A0, 0xC5A0, 0x09AD, 0xC5A1, 0xC5A8, 0x38A6, 0xC5A9, 0xC5A9, 0x09AE,

+    0xC5AA, 0xC5B3, 0x38AE, 0xC5B4, 0xC5B5, 0x09AF, 0xC5B6, 0xC5B7, 0x38B8,

+    0xC5B8, 0xC5B9, 0x09B1, 0xC5BA, 0xC5BA, 0x38BA, 0xC5BB, 0xC5BE, 0x09B3,

+    0xC5BF, 0xC5C3, 0x38BB, 0xC5C4, 0xC5CA, 0x09B7, 0xC5CB, 0xC5CB, 0x38C0,

+    0xC5CC, 0xC5CC, 0x09BE, 0xC5CD, 0xC5CD, 0x38C1, 0xC5CE, 0xC5CE, 0x09BF,

+    0xC5CF, 0xC5CF, 0x38C2, 0xC5D0, 0xC5D1, 0x09C0, 0xC5D2, 0xC5D3, 0x38C3,

+    0xC5D4, 0xC5D4, 0x09C2, 0xC5D5, 0xC5D7, 0x38C5, 0xC5D8, 0xC5D8, 0x09C3,

+    0xC5D9, 0xC5DF, 0x38C8, 0xC5E0, 0xC5E1, 0x09C4, 0xC5E2, 0xC5E2, 0x38CF,

+    0xC5E3, 0xC5E3, 0x09C6, 0xC5E4, 0xC5E4, 0x38D0, 0xC5E5, 0xC5E5, 0x09C7,

+    0xC5E6, 0xC5EB, 0x38D1, 0xC5EC, 0xC5EE, 0x09C8, 0xC5EF, 0xC5EF, 0x38D7,

+    0xC5F0, 0xC5F0, 0x09CB, 0xC5F1, 0xC5F3, 0x38D8, 0xC5F4, 0xC5F4, 0x09CC,

+    0xC5F5, 0xC5F5, 0x38DB, 0xC5F6, 0xC5F7, 0x09CD, 0xC5F8, 0xC5FB, 0x38DC,

+    0xC5FC, 0xC5FF, 0x09CF, 0xC600, 0xC601, 0x09D3, 0xC602, 0xC604, 0x38E0,

+    0xC605, 0xC608, 0x09D5, 0xC609, 0xC60B, 0x38E3, 0xC60C, 0xC60C, 0x09D9,

+    0xC60D, 0xC60F, 0x38E6, 0xC610, 0xC610, 0x09DA, 0xC611, 0xC617, 0x38E9,

+    0xC618, 0xC619, 0x09DB, 0xC61A, 0xC61A, 0x38F0, 0xC61B, 0xC61C, 0x09DD,

+    0xC61D, 0xC623, 0x38F1, 0xC624, 0xC625, 0x09DF, 0xC626, 0xC627, 0x38F8,

+    0xC628, 0xC628, 0x09E1, 0xC629, 0xC62B, 0x38FA, 0xC62C, 0xC62E, 0x09E2,

+    0xC62F, 0xC62F, 0x38FD, 0xC630, 0xC630, 0x09E5, 0xC631, 0xC632, 0x38FE,

+    0xC633, 0xC635, 0x09E6, 0xC636, 0xC636, 0x3900, 0xC637, 0xC637, 0x09E9,

+    0xC638, 0xC638, 0x3901, 0xC639, 0xC639, 0x09EA, 0xC63A, 0xC63A, 0x3902,

+    0xC63B, 0xC63B, 0x09EB, 0xC63C, 0xC63F, 0x3903, 0xC640, 0xC641, 0x09EC,

+    0xC642, 0xC643, 0x3907, 0xC644, 0xC644, 0x09EE, 0xC645, 0xC647, 0x3909,

+    0xC648, 0xC648, 0x09EF, 0xC649, 0xC64F, 0x390C, 0xC650, 0xC651, 0x09F0,

+    0xC652, 0xC652, 0x3913, 0xC653, 0xC655, 0x09F2, 0xC656, 0xC65B, 0x3914,

+    0xC65C, 0xC65D, 0x09F5, 0xC65E, 0xC65F, 0x391A, 0xC660, 0xC660, 0x09F7,

+    0xC661, 0xC66B, 0x391C, 0xC66C, 0xC66C, 0x09F8, 0xC66D, 0xC66E, 0x3927,

+    0xC66F, 0xC66F, 0x09F9, 0xC670, 0xC670, 0x3929, 0xC671, 0xC671, 0x09FA,

+    0xC672, 0xC677, 0x392A, 0xC678, 0xC679, 0x09FB, 0xC67A, 0xC67B, 0x3930,

+    0xC67C, 0xC67C, 0x09FD, 0xC67D, 0xC67F, 0x3932, 0xC680, 0xC680, 0x09FE,

+    0xC681, 0xC687, 0x3935, 0xC688, 0xC689, 0x09FF, 0xC68A, 0xC68A, 0x393C,

+    0xC68B, 0xC68B, 0x0A01, 0xC68C, 0xC68C, 0x393D, 0xC68D, 0xC68D, 0x0A02,

+    0xC68E, 0xC693, 0x393E, 0xC694, 0xC695, 0x0A03, 0xC696, 0xC697, 0x3944,

+    0xC698, 0xC698, 0x0A05, 0xC699, 0xC69B, 0x3946, 0xC69C, 0xC69C, 0x0A06,

+    0xC69D, 0xC6A3, 0x3949, 0xC6A4, 0xC6A5, 0x0A07, 0xC6A6, 0xC6A6, 0x3950,

+    0xC6A7, 0xC6A7, 0x0A09, 0xC6A8, 0xC6A8, 0x3951, 0xC6A9, 0xC6A9, 0x0A0A,

+    0xC6AA, 0xC6AF, 0x3952, 0xC6B0, 0xC6B1, 0x0A0B, 0xC6B2, 0xC6B3, 0x3958,

+    0xC6B4, 0xC6B4, 0x0A0D, 0xC6B5, 0xC6B7, 0x395A, 0xC6B8, 0xC6BA, 0x0A0E,

+    0xC6BB, 0xC6BF, 0x395D, 0xC6C0, 0xC6C1, 0x0A11, 0xC6C2, 0xC6C2, 0x3962,

+    0xC6C3, 0xC6C3, 0x0A13, 0xC6C4, 0xC6C4, 0x3963, 0xC6C5, 0xC6C5, 0x0A14,

+    0xC6C6, 0xC6CB, 0x3964, 0xC6CC, 0xC6CD, 0x0A15, 0xC6CE, 0xC6CF, 0x396A,

+    0xC6D0, 0xC6D0, 0x0A17, 0xC6D1, 0xC6D3, 0x396C, 0xC6D4, 0xC6D4, 0x0A18,

+    0xC6D5, 0xC6DB, 0x396F, 0xC6DC, 0xC6DD, 0x0A19, 0xC6DE, 0xC6DF, 0x3976,

+    0xC6E0, 0xC6E1, 0x0A1B, 0xC6E2, 0xC6E7, 0x3978, 0xC6E8, 0xC6E9, 0x0A1D,

+    0xC6EA, 0xC6EB, 0x397E, 0xC6EC, 0xC6EC, 0x0A1F, 0xC6ED, 0xC6EF, 0x3980,

+    0xC6F0, 0xC6F0, 0x0A20, 0xC6F1, 0xC6F7, 0x3983, 0xC6F8, 0xC6F9, 0x0A21,

+    0xC6FA, 0xC6FC, 0x398A, 0xC6FD, 0xC6FD, 0x0A23, 0xC6FE, 0xC6FF, 0x398D,

+    0xC700, 0xC703, 0x398F, 0xC704, 0xC705, 0x0A24, 0xC706, 0xC707, 0x3993,

+    0xC708, 0xC708, 0x0A26, 0xC709, 0xC70B, 0x3995, 0xC70C, 0xC70C, 0x0A27,

+    0xC70D, 0xC713, 0x3998, 0xC714, 0xC715, 0x0A28, 0xC716, 0xC716, 0x399F,

+    0xC717, 0xC717, 0x0A2A, 0xC718, 0xC718, 0x39A0, 0xC719, 0xC719, 0x0A2B,

+    0xC71A, 0xC71F, 0x39A1, 0xC720, 0xC721, 0x0A2C, 0xC722, 0xC723, 0x39A7,

+    0xC724, 0xC724, 0x0A2E, 0xC725, 0xC727, 0x39A9, 0xC728, 0xC728, 0x0A2F,

+    0xC729, 0xC72F, 0x39AC, 0xC730, 0xC731, 0x0A30, 0xC732, 0xC732, 0x39B3,

+    0xC733, 0xC733, 0x0A32, 0xC734, 0xC734, 0x39B4, 0xC735, 0xC735, 0x0A33,

+    0xC736, 0xC736, 0x39B5, 0xC737, 0xC737, 0x0A34, 0xC738, 0xC73B, 0x39B6,

+    0xC73C, 0xC73D, 0x0A35, 0xC73E, 0xC73F, 0x39BA, 0xC740, 0xC740, 0x0A37,

+    0xC741, 0xC743, 0x39BC, 0xC744, 0xC744, 0x0A38, 0xC745, 0xC749, 0x39BF,

+    0xC74A, 0xC74A, 0x0A39, 0xC74B, 0xC74B, 0x39C4, 0xC74C, 0xC74D, 0x0A3A,

+    0xC74E, 0xC74E, 0x39C5, 0xC74F, 0xC74F, 0x0A3C, 0xC750, 0xC750, 0x39C6,

+    0xC751, 0xC758, 0x0A3D, 0xC759, 0xC75B, 0x39C7, 0xC75C, 0xC75C, 0x0A45,

+    0xC75D, 0xC75F, 0x39CA, 0xC760, 0xC760, 0x0A46, 0xC761, 0xC767, 0x39CD,

+    0xC768, 0xC768, 0x0A47, 0xC769, 0xC76A, 0x39D4, 0xC76B, 0xC76B, 0x0A48,

+    0xC76C, 0xC773, 0x39D6, 0xC774, 0xC775, 0x0A49, 0xC776, 0xC777, 0x39DE,

+    0xC778, 0xC778, 0x0A4B, 0xC779, 0xC77B, 0x39E0, 0xC77C, 0xC77E, 0x0A4C,

+    0xC77F, 0xC782, 0x39E3, 0xC783, 0xC785, 0x0A4F, 0xC786, 0xC786, 0x39E7,

+    0xC787, 0xC78A, 0x0A52, 0xC78B, 0xC78D, 0x39E8, 0xC78E, 0xC78E, 0x0A56,

+    0xC78F, 0xC78F, 0x39EB, 0xC790, 0xC791, 0x0A57, 0xC792, 0xC793, 0x39EC,

+    0xC794, 0xC794, 0x0A59, 0xC795, 0xC795, 0x39EE, 0xC796, 0xC798, 0x0A5A,

+    0xC799, 0xC799, 0x39EF, 0xC79A, 0xC79A, 0x0A5D, 0xC79B, 0xC79F, 0x39F0,

+    0xC7A0, 0xC7A1, 0x0A5E, 0xC7A2, 0xC7A2, 0x39F5, 0xC7A3, 0xC7A6, 0x0A60,

+    0xC7A7, 0xC7AB, 0x39F6, 0xC7AC, 0xC7AD, 0x0A64, 0xC7AE, 0xC7AF, 0x39FB,

+    0xC7B0, 0xC7B0, 0x0A66, 0xC7B1, 0xC7B3, 0x39FD, 0xC7B4, 0xC7B4, 0x0A67,

+    0xC7B5, 0xC7BB, 0x3A00, 0xC7BC, 0xC7BD, 0x0A68, 0xC7BE, 0xC7BE, 0x3A07,

+    0xC7BF, 0xC7C1, 0x0A6A, 0xC7C2, 0xC7C7, 0x3A08, 0xC7C8, 0xC7C9, 0x0A6D,

+    0xC7CA, 0xC7CB, 0x3A0E, 0xC7CC, 0xC7CC, 0x0A6F, 0xC7CD, 0xC7CD, 0x3A10,

+    0xC7CE, 0xC7CE, 0x0A70, 0xC7CF, 0xC7CF, 0x3A11, 0xC7D0, 0xC7D0, 0x0A71,

+    0xC7D1, 0xC7D7, 0x3A12, 0xC7D8, 0xC7D8, 0x0A72, 0xC7D9, 0xC7DC, 0x3A19,

+    0xC7DD, 0xC7DD, 0x0A73, 0xC7DE, 0xC7E3, 0x3A1D, 0xC7E4, 0xC7E4, 0x0A74,

+    0xC7E5, 0xC7E7, 0x3A23, 0xC7E8, 0xC7E8, 0x0A75, 0xC7E9, 0xC7EB, 0x3A26,

+    0xC7EC, 0xC7EC, 0x0A76, 0xC7ED, 0xC7FF, 0x3A29, 0xC800, 0xC801, 0x0A77,

+    0xC802, 0xC803, 0x3A3C, 0xC804, 0xC804, 0x0A79, 0xC805, 0xC807, 0x3A3E,

+    0xC808, 0xC808, 0x0A7A, 0xC809, 0xC809, 0x3A41, 0xC80A, 0xC80A, 0x0A7B,

+    0xC80B, 0xC80F, 0x3A42, 0xC810, 0xC811, 0x0A7C, 0xC812, 0xC812, 0x3A47,

+    0xC813, 0xC813, 0x0A7E, 0xC814, 0xC814, 0x3A48, 0xC815, 0xC816, 0x0A7F,

+    0xC817, 0xC81B, 0x3A49, 0xC81C, 0xC81D, 0x0A81, 0xC81E, 0xC81F, 0x3A4E,

+    0xC820, 0xC820, 0x0A83, 0xC821, 0xC823, 0x3A50, 0xC824, 0xC824, 0x0A84,

+    0xC825, 0xC82B, 0x3A53, 0xC82C, 0xC82D, 0x0A85, 0xC82E, 0xC82E, 0x3A5A,

+    0xC82F, 0xC82F, 0x0A87, 0xC830, 0xC830, 0x3A5B, 0xC831, 0xC831, 0x0A88,

+    0xC832, 0xC837, 0x3A5C, 0xC838, 0xC838, 0x0A89, 0xC839, 0xC83B, 0x3A62,

+    0xC83C, 0xC83C, 0x0A8A, 0xC83D, 0xC83F, 0x3A65, 0xC840, 0xC840, 0x0A8B,

+    0xC841, 0xC847, 0x3A68, 0xC848, 0xC849, 0x0A8C, 0xC84A, 0xC84B, 0x3A6F,

+    0xC84C, 0xC84D, 0x0A8E, 0xC84E, 0xC853, 0x3A71, 0xC854, 0xC854, 0x0A90,

+    0xC855, 0xC86F, 0x3A77, 0xC870, 0xC871, 0x0A91, 0xC872, 0xC873, 0x3A92,

+    0xC874, 0xC874, 0x0A93, 0xC875, 0xC877, 0x3A94, 0xC878, 0xC878, 0x0A94,

+    0xC879, 0xC879, 0x3A97, 0xC87A, 0xC87A, 0x0A95, 0xC87B, 0xC87F, 0x3A98,

+    0xC880, 0xC881, 0x0A96, 0xC882, 0xC882, 0x3A9D, 0xC883, 0xC883, 0x0A98,

+    0xC884, 0xC884, 0x3A9E, 0xC885, 0xC887, 0x0A99, 0xC888, 0xC88A, 0x3A9F,

+    0xC88B, 0xC88D, 0x0A9C, 0xC88E, 0xC893, 0x3AA2, 0xC894, 0xC894, 0x0A9F,

+    0xC895, 0xC89C, 0x3AA8, 0xC89D, 0xC89D, 0x0AA0, 0xC89E, 0xC89E, 0x3AB0,

+    0xC89F, 0xC89F, 0x0AA1, 0xC8A0, 0xC8A0, 0x3AB1, 0xC8A1, 0xC8A1, 0x0AA2,

+    0xC8A2, 0xC8A7, 0x3AB2, 0xC8A8, 0xC8A8, 0x0AA3, 0xC8A9, 0xC8BB, 0x3AB8,

+    0xC8BC, 0xC8BD, 0x0AA4, 0xC8BE, 0xC8C3, 0x3ACB, 0xC8C4, 0xC8C4, 0x0AA6,

+    0xC8C5, 0xC8C7, 0x3AD1, 0xC8C8, 0xC8C8, 0x0AA7, 0xC8C9, 0xC8CB, 0x3AD4,

+    0xC8CC, 0xC8CC, 0x0AA8, 0xC8CD, 0xC8D3, 0x3AD7, 0xC8D4, 0xC8D5, 0x0AA9,

+    0xC8D6, 0xC8D6, 0x3ADE, 0xC8D7, 0xC8D7, 0x0AAB, 0xC8D8, 0xC8D8, 0x3ADF,

+    0xC8D9, 0xC8D9, 0x0AAC, 0xC8DA, 0xC8DF, 0x3AE0, 0xC8E0, 0xC8E1, 0x0AAD,

+    0xC8E2, 0xC8E3, 0x3AE6, 0xC8E4, 0xC8E4, 0x0AAF, 0xC8E5, 0xC8F4, 0x3AE8,

+    0xC8F5, 0xC8F5, 0x0AB0, 0xC8F6, 0xC8FB, 0x3AF8, 0xC8FC, 0xC8FD, 0x0AB1,

+    0xC8FE, 0xC8FF, 0x3AFE, 0xC900, 0xC900, 0x0AB3, 0xC901, 0xC903, 0x3B00,

+    0xC904, 0xC906, 0x0AB4, 0xC907, 0xC90B, 0x3B03, 0xC90C, 0xC90D, 0x0AB7,

+    0xC90E, 0xC90E, 0x3B08, 0xC90F, 0xC90F, 0x0AB9, 0xC910, 0xC910, 0x3B09,

+    0xC911, 0xC911, 0x0ABA, 0xC912, 0xC917, 0x3B0A, 0xC918, 0xC918, 0x0ABB,

+    0xC919, 0xC92B, 0x3B10, 0xC92C, 0xC92C, 0x0ABC, 0xC92D, 0xC933, 0x3B23,

+    0xC934, 0xC934, 0x0ABD, 0xC935, 0xC94F, 0x3B2A, 0xC950, 0xC951, 0x0ABE,

+    0xC952, 0xC953, 0x3B45, 0xC954, 0xC954, 0x0AC0, 0xC955, 0xC957, 0x3B47,

+    0xC958, 0xC958, 0x0AC1, 0xC959, 0xC95F, 0x3B4A, 0xC960, 0xC961, 0x0AC2,

+    0xC962, 0xC962, 0x3B51, 0xC963, 0xC963, 0x0AC4, 0xC964, 0xC96B, 0x3B52,

+    0xC96C, 0xC96C, 0x0AC5, 0xC96D, 0xC96F, 0x3B5A, 0xC970, 0xC970, 0x0AC6,

+    0xC971, 0xC973, 0x3B5D, 0xC974, 0xC974, 0x0AC7, 0xC975, 0xC97B, 0x3B60,

+    0xC97C, 0xC97C, 0x0AC8, 0xC97D, 0xC987, 0x3B67, 0xC988, 0xC989, 0x0AC9,

+    0xC98A, 0xC98B, 0x3B72, 0xC98C, 0xC98C, 0x0ACB, 0xC98D, 0xC98F, 0x3B74,

+    0xC990, 0xC990, 0x0ACC, 0xC991, 0xC997, 0x3B77, 0xC998, 0xC999, 0x0ACD,

+    0xC99A, 0xC99A, 0x3B7E, 0xC99B, 0xC99B, 0x0ACF, 0xC99C, 0xC99C, 0x3B7F,

+    0xC99D, 0xC99D, 0x0AD0, 0xC99E, 0xC9BF, 0x3B80, 0xC9C0, 0xC9C1, 0x0AD1,

+    0xC9C2, 0xC9C3, 0x3BA2, 0xC9C4, 0xC9C4, 0x0AD3, 0xC9C5, 0xC9C6, 0x3BA4,

+    0xC9C7, 0xC9C8, 0x0AD4, 0xC9C9, 0xC9C9, 0x3BA6, 0xC9CA, 0xC9CA, 0x0AD6,

+    0xC9CB, 0xC9CF, 0x3BA7, 0xC9D0, 0xC9D1, 0x0AD7, 0xC9D2, 0xC9D2, 0x3BAC,

+    0xC9D3, 0xC9D3, 0x0AD9, 0xC9D4, 0xC9D4, 0x3BAD, 0xC9D5, 0xC9D6, 0x0ADA,

+    0xC9D7, 0xC9D8, 0x3BAE, 0xC9D9, 0xC9DA, 0x0ADC, 0xC9DB, 0xC9DB, 0x3BB0,

+    0xC9DC, 0xC9DD, 0x0ADE, 0xC9DE, 0xC9DF, 0x3BB1, 0xC9E0, 0xC9E0, 0x0AE0,

+    0xC9E1, 0xC9E1, 0x3BB3, 0xC9E2, 0xC9E2, 0x0AE1, 0xC9E3, 0xC9E3, 0x3BB4,

+    0xC9E4, 0xC9E4, 0x0AE2, 0xC9E5, 0xC9E6, 0x3BB5, 0xC9E7, 0xC9E7, 0x0AE3,

+    0xC9E8, 0xC9EB, 0x3BB7, 0xC9EC, 0xC9ED, 0x0AE4, 0xC9EE, 0xC9EE, 0x3BBB,

+    0xC9EF, 0xC9F1, 0x0AE6, 0xC9F2, 0xC9F7, 0x3BBC, 0xC9F8, 0xC9F9, 0x0AE9,

+    0xC9FA, 0xC9FB, 0x3BC2, 0xC9FC, 0xC9FC, 0x0AEB, 0xC9FD, 0xC9FF, 0x3BC4,

+    0xCA00, 0xCA00, 0x0AEC, 0xCA01, 0xCA07, 0x3BC7, 0xCA08, 0xCA09, 0x0AED,

+    0xCA0A, 0xCA0A, 0x3BCE, 0xCA0B, 0xCA0D, 0x0AEF, 0xCA0E, 0xCA13, 0x3BCF,

+    0xCA14, 0xCA14, 0x0AF2, 0xCA15, 0xCA17, 0x3BD5, 0xCA18, 0xCA18, 0x0AF3,

+    0xCA19, 0xCA28, 0x3BD8, 0xCA29, 0xCA29, 0x0AF4, 0xCA2A, 0xCA4B, 0x3BE8,

+    0xCA4C, 0xCA4D, 0x0AF5, 0xCA4E, 0xCA4F, 0x3C0A, 0xCA50, 0xCA50, 0x0AF7,

+    0xCA51, 0xCA53, 0x3C0C, 0xCA54, 0xCA54, 0x0AF8, 0xCA55, 0xCA5B, 0x3C0F,

+    0xCA5C, 0xCA5D, 0x0AF9, 0xCA5E, 0xCA5E, 0x3C16, 0xCA5F, 0xCA61, 0x0AFB,

+    0xCA62, 0xCA67, 0x3C17, 0xCA68, 0xCA68, 0x0AFE, 0xCA69, 0xCA7C, 0x3C1D,

+    0xCA7D, 0xCA7D, 0x0AFF, 0xCA7E, 0xCA83, 0x3C31, 0xCA84, 0xCA84, 0x0B00,

+    0xCA85, 0xCA97, 0x3C37, 0xCA98, 0xCA98, 0x0B01, 0xCA99, 0xCABB, 0x3C4A,

+    0xCABC, 0xCABD, 0x0B02, 0xCABE, 0xCABF, 0x3C6D, 0xCAC0, 0xCAC0, 0x0B04,

+    0xCAC1, 0xCAC3, 0x3C6F, 0xCAC4, 0xCAC4, 0x0B05, 0xCAC5, 0xCACB, 0x3C72,

+    0xCACC, 0xCACD, 0x0B06, 0xCACE, 0xCACE, 0x3C79, 0xCACF, 0xCACF, 0x0B08,

+    0xCAD0, 0xCAD0, 0x3C7A, 0xCAD1, 0xCAD1, 0x0B09, 0xCAD2, 0xCAD2, 0x3C7B,

+    0xCAD3, 0xCAD3, 0x0B0A, 0xCAD4, 0xCAD7, 0x3C7C, 0xCAD8, 0xCAD9, 0x0B0B,

+    0xCADA, 0xCADF, 0x3C80, 0xCAE0, 0xCAE0, 0x0B0D, 0xCAE1, 0xCAEB, 0x3C86,

+    0xCAEC, 0xCAEC, 0x0B0E, 0xCAED, 0xCAF3, 0x3C91, 0xCAF4, 0xCAF4, 0x0B0F,

+    0xCAF5, 0xCAFF, 0x3C98, 0xCB00, 0xCB07, 0x3CA3, 0xCB08, 0xCB08, 0x0B10,

+    0xCB09, 0xCB0F, 0x3CAB, 0xCB10, 0xCB10, 0x0B11, 0xCB11, 0xCB13, 0x3CB2,

+    0xCB14, 0xCB14, 0x0B12, 0xCB15, 0xCB17, 0x3CB5, 0xCB18, 0xCB18, 0x0B13,

+    0xCB19, 0xCB1F, 0x3CB8, 0xCB20, 0xCB21, 0x0B14, 0xCB22, 0xCB40, 0x3CBF,

+    0xCB41, 0xCB41, 0x0B16, 0xCB42, 0xCB47, 0x3CDE, 0xCB48, 0xCB49, 0x0B17,

+    0xCB4A, 0xCB4B, 0x3CE4, 0xCB4C, 0xCB4C, 0x0B19, 0xCB4D, 0xCB4F, 0x3CE6,

+    0xCB50, 0xCB50, 0x0B1A, 0xCB51, 0xCB57, 0x3CE9, 0xCB58, 0xCB59, 0x0B1B,

+    0xCB5A, 0xCB5C, 0x3CF0, 0xCB5D, 0xCB5D, 0x0B1D, 0xCB5E, 0xCB63, 0x3CF3,

+    0xCB64, 0xCB64, 0x0B1E, 0xCB65, 0xCB77, 0x3CF9, 0xCB78, 0xCB79, 0x0B1F,

+    0xCB7A, 0xCB9B, 0x3D0C, 0xCB9C, 0xCB9C, 0x0B21, 0xCB9D, 0xCBB7, 0x3D2E,

+    0xCBB8, 0xCBB8, 0x0B22, 0xCBB9, 0xCBD3, 0x3D49, 0xCBD4, 0xCBD4, 0x0B23,

+    0xCBD5, 0xCBE3, 0x3D64, 0xCBE4, 0xCBE4, 0x0B24, 0xCBE5, 0xCBE6, 0x3D73,

+    0xCBE7, 0xCBE7, 0x0B25, 0xCBE8, 0xCBE8, 0x3D75, 0xCBE9, 0xCBE9, 0x0B26,

+    0xCBEA, 0xCBFF, 0x3D76, 0xCC00, 0xCC0B, 0x3D8C, 0xCC0C, 0xCC0D, 0x0B27,

+    0xCC0E, 0xCC0F, 0x3D98, 0xCC10, 0xCC10, 0x0B29, 0xCC11, 0xCC13, 0x3D9A,

+    0xCC14, 0xCC14, 0x0B2A, 0xCC15, 0xCC1B, 0x3D9D, 0xCC1C, 0xCC1D, 0x0B2B,

+    0xCC1E, 0xCC20, 0x3DA4, 0xCC21, 0xCC22, 0x0B2D, 0xCC23, 0xCC26, 0x3DA7,

+    0xCC27, 0xCC29, 0x0B2F, 0xCC2A, 0xCC2B, 0x3DAB, 0xCC2C, 0xCC2C, 0x0B32,

+    0xCC2D, 0xCC2D, 0x3DAD, 0xCC2E, 0xCC2E, 0x0B33, 0xCC2F, 0xCC2F, 0x3DAE,

+    0xCC30, 0xCC30, 0x0B34, 0xCC31, 0xCC37, 0x3DAF, 0xCC38, 0xCC39, 0x0B35,

+    0xCC3A, 0xCC3A, 0x3DB6, 0xCC3B, 0xCC3E, 0x0B37, 0xCC3F, 0xCC43, 0x3DB7,

+    0xCC44, 0xCC45, 0x0B3B, 0xCC46, 0xCC47, 0x3DBC, 0xCC48, 0xCC48, 0x0B3D,

+    0xCC49, 0xCC4B, 0x3DBE, 0xCC4C, 0xCC4C, 0x0B3E, 0xCC4D, 0xCC53, 0x3DC1,

+    0xCC54, 0xCC55, 0x0B3F, 0xCC56, 0xCC56, 0x3DC8, 0xCC57, 0xCC59, 0x0B41,

+    0xCC5A, 0xCC5F, 0x3DC9, 0xCC60, 0xCC60, 0x0B44, 0xCC61, 0xCC63, 0x3DCF,

+    0xCC64, 0xCC64, 0x0B45, 0xCC65, 0xCC65, 0x3DD2, 0xCC66, 0xCC66, 0x0B46,

+    0xCC67, 0xCC67, 0x3DD3, 0xCC68, 0xCC68, 0x0B47, 0xCC69, 0xCC6F, 0x3DD4,

+    0xCC70, 0xCC70, 0x0B48, 0xCC71, 0xCC74, 0x3DDB, 0xCC75, 0xCC75, 0x0B49,

+    0xCC76, 0xCC97, 0x3DDF, 0xCC98, 0xCC99, 0x0B4A, 0xCC9A, 0xCC9B, 0x3E01,

+    0xCC9C, 0xCC9C, 0x0B4C, 0xCC9D, 0xCC9F, 0x3E03, 0xCCA0, 0xCCA0, 0x0B4D,

+    0xCCA1, 0xCCA7, 0x3E06, 0xCCA8, 0xCCA9, 0x0B4E, 0xCCAA, 0xCCAA, 0x3E0D,

+    0xCCAB, 0xCCAD, 0x0B50, 0xCCAE, 0xCCB3, 0x3E0E, 0xCCB4, 0xCCB5, 0x0B53,

+    0xCCB6, 0xCCB7, 0x3E14, 0xCCB8, 0xCCB8, 0x0B55, 0xCCB9, 0xCCBB, 0x3E16,

+    0xCCBC, 0xCCBC, 0x0B56, 0xCCBD, 0xCCC3, 0x3E19, 0xCCC4, 0xCCC5, 0x0B57,

+    0xCCC6, 0xCCC6, 0x3E20, 0xCCC7, 0xCCC7, 0x0B59, 0xCCC8, 0xCCC8, 0x3E21,

+    0xCCC9, 0xCCC9, 0x0B5A, 0xCCCA, 0xCCCF, 0x3E22, 0xCCD0, 0xCCD0, 0x0B5B,

+    0xCCD1, 0xCCD3, 0x3E28, 0xCCD4, 0xCCD4, 0x0B5C, 0xCCD5, 0xCCE3, 0x3E2B,

+    0xCCE4, 0xCCE4, 0x0B5D, 0xCCE5, 0xCCEB, 0x3E3A, 0xCCEC, 0xCCEC, 0x0B5E,

+    0xCCED, 0xCCEF, 0x3E41, 0xCCF0, 0xCCF0, 0x0B5F, 0xCCF1, 0xCCFF, 0x3E44,

+    0xCD00, 0xCD00, 0x3E53, 0xCD01, 0xCD01, 0x0B60, 0xCD02, 0xCD07, 0x3E54,

+    0xCD08, 0xCD09, 0x0B61, 0xCD0A, 0xCD0B, 0x3E5A, 0xCD0C, 0xCD0C, 0x0B63,

+    0xCD0D, 0xCD0F, 0x3E5C, 0xCD10, 0xCD10, 0x0B64, 0xCD11, 0xCD17, 0x3E5F,

+    0xCD18, 0xCD19, 0x0B65, 0xCD1A, 0xCD1A, 0x3E66, 0xCD1B, 0xCD1B, 0x0B67,

+    0xCD1C, 0xCD1C, 0x3E67, 0xCD1D, 0xCD1D, 0x0B68, 0xCD1E, 0xCD23, 0x3E68,

+    0xCD24, 0xCD24, 0x0B69, 0xCD25, 0xCD27, 0x3E6E, 0xCD28, 0xCD28, 0x0B6A,

+    0xCD29, 0xCD2B, 0x3E71, 0xCD2C, 0xCD2C, 0x0B6B, 0xCD2D, 0xCD38, 0x3E74,

+    0xCD39, 0xCD39, 0x0B6C, 0xCD3A, 0xCD5B, 0x3E80, 0xCD5C, 0xCD5C, 0x0B6D,

+    0xCD5D, 0xCD5F, 0x3EA2, 0xCD60, 0xCD60, 0x0B6E, 0xCD61, 0xCD63, 0x3EA5,

+    0xCD64, 0xCD64, 0x0B6F, 0xCD65, 0xCD6B, 0x3EA8, 0xCD6C, 0xCD6D, 0x0B70,

+    0xCD6E, 0xCD6E, 0x3EAF, 0xCD6F, 0xCD6F, 0x0B72, 0xCD70, 0xCD70, 0x3EB0,

+    0xCD71, 0xCD71, 0x0B73, 0xCD72, 0xCD77, 0x3EB1, 0xCD78, 0xCD78, 0x0B74,

+    0xCD79, 0xCD87, 0x3EB7, 0xCD88, 0xCD88, 0x0B75, 0xCD89, 0xCD93, 0x3EC6,

+    0xCD94, 0xCD95, 0x0B76, 0xCD96, 0xCD97, 0x3ED1, 0xCD98, 0xCD98, 0x0B78,

+    0xCD99, 0xCD9B, 0x3ED3, 0xCD9C, 0xCD9C, 0x0B79, 0xCD9D, 0xCDA3, 0x3ED6,

+    0xCDA4, 0xCDA5, 0x0B7A, 0xCDA6, 0xCDA6, 0x3EDD, 0xCDA7, 0xCDA7, 0x0B7C,

+    0xCDA8, 0xCDA8, 0x3EDE, 0xCDA9, 0xCDA9, 0x0B7D, 0xCDAA, 0xCDAF, 0x3EDF,

+    0xCDB0, 0xCDB0, 0x0B7E, 0xCDB1, 0xCDC3, 0x3EE5, 0xCDC4, 0xCDC4, 0x0B7F,

+    0xCDC5, 0xCDCB, 0x3EF8, 0xCDCC, 0xCDCC, 0x0B80, 0xCDCD, 0xCDCF, 0x3EFF,

+    0xCDD0, 0xCDD0, 0x0B81, 0xCDD1, 0xCDE7, 0x3F02, 0xCDE8, 0xCDE8, 0x0B82,

+    0xCDE9, 0xCDEB, 0x3F19, 0xCDEC, 0xCDEC, 0x0B83, 0xCDED, 0xCDEF, 0x3F1C,

+    0xCDF0, 0xCDF0, 0x0B84, 0xCDF1, 0xCDF7, 0x3F1F, 0xCDF8, 0xCDF9, 0x0B85,

+    0xCDFA, 0xCDFA, 0x3F26, 0xCDFB, 0xCDFB, 0x0B87, 0xCDFC, 0xCDFC, 0x3F27,

+    0xCDFD, 0xCDFD, 0x0B88, 0xCDFE, 0xCDFF, 0x3F28, 0xCE00, 0xCE03, 0x3F2A,

+    0xCE04, 0xCE04, 0x0B89, 0xCE05, 0xCE07, 0x3F2E, 0xCE08, 0xCE08, 0x0B8A,

+    0xCE09, 0xCE0B, 0x3F31, 0xCE0C, 0xCE0C, 0x0B8B, 0xCE0D, 0xCE13, 0x3F34,

+    0xCE14, 0xCE14, 0x0B8C, 0xCE15, 0xCE18, 0x3F3B, 0xCE19, 0xCE19, 0x0B8D,

+    0xCE1A, 0xCE1F, 0x3F3F, 0xCE20, 0xCE21, 0x0B8E, 0xCE22, 0xCE23, 0x3F45,

+    0xCE24, 0xCE24, 0x0B90, 0xCE25, 0xCE27, 0x3F47, 0xCE28, 0xCE28, 0x0B91,

+    0xCE29, 0xCE2F, 0x3F4A, 0xCE30, 0xCE31, 0x0B92, 0xCE32, 0xCE32, 0x3F51,

+    0xCE33, 0xCE33, 0x0B94, 0xCE34, 0xCE34, 0x3F52, 0xCE35, 0xCE35, 0x0B95,

+    0xCE36, 0xCE57, 0x3F53, 0xCE58, 0xCE59, 0x0B96, 0xCE5A, 0xCE5B, 0x3F75,

+    0xCE5C, 0xCE5C, 0x0B98, 0xCE5D, 0xCE5E, 0x3F77, 0xCE5F, 0xCE61, 0x0B99,

+    0xCE62, 0xCE67, 0x3F79, 0xCE68, 0xCE69, 0x0B9C, 0xCE6A, 0xCE6A, 0x3F7F,

+    0xCE6B, 0xCE6B, 0x0B9E, 0xCE6C, 0xCE6C, 0x3F80, 0xCE6D, 0xCE6D, 0x0B9F,

+    0xCE6E, 0xCE73, 0x3F81, 0xCE74, 0xCE75, 0x0BA0, 0xCE76, 0xCE77, 0x3F87,

+    0xCE78, 0xCE78, 0x0BA2, 0xCE79, 0xCE7B, 0x3F89, 0xCE7C, 0xCE7C, 0x0BA3,

+    0xCE7D, 0xCE83, 0x3F8C, 0xCE84, 0xCE85, 0x0BA4, 0xCE86, 0xCE86, 0x3F93,

+    0xCE87, 0xCE87, 0x0BA6, 0xCE88, 0xCE88, 0x3F94, 0xCE89, 0xCE89, 0x0BA7,

+    0xCE8A, 0xCE8F, 0x3F95, 0xCE90, 0xCE91, 0x0BA8, 0xCE92, 0xCE93, 0x3F9B,

+    0xCE94, 0xCE94, 0x0BAA, 0xCE95, 0xCE97, 0x3F9D, 0xCE98, 0xCE98, 0x0BAB,

+    0xCE99, 0xCE9F, 0x3FA0, 0xCEA0, 0xCEA1, 0x0BAC, 0xCEA2, 0xCEA2, 0x3FA7,

+    0xCEA3, 0xCEA5, 0x0BAE, 0xCEA6, 0xCEAB, 0x3FA8, 0xCEAC, 0xCEAD, 0x0BB1,

+    0xCEAE, 0xCEC0, 0x3FAE, 0xCEC1, 0xCEC1, 0x0BB3, 0xCEC2, 0xCEE3, 0x3FC1,

+    0xCEE4, 0xCEE5, 0x0BB4, 0xCEE6, 0xCEE7, 0x3FE3, 0xCEE8, 0xCEE8, 0x0BB6,

+    0xCEE9, 0xCEEA, 0x3FE5, 0xCEEB, 0xCEEC, 0x0BB7, 0xCEED, 0xCEF3, 0x3FE7,

+    0xCEF4, 0xCEF5, 0x0BB9, 0xCEF6, 0xCEF6, 0x3FEE, 0xCEF7, 0xCEF9, 0x0BBB,

+    0xCEFA, 0xCEFF, 0x3FEF, 0xCF00, 0xCF01, 0x0BBE, 0xCF02, 0xCF03, 0x3FF5,

+    0xCF04, 0xCF04, 0x0BC0, 0xCF05, 0xCF07, 0x3FF7, 0xCF08, 0xCF08, 0x0BC1,

+    0xCF09, 0xCF0F, 0x3FFA, 0xCF10, 0xCF11, 0x0BC2, 0xCF12, 0xCF12, 0x4001,

+    0xCF13, 0xCF13, 0x0BC4, 0xCF14, 0xCF14, 0x4002, 0xCF15, 0xCF15, 0x0BC5,

+    0xCF16, 0xCF1B, 0x4003, 0xCF1C, 0xCF1C, 0x0BC6, 0xCF1D, 0xCF1F, 0x4009,

+    0xCF20, 0xCF20, 0x0BC7, 0xCF21, 0xCF23, 0x400C, 0xCF24, 0xCF24, 0x0BC8,

+    0xCF25, 0xCF2B, 0x400F, 0xCF2C, 0xCF2D, 0x0BC9, 0xCF2E, 0xCF2E, 0x4016,

+    0xCF2F, 0xCF31, 0x0BCB, 0xCF32, 0xCF37, 0x4017, 0xCF38, 0xCF38, 0x0BCE,

+    0xCF39, 0xCF53, 0x401D, 0xCF54, 0xCF55, 0x0BCF, 0xCF56, 0xCF57, 0x4038,

+    0xCF58, 0xCF58, 0x0BD1, 0xCF59, 0xCF5B, 0x403A, 0xCF5C, 0xCF5C, 0x0BD2,

+    0xCF5D, 0xCF63, 0x403D, 0xCF64, 0xCF65, 0x0BD3, 0xCF66, 0xCF66, 0x4044,

+    0xCF67, 0xCF67, 0x0BD5, 0xCF68, 0xCF68, 0x4045, 0xCF69, 0xCF69, 0x0BD6,

+    0xCF6A, 0xCF6F, 0x4046, 0xCF70, 0xCF71, 0x0BD7, 0xCF72, 0xCF73, 0x404C,

+    0xCF74, 0xCF74, 0x0BD9, 0xCF75, 0xCF77, 0x404E, 0xCF78, 0xCF78, 0x0BDA,

+    0xCF79, 0xCF7F, 0x4051, 0xCF80, 0xCF80, 0x0BDB, 0xCF81, 0xCF84, 0x4058,

+    0xCF85, 0xCF85, 0x0BDC, 0xCF86, 0xCF8B, 0x405C, 0xCF8C, 0xCF8C, 0x0BDD,

+    0xCF8D, 0xCFA0, 0x4062, 0xCFA1, 0xCFA1, 0x0BDE, 0xCFA2, 0xCFA7, 0x4076,

+    0xCFA8, 0xCFA8, 0x0BDF, 0xCFA9, 0xCFAF, 0x407C, 0xCFB0, 0xCFB0, 0x0BE0,

+    0xCFB1, 0xCFC3, 0x4083, 0xCFC4, 0xCFC4, 0x0BE1, 0xCFC5, 0xCFDF, 0x4096,

+    0xCFE0, 0xCFE1, 0x0BE2, 0xCFE2, 0xCFE3, 0x40B1, 0xCFE4, 0xCFE4, 0x0BE4,

+    0xCFE5, 0xCFE7, 0x40B3, 0xCFE8, 0xCFE8, 0x0BE5, 0xCFE9, 0xCFEF, 0x40B6,

+    0xCFF0, 0xCFF1, 0x0BE6, 0xCFF2, 0xCFF2, 0x40BD, 0xCFF3, 0xCFF3, 0x0BE8,

+    0xCFF4, 0xCFF4, 0x40BE, 0xCFF5, 0xCFF5, 0x0BE9, 0xCFF6, 0xCFFB, 0x40BF,

+    0xCFFC, 0xCFFC, 0x0BEA, 0xCFFD, 0xCFFF, 0x40C5, 0xD000, 0xD000, 0x0BEB,

+    0xD001, 0xD003, 0x40C8, 0xD004, 0xD004, 0x0BEC, 0xD005, 0xD010, 0x40CB,

+    0xD011, 0xD011, 0x0BED, 0xD012, 0xD017, 0x40D7, 0xD018, 0xD018, 0x0BEE,

+    0xD019, 0xD02C, 0x40DD, 0xD02D, 0xD02D, 0x0BEF, 0xD02E, 0xD033, 0x40F1,

+    0xD034, 0xD035, 0x0BF0, 0xD036, 0xD037, 0x40F7, 0xD038, 0xD038, 0x0BF2,

+    0xD039, 0xD03B, 0x40F9, 0xD03C, 0xD03C, 0x0BF3, 0xD03D, 0xD043, 0x40FC,

+    0xD044, 0xD045, 0x0BF4, 0xD046, 0xD046, 0x4103, 0xD047, 0xD047, 0x0BF6,

+    0xD048, 0xD048, 0x4104, 0xD049, 0xD049, 0x0BF7, 0xD04A, 0xD04F, 0x4105,

+    0xD050, 0xD050, 0x0BF8, 0xD051, 0xD053, 0x410B, 0xD054, 0xD054, 0x0BF9,

+    0xD055, 0xD057, 0x410E, 0xD058, 0xD058, 0x0BFA, 0xD059, 0xD05F, 0x4111,

+    0xD060, 0xD060, 0x0BFB, 0xD061, 0xD06B, 0x4118, 0xD06C, 0xD06D, 0x0BFC,

+    0xD06E, 0xD06F, 0x4123, 0xD070, 0xD070, 0x0BFE, 0xD071, 0xD073, 0x4125,

+    0xD074, 0xD074, 0x0BFF, 0xD075, 0xD07B, 0x4128, 0xD07C, 0xD07D, 0x0C00,

+    0xD07E, 0xD080, 0x412F, 0xD081, 0xD081, 0x0C02, 0xD082, 0xD0A3, 0x4132,

+    0xD0A4, 0xD0A5, 0x0C03, 0xD0A6, 0xD0A7, 0x4154, 0xD0A8, 0xD0A8, 0x0C05,

+    0xD0A9, 0xD0AB, 0x4156, 0xD0AC, 0xD0AC, 0x0C06, 0xD0AD, 0xD0B3, 0x4159,

+    0xD0B4, 0xD0B5, 0x0C07, 0xD0B6, 0xD0B6, 0x4160, 0xD0B7, 0xD0B7, 0x0C09,

+    0xD0B8, 0xD0B8, 0x4161, 0xD0B9, 0xD0B9, 0x0C0A, 0xD0BA, 0xD0BF, 0x4162,

+    0xD0C0, 0xD0C1, 0x0C0B, 0xD0C2, 0xD0C3, 0x4168, 0xD0C4, 0xD0C4, 0x0C0D,

+    0xD0C5, 0xD0C7, 0x416A, 0xD0C8, 0xD0C9, 0x0C0E, 0xD0CA, 0xD0CF, 0x416D,

+    0xD0D0, 0xD0D1, 0x0C10, 0xD0D2, 0xD0D2, 0x4173, 0xD0D3, 0xD0D5, 0x0C12,

+    0xD0D6, 0xD0DB, 0x4174, 0xD0DC, 0xD0DD, 0x0C15, 0xD0DE, 0xD0DF, 0x417A,

+    0xD0E0, 0xD0E0, 0x0C17, 0xD0E1, 0xD0E3, 0x417C, 0xD0E4, 0xD0E4, 0x0C18,

+    0xD0E5, 0xD0EB, 0x417F, 0xD0EC, 0xD0ED, 0x0C19, 0xD0EE, 0xD0EE, 0x4186,

+    0xD0EF, 0xD0F1, 0x0C1B, 0xD0F2, 0xD0F7, 0x4187, 0xD0F8, 0xD0F8, 0x0C1E,

+    0xD0F9, 0xD0FF, 0x418D, 0xD100, 0xD10C, 0x4194, 0xD10D, 0xD10D, 0x0C1F,

+    0xD10E, 0xD12F, 0x41A1, 0xD130, 0xD131, 0x0C20, 0xD132, 0xD133, 0x41C3,

+    0xD134, 0xD134, 0x0C22, 0xD135, 0xD137, 0x41C5, 0xD138, 0xD138, 0x0C23,

+    0xD139, 0xD139, 0x41C8, 0xD13A, 0xD13A, 0x0C24, 0xD13B, 0xD13F, 0x41C9,

+    0xD140, 0xD141, 0x0C25, 0xD142, 0xD142, 0x41CE, 0xD143, 0xD145, 0x0C27,

+    0xD146, 0xD14B, 0x41CF, 0xD14C, 0xD14D, 0x0C2A, 0xD14E, 0xD14F, 0x41D5,

+    0xD150, 0xD150, 0x0C2C, 0xD151, 0xD153, 0x41D7, 0xD154, 0xD154, 0x0C2D,

+    0xD155, 0xD15B, 0x41DA, 0xD15C, 0xD15D, 0x0C2E, 0xD15E, 0xD15E, 0x41E1,

+    0xD15F, 0xD15F, 0x0C30, 0xD160, 0xD160, 0x41E2, 0xD161, 0xD161, 0x0C31,

+    0xD162, 0xD167, 0x41E3, 0xD168, 0xD168, 0x0C32, 0xD169, 0xD16B, 0x41E9,

+    0xD16C, 0xD16C, 0x0C33, 0xD16D, 0xD17B, 0x41EC, 0xD17C, 0xD17C, 0x0C34,

+    0xD17D, 0xD183, 0x41FB, 0xD184, 0xD184, 0x0C35, 0xD185, 0xD187, 0x4202,

+    0xD188, 0xD188, 0x0C36, 0xD189, 0xD19F, 0x4205, 0xD1A0, 0xD1A1, 0x0C37,

+    0xD1A2, 0xD1A3, 0x421C, 0xD1A4, 0xD1A4, 0x0C39, 0xD1A5, 0xD1A7, 0x421E,

+    0xD1A8, 0xD1A8, 0x0C3A, 0xD1A9, 0xD1AF, 0x4221, 0xD1B0, 0xD1B1, 0x0C3B,

+    0xD1B2, 0xD1B2, 0x4228, 0xD1B3, 0xD1B3, 0x0C3D, 0xD1B4, 0xD1B4, 0x4229,

+    0xD1B5, 0xD1B5, 0x0C3E, 0xD1B6, 0xD1B9, 0x422A, 0xD1BA, 0xD1BA, 0x0C3F,

+    0xD1BB, 0xD1BB, 0x422E, 0xD1BC, 0xD1BC, 0x0C40, 0xD1BD, 0xD1BF, 0x422F,

+    0xD1C0, 0xD1C0, 0x0C41, 0xD1C1, 0xD1D7, 0x4232, 0xD1D8, 0xD1D8, 0x0C42,

+    0xD1D9, 0xD1F3, 0x4249, 0xD1F4, 0xD1F4, 0x0C43, 0xD1F5, 0xD1F7, 0x4264,

+    0xD1F8, 0xD1F8, 0x0C44, 0xD1F9, 0xD1FF, 0x4267, 0xD200, 0xD206, 0x426E,

+    0xD207, 0xD207, 0x0C45, 0xD208, 0xD208, 0x4275, 0xD209, 0xD209, 0x0C46,

+    0xD20A, 0xD20F, 0x4276, 0xD210, 0xD210, 0x0C47, 0xD211, 0xD22B, 0x427C,

+    0xD22C, 0xD22D, 0x0C48, 0xD22E, 0xD22F, 0x4297, 0xD230, 0xD230, 0x0C4A,

+    0xD231, 0xD233, 0x4299, 0xD234, 0xD234, 0x0C4B, 0xD235, 0xD23B, 0x429C,

+    0xD23C, 0xD23D, 0x0C4C, 0xD23E, 0xD23E, 0x42A3, 0xD23F, 0xD23F, 0x0C4E,

+    0xD240, 0xD240, 0x42A4, 0xD241, 0xD241, 0x0C4F, 0xD242, 0xD247, 0x42A5,

+    0xD248, 0xD248, 0x0C50, 0xD249, 0xD25B, 0x42AB, 0xD25C, 0xD25C, 0x0C51,

+    0xD25D, 0xD263, 0x42BE, 0xD264, 0xD264, 0x0C52, 0xD265, 0xD27F, 0x42C5,

+    0xD280, 0xD281, 0x0C53, 0xD282, 0xD283, 0x42E0, 0xD284, 0xD284, 0x0C55,

+    0xD285, 0xD287, 0x42E2, 0xD288, 0xD288, 0x0C56, 0xD289, 0xD28F, 0x42E5,

+    0xD290, 0xD291, 0x0C57, 0xD292, 0xD294, 0x42EC, 0xD295, 0xD295, 0x0C59,

+    0xD296, 0xD29B, 0x42EF, 0xD29C, 0xD29C, 0x0C5A, 0xD29D, 0xD29F, 0x42F5,

+    0xD2A0, 0xD2A0, 0x0C5B, 0xD2A1, 0xD2A3, 0x42F8, 0xD2A4, 0xD2A4, 0x0C5C,

+    0xD2A5, 0xD2AB, 0x42FB, 0xD2AC, 0xD2AC, 0x0C5D, 0xD2AD, 0xD2B0, 0x4302,

+    0xD2B1, 0xD2B1, 0x0C5E, 0xD2B2, 0xD2B7, 0x4306, 0xD2B8, 0xD2B9, 0x0C5F,

+    0xD2BA, 0xD2BB, 0x430C, 0xD2BC, 0xD2BC, 0x0C61, 0xD2BD, 0xD2BE, 0x430E,

+    0xD2BF, 0xD2C0, 0x0C62, 0xD2C1, 0xD2C1, 0x4310, 0xD2C2, 0xD2C2, 0x0C64,

+    0xD2C3, 0xD2C7, 0x4311, 0xD2C8, 0xD2C9, 0x0C65, 0xD2CA, 0xD2CA, 0x4316,

+    0xD2CB, 0xD2CB, 0x0C67, 0xD2CC, 0xD2D3, 0x4317, 0xD2D4, 0xD2D4, 0x0C68,

+    0xD2D5, 0xD2D7, 0x431F, 0xD2D8, 0xD2D8, 0x0C69, 0xD2D9, 0xD2DB, 0x4322,

+    0xD2DC, 0xD2DC, 0x0C6A, 0xD2DD, 0xD2E3, 0x4325, 0xD2E4, 0xD2E5, 0x0C6B,

+    0xD2E6, 0xD2EF, 0x432C, 0xD2F0, 0xD2F1, 0x0C6D, 0xD2F2, 0xD2F3, 0x4336,

+    0xD2F4, 0xD2F4, 0x0C6F, 0xD2F5, 0xD2F7, 0x4338, 0xD2F8, 0xD2F8, 0x0C70,

+    0xD2F9, 0xD2FF, 0x433B, 0xD300, 0xD301, 0x0C71, 0xD302, 0xD302, 0x4342,

+    0xD303, 0xD303, 0x0C73, 0xD304, 0xD304, 0x4343, 0xD305, 0xD305, 0x0C74,

+    0xD306, 0xD30B, 0x4344, 0xD30C, 0xD30E, 0x0C75, 0xD30F, 0xD30F, 0x434A,

+    0xD310, 0xD310, 0x0C78, 0xD311, 0xD313, 0x434B, 0xD314, 0xD314, 0x0C79,

+    0xD315, 0xD315, 0x434E, 0xD316, 0xD316, 0x0C7A, 0xD317, 0xD31B, 0x434F,

+    0xD31C, 0xD31D, 0x0C7B, 0xD31E, 0xD31E, 0x4354, 0xD31F, 0xD321, 0x0C7D,

+    0xD322, 0xD324, 0x4355, 0xD325, 0xD325, 0x0C80, 0xD326, 0xD327, 0x4358,

+    0xD328, 0xD329, 0x0C81, 0xD32A, 0xD32B, 0x435A, 0xD32C, 0xD32C, 0x0C83,

+    0xD32D, 0xD32F, 0x435C, 0xD330, 0xD330, 0x0C84, 0xD331, 0xD337, 0x435F,

+    0xD338, 0xD339, 0x0C85, 0xD33A, 0xD33A, 0x4366, 0xD33B, 0xD33D, 0x0C87,

+    0xD33E, 0xD343, 0x4367, 0xD344, 0xD345, 0x0C8A, 0xD346, 0xD37B, 0x436D,

+    0xD37C, 0xD37D, 0x0C8C, 0xD37E, 0xD37F, 0x43A3, 0xD380, 0xD380, 0x0C8E,

+    0xD381, 0xD383, 0x43A5, 0xD384, 0xD384, 0x0C8F, 0xD385, 0xD38B, 0x43A8,

+    0xD38C, 0xD38D, 0x0C90, 0xD38E, 0xD38E, 0x43AF, 0xD38F, 0xD391, 0x0C92,

+    0xD392, 0xD397, 0x43B0, 0xD398, 0xD399, 0x0C95, 0xD39A, 0xD39B, 0x43B6,

+    0xD39C, 0xD39C, 0x0C97, 0xD39D, 0xD39F, 0x43B8, 0xD3A0, 0xD3A0, 0x0C98,

+    0xD3A1, 0xD3A7, 0x43BB, 0xD3A8, 0xD3A9, 0x0C99, 0xD3AA, 0xD3AA, 0x43C2,

+    0xD3AB, 0xD3AB, 0x0C9B, 0xD3AC, 0xD3AC, 0x43C3, 0xD3AD, 0xD3AD, 0x0C9C,

+    0xD3AE, 0xD3B3, 0x43C4, 0xD3B4, 0xD3B4, 0x0C9D, 0xD3B5, 0xD3B7, 0x43CA,

+    0xD3B8, 0xD3B8, 0x0C9E, 0xD3B9, 0xD3BB, 0x43CD, 0xD3BC, 0xD3BC, 0x0C9F,

+    0xD3BD, 0xD3C3, 0x43D0, 0xD3C4, 0xD3C5, 0x0CA0, 0xD3C6, 0xD3C7, 0x43D7,

+    0xD3C8, 0xD3C9, 0x0CA2, 0xD3CA, 0xD3CF, 0x43D9, 0xD3D0, 0xD3D0, 0x0CA4,

+    0xD3D1, 0xD3D7, 0x43DF, 0xD3D8, 0xD3D8, 0x0CA5, 0xD3D9, 0xD3E0, 0x43E6,

+    0xD3E1, 0xD3E1, 0x0CA6, 0xD3E2, 0xD3E2, 0x43EE, 0xD3E3, 0xD3E3, 0x0CA7,

+    0xD3E4, 0xD3EB, 0x43EF, 0xD3EC, 0xD3ED, 0x0CA8, 0xD3EE, 0xD3EF, 0x43F7,

+    0xD3F0, 0xD3F0, 0x0CAA, 0xD3F1, 0xD3F3, 0x43F9, 0xD3F4, 0xD3F4, 0x0CAB,

+    0xD3F5, 0xD3FB, 0x43FC, 0xD3FC, 0xD3FD, 0x0CAC, 0xD3FE, 0xD3FE, 0x4403,

+    0xD3FF, 0xD3FF, 0x0CAE, 0xD400, 0xD400, 0x4404, 0xD401, 0xD401, 0x0CAF,

+    0xD402, 0xD407, 0x4405, 0xD408, 0xD408, 0x0CB0, 0xD409, 0xD41C, 0x440B,

+    0xD41D, 0xD41D, 0x0CB1, 0xD41E, 0xD43F, 0x441F, 0xD440, 0xD440, 0x0CB2,

+    0xD441, 0xD443, 0x4441, 0xD444, 0xD444, 0x0CB3, 0xD445, 0xD45B, 0x4444,

+    0xD45C, 0xD45C, 0x0CB4, 0xD45D, 0xD45F, 0x445B, 0xD460, 0xD460, 0x0CB5,

+    0xD461, 0xD463, 0x445E, 0xD464, 0xD464, 0x0CB6, 0xD465, 0xD46C, 0x4461,

+    0xD46D, 0xD46D, 0x0CB7, 0xD46E, 0xD46E, 0x4469, 0xD46F, 0xD46F, 0x0CB8,

+    0xD470, 0xD477, 0x446A, 0xD478, 0xD479, 0x0CB9, 0xD47A, 0xD47B, 0x4472,

+    0xD47C, 0xD47C, 0x0CBB, 0xD47D, 0xD47E, 0x4474, 0xD47F, 0xD480, 0x0CBC,

+    0xD481, 0xD481, 0x4476, 0xD482, 0xD482, 0x0CBE, 0xD483, 0xD487, 0x4477,

+    0xD488, 0xD489, 0x0CBF, 0xD48A, 0xD48A, 0x447C, 0xD48B, 0xD48B, 0x0CC1,

+    0xD48C, 0xD48C, 0x447D, 0xD48D, 0xD48D, 0x0CC2, 0xD48E, 0xD493, 0x447E,

+    0xD494, 0xD494, 0x0CC3, 0xD495, 0xD4A8, 0x4484, 0xD4A9, 0xD4A9, 0x0CC4,

+    0xD4AA, 0xD4CB, 0x4498, 0xD4CC, 0xD4CC, 0x0CC5, 0xD4CD, 0xD4CF, 0x44BA,

+    0xD4D0, 0xD4D0, 0x0CC6, 0xD4D1, 0xD4D3, 0x44BD, 0xD4D4, 0xD4D4, 0x0CC7,

+    0xD4D5, 0xD4DB, 0x44C0, 0xD4DC, 0xD4DC, 0x0CC8, 0xD4DD, 0xD4DE, 0x44C7,

+    0xD4DF, 0xD4DF, 0x0CC9, 0xD4E0, 0xD4E7, 0x44C9, 0xD4E8, 0xD4E8, 0x0CCA,

+    0xD4E9, 0xD4EB, 0x44D1, 0xD4EC, 0xD4EC, 0x0CCB, 0xD4ED, 0xD4EF, 0x44D4,

+    0xD4F0, 0xD4F0, 0x0CCC, 0xD4F1, 0xD4F7, 0x44D7, 0xD4F8, 0xD4F8, 0x0CCD,

+    0xD4F9, 0xD4FA, 0x44DE, 0xD4FB, 0xD4FB, 0x0CCE, 0xD4FC, 0xD4FC, 0x44E0,

+    0xD4FD, 0xD4FD, 0x0CCF, 0xD4FE, 0xD4FF, 0x44E1, 0xD500, 0xD503, 0x44E3,

+    0xD504, 0xD504, 0x0CD0, 0xD505, 0xD507, 0x44E7, 0xD508, 0xD508, 0x0CD1,

+    0xD509, 0xD50B, 0x44EA, 0xD50C, 0xD50C, 0x0CD2, 0xD50D, 0xD513, 0x44ED,

+    0xD514, 0xD515, 0x0CD3, 0xD516, 0xD516, 0x44F4, 0xD517, 0xD517, 0x0CD5,

+    0xD518, 0xD53B, 0x44F5, 0xD53C, 0xD53D, 0x0CD6, 0xD53E, 0xD53F, 0x4519,

+    0xD540, 0xD540, 0x0CD8, 0xD541, 0xD543, 0x451B, 0xD544, 0xD544, 0x0CD9,

+    0xD545, 0xD54B, 0x451E, 0xD54C, 0xD54D, 0x0CDA, 0xD54E, 0xD54E, 0x4525,

+    0xD54F, 0xD54F, 0x0CDC, 0xD550, 0xD550, 0x4526, 0xD551, 0xD551, 0x0CDD,

+    0xD552, 0xD557, 0x4527, 0xD558, 0xD559, 0x0CDE, 0xD55A, 0xD55B, 0x452D,

+    0xD55C, 0xD55C, 0x0CE0, 0xD55D, 0xD55F, 0x452F, 0xD560, 0xD560, 0x0CE1,

+    0xD561, 0xD564, 0x4532, 0xD565, 0xD565, 0x0CE2, 0xD566, 0xD567, 0x4536,

+    0xD568, 0xD569, 0x0CE3, 0xD56A, 0xD56A, 0x4538, 0xD56B, 0xD56B, 0x0CE5,

+    0xD56C, 0xD56C, 0x4539, 0xD56D, 0xD56D, 0x0CE6, 0xD56E, 0xD573, 0x453A,

+    0xD574, 0xD575, 0x0CE7, 0xD576, 0xD577, 0x4540, 0xD578, 0xD578, 0x0CE9,

+    0xD579, 0xD57B, 0x4542, 0xD57C, 0xD57C, 0x0CEA, 0xD57D, 0xD583, 0x4545,

+    0xD584, 0xD585, 0x0CEB, 0xD586, 0xD586, 0x454C, 0xD587, 0xD589, 0x0CED,

+    0xD58A, 0xD58F, 0x454D, 0xD590, 0xD590, 0x0CF0, 0xD591, 0xD5A4, 0x4553,

+    0xD5A5, 0xD5A5, 0x0CF1, 0xD5A6, 0xD5C7, 0x4567, 0xD5C8, 0xD5C9, 0x0CF2,

+    0xD5CA, 0xD5CB, 0x4589, 0xD5CC, 0xD5CC, 0x0CF4, 0xD5CD, 0xD5CF, 0x458B,

+    0xD5D0, 0xD5D0, 0x0CF5, 0xD5D1, 0xD5D1, 0x458E, 0xD5D2, 0xD5D2, 0x0CF6,

+    0xD5D3, 0xD5D7, 0x458F, 0xD5D8, 0xD5D9, 0x0CF7, 0xD5DA, 0xD5DA, 0x4594,

+    0xD5DB, 0xD5DB, 0x0CF9, 0xD5DC, 0xD5DC, 0x4595, 0xD5DD, 0xD5DD, 0x0CFA,

+    0xD5DE, 0xD5E3, 0x4596, 0xD5E4, 0xD5E5, 0x0CFB, 0xD5E6, 0xD5E7, 0x459C,

+    0xD5E8, 0xD5E8, 0x0CFD, 0xD5E9, 0xD5EB, 0x459E, 0xD5EC, 0xD5EC, 0x0CFE,

+    0xD5ED, 0xD5F3, 0x45A1, 0xD5F4, 0xD5F5, 0x0CFF, 0xD5F6, 0xD5F6, 0x45A8,

+    0xD5F7, 0xD5F7, 0x0D01, 0xD5F8, 0xD5F8, 0x45A9, 0xD5F9, 0xD5F9, 0x0D02,

+    0xD5FA, 0xD5FF, 0x45AA, 0xD600, 0xD601, 0x0D03, 0xD602, 0xD603, 0x45B0,

+    0xD604, 0xD604, 0x0D05, 0xD605, 0xD607, 0x45B2, 0xD608, 0xD608, 0x0D06,

+    0xD609, 0xD60F, 0x45B5, 0xD610, 0xD611, 0x0D07, 0xD612, 0xD612, 0x45BC,

+    0xD613, 0xD615, 0x0D09, 0xD616, 0xD61B, 0x45BD, 0xD61C, 0xD61C, 0x0D0C,

+    0xD61D, 0xD61F, 0x45C3, 0xD620, 0xD620, 0x0D0D, 0xD621, 0xD623, 0x45C6,

+    0xD624, 0xD624, 0x0D0E, 0xD625, 0xD62C, 0x45C9, 0xD62D, 0xD62D, 0x0D0F,

+    0xD62E, 0xD637, 0x45D1, 0xD638, 0xD639, 0x0D10, 0xD63A, 0xD63B, 0x45DB,

+    0xD63C, 0xD63C, 0x0D12, 0xD63D, 0xD63F, 0x45DD, 0xD640, 0xD640, 0x0D13,

+    0xD641, 0xD644, 0x45E0, 0xD645, 0xD645, 0x0D14, 0xD646, 0xD647, 0x45E4,

+    0xD648, 0xD649, 0x0D15, 0xD64A, 0xD64A, 0x45E6, 0xD64B, 0xD64B, 0x0D17,

+    0xD64C, 0xD64C, 0x45E7, 0xD64D, 0xD64D, 0x0D18, 0xD64E, 0xD650, 0x45E8,

+    0xD651, 0xD651, 0x0D19, 0xD652, 0xD653, 0x45EB, 0xD654, 0xD655, 0x0D1A,

+    0xD656, 0xD657, 0x45ED, 0xD658, 0xD658, 0x0D1C, 0xD659, 0xD65B, 0x45EF,

+    0xD65C, 0xD65C, 0x0D1D, 0xD65D, 0xD666, 0x45F2, 0xD667, 0xD667, 0x0D1E,

+    0xD668, 0xD668, 0x45FC, 0xD669, 0xD669, 0x0D1F, 0xD66A, 0xD66F, 0x45FD,

+    0xD670, 0xD671, 0x0D20, 0xD672, 0xD673, 0x4603, 0xD674, 0xD674, 0x0D22,

+    0xD675, 0xD682, 0x4605, 0xD683, 0xD683, 0x0D23, 0xD684, 0xD684, 0x4613,

+    0xD685, 0xD685, 0x0D24, 0xD686, 0xD68B, 0x4614, 0xD68C, 0xD68D, 0x0D25,

+    0xD68E, 0xD68F, 0x461A, 0xD690, 0xD690, 0x0D27, 0xD691, 0xD693, 0x461C,

+    0xD694, 0xD694, 0x0D28, 0xD695, 0xD69C, 0x461F, 0xD69D, 0xD69D, 0x0D29,

+    0xD69E, 0xD69E, 0x4627, 0xD69F, 0xD69F, 0x0D2A, 0xD6A0, 0xD6A0, 0x4628,

+    0xD6A1, 0xD6A1, 0x0D2B, 0xD6A2, 0xD6A7, 0x4629, 0xD6A8, 0xD6A8, 0x0D2C,

+    0xD6A9, 0xD6AB, 0x462F, 0xD6AC, 0xD6AC, 0x0D2D, 0xD6AD, 0xD6AF, 0x4632,

+    0xD6B0, 0xD6B0, 0x0D2E, 0xD6B1, 0xD6B8, 0x4635, 0xD6B9, 0xD6B9, 0x0D2F,

+    0xD6BA, 0xD6BA, 0x463D, 0xD6BB, 0xD6BB, 0x0D30, 0xD6BC, 0xD6C3, 0x463E,

+    0xD6C4, 0xD6C5, 0x0D31, 0xD6C6, 0xD6C7, 0x4646, 0xD6C8, 0xD6C8, 0x0D33,

+    0xD6C9, 0xD6CB, 0x4648, 0xD6CC, 0xD6CC, 0x0D34, 0xD6CD, 0xD6D0, 0x464B,

+    0xD6D1, 0xD6D1, 0x0D35, 0xD6D2, 0xD6D3, 0x464F, 0xD6D4, 0xD6D4, 0x0D36,

+    0xD6D5, 0xD6D6, 0x4651, 0xD6D7, 0xD6D7, 0x0D37, 0xD6D8, 0xD6D8, 0x4653,

+    0xD6D9, 0xD6D9, 0x0D38, 0xD6DA, 0xD6DF, 0x4654, 0xD6E0, 0xD6E0, 0x0D39,

+    0xD6E1, 0xD6E3, 0x465A, 0xD6E4, 0xD6E4, 0x0D3A, 0xD6E5, 0xD6E7, 0x465D,

+    0xD6E8, 0xD6E8, 0x0D3B, 0xD6E9, 0xD6EF, 0x4660, 0xD6F0, 0xD6F0, 0x0D3C,

+    0xD6F1, 0xD6F4, 0x4667, 0xD6F5, 0xD6F5, 0x0D3D, 0xD6F6, 0xD6FB, 0x466B,

+    0xD6FC, 0xD6FD, 0x0D3E, 0xD6FE, 0xD6FF, 0x4671, 0xD700, 0xD700, 0x0D40,

+    0xD701, 0xD703, 0x4673, 0xD704, 0xD704, 0x0D41, 0xD705, 0xD710, 0x4676,

+    0xD711, 0xD711, 0x0D42, 0xD712, 0xD717, 0x4682, 0xD718, 0xD719, 0x0D43,

+    0xD71A, 0xD71B, 0x4688, 0xD71C, 0xD71C, 0x0D45, 0xD71D, 0xD71F, 0x468A,

+    0xD720, 0xD720, 0x0D46, 0xD721, 0xD727, 0x468D, 0xD728, 0xD729, 0x0D47,

+    0xD72A, 0xD72A, 0x4694, 0xD72B, 0xD72B, 0x0D49, 0xD72C, 0xD72C, 0x4695,

+    0xD72D, 0xD72D, 0x0D4A, 0xD72E, 0xD733, 0x4696, 0xD734, 0xD735, 0x0D4B,

+    0xD736, 0xD737, 0x469C, 0xD738, 0xD738, 0x0D4D, 0xD739, 0xD73B, 0x469E,

+    0xD73C, 0xD73C, 0x0D4E, 0xD73D, 0xD743, 0x46A1, 0xD744, 0xD744, 0x0D4F,

+    0xD745, 0xD746, 0x46A8, 0xD747, 0xD747, 0x0D50, 0xD748, 0xD748, 0x46AA,

+    0xD749, 0xD749, 0x0D51, 0xD74A, 0xD74F, 0x46AB, 0xD750, 0xD751, 0x0D52,

+    0xD752, 0xD753, 0x46B1, 0xD754, 0xD754, 0x0D54, 0xD755, 0xD755, 0x46B3,

+    0xD756, 0xD759, 0x0D55, 0xD75A, 0xD75F, 0x46B4, 0xD760, 0xD761, 0x0D59,

+    0xD762, 0xD762, 0x46BA, 0xD763, 0xD763, 0x0D5B, 0xD764, 0xD764, 0x46BB,

+    0xD765, 0xD765, 0x0D5C, 0xD766, 0xD768, 0x46BC, 0xD769, 0xD769, 0x0D5D,

+    0xD76A, 0xD76B, 0x46BF, 0xD76C, 0xD76C, 0x0D5E, 0xD76D, 0xD76F, 0x46C1,

+    0xD770, 0xD770, 0x0D5F, 0xD771, 0xD773, 0x46C4, 0xD774, 0xD774, 0x0D60,

+    0xD775, 0xD77B, 0x46C7, 0xD77C, 0xD77D, 0x0D61, 0xD77E, 0xD780, 0x46CE,

+    0xD781, 0xD781, 0x0D63, 0xD782, 0xD787, 0x46D1, 0xD788, 0xD789, 0x0D64,

+    0xD78A, 0xD78B, 0x46D7, 0xD78C, 0xD78C, 0x0D66, 0xD78D, 0xD78F, 0x46D9,

+    0xD790, 0xD790, 0x0D67, 0xD791, 0xD797, 0x46DC, 0xD798, 0xD799, 0x0D68,

+    0xD79A, 0xD79A, 0x46E3, 0xD79B, 0xD79B, 0x0D6A, 0xD79C, 0xD79C, 0x46E4,

+    0xD79D, 0xD79D, 0x0D6B, 0xD79E, 0xD7A3, 0x46E5, 0xF900, 0xF900, 0x1014,

+    0xF901, 0xF901, 0x0E5E, 0xF902, 0xF902, 0x1B8D, 0xF903, 0xF903, 0x0D84,

+    0xF904, 0xF904, 0x1EDC, 0xF905, 0xF905, 0x0EDA, 0xF906, 0xF906, 0x0F3E,

+    0xF907, 0xF907, 0x0F6A, 0xF908, 0xF908, 0x0F6A, 0xF909, 0xF909, 0x0E7C,

+    0xF90A, 0xF90A, 0x1023, 0xF90B, 0xF90B, 0x1116, 0xF90C, 0xF90C, 0x103C,

+    0xF90D, 0xF913, 0x1117, 0xF914, 0xF914, 0x16A8, 0xF915, 0xF917, 0x111E,

+    0xF918, 0xF91D, 0x1122, 0xF91E, 0xF920, 0x112A, 0xF921, 0xF921, 0x112F,

+    0xF922, 0xF922, 0x1133, 0xF923, 0xF924, 0x1136, 0xF925, 0xF92B, 0x1139,

+    0xF92C, 0xF92D, 0x1143, 0xF92E, 0xF92E, 0x1148, 0xF92F, 0xF92F, 0x119F,

+    0xF930, 0xF931, 0x11A1, 0xF932, 0xF937, 0x11A5, 0xF938, 0xF93A, 0x11AC,

+    0xF93B, 0xF940, 0x11B0, 0xF941, 0xF943, 0x11B7, 0xF944, 0xF945, 0x11BD,

+    0xF946, 0xF948, 0x11C1, 0xF949, 0xF949, 0x11C6, 0xF94A, 0xF94A, 0x11D4,

+    0xF94B, 0xF94E, 0x11D6, 0xF94F, 0xF950, 0x11DB, 0xF951, 0xF951, 0x11E0,

+    0xF952, 0xF955, 0x11FC, 0xF956, 0xF959, 0x1201, 0xF95A, 0xF95A, 0x10DE,

+    0xF95B, 0xF95B, 0x1028, 0xF95C, 0xF95C, 0x16A8, 0xF95D, 0xF95D, 0x102B,

+    0xF95E, 0xF95E, 0x1060, 0xF95F, 0xF95F, 0x1047, 0xF960, 0xF960, 0x104C,

+    0xF961, 0xF961, 0x15B0, 0xF962, 0xF962, 0x1918, 0xF963, 0xF963, 0x141F,

+    0xF964, 0xF964, 0x133A, 0xF965, 0xF965, 0x1D5E, 0xF966, 0xF966, 0x13D7,

+    0xF967, 0xF967, 0x13F5, 0xF968, 0xF968, 0x1DB7, 0xF969, 0xF969, 0x15D0,

+    0xF96A, 0xF96A, 0x14F7, 0xF96B, 0xF96B, 0x1BAB, 0xF96C, 0xF96C, 0x14F2,

+    0xF96D, 0xF96D, 0x156D, 0xF96E, 0xF96E, 0x1771, 0xF96F, 0xF96F, 0x1554,

+    0xF970, 0xF970, 0x14C5, 0xF971, 0xF971, 0x1B61, 0xF972, 0xF972, 0x1CCA,

+    0xF973, 0xF973, 0x162E, 0xF974, 0xF974, 0x16F2, 0xF975, 0xF977, 0x1149,

+    0xF978, 0xF97A, 0x114D, 0xF97B, 0xF97D, 0x1153, 0xF97E, 0xF97E, 0x1157,

+    0xF97F, 0xF980, 0x115A, 0xF981, 0xF981, 0x103F, 0xF982, 0xF982, 0x115C,

+    0xF983, 0xF983, 0x115F, 0xF984, 0xF985, 0x1161, 0xF986, 0xF986, 0x1165,

+    0xF987, 0xF98C, 0x1167, 0xF98D, 0xF98D, 0x116F, 0xF98E, 0xF98E, 0x1040,

+    0xF98F, 0xF990, 0x1171, 0xF991, 0xF991, 0x1041, 0xF992, 0xF994, 0x1174,

+    0xF995, 0xF995, 0x1042, 0xF996, 0xF997, 0x1177, 0xF998, 0xF998, 0x117A,

+    0xF999, 0xF999, 0x1179, 0xF99A, 0xF99B, 0x117B, 0xF99C, 0xF99D, 0x117E,

+    0xF99E, 0xF99E, 0x192F, 0xF99F, 0xF9A0, 0x1181, 0xF9A1, 0xF9A1, 0x1554,

+    0xF9A2, 0xF9A2, 0x1183, 0xF9A3, 0xF9A3, 0x1043, 0xF9A4, 0xF9A4, 0x1046,

+    0xF9A5, 0xF9A5, 0x1185, 0xF9A6, 0xF9A8, 0x1187, 0xF9A9, 0xF9A9, 0x118B,

+    0xF9AA, 0xF9AA, 0x1047, 0xF9AB, 0xF9AD, 0x118D, 0xF9AE, 0xF9AE, 0x1E67,

+    0xF9AF, 0xF9AF, 0x1191, 0xF9B0, 0xF9B0, 0x1193, 0xF9B1, 0xF9B4, 0x1195,

+    0xF9B5, 0xF9B5, 0x119A, 0xF9B6, 0xF9B8, 0x119C, 0xF9B9, 0xF9B9, 0x16A5,

+    0xF9BA, 0xF9BC, 0x11C7, 0xF9BD, 0xF9BD, 0x1054, 0xF9BE, 0xF9BE, 0x11CB,

+    0xF9BF, 0xF9BF, 0x16A8, 0xF9C0, 0xF9C1, 0x11CC, 0xF9C2, 0xF9C3, 0x11D0,

+    0xF9C4, 0xF9C4, 0x11D3, 0xF9C5, 0xF9C5, 0x1F34, 0xF9C6, 0xF9C6, 0x17EB,

+    0xF9C7, 0xF9C7, 0x11E1, 0xF9C8, 0xF9C8, 0x1057, 0xF9C9, 0xF9C9, 0x11E3,

+    0xF9CA, 0xF9CB, 0x11E5, 0xF9CC, 0xF9CC, 0x11E8, 0xF9CD, 0xF9CD, 0x11EA,

+    0xF9CE, 0xF9CE, 0x11EC, 0xF9CF, 0xF9CF, 0x1058, 0xF9D0, 0xF9D3, 0x11EE,

+    0xF9D4, 0xF9D6, 0x11F3, 0xF9D7, 0xF9DA, 0x11F7, 0xF9DB, 0xF9DB, 0x15B0,

+    0xF9DC, 0xF9DC, 0x11FB, 0xF9DD, 0xF9DD, 0x1206, 0xF9DE, 0xF9DE, 0x1208,

+    0xF9DF, 0xF9DF, 0x120A, 0xF9E0, 0xF9E0, 0x173E, 0xF9E1, 0xF9E2, 0x120C,

+    0xF9E3, 0xF9E3, 0x105B, 0xF9E4, 0xF9E4, 0x1211, 0xF9E5, 0xF9E5, 0x1213,

+    0xF9E6, 0xF9E6, 0x1215, 0xF9E7, 0xF9E9, 0x1218, 0xF9EA, 0xF9EA, 0x121C,

+    0xF9EB, 0xF9EC, 0x105C, 0xF9ED, 0xF9ED, 0x121E, 0xF9EE, 0xF9F0, 0x1220,

+    0xF9F1, 0xF9F5, 0x1224, 0xF9F6, 0xF9F6, 0x122A, 0xF9F7, 0xF9F9, 0x122D,

+    0xF9FA, 0xF9FA, 0x14E7, 0xF9FB, 0xF9FB, 0x195E, 0xF9FC, 0xF9FC, 0x1663,

+    0xF9FD, 0xF9FD, 0x168B, 0xF9FE, 0xF9FE, 0x105F, 0xF9FF, 0xF9FF, 0x1954,

+    0xFA00, 0xFA00, 0x1A1C, 0xFA01, 0xFA01, 0x10B7, 0xFA02, 0xFA02, 0x1BE3,

+    0xFA03, 0xFA03, 0x1097, 0xFA04, 0xFA04, 0x10AA, 0xFA05, 0xFA05, 0x10F4,

+    0xFA06, 0xFA06, 0x1D94, 0xFA07, 0xFA07, 0x13E0, 0xFA08, 0xFA08, 0x1E1D,

+    0xFA09, 0xFA09, 0x0DE6, 0xFA0A, 0xFA0A, 0x0E3C, 0xFA0B, 0xFA0B, 0x0EE7,

+    0xFF01, 0xFF3B, 0x0108, 0xFF3C, 0xFF3C, 0x0070, 0xFF3D, 0xFF5D, 0x0144,

+    0xFF5E, 0xFF5E, 0x0071, 0xFFE0, 0xFFE1, 0x008F, 0xFFE2, 0xFFE2, 0x00C2,

+    0xFFE3, 0xFFE3, 0x0165, 0xFFE5, 0xFFE5, 0x0091, 0xFFE6, 0xFFE6, 0x0143,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-V_1.cpp
new file mode 100644
index 0000000..014697b
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-V_1.cpp
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniKS_UCS2_V_1[18 * 3] = {
+    0x2013, 0x2014, 0x1F7B, 0x2016, 0x2016, 0x1F7D, 0x2025, 0x2025, 0x1F7A,
+    0x3001, 0x3002, 0x1F78, 0x3008, 0x3011, 0x1F81, 0x3013, 0x3013, 0x1F8B,
+    0x3014, 0x3015, 0x1F7F, 0xFF01, 0xFF01, 0x1F8C, 0xFF08, 0xFF09, 0x1F8D,
+    0xFF0C, 0xFF0C, 0x1F8F, 0xFF0E, 0xFF0E, 0x1F90, 0xFF1A, 0xFF1F, 0x1F91,
+    0xFF3B, 0xFF3B, 0x1F97, 0xFF3D, 0xFF3D, 0x1F98, 0xFF3F, 0xFF3F, 0x1F99,
+    0xFF5B, 0xFF5D, 0x1F9A, 0xFF5E, 0xFF5E, 0x1F7E, 0xFFE3, 0xFFE3, 0x1F9D,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp
new file mode 100644
index 0000000..1154f55
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp
@@ -0,0 +1,48 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+extern const unsigned short g_FXCMAP_UniKS_UTF16_H_0[158 * 2] = {

+    0x00A9, 0x0062, 0x2010, 0x0061, 0x20A9, 0x0060, 0x2F00, 0x193C,

+    0x2F04, 0x18EC, 0x2F06, 0x190D, 0x2F08, 0x192B, 0x2F0A, 0x194D,

+    0x2F0B, 0x1D4B, 0x2F11, 0x10AE, 0x2F12, 0x116A, 0x2F14, 0x143F,

+    0x2F17, 0x168C, 0x2F18, 0x13D5, 0x2F1C, 0x1839, 0x2F1D, 0x0F3D,

+    0x2F1F, 0x1D1B, 0x2F20, 0x1487, 0x2F23, 0x151B, 0x2F24, 0x109D,

+    0x2F25, 0x103F, 0x2F26, 0x1958, 0x2F28, 0x1C4F, 0x2F29, 0x1580,

+    0x2F2B, 0x1641, 0x2F2D, 0x14B9, 0x2F2F, 0x0ECF, 0x2F30, 0x0FED,

+    0x2F31, 0x0E14, 0x2F32, 0x0D99, 0x2F38, 0x0F7C, 0x2F3C, 0x1684,

+    0x2F3D, 0x0EDC, 0x2F3E, 0x1E80, 0x2F3F, 0x15CC, 0x2F40, 0x1B27,

+    0x2F42, 0x12E8, 0x2F43, 0x10FD, 0x2F44, 0x0FBB, 0x2F45, 0x1356,

+    0x2F46, 0x12D3, 0x2F47, 0x1940, 0x2F48, 0x17ED, 0x2F49, 0x1889,

+    0x2F4A, 0x12B4, 0x2F4B, 0x1F5B, 0x2F4C, 0x1B2C, 0x2F4F, 0x12D6,

+    0x2F50, 0x144C, 0x2F51, 0x12A8, 0x2F52, 0x168E, 0x2F54, 0x15D3,

+    0x2F55, 0x1EBB, 0x2F56, 0x1A93, 0x2F57, 0x1409, 0x2F58, 0x1F1A,

+    0x2F5A, 0x1D61, 0x2F5B, 0x1696, 0x2F5C, 0x1842, 0x2F5D, 0x0E37,

+    0x2F5E, 0x1E3D, 0x2F5F, 0x17C1, 0x2F60, 0x0EDE, 0x2F61, 0x17D4,

+    0x2F62, 0x0DC1, 0x2F63, 0x14FA, 0x2F64, 0x182D, 0x2F65, 0x1A08,

+    0x2F66, 0x1DBA, 0x2F69, 0x1381, 0x2F6A, 0x1DB0, 0x2F6B, 0x1293,

+    0x2F6C, 0x12B7, 0x2F6D, 0x12AD, 0x2F6E, 0x164D, 0x2F6F, 0x1525,

+    0x2F70, 0x164E, 0x2F72, 0x1EBE, 0x2F73, 0x1E4B, 0x2F74, 0x122D,

+    0x2F75, 0x1AF4, 0x2F76, 0x12FF, 0x2F78, 0x140C, 0x2F7A, 0x1708,

+    0x2F7B, 0x184A, 0x2F7C, 0x11A7, 0x2F7D, 0x191B, 0x2F7F, 0x191C,

+    0x2F80, 0x18E0, 0x2F81, 0x18D5, 0x2F82, 0x1675, 0x2F83, 0x1966,

+    0x2F84, 0x1B37, 0x2F85, 0x0F5A, 0x2F86, 0x1550, 0x2F87, 0x1BF6,

+    0x2F88, 0x1AE8, 0x2F89, 0x0DA8, 0x2F8A, 0x14F8, 0x2F8B, 0x1C40,

+    0x2F8E, 0x1E4C, 0x2F8F, 0x1E1D, 0x2F90, 0x1909, 0x2F92, 0x0E3C,

+    0x2F93, 0x0D92, 0x2F94, 0x1721, 0x2F95, 0x0EBC, 0x2F96, 0x1103,

+    0x2F97, 0x1656, 0x2F99, 0x1D58, 0x2F9A, 0x19EC, 0x2F9B, 0x1AEC,

+    0x2F9C, 0x1AAE, 0x2F9D, 0x167B, 0x2F9E, 0x1B8D, 0x2F9F, 0x167C,

+    0x2FA0, 0x1B61, 0x2FA2, 0x18F5, 0x2FA3, 0x18D0, 0x2FA5, 0x121A,

+    0x2FA6, 0x1023, 0x2FA7, 0x19A8, 0x2FA8, 0x12EE, 0x2FA9, 0x141B,

+    0x2FAC, 0x1853, 0x2FAD, 0x1C23, 0x2FAE, 0x1464, 0x2FAF, 0x1288,

+    0x2FB0, 0x1E35, 0x2FB1, 0x18A3, 0x2FB3, 0x18F1, 0x2FB4, 0x1E4D,

+    0x2FB5, 0x1DAB, 0x2FB6, 0x1465, 0x2FB7, 0x1665, 0x2FB8, 0x15F9,

+    0x2FB9, 0x1E26, 0x2FBA, 0x1235, 0x2FBB, 0x0EC9, 0x2FBC, 0x0EB5,

+    0x2FC1, 0x0F99, 0x2FC2, 0x1716, 0x2FC3, 0x1AAB, 0x2FC4, 0x11AF,

+    0x2FC5, 0x11B5, 0x2FC6, 0x1276, 0x2FC7, 0x1237, 0x2FC8, 0x1EF7,

+    0x2FC9, 0x1519, 0x2FCA, 0x1F52, 0x2FCD, 0x1A66, 0x2FCE, 0x0EB6,

+    0x2FCF, 0x151A, 0x2FD0, 0x1466, 0x2FD1, 0x1A7D, 0x2FD2, 0x1CBF,

+    0x2FD3, 0x11D3, 0x2FD4, 0x0F6A,

+};

diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/cmaps_korea1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/cmaps_korea1.cpp
new file mode 100644
index 0000000..c80b743
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/cmaps_korea1.cpp
@@ -0,0 +1,42 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../../include/fpdfapi/fpdf_resource.h"
+#include "../../../../include/fpdfapi/fpdf_module.h"
+#include "../../fpdf_font/font_int.h"
+#include "../cmap_int.h"
+extern const FX_WORD g_FXCMAP_KSC_EUC_H_0[];
+extern const FX_WORD g_FXCMAP_KSC_EUC_V_0[];
+extern const FX_WORD g_FXCMAP_KSCms_UHC_H_1[];
+extern const FX_WORD g_FXCMAP_KSCms_UHC_V_1[];
+extern const FX_WORD g_FXCMAP_KSCms_UHC_HW_H_1[];
+extern const FX_WORD g_FXCMAP_KSCms_UHC_HW_V_1[];
+extern const FX_WORD g_FXCMAP_KSCpc_EUC_H_0[];
+extern const FX_WORD g_FXCMAP_UniKS_UCS2_H_1[];
+extern const FX_WORD g_FXCMAP_UniKS_UCS2_V_1[];
+extern const FX_WORD g_FXCMAP_UniKS_UTF16_H_0[];
+extern const FX_WORD g_FXCMAP_Korea1CID2Unicode_2[];
+const FXCMAP_CMap g_FXCMAP_Korea1_cmaps[] = {
+    { "KSC-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_KSC_EUC_H_0, 467, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "KSC-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_KSC_EUC_V_0, 16, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "KSCms-UHC-H", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_H_1, 675, FXCMAP_CMap::None, NULL, 0, -2 },
+    { "KSCms-UHC-V", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_V_1, 16, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "KSCms-UHC-HW-H", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_HW_H_1, 675, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "KSCms-UHC-HW-V", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_HW_V_1, 16, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "KSCpc-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_KSCpc_EUC_H_0, 509, FXCMAP_CMap::None, NULL, 0, -6 },
+    { "UniKS-UCS2-H", FXCMAP_CMap::Range, g_FXCMAP_UniKS_UCS2_H_1, 8394, FXCMAP_CMap::None, NULL, 0, 0 },
+    { "UniKS-UCS2-V", FXCMAP_CMap::Range, g_FXCMAP_UniKS_UCS2_V_1, 18, FXCMAP_CMap::None, NULL, 0, -1 },
+    { "UniKS-UTF16-H", FXCMAP_CMap::Single, g_FXCMAP_UniKS_UTF16_H_0, 158, FXCMAP_CMap::None, NULL, 0, -2 },
+    { "UniKS-UTF16-V", FXCMAP_CMap::Range, g_FXCMAP_UniKS_UCS2_V_1, 18, FXCMAP_CMap::None, NULL, 0, -1 },
+};
+void CPDF_ModuleMgr::LoadEmbeddedKorea1CMaps()
+{
+    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+    pFontGlobals->m_EmbeddedCharsets[CIDSET_KOREA1].m_pMapList = g_FXCMAP_Korea1_cmaps;
+    pFontGlobals->m_EmbeddedCharsets[CIDSET_KOREA1].m_Count = sizeof g_FXCMAP_Korea1_cmaps / sizeof (FXCMAP_CMap);
+    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_KOREA1].m_pMap = g_FXCMAP_Korea1CID2Unicode_2;
+    pFontGlobals->m_EmbeddedToUnicodes[CIDSET_KOREA1].m_Count = 18352;
+}
diff --git a/core/src/fpdfapi/fpdf_cmaps/cmap_int.h b/core/src/fpdfapi/fpdf_cmaps/cmap_int.h
new file mode 100644
index 0000000..2ce1522
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/cmap_int.h
@@ -0,0 +1,20 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDFAPI_CMAP_INT_H_

+#define _FPDFAPI_CMAP_INT_H_

+struct FXCMAP_CMap {

+    typedef enum { None, Single, Range, Reverse } MapType;

+    const char*		m_Name;

+    MapType			m_WordMapType;

+    const FX_WORD*	m_pWordMap;

+    int				m_WordCount;

+    MapType			m_DWordMapType;

+    const FX_WORD*	m_pDWordMap;

+    int				m_DWordCount;

+    int				m_UseOffset;

+};

+#endif

diff --git a/core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp b/core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp
new file mode 100644
index 0000000..9ab324b
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp
@@ -0,0 +1,183 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_resource.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../fpdf_font/font_int.h"

+#include "cmap_int.h"

+void FPDFAPI_FindEmbeddedCMap(const char* name, int charset, int coding, const FXCMAP_CMap*& pMap)

+{

+    pMap = NULL;

+    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();

+    const FXCMAP_CMap* pCMaps = pFontGlobals->m_EmbeddedCharsets[charset].m_pMapList;

+    int nCMaps = pFontGlobals->m_EmbeddedCharsets[charset].m_Count;

+    for (int i = 0; i < nCMaps; i ++) {

+        if (FXSYS_strcmp(name, pCMaps[i].m_Name)) {

+            continue;

+        }

+        pMap = &pCMaps[i];

+        break;

+    }

+}

+extern "C" {

+    static int compareWord(const void* p1, const void* p2)

+    {

+        return (*(FX_WORD*)p1) - (*(FX_WORD*)p2);

+    }

+};

+extern "C" {

+    static int compareWordRange(const void* key, const void* element)

+    {

+        if (*(FX_WORD*)key < * (FX_WORD*)element) {

+            return -1;

+        }

+        if (*(FX_WORD*)key > ((FX_WORD*)element)[1]) {

+            return 1;

+        }

+        return 0;

+    }

+};

+extern "C" {

+    static int compareDWordRange(const void* p1, const void* p2)

+    {

+        FX_DWORD key = *(FX_DWORD*)p1;

+        FX_WORD hiword = (FX_WORD)(key >> 16);

+        FX_WORD* element = (FX_WORD*)p2;

+        if (hiword < element[0]) {

+            return -1;

+        }

+        if (hiword > element[0]) {

+            return 1;

+        }

+        FX_WORD loword = (FX_WORD)key;

+        if (loword < element[1]) {

+            return -1;

+        }

+        if (loword > element[2]) {

+            return 1;

+        }

+        return 0;

+    }

+};

+extern "C" {

+    static int compareDWordSingle(const void* p1, const void* p2)

+    {

+        FX_DWORD key = *(FX_DWORD*)p1;

+        FX_DWORD value = ((*(FX_WORD*)p2) << 16) | ((FX_WORD*)p2)[1];

+        if (key < value) {

+            return -1;

+        }

+        if (key > value) {

+            return 1;

+        }

+        return 0;

+    }

+};

+FX_WORD FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, FX_DWORD charcode)

+{

+    if (charcode >> 16) {

+        while (1) {

+            if (pMap->m_DWordMapType == FXCMAP_CMap::Range) {

+                FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, pMap->m_DWordCount, 8, compareDWordRange);

+                if (found) {

+                    return found[3] + (FX_WORD)charcode - found[1];

+                }

+            } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) {

+                FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, pMap->m_DWordCount, 6, compareDWordSingle);

+                if (found) {

+                    return found[2];

+                }

+            }

+            if (pMap->m_UseOffset == 0) {

+                return 0;

+            }

+            pMap = pMap + pMap->m_UseOffset;

+        }

+        return 0;

+    }

+    FX_WORD code = (FX_WORD)charcode;

+    while (1) {

+        if (pMap->m_pWordMap == NULL) {

+            return 0;

+        }

+        if (pMap->m_WordMapType == FXCMAP_CMap::Single) {

+            FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&code, pMap->m_pWordMap, pMap->m_WordCount, 4, compareWord);

+            if (found) {

+                return found[1];

+            }

+        } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) {

+            FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&code, pMap->m_pWordMap, pMap->m_WordCount, 6, compareWordRange);

+            if (found) {

+                return found[2] + code - found[0];

+            }

+        }

+        if (pMap->m_UseOffset == 0) {

+            return 0;

+        }

+        pMap = pMap + pMap->m_UseOffset;

+    }

+    return 0;

+}

+FX_DWORD FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, FX_WORD cid)

+{

+    while (1) {

+        if (pMap->m_WordMapType == FXCMAP_CMap::Single) {

+            const FX_WORD *pCur = pMap->m_pWordMap;

+            const FX_WORD *pEnd = pMap->m_pWordMap + pMap->m_WordCount * 2;

+            while (pCur < pEnd) {

+                if (pCur[1] == cid) {

+                    return pCur[0];

+                }

+                pCur += 2;

+            }

+        } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) {

+            const FX_WORD *pCur = pMap->m_pWordMap;

+            const FX_WORD *pEnd = pMap->m_pWordMap + pMap->m_WordCount * 3;

+            while (pCur < pEnd) {

+                if (cid >= pCur[2] && cid <= pCur[2] + pCur[1] - pCur[0]) {

+                    return pCur[0] + cid - pCur[2];

+                }

+                pCur += 3;

+            }

+        }

+        if (pMap->m_UseOffset == 0) {

+            return 0;

+        }

+        pMap = pMap + pMap->m_UseOffset;

+    }

+    while (1) {

+        if (pMap->m_DWordMapType == FXCMAP_CMap::Range) {

+            const FX_WORD *pCur = pMap->m_pDWordMap;

+            const FX_WORD *pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 4;

+            while (pCur < pEnd) {

+                if (cid >= pCur[3] && cid <= pCur[3] + pCur[2] - pCur[1]) {

+                    return (((FX_DWORD)pCur[0] << 16) | pCur[1]) + cid - pCur[3];

+                }

+                pCur += 4;

+            }

+        } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) {

+            const FX_WORD *pCur = pMap->m_pDWordMap;

+            const FX_WORD *pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 3;

+            while (pCur < pEnd) {

+                if (pCur[2] == cid) {

+                    return ((FX_DWORD)pCur[0] << 16) | pCur[1];

+                }

+                pCur += 3;

+            }

+        }

+        if (pMap->m_UseOffset == 0) {

+            return 0;

+        }

+        pMap = pMap + pMap->m_UseOffset;

+    }

+    return 0;

+}

+void FPDFAPI_LoadCID2UnicodeMap(int charset, const FX_WORD*& pMap, FX_DWORD& count)

+{

+    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();

+    pMap = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;

+    count = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count;

+}

diff --git a/core/src/fpdfapi/fpdf_edit/editint.h b/core/src/fpdfapi/fpdf_edit/editint.h
new file mode 100644
index 0000000..bceba1a
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_edit/editint.h
@@ -0,0 +1,59 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_EDITINT_

+#define _FPDF_EDITINT_

+class CPDF_ObjectStream : public CFX_Object

+{

+public:

+    CPDF_ObjectStream();

+

+    FX_BOOL				Start();

+

+    FX_INT32			CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj);

+    FX_INT32			CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize);

+

+    FX_FILESIZE			End(CPDF_Creator* pCreator);

+

+    CFX_DWordArray		m_ObjNumArray;

+

+    CFX_ByteTextBuf		m_Buffer;

+    FX_DWORD			m_dwObjNum;

+    FX_INT32			m_index;

+protected:

+

+    CFX_DWordArray		m_OffsetArray;

+};

+class CPDF_XRefStream : public CFX_Object

+{

+public:

+

+    CPDF_XRefStream();

+

+    FX_BOOL				Start();

+

+    FX_INT32			CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj, CPDF_Creator *pCreator);

+

+    FX_INT32			CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize, CPDF_Creator *pCreator);

+

+    FX_BOOL				End(CPDF_Creator *pCreator, FX_BOOL bEOF = FALSE);

+    FX_BOOL				AddObjectNumberToIndexArray(FX_DWORD objnum);

+    FX_BOOL				EndXRefStream(CPDF_Creator* pCreator);

+

+

+    CFX_DWordArray		m_IndexArray;

+

+    FX_FILESIZE			m_PrevOffset;

+    FX_DWORD			m_dwTempObjNum;

+

+protected:

+    FX_INT32			EndObjectStream(CPDF_Creator *pCreator, FX_BOOL bEOF = TRUE);

+    FX_BOOL				GenerateXRefStream(CPDF_Creator* pCreator, FX_BOOL bEOF);

+    FX_INT32			m_iSeg;

+    CPDF_ObjectStream	m_ObjStream;

+    CFX_ByteTextBuf		m_Buffer;

+};

+#endif

diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp
new file mode 100644
index 0000000..798c772
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp
@@ -0,0 +1,164 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_serial.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "../fpdf_page/pageint.h"

+CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& ar, CFX_AffineMatrix& matrix)

+{

+    ar << matrix.a << " " << matrix.b << " " << matrix.c << " " << matrix.d << " " << matrix.e << " " << matrix.f;

+    return ar;

+}

+CPDF_PageContentGenerate::CPDF_PageContentGenerate(CPDF_Page* pPage) : m_pPage(pPage)

+{

+    m_pDocument = NULL;

+    if (m_pPage) {

+        m_pDocument = m_pPage->m_pDocument;

+    }

+}

+CPDF_PageContentGenerate::~CPDF_PageContentGenerate()

+{

+    for (int i = 0; i < m_pageObjects.GetSize(); ++i) {

+        CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_pageObjects[i];

+        if (pPageObj) {

+            pPageObj->Release();

+        }

+    }

+}

+FX_BOOL CPDF_PageContentGenerate::InsertPageObject(CPDF_PageObject* pPageObject)

+{

+    if (!pPageObject) {

+        return FALSE;

+    }

+    return m_pageObjects.Add(pPageObject);

+}

+void CPDF_PageContentGenerate::GenerateContent()

+{

+    CFX_ByteTextBuf buf;

+    CPDF_Dictionary* pPageDict = m_pPage->m_pFormDict;

+    for (int i = 0; i < m_pageObjects.GetSize(); ++i) {

+        CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_pageObjects[i];

+        if (!pPageObj || pPageObj->m_Type != PDFPAGE_IMAGE) {

+            continue;

+        }

+        ProcessImage(buf, (CPDF_ImageObject*)pPageObj);

+    }

+    CPDF_Object* pContent = pPageDict->GetElementValue("Contents");

+    if (pContent != NULL) {

+        pPageDict->RemoveAt("Contents");

+    }

+    CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);

+    pStream->SetData(buf.GetBuffer(), buf.GetLength(), FALSE, FALSE);

+    m_pDocument->AddIndirectObject(pStream);

+    pPageDict->SetAtReference("Contents", m_pDocument, pStream->GetObjNum());

+}

+CFX_ByteString CPDF_PageContentGenerate::RealizeResource(CPDF_Object* pResourceObj, const FX_CHAR* szType)

+{

+    if (m_pPage->m_pResources == NULL) {

+        m_pPage->m_pResources = FX_NEW CPDF_Dictionary;

+        int objnum = m_pDocument->AddIndirectObject(m_pPage->m_pResources);

+        m_pPage->m_pFormDict->SetAtReference("Resources", m_pDocument, objnum);

+    }

+    CPDF_Dictionary* pResList = m_pPage->m_pResources->GetDict(szType);

+    if (pResList == NULL) {

+        pResList = FX_NEW CPDF_Dictionary;

+        m_pPage->m_pResources->SetAt(szType, pResList);

+    }

+    m_pDocument->AddIndirectObject(pResourceObj);

+    CFX_ByteString name;

+    int idnum = 1;

+    while (1) {

+        name.Format("FX%c%d", szType[0], idnum);

+        if (!pResList->KeyExist(name)) {

+            break;

+        }

+        idnum ++;

+    }

+    pResList->AddReference(name, m_pDocument, pResourceObj->GetObjNum());

+    return name;

+}

+void CPDF_PageContentGenerate::ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj)

+{

+    if ((pImageObj->m_Matrix.a == 0 && pImageObj->m_Matrix.b == 0) ||

+            (pImageObj->m_Matrix.c == 0 && pImageObj->m_Matrix.d == 0)) {

+        return;

+    }

+    buf << "q " << pImageObj->m_Matrix << " cm ";

+    if (!pImageObj->m_pImage->IsInline()) {

+        CPDF_Stream* pStream = pImageObj->m_pImage->GetStream();

+        FX_DWORD dwSavedObjNum = pStream->GetObjNum();

+        CFX_ByteString name = RealizeResource(pStream, "XObject");

+        if (dwSavedObjNum == 0) {

+            pImageObj->m_pImage->Release();

+            pImageObj->m_pImage = m_pDocument->GetPageData()->GetImage(pStream);

+        }

+        buf << "/" << PDF_NameEncode(name) << " Do Q\n";

+    }

+}

+void CPDF_PageContentGenerate::ProcessForm(CFX_ByteTextBuf& buf, FX_LPCBYTE data, FX_DWORD size, CFX_Matrix& matrix)

+{

+    if (!data || !size) {

+        return;

+    }

+    CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);

+    CPDF_Dictionary* pFormDict = CPDF_Dictionary::Create();

+    pFormDict->SetAtName(FX_BSTR("Type"), FX_BSTR("XObject"));

+    pFormDict->SetAtName(FX_BSTR("Subtype"), FX_BSTR("Form"));

+    CFX_FloatRect bbox = m_pPage->GetPageBBox();

+    matrix.TransformRect(bbox);

+    pFormDict->SetAtRect(FX_BSTR("BBox"), bbox);

+    pStream->InitStream((FX_LPBYTE)data, size, pFormDict);

+    buf << "q " << matrix << " cm ";

+    CFX_ByteString name = RealizeResource(pStream, "XObject");

+    buf << "/" << PDF_NameEncode(name) << " Do Q\n";

+}

+void CPDF_PageContentGenerate::TransformContent(CFX_Matrix& matrix)

+{

+    CPDF_Object* pContent = m_pPage->m_pFormDict->GetElementValue("Contents");

+    if (!pContent) {

+        return;

+    }

+    CFX_ByteTextBuf buf;

+    int type = pContent->GetType();

+    if (type == PDFOBJ_ARRAY) {

+        CPDF_Array* pArray = (CPDF_Array*)pContent;

+        int iCount = pArray->GetCount();

+        CPDF_StreamAcc** pContentArray = (CPDF_StreamAcc**)FX_Alloc(CPDF_StreamAcc*, iCount);

+        int size = 0;

+        int i = 0;

+        for (i = 0; i < iCount; ++i) {

+            pContent = pArray->GetElement(i);

+            if (!pContent || pContent->GetType() != PDFOBJ_STREAM) {

+                continue;

+            }

+            CPDF_StreamAcc* pStream = FX_NEW CPDF_StreamAcc();

+            pStream->LoadAllData((CPDF_Stream*)pContent);

+            pContentArray[i] = pStream;

+            size += pContentArray[i]->GetSize() + 1;

+        }

+        int pos = 0;

+        FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, size);

+        for (i = 0; i < iCount; ++i) {

+            FXSYS_memcpy32(pBuf + pos, pContentArray[i]->GetData(), pContentArray[i]->GetSize());

+            pos += pContentArray[i]->GetSize() + 1;

+            pBuf[pos - 1] = ' ';

+            delete pContentArray[i];

+        }

+        ProcessForm(buf, pBuf, size, matrix);

+        FX_Free(pBuf);

+        FX_Free(pContentArray);

+    } else if (type == PDFOBJ_STREAM) {

+        CPDF_StreamAcc contentStream;

+        contentStream.LoadAllData((CPDF_Stream*)pContent);

+        ProcessForm(buf, contentStream.GetData(), contentStream.GetSize(), matrix);

+    }

+    CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);

+    pStream->SetData(buf.GetBuffer(), buf.GetLength(), FALSE, FALSE);

+    m_pDocument->AddIndirectObject(pStream);

+    m_pPage->m_pFormDict->SetAtReference("Contents", m_pDocument, pStream->GetObjNum());

+}

diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
new file mode 100644
index 0000000..4ec3aa6
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
@@ -0,0 +1,2131 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_serial.h"

+#include "editint.h"

+#define PDF_OBJECTSTREAM_MAXLENGTH	(256 * 1024)

+#define PDF_XREFSTREAM_MAXSIZE		10000

+extern void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_data, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+extern void FlateEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, int predictor, int Colors, int BitsPerComponent, int Columns,

+                        FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+extern FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict);

+FX_INT32 PDF_CreatorAppendObject(const CPDF_Object* pObj, CFX_FileBufferArchive *pFile, FX_FILESIZE& offset)

+{

+    FX_INT32 len = 0;

+    if (pObj == NULL) {

+        if (pFile->AppendString(FX_BSTRC(" null")) < 0) {

+            return -1;

+        }

+        offset += 5;

+        return 1;

+    }

+    switch (pObj->GetType()) {

+        case PDFOBJ_NULL:

+            if (pFile->AppendString(FX_BSTRC(" null")) < 0) {

+                return -1;

+            }

+            offset += 5;

+            break;

+        case PDFOBJ_BOOLEAN:

+        case PDFOBJ_NUMBER:

+            if (pFile->AppendString(FX_BSTRC(" ")) < 0) {

+                return -1;

+            }

+            if ((len = pFile->AppendString(pObj->GetString())) < 0) {

+                return -1;

+            }

+            offset += len + 1;

+            break;

+        case PDFOBJ_STRING: {

+                CFX_ByteString str = pObj->GetString();

+                FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();

+                if ((len = pFile->AppendString(PDF_EncodeString(str, bHex))) < 0) {

+                    return -1;

+                }

+                offset += len;

+                break;

+            }

+        case PDFOBJ_NAME: {

+                if (pFile->AppendString(FX_BSTRC("/")) < 0) {

+                    return -1;

+                }

+                CFX_ByteString str = pObj->GetString();

+                if ((len = pFile->AppendString(PDF_NameEncode(str))) < 0) {

+                    return -1;

+                }

+                offset += len + 1;

+                break;

+            }

+        case PDFOBJ_REFERENCE: {

+                if (pFile->AppendString(FX_BSTRC(" ")) < 0) {

+                    return -1;

+                }

+                CPDF_Reference* p = (CPDF_Reference*)pObj;

+                if ((len = pFile->AppendDWord(p->GetRefObjNum())) < 0) {

+                    return -1;

+                }

+                if (pFile->AppendString(FX_BSTRC(" 0 R ")) < 0) {

+                    return -1;

+                }

+                offset += len + 6;

+                break;

+            }

+        case PDFOBJ_ARRAY: {

+                if (pFile->AppendString(FX_BSTRC("[")) < 0) {

+                    return -1;

+                }

+                offset += 1;

+                CPDF_Array* p = (CPDF_Array*)pObj;

+                for (FX_DWORD i = 0; i < p->GetCount(); i ++) {

+                    CPDF_Object* pElement = p->GetElement(i);

+                    if (pElement->GetObjNum()) {

+                        if (pFile->AppendString(FX_BSTRC(" ")) < 0) {

+                            return -1;

+                        }

+                        if ((len = pFile->AppendDWord(pElement->GetObjNum())) < 0) {

+                            return -1;

+                        }

+                        if (pFile->AppendString(FX_BSTRC(" 0 R")) < 0) {

+                            return -1;

+                        }

+                        offset += len + 5;

+                    } else {

+                        if (PDF_CreatorAppendObject(pElement, pFile, offset) < 0) {

+                            return -1;

+                        }

+                    }

+                }

+                if (pFile->AppendString(FX_BSTRC("]")) < 0) {

+                    return -1;

+                }

+                offset += 1;

+                break;

+            }

+        case PDFOBJ_DICTIONARY: {

+                if (pFile->AppendString(FX_BSTRC("<<")) < 0) {

+                    return -1;

+                }

+                offset += 2;

+                CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;

+                FX_POSITION pos = p->GetStartPos();

+                while (pos) {

+                    CFX_ByteString key;

+                    CPDF_Object* pValue = p->GetNextElement(pos, key);

+                    if (pFile->AppendString(FX_BSTRC("/")) < 0) {

+                        return -1;

+                    }

+                    if ((len = pFile->AppendString(PDF_NameEncode(key))) < 0) {

+                        return -1;

+                    }

+                    offset += len + 1;

+                    if (pValue->GetObjNum()) {

+                        if (pFile->AppendString(FX_BSTRC(" ")) < 0) {

+                            return -1;

+                        }

+                        if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) {

+                            return -1;

+                        }

+                        if (pFile->AppendString(FX_BSTRC(" 0 R")) < 0) {

+                            return -1;

+                        }

+                        offset += len + 5;

+                    } else {

+                        if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) {

+                            return -1;

+                        }

+                    }

+                }

+                if (pFile->AppendString(FX_BSTRC(">>")) < 0) {

+                    return -1;

+                }

+                offset += 2;

+                break;

+            }

+        case PDFOBJ_STREAM: {

+                CPDF_Stream* p = (CPDF_Stream*)pObj;

+                if (PDF_CreatorAppendObject(p->GetDict(), pFile, offset) < 0) {

+                    return -1;

+                }

+                if (pFile->AppendString(FX_BSTRC("stream\r\n")) < 0) {

+                    return -1;

+                }

+                offset += 8;

+                CPDF_StreamAcc acc;

+                acc.LoadAllData(p, TRUE);

+                if (pFile->AppendBlock(acc.GetData(), acc.GetSize()) < 0) {

+                    return -1;

+                }

+                offset += acc.GetSize();

+                if ((len = pFile->AppendString(FX_BSTRC("\r\nendstream"))) < 0) {

+                    return -1;

+                }

+                offset += len;

+                break;

+            }

+        default:

+            ASSERT(FALSE);

+            break;

+    }

+    return 1;

+}

+FX_INT32 PDF_CreatorWriteTrailer(CPDF_Document* pDocument, CFX_FileBufferArchive* pFile, CPDF_Array* pIDArray, FX_BOOL bCompress)

+{

+    FX_FILESIZE offset = 0;

+    FX_INT32 len = 0;

+    FXSYS_assert(pDocument && pFile);

+    CPDF_Parser *pParser = (CPDF_Parser*)pDocument->GetParser();

+    if (pParser) {

+        CPDF_Dictionary* p = pParser->GetTrailer();

+        FX_POSITION pos = p->GetStartPos();

+        while (pos) {

+            CFX_ByteString key;

+            CPDF_Object* pValue = p->GetNextElement(pos, key);

+            if (key == FX_BSTRC("Encrypt") || key == FX_BSTRC("Size") || key == FX_BSTRC("Filter") ||

+                    key == FX_BSTRC("Index") || key == FX_BSTRC("Length") || key == FX_BSTRC("Prev") ||

+                    key == FX_BSTRC("W") || key == FX_BSTRC("XRefStm") || key == FX_BSTRC("Type") || key == FX_BSTRC("ID")) {

+                continue;

+            }

+            if (bCompress && key == FX_BSTRC("DecodeParms")) {

+                continue;

+            }

+            if (pFile->AppendString((FX_BSTRC("/"))) < 0) {

+                return -1;

+            }

+            if ((len = pFile->AppendString(PDF_NameEncode(key))) < 0) {

+                return -1;

+            }

+            offset += len + 1;

+            if (pValue->GetObjNum()) {

+                if (pFile->AppendString(FX_BSTRC(" ")) < 0) {

+                    return -1;

+                }

+                if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) {

+                    return -1;

+                }

+                if (pFile->AppendString(FX_BSTRC(" 0 R ")) < 0) {

+                    return -1;

+                }

+                offset += len + 6;

+            } else {

+                if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) {

+                    return -1;

+                }

+            }

+        }

+        if (pIDArray) {

+            if (pFile->AppendString((FX_BSTRC("/ID"))) < 0) {

+                return -1;

+            }

+            offset += 3;

+            if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) {

+                return -1;

+            }

+        }

+        return offset;

+    }

+    if (pFile->AppendString(FX_BSTRC("\r\n/Root ")) < 0) {

+        return -1;

+    }

+    if ((len = pFile->AppendDWord(pDocument->GetRoot()->GetObjNum())) < 0) {

+        return -1;

+    }

+    if (pFile->AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {

+        return -1;

+    }

+    offset += len + 14;

+    if (pDocument->GetInfo()) {

+        if (pFile->AppendString(FX_BSTRC("/Info ")) < 0) {

+            return -1;

+        }

+        if ((len = pFile->AppendDWord(pDocument->GetInfo()->GetObjNum())) < 0) {

+            return -1;

+        }

+        if (pFile->AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {

+            return -1;

+        }

+        offset += len + 12;

+    }

+    if (pIDArray) {

+        if (pFile->AppendString((FX_BSTRC("/ID"))) < 0) {

+            return -1;

+        }

+        offset += 3;

+        if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) {

+            return -1;

+        }

+    }

+    return offset;

+}

+FX_INT32 PDF_CreatorWriteEncrypt(const CPDF_Dictionary* pEncryptDict, FX_DWORD dwObjNum, CFX_FileBufferArchive *pFile)

+{

+    if (!pEncryptDict) {

+        return 0;

+    }

+    FXSYS_assert(pFile);

+    FX_FILESIZE offset = 0;

+    FX_INT32 len = 0;

+    if (pFile->AppendString(FX_BSTRC("/Encrypt")) < 0) {

+        return -1;

+    }

+    offset += 8;

+    if (pFile->AppendString(FX_BSTRC(" ")) < 0) {

+        return -1;

+    }

+    if ((len = pFile->AppendDWord(dwObjNum)) < 0) {

+        return -1;

+    }

+    if (pFile->AppendString(FX_BSTRC(" 0 R ")) < 0) {

+        return -1;

+    }

+    offset += len + 6;

+    return offset;

+}

+FX_BOOL PDF_GenerateFileID(FX_DWORD dwSeed1, FX_DWORD dwSeed2, FX_LPDWORD pBuffer)

+{

+    if (!pBuffer) {

+        return FALSE;

+    }

+    FX_LPVOID pContext = FX_Random_MT_Start(dwSeed1);

+    FX_INT32 i = 0;

+    for (i = 0; i < 2; i++) {

+        *pBuffer++ = FX_Random_MT_Generate(pContext);

+    }

+    FX_Random_MT_Close(pContext);

+    pContext = FX_Random_MT_Start(dwSeed2);

+    for (i = 0; i < 2; i++) {

+        *pBuffer++ = FX_Random_MT_Generate(pContext);

+    }

+    FX_Random_MT_Close(pContext);

+    return TRUE;

+}

+class CPDF_FlateEncoder

+{

+public:

+    CPDF_FlateEncoder();

+    ~CPDF_FlateEncoder();

+    FX_BOOL		Initialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode);

+    FX_BOOL		Initialize(FX_LPCBYTE pBuffer, FX_DWORD size, FX_BOOL bFlateEncode, FX_BOOL bXRefStream = FALSE);

+    void		CloneDict();

+    FX_LPBYTE			m_pData;

+    FX_DWORD			m_dwSize;

+    CPDF_Dictionary*	m_pDict;

+    FX_BOOL				m_bCloned;

+    FX_BOOL				m_bNewData;

+    CPDF_StreamAcc		m_Acc;

+};

+CPDF_FlateEncoder::CPDF_FlateEncoder()

+{

+    m_pData = NULL;

+    m_dwSize = 0;

+    m_pDict = NULL;

+    m_bCloned = FALSE;

+    m_bNewData = FALSE;

+}

+void CPDF_FlateEncoder::CloneDict()

+{

+    if (!m_bCloned) {

+        m_pDict = (CPDF_Dictionary*)m_pDict->Clone();

+        m_bCloned = TRUE;

+    }

+}

+FX_BOOL CPDF_FlateEncoder::Initialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode)

+{

+    m_Acc.LoadAllData(pStream, TRUE);

+    if (pStream->GetDict()->KeyExist("Filter") || !bFlateEncode) {

+        if (pStream->GetDict()->KeyExist("Filter") && !bFlateEncode) {

+            CPDF_StreamAcc destAcc;

+            destAcc.LoadAllData(pStream);

+            m_dwSize = destAcc.GetSize();

+            m_pData = (FX_LPBYTE)destAcc.DetachData();

+            m_pDict = (CPDF_Dictionary*)pStream->GetDict()->Clone();

+            m_pDict->RemoveAt(FX_BSTRC("Filter"));

+            m_bNewData = TRUE;

+            m_bCloned = TRUE;

+        } else {

+            m_pData = (FX_LPBYTE)m_Acc.GetData();

+            m_dwSize = m_Acc.GetSize();

+            m_pDict = pStream->GetDict();

+        }

+        return TRUE;

+    }

+    m_pData = NULL;

+    m_dwSize = 0;

+    m_bNewData = TRUE;

+    m_bCloned = TRUE;

+    ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), m_pData, m_dwSize);

+    m_pDict = (CPDF_Dictionary*)pStream->GetDict()->Clone();

+    m_pDict->SetAtInteger("Length", m_dwSize);

+    m_pDict->SetAtName("Filter", "FlateDecode");

+    m_pDict->RemoveAt("DecodeParms");

+    return TRUE;

+}

+FX_BOOL CPDF_FlateEncoder::Initialize(FX_LPCBYTE pBuffer, FX_DWORD size, FX_BOOL bFlateEncode, FX_BOOL bXRefStream)

+{

+    if (!bFlateEncode) {

+        m_pData = (FX_LPBYTE)pBuffer;

+        m_dwSize = size;

+        return TRUE;

+    }

+    m_bNewData = TRUE;

+    if (bXRefStream) {

+        ::FlateEncode(pBuffer, size, 12, 1, 8, 7, m_pData, m_dwSize);

+    } else {

+        ::FlateEncode(pBuffer, size, m_pData, m_dwSize);

+    }

+    return TRUE;

+}

+CPDF_FlateEncoder::~CPDF_FlateEncoder()

+{

+    if (m_bCloned && m_pDict) {

+        m_pDict->Release();

+    }

+    if (m_bNewData && m_pData) {

+        FX_Free(m_pData);

+    }

+}

+class CPDF_Encryptor

+{

+public:

+    CPDF_Encryptor();

+    ~CPDF_Encryptor();

+    FX_BOOL		Initialize(CPDF_CryptoHandler* pHandler, int objnum, FX_LPBYTE src_data, FX_DWORD src_size);

+    FX_LPBYTE			m_pData;

+    FX_DWORD			m_dwSize;

+    FX_BOOL				m_bNewBuf;

+};

+CPDF_Encryptor::CPDF_Encryptor()

+{

+    m_pData = NULL;

+    m_dwSize = 0;

+    m_bNewBuf = FALSE;

+}

+FX_BOOL CPDF_Encryptor::Initialize(CPDF_CryptoHandler* pHandler, int objnum, FX_LPBYTE src_data, FX_DWORD src_size)

+{

+    if (src_size == 0) {

+        return TRUE;

+    }

+    if (pHandler == NULL) {

+        m_pData = (FX_LPBYTE)src_data;

+        m_dwSize = src_size;

+        m_bNewBuf = FALSE;

+        return TRUE;

+    }

+    m_dwSize = pHandler->EncryptGetSize(objnum, 0, src_data, src_size);

+    m_pData = FX_Alloc(FX_BYTE, m_dwSize);

+    if(!m_pData) {

+        return FALSE;

+    }

+    pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize);

+    m_bNewBuf = TRUE;

+    return TRUE;

+}

+CPDF_Encryptor::~CPDF_Encryptor()

+{

+    if (m_bNewBuf) {

+        FX_Free(m_pData);

+    }

+}

+CPDF_ObjectStream::CPDF_ObjectStream()

+    : m_dwObjNum(0)

+    , m_index(0)

+{

+}

+FX_BOOL CPDF_ObjectStream::Start()

+{

+    m_ObjNumArray.RemoveAll();

+    m_OffsetArray.RemoveAll();

+    m_Buffer.Clear();

+    m_dwObjNum = 0;

+    m_index = 0;

+    return TRUE;

+}

+FX_INT32 CPDF_ObjectStream::CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj)

+{

+    m_ObjNumArray.Add(dwObjNum);

+    m_OffsetArray.Add(m_Buffer.GetLength());

+    m_Buffer << pObj;

+    return 1;

+}

+FX_INT32 CPDF_ObjectStream::CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize)

+{

+    m_ObjNumArray.Add(dwObjNum);

+    m_OffsetArray.Add(m_Buffer.GetLength());

+    m_Buffer.AppendBlock(pBuffer, dwSize);

+    return 1;

+}

+FX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator)

+{

+    FXSYS_assert(pCreator);

+    if (m_ObjNumArray.GetSize() == 0) {

+        return 0;

+    }

+    CFX_FileBufferArchive *pFile = &pCreator->m_File;

+    CPDF_CryptoHandler *pHandler = pCreator->m_pCryptoHandler;

+    FX_FILESIZE ObjOffset = pCreator->m_Offset;

+    if (!m_dwObjNum) {

+        m_dwObjNum = ++pCreator->m_dwLastObjNum;

+    }

+    CFX_ByteTextBuf tempBuffer;

+    FX_INT32 iCount = m_ObjNumArray.GetSize();

+    for (FX_INT32 i = 0; i < iCount; i++) {

+        tempBuffer << m_ObjNumArray.ElementAt(i) << FX_BSTRC(" ") << m_OffsetArray.ElementAt(i) << FX_BSTRC(" ");

+    }

+    FX_FILESIZE &offset = pCreator->m_Offset;

+    FX_INT32 len = pFile->AppendDWord(m_dwObjNum);

+    if (len < 0) {

+        return -1;

+    }

+    offset += len;

+    if ((len = pFile->AppendString(FX_BSTRC(" 0 obj\r\n<</Type /ObjStm /N "))) < 0) {

+        return -1;

+    }

+    offset += len;

+    if ((len = pFile->AppendDWord((FX_DWORD)iCount)) < 0) {

+        return -1;

+    }

+    offset += len;

+    if (pFile->AppendString(FX_BSTRC("/First ")) < 0) {

+        return -1;

+    }

+    if ((len = pFile->AppendDWord((FX_DWORD)tempBuffer.GetLength())) < 0) {

+        return -1;

+    }

+    if (pFile->AppendString(FX_BSTRC("/Length ")) < 0) {

+        return -1;

+    }

+    offset += len + 15;

+    if (!pCreator->m_bCompress && !pHandler) {

+        if ((len = pFile->AppendDWord((FX_DWORD)(tempBuffer.GetLength() + m_Buffer.GetLength()))) < 0) {

+            return -1;

+        }

+        offset += len;

+        if ((len = pFile->AppendString(FX_BSTRC(">>stream\r\n"))) < 0) {

+            return -1;

+        }

+        if (pFile->AppendBlock(tempBuffer.GetBuffer(), tempBuffer.GetLength()) < 0) {

+            return -1;

+        }

+        if (pFile->AppendBlock(m_Buffer.GetBuffer(), m_Buffer.GetLength()) < 0) {

+            return -1;

+        }

+        offset += len + tempBuffer.GetLength() + m_Buffer.GetLength();

+    } else {

+        tempBuffer << m_Buffer;

+        CPDF_FlateEncoder encoder;

+        encoder.Initialize(tempBuffer.GetBuffer(), tempBuffer.GetLength(), pCreator->m_bCompress);

+        CPDF_Encryptor encryptor;

+        encryptor.Initialize(pHandler, m_dwObjNum, encoder.m_pData, encoder.m_dwSize);

+        if ((len = pFile->AppendDWord(encryptor.m_dwSize)) < 0) {

+            return -1;

+        }

+        offset += len;

+        if (pCreator->m_bCompress) {

+            if (pFile->AppendString(FX_BSTRC("/Filter /FlateDecode")) < 0) {

+                return -1;

+            }

+            offset += 20;

+        }

+        if ((len = pFile->AppendString(FX_BSTRC(">>stream\r\n"))) < 0) {

+            return -1;

+        }

+        if (pFile->AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {

+            return -1;

+        }

+        offset += len + encryptor.m_dwSize;

+    }

+    if ((len = pFile->AppendString(FX_BSTRC("\r\nendstream\r\nendobj\r\n"))) < 0) {

+        return -1;

+    }

+    offset += len;

+    return ObjOffset;

+}

+CPDF_XRefStream::CPDF_XRefStream()

+    : m_PrevOffset(0)

+    , m_iSeg(0)

+    , m_dwTempObjNum(0)

+{

+}

+FX_BOOL CPDF_XRefStream::Start()

+{

+    m_IndexArray.RemoveAll();

+    m_Buffer.Clear();

+    m_iSeg = 0;

+    return TRUE;

+}

+FX_INT32 CPDF_XRefStream::CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj, CPDF_Creator *pCreator)

+{

+    if (!pCreator) {

+        return 0;

+    }

+    m_ObjStream.CompressIndirectObject(dwObjNum, pObj);

+    if (m_ObjStream.m_ObjNumArray.GetSize() < pCreator->m_ObjectStreamSize &&

+            m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) {

+        return 1;

+    }

+    return EndObjectStream(pCreator);

+}

+FX_INT32 CPDF_XRefStream::CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize, CPDF_Creator *pCreator)

+{

+    if (!pCreator) {

+        return 0;

+    }

+    m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize);

+    if (m_ObjStream.m_ObjNumArray.GetSize() < pCreator->m_ObjectStreamSize &&

+            m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) {

+        return 1;

+    }

+    return EndObjectStream(pCreator);

+}

+static void _AppendIndex0(CFX_ByteTextBuf& buffer, FX_BOOL bFirstObject =  TRUE)

+{

+    buffer.AppendByte(0);

+    buffer.AppendByte(0);

+    buffer.AppendByte(0);

+    buffer.AppendByte(0);

+    buffer.AppendByte(0);

+    if (bFirstObject) {

+        buffer.AppendByte(0xFF);

+        buffer.AppendByte(0xFF);

+    } else {

+        buffer.AppendByte(0);

+        buffer.AppendByte(0);

+    }

+}

+static void _AppendIndex1(CFX_ByteTextBuf& buffer, FX_FILESIZE offset)

+{

+    buffer.AppendByte(1);

+    buffer.AppendByte(FX_GETBYTEOFFSET24(offset));

+    buffer.AppendByte(FX_GETBYTEOFFSET16(offset));

+    buffer.AppendByte(FX_GETBYTEOFFSET8(offset));

+    buffer.AppendByte(FX_GETBYTEOFFSET0(offset));

+    buffer.AppendByte(0);

+    buffer.AppendByte(0);

+}

+static void _AppendIndex2(CFX_ByteTextBuf& buffer, FX_DWORD objnum, FX_INT32 index)

+{

+    buffer.AppendByte(2);

+    buffer.AppendByte(FX_GETBYTEOFFSET24(objnum));

+    buffer.AppendByte(FX_GETBYTEOFFSET16(objnum));

+    buffer.AppendByte(FX_GETBYTEOFFSET8(objnum));

+    buffer.AppendByte(FX_GETBYTEOFFSET0(objnum));

+    buffer.AppendByte(FX_GETBYTEOFFSET8(index));

+    buffer.AppendByte(FX_GETBYTEOFFSET0(index));

+}

+FX_INT32 CPDF_XRefStream::EndObjectStream(CPDF_Creator *pCreator, FX_BOOL bEOF)

+{

+    FX_FILESIZE objOffset = 0;

+    if (bEOF) {

+        objOffset = m_ObjStream.End(pCreator);

+        if (objOffset < 0) {

+            return -1;

+        }

+    }

+    FX_DWORD &dwObjStmNum = m_ObjStream.m_dwObjNum;

+    if (!dwObjStmNum) {

+        dwObjStmNum = ++pCreator->m_dwLastObjNum;

+    }

+    FX_INT32 iSize = m_ObjStream.m_ObjNumArray.GetSize();

+    FX_INT32 iSeg = m_IndexArray.GetSize() / 2;

+    if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {

+        if (m_dwTempObjNum == 0) {

+            _AppendIndex0(m_Buffer);

+            m_dwTempObjNum++;

+        }

+        FX_DWORD end_num = m_IndexArray.GetAt((iSeg - 1) * 2) + m_IndexArray.GetAt((iSeg - 1) * 2 + 1);

+        int index = 0;

+        for (; m_dwTempObjNum < end_num; m_dwTempObjNum++) {

+            FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum);

+            if (offset) {

+                if (index >= iSize || m_dwTempObjNum != m_ObjStream.m_ObjNumArray[index]) {

+                    _AppendIndex1(m_Buffer, *offset);

+                } else {

+                    _AppendIndex2(m_Buffer, dwObjStmNum, index++);

+                }

+            } else {

+                _AppendIndex0(m_Buffer, FALSE);

+            }

+        }

+        if (iSize > 0 && bEOF) {

+            pCreator->m_ObjectOffset.Add(dwObjStmNum, 1);

+            pCreator->m_ObjectSize.Add(dwObjStmNum, 1);

+            pCreator->m_ObjectOffset[dwObjStmNum] = objOffset;

+        }

+        m_iSeg = iSeg;

+        if (bEOF) {

+            m_ObjStream.Start();

+        }

+        return 1;

+    }

+    FX_INT32 &j = m_ObjStream.m_index;

+    for (int i = m_iSeg; i < iSeg; i++) {

+        FX_DWORD start = m_IndexArray.ElementAt(i * 2);

+        FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start;

+        for (FX_DWORD m = start; m < end; m++) {

+            if (j >= iSize || m != m_ObjStream.m_ObjNumArray.ElementAt(j)) {

+                _AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[m]);

+            } else {

+                _AppendIndex2(m_Buffer, dwObjStmNum, j++);

+            }

+        }

+    }

+    if (iSize > 0 && bEOF) {

+        _AppendIndex1(m_Buffer, objOffset);

+        m_IndexArray.Add(dwObjStmNum);

+        m_IndexArray.Add(1);

+        iSeg += 1;

+    }

+    m_iSeg = iSeg;

+    if (bEOF) {

+        m_ObjStream.Start();

+    }

+    return 1;

+}

+FX_BOOL CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, FX_BOOL bEOF)

+{

+    FX_FILESIZE offset_tmp = pCreator->m_Offset;

+    FX_DWORD objnum = ++pCreator->m_dwLastObjNum;

+    CFX_FileBufferArchive *pFile = &pCreator->m_File;

+    FX_BOOL bIncremental = (pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;

+    if (bIncremental) {

+        AddObjectNumberToIndexArray(objnum);

+    } else {

+        for (; m_dwTempObjNum < pCreator->m_dwLastObjNum; m_dwTempObjNum++) {

+            FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum);

+            if (offset) {

+                _AppendIndex1(m_Buffer, *offset);

+            } else {

+                _AppendIndex0(m_Buffer, FALSE);

+            }

+        }

+    }

+    _AppendIndex1(m_Buffer, offset_tmp);

+    FX_FILESIZE &offset = pCreator->m_Offset;

+    FX_INT32 len = pFile->AppendDWord(objnum);

+    if (len < 0) {

+        return FALSE;

+    }

+    offset += len;

+    if ((len = pFile->AppendString(FX_BSTRC(" 0 obj\r\n<</Type /XRef/W[1 4 2]/Index["))) < 0) {

+        return FALSE;

+    }

+    offset += len;

+    if (!bIncremental) {

+        if ((len = pFile->AppendDWord(0)) < 0) {

+            return FALSE;

+        }

+        if ((len = pFile->AppendString(FX_BSTRC(" "))) < 0) {

+            return FALSE;

+        }

+        offset += len + 1;

+        if ((len = pFile->AppendDWord(objnum + 1)) < 0) {

+            return FALSE;

+        }

+        offset += len;

+    } else {

+        FX_INT32 iSeg = m_IndexArray.GetSize() / 2;

+        for (FX_INT32 i = 0; i < iSeg; i++) {

+            if ((len = pFile->AppendDWord(m_IndexArray.ElementAt(i * 2))) < 0) {

+                return FALSE;

+            }

+            if (pFile->AppendString(FX_BSTRC(" ")) < 0) {

+                return FALSE;

+            }

+            offset += len + 1;

+            if ((len = pFile->AppendDWord(m_IndexArray.ElementAt(i * 2 + 1))) < 0) {

+                return FALSE;

+            }

+            if (pFile->AppendString(FX_BSTRC(" ")) < 0) {

+                return FALSE;

+            }

+            offset += len + 1;

+        }

+    }

+    if (pFile->AppendString(FX_BSTRC("]/Size ")) < 0) {

+        return FALSE;

+    }

+    if ((len = pFile->AppendDWord(objnum + 1)) < 0) {

+        return FALSE;

+    }

+    offset += len + 7;

+    if (m_PrevOffset > 0) {

+        if (pFile->AppendString(FX_BSTRC("/Prev ")) < 0) {

+            return -1;

+        }

+        FX_CHAR offset_buf[20];

+        FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));

+        FXSYS_i64toa(m_PrevOffset, offset_buf, 10);

+        FX_INT32 len = (FX_INT32)FXSYS_strlen(offset_buf);

+        if (pFile->AppendBlock(offset_buf, len) < 0) {

+            return -1;

+        }

+        offset += len + 6;

+    }

+    FX_BOOL bPredictor = TRUE;

+    CPDF_FlateEncoder encoder;

+    encoder.Initialize(m_Buffer.GetBuffer(), m_Buffer.GetLength(), pCreator->m_bCompress, bPredictor);

+    if (pCreator->m_bCompress) {

+        if (pFile->AppendString(FX_BSTRC("/Filter /FlateDecode")) < 0) {

+            return FALSE;

+        }

+        offset += 20;

+        if (bPredictor) {

+            if ((len = pFile->AppendString(FX_BSTRC("/DecodeParms<</Columns 7/Predictor 12>>"))) < 0) {

+                return FALSE;

+            }

+            offset += len;

+        }

+    }

+    if (pFile->AppendString(FX_BSTRC("/Length ")) < 0) {

+        return FALSE;

+    }

+    if ((len = pFile->AppendDWord(encoder.m_dwSize)) < 0) {

+        return FALSE;

+    }

+    offset += len + 8;

+    if (bEOF) {

+        if ((len = PDF_CreatorWriteTrailer(pCreator->m_pDocument, pFile, pCreator->m_pIDArray, pCreator->m_bCompress)) < 0) {

+            return -1;

+        }

+        offset += len;

+        if (pCreator->m_pEncryptDict) {

+            FX_DWORD dwEncryptObjNum = pCreator->m_pEncryptDict->GetObjNum();

+            if (dwEncryptObjNum == 0) {

+                dwEncryptObjNum = pCreator->m_dwEnryptObjNum;

+            }

+            if ((len = PDF_CreatorWriteEncrypt(pCreator->m_pEncryptDict, dwEncryptObjNum, pFile)) < 0) {

+                return -1;

+            }

+            offset += len;

+        }

+    }

+    if ((len = pFile->AppendString(FX_BSTRC(">>stream\r\n"))) < 0) {

+        return FALSE;

+    }

+    offset += len;

+    if (pFile->AppendBlock(encoder.m_pData, encoder.m_dwSize) < 0) {

+        return FALSE;

+    }

+    if ((len = pFile->AppendString(FX_BSTRC("\r\nendstream\r\nendobj\r\n"))) < 0) {

+        return FALSE;

+    }

+    offset += encoder.m_dwSize + len;

+    m_PrevOffset = offset_tmp;

+    return TRUE;

+}

+FX_BOOL CPDF_XRefStream::End(CPDF_Creator *pCreator, FX_BOOL bEOF )

+{

+    if (EndObjectStream(pCreator, bEOF) < 0) {

+        return FALSE;

+    }

+    return GenerateXRefStream(pCreator, bEOF);

+}

+FX_BOOL CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator)

+{

+    if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {

+        _AppendIndex0(m_Buffer);

+        for (FX_DWORD i = 1; i < pCreator->m_dwLastObjNum + 1; i++) {

+            FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(i);

+            if (offset) {

+                _AppendIndex1(m_Buffer, *offset);

+            } else {

+                _AppendIndex0(m_Buffer, FALSE);

+            }

+        }

+    } else {

+        FX_INT32 iSeg = m_IndexArray.GetSize() / 2;

+        for (int i = 0; i < iSeg; i++) {

+            FX_DWORD start = m_IndexArray.ElementAt(i * 2);

+            FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start;

+            for (FX_DWORD j = start; j < end; j++) {

+                _AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[j]);

+            }

+        }

+    }

+    return GenerateXRefStream(pCreator, FALSE);

+}

+FX_BOOL CPDF_XRefStream::AddObjectNumberToIndexArray(FX_DWORD objnum)

+{

+    FX_INT32 iSize = m_IndexArray.GetSize();

+    if (iSize == 0) {

+        m_IndexArray.Add(objnum);

+        m_IndexArray.Add(1);

+    } else {

+        FXSYS_assert(iSize > 1);

+        FX_DWORD startobjnum = m_IndexArray.ElementAt(iSize - 2);

+        FX_INT32 iCount = m_IndexArray.ElementAt(iSize - 1);

+        if (objnum == startobjnum + iCount) {

+            m_IndexArray[iSize - 1] = iCount + 1;

+        } else {

+            m_IndexArray.Add(objnum);

+            m_IndexArray.Add(1);

+        }

+    }

+    return TRUE;

+}

+CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc)

+{

+    m_pDocument = pDoc;

+    m_pParser = (CPDF_Parser*)pDoc->m_pParser;

+    m_bCompress = TRUE;

+    if (m_pParser) {

+        m_pEncryptDict = m_pParser->GetEncryptDict();

+        m_pCryptoHandler = m_pParser->GetCryptoHandler();

+    } else {

+        m_pEncryptDict = NULL;

+        m_pCryptoHandler = NULL;

+    }

+    m_bSecurityChanged = FALSE;

+    m_bStandardSecurity = FALSE;

+    m_pMetadata = NULL;

+    m_bEncryptCloned = FALSE;

+    m_bEncryptMetadata = FALSE;

+    m_Offset = 0;

+    m_iStage = -1;

+    m_dwFlags = 0;

+    m_Pos = NULL;

+    m_XrefStart = 0;

+    m_pXRefStream = NULL;

+    m_ObjectStreamSize = 200;

+    m_dwLastObjNum = m_pDocument->GetLastObjNum();

+    m_pIDArray = NULL;

+    m_FileVersion = 0;

+    m_dwEnryptObjNum = 0;

+    m_bNewCrypto = FALSE;

+}

+CPDF_Creator::~CPDF_Creator()

+{

+    ResetStandardSecurity();

+    if (m_bEncryptCloned && m_pEncryptDict) {

+        m_pEncryptDict->Release();

+        m_pEncryptDict = NULL;

+    }

+    Clear();

+}

+static FX_BOOL _IsXRefNeedEnd(CPDF_XRefStream* pXRef, FX_DWORD flag)

+{

+    if (!(flag & FPDFCREATE_INCREMENTAL)) {

+        return FALSE;

+    }

+    FX_INT32 iSize = pXRef->m_IndexArray.GetSize() / 2;

+    FX_INT32 iCount = 0;

+    for (FX_INT32 i = 0; i < iSize; i++) {

+        iCount += pXRef->m_IndexArray.ElementAt(i * 2 + 1);

+    }

+    return (iCount >= PDF_XREFSTREAM_MAXSIZE);

+}

+FX_INT32 CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj)

+{

+    if (!m_pXRefStream) {

+        return 1;

+    }

+    FX_DWORD objnum = pObj->GetObjNum();

+    if (m_pParser && m_pParser->m_ObjVersion.GetSize() > (FX_INT32)objnum && m_pParser->m_ObjVersion[objnum] > 0) {

+        return 1;

+    }

+    if (pObj->GetType() == PDFOBJ_NUMBER) {

+        return 1;

+    }

+    CPDF_Dictionary *pDict = pObj->GetDict();

+    if (pObj->GetType() == PDFOBJ_STREAM) {

+        if (pDict && pDict->GetString(FX_BSTRC("Type")) == FX_BSTRC("XRef")) {

+            return 0;

+        }

+        return 1;

+    }

+    if (pDict) {

+        if (pDict == m_pDocument->m_pRootDict || pDict == m_pEncryptDict) {

+            return 1;

+        }

+        if (IsSignatureDict(pDict)) {

+            return 1;

+        }

+        if (pDict->GetString(FX_BSTRC("Type")) == FX_BSTRC("Page")) {

+            return 1;

+        }

+    }

+    m_pXRefStream->AddObjectNumberToIndexArray(objnum);

+    if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0) {

+        return -1;

+    }

+    if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {

+        return 0;

+    }

+    if (!m_pXRefStream->End(this)) {

+        return -1;

+    }

+    if (!m_pXRefStream->Start()) {

+        return -1;

+    }

+    return 0;

+}

+FX_INT32 CPDF_Creator::WriteIndirectObjectToStream(FX_DWORD objnum, FX_LPCBYTE pBuffer, FX_DWORD dwSize)

+{

+    if (!m_pXRefStream) {

+        return 1;

+    }

+    m_pXRefStream->AddObjectNumberToIndexArray(objnum);

+    FX_INT32 iRet = m_pXRefStream->CompressIndirectObject(objnum, pBuffer, dwSize, this);

+    if (iRet < 1) {

+        return iRet;

+    }

+    if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {

+        return 0;

+    }

+    if (!m_pXRefStream->End(this)) {

+        return -1;

+    }

+    if (!m_pXRefStream->Start()) {

+        return -1;

+    }

+    return 0;

+}

+FX_INT32 CPDF_Creator::AppendObjectNumberToXRef(FX_DWORD objnum)

+{

+    if (!m_pXRefStream) {

+        return 1;

+    }

+    m_pXRefStream->AddObjectNumberToIndexArray(objnum);

+    if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {

+        return 0;

+    }

+    if (!m_pXRefStream->End(this)) {

+        return -1;

+    }

+    if (!m_pXRefStream->Start()) {

+        return -1;

+    }

+    return 0;

+}

+FX_INT32 CPDF_Creator::WriteStream(const CPDF_Object* pStream, FX_DWORD objnum, CPDF_CryptoHandler* pCrypto)

+{

+    CPDF_FlateEncoder encoder;

+    encoder.Initialize((CPDF_Stream*)pStream, pStream == m_pMetadata ? FALSE : m_bCompress);

+    CPDF_Encryptor encryptor;

+    if(!encryptor.Initialize(pCrypto, objnum, encoder.m_pData, encoder.m_dwSize)) {

+        return -1;

+    }

+    if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC("Length")) != encryptor.m_dwSize) {

+        encoder.CloneDict();

+        encoder.m_pDict->SetAtInteger(FX_BSTRC("Length"), encryptor.m_dwSize);

+    }

+    if (WriteDirectObj(objnum, encoder.m_pDict) < 0) {

+        return -1;

+    }

+    int len = m_File.AppendString(FX_BSTRC("stream\r\n"));

+    if (len < 0) {

+        return -1;

+    }

+    m_Offset += len;

+    if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {

+        return -1;

+    }

+    m_Offset += encryptor.m_dwSize;

+    if ((len = m_File.AppendString(FX_BSTRC("\r\nendstream"))) < 0) {

+        return -1;

+    }

+    m_Offset += len;

+    return 1;

+}

+FX_INT32 CPDF_Creator::WriteIndirectObj(FX_DWORD objnum, const CPDF_Object* pObj)

+{

+    FX_INT32 len = m_File.AppendDWord(objnum);

+    if (len < 0) {

+        return -1;

+    }

+    m_Offset += len;

+    if ((len = m_File.AppendString(FX_BSTRC(" 0 obj\r\n"))) < 0) {

+        return -1;

+    }

+    m_Offset += len;

+    if (pObj->GetType() == PDFOBJ_STREAM) {

+        CPDF_CryptoHandler *pHandler = NULL;

+        pHandler = (pObj == m_pMetadata && !m_bEncryptMetadata) ? NULL : m_pCryptoHandler;

+        if (WriteStream(pObj, objnum, pHandler) < 0) {

+            return -1;

+        }

+    } else {

+        if (WriteDirectObj(objnum, pObj) < 0) {

+            return -1;

+        }

+    }

+    if ((len = m_File.AppendString(FX_BSTRC("\r\nendobj\r\n"))) < 0) {

+        return -1;

+    }

+    m_Offset += len;

+    if (AppendObjectNumberToXRef(objnum) < 0) {

+        return -1;

+    }

+    return 0;

+}

+FX_INT32 CPDF_Creator::WriteIndirectObj(const CPDF_Object* pObj)

+{

+    FX_INT32 iRet = WriteIndirectObjectToStream(pObj);

+    if (iRet < 1) {

+        return iRet;

+    }

+    return WriteIndirectObj(pObj->GetObjNum(), pObj);

+}

+FX_INT32 CPDF_Creator::WriteDirectObj(FX_DWORD objnum, const CPDF_Object* pObj, FX_BOOL bEncrypt)

+{

+    FX_INT32 len = 0;

+    if (pObj == NULL) {

+        if (m_File.AppendString(FX_BSTRC(" null")) < 0) {

+            return -1;

+        }

+        m_Offset += 5;

+        return 1;

+    }

+    switch (pObj->GetType()) {

+        case PDFOBJ_NULL:

+            if (m_File.AppendString(FX_BSTRC(" null")) < 0) {

+                return -1;

+            }

+            m_Offset += 5;

+            break;

+        case PDFOBJ_BOOLEAN:

+        case PDFOBJ_NUMBER:

+            if (m_File.AppendString(FX_BSTRC(" ")) < 0) {

+                return -1;

+            }

+            if ((len = m_File.AppendString(pObj->GetString())) < 0) {

+                return -1;

+            }

+            m_Offset += len + 1;

+            break;

+        case PDFOBJ_STRING: {

+                CFX_ByteString str = pObj->GetString();

+                FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();

+                if (m_pCryptoHandler == NULL || !bEncrypt) {

+                    CFX_ByteString content = PDF_EncodeString(str, bHex);

+                    if ((len = m_File.AppendString(content)) < 0) {

+                        return -1;

+                    }

+                    m_Offset += len;

+                    break;

+                }

+                CPDF_Encryptor encryptor;

+                encryptor.Initialize(m_pCryptoHandler, objnum, (FX_LPBYTE)(FX_LPCSTR)str, str.GetLength());

+                CFX_ByteString content = PDF_EncodeString(CFX_ByteString((FX_LPCSTR)encryptor.m_pData, encryptor.m_dwSize), bHex);

+                if ((len = m_File.AppendString(content)) < 0) {

+                    return -1;

+                }

+                m_Offset += len;

+                break;

+            }

+        case PDFOBJ_STREAM: {

+                CPDF_FlateEncoder encoder;

+                encoder.Initialize((CPDF_Stream*)pObj, m_bCompress);

+                CPDF_Encryptor encryptor;

+                CPDF_CryptoHandler* pHandler = m_pCryptoHandler;

+                encryptor.Initialize(pHandler, objnum, encoder.m_pData, encoder.m_dwSize);

+                if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC("Length")) != encryptor.m_dwSize) {

+                    encoder.CloneDict();

+                    encoder.m_pDict->SetAtInteger(FX_BSTRC("Length"), encryptor.m_dwSize);

+                }

+                if (WriteDirectObj(objnum, encoder.m_pDict) < 0) {

+                    return -1;

+                }

+                if ((len = m_File.AppendString(FX_BSTRC("stream\r\n"))) < 0) {

+                    return -1;

+                }

+                m_Offset += len;

+                if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {

+                    return -1;

+                }

+                m_Offset += encryptor.m_dwSize;

+                if ((len = m_File.AppendString(FX_BSTRC("\r\nendstream"))) < 0) {

+                    return -1;

+                }

+                m_Offset += len;

+                break;

+            }

+        case PDFOBJ_NAME: {

+                if (m_File.AppendString(FX_BSTRC("/")) < 0) {

+                    return -1;

+                }

+                CFX_ByteString str = pObj->GetString();

+                if ((len = m_File.AppendString(PDF_NameEncode(str))) < 0) {

+                    return -1;

+                }

+                m_Offset += len + 1;

+                break;

+            }

+        case PDFOBJ_REFERENCE: {

+                if (m_File.AppendString(FX_BSTRC(" ")) < 0) {

+                    return -1;

+                }

+                CPDF_Reference* p = (CPDF_Reference*)pObj;

+                if ((len = m_File.AppendDWord(p->GetRefObjNum())) < 0) {

+                    return -1;

+                }

+                if (m_File.AppendString(FX_BSTRC(" 0 R")) < 0) {

+                    return -1;

+                }

+                m_Offset += len + 5;

+                break;

+            }

+        case PDFOBJ_ARRAY: {

+                if (m_File.AppendString(FX_BSTRC("[")) < 0) {

+                    return -1;

+                }

+                m_Offset += 1;

+                CPDF_Array* p = (CPDF_Array*)pObj;

+                for (FX_DWORD i = 0; i < p->GetCount(); i ++) {

+                    CPDF_Object* pElement = p->GetElement(i);

+                    if (pElement->GetObjNum()) {

+                        if (m_File.AppendString(FX_BSTRC(" ")) < 0) {

+                            return -1;

+                        }

+                        if ((len = m_File.AppendDWord(pElement->GetObjNum())) < 0) {

+                            return -1;

+                        }

+                        if (m_File.AppendString(FX_BSTRC(" 0 R")) < 0) {

+                            return -1;

+                        }

+                        m_Offset += len + 5;

+                    } else {

+                        if (WriteDirectObj(objnum, pElement) < 0) {

+                            return -1;

+                        }

+                    }

+                }

+                if (m_File.AppendString(FX_BSTRC("]")) < 0) {

+                    return -1;

+                }

+                m_Offset += 1;

+                break;

+            }

+        case PDFOBJ_DICTIONARY: {

+                if (m_pCryptoHandler == NULL || pObj == m_pEncryptDict) {

+                    return PDF_CreatorAppendObject(pObj, &m_File, m_Offset);

+                }

+                if (m_File.AppendString(FX_BSTRC("<<")) < 0) {

+                    return -1;

+                }

+                m_Offset += 2;

+                CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;

+                FX_BOOL bSignDict = IsSignatureDict(p);

+                FX_POSITION pos = p->GetStartPos();

+                while (pos) {

+                    FX_BOOL bSignValue = FALSE;

+                    CFX_ByteString key;

+                    CPDF_Object* pValue = p->GetNextElement(pos, key);

+                    if (m_File.AppendString(FX_BSTRC("/")) < 0) {

+                        return -1;

+                    }

+                    if ((len = m_File.AppendString(PDF_NameEncode(key))) < 0) {

+                        return -1;

+                    }

+                    m_Offset += len + 1;

+                    if (bSignDict && key == FX_BSTRC("Contents")) {

+                        bSignValue = TRUE;

+                    }

+                    if (pValue->GetObjNum()) {

+                        if (m_File.AppendString(FX_BSTRC(" ")) < 0) {

+                            return -1;

+                        }

+                        if ((len = m_File.AppendDWord(pValue->GetObjNum())) < 0) {

+                            return -1;

+                        }

+                        if (m_File.AppendString(FX_BSTRC(" 0 R ")) < 0) {

+                            return -1;

+                        }

+                        m_Offset += len + 6;

+                    } else {

+                        if (WriteDirectObj(objnum, pValue, !bSignValue) < 0) {

+                            return -1;

+                        }

+                    }

+                }

+                if (m_File.AppendString(FX_BSTRC(">>")) < 0) {

+                    return -1;

+                }

+                m_Offset += 2;

+                break;

+            }

+    }

+    return 1;

+}

+FX_INT32 CPDF_Creator::WriteOldIndirectObject(FX_DWORD objnum)

+{

+    if(m_pParser->m_V5Type[objnum] == 0 || m_pParser->m_V5Type[objnum] == 255) {

+        return 0;

+    }

+    m_ObjectOffset[objnum] = m_Offset;

+    FX_LPVOID valuetemp = NULL;

+    FX_BOOL bExistInMap = m_pDocument->m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, valuetemp);

+    FX_BOOL bObjStm = (m_pParser->m_V5Type[objnum] == 2) && m_pEncryptDict && !m_pXRefStream;

+    if(m_pParser->m_bVersionUpdated || m_bSecurityChanged || bExistInMap || bObjStm) {

+        CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum);

+        if (pObj == NULL) {

+            m_ObjectOffset[objnum] = 0;

+            m_ObjectSize[objnum] = 0;

+            return 0;

+        }

+        if (WriteIndirectObj(pObj)) {

+            return -1;

+        }

+        if (!bExistInMap) {

+            m_pDocument->ReleaseIndirectObject(objnum);

+        }

+    } else {

+        FX_BYTE* pBuffer;

+        FX_DWORD size;

+        m_pParser->GetIndirectBinary(objnum, pBuffer, size);

+        if (pBuffer == NULL) {

+            return 0;

+        }

+        if (m_pParser->m_V5Type[objnum] == 2) {

+            if (m_pXRefStream) {

+                if (WriteIndirectObjectToStream(objnum, pBuffer, size) < 0) {

+                    FX_Free(pBuffer);

+                    return -1;

+                }

+            } else {

+                FX_INT32 len = m_File.AppendDWord(objnum);

+                if (len < 0) {

+                    return -1;

+                }

+                if (m_File.AppendString(FX_BSTRC(" 0 obj ")) < 0) {

+                    return -1;

+                }

+                m_Offset += len + 7;

+                if (m_File.AppendBlock(pBuffer, size) < 0) {

+                    return -1;

+                }

+                m_Offset += size;

+                if (m_File.AppendString(FX_BSTRC("\r\nendobj\r\n")) < 0) {

+                    return -1;

+                }

+                m_Offset += 10;

+            }

+        } else {

+            if (m_File.AppendBlock(pBuffer, size) < 0) {

+                return -1;

+            }

+            m_Offset += size;

+            if(AppendObjectNumberToXRef(objnum) < 0) {

+                return -1;

+            }

+        }

+        FX_Free(pBuffer);

+    }

+    return 1;

+}

+FX_INT32 CPDF_Creator::WriteOldObjs(IFX_Pause *pPause)

+{

+    FX_DWORD nOldSize = m_pParser->m_CrossRef.GetSize();

+    FX_DWORD objnum = (FX_DWORD)(FX_UINTPTR)m_Pos;

+    for(; objnum < nOldSize; objnum ++) {

+        FX_INT32 iRet = WriteOldIndirectObject(objnum);

+        if (!iRet) {

+            continue;

+        }

+        if (iRet < 0) {

+            return iRet;

+        }

+        m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]);

+        if (pPause && pPause->NeedToPauseNow()) {

+            m_Pos = (FX_LPVOID)(FX_UINTPTR)(objnum + 1);

+            return 1;

+        }

+    }

+    return 0;

+}

+FX_INT32 CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause *pPause)

+{

+    FX_INT32 iCount = m_NewObjNumArray.GetSize();

+    FX_INT32 index = (FX_INT32)(FX_UINTPTR)m_Pos;

+    while (index < iCount) {

+        FX_DWORD objnum = m_NewObjNumArray.ElementAt(index);

+        CPDF_Object *pObj = NULL;

+        m_pDocument->m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pObj);

+        if (NULL == pObj) {

+            ++index;

+            continue;

+        }

+        m_ObjectOffset[objnum] = m_Offset;

+        if (WriteIndirectObj(pObj)) {

+            return -1;

+        }

+        m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]);

+        index++;

+        if (pPause && pPause->NeedToPauseNow()) {

+            m_Pos = (FX_POSITION)(FX_UINTPTR)index;

+            return 1;

+        }

+    }

+    return 0;

+}

+void CPDF_Creator::InitOldObjNumOffsets()

+{

+    if (!m_pParser) {

+        return;

+    }

+    FX_DWORD j = 0;

+    FX_DWORD dwStart = 0;

+    FX_DWORD dwEnd = m_pParser->GetLastObjNum();

+    while (dwStart <= dwEnd) {

+        while (dwStart <= dwEnd && (m_pParser->m_V5Type[dwStart] == 0 || m_pParser->m_V5Type[dwStart] == 255)) {

+            dwStart++;

+        }

+        if (dwStart > dwEnd) {

+            break;

+        }

+        j = dwStart;

+        while (j <= dwEnd && m_pParser->m_V5Type[j] != 0 && m_pParser->m_V5Type[j] != 255) {

+            j++;

+        }

+        m_ObjectOffset.Add(dwStart, j - dwStart);

+        m_ObjectSize.Add(dwStart, j - dwStart);

+        dwStart = j;

+    }

+}

+void CPDF_Creator::InitNewObjNumOffsets()

+{

+    FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;

+    FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0;

+    FX_DWORD nOldSize = m_pParser ? m_pParser->m_CrossRef.GetSize() : 0;

+    FX_POSITION pos = m_pDocument->m_IndirectObjs.GetStartPosition();

+    while (pos) {

+        size_t key = 0;

+        CPDF_Object* pObj;

+        m_pDocument->m_IndirectObjs.GetNextAssoc(pos, (FX_LPVOID&)key, (FX_LPVOID&)pObj);

+        FX_DWORD objnum = (FX_DWORD)key;

+        if (pObj->GetObjNum() == -1) {

+            continue;

+        }

+        if (bIncremental) {

+            if (!pObj->IsModified()) {

+                continue;

+            }

+        } else {

+            if (objnum < nOldSize && m_pParser->m_V5Type[objnum] != 0) {

+                continue;

+            }

+        }

+        AppendNewObjNum(objnum);

+    }

+    FX_INT32 iCount = m_NewObjNumArray.GetSize();

+    if (iCount == 0) {

+        return;

+    }

+    FX_INT32 i = 0;

+    FX_DWORD dwStartObjNum = 0;

+    FX_BOOL bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0;

+    while (i < iCount) {

+        dwStartObjNum = m_NewObjNumArray.ElementAt(i);

+        if ((bIncremental && (bNoOriginal || bCrossRefValid)) || !m_ObjectOffset.GetPtrAt(dwStartObjNum)) {

+            break;

+        }

+        i++;

+    }

+    if (i >= iCount) {

+        return;

+    }

+    FX_DWORD dwLastObjNum = dwStartObjNum;

+    i++;

+    FX_BOOL bNewStart = FALSE;

+    for (; i < iCount; i++) {

+        FX_DWORD dwCurObjNum = m_NewObjNumArray.ElementAt(i);

+        FX_BOOL bExist = (dwCurObjNum < nOldSize && m_ObjectOffset.GetPtrAt(dwCurObjNum) != NULL);

+        if (bExist || dwCurObjNum - dwLastObjNum > 1) {

+            if (!bNewStart) {

+                m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);

+                m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);

+            }

+            dwStartObjNum = dwCurObjNum;

+        }

+        if (bNewStart) {

+            dwStartObjNum = dwCurObjNum;

+        }

+        bNewStart = bExist;

+        dwLastObjNum = dwCurObjNum;

+    }

+    m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);

+    m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);

+}

+void CPDF_Creator::AppendNewObjNum(FX_DWORD objbum)

+{

+    FX_INT32 iStart = 0, iFind = 0;

+    FX_INT32 iEnd = m_NewObjNumArray.GetUpperBound();

+    while (iStart <= iEnd) {

+        FX_INT32 iMid = (iStart + iEnd) / 2;

+        FX_DWORD dwMid = m_NewObjNumArray.ElementAt(iMid);

+        if (objbum < dwMid) {

+            iEnd = iMid - 1;

+        } else {

+            if (iMid == iEnd) {

+                iFind = iMid + 1;

+                break;

+            }

+            FX_DWORD dwNext = m_NewObjNumArray.ElementAt(iMid + 1);

+            if (objbum < dwNext) {

+                iFind = iMid + 1;

+                break;

+            }

+            iStart = iMid + 1;

+        }

+    }

+    m_NewObjNumArray.InsertAt(iFind, objbum);

+}

+FX_INT32 CPDF_Creator::WriteDoc_Stage1(IFX_Pause *pPause)

+{

+    FXSYS_assert(m_iStage > -1 || m_iStage < 20);

+    if (m_iStage == 0) {

+        if (m_pParser == NULL) {

+            m_dwFlags &= ~FPDFCREATE_INCREMENTAL;

+        }

+        if (m_bSecurityChanged && (m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0) {

+            m_dwFlags &= ~FPDFCREATE_INCREMENTAL;

+        }

+        m_pMetadata = m_pDocument->GetRoot()->GetElementValue(FX_BSTRC("Metadata"));

+        if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) {

+            m_pXRefStream = FX_NEW CPDF_XRefStream;

+            m_pXRefStream->Start();

+            if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser) {

+                FX_FILESIZE prev = m_pParser->GetLastXRefOffset();

+                m_pXRefStream->m_PrevOffset = prev;

+            }

+        }

+        m_iStage = 10;

+    }

+    if (m_iStage == 10) {

+        if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0) {

+            if (m_File.AppendString(FX_BSTRC("%PDF-1.")) < 0) {

+                return -1;

+            }

+            m_Offset += 7;

+            FX_INT32 version = 7;

+            if (m_FileVersion) {

+                version = m_FileVersion;

+            } else if (m_pParser) {

+                version = m_pParser->GetFileVersion();

+            }

+            FX_INT32 len = m_File.AppendDWord(version % 10);

+            if (len < 0) {

+                return -1;

+            }

+            m_Offset += len;

+            if ((len = m_File.AppendString(FX_BSTRC("\r\n%\xA1\xB3\xC5\xD7\r\n"))) < 0) {

+                return -1;

+            }

+            m_Offset += len;

+            InitOldObjNumOffsets();

+            m_iStage = 20;

+        } else {

+            IFX_FileRead* pSrcFile = m_pParser->GetFileAccess();

+            m_Offset = pSrcFile->GetSize();

+            m_Pos = (FX_LPVOID)(FX_UINTPTR)m_Offset;

+            m_iStage = 15;

+        }

+    }

+    if (m_iStage == 15) {

+        if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && m_Pos) {

+            IFX_FileRead* pSrcFile = m_pParser->GetFileAccess();

+            FX_BYTE buffer[4096];

+            FX_DWORD src_size = (FX_DWORD)(FX_UINTPTR)m_Pos;

+            while (src_size) {

+                FX_DWORD block_size = src_size > 4096 ? 4096 : src_size;

+                if (!pSrcFile->ReadBlock(buffer, m_Offset - src_size, block_size)) {

+                    return -1;

+                }

+                if (m_File.AppendBlock(buffer, block_size) < 0) {

+                    return -1;

+                }

+                src_size -= block_size;

+                if (pPause && pPause->NeedToPauseNow()) {

+                    m_Pos = (FX_LPVOID)(FX_UINTPTR)src_size;

+                    return 1;

+                }

+            }

+        }

+        if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && m_pParser->GetLastXRefOffset() == 0) {

+            InitOldObjNumOffsets();

+            FX_DWORD dwEnd = m_pParser->GetLastObjNum();

+            FX_BOOL bObjStm = (m_dwFlags & FPDFCREATE_OBJECTSTREAM) != 0;

+            for (FX_DWORD objnum = 0; objnum <= dwEnd; objnum++) {

+                if (m_pParser->m_V5Type[objnum] == 0 || m_pParser->m_V5Type[objnum] == 255) {

+                    continue;

+                }

+                m_ObjectOffset[objnum] = m_pParser->m_CrossRef[objnum];

+                if (bObjStm) {

+                    m_pXRefStream->AddObjectNumberToIndexArray(objnum);

+                }

+            }

+            if (bObjStm) {

+                m_pXRefStream->EndXRefStream(this);

+                m_pXRefStream->Start();

+            }

+        }

+        m_iStage = 20;

+    }

+    InitNewObjNumOffsets();

+    return m_iStage;

+}

+FX_INT32 CPDF_Creator::WriteDoc_Stage2(IFX_Pause *pPause)

+{

+    FXSYS_assert(m_iStage >= 20 || m_iStage < 30);

+    if (m_iStage == 20) {

+        if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 && m_pParser) {

+            m_Pos = (FX_LPVOID)(FX_UINTPTR)0;

+            m_iStage = 21;

+        } else {

+            m_iStage = 25;

+        }

+    }

+    if (m_iStage == 21) {

+        FX_INT32 iRet = WriteOldObjs(pPause);

+        if (iRet) {

+            return iRet;

+        }

+        m_iStage = 25;

+    }

+    if (m_iStage == 25) {

+        m_Pos = (FX_LPVOID)(FX_UINTPTR)0;

+        m_iStage = 26;

+    }

+    if (m_iStage == 26) {

+        FX_INT32 iRet = WriteNewObjs((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0, pPause);

+        if (iRet) {

+            return iRet;

+        }

+        m_iStage = 27;

+    }

+    if (m_iStage == 27) {

+        if (NULL != m_pEncryptDict && 0 == m_pEncryptDict->GetObjNum()) {

+            m_dwLastObjNum += 1;

+            FX_FILESIZE saveOffset = m_Offset;

+            if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) {

+                return -1;

+            }

+            m_ObjectOffset.Add(m_dwLastObjNum, 1);

+            m_ObjectOffset[m_dwLastObjNum] = saveOffset;

+            m_ObjectSize.Add(m_dwLastObjNum, 1);

+            m_ObjectSize[m_dwLastObjNum] = m_Offset - saveOffset;

+            m_dwEnryptObjNum = m_dwLastObjNum;

+            if (m_dwFlags & FPDFCREATE_INCREMENTAL) {

+                m_NewObjNumArray.Add(m_dwLastObjNum);

+            }

+        }

+        m_iStage = 80;

+    }

+    return m_iStage;

+}

+FX_INT32 CPDF_Creator::WriteDoc_Stage3(IFX_Pause *pPause)

+{

+    FXSYS_assert(m_iStage >= 80 || m_iStage < 90);

+    FX_DWORD dwLastObjNum = m_dwLastObjNum;

+    if (m_iStage == 80) {

+        m_XrefStart = m_Offset;

+        if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) {

+            m_pXRefStream->End(this, TRUE);

+            m_XrefStart = m_pXRefStream->m_PrevOffset;

+            m_iStage = 90;

+        } else if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || !m_pParser->IsXRefStream()) {

+            if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || m_pParser->GetLastXRefOffset() == 0) {

+                CFX_ByteString str;

+                str = m_ObjectOffset.GetPtrAt(1) ? FX_BSTRC("xref\r\n") : FX_BSTRC("xref\r\n0 1\r\n0000000000 65536 f\r\n");

+                if (m_File.AppendString(str) < 0) {

+                    return -1;

+                }

+                m_Pos = (FX_LPVOID)(FX_UINTPTR)1;

+                m_iStage = 81;

+            } else {

+                if (m_File.AppendString(FX_BSTRC("xref\r\n")) < 0) {

+                    return -1;

+                }

+                m_Pos = (FX_LPVOID)(FX_UINTPTR)0;

+                m_iStage = 82;

+            }

+        } else {

+            m_iStage = 90;

+        }

+    }

+    if (m_iStage == 81) {

+        CFX_ByteString str;

+        FX_DWORD i = (FX_DWORD)(FX_UINTPTR)m_Pos, j;

+        while (i <= dwLastObjNum) {

+            while (i <= dwLastObjNum && !m_ObjectOffset.GetPtrAt(i)) {

+                i++;

+            }

+            if (i > dwLastObjNum) {

+                break;

+            }

+            j = i;

+            while (j <= dwLastObjNum && m_ObjectOffset.GetPtrAt(j)) {

+                j++;

+            }

+            if (i == 1) {

+                str.Format("0 %d\r\n0000000000 65536 f\r\n", j);

+            } else {

+                str.Format("%d %d\r\n", i, j - i);

+            }

+            if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {

+                return -1;

+            }

+            while (i < j) {

+                str.Format("%010d 00000 n\r\n", m_ObjectOffset[i ++]);

+                if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {

+                    return -1;

+                }

+            }

+            if (i > dwLastObjNum) {

+                break;

+            }

+            if (pPause && pPause->NeedToPauseNow()) {

+                m_Pos = (FX_LPVOID)(FX_UINTPTR)i;

+                return 1;

+            }

+        }

+        m_iStage = 90;

+    }

+    if (m_iStage == 82) {

+        CFX_ByteString str;

+        FX_INT32 iCount = m_NewObjNumArray.GetSize();

+        FX_INT32 i = (FX_INT32)(FX_UINTPTR)m_Pos;

+        while (i < iCount) {

+            FX_INT32 j = i;

+            FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);

+            while (j < iCount) {

+                if (++j == iCount) {

+                    break;

+                }

+                FX_DWORD dwCurrent = m_NewObjNumArray.ElementAt(j);

+                if (dwCurrent - objnum > 1) {

+                    break;

+                }

+                objnum = dwCurrent;

+            }

+            objnum = m_NewObjNumArray.ElementAt(i);

+            if (objnum == 1) {

+                str.Format("0 %d\r\n0000000000 65536 f\r\n", j - i + 1);

+            } else {

+                str.Format("%d %d\r\n", objnum, j - i);

+            }

+            if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {

+                return -1;

+            }

+            while (i < j) {

+                objnum = m_NewObjNumArray.ElementAt(i++);

+                str.Format("%010d 00000 n\r\n", m_ObjectOffset[objnum]);

+                if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {

+                    return -1;

+                }

+            }

+            if (pPause && (i % 100) == 0 && pPause->NeedToPauseNow()) {

+                m_Pos = (FX_LPVOID)(FX_UINTPTR)i;

+                return 1;

+            }

+        }

+        m_iStage = 90;

+    }

+    return m_iStage;

+}

+static FX_INT32 _OutPutIndex(CFX_FileBufferArchive* pFile, FX_FILESIZE offset)

+{

+    FXSYS_assert(pFile);

+    if (sizeof(offset) > 4) {

+        if (FX_GETBYTEOFFSET32(offset)) {

+            if (pFile->AppendByte(FX_GETBYTEOFFSET56(offset)) < 0) {

+                return -1;

+            }

+            if (pFile->AppendByte(FX_GETBYTEOFFSET48(offset)) < 0) {

+                return -1;

+            }

+            if (pFile->AppendByte(FX_GETBYTEOFFSET40(offset)) < 0) {

+                return -1;

+            }

+            if (pFile->AppendByte(FX_GETBYTEOFFSET32(offset)) < 0) {

+                return -1;

+            }

+        }

+    }

+    if (pFile->AppendByte(FX_GETBYTEOFFSET24(offset)) < 0) {

+        return -1;

+    }

+    if (pFile->AppendByte(FX_GETBYTEOFFSET16(offset)) < 0) {

+        return -1;

+    }

+    if (pFile->AppendByte(FX_GETBYTEOFFSET8(offset)) < 0) {

+        return -1;

+    }

+    if (pFile->AppendByte(FX_GETBYTEOFFSET0(offset)) < 0) {

+        return -1;

+    }

+    if (pFile->AppendByte(0) < 0) {

+        return -1;

+    }

+    return 0;

+}

+FX_INT32 CPDF_Creator::WriteDoc_Stage4(IFX_Pause *pPause)

+{

+    FXSYS_assert(m_iStage >= 90);

+    if ((m_dwFlags & FPDFCREATE_OBJECTSTREAM) == 0) {

+        FX_BOOL bXRefStream = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser->IsXRefStream();

+        if (!bXRefStream) {

+            if (m_File.AppendString(FX_BSTRC("trailer\r\n<<")) < 0) {

+                return -1;

+            }

+        } else {

+            if (m_File.AppendDWord(m_pDocument->m_LastObjNum + 1) < 0) {

+                return -1;

+            }

+            if (m_File.AppendString(FX_BSTRC(" 0 obj <<")) < 0) {

+                return -1;

+            }

+        }

+        if (m_pParser) {

+            CPDF_Dictionary* p = m_pParser->m_pTrailer;

+            FX_POSITION pos = p->GetStartPos();

+            while (pos) {

+                CFX_ByteString key;

+                CPDF_Object* pValue = p->GetNextElement(pos, key);

+                if (key == FX_BSTRC("Encrypt") || key == FX_BSTRC("Size") || key == FX_BSTRC("Filter") ||

+                        key == FX_BSTRC("Index") || key == FX_BSTRC("Length") || key == FX_BSTRC("Prev") ||

+                        key == FX_BSTRC("W") || key == FX_BSTRC("XRefStm") || key == FX_BSTRC("ID")) {

+                    continue;

+                }

+                if (m_File.AppendString((FX_BSTRC("/"))) < 0) {

+                    return -1;

+                }

+                if (m_File.AppendString(PDF_NameEncode(key)) < 0) {

+                    return -1;

+                }

+                if (pValue->GetObjNum()) {

+                    if (m_File.AppendString(FX_BSTRC(" ")) < 0) {

+                        return -1;

+                    }

+                    if (m_File.AppendDWord(pValue->GetObjNum()) < 0) {

+                        return -1;

+                    }

+                    if (m_File.AppendString(FX_BSTRC(" 0 R ")) < 0) {

+                        return -1;

+                    }

+                } else {

+                    FX_FILESIZE offset = 0;

+                    if (PDF_CreatorAppendObject(pValue, &m_File, offset) < 0) {

+                        return -1;

+                    }

+                }

+            }

+        } else {

+            if (m_File.AppendString(FX_BSTRC("\r\n/Root ")) < 0) {

+                return -1;

+            }

+            if (m_File.AppendDWord(m_pDocument->m_pRootDict->GetObjNum()) < 0) {

+                return -1;

+            }

+            if (m_File.AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {

+                return -1;

+            }

+            if (m_pDocument->m_pInfoDict) {

+                if (m_File.AppendString(FX_BSTRC("/Info ")) < 0) {

+                    return -1;

+                }

+                if (m_File.AppendDWord(m_pDocument->m_pInfoDict->GetObjNum()) < 0) {

+                    return -1;

+                }

+                if (m_File.AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {

+                    return -1;

+                }

+            }

+        }

+        if (m_pEncryptDict) {

+            if (m_File.AppendString(FX_BSTRC("/Encrypt")) < 0) {

+                return -1;

+            }

+            FX_DWORD dwObjNum = m_pEncryptDict->GetObjNum();

+            if (dwObjNum == 0) {

+                dwObjNum = m_pDocument->GetLastObjNum() + 1;

+            }

+            if (m_File.AppendString(FX_BSTRC(" ")) < 0) {

+                return -1;

+            }

+            if (m_File.AppendDWord(dwObjNum) < 0) {

+                return -1;

+            }

+            if (m_File.AppendString(FX_BSTRC(" 0 R ")) < 0) {

+                return -1;

+            }

+        }

+        if (m_File.AppendString(FX_BSTRC("/Size ")) < 0) {

+            return -1;

+        }

+        if (m_File.AppendDWord(m_dwLastObjNum + (bXRefStream ? 2 : 1)) < 0) {

+            return -1;

+        }

+        if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0) {

+            FX_FILESIZE prev = m_pParser->GetLastXRefOffset();

+            if (prev) {

+                if (m_File.AppendString(FX_BSTRC("/Prev ")) < 0) {

+                    return -1;

+                }

+                FX_CHAR offset_buf[20];

+                FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));

+                FXSYS_i64toa(prev, offset_buf, 10);

+                if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) {

+                    return -1;

+                }

+            }

+        }

+        if (m_pIDArray) {

+            if (m_File.AppendString((FX_BSTRC("/ID"))) < 0) {

+                return -1;

+            }

+            FX_FILESIZE offset = 0;

+            if (PDF_CreatorAppendObject(m_pIDArray, &m_File, offset) < 0) {

+                return -1;

+            }

+        }

+        if (!bXRefStream) {

+            if (m_File.AppendString(FX_BSTRC(">>")) < 0) {

+                return -1;

+            }

+        } else {

+            if (m_File.AppendString(FX_BSTRC("/W[0 4 1]/Index[")) < 0) {

+                return -1;

+            }

+            if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser && m_pParser->GetLastXRefOffset() == 0) {

+                FX_DWORD i = 0;

+                for (i = 0; i < m_dwLastObjNum; i++) {

+                    if (!m_ObjectOffset.GetPtrAt(i)) {

+                        continue;

+                    }

+                    if (m_File.AppendDWord(i) < 0) {

+                        return -1;

+                    }

+                    if (m_File.AppendString(FX_BSTRC(" 1 ")) < 0) {

+                        return -1;

+                    }

+                }

+                if (m_File.AppendString(FX_BSTRC("]/Length ")) < 0) {

+                    return -1;

+                }

+                if (m_File.AppendDWord(m_dwLastObjNum * 5) < 0) {

+                    return -1;

+                }

+                if (m_File.AppendString(FX_BSTRC(">>stream\r\n")) < 0) {

+                    return -1;

+                }

+                for (i = 0; i < m_dwLastObjNum; i++) {

+                    FX_FILESIZE* offset = m_ObjectOffset.GetPtrAt(i);

+                    if (!offset) {

+                        continue;

+                    }

+                    _OutPutIndex(&m_File, *offset);

+                }

+            } else {

+                int count = m_NewObjNumArray.GetSize();

+                FX_INT32 i = 0;

+                for (i = 0; i < count; i++) {

+                    FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);

+                    if (m_File.AppendDWord(objnum) < 0) {

+                        return -1;

+                    }

+                    if (m_File.AppendString(FX_BSTRC(" 1 ")) < 0) {

+                        return -1;

+                    }

+                }

+                if (m_File.AppendString(FX_BSTRC("]/Length ")) < 0) {

+                    return -1;

+                }

+                if (m_File.AppendDWord(count * 5) < 0) {

+                    return -1;

+                }

+                if (m_File.AppendString(FX_BSTRC(">>stream\r\n")) < 0) {

+                    return -1;

+                }

+                for (i = 0; i < count; i++) {

+                    FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);

+                    FX_FILESIZE offset = m_ObjectOffset[objnum];

+                    _OutPutIndex(&m_File, offset);

+                }

+            }

+            if (m_File.AppendString(FX_BSTRC("\r\nendstream")) < 0) {

+                return -1;

+            }

+        }

+    }

+    if (m_File.AppendString(FX_BSTRC("\r\nstartxref\r\n")) < 0) {

+        return -1;

+    }

+    FX_CHAR offset_buf[20];

+    FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));

+    FXSYS_i64toa(m_XrefStart, offset_buf, 10);

+    if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) {

+        return -1;

+    }

+    if (m_File.AppendString(FX_BSTRC("\r\n%%EOF\r\n")) < 0) {

+        return -1;

+    }

+    m_File.Flush();

+    return m_iStage = 100;

+}

+void CPDF_Creator::Clear()

+{

+    if (m_pXRefStream) {

+        delete m_pXRefStream;

+        m_pXRefStream = NULL;

+    }

+    m_File.Clear();

+    m_NewObjNumArray.RemoveAll();

+    if (m_pIDArray) {

+        m_pIDArray->Release();

+        m_pIDArray = NULL;

+    }

+}

+FX_BOOL CPDF_Creator::Create(FX_LPCSTR filename, FX_DWORD flags)

+{

+    if (!m_File.AttachFile(filename)) {

+        return FALSE;

+    }

+    FX_BOOL bRet = Create(flags);

+    if (!bRet || !(flags & FPDFCREATE_PROGRESSIVE)) {

+        Clear();

+    }

+    return bRet;

+}

+FX_BOOL CPDF_Creator::Create(FX_LPCWSTR filename, FX_DWORD flags)

+{

+    if (!m_File.AttachFile(filename)) {

+        return FALSE;

+    }

+    FX_BOOL bRet = Create(flags);

+    if (!bRet || !(flags & FPDFCREATE_PROGRESSIVE)) {

+        Clear();

+    }

+    return bRet;

+}

+FX_BOOL CPDF_Creator::Create(IFX_StreamWrite* pFile, FX_DWORD flags)

+{

+    if (!pFile) {

+        return FALSE;

+    }

+    if (!m_File.AttachFile(pFile, FALSE)) {

+        return FALSE;

+    }

+    return Create(flags);

+}

+FX_BOOL CPDF_Creator::Create(FX_DWORD flags)

+{

+    m_dwFlags = flags;

+    m_iStage = 0;

+    m_Offset = 0;

+    m_dwLastObjNum = m_pDocument->GetLastObjNum();

+    m_ObjectOffset.Clear();

+    m_ObjectSize.Clear();

+    m_NewObjNumArray.RemoveAll();

+    InitID();

+    if (flags & FPDFCREATE_PROGRESSIVE) {

+        return TRUE;

+    }

+    return Continue(NULL) > -1;

+}

+void CPDF_Creator::InitID(FX_BOOL bDefault )

+{

+    CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : NULL;

+    FX_BOOL bNewId = !m_pIDArray;

+    if (!m_pIDArray) {

+        FX_LPDWORD pBuffer = NULL;

+        m_pIDArray = CPDF_Array::Create();

+        CPDF_Object* pID1 = pOldIDArray->GetElement(0);

+        if (pID1) {

+            m_pIDArray->Add(pID1->Clone());

+        } else {

+            pBuffer = FX_Alloc(FX_DWORD, 4);

+            PDF_GenerateFileID((FX_DWORD)(FX_UINTPTR)this, m_dwLastObjNum, pBuffer);

+            CFX_ByteStringC bsBuffer((FX_LPCBYTE)pBuffer, 4 * sizeof(FX_DWORD));

+            m_pIDArray->Add(CPDF_String::Create(bsBuffer, TRUE), m_pDocument);

+        }

+        if (pBuffer) {

+            FX_Free(pBuffer);

+        }

+    }

+    if (!bDefault) {

+        return;

+    }

+    if (pOldIDArray) {

+        CPDF_Object* pID2 = pOldIDArray->GetElement(1);

+        if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) {

+            m_pIDArray->Add(pID2->Clone());

+            return;

+        }

+        FX_LPDWORD pBuffer = FX_Alloc(FX_DWORD, 4);

+        PDF_GenerateFileID((FX_DWORD)(FX_UINTPTR)this, m_dwLastObjNum, pBuffer);

+        CFX_ByteStringC bsBuffer((FX_LPCBYTE)pBuffer, 4 * sizeof(FX_DWORD));

+        m_pIDArray->Add(CPDF_String::Create(bsBuffer, TRUE), m_pDocument);

+        FX_Free(pBuffer);

+        return;

+    }

+    m_pIDArray->Add(m_pIDArray->GetElement(0)->Clone());

+    if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) {

+        if (m_pEncryptDict->GetString(FX_BSTRC("Filter")) == FX_BSTRC("Standard")) {

+            CPDF_StandardSecurityHandler handler;

+            CFX_ByteString user_pass = m_pParser->GetPassword();

+            FX_DWORD flag = PDF_ENCRYPT_CONTENT;

+            handler.OnCreate(m_pEncryptDict, m_pIDArray, (FX_LPCBYTE)user_pass, user_pass.GetLength(), flag);

+            if (m_pCryptoHandler && m_bNewCrypto) {

+                delete m_pCryptoHandler;

+            }

+            m_pCryptoHandler = FX_NEW CPDF_StandardCryptoHandler;

+            m_pCryptoHandler->Init(m_pEncryptDict, &handler);

+            m_bNewCrypto = TRUE;

+            m_bSecurityChanged = TRUE;

+        }

+    }

+}

+FX_INT32 CPDF_Creator::Continue(IFX_Pause *pPause)

+{

+    if (m_iStage < 0) {

+        return m_iStage;

+    }

+    FX_INT32 iRet;

+    while (m_iStage < 100) {

+        if (m_iStage < 20) {

+            iRet = WriteDoc_Stage1(pPause);

+        } else if (m_iStage < 30) {

+            iRet = WriteDoc_Stage2(pPause);

+        } else if (m_iStage < 90) {

+            iRet = WriteDoc_Stage3(pPause);

+        } else {

+            iRet = WriteDoc_Stage4(pPause);

+        }

+        if (iRet < m_iStage) {

+            break;

+        }

+    }

+    if (iRet < 1 || m_iStage == 100) {

+        m_iStage = -1;

+        Clear();

+        return iRet > 99 ? 0 : (iRet < 1 ? -1 : iRet);

+    }

+    return m_iStage;

+}

+FX_BOOL CPDF_Creator::SetFileVersion(FX_INT32 fileVersion )

+{

+    if (fileVersion < 10 || fileVersion > 17) {

+        return FALSE;

+    }

+    m_FileVersion = fileVersion;

+    return TRUE;

+}

+void CPDF_Creator::ResetStandardSecurity()

+{

+    if ((m_bStandardSecurity || m_bNewCrypto) && m_pCryptoHandler) {

+        delete m_pCryptoHandler;

+        m_pCryptoHandler = NULL;

+    }

+    m_bNewCrypto = FALSE;

+    if (!m_bStandardSecurity) {

+        return;

+    }

+    if (m_pEncryptDict) {

+        m_pEncryptDict->Release();

+        m_pEncryptDict = NULL;

+    }

+    m_bStandardSecurity = FALSE;

+}

diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
new file mode 100644
index 0000000..9157b96
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
@@ -0,0 +1,1205 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../fpdf_page/pageint.h"

+#include <limits.h>

+CPDF_Document::CPDF_Document() : CPDF_IndirectObjects(NULL)

+{

+    m_pRootDict = NULL;

+    m_pInfoDict = NULL;

+    m_bLinearized = FALSE;

+    m_dwFirstPageNo = 0;

+    m_dwFirstPageObjNum = 0;

+    m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);

+    m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);

+}

+void CPDF_Document::CreateNewDoc()

+{

+    ASSERT(m_pRootDict == NULL && m_pInfoDict == NULL);

+    m_pRootDict = FX_NEW CPDF_Dictionary;

+    m_pRootDict->SetAtName("Type", "Catalog");

+    int objnum = AddIndirectObject(m_pRootDict);

+    CPDF_Dictionary* pPages = FX_NEW CPDF_Dictionary;

+    pPages->SetAtName("Type", "Pages");

+    pPages->SetAtNumber("Count", 0);

+    pPages->SetAt("Kids", FX_NEW CPDF_Array);

+    objnum = AddIndirectObject(pPages);

+    m_pRootDict->SetAtReference("Pages", this, objnum);

+    m_pInfoDict = FX_NEW CPDF_Dictionary;

+    AddIndirectObject(m_pInfoDict);

+}

+static const FX_WCHAR g_FX_CP874Unicodes[128] = {

+    0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,

+    0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,

+    0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,

+    0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,

+    0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,

+    0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,

+    0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,

+    0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,

+    0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47,

+    0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,

+    0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,

+    0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000,

+};

+static const FX_WCHAR g_FX_CP1250Unicodes[128] = {

+    0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,

+    0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,

+    0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,

+    0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,

+    0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7,

+    0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,

+    0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7,

+    0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,

+    0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,

+    0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,

+    0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,

+    0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,

+    0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,

+    0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,

+    0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,

+    0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9,

+};

+static const FX_WCHAR g_FX_CP1251Unicodes[128] = {

+    0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,

+    0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,

+    0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,

+    0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,

+    0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,

+    0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,

+    0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,

+    0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,

+    0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,

+    0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,

+    0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,

+    0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,

+    0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,

+    0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,

+    0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,

+    0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,

+};

+static const FX_WCHAR g_FX_CP1253Unicodes[128] = {

+    0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,

+    0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,

+    0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,

+    0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,

+    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7,

+    0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,

+    0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,

+    0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,

+    0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,

+    0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,

+    0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,

+    0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,

+    0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,

+    0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000,

+};

+static const FX_WCHAR g_FX_CP1254Unicodes[128] = {

+    0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,

+    0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,

+    0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,

+    0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,

+    0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,

+    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,

+    0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,

+    0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,

+    0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,

+    0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,

+    0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,

+    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,

+    0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,

+    0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,

+    0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF,

+};

+static const FX_WCHAR g_FX_CP1255Unicodes[128] = {

+    0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,

+    0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,

+    0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7,

+    0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,

+    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,

+    0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,

+    0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7,

+    0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,

+    0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3,

+    0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,

+    0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,

+    0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,

+    0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000,

+};

+static const FX_WCHAR g_FX_CP1256Unicodes[128] = {

+    0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,

+    0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,

+    0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,

+    0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,

+    0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,

+    0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,

+    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,

+    0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,

+    0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,

+    0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,

+    0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7,

+    0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,

+    0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7,

+    0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,

+    0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,

+    0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2,

+};

+static const FX_WCHAR g_FX_CP1257Unicodes[128] = {

+    0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,

+    0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8,

+    0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,

+    0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000,

+    0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7,

+    0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,

+    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,

+    0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,

+    0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,

+    0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,

+    0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,

+    0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,

+    0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,

+    0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,

+    0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,

+    0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9,

+};

+typedef struct {

+    FX_BYTE		m_Charset;

+    const FX_WCHAR*	m_pUnicodes;

+} FX_CharsetUnicodes;

+const FX_CharsetUnicodes g_FX_CharsetUnicodes[] = {

+    { FXFONT_THAI_CHARSET, g_FX_CP874Unicodes },

+    { FXFONT_EASTEUROPE_CHARSET, g_FX_CP1250Unicodes },

+    { FXFONT_RUSSIAN_CHARSET, g_FX_CP1251Unicodes },

+    { FXFONT_GREEK_CHARSET, g_FX_CP1253Unicodes },

+    { FXFONT_TURKISH_CHARSET, g_FX_CP1254Unicodes },

+    { FXFONT_HEBREW_CHARSET, g_FX_CP1255Unicodes },

+    { FXFONT_ARABIC_CHARSET, g_FX_CP1256Unicodes },

+    { FXFONT_BALTIC_CHARSET, g_FX_CP1257Unicodes },

+};

+#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_)

+static void _InsertWidthArray(HDC hDC, int start, int end, CPDF_Array* pWidthArray)

+{

+    int size = end - start + 1;

+    int* widths = FX_Alloc(int, size);

+    GetCharWidth(hDC, start, end, widths);

+    int i;

+    for (i = 1; i < size; i ++)

+        if (widths[i] != *widths) {

+            break;

+        }

+    if (i == size) {

+        int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);

+        pWidthArray->AddInteger(first + size - 1);

+        pWidthArray->AddInteger(*widths);

+    } else {

+        CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;

+        pWidthArray->Add(pWidthArray1);

+        for (i = 0; i < size; i ++) {

+            pWidthArray1->AddInteger(widths[i]);

+        }

+    }

+    FX_Free(widths);

+}

+CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTW* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName)

+{

+    LOGFONTA lfa;

+    FXSYS_memcpy32(&lfa, pLogFont, (char*)lfa.lfFaceName - (char*)&lfa);

+    CFX_ByteString face = CFX_ByteString::FromUnicode(pLogFont->lfFaceName);

+    if (face.GetLength() >= LF_FACESIZE) {

+        return NULL;

+    }

+    FXSYS_strcpy(lfa.lfFaceName, (FX_LPCSTR)face);

+    return AddWindowsFont(&lfa, bVert, bTranslateName);

+}

+extern CFX_ByteString _FPDF_GetNameFromTT(FX_LPCBYTE name_table, FX_DWORD name);

+CFX_ByteString _FPDF_GetPSNameFromTT(HDC hDC)

+{

+    CFX_ByteString result;

+    DWORD size = ::GetFontData(hDC, 'eman', 0, NULL, 0);

+    if (size != GDI_ERROR) {

+        LPBYTE buffer = FX_Alloc(BYTE, size);

+        ::GetFontData(hDC, 'eman', 0, buffer, size);

+        result = _FPDF_GetNameFromTT(buffer, 6);

+        FX_Free(buffer);

+    }

+    return result;

+}

+CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTA* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName)

+{

+    pLogFont->lfHeight = -1000;

+    pLogFont->lfWidth = 0;

+    HGDIOBJ hFont = CreateFontIndirectA(pLogFont);

+    HDC hDC = CreateCompatibleDC(NULL);

+    hFont = SelectObject(hDC, hFont);

+    int tm_size = GetOutlineTextMetrics(hDC, 0, NULL);

+    if (tm_size == 0) {

+        hFont = SelectObject(hDC, hFont);

+        DeleteObject(hFont);

+        DeleteDC(hDC);

+        return NULL;

+    }

+    LPBYTE tm_buf = FX_Alloc(BYTE, tm_size);

+    OUTLINETEXTMETRIC* ptm = (OUTLINETEXTMETRIC*)tm_buf;

+    GetOutlineTextMetrics(hDC, tm_size, ptm);

+    int flags = 0, italicangle, ascend, descend, capheight, bbox[4];

+    if (pLogFont->lfItalic) {

+        flags |= PDFFONT_ITALIC;

+    }

+    if ((pLogFont->lfPitchAndFamily & 3) == FIXED_PITCH) {

+        flags |= PDFFONT_FIXEDPITCH;

+    }

+    if ((pLogFont->lfPitchAndFamily & 0xf8) == FF_ROMAN) {

+        flags |= PDFFONT_SERIF;

+    }

+    if ((pLogFont->lfPitchAndFamily & 0xf8) == FF_SCRIPT) {

+        flags |= PDFFONT_SCRIPT;

+    }

+    FX_BOOL bCJK = pLogFont->lfCharSet == CHINESEBIG5_CHARSET || pLogFont->lfCharSet == GB2312_CHARSET ||

+                   pLogFont->lfCharSet == HANGEUL_CHARSET || pLogFont->lfCharSet == SHIFTJIS_CHARSET;

+    CFX_ByteString basefont;

+    if (bTranslateName && bCJK) {

+        basefont = _FPDF_GetPSNameFromTT(hDC);

+    }

+    if (basefont.IsEmpty()) {

+        basefont = pLogFont->lfFaceName;

+    }

+    italicangle = ptm->otmItalicAngle / 10;

+    ascend = ptm->otmrcFontBox.top;

+    descend = ptm->otmrcFontBox.bottom;

+    capheight = ptm->otmsCapEmHeight;

+    bbox[0] = ptm->otmrcFontBox.left;

+    bbox[1] = ptm->otmrcFontBox.bottom;

+    bbox[2] = ptm->otmrcFontBox.right;

+    bbox[3] = ptm->otmrcFontBox.top;

+    FX_Free(tm_buf);

+    basefont.Replace(" ", "");

+    CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;

+    pBaseDict->SetAtName("Type", "Font");

+    CPDF_Dictionary* pFontDict = pBaseDict;

+    if (!bCJK) {

+        if (pLogFont->lfCharSet == ANSI_CHARSET || pLogFont->lfCharSet == DEFAULT_CHARSET ||

+                pLogFont->lfCharSet == SYMBOL_CHARSET) {

+            if (pLogFont->lfCharSet == SYMBOL_CHARSET) {

+                flags |= PDFFONT_SYMBOLIC;

+            } else {

+                flags |= PDFFONT_NONSYMBOLIC;

+            }

+            pBaseDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");

+        } else {

+            flags |= PDFFONT_NONSYMBOLIC;

+            int i;

+            for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++)

+                if (g_FX_CharsetUnicodes[i].m_Charset == pLogFont->lfCharSet) {

+                    break;

+                }

+            if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {

+                CPDF_Dictionary* pEncoding = FX_NEW CPDF_Dictionary;

+                pEncoding->SetAtName(FX_BSTRC("BaseEncoding"), "WinAnsiEncoding");

+                CPDF_Array* pArray = FX_NEW CPDF_Array;

+                pArray->AddInteger(128);

+                const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;

+                for (int j = 0; j < 128; j ++) {

+                    CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);

+                    if (name.IsEmpty()) {

+                        pArray->AddName(FX_BSTRC(".notdef"));

+                    } else {

+                        pArray->AddName(name);

+                    }

+                }

+                pEncoding->SetAt(FX_BSTRC("Differences"), pArray);

+                AddIndirectObject(pEncoding);

+                pBaseDict->SetAtReference(FX_BSTRC("Encoding"), this, pEncoding);

+            }

+        }

+        if (pLogFont->lfWeight > FW_MEDIUM && pLogFont->lfItalic) {

+            basefont += ",BoldItalic";

+        } else if (pLogFont->lfWeight > FW_MEDIUM) {

+            basefont += ",Bold";

+        } else if (pLogFont->lfItalic) {

+            basefont += ",Italic";

+        }

+        pBaseDict->SetAtName("Subtype", "TrueType");

+        pBaseDict->SetAtName("BaseFont", basefont);

+        pBaseDict->SetAtNumber("FirstChar", 32);

+        pBaseDict->SetAtNumber("LastChar", 255);

+        int char_widths[224];

+        GetCharWidth(hDC, 32, 255, char_widths);

+        CPDF_Array* pWidths = FX_NEW CPDF_Array;

+        for (int i = 0; i < 224; i ++) {

+            pWidths->AddInteger(char_widths[i]);

+        }

+        pBaseDict->SetAt("Widths", pWidths);

+    } else {

+        flags |= PDFFONT_NONSYMBOLIC;

+        pFontDict = FX_NEW CPDF_Dictionary;

+        CFX_ByteString cmap;

+        CFX_ByteString ordering;

+        int supplement;

+        CPDF_Array* pWidthArray = FX_NEW CPDF_Array;

+        switch (pLogFont->lfCharSet) {

+            case CHINESEBIG5_CHARSET:

+                cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";

+                ordering = "CNS1";

+                supplement = 4;

+                pWidthArray->AddInteger(1);

+                _InsertWidthArray(hDC, 0x20, 0x7e, pWidthArray);

+                break;

+            case GB2312_CHARSET:

+                cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";

+                ordering = "GB1", supplement = 2;

+                pWidthArray->AddInteger(7716);

+                _InsertWidthArray(hDC, 0x20, 0x20, pWidthArray);

+                pWidthArray->AddInteger(814);

+                _InsertWidthArray(hDC, 0x21, 0x7e, pWidthArray);

+                break;

+            case HANGEUL_CHARSET:

+                cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H";

+                ordering = "Korea1";

+                supplement = 2;

+                pWidthArray->AddInteger(1);

+                _InsertWidthArray(hDC, 0x20, 0x7e, pWidthArray);

+                break;

+            case SHIFTJIS_CHARSET:

+                cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H";

+                ordering = "Japan1";

+                supplement = 5;

+                pWidthArray->AddInteger(231);

+                _InsertWidthArray(hDC, 0x20, 0x7d, pWidthArray);

+                pWidthArray->AddInteger(326);

+                _InsertWidthArray(hDC, 0xa0, 0xa0, pWidthArray);

+                pWidthArray->AddInteger(327);

+                _InsertWidthArray(hDC, 0xa1, 0xdf, pWidthArray);

+                pWidthArray->AddInteger(631);

+                _InsertWidthArray(hDC, 0x7e, 0x7e, pWidthArray);

+                break;

+        }

+        pBaseDict->SetAtName("Subtype", "Type0");

+        pBaseDict->SetAtName("BaseFont", basefont);

+        pBaseDict->SetAtName("Encoding", cmap);

+        pFontDict->SetAt("W", pWidthArray);

+        pFontDict->SetAtName("Type", "Font");

+        pFontDict->SetAtName("Subtype", "CIDFontType2");

+        pFontDict->SetAtName("BaseFont", basefont);

+        CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;

+        pCIDSysInfo->SetAtString("Registry", "Adobe");

+        pCIDSysInfo->SetAtString("Ordering", ordering);

+        pCIDSysInfo->SetAtInteger("Supplement", supplement);

+        pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo);

+        CPDF_Array* pArray = FX_NEW CPDF_Array;

+        pBaseDict->SetAt("DescendantFonts", pArray);

+        AddIndirectObject(pFontDict);

+        pArray->AddReference(this, pFontDict);

+    }

+    AddIndirectObject(pBaseDict);

+    CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;

+    pFontDesc->SetAtName("Type", "FontDescriptor");

+    pFontDesc->SetAtName("FontName", basefont);

+    pFontDesc->SetAtInteger("Flags", flags);

+    CPDF_Array* pBBox = FX_NEW CPDF_Array;

+    for (int i = 0; i < 4; i ++) {

+        pBBox->AddInteger(bbox[i]);

+    }

+    pFontDesc->SetAt("FontBBox", pBBox);

+    pFontDesc->SetAtInteger("ItalicAngle", italicangle);

+    pFontDesc->SetAtInteger("Ascent", ascend);

+    pFontDesc->SetAtInteger("Descent", descend);

+    pFontDesc->SetAtInteger("CapHeight", capheight);

+    pFontDesc->SetAtInteger("StemV", pLogFont->lfWeight / 5);

+    AddIndirectObject(pFontDesc);

+    pFontDict->SetAtReference("FontDescriptor", this, pFontDesc);

+    hFont = SelectObject(hDC, hFont);

+    DeleteObject(hFont);

+    DeleteDC(hDC);

+    return LoadFont(pBaseDict);

+}

+#endif

+#if (_FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_)

+FX_UINT32 FX_GetLangHashCode( FX_LPCSTR pStr)

+{

+    FXSYS_assert( pStr != NULL);

+    FX_INT32 iLength = FXSYS_strlen(pStr);

+    FX_LPCSTR pStrEnd = pStr + iLength;

+    FX_UINT32 uHashCode = 0;

+    while ( pStr < pStrEnd) {

+        uHashCode = 31 * uHashCode + tolower(*pStr++);

+    }

+    return uHashCode;

+}

+struct FX_LANG2CS {

+    FX_DWORD    uLang;

+    int         uCharset;

+}*FX_LPLANG2CS;

+static const FX_LANG2CS gs_FXLang2CharsetTable[] = {

+    {3109, 0},

+    {3121, 178},

+    {3129, 162},

+    {3139, 204},

+    {3141, 204},

+    {3166, 0},

+    {3184, 238},

+    {3197, 0},

+    {3201, 0},

+    {3239, 161},

+    {3241, 0},

+    {3246, 0},

+    {3247, 186},

+    {3248, 0},

+    {3259, 178},

+    {3267, 0},

+    {3273, 0},

+    {3276, 0},

+    {3301, 0},

+    {3310, 1},

+    {3325, 177},

+    {3329, 1},

+    {3338, 238},

+    {3341, 238},

+    {3345, 1},

+    {3355, 0},

+    {3370, 0},

+    {3371, 0},

+    {3383, 128},

+    {3424, 204},

+    {3427, 1},

+    {3428, 129},

+    {3436, 178},

+    {3464, 186},

+    {3466, 186},

+    {3486, 204},

+    {3487, 0},

+    {3493, 1},

+    {3494, 0},

+    {3508, 0},

+    {3518, 0},

+    {3520, 0},

+    {3569, 1},

+    {3580, 238},

+    {3588, 0},

+    {3645, 238},

+    {3651, 204},

+    {3672, 238},

+    {3673, 238},

+    {3678, 238},

+    {3679, 238},

+    {3683, 0},

+    {3684, 0},

+    {3693, 1},

+    {3697, 1},

+    {3700, 222},

+    {3710, 162},

+    {3734, 204},

+    {3741, 178},

+    {3749, 162},

+    {3763, 163},

+    {3886, 134},

+    {105943, 0},

+    {106375, 1},

+    {3923451837, 134},

+    {3923451838, 136},

+};

+static FX_WORD FX_GetCsFromLangCode(FX_UINT32 uCode)

+{

+    FX_INT32 iStart = 0;

+    FX_INT32 iEnd = sizeof(gs_FXLang2CharsetTable) / sizeof(FX_LANG2CS) - 1;

+    while (iStart <= iEnd) {

+        FX_INT32 iMid = (iStart + iEnd) / 2;

+        const FX_LANG2CS &charset = gs_FXLang2CharsetTable[iMid];

+        if (uCode == charset.uLang) {

+            return charset.uCharset;

+        } else if (uCode < charset.uLang) {

+            iEnd = iMid - 1;

+        } else {

+            iStart = iMid + 1;

+        }

+    };

+    return 0;

+}

+static FX_WORD FX_GetCharsetFromLang(FX_LPCSTR pLang, FX_INT32 iLength)

+{

+    FXSYS_assert(pLang);

+    if (iLength < 0) {

+        iLength = FXSYS_strlen(pLang);

+    }

+    FX_UINT32 uHash = FX_GetLangHashCode(pLang);

+    return FX_GetCsFromLangCode(uHash);

+}

+static void _CFString2CFXByteString(CFStringRef src, CFX_ByteString &dest)

+{

+    SInt32 len =  CFStringGetLength(src);

+    CFRange range = CFRangeMake(0, len);

+    CFIndex used = 0;

+    UInt8* pBuffer = (UInt8*)malloc(sizeof(UInt8) * (len + 1));

+    FXSYS_memset32(pBuffer, 0, sizeof(UInt8) * (len + 1));

+    CFStringGetBytes(src, range, kCFStringEncodingASCII, 0, false, pBuffer, len, &used);

+    dest = (FX_LPSTR)pBuffer;

+    free(pBuffer);

+}

+FX_BOOL IsHasCharSet(CFArrayRef languages, const CFX_DWordArray &charSets)

+{

+    int iCount = charSets.GetSize();

+    for (int i = 0; i < CFArrayGetCount(languages); ++i) {

+        CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(languages, i);

+        FX_DWORD CharSet = FX_GetCharsetFromLang(CFStringGetCStringPtr(language, kCFStringEncodingMacRoman), -1);

+        for (int j = 0; j < iCount; ++j) {

+            if (CharSet == charSets[j]) {

+                return TRUE;

+            }

+        }

+    }

+    return FALSE;

+}

+void FX_GetCharWidth(CTFontRef font, UniChar start, UniChar end, int* width)

+{

+    CGFloat size = CTFontGetSize(font);

+    for (; start <= end; ++start) {

+        CGGlyph pGlyph = NULL;

+        CFIndex count = 1;

+        CTFontGetGlyphsForCharacters(font, &start, &pGlyph, count);

+        CGSize advances;

+        CTFontGetAdvancesForGlyphs(font, kCTFontDefaultOrientation, &pGlyph, &advances, 1);

+        *width = (int)(advances.width / size * 1000) ;

+        width++;

+    }

+}

+static void _InsertWidthArray(CTFontRef font, int start, int end, CPDF_Array* pWidthArray)

+{

+    int size = end - start + 1;

+    int* widths = FX_Alloc(int, size);

+    FX_GetCharWidth(font, start, end, widths);

+    int i;

+    for (i = 1; i < size; i ++)

+        if (widths[i] != *widths) {

+            break;

+        }

+    if (i == size) {

+        int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);

+        pWidthArray->AddInteger(first + size - 1);

+        pWidthArray->AddInteger(*widths);

+    } else {

+        CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;

+        pWidthArray->Add(pWidthArray1);

+        for (i = 0; i < size; i ++) {

+            pWidthArray1->AddInteger(widths[i]);

+        }

+    }

+    FX_Free(widths);

+}

+CPDF_Font* CPDF_Document::AddMacFont(CTFontRef pFont, FX_BOOL bVert, FX_BOOL bTranslateName)

+{

+    CTFontRef font = (CTFontRef)pFont;

+    CTFontDescriptorRef descriptor = CTFontCopyFontDescriptor(font);

+    if (descriptor == NULL) {

+        return NULL;

+    }

+    CFX_ByteString basefont;

+    FX_BOOL bCJK = FALSE;

+    int flags = 0, italicangle = 0, ascend = 0, descend = 0, capheight = 0, bbox[4];

+    FXSYS_memset32(bbox, 0, sizeof(int) * 4);

+    CFArrayRef languages = (CFArrayRef)CTFontDescriptorCopyAttribute(descriptor, kCTFontLanguagesAttribute);

+    if (languages == NULL) {

+        CFRelease(descriptor);

+        return NULL;

+    }

+    CFX_DWordArray charSets;

+    charSets.Add(FXFONT_CHINESEBIG5_CHARSET);

+    charSets.Add(FXFONT_GB2312_CHARSET);

+    charSets.Add(FXFONT_HANGEUL_CHARSET);

+    charSets.Add(FXFONT_SHIFTJIS_CHARSET);

+    if (IsHasCharSet(languages, charSets)) {

+        bCJK = TRUE;

+    }

+    CFRelease(descriptor);

+    CFDictionaryRef traits = (CFDictionaryRef)CTFontCopyTraits(font);

+    if (traits == NULL) {

+        CFRelease(languages);

+        return NULL;

+    }

+    CFNumberRef sybolicTrait = (CFNumberRef)CFDictionaryGetValue(traits, kCTFontSymbolicTrait);

+    CTFontSymbolicTraits trait = 0;

+    CFNumberGetValue(sybolicTrait, kCFNumberSInt32Type, &trait);

+    if (trait & kCTFontItalicTrait) {

+        flags |= PDFFONT_ITALIC;

+    }

+    if (trait & kCTFontMonoSpaceTrait) {

+        flags |= PDFFONT_FIXEDPITCH;

+    }

+    if (trait & kCTFontModernSerifsClass) {

+        flags |= PDFFONT_SERIF;

+    }

+    if (trait & kCTFontScriptsClass) {

+        flags |= PDFFONT_SCRIPT;

+    }

+    CFNumberRef weightTrait = (CFNumberRef)CFDictionaryGetValue(traits, kCTFontWeightTrait);

+    Float32 weight = 0;

+    CFNumberGetValue(weightTrait, kCFNumberFloat32Type, &weight);

+    italicangle = CTFontGetSlantAngle(font);

+    ascend      = CTFontGetAscent(font);

+    descend     = CTFontGetDescent(font);

+    capheight   = CTFontGetCapHeight(font);

+    CGRect box  = CTFontGetBoundingBox(font);

+    bbox[0]     = box.origin.x;

+    bbox[1]     = box.origin.y;

+    bbox[2]     = box.origin.x + box.size.width;

+    bbox[3]     = box.origin.y + box.size.height;

+    if (bTranslateName && bCJK) {

+        CFStringRef postName = CTFontCopyPostScriptName(font);

+        _CFString2CFXByteString(postName, basefont);

+        CFRelease(postName);

+    }

+    if (basefont.IsEmpty()) {

+        CFStringRef fullName = CTFontCopyFullName(font);

+        _CFString2CFXByteString(fullName, basefont);

+        CFRelease(fullName);

+    }

+    basefont.Replace(" ", "");

+    CPDF_Dictionary* pFontDict = NULL;

+    CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;

+    pFontDict = pBaseDict;

+    if (!bCJK) {

+        charSets.RemoveAll();

+        charSets.Add(FXFONT_ANSI_CHARSET);

+        charSets.Add(FXFONT_DEFAULT_CHARSET);

+        charSets.Add(FXFONT_SYMBOL_CHARSET);

+        if (IsHasCharSet(languages, charSets)) {

+            charSets.RemoveAll();

+            charSets.Add(FXFONT_SYMBOL_CHARSET);

+            if (IsHasCharSet(languages, charSets)) {

+                flags |= PDFFONT_SYMBOLIC;

+            } else {

+                flags |= PDFFONT_NONSYMBOLIC;

+            }

+            pBaseDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");

+        } else {

+            flags |= PDFFONT_NONSYMBOLIC;

+            int i;

+            for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++) {

+                charSets.RemoveAll();

+                charSets.Add(g_FX_CharsetUnicodes[i].m_Charset);

+                if (IsHasCharSet(languages, charSets)) {

+                    break;

+                }

+            }

+            if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {

+                CPDF_Dictionary* pEncoding = FX_NEW CPDF_Dictionary;

+                pEncoding->SetAtName(FX_BSTRC("BaseEncoding"), "WinAnsiEncoding");

+                CPDF_Array* pArray = FX_NEW CPDF_Array;

+                pArray->AddInteger(128);

+                const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;

+                for (int j = 0; j < 128; j ++) {

+                    CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);

+                    if (name.IsEmpty()) {

+                        pArray->AddName(FX_BSTRC(".notdef"));

+                    } else {

+                        pArray->AddName(name);

+                    }

+                }

+                pEncoding->SetAt(FX_BSTRC("Differences"), pArray);

+                AddIndirectObject(pEncoding);

+                pBaseDict->SetAtReference(FX_BSTRC("Encoding"), this, pEncoding);

+            }

+        }

+        if (weight > 0.0 && trait & kCTFontItalicTrait) {

+            basefont += ",BoldItalic";

+        } else if (weight > 0.0) {

+            basefont += ",Bold";

+        } else if (trait & kCTFontItalicTrait) {

+            basefont += ",Italic";

+        }

+        pBaseDict->SetAtName("Subtype", "TrueType");

+        pBaseDict->SetAtName("BaseFont", basefont);

+        pBaseDict->SetAtNumber("FirstChar", 32);

+        pBaseDict->SetAtNumber("LastChar", 255);

+        int char_widths[224];

+        FX_GetCharWidth(font, 32, 255, char_widths);

+        CPDF_Array* pWidths = FX_NEW CPDF_Array;

+        for (int i = 0; i < 224; i ++) {

+            pWidths->AddInteger(char_widths[i]);

+        }

+        pBaseDict->SetAt("Widths", pWidths);

+    }  else {

+        flags |= PDFFONT_NONSYMBOLIC;

+        CPDF_Array* pArray = NULL;

+        pFontDict = FX_NEW CPDF_Dictionary;

+        CFX_ByteString cmap;

+        CFX_ByteString ordering;

+        int supplement;

+        FX_BOOL bFound = FALSE;

+        CPDF_Array* pWidthArray = FX_NEW CPDF_Array;

+        charSets.RemoveAll();

+        charSets.Add(FXFONT_CHINESEBIG5_CHARSET);

+        if (IsHasCharSet(languages, charSets)) {

+            cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";

+            ordering = "CNS1";

+            supplement = 4;

+            pWidthArray->AddInteger(1);

+            _InsertWidthArray(font, 0x20, 0x7e, pWidthArray);

+            bFound = TRUE;

+        }

+        charSets.RemoveAll();

+        charSets.Add(FXFONT_GB2312_CHARSET);

+        if (!bFound && IsHasCharSet(languages, charSets)) {

+            cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";

+            ordering = "GB1", supplement = 2;

+            pWidthArray->AddInteger(7716);

+            _InsertWidthArray(font, 0x20, 0x20, pWidthArray);

+            pWidthArray->AddInteger(814);

+            _InsertWidthArray(font, 0x21, 0x7e, pWidthArray);

+            bFound = TRUE;

+        }

+        charSets.RemoveAll();

+        charSets.Add(FXFONT_HANGEUL_CHARSET);

+        if (!bFound && IsHasCharSet(languages, charSets)) {

+            cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H";

+            ordering = "Korea1";

+            supplement = 2;

+            pWidthArray->AddInteger(1);

+            _InsertWidthArray(font, 0x20, 0x7e, pWidthArray);

+            bFound = TRUE;

+        }

+        charSets.RemoveAll();

+        charSets.Add(FXFONT_SHIFTJIS_CHARSET);

+        if (!bFound && IsHasCharSet(languages, charSets)) {

+            cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H";

+            ordering = "Japan1";

+            supplement = 5;

+            pWidthArray->AddInteger(231);

+            _InsertWidthArray(font, 0x20, 0x7d, pWidthArray);

+            pWidthArray->AddInteger(326);

+            _InsertWidthArray(font, 0xa0, 0xa0, pWidthArray);

+            pWidthArray->AddInteger(327);

+            _InsertWidthArray(font, 0xa1, 0xdf, pWidthArray);

+            pWidthArray->AddInteger(631);

+            _InsertWidthArray(font, 0x7e, 0x7e, pWidthArray);

+        }

+        pBaseDict->SetAtName("Subtype", "Type0");

+        pBaseDict->SetAtName("BaseFont", basefont);

+        pBaseDict->SetAtName("Encoding", cmap);

+        pFontDict->SetAt("W", pWidthArray);

+        pFontDict->SetAtName("Type", "Font");

+        pFontDict->SetAtName("Subtype", "CIDFontType2");

+        pFontDict->SetAtName("BaseFont", basefont);

+        CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;

+        pCIDSysInfo->SetAtString("Registry", "Adobe");

+        pCIDSysInfo->SetAtString("Ordering", ordering);

+        pCIDSysInfo->SetAtInteger("Supplement", supplement);

+        pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo);

+        pArray = FX_NEW CPDF_Array;

+        pBaseDict->SetAt("DescendantFonts", pArray);

+        AddIndirectObject(pFontDict);

+        pArray->AddReference(this, pFontDict);

+    }

+    AddIndirectObject(pBaseDict);

+    CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;

+    pFontDesc->SetAtName("Type", "FontDescriptor");

+    pFontDesc->SetAtName("FontName", basefont);

+    pFontDesc->SetAtInteger("Flags", flags);

+    CPDF_Array* pBBox = FX_NEW CPDF_Array;

+    for (int i = 0; i < 4; i ++) {

+        pBBox->AddInteger(bbox[i]);

+    }

+    pFontDesc->SetAt("FontBBox", pBBox);

+    pFontDesc->SetAtInteger("ItalicAngle", italicangle);

+    pFontDesc->SetAtInteger("Ascent", ascend);

+    pFontDesc->SetAtInteger("Descent", descend);

+    pFontDesc->SetAtInteger("CapHeight", capheight);

+    CGFloat fStemV = 0;

+    int16_t min_width = SHRT_MAX;

+    static const UniChar stem_chars[] = {'i', 'I', '!', '1'};

+    const size_t count = sizeof(stem_chars) / sizeof(stem_chars[0]);

+    CGGlyph glyphs[count];

+    CGRect boundingRects[count];

+    if (CTFontGetGlyphsForCharacters(font, stem_chars, glyphs, count)) {

+        CTFontGetBoundingRectsForGlyphs(font, kCTFontHorizontalOrientation,

+                                        glyphs, boundingRects, count);

+        for (size_t i = 0; i < count; i++) {

+            int16_t width = boundingRects[i].size.width;

+            if (width > 0 && width < min_width) {

+                min_width = width;

+                fStemV = min_width;

+            }

+        }

+    }

+    pFontDesc->SetAtInteger("StemV", fStemV);

+    AddIndirectObject(pFontDesc);

+    pFontDict->SetAtReference("FontDescriptor", this, pFontDesc);

+    CFRelease(traits);

+    CFRelease(languages);

+    return LoadFont(pBaseDict);

+}

+#endif

+static void _InsertWidthArray1(CFX_Font* pFont, IFX_FontEncoding* pEncoding, FX_WCHAR start, FX_WCHAR end, CPDF_Array* pWidthArray)

+{

+    int size = end - start + 1;

+    int* widths = FX_Alloc(int, size);

+    int i;

+    for (i = 0; i < size; i ++) {

+        int glyph_index = pEncoding->GlyphFromCharCode(start + i);

+        widths[i] = pFont->GetGlyphWidth(glyph_index);

+    }

+    for (i = 1; i < size; i ++)

+        if (widths[i] != *widths) {

+            break;

+        }

+    if (i == size) {

+        int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);

+        pWidthArray->AddInteger(first + size - 1);

+        pWidthArray->AddInteger(*widths);

+    } else {

+        CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;

+        pWidthArray->Add(pWidthArray1);

+        for (i = 0; i < size; i ++) {

+            pWidthArray1->AddInteger(widths[i]);

+        }

+    }

+    FX_Free(widths);

+}

+CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert)

+{

+    if (pFont == NULL) {

+        return NULL;

+    }

+    FX_BOOL bCJK = charset == FXFONT_CHINESEBIG5_CHARSET || charset == FXFONT_GB2312_CHARSET ||

+                   charset == FXFONT_HANGEUL_CHARSET || charset == FXFONT_SHIFTJIS_CHARSET;

+    CFX_ByteString basefont = pFont->GetFamilyName();

+    basefont.Replace(" ", "");

+    int flags = 0;

+    if (pFont->IsBold()) {

+        flags |= PDFFONT_FORCEBOLD;

+    }

+    if (pFont->IsItalic()) {

+        flags |= PDFFONT_ITALIC;

+    }

+    if (pFont->IsFixedWidth()) {

+        flags |= PDFFONT_FIXEDPITCH;

+    }

+    CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;

+    pBaseDict->SetAtName("Type", "Font");

+    IFX_FontEncoding* pEncoding = FXGE_CreateUnicodeEncoding(pFont);

+    CPDF_Dictionary* pFontDict = pBaseDict;

+    if (!bCJK) {

+        CPDF_Array* pWidths = FX_NEW CPDF_Array;

+        int charcode;

+        for (charcode = 32; charcode < 128; charcode ++) {

+            int glyph_index = pEncoding->GlyphFromCharCode(charcode);

+            int char_width = pFont->GetGlyphWidth(glyph_index);

+            pWidths->AddInteger(char_width);

+        }

+        if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET ||

+                charset == FXFONT_SYMBOL_CHARSET) {

+            if (charset == FXFONT_SYMBOL_CHARSET) {

+                flags |= PDFFONT_SYMBOLIC;

+            } else {

+                flags |= PDFFONT_NONSYMBOLIC;

+            }

+            pBaseDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");

+            for (charcode = 128; charcode <= 255; charcode ++) {

+                int glyph_index = pEncoding->GlyphFromCharCode(charcode);

+                int char_width = pFont->GetGlyphWidth(glyph_index);

+                pWidths->AddInteger(char_width);

+            }

+        } else {

+            flags |= PDFFONT_NONSYMBOLIC;

+            int i;

+            for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++)

+                if (g_FX_CharsetUnicodes[i].m_Charset == charset) {

+                    break;

+                }

+            if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {

+                CPDF_Dictionary* pEncodingDict = FX_NEW CPDF_Dictionary;

+                pEncodingDict->SetAtName(FX_BSTRC("BaseEncoding"), "WinAnsiEncoding");

+                CPDF_Array* pArray = FX_NEW CPDF_Array;

+                pArray->AddInteger(128);

+                const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;

+                for (int j = 0; j < 128; j ++) {

+                    CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);

+                    if (name.IsEmpty()) {

+                        pArray->AddName(FX_BSTRC(".notdef"));

+                    } else {

+                        pArray->AddName(name);

+                    }

+                    int glyph_index = pEncoding->GlyphFromCharCode(pUnicodes[j]);

+                    int char_width = pFont->GetGlyphWidth(glyph_index);

+                    pWidths->AddInteger(char_width);

+                }

+                pEncodingDict->SetAt(FX_BSTRC("Differences"), pArray);

+                AddIndirectObject(pEncodingDict);

+                pBaseDict->SetAtReference(FX_BSTRC("Encoding"), this, pEncodingDict);

+            }

+        }

+        if (pFont->IsBold() && pFont->IsItalic()) {

+            basefont += ",BoldItalic";

+        } else if (pFont->IsBold()) {

+            basefont += ",Bold";

+        } else if (pFont->IsItalic()) {

+            basefont += ",Italic";

+        }

+        pBaseDict->SetAtName("Subtype", "TrueType");

+        pBaseDict->SetAtName("BaseFont", basefont);

+        pBaseDict->SetAtNumber("FirstChar", 32);

+        pBaseDict->SetAtNumber("LastChar", 255);

+        pBaseDict->SetAt("Widths", pWidths);

+    } else {

+        flags |= PDFFONT_NONSYMBOLIC;

+        pFontDict = FX_NEW CPDF_Dictionary;

+        CFX_ByteString cmap;

+        CFX_ByteString ordering;

+        int supplement;

+        CPDF_Array* pWidthArray = FX_NEW CPDF_Array;

+        switch (charset) {

+            case FXFONT_CHINESEBIG5_CHARSET:

+                cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";

+                ordering = "CNS1";

+                supplement = 4;

+                pWidthArray->AddInteger(1);

+                _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7e, pWidthArray);

+                break;

+            case FXFONT_GB2312_CHARSET:

+                cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";

+                ordering = "GB1", supplement = 2;

+                pWidthArray->AddInteger(7716);

+                _InsertWidthArray1(pFont, pEncoding, 0x20, 0x20, pWidthArray);

+                pWidthArray->AddInteger(814);

+                _InsertWidthArray1(pFont, pEncoding, 0x21, 0x7e, pWidthArray);

+                break;

+            case FXFONT_HANGEUL_CHARSET:

+                cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H";

+                ordering = "Korea1";

+                supplement = 2;

+                pWidthArray->AddInteger(1);

+                _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7e, pWidthArray);

+                break;

+            case FXFONT_SHIFTJIS_CHARSET:

+                cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H";

+                ordering = "Japan1";

+                supplement = 5;

+                pWidthArray->AddInteger(231);

+                _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7d, pWidthArray);

+                pWidthArray->AddInteger(326);

+                _InsertWidthArray1(pFont, pEncoding, 0xa0, 0xa0, pWidthArray);

+                pWidthArray->AddInteger(327);

+                _InsertWidthArray1(pFont, pEncoding, 0xa1, 0xdf, pWidthArray);

+                pWidthArray->AddInteger(631);

+                _InsertWidthArray1(pFont, pEncoding, 0x7e, 0x7e, pWidthArray);

+                break;

+        }

+        pBaseDict->SetAtName("Subtype", "Type0");

+        pBaseDict->SetAtName("BaseFont", basefont);

+        pBaseDict->SetAtName("Encoding", cmap);

+        pFontDict->SetAt("W", pWidthArray);

+        pFontDict->SetAtName("Type", "Font");

+        pFontDict->SetAtName("Subtype", "CIDFontType2");

+        pFontDict->SetAtName("BaseFont", basefont);

+        CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;

+        pCIDSysInfo->SetAtString("Registry", "Adobe");

+        pCIDSysInfo->SetAtString("Ordering", ordering);

+        pCIDSysInfo->SetAtInteger("Supplement", supplement);

+        pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo);

+        CPDF_Array* pArray = FX_NEW CPDF_Array;

+        pBaseDict->SetAt("DescendantFonts", pArray);

+        AddIndirectObject(pFontDict);

+        pArray->AddReference(this, pFontDict);

+    }

+    AddIndirectObject(pBaseDict);

+    CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;

+    pFontDesc->SetAtName("Type", "FontDescriptor");

+    pFontDesc->SetAtName("FontName", basefont);

+    pFontDesc->SetAtInteger("Flags", flags);

+    pFontDesc->SetAtInteger("ItalicAngle", pFont->m_pSubstFont ? pFont->m_pSubstFont->m_ItalicAngle : 0);

+    pFontDesc->SetAtInteger("Ascent", pFont->GetAscent());

+    pFontDesc->SetAtInteger("Descent", pFont->GetDescent());

+    FX_RECT bbox;

+    pFont->GetBBox(bbox);

+    CPDF_Array* pBBox = FX_NEW CPDF_Array;

+    pBBox->AddInteger(bbox.left);

+    pBBox->AddInteger(bbox.bottom);

+    pBBox->AddInteger(bbox.right);

+    pBBox->AddInteger(bbox.top);

+    pFontDesc->SetAt("FontBBox", pBBox);

+    FX_INT32 nStemV = 0;

+    if (pFont->m_pSubstFont) {

+        nStemV = pFont->m_pSubstFont->m_Weight / 5;

+    } else {

+        static const FX_CHAR stem_chars[] = {'i', 'I', '!', '1'};

+        const size_t count = sizeof(stem_chars) / sizeof(stem_chars[0]);

+        FX_DWORD glyph = pEncoding->GlyphFromCharCode(stem_chars[0]);

+        nStemV = pFont->GetGlyphWidth(glyph);

+        for (size_t i = 1; i < count; i++) {

+            glyph = pEncoding->GlyphFromCharCode(stem_chars[i]);

+            int width = pFont->GetGlyphWidth(glyph);

+            if (width > 0 && width < nStemV) {

+                nStemV = width;

+            }

+        }

+    }

+    if (pEncoding) {

+        delete pEncoding;

+    }

+    pFontDesc->SetAtInteger("StemV", nStemV);

+    AddIndirectObject(pFontDesc);

+    pFontDict->SetAtReference("FontDescriptor", this, pFontDesc);

+    return LoadFont(pBaseDict);

+}

+static CPDF_Stream* GetFormStream(CPDF_Document* pDoc, CPDF_Object* pResObj)

+{

+    if (pResObj->GetType() != PDFOBJ_REFERENCE) {

+        return NULL;

+    }

+    CPDF_Reference* pRef = (CPDF_Reference*)pResObj;

+    FX_BOOL bForm;

+    if (pDoc->IsFormStream(pRef->GetRefObjNum(), bForm) && !bForm) {

+        return NULL;

+    }

+    pResObj = pRef->GetDirect();

+    if (pResObj->GetType() != PDFOBJ_STREAM) {

+        return NULL;

+    }

+    CPDF_Stream* pXObject = (CPDF_Stream*)pResObj;

+    if (pXObject->GetDict()->GetString(FX_BSTRC("Subtype")) != FX_BSTRC("Form")) {

+        return NULL;

+    }

+    return pXObject;

+}

+static int InsertDeletePDFPage(CPDF_Document* pDoc, CPDF_Dictionary* pPages,

+                               int nPagesToGo, CPDF_Dictionary* pPage, FX_BOOL bInsert, CFX_PtrArray& stackList)

+{

+    CPDF_Array* pKidList = pPages->GetArray("Kids");

+    if (!pKidList) {

+        return -1;

+    }

+    int nKids = pKidList->GetCount();

+    for (int i = 0; i < nKids; i ++) {

+        CPDF_Dictionary* pKid = pKidList->GetDict(i);

+        if (pKid->GetString("Type") == FX_BSTRC("Page")) {

+            if (nPagesToGo == 0) {

+                if (bInsert) {

+                    pKidList->InsertAt(i, CPDF_Reference::Create(pDoc, pPage->GetObjNum()));

+                    pPage->SetAtReference("Parent", pDoc, pPages->GetObjNum());

+                } else {

+                    pKidList->RemoveAt(i);

+                }

+                pPages->SetAtInteger("Count", pPages->GetInteger("Count") + (bInsert ? 1 : -1));

+                return 1;

+            }

+            nPagesToGo --;

+        } else {

+            int nPages = pKid->GetInteger("Count");

+            if (nPagesToGo < nPages) {

+                int stackCount = stackList.GetSize();

+                for (int j = 0; j < stackCount; ++j) {

+                    if (pKid == stackList[j]) {

+                        return -1;

+                    }

+                }

+                stackList.Add(pKid);

+                if (InsertDeletePDFPage(pDoc, pKid, nPagesToGo, pPage, bInsert, stackList) < 0) {

+                    return -1;

+                }

+                stackList.RemoveAt(stackCount);

+                pPages->SetAtInteger("Count", pPages->GetInteger("Count") + (bInsert ? 1 : -1));

+                return 1;

+            }

+            nPagesToGo -= nPages;

+        }

+    }

+    return 0;

+}

+static int InsertNewPage(CPDF_Document* pDoc, int iPage, CPDF_Dictionary* pPageDict, CFX_DWordArray &pageList)

+{

+    CPDF_Dictionary* pRoot = pDoc->GetRoot();

+    if (!pRoot) {

+        return -1;

+    }

+    CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));

+    if (!pPages) {

+        return -1;

+    }

+    int nPages = pDoc->GetPageCount();

+    if (iPage < 0 || iPage > nPages) {

+        return -1;

+    }

+    if (iPage == nPages) {

+        CPDF_Array* pPagesList = pPages->GetArray(FX_BSTRC("Kids"));

+        if (!pPagesList) {

+            pPagesList = FX_NEW CPDF_Array;

+            pPages->SetAt(FX_BSTRC("Kids"), pPagesList);

+        }

+        pPagesList->Add(pPageDict, pDoc);

+        pPages->SetAtInteger(FX_BSTRC("Count"), nPages + 1);

+        pPageDict->SetAtReference(FX_BSTRC("Parent"), pDoc, pPages->GetObjNum());

+    } else {

+        CFX_PtrArray stack;

+        stack.Add(pPages);

+        if (InsertDeletePDFPage(pDoc, pPages, iPage, pPageDict, TRUE, stack) < 0) {

+            return -1;

+        }

+    }

+    pageList.InsertAt(iPage, pPageDict->GetObjNum());

+    return iPage;

+}

+CPDF_Dictionary* CPDF_Document::CreateNewPage(int iPage)

+{

+    CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;

+    pDict->SetAtName("Type", "Page");

+    FX_DWORD dwObjNum = AddIndirectObject(pDict);

+    if (InsertNewPage(this, iPage, pDict, m_PageList) < 0) {

+        ReleaseIndirectObject(dwObjNum);

+        return NULL;

+    }

+    return pDict;

+}

+int _PDF_GetStandardFontName(CFX_ByteString& name);

+CPDF_Font* CPDF_Document::AddStandardFont(FX_LPCSTR font, CPDF_FontEncoding* pEncoding)

+{

+    CFX_ByteString name(font, -1);

+    if (_PDF_GetStandardFontName(name) < 0) {

+        return NULL;

+    }

+    return GetPageData()->GetStandardFont(name, pEncoding);

+}

+void CPDF_Document::DeletePage(int iPage)

+{

+    CPDF_Dictionary* pRoot = GetRoot();

+    if (pRoot == NULL) {

+        return;

+    }

+    CPDF_Dictionary* pPages = pRoot->GetDict("Pages");

+    if (pPages == NULL) {

+        return;

+    }

+    int nPages = pPages->GetInteger("Count");

+    if (iPage < 0 || iPage >= nPages) {

+        return;

+    }

+    CFX_PtrArray stack;

+    stack.Add(pPages);

+    if (InsertDeletePDFPage(this, pPages, iPage, NULL, FALSE, stack) < 0) {

+        return;

+    }

+    m_PageList.RemoveAt(iPage);

+}

+CPDF_Object* FPDFAPI_GetPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name);

+void FPDFAPI_FlatPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name)

+{

+    if (pPageDict->KeyExist(name)) {

+        return;

+    }

+    CPDF_Object* pObj = FPDFAPI_GetPageAttr(pPageDict, name);

+    if (pObj) {

+        pPageDict->SetAt(name, pObj->Clone());

+    }

+}

diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
new file mode 100644
index 0000000..cb50601
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
@@ -0,0 +1,374 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "../../../include/fpdfapi/fpdf_render.h"

+#include "../fpdf_page/pageint.h"

+#include "../fpdf_render/render_int.h"

+CPDF_Dictionary* CPDF_Image::InitJPEG(FX_LPBYTE pData, FX_DWORD size)

+{

+    FX_INT32 width, height, color_trans, num_comps, bits;

+    if (!CPDF_ModuleMgr::Get()->GetJpegModule()->

+            LoadInfo(pData, size, width, height, num_comps, bits, color_trans)) {

+        return NULL;

+    }

+    CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;

+    pDict->SetAtName("Type", "XObject");

+    pDict->SetAtName("Subtype", "Image");

+    pDict->SetAtInteger("Width", width);

+    pDict->SetAtInteger("Height", height);

+    FX_LPCSTR csname = NULL;

+    if (num_comps == 1) {

+        csname = "DeviceGray";

+    } else if (num_comps == 3) {

+        csname = "DeviceRGB";

+    } else if (num_comps == 4) {

+        csname = "DeviceCMYK";

+        CPDF_Array* pDecode = CPDF_Array::Create();

+        for (int n = 0; n < 4; n ++) {

+            pDecode->AddInteger(1);

+            pDecode->AddInteger(0);

+        }

+        pDict->SetAt(FX_BSTRC("Decode"), pDecode);

+    }

+    pDict->SetAtName("ColorSpace", csname);

+    pDict->SetAtInteger("BitsPerComponent", bits);

+    pDict->SetAtName("Filter", "DCTDecode");

+    if (!color_trans) {

+        CPDF_Dictionary* pParms = FX_NEW CPDF_Dictionary;

+        pDict->SetAt("DecodeParms", pParms);

+        pParms->SetAtInteger("ColorTransform", 0);

+    }

+    m_bIsMask = FALSE;

+    m_Width = width;

+    m_Height = height;

+    if (m_pStream == NULL) {

+        m_pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);

+    }

+    return pDict;

+}

+void CPDF_Image::SetJpegImage(FX_LPBYTE pData, FX_DWORD size)

+{

+    CPDF_Dictionary *pDict = InitJPEG(pData, size);

+    if (!pDict) {

+        return;

+    }

+    m_pStream->InitStream(pData, size, pDict);

+}

+void CPDF_Image::SetJpegImage(IFX_FileRead *pFile)

+{

+    FX_DWORD size = (FX_DWORD)pFile->GetSize();

+    if (!size) {

+        return;

+    }

+    FX_DWORD dwEstimateSize = size;

+    if (dwEstimateSize > 8192) {

+        dwEstimateSize = 8192;

+    }

+    FX_LPBYTE pData = FX_Alloc(FX_BYTE, dwEstimateSize);

+    if (!pData) {

+        return;

+    }

+    pFile->ReadBlock(pData, 0, dwEstimateSize);

+    CPDF_Dictionary *pDict = InitJPEG(pData, dwEstimateSize);

+    FX_Free(pData);

+    if (!pDict && size > dwEstimateSize) {

+        pData = FX_Alloc(FX_BYTE, size);

+        if (!pData) {

+            return;

+        }

+        pFile->ReadBlock(pData, 0, size);

+        pDict = InitJPEG(pData, size);

+        FX_Free(pData);

+    }

+    if (!pDict) {

+        return;

+    }

+    m_pStream->InitStream(pFile, pDict);

+}

+void _DCTEncodeBitmap(CPDF_Dictionary *pBitmapDict, const CFX_DIBitmap* pBitmap, int quality, FX_LPBYTE &buf, FX_STRSIZE &size)

+{

+}

+void _JBIG2EncodeBitmap(CPDF_Dictionary *pBitmapDict, const CFX_DIBitmap *pBitmap, CPDF_Document *pDoc, FX_LPBYTE &buf, FX_STRSIZE &size, FX_BOOL bLossLess)

+{

+}

+void CPDF_Image::SetImage(const CFX_DIBitmap* pBitmap, FX_INT32 iCompress, IFX_FileWrite *pFileWrite, IFX_FileRead *pFileRead, const CFX_DIBitmap* pMask, const CPDF_ImageSetParam* pParam)

+{

+    FX_INT32 BitmapWidth = pBitmap->GetWidth();

+    FX_INT32 BitmapHeight = pBitmap->GetHeight();

+    if (BitmapWidth < 1 || BitmapHeight < 1) {

+        return;

+    }

+    FX_LPBYTE src_buf = pBitmap->GetBuffer();

+    FX_INT32 src_pitch = pBitmap->GetPitch();

+    FX_INT32 bpp = pBitmap->GetBPP();

+    FX_BOOL bUseMatte = pParam && pParam->pMatteColor && (pBitmap->GetFormat() == FXDIB_Argb);

+    CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;

+    pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("XObject"));

+    pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));

+    pDict->SetAtInteger(FX_BSTRC("Width"), BitmapWidth);

+    pDict->SetAtInteger(FX_BSTRC("Height"), BitmapHeight);

+    FX_LPBYTE dest_buf = NULL;

+    FX_STRSIZE dest_pitch = 0, dest_size = 0, opType = -1;

+    if (bpp == 1) {

+        FX_INT32 reset_a = 0, reset_r = 0, reset_g = 0, reset_b = 0;

+        FX_INT32 set_a = 0, set_r = 0, set_g = 0, set_b = 0;

+        if (!pBitmap->IsAlphaMask()) {

+            ArgbDecode(pBitmap->GetPaletteArgb(0), reset_a, reset_r, reset_g, reset_b);

+            ArgbDecode(pBitmap->GetPaletteArgb(1), set_a, set_r, set_g, set_b);

+        }

+        if (set_a == 0 || reset_a == 0) {

+            pDict->SetAt(FX_BSTRC("ImageMask"), FX_NEW CPDF_Boolean(TRUE));

+            if (reset_a == 0) {

+                CPDF_Array* pArray = FX_NEW CPDF_Array;

+                pArray->AddInteger(1);

+                pArray->AddInteger(0);

+                pDict->SetAt(FX_BSTRC("Decode"), pArray);

+            }

+        } else {

+            CPDF_Array* pCS = FX_NEW CPDF_Array;

+            pCS->AddName(FX_BSTRC("Indexed"));

+            pCS->AddName(FX_BSTRC("DeviceRGB"));

+            pCS->AddInteger(1);

+            CFX_ByteString ct;

+            FX_LPSTR pBuf = ct.GetBuffer(6);

+            pBuf[0] = (FX_CHAR)reset_r;

+            pBuf[1] = (FX_CHAR)reset_g;

+            pBuf[2] = (FX_CHAR)reset_b;

+            pBuf[3] = (FX_CHAR)set_r;

+            pBuf[4] = (FX_CHAR)set_g;

+            pBuf[5] = (FX_CHAR)set_b;

+            ct.ReleaseBuffer(6);

+            pCS->Add(CPDF_String::Create(ct, TRUE));

+            pDict->SetAt(FX_BSTRC("ColorSpace"), pCS);

+        }

+        pDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 1);

+        dest_pitch = (BitmapWidth + 7) / 8;

+        if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {

+            opType = 1;

+        } else {

+            opType = 0;

+        }

+    } else if (bpp == 8) {

+        FX_INT32 iPalette = pBitmap->GetPaletteSize();

+        if (iPalette > 0) {

+            CPDF_Array* pCS = FX_NEW CPDF_Array;

+            m_pDocument->AddIndirectObject(pCS);

+            pCS->AddName(FX_BSTRC("Indexed"));

+            pCS->AddName(FX_BSTRC("DeviceRGB"));

+            pCS->AddInteger(iPalette - 1);

+            FX_LPBYTE pColorTable = FX_Alloc(FX_BYTE, iPalette * 3);

+            FX_LPBYTE ptr = pColorTable;

+            for (FX_INT32 i = 0; i < iPalette; i ++) {

+                FX_DWORD argb = pBitmap->GetPaletteArgb(i);

+                ptr[0] = (FX_BYTE)(argb >> 16);

+                ptr[1] = (FX_BYTE)(argb >> 8);

+                ptr[2] = (FX_BYTE)argb;

+                ptr += 3;

+            }

+            CPDF_Stream *pCTS = CPDF_Stream::Create(pColorTable, iPalette * 3, CPDF_Dictionary::Create());

+            m_pDocument->AddIndirectObject(pCTS);

+            pCS->AddReference(m_pDocument, pCTS);

+            pDict->SetAtReference(FX_BSTRC("ColorSpace"), m_pDocument, pCS);

+        } else {

+            pDict->SetAtName(FX_BSTRC("ColorSpace"), FX_BSTRC("DeviceGray"));

+        }

+        pDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 8);

+        if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {

+            dest_pitch = BitmapWidth;

+            opType = 1;

+        } else {

+            opType = 0;

+        }

+    } else {

+        pDict->SetAtName(FX_BSTRC("ColorSpace"), FX_BSTRC("DeviceRGB"));

+        pDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 8);

+        if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {

+            dest_pitch = BitmapWidth * 3;

+            opType = 2;

+        } else {

+            opType = 0;

+        }

+    }

+    const CFX_DIBitmap* pMaskBitmap = NULL;

+    if (pBitmap->HasAlpha()) {

+        pMaskBitmap = pBitmap->GetAlphaMask();

+    }

+    if (!pMaskBitmap && pMask) {

+        FXDIB_Format maskFormat = pMask->GetFormat();

+        if (maskFormat == FXDIB_1bppMask || maskFormat == FXDIB_8bppMask) {

+            pMaskBitmap = pMask;

+        }

+    }

+    if (pMaskBitmap) {

+        FX_INT32 maskWidth = pMaskBitmap->GetWidth();

+        FX_INT32 maskHeight = pMaskBitmap->GetHeight();

+        FX_LPBYTE mask_buf = NULL;

+        FX_STRSIZE mask_size;

+        FX_BOOL bDeleteMask = TRUE;

+        CPDF_Dictionary* pMaskDict = FX_NEW CPDF_Dictionary;

+        pMaskDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("XObject"));

+        pMaskDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));

+        pMaskDict->SetAtInteger(FX_BSTRC("Width"), maskWidth);

+        pMaskDict->SetAtInteger(FX_BSTRC("Height"), maskHeight);

+        pMaskDict->SetAtName(FX_BSTRC("ColorSpace"), FX_BSTRC("DeviceGray"));

+        pMaskDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 8);

+        if (pMaskBitmap->GetBPP() == 8 && (iCompress & PDF_IMAGE_MASK_LOSSY_COMPRESS) != 0) {

+            _DCTEncodeBitmap(pMaskDict, pMaskBitmap, pParam ? pParam->nQuality : 75, mask_buf, mask_size);

+        } else if (pMaskBitmap->GetFormat() == FXDIB_1bppMask) {

+            _JBIG2EncodeBitmap(pMaskDict, pMaskBitmap, m_pDocument, mask_buf, mask_size, TRUE);

+        } else {

+            mask_size = maskHeight * maskWidth;

+            mask_buf = FX_Alloc(FX_BYTE, mask_size);

+            for (FX_INT32 a = 0; a < maskHeight; a ++) {

+                FXSYS_memcpy32(mask_buf + a * maskWidth, pMaskBitmap->GetScanline(a), maskWidth);

+            }

+        }

+        if (pMaskDict) {

+            pMaskDict->SetAtInteger(FX_BSTRC("Length"), mask_size);

+            CPDF_Stream* pMaskStream = NULL;

+            if (bUseMatte) {

+                int a, r, g, b;

+                ArgbDecode(*(pParam->pMatteColor), a, r, g, b);

+                CPDF_Array* pMatte = FX_NEW CPDF_Array;

+                pMatte->AddInteger(r);

+                pMatte->AddInteger(g);

+                pMatte->AddInteger(b);

+                pMaskDict->SetAt(FX_BSTRC("Matte"), pMatte);

+            }

+            pMaskStream = FX_NEW CPDF_Stream(mask_buf, mask_size, pMaskDict);

+            m_pDocument->AddIndirectObject(pMaskStream);

+            bDeleteMask = FALSE;

+            pDict->SetAtReference(FX_BSTRC("SMask"), m_pDocument, pMaskStream);

+        }

+        if (pBitmap->HasAlpha()) {

+            delete pMaskBitmap;

+        }

+    }

+    FX_BOOL bStream = pFileWrite != NULL && pFileRead != NULL;

+    if (opType == 0) {

+        if (iCompress & PDF_IMAGE_LOSSLESS_COMPRESS) {

+            if (pBitmap->GetBPP() == 1) {

+                _JBIG2EncodeBitmap(pDict, pBitmap, m_pDocument, dest_buf, dest_size, TRUE);

+            }

+        } else {

+            if (pBitmap->GetBPP() == 1) {

+                _JBIG2EncodeBitmap(pDict, pBitmap, m_pDocument, dest_buf, dest_size, FALSE);

+            } else if (pBitmap->GetBPP() >= 8 && pBitmap->GetPalette() != NULL) {

+                CFX_DIBitmap *pNewBitmap = FX_NEW CFX_DIBitmap();

+                pNewBitmap->Copy(pBitmap);

+                pNewBitmap->ConvertFormat(FXDIB_Rgb);

+                SetImage(pNewBitmap, iCompress, pFileWrite, pFileRead);

+                if (pDict) {

+                    pDict->Release();

+                    pDict = NULL;

+                }

+                if (dest_buf) {

+                    FX_Free(dest_buf);

+                    dest_buf = NULL;

+                }

+                dest_size = 0;

+                delete pNewBitmap;

+                return;

+            } else {

+                if (bUseMatte) {

+                    CFX_DIBitmap *pNewBitmap = FX_NEW CFX_DIBitmap();

+                    pNewBitmap->Create(BitmapWidth, BitmapHeight, FXDIB_Argb);

+                    FX_LPBYTE dst_buf = pNewBitmap->GetBuffer();

+                    FX_INT32 src_offset = 0;

+                    for (FX_INT32 row = 0; row < BitmapHeight; row ++) {

+                        src_offset = row * src_pitch;

+                        for (FX_INT32 column = 0; column < BitmapWidth; column ++) {

+                            FX_FLOAT alpha = src_buf[src_offset + 3] / 255.0f;

+                            dst_buf[src_offset] = (FX_BYTE)(src_buf[src_offset] * alpha);

+                            dst_buf[src_offset + 1] = (FX_BYTE)(src_buf[src_offset + 1] * alpha);

+                            dst_buf[src_offset + 2] = (FX_BYTE)(src_buf[src_offset + 2] * alpha);

+                            dst_buf[src_offset + 3] = (FX_BYTE)(src_buf[src_offset + 3]);

+                            src_offset += 4;

+                        }

+                    }

+                    _DCTEncodeBitmap(pDict, pNewBitmap, pParam ? pParam->nQuality : 75, dest_buf, dest_size);

+                    delete pNewBitmap;

+                } else {

+                    _DCTEncodeBitmap(pDict, pBitmap, pParam ? pParam->nQuality : 75, dest_buf, dest_size);

+                }

+            }

+        }

+        if (bStream) {

+            pFileWrite->WriteBlock(dest_buf, dest_size);

+            FX_Free(dest_buf);

+            dest_buf = NULL;

+        }

+    } else if (opType == 1) {

+        if (!bStream) {

+            dest_size = dest_pitch * BitmapHeight;

+            dest_buf = FX_Alloc(FX_BYTE, dest_size);

+        }

+        FX_LPBYTE pDest = dest_buf;

+        for (FX_INT32 i = 0; i < BitmapHeight; i ++) {

+            if (!bStream) {

+                FXSYS_memcpy32(pDest, src_buf, dest_pitch);

+                pDest += dest_pitch;

+            } else {

+                pFileWrite->WriteBlock(src_buf, dest_pitch);

+            }

+            src_buf += src_pitch;

+        }

+    } else if (opType == 2) {

+        if (!bStream) {

+            dest_size = dest_pitch * BitmapHeight;

+            dest_buf = FX_Alloc(FX_BYTE, dest_size);

+        } else {

+            dest_buf = FX_Alloc(FX_BYTE, dest_pitch);

+        }

+        FX_LPBYTE pDest = dest_buf;

+        FX_INT32 src_offset = 0;

+        FX_INT32 dest_offset = 0;

+        for (FX_INT32 row = 0; row < BitmapHeight; row ++) {

+            src_offset = row * src_pitch;

+            for (FX_INT32 column = 0; column < BitmapWidth; column ++) {

+                FX_FLOAT alpha = bUseMatte ? src_buf[src_offset + 3] / 255.0f : 1;

+                pDest[dest_offset] = (FX_BYTE)(src_buf[src_offset + 2] * alpha);

+                pDest[dest_offset + 1] = (FX_BYTE)(src_buf[src_offset + 1] * alpha);

+                pDest[dest_offset + 2] = (FX_BYTE)(src_buf[src_offset] * alpha);

+                dest_offset += 3;

+                src_offset += bpp == 24 ? 3 : 4;

+            }

+            if (bStream) {

+                pFileWrite->WriteBlock(pDest, dest_pitch);

+                pDest = dest_buf;

+            } else {

+                pDest += dest_pitch;

+            }

+            dest_offset = 0;

+        }

+        if (bStream) {

+            FX_Free(dest_buf);

+            dest_buf = NULL;

+        }

+    }

+    if (m_pStream == NULL) {

+        m_pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);

+    }

+    if (!bStream) {

+        m_pStream->InitStream(dest_buf, dest_size, pDict);

+    } else {

+        pFileWrite->Flush();

+        m_pStream->InitStream(pFileRead, pDict);

+    }

+    m_bIsMask = pBitmap->IsAlphaMask();

+    m_Width = BitmapWidth;

+    m_Height = BitmapHeight;

+    if (dest_buf) {

+        FX_Free(dest_buf);

+    }

+}

+void CPDF_Image::ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pBitmap)

+{

+    pPage->GetRenderCache()->ResetBitmap(m_pStream, pBitmap);

+}

diff --git a/core/src/fpdfapi/fpdf_font/common.h b/core/src/fpdfapi/fpdf_font/common.h
new file mode 100644
index 0000000..1c11b28
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/common.h
@@ -0,0 +1,17 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef COMMON_H

+#define COMMON_H

+typedef signed char TT_int8_t;

+typedef unsigned char TT_uint8_t;

+typedef signed short TT_int16_t;

+typedef unsigned short TT_uint16_t;

+typedef FX_INT32 TT_int32_t;

+typedef FX_DWORD TT_uint32_t;

+typedef FX_INT64 TT_int64_t;

+typedef FX_UINT64 TT_uint64_t;

+#endif

diff --git a/core/src/fpdfapi/fpdf_font/font_int.h b/core/src/fpdfapi/fpdf_font/font_int.h
new file mode 100644
index 0000000..779f58e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/font_int.h
@@ -0,0 +1,201 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+typedef void* FXFT_Library;

+class CPDF_CMapManager : public CFX_Object

+{

+public:

+    CPDF_CMapManager();

+    ~CPDF_CMapManager();

+    FX_LPVOID				GetPackage(FX_BOOL bPrompt);

+    CPDF_CMap*				GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPrompt);

+    CPDF_CID2UnicodeMap*	GetCID2UnicodeMap(int charset, FX_BOOL bPrompt);

+    void					ReloadAll();

+private:

+    CPDF_CMap*				LoadPredefinedCMap(const CFX_ByteString& name,  FX_BOOL bPrompt);

+    CPDF_CID2UnicodeMap*	LoadCID2UnicodeMap(int charset, FX_BOOL bPrompt);

+    void					DropAll(FX_BOOL bReload);

+#ifndef _FPDFAPI_MINI_

+    FX_BOOL					m_bPrompted;

+    FX_LPVOID				m_pPackage;

+#endif

+    CFX_MapByteStringToPtr	m_CMaps;

+    CPDF_CID2UnicodeMap*	m_CID2UnicodeMaps[6];

+};

+class CPDF_FontGlobals : public CFX_Object

+{

+public:

+    CPDF_FontGlobals();

+    ~CPDF_FontGlobals();

+    void				ClearAll();

+    void				Clear(void* key);

+    CPDF_Font*			Find(void* key, int index);

+    void				Set(void* key, int index, CPDF_Font* pFont);

+    CFX_MapPtrToPtr		m_pStockMap;

+    CPDF_CMapManager	m_CMapManager;

+    struct {

+        const struct FXCMAP_CMap*	m_pMapList;

+        int				m_Count;

+    } m_EmbeddedCharsets[5];

+    struct {

+        const FX_WORD*	m_pMap;

+        int				m_Count;

+    } m_EmbeddedToUnicodes[5];

+    FX_LPBYTE			m_pContrastRamps;

+};

+struct _CMap_CodeRange {

+    int			m_CharSize;

+    FX_BYTE		m_Lower[4];

+    FX_BYTE		m_Upper[4];

+};

+class CPDF_CMapParser : public CFX_Object

+{

+public:

+    CPDF_CMapParser();

+    ~CPDF_CMapParser() {}

+    FX_BOOL	Initialize(CPDF_CMap*);

+    void	ParseWord(FX_BSTR str);

+    CFX_BinaryBuf	m_AddMaps;

+private:

+    CPDF_CMap*	m_pCMap;

+    int				m_Status;

+    int				m_CodeSeq;

+    FX_DWORD		m_CodePoints[4];

+    CFX_ArrayTemplate<_CMap_CodeRange>	m_CodeRanges;

+    CFX_ByteString	m_Registry, m_Ordering, m_Supplement;

+    CFX_ByteString	m_LastWord;

+};

+#define CIDCODING_UNKNOWN	0

+#define CIDCODING_GB		1

+#define CIDCODING_BIG5		2

+#define CIDCODING_JIS		3

+#define CIDCODING_KOREA		4

+#define CIDCODING_UCS2		5

+#define CIDCODING_CID		6

+#define CIDCODING_UTF16		7

+class CPDF_CMap : public CFX_Object

+{

+public:

+    CPDF_CMap();

+    FX_BOOL					LoadPredefined(CPDF_CMapManager* pMgr, const FX_CHAR* name, FX_BOOL bPromptCJK);

+    FX_BOOL					LoadEmbedded(FX_LPCBYTE pData, FX_DWORD dwSize);

+    void					Release();

+    FX_BOOL					IsLoaded() const

+    {

+        return m_bLoaded;

+    }

+    int						GetCharset()

+    {

+        return m_Charset;

+    }

+    FX_BOOL					IsVertWriting() const

+    {

+        return m_bVertical;

+    }

+    FX_WORD					CIDFromCharCode(FX_DWORD charcode) const;

+    FX_DWORD				CharCodeFromCID(FX_WORD CID) const;

+    int						GetCharSize(FX_DWORD charcode) const;

+    FX_DWORD				GetNextChar(const FX_CHAR* pString, int& offset) const;

+    int						CountChar(const FX_CHAR* pString, int size) const;

+    int						AppendChar(FX_LPSTR str, FX_DWORD charcode) const;

+    typedef enum {OneByte, TwoBytes, MixedTwoBytes, MixedFourBytes} CodingScheme;

+protected:

+    ~CPDF_CMap();

+    friend class			CPDF_CMapParser;

+    friend class			CPDF_CMapManager;

+    friend class			CPDF_CIDFont;

+protected:

+    CFX_ByteString			m_PredefinedCMap;

+    FX_BOOL					m_bVertical;

+    int						m_Charset, m_Coding;

+    CodingScheme			m_CodingScheme;

+    int						m_nCodeRanges;

+    FX_BYTE*				m_pLeadingBytes;

+    FX_WORD*				m_pMapping;

+    FX_LPBYTE				m_pAddMapping;

+    FX_BOOL					m_bLoaded;

+    const FXCMAP_CMap*		m_pEmbedMap;

+    CPDF_CMap*				m_pUseMap;

+};

+class CPDF_PredefinedCMap

+{

+public:

+    FX_LPCSTR	m_pName;

+    int			m_Charset;

+    int			m_Coding;

+    CPDF_CMap::CodingScheme	m_CodingScheme;

+    FX_DWORD	m_LeadingSegCount;

+    FX_BYTE		m_LeadingSegs[4];

+};

+typedef struct _FileHeader {

+    FX_BYTE		btTag[4];

+    FX_BYTE		btVersion;

+    FX_BYTE		btFormat;

+    FX_BYTE		btReserved1[2];

+    FX_DWORD	dwStartIndex;

+    FX_DWORD	dwEndIndex;

+    FX_DWORD	dwDataSize;

+    FX_DWORD	dwDataOffset;

+    FX_DWORD	dwRecordSize;

+} FXMP_FILEHEADER;

+class CPDF_FXMP : public CFX_Object

+{

+public:

+    CPDF_FXMP()

+    {

+        m_pHeader = NULL;

+        m_pTable = NULL;

+    }

+    ~CPDF_FXMP()

+    {

+        if (m_pHeader) {

+            FX_Free(m_pHeader);

+        }

+    }

+    FX_BOOL		IsLoaded()

+    {

+        return m_pTable != NULL;

+    }

+    FX_BOOL		LoadFile(FX_LPVOID pPackage, FX_LPCSTR fileid);

+    FX_LPBYTE	GetRecord(FX_DWORD index);

+private:

+    FXMP_FILEHEADER*	m_pHeader;

+    FX_LPBYTE	m_pTable;

+};

+class CPDF_CID2UnicodeMap : public CFX_Object

+{

+public:

+    CPDF_CID2UnicodeMap();

+    ~CPDF_CID2UnicodeMap();

+    FX_BOOL		Initialize();

+    FX_BOOL		IsLoaded();

+    void		Load(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK);

+    FX_WCHAR	UnicodeFromCID(FX_WORD CID);

+protected:

+    int			m_Charset;

+    const FX_WORD*	m_pEmbeddedMap;

+    FX_DWORD	m_EmbeddedCount;

+#ifndef _FPDFAPI_MINI_

+    CPDF_FXMP*	m_pExternalMap;

+#endif

+};

+class CPDF_ToUnicodeMap : public CFX_Object

+{

+public:

+    void					Load(CPDF_Stream* pStream);

+    CFX_WideString			Lookup(FX_DWORD charcode);

+    FX_DWORD				ReverseLookup(FX_WCHAR unicode);

+protected:

+    CFX_CMapDWordToDWord	m_Map;

+    CPDF_CID2UnicodeMap*	m_pBaseMap;

+    CFX_WideTextBuf			m_MultiCharBuf;

+};

+class CPDF_FontCharMap : public CFX_CharMap, public CFX_Object

+{

+public:

+    CPDF_FontCharMap(CPDF_Font* pFont);

+    CPDF_Font*		m_pFont;

+};

diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
new file mode 100644
index 0000000..886199b
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
@@ -0,0 +1,1763 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fpdfapi/fpdf_pageobj.h"

+#include "font_int.h"

+#include "../fpdf_page/pageint.h"

+#include "../../../include/fxge/fx_freetype.h"

+FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id)

+{

+    for (int i = 0; i < FXFT_Get_Face_CharmapCount(face); i ++) {

+        if (FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(face)[i]) == platform_id &&

+                FXFT_Get_Charmap_EncodingID(FXFT_Get_Face_Charmaps(face)[i]) == encoding_id) {

+            FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]);

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+extern const FX_WORD* PDF_UnicodesForPredefinedCharSet(int);

+CPDF_FontGlobals::CPDF_FontGlobals()

+{

+    FXSYS_memset32(m_EmbeddedCharsets, 0, sizeof m_EmbeddedCharsets);

+    FXSYS_memset32(m_EmbeddedToUnicodes, 0, sizeof m_EmbeddedToUnicodes);

+    m_pContrastRamps = NULL;

+}

+CPDF_FontGlobals::~CPDF_FontGlobals()

+{

+    ClearAll();

+    if (m_pContrastRamps) {

+        FX_Free(m_pContrastRamps);

+    }

+}

+class CFX_StockFontArray : public CFX_Object

+{

+public:

+    CFX_StockFontArray()

+    {

+        FXSYS_memset32(m_pStockFonts, 0, sizeof(CPDF_Font*) * 14);

+    }

+    CPDF_Font*			m_pStockFonts[14];

+};

+CPDF_Font* CPDF_FontGlobals::Find(void* key, int index)

+{

+    void* value = NULL;

+    if (!m_pStockMap.Lookup(key, value)) {

+        return NULL;

+    }

+    if (!value) {

+        return NULL;

+    }

+    return ((CFX_StockFontArray*)value)->m_pStockFonts[index];

+}

+void CPDF_FontGlobals::Set(void* key, int index, CPDF_Font* pFont)

+{

+    void* value = NULL;

+    if (m_pStockMap.Lookup(key, value)) {

+        ((CFX_StockFontArray*)value)->m_pStockFonts[index] = pFont;

+        return;

+    }

+    CFX_StockFontArray* pFonts = FX_NEW CFX_StockFontArray();

+    if (pFonts) {

+        pFonts->m_pStockFonts[index] = pFont;

+    }

+    m_pStockMap.SetAt(key, pFonts);

+}

+void CPDF_FontGlobals::Clear(void* key)

+{

+    void* value = NULL;

+    if (!m_pStockMap.Lookup(key, value)) {

+        return;

+    }

+    if (value) {

+        CFX_StockFontArray* pStockFonts = (CFX_StockFontArray*)value;

+        for (int i = 0; i < 14; i ++) {

+            if (pStockFonts->m_pStockFonts[i]) {

+                pStockFonts->m_pStockFonts[i]->GetFontDict()->Release();

+                delete pStockFonts->m_pStockFonts[i];

+            }

+        }

+        delete pStockFonts;

+    }

+    m_pStockMap.RemoveKey(key);

+}

+void CPDF_FontGlobals::ClearAll()

+{

+    FX_POSITION pos = m_pStockMap.GetStartPosition();

+    while (pos) {

+        void *key = NULL;

+        void* value = NULL;

+        m_pStockMap.GetNextAssoc(pos, key, value);

+        if (value) {

+            CFX_StockFontArray* pStockFonts = (CFX_StockFontArray*)value;

+            for (int i = 0; i < 14; i ++) {

+                if (pStockFonts->m_pStockFonts[i]) {

+                    pStockFonts->m_pStockFonts[i]->GetFontDict()->Release();

+                    delete pStockFonts->m_pStockFonts[i];

+                }

+            }

+            delete pStockFonts;

+        }

+        m_pStockMap.RemoveKey(key);

+    }

+}

+CPDF_Font::CPDF_Font()

+{

+    m_FontType = 0;

+    m_FontBBox.left = m_FontBBox.right = m_FontBBox.top = m_FontBBox.bottom = 0;

+    m_StemV = m_Ascent = m_Descent = m_ItalicAngle = 0;

+    m_pFontFile = NULL;

+    m_Flags = 0;

+    m_pToUnicodeMap = NULL;

+    m_bToUnicodeLoaded = FALSE;

+    m_pCharMap = NULL;

+}

+FX_BOOL CPDF_Font::Initialize()

+{

+    m_pCharMap = FX_NEW CPDF_FontCharMap(this);

+    return TRUE;

+}

+CPDF_Font::~CPDF_Font()

+{

+    if (m_pCharMap) {

+        FX_Free(m_pCharMap);

+        m_pCharMap = NULL;

+    }

+    if (m_pToUnicodeMap) {

+        delete m_pToUnicodeMap;

+        m_pToUnicodeMap = NULL;

+    }

+    if (m_pFontFile) {

+        m_pDocument->GetPageData()->ReleaseFontFileStreamAcc((CPDF_Stream*)m_pFontFile->GetStream());

+    }

+}

+FX_BOOL CPDF_Font::IsVertWriting() const

+{

+    FX_BOOL bVertWriting = FALSE;

+    CPDF_CIDFont* pCIDFont = GetCIDFont();

+    if (pCIDFont) {

+        bVertWriting = pCIDFont->IsVertWriting();

+    } else {

+        bVertWriting = m_Font.IsVertical();

+    }

+    return bVertWriting;

+}

+CFX_ByteString CPDF_Font::GetFontTypeName() const

+{

+    switch (m_FontType) {

+        case PDFFONT_TYPE1:

+            return FX_BSTRC("Type1");

+        case PDFFONT_TRUETYPE:

+            return FX_BSTRC("TrueType");

+        case PDFFONT_TYPE3:

+            return FX_BSTRC("Type3");

+        case PDFFONT_CIDFONT:

+            return FX_BSTRC("Type0");

+    }

+    return CFX_ByteString();

+}

+void CPDF_Font::AppendChar(CFX_ByteString& str, FX_DWORD charcode) const

+{

+    char buf[4];

+    int len = AppendChar(buf, charcode);

+    if (len == 1) {

+        str += buf[0];

+    } else {

+        str += CFX_ByteString(buf, len);

+    }

+}

+CFX_WideString CPDF_Font::UnicodeFromCharCode(FX_DWORD charcode) const

+{

+    if (!m_bToUnicodeLoaded) {

+        ((CPDF_Font*)this)->LoadUnicodeMap();

+    }

+    if (m_pToUnicodeMap) {

+        CFX_WideString wsRet = m_pToUnicodeMap->Lookup(charcode);

+        if (!wsRet.IsEmpty()) {

+            return wsRet;

+        }

+    }

+    FX_WCHAR unicode = _UnicodeFromCharCode(charcode);

+    if (unicode == 0) {

+        return CFX_WideString();

+    }

+    return unicode;

+}

+FX_DWORD CPDF_Font::CharCodeFromUnicode(FX_WCHAR unicode) const

+{

+    if (!m_bToUnicodeLoaded) {

+        ((CPDF_Font*)this)->LoadUnicodeMap();

+    }

+    if (m_pToUnicodeMap) {

+        FX_DWORD charcode = m_pToUnicodeMap->ReverseLookup(unicode);

+        if (charcode) {

+            return charcode;

+        }

+    }

+    return _CharCodeFromUnicode(unicode);

+}

+CFX_WideString CPDF_Font::DecodeString(const CFX_ByteString& str) const

+{

+    CFX_WideString result;

+    int src_len = str.GetLength();

+    result.Reserve(src_len);

+    FX_LPCSTR src_buf = str;

+    int src_pos = 0;

+    while (src_pos < src_len) {

+        FX_DWORD charcode = GetNextChar(src_buf, src_pos);

+        CFX_WideString unicode = UnicodeFromCharCode(charcode);

+        if (!unicode.IsEmpty()) {

+            result += unicode;

+        } else {

+            result += (FX_WCHAR)charcode;

+        }

+    }

+    return result;

+}

+CFX_ByteString CPDF_Font::EncodeString(const CFX_WideString& str) const

+{

+    CFX_ByteString result;

+    int src_len = str.GetLength();

+    FX_LPSTR dest_buf = result.GetBuffer(src_len * 2);

+    FX_LPCWSTR src_buf = str;

+    int dest_pos = 0;

+    for (int src_pos = 0; src_pos < src_len; src_pos ++) {

+        FX_DWORD charcode = CharCodeFromUnicode(src_buf[src_pos]);

+        dest_pos += AppendChar(dest_buf + dest_pos, charcode);

+    }

+    result.ReleaseBuffer(dest_pos);

+    return result;

+}

+void CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc)

+{

+    m_Flags = pFontDesc->GetInteger(FX_BSTRC("Flags"), PDFFONT_NONSYMBOLIC);

+    int ItalicAngle = 0;

+    FX_BOOL bExistItalicAngle = FALSE;

+    if (pFontDesc->KeyExist(FX_BSTRC("ItalicAngle"))) {

+        ItalicAngle = pFontDesc->GetInteger(FX_BSTRC("ItalicAngle"));

+        bExistItalicAngle = TRUE;

+    }

+    if (ItalicAngle < 0) {

+        m_Flags |= PDFFONT_ITALIC;

+        m_ItalicAngle = ItalicAngle;

+    }

+    FX_BOOL bExistStemV = FALSE;

+    if (pFontDesc->KeyExist(FX_BSTRC("StemV"))) {

+        m_StemV = pFontDesc->GetInteger(FX_BSTRC("StemV"));

+        bExistStemV = TRUE;

+    }

+    FX_BOOL bExistAscent = FALSE;

+    if (pFontDesc->KeyExist(FX_BSTRC("Ascent"))) {

+        m_Ascent = pFontDesc->GetInteger(FX_BSTRC("Ascent"));

+        bExistAscent = TRUE;

+    }

+    FX_BOOL bExistDescent = FALSE;

+    if (pFontDesc->KeyExist(FX_BSTRC("Descent"))) {

+        m_Descent = pFontDesc->GetInteger(FX_BSTRC("Descent"));

+        bExistDescent = TRUE;

+    }

+    FX_BOOL bExistCapHeight = FALSE;

+    if (pFontDesc->KeyExist(FX_BSTRC("CapHeight"))) {

+        bExistCapHeight = TRUE;

+    }

+    if (bExistItalicAngle && bExistAscent && bExistCapHeight && bExistDescent && bExistStemV) {

+        m_Flags |= PDFFONT_USEEXTERNATTR;

+    }

+    if (m_Descent > 10) {

+        m_Descent = -m_Descent;

+    }

+    CPDF_Array* pBBox = pFontDesc->GetArray(FX_BSTRC("FontBBox"));

+    if (pBBox) {

+        m_FontBBox.left = pBBox->GetInteger(0);

+        m_FontBBox.bottom = pBBox->GetInteger(1);

+        m_FontBBox.right = pBBox->GetInteger(2);

+        m_FontBBox.top = pBBox->GetInteger(3);

+    }

+    CPDF_Stream* pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile"));

+    if (pFontFile == NULL) {

+        pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile2"));

+    }

+    if (pFontFile == NULL) {

+        pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile3"));

+    }

+    if (pFontFile) {

+        m_pFontFile = m_pDocument->LoadFontFile(pFontFile);

+        if (m_pFontFile == NULL) {

+            return;

+        }

+        FX_LPCBYTE pFontData = m_pFontFile->GetData();

+        FX_DWORD dwFontSize = m_pFontFile->GetSize();

+        m_Font.LoadEmbedded(pFontData, dwFontSize);

+        if (m_Font.m_Face == NULL) {

+            m_pFontFile = NULL;

+        }

+    }

+}

+short TT2PDF(int m, FXFT_Face face)

+{

+    int upm = FXFT_Get_Face_UnitsPerEM(face);

+    if (upm == 0) {

+        return (short)m;

+    }

+    return (m * 1000 + upm / 2) / upm;

+}

+void CPDF_Font::CheckFontMetrics()

+{

+    if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 && m_FontBBox.right == 0) {

+        if (m_Font.m_Face) {

+            m_FontBBox.left = TT2PDF(FXFT_Get_Face_xMin(m_Font.m_Face), m_Font.m_Face);

+            m_FontBBox.bottom = TT2PDF(FXFT_Get_Face_yMin(m_Font.m_Face), m_Font.m_Face);

+            m_FontBBox.right = TT2PDF(FXFT_Get_Face_xMax(m_Font.m_Face), m_Font.m_Face);

+            m_FontBBox.top = TT2PDF(FXFT_Get_Face_yMax(m_Font.m_Face), m_Font.m_Face);

+            m_Ascent = TT2PDF(FXFT_Get_Face_Ascender(m_Font.m_Face), m_Font.m_Face);

+            m_Descent = TT2PDF(FXFT_Get_Face_Descender(m_Font.m_Face), m_Font.m_Face);

+        } else {

+            FX_BOOL bFirst = TRUE;

+            for (int i = 0; i < 256; i ++) {

+                FX_RECT rect;

+                GetCharBBox(i, rect);

+                if (rect.left == rect.right) {

+                    continue;

+                }

+                if (bFirst) {

+                    m_FontBBox = rect;

+                    bFirst = FALSE;

+                } else {

+                    if (m_FontBBox.top < rect.top) {

+                        m_FontBBox.top = rect.top;

+                    }

+                    if (m_FontBBox.right < rect.right) {

+                        m_FontBBox.right = rect.right;

+                    }

+                    if (m_FontBBox.left > rect.left) {

+                        m_FontBBox.left = rect.left;

+                    }

+                    if (m_FontBBox.bottom > rect.bottom) {

+                        m_FontBBox.bottom = rect.bottom;

+                    }

+                }

+            }

+        }

+    }

+    if (m_Ascent == 0 && m_Descent == 0) {

+        FX_RECT rect;

+        GetCharBBox('A', rect);

+        if (rect.bottom == rect.top) {

+            m_Ascent = m_FontBBox.top;

+        } else {

+            m_Ascent = rect.top;

+        }

+        GetCharBBox('g', rect);

+        if (rect.bottom == rect.top) {

+            m_Descent = m_FontBBox.bottom;

+        } else {

+            m_Descent = rect.bottom;

+        }

+    }

+}

+void CPDF_Font::LoadUnicodeMap()

+{

+    m_bToUnicodeLoaded = TRUE;

+    CPDF_Stream* pStream = m_pFontDict->GetStream(FX_BSTRC("ToUnicode"));

+    if (pStream == NULL) {

+        return;

+    }

+    m_pToUnicodeMap = FX_NEW CPDF_ToUnicodeMap;

+    m_pToUnicodeMap->Load(pStream);

+}

+int CPDF_Font::GetStringWidth(FX_LPCSTR pString, int size)

+{

+    int offset = 0;

+    int width = 0;

+    while (offset < size) {

+        FX_DWORD charcode = GetNextChar(pString, offset);

+        width += GetCharWidthF(charcode);

+    }

+    return width;

+}

+int CPDF_Font::GetCharTypeWidth(FX_DWORD charcode)

+{

+    if (m_Font.m_Face == NULL) {

+        return 0;

+    }

+    int glyph_index = GlyphFromCharCode(charcode);

+    if (glyph_index == 0xffff) {

+        return 0;

+    }

+    return m_Font.GetGlyphWidth(glyph_index);

+}

+int _PDF_GetStandardFontName(CFX_ByteString& name);

+CPDF_Font* CPDF_Font::GetStockFont(CPDF_Document* pDoc, FX_BSTR name)

+{

+    CFX_ByteString fontname(name);

+    int font_id = _PDF_GetStandardFontName(fontname);

+    if (font_id < 0) {

+        return NULL;

+    }

+    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();

+    CPDF_Font* pFont = pFontGlobals->Find(pDoc, font_id);

+    if (pFont) {

+        return pFont;

+    }

+    CPDF_Dictionary* pDict = CPDF_Dictionary::Create();

+    pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font"));

+    pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1"));

+    pDict->SetAtName(FX_BSTRC("BaseFont"), fontname);

+    pDict->SetAtName(FX_BSTRC("Encoding"), FX_BSTRC("WinAnsiEncoding"));

+    pFont = CPDF_Font::CreateFontF(NULL, pDict);

+    pFontGlobals->Set(pDoc, font_id, pFont);

+    return pFont;

+}

+const FX_BYTE ChineseFontNames[][5] = {

+    {0xCB, 0xCE, 0xCC, 0xE5, 0x00},

+    {0xBF, 0xAC, 0xCC, 0xE5, 0x00},

+    {0xBA, 0xDA, 0xCC, 0xE5, 0x00},

+    {0xB7, 0xC2, 0xCB, 0xCE, 0x00},

+    {0xD0, 0xC2, 0xCB, 0xCE, 0x00}

+};

+CPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict)

+{

+    CFX_ByteString type = pFontDict->GetString(FX_BSTRC("Subtype"));

+    CPDF_Font* pFont;

+    if (type == FX_BSTRC("TrueType")) {

+        {

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_ || _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_

+            CFX_ByteString basefont = pFontDict->GetString(FX_BSTRC("BaseFont"));

+            CFX_ByteString tag = basefont.Left(4);

+            int i;

+            int count = sizeof(ChineseFontNames) / sizeof(ChineseFontNames[0]);

+            for (i = 0; i < count; ++i) {

+                if (tag == CFX_ByteString((FX_LPCSTR)ChineseFontNames[i])) {

+                    break;

+                }

+            }

+            if (i < count) {

+                CPDF_Dictionary* pFontDesc = pFontDict->GetDict(FX_BSTRC("FontDescriptor"));

+                if (pFontDesc == NULL || !pFontDesc->KeyExist(FX_BSTRC("FontFile2"))) {

+                    pFont = FX_NEW CPDF_CIDFont;

+                    pFont->Initialize();

+                    pFont->m_FontType = PDFFONT_CIDFONT;

+                    pFont->m_pFontDict = pFontDict;

+                    pFont->m_pDocument = pDoc;

+                    if (!pFont->Load()) {

+                        delete pFont;

+                        return NULL;

+                    }

+                    return pFont;

+                }

+            }

+#endif

+        }

+        pFont = FX_NEW CPDF_TrueTypeFont;

+        pFont->Initialize();

+        pFont->m_FontType = PDFFONT_TRUETYPE;

+    } else if (type == FX_BSTRC("Type3")) {

+        pFont = FX_NEW CPDF_Type3Font;

+        pFont->Initialize();

+        pFont->m_FontType = PDFFONT_TYPE3;

+    } else if (type == FX_BSTRC("Type0")) {

+        pFont = FX_NEW CPDF_CIDFont;

+        pFont->Initialize();

+        pFont->m_FontType = PDFFONT_CIDFONT;

+    } else {

+        pFont = FX_NEW CPDF_Type1Font;

+        pFont->Initialize();

+        pFont->m_FontType = PDFFONT_TYPE1;

+    }

+    pFont->m_pFontDict = pFontDict;

+    pFont->m_pDocument = pDoc;

+    if (!pFont->Load()) {

+        delete pFont;

+        return NULL;

+    }

+    return pFont;

+}

+FX_BOOL CPDF_Font::Load()

+{

+    if (m_pFontDict == NULL) {

+        return FALSE;

+    }

+    CFX_ByteString type = m_pFontDict->GetString(FX_BSTRC("Subtype"));

+    m_BaseFont = m_pFontDict->GetString(FX_BSTRC("BaseFont"));

+    if (type == FX_BSTRC("MMType1")) {

+        type = FX_BSTRC("Type1");

+    }

+    return _Load();

+}

+static CFX_WideString _FontMap_GetWideString(CFX_CharMap* pMap, const CFX_ByteString& bytestr)

+{

+    return ((CPDF_FontCharMap*)pMap)->m_pFont->DecodeString(bytestr);

+}

+static CFX_ByteString _FontMap_GetByteString(CFX_CharMap* pMap, const CFX_WideString& widestr)

+{

+    return ((CPDF_FontCharMap*)pMap)->m_pFont->EncodeString(widestr);

+}

+CPDF_FontCharMap::CPDF_FontCharMap(CPDF_Font* pFont)

+{

+    m_GetByteString = _FontMap_GetByteString;

+    m_GetWideString = _FontMap_GetWideString;

+    m_pFont = pFont;

+}

+CFX_WideString CPDF_ToUnicodeMap::Lookup(FX_DWORD charcode)

+{

+    FX_DWORD value;

+    if (m_Map.Lookup(charcode, value)) {

+        FX_WCHAR unicode = (FX_WCHAR)(value & 0xffff);

+        if (unicode != 0xffff) {

+            return unicode;

+        }

+        FX_LPCWSTR buf = m_MultiCharBuf.GetBuffer();

+        FX_DWORD buf_len = m_MultiCharBuf.GetLength();

+        if (buf == NULL || buf_len == 0) {

+            return CFX_WideString();

+        }

+        FX_DWORD index = value >> 16;

+        if (index >= buf_len) {

+            return CFX_WideString();

+        }

+        FX_DWORD len = buf[index];

+        if (index + len < index || index + len >= buf_len) {

+            return CFX_WideString();

+        }

+        return CFX_WideString(buf + index + 1, len);

+    }

+    if (m_pBaseMap) {

+        return m_pBaseMap->UnicodeFromCID((FX_WORD)charcode);

+    }

+    return CFX_WideString();

+}

+FX_DWORD CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode)

+{

+    FX_POSITION pos = m_Map.GetStartPosition();

+    while (pos) {

+        FX_DWORD key, value;

+        m_Map.GetNextAssoc(pos, key, value);

+        if ((FX_WCHAR)value == unicode) {

+            return key;

+        }

+    }

+    return 0;

+}

+static FX_DWORD _StringToCode(FX_BSTR str)

+{

+    FX_LPCSTR buf = str.GetCStr();

+    int len = str.GetLength();

+    if (len == 0) {

+        return 0;

+    }

+    int result = 0;

+    if (buf[0] == '<') {

+        for (int i = 1; i < len; i ++) {

+            int digit;

+            if (buf[i] >= '0' && buf[i] <= '9') {

+                digit = buf[i] - '0';

+            } else if (buf[i] >= 'a' && buf[i] <= 'f') {

+                digit = buf[i] - 'a' + 10;

+            } else if (buf[i] >= 'A' && buf[i] <= 'F') {

+                digit = buf[i] - 'A' + 10;

+            } else {

+                break;

+            }

+            result = result * 16 + digit;

+        }

+        return result;

+    } else {

+        for (int i = 0; i < len; i ++) {

+            if (buf[i] < '0' || buf[i] > '9') {

+                break;

+            }

+            result = result * 10 + buf[i] - '0';

+        }

+    }

+    return result;

+}

+static CFX_WideString _StringDataAdd(CFX_WideString str)

+{

+    CFX_WideString ret;

+    int len = str.GetLength();

+    FX_WCHAR value = 1;

+    for (int i = len - 1; i >= 0 ; --i) {

+        FX_WCHAR ch = str[i] + value;

+        if (ch < str[i]) {

+            ret.Insert(0, 0);

+        } else {

+            ret.Insert(0, ch);

+            value = 0;

+        }

+    }

+    if (value) {

+        ret.Insert(0, value);

+    }

+    return ret;

+}

+static CFX_WideString _StringToWideString(FX_BSTR str)

+{

+    FX_LPCSTR buf = str.GetCStr();

+    int len = str.GetLength();

+    if (len == 0) {

+        return CFX_WideString();

+    }

+    CFX_WideString result;

+    if (buf[0] == '<') {

+        int byte_pos = 0;

+        FX_WCHAR ch = 0;

+        for (int i = 1; i < len; i ++) {

+            int digit;

+            if (buf[i] >= '0' && buf[i] <= '9') {

+                digit = buf[i] - '0';

+            } else if (buf[i] >= 'a' && buf[i] <= 'f') {

+                digit = buf[i] - 'a' + 10;

+            } else if (buf[i] >= 'A' && buf[i] <= 'F') {

+                digit = buf[i] - 'A' + 10;

+            } else {

+                break;

+            }

+            ch = ch * 16 + digit;

+            byte_pos ++;

+            if (byte_pos == 4) {

+                result += ch;

+                byte_pos = 0;

+                ch = 0;

+            }

+        }

+        return result;

+    }

+    if (buf[0] == '(') {

+    }

+    return result;

+}

+void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream)

+{

+    int CIDSet = 0;

+    CPDF_StreamAcc stream;

+    stream.LoadAllData(pStream, FALSE);

+    CPDF_SimpleParser parser(stream.GetData(), stream.GetSize());

+    m_Map.EstimateSize(stream.GetSize() / 8, 1024);

+    while (1) {

+        CFX_ByteStringC word = parser.GetWord();

+        if (word.IsEmpty()) {

+            break;

+        }

+        if (word == FX_BSTRC("beginbfchar")) {

+            while (1) {

+                word = parser.GetWord();

+                if (word.IsEmpty() || word == FX_BSTRC("endbfchar")) {

+                    break;

+                }

+                FX_DWORD srccode = _StringToCode(word);

+                word = parser.GetWord();

+                CFX_WideString destcode = _StringToWideString(word);

+                int len = destcode.GetLength();

+                if (len == 0) {

+                    continue;

+                }

+                if (len == 1) {

+                    m_Map.SetAt(srccode, destcode.GetAt(0));

+                } else {

+                    m_Map.SetAt(srccode, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);

+                    m_MultiCharBuf.AppendChar(destcode.GetLength());

+                    m_MultiCharBuf << destcode;

+                }

+            }

+        } else if (word == FX_BSTRC("beginbfrange")) {

+            while (1) {

+                CFX_ByteString low, high;

+                low = parser.GetWord();

+                if (low.IsEmpty() || low == FX_BSTRC("endbfrange")) {

+                    break;

+                }

+                high = parser.GetWord();

+                FX_DWORD lowcode = _StringToCode(low);

+                FX_DWORD highcode = (lowcode & 0xffffff00) | (_StringToCode(high) & 0xff);

+                if (highcode == (FX_DWORD) - 1) {

+                    break;

+                }

+                CFX_ByteString start = parser.GetWord();

+                if (start == FX_BSTRC("[")) {

+                    for (FX_DWORD code = lowcode; code <= highcode; code ++) {

+                        CFX_ByteString dest = parser.GetWord();

+                        CFX_WideString destcode = _StringToWideString(dest);

+                        int len = destcode.GetLength();

+                        if (len == 0) {

+                            continue;

+                        }

+                        if (len == 1) {

+                            m_Map.SetAt(code, destcode.GetAt(0));

+                        } else {

+                            m_Map.SetAt(code, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);

+                            m_MultiCharBuf.AppendChar(destcode.GetLength());

+                            m_MultiCharBuf << destcode;

+                        }

+                    }

+                    parser.GetWord();

+                } else {

+                    CFX_WideString destcode = _StringToWideString(start);

+                    int len = destcode.GetLength();

+                    FX_DWORD value = 0;

+                    if (len == 1) {

+                        value = _StringToCode(start);

+                        for (FX_DWORD code = lowcode; code <= highcode; code ++) {

+                            m_Map.SetAt(code, value++);

+                        }

+                    } else {

+                        for (FX_DWORD code = lowcode; code <= highcode; code ++) {

+                            CFX_WideString retcode;

+                            if (code == lowcode) {

+                                retcode = destcode;

+                            } else {

+                                retcode = _StringDataAdd(destcode);

+                            }

+                            m_Map.SetAt(code, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);

+                            m_MultiCharBuf.AppendChar(retcode.GetLength());

+                            m_MultiCharBuf << retcode;

+                            destcode = retcode;

+                        }

+                    }

+                }

+            }

+        } else if (word == FX_BSTRC("/Adobe-Korea1-UCS2")) {

+            CIDSet = CIDSET_KOREA1;

+        } else if (word == FX_BSTRC("/Adobe-Japan1-UCS2")) {

+            CIDSet = CIDSET_JAPAN1;

+        } else if (word == FX_BSTRC("/Adobe-CNS1-UCS2")) {

+            CIDSet = CIDSET_CNS1;

+        } else if (word == FX_BSTRC("/Adobe-GB1-UCS2")) {

+            CIDSet = CIDSET_GB1;

+        }

+    }

+    if (CIDSet) {

+        m_pBaseMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(CIDSet, FALSE);

+    } else {

+        m_pBaseMap = NULL;

+    }

+}

+static FX_BOOL GetPredefinedEncoding(int& basemap, const CFX_ByteString& value)

+{

+    if (value == FX_BSTRC("WinAnsiEncoding")) {

+        basemap = PDFFONT_ENCODING_WINANSI;

+    } else if (value == FX_BSTRC("MacRomanEncoding")) {

+        basemap = PDFFONT_ENCODING_MACROMAN;

+    } else if (value == FX_BSTRC("MacExpertEncoding")) {

+        basemap = PDFFONT_ENCODING_MACEXPERT;

+    } else if (value == FX_BSTRC("PDFDocEncoding")) {

+        basemap = PDFFONT_ENCODING_PDFDOC;

+    } else {

+        return FALSE;

+    }

+    return TRUE;

+}

+void CPDF_Font::LoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding, CFX_ByteString*& pCharNames,

+                                FX_BOOL bEmbedded, FX_BOOL bTrueType)

+{

+    if (pEncoding == NULL) {

+        if (m_BaseFont == FX_BSTRC("Symbol")) {

+            iBaseEncoding = bTrueType ? PDFFONT_ENCODING_MS_SYMBOL : PDFFONT_ENCODING_ADOBE_SYMBOL;

+        } else if (!bEmbedded && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) {

+            iBaseEncoding = PDFFONT_ENCODING_WINANSI;

+        }

+        return;

+    }

+    if (pEncoding->GetType() == PDFOBJ_NAME) {

+        if (iBaseEncoding == PDFFONT_ENCODING_ADOBE_SYMBOL || iBaseEncoding == PDFFONT_ENCODING_ZAPFDINGBATS) {

+            return;

+        }

+        if ((m_Flags & PDFFONT_SYMBOLIC) && m_BaseFont == FX_BSTRC("Symbol")) {

+            if (!bTrueType) {

+                iBaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL;

+            }

+            return;

+        }

+        CFX_ByteString bsEncoding = pEncoding->GetString();

+        if (bsEncoding.Compare(FX_BSTRC("MacExpertEncoding")) == 0) {

+            bsEncoding = FX_BSTRC("WinAnsiEncoding");

+        }

+        GetPredefinedEncoding(iBaseEncoding, bsEncoding);

+        return;

+    }

+    if (pEncoding->GetType() != PDFOBJ_DICTIONARY) {

+        return;

+    }

+    CPDF_Dictionary* pDict = (CPDF_Dictionary*)pEncoding;

+    if (iBaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL && iBaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS) {

+        CFX_ByteString bsEncoding = pDict->GetString(FX_BSTRC("BaseEncoding"));

+        if (bsEncoding.Compare(FX_BSTRC("MacExpertEncoding")) == 0 && bTrueType) {

+            bsEncoding = FX_BSTRC("WinAnsiEncoding");

+        }

+        GetPredefinedEncoding(iBaseEncoding, bsEncoding);

+    }

+    if ((!bEmbedded || bTrueType) && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) {

+        iBaseEncoding = PDFFONT_ENCODING_STANDARD;

+    }

+    CPDF_Array* pDiffs = pDict->GetArray(FX_BSTRC("Differences"));

+    if (pDiffs == NULL) {

+        return;

+    }

+    FX_NEW_VECTOR(pCharNames, CFX_ByteString, 256);

+    FX_DWORD cur_code = 0;

+    for (FX_DWORD i = 0; i < pDiffs->GetCount(); i ++) {

+        CPDF_Object* pElement = pDiffs->GetElementValue(i);

+        if (pElement == NULL) {

+            continue;

+        }

+        if (pElement->GetType() == PDFOBJ_NAME) {

+            if (cur_code < 256) {

+                pCharNames[cur_code] = ((CPDF_Name*)pElement)->GetString();

+            }

+            cur_code ++;

+        } else {

+            cur_code = pElement->GetInteger();

+        }

+    }

+}

+FX_BOOL CPDF_Font::IsStandardFont() const

+{

+    if (m_FontType != PDFFONT_TYPE1) {

+        return FALSE;

+    }

+    if (m_pFontFile != NULL) {

+        return FALSE;

+    }

+    if (((CPDF_Type1Font*)this)->GetBase14Font() < 0) {

+        return FALSE;

+    }

+    return TRUE;

+}

+extern FX_LPCSTR PDF_CharNameFromPredefinedCharSet(int encoding, FX_BYTE charcode);

+CPDF_SimpleFont::CPDF_SimpleFont()

+{

+    FXSYS_memset8(m_CharBBox, 0xff, sizeof m_CharBBox);

+    FXSYS_memset8(m_CharWidth, 0xff, sizeof m_CharWidth);

+    FXSYS_memset8(m_GlyphIndex, 0xff, sizeof m_GlyphIndex);

+    FXSYS_memset8(m_ExtGID, 0xff, sizeof m_ExtGID);

+    m_pCharNames = NULL;

+    m_BaseEncoding = PDFFONT_ENCODING_BUILTIN;

+}

+CPDF_SimpleFont::~CPDF_SimpleFont()

+{

+    if (m_pCharNames) {

+        FX_DELETE_VECTOR(m_pCharNames, CFX_ByteString, 256);

+    }

+}

+int CPDF_SimpleFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph)

+{

+    if (pVertGlyph) {

+        *pVertGlyph = FALSE;

+    }

+    if (charcode > 0xff) {

+        return -1;

+    }

+    int index = m_GlyphIndex[(FX_BYTE)charcode];

+    if (index == 0xffff) {

+        return -1;

+    }

+    return index;

+}

+void CPDF_SimpleFont::LoadCharMetrics(int charcode)

+{

+    if (m_Font.m_Face == NULL) {

+        return;

+    }

+    if (charcode < 0 || charcode > 0xff) {

+        return;

+    }

+    int glyph_index = m_GlyphIndex[charcode];

+    if (glyph_index == 0xffff) {

+        if (m_pFontFile == NULL && charcode != 32) {

+            LoadCharMetrics(32);

+            m_CharBBox[charcode] = m_CharBBox[32];

+            if (m_bUseFontWidth) {

+                m_CharWidth[charcode] = m_CharWidth[32];

+            }

+        }

+        return;

+    }

+    int err = FXFT_Load_Glyph(m_Font.m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);

+    if (err) {

+        return;

+    }

+    m_CharBBox[charcode].Left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face), m_Font.m_Face);

+    m_CharBBox[charcode].Right = TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face) + FXFT_Get_Glyph_Width(m_Font.m_Face), m_Font.m_Face);

+    m_CharBBox[charcode].Top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face), m_Font.m_Face);

+    m_CharBBox[charcode].Bottom = TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face) - FXFT_Get_Glyph_Height(m_Font.m_Face), m_Font.m_Face);

+    if (m_bUseFontWidth) {

+        int TT_Width = TT2PDF(FXFT_Get_Glyph_HoriAdvance(m_Font.m_Face), m_Font.m_Face);

+        if (m_CharWidth[charcode] == 0xffff) {

+            m_CharWidth[charcode] = TT_Width;

+        } else if (TT_Width && !IsEmbedded()) {

+            m_CharBBox[charcode].Right = m_CharBBox[charcode].Right * m_CharWidth[charcode] / TT_Width;

+            m_CharBBox[charcode].Left = m_CharBBox[charcode].Left * m_CharWidth[charcode] / TT_Width;

+        }

+    }

+}

+int CPDF_SimpleFont::GetCharWidthF(FX_DWORD charcode, int level)

+{

+    if (charcode > 0xff) {

+        charcode = 0;

+    }

+    if (m_CharWidth[charcode] == 0xffff) {

+        LoadCharMetrics(charcode);

+        if (m_CharWidth[charcode] == 0xffff) {

+            m_CharWidth[charcode] = 0;

+        }

+    }

+    return (FX_INT16)m_CharWidth[charcode];

+}

+void CPDF_SimpleFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)

+{

+    if (charcode > 0xff) {

+        charcode = 0;

+    }

+    if (m_CharBBox[charcode].Left == (FX_SHORT)0xffff) {

+        LoadCharMetrics(charcode);

+    }

+    rect.left = m_CharBBox[charcode].Left;

+    rect.right = m_CharBBox[charcode].Right;

+    rect.bottom = m_CharBBox[charcode].Bottom;

+    rect.top = m_CharBBox[charcode].Top;

+}

+FX_LPCSTR GetAdobeCharName(int iBaseEncoding, const CFX_ByteString* pCharNames, int charcode)

+{

+    ASSERT(charcode >= 0 && charcode < 256);

+    if (charcode < 0 || charcode >= 256) {

+        return NULL;

+    }

+    FX_LPCSTR name = NULL;

+    if (pCharNames) {

+        name = pCharNames[charcode];

+    }

+    if ((name == NULL || name[0] == 0) && iBaseEncoding) {

+        name = PDF_CharNameFromPredefinedCharSet(iBaseEncoding, charcode);

+    }

+    if (name == NULL || name[0] == 0) {

+        return NULL;

+    }

+    return name;

+}

+FX_BOOL CPDF_SimpleFont::LoadCommon()

+{

+    CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC("FontDescriptor"));

+    if (pFontDesc) {

+        LoadFontDescriptor(pFontDesc);

+    }

+    CPDF_Array* pWidthArray = m_pFontDict->GetArray(FX_BSTRC("Widths"));

+    int width_start = 0, width_end = -1;

+    m_bUseFontWidth = TRUE;

+    if (pWidthArray) {

+        m_bUseFontWidth = FALSE;

+        if (pFontDesc && pFontDesc->KeyExist(FX_BSTRC("MissingWidth"))) {

+            int MissingWidth = pFontDesc->GetInteger(FX_BSTRC("MissingWidth"));

+            for (int i = 0; i < 256; i ++) {

+                m_CharWidth[i] = MissingWidth;

+            }

+        }

+        width_start = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"), 0);

+        width_end = m_pFontDict->GetInteger(FX_BSTRC("LastChar"), 0);

+        if (width_start >= 0 && width_start <= 255) {

+            if (width_end <= 0 || width_end >= width_start + (int)pWidthArray->GetCount()) {

+                width_end = width_start + pWidthArray->GetCount() - 1;

+            }

+            if (width_end > 255) {

+                width_end = 255;

+            }

+            for (int i = width_start; i <= width_end; i ++) {

+                m_CharWidth[i] = pWidthArray->GetInteger(i - width_start);

+            }

+        }

+    }

+    if (m_pFontFile == NULL) {

+        LoadSubstFont();

+    } else {

+        if (m_BaseFont.GetLength() > 8 && m_BaseFont[7] == '+') {

+            m_BaseFont = m_BaseFont.Mid(8);

+        }

+    }

+    if (!(m_Flags & PDFFONT_SYMBOLIC)) {

+        m_BaseEncoding = PDFFONT_ENCODING_STANDARD;

+    }

+    CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC("Encoding"));

+    LoadPDFEncoding(pEncoding, m_BaseEncoding, m_pCharNames, m_pFontFile != NULL, m_Font.IsTTFont());

+    LoadGlyphMap();

+    if (m_pCharNames) {

+        FX_DELETE_VECTOR(m_pCharNames, CFX_ByteString, 256);

+        m_pCharNames = NULL;

+    }

+    if (m_Font.m_Face == NULL) {

+        return TRUE;

+    }

+    if (m_Flags & PDFFONT_ALLCAP) {

+        unsigned char lowercases[] = {'a', 'z', 0xe0, 0xf6, 0xf8, 0xfd};

+        for (int range = 0; range < sizeof lowercases / 2; range ++) {

+            for (int i = lowercases[range * 2]; i <= lowercases[range * 2 + 1]; i ++) {

+                if (m_GlyphIndex[i] != 0xffff && m_pFontFile != NULL) {

+                    continue;

+                }

+                m_GlyphIndex[i] = m_GlyphIndex[i - 32];

+                if (m_CharWidth[i - 32]) {

+                    m_CharWidth[i] = m_CharWidth[i - 32];

+                    m_CharBBox[i] = m_CharBBox[i - 32];

+                }

+            }

+        }

+    }

+    CheckFontMetrics();

+    return TRUE;

+}

+void CPDF_SimpleFont::LoadSubstFont()

+{

+    if (!m_bUseFontWidth && !(m_Flags & PDFFONT_FIXEDPITCH)) {

+        int width = 0, i;

+        for (i = 0; i < 256; i ++) {

+            if (m_CharWidth[i] == 0 || m_CharWidth[i] == 0xffff) {

+                continue;

+            }

+            if (width == 0) {

+                width = m_CharWidth[i];

+            } else if (width != m_CharWidth[i]) {

+                break;

+            }

+        }

+        if (i == 256 && width) {

+            m_Flags |= PDFFONT_FIXEDPITCH;

+        }

+    }

+    int weight = m_StemV < 140 ? m_StemV * 5 : (m_StemV * 4 + 140);

+    m_Font.LoadSubst(m_BaseFont, m_FontType == PDFFONT_TRUETYPE, m_Flags, weight, m_ItalicAngle, 0);

+    if (m_Font.m_pSubstFont->m_SubstFlags & FXFONT_SUBST_NONSYMBOL) {

+    }

+}

+FX_BOOL CPDF_SimpleFont::IsUnicodeCompatible() const

+{

+    return m_BaseEncoding != PDFFONT_ENCODING_BUILTIN && m_BaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL &&

+           m_BaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS;

+}

+CPDF_Type1Font::CPDF_Type1Font()

+{

+    m_Base14Font = -1;

+}

+FX_BOOL CPDF_Type1Font::_Load()

+{

+    m_Base14Font = _PDF_GetStandardFontName(m_BaseFont);

+    if (m_Base14Font >= 0) {

+        CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC("FontDescriptor"));

+        if (pFontDesc && pFontDesc->KeyExist(FX_BSTRC("Flags"))) {

+            m_Flags = pFontDesc->GetInteger(FX_BSTRC("Flags"));

+        } else {

+            m_Flags = m_Base14Font >= 12 ? PDFFONT_SYMBOLIC : PDFFONT_NONSYMBOLIC;

+        }

+        if (m_Base14Font < 4)

+            for (int i = 0; i < 256; i ++) {

+                m_CharWidth[i] = 600;

+            }

+        if (m_Base14Font == 12) {

+            m_BaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL;

+        } else if (m_Base14Font == 13) {

+            m_BaseEncoding = PDFFONT_ENCODING_ZAPFDINGBATS;

+        } else if (m_Flags & PDFFONT_NONSYMBOLIC) {

+            m_BaseEncoding = PDFFONT_ENCODING_STANDARD;

+        }

+    }

+    return LoadCommon();

+}

+static FX_BOOL FT_UseType1Charmap(FXFT_Face face)

+{

+    if (FXFT_Get_Face_CharmapCount(face) == 0) {

+        return FALSE;

+    }

+    if (FXFT_Get_Face_CharmapCount(face) == 1 &&

+            FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) == FXFT_ENCODING_UNICODE) {

+        return FALSE;

+    }

+    if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) == FXFT_ENCODING_UNICODE) {

+        FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[1]);

+    } else {

+        FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]);

+    }

+    return TRUE;

+}

+extern FX_WCHAR FT_UnicodeFromCharCode(int encoding, FX_DWORD charcode);

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+#include "../../fxge/apple/apple_int.h"

+#endif

+int CPDF_Type1Font::GlyphFromCharCodeExt(FX_DWORD charcode)

+{

+    if (charcode > 0xff) {

+        return -1;

+    }

+    int index = m_ExtGID[(FX_BYTE)charcode];

+    if (index == 0xffff) {

+        return -1;

+    }

+    return index;

+}

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+struct _GlyphNameMap {

+    FX_LPCSTR m_pStrAdobe;

+    FX_LPCSTR m_pStrUnicode;

+};

+static const _GlyphNameMap g_GlyphNameSubsts[] = {

+    {"ff", "uniFB00"},

+    {"fi", "uniFB01"},

+    {"fl", "uniFB02"},

+    {"ffi", "uniFB03"},

+    {"ffl", "uniFB04"}

+};

+extern "C" {

+    static int compareString(const void* key, const void* element)

+    {

+        return FXSYS_stricmp((FX_LPCSTR)key, ((_GlyphNameMap*)element)->m_pStrAdobe);

+    }

+}

+static FX_LPCSTR _GlyphNameRemap(FX_LPCSTR pStrAdobe)

+{

+    _GlyphNameMap* found = (_GlyphNameMap*)FXSYS_bsearch(pStrAdobe, g_GlyphNameSubsts,

+                           sizeof g_GlyphNameSubsts / sizeof(_GlyphNameMap), sizeof(_GlyphNameMap),

+                           compareString);

+    if (found) {

+        return found->m_pStrUnicode;

+    }

+    return NULL;

+}

+#endif

+void CPDF_Type1Font::LoadGlyphMap()

+{

+    if (m_Font.m_Face == NULL) {

+        return;

+    }

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+    FX_BOOL bCoreText = TRUE;

+    CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;

+    if (!m_Font.m_pPlatformFont) {

+        if (m_Font.GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {

+            bCoreText = FALSE;

+        }

+        m_Font.m_pPlatformFont = quartz2d.CreateFont(m_Font.m_pFontData, m_Font.m_dwSize);

+        if (NULL == m_Font.m_pPlatformFont) {

+            bCoreText = FALSE;

+        }

+    }

+#endif

+    if (!IsEmbedded() && (m_Base14Font < 12) && m_Font.IsTTFont()) {

+        if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) {

+            FX_BOOL bGotOne = FALSE;

+            for (int charcode = 0; charcode < 256; charcode ++) {

+                const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};

+                for (int j = 0; j < 4; j ++) {

+                    FX_WORD unicode = prefix[j] * 256 + charcode;

+                    m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+                    FX_CHAR name_glyph[256];

+                    FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);

+                    name_glyph[255] = 0;

+                    CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);

+                    m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);

+                    if (name_ct) {

+                        CFRelease(name_ct);

+                    }

+#endif

+                    if (m_GlyphIndex[charcode]) {

+                        bGotOne = TRUE;

+                        break;

+                    }

+                }

+            }

+            if (bGotOne) {

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+                if (!bCoreText) {

+                    FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);

+                }

+#endif

+                return;

+            }

+        }

+        FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE);

+        if (m_BaseEncoding == 0) {

+            m_BaseEncoding = PDFFONT_ENCODING_STANDARD;

+        }

+        for (int charcode = 0; charcode < 256; charcode ++) {

+            FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);

+            if (name == NULL) {

+                continue;

+            }

+            m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);

+            m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+            FX_CHAR name_glyph[256];

+            FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);

+            name_glyph[255] = 0;

+            CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);

+            m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);

+            if (name_ct) {

+                CFRelease(name_ct);

+            }

+#endif

+            if (m_GlyphIndex[charcode] == 0 && FXSYS_strcmp(name, ".notdef") == 0) {

+                m_Encoding.m_Unicodes[charcode] = 0x20;

+                m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 0x20);

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+                FX_CHAR name_glyph[256];

+                FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);

+                name_glyph[255] = 0;

+                CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);

+                m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);

+                if (name_ct) {

+                    CFRelease(name_ct);

+                }

+#endif

+            }

+        }

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+        if (!bCoreText) {

+            FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);

+        }

+#endif

+        return;

+    }

+    FT_UseType1Charmap(m_Font.m_Face);

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+    if (bCoreText) {

+        if (m_Flags & PDFFONT_SYMBOLIC) {

+            for (int charcode = 0; charcode < 256; charcode ++) {

+                FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);

+                if (name) {

+                    m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);

+                    m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);

+                    CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);

+                    m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);

+                    if (name_ct) {

+                        CFRelease(name_ct);

+                    }

+                } else {

+                    m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);

+                    FX_WCHAR unicode = 0;

+                    if (m_GlyphIndex[charcode]) {

+                        unicode = FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);

+                    }

+                    FX_CHAR name_glyph[256];

+                    FXSYS_memset32(name_glyph, 0, sizeof(name_glyph));

+                    FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);

+                    name_glyph[255] = 0;

+                    if (unicode == 0 && name_glyph[0] != 0) {

+                        unicode = PDF_UnicodeFromAdobeName(name_glyph);

+                    }

+                    m_Encoding.m_Unicodes[charcode] = unicode;

+                    CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);

+                    m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);

+                    if (name_ct) {

+                        CFRelease(name_ct);

+                    }

+                }

+            }

+            return;

+        }

+        FX_BOOL bUnicode = FALSE;

+        if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) {

+            bUnicode = TRUE;

+        }

+        for (int charcode = 0; charcode < 256; charcode ++) {

+            FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);

+            if (name == NULL) {

+                continue;

+            }

+            m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);

+            FX_LPCSTR pStrUnicode = _GlyphNameRemap(name);

+            if (pStrUnicode && 0 == FXFT_Get_Name_Index(m_Font.m_Face, (char*)name)) {

+                name = pStrUnicode;

+            }

+            m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);

+            CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);

+            m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);

+            if (name_ct) {

+                CFRelease(name_ct);

+            }

+            if (m_GlyphIndex[charcode] == 0) {

+                if (FXSYS_strcmp(name, ".notdef") != 0 && FXSYS_strcmp(name, "space") != 0) {

+                    m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);

+                    FX_CHAR name_glyph[256];

+                    FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);

+                    name_glyph[255] = 0;

+                    CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);

+                    m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);

+                    if (name_ct) {

+                        CFRelease(name_ct);

+                    }

+                } else {

+                    m_Encoding.m_Unicodes[charcode] = 0x20;

+                    m_GlyphIndex[charcode] = bUnicode ? FXFT_Get_Char_Index(m_Font.m_Face, 0x20) : 0xffff;

+                    FX_CHAR name_glyph[256];

+                    FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);

+                    name_glyph[255] = 0;

+                    CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);

+                    m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);

+                    if (name_ct) {

+                        CFRelease(name_ct);

+                    }

+                }

+            }

+        }

+        return;

+    }

+#endif

+    if (m_Flags & PDFFONT_SYMBOLIC) {

+        for (int charcode = 0; charcode < 256; charcode ++) {

+            FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);

+            if (name) {

+                m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);

+                m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);

+            } else {

+                m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);

+                if (m_GlyphIndex[charcode]) {

+                    FX_WCHAR unicode = FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);

+                    if (unicode == 0) {

+                        FX_CHAR name_glyph[256];

+                        FXSYS_memset32(name_glyph, 0, sizeof(name_glyph));

+                        FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);

+                        name_glyph[255] = 0;

+                        if (name_glyph[0] != 0) {

+                            unicode = PDF_UnicodeFromAdobeName(name_glyph);

+                        }

+                    }

+                    m_Encoding.m_Unicodes[charcode] = unicode;

+                }

+            }

+        }

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+        if (!bCoreText) {

+            FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);

+        }

+#endif

+        return;

+    }

+    FX_BOOL bUnicode = FALSE;

+    if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) {

+        bUnicode = TRUE;

+    }

+    for (int charcode = 0; charcode < 256; charcode ++) {

+        FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);

+        if (name == NULL) {

+            continue;

+        }

+        m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);

+        m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);

+        if (m_GlyphIndex[charcode] == 0) {

+            if (FXSYS_strcmp(name, ".notdef") != 0 && FXSYS_strcmp(name, "space") != 0) {

+                m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);

+            } else {

+                m_Encoding.m_Unicodes[charcode] = 0x20;

+                m_GlyphIndex[charcode] = 0xffff;

+            }

+        }

+    }

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+    if (!bCoreText) {

+        FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);

+    }

+#endif

+}

+CPDF_FontEncoding::CPDF_FontEncoding()

+{

+    FXSYS_memset32(m_Unicodes, 0, sizeof(m_Unicodes));

+}

+int CPDF_FontEncoding::CharCodeFromUnicode(FX_WCHAR unicode) const

+{

+    for (int i = 0; i < 256; i ++)

+        if (m_Unicodes[i] == unicode) {

+            return i;

+        }

+    return -1;

+}

+CPDF_FontEncoding::CPDF_FontEncoding(int PredefinedEncoding)

+{

+    const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(PredefinedEncoding);

+    if (!pSrc) {

+        FXSYS_memset32(m_Unicodes, 0, sizeof(m_Unicodes));

+    } else

+        for (int i = 0; i < 256; i++) {

+            m_Unicodes[i] = pSrc[i];

+        }

+}

+FX_BOOL CPDF_FontEncoding::IsIdentical(CPDF_FontEncoding* pAnother) const

+{

+    return FXSYS_memcmp32(m_Unicodes, pAnother->m_Unicodes, sizeof(m_Unicodes)) == 0;

+}

+CPDF_Object* CPDF_FontEncoding::Realize()

+{

+    int predefined = 0;

+    for (int cs = PDFFONT_ENCODING_WINANSI; cs < PDFFONT_ENCODING_ZAPFDINGBATS; cs ++) {

+        const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(cs);

+        FX_BOOL match = TRUE;

+        for (int i = 0; i < 256; ++i) {

+            if (m_Unicodes[i] != pSrc[i]) {

+                match = FALSE;

+                break;

+            }

+        }

+        if (match) {

+            predefined = cs;

+            break;

+        }

+    }

+    if (predefined) {

+        if (predefined == PDFFONT_ENCODING_WINANSI) {

+            return CPDF_Name::Create("WinAnsiEncoding");

+        }

+        if (predefined == PDFFONT_ENCODING_MACROMAN) {

+            return CPDF_Name::Create("MacRomanEncoding");

+        }

+        if (predefined == PDFFONT_ENCODING_MACEXPERT) {

+            return CPDF_Name::Create("MacExpertEncoding");

+        }

+        return NULL;

+    }

+    CPDF_Dictionary* pDict = CPDF_Dictionary::Create();

+    pDict->SetAtName(FX_BSTRC("BaseEncoding"), FX_BSTRC("WinAnsiEncoding"));

+    const FX_WORD* pStandard = PDF_UnicodesForPredefinedCharSet(PDFFONT_ENCODING_WINANSI);

+    CPDF_Array* pDiff = CPDF_Array::Create();

+    for (int i = 0; i < 256; i ++) {

+        if (pStandard[i] == m_Unicodes[i]) {

+            continue;

+        }

+        pDiff->Add(CPDF_Number::Create(i));

+        pDiff->Add(CPDF_Name::Create(PDF_AdobeNameFromUnicode(m_Unicodes[i])));

+    }

+    pDict->SetAt(FX_BSTRC("Differences"), pDiff);

+    return pDict;

+}

+CPDF_TrueTypeFont::CPDF_TrueTypeFont()

+{

+}

+FX_BOOL CPDF_TrueTypeFont::_Load()

+{

+    return LoadCommon();

+}

+extern FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode);

+void CPDF_TrueTypeFont::LoadGlyphMap()

+{

+    if (m_Font.m_Face == NULL) {

+        return;

+    }

+    int baseEncoding = m_BaseEncoding;

+    if (m_pFontFile && m_Font.m_Face->num_charmaps > 0

+            && (baseEncoding == PDFFONT_ENCODING_MACROMAN || baseEncoding == PDFFONT_ENCODING_WINANSI)

+            && (m_Flags & PDFFONT_SYMBOLIC)) {

+        FX_BOOL bSupportWin = FALSE;

+        FX_BOOL bSupportMac = FALSE;

+        for (int i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i++) {

+            int platform_id = FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]);

+            if (platform_id == 0 || platform_id == 3) {

+                bSupportWin = TRUE;

+            } else if (platform_id == 0 || platform_id == 1) {

+                bSupportMac = TRUE;

+            }

+        }

+        if (baseEncoding == PDFFONT_ENCODING_WINANSI && !bSupportWin) {

+            baseEncoding = bSupportMac ? PDFFONT_ENCODING_MACROMAN : PDFFONT_ENCODING_BUILTIN;

+        } else if (baseEncoding == PDFFONT_ENCODING_MACROMAN && !bSupportMac) {

+            baseEncoding = bSupportWin ? PDFFONT_ENCODING_WINANSI : PDFFONT_ENCODING_BUILTIN;

+        }

+    }

+    if (((baseEncoding == PDFFONT_ENCODING_MACROMAN || baseEncoding == PDFFONT_ENCODING_WINANSI)

+            && m_pCharNames == NULL) || (m_Flags & PDFFONT_NONSYMBOLIC)) {

+        if (!FXFT_Has_Glyph_Names(m_Font.m_Face) && (!m_Font.m_Face->num_charmaps || !m_Font.m_Face->charmaps)) {

+            int nStartChar = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"));

+            int charcode = 0;

+            for (; charcode < nStartChar; charcode ++) {

+                m_GlyphIndex[charcode] = 0;

+            }

+            FX_WORD nGlyph = charcode - nStartChar + 3;

+            for (; charcode < 256; charcode ++, nGlyph ++) {

+                m_GlyphIndex[charcode] = nGlyph;

+            }

+            return;

+        }

+        FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1);

+        FX_BOOL bMacRoman = FALSE, bMSSymbol = FALSE;

+        if (!bMSUnicode) {

+            if (m_Flags & PDFFONT_NONSYMBOLIC) {

+                bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0);

+                bMSSymbol = !bMacRoman && FT_UseTTCharmap(m_Font.m_Face, 3, 0);

+            } else {

+                bMSSymbol = FT_UseTTCharmap(m_Font.m_Face, 3, 0);

+                bMacRoman = !bMSSymbol && FT_UseTTCharmap(m_Font.m_Face, 1, 0);

+            }

+        }

+        FX_BOOL bToUnicode = m_pFontDict->KeyExist(FX_BSTRC("ToUnicode"));

+        for (int charcode = 0; charcode < 256; charcode ++) {

+            FX_LPCSTR name = GetAdobeCharName(baseEncoding, m_pCharNames, charcode);

+            if (name == NULL) {

+                m_GlyphIndex[charcode] = m_pFontFile ? FXFT_Get_Char_Index(m_Font.m_Face, charcode) : -1;

+                continue;

+            }

+            m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);

+            if (bMSSymbol) {

+                const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};

+                for (int j = 0; j < 4; j ++) {

+                    FX_WORD unicode = prefix[j] * 256 + charcode;

+                    m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);

+                    if (m_GlyphIndex[charcode]) {

+                        break;

+                    }

+                }

+            } else if (m_Encoding.m_Unicodes[charcode]) {

+                if (bMSUnicode) {

+                    m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);

+                } else if (bMacRoman) {

+                    FX_DWORD maccode = FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, m_Encoding.m_Unicodes[charcode]);

+                    if (!maccode) {

+                        m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char *)name);

+                    } else {

+                        m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, maccode);

+                    }

+                }

+            }

+            if ((m_GlyphIndex[charcode] == 0 || m_GlyphIndex[charcode] == 0xffff) && name != NULL) {

+                if (name[0] == '.' && FXSYS_strcmp(name, ".notdef") == 0) {

+                    m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 32);

+                } else {

+                    m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);

+                    if (m_GlyphIndex[charcode] == 0) {

+                        if (bToUnicode) {

+                            CFX_WideString wsUnicode = UnicodeFromCharCode(charcode);

+                            if (!wsUnicode.IsEmpty()) {

+                                m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, wsUnicode[0]);

+                                m_Encoding.m_Unicodes[charcode] = wsUnicode[0];

+                            }

+                        }

+                        if (m_GlyphIndex[charcode] == 0) {

+                            m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);

+                        }

+                    }

+                }

+            }

+        }

+        return;

+    }

+    if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) {

+        const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};

+        FX_BOOL bGotOne = FALSE;

+        for (int charcode = 0; charcode < 256; charcode ++) {

+            for (int j = 0; j < 4; j ++) {

+                FX_WORD unicode = prefix[j] * 256 + charcode;

+                m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);

+                if (m_GlyphIndex[charcode]) {

+                    bGotOne = TRUE;

+                    break;

+                }

+            }

+        }

+        if (bGotOne) {

+            if (baseEncoding != PDFFONT_ENCODING_BUILTIN) {

+                for (int charcode = 0; charcode < 256; charcode ++) {

+                    FX_LPCSTR name = GetAdobeCharName(baseEncoding, m_pCharNames, charcode);

+                    if (name == NULL) {

+                        continue;

+                    }

+                    m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);

+                }

+            } else if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) {

+                for (int charcode = 0; charcode < 256; charcode ++) {

+                    m_Encoding.m_Unicodes[charcode] = FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode);

+                }

+            }

+            return;

+        }

+    }

+    if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) {

+        FX_BOOL bGotOne = FALSE;

+        for (int charcode = 0; charcode < 256; charcode ++) {

+            m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);

+            m_Encoding.m_Unicodes[charcode] = FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode);

+            if (m_GlyphIndex[charcode]) {

+                bGotOne = TRUE;

+            }

+        }

+        if (m_pFontFile || bGotOne) {

+            return;

+        }

+    }

+    if (FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE) == 0) {

+        FX_BOOL bGotOne = FALSE;

+        const FX_WORD* pUnicodes = PDF_UnicodesForPredefinedCharSet(baseEncoding);

+        for (int charcode = 0; charcode < 256; charcode ++) {

+            if (m_pFontFile == NULL) {

+                FX_LPCSTR name = GetAdobeCharName(0, m_pCharNames, charcode);

+                if (name != NULL) {

+                    m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);

+                } else if (pUnicodes) {

+                    m_Encoding.m_Unicodes[charcode] = pUnicodes[charcode];

+                }

+            } else {

+                m_Encoding.m_Unicodes[charcode] = charcode;

+            }

+            m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);

+            if (m_GlyphIndex[charcode]) {

+                bGotOne = TRUE;

+            }

+        }

+        if (bGotOne) {

+            return;

+        }

+    }

+    for (int charcode = 0; charcode < 256; charcode ++) {

+        m_GlyphIndex[charcode] = charcode;

+    }

+}

+CPDF_Type3Font::CPDF_Type3Font()

+{

+    m_pPageResources = NULL;

+    FXSYS_memset32(m_CharWidthL, 0, sizeof m_CharWidthL);

+}

+CPDF_Type3Font::~CPDF_Type3Font()

+{

+    FX_POSITION pos = m_CacheMap.GetStartPosition();

+    while (pos) {

+        FX_LPVOID key, value;

+        m_CacheMap.GetNextAssoc(pos, key, value);

+        delete (CPDF_Type3Char*)value;

+    }

+    m_CacheMap.RemoveAll();

+    pos = m_DeletedMap.GetStartPosition();

+    while (pos) {

+        FX_LPVOID key, value;

+        m_DeletedMap.GetNextAssoc(pos, key, value);

+        delete (CPDF_Type3Char*)key;

+    }

+}

+FX_BOOL CPDF_Type3Font::_Load()

+{

+    m_pFontResources = m_pFontDict->GetDict(FX_BSTRC("Resources"));

+    CPDF_Array* pMatrix = m_pFontDict->GetArray(FX_BSTRC("FontMatrix"));

+    FX_FLOAT xscale = 1.0f, yscale = 1.0f;

+    if (pMatrix) {

+        m_FontMatrix = pMatrix->GetMatrix();

+        xscale = m_FontMatrix.a;

+        yscale = m_FontMatrix.d;

+    }

+    CPDF_Array* pBBox = m_pFontDict->GetArray(FX_BSTRC("FontBBox"));

+    if (pBBox) {

+        m_FontBBox.left = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(0), xscale) * 1000);

+        m_FontBBox.bottom = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(1), yscale) * 1000);

+        m_FontBBox.right = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(2), xscale) * 1000);

+        m_FontBBox.top = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(3), yscale) * 1000);

+    }

+    int StartChar = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"));

+    CPDF_Array* pWidthArray = m_pFontDict->GetArray(FX_BSTRC("Widths"));

+    if (pWidthArray && (StartChar >= 0 && StartChar < 256)) {

+        FX_DWORD count = pWidthArray->GetCount();

+        if (count > 256) {

+            count = 256;

+        }

+        if (StartChar + count > 256) {

+            count = 256 - StartChar;

+        }

+        for (FX_DWORD i = 0; i < count; i ++) {

+            m_CharWidthL[StartChar + i] = FXSYS_round(FXSYS_Mul(pWidthArray->GetNumber(i), xscale) * 1000);

+        }

+    }

+    m_pCharProcs = m_pFontDict->GetDict(FX_BSTRC("CharProcs"));

+    CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC("Encoding"));

+    if (pEncoding) {

+        LoadPDFEncoding(pEncoding, m_BaseEncoding, m_pCharNames, FALSE, FALSE);

+        if (m_pCharNames) {

+            for (int i = 0; i < 256; i ++) {

+                m_Encoding.m_Unicodes[i] = PDF_UnicodeFromAdobeName(m_pCharNames[i]);

+                if (m_Encoding.m_Unicodes[i] == 0) {

+                    m_Encoding.m_Unicodes[i] = i;

+                }

+            }

+        }

+    }

+    return TRUE;

+}

+void CPDF_Type3Font::CheckType3FontMetrics()

+{

+    CheckFontMetrics();

+}

+CPDF_Type3Char* CPDF_Type3Font::LoadChar(FX_DWORD charcode, int level)

+{

+    if (level >= _FPDF_MAX_TYPE3_FORM_LEVEL_) {

+        return NULL;

+    }

+    CPDF_Type3Char* pChar = NULL;

+    if (m_CacheMap.Lookup((FX_LPVOID)(FX_UINTPTR)charcode, (FX_LPVOID&)pChar)) {

+        if (pChar->m_bPageRequired && m_pPageResources) {

+            delete pChar;

+            m_CacheMap.RemoveKey((FX_LPVOID)(FX_UINTPTR)charcode);

+            return LoadChar(charcode, level + 1);

+        }

+        return pChar;

+    }

+    FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);

+    if (name == NULL) {

+        return NULL;

+    }

+    CPDF_Stream* pStream = (CPDF_Stream*)m_pCharProcs->GetElementValue(name);

+    if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {

+        return NULL;

+    }

+    pChar = FX_NEW CPDF_Type3Char;

+    pChar->m_pForm = FX_NEW CPDF_Form(m_pDocument, m_pFontResources ? m_pFontResources : m_pPageResources, pStream, NULL);

+    pChar->m_pForm->ParseContent(NULL, NULL, pChar, NULL, level + 1);

+    FX_FLOAT scale = m_FontMatrix.GetXUnit();

+    pChar->m_Width = (FX_INT32)(pChar->m_Width * scale + 0.5f);

+    FX_RECT &rcBBox = pChar->m_BBox;

+    CFX_FloatRect char_rect((FX_FLOAT)rcBBox.left / 1000.0f, (FX_FLOAT)rcBBox.bottom / 1000.0f,

+                            (FX_FLOAT)rcBBox.right / 1000.0f, (FX_FLOAT)rcBBox.top / 1000.0f);

+    if (rcBBox.right <= rcBBox.left || rcBBox.bottom >= rcBBox.top) {

+        char_rect = pChar->m_pForm->CalcBoundingBox();

+    }

+    char_rect.Transform(&m_FontMatrix);

+    rcBBox.left = FXSYS_round(char_rect.left * 1000);

+    rcBBox.right = FXSYS_round(char_rect.right * 1000);

+    rcBBox.top = FXSYS_round(char_rect.top * 1000);

+    rcBBox.bottom = FXSYS_round(char_rect.bottom * 1000);

+    m_CacheMap.SetAt((FX_LPVOID)(FX_UINTPTR)charcode, pChar);

+    if (pChar->m_pForm->CountObjects() == 0) {

+        delete pChar->m_pForm;

+        pChar->m_pForm = NULL;

+    }

+    return pChar;

+}

+int CPDF_Type3Font::GetCharWidthF(FX_DWORD charcode, int level)

+{

+    if (charcode > 0xff) {

+        charcode = 0;

+    }

+    if (m_CharWidthL[charcode]) {

+        return m_CharWidthL[charcode];

+    }

+    CPDF_Type3Char* pChar = LoadChar(charcode, level);

+    if (pChar == NULL) {

+        return 0;

+    }

+    return pChar->m_Width;

+}

+void CPDF_Type3Font::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)

+{

+    CPDF_Type3Char* pChar = LoadChar(charcode, level);

+    if (pChar == NULL) {

+        rect.left = rect.right = rect.top = rect.bottom = 0;

+        return;

+    }

+    rect = pChar->m_BBox;

+}

+CPDF_Type3Char::CPDF_Type3Char()

+{

+    m_pForm = NULL;

+    m_pBitmap = NULL;

+    m_bPageRequired = FALSE;

+    m_bColored = FALSE;

+}

+CPDF_Type3Char::~CPDF_Type3Char()

+{

+    if (m_pForm) {

+        delete m_pForm;

+    }

+    if (m_pBitmap) {

+        delete m_pBitmap;

+    }

+}

diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp
new file mode 100644
index 0000000..bd09cfc
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp
@@ -0,0 +1,625 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fxge/fx_freetype.h"

+extern FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR*);

+const struct _UnicodeAlt {

+    FX_WORD	m_Unicode;

+    const FX_CHAR* m_Alter;

+}

+UnicodeAlts[] = {

+    {0x00a0, " "}, {0x00a1, "!"}, {0x00a2, "c"}, {0x00a3, "P"}, {0x00a4, "o"},

+    {0x00a5, "Y"}, {0x00a6, "|"}, {0x00a7, "S"}, {0x00a9, "(C)"}, {0x00aa, "a"},

+    {0x00ab, "<<"}, {0x00ac, "-|"}, {0x00ae, "(R)"}, {0x00af, "-"},

+    {0x00b0, "o"}, {0x00b1, "+/-"}, {0x00b2, "^2"}, { 0x00b3, "^3"},

+    {0x00b4, "'"}, {0x00b5, "u"}, {0x00b6, "P"}, {0x00b7, "."},

+    {0x00b9, "^1"}, {0x00ba, "o"}, {0x00bb, ">>"}, {0x00bc, "1/4"},

+    {0x00bd, "1/2"}, {0x00be, "3/4"},  {0x00bf, "?"}, {0x00c0, "A"},

+    {0x00c1, "A"}, {0x00c2, "A"}, {0x00c3, "A"}, {0x00c4, "A"},

+    {0x00c5, "A"}, {0x00c6, "AE"}, {0x00c7, "C"}, {0x00c8, "E"},

+    {0x00c9, "E"}, {0x00ca, "E"}, {0x00cb, "E"}, {0x00cc, "I"},

+    {0x00cd, "I"}, {0x00ce, "I"}, {0x00cf, "I"},

+    {0x00d1, "N"}, {0x00d2, "O"}, {0x00d3, "O"}, {0x00d4, "O"},

+    {0x00d5, "O"}, {0x00d6, "O"}, {0x00d7, "x"}, {0x00d8, "O"},

+    {0x00d9, "U"}, {0x00da, "U"}, {0x00db, "U"}, {0x00dc, "U"},

+    {0x00dd, "Y"}, {0x00df, "S"}, {0x00e0, "a"},

+    {0x00e1, "a"}, {0x00e2, "a"}, {0x00e3, "a"}, {0x00e4, "a"},

+    {0x00e5, "a"}, {0x00e6, "ae"}, {0x00e7, "c"}, {0x00e8, "e"},

+    {0x00e9, "e"}, {0x00ea, "e"}, {0x00eb, "e"}, {0x00ec, "i"},

+    {0x00ed, "i"}, {0x00ee, "i"}, {0x00ef, "i"},

+    {0x00f1, "n"}, {0x00f2, "o"}, {0x00f3, "o"}, {0x00f4, "o"},

+    {0x00f5, "o"}, {0x00f6, "o"}, {0x00f7, "/"}, {0x00f8, "o"},

+    {0x00f9, "u"}, {0x00fa, "u"}, {0x00fb, "u"}, {0x00fc, "u"},

+    {0x00fd, "y"}, {0x00ff, "y"},

+    {0x02b0, "h"}, {0x02b2, "j"}, {0x02b3, "r"}, {0x02b7, "w"},

+    {0x02b8, "y"}, {0x02b9, "'"}, {0x02ba, "\""}, {0x02bb, "'"},

+    {0x02bc, "'"}, {0x02bd, "'"}, {0x02be, "'"}, {0x02bf, "'"},

+    {0x02c2, "<"}, {0x02c3, ">"}, {0x02c4, "^"}, {0x02c5, "v"},

+    {0x02c6, "^"}, {0x02c7, "v"}, {0x02c8, "'"}, {0x02c9, "-"},

+    {0x02ca, "'"}, {0x02cb, "'"}, {0x02cc, "."}, {0x02cd, "_"},

+    {0x2010, "-"}, {0x2012, "-"}, {0x2013, "-"}, {0x2014, "--"},

+    {0x2015, "--"}, {0x2016, "|"}, {0x2017, "_"},

+    {0x2018, "'"}, {0x2019, "'"}, {0x201a, ","}, {0x201b, "'"},

+    {0x201c, "\""}, {0x201d, "\""}, {0x201e, ","}, {0x201f, "'"},

+    {0x2020, "+"}, {0x2021, "+"}, {0x2022, "*"}, {0x2023, ">"},

+    {0x2024, "."}, {0x2025, ".."}, {0x2027, "."}, {0x2032, "'"},

+    {0x2033, "\""}, {0x2035, "'"}, {0x2036, "\""}, {0x2038, "^"},

+    {0x2039, "<"}, {0x203a, ">"}, {0x203b, "*"}, {0x203c, "!!"},

+    {0x203d, "?!"}, {0x203e, "-"}, {0x2044, "/"}, {0x2047, "??"},

+    {0x2048, "?!"}, {0x2049, "!?"}, {0x204e, "*"}, {0x2052, "%"},

+    {0x2122, "(TM)"},

+    {0x2212, "-"}, {0x2215, "/"}, {0x2216, "\\"}, {0x2217, "*"},

+    {0x2218, "*"}, {0x2219, "*"}, {0x2223, "|"}, {0x22c5, "."},

+    {0x266f, "#"},

+    {0XF6D9, "(C)"}, {0XF6DA, "(C)"}, {0XF6DB, "(TM)"},

+    {0XF8E8, "(C)"}, {0xf8e9, "(C)"}, {0XF8EA, "(TM)"},

+

+    {0xfb01, "fi"}, {0xfb02, "fl"}

+};

+const FX_CHAR* FCS_GetAltStr(FX_WCHAR unicode)

+{

+    int begin = 0;

+    int end = sizeof UnicodeAlts / sizeof(struct _UnicodeAlt) - 1;

+    while (begin <= end) {

+        int middle = (begin + end) / 2;

+        FX_WORD middlecode = UnicodeAlts[middle].m_Unicode;

+        if (middlecode > unicode) {

+            end = middle - 1;

+        } else if (middlecode < unicode) {

+            begin = middle + 1;

+        } else {

+            return UnicodeAlts[middle].m_Alter;

+        }

+    }

+    return NULL;

+}

+const FX_WORD StandardEncoding[256] = {

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,

+    0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,

+    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,

+    0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,

+    0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,

+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,

+    0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x2018, 0x0061, 0x0062, 0x0063,

+    0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,

+    0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,

+    0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x00a1, 0x00a2, 0x00a3, 0x2044, 0x00a5, 0x0192, 0x00a7, 0x00a4, 0x0027,

+    0x201c, 0x00ab, 0x2039, 0x203a, 0xfb01, 0xfb02, 0x0000, 0x2013, 0x2020, 0x2021,

+    0x00b7, 0x0000, 0x00b6, 0x2022, 0x201a, 0x201e, 0x201d, 0x00bb, 0x2026, 0x2030,

+    0x0000, 0x00bf, 0x0000, 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9,

+    0x00a8, 0x0000, 0x02da, 0x00b8, 0x0000, 0x02dd, 0x02db, 0x02c7, 0x2014, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c6, 0x0000, 0x00aa, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0141, 0x00d8, 0x0152, 0x00ba, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0131, 0x0000, 0x0000, 0x0142, 0x00f8,

+    0x0153, 0x00df, 0x0000, 0x0000, 0x0000, 0x0000

+};

+const FX_WORD MacRomanEncoding[256] = {

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,

+    0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,

+    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,

+    0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,

+    0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,

+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,

+    0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063,

+    0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,

+    0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,

+    0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x00c4, 0x00c5,

+    0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3,

+    0x00e5, 0x00e7, 0x00e9, 0x00e8, 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef,

+    0x00f1, 0x00f3, 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc,

+    0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9,

+    0x2122, 0x00b4, 0x00a8, 0x0000, 0x00c6, 0x00d8, 0x0000, 0x00b1, 0x0000, 0x0000,

+    0x00a5, 0x00b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00aa, 0x00ba, 0x0000,

+    0x00e6, 0x00f8, 0x00bf, 0x00a3, 0x00ac, 0x0000, 0x0192, 0x0000, 0x0000, 0x00ab,

+    0x00bb, 0x2026, 0x0020, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, 0x2013, 0x2014,

+    0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x0000, 0x00ff, 0x0178, 0x2044, 0x00a4,

+    0x2039, 0x203a, 0xfb01, 0xfb02, 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2,

+    0x00ca, 0x00c1, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4,

+    0x0000, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, 0x00af, 0x02d8,

+    0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7

+};

+const FX_WORD AdobeWinAnsiEncoding[256] = {

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,

+    0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,

+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,

+    0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,

+    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,

+    0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,

+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,

+    0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,

+    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,

+    0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,

+    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,

+    0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2022,

+    0x20ac, 0x2022, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,

+    0x02c6, 0x2030, 0x0160, 0x2039,	0x0152, 0x2022, 0x017d, 0x2022,

+    0x2022, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,

+    0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x2022, 0x017e, 0x0178,

+    0x0020, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,

+    0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x002d, 0x00ae, 0x00af,

+    0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,

+    0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,

+    0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,

+    0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,

+    0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,

+    0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,

+    0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,

+    0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,

+    0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,

+    0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff

+};

+extern const FX_WORD PDFDocEncoding[256];

+const FX_WORD MacExpertEncoding[256] = {

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0020, 0xf721, 0xf6f8, 0xf7a2, 0xf724, 0xf6e4, 0xf726, 0xf7b4,

+    0x207d, 0x207e, 0x2025, 0x2024, 0x002c, 0x002d, 0x002e, 0x2044, 0xf730, 0xf731,

+    0xf732, 0xf733, 0xf734, 0xf735, 0xf736, 0xf737, 0xf738, 0xf739, 0x003a, 0x003b,

+    0x0000, 0xf6de, 0x0000, 0xf73f, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f0, 0x0000,

+    0x0000, 0x00bc, 0x00bd, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e, 0x2153, 0x2154,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb00, 0xfb01, 0xfb02, 0xfb03,

+    0xfb04, 0x208d, 0x0000, 0x208e, 0xf6f6, 0xf6e5, 0xf760, 0xf761, 0xf762, 0xf763,

+    0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b, 0xf76c, 0xf76d,

+    0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777,

+    0xf778, 0xf779, 0xf77a, 0x20a1, 0xf6dc, 0xf6dd, 0xf6fe, 0x0000, 0x0000, 0xf6e9,

+    0xf6e0, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7e1, 0xf7e0, 0xf7e2, 0xf7e4, 0xf7e3,

+    0xf7e5, 0xf7e7, 0xf7e9, 0xf7e8, 0xf7ea, 0xf7eb, 0xf7ed, 0xf7ec, 0xf7ee, 0xf7ef,

+    0xf7f1, 0xf7f3, 0xf7f2, 0xf7f4, 0xf7f6, 0xf7f5, 0xf7fa, 0xf7f9, 0xf7fb, 0xf7fc,

+    0x0000, 0x2078, 0x2084, 0x2083, 0x2086, 0x2088, 0x2087, 0xf6fd, 0x0000, 0xf6df,

+    0x2082, 0x0000, 0xf7a8, 0x0000, 0xf6f5, 0xf6fd, 0x2085, 0x0000, 0xf6e1, 0xf6e7,

+    0xf7fd, 0x0000, 0xf6e3, 0x0000, 0x0000, 0xf7fe, 0x0000, 0x2089, 0x2080, 0xf6ff,

+    0xf7e6, 0xf7f8, 0xf7bf, 0x2081, 0xf6e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0xf7b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6fa, 0x2012, 0xf6e6,

+    0x0000, 0x0000, 0x0000, 0x0000, 0xf7a1, 0x0000, 0xf7ff, 0x0000, 0x00b9, 0x00b2,

+    0x00b3, 0x2074, 0x2075, 0x2076, 0x2077, 0x2079, 0x2070, 0x0000, 0xf6ec, 0xf6f1,

+    0x0000, 0x0000, 0x0000, 0xf6ed, 0xf6f2, 0xf6eb, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0xf6ee, 0xf6fb, 0xf6f4, 0xf7af, 0xf6ea, 0x207f, 0xf6ef, 0xf6e2, 0xf6e8,

+    0xf6f7, 0xf6fc, 0x0000, 0x0000, 0x0000, 0x0000

+};

+const FX_WORD AdobeSymbolEncoding[256] = {

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0020, 0x0021, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220B,

+    0x0028, 0x0029, 0x2217, 0x002B, 0x002C, 0x2212, 0x002E, 0x002F,

+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,

+    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,

+    0x2245, 0x0391, 0x0392, 0x03A7, 0x0394, 0x0395, 0x03A6, 0x0393,

+    0x0397, 0x0399, 0x03D1, 0x039A, 0x039B, 0x039C, 0x039D, 0x039F,

+    0x03A0, 0x0398, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03C2, 0x03A9,

+    0x039E, 0x03A8, 0x0396, 0x005B, 0x2234, 0x005D, 0x22A5, 0x005F,

+    0xF8E5, 0x03B1, 0x03B2, 0x03C7, 0x03B4, 0x03B5, 0x03C6, 0x03B3,

+    0x03B7, 0x03B9, 0x03D5, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BF,

+    0x03C0, 0x03B8, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03D6, 0x03C9,

+    0x03BE, 0x03C8, 0x03B6, 0x007B, 0x007C, 0x007D, 0x223C, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x20AC, 0x03D2, 0x2032, 0x2264, 0x2044, 0x221E, 0x0192, 0x2663,

+    0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193,

+    0x00B0, 0x00B1, 0x2033, 0x2265, 0x00D7, 0x221D, 0x2202, 0x2022,

+    0x00F7, 0x2260, 0x2261, 0x2248, 0x2026, 0xF8E6, 0xF8E7, 0x21B5,

+    0x2135, 0x2111, 0x211C, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229,

+    0x222A, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209,

+    0x2220, 0x2207, 0xF6DA, 0xF6D9, 0xF6DB, 0x220F, 0x221A, 0x22C5,

+    0x00AC, 0x2227, 0x2228, 0x21D4, 0x21D0, 0x21D1, 0x21D2, 0x21D3,

+    0x25CA, 0x2329, 0xF8E8, 0xF8E9, 0xF8EA, 0x2211, 0xF8EB, 0xF8EC,

+    0xF8ED, 0xF8EE, 0xF8EF, 0xF8F0, 0xF8F1, 0xF8F2, 0xF8F3, 0xF8F4,

+    0x0000, 0x232A, 0x222B, 0x2320, 0xF8F5, 0x2321, 0xF8F6, 0xF8F7,

+    0xF8F8, 0xF8F9, 0xF8FA, 0xF8FB, 0xF8FC, 0xF8FD, 0xF8FE, 0x0000,

+};

+const FX_WORD ZapfEncoding[256] = {

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0020, 0x2701, 0x2702, 0x2703, 0x2704, 0x260E, 0x2706, 0x2707,

+    0x2708, 0x2709, 0x261B, 0x261E, 0x270C, 0x270D, 0x270E, 0x270F,

+    0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717,

+    0x2718, 0x2719, 0x271A, 0x271B, 0x271C, 0x271D, 0x271E, 0x271F,

+    0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727,

+    0x2605, 0x2729, 0x272A, 0x272B, 0x272C, 0x272D, 0x272E, 0x272F,

+    0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737,

+    0x2738, 0x2739, 0x273A, 0x273B, 0x273C, 0x273D, 0x273E, 0x273F,

+    0x2740, 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747,

+    0x2748, 0x2749, 0x274A, 0x274B, 0x25CF, 0x274D, 0x25A0, 0x274F,

+    0x2750, 0x2751, 0x2752, 0x25B2, 0x25BC, 0x25C6, 0x2756, 0x25D7,

+    0x2758, 0x2759, 0x275A, 0x275B, 0x275C, 0x275D, 0x275E, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767,

+    0x2663, 0x2666, 0x2665, 0x2660, 0x2460, 0x2461, 0x2462, 0x2463,

+    0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2776, 0x2777,

+    0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x277F,

+    0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787,

+    0x2788, 0x2789, 0x278A, 0x278B, 0x278C, 0x278D, 0x278E, 0x278F,

+    0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2192, 0x2194, 0x2195,

+    0x2798, 0x2799, 0x279A, 0x279B, 0x279C, 0x279D, 0x279E, 0x279F,

+    0x27A0, 0x27A1, 0x27A2, 0x27A3, 0x27A4, 0x27A5, 0x27A6, 0x27A7,

+    0x27A8, 0x27A9, 0x27AA, 0x27AB, 0x27AC, 0x27AD, 0x27AE, 0x27AF,

+    0x0000, 0x27B1, 0x27B2, 0x27B3, 0x27B4, 0x27B5, 0x27B6, 0x27B7,

+    0x27B8, 0x27B9, 0x27BA, 0x27BB, 0x27BC, 0x27BD, 0x27BE, 0x0000,

+};

+const FX_LPCSTR StandardEncodingNames[224] = {

+    "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright",

+    "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash",

+    "zero", "one", "two", "three", "four", "five", "six", "seven",

+    "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question",

+    "at", "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", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore",

+    "quoteleft", "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", "braceleft", "bar", "braceright", "asciitilde", NULL,

+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

+    NULL, "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section",

+    "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl",

+    NULL, "endash", "dagger", "daggerdbl", "periodcentered", NULL, "paragraph", "bullet",

+    "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", NULL, "questiondown",

+    NULL, "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent",

+    "dieresis", NULL, "ring", "cedilla", NULL, "hungarumlaut", "ogonek", "caron",

+    "emdash", NULL, NULL, NULL, NULL, NULL, NULL, NULL,

+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

+    NULL, "AE", NULL, "ordfeminine", NULL, NULL, NULL, NULL,

+    "Lslash", "Oslash", "OE", "ordmasculine", NULL, NULL, NULL, NULL,

+    NULL, "ae", NULL, NULL, NULL, "dotlessi", NULL, NULL,

+    "lslash", "oslash", "oe", "germandbls", NULL, NULL, NULL, NULL,

+};

+const FX_LPCSTR AdobeWinAnsiEncodingNames[224] = {

+    "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle",

+    "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash",

+    "zero", "one", "two", "three", "four", "five", "six", "seven",

+    "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question",

+    "at", "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", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore",

+    "grave", "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", "braceleft", "bar", "braceright", "asciitilde", "bullet",

+    "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", "daggerdbl",

+    "circumflex", "perthousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet",

+    "bullet", "quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet", "endash", "emdash",

+    "tilde", "trademark", "scaron", "guilsinglright", "oe", "bullet", "zcaron", "Ydieresis",

+    "space", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section",

+    "dieresis", "copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen", "registered", "macron",

+    "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered",

+    "cedilla", "onesuperior", "ordmasculine", "guillemotright", "onequarter", "onehalf", "threequarters", "questiondown",

+    "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla",

+    "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis",

+    "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply",

+    "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls",

+    "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla",

+    "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis",

+    "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide",

+    "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis",

+};

+const FX_LPCSTR  MacRomanEncodingNames[224] = {

+    "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle",

+    "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash",

+    "zero", "one", "two", "three", "four", "five", "six", "seven",

+    "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question",

+    "at", "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", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore",

+    "grave", "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", "braceleft", "bar", "braceright", "asciitilde", NULL,

+    "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute",

+    "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave",

+    "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute",

+    "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis",

+    "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls",

+    "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash",

+    "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation",

+    "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash",

+    "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft",

+    "guillemotright", "ellipsis", "space", "Agrave", "Atilde", "Otilde", "OE", "oe",

+    "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge",

+    "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl",

+    "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute",

+    "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex",

+    "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde",

+    "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron",

+};

+const FX_LPCSTR  MacExpertEncodingNames[224] = {

+    "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall",

+    "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction",

+    "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle",

+    "eightoldstyle", "nineoldstyle", "colon", "semicolon", NULL, "threequartersemdash", NULL, "questionsmall",

+    NULL, NULL, NULL, NULL, "Ethsmall", NULL, NULL, "onequarter",

+    "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds",

+    NULL, NULL, NULL, NULL, NULL, NULL, "ff", "fi",

+    "fl", "ffi", "ffl", "parenleftinferior", NULL, "parenrightinferior", "Circumflexsmall", "hypheninferior",

+    "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall",

+    "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall",

+    "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall",

+    "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", NULL,

+    NULL, "asuperior", "centsuperior", NULL, NULL, NULL, NULL, "Aacutesmall",

+    "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall",

+    "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall",

+    "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall",

+    NULL, "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", "seveninferior", "Scaronsmall",

+    NULL, "centinferior", "twoinferior", NULL, "Dieresissmall", NULL, "Caronsmall", "Scaronsmall",

+    "fiveinferior", NULL, "commainferior", "periodinferior", "Yacutesmall", NULL, "dollarinferior", NULL,

+    NULL, "Thornsmall", NULL, "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall",

+    "questiondownsmall", "oneinferior", "asuperior", NULL, NULL, NULL, NULL, NULL,

+    NULL, "Cedillasmall", NULL, NULL, NULL, NULL, NULL, "OEsmall",

+    "figuredash", "hyphensuperior", NULL, NULL, NULL, NULL, "exclamdownsmall", NULL,

+    "Ydieresissmall", NULL, "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior",

+    "sevensuperior", "ninesuperior", "zerosuperior", NULL, "esuperior", "rsuperior", NULL, NULL,

+    NULL, "isuperior", "ssuperior", "dsuperior", NULL, NULL, NULL, NULL,

+    NULL, "lsuperior", "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior",

+    "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall", NULL, NULL, NULL, NULL,

+};

+const FX_LPCSTR  PDFDocEncodingNames[232] = {

+    "breve", "caron", "circumflex", "dotaccent", "hungarumlaut", "ogonek", "ring", "tilde",

+    "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle",

+    "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash",

+    "zero", "one", "two", "three", "four", "five", "six", "seven",

+    "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question",

+    "at", "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", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore",

+    "grave", "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", "braceleft", "bar", "braceright", "asciitilde", NULL,

+    "bullet3", "dagger", "daggerdbl", "ellipsis", "emdash", "endash", "florin", "fraction",

+    "guilsinglleft", "guilsinglright", "minus", "perthousand", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft",

+    "quoteright", "quotesinglbase", "trademark", "fi", "fl", "Lslash", "OE", "Scaron",

+    "Ydieresis", "Zcaron2", "dotlessi", "lslash", "oe", "scaron", "zcaron2", NULL,

+    "Euro", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section",

+    "dieresis", "copyright", "ordfeminine", "guillemotleft4", "logicalnot", NULL, "registered", "macron",

+    "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered",

+    "cedilla", "onesuperior", "ordmasculine", "guillemotright4", "onequarter", "onehalf", "threequarters", "questiondown",

+    "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla",

+    "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis",

+    "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply",

+    "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls",

+    "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla",

+    "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis",

+    "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide",

+    "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis",

+};

+const FX_LPCSTR  AdobeSymbolEncodingNames[224] = {

+    "space", "exclam", "universal", "numbersign", "existential", "percent", "ampersand", "suchthat",

+    "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", "period", "slash",

+    "zero", "one", "two", "three", "four", "five", "six", "seven",

+    "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question",

+    "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi", "Gamma",

+    "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron",

+    "Pi", "Theta", "Rho", "Sigma", "Tau", "Upsilon", "sigma1", "Omega",

+    "Xi", "Psi", "Zeta", "bracketleft", "therefore", "bracketright", "perpendicular", "underscore",

+    "radicalex", "alpha", "beta", "chi", "delta", "epsilon", "phi", "gamma",

+    "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron",

+    "pi", "theta", "rho", "sigma", "tau", "upsilon", "omega1", "omega",

+    "xi", "psi", "zeta", "braceleft", "bar", "braceright", "similar", NULL,

+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

+    "Euro", "Upsilon1", "minute", "lessequal", "fraction", "infinity", "florin", "club",

+    "diamond", "heart", "spade", "arrowboth", "arrowleft", "arrowup", "arrowright", "arrowdown",

+    "degree", "plusminus", "second", "greaterequal", "multiply", "proportional", "partialdiff", "bullet",

+    "divide", "notequal", "equivalence", "approxequal", "ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn",

+    "aleph", "Ifraktur", "Rfraktur", "weierstrass", "circlemultiply", "circleplus", "emptyset", "intersection",

+    "union", "propersuperset", "reflexsuperset", "notsubset", "propersubset", "reflexsubset", "element", "notelement",

+    "angle", "gradient", "registerserif", "copyrightserif", "trademarkserif", "product", "radical", "dotmath",

+    "logicalnot", "logicaland", "logicalor", "arrowdblboth", "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown",

+    "lozenge", "angleleft", "registersans", "copyrightsans", "trademarksans", "summation", "parenlefttp", "parenleftex",

+    "parenleftbt", "bracketlefttp", "bracketleftex", "bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex",

+    NULL, "angleright", "integral", "integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex",

+    "parenrightbt", "bracketrighttp", "bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", NULL,

+};

+const FX_LPCSTR  ZapfEncodingNames[224] = {

+    "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119",

+    "a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16",

+    "a105", "a17", "a18", "a19", "a20", "a21", "a22", "a23",

+    "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8",

+    "a9", "a10", "a29", "a30", "a31", "a32", "a33", "a34",

+    "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42",

+    "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50",

+    "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58",

+    "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66",

+    "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74",

+    "a203", "a75", "a204", "a76", "a77", "a78", "a79", "a81",

+    "a82", "a83", "a84", "a97", "a98", "a99", "a100", NULL,

+    "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85",

+    "a206", "a86", "a87", "a88", "a95", "a96", NULL, NULL,

+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

+    NULL, "a101", "a102", "a103", "a104", "a106", "a107", "a108",

+    "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123",

+    "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131",

+    "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139",

+    "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147",

+    "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155",

+    "a156", "a157", "a158", "a159", "a160", "a161", "a163", "a164",

+    "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170",

+    "a171", "a172", "a173", "a162", "a174", "a175", "a176", "a177",

+    "a178", "a179", "a193", "a180", "a199", "a181", "a200", "a182",

+    NULL, "a201", "a183", "a184", "a197", "a185", "a194", "a198",

+    "a186", "a195", "a187", "a188", "a189", "a190", "a191", NULL

+};

+const FX_CHAR*  PDF_CharNameFromPredefinedCharSet(int encoding, FX_BYTE charcode)

+{

+    if (encoding == PDFFONT_ENCODING_PDFDOC) {

+        if (charcode < 24) {

+            return NULL;

+        }

+        charcode -= 24;

+    } else {

+        if (charcode < 32) {

+            return NULL;

+        }

+        charcode -= 32;

+    }

+    switch (encoding) {

+        case PDFFONT_ENCODING_WINANSI:

+            return AdobeWinAnsiEncodingNames[charcode];

+        case PDFFONT_ENCODING_MACROMAN:

+            return MacRomanEncodingNames[charcode];

+        case PDFFONT_ENCODING_MACEXPERT:

+            return MacExpertEncodingNames[charcode];

+        case PDFFONT_ENCODING_STANDARD:

+            return StandardEncodingNames[charcode];

+        case PDFFONT_ENCODING_ADOBE_SYMBOL:

+            return AdobeSymbolEncodingNames[charcode];

+        case PDFFONT_ENCODING_ZAPFDINGBATS:

+            return ZapfEncodingNames[charcode];

+        case PDFFONT_ENCODING_PDFDOC:

+            return PDFDocEncodingNames[charcode];

+    }

+    return NULL;

+}

+FX_WCHAR FT_UnicodeFromCharCode(int encoding, FX_DWORD charcode)

+{

+    switch (encoding) {

+        case FXFT_ENCODING_UNICODE:

+            return (FX_WORD)charcode;

+        case FXFT_ENCODING_ADOBE_STANDARD:

+            return StandardEncoding[(FX_BYTE)charcode];

+        case FXFT_ENCODING_ADOBE_EXPERT:

+            return MacExpertEncoding[(FX_BYTE)charcode];

+        case FXFT_ENCODING_ADOBE_LATIN_1:

+            return AdobeWinAnsiEncoding[(FX_BYTE)charcode];

+        case FXFT_ENCODING_APPLE_ROMAN:

+            return MacRomanEncoding[(FX_BYTE)charcode];

+        case PDFFONT_ENCODING_PDFDOC:

+            return PDFDocEncoding[(FX_BYTE)charcode];

+    }

+    return 0;

+}

+static FX_DWORD PDF_FindCode(const FX_WORD* pCodes, FX_WORD unicode)

+{

+    for (FX_DWORD i = 0; i < 256; i ++)

+        if (pCodes[i] == unicode) {

+            return i;

+        }

+    return 0;

+}

+const FX_WORD MSSymbolEncoding[256] = {

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 32, 33, 8704, 35, 8707, 37, 38, 8715,

+    40, 41, 8727, 43, 44, 8722, 46, 47, 48, 49,

+    50, 51, 52, 53, 54, 55, 56, 57, 58, 59,

+    60, 61, 62, 63, 8773, 913, 914, 935, 916, 917,

+    934, 915, 919, 921, 977, 922, 923, 924, 925, 927,

+    928, 920, 929, 931, 932, 933, 962, 937, 926, 936,

+    918, 91, 8756, 93, 8869, 95, 8254, 945, 946, 967,

+    948, 949, 966, 947, 951, 953, 981, 954, 955, 956,

+    957, 959, 960, 952, 961, 963, 964, 965, 982, 969,

+    958, 968, 950, 123, 124, 125, 8764, 0, 0, 0,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 978, 8242, 8804, 8725, 8734, 402, 9827, 9830, 9828,

+    9824, 8596, 8592, 8593, 8594, 8595, 176, 177, 8243, 8805,

+    215, 8733, 8706, 8729, 247, 8800, 8801, 8776, 8943, 0,

+    0, 8629, 0, 8465, 8476, 8472, 8855, 8853, 8709, 8745,

+    8746, 8835, 8839, 8836, 8834, 8838, 8712, 8713, 8736, 8711,

+    174, 169, 8482, 8719, 8730, 8901, 172, 8743, 8744, 8660,

+    8656, 8657, 8658, 8659, 9674, 9001, 0, 0, 0, 8721,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0x0000, 9002, 8747, 8992, 0, 8993, 0, 0, 0, 0,

+    0, 0, 0x0000, 0x0000, 0x0000, 0x0000

+};

+FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode)

+{

+    switch (encoding) {

+        case FXFT_ENCODING_UNICODE:

+            return unicode;

+        case FXFT_ENCODING_ADOBE_STANDARD:

+            return PDF_FindCode(StandardEncoding, unicode);

+        case FXFT_ENCODING_ADOBE_EXPERT:

+            return PDF_FindCode(MacExpertEncoding, unicode);

+        case FXFT_ENCODING_ADOBE_LATIN_1:

+            return PDF_FindCode(AdobeWinAnsiEncoding, unicode);

+        case FXFT_ENCODING_APPLE_ROMAN:

+            return PDF_FindCode(MacRomanEncoding, unicode);

+        case FXFT_ENCODING_ADOBE_CUSTOM:

+            return PDF_FindCode(PDFDocEncoding, unicode);

+        case FXFT_ENCODING_MS_SYMBOL:

+            return PDF_FindCode(MSSymbolEncoding, unicode);

+    }

+    return 0;

+}

+const FX_WORD* PDF_UnicodesForPredefinedCharSet(int encoding)

+{

+    switch (encoding) {

+        case PDFFONT_ENCODING_WINANSI:

+            return AdobeWinAnsiEncoding;

+        case PDFFONT_ENCODING_MACROMAN:

+            return MacRomanEncoding;

+        case PDFFONT_ENCODING_MACEXPERT:

+            return MacExpertEncoding;

+        case PDFFONT_ENCODING_STANDARD:

+            return StandardEncoding;

+        case PDFFONT_ENCODING_ADOBE_SYMBOL:

+            return AdobeSymbolEncoding;

+        case PDFFONT_ENCODING_ZAPFDINGBATS:

+            return ZapfEncoding;

+        case PDFFONT_ENCODING_PDFDOC:

+            return PDFDocEncoding;

+        case PDFFONT_ENCODING_MS_SYMBOL:

+            return MSSymbolEncoding;

+    }

+    return NULL;

+}

+FX_DWORD PDF_PredefinedCharCodeFromUnicode(int encoding, FX_WCHAR unicode)

+{

+    return PDF_FindCode(PDF_UnicodesForPredefinedCharSet(encoding), unicode);

+}

+#ifdef __cplusplus

+extern "C" {

+#endif

+extern int FXFT_unicode_from_adobe_name(const char* name);

+#ifdef __cplusplus

+}

+#endif

+FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name)

+{

+    return (FX_WCHAR)(FXFT_unicode_from_adobe_name(name) & 0x7FFFFFFF);

+}

+CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode)

+{

+    char glyph_name[64];

+    FXFT_adobe_name_from_unicode(glyph_name, unicode);

+    return CFX_ByteString(glyph_name, -1);

+}

diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
new file mode 100644
index 0000000..891d82f
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
@@ -0,0 +1,1716 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "font_int.h"

+#include "../fpdf_cmaps/cmap_int.h"

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fxge/fx_freetype.h"

+extern FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode);

+extern FX_LPVOID FXFC_LoadPackage(FX_LPCSTR name);

+extern FX_BOOL FXFC_LoadFile(FX_LPVOID pPackage, FX_LPCSTR name, FX_LPBYTE& pBuffer, FX_DWORD& size);

+extern void FXFC_ClosePackage(FX_LPVOID pPackage);

+extern short TT2PDF(int m, FXFT_Face face);

+extern FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id);

+extern FX_LPCSTR GetAdobeCharName(int iBaseEncoding, const CFX_ByteString* pCharNames, int charcode);

+CPDF_CMapManager::CPDF_CMapManager()

+{

+#ifndef _FPDFAPI_MINI_

+    m_bPrompted = FALSE;

+    m_pPackage = NULL;

+#endif

+    FXSYS_memset32(m_CID2UnicodeMaps, 0, sizeof m_CID2UnicodeMaps);

+}

+CPDF_CMapManager::~CPDF_CMapManager()

+{

+    DropAll(FALSE);

+#ifndef _FPDFAPI_MINI_

+    if (m_pPackage) {

+        FXFC_ClosePackage(m_pPackage);

+    }

+#endif

+}

+#ifndef _FPDFAPI_MINI_

+FX_LPVOID CPDF_CMapManager::GetPackage(FX_BOOL bPrompt)

+{

+#ifndef FOXIT_CHROME_BUILD

+    if (m_pPackage == NULL) {

+        CFX_ByteString filename = CPDF_ModuleMgr::Get()->GetModuleFilePath(ADDIN_NAME_CJK, "FPDFCJK.BIN");

+        m_pPackage = FXFC_LoadPackage(filename);

+        if (bPrompt && m_pPackage == NULL && !m_bPrompted) {

+            m_bPrompted = TRUE;

+            if (!CPDF_ModuleMgr::Get()->DownloadModule(ADDIN_NAME_CJK)) {

+                return NULL;

+            }

+            m_pPackage = FXFC_LoadPackage(filename);

+        }

+    }

+#endif

+    return m_pPackage;

+}

+#endif

+CPDF_CMap* CPDF_CMapManager::GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK)

+{

+    CPDF_CMap* pCMap;

+    if (m_CMaps.Lookup(name, (FX_LPVOID&)pCMap)) {

+        return pCMap;

+    }

+    pCMap = LoadPredefinedCMap(name, bPromptCJK);

+    if (name.IsEmpty()) {

+        return pCMap;

+    }

+    m_CMaps.SetAt(name, pCMap);

+    return pCMap;

+}

+CPDF_CMap* CPDF_CMapManager::LoadPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK)

+{

+    CPDF_CMap* pCMap = FX_NEW CPDF_CMap;

+    FX_LPCSTR pname = name;

+    if (*pname == '/') {

+        pname ++;

+    }

+    pCMap->LoadPredefined(this, pname, bPromptCJK);

+    return pCMap;

+}

+const FX_LPCSTR g_CharsetNames[] = {NULL, "GB1", "CNS1", "Japan1", "Korea1", "UCS", NULL};

+const int g_CharsetCPs[] = {0, 936, 950, 932, 949, 1200, 0};

+int _CharsetFromOrdering(const CFX_ByteString& Ordering)

+{

+    int charset = 1;

+    while (g_CharsetNames[charset] && Ordering != CFX_ByteStringC(g_CharsetNames[charset])) {

+        charset ++;

+    }

+    if (g_CharsetNames[charset] == NULL) {

+        return CIDSET_UNKNOWN;

+    }

+    return charset;

+}

+void CPDF_CMapManager::ReloadAll()

+{

+    DropAll(TRUE);

+}

+void CPDF_CMapManager::DropAll(FX_BOOL bReload)

+{

+    FX_POSITION pos = m_CMaps.GetStartPosition();

+    while (pos) {

+        CFX_ByteString name;

+        CPDF_CMap* pCMap;

+        m_CMaps.GetNextAssoc(pos, name, (FX_LPVOID&)pCMap);

+        if (pCMap == NULL) {

+            continue;

+        }

+        if (bReload) {

+            pCMap->LoadPredefined(this, name, FALSE);

+        } else {

+            delete pCMap;

+        }

+    }

+    for (int i = 0; i < sizeof m_CID2UnicodeMaps / sizeof(CPDF_CID2UnicodeMap*); i ++) {

+        CPDF_CID2UnicodeMap* pMap = m_CID2UnicodeMaps[i];

+        if (pMap == NULL) {

+            continue;

+        }

+        if (bReload) {

+            pMap->Load(this, i, FALSE);

+        } else {

+            delete pMap;

+        }

+    }

+}

+CPDF_CID2UnicodeMap* CPDF_CMapManager::GetCID2UnicodeMap(int charset, FX_BOOL bPromptCJK)

+{

+    if (m_CID2UnicodeMaps[charset] == NULL) {

+        m_CID2UnicodeMaps[charset] = LoadCID2UnicodeMap(charset, bPromptCJK);

+    }

+    return m_CID2UnicodeMaps[charset];

+}

+CPDF_CID2UnicodeMap* CPDF_CMapManager::LoadCID2UnicodeMap(int charset, FX_BOOL bPromptCJK)

+{

+    CPDF_CID2UnicodeMap* pMap = FX_NEW CPDF_CID2UnicodeMap();

+    if (!pMap->Initialize()) {

+        delete pMap;

+        return NULL;

+    }

+    pMap->Load(this, charset, bPromptCJK);

+    return pMap;

+}

+CPDF_CMapParser::CPDF_CMapParser()

+{

+    m_pCMap = NULL;

+    m_Status = 0;

+    m_CodeSeq = 0;

+}

+FX_BOOL	CPDF_CMapParser::Initialize(CPDF_CMap* pCMap)

+{

+    m_pCMap = pCMap;

+    m_Status = 0;

+    m_CodeSeq = 0;

+    m_AddMaps.EstimateSize(0, 10240);

+    return TRUE;

+}

+static FX_DWORD CMap_GetCode(FX_BSTR word)

+{

+    int num = 0;

+    if (word.GetAt(0) == '<') {

+        for (int i = 1; i < word.GetLength(); i ++) {

+            FX_BYTE digit = word.GetAt(i);

+            if (digit >= '0' && digit <= '9') {

+                digit = digit - '0';

+            } else if (digit >= 'a' && digit <= 'f') {

+                digit = digit - 'a' + 10;

+            } else if (digit >= 'A' && digit <= 'F') {

+                digit = digit - 'A' + 10;

+            } else {

+                return num;

+            }

+            num = num * 16 + digit;

+        }

+    } else {

+        for (int i = 0; i < word.GetLength(); i ++) {

+            if (word.GetAt(i) < '0' || word.GetAt(i) > '9') {

+                return num;

+            }

+            num = num * 10 + word.GetAt(i) - '0';

+        }

+    }

+    return num;

+}

+static FX_BOOL _CMap_GetCodeRange(_CMap_CodeRange& range, FX_BSTR first, FX_BSTR second)

+{

+    if (first.GetLength() == 0 || first.GetAt(0) != '<') {

+        return FALSE;

+    }

+    int num = 0;

+    int i;

+    for (i = 1; i < first.GetLength(); i ++)

+        if (first.GetAt(i) == '>') {

+            break;

+        }

+    range.m_CharSize = (i - 1) / 2;

+    if (range.m_CharSize > 4) {

+        return FALSE;

+    }

+    for (i = 0; i < range.m_CharSize; i ++) {

+        FX_BYTE digit1 = first.GetAt(i * 2 + 1);

+        FX_BYTE digit2 = first.GetAt(i * 2 + 2);

+        FX_BYTE byte = (digit1 >= '0' && digit1 <= '9') ? (digit1 - '0') : ((digit1 & 0xdf) - 'A' + 10);

+        byte = byte * 16 + ((digit2 >= '0' && digit2 <= '9') ? (digit2 - '0') : ((digit2 & 0xdf) - 'A' + 10));

+        range.m_Lower[i] = byte;

+    }

+    FX_DWORD size = second.GetLength();

+    for (i = 0; i < range.m_CharSize; i ++) {

+        FX_BYTE digit1 = ((FX_DWORD)i * 2 + 1 < size) ? second.GetAt((FX_STRSIZE)i * 2 + 1) : 0;

+        FX_BYTE digit2 = ((FX_DWORD)i * 2 + 2 < size) ? second.GetAt((FX_STRSIZE)i * 2 + 2) : 0;

+        FX_BYTE byte = (digit1 >= '0' && digit1 <= '9') ? (digit1 - '0') : ((digit1 & 0xdf) - 'A' + 10);

+        byte = byte * 16 + ((digit2 >= '0' && digit2 <= '9') ? (digit2 - '0') : ((digit2 & 0xdf) - 'A' + 10));

+        range.m_Upper[i] = byte;

+    }

+    return TRUE;

+}

+static CFX_ByteString CMap_GetString(FX_BSTR word)

+{

+    return word.Mid(1, word.GetLength() - 2);

+}

+void CPDF_CMapParser::ParseWord(FX_BSTR word)

+{

+    if (word.IsEmpty()) {

+        return;

+    }

+    if (word == FX_BSTRC("begincidchar")) {

+        m_Status = 1;

+        m_CodeSeq = 0;

+    } else if (word == FX_BSTRC("begincidrange")) {

+        m_Status = 2;

+        m_CodeSeq = 0;

+    } else if (word == FX_BSTRC("endcidrange") || word == FX_BSTRC("endcidchar")) {

+        m_Status = 0;

+    } else if (word == FX_BSTRC("/WMode")) {

+        m_Status = 6;

+    } else if (word == FX_BSTRC("/Registry")) {

+        m_Status = 3;

+    } else if (word == FX_BSTRC("/Ordering")) {

+        m_Status = 4;

+    } else if (word == FX_BSTRC("/Supplement")) {

+        m_Status = 5;

+    } else if (word == FX_BSTRC("begincodespacerange")) {

+        m_Status = 7;

+        m_CodeSeq = 0;

+    } else if (word == FX_BSTRC("usecmap")) {

+    } else if (m_Status == 1 || m_Status == 2) {

+        m_CodePoints[m_CodeSeq] = CMap_GetCode(word);

+        m_CodeSeq ++;

+        FX_DWORD StartCode, EndCode;

+        FX_WORD StartCID;

+        if (m_Status == 1) {

+            if (m_CodeSeq < 2) {

+                return;

+            }

+            EndCode = StartCode = m_CodePoints[0];

+            StartCID = (FX_WORD)m_CodePoints[1];

+        } else {

+            if (m_CodeSeq < 3) {

+                return;

+            }

+            StartCode = m_CodePoints[0];

+            EndCode = m_CodePoints[1];

+            StartCID = (FX_WORD)m_CodePoints[2];

+        }

+        if (EndCode < 0x10000) {

+            for (FX_DWORD code = StartCode; code <= EndCode; code ++) {

+                m_pCMap->m_pMapping[code] = (FX_WORD)(StartCID + code - StartCode);

+            }

+        } else {

+            FX_DWORD buf[2];

+            buf[0] = StartCode;

+            buf[1] = ((EndCode - StartCode) << 16) + StartCID;

+            m_AddMaps.AppendBlock(buf, sizeof buf);

+        }

+        m_CodeSeq = 0;

+    } else if (m_Status == 3) {

+        CMap_GetString(word);

+        m_Status = 0;

+    } else if (m_Status == 4) {

+        m_pCMap->m_Charset = _CharsetFromOrdering(CMap_GetString(word));

+        m_Status = 0;

+    } else if (m_Status == 5) {

+        CMap_GetCode(word);

+        m_Status = 0;

+    } else if (m_Status == 6) {

+        m_pCMap->m_bVertical = CMap_GetCode(word);

+        m_Status = 0;

+    } else if (m_Status == 7) {

+        if (word == FX_BSTRC("endcodespacerange")) {

+            int nSegs = m_CodeRanges.GetSize();

+            if (nSegs > 1) {

+                m_pCMap->m_CodingScheme = CPDF_CMap::MixedFourBytes;

+                m_pCMap->m_nCodeRanges = nSegs;

+                m_pCMap->m_pLeadingBytes = FX_Alloc(FX_BYTE, nSegs * sizeof(_CMap_CodeRange));

+                FXSYS_memcpy32(m_pCMap->m_pLeadingBytes, m_CodeRanges.GetData(), nSegs * sizeof(_CMap_CodeRange));

+            } else if (nSegs == 1) {

+                m_pCMap->m_CodingScheme = (m_CodeRanges[0].m_CharSize == 2) ? CPDF_CMap::TwoBytes : CPDF_CMap::OneByte;

+            }

+            m_Status = 0;

+        } else {

+            if (word.GetLength() == 0 || word.GetAt(0) != '<') {

+                return;

+            }

+            if (m_CodeSeq % 2) {

+                _CMap_CodeRange range;

+                if (_CMap_GetCodeRange(range, m_LastWord, word)) {

+                    m_CodeRanges.Add(range);

+                }

+            }

+            m_CodeSeq ++;

+        }

+    }

+    m_LastWord = word;

+}

+CPDF_CMap::CPDF_CMap()

+{

+    m_Charset = CIDSET_UNKNOWN;

+    m_Coding = CIDCODING_UNKNOWN;

+    m_CodingScheme = TwoBytes;

+    m_bVertical = 0;

+    m_bLoaded = FALSE;

+    m_pMapping = NULL;

+    m_pLeadingBytes = NULL;

+    m_pAddMapping = NULL;

+    m_pEmbedMap = NULL;

+    m_pUseMap = NULL;

+    m_nCodeRanges = 0;

+}

+CPDF_CMap::~CPDF_CMap()

+{

+    if (m_pMapping) {

+        FX_Free(m_pMapping);

+    }

+    if (m_pAddMapping) {

+        FX_Free(m_pAddMapping);

+    }

+    if (m_pLeadingBytes) {

+        FX_Free(m_pLeadingBytes);

+    }

+    if (m_pUseMap) {

+        delete m_pUseMap;

+    }

+}

+void CPDF_CMap::Release()

+{

+    if (m_PredefinedCMap.IsEmpty()) {

+        delete this;

+    }

+}

+const CPDF_PredefinedCMap g_PredefinedCMaps[] = {

+    { "GB-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },

+    { "GBpc-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfc} },

+    { "GBK-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },

+    { "GBKp-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },

+    { "GBK2K-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },

+    { "GBK2K", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },

+    { "UniGB-UCS2", CIDSET_GB1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },

+    { "UniGB-UTF16", CIDSET_GB1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },

+    { "B5pc", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfc} },

+    { "HKscs-B5", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0x88, 0xfe} },

+    { "ETen-B5", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },

+    { "ETenms-B5", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },

+    { "UniCNS-UCS2", CIDSET_CNS1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },

+    { "UniCNS-UTF16", CIDSET_CNS1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },

+    { "83pv-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },

+    { "90ms-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },

+    { "90msp-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },

+    { "90pv-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },

+    { "Add-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },

+    { "EUC", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x8e, 0x8e, 0xa1, 0xfe} },

+    { "H", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e} },

+    { "V", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e} },

+    { "Ext-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },

+    { "UniJIS-UCS2", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },

+    { "UniJIS-UCS2-HW", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },

+    { "UniJIS-UTF16", CIDSET_JAPAN1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },

+    { "KSC-EUC", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },

+    { "KSCms-UHC", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },

+    { "KSCms-UHC-HW", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },

+    { "KSCpc-EUC", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfd} },

+    { "UniKS-UCS2", CIDSET_KOREA1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },

+    { "UniKS-UTF16", CIDSET_KOREA1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },

+    { NULL, 0, 0 }

+};

+extern void FPDFAPI_FindEmbeddedCMap(const char* name, int charset, int coding, const FXCMAP_CMap*& pMap);

+extern FX_WORD FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, FX_DWORD charcode);

+FX_BOOL CPDF_CMap::LoadPredefined(CPDF_CMapManager* pMgr, FX_LPCSTR pName, FX_BOOL bPromptCJK)

+{

+    m_PredefinedCMap = pName;

+    if (m_PredefinedCMap == FX_BSTRC("Identity-H") || m_PredefinedCMap == FX_BSTRC("Identity-V")) {

+        m_Coding = CIDCODING_CID;

+        m_bVertical = pName[9] == 'V';

+        m_bLoaded = TRUE;

+        return TRUE;

+    }

+    CFX_ByteString cmapid = m_PredefinedCMap;

+    m_bVertical = cmapid.Right(1) == FX_BSTRC("V");

+    if (cmapid.GetLength() > 2) {

+        cmapid = cmapid.Left(cmapid.GetLength() - 2);

+    }

+    int index = 0;

+    while (1) {

+        if (g_PredefinedCMaps[index].m_pName == NULL) {

+            return FALSE;

+        }

+        if (cmapid == CFX_ByteStringC(g_PredefinedCMaps[index].m_pName)) {

+            break;

+        }

+        index ++;

+    }

+    const CPDF_PredefinedCMap& map = g_PredefinedCMaps[index];

+    m_Charset = map.m_Charset;

+    m_Coding = map.m_Coding;

+    m_CodingScheme = map.m_CodingScheme;

+    if (m_CodingScheme == MixedTwoBytes) {

+        m_pLeadingBytes = FX_Alloc(FX_BYTE, 256);

+        FXSYS_memset32(m_pLeadingBytes, 0, 256);

+        for (FX_DWORD i = 0; i < map.m_LeadingSegCount; i ++) {

+            for (int b = map.m_LeadingSegs[i * 2]; b <= map.m_LeadingSegs[i * 2 + 1]; b ++) {

+                m_pLeadingBytes[b] = 1;

+            }

+        }

+    }

+    FPDFAPI_FindEmbeddedCMap(pName, m_Charset, m_Coding, m_pEmbedMap);

+    if (m_pEmbedMap) {

+        m_bLoaded = TRUE;

+        return TRUE;

+    }

+#ifndef _FPDFAPI_MINI_

+    FX_LPVOID pPackage = pMgr->GetPackage(bPromptCJK);

+    FX_LPBYTE pBuffer;

+    FX_DWORD size;

+    if (pPackage == NULL || !FXFC_LoadFile(pPackage, m_PredefinedCMap, pBuffer, size)) {

+        return FALSE;

+    }

+    m_pMapping = FX_Alloc(FX_WORD, 65536);

+    FXSYS_memset32(m_pMapping, 0, 65536 * sizeof(FX_WORD));

+    FX_DWORD dwRecodeEndPos = 0;

+    if (pBuffer[5] == 0) {

+        FX_DWORD dwStartIndex = *(FX_DWORD*)(pBuffer + 8);

+        FX_DWORD dwRecordCount = *(FX_DWORD*)(pBuffer + 16);

+        FX_DWORD dwDataOffset = *(FX_DWORD*)(pBuffer + 20);

+        if (dwRecordCount * 2 + dwStartIndex * 2 < 65536) {

+            FXSYS_memcpy32(m_pMapping + dwStartIndex * 2, pBuffer + dwDataOffset, dwRecordCount * 2);

+        }

+        dwRecodeEndPos = dwDataOffset + dwRecordCount * 2;

+    } else if (pBuffer[5] == 2) {

+        FX_DWORD nSegments = *(FX_DWORD*)(pBuffer + 16);

+        FX_DWORD dwDataOffset = *(FX_DWORD*)(pBuffer + 20);

+        dwRecodeEndPos = dwDataOffset + 6 * nSegments;

+        for (FX_DWORD i = 0; i < nSegments; i ++) {

+            FX_LPBYTE pRecord = pBuffer + dwDataOffset + i * 6;

+            FX_WORD IndexStart = *(FX_WORD*)pRecord;

+            FX_WORD IndexCount = *(FX_WORD*)(pRecord + 2);

+            FX_WORD CodeStart = *(FX_WORD*)(pRecord + 4);

+            if (IndexStart + IndexCount < 65536)

+                for (FX_DWORD j = 0; j < IndexCount; j ++) {

+                    m_pMapping[IndexStart + j ] = (FX_WORD)(CodeStart + j);

+                }

+        }

+    }

+    if (dwRecodeEndPos < size) {

+        FX_DWORD dwMapLen = *(FX_DWORD*)(pBuffer + dwRecodeEndPos);

+        if (dwMapLen) {

+            m_pUseMap = FX_NEW CPDF_CMap;

+            CFX_ByteString bsName(pBuffer + dwRecodeEndPos + 4 , dwMapLen);

+            if (m_pUseMap) {

+                m_pUseMap->LoadPredefined(pMgr, bsName, bPromptCJK);

+            }

+        }

+    }

+    FX_Free(pBuffer);

+    m_bLoaded = TRUE;

+#endif

+    return TRUE;

+}

+extern "C" {

+    static int compare_dword(const void* data1, const void* data2)

+    {

+        return (*(FX_DWORD*)data1) - (*(FX_DWORD*)data2);

+    }

+};

+FX_BOOL CPDF_CMap::LoadEmbedded(FX_LPCBYTE pData, FX_DWORD size)

+{

+    m_pMapping = FX_Alloc(FX_WORD, 65536);

+    FXSYS_memset32(m_pMapping, 0, 65536 * sizeof(FX_WORD));

+    CPDF_CMapParser parser;

+    parser.Initialize(this);

+    CPDF_SimpleParser syntax(pData, size);

+    while (1) {

+        CFX_ByteStringC word = syntax.GetWord();

+        if (word.IsEmpty()) {

+            break;

+        }

+        parser.ParseWord(word);

+    }

+    if (m_CodingScheme == MixedFourBytes && parser.m_AddMaps.GetSize()) {

+        m_pAddMapping = FX_Alloc(FX_BYTE, parser.m_AddMaps.GetSize() + 4);

+        *(FX_DWORD*)m_pAddMapping = parser.m_AddMaps.GetSize() / 8;

+        FXSYS_memcpy32(m_pAddMapping + 4, parser.m_AddMaps.GetBuffer(), parser.m_AddMaps.GetSize());

+        FXSYS_qsort(m_pAddMapping + 4, parser.m_AddMaps.GetSize() / 8, 8, compare_dword);

+    }

+    return TRUE;

+}

+extern "C" {

+    static int compareCID(const void* key, const void* element)

+    {

+        if ((*(FX_DWORD*)key) < (*(FX_DWORD*)element)) {

+            return -1;

+        }

+        if ((*(FX_DWORD*)key) > (*(FX_DWORD*)element) + ((FX_DWORD*)element)[1] / 65536) {

+            return 1;

+        }

+        return 0;

+    }

+};

+FX_WORD CPDF_CMap::CIDFromCharCode(FX_DWORD charcode) const

+{

+    if (m_Coding == CIDCODING_CID) {

+        return (FX_WORD)charcode;

+    }

+    if (m_pEmbedMap) {

+        return FPDFAPI_CIDFromCharCode(m_pEmbedMap, charcode);

+    }

+    if (m_pMapping == NULL) {

+        return (FX_WORD)charcode;

+    }

+    if (charcode >> 16) {

+        if (m_pAddMapping) {

+            void* found = FXSYS_bsearch(&charcode, m_pAddMapping + 4, *(FX_DWORD*)m_pAddMapping, 8, compareCID);

+            if (found == NULL) {

+                if (m_pUseMap) {

+                    return m_pUseMap->CIDFromCharCode(charcode);

+                }

+                return 0;

+            }

+            return (FX_WORD)(((FX_DWORD*)found)[1] % 65536 + charcode - * (FX_DWORD*)found);

+        }

+        if (m_pUseMap) {

+            return m_pUseMap->CIDFromCharCode(charcode);

+        }

+        return 0;

+    }

+    FX_DWORD CID = m_pMapping[charcode];

+    if (!CID && m_pUseMap) {

+        return m_pUseMap->CIDFromCharCode(charcode);

+    }

+    return (FX_WORD)CID;

+}

+static int _CheckCodeRange(FX_LPBYTE codes, int size, _CMap_CodeRange* pRanges, int nRanges)

+{

+    int iSeg = nRanges - 1;

+    while (iSeg >= 0) {

+        if (pRanges[iSeg].m_CharSize < size) {

+            iSeg --;

+            continue;

+        }

+        int iChar = 0;

+        while (iChar < size) {

+            if (codes[iChar] < pRanges[iSeg].m_Lower[iChar] ||

+                    codes[iChar] > pRanges[iSeg].m_Upper[iChar]) {

+                break;

+            }

+            iChar ++;

+        }

+        if (iChar == pRanges[iSeg].m_CharSize) {

+            return 2;

+        }

+        if (iChar) {

+            if (size == pRanges[iSeg].m_CharSize) {

+                return 2;

+            }

+            return 1;

+        }

+        iSeg --;

+    }

+    return 0;

+}

+FX_DWORD CPDF_CMap::GetNextChar(FX_LPCSTR pString, int& offset) const

+{

+    switch (m_CodingScheme) {

+        case OneByte:

+            return ((FX_LPBYTE)pString)[offset++];

+        case TwoBytes:

+            offset += 2;

+            return ((FX_LPBYTE)pString)[offset - 2] * 256 + ((FX_LPBYTE)pString)[offset - 1];

+        case MixedTwoBytes: {

+                FX_BYTE byte1 = ((FX_LPBYTE)pString)[offset++];

+                if (!m_pLeadingBytes[byte1]) {

+                    return byte1;

+                }

+                FX_BYTE byte2 = ((FX_LPBYTE)pString)[offset++];

+                return byte1 * 256 + byte2;

+            }

+        case MixedFourBytes: {

+                FX_BYTE codes[4];

+                int char_size = 1;

+                codes[0] = ((FX_LPBYTE)pString)[offset++];

+                _CMap_CodeRange* pRanges = (_CMap_CodeRange*)m_pLeadingBytes;

+                while (1) {

+                    int ret = _CheckCodeRange(codes, char_size, pRanges, m_nCodeRanges);

+                    if (ret == 0) {

+                        return 0;

+                    }

+                    if (ret == 2) {

+                        FX_DWORD charcode = 0;

+                        for (int i = 0; i < char_size; i ++) {

+                            charcode = (charcode << 8) + codes[i];

+                        }

+                        return charcode;

+                    }

+                    if (char_size == 4) {

+                        return 0;

+                    }

+                    codes[char_size ++] = ((FX_LPBYTE)pString)[offset++];

+                }

+                break;

+            }

+    }

+    return 0;

+}

+int CPDF_CMap::GetCharSize(FX_DWORD charcode) const

+{

+    switch (m_CodingScheme) {

+        case OneByte:

+            return 1;

+        case TwoBytes:

+            return 2;

+        case MixedTwoBytes:

+        case MixedFourBytes:

+            if (charcode < 0x100) {

+                return 1;

+            }

+            if (charcode < 0x10000) {

+                return 2;

+            }

+            if (charcode < 0x1000000) {

+                return 3;

+            }

+            return 4;

+    }

+    return 1;

+}

+int CPDF_CMap::CountChar(FX_LPCSTR pString, int size) const

+{

+    switch (m_CodingScheme) {

+        case OneByte:

+            return size;

+        case TwoBytes:

+            return (size + 1) / 2;

+        case MixedTwoBytes: {

+                int count = 0;

+                for (int i = 0; i < size; i ++) {

+                    count ++;

+                    if (m_pLeadingBytes[((FX_LPBYTE)pString)[i]]) {

+                        i ++;

+                    }

+                }

+                return count;

+            }

+        case MixedFourBytes: {

+                int count = 0, offset = 0;

+                while (offset < size) {

+                    GetNextChar(pString, offset);

+                    count ++;

+                }

+                return count;

+            }

+    }

+    return size;

+}

+int _GetCharSize(FX_DWORD charcode, _CMap_CodeRange* pRanges, int iRangesSize)

+{

+    if (!iRangesSize) {

+        return 1;

+    }

+    FX_BYTE codes[4];

+    codes[0] = codes[1] = 0x00;

+    codes[2] = (FX_BYTE)(charcode >> 8 & 0xFF);

+    codes[3] = (FX_BYTE)charcode;

+    int offset = 0, size = 4;

+    for (int i = 0; i < 4; ++i) {

+        int iSeg = iRangesSize - 1;

+        while (iSeg >= 0) {

+            if (pRanges[iSeg].m_CharSize < size) {

+                iSeg --;

+                continue;

+            }

+            int iChar = 0;

+            while (iChar < size) {

+                if (codes[offset + iChar] < pRanges[iSeg].m_Lower[iChar] ||

+                        codes[offset + iChar] > pRanges[iSeg].m_Upper[iChar]) {

+                    break;

+                }

+                iChar ++;

+            }

+            if (iChar == pRanges[iSeg].m_CharSize) {

+                return size;

+            }

+            iSeg --;

+        }

+        size --;

+        offset ++;

+    }

+    return 1;

+}

+int CPDF_CMap::AppendChar(FX_LPSTR str, FX_DWORD charcode) const

+{

+    switch (m_CodingScheme) {

+        case OneByte:

+            str[0] = (FX_BYTE)charcode;

+            return 1;

+        case TwoBytes:

+            str[0] = (FX_BYTE)(charcode / 256);

+            str[1] = (FX_BYTE)(charcode % 256);

+            return 2;

+        case MixedTwoBytes:

+        case MixedFourBytes:

+            if (charcode < 0x100) {

+                _CMap_CodeRange* pRanges = (_CMap_CodeRange*)m_pLeadingBytes;

+                int iSize = _GetCharSize(charcode, pRanges, m_nCodeRanges);

+                if (iSize == 0) {

+                    iSize = 1;

+                }

+                if (iSize > 1) {

+                    FXSYS_memset32(str, 0, sizeof(FX_BYTE) * iSize);

+                }

+                str[iSize - 1] = (FX_BYTE)charcode;

+                return iSize;

+            } else if (charcode < 0x10000) {

+                str[0] = (FX_BYTE)(charcode >> 8);

+                str[1] = (FX_BYTE)charcode;

+                return 2;

+            } else if (charcode < 0x1000000) {

+                str[0] = (FX_BYTE)(charcode >> 16);

+                str[1] = (FX_BYTE)(charcode >> 8);

+                str[2] = (FX_BYTE)charcode;

+                return 3;

+            } else {

+                str[0] = (FX_BYTE)(charcode >> 24);

+                str[1] = (FX_BYTE)(charcode >> 16);

+                str[2] = (FX_BYTE)(charcode >> 8);

+                str[3] = (FX_BYTE)charcode;

+                return 4;

+            }

+    }

+    return 0;

+}

+CPDF_CID2UnicodeMap::CPDF_CID2UnicodeMap()

+{

+    m_EmbeddedCount = 0;

+#ifndef _FPDFAPI_MINI_

+    m_pExternalMap = NULL;

+#endif

+}

+CPDF_CID2UnicodeMap::~CPDF_CID2UnicodeMap()

+{

+#ifndef _FPDFAPI_MINI_

+    if (m_pExternalMap) {

+        delete m_pExternalMap;

+    }

+#endif

+}

+FX_BOOL CPDF_CID2UnicodeMap::Initialize()

+{

+#ifndef _FPDFAPI_MINI_

+    m_pExternalMap = FX_NEW CPDF_FXMP;

+#endif

+    return TRUE;

+}

+FX_BOOL CPDF_CID2UnicodeMap::IsLoaded()

+{

+#ifdef _FPDFAPI_MINI_

+    return m_EmbeddedCount != 0;

+#else

+    return m_EmbeddedCount != 0 || (m_pExternalMap != NULL && m_pExternalMap->IsLoaded());

+#endif

+}

+FX_WCHAR CPDF_CID2UnicodeMap::UnicodeFromCID(FX_WORD CID)

+{

+    if (m_Charset == CIDSET_UNICODE) {

+        return CID;

+    }

+    if (CID < m_EmbeddedCount) {

+        return m_pEmbeddedMap[CID];

+    }

+#ifdef _FPDFAPI_MINI_

+    return 0;

+#else

+    FX_LPCBYTE record = m_pExternalMap->GetRecord(CID);

+    if (record == NULL) {

+        return 0;

+    }

+    return *(FX_WORD*)record;

+#endif

+}

+void FPDFAPI_LoadCID2UnicodeMap(int charset, const FX_WORD*& pMap, FX_DWORD& count);

+void CPDF_CID2UnicodeMap::Load(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK)

+{

+    m_Charset = charset;

+    FPDFAPI_LoadCID2UnicodeMap(charset, m_pEmbeddedMap, m_EmbeddedCount);

+    if (m_EmbeddedCount) {

+        return;

+    }

+#ifndef _FPDFAPI_MINI_

+    FX_LPVOID pPackage = pMgr->GetPackage(bPromptCJK);

+    if (pPackage == NULL) {

+        return;

+    }

+    m_pExternalMap->LoadFile(pPackage, FX_BSTRC("CIDInfo_") + g_CharsetNames[charset]);

+#endif

+}

+#include "ttgsubtable.h"

+CPDF_CIDFont::CPDF_CIDFont()

+{

+    m_pCMap = NULL;

+    m_pAllocatedCMap = NULL;

+    m_pCID2UnicodeMap = NULL;

+    m_pAnsiWidths = NULL;

+    m_pCIDToGIDMap = NULL;

+    m_bCIDIsGID = FALSE;

+    m_bAdobeCourierStd = FALSE;

+    m_pTTGSUBTable = NULL;

+    FXSYS_memset8(m_CharBBox, 0xff, 256 * sizeof(FX_SMALL_RECT));

+}

+CPDF_CIDFont::~CPDF_CIDFont()

+{

+    if (m_pAnsiWidths) {

+        FX_Free(m_pAnsiWidths);

+    }

+    if (m_pAllocatedCMap) {

+        delete m_pAllocatedCMap;

+    }

+    if (m_pCIDToGIDMap) {

+        delete m_pCIDToGIDMap;

+    }

+    if (m_pTTGSUBTable) {

+        delete m_pTTGSUBTable;

+    }

+}

+FX_WORD CPDF_CIDFont::CIDFromCharCode(FX_DWORD charcode) const

+{

+    if (m_pCMap == NULL) {

+        return (FX_WORD)charcode;

+    }

+    return m_pCMap->CIDFromCharCode(charcode);

+}

+FX_BOOL CPDF_CIDFont::IsVertWriting() const

+{

+    return m_pCMap ? m_pCMap->IsVertWriting() : FALSE;

+}

+extern FX_DWORD FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, FX_WORD cid);

+static FX_DWORD _EmbeddedCharcodeFromUnicode(const FXCMAP_CMap* pEmbedMap, int charset, FX_WCHAR unicode)

+{

+    if (charset <= 0 || charset > 4) {

+        return 0;

+    }

+    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();

+    const FX_WORD* pCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;

+    if (pCodes == NULL) {

+        return 0;

+    }

+    int nCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count;

+    for (int i = 0; i < nCodes; i++) {

+        if (pCodes[i] == unicode) {

+            FX_DWORD CharCode = FPDFAPI_CharCodeFromCID(pEmbedMap, i);

+            if (CharCode == 0) {

+                continue;

+            }

+            return CharCode;

+        }

+    }

+    return 0;

+}

+static FX_WCHAR _EmbeddedUnicodeFromCharcode(const FXCMAP_CMap* pEmbedMap, int charset, FX_DWORD charcode)

+{

+    if (charset <= 0 || charset > 4) {

+        return 0;

+    }

+    FX_WORD cid = FPDFAPI_CIDFromCharCode(pEmbedMap, charcode);

+    if (cid == 0) {

+        return 0;

+    }

+    CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();

+    const FX_WORD* pCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;

+    if (pCodes == NULL) {

+        return 0;

+    }

+    if (cid < pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count) {

+        return pCodes[cid];

+    }

+    return 0;

+}

+FX_WCHAR CPDF_CIDFont::_UnicodeFromCharCode(FX_DWORD charcode) const

+{

+    switch (m_pCMap->m_Coding) {

+        case CIDCODING_UCS2:

+        case CIDCODING_UTF16:

+            return (FX_WCHAR)charcode;

+        case CIDCODING_CID:

+            if (m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {

+                return 0;

+            }

+            return m_pCID2UnicodeMap->UnicodeFromCID((FX_WORD)charcode);

+    }

+    if (!m_pCMap->IsLoaded() || m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+        FX_WCHAR unicode;

+        int charsize = 1;

+        if (charcode > 255) {

+            charcode = (charcode % 256) * 256 + (charcode / 256);

+            charsize = 2;

+        }

+        int ret = FXSYS_MultiByteToWideChar(g_CharsetCPs[m_pCMap->m_Coding], 0, (FX_LPCSTR)&charcode, charsize, &unicode, 1);

+        if (ret != 1) {

+            return 0;

+        }

+        return unicode;

+#endif

+        if (m_pCMap->m_pEmbedMap) {

+            return _EmbeddedUnicodeFromCharcode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, charcode);

+        } else {

+            return 0;

+        }

+    }

+    return m_pCID2UnicodeMap->UnicodeFromCID(CIDFromCharCode(charcode));

+}

+FX_DWORD CPDF_CIDFont::_CharCodeFromUnicode(FX_WCHAR unicode) const

+{

+    switch (m_pCMap->m_Coding) {

+        case CIDCODING_UNKNOWN:

+            return 0;

+        case CIDCODING_UCS2:

+        case CIDCODING_UTF16:

+            return unicode;

+        case CIDCODING_CID: {

+                if (m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {

+                    return 0;

+                }

+                FX_DWORD CID = 0;

+                while (CID < 65536) {

+                    FX_WCHAR this_unicode = m_pCID2UnicodeMap->UnicodeFromCID((FX_WORD)CID);

+                    if (this_unicode == unicode) {

+                        return CID;

+                    }

+                    CID ++;

+                }

+                break;

+            }

+    }

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    FX_BYTE buffer[32];

+    int ret = FXSYS_WideCharToMultiByte(g_CharsetCPs[m_pCMap->m_Coding], 0, &unicode, 1, (char*)buffer, 4, NULL, NULL);

+    if (ret == 1) {

+        return buffer[0];

+    } else if (ret == 2) {

+        return buffer[0] * 256 + buffer[1];

+    }

+    return 0;

+#endif

+    if (unicode < 0x80) {

+        return (FX_DWORD)unicode;

+    } else {

+        if (m_pCMap->m_pEmbedMap) {

+            return _EmbeddedCharcodeFromUnicode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, unicode);

+        } else {

+            return 0;

+        }

+    }

+}

+static void FT_UseCIDCharmap(FXFT_Face face, int coding)

+{

+    int encoding;

+    switch (coding) {

+        case CIDCODING_GB:

+            encoding = FXFT_ENCODING_GB2312;

+            break;

+        case CIDCODING_BIG5:

+            encoding = FXFT_ENCODING_BIG5;

+            break;

+        case CIDCODING_JIS:

+            encoding = FXFT_ENCODING_SJIS;

+            break;

+        case CIDCODING_KOREA:

+            encoding = FXFT_ENCODING_JOHAB;

+            break;

+        default:

+            encoding = FXFT_ENCODING_UNICODE;

+    }

+    int err = FXFT_Select_Charmap(face, encoding);

+    if (err) {

+        err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE);

+    }

+    if (err && FXFT_Get_Face_Charmaps(face)) {

+        FXFT_Set_Charmap(face, *FXFT_Get_Face_Charmaps(face));

+    }

+}

+FX_BOOL CPDF_CIDFont::_Load()

+{

+    if (m_pFontDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("TrueType")) {

+        return LoadGB2312();

+    }

+    CPDF_Array* pFonts = m_pFontDict->GetArray(FX_BSTRC("DescendantFonts"));

+    if (pFonts == NULL) {

+        return FALSE;

+    }

+    if (pFonts->GetCount() != 1) {

+        return FALSE;

+    }

+    CPDF_Dictionary* pCIDFontDict = pFonts->GetDict(0);

+    if (pCIDFontDict == NULL) {

+        return FALSE;

+    }

+    m_BaseFont = pCIDFontDict->GetString(FX_BSTRC("BaseFont"));

+    if ((m_BaseFont.Compare("CourierStd") == 0 || m_BaseFont.Compare("CourierStd-Bold") == 0

+            || m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || m_BaseFont.Compare("CourierStd-Oblique") == 0)

+            && !IsEmbedded()) {

+        m_bAdobeCourierStd = TRUE;

+    }

+    CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDict(FX_BSTRC("FontDescriptor"));

+    if (pFontDesc) {

+        LoadFontDescriptor(pFontDesc);

+    }

+    CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC("Encoding"));

+    if (pEncoding == NULL) {

+        return FALSE;

+    }

+    CFX_ByteString subtype = pCIDFontDict->GetString(FX_BSTRC("Subtype"));

+    m_bType1 = FALSE;

+    if (subtype == FX_BSTRC("CIDFontType0")) {

+        m_bType1 = TRUE;

+    }

+    if (pEncoding->GetType() == PDFOBJ_NAME) {

+        CFX_ByteString cmap = pEncoding->GetString();

+        m_pCMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetPredefinedCMap(cmap,

+                  m_pFontFile && m_bType1);

+    } else if (pEncoding->GetType() == PDFOBJ_STREAM) {

+        m_pAllocatedCMap = m_pCMap = FX_NEW CPDF_CMap;

+        CPDF_Stream* pStream = (CPDF_Stream*)pEncoding;

+        CPDF_StreamAcc acc;

+        acc.LoadAllData(pStream, FALSE);

+        m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize());

+    } else {

+        return FALSE;

+    }

+    if (m_pCMap == NULL) {

+        return FALSE;

+    }

+    m_Charset = m_pCMap->m_Charset;

+    if (m_Charset == CIDSET_UNKNOWN) {

+        CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDict(FX_BSTRC("CIDSystemInfo"));

+        if (pCIDInfo) {

+            m_Charset = _CharsetFromOrdering(pCIDInfo->GetString(FX_BSTRC("Ordering")));

+        }

+    }

+    if (m_Charset != CIDSET_UNKNOWN)

+        m_pCID2UnicodeMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(m_Charset,

+                            m_pFontFile == NULL && (m_pCMap->m_Coding == CIDCODING_CID || pCIDFontDict->KeyExist(FX_BSTRC("W"))));

+    if (m_Font.GetFace()) {

+        if (m_bType1) {

+            FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE);

+        } else {

+            FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->m_Coding);

+        }

+    }

+    m_DefaultWidth = pCIDFontDict->GetInteger(FX_BSTRC("DW"), 1000);

+    CPDF_Array* pWidthArray = pCIDFontDict->GetArray(FX_BSTRC("W"));

+    if (pWidthArray) {

+        LoadMetricsArray(pWidthArray, m_WidthList, 1);

+    }

+    if (!IsEmbedded()) {

+        LoadSubstFont();

+    }

+    if (1) {

+        if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) {

+            CPDF_Object* pmap = pCIDFontDict->GetElementValue(FX_BSTRC("CIDToGIDMap"));

+            if (pmap) {

+                if (pmap->GetType() == PDFOBJ_STREAM) {

+                    m_pCIDToGIDMap = FX_NEW CPDF_StreamAcc;

+                    m_pCIDToGIDMap->LoadAllData((CPDF_Stream*)pmap, FALSE);

+                } else if (pmap->GetString() == FX_BSTRC("Identity")) {

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+                    if (m_pFontFile) {

+                        m_bCIDIsGID = TRUE;

+                    }

+#else

+                    m_bCIDIsGID = TRUE;

+#endif

+                }

+            }

+        }

+    }

+    CheckFontMetrics();

+    if (IsVertWriting()) {

+        pWidthArray = pCIDFontDict->GetArray(FX_BSTRC("W2"));

+        if (pWidthArray) {

+            LoadMetricsArray(pWidthArray, m_VertMetrics, 3);

+        }

+        CPDF_Array* pDefaultArray = pCIDFontDict->GetArray(FX_BSTRC("DW2"));

+        if (pDefaultArray) {

+            m_DefaultVY = pDefaultArray->GetInteger(0);

+            m_DefaultW1 = pDefaultArray->GetInteger(1);

+        } else {

+            m_DefaultVY = 880;

+            m_DefaultW1 = -1000;

+        }

+    }

+    return TRUE;

+}

+FX_FLOAT _CIDTransformToFloat(FX_BYTE ch)

+{

+    if (ch < 128) {

+        return ch * 1.0f / 127;

+    }

+    return (-255 + ch) * 1.0f / 127;

+}

+void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)

+{

+    if (charcode < 256 && m_CharBBox[charcode].Right != -1) {

+        rect.bottom = m_CharBBox[charcode].Bottom;

+        rect.left = m_CharBBox[charcode].Left;

+        rect.right = m_CharBBox[charcode].Right;

+        rect.top = m_CharBBox[charcode].Top;

+        return;

+    }

+    FX_BOOL bVert = FALSE;

+    int glyph_index = GlyphFromCharCode(charcode, &bVert);

+    if (m_Font.m_Face == NULL) {

+        rect = FX_RECT(0, 0, 0, 0);

+    } else {

+        rect.left = rect.bottom = rect.right = rect.top = 0;

+        FXFT_Face face = m_Font.m_Face;

+        if (FXFT_Is_Face_Tricky(face)) {

+            int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);

+            if (!err) {

+                FXFT_BBox cbox;

+                FXFT_Glyph glyph;

+                err = FXFT_Get_Glyph(((FXFT_Face)face)->glyph, &glyph);

+                if (!err) {

+                    FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);

+                    int pixel_size_x = ((FXFT_Face)face)->size->metrics.x_ppem;

+                    int	pixel_size_y = ((FXFT_Face)face)->size->metrics.y_ppem;

+                    if (pixel_size_x == 0 || pixel_size_y == 0) {

+                        rect.left = cbox.xMin;

+                        rect.right = cbox.xMax;

+                        rect.top = cbox.yMax;

+                        rect.bottom = cbox.yMin;

+                    } else {

+                        rect.left = cbox.xMin * 1000 / pixel_size_x;

+                        rect.right = cbox.xMax * 1000 / pixel_size_x;

+                        rect.top = cbox.yMax * 1000 / pixel_size_y;

+                        rect.bottom = cbox.yMin * 1000 / pixel_size_y;

+                    }

+                    if (rect.top > FXFT_Get_Face_Ascender(face)) {

+                        rect.top = FXFT_Get_Face_Ascender(face);

+                    }

+                    if (rect.bottom < FXFT_Get_Face_Descender(face)) {

+                        rect.bottom = FXFT_Get_Face_Descender(face);

+                    }

+                    FXFT_Done_Glyph(glyph);

+                }

+            }

+        } else {

+            int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_SCALE);

+            if (err == 0) {

+                rect.left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face);

+                rect.right = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), face);

+                rect.top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face);

+                rect.top += rect.top / 64;

+                rect.bottom = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), face);

+            }

+        }

+    }

+    if (m_pFontFile == NULL && m_Charset == CIDSET_JAPAN1) {

+        FX_WORD CID = CIDFromCharCode(charcode);

+        FX_LPCBYTE pTransform = GetCIDTransform(CID);

+        if (pTransform && !bVert) {

+            CFX_AffineMatrix matrix(_CIDTransformToFloat(pTransform[0]), _CIDTransformToFloat(pTransform[1]),

+                                    _CIDTransformToFloat(pTransform[2]), _CIDTransformToFloat(pTransform[3]),

+                                    _CIDTransformToFloat(pTransform[4]) * 1000 , _CIDTransformToFloat(pTransform[5]) * 1000);

+            CFX_FloatRect rect_f(rect);

+            rect_f.Transform(&matrix);

+            rect = rect_f.GetOutterRect();

+        }

+    }

+    if (charcode < 256) {

+        m_CharBBox[charcode].Bottom = (short)rect.bottom;

+        m_CharBBox[charcode].Left = (short)rect.left;

+        m_CharBBox[charcode].Right = (short)rect.right;

+        m_CharBBox[charcode].Top = (short)rect.top;

+    }

+}

+int CPDF_CIDFont::GetCharWidthF(FX_DWORD charcode, int level)

+{

+    if (m_pAnsiWidths && charcode < 0x80) {

+        return m_pAnsiWidths[charcode];

+    }

+    FX_WORD cid = CIDFromCharCode(charcode);

+    int size = m_WidthList.GetSize();

+    FX_DWORD* list = m_WidthList.GetData();

+    for (int i = 0; i < size; i += 3) {

+        if (cid >= list[i] && cid <= list[i + 1]) {

+            return (int)list[i + 2];

+        }

+    }

+    return m_DefaultWidth;

+}

+short CPDF_CIDFont::GetVertWidth(FX_WORD CID) const

+{

+    FX_DWORD vertsize = m_VertMetrics.GetSize() / 5;

+    if (vertsize == 0) {

+        return m_DefaultW1;

+    }

+    const FX_DWORD* pTable = m_VertMetrics.GetData();

+    for (FX_DWORD i = 0; i < vertsize; i ++)

+        if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) {

+            return (short)(int)pTable[i * 5 + 2];

+        }

+    return m_DefaultW1;

+}

+void CPDF_CIDFont::GetVertOrigin(FX_WORD CID, short& vx, short &vy) const

+{

+    FX_DWORD vertsize = m_VertMetrics.GetSize() / 5;

+    if (vertsize) {

+        const FX_DWORD* pTable = m_VertMetrics.GetData();

+        for (FX_DWORD i = 0; i < vertsize; i ++)

+            if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) {

+                vx = (short)(int)pTable[i * 5 + 3];

+                vy = (short)(int)pTable[i * 5 + 4];

+                return;

+            }

+    }

+    FX_DWORD dwWidth = m_DefaultWidth;

+    int size = m_WidthList.GetSize();

+    const FX_DWORD* list = m_WidthList.GetData();

+    for (int i = 0; i < size; i += 3) {

+        if (CID >= list[i] && CID <= list[i + 1]) {

+            dwWidth = (FX_WORD)list[i + 2];

+            break;

+        }

+    }

+    vx = (short)dwWidth / 2;

+    vy = (short)m_DefaultVY;

+}

+int	CPDF_CIDFont::GetGlyphIndex(FX_DWORD unicode, FX_BOOL *pVertGlyph)

+{

+    if (pVertGlyph) {

+        *pVertGlyph = FALSE;

+    }

+    int index = FXFT_Get_Char_Index(m_Font.m_Face, unicode );

+    if (unicode == 0x2502) {

+        return index;

+    }

+    if (index && IsVertWriting()) {

+        if (m_pTTGSUBTable) {

+            TT_uint32_t vindex = 0;

+            m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);

+            if (vindex) {

+                index = vindex;

+                if (pVertGlyph) {

+                    *pVertGlyph = TRUE;

+                }

+            }

+            return index;

+        }

+        if (NULL == m_Font.m_pGsubData) {

+            unsigned long length = 0;

+            int error = FXFT_Load_Sfnt_Table( m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);

+            if (!error) {

+                m_Font.m_pGsubData = (unsigned char*)FX_Alloc(FX_BYTE, length);

+            }

+        }

+        int error = FXFT_Load_Sfnt_Table( m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, m_Font.m_pGsubData, NULL);

+        if (!error && m_Font.m_pGsubData) {

+            m_pTTGSUBTable = FX_NEW CFX_CTTGSUBTable;

+            m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.m_pGsubData);

+            TT_uint32_t vindex = 0;

+            m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);

+            if (vindex) {

+                index = vindex;

+                if (pVertGlyph) {

+                    *pVertGlyph = TRUE;

+                }

+            }

+        }

+        return index;

+    }

+    if (pVertGlyph) {

+        *pVertGlyph = FALSE;

+    }

+    return index;

+}

+int CPDF_CIDFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph)

+{

+    if (pVertGlyph) {

+        *pVertGlyph = FALSE;

+    }

+    if (m_pFontFile == NULL && m_pCIDToGIDMap == NULL) {

+        FX_WORD cid = CIDFromCharCode(charcode);

+        FX_WCHAR unicode = 0;

+        if (m_bCIDIsGID) {

+#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_

+            return cid;

+#else

+            if (m_Flags & PDFFONT_SYMBOLIC) {

+                return cid;

+            }

+            CFX_WideString uni_str = UnicodeFromCharCode(charcode);

+            if (uni_str.IsEmpty()) {

+                return cid;

+            }

+            unicode = uni_str.GetAt(0);

+#endif

+        } else {

+            if (cid && m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded()) {

+                unicode = m_pCID2UnicodeMap->UnicodeFromCID(cid);

+            }

+            if (unicode == 0) {

+                unicode = _UnicodeFromCharCode(charcode);

+            }

+            if (unicode == 0 && !(m_Flags & PDFFONT_SYMBOLIC)) {

+                unicode = UnicodeFromCharCode(charcode).GetAt(0);

+            }

+        }

+        if (unicode == 0) {

+            if (!m_bAdobeCourierStd) {

+                return charcode == 0 ? -1 : (int)charcode;

+            }

+            charcode += 31;

+            int index = 0, iBaseEncoding;

+            FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1);

+            FX_BOOL bMacRoman = FALSE;

+            if (!bMSUnicode) {

+                bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0);

+            }

+            iBaseEncoding = PDFFONT_ENCODING_STANDARD;

+            if (bMSUnicode) {

+                iBaseEncoding = PDFFONT_ENCODING_WINANSI;

+            } else if (bMacRoman) {

+                iBaseEncoding = PDFFONT_ENCODING_MACROMAN;

+            }

+            FX_LPCSTR name = GetAdobeCharName(iBaseEncoding, NULL, charcode);

+            if (name == NULL) {

+                return charcode == 0 ? -1 : (int)charcode;

+            }

+            FX_WORD unicode = PDF_UnicodeFromAdobeName(name);

+            if (unicode) {

+                if (bMSUnicode) {

+                    index = FXFT_Get_Char_Index(m_Font.m_Face, unicode);

+                } else if (bMacRoman) {

+                    FX_DWORD maccode = FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, unicode);

+                    index = !maccode ? FXFT_Get_Name_Index(m_Font.m_Face, (char *)name) : FXFT_Get_Char_Index(m_Font.m_Face, maccode);

+                } else {

+                    return FXFT_Get_Char_Index(m_Font.m_Face, unicode);

+                }

+            } else {

+                return charcode == 0 ? -1 : (int)charcode;

+            }

+            if (index == 0 || index == 0xffff) {

+                return charcode == 0 ? -1 : (int)charcode;

+            } else {

+                return index;

+            }

+        }

+        if (m_Charset == CIDSET_JAPAN1) {

+            if (unicode == '\\') {

+                unicode = '/';

+            }

+#if !defined(_FPDFAPI_MINI_) && _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_

+            else if (unicode == 0xa5) {

+                unicode = 0x5c;

+            }

+#endif

+        }

+        if (m_Font.m_Face == NULL) {

+            return unicode;

+        }

+        int err = FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE);

+        if (err != 0) {

+            int i;

+            for (i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i ++) {

+                FX_DWORD ret = FT_CharCodeFromUnicode(FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]), (FX_WCHAR)charcode);

+                if (ret == 0) {

+                    continue;

+                }

+                FXFT_Set_Charmap(m_Font.m_Face, FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]);

+                unicode = (FX_WCHAR)ret;

+                break;

+            }

+            if (i == FXFT_Get_Face_CharmapCount(m_Font.m_Face) && i) {

+                FXFT_Set_Charmap(m_Font.m_Face, FXFT_Get_Face_Charmaps(m_Font.m_Face)[0]);

+                unicode = (FX_WCHAR)charcode;

+            }

+        }

+        if (FXFT_Get_Face_Charmap(m_Font.m_Face)) {

+            int index = GetGlyphIndex(unicode, pVertGlyph);

+            if (index == 0) {

+                return -1;

+            }

+            return index;

+        }

+        return unicode ;

+    }

+    if (m_Font.m_Face == NULL) {

+        return -1;

+    }

+    FX_WORD cid = CIDFromCharCode(charcode);

+    if (m_bType1) {

+        if (NULL == m_pCIDToGIDMap) {

+            return cid;

+        }

+    } else {

+        if (m_pCIDToGIDMap == NULL) {

+            if (m_pFontFile && m_pCMap->m_pMapping == NULL) {

+                return cid;

+            }

+            if (m_pCMap->m_Coding == CIDCODING_UNKNOWN || FXFT_Get_Face_Charmap(m_Font.m_Face) == NULL) {

+                return cid;

+            }

+            if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.m_Face)) == FXFT_ENCODING_UNICODE) {

+                CFX_WideString unicode_str = UnicodeFromCharCode(charcode);

+                if (unicode_str.IsEmpty()) {

+                    return -1;

+                }

+                charcode = unicode_str.GetAt(0);

+            }

+            return GetGlyphIndex(charcode, pVertGlyph);

+        }

+    }

+    FX_DWORD byte_pos = cid * 2;

+    if (byte_pos + 2 > m_pCIDToGIDMap->GetSize()) {

+        return -1;

+    }

+    FX_LPCBYTE pdata = m_pCIDToGIDMap->GetData() + byte_pos;

+    return pdata[0] * 256 + pdata[1];

+}

+FX_DWORD CPDF_CIDFont::GetNextChar(FX_LPCSTR pString, int& offset) const

+{

+    return m_pCMap->GetNextChar(pString, offset);

+}

+int CPDF_CIDFont::GetCharSize(FX_DWORD charcode) const

+{

+    return m_pCMap->GetCharSize(charcode);

+}

+int CPDF_CIDFont::CountChar(FX_LPCSTR pString, int size) const

+{

+    return m_pCMap->CountChar(pString, size);

+}

+int CPDF_CIDFont::AppendChar(FX_LPSTR str, FX_DWORD charcode) const

+{

+    return m_pCMap->AppendChar(str, charcode);

+}

+FX_BOOL CPDF_CIDFont::IsUnicodeCompatible() const

+{

+    if (!m_pCMap->IsLoaded() || m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {

+        return m_pCMap->m_Coding != CIDCODING_UNKNOWN;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_CIDFont::IsFontStyleFromCharCode(FX_DWORD charcode) const

+{

+    return TRUE;

+}

+void CPDF_CIDFont::LoadSubstFont()

+{

+    m_Font.LoadSubst(m_BaseFont, !m_bType1, m_Flags, m_StemV * 5, m_ItalicAngle, g_CharsetCPs[m_Charset], IsVertWriting());

+}

+void CPDF_CIDFont::LoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements)

+{

+    int width_status = 0;

+    int iCurElement = 0;

+    int first_code = 0, last_code;

+    FX_DWORD count = pArray->GetCount();

+    for (FX_DWORD i = 0; i < count; i ++) {

+        CPDF_Object* pObj = pArray->GetElementValue(i);

+        if (pObj == NULL) {

+            continue;

+        }

+        if (pObj->GetType() == PDFOBJ_ARRAY) {

+            if (width_status != 1) {

+                return;

+            }

+            CPDF_Array* pArray = (CPDF_Array*)pObj;

+            FX_DWORD count = pArray->GetCount();

+            for (FX_DWORD j = 0; j < count; j += nElements) {

+                result.Add(first_code);

+                result.Add(first_code);

+                for (int k = 0; k < nElements; k ++) {

+                    result.Add(pArray->GetInteger(j + k));

+                }

+                first_code ++;

+            }

+            width_status = 0;

+        } else {

+            if (width_status == 0) {

+                first_code = pObj->GetInteger();

+                width_status = 1;

+            } else if (width_status == 1) {

+                last_code = pObj->GetInteger();

+                width_status = 2;

+                iCurElement = 0;

+            } else {

+                if (!iCurElement) {

+                    result.Add(first_code);

+                    result.Add(last_code);

+                }

+                result.Add(pObj->GetInteger());

+                iCurElement ++;

+                if (iCurElement == nElements) {

+                    width_status = 0;

+                }

+            }

+        }

+    }

+}

+FX_BOOL CPDF_CIDFont::LoadGB2312()

+{

+    m_BaseFont = m_pFontDict->GetString(FX_BSTRC("BaseFont"));

+    CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC("FontDescriptor"));

+    if (pFontDesc) {

+        LoadFontDescriptor(pFontDesc);

+    }

+    m_Charset = CIDSET_GB1;

+    m_bType1 = FALSE;

+    m_pCMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetPredefinedCMap(

+                  FX_BSTRC("GBK-EUC-H"), FALSE);

+    m_pCID2UnicodeMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(m_Charset, FALSE);

+    if (!IsEmbedded()) {

+        LoadSubstFont();

+    }

+    CheckFontMetrics();

+    m_DefaultWidth = 1000;

+    m_pAnsiWidths = FX_Alloc(FX_WORD, 128);

+    FXSYS_memset32(m_pAnsiWidths, 0, 128 * sizeof(FX_WORD));

+    for (int i = 32; i < 127; i ++) {

+        m_pAnsiWidths[i] = 500;

+    }

+    return TRUE;

+}

+const struct _CIDTransform {

+    FX_WORD		CID;

+    FX_BYTE		a, b, c, d, e, f;

+}

+Japan1_VertCIDs[] = {

+    {97, 129, 0, 0, 127, 55, 0},

+    {7887, 127, 0, 0, 127, 76, 89},

+    {7888, 127, 0, 0, 127, 79, 94},

+    {7889, 0, 129, 127, 0, 17, 127},

+    {7890, 0, 129, 127, 0, 17, 127},

+    {7891, 0, 129, 127, 0, 17, 127},

+    {7892, 0, 129, 127, 0, 17, 127},

+    {7893, 0, 129, 127, 0, 17, 127},

+    {7894, 0, 129, 127, 0, 17, 127},

+    {7895, 0, 129, 127, 0, 17, 127},

+    {7896, 0, 129, 127, 0, 17, 127},

+    {7897, 0, 129, 127, 0, 17, 127},

+    {7898, 0, 129, 127, 0, 17, 127},

+    {7899, 0, 129, 127, 0, 17, 104},

+    {7900, 0, 129, 127, 0, 17, 127},

+    {7901, 0, 129, 127, 0, 17, 104},

+    {7902, 0, 129, 127, 0, 17, 127},

+    {7903, 0, 129, 127, 0, 17, 127},

+    {7904, 0, 129, 127, 0, 17, 127},

+    {7905, 0, 129, 127, 0, 17, 114},

+    {7906, 0, 129, 127, 0, 17, 127},

+    {7907, 0, 129, 127, 0, 17, 127},

+    {7908, 0, 129, 127, 0, 17, 127},

+    {7909, 0, 129, 127, 0, 17, 127},

+    {7910, 0, 129, 127, 0, 17, 127},

+    {7911, 0, 129, 127, 0, 17, 127},

+    {7912, 0, 129, 127, 0, 17, 127},

+    {7913, 0, 129, 127, 0, 17, 127},

+    {7914, 0, 129, 127, 0, 17, 127},

+    {7915, 0, 129, 127, 0, 17, 114},

+    {7916, 0, 129, 127, 0, 17, 127},

+    {7917, 0, 129, 127, 0, 17, 127},

+    {7918, 127, 0, 0, 127, 18, 25},

+    {7919, 127, 0, 0, 127, 18, 25},

+    {7920, 127, 0, 0, 127, 18, 25},

+    {7921, 127, 0, 0, 127, 18, 25},

+    {7922, 127, 0, 0, 127, 18, 25},

+    {7923, 127, 0, 0, 127, 18, 25},

+    {7924, 127, 0, 0, 127, 18, 25},

+    {7925, 127, 0, 0, 127, 18, 25},

+    {7926, 127, 0, 0, 127, 18, 25},

+    {7927, 127, 0, 0, 127, 18, 25},

+    {7928, 127, 0, 0, 127, 18, 25},

+    {7929, 127, 0, 0, 127, 18, 25},

+    {7930, 127, 0, 0, 127, 18, 25},

+    {7931, 127, 0, 0, 127, 18, 25},

+    {7932, 127, 0, 0, 127, 18, 25},

+    {7933, 127, 0, 0, 127, 18, 25},

+    {7934, 127, 0, 0, 127, 18, 25},

+    {7935, 127, 0, 0, 127, 18, 25},

+    {7936, 127, 0, 0, 127, 18, 25},

+    {7937, 127, 0, 0, 127, 18, 25},

+    {7938, 127, 0, 0, 127, 18, 25},

+    {7939, 127, 0, 0, 127, 18, 25},

+    {8720, 0, 129, 127, 0, 19, 102},

+    {8721, 0, 129, 127, 0, 13, 127},

+    {8722, 0, 129, 127, 0, 19, 108},

+    {8723, 0, 129, 127, 0, 19, 102},

+    {8724, 0, 129, 127, 0, 19, 102},

+    {8725, 0, 129, 127, 0, 19, 102},

+    {8726, 0, 129, 127, 0, 19, 102},

+    {8727, 0, 129, 127, 0, 19, 102},

+    {8728, 0, 129, 127, 0, 19, 114},

+    {8729, 0, 129, 127, 0, 19, 114},

+    {8730, 0, 129, 127, 0, 38, 108},

+    {8731, 0, 129, 127, 0, 13, 108},

+    {8732, 0, 129, 127, 0, 19, 108},

+    {8733, 0, 129, 127, 0, 19, 108},

+    {8734, 0, 129, 127, 0, 19, 108},

+    {8735, 0, 129, 127, 0, 19, 108},

+    {8736, 0, 129, 127, 0, 19, 102},

+    {8737, 0, 129, 127, 0, 19, 102},

+    {8738, 0, 129, 127, 0, 19, 102},

+    {8739, 0, 129, 127, 0, 19, 102},

+    {8740, 0, 129, 127, 0, 19, 102},

+    {8741, 0, 129, 127, 0, 19, 102},

+    {8742, 0, 129, 127, 0, 19, 102},

+    {8743, 0, 129, 127, 0, 19, 102},

+    {8744, 0, 129, 127, 0, 19, 102},

+    {8745, 0, 129, 127, 0, 19, 102},

+    {8746, 0, 129, 127, 0, 19, 114},

+    {8747, 0, 129, 127, 0, 19, 114},

+    {8748, 0, 129, 127, 0, 19, 102},

+    {8749, 0, 129, 127, 0, 19, 102},

+    {8750, 0, 129, 127, 0, 19, 102},

+    {8751, 0, 129, 127, 0, 19, 102},

+    {8752, 0, 129, 127, 0, 19, 102},

+    {8753, 0, 129, 127, 0, 19, 102},

+    {8754, 0, 129, 127, 0, 19, 102},

+    {8755, 0, 129, 127, 0, 19, 102},

+    {8756, 0, 129, 127, 0, 19, 102},

+    {8757, 0, 129, 127, 0, 19, 102},

+    {8758, 0, 129, 127, 0, 19, 102},

+    {8759, 0, 129, 127, 0, 19, 102},

+    {8760, 0, 129, 127, 0, 19, 102},

+    {8761, 0, 129, 127, 0, 19, 102},

+    {8762, 0, 129, 127, 0, 19, 102},

+    {8763, 0, 129, 127, 0, 19, 102},

+    {8764, 0, 129, 127, 0, 19, 102},

+    {8765, 0, 129, 127, 0, 19, 102},

+    {8766, 0, 129, 127, 0, 19, 102},

+    {8767, 0, 129, 127, 0, 19, 102},

+    {8768, 0, 129, 127, 0, 19, 102},

+    {8769, 0, 129, 127, 0, 19, 102},

+    {8770, 0, 129, 127, 0, 19, 102},

+    {8771, 0, 129, 127, 0, 19, 102},

+    {8772, 0, 129, 127, 0, 19, 102},

+    {8773, 0, 129, 127, 0, 19, 102},

+    {8774, 0, 129, 127, 0, 19, 102},

+    {8775, 0, 129, 127, 0, 19, 102},

+    {8776, 0, 129, 127, 0, 19, 102},

+    {8777, 0, 129, 127, 0, 19, 102},

+    {8778, 0, 129, 127, 0, 19, 102},

+    {8779, 0, 129, 127, 0, 19, 114},

+    {8780, 0, 129, 127, 0, 19, 108},

+    {8781, 0, 129, 127, 0, 19, 114},

+    {8782, 0, 129, 127, 0, 13, 114},

+    {8783, 0, 129, 127, 0, 19, 108},

+    {8784, 0, 129, 127, 0, 13, 114},

+    {8785, 0, 129, 127, 0, 19, 108},

+    {8786, 0, 129, 127, 0, 19, 108},

+    {8787, 0, 129, 127, 0, 19, 108},

+    {8788, 0, 129, 127, 0, 19, 108},

+    {8789, 0, 129, 127, 0, 19, 108},

+    {8790, 0, 129, 127, 0, 19, 108},

+    {8791, 0, 129, 127, 0, 19, 108},

+    {8792, 0, 129, 127, 0, 19, 108},

+    {8793, 0, 129, 127, 0, 19, 108},

+    {8794, 0, 129, 127, 0, 19, 108},

+    {8795, 0, 129, 127, 0, 19, 108},

+    {8796, 0, 129, 127, 0, 19, 108},

+    {8797, 0, 129, 127, 0, 19, 108},

+    {8798, 0, 129, 127, 0, 19, 108},

+    {8799, 0, 129, 127, 0, 19, 108},

+    {8800, 0, 129, 127, 0, 19, 108},

+    {8801, 0, 129, 127, 0, 19, 108},

+    {8802, 0, 129, 127, 0, 19, 108},

+    {8803, 0, 129, 127, 0, 19, 108},

+    {8804, 0, 129, 127, 0, 19, 108},

+    {8805, 0, 129, 127, 0, 19, 108},

+    {8806, 0, 129, 127, 0, 19, 108},

+    {8807, 0, 129, 127, 0, 19, 108},

+    {8808, 0, 129, 127, 0, 19, 108},

+    {8809, 0, 129, 127, 0, 19, 108},

+    {8810, 0, 129, 127, 0, 19, 108},

+    {8811, 0, 129, 127, 0, 19, 114},

+    {8812, 0, 129, 127, 0, 19, 102},

+    {8813, 0, 129, 127, 0, 19, 114},

+    {8814, 0, 129, 127, 0, 76, 102},

+    {8815, 0, 129, 127, 0, 13, 121},

+    {8816, 0, 129, 127, 0, 19, 114},

+    {8817, 0, 129, 127, 0, 19, 127},

+    {8818, 0, 129, 127, 0, 19, 114},

+    {8819, 0, 129, 127, 0, 218, 108},

+};

+FX_LPCBYTE CPDF_CIDFont::GetCIDTransform(FX_WORD CID) const

+{

+    if (m_Charset != CIDSET_JAPAN1 || m_pFontFile != NULL) {

+        return NULL;

+    }

+    int begin = 0;

+    int end = sizeof Japan1_VertCIDs / sizeof(struct _CIDTransform) - 1;

+    while (begin <= end) {

+        int middle = (begin + end) / 2;

+        FX_WORD middlecode = Japan1_VertCIDs[middle].CID;

+        if (middlecode > CID) {

+            end = middle - 1;

+        } else if (middlecode < CID) {

+            begin = middle + 1;

+        } else {

+            return &Japan1_VertCIDs[middle].a;

+        }

+    }

+    return NULL;

+}

diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp
new file mode 100644
index 0000000..7810fe8
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp
@@ -0,0 +1,97 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fpdfapi/fpdf_resource.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "font_int.h"

+#ifndef _FPDFAPI_MINI_

+typedef struct {

+    FXSYS_FILE*	m_pFile;

+    int		m_nFiles;

+    int		m_IndexSize;

+    int		m_IndexOffset;

+} FXFC_PACKAGE;

+FX_LPVOID FXFC_LoadPackage(FX_LPCSTR name)

+{

+    FXSYS_FILE* file = FXSYS_fopen(name, (FX_LPCSTR)"rb");

+    if (file == NULL) {

+        return NULL;

+    }

+    FX_BYTE buf[256];

+    size_t read = FXSYS_fread(buf, 1, 20, file);

+    if (*(FX_DWORD*)buf != 0x43465846) {

+        FXSYS_fclose(file);

+        return NULL;

+    }

+    FXFC_PACKAGE* pPackage = FX_Alloc(FXFC_PACKAGE, 1);

+    pPackage->m_pFile = file;

+    pPackage->m_nFiles = *(int*)(buf + 8);

+    pPackage->m_IndexSize = *(int*)(buf + 12);

+    pPackage->m_IndexOffset = *(int*)(buf + 16);

+    return pPackage;

+}

+void FXFC_ClosePackage(FX_LPVOID p)

+{

+    FXFC_PACKAGE* pPackage = (FXFC_PACKAGE*)p;

+    FXSYS_fclose(pPackage->m_pFile);

+    FX_Free(pPackage);

+}

+FX_BOOL FXFC_LoadFile(FX_LPVOID p, FX_LPCSTR name, FX_LPBYTE& pBuffer, FX_DWORD& size)

+{

+    FXFC_PACKAGE* pPackage = (FXFC_PACKAGE*)p;

+    FXSYS_fseek(pPackage->m_pFile, pPackage->m_IndexOffset, FXSYS_SEEK_SET);

+    FX_BYTE buf[128];

+    size_t read = 0;

+    for (int i = 0; i < pPackage->m_nFiles; i ++) {

+        read = FXSYS_fread(buf, pPackage->m_IndexSize, 1, pPackage->m_pFile);

+        if (FXSYS_stricmp((FX_LPCSTR)buf, name) == 0) {

+            FX_DWORD offset = *(FX_DWORD*)&buf[64];

+            size = *(FX_DWORD*)&buf[68];

+            pBuffer = FX_Alloc(FX_BYTE, size);

+            FXSYS_fseek(pPackage->m_pFile, offset, FXSYS_SEEK_SET);

+            read = FXSYS_fread(pBuffer, size, 1, pPackage->m_pFile);

+            if (buf[72]) {

+                FX_DWORD orig_size;

+                FX_LPBYTE comp_buf = pBuffer;

+                CPDF_ModuleMgr::Get()->GetFlateModule()->FlateOrLZWDecode(FALSE, comp_buf, size, FALSE,

+                        0, 0, 0, 0, 0, pBuffer, orig_size);

+                FX_Free(comp_buf);

+                size = orig_size;

+            }

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_FXMP::LoadFile(FX_LPVOID pPackage, FX_LPCSTR fileid)

+{

+    if (m_pHeader) {

+        FX_Free(m_pHeader);

+        m_pHeader = NULL;

+    }

+    m_pTable = NULL;

+    FX_DWORD size;

+    if (!FXFC_LoadFile(pPackage, fileid, (FX_LPBYTE&)m_pHeader, size)) {

+        return FALSE;

+    }

+    if (FXSYS_memcmp32(m_pHeader, "FXMP", 4)) {

+        return FALSE;

+    }

+    m_pTable = (FX_LPBYTE)m_pHeader + m_pHeader->dwDataOffset;

+    return TRUE;

+}

+FX_LPBYTE CPDF_FXMP::GetRecord(FX_DWORD index)

+{

+    if (m_pTable == NULL) {

+        return NULL;

+    }

+    if ((int)index < (int)m_pHeader->dwStartIndex || index > m_pHeader->dwEndIndex) {

+        return NULL;

+    }

+    return m_pTable + (index - m_pHeader->dwStartIndex) * m_pHeader->dwRecordSize;

+}

+#endif

diff --git a/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp b/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp
new file mode 100644
index 0000000..b7a7864
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp
@@ -0,0 +1,452 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fxge/fx_freetype.h"

+#include "ttgsubtable.h"

+CFX_GlyphMap::CFX_GlyphMap()

+{

+}

+CFX_GlyphMap::~CFX_GlyphMap()

+{

+}

+extern "C" {

+    static int _CompareInt(const void* p1, const void* p2)

+    {

+        return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);

+    }

+};

+struct _IntPair {

+    FX_INT32 key;

+    FX_INT32 value;

+};

+void CFX_GlyphMap::SetAt(int key, int value)

+{

+    FX_DWORD count = m_Buffer.GetSize() / sizeof(_IntPair);

+    _IntPair* buf = (_IntPair*)m_Buffer.GetBuffer();

+    _IntPair pair = {key, value};

+    if (count == 0 || key > buf[count - 1].key) {

+        m_Buffer.AppendBlock(&pair, sizeof(_IntPair));

+        return;

+    }

+    int low = 0, high = count - 1;

+    while (low <= high) {

+        int mid = (low + high) / 2;

+        if (buf[mid].key < key) {

+            low = mid + 1;

+        } else if (buf[mid].key > key) {

+            high = mid - 1;

+        } else {

+            buf[mid].value = value;

+            return;

+        }

+    }

+    m_Buffer.InsertBlock(low * sizeof(_IntPair), &pair, sizeof(_IntPair));

+}

+FX_BOOL CFX_GlyphMap::Lookup(int key, int &value)

+{

+    FX_LPVOID pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(), m_Buffer.GetSize() / sizeof(_IntPair),

+                                      sizeof(_IntPair), _CompareInt);

+    if (pResult == NULL) {

+        return FALSE;

+    }

+    value = ((FX_DWORD*)pResult)[1];

+    return TRUE;

+}

+bool CFX_CTTGSUBTable::LoadGSUBTable(FT_Bytes gsub)

+{

+    header.Version = gsub[0] << 24 | gsub[1] << 16 | gsub[2] << 8 | gsub[3];

+    if(header.Version != 0x00010000) {

+        return false;

+    }

+    header.ScriptList  = gsub[4] << 8 | gsub[5];

+    header.FeatureList = gsub[6] << 8 | gsub[7];

+    header.LookupList  = gsub[8] << 8 | gsub[9];

+    return Parse(

+               &gsub[header.ScriptList],

+               &gsub[header.FeatureList],

+               &gsub[header.LookupList]);

+}

+bool CFX_CTTGSUBTable::GetVerticalGlyph(TT_uint32_t glyphnum, TT_uint32_t *vglyphnum)

+{

+    TT_uint32_t tag[] = {

+        (TT_uint8_t)'v' << 24 |

+        (TT_uint8_t)'r' << 16 |

+        (TT_uint8_t)'t' <<  8 |

+        (TT_uint8_t)'2',

+        (TT_uint8_t)'v' << 24 |

+        (TT_uint8_t)'e' << 16 |

+        (TT_uint8_t)'r' <<  8 |

+        (TT_uint8_t)'t',

+    };

+    if (!m_bFeautureMapLoad) {

+        for (int i = 0; i < ScriptList.ScriptCount; i++) {

+            for (int j = 0; j <	(ScriptList.ScriptRecord + i)->Script.LangSysCount; ++j) {

+                for (int k = 0; k < ((ScriptList.ScriptRecord + i)->Script.LangSysRecord + j)->LangSys.FeatureCount; ++k) {

+                    FX_DWORD index = *(((ScriptList.ScriptRecord + i)->Script.LangSysRecord + j)->LangSys.FeatureIndex + k);

+                    if (FeatureList.FeatureRecord[index].FeatureTag == tag[0] || FeatureList.FeatureRecord[index].FeatureTag == tag[1]) {

+                        FX_DWORD value;

+                        if (!m_featureMap.Lookup(index, value)) {

+                            m_featureMap.SetAt(index, index);

+                        }

+                    }

+                }

+            }

+        }

+        if (!m_featureMap.GetStartPosition()) {

+            for (int i = 0; i < FeatureList.FeatureCount; i ++) {

+                if (FeatureList.FeatureRecord[i].FeatureTag == tag[0] || FeatureList.FeatureRecord[i].FeatureTag == tag[1]) {

+                    FX_DWORD value;

+                    if (!m_featureMap.Lookup(i, value)) {

+                        m_featureMap.SetAt(i, i);

+                    }

+                }

+            }

+        }

+        m_bFeautureMapLoad = TRUE;

+    }

+    FX_POSITION pos = m_featureMap.GetStartPosition();

+    while (pos) {

+        FX_DWORD index, value;

+        m_featureMap.GetNextAssoc(pos, index, value);

+        if(GetVerticalGlyphSub(glyphnum, vglyphnum,	&FeatureList.FeatureRecord[value].Feature)) {

+            return true;

+        }

+    }

+    return false;

+}

+bool CFX_CTTGSUBTable::GetVerticalGlyphSub(

+    TT_uint32_t glyphnum,

+    TT_uint32_t *vglyphnum,

+    struct TFeature *Feature)

+{

+    for(int i = 0; i < Feature->LookupCount; i++) {

+        int index = Feature->LookupListIndex[i];

+        if(index < 0 || LookupList.LookupCount < index) {

+            continue;

+        }

+        if(LookupList.Lookup[index].LookupType == 1) {

+            if(GetVerticalGlyphSub2(

+                        glyphnum,

+                        vglyphnum,

+                        &LookupList.Lookup[index])) {

+                return true;

+            }

+        }

+    }

+    return false;

+}

+bool CFX_CTTGSUBTable::GetVerticalGlyphSub2(

+    TT_uint32_t glyphnum,

+    TT_uint32_t *vglyphnum,

+    struct TLookup *Lookup)

+{

+    for(int i = 0; i < Lookup->SubTableCount; i++) {

+        switch(Lookup->SubTable[i]->SubstFormat) {

+            case 1: {

+                    TSingleSubstFormat1 *tbl1 = (TSingleSubstFormat1*)Lookup->SubTable[i];

+                    if(GetCoverageIndex(tbl1->Coverage, glyphnum) >= 0) {

+                        *vglyphnum = glyphnum + tbl1->DeltaGlyphID;

+                        return true;

+                    }

+                    break;

+                }

+            case 2: {

+                    TSingleSubstFormat2 *tbl2 = (TSingleSubstFormat2*)Lookup->SubTable[i];

+                    int index = -1;

+                    index = GetCoverageIndex(tbl2->Coverage, glyphnum);

+                    if(0 <= index && index < tbl2->GlyphCount) {

+                        *vglyphnum = tbl2->Substitute[index];

+                        return true;

+                    }

+                    break;

+                }

+        }

+    }

+    return false;

+}

+int CFX_CTTGSUBTable::GetCoverageIndex(struct TCoverageFormatBase *Coverage, TT_uint32_t g)

+{

+    int i = 0;

+    if(Coverage == NULL) {

+        return -1;

+    }

+    switch(Coverage->CoverageFormat) {

+        case 1: {

+                TCoverageFormat1 *c1 = (TCoverageFormat1*)Coverage;

+                for(i = 0; i < c1->GlyphCount; i++) {

+                    if((TT_uint32_t)c1->GlyphArray[i] == g) {

+                        return i;

+                    }

+                }

+                return -1;

+            }

+        case 2: {

+                TCoverageFormat2 *c2 = (TCoverageFormat2*)Coverage;

+                for(i = 0; i < c2->RangeCount; i++) {

+                    TT_uint32_t s = c2->RangeRecord[i].Start;

+                    TT_uint32_t e = c2->RangeRecord[i].End;

+                    TT_uint32_t si = c2->RangeRecord[i].StartCoverageIndex;

+                    if (s <= g && g <= e) {

+                        return si + g - s;

+                    }

+                }

+                return -1;

+            }

+    }

+    return -1;

+}

+bool CFX_CTTGSUBTable::Parse(

+    FT_Bytes scriptlist,

+    FT_Bytes featurelist,

+    FT_Bytes lookuplist)

+{

+    ParseScriptList(scriptlist, &ScriptList);

+    ParseFeatureList(featurelist, &FeatureList);

+    ParseLookupList(lookuplist, &LookupList);

+    return true;

+}

+void CFX_CTTGSUBTable::ParseScriptList(FT_Bytes raw, struct TScriptList *rec)

+{

+    int i;

+    FT_Bytes sp = raw;

+    rec->ScriptCount = GetUInt16(sp);

+    if(rec->ScriptCount <= 0) {

+        return;

+    }

+    rec->ScriptRecord = new struct TScriptRecord[rec->ScriptCount];

+    for(i = 0; i < rec->ScriptCount; i++) {

+        rec->ScriptRecord[i].ScriptTag = GetUInt32(sp);

+        TT_uint16_t offset = GetUInt16(sp);

+        ParseScript(

+            &raw[offset],

+            &rec->ScriptRecord[i].Script);

+    }

+}

+void CFX_CTTGSUBTable::ParseScript(FT_Bytes raw, struct TScript *rec)

+{

+    int i;

+    FT_Bytes sp = raw;

+    rec->DefaultLangSys = GetUInt16(sp);

+    rec->LangSysCount = GetUInt16(sp);

+    if(rec->LangSysCount <= 0) {

+        return;

+    }

+    rec->LangSysRecord = new struct TLangSysRecord[rec->LangSysCount];

+    for(i = 0; i < rec->LangSysCount; i++) {

+        rec->LangSysRecord[i].LangSysTag = GetUInt32(sp);

+        TT_uint16_t offset = GetUInt16(sp);

+        ParseLangSys(

+            &raw[offset],

+            &rec->LangSysRecord[i].LangSys);

+    }

+}

+void CFX_CTTGSUBTable::ParseLangSys(FT_Bytes raw, struct TLangSys *rec)

+{

+    FT_Bytes sp = raw;

+    rec->LookupOrder = GetUInt16(sp);

+    rec->ReqFeatureIndex = GetUInt16(sp);

+    rec->FeatureCount = GetUInt16(sp);

+    if(rec->FeatureCount <= 0) {

+        return;

+    }

+    rec->FeatureIndex = new TT_uint16_t[rec->FeatureCount];

+    FXSYS_memset32(rec->FeatureIndex, 0, sizeof(TT_uint16_t) * rec->FeatureCount);

+    for (int i = 0; i < rec->FeatureCount; ++i) {

+        rec->FeatureIndex[i] = GetUInt16(sp);

+    }

+}

+void CFX_CTTGSUBTable::ParseFeatureList(FT_Bytes raw, TFeatureList *rec)

+{

+    int i;

+    FT_Bytes sp = raw;

+    rec->FeatureCount = GetUInt16(sp);

+    if(rec->FeatureCount <= 0) {

+        return;

+    }

+    rec->FeatureRecord = new struct TFeatureRecord[rec->FeatureCount];

+    for(i = 0; i < rec->FeatureCount; i++) {

+        rec->FeatureRecord[i].FeatureTag = GetUInt32(sp);

+        TT_uint16_t offset = GetUInt16(sp);

+        ParseFeature(

+            &raw[offset],

+            &rec->FeatureRecord[i].Feature);

+    }

+}

+void CFX_CTTGSUBTable::ParseFeature(FT_Bytes raw, TFeature *rec)

+{

+    int i;

+    FT_Bytes sp = raw;

+    rec->FeatureParams = GetUInt16(sp);

+    rec->LookupCount = GetUInt16(sp);

+    if(rec->LookupCount <= 0) {

+        return;

+    }

+    rec->LookupListIndex = new TT_uint16_t[rec->LookupCount];

+    for(i = 0; i < rec->LookupCount; i++) {

+        rec->LookupListIndex[i] = GetUInt16(sp);

+    }

+}

+void CFX_CTTGSUBTable::ParseLookupList(FT_Bytes raw, TLookupList *rec)

+{

+    int i;

+    FT_Bytes sp = raw;

+    rec->LookupCount = GetUInt16(sp);

+    if(rec->LookupCount <= 0) {

+        return;

+    }

+    rec->Lookup = new struct TLookup[rec->LookupCount];

+    for(i = 0; i < rec->LookupCount; i++) {

+        TT_uint16_t offset = GetUInt16(sp);

+        ParseLookup(

+            &raw[offset],

+            &rec->Lookup[i]);

+    }

+}

+void CFX_CTTGSUBTable::ParseLookup(FT_Bytes raw, TLookup *rec)

+{

+    int i;

+    FT_Bytes sp = raw;

+    rec->LookupType = GetUInt16(sp);

+    rec->LookupFlag = GetUInt16(sp);

+    rec->SubTableCount = GetUInt16(sp);

+    if(rec->SubTableCount <= 0) {

+        return;

+    }

+    rec->SubTable = new struct TSubTableBase*[rec->SubTableCount];

+    for(i = 0; i < rec->SubTableCount; i++) {

+        rec->SubTable[i] = NULL;

+    }

+    if(rec->LookupType != 1) {

+        return;

+    }

+    for(i = 0; i < rec->SubTableCount; i++) {

+        TT_uint16_t offset = GetUInt16(sp);

+        ParseSingleSubst(

+            &raw[offset],

+            &rec->SubTable[i]);

+    }

+}

+void CFX_CTTGSUBTable::ParseCoverage(FT_Bytes raw, TCoverageFormatBase **rec)

+{

+    FT_Bytes sp = raw;

+    TT_uint16_t Format = GetUInt16(sp);

+    switch(Format) {

+        case 1:

+            *rec = new TCoverageFormat1();

+            ParseCoverageFormat1(raw, (TCoverageFormat1*)*rec);

+            break;

+        case 2:

+            *rec = new TCoverageFormat2();

+            ParseCoverageFormat2(raw, (TCoverageFormat2*)*rec);

+            break;

+    }

+}

+void CFX_CTTGSUBTable::ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1 *rec)

+{

+    int i;

+    FT_Bytes sp = raw;

+    GetUInt16(sp);

+    rec->GlyphCount = GetUInt16(sp);

+    if(rec->GlyphCount <= 0) {

+        return;

+    }

+    rec->GlyphArray = new TT_uint16_t[rec->GlyphCount];

+    for(i = 0; i < rec->GlyphCount; i++) {

+        rec->GlyphArray[i] = GetUInt16(sp);

+    }

+}

+void CFX_CTTGSUBTable::ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2 *rec)

+{

+    int i;

+    FT_Bytes sp = raw;

+    GetUInt16(sp);

+    rec->RangeCount = GetUInt16(sp);

+    if(rec->RangeCount <= 0) {

+        return;

+    }

+    rec->RangeRecord = new TRangeRecord[rec->RangeCount];

+    for(i = 0; i < rec->RangeCount; i++) {

+        rec->RangeRecord[i].Start = GetUInt16(sp);

+        rec->RangeRecord[i].End = GetUInt16(sp);

+        rec->RangeRecord[i].StartCoverageIndex = GetUInt16(sp);

+    }

+}

+void CFX_CTTGSUBTable::ParseSingleSubst(FT_Bytes raw, TSubTableBase **rec)

+{

+    FT_Bytes sp = raw;

+    TT_uint16_t Format = GetUInt16(sp);

+    switch(Format) {

+        case 1:

+            *rec = new TSingleSubstFormat1();

+            ParseSingleSubstFormat1(raw, (TSingleSubstFormat1*)*rec);

+            break;

+        case 2:

+            *rec = new TSingleSubstFormat2();

+            ParseSingleSubstFormat2(raw, (TSingleSubstFormat2*)*rec);

+            break;

+    }

+}

+void CFX_CTTGSUBTable::ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1 *rec)

+{

+    FT_Bytes sp = raw;

+    GetUInt16(sp);

+    TT_uint16_t offset = GetUInt16(sp);

+    ParseCoverage(

+        &raw[offset],

+        &rec->Coverage);

+    rec->DeltaGlyphID = GetInt16(sp);

+}

+void CFX_CTTGSUBTable::ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2 *rec)

+{

+    int i;

+    FT_Bytes sp = raw;

+    GetUInt16(sp);

+    TT_uint16_t offset = GetUInt16(sp);

+    ParseCoverage(

+        &raw[offset],

+        &rec->Coverage);

+    rec->GlyphCount = GetUInt16(sp);

+    if(rec->GlyphCount <= 0) {

+        return;

+    }

+    rec->Substitute = new TT_uint16_t[rec->GlyphCount];

+    for(i = 0; i < rec->GlyphCount; i++) {

+        rec->Substitute[i] = GetUInt16(sp);

+    }

+}

+FX_BOOL CFX_GSUBTable::GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum)

+{

+    return m_GsubImp.GetVerticalGlyph(glyphnum, vglyphnum);

+}

+IFX_GSUBTable* FXGE_CreateGSUBTable(CFX_Font* pFont)

+{

+    if (!pFont) {

+        return NULL;

+    }

+    if (NULL == pFont->m_pGsubData) {

+        unsigned long length = 0;

+        int error = FXFT_Load_Sfnt_Table(pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);

+        if (!error) {

+            pFont->m_pGsubData = (unsigned char*)FX_Alloc(FX_BYTE, length);

+        }

+        if (!pFont->m_pGsubData) {

+            return NULL;

+        }

+    }

+    int error = FXFT_Load_Sfnt_Table(pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, pFont->m_pGsubData, NULL);

+    if (!error && pFont->m_pGsubData) {

+        CFX_GSUBTable* pGsubTable = FX_NEW CFX_GSUBTable;

+        if (!pGsubTable) {

+            return NULL;

+        }

+        if (pGsubTable->m_GsubImp.LoadGSUBTable((FT_Bytes)pFont->m_pGsubData)) {

+            return pGsubTable;

+        }

+        delete pGsubTable;

+    }

+    return NULL;

+}

diff --git a/core/src/fpdfapi/fpdf_font/ttgsubtable.h b/core/src/fpdfapi/fpdf_font/ttgsubtable.h
new file mode 100644
index 0000000..a1f0e88
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/ttgsubtable.h
@@ -0,0 +1,419 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef TTGSUBTable_H

+#define TTGSUBTable_H

+#include "../../fx_freetype.h"

+#include "../../../include/fxcrt/fx_basic.h"

+#include "common.h"

+class CFX_GlyphMap

+{

+public:

+    CFX_GlyphMap();

+    ~CFX_GlyphMap();

+    void	SetAt(int key, int value);

+    FX_BOOL	Lookup(int key, int &value);

+protected:

+    CFX_BinaryBuf	m_Buffer;

+};

+class CFX_CTTGSUBTable : public CFX_Object

+{

+public:

+    CFX_CTTGSUBTable(void): loaded(false), m_bFeautureMapLoad(FALSE) {};

+    CFX_CTTGSUBTable(FT_Bytes gsub): loaded(false), m_bFeautureMapLoad(FALSE)

+    {

+        LoadGSUBTable(gsub);

+    }

+    virtual ~CFX_CTTGSUBTable() {}

+    bool IsOk(void) const

+    {

+        return loaded;

+    }

+    bool LoadGSUBTable(FT_Bytes gsub);

+    bool GetVerticalGlyph(TT_uint32_t glyphnum, TT_uint32_t *vglyphnum);

+private:

+    struct tt_gsub_header {

+        TT_uint32_t Version;

+        TT_uint16_t ScriptList;

+        TT_uint16_t FeatureList;

+        TT_uint16_t LookupList;

+    };

+    struct TLangSys {

+        TT_uint16_t LookupOrder;

+        TT_uint16_t ReqFeatureIndex;

+        TT_uint16_t FeatureCount;

+        TT_uint16_t *FeatureIndex;

+        TLangSys(): LookupOrder(0), ReqFeatureIndex(0), FeatureCount(0), FeatureIndex(NULL) {}

+        ~TLangSys()

+        {

+            if(FeatureIndex) {

+                delete[] FeatureIndex;

+            }

+        }

+    private:

+        TLangSys(const TLangSys&);

+        TLangSys& operator=(const TLangSys&);

+    };

+    struct TLangSysRecord {

+        TT_uint32_t LangSysTag;

+        struct TLangSys LangSys;

+        TLangSysRecord(): LangSysTag(0) {}

+    private:

+        TLangSysRecord(const TLangSysRecord&);

+        TLangSysRecord& operator=(const TLangSysRecord&);

+    };

+    struct TScript {

+        TT_uint16_t DefaultLangSys;

+        TT_uint16_t LangSysCount;

+        struct TLangSysRecord *LangSysRecord;

+        TScript(): DefaultLangSys(0), LangSysCount(0), LangSysRecord(NULL) {}

+        ~TScript()

+        {

+            if(LangSysRecord) {

+                delete[] LangSysRecord;

+            }

+        }

+    private:

+        TScript(const TScript&);

+        TScript& operator=(const TScript&);

+    };

+    struct TScriptRecord {

+        TT_uint32_t ScriptTag;

+        struct TScript Script;

+        TScriptRecord(): ScriptTag(0) {}

+    private:

+        TScriptRecord(const TScriptRecord&);

+        TScriptRecord& operator=(const TScriptRecord&);

+    };

+    struct TScriptList {

+        TT_uint16_t ScriptCount;

+        struct TScriptRecord *ScriptRecord;

+        TScriptList(): ScriptCount(0), ScriptRecord(NULL) {}

+        ~TScriptList()

+        {

+            if(ScriptRecord) {

+                delete[] ScriptRecord;

+            }

+        }

+    private:

+        TScriptList(const TScriptList&);

+        TScriptList& operator=(const TScriptList&);

+    };

+    struct TFeature {

+        TT_uint16_t FeatureParams;

+        int LookupCount;

+        TT_uint16_t *LookupListIndex;

+        TFeature(): FeatureParams(0), LookupCount(0), LookupListIndex(NULL) {}

+        ~TFeature()

+        {

+            if(LookupListIndex) {

+                delete[] LookupListIndex;

+            }

+        }

+    private:

+        TFeature(const TFeature&);

+        TFeature& operator=(const TFeature&);

+    };

+    struct TFeatureRecord {

+        TT_uint32_t FeatureTag;

+        struct TFeature Feature;

+        TFeatureRecord(): FeatureTag(0) {}

+    private:

+        TFeatureRecord(const TFeatureRecord&);

+        TFeatureRecord& operator=(const TFeatureRecord&);

+    };

+    struct TFeatureList {

+        int FeatureCount;

+        struct TFeatureRecord *FeatureRecord;

+        TFeatureList(): FeatureCount(0), FeatureRecord(NULL) {}

+        ~TFeatureList()

+        {

+            if(FeatureRecord) {

+                delete[] FeatureRecord;

+            }

+        }

+    private:

+        TFeatureList(const TFeatureList&);

+        TFeatureList& operator=(const TFeatureList&);

+    };

+    enum TLookupFlag {

+        LOOKUPFLAG_RightToLeft = 0x0001,

+        LOOKUPFLAG_IgnoreBaseGlyphs = 0x0002,

+        LOOKUPFLAG_IgnoreLigatures = 0x0004,

+        LOOKUPFLAG_IgnoreMarks = 0x0008,

+        LOOKUPFLAG_Reserved = 0x00F0,

+        LOOKUPFLAG_MarkAttachmentType = 0xFF00,

+    };

+    struct TCoverageFormatBase {

+        TT_uint16_t CoverageFormat;

+        CFX_GlyphMap m_glyphMap;

+        TCoverageFormatBase(): CoverageFormat(0) {}

+        virtual ~TCoverageFormatBase() {}

+    private:

+        TCoverageFormatBase(const TCoverageFormatBase&);

+        TCoverageFormatBase& operator=(const TCoverageFormatBase&);

+    };

+    struct TCoverageFormat1: public TCoverageFormatBase {

+        TT_uint16_t GlyphCount;

+        TT_uint16_t *GlyphArray;

+        TCoverageFormat1(): GlyphCount(0), GlyphArray(NULL)

+        {

+            CoverageFormat = 1;

+        }

+        ~TCoverageFormat1()

+        {

+            if(GlyphArray) {

+                delete[] GlyphArray;

+            }

+        }

+    private:

+        TCoverageFormat1(const TCoverageFormat1&);

+        TCoverageFormat1& operator=(const TCoverageFormat1&);

+    };

+    struct TRangeRecord {

+        TT_uint16_t Start;

+        TT_uint16_t End;

+        TT_uint16_t StartCoverageIndex;

+        TRangeRecord(): Start(0), End(0), StartCoverageIndex(0) {}

+        friend bool operator > (const TRangeRecord &r1, const TRangeRecord &r2)

+        {

+            return r1.Start > r2.Start;

+        }

+    private:

+        TRangeRecord(const TRangeRecord&);

+    };

+    struct TCoverageFormat2: public TCoverageFormatBase {

+        TT_uint16_t RangeCount;

+        struct TRangeRecord *RangeRecord;

+        TCoverageFormat2(): RangeCount(0), RangeRecord(NULL)

+        {

+            CoverageFormat = 2;

+        }

+        ~TCoverageFormat2()

+        {

+            if(RangeRecord) {

+                delete[] RangeRecord;

+            }

+        }

+    private:

+        TCoverageFormat2(const TCoverageFormat2&);

+        TCoverageFormat2& operator=(const TCoverageFormat2&);

+    };

+    struct TClassDefFormatBase {

+        TT_uint16_t ClassFormat;

+        TClassDefFormatBase(): ClassFormat(0) {}

+        virtual ~TClassDefFormatBase() {}

+    private:

+        TClassDefFormatBase(const TClassDefFormatBase&);

+        TClassDefFormatBase& operator=(const TClassDefFormatBase&);

+    };

+    struct TClassDefFormat1: public TClassDefFormatBase {

+        TT_uint16_t StartGlyph;

+        TT_uint16_t GlyphCount;

+        TT_uint16_t *ClassValueArray;

+        TClassDefFormat1(): StartGlyph(0), GlyphCount(0), ClassValueArray(NULL)

+        {

+            ClassFormat = 1;

+        }

+        ~TClassDefFormat1()

+        {

+            if(ClassValueArray) {

+                delete[] ClassValueArray;

+            }

+        }

+    private:

+        TClassDefFormat1(const TClassDefFormat1&);

+        TClassDefFormat1& operator=(const TClassDefFormat1&);

+    };

+    struct TClassRangeRecord {

+        TT_uint16_t Start;

+        TT_uint16_t End;

+        TT_uint16_t Class;

+        TClassRangeRecord(): Start(0), End(0), Class(0) {}

+    private:

+        TClassRangeRecord(const TClassRangeRecord&);

+        TClassRangeRecord& operator=(const TClassRangeRecord&);

+    };

+    struct TClassDefFormat2: public TClassDefFormatBase {

+        TT_uint16_t ClassRangeCount;

+        struct TClassRangeRecord *ClassRangeRecord;

+        TClassDefFormat2(): ClassRangeCount(0), ClassRangeRecord(NULL)

+        {

+            ClassFormat = 2;

+        }

+        ~TClassDefFormat2()

+        {

+            if(ClassRangeRecord) {

+                delete[] ClassRangeRecord;

+            }

+        }

+    private:

+        TClassDefFormat2(const TClassDefFormat2&);

+        TClassDefFormat2& operator=(const TClassDefFormat2&);

+    };

+    struct TDevice {

+        TT_uint16_t StartSize;

+        TT_uint16_t EndSize;

+        TT_uint16_t DeltaFormat;

+        TDevice(): StartSize(0), EndSize(0), DeltaFormat(0) {}

+    private:

+        TDevice(const TDevice&);

+        TDevice& operator=(const TDevice&);

+    };

+    struct TSubTableBase {

+        TT_uint16_t SubstFormat;

+        TSubTableBase(): SubstFormat(0) {}

+        virtual ~TSubTableBase() {}

+    private:

+        TSubTableBase(const TSubTableBase&);

+        TSubTableBase& operator=(const TSubTableBase&);

+    };

+    struct TSingleSubstFormat1: public TSubTableBase {

+        TCoverageFormatBase *Coverage;

+        TT_int16_t DeltaGlyphID;

+        TSingleSubstFormat1(): DeltaGlyphID(0), Coverage(NULL)

+        {

+            SubstFormat = 1;

+        }

+        ~TSingleSubstFormat1()

+        {

+            if(Coverage) {

+                delete Coverage;

+            }

+        }

+    private:

+        TSingleSubstFormat1(const TSingleSubstFormat1&);

+        TSingleSubstFormat1& operator=(const TSingleSubstFormat1&);

+    };

+    struct TSingleSubstFormat2: public TSubTableBase {

+        TCoverageFormatBase *Coverage;

+        TT_uint16_t GlyphCount;

+        TT_uint16_t *Substitute;

+        TSingleSubstFormat2(): Coverage(NULL), GlyphCount(0), Substitute(NULL)

+        {

+            SubstFormat = 2;

+        }

+        ~TSingleSubstFormat2()

+        {

+            if(Coverage) {

+                delete Coverage;

+            }

+            if(Substitute) {

+                delete[] Substitute;

+            }

+        }

+    private:

+        TSingleSubstFormat2(const TSingleSubstFormat2&);

+        TSingleSubstFormat2& operator=(const TSingleSubstFormat2&);

+    };

+    struct TLookup {

+        TT_uint16_t LookupType;

+        TT_uint16_t LookupFlag;

+        TT_uint16_t SubTableCount;

+        struct TSubTableBase **SubTable;

+        TLookup(): LookupType(0), LookupFlag(0), SubTableCount(0), SubTable(NULL) {}

+        ~TLookup()

+        {

+            if(SubTableCount > 0 && SubTable != NULL) {

+                for(int i = 0; i < SubTableCount; i++) {

+                    delete SubTable[i];

+                }

+                delete[] SubTable;

+            }

+        }

+    private:

+        TLookup(const TLookup&);

+        TLookup& operator=(const TLookup&);

+    };

+    struct TLookupList {

+        int LookupCount;

+        struct TLookup *Lookup;

+        TLookupList(): LookupCount(0), Lookup(NULL) {}

+        ~TLookupList()

+        {

+            if(Lookup) {

+                delete[] Lookup;

+            }

+        }

+    private:

+        TLookupList(const TLookupList&);

+        TLookupList& operator=(const TLookupList&);

+    };

+    bool Parse(

+        FT_Bytes scriptlist,

+        FT_Bytes featurelist,

+        FT_Bytes lookuplist);

+    void ParseScriptList(FT_Bytes raw, TScriptList *rec);

+    void ParseScript(FT_Bytes raw, TScript *rec);

+    void ParseLangSys(FT_Bytes raw, TLangSys *rec);

+    void ParseFeatureList(FT_Bytes raw, TFeatureList *rec);

+    void ParseFeature(FT_Bytes raw, TFeature *rec);

+    void ParseLookupList(FT_Bytes raw, TLookupList *rec);

+    void ParseLookup(FT_Bytes raw, TLookup *rec);

+    void ParseCoverage(FT_Bytes raw, TCoverageFormatBase **rec);

+    void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1 *rec);

+    void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2 *rec);

+    void ParseSingleSubst(FT_Bytes raw, TSubTableBase **rec);

+    void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1 *rec);

+    void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2 *rec);

+    bool GetVerticalGlyphSub(

+        TT_uint32_t glyphnum,

+        TT_uint32_t *vglyphnum,

+        struct TFeature *Feature);

+    bool GetVerticalGlyphSub2(

+        TT_uint32_t glyphnum,

+        TT_uint32_t *vglyphnum,

+        struct TLookup *Lookup);

+    int GetCoverageIndex(struct TCoverageFormatBase *Coverage, TT_uint32_t g);

+    TT_uint8_t GetUInt8(FT_Bytes& p) const

+    {

+        TT_uint8_t ret = p[0];

+        p += 1;

+        return ret;

+    }

+    TT_int16_t GetInt16(FT_Bytes& p) const

+    {

+        TT_uint16_t ret = p[0] << 8 | p[1];

+        p += 2;

+        return *(TT_int16_t*)&ret;

+    }

+    TT_uint16_t GetUInt16(FT_Bytes& p) const

+    {

+        TT_uint16_t ret = p[0] << 8 | p[1];

+        p += 2;

+        return ret;

+    }

+    TT_int32_t GetInt32(FT_Bytes& p) const

+    {

+        TT_uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];

+        p += 4;

+        return *(TT_int32_t*)&ret;

+    }

+    TT_uint32_t GetUInt32(FT_Bytes& p) const

+    {

+        TT_uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];

+        p += 4;

+        return ret;

+    }

+    CFX_CMapDWordToDWord m_featureMap;

+    FX_BOOL	m_bFeautureMapLoad;

+    bool loaded;

+    struct tt_gsub_header header;

+    struct TScriptList ScriptList;

+    struct TFeatureList FeatureList;

+    struct TLookupList LookupList;

+};

+class CFX_GSUBTable : public IFX_GSUBTable, public CFX_Object

+{

+public:

+    virtual void	Release()

+    {

+        delete this;

+    }

+    virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum);

+    CFX_CTTGSUBTable m_GsubImp;

+};

+#endif

diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page.cpp
new file mode 100644
index 0000000..232e561
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page.cpp
@@ -0,0 +1,1047 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "pageint.h"

+void CPDF_PageObject::Release()

+{

+    delete this;

+}

+CPDF_PageObject* CPDF_PageObject::Create(int type)

+{

+    switch (type) {

+        case PDFPAGE_TEXT:

+            return FX_NEW CPDF_TextObject;

+        case PDFPAGE_IMAGE:

+            return FX_NEW CPDF_ImageObject;

+        case PDFPAGE_PATH:

+            return FX_NEW CPDF_PathObject;

+        case PDFPAGE_SHADING:

+            return FX_NEW CPDF_ShadingObject;

+        case PDFPAGE_FORM:

+            return FX_NEW CPDF_FormObject;

+    }

+    return NULL;

+}

+CPDF_PageObject* CPDF_PageObject::Clone() const

+{

+    CPDF_PageObject* pObj = Create(m_Type);

+    pObj->Copy(this);

+    return pObj;

+}

+void CPDF_PageObject::Copy(const CPDF_PageObject* pSrc)

+{

+    if (m_Type != pSrc->m_Type) {

+        return;

+    }

+    CopyData(pSrc);

+    CopyStates(*pSrc);

+    m_Left = pSrc->m_Left;

+    m_Right = pSrc->m_Right;

+    m_Top = pSrc->m_Top;

+    m_Bottom = pSrc->m_Bottom;

+}

+void CPDF_PageObject::AppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerge)

+{

+    m_ClipPath.AppendPath(path, type, bAutoMerge);

+}

+void CPDF_PageObject::CopyClipPath(CPDF_PageObject* pObj)

+{

+    m_ClipPath = pObj->m_ClipPath;

+}

+void CPDF_PageObject::RemoveClipPath()

+{

+    m_ClipPath.SetNull();

+}

+void CPDF_PageObject::RecalcBBox()

+{

+    switch (m_Type) {

+        case PDFPAGE_TEXT:

+            ((CPDF_TextObject*)this)->RecalcPositionData();

+            break;

+        case PDFPAGE_PATH:

+            ((CPDF_PathObject*)this)->CalcBoundingBox();

+            break;

+        case PDFPAGE_SHADING:

+            ((CPDF_ShadingObject*)this)->CalcBoundingBox();

+            break;

+    }

+}

+void CPDF_PageObject::TransformClipPath(CFX_AffineMatrix& matrix)

+{

+    if (m_ClipPath.IsNull()) {

+        return;

+    }

+    m_ClipPath.GetModify();

+    m_ClipPath.Transform(matrix);

+}

+void CPDF_PageObject::TransformGeneralState(CFX_AffineMatrix& matrix)

+{

+    if(m_GeneralState.IsNull()) {

+        return;

+    }

+    CPDF_GeneralStateData* pGS = m_GeneralState.GetModify();

+    pGS->m_Matrix.Concat(matrix);

+}

+FX_RECT CPDF_PageObject::GetBBox(const CFX_AffineMatrix* pMatrix) const

+{

+    CFX_FloatRect rect(m_Left, m_Bottom, m_Right, m_Top);

+    if (pMatrix) {

+        pMatrix->TransformRect(rect);

+    }

+    return rect.GetOutterRect();

+}

+CPDF_TextObject::CPDF_TextObject()

+{

+    m_Type = PDFPAGE_TEXT;

+    m_pCharCodes = NULL;

+    m_pCharPos = NULL;

+    m_nChars = 0;

+    m_PosX = m_PosY = 0;

+}

+CPDF_TextObject::~CPDF_TextObject()

+{

+    if (m_nChars > 1 && m_pCharCodes) {

+        FX_Free(m_pCharCodes);

+    }

+    if (m_pCharPos) {

+        FX_Free(m_pCharPos);

+    }

+}

+void CPDF_TextObject::GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const

+{

+    pInfo->m_CharCode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[index];

+    pInfo->m_OriginX = index ? m_pCharPos[index - 1] : 0;

+    pInfo->m_OriginY = 0;

+    if (pInfo->m_CharCode == -1) {

+        return;

+    }

+    CPDF_Font* pFont = m_TextState.GetFont();

+    if (pFont->GetFontType() != PDFFONT_CIDFONT) {

+        return;

+    }

+    if (!((CPDF_CIDFont*)pFont)->IsVertWriting()) {

+        return;

+    }

+    FX_WORD CID = ((CPDF_CIDFont*)pFont)->CIDFromCharCode(pInfo->m_CharCode);

+    pInfo->m_OriginY = pInfo->m_OriginX;

+    pInfo->m_OriginX = 0;

+    short vx, vy;

+    ((CPDF_CIDFont*)pFont)->GetVertOrigin(CID, vx, vy);

+    FX_FLOAT fontsize = m_TextState.GetFontSize();

+    pInfo->m_OriginX -= fontsize * vx / 1000;

+    pInfo->m_OriginY -= fontsize * vy / 1000;

+}

+int CPDF_TextObject::CountChars() const

+{

+    if (m_nChars == 1) {

+        return 1;

+    }

+    int count = 0;

+    for (int i = 0; i < m_nChars; i ++)

+        if (m_pCharCodes[i] != (FX_DWORD) - 1) {

+            count ++;

+        }

+    return count;

+}

+void CPDF_TextObject::GetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const

+{

+    if (m_nChars == 1) {

+        charcode = (FX_DWORD)(FX_UINTPTR)m_pCharCodes;

+        kerning = 0;

+        return;

+    }

+    int count = 0;

+    for (int i = 0; i < m_nChars; i ++) {

+        if (m_pCharCodes[i] != (FX_DWORD) - 1) {

+            if (count == index) {

+                charcode = m_pCharCodes[i];

+                if (i == m_nChars - 1 || m_pCharCodes[i + 1] != (FX_DWORD) - 1) {

+                    kerning = 0;

+                } else {

+                    kerning = m_pCharPos[i];

+                }

+                return;

+            }

+            count ++;

+        }

+    }

+}

+void CPDF_TextObject::GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const

+{

+    if (m_nChars == 1) {

+        GetItemInfo(0, pInfo);

+        return;

+    }

+    int count = 0;

+    for (int i = 0; i < m_nChars; i ++) {

+        FX_DWORD charcode = m_pCharCodes[i];

+        if (charcode == (FX_DWORD) - 1) {

+            continue;

+        }

+        if (count == index) {

+            GetItemInfo(i, pInfo);

+            break;

+        }

+        count ++;

+    }

+}

+void CPDF_TextObject::CopyData(const CPDF_PageObject* pSrc)

+{

+    const CPDF_TextObject* pSrcObj = (const CPDF_TextObject*)pSrc;

+    if (m_nChars > 1 && m_pCharCodes) {

+        FX_Free(m_pCharCodes);

+        m_pCharCodes = NULL;

+    }

+    if (m_pCharPos) {

+        FX_Free(m_pCharPos);

+        m_pCharPos = NULL;

+    }

+    m_nChars = pSrcObj->m_nChars;

+    if (m_nChars > 1) {

+        m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);

+        m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);

+        int i;

+        for (i = 0; i < m_nChars; i ++) {

+            m_pCharCodes[i] = pSrcObj->m_pCharCodes[i];

+        }

+        for (i = 0; i < m_nChars - 1; i ++) {

+            m_pCharPos[i] = pSrcObj->m_pCharPos[i];

+        }

+    } else {

+        m_pCharCodes = pSrcObj->m_pCharCodes;

+    }

+    m_PosX = pSrcObj->m_PosX;

+    m_PosY = pSrcObj->m_PosY;

+}

+void CPDF_TextObject::GetTextMatrix(CFX_AffineMatrix* pMatrix) const

+{

+    FX_FLOAT* pTextMatrix = m_TextState.GetMatrix();

+    pMatrix->Set(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], pTextMatrix[3], m_PosX, m_PosY);

+}

+void CPDF_TextObject::SetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nsegs)

+{

+    if (m_nChars > 1 && m_pCharCodes) {

+        FX_Free(m_pCharCodes);

+        m_pCharCodes = NULL;

+    }

+    if (m_pCharPos) {

+        FX_Free(m_pCharPos);

+        m_pCharPos = NULL;

+    }

+    CPDF_Font* pFont = m_TextState.GetFont();

+    m_nChars = 0;

+    for (int i = 0; i < nsegs; i ++) {

+        m_nChars += pFont->CountChar(pStrs[i], pStrs[i].GetLength());

+    }

+    m_nChars += nsegs - 1;

+    if (m_nChars > 1) {

+        m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);

+        m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);

+        int index = 0;

+        for (int i = 0; i < nsegs; i ++) {

+            FX_LPCSTR segment = pStrs[i];

+            int offset = 0, len = pStrs[i].GetLength();

+            while (offset < len) {

+                m_pCharCodes[index++] = pFont->GetNextChar(segment, offset);

+            }

+            if (i != nsegs - 1) {

+                m_pCharPos[index - 1] = pKerning[i];

+                m_pCharCodes[index ++] = (FX_DWORD) - 1;

+            }

+        }

+    } else {

+        int offset = 0;

+        m_pCharCodes = (FX_DWORD*)(FX_UINTPTR)pFont->GetNextChar(pStrs[0], offset);

+    }

+}

+void CPDF_TextObject::SetText(const CFX_ByteString& str)

+{

+    SetSegments(&str, NULL, 1);

+    RecalcPositionData();

+}

+void CPDF_TextObject::SetEmpty()

+{

+    if (m_nChars > 1 && m_pCharCodes) {

+        FX_Free(m_pCharCodes);

+    }

+    if (m_nChars > 1 && m_pCharPos) {

+        FX_Free(m_pCharPos);

+    }

+    m_nChars = 0;

+    m_pCharCodes = NULL;

+    m_pCharPos = NULL;

+    m_Left = m_Right = m_PosX;

+    m_Top = m_Bottom = m_PosY;

+}

+void CPDF_TextObject::SetText(CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs)

+{

+    SetSegments(pStrs, pKerning, nSegs);

+    RecalcPositionData();

+}

+void CPDF_TextObject::SetText(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pKernings)

+{

+    if (m_nChars > 1 && m_pCharCodes) {

+        FX_Free(m_pCharCodes);

+        m_pCharCodes = NULL;

+    }

+    if (m_pCharPos) {

+        FX_Free(m_pCharPos);

+        m_pCharPos = NULL;

+    }

+    int nKernings = 0;

+    int i;

+    for (i = 0; i < nChars - 1; i ++)

+        if (pKernings[i] != 0) {

+            nKernings ++;

+        }

+    m_nChars = nChars + nKernings;

+    if (m_nChars > 1) {

+        m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);

+        m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);

+        int index = 0;

+        for (int i = 0; i < nChars; i ++) {

+            m_pCharCodes[index++] = pCharCodes[i];

+            if (pKernings[i] != 0 && i != nChars - 1) {

+                m_pCharCodes[index] = (FX_DWORD) - 1;

+                m_pCharPos[index - 1] = pKernings[i];

+                index ++;

+            }

+        }

+    } else {

+        int offset = 0;

+        m_pCharCodes = (FX_DWORD*)(FX_UINTPTR)pCharCodes[0];

+    }

+    RecalcPositionData();

+}

+FX_FLOAT CPDF_TextObject::GetCharWidth(FX_DWORD charcode) const

+{

+    FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000;

+    CPDF_Font* pFont = m_TextState.GetFont();

+    FX_BOOL bVertWriting = FALSE;

+    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();

+    if (pCIDFont) {

+        bVertWriting = pCIDFont->IsVertWriting();

+    }

+    if (!bVertWriting) {

+        return pFont->GetCharWidthF(charcode, 0) * fontsize;

+    } else {

+        FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);

+        return pCIDFont->GetVertWidth(CID) * fontsize;

+    }

+}

+FX_FLOAT CPDF_TextObject::GetSpaceCharWidth() const

+{

+    CPDF_Font* pFont = m_TextState.GetFont();

+    FX_DWORD charCode = m_TextState.GetFont()->CharCodeFromUnicode(32);

+    if (charCode != (FX_DWORD) - 1) {

+        return GetCharWidth(charCode);

+    }

+    FX_FLOAT fontSize = m_TextState.GetFontSize() / 4000.0f;

+    FX_BOOL bVertWriting = FALSE;

+    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();

+    if (pCIDFont) {

+        bVertWriting = pCIDFont->IsVertWriting();

+    }

+    FX_RECT fontRect;

+    pFont->GetFontBBox(fontRect);

+    fontSize *= bVertWriting ? (FX_FLOAT)fontRect.Height() : (FX_FLOAT)fontRect.Width();

+    return fontSize;

+}

+void CPDF_TextObject::GetCharRect(int index, CFX_FloatRect& rect) const

+{

+    FX_FLOAT curpos = 0;

+    CPDF_Font* pFont = m_TextState.GetFont();

+    FX_BOOL bVertWriting = FALSE;

+    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();

+    if (pCIDFont) {

+        bVertWriting = pCIDFont->IsVertWriting();

+    }

+    FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000;

+    int count = 0;

+    for (int i = 0; i < m_nChars; i ++) {

+        FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];

+        if (charcode == (FX_DWORD) - 1) {

+            continue;

+        }

+        if( count != index) {

+            count++;

+            continue;

+        }

+        FX_FLOAT curpos = i > 0 ? m_pCharPos[i - 1] : 0;

+        FX_RECT char_rect;

+        pFont->GetCharBBox(charcode, char_rect, 0);

+        if (!bVertWriting) {

+            rect.left = curpos + char_rect.left * fontsize;

+            rect.right = curpos + char_rect.right * fontsize;

+            rect.top = char_rect.top * fontsize;

+            rect.bottom = char_rect.bottom * fontsize;

+        } else {

+            FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);

+            short vx, vy;

+            pCIDFont->GetVertOrigin(CID, vx, vy);

+            char_rect.left -= vx;

+            char_rect.right -= vx;

+            char_rect.top -= vy;

+            char_rect.bottom -= vy;

+            rect.left = char_rect.left * fontsize;

+            rect.right = char_rect.right * fontsize;

+            rect.top = curpos + char_rect.top * fontsize;

+            rect.bottom = curpos + char_rect.bottom * fontsize;

+        }

+        return;

+    }

+}

+void CPDF_TextObject::CalcPositionData(FX_FLOAT* pTextAdvanceX, FX_FLOAT* pTextAdvanceY, FX_FLOAT horz_scale, int level)

+{

+    FX_FLOAT curpos = 0;

+    FX_FLOAT min_x = 10000 * 1.0f, max_x = -10000 * 1.0f, min_y = 10000 * 1.0f, max_y = -10000 * 1.0f;

+    CPDF_Font* pFont = m_TextState.GetFont();

+    FX_BOOL bVertWriting = FALSE;

+    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();

+    if (pCIDFont) {

+        bVertWriting = pCIDFont->IsVertWriting();

+    }

+    FX_FLOAT fontsize = m_TextState.GetFontSize();

+    for (int i = 0; i < m_nChars; i ++) {

+        FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];

+        if (charcode == (FX_DWORD) - 1) {

+            curpos -= FXSYS_Mul(m_pCharPos[i - 1], fontsize) / 1000;

+            continue;

+        }

+        if (i) {

+            m_pCharPos[i - 1] = curpos;

+        }

+        FX_RECT char_rect;

+        pFont->GetCharBBox(charcode, char_rect, level);

+        FX_FLOAT charwidth;

+        if (!bVertWriting) {

+            if (min_y > char_rect.top) {

+                min_y = (FX_FLOAT)char_rect.top;

+            }

+            if (max_y < char_rect.top) {

+                max_y = (FX_FLOAT)char_rect.top;

+            }

+            if (min_y > char_rect.bottom) {

+                min_y = (FX_FLOAT)char_rect.bottom;

+            }

+            if (max_y < char_rect.bottom) {

+                max_y = (FX_FLOAT)char_rect.bottom;

+            }

+            FX_FLOAT char_left = curpos + char_rect.left * fontsize / 1000;

+            FX_FLOAT char_right = curpos + char_rect.right * fontsize / 1000;

+            if (min_x > char_left) {

+                min_x = char_left;

+            }

+            if (max_x < char_left) {

+                max_x = char_left;

+            }

+            if (min_x > char_right) {

+                min_x = char_right;

+            }

+            if (max_x < char_right) {

+                max_x = char_right;

+            }

+            charwidth = pFont->GetCharWidthF(charcode, level) * fontsize / 1000;

+        } else {

+            FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);

+            short vx, vy;

+            pCIDFont->GetVertOrigin(CID, vx, vy);

+            char_rect.left -= vx;

+            char_rect.right -= vx;

+            char_rect.top -= vy;

+            char_rect.bottom -= vy;

+            if (min_x > char_rect.left) {

+                min_x = (FX_FLOAT)char_rect.left;

+            }

+            if (max_x < char_rect.left) {

+                max_x = (FX_FLOAT)char_rect.left;

+            }

+            if (min_x > char_rect.right) {

+                min_x = (FX_FLOAT)char_rect.right;

+            }

+            if (max_x < char_rect.right) {

+                max_x = (FX_FLOAT)char_rect.right;

+            }

+            FX_FLOAT char_top = curpos + char_rect.top * fontsize / 1000;

+            FX_FLOAT char_bottom = curpos + char_rect.bottom * fontsize / 1000;

+            if (min_y > char_top) {

+                min_y = char_top;

+            }

+            if (max_y < char_top) {

+                max_y = char_top;

+            }

+            if (min_y > char_bottom) {

+                min_y = char_bottom;

+            }

+            if (max_y < char_bottom) {

+                max_y = char_bottom;

+            }

+            charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000;

+        }

+        curpos += charwidth;

+        if (charcode == ' ' && (pCIDFont == NULL || pCIDFont->GetCharSize(32) == 1)) {

+            curpos += m_TextState.GetObject()->m_WordSpace;

+        }

+        curpos += m_TextState.GetObject()->m_CharSpace;

+    }

+    if (bVertWriting) {

+        if (pTextAdvanceX) {

+            *pTextAdvanceX = 0;

+        }

+        if (pTextAdvanceY) {

+            *pTextAdvanceY = curpos;

+        }

+        min_x = min_x * fontsize / 1000;

+        max_x = max_x * fontsize / 1000;

+    } else {

+        if (pTextAdvanceX) {

+            *pTextAdvanceX = FXSYS_Mul(curpos, horz_scale);

+        }

+        if (pTextAdvanceY) {

+            *pTextAdvanceY = 0;

+        }

+        min_y = min_y * fontsize / 1000;

+        max_y = max_y * fontsize / 1000;

+    }

+    CFX_AffineMatrix matrix;

+    GetTextMatrix(&matrix);

+    m_Left = min_x;

+    m_Right = max_x;

+    m_Bottom = min_y;

+    m_Top = max_y;

+    matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);

+    int textmode = m_TextState.GetObject()->m_TextMode;

+    if (textmode == 1 || textmode == 2 || textmode == 5 || textmode == 6) {

+        FX_FLOAT half_width = m_GraphState.GetObject()->m_LineWidth / 2;

+        m_Left -= half_width;

+        m_Right += half_width;

+        m_Top += half_width;

+        m_Bottom -= half_width;

+    }

+}

+void CPDF_TextObject::CalcCharPos(FX_FLOAT* pPosArray) const

+{

+    FX_FLOAT curpos = 0;

+    int count = 0;

+    CPDF_Font* pFont = m_TextState.GetFont();

+    FX_BOOL bVertWriting = FALSE;

+    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();

+    if (pCIDFont) {

+        bVertWriting = pCIDFont->IsVertWriting();

+    }

+    FX_FLOAT fontsize = m_TextState.GetFontSize();

+    int index = 0;

+    for (int i = 0; i < m_nChars; i ++) {

+        FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];

+        if (charcode == (FX_DWORD) - 1) {

+            continue;

+        }

+        pPosArray[index++] = i ? m_pCharPos[i - 1] : 0;

+        FX_FLOAT charwidth;

+        if (bVertWriting) {

+            FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);

+            charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000;

+        } else {

+            charwidth = pFont->GetCharWidthF(charcode) * fontsize / 1000;

+        }

+        pPosArray[index] = pPosArray[index - 1] + charwidth;

+        index++;

+    }

+}

+void CPDF_TextObject::Transform(const CFX_AffineMatrix& matrix)

+{

+    m_TextState.GetModify();

+    CFX_AffineMatrix text_matrix;

+    GetTextMatrix(&text_matrix);

+    text_matrix.Concat(matrix);

+    FX_FLOAT* pTextMatrix = m_TextState.GetMatrix();

+    pTextMatrix[0] = text_matrix.GetA();

+    pTextMatrix[1] = text_matrix.GetC();

+    pTextMatrix[2] = text_matrix.GetB();

+    pTextMatrix[3] = text_matrix.GetD();

+    m_PosX = text_matrix.GetE();

+    m_PosY = text_matrix.GetF();

+    CalcPositionData(NULL, NULL, 0);

+}

+void CPDF_TextObject::SetPosition(FX_FLOAT x, FX_FLOAT y)

+{

+    FX_FLOAT dx = x - m_PosX;

+    FX_FLOAT dy = y - m_PosY;

+    m_PosX = x;

+    m_PosY = y;

+    m_Left += dx;

+    m_Right += dx;

+    m_Top += dy;

+    m_Bottom += dy;

+}

+void CPDF_TextObject::SetData(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, FX_FLOAT x, FX_FLOAT y)

+{

+    ASSERT(m_nChars == 0);

+    m_nChars = nChars;

+    m_PosX = x;

+    m_PosY = y;

+    if (nChars == 0) {

+        return;

+    }

+    if (nChars == 1) {

+        m_pCharCodes = (FX_DWORD*)(FX_UINTPTR) * pCharCodes;

+    } else {

+        m_pCharCodes = FX_Alloc(FX_DWORD, nChars);

+        FXSYS_memcpy32(m_pCharCodes, pCharCodes, sizeof(FX_DWORD)*nChars);

+        m_pCharPos = FX_Alloc(FX_FLOAT, nChars - 1);

+        FXSYS_memcpy32(m_pCharPos, pCharPos, sizeof(FX_FLOAT) * (nChars - 1));

+    }

+    RecalcPositionData();

+}

+void CPDF_TextObject::SetTextState(CPDF_TextState TextState)

+{

+    m_TextState = TextState;

+    CalcPositionData(NULL, NULL, 0);

+}

+CPDF_ShadingObject::CPDF_ShadingObject()

+{

+    m_pShading = NULL;

+    m_Type = PDFPAGE_SHADING;

+}

+CPDF_ShadingObject::~CPDF_ShadingObject()

+{

+    CPDF_ShadingPattern* pShading = m_pShading;

+    if (pShading && pShading->m_pDocument) {

+        pShading->m_pDocument->GetPageData()->ReleasePattern(pShading->m_pShadingObj);

+    }

+}

+void CPDF_ShadingObject::CopyData(const CPDF_PageObject* pSrc)

+{

+    CPDF_ShadingObject* pSrcObj = (CPDF_ShadingObject*)pSrc;

+    m_pShading = pSrcObj->m_pShading;

+    if (m_pShading && m_pShading->m_pDocument) {

+        CPDF_DocPageData* pDocPageData = m_pShading->m_pDocument->GetPageData();

+        m_pShading = (CPDF_ShadingPattern*)pDocPageData->GetPattern(m_pShading->m_pShadingObj, m_pShading->m_bShadingObj, &m_pShading->m_ParentMatrix);

+    }

+    m_Matrix = pSrcObj->m_Matrix;

+}

+void CPDF_ShadingObject::Transform(const CFX_AffineMatrix& matrix)

+{

+    if (!m_ClipPath.IsNull()) {

+        m_ClipPath.GetModify();

+        m_ClipPath.Transform(matrix);

+    }

+    m_Matrix.Concat(matrix);

+    if (!m_ClipPath.IsNull()) {

+        CalcBoundingBox();

+    } else {

+        matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);

+    }

+}

+void CPDF_ShadingObject::CalcBoundingBox()

+{

+    if (m_ClipPath.IsNull()) {

+        return;

+    }

+    CFX_FloatRect rect = m_ClipPath.GetClipBox();

+    m_Left = rect.left;

+    m_Bottom = rect.bottom;

+    m_Right = rect.right;

+    m_Top = rect.top;

+}

+CPDF_FormObject::~CPDF_FormObject()

+{

+    if (m_pForm) {

+        delete m_pForm;

+    }

+}

+void CPDF_FormObject::Transform(const CFX_AffineMatrix& matrix)

+{

+    m_FormMatrix.Concat(matrix);

+    CalcBoundingBox();

+}

+void CPDF_FormObject::CopyData(const CPDF_PageObject* pSrc)

+{

+    const CPDF_FormObject* pSrcObj = (const CPDF_FormObject*)pSrc;

+    if (m_pForm) {

+        delete m_pForm;

+    }

+    m_pForm = pSrcObj->m_pForm->Clone();

+    m_FormMatrix = pSrcObj->m_FormMatrix;

+}

+void CPDF_FormObject::CalcBoundingBox()

+{

+    CFX_FloatRect form_rect = m_pForm->CalcBoundingBox();

+    form_rect.Transform(&m_FormMatrix);

+    m_Left = form_rect.left;

+    m_Bottom = form_rect.bottom;

+    m_Right = form_rect.right;

+    m_Top = form_rect.top;

+}

+CPDF_PageObjects::CPDF_PageObjects(FX_BOOL bReleaseMembers) : m_ObjectList(128)

+{

+    m_bBackgroundAlphaNeeded = FALSE;

+    m_bReleaseMembers = bReleaseMembers;

+    m_ParseState = PDF_CONTENT_NOT_PARSED;

+    m_pParser = NULL;

+    m_pFormStream = NULL;

+    m_pResources = NULL;

+}

+CPDF_PageObjects::~CPDF_PageObjects()

+{

+    if (m_pParser) {

+        delete m_pParser;

+    }

+    if (!m_bReleaseMembers) {

+        return;

+    }

+    FX_POSITION pos = m_ObjectList.GetHeadPosition();

+    while (pos) {

+        CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);

+        if (!pPageObj) {

+            continue;

+        }

+        pPageObj->Release();

+    }

+}

+void CPDF_PageObjects::ContinueParse(IFX_Pause* pPause)

+{

+    if (m_pParser == NULL) {

+        return;

+    }

+    m_pParser->Continue(pPause);

+    if (m_pParser->GetStatus() == CPDF_ContentParser::Done) {

+        m_ParseState = PDF_CONTENT_PARSED;

+        delete m_pParser;

+        m_pParser = NULL;

+    }

+}

+int CPDF_PageObjects::EstimateParseProgress() const

+{

+    if (m_pParser == NULL) {

+        return m_ParseState == PDF_CONTENT_PARSED ? 100 : 0;

+    }

+    return m_pParser->EstimateProgress();

+}

+FX_POSITION CPDF_PageObjects::InsertObject(FX_POSITION posInsertAfter, CPDF_PageObject* pNewObject)

+{

+    if (posInsertAfter == NULL) {

+        return m_ObjectList.AddHead(pNewObject);

+    } else {

+        return m_ObjectList.InsertAfter(posInsertAfter, pNewObject);

+    }

+}

+int CPDF_PageObjects::GetObjectIndex(CPDF_PageObject* pObj) const

+{

+    int index = 0;

+    FX_POSITION pos = m_ObjectList.GetHeadPosition();

+    while (pos) {

+        CPDF_PageObject* pThisObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);

+        if (pThisObj == pObj) {

+            return index;

+        }

+        index ++;

+    }

+    return -1;

+}

+CPDF_PageObject* CPDF_PageObjects::GetObjectByIndex(int index) const

+{

+    FX_POSITION pos = m_ObjectList.FindIndex(index);

+    if (pos == NULL) {

+        return NULL;

+    }

+    return (CPDF_PageObject*)m_ObjectList.GetAt(pos);

+}

+void CPDF_PageObjects::Transform(const CFX_AffineMatrix& matrix)

+{

+    FX_POSITION pos = m_ObjectList.GetHeadPosition();

+    while (pos) {

+        CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);

+        pObj->Transform(matrix);

+    }

+}

+CFX_FloatRect CPDF_PageObjects::CalcBoundingBox() const

+{

+    if (m_ObjectList.GetCount() == 0) {

+        return CFX_FloatRect(0, 0, 0, 0);

+    }

+    FX_FLOAT left, right, top, bottom;

+    left = bottom = 1000000 * 1.0f;

+    right = top = -1000000 * 1.0f;

+    FX_POSITION pos = m_ObjectList.GetHeadPosition();

+    while (pos) {

+        CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);

+        if (left > pObj->m_Left) {

+            left = pObj->m_Left;

+        }

+        if (right < pObj->m_Right) {

+            right = pObj->m_Right;

+        }

+        if (top < pObj->m_Top) {

+            top = pObj->m_Top;

+        }

+        if (bottom > pObj->m_Bottom) {

+            bottom = pObj->m_Bottom;

+        }

+    }

+    return CFX_FloatRect(left, bottom, right, top);

+}

+void CPDF_PageObjects::LoadTransInfo()

+{

+    if (m_pFormDict == NULL) {

+        return;

+    }

+    CPDF_Dictionary* pGroup = m_pFormDict->GetDict(FX_BSTRC("Group"));

+    if (pGroup == NULL) {

+        return;

+    }

+    if (pGroup->GetString(FX_BSTRC("S")) != FX_BSTRC("Transparency")) {

+        return;

+    }

+    m_Transparency |= PDFTRANS_GROUP;

+    if (pGroup->GetInteger(FX_BSTRC("I"))) {

+        m_Transparency |= PDFTRANS_ISOLATED;

+    }

+    if (pGroup->GetInteger(FX_BSTRC("K"))) {

+        m_Transparency |= PDFTRANS_KNOCKOUT;

+    }

+}

+void CPDF_PageObjects::ClearCacheObjects()

+{

+    m_ParseState = PDF_CONTENT_NOT_PARSED;

+    if (m_pParser) {

+        delete m_pParser;

+    }

+    m_pParser = NULL;

+    if (m_bReleaseMembers) {

+        FX_POSITION pos = m_ObjectList.GetHeadPosition();

+        while (pos) {

+            CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);

+            if (!pPageObj) {

+                continue;

+            }

+            pPageObj->Release();

+        }

+    }

+    m_ObjectList.RemoveAll();

+}

+CPDF_Page::CPDF_Page()

+{

+    m_pPageRender = NULL;

+}

+void CPDF_Page::Load(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, FX_BOOL bPageCache)

+{

+    m_pDocument = (CPDF_Document*)pDocument;

+    m_pFormDict = pPageDict;

+    if (bPageCache) {

+        m_pPageRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreatePageCache(this);

+    }

+    if (pPageDict == NULL) {

+        m_PageWidth = m_PageHeight = 100 * 1.0f;

+        m_pPageResources = m_pResources = NULL;

+        return;

+    }

+    m_pResources = GetPageAttr(FX_BSTRC("Resources"))->GetDict();

+    m_pPageResources = m_pResources;

+    CPDF_Object* pRotate = GetPageAttr(FX_BSTRC("Rotate"));

+    int rotate = 0;

+    if (pRotate) {

+        rotate = pRotate->GetInteger() / 90 % 4;

+    }

+    if (rotate < 0) {

+        rotate += 4;

+    }

+    CPDF_Array* pMediaBox, *pCropBox;

+    pMediaBox = (CPDF_Array*)GetPageAttr(FX_BSTRC("MediaBox"));

+    CFX_FloatRect mediabox;

+    if (pMediaBox) {

+        mediabox = pMediaBox->GetRect();

+        mediabox.Normalize();

+    }

+    if (mediabox.IsEmpty()) {

+        mediabox = CFX_FloatRect(0, 0, 612, 792);

+    }

+    pCropBox = (CPDF_Array*)GetPageAttr(FX_BSTRC("CropBox"));

+    if (pCropBox) {

+        m_BBox = pCropBox->GetRect();

+        m_BBox.Normalize();

+    }

+    if (m_BBox.IsEmpty()) {

+        m_BBox = mediabox;

+    } else {

+        m_BBox.Intersect(mediabox);

+    }

+    if (rotate % 2) {

+        m_PageHeight = m_BBox.right - m_BBox.left;

+        m_PageWidth = m_BBox.top - m_BBox.bottom;

+    } else {

+        m_PageWidth = m_BBox.right - m_BBox.left;

+        m_PageHeight = m_BBox.top - m_BBox.bottom;

+    }

+    switch (rotate) {

+        case 0:

+            m_PageMatrix.Set(1.0f, 0, 0, 1.0f, -m_BBox.left, -m_BBox.bottom);

+            break;

+        case 1:

+            m_PageMatrix.Set(0, -1.0f, 1.0f, 0, -m_BBox.bottom, m_BBox.right);

+            break;

+        case 2:

+            m_PageMatrix.Set(-1.0f, 0, 0, -1.0f, m_BBox.right, m_BBox.top);

+            break;

+        case 3:

+            m_PageMatrix.Set(0, 1.0f, -1.0f, 0, m_BBox.top, -m_BBox.left);

+            break;

+    }

+    m_Transparency = PDFTRANS_ISOLATED;

+    LoadTransInfo();

+}

+void CPDF_Page::StartParse(CPDF_ParseOptions* pOptions, FX_BOOL bReParse)

+{

+    if (bReParse) {

+        ClearCacheObjects();

+    }

+    if (m_ParseState == PDF_CONTENT_PARSED || m_ParseState == PDF_CONTENT_PARSING) {

+        return;

+    }

+    m_pParser = FX_NEW CPDF_ContentParser;

+    m_pParser->Start(this, pOptions);

+    m_ParseState = PDF_CONTENT_PARSING;

+}

+void CPDF_Page::ParseContent(CPDF_ParseOptions* pOptions, FX_BOOL bReParse)

+{

+    StartParse(pOptions, bReParse);

+    ContinueParse(NULL);

+}

+CPDF_Page::~CPDF_Page()

+{

+    if (m_pPageRender) {

+        CPDF_RenderModuleDef* pModule = CPDF_ModuleMgr::Get()->GetRenderModule();

+        pModule->DestroyPageCache(m_pPageRender);

+    }

+}

+CPDF_Object* FPDFAPI_GetPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name)

+{

+    int level = 0;

+    while (1) {

+        CPDF_Object* pObj = pPageDict->GetElementValue(name);

+        if (pObj) {

+            return pObj;

+        }

+        CPDF_Dictionary* pParent = pPageDict->GetDict(FX_BSTRC("Parent"));

+        if (!pParent || pParent == pPageDict) {

+            return NULL;

+        }

+        pPageDict = pParent;

+        level ++;

+        if (level == 1000) {

+            return NULL;

+        }

+    }

+}

+CPDF_Object* CPDF_Page::GetPageAttr(FX_BSTR name) const

+{

+    return FPDFAPI_GetPageAttr(m_pFormDict, name);

+}

+CPDF_Form::CPDF_Form(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Stream* pFormStream, CPDF_Dictionary* pParentResources)

+{

+    m_pDocument = pDoc;

+    m_pFormStream = pFormStream;

+    m_pFormDict = pFormStream->GetDict();

+    m_pResources = m_pFormDict->GetDict(FX_BSTRC("Resources"));

+    m_pPageResources = pPageResources;

+    if (m_pResources == NULL) {

+        m_pResources = pParentResources;

+    }

+    if (m_pResources == NULL) {

+        m_pResources = pPageResources;

+    }

+    m_Transparency = 0;

+    LoadTransInfo();

+}

+CPDF_Form::~CPDF_Form()

+{

+}

+void CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,

+                           CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)

+{

+    if (m_ParseState == PDF_CONTENT_PARSED || m_ParseState == PDF_CONTENT_PARSING) {

+        return;

+    }

+    m_pParser = FX_NEW CPDF_ContentParser;

+    m_pParser->Start(this, pGraphicStates, pParentMatrix, pType3Char, pOptions, level);

+    m_ParseState = PDF_CONTENT_PARSING;

+}

+void CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,

+                             CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)

+{

+    StartParse(pGraphicStates, pParentMatrix, pType3Char, pOptions, level);

+    ContinueParse(NULL);

+}

+CPDF_Form* CPDF_Form::Clone() const

+{

+    CPDF_Form* pClone = FX_NEW CPDF_Form(m_pDocument, m_pPageResources, m_pFormStream, m_pResources);

+    FX_POSITION pos = m_ObjectList.GetHeadPosition();

+    while (pos) {

+        CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);

+        pClone->m_ObjectList.AddTail(pObj->Clone());

+    }

+    return pClone;

+}

+void CPDF_Page::GetDisplayMatrix(CFX_AffineMatrix& matrix, int xPos, int yPos,

+                                 int xSize, int ySize, int iRotate) const

+{

+    if (m_PageWidth == 0 || m_PageHeight == 0) {

+        return;

+    }

+    CFX_AffineMatrix display_matrix;

+    int x0, y0, x1, y1, x2, y2;

+    iRotate %= 4;

+    switch (iRotate) {

+        case 0:

+            x0 = xPos;

+            y0 = yPos + ySize;

+            x1 = xPos;

+            y1 = yPos;

+            x2 = xPos + xSize;

+            y2 = yPos + ySize;

+            break;

+        case 1:

+            x0 = xPos;

+            y0 = yPos;

+            x1 = xPos + xSize;

+            y1 = yPos;

+            x2 = xPos;

+            y2 = yPos + ySize;

+            break;

+        case 2:

+            x0 = xPos + xSize;

+            y0 = yPos;

+            x1 = xPos + xSize;

+            y1 = yPos + ySize;

+            x2 = xPos;

+            y2 = yPos;

+            break;

+        case 3:

+            x0 = xPos + xSize;

+            y0 = yPos + ySize;

+            x1 = xPos;

+            y1 = yPos + ySize;

+            x2 = xPos + xSize;

+            y2 = yPos;

+            break;

+    }

+    display_matrix.Set(FXSYS_Div((FX_FLOAT)(x2 - x0), m_PageWidth),

+                       FXSYS_Div((FX_FLOAT)(y2 - y0), m_PageWidth),

+                       FXSYS_Div((FX_FLOAT)(x1 - x0), m_PageHeight),

+                       FXSYS_Div((FX_FLOAT)(y1 - y0), m_PageHeight),

+                       (FX_FLOAT)x0, (FX_FLOAT)y0);

+    matrix = m_PageMatrix;

+    matrix.Concat(display_matrix);

+}

+CPDF_ParseOptions::CPDF_ParseOptions()

+{

+    m_bTextOnly = FALSE;

+    m_bMarkedContent = TRUE;

+    m_bSeparateForm = TRUE;

+    m_bDecodeInlineImage = FALSE;

+}

diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
new file mode 100644
index 0000000..44b4fc0
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
@@ -0,0 +1,1401 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "pageint.h"

+#include <limits.h>

+void sRGB_to_AdobeCMYK(FX_FLOAT R, FX_FLOAT G, FX_FLOAT B, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k)

+{

+    c = 1.0f - R;

+    m = 1.0f - G;

+    y = 1.0f - B;

+    k = c;

+    if (m < k) {

+        k = m;

+    }

+    if (y < k) {

+        k = y;

+    }

+}

+CPDF_DeviceCS::CPDF_DeviceCS(int family)

+{

+    m_Family = family;

+    if (m_Family == PDFCS_DEVICERGB) {

+        m_nComponents = 3;

+    } else if (m_Family == PDFCS_DEVICEGRAY) {

+        m_nComponents = 1;

+    } else {

+        m_nComponents = 4;

+    }

+}

+FX_BOOL CPDF_DeviceCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const

+{

+    if (m_Family == PDFCS_DEVICERGB) {

+        R = pBuf[0];

+        if (R < 0) {

+            R = 0;

+        } else if (R > 1) {

+            R = 1;

+        }

+        G = pBuf[1];

+        if (G < 0) {

+            G = 0;

+        } else if (G > 1) {

+            G = 1;

+        }

+        B = pBuf[2];

+        if (B < 0) {

+            B = 0;

+        } else if (B > 1) {

+            B = 1;

+        }

+    } else if (m_Family == PDFCS_DEVICEGRAY) {

+        R = *pBuf;

+        if (R < 0) {

+            R = 0;

+        } else if (R > 1) {

+            R = 1;

+        }

+        G = B = R;

+    } else if (m_Family == PDFCS_DEVICECMYK) {

+        if (!m_dwStdConversion) {

+            AdobeCMYK_to_sRGB(pBuf[0], pBuf[1], pBuf[2], pBuf[3], R, G, B);

+        } else {

+            FX_FLOAT k = pBuf[3];

+            R = 1.0f - FX_MIN(1.0f, pBuf[0] + k);

+            G = 1.0f - FX_MIN(1.0f, pBuf[1] + k);

+            B = 1.0f - FX_MIN(1.0f, pBuf[2] + k);

+        }

+    } else {

+        ASSERT(m_Family == PDFCS_PATTERN);

+        R = G = B = 0;

+        return FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_DeviceCS::v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const

+{

+    if (m_Family != PDFCS_DEVICECMYK) {

+        return FALSE;

+    }

+    c = pBuf[0];

+    m = pBuf[1];

+    y = pBuf[2];

+    k = pBuf[3];

+    return TRUE;

+}

+FX_BOOL CPDF_DeviceCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const

+{

+    if (m_Family == PDFCS_DEVICERGB) {

+        pBuf[0] = R;

+        pBuf[1] = G;

+        pBuf[2] = B;

+        return TRUE;

+    } else if (m_Family == PDFCS_DEVICEGRAY) {

+        if (R == G && R == B) {

+            *pBuf = R;

+            return TRUE;

+        } else {

+            return FALSE;

+        }

+    } else if (m_Family == PDFCS_DEVICECMYK) {

+        sRGB_to_AdobeCMYK(R, G, B, pBuf[0], pBuf[1], pBuf[2], pBuf[3]);

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_DeviceCS::v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const

+{

+    if (m_Family == PDFCS_DEVICERGB) {

+        AdobeCMYK_to_sRGB(c, m, y, k, pBuf[0], pBuf[1], pBuf[2]);

+        return TRUE;

+    } else if (m_Family == PDFCS_DEVICEGRAY) {

+        return FALSE;

+    } else if (m_Family == PDFCS_DEVICECMYK) {

+        pBuf[0] = c;

+        pBuf[1] = m;

+        pBuf[2] = y;

+        pBuf[3] = k;

+        return TRUE;

+    }

+    return FALSE;

+}

+static void ReverseRGB(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels)

+{

+    if (pDestBuf == pSrcBuf)

+        for (int i = 0; i < pixels; i ++) {

+            FX_BYTE temp = pDestBuf[2];

+            pDestBuf[2] = pDestBuf[0];

+            pDestBuf[0] = temp;

+            pDestBuf += 3;

+        }

+    else

+        for (int i = 0; i < pixels; i ++) {

+            *pDestBuf ++ = pSrcBuf[2];

+            *pDestBuf ++ = pSrcBuf[1];

+            *pDestBuf ++ = pSrcBuf[0];

+            pSrcBuf += 3;

+        }

+}

+void CPDF_DeviceCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const

+{

+    if (bTransMask && m_Family == PDFCS_DEVICECMYK) {

+        for (int i = 0; i < pixels; i ++) {

+            int k = 255 - pSrcBuf[3];

+            pDestBuf[0] = ((255 - pSrcBuf[0]) * k) / 255;

+            pDestBuf[1] = ((255 - pSrcBuf[1]) * k) / 255;

+            pDestBuf[2] = ((255 - pSrcBuf[2]) * k) / 255;

+            pDestBuf += 3;

+            pSrcBuf += 4;

+        }

+        return;

+    }

+    if (m_Family == PDFCS_DEVICERGB) {

+        ReverseRGB(pDestBuf, pSrcBuf, pixels);

+    } else if (m_Family == PDFCS_DEVICEGRAY) {

+        for (int i = 0; i < pixels; i ++) {

+            *pDestBuf ++ = pSrcBuf[i];

+            *pDestBuf ++ = pSrcBuf[i];

+            *pDestBuf ++ = pSrcBuf[i];

+        }

+    } else {

+        for (int i = 0; i < pixels; i ++) {

+            if (!m_dwStdConversion) {

+                AdobeCMYK_to_sRGB1(pSrcBuf[0], pSrcBuf[1], pSrcBuf[2], pSrcBuf[3], pDestBuf[2], pDestBuf[1], pDestBuf[0]);

+            } else {

+                FX_BYTE k = pSrcBuf[3];

+                pDestBuf[2] = 255 - FX_MIN(255, pSrcBuf[0] + k);

+                pDestBuf[1] = 255 - FX_MIN(255, pSrcBuf[1] + k);

+                pDestBuf[0] = 255 - FX_MIN(255, pSrcBuf[2] + k);

+            }

+            pSrcBuf += 4;

+            pDestBuf += 3;

+        }

+    }

+}

+const FX_BYTE g_sRGBSamples1[] = {

+    0,   3,   6,  10,  13,  15,  18,  20,  22,  23,  25,  27,  28,  30,  31,  32,

+    34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,

+    49,  50,  51,  52,  53,  53,  54,  55,  56,  56,  57,  58,  58,  59,  60,  61,

+    61,  62,  62,  63,  64,  64,  65,  66,  66,  67,  67,  68,  68,  69,  70,  70,

+    71,  71,  72,  72,  73,  73,  74,  74,  75,  76,  76,  77,  77,  78,  78,  79,

+    79,  79,  80,  80,  81,  81,  82,  82,  83,  83,  84,  84,  85,  85,  85,  86,

+    86,  87,  87,  88,  88,  88,  89,  89,  90,  90,  91,  91,  91,  92,  92,  93,

+    93,  93,  94,  94,  95,  95,  95,  96,  96,  97,  97,  97,  98,  98,  98,  99,

+    99,  99, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103, 103, 104, 104, 104,

+    105, 105, 106, 106, 106, 107, 107, 107, 108, 108, 108, 109, 109, 109, 110, 110,

+    110, 110, 111, 111, 111, 112, 112, 112, 113, 113, 113, 114, 114, 114, 115, 115,

+    115, 115, 116, 116, 116, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 120,

+};

+const FX_BYTE g_sRGBSamples2[] = {

+    120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,

+    137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,

+    152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,

+    165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,

+    177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,

+    188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,

+    198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,

+    208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,

+    216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,

+    225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,

+    233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,

+    241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,

+    248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,

+};

+static void XYZ_to_sRGB(FX_FLOAT X, FX_FLOAT Y, FX_FLOAT Z, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B)

+{

+    FX_FLOAT R1 = 3.2410f * X - 1.5374f * Y - 0.4986f * Z;

+    FX_FLOAT G1 = -0.9692f * X + 1.8760f * Y + 0.0416f * Z;

+    FX_FLOAT B1 =  0.0556f * X - 0.2040f * Y + 1.0570f * Z;

+    if (R1 > 1) {

+        R1 = 1;

+    }

+    if (R1 < 0) {

+        R1 = 0;

+    }

+    if (G1 > 1) {

+        G1 = 1;

+    }

+    if (G1 < 0) {

+        G1 = 0;

+    }

+    if (B1 > 1) {

+        B1 = 1;

+    }

+    if (B1 < 0) {

+        B1 = 0;

+    }

+    int scale = (int)(R1 * 1023);

+    if (scale < 0) {

+        scale = 0;

+    }

+    if (scale < 192) {

+        R = (g_sRGBSamples1[scale] / 255.0f);

+    } else {

+        R = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);

+    }

+    scale = (int)(G1 * 1023);

+    if (scale < 0) {

+        scale = 0;

+    }

+    if (scale < 192) {

+        G = (g_sRGBSamples1[scale] / 255.0f);

+    } else {

+        G = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);

+    }

+    scale = (int)(B1 * 1023);

+    if (scale < 0) {

+        scale = 0;

+    }

+    if (scale < 192) {

+        B = (g_sRGBSamples1[scale] / 255.0f);

+    } else {

+        B = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);

+    }

+}

+class CPDF_CalGray : public CPDF_ColorSpace

+{

+public:

+    CPDF_CalGray();

+    virtual FX_BOOL		v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);

+    virtual FX_BOOL		GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;

+    virtual void		TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;

+    FX_BOOL				SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;

+    FX_FLOAT			m_WhitePoint[3];

+    FX_FLOAT			m_BlackPoint[3];

+    FX_FLOAT			m_Gamma;

+};

+CPDF_CalGray::CPDF_CalGray()

+{

+    m_Family = PDFCS_CALGRAY;

+    m_nComponents = 1;

+}

+FX_BOOL CPDF_CalGray::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)

+{

+    CPDF_Dictionary* pDict = pArray->GetDict(1);

+    CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));

+    int i;

+    for (i = 0; i < 3; i ++) {

+        m_WhitePoint[i] = pParam->GetNumber(i);

+    }

+    pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));

+    for (i = 0; i < 3; i ++) {

+        m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;

+    }

+    m_Gamma = pDict->GetNumber(FX_BSTRC("Gamma"));

+    if (m_Gamma == 0) {

+        m_Gamma = 1.0f;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_CalGray::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const

+{

+    R = G = B = *pBuf;

+    return TRUE;

+}

+FX_BOOL CPDF_CalGray::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const

+{

+    if (R == G && R == B) {

+        *pBuf = R;

+        return TRUE;

+    } else {

+        return FALSE;

+    }

+}

+void CPDF_CalGray::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const

+{

+    for (int i = 0; i < pixels; i ++) {

+        *pDestBuf ++ = pSrcBuf[i];

+        *pDestBuf ++ = pSrcBuf[i];

+        *pDestBuf ++ = pSrcBuf[i];

+    }

+}

+class CPDF_CalRGB : public CPDF_ColorSpace

+{

+public:

+    CPDF_CalRGB();

+    virtual FX_BOOL		v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);

+    virtual FX_BOOL		GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;

+    virtual void		TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;

+    FX_BOOL				SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;

+    FX_FLOAT			m_WhitePoint[3];

+    FX_FLOAT			m_BlackPoint[3];

+    FX_FLOAT			m_Gamma[3];

+    FX_FLOAT			m_Matrix[9];

+    FX_BOOL				m_bGamma, m_bMatrix;

+};

+CPDF_CalRGB::CPDF_CalRGB()

+{

+    m_Family = PDFCS_CALRGB;

+    m_nComponents = 3;

+}

+FX_BOOL CPDF_CalRGB::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)

+{

+    CPDF_Dictionary* pDict = pArray->GetDict(1);

+    CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));

+    int i;

+    for (i = 0; i < 3; i ++) {

+        m_WhitePoint[i] = pParam->GetNumber(i);

+    }

+    pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));

+    for (i = 0; i < 3; i ++) {

+        m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;

+    }

+    pParam = pDict->GetArray(FX_BSTRC("Gamma"));

+    if (pParam) {

+        m_bGamma = TRUE;

+        for (i = 0; i < 3; i ++) {

+            m_Gamma[i] = pParam->GetNumber(i);

+        }

+    } else {

+        m_bGamma = FALSE;

+    }

+    pParam = pDict->GetArray(FX_BSTRC("Matrix"));

+    if (pParam) {

+        m_bMatrix = TRUE;

+        for (i = 0; i < 9; i ++) {

+            m_Matrix[i] = pParam->GetNumber(i);

+        }

+    } else {

+        m_bMatrix = FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_CalRGB::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const

+{

+    FX_FLOAT A_ = pBuf[0];

+    FX_FLOAT B_ = pBuf[1];

+    FX_FLOAT C_ = pBuf[2];

+    if (m_bGamma) {

+        A_ = (FX_FLOAT)FXSYS_pow(A_, m_Gamma[0]);

+        B_ = (FX_FLOAT)FXSYS_pow(B_, m_Gamma[1]);

+        C_ = (FX_FLOAT)FXSYS_pow(C_, m_Gamma[2]);

+    }

+    FX_FLOAT X, Y, Z;

+    if (m_bMatrix) {

+        X = m_Matrix[0] * A_ + m_Matrix[3] * B_ + m_Matrix[6] * C_;

+        Y = m_Matrix[1] * A_ + m_Matrix[4] * B_ + m_Matrix[7] * C_;

+        Z = m_Matrix[2] * A_ + m_Matrix[5] * B_ + m_Matrix[8] * C_;

+    } else {

+        X = A_;

+        Y = B_;

+        Z = C_;

+    }

+    XYZ_to_sRGB(X, Y, Z, R, G, B);

+    return TRUE;

+}

+FX_BOOL CPDF_CalRGB::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const

+{

+    pBuf[0] = R;

+    pBuf[1] = G;

+    pBuf[2] = B;

+    return TRUE;

+}

+void CPDF_CalRGB::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const

+{

+    if (bTransMask) {

+        FX_FLOAT Cal[3];

+        FX_FLOAT R, G, B;

+        for(int i = 0; i < pixels; i ++) {

+            Cal[0] = ((FX_FLOAT)pSrcBuf[2]) / 255;

+            Cal[1] = ((FX_FLOAT)pSrcBuf[1]) / 255;

+            Cal[2] = ((FX_FLOAT)pSrcBuf[0]) / 255;

+            GetRGB(Cal, R, G, B);

+            pDestBuf[0] = FXSYS_round(B * 255);

+            pDestBuf[1] = FXSYS_round(G * 255);

+            pDestBuf[2] = FXSYS_round(R * 255);

+            pSrcBuf += 3;

+            pDestBuf += 3;

+        }

+    }

+    ReverseRGB(pDestBuf, pSrcBuf, pixels);

+}

+class CPDF_LabCS : public CPDF_ColorSpace

+{

+public:

+    CPDF_LabCS()

+    {

+        m_Family = PDFCS_LAB;

+        m_nComponents = 3;

+    }

+    virtual FX_BOOL		v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);

+    virtual void		GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const;

+    virtual FX_BOOL		GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;

+    FX_BOOL		SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;

+    virtual void		TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;

+    FX_FLOAT	m_WhitePoint[3];

+    FX_FLOAT	m_BlackPoint[3];

+    FX_FLOAT	m_Ranges[4];

+};

+FX_BOOL CPDF_LabCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)

+{

+    CPDF_Dictionary* pDict = pArray->GetDict(1);

+    CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));

+    int i;

+    for (i = 0; i < 3; i ++) {

+        m_WhitePoint[i] = pParam->GetNumber(i);

+    }

+    pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));

+    for (i = 0; i < 3; i ++) {

+        m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;

+    }

+    pParam = pDict->GetArray(FX_BSTRC("Range"));

+    const FX_FLOAT def_ranges[4] = { -100 * 1.0f, 100 * 1.0f, -100 * 1.0f, 100 * 1.0f};

+    for (i = 0; i < 4; i ++) {

+        m_Ranges[i] = pParam ? pParam->GetNumber(i) : def_ranges[i];

+    }

+    return TRUE;

+}

+void CPDF_LabCS::GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const

+{

+    value = 0;

+    if (iComponent == 0) {

+        min = 0;

+        max = 100 * 1.0f;

+    } else {

+        min = m_Ranges[iComponent * 2 - 2];

+        max = m_Ranges[iComponent * 2 - 1];

+        if (value < min) {

+            value = min;

+        } else if (value > max) {

+            value = max;

+        }

+    }

+}

+FX_BOOL CPDF_LabCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const

+{

+    FX_FLOAT Lstar = pBuf[0];

+    FX_FLOAT astar = pBuf[1];

+    FX_FLOAT bstar = pBuf[2];

+    FX_FLOAT M = (Lstar + 16.0f) / 116.0f;

+    FX_FLOAT L = M + astar / 500.0f;

+    FX_FLOAT N = M - bstar / 200.0f;

+    FX_FLOAT X, Y, Z;

+    if (L < 0.2069f) {

+        X = 0.957f * 0.12842f * (L - 0.1379f);

+    } else {

+        X = 0.957f * L * L * L;

+    }

+    if (M < 0.2069f) {

+        Y = 0.12842f * (M - 0.1379f);

+    } else {

+        Y = M * M * M;

+    }

+    if (N < 0.2069f) {

+        Z = 1.0889f * 0.12842f * (N - 0.1379f);

+    } else {

+        Z = 1.0889f * N * N * N;

+    }

+    XYZ_to_sRGB(X, Y, Z, R, G, B);

+    return TRUE;

+}

+FX_BOOL CPDF_LabCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const

+{

+    return FALSE;

+}

+void CPDF_LabCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const

+{

+    for (int i = 0; i < pixels; i ++) {

+        FX_FLOAT lab[3];

+        FX_FLOAT R, G, B;

+        lab[0] = (pSrcBuf[0] * 100 / 255.0f);

+        lab[1] = (FX_FLOAT)(pSrcBuf[1] - 128);

+        lab[2] = (FX_FLOAT)(pSrcBuf[2] - 128);

+        GetRGB(lab, R, G, B);

+        pDestBuf[0] = (FX_INT32)(B * 255);

+        pDestBuf[1] = (FX_INT32)(G * 255);

+        pDestBuf[2] = (FX_INT32)(R * 255);

+        pDestBuf += 3;

+        pSrcBuf += 3;

+    }

+}

+CPDF_IccProfile::CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents)

+{

+    m_bsRGB = nComponents == 3 && dwSize == 3144 && FXSYS_memcmp32(pData + 0x190, "sRGB IEC61966-2.1", 17) == 0;

+    m_pTransform = NULL;

+    if (!m_bsRGB && CPDF_ModuleMgr::Get()->GetIccModule()) {

+        m_pTransform = CPDF_ModuleMgr::Get()->GetIccModule()->CreateTransform_sRGB(pData, dwSize, nComponents);

+    }

+}

+CPDF_IccProfile::~CPDF_IccProfile()

+{

+    if (m_pTransform) {

+        CPDF_ModuleMgr::Get()->GetIccModule()->DestroyTransform(m_pTransform);

+    }

+}

+class CPDF_ICCBasedCS : public CPDF_ColorSpace

+{

+public:

+    CPDF_ICCBasedCS();

+    virtual ~CPDF_ICCBasedCS();

+    virtual FX_BOOL		v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);

+    void				GetDefaultValue(int i, FX_FLOAT& min, FX_FLOAT& max) const

+    {

+        min = m_pRanges[i * 2];

+        max = m_pRanges[i * 2 + 1];

+    }

+    virtual FX_BOOL		GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;

+    FX_BOOL				v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;

+    FX_BOOL				SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;

+    virtual void		EnableStdConversion(FX_BOOL bEnabled);

+    virtual void		TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;

+    FX_FLOAT*		m_pRanges;

+    CPDF_IccProfile*	m_pProfile;

+    CPDF_ColorSpace*	m_pAlterCS;

+    FX_LPBYTE			m_pCache;

+    FX_BOOL				m_bOwn;

+};

+CPDF_ICCBasedCS::CPDF_ICCBasedCS()

+{

+    m_pAlterCS = NULL;

+    m_pProfile = NULL;

+    m_Family = PDFCS_ICCBASED;

+    m_pCache = NULL;

+    m_pRanges = NULL;

+    m_bOwn = FALSE;

+}

+CPDF_ICCBasedCS::~CPDF_ICCBasedCS()

+{

+    if (m_pCache) {

+        FX_Free(m_pCache);

+    }

+    if (m_pRanges) {

+        FX_Free(m_pRanges);

+    }

+    if (m_pAlterCS && m_bOwn) {

+        m_pAlterCS->ReleaseCS();

+    }

+    if (m_pProfile && m_pDocument) {

+        m_pDocument->GetPageData()->ReleaseIccProfile(NULL, m_pProfile);

+    }

+}

+FX_BOOL CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)

+{

+    CPDF_Stream* pStream = pArray->GetStream(1);

+    if (pStream == NULL) {

+        return FALSE;

+    }

+    m_nComponents = pStream->GetDict()->GetInteger(FX_BSTRC("N"));

+    if (m_nComponents < 0 || m_nComponents > (1 << 16)) {

+        return FALSE;

+    }

+    CPDF_Array* pRanges = pStream->GetDict()->GetArray(FX_BSTRC("Range"));

+    m_pRanges = FX_Alloc(FX_FLOAT, m_nComponents * 2);

+    for (int i = 0; i < m_nComponents * 2; i ++) {

+        if (pRanges) {

+            m_pRanges[i] = pRanges->GetNumber(i);

+        } else if (i % 2) {

+            m_pRanges[i] = 1.0f;

+        } else {

+            m_pRanges[i] = 0;

+        }

+    }

+    m_pProfile = pDoc->LoadIccProfile(pStream, m_nComponents);

+    if (!m_pProfile) {

+        return FALSE;

+    }

+    if (m_pProfile->m_pTransform == NULL) {

+        CPDF_Object* pAlterCSObj = pStream->GetDict()->GetElementValue(FX_BSTRC("Alternate"));

+        if (pAlterCSObj) {

+            CPDF_ColorSpace* alter_cs = CPDF_ColorSpace::Load(pDoc, pAlterCSObj);

+            if (alter_cs) {

+                if (alter_cs->CountComponents() > m_nComponents) {

+                    alter_cs->ReleaseCS();

+                } else {

+                    m_pAlterCS = alter_cs;

+                    m_bOwn = TRUE;

+                }

+            }

+        }

+        if (!m_pAlterCS) {

+            if (m_nComponents == 3) {

+                m_pAlterCS = GetStockCS(PDFCS_DEVICERGB);

+            } else if (m_nComponents == 4) {

+                m_pAlterCS = GetStockCS(PDFCS_DEVICECMYK);

+            } else {

+                m_pAlterCS = GetStockCS(PDFCS_DEVICEGRAY);

+            }

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_ICCBasedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const

+{

+    if (m_pProfile && m_pProfile->m_bsRGB) {

+        R = pBuf[0];

+        G = pBuf[1];

+        B = pBuf[2];

+        return TRUE;

+    }

+    ICodec_IccModule *pIccModule = CPDF_ModuleMgr::Get()->GetIccModule();

+    if (m_pProfile->m_pTransform == NULL || pIccModule == NULL) {

+        if (m_pAlterCS) {

+            m_pAlterCS->GetRGB(pBuf, R, G, B);

+        } else {

+            R = G = B = 0.0f;

+        }

+        return TRUE;

+    }

+    FX_FLOAT rgb[3];

+    pIccModule->Translate(m_pProfile->m_pTransform, pBuf, rgb);

+    R = rgb[0];

+    G = rgb[1];

+    B = rgb[2];

+    return TRUE;

+}

+FX_BOOL CPDF_ICCBasedCS::v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const

+{

+    if (m_nComponents != 4) {

+        return FALSE;

+    }

+    c = pBuf[0];

+    m = pBuf[1];

+    y = pBuf[2];

+    k = pBuf[3];

+    return TRUE;

+}

+FX_BOOL CPDF_ICCBasedCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const

+{

+    return FALSE;

+}

+void CPDF_ICCBasedCS::EnableStdConversion(FX_BOOL bEnabled)

+{

+    CPDF_ColorSpace::EnableStdConversion(bEnabled);

+    if (m_pAlterCS) {

+        m_pAlterCS->EnableStdConversion(bEnabled);

+    }

+}

+void CPDF_ICCBasedCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const

+{

+    if (m_pProfile->m_bsRGB) {

+        ReverseRGB(pDestBuf, pSrcBuf, pixels);

+    } else if (m_pProfile->m_pTransform) {

+        int nMaxColors = 1;

+        for (int i = 0; i < m_nComponents; i ++) {

+            nMaxColors *= 52;

+        }

+        if (m_nComponents > 3 || image_width * image_height < nMaxColors * 3 / 2) {

+            CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(m_pProfile->m_pTransform, pDestBuf, pSrcBuf, pixels);

+        } else {

+            if (m_pCache == NULL) {

+                ((CPDF_ICCBasedCS*)this)->m_pCache = FX_Alloc(FX_BYTE, nMaxColors * 3);

+                FX_LPBYTE temp_src = FX_Alloc(FX_BYTE, nMaxColors * m_nComponents);

+                FX_LPBYTE pSrc = temp_src;

+                for (int i = 0; i < nMaxColors; i ++) {

+                    FX_DWORD color = i;

+                    FX_DWORD order = nMaxColors / 52;

+                    for (int c = 0; c < m_nComponents; c ++) {

+                        *pSrc++ = (FX_BYTE)(color / order * 5);

+                        color %= order;

+                        order /= 52;

+                    }

+                }

+                CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(m_pProfile->m_pTransform, m_pCache, temp_src, nMaxColors);

+                FX_Free(temp_src);

+            }

+            for (int i = 0; i < pixels; i ++) {

+                int index = 0;

+                for (int c = 0; c < m_nComponents; c ++) {

+                    index = index * 52 + (*pSrcBuf) / 5;

+                    pSrcBuf ++;

+                }

+                index *= 3;

+                *pDestBuf++ = m_pCache[index];

+                *pDestBuf++ = m_pCache[index + 1];

+                *pDestBuf++ = m_pCache[index + 2];

+            }

+        }

+    } else if (m_pAlterCS) {

+        m_pAlterCS->TranslateImageLine(pDestBuf, pSrcBuf, pixels, image_width, image_height);

+    }

+}

+class CPDF_IndexedCS : public CPDF_ColorSpace

+{

+public:

+    CPDF_IndexedCS();

+    virtual ~CPDF_IndexedCS();

+    virtual FX_BOOL		v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);

+    void				GetDefaultValue(int iComponent, FX_FLOAT& min, FX_FLOAT& max) const

+    {

+        min = 0;

+        max = (FX_FLOAT)m_MaxIndex;

+    }

+    virtual FX_BOOL		GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;

+    virtual CPDF_ColorSpace*	GetBaseCS() const

+    {

+        return m_pBaseCS;

+    }

+    virtual void		EnableStdConversion(FX_BOOL bEnabled);

+    CPDF_ColorSpace*	m_pBaseCS;

+    int					m_nBaseComponents;

+    int					m_MaxIndex;

+    CFX_ByteString		m_Table;

+    FX_FLOAT*		m_pCompMinMax;

+};

+CPDF_IndexedCS::CPDF_IndexedCS()

+{

+    m_pBaseCS = NULL;

+    m_Family = PDFCS_INDEXED;

+    m_nComponents = 1;

+    m_pCompMinMax = NULL;

+}

+CPDF_IndexedCS::~CPDF_IndexedCS()

+{

+    if (m_pCompMinMax) {

+        FX_Free(m_pCompMinMax);

+    }

+    CPDF_ColorSpace* pCS = m_pBaseCS;

+    if (pCS && m_pDocument) {

+        m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());

+    }

+}

+FX_BOOL CPDF_IndexedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)

+{

+    if (pArray->GetCount() < 4) {

+        return FALSE;

+    }

+    CPDF_Object* pBaseObj = pArray->GetElementValue(1);

+    if (pBaseObj == m_pArray) {

+        return FALSE;

+    }

+    CPDF_DocPageData* pDocPageData = pDoc->GetPageData();

+    m_pBaseCS = pDocPageData->GetColorSpace(pBaseObj, NULL);

+    if (m_pBaseCS == NULL) {

+        return FALSE;

+    }

+    m_nBaseComponents = m_pBaseCS->CountComponents();

+    m_pCompMinMax = FX_Alloc(FX_FLOAT, m_nBaseComponents * 2);

+    FX_FLOAT defvalue;

+    for (int i = 0; i < m_nBaseComponents; i ++) {

+        m_pBaseCS->GetDefaultValue(i, defvalue, m_pCompMinMax[i * 2], m_pCompMinMax[i * 2 + 1]);

+        m_pCompMinMax[i * 2 + 1] -= m_pCompMinMax[i * 2];

+    }

+    m_MaxIndex = pArray->GetInteger(2);

+    CPDF_Object* pTableObj = pArray->GetElementValue(3);

+    if (pTableObj == NULL) {

+        return FALSE;

+    }

+    FX_LPCBYTE pTable = NULL;

+    FX_DWORD size = 0;

+    CPDF_StreamAcc* pStreamAcc = NULL;

+    if (pTableObj->GetType() == PDFOBJ_STRING) {

+        m_Table = ((CPDF_String*)pTableObj)->GetString();

+    } else if (pTableObj->GetType() == PDFOBJ_STREAM) {

+        CPDF_StreamAcc acc;

+        acc.LoadAllData((CPDF_Stream*)pTableObj, FALSE);

+        m_Table = CFX_ByteStringC(acc.GetData(), acc.GetSize());

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_IndexedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const

+{

+    int index = (FX_INT32)(*pBuf);

+    if (index < 0 || index > m_MaxIndex) {

+        return FALSE;

+    }

+    if (m_nBaseComponents) {

+        if (index == INT_MAX || (index + 1) > INT_MAX / m_nBaseComponents ||

+                (index + 1)*m_nBaseComponents > (int)m_Table.GetLength()) {

+            R = G = B = 0;

+            return FALSE;

+        }

+    }

+    CFX_FixedBufGrow<FX_FLOAT, 16> Comps(m_nBaseComponents);

+    FX_FLOAT* comps = Comps;

+    FX_LPCBYTE pTable = m_Table;

+    for (int i = 0; i < m_nBaseComponents; i ++) {

+        comps[i] = m_pCompMinMax[i * 2] + m_pCompMinMax[i * 2 + 1] * pTable[index * m_nBaseComponents + i] / 255;

+    }

+    m_pBaseCS->GetRGB(comps, R, G, B);

+    return TRUE;

+}

+void CPDF_IndexedCS::EnableStdConversion(FX_BOOL bEnabled)

+{

+    CPDF_ColorSpace::EnableStdConversion(bEnabled);

+    if (m_pBaseCS) {

+        m_pBaseCS->EnableStdConversion(bEnabled);

+    }

+}

+#define MAX_PATTERN_COLORCOMPS	16

+typedef struct _PatternValue {

+    CPDF_Pattern*	m_pPattern;

+    int				m_nComps;

+    FX_FLOAT		m_Comps[MAX_PATTERN_COLORCOMPS];

+} PatternValue;

+CPDF_PatternCS::CPDF_PatternCS()

+{

+    m_Family = PDFCS_PATTERN;

+    m_pBaseCS = NULL;

+    m_nComponents = 1;

+}

+CPDF_PatternCS::~CPDF_PatternCS()

+{

+    CPDF_ColorSpace* pCS = m_pBaseCS;

+    if (pCS && m_pDocument) {

+        m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());

+    }

+}

+FX_BOOL CPDF_PatternCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)

+{

+    CPDF_Object* pBaseCS = pArray->GetElementValue(1);

+    if (pBaseCS == m_pArray) {

+        return FALSE;

+    }

+    CPDF_DocPageData* pDocPageData = pDoc->GetPageData();

+    m_pBaseCS = pDocPageData->GetColorSpace(pBaseCS, NULL);

+    if (m_pBaseCS) {

+        m_nComponents = m_pBaseCS->CountComponents() + 1;

+        if (m_pBaseCS->CountComponents() > MAX_PATTERN_COLORCOMPS) {

+            return FALSE;

+        }

+    } else {

+        m_nComponents = 1;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_PatternCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const

+{

+    if (m_pBaseCS) {

+        PatternValue* pvalue = (PatternValue*)pBuf;

+        m_pBaseCS->GetRGB(pvalue->m_Comps, R, G, B);

+        return TRUE;

+    }

+    R = G = B = 0.75f;

+    return FALSE;

+}

+class CPDF_SeparationCS : public CPDF_ColorSpace

+{

+public:

+    CPDF_SeparationCS();

+    virtual ~CPDF_SeparationCS();

+    virtual void		GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const

+    {

+        value = 1.0f;

+        min = 0;

+        max = 1.0f;

+    }

+    virtual FX_BOOL		v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);

+    virtual FX_BOOL		GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;

+    virtual void		EnableStdConversion(FX_BOOL bEnabled);

+    CPDF_ColorSpace*	m_pAltCS;

+    CPDF_Function*		m_pFunc;

+    enum {None, All, Colorant}	m_Type;

+};

+CPDF_SeparationCS::CPDF_SeparationCS()

+{

+    m_Family = PDFCS_SEPARATION;

+    m_pAltCS = NULL;

+    m_pFunc = NULL;

+    m_nComponents = 1;

+}

+CPDF_SeparationCS::~CPDF_SeparationCS()

+{

+    if (m_pAltCS) {

+        m_pAltCS->ReleaseCS();

+    }

+    if (m_pFunc) {

+        delete m_pFunc;

+    }

+}

+FX_BOOL CPDF_SeparationCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)

+{

+    CFX_ByteString name = pArray->GetString(1);

+    if (name == FX_BSTRC("None")) {

+        m_Type = None;

+    } else {

+        m_Type = Colorant;

+        CPDF_Object* pAltCS = pArray->GetElementValue(2);

+        if (pAltCS == m_pArray) {

+            return FALSE;

+        }

+        m_pAltCS = Load(pDoc, pAltCS);

+        CPDF_Object* pFuncObj = pArray->GetElementValue(3);

+        if (pFuncObj && pFuncObj->GetType() != PDFOBJ_NAME) {

+            m_pFunc = CPDF_Function::Load(pFuncObj);

+        }

+        if (m_pFunc && m_pAltCS && m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {

+            delete m_pFunc;

+            m_pFunc = NULL;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_SeparationCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const

+{

+    if (m_Type == None) {

+        return FALSE;

+    }

+    if (m_pFunc == NULL) {

+        if (m_pAltCS == NULL) {

+            return FALSE;

+        }

+        int nComps = m_pAltCS->CountComponents();

+        CFX_FixedBufGrow<FX_FLOAT, 16> results(nComps);

+        for (int i = 0; i < nComps; i ++) {

+            results[i] = *pBuf;

+        }

+        m_pAltCS->GetRGB(results, R, G, B);

+        return TRUE;

+    }

+    CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());

+    int nresults;

+    m_pFunc->Call(pBuf, 1, results, nresults);

+    if (nresults == 0) {

+        return FALSE;

+    }

+    if (m_pAltCS) {

+        m_pAltCS->GetRGB(results, R, G, B);

+        return TRUE;

+    } else {

+        R = G = B = 0;

+        return FALSE;

+    }

+}

+void CPDF_SeparationCS::EnableStdConversion(FX_BOOL bEnabled)

+{

+    CPDF_ColorSpace::EnableStdConversion(bEnabled);

+    if (m_pAltCS) {

+        m_pAltCS->EnableStdConversion(bEnabled);

+    }

+}

+class CPDF_DeviceNCS : public CPDF_ColorSpace

+{

+public:

+    CPDF_DeviceNCS();

+    virtual ~CPDF_DeviceNCS();

+    virtual void		GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const

+    {

+        value = 1.0f;

+        min = 0;

+        max = 1.0f;

+    }

+    virtual FX_BOOL	v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);

+    virtual FX_BOOL	GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;

+    virtual void	EnableStdConversion(FX_BOOL bEnabled);

+    CPDF_ColorSpace*	m_pAltCS;

+    CPDF_Function*		m_pFunc;

+};

+CPDF_DeviceNCS::CPDF_DeviceNCS()

+{

+    m_Family = PDFCS_DEVICEN;

+    m_pAltCS = NULL;

+    m_pFunc = NULL;

+}

+CPDF_DeviceNCS::~CPDF_DeviceNCS()

+{

+    if (m_pFunc) {

+        delete m_pFunc;

+    }

+    if (m_pAltCS) {

+        m_pAltCS->ReleaseCS();

+    }

+}

+FX_BOOL CPDF_DeviceNCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)

+{

+    CPDF_Object* pObj = pArray->GetElementValue(1);

+    if (!pObj) {

+        return FALSE;

+    }

+    if (pObj->GetType() != PDFOBJ_ARRAY) {

+        return FALSE;

+    }

+    m_nComponents = ((CPDF_Array*)pObj)->GetCount();

+    CPDF_Object* pAltCS = pArray->GetElementValue(2);

+    if (!pAltCS || pAltCS == m_pArray) {

+        return FALSE;

+    }

+    m_pAltCS = Load(pDoc, pAltCS);

+    m_pFunc = CPDF_Function::Load(pArray->GetElementValue(3));

+    if (m_pAltCS == NULL || m_pFunc == NULL) {

+        return FALSE;

+    }

+    if (m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {

+        return FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_DeviceNCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const

+{

+    if (m_pFunc == NULL) {

+        return FALSE;

+    }

+    CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());

+    int nresults;

+    m_pFunc->Call(pBuf, m_nComponents, results, nresults);

+    if (nresults == 0) {

+        return FALSE;

+    }

+    m_pAltCS->GetRGB(results, R, G, B);

+    return TRUE;

+}

+void CPDF_DeviceNCS::EnableStdConversion(FX_BOOL bEnabled)

+{

+    CPDF_ColorSpace::EnableStdConversion(bEnabled);

+    if (m_pAltCS) {

+        m_pAltCS->EnableStdConversion(bEnabled);

+    }

+}

+CPDF_ColorSpace* CPDF_ColorSpace::GetStockCS(int family)

+{

+    return CPDF_ModuleMgr::Get()->GetPageModule()->GetStockCS(family);;

+}

+CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name)

+{

+    if (name == FX_BSTRC("DeviceRGB") || name == FX_BSTRC("RGB")) {

+        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);

+    }

+    if (name == FX_BSTRC("DeviceGray") || name == FX_BSTRC("G")) {

+        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);

+    }

+    if (name == FX_BSTRC("DeviceCMYK") || name == FX_BSTRC("CMYK")) {

+        return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);

+    }

+    if (name == FX_BSTRC("Pattern")) {

+        return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);

+    }

+    return NULL;

+}

+CPDF_ColorSpace* CPDF_ColorSpace::Load(CPDF_Document* pDoc, CPDF_Object* pObj)

+{

+    if (pObj == NULL) {

+        return NULL;

+    }

+    if (pObj->GetType() == PDFOBJ_NAME) {

+        return _CSFromName(pObj->GetString());

+    }

+    if (pObj->GetType() == PDFOBJ_STREAM) {

+        CPDF_Dictionary *pDict = ((CPDF_Stream *)pObj)->GetDict();

+        if (!pDict) {

+            return NULL;

+        }

+        CPDF_ColorSpace *pRet = NULL;

+        FX_POSITION pos = pDict->GetStartPos();

+        while (pos) {

+            CFX_ByteString bsKey;

+            CPDF_Object *pValue = pDict->GetNextElement(pos, bsKey);

+            if (pValue->GetType() == PDFOBJ_NAME) {

+                pRet = _CSFromName(pValue->GetString());

+            }

+            if (pRet) {

+                return pRet;

+            }

+        }

+        return NULL;

+    }

+    if (pObj->GetType() != PDFOBJ_ARRAY) {

+        return NULL;

+    }

+    CPDF_Array* pArray = (CPDF_Array*)pObj;

+    if (pArray->GetCount() == 0) {

+        return NULL;

+    }

+    CFX_ByteString familyname = pArray->GetElementValue(0)->GetString();

+    if (pArray->GetCount() == 1) {

+        return _CSFromName(familyname);

+    }

+    CPDF_ColorSpace* pCS = NULL;

+    FX_DWORD id = familyname.GetID();

+    if (id == FXBSTR_ID('C', 'a', 'l', 'G')) {

+        pCS = FX_NEW CPDF_CalGray();

+    } else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) {

+        pCS = FX_NEW CPDF_CalRGB();

+    } else if (id == FXBSTR_ID('L', 'a', 'b', 0)) {

+        pCS = FX_NEW CPDF_LabCS();

+    } else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) {

+        pCS = FX_NEW CPDF_ICCBasedCS();

+    } else if (id == FXBSTR_ID('I', 'n', 'd', 'e') || id == FXBSTR_ID('I', 0, 0, 0)) {

+        pCS = FX_NEW CPDF_IndexedCS();

+    } else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) {

+        pCS = FX_NEW CPDF_SeparationCS();

+    } else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) {

+        pCS = FX_NEW CPDF_DeviceNCS();

+    } else if (id == FXBSTR_ID('P', 'a', 't', 't')) {

+        pCS = FX_NEW CPDF_PatternCS();

+    } else {

+        return NULL;

+    }

+    pCS->m_pDocument = pDoc;

+    pCS->m_pArray = pArray;

+    if (!pCS->v_Load(pDoc, pArray)) {

+        pCS->ReleaseCS();

+        return NULL;

+    }

+    return pCS;

+}

+CPDF_ColorSpace::CPDF_ColorSpace()

+{

+    m_Family = 0;

+    m_pArray = NULL;

+    m_dwStdConversion = 0;

+    m_pDocument = NULL;

+}

+void CPDF_ColorSpace::ReleaseCS()

+{

+    if (this == GetStockCS(PDFCS_DEVICERGB)) {

+        return;

+    }

+    if (this == GetStockCS(PDFCS_DEVICEGRAY)) {

+        return;

+    }

+    if (this == GetStockCS(PDFCS_DEVICECMYK)) {

+        return;

+    }

+    if (this == GetStockCS(PDFCS_PATTERN)) {

+        return;

+    }

+    delete this;

+}

+int CPDF_ColorSpace::GetBufSize() const

+{

+    if (m_Family == PDFCS_PATTERN) {

+        return sizeof(PatternValue);

+    }

+    return m_nComponents * sizeof(FX_FLOAT);

+}

+FX_FLOAT* CPDF_ColorSpace::CreateBuf()

+{

+    int size = GetBufSize();

+    FX_BYTE* pBuf = FX_Alloc(FX_BYTE, size);

+    FXSYS_memset32(pBuf, 0, size);

+    return (FX_FLOAT*)pBuf;

+}

+FX_BOOL CPDF_ColorSpace::sRGB() const

+{

+    if (m_Family == PDFCS_DEVICERGB) {

+        return TRUE;

+    }

+    if (m_Family != PDFCS_ICCBASED) {

+        return FALSE;

+    }

+    CPDF_ICCBasedCS* pCS = (CPDF_ICCBasedCS*)this;

+    return pCS->m_pProfile->m_bsRGB;

+}

+FX_BOOL CPDF_ColorSpace::GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const

+{

+    if (v_GetCMYK(pBuf, c, m, y, k)) {

+        return TRUE;

+    }

+    FX_FLOAT R, G, B;

+    if (!GetRGB(pBuf, R, G, B)) {

+        return FALSE;

+    }

+    sRGB_to_AdobeCMYK(R, G, B, c, m, y, k);

+    return TRUE;

+}

+FX_BOOL CPDF_ColorSpace::SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const

+{

+    if (v_SetCMYK(pBuf, c, m, y, k)) {

+        return TRUE;

+    }

+    FX_FLOAT R, G, B;

+    AdobeCMYK_to_sRGB(c, m, y, k, R, G, B);

+    return SetRGB(pBuf, R, G, B);

+}

+void CPDF_ColorSpace::GetDefaultColor(FX_FLOAT* buf) const

+{

+    if (buf == NULL || m_Family == PDFCS_PATTERN) {

+        return;

+    }

+    FX_FLOAT min, max;

+    for (int i = 0; i < m_nComponents; i ++) {

+        GetDefaultValue(i, buf[i], min, max);

+    }

+}

+int CPDF_ColorSpace::GetMaxIndex() const

+{

+    if (m_Family != PDFCS_INDEXED) {

+        return 0;

+    }

+    CPDF_IndexedCS* pCS = (CPDF_IndexedCS*)this;

+    return pCS->m_MaxIndex;

+}

+void CPDF_ColorSpace::TranslateImageLine(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const

+{

+    CFX_FixedBufGrow<FX_FLOAT, 16> srcbuf(m_nComponents);

+    FX_FLOAT* src = srcbuf;

+    FX_FLOAT R, G, B;

+    for (int i = 0; i < pixels; i ++) {

+        for (int j = 0; j < m_nComponents; j ++)

+            if (m_Family == PDFCS_INDEXED) {

+                src[j] = (FX_FLOAT)(*src_buf ++);

+            } else {

+                src[j] = (FX_FLOAT)(*src_buf ++) / 255;

+            }

+        GetRGB(src, R, G, B);

+        *dest_buf ++ = (FX_INT32)(B * 255);

+        *dest_buf ++ = (FX_INT32)(G * 255);

+        *dest_buf ++ = (FX_INT32)(R * 255);

+    }

+}

+void CPDF_ColorSpace::EnableStdConversion(FX_BOOL bEnabled)

+{

+    if (bEnabled) {

+        m_dwStdConversion ++;

+    } else if (m_dwStdConversion) {

+        m_dwStdConversion --;

+    }

+}

+CPDF_Color::CPDF_Color(int family)

+{

+    m_pCS = CPDF_ColorSpace::GetStockCS(family);

+    int nComps = 3;

+    if (family == PDFCS_DEVICEGRAY) {

+        nComps = 1;

+    } else if (family == PDFCS_DEVICECMYK) {

+        nComps = 4;

+    }

+    m_pBuffer = FX_Alloc(FX_FLOAT, nComps);

+    for (int i = 0; i < nComps; i ++) {

+        m_pBuffer[i] = 0;

+    }

+}

+CPDF_Color::~CPDF_Color()

+{

+    ReleaseBuffer();

+    ReleaseColorSpace();

+}

+void CPDF_Color::ReleaseBuffer()

+{

+    if (!m_pBuffer) {

+        return;

+    }

+    if (m_pCS->GetFamily() == PDFCS_PATTERN) {

+        PatternValue* pvalue = (PatternValue*)m_pBuffer;

+        CPDF_Pattern* pPattern = pvalue->m_pPattern;

+        if (pPattern && pPattern->m_pDocument) {

+            pPattern->m_pDocument->GetPageData()->ReleasePattern(pPattern->m_pPatternObj);

+        }

+    }

+    FX_Free(m_pBuffer);

+    m_pBuffer = NULL;

+}

+void CPDF_Color::ReleaseColorSpace()

+{

+    if (m_pCS && m_pCS->m_pDocument && m_pCS->GetArray()) {

+        m_pCS->m_pDocument->GetPageData()->ReleaseColorSpace(m_pCS->GetArray());

+        m_pCS = NULL;

+    }

+}

+void CPDF_Color::SetColorSpace(CPDF_ColorSpace* pCS)

+{

+    if (m_pCS == pCS) {

+        if (m_pBuffer == NULL) {

+            m_pBuffer = pCS->CreateBuf();

+        }

+        ReleaseColorSpace();

+        m_pCS = pCS;

+        return;

+    }

+    ReleaseBuffer();

+    ReleaseColorSpace();

+    m_pCS = pCS;

+    if (m_pCS) {

+        m_pBuffer = pCS->CreateBuf();

+        pCS->GetDefaultColor(m_pBuffer);

+    }

+}

+void CPDF_Color::SetValue(FX_FLOAT* comps)

+{

+    if (m_pBuffer == NULL) {

+        return;

+    }

+    if (m_pCS->GetFamily() != PDFCS_PATTERN) {

+        FXSYS_memcpy32(m_pBuffer, comps, m_pCS->CountComponents() * sizeof(FX_FLOAT));

+    }

+}

+void CPDF_Color::SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comps, int ncomps)

+{

+    if (ncomps > MAX_PATTERN_COLORCOMPS) {

+        return;

+    }

+    if (m_pCS == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {

+        if (m_pBuffer) {

+            FX_Free(m_pBuffer);

+        }

+        m_pCS = CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);

+        m_pBuffer = m_pCS->CreateBuf();

+    }

+    CPDF_DocPageData* pDocPageData = NULL;

+    PatternValue* pvalue = (PatternValue*)m_pBuffer;

+    if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {

+        pDocPageData = pvalue->m_pPattern->m_pDocument->GetPageData();

+        pDocPageData->ReleasePattern(pvalue->m_pPattern->m_pPatternObj);

+    }

+    pvalue->m_nComps = ncomps;

+    pvalue->m_pPattern = pPattern;

+    if (ncomps) {

+        FXSYS_memcpy32(pvalue->m_Comps, comps, ncomps * sizeof(FX_FLOAT));

+    }

+}

+void CPDF_Color::Copy(const CPDF_Color* pSrc)

+{

+    ReleaseBuffer();

+    ReleaseColorSpace();

+    m_pCS = pSrc->m_pCS;

+    if (m_pCS && m_pCS->m_pDocument) {

+        CPDF_Array* pArray = m_pCS->GetArray();

+        if (pArray) {

+            m_pCS = m_pCS->m_pDocument->GetPageData()->GetCopiedColorSpace(pArray);

+        }

+    }

+    if (m_pCS == NULL) {

+        return;

+    }

+    m_pBuffer = m_pCS->CreateBuf();

+    FXSYS_memcpy32(m_pBuffer, pSrc->m_pBuffer, m_pCS->GetBufSize());

+    if (m_pCS->GetFamily() == PDFCS_PATTERN) {

+        PatternValue* pvalue = (PatternValue*)m_pBuffer;

+        if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {

+            pvalue->m_pPattern = pvalue->m_pPattern->m_pDocument->GetPageData()->GetPattern(pvalue->m_pPattern->m_pPatternObj, FALSE, &pvalue->m_pPattern->m_ParentMatrix);

+        }

+    }

+}

+FX_BOOL CPDF_Color::GetRGB(int& R, int& G, int& B) const

+{

+    if (m_pCS == NULL || m_pBuffer == NULL) {

+        return FALSE;

+    }

+    FX_FLOAT r, g, b;

+    if (!m_pCS->GetRGB(m_pBuffer, r, g, b)) {

+        return FALSE;

+    }

+    R = (FX_INT32)(r * 255 + 0.5f);

+    G = (FX_INT32)(g * 255 + 0.5f);

+    B = (FX_INT32)(b * 255 + 0.5f);

+    return TRUE;

+}

+CPDF_Pattern* CPDF_Color::GetPattern() const

+{

+    if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {

+        return NULL;

+    }

+    PatternValue* pvalue = (PatternValue*)m_pBuffer;

+    return pvalue->m_pPattern;

+}

+CPDF_ColorSpace* CPDF_Color::GetPatternCS() const

+{

+    if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {

+        return NULL;

+    }

+    return m_pCS->GetBaseCS();

+}

+FX_FLOAT* CPDF_Color::GetPatternColor() const

+{

+    if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {

+        return NULL;

+    }

+    PatternValue* pvalue = (PatternValue*)m_pBuffer;

+    return pvalue->m_nComps ? pvalue->m_Comps : NULL;

+}

+FX_BOOL CPDF_Color::IsEqual(const CPDF_Color& other) const

+{

+    if (m_pCS != other.m_pCS || m_pCS == NULL) {

+        return FALSE;

+    }

+    return FXSYS_memcmp32(m_pBuffer, other.m_pBuffer, m_pCS->GetBufSize()) == 0;

+}

diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
new file mode 100644
index 0000000..d4e5bef
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
@@ -0,0 +1,647 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fdrm/fx_crypt.h"

+#include "../fpdf_font/font_int.h"

+#include "pageint.h"

+class CPDF_PageModule : public CPDF_PageModuleDef

+{

+public:

+    CPDF_PageModule() : m_StockGrayCS(PDFCS_DEVICEGRAY), m_StockRGBCS(PDFCS_DEVICERGB),

+        m_StockCMYKCS(PDFCS_DEVICECMYK) {}

+    virtual ~CPDF_PageModule() {}

+    virtual FX_BOOL		Installed()

+    {

+        return TRUE;

+    }

+    virtual CPDF_DocPageData*	CreateDocData(CPDF_Document* pDoc)

+    {

+        return FX_NEW CPDF_DocPageData(pDoc);

+    }

+    virtual void		ReleaseDoc(CPDF_Document* pDoc);

+    virtual void		ClearDoc(CPDF_Document* pDoc);

+    virtual CPDF_FontGlobals*	GetFontGlobals()

+    {

+        return &m_FontGlobals;

+    }

+    virtual void				ClearStockFont(CPDF_Document* pDoc)

+    {

+        m_FontGlobals.Clear(pDoc);

+    }

+    virtual CPDF_ColorSpace*	GetStockCS(int family);

+    virtual void		NotifyCJKAvailable();

+    CPDF_FontGlobals	m_FontGlobals;

+    CPDF_DeviceCS		m_StockGrayCS;

+    CPDF_DeviceCS		m_StockRGBCS;

+    CPDF_DeviceCS		m_StockCMYKCS;

+    CPDF_PatternCS		m_StockPatternCS;

+};

+CPDF_ColorSpace* CPDF_PageModule::GetStockCS(int family)

+{

+    if (family == PDFCS_DEVICEGRAY) {

+        return &m_StockGrayCS;

+    }

+    if (family == PDFCS_DEVICERGB) {

+        return &m_StockRGBCS;

+    }

+    if (family == PDFCS_DEVICECMYK) {

+        return &m_StockCMYKCS;

+    }

+    if (family == PDFCS_PATTERN) {

+        return &m_StockPatternCS;

+    }

+    return NULL;

+}

+void CPDF_ModuleMgr::InitPageModule()

+{

+    if (m_pPageModule) {

+        delete m_pPageModule;

+    }

+    CPDF_PageModule* pPageModule = FX_NEW CPDF_PageModule;

+    m_pPageModule = pPageModule;

+}

+void CPDF_PageModule::ReleaseDoc(CPDF_Document* pDoc)

+{

+    delete pDoc->GetPageData();

+}

+void CPDF_PageModule::ClearDoc(CPDF_Document* pDoc)

+{

+    pDoc->GetPageData()->Clear(FALSE);

+}

+void CPDF_PageModule::NotifyCJKAvailable()

+{

+    m_FontGlobals.m_CMapManager.ReloadAll();

+}

+CPDF_Font* CPDF_Document::LoadFont(CPDF_Dictionary* pFontDict)

+{

+    if (!pFontDict) {

+        return NULL;

+    }

+    return GetValidatePageData()->GetFont(pFontDict, FALSE);

+}

+CPDF_Font* CPDF_Document::FindFont(CPDF_Dictionary* pFontDict)

+{

+    if (!pFontDict) {

+        return NULL;

+    }

+    return GetValidatePageData()->GetFont(pFontDict, TRUE);

+}

+CPDF_StreamAcc* CPDF_Document::LoadFontFile(CPDF_Stream* pStream)

+{

+    if (pStream == NULL) {

+        return NULL;

+    }

+    return GetValidatePageData()->GetFontFileStreamAcc(pStream);

+}

+CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name);

+CPDF_ColorSpace* CPDF_Document::LoadColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources)

+{

+    return GetValidatePageData()->GetColorSpace(pCSObj, pResources);

+}

+CPDF_Pattern* CPDF_Document::LoadPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix)

+{

+    return GetValidatePageData()->GetPattern(pPatternObj, bShading, matrix);

+}

+CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream, int nComponents)

+{

+    return GetValidatePageData()->GetIccProfile(pStream, nComponents);

+}

+CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj)

+{

+    if (!pObj) {

+        return NULL;

+    }

+    FXSYS_assert(pObj->GetObjNum());

+    return GetValidatePageData()->GetImage(pObj);

+}

+void CPDF_Document::RemoveColorSpaceFromPageData(CPDF_Object* pCSObj)

+{

+    if (!pCSObj) {

+        return;

+    }

+    GetPageData()->ReleaseColorSpace(pCSObj);

+}

+CPDF_DocPageData::CPDF_DocPageData(CPDF_Document *pPDFDoc)

+    : m_pPDFDoc(pPDFDoc)

+    , m_FontMap()

+    , m_ColorSpaceMap()

+    , m_PatternMap()

+    , m_ImageMap()

+    , m_IccProfileMap()

+    , m_FontFileMap()

+{

+    m_FontMap.InitHashTable(64);

+    m_ColorSpaceMap.InitHashTable(32);

+    m_PatternMap.InitHashTable(16);

+    m_ImageMap.InitHashTable(64);

+    m_IccProfileMap.InitHashTable(16);

+    m_FontFileMap.InitHashTable(32);

+}

+CPDF_DocPageData::~CPDF_DocPageData()

+{

+    Clear(FALSE);

+    Clear(TRUE);

+    FX_POSITION pos = NULL;

+}

+void CPDF_DocPageData::Clear(FX_BOOL bRelease)

+{

+    FX_POSITION pos;

+    FX_DWORD	nCount;

+    {

+        pos = m_PatternMap.GetStartPosition();

+        while (pos) {

+            CPDF_Object* ptObj;

+            CPDF_CountedObject<CPDF_Pattern*>* ptData;

+            m_PatternMap.GetNextAssoc(pos, ptObj, ptData);

+            nCount = ptData->m_nCount;

+            if (bRelease || nCount < 2) {

+                delete ptData->m_Obj;

+                ptData->m_Obj = NULL;

+            }

+        }

+    }

+    {

+        pos = m_FontMap.GetStartPosition();

+        while (pos) {

+            CPDF_Dictionary* fontDict;

+            CPDF_CountedObject<CPDF_Font*>* fontData;

+            m_FontMap.GetNextAssoc(pos, fontDict, fontData);

+            nCount = fontData->m_nCount;

+            if (bRelease || nCount < 2) {

+                delete fontData->m_Obj;

+                fontData->m_Obj = NULL;

+            }

+        }

+    }

+    {

+        pos = m_ImageMap.GetStartPosition();

+        while (pos) {

+            FX_DWORD objNum;

+            CPDF_CountedObject<CPDF_Image*>* imageData;

+            m_ImageMap.GetNextAssoc(pos, objNum, imageData);

+            nCount = imageData->m_nCount;

+            if (bRelease || nCount < 2) {

+                delete imageData->m_Obj;

+                delete imageData;

+                m_ImageMap.RemoveKey(objNum);

+            }

+        }

+    }

+    {

+        pos = m_ColorSpaceMap.GetStartPosition();

+        while (pos) {

+            CPDF_Object* csKey;

+            CPDF_CountedObject<CPDF_ColorSpace*>* csData;

+            m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData);

+            nCount = csData->m_nCount;

+            if (bRelease || nCount < 2) {

+                csData->m_Obj->ReleaseCS();

+                csData->m_Obj = NULL;

+            }

+        }

+    }

+    {

+        pos = m_IccProfileMap.GetStartPosition();

+        while (pos) {

+            CPDF_Stream* ipKey;

+            CPDF_CountedObject<CPDF_IccProfile*>* ipData;

+            m_IccProfileMap.GetNextAssoc(pos, ipKey, ipData);

+            nCount = ipData->m_nCount;

+            if (bRelease || nCount < 2) {

+                FX_POSITION pos2 = m_HashProfileMap.GetStartPosition();

+                while (pos2) {

+                    CFX_ByteString bsKey;

+                    CPDF_Stream* pFindStream = NULL;

+                    m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream);

+                    if (ipKey == pFindStream) {

+                        m_HashProfileMap.RemoveKey(bsKey);

+                        break;

+                    }

+                }

+                delete ipData->m_Obj;

+                delete ipData;

+                m_IccProfileMap.RemoveKey(ipKey);

+            }

+        }

+    }

+    {

+        pos = m_FontFileMap.GetStartPosition();

+        while (pos) {

+            CPDF_Stream* ftKey;

+            CPDF_CountedObject<CPDF_StreamAcc*>* ftData;

+            m_FontFileMap.GetNextAssoc(pos, ftKey, ftData);

+            nCount = ftData->m_nCount;

+            if (bRelease || nCount < 2) {

+                delete ftData->m_Obj;

+                delete ftData;

+                m_FontFileMap.RemoveKey(ftKey);

+            }

+        }

+    }

+}

+CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly)

+{

+    if (!pFontDict) {

+        return NULL;

+    }

+    if (findOnly) {

+        CPDF_CountedObject<CPDF_Font*>* fontData;

+        if (m_FontMap.Lookup(pFontDict, fontData)) {

+            if (!fontData->m_Obj) {

+                return NULL;

+            }

+            fontData->m_nCount ++;

+            return fontData->m_Obj;

+        }

+        return NULL;

+    }

+    CPDF_CountedObject<CPDF_Font*>* fontData = NULL;

+    if (m_FontMap.Lookup(pFontDict, fontData)) {

+        if (fontData->m_Obj) {

+            fontData->m_nCount ++;

+            return fontData->m_Obj;

+        }

+    }

+    FX_BOOL bNew = FALSE;

+    if (!fontData) {

+        fontData = FX_NEW CPDF_CountedObject<CPDF_Font*>;

+        bNew = TRUE;

+        if (!fontData) {

+            return NULL;

+        }

+    }

+    CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pFontDict);

+    if (!pFont) {

+        if (bNew) {

+            delete fontData;

+        }

+        return NULL;

+    }

+    fontData->m_nCount = 2;

+    fontData->m_Obj = pFont;

+    m_FontMap.SetAt(pFontDict, fontData);

+    return pFont;

+}

+CPDF_Font* CPDF_DocPageData::GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding)

+{

+    if (fontName.IsEmpty()) {

+        return NULL;

+    }

+    FX_POSITION pos = m_FontMap.GetStartPosition();

+    while (pos) {

+        CPDF_Dictionary* fontDict;

+        CPDF_CountedObject<CPDF_Font*>* fontData;

+        m_FontMap.GetNextAssoc(pos, fontDict, fontData);

+        CPDF_Font* pFont = fontData->m_Obj;

+        if (!pFont) {

+            continue;

+        }

+        if (pFont->GetBaseFont() != fontName) {

+            continue;

+        }

+        if (pFont->IsEmbedded()) {

+            continue;

+        }

+        if (pFont->GetFontType() != PDFFONT_TYPE1) {

+            continue;

+        }

+        if (pFont->GetFontDict()->KeyExist(FX_BSTRC("Widths"))) {

+            continue;

+        }

+        CPDF_Type1Font* pT1Font = pFont->GetType1Font();

+        if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding)) {

+            continue;

+        }

+        fontData->m_nCount ++;

+        return pFont;

+    }

+    CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;

+    pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font"));

+    pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1"));

+    pDict->SetAtName(FX_BSTRC("BaseFont"), fontName);

+    if (pEncoding) {

+        pDict->SetAt(FX_BSTRC("Encoding"), pEncoding->Realize());

+    }

+    m_pPDFDoc->AddIndirectObject(pDict);

+    CPDF_CountedObject<CPDF_Font*>* fontData = FX_NEW CPDF_CountedObject<CPDF_Font*>;

+    if (!fontData) {

+        return NULL;

+    }

+    CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pDict);

+    if (!pFont) {

+        delete fontData;

+        return NULL;

+    }

+    fontData->m_nCount = 2;

+    fontData->m_Obj = pFont;

+    m_FontMap.SetAt(pDict, fontData);

+    return pFont;

+}

+void CPDF_DocPageData::ReleaseFont(CPDF_Dictionary* pFontDict)

+{

+    if (!pFontDict) {

+        return;

+    }

+    CPDF_CountedObject<CPDF_Font*>* fontData;

+    if (!m_FontMap.Lookup(pFontDict, fontData)) {

+        return;

+    }

+    if (fontData->m_Obj && --fontData->m_nCount == 0) {

+        delete fontData->m_Obj;

+        fontData->m_Obj = NULL;

+    }

+}

+CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources)

+{

+    if (!pCSObj) {

+        return NULL;

+    }

+    if (pCSObj->GetType() == PDFOBJ_NAME) {

+        CFX_ByteString name = pCSObj->GetConstString();

+        CPDF_ColorSpace* pCS = _CSFromName(name);

+        if (!pCS && pResources) {

+            CPDF_Dictionary* pList = pResources->GetDict(FX_BSTRC("ColorSpace"));

+            if (pList) {

+                pCSObj = pList->GetElementValue(name);

+                return GetColorSpace(pCSObj, NULL);

+            }

+        }

+        if (pCS == NULL || pResources == NULL) {

+            return pCS;

+        }

+        CPDF_Dictionary* pColorSpaces = pResources->GetDict(FX_BSTRC("ColorSpace"));

+        if (pColorSpaces == NULL) {

+            return pCS;

+        }

+        CPDF_Object* pDefaultCS = NULL;

+        switch (pCS->GetFamily()) {

+            case PDFCS_DEVICERGB:

+                pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultRGB"));

+                break;

+            case PDFCS_DEVICEGRAY:

+                pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultGray"));

+                break;

+            case PDFCS_DEVICECMYK:

+                pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultCMYK"));

+                break;

+        }

+        if (pDefaultCS == NULL) {

+            return pCS;

+        }

+        return GetColorSpace(pDefaultCS, NULL);

+    }

+    if (pCSObj->GetType() != PDFOBJ_ARRAY) {

+        return NULL;

+    }

+    CPDF_Array* pArray = (CPDF_Array*)pCSObj;

+    if (pArray->GetCount() == 0) {

+        return NULL;

+    }

+    if (pArray->GetCount() == 1) {

+        return GetColorSpace(pArray->GetElementValue(0), pResources);

+    }

+    CPDF_CountedObject<CPDF_ColorSpace*>* csData = NULL;

+    if (m_ColorSpaceMap.Lookup(pCSObj, csData)) {

+        if (csData->m_Obj) {

+            csData->m_nCount++;

+            return csData->m_Obj;

+        }

+    }

+    FX_BOOL bNew = FALSE;

+    if (!csData) {

+        csData = FX_NEW CPDF_CountedObject<CPDF_ColorSpace*>;

+        if (!csData) {

+            return NULL;

+        }

+        bNew = TRUE;

+    }

+    CPDF_ColorSpace* pCS = CPDF_ColorSpace::Load(m_pPDFDoc, pArray);

+    if (!pCS) {

+        if (bNew) {

+            delete csData;

+        }

+        return NULL;

+    }

+    csData->m_nCount = 2;

+    csData->m_Obj = pCS;

+    m_ColorSpaceMap.SetAt(pCSObj, csData);

+    return pCS;

+}

+CPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj)

+{

+    if (!pCSObj) {

+        return NULL;

+    }

+    CPDF_CountedObject<CPDF_ColorSpace*>* csData;

+    if (!m_ColorSpaceMap.Lookup(pCSObj, csData)) {

+        return NULL;

+    }

+    if (!csData->m_Obj) {

+        return NULL;

+    }

+    csData->m_nCount ++;

+    return csData->m_Obj;

+}

+void CPDF_DocPageData::ReleaseColorSpace(CPDF_Object* pColorSpace)

+{

+    if (!pColorSpace) {

+        return;

+    }

+    CPDF_CountedObject<CPDF_ColorSpace*>* csData;

+    if (!m_ColorSpaceMap.Lookup(pColorSpace, csData)) {

+        return;

+    }

+    if (csData->m_Obj && --csData->m_nCount == 0) {

+        csData->m_Obj->ReleaseCS();

+        csData->m_Obj = NULL;

+    }

+}

+CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix)

+{

+    if (!pPatternObj) {

+        return NULL;

+    }

+    CPDF_CountedObject<CPDF_Pattern*>* ptData = NULL;

+    if (m_PatternMap.Lookup(pPatternObj, ptData)) {

+        if (ptData->m_Obj) {

+            ptData->m_nCount++;

+            return ptData->m_Obj;

+        }

+    }

+    FX_BOOL bNew = FALSE;

+    if (!ptData) {

+        ptData = FX_NEW CPDF_CountedObject<CPDF_Pattern*>;

+        bNew = TRUE;

+        if (!ptData) {

+            return NULL;

+        }

+    }

+    CPDF_Pattern* pPattern = NULL;

+    if (bShading) {

+        pPattern = FX_NEW CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, bShading, matrix);

+    } else {

+        CPDF_Dictionary* pDict = pPatternObj->GetDict();

+        if (pDict) {

+            int type = pDict->GetInteger(FX_BSTRC("PatternType"));

+            if (type == 1) {

+                pPattern = FX_NEW CPDF_TilingPattern(m_pPDFDoc, pPatternObj, matrix);

+            } else if (type == 2) {

+                pPattern = FX_NEW CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, FALSE, matrix);

+            }

+        }

+    }

+    if (!pPattern) {

+        if (bNew) {

+            delete ptData;

+        }

+        return NULL;

+    }

+    ptData->m_nCount = 2;

+    ptData->m_Obj = pPattern;

+    m_PatternMap.SetAt(pPatternObj, ptData);

+    return pPattern;

+}

+void CPDF_DocPageData::ReleasePattern(CPDF_Object* pPatternObj)

+{

+    if (!pPatternObj) {

+        return;

+    }

+    CPDF_CountedObject<CPDF_Pattern*>* ptData;

+    if (!m_PatternMap.Lookup(pPatternObj, ptData)) {

+        return;

+    }

+    if (ptData->m_Obj && --ptData->m_nCount == 0) {

+        delete ptData->m_Obj;

+        ptData->m_Obj = NULL;

+    }

+}

+CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream)

+{

+    if (!pImageStream) {

+        return NULL;

+    }

+    FX_DWORD dwImageObjNum = pImageStream->GetObjNum();

+    CPDF_CountedObject<CPDF_Image*>* imageData;

+    if (m_ImageMap.Lookup(dwImageObjNum, imageData)) {

+        imageData->m_nCount ++;

+        return imageData->m_Obj;

+    }

+    imageData = FX_NEW CPDF_CountedObject<CPDF_Image*>;

+    if (!imageData) {

+        return NULL;

+    }

+    CPDF_Image* pImage = FX_NEW CPDF_Image(m_pPDFDoc);

+    if (!pImage) {

+        delete imageData;

+        return NULL;

+    }

+    pImage->LoadImageF((CPDF_Stream*)pImageStream, FALSE);

+    imageData->m_nCount = 2;

+    imageData->m_Obj = pImage;

+    m_ImageMap.SetAt(dwImageObjNum, imageData);

+    return pImage;

+}

+void CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream)

+{

+    if (!pImageStream) {

+        return;

+    }

+    PDF_DocPageData_Release<FX_DWORD, CPDF_Image*>(m_ImageMap, pImageStream->GetObjNum(), NULL);

+}

+CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents)

+{

+    if (!pIccProfileStream) {

+        return NULL;

+    }

+    CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL;

+    if (m_IccProfileMap.Lookup(pIccProfileStream, ipData)) {

+        ipData->m_nCount++;

+        return ipData->m_Obj;

+    }

+    CPDF_StreamAcc stream;

+    stream.LoadAllData(pIccProfileStream, FALSE);

+    FX_BYTE digest[20];

+    CPDF_Stream* pCopiedStream = NULL;

+    CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest);

+    if (m_HashProfileMap.Lookup(CFX_ByteStringC(digest, 20), (void*&)pCopiedStream)) {

+        m_IccProfileMap.Lookup(pCopiedStream, ipData);

+        ipData->m_nCount++;

+        return ipData->m_Obj;

+    }

+    CPDF_IccProfile* pProfile = FX_NEW CPDF_IccProfile(stream.GetData(), stream.GetSize(), nComponents);

+    if (!pProfile) {

+        return NULL;

+    }

+    ipData = FX_NEW CPDF_CountedObject<CPDF_IccProfile*>;

+    if (!ipData) {

+        delete pProfile;

+        return NULL;

+    }

+    ipData->m_nCount = 2;

+    ipData->m_Obj = pProfile;

+    m_IccProfileMap.SetAt(pIccProfileStream, ipData);

+    m_HashProfileMap.SetAt(CFX_ByteStringC(digest, 20), pIccProfileStream);

+    return pProfile;

+}

+void CPDF_DocPageData::ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile)

+{

+    if (!pIccProfileStream && !pIccProfile) {

+        return;

+    }

+    CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL;

+    if (m_IccProfileMap.Lookup(pIccProfileStream, ipData) && ipData->m_nCount < 2) {

+        FX_POSITION pos = m_HashProfileMap.GetStartPosition();

+        while (pos) {

+            CFX_ByteString key;

+            CPDF_Stream* pFindStream = NULL;

+            m_HashProfileMap.GetNextAssoc(pos, key, (void*&)pFindStream);

+            if (pIccProfileStream == pFindStream) {

+                m_HashProfileMap.RemoveKey(key);

+                break;

+            }

+        }

+    }

+    PDF_DocPageData_Release<CPDF_Stream*, CPDF_IccProfile*>(m_IccProfileMap, pIccProfileStream, pIccProfile);

+}

+CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc(CPDF_Stream* pFontStream)

+{

+    if (!pFontStream) {

+        return NULL;

+    }

+    CPDF_CountedObject<CPDF_StreamAcc*>* ftData;

+    if (m_FontFileMap.Lookup(pFontStream, ftData)) {

+        ftData->m_nCount ++;

+        return ftData->m_Obj;

+    }

+    ftData = FX_NEW CPDF_CountedObject<CPDF_StreamAcc*>;

+    if (!ftData) {

+        return NULL;

+    }

+    CPDF_StreamAcc* pFontFile = FX_NEW CPDF_StreamAcc;

+    if (!pFontFile) {

+        delete ftData;

+        return NULL;

+    }

+    CPDF_Dictionary* pFontDict = pFontStream->GetDict();

+    FX_INT32 org_size = pFontDict->GetInteger(FX_BSTRC("Length1")) + pFontDict->GetInteger(FX_BSTRC("Length2")) + pFontDict->GetInteger(FX_BSTRC("Length3"));

+    if (org_size < 0) {

+        org_size = 0;

+    }

+    pFontFile->LoadAllData(pFontStream, FALSE, org_size);

+    ftData->m_nCount = 2;

+    ftData->m_Obj = pFontFile;

+    m_FontFileMap.SetAt(pFontStream, ftData);

+    return pFontFile;

+}

+void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce)

+{

+    if (!pFontStream) {

+        return;

+    }

+    PDF_DocPageData_Release<CPDF_Stream*, CPDF_StreamAcc*>(m_FontFileMap, pFontStream, NULL, bForce);

+}

diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp
new file mode 100644
index 0000000..335460f
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp
@@ -0,0 +1,886 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "pageint.h"

+#include <limits.h>

+class CPDF_PSEngine;

+typedef enum {PSOP_ADD, PSOP_SUB, PSOP_MUL, PSOP_DIV, PSOP_IDIV, PSOP_MOD,

+              PSOP_NEG, PSOP_ABS, PSOP_CEILING, PSOP_FLOOR, PSOP_ROUND, PSOP_TRUNCATE,

+              PSOP_SQRT, PSOP_SIN, PSOP_COS, PSOP_ATAN, PSOP_EXP, PSOP_LN, PSOP_LOG,

+              PSOP_CVI, PSOP_CVR, PSOP_EQ, PSOP_NE, PSOP_GT, PSOP_GE, PSOP_LT, PSOP_LE,

+              PSOP_AND, PSOP_OR, PSOP_XOR, PSOP_NOT, PSOP_BITSHIFT, PSOP_TRUE, PSOP_FALSE,

+              PSOP_IF, PSOP_IFELSE, PSOP_POP, PSOP_EXCH, PSOP_DUP, PSOP_COPY,

+              PSOP_INDEX, PSOP_ROLL, PSOP_PROC, PSOP_CONST

+             } PDF_PSOP;

+class CPDF_PSProc : public CFX_Object

+{

+public:

+    ~CPDF_PSProc();

+    FX_BOOL	Parse(CPDF_SimpleParser& parser);

+    FX_BOOL	Execute(CPDF_PSEngine* pEngine);

+    CFX_PtrArray		m_Operators;

+};

+#define PSENGINE_STACKSIZE 100

+class CPDF_PSEngine : public CFX_Object

+{

+public:

+    CPDF_PSEngine();

+    ~CPDF_PSEngine();

+    FX_BOOL	Parse(const FX_CHAR* string, int size);

+    FX_BOOL	Execute()

+    {

+        return m_MainProc.Execute(this);

+    }

+    FX_BOOL	DoOperator(PDF_PSOP op);

+    void	Reset()

+    {

+        m_StackCount = 0;

+    }

+    void	Push(FX_FLOAT value);

+    void	Push(int value)

+    {

+        Push((FX_FLOAT)value);

+    }

+    FX_FLOAT	Pop();

+    int		GetStackSize()

+    {

+        return m_StackCount;

+    }

+private:

+    FX_FLOAT	m_Stack[PSENGINE_STACKSIZE];

+    int		m_StackCount;

+    CPDF_PSProc	m_MainProc;

+};

+CPDF_PSProc::~CPDF_PSProc()

+{

+    int size = m_Operators.GetSize();

+    for (int i = 0; i < size; i ++) {

+        if (m_Operators[i] == (FX_LPVOID)PSOP_PROC) {

+            delete (CPDF_PSProc*)m_Operators[i + 1];

+            i ++;

+        } else if (m_Operators[i] == (FX_LPVOID)PSOP_CONST) {

+            FX_Free((FX_FLOAT*)m_Operators[i + 1]);

+            i ++;

+        }

+    }

+}

+#pragma optimize( "", off )

+FX_BOOL CPDF_PSProc::Execute(CPDF_PSEngine* pEngine)

+{

+    int size = m_Operators.GetSize();

+    for (int i = 0; i < size; i ++) {

+        PDF_PSOP op = (PDF_PSOP)(FX_UINTPTR)m_Operators[i];

+        if (op == PSOP_PROC) {

+            i ++;

+        } else if (op == PSOP_CONST) {

+            pEngine->Push(*(FX_FLOAT*)m_Operators[i + 1]);

+            i ++;

+        } else if (op == PSOP_IF) {

+            if (i < 2 || m_Operators[i - 2] != (FX_LPVOID)PSOP_PROC) {

+                return FALSE;

+            }

+            if ((int)pEngine->Pop()) {

+                ((CPDF_PSProc*)m_Operators[i - 1])->Execute(pEngine);

+            }

+        } else if (op == PSOP_IFELSE) {

+            if (i < 4 || m_Operators[i - 2] != (FX_LPVOID)PSOP_PROC ||

+                    m_Operators[i - 4] != (FX_LPVOID)PSOP_PROC) {

+                return FALSE;

+            }

+            if ((int)pEngine->Pop()) {

+                ((CPDF_PSProc*)m_Operators[i - 3])->Execute(pEngine);

+            } else {

+                ((CPDF_PSProc*)m_Operators[i - 1])->Execute(pEngine);

+            }

+        } else {

+            pEngine->DoOperator(op);

+        }

+    }

+    return TRUE;

+}

+#pragma optimize( "", on )

+CPDF_PSEngine::CPDF_PSEngine()

+{

+    m_StackCount = 0;

+}

+CPDF_PSEngine::~CPDF_PSEngine()

+{

+}

+void CPDF_PSEngine::Push(FX_FLOAT v)

+{

+    if (m_StackCount == 100) {

+        return;

+    }

+    m_Stack[m_StackCount++] = v;

+}

+FX_FLOAT CPDF_PSEngine::Pop()

+{

+    if (m_StackCount == 0) {

+        return 0;

+    }

+    return m_Stack[--m_StackCount];

+}

+const struct _PDF_PSOpName {

+    const FX_CHAR* name;

+    PDF_PSOP op;

+} _PDF_PSOpNames[] = {

+    {"add", PSOP_ADD}, {"sub", PSOP_SUB}, {"mul", PSOP_MUL}, {"div", PSOP_DIV},

+    {"idiv", PSOP_IDIV}, {"mod", PSOP_MOD}, {"neg", PSOP_NEG}, {"abs", PSOP_ABS},

+    {"ceiling", PSOP_CEILING}, {"floor", PSOP_FLOOR}, {"round", PSOP_ROUND},

+    {"truncate", PSOP_TRUNCATE}, {"sqrt", PSOP_SQRT}, {"sin", PSOP_SIN},

+    {"cos", PSOP_COS}, {"atan", PSOP_ATAN}, {"exp", PSOP_EXP}, {"ln", PSOP_LN},

+    {"log", PSOP_LOG}, {"cvi", PSOP_CVI}, {"cvr", PSOP_CVR}, {"eq", PSOP_EQ},

+    {"ne", PSOP_NE}, {"gt", PSOP_GT}, {"ge", PSOP_GE}, {"lt", PSOP_LT},

+    {"le", PSOP_LE}, {"and", PSOP_AND}, {"or", PSOP_OR}, {"xor", PSOP_XOR},

+    {"not", PSOP_NOT}, {"bitshift", PSOP_BITSHIFT}, {"true", PSOP_TRUE},

+    {"false", PSOP_FALSE}, {"if", PSOP_IF}, {"ifelse", PSOP_IFELSE},

+    {"pop", PSOP_POP}, {"exch", PSOP_EXCH}, {"dup", PSOP_DUP},

+    {"copy", PSOP_COPY}, {"index", PSOP_INDEX}, {"roll", PSOP_ROLL},

+    {NULL, PSOP_PROC}

+};

+FX_BOOL CPDF_PSEngine::Parse(const FX_CHAR* string, int size)

+{

+    CPDF_SimpleParser parser((FX_LPBYTE)string, size);

+    CFX_ByteStringC word = parser.GetWord();

+    if (word != FX_BSTRC("{")) {

+        return FALSE;

+    }

+    return m_MainProc.Parse(parser);

+}

+FX_BOOL CPDF_PSProc::Parse(CPDF_SimpleParser& parser)

+{

+    while (1) {

+        CFX_ByteStringC word = parser.GetWord();

+        if (word.IsEmpty()) {

+            return FALSE;

+        }

+        if (word == FX_BSTRC("}")) {

+            return TRUE;

+        }

+        if (word == FX_BSTRC("{")) {

+            CPDF_PSProc* pProc = FX_NEW CPDF_PSProc;

+            m_Operators.Add((FX_LPVOID)PSOP_PROC);

+            m_Operators.Add(pProc);

+            if (!pProc->Parse(parser)) {

+                return FALSE;

+            }

+        } else {

+            int i = 0;

+            while (_PDF_PSOpNames[i].name) {

+                if (word == CFX_ByteStringC(_PDF_PSOpNames[i].name)) {

+                    m_Operators.Add((FX_LPVOID)_PDF_PSOpNames[i].op);

+                    break;

+                }

+                i ++;

+            }

+            if (_PDF_PSOpNames[i].name == NULL) {

+                FX_FLOAT* pd = FX_Alloc(FX_FLOAT, 1);

+                *pd = FX_atof(word);

+                m_Operators.Add((FX_LPVOID)PSOP_CONST);

+                m_Operators.Add(pd);

+            }

+        }

+    }

+}

+#define PI 3.1415926535897932384626433832795f

+FX_BOOL CPDF_PSEngine::DoOperator(PDF_PSOP op)

+{

+    int i1, i2;

+    FX_FLOAT d1, d2;

+    switch (op) {

+        case PSOP_ADD:

+            d1 = Pop();

+            d2 = Pop();

+            Push(d1 + d2);

+            break;

+        case PSOP_SUB:

+            d2 = Pop();

+            d1 = Pop();

+            Push(d1 - d2);

+            break;

+        case PSOP_MUL:

+            d1 = Pop();

+            d2 = Pop();

+            Push(d1 * d2);

+            break;

+        case PSOP_DIV:

+            d2 = Pop();

+            d1 = Pop();

+            Push(d1 / d2);

+            break;

+        case PSOP_IDIV:

+            i2 = (int)Pop();

+            i1 = (int)Pop();

+            Push(i1 / i2);

+            break;

+        case PSOP_MOD:

+            i2 = (int)Pop();

+            i1 = (int)Pop();

+            Push(i1 % i2);

+            break;

+        case PSOP_NEG:

+            d1 = Pop();

+            Push(-d1);

+            break;

+        case PSOP_ABS:

+            d1 = Pop();

+            Push((FX_FLOAT)FXSYS_fabs(d1));

+            break;

+        case PSOP_CEILING:

+            d1 = Pop();

+            Push((FX_FLOAT)FXSYS_ceil(d1));

+            break;

+        case PSOP_FLOOR:

+            d1 = Pop();

+            Push((FX_FLOAT)FXSYS_floor(d1));

+            break;

+        case PSOP_ROUND:

+            d1 = Pop();

+            Push(FXSYS_round(d1));

+            break;

+        case PSOP_TRUNCATE:

+            i1 = (int)Pop();

+            Push(i1);

+            break;

+        case PSOP_SQRT:

+            d1 = Pop();

+            Push((FX_FLOAT)FXSYS_sqrt(d1));

+            break;

+        case PSOP_SIN:

+            d1 = Pop();

+            Push((FX_FLOAT)FXSYS_sin(d1 * PI / 180.0f));

+            break;

+        case PSOP_COS:

+            d1 = Pop();

+            Push((FX_FLOAT)FXSYS_cos(d1 * PI / 180.0f));

+            break;

+        case PSOP_ATAN:

+            d2 = Pop();

+            d1 = Pop();

+            d1 = (FX_FLOAT)(FXSYS_atan2(d1, d2) * 180.0 / PI);

+            if (d1 < 0) {

+                d1 += 360;

+            }

+            Push(d1);

+            break;

+        case PSOP_EXP:

+            d2 = Pop();

+            d1 = Pop();

+            Push((FX_FLOAT)FXSYS_pow(d1, d2));

+            break;

+        case PSOP_LN:

+            d1 = Pop();

+            Push((FX_FLOAT)FXSYS_log(d1));

+            break;

+        case PSOP_LOG:

+            d1 = Pop();

+            Push((FX_FLOAT)FXSYS_log10(d1));

+            break;

+        case PSOP_CVI:

+            i1 = (int)Pop();

+            Push(i1);

+            break;

+        case PSOP_CVR:

+            break;

+        case PSOP_EQ:

+            d2 = Pop();

+            d1 = Pop();

+            Push((int)(d1 == d2));

+            break;

+        case PSOP_NE:

+            d2 = Pop();

+            d1 = Pop();

+            Push((int)(d1 != d2));

+            break;

+        case PSOP_GT:

+            d2 = Pop();

+            d1 = Pop();

+            Push((int)(d1 > d2));

+            break;

+        case PSOP_GE:

+            d2 = Pop();

+            d1 = Pop();

+            Push((int)(d1 >= d2));

+            break;

+        case PSOP_LT:

+            d2 = Pop();

+            d1 = Pop();

+            Push((int)(d1 < d2));

+            break;

+        case PSOP_LE:

+            d2 = Pop();

+            d1 = Pop();

+            Push((int)(d1 <= d2));

+            break;

+        case PSOP_AND:

+            i1 = (int)Pop();

+            i2 = (int)Pop();

+            Push(i1 & i2);

+            break;

+        case PSOP_OR:

+            i1 = (int)Pop();

+            i2 = (int)Pop();

+            Push(i1 | i2);

+            break;

+        case PSOP_XOR:

+            i1 = (int)Pop();

+            i2 = (int)Pop();

+            Push(i1 ^ i2);

+            break;

+        case PSOP_NOT:

+            i1 = (int)Pop();

+            Push((int)!i1);

+            break;

+        case PSOP_BITSHIFT: {

+                int shift = (int)Pop();

+                int i = (int)Pop();

+                if (shift > 0) {

+                    Push(i << shift);

+                } else {

+                    Push(i >> -shift);

+                }

+                break;

+            }

+        case PSOP_TRUE:

+            Push(1);

+            break;

+        case PSOP_FALSE:

+            Push(0);

+            break;

+        case PSOP_POP:

+            Pop();

+            break;

+        case PSOP_EXCH:

+            d2 = Pop();

+            d1 = Pop();

+            Push(d2);

+            Push(d1);

+            break;

+        case PSOP_DUP:

+            d1 = Pop();

+            Push(d1);

+            Push(d1);

+            break;

+        case PSOP_COPY: {

+                int n = (int)Pop();

+                if (n < 0 || n > PSENGINE_STACKSIZE || m_StackCount + n > PSENGINE_STACKSIZE || n > m_StackCount) {

+                    break;

+                }

+                for (int i = 0; i < n; i ++) {

+                    m_Stack[m_StackCount + i] = m_Stack[m_StackCount + i - n];

+                }

+                m_StackCount += n;

+                break;

+            }

+        case PSOP_INDEX: {

+                int n = (int)Pop();

+                if (n < 0 || n >= m_StackCount) {

+                    break;

+                }

+                Push(m_Stack[m_StackCount - n - 1]);

+                break;

+            }

+        case PSOP_ROLL: {

+                int j = (int)Pop();

+                int n = (int)Pop();

+                if (m_StackCount == 0) {

+                    break;

+                }

+                if (n < 0 || n > m_StackCount) {

+                    break;

+                }

+                if (j < 0)

+                    for (int i = 0; i < -j; i ++) {

+                        FX_FLOAT first = m_Stack[m_StackCount - n];

+                        for (int ii = 0; ii < n - 1; ii ++) {

+                            m_Stack[m_StackCount - n + ii] = m_Stack[m_StackCount - n + ii + 1];

+                        }

+                        m_Stack[m_StackCount - 1] = first;

+                    }

+                else

+                    for (int i = 0; i < j; i ++) {

+                        FX_FLOAT last = m_Stack[m_StackCount - 1];

+                        int ii;

+                        for (ii = 0; ii < n - 1; ii ++) {

+                            m_Stack[m_StackCount - ii - 1] = m_Stack[m_StackCount - ii - 2];

+                        }

+                        m_Stack[m_StackCount - ii - 1] = last;

+                    }

+                break;

+            }

+        default:

+            break;

+    }

+    return TRUE;

+}

+static FX_FLOAT PDF_Interpolate(FX_FLOAT x, FX_FLOAT xmin, FX_FLOAT xmax, FX_FLOAT ymin, FX_FLOAT ymax)

+{

+    return ((x - xmin) * (ymax - ymin) / (xmax - xmin)) + ymin;

+}

+static FX_DWORD _GetBits32(FX_LPCBYTE pData, int bitpos, int nbits)

+{

+    int result = 0;

+    for (int i = 0; i < nbits; i ++)

+        if (pData[(bitpos + i) / 8] & (1 << (7 - (bitpos + i) % 8))) {

+            result |= 1 << (nbits - i - 1);

+        }

+    return result;

+}

+typedef struct {

+    FX_FLOAT	encode_max, encode_min;

+    int			sizes;

+} SampleEncodeInfo;

+typedef struct {

+    FX_FLOAT	decode_max, decode_min;

+} SampleDecodeInfo;

+class CPDF_SampledFunc : public CPDF_Function

+{

+public:

+    CPDF_SampledFunc();

+    virtual ~CPDF_SampledFunc();

+    virtual FX_BOOL		v_Init(CPDF_Object* pObj);

+    virtual FX_BOOL		v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;

+    SampleEncodeInfo*	m_pEncodeInfo;

+    SampleDecodeInfo*	m_pDecodeInfo;

+    FX_DWORD	m_nBitsPerSample, m_SampleMax;

+    CPDF_StreamAcc*	m_pSampleStream;

+};

+CPDF_SampledFunc::CPDF_SampledFunc()

+{

+    m_pSampleStream = NULL;

+    m_pEncodeInfo = NULL;

+    m_pDecodeInfo = NULL;

+}

+CPDF_SampledFunc::~CPDF_SampledFunc()

+{

+    if (m_pSampleStream) {

+        delete m_pSampleStream;

+    }

+    if (m_pEncodeInfo) {

+        FX_Free(m_pEncodeInfo);

+    }

+    if (m_pDecodeInfo) {

+        FX_Free(m_pDecodeInfo);

+    }

+}

+FX_BOOL CPDF_SampledFunc::v_Init(CPDF_Object* pObj)

+{

+    if (pObj->GetType() != PDFOBJ_STREAM) {

+        return FALSE;

+    }

+    CPDF_Stream* pStream = (CPDF_Stream*)pObj;

+    CPDF_Dictionary* pDict = pStream->GetDict();

+    CPDF_Array* pSize = pDict->GetArray(FX_BSTRC("Size"));

+    CPDF_Array* pEncode = pDict->GetArray(FX_BSTRC("Encode"));

+    CPDF_Array* pDecode = pDict->GetArray(FX_BSTRC("Decode"));

+    m_nBitsPerSample = pDict->GetInteger(FX_BSTRC("BitsPerSample"));

+    m_SampleMax = 0xffffffff >> (32 - m_nBitsPerSample);

+    m_pSampleStream = FX_NEW CPDF_StreamAcc;

+    m_pSampleStream->LoadAllData(pStream, FALSE);

+    m_pEncodeInfo = FX_Alloc(SampleEncodeInfo, m_nInputs);

+    int i;

+    FX_DWORD nTotalSamples = 1;

+    for (i = 0; i < m_nInputs; i ++) {

+        m_pEncodeInfo[i].sizes = pSize->GetInteger(i);

+        if (!pSize && i == 0) {

+            m_pEncodeInfo[i].sizes = pDict->GetInteger(FX_BSTRC("Size"));

+        }

+        if (nTotalSamples > 0 && (FX_UINT32)(m_pEncodeInfo[i].sizes) > UINT_MAX / nTotalSamples) {

+            return FALSE;

+        }

+        nTotalSamples *= m_pEncodeInfo[i].sizes;

+        if (pEncode) {

+            m_pEncodeInfo[i].encode_min = pEncode->GetFloat(i * 2);

+            m_pEncodeInfo[i].encode_max = pEncode->GetFloat(i * 2 + 1);

+        } else {

+            m_pEncodeInfo[i].encode_min = 0;

+            if (m_pEncodeInfo[i].sizes == 1) {

+                m_pEncodeInfo[i].encode_max = 1;

+            } else {

+                m_pEncodeInfo[i].encode_max = (FX_FLOAT)m_pEncodeInfo[i].sizes - 1;

+            }

+        }

+    }

+    if (nTotalSamples > 0 && m_nBitsPerSample > UINT_MAX / nTotalSamples) {

+        return FALSE;

+    }

+    nTotalSamples *= m_nBitsPerSample;

+    if (nTotalSamples > 0 && ((FX_UINT32)m_nOutputs) > UINT_MAX / nTotalSamples) {

+        return FALSE;

+    }

+    nTotalSamples *= m_nOutputs;

+    if (nTotalSamples == 0 || m_pSampleStream->GetSize() * 8 < nTotalSamples) {

+        return FALSE;

+    }

+    m_pDecodeInfo = FX_Alloc(SampleDecodeInfo, m_nOutputs);

+    for (i = 0; i < m_nOutputs; i ++) {

+        if (pDecode) {

+            m_pDecodeInfo[i].decode_min = pDecode->GetFloat(2 * i);

+            m_pDecodeInfo[i].decode_max = pDecode->GetFloat(2 * i + 1);

+        } else {

+            m_pDecodeInfo[i].decode_min = m_pRanges[i * 2];

+            m_pDecodeInfo[i].decode_max = m_pRanges[i * 2 + 1];

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_SampledFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const

+{

+    int pos = 0;

+    CFX_FixedBufGrow<FX_FLOAT, 16> encoded_input_buf(m_nInputs);

+    FX_FLOAT* encoded_input = encoded_input_buf;

+    CFX_FixedBufGrow<int, 32> int_buf(m_nInputs * 2);

+    int* index = int_buf;

+    int* blocksize = index + m_nInputs;

+    for (int i = 0; i < m_nInputs; i ++) {

+        if (i == 0) {

+            blocksize[i] = 1;

+        } else {

+            blocksize[i] = blocksize[i - 1] * m_pEncodeInfo[i - 1].sizes;

+        }

+        encoded_input[i] = PDF_Interpolate(inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1],

+                                           m_pEncodeInfo[i].encode_min, m_pEncodeInfo[i].encode_max);

+        index[i] = (int)encoded_input[i];

+        if (index[i] < 0) {

+            index[i] = 0;

+        } else if (index[i] > m_pEncodeInfo[i].sizes - 1) {

+            index[i] = m_pEncodeInfo[i].sizes - 1;

+        }

+        pos += index[i] * blocksize[i];

+    }

+    int bitpos = pos * m_nBitsPerSample * m_nOutputs;

+    FX_LPCBYTE pSampleData = m_pSampleStream->GetData();

+    if (pSampleData == NULL) {

+        return FALSE;

+    }

+    for (int j = 0; j < m_nOutputs; j ++) {

+        FX_DWORD sample = _GetBits32(pSampleData, bitpos + j * m_nBitsPerSample, m_nBitsPerSample);

+        FX_FLOAT encoded = (FX_FLOAT)sample;

+        for (int i = 0; i < m_nInputs; i ++) {

+            if (index[i] == m_pEncodeInfo[i].sizes - 1) {

+                if (index[i] == 0) {

+                    encoded = encoded_input[i] * (FX_FLOAT)sample;

+                }

+            } else {

+                int bitpos1 = bitpos + m_nBitsPerSample * m_nOutputs * blocksize[i];

+                FX_DWORD sample1 = _GetBits32(pSampleData, bitpos1 + j * m_nBitsPerSample, m_nBitsPerSample);

+                encoded += (encoded_input[i] - index[i]) * ((FX_FLOAT)sample1 - (FX_FLOAT)sample);

+            }

+        }

+        results[j] = PDF_Interpolate(encoded, 0, (FX_FLOAT)m_SampleMax,

+                                     m_pDecodeInfo[j].decode_min, m_pDecodeInfo[j].decode_max);

+    }

+    return TRUE;

+}

+class CPDF_PSFunc : public CPDF_Function

+{

+public:

+    virtual FX_BOOL		v_Init(CPDF_Object* pObj);

+    virtual FX_BOOL		v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;

+    CPDF_PSEngine m_PS;

+};

+FX_BOOL CPDF_PSFunc::v_Init(CPDF_Object* pObj)

+{

+    CPDF_Stream* pStream = (CPDF_Stream*)pObj;

+    CPDF_StreamAcc acc;

+    acc.LoadAllData(pStream, FALSE);

+    return m_PS.Parse((const FX_CHAR*)acc.GetData(), acc.GetSize());

+}

+FX_BOOL CPDF_PSFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const

+{

+    CPDF_PSEngine& PS = (CPDF_PSEngine&)m_PS;

+    PS.Reset();

+    int i;

+    for (i = 0; i < m_nInputs; i ++) {

+        PS.Push(inputs[i]);

+    }

+    PS.Execute();

+    if (PS.GetStackSize() < m_nOutputs) {

+        return FALSE;

+    }

+    for (i = 0; i < m_nOutputs; i ++) {

+        results[m_nOutputs - i - 1] = PS.Pop();

+    }

+    return TRUE;

+}

+class CPDF_ExpIntFunc : public CPDF_Function

+{

+public:

+    CPDF_ExpIntFunc();

+    virtual ~CPDF_ExpIntFunc();

+    virtual FX_BOOL		v_Init(CPDF_Object* pObj);

+    virtual FX_BOOL		v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;

+    FX_FLOAT	m_Exponent;

+    FX_FLOAT*	m_pBeginValues;

+    FX_FLOAT*	m_pEndValues;

+    int		m_nOrigOutputs;

+};

+CPDF_ExpIntFunc::CPDF_ExpIntFunc()

+{

+    m_pBeginValues = NULL;

+    m_pEndValues = NULL;

+}

+CPDF_ExpIntFunc::~CPDF_ExpIntFunc()

+{

+    if (m_pBeginValues) {

+        FX_Free(m_pBeginValues);

+    }

+    if (m_pEndValues) {

+        FX_Free(m_pEndValues);

+    }

+}

+FX_BOOL CPDF_ExpIntFunc::v_Init(CPDF_Object* pObj)

+{

+    CPDF_Dictionary* pDict = pObj->GetDict();

+    if (pDict == NULL) {

+        return FALSE;

+    }

+    CPDF_Array* pArray0 = pDict->GetArray(FX_BSTRC("C0"));

+    if (m_nOutputs == 0) {

+        m_nOutputs = 1;

+        if (pArray0) {

+            m_nOutputs = pArray0->GetCount();

+        }

+    }

+    CPDF_Array* pArray1 = pDict->GetArray(FX_BSTRC("C1"));

+    m_pBeginValues = FX_Alloc(FX_FLOAT, m_nOutputs * 2);

+    m_pEndValues = FX_Alloc(FX_FLOAT, m_nOutputs * 2);

+    for (int i = 0; i < m_nOutputs; i ++) {

+        m_pBeginValues[i] = pArray0 ? pArray0->GetFloat(i) : 0.0f;

+        m_pEndValues[i] = pArray1 ? pArray1->GetFloat(i) : 1.0f;

+    }

+    m_Exponent = pDict->GetFloat(FX_BSTRC("N"));

+    m_nOrigOutputs = m_nOutputs;

+    if (m_nOutputs && m_nInputs > INT_MAX / m_nOutputs) {

+        return FALSE;

+    }

+    m_nOutputs *= m_nInputs;

+    return TRUE;

+}

+FX_BOOL CPDF_ExpIntFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const

+{

+    for (int i = 0; i < m_nInputs; i ++)

+        for (int j = 0; j < m_nOrigOutputs; j ++) {

+            results[i * m_nOrigOutputs + j] = m_pBeginValues[j] + (FX_FLOAT)FXSYS_pow(inputs[i], m_Exponent) *

+                                              (m_pEndValues[j] - m_pBeginValues[j]);

+        }

+    return TRUE;

+}

+class CPDF_StitchFunc : public CPDF_Function

+{

+public:

+    CPDF_StitchFunc();

+    virtual ~CPDF_StitchFunc();

+    virtual FX_BOOL		v_Init(CPDF_Object* pObj);

+    virtual FX_BOOL		v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;

+    int			m_nSubs;

+    CPDF_Function** m_pSubFunctions;

+    FX_FLOAT*	m_pBounds;

+    FX_FLOAT*	m_pEncode;

+};

+CPDF_StitchFunc::CPDF_StitchFunc()

+{

+    m_nSubs = 0;

+    m_pSubFunctions = NULL;

+    m_pBounds = NULL;

+    m_pEncode = NULL;

+}

+CPDF_StitchFunc::~CPDF_StitchFunc()

+{

+    for (int i = 0; i < m_nSubs; i ++)

+        if (m_pSubFunctions[i]) {

+            delete m_pSubFunctions[i];

+        }

+    if (m_pSubFunctions) {

+        FX_Free(m_pSubFunctions);

+    }

+    if (m_pBounds) {

+        FX_Free(m_pBounds);

+    }

+    if (m_pEncode) {

+        FX_Free(m_pEncode);

+    }

+}

+FX_BOOL CPDF_StitchFunc::v_Init(CPDF_Object* pObj)

+{

+    CPDF_Dictionary* pDict = pObj->GetDict();

+    if (pDict == NULL) {

+        return FALSE;

+    }

+    CPDF_Array* pArray = pDict->GetArray(FX_BSTRC("Functions"));

+    if (pArray == NULL) {

+        return FALSE;

+    }

+    m_nSubs = pArray->GetCount();

+    if (m_nSubs == 0) {

+        return FALSE;

+    }

+    m_pSubFunctions = FX_Alloc(CPDF_Function*, m_nSubs);

+    FXSYS_memset32(m_pSubFunctions, 0, sizeof(CPDF_Function*)*m_nSubs);

+    m_nOutputs = 0;

+    int i;

+    for (i = 0; i < m_nSubs; i ++) {

+        CPDF_Object* pSub = pArray->GetElementValue(i);

+        if (pSub == pObj) {

+            return FALSE;

+        }

+        m_pSubFunctions[i] = CPDF_Function::Load(pSub);

+        if (m_pSubFunctions[i] == NULL) {

+            return FALSE;

+        }

+        if (m_pSubFunctions[i]->CountOutputs() > m_nOutputs) {

+            m_nOutputs = m_pSubFunctions[i]->CountOutputs();

+        }

+    }

+    m_pBounds = FX_Alloc(FX_FLOAT, m_nSubs + 1);

+    m_pBounds[0] = m_pDomains[0];

+    pArray = pDict->GetArray(FX_BSTRC("Bounds"));

+    if (pArray == NULL) {

+        return FALSE;

+    }

+    for (i = 0; i < m_nSubs - 1; i ++) {

+        m_pBounds[i + 1] = pArray->GetFloat(i);

+    }

+    m_pBounds[m_nSubs] = m_pDomains[1];

+    m_pEncode = FX_Alloc(FX_FLOAT, m_nSubs * 2);

+    pArray = pDict->GetArray(FX_BSTRC("Encode"));

+    if (pArray == NULL) {

+        return FALSE;

+    }

+    for (i = 0; i < m_nSubs * 2; i ++) {

+        m_pEncode[i] = pArray->GetFloat(i);

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_StitchFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* outputs) const

+{

+    FX_FLOAT input = inputs[0];

+    int i;

+    for (i = 0; i < m_nSubs - 1; i ++)

+        if (input < m_pBounds[i + 1]) {

+            break;

+        }

+    if (m_pSubFunctions[i] == NULL) {

+        return FALSE;

+    }

+    input = PDF_Interpolate(input, m_pBounds[i], m_pBounds[i + 1], m_pEncode[i * 2], m_pEncode[i * 2 + 1]);

+    int nresults;

+    m_pSubFunctions[i]->Call(&input, m_nInputs, outputs, nresults);

+    return TRUE;

+}

+CPDF_Function* CPDF_Function::Load(CPDF_Object* pFuncObj)

+{

+    if (pFuncObj == NULL) {

+        return NULL;

+    }

+    CPDF_Function* pFunc = NULL;

+    int type;

+    if (pFuncObj->GetType() == PDFOBJ_STREAM) {

+        type = ((CPDF_Stream*)pFuncObj)->GetDict()->GetInteger(FX_BSTRC("FunctionType"));

+    } else if (pFuncObj->GetType() == PDFOBJ_DICTIONARY) {

+        type = ((CPDF_Dictionary*)pFuncObj)->GetInteger(FX_BSTRC("FunctionType"));

+    } else {

+        return NULL;

+    }

+    if (type == 0) {

+        pFunc = FX_NEW CPDF_SampledFunc;

+    } else if (type == 2) {

+        pFunc = FX_NEW CPDF_ExpIntFunc;

+    } else if (type == 3) {

+        pFunc = FX_NEW CPDF_StitchFunc;

+    } else if (type == 4) {

+        pFunc = FX_NEW CPDF_PSFunc;

+    } else {

+        return NULL;

+    }

+    if (!pFunc->Init(pFuncObj)) {

+        delete pFunc;

+        return NULL;

+    }

+    return pFunc;

+}

+CPDF_Function::CPDF_Function()

+{

+    m_pDomains = NULL;

+    m_pRanges = NULL;

+}

+CPDF_Function::~CPDF_Function()

+{

+    if (m_pDomains) {

+        FX_Free(m_pDomains);

+        m_pDomains = NULL;

+    }

+    if (m_pRanges) {

+        FX_Free(m_pRanges);

+        m_pRanges = NULL;

+    }

+}

+FX_BOOL CPDF_Function::Init(CPDF_Object* pObj)

+{

+    CPDF_Dictionary* pDict;

+    if (pObj->GetType() == PDFOBJ_STREAM) {

+        pDict = ((CPDF_Stream*)pObj)->GetDict();

+    } else {

+        pDict = (CPDF_Dictionary*)pObj;

+    }

+    CPDF_Array* pDomains = pDict->GetArray(FX_BSTRC("Domain"));

+    if (pDomains == NULL) {

+        return FALSE;

+    }

+    m_nInputs = pDomains->GetCount() / 2;

+    if (m_nInputs == 0) {

+        return FALSE;

+    }

+    m_pDomains = FX_Alloc(FX_FLOAT, m_nInputs * 2);

+    for (int i = 0; i < m_nInputs * 2; i ++) {

+        m_pDomains[i] = pDomains->GetFloat(i);

+    }

+    CPDF_Array* pRanges = pDict->GetArray(FX_BSTRC("Range"));

+    m_nOutputs = 0;

+    if (pRanges) {

+        m_nOutputs = pRanges->GetCount() / 2;

+        m_pRanges = FX_Alloc(FX_FLOAT, m_nOutputs * 2);

+        for (int i = 0; i < m_nOutputs * 2; i ++) {

+            m_pRanges[i] = pRanges->GetFloat(i);

+        }

+    }

+    FX_DWORD old_outputs = m_nOutputs;

+    FX_BOOL ret = v_Init(pObj);

+    if (m_pRanges && m_nOutputs > (int)old_outputs) {

+        m_pRanges = FX_Realloc(FX_FLOAT, m_pRanges, m_nOutputs * 2);

+        if (m_pRanges) {

+            FXSYS_memset32(m_pRanges + (old_outputs * 2), 0, sizeof(FX_FLOAT) * (m_nOutputs - old_outputs) * 2);

+        }

+    }

+    return ret;

+}

+FX_BOOL CPDF_Function::Call(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const

+{

+    if (m_nInputs != ninputs) {

+        return FALSE;

+    }

+    nresults = m_nOutputs;

+    for (int i = 0; i < m_nInputs; i ++) {

+        if (inputs[i] < m_pDomains[i * 2]) {

+            inputs[i] = m_pDomains[i * 2];

+        } else if (inputs[i] > m_pDomains[i * 2 + 1]) {

+            inputs[i] = m_pDomains[i * 2] + 1;

+        }

+    }

+    v_Call(inputs, results);

+    if (m_pRanges) {

+        for (int i = 0; i < m_nOutputs; i ++) {

+            if (results[i] < m_pRanges[i * 2]) {

+                results[i] = m_pRanges[i * 2];

+            } else if (results[i] > m_pRanges[i * 2 + 1]) {

+                results[i] = m_pRanges[i * 2 + 1];

+            }

+        }

+    }

+    return TRUE;

+}

diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
new file mode 100644
index 0000000..e9115e6
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
@@ -0,0 +1,707 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_pageobj.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fpdfapi/fpdf_render.h"

+#include "pageint.h"

+#include "../fpdf_render/render_int.h"

+void CPDF_GraphicStates::DefaultStates()

+{

+    m_ColorState.New()->Default();

+}

+void CPDF_GraphicStates::CopyStates(const CPDF_GraphicStates& src)

+{

+    m_ClipPath = src.m_ClipPath;

+    m_GraphState = src.m_GraphState;

+    m_ColorState = src.m_ColorState;

+    m_TextState = src.m_TextState;

+    m_GeneralState = src.m_GeneralState;

+}

+CPDF_ClipPathData::CPDF_ClipPathData()

+{

+    m_PathCount = 0;

+    m_pPathList = NULL;

+    m_pTypeList = NULL;

+    m_TextCount = 0;

+    m_pTextList = NULL;

+}

+CPDF_ClipPathData::~CPDF_ClipPathData()

+{

+    int i;

+    if (m_pPathList) {

+        FX_DELETE_VECTOR(m_pPathList, CPDF_Path, m_PathCount);

+    }

+    if (m_pTypeList) {

+        FX_Free(m_pTypeList);

+    }

+    for (i = m_TextCount - 1; i > -1; i --)

+        if (m_pTextList[i]) {

+            delete m_pTextList[i];

+        }

+    if (m_pTextList) {

+        FX_Free(m_pTextList);

+    }

+}

+CPDF_ClipPathData::CPDF_ClipPathData(const CPDF_ClipPathData& src)

+{

+    m_pPathList = NULL;

+    m_pPathList = NULL;

+    m_pTextList = NULL;

+    m_PathCount = src.m_PathCount;

+    if (m_PathCount) {

+        int alloc_size = m_PathCount;

+        if (alloc_size % 8) {

+            alloc_size += 8 - (alloc_size % 8);

+        }

+        FX_NEW_VECTOR(m_pPathList, CPDF_Path, alloc_size);

+        for (int i = 0; i < m_PathCount; i ++) {

+            m_pPathList[i] = src.m_pPathList[i];

+        }

+        m_pTypeList = FX_Alloc(FX_BYTE, alloc_size);

+        FXSYS_memcpy32(m_pTypeList, src.m_pTypeList, m_PathCount);

+    } else {

+        m_pPathList = NULL;

+        m_pTypeList = NULL;

+    }

+    m_TextCount = src.m_TextCount;

+    if (m_TextCount) {

+        m_pTextList = FX_Alloc(CPDF_TextObject*, m_TextCount);

+        FXSYS_memset32(m_pTextList, 0, sizeof(CPDF_TextObject*) * m_TextCount);

+        for (int i = 0; i < m_TextCount; i ++) {

+            if (src.m_pTextList[i]) {

+                m_pTextList[i] = FX_NEW CPDF_TextObject;

+                m_pTextList[i]->Copy(src.m_pTextList[i]);

+            } else {

+                m_pTextList[i] = NULL;

+            }

+        }

+    } else {

+        m_pTextList = NULL;

+    }

+}

+void CPDF_ClipPathData::SetCount(int path_count, int text_count)

+{

+    ASSERT(m_TextCount == 0 && m_PathCount == 0);

+    if (path_count) {

+        m_PathCount = path_count;

+        int alloc_size = (path_count + 7) / 8 * 8;

+        FX_NEW_VECTOR(m_pPathList, CPDF_Path, alloc_size);

+        m_pTypeList = FX_Alloc(FX_BYTE, alloc_size);

+    }

+    if (text_count) {

+        m_TextCount = text_count;

+        m_pTextList = FX_Alloc(CPDF_TextObject*, text_count);

+        FXSYS_memset32(m_pTextList, 0, sizeof(void*) * text_count);

+    }

+}

+CPDF_Rect CPDF_ClipPath::GetClipBox() const

+{

+    CPDF_Rect rect;

+    FX_BOOL bStarted = FALSE;

+    int count = GetPathCount();

+    if (count) {

+        rect = GetPath(0).GetBoundingBox();

+        for (int i = 1; i < count; i ++) {

+            CPDF_Rect path_rect = GetPath(i).GetBoundingBox();

+            rect.Intersect(path_rect);

+        }

+        bStarted = TRUE;

+    }

+    count = GetTextCount();

+    if (count) {

+        CPDF_Rect layer_rect;

+        FX_BOOL bLayerStarted = FALSE;

+        for (int i = 0; i < count; i ++) {

+            CPDF_TextObject* pTextObj = GetText(i);

+            if (pTextObj == NULL) {

+                if (!bStarted) {

+                    rect = layer_rect;

+                    bStarted = TRUE;

+                } else {

+                    rect.Intersect(layer_rect);

+                }

+                bLayerStarted = FALSE;

+            } else {

+                if (!bLayerStarted) {

+                    layer_rect = pTextObj->GetBBox(NULL);

+                    bLayerStarted = TRUE;

+                } else {

+                    layer_rect.Union(pTextObj->GetBBox(NULL));

+                }

+            }

+        }

+    }

+    return rect;

+}

+void CPDF_ClipPath::AppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge)

+{

+    CPDF_ClipPathData* pData = GetModify();

+    if (pData->m_PathCount && bAutoMerge) {

+        CPDF_Path old_path = pData->m_pPathList[pData->m_PathCount - 1];

+        if (old_path.IsRect()) {

+            CPDF_Rect old_rect(old_path.GetPointX(0), old_path.GetPointY(0),

+                               old_path.GetPointX(2), old_path.GetPointY(2));

+            CPDF_Rect new_rect = path.GetBoundingBox();

+            if (old_rect.Contains(new_rect)) {

+                pData->m_PathCount --;

+                pData->m_pPathList[pData->m_PathCount].SetNull();

+            }

+        }

+    }

+    if (pData->m_PathCount % 8 == 0) {

+        CPDF_Path* pNewPath;

+        FX_NEW_VECTOR(pNewPath, CPDF_Path, pData->m_PathCount + 8);

+        for (int i = 0; i < pData->m_PathCount; i ++) {

+            pNewPath[i] = pData->m_pPathList[i];

+        }

+        if (pData->m_pPathList) {

+            FX_DELETE_VECTOR(pData->m_pPathList, CPDF_Path, pData->m_PathCount);

+        }

+        FX_BYTE* pNewType = FX_Alloc(FX_BYTE, pData->m_PathCount + 8);

+        FXSYS_memcpy32(pNewType, pData->m_pTypeList, pData->m_PathCount);

+        if (pData->m_pTypeList) {

+            FX_Free(pData->m_pTypeList);

+        }

+        pData->m_pPathList = pNewPath;

+        pData->m_pTypeList = pNewType;

+    }

+    pData->m_pPathList[pData->m_PathCount] = path;

+    pData->m_pTypeList[pData->m_PathCount] = (FX_BYTE)type;

+    pData->m_PathCount ++;

+}

+void CPDF_ClipPath::DeletePath(int index)

+{

+    CPDF_ClipPathData* pData = GetModify();

+    if (index >= pData->m_PathCount) {

+        return;

+    }

+    pData->m_pPathList[index].SetNull();

+    for (int i = index; i < pData->m_PathCount - 1; i ++) {

+        pData->m_pPathList[i] = pData->m_pPathList[i + 1];

+    }

+    pData->m_pPathList[pData->m_PathCount - 1].SetNull();

+    FXSYS_memmove32(pData->m_pTypeList + index, pData->m_pTypeList + index + 1, pData->m_PathCount - index - 1);

+    pData->m_PathCount --;

+}

+#define FPDF_CLIPPATH_MAX_TEXTS 1024

+void CPDF_ClipPath::AppendTexts(CPDF_TextObject** pTexts, int count)

+{

+    CPDF_ClipPathData* pData = GetModify();

+    if (pData->m_TextCount + count > FPDF_CLIPPATH_MAX_TEXTS) {

+        for (int i = 0; i < count; i ++) {

+            pTexts[i]->Release();

+        }

+        return;

+    }

+    CPDF_TextObject** pNewList = FX_Alloc(CPDF_TextObject*, pData->m_TextCount + count + 1);

+    if (pData->m_pTextList) {

+        FXSYS_memcpy32(pNewList, pData->m_pTextList, pData->m_TextCount * sizeof(CPDF_TextObject*));

+        FX_Free(pData->m_pTextList);

+    }

+    pData->m_pTextList = pNewList;

+    for (int i = 0; i < count; i ++) {

+        pData->m_pTextList[pData->m_TextCount + i] = pTexts[i];

+    }

+    pData->m_pTextList[pData->m_TextCount + count] = NULL;

+    pData->m_TextCount += count + 1;

+}

+void CPDF_ClipPath::Transform(const CPDF_Matrix& matrix)

+{

+    CPDF_ClipPathData* pData = GetModify();

+    int i;

+    for (i = 0; i < pData->m_PathCount; i ++) {

+        pData->m_pPathList[i].Transform(&matrix);

+    }

+    for (i = 0; i < pData->m_TextCount; i ++)

+        if (pData->m_pTextList[i]) {

+            pData->m_pTextList[i]->Transform(matrix);

+        }

+}

+CPDF_ColorStateData::CPDF_ColorStateData(const CPDF_ColorStateData& src)

+{

+    m_FillColor.Copy(&src.m_FillColor);

+    m_FillRGB = src.m_FillRGB;

+    m_StrokeColor.Copy(&src.m_StrokeColor);

+    m_StrokeRGB = src.m_StrokeRGB;

+}

+void CPDF_ColorStateData::Default()

+{

+    m_FillRGB = m_StrokeRGB = 0;

+    m_FillColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));

+    m_StrokeColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));

+}

+void CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)

+{

+    CPDF_ColorStateData* pData = GetModify();

+    SetColor(pData->m_FillColor, pData->m_FillRGB, pCS, pValue, nValues);

+}

+void CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)

+{

+    CPDF_ColorStateData* pData = GetModify();

+    SetColor(pData->m_StrokeColor, pData->m_StrokeRGB, pCS, pValue, nValues);

+}

+void CPDF_ColorState::SetColor(CPDF_Color& color, FX_DWORD& rgb, CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)

+{

+    if (pCS) {

+        color.SetColorSpace(pCS);

+    } else if (color.IsNull()) {

+        color.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));

+    }

+    if (color.m_pCS->CountComponents() > nValues) {

+        return;

+    }

+    color.SetValue(pValue);

+    int R, G, B;

+    rgb = color.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;

+}

+void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, int nValues)

+{

+    CPDF_ColorStateData* pData = GetModify();

+    pData->m_FillColor.SetValue(pPattern, pValue, nValues);

+    int R, G, B;

+    FX_BOOL ret = pData->m_FillColor.GetRGB(R, G, B);

+    if (pPattern->m_PatternType == 1 && ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) {

+        pData->m_FillRGB = 0x00BFBFBF;

+        return;

+    }

+    pData->m_FillRGB = ret ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;

+}

+void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, int nValues)

+{

+    CPDF_ColorStateData* pData = GetModify();

+    pData->m_StrokeColor.SetValue(pPattern, pValue, nValues);

+    int R, G, B;

+    FX_BOOL ret = pData->m_StrokeColor.GetRGB(R, G, B);

+    if (pPattern->m_PatternType == 1 && ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) {

+        pData->m_StrokeRGB = 0x00BFBFBF;

+        return;

+    }

+    pData->m_StrokeRGB = pData->m_StrokeColor.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;

+}

+CPDF_TextStateData::CPDF_TextStateData()

+{

+    m_pFont = NULL;

+    m_FontSize = 1.0f;

+    m_WordSpace = 0;

+    m_CharSpace = 0;

+    m_TextMode = 0;

+    m_Matrix[0] = m_Matrix[3] = 1.0f;

+    m_Matrix[1] = m_Matrix[2] = 0;

+    m_CTM[0] = m_CTM[3] = 1.0f;

+    m_CTM[1] = m_CTM[2] = 0;

+}

+CPDF_TextStateData::CPDF_TextStateData(const CPDF_TextStateData& src)

+{

+    FXSYS_memcpy32(this, &src, sizeof(CPDF_TextStateData));

+    if (m_pFont && m_pFont->m_pDocument) {

+        m_pFont = m_pFont->m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE);

+    }

+}

+CPDF_TextStateData::~CPDF_TextStateData()

+{

+    CPDF_Font* pFont = m_pFont;

+    if (pFont && pFont->m_pDocument) {

+        pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict());

+    }

+}

+void CPDF_TextState::SetFont(CPDF_Font* pFont)

+{

+    CPDF_Font*& pStateFont = GetModify()->m_pFont;

+    CPDF_DocPageData* pDocPageData = NULL;

+    if (pStateFont && pStateFont->m_pDocument) {

+        pDocPageData = pStateFont->m_pDocument->GetPageData();

+        pDocPageData->ReleaseFont(pStateFont->GetFontDict());

+    }

+    pStateFont = pFont;

+}

+FX_FLOAT CPDF_TextState::GetFontSizeV() const

+{

+    FX_FLOAT* pMatrix = GetMatrix();

+    FX_FLOAT unit = FXSYS_sqrt2(pMatrix[1], pMatrix[3]);

+    FX_FLOAT size = FXSYS_Mul(unit, GetFontSize());

+    return (FX_FLOAT)FXSYS_fabs(size);

+}

+FX_FLOAT CPDF_TextState::GetFontSizeH() const

+{

+    FX_FLOAT* pMatrix = GetMatrix();

+    FX_FLOAT unit = FXSYS_sqrt2(pMatrix[0], pMatrix[2]);

+    FX_FLOAT size = FXSYS_Mul(unit, GetFontSize());

+    return (FX_FLOAT)FXSYS_fabs(size);

+}

+FX_FLOAT CPDF_TextState::GetBaselineAngle() const

+{

+    FX_FLOAT* m_Matrix = GetMatrix();

+    return FXSYS_atan2(m_Matrix[2], m_Matrix[0]);

+}

+FX_FLOAT CPDF_TextState::GetShearAngle() const

+{

+    FX_FLOAT* m_Matrix = GetMatrix();

+    FX_FLOAT shear_angle = FXSYS_atan2(m_Matrix[1], m_Matrix[3]);

+    return GetBaselineAngle() + shear_angle;

+}

+CPDF_GeneralStateData::CPDF_GeneralStateData()

+{

+    FXSYS_memset32(this, 0, sizeof(CPDF_GeneralStateData));

+    FXSYS_strcpy((FX_LPSTR)m_BlendMode, (FX_LPCSTR)"Normal");

+    m_StrokeAlpha = 1.0f;

+    m_FillAlpha = 1.0f;

+    m_Flatness = 1.0f;

+    m_Matrix.SetIdentity();

+}

+CPDF_GeneralStateData::CPDF_GeneralStateData(const CPDF_GeneralStateData& src)

+{

+    FXSYS_memcpy32(this, &src, sizeof(CPDF_GeneralStateData));

+    if (src.m_pTransferFunc && src.m_pTransferFunc->m_pPDFDoc) {

+        CPDF_DocRenderData* pDocCache = src.m_pTransferFunc->m_pPDFDoc->GetRenderData();

+        if (!pDocCache) {

+            return;

+        }

+        m_pTransferFunc = pDocCache->GetTransferFunc(m_pTR);

+    }

+}

+CPDF_GeneralStateData::~CPDF_GeneralStateData()

+{

+    if (m_pTransferFunc && m_pTransferFunc->m_pPDFDoc) {

+        CPDF_DocRenderData* pDocCache = m_pTransferFunc->m_pPDFDoc->GetRenderData();

+        if (!pDocCache) {

+            return;

+        }

+        pDocCache->ReleaseTransferFunc(m_pTR);

+    }

+}

+static int GetBlendType(FX_BSTR mode)

+{

+    switch (mode.GetID()) {

+        case FXBSTR_ID('N', 'o', 'r', 'm'):

+        case FXBSTR_ID('C', 'o', 'm', 'p'):

+            return FXDIB_BLEND_NORMAL;

+        case FXBSTR_ID('M', 'u', 'l', 't'):

+            return FXDIB_BLEND_MULTIPLY;

+        case FXBSTR_ID('S', 'c', 'r', 'e'):

+            return FXDIB_BLEND_SCREEN;

+        case FXBSTR_ID('O', 'v', 'e', 'r'):

+            return FXDIB_BLEND_OVERLAY;

+        case FXBSTR_ID('D', 'a', 'r', 'k'):

+            return FXDIB_BLEND_DARKEN;

+        case FXBSTR_ID('L', 'i', 'g', 'h'):

+            return FXDIB_BLEND_LIGHTEN;

+        case FXBSTR_ID('C', 'o', 'l', 'o'):

+            if (mode.GetLength() == 10) {

+                return FXDIB_BLEND_COLORDODGE;

+            }

+            if (mode.GetLength() == 9) {

+                return FXDIB_BLEND_COLORBURN;

+            }

+            return FXDIB_BLEND_COLOR;

+        case FXBSTR_ID('H', 'a', 'r', 'd'):

+            return FXDIB_BLEND_HARDLIGHT;

+        case FXBSTR_ID('S', 'o', 'f', 't'):

+            return FXDIB_BLEND_SOFTLIGHT;

+        case FXBSTR_ID('D', 'i', 'f', 'f'):

+            return FXDIB_BLEND_DIFFERENCE;

+        case FXBSTR_ID('E', 'x', 'c', 'l'):

+            return FXDIB_BLEND_EXCLUSION;

+        case FXBSTR_ID('H', 'u', 'e', 0):

+            return FXDIB_BLEND_HUE;

+        case FXBSTR_ID('S', 'a', 't', 'u'):

+            return FXDIB_BLEND_SATURATION;

+        case FXBSTR_ID('L', 'u', 'm', 'i'):

+            return FXDIB_BLEND_LUMINOSITY;

+    }

+    return FXDIB_BLEND_NORMAL;

+}

+void CPDF_GeneralStateData::SetBlendMode(FX_BSTR blend_mode)

+{

+    if (blend_mode.GetLength() > 15) {

+        return;

+    }

+    FXSYS_memcpy32(m_BlendMode, (FX_LPCBYTE)blend_mode, blend_mode.GetLength());

+    m_BlendMode[blend_mode.GetLength()] = 0;

+    m_BlendType = ::GetBlendType(blend_mode);

+}

+int RI_StringToId(const CFX_ByteString& ri)

+{

+    FX_DWORD id = ri.GetID();

+    if (id == FXBSTR_ID('A', 'b', 's', 'o')) {

+        return 1;

+    }

+    if (id == FXBSTR_ID('S', 'a', 't', 'u')) {

+        return 2;

+    }

+    if (id == FXBSTR_ID('P', 'e', 'r', 'c')) {

+        return 3;

+    }

+    return 0;

+}

+void CPDF_GeneralState::SetRenderIntent(const CFX_ByteString& ri)

+{

+    GetModify()->m_RenderIntent = RI_StringToId(ri);

+}

+CPDF_AllStates::CPDF_AllStates()

+{

+    m_TextX = m_TextY = m_TextLineX = m_TextLineY = 0;

+    m_TextLeading = 0;

+    m_TextRise = 0;

+    m_TextHorzScale = 1.0f;

+}

+CPDF_AllStates::~CPDF_AllStates()

+{

+}

+void CPDF_AllStates::Copy(const CPDF_AllStates& src)

+{

+    CopyStates(src);

+    m_TextMatrix.Copy(src.m_TextMatrix);

+    m_ParentMatrix.Copy(src.m_ParentMatrix);

+    m_CTM.Copy(src.m_CTM);

+    m_TextX = src.m_TextX;

+    m_TextY = src.m_TextY;

+    m_TextLineX = src.m_TextLineX;

+    m_TextLineY = src.m_TextLineY;

+    m_TextLeading = src.m_TextLeading;

+    m_TextRise = src.m_TextRise;

+    m_TextHorzScale = src.m_TextHorzScale;

+}

+void CPDF_AllStates::SetLineDash(CPDF_Array* pArray, FX_FLOAT phase, FX_FLOAT scale)

+{

+    CFX_GraphStateData* pData = m_GraphState.GetModify();

+    pData->m_DashPhase = FXSYS_Mul(phase, scale);

+    pData->SetDashCount(pArray->GetCount());

+    for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {

+        pData->m_DashArray[i] = FXSYS_Mul(pArray->GetNumber(i), scale);

+    }

+}

+void CPDF_AllStates::ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser)

+{

+    CPDF_GeneralStateData* pGeneralState = m_GeneralState.GetModify();

+    FX_POSITION pos = pGS->GetStartPos();

+    while (pos) {

+        CFX_ByteString key_str;

+        CPDF_Object* pObject = pGS->GetNextElement(pos, key_str)->GetDirect();

+        if (pObject == NULL) {

+            continue;

+        }

+        FX_DWORD key = key_str.GetID();

+        switch (key) {

+            case FXBSTR_ID('L', 'W', 0, 0):

+                m_GraphState.GetModify()->m_LineWidth = pObject->GetNumber();

+                break;

+            case FXBSTR_ID('L', 'C', 0, 0):

+                m_GraphState.GetModify()->m_LineCap = (CFX_GraphStateData::LineCap)pObject->GetInteger();

+                break;

+            case FXBSTR_ID('L', 'J', 0, 0):

+                m_GraphState.GetModify()->m_LineJoin = (CFX_GraphStateData::LineJoin)pObject->GetInteger();

+                break;

+            case FXBSTR_ID('M', 'L', 0, 0):

+                m_GraphState.GetModify()->m_MiterLimit = pObject->GetNumber();

+                break;

+            case FXBSTR_ID('D', 0, 0, 0):	{

+                    if (pObject->GetType() != PDFOBJ_ARRAY) {

+                        break;

+                    }

+                    CPDF_Array* pDash = (CPDF_Array*)pObject;

+                    CPDF_Array* pArray = pDash->GetArray(0);

+                    if (pArray == NULL) {

+                        break;

+                    }

+                    SetLineDash(pArray, pDash->GetNumber(1), 1.0f);

+                    break;

+                }

+            case FXBSTR_ID('R', 'I', 0, 0):

+                m_GeneralState.SetRenderIntent(pObject->GetString());

+                break;

+            case FXBSTR_ID('F', 'o', 'n', 't'):	{

+                    if (pObject->GetType() != PDFOBJ_ARRAY) {

+                        break;

+                    }

+                    CPDF_Array* pFont = (CPDF_Array*)pObject;

+                    m_TextState.GetModify()->m_FontSize = pFont->GetNumber(1);

+                    m_TextState.SetFont(pParser->FindFont(pFont->GetString(0)));

+                    break;

+                }

+            case FXBSTR_ID('T', 'R', 0, 0):

+                if (pGS->KeyExist(FX_BSTRC("TR2"))) {

+                    continue;

+                }

+            case FXBSTR_ID('T', 'R', '2', 0):

+                if (pObject && pObject->GetType() != PDFOBJ_NAME) {

+                    pGeneralState->m_pTR = pObject;

+                } else {

+                    pGeneralState->m_pTR = NULL;

+                }

+                break;

+            case FXBSTR_ID('B', 'M', 0, 0):	{

+                    CFX_ByteString mode;

+                    if (pObject->GetType() == PDFOBJ_ARRAY) {

+                        mode = ((CPDF_Array*)pObject)->GetString(0);

+                    } else {

+                        mode = pObject->GetString();

+                    }

+                    pGeneralState->SetBlendMode(mode);

+                    if (pGeneralState->m_BlendType > FXDIB_BLEND_MULTIPLY) {

+                        pParser->m_pObjectList->m_bBackgroundAlphaNeeded = TRUE;

+                    }

+                    break;

+                }

+            case FXBSTR_ID('S', 'M', 'a', 's'):

+                if (pObject && pObject->GetType() == PDFOBJ_DICTIONARY) {

+                    pGeneralState->m_pSoftMask = pObject;

+                    FXSYS_memcpy32(pGeneralState->m_SMaskMatrix, &pParser->m_pCurStates->m_CTM, sizeof(CPDF_Matrix));

+                } else {

+                    pGeneralState->m_pSoftMask = NULL;

+                }

+                break;

+            case FXBSTR_ID('C', 'A', 0, 0):

+                pGeneralState->m_StrokeAlpha = PDF_ClipFloat(pObject->GetNumber());

+                break;

+            case FXBSTR_ID('c', 'a', 0, 0):

+                pGeneralState->m_FillAlpha = PDF_ClipFloat(pObject->GetNumber());

+                break;

+            case FXBSTR_ID('O', 'P', 0, 0):

+                pGeneralState->m_StrokeOP = pObject->GetInteger();

+                if (!pGS->KeyExist(FX_BSTRC("op"))) {

+                    pGeneralState->m_FillOP = pObject->GetInteger();

+                }

+                break;

+            case FXBSTR_ID('o', 'p', 0, 0):

+                pGeneralState->m_FillOP = pObject->GetInteger();

+                break;

+            case FXBSTR_ID('O', 'P', 'M', 0):

+                pGeneralState->m_OPMode = pObject->GetInteger();

+                break;

+            case FXBSTR_ID('B', 'G', 0, 0):

+                if (pGS->KeyExist(FX_BSTRC("BG2"))) {

+                    continue;

+                }

+            case FXBSTR_ID('B', 'G', '2', 0):

+                pGeneralState->m_pBG = pObject;

+                break;

+            case FXBSTR_ID('U', 'C', 'R', 0):

+                if (pGS->KeyExist(FX_BSTRC("UCR2"))) {

+                    continue;

+                }

+            case FXBSTR_ID('U', 'C', 'R', '2'):

+                pGeneralState->m_pUCR = pObject;

+                break;

+            case FXBSTR_ID('H', 'T', 0, 0):

+                pGeneralState->m_pHT = pObject;

+                break;

+            case FXBSTR_ID('F', 'L', 0, 0):

+                pGeneralState->m_Flatness = pObject->GetNumber();

+                break;

+            case FXBSTR_ID('S', 'M', 0, 0):

+                pGeneralState->m_Smoothness = pObject->GetNumber();

+                break;

+            case FXBSTR_ID('S', 'A', 0, 0):

+                pGeneralState->m_StrokeAdjust = pObject->GetInteger();

+                break;

+            case FXBSTR_ID('A', 'I', 'S', 0):

+                pGeneralState->m_AlphaSource = pObject->GetInteger();

+                break;

+            case FXBSTR_ID('T', 'K', 0, 0):

+                pGeneralState->m_TextKnockout = pObject->GetInteger();

+                break;

+        }

+    }

+    pGeneralState->m_Matrix = m_CTM;

+}

+CPDF_ContentMarkItem::CPDF_ContentMarkItem()

+{

+    m_ParamType = None;

+}

+CPDF_ContentMarkItem::CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src)

+{

+    m_MarkName = src.m_MarkName;

+    m_ParamType = src.m_ParamType;

+    if (m_ParamType == DirectDict) {

+        m_pParam = ((CPDF_Dictionary*)src.m_pParam)->Clone();

+    } else {

+        m_pParam = src.m_pParam;

+    }

+}

+CPDF_ContentMarkItem::~CPDF_ContentMarkItem()

+{

+    if (m_ParamType == DirectDict) {

+        ((CPDF_Dictionary*)m_pParam)->Release();

+    }

+}

+FX_BOOL	CPDF_ContentMarkItem::HasMCID() const

+{

+    if (m_pParam && (m_ParamType == DirectDict || m_ParamType == PropertiesDict)) {

+        return ((CPDF_Dictionary *)m_pParam)->KeyExist(FX_BSTRC("MCID"));

+    }

+    return FALSE;

+}

+CPDF_ContentMarkData::CPDF_ContentMarkData(const CPDF_ContentMarkData& src)

+{

+    for (int i = 0; i < src.m_Marks.GetSize(); i ++) {

+        m_Marks.Add(src.m_Marks[i]);

+    }

+}

+int CPDF_ContentMarkData::GetMCID() const

+{

+    CPDF_ContentMarkItem::ParamType type = CPDF_ContentMarkItem::None;

+    for (int i = 0; i < m_Marks.GetSize(); i ++) {

+        type = m_Marks[i].GetParamType();

+        if (type == CPDF_ContentMarkItem::PropertiesDict || type == CPDF_ContentMarkItem::DirectDict) {

+            CPDF_Dictionary *pDict = (CPDF_Dictionary *)m_Marks[i].GetParam();

+            if (pDict->KeyExist(FX_BSTRC("MCID"))) {

+                return pDict->GetInteger(FX_BSTRC("MCID"));

+            }

+        }

+    }

+    return -1;

+}

+void CPDF_ContentMarkData::AddMark(const CFX_ByteString& name, CPDF_Dictionary* pDict, FX_BOOL bDirect)

+{

+    CPDF_ContentMarkItem& item = m_Marks.Add();

+    item.SetName(name);

+    if (pDict == NULL) {

+        return;

+    }

+    item.SetParam(bDirect ? CPDF_ContentMarkItem::DirectDict : CPDF_ContentMarkItem::PropertiesDict,

+                  bDirect ? pDict->Clone() : pDict);

+}

+void CPDF_ContentMarkData::DeleteLastMark()

+{

+    int size = m_Marks.GetSize();

+    if (size == 0) {

+        return;

+    }

+    m_Marks.RemoveAt(size - 1);

+}

+FX_BOOL CPDF_ContentMark::HasMark(FX_BSTR mark) const

+{

+    if (m_pObject == NULL) {

+        return FALSE;

+    }

+    for (int i = 0; i < m_pObject->CountItems(); i ++) {

+        CPDF_ContentMarkItem& item = m_pObject->GetItem(i);

+        if (item.GetName() == mark) {

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_ContentMark::LookupMark(FX_BSTR mark, CPDF_Dictionary*& pDict) const

+{

+    if (m_pObject == NULL) {

+        return FALSE;

+    }

+    for (int i = 0; i < m_pObject->CountItems(); i ++) {

+        CPDF_ContentMarkItem& item = m_pObject->GetItem(i);

+        if (item.GetName() == mark) {

+            pDict = NULL;

+            if (item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict ||

+                    item.GetParamType() == CPDF_ContentMarkItem::DirectDict) {

+                pDict = (CPDF_Dictionary*)item.GetParam();

+            }

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
new file mode 100644
index 0000000..ec35105
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
@@ -0,0 +1,116 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_pageobj.h"

+#include "pageint.h"

+CPDF_ImageObject::CPDF_ImageObject()

+{

+    m_pImage = NULL;

+    m_Type = PDFPAGE_IMAGE;

+}

+CPDF_ImageObject::~CPDF_ImageObject()

+{

+    if (!m_pImage) {

+        return;

+    }

+    if (m_pImage->IsInline() || (m_pImage->GetStream() && m_pImage->GetStream()->GetObjNum() == 0)) {

+        delete m_pImage;

+    } else {

+        m_pImage->GetDocument()->GetPageData()->ReleaseImage(m_pImage->GetStream());

+    }

+}

+void CPDF_ImageObject::CopyData(const CPDF_PageObject* pSrc)

+{

+    const CPDF_ImageObject* pSrcObj = (const CPDF_ImageObject*)pSrc;

+    if (m_pImage) {

+        m_pImage->Release();

+    }

+    m_pImage = pSrcObj->m_pImage->Clone();

+    m_Matrix = pSrcObj->m_Matrix;

+}

+void CPDF_ImageObject::Transform(const CFX_AffineMatrix& matrix)

+{

+    m_Matrix.Concat(matrix);

+    CalcBoundingBox();

+}

+void CPDF_ImageObject::CalcBoundingBox()

+{

+    m_Left = m_Bottom = 0;

+    m_Right = m_Top = 1.0f;

+    m_Matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);

+}

+void CPDF_Image::Release()

+{

+    if (m_bInline || (m_pStream && m_pStream->GetObjNum() == 0)) {

+        delete this;

+    }

+}

+CPDF_Image* CPDF_Image::Clone()

+{

+    if (m_pStream->GetObjNum()) {

+        return m_pDocument->GetPageData()->GetImage(m_pStream);

+    }

+    CPDF_Image* pImage = FX_NEW CPDF_Image(m_pDocument);

+    pImage->LoadImageF((CPDF_Stream*)((CPDF_Object*)m_pStream)->Clone(), m_bInline);

+    if (m_bInline) {

+        CPDF_Dictionary *pInlineDict = (CPDF_Dictionary*)m_pInlineDict->Clone(TRUE);

+        pImage->SetInlineDict(pInlineDict);

+    }

+    return pImage;

+}

+CPDF_Image::CPDF_Image(CPDF_Document* pDoc)

+{

+    m_pDocument = pDoc;

+    m_pStream = NULL;

+    m_pOC = NULL;

+    m_bInline = FALSE;

+    m_pInlineDict = NULL;

+    m_pDIBSource = NULL;

+    m_pMask = NULL;

+    m_MatteColor = 0;

+}

+CPDF_Image::~CPDF_Image()

+{

+    if (m_bInline) {

+        if (m_pStream) {

+#ifndef FOXIT_CHROME_BUILD

+            CPDF_Dictionary* pDict = m_pStream->GetDict();

+            if (pDict) {

+                CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));

+                if (pCSObj && m_pDocument) {

+                    m_pDocument->RemoveColorSpaceFromPageData(pCSObj);

+                }

+            }

+#endif

+            m_pStream->Release();

+        }

+        if (m_pInlineDict) {

+            m_pInlineDict->Release();

+        }

+    }

+}

+FX_BOOL CPDF_Image::LoadImageF(CPDF_Stream* pStream, FX_BOOL bInline)

+{

+    m_pStream = pStream;

+    if (m_bInline && m_pInlineDict) {

+        m_pInlineDict->Release();

+        m_pInlineDict = NULL;

+    }

+    m_bInline = bInline;

+    CPDF_Dictionary* pDict = pStream->GetDict();

+    if (m_bInline) {

+        m_pInlineDict = (CPDF_Dictionary*)pDict->Clone();

+    }

+    m_pOC = pDict->GetDict(FX_BSTRC("OC"));

+    m_bIsMask = !pDict->KeyExist(FX_BSTRC("ColorSpace")) || pDict->GetInteger(FX_BSTRC("ImageMask"));

+#ifndef _FPDFAPI_MINI_

+    m_bInterpolate = pDict->GetInteger(FX_BSTRC("Interpolate"));

+#endif

+    m_Height = pDict->GetInteger(FX_BSTRC("Height"));

+    m_Width = pDict->GetInteger(FX_BSTRC("Width"));

+    return TRUE;

+}

diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
new file mode 100644
index 0000000..40f6d04
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -0,0 +1,1681 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fpdfapi/fpdf_serial.h"

+#include "pageint.h"

+#define REQUIRE_PARAMS(count) if (m_ParamCount != count) { m_bAbort = TRUE; return; }

+CPDF_StreamContentParser::CPDF_StreamContentParser()

+{

+    m_DefFontSize = 0;

+    m_pCurStates = NULL;

+    m_pLastTextObject = NULL;

+    m_pPathPoints = NULL;

+    m_PathClipType = 0;

+    m_PathPointCount = m_PathAllocSize = 0;

+    m_PathCurrentX = m_PathCurrentY = 0.0f;

+    m_bResourceMissing = FALSE;

+    m_bColored = FALSE;

+    FXSYS_memset32(m_Type3Data, 0, sizeof(FX_FLOAT) * 6);

+    m_ParamCount = 0;

+    m_ParamStartPos = 0;

+    m_bAbort = FALSE;

+    m_pLastImageDict = NULL;

+    m_pLastCloneImageDict = NULL;

+    m_pLastImage = NULL;

+    m_bReleaseLastDict = TRUE;

+    m_pParentResources = NULL;

+#ifdef _FPDFAPI_MINI_

+    m_pObjectState = NULL;

+    m_pObjectStack = NULL;

+    m_pWordBuf = NULL;

+    m_pDictName = NULL;

+    m_pStreamBuf = NULL;

+    m_WordState = 0;

+    m_ObjectSize = 0;

+#endif

+}

+FX_BOOL CPDF_StreamContentParser::Initialize()

+{

+#ifdef _FPDFAPI_MINI_

+    m_pObjectState = FX_Alloc(FX_BOOL, _FPDF_MAX_OBJECT_STACK_SIZE_);

+    FXSYS_memset32(m_pObjectState, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(FX_BOOL));

+    m_pObjectStack = FX_Alloc(CPDF_Object*, _FPDF_MAX_OBJECT_STACK_SIZE_);

+    FXSYS_memset32(m_pObjectStack, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(CPDF_Object*));

+    m_pWordBuf = FX_Alloc(FX_BYTE, 256);

+    FXSYS_memset32(m_pWordBuf, 0, 256 * sizeof(FX_BYTE));

+    m_pDictName = FX_Alloc(FX_BYTE, 256);

+    FXSYS_memset32(m_pDictName, 0, 256 * sizeof(FX_BYTE));

+    m_pStreamBuf = FX_Alloc(FX_BYTE, STREAM_PARSE_BUFSIZE);

+    FXSYS_memset32(m_pStreamBuf, 0, STREAM_PARSE_BUFSIZE * sizeof(FX_BYTE));

+    m_StringBuf.EstimateSize(1024);

+    m_ObjectSize = 0;

+    m_ImageSrcBuf.EstimateSize(STREAM_PARSE_BUFSIZE);

+#endif

+    return TRUE;

+}

+CPDF_StreamContentParser::~CPDF_StreamContentParser()

+{

+    ClearAllParams();

+    int i = 0;

+    for (i = 0; i < m_StateStack.GetSize(); i ++) {

+        delete (CPDF_AllStates*)m_StateStack[i];

+    }

+    if (m_pPathPoints) {

+        FX_Free(m_pPathPoints);

+    }

+    if (m_pCurStates) {

+        delete m_pCurStates;

+    }

+    if (m_pLastImageDict) {

+        m_pLastImageDict->Release();

+    }

+    if (m_pLastCloneImageDict) {

+        m_pLastCloneImageDict->Release();

+    }

+#ifdef _FPDFAPI_MINI_

+    for (i = 0; i < (int)m_ObjectSize; ++i) {

+        if (!m_pObjectState[i]) {

+            m_pObjectStack[i]->Release();

+        }

+    }

+    FX_Free(m_pObjectStack);

+    FX_Free(m_pObjectState);

+    FX_Free(m_pStreamBuf);

+    FX_Free(m_pWordBuf);

+    FX_Free(m_pDictName);

+#endif

+}

+void CPDF_StreamContentParser::PrepareParse(CPDF_Document* pDocument,

+        CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources, CFX_AffineMatrix* pmtContentToUser, CPDF_PageObjects* pObjList,

+        CPDF_Dictionary* pResources, CPDF_Rect* pBBox, CPDF_ParseOptions* pOptions,

+        CPDF_AllStates* pStates, int level)

+{

+    for (int i = 0; i < 6; i ++) {

+        m_Type3Data[i] = 0;

+    }

+    m_pDocument = pDocument;

+    m_pPageResources = pPageResources;

+    m_pParentResources = pParentResources;

+    if (pmtContentToUser) {

+        m_mtContentToUser = *pmtContentToUser;

+    }

+    if (pOptions) {

+        m_Options = *pOptions;

+    }

+    m_pObjectList = pObjList;

+    m_pResources = pResources;

+    if (pResources == NULL) {

+        m_pResources = m_pParentResources;

+    }

+    if (m_pResources == NULL) {

+        m_pResources = pPageResources;

+    }

+    if (pBBox) {

+        m_BBox = *pBBox;

+    }

+    m_Level = level;

+    m_pCurStates = FX_NEW CPDF_AllStates;

+    if (pStates) {

+        m_pCurStates->Copy(*pStates);

+    } else {

+        m_pCurStates->m_GeneralState.New();

+        m_pCurStates->m_GraphState.New();

+        m_pCurStates->m_TextState.New();

+        m_pCurStates->m_ColorState.New();

+    }

+#ifdef _FPDFAPI_MINI_

+    FXSYS_memset32(m_pObjectState, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(FX_BOOL));

+#endif

+}

+int CPDF_StreamContentParser::GetNextParamPos()

+{

+    if (m_ParamCount == PARAM_BUF_SIZE) {

+        m_ParamStartPos ++;

+        if (m_ParamStartPos == PARAM_BUF_SIZE) {

+            m_ParamStartPos = 0;

+        }

+        if (m_ParamBuf1[m_ParamStartPos].m_Type == 0) {

+            m_ParamBuf1[m_ParamStartPos].m_pObject->Release();

+        }

+        return m_ParamStartPos;

+    }

+    int index = m_ParamStartPos + m_ParamCount;

+    if (index >= PARAM_BUF_SIZE) {

+        index -= PARAM_BUF_SIZE;

+    }

+    m_ParamCount ++;

+    return index;

+}

+void CPDF_StreamContentParser::AddNameParam(FX_LPCSTR name, int len)

+{

+    int index = GetNextParamPos();

+    if (len > 32) {

+        m_ParamBuf1[index].m_Type = 0;

+        m_ParamBuf1[index].m_pObject = CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(name, len)));

+    } else {

+        m_ParamBuf1[index].m_Type = PDFOBJ_NAME;

+        if (FXSYS_memchr(name, '#', len) == NULL) {

+            FXSYS_memcpy32(m_ParamBuf1[index].m_Name.m_Buffer, name, len);

+            m_ParamBuf1[index].m_Name.m_Len = len;

+        } else {

+            CFX_ByteString str = PDF_NameDecode(CFX_ByteStringC(name, len));

+            FXSYS_memcpy32(m_ParamBuf1[index].m_Name.m_Buffer, (FX_LPCSTR)str, str.GetLength());

+            m_ParamBuf1[index].m_Name.m_Len = str.GetLength();

+        }

+    }

+}

+void CPDF_StreamContentParser::AddNumberParam(FX_LPCSTR str, int len)

+{

+    int index = GetNextParamPos();

+    m_ParamBuf1[index].m_Type = PDFOBJ_NUMBER;

+    FX_atonum(CFX_ByteStringC(str, len), m_ParamBuf1[index].m_Number.m_bInteger,

+              &m_ParamBuf1[index].m_Number.m_Integer);

+}

+void CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj)

+{

+    int index = GetNextParamPos();

+    m_ParamBuf1[index].m_Type = 0;

+    m_ParamBuf1[index].m_pObject = pObj;

+}

+void CPDF_StreamContentParser::ClearAllParams()

+{

+    FX_DWORD index = m_ParamStartPos;

+    for (FX_DWORD i = 0; i < m_ParamCount; i ++) {

+        if (m_ParamBuf1[index].m_Type == 0) {

+            m_ParamBuf1[index].m_pObject->Release();

+        }

+        index ++;

+        if (index == PARAM_BUF_SIZE) {

+            index = 0;

+        }

+    }

+    m_ParamStartPos = 0;

+    m_ParamCount = 0;

+}

+CPDF_Object* CPDF_StreamContentParser::GetObject(FX_DWORD index)

+{

+    if (index >= m_ParamCount) {

+        return NULL;

+    }

+    int real_index = m_ParamStartPos + m_ParamCount - index - 1;

+    if (real_index >= PARAM_BUF_SIZE) {

+        real_index -= PARAM_BUF_SIZE;

+    }

+    _ContentParam& param = m_ParamBuf1[real_index];

+    if (param.m_Type == PDFOBJ_NUMBER) {

+        CPDF_Number* pNumber = CPDF_Number::Create(param.m_Number.m_bInteger, &param.m_Number.m_Integer);

+        param.m_Type = 0;

+        param.m_pObject = pNumber;

+        return pNumber;

+    }

+    if (param.m_Type == PDFOBJ_NAME) {

+        CPDF_Name* pName = CPDF_Name::Create(CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len));

+        param.m_Type = 0;

+        param.m_pObject = pName;

+        return pName;

+    }

+    if (param.m_Type == 0) {

+        return param.m_pObject;

+    }

+    ASSERT(FALSE);

+    return NULL;

+}

+CFX_ByteString CPDF_StreamContentParser::GetString(FX_DWORD index)

+{

+    if (index >= m_ParamCount) {

+        return CFX_ByteString();

+    }

+    int real_index = m_ParamStartPos + m_ParamCount - index - 1;

+    if (real_index >= PARAM_BUF_SIZE) {

+        real_index -= PARAM_BUF_SIZE;

+    }

+    _ContentParam& param = m_ParamBuf1[real_index];

+    if (param.m_Type == PDFOBJ_NAME) {

+        return CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len);

+    }

+    if (param.m_Type == 0) {

+        return param.m_pObject->GetString();

+    }

+    return CFX_ByteString();

+}

+FX_FLOAT CPDF_StreamContentParser::GetNumber(FX_DWORD index)

+{

+    if (index >= m_ParamCount) {

+        return 0;

+    }

+    int real_index = m_ParamStartPos + m_ParamCount - index - 1;

+    if (real_index >= PARAM_BUF_SIZE) {

+        real_index -= PARAM_BUF_SIZE;

+    }

+    _ContentParam& param = m_ParamBuf1[real_index];

+    if (param.m_Type == PDFOBJ_NUMBER) {

+        return param.m_Number.m_bInteger ? (FX_FLOAT)param.m_Number.m_Integer : param.m_Number.m_Float;

+    }

+    if (param.m_Type == 0) {

+        return param.m_pObject->GetNumber();

+    }

+    return 0;

+}

+FX_FLOAT CPDF_StreamContentParser::GetNumber16(FX_DWORD index)

+{

+    return GetNumber(index);

+}

+void CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph)

+{

+    pObj->m_GeneralState = m_pCurStates->m_GeneralState;

+    pObj->m_ClipPath = m_pCurStates->m_ClipPath;

+    pObj->m_ContentMark = m_CurContentMark;

+    if (bColor) {

+        pObj->m_ColorState = m_pCurStates->m_ColorState;

+    }

+    if (bGraph) {

+        pObj->m_GraphState = m_pCurStates->m_GraphState;

+    }

+    if (bText) {

+        pObj->m_TextState = m_pCurStates->m_TextState;

+    }

+}

+const struct _OpCode {

+    FX_DWORD	m_OpId;

+    void (CPDF_StreamContentParser::*m_OpHandler)();

+} g_OpCodes[] = {

+    {FXBSTR_ID('"', 0, 0, 0),		&CPDF_StreamContentParser::Handle_NextLineShowText_Space},

+    {FXBSTR_ID('\'', 0, 0, 0),		&CPDF_StreamContentParser::Handle_NextLineShowText},

+    {FXBSTR_ID('B', 0, 0, 0),		&CPDF_StreamContentParser::Handle_FillStrokePath},

+    {FXBSTR_ID('B', '*', 0, 0),	&CPDF_StreamContentParser::Handle_EOFillStrokePath},

+    {FXBSTR_ID('B', 'D', 'C', 0),	&CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary},

+    {FXBSTR_ID('B', 'I', 0, 0),	&CPDF_StreamContentParser::Handle_BeginImage},

+    {FXBSTR_ID('B', 'M', 'C', 0),	&CPDF_StreamContentParser::Handle_BeginMarkedContent},

+    {FXBSTR_ID('B', 'T', 0, 0),	&CPDF_StreamContentParser::Handle_BeginText},

+    {FXBSTR_ID('B', 'X', 0, 0),	&CPDF_StreamContentParser::Handle_BeginSectionUndefined},

+    {FXBSTR_ID('C', 'S', 0, 0),	&CPDF_StreamContentParser::Handle_SetColorSpace_Stroke},

+    {FXBSTR_ID('D', 'P', 0, 0),	&CPDF_StreamContentParser::Handle_MarkPlace_Dictionary},

+    {FXBSTR_ID('D', 'o', 0, 0),	&CPDF_StreamContentParser::Handle_ExecuteXObject},

+    {FXBSTR_ID('E', 'I', 0, 0),	&CPDF_StreamContentParser::Handle_EndImage},

+    {FXBSTR_ID('E', 'M', 'C', 0),	&CPDF_StreamContentParser::Handle_EndMarkedContent},

+    {FXBSTR_ID('E', 'T', 0, 0),	&CPDF_StreamContentParser::Handle_EndText},

+    {FXBSTR_ID('E', 'X', 0, 0),	&CPDF_StreamContentParser::Handle_EndSectionUndefined},

+    {FXBSTR_ID('F', 0, 0, 0),		&CPDF_StreamContentParser::Handle_FillPathOld},

+    {FXBSTR_ID('G', 0, 0, 0),		&CPDF_StreamContentParser::Handle_SetGray_Stroke},

+    {FXBSTR_ID('I', 'D', 0, 0),	&CPDF_StreamContentParser::Handle_BeginImageData},

+    {FXBSTR_ID('J', 0, 0, 0),		&CPDF_StreamContentParser::Handle_SetLineCap},

+    {FXBSTR_ID('K', 0, 0, 0),		&CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke},

+    {FXBSTR_ID('M', 0, 0, 0),		&CPDF_StreamContentParser::Handle_SetMiterLimit},

+    {FXBSTR_ID('M', 'P', 0, 0),	&CPDF_StreamContentParser::Handle_MarkPlace},

+    {FXBSTR_ID('Q', 0, 0, 0),		&CPDF_StreamContentParser::Handle_RestoreGraphState},

+    {FXBSTR_ID('R', 'G', 0, 0),	&CPDF_StreamContentParser::Handle_SetRGBColor_Stroke},

+    {FXBSTR_ID('S', 0, 0, 0),		&CPDF_StreamContentParser::Handle_StrokePath},

+    {FXBSTR_ID('S', 'C', 0, 0),	&CPDF_StreamContentParser::Handle_SetColor_Stroke},

+    {FXBSTR_ID('S', 'C', 'N', 0),	&CPDF_StreamContentParser::Handle_SetColorPS_Stroke},

+    {FXBSTR_ID('T', '*', 0, 0),	&CPDF_StreamContentParser::Handle_MoveToNextLine},

+    {FXBSTR_ID('T', 'D', 0, 0),	&CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading},

+    {FXBSTR_ID('T', 'J', 0, 0),	&CPDF_StreamContentParser::Handle_ShowText_Positioning},

+    {FXBSTR_ID('T', 'L', 0, 0),	&CPDF_StreamContentParser::Handle_SetTextLeading},

+    {FXBSTR_ID('T', 'c', 0, 0),	&CPDF_StreamContentParser::Handle_SetCharSpace},

+    {FXBSTR_ID('T', 'd', 0, 0),	&CPDF_StreamContentParser::Handle_MoveTextPoint},

+    {FXBSTR_ID('T', 'f', 0, 0),	&CPDF_StreamContentParser::Handle_SetFont},

+    {FXBSTR_ID('T', 'j', 0, 0),	&CPDF_StreamContentParser::Handle_ShowText},

+    {FXBSTR_ID('T', 'm', 0, 0),	&CPDF_StreamContentParser::Handle_SetTextMatrix},

+    {FXBSTR_ID('T', 'r', 0, 0),	&CPDF_StreamContentParser::Handle_SetTextRenderMode},

+    {FXBSTR_ID('T', 's', 0, 0),	&CPDF_StreamContentParser::Handle_SetTextRise},

+    {FXBSTR_ID('T', 'w', 0, 0),	&CPDF_StreamContentParser::Handle_SetWordSpace},

+    {FXBSTR_ID('T', 'z', 0, 0),	&CPDF_StreamContentParser::Handle_SetHorzScale},

+    {FXBSTR_ID('W', 0, 0, 0),		&CPDF_StreamContentParser::Handle_Clip},

+    {FXBSTR_ID('W', '*', 0, 0),	&CPDF_StreamContentParser::Handle_EOClip},

+    {FXBSTR_ID('b', 0, 0, 0),		&CPDF_StreamContentParser::Handle_CloseFillStrokePath},

+    {FXBSTR_ID('b', '*', 0, 0),	&CPDF_StreamContentParser::Handle_CloseEOFillStrokePath},

+    {FXBSTR_ID('c', 0, 0, 0),		&CPDF_StreamContentParser::Handle_CurveTo_123},

+    {FXBSTR_ID('c', 'm', 0, 0),	&CPDF_StreamContentParser::Handle_ConcatMatrix},

+    {FXBSTR_ID('c', 's', 0, 0),	&CPDF_StreamContentParser::Handle_SetColorSpace_Fill},

+    {FXBSTR_ID('d', 0, 0, 0),		&CPDF_StreamContentParser::Handle_SetDash},

+    {FXBSTR_ID('d', '0', 0, 0),	&CPDF_StreamContentParser::Handle_SetCharWidth},

+    {FXBSTR_ID('d', '1', 0, 0),	&CPDF_StreamContentParser::Handle_SetCachedDevice},

+    {FXBSTR_ID('f', 0, 0, 0),		&CPDF_StreamContentParser::Handle_FillPath},

+    {FXBSTR_ID('f', '*', 0, 0),	&CPDF_StreamContentParser::Handle_EOFillPath},

+    {FXBSTR_ID('g', 0, 0, 0),		&CPDF_StreamContentParser::Handle_SetGray_Fill},

+    {FXBSTR_ID('g', 's', 0, 0),	&CPDF_StreamContentParser::Handle_SetExtendGraphState},

+    {FXBSTR_ID('h', 0, 0, 0),		&CPDF_StreamContentParser::Handle_ClosePath},

+    {FXBSTR_ID('i', 0, 0, 0),		&CPDF_StreamContentParser::Handle_SetFlat},

+    {FXBSTR_ID('j', 0, 0, 0),		&CPDF_StreamContentParser::Handle_SetLineJoin},

+    {FXBSTR_ID('k', 0, 0, 0),		&CPDF_StreamContentParser::Handle_SetCMYKColor_Fill},

+    {FXBSTR_ID('l', 0, 0, 0),		&CPDF_StreamContentParser::Handle_LineTo},

+    {FXBSTR_ID('m', 0, 0, 0),		&CPDF_StreamContentParser::Handle_MoveTo},

+    {FXBSTR_ID('n', 0, 0, 0),		&CPDF_StreamContentParser::Handle_EndPath},

+    {FXBSTR_ID('q', 0, 0, 0),		&CPDF_StreamContentParser::Handle_SaveGraphState},

+    {FXBSTR_ID('r', 'e', 0, 0),	&CPDF_StreamContentParser::Handle_Rectangle},

+    {FXBSTR_ID('r', 'g', 0, 0),	&CPDF_StreamContentParser::Handle_SetRGBColor_Fill},

+    {FXBSTR_ID('r', 'i', 0, 0),	&CPDF_StreamContentParser::Handle_SetRenderIntent},

+    {FXBSTR_ID('s', 0, 0, 0),		&CPDF_StreamContentParser::Handle_CloseStrokePath},

+    {FXBSTR_ID('s', 'c', 0, 0),	&CPDF_StreamContentParser::Handle_SetColor_Fill},

+    {FXBSTR_ID('s', 'c', 'n', 0),	&CPDF_StreamContentParser::Handle_SetColorPS_Fill},

+    {FXBSTR_ID('s', 'h', 0, 0),	&CPDF_StreamContentParser::Handle_ShadeFill},

+    {FXBSTR_ID('v', 0, 0, 0),		&CPDF_StreamContentParser::Handle_CurveTo_23},

+    {FXBSTR_ID('w', 0, 0, 0),		&CPDF_StreamContentParser::Handle_SetLineWidth},

+    {FXBSTR_ID('y', 0, 0, 0),		&CPDF_StreamContentParser::Handle_CurveTo_13},

+};

+FX_BOOL CPDF_StreamContentParser::OnOperator(FX_LPCSTR op)

+{

+    int i = 0;

+    FX_DWORD opid = 0;

+    while (i < 4 && op[i]) {

+        opid = (opid << 8) + op[i];

+        i ++;

+    }

+    while (i < 4) {

+        opid <<= 8;

+        i ++;

+    };

+    int low = 0, high = sizeof g_OpCodes / sizeof(struct _OpCode) - 1;

+    while (low <= high) {

+        int middle = (low + high) / 2;

+        int compare = opid - g_OpCodes[middle].m_OpId;

+        if (compare == 0) {

+            (this->*g_OpCodes[middle].m_OpHandler)();

+            return TRUE;

+        } else if (compare < 0) {

+            high = middle - 1;

+        } else {

+            low = middle + 1;

+        }

+    }

+    return m_CompatCount != 0;

+}

+void CPDF_StreamContentParser::Handle_CloseFillStrokePath()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    Handle_ClosePath();

+    AddPathObject(FXFILL_WINDING, TRUE);

+}

+void CPDF_StreamContentParser::Handle_FillStrokePath()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    AddPathObject(FXFILL_WINDING, TRUE);

+}

+void CPDF_StreamContentParser::Handle_CloseEOFillStrokePath()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    AddPathPoint(m_PathStartX, m_PathStartY, FXPT_LINETO | FXPT_CLOSEFIGURE);

+    AddPathObject(FXFILL_ALTERNATE, TRUE);

+}

+void CPDF_StreamContentParser::Handle_EOFillStrokePath()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    AddPathObject(FXFILL_ALTERNATE, TRUE);

+}

+void CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary()

+{

+    if (!m_Options.m_bMarkedContent) {

+        return;

+    }

+    CFX_ByteString tag = GetString(1);

+    CPDF_Object* pProperty = GetObject(0);

+    if (pProperty == NULL) {

+        return;

+    }

+    FX_BOOL bDirect = TRUE;

+    if (pProperty->GetType() == PDFOBJ_NAME) {

+        pProperty = FindResourceObj(FX_BSTRC("Properties"), pProperty->GetString());

+        if (pProperty == NULL) {

+            return;

+        }

+        bDirect = FALSE;

+    }

+    if (pProperty->GetType() != PDFOBJ_DICTIONARY) {

+        return;

+    }

+    m_CurContentMark.GetModify()->AddMark(tag, (CPDF_Dictionary*)pProperty, bDirect);

+}

+void CPDF_StreamContentParser::Handle_BeginMarkedContent()

+{

+    if (!m_Options.m_bMarkedContent) {

+        return;

+    }

+    CFX_ByteString tag = GetString(0);

+    m_CurContentMark.GetModify()->AddMark(tag, NULL, FALSE);

+}

+struct _FX_BSTR {

+    FX_LPCSTR	m_Ptr;

+    int			m_Size;

+};

+#define _FX_BSTRC(str) {str, sizeof(str)-1}

+const _FX_BSTR _PDF_InlineKeyAbbr[] = {

+    _FX_BSTRC("BitsPerComponent"), _FX_BSTRC("BPC"),

+    _FX_BSTRC("ColorSpace"), _FX_BSTRC("CS"),

+    _FX_BSTRC("Decode"), _FX_BSTRC("D"),

+    _FX_BSTRC("DecodeParms"), _FX_BSTRC("DP"),

+    _FX_BSTRC("Filter"), _FX_BSTRC("F"),

+    _FX_BSTRC("Height"), _FX_BSTRC("H"),

+    _FX_BSTRC("ImageMask"), _FX_BSTRC("IM"),

+    _FX_BSTRC("Interpolate"), _FX_BSTRC("I"),

+    _FX_BSTRC("Width"), _FX_BSTRC("W"),

+};

+const _FX_BSTR _PDF_InlineValueAbbr[] = {

+    _FX_BSTRC("DeviceGray"), _FX_BSTRC("G"),

+    _FX_BSTRC("DeviceRGB"), _FX_BSTRC("RGB"),

+    _FX_BSTRC("DeviceCMYK"), _FX_BSTRC("CMYK"),

+    _FX_BSTRC("Indexed"), _FX_BSTRC("I"),

+    _FX_BSTRC("ASCIIHexDecode"), _FX_BSTRC("AHx"),

+    _FX_BSTRC("ASCII85Decode"), _FX_BSTRC("A85"),

+    _FX_BSTRC("LZWDecode"), _FX_BSTRC("LZW"),

+    _FX_BSTRC("FlateDecode"), _FX_BSTRC("Fl"),

+    _FX_BSTRC("RunLengthDecode"), _FX_BSTRC("RL"),

+    _FX_BSTRC("CCITTFaxDecode"), _FX_BSTRC("CCF"),

+    _FX_BSTRC("DCTDecode"), _FX_BSTRC("DCT"),

+};

+static CFX_ByteStringC _PDF_FindFullName(const _FX_BSTR* table, int count, FX_BSTR abbr)

+{

+    int i = 0;

+    while (i < count) {

+        if (abbr.GetLength() == table[i + 1].m_Size && FXSYS_memcmp32(abbr.GetPtr(), table[i + 1].m_Ptr, abbr.GetLength()) == 0) {

+            return CFX_ByteStringC(table[i].m_Ptr, table[i].m_Size);

+        }

+        i += 2;

+    }

+    return CFX_ByteStringC();

+}

+void _PDF_ReplaceAbbr(CPDF_Object* pObj)

+{

+    switch (pObj->GetType()) {

+        case PDFOBJ_DICTIONARY: {

+                CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;

+                FX_POSITION pos = pDict->GetStartPos();

+                while (pos) {

+                    CFX_ByteString key;

+                    CPDF_Object* value = pDict->GetNextElement(pos, key);

+                    CFX_ByteStringC fullname = _PDF_FindFullName(_PDF_InlineKeyAbbr,

+                                               sizeof _PDF_InlineKeyAbbr / sizeof(_FX_BSTR), key);

+                    if (!fullname.IsEmpty()) {

+                        pDict->ReplaceKey(key, fullname);

+                        key = fullname;

+                    }

+                    if (value->GetType() == PDFOBJ_NAME) {

+                        CFX_ByteString name = value->GetString();

+                        fullname = _PDF_FindFullName(_PDF_InlineValueAbbr,

+                                                     sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);

+                        if (!fullname.IsEmpty()) {

+                            pDict->SetAtName(key, fullname);

+                        }

+                    } else {

+                        _PDF_ReplaceAbbr(value);

+                    }

+                }

+                break;

+            }

+        case PDFOBJ_ARRAY: {

+                CPDF_Array* pArray = (CPDF_Array*)pObj;

+                for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {

+                    CPDF_Object* pElement = pArray->GetElement(i);

+                    if (pElement->GetType() == PDFOBJ_NAME) {

+                        CFX_ByteString name = pElement->GetString();

+                        CFX_ByteStringC fullname = _PDF_FindFullName(_PDF_InlineValueAbbr,

+                                                   sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);

+                        if (!fullname.IsEmpty()) {

+                            pArray->SetAt(i, CPDF_Name::Create(fullname));

+                        }

+                    } else {

+                        _PDF_ReplaceAbbr(pElement);

+                    }

+                }

+                break;

+            }

+    }

+}

+static CFX_ByteStringC _PDF_FindAbbrName(const _FX_BSTR* table, int count, FX_BSTR fullName)

+{

+    int i = 0;

+    while (i < count) {

+        if (fullName.GetLength() == table[i].m_Size && FXSYS_memcmp32(fullName.GetPtr(), table[i].m_Ptr, fullName.GetLength()) == 0) {

+            return CFX_ByteStringC(table[i + 1].m_Ptr, table[i + 1].m_Size);

+        }

+        i += 2;

+    }

+    return CFX_ByteStringC();

+}

+void _PDF_ReplaceFull(CPDF_Object* pObj)

+{

+    switch (pObj->GetType()) {

+        case PDFOBJ_DICTIONARY: {

+                CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;

+                FX_POSITION pos = pDict->GetStartPos();

+                while (pos) {

+                    CFX_ByteString key;

+                    CPDF_Object* value = pDict->GetNextElement(pos, key);

+                    CFX_ByteStringC abbrName = _PDF_FindAbbrName(_PDF_InlineKeyAbbr,

+                                               sizeof(_PDF_InlineKeyAbbr) / sizeof(_FX_BSTR), key);

+                    if (!abbrName.IsEmpty()) {

+                        pDict->ReplaceKey(key, abbrName);

+                        key = abbrName;

+                    }

+                    if (value->GetType() == PDFOBJ_NAME) {

+                        CFX_ByteString name = value->GetString();

+                        abbrName = _PDF_FindAbbrName(_PDF_InlineValueAbbr,

+                                                     sizeof(_PDF_InlineValueAbbr) / sizeof(_FX_BSTR), name);

+                        if (!abbrName.IsEmpty()) {

+                            pDict->SetAtName(key, abbrName);

+                        }

+                    } else {

+                        _PDF_ReplaceFull(value);

+                    }

+                }

+                break;

+            }

+        case PDFOBJ_ARRAY: {

+                CPDF_Array* pArray = (CPDF_Array*)pObj;

+                for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {

+                    CPDF_Object* pElement = pArray->GetElement(i);

+                    if (pElement->GetType() == PDFOBJ_NAME) {

+                        CFX_ByteString name = pElement->GetString();

+                        CFX_ByteStringC abbrName = _PDF_FindAbbrName(_PDF_InlineValueAbbr,

+                                                   sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);

+                        if (!abbrName.IsEmpty()) {

+                            pArray->SetAt(i, CPDF_Name::Create(abbrName));

+                        }

+                    } else {

+                        _PDF_ReplaceFull(pElement);

+                    }

+                }

+                break;

+            }

+    }

+}

+void CPDF_StreamContentParser::Handle_BeginText()

+{

+    m_pCurStates->m_TextMatrix.Set(1.0f, 0, 0, 1.0f, 0, 0);

+    OnChangeTextMatrix();

+    m_pCurStates->m_TextX = 0;

+    m_pCurStates->m_TextY = 0;

+    m_pCurStates->m_TextLineX = 0;

+    m_pCurStates->m_TextLineY = 0;

+}

+void CPDF_StreamContentParser::Handle_BeginSectionUndefined()

+{

+    m_CompatCount ++;

+}

+void CPDF_StreamContentParser::Handle_CurveTo_123()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    AddPathPoint(GetNumber(5), GetNumber(4), FXPT_BEZIERTO);

+    AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);

+    AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);

+}

+void CPDF_StreamContentParser::Handle_ConcatMatrix()

+{

+    FX_FLOAT a2 = GetNumber16(5), b2 = GetNumber16(4), c2 = GetNumber16(3), d2 = GetNumber16(2);

+    FX_FLOAT e2 = GetNumber(1), f2 = GetNumber(0);

+    FX_FLOAT old_width_scale = m_pCurStates->m_CTM.GetXUnit();

+    CFX_AffineMatrix new_matrix(a2, b2, c2, d2, e2, f2);

+    new_matrix.Concat(m_pCurStates->m_CTM);

+    m_pCurStates->m_CTM = new_matrix;

+    FX_FLOAT new_width_scale = m_pCurStates->m_CTM.GetXUnit();

+    OnChangeTextMatrix();

+}

+void CPDF_StreamContentParser::Handle_SetColorSpace_Fill()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    CFX_ByteString csname = GetString(0);

+    CPDF_ColorSpace* pCS = FindColorSpace(csname);

+    if (pCS == NULL) {

+        return;

+    }

+    m_pCurStates->m_ColorState.GetModify()->m_FillColor.SetColorSpace(pCS);

+}

+void CPDF_StreamContentParser::Handle_SetColorSpace_Stroke()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    CFX_ByteString csname = GetString(0);

+    CPDF_ColorSpace* pCS = FindColorSpace(csname);

+    if (pCS == NULL) {

+        return;

+    }

+    m_pCurStates->m_ColorState.GetModify()->m_StrokeColor.SetColorSpace(pCS);

+}

+void CPDF_StreamContentParser::Handle_SetDash()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    CPDF_Array* pArray = GetObject(1)->GetArray();

+    if (pArray == NULL) {

+        return;

+    }

+    m_pCurStates->SetLineDash(pArray, GetNumber(0), 1.0f);

+}

+void CPDF_StreamContentParser::Handle_SetCharWidth()

+{

+    m_Type3Data[0] = GetNumber(1);

+    m_Type3Data[1] = GetNumber(0);

+    m_bColored = TRUE;

+}

+void CPDF_StreamContentParser::Handle_SetCachedDevice()

+{

+    for (int i = 0; i < 6; i ++) {

+        m_Type3Data[i] = GetNumber(5 - i);

+    }

+    m_bColored = FALSE;

+}

+void CPDF_StreamContentParser::Handle_ExecuteXObject()

+{

+    CFX_ByteString name = GetString(0);

+    if (name == m_LastImageName && m_pLastImage && m_pLastImage->GetStream() && m_pLastImage->GetStream()->GetObjNum()) {

+#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)

+        AddDuplicateImage();

+#else

+        AddImage(NULL, m_pLastImage, FALSE);

+#endif

+        return;

+    }

+    if (m_Options.m_bTextOnly) {

+        CPDF_Object* pRes = NULL;

+        if (m_pResources == NULL) {

+            return;

+        }

+        if (m_pResources == m_pPageResources) {

+            CPDF_Dictionary* pList = m_pResources->GetDict(FX_BSTRC("XObject"));

+            if (pList == NULL) {

+                return;

+            }

+            pRes = pList->GetElement(name);

+            if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {

+                return;

+            }

+        } else {

+            CPDF_Dictionary* pList = m_pResources->GetDict(FX_BSTRC("XObject"));

+            if (pList == NULL) {

+                if (m_pPageResources == NULL) {

+                    return;

+                }

+                CPDF_Dictionary* pList = m_pPageResources->GetDict(FX_BSTRC("XObject"));

+                if (pList == NULL) {

+                    return;

+                }

+                pRes = pList->GetElement(name);

+                if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {

+                    return;

+                }

+            } else {

+                pRes = pList->GetElement(name);

+                if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {

+                    return;

+                }

+            }

+        }

+        FX_BOOL bForm;

+        if (m_pDocument->IsFormStream(((CPDF_Reference*)pRes)->GetRefObjNum(), bForm) && !bForm) {

+            return;

+        }

+    }

+    CPDF_Stream* pXObject = (CPDF_Stream*)FindResourceObj(FX_BSTRC("XObject"), name);

+    if (pXObject == NULL || pXObject->GetType() != PDFOBJ_STREAM) {

+        m_bResourceMissing = TRUE;

+        return;

+    }

+    CFX_ByteStringC type = pXObject->GetDict()->GetConstString(FX_BSTRC("Subtype"));

+    if (type == FX_BSTRC("Image")) {

+        if (m_Options.m_bTextOnly) {

+            return;

+        }

+        CPDF_ImageObject* pObj = AddImage(pXObject, NULL, FALSE);

+        m_LastImageName = name;

+        m_pLastImage = pObj->m_pImage;

+    } else if (type == FX_BSTRC("Form")) {

+        AddForm(pXObject);

+    } else {

+        return;

+    }

+}

+void CPDF_StreamContentParser::AddForm(CPDF_Stream* pStream)

+{

+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)

+    if (!m_Options.m_bSeparateForm) {

+        CPDF_Dictionary* pResources = pStream->GetDict()->GetDict(FX_BSTRC("Resources"));

+        CFX_AffineMatrix form_matrix = pStream->GetDict()->GetMatrix(FX_BSTRC("Matrix"));

+        form_matrix.Concat(m_pCurStates->m_CTM);

+        CPDF_Array* pBBox = pStream->GetDict()->GetArray(FX_BSTRC("BBox"));

+        CFX_FloatRect form_bbox;

+        CPDF_Path ClipPath;

+        if (pBBox) {

+            form_bbox = pStream->GetDict()->GetRect(FX_BSTRC("BBox"));

+            ClipPath.New();

+            ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);

+            ClipPath.Transform(&form_matrix);

+            form_bbox.Transform(&form_matrix);

+        }

+        CPDF_StreamContentParser parser;

+        parser.Initialize();

+        parser.PrepareParse(m_pDocument, m_pPageResources, m_pResources, &m_mtContentToUser,

+                            m_pObjectList, pResources, &form_bbox, &m_Options, m_pCurStates, m_Level + 1);

+        parser.m_pCurStates->m_CTM = form_matrix;

+        if (ClipPath.NotNull()) {

+            parser.m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);

+        }

+        CPDF_StreamAcc stream;

+        stream.LoadAllData(pStream, FALSE);

+        if (stream.GetSize() == 0) {

+            return;

+        }

+#ifdef _FPDFAPI_MINI_

+        parser.InputData(stream.GetData(), stream.GetSize());

+        parser.Finish();

+#else

+        parser.Parse(stream.GetData(), stream.GetSize(), 0);

+#endif

+        return;

+    }

+#endif

+    CPDF_FormObject* pFormObj = FX_NEW CPDF_FormObject;

+    pFormObj->m_pForm = FX_NEW CPDF_Form(m_pDocument, m_pPageResources, pStream, m_pResources);

+    pFormObj->m_FormMatrix = m_pCurStates->m_CTM;

+    pFormObj->m_FormMatrix.Concat(m_mtContentToUser);

+    CPDF_AllStates status;

+    status.m_GeneralState = m_pCurStates->m_GeneralState;

+    status.m_GraphState = m_pCurStates->m_GraphState;

+    status.m_ColorState = m_pCurStates->m_ColorState;

+    status.m_TextState = m_pCurStates->m_TextState;

+    pFormObj->m_pForm->ParseContent(&status, NULL, NULL, &m_Options, m_Level + 1);

+    if (!m_pObjectList->m_bBackgroundAlphaNeeded && pFormObj->m_pForm->m_bBackgroundAlphaNeeded) {

+        m_pObjectList->m_bBackgroundAlphaNeeded = TRUE;

+    }

+    pFormObj->CalcBoundingBox();

+    SetGraphicStates(pFormObj, TRUE, TRUE, TRUE);

+    m_pObjectList->m_ObjectList.AddTail(pFormObj);

+}

+#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)

+void CPDF_StreamContentParser::AddDuplicateImage()

+{

+    FX_POSITION tailpos = m_pObjectList->m_ObjectList.GetTailPosition();

+    CPDF_PageObject* pLastObj = (CPDF_PageObject*)m_pObjectList->m_ObjectList.GetAt(tailpos);

+    if (pLastObj == NULL || (pLastObj->m_Type != PDFPAGE_INLINES && pLastObj->m_Type != PDFPAGE_IMAGE)) {

+        AddImage(NULL, m_pLastImage, FALSE);

+        return;

+    }

+    if (pLastObj->m_GeneralState != m_pCurStates->m_GeneralState ||

+            pLastObj->m_ClipPath != m_pCurStates->m_ClipPath ||

+            pLastObj->m_ColorState != m_pCurStates->m_ColorState) {

+        AddImage(NULL, m_pLastImage, FALSE);

+        return;

+    }

+    CFX_AffineMatrix ImageMatrix;

+    ImageMatrix.Copy(m_pCurStates->m_CTM);

+    ImageMatrix.Concat(m_mtContentToUser);

+    if (pLastObj->m_Type == PDFPAGE_INLINES) {

+        CPDF_InlineImages* pInlines = (CPDF_InlineImages*)pLastObj;

+        if (pInlines->m_pStream != m_pLastImage->GetStream()) {

+            AddImage(NULL, m_pLastImage, FALSE);

+            return;

+        }

+        pInlines->AddMatrix(ImageMatrix);

+    } else {

+        CPDF_ImageObject* pImageObj = (CPDF_ImageObject*)pLastObj;

+        CPDF_InlineImages* pInlines = FX_NEW CPDF_InlineImages;

+        pInlines->m_pStream = m_pLastImage->GetStream();

+        SetGraphicStates(pInlines, !pInlines->m_pStream->GetDict()->KeyExist(FX_BSTRC("ColorSpace")), FALSE, FALSE);

+        pInlines->AddMatrix(pImageObj->m_Matrix);

+        pInlines->AddMatrix(ImageMatrix);

+        m_pObjectList->m_ObjectList.RemoveAt(tailpos);

+        m_pObjectList->m_ObjectList.AddTail(pInlines);

+        pLastObj->Release();

+    }

+}

+#endif

+CPDF_ImageObject* CPDF_StreamContentParser::AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline)

+{

+    if (pStream == NULL && pImage == NULL) {

+        return NULL;

+    }

+    CFX_AffineMatrix ImageMatrix;

+    ImageMatrix.Copy(m_pCurStates->m_CTM);

+    ImageMatrix.Concat(m_mtContentToUser);

+    CPDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;

+    if (pImage) {

+        pImageObj->m_pImage = m_pDocument->GetPageData()->GetImage(pImage->GetStream());

+    } else if (pStream->GetObjNum()) {

+        pImageObj->m_pImage = m_pDocument->LoadImageF(pStream);

+    } else {

+        pImageObj->m_pImage = FX_NEW CPDF_Image(m_pDocument);

+        pImageObj->m_pImage->LoadImageF(pStream, bInline);

+    }

+    SetGraphicStates(pImageObj, pImageObj->m_pImage->IsMask(), FALSE, FALSE);

+    pImageObj->m_Matrix = ImageMatrix;

+    pImageObj->CalcBoundingBox();

+    m_pObjectList->m_ObjectList.AddTail(pImageObj);

+    return pImageObj;

+}

+void CPDF_StreamContentParser::Handle_MarkPlace_Dictionary()

+{

+}

+void CPDF_StreamContentParser::Handle_EndImage()

+{

+}

+void CPDF_StreamContentParser::Handle_EndMarkedContent()

+{

+    if (!m_Options.m_bMarkedContent) {

+        return;

+    }

+    if (m_CurContentMark.IsNull()) {

+        return;

+    }

+    int count = m_CurContentMark.GetObject()->CountItems();

+    if (count == 1) {

+        m_CurContentMark.SetNull();

+        return;

+    }

+    m_CurContentMark.GetModify()->DeleteLastMark();

+}

+void CPDF_StreamContentParser::Handle_EndText()

+{

+    int count = m_ClipTextList.GetSize();

+    if (count == 0) {

+        return;

+    }

+    if (m_pCurStates->m_TextState.GetObject()->m_TextMode < 4) {

+        for (int i = 0; i < count; i ++) {

+            CPDF_TextObject* pText = (CPDF_TextObject*)m_ClipTextList.GetAt(i);

+            if (pText) {

+                delete pText;

+            }

+        }

+    } else {

+        m_pCurStates->m_ClipPath.AppendTexts((CPDF_TextObject**)m_ClipTextList.GetData(), count);

+    }

+    m_ClipTextList.RemoveAll();

+}

+void CPDF_StreamContentParser::Handle_EndSectionUndefined()

+{

+    if (m_CompatCount) {

+        m_CompatCount --;

+    }

+}

+void CPDF_StreamContentParser::Handle_FillPath()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    AddPathObject(FXFILL_WINDING, FALSE);

+}

+void CPDF_StreamContentParser::Handle_FillPathOld()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    AddPathObject(FXFILL_WINDING, FALSE);

+}

+void CPDF_StreamContentParser::Handle_EOFillPath()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    AddPathObject(FXFILL_ALTERNATE, FALSE);

+}

+void CPDF_StreamContentParser::Handle_SetGray_Fill()

+{

+    FX_FLOAT value = GetNumber(0);

+    CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);

+    m_pCurStates->m_ColorState.SetFillColor(pCS, &value, 1);

+}

+void CPDF_StreamContentParser::Handle_SetGray_Stroke()

+{

+    FX_FLOAT value = GetNumber(0);

+    CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);

+    m_pCurStates->m_ColorState.SetStrokeColor(pCS, &value, 1);

+}

+void CPDF_StreamContentParser::Handle_SetExtendGraphState()

+{

+    CFX_ByteString name = GetString(0);

+    CPDF_Dictionary* pGS = (CPDF_Dictionary*)FindResourceObj(FX_BSTRC("ExtGState"), name);

+    if (pGS == NULL || pGS->GetType() != PDFOBJ_DICTIONARY) {

+        m_bResourceMissing = TRUE;

+        return;

+    }

+    m_pCurStates->ProcessExtGS(pGS, this);

+}

+void CPDF_StreamContentParser::Handle_ClosePath()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    if (m_PathPointCount == 0) {

+        return;

+    }

+    if (m_PathStartX != m_PathCurrentX || m_PathStartY != m_PathCurrentY) {

+        AddPathPoint(m_PathStartX, m_PathStartY, FXPT_LINETO | FXPT_CLOSEFIGURE);

+    } else if (m_pPathPoints[m_PathPointCount - 1].m_Flag != FXPT_MOVETO) {

+        m_pPathPoints[m_PathPointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;

+    }

+}

+void CPDF_StreamContentParser::Handle_SetFlat()

+{

+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)

+    m_pCurStates->m_GeneralState.GetModify()->m_Flatness = GetNumber(0);

+#endif

+}

+void CPDF_StreamContentParser::Handle_BeginImageData()

+{

+}

+void CPDF_StreamContentParser::Handle_SetLineJoin()

+{

+    m_pCurStates->m_GraphState.GetModify()->m_LineJoin = (CFX_GraphStateData::LineJoin)GetInteger(0);

+}

+void CPDF_StreamContentParser::Handle_SetLineCap()

+{

+    m_pCurStates->m_GraphState.GetModify()->m_LineCap = (CFX_GraphStateData::LineCap)GetInteger(0);

+}

+void CPDF_StreamContentParser::Handle_SetCMYKColor_Fill()

+{

+    REQUIRE_PARAMS(4);

+    FX_FLOAT values[4];

+    for (int i = 0; i < 4; i ++) {

+        values[i] = GetNumber(3 - i);

+    }

+    CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);

+    m_pCurStates->m_ColorState.SetFillColor(pCS, values, 4);

+}

+void CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke()

+{

+    REQUIRE_PARAMS(4);

+    FX_FLOAT values[4];

+    for (int i = 0; i < 4; i ++) {

+        values[i] = GetNumber(3 - i);

+    }

+    CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);

+    m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 4);

+}

+void CPDF_StreamContentParser::Handle_LineTo()

+{

+    REQUIRE_PARAMS(2);

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    AddPathPoint(GetNumber(1), GetNumber(0), FXPT_LINETO);

+}

+void CPDF_StreamContentParser::Handle_MoveTo()

+{

+    REQUIRE_PARAMS(2);

+    if (m_Options.m_bTextOnly) {

+#ifndef _FPDFAPI_MINI_

+        m_pSyntax->SkipPathObject();

+#endif

+        return;

+    }

+    AddPathPoint(GetNumber(1), GetNumber(0), FXPT_MOVETO);

+#ifndef _FPDFAPI_MINI_

+    ParsePathObject();

+#endif

+}

+void CPDF_StreamContentParser::Handle_SetMiterLimit()

+{

+    m_pCurStates->m_GraphState.GetModify()->m_MiterLimit = GetNumber(0);

+}

+void CPDF_StreamContentParser::Handle_MarkPlace()

+{

+}

+void CPDF_StreamContentParser::Handle_EndPath()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    AddPathObject(0, FALSE);

+}

+void CPDF_StreamContentParser::Handle_SaveGraphState()

+{

+    CPDF_AllStates* pStates = FX_NEW CPDF_AllStates;

+    pStates->Copy(*m_pCurStates);

+    m_StateStack.Add(pStates);

+}

+void CPDF_StreamContentParser::Handle_RestoreGraphState()

+{

+    int size = m_StateStack.GetSize();

+    if (size == 0) {

+        return;

+    }

+    CPDF_AllStates* pStates = (CPDF_AllStates*)m_StateStack.GetAt(size - 1);

+    m_pCurStates->Copy(*pStates);

+    delete pStates;

+    m_StateStack.RemoveAt(size - 1);

+}

+void CPDF_StreamContentParser::Handle_Rectangle()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    FX_FLOAT x = GetNumber(3), y = GetNumber(2);

+    FX_FLOAT w = GetNumber(1), h = GetNumber(0);

+    AddPathRect(x, y, w, h);

+}

+void CPDF_StreamContentParser::AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h)

+{

+    AddPathPoint(x, y, FXPT_MOVETO);

+    AddPathPoint(x + w, y, FXPT_LINETO);

+    AddPathPoint(x + w, y + h, FXPT_LINETO);

+    AddPathPoint(x, y + h, FXPT_LINETO);

+    AddPathPoint(x, y, FXPT_LINETO | FXPT_CLOSEFIGURE);

+}

+void CPDF_StreamContentParser::Handle_SetRGBColor_Fill()

+{

+    REQUIRE_PARAMS(3);

+    FX_FLOAT values[3];

+    for (int i = 0; i < 3; i ++) {

+        values[i] = GetNumber(2 - i);

+    }

+    CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);

+    m_pCurStates->m_ColorState.SetFillColor(pCS, values, 3);

+}

+void CPDF_StreamContentParser::Handle_SetRGBColor_Stroke()

+{

+    REQUIRE_PARAMS(3);

+    FX_FLOAT values[3];

+    for (int i = 0; i < 3; i ++) {

+        values[i] = GetNumber(2 - i);

+    }

+    CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);

+    m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 3);

+}

+void CPDF_StreamContentParser::Handle_SetRenderIntent()

+{

+}

+void CPDF_StreamContentParser::Handle_CloseStrokePath()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    Handle_ClosePath();

+    AddPathObject(0, TRUE);

+}

+void CPDF_StreamContentParser::Handle_StrokePath()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    AddPathObject(0, TRUE);

+}

+void CPDF_StreamContentParser::Handle_SetColor_Fill()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    FX_FLOAT values[4];

+    int nargs = m_ParamCount;

+    if (nargs > 4) {

+        nargs = 4;

+    }

+    for (int i = 0; i < nargs; i ++) {

+        values[i] = GetNumber(nargs - i - 1);

+    }

+    m_pCurStates->m_ColorState.SetFillColor(NULL, values, nargs);

+}

+void CPDF_StreamContentParser::Handle_SetColor_Stroke()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    FX_FLOAT values[4];

+    int nargs = m_ParamCount;

+    if (nargs > 4) {

+        nargs = 4;

+    }

+    for (int i = 0; i < nargs; i ++) {

+        values[i] = GetNumber(nargs - i - 1);

+    }

+    m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nargs);

+}

+void CPDF_StreamContentParser::Handle_SetColorPS_Fill()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    CPDF_Object* pLastParam = GetObject(0);

+    if (pLastParam == NULL) {

+        return;

+    }

+    int nargs = m_ParamCount;

+    int nvalues = nargs;

+    if (pLastParam->GetType() == PDFOBJ_NAME) {

+        nvalues --;

+    }

+    FX_FLOAT* values = NULL;

+    if (nvalues) {

+        values = FX_Alloc(FX_FLOAT, nvalues);

+        for (int i = 0; i < nvalues; i ++) {

+            values[i] = GetNumber(nargs - i - 1);

+        }

+    }

+    if (nvalues != nargs) {

+        CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE);

+        if (pPattern) {

+            m_pCurStates->m_ColorState.SetFillPattern(pPattern, values, nvalues);

+        }

+    } else {

+        m_pCurStates->m_ColorState.SetFillColor(NULL, values, nvalues);

+    }

+    if (values) {

+        FX_Free(values);

+    }

+}

+void CPDF_StreamContentParser::Handle_SetColorPS_Stroke()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    CPDF_Object* pLastParam = GetObject(0);

+    if (pLastParam == NULL) {

+        return;

+    }

+    int nargs = m_ParamCount;

+    int nvalues = nargs;

+    if (pLastParam->GetType() == PDFOBJ_NAME) {

+        nvalues --;

+    }

+    FX_FLOAT* values = NULL;

+    if (nvalues) {

+        values = FX_Alloc(FX_FLOAT, nvalues);

+        for (int i = 0; i < nvalues; i ++) {

+            values[i] = GetNumber(nargs - i - 1);

+        }

+    }

+    if (nvalues != nargs) {

+        CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE);

+        if (pPattern) {

+            m_pCurStates->m_ColorState.SetStrokePattern(pPattern, values, nvalues);

+        }

+    } else {

+        m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nvalues);

+    }

+    if (values) {

+        FX_Free(values);

+    }

+}

+CFX_FloatRect _GetShadingBBox(CPDF_Stream* pStream, int type, const CFX_AffineMatrix* pMatrix,

+                              CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);

+void CPDF_StreamContentParser::Handle_ShadeFill()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    CPDF_Pattern* pPattern = FindPattern(GetString(0), TRUE);

+    if (pPattern == NULL) {

+        return;

+    }

+    if (pPattern->m_PatternType != PATTERN_SHADING) {

+        return;

+    }

+    CPDF_ShadingPattern* pShading = (CPDF_ShadingPattern*)pPattern;

+    if (!pShading->m_bShadingObj) {

+        return;

+    }

+    if (!pShading->Load()) {

+        return;

+    }

+    CPDF_ShadingObject* pObj = FX_NEW CPDF_ShadingObject;

+    pObj->m_pShading = pShading;

+    SetGraphicStates(pObj, FALSE, FALSE, FALSE);

+    pObj->m_Matrix = m_pCurStates->m_CTM;

+    pObj->m_Matrix.Concat(m_mtContentToUser);

+    CFX_FloatRect bbox;

+    if (!pObj->m_ClipPath.IsNull()) {

+        bbox = pObj->m_ClipPath.GetClipBox();

+    } else {

+        bbox = m_BBox;

+    }

+    if (pShading->m_ShadingType >= 4) {

+        bbox.Intersect(_GetShadingBBox((CPDF_Stream*)pShading->m_pShadingObj, pShading->m_ShadingType, &pObj->m_Matrix,

+                                       pShading->m_pFunctions, pShading->m_nFuncs, pShading->m_pCS));

+    }

+    pObj->m_Left = bbox.left;

+    pObj->m_Right = bbox.right;

+    pObj->m_Top = bbox.top;

+    pObj->m_Bottom = bbox.bottom;

+    m_pObjectList->m_ObjectList.AddTail(pObj);

+}

+void CPDF_StreamContentParser::Handle_SetCharSpace()

+{

+    m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(0);

+}

+void CPDF_StreamContentParser::Handle_MoveTextPoint()

+{

+    m_pCurStates->m_TextLineX += GetNumber(1);

+    m_pCurStates->m_TextLineY += GetNumber(0);

+    m_pCurStates->m_TextX = m_pCurStates->m_TextLineX;

+    m_pCurStates->m_TextY = m_pCurStates->m_TextLineY;

+}

+void CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading()

+{

+    Handle_MoveTextPoint();

+    m_pCurStates->m_TextLeading = -GetNumber(0);

+}

+void CPDF_StreamContentParser::Handle_SetFont()

+{

+    FX_FLOAT fs = GetNumber(0);

+    if (fs == 0) {

+        fs = m_DefFontSize;

+    }

+    m_pCurStates->m_TextState.GetModify()->m_FontSize = fs;

+    CPDF_Font* pFont = FindFont(GetString(1));

+    if (pFont) {

+        m_pCurStates->m_TextState.SetFont(pFont);

+    }

+}

+CPDF_Object* CPDF_StreamContentParser::FindResourceObj(FX_BSTR type, const CFX_ByteString& name)

+{

+    if (m_pResources == NULL) {

+        return NULL;

+    }

+    if (m_pResources == m_pPageResources) {

+        CPDF_Dictionary* pList = m_pResources->GetDict(type);

+        if (pList == NULL) {

+            return NULL;

+        }

+        CPDF_Object* pRes = pList->GetElementValue(name);

+        return pRes;

+    }

+    CPDF_Dictionary* pList = m_pResources->GetDict(type);

+    if (pList == NULL) {

+        if (m_pPageResources == NULL) {

+            return NULL;

+        }

+        CPDF_Dictionary* pList = m_pPageResources->GetDict(type);

+        if (pList == NULL) {

+            return NULL;

+        }

+        CPDF_Object* pRes = pList->GetElementValue(name);

+        return pRes;

+    }

+    CPDF_Object* pRes = pList->GetElementValue(name);

+    return pRes;

+}

+CPDF_Font* CPDF_StreamContentParser::FindFont(const CFX_ByteString& name)

+{

+    CPDF_Dictionary* pFontDict = (CPDF_Dictionary*)FindResourceObj(FX_BSTRC("Font"), name);

+    if (pFontDict == NULL || pFontDict->GetType() != PDFOBJ_DICTIONARY) {

+        m_bResourceMissing = TRUE;

+        return CPDF_Font::GetStockFont(m_pDocument, FX_BSTRC("Helvetica"));

+    }

+    CPDF_Font* pFont = m_pDocument->LoadFont(pFontDict);

+    if (pFont && pFont->GetType3Font()) {

+        pFont->GetType3Font()->SetPageResources(m_pResources);

+        pFont->GetType3Font()->CheckType3FontMetrics();

+    }

+    return pFont;

+}

+CPDF_ColorSpace* CPDF_StreamContentParser::FindColorSpace(const CFX_ByteString& name)

+{

+    if (name == FX_BSTRC("Pattern")) {

+        return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);

+    }

+    if (name == FX_BSTRC("DeviceGray") || name == FX_BSTRC("DeviceCMYK") || name == FX_BSTRC("DeviceRGB")) {

+        CFX_ByteString defname = "Default";

+        defname += name.Mid(7);

+        CPDF_Object* pDefObj = FindResourceObj(FX_BSTRC("ColorSpace"), defname);

+        if (pDefObj == NULL) {

+            if (name == FX_BSTRC("DeviceGray")) {

+                return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);

+            }

+            if (name == FX_BSTRC("DeviceRGB")) {

+                return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);

+            }

+            return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);

+        }

+        return m_pDocument->LoadColorSpace(pDefObj);

+    }

+    CPDF_Object* pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);

+    if (pCSObj == NULL) {

+        m_bResourceMissing = TRUE;

+        return NULL;

+    }

+    return m_pDocument->LoadColorSpace(pCSObj);

+}

+CPDF_Pattern* CPDF_StreamContentParser::FindPattern(const CFX_ByteString& name, FX_BOOL bShading)

+{

+    CPDF_Object* pPattern = FindResourceObj(bShading ? FX_BSTRC("Shading") : FX_BSTRC("Pattern"), name);

+    if (pPattern == NULL || (pPattern->GetType() != PDFOBJ_DICTIONARY &&

+                             pPattern->GetType() != PDFOBJ_STREAM)) {

+        m_bResourceMissing = TRUE;

+        return NULL;

+    }

+    return m_pDocument->LoadPattern(pPattern, bShading, &m_pCurStates->m_ParentMatrix);

+}

+void CPDF_StreamContentParser::ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y)

+{

+    m_pCurStates->m_TextMatrix.Transform(x, y, x, y);

+    ConvertUserSpace(x, y);

+}

+void CPDF_StreamContentParser::ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y)

+{

+    m_pCurStates->m_CTM.Transform(x, y, x, y);

+    m_mtContentToUser.Transform(x, y, x, y);

+}

+void CPDF_StreamContentParser::AddTextObject(CFX_ByteString* pStrs, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int nsegs)

+{

+    CPDF_Font* pFont = m_pCurStates->m_TextState.GetFont();

+    if (pFont == NULL) {

+        return;

+    }

+    if (fInitKerning != 0) {

+        if (!pFont->IsVertWriting()) {

+            m_pCurStates->m_TextX -= FXSYS_Mul(fInitKerning, m_pCurStates->m_TextState.GetFontSize()) / 1000;

+        } else {

+            m_pCurStates->m_TextY -= FXSYS_Mul(fInitKerning, m_pCurStates->m_TextState.GetFontSize()) / 1000;

+        }

+    }

+    if (nsegs == 0) {

+        return;

+    }

+    int textmode;

+    if (pFont->GetFontType() == PDFFONT_TYPE3) {

+        textmode = 0;

+    } else {

+        textmode = m_pCurStates->m_TextState.GetObject()->m_TextMode;

+    }

+    CPDF_TextObject* pText = FX_NEW CPDF_TextObject;

+    m_pLastTextObject = pText;

+    SetGraphicStates(pText, TRUE, TRUE, TRUE);

+    if (textmode && textmode != 3 && textmode != 4 && textmode != 7) {

+        FX_FLOAT* pCTM = pText->m_TextState.GetModify()->m_CTM;

+        pCTM[0] = m_pCurStates->m_CTM.a;

+        pCTM[1] = m_pCurStates->m_CTM.c;

+        pCTM[2] = m_pCurStates->m_CTM.b;

+        pCTM[3] = m_pCurStates->m_CTM.d;

+    }

+    pText->SetSegments(pStrs, pKerning, nsegs);

+    pText->m_PosX = m_pCurStates->m_TextX;

+    pText->m_PosY = m_pCurStates->m_TextY + m_pCurStates->m_TextRise;

+    ConvertTextSpace(pText->m_PosX, pText->m_PosY);

+    FX_FLOAT x_advance, y_advance;

+    pText->CalcPositionData(&x_advance, &y_advance, m_pCurStates->m_TextHorzScale, m_Level);

+    m_pCurStates->m_TextX += x_advance;

+    m_pCurStates->m_TextY += y_advance;

+    if (textmode > 3) {

+        CPDF_TextObject* pCopy = FX_NEW CPDF_TextObject;

+        pCopy->Copy(pText);

+        m_ClipTextList.Add(pCopy);

+    }

+    m_pObjectList->m_ObjectList.AddTail(pText);

+    if (pKerning && pKerning[nsegs - 1] != 0) {

+        if (!pFont->IsVertWriting()) {

+            m_pCurStates->m_TextX -= FXSYS_Mul(pKerning[nsegs - 1], m_pCurStates->m_TextState.GetFontSize()) / 1000;

+        } else {

+            m_pCurStates->m_TextY -= FXSYS_Mul(pKerning[nsegs - 1], m_pCurStates->m_TextState.GetFontSize()) / 1000;

+        }

+    }

+}

+void CPDF_StreamContentParser::Handle_ShowText()

+{

+    CFX_ByteString str = GetString(0);

+    if (str.IsEmpty()) {

+        return;

+    }

+    AddTextObject(&str, 0, NULL, 1);

+}

+void CPDF_StreamContentParser::Handle_ShowText_Positioning()

+{

+    CPDF_Array* pArray = GetObject(0)->GetArray();

+    if (pArray == NULL) {

+        return;

+    }

+    int n = pArray->GetCount(), nsegs = 0, i;

+    for (i = 0; i < n; i ++) {

+        CPDF_Object* pObj = pArray->GetElementValue(i);

+        if (pObj->GetType() == PDFOBJ_STRING) {

+            nsegs ++;

+        }

+    }

+    if (nsegs == 0) {

+        for (i = 0; i < n; i ++) {

+            m_pCurStates->m_TextX -= FXSYS_Mul(pArray->GetNumber(i), m_pCurStates->m_TextState.GetFontSize()) / 1000;

+        };

+        return;

+    }

+    CFX_ByteString* pStrs;

+    FX_NEW_VECTOR(pStrs, CFX_ByteString, nsegs);

+    FX_FLOAT* pKerning = FX_Alloc(FX_FLOAT, nsegs);

+    int iSegment = 0;

+    FX_FLOAT fInitKerning = 0;

+    for (i = 0; i < n; i ++) {

+        CPDF_Object* pObj = pArray->GetElementValue(i);

+        if (pObj->GetType() == PDFOBJ_STRING) {

+            CFX_ByteString str = pObj->GetString();

+            if (str.IsEmpty()) {

+                continue;

+            }

+            pStrs[iSegment] = str;

+            pKerning[iSegment ++] = 0;

+        } else {

+            if (iSegment == 0) {

+                fInitKerning += pObj->GetNumber();

+            } else {

+                pKerning[iSegment - 1] += pObj->GetNumber();

+            }

+        }

+    }

+    AddTextObject(pStrs, fInitKerning, pKerning, iSegment);

+    FX_DELETE_VECTOR(pStrs, CFX_ByteString, nsegs);

+    FX_Free(pKerning);

+}

+void CPDF_StreamContentParser::Handle_SetTextLeading()

+{

+    m_pCurStates->m_TextLeading = GetNumber(0);

+}

+void CPDF_StreamContentParser::Handle_SetTextMatrix()

+{

+    m_pCurStates->m_TextMatrix.Set(GetNumber16(5), GetNumber16(4), GetNumber16(3),

+                                   GetNumber16(2), GetNumber(1), GetNumber(0));

+    OnChangeTextMatrix();

+    m_pCurStates->m_TextX = 0;

+    m_pCurStates->m_TextY = 0;

+    m_pCurStates->m_TextLineX = 0;

+    m_pCurStates->m_TextLineY = 0;

+}

+void CPDF_StreamContentParser::OnChangeTextMatrix()

+{

+    CFX_AffineMatrix text_matrix(m_pCurStates->m_TextHorzScale, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);

+    text_matrix.Concat(m_pCurStates->m_TextMatrix);

+    text_matrix.Concat(m_pCurStates->m_CTM);

+    text_matrix.Concat(m_mtContentToUser);

+    FX_FLOAT* pTextMatrix = m_pCurStates->m_TextState.GetModify()->m_Matrix;

+    pTextMatrix[0] = text_matrix.a;

+    pTextMatrix[1] = text_matrix.c;

+    pTextMatrix[2] = text_matrix.b;

+    pTextMatrix[3] = text_matrix.d;

+}

+void CPDF_StreamContentParser::Handle_SetTextRenderMode()

+{

+    int mode = GetInteger(0);

+    if (mode < 0 || mode > 7) {

+        return;

+    }

+    m_pCurStates->m_TextState.GetModify()->m_TextMode = mode;

+}

+void CPDF_StreamContentParser::Handle_SetTextRise()

+{

+    m_pCurStates->m_TextRise = GetNumber(0);

+}

+void CPDF_StreamContentParser::Handle_SetWordSpace()

+{

+    m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(0);

+}

+void CPDF_StreamContentParser::Handle_SetHorzScale()

+{

+    if (m_ParamCount != 1) {

+        return;

+    }

+    m_pCurStates->m_TextHorzScale = GetNumber(0) / 100;

+    OnChangeTextMatrix();

+}

+void CPDF_StreamContentParser::Handle_MoveToNextLine()

+{

+    m_pCurStates->m_TextLineY -= m_pCurStates->m_TextLeading;

+    m_pCurStates->m_TextX = m_pCurStates->m_TextLineX;

+    m_pCurStates->m_TextY = m_pCurStates->m_TextLineY;

+}

+void CPDF_StreamContentParser::Handle_CurveTo_23()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_BEZIERTO);

+    AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);

+    AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);

+}

+void CPDF_StreamContentParser::Handle_SetLineWidth()

+{

+    FX_FLOAT width = GetNumber(0);

+    m_pCurStates->m_GraphState.GetModify()->m_LineWidth = width;

+}

+void CPDF_StreamContentParser::Handle_Clip()

+{

+    m_PathClipType = FXFILL_WINDING;

+}

+void CPDF_StreamContentParser::Handle_EOClip()

+{

+    m_PathClipType = FXFILL_ALTERNATE;

+}

+void CPDF_StreamContentParser::Handle_CurveTo_13()

+{

+    if (m_Options.m_bTextOnly) {

+        return;

+    }

+    AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);

+    AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);

+    AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);

+}

+void CPDF_StreamContentParser::Handle_NextLineShowText()

+{

+    Handle_MoveToNextLine();

+    Handle_ShowText();

+}

+void CPDF_StreamContentParser::Handle_NextLineShowText_Space()

+{

+    m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(2);

+    m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(1);

+    Handle_NextLineShowText();

+}

+void CPDF_StreamContentParser::Handle_Invalid()

+{

+}

+void CPDF_StreamContentParser::AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag)

+{

+    m_PathCurrentX = x;

+    m_PathCurrentY = y;

+    if (flag == FXPT_MOVETO) {

+        m_PathStartX = x;

+        m_PathStartY = y;

+        if (m_PathPointCount && m_pPathPoints[m_PathPointCount - 1].m_Flag == FXPT_MOVETO) {

+            m_pPathPoints[m_PathPointCount - 1].m_PointX = x;

+            m_pPathPoints[m_PathPointCount - 1].m_PointY = y;

+            return;

+        }

+    } else if (m_PathPointCount == 0) {

+        return;

+    }

+    m_PathPointCount ++;

+    if (m_PathPointCount > m_PathAllocSize) {

+        int newsize = m_PathPointCount + 256;

+        FX_PATHPOINT* pNewPoints = FX_Alloc(FX_PATHPOINT, newsize);

+        if (m_PathAllocSize) {

+            FXSYS_memcpy32(pNewPoints, m_pPathPoints, m_PathAllocSize * sizeof(FX_PATHPOINT));

+            FX_Free(m_pPathPoints);

+        }

+        m_pPathPoints = pNewPoints;

+        m_PathAllocSize = newsize;

+    }

+    m_pPathPoints[m_PathPointCount - 1].m_Flag = flag;

+    m_pPathPoints[m_PathPointCount - 1].m_PointX = x;

+    m_pPathPoints[m_PathPointCount - 1].m_PointY = y;

+}

+void CPDF_StreamContentParser::AddPathObject(int FillType, FX_BOOL bStroke)

+{

+    int PathPointCount = m_PathPointCount, PathClipType = m_PathClipType;

+    m_PathPointCount = 0;

+    m_PathClipType = 0;

+    if (PathPointCount <= 1) {

+        if (PathPointCount && PathClipType) {

+            CPDF_Path path;

+            path.New()->AppendRect(0, 0, 0, 0);

+            m_pCurStates->m_ClipPath.AppendPath(path, FXFILL_WINDING, TRUE);

+        }

+        return;

+    }

+    if (PathPointCount && m_pPathPoints[PathPointCount - 1].m_Flag == FXPT_MOVETO) {

+        PathPointCount --;

+    }

+    CPDF_Path Path;

+    CFX_PathData* pPathData = Path.New();

+    pPathData->SetPointCount(PathPointCount);

+    FXSYS_memcpy32(pPathData->GetPoints(), m_pPathPoints, sizeof(FX_PATHPOINT) * PathPointCount);

+    CFX_AffineMatrix matrix = m_pCurStates->m_CTM;

+    matrix.Concat(m_mtContentToUser);

+    if (bStroke || FillType) {

+        CPDF_PathObject* pPathObj = FX_NEW CPDF_PathObject;

+        pPathObj->m_bStroke = bStroke;

+        pPathObj->m_FillType = FillType;

+        pPathObj->m_Path = Path;

+        pPathObj->m_Matrix = matrix;

+        SetGraphicStates(pPathObj, TRUE, FALSE, TRUE);

+        pPathObj->CalcBoundingBox();

+        m_pObjectList->m_ObjectList.AddTail(pPathObj);

+    }

+    if (PathClipType) {

+        if (!matrix.IsIdentity()) {

+            Path.Transform(&matrix);

+            matrix.SetIdentity();

+        }

+        m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, TRUE);

+    }

+}

+CFX_ByteString _FPDF_ByteStringFromHex(CFX_BinaryBuf& src_buf)

+{

+    CFX_ByteTextBuf buf;

+    FX_BOOL bFirst = TRUE;

+    int code = 0;

+    FX_LPCBYTE str = src_buf.GetBuffer();

+    FX_DWORD size = src_buf.GetSize();

+    for (FX_DWORD i = 0; i < size; i ++) {

+        FX_BYTE ch = str[i];

+        if (ch >= '0' && ch <= '9') {

+            if (bFirst) {

+                code = (ch - '0') * 16;

+            } else {

+                code += ch - '0';

+                buf.AppendChar((char)code);

+            }

+            bFirst = !bFirst;

+        } else if (ch >= 'A' && ch <= 'F') {

+            if (bFirst) {

+                code = (ch - 'A' + 10) * 16;

+            } else {

+                code += ch - 'A' + 10;

+                buf.AppendChar((char)code);

+            }

+            bFirst = !bFirst;

+        } else if (ch >= 'a' && ch <= 'f') {

+            if (bFirst) {

+                code = (ch - 'a' + 10) * 16;

+            } else {

+                code += ch - 'a' + 10;

+                buf.AppendChar((char)code);

+            }

+            bFirst = !bFirst;

+        }

+    }

+    if (!bFirst) {

+        buf.AppendChar((char)code);

+    }

+    return buf.GetByteString();

+}

diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp
new file mode 100644
index 0000000..2eeb1fe
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp
@@ -0,0 +1,822 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "pageint.h"

+#if defined(_FPDFAPI_MINI_)

+extern const FX_LPCSTR _PDF_CharType;

+void CPDF_StreamContentParser::InputData(FX_LPCBYTE src_buf, FX_DWORD src_size)

+{

+    if (m_Level > _FPDF_MAX_FORM_LEVEL_) {

+        return;

+    }

+    for (FX_DWORD i = 0; i < src_size; i ++) {

+        int ch = src_buf[i];

+        int type = _PDF_CharType[ch];

+start:

+        switch (m_WordState) {

+            case 0:

+                if (type == 'W') {

+                } else if (type == 'N') {

+                    m_WordState = 5;

+                    m_pWordBuf[0] = ch;

+                    m_WordSize = 1;

+                } else if (type == 'R') {

+                    m_WordState = 4;

+                    m_pWordBuf[0] = ch;

+                    m_WordSize = 1;

+                } else switch (ch) {

+                        case '/':

+                            m_WordState = 2;

+                            m_WordSize = 0;

+                            break;

+                        case '[':

+                            StartArray();

+                            break;

+                        case ']':

+                            EndArray();

+                            break;

+                        case '(':

+                            m_WordState = 7;

+                            m_StringLevel = 1;

+                            m_StringState = 0;

+                            m_StringBuf.Clear();

+                            break;

+                        case '<':

+                            m_WordState = 3;

+                            break;

+                        case '>':

+                            m_WordState = 8;

+                            break;

+                        case '%':

+                            m_WordState = 1;

+                            break;

+                    }

+                break;

+            case 1:

+                if (ch == '\n' || ch == '\r') {

+                    m_WordState = 0;

+                }

+                break;

+            case 2:

+                if (type != 'R' && type != 'N') {

+                    EndName();

+                    m_WordState = 0;

+                    goto start;

+                }

+                if (m_WordSize < 256) {

+                    m_pWordBuf[m_WordSize++] = ch;

+                }

+                break;

+            case 3:

+                if (ch == '<') {

+                    StartDict();

+                    m_WordState = 0;

+                } else {

+                    m_StringBuf.Clear();

+                    m_WordState = 6;

+                    goto start;

+                }

+                break;

+            case 4:

+                if (type != 'R' && type != 'N') {

+                    m_WordState = 0;

+                    EndKeyword();

+                    if (m_bAbort) {

+                        return;

+                    }

+                    goto start;

+                }

+                if (m_WordSize < 256) {

+                    m_pWordBuf[m_WordSize++] = ch;

+                }

+                break;

+            case 5:

+                if (type != 'N') {

+                    EndNumber();

+                    m_WordState = 0;

+                    goto start;

+                }

+                if (m_WordSize < 256) {

+                    m_pWordBuf[m_WordSize++] = ch;

+                }

+                break;

+            case 6:

+                if (ch == '>') {

+                    EndHexString();

+                    m_WordState = 0;

+                } else {

+                    m_StringBuf.AppendByte(ch);

+                }

+                break;

+            case 7:

+                switch (m_StringState) {

+                    case 0:

+                        if (ch == ')') {

+                            m_StringLevel --;

+                            if (m_StringLevel == 0) {

+                                EndString();

+                                m_WordState = 0;

+                                break;

+                            }

+                            m_StringBuf.AppendByte(')');

+                        } else if (ch == '(') {

+                            m_StringLevel ++;

+                            m_StringBuf.AppendByte('(');

+                        } else if (ch == '\\') {

+                            m_StringState = 1;

+                        } else {

+                            m_StringBuf.AppendByte((char)ch);

+                        }

+                        break;

+                    case 1:

+                        if (ch >= '0' && ch <= '7') {

+                            m_EscCode = ch - '0';

+                            m_StringState = 2;

+                            break;

+                        }

+                        if (ch == 'n') {

+                            m_StringBuf.AppendByte('\n');

+                        } else if (ch == 'r') {

+                            m_StringBuf.AppendByte('\r');

+                        } else if (ch == 't') {

+                            m_StringBuf.AppendByte('\t');

+                        } else if (ch == 'b') {

+                            m_StringBuf.AppendByte('\b');

+                        } else if (ch == 'f') {

+                            m_StringBuf.AppendByte('\f');

+                        } else if (ch == '\\') {

+                            m_StringBuf.AppendByte('\\');

+                        } else if (ch == '(') {

+                            m_StringBuf.AppendByte('(');

+                        } else if (ch == ')') {

+                            m_StringBuf.AppendByte(')');

+                        } else if (ch == '\r') {

+                            m_StringState = 4;

+                            break;

+                        } else if (ch == '\n') {

+                        } else {

+                            m_StringBuf.AppendByte(ch);

+                        }

+                        m_StringState = 0;

+                        break;

+                    case 2:

+                        if (ch >= '0' && ch <= '7') {

+                            m_EscCode = m_EscCode * 8 + ch - '0';

+                            m_StringState = 3;

+                        } else {

+                            m_StringBuf.AppendByte(m_EscCode);

+                            m_StringState = 0;

+                            goto start;

+                        }

+                        break;

+                    case 3:

+                        if (ch >= '0' && ch <= '7') {

+                            m_EscCode = m_EscCode * 8 + ch - '0';

+                            m_StringBuf.AppendByte(m_EscCode);

+                            m_StringState = 0;

+                        } else {

+                            m_StringBuf.AppendByte(m_EscCode);

+                            m_StringState = 0;

+                            goto start;

+                        }

+                        break;

+                    case 4:

+                        m_StringState = 0;

+                        if (ch != '\n') {

+                            goto start;

+                        }

+                        break;

+                }

+                break;

+            case 8:

+                m_WordState = 0;

+                if (ch == '>') {

+                    EndDict();

+                } else {

+                    goto start;

+                }

+                break;

+            case 9:

+                switch (m_InlineImageState) {

+                    case 0:

+                        if (type == 'W' || type == 'D') {

+                            m_InlineImageState = 1;

+                            m_InlineWhiteChar = ch;

+                        } else {

+                            m_StringBuf.AppendByte(ch);

+                        }

+                        break;

+                    case 1:

+                        m_StringBuf.AppendByte(m_InlineWhiteChar);

+                        if (ch == 'I') {

+                            m_InlineImageState = 2;

+                        } else {

+                            m_InlineImageState = 0;

+                            goto start;

+                        }

+                        break;

+                    case 2:

+                        if (ch == 'D') {

+                            m_InlineImageState = 3;

+                        } else {

+                            m_StringBuf.AppendByte('I');

+                            m_InlineImageState = 0;

+                            goto start;

+                        }

+                        break;

+                    case 3:

+                        EndImageDict();

+                        break;

+                }

+                break;

+            case 10:

+                switch (m_InlineImageState) {

+                    case 0:

+                        if (type == 'W') {

+                            m_InlineImageState = 1;

+                            m_InlineWhiteChar = ch;

+                        } else {

+                            m_ImageSrcBuf.AppendByte(ch);

+                        }

+                        break;

+                    case 1:

+                        if (ch == 'E') {

+                            m_InlineImageState = 2;

+                        } else {

+                            m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);

+                            m_InlineImageState = 0;

+                            goto start;

+                        }

+                        break;

+                    case 2:

+                        if (ch == 'I') {

+                            m_InlineImageState = 3;

+                        } else {

+                            m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);

+                            m_ImageSrcBuf.AppendByte('E');

+                            m_InlineImageState = 0;

+                            goto start;

+                        }

+                        break;

+                    case 3:

+                        if (type == 'W') {

+                            EndInlineImage();

+                        } else {

+                            m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);

+                            m_ImageSrcBuf.AppendByte('E');

+                            m_ImageSrcBuf.AppendByte('I');

+                            m_InlineImageState = 0;

+                            goto start;

+                        }

+                        break;

+                }

+                break;

+            case 11:

+                if (m_InlineImageState < m_ImageSrcBuf.GetSize()) {

+                    m_ImageSrcBuf.GetBuffer()[m_InlineImageState ++] = ch;

+                } else {

+                    if (ch == 'I') {

+                        EndInlineImage();

+                    }

+                }

+                break;

+        }

+    }

+}

+void CPDF_StreamContentParser::Finish()

+{

+    switch (m_WordState) {

+        case 0:

+            break;

+        case 1:

+            break;

+        case 2:

+            EndName();

+            break;

+        case 3:

+            break;

+        case 4:

+            EndKeyword();

+            break;

+        case 5:

+            EndNumber();

+            break;

+        case 6:

+            EndHexString();

+            break;

+        case 7:

+            EndString();

+            break;

+        case 8:

+            break;

+        case 9:

+            break;

+        case 10:

+            EndInlineImage();

+            break;

+    }

+    m_WordState = 0;

+}

+void CPDF_StreamContentParser::AddContainer(CPDF_Object* pObject)

+{

+    if (m_ObjectSize) {

+        m_pObjectState[m_ObjectSize] = SetToCurObj(pObject);

+    }

+    FXSYS_assert(m_ObjectSize < _FPDF_MAX_OBJECT_STACK_SIZE_);

+    m_pObjectStack[m_ObjectSize++] = pObject;

+}

+FX_BOOL CPDF_StreamContentParser::SetToCurObj(CPDF_Object* pObject)

+{

+    if (m_ObjectSize == 0) {

+        AddObjectParam(pObject);

+        return TRUE;

+    }

+    FX_BOOL bInArrayOrDict = TRUE;

+    CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];

+    if (pCurObj->GetType() == PDFOBJ_ARRAY) {

+        ((CPDF_Array*)pCurObj)->Add(pObject, m_pDocument);

+    } else {

+        if (!m_bDictName && m_pDictName[0]) {

+            ((CPDF_Dictionary*)pCurObj)->SetAt((FX_LPCSTR)m_pDictName, pObject, m_pDocument);

+        } else {

+            bInArrayOrDict = FALSE;

+        }

+        m_bDictName = TRUE;

+    }

+    return bInArrayOrDict;

+}

+void CPDF_StreamContentParser::StartArray()

+{

+    if (m_ObjectSize)

+        if (m_pObjectStack[0]->GetType() != PDFOBJ_DICTIONARY && m_pObjectStack[m_ObjectSize - 1]->GetType() == PDFOBJ_ARRAY) {

+            return;

+        }

+    CPDF_Array* pArray = FX_NEW CPDF_Array;

+    AddContainer(pArray);

+}

+void CPDF_StreamContentParser::EndArray()

+{

+    if (m_ObjectSize == 0) {

+        return;

+    }

+    CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];

+    if (pCurObj->GetType() != PDFOBJ_ARRAY) {

+        return;

+    }

+    m_ObjectSize --;

+    if (m_ObjectSize == 0) {

+        AddObjectParam(pCurObj);

+    } else {

+        if (!m_pObjectState[m_ObjectSize]) {

+            pCurObj->Release();

+        }

+    }

+    m_pObjectState[m_ObjectSize] = FALSE;

+}

+void CPDF_StreamContentParser::StartDict()

+{

+    CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;

+    AddContainer(pDict);

+    m_bDictName = TRUE;

+}

+void CPDF_StreamContentParser::EndDict()

+{

+    if (m_ObjectSize == 0) {

+        return;

+    }

+    CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];

+    if (pCurObj->GetType() != PDFOBJ_DICTIONARY) {

+        return;

+    }

+    m_ObjectSize --;

+    if (m_ObjectSize == 0) {

+        AddObjectParam(pCurObj);

+    } else {

+        if (!m_pObjectState[m_ObjectSize]) {

+            pCurObj->Release();

+        }

+    }

+    m_pObjectState[m_ObjectSize] = FALSE;

+}

+void CPDF_StreamContentParser::EndName()

+{

+    if (m_ObjectSize == 0) {

+        AddNameParam((FX_LPCSTR)m_pWordBuf, m_WordSize);

+        return;

+    }

+    CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];

+    if (pCurObj->GetType() == PDFOBJ_ARRAY) {

+        ((CPDF_Array*)pCurObj)->AddName(CFX_ByteString(m_pWordBuf, m_WordSize));

+    } else {

+        if (m_bDictName) {

+            FXSYS_memcpy32(m_pDictName, m_pWordBuf, m_WordSize);

+            m_pDictName[m_WordSize] = 0;

+        } else {

+            if (m_pDictName[0] != 0) {

+                ((CPDF_Dictionary*)pCurObj)->SetAtName((FX_LPCSTR)m_pDictName, CFX_ByteString(m_pWordBuf, m_WordSize));

+            }

+        }

+        m_bDictName = !m_bDictName;

+    }

+}

+void CPDF_StreamContentParser::EndNumber()

+{

+    if (m_ObjectSize == 0) {

+        AddNumberParam((FX_LPCSTR)m_pWordBuf, m_WordSize);

+        return;

+    }

+    CPDF_Number *pObj = FX_NEW CPDF_Number(CFX_ByteStringC(m_pWordBuf, m_WordSize));

+    if (!SetToCurObj(pObj)) {

+        pObj->Release();

+    }

+}

+extern CFX_ByteString _FPDF_ByteStringFromHex(CFX_BinaryBuf& src_buf);

+void CPDF_StreamContentParser::EndHexString()

+{

+    CPDF_String *pObj = FX_NEW CPDF_String(_FPDF_ByteStringFromHex(m_StringBuf), TRUE);

+    if (!SetToCurObj(pObj)) {

+        pObj->Release();

+    }

+}

+void CPDF_StreamContentParser::EndString()

+{

+    CPDF_String *pObj = FX_NEW CPDF_String(m_StringBuf.GetByteString());

+    if (!SetToCurObj(pObj)) {

+        pObj->Release();

+    }

+}

+void CPDF_StreamContentParser::Handle_BeginImage(void)

+{

+    m_WordState = 9;

+    m_InlineImageState = 0;

+    m_StringBuf.Clear();

+}

+void _PDF_ReplaceAbbr(CPDF_Object* pObj);

+void CPDF_StreamContentParser::EndImageDict()

+{

+    if (m_StringBuf.GetSize() != m_LastImageDict.GetSize() ||

+            FXSYS_memcmp32(m_StringBuf.GetBuffer(), m_LastImageDict.GetBuffer(), m_StringBuf.GetSize())) {

+        m_WordState = 0;

+        StartDict();

+        InputData(m_StringBuf.GetBuffer(), m_StringBuf.GetSize());

+        Finish();

+        m_bSameLastDict = FALSE;

+        if (m_pLastImageDict && m_bReleaseLastDict) {

+            m_pLastImageDict->Release();

+            m_pLastImageDict = NULL;

+        }

+        if (!m_ObjectSize) {

+            m_InlineImageState = 0;

+            return;

+        }

+        m_pLastImageDict = (CPDF_Dictionary*)m_pObjectStack[--m_ObjectSize];

+        m_bReleaseLastDict = !m_pObjectState[m_ObjectSize];

+        m_pObjectState[m_ObjectSize] = FALSE;

+        _PDF_ReplaceAbbr(m_pLastImageDict);

+        m_LastImageDict.TakeOver(m_StringBuf);

+        if (m_pLastImageDict->KeyExist(FX_BSTRC("ColorSpace"))) {

+            CPDF_Object* pCSObj = m_pLastImageDict->GetElementValue(FX_BSTRC("ColorSpace"));

+            if (pCSObj->GetType() == PDFOBJ_NAME) {

+                CFX_ByteString name = pCSObj->GetString();

+                if (name != FX_BSTRC("DeviceRGB") && name != FX_BSTRC("DeviceGray") && name != FX_BSTRC("DeviceCMYK")) {

+                    pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);

+                    if (pCSObj) {

+                        if (!pCSObj->GetObjNum()) {

+                            pCSObj = pCSObj->Clone();

+                        }

+                        m_pLastImageDict->SetAt(FX_BSTRC("ColorSpace"), pCSObj, m_pDocument);

+                    }

+                }

+            }

+        }

+    } else {

+        m_bSameLastDict = TRUE;

+    }

+    m_ImageSrcBuf.Clear();

+    if (m_pLastCloneImageDict) {

+        m_pLastCloneImageDict->Release();

+    }

+    m_pLastCloneImageDict = (CPDF_Dictionary*)m_pLastImageDict->Clone();

+    if (m_pLastCloneImageDict->KeyExist(FX_BSTRC("Filter"))) {

+        m_WordState = 10;

+        m_InlineImageState = 0;

+    } else {

+        int width = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Width"));

+        int height = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Height"));

+        int OrigSize = 0;

+        CPDF_Object* pCSObj = m_pLastCloneImageDict->GetElementValue(FX_BSTRC("ColorSpace"));

+        if (pCSObj != NULL) {

+            int bpc = m_pLastCloneImageDict->GetInteger(FX_BSTRC("BitsPerComponent"));

+            int nComponents = 1;

+            CPDF_ColorSpace* pCS = m_pDocument->LoadColorSpace(pCSObj);

+            if (pCS == NULL) {

+                nComponents = 3;

+            } else {

+                nComponents = pCS->CountComponents();

+                m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj);

+            }

+            int pitch = (width * bpc * nComponents + 7) / 8;

+            OrigSize = pitch * height;

+        } else {

+            OrigSize = ((width + 7) / 8) * height;

+        }

+        m_ImageSrcBuf.AppendBlock(NULL, OrigSize);

+        m_WordState = 11;

+        m_InlineImageState = 0;

+    }

+}

+void CPDF_StreamContentParser::EndInlineImage()

+{

+    CFX_AffineMatrix ImageMatrix;

+    ImageMatrix.Copy(m_pCurStates->m_CTM);

+    ImageMatrix.Concat(m_mtContentToUser);

+    m_LastImageData.CopyData(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize());

+    CPDF_Stream* pStream = CPDF_Stream::Create(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize(),

+                           m_pLastCloneImageDict);

+    m_ImageSrcBuf.DetachBuffer();

+    m_pLastCloneImageDict = NULL;

+    CPDF_InlineImages* pImages = FX_NEW CPDF_InlineImages;

+    pImages->m_pStream = pStream;

+    SetGraphicStates(pImages, !m_pLastCloneImageDict->KeyExist(FX_BSTRC("ColorSpace")), FALSE, FALSE);

+    pImages->AddMatrix(ImageMatrix);

+    m_pObjectList->m_ObjectList.AddTail(pImages);

+    m_WordState = 0;

+}

+#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)

+#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)

+#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)

+void CPDF_StreamContentParser::EndKeyword()

+{

+    CPDF_Object *pObj = NULL;

+    if (m_WordSize == 4) {

+        if (*(FX_DWORD*)m_pWordBuf == FXDWORD_TRUE) {

+            pObj = CPDF_Boolean::Create(TRUE);

+            if (!SetToCurObj(pObj)) {

+                pObj->Release();

+            }

+            return;

+        } else if (*(FX_DWORD*)m_pWordBuf == FXDWORD_NULL) {

+            pObj = CPDF_Null::Create();

+            if (!SetToCurObj(pObj)) {

+                pObj->Release();

+            }

+            return;

+        }

+    } else if (m_WordSize == 5) {

+        if (*(FX_DWORD*)m_pWordBuf == FXDWORD_FALS && m_pWordBuf[4] == 'e') {

+            pObj = CPDF_Boolean::Create(FALSE);

+            if (!SetToCurObj(pObj)) {

+                pObj->Release();

+            }

+            return;

+        }

+    }

+    m_pWordBuf[m_WordSize] = 0;

+    OnOperator((char*)m_pWordBuf);

+    ClearAllParams();

+}

+#define PAGEPARSE_STAGE_PARSE			2

+#define PAGEPARSE_STAGE_CHECKCLIP		3

+CPDF_ContentParser::CPDF_ContentParser()

+{

+    m_pParser = NULL;

+    m_Status = Ready;

+    m_pStreamFilter = NULL;

+    m_pType3Char = NULL;

+}

+CPDF_ContentParser::~CPDF_ContentParser()

+{

+    Clear();

+}

+void CPDF_ContentParser::Clear()

+{

+    if (m_pParser) {

+        delete m_pParser;

+    }

+    if (m_pStreamFilter) {

+        delete m_pStreamFilter;

+    }

+    m_pParser = NULL;

+    m_Status = Ready;

+}

+void CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)

+{

+    if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {

+        m_Status = Done;

+        return;

+    }

+    m_pObjects = pPage;

+    m_bForm = FALSE;

+    if (pOptions) {

+        m_Options = *pOptions;

+    }

+    CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));

+    if (pContent == NULL) {

+        m_Status = Done;

+        return;

+    }

+    if (pContent->GetType() == PDFOBJ_STREAM) {

+        m_nStreams = 1;

+    } else if (pContent->GetType() == PDFOBJ_ARRAY) {

+        m_nStreams = ((CPDF_Array*)pContent)->GetCount();

+    } else {

+        m_Status = Done;

+        return;

+    }

+    m_Status = ToBeContinued;

+    m_InternalStage = PAGEPARSE_STAGE_PARSE;

+    m_CurrentOffset = 0;

+    m_pParser = FX_NEW CPDF_StreamContentParser;

+    m_pParser->Initialize();

+    m_pParser->PrepareParse(pPage->m_pDocument, pPage->m_pResources, NULL, NULL, pPage,

+                            pPage->m_pResources, &pPage->m_BBox, &m_Options, NULL, 0);

+    m_pParser->m_pCurStates->m_ColorState.GetModify()->Default();

+}

+void CPDF_ContentParser::Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,

+                               CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)

+{

+    m_pType3Char = pType3Char;

+    m_pObjects = pForm;

+    m_bForm = TRUE;

+    CFX_AffineMatrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));

+    if (pGraphicStates) {

+        form_matrix.Concat(pGraphicStates->m_CTM);

+    }

+    CPDF_Array* pBBox = pForm->m_pFormDict->GetArray(FX_BSTRC("BBox"));

+    CFX_FloatRect form_bbox;

+    CPDF_Path ClipPath;

+    if (pBBox) {

+        form_bbox = pBBox->GetRect();

+        ClipPath.New();

+        ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);

+        ClipPath.Transform(&form_matrix);

+        if (pParentMatrix) {

+            ClipPath.Transform(pParentMatrix);

+        }

+        form_bbox.Transform(&form_matrix);

+    }

+    CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));

+    m_pParser = FX_NEW CPDF_StreamContentParser;

+    m_pParser->Initialize();

+    m_pParser->PrepareParse(pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, pParentMatrix, pForm,

+                            pResources, &form_bbox, pOptions, pGraphicStates, level);

+    m_pParser->m_pCurStates->m_CTM = form_matrix;

+    if (ClipPath.NotNull()) {

+        m_pParser->m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);

+    }

+    if (pForm->m_Transparency & PDFTRANS_GROUP) {

+        CPDF_GeneralStateData* pData = m_pParser->m_pCurStates->m_GeneralState.GetModify();

+        pData->m_BlendType = FXDIB_BLEND_NORMAL;

+        pData->m_StrokeAlpha = 1.0f;

+        pData->m_FillAlpha = 1.0f;

+        pData->m_pSoftMask = NULL;

+    }

+    m_pStreamFilter = pForm->m_pFormStream->GetStreamFilter();

+    m_nStreams = 1;

+    m_Status = ToBeContinued;

+    m_InternalStage = PAGEPARSE_STAGE_PARSE;

+    m_CurrentOffset = 0;

+}

+void CPDF_ContentParser::Continue(IFX_Pause* pPause)

+{

+    while (m_Status == ToBeContinued) {

+        if (m_InternalStage == PAGEPARSE_STAGE_PARSE) {

+            if (m_pStreamFilter == NULL) {

+                if (m_CurrentOffset == m_nStreams) {

+                    m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;

+                    if (m_pType3Char) {

+                        m_pType3Char->m_bColored = m_pParser->m_bColored;

+                        m_pType3Char->m_Width = FXSYS_round(m_pParser->m_Type3Data[0] * 1000);

+                        m_pType3Char->m_BBox.left = FXSYS_round(m_pParser->m_Type3Data[2] * 1000);

+                        m_pType3Char->m_BBox.bottom = FXSYS_round(m_pParser->m_Type3Data[3] * 1000);

+                        m_pType3Char->m_BBox.right = FXSYS_round(m_pParser->m_Type3Data[4] * 1000);

+                        m_pType3Char->m_BBox.top = FXSYS_round(m_pParser->m_Type3Data[5] * 1000);

+                        m_pType3Char->m_bPageRequired = m_pParser->m_bResourceMissing;

+                    }

+                    delete m_pParser;

+                    m_pParser = NULL;

+                    continue;

+                }

+                CPDF_Object* pContent = m_pObjects->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));

+                if (pContent->GetType() == PDFOBJ_STREAM) {

+                    m_pStreamFilter = ((CPDF_Stream*)pContent)->GetStreamFilter();

+                } else {

+                    CPDF_Stream* pStream = ((CPDF_Array*)pContent)->GetStream(m_CurrentOffset);

+                    if (pStream == NULL) {

+                        m_CurrentOffset ++;

+                        continue;

+                    }

+                    m_pStreamFilter = pStream->GetStreamFilter();

+                }

+            }

+            FX_DWORD len = m_pStreamFilter->ReadBlock(m_pParser->m_pStreamBuf, STREAM_PARSE_BUFSIZE);

+            m_pParser->InputData(m_pParser->m_pStreamBuf, len);

+            if (m_pParser->m_bAbort) {

+                delete m_pStreamFilter;

+                m_pStreamFilter = NULL;

+                m_Status = Done;

+                delete m_pParser;

+                m_pParser = NULL;

+                return;

+            }

+            if (len < STREAM_PARSE_BUFSIZE) {

+                m_pParser->Finish();

+                m_CurrentOffset ++;

+                delete m_pStreamFilter;

+                m_pStreamFilter = NULL;

+            }

+            if (pPause && pPause->NeedToPauseNow()) {

+                return;

+            }

+        }

+        if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {

+            FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();

+            while (pos) {

+                CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);

+                if (pObj == NULL) {

+                    continue;

+                }

+                if (pObj->m_ClipPath.IsNull()) {

+                    continue;

+                }

+                if (pObj->m_ClipPath.GetPathCount() != 1) {

+                    continue;

+                }

+                if (pObj->m_ClipPath.GetTextCount()) {

+                    continue;

+                }

+                CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);

+                if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {

+                    continue;

+                }

+                CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),

+                                       ClipPath.GetPointX(2), ClipPath.GetPointY(2));

+                CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);

+                if (old_rect.Contains(obj_rect)) {

+                    pObj->m_ClipPath.SetNull();

+                }

+            }

+            if (m_pObjects->m_ObjectList.GetCount() == 1) {

+                CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetAt(m_pObjects->m_ObjectList.GetHeadPosition());

+                if (pObj && pObj->m_Type == PDFPAGE_TEXT) {

+                    CPDF_TextObject* pText = (CPDF_TextObject*)pObj;

+                }

+            }

+            m_Status = Done;

+            return;

+        }

+    }

+}

+int CPDF_ContentParser::EstimateProgress()

+{

+    if (m_Status == Ready) {

+        return 0;

+    }

+    if (m_Status == Done) {

+        return 100;

+    }

+    if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {

+        return 90;

+    }

+    if (m_pStreamFilter == NULL) {

+        return 90 * m_CurrentOffset / m_nStreams;

+    }

+    int total_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_nStreams;

+    int parsed_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_CurrentOffset +

+                          m_pStreamFilter->GetSrcPos();

+    return 90 * parsed_raw_size / total_raw_size;

+}

+CPDF_InlineImages::CPDF_InlineImages()

+{

+    m_Type = PDFPAGE_INLINES;

+    m_pStream = NULL;

+    m_pBitmap = NULL;

+}

+CPDF_InlineImages::~CPDF_InlineImages()

+{

+    if (m_pStream) {

+        m_pStream->Release();

+    }

+    if (m_pBitmap) {

+        delete m_pBitmap;

+    }

+}

+void CPDF_InlineImages::AddMatrix(CFX_AffineMatrix& matrix)

+{

+    m_Matrices.Add(matrix);

+    CFX_FloatRect rect = matrix.GetUnitRect();

+    if (m_Matrices.GetSize() > 1) {

+        CFX_FloatRect rect1(m_Left, m_Bottom, m_Right, m_Top);

+        rect.Union(rect1);

+    }

+    m_Left = rect.left;

+    m_Right = rect.right;

+    m_Top = rect.top;

+    m_Bottom = rect.bottom;

+}

+#endif

diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
new file mode 100644
index 0000000..2f0a18d
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
@@ -0,0 +1,1146 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "pageint.h"

+#include <limits.h>

+extern const FX_LPCSTR _PDF_OpCharType =

+    "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"

+    "IIVIIIIVIIVIIIIIVVIIIIIIIIIIIIII"

+    "IIVVVVVVIVVVVVVIVVVVVIIVVIIIIIII"

+    "IIVVVVVVVVVVVVVVIVVVIIVVIVVIIIII"

+    "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"

+    "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"

+    "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"

+    "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII";

+FX_BOOL _PDF_HasInvalidOpChar(FX_LPCSTR op)

+{

+    if(!op) {

+        return FALSE;

+    }

+    FX_BYTE ch;

+    while((ch = *op++)) {

+        if(_PDF_OpCharType[ch] == 'I') {

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_DWORD CPDF_StreamContentParser::Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost)

+{

+    if (m_Level > _FPDF_MAX_FORM_LEVEL_) {

+        return dwSize;

+    }

+    FX_DWORD InitObjCount = m_pObjectList->CountObjects();

+    CPDF_StreamParser syntax(pData, dwSize);

+    m_pSyntax = &syntax;

+    m_CompatCount = 0;

+    while (1) {

+        FX_DWORD cost = m_pObjectList->CountObjects() - InitObjCount;

+        if (max_cost && cost >= max_cost) {

+            break;

+        }

+        switch (syntax.ParseNextElement()) {

+            case CPDF_StreamParser::EndOfData:

+                return m_pSyntax->GetPos();

+            case CPDF_StreamParser::Keyword:

+                if(!OnOperator((char*)syntax.GetWordBuf()) && _PDF_HasInvalidOpChar((char*)syntax.GetWordBuf())) {

+                    m_bAbort = TRUE;

+                }

+                if (m_bAbort) {

+                    return m_pSyntax->GetPos();

+                }

+                ClearAllParams();

+                break;

+            case CPDF_StreamParser::Number:

+                AddNumberParam((char*)syntax.GetWordBuf(), syntax.GetWordSize());

+                break;

+            case CPDF_StreamParser::Name:

+                AddNameParam((FX_LPCSTR)syntax.GetWordBuf() + 1, syntax.GetWordSize() - 1);

+                break;

+            default:

+                AddObjectParam(syntax.GetObject());

+        }

+    }

+    return m_pSyntax->GetPos();

+}

+void _PDF_ReplaceAbbr(CPDF_Object* pObj);

+void CPDF_StreamContentParser::Handle_BeginImage()

+{

+    FX_FILESIZE savePos = m_pSyntax->GetPos();

+    CPDF_Dictionary* pDict = CPDF_Dictionary::Create();

+    while (1) {

+        CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();

+        if (type == CPDF_StreamParser::Keyword) {

+            CFX_ByteString bsKeyword(m_pSyntax->GetWordBuf(), m_pSyntax->GetWordSize());

+            if (bsKeyword != FX_BSTRC("ID")) {

+                m_pSyntax->SetPos(savePos);

+                pDict->Release();

+                return;

+            }

+        }

+        if (type != CPDF_StreamParser::Name) {

+            break;

+        }

+        CFX_ByteString key((FX_LPCSTR)m_pSyntax->GetWordBuf() + 1, m_pSyntax->GetWordSize() - 1);

+        CPDF_Object* pObj = m_pSyntax->ReadNextObject();

+        if (!key.IsEmpty()) {

+            pDict->SetAt(key, pObj, m_pDocument);

+        } else {

+            pObj->Release();

+        }

+    }

+    _PDF_ReplaceAbbr(pDict);

+    CPDF_Object* pCSObj = NULL;

+    if (pDict->KeyExist(FX_BSTRC("ColorSpace"))) {

+        pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));

+        if (pCSObj->GetType() == PDFOBJ_NAME) {

+            CFX_ByteString name = pCSObj->GetString();

+            if (name != FX_BSTRC("DeviceRGB") && name != FX_BSTRC("DeviceGray") && name != FX_BSTRC("DeviceCMYK")) {

+                pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);

+                if (pCSObj && !pCSObj->GetObjNum()) {

+                    pCSObj = pCSObj->Clone();

+                    pDict->SetAt(FX_BSTRC("ColorSpace"), pCSObj, m_pDocument);

+                }

+            }

+        }

+    }

+    CPDF_Stream* pStream = m_pSyntax->ReadInlineStream(m_pDocument, pDict, pCSObj, m_Options.m_bDecodeInlineImage);

+    while (1) {

+        CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();

+        if (type == CPDF_StreamParser::EndOfData) {

+            break;

+        }

+        if (type != CPDF_StreamParser::Keyword) {

+            continue;

+        }

+        if (m_pSyntax->GetWordSize() == 2 && m_pSyntax->GetWordBuf()[0] == 'E' &&

+                m_pSyntax->GetWordBuf()[1] == 'I') {

+            break;

+        }

+    }

+    if (m_Options.m_bTextOnly) {

+        if (pStream) {

+            pStream->Release();

+        } else {

+            pDict->Release();

+        }

+        return;

+    }

+    pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));

+    CPDF_ImageObject *pImgObj = AddImage(pStream, NULL, TRUE);

+    if (!pImgObj) {

+        if (pStream) {

+            pStream->Release();

+        } else {

+            pDict->Release();

+        }

+    }

+}

+void CPDF_StreamContentParser::ParsePathObject()

+{

+    FX_FLOAT params[6] = {0};

+    int nParams = 0;

+    int last_pos = m_pSyntax->GetPos();

+    while (1) {

+        CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();

+        FX_BOOL bProcessed = TRUE;

+        switch (type) {

+            case CPDF_StreamParser::EndOfData:

+                return;

+            case CPDF_StreamParser::Keyword: {

+                    int len = m_pSyntax->GetWordSize();

+                    if (len == 1) {

+                        switch (m_pSyntax->GetWordBuf()[0]) {

+                            case 'm':

+                                AddPathPoint(params[0], params[1], FXPT_MOVETO);

+                                nParams = 0;

+                                break;

+                            case 'l':

+                                AddPathPoint(params[0], params[1], FXPT_LINETO);

+                                nParams = 0;

+                                break;

+                            case 'c':

+                                AddPathPoint(params[0], params[1], FXPT_BEZIERTO);

+                                AddPathPoint(params[2], params[3], FXPT_BEZIERTO);

+                                AddPathPoint(params[4], params[5], FXPT_BEZIERTO);

+                                nParams = 0;

+                                break;

+                            case 'v':

+                                AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_BEZIERTO);

+                                AddPathPoint(params[0], params[1], FXPT_BEZIERTO);

+                                AddPathPoint(params[2], params[3], FXPT_BEZIERTO);

+                                nParams = 0;

+                                break;

+                            case 'y':

+                                AddPathPoint(params[0], params[1], FXPT_BEZIERTO);

+                                AddPathPoint(params[2], params[3], FXPT_BEZIERTO);

+                                AddPathPoint(params[2], params[3], FXPT_BEZIERTO);

+                                nParams = 0;

+                                break;

+                            case 'h':

+                                Handle_ClosePath();

+                                nParams = 0;

+                                break;

+                            default:

+                                bProcessed = FALSE;

+                                break;

+                        }

+                    } else if (len == 2) {

+                        if (m_pSyntax->GetWordBuf()[0] == 'r' && m_pSyntax->GetWordBuf()[1] == 'e') {

+                            AddPathRect(params[0], params[1], params[2], params[3]);

+                            nParams = 0;

+                        } else {

+                            bProcessed = FALSE;

+                        }

+                    } else {

+                        bProcessed = FALSE;

+                    }

+                    if (bProcessed) {

+                        last_pos = m_pSyntax->GetPos();

+                    }

+                    break;

+                }

+            case CPDF_StreamParser::Number: {

+                    if (nParams == 6) {

+                        break;

+                    }

+                    FX_BOOL bInteger;

+                    int value;

+                    FX_atonum(CFX_ByteStringC(m_pSyntax->GetWordBuf(), m_pSyntax->GetWordSize()), bInteger, &value);

+                    params[nParams++] = bInteger ? (FX_FLOAT)value : *(FX_FLOAT*)&value;

+                    break;

+                }

+            default:

+                bProcessed = FALSE;

+        }

+        if (!bProcessed) {

+            m_pSyntax->SetPos(last_pos);

+            return;

+        }

+    }

+}

+CPDF_StreamParser::CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize)

+{

+    m_pBuf = pData;

+    m_Size = dwSize;

+    m_Pos = 0;

+    m_pLastObj = NULL;

+}

+CPDF_StreamParser::~CPDF_StreamParser()

+{

+    if (m_pLastObj) {

+        m_pLastObj->Release();

+    }

+}

+FX_DWORD _DecodeAllScanlines(ICodec_ScanlineDecoder* pDecoder, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    if (pDecoder == NULL) {

+        return (FX_DWORD) - 1;

+    }

+    int ncomps = pDecoder->CountComps();

+    int bpc = pDecoder->GetBPC();

+    int width = pDecoder->GetWidth();

+    int height = pDecoder->GetHeight();

+    int pitch = (width * ncomps * bpc + 7) / 8;

+    if (height == 0 || pitch > (1 << 30) / height) {

+        delete pDecoder;

+        return -1;

+    }

+    dest_size = pitch * height;

+    dest_buf = FX_Alloc( FX_BYTE, dest_size);

+    for (int row = 0; row < height; row ++) {

+        FX_LPBYTE pLine = pDecoder->GetScanline(row);

+        if (pLine == NULL) {

+            break;

+        }

+        FXSYS_memcpy32(dest_buf + row * pitch, pLine, pitch);

+    }

+    FX_DWORD srcoff = pDecoder->GetSrcOffset();

+    delete pDecoder;

+    return srcoff;

+}

+ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+        const CPDF_Dictionary* pParams);

+FX_DWORD _A85Decode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+FX_DWORD _HexDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, CPDF_Dictionary* pParams,

+                                  FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+FX_DWORD PDF_DecodeInlineStream(const FX_BYTE* src_buf, FX_DWORD limit,

+                                int width, int height, CFX_ByteString& decoder,

+                                CPDF_Dictionary* pParam, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    if (decoder == FX_BSTRC("CCITTFaxDecode") || decoder == FX_BSTRC("CCF")) {

+        ICodec_ScanlineDecoder* pDecoder = FPDFAPI_CreateFaxDecoder(src_buf, limit, width, height, pParam);

+        return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);

+    } else if (decoder == FX_BSTRC("ASCII85Decode") || decoder == FX_BSTRC("A85")) {

+        return _A85Decode(src_buf, limit, dest_buf, dest_size);

+    } else if (decoder == FX_BSTRC("ASCIIHexDecode") || decoder == FX_BSTRC("AHx")) {

+        return _HexDecode(src_buf, limit, dest_buf, dest_size);

+    } else if (decoder == FX_BSTRC("FlateDecode") || decoder == FX_BSTRC("Fl")) {

+        return FPDFAPI_FlateOrLZWDecode(FALSE, src_buf, limit, pParam, dest_size, dest_buf, dest_size);

+    } else if (decoder == FX_BSTRC("LZWDecode") || decoder == FX_BSTRC("LZW")) {

+        return FPDFAPI_FlateOrLZWDecode(TRUE, src_buf, limit, pParam, 0, dest_buf, dest_size);

+    } else if (decoder == FX_BSTRC("DCTDecode") || decoder == FX_BSTRC("DCT")) {

+        ICodec_ScanlineDecoder* pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(

+                                               src_buf, limit, width, height, 0, pParam ? pParam->GetInteger(FX_BSTRC("ColorTransform"), 1) : 1);

+        return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);

+    } else if (decoder == FX_BSTRC("RunLengthDecode") || decoder == FX_BSTRC("RL")) {

+        return RunLengthDecode(src_buf, limit, dest_buf, dest_size);

+    }

+    dest_size = 0;

+    dest_buf = 0;

+    return (FX_DWORD) - 1;

+}

+extern const FX_LPCSTR _PDF_CharType;

+CPDF_Stream* CPDF_StreamParser::ReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode)

+{

+    if (m_Pos == m_Size) {

+        return NULL;

+    }

+    if (_PDF_CharType[m_pBuf[m_Pos]] == 'W') {

+        m_Pos ++;

+    }

+    CFX_ByteString Decoder;

+    CPDF_Dictionary* pParam = NULL;

+    CPDF_Object* pFilter = pDict->GetElementValue(FX_BSTRC("Filter"));

+    if (pFilter == NULL) {

+    } else if (pFilter->GetType() == PDFOBJ_ARRAY) {

+        Decoder = ((CPDF_Array*)pFilter)->GetString(0);

+        CPDF_Array* pParams = pDict->GetArray(FX_BSTRC("DecodeParms"));

+        if (pParams) {

+            pParam = pParams->GetDict(0);

+        }

+    } else {

+        Decoder = pFilter->GetString();

+        pParam = pDict->GetDict(FX_BSTRC("DecodeParms"));

+    }

+    FX_DWORD width = pDict->GetInteger(FX_BSTRC("Width"));

+    FX_DWORD height = pDict->GetInteger(FX_BSTRC("Height"));

+    FX_DWORD OrigSize = 0;

+    if (pCSObj != NULL) {

+        FX_DWORD bpc = pDict->GetInteger(FX_BSTRC("BitsPerComponent"));

+        FX_DWORD nComponents = 1;

+        CPDF_ColorSpace* pCS = pDoc->LoadColorSpace(pCSObj);

+        if (pCS == NULL) {

+            nComponents = 3;

+        } else {

+            nComponents = pCS->CountComponents();

+            pDoc->GetPageData()->ReleaseColorSpace(pCSObj);

+        }

+        FX_DWORD pitch = width;

+        if (bpc && pitch > INT_MAX / bpc) {

+            return NULL;

+        }

+        pitch *= bpc;

+        if (nComponents && pitch > INT_MAX / nComponents) {

+            return NULL;

+        }

+        pitch *= nComponents;

+        if (pitch > INT_MAX - 7) {

+            return NULL;

+        }

+        pitch += 7;

+        pitch /= 8;

+        OrigSize = pitch;

+    } else {

+        if (width > INT_MAX - 7) {

+            return NULL;

+        }

+        OrigSize = ((width + 7) / 8);

+    }

+    if (height && OrigSize > INT_MAX / height) {

+        return NULL;

+    }

+    OrigSize *= height;

+    FX_LPBYTE pData = NULL;

+    FX_DWORD dwStreamSize;

+    if (Decoder.IsEmpty()) {

+        if (OrigSize > m_Size - m_Pos) {

+            OrigSize = m_Size - m_Pos;

+        }

+        pData = FX_Alloc(FX_BYTE, OrigSize);

+        FXSYS_memcpy32(pData, m_pBuf + m_Pos, OrigSize);

+        dwStreamSize = OrigSize;

+        m_Pos += OrigSize;

+    } else {

+        FX_DWORD dwDestSize = OrigSize;

+        dwStreamSize = PDF_DecodeInlineStream(m_pBuf + m_Pos, m_Size - m_Pos, width, height, Decoder, pParam,

+                                              pData, dwDestSize);

+        if ((int)dwStreamSize < 0) {

+            return NULL;

+        }

+        if (bDecode) {

+            m_Pos += dwStreamSize;

+            dwStreamSize = dwDestSize;

+            if (pFilter->GetType() == PDFOBJ_ARRAY) {

+                ((CPDF_Array*)pFilter)->RemoveAt(0);

+                CPDF_Array* pParams = pDict->GetArray(FX_BSTRC("DecodeParms"));

+                if (pParams) {

+                    pParams->RemoveAt(0);

+                }

+            } else {

+                pDict->RemoveAt(FX_BSTRC("Filter"));

+                pDict->RemoveAt(FX_BSTRC("DecodeParms"));

+            }

+        } else {

+            if (pData) {

+                FX_Free(pData);

+            }

+            FX_DWORD dwSavePos = m_Pos;

+            m_Pos += dwStreamSize;

+            while (1) {

+                FX_DWORD dwPrevPos = m_Pos;

+                CPDF_StreamParser::SyntaxType type = ParseNextElement();

+                if (type == CPDF_StreamParser::EndOfData) {

+                    break;

+                }

+                if (type != CPDF_StreamParser::Keyword) {

+                    dwStreamSize += m_Pos - dwPrevPos;

+                    continue;

+                }

+                if (GetWordSize() == 2 && GetWordBuf()[0] == 'E' &&

+                        GetWordBuf()[1] == 'I') {

+                    m_Pos = dwPrevPos;

+                    break;

+                }

+                dwStreamSize += m_Pos - dwPrevPos;

+            }

+            m_Pos = dwSavePos;

+            pData = FX_Alloc(FX_BYTE, dwStreamSize);

+            FXSYS_memcpy32(pData, m_pBuf + m_Pos, dwStreamSize);

+            m_Pos += dwStreamSize;

+        }

+    }

+    pDict->SetAtInteger(FX_BSTRC("Length"), (int)dwStreamSize);

+    return CPDF_Stream::Create(pData, dwStreamSize, pDict);

+}

+#define MAX_WORD_BUFFER 256

+#define MAX_STRING_LENGTH	32767

+#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)

+#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)

+#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)

+CPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement()

+{

+    if (m_pLastObj) {

+        m_pLastObj->Release();

+        m_pLastObj = NULL;

+    }

+    m_WordSize = 0;

+    FX_BOOL bIsNumber = TRUE;

+    if (m_Pos >= m_Size) {

+        return EndOfData;

+    }

+    int ch = m_pBuf[m_Pos++];

+    int type = _PDF_CharType[ch];

+    while (1) {

+        while (type == 'W') {

+            if (m_Size <= m_Pos) {

+                return EndOfData;

+            }

+            ch = m_pBuf[m_Pos++];

+            type = _PDF_CharType[ch];

+        }

+        if (ch != '%') {

+            break;

+        }

+        while (1) {

+            if (m_Size <= m_Pos) {

+                return EndOfData;

+            }

+            ch = m_pBuf[m_Pos++];

+            if (ch == '\r' || ch == '\n') {

+                break;

+            }

+        }

+        type = _PDF_CharType[ch];

+    }

+    if (type == 'D' && ch != '/') {

+        m_Pos --;

+        m_pLastObj = ReadNextObject();

+        return Others;

+    }

+    while (1) {

+        if (m_WordSize < MAX_WORD_BUFFER) {

+            m_WordBuffer[m_WordSize++] = ch;

+        }

+        if (type != 'N') {

+            bIsNumber = FALSE;

+        }

+        if (m_Size <= m_Pos) {

+            break;

+        }

+        ch = m_pBuf[m_Pos++];

+        type = _PDF_CharType[ch];

+        if (type == 'D' || type == 'W') {

+            m_Pos --;

+            break;

+        }

+    }

+    m_WordBuffer[m_WordSize] = 0;

+    if (bIsNumber) {

+        return Number;

+    }

+    if (m_WordBuffer[0] == '/') {

+        return Name;

+    }

+    if (m_WordSize == 4) {

+        if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {

+            m_pLastObj = CPDF_Boolean::Create(TRUE);

+            return Others;

+        }

+        if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {

+            m_pLastObj = CPDF_Null::Create();

+            return Others;

+        }

+    } else if (m_WordSize == 5) {

+        if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {

+            m_pLastObj = CPDF_Boolean::Create(FALSE);

+            return Others;

+        }

+    }

+    return Keyword;

+}

+void CPDF_StreamParser::SkipPathObject()

+{

+    FX_DWORD command_startpos = m_Pos;

+    if (m_Pos >= m_Size) {

+        return;

+    }

+    int ch = m_pBuf[m_Pos++];

+    int type = _PDF_CharType[ch];

+    while (1) {

+        while (type == 'W') {

+            if (m_Pos >= m_Size) {

+                return;

+            }

+            ch = m_pBuf[m_Pos++];

+            type = _PDF_CharType[ch];

+        }

+        if (type != 'N') {

+            m_Pos = command_startpos;

+            return;

+        }

+        while (1) {

+            while (type != 'W') {

+                if (m_Pos >= m_Size) {

+                    return;

+                }

+                ch = m_pBuf[m_Pos++];

+                type = _PDF_CharType[ch];

+            }

+            while (type == 'W') {

+                if (m_Pos >= m_Size) {

+                    return;

+                }

+                ch = m_pBuf[m_Pos++];

+                type = _PDF_CharType[ch];

+            }

+            if (type == 'N') {

+                continue;

+            }

+            FX_DWORD op_startpos = m_Pos - 1;

+            while (type != 'W' && type != 'D') {

+                if (m_Pos >= m_Size) {

+                    return;

+                }

+                ch = m_pBuf[m_Pos++];

+                type = _PDF_CharType[ch];

+            }

+            if (m_Pos - op_startpos == 2) {

+                int op = m_pBuf[op_startpos];

+                if (op == 'm' || op == 'l' || op == 'c' || op == 'v' || op == 'y') {

+                    command_startpos = m_Pos;

+                    break;

+                }

+            } else if (m_Pos - op_startpos == 3) {

+                if (m_pBuf[op_startpos] == 'r' && m_pBuf[op_startpos + 1] == 'e') {

+                    command_startpos = m_Pos;

+                    break;

+                }

+            }

+            m_Pos = command_startpos;

+            return;

+        }

+    }

+}

+CPDF_Object* CPDF_StreamParser::ReadNextObject(FX_BOOL bAllowNestedArray, FX_BOOL bInArray)

+{

+    FX_BOOL bIsNumber;

+    GetNextWord(bIsNumber);

+    if (m_WordSize == 0) {

+        return NULL;

+    }

+    if (bIsNumber) {

+        m_WordBuffer[m_WordSize] = 0;

+        return CPDF_Number::Create(CFX_ByteStringC(m_WordBuffer, m_WordSize));

+    }

+    int first_char = m_WordBuffer[0];

+    if (first_char == '/') {

+        return CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));

+    }

+    if (first_char == '(') {

+        return CPDF_String::Create(ReadString());

+    }

+    if (first_char == '<') {

+        if (m_WordSize == 1) {

+            return CPDF_String::Create(ReadHexString(), TRUE);

+        }

+        CPDF_Dictionary* pDict = CPDF_Dictionary::Create();

+        while (1) {

+            GetNextWord(bIsNumber);

+            if (m_WordSize == 0) {

+                pDict->Release();

+                return NULL;

+            }

+            if (m_WordSize == 2 && m_WordBuffer[0] == '>') {

+                break;

+            }

+            if (m_WordBuffer[0] != '/') {

+                pDict->Release();

+                return NULL;

+            }

+            CFX_ByteString key = PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1));

+            CPDF_Object* pObj = ReadNextObject(TRUE);

+            if (pObj == NULL) {

+                if (pDict) {

+                    pDict->Release();

+                }

+                return NULL;

+            }

+            if (!key.IsEmpty()) {

+                pDict->SetAt(key, pObj);

+            } else {

+                pObj->Release();

+            }

+        }

+        return pDict;

+    }

+    if (first_char == '[') {

+        if (!bAllowNestedArray && bInArray) {

+            return NULL;

+        }

+        CPDF_Array* pArray = CPDF_Array::Create();

+        while (1) {

+            CPDF_Object* pObj = ReadNextObject(bAllowNestedArray, TRUE);

+            if (pObj == NULL) {

+                if (m_WordSize == 0 || m_WordBuffer[0] == ']') {

+                    return pArray;

+                }

+                if (m_WordBuffer[0] == '[') {

+                    continue;

+                }

+            } else {

+                pArray->Add(pObj);

+            }

+        }

+    }

+    if (m_WordSize == 4) {

+        if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {

+            return CPDF_Boolean::Create(TRUE);

+        }

+        if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {

+            return CPDF_Null::Create();

+        }

+    } else if (m_WordSize == 5) {

+        if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {

+            return CPDF_Boolean::Create(FALSE);

+        }

+    }

+    return NULL;

+}

+void CPDF_StreamParser::GetNextWord(FX_BOOL& bIsNumber)

+{

+    m_WordSize = 0;

+    bIsNumber = TRUE;

+    if (m_Size <= m_Pos) {

+        return;

+    }

+    int ch = m_pBuf[m_Pos++];

+    int type = _PDF_CharType[ch];

+    while (1) {

+        while (type == 'W') {

+            if (m_Size <= m_Pos) {

+                return;

+            }

+            ch = m_pBuf[m_Pos++];

+            type = _PDF_CharType[ch];

+        }

+        if (ch != '%') {

+            break;

+        }

+        while (1) {

+            if (m_Size <= m_Pos) {

+                return;

+            }

+            ch = m_pBuf[m_Pos++];

+            if (ch == '\r' || ch == '\n') {

+                break;

+            }

+        }

+        type = _PDF_CharType[ch];

+    }

+    if (type == 'D') {

+        bIsNumber = FALSE;

+        m_WordBuffer[m_WordSize++] = ch;

+        if (ch == '/') {

+            while (1) {

+                if (m_Size <= m_Pos) {

+                    return;

+                }

+                ch = m_pBuf[m_Pos++];

+                type = _PDF_CharType[ch];

+                if (type != 'R' && type != 'N') {

+                    m_Pos --;

+                    return;

+                }

+                if (m_WordSize < MAX_WORD_BUFFER) {

+                    m_WordBuffer[m_WordSize++] = ch;

+                }

+            }

+        } else if (ch == '<') {

+            if (m_Size <= m_Pos) {

+                return;

+            }

+            ch = m_pBuf[m_Pos++];

+            if (ch == '<') {

+                m_WordBuffer[m_WordSize++] = ch;

+            } else {

+                m_Pos --;

+            }

+        } else if (ch == '>') {

+            if (m_Size <= m_Pos) {

+                return;

+            }

+            ch = m_pBuf[m_Pos++];

+            if (ch == '>') {

+                m_WordBuffer[m_WordSize++] = ch;

+            } else {

+                m_Pos --;

+            }

+        }

+        return;

+    }

+    while (1) {

+        if (m_WordSize < MAX_WORD_BUFFER) {

+            m_WordBuffer[m_WordSize++] = ch;

+        }

+        if (type != 'N') {

+            bIsNumber = FALSE;

+        }

+        if (m_Size <= m_Pos) {

+            return;

+        }

+        ch = m_pBuf[m_Pos++];

+        type = _PDF_CharType[ch];

+        if (type == 'D' || type == 'W') {

+            m_Pos --;

+            break;

+        }

+    }

+}

+CFX_ByteString CPDF_StreamParser::ReadString()

+{

+    if (m_Size <= m_Pos) {

+        return CFX_ByteString();

+    }

+    int ch = m_pBuf[m_Pos++];

+    CFX_ByteTextBuf buf;

+    int parlevel = 0;

+    int status = 0, iEscCode = 0;

+    while (1) {

+        switch (status) {

+            case 0:

+                if (ch == ')') {

+                    if (parlevel == 0) {

+                        if (buf.GetLength() > MAX_STRING_LENGTH) {

+                            return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);

+                        }

+                        return buf.GetByteString();

+                    }

+                    parlevel --;

+                    buf.AppendChar(')');

+                } else if (ch == '(') {

+                    parlevel ++;

+                    buf.AppendChar('(');

+                } else if (ch == '\\') {

+                    status = 1;

+                } else {

+                    buf.AppendChar((char)ch);

+                }

+                break;

+            case 1:

+                if (ch >= '0' && ch <= '7') {

+                    iEscCode = ch - '0';

+                    status = 2;

+                    break;

+                }

+                if (ch == 'n') {

+                    buf.AppendChar('\n');

+                } else if (ch == 'r') {

+                    buf.AppendChar('\r');

+                } else if (ch == 't') {

+                    buf.AppendChar('\t');

+                } else if (ch == 'b') {

+                    buf.AppendChar('\b');

+                } else if (ch == 'f') {

+                    buf.AppendChar('\f');

+                } else if (ch == '\r') {

+                    status = 4;

+                    break;

+                } else if (ch == '\n') {

+                } else {

+                    buf.AppendChar(ch);

+                }

+                status = 0;

+                break;

+            case 2:

+                if (ch >= '0' && ch <= '7') {

+                    iEscCode = iEscCode * 8 + ch - '0';

+                    status = 3;

+                } else {

+                    buf.AppendChar(iEscCode);

+                    status = 0;

+                    continue;

+                }

+                break;

+            case 3:

+                if (ch >= '0' && ch <= '7') {

+                    iEscCode = iEscCode * 8 + ch - '0';

+                    buf.AppendChar(iEscCode);

+                    status = 0;

+                } else {

+                    buf.AppendChar(iEscCode);

+                    status = 0;

+                    continue;

+                }

+                break;

+            case 4:

+                status = 0;

+                if (ch != '\n') {

+                    continue;

+                }

+                break;

+        }

+        if (m_Size <= m_Pos) {

+            break;

+        }

+        ch = m_pBuf[m_Pos++];

+    }

+    if (m_Size > m_Pos) {

+        ch = m_pBuf[m_Pos++];

+    }

+    if (buf.GetLength() > MAX_STRING_LENGTH) {

+        return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);

+    }

+    return buf.GetByteString();

+}

+CFX_ByteString CPDF_StreamParser::ReadHexString()

+{

+    if (m_Size <= m_Pos) {

+        return CFX_ByteString();

+    }

+    int ch = m_pBuf[m_Pos++];

+    CFX_ByteTextBuf buf;

+    FX_BOOL bFirst = TRUE;

+    int code = 0;

+    while (1) {

+        if (ch == '>') {

+            break;

+        }

+        if (ch >= '0' && ch <= '9') {

+            if (bFirst) {

+                code = (ch - '0') * 16;

+            } else {

+                code += ch - '0';

+                buf.AppendChar((char)code);

+            }

+            bFirst = !bFirst;

+        } else if (ch >= 'A' && ch <= 'F') {

+            if (bFirst) {

+                code = (ch - 'A' + 10) * 16;

+            } else {

+                code += ch - 'A' + 10;

+                buf.AppendChar((char)code);

+            }

+            bFirst = !bFirst;

+        } else if (ch >= 'a' && ch <= 'f') {

+            if (bFirst) {

+                code = (ch - 'a' + 10) * 16;

+            } else {

+                code += ch - 'a' + 10;

+                buf.AppendChar((char)code);

+            }

+            bFirst = !bFirst;

+        }

+        if (m_Size <= m_Pos) {

+            break;

+        }

+        ch = m_pBuf[m_Pos++];

+    }

+    if (!bFirst) {

+        buf.AppendChar((char)code);

+    }

+    if (buf.GetLength() > MAX_STRING_LENGTH) {

+        return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);

+    }

+    return buf.GetByteString();

+}

+#define PAGEPARSE_STAGE_GETCONTENT		1

+#define PAGEPARSE_STAGE_PARSE			2

+#define PAGEPARSE_STAGE_CHECKCLIP		3

+CPDF_ContentParser::CPDF_ContentParser()

+{

+    m_pParser = NULL;

+    m_pStreamArray = NULL;

+    m_pSingleStream = NULL;

+    m_pData = NULL;

+    m_Status = Ready;

+    m_pType3Char = NULL;

+}

+CPDF_ContentParser::~CPDF_ContentParser()

+{

+    Clear();

+}

+void CPDF_ContentParser::Clear()

+{

+    if (m_pParser) {

+        delete m_pParser;

+    }

+    if (m_pSingleStream) {

+        delete m_pSingleStream;

+    }

+    if (m_pStreamArray) {

+        for (FX_DWORD i = 0; i < m_nStreams; i ++)

+            if (m_pStreamArray[i]) {

+                delete m_pStreamArray[i];

+            }

+        FX_Free(m_pStreamArray);

+    }

+    if (m_pData && m_pSingleStream == NULL) {

+        FX_Free((void*)m_pData);

+    }

+    m_pParser = NULL;

+    m_pStreamArray = NULL;

+    m_pSingleStream = NULL;

+    m_pData = NULL;

+    m_Status = Ready;

+}

+void CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)

+{

+    if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {

+        m_Status = Done;

+        return;

+    }

+    m_pObjects = pPage;

+    m_bForm = FALSE;

+    if (pOptions) {

+        m_Options = *pOptions;

+    }

+    m_Status = ToBeContinued;

+    m_InternalStage = PAGEPARSE_STAGE_GETCONTENT;

+    m_CurrentOffset = 0;

+    CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));

+    if (pContent == NULL) {

+        m_Status = Done;

+        return;

+    }

+    if (pContent->GetType() == PDFOBJ_STREAM) {

+        m_nStreams = 0;

+        m_pSingleStream = FX_NEW CPDF_StreamAcc;

+        m_pSingleStream->LoadAllData((CPDF_Stream*)pContent, FALSE);

+    } else if (pContent->GetType() == PDFOBJ_ARRAY) {

+        CPDF_Array* pArray = (CPDF_Array*)pContent;

+        m_nStreams = pArray->GetCount();

+        if (m_nStreams == 0) {

+            m_Status = Done;

+            return;

+        }

+        m_pStreamArray = FX_Alloc(CPDF_StreamAcc*, m_nStreams);

+        FXSYS_memset32(m_pStreamArray, 0, sizeof(CPDF_StreamAcc*) * m_nStreams);

+    } else {

+        m_Status = Done;

+        return;

+    }

+}

+void CPDF_ContentParser::Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates,

+                               CFX_AffineMatrix* pParentMatrix, CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)

+{

+    m_pType3Char = pType3Char;

+    m_pObjects = pForm;

+    m_bForm = TRUE;

+    CFX_AffineMatrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));

+    if (pGraphicStates) {

+        form_matrix.Concat(pGraphicStates->m_CTM);

+    }

+    CPDF_Array* pBBox = pForm->m_pFormDict->GetArray(FX_BSTRC("BBox"));

+    CFX_FloatRect form_bbox;

+    CPDF_Path ClipPath;

+    if (pBBox) {

+        form_bbox = pBBox->GetRect();

+        ClipPath.New();

+        ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);

+        ClipPath.Transform(&form_matrix);

+        if (pParentMatrix) {

+            ClipPath.Transform(pParentMatrix);

+        }

+        form_bbox.Transform(&form_matrix);

+        if (pParentMatrix) {

+            form_bbox.Transform(pParentMatrix);

+        }

+    }

+    CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));

+    m_pParser = FX_NEW CPDF_StreamContentParser;

+    m_pParser->Initialize();

+    m_pParser->PrepareParse(pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, pParentMatrix, pForm,

+                            pResources, &form_bbox, pOptions, pGraphicStates, level);

+    m_pParser->m_pCurStates->m_CTM = form_matrix;

+    m_pParser->m_pCurStates->m_ParentMatrix = form_matrix;

+    if (ClipPath.NotNull()) {

+        m_pParser->m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);

+    }

+    if (pForm->m_Transparency & PDFTRANS_GROUP) {

+        CPDF_GeneralStateData* pData = m_pParser->m_pCurStates->m_GeneralState.GetModify();

+        pData->m_BlendType = FXDIB_BLEND_NORMAL;

+        pData->m_StrokeAlpha = 1.0f;

+        pData->m_FillAlpha = 1.0f;

+        pData->m_pSoftMask = NULL;

+    }

+    m_nStreams = 0;

+    m_pSingleStream = FX_NEW CPDF_StreamAcc;

+    if (pForm->m_pDocument) {

+        m_pSingleStream->LoadAllData(pForm->m_pFormStream, FALSE);

+    } else {

+        m_pSingleStream->LoadAllData(pForm->m_pFormStream, FALSE);

+    }

+    m_pData = (FX_LPBYTE)m_pSingleStream->GetData();

+    m_Size = m_pSingleStream->GetSize();

+    m_Status = ToBeContinued;

+    m_InternalStage = PAGEPARSE_STAGE_PARSE;

+    m_CurrentOffset = 0;

+}

+void CPDF_ContentParser::Continue(IFX_Pause* pPause)

+{

+    int steps = 0;

+    while (m_Status == ToBeContinued) {

+        if (m_InternalStage == PAGEPARSE_STAGE_GETCONTENT) {

+            if (m_CurrentOffset == m_nStreams) {

+                if (m_pStreamArray) {

+                    m_Size = 0;

+                    FX_DWORD i;

+                    for (i = 0; i < m_nStreams; i ++) {

+                        FX_DWORD size = m_pStreamArray[i]->GetSize();

+                        if (m_Size + size + 1 <= m_Size) {

+							m_Status = Done;

+							return;

+                        }

+                        m_Size += size + 1;

+                    }

+                    m_pData = FX_Alloc(FX_BYTE, m_Size);

+                    if (!m_pData) {

+                        m_Status = Done;

+                        return;

+                    }

+                    FX_DWORD pos = 0;

+                    for (i = 0; i < m_nStreams; i ++) {

+                        FXSYS_memcpy32(m_pData + pos, m_pStreamArray[i]->GetData(), m_pStreamArray[i]->GetSize());

+                        pos += m_pStreamArray[i]->GetSize() + 1;

+                        m_pData[pos - 1] = ' ';

+                        delete m_pStreamArray[i];

+                    }

+                    FX_Free(m_pStreamArray);

+                    m_pStreamArray = NULL;

+                } else {

+                    m_pData = (FX_LPBYTE)m_pSingleStream->GetData();

+                    m_Size = m_pSingleStream->GetSize();

+                }

+                m_InternalStage = PAGEPARSE_STAGE_PARSE;

+                m_CurrentOffset = 0;

+            } else {

+                CPDF_Array* pContent = m_pObjects->m_pFormDict->GetArray(FX_BSTRC("Contents"));

+                m_pStreamArray[m_CurrentOffset] = FX_NEW CPDF_StreamAcc;

+                CPDF_Stream* pStreamObj = (CPDF_Stream*)pContent->GetElementValue(m_CurrentOffset);

+                m_pStreamArray[m_CurrentOffset]->LoadAllData(pStreamObj, FALSE);

+                m_CurrentOffset ++;

+            }

+        }

+        if (m_InternalStage == PAGEPARSE_STAGE_PARSE) {

+            if (m_pParser == NULL) {

+                m_pParser = FX_NEW CPDF_StreamContentParser;

+                m_pParser->Initialize();

+                m_pParser->PrepareParse(m_pObjects->m_pDocument, m_pObjects->m_pPageResources, NULL, NULL, m_pObjects,

+                                        m_pObjects->m_pResources, &m_pObjects->m_BBox, &m_Options, NULL, 0);

+                m_pParser->m_pCurStates->m_ColorState.GetModify()->Default();

+            }

+            if (m_CurrentOffset >= m_Size) {

+                m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;

+            } else {

+                m_CurrentOffset += m_pParser->Parse(m_pData + m_CurrentOffset, m_Size - m_CurrentOffset, PARSE_STEP_LIMIT);

+                if (m_pParser->m_bAbort) {

+                    m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;

+                    continue;

+                }

+            }

+        }

+        if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {

+            if (m_pType3Char) {

+                m_pType3Char->m_bColored = m_pParser->m_bColored;

+                m_pType3Char->m_Width = FXSYS_round(m_pParser->m_Type3Data[0] * 1000);

+                m_pType3Char->m_BBox.left = FXSYS_round(m_pParser->m_Type3Data[2] * 1000);

+                m_pType3Char->m_BBox.bottom = FXSYS_round(m_pParser->m_Type3Data[3] * 1000);

+                m_pType3Char->m_BBox.right = FXSYS_round(m_pParser->m_Type3Data[4] * 1000);

+                m_pType3Char->m_BBox.top = FXSYS_round(m_pParser->m_Type3Data[5] * 1000);

+            }

+            FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();

+            while (pos) {

+                CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);

+                if (pObj->m_ClipPath.IsNull()) {

+                    continue;

+                }

+                if (pObj->m_ClipPath.GetPathCount() != 1) {

+                    continue;

+                }

+                if (pObj->m_ClipPath.GetTextCount()) {

+                    continue;

+                }

+                CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);

+                if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {

+                    continue;

+                }

+                CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),

+                                       ClipPath.GetPointX(2), ClipPath.GetPointY(2));

+                CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);

+                if (old_rect.Contains(obj_rect)) {

+                    pObj->m_ClipPath.SetNull();

+                }

+            }

+            m_Status = Done;

+            return;

+        }

+        steps ++;

+        if (pPause && pPause->NeedToPauseNow()) {

+            break;

+        }

+    }

+}

+int CPDF_ContentParser::EstimateProgress()

+{

+    if (m_Status == Ready) {

+        return 0;

+    }

+    if (m_Status == Done) {

+        return 100;

+    }

+    if (m_InternalStage == PAGEPARSE_STAGE_GETCONTENT) {

+        return 10;

+    }

+    if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {

+        return 90;

+    }

+    return 10 + 80 * m_CurrentOffset / m_Size;

+}

diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp
new file mode 100644
index 0000000..836c940
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp
@@ -0,0 +1,52 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../../../include/fpdfapi/fpdf_pageobj.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "pageint.h"

+void CPDF_PathObject::CopyData(const CPDF_PageObject* pSrc)

+{

+    const CPDF_PathObject* pSrcObj = (const CPDF_PathObject*)pSrc;

+    m_Path = pSrcObj->m_Path;

+    m_FillType = pSrcObj->m_FillType;

+    m_bStroke = pSrcObj->m_bStroke;

+    m_Matrix = pSrcObj->m_Matrix;

+}

+void CPDF_PathObject::Transform(const CPDF_Matrix& matrix)

+{

+    m_Matrix.Concat(matrix);

+    CalcBoundingBox();

+}

+void CPDF_PathObject::SetGraphState(CPDF_GraphState GraphState)

+{

+    m_GraphState = GraphState;

+    CalcBoundingBox();

+}

+void CPDF_PathObject::CalcBoundingBox()

+{

+    if (m_Path.IsNull()) {

+        return;

+    }

+    CFX_FloatRect rect;

+    FX_FLOAT width = m_GraphState.GetObject()->m_LineWidth;

+    if (m_bStroke && width != 0) {

+        rect = m_Path.GetBoundingBox(width, m_GraphState.GetObject()->m_MiterLimit);

+    } else {

+        rect = m_Path.GetBoundingBox();

+    }

+    rect.Transform(&m_Matrix);

+    if (width == 0 && m_bStroke) {

+        rect.left += -0.5f;

+        rect.right += 0.5f;

+        rect.bottom += -0.5f;

+        rect.top += 0.5f;

+    }

+    m_Left = rect.left;

+    m_Right = rect.right;

+    m_Top = rect.top;

+    m_Bottom = rect.bottom;

+}

diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
new file mode 100644
index 0000000..aee0367
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
@@ -0,0 +1,278 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "pageint.h"

+CPDF_TilingPattern::CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix) :

+    CPDF_Pattern(parentMatrix)

+{

+    m_PatternType = PATTERN_TILING;

+    m_pPatternObj = pPatternObj;

+    m_pDocument = pDoc;

+    CPDF_Dictionary* pDict = m_pPatternObj->GetDict();

+    ASSERT(pDict != NULL);

+    m_Pattern2Form = pDict->GetMatrix(FX_BSTRC("Matrix"));

+    m_bColored = pDict->GetInteger(FX_BSTRC("PaintType")) == 1;

+    if (parentMatrix) {

+        m_Pattern2Form.Concat(*parentMatrix);

+    }

+    m_pForm = NULL;

+}

+CPDF_TilingPattern::~CPDF_TilingPattern()

+{

+    if (m_pForm) {

+        delete m_pForm;

+    }

+}

+FX_BOOL CPDF_TilingPattern::Load()

+{

+    if (m_pForm != NULL) {

+        return TRUE;

+    }

+    CPDF_Dictionary* pDict = m_pPatternObj->GetDict();

+    if (pDict == NULL) {

+        return FALSE;

+    }

+    m_bColored = pDict->GetInteger(FX_BSTRC("PaintType")) == 1;

+    m_XStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber(FX_BSTRC("XStep")));

+    m_YStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber(FX_BSTRC("YStep")));

+    if (m_pPatternObj->GetType() != PDFOBJ_STREAM) {

+        return FALSE;

+    }

+    CPDF_Stream* pStream = (CPDF_Stream*)m_pPatternObj;

+    m_pForm = FX_NEW CPDF_Form(m_pDocument, NULL, pStream);

+    m_pForm->ParseContent(NULL, &m_ParentMatrix, NULL, NULL);

+    m_BBox = pDict->GetRect(FX_BSTRC("BBox"));

+    return TRUE;

+}

+CPDF_ShadingPattern::CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix) : CPDF_Pattern(parentMatrix)

+{

+    m_PatternType = PATTERN_SHADING;

+    m_pPatternObj = bShading ? NULL : pPatternObj;

+    m_pDocument = pDoc;

+    m_bShadingObj = bShading;

+    if (!bShading) {

+        CPDF_Dictionary* pDict = m_pPatternObj->GetDict();

+        ASSERT(pDict != NULL);

+        m_Pattern2Form = pDict->GetMatrix(FX_BSTRC("Matrix"));

+        m_pShadingObj = pDict->GetElementValue(FX_BSTRC("Shading"));

+        if (parentMatrix) {

+            m_Pattern2Form.Concat(*parentMatrix);

+        }

+    } else {

+        m_pShadingObj = pPatternObj;

+    }

+    m_ShadingType = 0;

+    m_pCS = NULL;

+    m_nFuncs = 0;

+    for (int i = 0; i < 4; i ++) {

+        m_pFunctions[i] = NULL;

+    }

+}

+CPDF_ShadingPattern::~CPDF_ShadingPattern()

+{

+    Clear();

+}

+void CPDF_ShadingPattern::Clear()

+{

+    for (int i = 0; i < m_nFuncs; i ++) {

+        if (m_pFunctions[i]) {

+            delete m_pFunctions[i];

+        }

+        m_pFunctions[i] = NULL;

+    }

+    CPDF_ColorSpace* pCS = m_pCS;

+    if (pCS && m_pDocument) {

+        m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());

+    }

+    m_ShadingType = 0;

+    m_pCS = NULL;

+    m_nFuncs = 0;

+}

+FX_BOOL CPDF_ShadingPattern::Load()

+{

+    if (m_ShadingType != 0) {

+        return TRUE;

+    }

+    CPDF_Dictionary* pShadingDict = m_pShadingObj->GetDict();

+    if (pShadingDict == NULL) {

+        return FALSE;

+    }

+    if (m_nFuncs) {

+        for (int i = 0; i < m_nFuncs; i ++)

+            if (m_pFunctions[i]) {

+                delete m_pFunctions[i];

+            }

+        m_nFuncs = 0;

+    }

+    CPDF_Object* pFunc = pShadingDict->GetElementValue(FX_BSTRC("Function"));

+    if (pFunc) {

+        if (pFunc->GetType() == PDFOBJ_ARRAY) {

+            m_nFuncs = ((CPDF_Array*)pFunc)->GetCount();

+            if (m_nFuncs > 4) {

+                m_nFuncs = 4;

+            }

+            for (int i = 0; i < m_nFuncs; i ++) {

+                m_pFunctions[i] = CPDF_Function::Load(((CPDF_Array*)pFunc)->GetElementValue(i));

+            }

+        } else {

+            m_pFunctions[0] = CPDF_Function::Load(pFunc);

+            m_nFuncs = 1;

+        }

+    }

+    CPDF_Object* pCSObj = pShadingDict->GetElementValue(FX_BSTRC("ColorSpace"));

+    if (pCSObj == NULL) {

+        return FALSE;

+    }

+    CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();

+    m_pCS = pDocPageData->GetColorSpace(pCSObj, NULL);

+    m_ShadingType = pShadingDict->GetInteger(FX_BSTRC("ShadingType"));

+    return TRUE;

+}

+FX_BOOL CPDF_ShadingPattern::Reload()

+{

+    Clear();

+    return Load();

+}

+FX_BOOL CPDF_MeshStream::Load(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS)

+{

+    m_Stream.LoadAllData(pShadingStream);

+    m_BitStream.Init(m_Stream.GetData(), m_Stream.GetSize());

+    m_pFuncs = pFuncs;

+    m_nFuncs = nFuncs;

+    m_pCS = pCS;

+    CPDF_Dictionary* pDict = pShadingStream->GetDict();

+    m_nCoordBits = pDict->GetInteger(FX_BSTRC("BitsPerCoordinate"));

+    m_nCompBits = pDict->GetInteger(FX_BSTRC("BitsPerComponent"));

+    m_nFlagBits = pDict->GetInteger(FX_BSTRC("BitsPerFlag"));

+    if (!m_nCoordBits || !m_nCompBits) {

+        return FALSE;

+    }

+    int nComps = pCS->CountComponents();

+    if (nComps > 8) {

+        return FALSE;

+    }

+    m_nComps = nFuncs ? 1 : nComps;

+    if (((int)m_nComps < 0) || m_nComps > 8) {

+        return FALSE;

+    }

+    m_CoordMax = m_nCoordBits == 32 ? -1 : (1 << m_nCoordBits) - 1;

+    m_CompMax = (1 << m_nCompBits) - 1;

+    CPDF_Array* pDecode = pDict->GetArray(FX_BSTRC("Decode"));

+    if (pDecode == NULL || pDecode->GetCount() != 4 + m_nComps * 2) {

+        return FALSE;

+    }

+    m_xmin = pDecode->GetNumber(0);

+    m_xmax = pDecode->GetNumber(1);

+    m_ymin = pDecode->GetNumber(2);

+    m_ymax = pDecode->GetNumber(3);

+    for (FX_DWORD i = 0; i < m_nComps; i ++) {

+        m_ColorMin[i] = pDecode->GetNumber(i * 2 + 4);

+        m_ColorMax[i] = pDecode->GetNumber(i * 2 + 5);

+    }

+    return TRUE;

+}

+FX_DWORD CPDF_MeshStream::GetFlag()

+{

+    return m_BitStream.GetBits(m_nFlagBits) & 0x03;

+}

+void CPDF_MeshStream::GetCoords(FX_FLOAT& x, FX_FLOAT& y)

+{

+    if (m_nCoordBits == 32) {

+        x = m_xmin + (FX_FLOAT)(m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / (double)m_CoordMax);

+        y = m_ymin + (FX_FLOAT)(m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / (double)m_CoordMax);

+    } else {

+        x = m_xmin + m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / m_CoordMax;

+        y = m_ymin + m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / m_CoordMax;

+    }

+}

+void CPDF_MeshStream::GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b)

+{

+    FX_DWORD i;

+    FX_FLOAT color_value[8];

+    for (i = 0; i < m_nComps; i ++) {

+        color_value[i] = m_ColorMin[i] + m_BitStream.GetBits(m_nCompBits) * (m_ColorMax[i] - m_ColorMin[i]) / m_CompMax;

+    }

+    if (m_nFuncs) {

+        static const int kMaxResults = 8;

+        FX_FLOAT result[kMaxResults];

+        int nResults;

+        FXSYS_memset32(result, 0, sizeof(result));

+        for (FX_DWORD i = 0; i < m_nFuncs; i ++) {

+            if (m_pFuncs[i] && m_pFuncs[i]->CountOutputs() <= kMaxResults) {

+                m_pFuncs[i]->Call(color_value, 1, result, nResults);

+            }

+        }

+        m_pCS->GetRGB(result, r, g, b);

+    } else {

+        m_pCS->GetRGB(color_value, r, g, b);

+    }

+}

+FX_DWORD CPDF_MeshStream::GetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap)

+{

+    FX_DWORD flag = GetFlag();

+    GetCoords(vertex.x, vertex.y);

+    pObject2Bitmap->Transform(vertex.x, vertex.y);

+    GetColor(vertex.r, vertex.g, vertex.b);

+    m_BitStream.ByteAlign();

+    return flag;

+}

+FX_BOOL CPDF_MeshStream::GetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap)

+{

+    for (int i = 0; i < count; i ++) {

+        if (m_BitStream.IsEOF()) {

+            return FALSE;

+        }

+        GetCoords(vertex[i].x, vertex[i].y);

+        pObject2Bitmap->Transform(vertex[i].x, vertex[i].y);

+        GetColor(vertex[i].r, vertex[i].g, vertex[i].b);

+        m_BitStream.ByteAlign();

+    }

+    return TRUE;

+}

+CFX_FloatRect _GetShadingBBox(CPDF_Stream* pStream, int type, const CFX_AffineMatrix* pMatrix,

+                              CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS)

+{

+    if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM || pFuncs == NULL || pCS == NULL) {

+        return CFX_FloatRect(0, 0, 0, 0);

+    }

+    CPDF_MeshStream stream;

+    if (!stream.Load(pStream, pFuncs, nFuncs, pCS)) {

+        return CFX_FloatRect(0, 0, 0, 0);

+    }

+    CFX_FloatRect rect;

+    FX_BOOL bStarted = FALSE;

+    FX_BOOL bGouraud = type == 4 || type == 5;

+    int full_point_count = type == 7 ? 16 : (type == 6 ? 12 : 1);

+    int full_color_count = (type == 6 || type == 7) ? 4 : 1;

+    while (!stream.m_BitStream.IsEOF()) {

+        FX_DWORD flag;

+        if (type != 5) {

+            flag = stream.GetFlag();

+        }

+        int point_count = full_point_count, color_count = full_color_count;

+        if (!bGouraud && flag) {

+            point_count -= 4;

+            color_count -= 2;

+        }

+        for (int i = 0; i < point_count; i ++) {

+            FX_FLOAT x, y;

+            stream.GetCoords(x, y);

+            if (bStarted) {

+                rect.UpdateRect(x, y);

+            } else {

+                rect.InitRect(x, y);

+                bStarted = TRUE;

+            }

+        }

+        stream.m_BitStream.SkipBits(stream.m_nComps * stream.m_nCompBits * color_count);

+        if (bGouraud) {

+            stream.m_BitStream.ByteAlign();

+        }

+    }

+    rect.Transform(pMatrix);

+    return rect;

+}

diff --git a/core/src/fpdfapi/fpdf_page/pageint.h b/core/src/fpdfapi/fpdf_page/pageint.h
new file mode 100644
index 0000000..b1a83ec
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/pageint.h
@@ -0,0 +1,505 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_pageobj.h"

+#define PARSE_STEP_LIMIT		100

+#define STREAM_PARSE_BUFSIZE	20480

+class CPDF_QuickFontCache;

+#ifndef _FPDFAPI_MINI_

+class CPDF_StreamParser : public CFX_Object

+{

+public:

+

+    CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize);

+    ~CPDF_StreamParser();

+

+    CPDF_Stream*		ReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode);

+    typedef enum { EndOfData, Number, Keyword, Name, Others } SyntaxType;

+

+    SyntaxType			ParseNextElement();

+    FX_LPBYTE			GetWordBuf()

+    {

+        return m_WordBuffer;

+    }

+    FX_DWORD			GetWordSize()

+    {

+        return m_WordSize;

+    }

+    CPDF_Object*		GetObject()

+    {

+        CPDF_Object* pObj = m_pLastObj;

+        m_pLastObj = NULL;

+        return pObj;

+    }

+    FX_DWORD			GetPos()

+    {

+        return m_Pos;

+    }

+    void				SetPos(FX_DWORD pos)

+    {

+        m_Pos = pos;

+    }

+

+    CPDF_Object*		ReadNextObject(FX_BOOL bAllowNestedArray = FALSE, FX_BOOL bInArray = FALSE);

+    void				SkipPathObject();

+protected:

+    void				GetNextWord(FX_BOOL& bIsNumber);

+    CFX_ByteString		ReadString();

+    CFX_ByteString		ReadHexString();

+    const FX_BYTE*		m_pBuf;

+    FX_DWORD			m_Size;

+    FX_DWORD			m_Pos;

+    FX_BYTE				m_WordBuffer[256];

+    FX_DWORD			m_WordSize;

+    CPDF_Object*		m_pLastObj;

+};

+#endif

+typedef enum {

+    PDFOP_CloseFillStrokePath = 0, PDFOP_FillStrokePath,

+    PDFOP_CloseEOFillStrokePath, PDFOP_EOFillStrokePath,

+    PDFOP_BeginMarkedContent_Dictionary, PDFOP_BeginImage,

+    PDFOP_BeginMarkedContent, PDFOP_BeginText,

+    PDFOP_BeginSectionUndefined, PDFOP_CurveTo_123,

+    PDFOP_ConcatMatrix, PDFOP_SetColorSpace_Fill,

+    PDFOP_SetColorSpace_Stroke, PDFOP_SetDash,

+    PDFOP_SetCharWidth, PDFOP_SetCachedDevice,

+    PDFOP_ExecuteXObject, PDFOP_MarkPlace_Dictionary,

+    PDFOP_EndImage, PDFOP_EndMarkedContent,

+    PDFOP_EndText, PDFOP_EndSectionUndefined,

+    PDFOP_FillPath, PDFOP_FillPathOld,

+    PDFOP_EOFillPath, PDFOP_SetGray_Fill,

+    PDFOP_SetGray_Stroke, PDFOP_SetExtendGraphState,

+    PDFOP_ClosePath, PDFOP_SetFlat,

+    PDFOP_BeginImageData, PDFOP_SetLineJoin,

+    PDFOP_SetLineCap, PDFOP_SetCMYKColor_Fill,

+    PDFOP_SetCMYKColor_Stroke, PDFOP_LineTo,

+    PDFOP_MoveTo, PDFOP_SetMiterLimit,

+    PDFOP_MarkPlace, PDFOP_EndPath,

+    PDFOP_SaveGraphState, PDFOP_RestoreGraphState,

+    PDFOP_Rectangle, PDFOP_SetRGBColor_Fill,

+    PDFOP_SetRGBColor_Stroke, PDFOP_SetRenderIntent,

+    PDFOP_CloseStrokePath, PDFOP_StrokePath,

+    PDFOP_SetColor_Fill, PDFOP_SetColor_Stroke,

+    PDFOP_SetColorPS_Fill, PDFOP_SetColorPS_Stroke,

+    PDFOP_ShadeFill, PDFOP_SetCharSpace,

+    PDFOP_MoveTextPoint, PDFOP_MoveTextPoint_SetLeading,

+    PDFOP_SetFont, PDFOP_ShowText,

+    PDFOP_ShowText_Positioning, PDFOP_SetTextLeading,

+    PDFOP_SetTextMatrix, PDFOP_SetTextRenderMode,

+    PDFOP_SetTextRise, PDFOP_SetWordSpace,

+    PDFOP_SetHorzScale, PDFOP_MoveToNextLine,

+    PDFOP_CurveTo_23, PDFOP_SetLineWidth,

+    PDFOP_Clip, PDFOP_EOClip,

+    PDFOP_CurveTo_13, PDFOP_NextLineShowText,

+    PDFOP_NextLineShowText_Space, PDFOP_Invalid

+} PDFOP;

+#define PARAM_BUF_SIZE	16

+typedef struct {

+    int			m_Type;

+    union {

+        struct {

+            FX_BOOL		m_bInteger;

+            union {

+                int		m_Integer;

+                FX_FLOAT m_Float;

+            };

+        } m_Number;

+        CPDF_Object*	m_pObject;

+        struct {

+            int			m_Len;

+            char		m_Buffer[32];

+        } m_Name;

+    };

+} _ContentParam;

+#if defined(_FPDFAPI_MINI_)

+#define _FPDF_MAX_FORM_LEVEL_		17

+#else

+#define _FPDF_MAX_FORM_LEVEL_		30

+#endif

+#define _FPDF_MAX_TYPE3_FORM_LEVEL_	4

+#define _FPDF_MAX_OBJECT_STACK_SIZE_ 512

+class CPDF_StreamContentParser : public CFX_Object

+{

+public:

+    CPDF_StreamContentParser();

+    ~CPDF_StreamContentParser();

+    FX_BOOL Initialize();

+    void	PrepareParse(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources,

+                         CFX_AffineMatrix* pmtContentToUser,

+                         CPDF_PageObjects* pObjList, CPDF_Dictionary* pResources,

+                         CFX_FloatRect* pBBox, CPDF_ParseOptions* pOptions,

+                         CPDF_AllStates* pAllStates, int level);

+    CPDF_Document*		m_pDocument;

+    CPDF_Dictionary*	m_pPageResources;

+    CPDF_Dictionary*	m_pParentResources;

+    CPDF_PageObjects*	m_pObjectList;

+    CPDF_Dictionary*	m_pResources;

+    int					m_Level;

+    CFX_AffineMatrix	m_mtContentToUser;

+    CFX_FloatRect		m_BBox;

+    CPDF_ParseOptions	m_Options;

+    _ContentParam		m_ParamBuf1[PARAM_BUF_SIZE];

+    FX_DWORD			m_ParamStartPos;

+    FX_DWORD			m_ParamCount;

+    void				AddNumberParam(FX_LPCSTR str, int len);

+    void				AddObjectParam(CPDF_Object* pObj);

+    void				AddNameParam(FX_LPCSTR name, int size);

+    int					GetNextParamPos();

+    void				ClearAllParams();

+    CPDF_Object*		GetObject(FX_DWORD index);

+    CFX_ByteString		GetString(FX_DWORD index);

+    FX_FLOAT			GetNumber(FX_DWORD index);

+    FX_FLOAT		GetNumber16(FX_DWORD index);

+    int					GetInteger(FX_DWORD index)

+    {

+        return (FX_INT32)(GetNumber(index));

+    }

+    FX_BOOL				OnOperator(FX_LPCSTR op);

+    void				BigCaseCaller(int index);

+    FX_BOOL				m_bAbort;

+#ifndef _FPDFAPI_MINI_

+    CPDF_StreamParser*	m_pSyntax;

+    FX_DWORD			GetParsePos()

+    {

+        return m_pSyntax->GetPos();

+    }

+#else

+    int					m_WordState;

+    void				InputData(FX_LPCBYTE src_buf, FX_DWORD src_size);

+    void				Finish();

+    void				StartArray();

+    void				EndArray();

+    void				StartDict();

+    void				EndDict();

+    void				EndName();

+    void				EndNumber();

+    void				EndKeyword();

+    void				EndHexString();

+    void				EndString();

+    void				EndImageDict();

+    void				EndInlineImage();

+    FX_LPBYTE			m_pWordBuf;

+    FX_DWORD			m_WordSize;

+    CFX_BinaryBuf		m_StringBuf;

+    int					m_StringLevel, m_StringState, m_EscCode;

+    void				AddContainer(CPDF_Object* pObject);

+    FX_BOOL				SetToCurObj(CPDF_Object* pObject);

+    FX_LPBYTE			m_pDictName;

+    FX_BOOL				m_bDictName;

+    CPDF_Object**		m_pObjectStack;

+    FX_BOOL*			m_pObjectState;

+    FX_DWORD			m_ObjectSize;

+    int					m_InlineImageState;

+    FX_BYTE				m_InlineWhiteChar;

+    CFX_BinaryBuf		m_ImageSrcBuf;

+    FX_LPBYTE			m_pStreamBuf;

+#endif

+    CPDF_AllStates*		m_pCurStates;

+    CPDF_ContentMark	m_CurContentMark;

+    CFX_PtrArray		m_ClipTextList;

+    CPDF_TextObject*	m_pLastTextObject;

+    FX_FLOAT			m_DefFontSize;

+    void				AddTextObject(CFX_ByteString* pText, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int count);

+

+    void				ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y);

+    void				ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y);

+    void				OnChangeTextMatrix();

+#ifndef _FPDFAPI_MINI_

+    FX_DWORD			Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost);

+    void				ParsePathObject();

+#endif

+    int					m_CompatCount;

+    FX_PATHPOINT*		m_pPathPoints;

+    int					m_PathPointCount;

+    int					m_PathAllocSize;

+    FX_FLOAT			m_PathStartX, m_PathStartY;

+    FX_FLOAT			m_PathCurrentX, m_PathCurrentY;

+    int					m_PathClipType;

+    void				AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag);

+    void				AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h);

+    void				AddPathObject(int FillType, FX_BOOL bStroke);

+    CPDF_ImageObject*	AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline);

+    void				AddDuplicateImage();

+    void				AddForm(CPDF_Stream*);

+    CFX_ByteString		m_LastImageName;

+    CPDF_Image*			m_pLastImage;

+    CFX_BinaryBuf		m_LastImageDict, m_LastImageData;

+    CPDF_Dictionary*	m_pLastImageDict;

+    CPDF_Dictionary*    m_pLastCloneImageDict;

+    FX_BOOL				m_bReleaseLastDict;

+    FX_BOOL				m_bSameLastDict;

+    void				SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph);

+    FX_BOOL				m_bColored;

+    FX_FLOAT			m_Type3Data[6];

+    FX_BOOL				m_bResourceMissing;

+    CFX_PtrArray		m_StateStack;

+    void				SaveStates(CPDF_AllStates*);

+    void				RestoreStates(CPDF_AllStates*);

+    CPDF_Font*			FindFont(const CFX_ByteString& name);

+    CPDF_ColorSpace*	FindColorSpace(const CFX_ByteString& name);

+    CPDF_Pattern*		FindPattern(const CFX_ByteString& name, FX_BOOL bShading);

+    CPDF_Object*		FindResourceObj(FX_BSTR type, const CFX_ByteString& name);

+    void Handle_CloseFillStrokePath();

+    void Handle_FillStrokePath();

+    void Handle_CloseEOFillStrokePath();

+    void Handle_EOFillStrokePath();

+    void Handle_BeginMarkedContent_Dictionary();

+    void Handle_BeginImage();

+    void Handle_BeginMarkedContent();

+    void Handle_BeginText();

+    void Handle_BeginSectionUndefined();

+    void Handle_CurveTo_123();

+    void Handle_ConcatMatrix();

+    void Handle_SetColorSpace_Fill();

+    void Handle_SetColorSpace_Stroke();

+    void Handle_SetDash();

+    void Handle_SetCharWidth();

+    void Handle_SetCachedDevice();

+    void Handle_ExecuteXObject();

+    void Handle_MarkPlace_Dictionary();

+    void Handle_EndImage();

+    void Handle_EndMarkedContent();

+    void Handle_EndText();

+    void Handle_EndSectionUndefined();

+    void Handle_FillPath();

+    void Handle_FillPathOld();

+    void Handle_EOFillPath();

+    void Handle_SetGray_Fill();

+    void Handle_SetGray_Stroke();

+    void Handle_SetExtendGraphState();

+    void Handle_ClosePath();

+    void Handle_SetFlat();

+    void Handle_BeginImageData();

+    void Handle_SetLineJoin();

+    void Handle_SetLineCap();

+    void Handle_SetCMYKColor_Fill();

+    void Handle_SetCMYKColor_Stroke();

+    void Handle_LineTo();

+    void Handle_MoveTo();

+    void Handle_SetMiterLimit();

+    void Handle_MarkPlace();

+    void Handle_EndPath();

+    void Handle_SaveGraphState();

+    void Handle_RestoreGraphState();

+    void Handle_Rectangle();

+    void Handle_SetRGBColor_Fill();

+    void Handle_SetRGBColor_Stroke();

+    void Handle_SetRenderIntent();

+    void Handle_CloseStrokePath();

+    void Handle_StrokePath();

+    void Handle_SetColor_Fill();

+    void Handle_SetColor_Stroke();

+    void Handle_SetColorPS_Fill();

+    void Handle_SetColorPS_Stroke();

+    void Handle_ShadeFill();

+    void Handle_SetCharSpace();

+    void Handle_MoveTextPoint();

+    void Handle_MoveTextPoint_SetLeading();

+    void Handle_SetFont();

+    void Handle_ShowText();

+    void Handle_ShowText_Positioning();

+    void Handle_SetTextLeading();

+    void Handle_SetTextMatrix();

+    void Handle_SetTextRenderMode();

+    void Handle_SetTextRise();

+    void Handle_SetWordSpace();

+    void Handle_SetHorzScale();

+    void Handle_MoveToNextLine();

+    void Handle_CurveTo_23();

+    void Handle_SetLineWidth();

+    void Handle_Clip();

+    void Handle_EOClip();

+    void Handle_CurveTo_13();

+    void Handle_NextLineShowText();

+    void Handle_NextLineShowText_Space();

+    void Handle_Invalid();

+};

+class CPDF_ContentParser : public CFX_Object

+{

+public:

+    CPDF_ContentParser();

+    ~CPDF_ContentParser();

+    typedef enum { Ready, ToBeContinued, Done } ParseStatus;

+    ParseStatus			GetStatus()

+    {

+        return m_Status;

+    }

+    void				Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions);

+    void				Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,

+                              CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level);

+    void				Continue(IFX_Pause* pPause);

+    int					EstimateProgress();

+protected:

+    void				Clear();

+    ParseStatus			m_Status;

+    CPDF_PageObjects*	m_pObjects;

+    FX_BOOL				m_bForm;

+    CPDF_ParseOptions	m_Options;

+    CPDF_Type3Char*		m_pType3Char;

+    int					m_InternalStage;

+    CPDF_StreamAcc*		m_pSingleStream;

+    CPDF_StreamAcc**	m_pStreamArray;

+    FX_DWORD			m_nStreams;

+    FX_LPBYTE			m_pData;

+    FX_DWORD			m_Size;

+    class CPDF_StreamContentParser*	m_pParser;

+    FX_DWORD			m_CurrentOffset;

+    CPDF_StreamFilter*	m_pStreamFilter;

+};

+class CPDF_AllStates : public CPDF_GraphicStates

+{

+public:

+    CPDF_AllStates();

+    ~CPDF_AllStates();

+    void	Copy(const CPDF_AllStates& src);

+    void	ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser);

+    void	SetLineDash(CPDF_Array*, FX_FLOAT, FX_FLOAT scale);

+    CFX_AffineMatrix		m_TextMatrix, m_CTM, m_ParentMatrix;

+    FX_FLOAT				m_TextX, m_TextY, m_TextLineX, m_TextLineY;

+    FX_FLOAT				m_TextLeading, m_TextRise, m_TextHorzScale;

+};

+template <class ObjClass> class CPDF_CountedObject : public CFX_Object

+{

+public:

+    ObjClass	m_Obj;

+    FX_DWORD	m_nCount;

+};

+typedef CFX_MapPtrTemplate<CPDF_Dictionary*, CPDF_CountedObject<CPDF_Font*>*>		CPDF_FontMap;

+typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_ColorSpace*>*>		CPDF_ColorSpaceMap;

+typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_Pattern*>*>		CPDF_PatternMap;

+typedef CFX_MapPtrTemplate<FX_DWORD, CPDF_CountedObject<CPDF_Image*>*>				CPDF_ImageMap;

+typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_IccProfile*>*>		CPDF_IccProfileMap;

+typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_StreamAcc*>*>		CPDF_FontFileMap;

+template <class KeyType, class ValueType>

+KeyType PDF_DocPageData_FindValue(const CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, ValueType findValue, CPDF_CountedObject<ValueType>*& findData)

+{

+    FX_POSITION pos = map.GetStartPosition();

+    while (pos) {

+        KeyType findKey;

+        map.GetNextAssoc(pos, findKey, findData);

+        if (findData->m_Obj == findValue) {

+            return findKey;

+        }

+    }

+    findData = NULL;

+    return (KeyType)(FX_UINTPTR)NULL;

+}

+template <class KeyType, class ValueType>

+FX_BOOL PDF_DocPageData_Release(CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, KeyType findKey, ValueType findValue, FX_BOOL bForce = FALSE)

+{

+    if (!findKey && !findValue) {

+        return FALSE;

+    }

+    CPDF_CountedObject<ValueType>* findData = NULL;

+    if (!findKey) {

+        findKey = PDF_DocPageData_FindValue<KeyType, ValueType>(map, findValue, findData);

+    } else if (!map.Lookup(findKey, findData)) {

+        return FALSE;

+    }

+    if (findData && ((-- findData->m_nCount) == 0 || bForce)) {

+        delete findData->m_Obj;

+        delete findData;

+        map.RemoveKey(findKey);

+        return TRUE;

+    }

+    return FALSE;

+}

+class CPDF_DocPageData : public CFX_Object

+{

+public:

+    CPDF_DocPageData(CPDF_Document *pPDFDoc);

+    ~CPDF_DocPageData();

+    void					Clear(FX_BOOL bRelease = FALSE);

+    CPDF_Font*				GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly);

+    CPDF_Font*				GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding);

+    void					ReleaseFont(CPDF_Dictionary* pFontDict);

+    CPDF_ColorSpace*		GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources);

+    CPDF_ColorSpace*		GetCopiedColorSpace(CPDF_Object* pCSObj);

+    void					ReleaseColorSpace(CPDF_Object* pColorSpace);

+    CPDF_Pattern*			GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix);

+    void					ReleasePattern(CPDF_Object* pPatternObj);

+    CPDF_Image*				GetImage(CPDF_Object* pImageStream);

+    void					ReleaseImage(CPDF_Object* pImageStream);

+    CPDF_IccProfile*		GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents);

+    void					ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile);

+    CPDF_StreamAcc*			GetFontFileStreamAcc(CPDF_Stream* pFontStream);

+    void					ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce = FALSE);

+    CPDF_Document*			m_pPDFDoc;

+    CPDF_FontMap			m_FontMap;

+    CPDF_ColorSpaceMap		m_ColorSpaceMap;

+    CPDF_PatternMap			m_PatternMap;

+    CPDF_ImageMap			m_ImageMap;

+    CPDF_IccProfileMap		m_IccProfileMap;

+    CFX_MapByteStringToPtr	m_HashProfileMap;

+    CPDF_FontFileMap		m_FontFileMap;

+};

+class CPDF_Function : public CFX_Object

+{

+public:

+    static CPDF_Function*	Load(CPDF_Object* pFuncObj);

+    virtual ~CPDF_Function();

+    FX_BOOL		Call(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const;

+    int			CountInputs()

+    {

+        return m_nInputs;

+    }

+    int			CountOutputs()

+    {

+        return m_nOutputs;

+    }

+protected:

+    CPDF_Function();

+    int			m_nInputs, m_nOutputs;

+    FX_FLOAT*	m_pDomains;

+    FX_FLOAT*	m_pRanges;

+    FX_BOOL		Init(CPDF_Object* pObj);

+    virtual FX_BOOL	v_Init(CPDF_Object* pObj) = 0;

+    virtual FX_BOOL	v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0;

+};

+class CPDF_IccProfile : public CFX_Object

+{

+public:

+    CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents);

+    ~CPDF_IccProfile();

+    FX_BOOL					m_bsRGB;

+    FX_LPVOID				m_pTransform;

+};

+class CPDF_DeviceCS : public CPDF_ColorSpace

+{

+public:

+    CPDF_DeviceCS(int family);

+    virtual FX_BOOL	GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;

+    FX_BOOL	SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;

+    FX_BOOL	v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;

+    FX_BOOL	v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;

+    virtual void	TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;

+};

+class CPDF_PatternCS : public CPDF_ColorSpace

+{

+public:

+    CPDF_PatternCS();

+    ~CPDF_PatternCS();

+    virtual FX_BOOL		v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);

+    virtual FX_BOOL		GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;

+    virtual CPDF_ColorSpace*	GetBaseCS() const

+    {

+        return m_pBaseCS;

+    }

+    CPDF_ColorSpace*	m_pBaseCS;

+};

+#define	MAX_PAGE_OBJECTS_UNIFY_NAMING				4096

+class CPDF_ResourceNaming : public CFX_Object

+{

+public:

+    struct _NamingState : public CFX_Object {

+        CFX_ByteString	m_Prefix;

+        int				m_nIndex;

+    };

+    ~CPDF_ResourceNaming();

+    CFX_ByteString		GetName(const CPDF_Dictionary* pResList, FX_LPCSTR szType);

+protected:

+    CFX_MapByteStringToPtr	m_NamingCache;

+};

diff --git a/core/src/fpdfapi/fpdf_parser/filters_int.h b/core/src/fpdfapi/fpdf_parser/filters_int.h
new file mode 100644
index 0000000..fa7d7db
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/filters_int.h
@@ -0,0 +1,119 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+class CPDF_DecryptFilter : public CFX_DataFilter

+{

+public:

+    CPDF_DecryptFilter(CPDF_CryptoHandler* pCryptoHandler, FX_DWORD objnum, FX_DWORD gennum);

+    virtual ~CPDF_DecryptFilter();

+    virtual	void	v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);

+    virtual void	v_FilterFinish(CFX_BinaryBuf& dest_buf);

+    CPDF_CryptoHandler*	m_pCryptoHandler;

+    FX_LPVOID		m_pContext;

+    FX_DWORD		m_ObjNum, m_GenNum;

+};

+class CPDF_FlateFilter : public CFX_DataFilter

+{

+public:

+    CPDF_FlateFilter();

+    virtual ~CPDF_FlateFilter();

+    virtual	void	v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);

+    virtual void	v_FilterFinish(CFX_BinaryBuf& dest_buf) {}

+    void*			m_pContext;

+    FX_BYTE			m_DestBuffer[FPDF_FILTER_BUFFER_SIZE];

+};

+class CPDF_LzwFilter : public CFX_DataFilter

+{

+public:

+    CPDF_LzwFilter(FX_BOOL bEarlyChange);

+    virtual ~CPDF_LzwFilter() {}

+    virtual	void	v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);

+    virtual void	v_FilterFinish(CFX_BinaryBuf& dest_buf) {}

+    FX_BOOL			m_bEarlyChange;

+    FX_DWORD		m_CodeArray[5021];

+    FX_DWORD		m_nCodes;

+    FX_DWORD		m_CodeLen;

+    FX_DWORD		m_OldCode;

+    FX_BYTE			m_LastChar;

+    FX_DWORD		m_nLeftBits, m_LeftBits;

+    FX_BYTE			m_DecodeStack[4000];

+    FX_DWORD		m_StackLen;

+    void			AddCode(FX_DWORD prefix_code, FX_BYTE append_char);

+    void			DecodeString(FX_DWORD code);

+};

+class CPDF_PredictorFilter : public CFX_DataFilter

+{

+public:

+    CPDF_PredictorFilter(int predictor, int colors, int bpc, int cols);

+    virtual ~CPDF_PredictorFilter();

+    virtual	void	v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);

+    virtual void	v_FilterFinish(CFX_BinaryBuf& dest_buf) {}

+    FX_BOOL			m_bTiff;

+    FX_DWORD		m_Pitch, m_Bpp;

+    FX_LPBYTE		m_pRefLine, m_pCurLine;

+    FX_DWORD		m_iLine, m_LineInSize;

+};

+class CPDF_AsciiHexFilter : public CFX_DataFilter

+{

+public:

+    CPDF_AsciiHexFilter();

+    virtual ~CPDF_AsciiHexFilter() {}

+    virtual	void	v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);

+    virtual void	v_FilterFinish(CFX_BinaryBuf& dest_buf) {}

+    int				m_State;

+    int				m_FirstDigit;

+};

+class CPDF_Ascii85Filter : public CFX_DataFilter

+{

+public:

+    CPDF_Ascii85Filter();

+    virtual ~CPDF_Ascii85Filter() {}

+    virtual	void	v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);

+    virtual void	v_FilterFinish(CFX_BinaryBuf& dest_buf) {}

+    int				m_State;

+    int				m_CharCount;

+    FX_DWORD		m_CurDWord;

+};

+class CPDF_RunLenFilter : public CFX_DataFilter

+{

+public:

+    CPDF_RunLenFilter();

+    virtual ~CPDF_RunLenFilter() {}

+    virtual	void	v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);

+    virtual void	v_FilterFinish(CFX_BinaryBuf& dest_buf) {}

+    int				m_State;

+    FX_DWORD		m_Count;

+};

+class CPDF_JpegFilter : public CFX_DataFilter

+{

+public:

+    CPDF_JpegFilter();

+    virtual ~CPDF_JpegFilter();

+    virtual	void	v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);

+    virtual void	v_FilterFinish(CFX_BinaryBuf& dest_buf) {}

+    void*			m_pContext;

+    CFX_BinaryBuf	m_InputBuf;

+    FX_LPBYTE		m_pScanline;

+    int				m_Pitch, m_Height, m_Width, m_nComps, m_iLine;

+    FX_BOOL			m_bGotHeader;

+};

+class CPDF_FaxFilter : public CFX_DataFilter

+{

+public:

+    CPDF_FaxFilter();

+    virtual ~CPDF_FaxFilter();

+    FX_BOOL			Initialize(int Encoding, int bEndOfLine, int bByteAlign, int bBlack, int nRows, int nColumns);

+    virtual	void	v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);

+    virtual void	v_FilterFinish(CFX_BinaryBuf& dest_buf);

+    int				m_Encoding, m_bEndOfLine, m_bByteAlign, m_bBlack;

+    int				m_nRows, m_nColumns, m_Pitch, m_iRow;

+    FX_LPBYTE		m_pScanlineBuf, m_pRefBuf;

+    CFX_BinaryBuf	m_InputBuf;

+    int				m_InputBitPos;

+    void			ProcessData(FX_LPCBYTE src_buf, FX_DWORD src_size, int& bitpos, FX_BOOL bFinish,

+                                CFX_BinaryBuf& dest_buf);

+    FX_BOOL			ReadLine(FX_LPCBYTE src_buf, int bitsize, int& bitpos);

+};

diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
new file mode 100644
index 0000000..74e81d4
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
@@ -0,0 +1,533 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_parser.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include <limits.h>

+#define _STREAM_MAX_SIZE_		20 * 1024 * 1024

+FX_DWORD _A85Decode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    dest_size = 0;

+    dest_buf = NULL;

+    if (src_size == 0) {

+        return 0;

+    }

+    FX_DWORD orig_size = dest_size;

+    FX_DWORD zcount = 0;

+    FX_DWORD pos = 0;

+    while (pos < src_size) {

+        FX_BYTE ch = src_buf[pos];

+        if (ch < '!' && ch != '\n' && ch != '\r' && ch != ' ' && ch != '\t') {

+            break;

+        }

+        if (ch == 'z') {

+            zcount ++;

+        } else if (ch > 'u') {

+            break;

+        }

+        pos ++;

+    }

+    if (pos == 0) {

+        return 0;

+    }

+    if (zcount > UINT_MAX / 4) {

+        return (FX_DWORD) - 1;

+    }

+    if (zcount * 4 > UINT_MAX - (pos - zcount)) {

+        return (FX_DWORD) - 1;

+    }

+    dest_buf = FX_Alloc(FX_BYTE, zcount * 4 + (pos - zcount));

+    if (dest_buf == NULL) {

+        return (FX_DWORD) - 1;

+    }

+    int state = 0, res = 0;

+    pos = dest_size = 0;

+    while (pos < src_size) {

+        FX_BYTE ch = src_buf[pos++];

+        if (ch == '\n' || ch == '\r' || ch == ' ' || ch == '\t') {

+            continue;

+        }

+        if (ch == 'z') {

+            FXSYS_memset32(dest_buf + dest_size, 0, 4);

+            state = 0;

+            res = 0;

+            dest_size += 4;

+        } else {

+            if (ch < '!' || ch > 'u') {

+                break;

+            }

+            res = res * 85 + ch - 33;

+            state ++;

+            if (state == 5) {

+                for (int i = 0; i < 4; i ++) {

+                    dest_buf[dest_size++] = (FX_BYTE)(res >> (3 - i) * 8);

+                }

+                state = 0;

+                res = 0;

+            }

+        }

+    }

+    if (state) {

+        int i;

+        for (i = state; i < 5; i ++) {

+            res = res * 85 + 84;

+        }

+        for (i = 0; i < state - 1; i ++) {

+            dest_buf[dest_size++] = (FX_BYTE)(res >> (3 - i) * 8);

+        }

+    }

+    if (pos < src_size && src_buf[pos] == '>') {

+        pos ++;

+    }

+    return pos;

+}

+FX_DWORD _HexDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    FX_DWORD orig_size = dest_size;

+    FX_DWORD i;

+    for (i = 0; i < src_size; i ++)

+        if (src_buf[i] == '>') {

+            break;

+        }

+    dest_buf = FX_Alloc( FX_BYTE, i / 2 + 1);

+    dest_size = 0;

+    FX_BOOL bFirstDigit = TRUE;

+    for (i = 0; i < src_size; i ++) {

+        FX_BYTE ch = src_buf[i];

+        if (ch == ' ' || ch == '\n' || ch == '\t' || ch == '\r') {

+            continue;

+        }

+        int digit;

+        if (ch <= '9' && ch >= '0') {

+            digit = ch - '0';

+        } else if (ch <= 'f' && ch >= 'a') {

+            digit = ch - 'a' + 10;

+        } else if (ch <= 'F' && ch >= 'A') {

+            digit = ch - 'A' + 10;

+        } else if (ch == '>') {

+            i ++;

+            break;

+        } else {

+            continue;

+        }

+        if (bFirstDigit) {

+            dest_buf[dest_size] = digit * 16;

+        } else {

+            dest_buf[dest_size ++] += digit;

+        }

+        bFirstDigit = !bFirstDigit;

+    }

+    if (!bFirstDigit) {

+        dest_size ++;

+    }

+    return i;

+}

+FX_DWORD RunLengthDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    FX_DWORD orig_size = dest_size;

+    FX_DWORD i = 0;

+    FX_DWORD old;

+    dest_size = 0;

+    while (i < src_size) {

+        if (src_buf[i] < 128) {

+            old = dest_size;

+            dest_size += src_buf[i] + 1;

+            if (dest_size < old) {

+                return (FX_DWORD) - 1;

+            }

+            i += src_buf[i] + 2;

+        } else if (src_buf[i] > 128) {

+            old = dest_size;

+            dest_size += 257 - src_buf[i];

+            if (dest_size < old) {

+                return (FX_DWORD) - 1;

+            }

+            i += 2;

+        } else {

+            break;

+        }

+    }

+    if (dest_size >= _STREAM_MAX_SIZE_) {

+        return -1;

+    }

+    dest_buf = FX_Alloc( FX_BYTE, dest_size);

+    if (!dest_buf) {

+        return -1;

+    }

+    i = 0;

+    int dest_count = 0;

+    while (i < src_size) {

+        if (src_buf[i] < 128) {

+            FX_DWORD copy_len = src_buf[i] + 1;

+            FX_DWORD buf_left = src_size - i - 1;

+            if (buf_left < copy_len) {

+                FX_DWORD delta = copy_len - buf_left;

+                copy_len = buf_left;

+                FXSYS_memset8(dest_buf + dest_count + copy_len, '\0', delta);

+            }

+            FXSYS_memcpy32(dest_buf + dest_count, src_buf + i + 1, copy_len);

+            dest_count += src_buf[i] + 1;

+            i += src_buf[i] + 2;

+        } else if (src_buf[i] > 128) {

+            int fill = 0;

+            if (i < src_size - 1) {

+                fill = src_buf[i + 1];

+            }

+            FXSYS_memset8(dest_buf + dest_count, fill, 257 - src_buf[i]);

+            dest_count += 257 - src_buf[i];

+            i += 2;

+        } else {

+            break;

+        }

+    }

+    FX_DWORD ret = i + 1;

+    if (ret > src_size) {

+        ret = src_size;

+    }

+    return ret;

+}

+ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+        const CPDF_Dictionary* pParams)

+{

+    int K = 0;

+    FX_BOOL EndOfLine = FALSE;

+    FX_BOOL ByteAlign = FALSE;

+    FX_BOOL BlackIs1 = FALSE;

+    FX_BOOL Columns = 1728;

+    FX_BOOL Rows = 0;

+    if (pParams) {

+        K = pParams->GetInteger(FX_BSTRC("K"));

+        EndOfLine = pParams->GetInteger(FX_BSTRC("EndOfLine"));

+        ByteAlign = pParams->GetInteger(FX_BSTRC("EncodedByteAlign"));

+        BlackIs1 = pParams->GetInteger(FX_BSTRC("BlackIs1"));

+        Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1728);

+        Rows = pParams->GetInteger(FX_BSTRC("Rows"));

+        if (Rows > USHRT_MAX) {

+            Rows = 0;

+        }

+        if (Columns <= 0 || Rows < 0 || Columns > USHRT_MAX || Rows > USHRT_MAX) {

+            return NULL;

+        }

+    }

+    return CPDF_ModuleMgr::Get()->GetFaxModule()->CreateDecoder(src_buf, src_size, width, height,

+            K, EndOfLine, ByteAlign, BlackIs1, Columns, Rows);

+}

+static FX_BOOL CheckFlateDecodeParams(int Colors, int BitsPerComponent, int Columns)

+{

+    if (Columns < 0) {

+        return FALSE;

+    }

+    int check = Columns;

+    if (Colors < 0 || (check > 0 && Colors > INT_MAX / check)) {

+        return FALSE;

+    }

+    check *= Colors;

+    if (BitsPerComponent < 0 ||

+            (check > 0 && BitsPerComponent > INT_MAX / check)) {

+        return FALSE;

+    }

+    check *= BitsPerComponent;

+    if (check > INT_MAX - 7) {

+        return FALSE;

+    }

+    return TRUE;

+}

+ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+        int nComps, int bpc, const CPDF_Dictionary* pParams)

+{

+    int predictor = 0;

+    FX_BOOL bEarlyChange = TRUE;

+    int Colors = 0, BitsPerComponent = 0, Columns = 0;

+    if (pParams) {

+        predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"));

+        bEarlyChange = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("EarlyChange"), 1);

+        Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);

+        BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);

+        Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);

+        if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) {

+            return NULL;

+        }

+    }

+    return CPDF_ModuleMgr::Get()->GetFlateModule()->CreateDecoder(src_buf, src_size, width, height,

+            nComps, bpc, predictor, Colors, BitsPerComponent, Columns);

+}

+FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, CPDF_Dictionary* pParams,

+                                  FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    int predictor = 0;

+    FX_BOOL bEarlyChange = TRUE;

+    int Colors = 0, BitsPerComponent = 0, Columns = 0;

+    if (pParams) {

+        predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"));

+        bEarlyChange = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("EarlyChange"), 1);

+        Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);

+        BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);

+        Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);

+        if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) {

+            return (FX_DWORD) - 1;

+        }

+    }

+    return CPDF_ModuleMgr::Get()->GetFlateModule()->FlateOrLZWDecode(bLZW, src_buf, src_size,

+            bEarlyChange, predictor, Colors, BitsPerComponent, Columns, estimated_size,

+            dest_buf, dest_size);

+}

+FX_BOOL PDF_DataDecode(FX_LPCBYTE src_buf, FX_DWORD src_size, const CPDF_Dictionary* pDict,

+                       FX_LPBYTE& dest_buf, FX_DWORD& dest_size, CFX_ByteString& ImageEncoding,

+                       CPDF_Dictionary*& pImageParms, FX_DWORD last_estimated_size, FX_BOOL bImageAcc)

+

+{

+    CPDF_Object* pDecoder = pDict->GetElementValue(FX_BSTRC("Filter"));

+    if (pDecoder == NULL || (pDecoder->GetType() != PDFOBJ_ARRAY && pDecoder->GetType() != PDFOBJ_NAME)) {

+        return FALSE;

+    }

+    CPDF_Object* pParams = pDict->GetElementValue(FX_BSTRC("DecodeParms"));

+    CFX_ByteStringArray DecoderList;

+    CFX_PtrArray ParamList;

+    if (pDecoder->GetType() == PDFOBJ_ARRAY) {

+        if (pParams && pParams->GetType() != PDFOBJ_ARRAY) {

+            pParams = NULL;

+        }

+        CPDF_Array* pDecoders = (CPDF_Array*)pDecoder;

+        for (FX_DWORD i = 0; i < pDecoders->GetCount(); i ++) {

+            CFX_ByteStringC str = pDecoders->GetConstString(i);

+            DecoderList.Add(str);

+            if (pParams) {

+                ParamList.Add(((CPDF_Array*)pParams)->GetDict(i));

+            } else {

+                ParamList.Add(NULL);

+            }

+        }

+    } else {

+        DecoderList.Add(pDecoder->GetConstString());

+        ParamList.Add(pParams->GetDict());

+    }

+    FX_LPBYTE last_buf = (FX_LPBYTE)src_buf;

+    FX_DWORD last_size = src_size;

+    for (int i = 0; i < DecoderList.GetSize(); i ++) {

+        int estimated_size = i == DecoderList.GetSize() - 1 ? last_estimated_size : 0;

+        CFX_ByteString decoder = DecoderList[i];

+        CPDF_Dictionary* pParam = (CPDF_Dictionary*)ParamList[i];

+        FX_LPBYTE new_buf = NULL;

+        FX_DWORD new_size = (FX_DWORD) - 1;

+        int offset = -1;

+        if (decoder == FX_BSTRC("FlateDecode") || decoder == FX_BSTRC("Fl")) {

+            if (bImageAcc && i == DecoderList.GetSize() - 1) {

+                ImageEncoding = FX_BSTRC("FlateDecode");

+                dest_buf = (FX_LPBYTE)last_buf;

+                dest_size = last_size;

+                pImageParms = pParam;

+                return TRUE;

+            } else {

+                offset = FPDFAPI_FlateOrLZWDecode(FALSE, last_buf, last_size, pParam, estimated_size, new_buf, new_size);

+            }

+        } else if (decoder == FX_BSTRC("LZWDecode") || decoder == FX_BSTRC("LZW")) {

+            offset = FPDFAPI_FlateOrLZWDecode(TRUE, last_buf, last_size, pParam, estimated_size, new_buf, new_size);

+        } else if (decoder == FX_BSTRC("ASCII85Decode") || decoder == FX_BSTRC("A85")) {

+            offset = _A85Decode(last_buf, last_size, new_buf, new_size);

+        } else if (decoder == FX_BSTRC("ASCIIHexDecode") || decoder == FX_BSTRC("AHx")) {

+            offset = _HexDecode(last_buf, last_size, new_buf, new_size);

+        } else if (decoder == FX_BSTRC("RunLengthDecode") || decoder == FX_BSTRC("RL")) {

+            if (bImageAcc && i == DecoderList.GetSize() - 1) {

+                ImageEncoding = FX_BSTRC("RunLengthDecode");

+                dest_buf = (FX_LPBYTE)last_buf;

+                dest_size = last_size;

+                pImageParms = pParam;

+                return TRUE;

+            }

+            offset = RunLengthDecode(last_buf, last_size, new_buf, new_size);

+        } else {

+            if (decoder == FX_BSTRC("DCT")) {

+                decoder = "DCTDecode";

+            } else if (decoder == FX_BSTRC("CCF")) {

+                decoder = "CCITTFaxDecode";

+            } else if (decoder == FX_BSTRC("Crypt")) {

+                continue;

+            }

+            ImageEncoding = decoder;

+            pImageParms = pParam;

+            dest_buf = (FX_LPBYTE)last_buf;

+            dest_size = last_size;

+            return TRUE;

+        }

+        if (last_buf != src_buf) {

+            FX_Free(last_buf);

+        }

+        if (offset == -1) {

+            return FALSE;

+        }

+        last_buf = new_buf;

+        last_size = new_size;

+    }

+    ImageEncoding = "";

+    pImageParms = NULL;

+    dest_buf = last_buf;

+    dest_size = last_size;

+    return TRUE;

+}

+extern const FX_WORD PDFDocEncoding[256] = {

+    0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009,

+    0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013,

+    0x0014, 0x0015, 0x0016, 0x0017, 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db,

+    0x02da, 0x02dc, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,

+    0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,

+    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,

+    0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,

+    0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,

+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,

+    0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063,

+    0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,

+    0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,

+    0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x2022, 0x2020,

+    0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030,

+    0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141,

+    0x0152, 0x0160, 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000,

+    0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9,

+    0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3,

+    0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd,

+    0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,

+    0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1,

+    0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db,

+    0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5,

+    0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,

+    0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9,

+    0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff

+};

+CFX_WideString PDF_DecodeText(FX_LPCBYTE src_data, FX_DWORD src_len, CFX_CharMap* pCharMap)

+{

+    CFX_WideString result;

+    if (src_len >= 2 && ((src_data[0] == 0xfe && src_data[1] == 0xff) || (src_data[0] == 0xff && src_data[1] == 0xfe))) {

+        FX_BOOL bBE = src_data[0] == 0xfe;

+        int max_chars = (src_len - 2) / 2;

+        if (!max_chars) {

+            return result;

+        }

+        if (src_data[0] == 0xff) {

+            bBE = !src_data[2];

+        }

+        FX_LPWSTR dest_buf = result.GetBuffer(max_chars);

+        FX_LPCBYTE uni_str = src_data + 2;

+        int dest_pos = 0;

+        for (int i = 0; i < max_chars * 2; i += 2) {

+            FX_WORD unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1]) : (uni_str[i + 1] << 8 | uni_str[i]);

+            if (unicode == 0x1b) {

+                i += 2;

+                while (i < max_chars * 2) {

+                    FX_WORD unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1]) : (uni_str[i + 1] << 8 | uni_str[i]);

+                    i += 2;

+                    if (unicode == 0x1b) {

+                        break;

+                    }

+                }

+            } else {

+                dest_buf[dest_pos++] = unicode;

+            }

+        }

+        result.ReleaseBuffer(dest_pos);

+    } else if (pCharMap == NULL) {

+        FX_LPWSTR dest_buf = result.GetBuffer(src_len);

+        for (FX_DWORD i = 0; i < src_len; i ++) {

+            dest_buf[i] = PDFDocEncoding[src_data[i]];

+        }

+        result.ReleaseBuffer(src_len);

+    } else {

+        return (*pCharMap->m_GetWideString)(pCharMap, CFX_ByteString((FX_LPCSTR)src_data, src_len));

+    }

+    return result;

+}

+CFX_WideString PDF_DecodeText(const CFX_ByteString& bstr, CFX_CharMap* pCharMap)

+{

+    return PDF_DecodeText((FX_LPCBYTE)(FX_LPCSTR)bstr, bstr.GetLength(), pCharMap);

+}

+CFX_ByteString PDF_EncodeText(FX_LPCWSTR pString, int len, CFX_CharMap* pCharMap)

+{

+    if (len == -1) {

+        len = (FX_STRSIZE)FXSYS_wcslen(pString);

+    }

+    CFX_ByteString result;

+    if (pCharMap == NULL) {

+        FX_LPSTR dest_buf1 = result.GetBuffer(len);

+        int i;

+        for (i = 0; i < len; i ++) {

+            int code;

+            for (code = 0; code < 256; code ++)

+                if (PDFDocEncoding[code] == pString[i]) {

+                    break;

+                }

+            if (code == 256) {

+                break;

+            }

+            dest_buf1[i] = code;

+        }

+        result.ReleaseBuffer(i);

+        if (i == len) {

+            return result;

+        }

+    }

+    FX_LPBYTE dest_buf2 = (FX_LPBYTE)result.GetBuffer(len * 2 + 2);

+    dest_buf2[0] = 0xfe;

+    dest_buf2[1] = 0xff;

+    dest_buf2 += 2;

+    for (int i = 0; i < len; i ++) {

+        *dest_buf2++ = pString[i] >> 8;

+        *dest_buf2++ = (FX_BYTE)pString[i];

+    }

+    result.ReleaseBuffer(len * 2 + 2);

+    return result;

+}

+CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex)

+{

+    CFX_ByteTextBuf result;

+    int srclen = src.GetLength();

+    if (bHex) {

+        result.AppendChar('<');

+        for (int i = 0; i < srclen; i ++) {

+            result.AppendChar("0123456789ABCDEF"[src[i] / 16]);

+            result.AppendChar("0123456789ABCDEF"[src[i] % 16]);

+        }

+        result.AppendChar('>');

+        return result.GetByteString();

+    }

+    result.AppendChar('(');

+    for (int i = 0; i < srclen; i ++) {

+        FX_BYTE ch = src[i];

+        if (ch == ')' || ch == '\\' || ch == '(') {

+            result.AppendChar('\\');

+        } else if (ch == 0x0a) {

+            result << FX_BSTRC("\\n");

+            continue;

+        } else if (ch == 0x0d) {

+            result << FX_BSTRC("\\r");

+            continue;

+        }

+        result.AppendChar(ch);

+    }

+    result.AppendChar(')');

+    return result.GetByteString();

+}

+void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();

+    if (pEncoders) {

+        pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size);

+    }

+}

+void FlateEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, int predictor, int Colors, int BitsPerComponent, int Columns,

+                 FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();

+    if (pEncoders) {

+        pEncoders->GetFlateModule()->Encode(src_buf, src_size, predictor, Colors, BitsPerComponent, Columns, dest_buf, dest_size);

+    }

+}

+FX_DWORD FlateDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();

+    if (pEncoders) {

+        return pEncoders->GetFlateModule()->FlateOrLZWDecode(FALSE, src_buf, src_size, FALSE, 0, 0, 0, 0, 0, dest_buf, dest_size);

+    }

+    return 0;

+}

diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
new file mode 100644
index 0000000..068a606
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
@@ -0,0 +1,398 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_parser.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+extern FX_LPVOID PDFPreviewInitCache(CPDF_Document* pDoc);

+extern void PDFPreviewClearCache(FX_LPVOID pCache);

+CPDF_Document::CPDF_Document(IPDF_DocParser* pParser) : CPDF_IndirectObjects(pParser)

+{

+    ASSERT(pParser != NULL);

+    m_pRootDict = NULL;

+    m_pInfoDict = NULL;

+    m_bLinearized = FALSE;

+    m_dwFirstPageNo = 0;

+    m_dwFirstPageObjNum = 0;

+    m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);

+    m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);

+}

+CPDF_DocPageData* CPDF_Document::GetValidatePageData()

+{

+    if (m_pDocPage) {

+        return m_pDocPage;

+    }

+    m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);

+    return m_pDocPage;

+}

+CPDF_DocRenderData* CPDF_Document::GetValidateRenderData()

+{

+    if (m_pDocRender) {

+        return m_pDocRender;

+    }

+    m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);

+    return m_pDocRender;

+}

+void CPDF_Document::LoadDoc()

+{

+    m_LastObjNum = m_pParser->GetLastObjNum();

+    CPDF_Object* pRootObj = GetIndirectObject(m_pParser->GetRootObjNum());

+    if (pRootObj == NULL) {

+        return;

+    }

+    m_pRootDict = pRootObj->GetDict();

+    if (m_pRootDict == NULL) {

+        return;

+    }

+    CPDF_Object* pInfoObj = GetIndirectObject(m_pParser->GetInfoObjNum());

+    if (pInfoObj) {

+        m_pInfoDict = pInfoObj->GetDict();

+    }

+    CPDF_Array* pIDArray = m_pParser->GetIDArray();

+    if (pIDArray) {

+        m_ID1 = pIDArray->GetString(0);

+        m_ID2 = pIDArray->GetString(1);

+    }

+    m_PageList.SetSize(_GetPageCount());

+}

+void CPDF_Document::LoadAsynDoc(CPDF_Dictionary *pLinearized)

+{

+    m_bLinearized = TRUE;

+    m_LastObjNum = m_pParser->GetLastObjNum();

+    m_pRootDict = GetIndirectObject(m_pParser->GetRootObjNum())->GetDict();

+    if (m_pRootDict == NULL) {

+        return;

+    }

+    m_pInfoDict = GetIndirectObject(m_pParser->GetInfoObjNum())->GetDict();

+    CPDF_Array* pIDArray = m_pParser->GetIDArray();

+    if (pIDArray) {

+        m_ID1 = pIDArray->GetString(0);

+        m_ID2 = pIDArray->GetString(1);

+    }

+    FX_DWORD dwPageCount = 0;

+    CPDF_Object *pCount = pLinearized->GetElement(FX_BSTRC("N"));

+    if (pCount && pCount->GetType() == PDFOBJ_NUMBER) {

+        dwPageCount = pCount->GetInteger();

+    }

+    m_PageList.SetSize(dwPageCount);

+    CPDF_Object *pNo = pLinearized->GetElement(FX_BSTRC("P"));

+    if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {

+        m_dwFirstPageNo = pNo->GetInteger();

+    }

+    CPDF_Object *pObjNum = pLinearized->GetElement(FX_BSTRC("O"));

+    if (pObjNum && pObjNum->GetType() == PDFOBJ_NUMBER) {

+        m_dwFirstPageObjNum = pObjNum->GetInteger();

+    }

+}

+void CPDF_Document::LoadPages()

+{

+    m_PageList.SetSize(_GetPageCount());

+}

+extern void FPDF_TTFaceMapper_ReleaseDoc(CPDF_Document*);

+CPDF_Document::~CPDF_Document()

+{

+    if (m_pDocRender) {

+        CPDF_ModuleMgr::Get()->GetRenderModule()->DestroyDocData(m_pDocRender);

+    }

+    if (m_pDocPage) {

+        CPDF_ModuleMgr::Get()->GetPageModule()->ReleaseDoc(this);

+        CPDF_ModuleMgr::Get()->GetPageModule()->ClearStockFont(this);

+    }

+}

+#define		FX_MAX_PAGE_LEVEL			1024

+CPDF_Dictionary* CPDF_Document::_FindPDFPage(CPDF_Dictionary* pPages, int iPage, int nPagesToGo, int level)

+{

+    CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC("Kids"));

+    if (pKidList == NULL) {

+        if (nPagesToGo == 0) {

+            return pPages;

+        }

+        return NULL;

+    }

+    if (level >= FX_MAX_PAGE_LEVEL) {

+        return NULL;

+    }

+    int nKids = pKidList->GetCount();

+    for (int i = 0; i < nKids; i ++) {

+        CPDF_Dictionary* pKid = pKidList->GetDict(i);

+        if (pKid == NULL) {

+            nPagesToGo --;

+            continue;

+        }

+        if (pKid == pPages) {

+            continue;

+        }

+        if (!pKid->KeyExist(FX_BSTRC("Kids"))) {

+            if (nPagesToGo == 0) {

+                return pKid;

+            }

+            m_PageList.SetAt(iPage - nPagesToGo, pKid->GetObjNum());

+            nPagesToGo --;

+        } else {

+            int nPages = pKid->GetInteger(FX_BSTRC("Count"));

+            if (nPagesToGo < nPages) {

+                return _FindPDFPage(pKid, iPage, nPagesToGo, level + 1);

+            }

+            nPagesToGo -= nPages;

+        }

+    }

+    return NULL;

+}

+CPDF_Dictionary* CPDF_Document::GetPage(int iPage)

+{

+    if (iPage < 0 || iPage >= m_PageList.GetSize()) {

+        return NULL;

+    }

+    if (m_bLinearized && (iPage == (int)m_dwFirstPageNo)) {

+        CPDF_Object* pObj = GetIndirectObject(m_dwFirstPageObjNum);

+        if (pObj && pObj->GetType() == PDFOBJ_DICTIONARY) {

+            return (CPDF_Dictionary*)pObj;

+        }

+    }

+    int objnum = m_PageList.GetAt(iPage);

+    if (objnum) {

+        CPDF_Object* pObj = GetIndirectObject(objnum);

+        ASSERT(pObj->GetType() == PDFOBJ_DICTIONARY);

+        return (CPDF_Dictionary*)pObj;

+    }

+    CPDF_Dictionary* pRoot = GetRoot();

+    if (pRoot == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));

+    if (pPages == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pPage = _FindPDFPage(pPages, iPage, iPage, 0);

+    if (pPage == NULL) {

+        return NULL;

+    }

+    m_PageList.SetAt(iPage, pPage->GetObjNum());

+    return pPage;

+}

+int CPDF_Document::_FindPageIndex(CPDF_Dictionary* pNode, FX_DWORD& skip_count, FX_DWORD objnum, int& index, int level)

+{

+    if (pNode->KeyExist(FX_BSTRC("Kids"))) {

+        CPDF_Array* pKidList = pNode->GetArray(FX_BSTRC("Kids"));

+        if (pKidList == NULL) {

+            return -1;

+        }

+        if (level >= FX_MAX_PAGE_LEVEL) {

+            return -1;

+        }

+        FX_DWORD count = pNode->GetInteger(FX_BSTRC("Count"));

+        if (count <= skip_count) {

+            skip_count -= count;

+            index += count;

+            return -1;

+        }

+        if (count && count == pKidList->GetCount()) {

+            for (FX_DWORD i = 0; i < count; i ++) {

+                CPDF_Reference* pKid = (CPDF_Reference*)pKidList->GetElement(i);

+                if (pKid && pKid->GetType() == PDFOBJ_REFERENCE) {

+                    if (pKid->GetRefObjNum() == objnum) {

+                        m_PageList.SetAt(index + i, objnum);

+                        return index + i;

+                    }

+                }

+            }

+        }

+        for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {

+            CPDF_Dictionary* pKid = pKidList->GetDict(i);

+            if (pKid == NULL) {

+                continue;

+            }

+            if (pKid == pNode) {

+                continue;

+            }

+            int found_index = _FindPageIndex(pKid, skip_count, objnum, index, level + 1);

+            if (found_index >= 0) {

+                return found_index;

+            }

+        }

+    } else {

+        if (objnum == pNode->GetObjNum()) {

+            return index;

+        }

+        if (skip_count) {

+            skip_count--;

+        }

+        index ++;

+    }

+    return -1;

+}

+int CPDF_Document::GetPageIndex(FX_DWORD objnum)

+{

+    FX_DWORD nPages = m_PageList.GetSize();

+    FX_DWORD skip_count = 0;

+    FX_BOOL bSkipped = FALSE;

+    for (FX_DWORD i = 0; i < nPages; i ++) {

+        FX_DWORD objnum1 = m_PageList.GetAt(i);

+        if (objnum1 == objnum) {

+            return i;

+        }

+        if (!bSkipped && objnum1 == 0) {

+            skip_count = i;

+            bSkipped = TRUE;

+        }

+    }

+    CPDF_Dictionary* pRoot = GetRoot();

+    if (pRoot == NULL) {

+        return -1;

+    }

+    CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));

+    if (pPages == NULL) {

+        return -1;

+    }

+    int index = 0;

+    return _FindPageIndex(pPages, skip_count, objnum, index);

+}

+int CPDF_Document::GetPageCount() const

+{

+    return m_PageList.GetSize();

+}

+static int _CountPages(CPDF_Dictionary* pPages, int level)

+{

+    if (level > 128) {

+        return 0;

+    }

+    int count = pPages->GetInteger(FX_BSTRC("Count"));

+    if (count > 0 && count < FPDF_PAGE_MAX_NUM) {

+        return count;

+    }

+    CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC("Kids"));

+    if (pKidList == NULL) {

+        return 0;

+    }

+    count = 0;

+    for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {

+        CPDF_Dictionary* pKid = pKidList->GetDict(i);

+        if (pKid == NULL) {

+            continue;

+        }

+        if (!pKid->KeyExist(FX_BSTRC("Kids"))) {

+            count ++;

+        } else {

+            count += _CountPages(pKid, level + 1);

+        }

+    }

+    pPages->SetAtInteger(FX_BSTRC("Count"), count);

+    return count;

+}

+int CPDF_Document::_GetPageCount() const

+{

+    CPDF_Dictionary* pRoot = GetRoot();

+    if (pRoot == NULL) {

+        return 0;

+    }

+    CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));

+    if (pPages == NULL) {

+        return 0;

+    }

+    if (!pPages->KeyExist(FX_BSTRC("Kids"))) {

+        return 1;

+    }

+    return _CountPages(pPages, 0);

+}

+static FX_BOOL _EnumPages(CPDF_Dictionary* pPages, IPDF_EnumPageHandler* pHandler)

+{

+    CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC("Kids"));

+    if (pKidList == NULL) {

+        return pHandler->EnumPage(pPages);

+    }

+    for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {

+        CPDF_Dictionary* pKid = pKidList->GetDict(i);

+        if (pKid == NULL) {

+            continue;

+        }

+        if (!pKid->KeyExist(FX_BSTRC("Kids"))) {

+            if (!pHandler->EnumPage(pKid)) {

+                return FALSE;

+            }

+        } else {

+            return _EnumPages(pKid, pHandler);

+        }

+    }

+    return TRUE;

+}

+void CPDF_Document::EnumPages(IPDF_EnumPageHandler* pHandler)

+{

+    CPDF_Dictionary* pRoot = GetRoot();

+    if (pRoot == NULL) {

+        return;

+    }

+    CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));

+    if (pPages == NULL) {

+        return;

+    }

+    _EnumPages(pPages, pHandler);

+}

+FX_BOOL CPDF_Document::IsContentUsedElsewhere(FX_DWORD objnum, CPDF_Dictionary* pThisPageDict)

+{

+    for (int i = 0; i < m_PageList.GetSize(); i ++) {

+        CPDF_Dictionary* pPageDict = GetPage(i);

+        if (pPageDict == pThisPageDict) {

+            continue;

+        }

+        CPDF_Object* pContents = pPageDict->GetElement(FX_BSTRC("Contents"));

+        if (pContents == NULL) {

+            continue;

+        }

+        if (pContents->GetDirectType() == PDFOBJ_ARRAY) {

+            CPDF_Array* pArray = (CPDF_Array*)pContents->GetDirect();

+            for (FX_DWORD j = 0; j < pArray->GetCount(); j ++) {

+                CPDF_Reference* pRef = (CPDF_Reference*)pArray->GetElement(j);

+                if (pRef->GetRefObjNum() == objnum) {

+                    return TRUE;

+                }

+            }

+        } else if (pContents->GetObjNum() == objnum) {

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_DWORD CPDF_Document::GetUserPermissions(FX_BOOL bCheckRevision) const

+{

+    if (m_pParser == NULL) {

+        return (FX_DWORD) - 1;

+    }

+    return m_pParser->GetPermissions(bCheckRevision);

+}

+FX_BOOL CPDF_Document::IsOwner() const

+{

+    if (m_pParser == NULL) {

+        return TRUE;

+    }

+    return m_pParser->IsOwner();

+}

+FX_BOOL CPDF_Document::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const

+{

+    {

+        CPDF_Object* pObj;

+        if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pObj)) {

+            bForm = pObj->GetType() == PDFOBJ_STREAM &&

+                    ((CPDF_Stream*)pObj)->GetDict()->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Form");

+            return TRUE;

+        }

+    }

+    if (m_pParser == NULL) {

+        bForm = FALSE;

+        return TRUE;

+    }

+    return m_pParser->IsFormStream(objnum, bForm);

+}

+void CPDF_Document::ClearPageData()

+{

+    if (m_pDocPage) {

+        CPDF_ModuleMgr::Get()->GetPageModule()->ClearDoc(this);

+    }

+}

+void CPDF_Document::ClearRenderData()

+{

+    if (m_pDocRender) {

+        CPDF_ModuleMgr::Get()->GetRenderModule()->ClearDocData(m_pDocRender);

+    }

+}

diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp
new file mode 100644
index 0000000..d1f1a24
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp
@@ -0,0 +1,957 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include <time.h>

+#include "../../../include/fpdfapi/fpdf_parser.h"

+#include "../../../include/fdrm/fx_crypt.h"

+const FX_BYTE defpasscode[32] = {

+    0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,

+    0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08,

+    0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,

+    0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a

+};

+void CalcEncryptKey(CPDF_Dictionary* pEncrypt, FX_LPCBYTE password, FX_DWORD pass_size,

+                    FX_LPBYTE key, int keylen, FX_BOOL bIgnoreMeta, CPDF_Array* pIdArray)

+{

+    int revision = pEncrypt->GetInteger(FX_BSTRC("R"));

+    FX_BYTE passcode[32];

+    for (FX_DWORD i = 0; i < 32; i ++) {

+        passcode[i] = i < pass_size ? password[i] : defpasscode[i - pass_size];

+    }

+    FX_BYTE md5[100];

+    CRYPT_MD5Start(md5);

+    CRYPT_MD5Update(md5, passcode, 32);

+    CFX_ByteString okey = pEncrypt->GetString(FX_BSTRC("O"));

+    CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)okey, okey.GetLength());

+    FX_DWORD perm = pEncrypt->GetInteger(FX_BSTRC("P"));

+    CRYPT_MD5Update(md5, (FX_LPBYTE)&perm, 4);

+    if (pIdArray) {

+        CFX_ByteString id = pIdArray->GetString(0);

+        CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());

+    }

+    if (!bIgnoreMeta && revision >= 3 && !pEncrypt->GetInteger(FX_BSTRC("EncryptMetadata"), 1)) {

+        FX_DWORD tag = (FX_DWORD) - 1;

+        CRYPT_MD5Update(md5, (FX_LPBYTE)&tag, 4);

+    }

+    FX_BYTE digest[16];

+    CRYPT_MD5Finish(md5, digest);

+    FX_DWORD copy_len = keylen;

+    if (copy_len > sizeof(digest)) {

+        copy_len = sizeof(digest);

+    }

+    if (revision >= 3) {

+        for (int i = 0; i < 50; i ++) {

+            CRYPT_MD5Generate(digest, copy_len, digest);

+        }

+    }

+    FXSYS_memset32(key, 0, keylen);

+    FXSYS_memcpy32(key, digest, copy_len);

+}

+CPDF_CryptoHandler* CPDF_StandardSecurityHandler::CreateCryptoHandler()

+{

+    return FX_NEW CPDF_StandardCryptoHandler;

+}

+typedef struct _PDF_CRYPTOITEM : public CFX_Object {

+    FX_INT32	m_Cipher;

+    FX_INT32	m_KeyLen;

+    FX_BOOL		m_bChecked;

+    CPDF_StandardCryptoHandler*	m_pCryptoHandler;

+} PDF_CRYPTOITEM;

+CPDF_StandardSecurityHandler::CPDF_StandardSecurityHandler()

+{

+    m_Version = 0;

+    m_Revision = 0;

+    m_pParser = NULL;

+    m_pEncryptDict = NULL;

+    m_bOwner = FALSE;

+    m_Permissions = 0;

+    m_Cipher = FXCIPHER_NONE;

+    m_KeyLen = 0;

+}

+CPDF_StandardSecurityHandler::~CPDF_StandardSecurityHandler()

+{

+}

+FX_BOOL CPDF_StandardSecurityHandler::OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict)

+{

+    m_pParser = pParser;

+    if (!LoadDict(pEncryptDict)) {

+        return FALSE;

+    }

+    if (m_Cipher == FXCIPHER_NONE) {

+        return TRUE;

+    }

+    return CheckSecurity(m_KeyLen);

+}

+FX_BOOL CPDF_StandardSecurityHandler::CheckSecurity(FX_INT32 key_len)

+{

+    CFX_ByteString password = m_pParser->GetPassword();

+    if (CheckPassword(password, password.GetLength(), TRUE, m_EncryptKey, key_len)) {

+        if (password.IsEmpty()) {

+            if (!CheckPassword(password, password.GetLength(), FALSE, m_EncryptKey, key_len)) {

+                return FALSE;

+            }

+        }

+        m_bOwner = TRUE;

+        return TRUE;

+    }

+    return CheckPassword(password, password.GetLength(), FALSE, m_EncryptKey, key_len);

+}

+FX_DWORD CPDF_StandardSecurityHandler::GetPermissions()

+{

+    return m_Permissions;

+}

+static FX_BOOL _LoadCryptInfo(CPDF_Dictionary* pEncryptDict, FX_BSTR name, int& cipher, int& keylen)

+{

+    int Version = pEncryptDict->GetInteger(FX_BSTRC("V"));

+    int Revision = pEncryptDict->GetInteger(FX_BSTRC("R"));

+    cipher = FXCIPHER_RC4;

+    keylen = 0;

+    if (Version >= 4) {

+        CPDF_Dictionary* pCryptFilters = pEncryptDict->GetDict(FX_BSTRC("CF"));

+        if (pCryptFilters == NULL) {

+            return FALSE;

+        }

+        if (name == FX_BSTRC("Identity")) {

+            cipher = FXCIPHER_NONE;

+        } else {

+            CPDF_Dictionary* pDefFilter = pCryptFilters->GetDict(name);

+            if (pDefFilter == NULL) {

+                return FALSE;

+            }

+            int nKeyBits = 0;

+            if (Version == 4) {

+                nKeyBits = pDefFilter->GetInteger(FX_BSTRC("Length"), 0);

+                if (nKeyBits == 0) {

+                    nKeyBits = pEncryptDict->GetInteger(FX_BSTRC("Length"), 128);

+                }

+            } else {

+                nKeyBits = pEncryptDict->GetInteger(FX_BSTRC("Length"), 256);

+            }

+            if (nKeyBits < 40) {

+                nKeyBits *= 8;

+            }

+            keylen = nKeyBits / 8;

+            CFX_ByteString cipher_name = pDefFilter->GetString(FX_BSTRC("CFM"));

+            if (cipher_name == FX_BSTRC("AESV2") || cipher_name == FX_BSTRC("AESV3")) {

+                cipher = FXCIPHER_AES;

+            }

+        }

+    } else {

+        keylen = Version > 1 ? pEncryptDict->GetInteger(FX_BSTRC("Length"), 40) / 8 : 5;

+    }

+    if (keylen > 32 || keylen < 0) {

+        return FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict)

+{

+    m_pEncryptDict = pEncryptDict;

+    m_bOwner = FALSE;

+    m_Version = pEncryptDict->GetInteger(FX_BSTRC("V"));

+    m_Revision = pEncryptDict->GetInteger(FX_BSTRC("R"));

+    m_Permissions = pEncryptDict->GetInteger(FX_BSTRC("P"), -1);

+    if (m_Version < 4) {

+        return _LoadCryptInfo(pEncryptDict, CFX_ByteString(), m_Cipher, m_KeyLen);

+    }

+    CFX_ByteString stmf_name = pEncryptDict->GetString(FX_BSTRC("StmF"));

+    CFX_ByteString strf_name = pEncryptDict->GetString(FX_BSTRC("StrF"));

+    if (stmf_name != strf_name) {

+        return FALSE;

+    }

+    if (!_LoadCryptInfo(pEncryptDict, strf_name, m_Cipher, m_KeyLen)) {

+        return FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict, FX_DWORD type, int& cipher, int& key_len)

+{

+    m_pEncryptDict = pEncryptDict;

+    m_bOwner = FALSE;

+    m_Version = pEncryptDict->GetInteger(FX_BSTRC("V"));

+    m_Revision = pEncryptDict->GetInteger(FX_BSTRC("R"));

+    m_Permissions = pEncryptDict->GetInteger(FX_BSTRC("P"), -1);

+    CFX_ByteString strf_name, stmf_name;

+    if (m_Version >= 4) {

+        stmf_name = pEncryptDict->GetString(FX_BSTRC("StmF"));

+        strf_name = pEncryptDict->GetString(FX_BSTRC("StrF"));

+        if (stmf_name != strf_name) {

+            return FALSE;

+        }

+    }

+    if (!_LoadCryptInfo(pEncryptDict, strf_name, cipher, key_len)) {

+        return FALSE;

+    }

+    m_Cipher = cipher;

+    m_KeyLen = key_len;

+    return TRUE;

+    return TRUE;

+}

+FX_BOOL CPDF_StandardSecurityHandler::GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen)

+{

+    cipher = m_Cipher;

+    buffer = m_EncryptKey;

+    keylen = m_KeyLen;

+    return TRUE;

+}

+#define FX_GET_32WORD(n,b,i)								\

+    {														\

+        (n) = (FX_DWORD)(( (FX_UINT64) (b)[(i)] << 24 )			\

+                         | ( (FX_UINT64) (b)[(i) + 1] << 16 )					\

+                         | ( (FX_UINT64) (b)[(i) + 2] <<  8 )					\

+                         | ( (FX_UINT64) (b)[(i) + 3]       ));					\

+    }

+int BigOrder64BitsMod3(FX_LPBYTE data)

+{

+    FX_UINT64 ret = 0;

+    for (int i = 0; i < 4; ++i) {

+        FX_DWORD value;

+        FX_GET_32WORD(value, data, 4 * i);

+        ret <<= 32;

+        ret |= value;

+        ret %= 3;

+    }

+    return (int)ret;

+}

+void Revision6_Hash(FX_LPCBYTE password, FX_DWORD size, FX_LPCBYTE salt, FX_LPCBYTE vector, FX_LPBYTE hash)

+{

+    int iBlockSize = 32;

+    FX_BYTE sha[128];

+    CRYPT_SHA256Start(sha);

+    CRYPT_SHA256Update(sha, password, size);

+    CRYPT_SHA256Update(sha, salt, 8);

+    if (vector) {

+        CRYPT_SHA256Update(sha, vector, 48);

+    }

+    FX_BYTE digest[32];

+    CRYPT_SHA256Finish(sha, digest);

+    CFX_ByteTextBuf buf;

+    FX_LPBYTE input = digest;

+    FX_LPBYTE key = input;

+    FX_LPBYTE iv = input + 16;

+    FX_LPBYTE E = buf.GetBuffer();

+    int iBufLen = buf.GetLength();

+    CFX_ByteTextBuf interDigest;

+    int i = 0;

+    FX_LPBYTE aes = FX_Alloc(FX_BYTE, 2048);

+    while (i < 64 || i < E[iBufLen - 1]  + 32) {

+        int iRoundSize = size + iBlockSize;

+        if (vector) {

+            iRoundSize += 48;

+        }

+        iBufLen = iRoundSize * 64;

+        buf.EstimateSize(iBufLen);

+        E = buf.GetBuffer();

+        CFX_ByteTextBuf content;

+        for (int j = 0; j < 64; ++j) {

+            content.AppendBlock(password, size);

+            content.AppendBlock(input, iBlockSize);

+            if (vector) {

+                content.AppendBlock(vector, 48);

+            }

+        }

+        CRYPT_AESSetKey(aes, 16, key, 16, TRUE);

+        CRYPT_AESSetIV(aes, iv);

+        CRYPT_AESEncrypt(aes, E, content.GetBuffer(), iBufLen);

+        int iHash = 0;

+        switch (BigOrder64BitsMod3(E)) {

+            case 0:

+                iHash = 0;

+                iBlockSize = 32;

+                break;

+            case 1:

+                iHash = 1;

+                iBlockSize = 48;

+                break;

+            default:

+                iHash = 2;

+                iBlockSize = 64;

+                break;

+        }

+        interDigest.EstimateSize(iBlockSize);

+        input = interDigest.GetBuffer();

+        if (iHash == 0) {

+            CRYPT_SHA256Generate(E, iBufLen, input);

+        } else if (iHash == 1) {

+            CRYPT_SHA384Generate(E, iBufLen, input);

+        } else if (iHash == 2) {

+            CRYPT_SHA512Generate(E, iBufLen, input);

+        }

+        key = input;

+        iv = input + 16;

+        ++i;

+    }

+    FX_Free(aes);

+    if (hash) {

+        FXSYS_memcpy32(hash, input, 32);

+    }

+}

+FX_BOOL CPDF_StandardSecurityHandler::AES256_CheckPassword(FX_LPCBYTE password, FX_DWORD size,

+        FX_BOOL bOwner, FX_LPBYTE key)

+{

+    CFX_ByteString okey = m_pEncryptDict->GetString(FX_BSTRC("O"));

+    if (okey.GetLength() < 48) {

+        return FALSE;

+    }

+    CFX_ByteString ukey = m_pEncryptDict->GetString(FX_BSTRC("U"));

+    if (ukey.GetLength() < 48) {

+        return FALSE;

+    }

+    FX_LPCBYTE pkey = bOwner ? (FX_LPCBYTE)okey : (FX_LPCBYTE)ukey;

+    FX_BYTE sha[128];

+    FX_BYTE digest[32];

+    if (m_Revision >= 6) {

+        Revision6_Hash(password, size, (FX_LPCBYTE)pkey + 32, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest);

+    } else {

+        CRYPT_SHA256Start(sha);

+        CRYPT_SHA256Update(sha, password, size);

+        CRYPT_SHA256Update(sha, pkey + 32, 8);

+        if (bOwner) {

+            CRYPT_SHA256Update(sha, ukey, 48);

+        }

+        CRYPT_SHA256Finish(sha, digest);

+    }

+    if (FXSYS_memcmp32(digest, pkey, 32) != 0) {

+        return FALSE;

+    }

+    if (key == NULL) {

+        return TRUE;

+    }

+    if (m_Revision >= 6) {

+        Revision6_Hash(password, size, (FX_LPCBYTE)pkey + 40, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest);

+    } else {

+        CRYPT_SHA256Start(sha);

+        CRYPT_SHA256Update(sha, password, size);

+        CRYPT_SHA256Update(sha, pkey + 40, 8);

+        if (bOwner) {

+            CRYPT_SHA256Update(sha, ukey, 48);

+        }

+        CRYPT_SHA256Finish(sha, digest);

+    }

+    CFX_ByteString ekey = m_pEncryptDict->GetString(bOwner ? FX_BSTRC("OE") : FX_BSTRC("UE"));

+    if (ekey.GetLength() < 32) {

+        return FALSE;

+    }

+    FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);

+    CRYPT_AESSetKey(aes, 16, digest, 32, FALSE);

+    FX_BYTE iv[16];

+    FXSYS_memset32(iv, 0, 16);

+    CRYPT_AESSetIV(aes, iv);

+    CRYPT_AESDecrypt(aes, key, ekey, 32);

+    CRYPT_AESSetKey(aes, 16, key, 32, FALSE);

+    CRYPT_AESSetIV(aes, iv);

+    CFX_ByteString perms = m_pEncryptDict->GetString(FX_BSTRC("Perms"));

+    if (perms.IsEmpty()) {

+        return FALSE;

+    }

+    FX_BYTE perms_buf[16];

+    FXSYS_memset32(perms_buf, 0, sizeof(perms_buf));

+    FX_DWORD copy_len = sizeof(perms_buf);

+    if (copy_len > (FX_DWORD)perms.GetLength()) {

+        copy_len = perms.GetLength();

+    }

+    FXSYS_memcpy32(perms_buf, (FX_LPCBYTE)perms, copy_len);

+    FX_BYTE buf[16];

+    CRYPT_AESDecrypt(aes, buf, perms_buf, 16);

+    FX_Free(aes);

+    if (buf[9] != 'a' || buf[10] != 'd' || buf[11] != 'b') {

+        return FALSE;

+    }

+    if (FXDWORD_GET_LSBFIRST(buf) != m_Permissions) {

+        return FALSE;

+    }

+    if ((buf[8] == 'T' && !IsMetadataEncrypted()) || (buf[8] == 'F' && IsMetadataEncrypted())) {

+        return FALSE;

+    }

+    return TRUE;

+}

+int CPDF_StandardSecurityHandler::CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key)

+{

+    return CheckPassword(password, pass_size, bOwner, key, m_KeyLen);

+}

+int CPDF_StandardSecurityHandler::CheckPassword(FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPBYTE key, FX_INT32 key_len)

+{

+    if (m_Revision >= 5) {

+        return AES256_CheckPassword(password, size, bOwner, key);

+    }

+    FX_BYTE keybuf[32];

+    if (key == NULL) {

+        key = keybuf;

+    }

+    if (bOwner) {

+        return CheckOwnerPassword(password, size, key, key_len);

+    }

+    return CheckUserPassword(password, size, FALSE, key, key_len) || CheckUserPassword(password, size, TRUE, key, key_len);

+}

+FX_BOOL CPDF_StandardSecurityHandler::CheckUserPassword(FX_LPCBYTE password, FX_DWORD pass_size,

+        FX_BOOL bIgnoreEncryptMeta, FX_LPBYTE key, FX_INT32 key_len)

+{

+    CalcEncryptKey(m_pEncryptDict, password, pass_size, key, key_len, bIgnoreEncryptMeta,

+                   m_pParser->GetIDArray());

+    CFX_ByteString ukey = m_pEncryptDict->GetString(FX_BSTRC("U"));

+    if (ukey.GetLength() < 16) {

+        return FALSE;

+    }

+    FX_BYTE ukeybuf[32];

+    if (m_Revision == 2) {

+        FXSYS_memcpy32(ukeybuf, defpasscode, 32);

+        CRYPT_ArcFourCryptBlock(ukeybuf, 32, key, key_len);

+    } else {

+        FX_BYTE test[32], tmpkey[32];

+        FX_DWORD copy_len = sizeof(test);

+        if (copy_len > (FX_DWORD)ukey.GetLength()) {

+            copy_len = ukey.GetLength();

+        }

+        FXSYS_memset32(test, 0, sizeof(test));

+        FXSYS_memcpy32(test, (FX_LPCSTR)ukey, copy_len);

+        for (int i = 19; i >= 0; i --) {

+            for (int j = 0; j < key_len; j ++) {

+                tmpkey[j] = key[j] ^ i;

+            }

+            CRYPT_ArcFourCryptBlock(test, 32, tmpkey, key_len);

+        }

+        FX_BYTE md5[100];

+        CRYPT_MD5Start(md5);

+        CRYPT_MD5Update(md5, defpasscode, 32);

+        CPDF_Array* pIdArray = m_pParser->GetIDArray();

+        if (pIdArray) {

+            CFX_ByteString id = pIdArray->GetString(0);

+            CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());

+        }

+        CRYPT_MD5Finish(md5, ukeybuf);

+        return FXSYS_memcmp32(test, ukeybuf, 16) == 0;

+    }

+    if (FXSYS_memcmp32((FX_LPVOID)(FX_LPCSTR)ukey, ukeybuf, 16) == 0) {

+        return TRUE;

+    }

+    return FALSE;

+}

+CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size)

+{

+    return GetUserPassword(owner_pass, pass_size, m_KeyLen);

+}

+CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size, FX_INT32 key_len)

+{

+    CFX_ByteString okey = m_pEncryptDict->GetString(FX_BSTRC("O"));

+    FX_BYTE passcode[32];

+    FX_DWORD i;

+    for (i = 0; i < 32; i ++) {

+        passcode[i] = i < pass_size ? owner_pass[i] : defpasscode[i - pass_size];

+    }

+    FX_BYTE digest[16];

+    CRYPT_MD5Generate(passcode, 32, digest);

+    if (m_Revision >= 3) {

+        for (int i = 0; i < 50; i ++) {

+            CRYPT_MD5Generate(digest, 16, digest);

+        }

+    }

+    FX_BYTE enckey[32];

+    FXSYS_memset32(enckey, 0, sizeof(enckey));

+    FX_DWORD copy_len = key_len;

+    if (copy_len > sizeof(digest)) {

+        copy_len = sizeof(digest);

+    }

+    FXSYS_memcpy32(enckey, digest, copy_len);

+    int okeylen = okey.GetLength();

+    if (okeylen > 32) {

+        okeylen = 32;

+    }

+    FX_BYTE okeybuf[64];

+    FXSYS_memcpy32(okeybuf, (FX_LPCSTR)okey, okeylen);

+    if (m_Revision == 2) {

+        CRYPT_ArcFourCryptBlock(okeybuf, okeylen, enckey, key_len);

+    } else {

+        for (int i = 19; i >= 0; i --) {

+            FX_BYTE tempkey[32];

+            for (int j = 0; j < m_KeyLen; j ++) {

+                tempkey[j] = enckey[j] ^ i;

+            }

+            CRYPT_ArcFourCryptBlock(okeybuf, okeylen, tempkey, key_len);

+        }

+    }

+    int len = 32;

+    while (len && defpasscode[len - 1] == okeybuf[len - 1]) {

+        len --;

+    }

+    return CFX_ByteString(okeybuf, len);

+}

+FX_BOOL CPDF_StandardSecurityHandler::CheckOwnerPassword(FX_LPCBYTE password, FX_DWORD pass_size,

+        FX_LPBYTE key, FX_INT32 key_len)

+{

+    CFX_ByteString user_pass = GetUserPassword(password, pass_size, key_len);

+    if (CheckUserPassword(user_pass, user_pass.GetLength(), FALSE, key, key_len)) {

+        return TRUE;

+    }

+    return CheckUserPassword(user_pass, user_pass.GetLength(), TRUE, key, key_len);

+}

+FX_BOOL CPDF_StandardSecurityHandler::IsMetadataEncrypted()

+{

+    return m_pEncryptDict->GetBoolean(FX_BSTRC("EncryptMetadata"), TRUE);

+}

+CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler()

+{

+    return FX_NEW CPDF_StandardSecurityHandler;

+}

+void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,

+        FX_LPCBYTE user_pass, FX_DWORD user_size,

+        FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_BOOL bDefault, FX_DWORD type)

+{

+    int cipher = 0, key_len = 0;

+    if (!LoadDict(pEncryptDict, type, cipher, key_len)) {

+        return;

+    }

+    if (bDefault && (owner_pass == NULL || owner_size == 0)) {

+        owner_pass = user_pass;

+        owner_size = user_size;

+    }

+    if (m_Revision >= 5) {

+        int t = (int)time(NULL);

+        FX_BYTE sha[128];

+        CRYPT_SHA256Start(sha);

+        CRYPT_SHA256Update(sha, (FX_BYTE*)&t, sizeof t);

+        CRYPT_SHA256Update(sha, m_EncryptKey, 32);

+        CRYPT_SHA256Update(sha, (FX_BYTE*)"there", 5);

+        CRYPT_SHA256Finish(sha, m_EncryptKey);

+        AES256_SetPassword(pEncryptDict, user_pass, user_size, FALSE, m_EncryptKey);

+        if (bDefault) {

+            AES256_SetPassword(pEncryptDict, owner_pass, owner_size, TRUE, m_EncryptKey);

+            AES256_SetPerms(pEncryptDict, m_Permissions, pEncryptDict->GetBoolean(FX_BSTRC("EncryptMetadata"), TRUE), m_EncryptKey);

+        }

+        return;

+    }

+    if (bDefault) {

+        FX_BYTE passcode[32];

+        FX_DWORD i;

+        for (i = 0; i < 32; i ++) {

+            passcode[i] = i < owner_size ? owner_pass[i] : defpasscode[i - owner_size];

+        }

+        FX_BYTE digest[16];

+        CRYPT_MD5Generate(passcode, 32, digest);

+        if (m_Revision >= 3) {

+            for (int i = 0; i < 50; i ++) {

+                CRYPT_MD5Generate(digest, 16, digest);

+            }

+        }

+        FX_BYTE enckey[32];

+        FXSYS_memcpy32(enckey, digest, key_len);

+        for (i = 0; i < 32; i ++) {

+            passcode[i] = i < user_size ? user_pass[i] : defpasscode[i - user_size];

+        }

+        CRYPT_ArcFourCryptBlock(passcode, 32, enckey, key_len);

+        FX_BYTE tempkey[32];

+        if (m_Revision >= 3) {

+            for (i = 1; i <= 19; i ++) {

+                for (int j = 0; j < key_len; j ++) {

+                    tempkey[j] = enckey[j] ^ (FX_BYTE)i;

+                }

+                CRYPT_ArcFourCryptBlock(passcode, 32, tempkey, key_len);

+            }

+        }

+        pEncryptDict->SetAtString(FX_BSTRC("O"), CFX_ByteString(passcode, 32));

+    }

+    CalcEncryptKey(m_pEncryptDict, (FX_LPBYTE)user_pass, user_size, m_EncryptKey, key_len, FALSE, pIdArray);

+    if (m_Revision < 3) {

+        FX_BYTE tempbuf[32];

+        FXSYS_memcpy32(tempbuf, defpasscode, 32);

+        CRYPT_ArcFourCryptBlock(tempbuf, 32, m_EncryptKey, key_len);

+        pEncryptDict->SetAtString(FX_BSTRC("U"), CFX_ByteString(tempbuf, 32));

+    } else {

+        FX_BYTE md5[100];

+        CRYPT_MD5Start(md5);

+        CRYPT_MD5Update(md5, defpasscode, 32);

+        if (pIdArray) {

+            CFX_ByteString id = pIdArray->GetString(0);

+            CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());

+        }

+        FX_BYTE digest[32];

+        CRYPT_MD5Finish(md5, digest);

+        CRYPT_ArcFourCryptBlock(digest, 16, m_EncryptKey, key_len);

+        FX_BYTE tempkey[32];

+        for (int i = 1; i <= 19; i ++) {

+            for (int j = 0; j < key_len; j ++) {

+                tempkey[j] = m_EncryptKey[j] ^ (FX_BYTE)i;

+            }

+            CRYPT_ArcFourCryptBlock(digest, 16, tempkey, key_len);

+        }

+        CRYPT_MD5Generate(digest, 16, digest + 16);

+        pEncryptDict->SetAtString(FX_BSTRC("U"), CFX_ByteString(digest, 32));

+    }

+}

+void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,

+        FX_LPCBYTE user_pass, FX_DWORD user_size,

+        FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_DWORD type)

+{

+    OnCreate(pEncryptDict, pIdArray, user_pass, user_size, owner_pass, owner_size, TRUE, type);

+}

+void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray, FX_LPCBYTE user_pass, FX_DWORD user_size, FX_DWORD type)

+{

+    OnCreate(pEncryptDict, pIdArray, user_pass, user_size, NULL, 0, FALSE, type);

+}

+void CPDF_StandardSecurityHandler::AES256_SetPassword(CPDF_Dictionary* pEncryptDict, FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPCBYTE key)

+{

+    FX_BYTE sha[128];

+    CRYPT_SHA1Start(sha);

+    CRYPT_SHA1Update(sha, key, 32);

+    CRYPT_SHA1Update(sha, (FX_BYTE*)"hello", 5);

+    FX_BYTE digest[20];

+    CRYPT_SHA1Finish(sha, digest);

+    CFX_ByteString ukey = pEncryptDict->GetString(FX_BSTRC("U"));

+    FX_BYTE digest1[48];

+    if (m_Revision >= 6) {

+        Revision6_Hash(password, size, digest, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest1);

+    } else {

+        CRYPT_SHA256Start(sha);

+        CRYPT_SHA256Update(sha, password, size);

+        CRYPT_SHA256Update(sha, digest, 8);

+        if (bOwner) {

+            CRYPT_SHA256Update(sha, ukey, ukey.GetLength());

+        }

+        CRYPT_SHA256Finish(sha, digest1);

+    }

+    FXSYS_memcpy32(digest1 + 32, digest, 16);

+    pEncryptDict->SetAtString(bOwner ? FX_BSTRC("O") : FX_BSTRC("U"), CFX_ByteString(digest1, 48));

+    if (m_Revision >= 6) {

+        Revision6_Hash(password, size, digest + 8, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest1);

+    } else {

+        CRYPT_SHA256Start(sha);

+        CRYPT_SHA256Update(sha, password, size);

+        CRYPT_SHA256Update(sha, digest + 8, 8);

+        if (bOwner) {

+            CRYPT_SHA256Update(sha, ukey, ukey.GetLength());

+        }

+        CRYPT_SHA256Finish(sha, digest1);

+    }

+    FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);

+    CRYPT_AESSetKey(aes, 16, digest1, 32, TRUE);

+    FX_BYTE iv[16];

+    FXSYS_memset32(iv, 0, 16);

+    CRYPT_AESSetIV(aes, iv);

+    CRYPT_AESEncrypt(aes, digest1, key, 32);

+    FX_Free(aes);

+    pEncryptDict->SetAtString(bOwner ? FX_BSTRC("OE") : FX_BSTRC("UE"), CFX_ByteString(digest1, 32));

+}

+void CPDF_StandardSecurityHandler::AES256_SetPerms(CPDF_Dictionary* pEncryptDict, FX_DWORD permissions,

+        FX_BOOL bEncryptMetadata, FX_LPCBYTE key)

+{

+    FX_BYTE buf[16];

+    buf[0] = (FX_BYTE)permissions;

+    buf[1] = (FX_BYTE)(permissions >> 8);

+    buf[2] = (FX_BYTE)(permissions >> 16);

+    buf[3] = (FX_BYTE)(permissions >> 24);

+    buf[4] = 0xff;

+    buf[5] = 0xff;

+    buf[6] = 0xff;

+    buf[7] = 0xff;

+    buf[8] = bEncryptMetadata ? 'T' : 'F';

+    buf[9] = 'a';

+    buf[10] = 'd';

+    buf[11] = 'b';

+    FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);

+    CRYPT_AESSetKey(aes, 16, key, 32, TRUE);

+    FX_BYTE iv[16], buf1[16];

+    FXSYS_memset32(iv, 0, 16);

+    CRYPT_AESSetIV(aes, iv);

+    CRYPT_AESEncrypt(aes, buf1, buf, 16);

+    FX_Free(aes);

+    pEncryptDict->SetAtString(FX_BSTRC("Perms"), CFX_ByteString(buf1, 16));

+}

+void CPDF_StandardCryptoHandler::CryptBlock(FX_BOOL bEncrypt, FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,

+        FX_LPBYTE dest_buf, FX_DWORD& dest_size)

+{

+    if (m_Cipher == FXCIPHER_NONE) {

+        FXSYS_memcpy32(dest_buf, src_buf, src_size);

+        return;

+    }

+    FX_BYTE realkey[16];

+    int realkeylen = 16;

+    if (m_Cipher != FXCIPHER_AES || m_KeyLen != 32) {

+        FX_BYTE key1[32];

+        FXSYS_memcpy32(key1, m_EncryptKey, m_KeyLen);

+        key1[m_KeyLen + 0] = (FX_BYTE)objnum;

+        key1[m_KeyLen + 1] = (FX_BYTE)(objnum >> 8);

+        key1[m_KeyLen + 2] = (FX_BYTE)(objnum >> 16);

+        key1[m_KeyLen + 3] = (FX_BYTE)gennum;

+        key1[m_KeyLen + 4] = (FX_BYTE)(gennum >> 8);

+        FXSYS_memcpy32(key1 + m_KeyLen, &objnum, 3);

+        FXSYS_memcpy32(key1 + m_KeyLen + 3, &gennum, 2);

+        if (m_Cipher == FXCIPHER_AES) {

+            FXSYS_memcpy32(key1 + m_KeyLen + 5, "sAlT", 4);

+        }

+        CRYPT_MD5Generate(key1, m_Cipher == FXCIPHER_AES ? m_KeyLen + 9 : m_KeyLen + 5, realkey);

+        realkeylen = m_KeyLen + 5;

+        if (realkeylen > 16) {

+            realkeylen = 16;

+        }

+    }

+    if (m_Cipher == FXCIPHER_AES) {

+        CRYPT_AESSetKey(m_pAESContext, 16, m_KeyLen == 32 ? m_EncryptKey : realkey, m_KeyLen, bEncrypt);

+        if (bEncrypt) {

+            FX_BYTE iv[16];

+            for (int i = 0; i < 16; i ++) {

+                iv[i] = (FX_BYTE)rand();

+            }

+            CRYPT_AESSetIV(m_pAESContext, iv);

+            FXSYS_memcpy32(dest_buf, iv, 16);

+            int nblocks = src_size / 16;

+            CRYPT_AESEncrypt(m_pAESContext, dest_buf + 16, src_buf, nblocks * 16);

+            FX_BYTE padding[16];

+            FXSYS_memcpy32(padding, src_buf + nblocks * 16, src_size % 16);

+            FXSYS_memset8(padding + src_size % 16, 16 - src_size % 16, 16 - src_size % 16);

+            CRYPT_AESEncrypt(m_pAESContext, dest_buf + nblocks * 16 + 16, padding, 16);

+            dest_size = 32 + nblocks * 16;

+        } else {

+            CRYPT_AESSetIV(m_pAESContext, src_buf);

+            CRYPT_AESDecrypt(m_pAESContext, dest_buf, src_buf + 16, src_size - 16);

+            dest_size = src_size - 16;

+            dest_size -= dest_buf[dest_size - 1];

+        }

+    } else {

+        ASSERT(dest_size == src_size);

+        if (dest_buf != src_buf) {

+            FXSYS_memcpy32(dest_buf, src_buf, src_size);

+        }

+        CRYPT_ArcFourCryptBlock(dest_buf, dest_size, realkey, realkeylen);

+    }

+}

+typedef struct _AESCryptContext {

+    FX_BYTE		m_Context[2048];

+    FX_BOOL		m_bIV;

+    FX_BYTE		m_Block[16];

+    FX_DWORD	m_BlockOffset;

+} AESCryptContext;

+FX_LPVOID CPDF_StandardCryptoHandler::CryptStart(FX_DWORD objnum, FX_DWORD gennum, FX_BOOL bEncrypt)

+{

+    if (m_Cipher == FXCIPHER_NONE) {

+        return this;

+    }

+    if (m_Cipher == FXCIPHER_AES && m_KeyLen == 32) {

+        AESCryptContext* pContext = FX_Alloc(AESCryptContext, 1);

+        pContext->m_bIV = TRUE;

+        pContext->m_BlockOffset = 0;

+        CRYPT_AESSetKey(pContext->m_Context, 16, m_EncryptKey, 32, bEncrypt);

+        if (bEncrypt) {

+            for (int i = 0; i < 16; i ++) {

+                pContext->m_Block[i] = (FX_BYTE)rand();

+            }

+            CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);

+        }

+        return pContext;

+    }

+    FX_BYTE key1[48];

+    FXSYS_memcpy32(key1, m_EncryptKey, m_KeyLen);

+    FXSYS_memcpy32(key1 + m_KeyLen, &objnum, 3);

+    FXSYS_memcpy32(key1 + m_KeyLen + 3, &gennum, 2);

+    if (m_Cipher == FXCIPHER_AES) {

+        FXSYS_memcpy32(key1 + m_KeyLen + 5, "sAlT", 4);

+    }

+    FX_BYTE realkey[16];

+    CRYPT_MD5Generate(key1, m_Cipher == FXCIPHER_AES ? m_KeyLen + 9 : m_KeyLen + 5, realkey);

+    int realkeylen = m_KeyLen + 5;

+    if (realkeylen > 16) {

+        realkeylen = 16;

+    }

+    if (m_Cipher == FXCIPHER_AES) {

+        AESCryptContext* pContext = FX_Alloc(AESCryptContext, 1);

+        pContext->m_bIV = TRUE;

+        pContext->m_BlockOffset = 0;

+        CRYPT_AESSetKey(pContext->m_Context, 16, realkey, 16, bEncrypt);

+        if (bEncrypt) {

+            for (int i = 0; i < 16; i ++) {

+                pContext->m_Block[i] = (FX_BYTE)rand();

+            }

+            CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);

+        }

+        return pContext;

+    }

+    void* pContext = FX_Alloc(FX_BYTE, 1040);

+    CRYPT_ArcFourSetup(pContext, realkey, realkeylen);

+    return pContext;

+}

+FX_BOOL CPDF_StandardCryptoHandler::CryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt)

+{

+    if (!context) {

+        return FALSE;

+    }

+    if (m_Cipher == FXCIPHER_NONE) {

+        dest_buf.AppendBlock(src_buf, src_size);

+        return TRUE;

+    }

+    if (m_Cipher == FXCIPHER_RC4) {

+        int old_size = dest_buf.GetSize();

+        dest_buf.AppendBlock(src_buf, src_size);

+        CRYPT_ArcFourCrypt(context, dest_buf.GetBuffer() + old_size, src_size);

+        return TRUE;

+    }

+    AESCryptContext* pContext = (AESCryptContext*)context;

+    if (pContext->m_bIV && bEncrypt) {

+        dest_buf.AppendBlock(pContext->m_Block, 16);

+        pContext->m_bIV = FALSE;

+    }

+    FX_DWORD src_off = 0;

+    FX_DWORD src_left = src_size;

+    while (1) {

+        FX_DWORD copy_size = 16 - pContext->m_BlockOffset;

+        if (copy_size > src_left) {

+            copy_size = src_left;

+        }

+        FXSYS_memcpy32(pContext->m_Block + pContext->m_BlockOffset, src_buf + src_off, copy_size);

+        src_off += copy_size;

+        src_left -= copy_size;

+        pContext->m_BlockOffset += copy_size;

+        if (pContext->m_BlockOffset == 16) {

+            if (!bEncrypt && pContext->m_bIV) {

+                CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);

+                pContext->m_bIV = FALSE;

+                pContext->m_BlockOffset = 0;

+            } else if (src_off < src_size) {

+                FX_BYTE block_buf[16];

+                if (bEncrypt) {

+                    CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);

+                } else {

+                    CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);

+                }

+                dest_buf.AppendBlock(block_buf, 16);

+                pContext->m_BlockOffset = 0;

+            }

+        }

+        if (!src_left) {

+            break;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_StandardCryptoHandler::CryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt)

+{

+    if (!context) {

+        return FALSE;

+    }

+    if (m_Cipher == FXCIPHER_NONE) {

+        return TRUE;

+    }

+    if (m_Cipher == FXCIPHER_RC4) {

+        FX_Free(context);

+        return TRUE;

+    }

+    AESCryptContext* pContext = (AESCryptContext*)context;

+    if (bEncrypt) {

+        FX_BYTE block_buf[16];

+        if (pContext->m_BlockOffset == 16) {

+            CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);

+            dest_buf.AppendBlock(block_buf, 16);

+            pContext->m_BlockOffset = 0;

+        }

+        FXSYS_memset8(pContext->m_Block + pContext->m_BlockOffset, (FX_BYTE)(16 - pContext->m_BlockOffset), 16 - pContext->m_BlockOffset);

+        CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);

+        dest_buf.AppendBlock(block_buf, 16);

+    } else if (pContext->m_BlockOffset == 16) {

+        FX_BYTE block_buf[16];

+        CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);

+        if (block_buf[15] <= 16) {

+            dest_buf.AppendBlock(block_buf, 16 - block_buf[15]);

+        }

+    }

+    FX_Free(pContext);

+    return TRUE;

+}

+FX_LPVOID CPDF_StandardCryptoHandler::DecryptStart(FX_DWORD objnum, FX_DWORD gennum)

+{

+    return CryptStart(objnum, gennum, FALSE);

+}

+FX_DWORD CPDF_StandardCryptoHandler::DecryptGetSize(FX_DWORD src_size)

+{

+    return m_Cipher == FXCIPHER_AES ? src_size - 16 : src_size;

+}

+FX_BOOL CPDF_StandardCryptoHandler::Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler)

+{

+    FX_LPCBYTE key;

+    if (!pSecurityHandler->GetCryptInfo(m_Cipher, key, m_KeyLen)) {

+        return FALSE;

+    }

+    if (m_KeyLen > 32 || m_KeyLen < 0) {

+        return FALSE;

+    }

+    if (m_Cipher != FXCIPHER_NONE) {

+        FXSYS_memcpy32(m_EncryptKey, key, m_KeyLen);

+    }

+    if (m_Cipher == FXCIPHER_AES) {

+        m_pAESContext = FX_Alloc(FX_BYTE, 2048);

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_StandardCryptoHandler::Init(int cipher, FX_LPCBYTE key, int keylen)

+{

+    if (cipher == FXCIPHER_AES) {

+        switch(keylen) {

+            case 16:

+            case 24:

+            case 32:

+                break;

+            default:

+                return FALSE;

+        }

+    } else if (cipher == FXCIPHER_AES2) {

+        if (keylen != 32) {

+            return FALSE;

+        }

+    } else if (cipher == FXCIPHER_RC4) {

+        if (keylen < 5 || keylen > 16) {

+            return FALSE;

+        }

+    } else {

+        if (keylen > 32) {

+            keylen = 32;

+        }

+    }

+    m_Cipher = cipher;

+    m_KeyLen = keylen;

+    FXSYS_memcpy32(m_EncryptKey, key, keylen);

+    if (m_Cipher == FXCIPHER_AES) {

+        m_pAESContext = FX_Alloc(FX_BYTE, 2048);

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_StandardCryptoHandler::DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size,

+        CFX_BinaryBuf& dest_buf)

+{

+    return CryptStream(context, src_buf, src_size, dest_buf, FALSE);

+}

+FX_BOOL CPDF_StandardCryptoHandler::DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf)

+{

+    return CryptFinish(context, dest_buf, FALSE);

+}

+FX_DWORD CPDF_StandardCryptoHandler::EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size)

+{

+    if (m_Cipher == FXCIPHER_AES) {

+        return src_size + 32;

+    }

+    return src_size;

+}

+FX_BOOL CPDF_StandardCryptoHandler::EncryptContent(FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,

+        FX_LPBYTE dest_buf, FX_DWORD& dest_size)

+{

+    CryptBlock(TRUE, objnum, gennum, src_buf, src_size, dest_buf, dest_size);

+    return TRUE;

+}

+void CPDF_CryptoHandler::Decrypt(FX_DWORD objnum, FX_DWORD gennum, CFX_ByteString& str)

+{

+    CFX_BinaryBuf dest_buf;

+    FX_LPVOID context = DecryptStart(objnum, gennum);

+    DecryptStream(context, (FX_LPCBYTE)str, str.GetLength(), dest_buf);

+    DecryptFinish(context, dest_buf);

+    str = dest_buf;

+}

+CPDF_StandardCryptoHandler::CPDF_StandardCryptoHandler()

+{

+    m_pAESContext = NULL;

+    m_Cipher = FXCIPHER_NONE;

+    m_KeyLen = 0;

+}

+CPDF_StandardCryptoHandler::~CPDF_StandardCryptoHandler()

+{

+    if (m_pAESContext) {

+        FX_Free(m_pAESContext);

+    }

+}

diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp
new file mode 100644
index 0000000..22f9aa7
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp
@@ -0,0 +1,224 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_serial.h"

+CFDF_Document::CFDF_Document() : CPDF_IndirectObjects(NULL)

+{

+    m_pRootDict = NULL;

+    m_pFile = NULL;

+    m_bOwnFile = FALSE;

+}

+CFDF_Document::~CFDF_Document()

+{

+    if (m_bOwnFile && m_pFile) {

+        m_pFile->Release();

+    }

+}

+CFDF_Document* CFDF_Document::CreateNewDoc()

+{

+    CFDF_Document* pDoc = FX_NEW CFDF_Document;

+    pDoc->m_pRootDict = FX_NEW CPDF_Dictionary;

+    pDoc->AddIndirectObject(pDoc->m_pRootDict);

+    CPDF_Dictionary* pFDFDict = FX_NEW CPDF_Dictionary;

+    pDoc->m_pRootDict->SetAt(FX_BSTRC("FDF"), pFDFDict);

+    return pDoc;

+}

+CFDF_Document* CFDF_Document::ParseFile(FX_LPCSTR file_path)

+{

+    return CFDF_Document::ParseFile(FX_CreateFileRead(file_path), TRUE);

+}

+CFDF_Document* CFDF_Document::ParseFile(FX_LPCWSTR file_path)

+{

+    return CFDF_Document::ParseFile(FX_CreateFileRead(file_path), TRUE);

+}

+CFDF_Document* CFDF_Document::ParseFile(IFX_FileRead *pFile, FX_BOOL bOwnFile)

+{

+    if (!pFile) {

+        return NULL;

+    }

+    CFDF_Document* pDoc = FX_NEW CFDF_Document;

+    pDoc->ParseStream(pFile, bOwnFile);

+    if (pDoc->m_pRootDict == NULL) {

+        delete pDoc;

+        return NULL;

+    }

+    return pDoc;

+}

+CFDF_Document* CFDF_Document::ParseMemory(FX_LPCBYTE pData, FX_DWORD size)

+{

+    return CFDF_Document::ParseFile(FX_CreateMemoryStream((FX_LPBYTE)pData, size), TRUE);

+}

+void CFDF_Document::ParseStream(IFX_FileRead *pFile, FX_BOOL bOwnFile)

+{

+    m_pFile = pFile;

+    m_bOwnFile = bOwnFile;

+    CPDF_SyntaxParser parser;

+    parser.InitParser(m_pFile, 0);

+    while (1) {

+        FX_BOOL bNumber;

+        CFX_ByteString word = parser.GetNextWord(bNumber);

+        if (bNumber) {

+            FX_DWORD objnum = FXSYS_atoi(word);

+            word = parser.GetNextWord(bNumber);

+            if (!bNumber) {

+                break;

+            }

+            word = parser.GetNextWord(bNumber);

+            if (word != FX_BSTRC("obj")) {

+                break;

+            }

+            CPDF_Object* pObj = parser.GetObject(this, objnum, 0, FALSE);

+            if (pObj == NULL) {

+                break;

+            }

+            InsertIndirectObject(objnum, pObj);

+            word = parser.GetNextWord(bNumber);

+            if (word != FX_BSTRC("endobj")) {

+                break;

+            }

+        } else {

+            if (word != FX_BSTRC("trailer")) {

+                break;

+            }

+            CPDF_Dictionary* pMainDict = (CPDF_Dictionary*)parser.GetObject(this, 0, 0, 0);

+            if (pMainDict == NULL || pMainDict->GetType() != PDFOBJ_DICTIONARY) {

+                break;

+            }

+            m_pRootDict = pMainDict->GetDict(FX_BSTRC("Root"));

+            pMainDict->Release();

+            break;

+        }

+    }

+}

+FX_BOOL CFDF_Document::WriteBuf(CFX_ByteTextBuf& buf) const

+{

+    if (m_pRootDict == NULL) {

+        return FALSE;

+    }

+    buf << FX_BSTRC("%FDF-1.2\r\n");

+    FX_POSITION pos = m_IndirectObjs.GetStartPosition();

+    while(pos) {

+        size_t objnum;

+        CPDF_Object* pObj;

+        m_IndirectObjs.GetNextAssoc(pos, (FX_LPVOID&)objnum, (FX_LPVOID&)pObj);

+        buf << (FX_DWORD)objnum << FX_BSTRC(" 0 obj\r\n") << pObj << FX_BSTRC("\r\nendobj\r\n\r\n");

+    }

+    buf << FX_BSTRC("trailer\r\n<</Root ") << m_pRootDict->GetObjNum() << FX_BSTRC(" 0 R>>\r\n%%EOF\r\n");

+    return TRUE;

+}

+CFX_WideString CFDF_Document::GetWin32Path() const

+{

+    CPDF_Object* pFileSpec = m_pRootDict->GetDict(FX_BSTRC("FDF"))->GetElementValue(FX_BSTRC("F"));

+    if (pFileSpec == NULL) {

+        return CFX_WideString();

+    }

+    if (pFileSpec->GetType() == PDFOBJ_STRING) {

+        return FPDF_FileSpec_GetWin32Path(m_pRootDict->GetDict(FX_BSTRC("FDF")));

+    }

+    return FPDF_FileSpec_GetWin32Path(pFileSpec);

+}

+FX_BOOL CFDF_Document::WriteFile(FX_LPCSTR file_path) const

+{

+    IFX_FileWrite *pFile = FX_CreateFileWrite(file_path);

+    if (!pFile) {

+        return FALSE;

+    }

+    FX_BOOL bRet = WriteFile(pFile);

+    pFile->Release();

+    return bRet;

+}

+FX_BOOL CFDF_Document::WriteFile(FX_LPCWSTR file_path) const

+{

+    IFX_FileWrite *pFile = FX_CreateFileWrite(file_path);

+    if (!pFile) {

+        return FALSE;

+    }

+    FX_BOOL bRet = WriteFile(pFile);

+    pFile->Release();

+    return bRet;

+}

+FX_BOOL CFDF_Document::WriteFile(IFX_FileWrite *pFile) const

+{

+    CFX_ByteTextBuf buf;

+    WriteBuf(buf);

+    FX_BOOL bRet = pFile->WriteBlock(buf.GetBuffer(), buf.GetSize());

+    if (bRet) {

+        pFile->Flush();

+    }

+    return bRet;

+}

+static CFX_WideString ChangeSlash(FX_LPCWSTR str)

+{

+    CFX_WideString result;

+    while (*str) {

+        if (*str == '\\') {

+            result += '/';

+        } else if (*str == '/') {

+            result += '\\';

+        } else {

+            result += *str;

+        }

+        str ++;

+    }

+    return result;

+}

+void FPDF_FileSpec_SetWin32Path(CPDF_Object* pFileSpec, const CFX_WideString& filepath)

+{

+    CFX_WideString result;

+    if (filepath.GetLength() > 1 && filepath[1] == ':') {

+        result = L"/";

+        result += filepath[0];

+        if (filepath[2] != '\\') {

+            result += '/';

+        }

+        result += ChangeSlash((FX_LPCWSTR)filepath + 2);

+    } else if (filepath.GetLength() > 1 && filepath[0] == '\\' && filepath[1] == '\\') {

+        result = ChangeSlash((FX_LPCWSTR)filepath + 1);

+    } else {

+        result = ChangeSlash(filepath);

+    }

+    if (pFileSpec->GetType() == PDFOBJ_STRING) {

+        pFileSpec->SetString(CFX_ByteString::FromUnicode(result));

+    } else if (pFileSpec->GetType() == PDFOBJ_DICTIONARY) {

+        ((CPDF_Dictionary*)pFileSpec)->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(result));

+        ((CPDF_Dictionary*)pFileSpec)->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(result));

+        ((CPDF_Dictionary*)pFileSpec)->RemoveAt(FX_BSTRC("FS"));

+    }

+}

+CFX_WideString	FPDF_FileSpec_GetWin32Path(const CPDF_Object* pFileSpec)

+{

+    CFX_WideString wsFileName;

+    if (pFileSpec->GetType() == PDFOBJ_DICTIONARY) {

+        CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFileSpec;

+        wsFileName = pDict->GetUnicodeText(FX_BSTRC("UF"));

+        if (wsFileName.IsEmpty()) {

+            wsFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("F")));

+        }

+        if (pDict->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL")) {

+            return wsFileName;

+        }

+        if (wsFileName.IsEmpty() && pDict->KeyExist(FX_BSTRC("DOS"))) {

+            wsFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("DOS")));

+        }

+    } else {

+        wsFileName = CFX_WideString::FromLocal(pFileSpec->GetString());

+    }

+    if (wsFileName[0] != '/') {

+        return ChangeSlash(wsFileName);

+    }

+    if (wsFileName[2] == '/') {

+        CFX_WideString result;

+        result += wsFileName[1];

+        result += ':';

+        result += ChangeSlash(((FX_LPCWSTR)wsFileName) + 2);

+        return result;

+    } else {

+        CFX_WideString result;

+        result += '\\';

+        result += ChangeSlash(wsFileName);

+        return result;

+    }

+}

diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp
new file mode 100644
index 0000000..76a79f6
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp
@@ -0,0 +1,909 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../fx_zlib.h"

+#include "../../../include/fpdfapi/fpdf_parser.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "filters_int.h"

+CFX_DataFilter::CFX_DataFilter()

+{

+    m_bEOF = FALSE;

+    m_pDestFilter = NULL;

+    m_SrcPos = 0;

+}

+CFX_DataFilter::~CFX_DataFilter()

+{

+    if (m_pDestFilter) {

+        delete m_pDestFilter;

+    }

+}

+void CFX_DataFilter::SetDestFilter(CFX_DataFilter* pFilter)

+{

+    if (m_pDestFilter) {

+        m_pDestFilter->SetDestFilter(pFilter);

+    } else {

+        m_pDestFilter = pFilter;

+    }

+}

+void CFX_DataFilter::FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)

+{

+    if (m_bEOF) {

+        return;

+    }

+    m_SrcPos += src_size;

+    if (m_pDestFilter) {

+        CFX_BinaryBuf temp_buf;

+        temp_buf.EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE);

+        v_FilterIn(src_buf, src_size, temp_buf);

+        m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf);

+    } else {

+        v_FilterIn(src_buf, src_size, dest_buf);

+    }

+}

+void CFX_DataFilter::FilterFinish(CFX_BinaryBuf& dest_buf)

+{

+    if (m_pDestFilter) {

+        CFX_BinaryBuf temp_buf;

+        v_FilterFinish(temp_buf);

+        if (temp_buf.GetSize()) {

+            m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf);

+        }

+        m_pDestFilter->FilterFinish(dest_buf);

+    } else {

+        v_FilterFinish(dest_buf);

+    }

+    m_bEOF = TRUE;

+}

+void CFX_DataFilter::ReportEOF(FX_DWORD left_input)

+{

+    if (m_bEOF) {

+        return;

+    }

+    m_bEOF = TRUE;

+    m_SrcPos -= left_input;

+}

+CFX_DataFilter* FPDF_CreateFilter(FX_BSTR name, const CPDF_Dictionary* pParam, int width, int height)

+{

+    FX_DWORD id = name.GetID();

+    switch (id) {

+        case FXBSTR_ID('F', 'l', 'a', 't'):

+        case FXBSTR_ID('F', 'l', 0, 0):

+        case FXBSTR_ID('L', 'Z', 'W', 'D'):

+        case FXBSTR_ID('L', 'Z', 'W', 0): {

+                CFX_DataFilter* pFilter;

+                if (id == FXBSTR_ID('L', 'Z', 'W', 'D') || id == FXBSTR_ID('L', 'Z', 'W', 0)) {

+                    pFilter = FX_NEW CPDF_LzwFilter(pParam->GetInteger("EarlyChange", 1));

+                } else {

+                    pFilter = FX_NEW CPDF_FlateFilter;

+                }

+                if (pParam->GetInteger("Predictor", 1) > 1) {

+                    CFX_DataFilter* pPredictor = FX_NEW CPDF_PredictorFilter(pParam->GetInteger(FX_BSTRC("Predictor"), 1),

+                                                 pParam->GetInteger(FX_BSTRC("Colors"), 1), pParam->GetInteger(FX_BSTRC("BitsPerComponent"), 8),

+                                                 pParam->GetInteger(FX_BSTRC("Columns"), 1));

+                    pFilter->SetDestFilter(pPredictor);

+                }

+                return pFilter;

+            }

+        case FXBSTR_ID('A', 'S', 'C', 'I'):

+            if (name == "ASCIIHexDecode") {

+                return FX_NEW CPDF_AsciiHexFilter;

+            }

+            return FX_NEW CPDF_Ascii85Filter;

+        case FXBSTR_ID('A', 'H', 'x', 0):

+            return FX_NEW CPDF_AsciiHexFilter;

+        case FXBSTR_ID('A', '8', '5', 0):

+            return FX_NEW CPDF_Ascii85Filter;

+        case FXBSTR_ID('R', 'u', 'n', 'L'):

+            return FX_NEW CPDF_RunLenFilter;

+        case FXBSTR_ID('C', 'C', 'I', 'T'): {

+                int Encoding = 0;

+                int bEndOfLine = FALSE;

+                int bByteAlign = FALSE;

+                int bBlack = FALSE;

+                int nRows = 0;

+                int nColumns = 1728;

+                if (pParam) {

+                    Encoding = pParam->GetInteger(FX_BSTRC("K"));

+                    bEndOfLine = pParam->GetInteger(FX_BSTRC("EndOfLine"));

+                    bByteAlign = pParam->GetInteger(FX_BSTRC("EncodedByteAlign"));

+                    bBlack = pParam->GetInteger(FX_BSTRC("BlackIs1"));

+                    nColumns = pParam->GetInteger(FX_BSTRC("Columns"), 1728);

+                    nRows = pParam->GetInteger(FX_BSTRC("Rows"));

+                }

+                if (nColumns == 0) {

+                    nColumns = width;

+                }

+                if (nRows == 0) {

+                    nRows = height;

+                }

+                CPDF_FaxFilter* pFilter = FX_NEW CPDF_FaxFilter();

+                pFilter->Initialize(Encoding, bEndOfLine, bByteAlign, bBlack, nRows, nColumns);

+                return pFilter;

+            }

+        case FXBSTR_ID('D', 'C', 'T', 'D'):

+            return FX_NEW CPDF_JpegFilter;

+        default:

+            return NULL;

+    }

+}

+CFX_DataFilter* _FPDF_CreateFilterFromDict(CPDF_Dictionary* pDict)

+{

+    CPDF_Object* pDecoder = pDict->GetElementValue("Filter");

+    if (pDecoder == NULL) {

+        return NULL;

+    }

+    CFX_DataFilter* pFirstFilter = NULL;

+    int width = pDict->GetInteger(FX_BSTRC("Width")), height = pDict->GetInteger(FX_BSTRC("Height"));

+    CPDF_Object* pParams = pDict->GetElementValue("DecodeParms");

+    if (pDecoder->GetType() == PDFOBJ_ARRAY) {

+        if (pParams && pParams->GetType() != PDFOBJ_ARRAY) {

+            pParams = NULL;

+        }

+        for (FX_DWORD i = 0; i < ((CPDF_Array*)pDecoder)->GetCount(); i ++) {

+            CFX_ByteString name = ((CPDF_Array*)pDecoder)->GetString(i);

+            CPDF_Dictionary* pParam = NULL;

+            if (pParams) {

+                pParam = ((CPDF_Array*)pParams)->GetDict(i);

+            }

+            CFX_DataFilter* pDestFilter = FPDF_CreateFilter(name, pParam, width, height);

+            if (pDestFilter) {

+                if (pFirstFilter == NULL) {

+                    pFirstFilter = pDestFilter;

+                } else {

+                    pFirstFilter->SetDestFilter(pDestFilter);

+                }

+            }

+        }

+    } else {

+        if (pParams && pParams->GetType() != PDFOBJ_DICTIONARY) {

+            pParams = NULL;

+        }

+        pFirstFilter = FPDF_CreateFilter(pDecoder->GetString(), (CPDF_Dictionary*)pParams, width, height);

+    }

+    return pFirstFilter;

+}

+CPDF_StreamFilter* CPDF_Stream::GetStreamFilter(FX_BOOL bRaw) const

+{

+    CFX_DataFilter* pFirstFilter = NULL;

+    if (m_pCryptoHandler) {

+        pFirstFilter = FX_NEW CPDF_DecryptFilter(m_pCryptoHandler, m_ObjNum, m_GenNum);

+    }

+    if (!bRaw) {

+        CFX_DataFilter* pFilter = _FPDF_CreateFilterFromDict(m_pDict);

+        if (pFilter) {

+            if (pFirstFilter == NULL) {

+                pFirstFilter = pFilter;

+            } else {

+                pFirstFilter->SetDestFilter(pFilter);

+            }

+        }

+    }

+    CPDF_StreamFilter* pStreamFilter = FX_NEW CPDF_StreamFilter;

+    pStreamFilter->m_pStream = this;

+    pStreamFilter->m_pFilter = pFirstFilter;

+    pStreamFilter->m_pBuffer = NULL;

+    pStreamFilter->m_SrcOffset = 0;

+    return pStreamFilter;

+}

+CPDF_StreamFilter::~CPDF_StreamFilter()

+{

+    if (m_pFilter) {

+        delete m_pFilter;

+    }

+    if (m_pBuffer) {

+        delete m_pBuffer;

+    }

+}

+#define FPDF_FILTER_BUFFER_IN_SIZE	FPDF_FILTER_BUFFER_SIZE

+FX_DWORD CPDF_StreamFilter::ReadBlock(FX_LPBYTE buffer, FX_DWORD buf_size)

+{

+    if (m_pFilter == NULL) {

+        FX_DWORD read_size = m_pStream->GetRawSize() - m_SrcOffset;

+        if (read_size == 0) {

+            return 0;

+        }

+        if (read_size > buf_size) {

+            read_size = buf_size;

+        }

+        m_pStream->ReadRawData(m_SrcOffset, buffer, read_size);

+        m_SrcOffset += read_size;

+        return read_size;

+    }

+    FX_DWORD read_size = 0;

+    if (m_pBuffer) {

+        read_size = ReadLeftOver(buffer, buf_size);

+        if (read_size == buf_size) {

+            return read_size;

+        }

+        buffer += read_size;

+        buf_size -= read_size;

+    }

+    ASSERT(m_pBuffer == NULL);

+    if (m_pFilter->IsEOF()) {

+        return read_size;

+    }

+    m_pBuffer = FX_NEW CFX_BinaryBuf;

+    m_pBuffer->EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE);

+    m_BufOffset = 0;

+    while (1) {

+        int src_size = m_pStream->GetRawSize() - m_SrcOffset;

+        if (src_size == 0) {

+            m_pFilter->FilterFinish(*m_pBuffer);

+            break;

+        }

+        if (src_size > FPDF_FILTER_BUFFER_IN_SIZE) {

+            src_size = FPDF_FILTER_BUFFER_IN_SIZE;

+        }

+        if (!m_pStream->ReadRawData(m_SrcOffset, m_SrcBuffer, src_size)) {

+            return 0;

+        }

+        m_SrcOffset += src_size;

+        m_pFilter->FilterIn(m_SrcBuffer, src_size, *m_pBuffer);

+        if (m_pBuffer->GetSize() >= (int)buf_size) {

+            break;

+        }

+    }

+    return read_size + ReadLeftOver(buffer, buf_size);

+}

+FX_DWORD CPDF_StreamFilter::ReadLeftOver(FX_LPBYTE buffer, FX_DWORD buf_size)

+{

+    FX_DWORD read_size = m_pBuffer->GetSize() - m_BufOffset;

+    if (read_size > buf_size) {

+        read_size = buf_size;

+    }

+    FXSYS_memcpy32(buffer, m_pBuffer->GetBuffer() + m_BufOffset, read_size);

+    m_BufOffset += read_size;

+    if (m_BufOffset == (FX_DWORD)m_pBuffer->GetSize()) {

+        delete m_pBuffer;

+        m_pBuffer = NULL;

+    }

+    return read_size;

+}

+CPDF_DecryptFilter::CPDF_DecryptFilter(CPDF_CryptoHandler* pCryptoHandler, FX_DWORD objnum, FX_DWORD gennum)

+{

+    m_pCryptoHandler = pCryptoHandler;

+    m_pContext = NULL;

+    m_ObjNum = objnum;

+    m_GenNum = gennum;

+}

+CPDF_DecryptFilter::~CPDF_DecryptFilter()

+{

+    CFX_BinaryBuf buf;

+    if (m_pContext) {

+        m_pCryptoHandler->DecryptFinish(m_pContext, buf);

+    }

+}

+void CPDF_DecryptFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)

+{

+    if (m_pContext == NULL) {

+        m_pContext = m_pCryptoHandler->DecryptStart(m_ObjNum, m_GenNum);

+    }

+    m_pCryptoHandler->DecryptStream(m_pContext, src_buf, src_size, dest_buf);

+}

+void CPDF_DecryptFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf)

+{

+    m_bEOF = TRUE;

+    if (m_pContext == NULL) {

+        return;

+    }

+    m_pCryptoHandler->DecryptFinish(m_pContext, dest_buf);

+    m_pContext = NULL;

+}

+extern "C" {

+    static void* my_alloc_func (void* opaque, unsigned int items, unsigned int size)

+    {

+        return FX_Alloc(FX_BYTE, items * size);

+    }

+    static void   my_free_func  (void* opaque, void* address)

+    {

+        FX_Free(address);

+    }

+    void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),

+                            void (*free_func)(void*, void*));

+    void FPDFAPI_FlateInput(void* context, const unsigned char* src_buf, unsigned int src_size);

+    int FPDFAPI_FlateOutput(void* context, unsigned char* dest_buf, unsigned int dest_size);

+    int FPDFAPI_FlateGetAvailIn(void* context);

+    int FPDFAPI_FlateGetAvailOut(void* context);

+    void FPDFAPI_FlateEnd(void* context);

+}

+CPDF_FlateFilter::CPDF_FlateFilter()

+{

+    m_pContext = NULL;

+}

+CPDF_FlateFilter::~CPDF_FlateFilter()

+{

+    if (m_pContext) {

+        FPDFAPI_FlateEnd(m_pContext);

+    }

+}

+void CPDF_FlateFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)

+{

+    if (m_pContext == NULL) {

+        m_pContext = FPDFAPI_FlateInit(my_alloc_func, my_free_func);

+    }

+    FPDFAPI_FlateInput(m_pContext, src_buf, src_size);

+    while (1) {

+        int ret = FPDFAPI_FlateOutput(m_pContext, m_DestBuffer, FPDF_FILTER_BUFFER_SIZE);

+        int out_size = FPDF_FILTER_BUFFER_SIZE - FPDFAPI_FlateGetAvailOut(m_pContext);

+        dest_buf.AppendBlock(m_DestBuffer, out_size);

+        if (ret == Z_BUF_ERROR) {

+            break;

+        }

+        if (ret != Z_OK) {

+            ReportEOF(FPDFAPI_FlateGetAvailIn(m_pContext));

+            break;

+        }

+    }

+}

+CPDF_LzwFilter::CPDF_LzwFilter(FX_BOOL bEarlyChange)

+{

+    m_bEarlyChange = bEarlyChange ? 1 : 0;

+    m_CodeLen = 9;

+    m_nCodes = 0;

+    m_nLeftBits = 0;

+    m_LeftBits = 0;

+    m_OldCode = (FX_DWORD) - 1;

+}

+void CPDF_LzwFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)

+{

+    for (FX_DWORD i = 0; i < src_size; i ++) {

+        if (m_nLeftBits + 8 < m_CodeLen) {

+            m_nLeftBits += 8;

+            m_LeftBits = (m_LeftBits << 8) | src_buf[i];

+            continue;

+        }

+        FX_DWORD new_bits = m_CodeLen - m_nLeftBits;

+        FX_DWORD code = (m_LeftBits << new_bits) | (src_buf[i] >> (8 - new_bits));

+        m_nLeftBits = 8 - new_bits;

+        m_LeftBits = src_buf[i] % (1 << m_nLeftBits);

+        if (code < 256) {

+            dest_buf.AppendByte((FX_BYTE)code);

+            m_LastChar = (FX_BYTE)code;

+            if (m_OldCode != -1) {

+                AddCode(m_OldCode, m_LastChar);

+            }

+            m_OldCode = code;

+        } else if (code == 256) {

+            m_CodeLen = 9;

+            m_nCodes = 0;

+            m_OldCode = (FX_DWORD) - 1;

+        } else if (code == 257) {

+            ReportEOF(src_size - i - 1);

+            return;

+        } else {

+            if (m_OldCode == -1) {

+                ReportEOF(src_size - i - 1);

+                return;

+            }

+            m_StackLen = 0;

+            if (code >= m_nCodes + 258) {

+                if (m_StackLen < sizeof(m_DecodeStack)) {

+                    m_DecodeStack[m_StackLen++] = m_LastChar;

+                }

+                DecodeString(m_OldCode);

+            } else {

+                DecodeString(code);

+            }

+            dest_buf.AppendBlock(NULL, m_StackLen);

+            FX_LPBYTE pOutput = dest_buf.GetBuffer() + dest_buf.GetSize() - m_StackLen;

+            for (FX_DWORD cc = 0; cc < m_StackLen; cc ++) {

+                pOutput[cc] = m_DecodeStack[m_StackLen - cc - 1];

+            }

+            m_LastChar = m_DecodeStack[m_StackLen - 1];

+            if (m_OldCode < 256) {

+                AddCode(m_OldCode, m_LastChar);

+            } else if (m_OldCode - 258 >= m_nCodes) {

+                ReportEOF(src_size - i - 1);

+                return;

+            } else {

+                AddCode(m_OldCode, m_LastChar);

+            }

+            m_OldCode = code;

+        }

+    }

+}

+void CPDF_LzwFilter::AddCode(FX_DWORD prefix_code, FX_BYTE append_char)

+{

+    if (m_nCodes + m_bEarlyChange == 4094) {

+        return;

+    }

+    m_CodeArray[m_nCodes ++] = (prefix_code << 16) | append_char;

+    if (m_nCodes + m_bEarlyChange == 512 - 258) {

+        m_CodeLen = 10;

+    } else if (m_nCodes + m_bEarlyChange == 1024 - 258) {

+        m_CodeLen = 11;

+    } else if (m_nCodes + m_bEarlyChange == 2048 - 258) {

+        m_CodeLen = 12;

+    }

+}

+void CPDF_LzwFilter::DecodeString(FX_DWORD code)

+{

+    while (1) {

+        int index = code - 258;

+        if (index < 0 || index >= (int)m_nCodes) {

+            break;

+        }

+        FX_DWORD data = m_CodeArray[index];

+        if (m_StackLen >= sizeof(m_DecodeStack)) {

+            return;

+        }

+        m_DecodeStack[m_StackLen++] = (FX_BYTE)data;

+        code = data >> 16;

+    }

+    if (m_StackLen >= sizeof(m_DecodeStack)) {

+        return;

+    }

+    m_DecodeStack[m_StackLen++] = (FX_BYTE)code;

+}

+CPDF_PredictorFilter::CPDF_PredictorFilter(int predictor, int colors, int bpc, int cols)

+{

+    m_bTiff = predictor < 10;

+    m_pRefLine = NULL;

+    m_pCurLine = NULL;

+    m_iLine = 0;

+    m_LineInSize = 0;

+    m_Bpp = (colors * bpc + 7) / 8;

+    m_Pitch = (colors * bpc * cols + 7) / 8;

+    if (!m_bTiff) {

+        m_Pitch ++;

+    }

+}

+CPDF_PredictorFilter::~CPDF_PredictorFilter()

+{

+    if (m_pCurLine) {

+        FX_Free(m_pCurLine);

+    }

+    if (m_pRefLine) {

+        FX_Free(m_pRefLine);

+    }

+}

+static FX_BYTE PaethPredictor(int a, int b, int c)

+{

+    int p = a + b - c;

+    int pa = FXSYS_abs(p - a);

+    int pb = FXSYS_abs(p - b);

+    int pc = FXSYS_abs(p - c);

+    if (pa <= pb && pa <= pc) {

+        return (FX_BYTE)a;

+    }

+    if (pb <= pc) {

+        return (FX_BYTE)b;

+    }

+    return (FX_BYTE)c;

+}

+static void PNG_PredictorLine(FX_LPBYTE cur_buf, FX_LPBYTE ref_buf, int pitch, int Bpp)

+{

+    FX_BYTE tag = cur_buf[0];

+    if (tag == 0) {

+        return;

+    }

+    cur_buf ++;

+    if (ref_buf) {

+        ref_buf ++;

+    }

+    for (int byte = 0; byte < pitch; byte ++) {

+        FX_BYTE raw_byte = cur_buf[byte];

+        switch (tag) {

+            case 1:	{

+                    FX_BYTE left = 0;

+                    if (byte >= Bpp) {

+                        left = cur_buf[byte - Bpp];

+                    }

+                    cur_buf[byte] = raw_byte + left;

+                    break;

+                }

+            case 2: {

+                    FX_BYTE up = 0;

+                    if (ref_buf) {

+                        up = ref_buf[byte];

+                    }

+                    cur_buf[byte] = raw_byte + up;

+                    break;

+                }

+            case 3: {

+                    FX_BYTE left = 0;

+                    if (byte >= Bpp) {

+                        left = cur_buf[byte - Bpp];

+                    }

+                    FX_BYTE up = 0;

+                    if (ref_buf) {

+                        up = ref_buf[byte];

+                    }

+                    cur_buf[byte] = raw_byte + (up + left) / 2;

+                    break;

+                }

+            case 4: {

+                    FX_BYTE left = 0;

+                    if (byte >= Bpp) {

+                        left = cur_buf[byte - Bpp];

+                    }

+                    FX_BYTE up = 0;

+                    if (ref_buf) {

+                        up = ref_buf[byte];

+                    }

+                    FX_BYTE upper_left = 0;

+                    if (byte >= Bpp && ref_buf) {

+                        upper_left = ref_buf[byte - Bpp];

+                    }

+                    cur_buf[byte] = raw_byte + PaethPredictor(left, up, upper_left);

+                    break;

+                }

+        }

+    }

+}

+void CPDF_PredictorFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)

+{

+    if (m_pCurLine == NULL) {

+        m_pCurLine = FX_Alloc(FX_BYTE, m_Pitch);

+        if (!m_bTiff) {

+            m_pRefLine = FX_Alloc(FX_BYTE, m_Pitch);

+        }

+    }

+    while (1) {

+        FX_DWORD read_size = m_Pitch - m_LineInSize;

+        if (read_size > src_size) {

+            read_size = src_size;

+        }

+        FXSYS_memcpy32(m_pCurLine + m_LineInSize, src_buf, read_size);

+        m_LineInSize += read_size;

+        if (m_LineInSize < m_Pitch) {

+            break;

+        }

+        src_buf += read_size;

+        src_size -= read_size;

+        if (m_bTiff) {

+            for (FX_DWORD byte = m_Bpp; byte < m_Pitch; byte ++) {

+                m_pCurLine[byte] += m_pCurLine[byte - m_Bpp];

+            }

+            dest_buf.AppendBlock(m_pCurLine, m_Pitch);

+        } else {

+            PNG_PredictorLine(m_pCurLine, m_iLine ? m_pRefLine : NULL, m_Pitch - 1, m_Bpp);

+            dest_buf.AppendBlock(m_pCurLine + 1, m_Pitch - 1);

+            m_iLine ++;

+            FX_LPBYTE temp = m_pCurLine;

+            m_pCurLine = m_pRefLine;

+            m_pRefLine = temp;

+        }

+        m_LineInSize = 0;

+    }

+}

+CPDF_Ascii85Filter::CPDF_Ascii85Filter()

+{

+    m_State = 0;

+    m_CharCount = 0;

+}

+extern const FX_LPCSTR _PDF_CharType;

+void CPDF_Ascii85Filter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)

+{

+    for (FX_DWORD i = 0; i < src_size; i ++) {

+        FX_BYTE byte = src_buf[i];

+        if (_PDF_CharType[byte] == 'W') {

+            continue;

+        }

+        switch (m_State) {

+            case 0:

+                if (byte >= '!' && byte <= 'u') {

+                    int digit = byte - '!';

+                    m_CurDWord = digit;

+                    m_CharCount = 1;

+                    m_State = 1;

+                } else if (byte == 'z') {

+                    int zero = 0;

+                    dest_buf.AppendBlock(&zero, 4);

+                } else if (byte == '~') {

+                    m_State = 2;

+                }

+                break;

+            case 1: {

+                    if (byte >= '!' && byte <= 'u') {

+                        int digit = byte - '!';

+                        m_CurDWord = m_CurDWord * 85 + digit;

+                        m_CharCount ++;

+                        if (m_CharCount == 5) {

+                            for (int i = 0; i < 4; i ++) {

+                                dest_buf.AppendByte((FX_BYTE)(m_CurDWord >> (3 - i) * 8));

+                            }

+                            m_State = 0;

+                        }

+                    } else if (byte == '~') {

+                        if (m_CharCount > 1) {

+                            int i;

+                            for (i = m_CharCount; i < 5; i ++) {

+                                m_CurDWord = m_CurDWord * 85 + 84;

+                            }

+                            for (i = 0; i < m_CharCount - 1; i ++) {

+                                dest_buf.AppendByte((FX_BYTE)(m_CurDWord >> (3 - i) * 8));

+                            }

+                        }

+                        m_State = 2;

+                    }

+                    break;

+                }

+            case 2:

+                if (byte == '>') {

+                    ReportEOF(src_size - i - 1);

+                    return;

+                }

+                break;

+        }

+    }

+}

+CPDF_AsciiHexFilter::CPDF_AsciiHexFilter()

+{

+    m_State = 0;

+}

+void CPDF_AsciiHexFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)

+{

+    for (FX_DWORD i = 0; i < src_size; i ++) {

+        FX_BYTE byte = src_buf[i];

+        if (_PDF_CharType[byte] == 'W') {

+            continue;

+        }

+        int digit;

+        if (byte >= '0' && byte <= '9') {

+            digit = byte - '0';

+        } else if (byte >= 'a' && byte <= 'f') {

+            digit = byte - 'a' + 10;

+        } else if (byte >= 'A' && byte <= 'F') {

+            digit = byte - 'A' + 10;

+        } else {

+            if (m_State) {

+                dest_buf.AppendByte(m_FirstDigit * 16);

+            }

+            ReportEOF(src_size - i - 1);

+            return;

+        }

+        if (m_State == 0) {

+            m_FirstDigit = digit;

+            m_State ++;

+        } else {

+            dest_buf.AppendByte(m_FirstDigit * 16 + digit);

+            m_State --;

+        }

+    }

+}

+CPDF_RunLenFilter::CPDF_RunLenFilter()

+{

+    m_State = 0;

+    m_Count = 0;

+}

+void CPDF_RunLenFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)

+{

+    for (FX_DWORD i = 0; i < src_size; i ++) {

+        FX_BYTE byte = src_buf[i];

+        switch (m_State) {

+            case 0:

+                if (byte < 128) {

+                    m_State = 1;

+                    m_Count = byte + 1;

+                } else if (byte == 128) {

+                    ReportEOF(src_size - i - 1);

+                    return;

+                } else {

+                    m_State = 2;

+                    m_Count = 257 - byte;

+                }

+                break;

+            case 1:

+                dest_buf.AppendByte(byte);

+                m_Count --;

+                if (m_Count == 0) {

+                    m_State = 0;

+                }

+                break;

+            case 2:	{

+                    dest_buf.AppendBlock(NULL, m_Count);

+                    FXSYS_memset8(dest_buf.GetBuffer() + dest_buf.GetSize() - m_Count, byte, m_Count);

+                    m_State = 0;

+                    break;

+                }

+        }

+    }

+}

+CPDF_JpegFilter::CPDF_JpegFilter()

+{

+    m_pContext = NULL;

+    m_bGotHeader = FALSE;

+    m_pScanline = NULL;

+    m_iLine = 0;

+}

+CPDF_JpegFilter::~CPDF_JpegFilter()

+{

+    if (m_pScanline) {

+        FX_Free(m_pScanline);

+    }

+    if (m_pContext) {

+        CPDF_ModuleMgr::Get()->GetJpegModule()->Finish(m_pContext);

+    }

+}

+void CPDF_JpegFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)

+{

+    if (m_pContext == NULL) {

+        m_pContext = CPDF_ModuleMgr::Get()->GetJpegModule()->Start();

+    }

+    FX_LPCBYTE jpeg_src_buf;

+    FX_DWORD jpeg_src_size;

+    CFX_BinaryBuf temp_buf;

+    if (m_InputBuf.GetSize()) {

+        temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size);

+        temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize());

+        m_InputBuf.Clear();

+        temp_buf.AppendBlock(src_buf, src_size);

+        jpeg_src_buf = temp_buf.GetBuffer();

+        jpeg_src_size = temp_buf.GetSize();

+    } else {

+        jpeg_src_buf = src_buf;

+        jpeg_src_size = src_size;

+    }

+    CPDF_ModuleMgr::Get()->GetJpegModule()->Input(m_pContext, jpeg_src_buf, jpeg_src_size);

+    if (!m_bGotHeader) {

+        int ret = CPDF_ModuleMgr::Get()->GetJpegModule()->ReadHeader(m_pContext, &m_Width, &m_Height, &m_nComps);

+        int left_size = CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext);

+        if (ret == 1) {

+            ReportEOF(left_size);

+            return;

+        }

+        if (ret == 2) {

+            m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, left_size);

+            return;

+        }

+        CPDF_ModuleMgr::Get()->GetJpegModule()->StartScanline(m_pContext, 1);

+        m_bGotHeader = TRUE;

+        m_Pitch = m_Width * m_nComps;

+    }

+    if (m_pScanline == NULL) {

+        m_pScanline = FX_Alloc(FX_BYTE, m_Pitch + 4);

+    }

+    while (1) {

+        if (!CPDF_ModuleMgr::Get()->GetJpegModule()->ReadScanline(m_pContext, m_pScanline)) {

+            int left_size = CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext);

+            m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, left_size);

+            break;

+        }

+        dest_buf.AppendBlock(m_pScanline, m_Pitch);

+        m_iLine ++;

+        if (m_iLine == m_Height) {

+            ReportEOF(CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext));

+            return;

+        }

+    }

+}

+CPDF_FaxFilter::CPDF_FaxFilter()

+{

+    m_Encoding = 0;

+    m_bEndOfLine = FALSE;

+    m_bByteAlign = FALSE;

+    m_bBlack = FALSE;

+    m_nRows = 0;

+    m_nColumns = 0;

+    m_Pitch = 0;

+    m_pScanlineBuf = NULL;

+    m_pRefBuf = NULL;

+    m_iRow = 0;

+    m_InputBitPos = 0;

+}

+CPDF_FaxFilter::~CPDF_FaxFilter()

+{

+    if (m_pScanlineBuf) {

+        FX_Free(m_pScanlineBuf);

+    }

+    if (m_pRefBuf) {

+        FX_Free(m_pRefBuf);

+    }

+}

+FX_BOOL CPDF_FaxFilter::Initialize(int Encoding, int bEndOfLine, int bByteAlign, int bBlack, int nRows, int nColumns)

+{

+    m_Encoding = Encoding;

+    m_bEndOfLine = bEndOfLine;

+    m_bByteAlign = bByteAlign;

+    m_bBlack = bBlack;

+    m_nRows = nRows;

+    m_nColumns = nColumns;

+    m_Pitch = (m_nColumns + 7) / 8;

+    m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);

+    m_pRefBuf = FX_Alloc(FX_BYTE, m_Pitch);

+    FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);

+    FXSYS_memset8(m_pRefBuf, 0xff, m_Pitch);

+    m_iRow = 0;

+    m_InputBitPos = 0;

+    return TRUE;

+}

+void CPDF_FaxFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)

+{

+    FX_LPCBYTE fax_src_buf;

+    FX_DWORD fax_src_size;

+    CFX_BinaryBuf temp_buf;

+    int bitpos;

+    if (m_InputBuf.GetSize()) {

+        temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size);

+        temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize());

+        m_InputBuf.Clear();

+        temp_buf.AppendBlock(src_buf, src_size);

+        fax_src_buf = temp_buf.GetBuffer();

+        fax_src_size = temp_buf.GetSize();

+        bitpos = m_InputBitPos;

+    } else {

+        fax_src_buf = src_buf;

+        fax_src_size = src_size;

+        bitpos = 0;

+    }

+    ProcessData(fax_src_buf, fax_src_size, bitpos, FALSE, dest_buf);

+    int left_bits = fax_src_size * 8 - bitpos;

+    m_InputBuf.AppendBlock(fax_src_buf + bitpos / 8, (left_bits + 7) / 8);

+    m_InputBitPos = bitpos % 8;

+}

+void CPDF_FaxFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf)

+{

+    ProcessData(m_InputBuf.GetBuffer(), m_InputBuf.GetSize(), m_InputBitPos, TRUE, dest_buf);

+}

+FX_BOOL _FaxSkipEOL(const FX_BYTE* src_buf, int bitsize, int& bitpos);

+FX_BOOL _FaxG4GetRow(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, const FX_BYTE* ref_buf, int columns);

+FX_BOOL _FaxGet1DLine(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, int columns);

+void CPDF_FaxFilter::ProcessData(FX_LPCBYTE src_buf, FX_DWORD src_size, int& bitpos, FX_BOOL bFinish,

+                                 CFX_BinaryBuf& dest_buf)

+{

+    int bitsize = src_size * 8;

+    while (1) {

+        if ((bitsize < bitpos + 256) && !bFinish) {

+            return;

+        }

+        int start_bitpos = bitpos;

+        FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);

+        if (!ReadLine(src_buf, bitsize, bitpos)) {

+            bitpos = start_bitpos;

+            return;

+        }

+        if (m_Encoding) {

+            FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);

+        }

+        if (m_bBlack) {

+            for (int i = 0; i < m_Pitch; i ++) {

+                m_pScanlineBuf[i] = ~m_pScanlineBuf[i];

+            }

+        }

+        dest_buf.AppendBlock(m_pScanlineBuf, m_Pitch);

+        m_iRow ++;

+        if (m_iRow == m_nRows) {

+            ReportEOF(src_size - (bitpos + 7) / 8);

+            return;

+        }

+    }

+}

+FX_BOOL CPDF_FaxFilter::ReadLine(FX_LPCBYTE src_buf, int bitsize, int& bitpos)

+{

+    if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) {

+        return FALSE;

+    }

+    FX_BOOL ret;

+    if (m_Encoding < 0) {

+        ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_nColumns);

+    } else if (m_Encoding == 0) {

+        ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns);

+    } else {

+        if (bitpos == bitsize) {

+            return FALSE;

+        }

+        FX_BOOL bNext1D = src_buf[bitpos / 8] & (1 << (7 - bitpos % 8));

+        bitpos ++;

+        if (bNext1D) {

+            ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns);

+        } else {

+            ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_nColumns);

+        }

+    }

+    if (!ret) {

+        return FALSE;

+    }

+    if (m_bEndOfLine)

+        if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) {

+            return FALSE;

+        }

+    if (m_bByteAlign) {

+        bitpos = (bitpos + 7) / 8 * 8;

+    }

+    return TRUE;

+}

diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
new file mode 100644
index 0000000..53cf892
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
@@ -0,0 +1,1344 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_parser.h"

+void CPDF_Object::Release()

+{

+    if (this == NULL) {

+        return;

+    }

+    if (m_ObjNum) {

+        return;

+    }

+    Destroy();

+}

+void CPDF_Object::Destroy()

+{

+    switch (m_Type) {

+        case PDFOBJ_STRING:

+            delete (CPDF_String*)this;

+            break;

+        case PDFOBJ_NAME:

+            delete (CPDF_Name*)this;

+            break;

+        case PDFOBJ_ARRAY:

+            delete (CPDF_Array*)this;

+            break;

+        case PDFOBJ_DICTIONARY:

+            delete (CPDF_Dictionary*)this;

+            break;

+        case PDFOBJ_STREAM:

+            delete (CPDF_Stream*)this;

+            break;

+        default:

+            delete this;

+    }

+}

+CFX_ByteString CPDF_Object::GetString() const

+{

+    if (this == NULL) {

+        return CFX_ByteString();

+    }

+    switch (m_Type) {

+        case PDFOBJ_BOOLEAN:

+            return ((CPDF_Boolean*)this)->m_bValue ? "true" : "false";

+        case PDFOBJ_NUMBER:

+            return ((CPDF_Number*)this)->GetString();

+        case PDFOBJ_STRING:

+            return ((CPDF_String*)this)->m_String;

+        case PDFOBJ_NAME:

+            return ((CPDF_Name*)this)->m_Name;

+        case PDFOBJ_REFERENCE: {

+                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;

+                if (pRef->m_pObjList == NULL) {

+                    break;

+                }

+                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);

+                if (pObj == NULL) {

+                    return CFX_ByteString();

+                }

+                return pObj->GetString();

+            }

+    }

+    return CFX_ByteString();

+}

+CFX_ByteStringC CPDF_Object::GetConstString() const

+{

+    if (this == NULL) {

+        return CFX_ByteStringC();

+    }

+    switch (m_Type) {

+        case PDFOBJ_STRING:

+            return CFX_ByteStringC((FX_LPCBYTE)((CPDF_String*)this)->m_String, ((CPDF_String*)this)->m_String.GetLength());

+        case PDFOBJ_NAME:

+            return CFX_ByteStringC((FX_LPCBYTE)((CPDF_Name*)this)->m_Name, ((CPDF_Name*)this)->m_Name.GetLength());

+        case PDFOBJ_REFERENCE: {

+                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;

+                if (pRef->m_pObjList == NULL) {

+                    break;

+                }

+                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);

+                if (pObj == NULL) {

+                    return CFX_ByteStringC();

+                }

+                return pObj->GetConstString();

+            }

+    }

+    return CFX_ByteStringC();

+}

+FX_FLOAT CPDF_Object::GetNumber() const

+{

+    if (this == NULL) {

+        return 0;

+    }

+    switch (m_Type) {

+        case PDFOBJ_NUMBER:

+            return ((CPDF_Number*)this)->GetNumber();

+        case PDFOBJ_REFERENCE: {

+                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;

+                if (pRef->m_pObjList == NULL) {

+                    break;

+                }

+                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);

+                if (pObj == NULL) {

+                    return 0;

+                }

+                return pObj->GetNumber();

+            }

+    }

+    return 0;

+}

+FX_FLOAT CPDF_Object::GetNumber16() const

+{

+    return GetNumber();

+}

+int CPDF_Object::GetInteger() const

+{

+    if (this == NULL) {

+        return 0;

+    }

+    switch (m_Type) {

+        case PDFOBJ_BOOLEAN:

+            return ((CPDF_Boolean*)this)->m_bValue;

+        case PDFOBJ_NUMBER:

+            return ((CPDF_Number*)this)->GetInteger();

+        case PDFOBJ_REFERENCE: {

+                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;

+                PARSE_CONTEXT context;

+                FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));

+                if (pRef->m_pObjList == NULL) {

+                    return 0;

+                }

+                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum, &context);

+                if (pObj == NULL) {

+                    return 0;

+                }

+                return pObj->GetInteger();

+            }

+    }

+    return 0;

+}

+CPDF_Dictionary* CPDF_Object::GetDict() const

+{

+    if (this == NULL) {

+        return NULL;

+    }

+    switch (m_Type) {

+        case PDFOBJ_DICTIONARY:

+            return (CPDF_Dictionary*)this;

+        case PDFOBJ_STREAM:

+            return ((CPDF_Stream*)this)->GetDict();

+        case PDFOBJ_REFERENCE: {

+                CPDF_Reference* pRef = (CPDF_Reference*)this;

+                if (pRef->m_pObjList == NULL) {

+                    break;

+                }

+                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);

+                if (pObj == NULL) {

+                    return NULL;

+                }

+                return pObj->GetDict();

+            }

+    }

+    return NULL;

+}

+CPDF_Array* CPDF_Object::GetArray() const

+{

+    if (this == NULL) {

+        return NULL;

+    }

+    if (m_Type == PDFOBJ_ARRAY) {

+        return (CPDF_Array*)this;

+    }

+    return NULL;

+}

+void CPDF_Object::SetString(const CFX_ByteString& str)

+{

+    ASSERT(this != NULL);

+    switch (m_Type) {

+        case PDFOBJ_BOOLEAN:

+            ((CPDF_Boolean*)this)->m_bValue = str == FX_BSTRC("true") ? 1 : 0;

+            return;

+        case PDFOBJ_NUMBER:

+            ((CPDF_Number*)this)->SetString(str);

+            return;

+        case PDFOBJ_STRING:

+            ((CPDF_String*)this)->m_String = str;

+            return;

+        case PDFOBJ_NAME:

+            ((CPDF_Name*)this)->m_Name = str;

+            return;

+    }

+    ASSERT(FALSE);

+}

+int CPDF_Object::GetDirectType() const

+{

+    if (m_Type != PDFOBJ_REFERENCE) {

+        return m_Type;

+    }

+    CPDF_Reference* pRef = (CPDF_Reference*)this;

+    return pRef->m_pObjList->GetIndirectType(pRef->m_RefObjNum);

+}

+FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const

+{

+    if (this == pOther) {

+        return TRUE;

+    }

+    if (this == NULL || pOther == NULL) {

+        return FALSE;

+    }

+    if (pOther->m_Type != m_Type) {

+        if (m_Type == PDFOBJ_REFERENCE) {

+            return GetDirect()->IsIdentical(pOther);

+        } else if (pOther->m_Type == PDFOBJ_REFERENCE) {

+            return IsIdentical(pOther->GetDirect());

+        }

+        return FALSE;

+    }

+    switch (m_Type) {

+        case PDFOBJ_BOOLEAN:

+            return (((CPDF_Boolean*)this)->Identical((CPDF_Boolean*)pOther));

+        case PDFOBJ_NUMBER:

+            return (((CPDF_Number*)this)->Identical((CPDF_Number*)pOther));

+        case PDFOBJ_STRING:

+            return (((CPDF_String*)this)->Identical((CPDF_String*)pOther));

+        case PDFOBJ_NAME:

+            return (((CPDF_Name*)this)->Identical((CPDF_Name*)pOther));

+        case PDFOBJ_ARRAY:

+            return (((CPDF_Array*)this)->Identical((CPDF_Array*)pOther));

+        case PDFOBJ_DICTIONARY:

+            return (((CPDF_Dictionary*)this)->Identical((CPDF_Dictionary*)pOther));

+        case PDFOBJ_NULL:

+            return TRUE;

+        case PDFOBJ_STREAM:

+            return (((CPDF_Stream*)this)->Identical((CPDF_Stream*)pOther));

+        case PDFOBJ_REFERENCE:

+            return (((CPDF_Reference*)this)->Identical((CPDF_Reference*)pOther));

+    }

+    return FALSE;

+}

+CPDF_Object* CPDF_Object::GetDirect() const

+{

+    if (this == NULL) {

+        return NULL;

+    }

+    if (m_Type != PDFOBJ_REFERENCE) {

+        return (CPDF_Object*)this;

+    }

+    CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;

+    if (pRef->m_pObjList == NULL) {

+        return NULL;

+    }

+    return pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);

+}

+CPDF_Object* CPDF_Object::Clone(FX_BOOL bDirect) const

+{

+    CFX_MapPtrToPtr visited;

+    return CloneInternal(bDirect, &visited);

+}

+CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const

+{

+    if (this == NULL) {

+        return NULL;

+    }

+    switch (m_Type) {

+        case PDFOBJ_BOOLEAN:

+            return FX_NEW CPDF_Boolean(((CPDF_Boolean*)this)->m_bValue);

+        case PDFOBJ_NUMBER:

+            return FX_NEW CPDF_Number(((CPDF_Number*)this)->m_bInteger, &((CPDF_Number*)this)->m_Integer);

+        case PDFOBJ_STRING:

+            return FX_NEW CPDF_String(((CPDF_String*)this)->m_String, ((CPDF_String*)this)->IsHex());

+        case PDFOBJ_NAME:

+            return FX_NEW CPDF_Name(((CPDF_Name*)this)->m_Name);

+        case PDFOBJ_ARRAY: {

+                CPDF_Array* pCopy = FX_NEW CPDF_Array();

+                CPDF_Array* pThis = (CPDF_Array*)this;

+                int n = pThis->GetCount();

+                for (int i = 0; i < n; i ++) {

+                    CPDF_Object* value = (CPDF_Object*)pThis->m_Objects.GetAt(i);

+                    pCopy->m_Objects.Add(value->CloneInternal(bDirect, visited));

+                }

+                return pCopy;

+            }

+        case PDFOBJ_DICTIONARY: {

+                CPDF_Dictionary* pCopy = FX_NEW CPDF_Dictionary();

+                CPDF_Dictionary* pThis = (CPDF_Dictionary*)this;

+                FX_POSITION pos = pThis->m_Map.GetStartPosition();

+                while (pos) {

+                    CFX_ByteString key;

+                    CPDF_Object* value;

+                    pThis->m_Map.GetNextAssoc(pos, key, (void*&)value);

+                    pCopy->m_Map.SetAt(key, value->CloneInternal(bDirect, visited));

+                }

+                return pCopy;

+            }

+        case PDFOBJ_NULL: {

+                return FX_NEW CPDF_Null;

+            }

+        case PDFOBJ_STREAM: {

+                CPDF_Stream* pThis = (CPDF_Stream*)this;

+                CPDF_StreamAcc acc;

+                acc.LoadAllData(pThis, TRUE);

+                FX_DWORD streamSize = acc.GetSize();

+                CPDF_Stream* pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, (CPDF_Dictionary*)((CPDF_Object*)pThis->GetDict())->CloneInternal(bDirect, visited));

+                return pObj;

+            }

+        case PDFOBJ_REFERENCE: {

+                CPDF_Reference* pRef = (CPDF_Reference*)this;

+                FX_DWORD obj_num = pRef->m_RefObjNum;

+                if (bDirect && !visited->GetValueAt((void*)(FX_UINTPTR)obj_num)) {

+                    visited->SetAt((void*)(FX_UINTPTR)obj_num, (void*)1);

+                    CPDF_Object* ret = pRef->GetDirect()->CloneInternal(TRUE, visited);

+                    return ret;

+                } else {

+                    return FX_NEW CPDF_Reference(pRef->m_pObjList, obj_num);

+                }

+            }

+    }

+    return NULL;

+}

+CPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjects* pDoc) const

+{

+    if (this == NULL) {

+        return NULL;

+    }

+    if (m_ObjNum) {

+        return FX_NEW CPDF_Reference(pDoc, m_ObjNum);

+    }

+    return Clone();

+}

+CFX_WideString CPDF_Object::GetUnicodeText(CFX_CharMap* pCharMap) const

+{

+    if (this == NULL) {

+        return CFX_WideString();

+    }

+    if (m_Type == PDFOBJ_STRING) {

+        return PDF_DecodeText(((CPDF_String*)this)->m_String, pCharMap);

+    } else if (m_Type == PDFOBJ_STREAM) {

+        CPDF_StreamAcc stream;

+        stream.LoadAllData((CPDF_Stream*)this, FALSE);

+        CFX_WideString result = PDF_DecodeText(stream.GetData(), stream.GetSize(), pCharMap);

+        return result;

+    } else if (m_Type == PDFOBJ_NAME) {

+        return PDF_DecodeText(((CPDF_Name*)this)->m_Name, pCharMap);

+    }

+    return CFX_WideString();

+}

+void CPDF_Object::SetUnicodeText(FX_LPCWSTR pUnicodes, int len)

+{

+    if (this == NULL) {

+        return;

+    }

+    if (m_Type == PDFOBJ_STRING) {

+        ((CPDF_String*)this)->m_String = PDF_EncodeText(pUnicodes, len);

+    } else if (m_Type == PDFOBJ_STREAM) {

+        CFX_ByteString result = PDF_EncodeText(pUnicodes, len);

+        ((CPDF_Stream*)this)->SetData((FX_LPBYTE)(FX_LPCSTR)result, result.GetLength(), FALSE, FALSE);

+    }

+}

+CPDF_Number::CPDF_Number(int value)

+{

+    m_Type = PDFOBJ_NUMBER;

+    m_bInteger = TRUE;

+    m_Integer = value;

+}

+CPDF_Number::CPDF_Number(FX_FLOAT value)

+{

+    m_Type = PDFOBJ_NUMBER;

+    m_bInteger = FALSE;

+    m_Float = value;

+}

+CPDF_Number::CPDF_Number(FX_BOOL bInteger, void* pData)

+{

+    m_Type = PDFOBJ_NUMBER;

+    m_bInteger = bInteger;

+    m_Integer = *(int*)pData;

+}

+extern void FX_atonum(FX_BSTR, FX_BOOL&, void*);

+CPDF_Number::CPDF_Number(FX_BSTR str)

+{

+    m_Type = PDFOBJ_NUMBER;

+    FX_atonum(str, m_bInteger, &m_Integer);

+}

+void CPDF_Number::SetString(FX_BSTR str)

+{

+    FX_atonum(str, m_bInteger, &m_Integer);

+}

+FX_BOOL CPDF_Number::Identical(CPDF_Number* pOther) const

+{

+    return m_bInteger == pOther->m_bInteger && m_Integer == pOther->m_Integer;

+}

+CFX_ByteString CPDF_Number::GetString() const

+{

+    return m_bInteger ? CFX_ByteString::FormatInteger(m_Integer, FXFORMAT_SIGNED) : CFX_ByteString::FormatFloat(m_Float);

+}

+void CPDF_Number::SetNumber(FX_FLOAT value)

+{

+    m_bInteger = FALSE;

+    m_Float = value;

+}

+CPDF_String::CPDF_String(const CFX_WideString& str)

+{

+    m_Type = PDFOBJ_STRING;

+    m_String = PDF_EncodeText(str, str.GetLength());

+    m_bHex = FALSE;

+}

+CPDF_Array::~CPDF_Array()

+{

+    int size = m_Objects.GetSize();

+    CPDF_Object** pList = (CPDF_Object**)m_Objects.GetData();

+    for (int i = 0; i < size; i ++) {

+        pList[i]->Release();

+    }

+}

+CFX_FloatRect CPDF_Array::GetRect()

+{

+    CFX_FloatRect rect;

+    if (this == NULL || m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 4) {

+        return rect;

+    }

+    rect.left = GetNumber(0);

+    rect.bottom = GetNumber(1);

+    rect.right = GetNumber(2);

+    rect.top = GetNumber(3);

+    return rect;

+}

+CFX_AffineMatrix CPDF_Array::GetMatrix()

+{

+    CFX_AffineMatrix matrix;

+    if (this == NULL || m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 6) {

+        return matrix;

+    }

+    matrix.Set(GetNumber(0), GetNumber(1), GetNumber(2), GetNumber(3), GetNumber(4), GetNumber(5));

+    return matrix;

+}

+CPDF_Object* CPDF_Array::GetElement(FX_DWORD i) const

+{

+    if (this == NULL) {

+        return NULL;

+    }

+    if (i >= (FX_DWORD)m_Objects.GetSize()) {

+        return NULL;

+    }

+    return (CPDF_Object*)m_Objects.GetAt(i);

+}

+CPDF_Object* CPDF_Array::GetElementValue(FX_DWORD i) const

+{

+    if (this == NULL) {

+        return NULL;

+    }

+    if (i >= (FX_DWORD)m_Objects.GetSize()) {

+        return NULL;

+    }

+    return ((CPDF_Object*)m_Objects.GetAt(i))->GetDirect();

+}

+CFX_ByteString CPDF_Array::GetString(FX_DWORD i) const

+{

+    if (this && i < (FX_DWORD)m_Objects.GetSize()) {

+        CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);

+        return p->GetString();

+    }

+    return CFX_ByteString();

+}

+CFX_ByteStringC CPDF_Array::GetConstString(FX_DWORD i) const

+{

+    if (this && i < (FX_DWORD)m_Objects.GetSize()) {

+        CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);

+        return p->GetConstString();

+    }

+    return CFX_ByteStringC();

+}

+int CPDF_Array::GetInteger(FX_DWORD i) const

+{

+    if (this == NULL || i >= (FX_DWORD)m_Objects.GetSize()) {

+        return 0;

+    }

+    CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);

+    return p->GetInteger();

+}

+FX_FLOAT CPDF_Array::GetNumber(FX_DWORD i) const

+{

+    if (this == NULL || i >= (FX_DWORD)m_Objects.GetSize()) {

+        return 0;

+    }

+    CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);

+    return p->GetNumber();

+}

+CPDF_Dictionary* CPDF_Array::GetDict(FX_DWORD i) const

+{

+    CPDF_Object* p = GetElementValue(i);

+    if (p == NULL) {

+        return NULL;

+    } else if (p->GetType() == PDFOBJ_DICTIONARY) {

+        return (CPDF_Dictionary*)p;

+    } else if (p->GetType() == PDFOBJ_STREAM) {

+        return ((CPDF_Stream*)p)->GetDict();

+    }

+    return NULL;

+}

+CPDF_Stream* CPDF_Array::GetStream(FX_DWORD i) const

+{

+    CPDF_Object* p = GetElementValue(i);

+    if (p == NULL || p->GetType() != PDFOBJ_STREAM) {

+        return NULL;

+    }

+    return (CPDF_Stream*)p;

+}

+CPDF_Array* CPDF_Array::GetArray(FX_DWORD i) const

+{

+    CPDF_Object* p = GetElementValue(i);

+    if (p == NULL || p->GetType() != PDFOBJ_ARRAY) {

+        return NULL;

+    }

+    return (CPDF_Array*)p;

+}

+void CPDF_Array::RemoveAt(FX_DWORD i)

+{

+    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);

+    if (i >= (FX_DWORD)m_Objects.GetSize()) {

+        return;

+    }

+    CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);

+    p->Release();

+    m_Objects.RemoveAt(i);

+}

+void CPDF_Array::SetAt(FX_DWORD i, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)

+{

+    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);

+    ASSERT(i < (FX_DWORD)m_Objects.GetSize());

+    if (i >= (FX_DWORD)m_Objects.GetSize()) {

+        return;

+    }

+    CPDF_Object* pOld = (CPDF_Object*)m_Objects.GetAt(i);

+    pOld->Release();

+    if (pObj->GetObjNum()) {

+        ASSERT(pObjs != NULL);

+        pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());

+    }

+    m_Objects.SetAt(i, pObj);

+}

+void CPDF_Array::InsertAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)

+{

+    ASSERT(pObj != NULL);

+    if (pObj->GetObjNum()) {

+        ASSERT(pObjs != NULL);

+        pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());

+    }

+    m_Objects.InsertAt(index, pObj);

+}

+void CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)

+{

+    ASSERT(pObj != NULL);

+    if (pObj->GetObjNum()) {

+        ASSERT(pObjs != NULL);

+        pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());

+    }

+    m_Objects.Add(pObj);

+}

+void CPDF_Array::AddName(const CFX_ByteString& str)

+{

+    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);

+    Add(FX_NEW CPDF_Name(str));

+}

+void CPDF_Array::AddString(const CFX_ByteString& str)

+{

+    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);

+    Add(FX_NEW CPDF_String(str));

+}

+void CPDF_Array::AddInteger(int i)

+{

+    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);

+    Add(FX_NEW CPDF_Number(i));

+}

+void CPDF_Array::AddNumber(FX_FLOAT f)

+{

+    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);

+    CPDF_Number* pNumber = FX_NEW CPDF_Number;

+    pNumber->SetNumber(f);

+    Add(pNumber);

+}

+void CPDF_Array::AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)

+{

+    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);

+    Add(FX_NEW CPDF_Reference(pDoc, objnum));

+}

+FX_BOOL CPDF_Array::Identical(CPDF_Array* pOther) const

+{

+    if (m_Objects.GetSize() != pOther->m_Objects.GetSize()) {

+        return FALSE;

+    }

+    for (int i = 0; i < m_Objects.GetSize(); i ++)

+        if (!((CPDF_Object*)m_Objects[i])->IsIdentical((CPDF_Object*)pOther->m_Objects[i])) {

+            return FALSE;

+        }

+    return TRUE;

+}

+CPDF_Dictionary::~CPDF_Dictionary()

+{

+    FX_POSITION pos = m_Map.GetStartPosition();

+    while (pos) {

+        FX_LPVOID value = m_Map.GetNextValue(pos);

+        ((CPDF_Object*)value)->Release();

+    }

+}

+FX_POSITION CPDF_Dictionary::GetStartPos() const

+{

+    return m_Map.GetStartPosition();

+}

+CPDF_Object* CPDF_Dictionary::GetNextElement(FX_POSITION& pos, CFX_ByteString& key) const

+{

+    if (pos == NULL) {

+        return NULL;

+    }

+    CPDF_Object* p;

+    m_Map.GetNextAssoc(pos, key, (FX_LPVOID&)p);

+    return p;

+}

+CPDF_Object* CPDF_Dictionary::GetElement(FX_BSTR key) const

+{

+    if (this == NULL) {

+        return NULL;

+    }

+    CPDF_Object* p = NULL;

+    m_Map.Lookup(key, (void*&)p);

+    return p;

+}

+CPDF_Object* CPDF_Dictionary::GetElementValue(FX_BSTR key) const

+{

+    if (this == NULL) {

+        return NULL;

+    }

+    CPDF_Object* p = NULL;

+    m_Map.Lookup(key, (void*&)p);

+    return p->GetDirect();

+}

+CFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key) const

+{

+    if (this) {

+        CPDF_Object* p = NULL;

+        m_Map.Lookup(key, (void*&)p);

+        if (p) {

+            return p->GetString();

+        }

+    }

+    return CFX_ByteString();

+}

+CFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key) const

+{

+    if (this) {

+        CPDF_Object* p = NULL;

+        m_Map.Lookup(key, (void*&)p);

+        if (p) {

+            return p->GetConstString();

+        }

+    }

+    return CFX_ByteStringC();

+}

+CFX_WideString CPDF_Dictionary::GetUnicodeText(FX_BSTR key, CFX_CharMap* pCharMap) const

+{

+    if (this) {

+        CPDF_Object* p = NULL;

+        m_Map.Lookup(key, (void*&)p);

+        if (p) {

+            if(p->GetType() == PDFOBJ_REFERENCE) {

+                p = ((CPDF_Reference*)p)->GetDirect();

+                return p->GetUnicodeText(pCharMap);

+            } else {

+                return p->GetUnicodeText(pCharMap);

+            }

+        }

+    }

+    return CFX_WideString();

+}

+CFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key, FX_BSTR def) const

+{

+    if (this) {

+        CPDF_Object* p = NULL;

+        m_Map.Lookup(key, (void*&)p);

+        if (p) {

+            return p->GetString();

+        }

+    }

+    return CFX_ByteString(def);

+}

+CFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key, FX_BSTR def) const

+{

+    if (this) {

+        CPDF_Object* p = NULL;

+        m_Map.Lookup(key, (void*&)p);

+        if (p) {

+            return p->GetConstString();

+        }

+    }

+    return CFX_ByteStringC(def);

+}

+int CPDF_Dictionary::GetInteger(FX_BSTR key) const

+{

+    if (this) {

+        CPDF_Object* p = NULL;

+        m_Map.Lookup(key, (void*&)p);

+        if (p) {

+            return p->GetInteger();

+        }

+    }

+    return 0;

+}

+int CPDF_Dictionary::GetInteger(FX_BSTR key, int def) const

+{

+    if (this) {

+        CPDF_Object* p = NULL;

+        m_Map.Lookup(key, (void*&)p);

+        if (p) {

+            return p->GetInteger();

+        }

+    }

+    return def;

+}

+FX_FLOAT CPDF_Dictionary::GetNumber(FX_BSTR key) const

+{

+    if (this) {

+        CPDF_Object* p = NULL;

+        m_Map.Lookup(key, (void*&)p);

+        if (p) {

+            return p->GetNumber();

+        }

+    }

+    return 0;

+}

+FX_BOOL CPDF_Dictionary::GetBoolean(FX_BSTR key, FX_BOOL bDefault) const

+{

+    if (this) {

+        CPDF_Object* p = NULL;

+        m_Map.Lookup(key, (void*&)p);

+        if (p && p->GetType() == PDFOBJ_BOOLEAN) {

+            return p->GetInteger();

+        }

+    }

+    return bDefault;

+}

+CPDF_Dictionary* CPDF_Dictionary::GetDict(FX_BSTR key) const

+{

+    CPDF_Object* p = GetElementValue(key);

+    if (p == NULL) {

+        return NULL;

+    } else if (p->GetType() == PDFOBJ_DICTIONARY) {

+        return (CPDF_Dictionary*)p;

+    } else if (p->GetType() == PDFOBJ_STREAM) {

+        return ((CPDF_Stream*)p)->GetDict();

+    }

+    return NULL;

+}

+CPDF_Array* CPDF_Dictionary::GetArray(FX_BSTR key) const

+{

+    CPDF_Object* p = GetElementValue(key);

+    if (p == NULL || p->GetType() != PDFOBJ_ARRAY) {

+        return NULL;

+    }

+    return (CPDF_Array*)p;

+}

+CPDF_Stream* CPDF_Dictionary::GetStream(FX_BSTR key) const

+{

+    CPDF_Object* p = GetElementValue(key);

+    if (p == NULL || p->GetType() != PDFOBJ_STREAM) {

+        return NULL;

+    }

+    return (CPDF_Stream*)p;

+}

+CFX_FloatRect CPDF_Dictionary::GetRect(FX_BSTR key) const

+{

+    CFX_FloatRect rect;

+    CPDF_Array* pArray = GetArray(key);

+    if (pArray) {

+        rect = pArray->GetRect();

+    }

+    return rect;

+}

+CFX_AffineMatrix CPDF_Dictionary::GetMatrix(FX_BSTR key) const

+{

+    CFX_AffineMatrix matrix;

+    CPDF_Array* pArray = GetArray(key);

+    if (pArray) {

+        matrix = pArray->GetMatrix();

+    }

+    return matrix;

+}

+FX_BOOL CPDF_Dictionary::KeyExist(FX_BSTR key) const

+{

+    if (this == NULL) {

+        return FALSE;

+    }

+    FX_LPVOID value;

+    return m_Map.Lookup(key, value);

+}

+void CPDF_Dictionary::SetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)

+{

+    ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);

+    CPDF_Object* p = NULL;

+    m_Map.Lookup(key, (void*&)p);

+    if (p == pObj) {

+        return;

+    }

+    if (p) {

+        p->Release();

+    }

+    if (pObj) {

+        if (pObj->GetObjNum()) {

+            ASSERT(pObjs != NULL);

+            pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());

+        }

+        m_Map.SetAt(key, pObj);

+    } else {

+        m_Map.RemoveKey(key);

+    }

+}

+void CPDF_Dictionary::AddValue(FX_BSTR key, CPDF_Object* pObj)

+{

+    ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);

+    m_Map.AddValue(key, pObj);

+}

+void CPDF_Dictionary::RemoveAt(FX_BSTR key)

+{

+    ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);

+    CPDF_Object* p = NULL;

+    m_Map.Lookup(key, (void*&)p);

+    if (p == NULL) {

+        return;

+    }

+    p->Release();

+    m_Map.RemoveKey(key);

+}

+void CPDF_Dictionary::ReplaceKey(FX_BSTR oldkey, FX_BSTR newkey)

+{

+    ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);

+    CPDF_Object* p = NULL;

+    m_Map.Lookup(oldkey, (void*&)p);

+    if (p == NULL) {

+        return;

+    }

+    m_Map.RemoveKey(oldkey);

+    m_Map.SetAt(newkey, p);

+}

+FX_BOOL CPDF_Dictionary::Identical(CPDF_Dictionary* pOther) const

+{

+    if (this == NULL) {

+        if (pOther == NULL) {

+            return TRUE;

+        }

+        return FALSE;

+    }

+    if (pOther == NULL) {

+        return FALSE;

+    }

+    if (m_Map.GetCount() != pOther->m_Map.GetCount()) {

+        return FALSE;

+    }

+    FX_POSITION pos = m_Map.GetStartPosition();

+    while (pos) {

+        CFX_ByteString key;

+        FX_LPVOID value;

+        m_Map.GetNextAssoc(pos, key, value);

+        if (!((CPDF_Object*)value)->IsIdentical(pOther->GetElement(key))) {

+            return FALSE;

+        }

+    }

+    return TRUE;

+}

+void CPDF_Dictionary::SetAtInteger(FX_BSTR key, int i)

+{

+    SetAt(key, FX_NEW CPDF_Number(i));

+}

+void CPDF_Dictionary::SetAtName(FX_BSTR key, const CFX_ByteString& name)

+{

+    SetAt(key, FX_NEW CPDF_Name(name));

+}

+void CPDF_Dictionary::SetAtString(FX_BSTR key, const CFX_ByteString& str)

+{

+    SetAt(key, FX_NEW CPDF_String(str));

+}

+void CPDF_Dictionary::SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum)

+{

+    SetAt(key, FX_NEW CPDF_Reference(pDoc, objnum));

+}

+void CPDF_Dictionary::AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum)

+{

+    AddValue(key, FX_NEW CPDF_Reference(pDoc, objnum));

+}

+void CPDF_Dictionary::SetAtNumber(FX_BSTR key, FX_FLOAT f)

+{

+    CPDF_Number* pNumber = FX_NEW CPDF_Number;

+    pNumber->SetNumber(f);

+    SetAt(key, pNumber);

+}

+void CPDF_Dictionary::SetAtBoolean(FX_BSTR key, FX_BOOL bValue)

+{

+    SetAt(key, FX_NEW CPDF_Boolean(bValue));

+}

+void CPDF_Dictionary::SetAtRect(FX_BSTR key, const CFX_FloatRect& rect)

+{

+    CPDF_Array* pArray = FX_NEW CPDF_Array;

+    pArray->AddNumber(rect.left);

+    pArray->AddNumber(rect.bottom);

+    pArray->AddNumber(rect.right);

+    pArray->AddNumber(rect.top);

+    SetAt(key, pArray);

+}

+void CPDF_Dictionary::SetAtMatrix(FX_BSTR key, const CFX_AffineMatrix& matrix)

+{

+    CPDF_Array* pArray = FX_NEW CPDF_Array;

+    pArray->AddNumber16(matrix.a);

+    pArray->AddNumber16(matrix.b);

+    pArray->AddNumber16(matrix.c);

+    pArray->AddNumber16(matrix.d);

+    pArray->AddNumber(matrix.e);

+    pArray->AddNumber(matrix.f);

+    SetAt(key, pArray);

+}

+CPDF_Stream::CPDF_Stream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)

+{

+    m_Type = PDFOBJ_STREAM;

+    m_pDict = pDict;

+    m_dwSize = size;

+    m_GenNum = (FX_DWORD) - 1;

+    m_pDataBuf = pData;

+    m_pCryptoHandler = NULL;

+}

+CPDF_Stream::~CPDF_Stream()

+{

+    if (m_GenNum == (FX_DWORD) - 1 && m_pDataBuf != NULL) {

+        FX_Free(m_pDataBuf);

+    }

+    if (m_pDict) {

+        m_pDict->Release();

+    }

+}

+void CPDF_Stream::InitStream(CPDF_Dictionary* pDict)

+{

+    if (pDict) {

+        if (m_pDict) {

+            m_pDict->Release();

+        }

+        m_pDict = pDict;

+    }

+    if (m_GenNum == (FX_DWORD) - 1) {

+        if (m_pDataBuf) {

+            FX_Free(m_pDataBuf);

+        }

+    }

+    m_GenNum = 0;

+    m_pFile = NULL;

+    m_pCryptoHandler = NULL;

+    m_FileOffset = 0;

+}

+void CPDF_Stream::InitStream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)

+{

+    InitStream(pDict);

+    m_GenNum = (FX_DWORD) - 1;

+    m_pDataBuf = FX_Alloc(FX_BYTE, size);

+    if (pData) {

+        FXSYS_memcpy32(m_pDataBuf, pData, size);

+    }

+    m_dwSize = size;

+    if (m_pDict) {

+        m_pDict->SetAtInteger(FX_BSTRC("Length"), size);

+    }

+}

+void CPDF_Stream::SetData(FX_LPCBYTE pData, FX_DWORD size, FX_BOOL bCompressed, FX_BOOL bKeepBuf)

+{

+    if (m_GenNum == (FX_DWORD) - 1) {

+        if (m_pDataBuf) {

+            FX_Free(m_pDataBuf);

+        }

+    } else {

+        m_GenNum = (FX_DWORD) - 1;

+        m_pCryptoHandler = NULL;

+    }

+    if (bKeepBuf) {

+        m_pDataBuf = (FX_LPBYTE)pData;

+    } else {

+        m_pDataBuf = FX_Alloc(FX_BYTE, size);

+        if (pData) {

+            FXSYS_memcpy32(m_pDataBuf, pData, size);

+        }

+    }

+    m_dwSize = size;

+    if (m_pDict == NULL) {

+        m_pDict = FX_NEW CPDF_Dictionary;

+    }

+    m_pDict->SetAtInteger(FX_BSTRC("Length"), size);

+    if (!bCompressed) {

+        m_pDict->RemoveAt(FX_BSTRC("Filter"));

+        m_pDict->RemoveAt(FX_BSTRC("DecodeParms"));

+    }

+}

+FX_BOOL CPDF_Stream::ReadRawData(FX_FILESIZE offset, FX_LPBYTE buf, FX_DWORD size) const

+{

+    if ((m_GenNum != (FX_DWORD) - 1) && m_pFile) {

+        return m_pFile->ReadBlock(buf, m_FileOffset + offset, size);

+    }

+    if (m_pDataBuf) {

+        FXSYS_memcpy32(buf, m_pDataBuf + offset, size);

+    }

+    return TRUE;

+}

+void CPDF_Stream::InitStream(IFX_FileRead *pFile, CPDF_Dictionary* pDict)

+{

+    InitStream(pDict);

+    m_pFile = pFile;

+    m_dwSize = (FX_DWORD)pFile->GetSize();

+    if (m_pDict) {

+        m_pDict->SetAtInteger(FX_BSTRC("Length"), m_dwSize);

+    }

+}

+FX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const

+{

+    if (!m_pDict->Identical(pOther->m_pDict)) {

+        return FALSE;

+    }

+    if (m_dwSize != pOther->m_dwSize) {

+        return FALSE;

+    }

+    if (m_GenNum != (FX_DWORD) - 1 && pOther->m_GenNum != (FX_DWORD) - 1) {

+        if (m_pFile == pOther->m_pFile && m_pFile == NULL) {

+            return TRUE;

+        }

+        if (!m_pFile || !pOther->m_pFile) {

+            return FALSE;

+        }

+        FX_BYTE srcBuf[1024];

+        FX_BYTE destBuf[1024];

+        FX_DWORD size = m_dwSize;

+        FX_DWORD srcOffset = m_FileOffset;

+        FX_DWORD destOffset = pOther->m_FileOffset;

+        if (m_pFile == pOther->m_pFile && srcOffset == destOffset) {

+            return TRUE;

+        }

+        while (size > 0) {

+            FX_DWORD actualSize = size > 1024 ? 1024 : size;

+            m_pFile->ReadBlock(srcBuf, srcOffset, actualSize);

+            pOther->m_pFile->ReadBlock(destBuf, destOffset, actualSize);

+            if (FXSYS_memcmp32(srcBuf, destBuf, actualSize) != 0) {

+                return FALSE;

+            }

+            size -= actualSize;

+            srcOffset += actualSize;

+            destOffset += actualSize;

+        }

+        return TRUE;

+    }

+    if (m_GenNum != (FX_DWORD) - 1 || pOther->m_GenNum != (FX_DWORD) - 1) {

+        IFX_FileRead* pFile = NULL;

+        FX_LPBYTE pBuf = NULL;

+        FX_DWORD offset = 0;

+        if (m_GenNum != (FX_DWORD) - 1) {

+            pFile = m_pFile;

+            pBuf = pOther->m_pDataBuf;

+            offset = m_FileOffset;

+        }

+        if (pOther->m_GenNum != (FX_DWORD) - 1) {

+            pFile = pOther->m_pFile;

+            pBuf = m_pDataBuf;

+            offset = pOther->m_FileOffset;

+        }

+        if (NULL == pBuf) {

+            return FALSE;

+        }

+        FX_BYTE srcBuf[1024];

+        FX_DWORD size = m_dwSize;

+        while (size > 0) {

+            FX_DWORD actualSize = size > 1024 ? 1024 : size;

+            m_pFile->ReadBlock(srcBuf, offset, actualSize);

+            if (FXSYS_memcmp32(srcBuf, pBuf, actualSize) != 0) {

+                return FALSE;

+            }

+            pBuf += actualSize;

+            size -= actualSize;

+            offset += actualSize;

+        }

+        return TRUE;

+    }

+    return FXSYS_memcmp32(m_pDataBuf, pOther->m_pDataBuf, m_dwSize) == 0;

+}

+CPDF_Stream* CPDF_Stream::Clone(FX_BOOL bDirect, FPDF_LPFCloneStreamCallback lpfCallback, FX_LPVOID pUserData) const

+{

+    CPDF_Dictionary *pCloneDict = (CPDF_Dictionary*)m_pDict->Clone(bDirect);

+    IFX_FileStream *pFS = NULL;

+    if (lpfCallback) {

+        pFS = lpfCallback((CPDF_Stream*)this, pUserData);

+    }

+    if (!pFS) {

+        CPDF_StreamAcc acc;

+        acc.LoadAllData(this, TRUE);

+        FX_DWORD streamSize = acc.GetSize();

+        CPDF_Stream* pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, pCloneDict);

+        return pObj;

+    }

+    CPDF_Stream* pObj = FX_NEW CPDF_Stream(NULL, 0, NULL);

+    CPDF_StreamFilter *pSF = GetStreamFilter(TRUE);

+    if (pSF) {

+        FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, 4096);

+        FX_DWORD dwRead;

+        do {

+            dwRead = pSF->ReadBlock(pBuf, 4096);

+            if (dwRead) {

+                pFS->WriteBlock(pBuf, dwRead);

+            }

+        } while (dwRead == 4096);

+        pFS->Flush();

+        FX_Free(pBuf);

+        delete pSF;

+    }

+    pObj->InitStream((IFX_FileRead*)pFS, pCloneDict);

+    return pObj;

+}

+extern FX_BOOL PDF_DataDecode(FX_LPCBYTE src_buf, FX_DWORD src_size, const CPDF_Dictionary* pDict,

+                              FX_LPBYTE& dest_buf, FX_DWORD& dest_size, CFX_ByteString& ImageEncoding,

+                              CPDF_Dictionary*& pImageParms, FX_DWORD estimated_size, FX_BOOL bImageAcc);

+CPDF_StreamAcc::CPDF_StreamAcc()

+{

+    m_bNewBuf = FALSE;

+    m_pData = NULL;

+    m_dwSize = 0;

+    m_pImageParam = NULL;

+    m_pStream = NULL;

+    m_pSrcData = NULL;

+}

+void CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream, FX_BOOL bRawAccess, FX_DWORD estimated_size,

+                                 FX_BOOL bImageAcc)

+{

+    if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {

+        return;

+    }

+    m_pStream = pStream;

+    if (pStream->IsMemoryBased() &&

+            (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess)) {

+        m_dwSize = pStream->m_dwSize;

+        m_pData = (FX_LPBYTE)pStream->m_pDataBuf;

+        return;

+    }

+    FX_LPBYTE pSrcData;

+    FX_DWORD dwSrcSize = pStream->m_dwSize;

+    if (dwSrcSize == 0) {

+        return;

+    }

+    if (!pStream->IsMemoryBased()) {

+        pSrcData = m_pSrcData = FX_Alloc(FX_BYTE, dwSrcSize);

+        if (!pSrcData || !pStream->ReadRawData(0, pSrcData, dwSrcSize)) {

+            return;

+        }

+    } else {

+        pSrcData = pStream->m_pDataBuf;

+    }

+    FX_LPBYTE pDecryptedData;

+    FX_DWORD dwDecryptedSize;

+    if (pStream->m_pCryptoHandler) {

+        CFX_BinaryBuf dest_buf;

+        dest_buf.EstimateSize(pStream->m_pCryptoHandler->DecryptGetSize(dwSrcSize));

+        FX_LPVOID context = pStream->m_pCryptoHandler->DecryptStart(pStream->GetObjNum(), pStream->m_GenNum);

+        pStream->m_pCryptoHandler->DecryptStream(context, pSrcData, dwSrcSize, dest_buf);

+        pStream->m_pCryptoHandler->DecryptFinish(context, dest_buf);

+        pDecryptedData = dest_buf.GetBuffer();

+        dwDecryptedSize = dest_buf.GetSize();

+        dest_buf.DetachBuffer();

+    } else {

+        pDecryptedData = pSrcData;

+        dwDecryptedSize = dwSrcSize;

+    }

+    if (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess) {

+        m_pData = pDecryptedData;

+        m_dwSize = dwDecryptedSize;

+    } else {

+        FX_BOOL bRet = PDF_DataDecode(pDecryptedData, dwDecryptedSize, m_pStream->GetDict(),

+                                      m_pData, m_dwSize, m_ImageDecoder, m_pImageParam, estimated_size, bImageAcc);

+        if (!bRet) {

+            m_pData = pDecryptedData;

+            m_dwSize = dwDecryptedSize;

+        }

+    }

+    if (pSrcData != pStream->m_pDataBuf && pSrcData != m_pData) {

+        FX_Free(pSrcData);

+    }

+    if (pDecryptedData != pSrcData && pDecryptedData != m_pData) {

+        FX_Free(pDecryptedData);

+    }

+    m_pSrcData = NULL;

+    m_bNewBuf = m_pData != pStream->m_pDataBuf;

+}

+CPDF_StreamAcc::~CPDF_StreamAcc()

+{

+    if (m_bNewBuf && m_pData) {

+        FX_Free(m_pData);

+    }

+    if (m_pSrcData) {

+        FX_Free(m_pSrcData);

+    }

+}

+FX_LPCBYTE CPDF_StreamAcc::GetData() const

+{

+    if (m_bNewBuf) {

+        return m_pData;

+    }

+    if (!m_pStream) {

+        return NULL;

+    }

+    return m_pStream->m_pDataBuf;

+}

+FX_DWORD CPDF_StreamAcc::GetSize() const

+{

+    if (m_bNewBuf) {

+        return m_dwSize;

+    }

+    if (!m_pStream) {

+        return 0;

+    }

+    return m_pStream->m_dwSize;

+}

+FX_LPBYTE CPDF_StreamAcc::DetachData()

+{

+    if (m_bNewBuf) {

+        FX_LPBYTE p = m_pData;

+        m_pData = NULL;

+        m_dwSize = 0;

+        return p;

+    }

+    FX_LPBYTE p = FX_Alloc(FX_BYTE, m_dwSize);

+    if (p == NULL) {

+        return NULL;

+    }

+    FXSYS_memcpy32(p, m_pData, m_dwSize);

+    return p;

+}

+void CPDF_Reference::SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)

+{

+    m_pObjList = pDoc;

+    m_RefObjNum = objnum;

+}

+CPDF_IndirectObjects::CPDF_IndirectObjects(IPDF_DocParser* pParser)

+{

+    m_pParser = pParser;

+    m_IndirectObjs.InitHashTable(1013);

+    if (pParser) {

+        m_LastObjNum = m_pParser->GetLastObjNum();

+    } else {

+        m_LastObjNum = 0;

+    }

+}

+CPDF_IndirectObjects::~CPDF_IndirectObjects()

+{

+    FX_POSITION pos = m_IndirectObjs.GetStartPosition();

+    while (pos) {

+        FX_LPVOID key, value;

+        m_IndirectObjs.GetNextAssoc(pos, key, value);

+        ((CPDF_Object*)value)->Destroy();

+    }

+}

+CPDF_Object* CPDF_IndirectObjects::GetIndirectObject(FX_DWORD objnum, struct PARSE_CONTEXT* pContext)

+{

+    if (objnum == 0) {

+        return NULL;

+    }

+    FX_LPVOID value;

+    {

+        if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {

+            if (((CPDF_Object*)value)->GetObjNum() == -1) {

+                return NULL;

+            }

+            return (CPDF_Object*)value;

+        }

+    }

+    CPDF_Object* pObj = NULL;

+    if (m_pParser) {

+        pObj = m_pParser->ParseIndirectObject(this, objnum, pContext);

+    }

+    if (pObj == NULL) {

+        return NULL;

+    }

+    pObj->m_ObjNum = objnum;

+    if (m_LastObjNum < objnum) {

+        m_LastObjNum = objnum;

+    }

+    if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {

+        if (value) {

+            ((CPDF_Object *)value)->Destroy();

+        }

+    }

+    m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pObj);

+    return pObj;

+}

+int CPDF_IndirectObjects::GetIndirectType(FX_DWORD objnum)

+{

+    FX_LPVOID value;

+    if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {

+        return ((CPDF_Object*)value)->GetType();

+    }

+    if (m_pParser) {

+        PARSE_CONTEXT context;

+        FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));

+        context.m_Flags = PDFPARSE_TYPEONLY;

+        return (int)(FX_UINTPTR)m_pParser->ParseIndirectObject(this, objnum, &context);

+    }

+    return 0;

+}

+FX_DWORD CPDF_IndirectObjects::AddIndirectObject(CPDF_Object* pObj)

+{

+    if (pObj->m_ObjNum) {

+        return pObj->m_ObjNum;

+    }

+    m_LastObjNum ++;

+    m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)m_LastObjNum, pObj);

+    pObj->m_ObjNum = m_LastObjNum;

+    return m_LastObjNum;

+}

+void CPDF_IndirectObjects::ReleaseIndirectObject(FX_DWORD objnum)

+{

+    FX_LPVOID value;

+    if (!m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {

+        return;

+    }

+    if (((CPDF_Object*)value)->GetObjNum() == -1) {

+        return;

+    }

+    ((CPDF_Object*)value)->Destroy();

+    m_IndirectObjs.RemoveKey((FX_LPVOID)(FX_UINTPTR)objnum);

+}

+void CPDF_IndirectObjects::InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj)

+{

+    if (objnum == 0 || pObj == NULL) {

+        return;

+    }

+    FX_LPVOID value;

+    if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {

+        ((CPDF_Object*)value)->Destroy();

+    }

+    pObj->m_ObjNum = objnum;

+    m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pObj);

+    if (m_LastObjNum < objnum) {

+        m_LastObjNum = objnum;

+    }

+}

+FX_DWORD CPDF_IndirectObjects::GetLastObjNum() const

+{

+    return m_LastObjNum;

+}

diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
new file mode 100644
index 0000000..b3e587a
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
@@ -0,0 +1,4378 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_parser.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fpdfapi/fpdf_page.h"

+#include "../fpdf_page/pageint.h"

+#include <limits.h>

+#define _PARSER_OBJECT_LEVLE_		64

+extern const FX_LPCSTR _PDF_CharType;

+FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict)

+{

+    CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC("Type"));

+    if (!pType) {

+        pType = pDict->GetElementValue(FX_BSTRC("FT"));

+        if (!pType) {

+            return FALSE;

+        }

+    }

+    if (pType->GetString() == FX_BSTRC("Sig")) {

+        return TRUE;

+    }

+    return FALSE;

+}

+static FX_INT32 _CompareDWord(const void* p1, const void* p2)

+{

+    return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);

+}

+static int _CompareFileSize(const void* p1, const void* p2)

+{

+    FX_FILESIZE ret = (*(FX_FILESIZE*)p1) - (*(FX_FILESIZE*)p2);

+    if (ret > 0) {

+        return 1;

+    }

+    if (ret < 0) {

+        return -1;

+    }

+    return 0;

+}

+CPDF_Parser::CPDF_Parser()

+{

+    m_pDocument = NULL;

+    m_pTrailer = NULL;

+    m_pEncryptDict = NULL;

+    m_pSecurityHandler = NULL;

+    m_pLinearized = NULL;

+    m_dwFirstPageNo = 0;

+    m_dwXrefStartObjNum = 0;

+    m_bOwnFileRead = TRUE;

+    m_bForceUseSecurityHandler = FALSE;

+}

+CPDF_Parser::~CPDF_Parser()

+{

+    CloseParser(FALSE);

+}

+FX_DWORD CPDF_Parser::GetLastObjNum()

+{

+    FX_DWORD dwSize = m_CrossRef.GetSize();

+    return dwSize ? dwSize - 1 : 0;

+}

+void CPDF_Parser::SetEncryptDictionary(CPDF_Dictionary* pDict)

+{

+    m_pEncryptDict = pDict;

+}

+void CPDF_Parser::CloseParser(FX_BOOL bReParse)

+{

+    m_bVersionUpdated = FALSE;

+    if (m_pDocument && !bReParse) {

+        delete m_pDocument;

+        m_pDocument = NULL;

+    }

+    if (m_pTrailer) {

+        m_pTrailer->Release();

+        m_pTrailer = NULL;

+    }

+    ReleaseEncryptHandler();

+    SetEncryptDictionary(NULL);

+    if (m_bOwnFileRead && m_Syntax.m_pFileAccess != NULL) {

+        m_Syntax.m_pFileAccess->Release();

+        m_Syntax.m_pFileAccess = NULL;

+    }

+    FX_POSITION pos = m_ObjectStreamMap.GetStartPosition();

+    while (pos) {

+        FX_LPVOID objnum;

+        CPDF_StreamAcc* pStream;

+        m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream);

+        delete pStream;

+    }

+    m_ObjectStreamMap.RemoveAll();

+    m_SortedOffset.RemoveAll();

+    m_CrossRef.RemoveAll();

+    m_V5Type.RemoveAll();

+    m_ObjVersion.RemoveAll();

+    FX_INT32 iLen = m_Trailers.GetSize();

+    for (FX_INT32 i = 0; i < iLen; ++i) {

+        m_Trailers.GetAt(i)->Release();

+    }

+    m_Trailers.RemoveAll();

+    if (m_pLinearized) {

+        m_pLinearized->Release();

+        m_pLinearized = NULL;

+    }

+}

+static FX_INT32 GetHeaderOffset(IFX_FileRead* pFile)

+{

+    FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025);

+    FX_BYTE buf[4];

+    FX_INT32 offset = 0;

+    while (1) {

+        if (!pFile->ReadBlock(buf, offset, 4)) {

+            return -1;

+        }

+        if (*(FX_DWORD*)buf == tag) {

+            return offset;

+        }

+        offset ++;

+        if (offset > 1024) {

+            return -1;

+        }

+    }

+    return -1;

+}

+FX_DWORD CPDF_Parser::StartParse(FX_LPCSTR filename, FX_BOOL bReParse)

+{

+    IFX_FileRead* pFileAccess = FX_CreateFileRead(filename);

+    if (!pFileAccess) {

+        return PDFPARSE_ERROR_FILE;

+    }

+    return StartParse(pFileAccess, bReParse);

+}

+FX_DWORD CPDF_Parser::StartParse(FX_LPCWSTR filename, FX_BOOL bReParse)

+{

+    IFX_FileRead* pFileAccess = FX_CreateFileRead(filename);

+    if (!pFileAccess) {

+        return PDFPARSE_ERROR_FILE;

+    }

+    return StartParse(pFileAccess, bReParse);

+}

+CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler();

+CPDF_SecurityHandler* FPDF_CreatePubKeyHandler(void*);

+FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse, FX_BOOL bOwnFileRead)

+{

+    CloseParser(bReParse);

+    m_bXRefStream = FALSE;

+    m_LastXRefOffset = 0;

+    m_bOwnFileRead = bOwnFileRead;

+    FX_INT32 offset = GetHeaderOffset(pFileAccess);

+    if (offset == -1) {

+        if (bOwnFileRead && pFileAccess) {

+            pFileAccess->Release();

+        }

+        return PDFPARSE_ERROR_FORMAT;

+    }

+    m_Syntax.InitParser(pFileAccess, offset);

+    FX_BYTE ch;

+    m_Syntax.GetCharAt(5, ch);

+    m_FileVersion = (ch - '0') * 10;

+    m_Syntax.GetCharAt(7, ch);

+    m_FileVersion += ch - '0';

+    m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9);

+    if (!bReParse) {

+        m_pDocument = FX_NEW CPDF_Document(this);

+    }

+    FX_BOOL bXRefRebuilt = FALSE;

+    if (m_Syntax.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, 4096)) {

+        FX_FILESIZE startxref_offset = m_Syntax.SavePos();

+        FX_LPVOID pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+        if (pResult == NULL) {

+            m_SortedOffset.Add(startxref_offset);

+        }

+        m_Syntax.GetKeyword();

+        FX_BOOL bNumber;

+        CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber);

+        if (!bNumber) {

+            return PDFPARSE_ERROR_FORMAT;

+        }

+        m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);

+        if (!LoadAllCrossRefV4(m_LastXRefOffset) && !LoadAllCrossRefV5(m_LastXRefOffset)) {

+            if (!RebuildCrossRef()) {

+                return PDFPARSE_ERROR_FORMAT;

+            }

+            bXRefRebuilt = TRUE;

+            m_LastXRefOffset = 0;

+        }

+    } else {

+        if (!RebuildCrossRef()) {

+            return PDFPARSE_ERROR_FORMAT;

+        }

+        bXRefRebuilt = TRUE;

+    }

+    FX_DWORD dwRet = SetEncryptHandler();

+    if (dwRet != PDFPARSE_ERROR_SUCCESS) {

+        return dwRet;

+    }

+    m_pDocument->LoadDoc();

+    if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) {

+        if (bXRefRebuilt) {

+            return PDFPARSE_ERROR_FORMAT;

+        }

+        ReleaseEncryptHandler();

+        if (!RebuildCrossRef()) {

+            return PDFPARSE_ERROR_FORMAT;

+        }

+        dwRet = SetEncryptHandler();

+        if (dwRet != PDFPARSE_ERROR_SUCCESS) {

+            return dwRet;

+        }

+        m_pDocument->LoadDoc();

+        if (m_pDocument->GetRoot() == NULL) {

+            return PDFPARSE_ERROR_FORMAT;

+        }

+    }

+    FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+    FX_DWORD RootObjNum = GetRootObjNum();

+    if (RootObjNum == 0) {

+        ReleaseEncryptHandler();

+        RebuildCrossRef();

+        RootObjNum = GetRootObjNum();

+        if (RootObjNum == 0) {

+            return PDFPARSE_ERROR_FORMAT;

+        }

+        dwRet = SetEncryptHandler();

+        if (dwRet != PDFPARSE_ERROR_SUCCESS) {

+            return dwRet;

+        }

+    }

+    if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) {

+        CPDF_Reference* pMetadata = (CPDF_Reference*)m_pDocument->GetRoot()->GetElement(FX_BSTRC("Metadata"));

+        if (pMetadata && pMetadata->GetType() == PDFOBJ_REFERENCE) {

+            m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum();

+        }

+    }

+    return PDFPARSE_ERROR_SUCCESS;

+}

+FX_DWORD CPDF_Parser::SetEncryptHandler()

+{

+    ReleaseEncryptHandler();

+    SetEncryptDictionary(NULL);

+    if (m_pTrailer == NULL) {

+        return PDFPARSE_ERROR_FORMAT;

+    }

+    CPDF_Object* pEncryptObj = m_pTrailer->GetElement(FX_BSTRC("Encrypt"));

+    if (pEncryptObj) {

+        if (pEncryptObj->GetType() == PDFOBJ_DICTIONARY) {

+            SetEncryptDictionary((CPDF_Dictionary*)pEncryptObj);

+        } else if (pEncryptObj->GetType() == PDFOBJ_REFERENCE) {

+            pEncryptObj = m_pDocument->GetIndirectObject(((CPDF_Reference*)pEncryptObj)->GetRefObjNum());

+            if (pEncryptObj) {

+                SetEncryptDictionary(pEncryptObj->GetDict());

+            }

+        }

+    }

+    if (m_bForceUseSecurityHandler) {

+        FX_DWORD err = PDFPARSE_ERROR_HANDLER;

+        if (m_pSecurityHandler == NULL) {

+            return PDFPARSE_ERROR_HANDLER;

+        }

+        if (!m_pSecurityHandler->OnInit(this, m_pEncryptDict)) {

+            return err;

+        }

+        CPDF_CryptoHandler* pCryptoHandler = m_pSecurityHandler->CreateCryptoHandler();

+        if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler)) {

+            delete pCryptoHandler;

+            pCryptoHandler = NULL;

+            return PDFPARSE_ERROR_HANDLER;

+        }

+        m_Syntax.SetEncrypt(pCryptoHandler);

+    } else if (m_pEncryptDict) {

+        CFX_ByteString filter = m_pEncryptDict->GetString(FX_BSTRC("Filter"));

+        CPDF_SecurityHandler* pSecurityHandler = NULL;

+        FX_DWORD err = PDFPARSE_ERROR_HANDLER;

+        if (filter == FX_BSTRC("Standard")) {

+            pSecurityHandler = FPDF_CreateStandardSecurityHandler();

+            err = PDFPARSE_ERROR_PASSWORD;

+        }

+        if (pSecurityHandler == NULL) {

+            return PDFPARSE_ERROR_HANDLER;

+        }

+        if (!pSecurityHandler->OnInit(this, m_pEncryptDict)) {

+            delete pSecurityHandler;

+            pSecurityHandler = NULL;

+            return err;

+        }

+        m_pSecurityHandler = pSecurityHandler;

+        CPDF_CryptoHandler* pCryptoHandler = pSecurityHandler->CreateCryptoHandler();

+        if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler)) {

+            delete pCryptoHandler;

+            pCryptoHandler = NULL;

+            return PDFPARSE_ERROR_HANDLER;

+        }

+        m_Syntax.SetEncrypt(pCryptoHandler);

+    }

+    return PDFPARSE_ERROR_SUCCESS;

+}

+void CPDF_Parser::ReleaseEncryptHandler()

+{

+    if (m_Syntax.m_pCryptoHandler) {

+        delete m_Syntax.m_pCryptoHandler;

+        m_Syntax.m_pCryptoHandler = NULL;

+    }

+    if (m_pSecurityHandler && !m_bForceUseSecurityHandler) {

+        delete m_pSecurityHandler;

+        m_pSecurityHandler = NULL;

+    }

+}

+FX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum)

+{

+    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {

+        return 0;

+    }

+    if (m_V5Type[objnum] == 1) {

+        return m_CrossRef[objnum];

+    }

+    if (m_V5Type[objnum] == 2) {

+        return m_CrossRef[(FX_INT32)m_CrossRef[objnum]];

+    }

+    return 0;

+}

+static FX_INT32 GetDirectInteger(CPDF_Dictionary* pDict, FX_BSTR key)

+{

+    CPDF_Object* pObj = pDict->GetElement(key);

+    if (pObj == NULL) {

+        return 0;

+    }

+    if (pObj->GetType() == PDFOBJ_NUMBER) {

+        return ((CPDF_Number*)pObj)->GetInteger();

+    }

+    return 0;

+}

+static FX_BOOL CheckDirectType(CPDF_Dictionary* pDict, FX_BSTR key, FX_INT32 iType)

+{

+    CPDF_Object* pObj = pDict->GetElement(key);

+    if (!pObj) {

+        return TRUE;

+    }

+    return pObj->GetType() == iType;

+}

+FX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos)

+{

+    if (!LoadCrossRefV4(xrefpos, 0, TRUE, FALSE)) {

+        return FALSE;

+    }

+    m_pTrailer = LoadTrailerV4();

+    if (m_pTrailer == NULL) {

+        return FALSE;

+    }

+    FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size"));

+    if (xrefsize <= 0 || xrefsize > (1 << 20)) {

+        return FALSE;

+    }

+    m_CrossRef.SetSize(xrefsize);

+    m_V5Type.SetSize(xrefsize);

+    CFX_FileSizeArray CrossRefList, XRefStreamList;

+    CrossRefList.Add(xrefpos);

+    XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC("XRefStm")));

+    if (!CheckDirectType(m_pTrailer, FX_BSTRC("Prev"), PDFOBJ_NUMBER)) {

+        return FALSE;

+    }

+    FX_FILESIZE newxrefpos = GetDirectInteger(m_pTrailer, FX_BSTRC("Prev"));

+    if (newxrefpos == xrefpos) {

+        return FALSE;

+    }

+    xrefpos = newxrefpos;

+    while (xrefpos) {

+        CrossRefList.InsertAt(0, xrefpos);

+        LoadCrossRefV4(xrefpos, 0, TRUE, FALSE);

+        CPDF_Dictionary* pDict = LoadTrailerV4();

+        if (pDict == NULL) {

+            return FALSE;

+        }

+        if (!CheckDirectType(pDict, FX_BSTRC("Prev"), PDFOBJ_NUMBER)) {

+            pDict->Release();

+            return FALSE;

+        }

+        newxrefpos = GetDirectInteger(pDict, FX_BSTRC("Prev"));

+        if (newxrefpos == xrefpos) {

+            pDict->Release();

+            return FALSE;

+        }

+        xrefpos = newxrefpos;

+        XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC("XRefStm")));

+        m_Trailers.Add(pDict);

+    }

+    for (FX_INT32 i = 0; i < CrossRefList.GetSize(); i ++)

+        if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0)) {

+            return FALSE;

+        }

+    return TRUE;

+}

+FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, FX_DWORD dwObjCount)

+{

+    if (!LoadLinearizedCrossRefV4(xrefpos, dwObjCount)) {

+        return FALSE;

+    }

+    m_pTrailer = LoadTrailerV4();

+    if (m_pTrailer == NULL) {

+        return FALSE;

+    }

+    FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size"));

+    if (xrefsize == 0) {

+        return FALSE;

+    }

+    CFX_FileSizeArray CrossRefList, XRefStreamList;

+    CrossRefList.Add(xrefpos);

+    XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC("XRefStm")));

+    xrefpos = GetDirectInteger(m_pTrailer, FX_BSTRC("Prev"));

+    while (xrefpos) {

+        CrossRefList.InsertAt(0, xrefpos);

+        LoadCrossRefV4(xrefpos, 0, TRUE, FALSE);

+        CPDF_Dictionary* pDict = LoadTrailerV4();

+        if (pDict == NULL) {

+            return FALSE;

+        }

+        xrefpos = GetDirectInteger(pDict, FX_BSTRC("Prev"));

+        XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC("XRefStm")));

+        m_Trailers.Add(pDict);

+    }

+    for (FX_INT32 i = 1; i < CrossRefList.GetSize(); i ++)

+        if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0)) {

+            return FALSE;

+        }

+    return TRUE;

+}

+FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount)

+{

+    FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset;

+    m_Syntax.RestorePos(dwStartPos);

+    FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+    if (pResult == NULL) {

+        m_SortedOffset.Add(pos);

+    }

+    FX_DWORD start_objnum = 0;

+    FX_DWORD count = dwObjCount;

+    FX_FILESIZE SavedPos = m_Syntax.SavePos();

+    FX_INT32 recordsize = 20;

+    char* pBuf = FX_Alloc(char, 1024 * recordsize + 1);

+    pBuf[1024 * recordsize] = '\0';

+    FX_INT32 nBlocks = count / 1024 + 1;

+    for (FX_INT32 block = 0; block < nBlocks; block ++) {

+        FX_INT32 block_size = block == nBlocks - 1 ? count % 1024 : 1024;

+        FX_DWORD dwReadSize = block_size * recordsize;

+        if ((FX_FILESIZE)(dwStartPos + dwReadSize) > m_Syntax.m_FileLen) {

+            FX_Free(pBuf);

+            return FALSE;

+        }

+        if (!m_Syntax.ReadBlock((FX_LPBYTE)pBuf, dwReadSize)) {

+            FX_Free(pBuf);

+            return FALSE;

+        }

+        for (FX_INT32 i = 0; i < block_size; i ++) {

+            FX_DWORD objnum = start_objnum + block * 1024 + i;

+            char* pEntry = pBuf + i * recordsize;

+            if (pEntry[17] == 'f') {

+                m_CrossRef.SetAtGrow(objnum, 0);

+                m_V5Type.SetAtGrow(objnum, 0);

+            } else {

+                FX_INT32 offset = FXSYS_atoi(pEntry);

+                if (offset == 0) {

+                    for (FX_INT32 c = 0; c < 10; c ++) {

+                        if (pEntry[c] < '0' || pEntry[c] > '9') {

+                            FX_Free(pBuf);

+                            return FALSE;

+                        }

+                    }

+                }

+                m_CrossRef.SetAtGrow(objnum, offset);

+                FX_INT32 version = FXSYS_atoi(pEntry + 11);

+                if (version >= 1) {

+                    m_bVersionUpdated = TRUE;

+                }

+                m_ObjVersion.SetAtGrow(objnum, version);

+                if (m_CrossRef[objnum] < m_Syntax.m_FileLen) {

+                    FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum], m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+                    if (pResult == NULL) {

+                        m_SortedOffset.Add(m_CrossRef[objnum]);

+                    }

+                }

+                m_V5Type.SetAtGrow(objnum, 1);

+            }

+        }

+    }

+    FX_Free(pBuf);

+    m_Syntax.RestorePos(SavedPos + count * recordsize);

+    return TRUE;

+}

+FX_BOOL CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, FX_FILESIZE streampos, FX_BOOL bSkip, FX_BOOL bFirst)

+{

+    m_Syntax.RestorePos(pos);

+    if (m_Syntax.GetKeyword() != FX_BSTRC("xref")) {

+        return FALSE;

+    }

+    FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+    if (pResult == NULL) {

+        m_SortedOffset.Add(pos);

+    }

+    if (streampos) {

+        FX_LPVOID pResult = FXSYS_bsearch(&streampos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+        if (pResult == NULL) {

+            m_SortedOffset.Add(streampos);

+        }

+    }

+    while (1) {

+        FX_FILESIZE SavedPos = m_Syntax.SavePos();

+        FX_BOOL bIsNumber;

+        CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);

+        if (word.IsEmpty()) {

+            return FALSE;

+        }

+        if (!bIsNumber) {

+            m_Syntax.RestorePos(SavedPos);

+            break;

+        }

+        FX_DWORD start_objnum = FXSYS_atoi(word);

+        if (start_objnum >= (1 << 20)) {

+            return FALSE;

+        }

+        FX_DWORD count = m_Syntax.GetDirectNum();

+        m_Syntax.ToNextWord();

+        SavedPos = m_Syntax.SavePos();

+        FX_BOOL bFirstItem = FALSE;

+        FX_INT32 recordsize = 20;

+        if (bFirst) {

+            bFirstItem = TRUE;

+        }

+        m_dwXrefStartObjNum = start_objnum;

+        if (!bSkip) {

+            char* pBuf = FX_Alloc(char, 1024 * recordsize + 1);

+            pBuf[1024 * recordsize] = '\0';

+            FX_INT32 nBlocks = count / 1024 + 1;

+            FX_BOOL bFirstBlock = TRUE;

+            for (FX_INT32 block = 0; block < nBlocks; block ++) {

+                FX_INT32 block_size = block == nBlocks - 1 ? count % 1024 : 1024;

+                m_Syntax.ReadBlock((FX_LPBYTE)pBuf, block_size * recordsize);

+                for (FX_INT32 i = 0; i < block_size; i ++) {

+                    FX_DWORD objnum = start_objnum + block * 1024 + i;

+                    char* pEntry = pBuf + i * recordsize;

+                    if (pEntry[17] == 'f') {

+                        if (bFirstItem) {

+                            objnum = 0;

+                            bFirstItem = FALSE;

+                        }

+                        if (bFirstBlock) {

+                            FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);

+                            FX_INT32 version = FXSYS_atoi(pEntry + 11);

+                            if (offset == 0 && version == 65535 && start_objnum != 0) {

+                                start_objnum--;

+                                objnum = 0;

+                            }

+                        }

+                        m_CrossRef.SetAtGrow(objnum, 0);

+                        m_V5Type.SetAtGrow(objnum, 0);

+                    } else {

+                        FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);

+                        if (offset == 0) {

+                            for (FX_INT32 c = 0; c < 10; c ++) {

+                                if (pEntry[c] < '0' || pEntry[c] > '9') {

+                                    FX_Free(pBuf);

+                                    return FALSE;

+                                }

+                            }

+                        }

+                        m_CrossRef.SetAtGrow(objnum, offset);

+                        FX_INT32 version = FXSYS_atoi(pEntry + 11);

+                        if (version >= 1) {

+                            m_bVersionUpdated = TRUE;

+                        }

+                        m_ObjVersion.SetAtGrow(objnum, version);

+                        if (m_CrossRef[objnum] < m_Syntax.m_FileLen) {

+                            FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum], m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+                            if (pResult == NULL) {

+                                m_SortedOffset.Add(m_CrossRef[objnum]);

+                            }

+                        }

+                        m_V5Type.SetAtGrow(objnum, 1);

+                    }

+                    if (bFirstBlock) {

+                        bFirstBlock = FALSE;

+                    }

+                }

+            }

+            FX_Free(pBuf);

+        }

+        m_Syntax.RestorePos(SavedPos + count * recordsize);

+    }

+    if (streampos)

+        if (!LoadCrossRefV5(streampos, streampos, FALSE)) {

+            return FALSE;

+        }

+    return TRUE;

+}

+FX_BOOL CPDF_Parser::LoadAllCrossRefV5(FX_FILESIZE xrefpos)

+{

+    if (!LoadCrossRefV5(xrefpos, xrefpos, TRUE)) {

+        return FALSE;

+    }

+    while (xrefpos)

+        if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {

+            return FALSE;

+        }

+    m_ObjectStreamMap.InitHashTable(101, FALSE);

+    m_bXRefStream = TRUE;

+    return TRUE;

+}

+FX_BOOL CPDF_Parser::RebuildCrossRef()

+{

+    m_CrossRef.RemoveAll();

+    m_V5Type.RemoveAll();

+    m_SortedOffset.RemoveAll();

+    m_ObjVersion.RemoveAll();

+    if (m_pTrailer) {

+        m_pTrailer->Release();

+        m_pTrailer = NULL;

+    }

+    FX_INT32 status = 0;

+    FX_INT32 inside_index = 0;

+    FX_DWORD objnum, gennum;

+    FX_INT32 depth = 0;

+    FX_LPBYTE buffer = FX_Alloc(FX_BYTE, 4096);

+    FX_FILESIZE pos = m_Syntax.m_HeaderOffset;

+    FX_FILESIZE start_pos, start_pos1;

+    FX_FILESIZE last_obj = -1, last_xref = -1, last_trailer = -1;

+    FX_BOOL bInUpdate = FALSE;

+    while (pos < m_Syntax.m_FileLen) {

+        FX_BOOL bOverFlow = FALSE;

+        FX_DWORD size = (FX_DWORD)(m_Syntax.m_FileLen - pos);

+        if (size > 4096) {

+            size = 4096;

+        }

+        if (!m_Syntax.m_pFileAccess->ReadBlock(buffer, pos, size)) {

+            break;

+        }

+        for (FX_DWORD i = 0; i < size; i ++) {

+            FX_BYTE byte = buffer[i];

+            FX_LPBYTE pData = buffer + i;

+            switch (status) {

+                case 0:

+                    if (_PDF_CharType[byte] == 'W') {

+                        status = 1;

+                    }

+                    if (byte <= '9' && byte >= '0') {

+                        --i;

+                        status = 1;

+                    }

+                    if (byte == '%') {

+                        inside_index = 0;

+                        status = 9;

+                    }

+                    if (byte == '(') {

+                        status = 10;

+                        depth = 1;

+                    }

+                    if (byte == '<') {

+                        inside_index = 1;

+                        status = 11;

+                    }

+                    if (byte == '\\') {

+                        status = 13;

+                    }

+                    if (byte == 't') {

+                        status = 7;

+                        inside_index = 1;

+                    }

+                    break;

+                case 1:

+                    if (_PDF_CharType[byte] == 'W') {

+                        break;

+                    } else if (byte <= '9' && byte >= '0') {

+                        start_pos = pos + i;

+                        status = 2;

+                        objnum = byte - '0';

+                    } else if (byte == 't') {

+                        status = 7;

+                        inside_index = 1;

+                    } else if (byte == 'x') {

+                        status = 8;

+                        inside_index = 1;

+                    } else {

+                        --i;

+                        status = 0;

+                    }

+                    break;

+                case 2:

+                    if (byte <= '9' && byte >= '0') {

+                        objnum = objnum * 10 + byte - '0';

+                        break;

+                    } else if (_PDF_CharType[byte] == 'W') {

+                        status = 3;

+                    } else {

+                        --i;

+                        status = 14;

+                        inside_index = 0;

+                    }

+                    break;

+                case 3:

+                    if (byte <= '9' && byte >= '0') {

+                        start_pos1 = pos + i;

+                        status = 4;

+                        gennum = byte - '0';

+                    } else if (_PDF_CharType[byte] == 'W') {

+                        break;

+                    } else if (byte == 't') {

+                        status = 7;

+                        inside_index = 1;

+                    } else {

+                        --i;

+                        status = 0;

+                    }

+                    break;

+                case 4:

+                    if (byte <= '9' && byte >= '0') {

+                        gennum = gennum * 10 + byte - '0';

+                        break;

+                    } else if (_PDF_CharType[byte] == 'W') {

+                        status = 5;

+                    } else {

+                        --i;

+                        status = 0;

+                    }

+                    break;

+                case 5:

+                    if (byte == 'o') {

+                        status = 6;

+                        inside_index = 1;

+                    } else if (_PDF_CharType[byte] == 'W') {

+                        break;

+                    } else if (byte <= '9' && byte >= '0') {

+                        objnum = gennum;

+                        gennum = byte - '0';

+                        start_pos = start_pos1;

+                        start_pos1 = pos + i;

+                        status = 4;

+                    } else if (byte == 't') {

+                        status = 7;

+                        inside_index = 1;

+                    } else {

+                        --i;

+                        status = 0;

+                    }

+                    break;

+                case 6:

+                    switch (inside_index) {

+                        case 1:

+                            if (byte != 'b') {

+                                --i;

+                                status = 0;

+                            } else {

+                                inside_index ++;

+                            }

+                            break;

+                        case 2:

+                            if (byte != 'j') {

+                                --i;

+                                status = 0;

+                            } else {

+                                inside_index ++;

+                            }

+                            break;

+                        case 3:

+                            if (_PDF_CharType[byte] == 'W' || _PDF_CharType[byte] == 'D') {

+                                if (objnum > 0x1000000) {

+                                    status = 0;

+                                    break;

+                                }

+                                FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset;

+                                last_obj = start_pos;

+                                FX_LPVOID pResult = FXSYS_bsearch(&obj_pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+                                if (pResult == NULL) {

+                                    m_SortedOffset.Add(obj_pos);

+                                }

+                                FX_FILESIZE obj_end = 0;

+                                CPDF_Object *pObject = ParseIndirectObjectAtByStrict(m_pDocument, obj_pos, objnum, NULL, &obj_end);

+                                if (pObject) {

+                                    int iType =	pObject->GetType();

+                                    if (iType == PDFOBJ_STREAM) {

+                                        CPDF_Stream* pStream = (CPDF_Stream*)pObject;

+                                        CPDF_Dictionary* pDict = pStream->GetDict();

+                                        if (pDict) {

+                                            if (pDict->KeyExist(FX_BSTRC("Type"))) {

+                                                CFX_ByteString bsValue = pDict->GetString(FX_BSTRC("Type"));

+                                                if (bsValue == FX_BSTRC("XRef") && pDict->KeyExist(FX_BSTRC("Size"))) {

+                                                    CPDF_Object* pRoot = pDict->GetElement(FX_BSTRC("Root"));

+                                                    if (pRoot && pRoot->GetDict() && pRoot->GetDict()->GetElement(FX_BSTRC("Pages"))) {

+                                                        if (m_pTrailer) {

+                                                            m_pTrailer->Release();

+                                                        }

+                                                        m_pTrailer = (CPDF_Dictionary*)pDict->Clone();

+                                                    }

+                                                }

+                                            }

+                                        }

+                                    }

+                                }

+                                FX_FILESIZE offset = 0;

+                                m_Syntax.RestorePos(obj_pos);

+                                offset = m_Syntax.FindTag(FX_BSTRC("obj"), 0);

+                                if (offset == -1) {

+                                    offset = 0;

+                                } else {

+                                    offset += 3;

+                                }

+                                FX_FILESIZE nLen = obj_end - obj_pos - offset;

+                                if ((FX_DWORD)nLen > size - i) {

+                                    pos = obj_end + m_Syntax.m_HeaderOffset;

+                                    bOverFlow = TRUE;

+                                } else {

+                                    i += (FX_DWORD)nLen;

+                                }

+                                if (m_CrossRef.GetSize() > (FX_INT32)objnum && m_CrossRef[objnum]) {

+                                    if (pObject) {

+                                        FX_DWORD oldgen = m_ObjVersion.GetAt(objnum);

+                                        m_CrossRef[objnum] = obj_pos;

+                                        m_ObjVersion.SetAt(objnum, (FX_SHORT)gennum);

+                                        if (oldgen != gennum) {

+                                            m_bVersionUpdated = TRUE;

+                                        }

+                                    }

+                                } else {

+                                    m_CrossRef.SetAtGrow(objnum, obj_pos);

+                                    m_V5Type.SetAtGrow(objnum, 1);

+                                    m_ObjVersion.SetAtGrow(objnum, (FX_SHORT)gennum);

+                                }

+                                if (pObject) {

+                                    pObject->Release();

+                                }

+                            }

+                            --i;

+                            status = 0;

+                            break;

+                    }

+                    break;

+                case 7:

+                    if (inside_index == 7) {

+                        if (_PDF_CharType[byte] == 'W' || _PDF_CharType[byte] == 'D') {

+                            last_trailer = pos + i - 7;

+                            m_Syntax.RestorePos(pos + i - m_Syntax.m_HeaderOffset);

+                            CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument, 0, 0, 0);

+                            if (pObj) {

+                                if (pObj->GetType() != PDFOBJ_DICTIONARY && pObj->GetType() != PDFOBJ_STREAM) {

+                                    pObj->Release();

+                                } else {

+                                    CPDF_Dictionary* pTrailer = NULL;

+                                    if (pObj->GetType() == PDFOBJ_STREAM) {

+                                        pTrailer = ((CPDF_Stream*)pObj)->GetDict();

+                                    } else {

+                                        pTrailer = (CPDF_Dictionary*)pObj;

+                                    }

+                                    if (pTrailer) {

+                                        if (m_pTrailer) {

+                                            CPDF_Object* pRoot = pTrailer->GetElement(FX_BSTRC("Root"));

+                                            if (pRoot == NULL || (pRoot->GetType() == PDFOBJ_REFERENCE &&

+                                                                  (FX_DWORD)m_CrossRef.GetSize() > ((CPDF_Reference*)pRoot)->GetRefObjNum() &&

+                                                                  m_CrossRef.GetAt(((CPDF_Reference*)pRoot)->GetRefObjNum()) != 0)) {

+                                                FX_POSITION pos = pTrailer->GetStartPos();

+                                                while (pos) {

+                                                    CFX_ByteString key;

+                                                    CPDF_Object* pObj = pTrailer->GetNextElement(pos, key);

+                                                    m_pTrailer->SetAt(key, pObj->Clone(), m_pDocument);

+                                                }

+                                                pObj->Release();

+                                            } else {

+                                                pObj->Release();

+                                            }

+                                        } else {

+                                            if (pObj->GetType() == PDFOBJ_STREAM) {

+                                                m_pTrailer = (CPDF_Dictionary*)pTrailer->Clone();

+                                                pObj->Release();

+                                            } else {

+                                                m_pTrailer = pTrailer;

+                                            }

+                                            FX_FILESIZE dwSavePos = m_Syntax.SavePos();

+                                            CFX_ByteString strWord = m_Syntax.GetKeyword();

+                                            if (!strWord.Compare(FX_BSTRC("startxref"))) {

+                                                FX_BOOL bNumber = FALSE;

+                                                CFX_ByteString bsOffset = m_Syntax.GetNextWord(bNumber);

+                                                if (bNumber) {

+                                                    m_LastXRefOffset = FXSYS_atoi(bsOffset);

+                                                }

+                                            }

+                                            m_Syntax.RestorePos(dwSavePos);

+                                        }

+                                    } else {

+                                        pObj->Release();

+                                    }

+                                    bInUpdate = TRUE;

+                                }

+                            }

+                        }

+                        --i;

+                        status = 0;

+                    } else if (byte == "trailer"[inside_index]) {

+                        inside_index ++;

+                    } else {

+                        --i;

+                        status = 0;

+                    }

+                    break;

+                case 8:

+                    if (inside_index == 4) {

+                        last_xref = pos + i - 4;

+                        status = 1;

+                    } else if (byte == "xref"[inside_index]) {

+                        inside_index ++;

+                    } else {

+                        --i;

+                        status = 0;

+                    }

+                    break;

+                case 9:

+                    if (byte == '\r' || byte == '\n') {

+                        status = 0;

+                    }

+                    break;

+                case 10:

+                    if (byte == ')') {

+                        if (depth > 0) {

+                            depth--;

+                        }

+                    } else if (byte == '(') {

+                        depth++;

+                    }

+                    if (!depth) {

+                        status = 0;

+                    }

+                    break;

+                case 11:

+                    if (byte == '<' && inside_index == 1) {

+                        status = 12;

+                    } else if (byte == '>') {

+                        status = 0;

+                    }

+                    inside_index = 0;

+                    break;

+                case 12:

+                    --i;

+                    status = 0;

+                    break;

+                case 13:

+                    if (_PDF_CharType[byte] == 'D' || _PDF_CharType[byte] == 'W') {

+                        --i;

+                        status = 0;

+                    }

+                    break;

+                case 14:

+                    if (_PDF_CharType[byte] == 'W') {

+                        status = 0;

+                    } else if (byte == '%' || byte == '(' || byte == '<' || byte == '\\') {

+                        status = 0;

+                        --i;

+                    } else if (inside_index == 6) {

+                        status = 0;

+                        --i;

+                    } else if (byte == "endobj"[inside_index]) {

+                        inside_index++;

+                    }

+                    break;

+            }

+            if (bOverFlow) {

+                size = 0;

+                break;

+            }

+        }

+        pos += size;

+    }

+    if (last_xref != -1 && last_xref > last_obj) {

+        last_trailer = last_xref;

+    } else if (last_trailer == -1 || last_xref < last_obj) {

+        last_trailer = m_Syntax.m_FileLen;

+    }

+    FX_FILESIZE offset = last_trailer - m_Syntax.m_HeaderOffset;

+    FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+    if (pResult == NULL) {

+        m_SortedOffset.Add(offset);

+    }

+    FX_Free(buffer);

+    return TRUE;

+}

+static FX_DWORD _GetVarInt(FX_LPCBYTE p, FX_INT32 n)

+{

+    FX_DWORD result = 0;

+    for (FX_INT32 i = 0; i < n; i ++) {

+        result = result * 256 + p[i];

+    }

+    return result;

+}

+FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL bMainXRef)

+{

+    CPDF_Stream* pStream = (CPDF_Stream*)ParseIndirectObjectAt(m_pDocument, pos, 0, NULL);

+    if (!pStream) {

+        return FALSE;

+    }

+    if (m_pDocument) {

+        m_pDocument->InsertIndirectObject(pStream->m_ObjNum, pStream);

+    }

+    if (pStream->GetType() != PDFOBJ_STREAM) {

+        return FALSE;

+    }

+    prev = pStream->GetDict()->GetInteger(FX_BSTRC("Prev"));

+    FX_INT32 size = pStream->GetDict()->GetInteger(FX_BSTRC("Size"));

+    if (size < 0) {

+        pStream->Release();

+        return FALSE;

+    }

+    if (bMainXRef) {

+        m_pTrailer = (CPDF_Dictionary*)pStream->GetDict()->Clone();

+        m_CrossRef.SetSize(size);

+        if (m_V5Type.SetSize(size)) {

+            FXSYS_memset32(m_V5Type.GetData(), 0, size);

+        }

+    } else {

+        m_Trailers.Add((CPDF_Dictionary*)pStream->GetDict()->Clone());

+    }

+    CFX_DWordArray IndexArray, WidthArray;

+    FX_DWORD nSegs = 0;

+    CPDF_Array* pArray = pStream->GetDict()->GetArray(FX_BSTRC("Index"));

+    if (pArray == NULL) {

+        IndexArray.Add(0);

+        IndexArray.Add(size);

+        nSegs = 1;

+    } else {

+        for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {

+            IndexArray.Add(pArray->GetInteger(i));

+        }

+        nSegs = pArray->GetCount() / 2;

+    }

+    pArray = pStream->GetDict()->GetArray(FX_BSTRC("W"));

+    if (pArray == NULL) {

+        pStream->Release();

+        return FALSE;

+    }

+    FX_DWORD totalwidth = 0;

+    FX_DWORD i;

+    for (i = 0; i < pArray->GetCount(); i ++) {

+        WidthArray.Add(pArray->GetInteger(i));

+        if (totalwidth + WidthArray[i] < totalwidth) {

+            pStream->Release();

+            return FALSE;

+        }

+        totalwidth += WidthArray[i];

+    }

+    if (totalwidth == 0 || WidthArray.GetSize() < 3) {

+        pStream->Release();

+        return FALSE;

+    }

+    CPDF_StreamAcc acc;

+    acc.LoadAllData(pStream);

+    FX_LPCBYTE pData = acc.GetData();

+    FX_DWORD dwTotalSize = acc.GetSize();

+    FX_DWORD segindex = 0;

+    for (i = 0; i < nSegs; i ++) {

+        FX_INT32 startnum = IndexArray[i * 2];

+        if (startnum < 0) {

+            continue;

+        }

+        m_dwXrefStartObjNum = startnum;

+        FX_DWORD count = IndexArray[i * 2 + 1];

+        if (segindex + count < segindex || segindex + count == 0 ||

+                (FX_DWORD)totalwidth >= UINT_MAX / (segindex + count) || (segindex + count) * (FX_DWORD)totalwidth > dwTotalSize) {

+            continue;

+        }

+        FX_LPCBYTE segstart = pData + segindex * (FX_DWORD)totalwidth;

+        if ((FX_DWORD)startnum + count < (FX_DWORD)startnum ||

+                (FX_DWORD)startnum + count > (FX_DWORD)m_V5Type.GetSize()) {

+            continue;

+        }

+        for (FX_DWORD j = 0; j < count; j ++) {

+            FX_INT32 type = 1;

+            FX_LPCBYTE entrystart = segstart + j * totalwidth;

+            if (WidthArray[0]) {

+                type = _GetVarInt(entrystart, WidthArray[0]);

+            }

+            if (m_V5Type[startnum + j] == 255) {

+                FX_FILESIZE offset = _GetVarInt(entrystart + WidthArray[0], WidthArray[1]);

+                m_CrossRef[startnum + j] = offset;

+                FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+                if (pResult == NULL) {

+                    m_SortedOffset.Add(offset);

+                }

+                continue;

+            }

+            if (m_V5Type[startnum + j]) {

+                continue;

+            }

+            m_V5Type[startnum + j] = type;

+            if (type == 0) {

+                m_CrossRef[startnum + j] = 0;

+            } else {

+                FX_FILESIZE offset = _GetVarInt(entrystart + WidthArray[0], WidthArray[1]);

+                m_CrossRef[startnum + j] = offset;

+                if (type == 1) {

+                    FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+                    if (pResult == NULL) {

+                        m_SortedOffset.Add(offset);

+                    }

+                } else {

+                    if (offset < 0 || offset >= m_V5Type.GetSize()) {

+                        pStream->Release();

+                        return FALSE;

+                    }

+                    m_V5Type[offset] = 255;

+                }

+            }

+        }

+        segindex += count;

+    }

+    pStream->Release();

+    return TRUE;

+}

+CPDF_Array* CPDF_Parser::GetIDArray()

+{

+    CPDF_Object* pID = m_pTrailer->GetElement(FX_BSTRC("ID"));

+    if (pID == NULL) {

+        return NULL;

+    }

+    if (pID->GetType() == PDFOBJ_REFERENCE) {

+        pID = ParseIndirectObject(NULL, ((CPDF_Reference*)pID)->GetRefObjNum());

+        m_pTrailer->SetAt(FX_BSTRC("ID"), pID);

+    }

+    if (pID == NULL || pID->GetType() != PDFOBJ_ARRAY) {

+        return NULL;

+    }

+    return (CPDF_Array*)pID;

+}

+FX_DWORD CPDF_Parser::GetRootObjNum()

+{

+    CPDF_Reference* pRef = (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC("Root"));

+    if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {

+        return 0;

+    }

+    return pRef->GetRefObjNum();

+}

+FX_DWORD CPDF_Parser::GetInfoObjNum()

+{

+    CPDF_Reference* pRef = (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC("Info"));

+    if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {

+        return 0;

+    }

+    return pRef->GetRefObjNum();

+}

+FX_BOOL CPDF_Parser::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm)

+{

+    bForm = FALSE;

+    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {

+        return TRUE;

+    }

+    if (m_V5Type[objnum] == 0) {

+        return TRUE;

+    }

+    if (m_V5Type[objnum] == 2) {

+        return TRUE;

+    }

+    FX_FILESIZE pos = m_CrossRef[objnum];

+    FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+    if (pResult == NULL) {

+        return TRUE;

+    }

+    if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1) {

+        return FALSE;

+    }

+    FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos;

+    FX_FILESIZE SavedPos = m_Syntax.SavePos();

+    m_Syntax.RestorePos(pos);

+    bForm = m_Syntax.SearchMultiWord(FX_BSTRC("/Form\0stream"), TRUE, size) == 0;

+    m_Syntax.RestorePos(SavedPos);

+    return TRUE;

+}

+CPDF_Object* CPDF_Parser::ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext)

+{

+    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {

+        return NULL;

+    }

+    if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {

+        FX_FILESIZE pos = m_CrossRef[objnum];

+        if (pos <= 0) {

+            return NULL;

+        }

+        return ParseIndirectObjectAt(pObjList, pos, objnum, pContext);

+    }

+    if (m_V5Type[objnum] == 2) {

+        CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum]);

+        if (pObjStream == NULL) {

+            return NULL;

+        }

+        FX_INT32 n = pObjStream->GetDict()->GetInteger(FX_BSTRC("N"));

+        FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First"));

+        CPDF_SyntaxParser syntax;

+        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)pObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE));

+        syntax.InitParser((IFX_FileStream*)file, 0);

+        CPDF_Object* pRet = NULL;

+        while (n) {

+            FX_DWORD thisnum = syntax.GetDirectNum();

+            FX_DWORD thisoff = syntax.GetDirectNum();

+            if (thisnum == objnum) {

+                syntax.RestorePos(offset + thisoff);

+                pRet = syntax.GetObject(pObjList, 0, 0, 0, pContext);

+                break;

+            }

+            n --;

+        }

+        return pRet;

+    }

+    return NULL;

+}

+CPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum)

+{

+    CPDF_StreamAcc* pStreamAcc = NULL;

+    if (m_ObjectStreamMap.Lookup((void*)(FX_UINTPTR)objnum, (void*&)pStreamAcc)) {

+        return pStreamAcc;

+    }

+    const CPDF_Stream* pStream = (CPDF_Stream*)m_pDocument->GetIndirectObject(objnum);

+    if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {

+        return NULL;

+    }

+    pStreamAcc = FX_NEW CPDF_StreamAcc;

+    pStreamAcc->LoadAllData(pStream);

+    m_ObjectStreamMap.SetAt((void*)(FX_UINTPTR)objnum, pStreamAcc);

+    return pStreamAcc;

+}

+FX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum)

+{

+    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {

+        return 0;

+    }

+    if (m_V5Type[objnum] == 2) {

+        objnum = (FX_DWORD)m_CrossRef[objnum];

+    }

+    if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {

+        FX_FILESIZE offset = m_CrossRef[objnum];

+        if (offset == 0) {

+            return 0;

+        }

+        FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+        if (pResult == NULL) {

+            return 0;

+        }

+        if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1) {

+            return 0;

+        }

+        return ((FX_FILESIZE*)pResult)[1] - offset;

+    }

+    return 0;

+}

+void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, FX_LPBYTE& pBuffer, FX_DWORD& size)

+{

+    pBuffer = NULL;

+    size = 0;

+    if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {

+        return;

+    }

+    if (m_V5Type[objnum] == 2) {

+        CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum]);

+        if (pObjStream == NULL) {

+            return;

+        }

+        FX_INT32 n = pObjStream->GetDict()->GetInteger(FX_BSTRC("N"));

+        FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First"));

+        CPDF_SyntaxParser syntax;

+        FX_LPCBYTE pData = pObjStream->GetData();

+        FX_DWORD totalsize = pObjStream->GetSize();

+        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)pData, (size_t)totalsize, FALSE));

+        syntax.InitParser((IFX_FileStream*)file, 0);

+        while (n) {

+            FX_DWORD thisnum = syntax.GetDirectNum();

+            FX_DWORD thisoff = syntax.GetDirectNum();

+            if (thisnum == objnum) {

+                if (n == 1) {

+                    size = totalsize - (thisoff + offset);

+                } else {

+                    FX_DWORD nextnum = syntax.GetDirectNum();

+                    FX_DWORD nextoff = syntax.GetDirectNum();

+                    size = nextoff - thisoff;

+                }

+                pBuffer = FX_Alloc(FX_BYTE, size);

+                FXSYS_memcpy32(pBuffer, pData + thisoff + offset, size);

+                return;

+            }

+            n --;

+        }

+        return;

+    }

+    if (m_V5Type[objnum] == 1) {

+        FX_FILESIZE pos = m_CrossRef[objnum];

+        if (pos == 0) {

+            return;

+        }

+        FX_FILESIZE SavedPos = m_Syntax.SavePos();

+        m_Syntax.RestorePos(pos);

+        FX_BOOL bIsNumber;

+        CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);

+        if (!bIsNumber) {

+            m_Syntax.RestorePos(SavedPos);

+            return;

+        }

+        FX_DWORD real_objnum = FXSYS_atoi(word);

+        if (real_objnum && real_objnum != objnum) {

+            m_Syntax.RestorePos(SavedPos);

+            return;

+        }

+        word = m_Syntax.GetNextWord(bIsNumber);

+        if (!bIsNumber) {

+            m_Syntax.RestorePos(SavedPos);

+            return;

+        }

+        if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {

+            m_Syntax.RestorePos(SavedPos);

+            return;

+        }

+        FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+        if (pResult == NULL) {

+            m_Syntax.RestorePos(SavedPos);

+            return;

+        }

+        FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1];

+        FX_BOOL bNextOffValid = FALSE;

+        if (nextoff != pos) {

+            m_Syntax.RestorePos(nextoff);

+            word = m_Syntax.GetNextWord(bIsNumber);

+            if (word == FX_BSTRC("xref")) {

+                bNextOffValid = TRUE;

+            } else if (bIsNumber) {

+                word = m_Syntax.GetNextWord(bIsNumber);

+                if (bIsNumber && m_Syntax.GetKeyword() == FX_BSTRC("obj")) {

+                    bNextOffValid = TRUE;

+                }

+            }

+        }

+        if (!bNextOffValid) {

+            m_Syntax.RestorePos(pos);

+            while (1) {

+                if (m_Syntax.GetKeyword() == FX_BSTRC("endobj")) {

+                    break;

+                }

+                if (m_Syntax.SavePos() == m_Syntax.m_FileLen) {

+                    break;

+                }

+            }

+            nextoff = m_Syntax.SavePos();

+        }

+        size = (FX_DWORD)(nextoff - pos);

+        pBuffer = FX_Alloc(FX_BYTE, size);

+        m_Syntax.RestorePos(pos);

+        m_Syntax.ReadBlock(pBuffer, size);

+        m_Syntax.RestorePos(SavedPos);

+    }

+}

+CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,

+        PARSE_CONTEXT* pContext)

+{

+    FX_FILESIZE SavedPos = m_Syntax.SavePos();

+    m_Syntax.RestorePos(pos);

+    FX_BOOL bIsNumber;

+    CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);

+    if (!bIsNumber) {

+        m_Syntax.RestorePos(SavedPos);

+        return NULL;

+    }

+    FX_FILESIZE objOffset = m_Syntax.SavePos();

+    objOffset -= word.GetLength();

+    FX_DWORD real_objnum = FXSYS_atoi(word);

+    if (objnum && real_objnum != objnum) {

+        m_Syntax.RestorePos(SavedPos);

+        return NULL;

+    }

+    word = m_Syntax.GetNextWord(bIsNumber);

+    if (!bIsNumber) {

+        m_Syntax.RestorePos(SavedPos);

+        return NULL;

+    }

+    FX_DWORD gennum = FXSYS_atoi(word);

+    if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {

+        m_Syntax.RestorePos(SavedPos);

+        return NULL;

+    }

+    CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, gennum, 0, pContext);

+    FX_FILESIZE endOffset = m_Syntax.SavePos();

+    CFX_ByteString bsWord = m_Syntax.GetKeyword();

+    if (bsWord == FX_BSTRC("endobj")) {

+        endOffset = m_Syntax.SavePos();

+    }

+    FX_DWORD objSize = endOffset - objOffset;

+    m_Syntax.RestorePos(SavedPos);

+    if (pObj && !objnum) {

+        pObj->m_ObjNum = real_objnum;

+    }

+    return pObj;

+}

+CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,

+        struct PARSE_CONTEXT* pContext, FX_FILESIZE *pResultPos)

+{

+    FX_FILESIZE SavedPos = m_Syntax.SavePos();

+    m_Syntax.RestorePos(pos);

+    FX_BOOL bIsNumber;

+    CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);

+    if (!bIsNumber) {

+        m_Syntax.RestorePos(SavedPos);

+        return NULL;

+    }

+    FX_DWORD real_objnum = FXSYS_atoi(word);

+    if (objnum && real_objnum != objnum) {

+        m_Syntax.RestorePos(SavedPos);

+        return NULL;

+    }

+    word = m_Syntax.GetNextWord(bIsNumber);

+    if (!bIsNumber) {

+        m_Syntax.RestorePos(SavedPos);

+        return NULL;

+    }

+    FX_DWORD gennum = FXSYS_atoi(word);

+    if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {

+        m_Syntax.RestorePos(SavedPos);

+        return NULL;

+    }

+    CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum, 0, pContext);

+    if (pResultPos) {

+        *pResultPos = m_Syntax.m_Pos;

+    }

+    m_Syntax.RestorePos(SavedPos);

+    return pObj;

+}

+CPDF_Dictionary* CPDF_Parser::LoadTrailerV4()

+{

+    if (m_Syntax.GetKeyword() != FX_BSTRC("trailer")) {

+        return NULL;

+    }

+    CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument, 0, 0, 0);

+    if (pObj == NULL || pObj->GetType() != PDFOBJ_DICTIONARY) {

+        if (pObj) {

+            pObj->Release();

+        }

+        return NULL;

+    }

+    return (CPDF_Dictionary*)pObj;

+}

+FX_DWORD CPDF_Parser::GetPermissions(FX_BOOL bCheckRevision)

+{

+    if (m_pSecurityHandler == NULL) {

+        return (FX_DWORD) - 1;

+    }

+    FX_DWORD dwPermission = m_pSecurityHandler->GetPermissions();

+    if (m_pEncryptDict && m_pEncryptDict->GetString(FX_BSTRC("Filter")) == FX_BSTRC("Standard")) {

+        dwPermission &= 0xFFFFFFFC;

+        dwPermission |= 0xFFFFF0C0;

+        if(bCheckRevision && m_pEncryptDict->GetInteger(FX_BSTRC("R")) == 2) {

+            dwPermission &= 0xFFFFF0FF;

+        }

+    }

+    return dwPermission;

+}

+FX_BOOL CPDF_Parser::IsOwner()

+{

+    return m_pSecurityHandler == NULL ? TRUE : m_pSecurityHandler->IsOwner();

+}

+void CPDF_Parser::SetSecurityHandler(CPDF_SecurityHandler* pSecurityHandler, FX_BOOL bForced)

+{

+    ASSERT(m_pSecurityHandler == NULL);

+    if (m_pSecurityHandler && !m_bForceUseSecurityHandler) {

+        delete m_pSecurityHandler;

+        m_pSecurityHandler = NULL;

+    }

+    m_bForceUseSecurityHandler = bForced;

+    m_pSecurityHandler = pSecurityHandler;

+    if (m_bForceUseSecurityHandler) {

+        return;

+    }

+    m_Syntax.m_pCryptoHandler = pSecurityHandler->CreateCryptoHandler();

+    m_Syntax.m_pCryptoHandler->Init(NULL, pSecurityHandler);

+}

+FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset)

+{

+    m_Syntax.InitParser(pFileAccess, offset);

+    m_Syntax.RestorePos(m_Syntax.m_HeaderOffset + 9);

+    FX_FILESIZE SavedPos = m_Syntax.SavePos();

+    FX_BOOL bIsNumber;

+    CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);

+    if (!bIsNumber) {

+        return FALSE;

+    }

+    FX_DWORD objnum = FXSYS_atoi(word);

+    word = m_Syntax.GetNextWord(bIsNumber);

+    if (!bIsNumber) {

+        return FALSE;

+    }

+    FX_DWORD gennum = FXSYS_atoi(word);

+    if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {

+        m_Syntax.RestorePos(SavedPos);

+        return FALSE;

+    }

+    m_pLinearized = m_Syntax.GetObject(NULL, objnum, gennum, 0);

+    if (!m_pLinearized) {

+        return FALSE;

+    }

+    if (m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) {

+        m_Syntax.GetNextWord(bIsNumber);

+        CPDF_Object *pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));

+        if (!pLen) {

+            m_pLinearized->Release();

+            return FALSE;

+        }

+        if (pLen->GetInteger() != (int)pFileAccess->GetSize()) {

+            return FALSE;

+        }

+        CPDF_Object *pNo = m_pLinearized->GetDict()->GetElement(FX_BSTRC("P"));

+        if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {

+            m_dwFirstPageNo = pNo->GetInteger();

+        }

+        CPDF_Object *pTable = m_pLinearized->GetDict()->GetElement(FX_BSTRC("T"));

+        if (pTable && pTable->GetType() == PDFOBJ_NUMBER) {

+            m_LastXRefOffset = pTable->GetInteger();

+        }

+        return TRUE;

+    }

+    m_pLinearized->Release();

+    m_pLinearized = NULL;

+    return FALSE;

+}

+FX_DWORD CPDF_Parser::StartAsynParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse, FX_BOOL bOwnFileRead)

+{

+    CloseParser(bReParse);

+    m_bXRefStream = FALSE;

+    m_LastXRefOffset = 0;

+    m_bOwnFileRead = bOwnFileRead;

+    FX_INT32 offset = GetHeaderOffset(pFileAccess);

+    if (offset == -1) {

+        return PDFPARSE_ERROR_FORMAT;

+    }

+    if (!IsLinearizedFile(pFileAccess, offset)) {

+        m_Syntax.m_pFileAccess = NULL;

+        return StartParse(pFileAccess, bReParse, bOwnFileRead);

+    }

+    if (!bReParse) {

+        m_pDocument = FX_NEW CPDF_Document(this);

+    }

+    FX_FILESIZE dwFirstXRefOffset = m_Syntax.SavePos();

+    FX_BOOL bXRefRebuilt = FALSE;

+    FX_BOOL bLoadV4 = FALSE;

+    if (!(bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, FALSE, FALSE)) && !LoadCrossRefV5(dwFirstXRefOffset, dwFirstXRefOffset, TRUE)) {

+        if (!RebuildCrossRef()) {

+            return PDFPARSE_ERROR_FORMAT;

+        }

+        bXRefRebuilt = TRUE;

+        m_LastXRefOffset = 0;

+    }

+    if (bLoadV4) {

+        m_pTrailer = LoadTrailerV4();

+        if (m_pTrailer == NULL) {

+            return FALSE;

+        }

+        FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size"));

+        if (xrefsize == 0) {

+            return FALSE;

+        }

+        m_CrossRef.SetSize(xrefsize);

+        m_V5Type.SetSize(xrefsize);

+    }

+    FX_DWORD dwRet = SetEncryptHandler();

+    if (dwRet != PDFPARSE_ERROR_SUCCESS) {

+        return dwRet;

+    }

+    m_pDocument->LoadAsynDoc(m_pLinearized->GetDict());

+    if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) {

+        if (bXRefRebuilt) {

+            return PDFPARSE_ERROR_FORMAT;

+        }

+        ReleaseEncryptHandler();

+        if (!RebuildCrossRef()) {

+            return PDFPARSE_ERROR_FORMAT;

+        }

+        dwRet = SetEncryptHandler();

+        if (dwRet != PDFPARSE_ERROR_SUCCESS) {

+            return dwRet;

+        }

+        m_pDocument->LoadAsynDoc(m_pLinearized->GetDict());

+        if (m_pDocument->GetRoot() == NULL) {

+            return PDFPARSE_ERROR_FORMAT;

+        }

+    }

+    FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+    FX_DWORD RootObjNum = GetRootObjNum();

+    if (RootObjNum == 0) {

+        ReleaseEncryptHandler();

+        RebuildCrossRef();

+        RootObjNum = GetRootObjNum();

+        if (RootObjNum == 0) {

+            return PDFPARSE_ERROR_FORMAT;

+        }

+        dwRet = SetEncryptHandler();

+        if (dwRet != PDFPARSE_ERROR_SUCCESS) {

+            return dwRet;

+        }

+    }

+    if (m_pSecurityHandler && m_pSecurityHandler->IsMetadataEncrypted()) {

+        CPDF_Reference* pMetadata = (CPDF_Reference*)m_pDocument->GetRoot()->GetElement(FX_BSTRC("Metadata"));

+        if (pMetadata && pMetadata->GetType() == PDFOBJ_REFERENCE) {

+            m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum();

+        }

+    }

+    return PDFPARSE_ERROR_SUCCESS;

+}

+FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV5(FX_FILESIZE xrefpos)

+{

+    if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {

+        return FALSE;

+    }

+    while (xrefpos)

+        if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {

+            return FALSE;

+        }

+    m_ObjectStreamMap.InitHashTable(101, FALSE);

+    m_bXRefStream = TRUE;

+    return TRUE;

+}

+FX_DWORD CPDF_Parser::LoadLinearizedMainXRefTable()

+{

+    FX_DWORD dwSaveMetadataObjnum = m_Syntax.m_MetadataObjnum;

+    m_Syntax.m_MetadataObjnum = 0;

+    if (m_pTrailer) {

+        m_pTrailer->Release();

+        m_pTrailer = NULL;

+    }

+    m_Syntax.RestorePos(m_LastXRefOffset - m_Syntax.m_HeaderOffset);

+    FX_FILESIZE dwSavedPos = m_Syntax.SavePos();

+    FX_BYTE ch = 0;

+    FX_DWORD dwCount = 0;

+    m_Syntax.GetNextChar(ch);

+    FX_INT32 type = _PDF_CharType[ch];

+    while (type == 'W') {

+        ++dwCount;

+        if (m_Syntax.m_FileLen >= (FX_FILESIZE)(m_Syntax.SavePos() + m_Syntax.m_HeaderOffset)) {

+            break;

+        }

+        m_Syntax.GetNextChar(ch);

+        type = _PDF_CharType[ch];

+    }

+    m_LastXRefOffset += dwCount;

+    FX_POSITION pos = m_ObjectStreamMap.GetStartPosition();

+    while (pos) {

+        FX_LPVOID objnum;

+        CPDF_StreamAcc* pStream;

+        m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream);

+        delete pStream;

+    }

+    m_ObjectStreamMap.RemoveAll();

+    if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) {

+        m_LastXRefOffset = 0;

+        m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;

+        return PDFPARSE_ERROR_FORMAT;

+    }

+    FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_DWORD), _CompareDWord);

+    m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;

+    return PDFPARSE_ERROR_SUCCESS;

+}

+CPDF_SyntaxParser::CPDF_SyntaxParser()

+{

+    m_pFileAccess = NULL;

+    m_pCryptoHandler = NULL;

+    m_pFileBuf = NULL;

+    m_BufSize = CPDF_ModuleMgr::Get()->m_FileBufSize;

+    m_pFileBuf = NULL;

+    m_MetadataObjnum = 0;

+    m_dwWordPos = 0;

+#if defined(_FPDFAPI_MINI_)

+    m_bFileStream = TRUE;

+#else

+    m_bFileStream = FALSE;

+#endif

+}

+CPDF_SyntaxParser::~CPDF_SyntaxParser()

+{

+    if (m_pFileBuf) {

+        FX_Free(m_pFileBuf);

+    }

+}

+FX_BOOL CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, FX_BYTE& ch)

+{

+    FX_FILESIZE save_pos = m_Pos;

+    m_Pos = pos;

+    FX_BOOL ret = GetNextChar(ch);

+    m_Pos = save_pos;

+    return ret;

+}

+FX_BOOL CPDF_SyntaxParser::GetNextChar(FX_BYTE& ch)

+{

+    FX_FILESIZE pos = m_Pos + m_HeaderOffset;

+    if (pos >= m_FileLen) {

+        return FALSE;

+    }

+    if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) {

+        FX_FILESIZE read_pos = pos;

+        FX_DWORD read_size = m_BufSize;

+        if ((FX_FILESIZE)read_size > m_FileLen) {

+            read_size = (FX_DWORD)m_FileLen;

+        }

+        if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) {

+            if (m_FileLen < (FX_FILESIZE)read_size) {

+                read_pos = 0;

+                read_size = (FX_DWORD)m_FileLen;

+            } else {

+                read_pos = m_FileLen - read_size;

+            }

+        }

+        if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) {

+            return FALSE;

+        }

+        m_BufOffset = read_pos;

+    }

+    ch = m_pFileBuf[pos - m_BufOffset];

+    m_Pos ++;

+    return TRUE;

+}

+FX_BOOL CPDF_SyntaxParser::GetCharAtBackward(FX_FILESIZE pos, FX_BYTE& ch)

+{

+    pos += m_HeaderOffset;

+    if (pos >= m_FileLen) {

+        return FALSE;

+    }

+    if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) {

+        FX_FILESIZE read_pos;

+        if (pos < (FX_FILESIZE)m_BufSize) {

+            read_pos = 0;

+        } else {

+            read_pos = pos - m_BufSize + 1;

+        }

+        FX_DWORD read_size = m_BufSize;

+        if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) {

+            if (m_FileLen < (FX_FILESIZE)read_size) {

+                read_pos = 0;

+                read_size = (FX_DWORD)m_FileLen;

+            } else {

+                read_pos = m_FileLen - read_size;

+            }

+        }

+        if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) {

+            return FALSE;

+        }

+        m_BufOffset = read_pos;

+    }

+    ch = m_pFileBuf[pos - m_BufOffset];

+    return TRUE;

+}

+FX_BOOL CPDF_SyntaxParser::ReadBlock(FX_LPBYTE pBuf, FX_DWORD size)

+{

+    if (!m_pFileAccess->ReadBlock(pBuf, m_Pos + m_HeaderOffset, size)) {

+        return FALSE;

+    }

+    m_Pos += size;

+    return TRUE;

+}

+#define MAX_WORD_BUFFER 256

+void CPDF_SyntaxParser::GetNextWord()

+{

+    m_WordSize = 0;

+    m_bIsNumber = TRUE;

+    FX_BYTE ch;

+    if (!GetNextChar(ch)) {

+        return;

+    }

+    FX_BYTE type = _PDF_CharType[ch];

+    while (1) {

+        while (type == 'W') {

+            if (!GetNextChar(ch)) {

+                return;

+            }

+            type = _PDF_CharType[ch];

+        }

+        if (ch != '%') {

+            break;

+        }

+        while (1) {

+            if (!GetNextChar(ch)) {

+                return;

+            }

+            if (ch == '\r' || ch == '\n') {

+                break;

+            }

+        }

+        type = _PDF_CharType[ch];

+    }

+    if (type == 'D') {

+        m_bIsNumber = FALSE;

+        m_WordBuffer[m_WordSize++] = ch;

+        if (ch == '/') {

+            while (1) {

+                if (!GetNextChar(ch)) {

+                    return;

+                }

+                type = _PDF_CharType[ch];

+                if (type != 'R' && type != 'N') {

+                    m_Pos --;

+                    return;

+                }

+                if (m_WordSize < MAX_WORD_BUFFER) {

+                    m_WordBuffer[m_WordSize++] = ch;

+                }

+            }

+        } else if (ch == '<') {

+            if (!GetNextChar(ch)) {

+                return;

+            }

+            if (ch == '<') {

+                m_WordBuffer[m_WordSize++] = ch;

+            } else {

+                m_Pos --;

+            }

+        } else if (ch == '>') {

+            if (!GetNextChar(ch)) {

+                return;

+            }

+            if (ch == '>') {

+                m_WordBuffer[m_WordSize++] = ch;

+            } else {

+                m_Pos --;

+            }

+        }

+        return;

+    }

+    while (1) {

+        if (m_WordSize < MAX_WORD_BUFFER) {

+            m_WordBuffer[m_WordSize++] = ch;

+        }

+        if (type != 'N') {

+            m_bIsNumber = FALSE;

+        }

+        if (!GetNextChar(ch)) {

+            return;

+        }

+        type = _PDF_CharType[ch];

+        if (type == 'D' || type == 'W') {

+            m_Pos --;

+            break;

+        }

+    }

+}

+CFX_ByteString CPDF_SyntaxParser::ReadString()

+{

+    FX_BYTE ch;

+    if (!GetNextChar(ch)) {

+        return CFX_ByteString();

+    }

+    CFX_ByteTextBuf buf;

+    FX_INT32 parlevel = 0;

+    FX_INT32 status = 0, iEscCode = 0;

+    while (1) {

+        switch (status) {

+            case 0:

+                if (ch == ')') {

+                    if (parlevel == 0) {

+                        return buf.GetByteString();

+                    }

+                    parlevel --;

+                    buf.AppendChar(')');

+                } else if (ch == '(') {

+                    parlevel ++;

+                    buf.AppendChar('(');

+                } else if (ch == '\\') {

+                    status = 1;

+                } else {

+                    buf.AppendChar(ch);

+                }

+                break;

+            case 1:

+                if (ch >= '0' && ch <= '7') {

+                    iEscCode = ch - '0';

+                    status = 2;

+                    break;

+                }

+                if (ch == 'n') {

+                    buf.AppendChar('\n');

+                } else if (ch == 'r') {

+                    buf.AppendChar('\r');

+                } else if (ch == 't') {

+                    buf.AppendChar('\t');

+                } else if (ch == 'b') {

+                    buf.AppendChar('\b');

+                } else if (ch == 'f') {

+                    buf.AppendChar('\f');

+                } else if (ch == '\r') {

+                    status = 4;

+                    break;

+                } else if (ch == '\n') {

+                } else {

+                    buf.AppendChar(ch);

+                }

+                status = 0;

+                break;

+            case 2:

+                if (ch >= '0' && ch <= '7') {

+                    iEscCode = iEscCode * 8 + ch - '0';

+                    status = 3;

+                } else {

+                    buf.AppendChar(iEscCode);

+                    status = 0;

+                    continue;

+                }

+                break;

+            case 3:

+                if (ch >= '0' && ch <= '7') {

+                    iEscCode = iEscCode * 8 + ch - '0';

+                    buf.AppendChar(iEscCode);

+                    status = 0;

+                } else {

+                    buf.AppendChar(iEscCode);

+                    status = 0;

+                    continue;

+                }

+                break;

+            case 4:

+                status = 0;

+                if (ch != '\n') {

+                    continue;

+                }

+                break;

+        }

+        if (!GetNextChar(ch)) {

+            break;

+        }

+    }

+    GetNextChar(ch);

+    return buf.GetByteString();

+}

+CFX_ByteString CPDF_SyntaxParser::ReadHexString()

+{

+    FX_BYTE ch;

+    if (!GetNextChar(ch)) {

+        return CFX_ByteString();

+    }

+    CFX_BinaryBuf buf;

+    FX_BOOL bFirst = TRUE;

+    FX_BYTE code = 0;

+    while (1) {

+        if (ch == '>') {

+            break;

+        }

+        if (ch >= '0' && ch <= '9') {

+            if (bFirst) {

+                code = (ch - '0') * 16;

+            } else {

+                code += ch - '0';

+                buf.AppendByte((FX_BYTE)code);

+            }

+            bFirst = !bFirst;

+        } else if (ch >= 'A' && ch <= 'F') {

+            if (bFirst) {

+                code = (ch - 'A' + 10) * 16;

+            } else {

+                code += ch - 'A' + 10;

+                buf.AppendByte((FX_BYTE)code);

+            }

+            bFirst = !bFirst;

+        } else if (ch >= 'a' && ch <= 'f') {

+            if (bFirst) {

+                code = (ch - 'a' + 10) * 16;

+            } else {

+                code += ch - 'a' + 10;

+                buf.AppendByte((FX_BYTE)code);

+            }

+            bFirst = !bFirst;

+        }

+        if (!GetNextChar(ch)) {

+            break;

+        }

+    }

+    if (!bFirst) {

+        buf.AppendByte((FX_BYTE)code);

+    }

+    return buf.GetByteString();

+}

+void CPDF_SyntaxParser::ToNextLine()

+{

+    FX_BYTE ch;

+    while (1) {

+        if (!GetNextChar(ch)) {

+            return;

+        }

+        if (ch == '\n') {

+            return;

+        }

+        if (ch == '\r') {

+            GetNextChar(ch);

+            if (ch == '\n') {

+                return;

+            } else {

+                m_Pos --;

+                return;

+            }

+        }

+    }

+}

+void CPDF_SyntaxParser::ToNextWord()

+{

+    FX_BYTE ch;

+    if (!GetNextChar(ch)) {

+        return;

+    }

+    FX_BYTE type = _PDF_CharType[ch];

+    while (1) {

+        while (type == 'W') {

+            m_dwWordPos = m_Pos;

+            if (!GetNextChar(ch)) {

+                return;

+            }

+            type = _PDF_CharType[ch];

+        }

+        if (ch != '%') {

+            break;

+        }

+        while (1) {

+            if (!GetNextChar(ch)) {

+                return;

+            }

+            if (ch == '\r' || ch == '\n') {

+                break;

+            }

+        }

+        type = _PDF_CharType[ch];

+    }

+    m_Pos --;

+}

+CFX_ByteString CPDF_SyntaxParser::GetNextWord(FX_BOOL& bIsNumber)

+{

+    GetNextWord();

+    bIsNumber = m_bIsNumber;

+    return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);

+}

+CFX_ByteString CPDF_SyntaxParser::GetKeyword()

+{

+    GetNextWord();

+    return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);

+}

+CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, FX_INT32 level, PARSE_CONTEXT* pContext, FX_BOOL bDecrypt)

+{

+    if (level > _PARSER_OBJECT_LEVLE_) {

+        return NULL;

+    }

+    FX_FILESIZE SavedPos = m_Pos;

+    FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);

+    FX_BOOL bIsNumber;

+    CFX_ByteString word = GetNextWord(bIsNumber);

+    CPDF_Object* pRet = NULL;

+    if (word.GetLength() == 0) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_INVALID;

+        }

+        return NULL;

+    }

+    FX_FILESIZE wordOffset = m_Pos - word.GetLength();

+    if (bIsNumber) {

+        FX_FILESIZE SavedPos = m_Pos;

+        CFX_ByteString nextword = GetNextWord(bIsNumber);

+        if (bIsNumber) {

+            CFX_ByteString nextword2 = GetNextWord(bIsNumber);

+            if (nextword2 == FX_BSTRC("R")) {

+                FX_DWORD objnum = FXSYS_atoi(word);

+                if (bTypeOnly) {

+                    return (CPDF_Object*)PDFOBJ_REFERENCE;

+                }

+                pRet = CPDF_Reference::Create(pObjList, objnum);

+                return pRet;

+            } else {

+                m_Pos = SavedPos;

+                if (bTypeOnly) {

+                    return (CPDF_Object*)PDFOBJ_NUMBER;

+                }

+                pRet = CPDF_Number::Create(word);

+                return pRet;

+            }

+        } else {

+            m_Pos = SavedPos;

+            if (bTypeOnly) {

+                return (CPDF_Object*)PDFOBJ_NUMBER;

+            }

+            pRet = CPDF_Number::Create(word);

+            return pRet;

+        }

+    }

+    if (word == FX_BSTRC("true") || word == FX_BSTRC("false")) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_BOOLEAN;

+        }

+        pRet = CPDF_Boolean::Create(word == FX_BSTRC("true"));

+        return pRet;

+    }

+    if (word == FX_BSTRC("null")) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_NULL;

+        }

+        pRet = CPDF_Null::Create();

+        return pRet;

+    }

+    if (word == FX_BSTRC("(")) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_STRING;

+        }

+        FX_FILESIZE SavedPos = m_Pos - 1;

+        CFX_ByteString str = ReadString();

+        if (m_pCryptoHandler && bDecrypt) {

+            m_pCryptoHandler->Decrypt(objnum, gennum, str);

+        }

+        pRet = CPDF_String::Create(str, FALSE);

+        return pRet;

+    }

+    if (word == FX_BSTRC("<")) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_STRING;

+        }

+        FX_FILESIZE SavedPos = m_Pos - 1;

+        CFX_ByteString str = ReadHexString();

+        if (m_pCryptoHandler && bDecrypt) {

+            m_pCryptoHandler->Decrypt(objnum, gennum, str);

+        }

+        pRet = CPDF_String::Create(str, TRUE);

+        return pRet;

+    }

+    if (word == FX_BSTRC("[")) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_ARRAY;

+        }

+        CPDF_Array* pArray = CPDF_Array::Create();

+        FX_FILESIZE firstPos = m_Pos - 1;

+        while (1) {

+            FX_FILESIZE SavedPos = m_Pos;

+            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);

+            if (pObj == NULL) {

+                return pArray;

+            }

+            pArray->Add(pObj);

+        }

+    }

+    if (word[0] == '/') {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_NAME;

+        }

+        pRet = CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));

+        return pRet;

+    }

+    if (word == FX_BSTRC("<<")) {

+        FX_FILESIZE saveDictOffset = m_Pos - 2;

+        FX_DWORD dwDictSize = 0;

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_DICTIONARY;

+        }

+        if (pContext) {

+            pContext->m_DictStart = SavedPos;

+        }

+        CPDF_Dictionary* pDict = CPDF_Dictionary::Create();

+        FX_INT32 nKeys = 0;

+        FX_FILESIZE dwSignValuePos = 0;

+        while (1) {

+            FX_BOOL bIsNumber;

+            CFX_ByteString key = GetNextWord(bIsNumber);

+            if (key.IsEmpty()) {

+                pDict->Release();

+                return NULL;

+            }

+            FX_FILESIZE SavedPos = m_Pos - key.GetLength();

+            if (key == FX_BSTRC(">>")) {

+                dwDictSize = m_Pos - saveDictOffset;

+                break;

+            }

+            if (key == FX_BSTRC("endobj")) {

+                dwDictSize = m_Pos - 6 - saveDictOffset;

+                m_Pos = SavedPos;

+                break;

+            }

+            if (key[0] != '/') {

+                continue;

+            }

+            nKeys ++;

+            key = PDF_NameDecode(key);

+            if (key == FX_BSTRC("/Contents")) {

+                dwSignValuePos = m_Pos;

+            }

+            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);

+            if (pObj == NULL) {

+                continue;

+            }

+            if (key.GetLength() == 1) {

+                pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);

+            } else {

+                if (nKeys < 32) {

+                    pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);

+                } else {

+                    pDict->AddValue(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);

+                }

+            }

+        }

+        if (IsSignatureDict(pDict)) {

+            FX_FILESIZE dwSavePos = m_Pos;

+            m_Pos = dwSignValuePos;

+            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1, NULL, FALSE);

+            pDict->SetAt(FX_BSTRC("Contents"), pObj);

+            m_Pos = dwSavePos;

+        }

+        if (pContext) {

+            pContext->m_DictEnd = m_Pos;

+            if (pContext->m_Flags & PDFPARSE_NOSTREAM) {

+                return pDict;

+            }

+        }

+        FX_FILESIZE SavedPos = m_Pos;

+        FX_BOOL bIsNumber;

+        CFX_ByteString nextword = GetNextWord(bIsNumber);

+        if (nextword == FX_BSTRC("stream")) {

+            CPDF_Stream* pStream = ReadStream(pDict, pContext, objnum, gennum);

+            if (pStream) {

+                return pStream;

+            }

+            pDict->Release();

+            return NULL;

+        } else {

+            m_Pos = SavedPos;

+            return pDict;

+        }

+    }

+    if (word == FX_BSTRC(">>")) {

+        m_Pos = SavedPos;

+        return NULL;

+    }

+    if (bTypeOnly) {

+        return (CPDF_Object*)PDFOBJ_INVALID;

+    }

+    return NULL;

+}

+CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum,

+        FX_INT32 level, struct PARSE_CONTEXT* pContext)

+{

+    if (level > _PARSER_OBJECT_LEVLE_) {

+        return NULL;

+    }

+    FX_FILESIZE SavedPos = m_Pos;

+    FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);

+    FX_BOOL bIsNumber;

+    CFX_ByteString word = GetNextWord(bIsNumber);

+    if (word.GetLength() == 0) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_INVALID;

+        }

+        return NULL;

+    }

+    if (bIsNumber) {

+        FX_FILESIZE SavedPos = m_Pos;

+        CFX_ByteString nextword = GetNextWord(bIsNumber);

+        if (bIsNumber) {

+            CFX_ByteString nextword2 = GetNextWord(bIsNumber);

+            if (nextword2 == FX_BSTRC("R")) {

+                FX_DWORD objnum = FXSYS_atoi(word);

+                if (bTypeOnly) {

+                    return (CPDF_Object*)PDFOBJ_REFERENCE;

+                }

+                return CPDF_Reference::Create(pObjList, objnum);

+            } else {

+                m_Pos = SavedPos;

+                if (bTypeOnly) {

+                    return (CPDF_Object*)PDFOBJ_NUMBER;

+                }

+                return CPDF_Number::Create(word);

+            }

+        } else {

+            m_Pos = SavedPos;

+            if (bTypeOnly) {

+                return (CPDF_Object*)PDFOBJ_NUMBER;

+            }

+            return CPDF_Number::Create(word);

+        }

+    }

+    if (word == FX_BSTRC("true") || word == FX_BSTRC("false")) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_BOOLEAN;

+        }

+        return CPDF_Boolean::Create(word == FX_BSTRC("true"));

+    }

+    if (word == FX_BSTRC("null")) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_NULL;

+        }

+        return CPDF_Null::Create();

+    }

+    if (word == FX_BSTRC("(")) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_STRING;

+        }

+        CFX_ByteString str = ReadString();

+        if (m_pCryptoHandler) {

+            m_pCryptoHandler->Decrypt(objnum, gennum, str);

+        }

+        return CPDF_String::Create(str, FALSE);

+    }

+    if (word == FX_BSTRC("<")) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_STRING;

+        }

+        CFX_ByteString str = ReadHexString();

+        if (m_pCryptoHandler) {

+            m_pCryptoHandler->Decrypt(objnum, gennum, str);

+        }

+        return CPDF_String::Create(str, TRUE);

+    }

+    if (word == FX_BSTRC("[")) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_ARRAY;

+        }

+        CPDF_Array* pArray = CPDF_Array::Create();

+        while (1) {

+            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);

+            if (pObj == NULL) {

+                if (m_WordBuffer[0] == ']') {

+                    return pArray;

+                }

+                pArray->Release();

+                return NULL;

+            }

+            pArray->Add(pObj);

+        }

+    }

+    if (word[0] == '/') {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_NAME;

+        }

+        return CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));

+    }

+    if (word == FX_BSTRC("<<")) {

+        if (bTypeOnly) {

+            return (CPDF_Object*)PDFOBJ_DICTIONARY;

+        }

+        if (pContext) {

+            pContext->m_DictStart = SavedPos;

+        }

+        CPDF_Dictionary* pDict = CPDF_Dictionary::Create();

+        while (1) {

+            FX_BOOL bIsNumber;

+            FX_FILESIZE SavedPos = m_Pos;

+            CFX_ByteString key = GetNextWord(bIsNumber);

+            if (key.IsEmpty()) {

+                pDict->Release();

+                return NULL;

+            }

+            if (key == FX_BSTRC(">>")) {

+                break;

+            }

+            if (key == FX_BSTRC("endobj")) {

+                m_Pos = SavedPos;

+                break;

+            }

+            if (key[0] != '/') {

+                continue;

+            }

+            key = PDF_NameDecode(key);

+            CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);

+            if (pObj == NULL) {

+                pDict->Release();

+                FX_BYTE ch;

+                while (1) {

+                    if (!GetNextChar(ch)) {

+                        break;

+                    }

+                    if (ch == 0x0A || ch == 0x0D) {

+                        break;

+                    }

+                }

+                return NULL;

+            }

+            if (key.GetLength() == 1) {

+                pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);

+            } else {

+                pDict->AddValue(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);

+            }

+        }

+        if (pContext) {

+            pContext->m_DictEnd = m_Pos;

+            if (pContext->m_Flags & PDFPARSE_NOSTREAM) {

+                return pDict;

+            }

+        }

+        FX_FILESIZE SavedPos = m_Pos;

+        FX_BOOL bIsNumber;

+        CFX_ByteString nextword = GetNextWord(bIsNumber);

+        if (nextword == FX_BSTRC("stream")) {

+            CPDF_Stream* pStream = ReadStream(pDict, pContext, objnum, gennum);

+            if (pStream) {

+                return pStream;

+            }

+            pDict->Release();

+            return NULL;

+        } else {

+            m_Pos = SavedPos;

+            return pDict;

+        }

+    }

+    if (word == FX_BSTRC(">>")) {

+        m_Pos = SavedPos;

+        return NULL;

+    }

+    if (bTypeOnly) {

+        return (CPDF_Object*)PDFOBJ_INVALID;

+    }

+    return NULL;

+}

+CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, PARSE_CONTEXT* pContext,

+        FX_DWORD objnum, FX_DWORD gennum)

+{

+    CPDF_Object* pLenObj = pDict->GetElement(FX_BSTRC("Length"));

+    FX_DWORD len = 0;

+    if (pLenObj && (pLenObj->GetType() != PDFOBJ_REFERENCE ||

+                    (((CPDF_Reference*)pLenObj)->GetObjList() != NULL) &&

+                    ((CPDF_Reference*)pLenObj)->GetRefObjNum() != objnum)) {

+        FX_FILESIZE pos = m_Pos;

+        if (pLenObj) {

+            len = pLenObj->GetInteger();

+        }

+        m_Pos = pos;

+        if (len > 0x40000000) {

+            return NULL;

+        }

+    }

+    ToNextLine();

+    FX_FILESIZE StreamStartPos = m_Pos;

+    if (pContext) {

+        pContext->m_DataStart = m_Pos;

+    }

+    m_Pos += len;

+    CPDF_CryptoHandler* pCryptoHandler = objnum == (FX_DWORD)m_MetadataObjnum ? NULL : m_pCryptoHandler;

+    if (pCryptoHandler == NULL) {

+        FX_FILESIZE SavedPos = m_Pos;

+        GetNextWord();

+        if (m_WordSize < 9 || FXSYS_memcmp32(m_WordBuffer, "endstream", 9)) {

+            m_Pos = StreamStartPos;

+            FX_FILESIZE offset = FindTag(FX_BSTRC("endstream"), 0);

+            if (offset >= 0) {

+                FX_FILESIZE curPos = m_Pos;

+                m_Pos = StreamStartPos;

+                FX_FILESIZE endobjOffset = FindTag(FX_BSTRC("endobj"), 0);

+                if (endobjOffset < offset && endobjOffset >= 0) {

+                    offset = endobjOffset;

+                } else {

+                    m_Pos = curPos;

+                }

+                FX_BYTE byte1, byte2;

+                GetCharAt(StreamStartPos + offset - 1, byte1);

+                GetCharAt(StreamStartPos + offset - 2, byte2);

+                if (byte1 == 0x0a && byte2 == 0x0d) {

+                    len -= 2;

+                } else if (byte1 == 0x0a || byte1 == 0x0d) {

+                    len --;

+                }

+                len = (FX_DWORD)offset;

+                pDict->SetAtInteger(FX_BSTRC("Length"), len);

+            } else {

+                m_Pos = StreamStartPos;

+                if (FindTag(FX_BSTRC("endobj"), 0) < 0) {

+                    return NULL;

+                }

+            }

+        }

+    }

+    m_Pos = StreamStartPos;

+    CPDF_Stream* pStream;

+#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)

+    pStream = FX_NEW CPDF_Stream(m_pFileAccess, pCryptoHandler, m_HeaderOffset + m_Pos, len, pDict, gennum);

+    m_Pos += len;

+#else

+    FX_LPBYTE pData = FX_Alloc(FX_BYTE, len);

+    if (!pData) {

+        return NULL;

+    }

+    ReadBlock(pData, len);

+    if (pCryptoHandler) {

+        CFX_BinaryBuf dest_buf;

+        dest_buf.EstimateSize(pCryptoHandler->DecryptGetSize(len));

+        FX_LPVOID context = pCryptoHandler->DecryptStart(objnum, gennum);

+        pCryptoHandler->DecryptStream(context, pData, len, dest_buf);

+        pCryptoHandler->DecryptFinish(context, dest_buf);

+        FX_Free(pData);

+        pData = dest_buf.GetBuffer();

+        len = dest_buf.GetSize();

+        dest_buf.DetachBuffer();

+    }

+    pStream = FX_NEW CPDF_Stream(pData, len, pDict);

+#endif

+    if (pContext) {

+        pContext->m_DataEnd = pContext->m_DataStart + len;

+    }

+    StreamStartPos = m_Pos;

+    GetNextWord();

+    if (m_WordSize == 6 && 0 == FXSYS_memcmp32(m_WordBuffer, "endobj", 6)) {

+        m_Pos = StreamStartPos;

+    }

+    return pStream;

+}

+void CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOffset)

+{

+    if (m_pFileBuf) {

+        FX_Free(m_pFileBuf);

+        m_pFileBuf = NULL;

+    }

+    m_pFileBuf = FX_Alloc(FX_BYTE, m_BufSize);

+    m_HeaderOffset = HeaderOffset;

+    m_FileLen = pFileAccess->GetSize();

+    m_Pos = 0;

+    m_pFileAccess = pFileAccess;

+    m_BufOffset = 0;

+    pFileAccess->ReadBlock(m_pFileBuf, 0, (size_t)((FX_FILESIZE)m_BufSize > m_FileLen ? m_FileLen : m_BufSize));

+}

+FX_INT32 CPDF_SyntaxParser::GetDirectNum()

+{

+    GetNextWord();

+    if (!m_bIsNumber) {

+        return 0;

+    }

+    m_WordBuffer[m_WordSize] = 0;

+    return FXSYS_atoi((FX_LPCSTR)m_WordBuffer);

+}

+FX_BOOL CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit, FX_LPCBYTE tag, FX_DWORD taglen)

+{

+    FX_BYTE type = _PDF_CharType[tag[0]];

+    FX_BOOL bCheckLeft = type != 'D' && type != 'W';

+    type = _PDF_CharType[tag[taglen - 1]];

+    FX_BOOL bCheckRight = type != 'D' || type != 'W';

+    FX_BYTE ch;

+    if (bCheckRight && startpos + (FX_INT32)taglen <= limit && GetCharAt(startpos + (FX_INT32)taglen, ch)) {

+        FX_BYTE type = _PDF_CharType[ch];

+        if (type == 'N' || type == 'R') {

+            return FALSE;

+        }

+    }

+    if (bCheckLeft && startpos > 0 && GetCharAt(startpos - 1, ch)) {

+        FX_BYTE type = _PDF_CharType[ch];

+        if (type == 'N' || type == 'R') {

+            return FALSE;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_SyntaxParser::SearchWord(FX_BSTR tag, FX_BOOL bWholeWord, FX_BOOL bForward, FX_FILESIZE limit)

+{

+    FX_INT32 taglen = tag.GetLength();

+    if (taglen == 0) {

+        return FALSE;

+    }

+    FX_FILESIZE pos = m_Pos;

+    FX_INT32 offset = 0;

+    if (!bForward) {

+        offset = taglen - 1;

+    }

+    FX_LPCBYTE tag_data = tag;

+    FX_BYTE byte;

+    while (1) {

+        if (bForward) {

+            if (limit) {

+                if (pos >= m_Pos + limit) {

+                    return FALSE;

+                }

+            }

+            if (!GetCharAt(pos, byte)) {

+                return FALSE;

+            }

+        } else {

+            if (limit) {

+                if (pos <= m_Pos - limit) {

+                    return FALSE;

+                }

+            }

+            if (!GetCharAtBackward(pos, byte)) {

+                return FALSE;

+            }

+        }

+        if (byte == tag_data[offset]) {

+            if (bForward) {

+                offset ++;

+                if (offset < taglen) {

+                    pos ++;

+                    continue;

+                }

+            } else {

+                offset --;

+                if (offset >= 0) {

+                    pos --;

+                    continue;

+                }

+            }

+            FX_FILESIZE startpos = bForward ? pos - taglen + 1 : pos;

+            if (!bWholeWord || IsWholeWord(startpos, limit, tag, taglen)) {

+                m_Pos = startpos;

+                return TRUE;

+            }

+        }

+        if (bForward) {

+            offset = byte == tag_data[0] ? 1 : 0;

+            pos ++;

+        } else {

+            offset = byte == tag_data[taglen - 1] ? taglen - 2 : taglen - 1;

+            pos --;

+        }

+        if (pos < 0) {

+            return FALSE;

+        }

+    }

+    return FALSE;

+}

+struct _SearchTagRecord {

+    FX_LPCBYTE	m_pTag;

+    FX_DWORD	m_Len;

+    FX_DWORD	m_Offset;

+};

+FX_INT32 CPDF_SyntaxParser::SearchMultiWord(FX_BSTR tags, FX_BOOL bWholeWord, FX_FILESIZE limit)

+{

+    FX_INT32 ntags = 1, i;

+    for (i = 0; i < tags.GetLength(); i ++)

+        if (tags[i] == 0) {

+            ntags ++;

+        }

+    _SearchTagRecord* pPatterns = FX_Alloc(_SearchTagRecord, ntags);

+    FX_DWORD start = 0, itag = 0, max_len = 0;

+    for (i = 0; i <= tags.GetLength(); i ++) {

+        if (tags[i] == 0) {

+            FX_DWORD len = i - start;

+            if (len > max_len) {

+                max_len = len;

+            }

+            pPatterns[itag].m_pTag = tags.GetPtr() + start;

+            pPatterns[itag].m_Len = len;

+            pPatterns[itag].m_Offset = 0;

+            start = i + 1;

+            itag ++;

+        }

+    }

+    FX_FILESIZE pos = m_Pos;

+    FX_BYTE byte;

+    GetCharAt(pos++, byte);

+    FX_INT32 found = -1;

+    while (1) {

+        for (i = 0; i < ntags; i ++) {

+            if (pPatterns[i].m_pTag[pPatterns[i].m_Offset] == byte) {

+                pPatterns[i].m_Offset ++;

+                if (pPatterns[i].m_Offset == pPatterns[i].m_Len) {

+                    if (!bWholeWord || IsWholeWord(pos - pPatterns[i].m_Len, limit, pPatterns[i].m_pTag, pPatterns[i].m_Len)) {

+                        found = i;

+                        goto end;

+                    } else {

+                        if (pPatterns[i].m_pTag[0] == byte) {

+                            pPatterns[i].m_Offset = 1;

+                        } else {

+                            pPatterns[i].m_Offset = 0;

+                        }

+                    }

+                }

+            } else {

+                if (pPatterns[i].m_pTag[0] == byte) {

+                    pPatterns[i].m_Offset = 1;

+                } else {

+                    pPatterns[i].m_Offset = 0;

+                }

+            }

+        }

+        if (limit && pos >= m_Pos + limit) {

+            goto end;

+        }

+        if (!GetCharAt(pos, byte)) {

+            goto end;

+        }

+        pos ++;

+    }

+end:

+    FX_Free(pPatterns);

+    return found;

+}

+FX_FILESIZE CPDF_SyntaxParser::FindTag(FX_BSTR tag, FX_FILESIZE limit)

+{

+    FX_INT32 taglen = tag.GetLength();

+    FX_INT32 match = 0;

+    limit += m_Pos;

+    FX_FILESIZE startpos = m_Pos;

+    while (1) {

+        FX_BYTE ch;

+        if (!GetNextChar(ch)) {

+            return -1;

+        }

+        if (ch == tag[match]) {

+            match ++;

+            if (match == taglen) {

+                return m_Pos - startpos - taglen;

+            }

+        } else {

+            match = ch == tag[0] ? 1 : 0;

+        }

+        if (limit && m_Pos == limit) {

+            return -1;

+        }

+    }

+    return -1;

+}

+void CPDF_SyntaxParser::GetBinary(FX_BYTE* buffer, FX_DWORD size)

+{

+    FX_DWORD offset = 0;

+    FX_BYTE ch;

+    while (1) {

+        if (!GetNextChar(ch)) {

+            return;

+        }

+        buffer[offset++] = ch;

+        if (offset == size) {

+            break;

+        }

+    }

+}

+CPDF_DataAvail::CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead)

+{

+    m_pFileAvail = pFileAvail;

+    m_pFileRead = pFileRead;

+    m_Pos = 0;

+    m_dwFileLen = 0;

+    if (m_pFileRead) {

+        m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize();

+    }

+    m_dwCurrentOffset = 0;

+    m_WordSize = 0;

+    m_dwXRefOffset = 0;

+    m_bufferOffset = 0;

+    m_dwFirstPageNo = 0;

+    m_bufferSize = 0;

+    m_PagesObjNum = 0;

+    m_dwCurrentXRefSteam = 0;

+    m_dwAcroFormObjNum = 0;

+    m_dwInfoObjNum = 0;

+    m_pDocument = 0;

+    m_dwEncryptObjNum = 0;

+    m_dwPrevXRefOffset = 0;

+    m_dwLastXRefOffset = 0;

+    m_bDocAvail = FALSE;

+    m_bMainXRefLoad = FALSE;

+    m_bDocAvail = FALSE;

+    m_bLinearized = FALSE;

+    m_bPagesLoad = FALSE;

+    m_bPagesTreeLoad = FALSE;

+    m_bMainXRefLoadedOK = FALSE;

+    m_bAnnotsLoad = FALSE;

+    m_bHaveAcroForm = FALSE;

+    m_bAcroFormLoad = FALSE;

+    m_bPageLoadedOK = FALSE;

+    m_bNeedDownLoadResource = FALSE;

+    m_bLinearizedFormParamLoad = FALSE;

+    m_pLinearized = NULL;

+    m_pRoot = NULL;

+    m_pTrailer = NULL;

+    m_pCurrentParser = NULL;

+    m_pAcroForm = NULL;

+    m_pPageDict = NULL;

+    m_pPageResource = NULL;

+    m_pageMapCheckState = NULL;

+    m_docStatus = PDF_DATAAVAIL_HEADER;

+    m_parser.m_bOwnFileRead = FALSE;

+    m_bTotalLoadPageTree = FALSE;

+    m_bCurPageDictLoadOK = FALSE;

+    m_bLinearedDataOK = FALSE;

+    m_pagesLoadState = NULL;

+}

+CPDF_DataAvail::~CPDF_DataAvail()

+{

+    if (m_pLinearized)	{

+        m_pLinearized->Release();

+    }

+    if (m_pRoot) {

+        m_pRoot->Release();

+    }

+    if (m_pTrailer) {

+        m_pTrailer->Release();

+    }

+    if (m_pageMapCheckState) {

+        delete m_pageMapCheckState;

+    }

+    if (m_pagesLoadState) {

+        delete m_pagesLoadState;

+    }

+    FX_INT32 i = 0;

+    FX_INT32 iSize = m_arrayAcroforms.GetSize();

+    for (i = 0; i < iSize; ++i) {

+        ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release();

+    }

+}

+void CPDF_DataAvail::SetDocument(CPDF_Document* pDoc)

+{

+    m_pDocument = pDoc;

+}

+FX_DWORD CPDF_DataAvail::GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset)

+{

+    CPDF_Parser *pParser = (CPDF_Parser *)(m_pDocument->GetParser());

+    if (pParser == NULL) {

+        return 0;

+    }

+    if (objnum >= (FX_DWORD)pParser->m_CrossRef.GetSize()) {

+        return 0;

+    }

+    if (pParser->m_V5Type[objnum] == 2) {

+        objnum = (FX_DWORD)pParser->m_CrossRef[objnum];

+    }

+    if (pParser->m_V5Type[objnum] == 1 || pParser->m_V5Type[objnum] == 255) {

+        offset = pParser->m_CrossRef[objnum];

+        if (offset == 0) {

+            return 0;

+        }

+        FX_LPVOID pResult = FXSYS_bsearch(&offset, pParser->m_SortedOffset.GetData(), pParser->m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+        if (pResult == NULL) {

+            return 0;

+        }

+        if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)pParser->m_SortedOffset.GetData() == pParser->m_SortedOffset.GetSize() - 1) {

+            return 0;

+        }

+        return (FX_DWORD)(((FX_FILESIZE*)pResult)[1] - offset);

+    }

+    return 0;

+}

+FX_BOOL CPDF_DataAvail::IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePage, IFX_DownloadHints* pHints, CFX_PtrArray &ret_array)

+{

+    if (!obj_array.GetSize()) {

+        return TRUE;

+    }

+    FX_DWORD count = 0;

+    CFX_PtrArray new_obj_array;

+    FX_INT32 i = 0;

+    for (i = 0; i < obj_array.GetSize(); i++) {

+        CPDF_Object *pObj = (CPDF_Object *)obj_array[i];

+        if (!pObj) {

+            continue;

+        }

+        FX_INT32 type = pObj->GetType();

+        switch (type) {

+            case PDFOBJ_ARRAY: {

+                    CPDF_Array *pArray = pObj->GetArray();

+                    for (FX_DWORD k = 0; k < pArray->GetCount(); k++) {

+                        new_obj_array.Add(pArray->GetElement(k));

+                    }

+                }

+                break;

+            case PDFOBJ_STREAM:

+                pObj = pObj->GetDict();

+            case PDFOBJ_DICTIONARY: {

+                    CPDF_Dictionary *pDict = pObj->GetDict();

+                    if (pDict->GetString("Type") == "Page" && !bParsePage) {

+                        continue;

+                    }

+                    FX_POSITION pos = pDict->GetStartPos();

+                    while (pos) {

+                        CPDF_Object *value;

+                        CFX_ByteString key;

+                        value = pDict->GetNextElement(pos, key);

+                        if (key != "Parent") {

+                            new_obj_array.Add(value);

+                        }

+                    }

+                }

+                break;

+            case PDFOBJ_REFERENCE: {

+                    CPDF_Reference *pRef = (CPDF_Reference*)pObj;

+                    FX_DWORD dwNum = pRef->GetRefObjNum();

+                    FX_FILESIZE offset;

+                    FX_DWORD size = GetObjectSize(pRef->GetRefObjNum(), offset);

+                    if (!size) {

+                        break;

+                    }

+                    size = (FX_DWORD)((FX_FILESIZE)(offset + size + 512) > m_dwFileLen ? m_dwFileLen - offset : size + 512);

+                    if (!m_pFileAvail->IsDataAvail(offset, size)) {

+                        pHints->AddSegment(offset, size);

+                        ret_array.Add(pObj);

+                        count++;

+                    } else if (!m_objnum_array.Find(dwNum)) {

+                        m_objnum_array.AddObjNum(dwNum);

+                        CPDF_Object *pReferred = m_pDocument->GetIndirectObject(pRef->GetRefObjNum(), NULL);

+                        if (pReferred) {

+                            new_obj_array.Add(pReferred);

+                        }

+                    }

+                }

+                break;

+        }

+    }

+    if (count > 0) {

+        FX_INT32 iSize = new_obj_array.GetSize();

+        for (i = 0; i < iSize; ++i) {

+            CPDF_Object *pObj = (CPDF_Object *)new_obj_array[i];

+            FX_INT32 type = pObj->GetType();

+            if (type == PDFOBJ_REFERENCE) {

+                CPDF_Reference *pRef = (CPDF_Reference *)pObj;

+                FX_DWORD dwNum = pRef->GetRefObjNum();

+                if (!m_objnum_array.Find(dwNum)) {

+                    ret_array.Add(pObj);

+                }

+            } else {

+                ret_array.Add(pObj);

+            }

+        }

+        return FALSE;

+    }

+    obj_array.RemoveAll();

+    obj_array.Append(new_obj_array);

+    return IsObjectsAvail(obj_array, FALSE, pHints, ret_array);

+}

+FX_BOOL CPDF_DataAvail::IsDocAvail(IFX_DownloadHints* pHints)

+{

+    if (!m_dwFileLen && m_pFileRead) {

+        m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize();

+        if (!m_dwFileLen) {

+            return TRUE;

+        }

+    }

+    while (!m_bDocAvail) {

+        if (!CheckDocStatus(pHints)) {

+            return FALSE;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(IFX_DownloadHints* pHints)

+{

+    if (!m_objs_array.GetSize()) {

+        m_objs_array.RemoveAll();

+        m_objnum_array.RemoveAll();

+        CFX_PtrArray obj_array;

+        obj_array.Append(m_arrayAcroforms);

+        FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array);

+        if (bRet) {

+            m_objs_array.RemoveAll();

+        }

+        return bRet;

+    } else {

+        CFX_PtrArray new_objs_array;

+        FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);

+        if (bRet) {

+            FX_INT32 iSize = m_arrayAcroforms.GetSize();

+            for (FX_INT32 i = 0; i < iSize; ++i) {

+                ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release();

+            }

+            m_arrayAcroforms.RemoveAll();

+        } else {

+            m_objs_array.RemoveAll();

+            m_objs_array.Append(new_objs_array);

+        }

+        return bRet;

+    }

+}

+FX_BOOL CPDF_DataAvail::CheckAcroForm(IFX_DownloadHints* pHints)

+{

+    FX_BOOL bExist = FALSE;

+    m_pAcroForm = GetObject(m_dwAcroFormObjNum, pHints, &bExist);

+    if (!bExist) {

+        m_docStatus = PDF_DATAAVAIL_PAGETREE;

+        return TRUE;

+    }

+    if (!m_pAcroForm) {

+        if (m_docStatus == PDF_DATAAVAIL_ERROR) {

+            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+            return TRUE;

+        }

+        return FALSE;

+    }

+    m_arrayAcroforms.Add(m_pAcroForm);

+    m_docStatus = PDF_DATAAVAIL_PAGETREE;

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::CheckDocStatus(IFX_DownloadHints *pHints)

+{

+    switch (m_docStatus) {

+        case PDF_DATAAVAIL_HEADER:

+            return CheckHeader(pHints);

+        case PDF_DATAAVAIL_FIRSTPAGE:

+        case PDF_DATAAVAIL_FIRSTPAGE_PREPARE:

+            return CheckFirstPage(pHints);

+        case PDF_DATAAVAIL_END:

+            return CheckEnd(pHints);

+        case PDF_DATAAVAIL_CROSSREF:

+            return CheckCrossRef(pHints);

+        case PDF_DATAAVAIL_CROSSREF_ITEM:

+            return CheckCrossRefItem(pHints);

+        case PDF_DATAAVAIL_CROSSREF_STREAM:

+            return CheckAllCrossRefStream(pHints);

+        case PDF_DATAAVAIL_TRAILER:

+            return CheckTrailer(pHints);

+        case PDF_DATAAVAIL_TRAILER_APPEND:

+            return CheckTrailerAppend(pHints);

+        case PDF_DATAAVAIL_LOADALLCRSOSSREF:

+            return LoadAllXref(pHints);

+        case PDF_DATAAVAIL_LOADALLFILE:

+            return LoadAllFile(pHints);

+        case PDF_DATAAVAIL_ROOT:

+            return CheckRoot(pHints);

+        case PDF_DATAAVAIL_INFO:

+            return CheckInfo(pHints);

+        case PDF_DATAAVAIL_ACROFORM:

+            return CheckAcroForm(pHints);

+        case PDF_DATAAVAIL_PAGETREE:

+            if (m_bTotalLoadPageTree) {

+                return CheckPages(pHints);

+            } else {

+                return LoadDocPages(pHints);

+            }

+        case PDF_DATAAVAIL_PAGE:

+            if (m_bTotalLoadPageTree) {

+                return CheckPage(pHints);

+            } else {

+                m_docStatus = PDF_DATAAVAIL_PAGE_LATERLOAD;

+                return TRUE;

+            }

+        case PDF_DATAAVAIL_ERROR:

+            return LoadAllFile(pHints);

+        case PDF_DATAAVAIL_PAGE_LATERLOAD:

+            m_docStatus = PDF_DATAAVAIL_PAGE;

+        default:

+            m_bDocAvail = TRUE;

+            return TRUE;

+    }

+}

+FX_BOOL	CPDF_DataAvail::CheckPageStatus(IFX_DownloadHints* pHints)

+{

+    switch (m_docStatus) {

+        case PDF_DATAAVAIL_PAGETREE:

+            return CheckPages(pHints);

+        case PDF_DATAAVAIL_PAGE:

+            return CheckPage(pHints);

+        case PDF_DATAAVAIL_ERROR:

+            return LoadAllFile(pHints);

+        default:

+            m_bPagesTreeLoad = TRUE;

+            m_bPagesLoad = TRUE;

+            return TRUE;

+    }

+}

+FX_BOOL CPDF_DataAvail::LoadAllFile(IFX_DownloadHints* pHints)

+{

+    if (m_pFileAvail->IsDataAvail(0, (FX_DWORD)m_dwFileLen)) {

+        m_docStatus = PDF_DATAAVAIL_DONE;

+        return TRUE;

+    }

+    pHints->AddSegment(0, (FX_DWORD)m_dwFileLen);

+    return FALSE;

+}

+FX_BOOL CPDF_DataAvail::LoadAllXref(IFX_DownloadHints* pHints)

+{

+    m_parser.m_Syntax.InitParser(m_pFileRead, (FX_DWORD)m_dwHeaderOffset);

+    m_parser.m_bOwnFileRead = FALSE;

+    if (!m_parser.LoadAllCrossRefV4(m_dwLastXRefOffset) && !m_parser.LoadAllCrossRefV5(m_dwLastXRefOffset)) {

+        m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+        return FALSE;

+    }

+    FXSYS_qsort(m_parser.m_SortedOffset.GetData(), m_parser.m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);

+    m_dwRootObjNum = m_parser.GetRootObjNum();

+    m_dwInfoObjNum = m_parser.GetInfoObjNum();

+    m_pCurrentParser = &m_parser;

+    m_docStatus = PDF_DATAAVAIL_ROOT;

+    return TRUE;

+}

+CPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, IFX_DownloadHints* pHints, FX_BOOL *pExistInFile)

+{

+    CPDF_Object *pRet = NULL;

+    if (pExistInFile) {

+        *pExistInFile = TRUE;

+    }

+    if (m_pDocument == NULL) {

+        FX_FILESIZE offset = m_parser.GetObjectOffset(objnum);

+        if (offset < 0) {

+            *pExistInFile = FALSE;

+            return NULL;

+        }

+        FX_DWORD size = (FX_DWORD)m_parser.GetObjectSize(objnum);

+        size = (FX_DWORD)(((FX_FILESIZE)(offset + size + 512)) > m_dwFileLen ? m_dwFileLen - offset : size + 512);

+        if (!m_pFileAvail->IsDataAvail(offset, size)) {

+            pHints->AddSegment(offset, size);

+            return NULL;

+        }

+        pRet = m_parser.ParseIndirectObject(NULL, objnum);

+        if (!pRet && pExistInFile) {

+            *pExistInFile = FALSE;

+        }

+        return pRet;

+    }

+    FX_FILESIZE offset;

+    FX_DWORD size = GetObjectSize(objnum, offset);

+    size = (FX_DWORD)((FX_FILESIZE)(offset + size + 512) > m_dwFileLen ? m_dwFileLen - offset : size + 512);

+    if (!m_pFileAvail->IsDataAvail(offset, size)) {

+        pHints->AddSegment(offset, size);

+        return NULL;

+    }

+    CPDF_Parser *pParser = (CPDF_Parser *)(m_pDocument->GetParser());

+    pRet = pParser->ParseIndirectObject(NULL, objnum, NULL);

+    if (!pRet && pExistInFile) {

+        *pExistInFile = FALSE;

+    }

+    return pRet;

+}

+FX_BOOL CPDF_DataAvail::CheckInfo(IFX_DownloadHints* pHints)

+{

+    FX_BOOL bExist = FALSE;

+    CPDF_Object *pInfo = GetObject(m_dwInfoObjNum, pHints, &bExist);

+    if (!bExist) {

+        if (m_bHaveAcroForm) {

+            m_docStatus = PDF_DATAAVAIL_ACROFORM;

+        } else {

+            m_docStatus = PDF_DATAAVAIL_PAGETREE;

+        }

+        return TRUE;

+    }

+    if (!pInfo) {

+        if (m_docStatus == PDF_DATAAVAIL_ERROR) {

+            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+            return TRUE;

+        }

+        if (m_Pos == m_dwFileLen) {

+            m_docStatus = PDF_DATAAVAIL_ERROR;

+        }

+        return FALSE;

+    }

+    if (pInfo) {

+        pInfo->Release();

+    }

+    if (m_bHaveAcroForm) {

+        m_docStatus = PDF_DATAAVAIL_ACROFORM;

+    } else {

+        m_docStatus = PDF_DATAAVAIL_PAGETREE;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::CheckRoot(IFX_DownloadHints* pHints)

+{

+    FX_BOOL bExist = FALSE;

+    m_pRoot = GetObject(m_dwRootObjNum, pHints, &bExist);

+    if (!bExist) {

+        m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+        return TRUE;

+    }

+    if (!m_pRoot) {

+        if (m_docStatus == PDF_DATAAVAIL_ERROR) {

+            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+            return TRUE;

+        }

+        return FALSE;

+    }

+    CPDF_Reference* pRef = (CPDF_Reference*)m_pRoot->GetDict()->GetElement(FX_BSTRC("Pages"));

+    if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    m_PagesObjNum = pRef->GetRefObjNum();

+    CPDF_Reference* pAcroFormRef = (CPDF_Reference*)m_pRoot->GetDict()->GetElement(FX_BSTRC("AcroForm"));

+    if (pAcroFormRef && pAcroFormRef->GetType() == PDFOBJ_REFERENCE) {

+        m_bHaveAcroForm = TRUE;

+        m_dwAcroFormObjNum = pAcroFormRef->GetRefObjNum();

+    }

+    if (m_dwInfoObjNum) {

+        m_docStatus = PDF_DATAAVAIL_INFO;

+    } else {

+        if (m_bHaveAcroForm) {

+            m_docStatus = PDF_DATAAVAIL_ACROFORM;

+        } else {

+            m_docStatus = PDF_DATAAVAIL_PAGETREE;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::PreparePageItem()

+{

+    CPDF_Dictionary *pRoot = m_pDocument->GetRoot();

+    CPDF_Reference* pRef = (CPDF_Reference*)pRoot->GetElement(FX_BSTRC("Pages"));

+    if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    m_PagesObjNum = pRef->GetRefObjNum();

+    m_pCurrentParser = (CPDF_Parser *)m_pDocument->GetParser();

+    m_docStatus = PDF_DATAAVAIL_PAGETREE;

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::IsFirstCheck(int iPage)

+{

+    if (NULL == m_pageMapCheckState) {

+        m_pageMapCheckState = FX_NEW CFX_CMapDWordToDWord();

+    }

+    FX_DWORD dwValue = 0;

+    if (!m_pageMapCheckState->Lookup(iPage, dwValue)) {

+        m_pageMapCheckState->SetAt(iPage, 1);

+        return TRUE;

+    }

+    if (dwValue != 0) {

+        return FALSE;

+    }

+    m_pageMapCheckState->SetAt(iPage, 1);

+    return TRUE;

+}

+void CPDF_DataAvail::ResetFirstCheck(int iPage)

+{

+    if (NULL == m_pageMapCheckState) {

+        m_pageMapCheckState = FX_NEW CFX_CMapDWordToDWord();

+    }

+    FX_DWORD dwValue = 1;

+    if (!m_pageMapCheckState->Lookup(iPage, dwValue)) {

+        return;

+    }

+    m_pageMapCheckState->SetAt(iPage, 0);

+}

+FX_BOOL CPDF_DataAvail::CheckPage(IFX_DownloadHints* pHints)

+{

+    FX_DWORD i = 0;

+    FX_DWORD iLen = m_PageObjList.GetSize();

+    CFX_DWordArray UnavailObjList;

+    for (; i < iLen; ++i) {

+        FX_DWORD dwPageObjNum = m_PageObjList.GetAt(i);

+        FX_BOOL bExist = FALSE;

+        CPDF_Object *pObj = GetObject(dwPageObjNum, pHints, &bExist);

+        if (!pObj) {

+            if (bExist) {

+                UnavailObjList.Add(dwPageObjNum);

+            }

+            continue;

+        }

+        if (pObj->GetType() == PDFOBJ_ARRAY) {

+            CPDF_Array *pArray = pObj->GetArray();

+            if (pArray) {

+                FX_INT32 iSize = pArray->GetCount();

+                CPDF_Object *pItem = NULL;

+                for (FX_INT32 j = 0; j < iSize; ++j) {

+                    pItem = pArray->GetElement(j);

+                    if (pItem && pItem->GetType() == PDFOBJ_REFERENCE) {

+                        UnavailObjList.Add(((CPDF_Reference *)pItem)->GetRefObjNum());

+                    }

+                }

+            }

+        }

+        if (pObj->GetType() != PDFOBJ_DICTIONARY) {

+            pObj->Release();

+            continue;

+        }

+        CFX_ByteString type = pObj->GetDict()->GetString(FX_BSTRC("Type"));

+        if (type == FX_BSTRC("Pages")) {

+            m_PagesArray.Add(pObj);

+            continue;

+        }

+        pObj->Release();

+    }

+    m_PageObjList.RemoveAll();

+    if (UnavailObjList.GetSize()) {

+        m_PageObjList.Append(UnavailObjList);

+        return FALSE;

+    }

+    i = 0;

+    iLen = m_PagesArray.GetSize();

+    for (; i < iLen; ++i) {

+        CPDF_Object *pPages = (CPDF_Object *)m_PagesArray.GetAt(i);

+        if (!pPages) {

+            continue;

+        }

+        if (!GetPageKids(m_pCurrentParser, pPages)) {

+            pPages->Release();

+            while (i++ < iLen) {

+                pPages = (CPDF_Object *)m_PagesArray.GetAt(i);

+                pPages->Release();

+            }

+            m_PagesArray.RemoveAll();

+            m_docStatus = PDF_DATAAVAIL_ERROR;

+            return FALSE;

+        }

+        pPages->Release();

+    }

+    m_PagesArray.RemoveAll();

+    if (!m_PageObjList.GetSize()) {

+        m_docStatus = PDF_DATAAVAIL_DONE;

+        return TRUE;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::GetPageKids(CPDF_Parser *pParser, CPDF_Object *pPages)

+{

+    if (!pParser) {

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    CPDF_Object *pKids = pPages->GetDict()->GetElement(FX_BSTRC("Kids"));

+    if (!pKids) {

+        return TRUE;

+    }

+    switch (pKids->GetType()) {

+        case PDFOBJ_REFERENCE: {

+                CPDF_Reference *pKid = (CPDF_Reference *)pKids;

+                m_PageObjList.Add(pKid->GetRefObjNum());

+            }

+            break;

+        case PDFOBJ_ARRAY: {

+                CPDF_Array *pKidsArray = (CPDF_Array *)pKids;

+                for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) {

+                    CPDF_Reference *pKid = (CPDF_Reference *)pKidsArray->GetElement(i);

+                    m_PageObjList.Add(pKid->GetRefObjNum());

+                }

+            }

+            break;

+        default:

+            m_docStatus = PDF_DATAAVAIL_ERROR;

+            return FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::CheckPages(IFX_DownloadHints* pHints)

+{

+    FX_BOOL bExist = FALSE;

+    CPDF_Object *pPages = GetObject(m_PagesObjNum, pHints, &bExist);

+    if (!bExist) {

+        m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+        return TRUE;

+    }

+    if (!pPages) {

+        if (m_docStatus == PDF_DATAAVAIL_ERROR) {

+            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+            return TRUE;

+        }

+        return FALSE;

+    }

+    FX_BOOL bNeedLoad = FALSE;

+    if (!GetPageKids(m_pCurrentParser, pPages)) {

+        pPages->Release();

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    pPages->Release();

+    m_docStatus = PDF_DATAAVAIL_PAGE;

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::CheckHeader(IFX_DownloadHints* pHints)

+{

+    FX_DWORD req_size = 1024;

+    if ((FX_FILESIZE)req_size > m_dwFileLen) {

+        req_size = (FX_DWORD)m_dwFileLen;

+    }

+    if (m_pFileAvail->IsDataAvail(0, req_size)) {

+        FX_BYTE buffer[1024];

+        m_pFileRead->ReadBlock(buffer, 0, req_size);

+        if (IsLinearizedFile(buffer, req_size)) {

+            m_docStatus = PDF_DATAAVAIL_FIRSTPAGE;

+        } else {

+            if (m_docStatus == PDF_DATAAVAIL_ERROR) {

+                return FALSE;

+            }

+            m_docStatus = PDF_DATAAVAIL_END;

+        }

+        return TRUE;

+    }

+    pHints->AddSegment(0, req_size);

+    return FALSE;

+}

+FX_BOOL CPDF_DataAvail::CheckFirstPage(IFX_DownloadHints *pHints)

+{

+    FX_DWORD dwFirstPageEndOffset = 0;

+    CPDF_Object *pEndOffSet = m_pLinearized->GetDict()->GetElement(FX_BSTRC("E"));

+    if (!pEndOffSet) {

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    CPDF_Object *pXRefOffset  = m_pLinearized->GetDict()->GetElement(FX_BSTRC("T"));

+    if (!pXRefOffset) {

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    CPDF_Object *pFileLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));

+    if (!pFileLen) {

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    FX_BOOL bNeedDownLoad = FALSE;

+    if (pEndOffSet->GetType() == PDFOBJ_NUMBER) {

+        FX_DWORD dwEnd = pEndOffSet->GetInteger();

+        dwEnd += 512;

+        if ((FX_FILESIZE)dwEnd > m_dwFileLen) {

+            dwEnd = (FX_DWORD)m_dwFileLen;

+        }

+        FX_INT32 iStartPos = (FX_INT32)(m_dwFileLen > 1024 ? 1024 : m_dwFileLen);

+        FX_INT32 iSize = dwEnd > 1024 ? dwEnd - 1024 : 0;

+        if (!m_pFileAvail->IsDataAvail(iStartPos, iSize)) {

+            pHints->AddSegment(iStartPos, iSize);

+            bNeedDownLoad = TRUE;

+        }

+    }

+    m_dwLastXRefOffset = 0;

+    FX_FILESIZE dwFileLen = 0;

+    if (pXRefOffset->GetType() == PDFOBJ_NUMBER) {

+        m_dwLastXRefOffset = pXRefOffset->GetInteger();

+    }

+    if (pFileLen->GetType() == PDFOBJ_NUMBER) {

+        dwFileLen = pFileLen->GetInteger();

+    }

+    if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, (FX_DWORD)(dwFileLen - m_dwLastXRefOffset))) {

+        if (m_docStatus == PDF_DATAAVAIL_FIRSTPAGE)	{

+            FX_DWORD dwSize = (FX_DWORD)(dwFileLen - m_dwLastXRefOffset);

+            FX_FILESIZE offset = m_dwLastXRefOffset;

+            if (dwSize < 512 && dwFileLen > 512) {

+                dwSize = 512;

+                offset = dwFileLen - 512;

+            }

+            pHints->AddSegment(offset, dwSize);

+        }

+    } else {

+        m_docStatus = PDF_DATAAVAIL_FIRSTPAGE_PREPARE;

+    }

+    if (!bNeedDownLoad && m_docStatus == PDF_DATAAVAIL_FIRSTPAGE_PREPARE) {

+        m_docStatus = PDF_DATAAVAIL_DONE;

+        return TRUE;

+    }

+    m_docStatus = PDF_DATAAVAIL_FIRSTPAGE_PREPARE;

+    return FALSE;

+}

+CPDF_Object	* CPDF_DataAvail::ParseIndirectObjectAt(FX_FILESIZE pos, FX_DWORD objnum)

+{

+    FX_FILESIZE SavedPos = m_syntaxParser.SavePos();

+    m_syntaxParser.RestorePos(pos);

+    FX_BOOL bIsNumber;

+    CFX_ByteString word = m_syntaxParser.GetNextWord(bIsNumber);

+    if (!bIsNumber) {

+        return NULL;

+    }

+    FX_DWORD real_objnum = FXSYS_atoi(word);

+    if (objnum && real_objnum != objnum) {

+        return NULL;

+    }

+    word = m_syntaxParser.GetNextWord(bIsNumber);

+    if (!bIsNumber) {

+        return NULL;

+    }

+    FX_DWORD gennum = FXSYS_atoi(word);

+    if (m_syntaxParser.GetKeyword() != FX_BSTRC("obj")) {

+        m_syntaxParser.RestorePos(SavedPos);

+        return NULL;

+    }

+    CPDF_Object* pObj = m_syntaxParser.GetObject(NULL, objnum, gennum, 0);

+    m_syntaxParser.RestorePos(SavedPos);

+    return pObj;

+}

+FX_INT32 CPDF_DataAvail::IsLinearizedPDF()

+{

+    FX_DWORD req_size = 1024;

+    if (!m_pFileAvail->IsDataAvail(0, req_size)) {

+        return PDF_UNKNOW_LINEARIZED;

+    }

+    if (!m_pFileRead) {

+        return PDF_NOT_LINEARIZED;

+    }

+    FX_FILESIZE dwSize = m_pFileRead->GetSize();

+    if (dwSize < (FX_FILESIZE)req_size) {

+        return PDF_UNKNOW_LINEARIZED;

+    }

+    FX_BYTE buffer[1024];

+    m_pFileRead->ReadBlock(buffer, 0, req_size);

+    if (IsLinearizedFile(buffer, req_size)) {

+        return PDF_IS_LINEARIZED;

+    }

+    return PDF_NOT_LINEARIZED;

+}

+FX_BOOL CPDF_DataAvail::IsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen)

+{

+    CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pData, (size_t)dwLen, FALSE));

+    FX_INT32 offset = GetHeaderOffset((IFX_FileStream*)file);

+    if (offset == -1) {

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    m_dwHeaderOffset = offset;

+    m_syntaxParser.InitParser((IFX_FileStream*)file, offset);

+    m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9);

+    FX_BOOL bNumber = FALSE;

+    FX_FILESIZE dwSavePos = m_syntaxParser.SavePos();

+    CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(bNumber);

+    if (!bNumber) {

+        return FALSE;

+    }

+    FX_DWORD objnum = FXSYS_atoi(wordObjNum);

+    if (m_pLinearized) {

+        m_pLinearized->Release();

+        m_pLinearized = NULL;

+    }

+    m_pLinearized = ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum);

+    if (!m_pLinearized) {

+        return FALSE;

+    }

+    if (m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) {

+        CPDF_Object *pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));

+        if (!pLen) {

+            return FALSE;

+        }

+        if ((FX_FILESIZE)pLen->GetInteger() != m_pFileRead->GetSize()) {

+            return FALSE;

+        }

+        m_bLinearized = TRUE;

+        CPDF_Object *pNo = m_pLinearized->GetDict()->GetElement(FX_BSTRC("P"));

+        if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {

+            m_dwFirstPageNo = pNo->GetInteger();

+        }

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints)

+{

+    FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0);

+    FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos);

+    if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) {

+        FX_BYTE buffer[1024];

+        m_pFileRead->ReadBlock(buffer, req_pos, dwSize);

+        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(buffer, (size_t)dwSize, FALSE));

+        m_syntaxParser.InitParser((IFX_FileStream*)file, 0);

+        m_syntaxParser.RestorePos(dwSize - 1);

+        if (m_syntaxParser.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, dwSize)) {

+            FX_BOOL bNumber;

+            m_syntaxParser.GetNextWord(bNumber);

+            CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(bNumber);

+            if (!bNumber) {

+                m_docStatus = PDF_DATAAVAIL_ERROR;

+                return FALSE;

+            }

+            m_dwXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);

+            if (!m_dwXRefOffset || m_dwXRefOffset > m_dwFileLen) {

+                m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+                return TRUE;

+            }

+            m_dwLastXRefOffset = m_dwXRefOffset;

+            SetStartOffset(m_dwXRefOffset);

+            m_docStatus = PDF_DATAAVAIL_CROSSREF;

+            return TRUE;

+        } else {

+            m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+            return TRUE;

+        }

+    }

+    pHints->AddSegment(req_pos, dwSize);

+    return FALSE;

+}

+FX_DWORD CPDF_DataAvail::CheckCrossRefStream(IFX_DownloadHints* pHints, FX_FILESIZE &xref_offset)

+{

+    xref_offset = 0;

+    FX_DWORD req_size = (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);

+    if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) {

+        FX_INT32 iSize = (FX_INT32)(m_Pos + req_size - m_dwCurrentXRefSteam);

+        CFX_BinaryBuf buf(iSize);

+        FX_LPBYTE pBuf = buf.GetBuffer();

+        m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize);

+        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE));

+        m_parser.m_Syntax.InitParser((IFX_FileStream*)file, 0);

+        FX_BOOL bNumber = FALSE;

+        FX_FILESIZE dwSavePos = m_parser.m_Syntax.SavePos();

+        CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(bNumber);

+        if (!bNumber) {

+            return -1;

+        }

+        FX_DWORD objNum = FXSYS_atoi(objnum);

+        CPDF_Object *pObj = m_parser.ParseIndirectObjectAt(NULL, 0, objNum, NULL);

+        if (!pObj) {

+            m_Pos += m_parser.m_Syntax.SavePos();

+            return 0;

+        }

+        CPDF_Object *pName = pObj->GetDict()->GetElement(FX_BSTRC("Type"));

+        if (pName && pName->GetType() == PDFOBJ_NAME) {

+            if (pName->GetString() == FX_BSTRC("XRef")) {

+                m_Pos += m_parser.m_Syntax.SavePos();

+                xref_offset = pObj->GetDict()->GetInteger(FX_BSTRC("Prev"));

+                pObj->Release();

+                return 1;

+            } else {

+                pObj->Release();

+                return -1;

+            }

+        }

+        pObj->Release();

+        return -1;

+    }

+    pHints->AddSegment(m_Pos, req_size);

+    return 0;

+}

+inline void CPDF_DataAvail::SetStartOffset(FX_FILESIZE dwOffset)

+{

+    m_Pos = dwOffset;

+}

+#define MAX_WORD_BUFFER 256

+FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString &token)

+{

+    m_WordSize = 0;

+    FX_BYTE ch;

+    if (!GetNextChar(ch)) {

+        return FALSE;

+    }

+    FX_BYTE type = _PDF_CharType[ch];

+    while (1) {

+        while (type == 'W') {

+            if (!GetNextChar(ch)) {

+                return FALSE;

+            }

+            type = _PDF_CharType[ch];

+        }

+        if (ch != '%') {

+            break;

+        }

+        while (1) {

+            if (!GetNextChar(ch)) {

+                return FALSE;

+            }

+            if (ch == '\r' || ch == '\n') {

+                break;

+            }

+        }

+        type = _PDF_CharType[ch];

+    }

+    if (type == 'D') {

+        m_WordBuffer[m_WordSize++] = ch;

+        if (ch == '/') {

+            while (1) {

+                if (!GetNextChar(ch)) {

+                    return FALSE;

+                }

+                type = _PDF_CharType[ch];

+                if (type != 'R' && type != 'N') {

+                    m_Pos --;

+                    CFX_ByteString ret(m_WordBuffer, m_WordSize);

+                    token = ret;

+                    return TRUE;

+                }

+                if (m_WordSize < MAX_WORD_BUFFER) {

+                    m_WordBuffer[m_WordSize++] = ch;

+                }

+            }

+        } else if (ch == '<') {

+            if (!GetNextChar(ch)) {

+                return FALSE;

+            }

+            if (ch == '<') {

+                m_WordBuffer[m_WordSize++] = ch;

+            } else {

+                m_Pos --;

+            }

+        } else if (ch == '>') {

+            if (!GetNextChar(ch)) {

+                return FALSE;

+            }

+            if (ch == '>') {

+                m_WordBuffer[m_WordSize++] = ch;

+            } else {

+                m_Pos --;

+            }

+        }

+        CFX_ByteString ret(m_WordBuffer, m_WordSize);

+        token = ret;

+        return TRUE;

+    }

+    while (1) {

+        if (m_WordSize < MAX_WORD_BUFFER) {

+            m_WordBuffer[m_WordSize++] = ch;

+        }

+        if (!GetNextChar(ch)) {

+            return FALSE;

+        }

+        type = _PDF_CharType[ch];

+        if (type == 'D' || type == 'W') {

+            m_Pos --;

+            break;

+        }

+    }

+    CFX_ByteString ret(m_WordBuffer, m_WordSize);

+    token = ret;

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::GetNextChar(FX_BYTE &ch)

+{

+    FX_FILESIZE pos = m_Pos;

+    if (pos >= m_dwFileLen) {

+        return FALSE;

+    }

+    if (m_bufferOffset >= pos || (FX_FILESIZE)(m_bufferOffset + m_bufferSize) <= pos) {

+        FX_FILESIZE read_pos = pos;

+        FX_DWORD read_size = 512;

+        if ((FX_FILESIZE)read_size > m_dwFileLen) {

+            read_size = (FX_DWORD)m_dwFileLen;

+        }

+        if ((FX_FILESIZE)(read_pos + read_size) > m_dwFileLen) {

+            read_pos = m_dwFileLen - read_size;

+        }

+        if (!m_pFileRead->ReadBlock(m_bufferData, read_pos, read_size)) {

+            return FALSE;

+        }

+        m_bufferOffset = read_pos;

+        m_bufferSize = read_size;

+    }

+    ch = m_bufferData[pos - m_bufferOffset];

+    m_Pos ++;

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::CheckCrossRefItem(IFX_DownloadHints *pHints)

+{

+    FX_INT32 iSize = 0;

+    CFX_ByteString token;

+    while (1) {

+        if (!GetNextToken(token)) {

+            iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);

+            pHints->AddSegment(m_Pos, iSize);

+            return FALSE;

+        }

+        if (token == "trailer") {

+            m_dwTrailerOffset = m_Pos;

+            m_docStatus = PDF_DATAAVAIL_TRAILER;

+            return TRUE;

+        }

+    }

+}

+FX_BOOL CPDF_DataAvail::CheckAllCrossRefStream(IFX_DownloadHints *pHints)

+{

+    FX_FILESIZE xref_offset = 0;

+    FX_DWORD dwRet = CheckCrossRefStream(pHints, xref_offset);

+    if (dwRet == 1) {

+        if (!xref_offset) {

+            m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF;

+        } else {

+            m_dwCurrentXRefSteam = xref_offset;

+            m_Pos = xref_offset;

+        }

+        return TRUE;

+    } else if (dwRet == -1) {

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_DataAvail::CheckCrossRef(IFX_DownloadHints* pHints)

+{

+    FX_FILESIZE dwSavePos = m_Pos;

+    FX_INT32 iSize = 0;

+    CFX_ByteString token;

+    if (!GetNextToken(token)) {

+        iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);

+        pHints->AddSegment(m_Pos, iSize);

+        return FALSE;

+    }

+    if (token == "xref") {

+        m_CrossOffset.InsertAt(0, m_dwXRefOffset);

+        while (1) {

+            if (!GetNextToken(token)) {

+                iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);

+                pHints->AddSegment(m_Pos, iSize);

+                m_docStatus = PDF_DATAAVAIL_CROSSREF_ITEM;

+                return FALSE;

+            }

+            if (token == "trailer") {

+                m_dwTrailerOffset = m_Pos;

+                m_docStatus = PDF_DATAAVAIL_TRAILER;

+                return TRUE;

+            }

+        }

+    } else {

+        m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_DataAvail::CheckTrailerAppend(IFX_DownloadHints* pHints)

+{

+    if (m_Pos < m_dwFileLen) {

+        FX_FILESIZE dwAppendPos = m_Pos + m_syntaxParser.SavePos();

+        FX_INT32 iSize = (FX_INT32)(dwAppendPos + 512 > m_dwFileLen ? m_dwFileLen - dwAppendPos : 512);

+        if (!m_pFileAvail->IsDataAvail(dwAppendPos, iSize)) {

+            pHints->AddSegment(dwAppendPos, iSize);

+            return FALSE;

+        }

+    }

+    if (m_dwPrevXRefOffset) {

+        SetStartOffset(m_dwPrevXRefOffset);

+        m_docStatus = PDF_DATAAVAIL_CROSSREF;

+    } else {

+        m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::CheckTrailer(IFX_DownloadHints* pHints)

+{

+    FX_INT32 iTrailerSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);

+    if (m_pFileAvail->IsDataAvail(m_Pos, iTrailerSize)) {

+        FX_INT32 iSize = (FX_INT32)(m_Pos + iTrailerSize - m_dwTrailerOffset);

+        CFX_BinaryBuf buf(iSize);

+        FX_LPBYTE pBuf = buf.GetBuffer();

+        if (!pBuf) {

+            m_docStatus = PDF_DATAAVAIL_ERROR;

+            return FALSE;

+        }

+        if (!m_pFileRead->ReadBlock(pBuf, m_dwTrailerOffset, iSize)) {

+            return FALSE;

+        }

+        CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE));

+        m_syntaxParser.InitParser((IFX_FileStream*)file, 0);

+        CPDF_Object *pTrailer = m_syntaxParser.GetObject(NULL, 0, 0, 0);

+        if (!pTrailer) {

+            m_Pos += m_syntaxParser.SavePos();

+            pHints->AddSegment(m_Pos, iTrailerSize);

+            return FALSE;

+        }

+        CPDF_Dictionary *pTrailerDict = pTrailer->GetDict();

+        if (pTrailerDict) {

+            CPDF_Object *pEncrypt = pTrailerDict->GetElement("Encrypt");

+            if (pEncrypt && pEncrypt->GetType() == PDFOBJ_REFERENCE) {

+                m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+                pTrailer->Release();

+                return TRUE;

+            }

+        }

+        FX_DWORD xrefpos = GetDirectInteger(pTrailer->GetDict(), FX_BSTRC("Prev"));

+        if (xrefpos) {

+            m_dwPrevXRefOffset = GetDirectInteger(pTrailer->GetDict(), FX_BSTRC("XRefStm"));

+            pTrailer->Release();

+            if (m_dwPrevXRefOffset) {

+                m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+            } else {

+                m_dwPrevXRefOffset = xrefpos;

+                if (m_dwPrevXRefOffset >= m_dwFileLen) {

+                    m_docStatus = PDF_DATAAVAIL_LOADALLFILE;

+                } else {

+                    SetStartOffset(m_dwPrevXRefOffset);

+                    m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND;

+                }

+            }

+            return TRUE;

+        } else {

+            m_dwPrevXRefOffset = 0;

+            m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND;

+            pTrailer->Release();

+        }

+        return TRUE;

+    }

+    pHints->AddSegment(m_Pos, iTrailerSize);

+    return FALSE;

+}

+FX_BOOL CPDF_DataAvail::CheckPage(FX_INT32 iPage, IFX_DownloadHints* pHints)

+{

+    while (TRUE) {

+        switch (m_docStatus) {

+            case PDF_DATAAVAIL_PAGETREE:

+                if (!LoadDocPages(pHints)) {

+                    return FALSE;

+                }

+                break;

+            case PDF_DATAAVAIL_PAGE:

+                if (!LoadDocPage(iPage, pHints)) {

+                    return FALSE;

+                }

+                break;

+            case PDF_DATAAVAIL_ERROR:

+                return LoadAllFile(pHints);

+            default:

+                m_bPagesTreeLoad = TRUE;

+                m_bPagesLoad = TRUE;

+                m_bCurPageDictLoadOK = TRUE;

+                m_docStatus = PDF_DATAAVAIL_PAGE;

+                return TRUE;

+        }

+    }

+}

+FX_BOOL	CPDF_DataAvail::CheckArrayPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints)

+{

+    FX_BOOL bExist = FALSE;

+    CPDF_Object *pPages = GetObject(dwPageNo, pHints, &bExist);

+    if (!bExist) {

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    if (!pPages) {

+        if (m_docStatus == PDF_DATAAVAIL_ERROR) {

+            m_docStatus = PDF_DATAAVAIL_ERROR;

+            return FALSE;

+        }

+        return FALSE;

+    }

+    if (pPages->GetType() != PDFOBJ_ARRAY) {

+        pPages->Release();

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    pPageNode->m_type = PDF_PAGENODE_PAGES;

+    CPDF_Array* pArray = (CPDF_Array*)pPages;

+    for (FX_DWORD i = 0; i < pArray->GetCount(); ++i) {

+        CPDF_Object *pKid = (CPDF_Object *)pArray->GetElement(i);

+        if (!pKid || pKid->GetType() != PDFOBJ_REFERENCE) {

+            continue;

+        }

+        CPDF_PageNode *pNode = FX_NEW CPDF_PageNode();

+        pPageNode->m_childNode.Add(pNode);

+        pNode->m_dwPageNo = ((CPDF_Reference*)pKid)->GetRefObjNum();

+    }

+    pPages->Release();

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::CheckUnkownPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints)

+{

+    FX_BOOL bExist = FALSE;

+    CPDF_Object *pPage = GetObject(dwPageNo, pHints, &bExist);

+    if (!bExist) {

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    if (!pPage) {

+        if (m_docStatus == PDF_DATAAVAIL_ERROR) {

+            m_docStatus = PDF_DATAAVAIL_ERROR;

+            return FALSE;

+        }

+        return FALSE;

+    }

+    if (pPage->GetType() == PDFOBJ_ARRAY) {

+        pPageNode->m_dwPageNo = dwPageNo;

+        pPageNode->m_type = PDF_PAGENODE_ARRAY;

+        pPage->Release();

+        return TRUE;

+    }

+    if (pPage->GetType() != PDFOBJ_DICTIONARY) {

+        pPage->Release();

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    pPageNode->m_dwPageNo = dwPageNo;

+    CFX_ByteString type = pPage->GetDict()->GetString(FX_BSTRC("Type"));

+    if (type == FX_BSTRC("Pages")) {

+        pPageNode->m_type = PDF_PAGENODE_PAGES;

+        CPDF_Object *pKids = pPage->GetDict()->GetElement(FX_BSTRC("Kids"));

+        if (!pKids) {

+            m_docStatus = PDF_DATAAVAIL_PAGE;

+            return TRUE;

+        }

+        switch (pKids->GetType()) {

+            case PDFOBJ_REFERENCE: {

+                    CPDF_Reference *pKid = (CPDF_Reference *)pKids;

+                    CPDF_PageNode *pNode = FX_NEW CPDF_PageNode();

+                    pPageNode->m_childNode.Add(pNode);

+                    pNode->m_dwPageNo = pKid->GetRefObjNum();

+                }

+                break;

+            case PDFOBJ_ARRAY: {

+                    CPDF_Array *pKidsArray = (CPDF_Array *)pKids;

+                    for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) {

+                        CPDF_Object *pKid = (CPDF_Object *)pKidsArray->GetElement(i);

+                        if (!pKid || pKid->GetType() != PDFOBJ_REFERENCE) {

+                            continue;

+                        }

+                        CPDF_PageNode *pNode = FX_NEW CPDF_PageNode();

+                        pPageNode->m_childNode.Add(pNode);

+                        pNode->m_dwPageNo = ((CPDF_Reference*)pKid)->GetRefObjNum();

+                    }

+                }

+                break;

+            default:

+                break;

+        }

+    } else if (type == FX_BSTRC("Page")) {

+        pPageNode->m_type = PDF_PAGENODE_PAGE;

+    } else {

+        pPage->Release();

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    pPage->Release();

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::CheckPageNode(CPDF_PageNode &pageNodes, FX_INT32 iPage, FX_INT32 &iCount, IFX_DownloadHints* pHints)

+{

+    FX_INT32 iSize = pageNodes.m_childNode.GetSize();

+    if (!iSize) {

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    for (FX_INT32 i = 0; i < iSize; ++i) {

+        CPDF_PageNode *pNode = (CPDF_PageNode*)pageNodes.m_childNode.GetAt(i);

+        if (!pNode) {

+            continue;

+        }

+        switch (pNode->m_type) {

+            case PDF_PAGENODE_UNKOWN:

+                if (!CheckUnkownPageNode(pNode->m_dwPageNo, pNode, pHints)) {

+                    return FALSE;

+                }

+                --i;

+                break;

+            case PDF_PAGENODE_PAGE:

+                iCount++;

+                if (iPage == iCount && m_pDocument) {

+                    m_pDocument->m_PageList.SetAt(iPage, pNode->m_dwPageNo);

+                }

+                break;

+            case PDF_PAGENODE_PAGES:

+                if (!CheckPageNode(*pNode, iPage, iCount, pHints)) {

+                    return FALSE;

+                }

+                break;

+            case PDF_PAGENODE_ARRAY:

+                if (!CheckArrayPageNode(pNode->m_dwPageNo, pNode, pHints)) {

+                    return FALSE;

+                }

+                --i;

+                break;

+        }

+        if (iPage == iCount) {

+            m_docStatus = PDF_DATAAVAIL_DONE;

+            return TRUE;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::LoadDocPage(FX_INT32 iPage, IFX_DownloadHints* pHints)

+{

+    if (m_pDocument->GetPageCount() <= iPage || m_pDocument->m_PageList.GetAt(iPage)) {

+        m_docStatus = PDF_DATAAVAIL_DONE;

+        return TRUE;

+    }

+    if (m_pageNodes.m_type == PDF_PAGENODE_PAGE) {

+        if (iPage == 0) {

+            m_docStatus = PDF_DATAAVAIL_DONE;

+            return TRUE;

+        }

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return TRUE;

+    }

+    FX_INT32 iCount = -1;

+    return CheckPageNode(m_pageNodes, iPage, iCount, pHints);

+}

+FX_BOOL CPDF_DataAvail::CheckPageCount(IFX_DownloadHints* pHints)

+{

+    FX_BOOL bExist = FALSE;

+    CPDF_Object *pPages = GetObject(m_PagesObjNum, pHints, &bExist);

+    if (!bExist) {

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    if (!pPages) {

+        return FALSE;

+    }

+    CPDF_Dictionary* pPagesDict = pPages->GetDict();

+    if (!pPagesDict) {

+        pPages->Release();

+        m_docStatus = PDF_DATAAVAIL_ERROR;

+        return FALSE;

+    }

+    if (!pPagesDict->KeyExist(FX_BSTRC("Kids"))) {

+        pPages->Release();

+        return TRUE;

+    }

+    int count = pPagesDict->GetInteger(FX_BSTRC("Count"));

+    if (count > 0) {

+        pPages->Release();

+        return TRUE;

+    }

+    pPages->Release();

+    return FALSE;

+}

+FX_BOOL CPDF_DataAvail::LoadDocPages(IFX_DownloadHints* pHints)

+{

+    if (!CheckUnkownPageNode(m_PagesObjNum, &m_pageNodes, pHints)) {

+        return FALSE;

+    }

+    if (CheckPageCount(pHints)) {

+        m_docStatus = PDF_DATAAVAIL_PAGE;

+        return TRUE;

+    } else {

+        m_bTotalLoadPageTree = TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_DataAvail::LoadPages(IFX_DownloadHints* pHints)

+{

+    while (!m_bPagesTreeLoad) {

+        if (!CheckPageStatus(pHints)) {

+            return FALSE;

+        }

+    }

+    if (m_bPagesLoad) {

+        return TRUE;

+    }

+    m_pDocument->LoadPages();

+    return FALSE;

+}

+FX_BOOL CPDF_DataAvail::CheckLinearizedData(IFX_DownloadHints* pHints)

+{

+    if (m_bLinearedDataOK) {

+        return TRUE;

+    }

+    if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset))) {

+        pHints->AddSegment(m_dwLastXRefOffset, (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset));

+        return FALSE;

+    }

+    FX_DWORD dwRet = 0;

+    if (!m_bMainXRefLoad) {

+        dwRet = ((CPDF_Parser *)m_pDocument->GetParser())->LoadLinearizedMainXRefTable();

+        if (dwRet == PDFPARSE_ERROR_SUCCESS) {

+            if (!PreparePageItem()) {

+                return FALSE;

+            }

+            m_bMainXRefLoadedOK = TRUE;

+        }

+        m_bMainXRefLoad = TRUE;

+    }

+    m_bLinearedDataOK = TRUE;

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::CheckPageAnnots(FX_INT32 iPage, IFX_DownloadHints* pHints)

+{

+    if (!m_objs_array.GetSize()) {

+        m_objs_array.RemoveAll();

+        m_objnum_array.RemoveAll();

+        CPDF_Dictionary *pPageDict = m_pDocument->GetPage(iPage);

+        if (!pPageDict) {

+            return TRUE;

+        }

+        CPDF_Object *pAnnots = pPageDict->GetElement(FX_BSTRC("Annots"));

+        if (!pAnnots) {

+            return TRUE;

+        }

+        CFX_PtrArray obj_array;

+        obj_array.Add(pAnnots);

+        FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array);

+        if (bRet) {

+            m_objs_array.RemoveAll();

+        }

+        return bRet;

+    } else {

+        CFX_PtrArray new_objs_array;

+        FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);

+        m_objs_array.RemoveAll();

+        if (!bRet) {

+            m_objs_array.Append(new_objs_array);

+        }

+        return bRet;

+    }

+}

+FX_BOOL CPDF_DataAvail::CheckLinearizedFirstPage(FX_INT32 iPage, IFX_DownloadHints* pHints)

+{

+    if (!m_bAnnotsLoad) {

+        if (!CheckPageAnnots(iPage, pHints)) {

+            return FALSE;

+        }

+        m_bAnnotsLoad = TRUE;

+    }

+    if (m_bAnnotsLoad)

+        if (!CheckLinearizedData(pHints)) {

+            return FALSE;

+        }

+    m_bPageLoadedOK = FALSE;

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::HaveResourceAncestor(CPDF_Dictionary *pDict)

+{

+    CPDF_Object *pParent = pDict->GetElement("Parent");

+    if (!pParent) {

+        return FALSE;

+    }

+    CPDF_Dictionary *pParentDict = pParent->GetDict();

+    if (!pParentDict) {

+        return FALSE;

+    }

+    CPDF_Object *pRet = pParentDict->GetElement("Resource");

+    if (pRet) {

+        m_pPageResource = pRet;

+        return TRUE;

+    } else {

+        return HaveResourceAncestor(pParentDict);

+    }

+}

+FX_BOOL CPDF_DataAvail::IsPageAvail(FX_INT32 iPage, IFX_DownloadHints* pHints)

+{

+    if (!m_pDocument) {

+        return FALSE;

+    }

+    if (IsFirstCheck(iPage)) {

+        m_bCurPageDictLoadOK = FALSE;

+        m_bPageLoadedOK = FALSE;

+        m_bAnnotsLoad = FALSE;

+        m_bNeedDownLoadResource = FALSE;

+        m_objs_array.RemoveAll();

+        m_objnum_array.RemoveAll();

+    }

+    if (m_pagesLoadState == NULL) {

+        m_pagesLoadState = FX_NEW CFX_CMapDWordToDWord();

+    }

+    FX_DWORD dwPageLoad = 0;

+    if (m_pagesLoadState->Lookup(iPage, dwPageLoad) && dwPageLoad != 0) {

+        return TRUE;

+    }

+    if (m_bLinearized) {

+        if ((FX_DWORD)iPage == m_dwFirstPageNo) {

+            m_pagesLoadState->SetAt(iPage, TRUE);

+            return TRUE;

+        }

+        if (!CheckLinearizedData(pHints)) {

+            return FALSE;

+        }

+        if (m_bMainXRefLoadedOK) {

+            if (m_bTotalLoadPageTree) {

+                if (!LoadPages(pHints)) {

+                    return FALSE;

+                }

+            } else {

+                if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) {

+                    return FALSE;

+                }

+            }

+        } else {

+            if (!LoadAllFile(pHints)) {

+                return FALSE;

+            }

+            ((CPDF_Parser *)m_pDocument->GetParser())->RebuildCrossRef();

+            ResetFirstCheck(iPage);

+            return TRUE;

+        }

+    } else {

+        if (!m_bTotalLoadPageTree) {

+            if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) {

+                return FALSE;

+            }

+        }

+    }

+    if (m_bHaveAcroForm && !m_bAcroFormLoad) {

+        if (!CheckAcroFormSubObject(pHints)) {

+            return FALSE;

+        }

+        m_bAcroFormLoad = TRUE;

+    }

+    if (!m_bPageLoadedOK) {

+        if (!m_objs_array.GetSize()) {

+            m_objs_array.RemoveAll();

+            m_objnum_array.RemoveAll();

+            m_pPageDict = m_pDocument->GetPage(iPage);

+            if (!m_pPageDict) {

+                ResetFirstCheck(iPage);

+                return TRUE;

+            }

+            CFX_PtrArray obj_array;

+            obj_array.Add(m_pPageDict);

+            FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array);

+            if (bRet) {

+                m_objs_array.RemoveAll();

+                m_bPageLoadedOK = TRUE;

+            } else {

+                return bRet;

+            }

+        } else {

+            CFX_PtrArray new_objs_array;

+            FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);

+            m_objs_array.RemoveAll();

+            if (bRet) {

+                m_bPageLoadedOK = TRUE;

+            } else {

+                m_objs_array.Append(new_objs_array);

+                return bRet;

+            }

+        }

+    }

+    if (m_bPageLoadedOK) {

+        if (!m_bAnnotsLoad) {

+            if (!CheckPageAnnots(iPage, pHints)) {

+                return FALSE;

+            }

+            m_bAnnotsLoad = TRUE;

+        }

+    }

+    if (m_pPageDict && !m_bNeedDownLoadResource) {

+        CPDF_Object *pRes = m_pPageDict->GetElement("Resource");

+        if (!pRes) {

+            m_bNeedDownLoadResource = HaveResourceAncestor(m_pPageDict);

+        }

+        m_bNeedDownLoadResource = FALSE;

+    }

+    if (m_bNeedDownLoadResource) {

+        FX_BOOL bRet = CheckResources(pHints);

+        if (!bRet) {

+            return FALSE;

+        }

+        m_bNeedDownLoadResource = FALSE;

+    }

+    m_bPageLoadedOK = FALSE;

+    m_bAnnotsLoad = FALSE;

+    m_bCurPageDictLoadOK = FALSE;

+    ResetFirstCheck(iPage);

+    m_pagesLoadState->SetAt(iPage, TRUE);

+    return TRUE;

+}

+FX_BOOL CPDF_DataAvail::CheckResources(IFX_DownloadHints* pHints)

+{

+    if (!m_objs_array.GetSize()) {

+        m_objs_array.RemoveAll();

+        CFX_PtrArray obj_array;

+        obj_array.Add(m_pPageResource);

+        FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array);

+        if (bRet) {

+            m_objs_array.RemoveAll();

+        }

+        return bRet;

+    } else {

+        CFX_PtrArray new_objs_array;

+        FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);

+        m_objs_array.RemoveAll();

+        if (!bRet) {

+            m_objs_array.Append(new_objs_array);

+        }

+        return bRet;

+    }

+}

+void CPDF_DataAvail::GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize)

+{

+    if (pPos) {

+        *pPos = m_dwLastXRefOffset;

+    }

+    if (pSize) {

+        *pSize = (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset);

+    }

+}

+FX_INT32 CPDF_DataAvail::IsFormAvail(IFX_DownloadHints *pHints)

+{

+    if (!m_pDocument) {

+        return PDFFORM_AVAIL;

+    }

+    if (!m_bLinearizedFormParamLoad) {

+        CPDF_Dictionary *pRoot = m_pDocument->GetRoot();

+        if (!pRoot) {

+            return PDFFORM_AVAIL;

+        }

+        CPDF_Object *pAcroForm = pRoot->GetElement(FX_BSTRC("AcroForm"));

+        if (!pAcroForm) {

+            return PDFFORM_NOTEXIST;

+        }

+        if (!m_bMainXRefLoad && !CheckLinearizedData(pHints)) {

+            return PDFFORM_NOTAVAIL;

+        }

+        if (!m_objs_array.GetSize()) {

+            m_objs_array.Add(pAcroForm->GetDict());

+        }

+        m_bLinearizedFormParamLoad = TRUE;

+    }

+    CFX_PtrArray new_objs_array;

+    FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);

+    m_objs_array.RemoveAll();

+    if (!bRet) {

+        m_objs_array.Append(new_objs_array);

+        return PDFFORM_NOTAVAIL;

+    }

+    return PDFFORM_AVAIL;

+}

+void CPDF_SortObjNumArray::AddObjNum(FX_DWORD dwObjNum)

+{

+    FX_INT32 iNext = 0;

+    if (BinarySearch(dwObjNum, iNext)) {

+        return;

+    }

+    m_number_array.InsertAt(iNext, dwObjNum);

+}

+FX_BOOL CPDF_SortObjNumArray::Find(FX_DWORD dwObjNum)

+{

+    FX_INT32 iNext = 0;

+    return BinarySearch(dwObjNum, iNext);

+}

+FX_BOOL CPDF_SortObjNumArray::BinarySearch(FX_DWORD value, FX_INT32 &iNext)

+{

+    FX_INT32 iLen = m_number_array.GetSize();

+    FX_INT32 iLow = 0;

+    FX_INT32 iHigh = iLen - 1;

+    FX_INT32 iMid = 0;

+    while (iLow <= iHigh) {

+        iMid = (iLow + iHigh) / 2;

+        FX_DWORD tt = m_number_array.GetAt(iMid);

+        if (m_number_array.GetAt(iMid) == value) {

+            iNext = iMid;

+            return TRUE;

+        } else if (m_number_array.GetAt(iMid) > value) {

+            iHigh = iMid - 1;

+        } else if (m_number_array.GetAt(iMid) < value) {

+            iLow = iMid + 1;

+        }

+    }

+    iNext = iLow;

+    return FALSE;

+}

+CPDF_PageNode::~CPDF_PageNode()

+{

+    FX_INT32 iSize = m_childNode.GetSize();

+    for (FX_INT32 i = 0; i < iSize; ++i) {

+        CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i];

+        if (pNode) {

+            delete pNode;

+        }

+    }

+    m_childNode.RemoveAll();

+}

diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
new file mode 100644
index 0000000..cc3d29c
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
@@ -0,0 +1,453 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_parser.h"

+extern const FX_LPCSTR _PDF_CharType =

+    "WRRRRRRRRWWRWWRRRRRRRRRRRRRRRRRR"

+    "WRRRRDRRDDRNRNNDNNNNNNNNNNRRDRDR"

+    "RRRRRRRRRRRRRRRRRRRRRRRRRRRDRDRR"

+    "RRRRRRRRRRRRRRRRRRRRRRRRRRRDRDRR"

+    "WRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"

+    "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"

+    "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"

+    "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRW";

+#ifndef MAX_PATH

+#define MAX_PATH 4096

+#endif

+CPDF_SimpleParser::CPDF_SimpleParser(FX_LPCBYTE pData, FX_DWORD dwSize)

+{

+    m_pData = pData;

+    m_dwSize = dwSize;

+    m_dwCurPos = 0;

+}

+CPDF_SimpleParser::CPDF_SimpleParser(FX_BSTR str)

+{

+    m_pData = str;

+    m_dwSize = str.GetLength();

+    m_dwCurPos = 0;

+}

+void CPDF_SimpleParser::ParseWord(FX_LPCBYTE& pStart, FX_DWORD& dwSize, int& type)

+{

+    pStart = NULL;

+    dwSize = 0;

+    type = PDFWORD_EOF;

+    FX_BYTE ch;

+    char chartype;

+    while (1) {

+        if (m_dwSize <= m_dwCurPos) {

+            return;

+        }

+        ch = m_pData[m_dwCurPos++];

+        chartype = _PDF_CharType[ch];

+        while (chartype == 'W') {

+            if (m_dwSize <= m_dwCurPos) {

+                return;

+            }

+            ch = m_pData[m_dwCurPos++];

+            chartype = _PDF_CharType[ch];

+        }

+        if (ch != '%') {

+            break;

+        }

+        while (1) {

+            if (m_dwSize <= m_dwCurPos) {

+                return;

+            }

+            ch = m_pData[m_dwCurPos++];

+            if (ch == '\r' || ch == '\n') {

+                break;

+            }

+        }

+        chartype = _PDF_CharType[ch];

+    }

+    FX_DWORD start_pos = m_dwCurPos - 1;

+    pStart = m_pData + start_pos;

+    if (chartype == 'D') {

+        if (ch == '/') {

+            while (1) {

+                if (m_dwSize <= m_dwCurPos) {

+                    return;

+                }

+                ch = m_pData[m_dwCurPos++];

+                chartype = _PDF_CharType[ch];

+                if (chartype != 'R' && chartype != 'N') {

+                    m_dwCurPos --;

+                    dwSize = m_dwCurPos - start_pos;

+                    type = PDFWORD_NAME;

+                    return;

+                }

+            }

+        } else {

+            type = PDFWORD_DELIMITER;

+            dwSize = 1;

+            if (ch == '<') {

+                if (m_dwSize <= m_dwCurPos) {

+                    return;

+                }

+                ch = m_pData[m_dwCurPos++];

+                if (ch == '<') {

+                    dwSize = 2;

+                } else {

+                    m_dwCurPos --;

+                }

+            } else if (ch == '>') {

+                if (m_dwSize <= m_dwCurPos) {

+                    return;

+                }

+                ch = m_pData[m_dwCurPos++];

+                if (ch == '>') {

+                    dwSize = 2;

+                } else {

+                    m_dwCurPos --;

+                }

+            }

+        }

+        return;

+    }

+    type = PDFWORD_NUMBER;

+    dwSize = 1;

+    while (1) {

+        if (chartype != 'N') {

+            type = PDFWORD_TEXT;

+        }

+        if (m_dwSize <= m_dwCurPos) {

+            return;

+        }

+        ch = m_pData[m_dwCurPos++];

+        chartype = _PDF_CharType[ch];

+        if (chartype == 'D' || chartype == 'W') {

+            m_dwCurPos --;

+            break;

+        }

+        dwSize ++;

+    }

+}

+CFX_ByteStringC CPDF_SimpleParser::GetWord()

+{

+    FX_LPCBYTE pStart;

+    FX_DWORD dwSize;

+    int type;

+    ParseWord(pStart, dwSize, type);

+    if (dwSize == 1 && pStart[0] == '<') {

+        while (m_dwCurPos < m_dwSize && m_pData[m_dwCurPos] != '>') {

+            m_dwCurPos ++;

+        }

+        if (m_dwCurPos < m_dwSize) {

+            m_dwCurPos ++;

+        }

+        return CFX_ByteStringC(pStart, (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));

+    } else if (dwSize == 1 && pStart[0] == '(') {

+        int level = 1;

+        while (m_dwCurPos < m_dwSize) {

+            if (m_pData[m_dwCurPos] == ')') {

+                level --;

+                if (level == 0) {

+                    break;

+                }

+            }

+            if (m_pData[m_dwCurPos] == '\\') {

+                if (m_dwSize <= m_dwCurPos) {

+                    break;

+                }

+                m_dwCurPos ++;

+            } else if (m_pData[m_dwCurPos] == '(') {

+                level ++;

+            }

+            if (m_dwSize <= m_dwCurPos) {

+                break;

+            }

+            m_dwCurPos ++;

+        }

+        if (m_dwCurPos < m_dwSize) {

+            m_dwCurPos ++;

+        }

+        return CFX_ByteStringC(pStart, (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));

+    }

+    return CFX_ByteStringC(pStart, dwSize);

+}

+FX_BOOL CPDF_SimpleParser::SearchToken(FX_BSTR token)

+{

+    int token_len = token.GetLength();

+    while (m_dwCurPos < m_dwSize - token_len) {

+        if (FXSYS_memcmp32(m_pData + m_dwCurPos, token, token_len) == 0) {

+            break;

+        }

+        m_dwCurPos ++;

+    }

+    if (m_dwCurPos == m_dwSize - token_len) {

+        return FALSE;

+    }

+    m_dwCurPos += token_len;

+    return TRUE;

+}

+FX_BOOL CPDF_SimpleParser::SkipWord(FX_BSTR token)

+{

+    while (1) {

+        CFX_ByteStringC word = GetWord();

+        if (word.IsEmpty()) {

+            return FALSE;

+        }

+        if (word == token) {

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_SimpleParser::FindTagPair(FX_BSTR start_token, FX_BSTR end_token,

+                                       FX_DWORD& start_pos, FX_DWORD& end_pos)

+{

+    if (!start_token.IsEmpty()) {

+        if (!SkipWord(start_token)) {

+            return FALSE;

+        }

+        start_pos = m_dwCurPos;

+    }

+    while (1) {

+        end_pos = m_dwCurPos;

+        CFX_ByteStringC word = GetWord();

+        if (word.IsEmpty()) {

+            return FALSE;

+        }

+        if (word == end_token) {

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_SimpleParser::FindTagParam(FX_BSTR token, int nParams)

+{

+    nParams ++;

+    FX_DWORD* pBuf = FX_Alloc(FX_DWORD, nParams);

+    int buf_index = 0;

+    int buf_count = 0;

+    while (1) {

+        pBuf[buf_index++] = m_dwCurPos;

+        if (buf_index == nParams) {

+            buf_index = 0;

+        }

+        buf_count ++;

+        if (buf_count > nParams) {

+            buf_count = nParams;

+        }

+        CFX_ByteStringC word = GetWord();

+        if (word.IsEmpty()) {

+            FX_Free(pBuf);

+            return FALSE;

+        }

+        if (word == token) {

+            if (buf_count < nParams) {

+                continue;

+            }

+            m_dwCurPos = pBuf[buf_index];

+            FX_Free(pBuf);

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+static int _hex2dec(char ch)

+{

+    if (ch >= '0' && ch <= '9') {

+        return ch - '0';

+    }

+    if (ch >= 'a' && ch <= 'f') {

+        return ch - 'a' + 10;

+    }

+    if (ch >= 'A' && ch <= 'F') {

+        return ch - 'A' + 10;

+    }

+    return 0;

+}

+CFX_ByteString PDF_NameDecode(FX_BSTR bstr)

+{

+    int size = bstr.GetLength();

+    FX_LPCSTR pSrc = bstr.GetCStr();

+    if (FXSYS_memchr(pSrc, '#', size) == NULL) {

+        return bstr;

+    }

+    CFX_ByteString result;

+    FX_LPSTR pDestStart = result.GetBuffer(size);

+    FX_LPSTR pDest = pDestStart;

+    for (int i = 0; i < size; i ++) {

+        if (pSrc[i] == '#' && i < size - 2) {

+            *pDest ++ = _hex2dec(pSrc[i + 1]) * 16 + _hex2dec(pSrc[i + 2]);

+            i += 2;

+        } else {

+            *pDest ++ = pSrc[i];

+        }

+    }

+    result.ReleaseBuffer((FX_STRSIZE)(pDest - pDestStart));

+    return result;

+}

+CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig)

+{

+    if (FXSYS_memchr((FX_LPCSTR)orig, '#', orig.GetLength()) == NULL) {

+        return orig;

+    }

+    return PDF_NameDecode(CFX_ByteStringC(orig));

+}

+CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig)

+{

+    FX_LPBYTE src_buf = (FX_LPBYTE)(FX_LPCSTR)orig;

+    int src_len = orig.GetLength();

+    int dest_len = 0;

+    int i;

+    for (i = 0; i < src_len; i ++) {

+        FX_BYTE ch = src_buf[i];

+        if (ch >= 0x80 || _PDF_CharType[ch] == 'W' || ch == '#' ||

+                _PDF_CharType[ch] == 'D') {

+            dest_len += 3;

+        } else {

+            dest_len ++;

+        }

+    }

+    if (dest_len == src_len) {

+        return orig;

+    }

+    CFX_ByteString res;

+    FX_LPSTR dest_buf = res.GetBuffer(dest_len);

+    dest_len = 0;

+    for (i = 0; i < src_len; i ++) {

+        FX_BYTE ch = src_buf[i];

+        if (ch >= 0x80 || _PDF_CharType[ch] == 'W' || ch == '#' ||

+                _PDF_CharType[ch] == 'D') {

+            dest_buf[dest_len++] = '#';

+            dest_buf[dest_len++] = "0123456789ABCDEF"[ch / 16];

+            dest_buf[dest_len++] = "0123456789ABCDEF"[ch % 16];

+        } else {

+            dest_buf[dest_len++] = ch;

+        }

+    }

+    dest_buf[dest_len] = 0;

+    res.ReleaseBuffer();

+    return res;

+}

+CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj)

+{

+    if (pObj == NULL) {

+        buf << FX_BSTRC(" null");

+        return buf;

+    }

+    switch (pObj->GetType()) {

+        case PDFOBJ_NULL:

+            buf << FX_BSTRC(" null");

+            break;

+        case PDFOBJ_BOOLEAN:

+        case PDFOBJ_NUMBER:

+            buf << " " << pObj->GetString();

+            break;

+        case PDFOBJ_STRING: {

+                CFX_ByteString str = pObj->GetString();

+                FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();

+                buf << PDF_EncodeString(str, bHex);

+                break;

+            }

+        case PDFOBJ_NAME: {

+                CFX_ByteString str = pObj->GetString();

+                buf << FX_BSTRC("/") << PDF_NameEncode(str);

+                break;

+            }

+        case PDFOBJ_REFERENCE: {

+                CPDF_Reference* p = (CPDF_Reference*)pObj;

+                buf << " " << p->GetRefObjNum() << FX_BSTRC(" 0 R ");

+                break;

+            }

+        case PDFOBJ_ARRAY: {

+                CPDF_Array* p = (CPDF_Array*)pObj;

+                buf << FX_BSTRC("[");

+                for (FX_DWORD i = 0; i < p->GetCount(); i ++) {

+                    CPDF_Object* pElement = p->GetElement(i);

+                    if (pElement->GetObjNum()) {

+                        buf << " " << pElement->GetObjNum() << FX_BSTRC(" 0 R");

+                    } else {

+                        buf << pElement;

+                    }

+                }

+                buf << FX_BSTRC("]");

+                break;

+            }

+        case PDFOBJ_DICTIONARY: {

+                CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;

+                buf << FX_BSTRC("<<");

+                FX_POSITION pos = p->GetStartPos();

+                while (pos) {

+                    CFX_ByteString key;

+                    CPDF_Object* pValue = p->GetNextElement(pos, key);

+                    buf << FX_BSTRC("/") << PDF_NameEncode(key);

+                    if (pValue->GetObjNum()) {

+                        buf << " " << pValue->GetObjNum() << FX_BSTRC(" 0 R ");

+                    } else {

+                        buf << pValue;

+                    }

+                }

+                buf << FX_BSTRC(">>");

+                break;

+            }

+        case PDFOBJ_STREAM: {

+                CPDF_Stream* p = (CPDF_Stream*)pObj;

+                buf << p->GetDict() << FX_BSTRC("stream\r\n");

+                CPDF_StreamAcc acc;

+                acc.LoadAllData(p, TRUE);

+                buf.AppendBlock(acc.GetData(), acc.GetSize());

+                buf << FX_BSTRC("\r\nendstream");

+                break;

+            }

+        default:

+            ASSERT(FALSE);

+            break;

+    }

+    return buf;

+}

+FX_FLOAT PDF_ClipFloat(FX_FLOAT f)

+{

+    if (f < 0) {

+        return 0;

+    }

+    if (f > 1.0f) {

+        return 1.0f;

+    }

+    return f;

+}

+static CPDF_Object* SearchNumberNode(CPDF_Dictionary* pNode, int num)

+{

+    CPDF_Array* pLimits = pNode->GetArray("Limits");

+    if (pLimits && (num < pLimits->GetInteger(0) || num > pLimits->GetInteger(1))) {

+        return NULL;

+    }

+    CPDF_Array* pNumbers = pNode->GetArray("Nums");

+    if (pNumbers) {

+        FX_DWORD dwCount = pNumbers->GetCount() / 2;

+        for (FX_DWORD i = 0; i < dwCount; i ++) {

+            int index = pNumbers->GetInteger(i * 2);

+            if (num == index) {

+                return pNumbers->GetElementValue(i * 2 + 1);

+            }

+            if (index > num) {

+                break;

+            }

+        }

+        return NULL;

+    }

+    CPDF_Array* pKids = pNode->GetArray("Kids");

+    if (pKids == NULL) {

+        return NULL;

+    }

+    for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {

+        CPDF_Dictionary* pKid = pKids->GetDict(i);

+        if (pKid == NULL) {

+            continue;

+        }

+        CPDF_Object* pFound = SearchNumberNode(pKid, num);

+        if (pFound) {

+            return pFound;

+        }

+    }

+    return NULL;

+}

+CPDF_Object* CPDF_NumberTree::LookupValue(int num)

+{

+    return SearchNumberNode(m_pRoot, num);

+}

diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
new file mode 100644
index 0000000..0be25e3
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -0,0 +1,1488 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_render.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../fpdf_page/pageint.h"

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "render_int.h"

+CPDF_DocRenderData::CPDF_DocRenderData(CPDF_Document* pPDFDoc)

+    : m_pPDFDoc(pPDFDoc)

+    , m_pFontCache(NULL)

+{

+}

+CPDF_DocRenderData::~CPDF_DocRenderData()

+{

+    Clear(TRUE);

+}

+void CPDF_DocRenderData::Clear(FX_BOOL bRelease)

+{

+    FX_POSITION pos;

+    {

+        pos = m_Type3FaceMap.GetStartPosition();

+        while (pos) {

+            CPDF_Font* pFont;

+            CPDF_CountedObject<CPDF_Type3Cache*>* cache;

+            m_Type3FaceMap.GetNextAssoc(pos, pFont, cache);

+            if (bRelease || cache->m_nCount < 2) {

+                delete cache->m_Obj;

+                delete cache;

+                m_Type3FaceMap.RemoveKey(pFont);

+            }

+        }

+    }

+#ifndef _FPDFAPI_MINI_

+    {

+        pos = m_TransferFuncMap.GetStartPosition();

+        while (pos) {

+            CPDF_Object* key;

+            CPDF_CountedObject<CPDF_TransferFunc*>* value;

+            m_TransferFuncMap.GetNextAssoc(pos, key, value);

+            if (bRelease || value->m_nCount < 2) {

+                delete value->m_Obj;

+                delete value;

+                m_TransferFuncMap.RemoveKey(key);

+            }

+        }

+    }

+#endif

+    if (m_pFontCache) {

+        if (bRelease) {

+            delete m_pFontCache;

+            m_pFontCache = NULL;

+        } else {

+            m_pFontCache->FreeCache(FALSE);

+        }

+    }

+}

+FX_BOOL CPDF_DocRenderData::Initialize()

+{

+    m_pFontCache = FX_NEW CFX_FontCache;

+    return TRUE;

+}

+CPDF_Type3Cache* CPDF_DocRenderData::GetCachedType3(CPDF_Type3Font* pFont)

+{

+    CPDF_CountedObject<CPDF_Type3Cache*>* pCache;

+    if (!m_Type3FaceMap.Lookup(pFont, pCache)) {

+        CPDF_Type3Cache* pType3 = FX_NEW CPDF_Type3Cache(pFont);

+        pCache = FX_NEW CPDF_CountedObject<CPDF_Type3Cache*>;

+        pCache->m_Obj = pType3;

+        pCache->m_nCount = 1;

+        m_Type3FaceMap.SetAt(pFont, pCache);

+    }

+    pCache->m_nCount++;

+    return pCache->m_Obj;

+}

+void CPDF_DocRenderData::ReleaseCachedType3(CPDF_Type3Font* pFont)

+{

+    CPDF_CountedObject<CPDF_Type3Cache*>* pCache;

+    if (!m_Type3FaceMap.Lookup(pFont, pCache)) {

+        return;

+    }

+    pCache->m_nCount--;

+}

+class CPDF_RenderModule : public CPDF_RenderModuleDef

+{

+public:

+    virtual ~CPDF_RenderModule() {}

+    virtual FX_BOOL	Installed()

+    {

+        return TRUE;

+    }

+    virtual CPDF_DocRenderData*	CreateDocData(CPDF_Document* pDoc);

+    virtual void	DestroyDocData(CPDF_DocRenderData* p);

+    virtual void	ClearDocData(CPDF_DocRenderData* p);

+    virtual CPDF_DocRenderData* GetRenderData()

+    {

+        return &m_RenderData;

+    }

+    virtual CPDF_PageRenderCache*	CreatePageCache(CPDF_Page* pPage)

+    {

+        return FX_NEW CPDF_PageRenderCache(pPage);

+    }

+    virtual void	DestroyPageCache(CPDF_PageRenderCache* pCache);

+    virtual CPDF_RenderConfig*	GetConfig()

+    {

+        return &m_RenderConfig;

+    }

+private:

+    CPDF_DocRenderData	m_RenderData;

+    CPDF_RenderConfig	m_RenderConfig;

+};

+CPDF_DocRenderData*	CPDF_RenderModule::CreateDocData(CPDF_Document* pDoc)

+{

+    CPDF_DocRenderData* pData = FX_NEW CPDF_DocRenderData(pDoc);

+    pData->Initialize();

+    return pData;

+}

+void CPDF_RenderModule::DestroyDocData(CPDF_DocRenderData* pDocData)

+{

+    delete pDocData;

+}

+void CPDF_RenderModule::ClearDocData(CPDF_DocRenderData* p)

+{

+    if (p) {

+        p->Clear(FALSE);

+    }

+}

+void CPDF_RenderModule::DestroyPageCache(CPDF_PageRenderCache* pCache)

+{

+    delete pCache;

+}

+void CPDF_ModuleMgr::InitRenderModule()

+{

+    if (m_pRenderModule) {

+        delete m_pRenderModule;

+    }

+    m_pRenderModule = FX_NEW CPDF_RenderModule;

+}

+CPDF_RenderOptions::CPDF_RenderOptions()

+    : m_ColorMode(RENDER_COLOR_NORMAL)

+    , m_Flags(RENDER_CLEARTYPE)

+    , m_Interpolation(0)

+    , m_AddFlags(0)

+    , m_pOCContext(NULL)

+    , m_dwLimitCacheSize(1024 * 1024 * 100)

+    , m_HalftoneLimit(-1)

+{

+#if defined(_FPDFAPI_MINI_)

+    m_Flags |= RENDER_LIMITEDIMAGECACHE;

+#endif

+}

+FX_ARGB CPDF_RenderOptions::TranslateColor(FX_ARGB argb) const

+{

+    if (m_ColorMode == RENDER_COLOR_NORMAL) {

+        return argb;

+    }

+    if (m_ColorMode == RENDER_COLOR_ALPHA) {

+        return argb;

+    }

+    int a, r, g, b;

+    ArgbDecode(argb, a, r, g, b);

+    int gray = FXRGB2GRAY(r, g, b);

+    if (m_ColorMode == RENDER_COLOR_TWOCOLOR) {

+        int color = (r - gray) * (r - gray) + (g - gray) * (g - gray) + (b - gray) * (b - gray);

+        if (gray < 35 && color < 20) {

+            return ArgbEncode(a, m_ForeColor);

+        }

+        if (gray > 221 && color < 20) {

+            return ArgbEncode(a, m_BackColor);

+        }

+        return argb;

+    }

+    int fr = FXSYS_GetRValue(m_ForeColor);

+    int fg = FXSYS_GetGValue(m_ForeColor);

+    int fb = FXSYS_GetBValue(m_ForeColor);

+    int br = FXSYS_GetRValue(m_BackColor);

+    int bg = FXSYS_GetGValue(m_BackColor);

+    int bb = FXSYS_GetBValue(m_BackColor);

+    r = (br - fr) * gray / 255 + fr;

+    g = (bg - fg) * gray / 255 + fg;

+    b = (bb - fb) * gray / 255 + fb;

+    return ArgbEncode(a, r, g, b);

+}

+CPDF_RenderStatus::CPDF_RenderStatus()

+{

+    m_pContext = NULL;

+    m_bStopped = FALSE;

+    m_Level = 0;

+    m_pDevice = NULL;

+    m_pCurObj = NULL;

+    m_pStopObj = NULL;

+    m_HalftoneLimit = 0;

+    m_pObjectRenderer = NULL;

+    m_bPrint = FALSE;

+    m_Transparency = 0;

+    m_DitherBits = 0;

+    m_bDropObjects = FALSE;

+    m_bStdCS = FALSE;

+    m_GroupFamily = 0;

+    m_bLoadMask = FALSE;

+    m_pType3Char = NULL;

+    m_T3FillColor = 0;

+    m_pFormResource = NULL;

+    m_pPageResource = NULL;

+    m_curBlend = FXDIB_BLEND_NORMAL;

+}

+CPDF_RenderStatus::~CPDF_RenderStatus()

+{

+    if (m_pObjectRenderer) {

+        delete m_pObjectRenderer;

+    }

+}

+FX_BOOL CPDF_RenderStatus::Initialize(int level, CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,

+                                      const CFX_AffineMatrix* pDeviceMatrix, const CPDF_PageObject* pStopObj,

+                                      const CPDF_RenderStatus* pParentState, const CPDF_GraphicStates* pInitialStates,

+                                      const CPDF_RenderOptions* pOptions, int transparency, FX_BOOL bDropObjects,

+                                      CPDF_Dictionary* pFormResource, FX_BOOL bStdCS, CPDF_Type3Char* pType3Char,

+                                      FX_ARGB fill_color, FX_DWORD GroupFamily,

+                                      FX_BOOL bLoadMask)

+{

+    m_Level = level;

+    m_pContext = pContext;

+    m_pDevice = pDevice;

+    m_DitherBits = pDevice->GetDeviceCaps(FXDC_DITHER_BITS);

+    m_bPrint = m_pDevice->GetDeviceClass() != FXDC_DISPLAY;

+    if (pDeviceMatrix) {

+        m_DeviceMatrix = *pDeviceMatrix;

+    }

+    m_pStopObj = pStopObj;

+    if (pOptions) {

+        m_Options = *pOptions;

+    }

+    m_bDropObjects = bDropObjects;

+    m_bStdCS = bStdCS;

+    m_T3FillColor = fill_color;

+    m_pType3Char = pType3Char;

+    m_GroupFamily = GroupFamily;

+    m_bLoadMask = bLoadMask;

+    m_pFormResource = pFormResource;

+    m_pPageResource = m_pContext->m_pPageResources;

+    if (pInitialStates && !m_pType3Char) {

+        m_InitialStates.CopyStates(*pInitialStates);

+        if (pParentState) {

+            CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;

+            CPDF_ColorStateData* pParentData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pParentState->m_InitialStates.m_ColorState;

+            if (!pColorData || pColorData->m_FillColor.IsNull()) {

+                CPDF_ColorStateData* pData = m_InitialStates.m_ColorState.GetModify();

+                pData->m_FillRGB = pParentData->m_FillRGB;

+                pData->m_FillColor.Copy(&pParentData->m_FillColor);

+            }

+            if (!pColorData || pColorData->m_StrokeColor.IsNull()) {

+                CPDF_ColorStateData* pData = m_InitialStates.m_ColorState.GetModify();

+                pData->m_StrokeRGB = pParentData->m_FillRGB;

+                pData->m_StrokeColor.Copy(&pParentData->m_StrokeColor);

+            }

+        }

+    } else {

+        m_InitialStates.DefaultStates();

+    }

+#if defined(_FPDFAPI_MINI_)||defined(_FXCORE_LIMITED_CPU_)

+    m_HalftoneLimit = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_HalftoneLimit;

+    if (pOptions && pOptions->m_HalftoneLimit >= 0) {

+        m_HalftoneLimit = pOptions->m_HalftoneLimit;

+    }

+#endif

+    m_pObjectRenderer = NULL;

+    m_Transparency = transparency;

+    return TRUE;

+}

+void CPDF_RenderStatus::RenderObjectList(const CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObj2Device)

+{

+    if (m_Level > 32) {

+        return;

+    }

+    CFX_FloatRect clip_rect = m_pDevice->GetClipBox();

+    CFX_AffineMatrix device2object;

+    device2object.SetReverse(*pObj2Device);

+    device2object.TransformRect(clip_rect);

+    int index = 0;

+    FX_POSITION pos = pObjs->GetFirstObjectPosition();

+    while(pos) {

+        index ++;

+        CPDF_PageObject* pCurObj = pObjs->GetNextObject(pos);

+        if (pCurObj == m_pStopObj) {

+            m_bStopped = TRUE;

+            return;

+        }

+        if (!pCurObj) {

+            continue;

+        }

+        if(pCurObj == NULL || pCurObj->m_Left > clip_rect.right || pCurObj->m_Right < clip_rect.left ||

+                pCurObj->m_Bottom > clip_rect.top || pCurObj->m_Top < clip_rect.bottom) {

+            continue;

+        }

+        RenderSingleObject(pCurObj, pObj2Device);

+        if (m_bStopped) {

+            return;

+        }

+    }

+}

+void CPDF_RenderStatus::RenderSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)

+{

+    if (m_Level > 32) {

+        return;

+    }

+    m_pCurObj = pObj;

+    if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull())

+        if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) {

+            return;

+        }

+    ProcessClipPath(pObj->m_ClipPath, pObj2Device);

+    if (ProcessTransparency(pObj, pObj2Device)) {

+        return;

+    }

+    ProcessObjectNoClip(pObj, pObj2Device);

+}

+FX_BOOL CPDF_RenderStatus::ContinueSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, IFX_Pause* pPause)

+{

+    if (m_pObjectRenderer) {

+        if (m_pObjectRenderer->Continue(pPause)) {

+            return TRUE;

+        }

+        if (!m_pObjectRenderer->m_Result) {

+            DrawObjWithBackground(pObj, pObj2Device);

+        }

+#ifdef _FPDFAPI_MINI_

+        if (m_DitherBits) {

+            DitherObjectArea(pObj, pObj2Device);

+        }

+#endif

+        delete m_pObjectRenderer;

+        m_pObjectRenderer = NULL;

+        return FALSE;

+    }

+    m_pCurObj = pObj;

+    if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull())

+        if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) {

+            return FALSE;

+        }

+    ProcessClipPath(pObj->m_ClipPath, pObj2Device);

+    if (ProcessTransparency(pObj, pObj2Device)) {

+        return FALSE;

+    }

+    if (pObj->m_Type == PDFPAGE_IMAGE) {

+        m_pObjectRenderer = IPDF_ObjectRenderer::Create(pObj->m_Type);

+        if (!m_pObjectRenderer->Start(this, pObj, pObj2Device, FALSE)) {

+            if (!m_pObjectRenderer->m_Result) {

+                DrawObjWithBackground(pObj, pObj2Device);

+            }

+#ifdef _FPDFAPI_MINI_

+            if (m_DitherBits) {

+                DitherObjectArea(pObj, pObj2Device);

+            }

+#endif

+            delete m_pObjectRenderer;

+            m_pObjectRenderer = NULL;

+            return FALSE;

+        }

+        return ContinueSingleObject(pObj, pObj2Device, pPause);

+    }

+    ProcessObjectNoClip(pObj, pObj2Device);

+    return FALSE;

+}

+IPDF_ObjectRenderer* IPDF_ObjectRenderer::Create(int type)

+{

+    IPDF_ObjectRenderer* pRenderer = NULL;

+    if (type == PDFPAGE_IMAGE) {

+        pRenderer = FX_NEW CPDF_ImageRenderer;

+    }

+    return pRenderer;

+}

+FX_BOOL CPDF_RenderStatus::GetObjectClippedRect(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bLogical, FX_RECT &rect) const

+{

+    rect = pObj->GetBBox(pObj2Device);

+    FX_RECT rtClip = m_pDevice->GetClipBox();

+    if (!bLogical) {

+        CFX_Matrix dCTM = m_pDevice->GetCTM();

+        FX_FLOAT a = FXSYS_fabs(dCTM.a);

+        FX_FLOAT d = FXSYS_fabs(dCTM.d);

+        if (a != 1.0f || d != 1.0f) {

+            rect.right = rect.left + (FX_INT32)FXSYS_ceil((FX_FLOAT)rect.Width() * a);

+            rect.bottom = rect.top + (FX_INT32)FXSYS_ceil((FX_FLOAT)rect.Height() * d);

+            rtClip.right = rtClip.left + (FX_INT32)FXSYS_ceil((FX_FLOAT)rtClip.Width() * a);

+            rtClip.bottom = rtClip.top + (FX_INT32)FXSYS_ceil((FX_FLOAT)rtClip.Height() * d);

+        }

+    }

+    rect.Intersect(rtClip);

+    return rect.IsEmpty();

+}

+void CPDF_RenderStatus::DitherObjectArea(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)

+{

+    CFX_DIBitmap* pBitmap = m_pDevice->GetBitmap();

+    if (pBitmap == NULL) {

+        return;

+    }

+    FX_RECT rect;

+    if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) {

+        return;

+    }

+    if (m_DitherBits == 2) {

+        static FX_ARGB pal[4] = {0, 85, 170, 255};

+        pBitmap->DitherFS(pal, 4, &rect);

+    } else if (m_DitherBits == 3) {

+        static FX_ARGB pal[8] = {0, 36, 73, 109, 146, 182, 219, 255};

+        pBitmap->DitherFS(pal, 8, &rect);

+    } else if (m_DitherBits == 4) {

+        static FX_ARGB pal[16] = {0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255};

+        pBitmap->DitherFS(pal, 16, &rect);

+    }

+}

+void CPDF_RenderStatus::ProcessObjectNoClip(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)

+{

+    FX_BOOL bRet = FALSE;

+    switch (pObj->m_Type) {

+        case PDFPAGE_TEXT:

+            bRet = ProcessText((CPDF_TextObject*)pObj, pObj2Device, NULL);

+            break;

+        case PDFPAGE_PATH:

+            bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device);

+            break;

+        case PDFPAGE_IMAGE:

+            bRet = ProcessImage((CPDF_ImageObject*)pObj, pObj2Device);

+            break;

+        case PDFPAGE_SHADING:

+            bRet = ProcessShading((CPDF_ShadingObject*)pObj, pObj2Device);

+            break;

+        case PDFPAGE_FORM:

+            bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device);

+            break;

+#if defined(_FPDFAPI_MINI_)

+        case PDFPAGE_INLINES:

+            bRet = ProcessInlines((CPDF_InlineImages*)pObj, pObj2Device);

+            break;

+#endif

+    }

+    if (!bRet) {

+        DrawObjWithBackground(pObj, pObj2Device);

+    }

+}

+FX_BOOL CPDF_RenderStatus::DrawObjWithBlend(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)

+{

+    FX_BOOL bRet = FALSE;

+    switch (pObj->m_Type) {

+        case PDFPAGE_PATH:

+            bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device);

+            break;

+        case PDFPAGE_IMAGE:

+            bRet = ProcessImage((CPDF_ImageObject *)pObj, pObj2Device);

+            break;

+        case PDFPAGE_FORM:

+            bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device);

+            break;

+    }

+    return bRet;

+}

+void CPDF_RenderStatus::GetScaledMatrix(CFX_Matrix &matrix) const

+{

+    CFX_Matrix dCTM = m_pDevice->GetCTM();

+    matrix.a *= FXSYS_fabs(dCTM.a);

+    matrix.d *= FXSYS_fabs(dCTM.d);

+}

+void CPDF_RenderStatus::DrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)

+{

+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)

+    FX_RECT rect;

+    if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) {

+        return;

+    }

+    int res = 300;

+    if (pObj->m_Type == PDFPAGE_IMAGE && m_pDevice->GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) {

+        res = 0;

+    }

+    CPDF_ScaledRenderBuffer buffer;

+    if (!buffer.Initialize(m_pContext, m_pDevice, &rect, pObj, &m_Options, res)) {

+        return;

+    }

+    CFX_AffineMatrix matrix = *pObj2Device;

+    matrix.Concat(*buffer.GetMatrix());

+    GetScaledMatrix(matrix);

+    CPDF_Dictionary* pFormResource = NULL;

+    if (pObj->m_Type == PDFPAGE_FORM) {

+        CPDF_FormObject* pFormObj = (CPDF_FormObject*)pObj;

+        if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {

+            pFormResource = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));

+        }

+    }

+    CPDF_RenderStatus status;

+    status.Initialize(m_Level + 1, m_pContext, buffer.GetDevice(), buffer.GetMatrix(), NULL, NULL, NULL, &m_Options, m_Transparency, m_bDropObjects, pFormResource);

+    status.RenderSingleObject(pObj, &matrix);

+    buffer.OutputToDevice();

+#endif

+}

+FX_BOOL CPDF_RenderStatus::ProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device)

+{

+    CPDF_Dictionary* pOC = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("OC"));

+    if (pOC && m_Options.m_pOCContext && !m_Options.m_pOCContext->CheckOCGVisible(pOC)) {

+        return TRUE;

+    }

+    CFX_AffineMatrix matrix = pFormObj->m_FormMatrix;

+    matrix.Concat(*pObj2Device);

+    CPDF_Dictionary* pResources = NULL;

+    if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {

+        pResources = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));

+    }

+    CPDF_RenderStatus status;

+    status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, m_pStopObj,

+                      this, pFormObj, &m_Options, m_Transparency, m_bDropObjects, pResources, TRUE);

+    status.m_curBlend = m_curBlend;

+    m_pDevice->SaveState();

+    status.RenderObjectList(pFormObj->m_pForm, &matrix);

+    m_bStopped = status.m_bStopped;

+    m_pDevice->RestoreState();

+    return TRUE;

+}

+FX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix)

+{

+    if (matrix.a == 0 || matrix.d == 0) {

+        return matrix.b != 0 && matrix.c != 0;

+    }

+    if (matrix.b == 0 || matrix.c == 0) {

+        return matrix.a != 0 && matrix.d != 0;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_RenderStatus::ProcessPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device)

+{

+    int FillType = pPathObj->m_FillType;

+    FX_BOOL bStroke = pPathObj->m_bStroke;

+    ProcessPathPattern(pPathObj, pObj2Device, FillType, bStroke);

+    if (FillType == 0 && !bStroke) {

+        return TRUE;

+    }

+    FX_DWORD fill_argb = 0;

+    if (FillType) {

+        fill_argb = GetFillArgb(pPathObj);

+    }

+    FX_DWORD stroke_argb = 0;

+    if (bStroke) {

+        stroke_argb = GetStrokeArgb(pPathObj);

+    }

+    CFX_AffineMatrix path_matrix = pPathObj->m_Matrix;

+    path_matrix.Concat(*pObj2Device);

+    if (!IsAvailableMatrix(path_matrix)) {

+        return TRUE;

+    }

+    if (FillType && (m_Options.m_Flags & RENDER_RECT_AA)) {

+        FillType |= FXFILL_RECT_AA;

+    }

+    if (m_Options.m_Flags & RENDER_FILL_FULLCOVER) {

+        FillType |= FXFILL_FULLCOVER;

+    }

+    if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {

+        FillType |= FXFILL_NOPATHSMOOTH;

+    }

+    if (bStroke) {

+        FillType |= FX_FILL_STROKE;

+    }

+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)

+    const CPDF_GeneralStateData* pGeneralData = ((CPDF_PageObject*)pPathObj)->m_GeneralState;

+    if (pGeneralData && pGeneralData->m_StrokeAdjust) {

+        FillType |= FX_STROKE_ADJUST;

+    }

+#endif

+    if (m_pType3Char) {

+        FillType |= FX_FILL_TEXT_MODE;

+    }

+    CFX_GraphStateData graphState(*pPathObj->m_GraphState);

+    if (m_Options.m_Flags & RENDER_THINLINE) {

+        graphState.m_LineWidth = 0;

+    }

+    return m_pDevice->DrawPath(pPathObj->m_Path, &path_matrix, &graphState, fill_argb, stroke_argb, FillType, 0, NULL, m_curBlend);

+}

+CPDF_TransferFunc* CPDF_RenderStatus::GetTransferFunc(CPDF_Object* pObj) const

+{

+    ASSERT(pObj != NULL);

+    CPDF_DocRenderData* pDocCache = m_pContext->m_pDocument->GetRenderData();

+    if (!pDocCache) {

+        return NULL;

+    }

+    return pDocCache->GetTransferFunc(pObj);

+}

+FX_ARGB CPDF_RenderStatus::GetFillArgb(const CPDF_PageObject* pObj, FX_BOOL bType3) const

+{

+    CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pObj->m_ColorState;

+    if (m_pType3Char && !bType3 && (!m_pType3Char->m_bColored || (m_pType3Char->m_bColored && (!pColorData || pColorData->m_FillColor.IsNull())))) {

+        return m_T3FillColor;

+    } else if (!pColorData || pColorData->m_FillColor.IsNull()) {

+        pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;

+    }

+    FX_COLORREF rgb = pColorData->m_FillRGB;

+    if (rgb == (FX_DWORD) - 1) {

+        return 0;

+    }

+    const CPDF_GeneralStateData* pGeneralData = pObj->m_GeneralState;

+    int alpha;

+    if (pGeneralData) {

+        alpha = (FX_INT32)(pGeneralData->m_FillAlpha * 255);

+#ifndef _FPDFAPI_MINI_

+        if (pGeneralData->m_pTR) {

+            if (!pGeneralData->m_pTransferFunc) {

+                ((CPDF_GeneralStateData*)pGeneralData)->m_pTransferFunc = GetTransferFunc(pGeneralData->m_pTR);

+            }

+            if (pGeneralData->m_pTransferFunc) {

+                rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb);

+            }

+        }

+#endif

+    } else {

+        alpha = 255;

+    }

+    return m_Options.TranslateColor(ArgbEncode(alpha, rgb));

+}

+FX_ARGB CPDF_RenderStatus::GetStrokeArgb(const CPDF_PageObject* pObj) const

+{

+    CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pObj->m_ColorState;

+    if (m_pType3Char && (!m_pType3Char->m_bColored || (m_pType3Char->m_bColored && (!pColorData || pColorData->m_StrokeColor.IsNull())))) {

+        return m_T3FillColor;

+    } else if (!pColorData || pColorData->m_StrokeColor.IsNull()) {

+        pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;

+    }

+    FX_COLORREF rgb = pColorData->m_StrokeRGB;

+    if (rgb == (FX_DWORD) - 1) {

+        return 0;

+    }

+    const CPDF_GeneralStateData* pGeneralData = pObj->m_GeneralState;

+    int alpha;

+    if (pGeneralData) {

+        alpha = (FX_INT32)(pGeneralData->m_StrokeAlpha * 255);

+#ifndef _FPDFAPI_MINI_

+        if (pGeneralData->m_pTR) {

+            if (!pGeneralData->m_pTransferFunc) {

+                ((CPDF_GeneralStateData*)pGeneralData)->m_pTransferFunc = GetTransferFunc(pGeneralData->m_pTR);

+            }

+            if (pGeneralData->m_pTransferFunc) {

+                rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb);

+            }

+        }

+#endif

+    } else {

+        alpha = 255;

+    }

+    return m_Options.TranslateColor(ArgbEncode(alpha, rgb));

+}

+void CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device)

+{

+    if (ClipPath.IsNull()) {

+        if (m_LastClipPath.IsNull()) {

+            return;

+        }

+        m_pDevice->RestoreState(TRUE);

+        m_LastClipPath.SetNull();

+        return;

+    }

+    if (m_LastClipPath == ClipPath) {

+        return;

+    }

+    m_LastClipPath = ClipPath;

+    m_pDevice->RestoreState(TRUE);

+    int nClipPath = ClipPath.GetPathCount();

+    int i;

+    for (i = 0; i < nClipPath; i++) {

+        const CFX_PathData* pPathData = ClipPath.GetPath(i);

+        if (pPathData == NULL) {

+            continue;

+        }

+        if (pPathData->GetPointCount() == 0) {

+            CFX_PathData EmptyPath;

+            EmptyPath.AppendRect(-1, -1, 0, 0);

+            int fill_mode = FXFILL_WINDING;

+            m_pDevice->SetClip_PathFill(&EmptyPath, NULL, fill_mode);

+        } else {

+            int ClipType = ClipPath.GetClipType(i);

+            m_pDevice->SetClip_PathFill(pPathData, pObj2Device, ClipType);

+        }

+    }

+    int textcount = ClipPath.GetTextCount();

+    if (textcount == 0) {

+        return;

+    }

+    if (m_pDevice->GetDeviceClass() == FXDC_DISPLAY && !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) {

+        return;

+    }

+    CFX_PathData* pTextClippingPath = NULL;

+    for (i = 0; i < textcount; i ++) {

+        CPDF_TextObject* pText = ClipPath.GetText(i);

+        if (pText == NULL) {

+            if (pTextClippingPath) {

+                int fill_mode = FXFILL_WINDING;

+                if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) {

+                    fill_mode |= FXFILL_NOPATHSMOOTH;

+                }

+                m_pDevice->SetClip_PathFill(pTextClippingPath, NULL, fill_mode);

+                delete pTextClippingPath;

+                pTextClippingPath = NULL;

+            }

+        } else {

+            if (pTextClippingPath == NULL) {

+                pTextClippingPath = FX_NEW CFX_PathData;

+            }

+            ProcessText(pText, pObj2Device, pTextClippingPath);

+        }

+    }

+    if (pTextClippingPath) {

+        delete pTextClippingPath;

+    }

+}

+void CPDF_RenderStatus::DrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device)

+{

+    if (ClipPath.IsNull()) {

+        return;

+    }

+    int fill_mode = 0;

+    if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {

+        fill_mode |= FXFILL_NOPATHSMOOTH;

+    }

+    int nClipPath = ClipPath.GetPathCount();

+    int i;

+    for (i = 0; i < nClipPath; i++) {

+        const CFX_PathData* pPathData = ClipPath.GetPath(i);

+        if (pPathData == NULL) {

+            continue;

+        }

+        CFX_GraphStateData stroke_state;

+        if (m_Options.m_Flags & RENDER_THINLINE) {

+            stroke_state.m_LineWidth = 0;

+        }

+        m_pDevice->DrawPath(pPathData, pObj2Device, &stroke_state, 0, 0xffff0000, fill_mode);

+    }

+}

+FX_BOOL CPDF_RenderStatus::SelectClipPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)

+{

+    CFX_AffineMatrix path_matrix = pPathObj->m_Matrix;

+    path_matrix.Concat(*pObj2Device);

+    if (bStroke) {

+        CFX_GraphStateData graphState(*pPathObj->m_GraphState);

+        if (m_Options.m_Flags & RENDER_THINLINE) {

+            graphState.m_LineWidth = 0;

+        }

+        return m_pDevice->SetClip_PathStroke(pPathObj->m_Path, &path_matrix, &graphState);

+    }

+    int fill_mode = pPathObj->m_FillType;

+    if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {

+        fill_mode |= FXFILL_NOPATHSMOOTH;

+    }

+    return m_pDevice->SetClip_PathFill(pPathObj->m_Path, &path_matrix, fill_mode);

+}

+FX_BOOL CPDF_RenderStatus::ProcessTransparency(const CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device)

+{

+    const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState;

+    int blend_type = pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL;

+    if (blend_type == FXDIB_BLEND_UNSUPPORTED) {

+        return TRUE;

+    }

+    CPDF_Dictionary* pSMaskDict = pGeneralState ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;

+    if (pSMaskDict) {

+        if (pPageObj->m_Type == PDFPAGE_IMAGE &&

+                ((CPDF_ImageObject*)pPageObj)->m_pImage->GetDict()->KeyExist(FX_BSTRC("SMask"))) {

+            pSMaskDict = NULL;

+        }

+    }

+    CPDF_Dictionary* pFormResource = NULL;

+    FX_FLOAT group_alpha = 1.0f;

+    int Transparency = m_Transparency;

+    FX_BOOL bGroupTransparent = FALSE;

+    if (pPageObj->m_Type == PDFPAGE_FORM) {

+        CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;

+        const CPDF_GeneralStateData *pStateData = pFormObj->m_GeneralState.GetObject();

+        if (pStateData) {

+            group_alpha = pStateData->m_FillAlpha;

+        }

+        Transparency = pFormObj->m_pForm->m_Transparency;

+        bGroupTransparent = Transparency & PDFTRANS_ISOLATED ? TRUE : FALSE;

+        if (pFormObj->m_pForm->m_pFormDict) {

+            pFormResource = pFormObj->m_pForm->m_pFormDict->GetDict("Resources");

+        }

+    }

+    FX_BOOL bTextClip = FALSE;

+    if (pPageObj->m_ClipPath.NotNull() && pPageObj->m_ClipPath.GetTextCount() &&

+            m_pDevice->GetDeviceClass() == FXDC_DISPLAY && !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) {

+        bTextClip = TRUE;

+    }

+    if ((m_Options.m_Flags & RENDER_OVERPRINT) && pPageObj->m_Type == PDFPAGE_IMAGE && pGeneralState && pGeneralState->m_FillOP && pGeneralState->m_StrokeOP) {

+        CPDF_Document* pDocument = NULL;

+        CPDF_Page* pPage = NULL;

+        if (m_pContext->m_pPageCache) {

+            pPage = m_pContext->m_pPageCache->GetPage();

+            pDocument = pPage->m_pDocument;

+        } else {

+            pDocument = ((CPDF_ImageObject*)pPageObj)->m_pImage->GetDocument();

+        }

+        CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL;

+        CPDF_Object* pCSObj = ((CPDF_ImageObject*)pPageObj)->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("ColorSpace"));

+        CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources);

+        if (pColorSpace) {

+            int format = pColorSpace->GetFamily();

+            if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) {

+                blend_type = FXDIB_BLEND_DARKEN;

+            }

+            pDocument->GetPageData()->ReleaseColorSpace(pCSObj);

+        }

+    }

+    if (pSMaskDict == NULL && group_alpha == 1.0f && blend_type == FXDIB_BLEND_NORMAL && !bTextClip && !bGroupTransparent) {

+        return FALSE;

+    }

+    FX_BOOL isolated = Transparency & PDFTRANS_ISOLATED;

+    if (m_bPrint) {

+        FX_BOOL bRet = FALSE;

+        int rendCaps = m_pDevice->GetRenderCaps();

+        if (!((Transparency & PDFTRANS_ISOLATED) || pSMaskDict || bTextClip) && (rendCaps & FXRC_BLEND_MODE)) {

+            int oldBlend = m_curBlend;

+            m_curBlend = blend_type;

+            bRet = DrawObjWithBlend(pPageObj, pObj2Device);

+            m_curBlend = oldBlend;

+        }

+        if (!bRet) {

+            DrawObjWithBackground(pPageObj, pObj2Device);

+        }

+        return TRUE;

+    }

+    FX_RECT rect = pPageObj->GetBBox(pObj2Device);

+    rect.Intersect(m_pDevice->GetClipBox());

+    if (rect.IsEmpty()) {

+        return TRUE;

+    }

+    CFX_Matrix deviceCTM = m_pDevice->GetCTM();

+    FX_FLOAT scaleX = FXSYS_abs(deviceCTM.a);

+    FX_FLOAT scaleY = FXSYS_abs(deviceCTM.d);

+    int width = FXSYS_round((FX_FLOAT)rect.Width() * scaleX);

+    int height = FXSYS_round((FX_FLOAT)rect.Height() * scaleY);

+    CFX_FxgeDevice bitmap_device;

+    CFX_DIBitmap* oriDevice = NULL;

+    if (!isolated && (m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) {

+        oriDevice = FX_NEW CFX_DIBitmap;

+        if (!m_pDevice->CreateCompatibleBitmap(oriDevice, width, height)) {

+            return TRUE;

+        }

+        m_pDevice->GetDIBits(oriDevice, rect.left, rect.top);

+    }

+    if (!bitmap_device.Create(width, height, FXDIB_Argb, 0, oriDevice)) {

+        return TRUE;

+    }

+    CFX_DIBitmap* bitmap = bitmap_device.GetBitmap();

+    bitmap->Clear(0);

+    CFX_AffineMatrix new_matrix = *pObj2Device;

+    new_matrix.TranslateI(-rect.left, -rect.top);

+    new_matrix.Scale(scaleX, scaleY);

+    CFX_DIBitmap* pTextMask = NULL;

+    if (bTextClip) {

+        pTextMask = FX_NEW CFX_DIBitmap;

+        if (!pTextMask->Create(width, height, FXDIB_8bppMask)) {

+            delete pTextMask;

+            return TRUE;

+        }

+        pTextMask->Clear(0);

+        CFX_FxgeDevice text_device;

+        text_device.Attach(pTextMask);

+        for (FX_DWORD i = 0; i < pPageObj->m_ClipPath.GetTextCount(); i ++) {

+            CPDF_TextObject* textobj = pPageObj->m_ClipPath.GetText(i);

+            if (textobj == NULL) {

+                break;

+            }

+            CFX_AffineMatrix text_matrix;

+            textobj->GetTextMatrix(&text_matrix);

+            CPDF_TextRenderer::DrawTextPath(&text_device, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos,

+                                            textobj->m_TextState.GetFont(), textobj->m_TextState.GetFontSize(),

+                                            &text_matrix, &new_matrix, textobj->m_GraphState, (FX_ARGB) - 1, 0, NULL);

+        }

+    }

+    CPDF_RenderStatus bitmap_render;

+    bitmap_render.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL,

+                             m_pStopObj, NULL, NULL, &m_Options, 0, m_bDropObjects, pFormResource, TRUE);

+    bitmap_render.ProcessObjectNoClip(pPageObj, &new_matrix);

+    m_bStopped = bitmap_render.m_bStopped;

+    if (pSMaskDict) {

+        CFX_AffineMatrix smask_matrix;

+        FXSYS_memcpy32(&smask_matrix, pGeneralState->m_SMaskMatrix, sizeof smask_matrix);

+        smask_matrix.Concat(*pObj2Device);

+        CFX_DIBSource* pSMaskSource = LoadSMask(pSMaskDict, &rect, &smask_matrix);

+        if (pSMaskSource) {

+            bitmap->MultiplyAlpha(pSMaskSource);

+            delete pSMaskSource;

+        }

+    }

+    if (pTextMask) {

+        bitmap->MultiplyAlpha(pTextMask);

+        delete pTextMask;

+        pTextMask = NULL;

+    }

+    if (Transparency & PDFTRANS_GROUP && group_alpha != 1.0f) {

+        bitmap->MultiplyAlpha((FX_INT32)(group_alpha * 255));

+    }

+    Transparency = m_Transparency;

+    if (pPageObj->m_Type == PDFPAGE_FORM) {

+        Transparency |= PDFTRANS_GROUP;

+    }

+    CompositeDIBitmap(bitmap, rect.left, rect.top, 0, 255, blend_type, Transparency);

+    if (oriDevice) {

+        delete oriDevice;

+    }

+    return TRUE;

+}

+CFX_DIBitmap* CPDF_RenderStatus::GetBackdrop(const CPDF_PageObject* pObj, const FX_RECT& rect, int& left, int& top,

+        FX_BOOL bBackAlphaRequired)

+{

+    FX_RECT bbox = rect;

+    bbox.Intersect(m_pDevice->GetClipBox());

+    left = bbox.left;

+    top = bbox.top;

+    CFX_Matrix deviceCTM = m_pDevice->GetCTM();

+    FX_FLOAT scaleX = FXSYS_abs(deviceCTM.a);

+    FX_FLOAT scaleY = FXSYS_abs(deviceCTM.d);

+    int width = FXSYS_round(bbox.Width() * scaleX);

+    int height = FXSYS_round(bbox.Height() * scaleY);

+    CFX_DIBitmap* pBackdrop = FX_NEW CFX_DIBitmap;

+    if (bBackAlphaRequired && !m_bDropObjects) {

+        pBackdrop->Create(width, height, FXDIB_Argb);

+    } else {

+        m_pDevice->CreateCompatibleBitmap(pBackdrop, width, height);

+    }

+    if (pBackdrop->GetBuffer() == NULL) {

+        delete pBackdrop;

+        return NULL;

+    }

+    FX_BOOL bNeedDraw;

+    if (pBackdrop->HasAlpha()) {

+        bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT);

+    } else {

+        bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS);

+    }

+    if (!bNeedDraw) {

+        m_pDevice->GetDIBits(pBackdrop, left, top);

+        return pBackdrop;

+    }

+    CFX_AffineMatrix FinalMatrix = m_DeviceMatrix;

+    FinalMatrix.TranslateI(-left, -top);

+    FinalMatrix.Scale(scaleX, scaleY);

+    pBackdrop->Clear(pBackdrop->HasAlpha() ? 0 : 0xffffffff);

+    CFX_FxgeDevice device;

+    device.Attach(pBackdrop);

+    m_pContext->Render(&device, pObj, &m_Options, &FinalMatrix);

+    return pBackdrop;

+}

+void CPDF_RenderContext::GetBackground(CFX_DIBitmap* pBuffer, const CPDF_PageObject* pObj,

+                                       const CPDF_RenderOptions* pOptions, CFX_AffineMatrix* pFinalMatrix)

+{

+    CFX_FxgeDevice device;

+    device.Attach(pBuffer);

+    if (m_pBackgroundDraw) {

+        m_pBackgroundDraw->OnDrawBackground(&device, pFinalMatrix);

+    } else {

+        FX_RECT rect(0, 0, device.GetWidth(), device.GetHeight());

+        device.FillRect(&rect, 0xffffffff);

+    }

+    Render(&device, pObj, pOptions, pFinalMatrix);

+}

+CPDF_GraphicStates* CPDF_RenderStatus::CloneObjStates(const CPDF_GraphicStates* pSrcStates, FX_BOOL bStroke)

+{

+    if (!pSrcStates) {

+        return NULL;

+    }

+    CPDF_GraphicStates* pStates = FX_NEW CPDF_GraphicStates;

+    if (!pStates) {

+        return NULL;

+    }

+    pStates->CopyStates(*pSrcStates);

+    CPDF_Color* pObjColor = bStroke ? pSrcStates->m_ColorState.GetStrokeColor() :

+                            pSrcStates->m_ColorState.GetFillColor();

+    if (!pObjColor->IsNull()) {

+        CPDF_ColorStateData* pColorData = pStates->m_ColorState.GetModify();

+        pColorData->m_FillRGB = bStroke ? pSrcStates->m_ColorState.GetObject()->m_StrokeRGB :

+                                pSrcStates->m_ColorState.GetObject()->m_FillRGB;

+        pColorData->m_StrokeRGB = pColorData->m_FillRGB;

+    }

+    return pStates;

+}

+CPDF_RenderContext::CPDF_RenderContext()

+{

+}

+void CPDF_RenderContext::Create(CPDF_Document* pDoc, CPDF_PageRenderCache* pPageCache,

+                                CPDF_Dictionary* pPageResources, FX_BOOL bFirstLayer)

+{

+    m_pBackgroundDraw = NULL;

+    m_pDocument = pDoc;

+    m_pPageResources = pPageResources;

+    m_pPageCache = pPageCache;

+    m_bFirstLayer = bFirstLayer;

+}

+void CPDF_RenderContext::Create(CPDF_Page* pPage, FX_BOOL bFirstLayer)

+{

+    m_pBackgroundDraw = NULL;

+    m_pDocument = pPage->m_pDocument;

+    m_pPageResources = pPage->m_pPageResources;

+    m_pPageCache = pPage->GetRenderCache();

+    m_bFirstLayer = bFirstLayer;

+}

+CPDF_RenderContext::~CPDF_RenderContext()

+{

+}

+void CPDF_RenderContext::Clear()

+{

+    m_pDocument = NULL;

+    m_pPageResources = NULL;

+    m_pPageCache = NULL;

+    m_pBackgroundDraw = NULL;

+    m_bFirstLayer = TRUE;

+    m_ContentList.RemoveAll();

+}

+void CPDF_RenderContext::AppendObjectList(CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObject2Device)

+{

+    _PDF_RenderItem* pItem = m_ContentList.AddSpace();

+    pItem->m_pObjectList = pObjs;

+    if (pObject2Device) {

+        pItem->m_Matrix = *pObject2Device;

+    } else {

+        pItem->m_Matrix.SetIdentity();

+    }

+}

+void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, const CPDF_RenderOptions* pOptions,

+                                const CFX_AffineMatrix* pLastMatrix)

+{

+    Render(pDevice, NULL, pOptions, pLastMatrix);

+}

+void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, const CPDF_PageObject* pStopObj,

+                                const CPDF_RenderOptions* pOptions, const CFX_AffineMatrix* pLastMatrix)

+{

+    int count = m_ContentList.GetSize();

+    for (int j = 0; j < count; j ++) {

+        pDevice->SaveState();

+        _PDF_RenderItem* pItem = m_ContentList.GetDataPtr(j);

+        if (pLastMatrix) {

+            CFX_AffineMatrix FinalMatrix = pItem->m_Matrix;

+            FinalMatrix.Concat(*pLastMatrix);

+            CPDF_RenderStatus status;

+            status.Initialize(0, this, pDevice, pLastMatrix, pStopObj, NULL, NULL, pOptions,

+                              pItem->m_pObjectList->m_Transparency, FALSE, NULL);

+            status.RenderObjectList(pItem->m_pObjectList, &FinalMatrix);

+#if !defined(_FPDFAPI_MINI_)

+            if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {

+                m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize);

+            }

+#endif

+            if (status.m_bStopped) {

+                pDevice->RestoreState();

+                break;

+            }

+        } else {

+            CPDF_RenderStatus status;

+            status.Initialize(0, this, pDevice, NULL, pStopObj, NULL, NULL, pOptions,

+                              pItem->m_pObjectList->m_Transparency, FALSE, NULL);

+            status.RenderObjectList(pItem->m_pObjectList, &pItem->m_Matrix);

+#if !defined(_FPDFAPI_MINI_)

+            if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {

+                m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize);

+            }

+#endif

+            if (status.m_bStopped) {

+                pDevice->RestoreState();

+                break;

+            }

+        }

+        pDevice->RestoreState();

+    }

+}

+void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObjects* pObjs,

+                                        const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions)

+{

+    AppendObjectList(pObjs, pObject2Device);

+    Render(pDevice, pOptions);

+}

+CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer()

+{

+    m_pRenderer = NULL;

+    m_pContext = NULL;

+    m_pDevice = NULL;

+    m_Status = Ready;

+}

+CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer()

+{

+    Clear();

+}

+void CPDF_ProgressiveRenderer::Clear()

+{

+    if (m_pRenderer) {

+        delete m_pRenderer;

+        m_pDevice->RestoreState();

+        m_pRenderer = NULL;

+    }

+    m_Status = Ready;

+}

+void CPDF_ProgressiveRenderer::Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,

+                                     const CPDF_RenderOptions* pOptions, IFX_Pause* pPause, FX_BOOL bDropObjects)

+{

+    if (m_Status != Ready) {

+        m_Status = Failed;

+        return;

+    }

+    m_pContext = pContext;

+    m_pDevice = pDevice;

+    m_pOptions = pOptions;

+    m_bDropObjects = bDropObjects;

+    if (pContext == NULL || pDevice == NULL) {

+        m_Status = Failed;

+        return;

+    }

+    m_Status = ToBeContinued;

+    m_ObjectPos = NULL;

+    m_LayerIndex = 0;

+    m_ObjectIndex = 0;

+    m_PrevLastPos = NULL;

+    Continue(pPause);

+}

+#ifdef _FPDFAPI_MINI_

+#define RENDER_STEP_LIMIT 20

+#else

+#define RENDER_STEP_LIMIT 100

+#endif

+void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)

+{

+    if (m_Status != ToBeContinued) {

+        return;

+    }

+    FX_DWORD nLayers = m_pContext->m_ContentList.GetSize();

+    for (; m_LayerIndex < nLayers; m_LayerIndex ++) {

+        _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(m_LayerIndex);

+        FX_POSITION LastPos = pItem->m_pObjectList->GetLastObjectPosition();

+        if (m_ObjectPos == NULL) {

+            if (LastPos == m_PrevLastPos) {

+                if (!pItem->m_pObjectList->IsParsed()) {

+                    pItem->m_pObjectList->ContinueParse(pPause);

+                    if (!pItem->m_pObjectList->IsParsed()) {

+                        return;

+                    }

+                    LastPos = pItem->m_pObjectList->GetLastObjectPosition();

+                }

+            }

+            if (LastPos == m_PrevLastPos) {

+                if (m_pRenderer) {

+                    delete m_pRenderer;

+                    m_pRenderer = NULL;

+                    m_pDevice->RestoreState();

+                    m_ObjectPos = NULL;

+                    m_PrevLastPos = NULL;

+                }

+                continue;

+            }

+            if (m_PrevLastPos) {

+                m_ObjectPos = m_PrevLastPos;

+                pItem->m_pObjectList->GetNextObject(m_ObjectPos);

+            } else {

+                m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();

+            }

+            m_PrevLastPos = LastPos;

+        }

+        if (m_pRenderer == NULL) {

+            m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();

+            m_ObjectIndex = 0;

+            m_pRenderer = FX_NEW CPDF_RenderStatus();

+            m_pRenderer->Initialize(0, m_pContext, m_pDevice, NULL, NULL, NULL, NULL,

+                                    m_pOptions, pItem->m_pObjectList->m_Transparency, m_bDropObjects, NULL);

+            m_pDevice->SaveState();

+            m_ClipRect = m_pDevice->GetClipBox();

+            CFX_AffineMatrix device2object;

+            device2object.SetReverse(pItem->m_Matrix);

+            device2object.TransformRect(m_ClipRect);

+        }

+        int objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_RenderStepLimit;

+        while (m_ObjectPos) {

+            CPDF_PageObject* pCurObj = pItem->m_pObjectList->GetObjectAt(m_ObjectPos);

+            if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && pCurObj->m_Right >= m_ClipRect.left &&

+                    pCurObj->m_Bottom <= m_ClipRect.top && pCurObj->m_Top >= m_ClipRect.bottom) {

+                if (m_pRenderer->ContinueSingleObject(pCurObj, &pItem->m_Matrix, pPause)) {

+                    return;

+                }

+#if !defined(_FPDFAPI_MINI_)

+                if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderer->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {

+                    m_pContext->GetPageCache()->CacheOptimization(m_pRenderer->m_Options.m_dwLimitCacheSize);

+                }

+#endif

+                if (pCurObj->m_Type == PDFPAGE_FORM || pCurObj->m_Type == PDFPAGE_SHADING) {

+                    objs_to_go = 0;

+                } else {

+                    objs_to_go --;

+                }

+            }

+            m_ObjectIndex ++;

+            pItem->m_pObjectList->GetNextObject(m_ObjectPos);

+            if (objs_to_go == 0) {

+                if (pPause && pPause->NeedToPauseNow()) {

+                    return;

+                }

+                objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_RenderStepLimit;

+            }

+        }

+        if (!pItem->m_pObjectList->IsParsed()) {

+            return;

+        }

+        delete m_pRenderer;

+        m_pRenderer = NULL;

+        m_pDevice->RestoreState();

+        m_ObjectPos = NULL;

+        m_PrevLastPos = NULL;

+        if (pPause && pPause->NeedToPauseNow()) {

+            m_LayerIndex++;

+            return;

+        }

+    }

+    m_Status = Done;

+}

+int CPDF_ProgressiveRenderer::EstimateProgress()

+{

+    if (!m_pContext) {

+        return 0;

+    }

+    FX_DWORD nLayers = m_pContext->m_ContentList.GetSize();

+    int nTotal = 0, nRendered = 0;

+    for (FX_DWORD layer = 0; layer < nLayers; layer ++) {

+        _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(layer);

+        int nObjs = pItem->m_pObjectList->CountObjects();

+        if (layer == m_LayerIndex) {

+            nRendered += m_ObjectIndex;

+        } else if (layer < m_LayerIndex) {

+            nRendered += nObjs;

+        }

+        nTotal += nObjs;

+    }

+    if (nTotal == 0) {

+        return 0;

+    }

+    return 100 * nRendered / nTotal;

+}

+CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj)

+{

+    if (pObj == NULL) {

+        return NULL;

+    }

+    CPDF_CountedObject<CPDF_TransferFunc*>* pTransferCounter;

+    if (!m_TransferFuncMap.Lookup(pObj, pTransferCounter)) {

+        CPDF_TransferFunc* pTransfer = NULL;

+        CPDF_Function* pFuncs[3] = {NULL, NULL, NULL};

+        FX_BOOL bUniTransfer = TRUE;

+        int i;

+        FX_BOOL bIdentity = TRUE;

+        if (pObj->GetType() == PDFOBJ_ARRAY) {

+            bUniTransfer = FALSE;

+            CPDF_Array* pArray = (CPDF_Array*)pObj;

+            if (pArray->GetCount() < 3) {

+                return NULL;

+            }

+            for (FX_DWORD i = 0; i < 3; i ++) {

+                pFuncs[2 - i] = CPDF_Function::Load(pArray->GetElementValue(i));

+                if (pFuncs[2 - i] == NULL) {

+                    return NULL;

+                }

+            }

+        } else {

+            pFuncs[0] = CPDF_Function::Load(pObj);

+            if (pFuncs[0] == NULL) {

+                return NULL;

+            }

+        }

+        pTransfer = FX_NEW CPDF_TransferFunc;

+        pTransfer->m_pPDFDoc = m_pPDFDoc;

+        pTransferCounter = FX_NEW CPDF_CountedObject<CPDF_TransferFunc*>;

+        pTransferCounter->m_nCount = 1;

+        pTransferCounter->m_Obj = pTransfer;

+        m_TransferFuncMap.SetAt(pObj, pTransferCounter);

+        static const int kMaxOutputs = 16;

+        FX_FLOAT output[kMaxOutputs];

+        FXSYS_memset32(output, 0, sizeof(output));

+        FX_FLOAT input;

+        int noutput;

+        for (int v = 0; v < 256; v ++) {

+            input = (FX_FLOAT)v / 255.0f;

+            if (bUniTransfer) {

+                if (pFuncs[0] && pFuncs[0]->CountOutputs() <= kMaxOutputs) {

+                    pFuncs[0]->Call(&input, 1, output, noutput);

+                }

+                int o = FXSYS_round(output[0] * 255);

+                if (o != v) {

+                    bIdentity = FALSE;

+                }

+                for (i = 0; i < 3; i ++) {

+                    pTransfer->m_Samples[i * 256 + v] = o;

+                }

+            } else

+                for (i = 0; i < 3; i ++) {

+                    if (pFuncs[i] && pFuncs[i]->CountOutputs() <= kMaxOutputs) {

+                        pFuncs[i]->Call(&input, 1, output, noutput);

+                        int o = FXSYS_round(output[0] * 255);

+                        if (o != v) {

+                            bIdentity = FALSE;

+                        }

+                        pTransfer->m_Samples[i * 256 + v] = o;

+                    } else {

+                        pTransfer->m_Samples[i * 256 + v] = v;

+                    }

+                }

+        }

+        for (i = 0; i < 3; i ++)

+            if (pFuncs[i]) {

+                delete pFuncs[i];

+            }

+        pTransfer->m_bIdentity = bIdentity;

+    }

+    pTransferCounter->m_nCount++;

+    return pTransferCounter->m_Obj;

+}

+void CPDF_DocRenderData::ReleaseTransferFunc(CPDF_Object* pObj)

+{

+    CPDF_CountedObject<CPDF_TransferFunc*>* pTransferCounter;

+    if (!m_TransferFuncMap.Lookup(pObj, pTransferCounter)) {

+        return;

+    }

+    pTransferCounter->m_nCount--;

+}

+CPDF_RenderConfig::CPDF_RenderConfig()

+{

+    m_HalftoneLimit = 0;

+#ifdef _FPDFAPI_MINI_

+    m_RenderStepLimit = 20;

+#else

+    m_RenderStepLimit = 100;

+#endif

+}

+CPDF_RenderConfig::~CPDF_RenderConfig()

+{

+}

+CPDF_DeviceBuffer::CPDF_DeviceBuffer()

+{

+    m_pBitmap = NULL;

+    m_pDevice = NULL;

+    m_pContext = NULL;

+    m_pObject = NULL;

+}

+CPDF_DeviceBuffer::~CPDF_DeviceBuffer()

+{

+    if (m_pBitmap) {

+        delete m_pBitmap;

+    }

+}

+FX_BOOL CPDF_DeviceBuffer::Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,

+                                      const CPDF_PageObject* pObj, int max_dpi)

+{

+    m_pDevice = pDevice;

+    m_pContext = pContext;

+    m_Rect = *pRect;

+    m_pObject = pObj;

+    m_Matrix.TranslateI(-pRect->left, -pRect->top);

+#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_

+    int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE);

+    int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE);

+    if (horz_size && vert_size && max_dpi) {

+        int dpih = pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10);

+        int dpiv = pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10);

+        if (dpih > max_dpi) {

+            m_Matrix.Scale((FX_FLOAT)(max_dpi) / dpih, 1.0f);

+        }

+        if (dpiv > max_dpi) {

+            m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv);

+        }

+    }

+#ifdef _FPDFAPI_MINI_

+    m_Matrix.Scale(0.5f, 0.5f);

+#endif

+#endif

+    CFX_Matrix ctm = m_pDevice->GetCTM();

+    FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);

+    FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);

+    m_Matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0);

+    CFX_FloatRect rect(*pRect);

+    m_Matrix.TransformRect(rect);

+    FX_RECT bitmap_rect = rect.GetOutterRect();

+    m_pBitmap = FX_NEW CFX_DIBitmap;

+    m_pBitmap->Create(bitmap_rect.Width(), bitmap_rect.Height(), FXDIB_Argb);

+    return TRUE;

+}

+void CPDF_DeviceBuffer::OutputToDevice()

+{

+    if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) {

+        if (m_Matrix.a == 1.0f && m_Matrix.d == 1.0f) {

+            m_pDevice->SetDIBits(m_pBitmap, m_Rect.left, m_Rect.top);

+        } else {

+            m_pDevice->StretchDIBits(m_pBitmap, m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());

+        }

+    } else {

+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)

+        CFX_DIBitmap buffer;

+        m_pDevice->CreateCompatibleBitmap(&buffer, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());

+        m_pContext->GetBackground(&buffer, m_pObject, NULL, &m_Matrix);

+        buffer.CompositeBitmap(0, 0, buffer.GetWidth(), buffer.GetHeight(), m_pBitmap, 0, 0);

+        m_pDevice->StretchDIBits(&buffer, m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());

+#endif

+    }

+}

+CPDF_ScaledRenderBuffer::CPDF_ScaledRenderBuffer()

+{

+    m_pBitmapDevice = NULL;

+}

+CPDF_ScaledRenderBuffer::~CPDF_ScaledRenderBuffer()

+{

+    if (m_pBitmapDevice) {

+        delete m_pBitmapDevice;

+    }

+}

+#ifndef _FPDFAPI_MINI_

+#define _FPDFAPI_IMAGESIZE_LIMIT_	(30 * 1024 * 1024)

+#else

+#define _FPDFAPI_IMAGESIZE_LIMIT_	(10 * 1024 * 1024)

+#endif

+FX_BOOL CPDF_ScaledRenderBuffer::Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,

+        const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions, int max_dpi)

+{

+    FXSYS_assert(pRect != NULL);

+    m_pDevice = pDevice;

+    if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) {

+        return TRUE;

+    }

+    m_pContext = pContext;

+    m_Rect = *pRect;

+    m_pObject = pObj;

+    m_Matrix.TranslateI(-pRect->left, -pRect->top);

+    int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE);

+    int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE);

+    if (horz_size && vert_size && max_dpi) {

+        int dpih = pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10);

+        int dpiv = pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10);

+        if (dpih > max_dpi) {

+            m_Matrix.Scale((FX_FLOAT)(max_dpi) / dpih, 1.0f);

+        }

+        if (dpiv > max_dpi) {

+            m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv);

+        }

+    }

+    m_pBitmapDevice = FX_NEW CFX_FxgeDevice;

+    FXDIB_Format dibFormat = FXDIB_Rgb;

+    FX_INT32 bpp = 24;

+    if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_ALPHA_OUTPUT) {

+        dibFormat = FXDIB_Argb;

+        bpp = 32;

+    }

+    CFX_FloatRect rect;

+    FX_INT32 iWidth, iHeight, iPitch;

+    while (1) {

+        rect = *pRect;

+        m_Matrix.TransformRect(rect);

+        FX_RECT bitmap_rect = rect.GetOutterRect();

+        iWidth = bitmap_rect.Width();

+        iHeight = bitmap_rect.Height();

+        iPitch = (iWidth * bpp + 31) / 32 * 4;

+        if (iWidth * iHeight < 1) {

+            return FALSE;

+        }

+        if (iPitch * iHeight <= _FPDFAPI_IMAGESIZE_LIMIT_ &&

+                m_pBitmapDevice->Create(iWidth, iHeight, dibFormat)) {

+            break;

+        }

+        m_Matrix.Scale(0.5f, 0.5f);

+    }

+#if  !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)

+    m_pContext->GetBackground(m_pBitmapDevice->GetBitmap(), m_pObject, pOptions, &m_Matrix);

+#endif

+    return TRUE;

+}

+void CPDF_ScaledRenderBuffer::OutputToDevice()

+{

+    if (m_pBitmapDevice) {

+        m_pDevice->StretchDIBits(m_pBitmapDevice->GetBitmap(), m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());

+    }

+}

+FX_BOOL IPDF_OCContext::CheckObjectVisible(const CPDF_PageObject* pObj)

+{

+    const CPDF_ContentMarkData* pData = pObj->m_ContentMark;

+    int nItems = pData->CountItems();

+    for (int i = 0; i < nItems; i ++) {

+        CPDF_ContentMarkItem& item = pData->GetItem(i);

+        if (item.GetName() == FX_BSTRC("OC") && item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict) {

+            CPDF_Dictionary* pOCG = (CPDF_Dictionary*)item.GetParam();

+            if (!CheckOCGVisible(pOCG)) {

+                return FALSE;

+            }

+        }

+    }

+    return TRUE;

+}

diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp
new file mode 100644
index 0000000..c5be339
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp
@@ -0,0 +1,389 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_render.h"

+#include "../../../include/fpdfapi/fpdf_pageobj.h"

+#include "../../../include/fxge/fx_ge.h"

+#include "../fpdf_page/pageint.h"

+#include "render_int.h"

+struct CACHEINFO {

+    FX_DWORD time;

+    CPDF_Stream* pStream;

+};

+extern "C" {

+    static int compare(const void* data1, const void* data2)

+    {

+        return ((CACHEINFO*)data1)->time - ((CACHEINFO*)data2)->time;

+    }

+};

+void CPDF_Page::ClearRenderCache()

+{

+    if (m_pPageRender) {

+        m_pPageRender->ClearAll();

+    }

+}

+void CPDF_PageRenderCache::ClearAll()

+{

+    FX_POSITION pos = m_ImageCaches.GetStartPosition();

+    while (pos) {

+        FX_LPVOID key, value;

+        m_ImageCaches.GetNextAssoc(pos, key, value);

+        delete (CPDF_ImageCache*)value;

+    }

+    m_ImageCaches.RemoveAll();

+    m_nCacheSize = 0;

+    m_nTimeCount = 0;

+}

+void CPDF_PageRenderCache::CacheOptimization(FX_INT32 dwLimitCacheSize)

+{

+    if (m_nCacheSize <= (FX_DWORD)dwLimitCacheSize) {

+        return;

+    }

+    int nCount = m_ImageCaches.GetCount();

+    CACHEINFO* pCACHEINFO = (CACHEINFO*)FX_Alloc(FX_BYTE, (sizeof (CACHEINFO)) * nCount);

+    FX_POSITION pos = m_ImageCaches.GetStartPosition();

+    int i = 0;

+    while (pos) {

+        FX_LPVOID key, value;

+        m_ImageCaches.GetNextAssoc(pos, key, value);

+        pCACHEINFO[i].time = ((CPDF_ImageCache*)value)->GetTimeCount();

+        pCACHEINFO[i++].pStream = ((CPDF_ImageCache*)value)->GetStream();

+    }

+    FXSYS_qsort(pCACHEINFO, nCount, sizeof (CACHEINFO), compare);

+    FX_DWORD nTimeCount = m_nTimeCount;

+    if (nTimeCount + 1 < nTimeCount) {

+        for (i = 0; i < nCount; i ++) {

+            ((CPDF_ImageCache*)(m_ImageCaches[pCACHEINFO[i].pStream]))->m_dwTimeCount = i;

+        }

+        m_nTimeCount = nCount;

+    }

+    i = 0;

+    while(nCount > 15) {

+        ClearImageCache(pCACHEINFO[i++].pStream);

+        nCount--;

+    }

+    while (m_nCacheSize > (FX_DWORD)dwLimitCacheSize) {

+        ClearImageCache(pCACHEINFO[i++].pStream);

+    }

+    FX_Free(pCACHEINFO);

+}

+void CPDF_PageRenderCache::ClearImageCache(CPDF_Stream* pStream)

+{

+    FX_LPVOID value = m_ImageCaches.GetValueAt(pStream);

+    if (value == NULL)	{

+        m_ImageCaches.RemoveKey(pStream);

+        return;

+    }

+    m_nCacheSize -= ((CPDF_ImageCache*)value)->EstimateSize();

+    delete (CPDF_ImageCache*)value;

+    m_ImageCaches.RemoveKey(pStream);

+}

+FX_DWORD CPDF_PageRenderCache::EstimateSize()

+{

+    FX_DWORD dwSize = 0;

+    FX_POSITION pos = m_ImageCaches.GetStartPosition();

+    while (pos) {

+        FX_LPVOID key, value;

+        m_ImageCaches.GetNextAssoc(pos, key, value);

+        dwSize += ((CPDF_ImageCache*)value)->EstimateSize();

+    }

+    m_nCacheSize = dwSize;

+    return dwSize;

+}

+FX_DWORD CPDF_PageRenderCache::GetCachedSize(CPDF_Stream* pStream) const

+{

+    if (pStream == NULL) {

+        return m_nCacheSize;

+    }

+    CPDF_ImageCache* pImageCache;

+    if (!m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache)) {

+        return 0;

+    }

+    return pImageCache->EstimateSize();

+}

+void CPDF_PageRenderCache::GetCachedBitmap(CPDF_Stream* pStream, CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor,

+        FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,

+        FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)

+{

+    CPDF_ImageCache* pImageCache;

+    FX_BOOL bFind = m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache);

+    if (!bFind) {

+        pImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);

+    }

+    m_nTimeCount ++;

+    FX_BOOL bCached = pImageCache->GetCachedBitmap(pBitmap, pMask, MatteColor, m_pPage->m_pPageResources, bStdCS, GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);

+    if (!bFind) {

+        m_ImageCaches.SetAt(pStream, pImageCache);

+    }

+    if (!bCached) {

+        m_nCacheSize += pImageCache->EstimateSize();

+    }

+}

+FX_BOOL	CPDF_PageRenderCache::StartGetCachedBitmap(CPDF_Stream* pStream, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)

+{

+    m_bCurFindCache = m_ImageCaches.Lookup(pStream, (FX_LPVOID&)m_pCurImageCache);

+    if (!m_bCurFindCache) {

+        m_pCurImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);

+    }

+    int ret = m_pCurImageCache->StartGetCachedBitmap(pRenderStatus->m_pFormResource, m_pPage->m_pPageResources, bStdCS, GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);

+    if (ret == 2) {

+        return TRUE;

+    }

+    m_nTimeCount ++;

+    if (!m_bCurFindCache) {

+        m_ImageCaches.SetAt(pStream, m_pCurImageCache);

+    }

+    if (!ret) {

+        m_nCacheSize += m_pCurImageCache->EstimateSize();

+    }

+    return FALSE;

+}

+FX_BOOL	CPDF_PageRenderCache::Continue(IFX_Pause* pPause)

+{

+    int ret = m_pCurImageCache->Continue(pPause);

+    if (ret == 2) {

+        return TRUE;

+    }

+    m_nTimeCount ++;

+    if (!m_bCurFindCache) {

+        m_ImageCaches.SetAt(m_pCurImageCache->GetStream(), m_pCurImageCache);

+    }

+    if (!ret) {

+        m_nCacheSize += m_pCurImageCache->EstimateSize();

+    }

+    return FALSE;

+}

+void CPDF_PageRenderCache::ResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap)

+{

+    CPDF_ImageCache* pImageCache;

+    if (!m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache)) {

+        if (pBitmap == NULL) {

+            return;

+        }

+        pImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);

+        m_ImageCaches.SetAt(pStream, pImageCache);

+    }

+    int oldsize = pImageCache->EstimateSize();

+    pImageCache->Reset(pBitmap);

+    m_nCacheSize = pImageCache->EstimateSize() - oldsize;

+}

+CPDF_ImageCache::CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream)

+    : m_pDocument(pDoc)

+    , m_pStream(pStream)

+    , m_pCachedBitmap(NULL)

+    , m_pCachedMask(NULL)

+    , m_dwCacheSize(0)

+    , m_dwTimeCount(0)

+    , m_pCurBitmap(NULL)

+    , m_pCurMask(NULL)

+    , m_MatteColor(0)

+    , m_pRenderStatus(NULL)

+{

+}

+CPDF_ImageCache::~CPDF_ImageCache()

+{

+    if (m_pCachedBitmap) {

+        delete m_pCachedBitmap;

+        m_pCachedBitmap = NULL;

+    }

+    if (m_pCachedMask) {

+        delete m_pCachedMask;

+        m_pCachedMask = NULL;

+    }

+}

+void CPDF_ImageCache::Reset(const CFX_DIBitmap* pBitmap)

+{

+    if (m_pCachedBitmap) {

+        delete m_pCachedBitmap;

+    }

+    m_pCachedBitmap = NULL;

+    if (pBitmap) {

+        m_pCachedBitmap = pBitmap->Clone();

+    }

+    CalcSize();

+}

+void CPDF_PageRenderCache::ClearImageData()

+{

+    FX_POSITION pos = m_ImageCaches.GetStartPosition();

+    while (pos) {

+        FX_LPVOID key, value;

+        m_ImageCaches.GetNextAssoc(pos, key, value);

+        ((CPDF_ImageCache*)value)->ClearImageData();

+    }

+}

+void CPDF_ImageCache::ClearImageData()

+{

+    if (m_pCachedBitmap && m_pCachedBitmap->GetBuffer() == NULL) {

+        ((CPDF_DIBSource*)m_pCachedBitmap)->ClearImageData();

+    }

+}

+static FX_DWORD FPDF_ImageCache_EstimateImageSize(const CFX_DIBSource* pDIB)

+{

+    return pDIB && pDIB->GetBuffer() ? (FX_DWORD)pDIB->GetHeight() * pDIB->GetPitch() + (FX_DWORD)pDIB->GetPaletteSize() * 4 : 0;

+}

+FX_BOOL CPDF_ImageCache::GetCachedBitmap(CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, CPDF_Dictionary* pPageResources,

+        FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,

+        FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)

+{

+    if (m_pCachedBitmap) {

+        pBitmap = m_pCachedBitmap;

+        pMask = m_pCachedMask;

+        MatteColor = m_MatteColor;

+        return TRUE;

+    }

+    if (!pRenderStatus) {

+        return FALSE;

+    }

+    CPDF_RenderContext*pContext = pRenderStatus->GetContext();

+    CPDF_PageRenderCache* pPageRenderCache = pContext->m_pPageCache;

+    m_dwTimeCount = pPageRenderCache->GetTimeCount();

+    CPDF_DIBSource* pSrc = FX_NEW CPDF_DIBSource;

+    CPDF_DIBSource* pMaskSrc = NULL;

+    if (!pSrc->Load(m_pDocument, m_pStream, &pMaskSrc, &MatteColor, pRenderStatus->m_pFormResource, pPageResources, bStdCS, GroupFamily, bLoadMask)) {

+        delete pSrc;

+        pBitmap = NULL;

+        return FALSE;

+    }

+    m_MatteColor = MatteColor;

+#if !defined(_FPDFAPI_MINI_)

+    if (pSrc->GetPitch() * pSrc->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {

+        m_pCachedBitmap = pSrc->Clone();

+        delete pSrc;

+    } else {

+        m_pCachedBitmap = pSrc;

+    }

+    if (pMaskSrc) {

+        m_pCachedMask = pMaskSrc->Clone();

+        delete pMaskSrc;

+    }

+#else

+    if (pSrc->GetFormat() == FXDIB_8bppRgb && pSrc->GetPalette() &&

+            pSrc->GetHeight() * pSrc->GetWidth() * 3 < 1024) {

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+        m_pCachedBitmap = pSrc->CloneConvert(FXDIB_Rgb32);

+#else

+        m_pCachedBitmap = pSrc->CloneConvert(FXDIB_Rgb);

+#endif

+        delete pSrc;

+    } else if (pSrc->GetPitch() * pSrc->GetHeight() < 102400) {

+        m_pCachedBitmap = pSrc->Clone();

+        delete pSrc;

+    } else {

+        m_pCachedBitmap = pSrc;

+    }

+    m_pCachedMask = pMaskSrc;

+#endif

+    pBitmap = m_pCachedBitmap;

+    pMask = m_pCachedMask;

+    CalcSize();

+    return FALSE;

+}

+CFX_DIBSource* CPDF_ImageCache::DetachBitmap()

+{

+    CFX_DIBSource* pDIBSource = m_pCurBitmap;

+    m_pCurBitmap = NULL;

+    return pDIBSource;

+}

+CFX_DIBSource* CPDF_ImageCache::DetachMask()

+{

+    CFX_DIBSource* pDIBSource = m_pCurMask;

+    m_pCurMask = NULL;

+    return pDIBSource;

+}

+int	CPDF_ImageCache::StartGetCachedBitmap(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS,

+        FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,

+        FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)

+{

+    if (m_pCachedBitmap) {

+        m_pCurBitmap = m_pCachedBitmap;

+        m_pCurMask = m_pCachedMask;

+        return 1;

+    }

+    if (!pRenderStatus) {

+        return 0;

+    }

+    m_pRenderStatus = pRenderStatus;

+    m_pCurBitmap = FX_NEW CPDF_DIBSource;

+    int ret = ((CPDF_DIBSource*)m_pCurBitmap)->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResources, pPageResources, bStdCS, GroupFamily, bLoadMask);

+    if (ret == 2) {

+        return ret;

+    }

+    if (!ret) {

+        delete m_pCurBitmap;

+        m_pCurBitmap = NULL;

+        return 0;

+    }

+    ContinueGetCachedBitmap();

+    return 0;

+}

+int CPDF_ImageCache::ContinueGetCachedBitmap()

+{

+    m_MatteColor = ((CPDF_DIBSource*)m_pCurBitmap)->m_MatteColor;

+    m_pCurMask = ((CPDF_DIBSource*)m_pCurBitmap)->DetachMask();

+    CPDF_RenderContext*pContext = m_pRenderStatus->GetContext();

+    CPDF_PageRenderCache* pPageRenderCache = pContext->m_pPageCache;

+    m_dwTimeCount = pPageRenderCache->GetTimeCount();

+#if !defined(_FPDFAPI_MINI_)

+    if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {

+        m_pCachedBitmap = m_pCurBitmap->Clone();

+        delete m_pCurBitmap;

+        m_pCurBitmap = NULL;

+    } else {

+        m_pCachedBitmap = m_pCurBitmap;

+    }

+    if (m_pCurMask) {

+        m_pCachedMask = m_pCurMask->Clone();

+        delete m_pCurMask;

+        m_pCurMask = NULL;

+    }

+#else

+    if (m_pCurBitmap->GetFormat() == FXDIB_8bppRgb && m_pCurBitmap->GetPalette() &&

+            m_pCurBitmap->GetHeight() * m_pCurBitmap->GetWidth() * 3 < 1024) {

+        m_pCachedBitmap = m_pCurBitmap->CloneConvert(FXDIB_Rgb32);

+        m_pCachedBitmap = m_pCurBitmap->CloneConvert(FXDIB_Rgb);

+        delete m_pCurBitmap;

+        m_pCurBitmap = NULL;

+    } else if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < 102400) {

+        m_pCachedBitmap = m_pCurBitmap->Clone();

+        delete m_pCurBitmap;

+        m_pCurBitmap = NULL;

+    } else {

+        m_pCachedBitmap = m_pCurBitmap;

+    }

+    m_pCachedMask = m_pCurMask;

+#endif

+    m_pCurBitmap = m_pCachedBitmap;

+    m_pCurMask = m_pCachedMask;

+    CalcSize();

+    return 0;

+}

+int	CPDF_ImageCache::Continue(IFX_Pause* pPause)

+{

+    int ret = ((CPDF_DIBSource*)m_pCurBitmap)->ContinueLoadDIBSource(pPause);

+    if (ret == 2) {

+        return ret;

+    }

+    if (!ret) {

+        delete m_pCurBitmap;

+        m_pCurBitmap = NULL;

+        return 0;

+    }

+    ContinueGetCachedBitmap();

+    return 0;

+}

+void CPDF_ImageCache::CalcSize()

+{

+    m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap) + FPDF_ImageCache_EstimateImageSize(m_pCachedMask);

+}

+void CPDF_Document::ClearRenderFont()

+{

+    if (m_pDocRender) {

+        CFX_FontCache* pCache = m_pDocRender->GetFontCache();

+        if (pCache) {

+            pCache->FreeCache(FALSE);

+        }

+    }

+}

diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
new file mode 100644
index 0000000..c2a7393
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
@@ -0,0 +1,1165 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fpdfapi/fpdf_render.h"

+#include "../../../include/fpdfapi/fpdf_pageobj.h"

+#include "../fpdf_page/pageint.h"

+#include "render_int.h"

+FX_BOOL CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device)

+{

+    CPDF_ImageRenderer render;

+    if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) {

+        render.Continue(NULL);

+    }

+#ifdef _FPDFAPI_MINI_

+    if (m_DitherBits) {

+        DitherObjectArea(pImageObj, pObj2Device);

+    }

+#endif

+    return render.m_Result;

+}

+#if defined(_FPDFAPI_MINI_)

+FX_BOOL CPDF_RenderStatus::ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device)

+{

+    int bitmap_alpha = 255;

+    if (!pInlines->m_GeneralState.IsNull()) {

+        bitmap_alpha = FXSYS_round(pInlines->m_GeneralState.GetObject()->m_FillAlpha * 255);

+    }

+    if (pInlines->m_pStream) {

+        CPDF_DIBSource dibsrc;

+        if (!dibsrc.Load(m_pContext->m_pDocument, pInlines->m_pStream, NULL, NULL, NULL, NULL)) {

+            return TRUE;

+        }

+        pInlines->m_pBitmap = dibsrc.Clone();

+        pInlines->m_pStream->Release();

+        pInlines->m_pStream = NULL;

+    }

+    if (pInlines->m_pBitmap == NULL) {

+        return TRUE;

+    }

+    FX_ARGB fill_argb = 0;

+    if (pInlines->m_pBitmap->IsAlphaMask()) {

+        fill_argb = GetFillArgb(pInlines);

+    }

+    int flags = 0;

+    if (m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) {

+        flags |= RENDER_FORCE_DOWNSAMPLE;

+    } else if (m_Options.m_Flags & RENDER_FORCE_HALFTONE) {

+        flags = 0;

+    }

+    for (int i = 0; i < pInlines->m_Matrices.GetSize(); i ++) {

+        CFX_AffineMatrix image_matrix = pInlines->m_Matrices.GetAt(i);

+        image_matrix.Concat(*pObj2Device);

+        CPDF_ImageRenderer renderer;

+        if (renderer.Start(this, pInlines->m_pBitmap, fill_argb, bitmap_alpha, &image_matrix, flags, FALSE, m_curBlend)) {

+            renderer.Continue(NULL);

+        }

+    }

+    return TRUE;

+}

+#endif

+void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,

+        int bitmap_alpha, int blend_mode, int Transparency)

+{

+    if (pDIBitmap == NULL) {

+        return;

+    }

+    FX_BOOL bIsolated = Transparency & PDFTRANS_ISOLATED;

+    FX_BOOL bGroup = Transparency & PDFTRANS_GROUP;

+    if (blend_mode == FXDIB_BLEND_NORMAL) {

+        if (!pDIBitmap->IsAlphaMask()) {

+            if (bitmap_alpha < 255) {

+                pDIBitmap->MultiplyAlpha(bitmap_alpha);

+            }

+            if (m_pDevice->SetDIBits(pDIBitmap, left, top)) {

+                return;

+            }

+        } else {

+            FX_DWORD fill_argb = m_Options.TranslateColor(mask_argb);

+            if (bitmap_alpha < 255) {

+                ((FX_BYTE*)&fill_argb)[3] = ((FX_BYTE*)&fill_argb)[3] * bitmap_alpha / 255;

+            }

+            if (m_pDevice->SetBitMask(pDIBitmap, left, top, fill_argb)) {

+                return;

+            }

+        }

+    }

+    FX_BOOL bBackAlphaRequired = blend_mode && bIsolated && !m_bDropObjects;

+    FX_BOOL bGetBackGround = ((m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT)) ||

+                             (!(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT) && (m_pDevice->GetRenderCaps()

+                                     & FXRC_GET_BITS) && !bBackAlphaRequired);

+    if (bGetBackGround) {

+        if (bIsolated || !bGroup) {

+            if (pDIBitmap->IsAlphaMask()) {

+                return;

+            }

+            m_pDevice->SetDIBits(pDIBitmap, left, top, blend_mode);

+        } else {

+            FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), top + pDIBitmap->GetHeight());

+            rect.Intersect(m_pDevice->GetClipBox());

+            CFX_DIBitmap* pClone = NULL;

+            FX_BOOL bClone = FALSE;

+            if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) {

+                bClone = TRUE;

+                pClone = m_pDevice->GetBackDrop()->Clone(&rect);

+                CFX_DIBitmap *pForeBitmap = m_pDevice->GetBitmap();

+                pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), pForeBitmap, rect.left, rect.top);

+                left = left >= 0 ? 0 : left;

+                top = top >= 0 ? 0 : top;

+                if (!pDIBitmap->IsAlphaMask())

+                    pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), pDIBitmap,

+                                            left, top, blend_mode);

+                else

+                    pClone->CompositeMask(0, 0, pClone->GetWidth(), pClone->GetHeight(), pDIBitmap,

+                                          mask_argb, left, top, blend_mode);

+            } else {

+                pClone = pDIBitmap;

+            }

+            if (m_pDevice->GetBackDrop()) {

+                m_pDevice->SetDIBits(pClone, rect.left, rect.top);

+            } else {

+                if (pDIBitmap->IsAlphaMask()) {

+                    return;

+                }

+                m_pDevice->SetDIBits(pDIBitmap, rect.left, rect.top, blend_mode);

+            }

+            if (bClone) {

+                delete pClone;

+            }

+        }

+        return;

+    }

+    int back_left, back_top;

+    FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), top + pDIBitmap->GetHeight());

+    CFX_DIBitmap* pBackdrop = GetBackdrop(m_pCurObj, rect, back_left, back_top, blend_mode > FXDIB_BLEND_NORMAL && bIsolated);

+    if (!pBackdrop) {

+        return;

+    }

+    if (!pDIBitmap->IsAlphaMask())

+        pBackdrop->CompositeBitmap(left - back_left, top - back_top, pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), pDIBitmap,

+                                   0, 0, blend_mode);

+    else

+        pBackdrop->CompositeMask(left - back_left, top - back_top, pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), pDIBitmap,

+                                 mask_argb, 0, 0, blend_mode);

+    CFX_DIBitmap* pBackdrop1 = FX_NEW CFX_DIBitmap;

+    pBackdrop1->Create(pBackdrop->GetWidth(), pBackdrop->GetHeight(), FXDIB_Rgb32);

+    pBackdrop1->Clear((FX_DWORD) - 1);

+    pBackdrop1->CompositeBitmap(0, 0, pBackdrop->GetWidth(), pBackdrop->GetHeight(), pBackdrop, 0, 0);

+    delete pBackdrop;

+    pBackdrop = pBackdrop1;

+    m_pDevice->SetDIBits(pBackdrop, back_left, back_top);

+    delete pBackdrop;

+}

+FX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF rgb)

+{

+    return FXSYS_RGB(m_Samples[FXSYS_GetRValue(rgb)], m_Samples[256 + FXSYS_GetGValue(rgb)],

+                     m_Samples[512 + FXSYS_GetBValue(rgb)]);

+}

+CFX_DIBSource* CPDF_TransferFunc::TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc)

+{

+    CPDF_DIBTransferFunc* pDest = FX_NEW CPDF_DIBTransferFunc(this);

+    pDest->LoadSrc(pSrc, bAutoDropSrc);

+    return pDest;

+}

+FXDIB_Format CPDF_DIBTransferFunc::GetDestFormat()

+{

+    if (m_pSrc->IsAlphaMask()) {

+        return FXDIB_8bppMask;

+    }

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+    return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb32;

+#else

+    return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb;

+#endif

+}

+CPDF_DIBTransferFunc::CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc)

+{

+    m_RampR = pTransferFunc->m_Samples;

+    m_RampG = &pTransferFunc->m_Samples[256];

+    m_RampB = &pTransferFunc->m_Samples[512];

+}

+void CPDF_DIBTransferFunc::TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const

+{

+    int i;

+    FX_BOOL bSkip = FALSE;

+    switch (m_pSrc->GetFormat()) {

+        case FXDIB_1bppRgb: {

+                int r0 = m_RampR[0], g0 = m_RampG[0], b0 = m_RampB[0];

+                int r1 = m_RampR[255], g1 = m_RampG[255], b1 = m_RampB[255];

+                for (i = 0; i < m_Width; i ++) {

+                    if (src_buf[i / 8] & (1 << (7 - i % 8))) {

+                        *dest_buf++ = b1;

+                        *dest_buf++ = g1;

+                        *dest_buf++ = r1;

+                    } else {

+                        *dest_buf++ = b0;

+                        *dest_buf++ = g0;

+                        *dest_buf++ = r0;

+                    }

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+                    dest_buf++;

+#endif

+                }

+                break;

+            }

+        case FXDIB_1bppMask: {

+                int m0 = m_RampR[0], m1 = m_RampR[255];

+                for (i = 0; i < m_Width; i ++) {

+                    if (src_buf[i / 8] & (1 << (7 - i % 8))) {

+                        *dest_buf++ = m1;

+                    } else {

+                        *dest_buf++ = m0;

+                    }

+                }

+                break;

+            }

+        case FXDIB_8bppRgb: {

+                FX_ARGB* pPal = m_pSrc->GetPalette();

+                for (i = 0; i < m_Width; i ++) {

+                    if (pPal) {

+                        FX_ARGB src_argb = pPal[*src_buf];

+                        *dest_buf++ = m_RampB[FXARGB_R(src_argb)];

+                        *dest_buf++ = m_RampG[FXARGB_G(src_argb)];

+                        *dest_buf++ = m_RampR[FXARGB_B(src_argb)];

+                    } else {

+                        FX_DWORD src_byte = *src_buf;

+                        *dest_buf++ = m_RampB[src_byte];

+                        *dest_buf++ = m_RampG[src_byte];

+                        *dest_buf++ = m_RampR[src_byte];

+                    }

+                    src_buf ++;

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+                    dest_buf++;

+#endif

+                }

+                break;

+            }

+        case FXDIB_8bppMask:

+            for (i = 0; i < m_Width; i ++) {

+                *dest_buf++ = m_RampR[*(src_buf++)];

+            }

+            break;

+        case FXDIB_Rgb:

+            for (i = 0; i < m_Width; i ++) {

+                *dest_buf++ = m_RampB[*(src_buf++)];

+                *dest_buf++ = m_RampG[*(src_buf++)];

+                *dest_buf++ = m_RampR[*(src_buf++)];

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+                dest_buf++;

+#endif

+            }

+            break;

+        case FXDIB_Rgb32:

+            bSkip = TRUE;

+        case FXDIB_Argb:

+            for (i = 0; i < m_Width; i ++) {

+                *dest_buf++ = m_RampB[*(src_buf++)];

+                *dest_buf++ = m_RampG[*(src_buf++)];

+                *dest_buf++ = m_RampR[*(src_buf++)];

+                if (!bSkip) {

+                    *dest_buf++ = *src_buf;

+                }

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+                else {

+                    dest_buf++;

+                }

+#endif

+                src_buf ++;

+            }

+            break;

+        default:

+            break;

+    }

+}

+void CPDF_DIBTransferFunc::TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const

+{

+    if (Bpp == 8) {

+        for (int i = 0; i < pixels; i ++) {

+            *dest_buf++ = m_RampR[*(src_buf++)];

+        }

+    } else if (Bpp == 24) {

+        for (int i = 0; i < pixels; i ++) {

+            *dest_buf++ = m_RampB[*(src_buf++)];

+            *dest_buf++ = m_RampG[*(src_buf++)];

+            *dest_buf++ = m_RampR[*(src_buf++)];

+        }

+    } else {

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+        if (!m_pSrc->HasAlpha()) {

+            for (int i = 0; i < pixels; i ++) {

+                *dest_buf++ = m_RampB[*(src_buf++)];

+                *dest_buf++ = m_RampG[*(src_buf++)];

+                *dest_buf++ = m_RampR[*(src_buf++)];

+                dest_buf++;

+                src_buf++;

+            }

+        } else

+#endif

+            for (int i = 0; i < pixels; i ++) {

+                *dest_buf++ = m_RampB[*(src_buf++)];

+                *dest_buf++ = m_RampG[*(src_buf++)];

+                *dest_buf++ = m_RampR[*(src_buf++)];

+                *dest_buf++ = *(src_buf++);

+            }

+    }

+}

+static FX_BOOL _IsSupported(CPDF_ColorSpace* pCS)

+{

+    if (pCS->GetFamily() == PDFCS_DEVICERGB || pCS->GetFamily() == PDFCS_DEVICEGRAY ||

+            pCS->GetFamily() == PDFCS_DEVICECMYK || pCS->GetFamily() == PDFCS_CALGRAY ||

+            pCS->GetFamily() == PDFCS_CALRGB) {

+        return TRUE;

+    }

+    if (pCS->GetFamily() == PDFCS_INDEXED && _IsSupported(pCS->GetBaseCS())) {

+        return TRUE;

+    }

+    return FALSE;

+}

+CPDF_ImageRenderer::CPDF_ImageRenderer()

+{

+    m_pRenderStatus = NULL;

+    m_pImageObject = NULL;

+    m_Result = TRUE;

+    m_Status = 0;

+    m_pQuickStretcher = NULL;

+    m_pTransformer = NULL;

+    m_DeviceHandle = NULL;

+    m_LoadHandle = NULL;

+    m_pClone = NULL;

+    m_bStdCS = FALSE;

+    m_bPatternColor = FALSE;

+    m_BlendType = FXDIB_BLEND_NORMAL;

+    m_pPattern = NULL;

+    m_pObj2Device = NULL;

+}

+CPDF_ImageRenderer::~CPDF_ImageRenderer()

+{

+    if (m_pQuickStretcher) {

+        delete m_pQuickStretcher;

+    }

+    if (m_pTransformer) {

+        delete m_pTransformer;

+    }

+    if (m_DeviceHandle) {

+        m_pRenderStatus->m_pDevice->CancelDIBits(m_DeviceHandle);

+    }

+    if (m_LoadHandle) {

+        delete (CPDF_ProgressiveImageLoaderHandle*)m_LoadHandle;

+    }

+    if (m_pClone) {

+        delete m_pClone;

+    }

+}

+FX_BOOL CPDF_ImageRenderer::StartLoadDIBSource()

+{

+    CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();

+    FX_RECT image_rect = image_rect_f.GetOutterRect();

+    int dest_width = image_rect.Width();

+    int dest_height = image_rect.Height();

+    if (m_ImageMatrix.a < 0) {

+        dest_width = -dest_width;

+    }

+    if (m_ImageMatrix.d > 0) {

+        dest_height = -dest_height;

+    }

+    if (m_Loader.StartLoadImage(m_pImageObject, m_pRenderStatus->m_pContext->m_pPageCache, m_LoadHandle, m_bStdCS,

+                                m_pRenderStatus->m_GroupFamily, m_pRenderStatus->m_bLoadMask, m_pRenderStatus, dest_width, dest_height)) {

+        if (m_LoadHandle != NULL) {

+            m_Status = 4;

+            return TRUE;

+        }

+        return FALSE;

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_ImageRenderer::StartRenderDIBSource()

+{

+    if (m_Loader.m_pBitmap == NULL) {

+        return FALSE;

+    }

+    m_BitmapAlpha = 255;

+    const CPDF_GeneralStateData* pGeneralState = m_pImageObject->m_GeneralState;

+    if (pGeneralState) {

+        m_BitmapAlpha = FXSYS_round(pGeneralState->m_FillAlpha * 255);

+    }

+    m_pDIBSource = m_Loader.m_pBitmap;

+    if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && m_Loader.m_pMask == NULL) {

+        return StartBitmapAlpha();

+    }

+#ifndef _FPDFAPI_MINI_

+    if (pGeneralState && pGeneralState->m_pTR) {

+        if (!pGeneralState->m_pTransferFunc) {

+            ((CPDF_GeneralStateData*)pGeneralState)->m_pTransferFunc = m_pRenderStatus->GetTransferFunc(pGeneralState->m_pTR);

+        }

+        if (pGeneralState->m_pTransferFunc && !pGeneralState->m_pTransferFunc->m_bIdentity) {

+            m_pDIBSource = m_Loader.m_pBitmap = pGeneralState->m_pTransferFunc->TranslateImage(m_Loader.m_pBitmap, !m_Loader.m_bCached);

+            if (m_Loader.m_bCached && m_Loader.m_pMask) {

+                m_Loader.m_pMask = m_Loader.m_pMask->Clone();

+            }

+            m_Loader.m_bCached = FALSE;

+        }

+    }

+#endif

+    m_FillArgb = 0;

+    m_bPatternColor = FALSE;

+    m_pPattern = NULL;

+    if (m_pDIBSource->IsAlphaMask()) {

+        CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor();

+        if (pColor && pColor->IsPattern()) {

+            m_pPattern = pColor->GetPattern();

+            if (m_pPattern != NULL) {

+                m_bPatternColor = TRUE;

+            }

+        }

+        m_FillArgb = m_pRenderStatus->GetFillArgb(m_pImageObject);

+    } else if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_GRAY) {

+        m_pClone = m_pDIBSource->Clone();

+        m_pClone->ConvertColorScale(m_pRenderStatus->m_Options.m_BackColor, m_pRenderStatus->m_Options.m_ForeColor);

+        m_pDIBSource = m_pClone;

+    }

+    m_Flags = 0;

+#if !defined(_FPDFAPI_MINI_)

+    if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) {

+        m_Flags |= RENDER_FORCE_DOWNSAMPLE;

+    } else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) {

+        m_Flags |= RENDER_FORCE_HALFTONE;

+    }

+#else

+    if (!(m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE)) {

+        if (m_pRenderStatus->m_HalftoneLimit) {

+            CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();

+            FX_RECT image_rect = image_rect_f.GetOutterRect();

+            FX_RECT image_clip = image_rect;

+            image_rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());

+            if (image_rect.Width() && image_rect.Height()) {

+                if ((image_clip.Width() * m_pDIBSource->GetWidth() / image_rect.Width()) *

+                        (image_clip.Height() * m_pDIBSource->GetHeight() / image_rect.Height()) >

+                        m_pRenderStatus->m_HalftoneLimit) {

+                    m_Flags |= RENDER_FORCE_DOWNSAMPLE;

+                }

+            }

+        } else {

+            m_Flags |= RENDER_FORCE_DOWNSAMPLE;

+        }

+    }

+#endif

+#ifndef _FPDFAPI_MINI_

+    if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) {

+        CPDF_Object* pFilters = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("Filter"));

+        if (pFilters) {

+            if (pFilters->GetType() == PDFOBJ_NAME) {

+                CFX_ByteStringC bsDecodeType = pFilters->GetConstString();

+                if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_BSTRC("JPXDecode")) {

+                    m_Flags |= FXRENDER_IMAGE_LOSSY;

+                }

+            } else if (pFilters->GetType() == PDFOBJ_ARRAY) {

+                CPDF_Array* pArray = (CPDF_Array*)pFilters;

+                for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {

+                    CFX_ByteStringC bsDecodeType = pArray->GetConstString(i);

+                    if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_BSTRC("JPXDecode")) {

+                        m_Flags |= FXRENDER_IMAGE_LOSSY;

+                        break;

+                    }

+                }

+            }

+        }

+    }

+    if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) {

+        m_Flags |= FXDIB_NOSMOOTH;

+    } else if (m_pImageObject->m_pImage->IsInterpol()) {

+        m_Flags |= FXDIB_INTERPOL;

+    }

+#endif

+    if (m_Loader.m_pMask) {

+        return DrawMaskedImage();

+    }

+    if (m_bPatternColor) {

+        return DrawPatternImage(m_pObj2Device);

+    }

+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)

+    if (m_BitmapAlpha == 255 && pGeneralState && pGeneralState->m_FillOP &&

+            pGeneralState->m_OPMode == 0 && pGeneralState->m_BlendType == FXDIB_BLEND_NORMAL && pGeneralState->m_StrokeAlpha == 1 && pGeneralState->m_FillAlpha == 1) {

+        CPDF_Document* pDocument = NULL;

+        CPDF_Page* pPage = NULL;

+        if (m_pRenderStatus->m_pContext->m_pPageCache) {

+            pPage = m_pRenderStatus->m_pContext->m_pPageCache->GetPage();

+            pDocument = pPage->m_pDocument;

+        } else {

+            pDocument = m_pImageObject->m_pImage->GetDocument();

+        }

+        CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL;

+        CPDF_Object* pCSObj = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("ColorSpace"));

+        CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources);

+        if (pColorSpace) {

+            int format = pColorSpace->GetFamily();

+            if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) {

+                m_BlendType = FXDIB_BLEND_DARKEN;

+            }

+            pDocument->GetPageData()->ReleaseColorSpace(pCSObj);

+        }

+    }

+#endif

+    return StartDIBSource();

+}

+FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType)

+{

+    m_pRenderStatus = pStatus;

+    m_bStdCS = bStdCS;

+    m_pImageObject = (CPDF_ImageObject*)pObj;

+    m_BlendType = blendType;

+    m_pObj2Device = pObj2Device;

+#ifndef _FPDFAPI_MINI_

+    CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC();

+    if (pOC && m_pRenderStatus->m_Options.m_pOCContext && !m_pRenderStatus->m_Options.m_pOCContext->CheckOCGVisible(pOC)) {

+        return FALSE;

+    }

+#endif

+    m_ImageMatrix = m_pImageObject->m_Matrix;

+    m_ImageMatrix.Concat(*pObj2Device);

+    if (StartLoadDIBSource()) {

+        return TRUE;

+    }

+    return StartRenderDIBSource();

+}

+FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb,

+                                  int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType)

+{

+    m_pRenderStatus = pStatus;

+    m_pDIBSource = pDIBSource;

+    m_FillArgb = bitmap_argb;

+    m_BitmapAlpha = bitmap_alpha;

+    m_ImageMatrix = *pImage2Device;

+    m_Flags = flags;

+    m_bStdCS = bStdCS;

+    m_BlendType = blendType;

+    return StartDIBSource();

+}

+FX_BOOL	CPDF_ImageRenderer::DrawPatternImage(const CFX_Matrix* pObj2Device)

+{

+    if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {

+        m_Result = FALSE;

+        return FALSE;

+    }

+    FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect();

+    rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());

+    if (rect.IsEmpty()) {

+        return FALSE;

+    }

+    CFX_AffineMatrix new_matrix = m_ImageMatrix;

+    new_matrix.TranslateI(-rect.left, -rect.top);

+    int width = rect.Width();

+    int height = rect.Height();

+    CFX_FxgeDevice bitmap_device1;

+    if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32)) {

+        return TRUE;

+    }

+    bitmap_device1.GetBitmap()->Clear(0xffffff);

+    {

+        CPDF_RenderStatus bitmap_render;

+        bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device1, NULL, NULL,

+                                 NULL, NULL, &m_pRenderStatus->m_Options, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);

+        CFX_Matrix patternDevice = *pObj2Device;

+        patternDevice.Translate((FX_FLOAT) - rect.left, (FX_FLOAT) - rect.top);

+        if(m_pPattern->m_PatternType == PATTERN_TILING) {

+            bitmap_render.DrawTilingPattern((CPDF_TilingPattern*)m_pPattern, m_pImageObject, &patternDevice, FALSE);

+        } else {

+            bitmap_render.DrawShadingPattern((CPDF_ShadingPattern*)m_pPattern, m_pImageObject, &patternDevice, FALSE);

+        }

+    }

+    {

+        CFX_FxgeDevice bitmap_device2;

+        if (!bitmap_device2.Create(rect.Width(), rect.Height(), FXDIB_8bppRgb)) {

+            return TRUE;

+        }

+        bitmap_device2.GetBitmap()->Clear(0);

+        CPDF_RenderStatus bitmap_render;

+        bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device2, NULL, NULL,

+                                 NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);

+        CPDF_ImageRenderer image_render;

+        if (image_render.Start(&bitmap_render, m_pDIBSource, 0xffffffff, 255, &new_matrix, m_Flags, TRUE)) {

+            image_render.Continue(NULL);

+        }

+        if (m_Loader.m_MatteColor != 0xffffffff) {

+            int matte_r = FXARGB_R(m_Loader.m_MatteColor);

+            int matte_g = FXARGB_G(m_Loader.m_MatteColor);

+            int matte_b = FXARGB_B(m_Loader.m_MatteColor);

+            for (int row = 0; row < height; row ++) {

+                FX_LPBYTE dest_scan = (FX_LPBYTE)bitmap_device1.GetBitmap()->GetScanline(row);

+                FX_LPCBYTE mask_scan = bitmap_device2.GetBitmap()->GetScanline(row);

+                for (int col = 0; col < width; col ++) {

+                    int alpha = *mask_scan ++;

+                    if (alpha) {

+                        int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b;

+                        if (orig < 0) {

+                            orig = 0;

+                        } else if (orig > 255) {

+                            orig = 255;

+                        }

+                        *dest_scan++ = orig;

+                        orig = (*dest_scan - matte_g) * 255 / alpha + matte_g;

+                        if (orig < 0) {

+                            orig = 0;

+                        } else if (orig > 255) {

+                            orig = 255;

+                        }

+                        *dest_scan++ = orig;

+                        orig = (*dest_scan - matte_r) * 255 / alpha + matte_r;

+                        if (orig < 0) {

+                            orig = 0;

+                        } else if (orig > 255) {

+                            orig = 255;

+                        }

+                        *dest_scan++ = orig;

+                        dest_scan ++;

+                    } else {

+                        dest_scan += 4;

+                    }

+                }

+            }

+        }

+        bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);

+        bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());

+        bitmap_device1.GetBitmap()->MultiplyAlpha(255);

+    }

+    m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);

+    return FALSE;

+}

+FX_BOOL CPDF_ImageRenderer::DrawMaskedImage()

+{

+    if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {

+        m_Result = FALSE;

+        return FALSE;

+    }

+    FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect();

+    rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());

+    if (rect.IsEmpty()) {

+        return FALSE;

+    }

+    CFX_AffineMatrix new_matrix = m_ImageMatrix;

+    new_matrix.TranslateI(-rect.left, -rect.top);

+    int width = rect.Width();

+    int height = rect.Height();

+    CFX_FxgeDevice bitmap_device1;

+    if (!bitmap_device1.Create(width, height, FXDIB_Rgb32)) {

+        return TRUE;

+    }

+    bitmap_device1.GetBitmap()->Clear(0xffffff);

+    {

+        CPDF_RenderStatus bitmap_render;

+        bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device1, NULL, NULL,

+                                 NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);

+        CPDF_ImageRenderer image_render;

+        if (image_render.Start(&bitmap_render, m_pDIBSource, 0, 255, &new_matrix, m_Flags, TRUE)) {

+            image_render.Continue(NULL);

+        }

+    }

+    {

+        CFX_FxgeDevice bitmap_device2;

+        if (!bitmap_device2.Create(width, height, FXDIB_8bppRgb)) {

+            return TRUE;

+        }

+        bitmap_device2.GetBitmap()->Clear(0);

+        CPDF_RenderStatus bitmap_render;

+        bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device2, NULL, NULL,

+                                 NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);

+        CPDF_ImageRenderer image_render;

+        if (image_render.Start(&bitmap_render, m_Loader.m_pMask, 0xffffffff, 255, &new_matrix, m_Flags, TRUE)) {

+            image_render.Continue(NULL);

+        }

+        if (m_Loader.m_MatteColor != 0xffffffff) {

+            int matte_r = FXARGB_R(m_Loader.m_MatteColor);

+            int matte_g = FXARGB_G(m_Loader.m_MatteColor);

+            int matte_b = FXARGB_B(m_Loader.m_MatteColor);

+            for (int row = 0; row < height; row ++) {

+                FX_LPBYTE dest_scan = (FX_LPBYTE)bitmap_device1.GetBitmap()->GetScanline(row);

+                FX_LPCBYTE mask_scan = bitmap_device2.GetBitmap()->GetScanline(row);

+                for (int col = 0; col < width; col ++) {

+                    int alpha = *mask_scan ++;

+                    if (alpha) {

+                        int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b;

+                        if (orig < 0) {

+                            orig = 0;

+                        } else if (orig > 255) {

+                            orig = 255;

+                        }

+                        *dest_scan++ = orig;

+                        orig = (*dest_scan - matte_g) * 255 / alpha + matte_g;

+                        if (orig < 0) {

+                            orig = 0;

+                        } else if (orig > 255) {

+                            orig = 255;

+                        }

+                        *dest_scan++ = orig;

+                        orig = (*dest_scan - matte_r) * 255 / alpha + matte_r;

+                        if (orig < 0) {

+                            orig = 0;

+                        } else if (orig > 255) {

+                            orig = 255;

+                        }

+                        *dest_scan++ = orig;

+                        dest_scan ++;

+                    } else {

+                        dest_scan += 4;

+                    }

+                }

+            }

+        }

+        bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);

+        bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());

+        if (m_BitmapAlpha < 255) {

+            bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha);

+        }

+    }

+    m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);

+    return FALSE;

+}

+FX_BOOL CPDF_ImageRenderer::StartDIBSource()

+{

+#if !defined(_FPDFAPI_MINI_)

+    if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) {

+        int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() * m_pDIBSource->GetHeight();

+        if (image_size > FPDF_HUGE_IMAGE_SIZE && !(m_Flags & RENDER_FORCE_HALFTONE)) {

+            m_Flags |= RENDER_FORCE_DOWNSAMPLE;

+        }

+    }

+#endif

+    if (m_pRenderStatus->m_pDevice->StartDIBits(m_pDIBSource, m_BitmapAlpha, m_FillArgb,

+            &m_ImageMatrix, m_Flags, m_DeviceHandle, 0, NULL, m_BlendType)) {

+        if (m_DeviceHandle != NULL) {

+            m_Status = 3;

+            return TRUE;

+        }

+        return FALSE;

+    }

+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)

+    CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();

+    FX_RECT image_rect = image_rect_f.GetOutterRect();

+    int dest_width = image_rect.Width();

+    int dest_height = image_rect.Height();

+    if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) ||

+            (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0) ) {

+        if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {

+            m_Result = FALSE;

+            return FALSE;

+        }

+        FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();

+        clip_box.Intersect(image_rect);

+        m_Status = 2;

+        m_pTransformer = FX_NEW CFX_ImageTransformer;

+        m_pTransformer->Start(m_pDIBSource, &m_ImageMatrix, m_Flags, &clip_box);

+        return TRUE;

+    }

+    if (m_ImageMatrix.a < 0) {

+        dest_width = -dest_width;

+    }

+    if (m_ImageMatrix.d > 0) {

+        dest_height = -dest_height;

+    }

+    int dest_left, dest_top;

+    dest_left = dest_width > 0 ? image_rect.left : image_rect.right;

+    dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom;

+    if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) {

+        if (m_pRenderStatus->m_pDevice->StretchDIBits(m_pDIBSource, dest_left, dest_top,

+                dest_width, dest_height, m_Flags, NULL, m_BlendType)) {

+            return FALSE;

+        }

+    }

+    if (m_pDIBSource->IsAlphaMask()) {

+        if (m_BitmapAlpha != 255) {

+            m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);

+        }

+        if (m_pRenderStatus->m_pDevice->StretchBitMask(m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_FillArgb, m_Flags)) {

+            return FALSE;

+        }

+    }

+    if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {

+        m_Result = FALSE;

+        return TRUE;

+    }

+    FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();

+    FX_RECT dest_rect = clip_box;

+    dest_rect.Intersect(image_rect);

+    FX_RECT dest_clip(dest_rect.left - image_rect.left, dest_rect.top - image_rect.top,

+                      dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top);

+    CFX_DIBitmap* pStretched = m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip);

+    if (pStretched) {

+        m_pRenderStatus->CompositeDIBitmap(pStretched, dest_rect.left, dest_rect.top, m_FillArgb,

+                                           m_BitmapAlpha, m_BlendType, FALSE);

+        delete pStretched;

+        pStretched = NULL;

+    }

+#endif

+    return FALSE;

+}

+FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha()

+{

+#ifndef _FPDFAPI_MINI_

+    if (m_pDIBSource->IsOpaqueImage()) {

+        CFX_PathData path;

+        path.AppendRect(0, 0, 1, 1);

+        path.Transform(&m_ImageMatrix);

+        FX_DWORD fill_color = ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha);

+        m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0, FXFILL_WINDING);

+    } else {

+        const CFX_DIBSource* pAlphaMask = m_pDIBSource->IsAlphaMask() ? m_pDIBSource : m_pDIBSource->GetAlphaMask();

+        if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || FXSYS_fabs(m_ImageMatrix.c) >= 0.5f) {

+            int left, top;

+            CFX_DIBitmap* pTransformed = pAlphaMask->TransformTo(&m_ImageMatrix, left, top);

+            if (pTransformed == NULL) {

+                return TRUE;

+            }

+            m_pRenderStatus->m_pDevice->SetBitMask(pTransformed, left, top, ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));

+            delete pTransformed;

+        } else {

+            CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();

+            FX_RECT image_rect = image_rect_f.GetOutterRect();

+            int dest_width = m_ImageMatrix.a > 0 ? image_rect.Width() : -image_rect.Width();

+            int dest_height = m_ImageMatrix.d > 0 ? -image_rect.Height() : image_rect.Height();

+            int left = dest_width > 0 ? image_rect.left : image_rect.right;

+            int top = dest_height > 0 ? image_rect.top : image_rect.bottom;

+            m_pRenderStatus->m_pDevice->StretchBitMask(pAlphaMask, left, top, dest_width, dest_height,

+                    ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));

+        }

+        if (m_pDIBSource != pAlphaMask) {

+            delete pAlphaMask;

+        }

+    }

+#endif

+    return FALSE;

+}

+FX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause)

+{

+    if (m_Status == 1) {

+#ifndef _FPDFAPI_MINI_

+        if (m_pQuickStretcher->Continue(pPause)) {

+            return TRUE;

+        }

+        if (m_pQuickStretcher->m_pBitmap->IsAlphaMask())

+            m_pRenderStatus->m_pDevice->SetBitMask(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft,

+                                                   m_pQuickStretcher->m_ResultTop, m_FillArgb);

+        else

+            m_pRenderStatus->m_pDevice->SetDIBits(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft,

+                                                  m_pQuickStretcher->m_ResultTop, m_BlendType);

+        return FALSE;

+#endif

+    } else if (m_Status == 2) {

+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)

+        if (m_pTransformer->Continue(pPause)) {

+            return TRUE;

+        }

+        CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();

+        if (pBitmap == NULL) {

+            return FALSE;

+        }

+        if (pBitmap->IsAlphaMask()) {

+            if (m_BitmapAlpha != 255) {

+                m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);

+            }

+            m_Result = m_pRenderStatus->m_pDevice->SetBitMask(pBitmap,

+                       m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_FillArgb);

+        } else {

+            if (m_BitmapAlpha != 255) {

+                pBitmap->MultiplyAlpha(m_BitmapAlpha);

+            }

+            m_Result = m_pRenderStatus->m_pDevice->SetDIBits(pBitmap,

+                       m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_BlendType);

+        }

+        delete pBitmap;

+        return FALSE;

+#endif

+    } else if (m_Status == 3) {

+        return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause);

+    } else if (m_Status == 4) {

+        if (m_Loader.Continue(m_LoadHandle, pPause)) {

+            return TRUE;

+        }

+        if (StartRenderDIBSource()) {

+            return Continue(pPause);

+        }

+        return FALSE;

+    }

+    return FALSE;

+}

+CPDF_QuickStretcher::CPDF_QuickStretcher()

+{

+    m_pBitmap = NULL;

+    m_pDecoder = NULL;

+    m_pCS = NULL;

+}

+CPDF_QuickStretcher::~CPDF_QuickStretcher()

+{

+    if (m_pBitmap) {

+        delete m_pBitmap;

+    }

+    if (m_pCS) {

+        m_pCS->ReleaseCS();

+    }

+    if (m_pDecoder) {

+        delete m_pDecoder;

+    }

+}

+ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+        int nComps, int bpc, const CPDF_Dictionary* pParams);

+FX_BOOL CPDF_QuickStretcher::Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox)

+{

+    if (FXSYS_fabs(pImage2Device->a) < FXSYS_fabs(pImage2Device->b) * 10 && FXSYS_fabs(pImage2Device->d) < FXSYS_fabs(pImage2Device->c) * 10) {

+        return FALSE;

+    }

+    CFX_FloatRect image_rect_f = pImage2Device->GetUnitRect();

+    FX_RECT image_rect = image_rect_f.GetOutterRect();

+    m_DestWidth = image_rect.Width();

+    m_DestHeight = image_rect.Height();

+    m_bFlipX = pImage2Device->a < 0;

+    m_bFlipY = pImage2Device->d > 0;

+    FX_RECT result_rect = *pClipBox;

+    result_rect.Intersect(image_rect);

+    if (result_rect.IsEmpty()) {

+        return FALSE;

+    }

+    m_ResultWidth = result_rect.Width();

+    m_ResultHeight = result_rect.Height();

+    m_ResultLeft = result_rect.left;

+    m_ResultTop = result_rect.top;

+    m_ClipLeft = result_rect.left - image_rect.left;

+    m_ClipTop = result_rect.top - image_rect.top;

+    CPDF_Dictionary* pDict = pImageObj->m_pImage->GetDict();

+    if (pDict->GetInteger(FX_BSTRC("BitsPerComponent")) != 8) {

+        return FALSE;

+    }

+    if (pDict->KeyExist(FX_BSTRC("SMask")) || pDict->KeyExist(FX_BSTRC("Mask"))) {

+        return FALSE;

+    }

+    m_SrcWidth = pDict->GetInteger(FX_BSTRC("Width"));

+    m_SrcHeight = pDict->GetInteger(FX_BSTRC("Height"));

+    m_pCS = NULL;

+    m_Bpp = 3;

+    CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));

+    if (pCSObj == NULL) {

+        return FALSE;

+    }

+    m_pCS = CPDF_ColorSpace::Load(pImageObj->m_pImage->GetDocument(), pCSObj);

+    if (m_pCS == NULL) {

+        return FALSE;

+    }

+    if (!_IsSupported(m_pCS)) {

+        return FALSE;

+    }

+    m_Bpp = m_pCS->CountComponents();

+    if (m_pCS->sRGB()) {

+        m_pCS->ReleaseCS();

+        m_pCS = NULL;

+    }

+    CPDF_Stream* pStream = pImageObj->m_pImage->GetStream();

+    m_StreamAcc.LoadAllData(pStream, FALSE, m_SrcWidth * m_SrcHeight * m_Bpp, TRUE);

+    m_pDecoder = NULL;

+    if (!m_StreamAcc.GetImageDecoder().IsEmpty()) {

+        if (m_StreamAcc.GetImageDecoder() == FX_BSTRC("DCTDecode")) {

+            const CPDF_Dictionary* pParam = m_StreamAcc.GetImageParam();

+            m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(

+                             m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp,

+                             pParam ? pParam->GetInteger(FX_BSTRC("ColorTransform"), 1) : 1);

+        } else if (m_StreamAcc.GetImageDecoder() == FX_BSTRC("FlateDecode")) {

+            m_pDecoder = FPDFAPI_CreateFlateDecoder(

+                             m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp, 8,

+                             m_StreamAcc.GetImageParam());

+        } else {

+            return FALSE;

+        }

+        m_pDecoder->DownScale(m_DestWidth, m_DestHeight);

+    }

+    m_pBitmap = FX_NEW CFX_DIBitmap;

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+    m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb32);

+#else

+    m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb);

+#endif

+    m_LineIndex = 0;

+    return TRUE;

+}

+FX_BOOL CPDF_QuickStretcher::Continue(IFX_Pause* pPause)

+{

+    FX_LPBYTE result_buf = m_pBitmap->GetBuffer();

+    int src_width = m_pDecoder ? m_pDecoder->GetWidth() : m_SrcWidth;

+    int src_height = m_pDecoder ? m_pDecoder->GetHeight() : m_SrcHeight;

+    int src_pitch = src_width * m_Bpp;

+    while (m_LineIndex < m_ResultHeight) {

+        int dest_y, src_y;

+        if (m_bFlipY) {

+            dest_y = m_ResultHeight - m_LineIndex - 1;

+            src_y = (m_DestHeight - (dest_y + m_ClipTop) - 1) * src_height / m_DestHeight;

+        } else {

+            dest_y = m_LineIndex;

+            src_y = (dest_y + m_ClipTop) * src_height / m_DestHeight;

+        }

+        FX_LPCBYTE src_scan;

+        if (m_pDecoder) {

+            src_scan = m_pDecoder->GetScanline(src_y);

+            if (src_scan == NULL) {

+                break;

+            }

+        } else {

+            src_scan = m_StreamAcc.GetData();

+            if (src_scan == NULL) {

+                break;

+            }

+            src_scan += src_y * src_pitch;

+        }

+        FX_LPBYTE result_scan = result_buf + dest_y * m_pBitmap->GetPitch();

+        for (int x = 0; x < m_ResultWidth; x ++) {

+            int dest_x = m_ClipLeft + x;

+            int src_x = (m_bFlipX ? (m_DestWidth - dest_x - 1) : dest_x) * src_width / m_DestWidth;

+            FX_LPCBYTE src_pixel = src_scan + src_x * m_Bpp;

+            if (m_pCS == NULL) {

+                *result_scan = src_pixel[2];

+                result_scan ++;

+                *result_scan = src_pixel[1];

+                result_scan ++;

+                *result_scan = src_pixel[0];

+                result_scan ++;

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+                result_scan ++;

+#endif

+            } else {

+                m_pCS->TranslateImageLine(result_scan, src_pixel, 1, 0, 0);

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+                result_scan += 4;

+#else

+                result_scan += 3;

+#endif

+            }

+        }

+        m_LineIndex ++;

+        if (pPause && pPause->NeedToPauseNow()) {

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict,

+        FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix)

+{

+    if (pSMaskDict == NULL) {

+        return NULL;

+    }

+    CFX_DIBitmap* pMask = NULL;

+    int width = pClipRect->right - pClipRect->left;

+    int height = pClipRect->bottom - pClipRect->top;

+    FX_BOOL bLuminosity = FALSE;

+    bLuminosity = pSMaskDict->GetConstString(FX_BSTRC("S")) != FX_BSTRC("Alpha");

+    CPDF_Stream* pGroup = pSMaskDict->GetStream(FX_BSTRC("G"));

+    if (pGroup == NULL) {

+        return NULL;

+    }

+    CPDF_Function* pFunc = NULL;

+    CPDF_Object* pFuncObj = pSMaskDict->GetElementValue(FX_BSTRC("TR"));

+    if (pFuncObj && (pFuncObj->GetType() == PDFOBJ_DICTIONARY || pFuncObj->GetType() == PDFOBJ_STREAM)) {

+        pFunc = CPDF_Function::Load(pFuncObj);

+    }

+    CFX_AffineMatrix matrix = *pMatrix;

+    matrix.TranslateI(-pClipRect->left, -pClipRect->top);

+    CPDF_Form form(m_pContext->m_pDocument, m_pContext->m_pPageResources, pGroup);

+    form.ParseContent(NULL, NULL, NULL, NULL);

+    CFX_FxgeDevice bitmap_device;

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+    if (!bitmap_device.Create(width, height, bLuminosity ? FXDIB_Rgb32 : FXDIB_8bppMask)) {

+        return NULL;

+    }

+#else

+    if (!bitmap_device.Create(width, height, bLuminosity ? FXDIB_Rgb : FXDIB_8bppMask)) {

+        return NULL;

+    }

+#endif

+    CFX_DIBitmap& bitmap = *bitmap_device.GetBitmap();

+    CPDF_Object* pCSObj = NULL;

+    CPDF_ColorSpace* pCS = NULL;

+    if (bLuminosity) {

+        CPDF_Array* pBC = pSMaskDict->GetArray(FX_BSTRC("BC"));

+        FX_ARGB back_color = 0xff000000;

+        if (pBC) {

+            pCSObj = pGroup->GetDict()->GetDict(FX_BSTRC("Group"))->GetElementValue(FX_BSTRC("CS"));

+            pCS = m_pContext->m_pDocument->LoadColorSpace(pCSObj);

+            if (pCS) {

+                FX_FLOAT R, G, B;

+                FX_DWORD num_floats = 8;

+                if (pCS->CountComponents() > (FX_INT32)num_floats) {

+                    num_floats = (FX_DWORD)pCS->CountComponents();

+                }

+                CFX_FixedBufGrow<FX_FLOAT, 8> float_array(num_floats);

+                FX_FLOAT* pFloats = float_array;

+                FXSYS_memset32(pFloats, 0, num_floats * sizeof(FX_FLOAT));

+                int count = pBC->GetCount() > 8 ? 8 : pBC->GetCount();

+                for (int i = 0; i < count; i ++) {

+                    pFloats[i] = pBC->GetNumber(i);

+                }

+                pCS->GetRGB(pFloats, R, G, B);

+                back_color = 0xff000000 | ((FX_INT32)(R * 255) << 16) | ((FX_INT32)(G * 255) << 8) | (FX_INT32)(B * 255);

+                m_pContext->m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj);

+            }

+        }

+        bitmap.Clear(back_color);

+    } else {

+        bitmap.Clear(0);

+    }

+    CPDF_Dictionary* pFormResource = NULL;

+    if (form.m_pFormDict) {

+        pFormResource = form.m_pFormDict->GetDict(FX_BSTRC("Resources"));

+    }

+    CPDF_RenderOptions options;

+    options.m_ColorMode = bLuminosity ? RENDER_COLOR_NORMAL : RENDER_COLOR_ALPHA;

+    CPDF_RenderStatus status;

+    status.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL, NULL, NULL, NULL,

+                      &options, 0, m_bDropObjects, pFormResource, TRUE, NULL, 0, pCS ? pCS->GetFamily() : 0, bLuminosity);

+    status.RenderObjectList(&form, &matrix);

+    pMask = FX_NEW CFX_DIBitmap;

+    if (!pMask->Create(width, height, FXDIB_8bppMask)) {

+        delete pMask;

+        return NULL;

+    }

+    FX_LPBYTE dest_buf = pMask->GetBuffer();

+    int dest_pitch = pMask->GetPitch();

+    FX_LPBYTE src_buf = bitmap.GetBuffer();

+    int src_pitch = bitmap.GetPitch();

+    FX_LPBYTE pTransfer = FX_Alloc(FX_BYTE, 256);

+    if (pFunc) {

+        CFX_FixedBufGrow<FX_FLOAT, 16> results(pFunc->CountOutputs());

+        for (int i = 0; i < 256; i ++) {

+            FX_FLOAT input = (FX_FLOAT)i / 255.0f;

+            int nresult;

+            pFunc->Call(&input, 1, results, nresult);

+            pTransfer[i] = FXSYS_round(results[0] * 255);

+        }

+    } else {

+        for (int i = 0; i < 256; i ++) {

+            pTransfer[i] = i;

+        }

+    }

+    if (bLuminosity) {

+        int Bpp = bitmap.GetBPP() / 8;

+        for (int row = 0; row < height; row ++) {

+            FX_LPBYTE dest_pos = dest_buf + row * dest_pitch;

+            FX_LPBYTE src_pos = src_buf + row * src_pitch;

+            for (int col = 0; col < width; col ++) {

+                *dest_pos ++ = pTransfer[FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos)];

+                src_pos += Bpp;

+            }

+        }

+    } else if (pFunc) {

+        int size = dest_pitch * height;

+        for (int i = 0; i < size; i ++) {

+            dest_buf[i] = pTransfer[src_buf[i]];

+        }

+    } else {

+        FXSYS_memcpy32(dest_buf, src_buf, dest_pitch * height);

+    }

+    if (pFunc) {

+        delete pFunc;

+    }

+    FX_Free(pTransfer);

+    return pMask;

+}

diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
new file mode 100644
index 0000000..fcb5271
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
@@ -0,0 +1,1524 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "../../../include/fpdfapi/fpdf_module.h"

+#include "../../../include/fpdfapi/fpdf_render.h"

+#include "../../../include/fpdfapi/fpdf_pageobj.h"

+#include "../fpdf_page/pageint.h"

+#include "render_int.h"

+#include <limits.h>

+static unsigned int _GetBits8(FX_LPCBYTE pData, int bitpos, int nbits)

+{

+    unsigned int byte = pData[bitpos / 8];

+    if (nbits == 8) {

+        return byte;

+    } else if (nbits == 4) {

+        return (bitpos % 8) ? (byte & 0x0f) : (byte >> 4);

+    } else if (nbits == 2) {

+        return (byte >> (6 - bitpos % 8)) & 0x03;

+    } else if (nbits == 1) {

+        return (byte >> (7 - bitpos % 8)) & 0x01;

+    } else if (nbits == 16) {

+        return byte * 256 + pData[bitpos / 8 + 1];

+    }

+    return 0;

+}

+CFX_DIBSource* CPDF_Image::LoadDIBSource(CFX_DIBSource** ppMask, FX_DWORD* pMatteColor, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask) const

+{

+    CPDF_DIBSource* pSource = FX_NEW CPDF_DIBSource;

+    if (pSource->Load(m_pDocument, m_pStream, (CPDF_DIBSource**)ppMask, pMatteColor, NULL, NULL, bStdCS, GroupFamily, bLoadMask)) {

+        return pSource;

+    }

+    delete pSource;

+    return NULL;

+}

+CFX_DIBSource* CPDF_Image::DetachBitmap()

+{

+    CFX_DIBSource* pBitmap = m_pDIBSource;

+    m_pDIBSource = NULL;

+    return pBitmap;

+}

+CFX_DIBSource* CPDF_Image::DetachMask()

+{

+    CFX_DIBSource* pBitmap = m_pMask;

+    m_pMask = NULL;

+    return pBitmap;

+}

+FX_BOOL CPDF_Image::StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)

+{

+    m_pDIBSource = FX_NEW CPDF_DIBSource;

+    int ret = ((CPDF_DIBSource*)m_pDIBSource)->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResource, pPageResource, bStdCS, GroupFamily, bLoadMask);

+    if (ret == 2) {

+        return TRUE;

+    }

+    if (!ret) {

+        delete m_pDIBSource;

+        m_pDIBSource = NULL;

+        return FALSE;

+    }

+    m_pMask = ((CPDF_DIBSource*)m_pDIBSource)->DetachMask();

+    m_MatteColor = ((CPDF_DIBSource*)m_pDIBSource)->m_MatteColor;

+    return FALSE;

+}

+FX_BOOL CPDF_Image::Continue(IFX_Pause* pPause)

+{

+    int ret = ((CPDF_DIBSource*)m_pDIBSource)->ContinueLoadDIBSource(pPause);

+    if (ret == 2) {

+        return TRUE;

+    }

+    if (!ret) {

+        delete m_pDIBSource;

+        m_pDIBSource = NULL;

+        return FALSE;

+    }

+    m_pMask = ((CPDF_DIBSource*)m_pDIBSource)->DetachMask();

+    m_MatteColor = ((CPDF_DIBSource*)m_pDIBSource)->m_MatteColor;

+    return FALSE;

+}

+CPDF_DIBSource::CPDF_DIBSource()

+{

+    m_pDocument = NULL;

+    m_pStreamAcc = NULL;

+    m_pDict = NULL;

+    m_bpp = 0;

+    m_Width = m_Height = 0;

+    m_pColorSpace = NULL;

+    m_bDefaultDecode = TRUE;

+    m_bImageMask = FALSE;

+    m_pPalette = NULL;

+    m_pCompData = NULL;

+    m_bColorKey = FALSE;

+    m_pMaskedLine = m_pLineBuf = NULL;

+    m_pCachedBitmap = NULL;

+    m_pDecoder = NULL;

+    m_nComponents = 0;

+    m_bpc = 0;

+    m_bLoadMask = FALSE;

+    m_Family = 0;

+    m_pMask = NULL;

+    m_MatteColor = 0;

+    m_pJbig2Context = NULL;

+    m_pGlobalStream = NULL;

+    m_bStdCS = FALSE;

+    m_pMaskStream = NULL;

+    m_Status = 0;

+    m_bHasMask = FALSE;

+}

+CPDF_DIBSource::~CPDF_DIBSource()

+{

+    if (m_pStreamAcc) {

+        delete m_pStreamAcc;

+    }

+    if (m_pMaskedLine) {

+        FX_Free(m_pMaskedLine);

+    }

+    if (m_pLineBuf) {

+        FX_Free(m_pLineBuf);

+    }

+    if (m_pCachedBitmap) {

+        delete m_pCachedBitmap;

+    }

+    if (m_pDecoder) {

+        delete m_pDecoder;

+    }

+    if (m_pCompData) {

+        FX_Free(m_pCompData);

+    }

+    CPDF_ColorSpace* pCS = m_pColorSpace;

+    if (pCS && m_pDocument) {

+        m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());

+    }

+    if (m_pJbig2Context) {

+        ICodec_Jbig2Module* pJbig2Moudle = CPDF_ModuleMgr::Get()->GetJbig2Module();

+        pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);

+        m_pJbig2Context = NULL;

+    }

+    if (m_pGlobalStream) {

+        delete m_pGlobalStream;

+    }

+    m_pGlobalStream = NULL;

+}

+CFX_DIBitmap* CPDF_DIBSource::GetBitmap() const

+{

+    if (m_pCachedBitmap) {

+        return m_pCachedBitmap;

+    }

+    return Clone();

+}

+void CPDF_DIBSource::ReleaseBitmap(CFX_DIBitmap* pBitmap) const

+{

+    if (pBitmap && pBitmap != m_pCachedBitmap) {

+        delete pBitmap;

+    }

+}

+FX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream, CPDF_DIBSource** ppMask,

+                             FX_DWORD* pMatteColor, CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)

+{

+    if (pStream == NULL) {

+        return FALSE;

+    }

+    m_pDocument = pDoc;

+    m_pDict = pStream->GetDict();

+    m_pStream = pStream;

+    m_Width = m_pDict->GetInteger(FX_BSTRC("Width"));

+    m_Height = m_pDict->GetInteger(FX_BSTRC("Height"));

+    if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ffff) {

+        return FALSE;

+    }

+    m_GroupFamily = GroupFamily;

+    m_bLoadMask = bLoadMask;

+    if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPageResources)) {

+        return FALSE;

+    }

+    FX_DWORD src_pitch = m_bpc;

+    if (m_bpc != 0 && m_nComponents != 0) {

+        if (src_pitch > 0 && m_nComponents > (unsigned)INT_MAX / src_pitch) {

+            return FALSE;

+        }

+        src_pitch *= m_nComponents;

+        if (src_pitch > 0 && (FX_DWORD)m_Width > (unsigned)INT_MAX / src_pitch) {

+            return FALSE;

+        }

+        src_pitch *= m_Width;

+        if (src_pitch + 7 < src_pitch) {

+            return FALSE;

+        }

+        src_pitch += 7;

+        src_pitch /= 8;

+        if (src_pitch > 0 && (FX_DWORD)m_Height > (unsigned)INT_MAX / src_pitch) {

+            return FALSE;

+        }

+    }

+    m_pStreamAcc = FX_NEW CPDF_StreamAcc;

+    m_pStreamAcc->LoadAllData(pStream, FALSE, m_Height * src_pitch, TRUE);

+    if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {

+        return FALSE;

+    }

+    const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();

+    if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) {

+        m_bpc = 1;

+    }

+    if (!CreateDecoder()) {

+        return FALSE;

+    }

+    if (m_bImageMask) {

+        m_bpp = 1;

+        m_bpc = 1;

+        m_nComponents = 1;

+        m_AlphaFlag = 1;

+    } else if (m_bpc * m_nComponents == 1) {

+        m_bpp = 1;

+    } else if (m_bpc * m_nComponents <= 8) {

+        m_bpp = 8;

+    } else {

+        m_bpp = 24;

+    }

+    if (!m_bpc || !m_nComponents) {

+        return FALSE;

+    }

+    m_Pitch = m_Width;

+    if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {

+        return FALSE;

+    }

+    m_Pitch *= m_bpp;

+    if (m_Pitch + 31 < m_Pitch) {

+        return FALSE;

+    }

+    m_Pitch += 31;

+    m_Pitch = m_Pitch / 32 * 4;

+    m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch);

+    if (m_pColorSpace && bStdCS) {

+        m_pColorSpace->EnableStdConversion(TRUE);

+    }

+    LoadPalette();

+    if (m_bColorKey) {

+        m_bpp = 32;

+        m_AlphaFlag = 2;

+        m_Pitch = m_Width;

+        if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {

+            return FALSE;

+        }

+        m_Pitch *= m_bpp;

+        if (m_Pitch + 31 < m_Pitch) {

+            return FALSE;

+        }

+        m_Pitch += 31;

+        m_Pitch = m_Pitch / 32 * 4;

+        m_pMaskedLine = FX_Alloc(FX_BYTE, m_Pitch);

+    }

+    if (ppMask) {

+        *ppMask = LoadMask(*pMatteColor);

+    }

+    if (m_pColorSpace && bStdCS) {

+        m_pColorSpace->EnableStdConversion(FALSE);

+    }

+    return TRUE;

+}

+int	CPDF_DIBSource::ContinueToLoadMask()

+{

+    if (m_bImageMask) {

+        m_bpp = 1;

+        m_bpc = 1;

+        m_nComponents = 1;

+        m_AlphaFlag = 1;

+    } else if (m_bpc * m_nComponents == 1) {

+        m_bpp = 1;

+    } else if (m_bpc * m_nComponents <= 8) {

+        m_bpp = 8;

+    } else {

+        m_bpp = 24;

+    }

+    if (!m_bpc || !m_nComponents) {

+        return 0;

+    }

+    m_Pitch = m_Width;

+    if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {

+        return 0;

+    }

+    m_Pitch *= m_bpp;

+    if (m_Pitch + 31 < m_Pitch) {

+        return 0;

+    }

+    m_Pitch += 31;

+    m_Pitch = m_Pitch / 32 * 4;

+    m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch);

+    if (m_pColorSpace && m_bStdCS) {

+        m_pColorSpace->EnableStdConversion(TRUE);

+    }

+    LoadPalette();

+    if (m_bColorKey) {

+        m_bpp = 32;

+        m_AlphaFlag = 2;

+        m_Pitch = m_Width;

+        if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {

+            return 0;

+        }

+        m_Pitch *= m_bpp;

+        if (m_Pitch + 31 < m_Pitch) {

+            return 0;

+        }

+        m_Pitch += 31;

+        m_Pitch = m_Pitch / 32 * 4;

+        m_pMaskedLine = FX_Alloc(FX_BYTE, m_Pitch);

+    }

+    return 1;

+}

+int	CPDF_DIBSource::StartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask,

+                                       CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,

+                                       FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)

+{

+    if (pStream == NULL) {

+        return 0;

+    }

+    m_pDocument = pDoc;

+    m_pDict = pStream->GetDict();

+    m_pStream = pStream;

+    m_bStdCS = bStdCS;

+    m_bHasMask = bHasMask;

+    m_Width = m_pDict->GetInteger(FX_BSTRC("Width"));

+    m_Height = m_pDict->GetInteger(FX_BSTRC("Height"));

+    if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ffff) {

+        return 0;

+    }

+    m_GroupFamily = GroupFamily;

+    m_bLoadMask = bLoadMask;

+    if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPageResources)) {

+        return 0;

+    }

+    FX_DWORD src_pitch = m_bpc;

+    if (m_bpc != 0 && m_nComponents != 0) {

+        if (src_pitch > 0 && m_nComponents > (unsigned)INT_MAX / src_pitch) {

+            return 0;

+        }

+        src_pitch *= m_nComponents;

+        if (src_pitch > 0 && (FX_DWORD)m_Width > (unsigned)INT_MAX / src_pitch) {

+            return 0;

+        }

+        src_pitch *= m_Width;

+        if (src_pitch + 7 < src_pitch) {

+            return 0;

+        }

+        src_pitch += 7;

+        src_pitch /= 8;

+        if (src_pitch > 0 && (FX_DWORD)m_Height > (unsigned)INT_MAX / src_pitch) {

+            return 0;

+        }

+    }

+    m_pStreamAcc = FX_NEW CPDF_StreamAcc;

+    m_pStreamAcc->LoadAllData(pStream, FALSE, m_Height * src_pitch, TRUE);

+    if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {

+        return 0;

+    }

+    const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();

+    if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) {

+        m_bpc = 1;

+    }

+    int ret = CreateDecoder();

+    if (ret != 1) {

+        if (!ret) {

+            return ret;

+        }

+        if (!ContinueToLoadMask()) {

+            return 0;

+        }

+        if (m_bHasMask) {

+            StratLoadMask();

+        }

+        return ret;

+    }

+    if (!ContinueToLoadMask()) {

+        return 0;

+    }

+    if (m_bHasMask) {

+        ret = StratLoadMask();

+    }

+    if (ret == 2) {

+        return ret;

+    }

+    if (m_pColorSpace && m_bStdCS) {

+        m_pColorSpace->EnableStdConversion(FALSE);

+    }

+    return ret;

+}

+int	CPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause)

+{

+    FXCODEC_STATUS ret;

+    if (m_Status == 1) {

+        const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();

+        if (decoder == FX_BSTRC("JPXDecode")) {

+            return 0;

+        }

+        ICodec_Jbig2Module* pJbig2Moudle = CPDF_ModuleMgr::Get()->GetJbig2Module();

+        if (m_pJbig2Context == NULL) {

+            m_pJbig2Context = pJbig2Moudle->CreateJbig2Context();

+            if (m_pStreamAcc->GetImageParam()) {

+                CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream(FX_BSTRC("JBIG2Globals"));

+                if (pGlobals) {

+                    m_pGlobalStream = FX_NEW CPDF_StreamAcc;

+                    m_pGlobalStream->LoadAllData(pGlobals, FALSE);

+                }

+            }

+            ret = pJbig2Moudle->StartDecode(m_pJbig2Context, m_Width, m_Height, m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(),

+                                            m_pGlobalStream ? m_pGlobalStream->GetData() : NULL, m_pGlobalStream ? m_pGlobalStream->GetSize() : 0, m_pCachedBitmap->GetBuffer(),

+                                            m_pCachedBitmap->GetPitch(), pPause);

+            if (ret < 0) {

+                delete m_pCachedBitmap;

+                m_pCachedBitmap = NULL;

+                if (m_pGlobalStream) {

+                    delete m_pGlobalStream;

+                }

+                m_pGlobalStream = NULL;

+                pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);

+                m_pJbig2Context = NULL;

+                return 0;

+            }

+            if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+                return 2;

+            }

+            int ret1 = 1;

+            if (m_bHasMask) {

+                ret1 = ContinueLoadMaskDIB(pPause);

+                m_Status = 2;

+            }

+            if (ret1 == 2) {

+                return ret1;

+            }

+            if (m_pColorSpace && m_bStdCS) {

+                m_pColorSpace->EnableStdConversion(FALSE);

+            }

+            return ret1;

+        }

+        FXCODEC_STATUS ret = pJbig2Moudle->ContinueDecode(m_pJbig2Context, pPause);

+        if (ret < 0) {

+            delete m_pCachedBitmap;

+            m_pCachedBitmap = NULL;

+            if (m_pGlobalStream) {

+                delete m_pGlobalStream;

+            }

+            m_pGlobalStream = NULL;

+            pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);

+            m_pJbig2Context = NULL;

+            return 0;

+        }

+        if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+            return 2;

+        }

+        int ret1 = 1;

+        if (m_bHasMask) {

+            ret1 = ContinueLoadMaskDIB(pPause);

+            m_Status = 2;

+        }

+        if (ret1 == 2) {

+            return ret1;

+        }

+        if (m_pColorSpace && m_bStdCS) {

+            m_pColorSpace->EnableStdConversion(FALSE);

+        }

+        return ret1;

+    } else if (m_Status == 2) {

+        return ContinueLoadMaskDIB(pPause);

+    }

+    return 0;

+}

+FX_BOOL CPDF_DIBSource::LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources)

+{

+    if (m_pDict->GetInteger("ImageMask")) {

+        m_bImageMask = TRUE;

+    }

+    if (m_bImageMask || !m_pDict->KeyExist(FX_BSTRC("ColorSpace"))) {

+        if (!m_bImageMask) {

+            CPDF_Object* pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter"));

+            if (pFilter) {

+                CFX_ByteString filter;

+                if (pFilter->GetType() == PDFOBJ_NAME) {

+                    filter = pFilter->GetString();

+                    if (filter == FX_BSTRC("JPXDecode")) {

+                        return TRUE;

+                    }

+                } else if (pFilter->GetType() == PDFOBJ_ARRAY) {

+                    CPDF_Array* pArray = (CPDF_Array*)pFilter;

+                    if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("JPXDecode")) {

+                        return TRUE;

+                    }

+                }

+            }

+        }

+        m_bImageMask = TRUE;

+        m_bpc = m_nComponents = 1;

+        CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode"));

+        m_bDefaultDecode = pDecode == NULL || pDecode->GetInteger(0) == 0;

+        return TRUE;

+    }

+    CPDF_Object* pCSObj = m_pDict->GetElementValue(FX_BSTRC("ColorSpace"));

+    if (pCSObj == NULL) {

+        return FALSE;

+    }

+    CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();

+    if (pFormResources) {

+        m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pFormResources);

+    }

+    if (m_pColorSpace == NULL) {

+        m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pPageResources);

+    }

+    if (m_pColorSpace == NULL) {

+        return FALSE;

+    }

+    m_bpc = m_pDict->GetInteger(FX_BSTRC("BitsPerComponent"));

+    m_Family = m_pColorSpace->GetFamily();

+    m_nComponents = m_pColorSpace->CountComponents();

+    if (m_Family == PDFCS_ICCBASED && pCSObj->GetType() == PDFOBJ_NAME) {

+        CFX_ByteString cs = pCSObj->GetString();

+        if (cs == FX_BSTRC("DeviceGray")) {

+            m_nComponents = 1;

+        } else if (cs == FX_BSTRC("DeviceRGB")) {

+            m_nComponents = 3;

+        } else if (cs == FX_BSTRC("DeviceCMYK")) {

+            m_nComponents = 4;

+        }

+    }

+    m_pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents);

+    if (m_bpc == 0) {

+        return TRUE;

+    }

+    int max_data = (1 << m_bpc) - 1;

+    CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode"));

+    if (pDecode) {

+        for (FX_DWORD i = 0; i < m_nComponents; i ++) {

+            m_pCompData[i].m_DecodeMin = pDecode->GetNumber(i * 2);

+            FX_FLOAT max = pDecode->GetNumber(i * 2 + 1);

+            m_pCompData[i].m_DecodeStep = (max - m_pCompData[i].m_DecodeMin) / max_data;

+            FX_FLOAT def_value, def_min, def_max;

+            m_pColorSpace->GetDefaultValue(i, def_value, def_min, def_max);

+            if (m_Family == PDFCS_INDEXED) {

+                def_max = (FX_FLOAT)max_data;

+            }

+            if (def_min != m_pCompData[i].m_DecodeMin || def_max != max) {

+                m_bDefaultDecode = FALSE;

+            }

+        }

+    } else {

+        for (FX_DWORD i = 0; i < m_nComponents; i ++) {

+            FX_FLOAT def_value;

+            m_pColorSpace->GetDefaultValue(i, def_value, m_pCompData[i].m_DecodeMin, m_pCompData[i].m_DecodeStep);

+            if (m_Family == PDFCS_INDEXED) {

+                m_pCompData[i].m_DecodeStep = (FX_FLOAT)max_data;

+            }

+            m_pCompData[i].m_DecodeStep = (m_pCompData[i].m_DecodeStep - m_pCompData[i].m_DecodeMin) / max_data;

+        }

+    }

+    if (!m_pDict->KeyExist(FX_BSTRC("SMask"))) {

+        CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC("Mask"));

+        if (pMask == NULL) {

+            return TRUE;

+        }

+        if (pMask->GetType() == PDFOBJ_ARRAY) {

+            CPDF_Array* pArray = (CPDF_Array*)pMask;

+            if (pArray->GetCount() >= m_nComponents * 2)

+                for (FX_DWORD i = 0; i < m_nComponents * 2; i ++) {

+                    if (i % 2) {

+                        m_pCompData[i / 2].m_ColorKeyMax = pArray->GetInteger(i);

+                    } else {

+                        m_pCompData[i / 2].m_ColorKeyMin = pArray->GetInteger(i);

+                    }

+                }

+            m_bColorKey = TRUE;

+        }

+    }

+    return TRUE;

+}

+ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+        const CPDF_Dictionary* pParams);

+ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+        int nComps, int bpc, const CPDF_Dictionary* pParams);

+int CPDF_DIBSource::CreateDecoder()

+{

+    const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();

+    if (decoder.IsEmpty()) {

+        return 1;

+    }

+    FX_LPCBYTE src_data = m_pStreamAcc->GetData();

+    FX_DWORD src_size = m_pStreamAcc->GetSize();

+    const CPDF_Dictionary* pParams = m_pStreamAcc->GetImageParam();

+    if (decoder == FX_BSTRC("CCITTFaxDecode")) {

+        m_pDecoder = FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width, m_Height, pParams);

+    } else if (decoder == FX_BSTRC("DCTDecode")) {

+        m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height,

+                     m_nComponents, pParams ? pParams->GetInteger(FX_BSTR("ColorTransform"), 1) : 1);

+        if (NULL == m_pDecoder) {

+            FX_BOOL bTransform = FALSE;

+            int comps, bpc;

+            ICodec_JpegModule* pJpegModule = CPDF_ModuleMgr::Get()->GetJpegModule();

+            if (pJpegModule->LoadInfo(src_data, src_size, m_Width, m_Height, comps, bpc, bTransform)) {

+                m_nComponents = comps;

+                m_bpc = bpc;

+                m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height,

+                             m_nComponents, bTransform);

+            }

+        }

+    } else if (decoder == FX_BSTRC("FlateDecode")) {

+        m_pDecoder = FPDFAPI_CreateFlateDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc, pParams);

+    } else if (decoder == FX_BSTRC("JPXDecode")) {

+        LoadJpxBitmap();

+        return m_pCachedBitmap != NULL ? 1 : 0;

+    } else if (decoder == FX_BSTRC("JBIG2Decode")) {

+        m_pCachedBitmap = FX_NEW CFX_DIBitmap;

+        if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) {

+            delete m_pCachedBitmap;

+            m_pCachedBitmap = NULL;

+            return 0;

+        }

+        m_Status = 1;

+        return 2;

+    } else if (decoder == FX_BSTRC("RunLengthDecode")) {

+        m_pDecoder = CPDF_ModuleMgr::Get()->GetCodecModule()->GetBasicModule()->CreateRunLengthDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc);

+    }

+    if (m_pDecoder) {

+        int requested_pitch = (m_Width * m_nComponents * m_bpc + 7) / 8;

+        int provided_pitch = (m_pDecoder->GetWidth() * m_pDecoder->CountComps() * m_pDecoder->GetBPC() + 7) / 8;

+        if (provided_pitch < requested_pitch) {

+            return 0;

+        }

+        return 1;

+    }

+    return 0;

+}

+void CPDF_DIBSource::LoadJpxBitmap()

+{

+    ICodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule();

+    if (pJpxModule == NULL) {

+        return;

+    }

+    FX_LPVOID ctx = pJpxModule->CreateDecoder(m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), m_pColorSpace != NULL);

+    if (ctx == NULL) {

+        return;

+    }

+    FX_DWORD width = 0, height = 0, codestream_nComps = 0, image_nComps = 0;

+    pJpxModule->GetImageInfo(ctx, width, height, codestream_nComps, image_nComps);

+    if ((int)width < m_Width || (int)height < m_Height) {

+        pJpxModule->DestroyDecoder(ctx);

+        return;

+    }

+    int output_nComps;

+    FX_BOOL bTranslateColor, bSwapRGB = FALSE;

+    if (m_pColorSpace) {

+        if (codestream_nComps != (FX_DWORD)m_pColorSpace->CountComponents()) {

+            return;

+        }

+        output_nComps = codestream_nComps;

+        bTranslateColor = FALSE;

+        if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) {

+            bSwapRGB = TRUE;

+            m_pColorSpace = NULL;

+        }

+    } else {

+        bTranslateColor = TRUE;

+        if (image_nComps) {

+            output_nComps = image_nComps;

+        } else {

+            output_nComps = codestream_nComps;

+        }

+        if (output_nComps == 3) {

+            bSwapRGB = TRUE;

+        } else if (output_nComps == 4) {

+            m_pColorSpace = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);

+            bTranslateColor = FALSE;

+        }

+        m_nComponents = output_nComps;

+    }

+    FXDIB_Format format;

+    if (output_nComps == 1) {

+        format = FXDIB_8bppRgb;

+    } else if (output_nComps <= 3) {

+        format = FXDIB_Rgb;

+    } else if (output_nComps == 4) {

+        format = FXDIB_Rgb32;

+    } else {

+        width = (width * output_nComps + 2) / 3;

+        format = FXDIB_Rgb;

+    }

+    m_pCachedBitmap = FX_NEW CFX_DIBitmap;

+    if (!m_pCachedBitmap->Create(width, height, format)) {

+        delete m_pCachedBitmap;

+        m_pCachedBitmap = NULL;

+        return;

+    }

+    m_pCachedBitmap->Clear(0xFFFFFFFF);

+    FX_LPBYTE output_offsets = FX_Alloc(FX_BYTE, output_nComps);

+    for (int i = 0; i < output_nComps; i ++) {

+        output_offsets[i] = i;

+    }

+    if (bSwapRGB) {

+        output_offsets[0] = 2;

+        output_offsets[2] = 0;

+    }

+    if (!pJpxModule->Decode(ctx, m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), bTranslateColor, output_offsets)) {

+        delete m_pCachedBitmap;

+        m_pCachedBitmap = NULL;

+        return;

+    }

+    FX_Free(output_offsets);

+    pJpxModule->DestroyDecoder(ctx);

+    if (m_pColorSpace && m_pColorSpace->GetFamily() == PDFCS_INDEXED && m_bpc < 8) {

+        int scale = 8 - m_bpc;

+        for (FX_DWORD row = 0; row < height; row ++) {

+            FX_LPBYTE scanline = (FX_LPBYTE)m_pCachedBitmap->GetScanline(row);

+            for (FX_DWORD col = 0; col < width; col ++) {

+                *scanline = (*scanline) >> scale;

+                scanline++;

+            }

+        }

+    }

+    m_bpc = 8;

+}

+void CPDF_DIBSource::LoadJbig2Bitmap()

+{

+    ICodec_Jbig2Module* pJbig2Module = CPDF_ModuleMgr::Get()->GetJbig2Module();

+    if (pJbig2Module == NULL) {

+        return;

+    }

+    CPDF_StreamAcc* pGlobalStream = NULL;

+    if (m_pStreamAcc->GetImageParam()) {

+        CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream(FX_BSTRC("JBIG2Globals"));

+        if (pGlobals) {

+            pGlobalStream = FX_NEW CPDF_StreamAcc;

+            pGlobalStream->LoadAllData(pGlobals, FALSE);

+        }

+    }

+    m_pCachedBitmap = FX_NEW CFX_DIBitmap;

+    if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) {

+        return;

+    }

+    int ret = pJbig2Module->Decode(m_Width, m_Height, m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(),

+                                   pGlobalStream ? pGlobalStream->GetData() : NULL, pGlobalStream ? pGlobalStream->GetSize() : 0,

+                                   m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch());

+    if (ret < 0) {

+        delete m_pCachedBitmap;

+        m_pCachedBitmap = NULL;

+    }

+    if (pGlobalStream) {

+        delete pGlobalStream;

+    }

+    m_bpc = 1;

+    m_nComponents = 1;

+}

+CPDF_DIBSource* CPDF_DIBSource::LoadMask(FX_DWORD& MatteColor)

+{

+    MatteColor = 0xffffffff;

+    CPDF_Stream* pSoftMask = m_pDict->GetStream(FX_BSTRC("SMask"));

+    if (pSoftMask) {

+        CPDF_Array* pMatte = pSoftMask->GetDict()->GetArray(FX_BSTRC("Matte"));

+        if (pMatte != NULL && m_pColorSpace && (FX_DWORD)m_pColorSpace->CountComponents() <= m_nComponents) {

+            FX_FLOAT* pColor = FX_Alloc(FX_FLOAT, m_nComponents);

+            for (FX_DWORD i = 0; i < m_nComponents; i ++) {

+                pColor[i] = pMatte->GetFloat(i);

+            }

+            FX_FLOAT R, G, B;

+            m_pColorSpace->GetRGB(pColor, R, G, B);

+            FX_Free(pColor);

+            MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));

+        }

+        return LoadMaskDIB(pSoftMask);

+    }

+    CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC("Mask"));

+    if (pMask == NULL) {

+        return NULL;

+    }

+    if (pMask->GetType() == PDFOBJ_STREAM) {

+        return LoadMaskDIB((CPDF_Stream*)pMask);

+    }

+    return NULL;

+}

+int	CPDF_DIBSource::StratLoadMask()

+{

+    m_MatteColor = 0xffffffff;

+    m_pMaskStream = m_pDict->GetStream(FX_BSTRC("SMask"));

+    if (m_pMaskStream) {

+        CPDF_Array* pMatte = m_pMaskStream->GetDict()->GetArray(FX_BSTRC("Matte"));

+        if (pMatte != NULL && m_pColorSpace && (FX_DWORD)m_pColorSpace->CountComponents() <= m_nComponents) {

+            FX_FLOAT R, G, B;

+            FX_FLOAT* pColor = FX_Alloc(FX_FLOAT, m_nComponents);

+            for (FX_DWORD i = 0; i < m_nComponents; i ++) {

+                pColor[i] = pMatte->GetFloat(i);

+            }

+            m_pColorSpace->GetRGB(pColor, R, G, B);

+            FX_Free(pColor);

+            m_MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));

+        }

+        return StartLoadMaskDIB();

+    }

+    m_pMaskStream = m_pDict->GetElementValue(FX_BSTRC("Mask"));

+    if (m_pMaskStream == NULL) {

+        return 1;

+    }

+    if (m_pMaskStream->GetType() == PDFOBJ_STREAM) {

+        return StartLoadMaskDIB();

+    }

+    return 1;

+}

+int	CPDF_DIBSource::ContinueLoadMaskDIB(IFX_Pause* pPause)

+{

+    if (m_pMask == NULL) {

+        return 1;

+    }

+    int ret = m_pMask->ContinueLoadDIBSource(pPause);

+    if (ret == 2) {

+        return ret;

+    }

+    if (m_pColorSpace && m_bStdCS) {

+        m_pColorSpace->EnableStdConversion(FALSE);

+    }

+    if (!ret) {

+        delete m_pMask;

+        m_pMask = NULL;

+        return ret;

+    }

+    return 1;

+}

+CPDF_DIBSource*	CPDF_DIBSource::DetachMask()

+{

+    CPDF_DIBSource* pDIBSource = m_pMask;

+    m_pMask = NULL;

+    return pDIBSource;

+}

+CPDF_DIBSource* CPDF_DIBSource::LoadMaskDIB(CPDF_Stream* pMask)

+{

+    CPDF_DIBSource* pMaskSource = FX_NEW CPDF_DIBSource;

+    if (!pMaskSource->Load(m_pDocument, pMask, NULL, NULL, NULL, NULL, TRUE)) {

+        delete pMaskSource;

+        return NULL;

+    }

+    return pMaskSource;

+}

+int CPDF_DIBSource::StartLoadMaskDIB()

+{

+    m_pMask = FX_NEW CPDF_DIBSource;

+    int ret = m_pMask->StartLoadDIBSource(m_pDocument, (CPDF_Stream*)m_pMaskStream, FALSE, NULL, NULL, TRUE);

+    if (ret == 2) {

+        if (m_Status == 0) {

+            m_Status = 2;

+        }

+        return 2;

+    }

+    if (!ret) {

+        delete m_pMask;

+        m_pMask = NULL;

+        return 1;

+    }

+    return 1;

+}

+void CPDF_DIBSource::LoadPalette()

+{

+    if (m_bpc * m_nComponents > 8) {

+        return;

+    }

+    if (m_pColorSpace == NULL) {

+        return;

+    }

+    if (m_bpc * m_nComponents == 1) {

+        if (m_bDefaultDecode && (m_Family == PDFCS_DEVICEGRAY || m_Family == PDFCS_DEVICERGB)) {

+            return;

+        }

+        if (m_pColorSpace->CountComponents() > 3) {

+            return;

+        }

+        FX_FLOAT color_values[3];

+        color_values[0] = m_pCompData[0].m_DecodeMin;

+        color_values[1] = color_values[2] = color_values[0];

+        FX_FLOAT R, G, B;

+        m_pColorSpace->GetRGB(color_values, R, G, B);

+        FX_ARGB argb0 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));

+        color_values[0] += m_pCompData[0].m_DecodeStep;

+        color_values[1] += m_pCompData[0].m_DecodeStep;

+        color_values[2] += m_pCompData[0].m_DecodeStep;

+        m_pColorSpace->GetRGB(color_values, R, G, B);

+        FX_ARGB argb1 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));

+        if (argb0 != 0xFF000000 || argb1 != 0xFFFFFFFF) {

+            SetPaletteArgb(0, argb0);

+            SetPaletteArgb(1, argb1);

+        }

+        return;

+    }

+    if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY) && m_bpc == 8 && m_bDefaultDecode) {

+    } else {

+        int palette_count = 1 << (m_bpc * m_nComponents);

+        CFX_FixedBufGrow<FX_FLOAT, 16> color_values(m_nComponents);

+        FX_FLOAT* color_value = color_values;

+        for (int i = 0; i < palette_count; i ++) {

+            int color_data = i;

+            for (FX_DWORD j = 0; j < m_nComponents; j ++) {

+                int encoded_component = color_data % (1 << m_bpc);

+                color_data /= 1 << m_bpc;

+                color_value[j] = m_pCompData[j].m_DecodeMin + m_pCompData[j].m_DecodeStep * encoded_component;

+            }

+            FX_FLOAT R = 0, G = 0, B = 0;

+            if (m_nComponents == 1 && m_Family == PDFCS_ICCBASED && m_pColorSpace->CountComponents() > 1) {

+                int nComponents = m_pColorSpace->CountComponents();

+                FX_FLOAT* temp_buf = FX_Alloc(FX_FLOAT, nComponents);

+                for (int i = 0; i < nComponents; i++) {

+                    temp_buf[i] = *color_value;

+                }

+                m_pColorSpace->GetRGB(temp_buf, R, G, B);

+                FX_Free(temp_buf);

+            } else {

+                m_pColorSpace->GetRGB(color_value, R, G, B);

+            }

+            SetPaletteArgb(i, ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));

+        }

+    }

+}

+

+FX_DWORD CPDF_DIBSource::GetValidBpp() const

+{

+    FX_DWORD bpc = m_bpc;

+    CPDF_Object * pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter"));

+    if(pFilter)

+    {

+        if(pFilter->GetType() == PDFOBJ_NAME)

+        {

+            CFX_ByteString filter = pFilter->GetString();

+            if(filter == FX_BSTRC("CCITTFaxDecode") || filter == FX_BSTRC("JBIG2Decode") )

+                bpc = 1;

+            if(filter == FX_BSTRC("RunLengthDecode") || filter == FX_BSTRC("DCTDecode") )

+                bpc = 8;

+        }

+        else if (pFilter->GetType() == PDFOBJ_ARRAY)

+        {

+             CPDF_Array *pArray = (CPDF_Array *) pFilter;

+             if( pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("CCITTFacDecode") ||

+                 pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("JBIG2Decode") )

+                 bpc = 1;

+

+              if( pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("RunLengthDecode") ||

+                 pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("DCTDecode") )

+                 bpc = 8;

+         }

+     }

+

+    return bpc;

+}

+

+#define NORMALCOLOR_MAX(color, max) (color) > (max) ? (max) : (color) < 0 ? 0 : (color);

+void CPDF_DIBSource::TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const

+{

+    int max_data = (1 << m_bpc) - 1;

+    if (m_bDefaultDecode) {

+        if (m_Family == PDFCS_DEVICERGB || m_Family == PDFCS_CALRGB) {

+            if (m_bpc == 16) {

+                FX_LPBYTE dest_pos = dest_scan;

+                FX_LPCBYTE src_pos = src_scan;

+                for (int col = 0; col < m_Width; col ++) {

+                    *dest_scan++ = src_pos[4];

+                    *dest_scan++ = src_pos[2];

+                    *dest_scan++ = *src_pos;

+                    src_pos += 6;

+                }

+            } else if (m_bpc == 8) {

+                FX_LPBYTE dest_pos = dest_scan;

+                FX_LPCBYTE src_pos = src_scan;

+                for (int column = 0; column < m_Width; column ++) {

+                    *dest_scan++ = src_pos[2];

+                    *dest_scan++ = src_pos[1];

+                    *dest_scan++ = *src_pos;

+                    src_pos += 3;

+                }

+            } else {

+                int src_bit_pos = 0;

+                int dest_byte_pos = 0;

+

+                FX_DWORD bpc = GetValidBpp();

+

+                for (int column = 0; column < m_Width; column ++) {

+                    int R = _GetBits8(src_scan, src_bit_pos, bpc);

+                    src_bit_pos += bpc;

+                    int G = _GetBits8(src_scan, src_bit_pos, bpc);

+                    src_bit_pos += bpc;

+                    int B = _GetBits8(src_scan, src_bit_pos, bpc);

+                    src_bit_pos += bpc;

+                    R = NORMALCOLOR_MAX(R, max_data);

+                    G = NORMALCOLOR_MAX(G, max_data);

+                    B = NORMALCOLOR_MAX(B, max_data);

+                    dest_scan[dest_byte_pos] = B * 255 / max_data;

+                    dest_scan[dest_byte_pos + 1] = G * 255 / max_data;

+                    dest_scan[dest_byte_pos + 2] = R * 255 / max_data;

+                    dest_byte_pos += 3;

+                }

+            }

+            return;

+        } else if (m_bpc == 8) {

+			if (m_nComponents == m_pColorSpace->CountComponents())

+				m_pColorSpace->TranslateImageLine(dest_scan, src_scan, m_Width, m_Width, m_Height,

+                                              m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);

+            return;

+        }

+    }

+    CFX_FixedBufGrow<FX_FLOAT, 16> color_values1(m_nComponents);

+    FX_FLOAT* color_values = color_values1;

+    FX_FLOAT R, G, B;

+    if (m_bpc == 8) {

+        int src_byte_pos = 0;

+        int dest_byte_pos = 0;

+        for (int column = 0; column < m_Width; column ++) {

+            for (FX_DWORD color = 0; color < m_nComponents; color ++) {

+                int data = src_scan[src_byte_pos ++];

+                color_values[color] = m_pCompData[color].m_DecodeMin +

+                                      m_pCompData[color].m_DecodeStep * data;

+            }

+            if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK) {

+                FX_FLOAT k = 1.0f - color_values[3];

+                R = (1.0f - color_values[0]) * k;

+                G = (1.0f - color_values[1]) * k;

+                B = (1.0f - color_values[2]) * k;

+            } else {

+                m_pColorSpace->GetRGB(color_values, R, G, B);

+            }

+            R = NORMALCOLOR_MAX(R, 1);

+            G = NORMALCOLOR_MAX(G, 1);

+            B = NORMALCOLOR_MAX(B, 1);

+            dest_scan[dest_byte_pos] = (FX_INT32)(B * 255);

+            dest_scan[dest_byte_pos + 1] = (FX_INT32)(G * 255);

+            dest_scan[dest_byte_pos + 2] = (FX_INT32)(R * 255);

+            dest_byte_pos += 3;

+        }

+    } else {

+        int src_bit_pos = 0;

+        int dest_byte_pos = 0;

+        

+        FX_DWORD bpc = GetValidBpp();

+

+        for (int column = 0; column < m_Width; column ++) {

+            for (FX_DWORD color = 0; color < m_nComponents; color ++) {

+                int data = _GetBits8(src_scan, src_bit_pos, bpc);

+                color_values[color] = m_pCompData[color].m_DecodeMin +

+                                      m_pCompData[color].m_DecodeStep * data;

+                src_bit_pos += bpc;

+            }

+            if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK) {

+                FX_FLOAT k = 1.0f - color_values[3];

+                R = (1.0f - color_values[0]) * k;

+                G = (1.0f - color_values[1]) * k;

+                B = (1.0f - color_values[2]) * k;

+            } else {

+                m_pColorSpace->GetRGB(color_values, R, G, B);

+            }

+            R = NORMALCOLOR_MAX(R, 1);

+            G = NORMALCOLOR_MAX(G, 1);

+            B = NORMALCOLOR_MAX(B, 1);

+            dest_scan[dest_byte_pos] = (FX_INT32)(B * 255);

+            dest_scan[dest_byte_pos + 1] = (FX_INT32)(G * 255);

+            dest_scan[dest_byte_pos + 2] = (FX_INT32)(R * 255);

+            dest_byte_pos += 3;

+        }

+    }

+}

+FX_LPBYTE CPDF_DIBSource::GetBuffer() const

+{

+    if (m_pCachedBitmap) {

+        return m_pCachedBitmap->GetBuffer();

+    }

+    return NULL;

+}

+FX_LPCBYTE CPDF_DIBSource::GetScanline(int line) const

+{

+    FX_DWORD src_pitch = (m_Width * m_bpc * m_nComponents + 7) / 8;

+    FX_LPCBYTE pSrcLine = NULL;

+    if (m_pCachedBitmap) {

+        if (line >= m_pCachedBitmap->GetHeight()) {

+            line = m_pCachedBitmap->GetHeight() - 1;

+        }

+        pSrcLine = m_pCachedBitmap->GetScanline(line);

+    } else if (m_pDecoder) {

+        pSrcLine = m_pDecoder->GetScanline(line);

+    } else {

+        if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch) {

+            pSrcLine = m_pStreamAcc->GetData() + line * src_pitch;

+        }

+    }

+    if (pSrcLine == NULL) {

+        FX_LPBYTE pLineBuf = m_pMaskedLine ? m_pMaskedLine : m_pLineBuf;

+        FXSYS_memset8(pLineBuf, 0xff, m_Pitch);

+        return pLineBuf;

+    }

+    if (m_bpc * m_nComponents == 1) {

+        if (m_bImageMask && m_bDefaultDecode) {

+            for (FX_DWORD i = 0; i < src_pitch; i ++) {

+                m_pLineBuf[i] = ~pSrcLine[i];

+            }

+        } else if (m_bColorKey) {

+            FX_DWORD reset_argb, set_argb;

+            reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000;

+            set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff;

+            if (m_pCompData[0].m_ColorKeyMin == 0) {

+                reset_argb = 0;

+            }

+            if (m_pCompData[0].m_ColorKeyMax == 1) {

+                set_argb = 0;

+            }

+            set_argb = FXARGB_TODIB(set_argb);

+            reset_argb = FXARGB_TODIB(reset_argb);

+            FX_DWORD* dest_scan = (FX_DWORD*)m_pMaskedLine;

+            for (int col = 0; col < m_Width; col ++) {

+                if (pSrcLine[col / 8] & (1 << (7 - col % 8))) {

+                    *dest_scan = set_argb;

+                } else {

+                    *dest_scan = reset_argb;

+                }

+                dest_scan ++;

+            }

+            return m_pMaskedLine;

+        } else {

+            FXSYS_memcpy32(m_pLineBuf, pSrcLine, src_pitch);

+        }

+        return m_pLineBuf;

+    }

+    if (m_bpc * m_nComponents <= 8) {

+        if (m_bpc == 8) {

+            FXSYS_memcpy32(m_pLineBuf, pSrcLine, src_pitch);

+        } else {

+            int src_bit_pos = 0;

+            for (int col = 0; col < m_Width; col ++) {

+                int color_index = 0;

+                for (FX_DWORD color = 0; color < m_nComponents; color ++) {

+                    int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc);

+                    color_index |= data << (color * m_bpc);

+                    src_bit_pos += m_bpc;

+                }

+                m_pLineBuf[col] = color_index;

+            }

+        }

+        if (m_bColorKey) {

+            FX_LPBYTE pDestPixel = m_pMaskedLine;

+            FX_LPCBYTE pSrcPixel = m_pLineBuf;

+            for (int col = 0; col < m_Width; col ++) {

+                FX_BYTE index = *pSrcPixel++;

+                if (m_pPalette) {

+                    *pDestPixel++ = FXARGB_B(m_pPalette[index]);

+                    *pDestPixel++ = FXARGB_G(m_pPalette[index]);

+                    *pDestPixel++ = FXARGB_R(m_pPalette[index]);

+                } else {

+                    *pDestPixel++ = index;

+                    *pDestPixel++ = index;

+                    *pDestPixel++ = index;

+                }

+                *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || index > m_pCompData[0].m_ColorKeyMax) ? 0xff : 0;

+                pDestPixel ++ ;

+            }

+            return m_pMaskedLine;

+        }

+        return m_pLineBuf;

+    }

+    if (m_bColorKey) {

+        if (m_nComponents == 3 && m_bpc == 8) {

+            FX_LPBYTE alpha_channel = m_pMaskedLine + 3;

+            for (int col = 0; col < m_Width; col ++) {

+                FX_LPCBYTE pPixel = pSrcLine + col * 3;

+                alpha_channel[col * 4] = (pPixel[0] < m_pCompData[0].m_ColorKeyMin ||

+                                          pPixel[0] > m_pCompData[0].m_ColorKeyMax ||

+                                          pPixel[1] < m_pCompData[1].m_ColorKeyMin || pPixel[1] > m_pCompData[1].m_ColorKeyMax ||

+                                          pPixel[2] < m_pCompData[2].m_ColorKeyMin || pPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0;

+            }

+        } else {

+            FXSYS_memset8(m_pMaskedLine, 0xff, m_Pitch);

+        }

+    }

+    if (m_pColorSpace) {

+        TranslateScanline24bpp(m_pLineBuf, pSrcLine);

+        pSrcLine = m_pLineBuf;

+    }

+    if (m_bColorKey) {

+        FX_LPCBYTE pSrcPixel = pSrcLine;

+        FX_LPBYTE pDestPixel = m_pMaskedLine;

+        for (int col = 0; col < m_Width; col ++) {

+            *pDestPixel++ = *pSrcPixel++;

+            *pDestPixel++ = *pSrcPixel++;

+            *pDestPixel++ = *pSrcPixel++;

+            pDestPixel ++;

+        }

+        return m_pMaskedLine;

+    }

+    return pSrcLine;

+}

+FX_BOOL CPDF_DIBSource::SkipToScanline(int line, IFX_Pause* pPause) const

+{

+    if (m_pDecoder) {

+        return m_pDecoder->SkipToScanline(line, pPause);

+    }

+    return FALSE;

+}

+void CPDF_DIBSource::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,

+                                        int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const

+{

+    FX_DWORD src_width = m_Width;

+    FX_DWORD src_pitch = (src_width * m_bpc * m_nComponents + 7) / 8;

+    FX_LPCBYTE pSrcLine = NULL;

+    if (m_pCachedBitmap) {

+        pSrcLine = m_pCachedBitmap->GetScanline(line);

+    } else if (m_pDecoder) {

+        pSrcLine = m_pDecoder->GetScanline(line);

+    } else {

+        if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch) {

+            pSrcLine = m_pStreamAcc->GetData() + line * src_pitch;

+        }

+    }

+    int orig_Bpp = m_bpc * m_nComponents / 8;

+    int dest_Bpp = dest_bpp / 8;

+    if (pSrcLine == NULL) {

+        FXSYS_memset32(dest_scan, 0xff, dest_Bpp * clip_width);

+        return;

+    }

+    CFX_FixedBufGrow<FX_BYTE, 128> temp(orig_Bpp);

+    if (m_bpc * m_nComponents == 1) {

+        FX_DWORD set_argb = (FX_DWORD) - 1, reset_argb = 0;

+        if (m_bImageMask) {

+            if (m_bDefaultDecode) {

+                set_argb = 0;

+                reset_argb = (FX_DWORD) - 1;

+            }

+        } else if (m_bColorKey) {

+            reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000;

+            set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff;

+            if (m_pCompData[0].m_ColorKeyMin == 0) {

+                reset_argb = 0;

+            }

+            if (m_pCompData[0].m_ColorKeyMax == 1) {

+                set_argb = 0;

+            }

+            set_argb = FXARGB_TODIB(set_argb);

+            reset_argb = FXARGB_TODIB(reset_argb);

+            for (int i = 0; i < clip_width; i ++) {

+                FX_DWORD src_x = (clip_left + i) * src_width / dest_width;

+                if (bFlipX) {

+                    src_x = src_width - src_x - 1;

+                }

+                src_x %= src_width;

+                if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {

+                    ((FX_DWORD*)dest_scan)[i] = set_argb;

+                } else {

+                    ((FX_DWORD*)dest_scan)[i] = reset_argb;

+                }

+            }

+            return;

+        } else {

+            if (dest_Bpp == 1) {

+            } else if (m_pPalette) {

+                reset_argb = m_pPalette[0];

+                set_argb = m_pPalette[1];

+            }

+        }

+        for (int i = 0; i < clip_width; i ++) {

+            FX_DWORD src_x = (clip_left + i) * src_width / dest_width;

+            if (bFlipX) {

+                src_x = src_width - src_x - 1;

+            }

+            src_x %= src_width;

+            int dest_pos = i * dest_Bpp;

+            if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {

+                if (dest_Bpp == 1) {

+                    dest_scan[dest_pos] = (FX_BYTE)set_argb;

+                } else if (dest_Bpp == 3) {

+                    dest_scan[dest_pos] = FXARGB_B(set_argb);

+                    dest_scan[dest_pos + 1] = FXARGB_G(set_argb);

+                    dest_scan[dest_pos + 2] = FXARGB_R(set_argb);

+                } else {

+                    *(FX_DWORD*)(dest_scan + dest_pos) = set_argb;

+                }

+            } else {

+                if (dest_Bpp == 1) {

+                    dest_scan[dest_pos] = (FX_BYTE)reset_argb;

+                } else if (dest_Bpp == 3) {

+                    dest_scan[dest_pos] = FXARGB_B(reset_argb);

+                    dest_scan[dest_pos + 1] = FXARGB_G(reset_argb);

+                    dest_scan[dest_pos + 2] = FXARGB_R(reset_argb);

+                } else {

+                    *(FX_DWORD*)(dest_scan + dest_pos) = reset_argb;

+                }

+            }

+        }

+        return;

+    } else if (m_bpc * m_nComponents <= 8) {

+        if (m_bpc < 8) {

+            int src_bit_pos = 0;

+            for (FX_DWORD col = 0; col < src_width; col ++) {

+                int color_index = 0;

+                for (FX_DWORD color = 0; color < m_nComponents; color ++) {

+                    int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc);

+                    color_index |= data << (color * m_bpc);

+                    src_bit_pos += m_bpc;

+                }

+                m_pLineBuf[col] = color_index;

+            }

+            pSrcLine = m_pLineBuf;

+        }

+        if (m_bColorKey) {

+            for (int i = 0; i < clip_width; i ++) {

+                FX_DWORD src_x = (clip_left + i) * src_width / dest_width;

+                if (bFlipX) {

+                    src_x = src_width - src_x - 1;

+                }

+                src_x %= src_width;

+                FX_LPBYTE pDestPixel = dest_scan + i * 4;

+                FX_BYTE index = pSrcLine[src_x];

+                if (m_pPalette) {

+                    *pDestPixel++ = FXARGB_B(m_pPalette[index]);

+                    *pDestPixel++ = FXARGB_G(m_pPalette[index]);

+                    *pDestPixel++ = FXARGB_R(m_pPalette[index]);

+                } else {

+                    *pDestPixel++ = index;

+                    *pDestPixel++ = index;

+                    *pDestPixel++ = index;

+                }

+                *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || index > m_pCompData[0].m_ColorKeyMax) ? 0xff : 0;

+            }

+            return;

+        }

+        for (int i = 0; i < clip_width; i ++) {

+            FX_DWORD src_x = (clip_left + i) * src_width / dest_width;

+            if (bFlipX) {

+                src_x = src_width - src_x - 1;

+            }

+            src_x %= src_width;

+            FX_BYTE index = pSrcLine[src_x];

+            if (dest_Bpp == 1) {

+                dest_scan[i] = index;

+            } else {

+                int dest_pos = i * dest_Bpp;

+                FX_ARGB argb = m_pPalette[index];

+                dest_scan[dest_pos] = FXARGB_B(argb);

+                dest_scan[dest_pos + 1] = FXARGB_G(argb);

+                dest_scan[dest_pos + 2] = FXARGB_R(argb);

+            }

+        }

+        return;

+    } else {

+        int last_src_x = -1;

+        FX_ARGB last_argb;

+        FX_FLOAT orig_Not8Bpp = (FX_FLOAT)m_bpc * (FX_FLOAT)m_nComponents / 8.0f;

+        FX_FLOAT unit_To8Bpc = 255.0f / ((1 << m_bpc) - 1);

+        for (int i = 0; i < clip_width; i ++) {

+            int dest_x = clip_left + i;

+            FX_DWORD src_x = (bFlipX ? (dest_width - dest_x - 1) : dest_x) * (FX_INT64)src_width / dest_width;

+            src_x %= src_width;

+            FX_LPCBYTE pSrcPixel = NULL;

+            if (m_bpc % 8 == 0) {

+                pSrcPixel = pSrcLine + src_x * orig_Bpp;

+            } else {

+                pSrcPixel = pSrcLine + (int)(src_x * orig_Not8Bpp);

+            }

+            FX_LPBYTE pDestPixel = dest_scan + i * dest_Bpp;

+            FX_ARGB argb;

+            if (src_x == last_src_x) {

+                argb = last_argb;

+            } else {

+                if (m_pColorSpace) {

+                    FX_BYTE color[4];

+                    if (!m_bDefaultDecode) {

+                        for (int i = 0; i < orig_Bpp; i ++) {

+                            int color_value = (int)((m_pCompData[i].m_DecodeMin + m_pCompData[i].m_DecodeStep * (FX_FLOAT)pSrcPixel[i]) * 255.0f + 0.5f);

+                            temp[i] = color_value > 255 ? 255 : (color_value < 0 ? 0 : color_value);

+                        }

+                        m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);

+                    } else {

+                        if (m_bpc < 8) {

+                            int src_bit_pos = 0;

+                            if (src_x % 2) {

+                                src_bit_pos = 4;

+                            }

+                            int value = (1 << m_bpc)  - 1;

+                            for (FX_DWORD i = 0; i < m_nComponents; i ++) {

+                                temp[i] = (FX_BYTE)(_GetBits8(pSrcPixel, src_bit_pos, m_bpc) * unit_To8Bpc);

+                                src_bit_pos += m_bpc;

+                            }

+                            m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);

+                        } else {

+                            m_pColorSpace->TranslateImageLine(color, pSrcPixel, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);

+                        }

+                    }

+                    argb = FXARGB_MAKE(0xff, color[2], color[1], color[0]);

+                } else {

+                    argb = FXARGB_MAKE(0xff, pSrcPixel[2], pSrcPixel[1], pSrcPixel[0]);

+                }

+                if (m_bColorKey) {

+                    int alpha = 0xff;

+                    if (m_nComponents == 3 && m_bpc == 8) {

+                        alpha = (pSrcPixel[0] < m_pCompData[0].m_ColorKeyMin ||

+                                 pSrcPixel[0] > m_pCompData[0].m_ColorKeyMax ||

+                                 pSrcPixel[1] < m_pCompData[1].m_ColorKeyMin ||

+                                 pSrcPixel[1] > m_pCompData[1].m_ColorKeyMax ||

+                                 pSrcPixel[2] < m_pCompData[2].m_ColorKeyMin ||

+                                 pSrcPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0;

+                    }

+                    argb &= 0xffffff;

+                    argb |= alpha << 24;

+                }

+                last_src_x = src_x;

+                last_argb = argb;

+            }

+            if (dest_Bpp == 4) {

+                *(FX_DWORD*)pDestPixel = FXARGB_TODIB(argb);

+            } else {

+                *pDestPixel++ = FXARGB_B(argb);

+                *pDestPixel++ = FXARGB_G(argb);

+                *pDestPixel = FXARGB_R(argb);

+            }

+        }

+    }

+}

+void CPDF_DIBSource::SetDownSampleSize(int dest_width, int dest_height) const

+{

+    if (m_pDecoder) {

+        m_pDecoder->DownScale(dest_width, dest_height);

+        ((CPDF_DIBSource*)this)->m_Width = m_pDecoder->GetWidth();

+        ((CPDF_DIBSource*)this)->m_Height = m_pDecoder->GetHeight();

+    }

+}

+void CPDF_DIBSource::ClearImageData()

+{

+    if (m_pDecoder) {

+        m_pDecoder->ClearImageData();

+    }

+}

+CPDF_ProgressiveImageLoaderHandle::CPDF_ProgressiveImageLoaderHandle()

+{

+    m_pImageLoader = NULL;

+    m_pCache = NULL;

+    m_pImage = NULL;

+}

+CPDF_ProgressiveImageLoaderHandle::~CPDF_ProgressiveImageLoaderHandle()

+{

+    m_pImageLoader = NULL;

+    m_pCache = NULL;

+    m_pImage = NULL;

+}

+FX_BOOL CPDF_ProgressiveImageLoaderHandle::Start(CPDF_ImageLoader* pImageLoader, const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 nDownsampleWidth, FX_INT32 nDownsampleHeight)

+{

+    m_pImageLoader = pImageLoader;

+    m_pCache = pCache;

+    m_pImage = (CPDF_ImageObject*)pImage;

+    m_nDownsampleWidth = nDownsampleWidth;

+    m_nDownsampleHeight = nDownsampleHeight;

+    FX_BOOL ret;

+    if (pCache) {

+        ret = pCache->StartGetCachedBitmap(pImage->m_pImage->GetStream(), bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);

+        if (ret == FALSE) {

+            m_pImageLoader->m_bCached = TRUE;

+            m_pImageLoader->m_pBitmap = pCache->m_pCurImageCache->DetachBitmap();

+            m_pImageLoader->m_pMask = pCache->m_pCurImageCache->DetachMask();

+            m_pImageLoader->m_MatteColor = pCache->m_pCurImageCache->m_MatteColor;

+        }

+    } else {

+        ret = pImage->m_pImage->StartLoadDIBSource(pRenderStatus->m_pFormResource, pRenderStatus->m_pPageResource, bStdCS, GroupFamily, bLoadMask);

+        if (ret == FALSE) {

+            m_pImageLoader->m_bCached = FALSE;

+            m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap();

+            m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask();

+            m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor;

+        }

+    }

+    return ret;

+}

+FX_BOOL CPDF_ProgressiveImageLoaderHandle::Continue(IFX_Pause* pPause)

+{

+    FX_BOOL ret;

+    if (m_pCache) {

+        ret = m_pCache->Continue(pPause);

+        if (ret == FALSE) {

+            m_pImageLoader->m_bCached = TRUE;

+            m_pImageLoader->m_pBitmap = m_pCache->m_pCurImageCache->DetachBitmap();

+            m_pImageLoader->m_pMask = m_pCache->m_pCurImageCache->DetachMask();

+            m_pImageLoader->m_MatteColor = m_pCache->m_pCurImageCache->m_MatteColor;

+        }

+    } else {

+        ret = m_pImage->m_pImage->Continue(pPause);

+        if (ret == FALSE) {

+            m_pImageLoader->m_bCached = FALSE;

+            m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap();

+            m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask();

+            m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor;

+        }

+    }

+    return ret;

+}

+FX_BOOL CPDF_ImageLoader::Load(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus)

+{

+    if (pImage == NULL) {

+        return FALSE;

+    }

+    if (pCache) {

+        pCache->GetCachedBitmap(pImage->m_pImage->GetStream(), m_pBitmap, m_pMask, m_MatteColor, bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);

+        m_bCached = TRUE;

+    } else {

+        m_pBitmap = pImage->m_pImage->LoadDIBSource(&m_pMask, &m_MatteColor, bStdCS, GroupFamily, bLoadMask);

+        m_bCached = FALSE;

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_ImageLoader::StartLoadImage(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_LPVOID& LoadHandle, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 nDownsampleWidth, FX_INT32 nDownsampleHeight)

+{

+    m_nDownsampleWidth = nDownsampleWidth;

+    m_nDownsampleHeight = nDownsampleHeight;

+    CPDF_ProgressiveImageLoaderHandle* pLoaderHandle = NULL;

+    pLoaderHandle =	FX_NEW CPDF_ProgressiveImageLoaderHandle;

+    FX_BOOL ret = pLoaderHandle->Start(this, pImage, pCache, bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);

+    LoadHandle = pLoaderHandle;

+    return ret;

+}

+FX_BOOL	CPDF_ImageLoader::Continue(FX_LPVOID LoadHandle, IFX_Pause* pPause)

+{

+    return ((CPDF_ProgressiveImageLoaderHandle*)LoadHandle)->Continue(pPause);

+}

+CPDF_ImageLoader::~CPDF_ImageLoader()

+{

+    if (!m_bCached) {

+        if (m_pBitmap) {

+            delete m_pBitmap;

+            m_pBitmap = NULL;

+        }

+        if (m_pMask) {

+            delete m_pMask;

+        }

+    }

+}

diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
new file mode 100644
index 0000000..8cc30a7
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
@@ -0,0 +1,1093 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fpdfapi/fpdf_render.h"

+#include "../../../include/fpdfapi/fpdf_pageobj.h"

+#include "../../../include/fxge/fx_ge.h"

+#include "../fpdf_page/pageint.h"

+#include "render_int.h"

+#define SHADING_STEPS 256

+static void _DrawAxialShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,

+                              CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,

+                              CPDF_ColorSpace* pCS, int alpha)

+{

+    ASSERT(pBitmap->GetFormat() == FXDIB_Argb);

+    CPDF_Array* pCoords = pDict->GetArray(FX_BSTRC("Coords"));

+    if (pCoords == NULL) {

+        return;

+    }

+    FX_FLOAT start_x = pCoords->GetNumber(0);

+    FX_FLOAT start_y = pCoords->GetNumber(1);

+    FX_FLOAT end_x = pCoords->GetNumber(2);

+    FX_FLOAT end_y = pCoords->GetNumber(3);

+    FX_FLOAT t_min = 0, t_max = 1.0f;

+    CPDF_Array* pArray = pDict->GetArray(FX_BSTRC("Domain"));

+    if (pArray) {

+        t_min = pArray->GetNumber(0);

+        t_max = pArray->GetNumber(1);

+    }

+    FX_BOOL bStartExtend = FALSE, bEndExtend = FALSE;

+    pArray = pDict->GetArray(FX_BSTRC("Extend"));

+    if (pArray) {

+        bStartExtend = pArray->GetInteger(0);

+        bEndExtend = pArray->GetInteger(1);

+    }

+    int width = pBitmap->GetWidth();

+    int height = pBitmap->GetHeight();

+    FX_FLOAT x_span = end_x - start_x;

+    FX_FLOAT y_span = end_y - start_y;

+    FX_FLOAT axis_len_square = FXSYS_Mul(x_span, x_span) + FXSYS_Mul(y_span, y_span);

+    CFX_AffineMatrix matrix;

+    matrix.SetReverse(*pObject2Bitmap);

+    int total_results = 0;

+    for (int j = 0; j < nFuncs; j ++) {

+        if (pFuncs[j]) {

+            total_results += pFuncs[j]->CountOutputs();

+        }

+    }

+    if (pCS->CountComponents() > total_results) {

+        total_results = pCS->CountComponents();

+    }

+    CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);

+    FX_FLOAT* pResults = result_array;

+    FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));

+    FX_DWORD rgb_array[SHADING_STEPS];

+    for (int i = 0; i < SHADING_STEPS; i ++) {

+        FX_FLOAT input = (t_max - t_min) * i / SHADING_STEPS + t_min;

+        int offset = 0;

+        for (int j = 0; j < nFuncs; j ++) {

+            if (pFuncs[j]) {

+                int nresults = 0;

+                if (pFuncs[j]->Call(&input, 1, pResults + offset, nresults)) {

+                    offset += nresults;

+                }

+            }

+        }

+        FX_FLOAT R, G, B;

+        pCS->GetRGB(pResults, R, G, B);

+        rgb_array[i] = FXARGB_TODIB(FXARGB_MAKE(alpha, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));

+    }

+    int pitch = pBitmap->GetPitch();

+    int Bpp = pBitmap->GetBPP() / 8;

+    for (int row = 0; row < height; row ++) {

+        FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);

+        for (int column = 0; column < width; column ++) {

+            FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;

+            matrix.Transform(x, y);

+            FX_FLOAT scale = FXSYS_Div(FXSYS_Mul(x - start_x, x_span) + FXSYS_Mul(y - start_y, y_span), axis_len_square);

+            int index = (FX_INT32)(scale * (SHADING_STEPS - 1));

+            if (index < 0) {

+                if (!bStartExtend) {

+                    continue;

+                }

+                index = 0;

+            } else if (index >= SHADING_STEPS) {

+                if (!bEndExtend) {

+                    continue;

+                }

+                index = SHADING_STEPS - 1;

+            }

+            dib_buf[column] = rgb_array[index];

+        }

+    }

+}

+static void _DrawRadialShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,

+                               CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,

+                               CPDF_ColorSpace* pCS, int alpha)

+{

+    ASSERT(pBitmap->GetFormat() == FXDIB_Argb);

+    CPDF_Array* pCoords = pDict->GetArray(FX_BSTRC("Coords"));

+    if (pCoords == NULL) {

+        return;

+    }

+    FX_FLOAT start_x = pCoords->GetNumber(0);

+    FX_FLOAT start_y = pCoords->GetNumber(1);

+    FX_FLOAT start_r = pCoords->GetNumber(2);

+    FX_FLOAT end_x = pCoords->GetNumber(3);

+    FX_FLOAT end_y = pCoords->GetNumber(4);

+    FX_FLOAT end_r = pCoords->GetNumber(5);

+    CFX_AffineMatrix matrix;

+    matrix.SetReverse(*pObject2Bitmap);

+    FX_FLOAT t_min = 0, t_max = 1.0f;

+    CPDF_Array* pArray = pDict->GetArray(FX_BSTRC("Domain"));

+    if (pArray) {

+        t_min = pArray->GetNumber(0);

+        t_max = pArray->GetNumber(1);

+    }

+    FX_BOOL bStartExtend = FALSE, bEndExtend = FALSE;

+    pArray = pDict->GetArray(FX_BSTRC("Extend"));

+    if (pArray) {

+        bStartExtend = pArray->GetInteger(0);

+        bEndExtend = pArray->GetInteger(1);

+    }

+    int total_results = 0;

+    for (int j = 0; j < nFuncs; j ++) {

+        if (pFuncs[j]) {

+            total_results += pFuncs[j]->CountOutputs();

+        }

+    }

+    if (pCS->CountComponents() > total_results) {

+        total_results = pCS->CountComponents();

+    }

+    CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);

+    FX_FLOAT* pResults = result_array;

+    FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));

+    FX_DWORD rgb_array[SHADING_STEPS];

+    for (int i = 0; i < SHADING_STEPS; i ++) {

+        FX_FLOAT input = (t_max - t_min) * i / SHADING_STEPS + t_min;

+        int offset = 0;

+        for (int j = 0; j < nFuncs; j ++) {

+            if (pFuncs[j]) {

+                int nresults;

+                if (pFuncs[j]->Call(&input, 1, pResults + offset, nresults)) {

+                    offset += nresults;

+                }

+            }

+        }

+        FX_FLOAT R, G, B;

+        pCS->GetRGB(pResults, R, G, B);

+        rgb_array[i] = FXARGB_TODIB(FXARGB_MAKE(alpha, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));

+    }

+    FX_FLOAT a = FXSYS_Mul(start_x - end_x, start_x - end_x) +

+                 FXSYS_Mul(start_y - end_y, start_y - end_y) - FXSYS_Mul(start_r - end_r, start_r - end_r);

+    int width = pBitmap->GetWidth();

+    int height = pBitmap->GetHeight();

+    int pitch = pBitmap->GetPitch();

+    int Bpp = pBitmap->GetBPP() / 8;

+    FX_BOOL bDecreasing = FALSE;

+    if (start_r > end_r) {

+        int length = (int)FXSYS_sqrt((FXSYS_Mul(start_x - end_x, start_x - end_x) + FXSYS_Mul(start_y - end_y, start_y - end_y)));

+        if (length < start_r - end_r) {

+            bDecreasing = TRUE;

+        }

+    }

+    for (int row = 0; row < height; row ++) {

+        FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);

+        for (int column = 0; column < width; column ++) {

+            FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;

+            matrix.Transform(x, y);

+            FX_FLOAT b = -2 * (FXSYS_Mul(x - start_x, end_x - start_x) + FXSYS_Mul(y - start_y, end_y - start_y) +

+                               FXSYS_Mul(start_r, end_r - start_r));

+            FX_FLOAT c = FXSYS_Mul(x - start_x, x - start_x) + FXSYS_Mul(y - start_y, y - start_y) -

+                         FXSYS_Mul(start_r, start_r);

+            FX_FLOAT s;

+            if (a == 0) {

+                s = FXSYS_Div(-c, b);

+            } else {

+                FX_FLOAT b2_4ac = FXSYS_Mul(b, b) - 4 * FXSYS_Mul(a, c);

+                if (b2_4ac < 0) {

+                    continue;

+                }

+                FX_FLOAT root = FXSYS_sqrt(b2_4ac);

+                FX_FLOAT s1, s2;

+                if (a > 0) {

+                    s1 = FXSYS_Div(-b - root, 2 * a);

+                    s2 = FXSYS_Div(-b + root, 2 * a);

+                } else {

+                    s2 = FXSYS_Div(-b - root, 2 * a);

+                    s1 = FXSYS_Div(-b + root, 2 * a);

+                }

+                if (bDecreasing) {

+                    if (s1 >= 0 || bStartExtend) {

+                        s = s1;

+                    } else {

+                        s = s2;

+                    }

+                } else {

+                    if (s2 <= 1.0f || bEndExtend) {

+                        s = s2;

+                    } else {

+                        s = s1;

+                    }

+                }

+                if ((start_r + s * (end_r - start_r)) < 0) {

+                    continue;

+                }

+            }

+            int index = (FX_INT32)(s * (SHADING_STEPS - 1));

+            if (index < 0) {

+                if (!bStartExtend) {

+                    continue;

+                }

+                index = 0;

+            }

+            if (index >= SHADING_STEPS) {

+                if (!bEndExtend) {

+                    continue;

+                }

+                index = SHADING_STEPS - 1;

+            }

+            dib_buf[column] = rgb_array[index];

+        }

+    }

+}

+static void _DrawFuncShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,

+                             CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,

+                             CPDF_ColorSpace* pCS, int alpha)

+{

+    ASSERT(pBitmap->GetFormat() == FXDIB_Argb);

+    CPDF_Array* pDomain = pDict->GetArray(FX_BSTRC("Domain"));

+    FX_FLOAT xmin = 0, ymin = 0, xmax = 1.0f, ymax = 1.0f;

+    if (pDomain) {

+        xmin = pDomain->GetNumber(0);

+        xmax = pDomain->GetNumber(1);

+        ymin = pDomain->GetNumber(2);

+        ymax = pDomain->GetNumber(3);

+    }

+    CFX_AffineMatrix mtDomain2Target = pDict->GetMatrix(FX_BSTRC("Matrix"));

+    CFX_AffineMatrix matrix, reverse_matrix;

+    matrix.SetReverse(*pObject2Bitmap);

+    reverse_matrix.SetReverse(mtDomain2Target);

+    matrix.Concat(reverse_matrix);

+    int width = pBitmap->GetWidth();

+    int height = pBitmap->GetHeight();

+    int pitch = pBitmap->GetPitch();

+    int Bpp = pBitmap->GetBPP() / 8;

+    int total_results = 0;

+    for (int j = 0; j < nFuncs; j ++) {

+        if (pFuncs[j]) {

+            total_results += pFuncs[j]->CountOutputs();

+        }

+    }

+    if (pCS->CountComponents() > total_results) {

+        total_results = pCS->CountComponents();

+    }

+    CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);

+    FX_FLOAT* pResults = result_array;

+    FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));

+    for (int row = 0; row < height; row ++) {

+        FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);

+        for (int column = 0; column < width; column ++) {

+            FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;

+            matrix.Transform(x, y);

+            if (x < xmin || x > xmax || y < ymin || y > ymax) {

+                continue;

+            }

+            FX_FLOAT input[2];

+            int offset = 0;

+            input[0] = x;

+            input[1] = y;

+            for (int j = 0; j < nFuncs; j ++) {

+                if (pFuncs[j]) {

+                    int nresults;

+                    if (pFuncs[j]->Call(input, 2, pResults + offset, nresults)) {

+                        offset += nresults;

+                    }

+                }

+            }

+            FX_FLOAT R, G, B;

+            pCS->GetRGB(pResults, R, G, B);

+            dib_buf[column] = FXARGB_TODIB(FXARGB_MAKE(alpha, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255)));

+        }

+    }

+}

+FX_BOOL _GetScanlineIntersect(int y, FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_FLOAT& x)

+{

+    if (y1 == y2) {

+        return FALSE;

+    }

+    if (y1 < y2) {

+        if (y < y1 || y > y2) {

+            return FALSE;

+        }

+    } else {

+        if (y < y2 || y > y1) {

+            return FALSE;

+        }

+    }

+    x = x1 + FXSYS_MulDiv(x2 - x1, y - y1, y2 - y1);

+    return TRUE;

+}

+static void _DrawGouraud(CFX_DIBitmap* pBitmap, int alpha, CPDF_MeshVertex triangle[3])

+{

+    FX_FLOAT min_y = triangle[0].y, max_y = triangle[0].y;

+    for (int i = 1; i < 3; i ++) {

+        if (min_y > triangle[i].y) {

+            min_y = triangle[i].y;

+        }

+        if (max_y < triangle[i].y) {

+            max_y = triangle[i].y;

+        }

+    }

+    if (min_y == max_y) {

+        return;

+    }

+    int min_yi = (int)FXSYS_floor(min_y), max_yi = (int)FXSYS_ceil(max_y);

+    if (min_yi < 0) {

+        min_yi = 0;

+    }

+    if (max_yi >= pBitmap->GetHeight()) {

+        max_yi = pBitmap->GetHeight() - 1;

+    }

+    for (int y = min_yi; y <= max_yi; y ++) {

+        int nIntersects = 0;

+        FX_FLOAT inter_x[3], r[3], g[3], b[3];

+        for (int i = 0; i < 3; i ++) {

+            CPDF_MeshVertex& vertex1 = triangle[i];

+            CPDF_MeshVertex& vertex2 = triangle[(i + 1) % 3];

+            FX_BOOL bIntersect = _GetScanlineIntersect(y, vertex1.x, vertex1.y,

+                                 vertex2.x, vertex2.y, inter_x[nIntersects]);

+            if (!bIntersect) {

+                continue;

+            }

+            r[nIntersects] = vertex1.r + FXSYS_MulDiv(vertex2.r - vertex1.r, y - vertex1.y, vertex2.y - vertex1.y);

+            g[nIntersects] = vertex1.g + FXSYS_MulDiv(vertex2.g - vertex1.g, y - vertex1.y, vertex2.y - vertex1.y);

+            b[nIntersects] = vertex1.b + FXSYS_MulDiv(vertex2.b - vertex1.b, y - vertex1.y, vertex2.y - vertex1.y);

+            nIntersects ++;

+        }

+        if (nIntersects != 2) {

+            continue;

+        }

+        int min_x, max_x, start_index, end_index;

+        if (inter_x[0] < inter_x[1]) {

+            min_x = (int)FXSYS_floor(inter_x[0]);

+            max_x = (int)FXSYS_ceil(inter_x[1]);

+            start_index = 0;

+            end_index = 1;

+        } else {

+            min_x = (int)FXSYS_floor(inter_x[1]);

+            max_x = (int)FXSYS_ceil(inter_x[0]);

+            start_index = 1;

+            end_index = 0;

+        }

+        int start_x = min_x, end_x = max_x;

+        if (start_x < 0) {

+            start_x = 0;

+        }

+        if (end_x > pBitmap->GetWidth()) {

+            end_x = pBitmap->GetWidth();

+        }

+        FX_LPBYTE dib_buf = pBitmap->GetBuffer() + y * pBitmap->GetPitch() + start_x * 4;

+        FX_FLOAT r_unit = (r[end_index] - r[start_index]) / (max_x - min_x);

+        FX_FLOAT g_unit = (g[end_index] - g[start_index]) / (max_x - min_x);

+        FX_FLOAT b_unit = (b[end_index] - b[start_index]) / (max_x - min_x);

+        FX_FLOAT R = r[start_index] + (start_x - min_x) * r_unit;

+        FX_FLOAT G = g[start_index] + (start_x - min_x) * g_unit;

+        FX_FLOAT B = b[start_index] + (start_x - min_x) * b_unit;

+        for (int x = start_x; x < end_x; x ++) {

+            R += r_unit;

+            G += g_unit;

+            B += b_unit;

+            FXARGB_SETDIB(dib_buf, FXARGB_MAKE(alpha, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255)));

+            dib_buf += 4;

+        }

+    }

+}

+static void _DrawFreeGouraudShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,

+                                    CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,

+                                    CPDF_ColorSpace* pCS, int alpha)

+{

+    ASSERT(pBitmap->GetFormat() == FXDIB_Argb);

+    if (pShadingStream->GetType() != PDFOBJ_STREAM) {

+        return;

+    }

+    CPDF_MeshStream stream;

+    if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {

+        return;

+    }

+    CPDF_MeshVertex triangle[3];

+    while (!stream.m_BitStream.IsEOF()) {

+        CPDF_MeshVertex vertex;

+        FX_DWORD flag = stream.GetVertex(vertex, pObject2Bitmap);

+        if (flag == 0) {

+            triangle[0] = vertex;

+            for (int j = 1; j < 3; j ++) {

+                stream.GetVertex(triangle[j], pObject2Bitmap);

+            }

+        } else {

+            if (flag == 1) {

+                triangle[0] = triangle[1];

+            }

+            triangle[1] = triangle[2];

+            triangle[2] = vertex;

+        }

+        _DrawGouraud(pBitmap, alpha, triangle);

+    }

+}

+static void _DrawLatticeGouraudShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,

+                                       CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,

+                                       CPDF_ColorSpace* pCS, int alpha)

+{

+    ASSERT(pBitmap->GetFormat() == FXDIB_Argb);

+    if (pShadingStream->GetType() != PDFOBJ_STREAM) {

+        return;

+    }

+    int row_verts = pShadingStream->GetDict()->GetInteger("VerticesPerRow");

+    if (row_verts < 2) {

+        return;

+    }

+    CPDF_MeshStream stream;

+    if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {

+        return;

+    }

+    CPDF_MeshVertex* vertex = FX_Alloc(CPDF_MeshVertex, row_verts * 2);

+    if (!stream.GetVertexRow(vertex, row_verts, pObject2Bitmap)) {

+        FX_Free(vertex);

+        return;

+    }

+    int last_index = 0;

+    while (1) {

+        CPDF_MeshVertex* last_row = vertex + last_index * row_verts;

+        CPDF_MeshVertex* this_row = vertex + (1 - last_index) * row_verts;

+        if (!stream.GetVertexRow(this_row, row_verts, pObject2Bitmap)) {

+            FX_Free(vertex);

+            return;

+        }

+        CPDF_MeshVertex triangle[3];

+        for (int i = 1; i < row_verts; i ++) {

+            triangle[0] = last_row[i];

+            triangle[1] = this_row[i - 1];

+            triangle[2] = last_row[i - 1];

+            _DrawGouraud(pBitmap, alpha, triangle);

+            triangle[2] = this_row[i];

+            _DrawGouraud(pBitmap, alpha, triangle);

+        }

+        last_index = 1 - last_index;

+    }

+    FX_Free(vertex);

+}

+struct Coon_BezierCoeff {

+    float a, b, c, d;

+    void FromPoints(float p0, float p1, float p2, float p3)

+    {

+        a = -p0 + 3 * p1 - 3 * p2 + p3;

+        b = 3 * p0 - 6 * p1 + 3 * p2;

+        c = -3 * p0 + 3 * p1;

+        d = p0;

+    }

+    Coon_BezierCoeff first_half()

+    {

+        Coon_BezierCoeff result;

+        result.a = a / 8;

+        result.b = b / 4;

+        result.c = c / 2;

+        result.d = d;

+        return result;

+    }

+    Coon_BezierCoeff second_half()

+    {

+        Coon_BezierCoeff result;

+        result.a = a / 8;

+        result.b = 3 * a / 8 + b / 4;

+        result.c = 3 * a / 8 + b / 2 + c / 2;

+        result.d = a / 8 + b / 4 + c / 2 + d;

+        return result;

+    }

+    void GetPoints(float p[4])

+    {

+        p[0] = d;

+        p[1] = c / 3 + p[0];

+        p[2] = b / 3 - p[0] + 2 * p[1];

+        p[3] = a + p[0] - 3 * p[1] + 3 * p[2];

+    }

+    void GetPointsReverse(float p[4])

+    {

+        p[3] = d;

+        p[2] = c / 3 + p[3];

+        p[1] = b / 3 - p[3] + 2 * p[2];

+        p[0] = a + p[3] - 3 * p[2] + 3 * p[1];

+    }

+    void BezierInterpol(Coon_BezierCoeff& C1, Coon_BezierCoeff& C2, Coon_BezierCoeff& D1, Coon_BezierCoeff& D2)

+    {

+        a = (D1.a + D2.a) / 2;

+        b = (D1.b + D2.b) / 2;

+        c = (D1.c + D2.c) / 2 - (C1.a / 8 + C1.b / 4 + C1.c / 2) + (C2.a / 8 + C2.b / 4) + (-C1.d + D2.d) / 2 - (C2.a + C2.b) / 2;

+        d = C1.a / 8 + C1.b / 4 + C1.c / 2 + C1.d;

+    }

+    float Distance()

+    {

+        float dis = a + b + c;

+        return dis < 0 ? -dis : dis;

+    }

+};

+struct Coon_Bezier {

+    Coon_BezierCoeff x, y;

+    void FromPoints(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3)

+    {

+        x.FromPoints(x0, x1, x2, x3);

+        y.FromPoints(y0, y1, y2, y3);

+    }

+    Coon_Bezier first_half()

+    {

+        Coon_Bezier result;

+        result.x = x.first_half();

+        result.y = y.first_half();

+        return result;

+    }

+    Coon_Bezier second_half()

+    {

+        Coon_Bezier result;

+        result.x = x.second_half();

+        result.y = y.second_half();

+        return result;

+    }

+    void BezierInterpol(Coon_Bezier& C1, Coon_Bezier& C2, Coon_Bezier& D1, Coon_Bezier& D2)

+    {

+        x.BezierInterpol(C1.x, C2.x, D1.x, D2.x);

+        y.BezierInterpol(C1.y, C2.y, D1.y, D2.y);

+    }

+    void GetPoints(FX_PATHPOINT* pPoints)

+    {

+        float p[4];

+        int i;

+        x.GetPoints(p);

+        for (i = 0; i < 4; i ++) {

+            pPoints[i].m_PointX = p[i];

+        }

+        y.GetPoints(p);

+        for (i = 0; i < 4; i ++) {

+            pPoints[i].m_PointY = p[i];

+        }

+    }

+    void GetPointsReverse(FX_PATHPOINT* pPoints)

+    {

+        float p[4];

+        int i;

+        x.GetPointsReverse(p);

+        for (i = 0; i < 4; i ++) {

+            pPoints[i].m_PointX = p[i];

+        }

+        y.GetPointsReverse(p);

+        for (i = 0; i < 4; i ++) {

+            pPoints[i].m_PointY = p[i];

+        }

+    }

+    float Distance()

+    {

+        return x.Distance() + y.Distance();

+    }

+};

+static int _BiInterpol(int c0, int c1, int c2, int c3, int x, int y, int x_scale, int y_scale)

+{

+    int x1 = c0 + (c3 - c0) * x / x_scale;

+    int x2 = c1 + (c2 - c1) * x / x_scale;

+    return x1 + (x2 - x1) * y / y_scale;

+}

+struct Coon_Color {

+    Coon_Color()

+    {

+        FXSYS_memset32(comp, 0, sizeof(int) * 3);

+    }

+    int		comp[3];

+    void	BiInterpol(Coon_Color colors[4], int x, int y, int x_scale, int y_scale)

+    {

+        for (int i = 0; i < 3; i ++)

+            comp[i] = _BiInterpol(colors[0].comp[i], colors[1].comp[i], colors[2].comp[i], colors[3].comp[i],

+                                  x, y, x_scale, y_scale);

+    }

+    int		Distance(Coon_Color& o)

+    {

+        int max, diff;

+        max = FXSYS_abs(comp[0] - o.comp[0]);

+        diff = FXSYS_abs(comp[1] - o.comp[1]);

+        if (max < diff) {

+            max = diff;

+        }

+        diff = FXSYS_abs(comp[2] - o.comp[2]);

+        if (max < diff) {

+            max = diff;

+        }

+        return max;

+    }

+};

+struct CPDF_PatchDrawer {

+    Coon_Color			patch_colors[4];

+    int					max_delta;

+    CFX_PathData		path;

+    CFX_RenderDevice*	pDevice;

+    int					fill_mode;

+    int					alpha;

+    void Draw(int x_scale, int y_scale, int left, int bottom, Coon_Bezier C1, Coon_Bezier C2, Coon_Bezier D1, Coon_Bezier D2)

+    {

+        FX_BOOL bSmall = C1.Distance() < 2 && C2.Distance() < 2 && D1.Distance() < 2 && D2.Distance() < 2;

+        Coon_Color div_colors[4];

+        int d_bottom, d_left, d_top, d_right;

+        div_colors[0].BiInterpol(patch_colors, left, bottom, x_scale, y_scale);

+        if (!bSmall) {

+            div_colors[1].BiInterpol(patch_colors, left, bottom + 1, x_scale, y_scale);

+            div_colors[2].BiInterpol(patch_colors, left + 1, bottom + 1, x_scale, y_scale);

+            div_colors[3].BiInterpol(patch_colors, left + 1, bottom, x_scale, y_scale);

+            d_bottom = div_colors[3].Distance(div_colors[0]);

+            d_left = div_colors[1].Distance(div_colors[0]);

+            d_top = div_colors[1].Distance(div_colors[2]);

+            d_right = div_colors[2].Distance(div_colors[3]);

+        }

+#define COONCOLOR_THRESHOLD 4

+        if (bSmall || (d_bottom < COONCOLOR_THRESHOLD && d_left < COONCOLOR_THRESHOLD &&

+                       d_top < COONCOLOR_THRESHOLD && d_right < COONCOLOR_THRESHOLD)) {

+            FX_PATHPOINT* pPoints = path.GetPoints();

+            C1.GetPoints(pPoints);

+            D2.GetPoints(pPoints + 3);

+            C2.GetPointsReverse(pPoints + 6);

+            D1.GetPointsReverse(pPoints + 9);

+            int fillFlags = FXFILL_WINDING | FXFILL_FULLCOVER;

+            if (fill_mode & RENDER_NOPATHSMOOTH) {

+                fillFlags |= FXFILL_NOPATHSMOOTH;

+            }

+            pDevice->DrawPath(&path, NULL, NULL, FXARGB_MAKE(alpha, div_colors[0].comp[0], div_colors[0].comp[1], div_colors[0].comp[2]), 0, fillFlags);

+        } else {

+            if (d_bottom < COONCOLOR_THRESHOLD && d_top < COONCOLOR_THRESHOLD) {

+                Coon_Bezier m1;

+                m1.BezierInterpol(D1, D2, C1, C2);

+                y_scale *= 2;

+                bottom *= 2;

+                Draw(x_scale, y_scale, left, bottom, C1, m1, D1.first_half(), D2.first_half());

+                Draw(x_scale, y_scale, left, bottom + 1, m1, C2, D1.second_half(), D2.second_half());

+            } else if (d_left < COONCOLOR_THRESHOLD && d_right < COONCOLOR_THRESHOLD) {

+                Coon_Bezier m2;

+                m2.BezierInterpol(C1, C2, D1, D2);

+                x_scale *= 2;

+                left *= 2;

+                Draw(x_scale, y_scale, left, bottom, C1.first_half(), C2.first_half(), D1, m2);

+                Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), C2.second_half(), m2, D2);

+            } else {

+                Coon_Bezier m1, m2;

+                m1.BezierInterpol(D1, D2, C1, C2);

+                m2.BezierInterpol(C1, C2, D1, D2);

+                Coon_Bezier m1f = m1.first_half();

+                Coon_Bezier m1s = m1.second_half();

+                Coon_Bezier m2f = m2.first_half();

+                Coon_Bezier m2s = m2.second_half();

+                x_scale *= 2;

+                y_scale *= 2;

+                left *= 2;

+                bottom *= 2;

+                Draw(x_scale, y_scale, left, bottom, C1.first_half(), m1f, D1.first_half(), m2f);

+                Draw(x_scale, y_scale, left, bottom + 1, m1f, C2.first_half(), D1.second_half(), m2s);

+                Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), m1s, m2f, D2.first_half());

+                Draw(x_scale, y_scale, left + 1, bottom + 1, m1s, C2.second_half(), m2s, D2.second_half());

+            }

+        }

+    }

+};

+static void _DrawCoonPatchMeshes(FX_BOOL bTensor, CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,

+                                 CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,

+                                 CPDF_ColorSpace* pCS, int fill_mode, int alpha)

+{

+    ASSERT(pBitmap->GetFormat() == FXDIB_Argb);

+    if (pShadingStream->GetType() != PDFOBJ_STREAM) {

+        return;

+    }

+    CFX_FxgeDevice device;

+    device.Attach(pBitmap);

+    CPDF_MeshStream stream;

+    if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {

+        return;

+    }

+    CPDF_PatchDrawer patch;

+    patch.alpha = alpha;

+    patch.pDevice = &device;

+    patch.fill_mode = fill_mode;

+    patch.path.SetPointCount(13);

+    FX_PATHPOINT* pPoints = patch.path.GetPoints();

+    pPoints[0].m_Flag = FXPT_MOVETO;

+    for (int i = 1; i < 13; i ++) {

+        pPoints[i].m_Flag = FXPT_BEZIERTO;

+    }

+    CFX_FloatPoint coords[16];

+    int point_count = bTensor ? 16 : 12;

+    while (!stream.m_BitStream.IsEOF()) {

+        FX_DWORD flag = stream.GetFlag();

+        int iStartPoint = 0, iStartColor = 0, i;

+        if (flag) {

+            iStartPoint = 4;

+            iStartColor = 2;

+            CFX_FloatPoint tempCoords[4];

+            for (int i = 0; i < 4; i ++) {

+                tempCoords[i] = coords[(flag * 3 + i) % 12];

+            }

+            FXSYS_memcpy32(coords, tempCoords, sizeof(CFX_FloatPoint) * 4);

+            Coon_Color tempColors[2];

+            tempColors[0] = patch.patch_colors[flag];

+            tempColors[1] = patch.patch_colors[(flag + 1) % 4];

+            FXSYS_memcpy32(patch.patch_colors, tempColors, sizeof(Coon_Color) * 2);

+        }

+        for (i = iStartPoint; i < point_count; i ++) {

+            stream.GetCoords(coords[i].x, coords[i].y);

+            pObject2Bitmap->Transform(coords[i].x, coords[i].y);

+        }

+        for (i = iStartColor; i < 4; i ++) {

+            FX_FLOAT r, g, b;

+            stream.GetColor(r, g, b);

+            patch.patch_colors[i].comp[0] = (FX_INT32)(r * 255);

+            patch.patch_colors[i].comp[1] = (FX_INT32)(g * 255);

+            patch.patch_colors[i].comp[2] = (FX_INT32)(b * 255);

+        }

+        CFX_FloatRect bbox = CFX_FloatRect::GetBBox(coords, point_count);

+        if (bbox.right <= 0 || bbox.left >= (FX_FLOAT)pBitmap->GetWidth() || bbox.top <= 0 ||

+                bbox.bottom >= (FX_FLOAT)pBitmap->GetHeight()) {

+            continue;

+        }

+        Coon_Bezier C1, C2, D1, D2;

+        C1.FromPoints(coords[0].x, coords[0].y, coords[11].x, coords[11].y, coords[10].x, coords[10].y,

+                      coords[9].x, coords[9].y);

+        C2.FromPoints(coords[3].x, coords[3].y, coords[4].x, coords[4].y, coords[5].x, coords[5].y,

+                      coords[6].x, coords[6].y);

+        D1.FromPoints(coords[0].x, coords[0].y, coords[1].x, coords[1].y, coords[2].x, coords[2].y,

+                      coords[3].x, coords[3].y);

+        D2.FromPoints(coords[9].x, coords[9].y, coords[8].x, coords[8].y, coords[7].x, coords[7].y,

+                      coords[6].x, coords[6].y);

+        patch.Draw(1, 1, 0, 0, C1, C2, D1, D2);

+    }

+}

+void CPDF_RenderStatus::DrawShading(CPDF_ShadingPattern* pPattern, CFX_AffineMatrix* pMatrix,

+                                    FX_RECT& clip_rect, int alpha, FX_BOOL bAlphaMode)

+{

+    int width = clip_rect.Width();

+    int height = clip_rect.Height();

+    CPDF_Function** pFuncs = pPattern->m_pFunctions;

+    int nFuncs = pPattern->m_nFuncs;

+    CPDF_Dictionary* pDict = pPattern->m_pShadingObj->GetDict();

+    CPDF_ColorSpace* pColorSpace = pPattern->m_pCS;

+    if (pColorSpace == NULL) {

+        return;

+    }

+    FX_ARGB background = 0;

+    if (!pPattern->m_bShadingObj && pPattern->m_pShadingObj->GetDict()->KeyExist(FX_BSTRC("Background"))) {

+        CPDF_Array* pBackColor = pPattern->m_pShadingObj->GetDict()->GetArray(FX_BSTRC("Background"));

+        if (pBackColor && pBackColor->GetCount() >= (FX_DWORD)pColorSpace->CountComponents()) {

+            CFX_FixedBufGrow<FX_FLOAT, 16> comps(pColorSpace->CountComponents());

+            for (int i = 0; i < pColorSpace->CountComponents(); i ++) {

+                comps[i] = pBackColor->GetNumber(i);

+            }

+            FX_FLOAT R, G, B;

+            pColorSpace->GetRGB(comps, R, G, B);

+            background = ArgbEncode(255, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255));

+        }

+    }

+    if (pDict->KeyExist(FX_BSTRC("BBox"))) {

+        CFX_FloatRect rect = pDict->GetRect(FX_BSTRC("BBox"));

+        rect.Transform(pMatrix);

+        clip_rect.Intersect(rect.GetOutterRect());

+    }

+    CPDF_DeviceBuffer buffer;

+    buffer.Initialize(m_pContext, m_pDevice, &clip_rect, m_pCurObj, 150);

+    CFX_AffineMatrix FinalMatrix = *pMatrix;

+    FinalMatrix.Concat(*buffer.GetMatrix());

+    CFX_DIBitmap* pBitmap = buffer.GetBitmap();

+    if (pBitmap->GetBuffer() == NULL) {

+        return;

+    }

+    pBitmap->Clear(background);

+    int fill_mode = m_Options.m_Flags;

+    switch (pPattern->m_ShadingType) {

+        case 1:

+            _DrawFuncShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);

+            break;

+        case 2:

+            _DrawAxialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);

+            break;

+        case 3:

+            _DrawRadialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);

+            break;

+        case 4: {

+                _DrawFreeGouraudShading(pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,

+                                        pFuncs, nFuncs, pColorSpace, alpha);

+            }

+            break;

+        case 5: {

+                _DrawLatticeGouraudShading(pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,

+                                           pFuncs, nFuncs, pColorSpace, alpha);

+            }

+            break;

+        case 6:

+        case 7: {

+                _DrawCoonPatchMeshes(pPattern->m_ShadingType - 6, pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,

+                                     pFuncs, nFuncs, pColorSpace, fill_mode, alpha);

+            }

+            break;

+    }

+    if (bAlphaMode) {

+        pBitmap->LoadChannel(FXDIB_Red, pBitmap, FXDIB_Alpha);

+    }

+    if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) {

+        pBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor);

+    }

+    buffer.OutputToDevice();

+}

+void CPDF_RenderStatus::DrawShadingPattern(CPDF_ShadingPattern* pattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)

+{

+    if (!pattern->Load()) {

+        return;

+    }

+    m_pDevice->SaveState();

+    if (pPageObj->m_Type == PDFPAGE_PATH) {

+        if (!SelectClipPath((CPDF_PathObject*)pPageObj, pObj2Device, bStroke)) {

+            m_pDevice->RestoreState();

+            return;

+        }

+    } else if (pPageObj->m_Type == PDFPAGE_IMAGE) {

+        FX_RECT rect = pPageObj->GetBBox(pObj2Device);

+        m_pDevice->SetClip_Rect(&rect);

+    } else {

+        return;

+    }

+    FX_RECT rect;

+    if (GetObjectClippedRect(pPageObj, pObj2Device, FALSE, rect)) {

+        m_pDevice->RestoreState();

+        return;

+    }

+    CFX_AffineMatrix matrix = pattern->m_Pattern2Form;

+    matrix.Concat(*pObj2Device);

+    GetScaledMatrix(matrix);

+    int alpha = pPageObj->m_GeneralState.GetAlpha(bStroke);

+    DrawShading(pattern, &matrix, rect, alpha, m_Options.m_ColorMode == RENDER_COLOR_ALPHA);

+    m_pDevice->RestoreState();

+}

+FX_BOOL CPDF_RenderStatus::ProcessShading(CPDF_ShadingObject* pShadingObj, const CFX_AffineMatrix* pObj2Device)

+{

+    FX_RECT rect = pShadingObj->GetBBox(pObj2Device);

+    FX_RECT clip_box = m_pDevice->GetClipBox();

+    rect.Intersect(clip_box);

+    if (rect.IsEmpty()) {

+        return TRUE;

+    }

+    CFX_AffineMatrix matrix = pShadingObj->m_Matrix;

+    matrix.Concat(*pObj2Device);

+    DrawShading(pShadingObj->m_pShading, &matrix, rect, pShadingObj->m_GeneralState.GetAlpha(FALSE),

+                m_Options.m_ColorMode == RENDER_COLOR_ALPHA);

+#ifdef _FPDFAPI_MINI_

+    if (m_DitherBits) {

+        DitherObjectArea(pShadingObj, pObj2Device);

+    }

+#endif

+    return TRUE;

+}

+static CFX_DIBitmap* DrawPatternBitmap(CPDF_Document* pDoc, CPDF_PageRenderCache* pCache,

+                                       CPDF_TilingPattern* pPattern, const CFX_AffineMatrix* pObject2Device,

+                                       int width, int height, int flags)

+{

+    CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;

+    if (!pBitmap->Create(width, height, pPattern->m_bColored ? FXDIB_Argb : FXDIB_8bppMask)) {

+        delete pBitmap;

+        return NULL;

+    }

+    CFX_FxgeDevice bitmap_device;

+    bitmap_device.Attach(pBitmap);

+    pBitmap->Clear(0);

+    CFX_FloatRect cell_bbox = pPattern->m_BBox;

+    pPattern->m_Pattern2Form.TransformRect(cell_bbox);

+    pObject2Device->TransformRect(cell_bbox);

+    CFX_FloatRect bitmap_rect(0.0f, 0.0f, (FX_FLOAT)width, (FX_FLOAT)height);

+    CFX_AffineMatrix mtAdjust;

+    mtAdjust.MatchRect(bitmap_rect, cell_bbox);

+    CFX_AffineMatrix mtPattern2Bitmap = *pObject2Device;

+    mtPattern2Bitmap.Concat(mtAdjust);

+    CPDF_RenderOptions options;

+    if (!pPattern->m_bColored) {

+        options.m_ColorMode = RENDER_COLOR_ALPHA;

+    }

+    flags |= RENDER_FORCE_HALFTONE;

+    options.m_Flags = flags;

+    CPDF_RenderContext context;

+    context.Create(pDoc, pCache, NULL);

+    context.DrawObjectList(&bitmap_device, pPattern->m_pForm, &mtPattern2Bitmap, &options);

+    return pBitmap;

+}

+void CPDF_RenderStatus::DrawTilingPattern(CPDF_TilingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)

+{

+    if (!pPattern->Load()) {

+        return;

+    }

+    m_pDevice->SaveState();

+    if (pPageObj->m_Type == PDFPAGE_PATH) {

+        if (!SelectClipPath((CPDF_PathObject*)pPageObj, pObj2Device, bStroke)) {

+            m_pDevice->RestoreState();

+            return;

+        }

+    } else if (pPageObj->m_Type == PDFPAGE_IMAGE) {

+        FX_RECT rect = pPageObj->GetBBox(pObj2Device);

+        m_pDevice->SetClip_Rect(&rect);

+    } else {

+        return;

+    }

+    FX_RECT clip_box = m_pDevice->GetClipBox();

+    if (clip_box.IsEmpty()) {

+        m_pDevice->RestoreState();

+        return;

+    }

+    CFX_Matrix dCTM = m_pDevice->GetCTM();

+    FX_FLOAT sa = FXSYS_fabs(dCTM.a);

+    FX_FLOAT sd = FXSYS_fabs(dCTM.d);

+    clip_box.right = clip_box.left + (FX_INT32)FXSYS_ceil(clip_box.Width() * sa);

+    clip_box.bottom = clip_box.top + (FX_INT32)FXSYS_ceil(clip_box.Height() * sd);

+    CFX_AffineMatrix mtPattern2Device = pPattern->m_Pattern2Form;

+    mtPattern2Device.Concat(*pObj2Device);

+    GetScaledMatrix(mtPattern2Device);

+    FX_BOOL bAligned = FALSE;

+    if (pPattern->m_BBox.left == 0 && pPattern->m_BBox.bottom == 0 &&

+            pPattern->m_BBox.right == pPattern->m_XStep && pPattern->m_BBox.top == pPattern->m_YStep &&

+            (mtPattern2Device.IsScaled() || mtPattern2Device.Is90Rotated())) {

+        bAligned = TRUE;

+    }

+    CFX_FloatRect cell_bbox = pPattern->m_BBox;

+    mtPattern2Device.TransformRect(cell_bbox);

+    int width = (int)FXSYS_ceil(cell_bbox.Width());

+    int height = (int)FXSYS_ceil(cell_bbox.Height());

+    if (width == 0) {

+        width = 1;

+    }

+    if (height == 0) {

+        height = 1;

+    }

+    int min_col, max_col, min_row, max_row;

+    CFX_AffineMatrix mtDevice2Pattern;

+    mtDevice2Pattern.SetReverse(mtPattern2Device);

+    CFX_FloatRect clip_box_p(clip_box);

+    clip_box_p.Transform(&mtDevice2Pattern);

+    min_col = (int)FXSYS_ceil(FXSYS_Div(clip_box_p.left - pPattern->m_BBox.right, pPattern->m_XStep));

+    max_col = (int)FXSYS_floor(FXSYS_Div(clip_box_p.right - pPattern->m_BBox.left, pPattern->m_XStep));

+    min_row = (int)FXSYS_ceil(FXSYS_Div(clip_box_p.bottom - pPattern->m_BBox.top, pPattern->m_YStep));

+    max_row = (int)FXSYS_floor(FXSYS_Div(clip_box_p.top - pPattern->m_BBox.bottom, pPattern->m_YStep));

+    if (width > clip_box.Width() || height > clip_box.Height() || width * height > clip_box.Width() * clip_box.Height()) {

+        CPDF_GraphicStates* pStates = NULL;

+        if (!pPattern->m_bColored) {

+            pStates = CloneObjStates(pPageObj, bStroke);

+        }

+        CPDF_Dictionary* pFormResource = NULL;

+        if (pPattern->m_pForm->m_pFormDict) {

+            pFormResource = pPattern->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));

+        }

+        for (int col = min_col; col <= max_col; col ++)

+            for (int row = min_row; row <= max_row; row ++) {

+                FX_FLOAT orig_x, orig_y;

+                orig_x = col * pPattern->m_XStep;

+                orig_y = row * pPattern->m_YStep;

+                mtPattern2Device.Transform(orig_x, orig_y);

+                CFX_AffineMatrix matrix = *pObj2Device;

+                matrix.Translate(orig_x - mtPattern2Device.e, orig_y - mtPattern2Device.f);

+                m_pDevice->SaveState();

+                CPDF_RenderStatus status;

+                status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, NULL, this, pStates, &m_Options,

+                                  pPattern->m_pForm->m_Transparency, m_bDropObjects, pFormResource);

+                status.RenderObjectList(pPattern->m_pForm, &matrix);

+                m_pDevice->RestoreState();

+            }

+        m_pDevice->RestoreState();

+        if (pStates) {

+            delete pStates;

+        }

+        return;

+    }

+    if (bAligned) {

+        int orig_x = FXSYS_round(mtPattern2Device.e);

+        int orig_y = FXSYS_round(mtPattern2Device.f);

+        min_col = (clip_box.left - orig_x) / width;

+        if (clip_box.left < orig_x) {

+            min_col --;

+        }

+        max_col = (clip_box.right - orig_x) / width;

+        if (clip_box.right <= orig_x) {

+            max_col --;

+        }

+        min_row = (clip_box.top - orig_y) / height;

+        if (clip_box.top < orig_y) {

+            min_row --;

+        }

+        max_row = (clip_box.bottom - orig_y) / height;

+        if (clip_box.bottom <= orig_y) {

+            max_row --;

+        }

+    }

+    FX_FLOAT left_offset = cell_bbox.left - mtPattern2Device.e;

+    FX_FLOAT top_offset = cell_bbox.bottom - mtPattern2Device.f;

+    CFX_DIBitmap* pPatternBitmap = NULL;

+    if (width * height < 16) {

+        CFX_DIBitmap* pEnlargedBitmap = DrawPatternBitmap(m_pContext->m_pDocument, m_pContext->m_pPageCache, pPattern, pObj2Device, 8, 8, m_Options.m_Flags);

+        pPatternBitmap = pEnlargedBitmap->StretchTo(width, height);

+        delete pEnlargedBitmap;

+    } else {

+        pPatternBitmap = DrawPatternBitmap(m_pContext->m_pDocument, m_pContext->m_pPageCache, pPattern, pObj2Device, width, height, m_Options.m_Flags);

+    }

+    if (pPatternBitmap == NULL) {

+        m_pDevice->RestoreState();

+        return;

+    }

+    if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) {

+        pPatternBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor);

+    }

+    FX_ARGB fill_argb = GetFillArgb(pPageObj);

+    int clip_width = clip_box.right - clip_box.left;

+    int clip_height = clip_box.bottom - clip_box.top;

+    CFX_DIBitmap screen;

+    if (!screen.Create(clip_width, clip_height, FXDIB_Argb)) {

+        return;

+    }

+    screen.Clear(0);

+    FX_DWORD* src_buf = (FX_DWORD*)pPatternBitmap->GetBuffer();

+    for (int col = min_col; col <= max_col; col ++) {

+        for (int row = min_row; row <= max_row; row ++) {

+            int start_x, start_y;

+            if (bAligned) {

+                start_x = FXSYS_round(mtPattern2Device.e) + col * width - clip_box.left;

+                start_y = FXSYS_round(mtPattern2Device.f) + row * height - clip_box.top;

+            } else {

+                FX_FLOAT orig_x = col * pPattern->m_XStep;

+                FX_FLOAT orig_y = row * pPattern->m_YStep;

+                mtPattern2Device.Transform(orig_x, orig_y);

+                start_x = FXSYS_round(orig_x + left_offset) - clip_box.left;

+                start_y = FXSYS_round(orig_y + top_offset) - clip_box.top;

+            }

+            if (width == 1 && height == 1) {

+                if (start_x < 0 || start_x >= clip_box.Width() || start_y < 0 || start_y >= clip_box.Height()) {

+                    continue;

+                }

+                FX_DWORD* dest_buf = (FX_DWORD*)(screen.GetBuffer() + screen.GetPitch() * start_y + start_x * 4);

+                if (pPattern->m_bColored) {

+                    *dest_buf = *src_buf;

+                } else {

+                    *dest_buf = (*(FX_LPBYTE)src_buf << 24) | (fill_argb & 0xffffff);

+                }

+            } else {

+                if (pPattern->m_bColored) {

+                    screen.CompositeBitmap(start_x, start_y, width, height, pPatternBitmap, 0, 0);

+                } else {

+                    screen.CompositeMask(start_x, start_y, width, height, pPatternBitmap, fill_argb, 0, 0);

+                }

+            }

+        }

+    }

+    CompositeDIBitmap(&screen, clip_box.left, clip_box.top, 0, 255, FXDIB_BLEND_NORMAL, FALSE);

+    m_pDevice->RestoreState();

+    delete pPatternBitmap;

+}

+void CPDF_RenderStatus::DrawPathWithPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke)

+{

+    CPDF_Pattern* pattern = pColor->GetPattern();

+    if (pattern == NULL) {

+        return;

+    }

+    if(pattern->m_PatternType == PATTERN_TILING) {

+        DrawTilingPattern((CPDF_TilingPattern*)pattern, pPathObj, pObj2Device, bStroke);

+    } else {

+        DrawShadingPattern((CPDF_ShadingPattern*)pattern, pPathObj, pObj2Device, bStroke);

+    }

+}

+void CPDF_RenderStatus::ProcessPathPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, int& filltype, FX_BOOL& bStroke)

+{

+    FX_BOOL bPattern = FALSE;

+    if(filltype) {

+        CPDF_Color& FillColor = *pPathObj->m_ColorState.GetFillColor();

+        if(FillColor.m_pCS && FillColor.m_pCS->GetFamily() == PDFCS_PATTERN) {

+            DrawPathWithPattern(pPathObj, pObj2Device, &FillColor, FALSE);

+            filltype = 0;

+            bPattern = TRUE;

+        }

+    }

+    if(bStroke) {

+        CPDF_Color& StrokeColor = *pPathObj->m_ColorState.GetStrokeColor();

+        if(StrokeColor.m_pCS && StrokeColor.m_pCS->GetFamily() == PDFCS_PATTERN) {

+            DrawPathWithPattern(pPathObj, pObj2Device, &StrokeColor, TRUE);

+            bStroke = FALSE;

+            bPattern = TRUE;

+        }

+    }

+#ifdef _FPDFAPI_MINI_

+    if (bPattern && m_DitherBits) {

+        DitherObjectArea(pPathObj, pObj2Device);

+    }

+#endif

+}

diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
new file mode 100644
index 0000000..91ff982
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
@@ -0,0 +1,760 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fpdfapi/fpdf_render.h"

+#include "../../../include/fpdfapi/fpdf_pageobj.h"

+#include "../fpdf_page/pageint.h"

+#include "render_int.h"

+extern FX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix);

+CPDF_Type3Cache::~CPDF_Type3Cache()

+{

+    FX_POSITION pos = m_SizeMap.GetStartPosition();

+    CFX_ByteString Key;

+    CPDF_Type3Glyphs* pSizeCache = NULL;

+    while(pos) {

+        pSizeCache = (CPDF_Type3Glyphs*)m_SizeMap.GetNextValue(pos);

+        delete pSizeCache;

+    }

+    m_SizeMap.RemoveAll();

+}

+CFX_GlyphBitmap* CPDF_Type3Cache::LoadGlyph(FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)

+{

+    _CPDF_UniqueKeyGen keygen;

+    keygen.Generate(4, FXSYS_round(pMatrix->a * 10000), FXSYS_round(pMatrix->b * 10000),

+                    FXSYS_round(pMatrix->c * 10000), FXSYS_round(pMatrix->d * 10000));

+    CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);

+    CPDF_Type3Glyphs* pSizeCache = NULL;

+    if(!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {

+        pSizeCache = FX_NEW CPDF_Type3Glyphs;

+        m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);

+    }

+    CFX_GlyphBitmap* pGlyphBitmap;

+    if(pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)charcode, (void*&)pGlyphBitmap)) {

+        return pGlyphBitmap;

+    }

+    pGlyphBitmap = RenderGlyph(pSizeCache, charcode, pMatrix, retinaScaleX, retinaScaleY);

+    pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)charcode, pGlyphBitmap);

+    return pGlyphBitmap;

+}

+CPDF_Type3Glyphs::~CPDF_Type3Glyphs()

+{

+    FX_POSITION pos = m_GlyphMap.GetStartPosition();

+    FX_LPVOID Key;

+    CFX_GlyphBitmap* pGlyphBitmap;

+    while(pos) {

+        m_GlyphMap.GetNextAssoc(pos, Key, (void*&)pGlyphBitmap);

+        delete pGlyphBitmap;

+    }

+}

+static int _AdjustBlue(FX_FLOAT pos, int& count, int blues[])

+{

+    FX_FLOAT min_distance = 1000000.0f * 1.0f;

+    int closest_pos = -1;

+    for (int i = 0; i < count; i ++) {

+        FX_FLOAT distance = (FX_FLOAT)FXSYS_fabs(pos - (FX_FLOAT)blues[i]);

+        if (distance < 1.0f * 80.0f / 100.0f && distance < min_distance) {

+            min_distance = distance;

+            closest_pos = i;

+        }

+    }

+    if (closest_pos >= 0) {

+        return blues[closest_pos];

+    }

+    int new_pos = FXSYS_round(pos);

+    if (count == TYPE3_MAX_BLUES) {

+        return new_pos;

+    }

+    blues[count++] = new_pos;

+    return new_pos;

+}

+void CPDF_Type3Glyphs::AdjustBlue(FX_FLOAT top, FX_FLOAT bottom, int& top_line, int& bottom_line)

+{

+    top_line = _AdjustBlue(top, m_TopBlueCount, m_TopBlue);

+    bottom_line = _AdjustBlue(bottom, m_BottomBlueCount, m_BottomBlue);

+}

+static FX_BOOL _IsScanLine1bpp(FX_LPBYTE pBuf, int width)

+{

+    int size = width / 8;

+    for (int i = 0; i < size; i ++)

+        if (pBuf[i]) {

+            return TRUE;

+        }

+    if (width % 8)

+        if (pBuf[width / 8] & (0xff << (8 - width % 8))) {

+            return TRUE;

+        }

+    return FALSE;

+}

+static FX_BOOL _IsScanLine8bpp(FX_LPBYTE pBuf, int width)

+{

+    for (int i = 0; i < width; i ++)

+        if (pBuf[i] > 0x40) {

+            return TRUE;

+        }

+    return FALSE;

+}

+static int _DetectFirstLastScan(const CFX_DIBitmap* pBitmap, FX_BOOL bFirst)

+{

+    int height = pBitmap->GetHeight(), pitch = pBitmap->GetPitch(), width = pBitmap->GetWidth();

+    int bpp = pBitmap->GetBPP();

+    if (bpp > 8) {

+        width *= bpp / 8;

+    }

+    FX_LPBYTE pBuf = pBitmap->GetBuffer();

+    int line = bFirst ? 0 : height - 1;

+    int line_step = bFirst ? 1 : -1;

+    int line_end = bFirst ? height : -1;

+    while (line != line_end) {

+        if (bpp == 1) {

+            if (_IsScanLine1bpp(pBuf + line * pitch, width)) {

+                return line;

+            }

+        } else {

+            if (_IsScanLine8bpp(pBuf + line * pitch, width)) {

+                return line;

+            }

+        }

+        line += line_step;

+    }

+    return -1;

+}

+CFX_GlyphBitmap* CPDF_Type3Cache::RenderGlyph(CPDF_Type3Glyphs* pSize, FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)

+{

+    CPDF_Type3Char* pChar = m_pFont->LoadChar(charcode);

+    if (pChar == NULL || pChar->m_pBitmap == NULL) {

+        return NULL;

+    }

+    CFX_DIBitmap* pBitmap = pChar->m_pBitmap;

+    CFX_AffineMatrix image_matrix, text_matrix;

+    image_matrix = pChar->m_ImageMatrix;

+    text_matrix.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, 0, 0);

+    image_matrix.Concat(text_matrix);

+    CFX_DIBitmap* pResBitmap = NULL;

+    int left, top;

+    if (FXSYS_fabs(image_matrix.b) < FXSYS_fabs(image_matrix.a) / 100 && FXSYS_fabs(image_matrix.c) < FXSYS_fabs(image_matrix.d) / 100) {

+        int top_line, bottom_line;

+        top_line = _DetectFirstLastScan(pBitmap, TRUE);

+        bottom_line = _DetectFirstLastScan(pBitmap, FALSE);

+        if (top_line == 0 && bottom_line == pBitmap->GetHeight() - 1) {

+            FX_FLOAT top_y = image_matrix.d + image_matrix.f;

+            FX_FLOAT bottom_y = image_matrix.f;

+            FX_BOOL bFlipped = top_y > bottom_y;

+            if (bFlipped) {

+                FX_FLOAT temp = top_y;

+                top_y = bottom_y;

+                bottom_y = temp;

+            }

+            pSize->AdjustBlue(top_y, bottom_y, top_line, bottom_line);

+            pResBitmap = pBitmap->StretchTo((int)(FXSYS_round(image_matrix.a) * retinaScaleX), (int)((bFlipped ? top_line - bottom_line : bottom_line - top_line) * retinaScaleY));

+            top = top_line;

+            if (image_matrix.a < 0) {

+                image_matrix.Scale(retinaScaleX, retinaScaleY);

+                left = FXSYS_round(image_matrix.e + image_matrix.a);

+            } else {

+                left = FXSYS_round(image_matrix.e);

+            }

+        } else {

+        }

+    }

+    if (pResBitmap == NULL) {

+        image_matrix.Scale(retinaScaleX, retinaScaleY);

+        pResBitmap = pBitmap->TransformTo(&image_matrix, left, top);

+    }

+    if (pResBitmap == NULL) {

+        return NULL;

+    }

+    CFX_GlyphBitmap* pGlyph = FX_NEW CFX_GlyphBitmap;

+    pGlyph->m_Left = left;

+    pGlyph->m_Top = -top;

+    pGlyph->m_Bitmap.TakeOver(pResBitmap);

+    delete pResBitmap;

+    return pGlyph;

+}

+void _CPDF_UniqueKeyGen::Generate(int count, ...)

+{

+    va_list argList;

+    va_start(argList, count);

+    for (int i = 0; i < count; i ++) {

+        int p = va_arg(argList, int);

+        ((FX_DWORD*)m_Key)[i] = p;

+    }

+    va_end(argList);

+    m_KeyLen = count * sizeof(FX_DWORD);

+}

+FX_BOOL CPDF_RenderStatus::ProcessText(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device, CFX_PathData* pClippingPath)

+{

+    if(textobj->m_nChars == 0) {

+        return TRUE;

+    }

+    int text_render_mode = textobj->m_TextState.GetObject()->m_TextMode;

+    if (text_render_mode == 3) {

+        return TRUE;

+    }

+    CPDF_Font* pFont = textobj->m_TextState.GetFont();

+    if (pFont->GetFontType() == PDFFONT_TYPE3) {

+        return ProcessType3Text(textobj, pObj2Device);

+    }

+    FX_BOOL bFill = FALSE, bStroke = FALSE, bClip = FALSE;

+    if (pClippingPath) {

+        bClip = TRUE;

+    } else {

+        switch (text_render_mode) {

+            case 0:

+            case 4:

+                bFill = TRUE;

+                break;

+            case 1:

+            case 5:

+                if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {

+                    bFill = TRUE;

+                } else {

+                    bStroke = TRUE;

+                }

+                break;

+            case 2:

+            case 6:

+                if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {

+                    bFill = TRUE;

+                } else {

+                    bFill = bStroke = TRUE;

+                }

+                break;

+            case 3:

+            case 7:

+                return TRUE;

+            default:

+                bFill = TRUE;

+        }

+    }

+    FX_ARGB stroke_argb = 0, fill_argb = 0;

+    FX_BOOL bPattern = FALSE;

+    if (bStroke) {

+        if (textobj->m_ColorState.GetStrokeColor()->IsPattern()) {

+            bPattern = TRUE;

+        } else {

+            stroke_argb = GetStrokeArgb(textobj);

+        }

+    }

+    if (bFill) {

+        if (textobj->m_ColorState.GetFillColor()->IsPattern()) {

+            bPattern = TRUE;

+        } else {

+            fill_argb = GetFillArgb(textobj);

+        }

+    }

+    CFX_AffineMatrix text_matrix;

+    textobj->GetTextMatrix(&text_matrix);

+    if(IsAvailableMatrix(text_matrix) == FALSE) {

+        return TRUE;

+    }

+    FX_FLOAT font_size = textobj->m_TextState.GetFontSize();

+    if (bPattern) {

+        DrawTextPathWithPattern(textobj, pObj2Device, pFont, font_size, &text_matrix, bFill, bStroke);

+        return TRUE;

+    }

+#if defined(_FPDFAPI_MINI_)

+    if (bFill) {

+        bStroke = FALSE;

+    }

+    if (bStroke) {

+        if (font_size * text_matrix.GetXUnit() * pObj2Device->GetXUnit() < 6) {

+            bStroke = FALSE;

+        }

+    }

+#endif

+    if (bClip || bStroke) {

+        const CFX_AffineMatrix* pDeviceMatrix = pObj2Device;

+        CFX_AffineMatrix device_matrix;

+        if (bStroke) {

+            const FX_FLOAT* pCTM = textobj->m_TextState.GetObject()->m_CTM;

+            if (pCTM[0] != 1.0f || pCTM[3] != 1.0f) {

+                CFX_AffineMatrix ctm(pCTM[0], pCTM[1], pCTM[2], pCTM[3], 0, 0);

+                text_matrix.ConcatInverse(ctm);

+                device_matrix.Copy(ctm);

+                device_matrix.Concat(*pObj2Device);

+                pDeviceMatrix = &device_matrix;

+            }

+        }

+        int flag = 0;

+        if (bStroke && bFill) {

+            flag |= FX_FILL_STROKE;

+            flag |= FX_STROKE_TEXT_MODE;

+        }

+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)

+        const CPDF_GeneralStateData* pGeneralData = ((CPDF_PageObject*)textobj)->m_GeneralState;

+        if (pGeneralData && pGeneralData->m_StrokeAdjust) {

+            flag |= FX_STROKE_ADJUST;

+        }

+#endif

+        if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) {

+            flag |= FXFILL_NOPATHSMOOTH;

+        }

+        return CPDF_TextRenderer::DrawTextPath(m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size,

+                                               &text_matrix, pDeviceMatrix, textobj->m_GraphState, fill_argb, stroke_argb, pClippingPath, flag);

+    }

+    text_matrix.Concat(*pObj2Device);

+    return CPDF_TextRenderer::DrawNormalText(m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size,

+            &text_matrix, fill_argb, &m_Options);

+}

+CPDF_Type3Cache* CPDF_RenderStatus::GetCachedType3(CPDF_Type3Font* pFont)

+{

+    if (pFont->m_pDocument == NULL) {

+        return NULL;

+    }

+    pFont->m_pDocument->GetPageData()->GetFont(pFont->GetFontDict(), FALSE);

+    return pFont->m_pDocument->GetRenderData()->GetCachedType3(pFont);

+}

+static void ReleaseCachedType3(CPDF_Type3Font* pFont)

+{

+    if (pFont->m_pDocument == NULL) {

+        return;

+    }

+    pFont->m_pDocument->GetRenderData()->ReleaseCachedType3(pFont);

+    pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict());

+}

+FX_BOOL CPDF_Type3Char::LoadBitmap(CPDF_RenderContext* pContext)

+{

+    if (m_pBitmap != NULL || m_pForm == NULL) {

+        return TRUE;

+    }

+    if (m_pForm->CountObjects() == 1 && !m_bColored) {

+        CPDF_PageObject *pPageObj = m_pForm->GetObjectAt(m_pForm->GetFirstObjectPosition());

+        if (pPageObj->m_Type == PDFPAGE_IMAGE) {

+            CPDF_ImageObject* pImage = (CPDF_ImageObject*)pPageObj;

+            m_ImageMatrix = pImage->m_Matrix;

+            const CFX_DIBSource* pSource = pImage->m_pImage->LoadDIBSource();

+            if (pSource) {

+                m_pBitmap = pSource->Clone();

+                delete pSource;

+            }

+            delete m_pForm;

+            m_pForm = NULL;

+            return TRUE;

+        }

+        if (pPageObj->m_Type == PDFPAGE_INLINES) {

+            CPDF_InlineImages *pInlines = (CPDF_InlineImages *)pPageObj;

+            if (pInlines->m_pStream) {

+                m_ImageMatrix = pInlines->m_Matrices[0];

+                CPDF_DIBSource dibsrc;

+                if (!dibsrc.Load(pContext->m_pDocument, pInlines->m_pStream, NULL, NULL, NULL, NULL)) {

+                    return FALSE;

+                }

+                m_pBitmap = dibsrc.Clone();

+                delete m_pForm;

+                m_pForm = NULL;

+                return TRUE;

+            }

+        }

+    }

+    return FALSE;

+}

+class CPDF_RefType3Cache

+{

+public:

+    CPDF_RefType3Cache(CPDF_Type3Font* pType3Font)

+    {

+        m_dwCount = 0;

+        m_pType3Font = pType3Font;

+    }

+    ~CPDF_RefType3Cache()

+    {

+        while(m_dwCount--) {

+            ReleaseCachedType3(m_pType3Font);

+        }

+    }

+    FX_DWORD m_dwCount;

+    CPDF_Type3Font* m_pType3Font;

+};

+FX_BOOL CPDF_RenderStatus::ProcessType3Text(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device)

+{

+    CPDF_Type3Font* pType3Font = textobj->m_TextState.GetFont()->GetType3Font();

+    for (int j = 0; j < m_Type3FontCache.GetSize(); j++)

+        if ((CPDF_Type3Font*)m_Type3FontCache.GetAt(j) == pType3Font) {

+            return TRUE;

+        }

+    CFX_Matrix dCTM = m_pDevice->GetCTM();

+    FX_FLOAT sa = FXSYS_fabs(dCTM.a);

+    FX_FLOAT sd = FXSYS_fabs(dCTM.d);

+    CFX_AffineMatrix text_matrix;

+    textobj->GetTextMatrix(&text_matrix);

+    CFX_AffineMatrix char_matrix = pType3Font->GetFontMatrix();

+    FX_FLOAT font_size = textobj->m_TextState.GetFontSize();

+    char_matrix.Scale(font_size, font_size);

+    FX_ARGB fill_argb = GetFillArgb(textobj, TRUE);

+    int fill_alpha = FXARGB_A(fill_argb);

+    int device_class = m_pDevice->GetDeviceClass();

+    FXTEXT_GLYPHPOS* pGlyphAndPos = NULL;

+    if (device_class == FXDC_DISPLAY) {

+        pGlyphAndPos = FX_Alloc(FXTEXT_GLYPHPOS, textobj->m_nChars);

+        FXSYS_memset32(pGlyphAndPos, 0, sizeof(FXTEXT_GLYPHPOS) * textobj->m_nChars);

+    } else if (fill_alpha < 255) {

+        return FALSE;

+    }

+    CPDF_RefType3Cache refTypeCache(pType3Font);

+    FX_DWORD *pChars = textobj->m_pCharCodes;

+    if (textobj->m_nChars == 1) {

+        pChars = (FX_DWORD*)(&textobj->m_pCharCodes);

+    }

+    for (int iChar = 0; iChar < textobj->m_nChars; iChar ++) {

+        FX_DWORD charcode = pChars[iChar];

+        if (charcode == (FX_DWORD) - 1) {

+            continue;

+        }

+        CPDF_Type3Char* pType3Char = pType3Font->LoadChar(charcode);

+        if (pType3Char == NULL) {

+            continue;

+        }

+        CFX_AffineMatrix matrix = char_matrix;

+        matrix.e += iChar ? textobj->m_pCharPos[iChar - 1] : 0;

+        matrix.Concat(text_matrix);

+        matrix.Concat(*pObj2Device);

+        if (!pType3Char->LoadBitmap(m_pContext)) {

+            if (pGlyphAndPos) {

+                for (int i = 0; i < iChar; i ++) {

+                    FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[i];

+                    if (glyph.m_pGlyph == NULL) {

+                        continue;

+                    }

+                    m_pDevice->SetBitMask(&glyph.m_pGlyph->m_Bitmap,

+                                          glyph.m_OriginX + glyph.m_pGlyph->m_Left,

+                                          glyph.m_OriginY - glyph.m_pGlyph->m_Top, fill_argb);

+                }

+                FX_Free(pGlyphAndPos);

+                pGlyphAndPos = NULL;

+            }

+            CPDF_GraphicStates* pStates = CloneObjStates(textobj, FALSE);

+            CPDF_RenderOptions Options = m_Options;

+            Options.m_Flags |= RENDER_FORCE_HALFTONE | RENDER_RECT_AA;

+            Options.m_Flags &= ~RENDER_FORCE_DOWNSAMPLE;

+            CPDF_Dictionary* pFormResource = NULL;

+            if (pType3Char->m_pForm && pType3Char->m_pForm->m_pFormDict) {

+                pFormResource = pType3Char->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));

+            }

+            if (fill_alpha == 255) {

+                CPDF_RenderStatus status;

+                status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, NULL, this, pStates, &Options,

+                                  pType3Char->m_pForm->m_Transparency, m_bDropObjects, pFormResource, FALSE, pType3Char, fill_argb);

+                status.m_Type3FontCache.Append(m_Type3FontCache);

+                status.m_Type3FontCache.Add(pType3Font);

+                m_pDevice->SaveState();

+                status.RenderObjectList(pType3Char->m_pForm, &matrix);

+                m_pDevice->RestoreState();

+            } else {

+                CFX_FloatRect rect_f = pType3Char->m_pForm->CalcBoundingBox();

+                rect_f.Transform(&matrix);

+                FX_RECT rect = rect_f.GetOutterRect();

+                CFX_FxgeDevice bitmap_device;

+                if (!bitmap_device.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), FXDIB_Argb)) {

+                    return TRUE;

+                }

+                bitmap_device.GetBitmap()->Clear(0);

+                CPDF_RenderStatus status;

+                status.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL, NULL, this, pStates, &Options,

+                                  pType3Char->m_pForm->m_Transparency, m_bDropObjects, pFormResource, FALSE, pType3Char, fill_argb);

+                status.m_Type3FontCache.Append(m_Type3FontCache);

+                status.m_Type3FontCache.Add(pType3Font);

+                matrix.TranslateI(-rect.left, -rect.top);

+                matrix.Scale(sa, sd);

+                status.RenderObjectList(pType3Char->m_pForm, &matrix);

+                m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top);

+            }

+            delete pStates;

+        } else if (pType3Char->m_pBitmap) {

+            if (device_class == FXDC_DISPLAY) {

+                CPDF_Type3Cache* pCache = GetCachedType3(pType3Font);

+                refTypeCache.m_dwCount++;

+                CFX_GlyphBitmap* pBitmap = pCache->LoadGlyph(charcode, &matrix, sa, sd);

+                if (pBitmap == NULL) {

+                    continue;

+                }

+                int origin_x = FXSYS_round(matrix.e);

+                int origin_y = FXSYS_round(matrix.f);

+                if (pGlyphAndPos) {

+                    pGlyphAndPos[iChar].m_pGlyph = pBitmap;

+                    pGlyphAndPos[iChar].m_OriginX = origin_x;

+                    pGlyphAndPos[iChar].m_OriginY = origin_y;

+                } else {

+                    m_pDevice->SetBitMask(&pBitmap->m_Bitmap, origin_x + pBitmap->m_Left, origin_y - pBitmap->m_Top, fill_argb);

+                }

+            } else {

+                CFX_AffineMatrix image_matrix = pType3Char->m_ImageMatrix;

+                image_matrix.Concat(matrix);

+                CPDF_ImageRenderer renderer;

+                if (renderer.Start(this, pType3Char->m_pBitmap, fill_argb, 255, &image_matrix, 0, FALSE)) {

+                    renderer.Continue(NULL);

+                }

+                if (!renderer.m_Result) {

+                    return FALSE;

+                }

+            }

+        }

+    }

+    if (pGlyphAndPos) {

+        FX_RECT rect = FXGE_GetGlyphsBBox(pGlyphAndPos, textobj->m_nChars, 0, sa, sd);

+        CFX_DIBitmap bitmap;

+        if (!bitmap.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), FXDIB_8bppMask)) {

+            FX_Free(pGlyphAndPos);

+            return TRUE;

+        }

+        bitmap.Clear(0);

+        for (int iChar = 0; iChar < textobj->m_nChars; iChar ++) {

+            FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];

+            if (glyph.m_pGlyph == NULL) {

+                continue;

+            }

+            bitmap.TransferBitmap((int)((glyph.m_OriginX + glyph.m_pGlyph->m_Left - rect.left) * sa),

+                                  (int)((glyph.m_OriginY - glyph.m_pGlyph->m_Top - rect.top) * sd),

+                                  glyph.m_pGlyph->m_Bitmap.GetWidth(), glyph.m_pGlyph->m_Bitmap.GetHeight(),

+                                  &glyph.m_pGlyph->m_Bitmap, 0, 0);

+        }

+        m_pDevice->SetBitMask(&bitmap, rect.left, rect.top, fill_argb);

+        FX_Free(pGlyphAndPos);

+    }

+    return TRUE;

+}

+class CPDF_CharPosList

+{

+public:

+    CPDF_CharPosList();

+    ~CPDF_CharPosList();

+    void				Load(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont, FX_FLOAT font_size);

+    FXTEXT_CHARPOS*		m_pCharPos;

+    FX_DWORD			m_nChars;

+};

+FX_FLOAT _CIDTransformToFloat(FX_BYTE ch);

+CPDF_CharPosList::CPDF_CharPosList()

+{

+    m_pCharPos = NULL;

+}

+CPDF_CharPosList::~CPDF_CharPosList()

+{

+    if (m_pCharPos) {

+        FX_Free(m_pCharPos);

+    }

+}

+void CPDF_CharPosList::Load(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont,

+                            FX_FLOAT FontSize)

+{

+    m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, nChars);

+    FXSYS_memset32(m_pCharPos, 0, sizeof(FXTEXT_CHARPOS) * nChars);

+    m_nChars = 0;

+    CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();

+    FX_BOOL bVertWriting = pCIDFont && pCIDFont->IsVertWriting();

+    for (int iChar = 0; iChar < nChars; iChar ++) {

+        FX_DWORD CharCode = nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pCharCodes : pCharCodes[iChar];

+        if (CharCode == (FX_DWORD) - 1) {

+            continue;

+        }

+        FX_BOOL bVert = FALSE;

+        FXTEXT_CHARPOS& charpos = m_pCharPos[m_nChars++];

+        if (pCIDFont) {

+            charpos.m_bFontStyle = pCIDFont->IsFontStyleFromCharCode(CharCode);

+        }

+        charpos.m_GlyphIndex = pFont->GlyphFromCharCode(CharCode, &bVert);

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+        charpos.m_ExtGID = pFont->GlyphFromCharCodeExt(CharCode);

+#endif

+        if (!pFont->IsEmbedded() && pFont->GetFontType() != PDFFONT_CIDFONT) {

+            charpos.m_FontCharWidth = pFont->GetCharWidthF(CharCode);

+        } else {

+            charpos.m_FontCharWidth = 0;

+        }

+        charpos.m_OriginX = iChar ? pCharPos[iChar - 1] : 0;

+        charpos.m_OriginY = 0;

+        charpos.m_bGlyphAdjust = FALSE;

+        if (pCIDFont == NULL) {

+            continue;

+        }

+        FX_WORD CID = pCIDFont->CIDFromCharCode(CharCode);

+        if (bVertWriting) {

+            charpos.m_OriginY = charpos.m_OriginX;

+            charpos.m_OriginX = 0;

+            short vx, vy;

+            pCIDFont->GetVertOrigin(CID, vx, vy);

+            charpos.m_OriginX -= FontSize * vx / 1000;

+            charpos.m_OriginY -= FontSize * vy / 1000;

+        }

+        FX_LPCBYTE pTransform = pCIDFont->GetCIDTransform(CID);

+        if (pTransform && !bVert) {

+            charpos.m_AdjustMatrix[0] = _CIDTransformToFloat(pTransform[0]);

+            charpos.m_AdjustMatrix[2] = _CIDTransformToFloat(pTransform[2]);

+            charpos.m_AdjustMatrix[1] = _CIDTransformToFloat(pTransform[1]);

+            charpos.m_AdjustMatrix[3] = _CIDTransformToFloat(pTransform[3]);

+            charpos.m_OriginX += _CIDTransformToFloat(pTransform[4]) * FontSize;

+            charpos.m_OriginY += _CIDTransformToFloat(pTransform[5]) * FontSize;

+            charpos.m_bGlyphAdjust = TRUE;

+        }

+    }

+}

+FX_BOOL CPDF_TextRenderer::DrawTextPath(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,

+                                        CPDF_Font* pFont, FX_FLOAT font_size,

+                                        const CFX_AffineMatrix* pText2User, const CFX_AffineMatrix* pUser2Device,

+                                        const CFX_GraphStateData* pGraphState,

+                                        FX_ARGB fill_argb, FX_ARGB stroke_argb, CFX_PathData* pClippingPath, int nFlag)

+{

+    CFX_FontCache* pCache = pFont->m_pDocument ? pFont->m_pDocument->GetRenderData()->GetFontCache() : NULL;

+    CPDF_CharPosList CharPosList;

+    CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size);

+    return pDevice->DrawTextPath(CharPosList.m_nChars, CharPosList.m_pCharPos,

+                                 &pFont->m_Font, pCache, font_size, pText2User, pUser2Device,

+                                 pGraphState, fill_argb, stroke_argb, pClippingPath, nFlag);

+}

+void CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, int left, int top, CPDF_Font* pFont, int height,

+                                       const CFX_ByteString& str, FX_ARGB argb)

+{

+    FX_RECT font_bbox;

+    pFont->GetFontBBox(font_bbox);

+    FX_FLOAT font_size = (FX_FLOAT)height * 1000.0f / (FX_FLOAT)(font_bbox.top - font_bbox.bottom);

+    FX_FLOAT origin_x = (FX_FLOAT)left;

+    FX_FLOAT origin_y = (FX_FLOAT)top + font_size * (FX_FLOAT)font_bbox.top / 1000.0f;

+    CFX_AffineMatrix matrix(1.0f, 0, 0, -1.0f, 0, 0);

+    DrawTextString(pDevice, origin_x, origin_y, pFont, font_size, &matrix, str, argb);

+}

+void CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, FX_FLOAT origin_x, FX_FLOAT origin_y, CPDF_Font* pFont, FX_FLOAT font_size,

+                                       const CFX_AffineMatrix* pMatrix, const CFX_ByteString& str, FX_ARGB fill_argb,

+                                       FX_ARGB stroke_argb, const CFX_GraphStateData* pGraphState, const CPDF_RenderOptions* pOptions)

+{

+    int nChars = pFont->CountChar(str, str.GetLength());

+    if (nChars == 0) {

+        return;

+    }

+    FX_DWORD charcode;

+    int offset = 0;

+    FX_DWORD* pCharCodes;

+    FX_FLOAT* pCharPos;

+    if (nChars == 1) {

+        charcode = pFont->GetNextChar(str, offset);

+        pCharCodes = (FX_DWORD*)(FX_UINTPTR)charcode;

+        pCharPos = NULL;

+    } else {

+        pCharCodes = FX_Alloc(FX_DWORD, nChars);

+        pCharPos = FX_Alloc(FX_FLOAT, nChars - 1);

+        FX_FLOAT cur_pos = 0;

+        for (int i = 0; i < nChars; i ++) {

+            pCharCodes[i] = pFont->GetNextChar(str, offset);

+            if (i) {

+                pCharPos[i - 1] = cur_pos;

+            }

+            cur_pos += pFont->GetCharWidthF(pCharCodes[i]) * font_size / 1000;

+        }

+    }

+    CFX_AffineMatrix matrix;

+    if (pMatrix) {

+        matrix = *pMatrix;

+    }

+    matrix.e = origin_x;

+    matrix.f = origin_y;

+    if (pFont->GetFontType() == PDFFONT_TYPE3)

+        ;

+    else if (stroke_argb == 0) {

+        DrawNormalText(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, fill_argb, pOptions);

+    } else

+        DrawTextPath(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, NULL, pGraphState,

+                     fill_argb, stroke_argb, NULL);

+    if (nChars > 1) {

+        FX_Free(pCharCodes);

+        FX_Free(pCharPos);

+    }

+}

+FX_BOOL CPDF_TextRenderer::DrawNormalText(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,

+        CPDF_Font* pFont, FX_FLOAT font_size,

+        const CFX_AffineMatrix* pText2Device,

+        FX_ARGB fill_argb, const CPDF_RenderOptions* pOptions)

+{

+    CFX_FontCache* pCache = pFont->m_pDocument ? pFont->m_pDocument->GetRenderData()->GetFontCache() : NULL;

+    CPDF_CharPosList CharPosList;

+    CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size);

+    int FXGE_flags = 0;

+    if (pOptions) {

+        FX_DWORD dwFlags = pOptions->m_Flags;

+        if (dwFlags & RENDER_CLEARTYPE) {

+            FXGE_flags |= FXTEXT_CLEARTYPE;

+            if (dwFlags & RENDER_BGR_STRIPE) {

+                FXGE_flags |= FXTEXT_BGR_STRIPE;

+            }

+        }

+        if (dwFlags & RENDER_NOTEXTSMOOTH) {

+            FXGE_flags |= FXTEXT_NOSMOOTH;

+        }

+        if (dwFlags & RENDER_PRINTGRAPHICTEXT) {

+            FXGE_flags |= FXTEXT_PRINTGRAPHICTEXT;

+        }

+        if (dwFlags & RENDER_NO_NATIVETEXT) {

+            FXGE_flags |= FXTEXT_NO_NATIVETEXT;

+        }

+        if (dwFlags & RENDER_PRINTIMAGETEXT) {

+            FXGE_flags |= FXTEXT_PRINTIMAGETEXT;

+        }

+    } else {

+        FXGE_flags = FXTEXT_CLEARTYPE;

+    }

+    if (pFont->GetFontType() & PDFFONT_CIDFONT) {

+        FXGE_flags |= FXFONT_CIDFONT;

+    }

+    return pDevice->DrawNormalText(CharPosList.m_nChars, CharPosList.m_pCharPos, &pFont->m_Font, pCache, font_size, pText2Device, fill_argb, FXGE_flags);

+}

+void CPDF_RenderStatus::DrawTextPathWithPattern(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device,

+        CPDF_Font* pFont, FX_FLOAT font_size,

+        const CFX_AffineMatrix* pTextMatrix, FX_BOOL bFill, FX_BOOL bStroke)

+{

+    if (!bStroke) {

+        CPDF_PathObject path;

+        CPDF_TextObject* pCopy = FX_NEW CPDF_TextObject;

+        pCopy->Copy(textobj);

+        path.m_bStroke = FALSE;

+        path.m_FillType = FXFILL_WINDING;

+        path.m_ClipPath.AppendTexts(&pCopy, 1);

+        path.m_ColorState = textobj->m_ColorState;

+        path.m_Path.New()->AppendRect(textobj->m_Left, textobj->m_Bottom, textobj->m_Right, textobj->m_Top);

+        path.m_Left = textobj->m_Left;

+        path.m_Bottom = textobj->m_Bottom;

+        path.m_Right = textobj->m_Right;

+        path.m_Top = textobj->m_Top;

+        RenderSingleObject(&path, pObj2Device);

+        return;

+    }

+    CFX_FontCache* pCache;

+    if (pFont->m_pDocument) {

+        pCache = pFont->m_pDocument->GetRenderData()->GetFontCache();

+    } else {

+        pCache = CFX_GEModule::Get()->GetFontCache();

+    }

+    CFX_FaceCache* pFaceCache = pCache->GetCachedFace(&pFont->m_Font);

+    FX_FONTCACHE_DEFINE(pCache, &pFont->m_Font);

+    CPDF_CharPosList CharPosList;

+    CharPosList.Load(textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size);

+    for (FX_DWORD i = 0; i < CharPosList.m_nChars; i ++) {

+        FXTEXT_CHARPOS& charpos = CharPosList.m_pCharPos[i];

+        const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(&pFont->m_Font, charpos.m_GlyphIndex,

+                                    charpos.m_FontCharWidth);

+        if (pPath == NULL) {

+            continue;

+        }

+        CPDF_PathObject path;

+        path.m_GraphState = textobj->m_GraphState;

+        path.m_ColorState = textobj->m_ColorState;

+        CFX_AffineMatrix matrix;

+        if (charpos.m_bGlyphAdjust)

+            matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],

+                       charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);

+        matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_OriginY);

+        path.m_Path.New()->Append(pPath, &matrix);

+        path.m_Matrix = *pTextMatrix;

+        path.m_bStroke = bStroke;

+        path.m_FillType = bFill ? FXFILL_WINDING : 0;

+        path.CalcBoundingBox();

+        ProcessPath(&path, pObj2Device);

+    }

+}

+CFX_PathData* CPDF_Font::LoadGlyphPath(FX_DWORD charcode, int dest_width)

+{

+    int glyph_index = GlyphFromCharCode(charcode);

+    if (m_Font.m_Face == NULL) {

+        return NULL;

+    }

+    return m_Font.LoadGlyphPath(glyph_index, dest_width);

+}

diff --git a/core/src/fpdfapi/fpdf_render/render_int.h b/core/src/fpdfapi/fpdf_render/render_int.h
new file mode 100644
index 0000000..3acde0e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/render_int.h
@@ -0,0 +1,462 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_PAGEOBJ_H_

+#include "../../../include/fpdfapi/fpdf_pageobj.h"

+#endif

+class CPDF_QuickStretcher;

+#define TYPE3_MAX_BLUES		16

+class CPDF_Type3Glyphs : public CFX_Object

+{

+public:

+    CPDF_Type3Glyphs()

+    {

+        m_GlyphMap.InitHashTable(253);

+        m_TopBlueCount = m_BottomBlueCount = 0;

+    }

+    ~CPDF_Type3Glyphs();

+    CFX_MapPtrToPtr			m_GlyphMap;

+    void					AdjustBlue(FX_FLOAT top, FX_FLOAT bottom, int& top_line, int& bottom_line);

+

+    int						m_TopBlue[TYPE3_MAX_BLUES], m_BottomBlue[TYPE3_MAX_BLUES];

+    int						m_TopBlueCount, m_BottomBlueCount;

+};

+class CFX_GlyphBitmap;

+class CPDF_Type3Cache : public CFX_Object

+{

+public:

+    CPDF_Type3Cache(CPDF_Type3Font* pFont)

+    {

+        m_pFont = pFont;

+    }

+    ~CPDF_Type3Cache();

+    CFX_GlyphBitmap*		LoadGlyph(FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);

+protected:

+    CFX_GlyphBitmap*		RenderGlyph(CPDF_Type3Glyphs* pSize, FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);

+    CPDF_Type3Font*			m_pFont;

+    CFX_MapByteStringToPtr	m_SizeMap;

+};

+class CPDF_TransferFunc : public CFX_Object

+{

+public:

+    CPDF_Document*	m_pPDFDoc;

+    FX_BYTE			m_Samples[256 * 3];

+    FX_BOOL			m_bIdentity;

+

+    CFX_DIBSource*	TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc);

+    FX_COLORREF		TranslateColor(FX_COLORREF src);

+};

+typedef CFX_MapPtrTemplate<CPDF_Font*, CPDF_CountedObject<CPDF_Type3Cache*>*> CPDF_Type3CacheMap;

+typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_TransferFunc*>*> CPDF_TransferFuncMap;

+class CPDF_DocRenderData : public CFX_Object

+{

+public:

+    CPDF_DocRenderData(CPDF_Document* pPDFDoc = NULL);

+    ~CPDF_DocRenderData();

+    FX_BOOL				Initialize();

+    CPDF_Type3Cache*	GetCachedType3(CPDF_Type3Font* pFont);

+    CPDF_TransferFunc*	GetTransferFunc(CPDF_Object* pObj);

+    CFX_FontCache*		GetFontCache()

+    {

+        return m_pFontCache;

+    }

+    void				Clear(FX_BOOL bRelease = FALSE);

+    void				ReleaseCachedType3(CPDF_Type3Font* pFont);

+    void				ReleaseTransferFunc(CPDF_Object* pObj);

+private:

+    CPDF_Document*		m_pPDFDoc;

+    CFX_FontCache*		m_pFontCache;

+    CPDF_Type3CacheMap	m_Type3FaceMap;

+    CPDF_TransferFuncMap	m_TransferFuncMap;

+};

+struct _PDF_RenderItem {

+public:

+    CPDF_PageObjects*			m_pObjectList;

+    CFX_AffineMatrix			m_Matrix;

+};

+typedef CFX_ArrayTemplate<_PDF_RenderItem>	CPDF_RenderLayer;

+class IPDF_ObjectRenderer : public CFX_Object

+{

+public:

+    static IPDF_ObjectRenderer* Create(int type);

+    virtual ~IPDF_ObjectRenderer() {}

+    virtual FX_BOOL Start(CPDF_RenderStatus* pRenderStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL) = 0;

+    virtual FX_BOOL Continue(IFX_Pause* pPause) = 0;

+    FX_BOOL		m_Result;

+};

+class CPDF_RenderStatus : public CFX_Object

+{

+public:

+    CPDF_RenderStatus();

+    ~CPDF_RenderStatus();

+    FX_BOOL			Initialize(int level, class CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pDeviceMatrix,

+                               const CPDF_PageObject* pStopObj, const CPDF_RenderStatus* pParentStatus,

+                               const CPDF_GraphicStates* pInitialStates, const CPDF_RenderOptions* pOptions,

+                               int transparency, FX_BOOL bDropObjects, CPDF_Dictionary* pFormResource = NULL,

+                               FX_BOOL bStdCS = FALSE,	CPDF_Type3Char* pType3Char = NULL, FX_ARGB fill_color = 0,

+                               FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);

+    void			RenderObjectList(const CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObj2Device);

+    void			RenderSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);

+    FX_BOOL			ContinueSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, IFX_Pause* pPause);

+    CPDF_RenderOptions	m_Options;

+    CPDF_Dictionary*    m_pFormResource;

+    CPDF_Dictionary*    m_pPageResource;

+    CFX_PtrArray		m_Type3FontCache;

+    CPDF_RenderContext* GetContext()

+    {

+        return m_pContext;

+    }

+protected:

+    friend class	CPDF_ImageRenderer;

+    friend class	CPDF_RenderContext;

+    void			ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);

+    void			DrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);

+    FX_BOOL			ProcessTransparency(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);

+    void			ProcessObjectNoClip(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);

+    void			DrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);

+    FX_BOOL         DrawObjWithBlend(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);

+    FX_BOOL			ProcessPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device);

+    void			ProcessPathPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, int& filltype, FX_BOOL& bStroke);

+    void			DrawPathWithPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke);

+    void			DrawTilingPattern(CPDF_TilingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);

+    void			DrawShadingPattern(CPDF_ShadingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);

+    FX_BOOL			SelectClipPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);

+    FX_BOOL			ProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device);

+    FX_BOOL			OutputBitmapAlpha(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);

+    FX_BOOL			OutputImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);

+    FX_BOOL			OutputDIBSource(const CFX_DIBSource* pOutputBitmap, FX_ARGB fill_argb, int bitmap_alpha,

+                                    const CFX_AffineMatrix* pImage2Device, CPDF_ImageCache* pImageCache, FX_DWORD flags);

+    void			CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,

+                                      int bitmap_alpha, int blend_mode, int bIsolated);

+    FX_BOOL			ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device);

+    FX_BOOL			ProcessShading(CPDF_ShadingObject* pShadingObj, const CFX_AffineMatrix* pObj2Device);

+    void			DrawShading(CPDF_ShadingPattern* pPattern, CFX_AffineMatrix* pMatrix, FX_RECT& clip_rect,

+                                int alpha, FX_BOOL bAlphaMode);

+    FX_BOOL			ProcessType3Text(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device);

+    FX_BOOL			ProcessText(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device, CFX_PathData* pClippingPath);

+    void			DrawTextPathWithPattern(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device,

+                                            CPDF_Font* pFont, FX_FLOAT font_size,

+                                            const CFX_AffineMatrix* pTextMatrix, FX_BOOL bFill, FX_BOOL bStroke);

+    FX_BOOL			ProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device);

+    CFX_DIBitmap*	GetBackdrop(const CPDF_PageObject* pObj, const FX_RECT& rect, int& left, int& top,

+                                FX_BOOL bBackAlphaRequired);

+    CFX_DIBitmap*	LoadSMask(CPDF_Dictionary* pSMaskDict, FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix);

+    void			Init(CPDF_RenderContext* pParent);

+    static class CPDF_Type3Cache*	GetCachedType3(CPDF_Type3Font* pFont);

+    static CPDF_GraphicStates* CloneObjStates(const CPDF_GraphicStates* pPathObj, FX_BOOL bStroke);

+    CPDF_TransferFunc*	GetTransferFunc(CPDF_Object* pObject) const;

+    FX_ARGB			GetFillArgb(const CPDF_PageObject* pObj, FX_BOOL bType3 = FALSE) const;

+    FX_ARGB			GetStrokeArgb(const CPDF_PageObject* pObj) const;

+    CPDF_RenderContext*		m_pContext;

+    FX_BOOL					m_bStopped;

+    void			DitherObjectArea(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);

+    FX_BOOL			GetObjectClippedRect(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bLogical, FX_RECT &rect) const;

+    void			GetScaledMatrix(CFX_Matrix &matrix) const;

+protected:

+    int						m_Level;

+    CFX_RenderDevice*		m_pDevice;

+    CFX_AffineMatrix		m_DeviceMatrix;

+    CPDF_ClipPath			m_LastClipPath;

+    const CPDF_PageObject*	m_pCurObj;

+    const CPDF_PageObject*	m_pStopObj;

+    CPDF_GraphicStates		m_InitialStates;

+    int						m_HalftoneLimit;

+    IPDF_ObjectRenderer*	m_pObjectRenderer;

+    FX_BOOL					m_bPrint;

+    int						m_Transparency;

+    int						m_DitherBits;

+    FX_BOOL					m_bDropObjects;

+    FX_BOOL					m_bStdCS;

+    FX_DWORD                m_GroupFamily;

+    FX_BOOL                 m_bLoadMask;

+    CPDF_Type3Char *        m_pType3Char;

+    FX_ARGB					m_T3FillColor;

+    int                     m_curBlend;

+};

+class CPDF_ImageLoader : public CFX_Object

+{

+public:

+    CPDF_ImageLoader()

+    {

+        m_pBitmap = NULL;

+        m_pMask = NULL;

+        m_MatteColor = 0;

+        m_bCached = FALSE;

+        m_nDownsampleWidth = 0;

+        m_nDownsampleHeight = 0;

+    }

+

+    FX_BOOL					Load(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL);

+

+    FX_BOOL					StartLoadImage(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_LPVOID& LoadHandle, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 nDownsampleWidth = 0, FX_INT32 nDownsampleHeight = 0);

+    FX_BOOL					Continue(FX_LPVOID LoadHandle, IFX_Pause* pPause);

+    ~CPDF_ImageLoader();

+    CFX_DIBSource*			m_pBitmap;

+    CFX_DIBSource*			m_pMask;

+    FX_DWORD				m_MatteColor;

+    FX_BOOL					m_bCached;

+protected:

+    FX_INT32                m_nDownsampleWidth;

+    FX_INT32                m_nDownsampleHeight;

+};

+class CPDF_ProgressiveImageLoaderHandle : public CFX_Object

+{

+public:

+    CPDF_ProgressiveImageLoaderHandle();

+    ~CPDF_ProgressiveImageLoaderHandle();

+

+    FX_BOOL			Start(CPDF_ImageLoader* pImageLoader, const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 nDownsampleWidth = 0, FX_INT32 nDownsampleHeight = 0);

+    FX_BOOL			Continue(IFX_Pause* pPause);

+protected:

+    CPDF_ImageLoader*	m_pImageLoader;

+    CPDF_PageRenderCache* m_pCache;

+    CPDF_ImageObject* m_pImage;

+    FX_INT32            m_nDownsampleWidth;

+    FX_INT32            m_nDownsampleHeight;

+};

+class CFX_ImageTransformer;

+class CPDF_ImageRenderer : public IPDF_ObjectRenderer

+{

+public:

+    CPDF_ImageRenderer();

+    ~CPDF_ImageRenderer();

+    FX_BOOL		Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);

+    FX_BOOL		Start(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb,

+                      int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);

+    FX_BOOL		Continue(IFX_Pause* pPause);

+protected:

+    CPDF_RenderStatus*	m_pRenderStatus;

+    CPDF_ImageObject*	m_pImageObject;

+    int					m_Status;

+    const CFX_AffineMatrix* m_pObj2Device;

+    CFX_AffineMatrix	m_ImageMatrix;

+    CPDF_ImageLoader	m_Loader;

+    const CFX_DIBSource*		m_pDIBSource;

+    CFX_DIBitmap*		m_pClone;

+    int					m_BitmapAlpha;

+    FX_BOOL				m_bPatternColor;

+    CPDF_Pattern*		m_pPattern;

+    FX_ARGB				m_FillArgb;

+    FX_DWORD			m_Flags;

+    CPDF_QuickStretcher*	m_pQuickStretcher;

+    CFX_ImageTransformer*	m_pTransformer;

+    CPDF_ImageRenderer*	m_pRenderer2;

+    FX_LPVOID			m_DeviceHandle;

+    FX_LPVOID           m_LoadHandle;

+    FX_BOOL				m_bStdCS;

+    int					m_BlendType;

+    FX_BOOL				StartBitmapAlpha();

+    FX_BOOL				StartDIBSource();

+    FX_BOOL				StartRenderDIBSource();

+    FX_BOOL				StartLoadDIBSource();

+    FX_BOOL				DrawMaskedImage();

+    FX_BOOL				DrawPatternImage(const CFX_Matrix* pObj2Device);

+};

+class CPDF_ScaledRenderBuffer : public CFX_Object

+{

+public:

+    CPDF_ScaledRenderBuffer();

+    ~CPDF_ScaledRenderBuffer();

+    FX_BOOL				Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,

+                                   const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions = NULL, int max_dpi = 0);

+    CFX_RenderDevice*	GetDevice()

+    {

+        return m_pBitmapDevice ? m_pBitmapDevice : m_pDevice;

+    }

+    CFX_AffineMatrix*	GetMatrix()

+    {

+        return &m_Matrix;

+    }

+    void				OutputToDevice();

+private:

+    CFX_RenderDevice*	m_pDevice;

+    CPDF_RenderContext*	m_pContext;

+    FX_RECT				m_Rect;

+    const CPDF_PageObject* m_pObject;

+    CFX_FxgeDevice*	m_pBitmapDevice;

+    CFX_AffineMatrix	m_Matrix;

+};

+class ICodec_ScanlineDecoder;

+class CPDF_QuickStretcher : public CFX_Object

+{

+public:

+    CPDF_QuickStretcher();

+    ~CPDF_QuickStretcher();

+    FX_BOOL		Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox);

+    FX_BOOL		Continue(IFX_Pause* pPause);

+    CFX_DIBitmap*	m_pBitmap;

+    int			m_ResultLeft, m_ResultTop, m_ClipLeft, m_ClipTop;

+    int			m_DestWidth, m_DestHeight, m_ResultWidth, m_ResultHeight;

+    int			m_Bpp, m_SrcWidth, m_SrcHeight;

+    FX_BOOL		m_bFlipX, m_bFlipY;

+    CPDF_ColorSpace*	m_pCS;

+    ICodec_ScanlineDecoder*	m_pDecoder;

+    CPDF_StreamAcc m_StreamAcc;

+    int			m_LineIndex;

+};

+class CPDF_DeviceBuffer : public CFX_Object

+{

+public:

+    CPDF_DeviceBuffer();

+    ~CPDF_DeviceBuffer();

+    FX_BOOL				Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,

+                                   const CPDF_PageObject* pObj, int max_dpi = 0);

+    void				OutputToDevice();

+    CFX_DIBitmap*		GetBitmap() const

+    {

+        return m_pBitmap;

+    }

+    const CFX_AffineMatrix*	GetMatrix() const

+    {

+        return &m_Matrix;

+    }

+private:

+    CFX_RenderDevice*	m_pDevice;

+    CPDF_RenderContext*	m_pContext;

+    FX_RECT				m_Rect;

+    const CPDF_PageObject* m_pObject;

+    CFX_DIBitmap*		m_pBitmap;

+    CFX_AffineMatrix	m_Matrix;

+};

+class CPDF_ImageCache : public CFX_Object

+{

+public:

+    CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream);

+    ~CPDF_ImageCache();

+    void				ClearImageData();

+    void				Reset(const CFX_DIBitmap* pBitmap);

+    FX_BOOL				GetCachedBitmap(CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, CPDF_Dictionary* pPageResources,

+                                        FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE,

+                                        CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);

+    FX_DWORD			EstimateSize() const

+    {

+        return m_dwCacheSize;

+    }

+    FX_DWORD			GetTimeCount() const

+    {

+        return m_dwTimeCount;

+    }

+    CPDF_Stream*		GetStream() const

+    {

+        return m_pStream;

+    }

+    void				SetTimeCount(FX_DWORD dwTimeCount)

+    {

+        m_dwTimeCount = dwTimeCount;

+    }

+    int					m_dwTimeCount;

+public:

+    int					StartGetCachedBitmap(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,

+            FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0,

+            FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);

+    int					Continue(IFX_Pause* pPause);

+    int 				ContinueGetCachedBitmap();

+    CFX_DIBSource*		DetachBitmap();

+    CFX_DIBSource*		DetachMask();

+    CFX_DIBSource*		m_pCurBitmap;

+    CFX_DIBSource*		m_pCurMask;

+    FX_DWORD			m_MatteColor;

+    CPDF_RenderStatus*  m_pRenderStatus;

+protected:

+    CPDF_Document*		m_pDocument;

+    CPDF_Stream*		m_pStream;

+    CFX_DIBSource*		m_pCachedBitmap;

+    CFX_DIBSource*		m_pCachedMask;

+    FX_DWORD			m_dwCacheSize;

+    void	CalcSize();

+};

+typedef struct {

+    FX_FLOAT			m_DecodeMin;

+    FX_FLOAT			m_DecodeStep;

+    int					m_ColorKeyMin;

+    int					m_ColorKeyMax;

+} DIB_COMP_DATA;

+class CPDF_DIBSource : public CFX_DIBSource

+{

+public:

+    CPDF_DIBSource();

+    virtual ~CPDF_DIBSource();

+    FX_BOOL				Load(CPDF_Document* pDoc, const CPDF_Stream* pStream,

+                             CPDF_DIBSource** ppMask, FX_DWORD* pMatteColor,

+                             CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,

+                             FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);

+    virtual FX_BOOL		SkipToScanline(int line, IFX_Pause* pPause) const;

+    virtual	FX_LPBYTE	GetBuffer() const;

+    virtual FX_LPCBYTE	GetScanline(int line) const;

+    virtual void		DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,

+                                           int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;

+    virtual void		SetDownSampleSize(int dest_width, int dest_height) const;

+    CFX_DIBitmap*		GetBitmap() const;

+    void				ReleaseBitmap(CFX_DIBitmap*) const;

+    void				ClearImageData();

+public:

+    int					StartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask,

+                                           CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,

+                                           FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);

+    int					ContinueLoadDIBSource(IFX_Pause* pPause);

+    int					StratLoadMask();

+    int					StartLoadMaskDIB();

+    int					ContinueLoadMaskDIB(IFX_Pause* pPause);

+    int					ContinueToLoadMask();

+    CPDF_DIBSource*		DetachMask();

+    CPDF_DIBSource*		m_pMask;

+    FX_DWORD			m_MatteColor;

+    FX_LPVOID			m_pJbig2Context;

+    CPDF_StreamAcc*		m_pGlobalStream;

+    FX_BOOL				m_bStdCS;

+    int					m_Status;

+    CPDF_Object*		m_pMaskStream;

+    FX_BOOL				m_bHasMask;

+protected:

+    FX_BOOL				LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources);

+    CPDF_DIBSource*		LoadMask(FX_DWORD& MatteColor);

+    CPDF_DIBSource*		LoadMaskDIB(CPDF_Stream* pMask);

+    void				LoadJpxBitmap();

+    void				LoadJbig2Bitmap();

+    void				LoadPalette();

+    FX_BOOL				CreateDecoder();

+    void				TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const;

+	FX_DWORD            GetValidBpp() const;

+

+    CPDF_Document*		m_pDocument;

+    const CPDF_Stream*	m_pStream;

+    CPDF_StreamAcc*		m_pStreamAcc;

+    const CPDF_Dictionary*	m_pDict;

+    CPDF_ColorSpace*	m_pColorSpace;

+    FX_DWORD			m_Family, m_bpc, m_nComponents, m_GroupFamily;

+    FX_BOOL				m_bLoadMask;

+    FX_BOOL				m_bDefaultDecode, m_bImageMask, m_bColorKey;

+    DIB_COMP_DATA*		m_pCompData;

+    FX_LPBYTE			m_pLineBuf;

+    FX_LPBYTE			m_pMaskedLine;

+    CFX_DIBitmap*		m_pCachedBitmap;

+    ICodec_ScanlineDecoder*	m_pDecoder;

+};

+#ifdef _FPDFAPI_MINI_

+#define FPDF_HUGE_IMAGE_SIZE	3000000

+#else

+#define FPDF_HUGE_IMAGE_SIZE	60000000

+#endif

+class CPDF_DIBTransferFunc : public CFX_FilteredDIB

+{

+public:

+    CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc);

+    virtual FXDIB_Format	GetDestFormat();

+    virtual FX_ARGB*		GetDestPalette()

+    {

+        return NULL;

+    }

+    virtual void			TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const;

+    virtual void			TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const;

+    FX_LPCBYTE				m_RampR;

+    FX_LPCBYTE				m_RampG;

+    FX_LPCBYTE				m_RampB;

+};

+struct _CPDF_UniqueKeyGen {

+    void		Generate(int count, ...);

+    FX_CHAR		m_Key[128];

+    int			m_KeyLen;

+};

diff --git a/core/src/fpdfdoc/doc_action.cpp b/core/src/fpdfdoc/doc_action.cpp
new file mode 100644
index 0000000..f13bd27
--- /dev/null
+++ b/core/src/fpdfdoc/doc_action.cpp
@@ -0,0 +1,362 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+CPDF_Dest CPDF_Action::GetDest(CPDF_Document* pDoc) const

+{

+    if (m_pDict == NULL) {

+        return NULL;

+    }

+    CFX_ByteString type = m_pDict->GetString("S");

+    if (type != "GoTo" && type != "GoToR") {

+        return NULL;

+    }

+    CPDF_Object* pDest = m_pDict->GetElementValue("D");

+    if (pDest == NULL) {

+        return NULL;

+    }

+    if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {

+        CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));

+        CFX_ByteStringC name = pDest->GetString();

+        return name_tree.LookupNamedDest(pDoc, name);

+    } else if (pDest->GetType() == PDFOBJ_ARRAY) {

+        return (CPDF_Array*)pDest;

+    }

+    return NULL;

+}

+const FX_CHAR* g_sATypes[] = {"Unknown", "GoTo", "GoToR", "GoToE", "Launch", "Thread", "URI", "Sound", "Movie",

+                              "Hide",	"Named", "SubmitForm", "ResetForm", "ImportData", "JavaScript", "SetOCGState",

+                              "Rendition", "Trans", "GoTo3DView", ""

+                             };

+CPDF_Action::ActionType CPDF_Action::GetType() const

+{

+    ActionType eType = Unknown;

+    if (m_pDict != NULL) {

+        CFX_ByteString csType = m_pDict->GetString("S");

+        if (!csType.IsEmpty()) {

+            int i = 0;

+            while (g_sATypes[i][0] != '\0') {

+                if (csType == g_sATypes[i]) {

+                    return (ActionType)i;

+                }

+                i ++;

+            }

+        }

+    }

+    return eType;

+}

+CFX_WideString CPDF_Action::GetFilePath() const

+{

+    CFX_ByteString type = m_pDict->GetString("S");

+    if (type != "GoToR" && type != "Launch" &&

+            type != "SubmitForm" && type != "ImportData") {

+        return CFX_WideString();

+    }

+    CPDF_Object* pFile = m_pDict->GetElementValue("F");

+    CFX_WideString path;

+    if (pFile == NULL) {

+        if (type == "Launch") {

+            CPDF_Dictionary* pWinDict = m_pDict->GetDict(FX_BSTRC("Win"));

+            if (pWinDict) {

+                return CFX_WideString::FromLocal(pWinDict->GetString(FX_BSTRC("F")));

+            }

+        }

+        return path;

+    }

+    CPDF_FileSpec filespec(pFile);

+    filespec.GetFileName(path);

+    return path;

+}

+CFX_ByteString CPDF_Action::GetURI(CPDF_Document* pDoc) const

+{

+    CFX_ByteString csURI;

+    if (m_pDict == NULL) {

+        return csURI;

+    }

+    if (m_pDict->GetString("S") != "URI") {

+        return csURI;

+    }

+    csURI = m_pDict->GetString("URI");

+    CPDF_Dictionary* pRoot = pDoc->GetRoot();

+    CPDF_Dictionary* pURI = pRoot->GetDict("URI");

+    if (pURI != NULL) {

+        if (csURI.Find(FX_BSTRC(":"), 0) < 1) {

+            csURI = pURI->GetString("Base") + csURI;

+        }

+    }

+    return csURI;

+}

+FX_DWORD CPDF_ActionFields::GetFieldsCount() const

+{

+    if (m_pAction == NULL) {

+        return 0;

+    }

+    CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);

+    if (pDict == NULL) {

+        return 0;

+    }

+    CFX_ByteString csType = pDict->GetString("S");

+    CPDF_Object* pFields = NULL;

+    if (csType == "Hide") {

+        pFields = pDict->GetElementValue("T");

+    } else {

+        pFields = pDict->GetArray("Fields");

+    }

+    if (pFields == NULL) {

+        return 0;

+    }

+    int iType = pFields->GetType();

+    if (iType == PDFOBJ_DICTIONARY) {

+        return 1;

+    } else if (iType == PDFOBJ_STRING) {

+        return 1;

+    } else if (iType == PDFOBJ_ARRAY) {

+        return ((CPDF_Array*)pFields)->GetCount();

+    }

+    return 0;

+}

+void CPDF_ActionFields::GetAllFields(CFX_PtrArray& fieldObjects) const

+{

+    fieldObjects.RemoveAll();

+    if (m_pAction == NULL) {

+        return;

+    }

+    CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);

+    if (pDict == NULL) {

+        return;

+    }

+    CFX_ByteString csType = pDict->GetString("S");

+    CPDF_Object* pFields = NULL;

+    if (csType == "Hide") {

+        pFields = pDict->GetElementValue("T");

+    } else {

+        pFields = pDict->GetArray("Fields");

+    }

+    if (pFields == NULL) {

+        return;

+    }

+    int iType = pFields->GetType();

+    if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) {

+        fieldObjects.Add(pFields);

+    } else if (iType == PDFOBJ_ARRAY) {

+        CPDF_Array* pArray = (CPDF_Array*)pFields;

+        FX_DWORD iCount = pArray->GetCount();

+        for (FX_DWORD i = 0; i < iCount; i ++) {

+            CPDF_Object* pObj = pArray->GetElementValue(i);

+            if (pObj != NULL) {

+                fieldObjects.Add(pObj);

+            }

+        }

+    }

+}

+CPDF_Object* CPDF_ActionFields::GetField(FX_DWORD iIndex) const

+{

+    if (m_pAction == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);

+    if (pDict == NULL) {

+        return NULL;

+    }

+    CFX_ByteString csType = pDict->GetString("S");

+    CPDF_Object* pFields = NULL;

+    if (csType == "Hide") {

+        pFields = pDict->GetElementValue("T");

+    } else {

+        pFields = pDict->GetArray("Fields");

+    }

+    if (pFields == NULL) {

+        return NULL;

+    }

+    CPDF_Object* pFindObj = NULL;

+    int iType = pFields->GetType();

+    if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) {

+        if (iIndex == 0) {

+            pFindObj = pFields;

+        }

+    } else if (iType == PDFOBJ_ARRAY) {

+        pFindObj = ((CPDF_Array*)pFields)->GetElementValue(iIndex);

+    }

+    return pFindObj;

+}

+CPDF_LWinParam CPDF_Action::GetWinParam() const

+{

+    if (m_pDict == NULL) {

+        return NULL;

+    }

+    if (m_pDict->GetString("S") != "Launch") {

+        return NULL;

+    }

+    return m_pDict->GetDict("Win");

+}

+CFX_WideString CPDF_Action::GetJavaScript() const

+{

+    CFX_WideString csJS;

+    if (m_pDict == NULL) {

+        return csJS;

+    }

+    CPDF_Object* pJS = m_pDict->GetElementValue("JS");

+    if (pJS != NULL) {

+        return pJS->GetUnicodeText();

+    }

+    return csJS;

+}

+CPDF_Dictionary* CPDF_Action::GetAnnot() const

+{

+    if (m_pDict == NULL) {

+        return NULL;

+    }

+    CFX_ByteString csType = m_pDict->GetString("S");

+    if (csType == FX_BSTRC("Rendition")) {

+        return m_pDict->GetDict("AN");

+    } else if (csType == FX_BSTRC("Movie")) {

+        return m_pDict->GetDict("Annotation");

+    }

+    return NULL;

+}

+FX_INT32 CPDF_Action::GetOperationType() const

+{

+    if (m_pDict == NULL) {

+        return 0;

+    }

+    CFX_ByteString csType = m_pDict->GetString("S");

+    if (csType == FX_BSTRC("Rendition")) {

+        return m_pDict->GetInteger("OP");

+    } else if (csType == FX_BSTRC("Movie")) {

+        CFX_ByteString csOP = m_pDict->GetString("Operation");

+        if (csOP == FX_BSTRC("Play")) {

+            return 0;

+        } else if (csOP == FX_BSTRC("Stop")) {

+            return 1;

+        } else if (csOP == FX_BSTRC("Pause")) {

+            return 2;

+        } else if (csOP == FX_BSTRC("Resume")) {

+            return 3;

+        }

+    }

+    return 0;

+}

+FX_DWORD CPDF_Action::GetSubActionsCount() const

+{

+    if (m_pDict == NULL || !m_pDict->KeyExist("Next")) {

+        return 0;

+    }

+    CPDF_Object* pNext = m_pDict->GetElementValue("Next");

+    if (!pNext) {

+        return 0;

+    }

+    int iObjType = pNext->GetType();

+    if (iObjType == PDFOBJ_DICTIONARY) {

+        return 1;

+    }

+    if (iObjType == PDFOBJ_ARRAY) {

+        return ((CPDF_Array*)pNext)->GetCount();

+    }

+    return 0;

+}

+CPDF_Action CPDF_Action::GetSubAction(FX_DWORD iIndex) const

+{

+    if (m_pDict == NULL || !m_pDict->KeyExist("Next")) {

+        return NULL;

+    }

+    CPDF_Object* pNext = m_pDict->GetElementValue("Next");

+    int iObjType = pNext->GetType();

+    if (iObjType == PDFOBJ_DICTIONARY) {

+        if (iIndex == 0) {

+            return (CPDF_Dictionary*)pNext;

+        }

+    }

+    if (iObjType == PDFOBJ_ARRAY) {

+        return ((CPDF_Array*)pNext)->GetDict(iIndex);

+    }

+    return NULL;

+}

+const FX_CHAR* g_sAATypes[] = {"E", "X", "D", "U", "Fo", "Bl", "PO", "PC", "PV", "PI",

+                               "O", "C",

+                               "K", "F", "V", "C",

+                               "WC", "WS", "DS", "WP", "DP",

+                               ""

+                              };

+FX_BOOL CPDF_AAction::ActionExist(AActionType eType) const

+{

+    if (m_pDict == NULL) {

+        return FALSE;

+    }

+    return m_pDict->KeyExist(g_sAATypes[(int)eType]);

+}

+CPDF_Action CPDF_AAction::GetAction(AActionType eType) const

+{

+    if (m_pDict == NULL) {

+        return NULL;

+    }

+    return m_pDict->GetDict(g_sAATypes[(int)eType]);

+}

+FX_POSITION CPDF_AAction::GetStartPos() const

+{

+    if (m_pDict == NULL) {

+        return NULL;

+    }

+    return m_pDict->GetStartPos();

+}

+CPDF_Action CPDF_AAction::GetNextAction(FX_POSITION& pos, AActionType& eType) const

+{

+    if (m_pDict == NULL) {

+        return NULL;

+    }

+    CFX_ByteString csKey;

+    CPDF_Object* pObj = m_pDict->GetNextElement(pos, csKey);

+    if (pObj != NULL) {

+        CPDF_Object* pDirect = pObj->GetDirect();

+        if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {

+            int i = 0;

+            while (g_sAATypes[i][0] != '\0') {

+                if (csKey == g_sAATypes[i]) {

+                    break;

+                }

+                i ++;

+            }

+            eType = (AActionType)i;

+            return (CPDF_Dictionary*)pDirect;

+        }

+    }

+    return NULL;

+}

+CPDF_DocJSActions::CPDF_DocJSActions(CPDF_Document* pDoc)

+{

+    m_pDocument = pDoc;

+}

+int CPDF_DocJSActions::CountJSActions() const

+{

+    ASSERT(m_pDocument != NULL);

+    CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));

+    return name_tree.GetCount();

+}

+CPDF_Action CPDF_DocJSActions::GetJSAction(int index, CFX_ByteString& csName) const

+{

+    ASSERT(m_pDocument != NULL);

+    CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));

+    CPDF_Object *pAction = name_tree.LookupValue(index, csName);

+    if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) {

+        return NULL;

+    }

+    return pAction->GetDict();

+}

+CPDF_Action CPDF_DocJSActions::GetJSAction(const CFX_ByteString& csName) const

+{

+    ASSERT(m_pDocument != NULL);

+    CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));

+    CPDF_Object *pAction = name_tree.LookupValue(csName);

+    if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) {

+        return NULL;

+    }

+    return pAction->GetDict();

+}

+int CPDF_DocJSActions::FindJSAction(const CFX_ByteString& csName) const

+{

+    ASSERT(m_pDocument != NULL);

+    CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));

+    return name_tree.GetIndex(csName);

+}

diff --git a/core/src/fpdfdoc/doc_annot.cpp b/core/src/fpdfdoc/doc_annot.cpp
new file mode 100644
index 0000000..da30485
--- /dev/null
+++ b/core/src/fpdfdoc/doc_annot.cpp
@@ -0,0 +1,519 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+#include "../../include/fpdfapi/fpdf_pageobj.h"

+CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage)

+{

+    ASSERT(pPage != NULL);

+    m_pPageDict = pPage->m_pFormDict;

+    if (m_pPageDict == NULL) {

+        return;

+    }

+    m_pDocument = pPage->m_pDocument;

+    CPDF_Array* pAnnots = m_pPageDict->GetArray("Annots");

+    if (pAnnots == NULL) {

+        return;

+    }

+    CPDF_Dictionary* pRoot = m_pDocument->GetRoot();

+    CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");

+    FX_BOOL bRegenerateAP = pAcroForm && pAcroForm->GetBoolean("NeedAppearances");

+    for (FX_DWORD i = 0; i < pAnnots->GetCount(); i ++) {

+        CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);

+        if (pDict == NULL || pDict->GetType() != PDFOBJ_DICTIONARY) {

+            continue;

+        }

+        FX_DWORD dwObjNum = pDict->GetObjNum();

+        if (dwObjNum == 0) {

+            dwObjNum = m_pDocument->AddIndirectObject(pDict);

+            CPDF_Reference* pAction = CPDF_Reference::Create(m_pDocument, dwObjNum);

+            if (pAction == NULL) {

+                break;

+            }

+            pAnnots->InsertAt(i, pAction);

+            pAnnots->RemoveAt(i + 1);

+            pDict = pAnnots->GetDict(i);

+        }

+        CPDF_Annot* pAnnot = FX_NEW CPDF_Annot(pDict);

+        if (pAnnot == NULL) {

+            break;

+        }

+        pAnnot->m_pList = this;

+        m_AnnotList.Add(pAnnot);

+        if (bRegenerateAP && pDict->GetConstString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget"))

+            if (CPDF_InterForm::UpdatingAPEnabled()) {

+                FPDF_GenerateAP(m_pDocument, pDict);

+            }

+    }

+}

+CPDF_AnnotList::~CPDF_AnnotList()

+{

+    int i = 0;

+    for (i = 0; i < m_AnnotList.GetSize(); i ++) {

+        delete (CPDF_Annot*)m_AnnotList[i];

+    }

+    for (i = 0; i < m_Borders.GetSize(); ++i) {

+        delete (CPDF_PageObjects*)m_Borders[i];

+    }

+}

+void CPDF_AnnotList::DisplayPass(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,

+                                 CPDF_RenderContext* pContext, FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix,

+                                 FX_BOOL bWidgetPass, CPDF_RenderOptions* pOptions, FX_RECT* clip_rect)

+{

+    for (int i = 0; i < m_AnnotList.GetSize(); i ++) {

+        CPDF_Annot* pAnnot = (CPDF_Annot*)m_AnnotList[i];

+        FX_BOOL bWidget = pAnnot->GetSubType() == "Widget";

+        if ((bWidgetPass && !bWidget) || (!bWidgetPass && bWidget)) {

+            continue;

+        }

+        FX_DWORD annot_flags = pAnnot->GetFlags();

+        if (annot_flags & ANNOTFLAG_HIDDEN) {

+            continue;

+        }

+        if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {

+            continue;

+        }

+        if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {

+            continue;

+        }

+        if (pOptions != NULL) {

+            IPDF_OCContext* pOCContext = pOptions->m_pOCContext;

+            CPDF_Dictionary* pAnnotDict = pAnnot->m_pAnnotDict;

+            if (pOCContext != NULL && pAnnotDict != NULL &&

+                    !pOCContext->CheckOCGVisible(pAnnotDict->GetDict(FX_BSTRC("OC")))) {

+                continue;

+            }

+        }

+        CPDF_Rect annot_rect_f;

+        pAnnot->GetRect(annot_rect_f);

+        CFX_Matrix matrix;

+        matrix = *pMatrix;

+        if (clip_rect) {

+            annot_rect_f.Transform(&matrix);

+            FX_RECT annot_rect = annot_rect_f.GetOutterRect();

+            annot_rect.Intersect(*clip_rect);

+            if (annot_rect.IsEmpty()) {

+                continue;

+            }

+        }

+        if (pContext) {

+            pAnnot->DrawInContext(pPage, pContext, &matrix, CPDF_Annot::Normal);

+        } else if (!pAnnot->DrawAppearance(pPage, pDevice, &matrix, CPDF_Annot::Normal, pOptions)) {

+            pAnnot->DrawBorder(pDevice, &matrix, pOptions);

+        }

+    }

+}

+void CPDF_AnnotList::DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,

+                                   CFX_AffineMatrix* pUser2Device,

+                                   FX_BOOL bShowWidget, CPDF_RenderOptions* pOptions)

+{

+    FX_RECT clip_rect;

+    if (pDevice) {

+        clip_rect = pDevice->GetClipBox();

+    }

+    FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));

+    DisplayAnnots(pPage, pDevice, NULL, bPrinting, pUser2Device, bShowWidget ? 3 : 1, pOptions, &clip_rect);

+}

+void CPDF_AnnotList::DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, CPDF_RenderContext* pContext,

+                                   FX_BOOL bPrinting, CFX_AffineMatrix* pUser2Device, FX_DWORD dwAnnotFlags,

+                                   CPDF_RenderOptions* pOptions, FX_RECT* pClipRect)

+{

+    if (dwAnnotFlags & 0x01) {

+        DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, FALSE, pOptions, pClipRect);

+    }

+    if (dwAnnotFlags & 0x02) {

+        DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, TRUE, pOptions, pClipRect);

+    }

+}

+int CPDF_AnnotList::GetIndex(CPDF_Annot* pAnnot)

+{

+    for (int i = 0; i < m_AnnotList.GetSize(); i ++)

+        if (m_AnnotList[i] == (FX_LPVOID)pAnnot) {

+            return i;

+        }

+    return -1;

+}

+CPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict)

+{

+    m_pList = NULL;

+    m_pAnnotDict = pDict;

+}

+CPDF_Annot::~CPDF_Annot()

+{

+    ClearCachedAP();

+}

+CPDF_Reference* CPDF_Annot::NewAnnotRef()

+{

+    if (m_pAnnotDict->GetObjNum() == 0) {

+        m_pList->m_pDocument->AddIndirectObject(m_pAnnotDict);

+    }

+    return CPDF_Reference::Create(m_pList->m_pDocument, m_pAnnotDict->GetObjNum());

+}

+void CPDF_Annot::ClearCachedAP()

+{

+    FX_POSITION pos = m_APMap.GetStartPosition();

+    while (pos) {

+        void* pForm;

+        void* pObjects;

+        m_APMap.GetNextAssoc(pos, pForm, pObjects);

+        delete (CPDF_PageObjects*)pObjects;

+    }

+    m_APMap.RemoveAll();

+}

+CFX_ByteString CPDF_Annot::GetSubType() const

+{

+    return m_pAnnotDict->GetConstString(FX_BSTRC("Subtype"));

+}

+void CPDF_Annot::GetRect(CPDF_Rect& rect) const

+{

+    if (m_pAnnotDict == NULL) {

+        return;

+    }

+    rect = m_pAnnotDict->GetRect("Rect");

+    rect.Normalize();

+}

+CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode mode)

+{

+    CPDF_Dictionary* pAP = pAnnotDict->GetDict("AP");

+    if (pAP == NULL) {

+        return NULL;

+    }

+    const FX_CHAR* ap_entry = "N";

+    if (mode == CPDF_Annot::Down) {

+        ap_entry = "D";

+    } else if (mode == CPDF_Annot::Rollover) {

+        ap_entry = "R";

+    }

+    if (!pAP->KeyExist(ap_entry)) {

+        ap_entry = "N";

+    }

+    CPDF_Object* psub = pAP->GetElementValue(ap_entry);

+    if (psub == NULL) {

+        return NULL;

+    }

+    CPDF_Stream* pStream = NULL;

+    if (psub->GetType() == PDFOBJ_STREAM) {

+        pStream = (CPDF_Stream*)psub;

+    } else if (psub->GetType() == PDFOBJ_DICTIONARY) {

+        CFX_ByteString as = pAnnotDict->GetString("AS");

+        if (as.IsEmpty()) {

+            CFX_ByteString value = pAnnotDict->GetString(FX_BSTRC("V"));

+            if (value.IsEmpty()) {

+                value = pAnnotDict->GetDict(FX_BSTRC("Parent"))->GetString(FX_BSTRC("V"));

+            }

+            if (value.IsEmpty() || !((CPDF_Dictionary*)psub)->KeyExist(value)) {

+                as = FX_BSTRC("Off");

+            } else {

+                as = value;

+            }

+        }

+        pStream = ((CPDF_Dictionary*)psub)->GetStream(as);

+    }

+    return pStream;

+}

+CPDF_Form* CPDF_Annot::GetAPForm(const CPDF_Page* pPage, AppearanceMode mode)

+{

+    CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pAnnotDict, mode);

+    if (pStream == NULL) {

+        return NULL;

+    }

+    CPDF_Form* pForm;

+    if (m_APMap.Lookup(pStream, (void*&)pForm)) {

+        return pForm;

+    }

+    pForm = FX_NEW CPDF_Form(m_pList->m_pDocument, pPage->m_pResources, pStream);

+    if (pForm == NULL) {

+        return NULL;

+    }

+    pForm->ParseContent(NULL, NULL, NULL, NULL);

+    m_APMap.SetAt(pStream, pForm);

+    return pForm;

+}

+static CPDF_Form* FPDFDOC_Annot_GetMatrix(const CPDF_Page* pPage, CPDF_Annot* pAnnot, CPDF_Annot::AppearanceMode mode, const CFX_AffineMatrix* pUser2Device, CFX_Matrix &matrix)

+{

+    CPDF_Form* pForm = pAnnot->GetAPForm(pPage, mode);

+    if (!pForm) {

+        return NULL;

+    }

+    CFX_FloatRect form_bbox = pForm->m_pFormDict->GetRect(FX_BSTRC("BBox"));

+    CFX_Matrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));

+    form_matrix.TransformRect(form_bbox);

+    CPDF_Rect arect;

+    pAnnot->GetRect(arect);

+    matrix.MatchRect(arect, form_bbox);

+    matrix.Concat(*pUser2Device);

+    return pForm;

+}

+FX_BOOL CPDF_Annot::DrawAppearance(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,

+                                   AppearanceMode mode, const CPDF_RenderOptions* pOptions)

+{

+    CFX_Matrix matrix;

+    CPDF_Form* pForm = FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix);

+    if (!pForm) {

+        return FALSE;

+    }

+    CPDF_RenderContext context;

+    context.Create((CPDF_Page*)pPage);

+    context.DrawObjectList(pDevice, pForm, &matrix, pOptions);

+    return TRUE;

+}

+FX_BOOL CPDF_Annot::DrawInContext(const CPDF_Page* pPage, const CPDF_RenderContext* pContext, const CFX_AffineMatrix* pUser2Device, AppearanceMode mode)

+{

+    CFX_Matrix matrix;

+    CPDF_Form* pForm = FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix);

+    if (!pForm) {

+        return FALSE;

+    }

+    ((CPDF_RenderContext*)pContext)->AppendObjectList(pForm, &matrix);

+    return TRUE;

+}

+CPDF_PageObject* CPDF_Annot::GetBorder(FX_BOOL bPrint, const CPDF_RenderOptions* pOptions)

+{

+    if (GetSubType() == "Popup") {

+        return NULL;

+    }

+    FX_DWORD annot_flags = GetFlags();

+    if (annot_flags & ANNOTFLAG_HIDDEN) {

+        return NULL;

+    }

+    FX_BOOL bPrinting = bPrint || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));

+    if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {

+        return NULL;

+    }

+    if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {

+        return NULL;

+    }

+    CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS");

+    char style_char;

+    FX_FLOAT width;

+    CPDF_Array* pDashArray = NULL;

+    if (pBS == NULL) {

+        CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border");

+        style_char = 'S';

+        if (pBorderArray) {

+            width = pBorderArray->GetNumber(2);

+            if (pBorderArray->GetCount() == 4) {

+                pDashArray = pBorderArray->GetArray(3);

+                if (pDashArray == NULL) {

+                    return NULL;

+                }

+                style_char = 'D';

+            }

+        } else {

+            width = 1;

+        }

+    } else {

+        CFX_ByteString style = pBS->GetString("S");

+        pDashArray = pBS->GetArray("D");

+        style_char = style[1];

+        width = pBS->GetNumber("W");

+    }

+    if (width <= 0) {

+        return NULL;

+    }

+    CPDF_Array* pColor = m_pAnnotDict->GetArray("C");

+    FX_DWORD argb = 0xff000000;

+    if (pColor != NULL) {

+        int R = (FX_INT32)(pColor->GetNumber(0) * 255);

+        int G = (FX_INT32)(pColor->GetNumber(1) * 255);

+        int B = (FX_INT32)(pColor->GetNumber(2) * 255);

+        argb = ArgbEncode(0xff, R, G, B);

+    }

+    CPDF_PathObject *pPathObject = FX_NEW CPDF_PathObject();

+    if (!pPathObject) {

+        return NULL;

+    }

+    CPDF_GraphStateData *pGraphState = pPathObject->m_GraphState.GetModify();

+    if (!pGraphState) {

+        pPathObject->Release();

+        return NULL;

+    }

+    pGraphState->m_LineWidth = width;

+    CPDF_ColorStateData *pColorData = pPathObject->m_ColorState.GetModify();

+    if (!pColorData) {

+        pPathObject->Release();

+        return NULL;

+    }

+    pColorData->m_StrokeRGB = argb;

+    pPathObject->m_bStroke = TRUE;

+    pPathObject->m_FillType = 0;

+    if (style_char == 'D') {

+        if (pDashArray) {

+            FX_DWORD dash_count = pDashArray->GetCount();

+            if (dash_count % 2) {

+                dash_count ++;

+            }

+            pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, dash_count);

+            if (pGraphState->m_DashArray == NULL) {

+                pPathObject->Release();

+                return NULL;

+            }

+            pGraphState->m_DashCount = dash_count;

+            FX_DWORD i;

+            for (i = 0; i < pDashArray->GetCount(); i ++) {

+                pGraphState->m_DashArray[i] = pDashArray->GetNumber(i);

+            }

+            if (i < dash_count) {

+                pGraphState->m_DashArray[i] = pGraphState->m_DashArray[i - 1];

+            }

+        } else {

+            pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, 2);

+            if (pGraphState->m_DashArray == NULL) {

+                pPathObject->Release();

+                return NULL;

+            }

+            pGraphState->m_DashCount = 2;

+            pGraphState->m_DashArray[0] = pGraphState->m_DashArray[1] = 3 * 1.0f;

+        }

+    }

+    CFX_FloatRect rect;

+    GetRect(rect);

+    width /= 2;

+    CPDF_PathData *pPathData = pPathObject->m_Path.GetModify();

+    if (pPathData) {

+        pPathData->AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width);

+    }

+    pPathObject->CalcBoundingBox();

+    return pPathObject;

+}

+void CPDF_Annot::DrawBorder(CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device, const CPDF_RenderOptions* pOptions)

+{

+    if (GetSubType() == "Popup") {

+        return;

+    }

+    FX_DWORD annot_flags = GetFlags();

+    if (annot_flags & ANNOTFLAG_HIDDEN) {

+        return;

+    }

+    FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));

+    if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {

+        return;

+    }

+    if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {

+        return;

+    }

+    CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS");

+    char style_char;

+    FX_FLOAT width;

+    CPDF_Array* pDashArray = NULL;

+    if (pBS == NULL) {

+        CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border");

+        style_char = 'S';

+        if (pBorderArray) {

+            width = pBorderArray->GetNumber(2);

+            if (pBorderArray->GetCount() == 4) {

+                pDashArray = pBorderArray->GetArray(3);

+                if (pDashArray == NULL) {

+                    return;

+                }

+                int nLen = pDashArray->GetCount();

+                int i = 0;

+                for (; i < nLen; ++i) {

+                    CPDF_Object*pObj = pDashArray->GetElementValue(i);

+                    if (pObj && pObj->GetInteger()) {

+                        break;

+                    }

+                }

+                if (i == nLen) {

+                    return;

+                }

+                style_char = 'D';

+            }

+        } else {

+            width = 1;

+        }

+    } else {

+        CFX_ByteString style = pBS->GetString("S");

+        pDashArray = pBS->GetArray("D");

+        style_char = style[1];

+        width = pBS->GetNumber("W");

+    }

+    if (width <= 0) {

+        return;

+    }

+    CPDF_Array* pColor = m_pAnnotDict->GetArray("C");

+    FX_DWORD argb = 0xff000000;

+    if (pColor != NULL) {

+        int R = (FX_INT32)(pColor->GetNumber(0) * 255);

+        int G = (FX_INT32)(pColor->GetNumber(1) * 255);

+        int B = (FX_INT32)(pColor->GetNumber(2) * 255);

+        argb = ArgbEncode(0xff, R, G, B);

+    }

+    CPDF_GraphStateData graph_state;

+    graph_state.m_LineWidth = width;

+    if (style_char == 'D') {

+        if (pDashArray) {

+            FX_DWORD dash_count = pDashArray->GetCount();

+            if (dash_count % 2) {

+                dash_count ++;

+            }

+            graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count);

+            if (graph_state.m_DashArray == NULL) {

+                return ;

+            }

+            graph_state.m_DashCount = dash_count;

+            FX_DWORD i;

+            for (i = 0; i < pDashArray->GetCount(); i ++) {

+                graph_state.m_DashArray[i] = pDashArray->GetNumber(i);

+            }

+            if (i < dash_count) {

+                graph_state.m_DashArray[i] = graph_state.m_DashArray[i - 1];

+            }

+        } else {

+            graph_state.m_DashArray = FX_Alloc(FX_FLOAT, 2);

+            if (graph_state.m_DashArray == NULL) {

+                return ;

+            }

+            graph_state.m_DashCount = 2;

+            graph_state.m_DashArray[0] = graph_state.m_DashArray[1] = 3 * 1.0f;

+        }

+    }

+    CFX_FloatRect rect;

+    GetRect(rect);

+    CPDF_PathData path;

+    width /= 2;

+    path.AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width);

+    int fill_type = 0;

+    if (pOptions && (pOptions->m_Flags & RENDER_NOPATHSMOOTH)) {

+        fill_type |= FXFILL_NOPATHSMOOTH;

+    }

+    pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type);

+}

+int CPDF_Annot::CountIRTNotes()

+{

+    int count = 0;

+    for (int i = 0; i < m_pList->Count(); i ++) {

+        CPDF_Annot* pAnnot = m_pList->GetAt(i);

+        if (pAnnot == NULL) {

+            continue;

+        }

+        CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict("IRT");

+        if (pIRT != m_pAnnotDict) {

+            continue;

+        }

+        count ++;

+    }

+    return count;

+}

+CPDF_Annot* CPDF_Annot::GetIRTNote(int index)

+{

+    int count = 0;

+    for (int i = 0; i < m_pList->Count(); i ++) {

+        CPDF_Annot* pAnnot = m_pList->GetAt(i);

+        if (pAnnot == NULL) {

+            continue;

+        }

+        CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict("IRT");

+        if (pIRT != m_pAnnotDict) {

+            continue;

+        }

+        if (count == index) {

+            return pAnnot;

+        }

+        count ++;

+    }

+    return NULL;

+}

diff --git a/core/src/fpdfdoc/doc_ap.cpp b/core/src/fpdfdoc/doc_ap.cpp
new file mode 100644
index 0000000..0afe718
--- /dev/null
+++ b/core/src/fpdfdoc/doc_ap.cpp
@@ -0,0 +1,808 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+#include "../../include/fpdfdoc/fpdf_vt.h"

+#include "pdf_vt.h"

+#include "../../include/fpdfdoc/fpdf_ap.h"

+FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)

+{

+    if (pAnnotDict->GetConstString("Subtype") != FX_BSTRC("Widget")) {

+        return FALSE;

+    }

+    CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString();

+    FX_DWORD flags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger();

+    if (field_type == "Tx") {

+        return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict);

+    } else if (field_type == "Ch") {

+        if (flags & (1 << 17)) {

+            return CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict);

+        } else {

+            return CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict);

+        }

+    } else if (field_type == "Btn") {

+        if (!(flags & (1 << 16))) {

+            if (!pAnnotDict->KeyExist("AS")) {

+                if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDict("Parent")) {

+                    if (pParentDict->KeyExist("AS")) {

+                        pAnnotDict->SetAtString("AS", pParentDict->GetString("AS"));

+                    }

+                }

+            }

+        }

+    }

+    return FALSE;

+}

+class CPVT_FontMap : public IPVT_FontMap

+{

+public:

+    CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont,

+                 const CFX_ByteString & sDefFontAlias);

+    virtual ~CPVT_FontMap();

+    CPDF_Font*						GetPDFFont(FX_INT32 nFontIndex);

+    CFX_ByteString					GetPDFFontAlias(FX_INT32 nFontIndex);

+    static void						GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict,

+            CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias);

+private:

+    CPDF_Document*					m_pDocument;

+    CPDF_Dictionary*				m_pResDict;

+    CPDF_Font*						m_pDefFont;

+    CFX_ByteString					m_sDefFontAlias;

+    CPDF_Font*						m_pSysFont;

+    CFX_ByteString					m_sSysFontAlias;

+};

+CPVT_FontMap::CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont,

+                           const CFX_ByteString & sDefFontAlias) :

+    m_pDocument(pDoc),

+    m_pResDict(pResDict),

+    m_pDefFont(pDefFont),

+    m_sDefFontAlias(sDefFontAlias),

+    m_pSysFont(NULL),

+    m_sSysFontAlias()

+{

+}

+CPVT_FontMap::~CPVT_FontMap()

+{

+}

+extern CPDF_Font*		AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);

+void CPVT_FontMap::GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict,

+                                      CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias)

+{

+    if (pDoc && pResDict) {

+        CFX_ByteString sFontAlias;

+        CPDF_Dictionary* pFormDict = pDoc->GetRoot()->GetDict("AcroForm");

+        if (CPDF_Font * pPDFFont = AddNativeInterFormFont(pFormDict, pDoc, sSysFontAlias)) {

+            if (CPDF_Dictionary * pFontList = pResDict->GetDict("Font")) {

+                if (!pFontList->KeyExist(sSysFontAlias)) {

+                    pFontList->SetAtReference(sSysFontAlias, pDoc, pPDFFont->GetFontDict());

+                }

+            }

+            pSysFont = pPDFFont;

+        }

+    }

+}

+CPDF_Font* CPVT_FontMap::GetPDFFont(FX_INT32 nFontIndex)

+{

+    switch (nFontIndex) {

+        case 0:

+            return m_pDefFont;

+        case 1:

+            if (!m_pSysFont) {

+                GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias);

+            }

+            return m_pSysFont;

+    }

+    return NULL;

+}

+CFX_ByteString CPVT_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex)

+{

+    switch (nFontIndex) {

+        case 0:

+            return m_sDefFontAlias;

+        case 1:

+            if (!m_pSysFont) {

+                GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias);

+            }

+            return m_sSysFontAlias;

+    }

+    return "";

+}

+CPVT_Provider::CPVT_Provider(IPVT_FontMap * pFontMap) : m_pFontMap(pFontMap)

+{

+    ASSERT (m_pFontMap != NULL);

+}

+CPVT_Provider::~CPVT_Provider()

+{

+}

+FX_INT32 CPVT_Provider::GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle)

+{

+    if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {

+        FX_DWORD charcode = pPDFFont->CharCodeFromUnicode(word);

+        if (charcode != -1) {

+            return pPDFFont->GetCharWidthF(charcode);

+        }

+    }

+    return 0;

+}

+FX_INT32 CPVT_Provider::GetTypeAscent(FX_INT32 nFontIndex)

+{

+    if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {

+        return pPDFFont->GetTypeAscent();

+    }

+    return 0;

+}

+FX_INT32 CPVT_Provider::GetTypeDescent(FX_INT32 nFontIndex)

+{

+    if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {

+        return pPDFFont->GetTypeDescent();

+    }

+    return 0;

+}

+FX_INT32 CPVT_Provider::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)

+{

+    if (CPDF_Font* pDefFont = m_pFontMap->GetPDFFont(0)) {

+        if (pDefFont->CharCodeFromUnicode(word) != -1) {

+            return 0;

+        }

+    }

+    if (CPDF_Font* pSysFont = m_pFontMap->GetPDFFont(1))

+        if (pSysFont->CharCodeFromUnicode(word) != -1) {

+            return 1;

+        }

+    return -1;

+}

+FX_BOOL CPVT_Provider::IsLatinWord(FX_WORD word)

+{

+    if ((word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) || word == 0x2D || word == 0x27) {

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_INT32 CPVT_Provider::GetDefaultFontIndex()

+{

+    return 0;

+}

+static CFX_ByteString GetPDFWordString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord)

+{

+    CFX_ByteString sWord;

+    if (SubWord > 0) {

+        sWord.Format("%c", SubWord);

+    } else {

+        if (pFontMap) {

+            if (CPDF_Font * pPDFFont = pFontMap->GetPDFFont(nFontIndex)) {

+                if (pPDFFont->GetBaseFont().Compare("Symbol") == 0 || pPDFFont->GetBaseFont().Compare("ZapfDingbats") == 0) {

+                    sWord.Format("%c", Word);

+                } else {

+                    FX_DWORD dwCharCode = pPDFFont->CharCodeFromUnicode(Word);

+                    if (dwCharCode != -1) {

+                        pPDFFont->AppendChar(sWord, dwCharCode);

+                    }

+                }

+            }

+        }

+    }

+    return sWord;

+}

+static CFX_ByteString GetWordRenderString(const CFX_ByteString & strWords)

+{

+    if (strWords.GetLength() > 0) {

+        return PDF_EncodeString(strWords) + " Tj\n";

+    }

+    return "";

+}

+static CFX_ByteString GetFontSetString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_FLOAT fFontSize)

+{

+    CFX_ByteTextBuf sRet;

+    if (pFontMap) {

+        CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);

+        if (sFontAlias.GetLength() > 0 && fFontSize > 0 ) {

+            sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n";

+        }

+    }

+    return sRet.GetByteString();

+}

+static CPVT_Color ParseColor(const CFX_ByteString & str)

+{

+    CPDF_SimpleParser syntax(str);

+    syntax.SetPos(0);

+    if (syntax.FindTagParam("g", 1)) {

+        return CPVT_Color(CT_GRAY, FX_atof(syntax.GetWord()));

+    }

+    syntax.SetPos(0);

+    if (syntax.FindTagParam("rg", 3)) {

+        FX_FLOAT f1 = FX_atof(syntax.GetWord());

+        FX_FLOAT f2 = FX_atof(syntax.GetWord());

+        FX_FLOAT f3 = FX_atof(syntax.GetWord());

+        return CPVT_Color(CT_RGB, f1, f2, f3);

+    }

+    syntax.SetPos(0);

+    if (syntax.FindTagParam("k", 4)) {

+        FX_FLOAT f1 = FX_atof(syntax.GetWord());

+        FX_FLOAT f2 = FX_atof(syntax.GetWord());

+        FX_FLOAT f3 = FX_atof(syntax.GetWord());

+        FX_FLOAT f4 = FX_atof(syntax.GetWord());

+        return CPVT_Color(CT_CMYK, f1, f2, f3, f4);

+    }

+    return CPVT_Color(CT_TRANSPARENT);

+}

+static CPVT_Color ParseColor(const CPDF_Array & array)

+{

+    CPVT_Color rt;

+    switch (array.GetCount()) {

+        case 1:

+            rt = CPVT_Color(CT_GRAY, array.GetFloat(0));

+            break;

+        case 3:

+            rt = CPVT_Color(CT_RGB, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2));

+            break;

+        case 4:

+            rt = CPVT_Color(CT_CMYK, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2), array.GetFloat(3));

+            break;

+    }

+    return rt;

+}

+static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict, const FX_INT32 & nWidgetType)

+{

+    CPDF_Dictionary* pFormDict = NULL;

+    if (CPDF_Dictionary * pRootDict = pDoc->GetRoot()) {

+        pFormDict = pRootDict->GetDict("AcroForm");

+    }

+    if (!pFormDict) {

+        return FALSE;

+    }

+    CFX_ByteString DA = FPDF_GetFieldAttr(pAnnotDict, "DA")->GetString();

+    if (DA.IsEmpty()) {

+        DA = pFormDict->GetString("DA");

+    }

+    if (DA.IsEmpty()) {

+        return FALSE;

+    }

+    CPDF_SimpleParser syntax(DA);

+    syntax.FindTagParam("Tf", 2);

+    CFX_ByteString sFontName = syntax.GetWord();

+    sFontName = PDF_NameDecode(sFontName);

+    if (sFontName.IsEmpty()) {

+        return FALSE;

+    }

+    FX_FLOAT fFontSize = FX_atof(syntax.GetWord());

+    CPVT_Color crText = ParseColor(DA);

+    FX_BOOL bUseFormRes = FALSE;

+    CPDF_Dictionary * pFontDict = NULL;

+    CPDF_Dictionary* pDRDict = pAnnotDict->GetDict(FX_BSTRC("DR"));

+    if (pDRDict == NULL) {

+        pDRDict = pFormDict->GetDict(FX_BSTRC("DR"));

+        bUseFormRes = TRUE;

+    }

+    CPDF_Dictionary * pDRFontDict = NULL;

+    if ((pDRFontDict = pDRDict->GetDict("Font"))) {

+        pFontDict = pDRFontDict->GetDict(sFontName.Mid(1));

+        if (!pFontDict && !bUseFormRes) {

+            pDRDict = pFormDict->GetDict(FX_BSTRC("DR"));

+            pDRFontDict = pDRDict->GetDict("Font");

+            if (pDRFontDict) {

+                pFontDict = pDRFontDict->GetDict(sFontName.Mid(1));

+            }

+        }

+    }

+    if (!pDRFontDict) {

+        return FALSE;

+    }

+    if (!pFontDict) {

+        pFontDict = CPDF_Dictionary::Create();

+        if (pFontDict == NULL) {

+            return FALSE;

+        }

+        pFontDict->SetAtName(FX_BSTRC("Type"), "Font");

+        pFontDict->SetAtName(FX_BSTRC("Subtype"), "Type1");

+        pFontDict->SetAtName(FX_BSTRC("BaseFont"), "Helvetica");

+        pFontDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");

+        pDoc->AddIndirectObject(pFontDict);

+        pDRFontDict->SetAtReference(sFontName.Mid(1), pDoc, pFontDict);

+    }

+    CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict);

+    if (!pDefFont) {

+        return FALSE;

+    }

+    CFX_CharMap* pCharMap = pDefFont->GetCharMap();

+    CPDF_Rect rcAnnot = pAnnotDict->GetRect("Rect");

+    FX_INT32 nRotate = 0;

+    if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) {

+        nRotate = pMKDict->GetInteger("R");

+    }

+    CPDF_Rect rcBBox;

+    CPDF_Matrix matrix;

+    switch (nRotate % 360) {

+        case 0:

+            rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);

+            break;

+        case 90:

+            matrix = CPDF_Matrix(0, 1, -1, 0, rcAnnot.right - rcAnnot.left, 0);

+            rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left);

+            break;

+        case 180:

+            matrix = CPDF_Matrix(-1, 0, 0, -1, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);

+            rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);

+            break;

+        case 270:

+            matrix = CPDF_Matrix(0, -1, 1, 0, 0, rcAnnot.top - rcAnnot.bottom);

+            rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left);

+            break;

+    }

+    FX_INT32 nBorderStyle = PBS_SOLID;

+    FX_FLOAT fBorderWidth = 1;

+    CPVT_Dash dsBorder(3, 0, 0);

+    CPVT_Color crLeftTop, crRightBottom;

+    if (CPDF_Dictionary * pBSDict = pAnnotDict->GetDict("BS")) {

+        if (pBSDict->KeyExist("W")) {

+            fBorderWidth = pBSDict->GetNumber("W");

+        }

+        if (CPDF_Array * pArray = pBSDict->GetArray("D")) {

+            dsBorder = CPVT_Dash(pArray->GetInteger(0), pArray->GetInteger(1), pArray->GetInteger(2));

+        }

+        switch (pBSDict->GetString("S").GetAt(0)) {

+            case 'S':

+                nBorderStyle = PBS_SOLID;

+                break;

+            case 'D':

+                nBorderStyle = PBS_DASH;

+                break;

+            case 'B':

+                nBorderStyle = PBS_BEVELED;

+                fBorderWidth *= 2;

+                crLeftTop = CPVT_Color(CT_GRAY, 1);

+                crRightBottom = CPVT_Color(CT_GRAY, 0.5);

+                break;

+            case 'I':

+                nBorderStyle = PBS_INSET;

+                fBorderWidth *= 2;

+                crLeftTop = CPVT_Color(CT_GRAY, 0.5);

+                crRightBottom = CPVT_Color(CT_GRAY, 0.75);

+                break;

+            case 'U':

+                nBorderStyle = PBS_UNDERLINED;

+                break;

+        }

+    }

+    CPVT_Color crBorder, crBG;

+    if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) {

+        if (CPDF_Array * pArray = pMKDict->GetArray("BC")) {

+            crBorder = ParseColor(*pArray);

+        }

+        if (CPDF_Array * pArray = pMKDict->GetArray("BG")) {

+            crBG = ParseColor(*pArray);

+        }

+    }

+    CFX_ByteTextBuf sAppStream;

+    CFX_ByteString sBG = CPVT_GenerateAP::GenerateColorAP(crBG, TRUE);

+    if (sBG.GetLength() > 0) {

+        sAppStream << "q\n" << sBG << rcBBox.left << " " << rcBBox.bottom << " "

+                   << rcBBox.Width() << " " << rcBBox.Height() << " re f\n" << "Q\n";

+    }

+    CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP(rcBBox, fBorderWidth,

+                                   crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder);

+    if (sBorderStream.GetLength() > 0) {

+        sAppStream << "q\n" << sBorderStream << "Q\n";

+    }

+    CPDF_Rect rcBody = CPDF_Rect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth,

+                                 rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth);

+    rcBody.Normalize();

+    CPDF_Dictionary* pAPDict = pAnnotDict->GetDict("AP");

+    if (pAPDict == NULL) {

+        pAPDict = CPDF_Dictionary::Create();

+        if (pAPDict == NULL) {

+            return FALSE;

+        }

+        pAnnotDict->SetAt("AP", pAPDict);

+    }

+    CPDF_Stream* pNormalStream = pAPDict->GetStream("N");

+    if (pNormalStream == NULL) {

+        pNormalStream = CPDF_Stream::Create(NULL, 0, NULL);

+        if (pNormalStream == NULL) {

+            return FALSE;

+        }

+        FX_INT32 objnum = pDoc->AddIndirectObject(pNormalStream);

+        pAnnotDict->GetDict("AP")->SetAtReference("N", pDoc, objnum);

+    }

+    CPDF_Dictionary * pStreamDict = pNormalStream->GetDict();

+    if (pStreamDict) {

+        pStreamDict->SetAtMatrix("Matrix", matrix);

+        pStreamDict->SetAtRect("BBox", rcBBox);

+        CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");

+        if (pStreamResList) {

+            CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");

+            if (!pStreamResFontList) {

+                pStreamResFontList = CPDF_Dictionary::Create();

+                if (pStreamResFontList == NULL) {

+                    return FALSE;

+                }

+                pStreamResList->SetAt("Font", pStreamResFontList);

+            }

+            if (!pStreamResFontList->KeyExist(sFontName)) {

+                pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);

+            }

+        } else {

+            pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone());

+            pStreamResList = pStreamDict->GetDict("Resources");

+        }

+    }

+    switch (nWidgetType) {

+        case 0: {

+                CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText();

+                FX_INT32 nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger();

+                FX_DWORD dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger();

+                FX_DWORD dwMaxLen = FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger();

+                CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));

+                CPVT_Provider prd(&map);

+                CPDF_VariableText vt;

+                vt.SetProvider(&prd);

+                vt.SetPlateRect(rcBody);

+                vt.SetAlignment(nAlign);

+                if (IsFloatZero(fFontSize)) {

+                    vt.SetAutoFontSize(TRUE);

+                } else {

+                    vt.SetFontSize(fFontSize);

+                }

+                FX_BOOL bMultiLine = (dwFlags >> 12) & 1;

+                if (bMultiLine) {

+                    vt.SetMultiLine(TRUE);

+                    vt.SetAutoReturn(TRUE);

+                }

+                FX_WORD subWord = 0;

+                if ((dwFlags >> 13) & 1) {

+                    subWord = '*';

+                    vt.SetPasswordChar(subWord);

+                }

+                FX_BOOL bCharArray = (dwFlags >> 24) & 1;

+                if (bCharArray) {

+                    vt.SetCharArray(dwMaxLen);

+                } else {

+                    vt.SetLimitChar(dwMaxLen);

+                }

+                vt.Initialize();

+                vt.SetText(swValue);

+                vt.RearrangeAll();

+                CPDF_Rect rcContent = vt.GetContentRect();

+                CPDF_Point ptOffset(0.0f, 0.0f);

+                if (!bMultiLine) {

+                    ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcBody.Height()) / 2.0f);

+                }

+                CFX_ByteString sBody = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, !bCharArray, subWord);

+                if (sBody.GetLength() > 0) {

+                    sAppStream << "/Tx BMC\n" << "q\n";

+                    if (rcContent.Width() > rcBody.Width() ||

+                            rcContent.Height() > rcBody.Height()) {

+                        sAppStream << rcBody.left << " " << rcBody.bottom << " "

+                                   << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n";

+                    }

+                    sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sBody << "ET\n" << "Q\nEMC\n";

+                }

+            }

+            break;

+        case 1: {

+                CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText();

+                CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));

+                CPVT_Provider prd(&map);

+                CPDF_VariableText vt;

+                vt.SetProvider(&prd);

+                CPDF_Rect rcButton = rcBody;

+                rcButton.left = rcButton.right - 13;

+                rcButton.Normalize();

+                CPDF_Rect rcEdit = rcBody;

+                rcEdit.right = rcButton.left;

+                rcEdit.Normalize();

+                vt.SetPlateRect(rcEdit);

+                if (IsFloatZero(fFontSize)) {

+                    vt.SetAutoFontSize(TRUE);

+                } else {

+                    vt.SetFontSize(fFontSize);

+                }

+                vt.Initialize();

+                vt.SetText(swValue);

+                vt.RearrangeAll();

+                CPDF_Rect rcContent = vt.GetContentRect();

+                CPDF_Point ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcEdit.Height()) / 2.0f);

+                CFX_ByteString sEdit = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, TRUE, 0);

+                if (sEdit.GetLength() > 0) {

+                    sAppStream << "/Tx BMC\n" << "q\n";

+                    sAppStream << rcEdit.left << " " << rcEdit.bottom << " "

+                               << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n";

+                    sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sEdit << "ET\n" << "Q\nEMC\n";

+                }

+                CFX_ByteString sButton = CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 220.0f / 255.0f, 220.0f / 255.0f, 220.0f / 255.0f), TRUE);

+                if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) {

+                    sAppStream << "q\n" << sButton;

+                    sAppStream << rcButton.left << " " << rcButton.bottom << " "

+                               << rcButton.Width() << " " << rcButton.Height() << " re f\n";

+                    sAppStream << "Q\n";

+                    CFX_ByteString sButtonBorder = CPVT_GenerateAP::GenerateBorderAP(rcButton, 2, CPVT_Color(CT_GRAY, 0), CPVT_Color(CT_GRAY, 1), CPVT_Color(CT_GRAY, 0.5), PBS_BEVELED, CPVT_Dash(3, 0, 0));

+                    if (sButtonBorder.GetLength() > 0) {

+                        sAppStream << "q\n" << sButtonBorder << "Q\n";

+                    }

+                    CPDF_Point ptCenter = CPDF_Point((rcButton.left + rcButton.right) / 2, (rcButton.top + rcButton.bottom) / 2);

+                    if (IsFloatBigger(rcButton.Width(), 6) && IsFloatBigger(rcButton.Height(), 6)) {

+                        sAppStream << "q\n" << " 0 g\n";

+                        sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n";

+                        sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n";

+                        sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n";

+                        sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n";

+                        sAppStream << sButton << "Q\n";

+                    }

+                }

+            }

+            break;

+        case 2: {

+                CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));

+                CPVT_Provider prd(&map);

+                CPDF_Array * pOpts = FPDF_GetFieldAttr(pAnnotDict, "Opt")->GetArray();

+                CPDF_Array * pSels = FPDF_GetFieldAttr(pAnnotDict, "I")->GetArray();

+                FX_INT32 nTop = FPDF_GetFieldAttr(pAnnotDict, "TI")->GetInteger();

+                CFX_ByteTextBuf sBody;

+                if (pOpts) {

+                    FX_FLOAT fy = rcBody.top;

+                    for (FX_INT32 i = nTop, sz = pOpts->GetCount(); i < sz; i++) {

+                        if (IsFloatSmaller(fy, rcBody.bottom)) {

+                            break;

+                        }

+                        if (CPDF_Object* pOpt = pOpts->GetElementValue(i)) {

+                            CFX_WideString swItem;

+                            if (pOpt->GetType() == PDFOBJ_STRING) {

+                                swItem = pOpt->GetUnicodeText();

+                            } else if (pOpt->GetType() == PDFOBJ_ARRAY) {

+                                swItem = ((CPDF_Array*)pOpt)->GetElementValue(1)->GetUnicodeText();

+                            }

+                            FX_BOOL bSelected = FALSE;

+                            if (pSels) {

+                                for (FX_DWORD s = 0, ssz = pSels->GetCount(); s < ssz; s++) {

+                                    if (i == pSels->GetInteger(s)) {

+                                        bSelected = TRUE;

+                                        break;

+                                    }

+                                }

+                            }

+                            CPDF_VariableText vt;

+                            vt.SetProvider(&prd);

+                            vt.SetPlateRect(CPDF_Rect(rcBody.left, 0.0f, rcBody.right, 0.0f));

+                            if (IsFloatZero(fFontSize)) {

+                                vt.SetFontSize(12.0f);

+                            } else {

+                                vt.SetFontSize(fFontSize);

+                            }

+                            vt.Initialize();

+                            vt.SetText(swItem);

+                            vt.RearrangeAll();

+                            FX_FLOAT fItemHeight = vt.GetContentRect().Height();

+                            if (bSelected) {

+                                CPDF_Rect rcItem = CPDF_Rect(rcBody.left, fy - fItemHeight, rcBody.right, fy);

+                                sBody << "q\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 0, 51.0f / 255.0f, 113.0f / 255.0f), TRUE)

+                                      << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() << " " << rcItem.Height() << " re f\n" << "Q\n";

+                                sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_GRAY, 1), TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n";

+                            } else {

+                                sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n";

+                            }

+                            fy -= fItemHeight;

+                        }

+                    }

+                }

+                if (sBody.GetSize() > 0) {

+                    sAppStream << "/Tx BMC\n" << "q\n";

+                    sAppStream << rcBody.left << " " << rcBody.bottom << " "

+                               << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n";

+                    sAppStream << sBody.GetByteString() << "Q\nEMC\n";

+                }

+            }

+            break;

+    }

+    if (pNormalStream) {

+        pNormalStream->SetData((FX_BYTE*)sAppStream.GetBuffer(), sAppStream.GetSize(), FALSE, FALSE);

+        pStreamDict = pNormalStream->GetDict();

+        if (pStreamDict) {

+            pStreamDict->SetAtMatrix("Matrix", matrix);

+            pStreamDict->SetAtRect("BBox", rcBBox);

+            CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");

+            if (pStreamResList) {

+                CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");

+                if (!pStreamResFontList) {

+                    pStreamResFontList = CPDF_Dictionary::Create();

+                    if (pStreamResFontList == NULL) {

+                        return FALSE;

+                    }

+                    pStreamResList->SetAt("Font", pStreamResFontList);

+                }

+                if (!pStreamResFontList->KeyExist(sFontName)) {

+                    pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);

+                }

+            } else {

+                pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone());

+                pStreamResList = pStreamDict->GetDict("Resources");

+            }

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)

+{

+    return GenerateWidgetAP(pDoc, pAnnotDict, 0);

+}

+FX_BOOL CPVT_GenerateAP::GenerateComboBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)

+{

+    return GenerateWidgetAP(pDoc, pAnnotDict, 1);

+}

+FX_BOOL CPVT_GenerateAP::GenerateListBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)

+{

+    return GenerateWidgetAP(pDoc, pAnnotDict, 2);

+}

+CFX_ByteString CPVT_GenerateAP::GenerateEditAP(IPVT_FontMap * pFontMap, IPDF_VariableText_Iterator* pIterator, const CPDF_Point & ptOffset, FX_BOOL bContinuous, FX_WORD SubWord, const CPVT_WordRange * pVisible)

+{

+    CFX_ByteTextBuf sEditStream, sLineStream, sWords;

+    CPDF_Point ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f);

+    FX_INT32 nCurFontIndex = -1;

+    if (pIterator) {

+        if (pVisible) {

+            pIterator->SetAt(pVisible->BeginPos);

+        } else {

+            pIterator->SetAt(0);

+        }

+        CPVT_WordPlace oldplace;

+        while (pIterator->NextWord()) {

+            CPVT_WordPlace place = pIterator->GetAt();

+            if (pVisible && place.WordCmp(pVisible->EndPos) > 0) {

+                break;

+            }

+            if (bContinuous) {

+                if (place.LineCmp(oldplace) != 0) {

+                    if (sWords.GetSize() > 0) {

+                        sLineStream << GetWordRenderString(sWords.GetByteString());

+                        sEditStream << sLineStream;

+                        sLineStream.Clear();

+                        sWords.Clear();

+                    }

+                    CPVT_Word word;

+                    if (pIterator->GetWord(word)) {

+                        ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);

+                    } else {

+                        CPVT_Line line;

+                        pIterator->GetLine(line);

+                        ptNew = CPDF_Point(line.ptLine.x + ptOffset.x, line.ptLine.y + ptOffset.y);

+                    }

+                    if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {

+                        sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n";

+                        ptOld = ptNew;

+                    }

+                }

+                CPVT_Word word;

+                if (pIterator->GetWord(word)) {

+                    if (word.nFontIndex != nCurFontIndex) {

+                        if (sWords.GetSize() > 0) {

+                            sLineStream << GetWordRenderString(sWords.GetByteString());

+                            sWords.Clear();

+                        }

+                        sLineStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize);

+                        nCurFontIndex = word.nFontIndex;

+                    }

+                    sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord);

+                }

+                oldplace = place;

+            } else {

+                CPVT_Word word;

+                if (pIterator->GetWord(word)) {

+                    ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);

+                    if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {

+                        sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n";

+                        ptOld = ptNew;

+                    }

+                    if (word.nFontIndex != nCurFontIndex) {

+                        sEditStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize);

+                        nCurFontIndex = word.nFontIndex;

+                    }

+                    sEditStream << GetWordRenderString(GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord));

+                }

+            }

+        }

+        if (sWords.GetSize() > 0) {

+            sLineStream << GetWordRenderString(sWords.GetByteString());

+            sEditStream << sLineStream;

+            sWords.Clear();

+        }

+    }

+    return sEditStream.GetByteString();

+}

+CFX_ByteString CPVT_GenerateAP::GenerateBorderAP(const CPDF_Rect & rect, FX_FLOAT fWidth,

+        const CPVT_Color & color, const CPVT_Color & crLeftTop, const CPVT_Color & crRightBottom,

+        FX_INT32 nStyle, const CPVT_Dash & dash)

+{

+    CFX_ByteTextBuf sAppStream;

+    CFX_ByteString sColor;

+    FX_FLOAT fLeft = rect.left;

+    FX_FLOAT fRight = rect.right;

+    FX_FLOAT fTop = rect.top;

+    FX_FLOAT fBottom = rect.bottom;

+    if (fWidth > 0.0f) {

+        FX_FLOAT fHalfWidth = fWidth / 2.0f;

+        switch (nStyle) {

+            default:

+            case PBS_SOLID:

+                sColor = GenerateColorAP(color, TRUE);

+                if (sColor.GetLength() > 0) {

+                    sAppStream << sColor;

+                    sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";

+                    sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " "

+                               << fRight - fLeft - fWidth * 2 << " " << fTop - fBottom - fWidth * 2 << " re\n";

+                    sAppStream << "f*\n";

+                }

+                break;

+            case PBS_DASH:

+                sColor = GenerateColorAP(color, FALSE);

+                if (sColor.GetLength() > 0) {

+                    sAppStream << sColor;

+                    sAppStream << fWidth << " w" << " [" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n";

+                    sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " m\n";

+                    sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";

+                    sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";

+                    sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 << " l\n";

+                    sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " l S\n";

+                }

+                break;

+            case PBS_BEVELED:

+            case PBS_INSET:

+                sColor = GenerateColorAP(crLeftTop, TRUE);

+                if (sColor.GetLength() > 0) {

+                    sAppStream << sColor;

+                    sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " m\n";

+                    sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth << " l\n";

+                    sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " l\n";

+                    sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";

+                    sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";

+                    sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l f\n";

+                }

+                sColor = GenerateColorAP(crRightBottom, TRUE);

+                if (sColor.GetLength() > 0) {

+                    sAppStream << sColor;

+                    sAppStream << fRight - fHalfWidth << " " <<	fTop - fHalfWidth << " m\n";

+                    sAppStream << fRight - fHalfWidth << " " <<	fBottom + fHalfWidth << " l\n";

+                    sAppStream << fLeft + fHalfWidth << " " << 	fBottom + fHalfWidth << " l\n";

+                    sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";

+                    sAppStream << fRight - fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";

+                    sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l f\n";

+                }

+                sColor = GenerateColorAP(color, TRUE);

+                if (sColor.GetLength() > 0) {

+                    sAppStream << sColor;

+                    sAppStream << fLeft << " " << fBottom << " " <<	fRight - fLeft << " " << fTop - fBottom << " re\n";

+                    sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " "

+                               << fRight - fLeft - fHalfWidth * 2 << " " << fTop - fBottom - fHalfWidth * 2 << " re f*\n";

+                }

+                break;

+            case PBS_UNDERLINED:

+                sColor = GenerateColorAP(color, FALSE);

+                if (sColor.GetLength() > 0) {

+                    sAppStream << sColor;

+                    sAppStream << fWidth << " w\n";

+                    sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n";

+                    sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n";

+                }

+                break;

+        }

+    }

+    return sAppStream.GetByteString();

+}

+CFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color & color, const FX_BOOL & bFillOrStroke)

+{

+    CFX_ByteTextBuf sColorStream;

+    switch (color.nColorType) {

+        case CT_RGB:

+            sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " "

+                         << (bFillOrStroke ? "rg" : "RG") << "\n";

+            break;

+        case CT_GRAY:

+            sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") << "\n";

+            break;

+        case CT_CMYK:

+            sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << color.fColor4 << " "

+                         << (bFillOrStroke ? "k" : "K") << "\n";

+            break;

+    }

+    return sColorStream.GetByteString();

+}

diff --git a/core/src/fpdfdoc/doc_basic.cpp b/core/src/fpdfdoc/doc_basic.cpp
new file mode 100644
index 0000000..4ec8fb7
--- /dev/null
+++ b/core/src/fpdfdoc/doc_basic.cpp
@@ -0,0 +1,567 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+const int nMaxRecursion = 32;

+int CPDF_Dest::GetPageIndex(CPDF_Document* pDoc)

+{

+    if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {

+        return 0;

+    }

+    CPDF_Object* pPage = ((CPDF_Array*)m_pObj)->GetElementValue(0);

+    if (pPage == NULL) {

+        return 0;

+    }

+    if (pPage->GetType() == PDFOBJ_NUMBER) {

+        return pPage->GetInteger();

+    }

+    if (pPage->GetType() != PDFOBJ_DICTIONARY) {

+        return 0;

+    }

+    return pDoc->GetPageIndex(pPage->GetObjNum());

+}

+FX_DWORD CPDF_Dest::GetPageObjNum()

+{

+    if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {

+        return 0;

+    }

+    CPDF_Object* pPage = ((CPDF_Array*)m_pObj)->GetElementValue(0);

+    if (pPage == NULL) {

+        return 0;

+    }

+    if (pPage->GetType() == PDFOBJ_NUMBER) {

+        return pPage->GetInteger();

+    }

+    if (pPage->GetType() == PDFOBJ_DICTIONARY) {

+        return pPage->GetObjNum();

+    }

+    return 0;

+}

+const FX_CHAR* g_sZoomModes[] = {"XYZ", "Fit", "FitH", "FitV", "FitR", "FitB", "FitBH", "FitBV", ""};

+int CPDF_Dest::GetZoomMode()

+{

+    if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {

+        return 0;

+    }

+    CFX_ByteString mode = ((CPDF_Array*)m_pObj)->GetElementValue(1)->GetString();

+    int i = 0;

+    while (g_sZoomModes[i][0] != '\0') {

+        if (mode == g_sZoomModes[i]) {

+            return i + 1;

+        }

+        i ++;

+    }

+    return 0;

+}

+FX_FLOAT CPDF_Dest::GetParam(int index)

+{

+    if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {

+        return 0;

+    }

+    return ((CPDF_Array*)m_pObj)->GetNumber(2 + index);

+}

+CFX_ByteString CPDF_Dest::GetRemoteName()

+{

+    if (m_pObj == NULL) {

+        return CFX_ByteString();

+    }

+    return m_pObj->GetString();

+}

+CPDF_NameTree::CPDF_NameTree(CPDF_Document* pDoc, FX_BSTR category)

+{

+    m_pRoot = pDoc->GetRoot()->GetDict(FX_BSTRC("Names"))->GetDict(category);

+}

+static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, const CFX_ByteString& csName,

+                                   int& nIndex, CPDF_Array** ppFind, int nLevel = 0)

+{

+    if (nLevel > nMaxRecursion) {

+        return NULL;

+    }

+    CPDF_Array* pLimits = pNode->GetArray(FX_BSTRC("Limits"));

+    if (pLimits != NULL) {

+        CFX_ByteString csLeft = pLimits->GetString(0);

+        CFX_ByteString csRight = pLimits->GetString(1);

+        if (csLeft.Compare(csRight) > 0) {

+            CFX_ByteString csTmp = csRight;

+            csRight = csLeft;

+            csLeft = csTmp;

+        }

+        if (csName.Compare(csLeft) < 0 || csName.Compare(csRight) > 0) {

+            return NULL;

+        }

+    }

+    CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names"));

+    if (pNames) {

+        FX_DWORD dwCount = pNames->GetCount() / 2;

+        for (FX_DWORD i = 0; i < dwCount; i ++) {

+            CFX_ByteString csValue = pNames->GetString(i * 2);

+            FX_INT32 iCompare = csValue.Compare(csName);

+            if (iCompare <= 0) {

+                if (ppFind != NULL) {

+                    *ppFind = pNames;

+                }

+                if (iCompare < 0) {

+                    continue;

+                }

+            } else {

+                break;

+            }

+            nIndex += i;

+            return pNames->GetElementValue(i * 2 + 1);

+        }

+        nIndex += dwCount;

+        return NULL;

+    }

+    CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids"));

+    if (pKids == NULL) {

+        return NULL;

+    }

+    for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {

+        CPDF_Dictionary* pKid = pKids->GetDict(i);

+        if (pKid == NULL) {

+            continue;

+        }

+        CPDF_Object* pFound = SearchNameNode(pKid, csName, nIndex, ppFind, nLevel + 1);

+        if (pFound) {

+            return pFound;

+        }

+    }

+    return NULL;

+}

+static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, int nIndex, int& nCurIndex,

+                                   CFX_ByteString& csName, CPDF_Array** ppFind, int nLevel = 0)

+{

+    if (nLevel > nMaxRecursion) {

+        return NULL;

+    }

+    CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names"));

+    if (pNames) {

+        int nCount = pNames->GetCount() / 2;

+        if (nIndex >= nCurIndex + nCount) {

+            nCurIndex += nCount;

+            return NULL;

+        } else {

+            if (ppFind != NULL) {

+                *ppFind = pNames;

+            }

+            csName = pNames->GetString((nIndex - nCurIndex) * 2);

+            return pNames->GetElementValue((nIndex - nCurIndex) * 2 + 1);

+        }

+    }

+    CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids"));

+    if (pKids == NULL) {

+        return NULL;

+    }

+    for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {

+        CPDF_Dictionary* pKid = pKids->GetDict(i);

+        if (pKid == NULL) {

+            continue;

+        }

+        CPDF_Object* pFound = SearchNameNode(pKid, nIndex, nCurIndex, csName, ppFind, nLevel + 1);

+        if (pFound) {

+            return pFound;

+        }

+    }

+    return NULL;

+}

+static int CountNames(CPDF_Dictionary* pNode, int nLevel = 0)

+{

+    if (nLevel > nMaxRecursion) {

+        return 0;

+    }

+    CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names"));

+    if (pNames) {

+        return pNames->GetCount() / 2;

+    }

+    CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids"));

+    if (pKids == NULL) {

+        return 0;

+    }

+    int nCount = 0;

+    for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {

+        CPDF_Dictionary* pKid = pKids->GetDict(i);

+        if (pKid == NULL) {

+            continue;

+        }

+        nCount += CountNames(pKid, nLevel + 1);

+    }

+    return nCount;

+}

+int CPDF_NameTree::GetCount() const

+{

+    if (m_pRoot == NULL) {

+        return 0;

+    }

+    return ::CountNames(m_pRoot);

+}

+int CPDF_NameTree::GetIndex(const CFX_ByteString& csName) const

+{

+    if (m_pRoot == NULL) {

+        return -1;

+    }

+    int nIndex = 0;

+    if (SearchNameNode(m_pRoot, csName, nIndex, NULL) == NULL) {

+        return -1;

+    }

+    return nIndex;

+}

+CPDF_Object* CPDF_NameTree::LookupValue(int nIndex, CFX_ByteString& csName) const

+{

+    if (m_pRoot == NULL) {

+        return NULL;

+    }

+    int nCurIndex = 0;

+    return SearchNameNode(m_pRoot, nIndex, nCurIndex, csName, NULL);

+}

+CPDF_Object* CPDF_NameTree::LookupValue(const CFX_ByteString& csName) const

+{

+    if (m_pRoot == NULL) {

+        return NULL;

+    }

+    int nIndex = 0;

+    return SearchNameNode(m_pRoot, csName, nIndex, NULL);

+}

+CPDF_Array*	CPDF_NameTree::LookupNamedDest(CPDF_Document* pDoc, FX_BSTR sName)

+{

+    CPDF_Object* pValue = LookupValue(sName);

+    if (pValue == NULL) {

+        CPDF_Dictionary* pDests = pDoc->GetRoot()->GetDict(FX_BSTRC("Dests"));

+        if (pDests == NULL) {

+            return NULL;

+        }

+        pValue = pDests->GetElementValue(sName);

+    }

+    if (pValue == NULL) {

+        return NULL;

+    }

+    if (pValue->GetType() == PDFOBJ_ARRAY) {

+        return (CPDF_Array*)pValue;

+    }

+    if (pValue->GetType() == PDFOBJ_DICTIONARY) {

+        return ((CPDF_Dictionary*)pValue)->GetArray(FX_BSTRC("D"));

+    }

+    return NULL;

+}

+static CFX_WideString ChangeSlashToPlatform(FX_LPCWSTR str)

+{

+    CFX_WideString result;

+    while (*str) {

+        if (*str == '/') {

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+            result += ':';

+#elif _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_

+            result += '\\';

+#else

+            result += *str;

+#endif

+        } else {

+            result += *str;

+        }

+        str++;

+    }

+    return result;

+}

+static CFX_WideString FILESPEC_DecodeFileName(FX_WSTR filepath)

+{

+    if (filepath.GetLength() <= 1) {

+        return CFX_WideString();

+    }

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+    if (filepath.Left(sizeof("/Mac") - 1) == CFX_WideStringC(L"/Mac")) {

+        return ChangeSlashToPlatform(filepath.GetPtr() + 1);

+    }

+    return ChangeSlashToPlatform(filepath.GetPtr());

+#elif _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_

+    if (filepath.GetAt(0) != '/') {

+        return ChangeSlashToPlatform(filepath.GetPtr());

+    }

+    if (filepath.GetAt(1) == '/') {

+        return ChangeSlashToPlatform(filepath.GetPtr() + 1);

+    }

+    if (filepath.GetAt(2) == '/') {

+        CFX_WideString result;

+        result += filepath.GetAt(1);

+        result += ':';

+        result += ChangeSlashToPlatform(filepath.GetPtr() + 2);

+        return result;

+    }

+    CFX_WideString result;

+    result += '\\';

+    result += ChangeSlashToPlatform(filepath.GetPtr());

+    return result;

+#else

+    return filepath;

+#endif

+}

+FX_BOOL CPDF_FileSpec::GetFileName(CFX_WideString &csFileName) const

+{

+    if (m_pObj == NULL) {

+        return FALSE;

+    }

+    if (m_pObj->GetType() == PDFOBJ_DICTIONARY) {

+        CPDF_Dictionary* pDict = (CPDF_Dictionary*)m_pObj;

+        csFileName = pDict->GetUnicodeText(FX_BSTRC("UF"));

+        if (csFileName.IsEmpty()) {

+            csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("F")));

+        }

+        if (pDict->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL")) {

+            return TRUE;

+        }

+        if (csFileName.IsEmpty()) {

+            if (pDict->KeyExist(FX_BSTRC("DOS"))) {

+                csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("DOS")));

+            } else if (pDict->KeyExist(FX_BSTRC("Mac"))) {

+                csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("Mac")));

+            } else if (pDict->KeyExist(FX_BSTRC("Unix"))) {

+                csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("Unix")));

+            } else {

+                return FALSE;

+            }

+        }

+    } else {

+        csFileName = CFX_WideString::FromLocal(m_pObj->GetString());

+    }

+    csFileName = FILESPEC_DecodeFileName(csFileName);

+    return TRUE;

+}

+CPDF_FileSpec::CPDF_FileSpec()

+{

+    m_pObj = CPDF_Dictionary::Create();

+    if (m_pObj != NULL) {

+        ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Filespec"));

+    }

+}

+FX_BOOL CPDF_FileSpec::IsURL() const

+{

+    if (m_pObj == NULL) {

+        return FALSE;

+    }

+    if (m_pObj->GetType() != PDFOBJ_DICTIONARY) {

+        return FALSE;

+    }

+    return ((CPDF_Dictionary*)m_pObj)->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL");

+}

+static CFX_WideString ChangeSlashToPDF(FX_LPCWSTR str)

+{

+    CFX_WideString result;

+    while (*str) {

+        if (*str == '\\' || *str == ':') {

+            result += '/';

+        } else {

+            result += *str;

+        }

+        str++;

+    }

+    return result;

+}

+CFX_WideString FILESPEC_EncodeFileName(FX_WSTR filepath)

+{

+    if (filepath.GetLength() <= 1) {

+        return CFX_WideString();

+    }

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_

+    if (filepath.GetAt(1) == ':') {

+        CFX_WideString result;

+        result = '/';

+        result += filepath.GetAt(0);

+        if (filepath.GetAt(2) != '\\') {

+            result += '/';

+        }

+        result += ChangeSlashToPDF(filepath.GetPtr() + 2);

+        return result;

+    }

+    if (filepath.GetAt(0) == '\\' && filepath.GetAt(1) == '\\') {

+        return ChangeSlashToPDF(filepath.GetPtr() + 1);

+    }

+    if (filepath.GetAt(0) == '\\') {

+        CFX_WideString result;

+        result = '/';

+        result += ChangeSlashToPDF(filepath.GetPtr());

+        return result;

+    }

+    return ChangeSlashToPDF(filepath.GetPtr());

+#elif _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+    if (filepath.Left(sizeof("Mac") - 1) == FX_WSTRC(L"Mac")) {

+        CFX_WideString result;

+        result = '/';

+        result += ChangeSlashToPDF(filepath.GetPtr());

+        return result;

+    }

+    return ChangeSlashToPDF(filepath.GetPtr());

+#else

+    return filepath;

+#endif

+}

+CPDF_Stream* CPDF_FileSpec::GetFileStream() const

+{

+    if (m_pObj == NULL) {

+        return NULL;

+    }

+    FX_INT32 iType = m_pObj->GetType();

+    if (iType == PDFOBJ_STREAM) {

+        return (CPDF_Stream*)m_pObj;

+    } else if (iType == PDFOBJ_DICTIONARY) {

+        CPDF_Dictionary *pEF = ((CPDF_Dictionary*)m_pObj)->GetDict(FX_BSTRC("EF"));

+        if (pEF == NULL) {

+            return NULL;

+        }

+        return pEF->GetStream(FX_BSTRC("F"));

+    }

+    return NULL;

+}

+static void FPDFDOC_FILESPEC_SetFileName(CPDF_Object *pObj, FX_WSTR wsFileName, FX_BOOL bURL)

+{

+    ASSERT(pObj != NULL);

+    CFX_WideString wsStr;

+    if (bURL) {

+        wsStr = wsFileName;

+    } else {

+        wsStr = FILESPEC_EncodeFileName(wsFileName);

+    }

+    FX_INT32 iType = pObj->GetType();

+    if (iType == PDFOBJ_STRING) {

+        pObj->SetString(CFX_ByteString::FromUnicode(wsStr));

+    } else if (iType == PDFOBJ_DICTIONARY) {

+        CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;

+        pDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(wsStr));

+        pDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsStr));

+    }

+}

+void CPDF_FileSpec::SetFileName(FX_WSTR wsFileName, FX_BOOL bURL)

+{

+    ASSERT(m_pObj != NULL);

+    if (m_pObj->GetType() == PDFOBJ_DICTIONARY && bURL) {

+        ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC("FS"), "URL");

+    }

+    FPDFDOC_FILESPEC_SetFileName(m_pObj, wsFileName, bURL);

+}

+static CFX_WideString _MakeRoman(int num)

+{

+    const int arabic[] = {

+        1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1

+    };

+    const CFX_WideString roman[] = {

+        L"m", L"cm", L"d", L"cd", L"c", L"xc", L"l", L"xl", L"x", L"ix", L"v", L"iv", L"i"

+    };

+    const int nMaxNum = 1000000;

+    num %= nMaxNum;

+    int i = 0;

+    CFX_WideString wsRomanNumber;

+    while (num > 0) {

+        while (num >= arabic[i]) {

+            num = num - arabic[i];

+            wsRomanNumber += roman[i];

+        }

+        i = i + 1;

+    }

+    return wsRomanNumber;

+}

+static CFX_WideString _MakeLetters(int num)

+{

+    if (num == 0) {

+        return CFX_WideString();

+    }

+    CFX_WideString wsLetters;

+    const int nMaxCount = 1000;

+    const int nLetterCount = 26;

+    num -= 1;

+    int count = num / nLetterCount + 1;

+    count %= nMaxCount;

+    FX_WCHAR ch = L'a' + num % nLetterCount;

+    for (int i = 0; i < count; i++) {

+        wsLetters += ch;

+    }

+    return wsLetters;

+}

+static CFX_WideString _GetLabelNumPortion(int num, const CFX_ByteString& bsStyle)

+{

+    CFX_WideString wsNumPortion;

+    if		(bsStyle.IsEmpty()) {

+        return wsNumPortion;

+    }

+    if (bsStyle == "D") {

+        wsNumPortion.Format((FX_LPCWSTR)L"%d", num);

+    } else if (bsStyle == "R") {

+        wsNumPortion = _MakeRoman(num);

+        wsNumPortion.MakeUpper();

+    } else if (bsStyle == "r") {

+        wsNumPortion = _MakeRoman(num);

+    } else if (bsStyle == "A") {

+        wsNumPortion = _MakeLetters(num);

+        wsNumPortion.MakeUpper();

+    } else if (bsStyle == "a") {

+        wsNumPortion = _MakeLetters(num);

+    }

+    return wsNumPortion;

+}

+CFX_WideString CPDF_PageLabel::GetLabel(int nPage) const

+{

+    CFX_WideString wsLabel;

+    if (m_pDocument == NULL) {

+        return wsLabel;

+    }

+    CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot();

+    if (pPDFRoot == NULL) {

+        return wsLabel;

+    }

+    CPDF_Dictionary* pLabels = pPDFRoot->GetDict(FX_BSTRC("PageLabels"));

+    CPDF_NumberTree numberTree(pLabels);

+    CPDF_Object* pValue = NULL;

+    int n = nPage;

+    while (n >= 0) {

+        pValue = numberTree.LookupValue(n);

+        if (pValue != NULL) {

+            break;

+        }

+        n--;

+    }

+    if (pValue != NULL) {

+        pValue = pValue->GetDirect();

+        if (pValue->GetType() == PDFOBJ_DICTIONARY) {

+            CPDF_Dictionary* pLabel = (CPDF_Dictionary*)pValue;

+            if (pLabel->KeyExist(FX_BSTRC("P"))) {

+                wsLabel += pLabel->GetUnicodeText(FX_BSTRC("P"));

+            }

+            CFX_ByteString bsNumberingStyle = pLabel->GetString(FX_BSTRC("S"), NULL);

+            int nLabelNum = nPage - n + pLabel->GetInteger(FX_BSTRC("St"), 1);

+            CFX_WideString wsNumPortion = _GetLabelNumPortion(nLabelNum, bsNumberingStyle);

+            wsLabel += wsNumPortion;

+            return wsLabel;

+        }

+    }

+    wsLabel.Format((FX_LPCWSTR)L"%d", nPage + 1);

+    return wsLabel;

+}

+FX_INT32 CPDF_PageLabel::GetPageByLabel(FX_BSTR bsLabel) const

+{

+    if (m_pDocument == NULL) {

+        return -1;

+    }

+    CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot();

+    if (pPDFRoot == NULL) {

+        return -1;

+    }

+    int nPages = m_pDocument->GetPageCount();

+    CFX_ByteString bsLbl;

+    CFX_ByteString bsOrig = bsLabel;

+    for (int i = 0; i < nPages; i++) {

+        bsLbl = PDF_EncodeText(GetLabel(i));

+        if (!bsLbl.Compare(bsOrig)) {

+            return i;

+        }

+    }

+    bsLbl = bsOrig;

+    int nPage = FXSYS_atoi(bsLbl);

+    if (nPage > 0 && nPage <= nPages) {

+        return nPage;

+    }

+    return -1;

+}

+FX_INT32 CPDF_PageLabel::GetPageByLabel(FX_WSTR wsLabel) const

+{

+    CFX_ByteString bsLabel = PDF_EncodeText((CFX_WideString)wsLabel);

+    return GetPageByLabel(bsLabel);

+}

diff --git a/core/src/fpdfdoc/doc_bookmark.cpp b/core/src/fpdfdoc/doc_bookmark.cpp
new file mode 100644
index 0000000..6cc954b
--- /dev/null
+++ b/core/src/fpdfdoc/doc_bookmark.cpp
@@ -0,0 +1,91 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+CPDF_Bookmark CPDF_BookmarkTree::GetFirstChild(CPDF_Bookmark Parent)

+{

+    if (Parent.m_pDict == NULL) {

+        CPDF_Dictionary* pRoot = m_pDocument->GetRoot()->GetDict("Outlines");

+        if (pRoot == NULL) {

+            return NULL;

+        }

+        return pRoot->GetDict("First");

+    }

+    return Parent.m_pDict->GetDict("First");

+}

+CPDF_Bookmark CPDF_BookmarkTree::GetNextSibling(CPDF_Bookmark This)

+{

+    if (This.m_pDict == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary *pNext = This.m_pDict->GetDict("Next");

+    return pNext == This.m_pDict ? NULL : pNext;

+}

+FX_DWORD CPDF_Bookmark::GetColorRef()

+{

+    if (!m_pDict) {

+        return 0;

+    }

+    CPDF_Array* pColor = m_pDict->GetArray("C");

+    if (pColor == NULL) {

+        return FXSYS_RGB(0, 0, 0);

+    }

+    int r = FXSYS_round(pColor->GetNumber(0) * 255);

+    int g = FXSYS_round(pColor->GetNumber(1) * 255);

+    int b = FXSYS_round(pColor->GetNumber(2) * 255);

+    return FXSYS_RGB(r, g, b);

+}

+FX_DWORD CPDF_Bookmark::GetFontStyle()

+{

+    if (!m_pDict) {

+        return 0;

+    }

+    return m_pDict->GetInteger("F");

+}

+CFX_WideString CPDF_Bookmark::GetTitle()

+{

+    if (!m_pDict) {

+        return CFX_WideString();

+    }

+    CPDF_String* pString = (CPDF_String*)m_pDict->GetElementValue("Title");

+    if (pString == NULL || pString->GetType() != PDFOBJ_STRING) {

+        return CFX_WideString();

+    }

+    CFX_WideString title = pString->GetUnicodeText();

+    FX_LPWSTR buf = title.LockBuffer();

+    int len = title.GetLength(), i;

+    for (i = 0; i < len; i ++)

+        if (buf[i] < 0x20) {

+            buf[i] = 0x20;

+        }

+    title.ReleaseBuffer(len);

+    return title;

+}

+CPDF_Dest CPDF_Bookmark::GetDest(CPDF_Document* pDocument)

+{

+    if (!m_pDict) {

+        return NULL;

+    }

+    CPDF_Object* pDest = m_pDict->GetElementValue("Dest");

+    if (pDest == NULL) {

+        return NULL;

+    }

+    if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {

+        CPDF_NameTree name_tree(pDocument, FX_BSTRC("Dests"));

+        CFX_ByteStringC name = pDest->GetString();

+        return name_tree.LookupNamedDest(pDocument, name);

+    } else if (pDest->GetType() == PDFOBJ_ARRAY) {

+        return (CPDF_Array*)pDest;

+    }

+    return NULL;

+}

+CPDF_Action CPDF_Bookmark::GetAction()

+{

+    if (!m_pDict) {

+        return NULL;

+    }

+    return m_pDict->GetDict("A");

+}

diff --git a/core/src/fpdfdoc/doc_form.cpp b/core/src/fpdfdoc/doc_form.cpp
new file mode 100644
index 0000000..1139233
--- /dev/null
+++ b/core/src/fpdfdoc/doc_form.cpp
@@ -0,0 +1,1664 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+#include "../../include/fxcrt/fx_xml.h"

+CFX_WideString	GetFullName(CPDF_Dictionary* pFieldDict);

+void			InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);

+FX_DWORD		CountInterFormFonts(CPDF_Dictionary* pFormDict);

+CPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);

+CPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);

+CPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);

+CPDF_Font*		GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);

+CPDF_Font*		GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);

+FX_BOOL			FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);

+FX_BOOL			FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);

+void			AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);

+CPDF_Font*		AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);

+CPDF_Font*		AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);

+void			RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);

+void			RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);

+CPDF_Font*		GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);

+void			SetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);

+void			SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);

+FX_BOOL			NeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);

+FX_BOOL			NeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);

+void			EncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);

+void			UpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);

+const int nMaxRecursion = 32;

+class _CFieldNameExtractor : public CFX_Object

+{

+public:

+    _CFieldNameExtractor(const CFX_WideString& full_name)

+    {

+        m_pStart = full_name;

+        m_pEnd = m_pStart + full_name.GetLength();

+        m_pCur = m_pStart;

+    }

+    void GetNext(FX_LPCWSTR &pSubName, FX_STRSIZE& size)

+    {

+        pSubName = m_pCur;

+        while (m_pCur < m_pEnd && m_pCur[0] != L'.') {

+            m_pCur++;

+        }

+        size = (FX_STRSIZE)(m_pCur - pSubName);

+        if (m_pCur < m_pEnd && m_pCur[0] == L'.') {

+            m_pCur++;

+        }

+    }

+protected:

+    FX_LPCWSTR m_pStart;

+    FX_LPCWSTR m_pEnd;

+    FX_LPCWSTR m_pCur;

+};

+class CFieldTree : public CFX_Object

+{

+public:

+    struct _Node : public CFX_Object {

+        _Node *parent;

+        CFX_PtrArray children;

+        CFX_WideString short_name;

+        CPDF_FormField *field_ptr;

+        int CountFields(int nLevel = 0)

+        {

+            if (nLevel > nMaxRecursion) {

+                return 0;

+            }

+            if (field_ptr) {

+                return 1;

+            }

+            int count = 0;

+            for (int i = 0; i < children.GetSize(); i ++) {

+                count += ((_Node *)children.GetAt(i))->CountFields(nLevel + 1);

+            }

+            return count;

+        }

+        CPDF_FormField* GetField(int* fields_to_go)

+        {

+            if (field_ptr) {

+                if (*fields_to_go == 0) {

+                    return field_ptr;

+                }

+                --*fields_to_go;

+                return NULL;

+            }

+            for (int i = 0; i < children.GetSize(); i++) {

+                _Node *pNode = (_Node *)children.GetAt(i);

+                CPDF_FormField* pField = pNode->GetField(fields_to_go);

+                if (pField) {

+                    return pField;

+                }

+            }

+            return NULL;

+        }

+        CPDF_FormField* GetField(int index)

+        {

+            int fields_to_go = index;

+            return GetField(&fields_to_go);

+        }

+    };

+    CFieldTree();

+    ~CFieldTree();

+    void SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr);

+    CPDF_FormField *GetField(const CFX_WideString &full_name);

+    CPDF_FormField *RemoveField(const CFX_WideString &full_name);

+    void RemoveAll();

+    _Node *FindNode(const CFX_WideString &full_name);

+    _Node * AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr);

+    void RemoveNode(_Node *pNode, int nLevel = 0);

+    _Node *_Lookup(_Node *pParent, const CFX_WideString &short_name);

+    _Node m_Root;

+};

+CFieldTree::CFieldTree()

+{

+    m_Root.parent = NULL;

+    m_Root.field_ptr = NULL;

+}

+CFieldTree::~CFieldTree()

+{

+    RemoveAll();

+}

+CFieldTree::_Node *CFieldTree::AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr)

+{

+    if (pParent == NULL) {

+        return NULL;

+    }

+    _Node *pNode = FX_NEW _Node;

+    if (pNode == NULL) {

+        return NULL;

+    }

+    pNode->parent = pParent;

+    pNode->short_name = short_name;

+    pNode->field_ptr = field_ptr;

+    pParent->children.Add(pNode);

+    return pNode;

+}

+void CFieldTree::RemoveNode(_Node *pNode, int nLevel)

+{

+    if (pNode == NULL) {

+        return ;

+    }

+    if (nLevel > nMaxRecursion) {

+        delete pNode;

+        return ;

+    }

+    CFX_PtrArray& ptr_array = pNode->children;

+    for (int i = 0; i < ptr_array.GetSize(); i ++) {

+        _Node *pChild = (_Node *)ptr_array[i];

+        RemoveNode(pChild, nLevel + 1);

+    }

+    delete pNode;

+}

+CFieldTree::_Node *CFieldTree::_Lookup(_Node *pParent, const CFX_WideString &short_name)

+{

+    if (pParent == NULL) {

+        return NULL;

+    }

+    CFX_PtrArray& ptr_array = pParent->children;

+    for (int i = 0; i < ptr_array.GetSize(); i ++) {

+        _Node *pNode = (_Node *)ptr_array[i];

+        if (pNode->short_name.GetLength() == short_name.GetLength() &&

+                FXSYS_memcmp32((FX_LPCWSTR)pNode->short_name, (FX_LPCWSTR)short_name, short_name.GetLength()*sizeof(FX_WCHAR)) == 0) {

+            return pNode;

+        }

+    }

+    return NULL;

+}

+void CFieldTree::RemoveAll()

+{

+    CFX_PtrArray& ptr_array = m_Root.children;

+    for (int i = 0; i < ptr_array.GetSize(); i ++) {

+        _Node *pNode = (_Node *)ptr_array[i];

+        RemoveNode(pNode);

+    }

+}

+void CFieldTree::SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr)

+{

+    if (full_name == L"") {

+        return;

+    }

+    _CFieldNameExtractor name_extractor(full_name);

+    FX_LPCWSTR pName;

+    FX_STRSIZE nLength;

+    name_extractor.GetNext(pName, nLength);

+    _Node *pNode = &m_Root, *pLast = NULL;

+    while (nLength > 0) {

+        pLast = pNode;

+        CFX_WideString name = CFX_WideString(pName, nLength);

+        pNode = _Lookup(pLast, name);

+        if (pNode == NULL) {

+            pNode = AddChild(pLast, name, NULL);

+        }

+        name_extractor.GetNext(pName, nLength);

+    }

+    if (pNode != &m_Root) {

+        pNode->field_ptr = field_ptr;

+    }

+}

+CPDF_FormField *CFieldTree::GetField(const CFX_WideString &full_name)

+{

+    if (full_name == L"") {

+        return NULL;

+    }

+    _CFieldNameExtractor name_extractor(full_name);

+    FX_LPCWSTR pName;

+    FX_STRSIZE nLength;

+    name_extractor.GetNext(pName, nLength);

+    _Node *pNode = &m_Root, *pLast = NULL;

+    while (nLength > 0 && pNode) {

+        pLast = pNode;

+        CFX_WideString name = CFX_WideString(pName, nLength);

+        pNode = _Lookup(pLast, name);

+        name_extractor.GetNext(pName, nLength);

+    }

+    return pNode ? pNode->field_ptr : NULL;

+}

+CPDF_FormField *CFieldTree::RemoveField(const CFX_WideString & full_name)

+{

+    if (full_name == L"") {

+        return NULL;

+    }

+    _CFieldNameExtractor name_extractor(full_name);

+    FX_LPCWSTR pName;

+    FX_STRSIZE nLength;

+    name_extractor.GetNext(pName, nLength);

+    _Node *pNode = &m_Root, *pLast = NULL;

+    while (nLength > 0 && pNode) {

+        pLast = pNode;

+        CFX_WideString name = CFX_WideString(pName, nLength);

+        pNode = _Lookup(pLast, name);

+        name_extractor.GetNext(pName, nLength);

+    }

+    if (pNode && pNode != &m_Root) {

+        CFX_PtrArray& ptr_array = pLast->children;

+        for (int i = 0; i < ptr_array.GetSize(); i ++) {

+            if (pNode == (_Node *)ptr_array[i]) {

+                ptr_array.RemoveAt(i);

+                break;

+            }

+        }

+        CPDF_FormField *pField = pNode->field_ptr;

+        RemoveNode(pNode);

+        return pField;

+    }

+    return NULL;

+}

+CFieldTree::_Node *CFieldTree::FindNode(const CFX_WideString& full_name)

+{

+    if (full_name == L"") {

+        return NULL;

+    }

+    _CFieldNameExtractor name_extractor(full_name);

+    FX_LPCWSTR pName;

+    FX_STRSIZE nLength;

+    name_extractor.GetNext(pName, nLength);

+    _Node *pNode = &m_Root, *pLast = NULL;

+    while (nLength > 0 && pNode) {

+        pLast = pNode;

+        CFX_WideString name = CFX_WideString(pName, nLength);

+        pNode = _Lookup(pLast, name);

+        name_extractor.GetNext(pName, nLength);

+    }

+    return pNode;

+}

+CPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP) : CFX_PrivateData()

+{

+    m_pDocument = pDocument;

+    m_bGenerateAP = bGenerateAP;

+    m_pFormNotify = NULL;

+    m_bUpdated = FALSE;

+    m_pFieldTree = FX_NEW CFieldTree;

+    CPDF_Dictionary* pRoot = m_pDocument->GetRoot();

+    m_pFormDict = pRoot->GetDict("AcroForm");

+    if (m_pFormDict == NULL) {

+        return;

+    }

+    CPDF_Array* pFields = m_pFormDict->GetArray("Fields");

+    if (pFields == NULL) {

+        return;

+    }

+    int count = pFields->GetCount();

+    for (int i = 0; i < count; i ++) {

+        LoadField(pFields->GetDict(i));

+    }

+}

+CPDF_InterForm::~CPDF_InterForm()

+{

+    FX_POSITION pos = m_ControlMap.GetStartPosition();

+    while (pos) {

+        FX_LPVOID key, value;

+        m_ControlMap.GetNextAssoc(pos, key, value);

+        delete (CPDF_FormControl*)value;

+    }

+    if (m_pFieldTree != NULL) {

+        int nCount = m_pFieldTree->m_Root.CountFields();

+        for (int i = 0; i < nCount; i++) {

+            CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);

+            delete pField;

+        }

+        delete m_pFieldTree;

+    }

+}

+FX_BOOL	CPDF_InterForm::m_bUpdateAP = TRUE;

+FX_BOOL CPDF_InterForm::UpdatingAPEnabled()

+{

+    return m_bUpdateAP;

+}

+void CPDF_InterForm::EnableUpdateAP(FX_BOOL bUpdateAP)

+{

+    m_bUpdateAP = bUpdateAP;

+}

+CFX_ByteString CPDF_InterForm::GenerateNewResourceName(const CPDF_Dictionary* pResDict, FX_LPCSTR csType, int iMinLen, FX_LPCSTR csPrefix)

+{

+    CFX_ByteString csStr = csPrefix;

+    CFX_ByteString csBType = csType;

+    if (csStr.IsEmpty()) {

+        if (csBType == "ExtGState") {

+            csStr = "GS";

+        } else if (csBType == "ColorSpace") {

+            csStr = "CS";

+        } else if (csBType == "Font") {

+            csStr = "ZiTi";

+        } else {

+            csStr = "Res";

+        }

+    }

+    CFX_ByteString csTmp = csStr;

+    int iCount = csStr.GetLength();

+    int m = 0;

+    if (iMinLen > 0) {

+        csTmp = "";

+        while (m < iMinLen && m < iCount) {

+            csTmp += csStr[m ++];

+        }

+        while (m < iMinLen) {

+            csTmp += '0' + m % 10;

+            m ++;

+        }

+    } else {

+        m = iCount;

+    }

+    if (pResDict == NULL) {

+        return csTmp;

+    }

+    CPDF_Dictionary* pDict = pResDict->GetDict(csType);

+    if (pDict == NULL) {

+        return csTmp;

+    }

+    int num = 0;

+    CFX_ByteString bsNum;

+    while (TRUE) {

+        if (!pDict->KeyExist(csTmp + bsNum)) {

+            return csTmp + bsNum;

+        }

+        if (m < iCount) {

+            csTmp += csStr[m ++];

+        } else {

+            bsNum.Format("%d", num++);

+        }

+        m ++;

+    }

+    return csTmp;

+}

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+typedef struct _PDF_FONTDATA {

+    FX_BOOL		bFind;

+    LOGFONTA	lf;

+} PDF_FONTDATA, FAR* LPDF_FONTDATA;

+static int CALLBACK EnumFontFamExProc(	ENUMLOGFONTEXA *lpelfe,

+                                        NEWTEXTMETRICEX *lpntme,

+                                        DWORD FontType,

+                                        LPARAM lParam

+                                     )

+{

+    if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@') != NULL) {

+        return 1;

+    } else {

+        LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam;

+        memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA));

+        pData->bFind = TRUE;

+        return 0;

+    }

+}

+static FX_BOOL RetrieveSpecificFont(LOGFONTA& lf)

+{

+    PDF_FONTDATA fd;

+    memset(&fd, 0, sizeof(PDF_FONTDATA));

+    HDC hDC = ::GetDC(NULL);

+    EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, 0);

+    ::ReleaseDC(NULL, hDC);

+    if (fd.bFind) {

+        memcpy(&lf, &fd.lf, sizeof(LOGFONTA));

+    }

+    return fd.bFind;

+}

+static FX_BOOL RetrieveSpecificFont(FX_BYTE charSet, FX_BYTE pitchAndFamily, LPCSTR pcsFontName, LOGFONTA& lf)

+{

+    memset(&lf, 0, sizeof(LOGFONTA));

+    lf.lfCharSet = charSet;

+    lf.lfPitchAndFamily = pitchAndFamily;

+    if (pcsFontName != NULL) {

+        strcpy(lf.lfFaceName, pcsFontName);

+    }

+    return RetrieveSpecificFont(lf);

+}

+static FX_BOOL RetrieveStockFont(int iFontObject, FX_BYTE charSet, LOGFONTA& lf)

+{

+    HFONT hFont = (HFONT)::GetStockObject(iFontObject);

+    if (hFont != NULL) {

+        memset(&lf, 0, sizeof(LOGFONTA));

+        int iRet = ::GetObject(hFont, sizeof(LOGFONTA), &lf);

+        if (iRet > 0 && (lf.lfCharSet == charSet || charSet == 255)) {

+            return RetrieveSpecificFont(lf);

+        }

+    }

+    return FALSE;

+}

+#endif

+CPDF_Font* CPDF_InterForm::AddSystemDefaultFont(const CPDF_Document* pDocument)

+{

+    if (pDocument == NULL) {

+        return NULL;

+    }

+    CPDF_Font* pFont = NULL;

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    LOGFONTA lf;

+    FX_BOOL bRet;

+    bRet = RetrieveStockFont(DEFAULT_GUI_FONT, 255, lf);

+    if (!bRet) {

+        bRet = RetrieveStockFont(SYSTEM_FONT, 255, lf);

+    }

+    if (bRet) {

+        pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);

+    }

+#endif

+    return pFont;

+}

+CPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_ByteString csFontName, FX_BYTE iCharSet)

+{

+    if (pDocument == NULL || csFontName.IsEmpty()) {

+        return NULL;

+    }

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    if (iCharSet == 1) {

+        iCharSet = GetNativeCharSet();

+    }

+    HFONT hFont = ::CreateFontA(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, (FX_LPCSTR)csFontName);

+    if (hFont != NULL) {

+        LOGFONTA lf;

+        memset(&lf, 0, sizeof(LOGFONTA));

+        ::GetObjectA(hFont, sizeof(LOGFONTA), &lf);

+        ::DeleteObject(hFont);

+        if (strlen(lf.lfFaceName) > 0) {

+            return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);

+        }

+    }

+#endif

+    return NULL;

+}

+CPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_WideString csFontName, FX_BYTE iCharSet)

+{

+    if (pDocument == NULL || csFontName.IsEmpty()) {

+        return NULL;

+    }

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    if (iCharSet == 1) {

+        iCharSet = GetNativeCharSet();

+    }

+    HFONT hFont = ::CreateFontW(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, csFontName);

+    if (hFont != NULL) {

+        LOGFONTA lf;

+        memset(&lf, 0, sizeof(LOGFONTA));

+        ::GetObject(hFont, sizeof(LOGFONTA), &lf);

+        ::DeleteObject(hFont);

+        if (strlen(lf.lfFaceName) > 0) {

+            return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);

+        }

+    }

+#endif

+    return NULL;

+}

+CPDF_Font* CPDF_InterForm::AddStandardFont(const CPDF_Document* pDocument, CFX_ByteString csFontName)

+{

+    if (pDocument == NULL || csFontName.IsEmpty()) {

+        return NULL;

+    }

+    CPDF_Font* pFont = NULL;

+    if (csFontName == "ZapfDingbats") {

+        pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, NULL);

+    } else {

+        CPDF_FontEncoding encoding(PDFFONT_ENCODING_WINANSI);

+        pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, &encoding);

+    }

+    return pFont;

+}

+CFX_ByteString CPDF_InterForm::GetNativeFont(FX_BYTE charSet, FX_LPVOID pLogFont)

+{

+    CFX_ByteString csFontName;

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    LOGFONTA lf;

+    FX_BOOL bRet;

+    if (charSet == ANSI_CHARSET) {

+        csFontName = "Helvetica";

+        return csFontName;

+    }

+    bRet = FALSE;

+    if (charSet == SHIFTJIS_CHARSET) {

+        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MS Mincho", lf);

+    } else if (charSet == GB2312_CHARSET) {

+        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "SimSun", lf);

+    } else if (charSet == CHINESEBIG5_CHARSET) {

+        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MingLiU", lf);

+    }

+    if (!bRet) {

+        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Arial Unicode MS", lf);

+    }

+    if (!bRet) {

+        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Microsoft Sans Serif", lf);

+    }

+    if (!bRet) {

+        bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, NULL, lf);

+    }

+    if (bRet) {

+        if (pLogFont != NULL) {

+            memcpy(pLogFont, &lf, sizeof(LOGFONTA));

+        }

+        csFontName = lf.lfFaceName;

+        return csFontName;

+    }

+#endif

+    return csFontName;

+}

+CFX_ByteString CPDF_InterForm::GetNativeFont(FX_LPVOID pLogFont)

+{

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    FX_BYTE charSet = GetNativeCharSet();

+    return GetNativeFont(charSet, pLogFont);

+#else

+    return CFX_ByteString();

+#endif

+}

+FX_BYTE CPDF_InterForm::GetNativeCharSet()

+{

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    FX_BYTE charSet = ANSI_CHARSET;

+    UINT iCodePage = ::GetACP();

+    switch (iCodePage) {

+        case 932:

+            charSet = SHIFTJIS_CHARSET;

+            break;

+        case 936:

+            charSet = GB2312_CHARSET;

+            break;

+        case 950:

+            charSet = CHINESEBIG5_CHARSET;

+            break;

+        case 1252:

+            charSet = ANSI_CHARSET;

+            break;

+        case 874:

+            charSet = THAI_CHARSET;

+            break;

+        case 949:

+            charSet = HANGUL_CHARSET;

+            break;

+        case 1200:

+            charSet = ANSI_CHARSET;

+            break;

+        case 1250:

+            charSet = EASTEUROPE_CHARSET;

+            break;

+        case 1251:

+            charSet = RUSSIAN_CHARSET;

+            break;

+        case 1253:

+            charSet = GREEK_CHARSET;

+            break;

+        case 1254:

+            charSet = TURKISH_CHARSET;

+            break;

+        case 1255:

+            charSet = HEBREW_CHARSET;

+            break;

+        case 1256:

+            charSet = ARABIC_CHARSET;

+            break;

+        case 1257:

+            charSet = BALTIC_CHARSET;

+            break;

+        case 1258:

+            charSet = VIETNAMESE_CHARSET;

+            break;

+        case 1361:

+            charSet = JOHAB_CHARSET;

+            break;

+    }

+    return charSet;

+#else

+    return 0;

+#endif

+}

+CPDF_Font* CPDF_InterForm::AddNativeFont(FX_BYTE charSet, const CPDF_Document* pDocument)

+{

+    if (pDocument == NULL) {

+        return NULL;

+    }

+    CPDF_Font* pFont = NULL;

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    LOGFONTA lf;

+    CFX_ByteString csFontName = GetNativeFont(charSet, &lf);

+    if (!csFontName.IsEmpty()) {

+        if (csFontName == "Helvetica") {

+            pFont = AddStandardFont(pDocument, csFontName);

+        } else {

+            pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);

+        }

+    }

+#endif

+    return pFont;

+}

+CPDF_Font* CPDF_InterForm::AddNativeFont(const CPDF_Document* pDocument)

+{

+    if (pDocument == NULL) {

+        return NULL;

+    }

+    CPDF_Font* pFont = NULL;

+    FX_BYTE charSet = GetNativeCharSet();

+    pFont = AddNativeFont(charSet, pDocument);

+    return pFont;

+}

+FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType, const CPDF_FormField* pExcludedField, const CPDF_FormControl* pExcludedControl)

+{

+    if (csNewFieldName.IsEmpty()) {

+        return FALSE;

+    }

+    int iPos = 0;

+    int iLength = csNewFieldName.GetLength();

+    CFX_WideString csSub;

+    while (TRUE) {

+        while (iPos < iLength && (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) {

+            iPos ++;

+        }

+        if (iPos < iLength && !csSub.IsEmpty()) {

+            csSub += L'.';

+        }

+        while (iPos < iLength && csNewFieldName[iPos] != L'.') {

+            csSub += csNewFieldName[iPos ++];

+        }

+        for (int i = csSub.GetLength() - 1; i > -1; i --) {

+            if (csSub[i] == L' ' || csSub[i] == L'.') {

+                csSub.SetAt(i, L'\0');

+            } else {

+                break;

+            }

+        }

+        FX_DWORD dwCount = m_pFieldTree->m_Root.CountFields();

+        for (FX_DWORD m = 0; m < dwCount; m ++) {

+            CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(m);

+            if (pField == NULL) {

+                continue;

+            }

+            if (pField == pExcludedField) {

+                if (pExcludedControl != NULL) {

+                    if (pField->CountControls() < 2) {

+                        continue;

+                    }

+                } else {

+                    continue;

+                }

+            }

+            CFX_WideString csFullName = pField->GetFullName();

+            int iRet = CompareFieldName(csSub, csFullName);

+            if (iRet == 1) {

+                if (pField->GetFieldType() != iType) {

+                    return FALSE;

+                }

+            } else if (iRet == 2 && csSub == csNewFieldName) {

+                if (csFullName[iPos] == L'.') {

+                    return FALSE;

+                }

+            } else if (iRet == 3 && csSub == csNewFieldName) {

+                if (csNewFieldName[csFullName.GetLength()] == L'.') {

+                    return FALSE;

+                }

+            }

+        }

+        if (iPos >= iLength) {

+            break;

+        }

+    }

+    if (csSub.IsEmpty()) {

+        return FALSE;

+    }

+    csNewFieldName = csSub;

+    return TRUE;

+}

+FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType)

+{

+    return ValidateFieldName(csNewFieldName, iType, NULL, NULL);

+}

+FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormField* pField, CFX_WideString& csNewFieldName)

+{

+    if (pField == NULL || csNewFieldName.IsEmpty()) {

+        return FALSE;

+    }

+    return ValidateFieldName(csNewFieldName, ((CPDF_FormField*)pField)->GetFieldType(), pField, NULL);

+}

+FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormControl* pControl, CFX_WideString& csNewFieldName)

+{

+    if (pControl == NULL || csNewFieldName.IsEmpty()) {

+        return FALSE;

+    }

+    CPDF_FormField* pField = ((CPDF_FormControl*)pControl)->GetField();

+    return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField, pControl);

+}

+int CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1, const CFX_ByteString& name2)

+{

+    FX_LPCSTR ptr1 = name1, ptr2 = name2;

+    if (name1.GetLength() != name2.GetLength()) {

+        int i = 0;

+        while (ptr1[i] == ptr2[i]) {

+            i ++;

+        }

+        if (i == name1.GetLength()) {

+            return 2;

+        }

+        if (i == name2.GetLength()) {

+            return 3;

+        }

+        return 0;

+    } else {

+        return name1 == name2 ? 1 : 0;

+    }

+}

+int CPDF_InterForm::CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2)

+{

+    FX_LPCWSTR ptr1 = name1, ptr2 = name2;

+    if (name1.GetLength() != name2.GetLength()) {

+        int i = 0;

+        while (ptr1[i] == ptr2[i]) {

+            i ++;

+        }

+        if (i == name1.GetLength()) {

+            return 2;

+        }

+        if (i == name2.GetLength()) {

+            return 3;

+        }

+        return 0;

+    } else {

+        return name1 == name2 ? 1 : 0;

+    }

+}

+FX_DWORD CPDF_InterForm::CountFields(const CFX_WideString &csFieldName)

+{

+    if (csFieldName.IsEmpty()) {

+        return (FX_DWORD)m_pFieldTree->m_Root.CountFields();

+    }

+    CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);

+    if (pNode == NULL) {

+        return 0;

+    }

+    return pNode->CountFields();

+}

+CPDF_FormField* CPDF_InterForm::GetField(FX_DWORD index, const CFX_WideString &csFieldName)

+{

+    if (csFieldName == L"") {

+        return m_pFieldTree->m_Root.GetField(index);

+    }

+    CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);

+    if (pNode == NULL) {

+        return NULL;

+    }

+    return pNode->GetField(index);

+}

+void CPDF_InterForm::GetAllFieldNames(CFX_WideStringArray& allFieldNames)

+{

+    allFieldNames.RemoveAll();

+    int nCount = m_pFieldTree->m_Root.CountFields();

+    for (int i = 0; i < nCount; i ++) {

+        CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);

+        if (pField) {

+            CFX_WideString full_name = GetFullName(pField->GetFieldDict());

+            allFieldNames.Add(full_name);

+        }

+    }

+}

+FX_BOOL CPDF_InterForm::IsValidFormField(const void* pField)

+{

+    if (pField == NULL) {

+        return FALSE;

+    }

+    int nCount = m_pFieldTree->m_Root.CountFields();

+    for (int i = 0; i < nCount; i++) {

+        CPDF_FormField *pFormField = m_pFieldTree->m_Root.GetField(i);

+        if (pField == pFormField) {

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+CPDF_FormField* CPDF_InterForm::GetFieldByDict(CPDF_Dictionary* pFieldDict) const

+{

+    if (pFieldDict == NULL) {

+        return NULL;

+    }

+    CFX_WideString csWName = GetFullName(pFieldDict);

+    return m_pFieldTree->GetField(csWName);

+}

+FX_DWORD CPDF_InterForm::CountControls(CFX_WideString csFieldName)

+{

+    if (csFieldName.IsEmpty()) {

+        return (FX_DWORD)m_ControlMap.GetCount();

+    }

+    CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);

+    if (pField == NULL) {

+        return 0;

+    }

+    return pField->m_ControlList.GetSize();

+}

+CPDF_FormControl* CPDF_InterForm::GetControl(FX_DWORD index, CFX_WideString csFieldName)

+{

+    CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);

+    if (pField == NULL) {

+        return NULL;

+    }

+    if (index < (FX_DWORD)pField->m_ControlList.GetSize()) {

+        return (CPDF_FormControl *)pField->m_ControlList.GetAt(index);

+    }

+    return NULL;

+}

+FX_BOOL CPDF_InterForm::IsValidFormControl(const void* pControl)

+{

+    if (pControl == NULL) {

+        return FALSE;

+    }

+    FX_POSITION pos = m_ControlMap.GetStartPosition();

+    while (pos) {

+        CPDF_Dictionary* pWidgetDict = NULL;

+        void* pFormControl = NULL;

+        m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, pFormControl);

+        if (pControl == pFormControl) {

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+int CPDF_InterForm::CountPageControls(CPDF_Page* pPage) const

+{

+    CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");

+    if (pAnnotList == NULL) {

+        return 0;

+    }

+    int count = 0;

+    for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {

+        CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);

+        if (pAnnot == NULL) {

+            continue;

+        }

+        CPDF_FormControl* pControl;

+        if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {

+            continue;

+        }

+        count ++;

+    }

+    return count;

+}

+CPDF_FormControl* CPDF_InterForm::GetPageControl(CPDF_Page* pPage, int index) const

+{

+    CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");

+    if (pAnnotList == NULL) {

+        return NULL;

+    }

+    int count = 0;

+    for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {

+        CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);

+        if (pAnnot == NULL) {

+            continue;

+        }

+        CPDF_FormControl* pControl;

+        if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {

+            continue;

+        }

+        if (index == count) {

+            return pControl;

+        }

+        count ++;

+    }

+    return NULL;

+}

+CPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y) const

+{

+    CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");

+    if (pAnnotList == NULL) {

+        return NULL;

+    }

+    for (FX_DWORD i = pAnnotList->GetCount(); i > 0; i --) {

+        CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i - 1);

+        if (pAnnot == NULL) {

+            continue;

+        }

+        CPDF_FormControl* pControl;

+        if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {

+            continue;

+        }

+        CFX_FloatRect rect = pControl->GetRect();

+        if (rect.Contains(pdf_x, pdf_y)) {

+            return pControl;

+        }

+    }

+    return NULL;

+}

+CPDF_FormControl* CPDF_InterForm::GetControlByDict(CPDF_Dictionary* pWidgetDict) const

+{

+    CPDF_FormControl* pControl = NULL;

+    m_ControlMap.Lookup(pWidgetDict, (FX_LPVOID&)pControl);

+    return pControl;

+}

+FX_DWORD CPDF_InterForm::CountInternalFields(const CFX_WideString& csFieldName) const

+{

+    if (m_pFormDict == NULL) {

+        return 0;

+    }

+    CPDF_Array* pArray = m_pFormDict->GetArray("Fields");

+    if (pArray == NULL) {

+        return 0;

+    }

+    if (csFieldName.IsEmpty()) {

+        return pArray->GetCount();

+    } else {

+        int iLength = csFieldName.GetLength();

+        int iPos = 0;

+        CPDF_Dictionary* pDict = NULL;

+        while (pArray != NULL) {

+            CFX_WideString csSub;

+            if (iPos < iLength && csFieldName[iPos] == L'.') {

+                iPos ++;

+            }

+            while (iPos < iLength && csFieldName[iPos] != L'.') {

+                csSub += csFieldName[iPos ++];

+            }

+            int iCount = pArray->GetCount();

+            FX_BOOL bFind = FALSE;

+            for (int i = 0; i < iCount; i ++) {

+                pDict = pArray->GetDict(i);

+                if (pDict == NULL) {

+                    continue;

+                }

+                CFX_WideString csT = pDict->GetUnicodeText("T");

+                if (csT == csSub) {

+                    bFind = TRUE;

+                    break;

+                }

+            }

+            if (!bFind) {

+                return 0;

+            }

+            if (iPos >= iLength) {

+                break;

+            }

+            pArray = pDict->GetArray("Kids");

+        }

+        if (pDict == NULL) {

+            return 0;

+        } else {

+            pArray = pDict->GetArray("Kids");

+            if (pArray == NULL) {

+                return 1;

+            } else {

+                return pArray->GetCount();

+            }

+        }

+    }

+}

+CPDF_Dictionary* CPDF_InterForm::GetInternalField(FX_DWORD index, const CFX_WideString& csFieldName) const

+{

+    if (m_pFormDict == NULL) {

+        return NULL;

+    }

+    CPDF_Array* pArray = m_pFormDict->GetArray("Fields");

+    if (pArray == NULL) {

+        return 0;

+    }

+    if (csFieldName.IsEmpty()) {

+        return pArray->GetDict(index);

+    } else {

+        int iLength = csFieldName.GetLength();

+        int iPos = 0;

+        CPDF_Dictionary* pDict = NULL;

+        while (pArray != NULL) {

+            CFX_WideString csSub;

+            if (iPos < iLength && csFieldName[iPos] == L'.') {

+                iPos ++;

+            }

+            while (iPos < iLength && csFieldName[iPos] != L'.') {

+                csSub += csFieldName[iPos ++];

+            }

+            int iCount = pArray->GetCount();

+            FX_BOOL bFind = FALSE;

+            for (int i = 0; i < iCount; i ++) {

+                pDict = pArray->GetDict(i);

+                if (pDict == NULL) {

+                    continue;

+                }

+                CFX_WideString csT = pDict->GetUnicodeText("T");

+                if (csT == csSub) {

+                    bFind = TRUE;

+                    break;

+                }

+            }

+            if (!bFind) {

+                return NULL;

+            }

+            if (iPos >= iLength) {

+                break;

+            }

+            pArray = pDict->GetArray("Kids");

+        }

+        if (pDict == NULL) {

+            return NULL;

+        } else {

+            pArray = pDict->GetArray("Kids");

+            if (pArray == NULL) {

+                return pDict;

+            } else {

+                return pArray->GetDict(index);

+            }

+        }

+    }

+}

+FX_BOOL CPDF_InterForm::NeedConstructAP()

+{

+    if (m_pFormDict == NULL) {

+        return FALSE;

+    }

+    return m_pFormDict->GetBoolean("NeedAppearances");

+}

+void CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP)

+{

+    if (m_pFormDict == NULL) {

+        InitInterFormDict(m_pFormDict, m_pDocument);

+    }

+    m_pFormDict->SetAtBoolean("NeedAppearances", bNeedAP);

+    m_bGenerateAP = bNeedAP;

+}

+int CPDF_InterForm::CountFieldsInCalculationOrder()

+{

+    if (m_pFormDict == NULL) {

+        return 0;

+    }

+    CPDF_Array* pArray = m_pFormDict->GetArray("CO");

+    if (pArray == NULL) {

+        return 0;

+    }

+    return pArray->GetCount();

+}

+CPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index)

+{

+    if (m_pFormDict == NULL || index < 0) {

+        return NULL;

+    }

+    CPDF_Array* pArray = m_pFormDict->GetArray("CO");

+    if (pArray == NULL) {

+        return NULL;

+    }

+    CPDF_Object* pElement = pArray->GetElementValue(index);

+    if (pElement != NULL && pElement->GetType() == PDFOBJ_DICTIONARY) {

+        return GetFieldByDict((CPDF_Dictionary*)pElement);

+    }

+    return NULL;

+}

+int CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField)

+{

+    if (m_pFormDict == NULL || pField == NULL) {

+        return -1;

+    }

+    CPDF_Array* pArray = m_pFormDict->GetArray("CO");

+    if (pArray == NULL) {

+        return -1;

+    }

+    for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {

+        CPDF_Object* pElement = pArray->GetElementValue(i);

+        if (pElement == pField->m_pDict) {

+            return i;

+        }

+    }

+    return -1;

+}

+FX_DWORD CPDF_InterForm::CountFormFonts()

+{

+    return CountInterFormFonts(m_pFormDict);

+}

+CPDF_Font* CPDF_InterForm::GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag)

+{

+    return GetInterFormFont(m_pFormDict, m_pDocument, index, csNameTag);

+}

+CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag)

+{

+    return GetInterFormFont(m_pFormDict, m_pDocument, csNameTag);

+}

+CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag)

+{

+    return GetInterFormFont(m_pFormDict, m_pDocument, csFontName, csNameTag);

+}

+CPDF_Font* CPDF_InterForm::GetNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag)

+{

+    return GetNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);

+}

+CPDF_Font* CPDF_InterForm::GetNativeFormFont(CFX_ByteString& csNameTag)

+{

+    return GetNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);

+}

+FX_BOOL CPDF_InterForm::FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag)

+{

+    return FindInterFormFont(m_pFormDict, pFont, csNameTag);

+}

+FX_BOOL CPDF_InterForm::FindFormFont(CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)

+{

+    return FindInterFormFont(m_pFormDict, m_pDocument, csFontName, pFont, csNameTag);

+}

+void CPDF_InterForm::AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag)

+{

+    AddInterFormFont(m_pFormDict, m_pDocument, pFont, csNameTag);

+    m_bUpdated = TRUE;

+}

+CPDF_Font* CPDF_InterForm::AddNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag)

+{

+    m_bUpdated = TRUE;

+    return AddNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);

+}

+CPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag)

+{

+    m_bUpdated = TRUE;

+    return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);

+}

+void CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont)

+{

+    m_bUpdated = TRUE;

+    RemoveInterFormFont(m_pFormDict, pFont);

+}

+void CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag)

+{

+    m_bUpdated = TRUE;

+    RemoveInterFormFont(m_pFormDict, csNameTag);

+}

+CPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance()

+{

+    CFX_ByteString csDA;

+    if (m_pFormDict == NULL) {

+        return csDA;

+    }

+    csDA = m_pFormDict->GetString("DA");

+    return csDA;

+}

+CPDF_Font* CPDF_InterForm::GetDefaultFormFont()

+{

+    return GetDefaultInterFormFont(m_pFormDict, m_pDocument);

+}

+int CPDF_InterForm::GetFormAlignment()

+{

+    if (m_pFormDict == NULL) {

+        return 0;

+    }

+    return m_pFormDict->GetInteger("Q", 0);

+}

+FX_BOOL CPDF_InterForm::ResetForm(const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bNotify)

+{

+    if (bNotify && m_pFormNotify != NULL) {

+        int iRet = m_pFormNotify->BeforeFormReset(this);

+        if (iRet < 0) {

+            return FALSE;

+        }

+    }

+    int nCount = m_pFieldTree->m_Root.CountFields();

+    for (int i = 0; i < nCount; i++) {

+        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);

+        if (pField == NULL) {

+            continue;

+        }

+        FX_BOOL bFind = FALSE;

+        int iCount = fields.GetSize();

+        for (int i = 0; i < iCount; i ++) {

+            if (pField == (CPDF_FormField*)fields[i]) {

+                bFind = TRUE;

+                break;

+            }

+        }

+        if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {

+            pField->ResetField(bNotify);

+        }

+    }

+    if (bNotify && m_pFormNotify != NULL) {

+        m_pFormNotify->AfterFormReset(this);

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_InterForm::ResetForm(FX_BOOL bNotify)

+{

+    if (bNotify && m_pFormNotify != NULL) {

+        int iRet = m_pFormNotify->BeforeFormReset(this);

+        if (iRet < 0) {

+            return FALSE;

+        }

+    }

+    int nCount = m_pFieldTree->m_Root.CountFields();

+    for (int i = 0; i < nCount; i++) {

+        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);

+        if (pField == NULL) {

+            continue;

+        }

+        pField->ResetField(bNotify);

+    }

+    if (bNotify && m_pFormNotify != NULL) {

+        m_pFormNotify->AfterFormReset(this);

+    }

+    return TRUE;

+}

+void CPDF_InterForm::ReloadForm()

+{

+    FX_POSITION pos = m_ControlMap.GetStartPosition();

+    while (pos) {

+        CPDF_Dictionary* pWidgetDict;

+        CPDF_FormControl* pControl;

+        m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, (FX_LPVOID&)pControl);

+        delete pControl;

+    }

+    m_ControlMap.RemoveAll();

+    int nCount = m_pFieldTree->m_Root.CountFields();

+    for (int k = 0; k < nCount; k ++) {

+        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(k);

+        delete pField;

+    }

+    m_pFieldTree->RemoveAll();

+    if (m_pFormDict == NULL) {

+        return;

+    }

+    CPDF_Array* pFields = m_pFormDict->GetArray("Fields");

+    if (pFields == NULL) {

+        return;

+    }

+    int iCount = pFields->GetCount();

+    for (int i = 0; i < iCount; i ++) {

+        LoadField(pFields->GetDict(i));

+    }

+}

+void CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel)

+{

+    if (nLevel > nMaxRecursion) {

+        return;

+    }

+    if (pFieldDict == NULL) {

+        return;

+    }

+    FX_DWORD dwParentObjNum = pFieldDict->GetObjNum();

+    CPDF_Array* pKids = pFieldDict->GetArray("Kids");

+    if (!pKids) {

+        AddTerminalField(pFieldDict);

+        return;

+    }

+    CPDF_Dictionary* pFirstKid = pKids->GetDict(0);

+    if (pFirstKid == NULL) {

+        return;

+    }

+    if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) {

+        for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {

+            CPDF_Dictionary * pChildDict = pKids->GetDict(i);

+            if (pChildDict) {

+                if (pChildDict->GetObjNum() != dwParentObjNum) {

+                    LoadField(pChildDict, nLevel + 1);

+                }

+            }

+        }

+    } else {

+        AddTerminalField(pFieldDict);

+    }

+}

+FX_BOOL CPDF_InterForm::HasXFAForm() const

+{

+    return m_pFormDict && m_pFormDict->GetArray(FX_BSTRC("XFA")) != NULL;

+}

+void CPDF_InterForm::FixPageFields(const CPDF_Page* pPage)

+{

+    ASSERT(pPage != NULL);

+    CPDF_Dictionary* pPageDict = pPage->m_pFormDict;

+    if (pPageDict == NULL) {

+        return;

+    }

+    CPDF_Array* pAnnots = pPageDict->GetArray(FX_BSTRC("Annots"));

+    if (pAnnots == NULL) {

+        return;

+    }

+    int iAnnotCount = pAnnots->GetCount();

+    for (int i = 0; i < iAnnotCount; i++) {

+        CPDF_Dictionary* pAnnot = pAnnots->GetDict(i);

+        if (pAnnot != NULL && pAnnot->GetString(FX_BSTRC("Subtype")) == "Widget") {

+            LoadField(pAnnot);

+        }

+    }

+}

+CPDF_FormField* CPDF_InterForm::AddTerminalField(const CPDF_Dictionary* pFieldDict)

+{

+    if (!pFieldDict->KeyExist(FX_BSTRC("T"))) {

+        return NULL;

+    }

+    CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFieldDict;

+    CFX_WideString csWName = GetFullName(pDict);

+    if (csWName.IsEmpty()) {

+        return NULL;

+    }

+    CPDF_FormField* pField = NULL;

+    pField = m_pFieldTree->GetField(csWName);

+    if (pField == NULL) {

+        CPDF_Dictionary *pParent = (CPDF_Dictionary*)pFieldDict;

+        if (!pFieldDict->KeyExist(FX_BSTR("T")) &&

+                pFieldDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget")) {

+            pParent = pFieldDict->GetDict(FX_BSTRC("Parent"));

+            if (!pParent) {

+                pParent = (CPDF_Dictionary*)pFieldDict;

+            }

+        }

+        if (pParent && pParent != pFieldDict && !pParent->KeyExist(FX_BSTRC("FT"))) {

+            if (pFieldDict->KeyExist(FX_BSTRC("FT"))) {

+                CPDF_Object *pFTValue = pFieldDict->GetElementValue(FX_BSTRC("FT"));

+                if (pFTValue) {

+                    pParent->SetAt(FX_BSTRC("FT"), pFTValue->Clone());

+                }

+            }

+            if (pFieldDict->KeyExist(FX_BSTRC("Ff"))) {

+                CPDF_Object *pFfValue = pFieldDict->GetElementValue(FX_BSTRC("Ff"));

+                if (pFfValue) {

+                    pParent->SetAt(FX_BSTRC("Ff"), pFfValue->Clone());

+                }

+            }

+        }

+        pField = FX_NEW CPDF_FormField(this, pParent);

+        CPDF_Object* pTObj = pDict->GetElement("T");

+        if (pTObj && pTObj->GetType() == PDFOBJ_REFERENCE) {

+            CPDF_Object* pClone = pTObj->Clone(TRUE);

+            if (pClone) {

+                pDict->SetAt("T", pClone);

+            } else {

+                pDict->SetAtName("T", "");

+            }

+        }

+        m_pFieldTree->SetField(csWName, pField);

+    }

+    CPDF_Array* pKids = pFieldDict->GetArray("Kids");

+    if (pKids == NULL) {

+        if (pFieldDict->GetString("Subtype") == "Widget") {

+            AddControl(pField, pFieldDict);

+        }

+    } else {

+        for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {

+            CPDF_Dictionary* pKid = pKids->GetDict(i);

+            if (pKid == NULL) {

+                continue;

+            }

+            if (pKid->GetString("Subtype") != "Widget") {

+                continue;

+            }

+            AddControl(pField, pKid);

+        }

+    }

+    return pField;

+}

+CPDF_FormControl* CPDF_InterForm::AddControl(const CPDF_FormField* pField, const CPDF_Dictionary* pWidgetDict)

+{

+    void *rValue = NULL;

+    if (m_ControlMap.Lookup((CPDF_Dictionary*)pWidgetDict, rValue)) {

+        return (CPDF_FormControl*)rValue;

+    }

+    CPDF_FormControl* pControl = FX_NEW CPDF_FormControl((CPDF_FormField*)pField, (CPDF_Dictionary*)pWidgetDict);

+    if (pControl == NULL) {

+        return NULL;

+    }

+    m_ControlMap.SetAt((CPDF_Dictionary*)pWidgetDict, pControl);

+    ((CPDF_FormField*)pField)->m_ControlList.Add(pControl);

+    return pControl;

+}

+CPDF_FormField* CPDF_InterForm::CheckRequiredFields(const CFX_PtrArray *fields, FX_BOOL bIncludeOrExclude) const

+{

+    int nCount = m_pFieldTree->m_Root.CountFields();

+    for (int i = 0; i < nCount; i++) {

+        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);

+        if (pField == NULL) {

+            continue;

+        }

+        FX_INT32 iType = pField->GetType();

+        if (iType == CPDF_FormField::PushButton || iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) {

+            continue;

+        }

+        FX_DWORD dwFlags = pField->GetFieldFlags();

+        if (dwFlags & 0x04) {

+            continue;

+        }

+        FX_BOOL bFind = TRUE;

+        if (fields != NULL) {

+            bFind = fields->Find(pField, 0) >= 0;

+        }

+        if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {

+            CPDF_Dictionary *pFieldDict = pField->m_pDict;

+            if ((dwFlags & 0x02) != 0 && pFieldDict->GetString("V").IsEmpty()) {

+                return pField;

+            }

+        }

+    }

+    return NULL;

+}

+CFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, FX_BOOL bSimpleFileSpec) const

+{

+    CFX_PtrArray fields;

+    int nCount = m_pFieldTree->m_Root.CountFields();

+    for (int i = 0; i < nCount; i ++) {

+        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);

+        fields.Add(pField);

+    }

+    return ExportToFDF(pdf_path, fields, TRUE, bSimpleFileSpec);

+}

+CFX_WideString FILESPEC_EncodeFileName(FX_WSTR filepath);

+CFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bSimpleFileSpec) const

+{

+    CFDF_Document* pDoc = CFDF_Document::CreateNewDoc();

+    if (pDoc == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDict("FDF");

+    if (!pdf_path.IsEmpty()) {

+        if (bSimpleFileSpec) {

+            CFX_WideString wsFilePath = FILESPEC_EncodeFileName(pdf_path);

+            pMainDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(wsFilePath));

+            pMainDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsFilePath));

+        } else {

+            CPDF_FileSpec filespec;

+            filespec.SetFileName(pdf_path);

+            pMainDict->SetAt("F", (CPDF_Object*)filespec);

+        }

+    }

+    CPDF_Array* pFields = CPDF_Array::Create();

+    if (pFields == NULL) {

+        return NULL;

+    }

+    pMainDict->SetAt("Fields", pFields);

+    int nCount = m_pFieldTree->m_Root.CountFields();

+    for (int i = 0; i < nCount; i ++) {

+        CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);

+        if (pField == NULL || pField->GetType() == CPDF_FormField::PushButton) {

+            continue;

+        }

+        FX_DWORD dwFlags = pField->GetFieldFlags();

+        if (dwFlags & 0x04) {

+            continue;

+        }

+        FX_BOOL bFind = fields.Find(pField, 0) >= 0;

+        if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {

+            if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty()) {

+                continue;

+            }

+            CFX_WideString fullname = GetFullName(pField->GetFieldDict());

+            CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create();

+            if (pFieldDict == NULL) {

+                return NULL;

+            }

+            CPDF_String* pString = CPDF_String::Create(fullname);

+            if (pString == NULL) {

+                pFieldDict->Release();

+                return NULL;

+            }

+            pFieldDict->SetAt("T", pString);

+            if (pField->GetType() == CPDF_FormField::CheckBox || pField->GetType() == CPDF_FormField::RadioButton) {

+                CFX_WideString csExport = pField->GetCheckValue(FALSE);

+                CFX_ByteString csBExport = PDF_EncodeText(csExport);

+                CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt");

+                if (pOpt == NULL) {

+                    pFieldDict->SetAtName("V", csBExport);

+                } else {

+                    pFieldDict->SetAtString("V", csBExport);

+                }

+            } else {

+                CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V");

+                if (pV != NULL) {

+                    pFieldDict->SetAt("V", pV->Clone(TRUE));

+                }

+            }

+            pFields->Add(pFieldDict);

+        }

+    }

+    return pDoc;

+}

+const struct _SupportFieldEncoding {

+    FX_LPCSTR m_name;

+    FX_INT32 m_codePage;

+} g_fieldEncoding[] = {

+    "BigFive", 950,

+    "GBK", 936,

+    "Shift-JIS", 932,

+    "UHC", 949,

+};

+static void FPDFDOC_FDF_GetFieldValue(CPDF_Dictionary *pFieldDict, CFX_WideString &csValue, CFX_ByteString &bsEncoding)

+{

+    ASSERT(pFieldDict != NULL);

+    CFX_ByteString csBValue = pFieldDict->GetString("V");

+    FX_INT32 iCount = sizeof(g_fieldEncoding) / sizeof(g_fieldEncoding[0]);

+    FX_INT32 i = 0;

+    for (; i < iCount; ++i)

+        if (bsEncoding == g_fieldEncoding[i].m_name) {

+            break;

+        }

+    if (i < iCount) {

+        CFX_CharMap *pCharMap = CFX_CharMap::GetDefaultMapper(g_fieldEncoding[i].m_codePage);

+        FXSYS_assert(pCharMap != NULL);

+        csValue.ConvertFrom(csBValue, pCharMap);

+        return;

+    }

+    CFX_ByteString csTemp = csBValue.Left(2);

+    if (csTemp == "\xFF\xFE" || csTemp == "\xFE\xFF") {

+        csValue = PDF_DecodeText(csBValue);

+    } else {

+        csValue = CFX_WideString::FromLocal(csBValue);

+    }

+}

+void CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict, const CFX_WideString& parent_name, FX_BOOL bNotify, int nLevel)

+{

+    CFX_WideString name;

+    if (!parent_name.IsEmpty()) {

+        name = parent_name + L".";

+    }

+    name += pFieldDict->GetUnicodeText("T");

+    CPDF_Array* pKids = pFieldDict->GetArray("Kids");

+    if (pKids) {

+        for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {

+            CPDF_Dictionary* pKid = pKids->GetDict(i);

+            if (pKid == NULL) {

+                continue;

+            }

+            if (nLevel <= nMaxRecursion) {

+                FDF_ImportField(pKid, name, bNotify, nLevel + 1);

+            }

+        }

+        return;

+    }

+    if (!pFieldDict->KeyExist("V")) {

+        return;

+    }

+    CPDF_FormField* pField = m_pFieldTree->GetField(name);

+    if (pField == NULL) {

+        return;

+    }

+    CFX_WideString csWValue;

+    FPDFDOC_FDF_GetFieldValue(pFieldDict, csWValue, m_bsEncoding);

+    int iType = pField->GetFieldType();

+    if (bNotify && m_pFormNotify != NULL) {

+        int iRet = 0;

+        if (iType == FIELDTYPE_LISTBOX) {

+            iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue);

+        } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {

+            iRet = m_pFormNotify->BeforeValueChange(pField, csWValue);

+        }

+        if (iRet < 0) {

+            return;

+        }

+    }

+    CFX_ByteArray statusArray;

+    if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {

+        SaveCheckedFieldStatus(pField, statusArray);

+    }

+    pField->SetValue(csWValue);

+    CPDF_FormField::Type eType = pField->GetType();

+    if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && pFieldDict->KeyExist("Opt")) {

+        pField->m_pDict->SetAt("Opt", pFieldDict->GetElementValue("Opt")->Clone(TRUE));

+    }

+    if (bNotify && m_pFormNotify != NULL) {

+        if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {

+            m_pFormNotify->AfterCheckedStatusChange(pField, statusArray);

+        } else if (iType == FIELDTYPE_LISTBOX) {

+            m_pFormNotify->AfterSelectionChange(pField);

+        } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {

+            m_pFormNotify->AfterValueChange(pField);

+        }

+    }

+    if (CPDF_InterForm::m_bUpdateAP) {

+        pField->UpdateAP(NULL);

+    }

+}

+FX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF, FX_BOOL bNotify)

+{

+    if (pFDF == NULL) {

+        return FALSE;

+    }

+    CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF");

+    if (pMainDict == NULL) {

+        return FALSE;

+    }

+    CPDF_Array* pFields = pMainDict->GetArray("Fields");

+    if (pFields == NULL) {

+        return FALSE;

+    }

+    m_bsEncoding = pMainDict->GetString(FX_BSTRC("Encoding"));

+    if (bNotify && m_pFormNotify != NULL) {

+        int iRet = m_pFormNotify->BeforeFormImportData(this);

+        if (iRet < 0) {

+            return FALSE;

+        }

+    }

+    for (FX_DWORD i = 0; i < pFields->GetCount(); i ++) {

+        CPDF_Dictionary* pField = pFields->GetDict(i);

+        if (pField == NULL) {

+            continue;

+        }

+        FDF_ImportField(pField, L"", bNotify);

+    }

+    if (bNotify && m_pFormNotify != NULL) {

+        m_pFormNotify->AfterFormImportData(this);

+    }

+    return TRUE;

+}

+void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify)

+{

+    m_pFormNotify = (CPDF_FormNotify*)pNotify;

+}

+int CPDF_InterForm::GetPageWithWidget(int iCurPage, FX_BOOL bNext)

+{

+    if (iCurPage < 0) {

+        return -1;

+    }

+    int iPageCount = m_pDocument->GetPageCount();

+    if (iCurPage >= iPageCount) {

+        return -1;

+    }

+    int iNewPage = iCurPage;

+    do {

+        iNewPage += bNext ? 1 : -1;

+        if (iNewPage >= iPageCount) {

+            iNewPage = 0;

+        }

+        if (iNewPage < 0) {

+            iNewPage = iPageCount - 1;

+        }

+        if (iNewPage == iCurPage) {

+            break;

+        }

+        CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iNewPage);

+        if (pPageDict == NULL) {

+            continue;

+        }

+        CPDF_Array* pAnnots = pPageDict->GetArray("Annots");

+        if (pAnnots == NULL) {

+            continue;

+        }

+        FX_DWORD dwCount = pAnnots->GetCount();

+        for (FX_DWORD i = 0; i < dwCount; i ++) {

+            CPDF_Object* pAnnotDict = pAnnots->GetElementValue(i);

+            if (pAnnotDict == NULL) {

+                continue;

+            }

+            CPDF_FormControl* pControl = NULL;

+            if (m_ControlMap.Lookup(pAnnotDict, (void*&)pControl)) {

+                return iNewPage;

+            }

+        }

+    } while (TRUE);

+    return -1;

+}

diff --git a/core/src/fpdfdoc/doc_formcontrol.cpp b/core/src/fpdfdoc/doc_formcontrol.cpp
new file mode 100644
index 0000000..f92b87e
--- /dev/null
+++ b/core/src/fpdfdoc/doc_formcontrol.cpp
@@ -0,0 +1,461 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+CPDF_FormControl::CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict)

+{

+    m_pField = pField;

+    m_pWidgetDict = pWidgetDict;

+    m_pForm = m_pField->m_pForm;

+}

+CFX_FloatRect CPDF_FormControl::GetRect()

+{

+    return m_pWidgetDict->GetRect("Rect");

+}

+CFX_ByteString CPDF_FormControl::GetOnStateName()

+{

+    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);

+    CFX_ByteString csOn;

+    CPDF_Dictionary* pAP = m_pWidgetDict->GetDict("AP");

+    if (pAP == NULL) {

+        return csOn;

+    }

+    CPDF_Dictionary* pN = pAP->GetDict("N");

+    if (pN == NULL) {

+        return csOn;

+    }

+    FX_POSITION pos = pN->GetStartPos();

+    while (pos) {

+        pN->GetNextElement(pos, csOn);

+        if (csOn != "Off") {

+            return csOn;

+        }

+    }

+    return CFX_ByteString();

+}

+void CPDF_FormControl::SetOnStateName(const CFX_ByteString& csOn)

+{

+    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);

+    CFX_ByteString csValue = csOn;

+    if (csValue.IsEmpty()) {

+        csValue = "Yes";

+    }

+    if (csValue == "Off") {

+        csValue = "Yes";

+    }

+    CFX_ByteString csAS = m_pWidgetDict->GetString("AS", "Off");

+    if (csAS != "Off") {

+        m_pWidgetDict->SetAtName("AS", csValue);

+    }

+    CPDF_Dictionary* pAP = m_pWidgetDict->GetDict("AP");

+    if (pAP == NULL) {

+        return;

+    }

+    FX_POSITION pos1 = pAP->GetStartPos();

+    while (pos1) {

+        CFX_ByteString csKey1;

+        CPDF_Object* pObj1 = pAP->GetNextElement(pos1, csKey1);

+        if (pObj1 == NULL) {

+            continue;

+        }

+        CPDF_Object* pObjDirect1 = pObj1->GetDirect();

+        if (pObjDirect1->GetType() != PDFOBJ_DICTIONARY) {

+            continue;

+        }

+        CPDF_Dictionary* pSubDict = (CPDF_Dictionary*)pObjDirect1;

+        FX_POSITION pos2 = pSubDict->GetStartPos();

+        while (pos2) {

+            CFX_ByteString csKey2;

+            CPDF_Object* pObj2 = pSubDict->GetNextElement(pos2, csKey2);

+            if (pObj2 == NULL) {

+                continue;

+            }

+            if (csKey2 != "Off") {

+                pSubDict->ReplaceKey(csKey2, csValue);

+                break;

+            }

+        }

+    }

+}

+CFX_ByteString CPDF_FormControl::GetCheckedAPState()

+{

+    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);

+    CFX_ByteString csOn = GetOnStateName();

+    if (GetType() == CPDF_FormField::RadioButton || GetType() == CPDF_FormField::CheckBox) {

+        CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pField->m_pDict, "Opt");

+        if (pOpt != NULL && pOpt->GetType() == PDFOBJ_ARRAY) {

+            int iIndex = m_pField->GetControlIndex(this);

+            csOn.Format("%d", iIndex);

+        }

+    }

+    if (csOn.IsEmpty()) {

+        csOn = "Yes";

+    }

+    return csOn;

+}

+CFX_WideString CPDF_FormControl::GetExportValue()

+{

+    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);

+    CFX_ByteString csOn = GetOnStateName();

+    if (GetType() == CPDF_FormField::RadioButton || GetType() == CPDF_FormField::CheckBox) {

+        CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pField->m_pDict, "Opt");

+        if (pOpt != NULL && pOpt->GetType() == PDFOBJ_ARRAY) {

+            int iIndex = m_pField->GetControlIndex(this);

+            csOn = ((CPDF_Array*)pOpt)->GetString(iIndex);

+        }

+    }

+    if (csOn.IsEmpty()) {

+        csOn = "Yes";

+    }

+    CFX_WideString csWOn = PDF_DecodeText(csOn);

+    return csWOn;

+}

+FX_BOOL CPDF_FormControl::IsChecked()

+{

+    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);

+    CFX_ByteString csOn = GetOnStateName();

+    CFX_ByteString csAS = m_pWidgetDict->GetString("AS");

+    return csAS == csOn;

+}

+FX_BOOL CPDF_FormControl::IsDefaultChecked()

+{

+    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);

+    CPDF_Object* pDV = FPDF_GetFieldAttr(m_pField->m_pDict, "DV");

+    if (pDV == NULL) {

+        return FALSE;

+    }

+    CFX_ByteString csDV = pDV->GetString();

+    CFX_ByteString csOn = GetOnStateName();

+    return (csDV == csOn);

+}

+void CPDF_FormControl::CheckControl(FX_BOOL bChecked)

+{

+    ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);

+    CFX_ByteString csOn = GetOnStateName();

+    CFX_ByteString csOldAS = m_pWidgetDict->GetString("AS", "Off");

+    CFX_ByteString csAS = "Off";

+    if (bChecked) {

+        csAS = csOn;

+    }

+    if (csOldAS == csAS) {

+        return;

+    }

+    m_pWidgetDict->SetAtName("AS", csAS);

+    m_pForm->m_bUpdated = TRUE;

+}

+CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode mode);

+void CPDF_FormControl::DrawControl(CFX_RenderDevice* pDevice, CFX_AffineMatrix* pMatrix, CPDF_Page* pPage,

+                                   CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)

+{

+    if (m_pWidgetDict->GetInteger("F") & ANNOTFLAG_HIDDEN) {

+        return;

+    }

+    CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pWidgetDict, mode);

+    if (pStream == NULL) {

+        return;

+    }

+    CFX_FloatRect form_bbox = pStream->GetDict()->GetRect("BBox");

+    CFX_AffineMatrix form_matrix = pStream->GetDict()->GetMatrix("Matrix");

+    form_matrix.TransformRect(form_bbox);

+    CFX_FloatRect arect = m_pWidgetDict->GetRect("Rect");

+    CFX_AffineMatrix matrix;

+    matrix.MatchRect(arect, form_bbox);

+    matrix.Concat(*pMatrix);

+    CPDF_Form form(m_pField->m_pForm->m_pDocument, m_pField->m_pForm->m_pFormDict->GetDict("DR"), pStream);

+    form.ParseContent(NULL, NULL, NULL, NULL);

+    CPDF_RenderContext context;

+    context.Create(pPage);

+    context.DrawObjectList(pDevice, &form, &matrix, pOptions);

+}

+const FX_CHAR* g_sHighlightingMode[] = {"N", "I", "O", "P", "T", ""};

+CPDF_FormControl::HighlightingMode CPDF_FormControl::GetHighlightingMode()

+{

+    if (m_pWidgetDict == NULL) {

+        return Invert;

+    }

+    CFX_ByteString csH = m_pWidgetDict->GetString("H", "I");

+    int i = 0;

+    while (g_sHighlightingMode[i][0] != '\0') {

+        if (csH.Equal(g_sHighlightingMode[i])) {

+            return (HighlightingMode)i;

+        }

+        i ++;

+    }

+    return Invert;

+}

+CPDF_ApSettings CPDF_FormControl::GetMK(FX_BOOL bCreate)

+{

+    if (!m_pWidgetDict) {

+        return NULL;

+    }

+    CPDF_ApSettings mk = m_pWidgetDict->GetDict(FX_BSTRC("MK"));

+    if (!mk && bCreate) {

+        mk = CPDF_Dictionary::Create();

+        if (mk == NULL) {

+            return NULL;

+        }

+        m_pWidgetDict->SetAt(FX_BSTRC("MK"), mk);

+    }

+    return mk;

+}

+FX_BOOL CPDF_FormControl::HasMKEntry(CFX_ByteString csEntry)

+{

+    CPDF_ApSettings mk = GetMK(FALSE);

+    return mk.HasMKEntry(csEntry);

+}

+int CPDF_FormControl::GetRotation()

+{

+    CPDF_ApSettings mk = GetMK(FALSE);

+    return mk.GetRotation();

+}

+FX_ARGB CPDF_FormControl::GetColor(int& iColorType, CFX_ByteString csEntry)

+{

+    CPDF_ApSettings mk = GetMK(FALSE);

+    return mk.GetColor(iColorType, csEntry);

+}

+FX_FLOAT CPDF_FormControl::GetOriginalColor(int index, CFX_ByteString csEntry)

+{

+    CPDF_ApSettings mk = GetMK(FALSE);

+    return mk.GetOriginalColor(index, csEntry);

+}

+void CPDF_FormControl::GetOriginalColor(int& iColorType, FX_FLOAT fc[4], CFX_ByteString csEntry)

+{

+    CPDF_ApSettings mk = GetMK(FALSE);

+    mk.GetOriginalColor(iColorType, fc, csEntry);

+}

+CFX_WideString CPDF_FormControl::GetCaption(CFX_ByteString csEntry)

+{

+    CPDF_ApSettings mk = GetMK(FALSE);

+    return mk.GetCaption(csEntry);

+}

+CPDF_Stream* CPDF_FormControl::GetIcon(CFX_ByteString csEntry)

+{

+    CPDF_ApSettings mk = GetMK(FALSE);

+    return mk.GetIcon(csEntry);

+}

+CPDF_IconFit CPDF_FormControl::GetIconFit()

+{

+    CPDF_ApSettings mk = GetMK(FALSE);

+    return mk.GetIconFit();

+}

+int CPDF_FormControl::GetTextPosition()

+{

+    CPDF_ApSettings mk = GetMK(FALSE);

+    return mk.GetTextPosition();

+}

+CPDF_Action CPDF_FormControl::GetAction()

+{

+    if (m_pWidgetDict == NULL) {

+        return NULL;

+    }

+    if (m_pWidgetDict->KeyExist("A")) {

+        return m_pWidgetDict->GetDict("A");

+    } else {

+        CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "A");

+        if (pObj == NULL) {

+            return NULL;

+        }

+        return pObj->GetDict();

+    }

+}

+CPDF_AAction CPDF_FormControl::GetAdditionalAction()

+{

+    if (m_pWidgetDict == NULL) {

+        return NULL;

+    }

+    if (m_pWidgetDict->KeyExist("AA")) {

+        return m_pWidgetDict->GetDict("AA");

+    } else {

+        return m_pField->GetAdditionalAction();

+    }

+}

+CPDF_DefaultAppearance CPDF_FormControl::GetDefaultAppearance()

+{

+    if (m_pWidgetDict == NULL) {

+        return CFX_ByteString();

+    }

+    if (m_pWidgetDict->KeyExist("DA")) {

+        return m_pWidgetDict->GetString("DA");

+    } else {

+        CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "DA");

+        if (pObj == NULL) {

+            return m_pField->m_pForm->GetDefaultAppearance();

+        }

+        return pObj->GetString();

+    }

+}

+CPDF_Font* CPDF_FormControl::GetDefaultControlFont()

+{

+    CPDF_DefaultAppearance cDA = GetDefaultAppearance();

+    CFX_ByteString csFontNameTag;

+    FX_FLOAT fFontSize;

+    cDA.GetFont(csFontNameTag, fFontSize);

+    if (csFontNameTag.IsEmpty()) {

+        return NULL;

+    }

+    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pWidgetDict, "DR");

+    if (pObj != NULL && pObj->GetType() == PDFOBJ_DICTIONARY) {

+        CPDF_Dictionary* pFonts = ((CPDF_Dictionary*)pObj)->GetDict("Font");

+        if (pFonts != NULL) {

+            CPDF_Dictionary *pElement = pFonts->GetDict(csFontNameTag);

+            CPDF_Font *pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement);

+            if (pFont != NULL) {

+                return pFont;

+            }

+        }

+    }

+    CPDF_Font *pFont = m_pField->m_pForm->GetFormFont(csFontNameTag);

+    if (pFont != NULL) {

+        return pFont;

+    }

+    CPDF_Dictionary *pPageDict = m_pWidgetDict->GetDict("P");

+    pObj = FPDF_GetFieldAttr(pPageDict, "Resources");

+    if (pObj != NULL && pObj->GetType() == PDFOBJ_DICTIONARY) {

+        CPDF_Dictionary* pFonts = ((CPDF_Dictionary*)pObj)->GetDict("Font");

+        if (pFonts != NULL) {

+            CPDF_Dictionary *pElement = pFonts->GetDict(csFontNameTag);

+            CPDF_Font *pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement);

+            if (pFont != NULL) {

+                return pFont;

+            }

+        }

+    }

+    return NULL;

+}

+int CPDF_FormControl::GetControlAlignment()

+{

+    if (m_pWidgetDict == NULL) {

+        return 0;

+    }

+    if (m_pWidgetDict->KeyExist("Q")) {

+        return m_pWidgetDict->GetInteger("Q", 0);

+    } else {

+        CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "Q");

+        if (pObj == NULL) {

+            return m_pField->m_pForm->GetFormAlignment();

+        }

+        return pObj->GetInteger();

+    }

+}

+FX_BOOL CPDF_ApSettings::HasMKEntry(FX_BSTR csEntry)

+{

+    if (m_pDict == NULL) {

+        return FALSE;

+    }

+    return m_pDict->KeyExist(csEntry);

+}

+int CPDF_ApSettings::GetRotation()

+{

+    if (m_pDict == NULL) {

+        return 0;

+    }

+    return m_pDict->GetInteger(FX_BSTRC("R"));

+}

+FX_ARGB CPDF_ApSettings::GetColor(int& iColorType, FX_BSTR csEntry)

+{

+    iColorType = COLORTYPE_TRANSPARENT;

+    if (m_pDict == NULL) {

+        return 0;

+    }

+    FX_ARGB color = 0;

+    CPDF_Array* pEntry = m_pDict->GetArray(csEntry);

+    if (pEntry == NULL) {

+        return color;

+    }

+    FX_DWORD dwCount = pEntry->GetCount();

+    if (dwCount == 1) {

+        iColorType = COLORTYPE_GRAY;

+        FX_FLOAT g = pEntry->GetNumber(0) * 255;

+        color = ArgbEncode(255, (int)g, (int)g, (int)g);

+    } else if (dwCount == 3) {

+        iColorType = COLORTYPE_RGB;

+        FX_FLOAT r = pEntry->GetNumber(0) * 255;

+        FX_FLOAT g = pEntry->GetNumber(1) * 255;

+        FX_FLOAT b = pEntry->GetNumber(2) * 255;

+        color = ArgbEncode(255, (int)r, (int)g, (int)b);

+    } else if (dwCount == 4) {

+        iColorType = COLORTYPE_CMYK;

+        FX_FLOAT c = pEntry->GetNumber(0);

+        FX_FLOAT m = pEntry->GetNumber(1);

+        FX_FLOAT y = pEntry->GetNumber(2);

+        FX_FLOAT k = pEntry->GetNumber(3);

+        FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);

+        FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);

+        FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);

+        color = ArgbEncode(255, (int)(r * 255), (int)(g * 255), (int)(b * 255));

+    }

+    return color;

+}

+FX_FLOAT CPDF_ApSettings::GetOriginalColor(int index, FX_BSTR csEntry)

+{

+    if (m_pDict == NULL) {

+        return 0;

+    }

+    CPDF_Array* pEntry = m_pDict->GetArray(csEntry);

+    if (pEntry != NULL) {

+        return pEntry->GetNumber(index);

+    }

+    return 0;

+}

+void CPDF_ApSettings::GetOriginalColor(int& iColorType, FX_FLOAT fc[4], FX_BSTR csEntry)

+{

+    iColorType = COLORTYPE_TRANSPARENT;

+    for (int i = 0; i < 4; i ++) {

+        fc[i] = 0;

+    }

+    if (m_pDict == NULL) {

+        return;

+    }

+    CPDF_Array* pEntry = m_pDict->GetArray(csEntry);

+    if (pEntry == NULL) {

+        return;

+    }

+    FX_DWORD dwCount = pEntry->GetCount();

+    if (dwCount == 1) {

+        iColorType = COLORTYPE_GRAY;

+        fc[0] = pEntry->GetNumber(0);

+    } else if (dwCount == 3) {

+        iColorType = COLORTYPE_RGB;

+        fc[0] = pEntry->GetNumber(0);

+        fc[1] = pEntry->GetNumber(1);

+        fc[2] = pEntry->GetNumber(2);

+    } else if (dwCount == 4) {

+        iColorType = COLORTYPE_CMYK;

+        fc[0] = pEntry->GetNumber(0);

+        fc[1] = pEntry->GetNumber(1);

+        fc[2] = pEntry->GetNumber(2);

+        fc[3] = pEntry->GetNumber(3);

+    }

+}

+CFX_WideString CPDF_ApSettings::GetCaption(FX_BSTR csEntry)

+{

+    CFX_WideString csCaption;

+    if (m_pDict == NULL) {

+        return csCaption;

+    }

+    return m_pDict->GetUnicodeText(csEntry);

+}

+CPDF_Stream* CPDF_ApSettings::GetIcon(FX_BSTR csEntry)

+{

+    if (m_pDict == NULL) {

+        return NULL;

+    }

+    return m_pDict->GetStream(csEntry);

+}

+CPDF_IconFit CPDF_ApSettings::GetIconFit()

+{

+    if (m_pDict == NULL) {

+        return NULL;

+    }

+    return m_pDict->GetDict(FX_BSTRC("IF"));

+}

+int CPDF_ApSettings::GetTextPosition()

+{

+    if (m_pDict == NULL) {

+        return TEXTPOS_CAPTION;

+    }

+    return m_pDict->GetInteger(FX_BSTRC("TP"), TEXTPOS_CAPTION);

+}

diff --git a/core/src/fpdfdoc/doc_formfield.cpp b/core/src/fpdfdoc/doc_formfield.cpp
new file mode 100644
index 0000000..d84a6b1
--- /dev/null
+++ b/core/src/fpdfdoc/doc_formfield.cpp
@@ -0,0 +1,1095 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+CFX_WideString		GetFullName(CPDF_Dictionary* pFieldDict);

+void				SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);

+FX_BOOL PDF_FormField_IsUnison(CPDF_FormField *pField)

+{

+    FX_BOOL bUnison = FALSE;

+    if (pField->GetType() == CPDF_FormField::CheckBox) {

+        bUnison = TRUE;

+    } else {

+        FX_DWORD dwFlags = pField->GetFieldFlags();

+        bUnison = ((dwFlags & 0x2000000) != 0);

+    }

+    return bUnison;

+}

+CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict)

+{

+    m_pDict = pDict;

+    m_Type = Unknown;

+    m_pForm = pForm;

+    m_pFont = NULL;

+    m_FontSize = 0;

+    SyncFieldFlags();

+}

+CPDF_FormField::~CPDF_FormField()

+{

+}

+void CPDF_FormField::SyncFieldFlags()

+{

+    CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, "FT")->GetString();

+    FX_DWORD flags = FPDF_GetFieldAttr(m_pDict, "Ff")->GetInteger();

+    m_Flags = 0;

+    if (flags & 1) {

+        m_Flags |= FORMFIELD_READONLY;

+    }

+    if (flags & 2) {

+        m_Flags |= FORMFIELD_REQUIRED;

+    }

+    if (flags & 4) {

+        m_Flags |= FORMFIELD_NOEXPORT;

+    }

+    if (type_name == "Btn") {

+        if (flags & 0x8000) {

+            m_Type = RadioButton;

+            if (flags & 0x4000) {

+                m_Flags |= FORMRADIO_NOTOGGLEOFF;

+            }

+            if (flags & 0x2000000) {

+                m_Flags |= FORMRADIO_UNISON;

+            }

+        } else if (flags & 0x10000) {

+            m_Type = PushButton;

+        } else {

+            m_Type = CheckBox;

+        }

+    } else if (type_name == "Tx") {

+        if (flags & 0x100000) {

+            m_Type = File;

+        } else if (flags & 0x2000000) {

+            m_Type = RichText;

+        } else {

+            m_Type = Text;

+            if (flags & 0x1000) {

+                m_Flags |= FORMTEXT_MULTILINE;

+            }

+            if (flags & 0x2000) {

+                m_Flags |= FORMTEXT_PASSWORD;

+            }

+            if (flags & 0x800000) {

+                m_Flags |= FORMTEXT_NOSCROLL;

+            }

+            if (flags & 0x100000) {

+                m_Flags |= FORMTEXT_COMB;

+            }

+        }

+        LoadDA();

+    } else if (type_name == "Ch") {

+        if (flags & 0x20000) {

+            m_Type = ComboBox;

+            if (flags & 0x40000) {

+                m_Flags |= FORMCOMBO_EDIT;

+            }

+        } else {

+            m_Type = ListBox;

+            if (flags & 0x200000) {

+                m_Flags |= FORMLIST_MULTISELECT;

+            }

+        }

+        LoadDA();

+    } else if (type_name == "Sig") {

+        m_Type = Sign;

+    }

+}

+CFX_WideString CPDF_FormField::GetFullName()

+{

+    return ::GetFullName(m_pDict);

+}

+FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify)

+{

+    switch (m_Type) {

+        case CPDF_FormField::CheckBox:

+        case CPDF_FormField::RadioButton: {

+                CFX_ByteArray statusArray;

+                if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                    SaveCheckedFieldStatus(this, statusArray);

+                }

+                int iCount = CountControls();

+                if (iCount) {

+                    if (PDF_FormField_IsUnison(this)) {

+                        for(int i = 0; i < iCount; i++) {

+                            CheckControl(i, GetControl(i)->IsDefaultChecked(), FALSE);

+                        }

+                    } else {

+                        for (int i = 0; i < iCount; i ++) {

+                            CPDF_FormControl* pControl = GetControl(i);

+                            FX_BOOL bChecked = pControl->IsDefaultChecked();

+                            CheckControl(i, bChecked, FALSE);

+                        }

+                    }

+                }

+                if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                    m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);

+                }

+            }

+            break;

+        case CPDF_FormField::ComboBox: {

+                CFX_WideString csValue;

+                ClearSelection();

+                int iIndex = GetDefaultSelectedItem();

+                if (iIndex >= 0) {

+                    csValue = GetOptionLabel(iIndex);

+                }

+                if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                    int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);

+                    if (iRet < 0) {

+                        return FALSE;

+                    }

+                }

+                SetItemSelection(iIndex, TRUE);

+                if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                    m_pForm->m_pFormNotify->AfterValueChange(this);

+                }

+            }

+            break;

+        case CPDF_FormField::ListBox: {

+                CFX_WideString csValue;

+                ClearSelection();

+                int iIndex = GetDefaultSelectedItem();

+                if (iIndex >= 0) {

+                    csValue = GetOptionLabel(iIndex);

+                }

+                if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                    int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);

+                    if (iRet < 0) {

+                        return FALSE;

+                    }

+                }

+                SetItemSelection(iIndex, TRUE);

+                if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                    m_pForm->m_pFormNotify->AfterSelectionChange(this);

+                }

+            }

+            break;

+        case CPDF_FormField::Text:

+        case CPDF_FormField::RichText:

+        case CPDF_FormField::File:

+        default: {

+                CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, "DV");

+                CFX_WideString csDValue;

+                if (pDV != NULL) {

+                    csDValue = pDV->GetUnicodeText();

+                }

+                CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");

+                CFX_WideString csValue;

+                if (pV != NULL) {

+                    csValue = pV->GetUnicodeText();

+                }

+                CPDF_Object* pRV = FPDF_GetFieldAttr(m_pDict, "RV");

+                if (!pRV && (csDValue == csValue)) {

+                    return FALSE;

+                }

+                if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                    int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csDValue);

+                    if (iRet < 0) {

+                        return FALSE;

+                    }

+                }

+                if (pDV == NULL) {

+                    m_pDict->RemoveAt("V");

+                    m_pDict->RemoveAt("RV");

+                } else {

+                    CPDF_Object* pClone = pDV->Clone();

+                    if (pClone == NULL) {

+                        return FALSE;

+                    }

+                    m_pDict->SetAt("V", pClone);

+                    if(pRV) {

+                        CPDF_Object* pCloneR = pDV->Clone();

+                        m_pDict->SetAt("RV", pCloneR);

+                    }

+                }

+                if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                    m_pForm->m_pFormNotify->AfterValueChange(this);

+                }

+                m_pForm->m_bUpdated = TRUE;

+            }

+            break;

+    }

+    return TRUE;

+}

+int CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl)

+{

+    if (pControl == NULL) {

+        return -1;

+    }

+    int iCount = m_ControlList.GetSize();

+    for (int i = 0; i < iCount; i ++) {

+        CPDF_FormControl* pFind = (CPDF_FormControl*)m_ControlList.GetAt(i);

+        if (pFind == pControl) {

+            return i;

+        }

+    }

+    return -1;

+}

+int CPDF_FormField::GetFieldType()

+{

+    switch (m_Type) {

+        case PushButton:

+            return FIELDTYPE_PUSHBUTTON;

+        case CheckBox:

+            return FIELDTYPE_CHECKBOX;

+        case RadioButton:

+            return FIELDTYPE_RADIOBUTTON;

+        case ComboBox:

+            return FIELDTYPE_COMBOBOX;

+        case ListBox:

+            return FIELDTYPE_LISTBOX;

+        case Text:

+        case RichText:

+        case File:

+            return FIELDTYPE_TEXTFIELD;

+        case Sign:

+            return FIELDTYPE_SIGNATURE;

+        default:

+            break;

+    }

+    return FIELDTYPE_UNKNOWN;

+}

+CPDF_AAction CPDF_FormField::GetAdditionalAction()

+{

+    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "AA");

+    if (pObj == NULL) {

+        return NULL;

+    }

+    return pObj->GetDict();

+}

+CFX_WideString CPDF_FormField::GetAlternateName()

+{

+    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TU");

+    if (pObj == NULL) {

+        return L"";

+    }

+    return pObj->GetUnicodeText();

+}

+CFX_WideString CPDF_FormField::GetMappingName()

+{

+    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TM");

+    if (pObj == NULL) {

+        return L"";

+    }

+    return pObj->GetUnicodeText();

+}

+FX_DWORD CPDF_FormField::GetFieldFlags()

+{

+    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "Ff");

+    if (pObj == NULL) {

+        return 0;

+    }

+    return pObj->GetInteger();

+}

+CFX_ByteString CPDF_FormField::GetDefaultStyle()

+{

+    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DS");

+    if (pObj == NULL) {

+        return "";

+    }

+    return pObj->GetString();

+}

+CFX_WideString CPDF_FormField::GetRichTextString()

+{

+    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "RV");

+    if (pObj == NULL) {

+        return L"";

+    }

+    return pObj->GetUnicodeText();

+}

+CFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault)

+{

+    if (GetType() == CheckBox || GetType() == RadioButton) {

+        return GetCheckValue(bDefault);

+    }

+    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V");

+    if (pValue == NULL) {

+        if (!bDefault) {

+            if (m_Type == RichText) {

+                pValue = FPDF_GetFieldAttr(m_pDict, "V");

+            }

+            if (pValue == NULL && m_Type != Text) {

+                pValue = FPDF_GetFieldAttr(m_pDict, "DV");

+            }

+        }

+        if (pValue == NULL) {

+            return CFX_WideString();

+        }

+    }

+    switch (pValue->GetType()) {

+        case PDFOBJ_STRING:

+        case PDFOBJ_STREAM:

+            return pValue->GetUnicodeText();

+        case PDFOBJ_ARRAY:

+            pValue = ((CPDF_Array*)pValue)->GetElementValue(0);

+            return pValue->GetUnicodeText();

+            break;

+    }

+    return CFX_WideString();

+}

+CFX_WideString CPDF_FormField::GetValue()

+{

+    return GetValue(FALSE);

+}

+CFX_WideString CPDF_FormField::GetDefaultValue()

+{

+    return GetValue(TRUE);

+}

+FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify)

+{

+    switch (m_Type) {

+        case CheckBox:

+        case RadioButton: {

+                SetCheckValue(value, bDefault, bNotify);

+                return TRUE;

+            }

+        case File:

+        case RichText:

+        case Text:

+        case ComboBox: {

+                CFX_WideString csValue = value;

+                if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                    int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);

+                    if (iRet < 0) {

+                        return FALSE;

+                    }

+                }

+                int iIndex = FindOptionValue(csValue);

+                if (iIndex < 0) {

+                    CFX_ByteString bsEncodeText = PDF_EncodeText(csValue);

+                    m_pDict->SetAtString(bDefault ? "DV" : "V", bsEncodeText);

+                    if (m_Type == RichText && !bDefault) {

+                        m_pDict->SetAtString("RV", bsEncodeText);

+                    }

+                    m_pDict->RemoveAt("I");

+                } else {

+                    m_pDict->SetAtString(bDefault ? "DV" : "V", PDF_EncodeText(csValue));

+                    if (bDefault) {

+                    } else {

+                        ClearSelection();

+                        SetItemSelection(iIndex, TRUE);

+                    }

+                }

+                if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                    m_pForm->m_pFormNotify->AfterValueChange(this);

+                }

+                m_pForm->m_bUpdated = TRUE;

+            }

+            break;

+        case ListBox: {

+                int iIndex = FindOptionValue(value);

+                if (iIndex < 0) {

+                    return FALSE;

+                }

+                if (bDefault && iIndex == GetDefaultSelectedItem()) {

+                    return FALSE;

+                }

+                if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                    CFX_WideString csValue = value;

+                    int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);

+                    if (iRet < 0) {

+                        return FALSE;

+                    }

+                }

+                if (bDefault) {

+                } else {

+                    ClearSelection();

+                    SetItemSelection(iIndex, TRUE);

+                }

+                if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                    m_pForm->m_pFormNotify->AfterSelectionChange(this);

+                }

+                m_pForm->m_bUpdated = TRUE;

+                break;

+            }

+        default:

+            break;

+    }

+    if (CPDF_InterForm::m_bUpdateAP) {

+        UpdateAP(NULL);

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bNotify)

+{

+    return SetValue(value, FALSE, bNotify);

+}

+int CPDF_FormField::GetMaxLen()

+{

+    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "MaxLen");

+    if (pObj == NULL) {

+        int iCount = m_ControlList.GetSize();

+        for (int i = 0; i < iCount; i ++) {

+            CPDF_FormControl* pControl = (CPDF_FormControl*)m_ControlList.GetAt(i);

+            if (pControl == NULL) {

+                continue;

+            }

+            CPDF_Dictionary* pWidgetDict = pControl->m_pWidgetDict;

+            if (pWidgetDict->KeyExist("MaxLen")) {

+                return pWidgetDict->GetInteger("MaxLen");

+            }

+        }

+        return 0;

+    }

+    return pObj->GetInteger();

+}

+int CPDF_FormField::CountSelectedItems()

+{

+    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");

+    if (pValue == NULL) {

+        pValue = FPDF_GetFieldAttr(m_pDict, "I");

+        if (pValue == NULL) {

+            return 0;

+        }

+    }

+    if (pValue->GetType() == PDFOBJ_STRING) {

+        if (pValue->GetString().IsEmpty()) {

+            return 0;

+        }

+        return 1;

+    }

+    if (pValue->GetType() == PDFOBJ_NUMBER) {

+        if (pValue->GetString().IsEmpty()) {

+            return 0;

+        }

+        return 1;

+    }

+    if (pValue->GetType() != PDFOBJ_ARRAY) {

+        return 0;

+    }

+    return ((CPDF_Array*)pValue)->GetCount();

+}

+int CPDF_FormField::GetSelectedIndex(int index)

+{

+    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");

+    if (pValue == NULL) {

+        pValue = FPDF_GetFieldAttr(m_pDict, "I");

+        if (pValue == NULL) {

+            return -1;

+        }

+    }

+    CFX_WideString sel_value;

+    if (pValue->GetType() == PDFOBJ_STRING) {

+        if (index != 0) {

+            return -1;

+        }

+        sel_value = pValue->GetUnicodeText();

+    } else if (pValue->GetType() == PDFOBJ_NUMBER) {

+        return pValue->GetInteger();

+    } else {

+        if (pValue->GetType() != PDFOBJ_ARRAY) {

+            return -1;

+        }

+        if (index < 0) {

+            return -1;

+        }

+        sel_value = ((CPDF_Array*)pValue)->GetElementValue(index)->GetUnicodeText();

+    }

+    if (index < CountSelectedOptions()) {

+        int iOptIndex = GetSelectedOptionIndex(index);

+        CFX_WideString csOpt = GetOptionValue(iOptIndex);

+        if (csOpt == sel_value) {

+            return iOptIndex;

+        }

+    }

+    int nOpts = CountOptions();

+    for (int i = 0; i < nOpts; i ++) {

+        if (sel_value == GetOptionValue(i)) {

+            return i;

+        }

+    }

+    return -1;

+}

+FX_BOOL CPDF_FormField::ClearSelection(FX_BOOL bNotify)

+{

+    if (bNotify && m_pForm->m_pFormNotify != NULL) {

+        int iRet = 0;

+        CFX_WideString csValue;

+        int iIndex = GetSelectedIndex(0);

+        if (iIndex >= 0) {

+            csValue = GetOptionLabel(iIndex);

+        }

+        if (GetType() == ListBox) {

+            iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);

+        }

+        if (GetType() == ComboBox) {

+            iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);

+        }

+        if (iRet < 0) {

+            return FALSE;

+        }

+    }

+    m_pDict->RemoveAt("V");

+    m_pDict->RemoveAt("I");

+    if (bNotify && m_pForm->m_pFormNotify != NULL) {

+        if (GetType() == ListBox) {

+            m_pForm->m_pFormNotify->AfterSelectionChange(this);

+        }

+        if (GetType() == ComboBox) {

+            m_pForm->m_pFormNotify->AfterValueChange(this);

+        }

+    }

+    if (CPDF_InterForm::m_bUpdateAP) {

+        UpdateAP(NULL);

+    }

+    m_pForm->m_bUpdated = TRUE;

+    return TRUE;

+}

+FX_BOOL CPDF_FormField::IsItemSelected(int index)

+{

+    ASSERT(GetType() == ComboBox || GetType() == ListBox);

+    if (index < 0 || index >= CountOptions()) {

+        return FALSE;

+    }

+    if (IsOptionSelected(index)) {

+        return TRUE;

+    }

+    CFX_WideString opt_value = GetOptionValue(index);

+    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");

+    if (pValue == NULL) {

+        pValue = FPDF_GetFieldAttr(m_pDict, "I");

+        if (pValue == NULL) {

+            return FALSE;

+        }

+    }

+    if (pValue->GetType() == PDFOBJ_STRING) {

+        if (pValue->GetUnicodeText() == opt_value) {

+            return TRUE;

+        }

+        return FALSE;

+    }

+    if (pValue->GetType() == PDFOBJ_NUMBER) {

+        if (pValue->GetString().IsEmpty()) {

+            return FALSE;

+        }

+        if (pValue->GetInteger() == index) {

+            return TRUE;

+        }

+        return FALSE;

+    }

+    if (pValue->GetType() != PDFOBJ_ARRAY) {

+        return FALSE;

+    }

+    CPDF_Array* pArray = (CPDF_Array*)pValue;

+    int iPos = -1;

+    for (int j = 0; j < CountSelectedOptions(); j ++) {

+        if (GetSelectedOptionIndex(j) == index) {

+            iPos = j;

+            break;

+        }

+    }

+    for (FX_DWORD i = 0; i < pArray->GetCount(); i ++)

+        if (pArray->GetElementValue(i)->GetUnicodeText() == opt_value && (int)i == iPos) {

+            return TRUE;

+        }

+    return FALSE;

+}

+FX_BOOL CPDF_FormField::SetItemSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify)

+{

+    ASSERT(GetType() == ComboBox || GetType() == ListBox);

+    if (index < 0 || index >= CountOptions()) {

+        return FALSE;

+    }

+    CFX_WideString opt_value = GetOptionValue(index);

+    if (bNotify && m_pForm->m_pFormNotify != NULL) {

+        int iRet = 0;

+        if (GetType() == ListBox) {

+            iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, opt_value);

+        }

+        if (GetType() == ComboBox) {

+            iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, opt_value);

+        }

+        if (iRet < 0) {

+            return FALSE;

+        }

+    }

+    if (!bSelected) {

+        CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");

+        if (pValue != NULL) {

+            if (m_Type == ListBox) {

+                SelectOption(index, FALSE);

+                if (pValue->GetType() == PDFOBJ_STRING) {

+                    if (pValue->GetUnicodeText() == opt_value) {

+                        m_pDict->RemoveAt("V");

+                    }

+                } else if (pValue->GetType() == PDFOBJ_ARRAY) {

+                    CPDF_Array* pArray = CPDF_Array::Create();

+                    if (pArray == NULL) {

+                        return FALSE;

+                    }

+                    int iCount = CountOptions();

+                    for (int i = 0; i < iCount; i ++) {

+                        if (i != index) {

+                            if (IsItemSelected(i)) {

+                                opt_value = GetOptionValue(i);

+                                pArray->AddString(PDF_EncodeText(opt_value));

+                            }

+                        }

+                    }

+                    if (pArray->GetCount() < 1) {

+                        pArray->Release();

+                    } else {

+                        m_pDict->SetAt("V", pArray);

+                    }

+                }

+            } else if (m_Type == ComboBox) {

+                m_pDict->RemoveAt("V");

+                m_pDict->RemoveAt("I");

+            }

+        }

+    } else {

+        if (m_Type == ListBox) {

+            SelectOption(index, TRUE);

+            if (!(m_Flags & FORMLIST_MULTISELECT)) {

+                m_pDict->SetAtString("V", PDF_EncodeText(opt_value, opt_value.GetLength()));

+            } else {

+                CPDF_Array* pArray = CPDF_Array::Create();

+                if (pArray == NULL) {

+                    return FALSE;

+                }

+                FX_BOOL bSelected;

+                int iCount = CountOptions();

+                for (int i = 0; i < iCount; i ++) {

+                    if (i != index) {

+                        bSelected = IsItemSelected(i);

+                    } else {

+                        bSelected = TRUE;

+                    }

+                    if (bSelected) {

+                        opt_value = GetOptionValue(i);

+                        pArray->AddString(PDF_EncodeText(opt_value));

+                    }

+                }

+                m_pDict->SetAt("V", pArray);

+            }

+        } else if (m_Type == ComboBox) {

+            m_pDict->SetAtString("V", PDF_EncodeText(opt_value, opt_value.GetLength()));

+            CPDF_Array* pI = CPDF_Array::Create();

+            if (pI == NULL) {

+                return FALSE;

+            }

+            pI->AddInteger(index);

+            m_pDict->SetAt("I", pI);

+        }

+    }

+    if (bNotify && m_pForm->m_pFormNotify != NULL) {

+        if (GetType() == ListBox) {

+            m_pForm->m_pFormNotify->AfterSelectionChange(this);

+        }

+        if (GetType() == ComboBox) {

+            m_pForm->m_pFormNotify->AfterValueChange(this);

+        }

+    }

+    if (CPDF_InterForm::m_bUpdateAP) {

+        UpdateAP(NULL);

+    }

+    m_pForm->m_bUpdated = TRUE;

+    return TRUE;

+}

+FX_BOOL CPDF_FormField::IsItemDefaultSelected(int index)

+{

+    ASSERT(GetType() == ComboBox || GetType() == ListBox);

+    if (index < 0 || index >= CountOptions()) {

+        return FALSE;

+    }

+    int iDVIndex = GetDefaultSelectedItem();

+    if (iDVIndex < 0) {

+        return FALSE;

+    }

+    return (iDVIndex == index);

+}

+int CPDF_FormField::GetDefaultSelectedItem()

+{

+    ASSERT(GetType() == ComboBox || GetType() == ListBox);

+    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "DV");

+    if (pValue == NULL) {

+        return -1;

+    }

+    CFX_WideString csDV = pValue->GetUnicodeText();

+    if (csDV.IsEmpty()) {

+        return -1;

+    }

+    int iCount = CountOptions();

+    for (int i = 0; i < iCount; i ++) {

+        if (csDV == GetOptionValue(i)) {

+            return i;

+        }

+    }

+    return -1;

+}

+void CPDF_FormField::UpdateAP(CPDF_FormControl* pControl)

+{

+    if (m_Type == PushButton) {

+        return;

+    }

+    if (m_Type == RadioButton || m_Type == CheckBox) {

+        return;

+    }

+    if (!m_pForm->m_bGenerateAP) {

+        return;

+    }

+    for (int i = 0; i < CountControls(); i ++) {

+        CPDF_FormControl* pControl = GetControl(i);

+        FPDF_GenerateAP(m_pForm->m_pDocument, pControl->m_pWidgetDict);

+    }

+}

+int CPDF_FormField::CountOptions()

+{

+    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");

+    if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) {

+        return 0;

+    }

+    return ((CPDF_Array*)pValue)->GetCount();

+}

+CFX_WideString CPDF_FormField::GetOptionText(int index, int sub_index)

+{

+    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");

+    if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) {

+        return CFX_WideString();

+    }

+    CPDF_Object* pOption = ((CPDF_Array*)pValue)->GetElementValue(index);

+    if (pOption == NULL) {

+        return CFX_WideString();

+    }

+    if (pOption->GetType() == PDFOBJ_ARRAY) {

+        pOption = ((CPDF_Array*)pOption)->GetElementValue(sub_index);

+    }

+    if (pOption == NULL || pOption->GetType() != PDFOBJ_STRING) {

+        return CFX_WideString();

+    }

+    return ((CPDF_String*)pOption)->GetUnicodeText();

+}

+CFX_WideString CPDF_FormField::GetOptionLabel(int index)

+{

+    return GetOptionText(index, 1);

+}

+CFX_WideString CPDF_FormField::GetOptionValue(int index)

+{

+    return GetOptionText(index, 0);

+}

+int CPDF_FormField::FindOption(CFX_WideString csOptLabel)

+{

+    int iCount = CountOptions();

+    for (int i = 0; i < iCount; i ++) {

+        CFX_WideString csValue = GetOptionValue(i);

+        if (csValue == csOptLabel) {

+            return i;

+        }

+    }

+    return -1;

+}

+int CPDF_FormField::FindOptionValue(FX_LPCWSTR csOptValue, int iStartIndex)

+{

+    if (iStartIndex < 0) {

+        iStartIndex = 0;

+    }

+    int iCount = CountOptions();

+    for (; iStartIndex < iCount; iStartIndex ++) {

+        CFX_WideString csValue = GetOptionValue(iStartIndex);

+        if (csValue == csOptValue) {

+            return iStartIndex;

+        }

+    }

+    return -1;

+}

+FX_BOOL CPDF_FormField::CheckControl(int iControlIndex, FX_BOOL bChecked, FX_BOOL bNotify)

+{

+    ASSERT(GetType() == CheckBox || GetType() == RadioButton);

+    CPDF_FormControl* pControl = GetControl(iControlIndex);

+    if (pControl == NULL) {

+        return FALSE;

+    }

+    if (!bChecked && pControl->IsChecked() == bChecked) {

+        return FALSE;

+    }

+    CFX_ByteArray statusArray;

+    if (bNotify && m_pForm->m_pFormNotify != NULL) {

+        SaveCheckedFieldStatus(this, statusArray);

+    }

+    CFX_WideString csWExport =  pControl->GetExportValue();

+    CFX_ByteString csBExport = PDF_EncodeText(csWExport);

+    int iCount = CountControls();

+    FX_BOOL bUnison = PDF_FormField_IsUnison(this);

+    for (int i = 0; i < iCount; i ++) {

+        CPDF_FormControl* pCtrl = GetControl(i);

+        if (bUnison) {

+            CFX_WideString csEValue = pCtrl->GetExportValue();

+            if (csEValue == csWExport) {

+                if (pCtrl->GetOnStateName() == pControl->GetOnStateName()) {

+                    pCtrl->CheckControl(bChecked);

+                } else if (bChecked) {

+                    pCtrl->CheckControl(FALSE);

+                }

+            } else if (bChecked) {

+                pCtrl->CheckControl(FALSE);

+            }

+        } else {

+            if (i == iControlIndex) {

+                pCtrl->CheckControl(bChecked);

+            } else if (bChecked) {

+                pCtrl->CheckControl(FALSE);

+            }

+        }

+    }

+    CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, "Opt");

+    if (pOpt == NULL || pOpt->GetType() != PDFOBJ_ARRAY) {

+        if (bChecked) {

+            m_pDict->SetAtName("V", csBExport);

+        } else {

+            CFX_ByteString csV;

+            CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");

+            if (pV != NULL) {

+                csV = pV->GetString();

+            }

+            if (csV == csBExport) {

+                m_pDict->SetAtName("V", "Off");

+            }

+        }

+    } else if (bChecked) {

+        CFX_ByteString csIndex;

+        csIndex.Format("%d", iControlIndex);

+        m_pDict->SetAtName("V", csIndex);

+    }

+    if (bNotify && m_pForm->m_pFormNotify != NULL) {

+        m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);

+    }

+    m_pForm->m_bUpdated = TRUE;

+    return TRUE;

+}

+CFX_WideString CPDF_FormField::GetCheckValue(FX_BOOL bDefault)

+{

+    ASSERT(GetType() == CheckBox || GetType() == RadioButton);

+    CFX_WideString csExport = L"Off";

+    FX_BOOL bChecked;

+    int iCount = CountControls();

+    for (int i = 0; i < iCount; i ++) {

+        CPDF_FormControl* pControl = GetControl(i);

+        if (bDefault) {

+            bChecked = pControl->IsDefaultChecked();

+        } else {

+            bChecked = pControl->IsChecked();

+        }

+        if (bChecked) {

+            csExport = pControl->GetExportValue();

+            break;

+        }

+    }

+    return csExport;

+}

+FX_BOOL CPDF_FormField::SetCheckValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify)

+{

+    ASSERT(GetType() == CheckBox || GetType() == RadioButton);

+    CFX_ByteArray statusArray;

+    if (bNotify && m_pForm->m_pFormNotify != NULL) {

+        SaveCheckedFieldStatus(this, statusArray);

+    }

+    int iCount = CountControls();

+    for (int i = 0; i < iCount; i ++) {

+        CPDF_FormControl* pControl = GetControl(i);

+        CFX_WideString csExport = pControl->GetExportValue();

+        if (csExport == value) {

+            if (bDefault) {

+            } else {

+                CheckControl(GetControlIndex(pControl), TRUE);

+            }

+            break;

+        } else {

+            if (bDefault) {

+            } else {

+                CheckControl(GetControlIndex(pControl), FALSE);

+            }

+        }

+    }

+    if (bNotify && m_pForm->m_pFormNotify != NULL) {

+        m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);

+    }

+    m_pForm->m_bUpdated = TRUE;

+    return TRUE;

+}

+int CPDF_FormField::GetTopVisibleIndex()

+{

+    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TI");

+    if (pObj == NULL) {

+        return 0;

+    }

+    return pObj->GetInteger();

+}

+int CPDF_FormField::CountSelectedOptions()

+{

+    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");

+    if (pObj == NULL) {

+        return 0;

+    }

+    CPDF_Array* pArray = pObj->GetArray();

+    if (pArray == NULL) {

+        return 0;

+    }

+    return (int)pArray->GetCount();

+}

+int CPDF_FormField::GetSelectedOptionIndex(int index)

+{

+    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");

+    if (pObj == NULL) {

+        return -1;

+    }

+    CPDF_Array* pArray = pObj->GetArray();

+    if (pArray == NULL) {

+        return -1;

+    }

+    int iCount = (int)pArray->GetCount();

+    if (iCount > 0 && index < iCount) {

+        return pArray->GetInteger(index);

+    }

+    return -1;

+}

+FX_BOOL CPDF_FormField::IsOptionSelected(int iOptIndex)

+{

+    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");

+    if (pObj == NULL) {

+        return FALSE;

+    }

+    CPDF_Array* pArray = pObj->GetArray();

+    if (pArray == NULL) {

+        return FALSE;

+    }

+    int iCount = (int)pArray->GetCount();

+    for (int i = 0; i < iCount; i ++) {

+        if (pArray->GetInteger(i) == iOptIndex) {

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_FormField::SelectOption(int iOptIndex, FX_BOOL bSelected, FX_BOOL bNotify)

+{

+    CPDF_Array* pArray = m_pDict->GetArray("I");

+    if (pArray == NULL) {

+        if (!bSelected) {

+            return TRUE;

+        }

+        pArray = CPDF_Array::Create();

+        if (pArray == NULL) {

+            return FALSE;

+        }

+        m_pDict->SetAt("I", pArray);

+    }

+    FX_BOOL bReturn = FALSE;

+    for (int i = 0; i < (int)pArray->GetCount(); i ++) {

+        int iFind = pArray->GetInteger(i);

+        if (iFind == iOptIndex) {

+            if (bSelected) {

+                return TRUE;

+            }

+            if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                int iRet = 0;

+                CFX_WideString csValue = GetOptionLabel(iOptIndex);

+                if (GetType() == ListBox) {

+                    iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);

+                }

+                if (GetType() == ComboBox) {

+                    iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);

+                }

+                if (iRet < 0) {

+                    return FALSE;

+                }

+            }

+            pArray->RemoveAt(i);

+            bReturn = TRUE;

+            break;

+        } else if (iFind > iOptIndex) {

+            if (!bSelected) {

+                continue;

+            }

+            if (bNotify && m_pForm->m_pFormNotify != NULL) {

+                int iRet = 0;

+                CFX_WideString csValue = GetOptionLabel(iOptIndex);

+                if (GetType() == ListBox) {

+                    iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);

+                }

+                if (GetType() == ComboBox) {

+                    iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);

+                }

+                if (iRet < 0) {

+                    return FALSE;

+                }

+            }

+            CPDF_Number* pNum = CPDF_Number::Create(iOptIndex);

+            if (pNum == NULL) {

+                return FALSE;

+            }

+            pArray->InsertAt(i, pNum);

+            bReturn = TRUE;

+            break;

+        }

+    }

+    if (!bReturn) {

+        if (bSelected) {

+            pArray->AddInteger(iOptIndex);

+        }

+        if (pArray->GetCount() == 0) {

+            m_pDict->RemoveAt("I");

+        }

+    }

+    if (bNotify && m_pForm->m_pFormNotify != NULL) {

+        if (GetType() == ListBox) {

+            m_pForm->m_pFormNotify->AfterSelectionChange(this);

+        }

+        if (GetType() == ComboBox) {

+            m_pForm->m_pFormNotify->AfterValueChange(this);

+        }

+    }

+    m_pForm->m_bUpdated = TRUE;

+    return TRUE;

+}

+FX_BOOL CPDF_FormField::ClearSelectedOptions(FX_BOOL bNotify)

+{

+    if (bNotify && m_pForm->m_pFormNotify != NULL) {

+        int iRet = 0;

+        CFX_WideString csValue;

+        int iIndex = GetSelectedIndex(0);

+        if (iIndex >= 0) {

+            csValue = GetOptionLabel(iIndex);

+        }

+        if (GetType() == ListBox) {

+            iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);

+        }

+        if (GetType() == ComboBox) {

+            iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);

+        }

+        if (iRet < 0) {

+            return FALSE;

+        }

+    }

+    m_pDict->RemoveAt("I");

+    if (bNotify && m_pForm->m_pFormNotify != NULL) {

+        if (GetType() == ListBox) {

+            m_pForm->m_pFormNotify->AfterSelectionChange(this);

+        }

+        if (GetType() == ComboBox) {

+            m_pForm->m_pFormNotify->AfterValueChange(this);

+        }

+    }

+    m_pForm->m_bUpdated = TRUE;

+    return TRUE;

+}

+void CPDF_FormField::LoadDA()

+{

+    CFX_ByteString DA = FPDF_GetFieldAttr(m_pDict, "DA")->GetString();

+    if (DA.IsEmpty()) {

+        DA = m_pForm->m_pFormDict->GetString("DA");

+    }

+    if (DA.IsEmpty()) {

+        return;

+    }

+    CPDF_SimpleParser syntax(DA);

+    syntax.FindTagParam("Tf", 2);

+    CFX_ByteString font_name = syntax.GetWord();

+    CPDF_Dictionary* pFontDict = m_pForm->m_pFormDict->GetDict("DR")->GetDict("Font")->GetDict(font_name);

+    if (pFontDict == NULL) {

+        return;

+    }

+    m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict);

+    m_FontSize = FX_atof(syntax.GetWord());

+}

diff --git a/core/src/fpdfdoc/doc_link.cpp b/core/src/fpdfdoc/doc_link.cpp
new file mode 100644
index 0000000..4c8fda7
--- /dev/null
+++ b/core/src/fpdfdoc/doc_link.cpp
@@ -0,0 +1,105 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+CPDF_LinkList::~CPDF_LinkList()

+{

+    FX_POSITION pos = m_PageMap.GetStartPosition();

+    while (pos) {

+        FX_LPVOID key, value;

+        m_PageMap.GetNextAssoc(pos, key, value);

+        delete (CFX_PtrArray*)value;

+    }

+}

+CFX_PtrArray* CPDF_LinkList::GetPageLinks(CPDF_Page* pPage)

+{

+    FX_DWORD objnum = pPage->m_pFormDict->GetObjNum();

+    if (objnum == 0) {

+        return NULL;

+    }

+    CFX_PtrArray* pPageLinkList = NULL;

+    if (!m_PageMap.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pPageLinkList)) {

+        pPageLinkList = FX_NEW CFX_PtrArray;

+        if (pPageLinkList == NULL) {

+            return NULL;

+        }

+        m_PageMap.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pPageLinkList);

+        LoadPageLinks(pPage, pPageLinkList);

+    }

+    return pPageLinkList;

+}

+int CPDF_LinkList::CountLinks(CPDF_Page* pPage)

+{

+    CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);

+    if (pPageLinkList == NULL) {

+        return 0;

+    }

+    return pPageLinkList->GetSize();

+}

+CPDF_Link CPDF_LinkList::GetLink(CPDF_Page* pPage, int index)

+{

+    CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);

+    if (pPageLinkList == NULL) {

+        return NULL;

+    }

+    return (CPDF_Dictionary*)pPageLinkList->GetAt(index);

+}

+CPDF_Link CPDF_LinkList::GetLinkAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y)

+{

+    CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);

+    if (pPageLinkList == NULL) {

+        return NULL;

+    }

+    int size = pPageLinkList->GetSize();

+    for (int i = 0; i < size; i ++) {

+        CPDF_Link Link = (CPDF_Dictionary*)pPageLinkList->GetAt(i);

+        CPDF_Rect rect = Link.GetRect();

+        if (rect.Contains(pdf_x, pdf_y)) {

+            return Link;

+        }

+    }

+    return NULL;

+}

+void CPDF_LinkList::LoadPageLinks(CPDF_Page* pPage, CFX_PtrArray* pList)

+{

+    CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");

+    if (pAnnotList == NULL) {

+        return;

+    }

+    for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {

+        CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);

+        if (pAnnot == NULL) {

+            continue;

+        }

+        if (pAnnot->GetString("Subtype") != "Link") {

+            continue;

+        }

+        pList->Add(pAnnot);

+    }

+}

+CPDF_Rect CPDF_Link::GetRect()

+{

+    return m_pDict->GetRect("Rect");

+}

+CPDF_Dest CPDF_Link::GetDest(CPDF_Document* pDoc)

+{

+    CPDF_Object* pDest = m_pDict->GetElementValue("Dest");

+    if (pDest == NULL) {

+        return NULL;

+    }

+    if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {

+        CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));

+        CFX_ByteStringC name = pDest->GetString();

+        return name_tree.LookupNamedDest(pDoc, name);

+    } else if (pDest->GetType() == PDFOBJ_ARRAY) {

+        return (CPDF_Array*)pDest;

+    }

+    return NULL;

+}

+CPDF_Action CPDF_Link::GetAction()

+{

+    return m_pDict->GetDict("A");

+}

diff --git a/core/src/fpdfdoc/doc_metadata.cpp b/core/src/fpdfdoc/doc_metadata.cpp
new file mode 100644
index 0000000..e3ac9e3
--- /dev/null
+++ b/core/src/fpdfdoc/doc_metadata.cpp
@@ -0,0 +1,152 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+#include "../../include/fxcrt/fx_xml.h"

+typedef struct _PDFDOC_METADATA {

+    CPDF_Document *m_pDoc;

+    CXML_Element *m_pXmlElmnt;

+    CXML_Element *m_pElmntRdf;

+    CFX_CMapByteStringToPtr *m_pStringMap;

+} PDFDOC_METADATA, * PDFDOC_LPMETADATA;

+typedef PDFDOC_METADATA const * PDFDOC_LPCMETADATA;

+const FX_LPCSTR gs_FPDFDOC_Metadata_Titles[] = {

+    "Title", "title",

+    "Subject", "description",

+    "Author", "creator",

+    "Keywords", "Keywords",

+    "Producer", "Producer",

+    "Creator", "CreatorTool",

+    "CreationDate", "CreateDate",

+    "ModDate", "ModifyDate",

+    "MetadataDate", "MetadataDate"

+};

+CPDF_Metadata::CPDF_Metadata()

+{

+    m_pData = FX_Alloc(PDFDOC_METADATA, 1);

+    FXSYS_memset32(m_pData, 0, sizeof(PDFDOC_METADATA));

+    CFX_CMapByteStringToPtr *&pStringMap = ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;

+    pStringMap = FX_NEW(CFX_CMapByteStringToPtr);

+    if (pStringMap != NULL) {

+        CFX_ByteString bstr;

+        for (int i = 0; i < 18; i += 2) {

+            bstr = gs_FPDFDOC_Metadata_Titles[i];

+            pStringMap->AddValue(bstr, (void*)gs_FPDFDOC_Metadata_Titles[i + 1]);

+        }

+    }

+}

+CPDF_Metadata::~CPDF_Metadata()

+{

+    FXSYS_assert(m_pData != NULL);

+    CXML_Element *&p = ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;

+    if (p) {

+        delete p;

+    }

+    CFX_CMapByteStringToPtr *pStringMap = ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;

+    if (pStringMap) {

+        pStringMap->RemoveAll();

+        FX_Free(pStringMap);

+    }

+    FX_Free(m_pData);

+}

+void CPDF_Metadata::LoadDoc(CPDF_Document *pDoc)

+{

+    FXSYS_assert(pDoc != NULL);

+    ((PDFDOC_LPMETADATA)m_pData)->m_pDoc = pDoc;

+    CPDF_Dictionary *pRoot = pDoc->GetRoot();

+    CPDF_Stream *pStream = pRoot->GetStream(FX_BSTRC("Metadata"));

+    if (!pStream) {

+        return;

+    }

+    CPDF_StreamAcc acc;

+    acc.LoadAllData(pStream, FALSE);

+    int size = acc.GetSize();

+    FX_LPCBYTE pBuf = acc.GetData();

+    CXML_Element *&pXmlElmnt = ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;

+    pXmlElmnt = CXML_Element::Parse(pBuf, size);

+    if (!pXmlElmnt) {

+        return;

+    }

+    CXML_Element *&pElmntRdf = ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;

+    if (pXmlElmnt->GetTagName() == FX_BSTRC("RDF")) {

+        pElmntRdf = pXmlElmnt;

+    } else {

+        pElmntRdf = pXmlElmnt->GetElement(NULL, FX_BSTRC("RDF"));

+    }

+}

+FX_INT32 CPDF_Metadata::GetString(FX_BSTR bsItem, CFX_WideString &wsStr)

+{

+    if (!((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt) {

+        return -1;

+    }

+    if (!((PDFDOC_LPMETADATA)m_pData)->m_pStringMap) {

+        return -1;

+    }

+    void *szTag;

+    if (!((PDFDOC_LPMETADATA)m_pData)->m_pStringMap->Lookup(bsItem, szTag)) {

+        return -1;

+    }

+    CFX_ByteString bsTag = (FX_LPCSTR)szTag;

+    wsStr = L"";

+    CXML_Element *pElmntRdf = ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;

+    if (!pElmntRdf) {

+        return -1;

+    }

+    int nChild = pElmntRdf->CountChildren();

+    for (int i = 0; i < nChild; i++) {

+        CXML_Element *pTag = pElmntRdf->GetElement(NULL, FX_BSTRC("Description"), i);

+        if (!pTag) {

+            continue;

+        }

+        if (bsItem == FX_BSTRC("Title") || bsItem == FX_BSTRC("Subject")) {

+            CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);

+            if (!pElmnt) {

+                continue;

+            }

+            pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("Alt"));

+            if (!pElmnt) {

+                continue;

+            }

+            pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("li"));

+            if (!pElmnt) {

+                continue;

+            }

+            wsStr = pElmnt->GetContent(0);

+            return wsStr.GetLength();

+        } else if (bsItem == FX_BSTRC("Author")) {

+            CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);

+            if (!pElmnt) {

+                continue;

+            }

+            pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("Seq"));

+            if (!pElmnt) {

+                continue;

+            }

+            pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("li"));

+            if (!pElmnt) {

+                continue;

+            }

+            wsStr = pElmnt->GetContent(0);

+            return wsStr.GetLength();

+        } else {

+            CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);

+            if (!pElmnt) {

+                continue;

+            }

+            wsStr = pElmnt->GetContent(0);

+            return wsStr.GetLength();

+        }

+    }

+    return -1;

+}

+CXML_Element* CPDF_Metadata::GetRoot() const

+{

+    return ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;

+}

+CXML_Element* CPDF_Metadata::GetRDF() const

+{

+    return ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;

+}

diff --git a/core/src/fpdfdoc/doc_ocg.cpp b/core/src/fpdfdoc/doc_ocg.cpp
new file mode 100644
index 0000000..39b8e37
--- /dev/null
+++ b/core/src/fpdfdoc/doc_ocg.cpp
@@ -0,0 +1,300 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+static FX_INT32 FPDFDOC_OCG_FindGroup(const CPDF_Object *pObject, const CPDF_Dictionary *pGroupDict)

+{

+    if (pObject == NULL || pGroupDict == NULL) {

+        return -1;

+    }

+    FX_INT32 iType = pObject->GetType();

+    if (iType == PDFOBJ_ARRAY) {

+        FX_DWORD dwCount = ((CPDF_Array*)pObject)->GetCount();

+        for (FX_DWORD i = 0; i < dwCount; i++) {

+            if (((CPDF_Array*)pObject)->GetDict(i) == pGroupDict) {

+                return i;

+            }

+        }

+        return -1;

+    }

+    if (pObject->GetDict() == pGroupDict) {

+        return 0;

+    }

+    return -1;

+}

+static FX_BOOL FPDFDOC_OCG_HasIntent(const CPDF_Dictionary *pDict, FX_BSTR csElement, FX_BSTR csDef = FX_BSTRC(""))

+{

+    FXSYS_assert(pDict != NULL);

+    CPDF_Object *pIntent = pDict->GetElementValue(FX_BSTRC("Intent"));

+    if (pIntent == NULL) {

+        return csElement == csDef;

+    }

+    CFX_ByteString bsIntent;

+    if (pIntent->GetType() == PDFOBJ_ARRAY) {

+        FX_DWORD dwCount = ((CPDF_Array*)pIntent)->GetCount();

+        for (FX_DWORD i = 0; i < dwCount; i++) {

+            bsIntent = ((CPDF_Array*)pIntent)->GetString(i);

+            if (bsIntent == FX_BSTRC("All") || bsIntent == csElement) {

+                return TRUE;

+            }

+        }

+        return FALSE;

+    }

+    bsIntent = pIntent->GetString();

+    return bsIntent == FX_BSTRC("All") || bsIntent == csElement;

+}

+static CPDF_Dictionary* FPDFDOC_OCG_GetConfig(CPDF_Document *pDoc, const CPDF_Dictionary *pOCGDict, FX_BSTR bsState)

+{

+    FXSYS_assert(pDoc && pOCGDict);

+    CPDF_Dictionary *pOCProperties = pDoc->GetRoot()->GetDict(FX_BSTRC("OCProperties"));

+    if (!pOCProperties) {

+        return NULL;

+    }

+    CPDF_Array *pOCGs = pOCProperties->GetArray(FX_BSTRC("OCGs"));

+    if (!pOCGs) {

+        return NULL;

+    }

+    if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) {

+        return NULL;

+    }

+    CPDF_Dictionary *pConfig = pOCProperties->GetDict(FX_BSTRC("D"));

+    CPDF_Array *pConfigs = pOCProperties->GetArray(FX_BSTRC("Configs"));

+    if (pConfigs) {

+        CPDF_Dictionary *pFind;

+        FX_INT32 iCount = pConfigs->GetCount();

+        for (FX_INT32 i = 0; i < iCount; i ++) {

+            pFind = pConfigs->GetDict(i);

+            if (!pFind) {

+                continue;

+            }

+            if (!FPDFDOC_OCG_HasIntent(pFind, FX_BSTRC("View"), FX_BSTRC("View"))) {

+                continue;

+            }

+            pConfig = pFind;

+            break;

+        }

+    }

+    return pConfig;

+}

+static CFX_ByteString FPDFDOC_OCG_GetUsageTypeString(CPDF_OCContext::UsageType eType)

+{

+    CFX_ByteString csState = FX_BSTRC("View");

+    if (eType == CPDF_OCContext::Design) {

+        csState = FX_BSTRC("Design");

+    } else if (eType == CPDF_OCContext::Print) {

+        csState = FX_BSTRC("Print");

+    } else if (eType == CPDF_OCContext::Export) {

+        csState = FX_BSTRC("Export");

+    }

+    return csState;

+}

+CPDF_OCContext::CPDF_OCContext(CPDF_Document *pDoc, UsageType eUsageType)

+{

+    FXSYS_assert(pDoc != NULL);

+    m_pDocument = pDoc;

+    m_eUsageType = eUsageType;

+}

+CPDF_OCContext::~CPDF_OCContext()

+{

+    m_OCGStates.RemoveAll();

+}

+FX_BOOL CPDF_OCContext::LoadOCGStateFromConfig(FX_BSTR csConfig, const CPDF_Dictionary *pOCGDict, FX_BOOL &bValidConfig) const

+{

+    CPDF_Dictionary *pConfig = FPDFDOC_OCG_GetConfig(m_pDocument, pOCGDict, csConfig);

+    if (!pConfig) {

+        return TRUE;

+    }

+    bValidConfig = TRUE;

+    FX_BOOL bState = pConfig->GetString(FX_BSTRC("BaseState"), FX_BSTRC("ON")) != FX_BSTRC("OFF");

+    CPDF_Array *pArray = pConfig->GetArray(FX_BSTRC("ON"));

+    if (pArray) {

+        if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) {

+            bState = TRUE;

+        }

+    }

+    pArray = pConfig->GetArray(FX_BSTRC("OFF"));

+    if (pArray) {

+        if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) {

+            bState = FALSE;

+        }

+    }

+    pArray = pConfig->GetArray(FX_BSTRC("AS"));

+    if (pArray) {

+        CFX_ByteString csFind = csConfig + FX_BSTRC("State");

+        FX_INT32 iCount = pArray->GetCount();

+        for (FX_INT32 i = 0; i < iCount; i ++) {

+            CPDF_Dictionary *pUsage = pArray->GetDict(i);

+            if (!pUsage) {

+                continue;

+            }

+            if (pUsage->GetString(FX_BSTRC("Event"), FX_BSTRC("View")) != csConfig) {

+                continue;

+            }

+            CPDF_Array *pOCGs = pUsage->GetArray(FX_BSTRC("OCGs"));

+            if (!pOCGs) {

+                continue;

+            }

+            if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) {

+                continue;

+            }

+            CPDF_Dictionary *pState = pUsage->GetDict(csConfig);

+            if (!pState) {

+                continue;

+            }

+            bState = pState->GetString(csFind) != FX_BSTRC("OFF");

+        }

+    }

+    return bState;

+}

+FX_BOOL CPDF_OCContext::LoadOCGState(const CPDF_Dictionary *pOCGDict) const

+{

+    if (!FPDFDOC_OCG_HasIntent(pOCGDict, FX_BSTRC("View"), FX_BSTRC("View"))) {

+        return TRUE;

+    }

+    CFX_ByteString csState = FPDFDOC_OCG_GetUsageTypeString(m_eUsageType);

+    CPDF_Dictionary *pUsage = pOCGDict->GetDict(FX_BSTRC("Usage"));

+    if (pUsage) {

+        CPDF_Dictionary *pState = pUsage->GetDict(csState);

+        if (pState) {

+            CFX_ByteString csFind = csState + FX_BSTRC("State");

+            if (pState->KeyExist(csFind)) {

+                return pState->GetString(csFind) != FX_BSTRC("OFF");

+            }

+        }

+        if (csState != FX_BSTRC("View")) {

+            pState = pUsage->GetDict(FX_BSTRC("View"));

+            if (pState && pState->KeyExist(FX_BSTRC("ViewState"))) {

+                return pState->GetString(FX_BSTRC("ViewState")) != FX_BSTRC("OFF");

+            }

+        }

+    }

+    FX_BOOL bDefValid = FALSE;

+    return LoadOCGStateFromConfig(csState, pOCGDict, bDefValid);

+}

+FX_BOOL CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary *pOCGDict)

+{

+    if (!pOCGDict) {

+        return FALSE;

+    }

+    FX_LPVOID bState = NULL;

+    if (m_OCGStates.Lookup(pOCGDict, bState)) {

+        return (FX_UINTPTR)bState != 0;

+    }

+    bState = (FX_LPVOID)(FX_UINTPTR)LoadOCGState(pOCGDict);

+    m_OCGStates.SetAt(pOCGDict, bState);

+    return (FX_UINTPTR)bState != 0;

+}

+FX_BOOL CPDF_OCContext::GetOCGVE(CPDF_Array *pExpression, FX_BOOL bFromConfig, int nLevel)

+{

+    if (nLevel > 32) {

+        return FALSE;

+    }

+    if (pExpression == NULL) {

+        return FALSE;

+    }

+    FX_INT32 iCount = pExpression->GetCount();

+    CPDF_Object *pOCGObj;

+    CFX_ByteString csOperator = pExpression->GetString(0);

+    if (csOperator == FX_BSTRC("Not")) {

+        pOCGObj = pExpression->GetElementValue(1);

+        if (pOCGObj == NULL) {

+            return FALSE;

+        }

+        if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {

+            return !(bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj));

+        } else if (pOCGObj->GetType() == PDFOBJ_ARRAY) {

+            return !GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1);

+        } else {

+            return FALSE;

+        }

+    }

+    if (csOperator == FX_BSTRC("Or") || csOperator == FX_BSTRC("And")) {

+        FX_BOOL bValue = FALSE;

+        for (FX_INT32 i = 1; i < iCount; i ++) {

+            pOCGObj = pExpression->GetElementValue(1);

+            if (pOCGObj == NULL) {

+                continue;

+            }

+            FX_BOOL bItem = FALSE;

+            if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {

+                bItem = bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj);

+            } else if (pOCGObj->GetType() == PDFOBJ_ARRAY) {

+                bItem = GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1);

+            }

+            if (i == 1) {

+                bValue = bItem;

+            } else {

+                if (csOperator == FX_BSTRC("Or")) {

+                    bValue = bValue || bItem;

+                } else {

+                    bValue = bValue && bItem;

+                }

+            }

+        }

+        return bValue;

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary *pOCMDDict, FX_BOOL bFromConfig)

+{

+    FXSYS_assert(pOCMDDict != NULL);

+    CPDF_Array *pVE = pOCMDDict->GetArray(FX_BSTRC("VE"));

+    if (pVE != NULL) {

+        return GetOCGVE(pVE, bFromConfig);

+    }

+    CFX_ByteString csP = pOCMDDict->GetString(FX_BSTRC("P"), FX_BSTRC("AnyOn"));

+    CPDF_Object *pOCGObj = pOCMDDict->GetElementValue(FX_BSTRC("OCGs"));

+    if (pOCGObj == NULL) {

+        return TRUE;

+    }

+    if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {

+        return bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj);

+    }

+    if (pOCGObj->GetType() != PDFOBJ_ARRAY) {

+        return TRUE;

+    }

+    FX_BOOL bState = FALSE;

+    if (csP == FX_BSTRC("AllOn") || csP == FX_BSTRC("AllOff")) {

+        bState = TRUE;

+    }

+    FX_INT32 iCount = ((CPDF_Array*)pOCGObj)->GetCount();

+    for (FX_INT32 i = 0; i < iCount; i ++) {

+        FX_BOOL bItem = TRUE;

+        CPDF_Dictionary* pItemDict = ((CPDF_Array*)pOCGObj)->GetDict(i);

+        if (pItemDict) {

+            bItem = bFromConfig ? LoadOCGState(pItemDict) : GetOCGVisible(pItemDict);

+        }

+        if (csP == FX_BSTRC("AnyOn") && bItem) {

+            return TRUE;

+        }

+        if (csP == FX_BSTRC("AnyOff") && !bItem) {

+            return TRUE;

+        }

+        if (csP == FX_BSTRC("AllOn") && !bItem) {

+            return FALSE;

+        }

+        if (csP == FX_BSTRC("AllOff") && bItem) {

+            return FALSE;

+        }

+    }

+    return bState;

+}

+FX_BOOL CPDF_OCContext::CheckOCGVisible(const CPDF_Dictionary *pOCGDict)

+{

+    if (pOCGDict == NULL) {

+        return TRUE;

+    }

+    CFX_ByteString csType = pOCGDict->GetString(FX_BSTRC("Type"), FX_BSTRC("OCG"));

+    if (csType == FX_BSTRC("OCG")) {

+        return GetOCGVisible(pOCGDict);

+    } else {

+        return LoadOCMDState(pOCGDict, FALSE);

+    }

+}

+void CPDF_OCContext::ResetOCContext()

+{

+    m_OCGStates.RemoveAll();

+}

diff --git a/core/src/fpdfdoc/doc_tagged.cpp b/core/src/fpdfdoc/doc_tagged.cpp
new file mode 100644
index 0000000..95ae8d5
--- /dev/null
+++ b/core/src/fpdfdoc/doc_tagged.cpp
@@ -0,0 +1,448 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfapi/fpdf_parser.h"

+#include "../../include/fpdfapi/fpdf_page.h"

+#include "../../include/fpdfdoc/fpdf_tagged.h"

+#include "tagged_int.h"

+const int nMaxRecursion = 32;

+static FX_BOOL IsTagged(const CPDF_Document* pDoc)

+{

+    CPDF_Dictionary* pCatalog = pDoc->GetRoot();

+    CPDF_Dictionary* pMarkInfo = pCatalog->GetDict(FX_BSTRC("MarkInfo"));

+    return pMarkInfo != NULL && pMarkInfo->GetInteger(FX_BSTRC("Marked"));

+}

+CPDF_StructTree* CPDF_StructTree::LoadPage(const CPDF_Document* pDoc, const CPDF_Dictionary* pPageDict)

+{

+    if (!IsTagged(pDoc)) {

+        return NULL;

+    }

+    CPDF_StructTreeImpl* pTree = FX_NEW CPDF_StructTreeImpl(pDoc);

+    if (pTree == NULL) {

+        return NULL;

+    }

+    pTree->LoadPageTree(pPageDict);

+    return pTree;

+}

+CPDF_StructTree* CPDF_StructTree::LoadDoc(const CPDF_Document* pDoc)

+{

+    if (!IsTagged(pDoc)) {

+        return NULL;

+    }

+    CPDF_StructTreeImpl* pTree = FX_NEW CPDF_StructTreeImpl(pDoc);

+    if (pTree == NULL) {

+        return NULL;

+    }

+    pTree->LoadDocTree();

+    return pTree;

+}

+CPDF_StructTreeImpl::CPDF_StructTreeImpl(const CPDF_Document* pDoc)

+{

+    CPDF_Dictionary* pCatalog = pDoc->GetRoot();

+    m_pTreeRoot = pCatalog->GetDict(FX_BSTRC("StructTreeRoot"));

+    if (m_pTreeRoot == NULL) {

+        return;

+    }

+    m_pRoleMap = m_pTreeRoot->GetDict(FX_BSTRC("RoleMap"));

+}

+CPDF_StructTreeImpl::~CPDF_StructTreeImpl()

+{

+    for (int i = 0; i < m_Kids.GetSize(); i ++)

+        if (m_Kids[i]) {

+            m_Kids[i]->Release();

+        }

+}

+void CPDF_StructTreeImpl::LoadDocTree()

+{

+    m_pPage = NULL;

+    if (m_pTreeRoot == NULL) {

+        return;

+    }

+    CPDF_Object* pKids = m_pTreeRoot->GetElementValue(FX_BSTRC("K"));

+    if (pKids == NULL) {

+        return;

+    }

+    if (pKids->GetType() == PDFOBJ_DICTIONARY) {

+        CPDF_StructElementImpl* pStructElementImpl = FX_NEW CPDF_StructElementImpl(this, NULL, (CPDF_Dictionary*)pKids);

+        if (pStructElementImpl == NULL) {

+            return;

+        }

+        m_Kids.Add(pStructElementImpl);

+        return;

+    }

+    if (pKids->GetType() != PDFOBJ_ARRAY) {

+        return;

+    }

+    CPDF_Array* pArray = (CPDF_Array*)pKids;

+    for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {

+        CPDF_Dictionary* pKid = pArray->GetDict(i);

+        CPDF_StructElementImpl* pStructElementImpl = FX_NEW CPDF_StructElementImpl(this, NULL, pKid);

+        if (pStructElementImpl == NULL) {

+            return;

+        }

+        m_Kids.Add(pStructElementImpl);

+    }

+}

+void CPDF_StructTreeImpl::LoadPageTree(const CPDF_Dictionary* pPageDict)

+{

+    m_pPage = pPageDict;

+    if (m_pTreeRoot == NULL) {

+        return;

+    }

+    CPDF_Object* pKids = m_pTreeRoot->GetElementValue(FX_BSTRC("K"));

+    if (pKids == NULL) {

+        return;

+    }

+    FX_DWORD dwKids = 0;

+    if (pKids->GetType() == PDFOBJ_DICTIONARY) {

+        dwKids = 1;

+    } else if (pKids->GetType() == PDFOBJ_ARRAY) {

+        dwKids = ((CPDF_Array*)pKids)->GetCount();

+    } else {

+        return;

+    }

+    FX_DWORD i;

+    m_Kids.SetSize(dwKids);

+    for (i = 0; i < dwKids; i ++) {

+        m_Kids[i] = NULL;

+    }

+    CFX_MapPtrToPtr element_map;

+    CPDF_Dictionary* pParentTree = m_pTreeRoot->GetDict(FX_BSTRC("ParentTree"));

+    if (pParentTree == NULL) {

+        return;

+    }

+    CPDF_NumberTree parent_tree(pParentTree);

+    int parents_id = pPageDict->GetInteger(FX_BSTRC("StructParents"), -1);

+    if (parents_id >= 0) {

+        CPDF_Object* pParents = parent_tree.LookupValue(parents_id);

+        if (pParents == NULL || pParents->GetType() != PDFOBJ_ARRAY) {

+            return;

+        }

+        CPDF_Array* pParentArray = (CPDF_Array*)pParents;

+        for (i = 0; i < pParentArray->GetCount(); i ++) {

+            CPDF_Dictionary* pParent = pParentArray->GetDict(i);

+            if (pParent == NULL) {

+                continue;

+            }

+            AddPageNode(pParent, element_map);

+        }

+    }

+}

+CPDF_StructElementImpl* CPDF_StructTreeImpl::AddPageNode(CPDF_Dictionary* pDict, CFX_MapPtrToPtr& map, int nLevel)

+{

+    if (nLevel > nMaxRecursion) {

+        return NULL;

+    }

+    CPDF_StructElementImpl* pElement = NULL;

+    if (map.Lookup(pDict, (FX_LPVOID&)pElement)) {

+        return pElement;

+    }

+    pElement = FX_NEW CPDF_StructElementImpl(this, NULL, pDict);

+    if (pElement == NULL) {

+        return NULL;

+    }

+    map.SetAt(pDict, pElement);

+    CPDF_Dictionary* pParent = pDict->GetDict(FX_BSTRC("P"));

+    if (pParent == NULL || pParent->GetString(FX_BSTRC("Type")) == FX_BSTRC("StructTreeRoot")) {

+        if (!AddTopLevelNode(pDict, pElement)) {

+            pElement->Release();

+            map.RemoveKey(pDict);

+        }

+    } else {

+        CPDF_StructElementImpl* pParentElement = AddPageNode(pParent, map, nLevel + 1);

+        FX_BOOL bSave = FALSE;

+        for (int i = 0; i < pParentElement->m_Kids.GetSize(); i ++) {

+            if (pParentElement->m_Kids[i].m_Type != CPDF_StructKid::Element) {

+                continue;

+            }

+            if (pParentElement->m_Kids[i].m_Element.m_pDict != pDict) {

+                continue;

+            }

+            pParentElement->m_Kids[i].m_Element.m_pElement = pElement->Retain();

+            bSave = TRUE;

+        }

+        if (!bSave) {

+            pElement->Release();

+            map.RemoveKey(pDict);

+        }

+    }

+    return pElement;

+}

+FX_BOOL CPDF_StructTreeImpl::AddTopLevelNode(CPDF_Dictionary* pDict, CPDF_StructElementImpl* pElement)

+{

+    CPDF_Object *pObj = m_pTreeRoot->GetElementValue(FX_BSTRC("K"));

+    if (!pObj) {

+        return FALSE;

+    }

+    if (pObj->GetType() == PDFOBJ_DICTIONARY) {

+        if (pObj->GetObjNum() == pDict->GetObjNum()) {

+            if (m_Kids[0]) {

+                m_Kids[0]->Release();

+            }

+            m_Kids[0] = pElement->Retain();

+        } else {

+            return FALSE;

+        }

+    }

+    if (pObj->GetType() == PDFOBJ_ARRAY) {

+        CPDF_Array* pTopKids = (CPDF_Array*)pObj;

+        FX_DWORD i;

+        FX_BOOL bSave = FALSE;

+        for (i = 0; i < pTopKids->GetCount(); i ++) {

+            CPDF_Reference* pKidRef = (CPDF_Reference*)pTopKids->GetElement(i);

+            if (pKidRef->GetType() != PDFOBJ_REFERENCE || pKidRef->GetRefObjNum() != pDict->GetObjNum()) {

+                continue;

+            }

+            if (m_Kids[i]) {

+                m_Kids[i]->Release();

+            }

+            m_Kids[i] = pElement->Retain();

+            bSave = TRUE;

+        }

+        if (!bSave) {

+            return FALSE;

+        }

+    }

+    return TRUE;

+}

+CPDF_StructElementImpl::CPDF_StructElementImpl(CPDF_StructTreeImpl* pTree, CPDF_StructElementImpl* pParent, CPDF_Dictionary* pDict)

+    : m_RefCount(0)

+{

+    m_pTree = pTree;

+    m_pDict = pDict;

+    m_Type = pDict->GetString(FX_BSTRC("S"));

+    CFX_ByteString mapped = pTree->m_pRoleMap->GetString(m_Type);

+    if (!mapped.IsEmpty()) {

+        m_Type = mapped;

+    }

+    m_pParent = pParent;

+    LoadKids(pDict);

+}

+CPDF_StructElementImpl::~CPDF_StructElementImpl()

+{

+    for (int i = 0; i < m_Kids.GetSize(); i ++) {

+        if (m_Kids[i].m_Type == CPDF_StructKid::Element && m_Kids[i].m_Element.m_pElement) {

+            ((CPDF_StructElementImpl*)m_Kids[i].m_Element.m_pElement)->Release();

+        }

+    }

+}

+CPDF_StructElementImpl* CPDF_StructElementImpl::Retain()

+{

+    m_RefCount++;

+    return this;

+}

+void CPDF_StructElementImpl::Release()

+{

+    if(--m_RefCount < 1) {

+        delete this;

+    }

+}

+void CPDF_StructElementImpl::LoadKids(CPDF_Dictionary* pDict)

+{

+    CPDF_Object* pObj = pDict->GetElement(FX_BSTRC("Pg"));

+    FX_DWORD PageObjNum = 0;

+    if (pObj && pObj->GetType() == PDFOBJ_REFERENCE) {

+        PageObjNum = ((CPDF_Reference*)pObj)->GetRefObjNum();

+    }

+    CPDF_Object* pKids = pDict->GetElementValue(FX_BSTRC("K"));

+    if (pKids == NULL) {

+        return;

+    }

+    if (pKids->GetType() == PDFOBJ_ARRAY) {

+        CPDF_Array* pArray = (CPDF_Array*)pKids;

+        m_Kids.SetSize(pArray->GetCount());

+        for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {

+            CPDF_Object* pKid = pArray->GetElementValue(i);

+            LoadKid(PageObjNum, pKid, &m_Kids[i]);

+        }

+    } else {

+        m_Kids.SetSize(1);

+        LoadKid(PageObjNum, pKids, &m_Kids[0]);

+    }

+}

+void CPDF_StructElementImpl::LoadKid(FX_DWORD PageObjNum, CPDF_Object* pKidObj, CPDF_StructKid* pKid)

+{

+    pKid->m_Type = CPDF_StructKid::Invalid;

+    if (pKidObj == NULL) {

+        return;

+    }

+    if (pKidObj->GetType() == PDFOBJ_NUMBER) {

+        if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {

+            return;

+        }

+        pKid->m_Type = CPDF_StructKid::PageContent;

+        pKid->m_PageContent.m_ContentId = pKidObj->GetInteger();

+        pKid->m_PageContent.m_PageObjNum = PageObjNum;

+        return;

+    }

+    if (pKidObj->GetType() != PDFOBJ_DICTIONARY) {

+        return;

+    }

+    CPDF_Dictionary* pKidDict = (CPDF_Dictionary*)pKidObj;

+    CPDF_Object* pPageObj = pKidDict->GetElement(FX_BSTRC("Pg"));

+    if (pPageObj && pPageObj->GetType() == PDFOBJ_REFERENCE) {

+        PageObjNum = ((CPDF_Reference*)pPageObj)->GetRefObjNum();

+    }

+    CFX_ByteString type = pKidDict->GetString(FX_BSTRC("Type"));

+    if (type == FX_BSTRC("MCR")) {

+        if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {

+            return;

+        }

+        pKid->m_Type = CPDF_StructKid::StreamContent;

+        CPDF_Object* pStreamObj = pKidDict->GetElement(FX_BSTRC("Stm"));

+        if (pStreamObj && pStreamObj->GetType() == PDFOBJ_REFERENCE) {

+            pKid->m_StreamContent.m_RefObjNum = ((CPDF_Reference*)pStreamObj)->GetRefObjNum();

+        } else {

+            pKid->m_StreamContent.m_RefObjNum = 0;

+        }

+        pKid->m_StreamContent.m_PageObjNum = PageObjNum;

+        pKid->m_StreamContent.m_ContentId = pKidDict->GetInteger(FX_BSTRC("MCID"));

+    } else if (type == FX_BSTRC("OBJR")) {

+        if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {

+            return;

+        }

+        pKid->m_Type = CPDF_StructKid::Object;

+        CPDF_Object* pObj = pKidDict->GetElement(FX_BSTRC("Obj"));

+        if (pObj && pObj->GetType() == PDFOBJ_REFERENCE) {

+            pKid->m_Object.m_RefObjNum = ((CPDF_Reference*)pObj)->GetRefObjNum();

+        } else {

+            pKid->m_Object.m_RefObjNum = 0;

+        }

+        pKid->m_Object.m_PageObjNum = PageObjNum;

+    } else {

+        pKid->m_Type = CPDF_StructKid::Element;

+        pKid->m_Element.m_pDict = pKidDict;

+        if (m_pTree->m_pPage == NULL) {

+            pKid->m_Element.m_pElement = FX_NEW CPDF_StructElementImpl(m_pTree, this, pKidDict);

+        } else {

+            pKid->m_Element.m_pElement = NULL;

+        }

+    }

+}

+static CPDF_Dictionary* FindAttrDict(CPDF_Object* pAttrs, FX_BSTR owner, FX_FLOAT nLevel = 0.0F)

+{

+    if (nLevel > nMaxRecursion) {

+        return NULL;

+    }

+    if (pAttrs == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pDict = NULL;

+    if (pAttrs->GetType() == PDFOBJ_DICTIONARY) {

+        pDict = (CPDF_Dictionary*)pAttrs;

+    } else if (pAttrs->GetType() == PDFOBJ_STREAM) {

+        pDict = ((CPDF_Stream*)pAttrs)->GetDict();

+    } else if (pAttrs->GetType() == PDFOBJ_ARRAY) {

+        CPDF_Array* pArray = (CPDF_Array*)pAttrs;

+        for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {

+            CPDF_Object* pElement = pArray->GetElementValue(i);

+            pDict = FindAttrDict(pElement, owner, nLevel + 1);

+            if (pDict) {

+                return pDict;

+            }

+        }

+    }

+    if (pDict && pDict->GetString(FX_BSTRC("O")) == owner) {

+        return pDict;

+    }

+    return NULL;

+}

+CPDF_Object* CPDF_StructElementImpl::GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, FX_FLOAT fLevel)

+{

+    if (fLevel > nMaxRecursion) {

+        return NULL;

+    }

+    if (bInheritable) {

+        CPDF_Object* pAttr = GetAttr(owner, name, FALSE);

+        if (pAttr) {

+            return pAttr;

+        }

+        if (m_pParent == NULL) {

+            return NULL;

+        }

+        return m_pParent->GetAttr(owner, name, TRUE, fLevel + 1);

+    }

+    CPDF_Object* pA = m_pDict->GetElementValue(FX_BSTRC("A"));

+    if (pA) {

+        CPDF_Dictionary* pAttrDict = FindAttrDict(pA, owner);

+        if (pAttrDict) {

+            CPDF_Object* pAttr = pAttrDict->GetElementValue(name);

+            if (pAttr) {

+                return pAttr;

+            }

+        }

+    }

+    CPDF_Object* pC = m_pDict->GetElementValue(FX_BSTRC("C"));

+    if (pC == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pClassMap = m_pTree->m_pTreeRoot->GetDict(FX_BSTRC("ClassMap"));

+    if (pClassMap == NULL) {

+        return NULL;

+    }

+    if (pC->GetType() == PDFOBJ_ARRAY) {

+        CPDF_Array* pArray = (CPDF_Array*)pC;

+        for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {

+            CFX_ByteString class_name = pArray->GetString(i);

+            CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name);

+            if (pClassDict && pClassDict->GetString(FX_BSTRC("O")) == owner) {

+                return pClassDict->GetElementValue(name);

+            }

+        }

+        return NULL;

+    }

+    CFX_ByteString class_name = pC->GetString();

+    CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name);

+    if (pClassDict && pClassDict->GetString(FX_BSTRC("O")) == owner) {

+        return pClassDict->GetElementValue(name);

+    }

+    return NULL;

+}

+CPDF_Object* CPDF_StructElementImpl::GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, int subindex)

+{

+    CPDF_Object* pAttr = GetAttr(owner, name, bInheritable);

+    if (pAttr == NULL || subindex == -1 || pAttr->GetType() != PDFOBJ_ARRAY) {

+        return pAttr;

+    }

+    CPDF_Array* pArray = (CPDF_Array*)pAttr;

+    if (subindex >= (int)pArray->GetCount()) {

+        return pAttr;

+    }

+    return pArray->GetElementValue(subindex);

+}

+CFX_ByteString CPDF_StructElementImpl::GetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable, int subindex)

+{

+    CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);

+    if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NAME) {

+        return default_value;

+    }

+    return pAttr->GetString();

+}

+FX_ARGB	CPDF_StructElementImpl::GetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable, int subindex)

+{

+    CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);

+    if (pAttr == NULL || pAttr->GetType() != PDFOBJ_ARRAY) {

+        return default_value;

+    }

+    CPDF_Array* pArray = (CPDF_Array*)pAttr;

+    return 0xff000000 | ((int)(pArray->GetNumber(0) * 255) << 16) | ((int)(pArray->GetNumber(1) * 255) << 8) | (int)(pArray->GetNumber(2) * 255);

+}

+FX_FLOAT CPDF_StructElementImpl::GetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable, int subindex)

+{

+    CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);

+    if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NUMBER) {

+        return default_value;

+    }

+    return pAttr->GetNumber();

+}

+int	CPDF_StructElementImpl::GetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable, int subindex)

+{

+    CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);

+    if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NUMBER) {

+        return default_value;

+    }

+    return pAttr->GetInteger();

+}

diff --git a/core/src/fpdfdoc/doc_utils.cpp b/core/src/fpdfdoc/doc_utils.cpp
new file mode 100644
index 0000000..dd81594
--- /dev/null
+++ b/core/src/fpdfdoc/doc_utils.cpp
@@ -0,0 +1,749 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+static const int FPDFDOC_UTILS_MAXRECURSION = 32;

+CFX_WideString	GetFullName(CPDF_Dictionary* pFieldDict);

+void			InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);

+FX_DWORD		CountInterFormFonts(CPDF_Dictionary* pFormDict);

+CPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);

+CPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);

+CPDF_Font*		GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);

+CPDF_Font*		GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);

+CPDF_Font*		GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);

+FX_BOOL			FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);

+FX_BOOL			FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);

+void			AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);

+CPDF_Font*		AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);

+CPDF_Font*		AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);

+void			RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);

+void			RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);

+CPDF_Font*		GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);

+void			SetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);

+void			SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);

+FX_BOOL			NeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);

+FX_BOOL			NeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);

+void			EncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);

+void			UpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);

+CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict)

+{

+    CFX_WideString full_name;

+    CPDF_Dictionary* pLevel = pFieldDict;

+    while (pLevel) {

+        CFX_WideString short_name = pLevel->GetUnicodeText("T");

+        if (short_name != L"") {

+            if (full_name == L"") {

+                full_name = short_name;

+            } else {

+                full_name = short_name + L"." + full_name;

+            }

+        }

+        pLevel = pLevel->GetDict("Parent");

+    }

+    return full_name;

+}

+FX_BOOL CPDF_DefaultAppearance::HasFont()

+{

+    if (m_csDA.IsEmpty()) {

+        return FALSE;

+    }

+    CPDF_SimpleParser syntax(m_csDA);

+    return syntax.FindTagParam("Tf", 2);

+}

+CFX_ByteString CPDF_DefaultAppearance::GetFontString()

+{

+    CFX_ByteString csFont;

+    if (m_csDA.IsEmpty()) {

+        return csFont;

+    }

+    CPDF_SimpleParser syntax(m_csDA);

+    if (syntax.FindTagParam("Tf", 2)) {

+        csFont += (CFX_ByteString)syntax.GetWord();

+        csFont += " ";

+        csFont += (CFX_ByteString)syntax.GetWord();

+        csFont += " ";

+        csFont += (CFX_ByteString)syntax.GetWord();

+    }

+    return csFont;

+}

+void CPDF_DefaultAppearance::GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize)

+{

+    csFontNameTag = "";

+    fFontSize = 0;

+    if (m_csDA.IsEmpty()) {

+        return;

+    }

+    CPDF_SimpleParser syntax(m_csDA);

+    if (syntax.FindTagParam("Tf", 2)) {

+        csFontNameTag = (CFX_ByteString)syntax.GetWord();

+        csFontNameTag.Delete(0, 1);

+        fFontSize = FX_atof((CFX_ByteString)syntax.GetWord());

+    }

+    csFontNameTag = PDF_NameDecode(csFontNameTag);

+}

+FX_BOOL CPDF_DefaultAppearance::HasColor(FX_BOOL bStrokingOperation)

+{

+    if (m_csDA.IsEmpty()) {

+        return FALSE;

+    }

+    CPDF_SimpleParser syntax(m_csDA);

+    if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {

+        return TRUE;

+    }

+    syntax.SetPos(0);

+    if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {

+        return TRUE;

+    }

+    syntax.SetPos(0);

+    return syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4);

+}

+CFX_ByteString CPDF_DefaultAppearance::GetColorString(FX_BOOL bStrokingOperation)

+{

+    CFX_ByteString csColor;

+    if (m_csDA.IsEmpty()) {

+        return csColor;

+    }

+    CPDF_SimpleParser syntax(m_csDA);

+    if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {

+        csColor += (CFX_ByteString)syntax.GetWord();

+        csColor += " ";

+        csColor += (CFX_ByteString)syntax.GetWord();

+        return csColor;

+    }

+    syntax.SetPos(0);

+    if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {

+        csColor += (CFX_ByteString)syntax.GetWord();

+        csColor += " ";

+        csColor += (CFX_ByteString)syntax.GetWord();

+        csColor += " ";

+        csColor += (CFX_ByteString)syntax.GetWord();

+        csColor += " ";

+        csColor += (CFX_ByteString)syntax.GetWord();

+        return csColor;

+    }

+    syntax.SetPos(0);

+    if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {

+        csColor += (CFX_ByteString)syntax.GetWord();

+        csColor += " ";

+        csColor += (CFX_ByteString)syntax.GetWord();

+        csColor += " ";

+        csColor += (CFX_ByteString)syntax.GetWord();

+        csColor += " ";

+        csColor += (CFX_ByteString)syntax.GetWord();

+        csColor += " ";

+        csColor += (CFX_ByteString)syntax.GetWord();

+    }

+    return csColor;

+}

+void CPDF_DefaultAppearance::GetColor(int& iColorType, FX_FLOAT fc[4], FX_BOOL bStrokingOperation)

+{

+    iColorType = COLORTYPE_TRANSPARENT;

+    for (int c = 0; c < 4; c ++) {

+        fc[c] = 0;

+    }

+    if (m_csDA.IsEmpty()) {

+        return;

+    }

+    CPDF_SimpleParser syntax(m_csDA);

+    if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {

+        iColorType = COLORTYPE_GRAY;

+        fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());

+        return;

+    }

+    syntax.SetPos(0);

+    if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {

+        iColorType = COLORTYPE_RGB;

+        fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());

+        fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());

+        fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());

+        return;

+    }

+    syntax.SetPos(0);

+    if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {

+        iColorType = COLORTYPE_CMYK;

+        fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());

+        fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());

+        fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());

+        fc[3] = FX_atof((CFX_ByteString)syntax.GetWord());

+    }

+}

+void CPDF_DefaultAppearance::GetColor(FX_ARGB& color, int& iColorType, FX_BOOL bStrokingOperation)

+{

+    color = 0;

+    iColorType = COLORTYPE_TRANSPARENT;

+    if (m_csDA.IsEmpty()) {

+        return;

+    }

+    CPDF_SimpleParser syntax(m_csDA);

+    if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {

+        iColorType = COLORTYPE_GRAY;

+        FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;

+        color = ArgbEncode(255, (int)g, (int)g, (int)g);

+        return;

+    }

+    syntax.SetPos(0);

+    if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {

+        iColorType = COLORTYPE_RGB;

+        FX_FLOAT r = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;

+        FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;

+        FX_FLOAT b = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;

+        color = ArgbEncode(255, (int)r, (int)g, (int)b);

+        return;

+    }

+    syntax.SetPos(0);

+    if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {

+        iColorType = COLORTYPE_CMYK;

+        FX_FLOAT c = FX_atof((CFX_ByteString)syntax.GetWord());

+        FX_FLOAT m = FX_atof((CFX_ByteString)syntax.GetWord());

+        FX_FLOAT y = FX_atof((CFX_ByteString)syntax.GetWord());

+        FX_FLOAT k = FX_atof((CFX_ByteString)syntax.GetWord());

+        FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);

+        FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);

+        FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);

+        color = ArgbEncode(255, (int)(r * 255 + 0.5f), (int)(g * 255 + 0.5f), (int)(b * 255 + 0.5f));

+    }

+}

+FX_BOOL CPDF_DefaultAppearance::HasTextMatrix()

+{

+    if (m_csDA.IsEmpty()) {

+        return FALSE;

+    }

+    CPDF_SimpleParser syntax(m_csDA);

+    return syntax.FindTagParam("Tm", 6);

+}

+CFX_ByteString CPDF_DefaultAppearance::GetTextMatrixString()

+{

+    CFX_ByteString csTM;

+    if (m_csDA.IsEmpty()) {

+        return csTM;

+    }

+    CPDF_SimpleParser syntax(m_csDA);

+    if (syntax.FindTagParam("Tm", 6)) {

+        for (int i = 0; i < 6; i ++) {

+            csTM += (CFX_ByteString)syntax.GetWord();

+            csTM += " ";

+        }

+        csTM += (CFX_ByteString)syntax.GetWord();

+    }

+    return csTM;

+}

+CFX_AffineMatrix CPDF_DefaultAppearance::GetTextMatrix()

+{

+    CFX_AffineMatrix tm;

+    if (m_csDA.IsEmpty()) {

+        return tm;

+    }

+    CPDF_SimpleParser syntax(m_csDA);

+    if (syntax.FindTagParam("Tm", 6)) {

+        FX_FLOAT f[6];

+        for (int i = 0; i < 6; i ++) {

+            f[i] = FX_atof((CFX_ByteString)syntax.GetWord());

+        }

+        tm.Set(f[0], f[1], f[2], f[3], f[4], f[5]);

+    }

+    return tm;

+}

+void InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument)

+{

+    if (pDocument == NULL) {

+        return;

+    }

+    if (pFormDict == NULL) {

+        pFormDict = CPDF_Dictionary::Create();

+        if (pFormDict == NULL) {

+            return;

+        }

+        FX_DWORD dwObjNum = pDocument->AddIndirectObject(pFormDict);

+        CPDF_Dictionary* pRoot = pDocument->GetRoot();

+        pRoot->SetAtReference("AcroForm", pDocument, dwObjNum);

+    }

+    CFX_ByteString csDA;

+    if (!pFormDict->KeyExist("DR")) {

+        CPDF_Font* pFont = NULL;

+        CFX_ByteString csBaseName, csDefault;

+        FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();

+        pFont = CPDF_InterForm::AddStandardFont(pDocument, "Helvetica");

+        if (pFont != NULL) {

+            AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);

+            csDefault = csBaseName;

+        }

+        if (charSet != 0) {

+            CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet, NULL);

+            if (pFont == NULL || csFontName != "Helvetica") {

+                pFont = CPDF_InterForm::AddNativeFont(pDocument);

+                if (pFont != NULL) {

+                    csBaseName = "";

+                    AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);

+                    csDefault = csBaseName;

+                }

+            }

+        }

+        if (pFont != NULL) {

+            csDA = "/" + PDF_NameEncode(csDefault) + " 0 Tf";

+        }

+    }

+    if (!csDA.IsEmpty()) {

+        csDA += " ";

+    }

+    csDA += "0 g";

+    if (!pFormDict->KeyExist("DA")) {

+        pFormDict->SetAtString("DA", csDA);

+    }

+}

+FX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict)

+{

+    if (pFormDict == NULL) {

+        return 0;

+    }

+    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");

+    if (pDR == NULL) {

+        return 0;

+    }

+    CPDF_Dictionary* pFonts = pDR->GetDict("Font");

+    if (pFonts == NULL) {

+        return 0;

+    }

+    FX_DWORD dwCount = 0;

+    FX_POSITION pos = pFonts->GetStartPos();

+    while (pos) {

+        CPDF_Object* pObj = NULL;

+        CFX_ByteString csKey;

+        pObj = pFonts->GetNextElement(pos, csKey);

+        if (pObj == NULL) {

+            continue;

+        }

+        CPDF_Object* pDirect = pObj->GetDirect();

+        if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {

+            if (((CPDF_Dictionary*)pDirect)->GetString("Type") == "Font") {

+                dwCount ++;

+            }

+        }

+    }

+    return dwCount;

+}

+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag)

+{

+    if (pFormDict == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");

+    if (pDR == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pFonts = pDR->GetDict("Font");

+    if (pFonts == NULL) {

+        return NULL;

+    }

+    FX_DWORD dwCount = 0;

+    FX_POSITION pos = pFonts->GetStartPos();

+    while (pos) {

+        CPDF_Object* pObj = NULL;

+        CFX_ByteString csKey;

+        pObj = pFonts->GetNextElement(pos, csKey);

+        if (pObj == NULL) {

+            continue;

+        }

+        CPDF_Object* pDirect = pObj->GetDirect();

+        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {

+            continue;

+        }

+        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;

+        if (pElement->GetString("Type") != "Font") {

+            continue;

+        }

+        if (dwCount == index) {

+            csNameTag = csKey;

+            return pDocument->LoadFont(pElement);

+        }

+        dwCount ++;

+    }

+    return NULL;

+}

+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag)

+{

+    CFX_ByteString csAlias = PDF_NameDecode(csNameTag);

+    if (pFormDict == NULL || csAlias.IsEmpty()) {

+        return NULL;

+    }

+    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");

+    if (pDR == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pFonts = pDR->GetDict("Font");

+    if (pFonts == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pElement = pFonts->GetDict(csAlias);

+    if (pElement == NULL) {

+        return NULL;

+    }

+    if (pElement->GetString("Type") == "Font") {

+        return pDocument->LoadFont(pElement);

+    }

+    return NULL;

+}

+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag)

+{

+    if (pFormDict == NULL || csFontName.IsEmpty()) {

+        return NULL;

+    }

+    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");

+    if (pDR == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pFonts = pDR->GetDict("Font");

+    if (pFonts == NULL) {

+        return NULL;

+    }

+    FX_POSITION pos = pFonts->GetStartPos();

+    while (pos) {

+        CPDF_Object* pObj = NULL;

+        CFX_ByteString csKey;

+        pObj = pFonts->GetNextElement(pos, csKey);

+        if (pObj == NULL) {

+            continue;

+        }

+        CPDF_Object* pDirect = pObj->GetDirect();

+        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {

+            continue;

+        }

+        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;

+        if (pElement->GetString("Type") != "Font") {

+            continue;

+        }

+        CPDF_Font* pFind = pDocument->LoadFont(pElement);

+        if (pFind == NULL) {

+            continue;

+        }

+        CFX_ByteString csBaseFont;

+        csBaseFont = pFind->GetBaseFont();

+        csBaseFont.Remove(' ');

+        if (csBaseFont == csFontName) {

+            csNameTag = csKey;

+            return pFind;

+        }

+    }

+    return NULL;

+}

+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)

+{

+    if (pFormDict == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");

+    if (pDR == NULL) {

+        return NULL;

+    }

+    CPDF_Dictionary* pFonts = pDR->GetDict("Font");

+    if (pFonts == NULL) {

+        return NULL;

+    }

+    FX_POSITION pos = pFonts->GetStartPos();

+    while (pos) {

+        CPDF_Object* pObj = NULL;

+        CFX_ByteString csKey;

+        pObj = pFonts->GetNextElement(pos, csKey);

+        if (pObj == NULL) {

+            continue;

+        }

+        CPDF_Object* pDirect = pObj->GetDirect();

+        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {

+            continue;

+        }

+        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;

+        if (pElement->GetString("Type") != "Font") {

+            continue;

+        }

+        CPDF_Font* pFind = pDocument->LoadFont(pElement);

+        if (pFind == NULL) {

+            continue;

+        }

+        CFX_SubstFont* pSubst = (CFX_SubstFont*)pFind->GetSubstFont();

+        if (pSubst == NULL) {

+            continue;

+        }

+        if (pSubst->m_Charset == (int)charSet) {

+            csNameTag = csKey;

+            return pFind;

+        }

+    }

+    return NULL;

+}

+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)

+{

+    csNameTag = "";

+    FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();

+    CFX_SubstFont* pSubst;

+    CPDF_Font* pFont = GetDefaultInterFormFont(pFormDict, pDocument);

+    if (pFont != NULL) {

+        pSubst = (CFX_SubstFont*)pFont->GetSubstFont();

+        if (pSubst != NULL && pSubst->m_Charset == (int)charSet) {

+            FindInterFormFont(pFormDict, pFont, csNameTag);

+            return pFont;

+        }

+    }

+    return GetNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);

+}

+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag)

+{

+    if (pFormDict == NULL || pFont == NULL) {

+        return FALSE;

+    }

+    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");

+    if (pDR == NULL) {

+        return FALSE;

+    }

+    CPDF_Dictionary* pFonts = pDR->GetDict("Font");

+    if (pFonts == NULL) {

+        return FALSE;

+    }

+    FX_POSITION pos = pFonts->GetStartPos();

+    while (pos) {

+        CPDF_Object* pObj = NULL;

+        CFX_ByteString csKey;

+        pObj = pFonts->GetNextElement(pos, csKey);

+        if (pObj == NULL) {

+            continue;

+        }

+        CPDF_Object* pDirect = pObj->GetDirect();

+        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {

+            continue;

+        }

+        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;

+        if (pElement->GetString("Type") != "Font") {

+            continue;

+        }

+        if (pFont->GetFontDict() == pElement) {

+            csNameTag = csKey;

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)

+{

+    if (pFormDict == NULL) {

+        return FALSE;

+    }

+    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");

+    if (pDR == NULL) {

+        return FALSE;

+    }

+    CPDF_Dictionary* pFonts = pDR->GetDict("Font");

+    if (pFonts == NULL) {

+        return FALSE;

+    }

+    if (csFontName.GetLength() > 0) {

+        csFontName.Remove(' ');

+    }

+    FX_POSITION pos = pFonts->GetStartPos();

+    while (pos) {

+        CPDF_Object* pObj = NULL;

+        CFX_ByteString csKey, csTmp;

+        pObj = pFonts->GetNextElement(pos, csKey);

+        if (pObj == NULL) {

+            continue;

+        }

+        CPDF_Object* pDirect = pObj->GetDirect();

+        if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {

+            continue;

+        }

+        CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;

+        if (pElement->GetString("Type") != "Font") {

+            continue;

+        }

+        pFont = pDocument->LoadFont(pElement);

+        if (pFont == NULL) {

+            continue;

+        }

+        CFX_ByteString csBaseFont;

+        csBaseFont = pFont->GetBaseFont();

+        csBaseFont.Remove(' ');

+        if (csBaseFont == csFontName) {

+            csNameTag = csKey;

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+void AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag)

+{

+    if (pFont == NULL) {

+        return;

+    }

+    if (pFormDict == NULL) {

+        InitInterFormDict(pFormDict, pDocument);

+    }

+    CFX_ByteString csTag;

+    if (FindInterFormFont(pFormDict, pFont, csTag)) {

+        csNameTag = csTag;

+        return;

+    }

+    if (pFormDict == NULL) {

+        InitInterFormDict(pFormDict, pDocument);

+    }

+    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");

+    if (pDR == NULL) {

+        pDR = CPDF_Dictionary::Create();

+        if (pDR == NULL) {

+            return;

+        }

+        pFormDict->SetAt("DR", pDR);

+    }

+    CPDF_Dictionary* pFonts = pDR->GetDict("Font");

+    if (pFonts == NULL) {

+        pFonts = CPDF_Dictionary::Create();

+        pDR->SetAt("Font", pFonts);

+    }

+    if (csNameTag.IsEmpty()) {

+        csNameTag = pFont->GetBaseFont();

+    }

+    csNameTag.Remove(' ');

+    csNameTag = CPDF_InterForm::GenerateNewResourceName(pDR, "Font", 4, csNameTag);

+    pFonts->SetAtReference(csNameTag, pDocument, pFont->GetFontDict());

+}

+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)

+{

+    if (pFormDict == NULL) {

+        InitInterFormDict(pFormDict, pDocument);

+    }

+    CFX_ByteString csTemp;

+    CPDF_Font* pFont = GetNativeInterFormFont(pFormDict, pDocument, charSet, csTemp);

+    if (pFont != NULL) {

+        csNameTag = csTemp;

+        return pFont;

+    }

+    CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet);

+    if (!csFontName.IsEmpty()) {

+        if (FindInterFormFont(pFormDict, pDocument, csFontName, pFont, csNameTag)) {

+            return pFont;

+        }

+    }

+    pFont = CPDF_InterForm::AddNativeFont(charSet, pDocument);

+    if (pFont != NULL) {

+        AddInterFormFont(pFormDict, pDocument, pFont, csNameTag);

+    }

+    return pFont;

+}

+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)

+{

+    FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();

+    return AddNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);

+}

+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont)

+{

+    if (pFormDict == NULL || pFont == NULL) {

+        return;

+    }

+    CFX_ByteString csTag;

+    if (!FindInterFormFont(pFormDict, pFont, csTag)) {

+        return;

+    }

+    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");

+    CPDF_Dictionary* pFonts = pDR->GetDict("Font");

+    pFonts->RemoveAt(csTag);

+}

+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag)

+{

+    if (pFormDict == NULL || csNameTag.IsEmpty()) {

+        return;

+    }

+    CPDF_Dictionary* pDR = pFormDict->GetDict("DR");

+    if (pDR == NULL) {

+        return;

+    }

+    CPDF_Dictionary* pFonts = pDR->GetDict("Font");

+    if (pFonts == NULL) {

+        return;

+    }

+    pFonts->RemoveAt(csNameTag);

+}

+CPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument)

+{

+    if (pFormDict == NULL) {

+        return NULL;

+    }

+    CPDF_DefaultAppearance cDA = pFormDict->GetString("DA");

+    CFX_ByteString csFontNameTag;

+    FX_FLOAT fFontSize;

+    cDA.GetFont(csFontNameTag, fFontSize);

+    return GetInterFormFont(pFormDict, pDocument, csFontNameTag);

+}

+CPDF_IconFit::ScaleMethod CPDF_IconFit::GetScaleMethod()

+{

+    if (m_pDict == NULL) {

+        return Always;

+    }

+    CFX_ByteString csSW = m_pDict->GetString("SW", "A");

+    if (csSW == "B") {

+        return Bigger;

+    } else if (csSW == "S") {

+        return Smaller;

+    } else if (csSW == "N") {

+        return Never;

+    }

+    return Always;

+}

+FX_BOOL CPDF_IconFit::IsProportionalScale()

+{

+    if (m_pDict == NULL) {

+        return TRUE;

+    }

+    return m_pDict->GetString("S", "P") != "A";

+}

+void CPDF_IconFit::GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom)

+{

+    fLeft = fBottom = 0.5;

+    if (m_pDict == NULL) {

+        return;

+    }

+    CPDF_Array* pA = m_pDict->GetArray("A");

+    if (pA != NULL) {

+        FX_DWORD dwCount = pA->GetCount();

+        if (dwCount > 0) {

+            fLeft = pA->GetNumber(0);

+        }

+        if (dwCount > 1) {

+            fBottom = pA->GetNumber(1);

+        }

+    }

+}

+FX_BOOL CPDF_IconFit::GetFittingBounds()

+{

+    if (m_pDict == NULL) {

+        return FALSE;

+    }

+    return m_pDict->GetBoolean("FB");

+}

+void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray)

+{

+    int iCount = pField->CountControls();

+    for (int i = 0; i < iCount; i ++) {

+        CPDF_FormControl* pControl = pField->GetControl(i);

+        if (pControl == NULL) {

+            continue;

+        }

+        statusArray.Add(pControl->IsChecked() ? 1 : 0);

+    }

+}

+CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel)

+{

+    if (nLevel > FPDFDOC_UTILS_MAXRECURSION) {

+        return NULL;

+    }

+    if (pFieldDict == NULL) {

+        return NULL;

+    }

+    CPDF_Object* pAttr = pFieldDict->GetElementValue(name);

+    if (pAttr) {

+        return pAttr;

+    }

+    CPDF_Dictionary* pParent = pFieldDict->GetDict("Parent");

+    if (pParent == NULL) {

+        return NULL;

+    }

+    return FPDF_GetFieldAttr(pParent, name, nLevel + 1);

+}

diff --git a/core/src/fpdfdoc/doc_viewerPreferences.cpp b/core/src/fpdfdoc/doc_viewerPreferences.cpp
new file mode 100644
index 0000000..80af0b5
--- /dev/null
+++ b/core/src/fpdfdoc/doc_viewerPreferences.cpp
@@ -0,0 +1,31 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+CPDF_ViewerPreferences::CPDF_ViewerPreferences(CPDF_Document *pDoc): m_pDoc(pDoc)

+{

+}

+CPDF_ViewerPreferences::~CPDF_ViewerPreferences()

+{

+}

+FX_BOOL CPDF_ViewerPreferences::IsDirectionR2L() const

+{

+    CPDF_Dictionary *pDict = m_pDoc->GetRoot();

+    pDict = pDict->GetDict(FX_BSTRC("ViewerPreferences"));

+    if (!pDict)	{

+        return FALSE;

+    }

+    return FX_BSTRC("R2L") == pDict->GetString(FX_BSTRC("Direction"));

+}

+FX_BOOL CPDF_ViewerPreferences::PrintScaling() const

+{

+    CPDF_Dictionary *pDict = m_pDoc->GetRoot();

+    pDict = pDict->GetDict(FX_BSTRC("ViewerPreferences"));

+    if (!pDict)	{

+        return TRUE;

+    }

+    return FX_BSTRC("None") != pDict->GetString(FX_BSTRC("PrintScaling"));

+}

diff --git a/core/src/fpdfdoc/doc_vt.cpp b/core/src/fpdfdoc/doc_vt.cpp
new file mode 100644
index 0000000..251173d
--- /dev/null
+++ b/core/src/fpdfdoc/doc_vt.cpp
@@ -0,0 +1,1864 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+#include "../../include/fpdfdoc/fpdf_vt.h"

+#include "pdf_vt.h"

+const FX_BYTE gFontSizeSteps[] = {	4, 6, 8, 9, 10,	12, 14, 18, 20, 25,	30, 35, 40, 45, 50,	55, 60, 70, 80, 90,	100, 110, 120, 130, 144};

+#define PVT_RETURN_LENGTH					1

+#define PVT_DEFAULT_FONTSIZE				18.0f

+#define PVTWORD_SCRIPT_NORMAL				0

+#define PVTWORD_SCRIPT_SUPER				1

+#define PVTWORD_SCRIPT_SUB					2

+#define	PVT_FONTSCALE						0.001f

+#define PVT_PERCENT							0.01f

+#define PVT_HALF							0.5f

+CLine::CLine()

+{

+}

+CLine::~CLine()

+{

+}

+CPVT_WordPlace CLine::GetBeginWordPlace() const

+{

+    return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, -1);

+}

+CPVT_WordPlace CLine::GetEndWordPlace() const

+{

+    return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, m_LineInfo.nEndWordIndex);

+}

+CPVT_WordPlace CLine::GetPrevWordPlace(const CPVT_WordPlace & place) const

+{

+    if (place.nWordIndex > m_LineInfo.nEndWordIndex) {

+        return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nEndWordIndex);

+    }

+    return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex - 1);

+}

+CPVT_WordPlace CLine::GetNextWordPlace(const CPVT_WordPlace & place) const

+{

+    if (place.nWordIndex < m_LineInfo.nBeginWordIndex) {

+        return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nBeginWordIndex);

+    }

+    return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex + 1);

+}

+CSection::CSection(CPDF_VariableText * pVT) : m_pVT(pVT)

+{

+}

+CSection::~CSection()

+{

+    ResetAll();

+}

+void CSection::ResetAll()

+{

+    ResetWordArray();

+    ResetLineArray();

+}

+void CSection::ResetLineArray()

+{

+    m_LineArray.RemoveAll();

+}

+void CSection::ResetWordArray()

+{

+    for (FX_INT32 i = 0, sz = m_WordArray.GetSize(); i < sz; i++) {

+        delete m_WordArray.GetAt(i);

+    }

+    m_WordArray.RemoveAll();

+}

+void CSection::ResetLinePlace()

+{

+    for (FX_INT32 i = 0, sz = m_LineArray.GetSize(); i < sz; i++) {

+        if (CLine * pLine = m_LineArray.GetAt(i)) {

+            pLine->LinePlace = CPVT_WordPlace(SecPlace.nSecIndex, i, -1);

+        }

+    }

+}

+CPVT_WordPlace CSection::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)

+{

+    if (CPVT_WordInfo * pWord = FX_NEW CPVT_WordInfo(wordinfo)) {

+        FX_INT32 nWordIndex = FPDF_MAX(FPDF_MIN(place.nWordIndex, this->m_WordArray.GetSize()), 0);

+        if (nWordIndex == m_WordArray.GetSize()) {

+            m_WordArray.Add(pWord);

+        } else {

+            m_WordArray.InsertAt(nWordIndex, pWord);

+        }

+    }

+    return place;

+}

+CPVT_WordPlace CSection::AddLine(const CPVT_LineInfo & lineinfo)

+{

+    return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1);

+}

+CPVT_FloatRect CSection::Rearrange()

+{

+    ASSERT(m_pVT != NULL);

+    if (m_pVT->m_nCharArray > 0) {

+        return CTypeset(this).CharArray();

+    } else {

+        return CTypeset(this).Typeset();

+    }

+}

+CPVT_Size CSection::GetSectionSize(FX_FLOAT fFontSize)

+{

+    return CTypeset(this).GetEditSize(fFontSize);

+}

+CPVT_WordPlace CSection::GetBeginWordPlace() const

+{

+    if (CLine * pLine = m_LineArray.GetAt(0)) {

+        return pLine->GetBeginWordPlace();

+    } else {

+        return SecPlace;

+    }

+}

+CPVT_WordPlace CSection::GetEndWordPlace() const

+{

+    if (CLine * pLine = m_LineArray.GetAt(m_LineArray.GetSize() - 1)) {

+        return pLine->GetEndWordPlace();

+    } else {

+        return this->SecPlace;

+    }

+}

+CPVT_WordPlace CSection::GetPrevWordPlace(const CPVT_WordPlace & place) const

+{

+    if (place.nLineIndex < 0) {

+        return GetBeginWordPlace();

+    }

+    if (place.nLineIndex >= m_LineArray.GetSize()) {

+        return GetEndWordPlace();

+    }

+    if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) {

+        if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex) {

+            return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);

+        } else if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {

+            if (CLine * pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1)) {

+                return pPrevLine->GetEndWordPlace();

+            }

+        } else {

+            return pLine->GetPrevWordPlace(place);

+        }

+    }

+    return place;

+}

+CPVT_WordPlace CSection::GetNextWordPlace(const CPVT_WordPlace & place) const

+{

+    if (place.nLineIndex < 0) {

+        return GetBeginWordPlace();

+    }

+    if (place.nLineIndex >= m_LineArray.GetSize()) {

+        return GetEndWordPlace();

+    }

+    if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) {

+        if (place.nWordIndex >= pLine->m_LineInfo.nEndWordIndex) {

+            if (CLine * pNextLine = m_LineArray.GetAt(place.nLineIndex + 1)) {

+                return pNextLine->GetBeginWordPlace();

+            }

+        } else {

+            return pLine->GetNextWordPlace(place);

+        }

+    }

+    return place;

+}

+void CSection::UpdateWordPlace(CPVT_WordPlace & place) const

+{

+    FX_INT32 nLeft = 0;

+    FX_INT32 nRight = m_LineArray.GetSize() - 1;

+    FX_INT32 nMid = (nLeft + nRight) / 2;

+    while (nLeft <= nRight) {

+        if (CLine * pLine = m_LineArray.GetAt(nMid)) {

+            if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {

+                nRight = nMid - 1;

+                nMid = (nLeft + nRight) / 2;

+            } else if (place.nWordIndex > pLine->m_LineInfo.nEndWordIndex) {

+                nLeft = nMid + 1;

+                nMid = (nLeft + nRight) / 2;

+            } else {

+                place.nLineIndex = nMid;

+                return;

+            }

+        } else {

+            break;

+        }

+    }

+}

+CPVT_WordPlace CSection::SearchWordPlace(const CPDF_Point & point) const

+{

+    ASSERT(m_pVT != NULL);

+    CPVT_WordPlace place = GetBeginWordPlace();

+    FX_BOOL bUp = TRUE;

+    FX_BOOL bDown = TRUE;

+    FX_INT32 nLeft = 0;

+    FX_INT32 nRight = m_LineArray.GetSize() - 1;

+    FX_INT32 nMid = m_LineArray.GetSize() / 2;

+    FX_FLOAT fTop = 0;

+    FX_FLOAT fBottom = 0;

+    while (nLeft <= nRight) {

+        if (CLine * pLine = m_LineArray.GetAt(nMid)) {

+            fTop = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineAscent - m_pVT->GetLineLeading(m_SecInfo);

+            fBottom = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineDescent;

+            if (IsFloatBigger(point.y, fTop)) {

+                bUp = FALSE;

+            }

+            if (IsFloatSmaller(point.y, fBottom)) {

+                bDown = FALSE;

+            }

+            if (IsFloatSmaller(point.y, fTop)) {

+                nRight = nMid - 1;

+                nMid = (nLeft + nRight) / 2;

+                continue;

+            } else if (IsFloatBigger(point.y, fBottom)) {

+                nLeft = nMid + 1;

+                nMid = (nLeft + nRight) / 2;

+                continue;

+            } else {

+                place = SearchWordPlace(point.x,

+                                        CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace())

+                                       );

+                place.nLineIndex = nMid;

+                return place;

+            }

+        }

+    }

+    if (bUp) {

+        place = GetBeginWordPlace();

+    }

+    if (bDown) {

+        place = GetEndWordPlace();

+    }

+    return place;

+}

+CPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const

+{

+    if (CLine * pLine = m_LineArray.GetAt(lineplace.nLineIndex)) {

+        return SearchWordPlace(fx - m_SecInfo.rcSection.left,

+                               CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace()));

+    }

+    return GetBeginWordPlace();

+}

+CPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const

+{

+    CPVT_WordPlace wordplace = range.BeginPos;

+    wordplace.nWordIndex = -1;

+    if (!m_pVT)	{

+        return wordplace;

+    }

+    FX_INT32 nLeft = range.BeginPos.nWordIndex;

+    FX_INT32 nRight = range.EndPos.nWordIndex + 1;

+    FX_INT32 nMid = (nLeft + nRight) / 2;

+    while (nLeft < nRight) {

+        if (nMid == nLeft) {

+            break;

+        }

+        if (nMid == nRight) {

+            nMid--;

+            break;

+        }

+        if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) {

+            if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) {

+                nLeft = nMid;

+                nMid = (nLeft + nRight) / 2;

+                continue;

+            } else {

+                nRight = nMid;

+                nMid = (nLeft + nRight) / 2;

+                continue;

+            }

+        } else {

+            break;

+        }

+    }

+    if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) {

+        if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) {

+            wordplace.nWordIndex = nMid;

+        }

+    }

+    return wordplace;

+}

+void CSection::ClearLeftWords(FX_INT32 nWordIndex)

+{

+    for (FX_INT32 i = nWordIndex; i >= 0; i--) {

+        delete m_WordArray.GetAt(i);

+        m_WordArray.RemoveAt(i);

+    }

+}

+void CSection::ClearRightWords(FX_INT32 nWordIndex)

+{

+    for (FX_INT32 i = m_WordArray.GetSize() - 1; i > nWordIndex; i--) {

+        delete m_WordArray.GetAt(i);

+        m_WordArray.RemoveAt(i);

+    }

+}

+void CSection::ClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex)

+{

+    for (FX_INT32 i = nEndIndex; i > nBeginIndex; i--) {

+        delete m_WordArray.GetAt(i);

+        m_WordArray.RemoveAt(i);

+    }

+}

+void CSection::ClearWords(const CPVT_WordRange & PlaceRange)

+{

+    CPVT_WordPlace SecBeginPos = GetBeginWordPlace();

+    CPVT_WordPlace SecEndPos = GetEndWordPlace();

+    if (PlaceRange.BeginPos.WordCmp(SecBeginPos) >= 0) {

+        if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {

+            ClearMidWords(PlaceRange.BeginPos.nWordIndex, PlaceRange.EndPos.nWordIndex);

+        } else {

+            ClearRightWords(PlaceRange.BeginPos.nWordIndex);

+        }

+    } else if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {

+        ClearLeftWords(PlaceRange.EndPos.nWordIndex);

+    } else {

+        ResetWordArray();

+    }

+}

+void CSection::ClearWord(const CPVT_WordPlace & place)

+{

+    delete m_WordArray.GetAt(place.nWordIndex);

+    m_WordArray.RemoveAt(place.nWordIndex);

+}

+CTypeset::CTypeset(CSection * pSection) : m_pSection(pSection), m_pVT(pSection->m_pVT), m_rcRet(0.0f, 0.0f, 0.0f, 0.0f)

+{

+}

+CTypeset::~CTypeset()

+{

+}

+CPVT_FloatRect CTypeset::CharArray()

+{

+    ASSERT(m_pSection != NULL);

+    ASSERT(m_pVT != NULL);

+    FX_FLOAT fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());

+    FX_FLOAT fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());

+    m_rcRet.Default();

+    FX_FLOAT x = 0.0f, y = 0.0f;

+    FX_FLOAT fNextWidth;

+    FX_INT32 nStart = 0;

+    FX_FLOAT fNodeWidth = m_pVT->GetPlateWidth() / (m_pVT->m_nCharArray <= 0 ? 1 : m_pVT->m_nCharArray);

+    if (CLine * pLine = m_pSection->m_LineArray.GetAt(0)) {

+        x = 0.0f;

+        y +=  m_pVT->GetLineLeading(m_pSection->m_SecInfo);

+        y += fLineAscent;

+        nStart = 0;

+        switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {

+            case 0:

+                pLine->m_LineInfo.fLineX = fNodeWidth * PVT_HALF;

+                break;

+            case 1:

+                nStart = (m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize()) / 2;

+                pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF;

+                break;

+            case 2:

+                nStart = m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize();

+                pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF;

+                break;

+        }

+        for (FX_INT32 w = 0, sz = m_pSection->m_WordArray.GetSize(); w < sz; w++) {

+            if (w >= m_pVT->m_nCharArray) {

+                break;

+            }

+            fNextWidth = 0;

+            if (CPVT_WordInfo * pNextWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w + 1)) {

+                pNextWord->fWordTail = 0;

+                fNextWidth = m_pVT->GetWordWidth(*pNextWord);

+            }

+            if (CPVT_WordInfo * pWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w)) {

+                pWord->fWordTail = 0;

+                FX_FLOAT fWordWidth = m_pVT->GetWordWidth(*pWord);

+                FX_FLOAT fWordAscent = m_pVT->GetWordAscent(*pWord);

+                FX_FLOAT fWordDescent = m_pVT->GetWordDescent(*pWord);

+                x = (FX_FLOAT)(fNodeWidth * (w + nStart + 0.5) - fWordWidth * PVT_HALF);

+                pWord->fWordX = x;

+                pWord->fWordY = y;

+                if (w == 0) {

+                    pLine->m_LineInfo.fLineX = x;

+                }

+                if (w != m_pSection->m_WordArray.GetSize() - 1)

+                    pWord->fWordTail = (fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF > 0 ?

+                                        fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF : 0);

+                else {

+                    pWord->fWordTail = 0;

+                }

+                x += fWordWidth;

+                fLineAscent = FPDF_MAX(fLineAscent, fWordAscent);

+                fLineDescent = FPDF_MIN(fLineDescent, fWordDescent);

+            }

+        }

+        pLine->m_LineInfo.nBeginWordIndex = 0;

+        pLine->m_LineInfo.nEndWordIndex = m_pSection->m_WordArray.GetSize() - 1;

+        pLine->m_LineInfo.fLineY = y;

+        pLine->m_LineInfo.fLineWidth = 	x - pLine->m_LineInfo.fLineX;

+        pLine->m_LineInfo.fLineAscent = fLineAscent;

+        pLine->m_LineInfo.fLineDescent = fLineDescent;

+        y += (-fLineDescent);

+    }

+    return m_rcRet = CPVT_FloatRect(0, 0, x, y);

+}

+CPVT_Size CTypeset::GetEditSize(FX_FLOAT fFontSize)

+{

+    ASSERT(m_pSection != NULL);

+    ASSERT(m_pVT != NULL);

+    SplitLines(FALSE, fFontSize);

+    return CPVT_Size(m_rcRet.Width(), m_rcRet.Height());

+}

+CPVT_FloatRect CTypeset::Typeset()

+{

+    ASSERT(m_pSection != NULL);

+    ASSERT(m_pVT != NULL);

+    m_pSection->m_LineArray.Empty();

+    SplitLines(TRUE, 0.0f);

+    m_pSection->m_LineArray.Clear();

+    OutputLines();

+    return m_rcRet;

+}

+static int special_chars[128] = {

+    0x0000, 0x000C, 0x0008, 0x000C, 0x0008, 0x0000, 0x0020, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0008, 0x0008, 0x0000, 0x0010, 0x0000, 0x0000, 0x0028,

+    0x000C, 0x0008, 0x0000, 0x0000, 0x0028, 0x0028, 0x0028, 0x0028,

+    0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,

+    0x0002, 0x0002, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008,

+    0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,

+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,

+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,

+    0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000,

+    0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,

+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,

+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,

+    0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000,

+};

+static FX_BOOL IsLatin(FX_WORD word)

+{

+    if (word <= 0x007F) {

+        if (special_chars[word] & 0x0001) {

+            return TRUE;

+        }

+    }

+    if ((word >= 0x00C0 && word <= 0x00FF) ||

+            (word >= 0x0100 && word <= 0x024F) ||

+            (word >= 0x1E00 && word <= 0x1EFF) ||

+            (word >= 0x2C60 && word <= 0x2C7F) ||

+            (word >= 0xA720 && word <= 0xA7FF) ||

+            (word >= 0xFF21 && word <= 0xFF3A) ||

+            (word >= 0xFF41 && word <= 0xFF5A)) {

+        return TRUE;

+    }

+    return FALSE;

+}

+static FX_BOOL IsDigit(FX_DWORD word)

+{

+    return (word >= 0x0030 && word <= 0x0039) ? TRUE : FALSE;

+}

+static FX_BOOL IsCJK(FX_DWORD word)

+{

+    if ((word >= 0x1100 && word <= 0x11FF) ||

+            (word >= 0x2E80 && word <= 0x2FFF) ||

+            (word >= 0x3040 && word <= 0x9FBF) ||

+            (word >= 0xAC00 && word <= 0xD7AF) ||

+            (word >= 0xF900 && word <= 0xFAFF) ||

+            (word >= 0xFE30 && word <= 0xFE4F) ||

+            (word >= 0x20000 && word <= 0x2A6DF) ||

+            (word >= 0x2F800 && word <= 0x2FA1F)) {

+        return TRUE;

+    }

+    if (word >= 0x3000 && word <= 0x303F) {

+        if (word == 0x3005 || word == 0x3006 || word == 0x3021 || word == 0x3022 ||

+                word == 0x3023 || word == 0x3024 || word == 0x3025 || word == 0x3026 ||

+                word == 0x3027 || word == 0x3028 || word == 0x3029 || word == 0x3031 ||

+                word == 0x3032 || word == 0x3033 || word == 0x3034 || word == 0x3035) {

+            return TRUE;

+        }

+        return FALSE;

+    }

+    if (word >= 0xFF66 && word <= 0xFF9D) {

+        return TRUE;

+    }

+    return FALSE;

+}

+static FX_BOOL IsPunctuation(FX_DWORD word)

+{

+    if (word <= 0x007F) {

+        if ((special_chars[word] >> 3) & 1) {

+            return TRUE;

+        }

+    } else if (word >= 0x0080 && word <= 0x00FF) {

+        if (word == 0x0082 || word == 0x0084 || word == 0x0085 || word == 0x0091 ||

+                word == 0x0092 || word == 0x0093 || word <= 0x0094 || word == 0x0096 ||

+                word == 0x00B4 || word == 0x00B8) {

+            return TRUE;

+        }

+    } else if (word >= 0x2000 && word <= 0x206F) {

+        if (word == 0x2010 || word == 0x2011 || word == 0x2012 || word == 0x2013 ||

+                word == 0x2018 || word == 0x2019 || word == 0x201A || word == 0x201B ||

+                word == 0x201C || word == 0x201D || word == 0x201E || word == 0x201F ||

+                word == 0x2032 || word == 0x2033 || word == 0x2034 || word == 0x2035 ||

+                word == 0x2036 || word == 0x2037 || word == 0x203C || word == 0x203D ||

+                word == 0x203E || word == 0x2044) {

+            return TRUE;

+        }

+    } else if (word >= 0x3000 && word <= 0x303F) {

+        if (word == 0x3001 || word == 0x3002 || word == 0x3003 || word == 0x3005 ||

+                word == 0x3009 || word == 0x300A || word == 0x300B || word == 0x300C ||

+                word == 0x300D || word == 0x300F || word == 0x300E || word == 0x3010 ||

+                word == 0x3011 || word == 0x3014 || word == 0x3015 || word == 0x3016 ||

+                word == 0x3017 || word == 0x3018 || word == 0x3019 || word == 0x301A ||

+                word == 0x301B || word == 0x301D || word == 0x301E || word == 0x301F) {

+            return TRUE;

+        }

+    } else if (word >= 0xFE50 && word <= 0xFE6F) {

+        if ((word >= 0xFE50 && word <= 0xFE5E) || word == 0xFE63) {

+            return TRUE;

+        }

+    } else if (word >= 0xFF00 && word <= 0xFFEF) {

+        if (word == 0xFF01 || word == 0xFF02 || word == 0xFF07 || word == 0xFF08 ||

+                word == 0xFF09 || word == 0xFF0C || word == 0xFF0E || word == 0xFF0F ||

+                word == 0xFF1A || word == 0xFF1B || word == 0xFF1F || word == 0xFF3B ||

+                word == 0xFF3D || word == 0xFF40 || word == 0xFF5B || word == 0xFF5C ||

+                word == 0xFF5D || word == 0xFF61 || word == 0xFF62 || word == 0xFF63 ||

+                word == 0xFF64 || word == 0xFF65 || word == 0xFF9E || word == 0xFF9F) {

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+static FX_BOOL IsConnectiveSymbol(FX_DWORD word)

+{

+    if (word <= 0x007F) {

+        if ((special_chars[word] >> 5) & 1) {

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+static FX_BOOL IsOpenStylePunctuation(FX_DWORD word)

+{

+    if (word <= 0x007F) {

+        if ((special_chars[word] >> 2) & 1) {

+            return TRUE;

+        }

+    } else if (word == 0x300A || word == 0x300C || word == 0x300E || word == 0x3010 ||

+               word == 0x3014 || word == 0x3016 || word == 0x3018 || word == 0x301A ||

+               word == 0xFF08 || word == 0xFF3B || word == 0xFF5B || word == 0xFF62) {

+        return TRUE;

+    }

+    return FALSE;

+}

+static FX_BOOL IsCurrencySymbol(FX_WORD word)

+{

+    if (word == 0x0024 || word == 0x0080 || word == 0x00A2 || word == 0x00A3 ||

+            word == 0x00A4 || word == 0x00A5 || (word >= 0x20A0 && word <= 0x20CF) ||

+            word == 0xFE69 || word == 0xFF04 || word == 0xFFE0 || word == 0xFFE1 ||

+            word == 0xFFE5 || word == 0xFFE6) {

+        return TRUE;

+    }

+    return FALSE;

+}

+static FX_BOOL IsPrefixSymbol(FX_WORD word)

+{

+    if (IsCurrencySymbol(word)) {

+        return TRUE;

+    }

+    if (word == 0x2116) {

+        return TRUE;

+    }

+    return FALSE;

+}

+static FX_BOOL IsSpace(FX_WORD word)

+{

+    return (word == 0x0020 || word == 0x3000) ? TRUE : FALSE;

+}

+static FX_BOOL NeedDivision(FX_WORD prevWord, FX_WORD curWord)

+{

+    if ((IsLatin(prevWord) || IsDigit(prevWord)) && (IsLatin(curWord) || IsDigit(curWord))) {

+        return FALSE;

+    } else if (IsSpace(curWord) || IsPunctuation(curWord)) {

+        return FALSE;

+    } else if (IsConnectiveSymbol(prevWord) || IsConnectiveSymbol(curWord)) {

+        return FALSE;

+    } else if (IsSpace(prevWord) || IsPunctuation(prevWord)) {

+        return TRUE;

+    } else if (IsPrefixSymbol(prevWord)) {

+        return FALSE;

+    } else if (IsPrefixSymbol(curWord) || IsCJK(curWord)) {

+        return TRUE;

+    } else if (IsCJK(prevWord)) {

+        return TRUE;

+    }

+    return FALSE;

+}

+void CTypeset::SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize)

+{

+    ASSERT(m_pVT != NULL);

+    ASSERT(m_pSection != NULL);

+    FX_INT32 nLineHead = 0;

+    FX_INT32 nLineTail = 0;

+    FX_FLOAT fMaxX = 0.0f, fMaxY = 0.0f;

+    FX_FLOAT fLineWidth = 0.0f, fBackupLineWidth = 0.0f;

+    FX_FLOAT fLineAscent = 0.0f, fBackupLineAscent = 0.0f;

+    FX_FLOAT fLineDescent = 0.0f, fBackupLineDescent = 0.0f;

+    FX_INT32 nWordStartPos = 0;

+    FX_BOOL bFullWord = FALSE;

+    FX_INT32 nLineFullWordIndex = 0;

+    FX_INT32 nCharIndex = 0;

+    CPVT_LineInfo line;

+    FX_FLOAT fWordWidth = 0;

+    FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - m_pVT->GetLineIndent(m_pSection->m_SecInfo), 0.0f);

+    FX_INT32 nTotalWords = m_pSection->m_WordArray.GetSize();

+    FX_BOOL bOpened = FALSE;

+    if (nTotalWords > 0) {

+        FX_INT32 i = 0;

+        while (i < nTotalWords) {

+            CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(i);

+            CPVT_WordInfo* pOldWord = pWord;

+            if (i > 0) {

+                pOldWord = m_pSection->m_WordArray.GetAt(i - 1);

+            }

+            if (pWord) {

+                if (bTypeset) {

+                    fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, TRUE));

+                    fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, TRUE));

+                    fWordWidth = m_pVT->GetWordWidth(*pWord);

+                } else {

+                    fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, fFontSize));

+                    fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, fFontSize));

+                    fWordWidth = m_pVT->GetWordWidth(pWord->nFontIndex,

+                                                     pWord->Word,

+                                                     m_pVT->m_wSubWord,

+                                                     m_pVT->m_fCharSpace,

+                                                     m_pVT->m_nHorzScale,

+                                                     fFontSize,

+                                                     pWord->fWordTail,

+                                                     0);

+                }

+                if (!bOpened) {

+                    if (IsOpenStylePunctuation(pWord->Word)) {

+                        bOpened = TRUE;

+                        bFullWord = TRUE;

+                    } else if (pOldWord != NULL) {

+                        if (NeedDivision(pOldWord->Word, pWord->Word)) {

+                            bFullWord = TRUE;

+                        }

+                    }

+                } else {

+                    if (!IsSpace(pWord->Word) && !IsOpenStylePunctuation(pWord->Word)) {

+                        bOpened = FALSE;

+                    }

+                }

+                if (bFullWord) {

+                    bFullWord = FALSE;

+                    if (nCharIndex > 0) {

+                        nLineFullWordIndex ++;

+                    }

+                    nWordStartPos = i;

+                    fBackupLineWidth = fLineWidth;

+                    fBackupLineAscent = fLineAscent;

+                    fBackupLineDescent = fLineDescent;

+                }

+                nCharIndex++;

+            }

+            if (m_pVT->m_bLimitWidth && fTypesetWidth > 0 &&

+                    fLineWidth + fWordWidth > fTypesetWidth) {

+                if (nLineFullWordIndex > 0) {

+                    i = nWordStartPos;

+                    fLineWidth = fBackupLineWidth;

+                    fLineAscent = fBackupLineAscent;

+                    fLineDescent = fBackupLineDescent;

+                }

+                if (nCharIndex == 1) {

+                    fLineWidth =  fWordWidth;

+                    i++;

+                }

+                nLineTail = i - 1;

+                if (bTypeset) {

+                    line.nBeginWordIndex = nLineHead;

+                    line.nEndWordIndex = nLineTail;

+                    line.nTotalWord = nLineTail - nLineHead + 1;

+                    line.fLineWidth = fLineWidth;

+                    line.fLineAscent = fLineAscent;

+                    line.fLineDescent = fLineDescent;

+                    m_pSection->AddLine(line);

+                }

+                fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo));

+                fMaxY += (-fLineDescent);

+                fMaxX = FPDF_MAX(fLineWidth, fMaxX);

+                nLineHead = i;

+                fLineWidth = 0.0f;

+                fLineAscent = 0.0f;

+                fLineDescent = 0.0f;

+                nCharIndex = 0;

+                nLineFullWordIndex = 0;

+                bFullWord = FALSE;

+            } else {

+                fLineWidth += fWordWidth;

+                i++;

+            }

+        }

+        if (nLineHead <= nTotalWords - 1) {

+            nLineTail = nTotalWords - 1;

+            if (bTypeset) {

+                line.nBeginWordIndex = nLineHead;

+                line.nEndWordIndex = nLineTail;

+                line.nTotalWord = nLineTail - nLineHead + 1;

+                line.fLineWidth = fLineWidth;

+                line.fLineAscent = fLineAscent;

+                line.fLineDescent = fLineDescent;

+                m_pSection->AddLine(line);

+            }

+            fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo));

+            fMaxY += (-fLineDescent);

+            fMaxX = FPDF_MAX(fLineWidth, fMaxX);

+        }

+    } else {

+        if (bTypeset) {

+            fLineAscent = m_pVT->GetLineAscent(m_pSection->m_SecInfo);

+            fLineDescent = m_pVT->GetLineDescent(m_pSection->m_SecInfo);

+        } else {

+            fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), fFontSize);

+            fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), fFontSize);

+        }

+        if (bTypeset) {

+            line.nBeginWordIndex = -1;

+            line.nEndWordIndex = -1;

+            line.nTotalWord = 0;

+            line.fLineWidth = 0;

+            line.fLineAscent = fLineAscent;

+            line.fLineDescent = fLineDescent;

+            m_pSection->AddLine(line);

+        }

+        fMaxY += (m_pVT->GetLineLeading(m_pSection->m_SecInfo) + fLineAscent + (-fLineDescent));

+    }

+    m_rcRet = CPVT_FloatRect(0, 0, fMaxX, fMaxY);

+}

+void CTypeset::OutputLines()

+{

+    ASSERT(m_pVT != NULL);

+    ASSERT(m_pSection != NULL);

+    FX_FLOAT fMinX = 0.0f, fMinY = 0.0f, fMaxX = 0.0f, fMaxY = 0.0f;

+    FX_FLOAT fPosX = 0.0f, fPosY = 0.0f;

+    FX_FLOAT fLineIndent = m_pVT->GetLineIndent(m_pSection->m_SecInfo);

+    FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - fLineIndent, 0.0f);

+    switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {

+        default:

+        case 0:

+            fMinX = 0.0f;

+            break;

+        case 1:

+            fMinX = (fTypesetWidth - m_rcRet.Width())  * PVT_HALF;

+            break;

+        case 2:

+            fMinX = fTypesetWidth - m_rcRet.Width();

+            break;

+    }

+    fMaxX = fMinX + m_rcRet.Width();

+    fMinY = 0.0f;

+    fMaxY = m_rcRet.Height();

+    FX_INT32 nTotalLines = m_pSection->m_LineArray.GetSize();

+    if (nTotalLines > 0) {

+        m_pSection->m_SecInfo.nTotalLine = nTotalLines;

+        for (FX_INT32 l = 0; l < nTotalLines; l++) {

+            if (CLine * pLine = m_pSection->m_LineArray.GetAt(l)) {

+                switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {

+                    default:

+                    case 0:

+                        fPosX = 0;

+                        break;

+                    case 1:

+                        fPosX = (fTypesetWidth - pLine->m_LineInfo.fLineWidth) * PVT_HALF;

+                        break;

+                    case 2:

+                        fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth;

+                        break;

+                }

+                fPosX += fLineIndent;

+                fPosY += m_pVT->GetLineLeading(m_pSection->m_SecInfo);

+                fPosY += pLine->m_LineInfo.fLineAscent;

+                pLine->m_LineInfo.fLineX = fPosX - fMinX;

+                pLine->m_LineInfo.fLineY = fPosY - fMinY;

+                for (FX_INT32 w = pLine->m_LineInfo.nBeginWordIndex; w <= pLine->m_LineInfo.nEndWordIndex; w++) {

+                    if (CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(w)) {

+                        pWord->fWordX = fPosX - fMinX;

+                        if (pWord->pWordProps) {

+                            switch (pWord->pWordProps->nScriptType) {

+                                default:

+                                case PVTWORD_SCRIPT_NORMAL:

+                                    pWord->fWordY = fPosY - fMinY;

+                                    break;

+                                case PVTWORD_SCRIPT_SUPER:

+                                    pWord->fWordY = fPosY - m_pVT->GetWordAscent(*pWord) - fMinY;

+                                    break;

+                                case PVTWORD_SCRIPT_SUB:

+                                    pWord->fWordY = fPosY - m_pVT->GetWordDescent(*pWord) - fMinY;

+                                    break;

+                            }

+                        } else {

+                            pWord->fWordY = fPosY - fMinY;

+                        }

+                        fPosX += m_pVT->GetWordWidth(*pWord);

+                    }

+                }

+                fPosY += (-pLine->m_LineInfo.fLineDescent);

+            }

+        }

+    }

+    m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);

+}

+CPDF_VariableText::CPDF_VariableText() :

+    m_pVTProvider(NULL),

+    m_pVTIterator(NULL),

+    m_bInitial(FALSE),

+    m_bRichText(FALSE),

+    m_bMultiLine(FALSE),

+    m_bLimitWidth(FALSE),

+    m_bAutoFontSize(FALSE),

+    m_nLimitChar(0),

+    m_nCharArray(0),

+    m_nAlignment(0),

+    m_fCharSpace(0.0f),

+    m_fWordSpace(0.0f),

+    m_fFontSize(0.0f),

+    m_nHorzScale(100),

+    m_wSubWord(0),

+    m_fLineLeading(0.0f)

+{

+}

+CPDF_VariableText::~CPDF_VariableText()

+{

+    if (m_pVTIterator) {

+        delete m_pVTIterator;

+        m_pVTIterator = NULL;

+    }

+    ResetAll();

+}

+void CPDF_VariableText::Initialize()

+{

+    if (!m_bInitial) {

+        CPVT_SectionInfo secinfo;

+        if (m_bRichText) {

+            secinfo.pSecProps = FX_NEW CPVT_SecProps(0.0f, 0.0f, 0);

+            secinfo.pWordProps = FX_NEW CPVT_WordProps(GetDefaultFontIndex(), PVT_DEFAULT_FONTSIZE, 0, 0, 0);

+        }

+        CPVT_WordPlace place;

+        place.nSecIndex = 0;

+        AddSection(place, secinfo);

+        CPVT_LineInfo lineinfo;

+        lineinfo.fLineAscent = GetFontAscent(GetDefaultFontIndex(), GetFontSize());

+        lineinfo.fLineDescent = GetFontDescent(GetDefaultFontIndex(), GetFontSize());

+        AddLine(place, lineinfo);

+        if (CSection * pSection = m_SectionArray.GetAt(0)) {

+            pSection->ResetLinePlace();

+        }

+        m_bInitial = TRUE;

+    }

+}

+void CPDF_VariableText::ResetAll()

+{

+    m_bInitial = FALSE;

+    ResetSectionArray();

+}

+CPVT_WordPlace CPDF_VariableText::InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset,

+        const CPVT_WordProps * pWordProps)

+{

+    FX_INT32 nTotlaWords = this->GetTotalWords();

+    if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) {

+        return place;

+    }

+    if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) {

+        return place;

+    }

+    CPVT_WordPlace newplace = place;

+    newplace.nWordIndex ++;

+    if (m_bRichText) {

+        CPVT_WordProps * pNewProps = pWordProps ? FX_NEW CPVT_WordProps(*pWordProps) : FX_NEW CPVT_WordProps();

+        if (pNewProps) {

+            pNewProps->nFontIndex = GetWordFontIndex(word, charset, pWordProps->nFontIndex);

+            return AddWord(newplace, CPVT_WordInfo(word, charset, -1, pNewProps));

+        }

+    } else {

+        FX_INT32 nFontIndex = GetSubWord() > 0 ? GetDefaultFontIndex() : GetWordFontIndex(word, charset, GetDefaultFontIndex());

+        return AddWord(newplace, CPVT_WordInfo(word, charset, nFontIndex, NULL));

+    }

+    return place;

+}

+CPVT_WordPlace CPDF_VariableText::InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps,

+        const CPVT_WordProps * pWordProps)

+{

+    FX_INT32 nTotlaWords = this->GetTotalWords();

+    if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) {

+        return place;

+    }

+    if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) {

+        return place;

+    }

+    if (!m_bMultiLine) {

+        return place;

+    }

+    CPVT_WordPlace wordplace = place;

+    UpdateWordPlace(wordplace);

+    CPVT_WordPlace newplace = place;

+    if (CSection * pSection = m_SectionArray.GetAt(wordplace.nSecIndex)) {

+        CPVT_WordPlace NewPlace(wordplace.nSecIndex + 1, 0, -1);

+        CPVT_SectionInfo secinfo;

+        if (m_bRichText) {

+            if (pSecProps) {

+                secinfo.pSecProps = FX_NEW CPVT_SecProps(*pSecProps);

+            }

+            if (pWordProps) {

+                secinfo.pWordProps = FX_NEW CPVT_WordProps(*pWordProps);

+            }

+        }

+        AddSection(NewPlace, secinfo);

+        newplace = NewPlace;

+        if (CSection * pNewSection = m_SectionArray.GetAt(NewPlace.nSecIndex)) {

+            for (FX_INT32 w = wordplace.nWordIndex + 1, sz = pSection->m_WordArray.GetSize(); w < sz; w++) {

+                if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(w)) {

+                    NewPlace.nWordIndex++;

+                    pNewSection->AddWord(NewPlace, *pWord);

+                }

+            }

+        }

+        ClearSectionRightWords(wordplace);

+    }

+    return newplace;

+}

+CPVT_WordPlace CPDF_VariableText::InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset,

+        const CPVT_SecProps * pSecProps, const CPVT_WordProps * pProps)

+{

+    CFX_WideString swText = text;

+    CPVT_WordPlace wp = place;

+    for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) {

+        CPVT_WordPlace oldwp = wp;

+        FX_WORD word = swText.GetAt(i);

+        switch (word) {

+            case 0x0D:

+                if (m_bMultiLine) {

+                    if (swText.GetAt(i + 1) == 0x0A) {

+                        i += 1;

+                    }

+                    wp = InsertSection(wp, pSecProps, pProps);

+                }

+                break;

+            case 0x0A:

+                if (m_bMultiLine) {

+                    if (swText.GetAt(i + 1) == 0x0D) {

+                        i += 1;

+                    }

+                    wp = InsertSection(wp, pSecProps, pProps);

+                }

+                break;

+            case 0x09:

+                word = 0x20;

+            default:

+                wp = InsertWord(wp, word, charset, pProps);

+                break;

+        }

+        if (wp == oldwp) {

+            break;

+        }

+    }

+    return wp;

+}

+CPVT_WordPlace CPDF_VariableText::DeleteWords(const CPVT_WordRange & PlaceRange)

+{

+    FX_BOOL bLastSecPos = FALSE;

+    if (CSection * pSection = m_SectionArray.GetAt(PlaceRange.EndPos.nSecIndex)) {

+        bLastSecPos = (PlaceRange.EndPos == pSection->GetEndWordPlace());

+    }

+    ClearWords(PlaceRange);

+    if (PlaceRange.BeginPos.nSecIndex != PlaceRange.EndPos.nSecIndex) {

+        ClearEmptySections(PlaceRange);

+        if (!bLastSecPos) {

+            LinkLatterSection(PlaceRange.BeginPos);

+        }

+    }

+    return PlaceRange.BeginPos;

+}

+CPVT_WordPlace CPDF_VariableText::DeleteWord(const CPVT_WordPlace & place)

+{

+    return ClearRightWord(AjustLineHeader(place, TRUE));

+}

+CPVT_WordPlace CPDF_VariableText::BackSpaceWord(const CPVT_WordPlace & place)

+{

+    return ClearLeftWord(AjustLineHeader(place, TRUE));

+}

+void CPDF_VariableText::SetText(FX_LPCWSTR text, FX_INT32 charset, const CPVT_SecProps * pSecProps,

+                                const CPVT_WordProps * pWordProps)

+{

+    DeleteWords(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));

+    CFX_WideString swText = text;

+    CPVT_WordPlace	wp(0, 0, -1);

+    CPVT_SectionInfo secinfo;

+    if (m_bRichText) {

+        if (pSecProps) {

+            secinfo.pSecProps = FX_NEW CPVT_SecProps(*pSecProps);

+        }

+        if (pWordProps) {

+            secinfo.pWordProps = FX_NEW CPVT_WordProps(*pWordProps);

+        }

+    }

+    if (CSection * pSection = m_SectionArray.GetAt(0)) {

+        pSection->m_SecInfo = secinfo;

+    }

+    FX_INT32 nCharCount = 0;

+    for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) {

+        if (m_nLimitChar > 0 && nCharCount >= m_nLimitChar) {

+            break;

+        }

+        if (m_nCharArray > 0 && nCharCount >= m_nCharArray) {

+            break;

+        }

+        FX_WORD word = swText.GetAt(i);

+        switch (word) {

+            case 0x0D:

+                if (m_bMultiLine) {

+                    if (swText.GetAt(i + 1) == 0x0A) {

+                        i += 1;

+                    }

+                    wp.nSecIndex ++;

+                    wp.nLineIndex = 0;

+                    wp.nWordIndex = -1;

+                    AddSection(wp, secinfo);

+                }

+                break;

+            case 0x0A:

+                if (m_bMultiLine) {

+                    if (swText.GetAt(i + 1) == 0x0D) {

+                        i += 1;

+                    }

+                    wp.nSecIndex ++;

+                    wp.nLineIndex = 0;

+                    wp.nWordIndex = -1;

+                    AddSection(wp, secinfo);

+                }

+                break;

+            case 0x09:

+                word = 0x20;

+            default:

+                wp = InsertWord(wp, word, charset, pWordProps);

+                break;

+        }

+        nCharCount++;

+    }

+}

+void CPDF_VariableText::UpdateWordPlace(CPVT_WordPlace & place) const

+{

+    if (place.nSecIndex < 0) {

+        place = GetBeginWordPlace();

+    }

+    if (place.nSecIndex >= m_SectionArray.GetSize()) {

+        place = GetEndWordPlace();

+    }

+    place = AjustLineHeader(place, TRUE);

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        pSection->UpdateWordPlace(place);

+    }

+}

+FX_INT32 CPDF_VariableText::WordPlaceToWordIndex(const CPVT_WordPlace & place) const

+{

+    CPVT_WordPlace newplace = place;

+    UpdateWordPlace(newplace);

+    FX_INT32 nIndex = 0;

+    FX_INT32 i = 0;

+    FX_INT32 sz = 0;

+    for (i = 0, sz = m_SectionArray.GetSize(); i < sz && i < newplace.nSecIndex; i++) {

+        if (CSection * pSection = m_SectionArray.GetAt(i)) {

+            nIndex += pSection->m_WordArray.GetSize();

+            if (i != m_SectionArray.GetSize() - 1) {

+                nIndex += PVT_RETURN_LENGTH;

+            }

+        }

+    }

+    if (i >= 0 && i < m_SectionArray.GetSize()) {

+        nIndex += newplace.nWordIndex + PVT_RETURN_LENGTH;

+    }

+    return nIndex;

+}

+CPVT_WordPlace CPDF_VariableText::WordIndexToWordPlace(FX_INT32 index) const

+{

+    CPVT_WordPlace place = GetBeginWordPlace();

+    FX_INT32 nOldIndex = 0 , nIndex = 0;

+    FX_BOOL bFind = FALSE;

+    for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++) {

+        if (CSection * pSection = m_SectionArray.GetAt(i)) {

+            nIndex += pSection->m_WordArray.GetSize();

+            if (nIndex == index) {

+                place = pSection->GetEndWordPlace();

+                bFind = TRUE;

+                break;

+            } else if (nIndex > index) {

+                place.nSecIndex = i;

+                place.nWordIndex = index - nOldIndex - 1;

+                pSection->UpdateWordPlace(place);

+                bFind = TRUE;

+                break;

+            }

+            if (i != m_SectionArray.GetSize() - 1) {

+                nIndex += PVT_RETURN_LENGTH;

+            }

+            nOldIndex = nIndex;

+        }

+    }

+    if (!bFind) {

+        place = GetEndWordPlace();

+    }

+    return place;

+}

+CPVT_WordPlace CPDF_VariableText::GetBeginWordPlace() const

+{

+    return m_bInitial ? CPVT_WordPlace(0, 0, -1) : CPVT_WordPlace();

+}

+CPVT_WordPlace CPDF_VariableText::GetEndWordPlace() const

+{

+    if (CSection * pSection = m_SectionArray.GetAt(m_SectionArray.GetSize() - 1)) {

+        return pSection->GetEndWordPlace();

+    }

+    return CPVT_WordPlace();

+}

+CPVT_WordPlace CPDF_VariableText::GetPrevWordPlace(const CPVT_WordPlace & place) const

+{

+    if( place.nSecIndex < 0) {

+        return GetBeginWordPlace();

+    }

+    if (place.nSecIndex >= m_SectionArray.GetSize()) {

+        return GetEndWordPlace();

+    }

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        if (place.WordCmp(pSection->GetBeginWordPlace()) <= 0) {

+            if (CSection * pPrevSection = m_SectionArray.GetAt(place.nSecIndex - 1)) {

+                return pPrevSection->GetEndWordPlace();

+            } else {

+                return GetBeginWordPlace();

+            }

+        } else {

+            return pSection->GetPrevWordPlace(place);

+        }

+    }

+    return place;

+}

+CPVT_WordPlace CPDF_VariableText::GetNextWordPlace(const CPVT_WordPlace & place) const

+{

+    if (place.nSecIndex < 0) {

+        return GetBeginWordPlace();

+    }

+    if (place.nSecIndex >= m_SectionArray.GetSize()) {

+        return GetEndWordPlace();

+    }

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        if (place.WordCmp(pSection->GetEndWordPlace()) >= 0) {

+            if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) {

+                return pNextSection->GetBeginWordPlace();

+            } else {

+                return GetEndWordPlace();

+            }

+        } else {

+            return pSection->GetNextWordPlace(place);

+        }

+    }

+    return place;

+}

+CPVT_WordPlace CPDF_VariableText::SearchWordPlace(const CPDF_Point & point) const

+{

+    CPDF_Point pt = OutToIn(point);

+    CPVT_WordPlace place = GetBeginWordPlace();

+    FX_INT32 nLeft = 0;

+    FX_INT32 nRight = m_SectionArray.GetSize() - 1;

+    FX_INT32 nMid = m_SectionArray.GetSize() / 2;

+    FX_BOOL bUp = TRUE;

+    FX_BOOL bDown = TRUE;

+    while (nLeft <= nRight) {

+        if (CSection * pSection = m_SectionArray.GetAt(nMid)) {

+            if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.top)) {

+                bUp = FALSE;

+            }

+            if (IsFloatBigger(pSection->m_SecInfo.rcSection.bottom, pt.y)) {

+                bDown = FALSE;

+            }

+            if (IsFloatSmaller(pt.y, pSection->m_SecInfo.rcSection.top)) {

+                nRight = nMid - 1;

+                nMid = (nLeft + nRight) / 2;

+                continue;

+            } else if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.bottom)) {

+                nLeft = nMid + 1;

+                nMid = (nLeft + nRight) / 2;

+                continue;

+            } else {

+                place = pSection->SearchWordPlace(

+                            CPDF_Point(pt.x - pSection->m_SecInfo.rcSection.left, pt.y - pSection->m_SecInfo.rcSection.top)

+                        );

+                place.nSecIndex = nMid;

+                return place;

+            }

+        } else {

+            break;

+        }

+    }

+    if (bUp) {

+        place = GetBeginWordPlace();

+    }

+    if (bDown) {

+        place = GetEndWordPlace();

+    }

+    return place;

+}

+CPVT_WordPlace CPDF_VariableText::GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const

+{

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        CPVT_WordPlace temp =  place;

+        CPDF_Point pt = OutToIn(point);

+        if (temp.nLineIndex-- > 0) {

+            return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);

+        } else {

+            if (temp.nSecIndex-- > 0) {

+                if (CSection * pLastSection = m_SectionArray.GetAt(temp.nSecIndex)) {

+                    temp.nLineIndex = pLastSection->m_LineArray.GetSize() - 1;

+                    return pLastSection->SearchWordPlace(pt.x - pLastSection->m_SecInfo.rcSection.left, temp);

+                }

+            }

+        }

+    }

+    return place;

+}

+CPVT_WordPlace CPDF_VariableText::GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const

+{

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        CPVT_WordPlace temp =  place;

+        CPDF_Point pt = OutToIn(point);

+        if (temp.nLineIndex++ < pSection->m_LineArray.GetSize() - 1) {

+            return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);

+        } else {

+            if (temp.nSecIndex++ < m_SectionArray.GetSize() - 1) {

+                if (CSection * pNextSection = m_SectionArray.GetAt(temp.nSecIndex)) {

+                    temp.nLineIndex = 0;

+                    return pNextSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);

+                }

+            }

+        }

+    }

+    return place;

+}

+CPVT_WordPlace CPDF_VariableText::GetLineBeginPlace(const CPVT_WordPlace & place) const

+{

+    return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);

+}

+CPVT_WordPlace CPDF_VariableText::GetLineEndPlace(const CPVT_WordPlace & place) const

+{

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex))

+        if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) {

+            return pLine->GetEndWordPlace();

+        }

+    return place;

+}

+CPVT_WordPlace CPDF_VariableText::GetSectionBeginPlace(const CPVT_WordPlace & place) const

+{

+    return CPVT_WordPlace(place.nSecIndex, 0, -1);

+}

+CPVT_WordPlace CPDF_VariableText::GetSectionEndPlace(const CPVT_WordPlace & place) const

+{

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        return pSection->GetEndWordPlace();

+    }

+    return place;

+}

+FX_INT32 CPDF_VariableText::GetTotalWords() const

+{

+    FX_INT32 nTotal = 0;

+    for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++)

+        if (CSection * pSection = m_SectionArray.GetAt(i)) {

+            nTotal += (pSection->m_WordArray.GetSize() + PVT_RETURN_LENGTH);

+        }

+    return nTotal - PVT_RETURN_LENGTH;

+}

+void CPDF_VariableText::ResetSectionArray()

+{

+    for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {

+        delete m_SectionArray.GetAt(s);

+    }

+    m_SectionArray.RemoveAll();

+}

+CPVT_WordPlace CPDF_VariableText::AddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo)

+{

+    if (IsValid() && !m_bMultiLine) {

+        return place;

+    }

+    FX_INT32 nSecIndex = FPDF_MAX(FPDF_MIN(place.nSecIndex, m_SectionArray.GetSize()), 0);

+    CSection * pSection = FX_NEW CSection(this);

+    if (!pSection) {

+        return place;

+    }

+    pSection->m_SecInfo = secinfo;

+    pSection->SecPlace.nSecIndex = nSecIndex;

+    if (nSecIndex == m_SectionArray.GetSize()) {

+        m_SectionArray.Add(pSection);

+    } else {

+        m_SectionArray.InsertAt(nSecIndex, pSection);

+    }

+    return place;

+}

+CPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo)

+{

+    if (m_SectionArray.IsEmpty()) {

+        return place;

+    }

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        return pSection->AddLine(lineinfo);

+    }

+    return place;

+}

+CPVT_WordPlace CPDF_VariableText::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)

+{

+    if (m_SectionArray.GetSize() <= 0) {

+        return place;

+    }

+    CPVT_WordPlace newplace = place;

+    newplace.nSecIndex = FPDF_MAX(FPDF_MIN(newplace.nSecIndex, m_SectionArray.GetSize() - 1), 0);

+    if (CSection * pSection = m_SectionArray.GetAt(newplace.nSecIndex)) {

+        return pSection->AddWord(newplace, wordinfo);

+    }

+    return place;

+}

+FX_BOOL CPDF_VariableText::GetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo)

+{

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) {

+            wordinfo = *pWord;

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_VariableText::SetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)

+{

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) {

+            *pWord = wordinfo;

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_VariableText::GetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo)

+{

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) {

+            lineinfo = pLine->m_LineInfo;

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_VariableText::GetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo)

+{

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        secinfo = pSection->m_SecInfo;

+        return TRUE;

+    }

+    return FALSE;

+}

+CPDF_Rect CPDF_VariableText::GetContentRect() const

+{

+    return InToOut(CPDF_EditContainer::GetContentRect());

+}

+FX_FLOAT CPDF_VariableText::GetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)

+{

+    return m_bRichText && WordInfo.pWordProps ? (WordInfo.pWordProps->nScriptType == PVTWORD_SCRIPT_NORMAL || bFactFontSize ? WordInfo.pWordProps->fFontSize : WordInfo.pWordProps->fFontSize * PVT_HALF) : GetFontSize();

+}

+FX_INT32 CPDF_VariableText::GetWordFontIndex(const CPVT_WordInfo & WordInfo)

+{

+    return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nFontIndex : WordInfo.nFontIndex;

+}

+FX_FLOAT CPDF_VariableText::GetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord,

+        FX_FLOAT fCharSpace, FX_INT32 nHorzScale,

+        FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle)

+{

+    return (GetCharWidth(nFontIndex, Word, SubWord, nWordStyle) * fFontSize * PVT_FONTSCALE + fCharSpace) * nHorzScale * PVT_PERCENT + fWordTail;

+}

+FX_FLOAT CPDF_VariableText::GetWordWidth(const CPVT_WordInfo & WordInfo)

+{

+    return GetWordWidth(GetWordFontIndex(WordInfo), WordInfo.Word, GetSubWord(), GetCharSpace(WordInfo), GetHorzScale(WordInfo),

+                        GetWordFontSize(WordInfo), WordInfo.fWordTail,

+                        WordInfo.pWordProps ? WordInfo.pWordProps->nWordStyle : 0);

+}

+FX_FLOAT CPDF_VariableText::GetLineAscent(const CPVT_SectionInfo & SecInfo)

+{

+    return m_bRichText && SecInfo.pWordProps ? GetFontAscent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) :

+           GetFontAscent(GetDefaultFontIndex(), GetFontSize());

+}

+FX_FLOAT CPDF_VariableText::GetLineDescent(const CPVT_SectionInfo & SecInfo)

+{

+    return m_bRichText && SecInfo.pWordProps ? GetFontDescent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) :

+           GetFontDescent(GetDefaultFontIndex(), GetFontSize());

+}

+FX_FLOAT CPDF_VariableText::GetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize)

+{

+    return (FX_FLOAT)GetTypeAscent(nFontIndex) * fFontSize * PVT_FONTSCALE;

+}

+FX_FLOAT CPDF_VariableText::GetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize)

+{

+    return (FX_FLOAT)GetTypeDescent(nFontIndex) * fFontSize * PVT_FONTSCALE;

+}

+FX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize)

+{

+    return GetFontAscent(GetWordFontIndex(WordInfo), fFontSize);

+}

+FX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize)

+{

+    return GetFontDescent(GetWordFontIndex(WordInfo), fFontSize);

+}

+FX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)

+{

+    return GetFontAscent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize));

+}

+FX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)

+{

+    return GetFontDescent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize));

+}

+FX_FLOAT CPDF_VariableText::GetLineLeading(const CPVT_SectionInfo & SecInfo)

+{

+    return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineLeading : m_fLineLeading;

+}

+FX_FLOAT CPDF_VariableText::GetLineIndent(const CPVT_SectionInfo & SecInfo)

+{

+    return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineIndent : 0.0f;

+}

+FX_INT32 CPDF_VariableText::GetAlignment(const CPVT_SectionInfo& SecInfo)

+{

+    return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->nAlignment : this->m_nAlignment;

+}

+FX_FLOAT CPDF_VariableText::GetCharSpace(const CPVT_WordInfo & WordInfo)

+{

+    return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->fCharSpace : m_fCharSpace;

+}

+FX_INT32 CPDF_VariableText::GetHorzScale(const CPVT_WordInfo & WordInfo)

+{

+    return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nHorzScale : m_nHorzScale;

+}

+void CPDF_VariableText::ClearSectionRightWords(const CPVT_WordPlace & place)

+{

+    CPVT_WordPlace wordplace = AjustLineHeader(place, TRUE);

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        for (FX_INT32 w = pSection->m_WordArray.GetSize() - 1; w > wordplace.nWordIndex; w--) {

+            delete pSection->m_WordArray.GetAt(w);

+            pSection->m_WordArray.RemoveAt(w);

+        }

+    }

+}

+CPVT_WordPlace CPDF_VariableText::AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const

+{

+    if (place.nWordIndex < 0 && place.nLineIndex > 0) {

+        if (bPrevOrNext) {

+            return GetPrevWordPlace(place);

+        } else {

+            return GetNextWordPlace(place);

+        }

+    }

+    return place;

+}

+FX_BOOL CPDF_VariableText::ClearEmptySection(const CPVT_WordPlace & place)

+{

+    if (place.nSecIndex == 0 && m_SectionArray.GetSize() == 1) {

+        return FALSE;

+    }

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        if (pSection->m_WordArray.GetSize() == 0) {

+            delete pSection;

+            m_SectionArray.RemoveAt(place.nSecIndex);

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+void CPDF_VariableText::ClearEmptySections(const CPVT_WordRange & PlaceRange)

+{

+    CPVT_WordPlace wordplace;

+    for (FX_INT32 s = PlaceRange.EndPos.nSecIndex; s > PlaceRange.BeginPos.nSecIndex; s--) {

+        wordplace.nSecIndex = s;

+        ClearEmptySection(wordplace);

+    }

+}

+void CPDF_VariableText::LinkLatterSection(const CPVT_WordPlace & place)

+{

+    CPVT_WordPlace oldplace = AjustLineHeader(place, TRUE);

+    if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) {

+        if (CSection * pSection = m_SectionArray.GetAt(oldplace.nSecIndex)) {

+            for (FX_INT32 w = 0, sz = pNextSection->m_WordArray.GetSize(); w < sz; w++) {

+                if (CPVT_WordInfo * pWord = pNextSection->m_WordArray.GetAt(w)) {

+                    oldplace.nWordIndex ++;

+                    pSection->AddWord(oldplace, *pWord);

+                }

+            }

+        }

+        delete pNextSection;

+        m_SectionArray.RemoveAt(place.nSecIndex + 1);

+    }

+}

+void CPDF_VariableText::ClearWords(const CPVT_WordRange & PlaceRange)

+{

+    CPVT_WordRange NewRange;

+    NewRange.BeginPos = AjustLineHeader(PlaceRange.BeginPos, TRUE);

+    NewRange.EndPos = AjustLineHeader(PlaceRange.EndPos, TRUE);

+    for (FX_INT32 s = NewRange.EndPos.nSecIndex; s >= NewRange.BeginPos.nSecIndex; s--) {

+        if (CSection * pSection = m_SectionArray.GetAt(s)) {

+            pSection->ClearWords(NewRange);

+        }

+    }

+}

+CPVT_WordPlace CPDF_VariableText::ClearLeftWord(const CPVT_WordPlace & place)

+{

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        CPVT_WordPlace leftplace = this->GetPrevWordPlace(place);

+        if (leftplace != place) {

+            if (leftplace.nSecIndex != place.nSecIndex) {

+                if (pSection->m_WordArray.GetSize() == 0) {

+                    this->ClearEmptySection(place);

+                } else {

+                    this->LinkLatterSection(leftplace);

+                }

+            } else {

+                pSection->ClearWord(place);

+            }

+        }

+        return leftplace;

+    }

+    return place;

+}

+CPVT_WordPlace CPDF_VariableText::ClearRightWord(const CPVT_WordPlace & place)

+{

+    if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {

+        CPVT_WordPlace rightplace = AjustLineHeader(this->GetNextWordPlace(place), FALSE);

+        if (rightplace != place) {

+            if(rightplace.nSecIndex != place.nSecIndex) {

+                LinkLatterSection(place);

+            } else {

+                pSection->ClearWord(rightplace);

+            }

+        }

+    }

+    return place;

+}

+void CPDF_VariableText::RearrangeAll()

+{

+    Rearrange(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));

+}

+void CPDF_VariableText::RearrangePart(const CPVT_WordRange & PlaceRange)

+{

+    Rearrange(PlaceRange);

+}

+CPVT_FloatRect CPDF_VariableText::Rearrange(const CPVT_WordRange & PlaceRange)

+{

+    CPVT_FloatRect rcRet;

+    if (IsValid()) {

+        if (m_bAutoFontSize) {

+            SetFontSize(GetAutoFontSize());

+            rcRet = RearrangeSections(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));

+        } else {

+            rcRet = RearrangeSections(PlaceRange);

+        }

+    }

+    SetContentRect(rcRet);

+    return rcRet;

+}

+FX_FLOAT CPDF_VariableText::GetAutoFontSize()

+{

+    FX_INT32 nTotal = sizeof(gFontSizeSteps) / sizeof(FX_BYTE);

+    if (IsMultiLine()) {

+        nTotal /= 4;

+    }

+    if (nTotal <= 0) {

+        return 0;

+    }

+    if (GetPlateWidth() <= 0) {

+        return 0;

+    }

+    FX_INT32 nLeft = 0;

+    FX_INT32 nRight = nTotal - 1;

+    FX_INT32 nMid = nTotal / 2;

+    while (nLeft <= nRight) {

+        if (IsBigger(gFontSizeSteps[nMid])) {

+            nRight = nMid - 1;

+            nMid = (nLeft + nRight) / 2;

+            continue;

+        } else {

+            nLeft = nMid + 1;

+            nMid = (nLeft + nRight) / 2;

+            continue;

+        }

+    }

+    return (FX_FLOAT)gFontSizeSteps[nMid];

+}

+FX_BOOL	CPDF_VariableText::IsBigger(FX_FLOAT fFontSize)

+{

+    FX_BOOL bBigger =  FALSE;

+    CPVT_Size szTotal;

+    for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {

+        if (CSection * pSection = m_SectionArray.GetAt(s)) {

+            CPVT_Size size = pSection->GetSectionSize(fFontSize);

+            szTotal.x = FPDF_MAX(size.x, szTotal.x);

+            szTotal.y += size.y;

+            if (IsFloatBigger(szTotal.x, GetPlateWidth())

+                    || IsFloatBigger(szTotal.y, GetPlateHeight())

+               ) {

+                bBigger = TRUE;

+                break;

+            }

+        }

+    }

+    return bBigger;

+}

+CPVT_FloatRect CPDF_VariableText::RearrangeSections(const CPVT_WordRange & PlaceRange)

+{

+    CPVT_WordPlace place;

+    FX_FLOAT fPosY = 0;

+    FX_FLOAT fOldHeight;

+    FX_INT32 nSSecIndex = PlaceRange.BeginPos.nSecIndex;

+    FX_INT32 nESecIndex = PlaceRange.EndPos.nSecIndex;

+    CPVT_FloatRect rcRet;

+    for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {

+        place.nSecIndex = s;

+        if (CSection * pSection = m_SectionArray.GetAt(s)) {

+            pSection->SecPlace = place;

+            CPVT_FloatRect rcSec = pSection->m_SecInfo.rcSection;

+            if (s >= nSSecIndex) {

+                if (s <= nESecIndex) {

+                    rcSec = pSection->Rearrange();

+                    rcSec.top += fPosY;

+                    rcSec.bottom += fPosY;

+                } else {

+                    fOldHeight = pSection->m_SecInfo.rcSection.bottom - pSection->m_SecInfo.rcSection.top;

+                    rcSec.top = fPosY;

+                    rcSec.bottom = fPosY + fOldHeight;

+                }

+                pSection->m_SecInfo.rcSection = rcSec;

+                pSection->ResetLinePlace();

+            }

+            if (s == 0) {

+                rcRet = rcSec;

+            } else {

+                rcRet.left = FPDF_MIN(rcSec.left, rcRet.left);

+                rcRet.top = FPDF_MIN(rcSec.top, rcRet.top);

+                rcRet.right = FPDF_MAX(rcSec.right, rcRet.right);

+                rcRet.bottom = FPDF_MAX(rcSec.bottom, rcRet.bottom);

+            }

+            fPosY += rcSec.Height();

+        }

+    }

+    return rcRet;

+}

+FX_INT32 CPDF_VariableText::GetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle)

+{

+    if (m_pVTProvider) {

+        if (SubWord > 0) {

+            return m_pVTProvider->GetCharWidth(nFontIndex, SubWord, nWordStyle);

+        } else {

+            return m_pVTProvider->GetCharWidth(nFontIndex, Word, nWordStyle);

+        }

+    }

+    return 0;

+}

+FX_INT32 CPDF_VariableText::GetTypeAscent(FX_INT32 nFontIndex)

+{

+    return m_pVTProvider ? m_pVTProvider->GetTypeAscent(nFontIndex) : 0;

+}

+FX_INT32 CPDF_VariableText::GetTypeDescent(FX_INT32 nFontIndex)

+{

+    return m_pVTProvider ? m_pVTProvider->GetTypeDescent(nFontIndex) : 0;

+}

+FX_INT32 CPDF_VariableText::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)

+{

+    return m_pVTProvider ? m_pVTProvider->GetWordFontIndex(word, charset, nFontIndex) : -1;

+}

+FX_INT32 CPDF_VariableText::GetDefaultFontIndex()

+{

+    return m_pVTProvider ? m_pVTProvider->GetDefaultFontIndex() : -1;

+}

+FX_BOOL	CPDF_VariableText::IsLatinWord(FX_WORD word)

+{

+    return m_pVTProvider ? m_pVTProvider->IsLatinWord(word) : FALSE;

+}

+IPDF_VariableText_Iterator * CPDF_VariableText::GetIterator()

+{

+    if (!m_pVTIterator) {

+        return m_pVTIterator = FX_NEW CPDF_VariableText_Iterator(this);

+    }

+    return m_pVTIterator;

+}

+IPDF_VariableText_Provider*	CPDF_VariableText::SetProvider(IPDF_VariableText_Provider * pProvider)

+{

+    IPDF_VariableText_Provider* pOld = m_pVTProvider;

+    m_pVTProvider = pProvider;

+    return pOld;

+}

+CPDF_VariableText_Iterator::CPDF_VariableText_Iterator(CPDF_VariableText * pVT):

+    m_pVT(pVT),

+    m_CurPos(-1, -1, -1)

+{

+}

+CPDF_VariableText_Iterator::~CPDF_VariableText_Iterator()

+{

+}

+void CPDF_VariableText_Iterator::SetAt(FX_INT32 nWordIndex)

+{

+    ASSERT(m_pVT != NULL);

+    m_CurPos = m_pVT->WordIndexToWordPlace(nWordIndex);

+}

+void CPDF_VariableText_Iterator::SetAt(const CPVT_WordPlace & place)

+{

+    ASSERT(m_pVT != NULL);

+    m_CurPos = place;

+}

+FX_BOOL	CPDF_VariableText_Iterator::NextWord()

+{

+    ASSERT(m_pVT != NULL);

+    if (m_CurPos == m_pVT->GetEndWordPlace()) {

+        return FALSE;

+    }

+    m_CurPos = m_pVT->GetNextWordPlace(m_CurPos);

+    return TRUE;

+}

+FX_BOOL	CPDF_VariableText_Iterator::PrevWord()

+{

+    ASSERT(m_pVT != NULL);

+    if (m_CurPos == m_pVT->GetBeginWordPlace()) {

+        return FALSE;

+    }

+    m_CurPos = m_pVT->GetPrevWordPlace(m_CurPos);

+    return TRUE;

+}

+FX_BOOL	CPDF_VariableText_Iterator::NextLine()

+{

+    ASSERT(m_pVT != NULL);

+    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {

+        if (m_CurPos.nLineIndex < pSection->m_LineArray.GetSize() - 1) {

+            m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex + 1, -1);

+            return TRUE;

+        } else {

+            if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) {

+                m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1);

+                return TRUE;

+            }

+        }

+    }

+    return FALSE;

+}

+FX_BOOL	CPDF_VariableText_Iterator::PrevLine()

+{

+    ASSERT(m_pVT != NULL);

+    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {

+        if (m_CurPos.nLineIndex > 0) {

+            m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex - 1, -1);

+            return TRUE;

+        } else {

+            if (m_CurPos.nSecIndex > 0) {

+                if (CSection * pLastSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex - 1)) {

+                    m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, pLastSection->m_LineArray.GetSize() - 1, -1);

+                    return TRUE;

+                }

+            }

+        }

+    }

+    return FALSE;

+}

+FX_BOOL	CPDF_VariableText_Iterator::NextSection()

+{

+    ASSERT(m_pVT != NULL);

+    if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) {

+        m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1);

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL	CPDF_VariableText_Iterator::PrevSection()

+{

+    ASSERT(m_pVT != NULL);

+    if (m_CurPos.nSecIndex > 0) {

+        m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, 0, -1);

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL	CPDF_VariableText_Iterator::GetWord(CPVT_Word & word) const

+{

+    ASSERT(m_pVT != NULL);

+    word.WordPlace = m_CurPos;

+    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {

+        if (CLine * pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {

+            if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {

+                word.Word = pWord->Word;

+                word.nCharset = pWord->nCharset;

+                word.fWidth = m_pVT->GetWordWidth(*pWord);

+                word.ptWord = m_pVT->InToOut(

+                                  CPDF_Point(pWord->fWordX + pSection->m_SecInfo.rcSection.left,

+                                             pWord->fWordY + pSection->m_SecInfo.rcSection.top) );

+                word.fAscent = m_pVT->GetWordAscent(*pWord);

+                word.fDescent = m_pVT->GetWordDescent(*pWord);

+                if (pWord->pWordProps) {

+                    word.WordProps = *pWord->pWordProps;

+                }

+                word.nFontIndex = m_pVT->GetWordFontIndex(*pWord);

+                word.fFontSize = m_pVT->GetWordFontSize(*pWord);

+                return TRUE;

+            }

+        }

+    }

+    return FALSE;

+}

+FX_BOOL	CPDF_VariableText_Iterator::SetWord(const CPVT_Word & word)

+{

+    ASSERT(m_pVT != NULL);

+    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {

+        if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {

+            if (pWord->pWordProps) {

+                *pWord->pWordProps = word.WordProps;

+            }

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_BOOL	CPDF_VariableText_Iterator::GetLine(CPVT_Line & line) const

+{

+    ASSERT(m_pVT != NULL);

+    line.lineplace = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex, -1);

+    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {

+        if (CLine * pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {

+            line.ptLine = m_pVT->InToOut(

+                              CPDF_Point(pLine->m_LineInfo.fLineX + pSection->m_SecInfo.rcSection.left,

+                                         pLine->m_LineInfo.fLineY + pSection->m_SecInfo.rcSection.top) );

+            line.fLineWidth = pLine->m_LineInfo.fLineWidth;

+            line.fLineAscent = pLine->m_LineInfo.fLineAscent;

+            line.fLineDescent = pLine->m_LineInfo.fLineDescent;

+            line.lineEnd = pLine->GetEndWordPlace();

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_BOOL	CPDF_VariableText_Iterator::GetSection(CPVT_Section & section) const

+{

+    ASSERT(m_pVT != NULL);

+    section.secplace = CPVT_WordPlace(m_CurPos.nSecIndex, 0, -1);

+    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {

+        section.rcSection = m_pVT->InToOut(pSection->m_SecInfo.rcSection);

+        if (pSection->m_SecInfo.pSecProps) {

+            section.SecProps = *pSection->m_SecInfo.pSecProps;

+        }

+        if (pSection->m_SecInfo.pWordProps) {

+            section.WordProps = *pSection->m_SecInfo.pWordProps;

+        }

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL	CPDF_VariableText_Iterator::SetSection(const CPVT_Section & section)

+{

+    ASSERT(m_pVT != NULL);

+    if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {

+        if (pSection->m_SecInfo.pSecProps) {

+            *pSection->m_SecInfo.pSecProps = section.SecProps;

+        }

+        if (pSection->m_SecInfo.pWordProps) {

+            *pSection->m_SecInfo.pWordProps = section.WordProps;

+        }

+        return TRUE;

+    }

+    return FALSE;

+}

diff --git a/core/src/fpdfdoc/doc_vtmodule.cpp b/core/src/fpdfdoc/doc_vtmodule.cpp
new file mode 100644
index 0000000..8bc4e7b
--- /dev/null
+++ b/core/src/fpdfdoc/doc_vtmodule.cpp
@@ -0,0 +1,17 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfdoc/fpdf_doc.h"

+#include "../../include/fpdfdoc/fpdf_vt.h"

+#include "pdf_vt.h"

+IPDF_VariableText* IPDF_VariableText::NewVariableText()

+{

+    return FX_NEW CPDF_VariableText();

+}

+void IPDF_VariableText::DelVariableText(IPDF_VariableText* pVT)

+{

+    delete (CPDF_VariableText*)pVT;

+}

diff --git a/core/src/fpdfdoc/pdf_vt.h b/core/src/fpdfdoc/pdf_vt.h
new file mode 100644
index 0000000..fc1af04
--- /dev/null
+++ b/core/src/fpdfdoc/pdf_vt.h
@@ -0,0 +1,642 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#define _PDF_VT_H_

+class CPVT_Size;

+class CPVT_FloatRect;

+struct CPVT_SectionInfo;

+struct CPVT_LineInfo;

+struct CPVT_WordInfo;

+class CLine;

+class CLines;

+class CSection;

+class CTypeset;

+class CPDF_EditContainer;

+class CPDF_VariableText;

+class CPDF_VariableText_Iterator;

+#define IsFloatZero(f)						((f) < 0.0001 && (f) > -0.0001)

+#define IsFloatBigger(fa,fb)				((fa) > (fb) && !IsFloatZero((fa) - (fb)))

+#define IsFloatSmaller(fa,fb)				((fa) < (fb) && !IsFloatZero((fa) - (fb)))

+template<class T> T FPDF_MIN (const T & i, const T & j)

+{

+    return ((i < j) ? i : j);

+}

+template<class T> T FPDF_MAX (const T & i, const T & j)

+{

+    return ((i > j) ? i : j);

+}

+class CPVT_Size

+{

+public:

+    CPVT_Size() : x(0.0f), y(0.0f)

+    {

+    }

+    CPVT_Size(FX_FLOAT x, FX_FLOAT y)

+    {

+        this->x = x;

+        this->y = y;

+    }

+    FX_FLOAT x, y;

+};

+class CPVT_FloatRect : public CFX_FloatRect

+{

+public:

+    CPVT_FloatRect()

+    {

+        left = top = right = bottom = 0.0f;

+    }

+    CPVT_FloatRect(FX_FLOAT left, FX_FLOAT top,

+                   FX_FLOAT right, FX_FLOAT bottom)

+    {

+        this->left = left;

+        this->top = top;

+        this->right = right;

+        this->bottom = bottom;

+    }

+    CPVT_FloatRect(const CPDF_Rect & rect)

+    {

+        this->left = rect.left;

+        this->top = rect.top;

+        this->right = rect.right;

+        this->bottom = rect.bottom;

+    }

+    void Default()

+    {

+        left = top = right = bottom = 0.0f;

+    }

+    FX_FLOAT Height() const

+    {

+        if(this->top > this->bottom) {

+            return this->top - this->bottom;

+        } else {

+            return this->bottom - this->top;

+        }

+    }

+};

+struct CPVT_SectionInfo {

+    CPVT_SectionInfo() : rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL)

+    {

+    }

+    virtual ~CPVT_SectionInfo()

+    {

+        if (pSecProps) {

+            delete pSecProps;

+        }

+        if (pWordProps) {

+            delete pWordProps;

+        }

+    }

+    CPVT_SectionInfo(const CPVT_SectionInfo & other): rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL)

+    {

+        operator = (other);

+    }

+    void operator = (const CPVT_SectionInfo & other)

+    {

+        if (this == &other) {

+            return;

+        }

+        this->rcSection = other.rcSection;

+        this->nTotalLine = other.nTotalLine;

+        if (other.pSecProps) {

+            if (pSecProps) {

+                *pSecProps = *other.pSecProps;

+            } else {

+                pSecProps = FX_NEW CPVT_SecProps(*other.pSecProps);

+            }

+        }

+        if (other.pWordProps) {

+            if (pWordProps) {

+                *pWordProps = *other.pWordProps;

+            } else {

+                pWordProps = FX_NEW CPVT_WordProps(*other.pWordProps);

+            }

+        }

+    }

+    CPVT_FloatRect				rcSection;

+    FX_INT32					nTotalLine;

+    CPVT_SecProps*				pSecProps;

+    CPVT_WordProps*				pWordProps;

+};

+struct CPVT_LineInfo {

+    CPVT_LineInfo() : nTotalWord(0), nBeginWordIndex(-1), nEndWordIndex(-1),

+        fLineX(0.0f), fLineY(0.0f), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f)

+    {

+    }

+    FX_INT32					nTotalWord;

+    FX_INT32					nBeginWordIndex;

+    FX_INT32					nEndWordIndex;

+    FX_FLOAT					fLineX;

+    FX_FLOAT					fLineY;

+    FX_FLOAT					fLineWidth;

+    FX_FLOAT					fLineAscent;

+    FX_FLOAT					fLineDescent;

+};

+struct CPVT_WordInfo : public CFX_Object {

+    CPVT_WordInfo() : Word(0), nCharset(0),

+        fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f), nFontIndex(-1), pWordProps(NULL)

+    {

+    }

+    CPVT_WordInfo(FX_WORD word, FX_INT32 charset, FX_INT32 fontIndex, CPVT_WordProps * pProps):

+        Word(word), nCharset(charset), fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f),

+        nFontIndex(fontIndex), pWordProps(pProps)

+    {

+    }

+    virtual ~CPVT_WordInfo()

+    {

+        if (pWordProps) {

+            delete pWordProps;

+        }

+    }

+    CPVT_WordInfo(const CPVT_WordInfo & word): Word(0), nCharset(0),

+        fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f), nFontIndex(-1), pWordProps(NULL)

+    {

+        operator = (word);

+    }

+    void operator = (const CPVT_WordInfo & word)

+    {

+        if (this == &word) {

+            return;

+        }

+        this->Word = word.Word;

+        this->nCharset = word.nCharset;

+        this->nFontIndex = word.nFontIndex;

+        if (word.pWordProps) {

+            if (pWordProps) {

+                *pWordProps = *word.pWordProps;

+            } else {

+                pWordProps = FX_NEW CPVT_WordProps(*word.pWordProps);

+            }

+        }

+    }

+    FX_WORD						Word;

+    FX_INT32					nCharset;

+    FX_FLOAT					fWordX;

+    FX_FLOAT					fWordY;

+    FX_FLOAT					fWordTail;

+    FX_INT32					nFontIndex;

+    CPVT_WordProps*				pWordProps;

+};

+struct CPVT_FloatRange {

+    CPVT_FloatRange() : fMin(0.0f), fMax(0.0f)

+    {

+    }

+    CPVT_FloatRange(FX_FLOAT min, FX_FLOAT max) : fMin(min), fMax(max)

+    {

+    }

+    FX_FLOAT Range() const

+    {

+        return fMax - fMin;

+    }

+    FX_FLOAT fMin, fMax;

+};

+template<class TYPE> class CPVT_ArrayTemplate : public CFX_ArrayTemplate<TYPE>

+{

+public:

+    FX_BOOL IsEmpty()

+    {

+        return CFX_ArrayTemplate<TYPE>::GetSize() <= 0;

+    }

+    TYPE GetAt(int nIndex) const

+    {

+        if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {

+            return CFX_ArrayTemplate<TYPE>::GetAt(nIndex);

+        }

+        return NULL;

+    }

+    void RemoveAt(int nIndex)

+    {

+        if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {

+            CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex);

+        }

+    }

+};

+class CLine : public CFX_Object

+{

+public:

+    CLine();

+    virtual ~CLine();

+    CPVT_WordPlace							GetBeginWordPlace() const;

+    CPVT_WordPlace							GetEndWordPlace() const;

+    CPVT_WordPlace							GetPrevWordPlace(const CPVT_WordPlace & place) const;

+    CPVT_WordPlace							GetNextWordPlace(const CPVT_WordPlace & place) const;

+    CPVT_WordPlace							LinePlace;

+    CPVT_LineInfo							m_LineInfo;

+};

+class CLines

+{

+public:

+    CLines() : m_nTotal(0) {}

+    virtual ~CLines()

+    {

+        RemoveAll();

+    }

+    FX_INT32								GetSize() const

+    {

+        return m_Lines.GetSize();

+    }

+    CLine *									GetAt(FX_INT32 nIndex) const

+    {

+        return m_Lines.GetAt(nIndex);

+    }

+    void									Empty()

+    {

+        m_nTotal = 0;

+    }

+    void									RemoveAll()

+    {

+        for (FX_INT32 i = 0, sz = GetSize(); i < sz; i++) {

+            delete GetAt(i);

+        }

+        m_Lines.RemoveAll();

+        m_nTotal = 0;

+    }

+    FX_INT32								Add(const CPVT_LineInfo & lineinfo)

+    {

+        if (m_nTotal >= GetSize()) {

+            if (CLine * pLine = FX_NEW CLine) {

+                pLine->m_LineInfo = lineinfo;

+                m_Lines.Add(pLine);

+                return m_nTotal++;

+            }

+            return m_nTotal;

+        } else {

+            if (CLine * pLine = GetAt(m_nTotal)) {

+                pLine->m_LineInfo = lineinfo;

+            }

+            return m_nTotal++;

+        }

+    }

+    void									Clear()

+    {

+        for (FX_INT32 i = GetSize() - 1; i >= m_nTotal; i--) {

+            delete GetAt(i);

+            m_Lines.RemoveAt(i);

+        }

+    }

+private:

+    CPVT_ArrayTemplate<CLine*>				m_Lines;

+    FX_INT32								m_nTotal;

+};

+class CSection : public CFX_Object

+{

+    friend class CTypeset;

+public:

+    CSection(CPDF_VariableText * pVT);

+    virtual ~CSection();

+    void									ResetAll();

+    void									ResetLineArray();

+    void									ResetWordArray();

+    void									ResetLinePlace();

+    CPVT_WordPlace							AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);

+    CPVT_WordPlace							AddLine(const CPVT_LineInfo & lineinfo);

+    void									ClearWords(const CPVT_WordRange & PlaceRange);

+    void									ClearWord(const CPVT_WordPlace & place);

+    CPVT_FloatRect							Rearrange();

+    CPVT_Size								GetSectionSize(FX_FLOAT fFontSize);

+    CPVT_WordPlace							GetBeginWordPlace() const;

+    CPVT_WordPlace							GetEndWordPlace() const;

+    CPVT_WordPlace							GetPrevWordPlace(const CPVT_WordPlace & place) const;

+    CPVT_WordPlace							GetNextWordPlace(const CPVT_WordPlace & place) const;

+    void									UpdateWordPlace(CPVT_WordPlace & place) const;

+    CPVT_WordPlace							SearchWordPlace(const CPDF_Point & point) const;

+    CPVT_WordPlace							SearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const;

+    CPVT_WordPlace							SearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const;

+public:

+    CPVT_WordPlace							SecPlace;

+    CPVT_SectionInfo						m_SecInfo;

+    CLines									m_LineArray;

+    CPVT_ArrayTemplate<CPVT_WordInfo*>		m_WordArray;

+private:

+    void									ClearLeftWords(FX_INT32 nWordIndex);

+    void									ClearRightWords(FX_INT32 nWordIndex);

+    void									ClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex);

+

+    CPDF_VariableText						*m_pVT;

+};

+class CTypeset

+{

+public:

+    CTypeset(CSection * pSection);

+    virtual ~CTypeset();

+    CPVT_Size								GetEditSize(FX_FLOAT fFontSize);

+    CPVT_FloatRect							Typeset();

+    CPVT_FloatRect							CharArray();

+private:

+    void									SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize);

+    void									OutputLines();

+

+    CPVT_FloatRect							m_rcRet;

+    CPDF_VariableText						* m_pVT;

+    CSection								* m_pSection;

+};

+class CPDF_EditContainer

+{

+public:

+    CPDF_EditContainer(): m_rcPlate(0, 0, 0, 0), m_rcContent(0, 0, 0, 0) {};

+    virtual ~CPDF_EditContainer() {};

+    virtual void							SetPlateRect(const CPDF_Rect & rect)

+    {

+        m_rcPlate = rect;

+    };

+    virtual const CPDF_Rect &				GetPlateRect() const

+    {

+        return m_rcPlate;

+    };

+    virtual void							SetContentRect(const CPVT_FloatRect & rect)

+    {

+        m_rcContent = rect;

+    };

+    virtual CPDF_Rect 						GetContentRect() const

+    {

+        return m_rcContent;

+    };

+    FX_FLOAT								GetPlateWidth() const

+    {

+        return m_rcPlate.right - m_rcPlate.left;

+    };

+    FX_FLOAT								GetPlateHeight() const

+    {

+        return m_rcPlate.top - m_rcPlate.bottom;

+    };

+    CPVT_Size								GetPlateSize() const

+    {

+        return CPVT_Size(GetPlateWidth(), GetPlateHeight());

+    };

+    CPDF_Point								GetBTPoint() const

+    {

+        return CPDF_Point(m_rcPlate.left, m_rcPlate.top);

+    };

+    CPDF_Point								GetETPoint() const

+    {

+        return CPDF_Point(m_rcPlate.right, m_rcPlate.bottom);

+    };

+    inline CPDF_Point						InToOut(const CPDF_Point & point) const

+    {

+        return CPDF_Point(point.x + GetBTPoint().x, GetBTPoint().y - point.y);

+    };

+    inline CPDF_Point						OutToIn(const CPDF_Point & point) const

+    {

+        return CPDF_Point(point.x - GetBTPoint().x, GetBTPoint().y - point.y);

+    };

+    inline CPDF_Rect						InToOut(const CPVT_FloatRect & rect) const

+    {

+        CPDF_Point ptLeftTop = InToOut(CPDF_Point(rect.left, rect.top));

+        CPDF_Point ptRightBottom = InToOut(CPDF_Point(rect.right, rect.bottom));

+        return CPDF_Rect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, ptLeftTop.y);

+    };

+    inline CPVT_FloatRect					OutToIn(const CPDF_Rect & rect) const

+    {

+        CPDF_Point ptLeftTop = OutToIn(CPDF_Point(rect.left, rect.top));

+        CPDF_Point ptRightBottom = OutToIn(CPDF_Point(rect.right, rect.bottom));

+        return CPVT_FloatRect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x, ptRightBottom.y);

+    };

+

+private:

+    CPDF_Rect								m_rcPlate;

+    CPVT_FloatRect							m_rcContent;

+};

+class CPDF_VariableText : public IPDF_VariableText, public CFX_Object, private CPDF_EditContainer

+{

+    friend class CTypeset;

+    friend class CSection;

+    friend class CPDF_VariableText_Iterator;

+public:

+    CPDF_VariableText();

+    virtual ~CPDF_VariableText();

+    IPDF_VariableText_Provider*				SetProvider(IPDF_VariableText_Provider * pProvider);

+    IPDF_VariableText_Iterator*				GetIterator();

+    void									SetPlateRect(const CPDF_Rect & rect)

+    {

+        CPDF_EditContainer::SetPlateRect(rect);

+    }

+    void									SetAlignment(FX_INT32 nFormat = 0)

+    {

+        m_nAlignment = nFormat;

+    }

+    void									SetPasswordChar(FX_WORD wSubWord = '*')

+    {

+        m_wSubWord = wSubWord;

+    }

+    void									SetLimitChar(FX_INT32 nLimitChar = 0)

+    {

+        m_nLimitChar = nLimitChar;

+    }

+    void									SetCharSpace(FX_FLOAT fCharSpace = 0.0f)

+    {

+        m_fCharSpace = fCharSpace;

+    }

+    void									SetHorzScale(FX_INT32 nHorzScale = 100)

+    {

+        m_nHorzScale = nHorzScale;

+    }

+    void									SetMultiLine(FX_BOOL bMultiLine = TRUE)

+    {

+        m_bMultiLine = bMultiLine;

+    }

+    void									SetAutoReturn(FX_BOOL bAuto = TRUE)

+    {

+        m_bLimitWidth = bAuto;

+    }

+    void									SetFontSize(FX_FLOAT fFontSize)

+    {

+        m_fFontSize = fFontSize;

+    }

+    void									SetCharArray(FX_INT32 nCharArray = 0)

+    {

+        m_nCharArray = nCharArray;

+    }

+    void									SetAutoFontSize(FX_BOOL bAuto = TRUE)

+    {

+        m_bAutoFontSize = bAuto;

+    }

+    void									SetRichText(FX_BOOL bRichText)

+    {

+        m_bRichText = bRichText;

+    }

+    void									SetLineLeading(FX_FLOAT fLineLeading)

+    {

+        m_fLineLeading = fLineLeading;

+    }

+    void									Initialize();

+    FX_BOOL									IsValid() const

+    {

+        return m_bInitial;

+    }

+    FX_BOOL									IsRichText() const

+    {

+        return m_bRichText;

+    }

+    void									RearrangeAll();

+    void									RearrangePart(const CPVT_WordRange & PlaceRange);

+    void									ResetAll();

+    void									SetText(FX_LPCWSTR text, FX_INT32 charset = 1, const CPVT_SecProps * pSecProps = NULL,

+            const CPVT_WordProps * pWordProps = NULL);

+    CPVT_WordPlace							InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset = 1,

+            const CPVT_WordProps * pWordProps = NULL);

+    CPVT_WordPlace							InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps = NULL,

+            const CPVT_WordProps * pWordProps = NULL);

+    CPVT_WordPlace							InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset = 1,

+            const CPVT_SecProps * pSecProps = NULL,	const CPVT_WordProps * pWordProps = NULL);

+    CPVT_WordPlace							DeleteWords(const CPVT_WordRange & PlaceRange);

+    CPVT_WordPlace							DeleteWord(const CPVT_WordPlace & place);

+    CPVT_WordPlace							BackSpaceWord(const CPVT_WordPlace & place);

+    const CPDF_Rect &						GetPlateRect() const

+    {

+        return CPDF_EditContainer::GetPlateRect();

+    }

+    CPDF_Rect								GetContentRect() const;

+    FX_INT32								GetTotalWords() const;

+    FX_FLOAT								GetFontSize() const

+    {

+        return m_fFontSize;

+    }

+    FX_INT32								GetAlignment() const

+    {

+        return m_nAlignment;

+    }

+    FX_INT32								GetCharArray() const

+    {

+        return m_nCharArray;

+    }

+    FX_INT32								GetLimitChar() const

+    {

+        return m_nLimitChar;

+    }

+    FX_BOOL									IsMultiLine() const

+    {

+        return m_bMultiLine;

+    }

+    FX_INT32								GetHorzScale() const

+    {

+        return m_nHorzScale;

+    }

+    FX_FLOAT								GetCharSpace() const

+    {

+        return m_fCharSpace;

+    }

+

+    inline CPVT_WordPlace					GetBeginWordPlace() const;

+    inline CPVT_WordPlace					GetEndWordPlace() const;

+    CPVT_WordPlace							GetPrevWordPlace(const CPVT_WordPlace & place) const;

+    CPVT_WordPlace							GetNextWordPlace(const CPVT_WordPlace & place) const;

+    CPVT_WordPlace							SearchWordPlace(const CPDF_Point & point) const;

+    CPVT_WordPlace							GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const;

+    CPVT_WordPlace							GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const;

+    CPVT_WordPlace							GetLineBeginPlace(const CPVT_WordPlace & place) const;

+    CPVT_WordPlace							GetLineEndPlace(const CPVT_WordPlace & place) const;

+    CPVT_WordPlace							GetSectionBeginPlace(const CPVT_WordPlace & place) const;

+    CPVT_WordPlace							GetSectionEndPlace(const CPVT_WordPlace & place) const;

+    void									UpdateWordPlace(CPVT_WordPlace & place) const;

+    FX_INT32								WordPlaceToWordIndex(const CPVT_WordPlace & place) const;

+    CPVT_WordPlace							WordIndexToWordPlace(FX_INT32 index) const;

+    FX_WORD									GetPasswordChar() const

+    {

+        return GetSubWord();

+    }

+    FX_WORD									GetSubWord() const

+    {

+        return m_wSubWord;

+    }

+private:

+    FX_INT32								GetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle);

+    FX_INT32								GetTypeAscent(FX_INT32 nFontIndex);

+    FX_INT32								GetTypeDescent(FX_INT32 nFontIndex);

+    FX_INT32								GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);

+    FX_INT32								GetDefaultFontIndex();

+    FX_BOOL									IsLatinWord(FX_WORD word);

+private:

+

+    CPVT_WordPlace							AddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo);

+    CPVT_WordPlace							AddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo);

+    CPVT_WordPlace							AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);

+    FX_BOOL									GetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo);

+    FX_BOOL									SetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);

+    FX_BOOL									GetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo);

+    FX_BOOL									GetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo);

+    FX_FLOAT								GetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);

+    FX_FLOAT								GetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord,

+            FX_FLOAT fCharSpace, FX_INT32 nHorzScale,

+            FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle);

+    FX_FLOAT								GetWordWidth(const CPVT_WordInfo & WordInfo);

+    FX_FLOAT								GetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize);

+    FX_FLOAT								GetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize);

+    FX_FLOAT								GetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);

+    FX_FLOAT								GetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);

+    FX_FLOAT								GetLineAscent(const CPVT_SectionInfo & SecInfo);

+    FX_FLOAT								GetLineDescent(const CPVT_SectionInfo & SecInfo);

+    FX_FLOAT								GetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize);

+    FX_FLOAT								GetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize);

+    FX_INT32								GetWordFontIndex(const CPVT_WordInfo & WordInfo);

+    FX_FLOAT								GetCharSpace(const CPVT_WordInfo & WordInfo);

+    FX_INT32								GetHorzScale(const CPVT_WordInfo & WordInfo);

+    FX_FLOAT								GetLineLeading(const CPVT_SectionInfo & SecInfo);

+    FX_FLOAT								GetLineIndent(const CPVT_SectionInfo & SecInfo);

+    FX_INT32								GetAlignment(const CPVT_SectionInfo& SecInfo);

+

+    void									ClearSectionRightWords(const CPVT_WordPlace & place);

+    CPVT_WordPlace							AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const;

+    FX_BOOL									ClearEmptySection(const CPVT_WordPlace & place);

+    void									ClearEmptySections(const CPVT_WordRange & PlaceRange);

+    void									LinkLatterSection(const CPVT_WordPlace & place);

+    void									ClearWords(const CPVT_WordRange & PlaceRange);

+    CPVT_WordPlace							ClearLeftWord(const CPVT_WordPlace & place);

+    CPVT_WordPlace							ClearRightWord(const CPVT_WordPlace & place);

+private:

+    CPVT_FloatRect							Rearrange(const CPVT_WordRange & PlaceRange);

+    FX_FLOAT								GetAutoFontSize();

+    FX_BOOL									IsBigger(FX_FLOAT fFontSize);

+    CPVT_FloatRect							RearrangeSections(const CPVT_WordRange & PlaceRange);

+private:

+    void									ResetSectionArray();

+private:

+    CPVT_ArrayTemplate<CSection*>			m_SectionArray;

+    FX_INT32								m_nLimitChar;

+    FX_INT32								m_nCharArray;

+    FX_BOOL									m_bMultiLine;

+    FX_BOOL									m_bLimitWidth;

+    FX_BOOL									m_bAutoFontSize;

+    FX_INT32								m_nAlignment;

+    FX_FLOAT								m_fLineLeading;

+    FX_FLOAT								m_fCharSpace;

+    FX_INT32								m_nHorzScale;

+    FX_WORD									m_wSubWord;

+    FX_FLOAT								m_fWordSpace;

+    FX_FLOAT								m_fFontSize;

+

+private:

+    FX_BOOL									m_bInitial;

+    FX_BOOL									m_bRichText;

+    FX_FLOAT								m_fCaretOriginX;

+    FX_INT32								m_nCurFontIndex;

+    IPDF_VariableText_Provider *			m_pVTProvider;

+    CPDF_VariableText_Iterator *			m_pVTIterator;

+};

+class CPDF_VariableText_Iterator : public IPDF_VariableText_Iterator, public CFX_Object

+{

+public:

+    CPDF_VariableText_Iterator(CPDF_VariableText * pVT);

+    virtual ~CPDF_VariableText_Iterator();

+    FX_BOOL									NextWord();

+    FX_BOOL									PrevWord();

+    FX_BOOL									NextLine();

+    FX_BOOL									PrevLine();

+    FX_BOOL									NextSection();

+    FX_BOOL									PrevSection();

+    FX_BOOL									SetWord(const CPVT_Word & word);

+    FX_BOOL									GetWord(CPVT_Word & word) const;

+    FX_BOOL									GetLine(CPVT_Line & line) const;

+    FX_BOOL									GetSection(CPVT_Section & section) const;

+    FX_BOOL									SetSection(const CPVT_Section & section);

+    void									SetAt(FX_INT32 nWordIndex);

+    void									SetAt(const CPVT_WordPlace & place);

+    const CPVT_WordPlace &					GetAt() const

+    {

+        return m_CurPos;

+    };

+private:

+    CPVT_WordPlace							m_CurPos;

+    CPDF_VariableText *						m_pVT;

+};

diff --git a/core/src/fpdfdoc/tagged_int.h b/core/src/fpdfdoc/tagged_int.h
new file mode 100644
index 0000000..a343a80
--- /dev/null
+++ b/core/src/fpdfdoc/tagged_int.h
@@ -0,0 +1,91 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FPDF_TAGGED_INT_H_

+#define _FPDF_TAGGED_INT_H_

+class CPDF_StructTreeImpl;

+class CPDF_StructElementImpl;

+class CPDF_StructTreeImpl : public CPDF_StructTree

+{

+public:

+    CPDF_StructTreeImpl(const CPDF_Document* pDoc);

+    ~CPDF_StructTreeImpl();

+    int			CountTopElements() const

+    {

+        return m_Kids.GetSize();

+    }

+    CPDF_StructElement*	GetTopElement(int i) const

+    {

+        return (CPDF_StructElement*)m_Kids.GetAt(i);

+    }

+    void		LoadDocTree();

+    void		LoadPageTree(const CPDF_Dictionary* pPageDict);

+    CPDF_StructElementImpl* AddPageNode(CPDF_Dictionary* pElement, CFX_MapPtrToPtr& map, int nLevel = 0);

+    FX_BOOL		AddTopLevelNode(CPDF_Dictionary* pDict, CPDF_StructElementImpl* pElement);

+protected:

+    const CPDF_Dictionary*	m_pTreeRoot;

+    const CPDF_Dictionary*	m_pRoleMap;

+    const CPDF_Dictionary*	m_pPage;

+    CFX_ArrayTemplate<CPDF_StructElementImpl*>	m_Kids;

+    friend class CPDF_StructElementImpl;

+};

+class CPDF_StructElementImpl : public CPDF_StructElement

+{

+public:

+    CPDF_StructElementImpl(CPDF_StructTreeImpl* pTree, CPDF_StructElementImpl* pParent, CPDF_Dictionary* pDict);

+    ~CPDF_StructElementImpl();

+    CPDF_StructTree*		GetTree() const

+    {

+        return m_pTree;

+    }

+    const CFX_ByteString&	GetType() const

+    {

+        return m_Type;

+    }

+    CPDF_StructElement*		GetParent() const

+    {

+        return m_pParent;

+    }

+    CPDF_Dictionary *		GetDict() const

+    {

+        return m_pDict;

+    }

+    int						CountKids() const

+    {

+        return m_Kids.GetSize();

+    }

+    const CPDF_StructKid&	GetKid(int index) const

+    {

+        return m_Kids.GetData()[index];

+    }

+    CFX_PtrArray*			GetObjectArray()

+    {

+        return &m_ObjectArray;

+    }

+

+    CPDF_Object*			GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable = FALSE, FX_FLOAT fLevel = 0.0F);

+

+    CFX_ByteString			GetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);

+    FX_ARGB					GetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);

+    FX_FLOAT				GetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);

+    int						GetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);

+    CFX_PtrArray			m_ObjectArray;

+    void					LoadKids(CPDF_Dictionary* pDict);

+    void					LoadKid(FX_DWORD PageObjNum, CPDF_Object* pObj, CPDF_StructKid* pKid);

+    CPDF_Object*			GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, int subindex);

+    CPDF_StructElementImpl*	Retain();

+    void					Release();

+protected:

+    CPDF_StructTreeImpl*	m_pTree;

+    CFX_ByteString			m_Type;

+    CPDF_StructElementImpl*	m_pParent;

+    CPDF_Dictionary*		m_pDict;

+    CFX_ArrayTemplate<CPDF_StructKid>	m_Kids;

+

+    int			m_RefCount;

+    friend class CPDF_StructTreeImpl;

+};

+#endif

diff --git a/core/src/fpdftext/fpdf_text.cpp b/core/src/fpdftext/fpdf_text.cpp
new file mode 100644
index 0000000..2576b75
--- /dev/null
+++ b/core/src/fpdftext/fpdf_text.cpp
@@ -0,0 +1,791 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfapi/fpdf_page.h"

+#include "../../include/fpdfapi/fpdf_pageobj.h"

+#include "../../include/fpdftext/fpdf_text.h"

+#include "txtproc.h"

+#include "text_int.h"

+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)

+extern FX_LPCSTR FCS_GetAltStr(FX_WCHAR);

+CFX_ByteString CharFromUnicodeAlt(FX_WCHAR unicode, int destcp, FX_LPCSTR defchar)

+{

+    if (destcp == 0) {

+        if (unicode < 0x80) {

+            return CFX_ByteString((char)unicode);

+        }

+        FX_LPCSTR altstr = FCS_GetAltStr(unicode);

+        if (altstr) {

+            return CFX_ByteString(altstr, -1);

+        }

+        return CFX_ByteString(defchar, -1);

+    }

+    FX_BOOL bDef = FALSE;

+    char buf[10];

+    int ret = FXSYS_WideCharToMultiByte(destcp, 0, (wchar_t*)&unicode, 1, buf, 10, NULL, &bDef);

+    if (ret && !bDef) {

+        return CFX_ByteString(buf, ret);

+    }

+    FX_LPCSTR altstr = FCS_GetAltStr(unicode);

+    if (altstr) {

+        return CFX_ByteString(altstr, -1);

+    }

+    return CFX_ByteString(defchar, -1);

+}

+CTextPage::CTextPage()

+{

+}

+CTextPage::~CTextPage()

+{

+    int i;

+    for (i = 0; i < m_BaseLines.GetSize(); i ++) {

+        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);

+        delete pBaseLine;

+    }

+    for (i = 0; i < m_TextColumns.GetSize(); i ++) {

+        CTextColumn* pTextColumn = (CTextColumn*)m_TextColumns.GetAt(i);

+        delete pTextColumn;

+    }

+}

+void CTextPage::ProcessObject(CPDF_PageObject* pObject)

+{

+    if (pObject->m_Type != PDFPAGE_TEXT) {

+        return;

+    }

+    CPDF_TextObject* pText = (CPDF_TextObject*)pObject;

+    CPDF_Font* pFont = pText->m_TextState.GetFont();

+    int count = pText->CountItems();

+    FX_FLOAT* pPosArray = FX_Alloc(FX_FLOAT, count * 2);

+    if (pPosArray) {

+        pText->CalcCharPos(pPosArray);

+    }

+    FX_FLOAT fontsize_h = pText->m_TextState.GetFontSizeH();

+    FX_FLOAT fontsize_v = pText->m_TextState.GetFontSizeV();

+    FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');

+    FX_FLOAT spacew = 0;

+    if (space_charcode != -1) {

+        spacew = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000;

+    }

+    if (spacew == 0) {

+        spacew = fontsize_h / 4;

+    }

+    if (pText->m_TextState.GetBaselineAngle() != 0) {

+        int cc = 0;

+        CFX_AffineMatrix matrix;

+        pText->GetTextMatrix(&matrix);

+        for (int i = 0; i < pText->m_nChars; i ++) {

+            FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pText->m_pCharCodes : pText->m_pCharCodes[i];

+            if (charcode == (FX_DWORD) - 1) {

+                continue;

+            }

+            FX_RECT char_box;

+            pFont->GetCharBBox(charcode, char_box);

+            FX_FLOAT char_left = pPosArray ? pPosArray[cc * 2] : char_box.left * pText->m_TextState.GetFontSize() / 1000;

+            FX_FLOAT char_right = pPosArray ? pPosArray[cc * 2 + 1] : char_box.right * pText->m_TextState.GetFontSize() / 1000;

+            FX_FLOAT char_top = char_box.top * pText->m_TextState.GetFontSize() / 1000;

+            FX_FLOAT char_bottom = char_box.bottom * pText->m_TextState.GetFontSize() / 1000;

+            cc ++;

+            FX_FLOAT char_origx, char_origy;

+            matrix.Transform(char_left, 0, char_origx, char_origy);

+            matrix.TransformRect(char_left, char_right, char_top, char_bottom);

+            CFX_ByteString str;

+            pFont->AppendChar(str, charcode);

+            InsertTextBox(NULL, char_origy, char_left, char_right, char_top,

+                          char_bottom, spacew, fontsize_v, str, pFont);

+        }

+        if (pPosArray) {

+            FX_Free(pPosArray);

+        }

+        return;

+    }

+    FX_FLOAT ratio_h = fontsize_h / pText->m_TextState.GetFontSize();

+    for (int ii = 0; ii < count * 2; ii ++) {

+        pPosArray[ii] *= ratio_h;

+    }

+    FX_FLOAT baseline = pText->m_PosY;

+    CTextBaseLine* pBaseLine = NULL;

+    FX_FLOAT topy = pText->m_Top;

+    FX_FLOAT bottomy = pText->m_Bottom;

+    FX_FLOAT leftx = pText->m_Left;

+    int cc = 0;

+    CFX_ByteString segment;

+    int space_count = 0;

+    FX_FLOAT last_left = 0, last_right = 0, segment_left = 0, segment_right = 0;

+    for (int i = 0; i < pText->m_nChars; i ++) {

+        FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pText->m_pCharCodes : pText->m_pCharCodes[i];

+        if (charcode == (FX_DWORD) - 1) {

+            continue;

+        }

+        FX_FLOAT char_left = pPosArray[cc * 2];

+        FX_FLOAT char_right = pPosArray[cc * 2 + 1];

+        cc ++;

+        if (char_left < last_left || (char_left - last_right) > spacew / 2) {

+            pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,

+                                      topy, bottomy, spacew, fontsize_v, segment, pFont);

+            segment_left = char_left;

+            segment = "";

+        }

+        CFX_WideString wCh = pText->GetFont()->UnicodeFromCharCode(charcode);

+        FX_DWORD ch = wCh.GetLength() > 0 ? wCh.GetAt(0) : charcode;

+        if (space_count > 1) {

+            pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,

+                                      topy, bottomy, spacew, fontsize_v, segment, pFont);

+            segment = "";

+        } else if (space_count == 1) {

+            pFont->AppendChar(segment, ' ');

+        }

+        if (segment.GetLength() == 0) {

+            segment_left = char_left;

+        }

+        segment_right = char_right;

+        pFont->AppendChar(segment, charcode);

+        space_count = 0;

+        last_left = char_left;

+        last_right = char_right;

+    }

+    if (segment.GetLength())

+        pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,

+                                  topy, bottomy, spacew, fontsize_v, segment, pFont);

+    FX_Free(pPosArray);

+}

+static void ConvertPDFString(CFX_ByteString& result, CFX_ByteString& src, CPDF_Font* pFont);

+CTextBaseLine* CTextPage::InsertTextBox(CTextBaseLine* pBaseLine, FX_FLOAT basey, FX_FLOAT leftx,

+                                        FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy, FX_FLOAT spacew, FX_FLOAT fontsize_v,

+                                        CFX_ByteString& str, CPDF_Font* pFont)

+{

+    if (str.GetLength() == 0) {

+        return NULL;

+    }

+    if (pBaseLine == NULL) {

+        int i;

+        for (i = 0; i < m_BaseLines.GetSize(); i ++) {

+            CTextBaseLine* pExistLine = (CTextBaseLine*)m_BaseLines.GetAt(i);

+            if (pExistLine->m_BaseLine == basey) {

+                pBaseLine = pExistLine;

+                break;

+            }

+            if (pExistLine->m_BaseLine < basey) {

+                break;

+            }

+        }

+        if (pBaseLine == NULL) {

+            pBaseLine = FX_NEW CTextBaseLine;

+            if (NULL == pBaseLine) {

+                return NULL;

+            }

+            pBaseLine->m_BaseLine = basey;

+            m_BaseLines.InsertAt(i, pBaseLine);

+        }

+    }

+    CFX_WideString text;

+    FX_LPCSTR pStr = str;

+    int len = str.GetLength(), offset = 0;

+    while (offset < len) {

+        FX_DWORD ch = pFont->GetNextChar(pStr, offset);

+        CFX_WideString unicode_str = pFont->UnicodeFromCharCode(ch);

+        text += unicode_str;

+    }

+    pBaseLine->InsertTextBox(leftx, rightx, topy, bottomy, spacew, fontsize_v, text);

+    return pBaseLine;

+}

+void CTextPage::WriteOutput(CFX_WideStringArray& lines, int iMinWidth)

+{

+    FX_FLOAT lastheight = -1;

+    FX_FLOAT lastbaseline = -1;

+    FX_FLOAT MinLeftX = 1000000;

+    FX_FLOAT MaxRightX = 0;

+    int i;

+    for (i = 0; i < m_BaseLines.GetSize(); i ++) {

+        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);

+        FX_FLOAT leftx, rightx;

+        if (pBaseLine->GetWidth(leftx, rightx)) {

+            if (leftx < MinLeftX) {

+                MinLeftX = leftx;

+            }

+            if (rightx > MaxRightX) {

+                MaxRightX = rightx;

+            }

+        }

+    }

+    for (i = 0; i < m_BaseLines.GetSize(); i ++) {

+        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);

+        pBaseLine->MergeBoxes();

+    }

+    for (i = 1; i < m_BaseLines.GetSize(); i ++) {

+        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);

+        CTextBaseLine* pPrevLine = (CTextBaseLine*)m_BaseLines.GetAt(i - 1);

+        if (pBaseLine->CanMerge(pPrevLine)) {

+            pPrevLine->Merge(pBaseLine);

+            delete pBaseLine;

+            m_BaseLines.RemoveAt(i);

+            i --;

+        }

+    }

+    if (m_bAutoWidth) {

+        int* widths = FX_Alloc(int, m_BaseLines.GetSize());

+        if (widths) {

+            for (i = 0; i < m_BaseLines.GetSize(); i ++) {

+                widths[i] = 0;

+                CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);

+                int TotalChars = 0;

+                FX_FLOAT TotalWidth = 0;

+                int minchars;

+                pBaseLine->CountChars(TotalChars, TotalWidth, minchars);

+                if (TotalChars) {

+                    FX_FLOAT charwidth = TotalWidth / TotalChars;

+                    widths[i] = (int)((MaxRightX - MinLeftX) / charwidth);

+                }

+                if (widths[i] > 1000) {

+                    widths[i] = 1000;

+                }

+                if (widths[i] < minchars) {

+                    widths[i] = minchars;

+                }

+            }

+            int AvgWidth = 0, widthcount = 0;

+            for (i = 0; i < m_BaseLines.GetSize(); i ++)

+                if (widths[i]) {

+                    AvgWidth += widths[i];

+                    widthcount ++;

+                }

+            AvgWidth = int((FX_FLOAT)AvgWidth / widthcount + 0.5);

+            int MaxWidth = 0;

+            for (i = 0; i < m_BaseLines.GetSize(); i ++)

+                if (MaxWidth < widths[i]) {

+                    MaxWidth = widths[i];

+                }

+            if (MaxWidth > AvgWidth * 6 / 5) {

+                MaxWidth = AvgWidth * 6 / 5;

+            }

+            FX_Free(widths);

+            if (iMinWidth < MaxWidth) {

+                iMinWidth = MaxWidth;

+            }

+        }

+    }

+    for (i = 0; i < m_BaseLines.GetSize(); i ++) {

+        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);

+        pBaseLine->MergeBoxes();

+    }

+    if (m_bKeepColumn) {

+        FindColumns();

+    }

+    for (i = 0; i < m_BaseLines.GetSize(); i ++) {

+        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);

+        if (lastheight >= 0) {

+            FX_FLOAT dy = lastbaseline - pBaseLine->m_BaseLine;

+            if (dy >= (pBaseLine->m_MaxFontSizeV) * 1.5 || dy >= lastheight * 1.5) {

+                lines.Add(L"");

+            }

+        }

+        lastheight = pBaseLine->m_MaxFontSizeV;

+        lastbaseline = pBaseLine->m_BaseLine;

+        CFX_WideString str;

+        pBaseLine->WriteOutput(str, MinLeftX, MaxRightX - MinLeftX, iMinWidth);

+        lines.Add(str);

+    }

+}

+void NormalizeCompositeChar(FX_WCHAR wChar, CFX_WideString& sDest)

+{

+    wChar = FX_GetMirrorChar(wChar, TRUE, FALSE);

+    FX_LPWSTR pDst = NULL;

+    FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);

+    if (nCount < 1 ) {

+        sDest += wChar;

+        return;

+    }

+    pDst = new FX_WCHAR[nCount];

+    FX_Unicode_GetNormalization(wChar, pDst);

+    for (int nIndex = 0; nIndex < nCount; nIndex++) {

+        sDest += pDst[nIndex];

+    }

+    delete[] pDst;

+}

+void NormalizeString(CFX_WideString& str)

+{

+    if (str.GetLength() <= 0) {

+        return;

+    }

+    CFX_WideString sBuffer;

+    IFX_BidiChar* BidiChar = IFX_BidiChar::Create();

+    if (NULL == BidiChar)	{

+        return;

+    }

+    CFX_WordArray order;

+    FX_BOOL bR2L = FALSE;

+    FX_INT32 start = 0, count = 0, i = 0;

+    int nR2L = 0, nL2R = 0;

+    for (i = 0; i < str.GetLength(); i++) {

+        if(BidiChar->AppendChar(str.GetAt(i))) {

+            FX_INT32 ret = BidiChar->GetBidiInfo(start, count);

+            order.Add(start);

+            order.Add(count);

+            order.Add(ret);

+            if(!bR2L) {

+                if(ret == 2) {

+                    nR2L++;

+                } else if (ret == 1) {

+                    nL2R++;

+                }

+            }

+        }

+    }

+    if(BidiChar->EndChar()) {

+        FX_INT32 ret = BidiChar->GetBidiInfo(start, count);

+        order.Add(start);

+        order.Add(count);

+        order.Add(ret);

+        if(!bR2L) {

+            if(ret == 2) {

+                nR2L++;

+            } else if(ret == 1) {

+                nL2R++;

+            }

+        }

+    }

+    if(nR2L > 0 && nR2L >= nL2R) {

+        bR2L = TRUE;

+    }

+    if(bR2L) {

+        int count = order.GetSize();

+        for(int j = count - 1; j > 0; j -= 3) {

+            int ret = order.GetAt(j);

+            int start = order.GetAt(j - 2);

+            int count1 = order.GetAt(j - 1);

+            if(ret == 2 || ret == 0) {

+                for(int i = start + count1 - 1; i >= start; i--) {

+                    NormalizeCompositeChar(str[i], sBuffer);

+                }

+            } else {

+                i = j;

+                FX_BOOL bSymbol = FALSE;

+                while(i > 0 && order.GetAt(i) != 2) {

+                    bSymbol = !order.GetAt(i);

+                    i -= 3;

+                }

+                int end = start + count1 ;

+                int n = 0;

+                if(bSymbol) {

+                    n = i + 6;

+                } else {

+                    n = i + 3;

+                }

+                if(n >= j) {

+                    for(int m = start; m < end; m++) {

+                        sBuffer += str[m];

+                    }

+                } else {

+                    i = j;

+                    j = n;

+                    for(; n <= i; n += 3) {

+                        int ret = order.GetAt(n);

+                        int start = order.GetAt(n - 2);

+                        int count1 = order.GetAt(n - 1);

+                        int end = start + count1 ;

+                        for(int m = start; m < end; m++) {

+                            sBuffer += str[m];

+                        }

+                    }

+                }

+            }

+        }

+    } else {

+        int count = order.GetSize();

+        FX_BOOL bL2R = FALSE;

+        for(int j = 0; j < count; j += 3) {

+            int ret = order.GetAt(j + 2);

+            int start = order.GetAt(j);

+            int count1 = order.GetAt(j + 1);

+            if(ret == 2 || (j == 0 && ret == 0 && !bL2R)) {

+                int i = j + 3;

+                while(bR2L && i < count) {

+                    if(order.GetAt(i + 2) == 1) {

+                        break;

+                    } else {

+                        i += 3;

+                    }

+                }

+                if(i == 3) {

+                    j = -3;

+                    bL2R = TRUE;

+                    continue;

+                }

+                int end = str.GetLength() - 1;

+                if(i < count) {

+                    end = order.GetAt(i) - 1;

+                }

+                j = i - 3;

+                for(int n = end; n >= start; n--) {

+                    NormalizeCompositeChar(str[i], sBuffer);

+                }

+            } else {

+                int end = start + count1 ;

+                for(int i = start; i < end; i++) {

+                    sBuffer += str[i];

+                }

+            }

+        }

+    }

+    str.Empty();

+    str += sBuffer;

+    BidiChar->Release();

+}

+static FX_BOOL IsNumber(CFX_WideString& str)

+{

+    for (int i = 0; i < str.GetLength(); i ++) {

+        FX_WCHAR ch = str[i];

+        if ((ch < '0' || ch > '9') && ch != '-' && ch != '+' && ch != '.' && ch != ' ') {

+            return FALSE;

+        }

+    }

+    return TRUE;

+}

+void CTextPage::FindColumns()

+{

+    int i;

+    for (i = 0; i < m_BaseLines.GetSize(); i ++) {

+        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);

+        for (int j = 0; j < pBaseLine->m_TextList.GetSize(); j ++) {

+            CTextBox* pTextBox = (CTextBox*)pBaseLine->m_TextList.GetAt(j);

+            CTextColumn* pColumn = FindColumn(pTextBox->m_Right);

+            if (pColumn == NULL) {

+                pColumn = FX_NEW CTextColumn;

+                if (pColumn) {

+                    pColumn->m_Count = 1;

+                    pColumn->m_AvgPos = pTextBox->m_Right;

+                    pColumn->m_TextPos = -1;

+                    m_TextColumns.Add(pColumn);

+                }

+            } else {

+                pColumn->m_AvgPos = (pColumn->m_Count * pColumn->m_AvgPos + pTextBox->m_Right) /

+                                    (pColumn->m_Count + 1);

+                pColumn->m_Count ++;

+            }

+        }

+    }

+    int mincount = m_BaseLines.GetSize() / 4;

+    for (i = 0; i < m_TextColumns.GetSize(); i ++) {

+        CTextColumn* pTextColumn = (CTextColumn*)m_TextColumns.GetAt(i);

+        if (pTextColumn->m_Count >= mincount) {

+            continue;

+        }

+        delete pTextColumn;

+        m_TextColumns.RemoveAt(i);

+        i --;

+    }

+    for (i = 0; i < m_BaseLines.GetSize(); i ++) {

+        CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);

+        for (int j = 0; j < pBaseLine->m_TextList.GetSize(); j ++) {

+            CTextBox* pTextBox = (CTextBox*)pBaseLine->m_TextList.GetAt(j);

+            if (IsNumber(pTextBox->m_Text)) {

+                pTextBox->m_pColumn = FindColumn(pTextBox->m_Right);

+            }

+        }

+    }

+}

+CTextColumn* CTextPage::FindColumn(FX_FLOAT xpos)

+{

+    for (int i = 0; i < m_TextColumns.GetSize(); i ++) {

+        CTextColumn* pColumn = (CTextColumn*)m_TextColumns.GetAt(i);

+        if (pColumn->m_AvgPos < xpos + 1 && pColumn->m_AvgPos > xpos - 1) {

+            return pColumn;

+        }

+    }

+    return NULL;

+}

+void CTextPage::BreakSpace(CPDF_TextObject* pTextObj)

+{

+}

+CTextBaseLine::CTextBaseLine()

+{

+    m_Top = -100000;

+    m_Bottom = 100000;

+    m_MaxFontSizeV = 0;

+}

+CTextBaseLine::~CTextBaseLine()

+{

+    for (int i = 0; i < m_TextList.GetSize(); i ++) {

+        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);

+        delete pText;

+    }

+}

+void CTextBaseLine::InsertTextBox(FX_FLOAT leftx, FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy,

+                                  FX_FLOAT spacew, FX_FLOAT fontsize_v, const CFX_WideString& text)

+{

+    if (m_Top < topy) {

+        m_Top = topy;

+    }

+    if (m_Bottom > bottomy) {

+        m_Bottom = bottomy;

+    }

+    if (m_MaxFontSizeV < fontsize_v) {

+        m_MaxFontSizeV = fontsize_v;

+    }

+    int i;

+    for (i = 0; i < m_TextList.GetSize(); i ++) {

+        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);

+        if (pText->m_Left > leftx) {

+            break;

+        }

+    }

+    CTextBox* pText = FX_NEW CTextBox;

+    if (NULL == pText) {

+        return;

+    }

+    pText->m_Text = text;

+    pText->m_Left = leftx;

+    pText->m_Right = rightx;

+    pText->m_Top = topy;

+    pText->m_Bottom = bottomy;

+    pText->m_SpaceWidth = spacew;

+    pText->m_FontSizeV = fontsize_v;

+    pText->m_pColumn = NULL;

+    m_TextList.InsertAt(i, pText);

+}

+FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,

+                        FX_FLOAT& interlow, FX_FLOAT& interhigh);

+FX_BOOL CTextBaseLine::CanMerge(CTextBaseLine* pOther)

+{

+    FX_FLOAT inter_top, inter_bottom;

+    if (!GetIntersection(m_Bottom, m_Top, pOther->m_Bottom, pOther->m_Top,

+                         inter_bottom, inter_top)) {

+        return FALSE;

+    }

+    FX_FLOAT inter_h = inter_top - inter_bottom;

+    if (inter_h < (m_Top - m_Bottom) / 2 && inter_h < (pOther->m_Top - pOther->m_Bottom) / 2) {

+        return FALSE;

+    }

+    FX_FLOAT dy = (FX_FLOAT)FXSYS_fabs(m_BaseLine - pOther->m_BaseLine);

+    for (int i = 0; i < m_TextList.GetSize(); i ++) {

+        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);

+        FX_FLOAT width = pText->m_Right - pText->m_Left;

+        for (int j = 0; j < pOther->m_TextList.GetSize(); j ++) {

+            CTextBox* pOtherText = (CTextBox*)pOther->m_TextList.GetAt(j);

+            FX_FLOAT inter_left, inter_right;

+            if (!GetIntersection(pText->m_Left, pText->m_Right,

+                                 pOtherText->m_Left, pOtherText->m_Right, inter_left, inter_right)) {

+                continue;

+            }

+            FX_FLOAT inter_w = inter_right - inter_left;

+            if (inter_w < pText->m_SpaceWidth / 2 && inter_w < pOtherText->m_SpaceWidth / 2) {

+                continue;

+            }

+            if (dy >= (pText->m_Bottom - pText->m_Top) / 2 ||

+                    dy >= (pOtherText->m_Bottom - pOtherText->m_Top) / 2) {

+                return FALSE;

+            }

+        }

+    }

+    return TRUE;

+}

+void CTextBaseLine::Merge(CTextBaseLine* pOther)

+{

+    for (int i = 0; i < pOther->m_TextList.GetSize(); i ++) {

+        CTextBox* pText = (CTextBox*)pOther->m_TextList.GetAt(i);

+        InsertTextBox(pText->m_Left, pText->m_Right, pText->m_Top, pText->m_Bottom,

+                      pText->m_SpaceWidth, pText->m_FontSizeV, pText->m_Text);

+    }

+}

+FX_BOOL CTextBaseLine::GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx)

+{

+    int i;

+    for (i = 0; i < m_TextList.GetSize(); i ++) {

+        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);

+        if (pText->m_Text != L" ") {

+            break;

+        }

+    }

+    if (i == m_TextList.GetSize()) {

+        return FALSE;

+    }

+    CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);

+    leftx = pText->m_Left;

+    for (i = m_TextList.GetSize() - 1; i >= 0; i --) {

+        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);

+        if (pText->m_Text != L" ") {

+            break;

+        }

+    }

+    pText = (CTextBox*)m_TextList.GetAt(i);

+    rightx = pText->m_Right;

+    return TRUE;

+}

+void CTextBaseLine::MergeBoxes()

+{

+    int i = 0;

+    while (1) {

+        if (i >= m_TextList.GetSize() - 1) {

+            break;

+        }

+        CTextBox* pThisText = (CTextBox*)m_TextList.GetAt(i);

+        CTextBox* pNextText = (CTextBox*)m_TextList.GetAt(i + 1);

+        FX_FLOAT dx = pNextText->m_Left - pThisText->m_Right;

+        FX_FLOAT spacew = (pThisText->m_SpaceWidth == 0.0) ?

+                          pNextText->m_SpaceWidth : pThisText->m_SpaceWidth;

+        if (spacew > 0.0 && dx < spacew * 2) {

+            pThisText->m_Right = pNextText->m_Right;

+            if (dx > spacew * 1.5) {

+                pThisText->m_Text += L"  ";

+            } else if (dx > spacew / 3) {

+                pThisText->m_Text += L' ';

+            }

+            pThisText->m_Text += pNextText->m_Text;

+            pThisText->m_SpaceWidth = pNextText->m_SpaceWidth == 0.0 ?

+                                      spacew : pNextText->m_SpaceWidth;

+            m_TextList.RemoveAt(i + 1);

+            delete pNextText;

+        } else {

+            i ++;

+        }

+    }

+}

+void CTextBaseLine::WriteOutput(CFX_WideString& str, FX_FLOAT leftx, FX_FLOAT pagewidth,

+                                int iTextWidth)

+{

+    int lastpos = -1;

+    for (int i = 0; i < m_TextList.GetSize(); i ++) {

+        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);

+        int xpos;

+        if (pText->m_pColumn) {

+            xpos = (int)((pText->m_pColumn->m_AvgPos - leftx) * iTextWidth / pagewidth + 0.5);

+            xpos -= pText->m_Text.GetLength();

+        } else {

+            xpos = (int)((pText->m_Left - leftx) * iTextWidth / pagewidth + 0.5);

+        }

+        if (xpos <= lastpos) {

+            xpos = lastpos + 1;

+        }

+        for (int j = lastpos + 1; j < xpos; j ++) {

+            str += ' ';

+        }

+        CFX_WideString sSrc(pText->m_Text);

+        NormalizeString(sSrc);

+        str += sSrc;

+        str += ' ';

+        lastpos = xpos + pText->m_Text.GetLength();

+    }

+}

+void CTextBaseLine::CountChars(int& count, FX_FLOAT& width, int& minchars)

+{

+    minchars = 0;

+    for (int i = 0; i < m_TextList.GetSize(); i ++) {

+        CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);

+        if (pText->m_Right - pText->m_Left < 0.002) {

+            continue;

+        }

+        count += pText->m_Text.GetLength();

+        width += pText->m_Right - pText->m_Left;

+        minchars += pText->m_Text.GetLength() + 1;

+    }

+}

+#define PI 3.1415926535897932384626433832795

+static void CheckRotate(CPDF_Page& page, CFX_FloatRect& page_bbox)

+{

+    int total_count = 0, rotated_count[3] = {0, 0, 0};

+    FX_POSITION pos = page.GetFirstObjectPosition();

+    while (pos) {

+        CPDF_PageObject* pObj = page.GetNextObject(pos);

+        if (pObj->m_Type != PDFPAGE_TEXT) {

+            continue;

+        }

+        total_count ++;

+        CPDF_TextObject* pText = (CPDF_TextObject*)pObj;

+        FX_FLOAT angle = pText->m_TextState.GetBaselineAngle();

+        if (angle == 0.0) {

+            continue;

+        }

+        int degree = (int)(angle * 180 / PI + 0.5);

+        if (degree % 90) {

+            continue;

+        }

+        if (degree < 0) {

+            degree += 360;

+        }

+        int index = degree / 90 % 3 - 1;

+        if (index < 0) {

+            continue;

+        }

+        rotated_count[index] ++;

+    }

+    if (total_count == 0) {

+        return;

+    }

+    CFX_AffineMatrix matrix;

+    if (rotated_count[0] > total_count * 2 / 3) {

+        matrix.Set(0, -1, 1, 0, 0, page.GetPageHeight());

+    } else if (rotated_count[1] > total_count * 2 / 3) {

+        matrix.Set(-1, 0, 0, -1, page.GetPageWidth(), page.GetPageHeight());

+    } else if (rotated_count[2] > total_count * 2 / 3) {

+        matrix.Set(0, 1, -1, 0, page.GetPageWidth(), 0);

+    } else {

+        return;

+    }

+    page.Transform(matrix);

+    page_bbox.Transform(&matrix);

+}

+void PDF_GetPageText_Unicode(CFX_WideStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,

+                             int iMinWidth, FX_DWORD flags)

+{

+    lines.RemoveAll();

+    if (pPage == NULL) {

+        return;

+    }

+    CPDF_Page page;

+    page.Load(pDoc, pPage);

+    CPDF_ParseOptions options;

+    options.m_bTextOnly = TRUE;

+    options.m_bSeparateForm = FALSE;

+    page.ParseContent(&options);

+    CFX_FloatRect page_bbox = page.GetPageBBox();

+    if (flags & PDF2TXT_AUTO_ROTATE) {

+        CheckRotate(page, page_bbox);

+    }

+    CTextPage texts;

+    texts.m_bAutoWidth = flags & PDF2TXT_AUTO_WIDTH;

+    texts.m_bKeepColumn = flags & PDF2TXT_KEEP_COLUMN;

+    texts.m_bBreakSpace = TRUE;

+    FX_POSITION pos = page.GetFirstObjectPosition();

+    while (pos) {

+        CPDF_PageObject* pObject = page.GetNextObject(pos);

+        if (!(flags & PDF2TXT_INCLUDE_INVISIBLE)) {

+            CFX_FloatRect rect(pObject->m_Left, pObject->m_Bottom, pObject->m_Right, pObject->m_Top);

+            if (!page_bbox.Contains(rect)) {

+                continue;

+            }

+        }

+        texts.ProcessObject(pObject);

+    }

+    texts.WriteOutput(lines, iMinWidth);

+}

+void PDF_GetPageText(CFX_ByteStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,

+                     int iMinWidth, FX_DWORD flags)

+{

+    lines.RemoveAll();

+    CFX_WideStringArray wlines;

+    PDF_GetPageText_Unicode(wlines, pDoc, pPage, iMinWidth, flags);

+    for (int i = 0; i < wlines.GetSize(); i ++) {

+        CFX_WideString wstr = wlines[i];

+        CFX_ByteString str;

+        for (int c = 0; c < wstr.GetLength(); c ++) {

+            str += CharFromUnicodeAlt(wstr[c], FXSYS_GetACP(), "?");

+        }

+        lines.Add(str);

+    }

+}

+#endif

+extern void _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, FX_BOOL bUseLF,

+                                       CFX_PtrArray* pObjArray);

+void PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_Document* pDoc, CPDF_Dictionary* pPage, FX_DWORD flags)

+{

+    buffer.EstimateSize(0, 10240);

+    CPDF_Page page;

+    page.Load(pDoc, pPage);

+    CPDF_ParseOptions options;

+    options.m_bTextOnly = TRUE;

+    options.m_bSeparateForm = FALSE;

+    page.ParseContent(&options);

+    _PDF_GetTextStream_Unicode(buffer, &page, TRUE, NULL);

+}

diff --git a/core/src/fpdftext/fpdf_text_int.cpp b/core/src/fpdftext/fpdf_text_int.cpp
new file mode 100644
index 0000000..36b0442
--- /dev/null
+++ b/core/src/fpdftext/fpdf_text_int.cpp
@@ -0,0 +1,2804 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfapi/fpdf_resource.h"

+#include "../../include/fpdfapi/fpdf_pageobj.h"

+#include "../../include/fpdftext/fpdf_text.h"

+#include "../../include/fpdfapi/fpdf_page.h"

+#include "../../include/fpdfapi/fpdf_module.h"

+#include <ctype.h>

+#include "text_int.h"

+FX_BOOL _IsIgnoreSpaceCharacter(FX_WCHAR curChar)

+{

+    if(curChar < 255 ) {

+        return FALSE;

+    }

+    if ( (curChar >= 0x0600 && curChar <= 0x06FF)

+            || (curChar >= 0xFE70 && curChar <= 0xFEFF)

+            || (curChar >= 0xFB50 && curChar <= 0xFDFF)

+            || (curChar >= 0x0400 && curChar <= 0x04FF)

+            || (curChar >= 0x0500 && curChar <= 0x052F)

+            || (curChar >= 0xA640 && curChar <= 0xA69F)

+            || (curChar >= 0x2DE0 && curChar <= 0x2DFF)

+            || curChar == 8467

+            || (curChar >= 0x2000 && curChar <= 0x206F)) {

+        return FALSE;

+    }

+    return TRUE;

+}

+CPDFText_ParseOptions::CPDFText_ParseOptions()

+    : m_bGetCharCodeOnly(FALSE), m_bNormalizeObjs(TRUE), m_bOutputHyphen(FALSE)

+{

+}

+IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions)

+{

+    CPDF_TextPage* pTextPageEx = FX_NEW CPDF_TextPage(pPage, ParserOptions);

+    return pTextPageEx;

+}

+IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_Page* pPage, int flags)

+{

+    CPDF_TextPage* pTextPage = FX_NEW CPDF_TextPage(pPage, flags);

+    return	pTextPage;

+}

+IPDF_TextPage*	IPDF_TextPage::CreateTextPage(const CPDF_PageObjects* pObjs, int flags)

+{

+    CPDF_TextPage* pTextPage = FX_NEW CPDF_TextPage(pObjs, flags);

+    return	pTextPage;

+}

+IPDF_TextPageFind*	IPDF_TextPageFind::CreatePageFind(const IPDF_TextPage* pTextPage)

+{

+    if (!pTextPage) {

+        return NULL;

+    }

+    return FX_NEW CPDF_TextPageFind(pTextPage);

+}

+IPDF_LinkExtract* IPDF_LinkExtract::CreateLinkExtract()

+{

+    return FX_NEW CPDF_LinkExtract();

+}

+#define  TEXT_BLANK_CHAR		L' '

+#define  TEXT_LINEFEED_CHAR		L'\n'

+#define	 TEXT_RETURN_CHAR		L'\r'

+#define  TEXT_EMPTY				L""

+#define  TEXT_BLANK				L" "

+#define  TEXT_RETURN_LINEFEED	L"\r\n"

+#define  TEXT_LINEFEED			L"\n"

+#define	 TEXT_CHARRATIO_GAPDELTA	0.070

+CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags)

+    : m_pPreTextObj(NULL),

+      m_IsParsered(FALSE),

+      m_charList(512),

+      m_TempCharList(50),

+      m_TextlineDir(-1),

+      m_CurlineRect(0, 0, 0, 0)

+{

+    m_pPage = pPage;

+    m_parserflag = flags;

+    m_TextBuf.EstimateSize(0, 10240);

+    pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);

+}

+CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions)

+    : m_pPreTextObj(NULL)

+    , m_IsParsered(FALSE)

+    , m_charList(512)

+    , m_TempCharList(50)

+    , m_TextlineDir(-1)

+    , m_CurlineRect(0, 0, 0, 0)

+    , m_ParseOptions(ParserOptions)

+{

+    m_pPage = pPage;

+    m_parserflag = 0;

+    m_TextBuf.EstimateSize(0, 10240);

+    pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);

+}

+CPDF_TextPage::CPDF_TextPage(const CPDF_PageObjects* pPage, int flags)

+    : m_pPreTextObj(NULL),

+      m_IsParsered(FALSE),

+      m_charList(512),

+      m_TempCharList(50),

+      m_TextlineDir(-1),

+      m_CurlineRect(0, 0, 0, 0)

+{

+    m_pPage = pPage;

+    m_parserflag = flags;

+    m_TextBuf.EstimateSize(0, 10240);

+    CFX_FloatRect pageRect = pPage->CalcBoundingBox();

+    m_DisplayMatrix = CFX_AffineMatrix(1, 0, 0, -1, pageRect.right, pageRect.top);

+}

+void CPDF_TextPage::NormalizeObjects(FX_BOOL bNormalize)

+{

+    m_ParseOptions.m_bNormalizeObjs = bNormalize;

+}

+FX_BOOL CPDF_TextPage::IsControlChar(PAGECHAR_INFO* pCharInfo)

+{

+    if(!pCharInfo) {

+        return FALSE;

+    }

+    switch(pCharInfo->m_Unicode) {

+        case 0x2:

+        case 0x3:

+        case 0x93:

+        case 0x94:

+        case 0x96:

+        case 0x97:

+        case 0x98:

+        case 0xfffe:

+            if(pCharInfo->m_Flag == FPDFTEXT_CHAR_HYPHEN) {

+                return FALSE;

+            } else {

+                return TRUE;

+            }

+        default:

+            return FALSE;

+    }

+}

+FX_BOOL CPDF_TextPage::ParseTextPage()

+{

+    if (!m_pPage) {

+        m_IsParsered = FALSE;

+        return FALSE;

+    }

+    m_IsParsered = FALSE;

+    m_TextBuf.Clear();

+    m_charList.RemoveAll();

+    m_pPreTextObj = NULL;

+    ProcessObject();

+    m_IsParsered = TRUE;

+    if(!m_ParseOptions.m_bGetCharCodeOnly) {

+        m_CharIndex.RemoveAll();

+        int nCount = m_charList.GetSize();

+        if(nCount) {

+            m_CharIndex.Add(0);

+        }

+        for(int i = 0; i < nCount; i++) {

+            int indexSize = m_CharIndex.GetSize();

+            FX_BOOL bNormal = FALSE;

+            PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(i);

+            if(charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) {

+                bNormal = TRUE;

+            }

+#ifdef FOXIT_CHROME_BUILD

+            else if(charinfo.m_Unicode == 0 || IsControlChar(&charinfo))

+#else

+            else if(charinfo.m_Unicode == 0)

+#endif

+                bNormal = FALSE;

+            else {

+                bNormal = TRUE;

+            }

+            if(bNormal) {

+                if(indexSize % 2) {

+                    m_CharIndex.Add(1);

+                } else {

+                    if(indexSize <= 0) {

+                        continue;

+                    }

+                    m_CharIndex.SetAt(indexSize - 1, m_CharIndex.GetAt(indexSize - 1) + 1);

+                }

+            } else {

+                if(indexSize % 2) {

+                    if(indexSize <= 0) {

+                        continue;

+                    }

+                    m_CharIndex.SetAt(indexSize - 1, i + 1);

+                } else {

+                    m_CharIndex.Add(i + 1);

+                }

+            }

+        }

+        int indexSize = m_CharIndex.GetSize();

+        if(indexSize % 2) {

+            m_CharIndex.RemoveAt(indexSize - 1);

+        }

+    }

+    return TRUE;

+}

+int	CPDF_TextPage::CountChars() const

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return m_TextBuf.GetSize();

+    }

+    return m_charList.GetSize();

+}

+int CPDF_TextPage::CharIndexFromTextIndex(int TextIndex) const

+{

+    int indexSize = m_CharIndex.GetSize();

+    int count = 0;

+    for(int i = 0; i < indexSize; i += 2) {

+        count += m_CharIndex.GetAt(i + 1);

+        if(count > TextIndex) {

+            return 	TextIndex - count + m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i);

+        }

+    }

+    return -1;

+}

+int CPDF_TextPage::TextIndexFromCharIndex(int CharIndex) const

+{

+    int indexSize = m_CharIndex.GetSize();

+    int count = 0;

+    for(int i = 0; i < indexSize; i += 2) {

+        count += m_CharIndex.GetAt(i + 1);

+        if(m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i) > CharIndex) {

+            if(CharIndex - m_CharIndex.GetAt(i) < 0) {

+                return -1;

+            }

+            return 	CharIndex - m_CharIndex.GetAt(i) + count - m_CharIndex.GetAt(i + 1);

+        }

+    }

+    return -1;

+}

+void CPDF_TextPage::GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return;

+    }

+    if(start < 0 || nCount == 0) {

+        return;

+    }

+    if (!m_IsParsered)	{

+        return;

+    }

+    PAGECHAR_INFO		info_curchar;

+    CPDF_TextObject*	pCurObj = NULL;

+    CFX_FloatRect		rect;

+    int					curPos = start;

+    FX_BOOL				flagNewRect = TRUE;

+    if (nCount + start > m_charList.GetSize() || nCount == -1) {

+        nCount = m_charList.GetSize() - start;

+    }

+    while (nCount--) {

+        info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(curPos++);

+        if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {

+            continue;

+        }

+        if(info_curchar.m_CharBox.Width() < 0.01 || info_curchar.m_CharBox.Height() < 0.01) {

+            continue;

+        }

+        if(!pCurObj) {

+            pCurObj = info_curchar.m_pTextObj;

+        }

+        if (pCurObj != info_curchar.m_pTextObj) {

+            rectArray.Add(rect);

+            pCurObj = info_curchar.m_pTextObj;

+            flagNewRect = TRUE;

+        }

+        if (flagNewRect) {

+            FX_FLOAT orgX = info_curchar.m_OriginX, orgY = info_curchar.m_OriginY;

+            CFX_AffineMatrix matrix, matrix_reverse;

+            info_curchar.m_pTextObj->GetTextMatrix(&matrix);

+            matrix.Concat(info_curchar.m_Matrix);

+            matrix_reverse.SetReverse(matrix);

+            matrix_reverse.Transform(orgX, orgY);

+            rect.left = info_curchar.m_CharBox.left;

+            rect.right = info_curchar.m_CharBox.right;

+            if (pCurObj->GetFont()->GetTypeDescent()) {

+                rect.bottom = orgY + pCurObj->GetFont()->GetTypeDescent() * pCurObj->GetFontSize() / 1000;

+                FX_FLOAT xPosTemp = orgX;

+                matrix.Transform(xPosTemp, rect.bottom);

+            } else {

+                rect.bottom = info_curchar.m_CharBox.bottom;

+            }

+            if (pCurObj->GetFont()->GetTypeAscent()) {

+                rect.top = orgY + pCurObj->GetFont()->GetTypeAscent() * pCurObj->GetFontSize() / 1000;

+                FX_FLOAT xPosTemp = orgX + GetCharWidth(info_curchar.m_CharCode, pCurObj->GetFont()) * pCurObj->GetFontSize() / 1000;

+                matrix.Transform(xPosTemp, rect.top);

+            } else {

+                rect.top = info_curchar.m_CharBox.top;

+            }

+            flagNewRect = FALSE;

+            rect = info_curchar.m_CharBox;

+            rect.Normalize();

+        } else {

+            info_curchar.m_CharBox.Normalize();

+            if (rect.left > info_curchar.m_CharBox.left) {

+                rect.left = info_curchar.m_CharBox.left;

+            }

+            if (rect.right < info_curchar.m_CharBox.right) {

+                rect.right = info_curchar.m_CharBox.right;

+            }

+            if ( rect.top < info_curchar.m_CharBox.top) {

+                rect.top = info_curchar.m_CharBox.top;

+            }

+            if (rect.bottom > info_curchar.m_CharBox.bottom) {

+                rect.bottom = info_curchar.m_CharBox.bottom;

+            }

+        }

+    }

+    rectArray.Add(rect);

+    return;

+}

+int CPDF_TextPage::GetIndexAtPos(CPDF_Point point , FX_FLOAT xTorelance, FX_FLOAT yTorelance) const

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return -3;

+    }

+    if (!m_IsParsered)	{

+        return	-3;

+    }

+    FX_FLOAT distance = 0;

+    int pos = 0;

+    int NearPos = -1;

+    double xdif = 5000, ydif = 5000;

+    while(pos < m_charList.GetSize()) {

+        PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)(m_charList.GetAt(pos));

+        CFX_FloatRect charrect = charinfo.m_CharBox;

+        if (charrect.Contains(point.x, point.y)) {

+            break;

+        }

+        if (xTorelance > 0 || yTorelance > 0) {

+            CFX_FloatRect charRectExt;

+            charrect.Normalize();

+            charRectExt.left = charrect.left - xTorelance / 2;

+            charRectExt.right = charrect.right + xTorelance / 2;

+            charRectExt.top = charrect.top + yTorelance / 2;

+            charRectExt.bottom = charrect.bottom - yTorelance / 2;

+            if (charRectExt.Contains(point.x, point.y)) {

+                double curXdif, curYdif;

+                curXdif = FXSYS_fabs(point.x - charrect.left) < FXSYS_fabs(point.x - charrect.right) ? FXSYS_fabs(point.x - charrect.left) : FXSYS_fabs(point.x - charrect.right);

+                curYdif = FXSYS_fabs(point.y - charrect.bottom) < FXSYS_fabs(point.y - charrect.top	) ? FXSYS_fabs(point.y - charrect.bottom) : FXSYS_fabs(point.y - charrect.top);

+                if (curYdif + curXdif < xdif + ydif) {

+                    ydif = curYdif;

+                    xdif = curXdif;

+                    NearPos = pos;

+                }

+            }

+        }

+        ++pos;

+    }

+    if (pos >= m_charList.GetSize()) {

+        pos = NearPos;

+    }

+    return pos;

+}

+CFX_WideString CPDF_TextPage::GetTextByRect(CFX_FloatRect rect) const

+{

+    CFX_WideString strText;

+    if(m_ParseOptions.m_bGetCharCodeOnly || !m_IsParsered) {

+        return strText;

+    }

+    int nCount = m_charList.GetSize();

+    int pos = 0;

+    FX_FLOAT posy = 0;

+    FX_BOOL IsContainPreChar = FALSE;

+    FX_BOOL	ISAddLineFeed = FALSE;

+    while (pos < nCount) {

+        PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos++);

+        if (IsRectIntersect(rect, charinfo.m_CharBox)) {

+            if (FXSYS_fabs(posy - charinfo.m_OriginY) > 0 && !IsContainPreChar && ISAddLineFeed) {

+                posy = charinfo.m_OriginY;

+                if (strText.GetLength() > 0) {

+                    strText += L"\r\n";

+                }

+            }

+            IsContainPreChar = TRUE;

+            ISAddLineFeed = FALSE;

+            if (charinfo.m_Unicode) {

+                strText += charinfo.m_Unicode;

+            }

+        } else if (charinfo.m_Unicode == 32) {

+            if (IsContainPreChar && charinfo.m_Unicode) {

+                strText += charinfo.m_Unicode;

+                IsContainPreChar = FALSE;

+                ISAddLineFeed = FALSE;

+            }

+        } else {

+            IsContainPreChar = FALSE;

+            ISAddLineFeed = TRUE;

+        }

+    }

+    return strText;

+}

+void CPDF_TextPage::GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return;

+    }

+    if (!m_IsParsered)	{

+        return;

+    }

+    CFX_FloatRect		curRect;

+    FX_BOOL				flagNewRect = TRUE;

+    CPDF_TextObject*	pCurObj = NULL;

+    int nCount = m_charList.GetSize();

+    int pos = 0;

+    while (pos < nCount) {

+        PAGECHAR_INFO info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(pos++);

+        if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {

+            continue;

+        }

+        if(pos == 494) {

+            int a = 0;

+        }

+        if (IsRectIntersect(rect, info_curchar.m_CharBox)) {

+            if(!pCurObj) {

+                pCurObj = info_curchar.m_pTextObj;

+            }

+            if (pCurObj != info_curchar.m_pTextObj) {

+                resRectArray.Add(curRect);

+                pCurObj = info_curchar.m_pTextObj;

+                flagNewRect = TRUE;

+            }

+            if (flagNewRect) {

+                curRect = info_curchar.m_CharBox;

+                flagNewRect = FALSE;

+                curRect.Normalize();

+            } else {

+                info_curchar.m_CharBox.Normalize();

+                if (curRect.left > info_curchar.m_CharBox.left) {

+                    curRect.left = info_curchar.m_CharBox.left;

+                }

+                if (curRect.right < info_curchar.m_CharBox.right) {

+                    curRect.right = info_curchar.m_CharBox.right;

+                }

+                if ( curRect.top < info_curchar.m_CharBox.top) {

+                    curRect.top = info_curchar.m_CharBox.top;

+                }

+                if (curRect.bottom > info_curchar.m_CharBox.bottom) {

+                    curRect.bottom = info_curchar.m_CharBox.bottom;

+                }

+            }

+        }

+    }

+    resRectArray.Add(curRect);

+    return;

+}

+int	CPDF_TextPage::GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return -3;

+    }

+    CPDF_Point point(x, y);

+    return GetIndexAtPos(point, xTorelance, yTorelance);

+}

+int CPDF_TextPage::GetOrderByDirection(int order, int direction) const

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return -3;

+    }

+    if (!m_IsParsered) {

+        return -3;

+    }

+    if (direction == FPDFTEXT_RIGHT || direction == FPDFTEXT_LEFT) {

+        order += direction;

+        while(order >= 0 && order < m_charList.GetSize()) {

+            PAGECHAR_INFO cinfo = *(PAGECHAR_INFO*)m_charList.GetAt(order);

+            if (cinfo.m_Flag != FPDFTEXT_CHAR_GENERATED) {

+                break;

+            } else {

+                if (cinfo.m_Unicode == TEXT_LINEFEED_CHAR || cinfo.m_Unicode == TEXT_RETURN_CHAR) {

+                    order += direction;

+                } else {

+                    break;

+                }

+            }

+        }

+        if (order >= m_charList.GetSize()) {

+            order = -2;

+        }

+        return order;

+    }

+    PAGECHAR_INFO charinfo;

+    charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(order);

+    CPDF_Point curPos(charinfo.m_OriginX, charinfo.m_OriginY);

+    FX_FLOAT difPosY = 0.0, minXdif = 1000;

+    int	minIndex = -2;

+    int index = order;

+    FX_FLOAT height = charinfo.m_CharBox.Height();

+    if (direction == FPDFTEXT_UP) {

+        minIndex = -1;

+        while (1) {

+            if (--index < 0)	{

+                return -1;

+            }

+            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);

+            if (FXSYS_fabs(charinfo.m_OriginY - curPos.y) > FX_MAX(height, charinfo.m_CharBox.Height()) / 2) {

+                difPosY = charinfo.m_OriginY;

+                minIndex = index;

+                break;

+            }

+        }

+        FX_FLOAT PreXdif = charinfo.m_OriginX - curPos.x;

+        minXdif = PreXdif;

+        if (PreXdif == 0)	{

+            return index;

+        }

+        FX_FLOAT curXdif = 0;

+        while (--index >= 0) {

+            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);

+            if (difPosY != charinfo.m_OriginY) {

+                break;

+            }

+            curXdif = charinfo.m_OriginX - curPos.x;

+            if (curXdif == 0) {

+                return index;

+            }

+            int signflag = 0;

+            if (curXdif > 0) {

+                signflag = 1;

+            } else {

+                signflag = -1;

+            }

+            if (signflag * PreXdif < 0) {

+                if (FXSYS_fabs(PreXdif) < FXSYS_fabs(curXdif)) {

+                    return index + 1;

+                } else {

+                    return index;

+                }

+            }

+            if (FXSYS_fabs(curXdif) < FXSYS_fabs(minXdif)) {

+                minIndex = index;

+                minXdif = curXdif;

+            }

+            PreXdif = curXdif;

+            if (difPosY != charinfo.m_OriginY) {

+                break;

+            }

+        }

+        return minIndex;

+    } else if(FPDFTEXT_DOWN) {

+        minIndex = -2;

+        while (1) {

+            if (++index > m_charList.GetSize() - 1)	{

+                return minIndex;

+            }

+            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);

+            if (FXSYS_fabs(charinfo.m_OriginY - curPos.y) > FX_MAX(height, charinfo.m_CharBox.Height()) / 2) {

+                difPosY = charinfo.m_OriginY;

+                minIndex = index;

+                break;

+            }

+        }

+        FX_FLOAT PreXdif = charinfo.m_OriginX - curPos.x;

+        minXdif = PreXdif;

+        if (PreXdif == 0)	{

+            return index;

+        }

+        FX_FLOAT curXdif = 0;

+        while (++index < m_charList.GetSize()) {

+            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);

+            if (difPosY != charinfo.m_OriginY) {

+                break;

+            }

+            curXdif = charinfo.m_OriginX - curPos.x;

+            if (curXdif == 0) {

+                return index;

+            }

+            int signflag = 0;

+            if (curXdif > 0) {

+                signflag = 1;

+            } else {

+                signflag = -1;

+            }

+            if (signflag * PreXdif < 0) {

+                if (FXSYS_fabs(PreXdif) < FXSYS_fabs(curXdif)) {

+                    return index - 1;

+                } else {

+                    return index;

+                }

+            }

+            if (FXSYS_fabs(curXdif) < FXSYS_fabs(minXdif)) {

+                minXdif = curXdif;

+                minIndex = index;

+            }

+            PreXdif = curXdif;

+        }

+        return minIndex;

+    }

+}

+void CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO & info) const

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return;

+    }

+    if (!m_IsParsered)	{

+        return;

+    }

+    if (index < 0 || index >= m_charList.GetSize())	{

+        return;

+    }

+    PAGECHAR_INFO charinfo;

+    charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);

+    info.m_Charcode = charinfo.m_CharCode;

+    info.m_OriginX = charinfo.m_OriginX;

+    info.m_OriginY = charinfo.m_OriginY;

+    info.m_Unicode = charinfo.m_Unicode;

+    info.m_Flag = charinfo.m_Flag;

+    info.m_CharBox = charinfo.m_CharBox;

+    info.m_pTextObj = charinfo.m_pTextObj;

+    if (charinfo.m_pTextObj && charinfo.m_pTextObj->GetFont()) {

+        info.m_FontSize = charinfo.m_pTextObj->GetFontSize();

+    }

+    info.m_Matrix.Copy(charinfo.m_Matrix);

+    return;

+}

+void CPDF_TextPage::CheckMarkedContentObject(FX_INT32& start, FX_INT32& nCount) const

+{

+    PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start);

+    PAGECHAR_INFO charinfo2 = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1);

+    if (FPDFTEXT_CHAR_PIECE != charinfo.m_Flag && FPDFTEXT_CHAR_PIECE != charinfo2.m_Flag) {

+        return;

+    }

+    if (FPDFTEXT_CHAR_PIECE == charinfo.m_Flag) {

+        PAGECHAR_INFO charinfo1 = charinfo;

+        int startIndex = start;

+        while(FPDFTEXT_CHAR_PIECE == charinfo1.m_Flag && charinfo1.m_Index == charinfo.m_Index) {

+            startIndex--;

+            if (startIndex < 0)	{

+                break;

+            }

+            charinfo1 = *(PAGECHAR_INFO*)m_charList.GetAt(startIndex);

+        }

+        startIndex++;

+        start = startIndex;

+    }

+    if (FPDFTEXT_CHAR_PIECE == charinfo2.m_Flag) {

+        PAGECHAR_INFO charinfo3 = charinfo2;

+        int endIndex = start + nCount - 1;

+        while(FPDFTEXT_CHAR_PIECE == charinfo3.m_Flag && charinfo3.m_Index == charinfo2.m_Index) {

+            endIndex++;

+            if (endIndex >= m_charList.GetSize())	{

+                break;

+            }

+            charinfo3 = *(PAGECHAR_INFO*)m_charList.GetAt(endIndex);

+        }

+        endIndex--;

+        nCount = endIndex - start + 1;

+    }

+}

+CFX_WideString CPDF_TextPage::GetPageText(int start , int nCount) const

+{

+    if (!m_IsParsered || nCount == 0) {

+        return L"";

+    }

+    if (start < 0) {

+        start = 0;

+    }

+    if	(nCount == -1) {

+        nCount = m_charList.GetSize() - start;

+        return m_TextBuf.GetWideString().Mid(start, m_TextBuf.GetWideString().GetLength());

+    }

+    if(nCount <= 0 || m_charList.GetSize() <= 0) {

+        return L"";

+    }

+    if(nCount + start > m_charList.GetSize() - 1) {

+        nCount = m_charList.GetSize() - start;

+    }

+    if (nCount <= 0) {

+        return L"";

+    }

+    CheckMarkedContentObject(start, nCount);

+    int startindex = 0;

+    PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start);

+    int startOffset = 0;

+    while(charinfo.m_Index == -1) {

+        startOffset++;

+        if (startOffset > nCount || start + startOffset >= m_charList.GetSize())	{

+            return L"";

+        }

+        charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + startOffset);

+    }

+    startindex = charinfo.m_Index;

+    charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1);

+    int nCountOffset = 0;

+    while (charinfo.m_Index == -1) {

+        nCountOffset++;

+        if (nCountOffset >= nCount) {

+            return L"";

+        }

+        charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - nCountOffset - 1);

+    }

+    nCount = start + nCount - nCountOffset - startindex;

+    if(nCount <= 0) {

+        return L"";

+    }

+    return m_TextBuf.GetWideString().Mid(startindex, nCount);

+}

+int CPDF_TextPage::CountRects(int start, int nCount)

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return -1;

+    }

+    if (!m_IsParsered)	{

+        return -1;

+    }

+    if (start < 0) {

+        return -1;

+    }

+    if (nCount == -1 || nCount + start > m_charList.GetSize() ) {

+        nCount = m_charList.GetSize() - start;

+    }

+    m_SelRects.RemoveAll();

+    GetRectArray(start, nCount, m_SelRects);

+    return m_SelRects.GetSize();

+}

+void CPDF_TextPage::GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return ;

+    }

+    if (!m_IsParsered || rectIndex < 0 || rectIndex >= m_SelRects.GetSize()) {

+        return;

+    }

+    left = m_SelRects.GetAt(rectIndex).left;

+    top = m_SelRects.GetAt(rectIndex).top;

+    right = m_SelRects.GetAt(rectIndex).right;

+    bottom = m_SelRects.GetAt(rectIndex).bottom;

+}

+FX_BOOL CPDF_TextPage::GetBaselineRotate(int start, int end, int& Rotate)

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return FALSE;

+    }

+    if(end == start) {

+        return FALSE;

+    }

+    FX_FLOAT dx, dy;

+    FPDF_CHAR_INFO info1, info2;

+    GetCharInfo(start, info1);

+    GetCharInfo(end, info2);

+    while(info2.m_CharBox.Width() == 0 || info2.m_CharBox.Height() == 0) {

+        end--;

+        if(end <= start) {

+            return FALSE;

+        }

+        GetCharInfo(end, info2);

+    }

+    dx = (info2.m_OriginX - info1.m_OriginX);

+    dy = (info2.m_OriginY - info1.m_OriginY);

+    if(dx == 0) {

+        if(dy > 0) {

+            Rotate = 90;

+        } else if (dy < 0) {

+            Rotate = 270;

+        } else {

+            Rotate = 0;

+        }

+    } else {

+        float a = FXSYS_atan2(dy, dx);

+        Rotate = (int)(a * 180 / FX_PI + 0.5);

+    }

+    if(Rotate < 0) {

+        Rotate = -Rotate;

+    } else if(Rotate > 0) {

+        Rotate = 360 - Rotate;

+    }

+    return TRUE;

+}

+FX_BOOL	CPDF_TextPage::GetBaselineRotate(CFX_FloatRect rect , int& Rotate)

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return FALSE;

+    }

+    int start, end, count, n = CountBoundedSegments(rect.left, rect.top, rect.right, rect.bottom, TRUE);

+    if(n < 1) {

+        return FALSE;

+    }

+    if(n > 1) {

+        GetBoundedSegment(n - 1, start, count);

+        end = start + count - 1;

+        GetBoundedSegment(0, start, count);

+    } else {

+        GetBoundedSegment(0, start, count);

+        end = start + count - 1;

+    }

+    return GetBaselineRotate(start, end, Rotate);

+}

+FX_BOOL	CPDF_TextPage::GetBaselineRotate(int rectIndex, int& Rotate)

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return FALSE;

+    }

+    if (!m_IsParsered || rectIndex < 0 || rectIndex > m_SelRects.GetSize()) {

+        return FALSE;

+    }

+    CFX_FloatRect rect = m_SelRects.GetAt(rectIndex);

+    return GetBaselineRotate(rect , Rotate);

+}

+int	CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains )

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return -1;

+    }

+    m_Segment.RemoveAll();

+    if (!m_IsParsered)	{

+        return -1;

+    }

+    CFX_FloatRect rect(left, bottom, right, top);

+    rect.Normalize();

+    int nCount = m_charList.GetSize();

+    int pos = 0;

+    FPDF_SEGMENT	segment;

+    segment.m_Start = 0;

+    segment.m_nCount = 0;

+    FX_BOOL		segmentStatus = 0;

+    FX_BOOL		IsContainPreChar = FALSE;

+    while (pos < nCount) {

+        if(pos == 493) {

+            int a = 0;

+        }

+        PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos);

+        if(bContains && rect.Contains(charinfo.m_CharBox)) {

+            if (segmentStatus == 0 || segmentStatus == 2) {

+                segment.m_Start = pos;

+                segment.m_nCount = 1;

+                segmentStatus = 1;

+            } else if (segmentStatus == 1) {

+                segment.m_nCount++;

+            }

+            IsContainPreChar = TRUE;

+        } else if (!bContains && (IsRectIntersect(rect, charinfo.m_CharBox) || rect.Contains(charinfo.m_OriginX, charinfo.m_OriginY))) {

+            if (segmentStatus == 0 || segmentStatus == 2) {

+                segment.m_Start = pos;

+                segment.m_nCount = 1;

+                segmentStatus = 1;

+            } else if (segmentStatus == 1) {

+                segment.m_nCount++;

+            }

+            IsContainPreChar = TRUE;

+        } else if (charinfo.m_Unicode == 32) {

+            if (IsContainPreChar == TRUE) {

+                if (segmentStatus == 0 || segmentStatus == 2) {

+                    segment.m_Start = pos;

+                    segment.m_nCount = 1;

+                    segmentStatus = 1;

+                } else if (segmentStatus == 1) {

+                    segment.m_nCount++;

+                }

+                IsContainPreChar = FALSE;

+            } else {

+                if (segmentStatus == 1) {

+                    segmentStatus = 2;

+                    m_Segment.Add(segment);

+                    segment.m_Start = 0;

+                    segment.m_nCount = 0;

+                }

+            }

+        } else {

+            if (segmentStatus == 1) {

+                segmentStatus = 2;

+                m_Segment.Add(segment);

+                segment.m_Start = 0;

+                segment.m_nCount = 0;

+            }

+            IsContainPreChar = FALSE;

+        }

+        pos++;

+    }

+    if (segmentStatus == 1) {

+        segmentStatus = 2;

+        m_Segment.Add(segment);

+        segment.m_Start = 0;

+        segment.m_nCount = 0;

+    }

+    return m_Segment.GetSize();

+}

+void CPDF_TextPage::GetBoundedSegment(int index, int& start, int& count) const

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return ;

+    }

+    if (index < 0 || index >= m_Segment.GetSize()) {

+        return;

+    }

+    start = m_Segment.GetAt(index).m_Start;

+    count = m_Segment.GetAt(index).m_nCount;

+}

+int CPDF_TextPage::GetWordBreak(int index, int direction) const

+{

+    if(m_ParseOptions.m_bGetCharCodeOnly) {

+        return -1;

+    }

+    if (!m_IsParsered)	{

+        return -1;

+    }

+    if (direction != FPDFTEXT_LEFT && direction != FPDFTEXT_RIGHT) {

+        return -1;

+    }

+    if (index < 0 || index >= m_charList.GetSize()) {

+        return -1;

+    }

+    PAGECHAR_INFO charinfo;

+    charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);

+    if (charinfo.m_Index == -1 || charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED)	{

+        return index;

+    }

+    if (!IsLetter(charinfo.m_Unicode)) {

+        return index;

+    }

+    int breakPos = index;

+    if (direction == FPDFTEXT_LEFT) {

+        while (--breakPos > 0) {

+            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos);

+            if (!IsLetter(charinfo.m_Unicode)) {

+                return breakPos;

+            }

+        }

+        return breakPos;

+    } else if (direction == FPDFTEXT_RIGHT) {

+        while (++breakPos < m_charList.GetSize()) {

+            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos);

+            if (!IsLetter(charinfo.m_Unicode)) {

+                return breakPos;

+            }

+        }

+        return breakPos;

+    }

+    return breakPos;

+}

+FX_INT32 CPDF_TextPage::FindTextlineFlowDirection()

+{

+    if (!m_pPage)	{

+        return -1;

+    }

+    const FX_INT32 nPageWidth = (FX_INT32)((CPDF_Page*)m_pPage)->GetPageWidth();

+    const FX_INT32 nPageHeight = (FX_INT32)((CPDF_Page*)m_pPage)->GetPageHeight();

+    CFX_ByteArray nHorizontalMask;

+    if (!nHorizontalMask.SetSize(nPageWidth)) {

+        return -1;

+    }

+	FX_BYTE* pDataH = nHorizontalMask.GetData();

+    CFX_ByteArray nVerticalMask;

+    if (!nVerticalMask.SetSize(nPageHeight)) {

+        return -1;

+    }

+	FX_BYTE* pDataV = nVerticalMask.GetData();

+    FX_INT32 index = 0;

+    FX_FLOAT fLineHeight = 0.0f;

+    CPDF_PageObject* pPageObj = NULL;

+    FX_POSITION	pos = NULL;

+    pos = m_pPage->GetFirstObjectPosition();

+    if(!pos) {

+        return -1;

+    }

+    while(pos) {

+        pPageObj = m_pPage->GetNextObject(pos);

+        if(NULL == pPageObj) {

+            continue;

+        }

+        if(PDFPAGE_TEXT != pPageObj->m_Type) {

+            continue;

+        }

+		FX_INT32 minH = (FX_INT32)pPageObj->m_Left < 0 ? 0 : (FX_INT32)pPageObj->m_Left;

+		FX_INT32 maxH = (FX_INT32)pPageObj->m_Right > nPageWidth ? nPageWidth : (FX_INT32)pPageObj->m_Right;

+		FX_INT32 minV = (FX_INT32)pPageObj->m_Bottom < 0 ? 0 : (FX_INT32)pPageObj->m_Bottom;

+		FX_INT32 maxV = (FX_INT32)pPageObj->m_Top > nPageHeight ? nPageHeight : (FX_INT32)pPageObj->m_Top;

+		if (minH >= maxH || minV >= maxV){

+			continue;

+		}

+

+		FXSYS_memset8(pDataH + minH, 1, maxH - minH);

+		FXSYS_memset8(pDataV + minV, 1, maxV - minV);

+

+		if (fLineHeight <= 0.0f) {

+			fLineHeight = pPageObj->m_Top - pPageObj->m_Bottom;

+		}

+

+		pPageObj = NULL;

+    }

+    FX_INT32 nStartH = 0;

+    FX_INT32 nEndH = 0;

+    FX_FLOAT nSumH = 0.0f;

+    for (index = 0; index < nPageWidth; index++)

+        if(1 == nHorizontalMask[index]) {

+            break;

+        }

+    nStartH = index;

+    for (index = nPageWidth; index > 0; index--)

+        if(1 == nHorizontalMask[index - 1]) {

+            break;

+        }

+    nEndH = index;

+    for (index = nStartH; index < nEndH; index++) {

+        nSumH += nHorizontalMask[index];

+    }

+    nSumH /= nEndH - nStartH;

+    FX_INT32 nStartV = 0;

+    FX_INT32 nEndV = 0;

+    FX_FLOAT nSumV = 0.0f;

+    for (index = 0; index < nPageHeight; index++)

+        if(1 == nVerticalMask[index]) {

+            break;

+        }

+    nStartV = index;

+    for (index = nPageHeight; index > 0; index--)

+        if(1 == nVerticalMask[index - 1]) {

+            break;

+        }

+    nEndV = index;

+    for (index = nStartV; index < nEndV; index++) {

+        nSumV += nVerticalMask[index];

+    }

+    nSumV /= nEndV - nStartV;

+    if ((nEndV - nStartV) < (FX_INT32)(2 * fLineHeight)) {

+        return 0;

+    }

+    if ((nEndH - nStartH) < (FX_INT32)(2 * fLineHeight)) {

+        return 1;

+    }

+    if (nSumH > 0.8f) {

+        return 0;

+    }

+    if (nSumH - nSumV > 0.0f) {

+        return 0;

+    }

+    if (nSumV - nSumH > 0.0f) {

+        return 1;

+    }

+    return -1;

+}

+void CPDF_TextPage::ProcessObject()

+{

+    CPDF_PageObject*	pPageObj = NULL;

+    if (!m_pPage)	{

+        return;

+    }

+    FX_POSITION	pos;

+    pos = m_pPage->GetFirstObjectPosition();

+    if (!pos)	{

+        return;

+    }

+    m_TextlineDir = FindTextlineFlowDirection();

+    int nCount = 0;

+    while (pos) {

+        pPageObj = m_pPage->GetNextObject(pos);

+        if(pPageObj) {

+            if(pPageObj->m_Type == PDFPAGE_TEXT) {

+                if (nCount == 3) {

+                    nCount = nCount;

+                }

+                CFX_AffineMatrix matrix;

+                ProcessTextObject((CPDF_TextObject*)pPageObj, matrix, pos);

+                nCount++;

+            } else if (pPageObj->m_Type == PDFPAGE_FORM) {

+                CFX_AffineMatrix formMatrix(1, 0, 0, 1, 0, 0);

+                ProcessFormObject((CPDF_FormObject*)pPageObj, formMatrix);

+            }

+        }

+        pPageObj = NULL;

+    }

+    int count = m_LineObj.GetSize();

+    for(int i = 0; i < count; i++) {

+        ProcessTextObject(m_LineObj.GetAt(i));

+    }

+    m_LineObj.RemoveAll();

+    CloseTempLine();

+}

+void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj, CFX_AffineMatrix formMatrix)

+{

+    CPDF_PageObject*	pPageObj = NULL;

+    FX_POSITION	pos;

+    if (!pFormObj)	{

+        return;

+    }

+    pos = pFormObj->m_pForm->GetFirstObjectPosition();

+    if (!pos)	{

+        return;

+    }

+    CFX_AffineMatrix curFormMatrix;

+    curFormMatrix.Copy(pFormObj->m_FormMatrix);

+    curFormMatrix.Concat(formMatrix);

+    while (pos) {

+        pPageObj = pFormObj->m_pForm->GetNextObject(pos);

+        if(pPageObj) {

+            if(pPageObj->m_Type == PDFPAGE_TEXT) {

+                ProcessTextObject((CPDF_TextObject*)pPageObj, curFormMatrix, pos);

+            } else if (pPageObj->m_Type == PDFPAGE_FORM) {

+                ProcessFormObject((CPDF_FormObject*)pPageObj, curFormMatrix);

+            }

+        }

+        pPageObj = NULL;

+    }

+}

+int CPDF_TextPage::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const

+{

+    if(charCode == -1) {

+        return 0;

+    }

+    int w = pFont->GetCharWidthF(charCode);

+    if(w == 0) {

+        CFX_ByteString str;

+        pFont->AppendChar(str, charCode);

+        w = pFont->GetStringWidth(str, 1);

+        if(w == 0) {

+            FX_RECT BBox;

+            pFont->GetCharBBox(charCode, BBox);

+            w = BBox.right - BBox.left;

+        }

+    }

+    return w;

+}

+void CPDF_TextPage::OnPiece(IFX_BidiChar* pBidi, CFX_WideString& str)

+{

+    FX_INT32 start, count;

+    FX_INT32 ret = pBidi->GetBidiInfo(start, count);

+    if(ret == 2) {

+        for(int i = start + count - 1; i >= start; i--) {

+            m_TextBuf.AppendChar(str.GetAt(i));

+            m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i));

+        }

+    } else {

+        int end = start + count ;

+        for(int i = start; i < end; i++) {

+            m_TextBuf.AppendChar(str.GetAt(i));

+            m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i));

+        }

+    }

+}

+void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i)

+{

+    PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);

+    FX_WCHAR wChar = str.GetAt(i);

+#ifdef FOXIT_CHROME_BUILD

+    if(!IsControlChar(&Info)) {

+#else

+    if(wChar != 0xfffe) {

+#endif

+        Info.m_Index = m_TextBuf.GetLength();

+        if (wChar >= 0xFB00 && wChar <= 0xFB06) {

+            FX_LPWSTR pDst = NULL;

+            FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);

+            if (nCount >= 1) {

+                pDst = FX_Alloc(FX_WCHAR, nCount);

+                if (!pDst) {

+                    return;

+                }

+                FX_Unicode_GetNormalization(wChar, pDst);

+                for (int nIndex = 0; nIndex < nCount; nIndex++) {

+                    PAGECHAR_INFO Info2 = Info;

+                    Info2.m_Unicode = pDst[nIndex];

+                    Info2.m_Flag = FPDFTEXT_CHAR_PIECE;

+                    m_TextBuf.AppendChar(Info2.m_Unicode);

+                    if( !m_ParseOptions.m_bGetCharCodeOnly) {

+                        m_charList.Add(Info2);

+                    }

+                }

+                FX_Free(pDst);

+                return;

+            }

+        }

+        m_TextBuf.AppendChar(wChar);

+    } else {

+        Info.m_Index = -1;

+    }

+    if( !m_ParseOptions.m_bGetCharCodeOnly) {

+        m_charList.Add(Info);

+    }

+}

+void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i)

+{

+    PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);

+#ifdef FOXIT_CHROME_BUILD

+    if(!IsControlChar(&Info)) {

+#else

+    if(str.GetAt(i) != 0xfffe) {

+#endif

+        Info.m_Index = m_TextBuf.GetLength();

+        FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE);

+        FX_LPWSTR pDst = NULL;

+        FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);

+        if (nCount >= 1) {

+            pDst = FX_Alloc(FX_WCHAR, nCount);

+            if (!pDst) {

+                return;

+            }

+            FX_Unicode_GetNormalization(wChar, pDst);

+            for (int nIndex = 0; nIndex < nCount; nIndex++) {

+                PAGECHAR_INFO Info2 = Info;

+                Info2.m_Unicode = pDst[nIndex];

+                Info2.m_Flag = FPDFTEXT_CHAR_PIECE;

+                m_TextBuf.AppendChar(Info2.m_Unicode);

+                if( !m_ParseOptions.m_bGetCharCodeOnly) {

+                    m_charList.Add(Info2);

+                }

+            }

+            FX_Free(pDst);

+            return;

+        } else {

+            Info.m_Unicode = wChar;

+        }

+        m_TextBuf.AppendChar(Info.m_Unicode);

+    } else {

+        Info.m_Index = -1;

+    }

+    if( !m_ParseOptions.m_bGetCharCodeOnly) {

+        m_charList.Add(Info);

+    }

+}

+void CPDF_TextPage::CloseTempLine()

+{

+    int count1 = m_TempCharList.GetSize();

+    if (count1 <= 0) {

+        return;

+    }

+    IFX_BidiChar* BidiChar = IFX_BidiChar::Create();

+    CFX_WideString str = m_TempTextBuf.GetWideString();

+    CFX_WordArray order;

+    FX_BOOL bR2L = FALSE;

+    FX_INT32 start = 0, count = 0, i = 0;

+    int nR2L = 0, nL2R = 0;

+    FX_BOOL bPrevSpace = FALSE;

+    for (i = 0; i < str.GetLength(); i++) {

+        if(str.GetAt(i) == 32) {

+            if(bPrevSpace) {

+                m_TempTextBuf.Delete(i, 1);

+                m_TempCharList.Delete(i);

+                str.Delete(i);

+                count1 --;

+                i--;

+                continue;

+            }

+            bPrevSpace = TRUE;

+        } else {

+            bPrevSpace = FALSE;

+        }

+        if(BidiChar && BidiChar->AppendChar(str.GetAt(i))) {

+            FX_INT32 ret = BidiChar->GetBidiInfo(start, count);

+            order.Add(start);

+            order.Add(count);

+            order.Add(ret);

+            if(!bR2L) {

+                if(ret == 2) {

+                    nR2L++;

+                } else if (ret == 1) {

+                    nL2R++;

+                }

+            }

+        }

+    }

+    if(BidiChar && BidiChar->EndChar()) {

+        FX_INT32 ret = BidiChar->GetBidiInfo(start, count);

+        order.Add(start);

+        order.Add(count);

+        order.Add(ret);

+        if(!bR2L) {

+            if(ret == 2) {

+                nR2L++;

+            } else if(ret == 1) {

+                nL2R++;

+            }

+        }

+    }

+    if(nR2L > 0 && nR2L >= nL2R) {

+        bR2L = TRUE;

+    }

+    if(this->m_parserflag == FPDFTEXT_RLTB || bR2L) {

+        int count = order.GetSize();

+        for(int j = count - 1; j > 0; j -= 3) {

+            int ret = order.GetAt(j);

+            int start = order.GetAt(j - 2);

+            int count1 = order.GetAt(j - 1);

+            if(ret == 2 || ret == 0) {

+                for(int i = start + count1 - 1; i >= start; i--) {

+                    AddCharInfoByRLDirection(str, i);

+                }

+            } else {

+                i = j;

+                FX_BOOL bSymbol = FALSE;

+                while(i > 0 && order.GetAt(i) != 2) {

+                    bSymbol = !order.GetAt(i);

+                    i -= 3;

+                }

+                int end = start + count1 ;

+                int n = 0;

+                if(bSymbol) {

+                    n = i + 6;

+                } else {

+                    n = i + 3;

+                }

+                if(n >= j) {

+                    for(int m = start; m < end; m++) {

+                        AddCharInfoByLRDirection(str, m);

+                    }

+                } else {

+                    i = j;

+                    j = n;

+                    for(; n <= i; n += 3) {

+                        int ret = order.GetAt(n);

+                        int start = order.GetAt(n - 2);

+                        int count1 = order.GetAt(n - 1);

+                        int end = start + count1 ;

+                        for(int m = start; m < end; m++) {

+                            AddCharInfoByLRDirection(str, m);

+                        }

+                    }

+                }

+            }

+        }

+    } else {

+        int count = order.GetSize();

+        FX_BOOL bL2R = FALSE;

+        for(int j = 0; j < count; j += 3) {

+            int ret = order.GetAt(j + 2);

+            int start = order.GetAt(j);

+            int count1 = order.GetAt(j + 1);

+            if(ret == 2 || (j == 0 && ret == 0 && !bL2R)) {

+                int i = j + 3;

+                while(bR2L && i < count) {

+                    if(order.GetAt(i + 2) == 1) {

+                        break;

+                    } else {

+                        i += 3;

+                    }

+                }

+                if(i == 3) {

+                    j = -3;

+                    bL2R = TRUE;

+                    continue;

+                }

+                int end = m_TempCharList.GetSize() - 1;

+                if(i < count) {

+                    end = order.GetAt(i) - 1;

+                }

+                j = i - 3;

+                for(int n = end; n >= start; n--) {

+                    AddCharInfoByRLDirection(str, n);

+                }

+            } else {

+                int end = start + count1 ;

+                for(int i = start; i < end; i++) {

+                    AddCharInfoByLRDirection(str, i);

+                }

+            }

+        }

+    }

+    int ntext = m_TextBuf.GetSize();

+    ntext = m_charList.GetSize();

+    order.RemoveAll();

+    m_TempCharList.RemoveAll();

+    m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength());

+    BidiChar->Release();

+}

+void CPDF_TextPage::ProcessTextObject(CPDF_TextObject*	pTextObj, CFX_AffineMatrix formMatrix, FX_POSITION ObjPos)

+{

+    CFX_FloatRect re(pTextObj->m_Left, pTextObj->m_Bottom, pTextObj->m_Right, pTextObj->m_Top);

+    if(FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f ) {

+        return;

+    }

+    int count = m_LineObj.GetSize();

+    PDFTEXT_Obj Obj;

+    Obj.m_pTextObj = pTextObj;

+    Obj.m_formMatrix = formMatrix;

+    if(count == 0) {

+        m_LineObj.Add(Obj);

+        return;

+    }

+    if (IsSameAsPreTextObject(pTextObj, ObjPos)) {

+        return;

+    }

+    PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(count - 1);

+    CPDF_TextObjectItem item;

+    int nItem = prev_Obj.m_pTextObj->CountItems();

+    prev_Obj.m_pTextObj->GetItemInfo(nItem - 1, &item);

+    FX_FLOAT prev_width = GetCharWidth(item.m_CharCode, prev_Obj.m_pTextObj->GetFont()) * prev_Obj.m_pTextObj->GetFontSize() / 1000;

+    CFX_AffineMatrix prev_matrix;

+    prev_Obj.m_pTextObj->GetTextMatrix(&prev_matrix);

+    prev_width = FXSYS_fabs(prev_width);

+    prev_matrix.Concat(prev_Obj.m_formMatrix);

+    prev_width = prev_matrix.TransformDistance(prev_width);

+    pTextObj->GetItemInfo(0, &item);

+    FX_FLOAT this_width = GetCharWidth(item.m_CharCode, pTextObj->GetFont()) * pTextObj->GetFontSize() / 1000;

+    this_width = FXSYS_fabs(this_width);

+    CFX_AffineMatrix this_matrix;

+    pTextObj->GetTextMatrix(&this_matrix);

+    this_width = FXSYS_fabs(this_width);

+    this_matrix.Concat(formMatrix);

+    this_width = this_matrix.TransformDistance(this_width);

+    FX_FLOAT threshold = prev_width > this_width ? prev_width / 4 : this_width / 4;

+    FX_FLOAT prev_x = prev_Obj.m_pTextObj->GetPosX(), prev_y = prev_Obj.m_pTextObj->GetPosY();

+    prev_Obj.m_formMatrix.Transform(prev_x, prev_y);

+    m_DisplayMatrix.Transform(prev_x, prev_y);

+    FX_FLOAT this_x = pTextObj->GetPosX(), this_y = pTextObj->GetPosY();

+    formMatrix.Transform(this_x, this_y);

+    m_DisplayMatrix.Transform(this_x, this_y);

+    if (FXSYS_fabs(this_y - prev_y) > threshold * 2) {

+        for(int i = 0; i < count; i++) {

+            ProcessTextObject(m_LineObj.GetAt(i));

+        }

+        m_LineObj.RemoveAll();

+        m_LineObj.Add(Obj);

+        return;

+    }

+    int i = 0;

+    if(m_ParseOptions.m_bNormalizeObjs) {

+        for(i = count - 1; i >= 0; i--) {

+            PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(i);

+            CFX_AffineMatrix prev_matrix;

+            prev_Obj.m_pTextObj->GetTextMatrix(&prev_matrix);

+            FX_FLOAT Prev_x = prev_Obj.m_pTextObj->GetPosX(), Prev_y = prev_Obj.m_pTextObj->GetPosY();

+            prev_Obj.m_formMatrix.Transform(Prev_x, Prev_y);

+            m_DisplayMatrix.Transform(Prev_x, Prev_y);

+            if(this_x >= Prev_x) {

+                if(i == count - 1) {

+                    m_LineObj.Add(Obj);

+                } else {

+                    m_LineObj.InsertAt(i + 1, Obj);

+                }

+                break;

+            }

+        }

+        if(i < 0) {

+            m_LineObj.InsertAt(0, Obj);

+        }

+    } else {

+        m_LineObj.Add(Obj);

+    }

+}

+FX_INT32 CPDF_TextPage::PreMarkedContent(PDFTEXT_Obj Obj)

+{

+    CPDF_TextObject* pTextObj = Obj.m_pTextObj;

+    CPDF_ContentMarkData* pMarkData = (CPDF_ContentMarkData*)pTextObj->m_ContentMark.GetObject();

+    if(!pMarkData) {

+        return FPDFTEXT_MC_PASS;

+    }

+    int nContentMark = pMarkData->CountItems();

+    if (nContentMark < 1) {

+        return FPDFTEXT_MC_PASS;

+    }

+    CFX_WideString actText;

+    FX_BOOL bExist = FALSE;

+    CPDF_Dictionary* pDict = NULL;

+    int n = 0;

+    for (n = 0; n < nContentMark; n++) {

+        CPDF_ContentMarkItem& item = pMarkData->GetItem(n);

+        CFX_ByteString tagStr = (CFX_ByteString)item.GetName();

+        pDict = (CPDF_Dictionary*)item.GetParam();

+        CPDF_String* temp = (CPDF_String*)pDict->GetElement(FX_BSTRC("ActualText"));

+        if (temp) {

+            bExist = TRUE;

+            actText = temp->GetUnicodeText();

+        }

+    }

+    if (!bExist) {

+        return FPDFTEXT_MC_PASS;

+    }

+    if (m_pPreTextObj) {

+        if (CPDF_ContentMarkData* pPreMarkData = (CPDF_ContentMarkData*)m_pPreTextObj->m_ContentMark.GetObject()) {

+            if (pPreMarkData->CountItems() == n) {

+                CPDF_ContentMarkItem& item = pPreMarkData->GetItem(n - 1);

+                if (pDict == item.GetParam()) {

+                    return FPDFTEXT_MC_DONE;

+                }

+            }

+        }

+    }

+    CPDF_Font*	pFont = pTextObj->GetFont();

+    FX_STRSIZE nItems = actText.GetLength();

+    if (nItems < 1) {

+        return FPDFTEXT_MC_PASS;

+    }

+    bExist = FALSE;

+    for (FX_STRSIZE i = 0; i < nItems; i++) {

+        FX_WCHAR wChar = actText.GetAt(i);

+        if (-1 == pFont->CharCodeFromUnicode(wChar)) {

+            continue;

+        } else {

+            bExist = TRUE;

+            break;

+        }

+    }

+    if (!bExist) {

+        return FPDFTEXT_MC_PASS;

+    }

+    bExist = FALSE;

+    for (FX_STRSIZE j = 0; j < nItems; j++) {

+        FX_WCHAR wChar = actText.GetAt(j);

+        if ((wChar > 0x80 && wChar < 0xFFFD) || (wChar <= 0x80 && isprint(wChar))) {

+            bExist = TRUE;

+            break;

+        }

+    }

+    if (!bExist) {

+        return FPDFTEXT_MC_DONE;

+    }

+    return FPDFTEXT_MC_DELAY;

+}

+void CPDF_TextPage::ProcessMarkedContent(PDFTEXT_Obj Obj)

+{

+    CPDF_TextObject* pTextObj = Obj.m_pTextObj;

+    CPDF_ContentMarkData* pMarkData = (CPDF_ContentMarkData*)pTextObj->m_ContentMark.GetObject();

+    if(!pMarkData) {

+        return;

+    }

+    int nContentMark = pMarkData->CountItems();

+    if (nContentMark < 1) {

+        return;

+    }

+    CFX_WideString actText;

+    CPDF_Dictionary* pDict = NULL;

+    int n = 0;

+    for (n = 0; n < nContentMark; n++) {

+        CPDF_ContentMarkItem& item = pMarkData->GetItem(n);

+        CFX_ByteString tagStr = (CFX_ByteString)item.GetName();

+        pDict = (CPDF_Dictionary*)item.GetParam();

+        CPDF_String* temp = (CPDF_String*)pDict->GetElement(FX_BSTRC("ActualText"));

+        if (temp) {

+            actText = temp->GetUnicodeText();

+        }

+    }

+    FX_STRSIZE nItems = actText.GetLength();

+    if (nItems < 1) {

+        return;

+    }

+    CPDF_Font*	pFont = pTextObj->GetFont();

+    CFX_AffineMatrix formMatrix = Obj.m_formMatrix;

+    CFX_AffineMatrix matrix;

+    pTextObj->GetTextMatrix(&matrix);

+    matrix.Concat(formMatrix);

+    FX_FLOAT fPosX = pTextObj->GetPosX();

+    FX_FLOAT fPosY = pTextObj->GetPosY();

+    int nCharInfoIndex = m_TextBuf.GetLength();

+    CFX_FloatRect charBox;

+    charBox.top = pTextObj->m_Top;

+    charBox.left = pTextObj->m_Left;

+    charBox.right = pTextObj->m_Right;

+    charBox.bottom = pTextObj->m_Bottom;

+    for (FX_STRSIZE k = 0; k < nItems; k++) {

+        FX_WCHAR wChar = actText.GetAt(k);

+        if (wChar <= 0x80 && !isprint(wChar)) {

+            wChar = 0x20;

+        }

+        if (wChar >= 0xFFFD) {

+            continue;

+        }

+        PAGECHAR_INFO charinfo;

+        charinfo.m_OriginX = fPosX;

+        charinfo.m_OriginY = fPosY;

+        charinfo.m_Index = nCharInfoIndex;

+        charinfo.m_Unicode = wChar;

+        charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar);

+        charinfo.m_Flag = FPDFTEXT_CHAR_PIECE;

+        charinfo.m_pTextObj = pTextObj;

+        charinfo.m_CharBox.top = charBox.top;

+        charinfo.m_CharBox.left = charBox.left;

+        charinfo.m_CharBox.right = charBox.right;

+        charinfo.m_CharBox.bottom = charBox.bottom;

+        charinfo.m_Matrix.Copy(matrix);

+        m_TempTextBuf.AppendChar(wChar);

+        m_TempCharList.Add(charinfo);

+    }

+}

+void CPDF_TextPage::FindPreviousTextObject(void)

+{

+    if (m_TempCharList.GetSize() < 1 && m_charList.GetSize() < 1) {

+        return;

+    }

+    PAGECHAR_INFO preChar;

+    if (m_TempCharList.GetSize() >= 1) {

+        preChar = *(PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);

+    } else {

+        preChar = *(PAGECHAR_INFO*)m_charList.GetAt(m_charList.GetSize() - 1);

+    }

+    if (preChar.m_pTextObj) {

+        m_pPreTextObj = preChar.m_pTextObj;

+    }

+}

+void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj)

+{

+    CPDF_TextObject* pTextObj = Obj.m_pTextObj;

+    if(FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f ) {

+        return;

+    }

+    CFX_AffineMatrix formMatrix = Obj.m_formMatrix;

+    CPDF_Font*	pFont = pTextObj->GetFont();

+    CFX_AffineMatrix matrix;

+    pTextObj->GetTextMatrix(&matrix);

+    matrix.Concat(formMatrix);

+    FX_INT32 bPreMKC = PreMarkedContent(Obj);

+    if (FPDFTEXT_MC_DONE == bPreMKC) {

+        m_pPreTextObj = pTextObj;

+        m_perMatrix.Copy(formMatrix);

+        return;

+    }

+    int result = 0;

+    if (m_pPreTextObj) {

+        result = ProcessInsertObject(pTextObj, formMatrix);

+        if (2 == result) {

+            m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);

+        } else {

+            m_CurlineRect.Union(CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top));

+        }

+        PAGECHAR_INFO generateChar;

+        if (result == 1) {

+            if (GenerateCharInfo(TEXT_BLANK_CHAR, generateChar)) {

+                if (!formMatrix.IsIdentity()) {

+                    generateChar.m_Matrix.Copy(formMatrix);

+                }

+                m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR);

+                m_TempCharList.Add(generateChar);

+            }

+        } else if(result == 2) {

+            CloseTempLine();

+            if(m_TextBuf.GetSize()) {

+                if(m_ParseOptions.m_bGetCharCodeOnly) {

+                    m_TextBuf.AppendChar(TEXT_RETURN_CHAR);

+                    m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR);

+                } else {

+                    if(GenerateCharInfo(TEXT_RETURN_CHAR, generateChar)) {

+                        m_TextBuf.AppendChar(TEXT_RETURN_CHAR);

+                        if (!formMatrix.IsIdentity()) {

+                            generateChar.m_Matrix.Copy(formMatrix);

+                        }

+                        m_charList.Add(generateChar);

+                    }

+                    if(GenerateCharInfo(TEXT_LINEFEED_CHAR, generateChar)) {

+                        m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR);

+                        if (!formMatrix.IsIdentity()) {

+                            generateChar.m_Matrix.Copy(formMatrix);

+                        }

+                        m_charList.Add(generateChar);

+                    }

+                }

+            }

+        } else if (result == 3 && !m_ParseOptions.m_bOutputHyphen) {

+            FX_INT32 nChars = pTextObj->CountChars();

+            if (nChars == 1) {

+                CPDF_TextObjectItem item;

+                pTextObj->GetCharInfo(0, &item);

+                CFX_WideString wstrItem = pTextObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);

+                if(wstrItem.IsEmpty()) {

+                    wstrItem += (FX_WCHAR)item.m_CharCode;

+                }

+                FX_WCHAR curChar = wstrItem.GetAt(0);

+                if (0x2D == curChar || 0xAD == curChar) {

+                    return;

+                }

+            }

+            while (m_TempTextBuf.GetSize() > 0 && m_TempTextBuf.GetWideString().GetAt(m_TempTextBuf.GetLength() - 1) == 0x20) {

+                m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);

+                m_TempCharList.Delete(m_TempCharList.GetSize() - 1);

+            }

+            PAGECHAR_INFO* cha = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);

+            m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);

+#ifdef FOXIT_CHROME_BUILD

+            cha->m_Unicode = 0x2;

+            cha->m_Flag = FPDFTEXT_CHAR_HYPHEN;

+            m_TempTextBuf.AppendChar(0xfffe);

+#else

+            cha->m_Unicode = 0;

+            m_TempTextBuf.AppendChar(0xfffe);

+#endif

+        }

+    } else {

+        m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);

+    }

+    if (FPDFTEXT_MC_DELAY == bPreMKC) {

+        ProcessMarkedContent(Obj);

+        m_pPreTextObj = pTextObj;

+        m_perMatrix.Copy(formMatrix);

+        return;

+    }

+    m_pPreTextObj = pTextObj;

+    m_perMatrix.Copy(formMatrix);

+    int nItems = pTextObj->CountItems();

+    FX_FLOAT spacing = 0;

+    FX_FLOAT baseSpace = 0.0;

+    FX_BOOL bAllChar = TRUE;

+    if (pTextObj->m_TextState.GetObject()->m_CharSpace && nItems >= 3) {

+        spacing = matrix.TransformDistance(pTextObj->m_TextState.GetObject()->m_CharSpace);

+        baseSpace = spacing;

+        for (int i = 0; i < nItems; i++) {

+            CPDF_TextObjectItem item;

+            pTextObj->GetItemInfo(i, &item);

+            if (item.m_CharCode == (FX_DWORD) - 1) {

+                FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();

+                FX_FLOAT kerning = -fontsize_h * item.m_OriginX / 1000;

+                if(kerning + spacing < baseSpace) {

+                    baseSpace = kerning + spacing;

+                }

+                bAllChar = FALSE;

+            }

+        }

+        spacing = 0;

+        if(baseSpace < 0.0 || (nItems == 3 && !bAllChar)) {

+            baseSpace = 0.0;

+        }

+    }

+    for (int i = 0; i < nItems; i++) {

+        CPDF_TextObjectItem item;

+        PAGECHAR_INFO charinfo;

+        charinfo.m_OriginX = 0;

+        charinfo.m_OriginY = 0;

+        pTextObj->GetItemInfo(i, &item);

+        if (item.m_CharCode == (FX_DWORD) - 1) {

+            CFX_WideString str = m_TempTextBuf.GetWideString();

+            if(str.IsEmpty()) {

+                str = m_TextBuf.GetWideString();

+            }

+            if (str.IsEmpty() || str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) {

+                continue;

+            }

+            FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();

+            spacing = -fontsize_h * item.m_OriginX / 1000;

+            continue;

+        }

+        FX_FLOAT charSpace = pTextObj->m_TextState.GetObject()->m_CharSpace;

+        if (charSpace > 0.001) {

+            spacing += matrix.TransformDistance(charSpace);

+        } else if(charSpace < -0.001) {

+            spacing -= matrix.TransformDistance(FXSYS_fabs(charSpace));

+        }

+        spacing -= baseSpace;

+        if (spacing && i > 0) {

+            int last_width = 0;

+            FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();

+            FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');

+            FX_FLOAT threshold = 0;

+            if (space_charcode != -1) {

+                threshold = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000 ;

+            }

+            if (threshold > fontsize_h / 3) {

+                threshold = 0;

+            } else {

+                threshold /= 2;

+            }

+            if (threshold == 0) {

+                threshold = fontsize_h;

+                int this_width = FXSYS_abs(GetCharWidth(item.m_CharCode, pFont));

+                threshold = this_width > last_width ? (FX_FLOAT)this_width : (FX_FLOAT)last_width;

+                int nDivide = 6;

+                if (threshold < 300) {

+                    nDivide = 2;

+                } else if (threshold < 500) {

+                    nDivide = 4;

+                } else if (threshold < 700) {

+                    nDivide = 5;

+                }

+                threshold = threshold / nDivide;

+                threshold = fontsize_h * threshold / 1000;

+            }

+            if (threshold && (spacing && spacing >= threshold) ) {

+                charinfo.m_Unicode = TEXT_BLANK_CHAR;

+                charinfo.m_Flag = FPDFTEXT_CHAR_GENERATED;

+                charinfo.m_pTextObj = pTextObj;

+                charinfo.m_Index = m_TextBuf.GetLength();

+                m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR);

+                charinfo.m_CharCode = -1;

+                charinfo.m_Matrix.Copy(formMatrix);

+                matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);

+                charinfo.m_CharBox = CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);

+                m_TempCharList.Add(charinfo);

+            }

+            if (item.m_CharCode == (FX_DWORD) - 1) {

+                continue;

+            }

+        }

+        spacing = 0;

+        CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode);

+        FX_BOOL bNoUnicode = FALSE;

+        FX_WCHAR wChar = wstrItem.GetAt(0);

+        if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) {

+            if(wstrItem.IsEmpty()) {

+                wstrItem += (FX_WCHAR)item.m_CharCode;

+            } else {

+                wstrItem.SetAt(0, (FX_WCHAR)item.m_CharCode);

+            }

+            bNoUnicode = TRUE;

+        }

+        charinfo.m_Index = -1;

+        charinfo.m_CharCode = item.m_CharCode;

+        if(bNoUnicode) {

+            charinfo.m_Flag = FPDFTEXT_CHAR_UNUNICODE;

+        } else {

+            charinfo.m_Flag = FPDFTEXT_CHAR_NORMAL;

+        }

+        charinfo.m_pTextObj = pTextObj;

+        charinfo.m_OriginX = 0, charinfo.m_OriginY = 0;

+        matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);

+        FX_RECT rect(0, 0, 0, 0);

+        rect.Intersect(0, 0, 0, 0);

+        charinfo.m_pTextObj->GetFont()->GetCharBBox(charinfo.m_CharCode, rect);

+        charinfo.m_CharBox.top = rect.top * pTextObj->GetFontSize() / 1000 + item.m_OriginY;

+        charinfo.m_CharBox.left = rect.left * pTextObj->GetFontSize() / 1000 + item.m_OriginX;

+        charinfo.m_CharBox.right = rect.right * pTextObj->GetFontSize() / 1000 + item.m_OriginX;

+        charinfo.m_CharBox.bottom = rect.bottom * pTextObj->GetFontSize() / 1000 + item.m_OriginY;

+        if (fabsf(charinfo.m_CharBox.top - charinfo.m_CharBox.bottom) < 0.01f) {

+            charinfo.m_CharBox.top = charinfo.m_CharBox.bottom + pTextObj->GetFontSize();

+        }

+        if (fabsf(charinfo.m_CharBox.right - charinfo.m_CharBox.left) < 0.01f) {

+            charinfo.m_CharBox.right = charinfo.m_CharBox.left + pTextObj->GetCharWidth(charinfo.m_CharCode);

+        }

+        matrix.TransformRect(charinfo.m_CharBox);

+        charinfo.m_Matrix.Copy(matrix);

+        if (wstrItem.IsEmpty()) {

+            charinfo.m_Unicode = 0;

+            m_TempCharList.Add(charinfo);

+            m_TempTextBuf.AppendChar(0xfffe);

+            continue;

+        } else {

+            int nTotal = wstrItem.GetLength();

+            int n = 0;

+            FX_BOOL bDel = FALSE;

+            while (n < m_TempCharList.GetSize() && n < 7) {

+                n++;

+                PAGECHAR_INFO* charinfo1 = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - n);

+                if(charinfo1->m_CharCode == charinfo.m_CharCode &&

+                        charinfo1->m_pTextObj->GetFont() == charinfo.m_pTextObj->GetFont()  &&

+                        FXSYS_fabs(charinfo1->m_OriginX - charinfo.m_OriginX) < TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize()  &&

+                        FXSYS_fabs(charinfo1->m_OriginY - charinfo.m_OriginY) < TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize() ) {

+                    bDel = TRUE;

+                    break;

+                }

+            }

+            if(!bDel) {

+                for (int nIndex = 0; nIndex < nTotal; nIndex++) {

+                    charinfo.m_Unicode = wstrItem.GetAt(nIndex);

+                    if (charinfo.m_Unicode) {

+                        charinfo.m_Index = m_TextBuf.GetLength();

+                        m_TempTextBuf.AppendChar(charinfo.m_Unicode);

+                    } else {

+                        m_TempTextBuf.AppendChar(0xfffe);

+                    }

+                    m_TempCharList.Add(charinfo);

+                }

+            } else if(i == 0) {

+                CFX_WideString str = m_TempTextBuf.GetWideString();

+                if (!str.IsEmpty() && str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) {

+                    m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);

+                    m_TempCharList.Delete(m_TempCharList.GetSize() - 1);

+                }

+            }

+        }

+    }

+}

+FX_INT32 CPDF_TextPage::GetTextObjectWritingMode(const CPDF_TextObject* pTextObj)

+{

+    FX_INT32 nChars = pTextObj->CountChars();

+    if (nChars == 1) {

+        return m_TextlineDir;

+    }

+    CPDF_TextObjectItem first, last;

+    pTextObj->GetCharInfo(0, &first);

+    pTextObj->GetCharInfo(nChars - 1, &last);

+    CFX_Matrix textMatrix;

+    pTextObj->GetTextMatrix(&textMatrix);

+    textMatrix.TransformPoint(first.m_OriginX, first.m_OriginY);

+    textMatrix.TransformPoint(last.m_OriginX, last.m_OriginY);

+    FX_FLOAT dX = FXSYS_fabs(last.m_OriginX - first.m_OriginX);

+    FX_FLOAT dY = FXSYS_fabs(last.m_OriginY - first.m_OriginY);

+    if (dX <= 0.0001f && dY <= 0.0001f) {

+        return -1;

+    }

+    CFX_VectorF v;

+    v.Set(dX, dY);

+    v.Normalize();

+    if (v.y <= 0.0872f) {

+        if (v.x <= 0.0872f) {

+            return m_TextlineDir;

+        }

+        return 0;

+    } else if (v.x <= 0.0872f) {

+        return 1;

+    }

+    return m_TextlineDir;

+}

+FX_BOOL CPDF_TextPage::IsHyphen(FX_WCHAR curChar)

+{

+    CFX_WideString strCurText = m_TempTextBuf.GetWideString();

+    if(strCurText.GetLength() == 0) {

+        strCurText = m_TextBuf.GetWideString();

+    }

+    FX_STRSIZE nCount = strCurText.GetLength();

+    int nIndex = nCount - 1;

+    FX_WCHAR wcTmp = strCurText.GetAt(nIndex);

+    while(wcTmp == 0x20 && nIndex <= nCount - 1 && nIndex >= 0) {

+        wcTmp = strCurText.GetAt(--nIndex);

+    }

+    if (0x2D == wcTmp || 0xAD == wcTmp) {

+        if (--nIndex > 0) {

+            FX_WCHAR preChar = strCurText.GetAt((nIndex));

+            if (((preChar >= L'A' && preChar <= L'Z') || (preChar >= L'a' && preChar <= L'z'))

+                    && ((curChar >= L'A' && curChar <= L'Z') || (curChar >= L'a' && curChar <= L'z'))) {

+                return TRUE;

+            }

+        }

+        int size = m_TempCharList.GetSize();

+        PAGECHAR_INFO preChar;

+        if (size) {

+            preChar = (PAGECHAR_INFO)m_TempCharList[size - 1];

+        } else {

+            size = m_charList.GetSize();

+            if(size == 0) {

+                return FALSE;

+            }

+            preChar = (PAGECHAR_INFO)m_charList[size - 1];

+        }

+        if (FPDFTEXT_CHAR_PIECE == preChar.m_Flag)

+            if (0xAD == preChar.m_Unicode || 0x2D == preChar.m_Unicode) {

+                return TRUE;

+            }

+    }

+    return FALSE;

+}

+int CPDF_TextPage::ProcessInsertObject(const CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix)

+{

+    FindPreviousTextObject();

+    FX_BOOL bNewline = FALSE;

+    int WritingMode = GetTextObjectWritingMode(pObj);

+    if(WritingMode == -1) {

+        WritingMode = GetTextObjectWritingMode(m_pPreTextObj);

+    }

+    CFX_FloatRect this_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);

+    CFX_FloatRect prev_rect(m_pPreTextObj->m_Left, m_pPreTextObj->m_Bottom, m_pPreTextObj->m_Right, m_pPreTextObj->m_Top);

+    CPDF_TextObjectItem PrevItem, item;

+    int nItem = m_pPreTextObj->CountItems();

+    m_pPreTextObj->GetItemInfo(nItem - 1, &PrevItem);

+    pObj->GetItemInfo(0, &item);

+    CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);

+    if(wstrItem.IsEmpty()) {

+        wstrItem += (FX_WCHAR)item.m_CharCode;

+    }

+    FX_WCHAR curChar = wstrItem.GetAt(0);

+    if(WritingMode == 0) {

+        if(this_rect.Height() > 4.5 && prev_rect.Height() > 4.5) {

+            FX_FLOAT top = this_rect.top < prev_rect.top ? this_rect.top : prev_rect.top;

+            FX_FLOAT bottom = this_rect.bottom > prev_rect.bottom ? this_rect.bottom : prev_rect.bottom;

+            if(bottom >= top) {

+                if(IsHyphen(curChar)) {

+                    return 3;

+                }

+                return 2;

+            }

+        }

+    } else if (WritingMode == 1) {

+        if(this_rect.Width() > pObj->GetFontSize() * 0.1f && prev_rect.Width() > m_pPreTextObj->GetFontSize() * 0.1f) {

+            FX_FLOAT left = this_rect.left > m_CurlineRect.left ? this_rect.left : m_CurlineRect.left;

+            FX_FLOAT right = this_rect.right < m_CurlineRect.right ? this_rect.right : m_CurlineRect.right;

+            if(right <= left) {

+                if(IsHyphen(curChar)) {

+                    return 3;

+                }

+                return 2;

+            }

+        }

+    }

+    FX_FLOAT last_pos = PrevItem.m_OriginX;

+    int nLastWidth = GetCharWidth(PrevItem.m_CharCode, m_pPreTextObj->GetFont());

+    FX_FLOAT last_width = nLastWidth * m_pPreTextObj->GetFontSize() / 1000;

+    last_width = FXSYS_fabs(last_width);

+    int nThisWidth = GetCharWidth(item.m_CharCode, pObj->GetFont());

+    FX_FLOAT this_width = nThisWidth * pObj->GetFontSize() / 1000;

+    this_width = FXSYS_fabs(this_width);

+    FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;

+    CFX_AffineMatrix prev_matrix, prev_reverse;

+    m_pPreTextObj->GetTextMatrix(&prev_matrix);

+    prev_matrix.Concat(m_perMatrix);

+    prev_reverse.SetReverse(prev_matrix);

+    FX_FLOAT x = pObj->GetPosX();

+    FX_FLOAT y = pObj->GetPosY();

+    formMatrix.Transform(x, y);

+    prev_reverse.Transform(x, y);

+    if(last_width < this_width) {

+        threshold = prev_reverse.TransformDistance(threshold);

+    }

+    CFX_FloatRect rect1(m_pPreTextObj->m_Left, pObj->m_Bottom, m_pPreTextObj->m_Right, pObj->m_Top);

+    CFX_FloatRect rect2(m_pPreTextObj->m_Left, m_pPreTextObj->m_Bottom, m_pPreTextObj->m_Right, m_pPreTextObj->m_Top);

+    CFX_FloatRect rect3 = rect1;

+    rect1.Intersect(rect2);

+    if (WritingMode == 0) {

+        if ((rect1.IsEmpty() && rect2.Height() > 5 && rect3.Height() > 5)

+                || ((y > threshold * 2 || y < threshold * -3) && (FXSYS_fabs(y) < 1 ? FXSYS_fabs(x) < FXSYS_fabs(y) : TRUE))) {

+            bNewline = TRUE;

+            if(nItem > 1 ) {

+                CPDF_TextObjectItem tempItem;

+                m_pPreTextObj->GetItemInfo(0, &tempItem);

+                CFX_AffineMatrix m;

+                m_pPreTextObj->GetTextMatrix(&m);

+                if(PrevItem.m_OriginX > tempItem.m_OriginX &&

+                        m_DisplayMatrix.a > 0.9 && m_DisplayMatrix.b < 0.1 &&

+                        m_DisplayMatrix.c < 0.1 && m_DisplayMatrix.d < -0.9

+                        && m.b < 0.1 && m.c < 0.1 ) {

+                    CFX_FloatRect re(0, m_pPreTextObj->m_Bottom, 1000, m_pPreTextObj->m_Top);

+                    if(re.Contains(pObj->GetPosX(), pObj->GetPosY())) {

+                        bNewline = FALSE;

+                    } else {

+                        CFX_FloatRect re(0, pObj->m_Bottom, 1000, pObj->m_Top);

+                        if(re.Contains(m_pPreTextObj->GetPosX(), m_pPreTextObj->GetPosY())) {

+                            bNewline = FALSE;

+                        }

+                    }

+                }

+            }

+        }

+    }

+    if(bNewline) {

+        if(IsHyphen(curChar)) {

+            return 3;

+        }

+        return 2;

+    }

+    FX_INT32 nChars = pObj->CountChars();

+    if (nChars == 1 && ( 0x2D == curChar || 0xAD == curChar))

+        if (IsHyphen(curChar)) {

+            return 3;

+        }

+    CFX_WideString PrevStr = m_pPreTextObj->GetFont()->UnicodeFromCharCode(PrevItem.m_CharCode);

+    FX_WCHAR preChar = PrevStr.GetAt(PrevStr.GetLength() - 1);

+    CFX_AffineMatrix matrix;

+    pObj->GetTextMatrix(&matrix);

+    matrix.Concat(formMatrix);

+    threshold = (FX_FLOAT)(nLastWidth > nThisWidth ? nLastWidth : nThisWidth);

+    threshold = threshold > 400 ? (threshold < 700 ? threshold / 4 :  (threshold > 800 ? threshold / 6 : threshold / 5)) : (threshold / 2);

+    if(nLastWidth >= nThisWidth) {

+        threshold *= FXSYS_fabs(m_pPreTextObj->GetFontSize());

+    } else {

+        threshold *= FXSYS_fabs(pObj->GetFontSize());

+        threshold = matrix.TransformDistance(threshold);

+        threshold = prev_reverse.TransformDistance(threshold);

+    }

+    threshold /= 1000;

+    if((threshold < 1.4881 && threshold > 1.4879)

+            || (threshold < 1.39001 && threshold > 1.38999)) {

+        threshold *= 1.5;

+    }

+    if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ' && preChar != L' ')

+        if (curChar != L' ' && preChar != L' ') {

+            if((x - last_pos - last_width) > threshold || (last_pos - x - last_width) > threshold) {

+                return 1;

+            }

+            if(x < 0 && (last_pos - x - last_width) > threshold) {

+                return 1;

+            }

+            if((x - last_pos - last_width) > this_width || (x - last_pos - this_width) > last_width ) {

+                return 1;

+            }

+        }

+    return 0;

+}

+FX_BOOL CPDF_TextPage::IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2)

+{

+    if (!pTextObj1 || !pTextObj2) {

+        return FALSE;

+    }

+    CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);

+    CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);

+    if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty() && !m_ParseOptions.m_bGetCharCodeOnly) {

+        FX_FLOAT dbXdif = FXSYS_fabs(rcPreObj.left - rcCurObj.left);

+        int nCount = m_charList.GetSize();

+        if (nCount >= 2) {

+            PAGECHAR_INFO perCharTemp = (PAGECHAR_INFO)m_charList[nCount - 2];

+            FX_FLOAT dbSpace = perCharTemp.m_CharBox.Width();

+            if (dbXdif > dbSpace) {

+                return FALSE;

+            }

+        }

+    }

+    if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {

+        rcPreObj.Intersect(rcCurObj);

+        if (rcPreObj.IsEmpty()) {

+            return FALSE;

+        }

+        if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {

+            return FALSE;

+        }

+        if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {

+            return FALSE;

+        }

+    }

+    int nPreCount = pTextObj2->CountItems();

+    int nCurCount = pTextObj1->CountItems();

+    if (nPreCount != nCurCount) {

+        return FALSE;

+    }

+    CPDF_TextObjectItem itemPer, itemCur;

+    for (int i = 0; i < nPreCount; i++) {

+        pTextObj2->GetItemInfo(i, &itemPer);

+        pTextObj1->GetItemInfo(i, &itemCur);

+        if (itemCur.m_CharCode != itemPer.m_CharCode) {

+            return FALSE;

+        }

+    }

+    if(FXSYS_fabs(pTextObj1->GetPosX() - pTextObj2->GetPosX()) > GetCharWidth(itemPer.m_CharCode, pTextObj2->GetFont())*pTextObj2->GetFontSize() / 1000 * 0.9 ||

+            FXSYS_fabs(pTextObj1->GetPosY() - pTextObj2->GetPosY()) >

+            FX_MAX(FX_MAX(rcPreObj.Height() , rcPreObj.Width()), pTextObj2->GetFontSize()) / 8) {

+        return FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_TextPage::IsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos)

+{

+    if (!pTextObj) {

+        return FALSE;

+    }

+    int i = 0;

+    if (!ObjPos) {

+        ObjPos = m_pPage->GetLastObjectPosition();

+    }

+    CPDF_PageObject* pObj = m_pPage->GetPrevObject(ObjPos);

+    while (i < 5 && ObjPos) {

+        pObj = m_pPage->GetPrevObject(ObjPos);

+        if(pObj == pTextObj) {

+            continue;

+        }

+        if(pObj->m_Type != PDFPAGE_TEXT) {

+            continue;

+        }

+        if(IsSameTextObject((CPDF_TextObject*)pObj, pTextObj)) {

+            return TRUE;

+        }

+        i++;

+    }

+    return FALSE;

+}

+FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info)

+{

+    int size = m_TempCharList.GetSize();

+    PAGECHAR_INFO preChar;

+    if (size) {

+        preChar = (PAGECHAR_INFO)m_TempCharList[size - 1];

+    } else {

+        size = m_charList.GetSize();

+        if(size == 0) {

+            return FALSE;

+        }

+        preChar = (PAGECHAR_INFO)m_charList[size - 1];

+    }

+    info.m_Index = m_TextBuf.GetLength();

+    info.m_Unicode = unicode;

+    info.m_pTextObj = NULL;

+    info.m_CharCode = -1;

+    info.m_Flag = FPDFTEXT_CHAR_GENERATED;

+    int preWidth = 0;

+    if (preChar.m_pTextObj && preChar.m_CharCode != (FX_DWORD) - 1) {

+        preWidth = GetCharWidth(preChar.m_CharCode, preChar.m_pTextObj->GetFont());

+    }

+    FX_FLOAT fs = 0;

+    if(preChar.m_pTextObj) {

+        fs = preChar.m_pTextObj->GetFontSize();

+    } else {

+        fs = preChar.m_CharBox.Height();

+    }

+    if(!fs) {

+        fs = 1;

+    }

+    info.m_OriginX = preChar.m_OriginX + preWidth * (fs) / 1000;

+    info.m_OriginY = preChar.m_OriginY;

+    info.m_CharBox = CFX_FloatRect(info.m_OriginX, info.m_OriginY, info.m_OriginX, info.m_OriginY);

+    return TRUE;

+}

+FX_BOOL CPDF_TextPage::IsRectIntersect(CFX_FloatRect rect1, CFX_FloatRect rect2)

+{

+    rect1.Intersect(rect2);

+    if(rect1.IsEmpty()) {

+        return FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL	CPDF_TextPage::IsLetter(FX_WCHAR unicode)

+{

+    if (unicode < L'A') {

+        return FALSE;

+    }

+    if (unicode > L'Z' && unicode < L'a') {

+        return FALSE;

+    }

+    if (unicode > L'z') {

+        return FALSE;

+    }

+    return TRUE;

+}

+CPDF_TextPageFind::CPDF_TextPageFind(const IPDF_TextPage* pTextPage)

+    : m_IsFind(FALSE),

+      m_pTextPage(NULL)

+{

+    if (!pTextPage) {

+        return;

+    }

+    CPDF_ModuleMgr* pPDFModule = CPDF_ModuleMgr::Get();

+    m_pTextPage = pTextPage;

+    m_strText = m_pTextPage->GetPageText();

+    int nCount = pTextPage->CountChars();

+    if(nCount) {

+        m_CharIndex.Add(0);

+    }

+    for(int i = 0; i < nCount; i++) {

+        FPDF_CHAR_INFO info;

+        pTextPage->GetCharInfo(i, info);

+        int indexSize = m_CharIndex.GetSize();

+        if(info.m_Flag == CHAR_NORMAL || info.m_Flag == CHAR_GENERATED) {

+            if(indexSize % 2) {

+                m_CharIndex.Add(1);

+            } else {

+                if(indexSize <= 0) {

+                    continue;

+                }

+                m_CharIndex.SetAt(indexSize - 1, m_CharIndex.GetAt(indexSize - 1) + 1);

+            }

+        } else {

+            if(indexSize % 2) {

+                if(indexSize <= 0) {

+                    continue;

+                }

+                m_CharIndex.SetAt(indexSize - 1, i + 1);

+            } else {

+                m_CharIndex.Add(i + 1);

+            }

+        }

+    }

+    int indexSize = m_CharIndex.GetSize();

+    if(indexSize % 2) {

+        m_CharIndex.RemoveAt(indexSize - 1);

+    }

+    m_resStart = 0;

+    m_resEnd = -1;

+}

+int CPDF_TextPageFind::GetCharIndex(int index) const

+{

+    return m_pTextPage->CharIndexFromTextIndex(index);

+    int indexSize = m_CharIndex.GetSize();

+    int count = 0;

+    for(int i = 0; i < indexSize; i += 2) {

+        count += m_CharIndex.GetAt(i + 1);

+        if(count > index) {

+            return 	index - count + m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i);

+        }

+    }

+    return -1;

+}

+FX_BOOL	CPDF_TextPageFind::FindFirst(CFX_WideString findwhat, int flags, int startPos)

+{

+    if (!m_pTextPage) {

+        return FALSE;

+    }

+    if (m_strText.IsEmpty() || m_bMatchCase != (flags & FPDFTEXT_MATCHCASE)) {

+        m_strText = m_pTextPage->GetPageText();

+    }

+    m_findWhat = findwhat;

+    m_flags = flags;

+    m_bMatchCase = flags & FPDFTEXT_MATCHCASE;

+    if (m_strText.IsEmpty()) {

+        m_IsFind = FALSE;

+        return TRUE;

+    }

+    FX_STRSIZE len = findwhat.GetLength();

+    if (!m_bMatchCase) {

+        findwhat.MakeLower();

+        m_strText.MakeLower();

+    }

+    m_bMatchWholeWord = flags & FPDFTEXT_MATCHWHOLEWORD;

+    m_findNextStart = startPos;

+    if (startPos == -1) {

+        m_findPreStart = m_strText.GetLength() - 1;

+    } else {

+        m_findPreStart = startPos;

+    }

+    m_csFindWhatArray.RemoveAll();

+    int i = 0;

+    while(i < len) {

+        if(findwhat.GetAt(i) != ' ') {

+            break;

+        }

+        i++;

+    }

+    if(i < len) {

+        ExtractFindWhat(findwhat);

+    } else {

+        m_csFindWhatArray.Add(findwhat);

+    }

+    if(m_csFindWhatArray.GetSize() <= 0) {

+        return FALSE;

+    }

+    m_IsFind = TRUE;

+    m_resStart = 0;

+    m_resEnd = -1;

+    return TRUE;

+}

+FX_BOOL CPDF_TextPageFind::FindNext()

+{

+    if (!m_pTextPage) {

+        return FALSE;

+    }

+    m_resArray.RemoveAll();

+    if(m_findNextStart == -1) {

+        return FALSE;

+    }

+    if(m_strText.IsEmpty()) {

+        m_IsFind = FALSE;

+        return m_IsFind;

+    }

+    int strLen = m_strText.GetLength();

+    if (m_findNextStart > strLen - 1) {

+        m_IsFind = FALSE;

+        return m_IsFind;

+    }

+    int nCount = m_csFindWhatArray.GetSize();

+    int nResultPos = 0;

+    int	nStartPos = 0;

+    nStartPos = m_findNextStart;

+    FX_BOOL bSpaceStart = FALSE;

+    for(int iWord = 0; iWord < nCount; iWord++) {

+        CFX_WideString csWord = m_csFindWhatArray[iWord];

+        if(csWord.IsEmpty()) {

+            if(iWord == nCount - 1) {

+                FX_WCHAR strInsert = m_strText.GetAt(nStartPos);

+                if(strInsert == TEXT_LINEFEED_CHAR || strInsert == TEXT_BLANK_CHAR || strInsert == TEXT_RETURN_CHAR || strInsert == 160) {

+                    nResultPos = nStartPos + 1;

+                    break;

+                }

+                iWord = -1;

+            } else if(iWord == 0) {

+                bSpaceStart = TRUE;

+            }

+            continue;

+        }

+        int endIndex;

+        nResultPos = m_strText.Find(csWord, nStartPos);

+        if (nResultPos == -1) {

+            m_IsFind = FALSE;

+            return m_IsFind;

+        }

+        endIndex = nResultPos + csWord.GetLength() - 1;

+        if(iWord == 0) {

+            m_resStart = nResultPos;

+        }

+        FX_BOOL bMatch = TRUE;

+        if(iWord != 0 && !bSpaceStart) {

+            int PreResEndPos = nStartPos;

+            int curChar = csWord.GetAt(0);

+            CFX_WideString lastWord = m_csFindWhatArray[iWord - 1];

+            int lastChar = lastWord.GetAt(lastWord.GetLength() - 1);

+            if(nStartPos == nResultPos && !(_IsIgnoreSpaceCharacter(lastChar) || _IsIgnoreSpaceCharacter(curChar))) {

+                bMatch = FALSE;

+            }

+            for(int d = PreResEndPos; d < nResultPos; d++) {

+                FX_WCHAR strInsert = m_strText.GetAt(d);

+                if(strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_BLANK_CHAR && strInsert != TEXT_RETURN_CHAR && strInsert != 160) {

+                    bMatch = FALSE;

+                    break;

+                }

+            }

+        } else if(bSpaceStart) {

+            if(nResultPos > 0) {

+                FX_WCHAR strInsert = m_strText.GetAt(nResultPos - 1);

+                if(strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_BLANK_CHAR && strInsert != TEXT_RETURN_CHAR && strInsert != 160) {

+                    bMatch = FALSE;

+                    m_resStart = nResultPos;

+                } else {

+                    m_resStart = nResultPos - 1;

+                }

+            }

+        }

+        if(m_bMatchWholeWord && bMatch) {

+            bMatch = IsMatchWholeWord(m_strText, nResultPos, endIndex);

+        }

+        nStartPos = endIndex + 1;

+        if(!bMatch) {

+            iWord = -1;

+            if(bSpaceStart) {

+                nStartPos = m_resStart + m_csFindWhatArray[1].GetLength();

+            } else {

+                nStartPos = m_resStart + m_csFindWhatArray[0].GetLength();

+            }

+        }

+    }

+    m_resEnd = nResultPos + m_csFindWhatArray[m_csFindWhatArray.GetSize() - 1].GetLength() - 1;

+    m_IsFind = TRUE;

+    int resStart = GetCharIndex(m_resStart);

+    int resEnd = GetCharIndex(m_resEnd);

+    m_pTextPage->GetRectArray(resStart, resEnd - resStart + 1, m_resArray);

+    if(m_flags & FPDFTEXT_CONSECUTIVE) {

+        m_findNextStart = m_resStart + 1;

+        m_findPreStart = m_resEnd - 1;

+    } else {

+        m_findNextStart = m_resEnd + 1;

+        m_findPreStart = m_resStart - 1;

+    }

+    return m_IsFind;

+}

+FX_BOOL CPDF_TextPageFind::FindPrev()

+{

+    if (!m_pTextPage) {

+        return FALSE;

+    }

+    m_resArray.RemoveAll();

+    if(m_strText.IsEmpty() || m_findPreStart < 0) {

+        m_IsFind = FALSE;

+        return m_IsFind;

+    }

+    CPDF_TextPageFind findEngine(m_pTextPage);

+    FX_BOOL ret = findEngine.FindFirst(m_findWhat, m_flags);

+    if(!ret) {

+        m_IsFind = FALSE;

+        return m_IsFind;

+    }

+    int	order = -1, MatchedCount = 0;

+    while(ret) {

+        ret = findEngine.FindNext();

+        if(ret) {

+            int order1 = findEngine.GetCurOrder() ;

+            int	MatchedCount1 = findEngine.GetMatchedCount();

+            if(((order1 + MatchedCount1) - 1) > m_findPreStart) {

+                break;

+            }

+            order = order1;

+            MatchedCount = MatchedCount1;

+        }

+    }

+    if(order == -1) {

+        m_IsFind = FALSE;

+        return m_IsFind;

+    }

+    m_resStart = m_pTextPage->TextIndexFromCharIndex(order);

+    m_resEnd = m_pTextPage->TextIndexFromCharIndex(order + MatchedCount - 1);

+    m_IsFind = TRUE;

+    m_pTextPage->GetRectArray(order, MatchedCount, m_resArray);

+    if(m_flags & FPDFTEXT_CONSECUTIVE) {

+        m_findNextStart = m_resStart + 1;

+        m_findPreStart = m_resEnd - 1;

+    } else {

+        m_findNextStart = m_resEnd + 1;

+        m_findPreStart = m_resStart - 1;

+    }

+    return m_IsFind;

+}

+void CPDF_TextPageFind::ExtractFindWhat(CFX_WideString findwhat)

+{

+    if(findwhat.IsEmpty()) {

+        return ;

+    }

+    int index = 0;

+    while(1) {

+        CFX_WideString csWord = TEXT_EMPTY;

+        int ret = ExtractSubString(csWord, findwhat, index, TEXT_BLANK_CHAR);

+        if(csWord.IsEmpty()) {

+            if(ret) {

+                m_csFindWhatArray.Add(CFX_WideString(L""));

+                index++;

+                continue;

+            } else {

+                break;

+            }

+        }

+        int pos = 0;

+        FX_BOOL bLastIgnore = FALSE;

+        while(pos < csWord.GetLength()) {

+            CFX_WideString curStr = csWord.Mid(pos, 1);

+            FX_WCHAR curChar = csWord.GetAt(pos);

+            if (_IsIgnoreSpaceCharacter(curChar)) {

+                if (pos > 0 && curChar == 0x2019) {

+                    pos++;

+                    continue;

+                }

+                if (pos > 0 ) {

+                    CFX_WideString preStr = csWord.Mid(0, pos);

+                    m_csFindWhatArray.Add(preStr);

+                }

+                m_csFindWhatArray.Add(curStr);

+                if (pos == csWord.GetLength() - 1) {

+                    csWord.Empty();

+                    break;

+                }

+                csWord = csWord.Right(csWord.GetLength() - pos - 1);

+                pos = 0;

+                bLastIgnore = TRUE;

+                continue;

+            } else {

+                bLastIgnore = FALSE;

+            }

+            pos++;

+        }

+        if (!csWord.IsEmpty()) {

+            m_csFindWhatArray.Add(csWord);

+        }

+        index++;

+    }

+    return;

+}

+FX_BOOL CPDF_TextPageFind::IsMatchWholeWord(CFX_WideString csPageText, int startPos, int endPos)

+{

+    int char_left = 0;

+    int char_right = 0;

+    int char_count = endPos - startPos + 1;

+    if(char_count < 1) {

+        return FALSE;

+    }

+    if (char_count == 1 && csPageText.GetAt(startPos) > 255) {

+        return TRUE;

+    }

+    if(startPos - 1 >= 0 ) {

+        char_left = csPageText.GetAt(startPos - 1);

+    }

+    if(startPos + char_count < csPageText.GetLength()) {

+        char_right = csPageText.GetAt(startPos + char_count);

+    }

+    if(char_left == 0x61) {

+        int a = 0;

+    }

+    if ((char_left > 'A' && char_left < 'a') || (char_left > 'a' && char_left < 'z') || (char_left > 0xfb00 && char_left < 0xfb06) || (char_left >= '0' && char_left <= '9') ||

+            (char_right > 'A' && char_right < 'a') || (char_right > 'a' && char_right < 'z') || (char_right > 0xfb00 && char_right < 0xfb06) || (char_right >= '0' && char_right <= '9')) {

+        return FALSE;

+    }

+    if(!(('A' > char_left || char_left > 'Z')  && ('a' > char_left || char_left > 'z')

+            && ('A' > char_right || char_right > 'Z')  && ('a' > char_right || char_right > 'z'))) {

+        return FALSE;

+    }

+    if (char_count > 0) {

+        if (csPageText.GetAt(startPos) >= L'0' && csPageText.GetAt(startPos) <= L'9' && char_left >= L'0' && char_left <= L'9') {

+            return FALSE;

+        }

+        if (csPageText.GetAt(endPos) >= L'0' && csPageText.GetAt(endPos) <= L'9' && char_right >= L'0' && char_right <= L'9') {

+            return FALSE;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_TextPageFind::ExtractSubString(CFX_WideString& rString, FX_LPCWSTR lpszFullString,

+        int iSubString, FX_WCHAR chSep)

+{

+    if (lpszFullString == NULL) {

+        return FALSE;

+    }

+    while (iSubString--) {

+        lpszFullString = FXSYS_wcschr(lpszFullString, chSep);

+        if (lpszFullString == NULL) {

+            rString.Empty();

+            return FALSE;

+        }

+        lpszFullString++;

+        while(*lpszFullString == chSep) {

+            lpszFullString++;

+        }

+    }

+    FX_LPCWSTR lpchEnd = FXSYS_wcschr(lpszFullString, chSep);

+    int nLen = (lpchEnd == NULL) ?

+               (int)FXSYS_wcslen(lpszFullString) : (int)(lpchEnd - lpszFullString);

+    ASSERT(nLen >= 0);

+    FXSYS_memcpy32(rString.GetBuffer(nLen), lpszFullString, nLen * sizeof(FX_WCHAR));

+    rString.ReleaseBuffer();

+    return TRUE;

+}

+CFX_WideString CPDF_TextPageFind::MakeReverse(const CFX_WideString str)

+{

+    CFX_WideString str2;

+    str2.Empty();

+    int nlen = str.GetLength();

+    for(int i = nlen - 1; i >= 0; i--) {

+        str2 += str.GetAt(i);

+    }

+    return str2;

+}

+void CPDF_TextPageFind::GetRectArray(CFX_RectArray& rects) const

+{

+    rects.Copy(m_resArray);

+}

+int	CPDF_TextPageFind::GetCurOrder() const

+{

+    return GetCharIndex(m_resStart);

+}

+int	CPDF_TextPageFind::GetMatchedCount()const

+{

+    int resStart = GetCharIndex(m_resStart);

+    int resEnd = GetCharIndex(m_resEnd);

+    return resEnd - resStart + 1;

+}

+CPDF_LinkExtract::CPDF_LinkExtract()

+    : m_pTextPage(NULL),

+      m_IsParserd(FALSE)

+{

+}

+CPDF_LinkExtract::~CPDF_LinkExtract()

+{

+    DeleteLinkList();

+}

+FX_BOOL CPDF_LinkExtract::ExtractLinks(const IPDF_TextPage* pTextPage)

+{

+    if (!pTextPage || !pTextPage->IsParsered()) {

+        return FALSE;

+    }

+    m_pTextPage = (const CPDF_TextPage*)pTextPage;

+    m_strPageText = m_pTextPage->GetPageText(0, -1);

+    DeleteLinkList();

+    if (m_strPageText.IsEmpty()) {

+        return FALSE;

+    }

+    parserLink();

+    m_IsParserd = TRUE;

+    return TRUE;

+}

+void CPDF_LinkExtract::DeleteLinkList()

+{

+    while (m_LinkList.GetSize()) {

+        CPDF_LinkExt* linkinfo = NULL;

+        linkinfo = m_LinkList.GetAt(0);

+        m_LinkList.RemoveAt(0);

+        delete linkinfo;

+    }

+    m_LinkList.RemoveAll();

+}

+int CPDF_LinkExtract::CountLinks() const

+{

+    if (!m_IsParserd)	{

+        return -1;

+    }

+    return m_LinkList.GetSize();

+}

+void CPDF_LinkExtract::parserLink()

+{

+    int start = 0, pos = 0;

+    int TotalChar = m_pTextPage->CountChars();

+    while (pos < TotalChar) {

+        FPDF_CHAR_INFO pageChar;

+        m_pTextPage->GetCharInfo(pos, pageChar);

+        if (pageChar.m_Flag == CHAR_GENERATED || pageChar.m_Unicode == 0x20 || pos == TotalChar - 1) {

+            int nCount = pos - start;

+            if(pos == TotalChar - 1) {

+                nCount++;

+            }

+            CFX_WideString strBeCheck;

+            strBeCheck = m_pTextPage->GetPageText(start, nCount);

+            if (strBeCheck.GetLength() > 5) {

+                while(strBeCheck.GetLength() > 0) {

+                    FX_WCHAR ch = strBeCheck.GetAt(strBeCheck.GetLength() - 1);

+                    if (ch == L')' || ch == L',' || ch == L'>' || ch == L'.') {

+                        strBeCheck = strBeCheck.Mid(0, strBeCheck.GetLength() - 1);

+                        nCount--;

+                    } else {

+                        break;

+                    }

+                }

+                if (nCount > 5 && (CheckWebLink(strBeCheck) || CheckMailLink(strBeCheck))) {

+                    if (!AppendToLinkList(start, nCount, strBeCheck)) {

+                        break;

+                    }

+                }

+            }

+            start = ++pos;

+        } else {

+            pos++;

+        }

+    }

+}

+FX_BOOL CPDF_LinkExtract::CheckWebLink(CFX_WideString& strBeCheck)

+{

+    CFX_WideString str = strBeCheck;

+    str.MakeLower();

+    if (str.Find(L"http://www.") != -1) {

+        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"http://www."));

+        return TRUE;

+    } else if (str.Find(L"http://") != -1) {

+        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"http://"));

+        return TRUE;

+    } else if (str.Find(L"https://www.") != -1) {

+        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"https://www."));

+        return TRUE;

+    } else if (str.Find(L"https://") != -1) {

+        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"https://"));

+        return TRUE;

+    } else if (str.Find(L"www.") != -1) {

+        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"www."));

+        strBeCheck = L"http://" + strBeCheck;

+        return TRUE;

+    } else {

+        return FALSE;

+    }

+}

+FX_BOOL CPDF_LinkExtract::CheckMailLink(CFX_WideString& str)

+{

+    str.MakeLower();

+    int aPos = str.Find(L'@');

+    if (aPos < 1) {

+        return FALSE;

+    }

+    if (str.GetAt(aPos - 1) == L'.' || str.GetAt(aPos - 1) == L'_') {

+        return FALSE;

+    }

+    int i;

+    for (i = aPos - 1; i >= 0; i--) {

+        FX_WCHAR ch = str.GetAt(i);

+        if (ch == L'_' || ch == L'.' || (ch >= L'a' && ch <= L'z') || (ch >= L'0' && ch <= L'9')) {

+            continue;

+        } else {

+            if (i == aPos - 1) {

+                return FALSE;

+            }

+            str = str.Right(str.GetLength() - i - 1);

+            break;

+        }

+    }

+    aPos = str.Find(L'@');

+    if (aPos < 1) {

+        return FALSE;

+    }

+    CFX_WideString strtemp = L"";

+    for (i = 0; i < aPos; i++) {

+        FX_WCHAR wch = str.GetAt(i);

+        if (wch >= L'a' && wch <= L'z') {

+            break;

+        } else {

+            strtemp = str.Right(str.GetLength() - i + 1);

+        }

+    }

+    if (strtemp != L"") {

+        str = strtemp;

+    }

+    aPos = str.Find(L'@');

+    if (aPos < 1) {

+        return FALSE;

+    }

+    str.TrimRight(L'.');

+    strtemp = str;

+    int ePos = str.Find(L'.');

+    if (ePos == -1) {

+        return FALSE;

+    }

+    while (ePos != -1) {

+        strtemp = strtemp.Right(strtemp.GetLength() - ePos - 1);

+        ePos = strtemp.Find('.');

+    }

+    ePos = strtemp.GetLength();

+    for (i = 0; i < ePos; i++) {

+        FX_WCHAR wch = str.GetAt(i);

+        if ((wch >= L'a' && wch <= L'z') || (wch >= L'0' && wch <= L'9')) {

+            continue;

+        } else {

+            str = str.Left(str.GetLength() - ePos + i + 1);

+            ePos = ePos - i - 1;

+            break;

+        }

+    }

+    int nLen = str.GetLength();

+    for (i = aPos + 1; i < nLen - ePos; i++) {

+        FX_WCHAR wch = str.GetAt(i);

+        if (wch == L'-' || wch == L'.' || (wch >= L'a' && wch <= L'z') || (wch >= L'0' && wch <= L'9')) {

+            continue;

+        } else {

+            return FALSE;

+        }

+    }

+    if (str.Find(L"mailto:") == -1) {

+        str = L"mailto:" + str;

+    }

+    return TRUE;

+}

+FX_BOOL CPDF_LinkExtract::AppendToLinkList(int start, int count, CFX_WideString strUrl)

+{

+    CPDF_LinkExt* linkInfo = NULL;

+    linkInfo = FX_NEW CPDF_LinkExt;

+    if (!linkInfo) {

+        return FALSE;

+    }

+    linkInfo->m_strUrl = strUrl;

+    linkInfo->m_Start = start;

+    linkInfo->m_Count = count;

+    m_LinkList.Add(linkInfo);

+    return TRUE;

+}

+CFX_WideString CPDF_LinkExtract::GetURL(int index) const

+{

+    if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {

+        return L"";

+    }

+    CPDF_LinkExt* link = NULL;

+    link = m_LinkList.GetAt(index);

+    if (!link) {

+        return L"";

+    }

+    return link->m_strUrl;

+}

+void CPDF_LinkExtract::GetBoundedSegment(int index, int& start, int& count) const

+{

+    if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {

+        return ;

+    }

+    CPDF_LinkExt* link = NULL;

+    link = m_LinkList.GetAt(index);

+    if (!link) {

+        return ;

+    }

+    start = link->m_Start;

+    count = link->m_Count;

+}

+void CPDF_LinkExtract::GetRects(int index, CFX_RectArray& rects) const

+{

+    if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {

+        return;

+    }

+    CPDF_LinkExt* link = NULL;

+    link = m_LinkList.GetAt(index);

+    if (!link) {

+        return ;

+    }

+    m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects);

+}

diff --git a/core/src/fpdftext/fpdf_text_search.cpp b/core/src/fpdftext/fpdf_text_search.cpp
new file mode 100644
index 0000000..b029f69
--- /dev/null
+++ b/core/src/fpdftext/fpdf_text_search.cpp
@@ -0,0 +1,325 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdfapi/fpdf_pageobj.h"

+#include "../../include/fpdftext/fpdf_text.h"

+#include "../../include/fpdfapi/fpdf_page.h"

+class CPDF_TextStream : public CFX_Object

+{

+public:

+    CPDF_TextStream(CFX_WideTextBuf& buffer, FX_BOOL bUseLF, CFX_PtrArray* pObjArray);

+    ~CPDF_TextStream() {}

+    FX_BOOL ProcessObject(const CPDF_TextObject* pObj, FX_BOOL bFirstLine);

+    CFX_WideTextBuf&	m_Buffer;

+    FX_BOOL				m_bUseLF;

+    CFX_PtrArray*		m_pObjArray;

+    const CPDF_TextObject*	m_pLastObj;

+};

+CPDF_TextStream::CPDF_TextStream(CFX_WideTextBuf& buffer, FX_BOOL bUseLF, CFX_PtrArray* pObjArray) : m_Buffer(buffer)

+{

+    m_pLastObj = NULL;

+    m_bUseLF = bUseLF;

+    m_pObjArray = pObjArray;

+}

+FX_BOOL FPDFText_IsSameTextObject(const CPDF_TextObject* pTextObj1, const CPDF_TextObject* pTextObj2)

+{

+    if (!pTextObj1 || !pTextObj2) {

+        return FALSE;

+    }

+    CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);

+    CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);

+    if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) {

+        return TRUE;

+    }

+    if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {

+        rcPreObj.Intersect(rcCurObj);

+        if (rcPreObj.IsEmpty()) {

+            return FALSE;

+        }

+        if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {

+            return FALSE;

+        }

+        if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {

+            return FALSE;

+        }

+    }

+    int nPreCount = pTextObj2->CountItems();

+    int nCurCount = pTextObj1->CountItems();

+    if (nPreCount != nCurCount) {

+        return FALSE;

+    }

+    for (int i = 0; i < nPreCount; i++) {

+        CPDF_TextObjectItem itemPer, itemCur;

+        pTextObj2->GetItemInfo(i, &itemPer);

+        pTextObj1->GetItemInfo(i, &itemCur);

+        if (itemCur.m_CharCode != itemPer.m_CharCode) {

+            return FALSE;

+        }

+    }

+    return TRUE;

+}

+int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont)

+{

+    if(charCode == -1) {

+        return 0;

+    }

+    int w = pFont->GetCharWidthF(charCode);

+    if(w == 0) {

+        CFX_ByteString str;

+        pFont->AppendChar(str, charCode);

+        w = pFont->GetStringWidth(str, 1);

+        if(w == 0) {

+            FX_RECT BBox;

+            pFont->GetCharBBox(charCode, BBox);

+            w = BBox.right - BBox.left;

+        }

+    }

+    return w;

+}

+int FPDFText_ProcessInterObj(const CPDF_TextObject* pPrevObj, const CPDF_TextObject* pObj)

+{

+    if(FPDFText_IsSameTextObject(pPrevObj, pObj)) {

+        return -1;

+    }

+    CPDF_TextObjectItem item;

+    int nItem = pPrevObj->CountItems();

+    pPrevObj->GetItemInfo(nItem - 1, &item);

+    FX_WCHAR preChar = 0, curChar = 0;

+    CFX_WideString wstr = pPrevObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);

+    if(wstr.GetLength()) {

+        preChar = wstr.GetAt(0);

+    }

+    FX_FLOAT last_pos = item.m_OriginX;

+    int nLastWidth = GetCharWidth(item.m_CharCode, pPrevObj->GetFont());

+    FX_FLOAT last_width = nLastWidth * pPrevObj->GetFontSize() / 1000;

+    last_width = FXSYS_fabs(last_width);

+    pObj->GetItemInfo(0, &item);

+    wstr = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);

+    if(wstr.GetLength()) {

+        curChar = wstr.GetAt(0);

+    }

+    int nThisWidth = GetCharWidth(item.m_CharCode, pObj->GetFont());

+    FX_FLOAT this_width = nThisWidth * pObj->GetFontSize() / 1000;

+    this_width = FXSYS_fabs(this_width);

+    FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;

+    CFX_AffineMatrix prev_matrix, prev_reverse;

+    pPrevObj->GetTextMatrix(&prev_matrix);

+    prev_reverse.SetReverse(prev_matrix);

+    FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY();

+    prev_reverse.Transform(x, y);

+    if (FXSYS_fabs(y) > threshold * 2) {

+        return 2;

+    }

+    threshold = (FX_FLOAT)(nLastWidth > nThisWidth ? nLastWidth : nThisWidth);

+    threshold = threshold > 400 ? (threshold < 700 ? threshold / 4 :  threshold / 5) : (threshold / 2);

+    threshold *= nLastWidth > nThisWidth ? FXSYS_fabs(pPrevObj->GetFontSize()) : FXSYS_fabs(pObj->GetFontSize());

+    threshold /= 1000;

+    if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ' && preChar != L' ')

+        if(curChar != L' ' && preChar != L' ') {

+            if((x - last_pos - last_width) > threshold || (last_pos - x - last_width) > threshold) {

+                return 1;

+            }

+            if(x < 0 && (last_pos - x - last_width) > threshold) {

+                return 1;

+            }

+            if((x - last_pos - last_width) > this_width || (x - last_pos - this_width) > last_width ) {

+                return 1;

+            }

+        }

+    if(last_pos + last_width > x + this_width && curChar == L' ') {

+        return 3;

+    }

+    return 0;

+}

+FX_BOOL CPDF_TextStream::ProcessObject(const CPDF_TextObject* pObj, FX_BOOL bFirstLine)

+{

+    if(pObj->m_Bottom > 380 && pObj->m_Left < 45 && pObj->m_Top < 402) {

+        int i = 0;

+    }

+    CPDF_Font* pFont = pObj->GetFont();

+    CFX_AffineMatrix matrix;

+    pObj->GetTextMatrix(&matrix);

+    FX_FLOAT fs = pObj->GetFontSize();

+    int item_index = 0;

+    if (m_pLastObj) {

+        int result = FPDFText_ProcessInterObj(m_pLastObj, pObj);

+        if (result == 2) {

+            int len = m_Buffer.GetLength();

+            if (len && m_bUseLF && m_Buffer.GetBuffer()[len - 1] == L'-') {

+                m_Buffer.Delete(len - 1, 1);

+                if (m_pObjArray) {

+                    m_pObjArray->RemoveAt((len - 1) * 2, 2);

+                }

+            } else {

+                if (bFirstLine) {

+                    return TRUE;

+                }

+                if (m_bUseLF) {

+                    m_Buffer.AppendChar(L'\r');

+                    m_Buffer.AppendChar(L'\n');

+                    if (m_pObjArray) {

+                        for (int i = 0; i < 4; i ++) {

+                            m_pObjArray->Add(NULL);

+                        }

+                    }

+                } else {

+                    m_Buffer.AppendChar(' ');

+                    if (m_pObjArray) {

+                        m_pObjArray->Add(NULL);

+                        m_pObjArray->Add(NULL);

+                    }

+                }

+            }

+        } else if (result == 1) {

+            m_Buffer.AppendChar(L' ');

+            if (m_pObjArray) {

+                m_pObjArray->Add(NULL);

+                m_pObjArray->Add(NULL);

+            }

+        } else if (result == -1) {

+            m_pLastObj = pObj;

+            return FALSE;

+        } else if (result == 3) {

+            item_index = 1;

+        }

+    }

+    m_pLastObj = pObj;

+    int nItems = pObj->CountItems();

+    FX_FLOAT Ignorekerning = 0;

+    for(int i = 1; i < nItems - 1; i += 2) {

+        CPDF_TextObjectItem item;

+        pObj->GetItemInfo(i, &item);

+        if (item.m_CharCode == (FX_DWORD) - 1) {

+            if(i == 1) {

+                Ignorekerning = item.m_OriginX;

+            } else if(Ignorekerning > item.m_OriginX) {

+                Ignorekerning = item.m_OriginX;

+            }

+        } else {

+            Ignorekerning = 0;

+            break;

+        }

+    }

+    FX_FLOAT spacing = 0;

+    for (; item_index < nItems; item_index ++) {

+        CPDF_TextObjectItem item;

+        pObj->GetItemInfo(item_index, &item);

+        if (item.m_CharCode == (FX_DWORD) - 1) {

+            CFX_WideString wstr = m_Buffer.GetWideString();

+            if (wstr.IsEmpty() || wstr.GetAt(wstr.GetLength() - 1) == L' ') {

+                continue;

+            }

+            FX_FLOAT fontsize_h = pObj->m_TextState.GetFontSizeH();

+            spacing = -fontsize_h * (item.m_OriginX - Ignorekerning) / 1000;

+            continue;

+        }

+        FX_FLOAT charSpace = pObj->m_TextState.GetObject()->m_CharSpace;

+        if(nItems > 3 && !spacing) {

+            charSpace = 0;

+        }

+        if((spacing || charSpace) && item_index > 0) {

+            int last_width = 0;

+            FX_FLOAT fontsize_h = pObj->m_TextState.GetFontSizeH();

+            FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');

+            FX_FLOAT threshold = 0;

+            if (space_charcode != -1) {

+                threshold = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000 ;

+            }

+            if(threshold > fontsize_h / 3) {

+                threshold = 0;

+            } else {

+                threshold /= 2;

+            }

+            if (threshold == 0) {

+                threshold = fontsize_h;

+                int this_width = FXSYS_abs(GetCharWidth(item.m_CharCode, pFont));

+                threshold = this_width > last_width ? (FX_FLOAT)this_width : (FX_FLOAT)last_width;

+                int nDivide = 6;

+                if (threshold < 300) {

+                    nDivide = 2;

+                } else if (threshold < 500) {

+                    nDivide = 4;

+                } else if (threshold < 700) {

+                    nDivide = 5;

+                }

+                threshold = threshold / nDivide;

+                threshold = fontsize_h * threshold / 1000;

+            }

+            if(charSpace > 0.001) {

+                spacing += matrix.TransformDistance(charSpace);

+            } else if(charSpace < -0.001) {

+                spacing -= matrix.TransformDistance(FXSYS_fabs(charSpace));

+            }

+            if (threshold && (spacing && spacing >= threshold) ) {

+                m_Buffer.AppendChar(L' ');

+                if (m_pObjArray) {

+                    m_pObjArray->Add(NULL);

+                    m_pObjArray->Add(NULL);

+                }

+            }

+            if (item.m_CharCode == (FX_DWORD) - 1) {

+                continue;

+            }

+            spacing = 0;

+        }

+        CFX_WideString unicode_str = pFont->UnicodeFromCharCode(item.m_CharCode);

+        if (unicode_str.IsEmpty()) {

+            m_Buffer.AppendChar((FX_WCHAR)item.m_CharCode);

+            if (m_pObjArray) {

+                m_pObjArray->Add((void*)pObj);

+                m_pObjArray->Add((void*)(FX_INTPTR)item_index);

+            }

+        } else {

+            m_Buffer << unicode_str;

+            if (m_pObjArray) {

+                for (int i = 0; i < unicode_str.GetLength(); i ++) {

+                    m_pObjArray->Add((void*)pObj);

+                    m_pObjArray->Add((void*)(FX_INTPTR)item_index);

+                }

+            }

+        }

+    }

+    return FALSE;

+}

+void _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, FX_BOOL bUseLF,

+                                CFX_PtrArray* pObjArray)

+{

+    CPDF_TextStream textstream(buffer, bUseLF, pObjArray);

+    FX_POSITION pos = pPage->GetFirstObjectPosition();

+    while (pos) {

+        CPDF_PageObject* pObject = pPage->GetNextObject(pos);

+        if (pObject == NULL) {

+            continue;

+        }

+        if (pObject->m_Type != PDFPAGE_TEXT) {

+            continue;

+        }

+        textstream.ProcessObject((CPDF_TextObject*)pObject, FALSE);

+    }

+}

+CFX_WideString PDF_GetFirstTextLine_Unicode(CPDF_Document* pDoc, CPDF_Dictionary* pPage)

+{

+    CFX_WideTextBuf buffer;

+    buffer.EstimateSize(0, 1024);

+    CPDF_Page page;

+    page.Load(pDoc, pPage);

+    CPDF_ParseOptions options;

+    options.m_bTextOnly = TRUE;

+    options.m_bSeparateForm = FALSE;

+    page.ParseContent(&options);

+    CPDF_TextStream textstream(buffer, FALSE, NULL);

+    FX_POSITION pos = page.GetFirstObjectPosition();

+    while (pos) {

+        CPDF_PageObject* pObject = page.GetNextObject(pos);

+        if (pObject->m_Type != PDFPAGE_TEXT) {

+            continue;

+        }

+        if (textstream.ProcessObject((CPDF_TextObject*)pObject, TRUE)) {

+            break;

+        }

+    }

+    return buffer.GetWideString();

+}

diff --git a/core/src/fpdftext/text_int.h b/core/src/fpdftext/text_int.h
new file mode 100644
index 0000000..a0af51e
--- /dev/null
+++ b/core/src/fpdftext/text_int.h
@@ -0,0 +1,215 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _PDF_TEXT_INT_H_

+#define _PDF_TEXT_INT_H_

+class CPDF_TextParseOptions : public CFX_Object

+{

+public:

+    CPDF_TextParseOptions();

+    FX_BOOL			m_bCheckObjectOrder;

+    FX_BOOL			m_bCheckDirection;

+    int				m_nCheckSameObject;

+};

+class CPDF_TextPage;

+class CPDF_LinkExtract;

+class CPDF_TextPageFind;

+class CPDF_DocProgressiveSearch;

+#define FPDFTEXT_CHAR_ERROR			-1

+#define FPDFTEXT_CHAR_NORMAL		0

+#define FPDFTEXT_CHAR_GENERATED		1

+#define FPDFTEXT_CHAR_UNUNICODE		2

+#define FPDFTEXT_CHAR_HYPHEN		3

+#define FPDFTEXT_CHAR_PIECE			4

+#define FPDFTEXT_MC_PASS			0

+#define FPDFTEXT_MC_DONE			1

+#define FPDFTEXT_MC_DELAY			2

+typedef struct _PAGECHAR_INFO: public CFX_Object {

+    int					m_CharCode;

+    FX_WCHAR			m_Unicode;

+    FX_FLOAT			m_OriginX;

+    FX_FLOAT			m_OriginY;

+    FX_INT32			m_Flag;

+    CFX_FloatRect		m_CharBox;

+    CPDF_TextObject*	m_pTextObj;

+    CFX_AffineMatrix	m_Matrix;

+    int					m_Index;

+} PAGECHAR_INFO;

+typedef	CFX_SegmentedArray<PAGECHAR_INFO> PAGECHAR_InfoArray;

+typedef struct {

+    int	m_Start;

+    int m_nCount;

+} FPDF_SEGMENT;

+typedef CFX_ArrayTemplate<FPDF_SEGMENT> SEGMENT_Array;

+typedef struct {

+    CPDF_TextObject*	m_pTextObj;

+    CFX_AffineMatrix	m_formMatrix;

+} PDFTEXT_Obj;

+typedef CFX_ArrayTemplate<PDFTEXT_Obj> LINEOBJ;

+class CPDF_TextPage: public IPDF_TextPage

+{

+public:

+    CPDF_TextPage(const CPDF_Page* pPage, int flags = 0);

+    CPDF_TextPage(const CPDF_PageObjects* pPage, int flags = 0);

+    CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions);

+    virtual FX_BOOL					ParseTextPage();

+    virtual void					NormalizeObjects(FX_BOOL bNormalize);

+    virtual	FX_BOOL					IsParsered() const

+    {

+        return m_IsParsered;

+    }

+    virtual ~CPDF_TextPage() {};

+public:

+    virtual int CharIndexFromTextIndex(int TextIndex)const ;

+    virtual int TextIndexFromCharIndex(int CharIndex)const;

+    virtual int						CountChars() const;

+    virtual	void					GetCharInfo(int index, FPDF_CHAR_INFO & info) const;

+    virtual void					GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const;

+    virtual int						GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const;

+    virtual int						GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance,

+            FX_FLOAT yTorelance) const;

+    virtual CFX_WideString			GetTextByRect(CFX_FloatRect rect) const;

+    virtual void					GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const;

+    virtual	int						GetOrderByDirection(int order, int direction) const;

+    virtual	CFX_WideString			GetPageText(int start = 0, int nCount = -1) const;

+

+    virtual int						CountRects(int start, int nCount);

+    virtual	void					GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top

+                                            , FX_FLOAT& right, FX_FLOAT &bottom) const;

+    virtual FX_BOOL					GetBaselineRotate(int rectIndex, int& Rotate);

+    virtual FX_BOOL					GetBaselineRotate(CFX_FloatRect rect, int& Rotate);

+    virtual	int						CountBoundedSegments(FX_FLOAT left, FX_FLOAT top,

+            FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains = FALSE);

+    virtual	void					GetBoundedSegment(int index, int& start, int& count) const;

+    virtual int						GetWordBreak(int index, int direction) const;

+public:

+    const	PAGECHAR_InfoArray*		GetCharList() const

+    {

+        return &m_charList;

+    }

+    static	FX_BOOL					IsRectIntersect(CFX_FloatRect rect1, CFX_FloatRect rect2);

+    static	FX_BOOL					IsLetter(FX_WCHAR unicode);

+private:

+    FX_BOOL							IsHyphen(FX_WCHAR curChar);

+    FX_BOOL							IsControlChar(PAGECHAR_INFO* pCharInfo);

+    FX_BOOL							GetBaselineRotate(int start, int end, int& Rotate);

+    void							ProcessObject();

+    void							ProcessFormObject(CPDF_FormObject*	pFormObj, CFX_AffineMatrix formMatrix);

+    void							ProcessTextObject(PDFTEXT_Obj pObj);

+    void							ProcessTextObject(CPDF_TextObject*	pTextObj, CFX_AffineMatrix formMatrix, FX_POSITION ObjPos);

+    int								ProcessInsertObject(const CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix);

+    FX_BOOL							GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info);

+    FX_BOOL							IsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos);

+    FX_BOOL							IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2);

+    int								GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const;

+    void							CloseTempLine();

+    void							OnPiece(IFX_BidiChar* pBidi, CFX_WideString& str);

+    FX_INT32	PreMarkedContent(PDFTEXT_Obj pObj);

+    void		ProcessMarkedContent(PDFTEXT_Obj pObj);

+    void		CheckMarkedContentObject(FX_INT32& start, FX_INT32& nCount) const;

+    void		FindPreviousTextObject(void);

+    void		AddCharInfoByLRDirection(CFX_WideString& str, int i);

+    void		AddCharInfoByRLDirection(CFX_WideString& str, int i);

+    FX_INT32	GetTextObjectWritingMode(const CPDF_TextObject* pTextObj);

+    FX_INT32	FindTextlineFlowDirection();

+protected:

+    CPDFText_ParseOptions			m_ParseOptions;

+    CFX_WordArray					m_CharIndex;

+    const CPDF_PageObjects*			m_pPage;

+    PAGECHAR_InfoArray				m_charList;

+    CFX_WideTextBuf					m_TextBuf;

+    PAGECHAR_InfoArray				m_TempCharList;

+    CFX_WideTextBuf					m_TempTextBuf;

+    int								m_parserflag;

+    CPDF_TextObject*				m_pPreTextObj;

+    CFX_AffineMatrix				m_perMatrix;

+    FX_BOOL							m_IsParsered;

+    CFX_AffineMatrix				m_DisplayMatrix;

+

+    SEGMENT_Array					m_Segment;

+    CFX_RectArray					m_SelRects;

+    LINEOBJ							m_LineObj;

+    FX_BOOL							m_TextlineDir;

+    CFX_FloatRect					m_CurlineRect;

+};

+class CPDF_TextPageFind: public IPDF_TextPageFind

+{

+public:

+    CPDF_TextPageFind(const IPDF_TextPage* pTextPage);

+    virtual							~CPDF_TextPageFind() {};

+public:

+    virtual	FX_BOOL					FindFirst(CFX_WideString findwhat, int flags, int startPos = 0);

+    virtual	FX_BOOL					FindNext();

+    virtual	FX_BOOL					FindPrev();

+

+    virtual void					GetRectArray(CFX_RectArray& rects) const;

+    virtual int						GetCurOrder() const;

+    virtual int						GetMatchedCount()const;

+protected:

+    void							ExtractFindWhat(CFX_WideString findwhat);

+    FX_BOOL							IsMatchWholeWord(CFX_WideString csPageText, int startPos, int endPos);

+    FX_BOOL							ExtractSubString(CFX_WideString& rString, FX_LPCWSTR lpszFullString,

+            int iSubString, FX_WCHAR chSep);

+    CFX_WideString					MakeReverse(const CFX_WideString str);

+    int								ReverseFind(CFX_WideString csPageText, CFX_WideString csWord, int nStartPos, int& WordLength);

+    int								GetCharIndex(int index) const;

+private:

+    CFX_WordArray					m_CharIndex;

+    const IPDF_TextPage*			m_pTextPage;

+    CFX_WideString					m_strText;

+    CFX_WideString					m_findWhat;

+    int								m_flags;

+    CFX_WideStringArray				m_csFindWhatArray;

+    int								m_findNextStart;

+    int								m_findPreStart;

+    FX_BOOL							m_bMatchCase;

+    FX_BOOL							m_bMatchWholeWord;

+    int								m_resStart;

+    int								m_resEnd;

+    CFX_RectArray					m_resArray;

+    FX_BOOL							m_IsFind;

+};

+class CPDF_LinkExt: public CFX_Object

+{

+public:

+    CPDF_LinkExt() {};

+    int								m_Start;

+    int								m_Count;

+    CFX_WideString					m_strUrl;

+    virtual							~CPDF_LinkExt() {};

+};

+typedef CFX_ArrayTemplate<CPDF_LinkExt*> LINK_InfoArray;

+class CPDF_LinkExtract: public IPDF_LinkExtract

+{

+public:

+    CPDF_LinkExtract();

+    virtual							~CPDF_LinkExtract();

+    virtual FX_BOOL					ExtractLinks(const IPDF_TextPage* pTextPage);

+    virtual	FX_BOOL					IsExtract() const

+    {

+        return m_IsParserd;

+    }

+public:

+    virtual int						CountLinks() const;

+    virtual	CFX_WideString			GetURL(int index) const;

+    virtual	void					GetBoundedSegment(int index, int& start, int& count) const;

+    virtual	void					GetRects(int index, CFX_RectArray& rects)const;

+protected:

+    void							parserLink();

+    void							DeleteLinkList();

+    FX_BOOL							CheckWebLink(CFX_WideString& strBeCheck);

+    FX_BOOL							CheckMailLink(CFX_WideString& str);

+    FX_BOOL							AppendToLinkList(int start, int count, CFX_WideString strUrl);

+private:

+    LINK_InfoArray					m_LinkList;

+    const CPDF_TextPage*			m_pTextPage;

+    CFX_WideString					m_strPageText;

+    FX_BOOL							m_IsParserd;

+};

+FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_LPWSTR pDst);

+void NormalizeString(CFX_WideString& str);

+void NormalizeCompositeChar(FX_WCHAR wChar, CFX_WideString& sDest);

+#endif

diff --git a/core/src/fpdftext/txtproc.h b/core/src/fpdftext/txtproc.h
new file mode 100644
index 0000000..3ec850d
--- /dev/null
+++ b/core/src/fpdftext/txtproc.h
@@ -0,0 +1,70 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _PDF_TXTPROC_H_

+#define _PDF_TXTPROC_H_

+class CTextColumn : public CFX_Object

+{

+public:

+    FX_FLOAT	m_AvgPos;

+    int		m_Count;

+    int		m_TextPos;

+};

+class CTextBox : public CFX_Object

+{

+public:

+    CFX_WideString	m_Text;

+    FX_FLOAT	m_Left;

+    FX_FLOAT	m_Right;

+    FX_FLOAT	m_SpaceWidth;

+    FX_FLOAT	m_Top;

+    FX_FLOAT	m_Bottom;

+    FX_FLOAT	m_FontSizeV;

+    CTextColumn* m_pColumn;

+};

+class CTextBaseLine : public CFX_Object

+{

+public:

+    CTextBaseLine();

+    ~CTextBaseLine();

+    void	InsertTextBox(FX_FLOAT leftx, FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy,

+                          FX_FLOAT spacew, FX_FLOAT fontsize_v, const CFX_WideString& str);

+    FX_BOOL	GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx);

+    FX_BOOL	CanMerge(CTextBaseLine* pOther);

+    void	Merge(CTextBaseLine* pOther);

+    void	MergeBoxes();

+    void	CountChars(int& count, FX_FLOAT& width, int& minchars);

+    void	WriteOutput(CFX_WideString& str, FX_FLOAT leftx, FX_FLOAT width, int iWidth);

+    FX_FLOAT	m_BaseLine;

+    FX_FLOAT	m_Top;

+    FX_FLOAT	m_Bottom;

+    FX_FLOAT	m_MaxFontSizeV;

+    CFX_PtrArray		m_TextList;

+};

+class CPDF_PageObject;

+class CPDF_TextObject;

+class CTextPage : public CFX_Object

+{

+public:

+    CTextPage();

+    ~CTextPage();

+    void	ProcessObject(CPDF_PageObject* pObj);

+    CTextBaseLine* InsertTextBox(CTextBaseLine* pBaseLine, FX_FLOAT basey, FX_FLOAT leftx,

+                                 FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy, FX_FLOAT spacew, FX_FLOAT fontsize_v,

+                                 CFX_ByteString& str, CPDF_Font* pFont);

+    void	WriteOutput(CFX_WideStringArray& lines, int iMinWidth);

+    FX_BOOL	m_bAutoWidth;

+    FX_BOOL	m_bKeepColumn;

+    FX_BOOL	m_bBreakSpace;

+    FX_BOOL	m_bOCR;

+private:

+    CFX_PtrArray	m_BaseLines;

+    CFX_PtrArray	m_TextColumns;

+    void	FindColumns();

+    CTextColumn*	FindColumn(FX_FLOAT xpos);

+    void	BreakSpace(CPDF_TextObject* pTextObj);

+};

+#endif

diff --git a/core/src/fpdftext/unicodenormalization.cpp b/core/src/fpdftext/unicodenormalization.cpp
new file mode 100644
index 0000000..b92787b
--- /dev/null
+++ b/core/src/fpdftext/unicodenormalization.cpp
@@ -0,0 +1,75 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fpdftext/fpdf_text.h"

+extern const FX_WCHAR g_UnicodeData_Normalization[65536];

+extern const FX_WCHAR g_UnicodeData_Normalization_Map1[5376];

+extern const FX_WCHAR g_UnicodeData_Normalization_Map2[1734];

+extern const FX_WCHAR g_UnicodeData_Normalization_Map3[1164];

+extern const FX_WCHAR g_UnicodeData_Normalization_Map4[488];

+FX_LPCWSTR g_UnicodeData_Normalization_Maps[5] = {

+    NULL,

+    g_UnicodeData_Normalization_Map1,

+    g_UnicodeData_Normalization_Map2,

+    g_UnicodeData_Normalization_Map3,

+    g_UnicodeData_Normalization_Map4

+};

+FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_LPWSTR pDst)

+{

+    wch = wch & 0xFFFF;

+    FX_WCHAR wFind = g_UnicodeData_Normalization[wch];

+    if (!wFind) {

+        if (pDst) {

+            *pDst = wch;

+        }

+        return 1;

+    }

+    if(wFind >= 0x8000) {

+        wch = wFind - 0x8000;

+        wFind = 1;

+    } else {

+        wch = wFind & 0x0FFF;

+        wFind >>= 12;

+    }

+    FX_LPCWSTR pMap = g_UnicodeData_Normalization_Maps[wFind];

+    if (pMap == g_UnicodeData_Normalization_Map4) {

+        pMap = g_UnicodeData_Normalization_Map4 + wch;

+        wFind = (FX_WCHAR)(*pMap ++);

+    } else {

+        pMap += wch;

+    }

+    if (pDst) {

+        FX_WCHAR n = wFind;

+        while (n --) {

+            *pDst ++ = *pMap ++;

+        }

+    }

+    return (FX_STRSIZE)wFind;

+}

+FX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, FX_LPWSTR pDst)

+{

+    FX_STRSIZE nCount = 0;

+    for (FX_STRSIZE len = 0; len < wsSrc.GetLength(); len ++) {

+        FX_WCHAR wch = wsSrc.GetAt(len);

+        if(pDst) {

+            nCount += FX_Unicode_GetNormalization(wch, pDst + nCount);

+        } else {

+            nCount += FX_Unicode_GetNormalization(wch, pDst);

+        }

+    }

+    return nCount;

+}

+FX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, CFX_WideString &wsDst)

+{

+    FX_STRSIZE nLen = FX_WideString_GetNormalization(wsSrc, (FX_LPWSTR)NULL);

+    if (!nLen) {

+        return 0;

+    }

+    FX_LPWSTR pBuf = wsDst.GetBuffer(nLen);

+    FX_WideString_GetNormalization(wsSrc, pBuf);

+    wsDst.ReleaseBuffer(nLen);

+    return nLen;

+}

diff --git a/core/src/fpdftext/unicodenormalizationdata.cpp b/core/src/fpdftext/unicodenormalizationdata.cpp
new file mode 100644
index 0000000..750382b
--- /dev/null
+++ b/core/src/fpdftext/unicodenormalizationdata.cpp
@@ -0,0 +1,4661 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_system.h"

+extern const FX_WCHAR g_UnicodeData_Normalization[65536] = {

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8001, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2002, 0x8002, 0x0000, 0x2004, 0x0000, 0x0000, 0x8003,

+    0x8004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8005, 0x0000, 0x8006, 0x0000, 0x0000, 0x0000, 0x8007, 0x8008,

+    0x0000, 0x0000, 0x8009, 0x800A, 0x800B, 0x800C, 0x0000, 0x0000, 0x800D, 0x800E, 0x800F, 0x0000, 0x3000, 0x3003, 0x3006, 0x0000,

+    0x8010, 0x8011, 0x8012, 0x8013, 0x8014, 0x8015, 0x0000, 0x8016, 0x8017, 0x8018, 0x8019, 0x801A, 0x801B, 0x801C, 0x801D, 0x801E,

+    0x801F, 0x8020, 0x8021, 0x8022, 0x8023, 0x8024, 0x8025, 0x0000, 0x8026, 0x8027, 0x8028, 0x8029, 0x802A, 0x802B, 0x0000, 0x0000,

+    0x802C, 0x802D, 0x802E, 0x802F, 0x8030, 0x8031, 0x0000, 0x8032, 0x8033, 0x8034, 0x8035, 0x8036, 0x8037, 0x8038, 0x8039, 0x803A,

+    0x0000, 0x803B, 0x803C, 0x803D, 0x803E, 0x803F, 0x8040, 0x0000, 0x8041, 0x8042, 0x8043, 0x8044, 0x8045, 0x8046, 0x0000, 0x8047,

+    0x8048, 0x8049, 0x804A, 0x804B, 0x804C, 0x804D, 0x804E, 0x804F, 0x8050, 0x8051, 0x8052, 0x8053, 0x8054, 0x8055, 0x8056, 0x8057,

+    0x8058, 0x8059, 0x805A, 0x805B, 0x805C, 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067,

+    0x8068, 0x8069, 0x806A, 0x806B, 0x806C, 0x806D, 0x806E, 0x806F, 0x8070, 0x8071, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077,

+    0x8078, 0x0000, 0x2006, 0x2008, 0x8079, 0x807A, 0x807B, 0x807C, 0x807D, 0x807E, 0x807F, 0x8080, 0x8081, 0x8082, 0x8083, 0x8084,

+    0x8085, 0x8086, 0x8087, 0x8088, 0x8089, 0x808A, 0x808B, 0x808C, 0x808D, 0x808E, 0x0000, 0x0000, 0x808F, 0x8090, 0x8091, 0x8092,

+    0x8093, 0x8094, 0x200A, 0x200C, 0x8095, 0x8096, 0x8097, 0x8098, 0x8099, 0x809A, 0x809B, 0x809C, 0x809D, 0x809E, 0x809F, 0x80A0,

+    0x80A1, 0x80A2, 0x80A3, 0x80A4, 0x80A5, 0x80A6, 0x80A7, 0x80A8, 0x80A9, 0x80AA, 0x80AB, 0x80AC, 0x80AD, 0x80AE, 0x80AF, 0x80B0,

+    0x80B1, 0x80B2, 0x80B3, 0x80B4, 0x80B5, 0x80B6, 0x80B7, 0x80B8, 0x80B9, 0x80BA, 0x80BB, 0x80BC, 0x80BD, 0x80BE, 0x80BF, 0x80C0,

+    0x80C1, 0x80C2, 0x80C3, 0x80C4, 0x0000, 0x0000, 0x0000, 0x80C5, 0x80C6, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x0000, 0x80CB, 0x0000,

+    0x80CC, 0x80CD, 0x80CE, 0x80CF, 0x0000, 0x0000, 0x0000, 0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x0000, 0x80D4, 0x80D5, 0x80D6, 0x80D7,

+    0x80D8, 0x80D9, 0x0000, 0x0000, 0x80DA, 0x80DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x80DC, 0x80DD, 0x80DE, 0x80DF, 0x80E0, 0x80E1,

+    0x80E2, 0x0000, 0x80E3, 0x80E4, 0x80E5, 0x80E6, 0x80E7, 0x0000, 0x80E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x200E, 0x2010, 0x2012, 0x2014, 0x2016, 0x2018, 0x201A, 0x201C, 0x201E, 0x80E9, 0x80EA, 0x80EB,

+    0x80EC, 0x80ED, 0x80EE, 0x80EF, 0x80F0, 0x80F1, 0x80F2, 0x80F3, 0x80F4, 0x80F5, 0x80F6, 0x80F7, 0x80F8, 0x80F9, 0x80FA, 0x80FB,

+    0x80FC, 0x80FD, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8102, 0x8103, 0x8104, 0x8105, 0x8106, 0x8107, 0x8108, 0x8109, 0x810A, 0x810B,

+    0x810C, 0x2020, 0x2022, 0x2024, 0x810D, 0x810E, 0x0000, 0x0000, 0x810F, 0x8110, 0x8111, 0x8112, 0x8113, 0x8114, 0x8115, 0x8116,

+    0x8117, 0x8118, 0x8119, 0x811A, 0x811B, 0x811C, 0x811D, 0x811E, 0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126,

+    0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812C, 0x812D, 0x812E, 0x812F, 0x8130, 0x8131, 0x8132, 0x0000, 0x0000, 0x8133, 0x8134,

+    0x8135, 0x8136, 0x0000, 0x0000, 0x8137, 0x8138, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D, 0x813E, 0x813F, 0x8140, 0x8141, 0x8142,

+    0x8143, 0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, 0x814A, 0x2026, 0x2028, 0x814B, 0x814C, 0x814D, 0x814E, 0x814F, 0x8150,

+    0x8151, 0x0000, 0x0000, 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159, 0x815A, 0x815B, 0x815C, 0x815D, 0x815E,

+    0x815F, 0x0000, 0x8160, 0x8161, 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x0000, 0x8167, 0x8168, 0x8169, 0x816A, 0x816B, 0x816C,

+    0x816D, 0x816E, 0x816F, 0x0000, 0x0000, 0x8170, 0x8171, 0x0000, 0x8172, 0x0000, 0x8173, 0x8174, 0x8175, 0x8176, 0x0000, 0x8177,

+    0x8178, 0x8179, 0x817A, 0x817B, 0x817C, 0x817D, 0x202A, 0x0000, 0x0000, 0x817E, 0x817F, 0x8180, 0x8181, 0x8182, 0x8183, 0x8184,

+    0x8185, 0x8186, 0x8187, 0x0000, 0x8188, 0x8189, 0x818A, 0x818B, 0x818C, 0x818D, 0x0000, 0x818E, 0x818F, 0x8190, 0x8191, 0x8192,

+    0x8193, 0x8194, 0x0000, 0x8195, 0x0000, 0x0000, 0x0000, 0x8196, 0x0000, 0x8197, 0x8198, 0x8199, 0x819A, 0x819B, 0x819C, 0x819D,

+    0x819E, 0x0000, 0x0000, 0x202C, 0x202E, 0x2030, 0x2032, 0x2034, 0x2036, 0x2038, 0x203A, 0x203C, 0x0000, 0x0000, 0x819F, 0x81A0,

+    0x81A1, 0x81A2, 0x81A3, 0x81A4, 0x81A5, 0x81A6, 0x81A7, 0x81A8, 0x81A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x81AA, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x81AF, 0x81B0, 0x0000, 0x81B1, 0x81B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x81B3, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0x81BA, 0x81BB, 0x81BC, 0x81BD, 0x81BE, 0x81BF,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x81C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81C1, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x81C2, 0x81C3, 0x81C4, 0x81C5, 0x81C6, 0x81C7, 0x81C8, 0x0000, 0x81C9, 0x0000, 0x81CA, 0x81CB,

+    0x81CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, 0x81D2,

+    0x81D3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x0000,

+    0x81D9, 0x81DA, 0x81DB, 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x81E0, 0x81E1, 0x81E2, 0x0000, 0x81E3, 0x81E4, 0x0000, 0x0000, 0x0000, 0x81E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x81E6, 0x81E7, 0x0000, 0x81E8, 0x0000, 0x0000, 0x0000, 0x81E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x81EA, 0x81EB, 0x81EC, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x81EF, 0x81F0, 0x0000, 0x81F1, 0x0000, 0x0000, 0x0000, 0x81F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x81F3, 0x81F4, 0x81F5, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81F6, 0x81F7, 0x0000, 0x0000, 0x81F8, 0x81F9, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FA, 0x81FB, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FC, 0x81FD, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FE, 0x81FF, 0x0000, 0x0000, 0x8200, 0x8201,

+    0x8202, 0x8203, 0x8204, 0x8205, 0x8206, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, 0x820C, 0x820D, 0x820E, 0x820F, 0x8210, 0x8211,

+    0x8212, 0x8213, 0x8214, 0x8215, 0x203E, 0x2040, 0x8216, 0x8217, 0x0000, 0x0000, 0x8218, 0x8219, 0x821A, 0x821B, 0x0000, 0x0000,

+    0x821C, 0x821D, 0x821E, 0x821F, 0x2042, 0x2044, 0x8220, 0x8221, 0x8222, 0x8223, 0x0000, 0x0000, 0x8224, 0x8225, 0x8226, 0x8227,

+    0x0000, 0x8228, 0x8229, 0x822A, 0x822B, 0x822C, 0x822D, 0x822E, 0x822F, 0x8230, 0x8231, 0x0000, 0x0000, 0x8232, 0x8233, 0x0000,

+    0x8234, 0x8235, 0x8236, 0x8237, 0x2046, 0x2048, 0x8238, 0x8239, 0x0000, 0x0000, 0x823A, 0x823B, 0x823C, 0x823D, 0x823E, 0x823F,

+    0x0000, 0x0000, 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x0000, 0x0000, 0x8246, 0x8247, 0x8248, 0x8249, 0x824A, 0x824B,

+    0x824C, 0x824D, 0x824E, 0x824F, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, 0x825A, 0x825B,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x825C, 0x825D, 0x825E, 0x825F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x204A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x204C, 0x204E, 0x2050, 0x2052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x2054, 0x0000, 0x2056, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x2058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x205A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x205C, 0x0000, 0x0000, 0x205E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2060, 0x2062, 0x2064, 0x2066, 0x2068, 0x206A, 0x206C, 0x206E,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2070, 0x2072, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2074, 0x2076, 0x0000, 0x2078,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x207A, 0x0000, 0x0000, 0x207C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x207E, 0x2080, 0x2082, 0x0000, 0x0000, 0x2084, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2086, 0x0000, 0x0000, 0x2088, 0x208A, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x208C, 0x208E, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x2090, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2092, 0x2094, 0x2096, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2098, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x209A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x209C, 0x209E, 0x0000, 0x20A0, 0x20A2, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20A4, 0x20A6, 0x20A8, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20AA, 0x0000, 0x20AC, 0x20AE, 0x20B0, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x20B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x20B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20B6, 0x20B8, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8260, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x20BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20BC, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x20BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C2, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x20C6, 0x0000, 0x20C8, 0x20CA, 0x20CC, 0x20CE, 0x20D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x20D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x20D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20D6, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x20D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DC, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8261, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E2, 0x0000, 0x20E4, 0x0000, 0x20E6, 0x0000, 0x20E8, 0x0000, 0x20EA, 0x0000,

+    0x0000, 0x0000, 0x20EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20EE, 0x0000, 0x20F0, 0x0000, 0x0000,

+    0x20F2, 0x20F4, 0x0000, 0x20F6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8262, 0x8263, 0x8264, 0x8265,

+    0x8266, 0x8267, 0x8268, 0x8269, 0x826A, 0x826B, 0x826C, 0x826D, 0x826E, 0x826F, 0x8270, 0x0000, 0x8271, 0x8272, 0x8273, 0x8274,

+    0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827A, 0x827B, 0x827C, 0x827D, 0x827E, 0x827F, 0x8280, 0x8281, 0x8282, 0x0000, 0x8283,

+    0x8284, 0x8285, 0x8286, 0x8287, 0x8288, 0x8289, 0x828A, 0x828B, 0x828C, 0x828D, 0x828E, 0x828F, 0x8290, 0x8291, 0x8292, 0x8293,

+    0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, 0x829A, 0x829B, 0x829C, 0x829D, 0x829E, 0x0000, 0x829F, 0x82A0, 0x82A1, 0x82A2,

+    0x82A3, 0x82A4, 0x82A5, 0x82A6, 0x82A7, 0x82A8, 0x82A9, 0x82AA, 0x82AB, 0x0000, 0x20F8, 0x82AC, 0x0000, 0x82AD, 0x82AE, 0x82AF,

+    0x82B0, 0x82B1, 0x82B2, 0x82B3, 0x82B4, 0x82B5, 0x82B6, 0x82B7, 0x82B8, 0x82B9, 0x82BA, 0x82BB, 0x82BC, 0x82BD, 0x82BE, 0x82BF,

+    0x82C0, 0x82C1, 0x82C2, 0x82C3, 0x82C4, 0x82C5, 0x82C6, 0x0000, 0x82C7, 0x0000, 0x0000, 0x82C8, 0x82C9, 0x82CA, 0x82CB, 0x82CC,

+    0x82CD, 0x82CE, 0x82CF, 0x82D0, 0x82D1, 0x82D2, 0x82D3, 0x82D4, 0x82D5, 0x82D6, 0x82D7, 0x82D8, 0x82D9, 0x82DA, 0x82DB, 0x82DC,

+    0x82DD, 0x82DE, 0x82DF, 0x82E0, 0x82E1, 0x82E2, 0x82E3, 0x82E4, 0x82E5, 0x82E6, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EB, 0x82EC,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x82ED, 0x82EE, 0x82EF, 0x82F0, 0x82F1, 0x82F2, 0x82F3, 0x82F4, 0x82F5, 0x82F6, 0x82F7, 0x82F8, 0x82F9, 0x82FA, 0x82FB, 0x82FC,

+    0x82FD, 0x82FE, 0x82FF, 0x8300, 0x8301, 0x8302, 0x8303, 0x8304, 0x8305, 0x8306, 0x8307, 0x8308, 0x8309, 0x830A, 0x830B, 0x830C,

+    0x830D, 0x830E, 0x830F, 0x8310, 0x8311, 0x8312, 0x8313, 0x8314, 0x8315, 0x8316, 0x8317, 0x8318, 0x8319, 0x831A, 0x831B, 0x831C,

+    0x831D, 0x831E, 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8327, 0x8328, 0x8329, 0x832A, 0x832B, 0x832C,

+    0x832D, 0x832E, 0x832F, 0x8330, 0x8331, 0x8332, 0x8333, 0x8334, 0x8335, 0x8336, 0x8337, 0x8338, 0x8339, 0x833A, 0x833B, 0x833C,

+    0x833D, 0x833E, 0x833F, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834A, 0x834B, 0x834C,

+    0x834D, 0x834E, 0x834F, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835A, 0x835B, 0x835C,

+    0x835D, 0x835E, 0x835F, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836A, 0x836B, 0x836C,

+    0x836D, 0x836E, 0x836F, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379, 0x837A, 0x837B, 0x837C,

+    0x837D, 0x837E, 0x837F, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, 0x8388, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8389, 0x838A, 0x838B, 0x838C, 0x838D, 0x838E, 0x838F, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x8397, 0x8398,

+    0x8399, 0x839A, 0x839B, 0x839C, 0x839D, 0x839E, 0x839F, 0x83A0, 0x83A1, 0x83A2, 0x83A3, 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83A8,

+    0x83A9, 0x83AA, 0x83AB, 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B0, 0x83B1, 0x83B2, 0x83B3, 0x83B4, 0x83B5, 0x83B6, 0x83B7, 0x83B8,

+    0x83B9, 0x83BA, 0x83BB, 0x83BC, 0x83BD, 0x83BE, 0x83BF, 0x83C0, 0x83C1, 0x83C2, 0x83C3, 0x83C4, 0x83C5, 0x83C6, 0x83C7, 0x83C8,

+    0x83C9, 0x83CA, 0x83CB, 0x83CC, 0x83CD, 0x83CE, 0x83CF, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D4, 0x83D5, 0x83D6, 0x83D7, 0x83D8,

+    0x83D9, 0x83DA, 0x83DB, 0x83DC, 0x83DD, 0x83DE, 0x83DF, 0x83E0, 0x83E1, 0x83E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x83E3, 0x83E4, 0x83E5, 0x83E6, 0x83E7, 0x83E8, 0x83E9, 0x83EA, 0x83EB, 0x83EC, 0x83ED, 0x83EE, 0x83EF, 0x83F0, 0x83F1, 0x83F2,

+    0x83F3, 0x83F4, 0x83F5, 0x83F6, 0x83F7, 0x83F8, 0x0000, 0x0000, 0x83F9, 0x83FA, 0x83FB, 0x83FC, 0x83FD, 0x83FE, 0x0000, 0x0000,

+    0x83FF, 0x8400, 0x8401, 0x8402, 0x8403, 0x8404, 0x8405, 0x8406, 0x8407, 0x8408, 0x8409, 0x840A, 0x840B, 0x840C, 0x840D, 0x840E,

+    0x840F, 0x8410, 0x8411, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, 0x8418, 0x8419, 0x841A, 0x841B, 0x841C, 0x841D, 0x841E,

+    0x841F, 0x8420, 0x8421, 0x8422, 0x8423, 0x8424, 0x0000, 0x0000, 0x8425, 0x8426, 0x8427, 0x8428, 0x8429, 0x842A, 0x0000, 0x0000,

+    0x842B, 0x842C, 0x842D, 0x842E, 0x842F, 0x8430, 0x8431, 0x8432, 0x0000, 0x8433, 0x0000, 0x8434, 0x0000, 0x8435, 0x0000, 0x8436,

+    0x8437, 0x8438, 0x8439, 0x843A, 0x843B, 0x843C, 0x843D, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446,

+    0x8447, 0x8448, 0x8449, 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x0000, 0x0000,

+    0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845A, 0x845B, 0x845C, 0x845D, 0x845E, 0x845F, 0x8460, 0x8461, 0x8462, 0x8463, 0x8464,

+    0x8465, 0x8466, 0x8467, 0x8468, 0x8469, 0x846A, 0x846B, 0x846C, 0x846D, 0x846E, 0x846F, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474,

+    0x8475, 0x8476, 0x8477, 0x8478, 0x8479, 0x847A, 0x847B, 0x847C, 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8482, 0x8483, 0x8484,

+    0x8485, 0x8486, 0x8487, 0x8488, 0x8489, 0x0000, 0x848A, 0x848B, 0x848C, 0x848D, 0x848E, 0x848F, 0x8490, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8491, 0x8492, 0x8493, 0x0000, 0x8494, 0x8495, 0x8496, 0x8497, 0x8498, 0x8499, 0x849A, 0x0000, 0x0000, 0x0000,

+    0x849B, 0x849C, 0x849D, 0x849E, 0x0000, 0x0000, 0x849F, 0x84A0, 0x84A1, 0x84A2, 0x84A3, 0x84A4, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x84A5, 0x84A6, 0x84A7, 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84AF, 0x84B0, 0x84B1, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x84B2, 0x84B3, 0x84B4, 0x0000, 0x84B5, 0x84B6, 0x84B7, 0x84B8, 0x84B9, 0x84BA, 0x84BB, 0x84BC, 0x84BD, 0x0000,

+    0x84BE, 0x84BF, 0x84C0, 0x84C1, 0x84C2, 0x84C3, 0x84C4, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x84C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x84CB, 0x20FA, 0x3009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CC,

+    0x0000, 0x0000, 0x0000, 0x20FC, 0x300C, 0x0000, 0x20FE, 0x300F, 0x0000, 0x0000, 0x0000, 0x0000, 0x2100, 0x0000, 0x2102, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0x2106, 0x2108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CD,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x84CE, 0x84CF, 0x0000, 0x0000, 0x84D0, 0x84D1, 0x84D2, 0x84D3, 0x84D4, 0x84D5, 0x84D6, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0x84DB,

+    0x84DC, 0x84DD, 0x84DE, 0x84DF, 0x84E0, 0x84E1, 0x84E2, 0x84E3, 0x84E4, 0x84E5, 0x84E6, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x0000,

+    0x84EB, 0x84EC, 0x84ED, 0x84EE, 0x84EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x210A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x3012, 0x3015, 0x84F0, 0x210C, 0x0000, 0x3018, 0x301B, 0x84F1, 0x0000, 0x210E, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7,

+    0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x0000, 0x84FC, 0x2110, 0x0000, 0x0000, 0x84FD, 0x84FE, 0x84FF, 0x8500, 0x8501, 0x8502, 0x8503,

+    0x2112, 0x301E, 0x2114, 0x8504, 0x8505, 0x0000, 0x8506, 0x8507, 0x8508, 0x0000, 0x8509, 0x850A, 0x850B, 0x850C, 0x850D, 0x850E,

+    0x850F, 0x8510, 0x0000, 0x8511, 0x8512, 0x8513, 0x8514, 0x8515, 0x8516, 0x8517, 0x0000, 0x3021, 0x8518, 0x8519, 0x851A, 0x851B,

+    0x851C, 0x0000, 0x0000, 0x0000, 0x0000, 0x851D, 0x851E, 0x851F, 0x8520, 0x8521, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x3024, 0x3027, 0x4005, 0x302A, 0x302D, 0x3030, 0x3033, 0x3036, 0x3039, 0x303C, 0x303F, 0x3042, 0x3045, 0x3048, 0x304B, 0x2116,

+    0x8522, 0x2118, 0x304E, 0x211A, 0x8523, 0x211C, 0x3051, 0x400A, 0x211E, 0x8524, 0x2120, 0x3054, 0x8525, 0x8526, 0x8527, 0x8528,

+    0x8529, 0x2122, 0x3057, 0x2124, 0x852A, 0x2126, 0x305A, 0x400F, 0x2128, 0x852B, 0x212A, 0x305D, 0x852C, 0x852D, 0x852E, 0x852F,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x212C, 0x212E, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2130, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2132, 0x2134, 0x2136,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8530, 0x0000, 0x0000, 0x0000, 0x0000, 0x8531, 0x0000, 0x0000, 0x8532, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x2138, 0x0000, 0x213A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x213C, 0x3063, 0x0000, 0x213E,

+    0x3066, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x2140, 0x0000, 0x0000, 0x2142, 0x0000, 0x0000, 0x2144, 0x0000, 0x2146, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x2148, 0x0000, 0x214A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x214C, 0x214E, 0x2150,

+    0x2152, 0x2154, 0x0000, 0x0000, 0x2156, 0x2158, 0x0000, 0x0000, 0x215A, 0x215C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x215E, 0x2160, 0x0000, 0x0000, 0x2162, 0x2164, 0x0000, 0x0000, 0x2166, 0x2168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x216A, 0x216C, 0x216E, 0x2170,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x2172, 0x2174, 0x2176, 0x2178, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x217A, 0x217C, 0x217E, 0x2180, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8533, 0x8534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x3069, 0x306C, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x2182, 0x2184, 0x2186, 0x2188, 0x218A, 0x218C, 0x218E, 0x2190,

+    0x3081, 0x3084, 0x3087, 0x308A, 0x308D, 0x3090, 0x3093, 0x3096, 0x3099, 0x2192, 0x309C, 0x309F, 0x2194, 0x2196, 0x2198, 0x219A,

+    0x219C, 0x30A2, 0x8535, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8536, 0x8537, 0x8538, 0x8539, 0x853A, 0x853B, 0x853C, 0x853D, 0x853E, 0x219E, 0x21A0, 0x21A2, 0x21A4, 0x21A6, 0x21A8, 0x21AA,

+    0x21AC, 0x21AE, 0x21B0, 0x21B2, 0x30A5, 0x30A8, 0x30AB, 0x30AE, 0x30B1, 0x30B4, 0x30B7, 0x30BA, 0x30BD, 0x4014, 0x4019, 0x401E,

+    0x4023, 0x4028, 0x402D, 0x4032, 0x4037, 0x403C, 0x4041, 0x4046, 0x21B4, 0x21B6, 0x21B8, 0x21BA, 0x21BC, 0x21BE, 0x21C0, 0x21C2,

+    0x21C4, 0x30C0, 0x30C3, 0x30C6, 0x30C9, 0x30CC, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30E1, 0x30E4, 0x30E7, 0x30EA,

+    0x30ED, 0x30F0, 0x30F3, 0x30F6, 0x30F9, 0x30FC, 0x30FF, 0x3102, 0x3105, 0x3108, 0x310B, 0x310E, 0x3111, 0x3114, 0x3117, 0x311A,

+    0x311D, 0x3120, 0x3123, 0x3126, 0x3129, 0x312C, 0x853F, 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0x8548,

+    0x8549, 0x854A, 0x854B, 0x854C, 0x854D, 0x854E, 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558,

+    0x8559, 0x855A, 0x855B, 0x855C, 0x855D, 0x855E, 0x855F, 0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568,

+    0x8569, 0x856A, 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, 0x8572, 0x8573, 0x21C6, 0x21C8, 0x21CA, 0x21CC, 0x21CE,

+    0x21D0, 0x21D2, 0x21D4, 0x21D6, 0x21D8, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, 0x857A, 0x857B, 0x857C, 0x21DA, 0x857D,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x857E, 0x857F, 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585, 0x8586, 0x21DC,

+    0x8587, 0x8588, 0x8589, 0x858A, 0x858B, 0x858C, 0x858D, 0x858E, 0x858F, 0x21DE, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595,

+    0x8596, 0x8597, 0x8598, 0x21E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x404B, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x312F, 0x21E2, 0x3132, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E4, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8599, 0x859A, 0x859B, 0x859C, 0x859D, 0x859E, 0x859F, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A4, 0x85A5, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x85A6, 0x85A7, 0x85A8, 0x85A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AA, 0x85AB, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AC,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AD,

+    0x85AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x85AF, 0x0000, 0x0000, 0x85B0, 0x0000, 0x85B1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x85B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x85B4, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x85B5, 0x85B6, 0x0000, 0x0000, 0x0000, 0x85B7, 0x85B8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x85B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x85BA, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0, 0x85C1, 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85C9,

+    0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85CF, 0x85D0, 0x85D1, 0x85D2, 0x85D3, 0x85D4, 0x85D5, 0x85D6, 0x85D7, 0x85D8, 0x85D9,

+    0x85DA, 0x85DB, 0x85DC, 0x85DD, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E4, 0x85E5, 0x85E6, 0x85E7, 0x85E8, 0x85E9,

+    0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, 0x85F5, 0x85F6, 0x85F7, 0x85F8, 0x85F9,

+    0x85FA, 0x85FB, 0x85FC, 0x85FD, 0x85FE, 0x85FF, 0x8600, 0x8601, 0x8602, 0x8603, 0x8604, 0x8605, 0x8606, 0x8607, 0x8608, 0x8609,

+    0x860A, 0x860B, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8611, 0x8612, 0x8613, 0x8614, 0x8615, 0x8616, 0x8617, 0x8618, 0x8619,

+    0x861A, 0x861B, 0x861C, 0x861D, 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, 0x8626, 0x8627, 0x8628, 0x8629,

+    0x862A, 0x862B, 0x862C, 0x862D, 0x862E, 0x862F, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8638, 0x8639,

+    0x863A, 0x863B, 0x863C, 0x863D, 0x863E, 0x863F, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649,

+    0x864A, 0x864B, 0x864C, 0x864D, 0x864E, 0x864F, 0x8650, 0x8651, 0x8652, 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659,

+    0x865A, 0x865B, 0x865C, 0x865D, 0x865E, 0x865F, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669,

+    0x866A, 0x866B, 0x866C, 0x866D, 0x866E, 0x866F, 0x8670, 0x8671, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679,

+    0x867A, 0x867B, 0x867C, 0x867D, 0x867E, 0x867F, 0x8680, 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689,

+    0x868A, 0x868B, 0x868C, 0x868D, 0x868E, 0x868F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8690, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8691, 0x0000, 0x8692, 0x8693, 0x8694, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E6, 0x0000, 0x21E8, 0x0000,

+    0x21EA, 0x0000, 0x21EC, 0x0000, 0x21EE, 0x0000, 0x21F0, 0x0000, 0x21F2, 0x0000, 0x21F4, 0x0000, 0x21F6, 0x0000, 0x21F8, 0x0000,

+    0x21FA, 0x0000, 0x21FC, 0x0000, 0x0000, 0x21FE, 0x0000, 0x2200, 0x0000, 0x2202, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x2204, 0x2206, 0x0000, 0x2208, 0x220A, 0x0000, 0x220C, 0x220E, 0x0000, 0x2210, 0x2212, 0x0000, 0x2214, 0x2216, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x2218, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221A, 0x221C, 0x0000, 0x221E, 0x2220,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2222, 0x0000, 0x2224, 0x0000,

+    0x2226, 0x0000, 0x2228, 0x0000, 0x222A, 0x0000, 0x222C, 0x0000, 0x222E, 0x0000, 0x2230, 0x0000, 0x2232, 0x0000, 0x2234, 0x0000,

+    0x2236, 0x0000, 0x2238, 0x0000, 0x0000, 0x223A, 0x0000, 0x223C, 0x0000, 0x223E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x2240, 0x2242, 0x0000, 0x2244, 0x2246, 0x0000, 0x2248, 0x224A, 0x0000, 0x224C, 0x224E, 0x0000, 0x2250, 0x2252, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x2254, 0x0000, 0x0000, 0x2256, 0x2258, 0x225A, 0x225C, 0x0000, 0x0000, 0x0000, 0x225E, 0x2260,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869C, 0x869D, 0x869E, 0x869F, 0x86A0, 0x86A1, 0x86A2, 0x86A3,

+    0x86A4, 0x86A5, 0x86A6, 0x86A7, 0x86A8, 0x86A9, 0x86AA, 0x86AB, 0x86AC, 0x86AD, 0x86AE, 0x86AF, 0x86B0, 0x86B1, 0x86B2, 0x86B3,

+    0x86B4, 0x86B5, 0x86B6, 0x86B7, 0x86B8, 0x86B9, 0x86BA, 0x86BB, 0x86BC, 0x86BD, 0x86BE, 0x86BF, 0x86C0, 0x86C1, 0x86C2, 0x86C3,

+    0x86C4, 0x86C5, 0x86C6, 0x86C7, 0x86C8, 0x86C9, 0x86CA, 0x86CB, 0x86CC, 0x86CD, 0x86CE, 0x86CF, 0x86D0, 0x86D1, 0x86D2, 0x86D3,

+    0x86D4, 0x86D5, 0x86D6, 0x86D7, 0x86D8, 0x86D9, 0x86DA, 0x86DB, 0x86DC, 0x86DD, 0x86DE, 0x86DF, 0x86E0, 0x86E1, 0x86E2, 0x86E3,

+    0x86E4, 0x86E5, 0x86E6, 0x86E7, 0x86E8, 0x86E9, 0x86EA, 0x86EB, 0x86EC, 0x86ED, 0x86EE, 0x86EF, 0x86F0, 0x86F1, 0x86F2, 0x0000,

+    0x0000, 0x0000, 0x86F3, 0x86F4, 0x86F5, 0x86F6, 0x86F7, 0x86F8, 0x86F9, 0x86FA, 0x86FB, 0x86FC, 0x86FD, 0x86FE, 0x86FF, 0x8700,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x3135, 0x3138, 0x313B, 0x313E, 0x3141, 0x3144, 0x3147, 0x314A, 0x314D, 0x3150, 0x3153, 0x3156, 0x3159, 0x315C, 0x4050, 0x4055,

+    0x405A, 0x405F, 0x4064, 0x4069, 0x406E, 0x4073, 0x4078, 0x407D, 0x4082, 0x4087, 0x408C, 0x4091, 0x4096, 0x409B, 0x40A3, 0x0000,

+    0x315F, 0x3162, 0x3165, 0x3168, 0x316B, 0x316E, 0x3171, 0x3174, 0x3177, 0x317A, 0x317D, 0x3180, 0x3183, 0x3186, 0x3189, 0x318C,

+    0x318F, 0x3192, 0x3195, 0x3198, 0x319B, 0x319E, 0x31A1, 0x31A4, 0x31A7, 0x31AA, 0x31AD, 0x31B0, 0x31B3, 0x31B6, 0x31B9, 0x31BC,

+    0x31BF, 0x31C2, 0x31C5, 0x31C8, 0x8701, 0x8702, 0x8703, 0x8704, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x31CB, 0x2262, 0x2264, 0x2266, 0x2268, 0x226A, 0x226C, 0x226E, 0x2270, 0x2272, 0x2274, 0x2276, 0x2278, 0x227A, 0x227C, 0x227E,

+    0x8705, 0x8706, 0x8707, 0x8708, 0x8709, 0x870A, 0x870B, 0x870C, 0x870D, 0x870E, 0x870F, 0x8710, 0x8711, 0x8712, 0x2280, 0x2282,

+    0x2284, 0x2286, 0x2288, 0x228A, 0x228C, 0x228E, 0x2290, 0x2292, 0x2294, 0x2296, 0x2298, 0x229A, 0x40AA, 0x40B0, 0x229C, 0x0000,

+    0x8713, 0x8714, 0x8715, 0x8716, 0x8717, 0x8718, 0x8719, 0x871A, 0x871B, 0x871C, 0x871D, 0x871E, 0x871F, 0x8720, 0x8721, 0x8722,

+    0x8723, 0x8724, 0x8725, 0x8726, 0x8727, 0x8728, 0x8729, 0x872A, 0x872B, 0x872C, 0x872D, 0x872E, 0x872F, 0x8730, 0x8731, 0x8732,

+    0x8733, 0x8734, 0x8735, 0x8736, 0x8737, 0x8738, 0x8739, 0x873A, 0x873B, 0x873C, 0x873D, 0x873E, 0x873F, 0x8740, 0x8741, 0x8742,

+    0x8743, 0x229E, 0x22A0, 0x22A2, 0x22A4, 0x22A6, 0x22A8, 0x22AA, 0x22AC, 0x22AE, 0x22B0, 0x22B2, 0x22B4, 0x22B6, 0x22B8, 0x22BA,

+    0x22BC, 0x22BE, 0x22C0, 0x22C2, 0x22C4, 0x22C6, 0x22C8, 0x22CA, 0x22CC, 0x31CE, 0x31D1, 0x31D4, 0x22CE, 0x31D7, 0x22D0, 0x31DA,

+    0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874A, 0x874B, 0x874C, 0x874D, 0x874E, 0x874F, 0x8750, 0x8751, 0x8752, 0x8753,

+    0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8760, 0x8761, 0x8762, 0x8763,

+    0x8764, 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876E, 0x876F, 0x8770, 0x8771, 0x8772, 0x0000,

+    0x40B5, 0x40BA, 0x40BF, 0x31DD, 0x40C4, 0x31E0, 0x31E3, 0x40C9, 0x40CF, 0x31E6, 0x31E9, 0x31EC, 0x40D4, 0x40D9, 0x31EF, 0x31F2,

+    0x22D2, 0x31F5, 0x40DE, 0x40E3, 0x22D4, 0x40E8, 0x40EE, 0x40F5, 0x31F8, 0x40FB, 0x4101, 0x4107, 0x31FB, 0x31FE, 0x3201, 0x410C,

+    0x4111, 0x4117, 0x3204, 0x3207, 0x320A, 0x22D6, 0x22D8, 0x22DA, 0x22DC, 0x320D, 0x3210, 0x411C, 0x3213, 0x4122, 0x4127, 0x3216,

+    0x22DE, 0x22E0, 0x412D, 0x4133, 0x4138, 0x3219, 0x413E, 0x22E2, 0x321C, 0x321F, 0x3222, 0x3225, 0x3228, 0x4144, 0x322B, 0x22E4,

+    0x322E, 0x3231, 0x3234, 0x4149, 0x3237, 0x323A, 0x323D, 0x414E, 0x4154, 0x22E6, 0x4159, 0x22E8, 0x415F, 0x4164, 0x3240, 0x3243,

+    0x3246, 0x4169, 0x22EA, 0x3249, 0x416E, 0x22EC, 0x4173, 0x324C, 0x22EE, 0x22F0, 0x22F2, 0x22F4, 0x22F6, 0x22F8, 0x22FA, 0x22FC,

+    0x22FE, 0x2300, 0x324F, 0x3252, 0x3255, 0x3258, 0x325B, 0x325E, 0x3261, 0x3264, 0x3267, 0x326A, 0x326D, 0x3270, 0x3273, 0x3276,

+    0x3279, 0x327C, 0x2302, 0x2304, 0x327F, 0x2306, 0x2308, 0x230A, 0x3282, 0x3285, 0x230C, 0x230E, 0x2310, 0x2312, 0x2314, 0x4179,

+    0x2316, 0x2318, 0x231A, 0x231C, 0x231E, 0x2320, 0x2322, 0x2324, 0x3288, 0x417E, 0x2326, 0x2328, 0x232A, 0x232C, 0x232E, 0x2330,

+    0x2332, 0x328B, 0x328E, 0x3291, 0x3294, 0x2334, 0x2336, 0x2338, 0x233A, 0x233C, 0x233E, 0x2340, 0x2342, 0x2344, 0x2346, 0x3297,

+    0x329A, 0x2348, 0x329D, 0x32A0, 0x32A3, 0x234A, 0x32A6, 0x32A9, 0x4183, 0x234C, 0x32AC, 0x32AF, 0x32B2, 0x32B5, 0x4188, 0x418E,

+    0x234E, 0x2350, 0x2352, 0x2354, 0x2356, 0x2358, 0x235A, 0x235C, 0x235E, 0x2360, 0x2362, 0x2364, 0x2366, 0x2368, 0x236A, 0x236C,

+    0x236E, 0x2370, 0x4195, 0x2372, 0x2374, 0x2376, 0x419A, 0x32B8, 0x2378, 0x237A, 0x237C, 0x237E, 0x2380, 0x2382, 0x2384, 0x2386,

+    0x2388, 0x238A, 0x32BB, 0x238C, 0x238E, 0x32BE, 0x32C1, 0x2390, 0x419F, 0x32C4, 0x2392, 0x2394, 0x2396, 0x2398, 0x32C7, 0x32CA,

+    0x239A, 0x239C, 0x239E, 0x23A0, 0x23A2, 0x23A4, 0x23A6, 0x23A8, 0x23AA, 0x32CD, 0x32D0, 0x32D3, 0x32D6, 0x32D9, 0x32DC, 0x32DF,

+    0x32E2, 0x32E5, 0x32E8, 0x32EB, 0x32EE, 0x32F1, 0x32F4, 0x32F7, 0x32FA, 0x32FD, 0x3300, 0x3303, 0x3306, 0x3309, 0x330C, 0x330F,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8773,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8774, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8775, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8776, 0x0000,

+    0x0000, 0x0000, 0x8777, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8778, 0x0000, 0x0000, 0x0000, 0x0000, 0x8779, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877A, 0x877B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x877C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x877F, 0x8780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8781, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8782, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8783, 0x0000, 0x0000, 0x8784, 0x0000, 0x8785, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8786, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8787, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8788, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8789, 0x878A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x878B, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x878C, 0x0000, 0x0000, 0x0000, 0x0000, 0x878D, 0x0000, 0x878E, 0x878F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8790, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8791, 0x0000, 0x8792,

+    0x0000, 0x0000, 0x0000, 0x8793, 0x8794, 0x8795, 0x0000, 0x8796, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8797, 0x0000,

+    0x0000, 0x0000, 0x8798, 0x0000, 0x0000, 0x8799, 0x0000, 0x0000, 0x0000, 0x879A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x879B, 0x0000, 0x0000, 0x0000, 0x879C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x879D, 0x0000, 0x0000, 0x879E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x879F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x87A1, 0x0000, 0x87A2, 0x0000, 0x87A3, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x87A5, 0x0000, 0x0000, 0x0000, 0x87A6, 0x87A7, 0x0000, 0x0000, 0x87A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A9,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x87AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x87AC, 0x0000, 0x0000, 0x87AD, 0x87AE, 0x87AF, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B1, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x87B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B4, 0x0000, 0x87B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x87B7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B8, 0x87B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BA, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BB, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x87BC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BD, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x87BF, 0x0000, 0x0000, 0x87C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C1, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C2, 0x0000, 0x87C3, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C4, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x87C5, 0x87C6, 0x0000, 0x87C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x87C8, 0x0000, 0x0000, 0x0000, 0x87C9, 0x0000, 0x87CA, 0x87CB, 0x0000, 0x87CC, 0x87CD, 0x0000, 0x0000,

+    0x0000, 0x87CE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x87CF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87D0, 0x0000, 0x87D1, 0x0000, 0x87D2, 0x0000, 0x0000, 0x0000, 0x87D3, 0x87D4, 0x0000,

+    0x0000, 0x0000, 0x87D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x87D6, 0x0000, 0x87D7, 0x0000, 0x87D8, 0x0000, 0x0000, 0x87D9, 0x0000, 0x0000, 0x87DA, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87DB, 0x0000, 0x87DC,

+    0x0000, 0x87DD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x87DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x87DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E0, 0x0000, 0x87E1, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E3, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x87E4, 0x0000, 0x87E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x87E6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x87E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x87E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x87E9, 0x0000, 0x0000, 0x87EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x87EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x87EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x87EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F0,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F1, 0x87F2,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F4, 0x0000, 0x87F5, 0x0000, 0x87F6, 0x0000,

+    0x0000, 0x0000, 0x87F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F8, 0x87F9, 0x0000, 0x0000, 0x87FA, 0x0000, 0x0000, 0x0000, 0x87FB, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8801, 0x0000, 0x8802, 0x8803, 0x0000, 0x0000, 0x0000, 0x0000, 0x8804, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8805, 0x0000, 0x0000, 0x0000, 0x0000, 0x8806, 0x8807,

+    0x8808, 0x0000, 0x0000, 0x0000, 0x0000, 0x8809, 0x0000, 0x0000, 0x880A, 0x0000, 0x0000, 0x0000, 0x0000, 0x880B, 0x0000, 0x0000,

+    0x0000, 0x880C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x880D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x880E, 0x0000, 0x0000,

+    0x880F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8810, 0x8811, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8812,

+    0x0000, 0x0000, 0x8813, 0x0000, 0x8814, 0x0000, 0x0000, 0x0000, 0x8815, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8816, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8817, 0x0000, 0x0000, 0x0000, 0x0000, 0x8818, 0x0000, 0x0000, 0x0000,

+    0x8819, 0x0000, 0x0000, 0x0000, 0x0000, 0x881A, 0x0000, 0x0000, 0x0000, 0x881B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x881C, 0x0000, 0x881D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x881E, 0x881F, 0x8820, 0x0000, 0x8821, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8822, 0x8823, 0x8824, 0x0000, 0x0000, 0x8825, 0x0000, 0x0000, 0x8826, 0x8827, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8828, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8829, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x882A, 0x0000, 0x0000, 0x0000, 0x882B, 0x0000, 0x882C, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x882D, 0x882E, 0x0000, 0x0000, 0x882F, 0x0000, 0x8830, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8831, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8832, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8833, 0x0000, 0x0000, 0x0000, 0x0000, 0x8834, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8835, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8836,

+    0x0000, 0x8837, 0x0000, 0x0000, 0x8838, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8839, 0x883A, 0x0000, 0x0000, 0x0000, 0x883B,

+    0x0000, 0x0000, 0x883C, 0x0000, 0x0000, 0x0000, 0x0000, 0x883D, 0x0000, 0x0000, 0x883E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x883F, 0x0000, 0x8840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8841, 0x0000, 0x0000, 0x0000, 0x8842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8843, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8844, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8845, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8846, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8847, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8849, 0x0000, 0x0000, 0x0000, 0x0000, 0x884A, 0x884B, 0x884C, 0x0000, 0x0000, 0x0000, 0x884D, 0x884E,

+    0x0000, 0x0000, 0x884F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8850, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8851,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8852, 0x0000, 0x8853, 0x8854, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8855, 0x0000, 0x8856, 0x0000, 0x0000, 0x8857, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8858, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8859, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885A, 0x0000, 0x885B, 0x885C, 0x0000, 0x0000, 0x0000, 0x885D, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885E, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885F, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8860, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8862, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8863, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8864, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8865, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8866, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8867,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8868, 0x8869, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886C, 0x0000, 0x0000, 0x0000, 0x886D,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886E, 0x0000, 0x0000, 0x886F, 0x8870, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8871, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8872, 0x0000, 0x0000, 0x8873, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8874, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8875, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8876, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8877, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8878, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8879, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887A,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887B, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x887C, 0x0000, 0x0000, 0x0000, 0x887D, 0x887E, 0x0000, 0x887F, 0x0000, 0x8880, 0x8881, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8882, 0x8883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8884, 0x8885, 0x0000, 0x0000, 0x8886, 0x0000, 0x8887, 0x8888, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8889, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888B, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888C, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x888D, 0x0000, 0x888E, 0x0000, 0x0000, 0x888F, 0x8890, 0x0000, 0x0000, 0x0000, 0x8891, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8892, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8893, 0x0000, 0x8894, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8895, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8896, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8897, 0x0000, 0x8898, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8899, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x889A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x889B, 0x0000, 0x0000, 0x889C, 0x0000, 0x0000, 0x889D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x889E, 0x0000, 0x0000, 0x889F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x88A0, 0x0000, 0x88A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A3, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x88A4, 0x0000, 0x0000, 0x0000, 0x88A5, 0x0000, 0x88A6, 0x0000, 0x88A7, 0x88A8, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A9, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x88AA, 0x0000, 0x88AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x88AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AE, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x88AF, 0x0000, 0x0000, 0x88B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x88B1, 0x0000, 0x0000, 0x88B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B3, 0x88B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B5,

+    0x0000, 0x0000, 0x0000, 0x88B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B7, 0x88B8, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BA, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BB, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x88BC, 0x88BD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BF, 0x0000, 0x0000, 0x88C0, 0x0000, 0x88C1,

+    0x88C2, 0x88C3, 0x88C4, 0x88C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88C6, 0x0000, 0x0000, 0x88C7, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x88C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x88C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x88CA, 0x0000, 0x88CB, 0x0000, 0x88CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88CD, 0x0000, 0x0000, 0x0000, 0x88CE, 0x0000, 0x88CF, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D1, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x88D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D3, 0x0000,

+    0x88D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D6, 0x0000, 0x0000, 0x0000, 0x88D7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88DB, 0x88DC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x88DD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x88DE, 0x88DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E0, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E1, 0x88E2, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x88E4, 0x0000, 0x0000, 0x88E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E6, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E7, 0x0000, 0x88E8, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E9, 0x0000, 0x88EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x88EB,

+    0x0000, 0x0000, 0x0000, 0x88EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88ED, 0x88EE, 0x0000, 0x0000, 0x88EF, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x88F0, 0x0000, 0x0000, 0x88F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x88F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x88F4, 0x88F5, 0x88F6, 0x0000, 0x0000, 0x0000, 0x88F7, 0x0000, 0x0000, 0x0000, 0x88F8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x88F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88FA, 0x0000, 0x0000, 0x88FB, 0x0000,

+    0x0000, 0x0000, 0x88FC, 0x0000, 0x0000, 0x0000, 0x88FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88FE, 0x0000, 0x88FF, 0x0000, 0x0000, 0x8900, 0x8901, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8902,

+    0x0000, 0x0000, 0x0000, 0x8903, 0x0000, 0x0000, 0x0000, 0x0000, 0x8904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8905, 0x0000, 0x0000, 0x0000, 0x8906, 0x8907, 0x8908, 0x0000, 0x8909, 0x0000, 0x890A, 0x0000, 0x890B, 0x0000,

+    0x890C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x890D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x890E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x890F, 0x0000, 0x8910, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8911, 0x0000, 0x8912, 0x0000, 0x0000, 0x0000, 0x8913, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8914, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8915, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8916, 0x0000, 0x0000, 0x8917, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8918, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8919, 0x891A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x891B, 0x0000, 0x891C, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x891D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x891E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x891F, 0x8920, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8921, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8922, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8923, 0x8924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8925, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8926, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8927, 0x0000, 0x0000, 0x8928,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8929,

+    0x0000, 0x0000, 0x0000, 0x892A, 0x0000, 0x0000, 0x892B, 0x0000, 0x0000, 0x0000, 0x0000, 0x892C, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x892D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x892E, 0x0000, 0x0000, 0x892F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8930,

+    0x0000, 0x0000, 0x0000, 0x8931, 0x0000, 0x8932, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8933, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8934, 0x8935, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8936, 0x0000, 0x0000, 0x8937, 0x8938,

+    0x0000, 0x8939, 0x0000, 0x0000, 0x893A, 0x0000, 0x0000, 0x893B, 0x0000, 0x0000, 0x893C, 0x893D, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x893E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x893F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8940, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8941, 0x0000, 0x0000, 0x8942,

+    0x8943, 0x8944, 0x8945, 0x0000, 0x8946, 0x0000, 0x0000, 0x8947, 0x0000, 0x0000, 0x8948, 0x8949, 0x894A, 0x0000, 0x894B, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x894C, 0x0000, 0x894D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x894E,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x894F, 0x0000, 0x8950, 0x0000, 0x0000, 0x8951, 0x0000, 0x8952, 0x8953, 0x8954, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8955, 0x8956, 0x8957, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8958, 0x0000, 0x8959, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x895A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x895B, 0x895C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x895D, 0x0000, 0x0000, 0x895E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x895F, 0x8960, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8961, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8962, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8963, 0x0000, 0x0000, 0x0000, 0x0000, 0x8964, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8966, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8967, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8968, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8969, 0x896A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x896B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x896C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x896D, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x896E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x896F, 0x0000, 0x8970, 0x8971, 0x0000, 0x8972, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8973, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8974, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8975, 0x0000, 0x0000, 0x0000, 0x8976, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8977, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8978, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8979, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x897A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x897B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x897C,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x897D, 0x0000, 0x0000, 0x0000, 0x897E, 0x0000, 0x0000, 0x0000, 0x0000, 0x897F, 0x0000, 0x8980,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8981, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8982, 0x8983, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8984,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8985, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8986, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8987,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8988, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8989, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898A, 0x0000, 0x0000, 0x0000, 0x0000, 0x898B, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898D, 0x0000, 0x0000, 0x0000, 0x898E, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898F,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8990, 0x0000, 0x8991, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8992, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8993, 0x0000, 0x0000, 0x8994, 0x8995, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8996, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8997, 0x8998, 0x0000, 0x0000, 0x8999, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x899A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x899B, 0x0000, 0x0000, 0x0000, 0x0000, 0x899C, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x899D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x899E, 0x899F, 0x89A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A1, 0x0000, 0x0000, 0x89A2, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A3,

+    0x0000, 0x0000, 0x89A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A5, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x89A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A7, 0x0000, 0x89A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x89A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89AA, 0x0000, 0x0000, 0x89AB,

+    0x0000, 0x0000, 0x89AC, 0x89AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89AE, 0x89AF,

+    0x0000, 0x0000, 0x0000, 0x89B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B1, 0x0000, 0x0000, 0x89B2, 0x0000, 0x0000, 0x89B3, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x89B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x89B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B6, 0x89B7, 0x0000, 0x89B8, 0x89B9, 0x89BA,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89BB, 0x0000, 0x89BC, 0x89BD, 0x0000, 0x89BE, 0x89BF, 0x89C0, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x89C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C2, 0x0000, 0x89C3, 0x89C4, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x89C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C6, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C7,

+    0x0000, 0x0000, 0x89C8, 0x0000, 0x0000, 0x0000, 0x89C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CA, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x89CB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CC,

+    0x0000, 0x89CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x89CE, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CF, 0x89D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D1,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D3, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x89D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D5, 0x0000, 0x0000, 0x89D6, 0x89D7,

+    0x0000, 0x0000, 0x89D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D9, 0x0000, 0x89DA, 0x0000, 0x0000, 0x0000,

+    0x89DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DD,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DE, 0x0000, 0x0000, 0x0000, 0x89DF, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x89E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E1, 0x89E2, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x89E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E6, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x89E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x89E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89ED, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x89EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F0, 0x0000, 0x0000, 0x89F1, 0x0000, 0x89F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F3, 0x89F4, 0x0000, 0x0000, 0x0000, 0x89F5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F6, 0x0000, 0x89F7, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x89F8, 0x0000, 0x0000, 0x0000, 0x89F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FA, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FB, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FD, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FF, 0x8A00,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A01, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A03, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A04, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8A05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A06, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8A07, 0x8A08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A09, 0x0000, 0x8A0A, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A0B, 0x0000, 0x0000, 0x8A0C,

+    0x0000, 0x0000, 0x8A0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A0E, 0x0000, 0x0000, 0x8A0F, 0x0000, 0x0000, 0x8A10, 0x8A11,

+    0x0000, 0x8A12, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8A15, 0x8A16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A17, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8A18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1A,

+    0x0000, 0x8A1B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8A1C, 0x0000, 0x0000, 0x8A1D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1E, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8A1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A20,

+    0x8A21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A22,

+    0x8A23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A24, 0x8A25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8A26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8A28, 0x0000, 0x0000, 0x0000, 0x8A29, 0x0000, 0x8A2A, 0x0000, 0x0000, 0x8A2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A2C, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8A2D, 0x0000, 0x8A2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A2F, 0x0000, 0x0000, 0x8A30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A31,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8A32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A33, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8A34, 0x8A35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A36, 0x0000, 0x8A37, 0x0000, 0x8A38, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A39, 0x8A3A, 0x0000, 0x0000, 0x8A3B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3C,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3D, 0x0000, 0x0000, 0x8A3E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3F, 0x0000, 0x8A40,

+    0x8A41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A42, 0x8A43, 0x8A44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8A45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A46, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8A47, 0x8A48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8A49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4A, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4B, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8A4C, 0x8A4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4F, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A51,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8A52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8A55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8A57, 0x0000, 0x0000, 0x8A58, 0x0000, 0x0000, 0x0000, 0x8A59, 0x0000, 0x0000, 0x8A5A, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8A5B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A5C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8A5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A5E, 0x0000,

+    0x0000, 0x8A5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A60, 0x8A61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8A62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A63, 0x0000, 0x0000, 0x8A64, 0x0000, 0x0000, 0x8A65,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A67, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8A68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A69, 0x0000, 0x8A6A, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6B, 0x0000, 0x0000,

+    0x8A6C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6D, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6E, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8A6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A70, 0x0000, 0x0000, 0x0000, 0x8A71, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A74, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A75, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A76, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8A77, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8A79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7A, 0x0000, 0x0000, 0x0000, 0x8A7B, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7E, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8A7F, 0x0000, 0x0000, 0x8A80, 0x8A81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A82, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A83, 0x0000, 0x8A84, 0x8A85, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8A86, 0x0000, 0x8A87, 0x0000, 0x0000, 0x8A88, 0x0000, 0x8A89, 0x8A8A, 0x0000, 0x8A8B, 0x8A8C, 0x8A8D, 0x0000, 0x0000, 0x0000,

+    0x8A8E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A8F, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A90, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A91,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A92, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8A93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8A94, 0x8A95, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A96, 0x8A97, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A98,

+    0x0000, 0x0000, 0x8A99, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8A9B, 0x0000, 0x8A9C, 0x0000, 0x0000, 0x8A9D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9E, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8A9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA1, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA3,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8AA4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA6, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8AA8, 0x8AA9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAA, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8AAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAC, 0x8AAD, 0x0000, 0x0000, 0x0000,

+    0x8AAE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB0, 0x0000, 0x0000, 0x8AB1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8AB3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8AB5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB6, 0x0000, 0x8AB7, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8AB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB9, 0x0000,

+    0x0000, 0x8ABA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8ABC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8ABE, 0x0000, 0x0000, 0x0000, 0x8ABF, 0x8AC0, 0x0000, 0x8AC1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AC2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AC3,

+    0x0000, 0x0000, 0x8AC4, 0x0000, 0x8AC5, 0x0000, 0x0000, 0x8AC6, 0x0000, 0x8AC7, 0x0000, 0x0000, 0x8AC8, 0x8AC9, 0x8ACA, 0x0000,

+    0x8ACB, 0x8ACC, 0x8ACD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ACE, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ACF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8AD0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AD1, 0x0000, 0x8AD2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8AD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AD4, 0x0000, 0x8AD5, 0x0000,

+    0x0000, 0x8AD6, 0x0000, 0x8AD7, 0x8AD8, 0x0000, 0x0000, 0x8AD9, 0x0000, 0x0000, 0x8ADA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADC, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADD,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADE, 0x0000, 0x8ADF, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE1, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE2, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE4, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8AE5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE7,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE8, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8AE9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEA, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8AEB, 0x0000, 0x0000, 0x0000, 0x8AEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AED,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEE, 0x0000, 0x0000, 0x0000, 0x8AEF, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF0, 0x0000, 0x8AF1, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8AF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8AF4, 0x0000, 0x0000, 0x0000, 0x8AF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF6,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF7, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8AF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF9, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AFA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AFB, 0x0000, 0x0000, 0x0000, 0x8AFC, 0x8AFD, 0x8AFE, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8AFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B00,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B01, 0x8B02, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B03, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B04, 0x0000, 0x0000, 0x0000, 0x8B05, 0x0000, 0x0000, 0x0000, 0x8B06, 0x0000,

+    0x0000, 0x8B07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B08,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0A, 0x0000, 0x0000, 0x8B0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0C, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0D, 0x0000,

+    0x0000, 0x8B0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0F, 0x8B10, 0x8B11, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8B12, 0x8B13, 0x8B14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B16, 0x8B17, 0x0000, 0x0000, 0x0000, 0x8B18, 0x8B19,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B1A, 0x8B1B, 0x0000, 0x0000, 0x0000, 0x8B1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8B1D, 0x8B1E, 0x0000, 0x8B1F, 0x0000, 0x0000, 0x8B20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B22, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B23, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B25, 0x0000, 0x0000, 0x0000, 0x8B26,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8B27, 0x0000, 0x0000, 0x0000, 0x8B28, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B29, 0x0000, 0x8B2A, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8B2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8B2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8B2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8B2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B30, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B31, 0x0000,

+    0x0000, 0x8B32, 0x0000, 0x8B33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B34, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B35, 0x0000, 0x8B36, 0x0000, 0x0000, 0x0000, 0x8B37, 0x8B38, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8B39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B3A, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B3B, 0x0000, 0x8B3C, 0x8B3D, 0x0000, 0x0000, 0x8B3E,

+    0x8B3F, 0x0000, 0x0000, 0x0000, 0x8B40, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B41, 0x0000, 0x0000, 0x8B42, 0x0000, 0x8B43, 0x0000,

+    0x0000, 0x0000, 0x8B44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B47, 0x8B48, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8B4A, 0x8B4B, 0x0000, 0x8B4C, 0x0000, 0x8B4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B4E, 0x0000,

+    0x8B4F, 0x0000, 0x8B50, 0x0000, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0x8B56, 0x0000, 0x8B57, 0x0000, 0x8B58, 0x0000, 0x0000,

+    0x8B59, 0x0000, 0x0000, 0x8B5A, 0x8B5B, 0x8B5C, 0x0000, 0x8B5D, 0x0000, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x0000, 0x0000,

+    0x0000, 0x8B63, 0x0000, 0x0000, 0x0000, 0x8B64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B65, 0x0000,

+    0x8B66, 0x8B67, 0x8B68, 0x8B69, 0x0000, 0x8B6A, 0x0000, 0x0000, 0x0000, 0x8B6B, 0x8B6C, 0x0000, 0x8B6D, 0x0000, 0x0000, 0x8B6E,

+    0x8B6F, 0x0000, 0x8B70, 0x8B71, 0x8B72, 0x0000, 0x8B73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B74, 0x0000,

+    0x8B75, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B77, 0x0000, 0x8B78, 0x8B79, 0x0000,

+    0x0000, 0x8B7A, 0x8B7B, 0x0000, 0x0000, 0x0000, 0x8B7C, 0x0000, 0x8B7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8B7E, 0x8B7F, 0x8B80, 0x8B81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B82, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8B83, 0x0000, 0x8B84, 0x0000, 0x0000, 0x8B85, 0x0000, 0x8B86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B87,

+    0x0000, 0x0000, 0x0000, 0x8B88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B89, 0x0000, 0x8B8A, 0x0000,

+    0x8B8B, 0x0000, 0x8B8C, 0x8B8D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B8E, 0x8B8F, 0x0000, 0x0000,

+    0x8B90, 0x8B91, 0x8B92, 0x0000, 0x8B93, 0x0000, 0x0000, 0x0000, 0x8B94, 0x8B95, 0x8B96, 0x8B97, 0x0000, 0x8B98, 0x8B99, 0x8B9A,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8B9B, 0x0000, 0x0000, 0x8B9C, 0x0000, 0x0000, 0x8B9D, 0x8B9E, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8B9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BA0, 0x8BA1, 0x8BA2, 0x8BA3, 0x0000, 0x0000, 0x8BA4, 0x8BA5, 0x0000,

+    0x8BA6, 0x8BA7, 0x0000, 0x8BA8, 0x0000, 0x0000, 0x8BA9, 0x0000, 0x8BAA, 0x8BAB, 0x0000, 0x0000, 0x8BAC, 0x0000, 0x0000, 0x8BAD,

+    0x0000, 0x8BAE, 0x8BAF, 0x0000, 0x8BB0, 0x0000, 0x8BB1, 0x0000, 0x0000, 0x8BB2, 0x0000, 0x8BB3, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BB4, 0x8BB5, 0x8BB6, 0x8BB7, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8BB8, 0x8BB9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BBA, 0x0000, 0x0000, 0x0000, 0x8BBB, 0x0000, 0x8BBC, 0x8BBD, 0x8BBE,

+    0x0000, 0x0000, 0x0000, 0x8BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BC0, 0x0000, 0x0000, 0x8BC1, 0x0000,

+    0x0000, 0x8BC2, 0x8BC3, 0x0000, 0x0000, 0x8BC4, 0x8BC5, 0x8BC6, 0x0000, 0x8BC7, 0x0000, 0x0000, 0x0000, 0x8BC8, 0x8BC9, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8BCA, 0x0000, 0x8BCB, 0x8BCC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8BCD, 0x0000, 0x8BCE, 0x8BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BD0, 0x0000, 0x0000, 0x0000, 0x8BD1, 0x0000,

+    0x0000, 0x8BD2, 0x8BD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BD4, 0x8BD5, 0x8BD6, 0x0000, 0x8BD7, 0x0000, 0x8BD8,

+    0x8BD9, 0x0000, 0x0000, 0x8BDA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BDB, 0x0000, 0x0000, 0x8BDC, 0x8BDD, 0x8BDE, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BDF, 0x0000, 0x8BE0, 0x0000, 0x8BE1, 0x0000, 0x0000, 0x8BE2,

+    0x0000, 0x0000, 0x0000, 0x8BE3, 0x0000, 0x0000, 0x8BE4, 0x0000, 0x8BE5, 0x0000, 0x0000, 0x0000, 0x8BE6, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BE7, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BE8, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8BE9, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BEA, 0x0000, 0x8BEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BEC, 0x8BED, 0x0000, 0x8BEE, 0x0000, 0x0000, 0x8BEF, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF0, 0x0000, 0x0000, 0x8BF1, 0x8BF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8BF4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8BF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF6, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF7, 0x0000, 0x0000, 0x0000, 0x8BF8, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF9, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFB, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFC,

+    0x8BFD, 0x0000, 0x8BFE, 0x8BFF, 0x0000, 0x8C00, 0x8C01, 0x8C02, 0x0000, 0x8C03, 0x0000, 0x0000, 0x0000, 0x8C04, 0x8C05, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C07, 0x0000, 0x0000, 0x8C08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C09, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0A, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0C, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8C0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C10, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8C11, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C12, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8C13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C14, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8C16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C18, 0x8C19, 0x8C1A,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C1B, 0x0000, 0x0000, 0x0000, 0x8C1C, 0x0000, 0x8C1D,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C1E, 0x0000, 0x8C1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C20,

+    0x8C21, 0x0000, 0x8C22, 0x0000, 0x0000, 0x8C23, 0x0000, 0x0000, 0x8C24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C26, 0x8C27, 0x8C28, 0x8C29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8C2B, 0x0000, 0x8C2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2D, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8C2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8C30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C31, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8C33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8C35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8C38, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3A,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3C, 0x0000, 0x0000, 0x8C3D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3E, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8C41, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8C45, 0x0000, 0x0000, 0x0000, 0x8C46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C47, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C48, 0x0000, 0x0000, 0x0000,

+    0x8C49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4A, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4B, 0x8C4C,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8C4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4E, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4F, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8C50, 0x0000, 0x8C51, 0x8C52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C53, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8C54, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C56, 0x0000,

+    0x0000, 0x0000, 0x8C57, 0x0000, 0x0000, 0x8C58, 0x0000, 0x0000, 0x8C59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8C5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5B, 0x0000, 0x0000, 0x8C5C, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5E, 0x0000, 0x8C5F, 0x0000, 0x8C60, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8C61, 0x0000, 0x0000, 0x8C62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C63,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C64, 0x0000, 0x0000, 0x8C65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C67, 0x0000, 0x0000, 0x0000, 0x8C68, 0x8C69, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6A, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6D, 0x0000, 0x0000, 0x8C6E, 0x8C6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8C70, 0x0000, 0x0000, 0x0000, 0x8C71, 0x0000, 0x8C72, 0x8C73, 0x0000, 0x0000, 0x8C74, 0x8C75, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C76, 0x0000, 0x0000, 0x8C77, 0x0000, 0x0000, 0x0000, 0x8C78, 0x0000,

+    0x0000, 0x0000, 0x8C79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7A, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7C,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7E, 0x8C7F, 0x0000, 0x0000, 0x8C80,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C82,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C83, 0x8C84, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C87,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C88, 0x0000, 0x8C89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8C8B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8C, 0x0000,

+    0x0000, 0x0000, 0x8C8D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8E, 0x0000, 0x0000, 0x0000, 0x8C8F,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8C90, 0x0000, 0x0000, 0x0000, 0x8C91, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C92, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8C93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C94, 0x0000, 0x0000, 0x8C95,

+    0x0000, 0x0000, 0x8C96, 0x0000, 0x0000, 0x0000, 0x8C97, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C98, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8C99, 0x0000, 0x0000, 0x0000, 0x8C9A, 0x8C9B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C9C, 0x0000, 0x0000,

+    0x8C9D, 0x8C9E, 0x0000, 0x0000, 0x8C9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA0,

+    0x0000, 0x0000, 0x0000, 0x8CA1, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8CA3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA4, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA5, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8CA7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA8, 0x0000, 0x8CA9, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAA, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAC, 0x8CAD, 0x0000, 0x0000,

+    0x0000, 0x8CAE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAF, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB1, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8CB3, 0x8CB4, 0x0000, 0x8CB5, 0x0000, 0x0000, 0x8CB6, 0x0000, 0x0000, 0x8CB7, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBA, 0x0000, 0x0000,

+    0x8CBB, 0x0000, 0x0000, 0x0000, 0x8CBC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBE,

+    0x0000, 0x0000, 0x8CBF, 0x0000, 0x8CC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CC1, 0x0000, 0x0000, 0x0000, 0x8CC2,

+    0x0000, 0x0000, 0x0000, 0x8CC3, 0x0000, 0x0000, 0x8CC4, 0x0000, 0x8CC5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8CC6, 0x0000, 0x0000, 0x0000, 0x8CC7, 0x8CC8, 0x0000, 0x0000, 0x0000, 0x8CC9, 0x0000, 0x8CCA, 0x0000, 0x0000, 0x8CCB,

+    0x0000, 0x0000, 0x8CCC, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CCD, 0x0000, 0x0000, 0x8CCE, 0x0000, 0x0000, 0x8CCF, 0x0000, 0x8CD0,

+    0x8CD1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8CD2, 0x0000, 0x8CD3, 0x0000, 0x8CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8CD5, 0x8CD6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CD7, 0x0000, 0x8CD8, 0x0000, 0x8CD9, 0x0000, 0x8CDA, 0x0000,

+    0x8CDB, 0x0000, 0x0000, 0x8CDC, 0x0000, 0x8CDD, 0x8CDE, 0x8CDF, 0x8CE0, 0x0000, 0x0000, 0x8CE1, 0x0000, 0x8CE2, 0x0000, 0x8CE3,

+    0x0000, 0x0000, 0x0000, 0x8CE4, 0x0000, 0x8CE5, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CE6, 0x0000, 0x0000, 0x8CE7, 0x0000, 0x0000,

+    0x0000, 0x8CE8, 0x0000, 0x0000, 0x8CE9, 0x0000, 0x8CEA, 0x0000, 0x0000, 0x0000, 0x8CEB, 0x0000, 0x8CEC, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8CED, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CEE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CEF, 0x0000,

+    0x8CF0, 0x0000, 0x8CF1, 0x0000, 0x8CF2, 0x8CF3, 0x0000, 0x0000, 0x8CF4, 0x0000, 0x0000, 0x8CF5, 0x0000, 0x0000, 0x8CF6, 0x0000,

+    0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x0000, 0x0000, 0x8CFB, 0x0000, 0x0000, 0x8CFC, 0x0000, 0x8CFD, 0x8CFE, 0x8CFF, 0x8D00, 0x0000,

+    0x8D01, 0x8D02, 0x8D03, 0x8D04, 0x0000, 0x8D05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D06, 0x0000, 0x0000, 0x8D07,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D0C, 0x8D0D, 0x0000, 0x0000,

+    0x0000, 0x8D0E, 0x8D0F, 0x0000, 0x0000, 0x8D10, 0x0000, 0x0000, 0x8D11, 0x0000, 0x8D12, 0x0000, 0x0000, 0x0000, 0x8D13, 0x0000,

+    0x8D14, 0x8D15, 0x0000, 0x8D16, 0x8D17, 0x8D18, 0x8D19, 0x0000, 0x8D1A, 0x0000, 0x8D1B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8D1C, 0x0000, 0x8D1D, 0x0000, 0x0000, 0x0000, 0x8D1E, 0x0000, 0x0000, 0x8D1F, 0x0000, 0x0000, 0x8D20, 0x0000, 0x0000, 0x8D21,

+    0x0000, 0x0000, 0x8D22, 0x0000, 0x8D23, 0x0000, 0x0000, 0x8D24, 0x0000, 0x8D25, 0x0000, 0x8D26, 0x0000, 0x8D27, 0x0000, 0x8D28,

+    0x0000, 0x8D29, 0x8D2A, 0x0000, 0x0000, 0x0000, 0x8D2B, 0x8D2C, 0x0000, 0x0000, 0x0000, 0x8D2D, 0x8D2E, 0x8D2F, 0x8D30, 0x0000,

+    0x0000, 0x8D31, 0x8D32, 0x0000, 0x8D33, 0x0000, 0x8D34, 0x8D35, 0x0000, 0x0000, 0x0000, 0x8D36, 0x0000, 0x8D37, 0x8D38, 0x0000,

+    0x0000, 0x8D39, 0x0000, 0x8D3A, 0x0000, 0x0000, 0x8D3B, 0x8D3C, 0x8D3D, 0x0000, 0x8D3E, 0x0000, 0x8D3F, 0x0000, 0x8D40, 0x0000,

+    0x8D41, 0x8D42, 0x8D43, 0x0000, 0x8D44, 0x8D45, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D46, 0x0000, 0x0000, 0x0000, 0x8D47, 0x0000,

+    0x8D48, 0x0000, 0x0000, 0x0000, 0x8D49, 0x0000, 0x8D4A, 0x8D4B, 0x0000, 0x8D4C, 0x0000, 0x8D4D, 0x0000, 0x8D4E, 0x0000, 0x0000,

+    0x8D4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D50, 0x0000, 0x0000, 0x8D51, 0x8D52, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8D53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D54, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D55, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D56, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D57, 0x8D58,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D59, 0x0000, 0x8D5A, 0x8D5B, 0x8D5C, 0x0000, 0x8D5D, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D5E, 0x0000, 0x0000, 0x0000, 0x8D5F,

+    0x8D60, 0x0000, 0x0000, 0x0000, 0x8D61, 0x0000, 0x0000, 0x8D62, 0x8D63, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D64, 0x8D65, 0x0000,

+    0x8D66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D67, 0x8D68, 0x0000, 0x0000, 0x8D69, 0x0000,

+    0x0000, 0x0000, 0x8D6A, 0x8D6B, 0x0000, 0x8D6C, 0x8D6D, 0x0000, 0x0000, 0x0000, 0x8D6E, 0x0000, 0x8D6F, 0x0000, 0x8D70, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D72, 0x0000,

+    0x8D73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D74, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8D76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D77, 0x8D78, 0x0000,

+    0x8D79, 0x8D7A, 0x8D7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D7C, 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D81, 0x0000, 0x0000, 0x8D82,

+    0x8D83, 0x0000, 0x8D84, 0x8D85, 0x8D86, 0x0000, 0x8D87, 0x8D88, 0x8D89, 0x0000, 0x8D8A, 0x8D8B, 0x8D8C, 0x8D8D, 0x0000, 0x8D8E,

+    0x8D8F, 0x8D90, 0x8D91, 0x8D92, 0x8D93, 0x8D94, 0x0000, 0x8D95, 0x8D96, 0x0000, 0x8D97, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8D98, 0x8D99, 0x8D9A, 0x0000, 0x8D9B, 0x0000, 0x0000, 0x0000, 0x8D9C, 0x8D9D, 0x0000, 0x8D9E, 0x0000, 0x8D9F, 0x0000,

+    0x8DA0, 0x8DA1, 0x8DA2, 0x8DA3, 0x8DA4, 0x0000, 0x8DA5, 0x8DA6, 0x0000, 0x0000, 0x8DA7, 0x0000, 0x8DA8, 0x8DA9, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8DAA, 0x8DAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8DB1, 0x8DB2, 0x0000, 0x8DB3, 0x8DB4, 0x0000, 0x8DB5, 0x0000, 0x0000, 0x8DB6, 0x0000, 0x8DB7,

+    0x8DB8, 0x0000, 0x0000, 0x8DB9, 0x8DBA, 0x0000, 0x8DBB, 0x8DBC, 0x0000, 0x0000, 0x0000, 0x8DBD, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DBE, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DBF, 0x0000, 0x0000, 0x0000, 0x8DC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8DC2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8DC3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8DC4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8DC5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC6, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8DC8, 0x0000, 0x0000, 0x8DC9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DCA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8DCB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DCC, 0x8DCD, 0x8DCE, 0x0000, 0x8DCF, 0x0000, 0x0000,

+    0x0000, 0x8DD0, 0x8DD1, 0x8DD2, 0x0000, 0x8DD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8DD5, 0x0000, 0x0000, 0x0000, 0x8DD6, 0x8DD7, 0x0000, 0x0000, 0x0000, 0x8DD8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8DD9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DDA, 0x8DDB, 0x8DDC, 0x8DDD, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8DDE, 0x0000, 0x8DDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE0, 0x0000, 0x0000, 0x0000, 0x8DE1,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE2, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8DE3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE4, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE8, 0x0000, 0x8DE9, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8DEA, 0x0000, 0x8DEB, 0x0000, 0x8DEC, 0x8DED, 0x8DEE, 0x8DEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8DF0, 0x0000, 0x8DF1, 0x8DF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF3, 0x8DF4, 0x8DF5, 0x8DF6, 0x8DF7,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF8, 0x8DF9, 0x0000, 0x0000, 0x8DFA, 0x8DFB, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DFC,

+    0x0000, 0x0000, 0x0000, 0x8DFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DFE, 0x0000, 0x0000, 0x8DFF, 0x0000, 0x0000, 0x8E00, 0x8E01,

+    0x8E02, 0x0000, 0x8E03, 0x0000, 0x8E04, 0x8E05, 0x8E06, 0x0000, 0x0000, 0x8E07, 0x0000, 0x0000, 0x0000, 0x8E08, 0x8E09, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8E0A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0B,

+    0x0000, 0x8E0C, 0x8E0D, 0x0000, 0x8E0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E10, 0x8E11, 0x8E12,

+    0x0000, 0x0000, 0x8E13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8E15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8E16, 0x8E17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E18, 0x8E19, 0x0000, 0x0000, 0x8E1A, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8E1B, 0x8E1C, 0x0000, 0x0000, 0x0000, 0x8E1D, 0x0000, 0x0000, 0x8E1E, 0x0000, 0x8E1F, 0x0000,

+    0x8E20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8E22, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E23, 0x8E24, 0x0000, 0x8E25, 0x0000, 0x8E26, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8E27, 0x0000, 0x0000, 0x8E28, 0x0000, 0x0000, 0x8E29, 0x0000, 0x0000, 0x8E2A, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2B,

+    0x8E2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2D,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2F, 0x0000, 0x0000, 0x8E30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8E31, 0x0000, 0x8E32, 0x0000, 0x8E33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E35, 0x0000, 0x0000,

+    0x8E36, 0x0000, 0x8E37, 0x0000, 0x8E38, 0x0000, 0x8E39, 0x0000, 0x0000, 0x0000, 0x8E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E3B, 0x8E3C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8E3D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E3E, 0x0000, 0x8E3F, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E40, 0x8E41, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8E42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8E43, 0x8E44, 0x0000, 0x8E45, 0x0000, 0x8E46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E47, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8E48, 0x8E49, 0x0000, 0x8E4A, 0x8E4B, 0x8E4C, 0x0000, 0x0000, 0x0000, 0x8E4D, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8E4E, 0x8E4F, 0x0000, 0x0000, 0x8E50, 0x0000, 0x8E51, 0x0000, 0x0000, 0x8E52, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E53, 0x0000, 0x8E54, 0x0000, 0x8E55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8E56, 0x8E57, 0x0000, 0x8E58, 0x8E59, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E5A, 0x0000, 0x0000, 0x0000, 0x8E5B, 0x0000, 0x0000,

+    0x8E5C, 0x8E5D, 0x0000, 0x0000, 0x8E5E, 0x8E5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E60, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8E61, 0x0000, 0x0000, 0x8E62, 0x8E63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E64, 0x0000,

+    0x8E65, 0x0000, 0x0000, 0x8E66, 0x8E67, 0x0000, 0x0000, 0x8E68, 0x8E69, 0x8E6A, 0x8E6B, 0x0000, 0x0000, 0x8E6C, 0x8E6D, 0x8E6E,

+    0x8E6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E70, 0x0000, 0x0000, 0x8E71, 0x8E72, 0x0000, 0x8E73, 0x0000, 0x8E74, 0x0000, 0x0000,

+    0x0000, 0x8E75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E76, 0x0000, 0x0000, 0x8E77, 0x8E78, 0x0000, 0x0000, 0x8E79, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8E7A, 0x0000, 0x8E7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7C, 0x8E7D, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7E, 0x0000, 0x8E7F, 0x0000, 0x8E80, 0x8E81, 0x0000, 0x0000, 0x0000, 0x8E82,

+    0x8E83, 0x0000, 0x0000, 0x8E84, 0x0000, 0x8E85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E86, 0x0000, 0x0000,

+    0x0000, 0x8E87, 0x0000, 0x8E88, 0x0000, 0x0000, 0x8E89, 0x0000, 0x8E8A, 0x0000, 0x8E8B, 0x8E8C, 0x8E8D, 0x0000, 0x0000, 0x0000,

+    0x8E8E, 0x0000, 0x0000, 0x8E8F, 0x0000, 0x8E90, 0x8E91, 0x0000, 0x8E92, 0x0000, 0x8E93, 0x8E94, 0x8E95, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8E96, 0x0000, 0x0000, 0x0000, 0x8E97, 0x0000, 0x8E98, 0x0000, 0x8E99, 0x8E9A, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8E9B, 0x0000, 0x8E9C, 0x0000, 0x8E9D, 0x0000, 0x8E9E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E9F, 0x0000, 0x0000, 0x8EA0,

+    0x0000, 0x0000, 0x8EA1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EA2, 0x0000, 0x8EA3,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8EA4, 0x8EA5, 0x8EA6, 0x0000, 0x8EA7, 0x8EA8, 0x8EA9, 0x0000, 0x0000, 0x0000, 0x8EAA, 0x8EAB,

+    0x8EAC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EAD, 0x0000, 0x0000, 0x0000, 0x8EAE, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8EAF, 0x0000, 0x0000, 0x8EB0, 0x0000, 0x8EB1, 0x0000, 0x8EB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EB3,

+    0x8EB4, 0x0000, 0x8EB5, 0x0000, 0x0000, 0x8EB6, 0x0000, 0x0000, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBA, 0x0000, 0x0000, 0x0000, 0x8EBB,

+    0x8EBC, 0x8EBD, 0x8EBE, 0x0000, 0x0000, 0x0000, 0x8EBF, 0x0000, 0x8EC0, 0x8EC1, 0x0000, 0x8EC2, 0x0000, 0x0000, 0x8EC3, 0x8EC4,

+    0x0000, 0x0000, 0x0000, 0x8EC5, 0x0000, 0x0000, 0x8EC6, 0x0000, 0x8EC7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8EC8, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EC9, 0x8ECA, 0x0000, 0x0000, 0x8ECB, 0x8ECC, 0x0000, 0x8ECD, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8ECE, 0x0000, 0x0000, 0x0000, 0x8ECF, 0x0000, 0x8ED0, 0x8ED1, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8ED2, 0x0000, 0x0000, 0x0000, 0x8ED3, 0x8ED4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ED5, 0x0000, 0x0000, 0x0000,

+    0x8ED6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ED7, 0x8ED8, 0x0000, 0x0000, 0x0000, 0x8ED9, 0x0000, 0x0000, 0x0000, 0x8EDA, 0x0000,

+    0x0000, 0x0000, 0x8EDB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EDC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8EDD, 0x0000, 0x8EDE, 0x0000, 0x8EDF, 0x0000, 0x0000, 0x8EE0, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8EE1, 0x8EE2, 0x8EE3, 0x0000, 0x0000, 0x8EE4, 0x8EE5, 0x0000, 0x8EE6, 0x8EE7, 0x0000, 0x8EE8, 0x0000, 0x8EE9, 0x0000,

+    0x8EEA, 0x0000, 0x0000, 0x8EEB, 0x0000, 0x8EEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8EED, 0x0000, 0x0000, 0x0000, 0x8EEE, 0x8EEF, 0x0000, 0x0000, 0x0000, 0x8EF0, 0x8EF1, 0x0000, 0x0000,

+    0x8EF2, 0x8EF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EF4, 0x8EF5, 0x0000, 0x0000, 0x0000, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9,

+    0x0000, 0x8EFA, 0x8EFB, 0x0000, 0x8EFC, 0x0000, 0x0000, 0x0000, 0x8EFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8EFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EFF, 0x0000, 0x0000, 0x0000, 0x8F00, 0x0000, 0x0000, 0x0000, 0x8F01, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8F02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8F03, 0x0000, 0x0000, 0x8F04, 0x8F05, 0x0000, 0x0000, 0x0000, 0x8F06, 0x8F07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F08, 0x8F09, 0x0000, 0x0000, 0x8F0A, 0x0000, 0x0000, 0x8F0B, 0x0000,

+    0x0000, 0x0000, 0x8F0C, 0x8F0D, 0x0000, 0x8F0E, 0x8F0F, 0x0000, 0x8F10, 0x0000, 0x8F11, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F12,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x8F13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F14, 0x0000, 0x8F15, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8F16, 0x0000, 0x0000, 0x0000, 0x8F17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F18, 0x0000,

+    0x8F19, 0x0000, 0x0000, 0x8F1A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F1B, 0x0000, 0x0000,

+    0x8F1C, 0x8F1D, 0x8F1E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F1F, 0x0000, 0x8F20, 0x0000, 0x0000, 0x8F21, 0x8F22, 0x8F23, 0x8F24,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8F26, 0x0000, 0x8F27, 0x8F28, 0x0000, 0x0000, 0x8F29, 0x0000, 0x8F2A, 0x8F2B, 0x0000, 0x8F2C, 0x8F2D, 0x0000, 0x8F2E, 0x8F2F,

+    0x0000, 0x0000, 0x8F30, 0x8F31, 0x8F32, 0x0000, 0x0000, 0x0000, 0x8F33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8F34, 0x0000, 0x8F35, 0x0000, 0x8F36, 0x0000, 0x0000, 0x8F37, 0x8F38, 0x0000, 0x8F39, 0x8F3A, 0x8F3B, 0x0000, 0x0000,

+    0x0000, 0x8F3C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F3D, 0x0000, 0x0000, 0x8F3E, 0x0000, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43,

+    0x0000, 0x0000, 0x0000, 0x8F44, 0x0000, 0x0000, 0x8F45, 0x8F46, 0x8F47, 0x0000, 0x8F48, 0x8F49, 0x8F4A, 0x0000, 0x0000, 0x0000,

+    0x8F4B, 0x0000, 0x8F4C, 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F51, 0x0000, 0x8F52, 0x0000,

+    0x8F53, 0x8F54, 0x8F55, 0x0000, 0x8F56, 0x8F57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F58, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F59, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8F5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8F5B, 0x0000, 0x0000, 0x8F5C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5E, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5F, 0x8F60, 0x0000, 0x0000, 0x0000, 0x8F61, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F63, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F64, 0x0000, 0x8F65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8F66, 0x0000, 0x0000, 0x8F67, 0x0000, 0x0000, 0x0000, 0x8F68, 0x0000, 0x0000, 0x8F69, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F6A, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F6B, 0x0000, 0x0000, 0x8F6C, 0x0000, 0x8F6D, 0x8F6E, 0x0000, 0x8F6F, 0x0000,

+    0x0000, 0x0000, 0x8F70, 0x8F71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8F72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F73, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8F74, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F76, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8F77, 0x0000, 0x8F78, 0x0000, 0x8F79, 0x0000, 0x8F7A, 0x8F7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F7C, 0x0000, 0x8F7D, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F7E, 0x0000, 0x8F7F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x8F80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F81,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F82, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8F83, 0x0000, 0x8F84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F85, 0x0000, 0x8F86, 0x8F87, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x8F88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F89, 0x0000, 0x0000, 0x8F8A, 0x0000, 0x8F8B, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F8C, 0x0000, 0x0000, 0x0000, 0x8F8D,

+    0x0000, 0x8F8E, 0x8F8F, 0x8F90, 0x0000, 0x8F91, 0x8F92, 0x8F93, 0x8F94, 0x0000, 0x8F95, 0x0000, 0x8F96, 0x0000, 0x8F97, 0x8F98,

+    0x8F99, 0x8F9A, 0x8F9B, 0x8F9C, 0x0000, 0x0000, 0x0000, 0x8F9D, 0x8F9E, 0x0000, 0x0000, 0x0000, 0x8F9F, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8FA0, 0x0000, 0x0000, 0x8FA1, 0x0000, 0x8FA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FA3, 0x0000, 0x0000,

+    0x8FA4, 0x0000, 0x8FA5, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FA6, 0x8FA7, 0x8FA8, 0x0000, 0x8FA9, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FAA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FAB, 0x8FAC, 0x8FAD, 0x8FAE,

+    0x0000, 0x0000, 0x8FAF, 0x8FB0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FB1, 0x8FB2, 0x0000, 0x8FB3, 0x0000, 0x0000, 0x8FB4, 0x0000,

+    0x0000, 0x0000, 0x8FB5, 0x0000, 0x0000, 0x8FB6, 0x0000, 0x8FB7, 0x0000, 0x0000, 0x0000, 0x8FB8, 0x8FB9, 0x0000, 0x0000, 0x8FBA,

+    0x8FBB, 0x8FBC, 0x0000, 0x8FBD, 0x8FBE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FC0, 0x8FC1, 0x8FC2,

+    0x0000, 0x8FC3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FC4, 0x0000, 0x8FC5, 0x0000, 0x8FC6, 0x8FC7, 0x8FC8, 0x0000, 0x0000, 0x0000,

+    0x8FC9, 0x0000, 0x0000, 0x0000, 0x8FCA, 0x0000, 0x8FCB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FCC, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8FCD, 0x8FCE, 0x0000, 0x8FCF, 0x0000, 0x0000, 0x0000, 0x8FD0, 0x8FD1, 0x8FD2, 0x0000, 0x8FD3, 0x0000, 0x8FD4,

+    0x0000, 0x0000, 0x8FD5, 0x0000, 0x8FD6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FD7, 0x8FD8, 0x8FD9, 0x8FDA,

+    0x0000, 0x0000, 0x0000, 0x8FDB, 0x8FDC, 0x8FDD, 0x0000, 0x0000, 0x0000, 0x8FDE, 0x8FDF, 0x0000, 0x8FE0, 0x0000, 0x8FE1, 0x0000,

+    0x0000, 0x8FE2, 0x8FE3, 0x8FE4, 0x0000, 0x0000, 0x8FE5, 0x0000, 0x8FE6, 0x0000, 0x8FE7, 0x8FE8, 0x8FE9, 0x0000, 0x8FEA, 0x0000,

+    0x0000, 0x8FEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x8FED, 0x0000, 0x8FEE, 0x0000, 0x8FEF, 0x8FF0, 0x0000, 0x0000, 0x0000, 0x8FF1, 0x0000, 0x8FF2, 0x0000, 0x8FF3, 0x8FF4,

+    0x0000, 0x8FF5, 0x0000, 0x8FF6, 0x0000, 0x8FF7, 0x0000, 0x0000, 0x8FF8, 0x8FF9, 0x0000, 0x8FFA, 0x8FFB, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x8FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FFE, 0x0000, 0x8FFF, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9001, 0x9002, 0x0000,

+    0x0000, 0x9003, 0x0000, 0x9004, 0x9005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x9006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x9007, 0x9008, 0x9009, 0x0000, 0x900A, 0x900B, 0x0000, 0x0000, 0x900C, 0x900D, 0x0000, 0x900E, 0x0000, 0x900F, 0x0000, 0x9010,

+    0x0000, 0x0000, 0x9011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9012, 0x0000, 0x0000,

+    0x9013, 0x9014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9015, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9016,

+    0x0000, 0x9017, 0x9018, 0x0000, 0x0000, 0x9019, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x901A, 0x901B, 0x901C,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x901D, 0x0000, 0x0000, 0x901E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x901F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9020, 0x0000, 0x9021, 0x9022, 0x0000,

+    0x9023, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9024, 0x9025, 0x9026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9027, 0x0000,

+    0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x902D, 0x0000, 0x0000, 0x0000, 0x0000, 0x902E, 0x0000, 0x902F, 0x9030, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9031, 0x0000, 0x9032, 0x0000, 0x0000, 0x9033, 0x9034, 0x0000, 0x0000, 0x0000, 0x9035,

+    0x0000, 0x0000, 0x9036, 0x0000, 0x9037, 0x9038, 0x9039, 0x0000, 0x0000, 0x0000, 0x903A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x903B,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x903C,

+    0x0000, 0x0000, 0x903D, 0x0000, 0x903E, 0x903F, 0x9040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9041, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9043, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x9044, 0x0000, 0x0000, 0x9045, 0x0000, 0x9046, 0x0000, 0x9047, 0x0000, 0x0000, 0x0000, 0x0000, 0x9048, 0x0000,

+    0x0000, 0x9049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904A, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904B, 0x0000, 0x904C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904E,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x904F, 0x0000, 0x0000, 0x9050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x9051, 0x0000, 0x9052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9053, 0x9054, 0x0000,

+    0x9055, 0x9056, 0x9057, 0x9058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9059, 0x0000, 0x0000, 0x0000, 0x905A, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x905B, 0x0000, 0x0000, 0x0000, 0x905C, 0x905D, 0x0000, 0x905E, 0x905F, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x9060, 0x9061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9062, 0x0000, 0x9063, 0x9064, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x9065, 0x9066, 0x9067, 0x9068, 0x0000, 0x0000, 0x0000, 0x9069, 0x0000, 0x906A, 0x0000, 0x0000,

+    0x0000, 0x906B, 0x906C, 0x0000, 0x906D, 0x0000, 0x0000, 0x906E, 0x906F, 0x0000, 0x9070, 0x9071, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x9072, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9073, 0x0000, 0x9074,

+    0x0000, 0x0000, 0x9075, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9076, 0x9077, 0x0000, 0x0000, 0x0000, 0x9078, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x9079, 0x907A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x907B, 0x0000, 0x0000, 0x907C,

+    0x0000, 0x0000, 0x0000, 0x907D, 0x0000, 0x907E, 0x0000, 0x0000, 0x907F, 0x9080, 0x0000, 0x0000, 0x0000, 0x9081, 0x9082, 0x0000,

+    0x0000, 0x9083, 0x9084, 0x0000, 0x0000, 0x0000, 0x0000, 0x9085, 0x0000, 0x9086, 0x9087, 0x9088, 0x0000, 0x0000, 0x9089, 0x0000,

+    0x0000, 0x0000, 0x908A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x908B, 0x908C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x908D, 0x0000, 0x908E, 0x0000, 0x908F, 0x9090, 0x9091, 0x0000, 0x0000, 0x0000, 0x0000, 0x9092, 0x0000, 0x9093,

+    0x9094, 0x0000, 0x0000, 0x9095, 0x0000, 0x0000, 0x0000, 0x9096, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9097, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9098, 0x9099, 0x0000, 0x909A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x909B, 0x0000, 0x909C, 0x0000, 0x909D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x909E, 0x909F, 0x90A0, 0x0000, 0x90A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90A2, 0x90A3, 0x0000, 0x90A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x90A5, 0x0000, 0x0000, 0x90A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90A7, 0x0000, 0x90A8, 0x90A9, 0x90AA,

+    0x0000, 0x0000, 0x0000, 0x90AB, 0x0000, 0x0000, 0x90AC, 0x0000, 0x90AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90AE,

+    0x90AF, 0x0000, 0x0000, 0x0000, 0x90B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90B1, 0x0000, 0x0000, 0x0000, 0x90B2,

+    0x0000, 0x0000, 0x90B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x90B4, 0x90B5, 0x90B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90B7, 0x90B8, 0x0000, 0x0000,

+    0x90B9, 0x90BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90BB, 0x0000, 0x90BC, 0x0000, 0x0000, 0x90BD,

+    0x0000, 0x0000, 0x90BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x90BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90C0, 0x0000, 0x90C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x90C2, 0x0000, 0x0000, 0x90C3, 0x0000, 0x90C4, 0x0000, 0x90C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x90C6, 0x0000, 0x0000, 0x90C7, 0x90C8, 0x0000, 0x0000, 0x0000, 0x90C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90CA,

+    0x0000, 0x0000, 0x90CB, 0x0000, 0x90CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x90CD, 0x90CE, 0x90CF, 0x90D0, 0x0000, 0x0000, 0x90D1,

+    0x0000, 0x90D2, 0x90D3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x90D4, 0x0000, 0x0000, 0x90D5, 0x90D6, 0x0000, 0x90D7, 0x90D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90D9, 0x90DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x90DB, 0x0000, 0x0000, 0x0000, 0x90DC,

+    0x0000, 0x0000, 0x90DD, 0x0000, 0x90DE, 0x0000, 0x0000, 0x0000, 0x90DF, 0x90E0, 0x90E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E3, 0x0000, 0x0000, 0x90E4, 0x0000, 0x90E5, 0x90E6, 0x0000, 0x90E7, 0x90E8, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x90EA, 0x0000, 0x90EB, 0x90EC, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90EE, 0x0000, 0x0000, 0x0000, 0x90EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x90F0, 0x90F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F2, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x90F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F4, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F5, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x90F7, 0x0000, 0x90F8, 0x90F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FA, 0x0000, 0x90FB,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x90FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FE, 0x90FF, 0x0000, 0x0000, 0x9100, 0x9101,

+    0x0000, 0x0000, 0x9102, 0x0000, 0x9103, 0x9104, 0x0000, 0x0000, 0x0000, 0x9105, 0x0000, 0x0000, 0x9106, 0x0000, 0x0000, 0x9107,

+    0x9108, 0x9109, 0x0000, 0x0000, 0x0000, 0x0000, 0x910A, 0x0000, 0x0000, 0x0000, 0x910B, 0x0000, 0x910C, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x910D, 0x0000, 0x0000, 0x0000, 0x0000, 0x910E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x910F, 0x9110, 0x0000,

+    0x9111, 0x0000, 0x0000, 0x0000, 0x9112, 0x9113, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9114, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x9115, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x9116, 0x9117, 0x9118, 0x9119, 0x911A, 0x911B, 0x911C, 0x911D, 0x911E, 0x911F, 0x9120, 0x9121, 0x9122, 0x9123, 0x9124, 0x9125,

+    0x9126, 0x9127, 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, 0x912F, 0x9130, 0x9131, 0x9132, 0x9133, 0x9134, 0x9135,

+    0x9136, 0x9137, 0x9138, 0x9139, 0x913A, 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, 0x9143, 0x9144, 0x9145,

+    0x9146, 0x9147, 0x9148, 0x9149, 0x914A, 0x914B, 0x914C, 0x914D, 0x914E, 0x914F, 0x9150, 0x9151, 0x9152, 0x9153, 0x9154, 0x9155,

+    0x9156, 0x9157, 0x9158, 0x9159, 0x915A, 0x915B, 0x915C, 0x915D, 0x915E, 0x915F, 0x9160, 0x9161, 0x9162, 0x9163, 0x9164, 0x9165,

+    0x9166, 0x9167, 0x9168, 0x9169, 0x916A, 0x916B, 0x916C, 0x916D, 0x916E, 0x916F, 0x9170, 0x9171, 0x9172, 0x9173, 0x9174, 0x9175,

+    0x9176, 0x9177, 0x9178, 0x9179, 0x917A, 0x917B, 0x917C, 0x917D, 0x917E, 0x917F, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9185,

+    0x9186, 0x9187, 0x9188, 0x9189, 0x918A, 0x918B, 0x918C, 0x918D, 0x918E, 0x918F, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195,

+    0x9196, 0x9197, 0x9198, 0x9199, 0x919A, 0x919B, 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A2, 0x91A3, 0x91A4, 0x91A5,

+    0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AA, 0x91AB, 0x91AC, 0x91AD, 0x91AE, 0x91AF, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B4, 0x91B5,

+    0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BA, 0x91BB, 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, 0x91C4, 0x91C5,

+    0x91C6, 0x91C7, 0x91C8, 0x91C9, 0x91CA, 0x91CB, 0x91CC, 0x91CD, 0x91CE, 0x91CF, 0x91D0, 0x91D1, 0x91D2, 0x91D3, 0x91D4, 0x91D5,

+    0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, 0x91DC, 0x91DD, 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, 0x91E5,

+    0x91E6, 0x91E7, 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5,

+    0x91F6, 0x91F7, 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205,

+    0x9206, 0x9207, 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D, 0x920E, 0x920F, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215,

+    0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, 0x921E, 0x921F, 0x9220, 0x9221, 0x9222, 0x9223, 0x0000, 0x0000,

+    0x9224, 0x0000, 0x9225, 0x0000, 0x0000, 0x9226, 0x9227, 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, 0x922D, 0x922E, 0x922F, 0x0000,

+    0x9230, 0x0000, 0x9231, 0x0000, 0x0000, 0x9232, 0x9233, 0x0000, 0x0000, 0x0000, 0x9234, 0x9235, 0x9236, 0x9237, 0x0000, 0x0000,

+    0x9238, 0x9239, 0x923A, 0x923B, 0x923C, 0x923D, 0x923E, 0x923F, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x9246, 0x9247,

+    0x9248, 0x9249, 0x924A, 0x924B, 0x924C, 0x924D, 0x924E, 0x924F, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257,

+    0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D, 0x925E, 0x925F, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267,

+    0x9268, 0x9269, 0x926A, 0x926B, 0x926C, 0x926D, 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, 0x9273, 0x0000, 0x9274, 0x0000, 0x0000,

+    0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927A, 0x927B, 0x927C, 0x927D, 0x927E, 0x927F, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284,

+    0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, 0x928D, 0x928E, 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294,

+    0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, 0x929D, 0x929E, 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, 0x92A4,

+    0x92A5, 0x92A6, 0x92A7, 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AE, 0x92AF, 0x92B0, 0x92B1, 0x92B2, 0x92B3, 0x92B4,

+    0x92B5, 0x92B6, 0x92B7, 0x92B8, 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C4,

+    0x92C5, 0x92C6, 0x92C7, 0x92C8, 0x92C9, 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, 0x92D2, 0x92D3, 0x0000,

+    0x0000, 0x0000, 0x92D4, 0x92D5, 0x92D6, 0x0000, 0x0000, 0x0000, 0x92D7, 0x92D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x23AC, 0x23AE, 0x23B0, 0x3312, 0x3315, 0x23B2, 0x23B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x23B6, 0x23B8, 0x23BA, 0x23BC, 0x23BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23C0, 0x0000, 0x23C2,

+    0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, 0x92E1, 0x92E2, 0x23C4, 0x23C6, 0x23C8, 0x23CA, 0x23CC, 0x23CE,

+    0x23D0, 0x23D2, 0x23D4, 0x23D6, 0x23D8, 0x23DA, 0x23DC, 0x0000, 0x23DE, 0x23E0, 0x23E2, 0x23E4, 0x23E6, 0x0000, 0x23E8, 0x0000,

+    0x23EA, 0x23EC, 0x0000, 0x23EE, 0x23F0, 0x0000, 0x23F2, 0x23F4, 0x23F6, 0x23F8, 0x23FA, 0x23FC, 0x23FE, 0x2400, 0x2402, 0x2404,

+    0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8, 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, 0x92F1, 0x92F2,

+    0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, 0x9300, 0x9301, 0x9302,

+    0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309, 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, 0x9312,

+    0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321, 0x9322,

+    0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331, 0x9332,

+    0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, 0x933A, 0x933B, 0x933C, 0x933D, 0x933E, 0x933F, 0x9340, 0x9341, 0x9342,

+    0x9343, 0x9344, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934A, 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351,

+    0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935A, 0x935B, 0x2406, 0x2408, 0x240A, 0x240C, 0x240E, 0x2410,

+    0x2412, 0x2414, 0x2416, 0x2418, 0x241A, 0x241C, 0x241E, 0x2420, 0x2422, 0x2424, 0x2426, 0x2428, 0x935C, 0x935D, 0x935E, 0x935F,

+    0x242A, 0x242C, 0x242E, 0x2430, 0x2432, 0x2434, 0x2436, 0x2438, 0x243A, 0x243C, 0x243E, 0x2440, 0x2442, 0x2444, 0x2446, 0x2448,

+    0x244A, 0x244C, 0x244E, 0x2450, 0x2452, 0x2454, 0x2456, 0x2458, 0x245A, 0x245C, 0x245E, 0x2460, 0x2462, 0x2464, 0x2466, 0x2468,

+    0x246A, 0x246C, 0x246E, 0x2470, 0x2472, 0x2474, 0x2476, 0x2478, 0x247A, 0x247C, 0x247E, 0x2480, 0x2482, 0x2484, 0x2486, 0x2488,

+    0x248A, 0x248C, 0x248E, 0x2490, 0x2492, 0x2494, 0x2496, 0x2498, 0x249A, 0x249C, 0x249E, 0x24A0, 0x24A2, 0x24A4, 0x24A6, 0x24A8,

+    0x24AA, 0x24AC, 0x24AE, 0x24B0, 0x24B2, 0x24B4, 0x24B6, 0x24B8, 0x24BA, 0x24BC, 0x24BE, 0x24C0, 0x24C2, 0x24C4, 0x24C6, 0x24C8,

+    0x24CA, 0x24CC, 0x24CE, 0x24D0, 0x24D2, 0x24D4, 0x24D6, 0x24D8, 0x24DA, 0x24DC, 0x24DE, 0x24E0, 0x24E2, 0x24E4, 0x24E6, 0x24E8,

+    0x24EA, 0x24EC, 0x24EE, 0x24F0, 0x24F2, 0x24F4, 0x24F6, 0x24F8, 0x24FA, 0x24FC, 0x24FE, 0x2500, 0x2502, 0x2504, 0x2506, 0x2508,

+    0x250A, 0x250C, 0x250E, 0x2510, 0x2512, 0x2514, 0x2516, 0x2518, 0x251A, 0x251C, 0x251E, 0x2520, 0x2522, 0x2524, 0x2526, 0x2528,

+    0x252A, 0x252C, 0x252E, 0x2530, 0x2532, 0x2534, 0x2536, 0x2538, 0x253A, 0x253C, 0x253E, 0x2540, 0x2542, 0x2544, 0x2546, 0x2548,

+    0x254A, 0x254C, 0x254E, 0x2550, 0x2552, 0x2554, 0x2556, 0x2558, 0x255A, 0x255C, 0x255E, 0x2560, 0x2562, 0x2564, 0x2566, 0x2568,

+    0x256A, 0x256C, 0x256E, 0x2570, 0x2572, 0x2574, 0x2576, 0x2578, 0x257A, 0x257C, 0x257E, 0x2580, 0x2582, 0x2584, 0x2586, 0x2588,

+    0x258A, 0x258C, 0x258E, 0x2590, 0x2592, 0x2594, 0x2596, 0x2598, 0x259A, 0x259C, 0x259E, 0x25A0, 0x25A2, 0x25A4, 0x25A6, 0x25A8,

+    0x25AA, 0x25AC, 0x25AE, 0x25B0, 0x25B2, 0x25B4, 0x25B6, 0x25B8, 0x25BA, 0x25BC, 0x25BE, 0x25C0, 0x25C2, 0x25C4, 0x25C6, 0x25C8,

+    0x25CA, 0x25CC, 0x25CE, 0x25D0, 0x25D2, 0x25D4, 0x25D6, 0x25D8, 0x25DA, 0x25DC, 0x25DE, 0x25E0, 0x25E2, 0x25E4, 0x25E6, 0x25E8,

+    0x25EA, 0x25EC, 0x25EE, 0x25F0, 0x25F2, 0x25F4, 0x25F6, 0x25F8, 0x25FA, 0x25FC, 0x25FE, 0x2600, 0x2602, 0x2604, 0x2606, 0x2608,

+    0x260A, 0x260C, 0x3318, 0x331B, 0x331E, 0x260E, 0x2610, 0x2612, 0x2614, 0x2616, 0x2618, 0x261A, 0x261C, 0x261E, 0x2620, 0x2622,

+    0x2624, 0x2626, 0x2628, 0x262A, 0x262C, 0x262E, 0x2630, 0x2632, 0x2634, 0x2636, 0x2638, 0x263A, 0x263C, 0x263E, 0x2640, 0x2642,

+    0x2644, 0x2646, 0x2648, 0x264A, 0x264C, 0x264E, 0x2650, 0x2652, 0x2654, 0x2656, 0x2658, 0x265A, 0x265C, 0x265E, 0x2660, 0x2662,

+    0x2664, 0x2666, 0x2668, 0x266A, 0x266C, 0x266E, 0x2670, 0x2672, 0x2674, 0x2676, 0x2678, 0x267A, 0x267C, 0x267E, 0x2680, 0x2682,

+    0x2684, 0x2686, 0x2688, 0x268A, 0x268C, 0x268E, 0x2690, 0x2692, 0x2694, 0x2696, 0x2698, 0x269A, 0x269C, 0x269E, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x3321, 0x3324, 0x3327, 0x332A, 0x332D, 0x3330, 0x3333, 0x3336, 0x3339, 0x333C, 0x333F, 0x3342, 0x3345, 0x3348, 0x334B, 0x334E,

+    0x3351, 0x3354, 0x3357, 0x335A, 0x335D, 0x3360, 0x3363, 0x3366, 0x3369, 0x336C, 0x336F, 0x3372, 0x3375, 0x3378, 0x337B, 0x337E,

+    0x3381, 0x3384, 0x3387, 0x338A, 0x338D, 0x3390, 0x3393, 0x3396, 0x3399, 0x339C, 0x339F, 0x33A2, 0x33A5, 0x33A8, 0x33AB, 0x33AE,

+    0x33B1, 0x33B4, 0x33B7, 0x33BA, 0x33BD, 0x33C0, 0x33C3, 0x33C6, 0x33C9, 0x33CC, 0x33CF, 0x33D2, 0x33D5, 0x33D8, 0x33DB, 0x33DE,

+    0x0000, 0x0000, 0x33E1, 0x33E4, 0x33E7, 0x33EA, 0x33ED, 0x33F0, 0x33F3, 0x33F6, 0x33F9, 0x33FC, 0x33FF, 0x3402, 0x3405, 0x3408,

+    0x340B, 0x340E, 0x3411, 0x3414, 0x3417, 0x341A, 0x341D, 0x3420, 0x3423, 0x3426, 0x3429, 0x342C, 0x342F, 0x3432, 0x3435, 0x3438,

+    0x343B, 0x343E, 0x3441, 0x3444, 0x3447, 0x344A, 0x344D, 0x3450, 0x3453, 0x3456, 0x3459, 0x345C, 0x345F, 0x3462, 0x3465, 0x3468,

+    0x346B, 0x346E, 0x3471, 0x3474, 0x3477, 0x347A, 0x347D, 0x3480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x3483, 0x3486, 0x41A4, 0x41A9, 0x41AE, 0x41B3, 0x41B8, 0x41BD, 0x41C2, 0x3489, 0x41C7, 0x41DA, 0x41E3, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x936A, 0x936B, 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379,

+    0x937A, 0x937B, 0x937C, 0x937D, 0x937E, 0x0000, 0x0000, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387,

+    0x9388, 0x9389, 0x938A, 0x0000, 0x938B, 0x938C, 0x938D, 0x938E, 0x938F, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396,

+    0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, 0x939D, 0x0000, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x0000, 0x0000, 0x0000, 0x0000,

+    0x93A2, 0x26A0, 0x93A3, 0x0000, 0x93A4, 0x0000, 0x93A5, 0x26A2, 0x93A6, 0x26A4, 0x93A7, 0x26A6, 0x93A8, 0x26A8, 0x93A9, 0x26AA,

+    0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3, 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9,

+    0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C8, 0x93C9,

+    0x93CA, 0x93CB, 0x93CC, 0x93CD, 0x93CE, 0x93CF, 0x93D0, 0x93D1, 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D6, 0x93D7, 0x93D8, 0x93D9,

+    0x93DA, 0x93DB, 0x93DC, 0x93DD, 0x93DE, 0x93DF, 0x93E0, 0x93E1, 0x93E2, 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0x93E7, 0x93E8, 0x93E9,

+    0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0x93F7, 0x93F8, 0x93F9,

+    0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409,

+    0x940A, 0x940B, 0x940C, 0x940D, 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419,

+    0x941A, 0x941B, 0x941C, 0x941D, 0x941E, 0x26AC, 0x26AE, 0x26B0, 0x26B2, 0x26B4, 0x26B6, 0x26B8, 0x26BA, 0x0000, 0x0000, 0x0000,

+    0x0000, 0x941F, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, 0x942B, 0x942C, 0x942D,

+    0x942E, 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, 0x943D,

+    0x943E, 0x943F, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D,

+    0x944E, 0x944F, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D,

+    0x945E, 0x945F, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946A, 0x946B, 0x946C, 0x946D,

+    0x946E, 0x946F, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D,

+    0x947E, 0x947F, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488, 0x9489, 0x948A, 0x948B, 0x948C, 0x948D,

+    0x948E, 0x948F, 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, 0x949A, 0x949B, 0x949C, 0x949D,

+    0x949E, 0x949F, 0x94A0, 0x94A1, 0x94A2, 0x94A3, 0x94A4, 0x94A5, 0x94A6, 0x94A7, 0x94A8, 0x94A9, 0x94AA, 0x94AB, 0x94AC, 0x94AD,

+    0x94AE, 0x94AF, 0x94B0, 0x94B1, 0x94B2, 0x94B3, 0x94B4, 0x94B5, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC, 0x94BD,

+    0x94BE, 0x94BF, 0x94C0, 0x94C1, 0x94C2, 0x94C3, 0x94C4, 0x94C5, 0x94C6, 0x94C7, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD,

+    0x94CE, 0x94CF, 0x94D0, 0x94D1, 0x94D2, 0x94D3, 0x94D4, 0x94D5, 0x94D6, 0x94D7, 0x94D8, 0x94D9, 0x94DA, 0x94DB, 0x94DC, 0x0000,

+    0x0000, 0x0000, 0x94DD, 0x94DE, 0x94DF, 0x94E0, 0x94E1, 0x94E2, 0x0000, 0x0000, 0x94E3, 0x94E4, 0x94E5, 0x94E6, 0x94E7, 0x94E8,

+    0x0000, 0x0000, 0x94E9, 0x94EA, 0x94EB, 0x94EC, 0x94ED, 0x94EE, 0x0000, 0x0000, 0x94EF, 0x94F0, 0x94F1, 0x0000, 0x0000, 0x0000,

+    0x94F2, 0x94F3, 0x94F4, 0x94F5, 0x94F6, 0x94F7, 0x94F8, 0x0000, 0x94F9, 0x94FA, 0x94FB, 0x94FC, 0x94FD, 0x94FE, 0x94FF, 0x0000,

+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000

+};

+extern const FX_WCHAR g_UnicodeData_Normalization_Map1[5376] = {

+    0x0066, 0x0053, 0x0053, 0x0059, 0x0020, 0x0308, 0x0061, 0x0052, 0x0304, 0x0032, 0x0033, 0x0301, 0x03BC, 0x0327, 0x0031, 0x006F,

+    0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0043, 0x0045, 0x0045, 0x0045, 0x0045, 0x0049, 0x0049, 0x0049, 0x0049, 0x0044,

+    0x004E, 0x004F, 0x004F, 0x004F, 0x004F, 0x004F, 0x004F, 0x0055, 0x0055, 0x0055, 0x0055, 0x0059, 0x0061, 0x0061, 0x0061, 0x0061,

+    0x0061, 0x0061, 0x0063, 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0069, 0x0069, 0x0069, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F,

+    0x006F, 0x006F, 0x0075, 0x0075, 0x0075, 0x0075, 0x0079, 0x0079, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0043, 0x0063,

+    0x0043, 0x0063, 0x0043, 0x0063, 0x0043, 0x0063, 0x0044, 0x0064, 0x0044, 0x0064, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065,

+    0x0045, 0x0065, 0x0045, 0x0065, 0x0047, 0x0067, 0x0047, 0x0067, 0x0047, 0x0067, 0x0047, 0x0067, 0x0048, 0x0068, 0x0048, 0x0068,

+    0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x004A, 0x006A, 0x004B, 0x006B, 0x004B, 0x004C, 0x006C,

+    0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004F,

+    0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053,

+    0x0073, 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055,

+    0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0057, 0x0077, 0x0059, 0x0079, 0x0059, 0x005A, 0x007A, 0x005A, 0x007A, 0x005A, 0x007A,

+    0x0073, 0x0062, 0x0042, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044, 0x0044, 0x0044, 0x0064, 0x0045, 0x0045, 0x0046, 0x0066, 0x0047,

+    0x0049, 0x004B, 0x006B, 0x006C, 0x004D, 0x004E, 0x006E, 0x004F, 0x004F, 0x006F, 0x0050, 0x0070, 0x0283, 0x0074, 0x0054, 0x0074,

+    0x0054, 0x0055, 0x0075, 0x0056, 0x0059, 0x0079, 0x005A, 0x007A, 0x01B7, 0x0041, 0x0061, 0x0049, 0x0069, 0x004F, 0x006F, 0x0055,

+    0x0075, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x0065, 0x0041, 0x0061, 0x0041, 0x0061, 0x00C6, 0x00E6,

+    0x0047, 0x0067, 0x0047, 0x0067, 0x004B, 0x006B, 0x004F, 0x006F, 0x01EA, 0x01EB, 0x01B7, 0x0292, 0x006A, 0x0047, 0x0067, 0x004E,

+    0x006E, 0x0041, 0x0061, 0x00C6, 0x00E6, 0x00D8, 0x00F8, 0x0041, 0x0061, 0x0041, 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, 0x0049,

+    0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, 0x0052, 0x0072, 0x0052, 0x0072, 0x0055, 0x0075, 0x0055, 0x0075, 0x0053,

+    0x0073, 0x0054, 0x0074, 0x0048, 0x0068, 0x004E, 0x0064, 0x005A, 0x007A, 0x0041, 0x0061, 0x0045, 0x0065, 0x00D6, 0x00F6, 0x00D5,

+    0x00F5, 0x004F, 0x006F, 0x022E, 0x022F, 0x0059, 0x0079, 0x006C, 0x006E, 0x0074, 0x006A, 0x0041, 0x0043, 0x0063, 0x004C, 0x0054,

+    0x0053, 0x005A, 0x0042, 0x0055, 0x0056, 0x0045, 0x0065, 0x004A, 0x006A, 0x0051, 0x0071, 0x0052, 0x0072, 0x0059, 0x0079, 0x0061,

+    0x0251, 0x0062, 0x006F, 0x0063, 0x0064, 0x0064, 0x0065, 0x0259, 0x0065, 0x0065, 0x0065, 0x0065, 0x006A, 0x0067, 0x0067, 0x0047,

+    0x0068, 0x0068, 0x0069, 0x0049, 0x006C, 0x006C, 0x006C, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006F, 0x0072, 0x0072,

+    0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0052, 0x0052, 0x0073, 0x006A, 0x0283, 0x0283, 0x0074, 0x0074, 0x0055, 0x0076, 0x0076,

+    0x0077, 0x0079, 0x0059, 0x007A, 0x007A, 0x0292, 0x0043, 0x0042, 0x0065, 0x0047, 0x0048, 0x006A, 0x006B, 0x004C, 0x0071, 0x0068,

+    0x0068, 0x0068, 0x0068, 0x006A, 0x0072, 0x0279, 0x027B, 0x0281, 0x0077, 0x0079, 0x0263, 0x006C, 0x0073, 0x0078, 0x0295, 0x0300,

+    0x0301, 0x0313, 0x0308, 0x0061, 0x0065, 0x0069, 0x006F, 0x0075, 0x0063, 0x0064, 0x0068, 0x006D, 0x0072, 0x0074, 0x0076, 0x0078,

+    0x02B9, 0x003B, 0x0020, 0x00A8, 0x0391, 0x00B7, 0x0395, 0x0397, 0x0399, 0x039F, 0x03A5, 0x03A9, 0x03CA, 0x0399, 0x03A5, 0x03B1,

+    0x03B5, 0x03B7, 0x03B9, 0x03CB, 0x03B9, 0x03C5, 0x03BF, 0x03C5, 0x03C9, 0x03B2, 0x03B8, 0x03A5, 0x03D2, 0x03D2, 0x03C6, 0x03C0,

+    0x03BA, 0x03C1, 0x03C2, 0x0398, 0x03B5, 0x03A3, 0x0415, 0x0415, 0x0413, 0x0406, 0x041A, 0x0418, 0x0423, 0x0418, 0x0438, 0x0435,

+    0x0435, 0x0433, 0x0456, 0x043A, 0x0438, 0x0443, 0x0466, 0x0467, 0x046A, 0x046B, 0x0474, 0x0475, 0x0460, 0x0461, 0x0419, 0x0439,

+    0x0420, 0x0440, 0x0413, 0x0433, 0x0413, 0x0433, 0x0413, 0x0433, 0x0416, 0x0436, 0x0417, 0x0437, 0x041A, 0x043A, 0x041A, 0x043A,

+    0x041A, 0x043A, 0x041A, 0x043A, 0x041D, 0x043D, 0x041F, 0x043F, 0x0421, 0x0441, 0x0422, 0x0442, 0x04AE, 0x04AF, 0x0425, 0x0445,

+    0x0427, 0x0447, 0x0427, 0x0447, 0x0416, 0x0436, 0x04BC, 0x04BD, 0x0416, 0x0436, 0x041A, 0x043A, 0x041B, 0x043B, 0x041D, 0x043D,

+    0x041D, 0x043D, 0x041C, 0x043C, 0x0410, 0x0430, 0x0410, 0x0430, 0x0415, 0x0435, 0x04D8, 0x04D9, 0x0416, 0x0436, 0x0417, 0x0437,

+    0x0418, 0x0438, 0x0418, 0x0438, 0x041E, 0x043E, 0x04E8, 0x04E9, 0x042D, 0x044D, 0x0423, 0x0443, 0x0423, 0x0443, 0x0423, 0x0443,

+    0x0427, 0x0447, 0x0413, 0x0433, 0x042B, 0x044B, 0x0413, 0x0433, 0x0425, 0x0445, 0x0425, 0x0445, 0x0417, 0x0437, 0x041B, 0x043B,

+    0x0F0B, 0x10DC, 0x0041, 0x00C6, 0x0042, 0x0042, 0x0044, 0x0045, 0x018E, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D,

+    0x004E, 0x004F, 0x0222, 0x0050, 0x0052, 0x0054, 0x0055, 0x0057, 0x0061, 0x0250, 0x0251, 0x1D02, 0x0062, 0x0064, 0x0065, 0x0259,

+    0x025B, 0x025C, 0x0067, 0x006B, 0x006D, 0x014B, 0x006F, 0x0254, 0x1D16, 0x1D17, 0x0070, 0x0074, 0x0075, 0x1D1D, 0x026F, 0x0076,

+    0x1D25, 0x03B2, 0x03B3, 0x03B4, 0x03C6, 0x03C7, 0x0069, 0x0072, 0x0075, 0x0076, 0x03B2, 0x03B3, 0x03C1, 0x03C6, 0x03C7, 0x0062,

+    0x0064, 0x0066, 0x006D, 0x006E, 0x0070, 0x0072, 0x0072, 0x0073, 0x0074, 0x007A, 0x0067, 0x043D, 0x004C, 0x0070, 0x0055, 0x028A,

+    0x0062, 0x0064, 0x0066, 0x0067, 0x006B, 0x006C, 0x006D, 0x006E, 0x0070, 0x0072, 0x0073, 0x0283, 0x0076, 0x0078, 0x007A, 0x0061,

+    0x0251, 0x0064, 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0283, 0x0252, 0x0063, 0x0255, 0x00F0, 0x025C, 0x0066, 0x025F, 0x0261,

+    0x0265, 0x0268, 0x0269, 0x026A, 0x1D7B, 0x029D, 0x026D, 0x1D85, 0x029F, 0x0271, 0x0270, 0x0272, 0x0273, 0x0274, 0x0275, 0x0278,

+    0x0282, 0x0283, 0x01AB, 0x0289, 0x028A, 0x1D1C, 0x028B, 0x028C, 0x007A, 0x0290, 0x0291, 0x0292, 0x03B8, 0x0041, 0x0061, 0x0042,

+    0x0062, 0x0042, 0x0062, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044,

+    0x0064, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0228, 0x0229, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,

+    0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0049, 0x0069, 0x00CF, 0x00EF, 0x004B, 0x006B, 0x004B,

+    0x006B, 0x004B, 0x006B, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D,

+    0x006D, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x00D5, 0x00F5, 0x00D5, 0x00F5, 0x014C, 0x014D, 0x014C,

+    0x014D, 0x0050, 0x0070, 0x0050, 0x0070, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0053, 0x0073, 0x0053,

+    0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0055,

+    0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0168, 0x0169, 0x016A, 0x016B, 0x0056, 0x0076, 0x0056, 0x0076, 0x0057, 0x0077, 0x0057,

+    0x0077, 0x0057, 0x0077, 0x0057, 0x0077, 0x0057, 0x0077, 0x0058, 0x0078, 0x0058, 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005A,

+    0x007A, 0x005A, 0x007A, 0x0068, 0x0074, 0x0077, 0x0079, 0x0061, 0x017F, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041,

+    0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041,

+    0x0061, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045,

+    0x0065, 0x0049, 0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F,

+    0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x0055, 0x0075, 0x0055,

+    0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0059, 0x0079, 0x0059, 0x0079, 0x0059,

+    0x0079, 0x0059, 0x0079, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391,

+    0x0391, 0x0391, 0x0391, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x03B7,

+    0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x03B9,

+    0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x03BF,

+    0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5,

+    0x03C5, 0x03C5, 0x03C5, 0x03A5, 0x03A5, 0x03A5, 0x03A5, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9,

+    0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03B1, 0x03B1, 0x03B5, 0x03B5, 0x03B7, 0x03B7, 0x03B9, 0x03B9, 0x03BF,

+    0x03BF, 0x03C5, 0x03C5, 0x03C9, 0x03C9, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391,

+    0x0391, 0x0391, 0x0391, 0x0391, 0x0391, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x0397, 0x0397,

+    0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9, 0x03A9, 0x03A9,

+    0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391,

+    0x0391, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0395, 0x0395, 0x0397, 0x0397, 0x0397, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9,

+    0x03B9, 0x0399, 0x0399, 0x0399, 0x0399, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C1, 0x03C1, 0x03C5, 0x03C5, 0x03A5, 0x03A5, 0x03A5,

+    0x03A5, 0x03A1, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x039F, 0x039F, 0x03A9, 0x03A9, 0x03A9, 0x00B4, 0x0314, 0x0020, 0x0020,

+    0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x2010, 0x0333, 0x002E, 0x0020, 0x0020, 0x0030, 0x0069,

+    0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x002B, 0x2212, 0x003D, 0x0028, 0x0029, 0x006E, 0x0030, 0x0031, 0x0032, 0x0033,

+    0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x002B, 0x2212, 0x003D, 0x0028, 0x0029, 0x0061, 0x0065, 0x006F, 0x0078, 0x0259,

+    0x0043, 0x0190, 0x0067, 0x0048, 0x0048, 0x0048, 0x0068, 0x0068, 0x0049, 0x0049, 0x004C, 0x006C, 0x004E, 0x0050, 0x0051, 0x0052,

+    0x0052, 0x0052, 0x0052, 0x0052, 0x0056, 0x005A, 0x03A9, 0x01B1, 0x005A, 0x004B, 0x00C5, 0x0042, 0x0043, 0x0065, 0x0065, 0x0045,

+    0x0046, 0x004D, 0x006F, 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x0069, 0x03C0, 0x03B3, 0x0393, 0x03A0, 0x2211, 0x0044, 0x0064, 0x0065,

+    0x0069, 0x006A, 0x0049, 0x0056, 0x0058, 0x004C, 0x0043, 0x0044, 0x004D, 0x0069, 0x0076, 0x0078, 0x006C, 0x0063, 0x0064, 0x006D,

+    0x2203, 0x2208, 0x220B, 0x3008, 0x3009, 0x0062, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0041,

+    0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,

+    0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,

+    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,

+    0x0078, 0x0079, 0x007A, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0030, 0x0031, 0x0032,

+    0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,

+    0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x004C, 0x006C, 0x004C, 0x0050, 0x0052, 0x0061, 0x0074,

+    0x0048, 0x0068, 0x004B, 0x006B, 0x005A, 0x007A, 0x0076, 0x0057, 0x0058, 0x0076, 0x006A, 0x0056, 0x2D61, 0x6BCD, 0x6C11, 0x864E,

+    0x897F, 0x89D2, 0x957F, 0x9752, 0x98DF, 0x9AA8, 0x9B3C, 0x9EA6, 0x9EC4, 0x9F9F, 0x4E00, 0x4E28, 0x4E36, 0x4E3F, 0x4E59, 0x4E85,

+    0x4E8C, 0x4EA0, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x5182, 0x5196, 0x51AB, 0x51E0, 0x51F5, 0x5200, 0x529B, 0x52F9, 0x5315, 0x531A,

+    0x5338, 0x5341, 0x535C, 0x5369, 0x5382, 0x53B6, 0x53C8, 0x53E3, 0x56D7, 0x571F, 0x58EB, 0x5902, 0x590A, 0x5915, 0x5927, 0x5973,

+    0x5B50, 0x5B80, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C6E, 0x5C71, 0x5DDB, 0x5DE5, 0x5DF1, 0x5DFE, 0x5E72, 0x5E7A, 0x5E7F, 0x5EF4,

+    0x5EFE, 0x5F0B, 0x5F13, 0x5F50, 0x5F61, 0x5F73, 0x5FC3, 0x6208, 0x6236, 0x624B, 0x652F, 0x6534, 0x6587, 0x6597, 0x65A4, 0x65B9,

+    0x65E0, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, 0x6BB3, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C14, 0x6C34, 0x706B,

+    0x722A, 0x7236, 0x723B, 0x723F, 0x7247, 0x7259, 0x725B, 0x72AC, 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7530,

+    0x758B, 0x7592, 0x7676, 0x767D, 0x76AE, 0x76BF, 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79B8, 0x79BE, 0x7A74, 0x7ACB, 0x7AF9,

+    0x7C73, 0x7CF8, 0x7F36, 0x7F51, 0x7F8A, 0x7FBD, 0x8001, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, 0x81E3, 0x81EA, 0x81F3, 0x81FC,

+    0x820C, 0x821B, 0x821F, 0x826E, 0x8272, 0x8278, 0x864D, 0x866B, 0x8840, 0x884C, 0x8863, 0x897E, 0x898B, 0x89D2, 0x8A00, 0x8C37,

+    0x8C46, 0x8C55, 0x8C78, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FB5, 0x9091, 0x9149, 0x91C6, 0x91CC,

+    0x91D1, 0x9577, 0x9580, 0x961C, 0x96B6, 0x96B9, 0x96E8, 0x9751, 0x975E, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8,

+    0x98DB, 0x98DF, 0x9996, 0x9999, 0x99AC, 0x9AA8, 0x9AD8, 0x9ADF, 0x9B25, 0x9B2F, 0x9B32, 0x9B3C, 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F,

+    0x9EA5, 0x9EBB, 0x9EC3, 0x9ECD, 0x9ED1, 0x9EF9, 0x9EFD, 0x9F0E, 0x9F13, 0x9F20, 0x9F3B, 0x9F4A, 0x9F52, 0x9F8D, 0x9F9C, 0x9FA0,

+    0x0020, 0x3012, 0x5341, 0x5344, 0x5345, 0x1100, 0x1101, 0x11AA, 0x1102, 0x11AC, 0x11AD, 0x1103, 0x1104, 0x1105, 0x11B0, 0x11B1,

+    0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x111A, 0x1106, 0x1107, 0x1108, 0x1121, 0x1109, 0x110A, 0x110B, 0x110C, 0x110D, 0x110E, 0x110F,

+    0x1110, 0x1111, 0x1112, 0x1161, 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168, 0x1169, 0x116A, 0x116B, 0x116C, 0x116D,

+    0x116E, 0x116F, 0x1170, 0x1171, 0x1172, 0x1173, 0x1174, 0x1175, 0x1160, 0x1114, 0x1115, 0x11C7, 0x11C8, 0x11CC, 0x11CE, 0x11D3,

+    0x11D7, 0x11D9, 0x111C, 0x11DD, 0x11DF, 0x111D, 0x111E, 0x1120, 0x1122, 0x1123, 0x1127, 0x1129, 0x112B, 0x112C, 0x112D, 0x112E,

+    0x112F, 0x1132, 0x1136, 0x1140, 0x1147, 0x114C, 0x11F1, 0x11F2, 0x1157, 0x1158, 0x1159, 0x1184, 0x1185, 0x1188, 0x1191, 0x1192,

+    0x1194, 0x119E, 0x11A1, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E0A, 0x4E2D, 0x4E0B, 0x7532, 0x4E59, 0x4E19, 0x4E01, 0x5929, 0x5730,

+    0x4EBA, 0x554F, 0x5E7C, 0x6587, 0x7B8F, 0x1100, 0x1102, 0x1103, 0x1105, 0x1106, 0x1107, 0x1109, 0x110B, 0x110C, 0x110E, 0x110F,

+    0x1110, 0x1111, 0x1112, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x6708, 0x706B, 0x6C34,

+    0x6728, 0x91D1, 0x571F, 0x65E5, 0x682A, 0x6709, 0x793E, 0x540D, 0x7279, 0x8CA1, 0x795D, 0x52B4, 0x79D8, 0x7537, 0x5973, 0x9069,

+    0x512A, 0x5370, 0x6CE8, 0x9805, 0x4F11, 0x5199, 0x6B63, 0x4E0A, 0x4E2D, 0x4E0B, 0x5DE6, 0x53F3, 0x533B, 0x5B97, 0x5B66, 0x76E3,

+    0x4F01, 0x8CC7, 0x5354, 0x591C, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7,

+    0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5,

+    0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF,

+    0x30F0, 0x30F1, 0x30F2, 0x4E22, 0x5E76, 0x5E7A, 0x5E72, 0x4E71, 0x4E98, 0x4E9A, 0x4F2B, 0x5E03, 0x5360, 0x6765, 0x4FA3, 0x4FE3,

+    0x7CFB, 0x4FA0, 0x4F25, 0x4FE9, 0x4ED3, 0x4E2A, 0x4EEC, 0x4F26, 0x4F1F, 0x4FA7, 0x4FA6, 0x4F2A, 0x6770, 0x4F27, 0x4F1E, 0x5907,

+    0x5BB6, 0x4F63, 0x506C, 0x4F20, 0x4F1B, 0x503A, 0x4F24, 0x503E, 0x507B, 0x4EC5, 0x4F65, 0x4FA8, 0x4EC6, 0x4FA5, 0x507E, 0x96C7,

+    0x4EF7, 0x4EEA, 0x4FAC, 0x4EBF, 0x4FED, 0x50A7, 0x4FE6, 0x4FAA, 0x5C3D, 0x507F, 0x4F18, 0x50A8, 0x4FEA, 0x50A9, 0x50A5, 0x4FE8,

+    0x51F6, 0x5151, 0x513F, 0x5156, 0x5185, 0x4E24, 0x518C, 0x80C4, 0x5199, 0x5E42, 0x51BB, 0x51DB, 0x51EF, 0x522B, 0x5220, 0x522D,

+    0x5219, 0x5239, 0x521A, 0x5265, 0x5250, 0x5240, 0x521B, 0x522C, 0x5212, 0x5267, 0x5218, 0x523D, 0x523F, 0x5251, 0x5242, 0x52B2,

+    0x52A8, 0x52D6, 0x52A1, 0x80DC, 0x52B3, 0x52BF, 0x52A2, 0x52CB, 0x52B1, 0x529D, 0x5300, 0x5326, 0x6C47, 0x532E, 0x533A, 0x534F,

+    0x6064, 0x5374, 0x538D, 0x538C, 0x5389, 0x53A3, 0x53C2, 0x4E1B, 0x54A4, 0x5434, 0x5450, 0x5415, 0x5458, 0x55B1, 0x5457, 0x5FF5,

+    0x95EE, 0x54D1, 0x542F, 0x5524, 0x4E27, 0x4E54, 0x5355, 0x54DF, 0x545B, 0x556C, 0x551D, 0x5417, 0x545C, 0x5522, 0x54D4, 0x53F9,

+    0x55BD, 0x5455, 0x5567, 0x5C1D, 0x551B, 0x54D7, 0x5520, 0x5578, 0x53FD, 0x54D3, 0x5452, 0x5574, 0x6076, 0x5618, 0x549D, 0x54D2,

+    0x54DD, 0x54D5, 0x55F3, 0x54D9, 0x55B7, 0x5428, 0x549B, 0x5413, 0x54DC, 0x5C1D, 0x565C, 0x556E, 0x5456, 0x5499, 0x4EB8, 0x55BE,

+    0x4E25, 0x5624, 0x556D, 0x55EB, 0x56A3, 0x5181, 0x5453, 0x5570, 0x5631, 0x56F1, 0x56F5, 0x56FD, 0x56F4, 0x56ED, 0x5706, 0x56FE,

+    0x56E2, 0x57AD, 0x6267, 0x575A, 0x57A9, 0x57DA, 0x5C27, 0x62A5, 0x573A, 0x5757, 0x8314, 0x57B2, 0x57D8, 0x6D82, 0x51A2, 0x575E,

+    0x57D9, 0x5C18, 0x5811, 0x57AB, 0x5760, 0x5815, 0x575F, 0x57A6, 0x575B, 0x538B, 0x5792, 0x5739, 0x5786, 0x574F, 0x5785, 0x575C,

+    0x575D, 0x58EE, 0x58F6, 0x58F8, 0x5BFF, 0x591F, 0x68A6, 0x4F19, 0x5939, 0x5942, 0x5965, 0x5941, 0x593A, 0x594B, 0x59F9, 0x5986,

+    0x59D7, 0x5978, 0x5A31, 0x5A04, 0x5987, 0x5A05, 0x5A32, 0x59AB, 0x5AAA, 0x5988, 0x59AA, 0x59A9, 0x5A34, 0x5A73, 0x5A06, 0x5A75,

+    0x5A07, 0x5AF1, 0x5AD2, 0x5B37, 0x5AD4, 0x5A74, 0x5A76, 0x5A08, 0x5B59, 0x5B66, 0x5B6A, 0x5BAB, 0x5BDD, 0x5B9E, 0x5B81, 0x5BA1,

+    0x5199, 0x5BBD, 0x5BA0, 0x5B9D, 0x5C06, 0x4E13, 0x5BFB, 0x5BF9, 0x5BFC, 0x5C34, 0x5C4A, 0x5C38, 0x5C49, 0x5C61, 0x5C42, 0x5C5F,

+    0x5C66, 0x5C5E, 0x5188, 0x5C98, 0x5C9B, 0x5CE1, 0x5D03, 0x5C97, 0x4ED1, 0x5CE5, 0x5C9A, 0x5D5D, 0x5D2D, 0x5C96, 0x5D5A, 0x5D02,

+    0x5CE4, 0x5CE3, 0x5CC4, 0x5D04, 0x5C99, 0x5D58, 0x5CAD, 0x5C7F, 0x5CB3, 0x5CBF, 0x5CE6, 0x5DC5, 0x5DEF, 0x5E05, 0x5E08, 0x5E10,

+    0x5E26, 0x5E27, 0x5E0F, 0x5E3C, 0x5E3B, 0x5E1C, 0x5E01, 0x5E2E, 0x5E31, 0x5E72, 0x51E0, 0x5E93, 0x5395, 0x53A2, 0x53A6, 0x53A8,

+    0x53AE, 0x5E99, 0x5382, 0x5E91, 0x5E9F, 0x5E7F, 0x5EEA, 0x5E90, 0x5385, 0x5F11, 0x5F2A, 0x5F20, 0x5F3A, 0x5F39, 0x5F25, 0x5F2F,

+    0x5F66, 0x540E, 0x5F84, 0x4ECE, 0x5F95, 0x590D, 0x5F81, 0x5F7B, 0x6052, 0x803B, 0x60A6, 0x6005, 0x95F7, 0x6076, 0x607C, 0x607D,

+    0x607B, 0x7231, 0x60EC, 0x60AB, 0x6006, 0x607A, 0x5FFE, 0x6001, 0x6120, 0x60E8, 0x60ED, 0x6078, 0x60EF, 0x6004, 0x6002, 0x8651,

+    0x60AD, 0x5E86, 0x5FE7, 0x60EB, 0x601C, 0x51ED, 0x6126, 0x616D, 0x60EE, 0x6124, 0x60AF, 0x6003, 0x5BAA, 0x5FC6, 0x6073, 0x5E94,

+    0x603F, 0x61D4, 0x603C, 0x61D1, 0x6079, 0x60E9, 0x61D2, 0x6000, 0x60AC, 0x5FCF, 0x60E7, 0x6151, 0x604B, 0x6206, 0x620B, 0x6217,

+    0x622C, 0x6218, 0x620F, 0x6237, 0x629B, 0x631F, 0x820D, 0x626A, 0x5377, 0x626B, 0x62A1, 0x6323, 0x6302, 0x91C7, 0x62E3, 0x626C,

+    0x6362, 0x6325, 0x635F, 0x6447, 0x6363, 0x62A2, 0x63B4, 0x63BC, 0x6402, 0x631A, 0x62A0, 0x629F, 0x63BA, 0x635E, 0x6491, 0x6320,

+    0x6322, 0x63B8, 0x62E8, 0x629A, 0x6251, 0x63FF, 0x631E, 0x631D, 0x6361, 0x62E5, 0x63B3, 0x62E9, 0x51FB, 0x6321, 0x62C5, 0x636E,

+    0x6324, 0x62DF, 0x6448, 0x62E7, 0x6401, 0x63B7, 0x6269, 0x64B7, 0x6446, 0x64DE, 0x64B8, 0x6270, 0x6445, 0x64B5, 0x62E2, 0x62E6,

+    0x6484, 0x6400, 0x64BA, 0x643A, 0x6444, 0x6512, 0x631B, 0x644A, 0x6405, 0x63FD, 0x668B, 0x8D25, 0x53D9, 0x654C, 0x6570, 0x655B,

+    0x6BD9, 0x6593, 0x65A9, 0x65AD, 0x4E8E, 0x5347, 0x65F6, 0x664B, 0x663C, 0x6655, 0x6656, 0x65F8, 0x7545, 0x6682, 0x6635, 0x6654,

+    0x5386, 0x6619, 0x6653, 0x66A7, 0x65F7, 0x663D, 0x6652, 0x4E66, 0x4F1A, 0x80E7, 0x4E1C, 0x6805, 0x6746, 0x6800, 0x67A7, 0x6761,

+    0x67AD, 0x5F03, 0x67A8, 0x67A3, 0x680B, 0x6808, 0x6816, 0x6860, 0x6768, 0x67AB, 0x6862, 0x4E1A, 0x6781, 0x6769, 0x8363, 0x6864,

+    0x6784, 0x67AA, 0x6760, 0x68BF, 0x6920, 0x6901, 0x6868, 0x6869, 0x4E50, 0x679E, 0x697C, 0x6807, 0x67A2, 0x6837, 0x6734, 0x6811,

+    0x6866, 0x6861, 0x6865, 0x673A, 0x692D, 0x6A2A, 0x6AA9, 0x69DC, 0x67FD, 0x6863, 0x6867, 0x69DA, 0x68C0, 0x6A2F, 0x68BC, 0x53F0,

+    0x69DF, 0x67E0, 0x69DB, 0x82D8, 0x67DC, 0x6A79, 0x6988, 0x6809, 0x691F, 0x6A7C, 0x680E, 0x6A71, 0x69E0, 0x680C, 0x67A5, 0x6A65,

+    0x6987, 0x680A, 0x6989, 0x68C2, 0x6A31, 0x680F, 0x6743, 0x6924, 0x683E, 0x6984, 0x94A6, 0x6B27, 0x6B24, 0x6B22, 0x5C81, 0x5386,

+    0x5F52, 0x6B81, 0x6B8B, 0x6B92, 0x6B87, 0x6B9A, 0x6B93, 0x6BA1, 0x6B7C, 0x6740, 0x58F3, 0x6BC1, 0x6BB4, 0x6BF5, 0x6BE1, 0x6C07,

+    0x6C14, 0x6C22, 0x6C29, 0x6C32, 0x51FC, 0x51B3, 0x51B1, 0x6CA1, 0x51B5, 0x6CC4, 0x6C79, 0x6D43, 0x6CFE, 0x51C9, 0x51C4, 0x6CEA,

+    0x6E0C, 0x51C0, 0x6CA6, 0x6E0A, 0x6D9E, 0x6D45, 0x6DA3, 0x51CF, 0x6CA8, 0x6DA1, 0x6D4B, 0x6D51, 0x51D1, 0x6D48, 0x6D8C, 0x6D07,

+    0x6C64, 0x6CA9, 0x51C6, 0x6C9F, 0x6E29, 0x6DA2, 0x6E7F, 0x6CA7, 0x706D, 0x6DA4, 0x8365, 0x6CAA, 0x6EDE, 0x6E17, 0x6D52, 0x6D50,

+    0x6EDA, 0x6EE1, 0x6E14, 0x6E87, 0x6CA4, 0x6C49, 0x6D9F, 0x6E0D, 0x6DA8, 0x6E10, 0x6D46, 0x988D, 0x6CFC, 0x6D01, 0x6F5C, 0x6DA6,

+    0x6D54, 0x6E83, 0x6DA0, 0x6DA9, 0x6D47, 0x6D9D, 0x6C84, 0x6DA7, 0x6E11, 0x6CFD, 0x6EEA, 0x6CF6, 0x6D4D, 0x6D4A, 0x6D53, 0x6E7F,

+    0x6CDE, 0x6D4E, 0x6D9B, 0x6EE5, 0x6F4D, 0x6EE8, 0x6E85, 0x6CFA, 0x6EE4, 0x6EE2, 0x6E0E, 0x6CFB, 0x6D4F, 0x6FD2, 0x6CF8, 0x6CA5,

+    0x6F47, 0x6F46, 0x6F74, 0x6CF7, 0x6FD1, 0x6F4B, 0x6F9C, 0x6CA3, 0x6EE0, 0x6D12, 0x6EE9, 0x704F, 0x6E7E, 0x6EE6, 0x6EDF, 0x707E,

+    0x4E3A, 0x4E4C, 0x70C3, 0x65E0, 0x70BC, 0x709C, 0x70DF, 0x8315, 0x7115, 0x70E6, 0x7080, 0x8367, 0x709D, 0x70ED, 0x70BD, 0x70E8,

+    0x706F, 0x7096, 0x70E7, 0x70EB, 0x7116, 0x8425, 0x707F, 0x70DB, 0x70E9, 0x70EC, 0x7118, 0x70C1, 0x7089, 0x70C2, 0x4E89, 0x4E3A,

+    0x7237, 0x5C14, 0x5899, 0x724D, 0x7275, 0x8366, 0x7266, 0x728A, 0x727A, 0x72B6, 0x72ED, 0x72C8, 0x72F0, 0x72B9, 0x72F2, 0x72B8,

+    0x72F1, 0x72EE, 0x5956, 0x72EC, 0x72EF, 0x7303, 0x72DE, 0x83B7, 0x730E, 0x72B7, 0x517D, 0x736D, 0x732E, 0x7315, 0x7321, 0x73B0,

+    0x73D0, 0x73F2, 0x73AE, 0x739A, 0x7410, 0x7476, 0x83B9, 0x739B, 0x7405, 0x73B1, 0x740F, 0x740E, 0x7391, 0x7477, 0x73F0, 0x73AF,

+    0x7399, 0x73BA, 0x743C, 0x73D1, 0x748E, 0x74D2, 0x74EF, 0x74EE, 0x4EA7, 0x4EA7, 0x4EA9, 0x6BD5, 0x753B, 0x7572, 0x5F02, 0x5F53,

+    0x7574, 0x53E0, 0x75C9, 0x9178, 0x75F9, 0x75D6, 0x75AF, 0x75A1, 0x75EA, 0x7617, 0x75AE, 0x759F, 0x75AD, 0x7618, 0x7597, 0x75E8,

+    0x75EB, 0x7605, 0x75A0, 0x762A, 0x75D2, 0x7596, 0x75AC, 0x765E, 0x7663, 0x763F, 0x763E, 0x75C8, 0x762B, 0x766B, 0x53D1, 0x7691,

+    0x75B1, 0x76B2, 0x76B1, 0x676F, 0x76D7, 0x76CF, 0x5C3D, 0x76D1, 0x76D8, 0x5362, 0x8361, 0x7726, 0x4F17, 0x56F0, 0x7741, 0x7750,

+    0x772F, 0x7792, 0x4E86, 0x7786, 0x7751, 0x772C, 0x77A9, 0x77EB, 0x7845, 0x70AE, 0x7841, 0x7856, 0x7817, 0x781A, 0x7855, 0x7800,

+    0x786E, 0x7801, 0x7859, 0x7816, 0x789C, 0x789B, 0x77F6, 0x7857, 0x785A, 0x7840, 0x788D, 0x77FF, 0x783A, 0x783E, 0x77FE, 0x783B,

+    0x7984, 0x7978, 0x796F, 0x794E, 0x5FA1, 0x7985, 0x793C, 0x7977, 0x79C3, 0x7C7C, 0x7A0E, 0x79C6, 0x68F1, 0x79CD, 0x79F0, 0x7A23,

+    0x79EF, 0x9896, 0x79FE, 0x7A51, 0x79FD, 0x7A33, 0x7A9D, 0x6D3C, 0x7A77, 0x7A91, 0x7A8E, 0x7AAD, 0x7AA5, 0x7A9C, 0x7A8D, 0x7AA6,

+    0x7A83, 0x7ADE, 0x7B14, 0x7B0B, 0x7B15, 0x7B3A, 0x7B5D, 0x8282, 0x8303, 0x7B51, 0x7BA7, 0x7B7C, 0x7B03, 0x7B5B, 0x7B5A, 0x7BA6,

+    0x7BD3, 0x7BAA, 0x7B80, 0x7BD1, 0x7BAB, 0x6A90, 0x7B5C, 0x7B7E, 0x5E18, 0x7BEE, 0x7B79, 0x7B93, 0x7BEF, 0x7BA8, 0x7C41, 0x7B3C,

+    0x7B7E, 0x7B3E, 0x7BF1, 0x7BA9, 0x5401, 0x5986, 0x7CA4, 0x7CC1, 0x7CAA, 0x7CAE, 0x7CF5, 0x7C9D, 0x7C74, 0x7C9C, 0x7EA0, 0x7EAA,

+    0x7EA3, 0x7EA6, 0x7EA2, 0x7EA1, 0x7EA5, 0x7EA8, 0x7EAB, 0x7EB9, 0x7EB3, 0x7EBD, 0x7EBE, 0x7EAF, 0x7EB0, 0x7EB1, 0x7EB8, 0x7EA7,

+    0x7EB7, 0x7EAD, 0x7EB4, 0x7EBA, 0x624E, 0x624E, 0x7EC6, 0x7EC2, 0x7EC1, 0x7EC5, 0x7EBB, 0x7ECD, 0x7EC0, 0x7ECB, 0x7ED0, 0x7ECC,

+    0x7EC8, 0x5F26, 0x7EC4, 0x7ECA, 0x7ED7, 0x7ED3, 0x7EDD, 0x7EE6, 0x7ED4, 0x7EDE, 0x7EDC, 0x7EDA, 0x7ED9, 0x7ED2, 0x7ED6, 0x7EDF,

+    0x4E1D, 0x7EDB, 0x7EE2, 0x7ED1, 0x7EE1, 0x7EE0, 0x7EE8, 0x7EE5, 0x7ECF, 0x7EFC, 0x7F0D, 0x7EFF, 0x7EF8, 0x7EFB, 0x7EF6, 0x7EF4,

+    0x7EFE, 0x7EB2, 0x7F51, 0x7F00, 0x7EB6, 0x7EFA, 0x7EEE, 0x7EFD, 0x7EF0, 0x7EEB, 0x7EF5, 0x7EF2, 0x7F01, 0x7D27, 0x7EEF, 0x7EEA,

+    0x7F03, 0x7F04, 0x7F02, 0x7EBF, 0x7F09, 0x7F0E, 0x7F14, 0x7F17, 0x7F18, 0x7F0C, 0x7F16, 0x7F13, 0x7F05, 0x7EAC, 0x7F11, 0x7F08,

+    0x7EC3, 0x7F0F, 0x7F07, 0x81F4, 0x8426, 0x7F19, 0x7F22, 0x7F12, 0x7EC9, 0x7F23, 0x7F1E, 0x7F1A, 0x7F1C, 0x7F1F, 0x7F1B, 0x53BF,

+    0x7F1D, 0x7F29, 0x7EB5, 0x7F27, 0x7F26, 0x7D77, 0x7F15, 0x7F25, 0x603B, 0x7EE9, 0x7EF7, 0x7F2B, 0x7F2A, 0x7F2F, 0x7EC7, 0x7F2E,

+    0x7F2D, 0x7ED5, 0x7EE3, 0x7F0B, 0x7EF3, 0x7ED8, 0x7CFB, 0x8327, 0x7F33, 0x7F32, 0x7F34, 0x7ECE, 0x7EE7, 0x7F24, 0x7F31, 0x7F2C,

+    0x7EA9, 0x7EED, 0x7F20, 0x7F28, 0x7EA4, 0x7F35, 0x7F06, 0x94B5, 0x7F42, 0x7F5A, 0x9A82, 0x7F62, 0x7F57, 0x7F74, 0x7F81, 0x8288,

+    0x7F9F, 0x7FA1, 0x4E49, 0x81BB, 0x4E60, 0x7FC6, 0x7FDA, 0x7FD8, 0x7FD9, 0x8027, 0x5723, 0x95FB, 0x8054, 0x806A, 0x58F0, 0x8038,

+    0x8069, 0x8042, 0x804C, 0x804D, 0x542C, 0x804B, 0x8083, 0x80C1, 0x8109, 0x80EB, 0x8131, 0x80C0, 0x80BE, 0x80E8, 0x8136, 0x8111,

+    0x80BF, 0x811A, 0x80A0, 0x817D, 0x8158, 0x80A4, 0x80F6, 0x817B, 0x80C6, 0x810D, 0x8113, 0x8138, 0x8110, 0x8191, 0x814A, 0x80EA,

+    0x810F, 0x8114, 0x81DC, 0x5367, 0x4E34, 0x53F0, 0x4E0E, 0x5174, 0x4E3E, 0x65E7, 0x8231, 0x8223, 0x8230, 0x823B, 0x8270, 0x8273,

+    0x82C4, 0x520D, 0x82CE, 0x5179, 0x8346, 0x8C46, 0x5E84, 0x830E, 0x835A, 0x82CB, 0x534E, 0x70DF, 0x82CC, 0x83B1, 0x4E07, 0x83B4,

+    0x53F6, 0x836D, 0x7740, 0x82C7, 0x8364, 0x641C, 0x83B3, 0x8385, 0x82CD, 0x836A, 0x76D6, 0x83B2, 0x82C1, 0x83BC, 0x835C, 0x848C,

+    0x848B, 0x8471, 0x8311, 0x836B, 0x8368, 0x8487, 0x835E, 0x836C, 0x83B8, 0x835B, 0x8489, 0x829C, 0x8427, 0x84E3, 0x835F, 0x84DF,

+    0x8297, 0x59DC, 0x8537, 0x83B6, 0x8350, 0x8428, 0x8360, 0x501F, 0x84DD, 0x8369, 0x827A, 0x836F, 0x85AE, 0x82C8, 0x853C, 0x853A,

+    0x841A, 0x8572, 0x82A6, 0x82CF, 0x8574, 0x82F9, 0x8616, 0x85D3, 0x8539, 0x830F, 0x5170, 0x84E0, 0x841D, 0x5904, 0x865A, 0x864F,

+    0x53F7, 0x4E8F, 0x866C, 0x86F1, 0x8715, 0x86AC, 0x8680, 0x732C, 0x867E, 0x8671, 0x8717, 0x86F3, 0x8682, 0x8424, 0x877C, 0x8780,

+    0x86F0, 0x8748, 0x87A8, 0x866E, 0x8749, 0x86F2, 0x866B, 0x86CF, 0x8681, 0x8683, 0x8747, 0x867F, 0x874E, 0x86F4, 0x877E, 0x869D,

+    0x8721, 0x86CE, 0x87CF, 0x86CA, 0x8695, 0x86EE, 0x4F17, 0x672F, 0x536B, 0x51B2, 0x886E, 0x8885, 0x8865, 0x88C5, 0x91CC, 0x5236,

+    0x590D, 0x88C8, 0x8886, 0x88E4, 0x88E2, 0x7F21, 0x891B, 0x4EB5, 0x88E5, 0x8884, 0x88E3, 0x88C6, 0x8934, 0x889C, 0x886C, 0x88AD,

+    0x8955, 0x89C1, 0x89C4, 0x89C5, 0x89C6, 0x89C7, 0x89CB, 0x89CD, 0x89CE, 0x4EB2, 0x89CA, 0x89CF, 0x89D0, 0x89D1, 0x89C9, 0x89C8,

+    0x89CC, 0x89C2, 0x89DE, 0x89EF, 0x89E6, 0x8BA2, 0x8BA3, 0x8BA1, 0x8BAF, 0x8BA7, 0x8BA8, 0x8BA6, 0x8BAD, 0x8BAA, 0x8BAB, 0x8BAC,

+    0x8BB0, 0x8BB9, 0x8BB6, 0x8BBC, 0x8BC0, 0x8BB7, 0x8BBF, 0x8BBE, 0x8BB8, 0x8BC9, 0x8BC3, 0x8BCA, 0x8BC1, 0x8BC2, 0x8BCB, 0x8BB5,

+    0x8BC8, 0x8BD2, 0x8BCF, 0x8BC4, 0x8BCE, 0x8BC5, 0x8BCD, 0x548F, 0x8BE9, 0x8BE2, 0x8BE3, 0x8BD5, 0x8BD7, 0x8BE7, 0x8BDF, 0x8BE1,

+    0x8BE0, 0x8BD8, 0x8BDD, 0x8BE5, 0x8BE6, 0x8BDC, 0x8BD9, 0x8BD6, 0x8BD4, 0x8BDB, 0x8BD3, 0x5938, 0x5FD7, 0x8BA4, 0x8BF3, 0x8BF6,

+    0x8BDE, 0x8BF1, 0x8BEE, 0x8BED, 0x8BDA, 0x8BEB, 0x8BEC, 0x8BEF, 0x8BF0, 0x8BF5, 0x8BF2, 0x8BF4, 0x8C01, 0x8BFE, 0x8C07, 0x8BFD,

+    0x8C0A, 0x8C03, 0x8C04, 0x8C06, 0x8C08, 0x8BFF, 0x8BF7, 0x8BE4, 0x8BF9, 0x8BFC, 0x8C05, 0x8BBA, 0x8C02, 0x8C00, 0x8C0D, 0x8C1E,

+    0x8C1D, 0x8C25, 0x8BE8, 0x8C14, 0x8C1B, 0x8C10, 0x8C0F, 0x8C15, 0x8C18, 0x8BB3, 0x8C19, 0x8C0C, 0x8BBD, 0x8BF8, 0x8C1A, 0x8C16,

+    0x8BFA, 0x8C0B, 0x8C12, 0x8C13, 0x8A8A, 0x8BCC, 0x8C0E, 0x8C1C, 0x8C27, 0x8C11, 0x8C21, 0x8C24, 0x8C26, 0x8BB2, 0x8C22, 0x8C23,

+    0x8C1F, 0x8C2A, 0x8C2C, 0x8BB4, 0x8C28, 0x8C29, 0x8BC1, 0x8C32, 0x8BA5, 0x8C2E, 0x8BC6, 0x8C2F, 0x8C2D, 0x8C31, 0x8C35, 0x8BD1,

+    0x8BAE, 0x8C34, 0x62A4, 0x8BEA, 0x8A89, 0x8C2B, 0x8BFB, 0x53D8, 0x8A5F, 0x96E0, 0x8C17, 0x8BA9, 0x8C30, 0x8C36, 0x8D5E, 0x8C20,

+    0x8C33, 0x5C82, 0x7AD6, 0x4E30, 0x732A, 0x8C6E, 0x732B, 0x8D1D, 0x8D1E, 0x8D1F, 0x8D22, 0x8D21, 0x8D2B, 0x8D27, 0x8D29, 0x8D2A,

+    0x8D2F, 0x8D23, 0x8D2E, 0x8D33, 0x8D40, 0x8D30, 0x8D35, 0x8D2C, 0x4E70, 0x8D37, 0x8D36, 0x8D39, 0x8D34, 0x8D3B, 0x8D38, 0x8D3A,

+    0x8D32, 0x8D42, 0x8D41, 0x8D3F, 0x8D45, 0x8D44, 0x8D3E, 0x8D3C, 0x8D48, 0x8D4A, 0x5BBE, 0x8D47, 0x8D52, 0x8D49, 0x8D50, 0x8D4F,

+    0x8D54, 0x8D53, 0x8D24, 0x5356, 0x8D31, 0x8D4B, 0x8D55, 0x8D28, 0x8D26, 0x8D4C, 0x8D56, 0x8D57, 0x8D5A, 0x8D59, 0x8D2D, 0x8D5B,

+    0x8D5C, 0x8D3D, 0x8D58, 0x8D5F, 0x8D60, 0x8D5E, 0x8D61, 0x8D62, 0x8D46, 0x8D43, 0x8D51, 0x8D4E, 0x8D5D, 0x8D63, 0x8D6A, 0x8D76,

+    0x8D75, 0x8D8B, 0x8DB1, 0x8FF9, 0x8DF5, 0x8E0A, 0x8DC4, 0x8DF8, 0x8DD6, 0x8E52, 0x8DF7, 0x8DF6, 0x8DB8, 0x8E0C, 0x8DFB, 0x8DC3,

+    0x8E2F, 0x8DDE, 0x8E2C, 0x8E70, 0x8DF9, 0x8E51, 0x8E7F, 0x8E9C, 0x8E8F, 0x8EAF, 0x8F66, 0x8F67, 0x8F68, 0x519B, 0x8F69, 0x8F6B,

+    0x8F6D, 0x8F6F, 0x8F78, 0x8F71, 0x8F74, 0x8F75, 0x8F7A, 0x8F72, 0x8F76, 0x8F7C, 0x8F83, 0x8F82, 0x8F81, 0x8F80, 0x8F7D, 0x8F7E,

+    0x8F84, 0x8F85, 0x8F7B, 0x8F86, 0x8F8E, 0x8F89, 0x8F8B, 0x8F8D, 0x8F8A, 0x8F87, 0x8F88, 0x8F6E, 0x8F91, 0x8F8F, 0x8F93, 0x8F90,

+    0x8F97, 0x8206, 0x8F92, 0x6BC2, 0x8F96, 0x8F95, 0x8F98, 0x8F6C, 0x8F99, 0x8F7F, 0x8F9A, 0x8F70, 0x8F94, 0x8F79, 0x8F73, 0x529E,

+    0x8F9E, 0x8FAB, 0x8FA9, 0x519C, 0x8FD9, 0x8FDE, 0x5468, 0x8FDB, 0x6E38, 0x8FD0, 0x8FC7, 0x8FBE, 0x8FDD, 0x9065, 0x900A, 0x9012,

+    0x8FDC, 0x9002, 0x8FDF, 0x8FC1, 0x9009, 0x9057, 0x8FBD, 0x8FC8, 0x8FD8, 0x8FE9, 0x8FB9, 0x903B, 0x9026, 0x90CF, 0x90AE, 0x90D3,

+    0x4E61, 0x90B9, 0x90AC, 0x90E7, 0x9093, 0x90D1, 0x90BB, 0x90F8, 0x90BA, 0x90D0, 0x909D, 0x9142, 0x90E6, 0x814C, 0x4E11, 0x915D,

+    0x533B, 0x9171, 0x9166, 0x917F, 0x8845, 0x917E, 0x917D, 0x91CA, 0x9487, 0x948C, 0x948A, 0x9489, 0x948B, 0x9488, 0x9493, 0x9490,

+    0x948F, 0x9492, 0x948E, 0x9497, 0x948D, 0x9495, 0x94AF, 0x94AB, 0x9498, 0x94AD, 0x94A0, 0x949D, 0x94A4, 0x94A3, 0x949E, 0x94AE,

+    0x94A7, 0x9499, 0x949B, 0x94AA, 0x94CC, 0x94C8, 0x94B6, 0x94C3, 0x94B4, 0x94B9, 0x94CD, 0x94B0, 0x94B8, 0x94C0, 0x94BF, 0x94BE,

+    0x949C, 0x94CA, 0x94C9, 0x94C7, 0x94CB, 0x94C2, 0x94B3, 0x94C6, 0x94C5, 0x94BA, 0x94A9, 0x94B2, 0x94BC, 0x94BD, 0x94CF, 0x94F0,

+    0x94D2, 0x94EC, 0x94EA, 0x94F6, 0x94F3, 0x94DC, 0x94DA, 0x94E3, 0x94E8, 0x94E2, 0x94ED, 0x94EB, 0x94E6, 0x8854, 0x94D1, 0x94F7,

+    0x94F1, 0x94DF, 0x94F5, 0x94D5, 0x94EF, 0x94D0, 0x9510, 0x9500, 0x9508, 0x9511, 0x9509, 0x94DD, 0x9512, 0x950C, 0x94A1, 0x94E4,

+    0x94D7, 0x950B, 0x950A, 0x9513, 0x9504, 0x9503, 0x9514, 0x9507, 0x94D3, 0x94FA, 0x94D6, 0x9506, 0x9502, 0x952F, 0x94A2, 0x951E,

+    0x5F55, 0x9516, 0x9529, 0x94D4, 0x9525, 0x9515, 0x951F, 0x9524, 0x9531, 0x94EE, 0x951B, 0x952C, 0x952D, 0x951C, 0x94B1, 0x9526,

+    0x951A, 0x9520, 0x9521, 0x9522, 0x9519, 0x9530, 0x8868, 0x94FC, 0x9528, 0x9494, 0x9534, 0x94FE, 0x9505, 0x9540, 0x9537, 0x94E1,

+    0x9496, 0x953B, 0x953D, 0x9538, 0x9532, 0x9539, 0x953E, 0x952E, 0x9536, 0x9517, 0x953A, 0x9541, 0x9551, 0x9555, 0x9501, 0x9549,

+    0x9548, 0x9543, 0x94A8, 0x84E5, 0x954F, 0x94E0, 0x94E9, 0x953C, 0x9550, 0x9547, 0x9552, 0x954D, 0x9553, 0x955E, 0x955F, 0x94FE,

+    0x9546, 0x9559, 0x9560, 0x955D, 0x94FF, 0x9535, 0x9557, 0x9558, 0x955B, 0x94F2, 0x955C, 0x9556, 0x9542, 0x933E, 0x955A, 0x94E7,

+    0x956A, 0x9508, 0x94D9, 0x9563, 0x9566, 0x9561, 0x949F, 0x956B, 0x950F, 0x9544, 0x954C, 0x9570, 0x956F, 0x956D, 0x94C1, 0x956E,

+    0x94CE, 0x94DB, 0x9571, 0x94F8, 0x956C, 0x9554, 0x9274, 0x9527, 0x9574, 0x94C4, 0x9573, 0x9567, 0x94A5, 0x9575, 0x9576, 0x954A,

+    0x9569, 0x9523, 0x94BB, 0x92AE, 0x51FF, 0x957F, 0x95E8, 0x95E9, 0x95EA, 0x95EB, 0x95EC, 0x95ED, 0x5F00, 0x95F6, 0x95F3, 0x95F0,

+    0x95F2, 0x95F4, 0x95F5, 0x95F8, 0x9602, 0x9601, 0x9600, 0x95FA, 0x95FD, 0x9603, 0x9606, 0x95FE, 0x9605, 0x960A, 0x9609, 0x960E,

+    0x960F, 0x960D, 0x9608, 0x960C, 0x9612, 0x677F, 0x6697, 0x95F1, 0x9614, 0x9615, 0x9611, 0x9617, 0x9618, 0x95FF, 0x9616, 0x9619,

+    0x95EF, 0x5173, 0x961A, 0x9613, 0x9610, 0x8F9F, 0x961B, 0x95FC, 0x9649, 0x9655, 0x9635, 0x9634, 0x9648, 0x9646, 0x9633, 0x9667,

+    0x961F, 0x9636, 0x9668, 0x9645, 0x968F, 0x9669, 0x9690, 0x9647, 0x96B6, 0x53EA, 0x96BD, 0x867D, 0x53CC, 0x96CF, 0x6742, 0x9E21,

+    0x79BB, 0x96BE, 0x4E91, 0x7535, 0x9721, 0x96FE, 0x9701, 0x96F3, 0x972D, 0x53C7, 0x7075, 0x53C6, 0x9753, 0x9759, 0x817C, 0x9765,

+    0x9F17, 0x5DE9, 0x979F, 0x7F30, 0x9791, 0x97AF, 0x97E6, 0x97E7, 0x97E9, 0x97EA, 0x97EC, 0x97EB, 0x97F5, 0x54CD, 0x9875, 0x9876,

+    0x9877, 0x9879, 0x987A, 0x9878, 0x987B, 0x987C, 0x9882, 0x9880, 0x9883, 0x9884, 0x987D, 0x9881, 0x987F, 0x9887, 0x9886, 0x988C,

+    0x9889, 0x9890, 0x988F, 0x5934, 0x988A, 0x988B, 0x9894, 0x9888, 0x9893, 0x9891, 0x9897, 0x9898, 0x989D, 0x989A, 0x989C, 0x9899,

+    0x989B, 0x613F, 0x98A1, 0x98A0, 0x7C7B, 0x989F, 0x98A2, 0x987E, 0x98A4, 0x98A5, 0x663E, 0x98A6, 0x9885, 0x989E, 0x98A7, 0x98CE,

+    0x98D0, 0x98D1, 0x98D2, 0x53F0, 0x98D3, 0x98D4, 0x98CF, 0x98D6, 0x98D5, 0x98D7, 0x98D8, 0x98D9, 0x98DE, 0x9965, 0x9964, 0x9966,

+    0x9968, 0x996A, 0x996B, 0x996C, 0x996D, 0x996E, 0x9974, 0x9972, 0x9971, 0x9970, 0x9973, 0x997A, 0x9978, 0x997C, 0x9977, 0x517B,

+    0x9975, 0x9979, 0x997D, 0x9981, 0x997F, 0x997E, 0x4F59, 0x80B4, 0x9984, 0x9983, 0x996F, 0x9985, 0x9986, 0x7CC7, 0x9967, 0x5582,

+    0x9989, 0x998E, 0x9969, 0x998F, 0x998A, 0x998C, 0x998D, 0x9992, 0x9990, 0x9991, 0x9988, 0x9994, 0x9976, 0x98E8, 0x990D, 0x998B,

+    0x9A6C, 0x9A6D, 0x51AF, 0x9A6E, 0x9A70, 0x9A6F, 0x9A73, 0x9A7B, 0x9A7D, 0x9A79, 0x9A75, 0x9A7E, 0x9A80, 0x9A78, 0x9A76, 0x9A7C,

+    0x9A77, 0x9A88, 0x9A87, 0x9A83, 0x9A86, 0x9A8E, 0x9A8F, 0x9A8B, 0x9A8D, 0x9A93, 0x9A92, 0x9A91, 0x9A90, 0x9A9B, 0x9A97, 0x9A99,

+    0x9A9E, 0x9A98, 0x9A9D, 0x817E, 0x9A7A, 0x9A9A, 0x9A9F, 0x9AA1, 0x84E6, 0x9A9C, 0x9A96, 0x9AA0, 0x9AA2, 0x9A71, 0x9A85, 0x9A95,

+    0x9A81, 0x9A84, 0x9A8C, 0x60CA, 0x9A7F, 0x9AA4, 0x9A74, 0x9AA7, 0x9AA5, 0x9AA6, 0x9A8A, 0x80AE, 0x9AC5, 0x810F, 0x4F53, 0x9ACC,

+    0x9ACB, 0x53D1, 0x677E, 0x80E1, 0x9B13, 0x6597, 0x95F9, 0x960B, 0x9604, 0x90C1, 0x9B49, 0x9B47, 0x9C7C, 0x9C80, 0x9C81, 0x9C82,

+    0x9C7F, 0x9C85, 0x9C86, 0x9C8F, 0x9C87, 0x9C90, 0x9C8D, 0x9C8B, 0x9C8A, 0x9C92, 0x9C95, 0x9C96, 0x9C94, 0x9C9B, 0x9C91, 0x9C9C,

+    0x9CA7, 0x9CA0, 0x9CA9, 0x9CA4, 0x9CA8, 0x9CBB, 0x9CAF, 0x9CAD, 0x9C9E, 0x9CB7, 0x9CB4, 0x9CB1, 0x9CB5, 0x9CB2, 0x9CB3, 0x9CB8,

+    0x9CAE, 0x9CB0, 0x9CB6, 0x9CAB, 0x9CCA, 0x9C97, 0x9CBD, 0x9CC7, 0x9CC5, 0x9CC6, 0x9CC3, 0x9CD2, 0x9CD1, 0x9CA5, 0x9CCF, 0x9CCE,

+    0x9CD0, 0x9CCD, 0x9CC1, 0x9CA2, 0x9CCC, 0x9CA6, 0x9CA3, 0x9CB9, 0x9CD7, 0x9CD4, 0x9CC9, 0x9CD5, 0x9CD6, 0x9CDF, 0x9CDD, 0x9CDC,

+    0x9CDE, 0x9C9F, 0x9CBC, 0x9C8E, 0x9C99, 0x9CE3, 0x9CE2, 0x9C9A, 0x9CC4, 0x9C88, 0x9CA1, 0x9E1F, 0x51EB, 0x9E20, 0x9E24, 0x51E4,

+    0x9E23, 0x9E22, 0x9E29, 0x9E28, 0x9E26, 0x9E30, 0x9E35, 0x9E33, 0x9E32, 0x9E2E, 0x9E31, 0x9E2A, 0x9E2F, 0x9E2D, 0x9E38, 0x9E39,

+    0x9E3B, 0x9E3F, 0x9E3D, 0x9E3A, 0x9E43, 0x9E46, 0x9E41, 0x9E48, 0x9E45, 0x9E44, 0x9E49, 0x9E4C, 0x9E4F, 0x9E4E, 0x9E4A, 0x9E53,

+    0x9E2B, 0x9E51, 0x9E4B, 0x9E59, 0x9E55, 0x9E57, 0x9E56, 0x9E4D, 0x9E5B, 0x9E5C, 0x83BA, 0x9E5F, 0x9E64, 0x9E60, 0x9E61, 0x9E58,

+    0x9E63, 0x9E5A, 0x9E62, 0x9E5E, 0x9E67, 0x9E65, 0x9E25, 0x9E37, 0x9E68, 0x9E36, 0x9E6A, 0x9E54, 0x9E69, 0x9E6B, 0x9E47, 0x9E6C,

+    0x9E70, 0x9E6D, 0x9E6F, 0x9E2C, 0x9E74, 0x9E66, 0x9E73, 0x9E42, 0x9E3E, 0x5364, 0x9E7E, 0x7877, 0x76D0, 0x4E3D, 0x9EA6, 0x9EB8,

+    0x9EB9, 0x9762, 0x4E48, 0x9EC4, 0x9EC9, 0x70B9, 0x515A, 0x9709, 0x9EE1, 0x9EE9, 0x9EFE, 0x9F0B, 0x9F0D, 0x9F39, 0x9F50, 0x658B,

+    0x8D4D, 0x9F51, 0x9F7F, 0x9F80, 0x9F81, 0x9F85, 0x9F87, 0x9F83, 0x9F86, 0x9F84, 0x9F88, 0x9F8A, 0x9F89, 0x9F8B, 0x9F8C, 0x9F99,

+    0x5390, 0x5E9E, 0x9F9A, 0x9F9B, 0x9F9F, 0xA76F, 0x8C48, 0x66F4, 0x8ECA, 0x8CC8, 0x6ED1, 0x4E32, 0x53E5, 0x9F9C, 0x9F9C, 0x5951,

+    0x91D1, 0x5587, 0x5948, 0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0x6A02, 0x6D1B, 0x70D9, 0x73DE, 0x843D, 0x916A,

+    0x99F1, 0x4E82, 0x5375, 0x6B04, 0x721B, 0x862D, 0x9E1E, 0x5D50, 0x6FEB, 0x85CD, 0x8964, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717,

+    0x6D6A, 0x72FC, 0x90CE, 0x4F86, 0x51B7, 0x52DE, 0x64C4, 0x6AD3, 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, 0x8DEF, 0x9732, 0x9B6F,

+    0x9DFA, 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x8AD6, 0x58DF, 0x5F04, 0x7C60, 0x807E, 0x7262, 0x78CA, 0x8CC2, 0x96F7,

+    0x58D8, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x7D2F, 0x7E37, 0x964B, 0x52D2, 0x808B, 0x51DC, 0x51CC, 0x7A1C, 0x7DBE, 0x83F1, 0x9675,

+    0x8B80, 0x62CF, 0x6A02, 0x8AFE, 0x4E39, 0x5BE7, 0x6012, 0x7387, 0x7570, 0x5317, 0x78FB, 0x4FBF, 0x5FA9, 0x4E0D, 0x6CCC, 0x6578,

+    0x7D22, 0x53C3, 0x585E, 0x7701, 0x8449, 0x8AAA, 0x6BBA, 0x8FB0, 0x6C88, 0x62FE, 0x82E5, 0x63A0, 0x7565, 0x4EAE, 0x5169, 0x51C9,

+    0x6881, 0x7CE7, 0x826F, 0x8AD2, 0x91CF, 0x52F5, 0x5442, 0x5973, 0x5EEC, 0x65C5, 0x6FFE, 0x792A, 0x95AD, 0x9A6A, 0x9E97, 0x9ECE,

+    0x529B, 0x66C6, 0x6B77, 0x8F62, 0x5E74, 0x6190, 0x6200, 0x649A, 0x6F23, 0x7149, 0x7489, 0x79CA, 0x7DF4, 0x806F, 0x8F26, 0x84EE,

+    0x9023, 0x934A, 0x5217, 0x52A3, 0x54BD, 0x70C8, 0x88C2, 0x8AAA, 0x5EC9, 0x5FF5, 0x637B, 0x6BAE, 0x7C3E, 0x7375, 0x4EE4, 0x56F9,

+    0x5BE7, 0x5DBA, 0x601C, 0x73B2, 0x7469, 0x7F9A, 0x8046, 0x9234, 0x96F6, 0x9748, 0x9818, 0x4F8B, 0x79AE, 0x91B4, 0x96B8, 0x60E1,

+    0x4E86, 0x50DA, 0x5BEE, 0x5C3F, 0x6599, 0x6A02, 0x71CE, 0x7642, 0x84FC, 0x907C, 0x9F8D, 0x6688, 0x962E, 0x5289, 0x677B, 0x67F3,

+    0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7D10, 0x985E, 0x516D, 0x622E, 0x9678, 0x502B, 0x5D19, 0x6DEA, 0x8F2A, 0x5F8B, 0x6144,

+    0x6817, 0x7387, 0x9686, 0x5229, 0x540F, 0x5C65, 0x6613, 0x674E, 0x68A8, 0x6CE5, 0x7406, 0x75E2, 0x7F79, 0x88CF, 0x88E1, 0x91CC,

+    0x96E2, 0x533F, 0x6EBA, 0x541D, 0x71D0, 0x7498, 0x85FA, 0x96A3, 0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x81E8, 0x7ACB, 0x7B20, 0x7C92,

+    0x72C0, 0x7099, 0x8B58, 0x4EC0, 0x8336, 0x523A, 0x5207, 0x5EA6, 0x62D3, 0x7CD6, 0x5B85, 0x6D1E, 0x66B4, 0x8F3B, 0x884C, 0x964D,

+    0x898B, 0x5ED3, 0x5140, 0x55C0, 0x585A, 0x6674, 0x51DE, 0x732A, 0x76CA, 0x793C, 0x795E, 0x7965, 0x798F, 0x9756, 0x7CBE, 0x7FBD,

+    0x8612, 0x8AF8, 0x9038, 0x90FD, 0x98EF, 0x98FC, 0x9928, 0x9DB4, 0x4FAE, 0x50E7, 0x514D, 0x52C9, 0x52E4, 0x5351, 0x559D, 0x5606,

+    0x5668, 0x5840, 0x58A8, 0x5C64, 0x5C6E, 0x6094, 0x6168, 0x618E, 0x61F2, 0x654F, 0x65E2, 0x6691, 0x6885, 0x6D77, 0x6E1A, 0x6F22,

+    0x716E, 0x722B, 0x7422, 0x7891, 0x793E, 0x7949, 0x7948, 0x7950, 0x7956, 0x795D, 0x798D, 0x798E, 0x7A40, 0x7A81, 0x7BC0, 0x7DF4,

+    0x7E09, 0x7E41, 0x7F72, 0x8005, 0x81ED, 0x8279, 0x8279, 0x8457, 0x8910, 0x8996, 0x8B01, 0x8B39, 0x8CD3, 0x8D08, 0x8FB6, 0x9038,

+    0x96E3, 0x97FF, 0x983B, 0x6075, 0x8218, 0x4E26, 0x51B5, 0x5168, 0x4F80, 0x5145, 0x5180, 0x52C7, 0x52FA, 0x559D, 0x5555, 0x5599,

+    0x55E2, 0x585A, 0x58B3, 0x5944, 0x5954, 0x5A62, 0x5B28, 0x5ED2, 0x5ED9, 0x5F69, 0x5FAD, 0x60D8, 0x614E, 0x6108, 0x618E, 0x6160,

+    0x61F2, 0x6234, 0x63C4, 0x641C, 0x6452, 0x6556, 0x6674, 0x6717, 0x671B, 0x6756, 0x6B79, 0x6BBA, 0x6D41, 0x6EDB, 0x6ECB, 0x6F22,

+    0x701E, 0x716E, 0x77A7, 0x7235, 0x72AF, 0x732A, 0x7471, 0x7506, 0x753B, 0x761D, 0x761F, 0x76CA, 0x76DB, 0x76F4, 0x774A, 0x7740,

+    0x78CC, 0x7AB1, 0x7BC0, 0x7C7B, 0x7D5B, 0x7DF4, 0x7F3E, 0x8005, 0x8352, 0x83EF, 0x8779, 0x8941, 0x8986, 0x8996, 0x8ABF, 0x8AF8,

+    0x8ACB, 0x8B01, 0x8AFE, 0x8AED, 0x8B39, 0x8B8A, 0x8D08, 0x8F38, 0x9072, 0x9199, 0x9276, 0x967C, 0x96E3, 0x9756, 0x97DB, 0x97FF,

+    0x980B, 0x983B, 0x9B12, 0x9F9C, 0x3B9D, 0x4018, 0x4039, 0x9F43, 0x9F8E, 0x05E2, 0x05D0, 0x05D3, 0x05D4, 0x05DB, 0x05DC, 0x05DD,

+    0x05E8, 0x05EA, 0x002B, 0x0671, 0x0671, 0x067B, 0x067B, 0x067B, 0x067B, 0x067E, 0x067E, 0x067E, 0x067E, 0x0680, 0x0680, 0x0680,

+    0x0680, 0x067A, 0x067A, 0x067A, 0x067A, 0x067F, 0x067F, 0x067F, 0x067F, 0x0679, 0x0679, 0x0679, 0x0679, 0x06A4, 0x06A4, 0x06A4,

+    0x06A4, 0x06A6, 0x06A6, 0x06A6, 0x06A6, 0x0684, 0x0684, 0x0684, 0x0684, 0x0683, 0x0683, 0x0683, 0x0683, 0x0686, 0x0686, 0x0686,

+    0x0686, 0x0687, 0x0687, 0x0687, 0x0687, 0x068D, 0x068D, 0x068C, 0x068C, 0x068E, 0x068E, 0x0688, 0x0688, 0x0698, 0x0698, 0x0691,

+    0x0691, 0x06A9, 0x06A9, 0x06A9, 0x06A9, 0x06AF, 0x06AF, 0x06AF, 0x06AF, 0x06B3, 0x06B3, 0x06B3, 0x06B3, 0x06B1, 0x06B1, 0x06B1,

+    0x06B1, 0x06BA, 0x06BA, 0x06BB, 0x06BB, 0x06BB, 0x06BB, 0x06C0, 0x06C0, 0x06C1, 0x06C1, 0x06C1, 0x06C1, 0x06BE, 0x06BE, 0x06BE,

+    0x06BE, 0x06D2, 0x06D2, 0x06D3, 0x06D3, 0x06AD, 0x06AD, 0x06AD, 0x06AD, 0x06C7, 0x06C7, 0x06C6, 0x06C6, 0x06C8, 0x06C8, 0x0677,

+    0x06CB, 0x06CB, 0x06C5, 0x06C5, 0x06C9, 0x06C9, 0x06D0, 0x06D0, 0x06D0, 0x06D0, 0x0649, 0x0649, 0x06CC, 0x06CC, 0x06CC, 0x06CC,

+    0x002C, 0x3001, 0x3002, 0x003A, 0x003B, 0x0021, 0x003F, 0x3016, 0x3017, 0x2026, 0x2025, 0x2014, 0x2013, 0x005F, 0x005F, 0x0028,

+    0x0029, 0x007B, 0x007D, 0x3014, 0x3015, 0x3010, 0x3011, 0x300A, 0x300B, 0x3008, 0x3009, 0x300C, 0x300D, 0x300E, 0x300F, 0x005B,

+    0x005D, 0x203E, 0x203E, 0x203E, 0x203E, 0x005F, 0x005F, 0x005F, 0x002C, 0x3001, 0x002E, 0x003B, 0x003A, 0x003F, 0x0021, 0x2014,

+    0x0028, 0x0029, 0x007B, 0x007D, 0x3014, 0x3015, 0x0023, 0x0026, 0x002A, 0x002B, 0x002D, 0x003C, 0x003E, 0x003D, 0x005C, 0x0024,

+    0x0025, 0x0040, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x0651, 0x0652, 0x0621, 0x0622, 0x0622, 0x0623, 0x0623, 0x0624,

+    0x0624, 0x0625, 0x0625, 0x0626, 0x0626, 0x0626, 0x0626, 0x0627, 0x0627, 0x0628, 0x0628, 0x0628, 0x0628, 0x0629, 0x0629, 0x062A,

+    0x062A, 0x062A, 0x062A, 0x062B, 0x062B, 0x062B, 0x062B, 0x062C, 0x062C, 0x062C, 0x062C, 0x062D, 0x062D, 0x062D, 0x062D, 0x062E,

+    0x062E, 0x062E, 0x062E, 0x062F, 0x062F, 0x0630, 0x0630, 0x0631, 0x0631, 0x0632, 0x0632, 0x0633, 0x0633, 0x0633, 0x0633, 0x0634,

+    0x0634, 0x0634, 0x0634, 0x0635, 0x0635, 0x0635, 0x0635, 0x0636, 0x0636, 0x0636, 0x0636, 0x0637, 0x0637, 0x0637, 0x0637, 0x0638,

+    0x0638, 0x0638, 0x0638, 0x0639, 0x0639, 0x0639, 0x0639, 0x063A, 0x063A, 0x063A, 0x063A, 0x0641, 0x0641, 0x0641, 0x0641, 0x0642,

+    0x0642, 0x0642, 0x0642, 0x0643, 0x0643, 0x0643, 0x0643, 0x0644, 0x0644, 0x0644, 0x0644, 0x0645, 0x0645, 0x0645, 0x0645, 0x0646,

+    0x0646, 0x0646, 0x0646, 0x0647, 0x0647, 0x0647, 0x0647, 0x0648, 0x0648, 0x0649, 0x0649, 0x064A, 0x064A, 0x064A, 0x064A, 0x0021,

+    0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,

+    0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,

+    0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,

+    0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,

+    0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,

+    0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2985, 0x2986, 0x3002,

+    0x300C, 0x300D, 0x3001, 0x30FB, 0x30F2, 0x30A1, 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3, 0x30FC, 0x30A2,

+    0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1,

+    0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0,

+    0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F3, 0x3099, 0x309A, 0x3164, 0x3131,

+    0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141,

+    0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A, 0x314B, 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, 0x3151,

+    0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315A, 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, 0x3160, 0x3161,

+    0x3162, 0x3163, 0x00A2, 0x00A3, 0x00AC, 0x00AF, 0x00A6, 0x00A5, 0x20A9, 0x2502, 0x2190, 0x2191, 0x2192, 0x2193, 0x25A0, 0x25CB

+};

+extern const FX_WCHAR g_UnicodeData_Normalization_Map2[1724] = {

+    0x004F, 0x0045, 0x0054, 0x004D, 0x006F, 0x0065, 0x0049, 0x004A, 0x0069, 0x006A, 0x004F, 0x0045, 0x006F, 0x0065, 0x0044, 0x017D,

+    0x0044, 0x017E, 0x0064, 0x017E, 0x004C, 0x004A, 0x004C, 0x006A, 0x006C, 0x006A, 0x004E, 0x004A, 0x004E, 0x006A, 0x006E, 0x006A,

+    0x0044, 0x005A, 0x0044, 0x007A, 0x0064, 0x007A, 0x0064, 0x0062, 0x0071, 0x0070, 0x004F, 0x0045, 0x0064, 0x007A, 0x0064, 0x0292,

+    0x0064, 0x007A, 0x0074, 0x0073, 0x0074, 0x0283, 0x0074, 0x0063, 0x0066, 0x014B, 0x006C, 0x0073, 0x006C, 0x007A, 0x041D, 0x0413,

+    0x043D, 0x0433, 0x0422, 0x0426, 0x0442, 0x0446, 0x0410, 0x0415, 0x0430, 0x0435, 0x0565, 0x0582, 0x0627, 0x0674, 0x0648, 0x0674,

+    0x06C7, 0x0674, 0x064A, 0x0674, 0x06D5, 0x0654, 0x06C1, 0x0654, 0x06D2, 0x0654, 0x0928, 0x093C, 0x0930, 0x093C, 0x0933, 0x093C,

+    0x0915, 0x093C, 0x0916, 0x093C, 0x0917, 0x093C, 0x091C, 0x093C, 0x0921, 0x093C, 0x0922, 0x093C, 0x092B, 0x093C, 0x092F, 0x093C,

+    0x09C7, 0x09BE, 0x09C7, 0x09D7, 0x09A1, 0x09BC, 0x09A2, 0x09BC, 0x09AF, 0x09BC, 0x0A32, 0x0A3C, 0x0A38, 0x0A3C, 0x0A16, 0x0A3C,

+    0x0A17, 0x0A3C, 0x0A1C, 0x0A3C, 0x0A2B, 0x0A3C, 0x0B47, 0x0B56, 0x0B47, 0x0B3E, 0x0B47, 0x0B57, 0x0B21, 0x0B3C, 0x0B22, 0x0B3C,

+    0x0B92, 0x0BD7, 0x0BC6, 0x0BBE, 0x0BC7, 0x0BBE, 0x0BC6, 0x0BD7, 0x0C46, 0x0C56, 0x0CBF, 0x0CD5, 0x0CC6, 0x0CD5, 0x0CC6, 0x0CD6,

+    0x0CC6, 0x0CC2, 0x0CCA, 0x0CD5, 0x0D46, 0x0D3E, 0x0D47, 0x0D3E, 0x0D46, 0x0D57, 0x0DD9, 0x0DCA, 0x0DD9, 0x0DCF, 0x0DDC, 0x0DCA,

+    0x0DD9, 0x0DDF, 0x0E4D, 0x0E32, 0x0ECD, 0x0EB2, 0x0EAB, 0x0E99, 0x0EAB, 0x0EA1, 0x0F42, 0x0FB7, 0x0F4C, 0x0FB7, 0x0F51, 0x0FB7,

+    0x0F56, 0x0FB7, 0x0F5B, 0x0FB7, 0x0F40, 0x0FB5, 0x0F71, 0x0F72, 0x0F71, 0x0F74, 0x0FB2, 0x0F80, 0x0FB2, 0x0F81, 0x0FB3, 0x0F80,

+    0x0FB3, 0x0F81, 0x0F71, 0x0F80, 0x0F92, 0x0FB7, 0x0F9C, 0x0FB7, 0x0FA1, 0x0FB7, 0x0FA6, 0x0FB7, 0x0FAB, 0x0FB7, 0x0F90, 0x0FB5,

+    0x1025, 0x102E, 0x1B05, 0x1B35, 0x1B07, 0x1B35, 0x1B09, 0x1B35, 0x1B0B, 0x1B35, 0x1B0D, 0x1B35, 0x1B11, 0x1B35, 0x1B3A, 0x1B35,

+    0x1B3C, 0x1B35, 0x1B3E, 0x1B35, 0x1B3F, 0x1B35, 0x1B42, 0x1B35, 0x0074, 0x0068, 0x002E, 0x002E, 0x2032, 0x2032, 0x2035, 0x2035,

+    0x0021, 0x0021, 0x0020, 0x0305, 0x003F, 0x003F, 0x003F, 0x0021, 0x0021, 0x003F, 0x0052, 0x0073, 0x00B0, 0x0043, 0x00B0, 0x0046,

+    0x004E, 0x006F, 0x0053, 0x004D, 0x0054, 0x004D, 0x0031, 0x002F, 0x0049, 0x0049, 0x0049, 0x0056, 0x0056, 0x0049, 0x0049, 0x0058,

+    0x0058, 0x0049, 0x0069, 0x0069, 0x0069, 0x0076, 0x0076, 0x0069, 0x0069, 0x0078, 0x0078, 0x0069, 0x2190, 0x0338, 0x2192, 0x0338,

+    0x2194, 0x0338, 0x21D0, 0x0338, 0x21D4, 0x0338, 0x21D2, 0x0338, 0x2223, 0x0338, 0x2225, 0x0338, 0x222B, 0x222B, 0x222E, 0x222E,

+    0x223C, 0x0338, 0x2243, 0x0338, 0x2245, 0x0338, 0x2248, 0x0338, 0x003D, 0x002F, 0x2261, 0x002F, 0x224D, 0x002F, 0x003C, 0x002F,

+    0x003E, 0x002F, 0x2264, 0x002F, 0x2265, 0x002F, 0x2272, 0x002F, 0x2273, 0x002F, 0x2276, 0x002F, 0x2277, 0x002F, 0x227A, 0x002F,

+    0x227B, 0x002F, 0x2282, 0x002F, 0x2283, 0x002F, 0x2286, 0x002F, 0x2287, 0x002F, 0x22A2, 0x002F, 0x22A8, 0x002F, 0x22A9, 0x002F,

+    0x22AB, 0x002F, 0x227C, 0x002F, 0x227D, 0x002F, 0x2291, 0x002F, 0x2292, 0x002F, 0x22B2, 0x002F, 0x22B3, 0x002F, 0x22B4, 0x002F,

+    0x22B5, 0x002F, 0x0042, 0x0053, 0x0048, 0x0054, 0x004C, 0x0046, 0x0056, 0x0054, 0x0046, 0x0046, 0x0043, 0x0052, 0x0053, 0x0053,

+    0x0053, 0x0049, 0x0045, 0x004D, 0x0046, 0x0053, 0x0047, 0x0053, 0x0052, 0x0053, 0x0055, 0x0053, 0x0053, 0x0050, 0x0031, 0x0030,

+    0x0031, 0x0031, 0x0031, 0x0032, 0x0031, 0x0033, 0x0031, 0x0034, 0x0031, 0x0035, 0x0031, 0x0036, 0x0031, 0x0037, 0x0031, 0x0038,

+    0x0031, 0x0039, 0x0032, 0x0030, 0x0031, 0x002E, 0x0032, 0x002E, 0x0033, 0x002E, 0x0034, 0x002E, 0x0035, 0x002E, 0x0036, 0x002E,

+    0x0037, 0x002E, 0x0038, 0x002E, 0x0039, 0x002E, 0x0031, 0x0031, 0x0031, 0x0032, 0x0031, 0x0033, 0x0031, 0x0034, 0x0031, 0x0035,

+    0x0031, 0x0036, 0x0031, 0x0037, 0x0031, 0x0038, 0x0031, 0x0039, 0x0032, 0x0030, 0x0031, 0x0030, 0x0031, 0x0030, 0x0031, 0x0030,

+    0x0031, 0x0030, 0x003D, 0x003D, 0x2ADD, 0x002F, 0x304B, 0x3099, 0x304D, 0x3099, 0x304F, 0x3099, 0x3051, 0x3099, 0x3053, 0x3099,

+    0x3055, 0x3099, 0x3057, 0x3099, 0x3059, 0x3099, 0x305B, 0x3099, 0x305D, 0x3099, 0x305F, 0x3099, 0x3061, 0x3099, 0x3064, 0x3099,

+    0x3066, 0x3099, 0x3068, 0x3099, 0x306F, 0x3099, 0x306F, 0x309A, 0x3072, 0x3099, 0x3072, 0x309A, 0x3075, 0x3099, 0x3075, 0x309A,

+    0x3078, 0x3099, 0x3078, 0x309A, 0x307B, 0x3099, 0x307B, 0x309A, 0x3046, 0x3099, 0x0020, 0x3099, 0x0020, 0x309A, 0x309D, 0x3099,

+    0x3088, 0x308A, 0x30AB, 0x3099, 0x30AD, 0x3099, 0x30AF, 0x3099, 0x30B1, 0x3099, 0x30B3, 0x3099, 0x30B5, 0x3099, 0x30B7, 0x3099,

+    0x30B9, 0x3099, 0x30BB, 0x3099, 0x30BD, 0x3099, 0x30BF, 0x3099, 0x30C1, 0x3099, 0x30C4, 0x3099, 0x30C6, 0x3099, 0x30C8, 0x3099,

+    0x30CF, 0x3099, 0x30CF, 0x309A, 0x30D2, 0x3099, 0x30D2, 0x309A, 0x30D5, 0x3099, 0x30D5, 0x309A, 0x30D8, 0x3099, 0x30D8, 0x309A,

+    0x30DB, 0x3099, 0x30DB, 0x309A, 0x30A6, 0x3099, 0x30EF, 0x3099, 0x30F0, 0x3099, 0x30F1, 0x3099, 0x30F2, 0x3099, 0x30FD, 0x3099,

+    0x30B3, 0x30C8, 0x0032, 0x0031, 0x0032, 0x0032, 0x0032, 0x0033, 0x0032, 0x0034, 0x0032, 0x0035, 0x0032, 0x0036, 0x0032, 0x0037,

+    0x0032, 0x0038, 0x0032, 0x0039, 0x0033, 0x0030, 0x0033, 0x0031, 0x0033, 0x0032, 0x0033, 0x0033, 0x0033, 0x0034, 0x0033, 0x0035,

+    0x1100, 0x1161, 0x1102, 0x1161, 0x1103, 0x1161, 0x1105, 0x1161, 0x1106, 0x1161, 0x1107, 0x1161, 0x1109, 0x1161, 0x110B, 0x1161,

+    0x110C, 0x1161, 0x110E, 0x1161, 0x110F, 0x1161, 0x1110, 0x1161, 0x1111, 0x1161, 0x1112, 0x1161, 0x110B, 0x116E, 0x0033, 0x0036,

+    0x0033, 0x0037, 0x0033, 0x0038, 0x0033, 0x0039, 0x0034, 0x0030, 0x0034, 0x0031, 0x0034, 0x0032, 0x0034, 0x0033, 0x0034, 0x0034,

+    0x0034, 0x0035, 0x0034, 0x0036, 0x0034, 0x0037, 0x0034, 0x0038, 0x0034, 0x0039, 0x0035, 0x0030, 0x0031, 0x6708, 0x0032, 0x6708,

+    0x0033, 0x6708, 0x0034, 0x6708, 0x0035, 0x6708, 0x0036, 0x6708, 0x0037, 0x6708, 0x0038, 0x6708, 0x0039, 0x6708, 0x0048, 0x0067,

+    0x0065, 0x0056, 0x30AE, 0x30AC, 0x30AD, 0x30ED, 0x30C7, 0x30B7, 0x30C9, 0x30EB, 0x30C8, 0x30F3, 0x30CA, 0x30CE, 0x30D4, 0x30B3,

+    0x30D3, 0x30EB, 0x30DA, 0x30BD, 0x30DB, 0x30F3, 0x30DF, 0x30EA, 0x30E1, 0x30AC, 0x30EA, 0x30E9, 0x30EC, 0x30E0, 0x0030, 0x70B9,

+    0x0031, 0x70B9, 0x0032, 0x70B9, 0x0033, 0x70B9, 0x0034, 0x70B9, 0x0035, 0x70B9, 0x0036, 0x70B9, 0x0037, 0x70B9, 0x0038, 0x70B9,

+    0x0039, 0x70B9, 0x0064, 0x0061, 0x0041, 0x0055, 0x006F, 0x0056, 0x0070, 0x0063, 0x0064, 0x006D, 0x0049, 0x0055, 0x5E73, 0x6210,

+    0x662D, 0x548C, 0x5927, 0x6B63, 0x660E, 0x6CBB, 0x0070, 0x0041, 0x006E, 0x0041, 0x03BC, 0x0041, 0x006D, 0x0041, 0x006B, 0x0041,

+    0x004B, 0x0042, 0x004D, 0x0042, 0x0047, 0x0042, 0x0070, 0x0046, 0x006E, 0x0046, 0x03BC, 0x0046, 0x03BC, 0x0067, 0x006D, 0x0067,

+    0x006B, 0x0067, 0x0048, 0x007A, 0x03BC, 0x2113, 0x006D, 0x2113, 0x0064, 0x2113, 0x006B, 0x2113, 0x0066, 0x006D, 0x006E, 0x006D,

+    0x03BC, 0x006D, 0x006D, 0x006D, 0x0063, 0x006D, 0x006B, 0x006D, 0x006D, 0x00B2, 0x006D, 0x00B3, 0x0050, 0x0061, 0x0070, 0x0073,

+    0x006E, 0x0073, 0x03BC, 0x0073, 0x006D, 0x0073, 0x0070, 0x0056, 0x006E, 0x0056, 0x03BC, 0x0056, 0x006D, 0x0056, 0x006B, 0x0056,

+    0x004D, 0x0056, 0x0070, 0x0057, 0x006E, 0x0057, 0x03BC, 0x0057, 0x006D, 0x0057, 0x006B, 0x0057, 0x004D, 0x0057, 0x006B, 0x03A9,

+    0x004D, 0x03A9, 0x0042, 0x0071, 0x0063, 0x0063, 0x0063, 0x0064, 0x0064, 0x0042, 0x0047, 0x0079, 0x0068, 0x0061, 0x0048, 0x0050,

+    0x0069, 0x006E, 0x004B, 0x004B, 0x004B, 0x004D, 0x006B, 0x0074, 0x006C, 0x006D, 0x006C, 0x006E, 0x006C, 0x0078, 0x006D, 0x0062,

+    0x0050, 0x0048, 0x0050, 0x0052, 0x0073, 0x0072, 0x0053, 0x0076, 0x0057, 0x0062, 0x0031, 0x65E5, 0x0032, 0x65E5, 0x0033, 0x65E5,

+    0x0034, 0x65E5, 0x0035, 0x65E5, 0x0036, 0x65E5, 0x0037, 0x65E5, 0x0038, 0x65E5, 0x0039, 0x65E5, 0x0066, 0x0066, 0x0066, 0x0069,

+    0x0066, 0x006C, 0x017F, 0x0074, 0x0073, 0x0074, 0x0574, 0x0576, 0x0574, 0x0565, 0x0574, 0x056B, 0x057E, 0x0576, 0x0574, 0x056D,

+    0x05D9, 0x05B4, 0x05F2, 0x05B7, 0x05E9, 0x05C1, 0x05E9, 0x05C2, 0xFB49, 0x05C1, 0xFB49, 0x05C2, 0x05D0, 0x05B7, 0x05D0, 0x05B8,

+    0x05D0, 0x05BC, 0x05D1, 0x05BC, 0x05D2, 0x05BC, 0x05D3, 0x05BC, 0x05D4, 0x05BC, 0x05D5, 0x05BC, 0x05D6, 0x05BC, 0x05D8, 0x05BC,

+    0x05D9, 0x05BC, 0x05DA, 0x05BC, 0x05DB, 0x05BC, 0x05DC, 0x05BC, 0x05DE, 0x05BC, 0x05E0, 0x05BC, 0x05E1, 0x05BC, 0x05E3, 0x05BC,

+    0x05E4, 0x05BC, 0x05E6, 0x05BC, 0x05E7, 0x05BC, 0x05E8, 0x05BC, 0x05E9, 0x05BC, 0x05EA, 0x05BC, 0x05D5, 0x05B9, 0x05D1, 0x05BF,

+    0x05DB, 0x05BF, 0x05E4, 0x05BF, 0x05D0, 0x05DC, 0x0626, 0x0627, 0x0626, 0x0627, 0x0626, 0x06D5, 0x0626, 0x06D5, 0x0626, 0x0648,

+    0x0626, 0x0648, 0x0626, 0x06C7, 0x0626, 0x06C7, 0x0626, 0x06C6, 0x0626, 0x06C6, 0x0626, 0x06C8, 0x0626, 0x06C8, 0x0626, 0x06D0,

+    0x0626, 0x06D0, 0x0626, 0x06D0, 0x0626, 0x0649, 0x0626, 0x0649, 0x0626, 0x0649, 0x0626, 0x062C, 0x0626, 0x062D, 0x0626, 0x0645,

+    0x0626, 0x0649, 0x0626, 0x064A, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0649, 0x0628, 0x064A,

+    0x062A, 0x062C, 0x062A, 0x062D, 0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0649, 0x062A, 0x064A, 0x062B, 0x062C, 0x062B, 0x0645,

+    0x062B, 0x0649, 0x062B, 0x064A, 0x062C, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x0645, 0x062E, 0x062C, 0x062E, 0x062D,

+    0x062E, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D, 0x0635, 0x0645, 0x0636, 0x062C,

+    0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x0645, 0x0637, 0x062D, 0x0637, 0x0645, 0x0638, 0x0645, 0x0639, 0x062C, 0x0639, 0x0645,

+    0x063A, 0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062E, 0x0641, 0x0645, 0x0641, 0x0649, 0x0641, 0x064A,

+    0x0642, 0x062D, 0x0642, 0x0645, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062E,

+    0x0643, 0x0644, 0x0643, 0x0645, 0x0643, 0x0649, 0x0643, 0x064A, 0x0644, 0x062C, 0x0644, 0x062D, 0x0644, 0x062E, 0x0644, 0x0645,

+    0x0644, 0x0649, 0x0644, 0x064A, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x0645, 0x0645, 0x0649, 0x0645, 0x064A,

+    0x0646, 0x062C, 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0649, 0x0646, 0x064A, 0x0647, 0x062C, 0x0647, 0x0645,

+    0x0647, 0x0649, 0x0647, 0x064A, 0x064A, 0x062C, 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0649, 0x064A, 0x064A,

+    0x0630, 0x0670, 0x0631, 0x0670, 0x0649, 0x0670, 0x064C, 0x0651, 0x064D, 0x0651, 0x064E, 0x0651, 0x064F, 0x0651, 0x0650, 0x0651,

+    0x0651, 0x0670, 0x0626, 0x0631, 0x0626, 0x0632, 0x0626, 0x0645, 0x0626, 0x0646, 0x0626, 0x0649, 0x0626, 0x064A, 0x0628, 0x0631,

+    0x0628, 0x0632, 0x0628, 0x0645, 0x0628, 0x0646, 0x0628, 0x0649, 0x0628, 0x064A, 0x062A, 0x0631, 0x062A, 0x0632, 0x062A, 0x0645,

+    0x062A, 0x0646, 0x062A, 0x0649, 0x062A, 0x064A, 0x062B, 0x0631, 0x062B, 0x0632, 0x062B, 0x0645, 0x062B, 0x0646, 0x062B, 0x0649,

+    0x062B, 0x064A, 0x0641, 0x0649, 0x0641, 0x064A, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, 0x0644, 0x0643, 0x0645,

+    0x0643, 0x0649, 0x0643, 0x064A, 0x0644, 0x0645, 0x0644, 0x0649, 0x0644, 0x064A, 0x0645, 0x0627, 0x0645, 0x0645, 0x0646, 0x0631,

+    0x0646, 0x0632, 0x0646, 0x0645, 0x0646, 0x0646, 0x0646, 0x0649, 0x0646, 0x064A, 0x0649, 0x0670, 0x064A, 0x0631, 0x064A, 0x0632,

+    0x064A, 0x0645, 0x064A, 0x0646, 0x064A, 0x0649, 0x064A, 0x064A, 0x0626, 0x062C, 0x0626, 0x062D, 0x0626, 0x062E, 0x0626, 0x0645,

+    0x0626, 0x0647, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0647, 0x062A, 0x062C, 0x062A, 0x062D,

+    0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0647, 0x062B, 0x0645, 0x062C, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x0645,

+    0x062E, 0x062C, 0x062E, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D, 0x0635, 0x062E,

+    0x0635, 0x0645, 0x0636, 0x062C, 0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x0645, 0x0637, 0x062D, 0x0638, 0x0645, 0x0639, 0x062C,

+    0x0639, 0x0645, 0x063A, 0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062E, 0x0641, 0x0645, 0x0642, 0x062D,

+    0x0642, 0x0645, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062E, 0x0643, 0x0644, 0x0643, 0x0645, 0x0644, 0x062C, 0x0644, 0x062D,

+    0x0644, 0x062E, 0x0644, 0x0645, 0x0644, 0x0647, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x0645, 0x0646, 0x062C,

+    0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0647, 0x0647, 0x062C, 0x0647, 0x0645, 0x0647, 0x0670, 0x064A, 0x062C,

+    0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0647, 0x0626, 0x0645, 0x0626, 0x0647, 0x0628, 0x0645, 0x0628, 0x0647,

+    0x062A, 0x0645, 0x062A, 0x0647, 0x062B, 0x0645, 0x062B, 0x0647, 0x0633, 0x0645, 0x0633, 0x0647, 0x0634, 0x0645, 0x0634, 0x0647,

+    0x0643, 0x0644, 0x0643, 0x0645, 0x0644, 0x0645, 0x0646, 0x0645, 0x0646, 0x0647, 0x064A, 0x0645, 0x064A, 0x0647, 0x0637, 0x0649,

+    0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x064A, 0x063A, 0x0649, 0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x064A, 0x0634, 0x0649,

+    0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x064A, 0x062C, 0x0649, 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A, 0x0635, 0x0649,

+    0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0631,

+    0x0633, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0637, 0x0649, 0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x064A, 0x063A, 0x0649,

+    0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x064A, 0x0634, 0x0649, 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x064A, 0x062C, 0x0649,

+    0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A, 0x0635, 0x0649, 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, 0x062C,

+    0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0631, 0x0633, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0634, 0x062C,

+    0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0633, 0x0647, 0x0634, 0x0647, 0x0637, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D,

+    0x0633, 0x062E, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0637, 0x0645, 0x0638, 0x0645, 0x0627, 0x064B, 0x0627, 0x064B,

+    0x0640, 0x064B, 0x0640, 0x064E, 0x0640, 0x064F, 0x0640, 0x0650, 0x0640, 0x0651, 0x0640, 0x0652, 0x0644, 0x0622, 0x0644, 0x0622,

+    0x0644, 0x0623, 0x0644, 0x0623, 0x0644, 0x0625, 0x0644, 0x0625, 0x0644, 0x0627, 0x0644, 0x0627

+};

+extern const FX_WCHAR g_UnicodeData_Normalization_Map3[1164] = {

+    0x0031, 0x002F, 0x0034, 0x0031, 0x002F, 0x0032, 0x0033, 0x002F, 0x0034, 0x002E, 0x002E, 0x002E, 0x2032, 0x2032, 0x2032, 0x2035,

+    0x2035, 0x2035, 0x0061, 0x002F, 0x0063, 0x0061, 0x002F, 0x0073, 0x0063, 0x002F, 0x006F, 0x0063, 0x002F, 0x0075, 0x0054, 0x0045,

+    0x004C, 0x0046, 0x0041, 0x0058, 0x0031, 0x002F, 0x0037, 0x0031, 0x002F, 0x0039, 0x0031, 0x002F, 0x0033, 0x0032, 0x002F, 0x0033,

+    0x0031, 0x002F, 0x0035, 0x0032, 0x002F, 0x0035, 0x0033, 0x002F, 0x0035, 0x0034, 0x002F, 0x0035, 0x0031, 0x002F, 0x0036, 0x0035,

+    0x002F, 0x0036, 0x0031, 0x002F, 0x0038, 0x0033, 0x002F, 0x0038, 0x0035, 0x002F, 0x0038, 0x0037, 0x002F, 0x0038, 0x0049, 0x0049,

+    0x0049, 0x0056, 0x0049, 0x0049, 0x0058, 0x0049, 0x0049, 0x0069, 0x0069, 0x0069, 0x0076, 0x0069, 0x0069, 0x0078, 0x0069, 0x0069,

+    0x0030, 0x2044, 0x0033, 0x222B, 0x222B, 0x222B, 0x222E, 0x222E, 0x222E, 0x004E, 0x0055, 0x004C, 0x0053, 0x004F, 0x0048, 0x0053,

+    0x0054, 0x0058, 0x0045, 0x0054, 0x0058, 0x0045, 0x004F, 0x0054, 0x0045, 0x004E, 0x0051, 0x0041, 0x0043, 0x004B, 0x0042, 0x0045,

+    0x004C, 0x0044, 0x004C, 0x0045, 0x0044, 0x0043, 0x0031, 0x0044, 0x0043, 0x0032, 0x0044, 0x0043, 0x0033, 0x0044, 0x0043, 0x0034,

+    0x004E, 0x0041, 0x004B, 0x0053, 0x0059, 0x004E, 0x0045, 0x0054, 0x0042, 0x0043, 0x0041, 0x004E, 0x0053, 0x0055, 0x0042, 0x0045,

+    0x0053, 0x0043, 0x0044, 0x0045, 0x004C, 0x0028, 0x0031, 0x0029, 0x0028, 0x0032, 0x0029, 0x0028, 0x0033, 0x0029, 0x0028, 0x0034,

+    0x0029, 0x0028, 0x0035, 0x0029, 0x0028, 0x0036, 0x0029, 0x0028, 0x0037, 0x0029, 0x0028, 0x0038, 0x0029, 0x0028, 0x0039, 0x0029,

+    0x0031, 0x0030, 0x002E, 0x0031, 0x0031, 0x002E, 0x0031, 0x0032, 0x002E, 0x0031, 0x0033, 0x002E, 0x0031, 0x0034, 0x002E, 0x0031,

+    0x0035, 0x002E, 0x0031, 0x0036, 0x002E, 0x0031, 0x0037, 0x002E, 0x0031, 0x0038, 0x002E, 0x0031, 0x0039, 0x002E, 0x0032, 0x0030,

+    0x002E, 0x0028, 0x0061, 0x0029, 0x0028, 0x0062, 0x0029, 0x0028, 0x0063, 0x0029, 0x0028, 0x0064, 0x0029, 0x0028, 0x0065, 0x0029,

+    0x0028, 0x0066, 0x0029, 0x0028, 0x0067, 0x0029, 0x0028, 0x0068, 0x0029, 0x0028, 0x0069, 0x0029, 0x0028, 0x006A, 0x0029, 0x0028,

+    0x006B, 0x0029, 0x0028, 0x006C, 0x0029, 0x0028, 0x006D, 0x0029, 0x0028, 0x006E, 0x0029, 0x0028, 0x006F, 0x0029, 0x0028, 0x0070,

+    0x0029, 0x0028, 0x0071, 0x0029, 0x0028, 0x0072, 0x0029, 0x0028, 0x0073, 0x0029, 0x0028, 0x0074, 0x0029, 0x0028, 0x0075, 0x0029,

+    0x0028, 0x0076, 0x0029, 0x0028, 0x0077, 0x0029, 0x0028, 0x0078, 0x0029, 0x0028, 0x0079, 0x0029, 0x0028, 0x007A, 0x0029, 0x003A,

+    0x003A, 0x003D, 0x003D, 0x003D, 0x003D, 0x0028, 0x1100, 0x0029, 0x0028, 0x1102, 0x0029, 0x0028, 0x1103, 0x0029, 0x0028, 0x1105,

+    0x0029, 0x0028, 0x1106, 0x0029, 0x0028, 0x1107, 0x0029, 0x0028, 0x1109, 0x0029, 0x0028, 0x110B, 0x0029, 0x0028, 0x110C, 0x0029,

+    0x0028, 0x110E, 0x0029, 0x0028, 0x110F, 0x0029, 0x0028, 0x1110, 0x0029, 0x0028, 0x1111, 0x0029, 0x0028, 0x1112, 0x0029, 0x0028,

+    0x4E00, 0x0029, 0x0028, 0x4E8C, 0x0029, 0x0028, 0x4E09, 0x0029, 0x0028, 0x56DB, 0x0029, 0x0028, 0x4E94, 0x0029, 0x0028, 0x516D,

+    0x0029, 0x0028, 0x4E03, 0x0029, 0x0028, 0x516B, 0x0029, 0x0028, 0x4E5D, 0x0029, 0x0028, 0x5341, 0x0029, 0x0028, 0x6708, 0x0029,

+    0x0028, 0x706B, 0x0029, 0x0028, 0x6C34, 0x0029, 0x0028, 0x6728, 0x0029, 0x0028, 0x91D1, 0x0029, 0x0028, 0x571F, 0x0029, 0x0028,

+    0x65E5, 0x0029, 0x0028, 0x682A, 0x0029, 0x0028, 0x6709, 0x0029, 0x0028, 0x793E, 0x0029, 0x0028, 0x540D, 0x0029, 0x0028, 0x7279,

+    0x0029, 0x0028, 0x8CA1, 0x0029, 0x0028, 0x795D, 0x0029, 0x0028, 0x52B4, 0x0029, 0x0028, 0x4EE3, 0x0029, 0x0028, 0x547C, 0x0029,

+    0x0028, 0x5B66, 0x0029, 0x0028, 0x76E3, 0x0029, 0x0028, 0x4F01, 0x0029, 0x0028, 0x8CC7, 0x0029, 0x0028, 0x5354, 0x0029, 0x0028,

+    0x796D, 0x0029, 0x0028, 0x4F11, 0x0029, 0x0028, 0x81EA, 0x0029, 0x0028, 0x81F3, 0x0029, 0x0050, 0x0054, 0x0045, 0x0031, 0x0030,

+    0x6708, 0x0031, 0x0031, 0x6708, 0x0031, 0x0032, 0x6708, 0x0065, 0x0072, 0x0067, 0x004C, 0x0054, 0x0044, 0x30A2, 0x30FC, 0x30EB,

+    0x30A4, 0x30F3, 0x30C1, 0x30A6, 0x30A9, 0x30F3, 0x30AA, 0x30F3, 0x30B9, 0x30AA, 0x30FC, 0x30E0, 0x30AB, 0x30A4, 0x30EA, 0x30AC,

+    0x30ED, 0x30F3, 0x30AC, 0x30F3, 0x30DE, 0x30AE, 0x30CB, 0x30FC, 0x30B0, 0x30E9, 0x30E0, 0x30B1, 0x30FC, 0x30B9, 0x30B3, 0x30EB,

+    0x30CA, 0x30B3, 0x30FC, 0x30DD, 0x30BB, 0x30F3, 0x30C1, 0x30BB, 0x30F3, 0x30C8, 0x30C0, 0x30FC, 0x30B9, 0x30CE, 0x30C3, 0x30C8,

+    0x30CF, 0x30A4, 0x30C4, 0x30D1, 0x30FC, 0x30C4, 0x30D4, 0x30AF, 0x30EB, 0x30D5, 0x30E9, 0x30F3, 0x30DA, 0x30CB, 0x30D2, 0x30D8,

+    0x30EB, 0x30C4, 0x30DA, 0x30F3, 0x30B9, 0x30DA, 0x30FC, 0x30B8, 0x30D9, 0x30FC, 0x30BF, 0x30DC, 0x30EB, 0x30C8, 0x30DD, 0x30F3,

+    0x30C9, 0x30DB, 0x30FC, 0x30EB, 0x30DB, 0x30FC, 0x30F3, 0x30DE, 0x30A4, 0x30EB, 0x30DE, 0x30C3, 0x30CF, 0x30DE, 0x30EB, 0x30AF,

+    0x30E4, 0x30FC, 0x30C9, 0x30E4, 0x30FC, 0x30EB, 0x30E6, 0x30A2, 0x30F3, 0x30EB, 0x30D4, 0x30FC, 0x30EF, 0x30C3, 0x30C8, 0x0031,

+    0x0030, 0x70B9, 0x0031, 0x0031, 0x70B9, 0x0031, 0x0032, 0x70B9, 0x0031, 0x0033, 0x70B9, 0x0031, 0x0034, 0x70B9, 0x0031, 0x0035,

+    0x70B9, 0x0031, 0x0036, 0x70B9, 0x0031, 0x0037, 0x70B9, 0x0031, 0x0038, 0x70B9, 0x0031, 0x0039, 0x70B9, 0x0032, 0x0030, 0x70B9,

+    0x0032, 0x0031, 0x70B9, 0x0032, 0x0032, 0x70B9, 0x0032, 0x0033, 0x70B9, 0x0032, 0x0034, 0x70B9, 0x0068, 0x0050, 0x0061, 0x0062,

+    0x0061, 0x0072, 0x0064, 0x006D, 0x00B2, 0x0064, 0x006D, 0x00B3, 0x0063, 0x0061, 0x006C, 0x006B, 0x0048, 0x007A, 0x004D, 0x0048,

+    0x007A, 0x0047, 0x0048, 0x007A, 0x0054, 0x0048, 0x007A, 0x006D, 0x006D, 0x00B2, 0x0063, 0x006D, 0x00B2, 0x006B, 0x006D, 0x00B2,

+    0x006D, 0x006D, 0x00B3, 0x0063, 0x006D, 0x00B3, 0x006B, 0x006D, 0x00B3, 0x006D, 0x2215, 0x0073, 0x006B, 0x0050, 0x0061, 0x004D,

+    0x0050, 0x0061, 0x0047, 0x0050, 0x0061, 0x0072, 0x0061, 0x0064, 0x0043, 0x006F, 0x002E, 0x006C, 0x006F, 0x0067, 0x006D, 0x0069,

+    0x006C, 0x006D, 0x006F, 0x006C, 0x0050, 0x0050, 0x004D, 0x0056, 0x2215, 0x006D, 0x0041, 0x2215, 0x006D, 0x0031, 0x0030, 0x65E5,

+    0x0031, 0x0031, 0x65E5, 0x0031, 0x0032, 0x65E5, 0x0031, 0x0033, 0x65E5, 0x0031, 0x0034, 0x65E5, 0x0031, 0x0035, 0x65E5, 0x0031,

+    0x0036, 0x65E5, 0x0031, 0x0037, 0x65E5, 0x0031, 0x0038, 0x65E5, 0x0031, 0x0039, 0x65E5, 0x0032, 0x0030, 0x65E5, 0x0032, 0x0031,

+    0x65E5, 0x0032, 0x0032, 0x65E5, 0x0032, 0x0033, 0x65E5, 0x0032, 0x0034, 0x65E5, 0x0032, 0x0035, 0x65E5, 0x0032, 0x0036, 0x65E5,

+    0x0032, 0x0037, 0x65E5, 0x0032, 0x0038, 0x65E5, 0x0032, 0x0039, 0x65E5, 0x0033, 0x0030, 0x65E5, 0x0033, 0x0031, 0x65E5, 0x0067,

+    0x0061, 0x006C, 0x0066, 0x0066, 0x0069, 0x0066, 0x0066, 0x006C, 0x0640, 0x064E, 0x0651, 0x0640, 0x064F, 0x0651, 0x0640, 0x0650,

+    0x0651, 0x062A, 0x062C, 0x0645, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x0645, 0x062A, 0x062E, 0x0645,

+    0x062A, 0x0645, 0x062C, 0x062A, 0x0645, 0x062D, 0x062A, 0x0645, 0x062E, 0x062C, 0x0645, 0x062D, 0x062C, 0x0645, 0x062D, 0x062D,

+    0x0645, 0x064A, 0x062D, 0x0645, 0x0649, 0x0633, 0x062D, 0x062C, 0x0633, 0x062C, 0x062D, 0x0633, 0x062C, 0x0649, 0x0633, 0x0645,

+    0x062D, 0x0633, 0x0645, 0x062D, 0x0633, 0x0645, 0x062C, 0x0633, 0x0645, 0x0645, 0x0633, 0x0645, 0x0645, 0x0635, 0x062D, 0x062D,

+    0x0635, 0x062D, 0x062D, 0x0635, 0x0645, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062C, 0x064A, 0x0634,

+    0x0645, 0x062E, 0x0634, 0x0645, 0x062E, 0x0634, 0x0645, 0x0645, 0x0634, 0x0645, 0x0645, 0x0636, 0x062D, 0x0649, 0x0636, 0x062E,

+    0x0645, 0x0636, 0x062E, 0x0645, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x0645, 0x0637, 0x0645, 0x064A,

+    0x0639, 0x062C, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0649, 0x063A, 0x0645, 0x0645, 0x063A,

+    0x0645, 0x064A, 0x063A, 0x0645, 0x0649, 0x0641, 0x062E, 0x0645, 0x0641, 0x062E, 0x0645, 0x0642, 0x0645, 0x062D, 0x0642, 0x0645,

+    0x0645, 0x0644, 0x062D, 0x0645, 0x0644, 0x062D, 0x064A, 0x0644, 0x062D, 0x0649, 0x0644, 0x062C, 0x062C, 0x0644, 0x062C, 0x062C,

+    0x0644, 0x062E, 0x0645, 0x0644, 0x062E, 0x0645, 0x0644, 0x0645, 0x062D, 0x0644, 0x0645, 0x062D, 0x0645, 0x062D, 0x062C, 0x0645,

+    0x062D, 0x0645, 0x0645, 0x062D, 0x064A, 0x0645, 0x062C, 0x062D, 0x0645, 0x062C, 0x0645, 0x0645, 0x062E, 0x062C, 0x0645, 0x062E,

+    0x0645, 0x0645, 0x062C, 0x062E, 0x0647, 0x0645, 0x062C, 0x0647, 0x0645, 0x0645, 0x0646, 0x062D, 0x0645, 0x0646, 0x062D, 0x0649,

+    0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0649, 0x0646, 0x0645, 0x064A, 0x0646, 0x0645, 0x0649, 0x064A,

+    0x0645, 0x0645, 0x064A, 0x0645, 0x0645, 0x0628, 0x062E, 0x064A, 0x062A, 0x062C, 0x064A, 0x062A, 0x062C, 0x0649, 0x062A, 0x062E,

+    0x064A, 0x062A, 0x062E, 0x0649, 0x062A, 0x0645, 0x064A, 0x062A, 0x0645, 0x0649, 0x062C, 0x0645, 0x064A, 0x062C, 0x062D, 0x0649,

+    0x062C, 0x0645, 0x0649, 0x0633, 0x062E, 0x0649, 0x0635, 0x062D, 0x064A, 0x0634, 0x062D, 0x064A, 0x0636, 0x062D, 0x064A, 0x0644,

+    0x062C, 0x064A, 0x0644, 0x0645, 0x064A, 0x064A, 0x062D, 0x064A, 0x064A, 0x062C, 0x064A, 0x064A, 0x0645, 0x064A, 0x0645, 0x0645,

+    0x064A, 0x0642, 0x0645, 0x064A, 0x0646, 0x062D, 0x064A, 0x0642, 0x0645, 0x062D, 0x0644, 0x062D, 0x0645, 0x0639, 0x0645, 0x064A,

+    0x0643, 0x0645, 0x064A, 0x0646, 0x062C, 0x062D, 0x0645, 0x062E, 0x064A, 0x0644, 0x062C, 0x0645, 0x0643, 0x0645, 0x0645, 0x0644,

+    0x062C, 0x0645, 0x0646, 0x062C, 0x062D, 0x062C, 0x062D, 0x064A, 0x062D, 0x062C, 0x064A, 0x0645, 0x062C, 0x064A, 0x0641, 0x0645,

+    0x064A, 0x0628, 0x062D, 0x064A, 0x0643, 0x0645, 0x0645, 0x0639, 0x062C, 0x0645, 0x0635, 0x0645, 0x0645, 0x0633, 0x062E, 0x064A,

+    0x0646, 0x062C, 0x064A, 0x0635, 0x0644, 0x06D2, 0x0642, 0x0644, 0x06D2, 0x0635, 0x0644, 0x0649

+};

+extern const FX_WCHAR g_UnicodeData_Normalization_Map4[488] = {

+    0x0004, 0x2032, 0x2032, 0x2032, 0x2032, 0x0004, 0x0031, 0x002F, 0x0031, 0x0030, 0x0004, 0x0056, 0x0049, 0x0049, 0x0049, 0x0004,

+    0x0076, 0x0069, 0x0069, 0x0069, 0x0004, 0x0028, 0x0031, 0x0030, 0x0029, 0x0004, 0x0028, 0x0031, 0x0031, 0x0029, 0x0004, 0x0028,

+    0x0031, 0x0032, 0x0029, 0x0004, 0x0028, 0x0031, 0x0033, 0x0029, 0x0004, 0x0028, 0x0031, 0x0034, 0x0029, 0x0004, 0x0028, 0x0031,

+    0x0035, 0x0029, 0x0004, 0x0028, 0x0031, 0x0036, 0x0029, 0x0004, 0x0028, 0x0031, 0x0037, 0x0029, 0x0004, 0x0028, 0x0031, 0x0038,

+    0x0029, 0x0004, 0x0028, 0x0031, 0x0039, 0x0029, 0x0004, 0x0028, 0x0032, 0x0030, 0x0029, 0x0004, 0x222B, 0x222B, 0x222B, 0x222B,

+    0x0004, 0x0028, 0x1100, 0x1161, 0x0029, 0x0004, 0x0028, 0x1102, 0x1161, 0x0029, 0x0004, 0x0028, 0x1103, 0x1161, 0x0029, 0x0004,

+    0x0028, 0x1105, 0x1161, 0x0029, 0x0004, 0x0028, 0x1106, 0x1161, 0x0029, 0x0004, 0x0028, 0x1107, 0x1161, 0x0029, 0x0004, 0x0028,

+    0x1109, 0x1161, 0x0029, 0x0004, 0x0028, 0x110B, 0x1161, 0x0029, 0x0004, 0x0028, 0x110C, 0x1161, 0x0029, 0x0004, 0x0028, 0x110E,

+    0x1161, 0x0029, 0x0004, 0x0028, 0x110F, 0x1161, 0x0029, 0x0004, 0x0028, 0x1110, 0x1161, 0x0029, 0x0004, 0x0028, 0x1111, 0x1161,

+    0x0029, 0x0004, 0x0028, 0x1112, 0x1161, 0x0029, 0x0004, 0x0028, 0x110C, 0x116E, 0x0029, 0x0007, 0x0028, 0x110B, 0x1169, 0x110C,

+    0x1165, 0x11AB, 0x0029, 0x0006, 0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029, 0x0005, 0x110E, 0x1161, 0x11B7, 0x1100, 0x1169,

+    0x0004, 0x110C, 0x116E, 0x110B, 0x1174, 0x0004, 0x30A2, 0x30D1, 0x30FC, 0x30C8, 0x0004, 0x30A2, 0x30EB, 0x30D5, 0x30A1, 0x0004,

+    0x30A2, 0x30F3, 0x30DA, 0x30A2, 0x0004, 0x30A4, 0x30CB, 0x30F3, 0x30B0, 0x0005, 0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9, 0x0004,

+    0x30A8, 0x30FC, 0x30AB, 0x30FC, 0x0004, 0x30AB, 0x30E9, 0x30C3, 0x30C8, 0x0004, 0x30AB, 0x30ED, 0x30EA, 0x30FC, 0x0004, 0x30AD,

+    0x30E5, 0x30EA, 0x30FC, 0x0004, 0x30AE, 0x30EB, 0x30C0, 0x30FC, 0x0005, 0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0, 0x0006, 0x30AD,

+    0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x0005, 0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8, 0x0005, 0x30B0, 0x30E9, 0x30E0, 0x30C8,

+    0x30F3, 0x0005, 0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED, 0x0004, 0x30AF, 0x30ED, 0x30FC, 0x30CD, 0x0004, 0x30B5, 0x30A4, 0x30AF,

+    0x30EB, 0x0005, 0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0, 0x0004, 0x30B7, 0x30EA, 0x30F3, 0x30B0, 0x0005, 0x30D1, 0x30FC, 0x30BB,

+    0x30F3, 0x30C8, 0x0004, 0x30D0, 0x30FC, 0x30EC, 0x30EB, 0x0005, 0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB, 0x0005, 0x30D5, 0x30A1,

+    0x30E9, 0x30C3, 0x30C9, 0x0004, 0x30D5, 0x30A3, 0x30FC, 0x30C8, 0x0005, 0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB, 0x0005, 0x30D8,

+    0x30AF, 0x30BF, 0x30FC, 0x30EB, 0x0004, 0x30DD, 0x30A4, 0x30F3, 0x30C8, 0x0004, 0x30DE, 0x30A4, 0x30AF, 0x30ED, 0x0005, 0x30DE,

+    0x30F3, 0x30B7, 0x30E7, 0x30F3, 0x0004, 0x30DF, 0x30AF, 0x30ED, 0x30F3, 0x0005, 0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB, 0x0004,

+    0x30E1, 0x30AC, 0x30C8, 0x30F3, 0x0004, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x0004, 0x30EA, 0x30C3, 0x30C8, 0x30EB, 0x0004, 0x30EB,

+    0x30FC, 0x30D6, 0x30EB, 0x0005, 0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3, 0x0004, 0x682A, 0x5F0F, 0x4F1A, 0x793E, 0x0004, 0x006B,

+    0x0063, 0x0061, 0x006C, 0x0004, 0x006D, 0x2215, 0x0073, 0x00B2, 0x0005, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0006, 0x0072,

+    0x0061, 0x0064, 0x2215, 0x0073, 0x00B2, 0x0004, 0x0061, 0x002E, 0x006D, 0x002E, 0x0004, 0x0043, 0x2215, 0x006B, 0x0067, 0x0004,

+    0x0070, 0x002E, 0x006D, 0x002E, 0x0004, 0x0627, 0x0644, 0x0644, 0x0647, 0x0004, 0x0627, 0x0643, 0x0628, 0x0631, 0x0004, 0x0645,

+    0x062D, 0x0645, 0x062F, 0x0004, 0x0635, 0x0644, 0x0639, 0x0645, 0x0004, 0x0631, 0x0633, 0x0648, 0x0644, 0x0004, 0x0639, 0x0644,

+    0x064A, 0x0647, 0x0004, 0x0648, 0x0633, 0x0644, 0x0645, 0x0012, 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647,

+    0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0x0008, 0x062C, 0x0644, 0x0020, 0x062C, 0x0644,

+    0x0627, 0x0644, 0x0647, 0x0004, 0x0631, 0x06CC, 0x0627, 0x0644

+};

diff --git a/core/src/fx_freetype.h b/core/src/fx_freetype.h
new file mode 100644
index 0000000..7c50f68
--- /dev/null
+++ b/core/src/fx_freetype.h
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_SRC_FREETYPE_H_

+#define _FX_SRC_FREETYPE_H_

+#include "./fxge/fx_freetype/fxft2.5.01/include/ft2build.h"

+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h"

+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h"

+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h"

+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h"

+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h"

+#endif

diff --git a/core/src/fx_jpeglib.h b/core/src/fx_jpeglib.h
new file mode 100644
index 0000000..1ce2172
--- /dev/null
+++ b/core/src/fx_jpeglib.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_SRC_JPEGLIB_H_

+#define _FX_SRC_JPEGLIB_H_

+#include "./fxcodec/libjpeg/jpeglib.h"

+#endif

diff --git a/core/src/fx_zlib.h b/core/src/fx_zlib.h
new file mode 100644
index 0000000..3c6c5a8
--- /dev/null
+++ b/core/src/fx_zlib.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_SRC_ZLIB_H_

+#define _FX_SRC_ZLIB_H_

+#include "./fxcodec/fx_zlib/zlib_v128/zlib.h"

+#endif

diff --git a/core/src/fxcodec/codec/codec_int.h b/core/src/fxcodec/codec/codec_int.h
new file mode 100644
index 0000000..571af61
--- /dev/null
+++ b/core/src/fxcodec/codec/codec_int.h
@@ -0,0 +1,270 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include <limits.h>

+class CCodec_BasicModule : public ICodec_BasicModule

+{

+public:

+    virtual FX_BOOL	RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,

+                                    FX_DWORD& dest_size);

+    virtual FX_BOOL	A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,

+                              FX_DWORD& dest_size);

+    virtual ICodec_ScanlineDecoder*	CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+            int nComps, int bpc);

+};

+struct CCodec_ImageDataCache {

+    int			m_Width, m_Height;

+    int			m_nCachedLines;

+    FX_BYTE		m_Data;

+};

+class CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder

+{

+public:

+

+    CCodec_ScanlineDecoder();

+

+    virtual ~CCodec_ScanlineDecoder();

+

+    virtual FX_DWORD	GetSrcOffset()

+    {

+        return -1;

+    }

+

+    virtual void		DownScale(int dest_width, int dest_height);

+

+    FX_LPBYTE			GetScanline(int line);

+

+    FX_BOOL				SkipToScanline(int line, IFX_Pause* pPause);

+

+    int					GetWidth()

+    {

+        return m_OutputWidth;

+    }

+

+    int					GetHeight()

+    {

+        return m_OutputHeight;

+    }

+

+    int					CountComps()

+    {

+        return m_nComps;

+    }

+

+    int					GetBPC()

+    {

+        return m_bpc;

+    }

+

+    FX_BOOL				IsColorTransformed()

+    {

+        return m_bColorTransformed;

+    }

+

+    void				ClearImageData()

+    {

+        if (m_pDataCache) {

+            FX_Free(m_pDataCache);

+        }

+        m_pDataCache = NULL;

+    }

+protected:

+

+    int					m_OrigWidth;

+

+    int					m_OrigHeight;

+

+    int					m_DownScale;

+

+    int					m_OutputWidth;

+

+    int					m_OutputHeight;

+

+    int					m_nComps;

+

+    int					m_bpc;

+

+    int					m_Pitch;

+

+    FX_BOOL				m_bColorTransformed;

+

+    FX_LPBYTE			ReadNextLine();

+

+    virtual FX_BOOL		v_Rewind() = 0;

+

+    virtual FX_LPBYTE	v_GetNextLine() = 0;

+

+    virtual void		v_DownScale(int dest_width, int dest_height) = 0;

+

+    int					m_NextLine;

+

+    FX_LPBYTE			m_pLastScanline;

+

+    CCodec_ImageDataCache*	m_pDataCache;

+};

+class CCodec_FaxModule : public ICodec_FaxModule

+{

+public:

+    virtual ICodec_ScanlineDecoder*	CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+            int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);

+    FX_BOOL		Encode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+};

+class CCodec_FlateModule : public ICodec_FlateModule

+{

+public:

+    virtual ICodec_ScanlineDecoder*	CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+            int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns);

+    virtual FX_DWORD FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,

+                                      int predictor, int Colors, int BitsPerComponent, int Columns,

+                                      FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+    virtual FX_BOOL Encode(const FX_BYTE* src_buf, FX_DWORD src_size,

+                           int predictor, int Colors, int BitsPerComponent, int Columns,

+                           FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+    virtual FX_BOOL		Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+};

+class CCodec_JpegModule : public ICodec_JpegModule

+{

+public:

+    CCodec_JpegModule() : m_pExtProvider(NULL) {}

+    void SetPovider(IFX_JpegProvider* pJP)

+    {

+        m_pExtProvider = pJP;

+    }

+    ICodec_ScanlineDecoder*	CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,

+                                          int width, int height, int nComps, FX_BOOL ColorTransform);

+    FX_BOOL		LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,

+                         int& num_components, int& bits_per_components, FX_BOOL& color_transform,

+                         FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length);

+    FX_BOOL		Encode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length);

+    virtual void*		Start();

+    virtual void		Finish(void* pContext);

+    virtual void		Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size);

+    virtual int			ReadHeader(void* pContext, int* width, int* height, int* nComps);

+    virtual FX_BOOL		StartScanline(void* pContext, int down_scale);

+    virtual FX_BOOL		ReadScanline(void* pContext, FX_LPBYTE dest_buf);

+    virtual FX_DWORD	GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr);

+protected:

+    IFX_JpegProvider* m_pExtProvider;

+};

+class CCodec_IccModule : public ICodec_IccModule

+{

+public:

+    virtual IccCS			GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize);

+    virtual IccCS			GetProfileCS(IFX_FileRead* pFile);

+    virtual FX_LPVOID		CreateTransform(ICodec_IccModule::IccParam* pInputParam,

+                                            ICodec_IccModule::IccParam* pOutputParam,

+                                            ICodec_IccModule::IccParam* pProofParam = NULL,

+                                            FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,

+                                            FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,

+                                            FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,

+                                            FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING

+                                      );

+    virtual FX_LPVOID		CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent = 0,

+            FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT);

+    virtual FX_LPVOID		CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,

+            FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent = 0,

+            FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,

+            FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT

+                                           );

+    virtual void			DestroyTransform(FX_LPVOID pTransform);

+    virtual void			Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues);

+    virtual void			TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels);

+    virtual ~CCodec_IccModule();

+protected:

+    CFX_MapByteStringToPtr		m_MapTranform;

+    CFX_MapByteStringToPtr		m_MapProfile;

+    typedef enum {

+        Icc_CLASS_INPUT = 0,

+        Icc_CLASS_OUTPUT,

+        Icc_CLASS_PROOF,

+        Icc_CLASS_MAX

+    } Icc_CLASS;

+    FX_LPVOID		CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey);

+};

+class CCodec_JpxModule : public ICodec_JpxModule

+{

+public:

+    CCodec_JpxModule();

+    void*		CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE);

+    void		GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,

+                             FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);

+    FX_BOOL		Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);

+    void		DestroyDecoder(void* ctx);

+};

+#include "../jbig2/JBig2_Context.h"

+class CPDF_Jbig2Interface : public CFX_Object, public CJBig2_Module

+{

+public:

+    virtual void *JBig2_Malloc(FX_DWORD dwSize)

+    {

+        return FX_Alloc(FX_BYTE, dwSize);

+    }

+    virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize)

+    {

+        if (dwSize && num >= UINT_MAX / dwSize) {

+            return NULL;

+        }

+        return FX_Alloc(FX_BYTE, num * dwSize);

+    }

+    virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2)

+    {

+        if (dwSize2 && dwSize >= UINT_MAX / dwSize2) {

+            return NULL;

+        }

+        FX_DWORD size = dwSize2 * dwSize;

+        if (size && num >= UINT_MAX / size) {

+            return NULL;

+        }

+        return FX_Alloc(FX_BYTE, num * size);

+    }

+    virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize)

+    {

+        return FX_Realloc(FX_BYTE, pMem, dwSize);

+    }

+    virtual void JBig2_Free(FX_LPVOID pMem)

+    {

+        FX_Free(pMem);

+    }

+};

+class CCodec_Jbig2Context : public CFX_Object

+{

+public:

+    CCodec_Jbig2Context();

+    ~CCodec_Jbig2Context() {};

+    IFX_FileRead* m_file_ptr;

+    FX_DWORD m_width;

+    FX_DWORD m_height;

+    FX_LPBYTE m_src_buf;

+    FX_DWORD m_src_size;

+    FX_LPCBYTE m_global_data;

+    FX_DWORD m_global_size;

+    FX_LPBYTE m_dest_buf;

+    FX_DWORD m_dest_pitch;

+    FX_BOOL	m_bFileReader;

+    IFX_Pause* m_pPause;

+    CJBig2_Context* m_pContext;

+    CJBig2_Image* m_dest_image;

+};

+class CCodec_Jbig2Module : public ICodec_Jbig2Module

+{

+public:

+    CCodec_Jbig2Module() {};

+    ~CCodec_Jbig2Module();

+    FX_BOOL		Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,

+                       FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch);

+    FX_BOOL		Decode(IFX_FileRead* file_ptr,

+                       FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf);

+    void*				CreateJbig2Context();

+    FXCODEC_STATUS		StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,

+                                    FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause);

+

+    FXCODEC_STATUS		StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,

+                                    FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause);

+    FXCODEC_STATUS		ContinueDecode(void* pJbig2Context, IFX_Pause* pPause);

+    void				DestroyJbig2Context(void* pJbig2Context);

+    CPDF_Jbig2Interface	m_Module;

+private:

+};

diff --git a/core/src/fxcodec/codec/fx_codec.cpp b/core/src/fxcodec/codec/fx_codec.cpp
new file mode 100644
index 0000000..2f586ca
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec.cpp
@@ -0,0 +1,447 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxcodec/fx_codec.h"

+#include "codec_int.h"

+CCodec_ModuleMgr::CCodec_ModuleMgr()

+{

+    m_pBasicModule = FX_NEW CCodec_BasicModule;

+    m_pFaxModule = FX_NEW CCodec_FaxModule;

+    m_pJpegModule = FX_NEW CCodec_JpegModule;

+    m_pJpxModule = FX_NEW CCodec_JpxModule;

+    m_pJbig2Module = FX_NEW CCodec_Jbig2Module;

+    m_pIccModule = FX_NEW CCodec_IccModule;

+    m_pFlateModule = FX_NEW CCodec_FlateModule;

+}

+CCodec_ModuleMgr::~CCodec_ModuleMgr()

+{

+    delete m_pBasicModule;

+    delete m_pFaxModule;

+    delete m_pJpegModule;

+    delete m_pFlateModule;

+    delete m_pJpxModule;

+    delete m_pJbig2Module;

+    delete m_pIccModule;

+}

+void CCodec_ModuleMgr::InitJbig2Decoder()

+{

+}

+void CCodec_ModuleMgr::InitJpxDecoder()

+{

+}

+void CCodec_ModuleMgr::InitIccDecoder()

+{

+}

+CCodec_ScanlineDecoder::CCodec_ScanlineDecoder()

+{

+    m_NextLine = -1;

+    m_pDataCache = NULL;

+    m_pLastScanline = NULL;

+}

+CCodec_ScanlineDecoder::~CCodec_ScanlineDecoder()

+{

+    if (m_pDataCache) {

+        FX_Free(m_pDataCache);

+    }

+}

+FX_LPBYTE CCodec_ScanlineDecoder::GetScanline(int line)

+{

+    if (m_pDataCache && line < m_pDataCache->m_nCachedLines) {

+        return &m_pDataCache->m_Data + line * m_Pitch;

+    }

+    if (m_NextLine == line + 1) {

+        return m_pLastScanline;

+    }

+    if (m_NextLine < 0 || m_NextLine > line) {

+        if (!v_Rewind()) {

+            return NULL;

+        }

+        m_NextLine = 0;

+    }

+    while (m_NextLine < line) {

+        ReadNextLine();

+        m_NextLine ++;

+    }

+    m_pLastScanline = ReadNextLine();

+    m_NextLine ++;

+    return m_pLastScanline;

+}

+FX_BOOL CCodec_ScanlineDecoder::SkipToScanline(int line, IFX_Pause* pPause)

+{

+    if (m_pDataCache && line < m_pDataCache->m_nCachedLines) {

+        return FALSE;

+    }

+    if (m_NextLine == line || m_NextLine == line + 1) {

+        return FALSE;

+    }

+    if (m_NextLine < 0 || m_NextLine > line) {

+        v_Rewind();

+        m_NextLine = 0;

+    }

+    m_pLastScanline = NULL;

+    while (m_NextLine < line) {

+        m_pLastScanline = ReadNextLine();

+        m_NextLine ++;

+        if (pPause && pPause->NeedToPauseNow()) {

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_LPBYTE CCodec_ScanlineDecoder::ReadNextLine()

+{

+    FX_LPBYTE pLine = v_GetNextLine();

+    if (pLine == NULL) {

+        return NULL;

+    }

+    if (m_pDataCache && m_NextLine == m_pDataCache->m_nCachedLines) {

+        FXSYS_memcpy32(&m_pDataCache->m_Data + m_NextLine * m_Pitch, pLine, m_Pitch);

+        m_pDataCache->m_nCachedLines ++;

+    }

+    return pLine;

+}

+void CCodec_ScanlineDecoder::DownScale(int dest_width, int dest_height)

+{

+    if (dest_width < 0) {

+        dest_width = -dest_width;

+    }

+    if (dest_height < 0) {

+        dest_height = -dest_height;

+    }

+    v_DownScale(dest_width, dest_height);

+    if (m_pDataCache) {

+        if (m_pDataCache->m_Height == m_OutputHeight && m_pDataCache->m_Width == m_OutputWidth) {

+            return;

+        }

+        FX_Free(m_pDataCache);

+        m_pDataCache = NULL;

+    }

+    m_pDataCache = (CCodec_ImageDataCache*)FXMEM_DefaultAlloc(

+                       sizeof(CCodec_ImageDataCache) + m_Pitch * m_OutputHeight, FXMEM_NONLEAVE);

+    if (m_pDataCache == NULL) {

+        return;

+    }

+    m_pDataCache->m_Height = m_OutputHeight;

+    m_pDataCache->m_Width = m_OutputWidth;

+    m_pDataCache->m_nCachedLines = 0;

+}

+FX_BOOL CCodec_BasicModule::RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,

+        FX_DWORD& dest_size)

+{

+    return FALSE;

+}

+extern "C" double FXstrtod(const char* nptr, char** endptr)

+{

+    double ret = 0.0;

+    const char* ptr = nptr;

+    const char* exp_ptr = NULL;

+    int	e_number = 0,

+        e_signal = 0,

+        e_point = 0,

+        is_negative = 0;

+    int exp_ret = 0, exp_sig = 1,

+        fra_ret = 0, fra_count = 0, fra_base = 1;

+    if(nptr == NULL) {

+        return 0.0;

+    }

+    for (;; ptr++) {

+        if(!e_number && !e_point && (*ptr == '\t' || *ptr == ' ')) {

+            continue;

+        }

+        if(*ptr >= '0' && *ptr <= '9') {

+            if(!e_number) {

+                e_number = 1;

+            }

+            if(!e_point) {

+                ret *= 10;

+                ret += (*ptr - '0');

+            } else {

+                fra_count++;

+                fra_ret *= 10;

+                fra_ret += (*ptr - '0');

+            }

+            continue;

+        }

+        if(!e_point && *ptr == '.') {

+            e_point = 1;

+            continue;

+        }

+        if(!e_number && !e_point && !e_signal) {

+            switch(*ptr) {

+                case '-':

+                    is_negative = 1;

+                case '+':

+                    e_signal = 1;

+                    continue;

+            }

+        }

+        if(e_number && (*ptr == 'e' || *ptr == 'E')) {

+#define EXPONENT_DETECT(ptr)	\

+    for(;;ptr++){		\

+        if(*ptr < '0' || *ptr > '9'){	\

+            if(endptr)	*endptr = (char*)ptr;	\

+            break;	\

+        }else{		\

+            exp_ret *= 10;	\

+            exp_ret += (*ptr - '0');	\

+            continue;		\

+        }	\

+    }

+            exp_ptr = ptr++;

+            if(*ptr == '+' || *ptr == '-') {

+                exp_sig = (*ptr++ == '+') ? 1 : -1;

+                if(*ptr < '0' || *ptr > '9') {

+                    if(endptr)	{

+                        *endptr = (char*)exp_ptr;

+                    }

+                    break;

+                }

+                EXPONENT_DETECT(ptr);

+            } else if(*ptr >= '0' && *ptr <= '9') {

+                EXPONENT_DETECT(ptr);

+            } else {

+                if(endptr)	{

+                    *endptr = (char*)exp_ptr;

+                }

+                break;

+            }

+#undef EXPONENT_DETECT

+            break;

+        }

+        if(ptr != nptr && !e_number) {

+            if(endptr)	{

+                *endptr = (char*)nptr;

+            }

+            break;

+        }

+        if(endptr)	{

+            *endptr = (char*)ptr;

+        }

+        break;

+    }

+    while(fra_count--) {

+        fra_base *= 10;

+    }

+    ret += (double)fra_ret / (double)fra_base;

+    if(exp_sig == 1) {

+        while(exp_ret--) {

+            ret *= 10.0;

+        }

+    } else {

+        while(exp_ret--) {

+            ret /= 10.0;

+        }

+    }

+    return is_negative ? -ret : ret;

+}

+FX_BOOL CCodec_BasicModule::A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,

+                                      FX_DWORD& dest_size)

+{

+    return FALSE;

+}

+CCodec_ModuleMgr* CCodec_ModuleMgr::Create()

+{

+    return FX_NEW CCodec_ModuleMgr;

+}

+void CCodec_ModuleMgr::Destroy()

+{

+    delete this;

+}

+class CCodec_RLScanlineDecoder : public CCodec_ScanlineDecoder

+{

+public:

+    CCodec_RLScanlineDecoder();

+    virtual ~CCodec_RLScanlineDecoder();

+    FX_BOOL				Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc);

+    virtual void		v_DownScale(int dest_width, int dest_height) {}

+    virtual FX_BOOL		v_Rewind();

+    virtual FX_LPBYTE	v_GetNextLine();

+    virtual FX_DWORD	GetSrcOffset()

+    {

+        return m_SrcOffset;

+    }

+protected:

+    FX_BOOL				CheckDestSize();

+    void				GetNextOperator();

+    void				UpdateOperator(FX_BYTE used_bytes);

+

+    FX_LPBYTE			m_pScanline;

+    FX_LPCBYTE			m_pSrcBuf;

+    FX_DWORD			m_SrcSize;

+    FX_DWORD			m_dwLineBytes;

+    FX_DWORD			m_SrcOffset;

+    FX_BOOL				m_bEOD;

+    FX_BYTE				m_Operator;

+};

+CCodec_RLScanlineDecoder::CCodec_RLScanlineDecoder()

+    : m_pScanline(NULL)

+    , m_pSrcBuf(NULL)

+    , m_SrcSize(0)

+    , m_dwLineBytes(0)

+    , m_SrcOffset(0)

+    , m_bEOD(FALSE)

+    , m_Operator(0)

+{

+}

+CCodec_RLScanlineDecoder::~CCodec_RLScanlineDecoder()

+{

+    if (m_pScanline) {

+        FX_Free(m_pScanline);

+    }

+}

+FX_BOOL CCodec_RLScanlineDecoder::CheckDestSize()

+{

+    FX_DWORD i = 0;

+    FX_DWORD old_size = 0;

+    FX_DWORD dest_size = 0;

+    while (i < m_SrcSize) {

+        if (m_pSrcBuf[i] < 128) {

+            old_size = dest_size;

+            dest_size += m_pSrcBuf[i] + 1;

+            if (dest_size < old_size) {

+                return FALSE;

+            }

+            i += m_pSrcBuf[i] + 2;

+        } else if (m_pSrcBuf[i] > 128) {

+            old_size = dest_size;

+            dest_size += 257 - m_pSrcBuf[i];

+            if (dest_size < old_size) {

+                return FALSE;

+            }

+            i += 2;

+        } else {

+            break;

+        }

+    }

+    if (((FX_DWORD)m_OrigWidth * m_nComps * m_bpc * m_OrigHeight + 7) / 8 > dest_size) {

+        return FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL CCodec_RLScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc)

+{

+    m_pSrcBuf = src_buf;

+    m_SrcSize = src_size;

+    m_OutputWidth = m_OrigWidth = width;

+    m_OutputHeight = m_OrigHeight = height;

+    m_nComps = nComps;

+    m_bpc = bpc;

+    m_bColorTransformed = FALSE;

+    m_DownScale = 1;

+    m_Pitch = (width * nComps * bpc + 31) / 32 * 4;

+    m_dwLineBytes = (width * nComps * bpc + 7) / 8;

+    m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);

+    if (m_pScanline == NULL) {

+        return FALSE;

+    }

+    FXSYS_memset32(m_pScanline, 0, m_Pitch);

+    return CheckDestSize();

+}

+FX_BOOL CCodec_RLScanlineDecoder::v_Rewind()

+{

+    FXSYS_memset32(m_pScanline, 0, m_Pitch);

+    m_SrcOffset = 0;

+    m_bEOD = FALSE;

+    m_Operator = 0;

+    return TRUE;

+}

+FX_LPBYTE CCodec_RLScanlineDecoder::v_GetNextLine()

+{

+    if (m_SrcOffset == 0) {

+        GetNextOperator();

+    } else {

+        if (m_bEOD) {

+            return NULL;

+        }

+    }

+    FXSYS_memset32(m_pScanline, 0, m_Pitch);

+    FX_DWORD col_pos = 0;

+    FX_BOOL	eol = FALSE;

+    while (m_SrcOffset < m_SrcSize && !eol) {

+        if (m_Operator < 128) {

+            FX_DWORD copy_len = m_Operator + 1;

+            if (col_pos + copy_len >= m_dwLineBytes) {

+                copy_len = m_dwLineBytes - col_pos;

+                eol = TRUE;

+            }

+            if (copy_len >= m_SrcSize - m_SrcOffset) {

+                copy_len = m_SrcSize - m_SrcOffset;

+                m_bEOD = TRUE;

+            }

+            FXSYS_memcpy32(m_pScanline + col_pos, m_pSrcBuf + m_SrcOffset, copy_len);

+            col_pos += copy_len;

+            UpdateOperator((FX_BYTE)copy_len);

+        } else if (m_Operator > 128) {

+            int fill = 0;

+            if (m_SrcOffset - 1 < m_SrcSize - 1) {

+                fill = m_pSrcBuf[m_SrcOffset];

+            }

+            FX_DWORD duplicate_len = 257 - m_Operator;

+            if (col_pos + duplicate_len >= m_dwLineBytes) {

+                duplicate_len = m_dwLineBytes - col_pos;

+                eol = TRUE;

+            }

+            FXSYS_memset8(m_pScanline + col_pos, fill, duplicate_len);

+            col_pos += duplicate_len;

+            UpdateOperator((FX_BYTE)duplicate_len);

+        } else {

+            m_bEOD = TRUE;

+            break;

+        }

+    }

+    return m_pScanline;

+}

+void CCodec_RLScanlineDecoder::GetNextOperator()

+{

+    if (m_SrcOffset >= m_SrcSize) {

+        m_Operator = 128;

+        return;

+    }

+    m_Operator = m_pSrcBuf[m_SrcOffset];

+    m_SrcOffset ++;

+}

+void CCodec_RLScanlineDecoder::UpdateOperator(FX_BYTE used_bytes)

+{

+    if (used_bytes == 0) {

+        return;

+    }

+    if (m_Operator < 128) {

+        FXSYS_assert((FX_DWORD)m_Operator + 1 >= used_bytes);

+        if (used_bytes == m_Operator + 1) {

+            m_SrcOffset += used_bytes;

+            GetNextOperator();

+            return;

+        }

+        m_Operator -= used_bytes;

+        m_SrcOffset += used_bytes;

+        if (m_SrcOffset >= m_SrcSize) {

+            m_Operator = 128;

+        }

+        return;

+    }

+    FX_BYTE count = 257 - m_Operator;

+    FXSYS_assert((FX_DWORD)count >= used_bytes);

+    if (used_bytes == count) {

+        m_SrcOffset ++;

+        GetNextOperator();

+        return;

+    }

+    count -= used_bytes;

+    m_Operator = 257 - count;

+}

+ICodec_ScanlineDecoder* CCodec_BasicModule::CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+        int nComps, int bpc)

+{

+    CCodec_RLScanlineDecoder* pRLScanlineDecoder = FX_NEW CCodec_RLScanlineDecoder;

+    if (pRLScanlineDecoder == NULL) {

+        return NULL;

+    }

+    if (!pRLScanlineDecoder->Create(src_buf, src_size, width, height, nComps, bpc)) {

+        delete pRLScanlineDecoder;

+        return NULL;

+    }

+    return pRLScanlineDecoder;

+}

diff --git a/core/src/fxcodec/codec/fx_codec_fax.cpp b/core/src/fxcodec/codec/fx_codec_fax.cpp
new file mode 100644
index 0000000..21c7deb
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_fax.cpp
@@ -0,0 +1,968 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxcodec/fx_codec.h"

+#include "codec_int.h"

+extern const FX_BYTE OneLeadPos[256];

+extern const FX_BYTE ZeroLeadPos[256];

+int _FindBit(const FX_BYTE* data_buf, int max_pos, int start_pos, int bit)

+{

+    if (start_pos >= max_pos) {

+        return max_pos;

+    }

+    FX_LPCBYTE leading_pos = bit ? OneLeadPos : ZeroLeadPos;

+    if (start_pos % 8) {

+        FX_BYTE data = data_buf[start_pos / 8];

+        if (bit) {

+            data &= 0xff >> (start_pos % 8);

+        } else {

+            data |= 0xff << (8 - start_pos % 8);

+        }

+        if (leading_pos[data] < 8) {

+            return start_pos / 8 * 8 + leading_pos[data];

+        }

+        start_pos += 7;

+    }

+    FX_BYTE skip = bit ? 0x00 : 0xff;

+    int byte_pos = start_pos / 8;

+    int max_byte = (max_pos + 7) / 8;

+    while (byte_pos < max_byte) {

+        if (data_buf[byte_pos] != skip) {

+            break;

+        }

+        byte_pos ++;

+    }

+    if (byte_pos == max_byte) {

+        return max_pos;

+    }

+    int pos = leading_pos[data_buf[byte_pos]] + byte_pos * 8;

+    if (pos > max_pos) {

+        pos = max_pos;

+    }

+    return pos;

+}

+void _FaxG4FindB1B2(const FX_BYTE* ref_buf, int columns, int a0, FX_BOOL a0color, int& b1, int& b2)

+{

+    if (a0color) {

+        a0color = 1;

+    }

+    FX_BYTE first_bit = (a0 < 0) ? 1 : ((ref_buf[a0 / 8] & (1 << (7 - a0 % 8))) != 0);

+    b1 = _FindBit(ref_buf, columns, a0 + 1, !first_bit);

+    if (b1 >= columns) {

+        b1 = b2 = columns;

+        return;

+    }

+    if (first_bit == !a0color) {

+        b1 = _FindBit(ref_buf, columns, b1 + 1, first_bit);

+        first_bit = !first_bit;

+    }

+    if (b1 >= columns) {

+        b1 = b2 = columns;

+        return;

+    }

+    b2 = _FindBit(ref_buf, columns, b1 + 1, first_bit);

+}

+void _FaxFillBits(FX_LPBYTE dest_buf, int columns, int startpos, int endpos)

+{

+    if (startpos < 0) {

+        startpos = 0;

+    }

+    if (endpos < 0) {

+        endpos = 0;

+    }

+    if (endpos >= columns) {

+        endpos = columns;

+    }

+    if (startpos >= endpos) {

+        return;

+    }

+    int first_byte = startpos / 8;

+    int last_byte = (endpos - 1) / 8;

+    if (first_byte == last_byte) {

+        for (int i = startpos % 8; i <= (endpos - 1) % 8; i ++) {

+            dest_buf[first_byte] -= 1 << (7 - i);

+        }

+        return;

+    }

+    int i;

+    for (i = startpos % 8; i < 8; i ++) {

+        dest_buf[first_byte] -= 1 << (7 - i);

+    }

+    for (i = 0; i <= (endpos - 1) % 8; i ++) {

+        dest_buf[last_byte] -= 1 << (7 - i);

+    }

+    if (last_byte > first_byte + 1) {

+        FXSYS_memset32(dest_buf + first_byte + 1, 0, last_byte - first_byte - 1);

+    }

+}

+#define NEXTBIT src_buf[bitpos/8] & (1 << (7-bitpos%8)); bitpos ++;

+#define ADDBIT(code, bit) code = code << 1; if (bit) code ++;

+#define GETBIT(bitpos) src_buf[bitpos/8] & (1 << (7-bitpos%8))

+static const FX_BYTE FaxBlackRunIns[] = {

+    0,

+    2,

+    0x02, 3, 0,

+    0x03, 2, 0,

+    2,

+    0x02, 1, 0,

+    0x03, 4, 0,

+    2,

+    0x02, 6, 0,

+    0x03, 5, 0,

+    1,

+    0x03, 7, 0,

+    2,

+    0x04, 9, 0,

+    0x05, 8, 0,

+    3,

+    0x04, 10, 0,

+    0x05, 11, 0,

+    0x07, 12, 0,

+    2,

+    0x04, 13, 0,

+    0x07, 14, 0,

+    1,

+    0x18, 15, 0,

+    5,

+    0x08, 18, 0,

+    0x0f, 64, 0,

+    0x17, 16, 0,

+    0x18, 17, 0,

+    0x37, 0, 0,

+    10,

+    0x08, 0x00, 0x07,

+    0x0c, 0x40, 0x07,

+    0x0d, 0x80, 0x07,

+    0x17, 24, 0,

+    0x18, 25, 0,

+    0x28, 23, 0,

+    0x37, 22, 0,

+    0x67, 19, 0,

+    0x68, 20, 0,

+    0x6c, 21, 0,

+    54,

+    0x12, 1984 % 256, 1984 / 256,

+    0x13, 2048 % 256, 2048 / 256,

+    0x14, 2112 % 256, 2112 / 256,

+    0x15, 2176 % 256, 2176 / 256,

+    0x16, 2240 % 256, 2240 / 256,

+    0x17, 2304 % 256, 2304 / 256,

+    0x1c, 2368 % 256, 2368 / 256,

+    0x1d, 2432 % 256, 2432 / 256,

+    0x1e, 2496 % 256, 2496 / 256,

+    0x1f, 2560 % 256, 2560 / 256,

+    0x24, 52, 0,

+    0x27, 55, 0,

+    0x28, 56, 0,

+    0x2b, 59, 0,

+    0x2c, 60, 0,

+    0x33, 320 % 256, 320 / 256,

+    0x34, 384 % 256, 384 / 256,

+    0x35, 448 % 256, 448 / 256,

+    0x37, 53, 0,

+    0x38, 54, 0,

+    0x52, 50, 0,

+    0x53, 51, 0,

+    0x54, 44, 0,

+    0x55, 45, 0,

+    0x56, 46, 0,

+    0x57, 47, 0,

+    0x58, 57, 0,

+    0x59, 58, 0,

+    0x5a, 61, 0,

+    0x5b, 256 % 256, 256 / 256,

+    0x64, 48, 0,

+    0x65, 49, 0,

+    0x66, 62, 0,

+    0x67, 63, 0,

+    0x68, 30, 0,

+    0x69, 31, 0,

+    0x6a, 32, 0,

+    0x6b, 33, 0,

+    0x6c, 40, 0,

+    0x6d, 41, 0,

+    0xc8, 128, 0,

+    0xc9, 192, 0,

+    0xca, 26, 0,

+    0xcb, 27, 0,

+    0xcc, 28, 0,

+    0xcd, 29, 0,

+    0xd2, 34, 0,

+    0xd3, 35, 0,

+    0xd4, 36, 0,

+    0xd5, 37, 0,

+    0xd6, 38, 0,

+    0xd7, 39, 0,

+    0xda, 42, 0,

+    0xdb, 43, 0,

+    20,

+    0x4a, 640 % 256, 640 / 256,

+    0x4b, 704 % 256, 704 / 256,

+    0x4c, 768 % 256, 768 / 256,

+    0x4d, 832 % 256, 832 / 256,

+    0x52, 1280 % 256, 1280 / 256,

+    0x53, 1344 % 256, 1344 / 256,

+    0x54, 1408 % 256, 1408 / 256,

+    0x55, 1472 % 256, 1472 / 256,

+    0x5a, 1536 % 256, 1536 / 256,

+    0x5b, 1600 % 256, 1600 / 256,

+    0x64, 1664 % 256, 1664 / 256,

+    0x65, 1728 % 256, 1728 / 256,

+    0x6c, 512 % 256, 512 / 256,

+    0x6d, 576 % 256, 576 / 256,

+    0x72, 896 % 256, 896 / 256,

+    0x73, 960 % 256, 960 / 256,

+    0x74, 1024 % 256, 1024 / 256,

+    0x75, 1088 % 256, 1088 / 256,

+    0x76, 1152 % 256, 1152 / 256,

+    0x77, 1216 % 256, 1216 / 256,

+    0xff

+};

+static const FX_BYTE FaxWhiteRunIns[] = {

+    0,

+    0,

+    0,

+    6,

+    0x07, 2, 0,

+    0x08, 3, 0,

+    0x0B, 4, 0,

+    0x0C, 5, 0,

+    0x0E, 6, 0,

+    0x0F, 7, 0,

+    6,

+    0x07, 10, 0,

+    0x08, 11, 0,

+    0x12, 128, 0,

+    0x13, 8, 0,

+    0x14, 9, 0,

+    0x1b, 64, 0,

+    9,

+    0x03, 13, 0,

+    0x07, 1, 0,

+    0x08, 12, 0,

+    0x17, 192, 0,

+    0x18, 1664 % 256, 1664 / 256,

+    0x2a, 16, 0,

+    0x2B, 17, 0,

+    0x34, 14, 0,

+    0x35, 15, 0,

+    12,

+    0x03, 22, 0,

+    0x04, 23, 0,

+    0x08, 20, 0,

+    0x0c, 19, 0,

+    0x13, 26, 0,

+    0x17, 21, 0,

+    0x18, 28, 0,

+    0x24, 27, 0,

+    0x27, 18, 0,

+    0x28, 24, 0,

+    0x2B, 25, 0,

+    0x37, 256 % 256, 256 / 256,

+    42,

+    0x02, 29, 0,

+    0x03, 30, 0,

+    0x04, 45, 0,

+    0x05, 46, 0,

+    0x0a, 47, 0,

+    0x0b, 48, 0,

+    0x12, 33, 0,

+    0x13, 34, 0,

+    0x14, 35, 0,

+    0x15, 36, 0,

+    0x16, 37, 0,

+    0x17, 38, 0,

+    0x1a, 31, 0,

+    0x1b, 32, 0,

+    0x24, 53, 0,

+    0x25, 54, 0,

+    0x28, 39, 0,

+    0x29, 40, 0,

+    0x2a, 41, 0,

+    0x2b, 42, 0,

+    0x2c, 43, 0,

+    0x2d, 44, 0,

+    0x32, 61, 0,

+    0x33, 62, 0,

+    0x34, 63, 0,

+    0x35, 0, 0,

+    0x36, 320 % 256, 320 / 256,

+    0x37, 384 % 256, 384 / 256,

+    0x4a, 59, 0,

+    0x4b, 60, 0,

+    0x52, 49, 0,

+    0x53, 50, 0,

+    0x54, 51, 0,

+    0x55, 52, 0,

+    0x58, 55, 0,

+    0x59, 56, 0,

+    0x5a, 57, 0,

+    0x5b, 58, 0,

+    0x64, 448 % 256, 448 / 256,

+    0x65, 512 % 256, 512 / 256,

+    0x67, 640 % 256, 640 / 256,

+    0x68, 576 % 256, 576 / 256,

+    16,

+    0x98, 1472 % 256, 1472 / 256,

+    0x99, 1536 % 256, 1536 / 256,

+    0x9a, 1600 % 256, 1600 / 256,

+    0x9b, 1728 % 256, 1728 / 256,

+    0xcc, 704 % 256, 704 / 256,

+    0xcd, 768 % 256, 768 / 256,

+    0xd2, 832 % 256, 832 / 256,

+    0xd3, 896 % 256, 896 / 256,

+    0xd4, 960 % 256, 960 / 256,

+    0xd5, 1024 % 256, 1024 / 256,

+    0xd6, 1088 % 256, 1088 / 256,

+    0xd7, 1152 % 256, 1152 / 256,

+    0xd8, 1216 % 256, 1216 / 256,

+    0xd9, 1280 % 256, 1280 / 256,

+    0xda, 1344 % 256, 1344 / 256,

+    0xdb, 1408 % 256, 1408 / 256,

+    0,

+    3,

+    0x08, 1792 % 256, 1792 / 256,

+    0x0c, 1856 % 256, 1856 / 256,

+    0x0d, 1920 % 256, 1920 / 256,

+    10,

+    0x12, 1984 % 256, 1984 / 256,

+    0x13, 2048 % 256, 2048 / 256,

+    0x14, 2112 % 256, 2112 / 256,

+    0x15, 2176 % 256, 2176 / 256,

+    0x16, 2240 % 256, 2240 / 256,

+    0x17, 2304 % 256, 2304 / 256,

+    0x1c, 2368 % 256, 2368 / 256,

+    0x1d, 2432 % 256, 2432 / 256,

+    0x1e, 2496 % 256, 2496 / 256,

+    0x1f, 2560 % 256, 2560 / 256,

+    0xff,

+};

+int _FaxGetRun(FX_LPCBYTE ins_array, const FX_BYTE* src_buf, int& bitpos, int bitsize)

+{

+    FX_DWORD code = 0;

+    int ins_off = 0;

+    while (1) {

+        FX_BYTE ins = ins_array[ins_off++];

+        if (ins == 0xff) {

+            return -1;

+        }

+        if (bitpos >= bitsize) {

+            return -1;

+        }

+        code <<= 1;

+        if (src_buf[bitpos / 8] & (1 << (7 - bitpos % 8))) {

+            code ++;

+        }

+        bitpos ++;

+        int next_off = ins_off + ins * 3;

+        for (; ins_off < next_off; ins_off += 3) {

+            if (ins_array[ins_off] == code) {

+                return ins_array[ins_off + 1] + ins_array[ins_off + 2] * 256;

+            }

+        }

+    }

+}

+FX_BOOL _FaxG4GetRow(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, const FX_BYTE* ref_buf, int columns)

+{

+    int a0 = -1, a0color = 1;

+    while (1) {

+        if (bitpos >= bitsize) {

+            return FALSE;

+        }

+        int a1, a2, b1, b2;

+        _FaxG4FindB1B2(ref_buf, columns, a0, a0color, b1, b2);

+        FX_BOOL bit = NEXTBIT;

+        int v_delta = 0;

+        if (bit) {

+        } else {

+            if (bitpos >= bitsize) {

+                return FALSE;

+            }

+            FX_BOOL bit1 = NEXTBIT;

+            if (bitpos >= bitsize) {

+                return FALSE;

+            }

+            FX_BOOL bit2 = NEXTBIT;

+            if (bit1 && bit2) {

+                v_delta = 1;

+            } else if (bit1) {

+                v_delta = -1;

+            } else if (bit2) {

+                int run_len1 = 0;

+                while (1) {

+                    int run = _FaxGetRun(a0color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf, bitpos, bitsize);

+                    run_len1 += run;

+                    if (run < 64) {

+                        break;

+                    }

+                }

+                if (a0 < 0) {

+                    run_len1 ++;

+                }

+                a1 = a0 + run_len1;

+                if (!a0color) {

+                    _FaxFillBits(dest_buf, columns, a0, a1);

+                }

+                int run_len2 = 0;

+                while (1) {

+                    int run = _FaxGetRun(a0color ? FaxBlackRunIns : FaxWhiteRunIns, src_buf, bitpos, bitsize);

+                    run_len2 += run;

+                    if (run < 64) {

+                        break;

+                    }

+                }

+                a2 = a1 + run_len2;

+                if (a0color) {

+                    _FaxFillBits(dest_buf, columns, a1, a2);

+                }

+                a0 = a2;

+                if (a0 < columns) {

+                    continue;

+                }

+                return TRUE;

+            } else {

+                if (bitpos >= bitsize) {

+                    return FALSE;

+                }

+                bit = NEXTBIT;

+                if (bit) {

+                    if (!a0color) {

+                        _FaxFillBits(dest_buf, columns, a0, b2);

+                    }

+                    if (b2 >= columns) {

+                        return TRUE;

+                    }

+                    a0 = b2;

+                    continue;

+                } else {

+                    if (bitpos >= bitsize) {

+                        return FALSE;

+                    }

+                    FX_BOOL bit1 = NEXTBIT;

+                    if (bitpos >= bitsize) {

+                        return FALSE;

+                    }

+                    FX_BOOL bit2 = NEXTBIT;

+                    if (bit1 && bit2) {

+                        v_delta = 2;

+                    } else if (bit1) {

+                        v_delta = -2;

+                    } else if (bit2) {

+                        if (bitpos >= bitsize) {

+                            return FALSE;

+                        }

+                        bit = NEXTBIT;

+                        if (bit) {

+                            v_delta = 3;

+                        } else {

+                            v_delta = -3;

+                        }

+                    } else {

+                        if (bitpos >= bitsize) {

+                            return FALSE;

+                        }

+                        bit = NEXTBIT;

+                        if (bit) {

+                            bitpos += 3;

+                            continue;

+                        } else {

+                            bitpos += 5;

+                            return TRUE;

+                        }

+                    }

+                }

+            }

+        }

+        a1 = b1 + v_delta;

+        if (!a0color) {

+            _FaxFillBits(dest_buf, columns, a0, a1);

+        }

+        if (a1 >= columns) {

+            return TRUE;

+        }

+        a0 = a1;

+        a0color = !a0color;

+    }

+}

+FX_BOOL _FaxSkipEOL(const FX_BYTE* src_buf, int bitsize, int& bitpos)

+{

+    int startbit = bitpos;

+    while (bitpos < bitsize) {

+        int bit = NEXTBIT;

+        if (bit) {

+            if (bitpos - startbit <= 11) {

+                bitpos = startbit;

+            }

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_BOOL _FaxGet1DLine(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, int columns)

+{

+    int color = TRUE;

+    int startpos = 0;

+    while (1) {

+        if (bitpos >= bitsize) {

+            return FALSE;

+        }

+        int run_len = 0;

+        while (1) {

+            int run = _FaxGetRun(color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf, bitpos, bitsize);

+            if (run < 0) {

+                while (bitpos < bitsize) {

+                    int bit = NEXTBIT;

+                    if (bit) {

+                        return TRUE;

+                    }

+                }

+                return FALSE;

+            }

+            run_len += run;

+            if (run < 64) {

+                break;

+            }

+        }

+        if (!color) {

+            _FaxFillBits(dest_buf, columns, startpos, startpos + run_len);

+        }

+        startpos += run_len;

+        if (startpos >= columns) {

+            break;

+        }

+        color = !color;

+    }

+    return TRUE;

+}

+class CCodec_FaxDecoder : public CCodec_ScanlineDecoder

+{

+public:

+    CCodec_FaxDecoder();

+    virtual ~CCodec_FaxDecoder();

+    FX_BOOL				Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+                               int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);

+    virtual void		v_DownScale(int dest_width, int dest_height) {}

+    virtual FX_BOOL		v_Rewind();

+    virtual FX_LPBYTE	v_GetNextLine();

+    virtual FX_DWORD	GetSrcOffset();

+    int			m_Encoding, m_bEndOfLine, m_bByteAlign, m_bBlack;

+    int			bitpos;

+    FX_LPCBYTE	m_pSrcBuf;

+    FX_DWORD	m_SrcSize;

+    FX_LPBYTE	m_pScanlineBuf, m_pRefBuf;

+};

+CCodec_FaxDecoder::CCodec_FaxDecoder()

+{

+    m_pScanlineBuf = NULL;

+    m_pRefBuf = NULL;

+}

+CCodec_FaxDecoder::~CCodec_FaxDecoder()

+{

+    if (m_pScanlineBuf) {

+        FX_Free(m_pScanlineBuf);

+    }

+    if (m_pRefBuf) {

+        FX_Free(m_pRefBuf);

+    }

+}

+FX_BOOL CCodec_FaxDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+                                  int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows)

+{

+    m_Encoding = K;

+    m_bEndOfLine = EndOfLine;

+    m_bByteAlign = EncodedByteAlign;

+    m_bBlack = BlackIs1;

+    m_OrigWidth = Columns;

+    m_OrigHeight = Rows;

+    if (m_OrigWidth == 0) {

+        m_OrigWidth = width;

+    }

+    if (m_OrigHeight == 0) {

+        m_OrigHeight = height;

+    }

+    m_Pitch = (m_OrigWidth + 31) / 32 * 4;

+    m_OutputWidth = m_OrigWidth;

+    m_OutputHeight = m_OrigHeight;

+    m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);

+    if (m_pScanlineBuf == NULL) {

+        return FALSE;

+    }

+    m_pRefBuf = FX_Alloc(FX_BYTE, m_Pitch);

+    if (m_pRefBuf == NULL) {

+        return FALSE;

+    }

+    m_pSrcBuf = src_buf;

+    m_SrcSize = src_size;

+    m_nComps = 1;

+    m_bpc = 1;

+    m_bColorTransformed = FALSE;

+    return TRUE;

+}

+FX_BOOL CCodec_FaxDecoder::v_Rewind()

+{

+    FXSYS_memset8(m_pRefBuf, 0xff, m_Pitch);

+    bitpos = 0;

+    return TRUE;

+}

+FX_LPBYTE CCodec_FaxDecoder::v_GetNextLine()

+{

+    int bitsize = m_SrcSize * 8;

+    _FaxSkipEOL(m_pSrcBuf, bitsize, bitpos);

+    if (bitpos >= bitsize) {

+        return NULL;

+    }

+    FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);

+    if (m_Encoding < 0) {

+        _FaxG4GetRow(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_OrigWidth);

+        FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);

+    } else if (m_Encoding == 0) {

+        _FaxGet1DLine(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_OrigWidth);

+    } else {

+        FX_BOOL bNext1D = m_pSrcBuf[bitpos / 8] & (1 << (7 - bitpos % 8));

+        bitpos ++;

+        if (bNext1D) {

+            _FaxGet1DLine(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_OrigWidth);

+        } else {

+            _FaxG4GetRow(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_OrigWidth);

+        }

+        FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);

+    }

+    if (m_bEndOfLine) {

+        _FaxSkipEOL(m_pSrcBuf, bitsize, bitpos);

+    }

+    if (m_bByteAlign && bitpos < bitsize) {

+        int bitpos0 = bitpos;

+        int bitpos1 = (bitpos + 7) / 8 * 8;

+        while (m_bByteAlign && bitpos0 < bitpos1) {

+            int bit = m_pSrcBuf[bitpos0 / 8] & (1 << (7 - bitpos0 % 8));

+            if (bit != 0) {

+                m_bByteAlign = FALSE;

+            } else {

+                bitpos0 ++;

+            }

+        }

+        if (m_bByteAlign) {

+            bitpos = bitpos1;

+        }

+    }

+    if (m_bBlack) {

+        for (int i = 0; i < m_Pitch; i ++) {

+            m_pScanlineBuf[i] = ~m_pScanlineBuf[i];

+        }

+    }

+    return m_pScanlineBuf;

+}

+FX_DWORD CCodec_FaxDecoder::GetSrcOffset()

+{

+    FX_DWORD ret = (bitpos + 7) / 8;

+    if (ret > m_SrcSize) {

+        ret = m_SrcSize;

+    }

+    return ret;

+}

+extern "C" {

+    void _FaxG4Decode(void*, FX_LPCBYTE src_buf, FX_DWORD src_size, int* pbitpos, FX_LPBYTE dest_buf, int width, int height, int pitch)

+    {

+        if (pitch == 0) {

+            pitch = (width + 7) / 8;

+        }

+        FX_LPBYTE ref_buf = FX_Alloc(FX_BYTE, pitch);

+        if (ref_buf == NULL) {

+            return;

+        }

+        FXSYS_memset8(ref_buf, 0xff, pitch);

+        int bitpos = *pbitpos;

+        for (int iRow = 0; iRow < height; iRow ++) {

+            FX_LPBYTE line_buf = dest_buf + iRow * pitch;

+            FXSYS_memset8(line_buf, 0xff, pitch);

+            _FaxG4GetRow(src_buf, src_size << 3, bitpos, line_buf, ref_buf, width);

+            FXSYS_memcpy32(ref_buf, line_buf, pitch);

+        }

+        FX_Free(ref_buf);

+        *pbitpos = bitpos;

+    }

+};

+static const FX_BYTE BlackRunTerminator[128] = {

+    0x37, 10, 0x02, 3, 0x03, 2, 0x02, 2, 0x03, 3, 0x03, 4, 0x02, 4, 0x03, 5,

+    0x05, 6, 0x04, 6, 0x04, 7, 0x05, 7, 0x07, 7, 0x04, 8, 0x07, 8, 0x18, 9,

+    0x17, 10, 0x18, 10, 0x08, 10, 0x67, 11, 0x68, 11, 0x6c, 11, 0x37, 11, 0x28, 11,

+    0x17, 11, 0x18, 11, 0xca, 12, 0xcb, 12, 0xcc, 12, 0xcd, 12, 0x68, 12, 0x69, 12,

+    0x6a, 12, 0x6b, 12, 0xd2, 12, 0xd3, 12, 0xd4, 12, 0xd5, 12, 0xd6, 12, 0xd7, 12,

+    0x6c, 12, 0x6d, 12, 0xda, 12, 0xdb, 12, 0x54, 12, 0x55, 12, 0x56, 12, 0x57, 12,

+    0x64, 12, 0x65, 12, 0x52, 12, 0x53, 12, 0x24, 12, 0x37, 12, 0x38, 12, 0x27, 12,

+    0x28, 12, 0x58, 12, 0x59, 12, 0x2b, 12, 0x2c, 12, 0x5a, 12, 0x66, 12, 0x67, 12,

+};

+static const FX_BYTE BlackRunMarkup[80] = {

+    0x0f, 10, 0xc8, 12, 0xc9, 12, 0x5b, 12, 0x33, 12, 0x34, 12, 0x35, 12, 0x6c, 13,

+    0x6d, 13, 0x4a, 13, 0x4b, 13, 0x4c, 13, 0x4d, 13, 0x72, 13, 0x73, 13, 0x74, 13,

+    0x75, 13, 0x76, 13, 0x77, 13, 0x52, 13, 0x53, 13, 0x54, 13, 0x55, 13, 0x5a, 13,

+    0x5b, 13, 0x64, 13, 0x65, 13, 0x08, 11, 0x0c, 11, 0x0d, 11, 0x12, 12, 0x13, 12,

+    0x14, 12, 0x15, 12, 0x16, 12, 0x17, 12, 0x1c, 12, 0x1d, 12, 0x1e, 12, 0x1f, 12,

+};

+static const FX_BYTE WhiteRunTerminator[128] = {

+    0x35, 8,

+    0x07, 6,

+    0x07, 4,

+    0x08, 4,

+    0x0B, 4,

+    0x0C, 4,

+    0x0E, 4,

+    0x0F, 4,

+    0x13, 5,

+    0x14, 5,

+    0x07, 5,

+    0x08, 5,

+    0x08, 6,

+    0x03, 6,

+    0x34, 6,

+    0x35, 6,

+    0x2a, 6,

+    0x2B, 6,

+    0x27, 7,

+    0x0c, 7,

+    0x08, 7,

+    0x17, 7,

+    0x03, 7,

+    0x04, 7,

+    0x28, 7,

+    0x2B, 7,

+    0x13, 7,

+    0x24, 7,

+    0x18, 7,

+    0x02, 8,

+    0x03, 8,

+    0x1a, 8,

+    0x1b, 8,

+    0x12, 8,

+    0x13, 8,

+    0x14, 8,

+    0x15, 8,

+    0x16, 8,

+    0x17, 8,

+    0x28, 8,

+    0x29, 8,

+    0x2a, 8,

+    0x2b, 8,

+    0x2c, 8,

+    0x2d, 8,

+    0x04, 8,

+    0x05, 8,

+    0x0a, 8,

+    0x0b, 8,

+    0x52, 8,

+    0x53, 8,

+    0x54, 8,

+    0x55, 8,

+    0x24, 8,

+    0x25, 8,

+    0x58, 8,

+    0x59, 8,

+    0x5a, 8,

+    0x5b, 8,

+    0x4a, 8,

+    0x4b, 8,

+    0x32, 8,

+    0x33, 8,

+    0x34, 8,

+};

+static const FX_BYTE WhiteRunMarkup[80] = {

+    0x1b, 5,

+    0x12, 5,

+    0x17, 6,

+    0x37, 7,

+    0x36, 8,

+    0x37, 8,

+    0x64, 8,

+    0x65, 8,

+    0x68, 8,

+    0x67, 8,

+    0xcc, 9,

+    0xcd, 9,

+    0xd2, 9,

+    0xd3, 9,

+    0xd4, 9,

+    0xd5, 9,

+    0xd6, 9,

+    0xd7, 9,

+    0xd8, 9,

+    0xd9, 9,

+    0xda, 9,

+    0xdb, 9,

+    0x98, 9,

+    0x99, 9,

+    0x9a, 9,

+    0x18, 6,

+    0x9b, 9,

+    0x08, 11,

+    0x0c, 11,

+    0x0d, 11,

+    0x12, 12,

+    0x13, 12,

+    0x14, 12,

+    0x15, 12,

+    0x16, 12,

+    0x17, 12,

+    0x1c, 12,

+    0x1d, 12,

+    0x1e, 12,

+    0x1f, 12,

+};

+static void _AddBitStream(FX_LPBYTE dest_buf, int& dest_bitpos, int data, int bitlen)

+{

+    for (int i = bitlen - 1; i >= 0; i --) {

+        if (data & (1 << i)) {

+            dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);

+        }

+        dest_bitpos ++;

+    }

+}

+static void _FaxEncodeRun(FX_LPBYTE dest_buf, int& dest_bitpos, int run, FX_BOOL bWhite)

+{

+    while (run >= 2560) {

+        _AddBitStream(dest_buf, dest_bitpos, 0x1f, 12);

+        run -= 2560;

+    }

+    if (run >= 64) {

+        int markup = run - run % 64;

+        FX_LPCBYTE p = bWhite ? WhiteRunMarkup : BlackRunMarkup;

+        p += (markup / 64 - 1) * 2;

+        _AddBitStream(dest_buf, dest_bitpos, *p, p[1]);

+    }

+    run %= 64;

+    FX_LPCBYTE p = bWhite ? WhiteRunTerminator : BlackRunTerminator;

+    p += run * 2;

+    _AddBitStream(dest_buf, dest_bitpos, *p, p[1]);

+}

+static void _FaxEncode2DLine(FX_LPBYTE dest_buf, int& dest_bitpos, FX_LPCBYTE src_buf, FX_LPCBYTE ref_buf, int cols)

+{

+    int a0 = -1, a0color = 1;

+    while (1) {

+        int a1 = _FindBit(src_buf, cols, a0 + 1, 1 - a0color);

+        int b1, b2;

+        _FaxG4FindB1B2(ref_buf, cols, a0, a0color, b1, b2);

+        if (b2 < a1) {

+            dest_bitpos += 3;

+            dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);

+            dest_bitpos ++;

+            a0 = b2;

+        } else if (a1 - b1 <= 3 && b1 - a1 <= 3) {

+            int delta = a1 - b1;

+            switch (delta) {

+                case 0:

+                    dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);

+                    break;

+                case 1:

+                case 2:

+                case 3:

+                    dest_bitpos += delta == 1 ? 1 : delta + 2;

+                    dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);

+                    dest_bitpos ++;

+                    dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);

+                    break;

+                case -1:

+                case -2:

+                case -3:

+                    dest_bitpos += delta == -1 ? 1 : -delta + 2;

+                    dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);

+                    dest_bitpos ++;

+                    break;

+            }

+            dest_bitpos ++;

+            a0 = a1;

+            a0color = 1 - a0color;

+        } else {

+            int a2 = _FindBit(src_buf, cols, a1 + 1, a0color);

+            dest_bitpos ++;

+            dest_bitpos ++;

+            dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);

+            dest_bitpos ++;

+            if (a0 < 0) {

+                a0 = 0;

+            }

+            _FaxEncodeRun(dest_buf, dest_bitpos, a1 - a0, a0color);

+            _FaxEncodeRun(dest_buf, dest_bitpos, a2 - a1, 1 - a0color);

+            a0 = a2;

+        }

+        if (a0 >= cols) {

+            return;

+        }

+    }

+}

+class CCodec_FaxEncoder : public CFX_Object

+{

+public:

+    CCodec_FaxEncoder(FX_LPCBYTE src_buf, int width, int height, int pitch);

+    ~CCodec_FaxEncoder();

+    void			Encode(FX_LPBYTE& dest_buf, FX_DWORD& dest_size);

+    void			Encode2DLine(FX_LPCBYTE scan_line);

+    CFX_BinaryBuf	m_DestBuf;

+    FX_LPBYTE		m_pRefLine, m_pLineBuf;

+    int				m_Cols, m_Rows, m_Pitch;

+    FX_LPCBYTE		m_pSrcBuf;

+};

+CCodec_FaxEncoder::CCodec_FaxEncoder(FX_LPCBYTE src_buf, int width, int height, int pitch)

+{

+    m_pSrcBuf = src_buf;

+    m_Cols = width;

+    m_Rows = height;

+    m_Pitch = pitch;

+    m_pRefLine = FX_Alloc(FX_BYTE, m_Pitch);

+    if (m_pRefLine == NULL) {

+        return;

+    }

+    FXSYS_memset8(m_pRefLine, 0xff, m_Pitch);

+    m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch * 8);

+    if (m_pLineBuf == NULL) {

+        return;

+    }

+    m_DestBuf.EstimateSize(0, 10240);

+}

+CCodec_FaxEncoder::~CCodec_FaxEncoder()

+{

+    if (m_pRefLine) {

+        FX_Free(m_pRefLine);

+    }

+    if (m_pLineBuf) {

+        FX_Free(m_pLineBuf);

+    }

+}

+void CCodec_FaxEncoder::Encode(FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    int dest_bitpos = 0;

+    FX_BYTE last_byte = 0;

+    for (int i = 0; i < m_Rows; i ++) {

+        FX_LPCBYTE scan_line = m_pSrcBuf + i * m_Pitch;

+        FXSYS_memset32(m_pLineBuf, 0, m_Pitch * 8);

+        m_pLineBuf[0] = last_byte;

+        _FaxEncode2DLine(m_pLineBuf, dest_bitpos, scan_line, m_pRefLine, m_Cols);

+        m_DestBuf.AppendBlock(m_pLineBuf, dest_bitpos / 8);

+        last_byte = m_pLineBuf[dest_bitpos / 8];

+        dest_bitpos %= 8;

+        FXSYS_memcpy32(m_pRefLine, scan_line, m_Pitch);

+    }

+    if (dest_bitpos) {

+        m_DestBuf.AppendByte(last_byte);

+    }

+    dest_buf = m_DestBuf.GetBuffer();

+    dest_size = m_DestBuf.GetSize();

+    m_DestBuf.DetachBuffer();

+}

+FX_BOOL	CCodec_FaxModule::Encode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    CCodec_FaxEncoder encoder(src_buf, width, height, pitch);

+    encoder.Encode(dest_buf, dest_size);

+    return TRUE;

+}

+ICodec_ScanlineDecoder*	CCodec_FaxModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+        int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows)

+{

+    CCodec_FaxDecoder* pDecoder = FX_NEW CCodec_FaxDecoder;

+    if (pDecoder == NULL) {

+        return NULL;

+    }

+    pDecoder->Create(src_buf, src_size, width, height, K, EndOfLine, EncodedByteAlign, BlackIs1, Columns, Rows);

+    return pDecoder;

+}

diff --git a/core/src/fxcodec/codec/fx_codec_flate.cpp b/core/src/fxcodec/codec/fx_codec_flate.cpp
new file mode 100644
index 0000000..b6f94e0
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_flate.cpp
@@ -0,0 +1,945 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../fx_zlib.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "codec_int.h"

+extern "C"

+{

+    static void* my_alloc_func (void* opaque, unsigned int items, unsigned int size)

+    {

+        return FX_Alloc(FX_BYTE, items * size);

+    }

+    static void   my_free_func  (void* opaque, void* address)

+    {

+        FX_Free(address);

+    }

+    void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),

+                            void (*free_func)(void*, void*))

+    {

+        z_stream* p = (z_stream*)alloc_func(0, 1, sizeof(z_stream));

+        if (p == NULL) {

+            return NULL;

+        }

+        FXSYS_memset32(p, 0, sizeof(z_stream));

+        p->zalloc = alloc_func;

+        p->zfree = free_func;

+        inflateInit(p);

+        return p;

+    }

+    void FPDFAPI_FlateInput(void* context, const unsigned char* src_buf, unsigned int src_size)

+    {

+        ((z_stream*)context)->next_in = (unsigned char*)src_buf;

+        ((z_stream*)context)->avail_in = src_size;

+    }

+    int FPDFAPI_FlateGetTotalOut(void* context)

+    {

+        return ((z_stream*)context)->total_out;

+    }

+    int FPDFAPI_FlateOutput(void* context, unsigned char* dest_buf, unsigned int dest_size)

+    {

+        ((z_stream*)context)->next_out = dest_buf;

+        ((z_stream*)context)->avail_out = dest_size;

+        unsigned int pre_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context);

+        int ret = inflate((z_stream*)context, Z_SYNC_FLUSH);

+        unsigned int post_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context);

+        unsigned int written = post_pos - pre_pos;

+        if (written < dest_size) {

+            FXSYS_memset8(dest_buf + written, '\0', dest_size - written);

+        }

+        return ret;

+    }

+    int FPDFAPI_FlateGetTotalIn(void* context)

+    {

+        return ((z_stream*)context)->total_in;

+    }

+    int FPDFAPI_FlateGetAvailOut(void* context)

+    {

+        return ((z_stream*)context)->avail_out;

+    }

+    int FPDFAPI_FlateGetAvailIn(void* context)

+    {

+        return ((z_stream*)context)->avail_in;

+    }

+    void FPDFAPI_FlateEnd(void* context)

+    {

+        inflateEnd((z_stream*)context);

+        ((z_stream*)context)->zfree(0, context);

+    }

+    void FPDFAPI_FlateCompress(unsigned char* dest_buf, unsigned long* dest_size, const unsigned char* src_buf, unsigned long src_size)

+    {

+        compress(dest_buf, dest_size, src_buf, src_size);

+    }

+}

+class CLZWDecoder : public CFX_Object

+{

+public:

+    FX_BOOL Decode(FX_LPBYTE output, FX_DWORD& outlen, const FX_BYTE* input, FX_DWORD& size, FX_BOOL bEarlyChange);

+private:

+    FX_DWORD	m_InPos;

+    FX_DWORD	m_OutPos;

+    FX_LPBYTE	m_pOutput;

+    const FX_BYTE*	m_pInput;

+    FX_BOOL		m_Early;

+    void		AddCode(FX_DWORD prefix_code, FX_BYTE append_char);

+    FX_DWORD	m_CodeArray[5021];

+    FX_DWORD	m_nCodes;

+    FX_BYTE		m_DecodeStack[4000];

+    FX_DWORD	m_StackLen;

+    void		DecodeString(FX_DWORD code);

+    int			m_CodeLen;

+};

+void CLZWDecoder::AddCode(FX_DWORD prefix_code, FX_BYTE append_char)

+{

+    if (m_nCodes + m_Early == 4094) {

+        return;

+    }

+    m_CodeArray[m_nCodes ++] = (prefix_code << 16) | append_char;

+    if (m_nCodes + m_Early == 512 - 258) {

+        m_CodeLen = 10;

+    } else if (m_nCodes + m_Early == 1024 - 258) {

+        m_CodeLen = 11;

+    } else if (m_nCodes + m_Early == 2048 - 258) {

+        m_CodeLen = 12;

+    }

+}

+void CLZWDecoder::DecodeString(FX_DWORD code)

+{

+    while (1) {

+        int index = code - 258;

+        if (index < 0 || index >= (int)m_nCodes) {

+            break;

+        }

+        FX_DWORD data = m_CodeArray[index];

+        if (m_StackLen >= sizeof(m_DecodeStack)) {

+            return;

+        }

+        m_DecodeStack[m_StackLen++] = (FX_BYTE)data;

+        code = data >> 16;

+    }

+    if (m_StackLen >= sizeof(m_DecodeStack)) {

+        return;

+    }

+    m_DecodeStack[m_StackLen++] = (FX_BYTE)code;

+}

+int CLZWDecoder::Decode(FX_LPBYTE dest_buf, FX_DWORD& dest_size, const FX_BYTE* src_buf, FX_DWORD& src_size, FX_BOOL bEarlyChange)

+{

+    m_CodeLen = 9;

+    m_InPos = 0;

+    m_OutPos = 0;

+    m_pInput = src_buf;

+    m_pOutput = dest_buf;

+    m_Early = bEarlyChange ? 1 : 0;

+    m_nCodes = 0;

+    FX_DWORD old_code = (FX_DWORD) - 1;

+    FX_BYTE last_char;

+    while (1) {

+        if (m_InPos + m_CodeLen > src_size * 8) {

+            break;

+        }

+        int byte_pos = m_InPos / 8;

+        int bit_pos = m_InPos % 8, bit_left = m_CodeLen;

+        FX_DWORD code = 0;

+        if (bit_pos) {

+            bit_left -= 8 - bit_pos;

+            code = (m_pInput[byte_pos++] & ((1 << (8 - bit_pos)) - 1)) << bit_left;

+        }

+        if (bit_left < 8) {

+            code |= m_pInput[byte_pos] >> (8 - bit_left);

+        } else {

+            bit_left -= 8;

+            code |= m_pInput[byte_pos++] << bit_left;

+            if (bit_left) {

+                code |= m_pInput[byte_pos] >> (8 - bit_left);

+            }

+        }

+        m_InPos += m_CodeLen;

+        if (code < 256) {

+            if (m_OutPos == dest_size) {

+                return -5;

+            }

+            if (m_pOutput) {

+                m_pOutput[m_OutPos] = (FX_BYTE)code;

+            }

+            m_OutPos ++;

+            last_char = (FX_BYTE)code;

+            if (old_code != (FX_DWORD) - 1) {

+                AddCode(old_code, last_char);

+            }

+            old_code = code;

+        } else if (code == 256) {

+            m_CodeLen = 9;

+            m_nCodes = 0;

+            old_code = (FX_DWORD) - 1;

+        } else if (code == 257) {

+            break;

+        } else {

+            if (old_code == (FX_DWORD) - 1) {

+                return 2;

+            }

+            m_StackLen = 0;

+            if (code >= m_nCodes + 258) {

+                if (m_StackLen < sizeof(m_DecodeStack)) {

+                    m_DecodeStack[m_StackLen++] = last_char;

+                }

+                DecodeString(old_code);

+            } else {

+                DecodeString(code);

+            }

+            if (m_OutPos + m_StackLen > dest_size) {

+                return -5;

+            }

+            if (m_pOutput) {

+                for (FX_DWORD i = 0; i < m_StackLen; i ++) {

+                    m_pOutput[m_OutPos + i] = m_DecodeStack[m_StackLen - i - 1];

+                }

+            }

+            m_OutPos += m_StackLen;

+            last_char = m_DecodeStack[m_StackLen - 1];

+            if (old_code < 256) {

+                AddCode(old_code, last_char);

+            } else if (old_code - 258 >= m_nCodes) {

+                dest_size = m_OutPos;

+                src_size = (m_InPos + 7) / 8;

+                return 0;

+            } else {

+                AddCode(old_code, last_char);

+            }

+            old_code = code;

+        }

+    }

+    dest_size = m_OutPos;

+    src_size = (m_InPos + 7) / 8;

+    return 0;

+}

+static FX_BYTE PaethPredictor(int a, int b, int c)

+{

+    int p = a + b - c;

+    int pa = FXSYS_abs(p - a);

+    int pb = FXSYS_abs(p - b);

+    int pc = FXSYS_abs(p - c);

+    if (pa <= pb && pa <= pc) {

+        return (FX_BYTE)a;

+    }

+    if (pb <= pc) {

+        return (FX_BYTE)b;

+    }

+    return (FX_BYTE)c;

+}

+static void PNG_PredictorEncode(FX_LPBYTE& data_buf, FX_DWORD& data_size, int predictor, int Colors, int BitsPerComponent, int Columns)

+{

+    int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8;

+    int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;

+    int row_count = (data_size + row_size - 1) / row_size;

+    int last_row_size = data_size % row_size;

+    FX_LPBYTE dest_buf = FX_Alloc( FX_BYTE, (row_size + 1) * row_count);

+    if (dest_buf == NULL) {

+        return;

+    }

+    int byte_cnt = 0;

+    FX_LPBYTE pSrcData = data_buf;

+    FX_LPBYTE pDestData = dest_buf;

+    for (int row = 0; row < row_count; row++) {

+        if (predictor == 10) {

+            pDestData[0] = 0;

+            int move_size = row_size;

+            if (move_size * (row + 1) > (int)data_size) {

+                move_size = data_size - (move_size * row);

+            }

+            FXSYS_memmove32(pDestData + 1, pSrcData, move_size);

+            pDestData += (move_size + 1);

+            pSrcData += move_size;

+            byte_cnt += move_size;

+            continue;

+        }

+        for (int byte = 0; byte < row_size && byte_cnt < (int)data_size; byte++) {

+            switch (predictor) {

+                case 11: {

+                        pDestData[0] = 1;

+                        FX_BYTE left = 0;

+                        if (byte >= BytesPerPixel) {

+                            left = pSrcData[byte - BytesPerPixel];

+                        }

+                        pDestData[byte + 1] = pSrcData[byte] - left;

+                    }

+                    break;

+                case 12: {

+                        pDestData[0] = 2;

+                        FX_BYTE up = 0;

+                        if (row) {

+                            up = pSrcData[byte - row_size];

+                        }

+                        pDestData[byte + 1] = pSrcData[byte] - up;

+                    }

+                    break;

+                case 13: {

+                        pDestData[0] = 3;

+                        FX_BYTE left = 0;

+                        if (byte >= BytesPerPixel) {

+                            left = pSrcData[byte - BytesPerPixel];

+                        }

+                        FX_BYTE up = 0;

+                        if (row) {

+                            up = pSrcData[byte - row_size];

+                        }

+                        pDestData[byte + 1] = pSrcData[byte] - (left + up) / 2;

+                    }

+                    break;

+                case 14: {

+                        pDestData[0] = 4;

+                        FX_BYTE left = 0;

+                        if (byte >= BytesPerPixel) {

+                            left = pSrcData[byte - BytesPerPixel];

+                        }

+                        FX_BYTE up = 0;

+                        if (row) {

+                            up = pSrcData[byte - row_size];

+                        }

+                        FX_BYTE upper_left = 0;

+                        if (byte >= BytesPerPixel && row) {

+                            upper_left = pSrcData[byte - row_size - BytesPerPixel];

+                        }

+                        pDestData[byte + 1] = pSrcData[byte] - PaethPredictor(left, up, upper_left);

+                    }

+                    break;

+                default: {

+                        pDestData[byte + 1] = pSrcData[byte];

+                    }

+                    break;

+            }

+            byte_cnt++;

+        }

+        pDestData += (row_size + 1);

+        pSrcData += row_size;

+    }

+    FX_Free(data_buf);

+    data_buf = dest_buf;

+    data_size = (row_size + 1) * row_count - (last_row_size > 0 ? (row_size - last_row_size) : 0);

+}

+static void PNG_PredictLine(FX_LPBYTE pDestData, FX_LPCBYTE pSrcData, FX_LPCBYTE pLastLine,

+                            int bpc, int nColors, int nPixels)

+{

+    int row_size = (nPixels * bpc * nColors + 7) / 8;

+    int BytesPerPixel = (bpc * nColors + 7) / 8;

+    FX_BYTE tag = pSrcData[0];

+    if (tag == 0) {

+        FXSYS_memmove32(pDestData, pSrcData + 1, row_size);

+        return;

+    }

+    for (int byte = 0; byte < row_size; byte ++) {

+        FX_BYTE raw_byte = pSrcData[byte + 1];

+        switch (tag) {

+            case 1:	{

+                    FX_BYTE left = 0;

+                    if (byte >= BytesPerPixel) {

+                        left = pDestData[byte - BytesPerPixel];

+                    }

+                    pDestData[byte] = raw_byte + left;

+                    break;

+                }

+            case 2: {

+                    FX_BYTE up = 0;

+                    if (pLastLine) {

+                        up = pLastLine[byte];

+                    }

+                    pDestData[byte] = raw_byte + up;

+                    break;

+                }

+            case 3: {

+                    FX_BYTE left = 0;

+                    if (byte >= BytesPerPixel) {

+                        left = pDestData[byte - BytesPerPixel];

+                    }

+                    FX_BYTE up = 0;

+                    if (pLastLine) {

+                        up = pLastLine[byte];

+                    }

+                    pDestData[byte] = raw_byte + (up + left) / 2;

+                    break;

+                }

+            case 4: {

+                    FX_BYTE left = 0;

+                    if (byte >= BytesPerPixel) {

+                        left = pDestData[byte - BytesPerPixel];

+                    }

+                    FX_BYTE up = 0;

+                    if (pLastLine) {

+                        up = pLastLine[byte];

+                    }

+                    FX_BYTE upper_left = 0;

+                    if (byte >= BytesPerPixel && pLastLine) {

+                        upper_left = pLastLine[byte - BytesPerPixel];

+                    }

+                    pDestData[byte] = raw_byte + PaethPredictor(left, up, upper_left);

+                    break;

+                }

+            default:

+                pDestData[byte] = raw_byte;

+                break;

+        }

+    }

+}

+static void PNG_Predictor(FX_LPBYTE& data_buf, FX_DWORD& data_size,

+                          int Colors, int BitsPerComponent, int Columns)

+{

+    int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8;

+    int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;

+    int row_count = (data_size + row_size) / (row_size + 1);

+    int last_row_size = data_size % (row_size + 1);

+    FX_LPBYTE dest_buf = FX_Alloc( FX_BYTE, row_size * row_count);

+    if (dest_buf == NULL) {

+        return;

+    }

+    int byte_cnt = 0;

+    FX_LPBYTE pSrcData = data_buf;

+    FX_LPBYTE pDestData = dest_buf;

+    for (int row = 0; row < row_count; row ++) {

+        FX_BYTE tag = pSrcData[0];

+        if (tag == 0) {

+            int move_size = row_size;

+            if ((row + 1) * (move_size + 1) > (int)data_size) {

+                move_size = last_row_size - 1;

+            }

+            FXSYS_memmove32(pDestData, pSrcData + 1, move_size);

+            pSrcData += move_size + 1;

+            pDestData += move_size;

+            byte_cnt += move_size + 1;

+            continue;

+        }

+        for (int byte = 0; byte < row_size && byte_cnt < (int)data_size; byte ++) {

+            FX_BYTE raw_byte = pSrcData[byte + 1];

+            switch (tag) {

+                case 1:	{

+                        FX_BYTE left = 0;

+                        if (byte >= BytesPerPixel) {

+                            left = pDestData[byte - BytesPerPixel];

+                        }

+                        pDestData[byte] = raw_byte + left;

+                        break;

+                    }

+                case 2: {

+                        FX_BYTE up = 0;

+                        if (row) {

+                            up = pDestData[byte - row_size];

+                        }

+                        pDestData[byte] = raw_byte + up;

+                        break;

+                    }

+                case 3: {

+                        FX_BYTE left = 0;

+                        if (byte >= BytesPerPixel) {

+                            left = pDestData[byte - BytesPerPixel];

+                        }

+                        FX_BYTE up = 0;

+                        if (row) {

+                            up = pDestData[byte - row_size];

+                        }

+                        pDestData[byte] = raw_byte + (up + left) / 2;

+                        break;

+                    }

+                case 4: {

+                        FX_BYTE left = 0;

+                        if (byte >= BytesPerPixel) {

+                            left = pDestData[byte - BytesPerPixel];

+                        }

+                        FX_BYTE up = 0;

+                        if (row) {

+                            up = pDestData[byte - row_size];

+                        }

+                        FX_BYTE upper_left = 0;

+                        if (byte >= BytesPerPixel && row) {

+                            upper_left = pDestData[byte - row_size - BytesPerPixel];

+                        }

+                        pDestData[byte] = raw_byte + PaethPredictor(left, up, upper_left);

+                        break;

+                    }

+                default:

+                    pDestData[byte] = raw_byte;

+                    break;

+            }

+            byte_cnt++;

+        }

+        pSrcData += row_size + 1;

+        pDestData += row_size;

+        byte_cnt++;

+    }

+    FX_Free(data_buf);

+    data_buf = dest_buf;

+    data_size = row_size * row_count - (last_row_size > 0 ? (row_size + 1 - last_row_size) : 0);

+}

+static void TIFF_PredictorEncodeLine(FX_LPBYTE dest_buf, int row_size, int BitsPerComponent, int Colors, int Columns)

+{

+    int BytesPerPixel = BitsPerComponent * Colors / 8;

+    if (BitsPerComponent < 8) {

+        FX_BYTE mask = 0x01;

+        if (BitsPerComponent == 2) {

+            mask = 0x03;

+        } else if (BitsPerComponent == 4) {

+            mask = 0x0F;

+        }

+        int row_bits = Colors * BitsPerComponent * Columns;

+        for (int i = row_bits - BitsPerComponent; i >= BitsPerComponent; i -= BitsPerComponent) {

+            int col = i % 8;

+            int index = i / 8;

+            int col_pre = (col == 0) ? (8 - BitsPerComponent) : (col - BitsPerComponent);

+            int index_pre = (col == 0) ? (index - 1) : index;

+            FX_BYTE cur = (dest_buf[index] >> (8 - col - BitsPerComponent)) & mask;

+            FX_BYTE left = (dest_buf[index_pre] >> (8 - col_pre - BitsPerComponent)) & mask;

+            cur -= left;

+            cur &= mask;

+            cur <<= (8 - col - BitsPerComponent);

+            dest_buf[index] &= ~(mask << ((8 - col - BitsPerComponent)));

+            dest_buf[index] |= cur;

+        }

+    } else if (BitsPerComponent == 8) {

+        for (int i = row_size - 1; i >= BytesPerPixel; i--) {

+            dest_buf[i] -= dest_buf[i - BytesPerPixel];

+        }

+    } else {

+        for (int i = row_size - BytesPerPixel; i >= BytesPerPixel; i -= BytesPerPixel) {

+            FX_WORD pixel = (dest_buf[i] << 8) | dest_buf[i + 1];

+            pixel -= (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerPixel + 1];

+            dest_buf[i] = pixel >> 8;

+            dest_buf[i + 1] = (FX_BYTE)pixel;

+        }

+    }

+}

+static void TIFF_PredictorEncode(FX_LPBYTE& data_buf, FX_DWORD& data_size,

+                                 int Colors, int BitsPerComponent, int Columns)

+{

+    int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;

+    int row_count = (data_size + row_size - 1) / row_size;

+    int last_row_size = data_size % row_size;

+    for (int row = 0; row < row_count; row++) {

+        FX_LPBYTE scan_line = data_buf + row * row_size;

+        if ((row + 1) * row_size > (int)data_size) {

+            row_size = last_row_size;

+        }

+        TIFF_PredictorEncodeLine(scan_line, row_size, BitsPerComponent, Colors, Columns);

+    }

+}

+static void TIFF_PredictLine(FX_LPBYTE dest_buf, int row_size, int BitsPerComponent, int Colors, int Columns)

+{

+    if (BitsPerComponent == 1) {

+        int row_bits = BitsPerComponent * Colors * Columns;

+        for(int i = 1; i < row_bits; i ++) {

+            int col = i % 8;

+            int index = i / 8;

+            int index_pre = (col == 0) ? (index - 1) : index;

+            int col_pre = (col == 0) ? 8 : col;

+            if( ((dest_buf[index] >> (7 - col)) & 1) ^ ((dest_buf[index_pre] >> (8 - col_pre)) & 1) ) {

+                dest_buf[index] |= 1 << (7 - col);

+            } else {

+                dest_buf[index] &= ~(1 << (7 - col));

+            }

+        }

+        return;

+    }

+    int BytesPerPixel = BitsPerComponent * Colors / 8;

+    if (BitsPerComponent == 16) {

+        for (int i = BytesPerPixel; i < row_size; i += 2) {

+            FX_WORD pixel = (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerPixel + 1];

+            pixel += (dest_buf[i] << 8) | dest_buf[i + 1];

+            dest_buf[i] = pixel >> 8;

+            dest_buf[i + 1] = (FX_BYTE)pixel;

+        }

+    } else {

+        for (int i = BytesPerPixel; i < row_size; i ++) {

+            dest_buf[i] += dest_buf[i - BytesPerPixel];

+        }

+    }

+}

+static void TIFF_Predictor(FX_LPBYTE& data_buf, FX_DWORD& data_size,

+                           int Colors, int BitsPerComponent, int Columns)

+{

+    int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;

+    int row_count = (data_size + row_size - 1) / row_size;

+    int last_row_size = data_size % row_size;

+    for (int row = 0; row < row_count; row ++) {

+        FX_LPBYTE scan_line = data_buf + row * row_size;

+        if ((row + 1) * row_size > (int)data_size) {

+            row_size = last_row_size;

+        }

+        TIFF_PredictLine(scan_line, row_size, BitsPerComponent, Colors, Columns);

+    }

+}

+class CCodec_FlateScanlineDecoder : public CCodec_ScanlineDecoder

+{

+public:

+    CCodec_FlateScanlineDecoder();

+    ~CCodec_FlateScanlineDecoder();

+    FX_BOOL		Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc,

+                       int predictor, int Colors, int BitsPerComponent, int Columns);

+    virtual void		Destroy()

+    {

+        delete this;

+    }

+    virtual void		v_DownScale(int dest_width, int dest_height) {}

+    virtual FX_BOOL		v_Rewind();

+    virtual FX_LPBYTE	v_GetNextLine();

+    virtual FX_DWORD	GetSrcOffset();

+    void*				m_pFlate;

+    FX_LPCBYTE			m_SrcBuf;

+    FX_DWORD			m_SrcSize;

+    FX_LPBYTE			m_pScanline;

+    FX_LPBYTE			m_pLastLine;

+    FX_LPBYTE			m_pPredictBuffer;

+    FX_LPBYTE			m_pPredictRaw;

+    int					m_Predictor;

+    int					m_Colors, m_BitsPerComponent, m_Columns, m_PredictPitch, m_LeftOver;

+};

+CCodec_FlateScanlineDecoder::CCodec_FlateScanlineDecoder()

+{

+    m_pFlate = NULL;

+    m_pScanline = NULL;

+    m_pLastLine = NULL;

+    m_pPredictBuffer = NULL;

+    m_pPredictRaw = NULL;

+    m_LeftOver = 0;

+}

+CCodec_FlateScanlineDecoder::~CCodec_FlateScanlineDecoder()

+{

+    if (m_pScanline) {

+        FX_Free(m_pScanline);

+    }

+    if (m_pLastLine) {

+        FX_Free(m_pLastLine);

+    }

+    if (m_pPredictBuffer) {

+        FX_Free(m_pPredictBuffer);

+    }

+    if (m_pPredictRaw) {

+        FX_Free(m_pPredictRaw);

+    }

+    if (m_pFlate) {

+        FPDFAPI_FlateEnd(m_pFlate);

+    }

+}

+FX_BOOL CCodec_FlateScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+        int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns)

+{

+    m_SrcBuf = src_buf;

+    m_SrcSize = src_size;

+    m_OutputWidth = m_OrigWidth = width;

+    m_OutputHeight = m_OrigHeight = height;

+    m_nComps = nComps;

+    m_bpc = bpc;

+    m_bColorTransformed = FALSE;

+    m_Pitch = (width * nComps * bpc + 7) / 8;

+    m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);

+    if (m_pScanline == NULL) {

+        return FALSE;

+    }

+    m_Predictor = 0;

+    if (predictor) {

+        if (predictor >= 10) {

+            m_Predictor = 2;

+        } else if (predictor == 2) {

+            m_Predictor = 1;

+        }

+        if (m_Predictor) {

+            if (BitsPerComponent * Colors * Columns == 0) {

+                BitsPerComponent = m_bpc;

+                Colors = m_nComps;

+                Columns = m_OrigWidth;

+            }

+            m_Colors = Colors;

+            m_BitsPerComponent = BitsPerComponent;

+            m_Columns = Columns;

+            m_PredictPitch = (m_BitsPerComponent * m_Colors * m_Columns + 7) / 8;

+            m_pLastLine = FX_Alloc(FX_BYTE, m_PredictPitch);

+            if (m_pLastLine == NULL) {

+                return FALSE;

+            }

+            FXSYS_memset32(m_pLastLine, 0, m_PredictPitch);

+            m_pPredictRaw = FX_Alloc(FX_BYTE, m_PredictPitch + 1);

+            if (m_pPredictRaw == NULL) {

+                return FALSE;

+            }

+            m_pPredictBuffer = FX_Alloc(FX_BYTE, m_PredictPitch);

+            if (m_pPredictBuffer == NULL) {

+                return FALSE;

+            }

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CCodec_FlateScanlineDecoder::v_Rewind()

+{

+    if (m_pFlate) {

+        FPDFAPI_FlateEnd(m_pFlate);

+    }

+    m_pFlate = FPDFAPI_FlateInit(my_alloc_func, my_free_func);

+    if (m_pFlate == NULL) {

+        return FALSE;

+    }

+    FPDFAPI_FlateInput(m_pFlate, m_SrcBuf, m_SrcSize);

+    m_LeftOver = 0;

+    return TRUE;

+}

+FX_LPBYTE CCodec_FlateScanlineDecoder::v_GetNextLine()

+{

+    if (m_Predictor) {

+        if (m_Pitch == m_PredictPitch) {

+            if (m_Predictor == 2) {

+                FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);

+                PNG_PredictLine(m_pScanline, m_pPredictRaw, m_pLastLine, m_BitsPerComponent, m_Colors, m_Columns);

+                FXSYS_memcpy32(m_pLastLine, m_pScanline, m_PredictPitch);

+            } else {

+                FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch);

+                TIFF_PredictLine(m_pScanline, m_PredictPitch, m_bpc, m_nComps, m_OutputWidth);

+            }

+        } else {

+            int bytes_to_go = m_Pitch;

+            int read_leftover = m_LeftOver > bytes_to_go ? bytes_to_go : m_LeftOver;

+            if (read_leftover) {

+                FXSYS_memcpy32(m_pScanline, m_pPredictBuffer + m_PredictPitch - m_LeftOver, read_leftover);

+                m_LeftOver -= read_leftover;

+                bytes_to_go -= read_leftover;

+            }

+            while (bytes_to_go) {

+                if (m_Predictor == 2) {

+                    FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);

+                    PNG_PredictLine(m_pPredictBuffer, m_pPredictRaw, m_pLastLine, m_BitsPerComponent, m_Colors, m_Columns);

+                    FXSYS_memcpy32(m_pLastLine, m_pPredictBuffer, m_PredictPitch);

+                } else {

+                    FPDFAPI_FlateOutput(m_pFlate, m_pPredictBuffer, m_PredictPitch);

+                    TIFF_PredictLine(m_pPredictBuffer, m_PredictPitch, m_BitsPerComponent, m_Colors, m_Columns);

+                }

+                int read_bytes = m_PredictPitch > bytes_to_go ? bytes_to_go : m_PredictPitch;

+                FXSYS_memcpy32(m_pScanline + m_Pitch - bytes_to_go, m_pPredictBuffer, read_bytes);

+                m_LeftOver += m_PredictPitch - read_bytes;

+                bytes_to_go -= read_bytes;

+            }

+        }

+    } else {

+        FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch);

+    }

+    return m_pScanline;

+}

+FX_DWORD CCodec_FlateScanlineDecoder::GetSrcOffset()

+{

+    return FPDFAPI_FlateGetTotalIn(m_pFlate);

+}

+static void FlateUncompress(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_DWORD orig_size,

+                            FX_LPBYTE& dest_buf, FX_DWORD& dest_size, FX_DWORD& offset)

+{

+    FX_DWORD guess_size = orig_size ? orig_size : src_size * 2;

+    FX_DWORD alloc_step = orig_size ? 10240 : (src_size < 10240 ? 10240 : src_size);

+    static const FX_DWORD kMaxInitialAllocSize = 10000000;

+    if (guess_size > kMaxInitialAllocSize) {

+        guess_size = kMaxInitialAllocSize;

+        alloc_step = kMaxInitialAllocSize;

+    }

+    FX_LPBYTE guess_buf = FX_Alloc(FX_BYTE, guess_size + 1);

+    if (!guess_buf) {

+        dest_buf = NULL;

+        dest_size = 0;

+        return;

+    }

+    guess_buf[guess_size] = '\0';

+    FX_BOOL useOldImpl = src_size < 10240;

+    void* context = FPDFAPI_FlateInit(my_alloc_func, my_free_func);

+    if (context == NULL) {

+        dest_buf = NULL;

+        dest_size = 0;

+        return ;

+    }

+    FPDFAPI_FlateInput(context, src_buf, src_size);

+    CFX_ArrayTemplate<FX_LPBYTE> result_tmp_bufs;

+    FX_LPBYTE buf = guess_buf;

+    FX_DWORD buf_size = guess_size;

+    FX_DWORD last_buf_size = buf_size;

+    while (1) {

+        FX_INT32 ret = FPDFAPI_FlateOutput(context, buf, buf_size);

+        FX_INT32 avail_buf_size = FPDFAPI_FlateGetAvailOut(context);

+        if (!useOldImpl) {

+            if (ret != Z_OK) {

+                last_buf_size = buf_size - avail_buf_size;

+                result_tmp_bufs.Add(buf);

+                break;

+            }

+            if (avail_buf_size == 0) {

+                result_tmp_bufs.Add(buf);

+                buf = NULL;

+                buf = FX_Alloc(FX_BYTE, buf_size + 1);

+                if (!buf) {

+                    dest_buf = NULL;

+                    dest_size = 0;

+                    return;

+                }

+                buf[buf_size] = '\0';

+            } else {

+                last_buf_size = buf_size - avail_buf_size;

+                result_tmp_bufs.Add(buf);

+                buf = NULL;

+                break;

+            }

+        } else {

+            if (ret != Z_OK) {

+                break;

+            }

+            if (avail_buf_size == 0) {

+                FX_DWORD old_size = guess_size;

+                guess_size += alloc_step;

+                if (guess_size < old_size || guess_size + 1 < guess_size) {

+                    dest_buf = NULL;

+                    dest_size = 0;

+                    return;

+                }

+                guess_buf = FX_Realloc(FX_BYTE, guess_buf, guess_size + 1);

+                if (!guess_buf) {

+                    dest_buf = NULL;

+                    dest_size = 0;

+                    return;

+                }

+                guess_buf[guess_size] = '\0';

+                buf = guess_buf + old_size;

+                buf_size = guess_size - old_size;

+            } else {

+                break;

+            }

+        }

+    }

+    dest_size = FPDFAPI_FlateGetTotalOut(context);

+    offset = FPDFAPI_FlateGetTotalIn(context);

+    if (!useOldImpl) {

+        if (result_tmp_bufs.GetSize() == 1) {

+            dest_buf = result_tmp_bufs[0];

+        } else {

+            FX_LPBYTE result_buf = FX_Alloc(FX_BYTE, dest_size);

+            if (!result_buf) {

+                dest_buf = NULL;

+                dest_size = 0;

+                return;

+            }

+            FX_DWORD result_pos = 0;

+            for (FX_INT32 i = 0; i < result_tmp_bufs.GetSize(); i++) {

+                FX_LPBYTE tmp_buf = result_tmp_bufs[i];

+                FX_DWORD tmp_buf_size = buf_size;

+                if (i == result_tmp_bufs.GetSize() - 1) {

+                    tmp_buf_size = last_buf_size;

+                }

+                FXSYS_memcpy32(result_buf + result_pos, tmp_buf, tmp_buf_size);

+                result_pos += tmp_buf_size;

+                FX_Free(tmp_buf);

+                tmp_buf = NULL;

+                result_tmp_bufs[i] = NULL;

+            }

+            dest_buf = result_buf;

+        }

+    } else {

+        if (guess_size / 2 > dest_size) {

+            guess_buf = FX_Realloc(FX_BYTE, guess_buf, dest_size + 1);

+            if (!guess_buf) {

+                dest_buf = NULL;

+                dest_size = 0;

+                return;

+            }

+            guess_size = dest_size;

+            guess_buf[guess_size] = '\0';

+        }

+        dest_buf = guess_buf;

+    }

+    FPDFAPI_FlateEnd(context);

+    context = NULL;

+}

+ICodec_ScanlineDecoder*	CCodec_FlateModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+        int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns)

+{

+    CCodec_FlateScanlineDecoder* pDecoder = FX_NEW CCodec_FlateScanlineDecoder;

+    if (pDecoder == NULL) {

+        return NULL;

+    }

+    pDecoder->Create(src_buf, src_size, width, height, nComps, bpc, predictor, Colors, BitsPerComponent, Columns);

+    return pDecoder;

+}

+FX_DWORD CCodec_FlateModule::FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,

+        int predictor, int Colors, int BitsPerComponent, int Columns,

+        FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    CLZWDecoder* pDecoder = NULL;

+    dest_buf = NULL;

+    FX_DWORD offset = 0;

+    int predictor_type = 0;

+    if (predictor) {

+        if (predictor >= 10) {

+            predictor_type = 2;

+        } else if (predictor == 2) {

+            predictor_type = 1;

+        }

+    }

+    if (bLZW) {

+        pDecoder = FX_NEW CLZWDecoder;

+        if (pDecoder == NULL) {

+            return -1;

+        }

+        dest_size = (FX_DWORD) - 1;

+        offset = src_size;

+        int err = pDecoder->Decode(NULL, dest_size, src_buf, offset, bEarlyChange);

+        delete pDecoder;

+        if (err || dest_size == 0 || dest_size + 1 < dest_size) {

+            return (FX_DWORD) - 1;

+        }

+        pDecoder = FX_NEW CLZWDecoder;

+        if (pDecoder == NULL) {

+            return -1;

+        }

+        dest_buf = FX_Alloc( FX_BYTE, dest_size + 1);

+        if (dest_buf == NULL) {

+            return -1;

+        }

+        dest_buf[dest_size] = '\0';

+        pDecoder->Decode(dest_buf, dest_size, src_buf, offset, bEarlyChange);

+        delete pDecoder;

+    } else {

+        FlateUncompress(src_buf, src_size, estimated_size, dest_buf, dest_size, offset);

+    }

+    if (predictor_type == 0) {

+        return offset;

+    }

+    if (predictor_type == 2) {

+        PNG_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns);

+    } else if (predictor_type == 1) {

+        TIFF_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns);

+    }

+    return offset;

+}

+FX_BOOL CCodec_FlateModule::Encode(const FX_BYTE* src_buf, FX_DWORD src_size,

+                                   int predictor, int Colors, int BitsPerComponent, int Columns,

+                                   FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    if (predictor != 2 && predictor < 10) {

+        return Encode(src_buf, src_size, dest_buf, dest_size);

+    }

+    FX_BOOL ret = FALSE;

+    FX_LPBYTE pSrcBuf = NULL;

+    pSrcBuf = FX_Alloc(FX_BYTE, src_size);

+    if (pSrcBuf == NULL) {

+        return FALSE;

+    }

+    FXSYS_memcpy32(pSrcBuf, src_buf, src_size);

+    if (predictor == 2) {

+        TIFF_PredictorEncode(pSrcBuf, src_size, Colors, BitsPerComponent, Columns);

+    } else if (predictor >= 10) {

+        PNG_PredictorEncode(pSrcBuf, src_size, predictor, Colors, BitsPerComponent, Columns);

+    }

+    ret = Encode(pSrcBuf, src_size, dest_buf, dest_size);

+    FX_Free(pSrcBuf);

+    return ret;

+}

+FX_BOOL CCodec_FlateModule::Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    dest_size = src_size + src_size / 1000 + 12;

+    dest_buf = FX_Alloc( FX_BYTE, dest_size);

+    if (dest_buf == NULL) {

+        return FALSE;

+    }

+    unsigned long temp_size = dest_size;

+    FPDFAPI_FlateCompress(dest_buf, &temp_size, src_buf, src_size);

+    dest_size = (FX_DWORD)temp_size;

+    return TRUE;

+}

diff --git a/core/src/fxcodec/codec/fx_codec_icc.cpp b/core/src/fxcodec/codec/fx_codec_icc.cpp
new file mode 100644
index 0000000..6561764
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_icc.cpp
@@ -0,0 +1,1360 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxcodec/fx_codec.h"

+#include "codec_int.h"

+#include "../lcms2/include/fx_lcms2.h"

+FX_BOOL MD5ComputeID( FX_LPCVOID buf, FX_DWORD dwSize, FX_BYTE ID[16] )

+{

+    return cmsMD5computeIDExt(buf, dwSize, ID);

+}

+struct CLcmsCmm : public CFX_Object {

+    cmsHTRANSFORM m_hTransform;

+    int			m_nSrcComponents;

+    int			m_nDstComponents;

+    FX_BOOL		m_bLab;

+};

+extern "C" {

+    int ourHandler(int ErrorCode, const char *ErrorText)

+    {

+        return TRUE;

+    }

+};

+FX_BOOL CheckComponents(cmsColorSpaceSignature cs, int nComponents, FX_BOOL bDst)

+{

+    if (nComponents <= 0 || nComponents > 15) {

+        return FALSE;

+    }

+    switch(cs) {

+        case cmsSigLabData:

+            if (nComponents < 3) {

+                return FALSE;

+            }

+            break;

+        case cmsSigGrayData:

+            if (bDst && nComponents != 1) {

+                return FALSE;

+            } else if (!bDst && nComponents > 2) {

+                return FALSE;

+            }

+            break;

+        case cmsSigRgbData:

+            if (bDst && nComponents != 3) {

+                return FALSE;

+            }

+            break;

+        case cmsSigCmykData:

+            if (bDst && nComponents != 4) {

+                return FALSE;

+            }

+            break;

+        default:

+            if (nComponents != 3) {

+                return FALSE;

+            }

+            break;

+    }

+    return TRUE;

+}

+void* IccLib_CreateTransform(const unsigned char* pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,

+                             const unsigned char* pDstProfileData, unsigned int dwDstProfileSize, int nDstComponents,

+                             int intent, FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT, FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT)

+{

+    cmsHPROFILE srcProfile = NULL;

+    cmsHPROFILE dstProfile = NULL;

+    cmsHTRANSFORM hTransform = NULL;

+    CLcmsCmm* pCmm = NULL;

+    srcProfile = cmsOpenProfileFromMem((void*)pSrcProfileData, dwSrcProfileSize);

+    if (srcProfile == NULL) {

+        return NULL;

+    }

+    if(pDstProfileData == NULL && dwDstProfileSize == 0 && nDstComponents == 3) {

+        dstProfile = cmsCreate_sRGBProfile();

+    } else {

+        dstProfile = cmsOpenProfileFromMem((void*)pDstProfileData, dwDstProfileSize);

+    }

+    if (dstProfile == NULL) {

+        cmsCloseProfile(srcProfile);

+        return NULL;

+    }

+    int srcFormat;

+    FX_BOOL bLab = FALSE;

+    cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile);

+    if (!CheckComponents(srcCS, nSrcComponents, FALSE)) {

+        cmsCloseProfile(srcProfile);

+        cmsCloseProfile(dstProfile);

+        return NULL;

+    }

+    if (srcCS == cmsSigLabData) {

+        srcFormat = COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0);

+        bLab = TRUE;

+    } else {

+        srcFormat = COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1);

+        if (srcCS == cmsSigRgbData && T_DOSWAP(dwSrcFormat)) {

+            srcFormat |= DOSWAP_SH(1);

+        }

+    }

+    cmsColorSpaceSignature dstCS = cmsGetColorSpace(dstProfile);

+    if (!CheckComponents(dstCS, nDstComponents, TRUE)) {

+        cmsCloseProfile(srcProfile);

+        cmsCloseProfile(dstProfile);

+        return NULL;

+    }

+    switch(dstCS) {

+        case cmsSigGrayData:

+            hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, TYPE_GRAY_8, intent, 0);

+            break;

+        case cmsSigRgbData:

+            hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, TYPE_BGR_8, intent, 0);

+            break;

+        case cmsSigCmykData:

+            hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile,

+                                            T_DOSWAP(dwDstFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8,

+                                            intent, 0);

+            break;

+        default:

+            break;

+    }

+    if (hTransform == NULL) {

+        cmsCloseProfile(srcProfile);

+        cmsCloseProfile(dstProfile);

+        return NULL;

+    }

+    pCmm = FX_NEW CLcmsCmm;

+    if (pCmm == NULL) {

+        return NULL;

+    }

+    pCmm->m_nSrcComponents = nSrcComponents;

+    pCmm->m_nDstComponents = nDstComponents;

+    pCmm->m_hTransform = hTransform;

+    pCmm->m_bLab = bLab;

+    cmsCloseProfile(srcProfile);

+    cmsCloseProfile(dstProfile);

+    return pCmm;

+}

+void* IccLib_CreateTransform_sRGB(const unsigned char* pProfileData, unsigned int dwProfileSize, int nComponents, int intent, FX_DWORD dwSrcFormat)

+{

+    return IccLib_CreateTransform(pProfileData, dwProfileSize, nComponents, NULL, 0, 3, intent, dwSrcFormat);

+}

+void IccLib_DestroyTransform(void* pTransform)

+{

+    if (pTransform == NULL) {

+        return;

+    }

+    cmsDeleteTransform(((CLcmsCmm*)pTransform)->m_hTransform);

+    delete (CLcmsCmm*)pTransform;

+}

+void IccLib_Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues)

+{

+    if (pTransform == NULL) {

+        return;

+    }

+    CLcmsCmm* p = (CLcmsCmm*)pTransform;

+    FX_BYTE output[4];

+    if (p->m_bLab) {

+        CFX_FixedBufGrow<double, 16> inputs(p->m_nSrcComponents);

+        double* input = inputs;

+        for (int i = 0; i < p->m_nSrcComponents; i ++) {

+            input[i] = pSrcValues[i];

+        }

+        cmsDoTransform(p->m_hTransform, input, output, 1);

+    } else {

+        CFX_FixedBufGrow<FX_BYTE, 16> inputs(p->m_nSrcComponents);

+        FX_BYTE* input = inputs;

+        for (int i = 0; i < p->m_nSrcComponents; i ++) {

+            if (pSrcValues[i] > 1.0f) {

+                input[i] = 255;

+            } else if (pSrcValues[i] < 0) {

+                input[i] = 0;

+            } else {

+                input[i] = (int)(pSrcValues[i] * 255.0f);

+            }

+        }

+        cmsDoTransform(p->m_hTransform, input, output, 1);

+    }

+    switch(p->m_nDstComponents) {

+        case 1:

+            pDestValues[0] = output[0] / 255.0f;

+            break;

+        case 3:

+            pDestValues[0] = output[2] / 255.0f;

+            pDestValues[1] = output[1] / 255.0f;

+            pDestValues[2] = output[0] / 255.0f;

+            break;

+        case 4:

+            pDestValues[0] = output[0] / 255.0f;

+            pDestValues[1] = output[1] / 255.0f;

+            pDestValues[2] = output[2] / 255.0f;

+            pDestValues[3] = output[3] / 255.0f;

+            break;

+    }

+}

+void IccLib_TranslateImage(void* pTransform, unsigned char* pDest, const unsigned char* pSrc, int pixels)

+{

+    cmsDoTransform(((CLcmsCmm*)pTransform)->m_hTransform, (void*)pSrc, pDest, pixels);

+}

+FX_LPVOID CreateProfile_Gray(double gamma)

+{

+    cmsCIExyY* D50 = (cmsCIExyY*)cmsD50_xyY();

+    if (!cmsWhitePointFromTemp(D50, 6504)) {

+        return NULL;

+    }

+    cmsToneCurve* curve = cmsBuildGamma(NULL, gamma);

+    if (curve == NULL)	{

+        return NULL;

+    }

+    FX_LPVOID profile = cmsCreateGrayProfile(D50, curve);

+    cmsFreeToneCurve(curve);

+    return profile;

+}

+ICodec_IccModule::IccCS GetProfileCSFromHandle(FX_LPVOID pProfile)

+{

+    if (pProfile == NULL)	{

+        return ICodec_IccModule::IccCS_Unknown;

+    }

+    switch (cmsGetColorSpace(pProfile)) {

+        case cmsSigXYZData:

+            return ICodec_IccModule::IccCS_XYZ;

+        case cmsSigLabData:

+            return ICodec_IccModule::IccCS_Lab;

+        case cmsSigLuvData:

+            return ICodec_IccModule::IccCS_Luv;

+        case cmsSigYCbCrData:

+            return ICodec_IccModule::IccCS_YCbCr;

+        case cmsSigYxyData:

+            return ICodec_IccModule::IccCS_Yxy;

+        case cmsSigRgbData:

+            return ICodec_IccModule::IccCS_Rgb;

+        case cmsSigGrayData:

+            return ICodec_IccModule::IccCS_Gray;

+        case cmsSigHsvData:

+            return ICodec_IccModule::IccCS_Hsv;

+        case cmsSigHlsData:

+            return ICodec_IccModule::IccCS_Hls;

+        case cmsSigCmykData:

+            return ICodec_IccModule::IccCS_Cmyk;

+        case cmsSigCmyData:

+            return ICodec_IccModule::IccCS_Cmy;

+        default:

+            return ICodec_IccModule::IccCS_Unknown;

+    }

+}

+ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize)

+{

+    ICodec_IccModule::IccCS cs;

+    cmsHPROFILE hProfile = cmsOpenProfileFromMem((void*)pProfileData, dwProfileSize);

+    if (hProfile == NULL) {

+        return IccCS_Unknown;

+    }

+    cs = GetProfileCSFromHandle(hProfile);

+    if (hProfile)	{

+        cmsCloseProfile(hProfile);

+    }

+    return cs;

+}

+ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(IFX_FileRead* pFile)

+{

+    if (pFile == NULL) {

+        return IccCS_Unknown;

+    }

+    ICodec_IccModule::IccCS cs;

+    FX_DWORD dwSize = (FX_DWORD)pFile->GetSize();

+    FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, dwSize);

+    if (pBuf == NULL) {

+        return IccCS_Unknown;

+    }

+    pFile->ReadBlock(pBuf, 0, dwSize);

+    cs = GetProfileCS(pBuf, dwSize);

+    FX_Free(pBuf);

+    return cs;

+}

+FX_DWORD TransferProfileType(FX_LPVOID pProfile, FX_DWORD dwFormat)

+{

+    cmsColorSpaceSignature cs = cmsGetColorSpace(pProfile);

+    switch (cs) {

+        case cmsSigXYZData:

+            return TYPE_XYZ_16;

+        case cmsSigLabData:

+            return TYPE_Lab_DBL;

+        case cmsSigLuvData:

+            return TYPE_YUV_8;

+        case cmsSigYCbCrData:

+            return TYPE_YCbCr_8;

+        case cmsSigYxyData:

+            return TYPE_Yxy_16;

+        case cmsSigRgbData:

+            return T_DOSWAP(dwFormat) ? TYPE_RGB_8 : TYPE_BGR_8;

+        case cmsSigGrayData:

+            return TYPE_GRAY_8;

+        case cmsSigHsvData:

+            return TYPE_HSV_8;

+        case cmsSigHlsData:

+            return TYPE_HLS_8;

+        case cmsSigCmykData:

+            return T_DOSWAP(dwFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8;

+        case cmsSigCmyData:

+            return TYPE_CMY_8;

+        case cmsSigMCH5Data:

+            return T_DOSWAP(dwFormat) ? TYPE_KYMC5_8 : TYPE_CMYK5_8;

+        case cmsSigMCH6Data:

+            return TYPE_CMYK6_8;

+        case cmsSigMCH7Data:

+            return T_DOSWAP(dwFormat) ? TYPE_KYMC7_8 : TYPE_CMYK7_8;

+        case cmsSigMCH8Data:

+            return T_DOSWAP(dwFormat) ? TYPE_KYMC8_8 : TYPE_CMYK8_8;

+        case cmsSigMCH9Data:

+            return T_DOSWAP(dwFormat) ? TYPE_KYMC9_8 : TYPE_CMYK9_8;

+        case cmsSigMCHAData:

+            return T_DOSWAP(dwFormat) ? TYPE_KYMC10_8 : TYPE_CMYK10_8;

+        case cmsSigMCHBData:

+            return T_DOSWAP(dwFormat) ? TYPE_KYMC11_8 : TYPE_CMYK11_8;

+        case cmsSigMCHCData:

+            return T_DOSWAP(dwFormat) ? TYPE_KYMC12_8 : TYPE_CMYK12_8;

+        default:

+            return 0;

+    }

+}

+class CFX_IccProfileCache : public CFX_Object

+{

+public:

+    CFX_IccProfileCache();

+    ~CFX_IccProfileCache();

+    FX_LPVOID m_pProfile;

+    FX_DWORD	m_dwRate;

+protected:

+    void	Purge();

+};

+CFX_IccProfileCache::CFX_IccProfileCache()

+{

+    m_pProfile = NULL;

+    m_dwRate = 1;

+}

+CFX_IccProfileCache::~CFX_IccProfileCache()

+{

+    if (m_pProfile) {

+        cmsCloseProfile(m_pProfile);

+    }

+}

+void CFX_IccProfileCache::Purge()

+{

+}

+class CFX_IccTransformCache : public CFX_Object

+{

+public:

+    CFX_IccTransformCache(CLcmsCmm* pCmm = NULL);

+    ~CFX_IccTransformCache();

+    FX_LPVOID	m_pIccTransform;

+    FX_DWORD		m_dwRate;

+    CLcmsCmm*		m_pCmm;

+protected:

+    void			Purge();

+};

+CFX_IccTransformCache::CFX_IccTransformCache(CLcmsCmm* pCmm)

+{

+    m_pIccTransform = NULL;

+    m_dwRate = 1;

+    m_pCmm = pCmm;

+}

+CFX_IccTransformCache::~CFX_IccTransformCache()

+{

+    if (m_pIccTransform) {

+        cmsDeleteTransform(m_pIccTransform);

+    }

+    if (m_pCmm) {

+        FX_Free(m_pCmm);

+    }

+}

+void CFX_IccTransformCache::Purge()

+{

+}

+class CFX_ByteStringKey : public CFX_BinaryBuf

+{

+public:

+    CFX_ByteStringKey() : CFX_BinaryBuf() {}

+    CFX_ByteStringKey&		operator << (FX_DWORD i);

+};

+CFX_ByteStringKey& CFX_ByteStringKey::operator << (FX_DWORD i)

+{

+    AppendBlock(&i, sizeof(FX_DWORD));

+    return *this;

+}

+FX_LPVOID CCodec_IccModule::CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey)

+{

+    CFX_IccProfileCache* pCache = NULL;

+    CFX_ByteStringKey key;

+    CFX_ByteString text;

+    key << pIccParam->ColorSpace << (pIccParam->dwProfileType | ic << 8);

+    FX_BYTE ID[16];

+    switch (pIccParam->dwProfileType) {

+        case Icc_PARAMTYPE_NONE:

+            return NULL;

+        case Icc_PARAMTYPE_BUFFER:

+            MD5ComputeID(pIccParam->pProfileData, pIccParam->dwProfileSize, ID);

+            break;

+        case Icc_PARAMTYPE_PARAM:

+            FXSYS_memset32(ID, 0, 16);

+            switch (pIccParam->ColorSpace) {

+                case IccCS_Gray:

+                    text.Format("%lf", pIccParam->Gamma);

+                    break;

+                default:

+                    ;

+            }

+            MD5ComputeID(text.GetBuffer(0), text.GetLength(), ID);

+            break;

+        default:

+            ;

+    }

+    key.AppendBlock(ID, 16);

+    CFX_ByteString ProfileKey(key.GetBuffer(), key.GetSize());

+    ASSERT(pTransformKey);

+    pTransformKey->AppendBlock(ProfileKey.GetBuffer(0), ProfileKey.GetLength());

+    if (!m_MapProfile.Lookup(ProfileKey, (FX_LPVOID&)pCache)) {

+        pCache = FX_NEW CFX_IccProfileCache;

+        if (pCache == NULL) {

+            return NULL;

+        }

+        switch (pIccParam->dwProfileType) {

+            case Icc_PARAMTYPE_BUFFER:

+                pCache->m_pProfile = cmsOpenProfileFromMem(pIccParam->pProfileData, pIccParam->dwProfileSize);

+                break;

+            case Icc_PARAMTYPE_PARAM:

+                switch (pIccParam->ColorSpace) {

+                    case IccCS_Rgb:

+                        pCache->m_pProfile = cmsCreate_sRGBProfile();

+                        break;

+                    case IccCS_Gray:

+                        pCache->m_pProfile = CreateProfile_Gray(pIccParam->Gamma);

+                        break;

+                    default:

+                        break;

+                }

+                break;

+            default:

+                break;

+        }

+        m_MapProfile.SetAt(ProfileKey, pCache);

+    } else {

+        pCache->m_dwRate++;

+    }

+    return pCache->m_pProfile;

+}

+FX_LPVOID CCodec_IccModule::CreateTransform(ICodec_IccModule::IccParam* pInputParam,

+        ICodec_IccModule::IccParam* pOutputParam,

+        ICodec_IccModule::IccParam* pProofParam,

+        FX_DWORD dwIntent, FX_DWORD dwFlag, FX_DWORD dwPrfIntent, FX_DWORD dwPrfFlag)

+{

+    CLcmsCmm* pCmm = NULL;

+    ASSERT(pInputParam && pOutputParam);

+    CFX_ByteStringKey key;

+    FX_LPVOID pInputProfile = CreateProfile(pInputParam, Icc_CLASS_INPUT, &key);

+    if (pInputProfile == NULL)	{

+        return NULL;

+    }

+    FX_LPVOID pOutputProfile = CreateProfile(pOutputParam, Icc_CLASS_OUTPUT, &key);

+    if (pOutputProfile == NULL)	{

+        return NULL;

+    }

+    FX_DWORD dwInputProfileType = TransferProfileType(pInputProfile, pInputParam->dwFormat);

+    FX_DWORD dwOutputProfileType = TransferProfileType(pOutputProfile, pOutputParam->dwFormat);

+    if (dwInputProfileType == 0 || dwOutputProfileType == 0) {

+        return NULL;

+    }

+    FX_LPVOID pProofProfile = NULL;

+    if (pProofParam) {

+        pProofProfile = CreateProfile(pProofParam, Icc_CLASS_PROOF, &key);

+    }

+    key << dwInputProfileType << dwOutputProfileType << dwIntent << dwFlag << (pProofProfile != NULL) << dwPrfIntent << dwPrfFlag;

+    CFX_ByteStringC TransformKey(key.GetBuffer(), key.GetSize());

+    CFX_IccTransformCache* pTransformCache;

+    if (!m_MapTranform.Lookup(TransformKey, (FX_LPVOID&)pTransformCache)) {

+        pCmm = FX_Alloc(CLcmsCmm, 1);

+        if (pCmm == NULL) {

+            return NULL;

+        }

+        pCmm->m_nSrcComponents = T_CHANNELS(dwInputProfileType);

+        pCmm->m_nDstComponents = T_CHANNELS(dwOutputProfileType);

+        pCmm->m_bLab = T_COLORSPACE(pInputParam->dwFormat) == PT_Lab;

+        pTransformCache = FX_NEW CFX_IccTransformCache(pCmm);

+        if (pTransformCache == NULL) {

+            FX_Free(pCmm);

+            return NULL;

+        }

+        if (pProofProfile) {

+            pTransformCache->m_pIccTransform = cmsCreateProofingTransform(pInputProfile, dwInputProfileType, pOutputProfile, dwOutputProfileType,

+                                               pProofProfile, dwIntent, dwPrfIntent, dwPrfFlag);

+        } else {

+            pTransformCache->m_pIccTransform = cmsCreateTransform(pInputProfile, dwInputProfileType, pOutputProfile, dwOutputProfileType,

+                                               dwIntent, dwFlag);

+        }

+        pCmm->m_hTransform = pTransformCache->m_pIccTransform;

+        m_MapTranform.SetAt(TransformKey, pTransformCache);

+    } else {

+        pTransformCache->m_dwRate++;

+    }

+    return pTransformCache->m_pCmm;

+}

+CCodec_IccModule::~CCodec_IccModule()

+{

+    FX_POSITION pos = m_MapProfile.GetStartPosition();

+    CFX_ByteString key;

+    CFX_IccProfileCache* pProfileCache;

+    while (pos) {

+        m_MapProfile.GetNextAssoc(pos, key, (FX_LPVOID&)pProfileCache);

+        if (pProfileCache) {

+            delete pProfileCache;

+        }

+    }

+    pos = m_MapTranform.GetStartPosition();

+    CFX_IccTransformCache* pTransformCache;

+    while (pos) {

+        m_MapTranform.GetNextAssoc(pos, key, (FX_LPVOID&)pTransformCache);

+        if (pTransformCache) {

+            delete pTransformCache;

+        }

+    }

+}

+void* CCodec_IccModule::CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent, FX_DWORD dwSrcFormat)

+{

+    return IccLib_CreateTransform_sRGB(pProfileData, dwProfileSize, nComponents, intent, dwSrcFormat);

+}

+void* CCodec_IccModule::CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,

+        FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent,

+        FX_DWORD dwSrcFormat , FX_DWORD dwDstFormat)

+{

+    return IccLib_CreateTransform(pSrcProfileData, dwSrcProfileSize, nSrcComponents,

+                                  pDstProfileData, dwDstProfileSize, 4, intent, dwSrcFormat, dwDstFormat);

+}

+void CCodec_IccModule::DestroyTransform(void* pTransform)

+{

+    IccLib_DestroyTransform(pTransform);

+}

+void CCodec_IccModule::Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues)

+{

+    IccLib_Translate(pTransform, pSrcValues, pDestValues);

+}

+void CCodec_IccModule::TranslateScanline(void* pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels)

+{

+    IccLib_TranslateImage(pTransform, pDest, pSrc, pixels);

+}

+const FX_BYTE g_CMYKSamples[81 * 81 * 3] = {

+    255, 255, 255, 225, 226, 228, 199, 200, 202, 173, 174, 178, 147, 149, 152, 123, 125, 128,  99, 99, 102,  69, 70, 71,  34, 30, 31,

+    255, 253, 229, 226, 224, 203, 200, 199, 182, 173, 173, 158, 149, 148, 135, 125, 124, 113,  99, 99, 90,  70, 69, 63,  33, 29, 24,

+    255, 251, 204, 228, 223, 182, 201, 198, 163, 174, 172, 142, 150, 147, 122, 125, 123, 101,  99, 98, 80,  70, 68, 54,  32, 28, 16,

+    255, 249, 179, 230, 222, 160, 203, 197, 144, 174, 170, 124, 150, 145, 105, 125, 122, 88,  99, 97, 69,  70, 68, 46,  31, 28,  6,

+    255, 247, 154, 229, 220, 138, 203, 195, 122, 176, 169, 107, 150, 145, 91, 125, 121, 74, 100, 96, 57,  70, 67, 35,  29, 26,  0,

+    255, 246, 128, 231, 217, 114, 205, 194, 101, 176, 167, 88, 150, 144, 75, 125, 120, 60, 100, 96, 44,  70, 66, 24,  28, 26,  0,

+    255, 244, 96, 231, 217, 87, 203, 192, 78, 175, 167, 66, 150, 143, 56, 125, 119, 43, 100, 95, 29,  69, 66,  7,  26, 26,  0,

+    255, 243, 51, 232, 215, 51, 204, 191, 43, 176, 165, 38, 150, 142, 28, 125, 118, 17,  99, 94,  0,  68, 65,  0,  24, 25,  0,

+    255, 241,  0, 231, 215,  0, 203, 190,  0, 176, 164,  0, 150, 141,  0, 126, 117,  0,  99, 93,  0,  68, 65,  0,  24, 25,  0,

+    252, 228, 238, 222, 201, 211, 197, 180, 190, 171, 156, 166, 147, 133, 143, 123, 111, 119,  99, 88, 94,  71, 61, 66,  34, 22, 26,

+    254, 226, 213, 224, 201, 191, 199, 179, 171, 172, 155, 148, 147, 133, 128, 123, 110, 106,  98, 87, 83,  70, 59, 57,  33, 21, 18,

+    254, 224, 191, 224, 199, 172, 200, 177, 153, 173, 154, 133, 147, 132, 115, 123, 109, 94,  98, 86, 74,  70, 59, 49,  32, 21,  9,

+    255, 222, 168, 227, 198, 150, 200, 175, 135, 173, 153, 118, 148, 130, 99, 123, 109, 82,  98, 86, 64,  69, 58, 40,  31, 19,  0,

+    255, 221, 145, 227, 196, 129, 201, 174, 115, 173, 151, 99, 148, 129, 85, 124, 108, 69,  98, 85, 52,  69, 58, 30,  30, 19,  0,

+    255, 219, 121, 227, 195, 109, 201, 174, 97, 174, 150, 83, 148, 129, 70, 124, 107, 55,  98, 84, 40,  69, 58, 19,  28, 18,  0,

+    255, 218, 92, 229, 194, 82, 202, 173, 75, 174, 150, 63, 149, 128, 51, 124, 106, 39,  98, 84, 24,  68, 57,  3,  26, 18,  0,

+    255, 217, 54, 228, 193, 52, 201, 172, 46, 174, 148, 36, 148, 127, 27, 123, 105, 14,  98, 83,  0,  68, 56,  0,  25, 18,  0,

+    255, 216,  0, 229, 192,  2, 202, 171,  4, 173, 148,  0, 148, 126,  0, 124, 105,  0,  98, 83,  0,  68, 56,  0,  24, 17,  0,

+    249, 204, 223, 219, 181, 199, 195, 160, 178, 170, 140, 156, 146, 119, 134, 123, 99, 112,  98, 77, 88,  70, 52, 61,  34, 11, 20,

+    250, 201, 200, 221, 180, 178, 197, 159, 161, 171, 139, 139, 147, 119, 120, 123, 98, 99,  98, 77, 78,  69, 51, 52,  34, 11, 10,

+    252, 201, 180, 223, 179, 162, 197, 159, 144, 170, 138, 125, 146, 117, 107, 122, 97, 89,  98, 76, 69,  69, 50, 44,  32, 11,  2,

+    252, 199, 158, 222, 177, 143, 199, 158, 127, 171, 137, 110, 147, 117, 93, 122, 96, 76,  97, 75, 58,  69, 50, 36,  32, 10,  0,

+    253, 198, 137, 223, 177, 123, 198, 156, 110, 171, 136, 95, 146, 116, 80, 122, 96, 65,  97, 75, 47,  69, 50, 25,  30, 10,  0,

+    254, 197, 115, 225, 175, 104, 198, 156, 92, 172, 135, 79, 147, 115, 66, 123, 95, 52,  98, 74, 37,  69, 49, 15,  29, 10,  0,

+    254, 196, 89, 224, 175, 80, 199, 154, 70, 172, 134, 59, 146, 114, 48, 122, 95, 36,  97, 74, 21,  68, 49,  0,  27,  9,  0,

+    255, 195, 57, 225, 173, 52, 198, 154, 44, 172, 133, 36, 147, 113, 26, 123, 94, 14,  98, 74,  0,  68, 49,  0,  26, 10,  0,

+    254, 194, 15, 225, 172, 12, 198, 153,  7, 172, 132,  3, 146, 113,  0, 123, 93,  0,  98, 73,  0,  68, 49,  0,  26,  9,  0,

+    246, 178, 209, 218, 159, 186, 194, 140, 166, 168, 122, 145, 144, 104, 125, 121, 85, 103,  97, 65, 81,  69, 41, 55,  34,  0, 12,

+    248, 176, 186, 219, 157, 166, 195, 139, 149, 168, 121, 130, 144, 103, 111, 121, 85, 91,  97, 65, 71,  69, 41, 46,  34,  0,  4,

+    249, 175, 168, 220, 156, 150, 196, 139, 135, 169, 121, 116, 144, 103, 100, 122, 84, 83,  98, 65, 63,  70, 41, 39,  33,  0,  0,

+    249, 175, 148, 220, 155, 133, 196, 138, 119, 169, 120, 103, 145, 101, 87, 121, 83, 71,  97, 65, 54,  69, 41, 31,  32,  0,  0,

+    249, 173, 128, 222, 154, 115, 195, 137, 102, 170, 119, 88, 145, 101, 74, 122, 83, 59,  97, 64, 43,  68, 40, 20,  30,  0,  0,

+    250, 172, 108, 221, 154, 98, 195, 136, 86, 170, 118, 73, 145, 100, 61, 122, 82, 48,  97, 63, 32,  69, 40, 11,  28,  0,  0,

+    250, 171, 85, 221, 153, 76, 196, 136, 67, 170, 117, 56, 145, 99, 44, 121, 82, 33,  97, 63, 17,  68, 40,  0,  28,  0,  0,

+    251, 171, 58, 222, 152, 50, 197, 135, 43, 169, 117, 34, 146, 99, 25, 121, 81, 10,  96, 63,  0,  68, 40,  0,  27,  0,  0,

+    250, 170, 26, 222, 151, 19, 196, 134, 13, 169, 116,  4, 145, 99,  0, 122, 81,  0,  97, 63,  0,  67, 40,  0,  26,  0,  0,

+    244, 153, 194, 215, 136, 173, 192, 121, 155, 167, 104, 135, 143, 89, 115, 121, 72, 96,  97, 54, 75,  70, 31, 49,  34,  0,  6,

+    245, 153, 173, 216, 136, 155, 192, 120, 138, 167, 104, 121, 144, 88, 103, 121, 71, 85,  97, 54, 66,  69, 31, 42,  34,  0,  0,

+    246, 152, 157, 217, 135, 140, 193, 120, 126, 167, 103, 109, 143, 88, 92, 121, 72, 76,  97, 54, 58,  69, 31, 35,  33,  0,  0,

+    245, 150, 139, 218, 134, 125, 193, 119, 111, 167, 103, 96, 144, 87, 80, 121, 71, 66,  96, 53, 49,  68, 31, 26,  32,  0,  0,

+    246, 151, 122, 218, 133, 108, 194, 118, 96, 168, 102, 81, 144, 86, 69, 120, 71, 55,  95, 53, 39,  68, 30, 17,  31,  0,  0,

+    248, 150, 103, 218, 133, 91, 193, 118, 81, 168, 102, 69, 143, 86, 56, 120, 70, 43,  96, 53, 28,  68, 31,  6,  29,  0,  0,

+    247, 149, 81, 218, 132, 72, 194, 117, 62, 168, 101, 52, 144, 86, 42, 121, 70, 29,  96, 52, 13,  68, 30,  0,  28,  0,  0,

+    247, 148, 55, 219, 131, 50, 194, 117, 43, 167, 101, 32, 144, 85, 22, 120, 69,  8,  96, 52,  0,  67, 30,  0,  27,  0,  0,

+    247, 147, 29, 218, 131, 24, 194, 116, 20, 168, 100, 11, 144, 85,  0, 120, 69,  0,  96, 52,  0,  67, 30,  0,  26,  0,  0,

+    242, 130, 179, 214, 114, 160, 190, 101, 143, 166, 87, 125, 143, 72, 107, 120, 58, 88,  96, 42, 68,  69, 17, 44,  35,  0,  0,

+    243, 129, 161, 215, 114, 143, 191, 101, 128, 166, 87, 113, 143, 73, 96, 120, 58, 79,  96, 41, 60,  69, 18, 37,  33,  0,  0,

+    243, 129, 146, 216, 114, 130, 192, 101, 117, 166, 87, 101, 143, 72, 86, 121, 58, 69,  96, 42, 52,  69, 18, 29,  31,  0,  0,

+    243, 128, 130, 216, 114, 115, 191, 101, 102, 165, 86, 88, 142, 72, 75, 120, 58, 60,  95, 42, 43,  68, 19, 21,  30,  0,  0,

+    244, 127, 112, 217, 113, 101, 192, 99, 89, 166, 85, 75, 142, 72, 63, 119, 57, 50,  96, 41, 35,  68, 19, 13,  30,  0,  0,

+    244, 127, 96, 216, 112, 86, 191, 99, 75, 166, 86, 64, 143, 72, 52, 120, 57, 40,  95, 41, 24,  67, 20,  1,  29,  0,  0,

+    245, 126, 77, 216, 113, 68, 191, 100, 59, 166, 85, 49, 142, 71, 38, 119, 57, 26,  95, 41, 10,  67, 20,  0,  28,  0,  0,

+    244, 126, 55, 216, 112, 48, 191, 99, 40, 166, 85, 31, 143, 71, 20, 119, 57,  6,  95, 42,  0,  67, 20,  0,  28,  0,  0,

+    245, 126, 33, 217, 112, 26, 192, 99, 22, 166, 84, 11, 142, 70,  0, 119, 57,  0,  95, 41,  0,  66, 20,  0,  27,  0,  0,

+    241, 102, 167, 213, 90, 149, 189, 79, 133, 165, 66, 115, 141, 54, 98, 119, 41, 81,  96, 25, 63,  69,  0, 38,  30,  0,  0,

+    241, 102, 149, 213, 90, 133, 189, 79, 119, 165, 66, 103, 142, 55, 88, 119, 41, 71,  96, 25, 53,  69,  0, 31,  28,  0,  0,

+    241, 102, 135, 214, 90, 121, 190, 79, 108, 165, 66, 92, 141, 55, 78, 119, 42, 63,  96, 26, 46,  69,  0, 24,  28,  0,  0,

+    241, 101, 120, 214, 90, 107, 189, 79, 95, 165, 67, 83, 141, 54, 68, 118, 41, 54,  95, 27, 39,  68,  0, 16,  27,  0,  0,

+    241, 102, 106, 213, 90, 93, 189, 78, 82, 164, 67, 70, 141, 55, 58, 118, 42, 45,  94, 27, 29,  67,  2,  6,  27,  0,  0,

+    242, 101, 90, 214, 89, 79, 190, 79, 69, 166, 67, 59, 141, 55, 47, 118, 41, 35,  95, 27, 19,  67,  3,  0,  26,  0,  0,

+    242, 102, 72, 213, 89, 63, 191, 79, 56, 164, 67, 45, 141, 55, 34, 118, 42, 22,  94, 28,  6,  67,  3,  0,  26,  0,  0,

+    242, 100, 51, 214, 89, 45, 190, 78, 38, 164, 67, 30, 141, 55, 18, 118, 42,  3,  95, 28,  0,  66,  4,  0,  26,  0,  0,

+    243, 100, 33, 214, 90, 27, 190, 78, 22, 165, 67, 13, 141, 55,  0, 118, 43,  0,  94, 29,  0,  66,  5,  0,  26,  0,  0,

+    237, 69, 153, 211, 58, 135, 187, 51, 121, 163, 41, 105, 141, 28, 90, 118, 15, 73,  96,  0, 56,  68,  0, 33,  25,  0,  0,

+    239, 67, 137, 212, 60, 123, 189, 50, 110, 163, 41, 94, 141, 29, 79, 118, 17, 65,  95,  0, 48,  69,  0, 26,  25,  0,  0,

+    240, 69, 124, 211, 60, 111, 188, 50, 98, 163, 42, 85, 141, 31, 72, 118, 18, 57,  94,  0, 41,  68,  0, 19,  25,  0,  0,

+    240, 70, 112, 212, 61, 99, 188, 52, 87, 163, 41, 74, 140, 31, 62, 118, 20, 48,  94,  2, 32,  68,  0, 11,  24,  0,  0,

+    239, 70, 98, 212, 62, 86, 188, 53, 77, 164, 42, 64, 140, 32, 52, 118, 20, 40,  94,  3, 24,  67,  0,  3,  23,  0,  0,

+    239, 71, 85, 212, 61, 74, 187, 53, 65, 163, 44, 54, 140, 34, 43, 118, 22, 30,  95,  3, 14,  67,  0,  0,  23,  0,  0,

+    239, 70, 67, 212, 62, 59, 188, 53, 51, 163, 45, 42, 141, 34, 31, 117, 22, 17,  94,  5,  2,  66,  0,  0,  23,  0,  0,

+    239, 71, 50, 213, 62, 43, 188, 54, 37, 164, 45, 28, 139, 34, 16, 117, 22,  2,  94,  7,  0,  65,  0,  0,  23,  0,  0,

+    240, 71, 34, 212, 63, 29, 189, 54, 24, 163, 46, 15, 139, 36,  2, 117, 25,  0,  94,  8,  0,  66,  0,  0,  23,  0,  0,

+    237,  0, 140, 209,  0, 124, 186,  0, 112, 162,  0, 97, 141,  0, 82, 118,  0, 67,  95,  0, 49,  68,  0, 27,  20,  0,  0,

+    237,  0, 126, 210,  0, 113, 187,  0, 99, 163,  0, 86, 139,  0, 72, 118,  0, 58,  95,  0, 42,  67,  0, 20,  20,  0,  0,

+    237,  1, 114, 209,  1, 102, 187,  0, 90, 163,  0, 78, 139,  0, 64, 118,  0, 50,  95,  0, 35,  67,  0, 13,  20,  0,  0,

+    236, 16, 102, 209,  7, 91, 186,  0, 80, 162,  0, 68, 139,  0, 56, 117,  0, 43,  94,  0, 27,  67,  0,  6,  20,  0,  0,

+    238, 15, 89, 209, 13, 79, 186,  6, 69, 162,  0, 58, 139,  0, 47, 117,  0, 34,  93,  0, 20,  66,  0,  2,  20,  0,  0,

+    237, 20, 78, 210, 12, 68, 187,  4, 59, 163,  0, 49, 139,  0, 38, 116,  0, 26,  94,  0, 11,  66,  0,  0,  20,  0,  0,

+    237, 25, 64, 210, 18, 56, 186, 11, 48, 162,  4, 39, 138,  0, 27, 117,  0, 14,  93,  0,  0,  66,  0,  0,  20,  0,  0,

+    238, 25, 48, 210, 22, 43, 186, 15, 35, 162,  8, 26, 140,  0, 14, 117,  0,  0,  93,  0,  0,  65,  0,  0,  20,  0,  0,

+    238, 28, 35, 210, 21, 30, 187, 15, 24, 162,  8, 16, 139,  1,  2, 117,  0,  0,  93,  0,  0,  65,  0,  0,  22,  0,  0,

+    219, 242, 252, 195, 214, 225, 172, 191, 201, 148, 165, 175, 127, 142, 150, 106, 119, 126,  84, 95, 101,  58, 66, 72,  24, 27, 32,

+    222, 239, 226, 196, 213, 202, 173, 189, 180, 150, 165, 158, 129, 141, 135, 107, 118, 113,  85, 94, 90,  58, 66, 63,  21, 26, 24,

+    223, 237, 203, 198, 211, 182, 175, 188, 163, 152, 164, 141, 129, 140, 121, 107, 117, 101,  85, 93, 80,  58, 64, 54,  21, 26, 18,

+    226, 236, 179, 201, 210, 160, 177, 187, 143, 153, 162, 125, 130, 139, 106, 108, 116, 89,  85, 92, 69,  58, 64, 45,  20, 25,  8,

+    227, 234, 153, 201, 208, 139, 178, 185, 124, 154, 161, 107, 131, 138, 91, 108, 115, 75,  85, 91, 58,  58, 63, 35,  17, 25,  0,

+    229, 233, 130, 203, 207, 116, 178, 184, 104, 154, 160, 90, 131, 137, 76, 109, 114, 62,  85, 90, 46,  58, 63, 25,  16, 24,  0,

+    230, 231, 100, 202, 205, 90, 179, 183, 80, 154, 159, 69, 131, 136, 57, 109, 113, 46,  86, 90, 32,  58, 63, 10,  14, 24,  0,

+    230, 230, 65, 204, 204, 58, 180, 182, 52, 155, 157, 44, 132, 135, 35, 110, 113, 24,  86, 89,  9,  57, 62,  0,  11, 24,  0,

+    232, 230, 19, 204, 204, 19, 180, 181, 17, 155, 157, 10, 131, 134,  2, 109, 112,  0,  85, 89,  0,  57, 62,  0,  10, 23,  0,

+    218, 216, 236, 194, 192, 211, 172, 171, 188, 149, 149, 164, 128, 127, 141, 106, 106, 119,  84, 84, 94,  59, 57, 66,  25, 18, 26,

+    221, 214, 211, 196, 191, 190, 174, 170, 170, 150, 148, 148, 128, 126, 127, 107, 105, 106,  85, 83, 84,  59, 56, 58,  23, 17, 18,

+    222, 213, 190, 197, 189, 170, 175, 169, 153, 151, 147, 133, 129, 126, 113, 108, 105, 94,  85, 82, 74,  59, 56, 49,  22, 17, 11,

+    224, 211, 168, 199, 188, 151, 175, 168, 135, 152, 146, 117, 129, 124, 99, 107, 103, 82,  84, 82, 64,  59, 55, 41,  21, 17,  1,

+    224, 210, 145, 199, 187, 130, 176, 166, 117, 152, 145, 101, 129, 123, 86, 107, 103, 70,  85, 81, 53,  58, 55, 31,  19, 17,  0,

+    227, 208, 123, 200, 186, 110, 177, 165, 98, 153, 143, 84, 130, 122, 70, 108, 102, 57,  85, 80, 41,  58, 54, 20,  18, 16,  0,

+    227, 208, 97, 202, 185, 86, 177, 164, 77, 153, 142, 65, 130, 122, 54, 108, 101, 42,  85, 80, 27,  58, 54,  7,  16, 16,  0,

+    228, 206, 66, 202, 184, 58, 178, 163, 50, 154, 141, 42, 131, 121, 33, 109, 101, 21,  86, 79,  5,  58, 54,  0,  13, 16,  0,

+    228, 206, 29, 202, 183, 25, 178, 163, 20, 154, 141, 15, 131, 121,  5, 108, 100,  0,  85, 79,  0,  58, 53,  0,  13, 16,  0,

+    217, 193, 221, 193, 172, 198, 172, 153, 178, 149, 133, 154, 128, 114, 132, 107, 94, 111,  85, 74, 89,  59, 49, 61,  25,  8, 22,

+    219, 191, 198, 195, 171, 178, 173, 153, 159, 149, 132, 139, 128, 113, 119, 107, 94, 100,  85, 73, 79,  59, 48, 52,  25,  7, 14,

+    221, 191, 180, 196, 170, 160, 174, 152, 144, 150, 132, 125, 129, 113, 107, 107, 93, 89,  85, 73, 69,  59, 48, 45,  23,  7,  4,

+    222, 189, 159, 197, 169, 142, 174, 151, 127, 151, 131, 110, 129, 112, 94, 108, 93, 78,  85, 72, 60,  58, 47, 37,  22,  7,  0,

+    223, 188, 138, 197, 168, 123, 175, 150, 109, 151, 130, 95, 130, 111, 81, 108, 92, 65,  85, 72, 49,  59, 47, 27,  21,  7,  0,

+    224, 187, 118, 198, 167, 105, 176, 149, 93, 152, 129, 79, 130, 110, 68, 108, 91, 54,  85, 71, 38,  59, 47, 17,  18,  7,  0,

+    224, 187, 93, 199, 166, 83, 176, 148, 73, 152, 128, 62, 129, 109, 51, 108, 90, 39,  85, 71, 25,  58, 46,  3,  16,  8,  0,

+    226, 186, 64, 200, 165, 57, 177, 147, 50, 153, 127, 40, 130, 108, 31, 108, 90, 19,  85, 70,  3,  58, 46,  0,  16,  8,  0,

+    227, 185, 35, 200, 165, 30, 176, 146, 25, 152, 127, 18, 130, 108,  7, 108, 89,  0,  85, 70,  0,  57, 46,  0,  14,  8,  0,

+    216, 169, 205, 192, 150, 184, 171, 134, 164, 149, 116, 144, 128, 99, 124, 107, 81, 103,  85, 63, 81,  60, 39, 55,  26,  0, 15,

+    217, 168, 186, 193, 150, 165, 172, 134, 149, 150, 116, 130, 128, 99, 111, 107, 81, 92,  85, 62, 72,  59, 39, 47,  25,  0,  6,

+    219, 168, 168, 194, 149, 150, 173, 133, 135, 150, 116, 117, 128, 98, 99, 107, 80, 82,  86, 62, 63,  59, 38, 39,  24,  0,  0,

+    219, 166, 148, 195, 149, 133, 173, 133, 119, 150, 115, 103, 128, 98, 88, 107, 80, 72,  85, 61, 54,  59, 38, 32,  23,  0,  0,

+    220, 166, 129, 196, 148, 116, 174, 132, 103, 151, 114, 89, 129, 97, 75, 107, 79, 60,  85, 61, 44,  59, 38, 22,  21,  0,  0,

+    222, 164, 110, 197, 147, 99, 175, 131, 87, 151, 113, 75, 129, 96, 63, 107, 79, 49,  85, 61, 33,  58, 38, 12,  19,  0,  0,

+    222, 164, 88, 197, 146, 79, 174, 130, 69, 151, 113, 58, 129, 95, 47, 107, 78, 35,  85, 60, 20,  58, 38,  0,  18,  0,  0,

+    223, 164, 63, 198, 145, 55, 175, 129, 48, 151, 112, 39, 129, 95, 29, 107, 78, 16,  85, 60,  1,  58, 38,  0,  17,  0,  0,

+    223, 163, 36, 198, 145, 32, 174, 129, 26, 151, 111, 17, 129, 95,  7, 107, 78,  0,  84, 60,  0,  57, 37,  0,  15,  0,  0,

+    215, 147, 192, 191, 130, 172, 170, 116, 153, 148, 100, 133, 127, 85, 115, 107, 69, 96,  85, 51, 75,  60, 28, 50,  25,  0,  8,

+    217, 146, 173, 192, 130, 154, 171, 115, 138, 149, 100, 121, 128, 84, 103, 107, 68, 85,  85, 51, 66,  60, 28, 42,  25,  0,  0,

+    217, 145, 157, 193, 129, 140, 173, 115, 125, 149, 100, 109, 128, 84, 92, 107, 68, 76,  85, 51, 58,  59, 28, 35,  23,  0,  0,

+    218, 145, 140, 193, 129, 125, 172, 114, 110, 149, 99, 96, 128, 83, 81, 107, 67, 65,  84, 51, 49,  59, 29, 27,  22,  0,  0,

+    219, 144, 121, 194, 128, 108, 172, 113, 96, 149, 98, 83, 128, 83, 69, 107, 68, 55,  85, 50, 40,  59, 28, 18,  20,  0,  0,

+    220, 143, 104, 195, 128, 93, 173, 114, 82, 150, 98, 69, 127, 82, 58, 107, 67, 45,  85, 50, 30,  59, 28,  7,  19,  0,  0,

+    220, 143, 84, 195, 127, 74, 173, 113, 65, 149, 97, 55, 128, 82, 44, 106, 67, 32,  84, 50, 16,  58, 28,  0,  18,  0,  0,

+    221, 142, 62, 196, 126, 53, 173, 112, 46, 150, 97, 37, 128, 82, 26, 107, 66, 14,  84, 50,  0,  58, 28,  0,  16,  0,  0,

+    222, 142, 38, 196, 126, 34, 174, 112, 27, 150, 96, 17, 128, 82,  6, 106, 66,  0,  84, 50,  0,  57, 29,  0,  16,  0,  0,

+    214, 123, 179, 191, 110, 159, 169, 98, 143, 147, 84, 124, 126, 70, 106, 107, 55, 88,  85, 39, 69,  60, 15, 45,  23,  0,  2,

+    216, 123, 161, 192, 110, 144, 170, 98, 129, 148, 84, 112, 127, 70, 95, 107, 55, 79,  85, 39, 61,  60, 15, 37,  20,  0,  0,

+    217, 122, 145, 192, 110, 130, 170, 97, 116, 149, 84, 101, 127, 70, 85, 106, 55, 70,  85, 39, 53,  59, 16, 30,  19,  0,  0,

+    217, 123, 131, 192, 109, 116, 171, 96, 103, 149, 83, 89, 127, 70, 75, 106, 55, 60,  85, 40, 45,  59, 16, 23,  17,  0,  0,

+    217, 122, 114, 193, 109, 101, 172, 96, 91, 149, 82, 77, 128, 69, 64, 106, 55, 50,  84, 39, 35,  59, 17, 14,  17,  0,  0,

+    218, 122, 98, 194, 108, 87, 171, 96, 77, 149, 82, 65, 127, 69, 52, 106, 55, 40,  84, 40, 25,  59, 18,  3,  15,  0,  0,

+    219, 122, 80, 193, 108, 70, 172, 95, 61, 149, 82, 51, 127, 69, 40, 106, 55, 28,  84, 39, 12,  58, 17,  0,  13,  0,  0,

+    219, 121, 59, 194, 108, 52, 172, 96, 44, 149, 82, 35, 127, 68, 24, 106, 55, 11,  84, 40,  0,  57, 18,  0,  13,  0,  0,

+    219, 121, 40, 193, 108, 33, 172, 95, 26, 149, 81, 19, 128, 68,  6, 106, 54,  0,  84, 39,  0,  57, 18,  0,  13,  0,  0,

+    213, 99, 165, 189, 87, 148, 169, 76, 132, 147, 64, 115, 126, 52, 98, 106, 39, 81,  85, 23, 63,  60,  0, 39,  16,  0,  0,

+    214, 98, 149, 191, 87, 133, 170, 76, 119, 148, 65, 103, 127, 53, 88, 106, 39, 72,  85, 24, 55,  60,  0, 32,  15,  0,  0,

+    215, 99, 136, 191, 87, 121, 170, 77, 108, 148, 65, 93, 126, 53, 79, 106, 40, 64,  85, 24, 47,  59,  0, 25,  14,  0,  0,

+    215, 99, 121, 192, 87, 108, 170, 77, 96, 148, 65, 82, 126, 53, 69, 106, 40, 55,  85, 25, 39,  59,  0, 18,  13,  0,  0,

+    216, 99, 106, 191, 87, 95, 170, 76, 83, 148, 65, 71, 126, 53, 58, 106, 41, 45,  85, 26, 30,  59,  0,  8,  11,  0,  0,

+    216, 98, 91, 192, 88, 82, 170, 77, 71, 148, 65, 60, 127, 53, 48, 105, 41, 36,  83, 26, 21,  58,  1,  2,  11,  0,  0,

+    217, 99, 75, 192, 87, 66, 170, 76, 57, 148, 65, 47, 126, 53, 36, 105, 41, 24,  83, 26,  8,  57,  2,  0,   9,  0,  0,

+    217, 98, 57, 192, 87, 49, 171, 77, 41, 147, 65, 32, 126, 53, 21, 105, 41,  8,  84, 27,  0,  57,  3,  0,   9,  0,  0,

+    217, 98, 40, 193, 87, 34, 171, 76, 27, 148, 65, 19, 126, 53,  6, 105, 41,  0,  83, 27,  0,  57,  4,  0,   9,  0,  0,

+    211, 67, 152, 189, 58, 136, 168, 50, 122, 147, 39, 105, 127, 28, 89, 106, 14, 74,  85,  0, 56,  59,  0, 33,   9,  0,  0,

+    213, 68, 138, 190, 59, 123, 169, 51, 109, 148, 40, 95, 126, 30, 80, 106, 16, 65,  85,  0, 48,  59,  0, 27,   9,  0,  0,

+    214, 69, 125, 190, 59, 111, 168, 51, 99, 148, 41, 86, 126, 31, 72, 106, 18, 58,  85,  0, 41,  59,  0, 20,   7,  0,  0,

+    215, 70, 112, 190, 61, 100, 169, 52, 88, 147, 42, 76, 126, 32, 63, 106, 19, 49,  84,  1, 34,  58,  0, 13,   7,  0,  0,

+    214, 70, 99, 190, 62, 88, 169, 53, 77, 147, 43, 65, 125, 32, 53, 106, 20, 40,  84,  3, 26,  58,  0,  4,   7,  0,  0,

+    214, 71, 86, 190, 61, 75, 169, 53, 65, 146, 43, 54, 126, 33, 44, 105, 21, 31,  83,  4, 17,  57,  0,  0,   7,  0,  0,

+    215, 71, 71, 191, 62, 62, 169, 53, 53, 147, 44, 44, 126, 34, 33, 105, 22, 20,  83,  5,  4,  57,  0,  0,   7,  0,  0,

+    215, 71, 54, 191, 62, 47, 169, 54, 39, 147, 44, 30, 126, 35, 20, 105, 23,  6,  83,  6,  0,  56,  0,  0,   5,  0,  0,

+    215, 71, 41, 191, 63, 34, 170, 54, 27, 147, 45, 17, 126, 35,  6, 105, 23,  0,  83,  8,  0,  56,  0,  0,   5,  0,  0,

+    210, 13, 140, 189,  1, 125, 167,  0, 110, 146,  0, 96, 126,  0, 81, 106,  0, 67,  85,  0, 51,  59,  0, 28,   4,  0,  0,

+    212, 18, 126, 190,  7, 113, 168,  0, 100, 146,  0, 86, 126,  0, 73, 106,  0, 59,  84,  0, 43,  59,  0, 22,   4,  0,  0,

+    212, 21, 115, 190, 13, 103, 168,  3, 91, 146,  0, 78, 125,  0, 65, 105,  0, 52,  84,  0, 36,  58,  0, 16,   4,  0,  0,

+    213, 24, 103, 189, 19, 91, 168,  9, 82, 146,  0, 69, 125,  0, 57, 105,  0, 44,  84,  0, 29,  58,  0,  7,   4,  0,  0,

+    213, 27, 92, 188, 21, 81, 168, 14, 71, 146,  1, 59, 125,  0, 48, 105,  0, 36,  84,  0, 21,  58,  0,  4,   4,  0,  0,

+    213, 30, 80, 189, 22, 69, 168, 17, 61, 146,  5, 50, 125,  0, 39, 104,  0, 27,  83,  0, 12,  57,  0,  0,   4,  0,  0,

+    214, 30, 67, 189, 25, 57, 168, 20, 50, 146,  9, 40, 125,  0, 29, 104,  0, 17,  83,  0,  2,  56,  0,  0,   4,  0,  0,

+    214, 32, 53, 189, 27, 44, 169, 20, 38, 146, 13, 28, 124,  2, 17, 104,  0,  4,  83,  0,  0,  56,  0,  0,   4,  0,  0,

+    214, 33, 41, 190, 27, 33, 168, 23, 27, 146, 13, 18, 125,  3,  5, 105,  0,  0,  83,  0,  0,  56,  0,  0,   4,  0,  0,

+    185, 229, 250, 164, 204, 223, 146, 182, 199, 127, 158, 174, 108, 136, 149,  89, 113, 125,  70, 90, 100,  46, 62, 71,  10, 25, 33,

+    189, 227, 225, 168, 202, 201, 148, 181, 179, 129, 157, 156, 109, 135, 134,  90, 113, 113,  70, 89, 90,  46, 62, 62,   8, 24, 25,

+    192, 226, 202, 170, 202, 182, 151, 179, 162, 130, 156, 141, 110, 133, 121,  91, 112, 101,  71, 89, 80,  46, 61, 54,   7, 24, 19,

+    194, 224, 179, 173, 200, 160, 153, 178, 144, 132, 155, 125, 112, 133, 107,  92, 111, 89,  71, 88, 69,  46, 61, 45,   6, 23, 10,

+    196, 223, 155, 174, 198, 139, 154, 176, 124, 132, 153, 107, 113, 131, 91,  92, 110, 75,  72, 87, 58,  47, 60, 37,   4, 23,  0,

+    198, 221, 131, 175, 197, 117, 155, 175, 105, 133, 152, 91, 113, 130, 76,  92, 109, 63,  72, 86, 47,  46, 60, 26,   3, 23,  0,

+    200, 220, 104, 176, 196, 94, 156, 175, 84, 134, 151, 72, 113, 129, 59,  93, 108, 47,  72, 85, 33,  46, 59, 13,   0, 23,  0,

+    201, 219, 73, 179, 195, 65, 157, 173, 57, 135, 150, 48, 114, 129, 39,  94, 108, 28,  72, 85, 15,  47, 59,  0,   0, 22,  0,

+    203, 219, 42, 178, 195, 37, 157, 173, 32, 135, 150, 26, 114, 128, 16,  94, 107,  6,  73, 85,  0,  46, 58,  0,   0, 22,  0,

+    186, 205, 233, 165, 183, 209, 148, 163, 187, 128, 142, 163, 109, 121, 140,  91, 101, 118,  71, 80, 94,  48, 54, 66,  12, 15, 27,

+    189, 204, 211, 169, 182, 189, 151, 163, 169, 131, 141, 147, 111, 121, 126,  92, 101, 105,  72, 79, 84,  48, 54, 58,  11, 15, 19,

+    192, 202, 190, 171, 181, 170, 152, 161, 152, 131, 141, 133, 112, 120, 113,  93, 100, 94,  72, 79, 74,  48, 53, 50,  10, 15, 11,

+    195, 201, 169, 172, 179, 151, 153, 160, 135, 132, 139, 117, 113, 119, 100,  93, 99, 82,  72, 78, 64,  48, 53, 41,   9, 14,  3,

+    195, 200, 146, 174, 179, 131, 154, 159, 117, 133, 138, 101, 113, 118, 86,  93, 98, 70,  73, 77, 53,  48, 52, 32,   8, 15,  0,

+    198, 199, 125, 175, 177, 111, 155, 158, 100, 133, 137, 85, 113, 117, 71,  93, 97, 57,  72, 77, 42,  47, 52, 22,   5, 14,  0,

+    199, 198, 101, 176, 177, 89, 155, 157, 79, 134, 136, 68, 113, 116, 56,  94, 97, 44,  73, 76, 30,  47, 52, 10,   2, 15,  0,

+    200, 197, 72, 178, 176, 63, 157, 156, 56, 135, 136, 46, 114, 116, 37,  94, 96, 26,  73, 76, 11,  47, 51,  0,   0, 14,  0,

+    201, 197, 45, 177, 175, 38, 156, 155, 31, 135, 135, 25, 114, 115, 17,  94, 96,  5,  73, 75,  0,  46, 51,  0,   0, 14,  0,

+    187, 183, 218, 167, 165, 197, 149, 147, 176, 129, 127, 153, 111, 109, 132,  92, 90, 111,  73, 70, 89,  49, 46, 62,  15,  4, 22,

+    190, 183, 197, 170, 164, 177, 151, 146, 159, 130, 127, 139, 112, 109, 119,  93, 90, 99,  72, 70, 78,  49, 45, 53,  14,  4, 15,

+    192, 182, 179, 171, 163, 161, 153, 145, 144, 132, 126, 125, 113, 108, 107,  93, 89, 88,  73, 70, 69,  49, 45, 45,  13,  5,  6,

+    195, 181, 159, 172, 162, 142, 152, 145, 127, 132, 125, 111, 113, 107, 94,  93, 88, 77,  73, 69, 59,  48, 45, 37,  11,  5,  0,

+    195, 180, 139, 173, 161, 124, 153, 143, 110, 133, 125, 96, 113, 106, 81,  94, 88, 66,  73, 68, 49,  49, 44, 28,   9,  6,  0,

+    196, 179, 118, 174, 160, 106, 154, 142, 94, 133, 124, 81, 113, 105, 68,  94, 87, 54,  73, 68, 39,  48, 44, 18,   5,  5,  0,

+    197, 178, 96, 176, 159, 86, 155, 141, 75, 134, 123, 64, 114, 105, 53,  94, 87, 40,  73, 68, 26,  48, 44,  5,   2,  6,  0,

+    199, 178, 70, 176, 158, 62, 156, 141, 54, 134, 122, 44, 114, 104, 35,  94, 86, 23,  73, 67,  8,  47, 44,  0,   2,  6,  0,

+    199, 177, 45, 178, 158, 40, 156, 140, 32, 135, 122, 26, 114, 104, 16,  94, 86,  4,  73, 67,  0,  47, 44,  0,   0,  7,  0,

+    188, 161, 204, 168, 144, 183, 149, 129, 164, 130, 112, 144, 112, 95, 123,  93, 78, 103,  74, 60, 81,  50, 36, 56,  16,  0, 16,

+    190, 160, 185, 170, 144, 165, 151, 128, 148, 132, 111, 130, 112, 95, 110,  93, 78, 92,  74, 59, 72,  50, 36, 48,  16,  0,  8,

+    192, 160, 167, 171, 143, 150, 153, 128, 134, 132, 111, 117, 112, 94, 100,  94, 77, 82,  74, 59, 63,  50, 36, 40,  14,  0,  0,

+    193, 159, 149, 172, 143, 134, 153, 127, 119, 133, 110, 103, 113, 94, 87,  93, 77, 72,  73, 59, 54,  50, 36, 32,  12,  0,  0,

+    195, 159, 131, 173, 142, 117, 153, 127, 104, 132, 110, 90, 113, 93, 76,  93, 76, 61,  74, 59, 45,  49, 36, 23,   9,  0,  0,

+    196, 158, 113, 174, 141, 101, 155, 126, 89, 133, 109, 76, 113, 93, 64,  94, 76, 51,  74, 58, 35,  49, 36, 14,   6,  0,  0,

+    197, 157, 92, 174, 141, 80, 154, 125, 71, 134, 108, 60, 114, 92, 50,  94, 75, 37,  73, 58, 22,  48, 36,  1,   5,  0,  0,

+    197, 157, 68, 175, 140, 59, 155, 124, 51, 134, 108, 41, 113, 91, 32,  94, 75, 21,  73, 57,  5,  48, 35,  0,   5,  0,  0,

+    198, 156, 46, 176, 140, 40, 155, 124, 32, 134, 107, 24, 114, 91, 14,  94, 75,  2,  73, 57,  0,  48, 36,  0,   3,  0,  0,

+    189, 140, 191, 168, 126, 172, 150, 112, 154, 131, 97, 134, 112, 82, 115,  94, 66, 96,  74, 49, 75,  51, 25, 50,  12,  0, 10,

+    191, 139, 173, 170, 125, 154, 152, 111, 138, 132, 96, 121, 113, 81, 103,  94, 66, 85,  74, 48, 66,  50, 26, 42,  12,  0,  1,

+    192, 139, 157, 171, 125, 140, 152, 111, 125, 132, 96, 109, 113, 81, 92,  94, 65, 76,  74, 48, 58,  50, 26, 35,   9,  0,  0,

+    193, 139, 140, 172, 124, 125, 153, 110, 112, 133, 95, 96, 113, 80, 82,  94, 65, 66,  74, 49, 50,  50, 26, 28,   7,  0,  0,

+    194, 138, 123, 172, 123, 109, 153, 110, 97, 133, 95, 84, 113, 80, 70,  94, 65, 56,  74, 48, 40,  50, 26, 20,   6,  0,  0,

+    194, 138, 105, 173, 123, 94, 153, 109, 83, 133, 94, 70, 112, 79, 59,  94, 64, 46,  74, 48, 31,  50, 26,  9,   4,  0,  0,

+    196, 138, 87, 174, 122, 77, 153, 109, 67, 133, 93, 56, 113, 79, 46,  94, 64, 34,  73, 48, 18,  49, 27,  0,   4,  0,  0,

+    196, 137, 65, 174, 122, 57, 154, 108, 49, 133, 93, 39, 113, 79, 29,  94, 64, 18,  74, 48,  3,  49, 27,  0,   2,  0,  0,

+    197, 137, 47, 175, 122, 40, 155, 108, 32, 133, 93, 23, 114, 79, 14,  94, 64,  1,  73, 48,  0,  48, 27,  0,   2,  0,  0,

+    189, 119, 177, 168, 106, 159, 150, 94, 142, 131, 81, 124, 113, 67, 107,  94, 53, 89,  74, 37, 69,  51, 11, 45,   6,  0,  3,

+    191, 119, 161, 170, 106, 144, 152, 94, 129, 132, 81, 112, 113, 67, 96,  94, 53, 79,  74, 37, 61,  51, 13, 38,   6,  0,  0,

+    192, 119, 146, 170, 106, 131, 152, 94, 117, 132, 80, 101, 112, 67, 85,  94, 53, 70,  74, 37, 53,  50, 14, 31,   4,  0,  0,

+    192, 119, 131, 171, 106, 117, 153, 94, 105, 132, 80, 89, 113, 67, 75,  94, 54, 61,  74, 38, 45,  51, 14, 23,   3,  0,  0,

+    193, 118, 114, 171, 106, 102, 153, 93, 90, 132, 80, 78, 113, 67, 65,  94, 53, 52,  74, 37, 36,  50, 15, 16,   1,  0,  0,

+    194, 118, 99, 172, 105, 89, 153, 93, 78, 132, 80, 66, 113, 67, 54,  94, 53, 42,  74, 38, 27,  50, 16,  5,   1,  0,  0,

+    194, 118, 82, 173, 105, 72, 153, 93, 63, 132, 79, 53, 113, 67, 42,  94, 53, 30,  74, 38, 15,  49, 16,  0,   0,  0,  0,

+    195, 117, 63, 173, 105, 55, 154, 93, 47, 133, 79, 37, 113, 66, 27,  94, 53, 15,  73, 38,  0,  48, 16,  0,   0,  0,  0,

+    195, 117, 46, 173, 104, 39, 154, 92, 32, 133, 79, 22, 113, 66, 13,  94, 53,  0,  73, 38,  0,  48, 17,  0,   0,  0,  0,

+    189, 96, 166, 168, 85, 147, 150, 74, 132, 131, 62, 115, 113, 51, 99,  94, 38, 82,  74, 21, 63,  51,  0, 40,   1,  0,  0,

+    190, 96, 150, 170, 85, 133, 152, 75, 119, 132, 63, 104, 113, 51, 88,  94, 38, 72,  75, 22, 55,  51,  0, 33,   1,  0,  0,

+    192, 96, 137, 170, 85, 121, 152, 74, 108, 132, 64, 94, 113, 52, 79,  94, 39, 64,  74, 23, 48,  50,  0, 26,   0,  0,  0,

+    192, 96, 122, 171, 86, 109, 152, 75, 96, 132, 63, 83, 113, 52, 69,  94, 39, 56,  74, 24, 41,  50,  0, 19,   0,  0,  0,

+    193, 96, 107, 171, 85, 96, 152, 75, 84, 132, 64, 72, 113, 52, 60,  94, 39, 47,  74, 24, 32,  50,  1, 10,   0,  0,  0,

+    193, 96, 93, 172, 85, 82, 152, 75, 72, 133, 63, 61, 113, 51, 49,  94, 39, 37,  73, 25, 23,  49,  2,  2,   0,  0,  0,

+    194, 96, 78, 172, 85, 68, 152, 75, 59, 132, 63, 49, 113, 52, 39,  94, 40, 26,  73, 25, 11,  48,  3,  0,   0,  0,  0,

+    194, 96, 60, 173, 85, 52, 153, 75, 44, 132, 64, 35, 112, 52, 25,  94, 40, 12,  73, 26,  0,  48,  4,  0,   0,  0,  0,

+    195, 96, 46, 173, 85, 38, 154, 74, 31, 133, 63, 22, 113, 52, 11,  93, 40,  0,  73, 26,  0,  47,  5,  0,   0,  0,  0,

+    188, 67, 153, 168, 58, 137, 151, 49, 122, 131, 39, 106, 113, 28, 90,  94, 13, 75,  75,  0, 57,  51,  0, 35,   0,  0,  0,

+    190, 68, 138, 170, 59, 123, 152, 50, 110, 132, 41, 96, 113, 29, 80,  94, 16, 66,  75,  0, 49,  50,  0, 27,   0,  0,  0,

+    191, 69, 126, 170, 59, 112, 151, 52, 100, 132, 42, 86, 113, 30, 73,  95, 17, 58,  75,  0, 42,  50,  0, 21,   0,  0,  0,

+    192, 70, 113, 170, 61, 100, 151, 52, 89, 132, 42, 77, 113, 31, 64,  94, 19, 50,  74,  1, 35,  50,  0, 14,   0,  0,  0,

+    192, 70, 100, 170, 62, 89, 151, 53, 77, 131, 43, 66, 112, 32, 54,  94, 20, 42,  74,  2, 27,  49,  0,  5,   0,  0,  0,

+    192, 71, 87, 171, 61, 77, 152, 53, 67, 131, 44, 57, 112, 33, 45,  94, 21, 33,  74,  4, 19,  49,  0,  1,   0,  0,  0,

+    193, 71, 74, 171, 62, 64, 152, 53, 55, 132, 44, 45, 113, 34, 34,  94, 22, 23,  73,  5,  7,  48,  0,  0,   0,  0,  0,

+    193, 70, 58, 172, 62, 50, 152, 54, 42, 132, 44, 32, 112, 35, 22,  93, 23, 10,  73,  6,  0,  47,  0,  0,   0,  0,  0,

+    193, 70, 45, 172, 62, 38, 153, 54, 31, 132, 44, 21, 112, 35,  9,  94, 23,  0,  73,  7,  0,  47,  0,  0,   0,  0,  0,

+    189, 26, 141, 169, 15, 126, 150,  2, 112, 131,  0, 97, 113,  0, 82,  94,  0, 67,  75,  0, 51,  50,  0, 29,   0,  0,  0,

+    190, 28, 128, 170, 18, 114, 151,  8, 101, 132,  0, 88, 113,  0, 74,  94,  0, 60,  75,  0, 44,  50,  0, 23,   0,  0,  0,

+    191, 30, 117, 170, 23, 104, 152, 11, 92, 132,  1, 79, 113,  0, 67,  95,  0, 53,  75,  0, 37,  50,  0, 17,   0,  0,  0,

+    191, 33, 105, 170, 26, 93, 151, 18, 83, 132,  6, 70, 112,  0, 58,  94,  0, 45,  75,  0, 30,  49,  0,  8,   0,  0,  0,

+    191, 34, 93, 170, 27, 82, 151, 20, 72, 131,  8, 61, 112,  0, 49,  94,  0, 38,  74,  0, 23,  49,  0,  4,   0,  0,  0,

+    191, 36, 82, 170, 29, 71, 151, 22, 63, 131, 11, 52, 112,  0, 41,  93,  0, 29,  74,  0, 14,  48,  0,  1,   0,  0,  0,

+    191, 38, 69, 170, 31, 60, 151, 24, 51, 131, 14, 41, 112,  1, 31,  93,  0, 19,  73,  0,  3,  48,  0,  0,   0,  0,  0,

+    192, 37, 56, 171, 31, 47, 152, 25, 40, 131, 17, 30, 112,  4, 19,  93,  0,  7,  73,  0,  0,  47,  0,  0,   0,  0,  0,

+    192, 38, 45, 171, 33, 36, 152, 26, 30, 131, 18, 21, 111,  7,  9,  93,  0,  0,  73,  0,  0,  47,  0,  0,   0,  0,  0,

+    149, 218, 248, 133, 194, 222, 119, 173, 198, 102, 151, 173,  86, 130, 148,  70, 108, 125,  53, 85, 100,  32, 59, 71,   0, 22, 33,

+    154, 216, 223, 137, 193, 200, 122, 172, 178, 106, 150, 156,  89, 128, 133,  73, 107, 112,  54, 85, 89,  31, 59, 63,   0, 22, 26,

+    159, 215, 202, 141, 192, 181, 126, 171, 161, 108, 149, 141,  90, 128, 121,  74, 107, 100,  55, 85, 80,  32, 58, 55,   0, 22, 19,

+    161, 213, 179, 144, 190, 160, 126, 170, 143, 109, 148, 125,  92, 127, 107,  74, 106, 89,  56, 84, 69,  32, 58, 46,   0, 21, 11,

+    163, 211, 156, 144, 189, 139, 129, 168, 125, 110, 147, 108,  93, 126, 92,  75, 105, 76,  57, 83, 58,  33, 58, 37,   0, 21,  1,

+    167, 211, 133, 147, 188, 120, 130, 167, 105, 110, 145, 92,  93, 125, 78,  76, 104, 64,  58, 83, 48,  33, 57, 27,   0, 21,  0,

+    169, 210, 108, 149, 187, 96, 131, 166, 86, 112, 144, 74,  94, 124, 62,  77, 103, 49,  58, 82, 35,  33, 57, 15,   0, 21,  0,

+    170, 209, 80, 151, 186, 71, 133, 165, 62, 114, 143, 52,  95, 123, 42,  77, 103, 32,  58, 81, 18,  33, 56,  0,   0, 21,  0,

+    173, 208, 55, 152, 186, 49, 134, 165, 41, 114, 143, 34,  95, 122, 25,  77, 102, 14,  58, 81,  0,  33, 56,  0,   0, 21,  0,

+    154, 195, 232, 137, 174, 207, 122, 156, 185, 105, 136, 163,  89, 116, 140,  73, 97, 117,  56, 76, 94,  35, 51, 66,   0, 13, 28,

+    158, 194, 209, 141, 174, 187, 125, 155, 167, 109, 135, 146,  91, 116, 125,  75, 96, 105,  57, 75, 83,  35, 50, 57,   0, 12, 21,

+    161, 193, 189, 144, 173, 169, 128, 154, 151, 110, 134, 132,  93, 115, 113,  77, 95, 94,  58, 75, 74,  35, 50, 50,   0, 12, 13,

+    164, 192, 168, 145, 171, 151, 129, 153, 134, 111, 133, 117,  94, 114, 100,  76, 95, 82,  58, 75, 64,  36, 50, 42,   0, 12,  5,

+    165, 191, 147, 147, 170, 131, 130, 152, 117, 113, 132, 102,  95, 113, 86,  77, 94, 71,  58, 74, 54,  35, 50, 33,   0, 13,  0,

+    167, 189, 126, 148, 169, 113, 132, 151, 100, 113, 131, 86,  96, 112, 73,  77, 93, 59,  59, 73, 43,  35, 49, 23,   0, 12,  0,

+    170, 189, 104, 150, 168, 91, 133, 150, 81, 114, 130, 69,  96, 111, 57,  78, 92, 46,  59, 73, 31,  35, 49, 11,   0, 13,  0,

+    171, 188, 78, 152, 168, 68, 134, 149, 60, 115, 130, 50,  96, 111, 41,  78, 92, 29,  60, 73, 15,  35, 49,  0,   0, 12,  0,

+    173, 187, 55, 153, 167, 47, 134, 149, 39, 115, 129, 33,  97, 110, 24,  79, 92, 13,  60, 72,  0,  35, 48,  0,   0, 12,  0,

+    157, 175, 217, 139, 157, 196, 125, 141, 175, 109, 122, 153,  92, 104, 132,  76, 86, 110,  59, 67, 88,  37, 43, 61,   1,  1, 23,

+    161, 174, 196, 144, 156, 176, 127, 140, 158, 110, 121, 137,  94, 104, 118,  77, 85, 98,  59, 67, 78,  37, 43, 53,   0,  2, 16,

+    163, 174, 178, 146, 156, 160, 130, 139, 143, 112, 121, 124,  95, 103, 106,  78, 85, 88,  60, 66, 69,  37, 42, 46,   0,  2,  7,

+    166, 173, 159, 147, 154, 142, 130, 138, 127, 113, 120, 111,  96, 103, 95,  78, 84, 77,  60, 66, 59,  37, 43, 37,   0,  2,  0,

+    166, 172, 139, 148, 154, 125, 131, 137, 112, 113, 120, 96,  96, 102, 81,  78, 84, 66,  60, 65, 50,  37, 42, 29,   0,  3,  0,

+    167, 171, 120, 149, 153, 107, 133, 137, 95, 114, 118, 81,  97, 101, 69,  79, 84, 56,  60, 65, 40,  37, 42, 19,   0,  3,  0,

+    170, 170, 99, 151, 152, 87, 134, 136, 77, 115, 118, 66,  97, 101, 55,  79, 83, 42,  61, 65, 28,  37, 42,  7,   0,  3,  0,

+    172, 170, 75, 152, 151, 65, 134, 135, 57, 115, 117, 48,  97, 100, 38,  79, 83, 27,  61, 64, 12,  36, 42,  0,   0,  3,  0,

+    172, 169, 55, 154, 151, 46, 135, 134, 40, 116, 116, 32,  97, 99, 21,  80, 82, 10,  61, 64,  0,  36, 41,  0,   0,  3,  0,

+    160, 154, 203, 143, 139, 182, 127, 124, 164, 111, 107, 143,  95, 91, 122,  78, 75, 103,  60, 57, 81,  39, 33, 56,   1,  0, 18,

+    163, 154, 184, 146, 138, 165, 130, 123, 148, 113, 107, 129,  96, 90, 110,  79, 74, 92,  61, 56, 72,  39, 34, 48,   2,  0,  9,

+    165, 154, 167, 147, 137, 149, 131, 122, 134, 114, 106, 117,  96, 90, 100,  79, 74, 82,  61, 56, 64,  39, 33, 40,   2,  0,  1,

+    166, 153, 150, 149, 137, 133, 132, 122, 119, 114, 106, 104,  97, 90, 88,  79, 74, 72,  61, 56, 55,  39, 34, 33,   0,  0,  0,

+    168, 152, 132, 149, 136, 117, 132, 121, 104, 114, 105, 90,  97, 89, 76,  79, 73, 62,  61, 56, 46,  38, 34, 25,   0,  0,  0,

+    169, 151, 114, 150, 135, 101, 133, 121, 90, 114, 104, 77,  97, 89, 65,  80, 73, 51,  61, 56, 36,  38, 34, 16,   0,  0,  0,

+    170, 150, 94, 151, 135, 83, 134, 120, 73, 115, 104, 62,  98, 88, 51,  80, 72, 39,  61, 56, 24,  38, 34,  3,   0,  0,  0,

+    172, 150, 72, 153, 134, 63, 135, 119, 55, 115, 103, 45,  98, 88, 36,  80, 72, 24,  61, 55,  9,  38, 34,  0,   0,  0,  0,

+    172, 150, 54, 153, 134, 47, 135, 119, 38, 116, 103, 30,  98, 87, 21,  80, 72,  8,  62, 55,  0,  37, 34,  0,   0,  0,  0,

+    162, 134, 190, 145, 120, 171, 129, 108, 153, 113, 93, 134,  97, 78, 115,  80, 63, 96,  62, 46, 75,  41, 23, 51,   0,  0, 11,

+    165, 134, 173, 147, 120, 154, 131, 107, 138, 114, 92, 120,  97, 78, 103,  80, 63, 85,  62, 46, 66,  40, 23, 43,   0,  0,  2,

+    166, 134, 157, 148, 120, 140, 132, 106, 125, 114, 92, 109,  97, 77, 93,  81, 63, 77,  62, 46, 58,  40, 24, 36,   0,  0,  0,

+    168, 133, 140, 149, 119, 125, 132, 106, 112, 115, 92, 97,  98, 77, 82,  81, 62, 67,  62, 46, 50,  40, 24, 29,   0,  0,  0,

+    168, 133, 123, 150, 119, 110, 133, 106, 97, 115, 91, 84,  98, 77, 70,  81, 62, 57,  62, 46, 41,  40, 24, 20,   0,  0,  0,

+    169, 132, 107, 150, 118, 94, 133, 105, 84, 115, 91, 72,  98, 76, 60,  80, 62, 47,  62, 46, 32,  39, 25, 11,   0,  0,  0,

+    171, 132, 89, 152, 118, 79, 135, 105, 69, 115, 90, 58,  98, 76, 47,  80, 62, 36,  62, 46, 21,  39, 25,  0,   0,  0,  0,

+    171, 132, 69, 153, 117, 60, 135, 104, 52, 116, 90, 42,  98, 76, 33,  81, 61, 21,  62, 46,  6,  38, 25,  0,   0,  0,  0,

+    172, 132, 54, 153, 118, 45, 135, 104, 38, 116, 90, 28,  98, 76, 18,  81, 61,  6,  62, 46,  0,  38, 25,  0,   0,  0,  0,

+    164, 115, 177, 146, 103, 159, 130, 91, 143, 114, 78, 125,  97, 65, 107,  81, 51, 89,  63, 34, 69,  41,  9, 46,   0,  0,  4,

+    166, 115, 161, 148, 103, 144, 132, 91, 129, 115, 78, 112,  98, 65, 96,  81, 51, 79,  63, 35, 61,  41, 11, 38,   0,  0,  0,

+    167, 115, 146, 150, 102, 131, 132, 91, 117, 115, 78, 101,  98, 65, 86,  81, 51, 71,  63, 35, 54,  41, 12, 32,   0,  0,  0,

+    168, 114, 132, 150, 103, 118, 133, 91, 105, 116, 78, 91,  98, 64, 76,  82, 51, 61,  63, 36, 46,  41, 13, 24,   0,  0,  0,

+    169, 114, 116, 150, 102, 103, 134, 90, 91, 116, 78, 79,  98, 65, 66,  81, 51, 53,  63, 36, 37,  40, 14, 17,   0,  0,  0,

+    169, 114, 101, 151, 101, 89, 134, 90, 79, 116, 77, 67,  98, 64, 56,  81, 51, 44,  63, 36, 29,  40, 15,  7,   0,  0,  0,

+    170, 114, 85, 152, 101, 75, 135, 90, 65, 116, 77, 54,  98, 64, 44,  81, 51, 32,  63, 36, 17,  39, 15,  0,   0,  0,  0,

+    172, 113, 66, 152, 101, 58, 135, 89, 49, 116, 77, 40,  99, 64, 30,  81, 51, 18,  62, 36,  3,  38, 16,  0,   0,  0,  0,

+    171, 113, 51, 153, 101, 44, 136, 89, 36, 116, 77, 28,  99, 64, 18,  81, 51,  5,  62, 36,  0,  38, 16,  0,   0,  0,  0,

+    165, 94, 166, 147, 82, 147, 132, 72, 132, 115, 61, 115,  98, 49, 99,  82, 36, 82,  64, 19, 64,  42,  0, 41,   0,  0,  0,

+    167, 93, 150, 150, 83, 134, 133, 73, 120, 116, 62, 104,  99, 49, 88,  82, 36, 72,  64, 20, 55,  41,  0, 33,   0,  0,  0,

+    169, 93, 137, 150, 83, 122, 134, 73, 109, 116, 61, 94,  99, 50, 80,  82, 37, 65,  64, 21, 49,  41,  0, 27,   0,  0,  0,

+    169, 94, 123, 150, 83, 110, 133, 73, 97, 116, 61, 83,  99, 50, 70,  82, 38, 57,  63, 23, 42,  41,  0, 20,   0,  0,  0,

+    169, 94, 109, 150, 84, 97, 134, 73, 85, 116, 62, 73,  99, 51, 61,  81, 38, 48,  63, 23, 33,  41,  1, 11,   0,  0,  0,

+    170, 94, 96, 150, 83, 84, 134, 73, 74, 116, 61, 62,  99, 50, 51,  82, 38, 39,  64, 23, 24,  40,  3,  4,   0,  0,  0,

+    171, 93, 79, 152, 82, 70, 135, 73, 61, 116, 62, 51,  98, 51, 40,  81, 38, 28,  63, 24, 14,  39,  4,  0,   0,  0,  0,

+    171, 94, 64, 152, 83, 55, 135, 73, 47, 116, 62, 37,  98, 50, 27,  81, 38, 15,  63, 24,  1,  39,  4,  0,   0,  0,  0,

+    172, 93, 51, 153, 82, 42, 135, 73, 35, 117, 62, 26,  99, 51, 16,  81, 39,  3,  63, 25,  0,  38,  5,  0,   0,  0,  0,

+    166, 68, 153, 148, 59, 137, 133, 49, 121, 115, 39, 106,  99, 28, 91,  82, 13, 75,  65,  0, 58,  42,  0, 36,   0,  0,  0,

+    168, 68, 139, 150, 59, 124, 134, 50, 110, 116, 40, 96,  99, 30, 81,  82, 16, 66,  64,  0, 50,  41,  0, 29,   0,  0,  0,

+    169, 69, 126, 150, 59, 113, 134, 51, 101, 117, 42, 87, 100, 30, 73,  82, 17, 59,  65,  0, 43,  41,  0, 23,   0,  0,  0,

+    169, 70, 115, 150, 61, 102, 134, 52, 89, 116, 42, 77,  99, 32, 65,  82, 19, 52,  64,  0, 36,  41,  0, 15,   0,  0,  0,

+    169, 70, 101, 150, 61, 90, 134, 52, 79, 116, 43, 68,  99, 32, 55,  82, 21, 43,  64,  2, 28,  41,  0,  6,   0,  0,  0,

+    170, 70, 89, 151, 62, 79, 134, 53, 69, 116, 44, 58,  99, 33, 46,  81, 21, 34,  64,  3, 20,  41,  0,  2,   0,  0,  0,

+    170, 71, 76, 152, 62, 66, 134, 53, 57, 116, 43, 46,  99, 33, 36,  82, 22, 24,  64,  5, 10,  40,  0,  0,   0,  0,  0,

+    171, 70, 61, 152, 62, 52, 135, 53, 44, 116, 44, 35,  99, 34, 24,  82, 22, 12,  63,  6,  0,  39,  0,  0,   0,  0,  0,

+    171, 71, 49, 153, 62, 41, 135, 54, 33, 117, 45, 25,  98, 34, 13,  81, 23,  0,  63,  7,  0,  39,  0,  0,   0,  0,  0,

+    167, 33, 142, 149, 24, 127, 134, 10, 113, 116,  0, 97, 100,  0, 83,  83,  0, 68,  65,  0, 52,  40,  0, 30,   0,  0,  0,

+    169, 33, 129, 150, 26, 115, 134, 17, 102, 116,  3, 89, 100,  0, 75,  83,  0, 60,  65,  0, 45,  40,  0, 24,   0,  0,  0,

+    169, 36, 118, 151, 27, 104, 134, 19, 93, 116,  7, 80, 100,  0, 67,  83,  0, 54,  65,  0, 38,  41,  0, 17,   0,  0,  0,

+    169, 39, 107, 150, 30, 94, 134, 22, 84, 116, 11, 71,  99,  0, 59,  83,  0, 46,  64,  0, 31,  40,  0,  9,   0,  0,  0,

+    169, 39, 95, 151, 31, 83, 134, 24, 73, 116, 15, 62, 100,  1, 51,  83,  0, 38,  64,  0, 24,  40,  0,  5,   0,  0,  0,

+    169, 41, 83, 151, 33, 73, 134, 26, 64, 117, 17, 54,  99,  4, 42,  82,  0, 30,  64,  0, 16,  40,  0,  1,   0,  0,  0,

+    170, 42, 71, 152, 34, 62, 134, 28, 53, 117, 19, 44,  99,  6, 33,  82,  0, 21,  63,  0,  4,  39,  0,  0,   0,  0,  0,

+    171, 42, 59, 152, 35, 50, 134, 29, 42, 117, 21, 32,  99,  9, 22,  82,  0,  9,  63,  0,  0,  38,  0,  0,   0,  0,  0,

+    172, 42, 48, 152, 36, 40, 135, 29, 32, 117, 21, 23,  99, 10, 12,  82,  0,  0,  63,  0,  0,  38,  0,  0,   0,  0,  0,

+    107, 207, 246,  96, 185, 220,  86, 165, 196,  73, 144, 171,  60, 123, 147,  46, 103, 125,  32, 82, 100,   9, 56, 71,   0, 20, 33,

+    115, 206, 221, 104, 184, 198,  92, 164, 178,  78, 143, 154,  64, 123, 133,  51, 102, 111,  34, 81, 89,  10, 56, 63,   0, 20, 27,

+    122, 204, 200, 108, 183, 180,  95, 163, 161,  82, 142, 140,  68, 122, 120,  54, 102, 101,  36, 81, 79,  11, 56, 55,   0, 20, 20,

+    125, 203, 179, 111, 181, 160,  97, 162, 143,  85, 141, 124,  70, 121, 107,  55, 101, 89,  38, 80, 69,  14, 55, 46,   0, 19, 10,

+    128, 202, 156, 113, 180, 140, 102, 161, 125,  87, 140, 108,  71, 120, 92,  56, 100, 76,  39, 79, 59,  14, 55, 38,   0, 20,  3,

+    132, 200, 135, 117, 179, 121, 103, 159, 106,  88, 139, 93,  73, 119, 79,  57, 100, 65,  41, 79, 49,  15, 54, 28,   0, 19,  0,

+    134, 200, 111, 119, 178, 98, 105, 158, 87,  89, 138, 76,  74, 118, 64,  58, 99, 51,  41, 78, 37,  16, 54, 17,   0, 19,  0,

+    137, 199, 85, 122, 177, 75, 108, 158, 66,  91, 137, 56,  75, 118, 46,  59, 98, 35,  42, 78, 22,  16, 54,  3,   0, 19,  0,

+    140, 198, 62, 125, 177, 55, 109, 158, 47,  92, 137, 40,  76, 117, 32,  59, 98, 21,  42, 78,  6,  16, 54,  0,   0, 18,  0,

+    118, 186, 231, 106, 167, 206,  93, 149, 184,  81, 130, 161,  67, 111, 139,  54, 92, 117,  39, 72, 93,  17, 48, 66,   0, 10, 29,

+    123, 185, 207, 110, 166, 186,  98, 148, 167,  85, 129, 145,  71, 111, 125,  56, 92, 104,  40, 72, 83,  18, 48, 57,   0, 10, 22,

+    128, 184, 188, 113, 165, 168, 102, 147, 151,  88, 128, 131,  73, 110, 113,  58, 91, 94,  42, 71, 74,  19, 48, 50,   0,  9, 15,

+    131, 183, 168, 116, 164, 151, 104, 146, 134,  89, 127, 117,  73, 109, 100,  58, 90, 83,  42, 71, 65,  20, 48, 42,   0,  9,  5,

+    134, 182, 148, 120, 163, 131, 105, 145, 118,  90, 126, 102,  75, 108, 86,  59, 90, 72,  43, 71, 55,  19, 47, 34,   0,  9,  0,

+    136, 181, 128, 122, 162, 115, 107, 144, 102,  92, 125, 87,  76, 107, 74,  61, 89, 60,  44, 70, 45,  20, 47, 24,   0,  8,  0,

+    139, 180, 106, 124, 161, 95, 109, 144, 83,  93, 124, 71,  77, 107, 60,  61, 89, 47,  44, 70, 33,  20, 47, 13,   0,  8,  0,

+    142, 179, 82, 125, 160, 72, 111, 143, 63,  94, 124, 54,  77, 106, 44,  61, 88, 32,  44, 69, 18,  20, 46,  0,   0,  8,  0,

+    143, 179, 62, 127, 160, 54, 111, 142, 47,  94, 124, 39,  78, 106, 29,  62, 88, 18,  45, 69,  3,  20, 46,  0,   0,  8,  0,

+    124, 167, 216, 112, 150, 194,  99, 134, 174,  87, 117, 153,  73, 100, 131,  58, 82, 110,  43, 64, 88,  23, 40, 61,   0,  0, 24,

+    129, 166, 195, 116, 150, 175, 103, 134, 158,  89, 116, 137,  75, 99, 118,  60, 82, 98,  44, 63, 78,  23, 40, 53,   0,  0, 17,

+    132, 166, 177, 119, 149, 160, 106, 133, 143,  90, 115, 124,  76, 99, 107,  61, 81, 88,  45, 63, 69,  24, 40, 46,   0,  0,  9,

+    136, 166, 159, 121, 148, 143, 107, 132, 126,  92, 115, 111,  77, 98, 94,  62, 81, 78,  46, 63, 60,  23, 40, 38,   0,  0,  0,

+    138, 164, 140, 122, 147, 125, 108, 131, 111,  93, 114, 97,  79, 98, 82,  63, 80, 67,  46, 62, 50,  24, 40, 29,   0,  0,  0,

+    139, 163, 122, 124, 146, 109, 110, 131, 96,  94, 114, 83,  79, 97, 70,  63, 81, 57,  46, 62, 41,  24, 40, 21,   0,  0,  0,

+    141, 163, 101, 126, 145, 90, 111, 130, 79,  95, 113, 68,  79, 96, 56,  63, 80, 44,  47, 62, 30,  23, 40, 10,   0,  0,  0,

+    144, 162, 79, 127, 145, 70, 112, 129, 60,  95, 112, 51,  79, 96, 41,  64, 79, 30,  47, 61, 15,  23, 40,  0,   0,  0,  0,

+    145, 162, 60, 129, 145, 52, 113, 129, 46,  96, 112, 37,  79, 95, 27,  64, 79, 16,  47, 61,  1,  23, 39,  0,   0,  0,  0,

+    131, 147, 202, 117, 133, 181, 105, 119, 162,  91, 103, 142,  77, 87, 122,  62, 71, 102,  47, 54, 81,  26, 31, 56,   0,  0, 18,

+    135, 147, 183, 120, 132, 164, 107, 118, 147,  93, 102, 128,  78, 87, 110,  63, 71, 92,  47, 54, 72,  26, 31, 48,   0,  0, 10,

+    138, 147, 166, 123, 131, 149, 108, 118, 133,  94, 102, 116,  79, 86, 100,  64, 71, 82,  48, 54, 64,  27, 31, 41,   0,  0,  2,

+    139, 146, 149, 124, 131, 134, 111, 117, 119,  94, 101, 103,  79, 86, 88,  64, 70, 72,  48, 53, 55,  27, 31, 33,   0,  0,  0,

+    141, 146, 132, 125, 131, 117, 111, 117, 104,  95, 101, 91,  80, 86, 77,  65, 70, 62,  48, 53, 46,  26, 31, 25,   0,  0,  0,

+    143, 145, 115, 126, 130, 101, 112, 116, 90,  96, 100, 78,  80, 85, 65,  65, 70, 52,  49, 53, 37,  27, 32, 17,   0,  0,  0,

+    144, 144, 96, 128, 129, 85, 112, 115, 75,  97, 100, 64,  81, 85, 52,  65, 69, 40,  49, 53, 26,  26, 31,  5,   0,  0,  0,

+    146, 144, 76, 129, 129, 67, 114, 115, 58,  97, 99, 48,  82, 84, 38,  66, 69, 27,  49, 53, 12,  26, 32,  0,   0,  0,  0,

+    146, 144, 59, 130, 128, 51, 114, 114, 43,  98, 99, 35,  82, 84, 25,  66, 69, 13,  49, 53,  0,  26, 32,  0,   0,  0,  0,

+    135, 129, 189, 122, 115, 170, 107, 103, 152,  94, 89, 133,  79, 74, 114,  64, 60, 95,  49, 43, 75,  29, 20, 51,   0,  0, 12,

+    138, 129, 171, 124, 115, 153, 110, 103, 138,  95, 89, 120,  81, 74, 103,  66, 60, 86,  50, 44, 67,  28, 21, 43,   0,  0,  3,

+    140, 129, 156, 125, 115, 140, 111, 103, 125,  96, 89, 109,  81, 74, 93,  67, 60, 76,  50, 44, 59,  29, 22, 36,   0,  0,  0,

+    142, 128, 140, 127, 115, 125, 112, 102, 112,  97, 88, 97,  82, 74, 83,  67, 60, 67,  50, 44, 51,  29, 22, 29,   0,  0,  0,

+    142, 128, 124, 127, 114, 111, 113, 102, 98,  98, 88, 85,  82, 74, 71,  66, 60, 58,  50, 44, 42,  29, 22, 21,   0,  0,  0,

+    144, 127, 108, 128, 114, 96, 113, 101, 85,  98, 87, 73,  82, 74, 61,  67, 60, 48,  50, 44, 33,  28, 23, 12,   0,  0,  0,

+    145, 127, 91, 129, 114, 81, 115, 101, 71,  98, 87, 60,  82, 73, 48,  67, 59, 37,  50, 44, 22,  29, 23,  1,   0,  0,  0,

+    147, 127, 73, 130, 113, 63, 115, 101, 55,  98, 87, 45,  83, 73, 35,  67, 59, 24,  50, 44, 10,  28, 24,  0,   0,  0,  0,

+    147, 127, 58, 131, 113, 49, 115, 100, 42,  99, 86, 33,  83, 73, 23,  67, 59, 10,  50, 44,  0,  27, 24,  0,   0,  0,  0,

+    138, 110, 177, 124, 99, 159, 110, 88, 142,  96, 75, 125,  82, 62, 107,  66, 48, 89,  51, 33, 70,  30,  8, 46,   0,  0,  5,

+    142, 111, 160, 127, 99, 144, 113, 88, 130,  98, 75, 112,  82, 62, 96,  68, 49, 80,  51, 33, 61,  30, 10, 39,   0,  0,  0,

+    143, 111, 146, 128, 99, 131, 114, 88, 118,  98, 75, 101,  83, 62, 86,  68, 49, 71,  52, 33, 54,  30, 11, 32,   0,  0,  0,

+    144, 111, 132, 128, 99, 118, 113, 88, 106,  99, 75, 91,  83, 62, 77,  68, 49, 62,  52, 34, 46,  30, 12, 25,   0,  0,  0,

+    144, 111, 117, 129, 98, 104, 114, 87, 92,  99, 75, 80,  83, 62, 67,  68, 49, 53,  51, 34, 38,  30, 13, 18,   0,  0,  0,

+    145, 111, 103, 130, 98, 91, 114, 87, 80,  99, 75, 68,  83, 63, 57,  68, 50, 45,  51, 34, 30,  30, 14,  8,   0,  0,  0,

+    146, 110, 87, 131, 98, 76, 115, 87, 67,  99, 75, 56,  83, 62, 45,  68, 49, 33,  52, 35, 19,  30, 15,  2,   0,  0,  0,

+    148, 110, 70, 131, 98, 60, 116, 86, 52,  99, 74, 43,  84, 62, 33,  69, 49, 21,  52, 35,  6,  29, 15,  0,   0,  0,  0,

+    148, 110, 56, 132, 97, 48, 117, 87, 40, 100, 75, 31,  84, 62, 22,  68, 49,  9,  51, 35,  0,  28, 15,  0,   0,  0,  0,

+    142, 91, 166, 126, 80, 148, 113, 71, 132,  98, 59, 115,  83, 47, 99,  69, 34, 82,  53, 17, 64,  32,  0, 41,   0,  0,  0,

+    143, 91, 150, 128, 81, 135, 114, 71, 120,  99, 60, 104,  85, 48, 89,  69, 35, 73,  53, 19, 56,  32,  0, 34,   0,  0,  0,

+    145, 91, 137, 129, 81, 122, 115, 71, 109, 100, 60, 94,  85, 48, 81,  69, 35, 65,  53, 19, 49,  32,  0, 28,   0,  0,  0,

+    146, 92, 124, 130, 81, 110, 115, 71, 98, 100, 60, 84,  85, 49, 71,  69, 36, 57,  53, 21, 42,  32,  0, 21,   0,  0,  0,

+    147, 91, 110, 130, 81, 97, 115, 71, 86, 100, 60, 74,  84, 49, 62,  69, 36, 48,  53, 22, 34,  32,  0, 13,   0,  0,  0,

+    147, 92, 97, 130, 81, 85, 116, 72, 76, 100, 60, 63,  85, 49, 52,  69, 37, 40,  53, 22, 26,  31,  1,  5,   0,  0,  0,

+    148, 92, 82, 131, 81, 71, 116, 71, 62, 100, 60, 53,  84, 49, 42,  69, 37, 30,  52, 23, 16,  31,  2,  0,   0,  0,  0,

+    148, 91, 67, 132, 81, 57, 117, 71, 49, 100, 60, 39,  84, 49, 30,  69, 37, 18,  52, 23,  2,  30,  2,  0,   0,  0,  0,

+    149, 91, 54, 132, 81, 46, 118, 71, 39, 101, 60, 29,  85, 49, 19,  69, 37,  6,  52, 23,  0,  29,  3,  0,   0,  0,  0,

+    143, 68, 153, 128, 59, 137, 115, 49, 122,  99, 39, 107,  85, 28, 91,  70, 13, 75,  54,  0, 58,  32,  0, 36,   0,  0,  0,

+    146, 68, 140, 131, 59, 125, 116, 51, 111, 100, 40, 97,  85, 29, 82,  70, 15, 67,  54,  0, 50,  32,  0, 29,   0,  0,  0,

+    147, 68, 127, 131, 59, 114, 117, 51, 102, 101, 41, 88,  86, 30, 74,  70, 17, 60,  54,  0, 44,  32,  0, 23,   0,  0,  0,

+    147, 70, 115, 131, 60, 103, 116, 52, 91, 100, 42, 78,  85, 32, 65,  70, 19, 53,  54,  1, 38,  32,  0, 17,   0,  0,  0,

+    147, 70, 103, 131, 61, 91, 117, 53, 81, 101, 43, 69,  86, 32, 57,  70, 20, 44,  54,  2, 30,  32,  0,  7,   0,  0,  0,

+    148, 70, 91, 132, 61, 80, 117, 52, 70, 101, 43, 59,  85, 33, 48,  70, 21, 36,  53,  4, 22,  32,  0,  3,   0,  0,  0,

+    148, 70, 78, 132, 62, 68, 117, 53, 58, 101, 43, 48,  85, 34, 38,  70, 22, 26,  53,  6, 12,  31,  0,  0,   0,  0,  0,

+    149, 71, 64, 132, 62, 54, 118, 54, 46, 101, 44, 37,  85, 34, 27,  69, 23, 15,  53,  7,  1,  30,  0,  0,   0,  0,  0,

+    150, 70, 53, 134, 61, 44, 118, 54, 36, 101, 44, 28,  85, 35, 17,  69, 23,  4,  52,  8,  0,  30,  0,  0,   0,  0,  0,

+    145, 38, 143, 130, 29, 128, 117, 18, 114, 101,  3, 98,  87,  0, 84,  72,  0, 69,  54,  0, 53,  30,  0, 31,   0,  0,  0,

+    147, 38, 130, 132, 30, 116, 117, 22, 103, 101,  8, 89,  87,  0, 76,  72,  0, 62,  54,  0, 46,  30,  0, 24,   0,  0,  0,

+    148, 40, 119, 132, 31, 105, 117, 23, 94, 101, 13, 81,  87,  0, 68,  71,  0, 55,  54,  0, 39,  30,  0, 18,   0,  0,  0,

+    148, 42, 108, 132, 34, 96, 117, 25, 85, 102, 15, 73,  86,  2, 60,  71,  0, 47,  54,  0, 33,  30,  0, 11,   0,  0,  0,

+    148, 43, 96, 133, 35, 85, 117, 28, 75, 102, 18, 64,  87,  5, 52,  71,  0, 40,  54,  0, 25,  30,  0,  5,   0,  0,  0,

+    149, 44, 85, 132, 36, 75, 118, 29, 66, 101, 20, 55,  86,  8, 44,  70,  0, 32,  53,  0, 18,  29,  0,  2,   0,  0,  0,

+    149, 45, 74, 133, 37, 64, 118, 31, 55, 102, 21, 45,  85, 10, 34,  70,  0, 22,  53,  0,  6,  28,  0,  0,   0,  0,  0,

+    150, 46, 61, 133, 39, 52, 118, 31, 44, 102, 23, 34,  85, 12, 24,  70,  0, 12,  52,  0,  0,  28,  0,  0,   0,  0,  0,

+    150, 46, 51, 133, 40, 42, 119, 32, 35, 102, 24, 25,  85, 13, 14,  70,  0,  1,  52,  0,  0,  27,  0,  0,   0,  0,  0,

+    53, 198, 244,  49, 177, 218,  41, 158, 195,  32, 138, 171,  22, 118, 147,  11, 98, 124,   0, 78, 100,   0, 54, 71,   0, 18, 34,

+    69, 196, 220,  64, 175, 196,  54, 157, 176,  45, 137, 154,  32, 117, 133,  19, 98, 111,   0, 78, 89,   0, 53, 63,   0, 17, 27,

+    80, 195, 198,  69, 175, 179,  60, 156, 159,  50, 136, 139,  38, 116, 120,  25, 98, 101,   4, 77, 80,   0, 53, 55,   0, 17, 21,

+    84, 193, 177,  75, 173, 159,  64, 155, 142,  55, 135, 124,  41, 116, 107,  27, 97, 89,   9, 76, 70,   0, 53, 47,   0, 17, 11,

+    89, 193, 157,  79, 172, 140,  70, 154, 125,  57, 134, 109,  44, 115, 92,  32, 96, 76,  13, 76, 59,   0, 52, 39,   0, 16,  4,

+    94, 191, 135,  85, 171, 121,  72, 152, 108,  60, 133, 94,  47, 114, 80,  32, 95, 65,  15, 76, 49,   0, 52, 29,   0, 16,  0,

+    98, 190, 113,  87, 170, 100,  76, 152, 89,  62, 132, 77,  49, 113, 65,  35, 95, 52,  18, 75, 37,   0, 52, 18,   0, 15,  0,

+    103, 190, 89,  90, 169, 80,  78, 151, 70,  64, 132, 60,  51, 113, 49,  37, 94, 38,  20, 75, 25,   0, 52,  5,   0, 15,  0,

+    106, 189, 69,  93, 169, 61,  80, 151, 53,  66, 131, 45,  52, 113, 36,  37, 94, 25,  19, 74, 11,   0, 51,  0,   0, 15,  0,

+    76, 178, 229,  68, 159, 205,  61, 142, 183,  50, 124, 160,  40, 106, 138,  28, 88, 116,  12, 69, 93,   0, 45, 66,   0,  5, 29,

+    86, 177, 207,  78, 158, 184,  67, 142, 166,  56, 123, 145,  45, 106, 125,  31, 88, 105,  16, 69, 83,   0, 45, 58,   0,  6, 22,

+    93, 176, 187,  81, 158, 168,  71, 141, 150,  61, 123, 131,  47, 105, 113,  35, 87, 94,  20, 68, 74,   0, 45, 51,   0,  5, 16,

+    98, 175, 168,  84, 157, 150,  75, 140, 134,  63, 122, 117,  50, 104, 100,  37, 87, 83,  21, 68, 65,   0, 45, 42,   0,  4,  7,

+    100, 174, 149,  89, 155, 132,  76, 139, 117,  65, 121, 102,  53, 104, 87,  39, 86, 72,  23, 67, 55,   0, 45, 34,   0,  3,  0,

+    103, 173, 130,  92, 155, 115,  80, 138, 102,  68, 120, 88,  53, 103, 75,  40, 86, 61,  24, 67, 45,   0, 45, 25,   0,  3,  0,

+    107, 172, 108,  95, 154, 96,  82, 137, 85,  70, 119, 73,  55, 102, 61,  42, 85, 49,  25, 67, 34,   0, 45, 14,   0,  3,  0,

+    110, 172, 86,  97, 153, 76,  85, 137, 67,  70, 119, 57,  56, 102, 46,  42, 84, 35,  26, 66, 21,   0, 44,  1,   0,  3,  0,

+    112, 171, 67,  98, 153, 59,  86, 137, 52,  71, 119, 44,  58, 102, 34,  44, 85, 22,  27, 66,  7,   0, 44,  0,   0,  3,  0,

+    90, 160, 215,  81, 144, 193,  70, 129, 173,  61, 112, 151,  49, 95, 131,  37, 79, 109,  22, 61, 87,   0, 38, 61,   0,  0, 25,

+    96, 160, 194,  86, 143, 174,  75, 128, 157,  65, 112, 137,  53, 95, 117,  40, 78, 98,  25, 60, 78,   0, 38, 53,   0,  0, 17,

+    100, 159, 177,  89, 143, 159,  79, 128, 143,  67, 111, 124,  55, 95, 107,  42, 78, 89,  27, 60, 70,   2, 38, 46,   0,  0,  9,

+    104, 158, 159,  92, 142, 143,  81, 127, 127,  69, 110, 110,  56, 94, 94,  43, 78, 78,  28, 60, 60,   2, 38, 38,   0,  0,  1,

+    107, 157, 140,  94, 141, 125,  82, 126, 112,  71, 110, 97,  59, 94, 82,  45, 77, 67,  29, 59, 51,   4, 37, 30,   0,  0,  0,

+    110, 156, 122,  97, 140, 109,  85, 125, 97,  72, 109, 83,  58, 93, 71,  45, 77, 57,  29, 60, 42,   5, 38, 22,   0,  0,  0,

+    111, 156, 103,  99, 139, 91,  87, 125, 81,  73, 108, 69,  60, 92, 58,  46, 77, 45,  30, 59, 31,   5, 38, 12,   0,  0,  0,

+    115, 156, 82, 101, 140, 73,  88, 124, 63,  74, 108, 53,  60, 92, 44,  46, 76, 32,  31, 59, 18,   6, 37,  0,   0,  0,  0,

+    116, 155, 65, 102, 139, 58,  89, 124, 49,  75, 108, 41,  61, 92, 32,  48, 76, 21,  31, 59,  6,   5, 37,  0,   0,  0,  0,

+    100, 141, 201,  88, 127, 181,  79, 114, 162,  69, 99, 142,  57, 83, 122,  44, 68, 102,  30, 51, 81,   7, 28, 56,   0,  0, 19,

+    105, 141, 182,  94, 127, 163,  83, 114, 146,  71, 98, 128,  59, 83, 110,  46, 68, 91,  31, 51, 72,  10, 28, 48,   0,  0, 11,

+    108, 141, 166,  96, 127, 149,  85, 113, 133,  73, 98, 116,  60, 83, 99,  46, 68, 82,  32, 51, 64,  11, 29, 41,   0,  0,  2,

+    111, 141, 149,  98, 126, 134,  88, 112, 119,  74, 97, 103,  61, 83, 88,  48, 67, 72,  33, 51, 56,  11, 29, 34,   0,  0,  0,

+    112, 140, 132, 100, 125, 118,  89, 112, 105,  75, 97, 91,  62, 82, 77,  49, 68, 62,  33, 51, 47,  12, 29, 26,   0,  0,  0,

+    115, 140, 116, 102, 125, 103,  90, 111, 91,  76, 96, 78,  62, 82, 65,  49, 67, 52,  34, 51, 38,  13, 29, 18,   0,  0,  0,

+    117, 139, 97, 103, 124, 87,  91, 111, 77,  78, 96, 65,  63, 81, 54,  49, 67, 41,  34, 51, 27,  12, 29,  7,   0,  0,  0,

+    119, 138, 78, 105, 124, 69,  92, 110, 60,  78, 95, 50,  65, 81, 40,  50, 67, 29,  34, 51, 15,  13, 30,  0,   0,  0,  0,

+    120, 138, 64, 106, 124, 54,  93, 110, 47,  78, 95, 38,  65, 81, 29,  50, 66, 17,  34, 50,  2,  13, 29,  0,   0,  0,  0,

+    107, 124, 189,  96, 111, 169,  85, 99, 152,  73, 85, 132,  61, 71, 114,  48, 57, 95,  34, 41, 75,  14, 18, 51,   0,  0, 13,

+    111, 124, 171, 100, 111, 153,  88, 99, 137,  75, 85, 120,  63, 72, 103,  50, 58, 85,  36, 41, 66,  15, 19, 43,   0,  0,  4,

+    113, 124, 156, 101, 111, 139,  90, 99, 125,  77, 85, 109,  64, 71, 93,  51, 57, 77,  36, 42, 59,  17, 20, 37,   0,  0,  0,

+    115, 124, 140, 103, 111, 125,  90, 99, 112,  78, 85, 97,  64, 71, 82,  52, 57, 67,  36, 42, 50,  16, 20, 30,   0,  0,  0,

+    117, 123, 125, 104, 110, 111,  92, 98, 99,  79, 85, 86,  65, 71, 72,  51, 58, 59,  37, 42, 43,  17, 21, 22,   0,  0,  0,

+    118, 123, 110, 105, 110, 97,  93, 98, 86,  78, 84, 74,  66, 71, 62,  52, 57, 49,  37, 42, 34,  17, 22, 14,   0,  0,  0,

+    120, 123, 93, 106, 109, 82,  94, 97, 72,  80, 84, 61,  66, 71, 50,  52, 57, 38,  37, 42, 24,  17, 22,  2,   0,  0,  0,

+    121, 122, 75, 108, 109, 66,  95, 97, 58,  80, 84, 48,  66, 71, 37,  52, 57, 26,  37, 42, 12,  16, 22,  0,   0,  0,  0,

+    122, 123, 62, 108, 109, 52,  95, 97, 45,  81, 84, 36,  67, 70, 26,  52, 57, 14,  37, 42,  0,  15, 22,  0,   0,  0,  0,

+    113, 107, 177, 102, 96, 159,  89, 85, 141,  78, 72, 124,  65, 60, 107,  52, 46, 89,  37, 30, 70,  18,  5, 46,   0,  0,  6,

+    116, 107, 160, 104, 96, 144,  92, 85, 129,  80, 72, 112,  67, 60, 96,  53, 47, 80,  38, 31, 62,  19,  7, 39,   0,  0,  0,

+    118, 107, 147, 105, 96, 131,  93, 85, 118,  80, 72, 101,  67, 60, 87,  54, 47, 71,  39, 31, 54,  19,  8, 32,   0,  0,  0,

+    119, 107, 132, 106, 96, 118,  94, 85, 106,  81, 73, 91,  67, 60, 77,  54, 47, 63,  39, 32, 47,  20,  9, 25,   0,  0,  0,

+    119, 107, 118, 106, 95, 105,  94, 85, 93,  81, 72, 80,  68, 60, 68,  54, 47, 54,  39, 32, 39,  20, 11, 18,   0,  0,  0,

+    121, 107, 104, 107, 96, 92,  95, 84, 80,  81, 72, 69,  68, 61, 58,  54, 48, 46,  39, 33, 31,  20, 12,  9,   0,  0,  0,

+    123, 107, 88, 108, 95, 77,  96, 84, 68,  82, 72, 57,  68, 60, 46,  54, 47, 35,  39, 33, 20,  19, 13,  2,   0,  0,  0,

+    123, 106, 72, 110, 95, 63,  96, 84, 54,  82, 72, 45,  69, 60, 35,  55, 48, 23,  39, 33,  9,  18, 14,  0,   0,  0,  0,

+    125, 106, 60, 110, 94, 50,  98, 84, 42,  83, 72, 34,  69, 60, 25,  55, 48, 12,  39, 33,  0,  17, 13,  0,   0,  0,  0,

+    118, 89, 165, 105, 79, 148,  93, 69, 132,  81, 57, 115,  68, 45, 99,  55, 32, 82,  41, 15, 64,  21,  0, 41,   0,  0,  0,

+    120, 89, 150, 107, 79, 135,  96, 69, 121,  82, 58, 105,  70, 46, 89,  56, 34, 73,  41, 17, 56,  21,  0, 34,   0,  0,  0,

+    121, 89, 137, 108, 79, 123,  96, 69, 109,  82, 58, 95,  70, 47, 81,  56, 34, 66,  41, 18, 49,  21,  0, 28,   0,  0,  0,

+    122, 90, 124, 109, 79, 110,  96, 69, 99,  83, 58, 85,  70, 47, 72,  56, 35, 58,  41, 19, 42,  21,  0, 22,   0,  0,  0,

+    123, 90, 111, 110, 79, 98,  97, 69, 87,  83, 59, 75,  70, 47, 63,  56, 35, 50,  41, 20, 35,  21,  0, 14,   0,  0,  0,

+    123, 90, 98, 110, 79, 87,  97, 70, 76,  84, 58, 64,  70, 48, 53,  56, 36, 41,  40, 21, 26,  21,  0,  5,   0,  0,  0,

+    125, 89, 84, 111, 79, 73,  97, 69, 64,  84, 59, 54,  70, 48, 43,  56, 36, 31,  40, 22, 17,  20,  1,  1,   0,  0,  0,

+    125, 89, 69, 112, 79, 60,  98, 70, 51,  84, 59, 42,  70, 48, 32,  56, 36, 20,  41, 22,  5,  19,  2,  0,   0,  0,  0,

+    126, 89, 57, 112, 79, 49,  99, 70, 41,  84, 59, 32,  70, 48, 22,  56, 36, 10,  40, 22,  0,  18,  2,  0,   0,  0,  0,

+    121, 67, 154, 108, 58, 138,  97, 50, 124,  84, 39, 107,  71, 28, 92,  58, 12, 76,  43,  0, 59,  20,  0, 37,   0,  0,  0,

+    124, 68, 140, 111, 59, 126,  98, 50, 112,  84, 40, 98,  71, 29, 83,  58, 15, 67,  42,  0, 51,  20,  0, 30,   0,  0,  0,

+    124, 68, 129, 111, 59, 114,  99, 51, 102,  86, 41, 88,  71, 30, 75,  58, 17, 60,  42,  0, 45,  20,  0, 24,   0,  0,  0,

+    125, 70, 116, 111, 60, 103,  99, 51, 92,  85, 41, 79,  71, 31, 66,  58, 19, 53,  42,  3, 38,  20,  0, 17,   0,  0,  0,

+    125, 70, 104, 111, 61, 93,  99, 52, 81,  85, 43, 69,  72, 32, 58,  58, 20, 45,  42,  4, 31,  20,  0,  8,   0,  0,  0,

+    126, 70, 92, 111, 61, 81,  99, 52, 71,  85, 42, 60,  71, 33, 49,  57, 21, 37,  42,  6, 23,  20,  0,  3,   0,  0,  0,

+    126, 70, 79, 112, 61, 70,  99, 53, 60,  85, 43, 50,  71, 33, 39,  57, 22, 28,  41,  7, 13,  19,  0,  0,   0,  0,  0,

+    127, 71, 66, 113, 62, 56, 100, 53, 48,  86, 44, 39,  71, 34, 29,  57, 23, 18,  41,  8,  2,  18,  0,  0,   0,  0,  0,

+    128, 70, 55, 114, 62, 46, 100, 54, 39,  86, 44, 30,  71, 34, 20,  57, 23,  7,  41,  9,  0,  18,  0,  0,   0,  0,  0,

+    124, 41, 145, 111, 32, 128,  99, 23, 114,  86, 10, 100,  73,  0, 85,  60,  0, 71,  43,  0, 54,  17,  0, 32,   0,  0,  0,

+    126, 42, 131, 113, 33, 117, 100, 25, 104,  86, 14, 90,  73,  0, 77,  60,  0, 63,  44,  0, 47,  18,  0, 25,   0,  0,  0,

+    127, 43, 120, 113, 34, 106, 101, 26, 95,  86, 17, 82,  73,  2, 69,  59,  0, 56,  43,  0, 41,  18,  0, 19,   0,  0,  0,

+    127, 45, 109, 113, 37, 97, 101, 28, 85,  86, 19, 74,  73,  5, 61,  59,  0, 48,  43,  0, 34,  19,  0, 11,   0,  0,  0,

+    127, 46, 98, 114, 38, 86, 100, 30, 76,  87, 21, 65,  73,  9, 54,  59,  0, 41,  43,  0, 26,  18,  0,  5,   0,  0,  0,

+    127, 47, 87, 113, 39, 76, 101, 31, 67,  86, 22, 56,  72, 11, 45,  59,  0, 33,  43,  0, 19,  18,  0,  2,   0,  0,  0,

+    128, 48, 75, 114, 39, 65, 101, 33, 56,  86, 23, 46,  72, 12, 36,  58,  0, 24,  42,  0,  9,  17,  0,  0,   0,  0,  0,

+    129, 48, 63, 114, 41, 54, 102, 33, 46,  87, 24, 36,  72, 14, 26,  58,  1, 14,  42,  0,  2,  16,  0,  0,   0,  0,  0,

+    128, 48, 53, 114, 41, 44, 102, 34, 37,  87, 25, 27,  72, 15, 17,  58,  1,  3,  41,  0,  0,  15,  0,  0,   0,  0,  0,

+    0, 189, 242,   0, 169, 217,   0, 151, 194,   0, 132, 170,   0, 113, 147,   0, 94, 123,   0, 74, 99,   0, 51, 71,   0, 15, 34,

+    1, 187, 219,   1, 167, 195,   0, 150, 175,   0, 131, 153,   0, 113, 132,   0, 94, 111,   0, 74, 89,   0, 50, 63,   0, 13, 28,

+    1, 186, 198,   1, 167, 178,   0, 149, 158,   0, 130, 139,   0, 111, 119,   0, 93, 100,   0, 74, 80,   0, 50, 55,   0, 13, 22,

+    1, 185, 176,   1, 165, 159,   1, 148, 142,   0, 129, 123,   0, 111, 106,   0, 93, 89,   0, 73, 70,   0, 50, 47,   0, 13, 13,

+    1, 184, 157,   1, 164, 141,   1, 147, 125,   0, 128, 110,   0, 110, 93,   0, 92, 77,   0, 73, 60,   0, 50, 39,   0, 12,  5,

+    25, 182, 137,  25, 163, 122,  17, 146, 109,   0, 128, 96,   0, 110, 81,   0, 92, 66,   0, 73, 51,   0, 50, 30,   0, 10,  0,

+    42, 181, 114,  35, 163, 102,  30, 145, 91,  14, 127, 80,   0, 109, 67,   0, 91, 53,   0, 72, 39,   0, 50, 19,   0, 10,  0,

+    52, 181, 92,  43, 162, 83,  32, 145, 73,  19, 126, 63,   0, 108, 52,   0, 90, 40,   0, 72, 27,   0, 50,  7,   0, 10,  0,

+    57, 181, 74,  48, 162, 66,  37, 144, 57,  24, 126, 49,   7, 108, 40,   0, 90, 29,   0, 72, 15,   0, 49,  0,   0, 10,  0,

+    1, 170, 227,   1, 152, 203,   0, 136, 182,   0, 119, 159,   0, 101, 137,   0, 84, 115,   0, 65, 92,   0, 43, 66,   0,  1, 29,

+    1, 169, 206,   1, 151, 184,   1, 136, 165,   0, 118, 144,   0, 102, 125,   0, 84, 105,   0, 65, 83,   0, 43, 58,   0,  0, 22,

+    29, 168, 186,  21, 151, 167,  14, 135, 150,   4, 118, 131,   0, 101, 112,   0, 83, 94,   0, 65, 75,   0, 43, 51,   0,  0, 16,

+    41, 167, 167,  33, 150, 150,  31, 134, 134,  19, 117, 117,   4, 100, 100,   0, 83, 83,   0, 65, 65,   0, 42, 43,   0,  0,  8,

+    48, 167, 149,  41, 149, 133,  33, 133, 118,  25, 116, 103,  13, 99, 88,   0, 83, 73,   0, 65, 56,   0, 42, 35,   0,  0,  0,

+    58, 165, 130,  49, 148, 115,  42, 132, 103,  31, 115, 89,  18, 99, 75,   0, 82, 61,   0, 64, 46,   0, 42, 26,   0,  0,  0,

+    62, 164, 110,  55, 147, 97,  45, 132, 87,  35, 115, 75,  22, 98, 63,   5, 82, 50,   0, 64, 36,   0, 42, 16,   0,  0,  0,

+    69, 164, 89,  60, 147, 78,  50, 131, 70,  37, 114, 59,  26, 98, 49,  10, 81, 37,   0, 64, 24,   0, 42,  4,   0,  0,  0,

+    71, 164, 71,  63, 147, 63,  53, 131, 55,  40, 114, 47,  28, 98, 38,  13, 81, 26,   0, 64, 12,   0, 42,  0,   0,  0,  0,

+    28, 153, 214,  24, 138, 193,  23, 123, 171,  16, 107, 150,   0, 91, 130,   0, 75, 109,   0, 58, 87,   0, 35, 61,   0,  0, 25,

+    48, 153, 194,  41, 138, 174,  34, 123, 156,  27, 107, 136,  16, 91, 117,   1, 75, 98,   0, 57, 78,   0, 35, 53,   0,  0, 17,

+    55, 153, 177,  47, 137, 158,  42, 122, 142,  33, 107, 124,  22, 91, 106,   6, 75, 88,   0, 57, 70,   0, 35, 46,   0,  0,  9,

+    61, 152, 158,  53, 136, 143,  45, 122, 127,  36, 106, 111,  24, 90, 94,  10, 74, 78,   0, 57, 61,   0, 35, 39,   0,  0,  2,

+    67, 151, 141,  59, 135, 126,  49, 121, 112,  39, 105, 98,  29, 90, 83,  14, 74, 68,   0, 57, 52,   0, 35, 31,   0,  0,  0,

+    71, 150, 123,  62, 135, 110,  54, 120, 98,  42, 105, 84,  31, 89, 71,  16, 74, 58,   0, 57, 43,   0, 35, 22,   0,  0,  0,

+    74, 150, 105,  64, 134, 92,  55, 120, 83,  45, 104, 71,  34, 89, 59,  20, 73, 47,   0, 57, 32,   0, 35, 13,   0,  0,  0,

+    78, 149, 84,  69, 134, 75,  59, 120, 66,  47, 103, 56,  34, 88, 46,  22, 73, 34,   1, 57, 20,   0, 35,  1,   0,  0,  0,

+    80, 149, 69,  70, 133, 61,  60, 119, 53,  49, 103, 44,  36, 88, 35,  23, 73, 24,   2, 56, 10,   0, 35,  0,   0,  0,  0,

+    58, 136, 200,  50, 122, 180,  45, 109, 162,  38, 94, 141,  27, 80, 121,  15, 65, 102,   0, 48, 81,   0, 26, 56,   0,  0, 19,

+    66, 136, 182,  59, 122, 163,  52, 109, 146,  42, 94, 128,  32, 80, 109,  20, 65, 91,   2, 48, 72,   0, 26, 49,   0,  0, 11,

+    70, 136, 165,  62, 122, 149,  55, 108, 133,  46, 94, 116,  35, 80, 99,  21, 65, 82,   4, 49, 64,   0, 26, 41,   0,  0,  3,

+    76, 135, 149,  66, 121, 133,  58, 108, 119,  48, 94, 103,  36, 79, 88,  23, 65, 73,   7, 49, 56,   0, 27, 34,   0,  0,  0,

+    78, 135, 133,  69, 120, 118,  60, 107, 106,  50, 93, 92,  39, 79, 77,  26, 65, 63,   8, 49, 47,   0, 27, 26,   0,  0,  0,

+    82, 134, 117,  71, 120, 104,  62, 107, 92,  51, 93, 79,  39, 78, 66,  27, 64, 53,  10, 48, 39,   0, 27, 18,   0,  0,  0,

+    84, 134, 99,  73, 119, 87,  64, 106, 77,  53, 92, 66,  42, 78, 55,  28, 64, 42,  11, 48, 29,   0, 28,  9,   0,  0,  0,

+    87, 133, 81,  76, 119, 72,  66, 106, 62,  55, 92, 52,  43, 78, 42,  29, 64, 31,  12, 48, 17,   0, 28,  0,   0,  0,  0,

+    88, 134, 67,  77, 119, 58,  68, 106, 51,  56, 92, 42,  44, 78, 32,  30, 64, 20,  12, 48,  6,   0, 28,  0,   0,  0,  0,

+    73, 120, 189,  64, 107, 168,  57, 96, 151,  47, 82, 133,  38, 69, 114,  26, 55, 95,  11, 39, 75,   0, 16, 51,   0,  0, 14,

+    78, 120, 171,  69, 107, 153,  62, 95, 137,  51, 82, 119,  40, 69, 102,  29, 55, 85,  15, 39, 66,   0, 17, 44,   0,  0,  4,

+    81, 120, 156,  71, 107, 140,  64, 95, 125,  53, 82, 109,  42, 69, 93,  31, 55, 77,  16, 39, 59,   0, 18, 37,   0,  0,  0,

+    85, 120, 141,  74, 107, 126,  65, 95, 112,  54, 82, 97,  43, 69, 82,  32, 55, 67,  17, 39, 51,   0, 19, 30,   0,  0,  0,

+    86, 119, 126,  76, 106, 112,  66, 95, 100,  56, 81, 85,  45, 69, 72,  33, 55, 59,  18, 40, 43,   0, 19, 22,   0,  0,  0,

+    89, 119, 110,  78, 106, 98,  69, 94, 87,  56, 81, 75,  46, 68, 62,  33, 55, 49,  18, 40, 35,   0, 20, 15,   0,  0,  0,

+    89, 119, 95,  80, 106, 83,  70, 94, 73,  58, 81, 63,  46, 68, 51,  34, 55, 39,  19, 40, 25,   0, 20,  4,   0,  0,  0,

+    92, 118, 78,  82, 106, 68,  70, 93, 59,  59, 81, 49,  47, 68, 39,  34, 55, 28,  19, 40, 14,   0, 20,  0,   0,  0,  0,

+    93, 118, 65,  82, 105, 55,  72, 93, 48,  60, 81, 39,  47, 68, 29,  34, 55, 18,  20, 40,  2,   0, 20,  0,   0,  0,  0,

+    83, 104, 177,  74, 93, 159,  65, 82, 142,  56, 70, 124,  45, 57, 106,  33, 44, 89,  20, 28, 70,   1,  4, 46,   0,  0,  8,

+    86, 104, 161,  78, 93, 145,  68, 82, 128,  58, 70, 112,  48, 58, 96,  35, 45, 80,  21, 29, 62,   1,  6, 40,   0,  0,  0,

+    89, 104, 147,  79, 93, 131,  69, 82, 118,  59, 70, 102,  47, 58, 87,  36, 45, 72,  23, 29, 55,   3,  7, 33,   0,  0,  0,

+    90, 104, 132,  80, 93, 119,  71, 82, 106,  60, 70, 91,  48, 58, 77,  37, 45, 62,  23, 30, 47,   4,  7, 26,   0,  0,  0,

+    92, 104, 118,  82, 93, 105,  72, 82, 93,  61, 69, 80,  50, 58, 68,  37, 45, 55,  23, 30, 39,   4,  8, 18,   0,  0,  0,

+    94, 104, 105,  82, 92, 93,  72, 82, 82,  61, 70, 70,  50, 58, 58,  38, 46, 46,  23, 31, 31,   6, 10, 11,   0,  0,  0,

+    95, 104, 90,  84, 92, 79,  74, 82, 70,  62, 70, 58,  50, 58, 48,  37, 46, 36,  23, 31, 22,   4, 11,  3,   0,  0,  0,

+    96, 103, 74,  85, 92, 65,  75, 81, 56,  63, 70, 47,  50, 58, 37,  38, 46, 25,  24, 31, 11,   3, 11,  0,   0,  0,  0,

+    97, 103, 62,  86, 92, 53,  76, 81, 45,  63, 69, 36,  51, 58, 27,  38, 46, 15,  23, 31,  0,   3, 11,  0,   0,  0,  0,

+    90, 87, 165,  81, 77, 148,  72, 67, 132,  62, 55, 116,  50, 44, 99,  39, 31, 82,  25, 14, 64,   1,  0, 42,   0,  0,  1,

+    93, 87, 150,  83, 77, 135,  74, 67, 121,  63, 56, 105,  52, 45, 90,  40, 32, 74,  25, 16, 57,   3,  0, 35,   0,  0,  0,

+    95, 87, 138,  85, 77, 123,  75, 67, 109,  63, 57, 95,  53, 45, 81,  41, 33, 66,  26, 17, 50,   4,  0, 28,   0,  0,  0,

+    95, 88, 124,  85, 77, 111,  75, 67, 99,  63, 57, 86,  53, 45, 72,  41, 33, 58,  26, 18, 43,   5,  1, 22,   0,  0,  0,

+    97, 88, 112,  87, 77, 100,  76, 68, 88,  64, 57, 76,  53, 46, 63,  41, 34, 50,  26, 19, 35,   5,  2, 14,   0,  0,  0,

+    99, 87, 99,  87, 78, 88,  76, 68, 77,  65, 57, 65,  53, 46, 54,  41, 35, 42,  27, 20, 27,   6,  2,  5,   0,  0,  0,

+    100, 87, 85,  88, 77, 75,  77, 68, 65,  65, 57, 54,  53, 46, 44,  41, 35, 32,  27, 21, 19,   5,  3,  2,   0,  0,  0,

+    100, 88, 71,  89, 77, 61,  78, 68, 53,  66, 57, 44,  53, 47, 33,  41, 35, 22,  27, 21,  7,   5,  3,  0,   0,  0,  0,

+    101, 87, 60,  90, 77, 52,  79, 68, 44,  66, 58, 34,  53, 47, 25,  41, 35, 13,  26, 22,  0,   5,  3,  0,   0,  0,  0,

+    97, 67, 155,  86, 58, 138,  77, 50, 125,  66, 39, 108,  55, 28, 92,  43, 12, 76,  29,  0, 59,   2,  0, 37,   0,  0,  0,

+    99, 67, 141,  88, 59, 127,  78, 50, 113,  68, 40, 98,  56, 29, 83,  44, 15, 68,  29,  0, 52,   3,  0, 30,   0,  0,  0,

+    100, 68, 129,  89, 59, 115,  80, 51, 103,  68, 41, 89,  56, 30, 75,  44, 16, 61,  30,  0, 45,   4,  0, 24,   0,  0,  0,

+    100, 69, 118,  90, 60, 104,  80, 51, 92,  67, 41, 79,  56, 31, 66,  44, 18, 53,  29,  2, 38,   4,  0, 18,   0,  0,  0,

+    101, 69, 104,  90, 61, 93,  79, 51, 82,  67, 42, 70,  56, 32, 59,  44, 20, 46,  29,  4, 31,   6,  0,  9,   0,  0,  0,

+    102, 69, 93,  90, 61, 83,  80, 52, 72,  68, 42, 61,  56, 33, 50,  43, 20, 38,  29,  5, 23,   7,  0,  4,   0,  0,  0,

+    102, 70, 80,  91, 61, 71,  80, 52, 61,  68, 43, 51,  56, 32, 40,  44, 21, 29,  30,  6, 14,   7,  0,  0,   0,  0,  0,

+    103, 70, 68,  92, 61, 58,  81, 53, 50,  69, 43, 41,  56, 34, 31,  43, 22, 19,  29,  7,  3,   7,  0,  0,   0,  0,  0,

+    104, 70, 57,  92, 61, 48,  82, 53, 40,  69, 43, 32,  56, 34, 22,  43, 23, 10,  29,  8,  0,   6,  0,  0,   0,  0,  0,

+    101, 45, 145,  91, 35, 129,  80, 26, 116,  69, 15, 101,  59,  0, 86,  46,  0, 71,  31,  0, 55,   0,  0, 33,   0,  0,  0,

+    104, 44, 132,  92, 36, 118,  82, 28, 105,  71, 17, 91,  58,  3, 77,  46,  0, 63,  31,  0, 48,   2,  0, 26,   0,  0,  0,

+    104, 46, 121,  93, 37, 107,  82, 30, 96,  70, 20, 83,  58,  6, 70,  46,  0, 57,  32,  0, 41,   4,  0, 20,   0,  0,  0,

+    104, 48, 110,  93, 40, 98,  82, 31, 87,  70, 22, 74,  59,  9, 62,  45,  0, 49,  31,  0, 35,   6,  0, 13,   0,  0,  0,

+    104, 48, 99,  92, 41, 88,  82, 32, 77,  70, 23, 65,  58, 11, 54,  46,  0, 42,  32,  0, 27,   7,  0,  5,   0,  0,  0,

+    105, 50, 88,  93, 41, 77,  82, 34, 68,  71, 24, 57,  58, 13, 46,  45,  1, 35,  31,  0, 21,   7,  0,  2,   0,  0,  0,

+    105, 50, 76,  94, 41, 66,  83, 34, 57,  71, 25, 47,  58, 15, 37,  45,  2, 25,  32,  0, 11,   7,  0,  0,   0,  0,  0,

+    106, 50, 64,  94, 42, 55,  83, 35, 47,  71, 26, 38,  58, 16, 27,  45,  4, 17,  31,  0,  4,   7,  0,  0,   0,  0,  0,

+    106, 51, 54,  95, 42, 45,  83, 35, 38,  71, 27, 30,  58, 16, 19,  45,  5,  7,  30,  0,  0,   6,  0,  0,   0,  0,  0,

+    0, 181, 240,   0, 162, 216,   0, 144, 193,   0, 126, 168,   0, 109, 146,   0, 91, 123,   0, 71, 98,   0, 48, 71,   0,  9, 34,

+    0, 179, 218,   0, 161, 195,   0, 144, 174,   0, 126, 153,   0, 108, 132,   0, 90, 110,   0, 71, 88,   0, 48, 63,   0,  8, 29,

+    0, 178, 197,   0, 159, 177,   0, 143, 159,   0, 125, 139,   0, 107, 119,   0, 90, 99,   0, 71, 79,   0, 48, 55,   0,  8, 22,

+    0, 177, 177,   0, 158, 158,   0, 142, 141,   0, 124, 123,   0, 107, 106,   0, 89, 88,   0, 71, 70,   0, 48, 47,   0,  8, 14,

+    0, 176, 157,   0, 158, 141,   0, 141, 126,   0, 123, 109,   0, 106, 93,   0, 89, 78,   0, 70, 60,   0, 47, 39,   0,  7,  5,

+    0, 175, 138,   0, 157, 123,   0, 141, 110,   0, 123, 96,   0, 105, 81,   0, 88, 67,   0, 70, 51,   0, 48, 30,   0,  6,  0,

+    0, 173, 115,   0, 155, 104,   0, 140, 92,   0, 122, 80,   0, 105, 67,   0, 88, 55,   0, 69, 40,   0, 47, 20,   0,  6,  0,

+    0, 173, 94,   0, 155, 85,   0, 139, 75,   0, 121, 64,   0, 104, 53,   0, 88, 42,   0, 70, 28,   0, 47,  9,   0,  6,  0,

+    0, 173, 76,   0, 155, 70,   0, 138, 61,   0, 122, 53,   0, 104, 44,   0, 87, 32,   0, 69, 18,   0, 47,  0,   0,  6,  0,

+    0, 164, 226,   0, 147, 203,   0, 131, 181,   0, 114, 158,   0, 97, 136,   0, 80, 115,   0, 63, 92,   0, 40, 65,   0,  0, 30,

+    0, 162, 205,   0, 145, 184,   0, 130, 164,   0, 114, 143,   0, 97, 124,   0, 81, 104,   0, 63, 83,   0, 40, 58,   0,  0, 23,

+    0, 162, 187,   0, 145, 167,   0, 130, 150,   0, 113, 131,   0, 96, 112,   0, 80, 93,   0, 62, 74,   0, 40, 50,   0,  0, 16,

+    0, 160, 167,   0, 144, 150,   0, 129, 134,   0, 112, 116,   0, 96, 100,   0, 80, 82,   0, 62, 65,   0, 40, 43,   0,  0,  7,

+    0, 160, 148,   0, 143, 133,   0, 128, 118,   0, 111, 103,   0, 96, 88,   0, 80, 73,   0, 62, 56,   0, 40, 35,   0,  0,  0,

+    0, 158, 130,   0, 142, 117,   0, 127, 104,   0, 111, 89,   0, 95, 76,   0, 79, 62,   0, 62, 46,   0, 40, 26,   0,  0,  0,

+    0, 158, 111,   0, 141, 99,   0, 127, 88,   0, 111, 76,   0, 95, 63,   0, 79, 51,   0, 62, 37,   0, 40, 18,   0,  0,  0,

+    0, 158, 91,   0, 141, 81,   0, 126, 72,   0, 110, 62,   0, 94, 50,   0, 79, 39,   0, 62, 25,   0, 40,  5,   0,  0,  0,

+    0, 157, 74,   0, 141, 66,   0, 126, 59,   0, 110, 49,   0, 94, 40,   0, 78, 29,   0, 61, 15,   0, 40,  0,   0,  0,  0,

+    0, 148, 214,   0, 133, 192,   0, 119, 171,   0, 103, 150,   0, 87, 129,   0, 72, 108,   0, 55, 86,   0, 32, 61,   0,  0, 25,

+    0, 147, 193,   0, 132, 173,   0, 118, 155,   0, 103, 136,   0, 87, 116,   0, 72, 98,   0, 55, 78,   0, 32, 53,   0,  0, 17,

+    0, 147, 176,   0, 132, 158,   0, 118, 142,   0, 102, 124,   0, 87, 106,   0, 72, 88,   0, 55, 69,   0, 33, 46,   0,  0,  9,

+    0, 146, 159,   0, 131, 142,   0, 117, 127,   0, 102, 111,   0, 87, 95,   0, 71, 79,   0, 55, 61,   0, 33, 39,   0,  0,  2,

+    0, 145, 140,   0, 130, 126,   0, 117, 112,   0, 101, 98,   0, 86, 83,   0, 71, 68,   0, 55, 52,   0, 33, 31,   0,  0,  0,

+    0, 144, 124,   0, 130, 111,   0, 116, 99,   0, 101, 84,   0, 86, 72,   0, 71, 59,   0, 55, 43,   0, 33, 23,   0,  0,  0,

+    0, 144, 106,   0, 129, 94,   0, 115, 83,   0, 101, 72,   0, 85, 60,   0, 71, 48,   0, 55, 34,   0, 33, 14,   0,  0,  0,

+    3, 143, 86,   0, 129, 77,   0, 115, 68,   0, 100, 58,   0, 85, 48,   0, 70, 36,   0, 54, 22,   0, 33,  3,   0,  0,  0,

+    18, 143, 72,  13, 128, 63,   0, 115, 57,   0, 100, 47,   0, 85, 37,   0, 70, 26,   0, 54, 13,   0, 33,  0,   0,  0,  0,

+    0, 132, 200,   0, 118, 179,   0, 105, 161,   0, 91, 140,   0, 76, 121,   0, 62, 101,   0, 46, 81,   0, 24, 56,   0,  0, 19,

+    0, 131, 182,   0, 118, 163,   0, 105, 146,   0, 91, 128,   0, 77, 110,   0, 62, 91,   0, 46, 72,   0, 25, 48,   0,  0, 11,

+    0, 131, 165,   0, 117, 149,   0, 104, 133,   0, 91, 116,   0, 77, 99,   0, 62, 82,   0, 46, 64,   0, 25, 41,   0,  0,  4,

+    0, 131, 149,   0, 116, 134,   0, 104, 119,   0, 91, 104,   0, 77, 89,   0, 62, 73,   0, 46, 56,   0, 25, 34,   0,  0,  0,

+    10, 130, 133,   2, 116, 119,   0, 104, 106,   0, 90, 91,   0, 76, 78,   0, 62, 64,   0, 46, 48,   0, 26, 27,   0,  0,  0,

+    23, 130, 118,  20, 116, 104,  13, 103, 93,   3, 89, 79,   0, 76, 67,   0, 62, 54,   0, 46, 39,   0, 26, 19,   0,  0,  0,

+    33, 129, 101,  27, 115, 89,  19, 103, 79,   9, 89, 67,   0, 75, 56,   0, 61, 43,   0, 46, 29,   0, 26, 10,   0,  0,  0,

+    41, 128, 83,  35, 115, 73,  27, 102, 64,  15, 89, 55,   0, 76, 45,   0, 62, 33,   0, 46, 18,   0, 26,  0,   0,  0,  0,

+    43, 129, 69,  38, 115, 61,  30, 102, 54,  17, 89, 45,   2, 75, 34,   0, 61, 23,   0, 46,  9,   0, 26,  0,   0,  0,  0,

+    1, 116, 188,   1, 104, 168,   0, 92, 151,   0, 79, 132,   0, 66, 113,   0, 52, 94,   0, 36, 75,   0, 14, 52,   0,  0, 14,

+    17, 116, 171,  16, 104, 153,  14, 92, 137,   8, 79, 119,   0, 67, 102,   0, 53, 85,   0, 37, 67,   0, 16, 44,   0,  0,  4,

+    31, 116, 155,  27, 104, 140,  21, 92, 125,  13, 79, 109,   3, 66, 93,   0, 53, 77,   0, 37, 59,   0, 16, 38,   0,  0,  0,

+    37, 115, 141,  30, 103, 126,  26, 92, 112,  16, 79, 98,   5, 66, 83,   0, 53, 67,   0, 38, 51,   0, 17, 31,   0,  0,  0,

+    41, 115, 126,  37, 103, 112,  31, 92, 100,  22, 79, 86,  10, 66, 72,   0, 53, 59,   0, 38, 44,   0, 17, 23,   0,  0,  0,

+    48, 115, 111,  41, 102, 99,  34, 91, 88,  24, 78, 76,  14, 66, 63,   0, 53, 50,   0, 38, 36,   0, 18, 15,   0,  0,  0,

+    51, 115, 95,  46, 102, 85,  37, 91, 74,  26, 78, 63,  16, 66, 52,   0, 53, 40,   0, 38, 26,   0, 18,  5,   0,  0,  0,

+    55, 114, 80,  47, 102, 69,  40, 90, 60,  30, 78, 51,  19, 66, 41,   3, 53, 29,   0, 38, 15,   0, 17,  0,   0,  0,  0,

+    56, 114, 66,  50, 102, 58,  40, 91, 50,  32, 78, 41,  18, 66, 32,   4, 53, 21,   0, 38,  5,   0, 17,  0,   0,  0,  0,

+    39, 102, 178,  37, 90, 159,  30, 79, 142,  21, 68, 124,  14, 55, 106,   0, 42, 89,   0, 26, 70,   0,  4, 46,   0,  0,  8,

+    48, 102, 161,  42, 90, 145,  35, 79, 128,  26, 68, 112,  19, 55, 96,   3, 43, 79,   0, 27, 62,   0,  6, 40,   0,  0,  0,

+    50, 102, 147,  44, 90, 132,  37, 79, 118,  30, 68, 102,  20, 56, 87,   7, 43, 72,   0, 28, 55,   0,  6, 34,   0,  0,  0,

+    53, 101, 133,  47, 90, 118,  41, 79, 106,  32, 68, 91,  21, 56, 78,   9, 43, 63,   0, 28, 47,   0,  6, 26,   0,  0,  0,

+    57, 101, 119,  50, 89, 106,  42, 79, 94,  34, 67, 81,  24, 56, 68,   9, 44, 55,   0, 29, 40,   0,  6, 19,   0,  0,  0,

+    60, 100, 105,  50, 90, 94,  45, 80, 83,  36, 68, 71,  24, 56, 59,  11, 44, 46,   0, 29, 32,   0,  7, 12,   0,  0,  0,

+    63, 101, 91,  55, 90, 80,  46, 79, 70,  37, 68, 59,  26, 56, 49,  12, 44, 37,   1, 29, 23,   0,  7,  3,   0,  0,  0,

+    64, 101, 75,  56, 89, 67,  48, 79, 57,  37, 68, 48,  27, 56, 37,  15, 44, 26,   0, 29, 12,   0,  7,  0,   0,  0,  0,

+    66, 101, 64,  58, 89, 55,  49, 79, 47,  39, 68, 38,  27, 56, 29,  14, 44, 18,   1, 30,  2,   0,  7,  0,   0,  0,  0,

+    57, 86, 165,  51, 75, 148,  45, 65, 133,  38, 54, 116,  28, 43, 100,  16, 29, 83,   0, 13, 64,   0,  0, 42,   0,  0,  3,

+    60, 86, 151,  55, 75, 135,  47, 66, 121,  39, 55, 105,  30, 44, 90,  18, 31, 74,   3, 16, 57,   0,  1, 35,   0,  0,  0,

+    62, 86, 139,  56, 75, 123,  49, 66, 110,  40, 55, 95,  30, 44, 81,  19, 31, 66,   4, 17, 51,   0,  1, 29,   0,  0,  0,

+    65, 86, 125,  56, 76, 112,  49, 66, 99,  39, 55, 86,  31, 44, 72,  19, 32, 59,   5, 18, 44,   0,  1, 23,   0,  0,  0,

+    67, 86, 113,  58, 75, 100,  51, 66, 88,  41, 56, 77,  31, 45, 64,  20, 32, 51,   6, 18, 35,   0,  1, 14,   0,  0,  0,

+    69, 86, 99,  61, 76, 88,  52, 66, 78,  43, 56, 66,  32, 45, 55,  20, 33, 42,   7, 19, 27,   0,  1,  6,   0,  0,  0,

+    69, 86, 86,  61, 76, 75,  53, 67, 66,  43, 56, 55,  33, 45, 45,  21, 34, 34,   8, 20, 20,   0,  2,  2,   0,  0,  0,

+    71, 86, 72,  63, 75, 62,  54, 66, 55,  45, 56, 45,  33, 45, 35,  22, 34, 23,   7, 20,  8,   0,  2,  0,   0,  0,  0,

+    71, 86, 62,  64, 75, 53,  55, 66, 46,  45, 56, 36,  33, 46, 27,  22, 34, 15,   8, 20,  0,   0,  2,  0,   0,  0,  0,

+    69, 67, 156,  61, 58, 140,  53, 50, 125,  45, 39, 108,  35, 28, 93,  25, 12, 77,  12,  0, 59,   0,  0, 37,   0,  0,  0,

+    71, 68, 142,  63, 59, 126,  56, 50, 114,  47, 40, 98,  37, 28, 84,  26, 15, 68,  12,  0, 53,   0,  0, 30,   0,  0,  0,

+    72, 68, 130,  63, 59, 116,  56, 50, 104,  47, 40, 90,  38, 30, 75,  27, 16, 61,  13,  0, 46,   0,  0, 24,   0,  0,  0,

+    73, 69, 118,  65, 59, 105,  57, 51, 92,  47, 41, 80,  37, 30, 67,  26, 18, 53,  14,  1, 39,   0,  0, 18,   0,  0,  0,

+    74, 69, 106,  65, 60, 93,  57, 51, 82,  48, 41, 70,  38, 31, 59,  26, 19, 46,  13,  2, 32,   0,  0, 10,   0,  0,  0,

+    76, 69, 95,  66, 61, 84,  58, 52, 73,  48, 42, 61,  37, 32, 50,  26, 20, 38,  14,  4, 24,   0,  0,  4,   0,  0,  0,

+    76, 69, 81,  68, 60, 72,  58, 52, 62,  48, 42, 51,  38, 32, 41,  27, 21, 30,  14,  4, 16,   0,  0,  1,   0,  0,  0,

+    76, 69, 68,  68, 61, 60,  60, 52, 51,  49, 43, 41,  38, 33, 32,  27, 21, 20,  14,  5,  5,   0,  0,  0,   0,  0,  0,

+    78, 70, 59,  69, 61, 50,  60, 52, 42,  49, 43, 34,  39, 33, 24,  27, 22, 13,  14,  7,  1,   0,  0,  0,   0,  0,  0,

+    75, 46, 146,  68, 38, 131,  60, 30, 117,  50, 19, 102,  41,  4, 87,  29,  0, 72,  13,  0, 55,   0,  0, 33,   0,  0,  0,

+    78, 47, 132,  70, 39, 119,  61, 30, 105,  53, 20, 92,  42,  5, 78,  30,  0, 64,  13,  0, 49,   0,  0, 27,   0,  0,  0,

+    79, 48, 122,  70, 40, 108,  62, 32, 96,  52, 22, 84,  42,  9, 71,  30,  0, 58,  14,  0, 42,   0,  0, 20,   0,  0,  0,

+    79, 50, 111,  70, 42, 99,  62, 33, 88,  52, 23, 74,  41, 11, 63,  29,  0, 50,  14,  0, 36,   0,  0, 14,   0,  0,  0,

+    80, 50, 99,  70, 42, 89,  61, 34, 78,  52, 25, 67,  41, 14, 55,  30,  0, 42,  15,  0, 28,   0,  0,  6,   0,  0,  0,

+    81, 51, 89,  71, 43, 78,  62, 35, 69,  52, 25, 58,  42, 15, 47,  30,  3, 36,  15,  0, 22,   0,  0,  3,   0,  0,  0,

+    81, 51, 77,  71, 44, 68,  63, 36, 59,  53, 26, 49,  41, 16, 38,  31,  4, 27,  16,  0, 12,   0,  0,  0,   0,  0,  0,

+    81, 52, 65,  72, 43, 56,  63, 36, 48,  53, 27, 39,  41, 17, 29,  30,  4, 18,  14,  0,  3,   0,  0,  0,   0,  0,  0,

+    81, 52, 55,  73, 44, 47,  64, 36, 39,  53, 28, 32,  42, 18, 21,  31,  6,  9,  14,  0,  0,   0,  0,  0,   0,  0,  0,

+    0, 174, 239,   0, 156, 214,   0, 139, 192,   0, 121, 168,   0, 105, 145,   0, 87, 123,   0, 68, 98,   0, 46, 70,   0,  3, 35,

+    0, 172, 217,   0, 155, 194,   0, 139, 173,   0, 121, 152,   0, 104, 130,   0, 87, 110,   0, 69, 88,   0, 46, 63,   0,  4, 28,

+    0, 171, 197,   0, 153, 175,   0, 138, 158,   0, 121, 139,   0, 103, 118,   0, 86, 100,   0, 68, 79,   0, 46, 55,   0,  4, 22,

+    0, 170, 177,   0, 152, 158,   0, 136, 141,   0, 119, 124,   0, 103, 106,   0, 86, 88,   0, 68, 70,   0, 45, 47,   0,  3, 14,

+    0, 169, 157,   0, 152, 141,   0, 136, 126,   0, 119, 109,   0, 102, 94,   0, 86, 78,   0, 68, 60,   0, 46, 39,   0,  3,  5,

+    0, 167, 138,   0, 150, 124,   0, 135, 111,   0, 118, 97,   0, 102, 82,   0, 85, 68,   0, 68, 52,   0, 46, 31,   0,  3,  0,

+    0, 167, 118,   0, 150, 104,   0, 135, 94,   0, 118, 81,   0, 101, 69,   0, 84, 56,   0, 67, 41,   0, 45, 21,   0,  3,  0,

+    0, 166, 97,   0, 149, 87,   0, 134, 77,   0, 117, 67,   0, 101, 56,   0, 85, 44,   0, 67, 30,   0, 45, 10,   0,  3,  0,

+    0, 165, 79,   0, 149, 73,   0, 133, 64,   0, 117, 56,   0, 101, 46,   0, 85, 34,   0, 68, 21,   0, 46,  1,   0,  3,  0,

+    0, 158, 225,   0, 141, 201,   0, 126, 180,   0, 109, 158,   0, 94, 136,   0, 78, 114,   0, 60, 91,   0, 38, 66,   0,  0, 30,

+    0, 156, 203,   0, 140, 183,   0, 125, 164,   0, 109, 143,   0, 94, 124,   0, 78, 104,   0, 61, 83,   0, 38, 57,   0,  0, 23,

+    0, 156, 186,   0, 140, 166,   0, 125, 150,   0, 109, 130,   0, 93, 111,   0, 77, 93,   0, 60, 74,   0, 38, 50,   0,  0, 17,

+    0, 155, 167,   0, 138, 149,   0, 124, 134,   0, 109, 117,   0, 93, 100,   0, 76, 83,   0, 60, 65,   0, 38, 43,   0,  0,  9,

+    0, 153, 147,   0, 138, 134,   0, 124, 120,   0, 107, 103,   0, 92, 88,   0, 77, 73,   0, 60, 56,   0, 38, 35,   0,  0,  0,

+    0, 153, 131,   0, 137, 118,   0, 122, 105,   0, 107, 90,   0, 91, 76,   0, 76, 63,   0, 60, 47,   0, 39, 28,   0,  0,  0,

+    0, 153, 111,   0, 136, 100,   0, 123, 90,   0, 107, 77,   0, 92, 65,   0, 76, 52,   0, 60, 37,   0, 38, 18,   0,  0,  0,

+    0, 152, 93,   0, 136, 82,   0, 122, 74,   0, 106, 63,   0, 91, 52,   0, 76, 40,   0, 59, 26,   0, 38,  6,   0,  0,  0,

+    0, 151, 78,   0, 136, 69,   0, 121, 61,   0, 106, 52,   0, 91, 43,   0, 76, 32,   0, 59, 17,   0, 38,  0,   0,  0,  0,

+    0, 143, 213,   0, 128, 191,   0, 115, 171,   0, 100, 149,   0, 84, 128,   0, 69, 108,   0, 52, 86,   0, 30, 61,   0,  0, 25,

+    0, 142, 193,   0, 127, 173,   0, 114, 154,   0, 99, 134,   0, 84, 116,   0, 69, 98,   0, 52, 77,   0, 31, 53,   0,  0, 18,

+    0, 141, 176,   0, 127, 158,   0, 114, 141,   0, 98, 122,   0, 84, 105,   0, 69, 88,   0, 53, 69,   0, 31, 46,   0,  0,  9,

+    0, 141, 159,   0, 126, 142,   0, 113, 127,   0, 98, 110,   0, 83, 95,   0, 69, 78,   0, 53, 60,   0, 32, 39,   0,  0,  2,

+    0, 140, 140,   0, 126, 126,   0, 112, 112,   0, 98, 98,   0, 83, 83,   0, 68, 69,   0, 52, 52,   0, 31, 31,   0,  0,  0,

+    0, 140, 124,   0, 125, 112,   0, 112, 100,   0, 97, 86,   0, 83, 72,   0, 68, 59,   0, 52, 44,   0, 31, 23,   0,  0,  0,

+    0, 139, 106,   0, 125, 96,   0, 111, 85,   0, 97, 72,   0, 83, 62,   0, 68, 49,   0, 52, 35,   0, 31, 15,   0,  0,  0,

+    0, 138, 88,   0, 124, 79,   0, 111, 70,   0, 96, 59,   0, 82, 48,   0, 68, 38,   0, 52, 24,   0, 31,  4,   0,  0,  0,

+    0, 139, 76,   0, 124, 66,   0, 111, 58,   0, 96, 50,   0, 82, 40,   0, 68, 29,   0, 52, 15,   0, 31,  0,   0,  0,  0,

+    0, 129, 200,   0, 114, 179,   0, 102, 160,   0, 87, 139,   0, 74, 120,   0, 60, 101,   0, 44, 81,   0, 22, 56,   0,  0, 19,

+    0, 127, 181,   0, 114, 163,   0, 102, 146,   0, 88, 127,   0, 74, 109,   0, 60, 91,   0, 44, 72,   0, 23, 48,   0,  0, 11,

+    0, 127, 166,   0, 113, 148,   0, 101, 133,   0, 87, 115,   0, 74, 99,   0, 60, 82,   0, 44, 64,   0, 23, 42,   0,  0,  4,

+    0, 127, 150,   0, 113, 134,   0, 101, 119,   0, 87, 104,   0, 74, 89,   0, 60, 73,   0, 44, 56,   0, 23, 35,   0,  0,  0,

+    0, 125, 134,   0, 112, 118,   0, 100, 106,   0, 87, 92,   0, 73, 78,   0, 60, 64,   0, 44, 48,   0, 23, 27,   0,  0,  0,

+    0, 125, 118,   0, 112, 105,   0, 100, 94,   0, 86, 80,   0, 73, 68,   0, 60, 54,   0, 44, 39,   0, 23, 20,   0,  0,  0,

+    0, 125, 101,   0, 111, 90,   0, 99, 80,   0, 86, 69,   0, 73, 58,   0, 59, 45,   0, 44, 30,   0, 23, 11,   0,  0,  0,

+    0, 124, 85,   0, 111, 75,   0, 99, 66,   0, 86, 56,   0, 73, 45,   0, 59, 34,   0, 44, 20,   0, 23,  1,   0,  0,  0,

+    0, 125, 72,   0, 111, 62,   0, 99, 56,   0, 86, 46,   0, 73, 36,   0, 60, 26,   0, 44, 12,   0, 23,  0,   0,  0,  0,

+    0, 114, 188,   0, 101, 167,   0, 89, 150,   0, 77, 131,   0, 64, 113,   0, 50, 95,   0, 34, 75,   0, 12, 52,   0,  0, 14,

+    0, 113, 170,   0, 101, 153,   0, 89, 137,   0, 77, 120,   0, 64, 102,   0, 50, 85,   0, 35, 67,   0, 12, 44,   0,  0,  4,

+    0, 113, 156,   0, 100, 139,   0, 89, 125,   0, 77, 109,   0, 64, 92,   0, 51, 77,   0, 35, 60,   0, 12, 38,   0,  0,  0,

+    0, 112, 141,   0, 100, 126,   0, 89, 113,   0, 77, 98,   0, 64, 83,   0, 51, 68,   0, 35, 51,   0, 12, 30,   0,  0,  0,

+    0, 112, 127,   0, 100, 112,   0, 89, 100,   0, 76, 87,   0, 64, 74,   0, 51, 59,   0, 35, 44,   0, 13, 24,   0,  0,  0,

+    0, 112, 111,   0, 100, 100,   0, 88, 88,   0, 76, 76,   0, 64, 64,   0, 51, 52,   0, 36, 37,   0, 13, 17,   0,  0,  0,

+    0, 111, 96,   0, 99, 85,   0, 88, 76,   0, 76, 64,   0, 64, 53,   0, 51, 41,   0, 36, 27,   0, 13,  6,   0,  0,  0,

+    0, 111, 81,   0, 99, 71,   0, 88, 62,   0, 76, 52,   0, 64, 43,   0, 51, 31,   0, 36, 17,   0, 13,  0,   0,  0,  0,

+    0, 111, 69,   0, 99, 60,   0, 88, 52,   0, 75, 43,   0, 63, 34,   0, 51, 21,   0, 36,  7,   0, 13,  0,   0,  0,  0,

+    0, 99, 177,   0, 88, 158,   0, 77, 141,   0, 66, 123,   0, 53, 106,   0, 40, 89,   0, 25, 71,   0,  5, 47,   0,  0,  8,

+    0, 99, 160,   0, 88, 144,   0, 77, 129,   0, 66, 112,   0, 54, 97,   0, 41, 80,   0, 26, 62,   0,  5, 40,   0,  0,  0,

+    0, 99, 147,   0, 87, 132,   0, 78, 117,   0, 66, 102,   0, 54, 87,   0, 42, 72,   0, 26, 55,   0,  5, 34,   0,  0,  0,

+    0, 99, 134,   0, 88, 119,   0, 77, 107,   0, 66, 92,   0, 54, 78,   0, 42, 64,   0, 27, 48,   0,  5, 27,   0,  0,  0,

+    0, 99, 120,   0, 87, 107,   0, 78, 94,   0, 66, 81,   0, 54, 68,   0, 42, 55,   0, 27, 40,   0,  6, 20,   0,  0,  0,

+    0, 98, 105,   0, 87, 94,   0, 77, 84,   0, 65, 71,   0, 55, 59,   0, 42, 47,   0, 28, 33,   0,  6, 12,   0,  0,  0,

+    0, 98, 93,   0, 87, 81,   0, 77, 72,   0, 66, 61,   0, 54, 49,   0, 42, 37,   0, 28, 24,   0,  6,  4,   0,  0,  0,

+    0, 98, 77,   0, 87, 68,   0, 77, 59,   0, 65, 49,   0, 54, 39,   0, 42, 27,   0, 29, 14,   0,  6,  0,   0,  0,  0,

+    1, 98, 65,   7, 87, 56,   0, 77, 49,   0, 66, 41,   0, 54, 30,   0, 42, 19,   0, 29,  3,   0,  6,  0,   0,  0,  0,

+    0, 84, 166,   0, 74, 149,   0, 64, 134,   0, 53, 117,   0, 41, 100,   0, 28, 83,   0, 11, 64,   0,  0, 42,   0,  0,  3,

+    0, 84, 151,   0, 74, 135,   0, 64, 121,   0, 53, 105,   0, 42, 90,   0, 30, 75,   0, 14, 58,   0,  0, 36,   0,  0,  0,

+    0, 84, 138,   0, 74, 124,   1, 64, 110,   0, 54, 95,   0, 43, 81,   0, 30, 67,   0, 15, 51,   0,  1, 29,   0,  0,  0,

+    14, 84, 126,  12, 74, 112,   2, 65, 99,   0, 54, 85,   0, 44, 73,   0, 31, 59,   0, 16, 44,   0,  1, 23,   0,  0,  0,

+    16, 84, 113,  13, 74, 100,   6, 65, 89,   0, 54, 77,   0, 44, 65,   0, 31, 51,   0, 17, 36,   0,  1, 16,   0,  0,  0,

+    24, 84, 100,  18, 74, 88,  13, 65, 78,   2, 55, 68,   0, 44, 55,   0, 32, 43,   0, 18, 28,   0,  1,  6,   0,  0,  0,

+    26, 84, 87,  24, 74, 76,  17, 65, 67,   7, 54, 57,   0, 44, 46,   0, 32, 35,   0, 19, 21,   0,  2,  3,   0,  0,  0,

+    30, 84, 74,  28, 74, 64,  20, 65, 55,  12, 55, 46,   0, 44, 35,   0, 32, 24,   0, 18,  9,   0,  1,  0,   0,  0,  0,

+    32, 84, 63,  28, 74, 54,  21, 65, 47,  13, 54, 38,   0, 44, 28,   0, 32, 16,   0, 18,  1,   0,  1,  0,   0,  0,  0,

+    30, 67, 155,  20, 58, 139,  20, 49, 126,  12, 39, 110,   0, 27, 94,   0, 13, 77,   0,  0, 60,   0,  0, 37,   0,  0,  0,

+    35, 67, 142,  30, 58, 126,  23, 50, 114,  16, 40, 99,   7, 29, 85,   0, 15, 69,   0,  0, 52,   0,  0, 30,   0,  0,  0,

+    35, 68, 131,  30, 59, 116,  27, 50, 104,  18, 40, 90,   9, 29, 76,   0, 17, 62,   0,  2, 46,   0,  0, 24,   0,  0,  0,

+    37, 69, 119,  33, 59, 106,  27, 51, 94,  21, 41, 80,   9, 30, 67,   0, 18, 54,   0,  3, 39,   0,  0, 18,   0,  0,  0,

+    40, 69, 107,  36, 59, 94,  28, 51, 84,  18, 41, 72,  10, 31, 60,   0, 19, 47,   0,  4, 32,   0,  0, 10,   0,  0,  0,

+    42, 69, 95,  36, 59, 84,  29, 51, 74,  19, 41, 63,  10, 31, 52,   0, 20, 39,   0,  4, 25,   0,  0,  4,   0,  0,  0,

+    43, 69, 83,  38, 60, 73,  32, 51, 62,  23, 42, 53,  11, 31, 42,   0, 20, 31,   0,  5, 17,   0,  0,  1,   0,  0,  0,

+    45, 69, 70,  39, 60, 60,  33, 51, 52,  24, 42, 43,  13, 32, 33,   0, 21, 21,   0,  5,  6,   0,  0,  0,   0,  0,  0,

+    47, 69, 59,  41, 60, 51,  34, 51, 43,  24, 42, 35,  12, 33, 26,   1, 22, 14,   0,  5,  1,   0,  0,  0,   0,  0,  0,

+    46, 48, 146,  42, 40, 131,  36, 32, 118,  27, 22, 103,  17,  6, 88,   5,  0, 73,   0,  0, 55,   0,  0, 33,   0,  0,  0,

+    48, 48, 133,  44, 40, 119,  37, 32, 107,  28, 22, 93,  20,  8, 79,   7,  0, 65,   0,  0, 49,   0,  0, 27,   0,  0,  0,

+    48, 50, 123,  44, 41, 109,  37, 33, 97,  30, 23, 83,  21, 11, 71,   8,  0, 58,   0,  0, 42,   0,  0, 21,   0,  0,  0,

+    49, 51, 111,  45, 42, 99,  38, 34, 87,  29, 25, 75,  20, 13, 63,   8,  0, 51,   0,  0, 36,   0,  0, 14,   0,  0,  0,

+    52, 52, 100,  44, 43, 89,  38, 35, 79,  29, 26, 68,  19, 15, 56,  10,  1, 43,   0,  0, 28,   0,  0,  6,   0,  0,  0,

+    52, 52, 90,  47, 44, 79,  39, 36, 70,  30, 27, 59,  20, 16, 47,   9,  2, 36,   0,  0, 22,   0,  0,  2,   0,  0,  0,

+    52, 53, 78,  46, 44, 68,  39, 37, 60,  32, 27, 49,  22, 17, 39,  10,  3, 28,   0,  0, 12,   0,  0,  0,   0,  0,  0,

+    53, 53, 66,  47, 44, 57,  40, 36, 48,  32, 27, 39,  22, 18, 30,   9,  4, 18,   0,  0,  3,   0,  0,  0,   0,  0,  0,

+    54, 53, 57,  48, 45, 49,  41, 37, 41,  33, 28, 32,  22, 19, 23,  11,  6, 10,   1,  0,  0,   0,  0,  0,   0,  0,  0,

+};

+void AdobeCMYK_to_sRGB1(FX_BYTE c, FX_BYTE m, FX_BYTE y, FX_BYTE k, FX_BYTE& R, FX_BYTE& G, FX_BYTE& B)

+{

+    int fix_c = c << 8;

+    int fix_m = m << 8;

+    int fix_y = y << 8;

+    int fix_k = k << 8;

+    int c_index = (fix_c + 4096) >> 13;

+    int m_index = (fix_m + 4096) >> 13;

+    int y_index = (fix_y + 4096) >> 13;

+    int k_index = (fix_k + 4096) >> 13;

+    int pos = (c_index * 9 * 9 * 9 + m_index * 9 * 9 + y_index * 9 + k_index) * 3;

+    int fix_r = g_CMYKSamples[pos] << 8;

+    int fix_g = g_CMYKSamples[pos + 1] << 8;

+    int fix_b = g_CMYKSamples[pos + 2] << 8;

+    int c1_index = fix_c >> 13;

+    if (c1_index == c_index) {

+        c1_index = c1_index == 8 ? c1_index - 1 : c1_index + 1;

+    }

+    int m1_index = fix_m >> 13;

+    if (m1_index == m_index) {

+        m1_index = m1_index == 8 ? m1_index - 1 : m1_index + 1;

+    }

+    int y1_index = fix_y >> 13;

+    if (y1_index == y_index) {

+        y1_index = y1_index == 8 ? y1_index - 1 : y1_index + 1;

+    }

+    int k1_index = fix_k >> 13;

+    if (k1_index == k_index) {

+        k1_index = k1_index == 8 ? k1_index - 1 : k1_index + 1;

+    }

+    int c1_pos = pos + (c1_index - c_index) * 9 * 9 * 9 * 3;

+    int m1_pos = pos + (m1_index - m_index) * 9 * 9 * 3;

+    int y1_pos = pos + (y1_index - y_index) * 9 * 3;

+    int k1_pos = pos + (k1_index - k_index) * 3;

+    int c_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[c1_pos];

+    int c_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[c1_pos + 1];

+    int c_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[c1_pos + 2];

+    int m_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[m1_pos];

+    int m_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[m1_pos + 1];

+    int m_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[m1_pos + 2];

+    int y_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[y1_pos];

+    int y_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[y1_pos + 1];

+    int y_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[y1_pos + 2];

+    int k_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[k1_pos];

+    int k_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[k1_pos + 1];

+    int k_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[k1_pos + 2];

+    int c_rate = (fix_c - (c_index << 13)) * (c_index - c1_index);

+    fix_r += c_r_delta * c_rate / 32;

+    fix_g += c_g_delta * c_rate / 32;

+    fix_b += c_b_delta * c_rate / 32;

+    int m_rate = (fix_m - (m_index << 13)) * (m_index - m1_index);

+    fix_r += m_r_delta * m_rate / 32;

+    fix_g += m_g_delta * m_rate / 32;

+    fix_b += m_b_delta * m_rate / 32;

+    int y_rate = (fix_y - (y_index << 13)) * (y_index - y1_index);

+    fix_r += y_r_delta * y_rate / 32;

+    fix_g += y_g_delta * y_rate / 32;

+    fix_b += y_b_delta * y_rate / 32;

+    int k_rate = (fix_k - (k_index << 13)) * (k_index - k1_index);

+    fix_r += k_r_delta * k_rate / 32;

+    fix_g += k_g_delta * k_rate / 32;

+    fix_b += k_b_delta * k_rate / 32;

+    if (fix_r < 0) {

+        fix_r = 0;

+    }

+    if (fix_g < 0) {

+        fix_g = 0;

+    }

+    if (fix_b < 0) {

+        fix_b = 0;

+    }

+    R = fix_r >> 8;

+    G = fix_g >> 8;

+    B = fix_b >> 8;

+}

+void AdobeCMYK_to_sRGB(FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B)

+{

+    FX_BYTE c1 = FXSYS_round(c * 255);

+    FX_BYTE m1 = FXSYS_round(m * 255);

+    FX_BYTE y1 = FXSYS_round(y * 255);

+    FX_BYTE k1 = FXSYS_round(k * 255);

+    FX_BYTE r, g, b;

+    AdobeCMYK_to_sRGB1(c1, m1, y1, k1, r, g, b);

+    R = 1.0f * r / 255;

+    G = 1.0f * g / 255;

+    B = 1.0f * b / 255;

+}

diff --git a/core/src/fxcodec/codec/fx_codec_jbig.cpp b/core/src/fxcodec/codec/fx_codec_jbig.cpp
new file mode 100644
index 0000000..a644e99
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_jbig.cpp
@@ -0,0 +1,212 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxcodec/fx_codec.h"

+#include "codec_int.h"

+CCodec_Jbig2Context::CCodec_Jbig2Context()

+{

+    FXSYS_memset32(this, 0, sizeof(CCodec_Jbig2Context));

+}

+CCodec_Jbig2Module::~CCodec_Jbig2Module()

+{

+}

+void* CCodec_Jbig2Module::CreateJbig2Context()

+{

+    return FX_NEW CCodec_Jbig2Context();

+}

+void CCodec_Jbig2Module::DestroyJbig2Context(void* pJbig2Content)

+{

+    if(pJbig2Content) {

+        CJBig2_Context::DestroyContext(((CCodec_Jbig2Context*)pJbig2Content)->m_pContext);

+        delete (CCodec_Jbig2Context*)pJbig2Content;

+    }

+    pJbig2Content = NULL;

+}

+FX_BOOL CCodec_Jbig2Module::Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,

+                                   FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch)

+{

+    FXSYS_memset32(dest_buf, 0, height * dest_pitch);

+    CJBig2_Context* pContext = CJBig2_Context::CreateContext(&m_Module,

+                               (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)src_buf, src_size, JBIG2_EMBED_STREAM);

+    if (pContext == NULL) {

+        return FALSE;

+    }

+    int ret = pContext->getFirstPage(dest_buf, width, height, dest_pitch, NULL);

+    CJBig2_Context::DestroyContext(pContext);

+    if (ret != JBIG2_SUCCESS) {

+        return FALSE;

+    }

+    int dword_size = height * dest_pitch / 4;

+    FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;

+    for (int i = 0; i < dword_size; i ++) {

+        dword_buf[i] = ~dword_buf[i];

+    }

+    return TRUE;

+}

+FX_BOOL CCodec_Jbig2Module::Decode(IFX_FileRead* file_ptr,

+                                   FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf)

+{

+    CJBig2_Context* pContext = NULL;

+    CJBig2_Image* dest_image = NULL;

+    FX_DWORD src_size = (FX_DWORD)file_ptr->GetSize();

+    FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size);

+    if (src_buf == NULL) {

+        return FALSE;

+    }

+    int ret = 0;

+    if(!file_ptr->ReadBlock(src_buf, 0, src_size)) {

+        goto failed;

+    }

+    pContext = CJBig2_Context::CreateContext(&m_Module, NULL, 0, src_buf, src_size, JBIG2_FILE_STREAM);

+    if(pContext == NULL) {

+        goto failed;

+    }

+    ret = pContext->getFirstPage(&dest_image, NULL);

+    CJBig2_Context::DestroyContext(pContext);

+    if (ret != JBIG2_SUCCESS) {

+        goto failed;

+    }

+    width = (FX_DWORD)dest_image->m_nWidth;

+    height = (FX_DWORD)dest_image->m_nHeight;

+    pitch = (FX_DWORD)dest_image->m_nStride;

+    dest_buf = dest_image->m_pData;

+    dest_image->m_bNeedFree = FALSE;

+    delete dest_image;

+    FX_Free(src_buf);

+    return TRUE;

+failed:

+    if(src_buf) {

+        FX_Free(src_buf);

+    }

+    return FALSE;

+}

+FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,

+        FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause)

+{

+    if(!pJbig2Context) {

+        return FXCODEC_STATUS_ERR_PARAMS;

+    }

+    CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;

+    m_pJbig2Context->m_width = width;

+    m_pJbig2Context->m_height = height;

+    m_pJbig2Context->m_src_buf = (unsigned char *)src_buf;

+    m_pJbig2Context->m_src_size = src_size;

+    m_pJbig2Context->m_global_data = global_data;

+    m_pJbig2Context->m_global_size = global_size;

+    m_pJbig2Context->m_dest_buf = dest_buf;

+    m_pJbig2Context->m_dest_pitch = dest_pitch;

+    m_pJbig2Context->m_pPause = pPause;

+    m_pJbig2Context->m_bFileReader = FALSE;

+    FXSYS_memset32(dest_buf, 0, height * dest_pitch);

+    m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module,

+                                  (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)src_buf, src_size, JBIG2_EMBED_STREAM, pPause);

+    if(!m_pJbig2Context->m_pContext) {

+        return FXCODEC_STATUS_ERROR;

+    }

+    int ret = m_pJbig2Context->m_pContext->getFirstPage(dest_buf, width, height, dest_pitch, pPause);

+    if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_FINISH) {

+        CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);

+        m_pJbig2Context->m_pContext = NULL;

+        if (ret != JBIG2_SUCCESS) {

+            return FXCODEC_STATUS_ERROR;

+        }

+        int dword_size = height * dest_pitch / 4;

+        FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;

+        for (int i = 0; i < dword_size; i ++) {

+            dword_buf[i] = ~dword_buf[i];

+        }

+        return FXCODEC_STATUS_DECODE_FINISH;

+    }

+    return m_pJbig2Context->m_pContext->GetProcessiveStatus();

+}

+FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,

+        FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause)

+{

+    if(!pJbig2Context) {

+        return FXCODEC_STATUS_ERR_PARAMS;

+    }

+    CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;

+    m_pJbig2Context->m_bFileReader = TRUE;

+    m_pJbig2Context->m_dest_image = NULL;

+    m_pJbig2Context->m_src_size = (FX_DWORD)file_ptr->GetSize();

+    m_pJbig2Context->m_src_buf = FX_Alloc(FX_BYTE, m_pJbig2Context->m_src_size);

+    if (m_pJbig2Context->m_src_buf == NULL) {

+        return FXCODEC_STATUS_ERR_MEMORY;

+    }

+    int ret = 0;

+    if(!file_ptr->ReadBlock((void*)m_pJbig2Context->m_src_buf, 0, m_pJbig2Context->m_src_size)) {

+        goto failed;

+    }

+    m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module, NULL, 0, m_pJbig2Context->m_src_buf, m_pJbig2Context->m_src_size, JBIG2_FILE_STREAM, pPause);

+    if(m_pJbig2Context->m_pContext == NULL) {

+        goto failed;

+    }

+    ret = m_pJbig2Context->m_pContext->getFirstPage(&m_pJbig2Context->m_dest_image, pPause);

+    if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+        width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;

+        height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;

+        pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;

+        dest_buf = m_pJbig2Context->m_dest_image->m_pData;

+        m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;

+        return FXCODEC_STATUS_DECODE_TOBECONTINUE;

+    }

+    CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);

+    m_pJbig2Context->m_pContext = NULL;

+    if (ret != JBIG2_SUCCESS) {

+        goto failed;

+    }

+    width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;

+    height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;

+    pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;

+    dest_buf = m_pJbig2Context->m_dest_image->m_pData;

+    m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;

+    delete m_pJbig2Context->m_dest_image;

+    FX_Free(m_pJbig2Context->m_src_buf);

+    return FXCODEC_STATUS_DECODE_FINISH;

+failed:

+    if(m_pJbig2Context->m_src_buf) {

+        FX_Free(m_pJbig2Context->m_src_buf);

+    }

+    m_pJbig2Context->m_src_buf = NULL;

+    return FXCODEC_STATUS_ERROR;

+}

+FXCODEC_STATUS CCodec_Jbig2Module::ContinueDecode(void* pJbig2Context, IFX_Pause* pPause)

+{

+    CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;

+    int ret = m_pJbig2Context->m_pContext->Continue(pPause);

+    if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_FINISH) {

+        if(m_pJbig2Context->m_bFileReader) {

+            CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);

+            m_pJbig2Context->m_pContext = NULL;

+            if (ret != JBIG2_SUCCESS) {

+                if(m_pJbig2Context->m_src_buf) {

+                    FX_Free(m_pJbig2Context->m_src_buf);

+                }

+                m_pJbig2Context->m_src_buf = NULL;

+                return FXCODEC_STATUS_ERROR;

+            }

+            delete m_pJbig2Context->m_dest_image;

+            FX_Free(m_pJbig2Context->m_src_buf);

+            return FXCODEC_STATUS_DECODE_FINISH;

+        } else {

+            CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);

+            m_pJbig2Context->m_pContext = NULL;

+            if (ret != JBIG2_SUCCESS) {

+                return FXCODEC_STATUS_ERROR;

+            }

+            int dword_size = m_pJbig2Context->m_height * m_pJbig2Context->m_dest_pitch / 4;

+            FX_DWORD* dword_buf = (FX_DWORD*)m_pJbig2Context->m_dest_buf;

+            for (int i = 0; i < dword_size; i ++) {

+                dword_buf[i] = ~dword_buf[i];

+            }

+            return FXCODEC_STATUS_DECODE_FINISH;

+        }

+    }

+    return m_pJbig2Context->m_pContext->GetProcessiveStatus();

+}

+

+

+

diff --git a/core/src/fxcodec/codec/fx_codec_jbig_enc.cpp b/core/src/fxcodec/codec/fx_codec_jbig_enc.cpp
new file mode 100644
index 0000000..4a982e6
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_jbig_enc.cpp
@@ -0,0 +1,11 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+ICodec_Jbig2Encoder* CCodec_ModuleMgr::CreateJbig2Encoder()
+{
+    return NULL;
+}
diff --git a/core/src/fxcodec/codec/fx_codec_jpeg.cpp b/core/src/fxcodec/codec/fx_codec_jpeg.cpp
new file mode 100644
index 0000000..fc91a6c
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_jpeg.cpp
@@ -0,0 +1,735 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxcodec/fx_codec.h"

+#include "../../../include/fxge/fx_dib.h"

+#include "codec_int.h"

+extern "C" {

+    static void _JpegScanSOI(const FX_BYTE*& src_buf, FX_DWORD& src_size)

+    {

+        if (src_size == 0) {

+            return;

+        }

+        FX_DWORD offset = 0;

+        while (offset < src_size - 1) {

+            if (src_buf[offset] == 0xff && src_buf[offset + 1] == 0xd8) {

+                src_buf += offset;

+                src_size -= offset;

+                return;

+            }

+            offset ++;

+        }

+    }

+};

+extern "C" {

+#undef FAR

+#include "../../fx_jpeglib.h"

+}

+extern "C" {

+    static void _src_do_nothing(struct jpeg_decompress_struct* cinfo) {}

+};

+extern "C" {

+    static void _error_fatal(j_common_ptr cinfo)

+    {

+        longjmp(*(jmp_buf*)cinfo->client_data, -1);

+    }

+};

+extern "C" {

+    static void _src_skip_data(struct jpeg_decompress_struct* cinfo, long num)

+    {

+        if (num > (long)cinfo->src->bytes_in_buffer) {

+            _error_fatal((j_common_ptr)cinfo);

+        }

+        cinfo->src->next_input_byte += num;

+        cinfo->src->bytes_in_buffer -= num;

+    }

+};

+extern "C" {

+    static boolean _src_fill_buffer(j_decompress_ptr cinfo)

+    {

+        return 0;

+    }

+};

+extern "C" {

+    static boolean _src_resync(j_decompress_ptr cinfo, int desired)

+    {

+        return 0;

+    }

+};

+extern "C" {

+    static void _error_do_nothing(j_common_ptr cinfo) {}

+};

+extern "C" {

+    static void _error_do_nothing1(j_common_ptr cinfo, int) {}

+};

+extern "C" {

+    static void _error_do_nothing2(j_common_ptr cinfo, char*) {}

+};

+#define JPEG_MARKER_EXIF		(JPEG_APP0 + 1)

+#define	JPEG_MARKER_ICC			(JPEG_APP0 + 2)

+#define	JPEG_MARKER_AUTHORTIME	(JPEG_APP0 + 3)

+#define	JPEG_MARKER_MAXSIZE	0xFFFF

+#define	JPEG_OVERHEAD_LEN	14

+static FX_BOOL _JpegIsIccMarker(jpeg_saved_marker_ptr marker)

+{

+    if (marker->marker == JPEG_MARKER_ICC &&

+            marker->data_length >= JPEG_OVERHEAD_LEN &&

+            (FXSYS_memcmp32(marker->data, "\x49\x43\x43\x5f\x50\x52\x4f\x46\x49\x4c\x45\x00", 12) == 0)) {

+        return TRUE;

+    }

+    return FALSE;

+}

+static	FX_BOOL _JpegLoadIccProfile(j_decompress_ptr cinfo, FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)

+{

+    if(icc_buf_ptr == NULL || icc_length == NULL) {

+        return FALSE;

+    }

+    *icc_buf_ptr = NULL;

+    *icc_length = 0;

+    FX_LPBYTE icc_data_ptr = NULL;

+    FX_DWORD icc_data_len = 0;

+    FX_BYTE count_icc_marker = 0;

+    FX_BYTE num_icc_marker = 0;

+    jpeg_saved_marker_ptr marker_list[256] = {NULL};

+    for (jpeg_saved_marker_ptr cur_marker = cinfo->marker_list;

+            cur_marker != NULL;

+            cur_marker = cur_marker->next) {

+        if(_JpegIsIccMarker(cur_marker)) {

+            if(count_icc_marker == 0) {

+                num_icc_marker = cur_marker->data[13];

+            } else if(num_icc_marker != cur_marker->data[13]) {

+                return FALSE;

+            }

+            int sn = cur_marker->data[12] - 1;

+            if(sn < 0 || sn >= num_icc_marker) {

+                return FALSE;

+            }

+            if(marker_list[sn] == NULL) {

+                marker_list[sn] = cur_marker;

+            } else {

+                return FALSE;

+            }

+            count_icc_marker ++;

+            icc_data_len +=	(cur_marker->data_length - JPEG_OVERHEAD_LEN);

+        }

+    }

+    if(count_icc_marker != num_icc_marker) {

+        return FALSE;

+    }

+    if(num_icc_marker == 0) {

+        return TRUE;

+    }

+    icc_data_ptr = FX_Alloc(FX_BYTE, icc_data_len);

+    if(icc_buf_ptr == NULL)	{

+        return FALSE;

+    }

+    *icc_buf_ptr = icc_data_ptr;

+    *icc_length = icc_data_len;

+    for (int idx = 0; idx < num_icc_marker; idx++) {

+        icc_data_len = marker_list[idx]->data_length - JPEG_OVERHEAD_LEN;

+        FXSYS_memcpy32(icc_data_ptr, marker_list[idx]->data + JPEG_OVERHEAD_LEN, icc_data_len);

+        icc_data_ptr += icc_data_len;

+    }

+    return TRUE;

+}

+static	FX_BOOL _JpegEmbedIccProfile(j_compress_ptr cinfo, FX_LPCBYTE icc_buf_ptr, FX_DWORD icc_length)

+{

+    if(icc_buf_ptr == NULL || icc_length == 0) {

+        return FALSE;

+    }

+    FX_DWORD icc_segment_size = (JPEG_MARKER_MAXSIZE - 2 - JPEG_OVERHEAD_LEN);

+    FX_DWORD icc_segment_num = (icc_length / icc_segment_size) + 1;

+    if (icc_segment_num > 255)	{

+        return FALSE;

+    }

+    FX_DWORD icc_data_length = JPEG_OVERHEAD_LEN + (icc_segment_num > 1 ? icc_segment_size : icc_length);

+    FX_LPBYTE icc_data = FX_Alloc(FX_BYTE, icc_data_length);

+    if (icc_data == NULL) {

+        return FALSE;

+    }

+    FXSYS_memcpy32(icc_data, "\x49\x43\x43\x5f\x50\x52\x4f\x46\x49\x4c\x45\x00", 12);

+    icc_data[13] = (FX_BYTE)icc_segment_num;

+    for (FX_BYTE i = 0; i < (icc_segment_num - 1); i++) {

+        icc_data[12] = i + 1;

+        FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + i * icc_segment_size, icc_segment_size);

+        jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, icc_data_length);

+    }

+    icc_data[12] = (FX_BYTE)icc_segment_num;

+    FX_DWORD icc_size = (icc_segment_num - 1) * icc_segment_size;

+    FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + icc_size, icc_length - icc_size);

+    jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, JPEG_OVERHEAD_LEN + icc_length - icc_size);

+    FX_Free(icc_data);

+    return TRUE;

+}

+extern "C" {

+    static void _dest_do_nothing(j_compress_ptr cinfo) {}

+};

+extern "C" {

+    static boolean _dest_empty(j_compress_ptr cinfo)

+    {

+        return FALSE;

+    }

+};

+#define	JPEG_BLOCK_SIZE	1048576

+static void _JpegEncode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length)

+{

+    struct jpeg_compress_struct cinfo;

+    struct jpeg_error_mgr jerr;

+    jerr.error_exit = _error_do_nothing;

+    jerr.emit_message = _error_do_nothing1;

+    jerr.output_message = _error_do_nothing;

+    jerr.format_message = _error_do_nothing2;

+    jerr.reset_error_mgr = _error_do_nothing;

+    cinfo.err = &jerr;

+    jpeg_create_compress(&cinfo);

+    int Bpp = pSource->GetBPP() / 8;

+    int nComponents = Bpp >= 3 ? (pSource->IsCmykImage() ? 4 : 3) : 1;

+    int pitch = pSource->GetPitch();

+    int width = pSource->GetWidth();

+    int height = pSource->GetHeight();

+    FX_DWORD dest_buf_length = width * height * nComponents + 1024 + (icc_length ? (icc_length + 255 * 18) : 0);

+    dest_buf = FX_Alloc(FX_BYTE, dest_buf_length);

+    while (dest_buf == NULL) {

+        dest_buf_length >>= 1;

+        dest_buf = FX_Alloc(FX_BYTE, dest_buf_length);

+    }

+    FXSYS_memset32(dest_buf, 0, dest_buf_length);

+    struct jpeg_destination_mgr dest;

+    dest.init_destination = _dest_do_nothing;

+    dest.term_destination = _dest_do_nothing;

+    dest.empty_output_buffer = _dest_empty;

+    dest.next_output_byte = dest_buf;

+    dest.free_in_buffer = dest_buf_length;

+    cinfo.dest = &dest;

+    cinfo.image_width = width;

+    cinfo.image_height = height;

+    cinfo.input_components = nComponents;

+    if (nComponents == 1) {

+        cinfo.in_color_space = JCS_GRAYSCALE;

+    } else if (nComponents == 3) {

+        cinfo.in_color_space = JCS_RGB;

+    } else {

+        cinfo.in_color_space = JCS_CMYK;

+    }

+    FX_LPBYTE line_buf = NULL;

+    if (nComponents > 1) {

+        line_buf = FX_Alloc(FX_BYTE, width * nComponents);

+        if (line_buf == NULL) {

+            return;

+        }

+    }

+    jpeg_set_defaults(&cinfo);

+    if(quality != 75) {

+        jpeg_set_quality(&cinfo, quality, TRUE);

+    }

+    jpeg_start_compress(&cinfo, TRUE);

+    _JpegEmbedIccProfile(&cinfo, icc_buf, icc_length);

+    JSAMPROW row_pointer[1];

+    JDIMENSION row;

+    while (cinfo.next_scanline < cinfo.image_height) {

+        FX_LPCBYTE src_scan = pSource->GetScanline(cinfo.next_scanline);

+        if (nComponents > 1) {

+            FX_LPBYTE dest_scan = line_buf;

+            if (nComponents == 3) {

+                for (int i = 0; i < width; i ++) {

+                    dest_scan[0] = src_scan[2];

+                    dest_scan[1] = src_scan[1];

+                    dest_scan[2] = src_scan[0];

+                    dest_scan += 3;

+                    src_scan += Bpp;

+                }

+            } else {

+                for (int i = 0; i < pitch; i ++) {

+                    *dest_scan++ = ~*src_scan++;

+                }

+            }

+            row_pointer[0] = line_buf;

+        } else {

+            row_pointer[0] = (FX_LPBYTE)src_scan;

+        }

+        row = cinfo.next_scanline;

+        jpeg_write_scanlines(&cinfo, row_pointer, 1);

+        if (cinfo.next_scanline == row) {

+            dest_buf = FX_Realloc(FX_BYTE, dest_buf, dest_buf_length + JPEG_BLOCK_SIZE);

+            if (dest_buf == NULL) {

+                FX_Free(line_buf);

+                return;

+            }

+            dest.next_output_byte = dest_buf + dest_buf_length - dest.free_in_buffer;

+            dest_buf_length += JPEG_BLOCK_SIZE;

+            dest.free_in_buffer += JPEG_BLOCK_SIZE;

+        }

+    }

+    jpeg_finish_compress(&cinfo);

+    jpeg_destroy_compress(&cinfo);

+    if (line_buf) {

+        FX_Free(line_buf);

+    }

+    dest_size = dest_buf_length - (FX_STRSIZE)dest.free_in_buffer;

+}

+static FX_BOOL _JpegLoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,

+                             int& num_components, int& bits_per_components, FX_BOOL& color_transform,

+                             FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)

+{

+    _JpegScanSOI(src_buf, src_size);

+    struct jpeg_decompress_struct cinfo;

+    struct jpeg_error_mgr jerr;

+    jerr.error_exit = _error_fatal;

+    jerr.emit_message = _error_do_nothing1;

+    jerr.output_message = _error_do_nothing;

+    jerr.format_message = _error_do_nothing2;

+    jerr.reset_error_mgr = _error_do_nothing;

+    cinfo.err = &jerr;

+    jmp_buf mark;

+    cinfo.client_data = &mark;

+    if (setjmp(mark) == -1) {

+        return FALSE;

+    }

+    jpeg_create_decompress(&cinfo);

+    struct jpeg_source_mgr src;

+    src.init_source = _src_do_nothing;

+    src.term_source = _src_do_nothing;

+    src.skip_input_data = _src_skip_data;

+    src.fill_input_buffer = _src_fill_buffer;

+    src.resync_to_restart = _src_resync;

+    src.bytes_in_buffer = src_size;

+    src.next_input_byte = src_buf;

+    cinfo.src = &src;

+    if (setjmp(mark) == -1) {

+        jpeg_destroy_decompress(&cinfo);

+        return FALSE;

+    }

+    if(icc_buf_ptr && icc_length) {

+        jpeg_save_markers(&cinfo, JPEG_MARKER_ICC, JPEG_MARKER_MAXSIZE);

+    }

+    int ret = jpeg_read_header(&cinfo, TRUE);

+    if (ret != JPEG_HEADER_OK) {

+        jpeg_destroy_decompress(&cinfo);

+        return FALSE;

+    }

+    width = cinfo.image_width;

+    height = cinfo.image_height;

+    num_components = cinfo.num_components;

+    color_transform = cinfo.jpeg_color_space == JCS_YCbCr || cinfo.jpeg_color_space == JCS_YCCK;

+    bits_per_components = cinfo.data_precision;

+    if(icc_buf_ptr != NULL) {

+        *icc_buf_ptr = NULL;

+    }

+    if(icc_length != NULL) {

+        *icc_length = 0;

+    }

+    jpeg_destroy_decompress(&cinfo);

+    return TRUE;

+}

+class CCodec_JpegDecoder : public CCodec_ScanlineDecoder

+{

+public:

+    CCodec_JpegDecoder();

+    ~CCodec_JpegDecoder();

+    FX_BOOL				Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps,

+                               FX_BOOL ColorTransform, IFX_JpegProvider* pJP);

+    virtual void		Destroy()

+    {

+        delete this;

+    }

+    virtual void		v_DownScale(int dest_width, int dest_height);

+    virtual FX_BOOL		v_Rewind();

+    virtual FX_LPBYTE	v_GetNextLine();

+    virtual FX_DWORD	GetSrcOffset();

+    jmp_buf		m_JmpBuf;

+    struct jpeg_decompress_struct cinfo;

+    struct jpeg_error_mgr jerr;

+    struct jpeg_source_mgr src;

+    FX_LPCBYTE	m_SrcBuf;

+    FX_DWORD	m_SrcSize;

+    FX_LPBYTE	m_pScanlineBuf;

+    FX_BOOL		InitDecode();

+    FX_BOOL		m_bInited, m_bStarted, m_bJpegTransform;

+protected:

+    IFX_JpegProvider*	m_pExtProvider;

+    void*				m_pExtContext;

+    FX_DWORD			m_nDefaultScaleDenom;

+};

+CCodec_JpegDecoder::CCodec_JpegDecoder()

+{

+    m_pScanlineBuf = NULL;

+    m_DownScale = 1;

+    m_bStarted = FALSE;

+    m_bInited = FALSE;

+    m_pExtProvider = NULL;

+    m_pExtContext = NULL;

+    FXSYS_memset32(&cinfo, 0, sizeof(cinfo));

+    FXSYS_memset32(&jerr, 0, sizeof(jerr));

+    FXSYS_memset32(&src, 0, sizeof(src));

+    m_nDefaultScaleDenom = 1;

+}

+CCodec_JpegDecoder::~CCodec_JpegDecoder()

+{

+    if (m_pExtProvider) {

+        m_pExtProvider->DestroyDecoder(m_pExtContext);

+        return;

+    }

+    if (m_pScanlineBuf) {

+        FX_Free(m_pScanlineBuf);

+    }

+    if (m_bInited) {

+        jpeg_destroy_decompress(&cinfo);

+    }

+}

+FX_BOOL CCodec_JpegDecoder::InitDecode()

+{

+    cinfo.err = &jerr;

+    cinfo.client_data = &m_JmpBuf;

+    if (setjmp(m_JmpBuf) == -1) {

+        return FALSE;

+    }

+    jpeg_create_decompress(&cinfo);

+    m_bInited = TRUE;

+    cinfo.src = &src;

+    src.bytes_in_buffer = m_SrcSize;

+    src.next_input_byte = m_SrcBuf;

+    if (setjmp(m_JmpBuf) == -1) {

+        jpeg_destroy_decompress(&cinfo);

+        m_bInited = FALSE;

+        return FALSE;

+    }

+    cinfo.image_width = m_OrigWidth;

+    cinfo.image_height = m_OrigHeight;

+    int ret = jpeg_read_header(&cinfo, TRUE);

+    if (ret != JPEG_HEADER_OK) {

+        return FALSE;

+    }

+    if (cinfo.saw_Adobe_marker) {

+        m_bJpegTransform = TRUE;

+    }

+    if (cinfo.num_components == 3 && !m_bJpegTransform) {

+        cinfo.out_color_space = cinfo.jpeg_color_space;

+    }

+    m_OrigWidth = cinfo.image_width;

+    m_OrigHeight = cinfo.image_height;

+    m_OutputWidth = m_OrigWidth;

+    m_OutputHeight = m_OutputHeight;

+    m_nDefaultScaleDenom = cinfo.scale_denom;

+    return TRUE;

+}

+FX_BOOL CCodec_JpegDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,

+                                   int nComps, FX_BOOL ColorTransform, IFX_JpegProvider* pJP)

+{

+    if (pJP) {

+        m_pExtProvider = pJP;

+        m_pExtContext = m_pExtProvider->CreateDecoder(src_buf, src_size, width, height, nComps, ColorTransform);

+        return m_pExtContext != NULL;

+    }

+    _JpegScanSOI(src_buf, src_size);

+    m_SrcBuf = src_buf;

+    m_SrcSize = src_size;

+    jerr.error_exit = _error_fatal;

+    jerr.emit_message = _error_do_nothing1;

+    jerr.output_message = _error_do_nothing;

+    jerr.format_message = _error_do_nothing2;

+    jerr.reset_error_mgr = _error_do_nothing;

+    src.init_source = _src_do_nothing;

+    src.term_source = _src_do_nothing;

+    src.skip_input_data = _src_skip_data;

+    src.fill_input_buffer = _src_fill_buffer;

+    src.resync_to_restart = _src_resync;

+    m_bJpegTransform = ColorTransform;

+    if(src_size > 1 && FXSYS_memcmp32(src_buf + src_size - 2, "\xFF\xD9", 2) != 0) {

+        ((FX_LPBYTE)src_buf)[src_size - 2] = 0xFF;

+        ((FX_LPBYTE)src_buf)[src_size - 1] = 0xD9;

+    }

+    m_OutputWidth = m_OrigWidth = width;

+    m_OutputHeight = m_OrigHeight = height;

+    if (!InitDecode()) {

+        return FALSE;

+    }

+    if (cinfo.num_components < nComps) {

+        return FALSE;

+    }

+    if ((int)cinfo.image_width < width) {

+        return FALSE;

+    }

+    m_Pitch = (cinfo.image_width * cinfo.num_components + 3) / 4 * 4;

+    m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);

+    if (m_pScanlineBuf == NULL) {

+        return FALSE;

+    }

+    m_nComps = cinfo.num_components;

+    m_bpc = 8;

+    m_bColorTransformed = FALSE;

+    m_bStarted = FALSE;

+    return TRUE;

+}

+extern "C" {

+    FX_INT32 FX_GetDownsampleRatio(FX_INT32 originWidth, FX_INT32 originHeight, FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)

+    {

+        int iratio_w = originWidth / downsampleWidth;

+        int iratio_h = originHeight / downsampleHeight;

+        int ratio = (iratio_w > iratio_h) ? iratio_h : iratio_w;

+        if (ratio >= 8) {

+            return 8;

+        } else if (ratio >= 4) {

+            return 4;

+        } else if (ratio >= 2) {

+            return 2;

+        }

+        return 1;

+    }

+}

+void CCodec_JpegDecoder::v_DownScale(int dest_width, int dest_height)

+{

+    if (m_pExtProvider) {

+        m_pExtProvider->DownScale(m_pExtContext, dest_width, dest_height);

+        return;

+    }

+    int old_scale = m_DownScale;

+    m_DownScale = FX_GetDownsampleRatio(m_OrigWidth, m_OrigHeight, dest_width, dest_height);

+    m_OutputWidth = (m_OrigWidth + m_DownScale - 1) / m_DownScale;

+    m_OutputHeight = (m_OrigHeight + m_DownScale - 1) / m_DownScale;

+    m_Pitch = (m_OutputWidth * m_nComps + 3) / 4 * 4;

+    if (old_scale != m_DownScale) {

+        m_NextLine = -1;

+    }

+}

+FX_BOOL CCodec_JpegDecoder::v_Rewind()

+{

+    if (m_pExtProvider) {

+        return m_pExtProvider->Rewind(m_pExtContext);

+    }

+    if (m_bStarted) {

+        jpeg_destroy_decompress(&cinfo);

+        if (!InitDecode()) {

+            return FALSE;

+        }

+    }

+    if (setjmp(m_JmpBuf) == -1) {

+        return FALSE;

+    }

+    cinfo.scale_denom = m_nDefaultScaleDenom * m_DownScale;

+    m_OutputWidth = (m_OrigWidth + m_DownScale - 1) / m_DownScale;

+    m_OutputHeight = (m_OrigHeight + m_DownScale - 1) / m_DownScale;

+    if (!jpeg_start_decompress(&cinfo)) {

+        jpeg_destroy_decompress(&cinfo);

+        return FALSE;

+    }

+    if ((int)cinfo.output_width > m_OrigWidth) {

+        FXSYS_assert(FALSE);

+        return FALSE;

+    }

+    m_bStarted = TRUE;

+    return TRUE;

+}

+FX_LPBYTE CCodec_JpegDecoder::v_GetNextLine()

+{

+    if (m_pExtProvider) {

+        return m_pExtProvider->GetNextLine(m_pExtContext);

+    }

+    int nlines = jpeg_read_scanlines(&cinfo, &m_pScanlineBuf, 1);

+    if (nlines < 1) {

+        return NULL;

+    }

+    return m_pScanlineBuf;

+}

+FX_DWORD CCodec_JpegDecoder::GetSrcOffset()

+{

+    if (m_pExtProvider) {

+        return m_pExtProvider->GetSrcOffset(m_pExtContext);

+    }

+    return (FX_DWORD)(m_SrcSize - src.bytes_in_buffer);

+}

+ICodec_ScanlineDecoder*	CCodec_JpegModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,

+        int width, int height, int nComps, FX_BOOL ColorTransform)

+{

+    if (src_buf == NULL || src_size == 0) {

+        return NULL;

+    }

+    CCodec_JpegDecoder* pDecoder = FX_NEW CCodec_JpegDecoder;

+    if (pDecoder == NULL) {

+        return NULL;

+    }

+    if (!pDecoder->Create(src_buf, src_size, width, height, nComps, ColorTransform, m_pExtProvider)) {

+        delete pDecoder;

+        return NULL;

+    }

+    return pDecoder;

+}

+FX_BOOL CCodec_JpegModule::LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,

+                                    int& num_components, int& bits_per_components, FX_BOOL& color_transform,

+                                    FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)

+{

+    if (m_pExtProvider) {

+        return m_pExtProvider->LoadInfo(src_buf, src_size, width, height,

+                                        num_components, bits_per_components, color_transform,

+                                        icc_buf_ptr, icc_length);

+    }

+    return _JpegLoadInfo(src_buf, src_size, width, height, num_components, bits_per_components, color_transform, icc_buf_ptr, icc_length);

+}

+FX_BOOL CCodec_JpegModule::Encode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length)

+{

+    if (m_pExtProvider) {

+        return m_pExtProvider->Encode(pSource, dest_buf, dest_size, quality, icc_buf, icc_length);

+    }

+    if(pSource->GetBPP() < 8 || pSource->GetPalette() != NULL) {

+        ASSERT(pSource->GetBPP() >= 8 && pSource->GetPalette() == NULL);

+        return FALSE;

+    }

+    _JpegEncode(pSource, dest_buf, dest_size, quality, icc_buf, icc_length);

+    return TRUE;

+}

+struct FXJPEG_Context {

+    jmp_buf			m_JumpMark;

+    jpeg_decompress_struct m_Info;

+    jpeg_error_mgr	m_ErrMgr;

+    jpeg_source_mgr	m_SrcMgr;

+    unsigned int	m_SkipSize;

+    void*		(*m_AllocFunc)(unsigned int);

+    void		(*m_FreeFunc)(void*);

+};

+extern "C" {

+    static void _error_fatal1(j_common_ptr cinfo)

+    {

+        longjmp(((FXJPEG_Context*)cinfo->client_data)->m_JumpMark, -1);

+    }

+};

+extern "C" {

+    static void _src_skip_data1(struct jpeg_decompress_struct* cinfo, long num)

+    {

+        if (cinfo->src->bytes_in_buffer < (size_t)num) {

+            ((FXJPEG_Context*)cinfo->client_data)->m_SkipSize = (unsigned int)(num - cinfo->src->bytes_in_buffer);

+            cinfo->src->bytes_in_buffer = 0;

+        } else {

+            cinfo->src->next_input_byte += num;

+            cinfo->src->bytes_in_buffer -= num;

+        }

+    }

+};

+static void* jpeg_alloc_func(unsigned int size)

+{

+    return FX_Alloc(char, size);

+}

+static void jpeg_free_func(void* p)

+{

+    FX_Free(p);

+}

+void* CCodec_JpegModule::Start()

+{

+    if (m_pExtProvider) {

+        return m_pExtProvider->Start();

+    }

+    FXJPEG_Context* p = (FXJPEG_Context*)FX_Alloc(FX_BYTE, sizeof(FXJPEG_Context));

+    if (p == NULL) {

+        return NULL;

+    }

+    p->m_AllocFunc = jpeg_alloc_func;

+    p->m_FreeFunc = jpeg_free_func;

+    p->m_ErrMgr.error_exit = _error_fatal1;

+    p->m_ErrMgr.emit_message = _error_do_nothing1;

+    p->m_ErrMgr.output_message = _error_do_nothing;

+    p->m_ErrMgr.format_message = _error_do_nothing2;

+    p->m_ErrMgr.reset_error_mgr = _error_do_nothing;

+    p->m_SrcMgr.init_source = _src_do_nothing;

+    p->m_SrcMgr.term_source = _src_do_nothing;

+    p->m_SrcMgr.skip_input_data = _src_skip_data1;

+    p->m_SrcMgr.fill_input_buffer = _src_fill_buffer;

+    p->m_SrcMgr.resync_to_restart = _src_resync;

+    p->m_Info.client_data = p;

+    p->m_Info.err = &p->m_ErrMgr;

+    if (setjmp(p->m_JumpMark) == -1) {

+        return 0;

+    }

+    jpeg_create_decompress(&p->m_Info);

+    p->m_Info.src = &p->m_SrcMgr;

+    p->m_SkipSize = 0;

+    return p;

+}

+void CCodec_JpegModule::Finish(void* pContext)

+{

+    if (m_pExtProvider) {

+        m_pExtProvider->Finish(pContext);

+        return;

+    }

+    FXJPEG_Context* p = (FXJPEG_Context*)pContext;

+    jpeg_destroy_decompress(&p->m_Info);

+    p->m_FreeFunc(p);

+}

+void CCodec_JpegModule::Input(void* pContext, const unsigned char* src_buf, FX_DWORD src_size)

+{

+    if (m_pExtProvider) {

+        m_pExtProvider->Input(pContext, src_buf, src_size);

+        return;

+    }

+    FXJPEG_Context* p = (FXJPEG_Context*)pContext;

+    if (p->m_SkipSize) {

+        if (p->m_SkipSize > src_size) {

+            p->m_SrcMgr.bytes_in_buffer = 0;

+            p->m_SkipSize -= src_size;

+            return;

+        }

+        src_size -= p->m_SkipSize;

+        src_buf += p->m_SkipSize;

+        p->m_SkipSize = 0;

+    }

+    p->m_SrcMgr.next_input_byte = src_buf;

+    p->m_SrcMgr.bytes_in_buffer = src_size;

+}

+int CCodec_JpegModule::ReadHeader(void* pContext, int* width, int* height, int* nComps)

+{

+    if (m_pExtProvider) {

+        return m_pExtProvider->ReadHeader(pContext, width, height, nComps);

+    }

+    FXJPEG_Context* p = (FXJPEG_Context*)pContext;

+    if (setjmp(p->m_JumpMark) == -1) {

+        return 1;

+    }

+    int ret = jpeg_read_header(&p->m_Info, true);

+    if (ret == JPEG_SUSPENDED) {

+        return 2;

+    }

+    if (ret != JPEG_HEADER_OK) {

+        return 1;

+    }

+    *width = p->m_Info.image_width;

+    *height = p->m_Info.image_height;

+    *nComps = p->m_Info.num_components;

+    return 0;

+}

+FX_BOOL CCodec_JpegModule::StartScanline(void* pContext, int down_scale)

+{

+    if (m_pExtProvider) {

+        return m_pExtProvider->StartScanline(pContext, down_scale);

+    }

+    FXJPEG_Context* p = (FXJPEG_Context*)pContext;

+    if (setjmp(p->m_JumpMark) == -1) {

+        return FALSE;

+    }

+    p->m_Info.scale_denom = down_scale;

+    return jpeg_start_decompress(&p->m_Info);

+}

+FX_BOOL CCodec_JpegModule::ReadScanline(void* pContext, unsigned char* dest_buf)

+{

+    if (m_pExtProvider) {

+        return m_pExtProvider->ReadScanline(pContext, dest_buf);

+    }

+    FXJPEG_Context* p = (FXJPEG_Context*)pContext;

+    if (setjmp(p->m_JumpMark) == -1) {

+        return FALSE;

+    }

+    int nlines = jpeg_read_scanlines(&p->m_Info, &dest_buf, 1);

+    return nlines == 1;

+}

+FX_DWORD CCodec_JpegModule::GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr)

+{

+    if (m_pExtProvider) {

+        return m_pExtProvider->GetAvailInput(pContext, avail_buf_ptr);

+    }

+    if(avail_buf_ptr != NULL) {

+        *avail_buf_ptr = NULL;

+        if(((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer > 0) {

+            *avail_buf_ptr = (FX_LPBYTE)((FXJPEG_Context*)pContext)->m_SrcMgr.next_input_byte;

+        }

+    }

+    return (FX_DWORD)((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer;

+}

diff --git a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
new file mode 100644
index 0000000..423819f
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
@@ -0,0 +1,799 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxcodec/fx_codec.h"

+#include "codec_int.h"

+#include "../fx_libopenjpeg/libopenjpeg20/openjpeg.h"

+#include "../lcms2/include/fx_lcms2.h"

+static void fx_error_callback(const char *msg, void *client_data)

+{

+    (void)client_data;

+}

+static void fx_warning_callback(const char *msg, void *client_data)

+{

+    (void)client_data;

+}

+static void fx_info_callback(const char *msg, void *client_data)

+{

+    (void)client_data;

+}

+typedef struct {

+    const unsigned char* src_data;

+    int					 src_size;

+    int					 offset;

+} decodeData;

+static OPJ_SIZE_T opj_read_from_memory (void * p_buffer, OPJ_SIZE_T p_nb_bytes,  decodeData* srcData)

+{

+    if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {

+        return -1;

+    }

+    OPJ_SIZE_T readlength = p_nb_bytes;

+    OPJ_SIZE_T bufferLength = (OPJ_SIZE_T)(srcData->src_size - srcData->offset);

+    if(bufferLength <= 0) {

+        return 0;

+    }

+    if(bufferLength <= p_nb_bytes) {

+        readlength = bufferLength;

+    }

+    memcpy(p_buffer, &(srcData->src_data[srcData->offset]), readlength);

+    srcData->offset += (int)readlength;

+    return readlength;

+}

+static OPJ_SIZE_T opj_write_from_memory (void * p_buffer, OPJ_SIZE_T p_nb_bytes, decodeData* srcData)

+{

+    if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {

+        return -1;

+    }

+    OPJ_SIZE_T writeLength = p_nb_bytes;

+    OPJ_SIZE_T bufferLength = (OPJ_SIZE_T)(srcData->src_size - srcData->offset);

+    if(bufferLength <= p_nb_bytes) {

+        writeLength = bufferLength;

+    }

+    memcpy((void*&)(srcData->src_data[srcData->offset]), p_buffer, writeLength);

+    srcData->offset += (int)writeLength;

+    return writeLength;

+}

+static OPJ_OFF_T opj_skip_from_memory (OPJ_OFF_T p_nb_bytes, decodeData* srcData)

+{

+    if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {

+        return -1;

+    }

+    OPJ_OFF_T postion = srcData->offset + p_nb_bytes;

+    if(postion < 0 ) {

+        postion = 0;

+    } else if (postion > srcData->src_size) {

+    }

+    srcData->offset = (int)postion;

+    return p_nb_bytes;

+}

+static OPJ_BOOL opj_seek_from_memory (OPJ_OFF_T p_nb_bytes, decodeData * srcData)

+{

+    if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {

+        return -1;

+    }

+    srcData->offset = (int)p_nb_bytes;

+    if(srcData->offset < 0) {

+        srcData->offset = 0;

+    } else if(srcData->offset > srcData->src_size) {

+        srcData->offset = srcData->src_size;

+    }

+    return OPJ_TRUE;

+}

+opj_stream_t* fx_opj_stream_create_memory_stream (decodeData* data,	OPJ_SIZE_T p_size, 	OPJ_BOOL p_is_read_stream)

+{

+    opj_stream_t* l_stream = 00;

+    if (!data || ! data->src_data || data->src_size <= 0 ) {

+        return NULL;

+    }

+    l_stream = opj_stream_create(p_size, p_is_read_stream);

+    if (! l_stream) {

+        return NULL;

+    }

+    opj_stream_set_user_data_v3(l_stream, data, NULL);

+    opj_stream_set_user_data_length(l_stream, data->src_size);

+    opj_stream_set_read_function(l_stream, (opj_stream_read_fn) opj_read_from_memory);

+    opj_stream_set_write_function(l_stream, (opj_stream_write_fn) opj_write_from_memory);

+    opj_stream_set_skip_function(l_stream, (opj_stream_skip_fn) opj_skip_from_memory);

+    opj_stream_set_seek_function(l_stream, (opj_stream_seek_fn) opj_seek_from_memory);

+    return l_stream;

+}

+static void sycc_to_rgb(int offset, int upb, int y, int cb, int cr,

+                        int *out_r, int *out_g, int *out_b)

+{

+    int r, g, b;

+    cb -= offset;

+    cr -= offset;

+    r = y + (int)(1.402 * (float)cr);

+    if(r < 0) {

+        r = 0;

+    } else if(r > upb) {

+        r = upb;

+    } *out_r = r;

+    g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr);

+    if(g < 0) {

+        g = 0;

+    } else if(g > upb) {

+        g = upb;

+    } *out_g = g;

+    b = y + (int)(1.772 * (float)cb);

+    if(b < 0) {

+        b = 0;

+    } else if(b > upb) {

+        b = upb;

+    } *out_b = b;

+}

+static void sycc444_to_rgb(opj_image_t *img)

+{

+    int *d0, *d1, *d2, *r, *g, *b;

+    const int *y, *cb, *cr;

+    int maxw, maxh, max, i, offset, upb;

+    i = (int)img->comps[0].prec;

+    offset = 1 << (i - 1);

+    upb = (1 << i) - 1;

+    maxw = (int)img->comps[0].w;

+    maxh = (int)img->comps[0].h;

+    max = maxw * maxh;

+    y = img->comps[0].data;

+    cb = img->comps[1].data;

+    cr = img->comps[2].data;

+    d0 = r = FX_Alloc(int, (size_t)max);

+    d1 = g = FX_Alloc(int, (size_t)max);

+    d2 = b = FX_Alloc(int, (size_t)max);

+    for(i = 0; i < max; ++i) {

+        sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);

+        ++y;

+        ++cb;

+        ++cr;

+        ++r;

+        ++g;

+        ++b;

+    }

+    FX_Free(img->comps[0].data);

+    img->comps[0].data = d0;

+    FX_Free(img->comps[1].data);

+    img->comps[1].data = d1;

+    FX_Free(img->comps[2].data);

+    img->comps[2].data = d2;

+}

+static void sycc422_to_rgb(opj_image_t *img)

+{

+    int *d0, *d1, *d2, *r, *g, *b;

+    const int *y, *cb, *cr;

+    int maxw, maxh, max, offset, upb;

+    int i, j;

+    i = (int)img->comps[0].prec;

+    offset = 1 << (i - 1);

+    upb = (1 << i) - 1;

+    maxw = (int)img->comps[0].w;

+    maxh = (int)img->comps[0].h;

+    max = maxw * maxh;

+    y = img->comps[0].data;

+    cb = img->comps[1].data;

+    cr = img->comps[2].data;

+    d0 = r = FX_Alloc(int, (size_t)max);

+    d1 = g = FX_Alloc(int, (size_t)max);

+    d2 = b = FX_Alloc(int, (size_t)max);

+    for(i = 0; i < maxh; ++i) {

+        for(j = 0; j < maxw; j += 2) {

+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);

+            ++y;

+            ++r;

+            ++g;

+            ++b;

+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);

+            ++y;

+            ++r;

+            ++g;

+            ++b;

+            ++cb;

+            ++cr;

+        }

+    }

+    FX_Free(img->comps[0].data);

+    img->comps[0].data = d0;

+    FX_Free(img->comps[1].data);

+    img->comps[1].data = d1;

+    FX_Free(img->comps[2].data);

+    img->comps[2].data = d2;

+    img->comps[1].w = maxw;

+    img->comps[1].h = maxh;

+    img->comps[2].w = maxw;

+    img->comps[2].h = maxh;

+    img->comps[1].w = (OPJ_UINT32)maxw;

+    img->comps[1].h = (OPJ_UINT32)maxh;

+    img->comps[2].w = (OPJ_UINT32)maxw;

+    img->comps[2].h = (OPJ_UINT32)maxh;

+    img->comps[1].dx = img->comps[0].dx;

+    img->comps[2].dx = img->comps[0].dx;

+    img->comps[1].dy = img->comps[0].dy;

+    img->comps[2].dy = img->comps[0].dy;

+}

+static void sycc420_to_rgb(opj_image_t *img)

+{

+    int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb;

+    const int *y, *cb, *cr, *ny;

+    int maxw, maxh, max, offset, upb;

+    int i, j;

+    i = (int)img->comps[0].prec;

+    offset = 1 << (i - 1);

+    upb = (1 << i) - 1;

+    maxw = (int)img->comps[0].w;

+    maxh = (int)img->comps[0].h;

+    max = maxw * maxh;

+    y = img->comps[0].data;

+    cb = img->comps[1].data;

+    cr = img->comps[2].data;

+    d0 = r = FX_Alloc(int, (size_t)max);

+    d1 = g = FX_Alloc(int, (size_t)max);

+    d2 = b = FX_Alloc(int, (size_t)max);

+    for(i = 0; i < maxh; i += 2) {

+        ny = y + maxw;

+        nr = r + maxw;

+        ng = g + maxw;

+        nb = b + maxw;

+        for(j = 0; j < maxw;  j += 2) {

+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);

+            ++y;

+            ++r;

+            ++g;

+            ++b;

+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);

+            ++y;

+            ++r;

+            ++g;

+            ++b;

+            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);

+            ++ny;

+            ++nr;

+            ++ng;

+            ++nb;

+            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);

+            ++ny;

+            ++nr;

+            ++ng;

+            ++nb;

+            ++cb;

+            ++cr;

+        }

+        y += maxw;

+        r += maxw;

+        g += maxw;

+        b += maxw;

+    }

+    FX_Free(img->comps[0].data);

+    img->comps[0].data = d0;

+    FX_Free(img->comps[1].data);

+    img->comps[1].data = d1;

+    FX_Free(img->comps[2].data);

+    img->comps[2].data = d2;

+    img->comps[1].w = maxw;

+    img->comps[1].h = maxh;

+    img->comps[2].w = maxw;

+    img->comps[2].h = maxh;

+    img->comps[1].w = (OPJ_UINT32)maxw;

+    img->comps[1].h = (OPJ_UINT32)maxh;

+    img->comps[2].w = (OPJ_UINT32)maxw;

+    img->comps[2].h = (OPJ_UINT32)maxh;

+    img->comps[1].dx = img->comps[0].dx;

+    img->comps[2].dx = img->comps[0].dx;

+    img->comps[1].dy = img->comps[0].dy;

+    img->comps[2].dy = img->comps[0].dy;

+}

+void color_sycc_to_rgb(opj_image_t *img)

+{

+    if(img->numcomps < 3) {

+        img->color_space = OPJ_CLRSPC_GRAY;

+        return;

+    }

+    if((img->comps[0].dx == 1)

+            && (img->comps[1].dx == 2)

+            && (img->comps[2].dx == 2)

+            && (img->comps[0].dy == 1)

+            && (img->comps[1].dy == 2)

+            && (img->comps[2].dy == 2)) {

+        sycc420_to_rgb(img);

+    } else if((img->comps[0].dx == 1)

+              && (img->comps[1].dx == 2)

+              && (img->comps[2].dx == 2)

+              && (img->comps[0].dy == 1)

+              && (img->comps[1].dy == 1)

+              && (img->comps[2].dy == 1)) {

+        sycc422_to_rgb(img);

+    } else if((img->comps[0].dx == 1)

+              && (img->comps[1].dx == 1)

+              && (img->comps[2].dx == 1)

+              && (img->comps[0].dy == 1)

+              && (img->comps[1].dy == 1)

+              && (img->comps[2].dy == 1)) {

+        sycc444_to_rgb(img);

+    } else {

+        return;

+    }

+    img->color_space = OPJ_CLRSPC_SRGB;

+}

+void color_apply_icc_profile(opj_image_t *image)

+{

+    cmsHPROFILE in_prof, out_prof;

+    cmsHTRANSFORM transform;

+    cmsColorSpaceSignature in_space, out_space;

+    cmsUInt32Number intent, in_type, out_type, nr_samples;

+    int *r, *g, *b;

+    int prec, i, max, max_w, max_h;

+    OPJ_COLOR_SPACE oldspace;

+    in_prof =

+        cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len);

+    if(in_prof == NULL) {

+        return;

+    }

+    in_space = cmsGetPCS(in_prof);

+    out_space = cmsGetColorSpace(in_prof);

+    intent = cmsGetHeaderRenderingIntent(in_prof);

+    max_w = (int)image->comps[0].w;

+    max_h = (int)image->comps[0].h;

+    prec = (int)image->comps[0].prec;

+    oldspace = image->color_space;

+    if(out_space == cmsSigRgbData) {

+        if( prec <= 8 ) {

+            in_type = TYPE_RGB_8;

+            out_type = TYPE_RGB_8;

+        } else {

+            in_type = TYPE_RGB_16;

+            out_type = TYPE_RGB_16;

+        }

+        out_prof = cmsCreate_sRGBProfile();

+        image->color_space = OPJ_CLRSPC_SRGB;

+    } else if(out_space == cmsSigGrayData) {

+        if( prec <= 8 ) {

+            in_type = TYPE_GRAY_8;

+            out_type = TYPE_RGB_8;

+        } else {

+            in_type = TYPE_GRAY_16;

+            out_type = TYPE_RGB_16;

+        }

+        out_prof = cmsCreate_sRGBProfile();

+        image->color_space = OPJ_CLRSPC_SRGB;

+    } else if(out_space == cmsSigYCbCrData) {

+        in_type = TYPE_YCbCr_16;

+        out_type = TYPE_RGB_16;

+        out_prof = cmsCreate_sRGBProfile();

+        image->color_space = OPJ_CLRSPC_SRGB;

+    } else {

+        return;

+    }

+    transform = cmsCreateTransform(in_prof, in_type,

+                                   out_prof, out_type, intent, 0);

+    cmsCloseProfile(in_prof);

+    cmsCloseProfile(out_prof);

+    if(transform == NULL) {

+        image->color_space = oldspace;

+        return;

+    }

+    if(image->numcomps > 2) {

+        if( prec <= 8 ) {

+            unsigned char *inbuf, *outbuf, *in, *out;

+            max = max_w * max_h;

+            nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned char);

+            in = inbuf = FX_Alloc(unsigned char, nr_samples);

+            out = outbuf = FX_Alloc(unsigned char, nr_samples);

+            r = image->comps[0].data;

+            g = image->comps[1].data;

+            b = image->comps[2].data;

+            for(i = 0; i < max; ++i) {

+                *in++ = (unsigned char) * r++;

+                *in++ = (unsigned char) * g++;

+                *in++ = (unsigned char) * b++;

+            }

+            cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);

+            r = image->comps[0].data;

+            g = image->comps[1].data;

+            b = image->comps[2].data;

+            for(i = 0; i < max; ++i) {

+                *r++ = (int) * out++;

+                *g++ = (int) * out++;

+                *b++ = (int) * out++;

+            }

+            FX_Free(inbuf);

+            FX_Free(outbuf);

+        } else {

+            unsigned short *inbuf, *outbuf, *in, *out;

+            max = max_w * max_h;

+            nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned short);

+            in = inbuf = FX_Alloc(unsigned short, nr_samples);

+            out = outbuf = FX_Alloc(unsigned short, nr_samples);

+            r = image->comps[0].data;

+            g = image->comps[1].data;

+            b = image->comps[2].data;

+            for(i = 0; i < max; ++i) {

+                *in++ = (unsigned short) * r++;

+                *in++ = (unsigned short) * g++;

+                *in++ = (unsigned short) * b++;

+            }

+            cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);

+            r = image->comps[0].data;

+            g = image->comps[1].data;

+            b = image->comps[2].data;

+            for(i = 0; i < max; ++i) {

+                *r++ = (int) * out++;

+                *g++ = (int) * out++;

+                *b++ = (int) * out++;

+            }

+            FX_Free(inbuf);

+            FX_Free(outbuf);

+        }

+    } else {

+        unsigned char *in, *inbuf, *out, *outbuf;

+        max = max_w * max_h;

+        nr_samples = (cmsUInt32Number)max * 3 * sizeof(unsigned char);

+        in = inbuf = FX_Alloc(unsigned char, nr_samples);

+        out = outbuf = FX_Alloc(unsigned char, nr_samples);

+        image->comps = (opj_image_comp_t*)

+                       realloc(image->comps, (image->numcomps + 2) * sizeof(opj_image_comp_t));

+        if(image->numcomps == 2) {

+            image->comps[3] = image->comps[1];

+        }

+        image->comps[1] = image->comps[0];

+        image->comps[2] = image->comps[0];

+        image->comps[1].data = FX_Alloc(int, (size_t)max);

+        FXSYS_memset8(image->comps[1].data, 0, sizeof(int) * (size_t)max);

+        image->comps[2].data = FX_Alloc(int, (size_t)max);

+        FXSYS_memset8(image->comps[2].data, 0, sizeof(int) * (size_t)max);

+        image->numcomps += 2;

+        r = image->comps[0].data;

+        for(i = 0; i < max; ++i) {

+            *in++ = (unsigned char) * r++;

+        }

+        cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);

+        r = image->comps[0].data;

+        g = image->comps[1].data;

+        b = image->comps[2].data;

+        for(i = 0; i < max; ++i) {

+            *r++ = (int) * out++;

+            *g++ = (int) * out++;

+            *b++ = (int) * out++;

+        }

+        FX_Free(inbuf);

+        FX_Free(outbuf);

+    }

+    cmsDeleteTransform(transform);

+}

+void color_apply_conversion(opj_image_t *image)

+{

+    int *row;

+    int enumcs, numcomps;

+    numcomps = image->numcomps;

+    if(numcomps < 3) {

+        return;

+    }

+    row = (int*)image->icc_profile_buf;

+    enumcs = row[0];

+    if(enumcs == 14) {

+        int *L, *a, *b, *red, *green, *blue, *src0, *src1, *src2;

+        double rl, ol, ra, oa, rb, ob, prec0, prec1, prec2;

+        double minL, maxL, mina, maxa, minb, maxb;

+        unsigned int default_type, il;

+        unsigned int i, max, illu;

+        cmsHPROFILE in, out;

+        cmsHTRANSFORM transform;

+        cmsUInt16Number RGB[3];

+        cmsCIELab Lab;

+        illu = 0;

+        il = 0;

+        in = cmsCreateLab4Profile(NULL);

+        out = cmsCreate_sRGBProfile();

+        transform =

+            cmsCreateTransform(in, TYPE_Lab_DBL, out, TYPE_RGB_16,

+                               INTENT_PERCEPTUAL, 0);

+        cmsCloseProfile(in);

+        cmsCloseProfile(out);

+        if(transform == NULL) {

+            return;

+        }

+        prec0 = (double)image->comps[0].prec;

+        prec1 = (double)image->comps[1].prec;

+        prec2 = (double)image->comps[2].prec;

+        default_type = row[1];

+        if(default_type == 0x44454600) {

+            rl = 100;

+            ra = 170;

+            rb = 200;

+            ol = 0;

+            oa = pow(2, prec1 - 1);

+            ob = pow(2, prec2 - 2)  + pow(2, prec2 - 3);

+        } else {

+            rl = row[2];

+            ra = row[4];

+            rb = row[6];

+            ol = row[3];

+            oa = row[5];

+            ob = row[7];

+        }

+        L = src0 = image->comps[0].data;

+        a = src1 = image->comps[1].data;

+        b = src2 = image->comps[2].data;

+        max = image->comps[0].w * image->comps[0].h;

+        red = FX_Alloc(int, max);

+        image->comps[0].data = red;

+        green = FX_Alloc(int, max);

+        image->comps[1].data = green;

+        blue = FX_Alloc(int, max);

+        image->comps[2].data = blue;

+        minL = -(rl * ol) / (pow(2, prec0) - 1);

+        maxL = minL + rl;

+        mina = -(ra * oa) / (pow(2, prec1) - 1);

+        maxa = mina + ra;

+        minb = -(rb * ob) / (pow(2, prec2) - 1);

+        maxb = minb + rb;

+        for(i = 0; i < max; ++i) {

+            Lab.L = minL + (double)(*L) * (maxL - minL) / (pow(2, prec0) - 1);

+            ++L;

+            Lab.a = mina + (double)(*a) * (maxa - mina) / (pow(2, prec1) - 1);

+            ++a;

+            Lab.b = minb + (double)(*b) * (maxb - minb) / (pow(2, prec2) - 1);

+            ++b;

+            cmsDoTransform(transform, &Lab, RGB, 1);

+            *red++ = RGB[0];

+            *green++ = RGB[1];

+            *blue++ = RGB[2];

+        }

+        cmsDeleteTransform(transform);

+        FX_Free(src0);

+        FX_Free(src1);

+        FX_Free(src2);

+        image->color_space = OPJ_CLRSPC_SRGB;

+        image->comps[0].prec = 16;

+        image->comps[1].prec = 16;

+        image->comps[2].prec = 16;

+        return;

+    }

+}

+class CJPX_Decoder : public CFX_Object

+{

+public:

+    CJPX_Decoder();

+    ~CJPX_Decoder();

+    FX_BOOL	Init(const unsigned char* src_data, int src_size);

+    void	GetInfo(FX_DWORD& width, FX_DWORD& height, FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);

+    FX_BOOL	Decode(FX_LPBYTE dest_buf, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);

+    FX_LPCBYTE m_SrcData;

+    int m_SrcSize;

+    opj_image_t *image;

+    opj_codec_t* l_codec;

+    opj_stream_t *l_stream;

+    FX_BOOL m_useColorSpace;

+};

+CJPX_Decoder::CJPX_Decoder(): image(NULL), l_codec(NULL), l_stream(NULL), m_useColorSpace(FALSE)

+{

+}

+CJPX_Decoder::~CJPX_Decoder()

+{

+    if(l_codec) {

+        opj_destroy_codec(l_codec);

+    }

+    if(l_stream) {

+        opj_stream_destroy(l_stream);

+    }

+    if(image) {

+        opj_image_destroy(image);

+    }

+}

+FX_BOOL CJPX_Decoder::Init(const unsigned char* src_data, int src_size)

+{

+    opj_dparameters_t parameters;

+    try {

+        image = NULL;

+        m_SrcData = src_data;

+        m_SrcSize = src_size;

+        decodeData srcData;

+        srcData.offset  = 0;

+        srcData.src_size = src_size;

+        srcData.src_data = src_data;

+        l_stream = fx_opj_stream_create_memory_stream(&srcData, OPJ_J2K_STREAM_CHUNK_SIZE, 1);

+        if (l_stream == NULL) {

+            return FALSE;

+        }

+        opj_set_default_decoder_parameters(&parameters);

+        parameters.decod_format = 0;

+        parameters.cod_format = 3;

+        if(FXSYS_memcmp32(m_SrcData, "\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a", 12) == 0) {

+            l_codec = opj_create_decompress(OPJ_CODEC_JP2);

+            parameters.decod_format = 1;

+        } else {

+            l_codec = opj_create_decompress(OPJ_CODEC_J2K);

+        }

+        if(!l_codec) {

+            return FALSE;

+        }

+        opj_set_info_handler(l_codec, fx_info_callback, 00);

+        opj_set_warning_handler(l_codec, fx_warning_callback, 00);

+        opj_set_error_handler(l_codec, fx_error_callback, 00);

+        if ( !opj_setup_decoder(l_codec, &parameters) ) {

+            return FALSE;

+        }

+        if(! opj_read_header(l_stream, l_codec, &image)) {

+            image = NULL;

+            return FALSE;

+        }

+        if(this->m_useColorSpace) {

+            image->useColorSpace = 1;

+        } else {

+            image->useColorSpace = 0;

+        }

+        if (!parameters.nb_tile_to_decode) {

+            if (!opj_set_decode_area(l_codec, image, parameters.DA_x0,

+                                     parameters.DA_y0, parameters.DA_x1, parameters.DA_y1)) {

+                opj_image_destroy(image);

+                image = NULL;

+                return FALSE;

+            }

+            if (!(opj_decode(l_codec, l_stream, image) && opj_end_decompress(l_codec,	l_stream))) {

+                opj_image_destroy(image);

+                image = NULL;

+                return FALSE;

+            }

+        } else {

+            if (!opj_get_decoded_tile(l_codec, l_stream, image, parameters.tile_index)) {

+                return FALSE;

+            }

+        }

+        opj_stream_destroy(l_stream);

+        l_stream = NULL;

+        if( image->color_space != OPJ_CLRSPC_SYCC

+                && image->numcomps == 3 && image->comps[0].dx == image->comps[0].dy

+                && image->comps[1].dx != 1 ) {

+            image->color_space = OPJ_CLRSPC_SYCC;

+        } else if (image->numcomps <= 2) {

+            image->color_space = OPJ_CLRSPC_GRAY;

+        }

+        if(image->color_space == OPJ_CLRSPC_SYCC) {

+            color_sycc_to_rgb(image);

+        }

+        if(image->icc_profile_buf && !image->useColorSpace) {

+            FX_Free(image->icc_profile_buf);

+            image->icc_profile_buf = NULL;

+            image->icc_profile_len = 0;

+        }

+        if(!image) {

+            return FALSE;

+        }

+    } catch (...) {

+        return FALSE;

+    }

+    return TRUE;

+}

+void CJPX_Decoder::GetInfo(FX_DWORD& width, FX_DWORD& height, FX_DWORD& codestream_nComps, FX_DWORD& output_nComps)

+{

+    width = (FX_DWORD)image->x1;

+    height = (FX_DWORD)image->y1;

+    output_nComps = codestream_nComps = (FX_DWORD)image->numcomps;

+}

+FX_BOOL CJPX_Decoder::Decode(FX_LPBYTE dest_buf, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets)

+{

+    FX_BYTE** channel_bufs;

+    int* adjust_comps;

+    int i, wid, hei, row, col, channel, src;

+    FX_BOOL flag;

+    FX_LPBYTE pChannel, pScanline, pPixel;

+    try {

+        if(image->comps[0].w != image->x1 || image->comps[0].h != image->y1) {

+            return FALSE;

+        }

+        if(pitch < (int)(image->comps[0].w * 8 * image->numcomps + 31) >> 5 << 2) {

+            return FALSE;

+        }

+        FXSYS_memset8(dest_buf, 0xff, image->y1 * pitch);

+        channel_bufs = FX_Alloc(FX_BYTE*, image->numcomps);

+        if (channel_bufs == NULL) {

+            return FALSE;

+        }

+        adjust_comps = FX_Alloc(int, image->numcomps);

+        if (adjust_comps == NULL) {

+            FX_Free(channel_bufs);

+            return FALSE;

+        }

+        flag = TRUE;

+        for (i = 0; i < (int)image->numcomps; i ++) {

+            channel_bufs[i] = dest_buf + offsets[i];

+            adjust_comps[i] = image->comps[i].prec - 8;

+            if(i > 0) {

+                if(image->comps[i].dx != image->comps[i - 1].dx

+                        || image->comps[i].dy != image->comps[i - 1].dy

+                        || image->comps[i].prec != image->comps[i - 1].prec) {

+                    flag = FALSE;

+                    goto failed;

+                }

+            }

+        }

+        wid = image->comps[0].w;

+        hei = image->comps[0].h;

+        for (channel = 0; channel < (int)image->numcomps; channel++) {

+            pChannel = channel_bufs[channel];

+            if(adjust_comps[channel] < 0) {

+                for(row = 0; row < hei; row++) {

+                    pScanline = pChannel + row * pitch;

+                    for (col = 0; col < wid; col++) {

+                        pPixel = pScanline + col * image->numcomps;

+                        src = image->comps[channel].data[row * wid + col];

+                        src += image->comps[channel].sgnd ? 1 << (image->comps[channel].prec - 1) : 0;

+                        if (adjust_comps[channel] > 0) {

+                            *pPixel = 0;

+                        } else {

+                            *pPixel = (FX_BYTE)(src << -adjust_comps[channel]);

+                        }

+                    }

+                }

+            } else {

+                for(row = 0; row < hei; row++) {

+                    pScanline = pChannel + row * pitch;

+                    for (col = 0; col < wid; col++) {

+                        pPixel = pScanline + col * image->numcomps;

+						if (!image->comps[channel].data) continue;

+                        src = image->comps[channel].data[row * wid + col];

+                        src += image->comps[channel].sgnd ? 1 << (image->comps[channel].prec - 1) : 0;

+                        if (adjust_comps[channel] - 1 < 0) {

+                            *pPixel = (FX_BYTE)((src >> adjust_comps[channel]));

+                        } else {

+                            int tmpPixel = (src >> adjust_comps[channel]) + ((src >> (adjust_comps[channel] - 1)) % 2);

+                            if (tmpPixel > 255) {

+                                tmpPixel = 255;

+                            } else if (tmpPixel < 0) {

+                                tmpPixel = 0;

+                            }

+                            *pPixel = (FX_BYTE)tmpPixel;

+                        }

+                    }

+                }

+            }

+        }

+    } catch (...) {

+        if (channel_bufs) {

+            FX_Free(channel_bufs);

+        }

+        FX_Free(adjust_comps);

+        return FALSE;

+    }

+    FX_Free(channel_bufs);

+    FX_Free(adjust_comps);

+    return TRUE;

+failed:

+    FX_Free(channel_bufs);

+    FX_Free(adjust_comps);

+    return FALSE;

+}

+void initialize_transition_table();

+void initialize_significance_luts();

+void initialize_sign_lut();

+CCodec_JpxModule::CCodec_JpxModule()

+{

+}

+void* CCodec_JpxModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size , FX_BOOL useColorSpace)

+{

+    CJPX_Decoder* pDecoder = FX_NEW CJPX_Decoder;

+    if (pDecoder == NULL) {

+        return NULL;

+    }

+    pDecoder->m_useColorSpace = useColorSpace;

+    if (!pDecoder->Init(src_buf, src_size)) {

+        delete pDecoder;

+        return NULL;

+    }

+    return pDecoder;

+}

+void CCodec_JpxModule::GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,

+                                    FX_DWORD& codestream_nComps, FX_DWORD& output_nComps)

+{

+    CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;

+    pDecoder->GetInfo(width, height, codestream_nComps, output_nComps);

+}

+FX_BOOL CCodec_JpxModule::Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets)

+{

+    CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;

+    return pDecoder->Decode(dest_data, pitch, bTranslateColor, offsets);

+}

+void CCodec_JpxModule::DestroyDecoder(void* ctx)

+{

+    CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;

+    delete pDecoder;

+}

diff --git a/core/src/fxcodec/fx_libopenjpeg/include/fx_openjpeg.h b/core/src/fxcodec/fx_libopenjpeg/include/fx_openjpeg.h
new file mode 100644
index 0000000..da480f2
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/include/fx_openjpeg.h
@@ -0,0 +1,13 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_OPENJPEG_H_
+#define _FX_OPENJPEG_H_
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/openjpeg.h"
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/CMakeLists.txt b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/CMakeLists.txt
new file mode 100644
index 0000000..5c87f29
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/CMakeLists.txt
@@ -0,0 +1,98 @@
+include_regular_expression("^.*$")
+
+#
+install( FILES  ${CMAKE_CURRENT_BINARY_DIR}/opj_config.h
+ DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} COMPONENT Headers)
+
+include_directories(
+  ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h and opj_config_private.h
+)
+# Defines the source code for the library
+set(OPENJPEG_SRCS
+  ${CMAKE_CURRENT_SOURCE_DIR}/bio.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/cio.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/dwt.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/event.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/image.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/invert.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/j2k.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/jp2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/mct.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/mqc.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/opj_clock.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/pi.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/raw.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/t1.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/t2.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/tcd.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/tgt.c
+  ${CMAKE_CURRENT_SOURCE_DIR}/function_list.c
+)
+if(BUILD_JPIP)
+  add_definitions(-DUSE_JPIP)
+  set(OPENJPEG_SRCS
+    ${OPENJPEG_SRCS}
+    ${CMAKE_CURRENT_SOURCE_DIR}/cidx_manager.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/phix_manager.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/ppix_manager.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/thix_manager.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/tpix_manager.c
+  )
+endif()
+
+# Build the library
+if(WIN32)
+  if(BUILD_SHARED_LIBS)
+    add_definitions(-DOPJ_EXPORTS)
+  else()
+    add_definitions(-DOPJ_STATIC)
+  endif()
+endif()
+add_library(${OPENJPEG_LIBRARY_NAME} ${OPENJPEG_SRCS})
+if(UNIX)
+  target_link_libraries(${OPENJPEG_LIBRARY_NAME} m)
+endif()
+set_target_properties(${OPENJPEG_LIBRARY_NAME} PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES})
+
+# Install library
+install(TARGETS ${OPENJPEG_LIBRARY_NAME}
+  EXPORT OpenJPEGTargets
+  RUNTIME DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications
+  LIBRARY DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries
+  ARCHIVE DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries
+)
+
+# Install includes files
+install(FILES openjpeg.h opj_stdint.h
+  DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} COMPONENT Headers
+)
+
+# install man page of the library
+install(
+  FILES       ${OPENJPEG_SOURCE_DIR}/doc/man/man3/libopenjp2.3
+  DESTINATION ${OPENJPEG_INSTALL_MAN_DIR}/man3)
+
+# internal utilities to generate t1_luts.h (part of the jp2 lib)
+# no need to install:
+add_executable(t1_generate_luts t1_generate_luts.c)
+if(UNIX)
+  target_link_libraries(t1_generate_luts m)
+endif()
+
+# Experimental option; let's how cppcheck performs
+# Implementation details:
+# I could not figure out how to easily upload a file to CDash. Instead simply
+# pretend cppcheck is part of the Build step. Technically cppcheck can even
+# output gcc formatted error/warning report
+# Another implementation detail: I could not redirect error to the error
+# catching mechanism something is busted in cmake 2.8.5, I had to use the
+# warning regex to catch them.
+if(OPENJPEG_CPPCHECK)
+  find_package(CPPCHECK REQUIRED)
+  foreach(f ${OPENJPEG_SRCS})
+    # cppcheck complains about too many configuration, pretend to be WIN32:
+    add_custom_command(TARGET ${OPENJPEG_LIBRARY_NAME}
+      COMMAND ${CPPCHECK_EXECUTABLE} -DWIN32 ${f})
+  endforeach()
+endif()
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.c
new file mode 100644
index 0000000..5d49580
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.c
@@ -0,0 +1,194 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/** @defgroup BIO BIO - Individual bit input-output stream */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Write a bit
+@param bio BIO handle
+@param b Bit to write (0 or 1)
+*/
+static void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b);
+/**
+Read a bit
+@param bio BIO handle
+@return Returns the read bit
+*/
+static OPJ_UINT32 opj_bio_getbit(opj_bio_t *bio);
+/**
+Write a byte
+@param bio BIO handle
+@return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise
+*/
+static OPJ_BOOL opj_bio_byteout(opj_bio_t *bio);
+/**
+Read a byte
+@param bio BIO handle
+@return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise
+*/
+static OPJ_BOOL opj_bio_bytein(opj_bio_t *bio);
+
+/*@}*/
+
+/*@}*/
+
+/* 
+==========================================================
+   local functions
+==========================================================
+*/
+
+OPJ_BOOL opj_bio_byteout(opj_bio_t *bio) {
+	bio->buf = (bio->buf << 8) & 0xffff;
+	bio->ct = bio->buf == 0xff00 ? 7 : 8;
+	if (bio->bp >= bio->end) {
+		return OPJ_FALSE;
+	}
+	*bio->bp++ = (OPJ_BYTE)(bio->buf >> 8);
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_bio_bytein(opj_bio_t *bio) {
+	bio->buf = (bio->buf << 8) & 0xffff;
+	bio->ct = bio->buf == 0xff00 ? 7 : 8;
+	if (bio->bp >= bio->end) {
+		return OPJ_FALSE;
+	}
+	bio->buf |= *bio->bp++;
+	return OPJ_TRUE;
+}
+
+void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b) {
+	if (bio->ct == 0) {
+		opj_bio_byteout(bio); /* MSD: why not check the return value of this function ? */
+	}
+	bio->ct--;
+	bio->buf |= b << bio->ct;
+}
+
+OPJ_UINT32 opj_bio_getbit(opj_bio_t *bio) {
+	if (bio->ct == 0) {
+		opj_bio_bytein(bio); /* MSD: why not check the return value of this function ? */
+	}
+	bio->ct--;
+	return (bio->buf >> bio->ct) & 1;
+}
+
+/* 
+==========================================================
+   Bit Input/Output interface
+==========================================================
+*/
+
+opj_bio_t* opj_bio_create(void) {
+	opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
+	return bio;
+}
+
+void opj_bio_destroy(opj_bio_t *bio) {
+	if(bio) {
+		opj_free(bio);
+	}
+}
+
+ptrdiff_t opj_bio_numbytes(opj_bio_t *bio) {
+	return (bio->bp - bio->start);
+}
+
+void opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) {
+	bio->start = bp;
+	bio->end = bp + len;
+	bio->bp = bp;
+	bio->buf = 0;
+	bio->ct = 8;
+}
+
+void opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) {
+	bio->start = bp;
+	bio->end = bp + len;
+	bio->bp = bp;
+	bio->buf = 0;
+	bio->ct = 0;
+}
+
+void opj_bio_write(opj_bio_t *bio, OPJ_UINT32 v, OPJ_UINT32 n) {
+	OPJ_UINT32 i;
+	for (i = n - 1; i < n; i--) {
+		opj_bio_putbit(bio, (v >> i) & 1);
+	}
+}
+
+OPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n) {
+	OPJ_UINT32 i;
+    OPJ_UINT32 v;
+	v = 0;
+	for (i = n - 1; i < n; i--) {
+		v += opj_bio_getbit(bio) << i;
+	}
+	return v;
+}
+
+OPJ_BOOL opj_bio_flush(opj_bio_t *bio) {
+	bio->ct = 0;
+	if (! opj_bio_byteout(bio)) {
+		return OPJ_FALSE;
+	}
+	if (bio->ct == 7) {
+		bio->ct = 0;
+		if (! opj_bio_byteout(bio)) {
+			return OPJ_FALSE;
+		}
+	}
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_bio_inalign(opj_bio_t *bio) {
+	bio->ct = 0;
+	if ((bio->buf & 0xff) == 0xff) {
+		if (! opj_bio_bytein(bio)) {
+			return OPJ_FALSE;
+		}
+		bio->ct = 0;
+	}
+	return OPJ_TRUE;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.h
new file mode 100644
index 0000000..fba2428
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.h
@@ -0,0 +1,134 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __BIO_H
+#define __BIO_H
+
+#include <stddef.h> /* ptrdiff_t */
+
+/** 
+@file bio.h
+@brief Implementation of an individual bit input-output (BIO)
+
+The functions in BIO.C have for goal to realize an individual bit input - output.
+*/
+
+/** @defgroup BIO BIO - Individual bit input-output stream */
+/*@{*/
+
+/**
+Individual bit input-output stream (BIO)
+*/
+typedef struct opj_bio {
+	/** pointer to the start of the buffer */
+	OPJ_BYTE *start;
+	/** pointer to the end of the buffer */
+	OPJ_BYTE *end;
+	/** pointer to the present position in the buffer */
+	OPJ_BYTE *bp;
+	/** temporary place where each byte is read or written */
+	OPJ_UINT32 buf;
+	/** coder : number of bits free to write. decoder : number of bits read */
+	OPJ_UINT32 ct;
+} opj_bio_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a new BIO handle 
+@return Returns a new BIO handle if successful, returns NULL otherwise
+*/
+opj_bio_t* opj_bio_create(void);
+/**
+Destroy a previously created BIO handle
+@param bio BIO handle to destroy
+*/
+void opj_bio_destroy(opj_bio_t *bio);
+/**
+Number of bytes written.
+@param bio BIO handle
+@return Returns the number of bytes written
+*/
+ptrdiff_t opj_bio_numbytes(opj_bio_t *bio);
+/**
+Init encoder
+@param bio BIO handle
+@param bp Output buffer
+@param len Output buffer length 
+*/
+void opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len);
+/**
+Init decoder
+@param bio BIO handle
+@param bp Input buffer
+@param len Input buffer length 
+*/
+void opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len);
+/**
+Write bits
+@param bio BIO handle
+@param v Value of bits
+@param n Number of bits to write
+*/
+void opj_bio_write(opj_bio_t *bio, OPJ_UINT32 v, OPJ_UINT32 n);
+/**
+Read bits
+@param bio BIO handle
+@param n Number of bits to read 
+@return Returns the corresponding read number
+*/
+OPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n);
+/**
+Flush bits
+@param bio BIO handle
+@return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise
+*/
+OPJ_BOOL opj_bio_flush(opj_bio_t *bio);
+/**
+Passes the ending bits (coming from flushing)
+@param bio BIO handle
+@return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise
+*/
+OPJ_BOOL opj_bio_inalign(opj_bio_t *bio);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __BIO_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.c
new file mode 100644
index 0000000..6cba658
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.c
@@ -0,0 +1,658 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/* ----------------------------------------------------------------------- */
+
+
+/* ----------------------------------------------------------------------- */
+
+void opj_write_bytes_BE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes)
+{
+	const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + p_nb_bytes;
+
+	assert(p_nb_bytes > 0 && p_nb_bytes <=  sizeof(OPJ_UINT32));
+
+	memcpy(p_buffer,l_data_ptr,p_nb_bytes);
+}
+
+void opj_write_bytes_LE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes)
+{
+	const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + p_nb_bytes - 1;
+	OPJ_UINT32 i;
+
+	assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
+
+	for	(i=0;i<p_nb_bytes;++i) {
+		*(p_buffer++) = *(l_data_ptr--);
+	}
+}
+
+void opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes)
+{
+	OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
+
+	assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
+
+	*p_value = 0;
+	memcpy(l_data_ptr+4-p_nb_bytes,p_buffer,p_nb_bytes);
+}
+
+void opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes)
+{
+	OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + p_nb_bytes-1;
+	OPJ_UINT32 i;
+
+	assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
+
+	*p_value = 0;
+	for (i=0;i<p_nb_bytes;++i) {
+		*(l_data_ptr--) = *(p_buffer++);
+	}
+}
+
+void opj_write_double_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value)
+{
+	const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value);
+	memcpy(p_buffer,l_data_ptr,sizeof(OPJ_FLOAT64));
+}
+
+void opj_write_double_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value)
+{
+	const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(OPJ_FLOAT64) - 1;
+	OPJ_UINT32 i;
+	for	(i=0;i<sizeof(OPJ_FLOAT64);++i) {
+		*(p_buffer++) = *(l_data_ptr--);
+	}
+}
+
+void opj_read_double_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value)
+{
+	OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
+	memcpy(l_data_ptr,p_buffer,sizeof(OPJ_FLOAT64));
+}
+
+void opj_read_double_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value)
+{
+	OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + sizeof(OPJ_FLOAT64)-1;
+	OPJ_UINT32 i;
+	for (i=0;i<sizeof(OPJ_FLOAT64);++i) {
+		*(l_data_ptr--) = *(p_buffer++);
+	}
+}
+
+void opj_write_float_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value)
+{
+	const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value);
+	memcpy(p_buffer,l_data_ptr,sizeof(OPJ_FLOAT32));
+}
+
+void opj_write_float_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value)
+{
+	const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(OPJ_FLOAT32) - 1;
+	OPJ_UINT32 i;
+	for	(i=0;i<sizeof(OPJ_FLOAT32);++i) {
+		*(p_buffer++) = *(l_data_ptr--);
+	}
+}
+
+void opj_read_float_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value)
+{
+	OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
+	memcpy(l_data_ptr,p_buffer,sizeof(OPJ_FLOAT32));
+}
+
+void opj_read_float_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value)
+{
+	OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + sizeof(OPJ_FLOAT32)-1;
+	OPJ_UINT32 i;
+	for	(i=0;i<sizeof(OPJ_FLOAT32);++i) {
+		*(l_data_ptr--) = *(p_buffer++);
+	}
+}
+
+opj_stream_t* OPJ_CALLCONV opj_stream_create(OPJ_SIZE_T p_buffer_size,OPJ_BOOL l_is_input)
+{
+	opj_stream_private_t * l_stream = 00;
+	l_stream = (opj_stream_private_t*) opj_malloc(sizeof(opj_stream_private_t));
+	if (! l_stream) {
+		return 00;
+	}
+
+	memset(l_stream,0,sizeof(opj_stream_private_t));
+	l_stream->m_buffer_size = p_buffer_size;
+	l_stream->m_stored_data = (OPJ_BYTE *) opj_malloc(p_buffer_size);
+	if (! l_stream->m_stored_data) {
+		opj_free(l_stream);
+		return 00;
+	}
+
+	l_stream->m_current_data = l_stream->m_stored_data;
+
+	if (l_is_input) {
+		l_stream->m_status |= opj_stream_e_input;
+		l_stream->m_opj_skip = opj_stream_read_skip;
+		l_stream->m_opj_seek = opj_stream_read_seek;
+	}
+	else {
+		l_stream->m_status |= opj_stream_e_output;
+		l_stream->m_opj_skip = opj_stream_write_skip;
+		l_stream->m_opj_seek = opj_stream_write_seek;
+	}
+
+	l_stream->m_read_fn = opj_stream_default_read;
+	l_stream->m_write_fn = opj_stream_default_write;
+	l_stream->m_skip_fn = opj_stream_default_skip;
+	l_stream->m_seek_fn = opj_stream_default_seek;
+
+	return (opj_stream_t *) l_stream;
+}
+
+opj_stream_t* OPJ_CALLCONV opj_stream_default_create(OPJ_BOOL l_is_input)
+{
+	return opj_stream_create(OPJ_J2K_STREAM_CHUNK_SIZE,l_is_input);
+}
+
+void OPJ_CALLCONV opj_stream_destroy(opj_stream_t* p_stream)
+{
+	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+	
+	if (l_stream) {
+		if (l_stream->m_free_user_data_fn) {
+			l_stream->m_free_user_data_fn(l_stream->m_user_data);
+		}
+		opj_free(l_stream->m_stored_data);
+		l_stream->m_stored_data = 00;
+		opj_free(l_stream);
+	}
+}
+
+void OPJ_CALLCONV opj_stream_destroy_v3(opj_stream_t* p_stream)
+{
+	opj_stream_destroy(p_stream);
+}
+
+void OPJ_CALLCONV opj_stream_set_read_function(opj_stream_t* p_stream, opj_stream_read_fn p_function)
+{
+	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+
+	if ((!l_stream) || (! (l_stream->m_status & opj_stream_e_input))) {
+		return;
+	}
+
+	l_stream->m_read_fn = p_function;
+}
+
+void OPJ_CALLCONV opj_stream_set_seek_function(opj_stream_t* p_stream, opj_stream_seek_fn p_function)
+{
+	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+	
+	if (!l_stream) {
+		return;
+	}
+	l_stream->m_seek_fn = p_function;
+}
+
+void OPJ_CALLCONV opj_stream_set_write_function(opj_stream_t* p_stream, opj_stream_write_fn p_function)
+{
+	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+	
+	if ((!l_stream )|| (! (l_stream->m_status & opj_stream_e_output))) {
+		return;
+	}
+
+	l_stream->m_write_fn = p_function;
+}
+
+void OPJ_CALLCONV opj_stream_set_skip_function(opj_stream_t* p_stream, opj_stream_skip_fn p_function)
+{
+	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+	
+	if (! l_stream) {
+		return;
+	}
+
+	l_stream->m_skip_fn = p_function;
+}
+
+void OPJ_CALLCONV opj_stream_set_user_data(opj_stream_t* p_stream, void * p_data)
+{
+	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+	if (!l_stream)
+		return;
+	l_stream->m_user_data = p_data;
+}
+
+void OPJ_CALLCONV opj_stream_set_user_data_v3(opj_stream_t* p_stream, void * p_data, opj_stream_free_user_data_fn p_function)
+{
+	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+	if (!l_stream)
+		return;
+	l_stream->m_user_data = p_data;
+  l_stream->m_free_user_data_fn = p_function;
+}
+
+void OPJ_CALLCONV opj_stream_set_user_data_length(opj_stream_t* p_stream, OPJ_UINT64 data_length)
+{
+	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+	if (!l_stream)
+		return;
+	l_stream->m_user_data_length = data_length;
+}
+
+OPJ_SIZE_T opj_stream_read_data (opj_stream_private_t * p_stream,OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, opj_event_mgr_t * p_event_mgr)
+{
+	OPJ_SIZE_T l_read_nb_bytes = 0;
+	if (p_stream->m_bytes_in_buffer >= p_size) {
+		memcpy(p_buffer,p_stream->m_current_data,p_size);
+		p_stream->m_current_data += p_size;
+		p_stream->m_bytes_in_buffer -= p_size;
+		l_read_nb_bytes += p_size;
+		p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
+		return l_read_nb_bytes;
+	}
+
+	/* we are now in the case when the remaining data if not sufficient */
+	if (p_stream->m_status & opj_stream_e_end) {
+		l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+		memcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);
+		p_stream->m_current_data += p_stream->m_bytes_in_buffer;
+		p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+		p_stream->m_bytes_in_buffer = 0;
+		return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;
+	}
+
+	/* the flag is not set, we copy data and then do an actual read on the stream */
+	if (p_stream->m_bytes_in_buffer) {
+		l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+		memcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);
+		p_stream->m_current_data = p_stream->m_stored_data;
+		p_buffer += p_stream->m_bytes_in_buffer;
+		p_size -= p_stream->m_bytes_in_buffer;
+		p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+		p_stream->m_bytes_in_buffer = 0;
+	}
+	else {
+    /* case where we are already at the end of the buffer
+       so reset the m_current_data to point to the start of the
+       stored buffer to get ready to read from disk*/
+		p_stream->m_current_data = p_stream->m_stored_data;
+	}
+
+	while(1){
+		/* we should read less than a chunk -> read a chunk */
+		if (p_size < p_stream->m_buffer_size) {
+			/* we should do an actual read on the media */
+			p_stream->m_bytes_in_buffer = p_stream->m_read_fn(p_stream->m_stored_data,p_stream->m_buffer_size,p_stream->m_user_data);
+
+			if (p_stream->m_bytes_in_buffer == (OPJ_SIZE_T)-1) {
+				/* end of stream */
+				opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
+
+				p_stream->m_bytes_in_buffer = 0;
+				p_stream->m_status |= opj_stream_e_end;
+				/* end of stream */
+				return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;
+			}
+			else if	(p_stream->m_bytes_in_buffer < p_size) {
+				/* not enough data */
+				l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+				memcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);
+				p_stream->m_current_data = p_stream->m_stored_data;
+				p_buffer += p_stream->m_bytes_in_buffer;
+				p_size -= p_stream->m_bytes_in_buffer;
+				p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+				p_stream->m_bytes_in_buffer = 0;
+			}
+			else {
+				l_read_nb_bytes += p_size;
+				memcpy(p_buffer,p_stream->m_current_data,p_size);
+				p_stream->m_current_data += p_size;
+				p_stream->m_bytes_in_buffer -= p_size;
+				p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
+				return l_read_nb_bytes;
+			}
+		}
+		else {
+			/* direct read on the dest buffer */
+			p_stream->m_bytes_in_buffer = p_stream->m_read_fn(p_buffer,p_size,p_stream->m_user_data);
+
+			if (p_stream->m_bytes_in_buffer == (OPJ_SIZE_T)-1) {
+				/*  end of stream */
+				opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
+
+				p_stream->m_bytes_in_buffer = 0;
+				p_stream->m_status |= opj_stream_e_end;
+				/* end of stream */
+				return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;
+			}
+			else if (p_stream->m_bytes_in_buffer < p_size) {
+				/* not enough data */
+				l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+				p_stream->m_current_data = p_stream->m_stored_data;
+				p_buffer += p_stream->m_bytes_in_buffer;
+				p_size -= p_stream->m_bytes_in_buffer;
+				p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+				p_stream->m_bytes_in_buffer = 0;
+			}
+			else {
+				/* we have read the exact size */
+				l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+				p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+				p_stream->m_current_data = p_stream->m_stored_data;
+				p_stream->m_bytes_in_buffer = 0;
+				return l_read_nb_bytes;
+			}
+		}
+	}
+}
+
+OPJ_SIZE_T opj_stream_write_data (opj_stream_private_t * p_stream,
+								  const OPJ_BYTE * p_buffer,
+								  OPJ_SIZE_T p_size, 
+								  opj_event_mgr_t * p_event_mgr)
+{
+	OPJ_SIZE_T l_remaining_bytes = 0;
+	OPJ_SIZE_T l_write_nb_bytes = 0;
+
+	if (p_stream->m_status & opj_stream_e_error) {
+		return (OPJ_SIZE_T)-1;
+	}
+
+	while(1) {
+		l_remaining_bytes = p_stream->m_buffer_size - p_stream->m_bytes_in_buffer;
+		
+		/* we have more memory than required */
+		if (l_remaining_bytes >= p_size) {
+			memcpy(p_stream->m_current_data, p_buffer, p_size);
+			
+			p_stream->m_current_data += p_size;
+			p_stream->m_bytes_in_buffer += p_size;
+			l_write_nb_bytes += p_size;
+			p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
+			
+			return l_write_nb_bytes;
+		}
+
+		/* we copy data and then do an actual read on the stream */
+		if (l_remaining_bytes) {
+			l_write_nb_bytes += l_remaining_bytes;
+			
+			memcpy(p_stream->m_current_data,p_buffer,l_remaining_bytes);
+			
+			p_stream->m_current_data = p_stream->m_stored_data;
+			
+			p_buffer += l_remaining_bytes;
+			p_size -= l_remaining_bytes;
+			p_stream->m_bytes_in_buffer += l_remaining_bytes;
+			p_stream->m_byte_offset += (OPJ_OFF_T)l_remaining_bytes;
+		}
+
+		if (! opj_stream_flush(p_stream, p_event_mgr)) {
+			return (OPJ_SIZE_T)-1;
+		}
+	}
+
+}
+
+OPJ_BOOL opj_stream_flush (opj_stream_private_t * p_stream, opj_event_mgr_t * p_event_mgr)
+{
+	/* the number of bytes written on the media. */
+	OPJ_SIZE_T l_current_write_nb_bytes = 0;
+
+	p_stream->m_current_data = p_stream->m_stored_data;
+
+	while (p_stream->m_bytes_in_buffer) {
+		/* we should do an actual write on the media */
+		l_current_write_nb_bytes = p_stream->m_write_fn(p_stream->m_current_data,
+														p_stream->m_bytes_in_buffer,
+														p_stream->m_user_data);
+		
+		if (l_current_write_nb_bytes == (OPJ_SIZE_T)-1) {
+			p_stream->m_status |= opj_stream_e_error;
+			opj_event_msg(p_event_mgr, EVT_INFO, "Error on writing stream!\n");
+
+			return OPJ_FALSE;
+		}
+
+		p_stream->m_current_data += l_current_write_nb_bytes;
+		p_stream->m_bytes_in_buffer -= l_current_write_nb_bytes;
+	}
+
+	p_stream->m_current_data = p_stream->m_stored_data;
+	
+	return OPJ_TRUE;
+}
+
+OPJ_OFF_T opj_stream_read_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+{
+	OPJ_OFF_T l_skip_nb_bytes = 0;
+	OPJ_OFF_T l_current_skip_nb_bytes = 0;
+	
+	assert( p_size >= 0 );
+	
+	if (p_stream->m_bytes_in_buffer >= (OPJ_SIZE_T)p_size) {
+		p_stream->m_current_data += p_size;
+		/* it is safe to cast p_size to OPJ_SIZE_T since it is <= m_bytes_in_buffer
+		which is of type OPJ_SIZE_T */
+		p_stream->m_bytes_in_buffer -= (OPJ_SIZE_T)p_size;
+		l_skip_nb_bytes += p_size;
+		p_stream->m_byte_offset += l_skip_nb_bytes;
+		return l_skip_nb_bytes;
+	}
+
+	/* we are now in the case when the remaining data if not sufficient */
+	if (p_stream->m_status & opj_stream_e_end) {
+		l_skip_nb_bytes += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+		p_stream->m_current_data += p_stream->m_bytes_in_buffer;
+		p_stream->m_bytes_in_buffer = 0;
+		p_stream->m_byte_offset += l_skip_nb_bytes;
+		return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) -1;
+	}
+
+	/* the flag is not set, we copy data and then do an actual skip on the stream */
+	if (p_stream->m_bytes_in_buffer) {
+		l_skip_nb_bytes += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+		p_stream->m_current_data = p_stream->m_stored_data;
+		p_size -= (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+		p_stream->m_bytes_in_buffer = 0;
+	}
+
+	while (p_size > 0) {
+		/* we should do an actual skip on the media */
+		l_current_skip_nb_bytes = p_stream->m_skip_fn(p_size, p_stream->m_user_data);
+		if (l_current_skip_nb_bytes == (OPJ_OFF_T) -1) {
+			opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
+
+			p_stream->m_status |= opj_stream_e_end;
+			p_stream->m_byte_offset += l_skip_nb_bytes;
+			/* end if stream */
+			return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) -1;
+		}
+		p_size -= l_current_skip_nb_bytes;
+		l_skip_nb_bytes += l_current_skip_nb_bytes;
+	}
+
+	p_stream->m_byte_offset += l_skip_nb_bytes;
+	
+	return l_skip_nb_bytes;
+}
+
+OPJ_OFF_T opj_stream_write_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+{
+	OPJ_BOOL l_is_written = 0;
+	OPJ_OFF_T l_current_skip_nb_bytes = 0;
+	OPJ_OFF_T l_skip_nb_bytes = 0;
+
+	if (p_stream->m_status & opj_stream_e_error) {
+		return (OPJ_OFF_T) -1;
+	}
+
+	/* we should flush data */
+	l_is_written = opj_stream_flush (p_stream, p_event_mgr);
+	if (! l_is_written) {
+		p_stream->m_status |= opj_stream_e_error;
+		p_stream->m_bytes_in_buffer = 0;
+		return (OPJ_OFF_T) -1;
+	}
+	/* then skip */
+
+	while (p_size > 0) {
+		/* we should do an actual skip on the media */
+		l_current_skip_nb_bytes = p_stream->m_skip_fn(p_size, p_stream->m_user_data);
+		
+		if (l_current_skip_nb_bytes == (OPJ_OFF_T)-1) {
+			opj_event_msg(p_event_mgr, EVT_INFO, "Stream error!\n");
+
+			p_stream->m_status |= opj_stream_e_error;
+			p_stream->m_byte_offset += l_skip_nb_bytes;
+			/* end if stream */
+			return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T)-1;
+		}
+		p_size -= l_current_skip_nb_bytes;
+		l_skip_nb_bytes += l_current_skip_nb_bytes;
+	}
+
+	p_stream->m_byte_offset += l_skip_nb_bytes;
+	
+	return l_skip_nb_bytes;
+}
+
+OPJ_OFF_T opj_stream_tell (const opj_stream_private_t * p_stream)
+{
+	return p_stream->m_byte_offset;
+}
+
+OPJ_OFF_T opj_stream_get_number_byte_left (const opj_stream_private_t * p_stream)
+{
+  assert( p_stream->m_byte_offset >= 0 );
+  assert( p_stream->m_user_data_length >= (OPJ_UINT64)p_stream->m_byte_offset);
+  return p_stream->m_user_data_length ?
+				(OPJ_OFF_T)(p_stream->m_user_data_length) - p_stream->m_byte_offset :
+				0;
+}
+
+OPJ_OFF_T opj_stream_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+{
+	assert(p_size >= 0);
+	return p_stream->m_opj_skip(p_stream,p_size,p_event_mgr);
+}
+
+OPJ_BOOL opj_stream_read_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+{
+	OPJ_ARG_NOT_USED(p_event_mgr);
+	p_stream->m_current_data = p_stream->m_stored_data;
+	p_stream->m_bytes_in_buffer = 0;
+
+	if( !(p_stream->m_seek_fn(p_size,p_stream->m_user_data)) ) {
+		p_stream->m_status |= opj_stream_e_end;
+		return OPJ_FALSE;
+	}
+	else {
+		/* reset stream status */
+		p_stream->m_status &= (~opj_stream_e_end);
+		p_stream->m_byte_offset = p_size;
+
+	}
+
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_stream_write_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+{
+	if (! opj_stream_flush(p_stream,p_event_mgr)) {
+		p_stream->m_status |= opj_stream_e_error;
+		return OPJ_FALSE;
+	}
+
+	p_stream->m_current_data = p_stream->m_stored_data;
+	p_stream->m_bytes_in_buffer = 0;
+
+	if (! p_stream->m_seek_fn(p_size,p_stream->m_user_data)) {
+		p_stream->m_status |= opj_stream_e_error;
+		return OPJ_FALSE;
+	}
+	else {
+		p_stream->m_byte_offset = p_size;
+	}
+
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_stream_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr)
+{
+	assert(p_size >= 0);
+	return p_stream->m_opj_seek(p_stream,p_size,p_event_mgr);
+}
+
+OPJ_BOOL opj_stream_has_seek (const opj_stream_private_t * p_stream)
+{
+	return p_stream->m_seek_fn != opj_stream_default_seek;
+}
+
+OPJ_SIZE_T opj_stream_default_read (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data)
+{
+	OPJ_ARG_NOT_USED(p_buffer);
+	OPJ_ARG_NOT_USED(p_nb_bytes);
+	OPJ_ARG_NOT_USED(p_user_data);
+	return (OPJ_SIZE_T) -1;
+}
+
+OPJ_SIZE_T opj_stream_default_write (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data)
+{
+	OPJ_ARG_NOT_USED(p_buffer);
+	OPJ_ARG_NOT_USED(p_nb_bytes);
+	OPJ_ARG_NOT_USED(p_user_data);
+	return (OPJ_SIZE_T) -1;
+}
+
+OPJ_OFF_T opj_stream_default_skip (OPJ_OFF_T p_nb_bytes, void * p_user_data)
+{
+	OPJ_ARG_NOT_USED(p_nb_bytes);
+	OPJ_ARG_NOT_USED(p_user_data);
+	return (OPJ_OFF_T) -1;
+}
+
+OPJ_BOOL opj_stream_default_seek (OPJ_OFF_T p_nb_bytes, void * p_user_data)
+{
+	OPJ_ARG_NOT_USED(p_nb_bytes);
+	OPJ_ARG_NOT_USED(p_user_data);
+	return OPJ_FALSE;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.h
new file mode 100644
index 0000000..729d073
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.h
@@ -0,0 +1,399 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __CIO_H
+#define __CIO_H
+/**
+@file cio.h
+@brief Implementation of a byte input-output process (CIO)
+
+The functions in CIO.C have for goal to realize a byte input / output process.
+*/
+
+/** @defgroup CIO CIO - byte input-output stream */
+/*@{*/
+
+#include "opj_config.h"
+
+/* ----------------------------------------------------------------------- */
+
+#if defined(OPJ_BIG_ENDIAN)
+	#define opj_write_bytes		opj_write_bytes_BE
+	#define opj_read_bytes		opj_read_bytes_BE
+	#define opj_write_double	opj_write_double_BE
+	#define opj_read_double		opj_read_double_BE
+	#define opj_write_float		opj_write_float_BE
+	#define opj_read_float		opj_read_float_BE
+#else
+	#define opj_write_bytes		opj_write_bytes_LE
+	#define opj_read_bytes		opj_read_bytes_LE
+	#define opj_write_double	opj_write_double_LE
+	#define opj_read_double		opj_read_double_LE
+	#define opj_write_float		opj_write_float_LE
+	#define opj_read_float		opj_read_float_LE
+#endif
+
+
+
+typedef enum
+{
+	opj_signed_sentinel		= -1, /* do not use in code */
+	opj_stream_e_output		= 0x1,
+	opj_stream_e_input		= 0x2,
+	opj_stream_e_end		= 0x4,
+	opj_stream_e_error		= 0x8
+}
+opj_stream_flag ;
+
+/**
+Byte input-output stream.
+*/
+typedef struct opj_stream_private
+{
+	/**
+	 * User data, be it files, ... The actual data depends on the type of the stream.
+	 */
+	void *					m_user_data;
+
+	/**
+	 * Pointer to function to free m_user_data (NULL at initialization)
+	 * when destroying the stream. If pointer is NULL the function is not
+	 * called and the m_user_data is not freed (even if non-NULL).
+	 */
+	opj_stream_free_user_data_fn		m_free_user_data_fn;
+
+	/**
+	 * User data length
+	 */
+	OPJ_UINT64 				m_user_data_length;
+
+	/**
+	 * Pointer to actual read function (NULL at the initialization of the cio.
+	 */
+	opj_stream_read_fn		m_read_fn;
+
+	/**
+	 * Pointer to actual write function (NULL at the initialization of the cio.
+	 */
+	opj_stream_write_fn		m_write_fn;
+
+	/**
+	 * Pointer to actual skip function (NULL at the initialization of the cio.
+	 * There is no seek function to prevent from back and forth slow procedures.
+	 */
+	opj_stream_skip_fn		m_skip_fn;
+
+	/**
+	 * Pointer to actual seek function (if available).
+	 */
+	opj_stream_seek_fn		m_seek_fn;
+
+	/**
+	 * Actual data stored into the stream if readed from. Data is read by chunk of fixed size.
+	 * you should never access this data directly.
+	 */
+	OPJ_BYTE *					m_stored_data;
+
+	/**
+	 * Pointer to the current read data.
+	 */
+	OPJ_BYTE *					m_current_data;
+
+    /**
+    * FIXME DOC.
+    */
+	OPJ_OFF_T (* m_opj_skip)(struct opj_stream_private * ,OPJ_OFF_T , struct opj_event_mgr *);
+
+    /**
+    * FIXME DOC.
+    */
+	OPJ_BOOL (* m_opj_seek) (struct opj_stream_private * , OPJ_OFF_T , struct opj_event_mgr *);
+
+	/**
+	 * number of bytes containing in the buffer.
+	 */
+	OPJ_SIZE_T			m_bytes_in_buffer;
+
+	/**
+	 * The number of bytes read/written from the beginning of the stream
+	 */
+	OPJ_OFF_T			m_byte_offset;
+
+	/**
+	 * The size of the buffer.
+	 */
+	OPJ_SIZE_T			m_buffer_size;
+
+	/**
+	 * Flags to tell the status of the stream.
+	 */
+	opj_stream_flag m_status;
+
+}
+opj_stream_private_t;
+
+/** @name Exported functions (see also openjpeg.h) */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+ * Write some bytes to the given data buffer, this function is used in Big Endian cpus.
+ * @param p_buffer		pointer the data buffer to write data to.
+ * @param p_value		the value to write
+ * @param p_nb_bytes	the number of bytes to write
+*/
+void opj_write_bytes_BE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes);
+
+/**
+ * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.
+ * @param p_buffer		pointer the data buffer to read data from.
+ * @param p_value		pointer to the value that will store the data.
+ * @param p_nb_bytes	the nb bytes to read.
+ * @return				the number of bytes read or -1 if an error occured.
+ */
+void opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes);
+
+/**
+ * Write some bytes to the given data buffer, this function is used in Little Endian cpus.
+ * @param p_buffer		pointer the data buffer to write data to.
+ * @param p_value		the value to write
+ * @param p_nb_bytes	the number of bytes to write
+ * @return				the number of bytes written or -1 if an error occured
+*/
+void opj_write_bytes_LE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes);
+
+/**
+ * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.
+ * @param p_buffer		pointer the data buffer to read data from.
+ * @param p_value		pointer to the value that will store the data.
+ * @param p_nb_bytes	the nb bytes to read.
+ * @return				the number of bytes read or -1 if an error occured.
+ */
+void opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes);
+
+
+/**
+ * Write some bytes to the given data buffer, this function is used in Little Endian cpus.
+ * @param p_buffer		pointer the data buffer to write data to.
+ * @param p_value		the value to write
+ */
+void opj_write_double_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value);
+
+/***
+ * Write some bytes to the given data buffer, this function is used in Big Endian cpus.
+ * @param p_buffer		pointer the data buffer to write data to.
+ * @param p_value		the value to write
+ */
+void opj_write_double_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value);
+
+/**
+ * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.
+ * @param p_buffer		pointer the data buffer to read data from.
+ * @param p_value		pointer to the value that will store the data.
+ */
+void opj_read_double_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value);
+
+/**
+ * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.
+ * @param p_buffer		pointer the data buffer to read data from.
+ * @param p_value		pointer to the value that will store the data.
+ */
+void opj_read_double_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value);
+
+/**
+ * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.
+ * @param p_buffer		pointer the data buffer to read data from.
+ * @param p_value		pointer to the value that will store the data.
+ */
+void opj_read_float_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value);
+
+/**
+ * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.
+ * @param p_buffer		pointer the data buffer to read data from.
+ * @param p_value		pointer to the value that will store the data.
+ */
+void opj_read_float_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value);
+
+/**
+ * Write some bytes to the given data buffer, this function is used in Little Endian cpus.
+ * @param p_buffer		pointer the data buffer to write data to.
+ * @param p_value		the value to write
+ */
+void opj_write_float_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value);
+
+/***
+ * Write some bytes to the given data buffer, this function is used in Big Endian cpus.
+ * @param p_buffer		pointer the data buffer to write data to.
+ * @param p_value		the value to write
+ */
+void opj_write_float_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value);
+
+/**
+ * Reads some bytes from the stream.
+ * @param		p_stream	the stream to read data from.
+ * @param		p_buffer	pointer to the data buffer that will receive the data.
+ * @param		p_size		number of bytes to read.
+ * @param		p_event_mgr	the user event manager to be notified of special events.
+ * @return		the number of bytes read, or -1 if an error occured or if the stream is at the end.
+ */
+OPJ_SIZE_T opj_stream_read_data (opj_stream_private_t * p_stream,OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Writes some bytes to the stream.
+ * @param		p_stream	the stream to write data to.
+ * @param		p_buffer	pointer to the data buffer holds the data to be writtent.
+ * @param		p_size		number of bytes to write.
+ * @param		p_event_mgr	the user event manager to be notified of special events.
+ * @return		the number of bytes writtent, or -1 if an error occured.
+ */
+OPJ_SIZE_T opj_stream_write_data (opj_stream_private_t * p_stream,const OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Writes the content of the stream buffer to the stream.
+ * @param		p_stream	the stream to write data to.
+ * @param		p_event_mgr	the user event manager to be notified of special events.
+ * @return		true if the data could be flushed, false else.
+ */
+OPJ_BOOL opj_stream_flush (opj_stream_private_t * p_stream, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Skips a number of bytes from the stream.
+ * @param		p_stream	the stream to skip data from.
+ * @param		p_size		the number of bytes to skip.
+ * @param		p_event_mgr	the user event manager to be notified of special events.
+ * @return		the number of bytes skipped, or -1 if an error occured.
+ */
+OPJ_OFF_T opj_stream_skip (opj_stream_private_t * p_stream,OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Tells the byte offset on the stream (similar to ftell).
+ *
+ * @param		p_stream	the stream to get the information from.
+ *
+ * @return		the current position o fthe stream.
+ */
+OPJ_OFF_T opj_stream_tell (const opj_stream_private_t * p_stream);
+
+
+/**
+ * Get the number of bytes left before the end of the stream (similar to cio_numbytesleft).
+ *
+ * @param		p_stream	the stream to get the information from.
+ *
+ * @return		Number of bytes left before the end of the stream.
+ */
+OPJ_OFF_T opj_stream_get_number_byte_left (const opj_stream_private_t * p_stream);
+
+/**
+ * Skips a number of bytes from the stream.
+ * @param		p_stream	the stream to skip data from.
+ * @param		p_size		the number of bytes to skip.
+ * @param		p_event_mgr	the user event manager to be notified of special events.
+ * @return		the number of bytes skipped, or -1 if an error occured.
+ */
+OPJ_OFF_T opj_stream_write_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Skips a number of bytes from the stream.
+ * @param		p_stream	the stream to skip data from.
+ * @param		p_size		the number of bytes to skip.
+ * @param		p_event_mgr	the user event manager to be notified of special events.
+ * @return		the number of bytes skipped, or -1 if an error occured.
+ */
+OPJ_OFF_T opj_stream_read_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Skips a number of bytes from the stream.
+ * @param		p_stream	the stream to skip data from.
+ * @param		p_size		the number of bytes to skip.
+ * @param		p_event_mgr	the user event manager to be notified of special events.
+ * @return		OPJ_TRUE if success, or OPJ_FALSE if an error occured.
+ */
+OPJ_BOOL opj_stream_read_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Skips a number of bytes from the stream.
+ * @param		p_stream	the stream to skip data from.
+ * @param		p_size		the number of bytes to skip.
+ * @param		p_event_mgr	the user event manager to be notified of special events.
+ * @return		the number of bytes skipped, or -1 if an error occured.
+ */
+OPJ_BOOL opj_stream_write_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Seeks a number of bytes from the stream.
+ * @param		p_stream	the stream to skip data from.
+ * @param		p_size		the number of bytes to skip.
+ * @param		p_event_mgr	the user event manager to be notified of special events.
+ * @return		true if the stream is seekable.
+ */
+OPJ_BOOL opj_stream_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Tells if the given stream is seekable.
+ */
+OPJ_BOOL opj_stream_has_seek (const opj_stream_private_t * p_stream);
+
+/**
+ * FIXME DOC.
+ */
+OPJ_SIZE_T opj_stream_default_read (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data);
+
+/**
+ * FIXME DOC.
+ */
+OPJ_SIZE_T opj_stream_default_write (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data);
+
+/**
+ * FIXME DOC.
+ */
+OPJ_OFF_T opj_stream_default_skip (OPJ_OFF_T p_nb_bytes, void * p_user_data);
+
+/**
+ * FIXME DOC.
+ */
+OPJ_BOOL opj_stream_default_seek (OPJ_OFF_T p_nb_bytes, void * p_user_data);
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+
+#endif /* __CIO_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.c
new file mode 100644
index 0000000..e1f8a33
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.c
@@ -0,0 +1,925 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2007, Jonathan Ballard <dzonatas@dzonux.net>
+ * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef __SSE__
+#include <xmmintrin.h>
+#endif
+
+#include "opj_includes.h"
+
+/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
+/*@{*/
+
+#define OPJ_WS(i) v->mem[(i)*2]
+#define OPJ_WD(i) v->mem[(1+(i)*2)]
+
+/** @name Local data structures */
+/*@{*/
+
+typedef struct dwt_local {
+	OPJ_INT32* mem;
+	OPJ_INT32 dn;
+	OPJ_INT32 sn;
+	OPJ_INT32 cas;
+} opj_dwt_t;
+
+typedef union {
+	OPJ_FLOAT32	f[4];
+} opj_v4_t;
+
+typedef struct v4dwt_local {
+	opj_v4_t*	wavelet ;
+	OPJ_INT32		dn ;
+	OPJ_INT32		sn ;
+	OPJ_INT32		cas ;
+} opj_v4dwt_t ;
+
+static const OPJ_FLOAT32 opj_dwt_alpha =  1.586134342f; /*  12994 */
+static const OPJ_FLOAT32 opj_dwt_beta  =  0.052980118f; /*    434 */
+static const OPJ_FLOAT32 opj_dwt_gamma = -0.882911075f; /*  -7233 */
+static const OPJ_FLOAT32 opj_dwt_delta = -0.443506852f; /*  -3633 */
+
+static const OPJ_FLOAT32 opj_K      = 1.230174105f; /*  10078 */
+static const OPJ_FLOAT32 opj_c13318 = 1.625732422f;
+
+/*@}*/
+
+/**
+Virtual function type for wavelet transform in 1-D 
+*/
+typedef void (*DWT1DFN)(opj_dwt_t* v);
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Forward lazy transform (horizontal)
+*/
+static void opj_dwt_deinterleave_h(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+/**
+Forward lazy transform (vertical)
+*/
+static void opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 x, OPJ_INT32 cas);
+/**
+Inverse lazy transform (horizontal)
+*/
+static void opj_dwt_interleave_h(opj_dwt_t* h, OPJ_INT32 *a);
+/**
+Inverse lazy transform (vertical)
+*/
+static void opj_dwt_interleave_v(opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x);
+/**
+Forward 5-3 wavelet transform in 1-D
+*/
+static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+/**
+Inverse 5-3 wavelet transform in 1-D
+*/
+static void opj_dwt_decode_1(opj_dwt_t *v);
+static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+/**
+Forward 9-7 wavelet transform in 1-D
+*/
+static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+/**
+Explicit calculation of the Quantization Stepsizes 
+*/
+static void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_stepsize_t *bandno_stepsize);
+/**
+Inverse wavelet transform in 2-D.
+*/
+static OPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 i, DWT1DFN fn);
+
+static OPJ_BOOL opj_dwt_encode_procedure(	opj_tcd_tilecomp_t * tilec,
+										    void (*p_function)(OPJ_INT32 *, OPJ_INT32,OPJ_INT32,OPJ_INT32) );
+
+static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i);
+
+/* <summary>                             */
+/* Inverse 9-7 wavelet transform in 1-D. */
+/* </summary>                            */
+static void opj_v4dwt_decode(opj_v4dwt_t* restrict dwt);
+
+static void opj_v4dwt_interleave_h(opj_v4dwt_t* restrict w, OPJ_FLOAT32* restrict a, OPJ_INT32 x, OPJ_INT32 size);
+
+static void opj_v4dwt_interleave_v(opj_v4dwt_t* restrict v , OPJ_FLOAT32* restrict a , OPJ_INT32 x, OPJ_INT32 nb_elts_read);
+
+#ifdef __SSE__
+static void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c);
+
+static void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, __m128 c);
+
+#else
+static void opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count, const OPJ_FLOAT32 c);
+
+static void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, OPJ_FLOAT32 c);
+
+#endif
+
+/*@}*/
+
+/*@}*/
+
+#define OPJ_S(i) a[(i)*2]
+#define OPJ_D(i) a[(1+(i)*2)]
+#define OPJ_S_(i) ((i)<0?OPJ_S(0):((i)>=sn?OPJ_S(sn-1):OPJ_S(i)))
+#define OPJ_D_(i) ((i)<0?OPJ_D(0):((i)>=dn?OPJ_D(dn-1):OPJ_D(i)))
+/* new */
+#define OPJ_SS_(i) ((i)<0?OPJ_S(0):((i)>=dn?OPJ_S(dn-1):OPJ_S(i)))
+#define OPJ_DD_(i) ((i)<0?OPJ_D(0):((i)>=sn?OPJ_D(sn-1):OPJ_D(i)))
+
+/* <summary>                                                              */
+/* This table contains the norms of the 5-3 wavelets for different bands. */
+/* </summary>                                                             */
+static const OPJ_FLOAT64 opj_dwt_norms[4][10] = {
+	{1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},
+	{1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
+	{1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
+	{.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}
+};
+
+/* <summary>                                                              */
+/* This table contains the norms of the 9-7 wavelets for different bands. */
+/* </summary>                                                             */
+static const OPJ_FLOAT64 opj_dwt_norms_real[4][10] = {
+	{1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},
+	{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
+	{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
+	{2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}
+};
+
+/* 
+==========================================================
+   local functions
+==========================================================
+*/
+
+/* <summary>			                 */
+/* Forward lazy transform (horizontal).  */
+/* </summary>                            */ 
+void opj_dwt_deinterleave_h(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
+	OPJ_INT32 i;
+	OPJ_INT32 * l_dest = b;
+	OPJ_INT32 * l_src = a+cas;
+
+    for (i=0; i<sn; ++i) {
+		*l_dest++ = *l_src;
+		l_src += 2;
+	}
+	
+    l_dest = b + sn;
+	l_src = a + 1 - cas;
+
+    for	(i=0; i<dn; ++i)  {
+		*l_dest++=*l_src;
+		l_src += 2;
+	}
+}
+
+/* <summary>                             */  
+/* Forward lazy transform (vertical).    */
+/* </summary>                            */ 
+void opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 x, OPJ_INT32 cas) {
+    OPJ_INT32 i = sn;
+	OPJ_INT32 * l_dest = b;
+	OPJ_INT32 * l_src = a+cas;
+
+    while (i--) {
+		*l_dest = *l_src;
+		l_dest += x;
+		l_src += 2;
+		} /* b[i*x]=a[2*i+cas]; */
+
+	l_dest = b + sn * x;
+	l_src = a + 1 - cas;
+	
+	i = dn;
+    while (i--) {
+		*l_dest = *l_src;
+		l_dest += x;
+		l_src += 2;
+        } /*b[(sn+i)*x]=a[(2*i+1-cas)];*/
+}
+
+/* <summary>                             */
+/* Inverse lazy transform (horizontal).  */
+/* </summary>                            */
+void opj_dwt_interleave_h(opj_dwt_t* h, OPJ_INT32 *a) {
+    OPJ_INT32 *ai = a;
+    OPJ_INT32 *bi = h->mem + h->cas;
+    OPJ_INT32  i	= h->sn;
+    while( i-- ) {
+      *bi = *(ai++);
+	  bi += 2;
+    }
+    ai	= a + h->sn;
+    bi	= h->mem + 1 - h->cas;
+    i	= h->dn ;
+    while( i-- ) {
+      *bi = *(ai++);
+	  bi += 2;
+    }
+}
+
+/* <summary>                             */  
+/* Inverse lazy transform (vertical).    */
+/* </summary>                            */ 
+void opj_dwt_interleave_v(opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x) {
+    OPJ_INT32 *ai = a;
+    OPJ_INT32 *bi = v->mem + v->cas;
+    OPJ_INT32  i = v->sn;
+    while( i-- ) {
+      *bi = *ai;
+	  bi += 2;
+	  ai += x;
+    }
+    ai = a + (v->sn * x);
+    bi = v->mem + 1 - v->cas;
+    i = v->dn ;
+    while( i-- ) {
+      *bi = *ai;
+	  bi += 2;  
+	  ai += x;
+    }
+}
+
+
+/* <summary>                            */
+/* Forward 5-3 wavelet transform in 1-D. */
+/* </summary>                           */
+void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
+	OPJ_INT32 i;
+	
+	if (!cas) {
+		if ((dn > 0) || (sn > 1)) {	/* NEW :  CASE ONE ELEMENT */
+			for (i = 0; i < dn; i++) OPJ_D(i) -= (OPJ_S_(i) + OPJ_S_(i + 1)) >> 1;
+			for (i = 0; i < sn; i++) OPJ_S(i) += (OPJ_D_(i - 1) + OPJ_D_(i) + 2) >> 2;
+		}
+	} else {
+		if (!sn && dn == 1)		    /* NEW :  CASE ONE ELEMENT */
+			OPJ_S(0) *= 2;
+		else {
+			for (i = 0; i < dn; i++) OPJ_S(i) -= (OPJ_DD_(i) + OPJ_DD_(i - 1)) >> 1;
+			for (i = 0; i < sn; i++) OPJ_D(i) += (OPJ_SS_(i) + OPJ_SS_(i + 1) + 2) >> 2;
+		}
+	}
+}
+
+/* <summary>                            */
+/* Inverse 5-3 wavelet transform in 1-D. */
+/* </summary>                           */ 
+void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
+	OPJ_INT32 i;
+	
+	if (!cas) {
+		if ((dn > 0) || (sn > 1)) { /* NEW :  CASE ONE ELEMENT */
+			for (i = 0; i < sn; i++) OPJ_S(i) -= (OPJ_D_(i - 1) + OPJ_D_(i) + 2) >> 2;
+			for (i = 0; i < dn; i++) OPJ_D(i) += (OPJ_S_(i) + OPJ_S_(i + 1)) >> 1;
+		}
+	} else {
+		if (!sn  && dn == 1)          /* NEW :  CASE ONE ELEMENT */
+			OPJ_S(0) /= 2;
+		else {
+			for (i = 0; i < sn; i++) OPJ_D(i) -= (OPJ_SS_(i) + OPJ_SS_(i + 1) + 2) >> 2;
+			for (i = 0; i < dn; i++) OPJ_S(i) += (OPJ_DD_(i) + OPJ_DD_(i - 1)) >> 1;
+		}
+	}
+}
+
+/* <summary>                            */
+/* Inverse 5-3 wavelet transform in 1-D. */
+/* </summary>                           */ 
+void opj_dwt_decode_1(opj_dwt_t *v) {
+	opj_dwt_decode_1_(v->mem, v->dn, v->sn, v->cas);
+}
+
+/* <summary>                             */
+/* Forward 9-7 wavelet transform in 1-D. */
+/* </summary>                            */
+void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
+	OPJ_INT32 i;
+	if (!cas) {
+		if ((dn > 0) || (sn > 1)) {	/* NEW :  CASE ONE ELEMENT */
+			for (i = 0; i < dn; i++)
+				OPJ_D(i) -= opj_int_fix_mul(OPJ_S_(i) + OPJ_S_(i + 1), 12993);
+			for (i = 0; i < sn; i++)
+				OPJ_S(i) -= opj_int_fix_mul(OPJ_D_(i - 1) + OPJ_D_(i), 434);
+			for (i = 0; i < dn; i++)
+				OPJ_D(i) += opj_int_fix_mul(OPJ_S_(i) + OPJ_S_(i + 1), 7233);
+			for (i = 0; i < sn; i++)
+				OPJ_S(i) += opj_int_fix_mul(OPJ_D_(i - 1) + OPJ_D_(i), 3633);
+			for (i = 0; i < dn; i++)
+				OPJ_D(i) = opj_int_fix_mul(OPJ_D(i), 5038);	/*5038 */
+			for (i = 0; i < sn; i++)
+				OPJ_S(i) = opj_int_fix_mul(OPJ_S(i), 6659);	/*6660 */
+		}
+	} else {
+		if ((sn > 0) || (dn > 1)) {	/* NEW :  CASE ONE ELEMENT */
+			for (i = 0; i < dn; i++)
+				OPJ_S(i) -= opj_int_fix_mul(OPJ_DD_(i) + OPJ_DD_(i - 1), 12993);
+			for (i = 0; i < sn; i++)
+				OPJ_D(i) -= opj_int_fix_mul(OPJ_SS_(i) + OPJ_SS_(i + 1), 434);
+			for (i = 0; i < dn; i++)
+				OPJ_S(i) += opj_int_fix_mul(OPJ_DD_(i) + OPJ_DD_(i - 1), 7233);
+			for (i = 0; i < sn; i++)
+				OPJ_D(i) += opj_int_fix_mul(OPJ_SS_(i) + OPJ_SS_(i + 1), 3633);
+			for (i = 0; i < dn; i++)
+				OPJ_S(i) = opj_int_fix_mul(OPJ_S(i), 5038);	/*5038 */
+			for (i = 0; i < sn; i++)
+				OPJ_D(i) = opj_int_fix_mul(OPJ_D(i), 6659);	/*6660 */
+		}
+	}
+}
+
+void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_stepsize_t *bandno_stepsize) {
+	OPJ_INT32 p, n;
+	p = opj_int_floorlog2(stepsize) - 13;
+	n = 11 - opj_int_floorlog2(stepsize);
+	bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
+	bandno_stepsize->expn = numbps - p;
+}
+
+/* 
+==========================================================
+   DWT interface
+==========================================================
+*/
+
+
+/* <summary>                            */
+/* Forward 5-3 wavelet transform in 2-D. */
+/* </summary>                           */
+INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,void (*p_function)(OPJ_INT32 *, OPJ_INT32,OPJ_INT32,OPJ_INT32) )
+{
+	OPJ_INT32 i, j, k;
+	OPJ_INT32 *a = 00;
+	OPJ_INT32 *aj = 00;
+	OPJ_INT32 *bj = 00;
+	OPJ_INT32 w, l;
+
+	OPJ_INT32 rw;			/* width of the resolution level computed   */
+	OPJ_INT32 rh;			/* height of the resolution level computed  */
+	OPJ_UINT32 l_data_size;
+
+	opj_tcd_resolution_t * l_cur_res = 0;
+	opj_tcd_resolution_t * l_last_res = 0;
+
+	w = tilec->x1-tilec->x0;
+	l = (OPJ_INT32)tilec->numresolutions-1;
+	a = tilec->data;
+
+	l_cur_res = tilec->resolutions + l;
+	l_last_res = l_cur_res - 1;
+
+	l_data_size = opj_dwt_max_resolution( tilec->resolutions,tilec->numresolutions) * (OPJ_UINT32)sizeof(OPJ_INT32);
+	bj = (OPJ_INT32*)opj_malloc((size_t)l_data_size);
+	if (! bj) {
+		return OPJ_FALSE;
+	}
+	i = l;
+
+	while (i--) {
+		OPJ_INT32 rw1;		/* width of the resolution level once lower than computed one                                       */
+		OPJ_INT32 rh1;		/* height of the resolution level once lower than computed one                                      */
+		OPJ_INT32 cas_col;	/* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
+		OPJ_INT32 cas_row;	/* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */
+		OPJ_INT32 dn, sn;
+
+		rw  = l_cur_res->x1 - l_cur_res->x0;
+		rh  = l_cur_res->y1 - l_cur_res->y0;
+		rw1 = l_last_res->x1 - l_last_res->x0;
+		rh1 = l_last_res->y1 - l_last_res->y0;
+
+		cas_row = l_cur_res->x0 & 1;
+		cas_col = l_cur_res->y0 & 1;
+
+		sn = rh1;
+		dn = rh - rh1;
+		for (j = 0; j < rw; ++j) {
+			aj = a + j;
+			for (k = 0; k < rh; ++k) {
+				bj[k] = aj[k*w];
+			}
+
+			(*p_function) (bj, dn, sn, cas_col);
+
+			opj_dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
+		}
+
+		sn = rw1;
+		dn = rw - rw1;
+
+		for (j = 0; j < rh; j++) {
+			aj = a + j * w;
+			for (k = 0; k < rw; k++)  bj[k] = aj[k];
+			(*p_function) (bj, dn, sn, cas_row);
+			opj_dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
+		}
+
+		l_cur_res = l_last_res;
+
+		--l_last_res;
+	}
+
+	opj_free(bj);
+	return OPJ_TRUE;
+}
+
+/* Forward 5-3 wavelet transform in 2-D. */
+/* </summary>                           */
+OPJ_BOOL opj_dwt_encode(opj_tcd_tilecomp_t * tilec)
+{
+	return opj_dwt_encode_procedure(tilec,opj_dwt_encode_1);
+}
+
+/* <summary>                            */
+/* Inverse 5-3 wavelet transform in 2-D. */
+/* </summary>                           */
+OPJ_BOOL opj_dwt_decode(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres) {
+	return opj_dwt_decode_tile(tilec, numres, &opj_dwt_decode_1);
+}
+
+
+/* <summary>                          */
+/* Get gain of 5-3 wavelet transform. */
+/* </summary>                         */
+OPJ_UINT32 opj_dwt_getgain(OPJ_UINT32 orient) {
+	if (orient == 0)
+		return 0;
+	if (orient == 1 || orient == 2)
+		return 1;
+	return 2;
+}
+
+/* <summary>                */
+/* Get norm of 5-3 wavelet. */
+/* </summary>               */
+OPJ_FLOAT64 opj_dwt_getnorm(OPJ_UINT32 level, OPJ_UINT32 orient) {
+	return opj_dwt_norms[orient][level];
+}
+
+/* <summary>                             */
+/* Forward 9-7 wavelet transform in 2-D. */
+/* </summary>                            */
+OPJ_BOOL opj_dwt_encode_real(opj_tcd_tilecomp_t * tilec)
+{
+	return opj_dwt_encode_procedure(tilec,opj_dwt_encode_1_real);
+}
+
+/* <summary>                          */
+/* Get gain of 9-7 wavelet transform. */
+/* </summary>                         */
+OPJ_UINT32 opj_dwt_getgain_real(OPJ_UINT32 orient) {
+	(void)orient;
+	return 0;
+}
+
+/* <summary>                */
+/* Get norm of 9-7 wavelet. */
+/* </summary>               */
+OPJ_FLOAT64 opj_dwt_getnorm_real(OPJ_UINT32 level, OPJ_UINT32 orient) {
+	return opj_dwt_norms_real[orient][level];
+}
+
+void opj_dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, OPJ_UINT32 prec) {
+	OPJ_UINT32 numbands, bandno;
+	numbands = 3 * tccp->numresolutions - 2;
+	for (bandno = 0; bandno < numbands; bandno++) {
+		OPJ_FLOAT64 stepsize;
+		OPJ_UINT32 resno, level, orient, gain;
+
+		resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1);
+		orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1);
+		level = tccp->numresolutions - 1 - resno;
+		gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2));
+		if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
+			stepsize = 1.0;
+		} else {
+			OPJ_FLOAT64 norm = opj_dwt_norms_real[orient][level];
+			stepsize = (1 << (gain)) / norm;
+		}
+		opj_dwt_encode_stepsize((OPJ_INT32) floor(stepsize * 8192.0), (OPJ_INT32)(prec + gain), &tccp->stepsizes[bandno]);
+	}
+}
+
+/* <summary>                             */
+/* Determine maximum computed resolution level for inverse wavelet transform */
+/* </summary>                            */
+OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i) {
+	OPJ_UINT32 mr	= 0;
+	OPJ_UINT32 w;
+	while( --i ) {
+		++r;
+		if( mr < ( w = (OPJ_UINT32)(r->x1 - r->x0) ) )
+			mr = w ;
+		if( mr < ( w = (OPJ_UINT32)(r->y1 - r->y0) ) )
+			mr = w ;
+	}
+	return mr ;
+}
+
+/* <summary>                            */
+/* Inverse wavelet transform in 2-D.     */
+/* </summary>                           */
+OPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres, DWT1DFN dwt_1D) {
+	opj_dwt_t h;
+	opj_dwt_t v;
+
+	opj_tcd_resolution_t* tr = tilec->resolutions;
+
+	OPJ_UINT32 rw = (OPJ_UINT32)(tr->x1 - tr->x0);	/* width of the resolution level computed */
+	OPJ_UINT32 rh = (OPJ_UINT32)(tr->y1 - tr->y0);	/* height of the resolution level computed */
+
+	OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+
+	h.mem = (OPJ_INT32*)
+	opj_aligned_malloc(opj_dwt_max_resolution(tr, numres) * sizeof(OPJ_INT32));
+	if (! h.mem){
+		return OPJ_FALSE;
+	}
+
+	v.mem = h.mem;
+
+	while( --numres) {
+		OPJ_INT32 * restrict tiledp = tilec->data;
+		OPJ_UINT32 j;
+
+		++tr;
+		h.sn = (OPJ_INT32)rw;
+		v.sn = (OPJ_INT32)rh;
+
+		rw = (OPJ_UINT32)(tr->x1 - tr->x0);
+		rh = (OPJ_UINT32)(tr->y1 - tr->y0);
+
+		h.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn);
+		h.cas = tr->x0 % 2;
+
+		for(j = 0; j < rh; ++j) {
+			opj_dwt_interleave_h(&h, &tiledp[j*w]);
+			(dwt_1D)(&h);
+			memcpy(&tiledp[j*w], h.mem, rw * sizeof(OPJ_INT32));
+		}
+
+		v.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn);
+		v.cas = tr->y0 % 2;
+
+		for(j = 0; j < rw; ++j){
+			OPJ_UINT32 k;
+			opj_dwt_interleave_v(&v, &tiledp[j], (OPJ_INT32)w);
+			(dwt_1D)(&v);
+			for(k = 0; k < rh; ++k) {
+				tiledp[k * w + j] = v.mem[k];
+			}
+		}
+	}
+	opj_aligned_free(h.mem);
+	return OPJ_TRUE;
+}
+
+void opj_v4dwt_interleave_h(opj_v4dwt_t* restrict w, OPJ_FLOAT32* restrict a, OPJ_INT32 x, OPJ_INT32 size){
+	OPJ_FLOAT32* restrict bi = (OPJ_FLOAT32*) (w->wavelet + w->cas);
+	OPJ_INT32 count = w->sn;
+	OPJ_INT32 i, k;
+
+	for(k = 0; k < 2; ++k){
+		if ( count + 3 * x < size && ((size_t) a & 0x0f) == 0 && ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0 ) {
+			/* Fast code path */
+			for(i = 0; i < count; ++i){
+				OPJ_INT32 j = i;
+				bi[i*8    ] = a[j];
+				j += x;
+				bi[i*8 + 1] = a[j];
+				j += x;
+				bi[i*8 + 2] = a[j];
+				j += x;
+				bi[i*8 + 3] = a[j];
+			}
+		}
+		else {
+			/* Slow code path */
+			for(i = 0; i < count; ++i){
+				OPJ_INT32 j = i;
+				bi[i*8    ] = a[j];
+				j += x;
+				if(j >= size) continue;
+				bi[i*8 + 1] = a[j];
+				j += x;
+				if(j >= size) continue;
+				bi[i*8 + 2] = a[j];
+				j += x;
+				if(j >= size) continue;
+				bi[i*8 + 3] = a[j]; /* This one*/
+			}
+		}
+
+		bi = (OPJ_FLOAT32*) (w->wavelet + 1 - w->cas);
+		a += w->sn;
+		size -= w->sn;
+		count = w->dn;
+	}
+}
+
+void opj_v4dwt_interleave_v(opj_v4dwt_t* restrict v , OPJ_FLOAT32* restrict a , OPJ_INT32 x, OPJ_INT32 nb_elts_read){
+	opj_v4_t* restrict bi = v->wavelet + v->cas;
+	OPJ_INT32 i;
+
+	for(i = 0; i < v->sn; ++i){
+		memcpy(&bi[i*2], &a[i*x], (size_t)nb_elts_read * sizeof(OPJ_FLOAT32));
+	}
+
+	a += v->sn * x;
+	bi = v->wavelet + 1 - v->cas;
+
+	for(i = 0; i < v->dn; ++i){
+		memcpy(&bi[i*2], &a[i*x], (size_t)nb_elts_read * sizeof(OPJ_FLOAT32));
+	}
+}
+
+#ifdef __SSE__
+
+void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c){
+	__m128* restrict vw = (__m128*) w;
+	OPJ_INT32 i;
+	/* 4x unrolled loop */
+	for(i = 0; i < count >> 2; ++i){
+		*vw = _mm_mul_ps(*vw, c);
+		vw += 2;
+		*vw = _mm_mul_ps(*vw, c);
+		vw += 2;
+		*vw = _mm_mul_ps(*vw, c);
+		vw += 2;
+		*vw = _mm_mul_ps(*vw, c);
+		vw += 2;
+	}
+	count &= 3;
+	for(i = 0; i < count; ++i){
+		*vw = _mm_mul_ps(*vw, c);
+		vw += 2;
+	}
+}
+
+void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, __m128 c){
+	__m128* restrict vl = (__m128*) l;
+	__m128* restrict vw = (__m128*) w;
+	OPJ_INT32 i;
+	__m128 tmp1, tmp2, tmp3;
+	tmp1 = vl[0];
+	for(i = 0; i < m; ++i){
+		tmp2 = vw[-1];
+		tmp3 = vw[ 0];
+		vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c));
+		tmp1 = tmp3;
+		vw += 2;
+	}
+	vl = vw - 2;
+	if(m >= k){
+		return;
+	}
+	c = _mm_add_ps(c, c);
+	c = _mm_mul_ps(c, vl[0]);
+	for(; m < k; ++m){
+		__m128 tmp = vw[-1];
+		vw[-1] = _mm_add_ps(tmp, c);
+		vw += 2;
+	}
+}
+
+#else
+
+void opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count, const OPJ_FLOAT32 c)
+{
+	OPJ_FLOAT32* restrict fw = (OPJ_FLOAT32*) w;
+	OPJ_INT32 i;
+	for(i = 0; i < count; ++i){
+		OPJ_FLOAT32 tmp1 = fw[i*8    ];
+		OPJ_FLOAT32 tmp2 = fw[i*8 + 1];
+		OPJ_FLOAT32 tmp3 = fw[i*8 + 2];
+		OPJ_FLOAT32 tmp4 = fw[i*8 + 3];
+		fw[i*8    ] = tmp1 * c;
+		fw[i*8 + 1] = tmp2 * c;
+		fw[i*8 + 2] = tmp3 * c;
+		fw[i*8 + 3] = tmp4 * c;
+	}
+}
+
+void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, OPJ_FLOAT32 c)
+{
+	OPJ_FLOAT32* restrict fl = (OPJ_FLOAT32*) l;
+	OPJ_FLOAT32* restrict fw = (OPJ_FLOAT32*) w;
+	OPJ_INT32 i;
+	for(i = 0; i < m; ++i){
+		OPJ_FLOAT32 tmp1_1 = fl[0];
+		OPJ_FLOAT32 tmp1_2 = fl[1];
+		OPJ_FLOAT32 tmp1_3 = fl[2];
+		OPJ_FLOAT32 tmp1_4 = fl[3];
+		OPJ_FLOAT32 tmp2_1 = fw[-4];
+		OPJ_FLOAT32 tmp2_2 = fw[-3];
+		OPJ_FLOAT32 tmp2_3 = fw[-2];
+		OPJ_FLOAT32 tmp2_4 = fw[-1];
+		OPJ_FLOAT32 tmp3_1 = fw[0];
+		OPJ_FLOAT32 tmp3_2 = fw[1];
+		OPJ_FLOAT32 tmp3_3 = fw[2];
+		OPJ_FLOAT32 tmp3_4 = fw[3];
+		fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c);
+		fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c);
+		fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c);
+		fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c);
+		fl = fw;
+		fw += 8;
+	}
+	if(m < k){
+		OPJ_FLOAT32 c1;
+		OPJ_FLOAT32 c2;
+		OPJ_FLOAT32 c3;
+		OPJ_FLOAT32 c4;
+		c += c;
+		c1 = fl[0] * c;
+		c2 = fl[1] * c;
+		c3 = fl[2] * c;
+		c4 = fl[3] * c;
+		for(; m < k; ++m){
+			OPJ_FLOAT32 tmp1 = fw[-4];
+			OPJ_FLOAT32 tmp2 = fw[-3];
+			OPJ_FLOAT32 tmp3 = fw[-2];
+			OPJ_FLOAT32 tmp4 = fw[-1];
+			fw[-4] = tmp1 + c1;
+			fw[-3] = tmp2 + c2;
+			fw[-2] = tmp3 + c3;
+			fw[-1] = tmp4 + c4;
+			fw += 8;
+		}
+	}
+}
+
+#endif
+
+/* <summary>                             */
+/* Inverse 9-7 wavelet transform in 1-D. */
+/* </summary>                            */
+void opj_v4dwt_decode(opj_v4dwt_t* restrict dwt)
+{
+	OPJ_INT32 a, b;
+	if(dwt->cas == 0) {
+		if(!((dwt->dn > 0) || (dwt->sn > 1))){
+			return;
+		}
+		a = 0;
+		b = 1;
+	}else{
+		if(!((dwt->sn > 0) || (dwt->dn > 1))) {
+			return;
+		}
+		a = 1;
+		b = 0;
+	}
+#ifdef __SSE__
+	opj_v4dwt_decode_step1_sse(dwt->wavelet+a, dwt->sn, _mm_set1_ps(opj_K));
+	opj_v4dwt_decode_step1_sse(dwt->wavelet+b, dwt->dn, _mm_set1_ps(opj_c13318));
+	opj_v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(opj_dwt_delta));
+	opj_v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(opj_dwt_gamma));
+	opj_v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(opj_dwt_beta));
+	opj_v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(opj_dwt_alpha));
+#else
+	opj_v4dwt_decode_step1(dwt->wavelet+a, dwt->sn, opj_K);
+	opj_v4dwt_decode_step1(dwt->wavelet+b, dwt->dn, opj_c13318);
+	opj_v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), opj_dwt_delta);
+	opj_v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), opj_dwt_gamma);
+	opj_v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), opj_dwt_beta);
+	opj_v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), opj_dwt_alpha);
+#endif
+}
+
+
+/* <summary>                             */
+/* Inverse 9-7 wavelet transform in 2-D. */
+/* </summary>                            */
+OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, OPJ_UINT32 numres)
+{
+	opj_v4dwt_t h;
+	opj_v4dwt_t v;
+
+	opj_tcd_resolution_t* res = tilec->resolutions;
+
+	OPJ_UINT32 rw = (OPJ_UINT32)(res->x1 - res->x0);	/* width of the resolution level computed */
+	OPJ_UINT32 rh = (OPJ_UINT32)(res->y1 - res->y0);	/* height of the resolution level computed */
+
+	OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+
+	h.wavelet = (opj_v4_t*) opj_aligned_malloc((opj_dwt_max_resolution(res, numres)+5) * sizeof(opj_v4_t));
+	v.wavelet = h.wavelet;
+
+	while( --numres) {
+		OPJ_FLOAT32 * restrict aj = (OPJ_FLOAT32*) tilec->data;
+		OPJ_UINT32 bufsize = (OPJ_UINT32)((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0));
+		OPJ_INT32 j;
+
+		h.sn = (OPJ_INT32)rw;
+		v.sn = (OPJ_INT32)rh;
+
+		++res;
+
+		rw = (OPJ_UINT32)(res->x1 - res->x0);	/* width of the resolution level computed */
+		rh = (OPJ_UINT32)(res->y1 - res->y0);	/* height of the resolution level computed */
+
+		h.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn);
+		h.cas = res->x0 % 2;
+
+		for(j = (OPJ_INT32)rh; j > 3; j -= 4) {
+			OPJ_INT32 k;
+			opj_v4dwt_interleave_h(&h, aj, (OPJ_INT32)w, (OPJ_INT32)bufsize);
+			opj_v4dwt_decode(&h);
+
+			for(k = (OPJ_INT32)rw; --k >= 0;){
+				aj[k               ] = h.wavelet[k].f[0];
+				aj[k+(OPJ_INT32)w  ] = h.wavelet[k].f[1];
+				aj[k+(OPJ_INT32)w*2] = h.wavelet[k].f[2];
+				aj[k+(OPJ_INT32)w*3] = h.wavelet[k].f[3];
+			}
+
+			aj += w*4;
+			bufsize -= w*4;
+		}
+
+		if (rh & 0x03) {
+			OPJ_INT32 k;
+			j = rh & 0x03;
+			opj_v4dwt_interleave_h(&h, aj, (OPJ_INT32)w, (OPJ_INT32)bufsize);
+			opj_v4dwt_decode(&h);
+			for(k = (OPJ_INT32)rw; --k >= 0;){
+				switch(j) {
+					case 3: aj[k+(OPJ_INT32)w*2] = h.wavelet[k].f[2];
+					case 2: aj[k+(OPJ_INT32)w  ] = h.wavelet[k].f[1];
+					case 1: aj[k               ] = h.wavelet[k].f[0];
+				}
+			}
+		}
+
+		v.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn);
+		v.cas = res->y0 % 2;
+
+		aj = (OPJ_FLOAT32*) tilec->data;
+		for(j = (OPJ_INT32)rw; j > 3; j -= 4){
+			OPJ_UINT32 k;
+
+			opj_v4dwt_interleave_v(&v, aj, (OPJ_INT32)w, 4);
+			opj_v4dwt_decode(&v);
+
+			for(k = 0; k < rh; ++k){
+				memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(OPJ_FLOAT32));
+			}
+			aj += 4;
+		}
+
+		if (rw & 0x03){
+			OPJ_UINT32 k;
+
+			j = rw & 0x03;
+
+			opj_v4dwt_interleave_v(&v, aj, (OPJ_INT32)w, j);
+			opj_v4dwt_decode(&v);
+
+			for(k = 0; k < rh; ++k){
+				memcpy(&aj[k*w], &v.wavelet[k], (size_t)j * sizeof(OPJ_FLOAT32));
+			}
+		}
+	}
+
+	opj_aligned_free(h.wavelet);
+	return OPJ_TRUE;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.h
new file mode 100644
index 0000000..f8b57bc
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.h
@@ -0,0 +1,122 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __DWT_H
+#define __DWT_H
+/**
+@file dwt.h
+@brief Implementation of a discrete wavelet transform (DWT)
+
+The functions in DWT.C have for goal to realize forward and inverse discret wavelet
+transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in
+DWT.C are used by some function in TCD.C.
+*/
+
+/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
+/*@{*/
+
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Forward 5-3 wavelet tranform in 2-D. 
+Apply a reversible DWT transform to a component of an image.
+@param tilec Tile component information (current tile)
+*/
+OPJ_BOOL opj_dwt_encode(opj_tcd_tilecomp_t * tilec);
+
+/**
+Inverse 5-3 wavelet tranform in 2-D.
+Apply a reversible inverse DWT transform to a component of an image.
+@param tilec Tile component information (current tile)
+@param numres Number of resolution levels to decode
+*/
+OPJ_BOOL opj_dwt_decode(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres);
+
+/**
+Get the gain of a subband for the reversible 5-3 DWT.
+@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
+@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise
+*/
+OPJ_UINT32 opj_dwt_getgain(OPJ_UINT32 orient) ;
+/**
+Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT.
+@param level Level of the wavelet function
+@param orient Band of the wavelet function
+@return Returns the norm of the wavelet function
+*/
+OPJ_FLOAT64 opj_dwt_getnorm(OPJ_UINT32 level, OPJ_UINT32 orient);
+/**
+Forward 9-7 wavelet transform in 2-D. 
+Apply an irreversible DWT transform to a component of an image.
+@param tilec Tile component information (current tile)
+*/
+OPJ_BOOL opj_dwt_encode_real(opj_tcd_tilecomp_t * tilec);
+/**
+Inverse 9-7 wavelet transform in 2-D. 
+Apply an irreversible inverse DWT transform to a component of an image.
+@param tilec Tile component information (current tile)
+@param numres Number of resolution levels to decode
+*/
+OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, OPJ_UINT32 numres);
+
+/**
+Get the gain of a subband for the irreversible 9-7 DWT.
+@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
+@return Returns the gain of the 9-7 wavelet transform
+*/
+OPJ_UINT32 opj_dwt_getgain_real(OPJ_UINT32 orient);
+/**
+Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT
+@param level Level of the wavelet function
+@param orient Band of the wavelet function
+@return Returns the norm of the 9-7 wavelet
+*/
+OPJ_FLOAT64 opj_dwt_getnorm_real(OPJ_UINT32 level, OPJ_UINT32 orient);
+/**
+Explicit calculation of the Quantization Stepsizes 
+@param tccp Tile-component coding parameters
+@param prec Precint analyzed
+*/
+void opj_dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, OPJ_UINT32 prec);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __DWT_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.c
new file mode 100644
index 0000000..b6034b4
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.c
@@ -0,0 +1,146 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/* ==========================================================
+     Utility functions
+   ==========================================================*/
+
+#ifdef OPJ_CODE_NOT_USED
+#ifndef _WIN32
+static char*
+i2a(unsigned i, char *a, unsigned r) {
+	if (i/r > 0) a = i2a(i/r,a,r);
+	*a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i%r];
+	return a+1;
+}
+
+/** 
+ Transforms integer i into an ascii string and stores the result in a; 
+ string is encoded in the base indicated by r.
+ @param i Number to be converted
+ @param a String result
+ @param r Base of value; must be in the range 2 - 36
+ @return Returns a
+*/
+static char *
+_itoa(int i, char *a, int r) {
+	r = ((r < 2) || (r > 36)) ? 10 : r;
+	if(i < 0) {
+		*a = '-';
+		*i2a(-i, a+1, r) = 0;
+	}
+	else *i2a(i, a, r) = 0;
+	return a;
+}
+
+#endif /* !_WIN32 */
+#endif
+
+/* ----------------------------------------------------------------------- */
+/**
+ * Default callback function.
+ * Do nothing.
+ */
+static void opj_default_callback (const char *msg, void *client_data)
+{
+    OPJ_ARG_NOT_USED(msg);
+    OPJ_ARG_NOT_USED(client_data);
+}
+
+/* ----------------------------------------------------------------------- */
+
+
+/* ----------------------------------------------------------------------- */
+OPJ_BOOL opj_event_msg(opj_event_mgr_t* p_event_mgr, OPJ_INT32 event_type, const char *fmt, ...) {
+#define OPJ_MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */
+	opj_msg_callback msg_handler = 00;
+	void * l_data = 00;
+
+	if(p_event_mgr != 00) {
+		switch(event_type) {
+			case EVT_ERROR:
+				msg_handler = p_event_mgr->error_handler;
+				l_data = p_event_mgr->m_error_data;
+				break;
+			case EVT_WARNING:
+				msg_handler = p_event_mgr->warning_handler;
+				l_data = p_event_mgr->m_warning_data;
+				break;
+			case EVT_INFO:
+				msg_handler = p_event_mgr->info_handler;
+				l_data = p_event_mgr->m_info_data;
+				break;
+			default:
+				break;
+		}
+		if(msg_handler == 00) {
+			return OPJ_FALSE;
+		}
+	} else {
+		return OPJ_FALSE;
+	}
+
+	if ((fmt != 00) && (p_event_mgr != 00)) {
+		va_list arg;
+		size_t str_length/*, i, j*/; /* UniPG */
+		char message[OPJ_MSG_SIZE];
+		memset(message, 0, OPJ_MSG_SIZE);
+		/* initialize the optional parameter list */
+		va_start(arg, fmt);
+		/* check the length of the format string */
+		str_length = (strlen(fmt) > OPJ_MSG_SIZE) ? OPJ_MSG_SIZE : strlen(fmt);
+        (void)str_length;
+		/* parse the format string and put the result in 'message' */
+		vsnprintf(message, OPJ_MSG_SIZE, fmt, arg); /* UniPG */
+		/* deinitialize the optional parameter list */
+		va_end(arg);
+
+		/* output the message to the user program */
+		msg_handler(message, l_data);
+	}
+
+	return OPJ_TRUE;
+}
+
+void opj_set_default_event_handler(opj_event_mgr_t * p_manager)
+{
+	p_manager->m_error_data = 00;
+	p_manager->m_warning_data = 00;
+	p_manager->m_info_data = 00;
+	p_manager->error_handler = opj_default_callback;
+	p_manager->info_handler = opj_default_callback;
+	p_manager->warning_handler = opj_default_callback;
+}
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.h
new file mode 100644
index 0000000..88e0395
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.h
@@ -0,0 +1,102 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __EVENT_H
+#define __EVENT_H
+/**
+@file event.h
+@brief Implementation of a event callback system
+
+The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user.
+*/
+/**
+Message handler object
+used for 
+<ul>
+<li>Error messages
+<li>Warning messages
+<li>Debugging messages
+</ul>
+*/
+typedef struct opj_event_mgr 
+{
+	/** Data to call the event manager upon */
+	void *			m_error_data;
+	/** Data to call the event manager upon */
+	void *			m_warning_data;
+	/** Data to call the event manager upon */
+	void *			m_info_data;
+	/** Error message callback if available, NULL otherwise */
+	opj_msg_callback error_handler;
+	/** Warning message callback if available, NULL otherwise */
+	opj_msg_callback warning_handler;
+	/** Debug message callback if available, NULL otherwise */
+	opj_msg_callback info_handler;
+} opj_event_mgr_t;
+
+
+#define EVT_ERROR	1	/**< Error event type */
+#define EVT_WARNING	2	/**< Warning event type */
+#define EVT_INFO	4	/**< Debug event type */
+
+/** @defgroup EVENT EVENT - Implementation of a event callback system */
+/*@{*/
+
+/** @name Exported functions (see also openjpeg.h) */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Write formatted data to a string and send the string to a user callback.
+ *
+ * @param event_mgr			Event handler
+ * @param event_type 		Event type or callback to use to send the message
+ * @param fmt 				Format-control string (plus optional arguments)
+ *
+ * @return Returns true if successful, returns false otherwise
+ */
+OPJ_BOOL opj_event_msg(opj_event_mgr_t* event_mgr, OPJ_INT32 event_type, const char *fmt, ...);
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Set the event manager with the default callback function for the 3 levels.
+ */
+void opj_set_default_event_handler(opj_event_mgr_t * p_manager);
+
+/*@}*/
+
+/*@}*/
+
+#endif /* __EVENT_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.c
new file mode 100644
index 0000000..4c8aae6
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.c
@@ -0,0 +1,119 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/**
+ * Default size of the validation list, if not sufficient, data will be reallocated with a double size.
+ */
+#define OPJ_VALIDATION_SIZE 10
+
+opj_procedure_list_t *  opj_procedure_list_create()
+{
+        /* memory allocation */
+        opj_procedure_list_t * l_validation = (opj_procedure_list_t *) opj_malloc(sizeof(opj_procedure_list_t));
+        if (! l_validation)
+        {
+                return 00;
+        }
+        /* initialization */
+        memset(l_validation,0,sizeof(opj_procedure_list_t));
+        l_validation->m_nb_max_procedures = OPJ_VALIDATION_SIZE;
+        l_validation->m_procedures = (opj_procedure*)opj_malloc(
+                OPJ_VALIDATION_SIZE * sizeof(opj_procedure));
+        if (! l_validation->m_procedures)
+        {
+                opj_free(l_validation);
+                return 00;
+        }
+        memset(l_validation->m_procedures,0,OPJ_VALIDATION_SIZE * sizeof(opj_procedure));
+        return l_validation;
+}
+
+void  opj_procedure_list_destroy(opj_procedure_list_t * p_list)
+{
+        if (! p_list)
+        {
+                return;
+        }
+        /* initialization */
+        if (p_list->m_procedures)
+        {
+                opj_free(p_list->m_procedures);
+        }
+        opj_free(p_list);
+}
+
+OPJ_BOOL opj_procedure_list_add_procedure (opj_procedure_list_t * p_validation_list, opj_procedure p_procedure)
+{
+        if (p_validation_list->m_nb_max_procedures == p_validation_list->m_nb_procedures)
+        {
+                opj_procedure * new_procedures;
+
+                p_validation_list->m_nb_max_procedures += OPJ_VALIDATION_SIZE;
+                new_procedures = (opj_procedure*)opj_realloc(
+                        p_validation_list->m_procedures,
+                        p_validation_list->m_nb_max_procedures * sizeof(opj_procedure));
+                if (! new_procedures)
+                {
+                        opj_free(p_validation_list->m_procedures);
+                        p_validation_list->m_nb_max_procedures = 0;
+                        p_validation_list->m_nb_procedures = 0;
+                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add a new validation procedure\n"); */
+                        fprintf(stderr, "Not enough memory to add a new validation procedure\n");
+                        
+                        return OPJ_FALSE;
+                }
+                else
+                {
+                        p_validation_list->m_procedures = new_procedures;
+                }
+        }
+        p_validation_list->m_procedures[p_validation_list->m_nb_procedures] = p_procedure;
+        ++p_validation_list->m_nb_procedures;
+
+        return OPJ_TRUE;
+}
+
+OPJ_UINT32 opj_procedure_list_get_nb_procedures (opj_procedure_list_t * p_validation_list)
+{
+        return p_validation_list->m_nb_procedures;
+}
+
+opj_procedure* opj_procedure_list_get_first_procedure (opj_procedure_list_t * p_validation_list)
+{
+        return p_validation_list->m_procedures;
+}
+
+void opj_procedure_list_clear (opj_procedure_list_t * p_validation_list)
+{
+        p_validation_list->m_nb_procedures = 0;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.h
new file mode 100644
index 0000000..749ad9e
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.h
@@ -0,0 +1,131 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __FUNCTION_LIST_H
+#define __FUNCTION_LIST_H
+
+/** 
+ * @file function_list.h
+ * @brief Implementation of a list of procedures.
+
+ * The functions in validation.c aims to have access to a list of procedures.
+*/
+
+/** @defgroup VAL VAL - validation procedure*/
+/*@{*/
+
+/**************************************************************************************************
+ ***************************************** FORWARD DECLARATION ************************************
+ **************************************************************************************************/
+
+/**
+ * declare a function pointer
+ */
+typedef void (*opj_procedure)(void);
+
+/**
+ * A list of procedures.
+*/
+typedef struct opj_procedure_list 
+{
+	/**
+	 * The number of validation procedures.
+	 */
+	OPJ_UINT32 m_nb_procedures;
+	/**
+	 * The number of the array of validation procedures.
+	 */
+	OPJ_UINT32 m_nb_max_procedures;
+	/**
+	 * The array of procedures.
+	 */
+	opj_procedure * m_procedures;
+
+} opj_procedure_list_t;
+
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Creates a validation list.
+ *
+ * @return	the newly created validation list.
+ */
+opj_procedure_list_t *  opj_procedure_list_create(void);
+
+/**
+ * Destroys a validation list.
+ *
+ * @param p_list the list to destroy.
+ */
+void  opj_procedure_list_destroy(opj_procedure_list_t * p_list);
+
+/**
+ * Adds a new validation procedure.
+ *
+ * @param	p_validation_list the list of procedure to modify.
+ * @param	p_procedure		the procedure to add.
+ *
+ * @return	OPJ_TRUE if the procedure could be added.
+ */
+OPJ_BOOL opj_procedure_list_add_procedure (opj_procedure_list_t * p_validation_list, opj_procedure p_procedure);
+
+/**
+ * Gets the number of validation procedures.
+ *
+ * @param	p_validation_list the list of procedure to modify.
+ *
+ * @return the number of validation procedures.
+ */
+OPJ_UINT32 opj_procedure_list_get_nb_procedures (opj_procedure_list_t * p_validation_list);
+
+/**
+ * Gets the pointer on the first validation procedure. This function is similar to the C++
+ * iterator class to iterate through all the procedures inside the validation list.
+ * the caller does not take ownership of the pointer.
+ *
+ * @param	p_validation_list the list of procedure to get the first procedure from.
+ *
+ * @return	a pointer to the first procedure.
+ */
+opj_procedure* opj_procedure_list_get_first_procedure (opj_procedure_list_t * p_validation_list);
+
+
+/**
+ * Clears the list of validation procedures.
+ *
+ * @param	p_validation_list the list of procedure to clear.
+ *
+ */
+void opj_procedure_list_clear (opj_procedure_list_t * p_validation_list);
+/*@}*/
+
+#endif /* __FUNCTION_LIST_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.c
new file mode 100644
index 0000000..2c3540c
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.c
@@ -0,0 +1,240 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+opj_image_t* opj_image_create0(void) {
+	opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t));
+	return image;
+}
+
+opj_image_t* OPJ_CALLCONV opj_image_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
+	OPJ_UINT32 compno;
+	opj_image_t *image = NULL;
+
+	image = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t));
+	if(image) {
+		image->color_space = clrspc;
+		image->numcomps = numcmpts;
+		/* allocate memory for the per-component information */
+		image->comps = (opj_image_comp_t*)opj_calloc(1,image->numcomps * sizeof(opj_image_comp_t));
+		if(!image->comps) {
+			fprintf(stderr,"Unable to allocate memory for image.\n");
+			opj_image_destroy(image);
+			return NULL;
+		}
+		/* create the individual image components */
+		for(compno = 0; compno < numcmpts; compno++) {
+			opj_image_comp_t *comp = &image->comps[compno];
+			comp->dx = cmptparms[compno].dx;
+			comp->dy = cmptparms[compno].dy;
+			comp->w = cmptparms[compno].w;
+			comp->h = cmptparms[compno].h;
+			comp->x0 = cmptparms[compno].x0;
+			comp->y0 = cmptparms[compno].y0;
+			comp->prec = cmptparms[compno].prec;
+			comp->bpp = cmptparms[compno].bpp;
+			comp->sgnd = cmptparms[compno].sgnd;
+			comp->data = (OPJ_INT32*) opj_calloc(comp->w * comp->h, sizeof(OPJ_INT32));
+			if(!comp->data) {
+				fprintf(stderr,"Unable to allocate memory for image.\n");
+				opj_image_destroy(image);
+				return NULL;
+			}
+		}
+	}
+
+	return image;
+}
+
+void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) {
+	if(image) {
+		if(image->comps) {
+			OPJ_UINT32 compno;
+
+			/* image components */
+			for(compno = 0; compno < image->numcomps; compno++) {
+				opj_image_comp_t *image_comp = &(image->comps[compno]);
+				if(image_comp->data) {
+					opj_free(image_comp->data);
+				}
+			}
+			opj_free(image->comps);
+		}
+
+		if(image->icc_profile_buf) {
+			opj_free(image->icc_profile_buf);
+		}
+
+		opj_free(image);
+	}
+}
+
+/**
+ * Updates the components characteristics of the image from the coding parameters.
+ *
+ * @param p_image_header	the image header to update.
+ * @param p_cp				the coding parameters from which to update the image.
+ */
+void opj_image_comp_header_update(opj_image_t * p_image_header, const struct opj_cp * p_cp)
+{
+	OPJ_UINT32 i, l_width, l_height;
+	OPJ_INT32 l_x0, l_y0, l_x1, l_y1;
+	OPJ_INT32 l_comp_x0, l_comp_y0, l_comp_x1, l_comp_y1;
+	opj_image_comp_t* l_img_comp = NULL;
+
+	l_x0 = opj_int_max((OPJ_INT32)p_cp->tx0 , (OPJ_INT32)p_image_header->x0);
+	l_y0 = opj_int_max((OPJ_INT32)p_cp->ty0 , (OPJ_INT32)p_image_header->y0);
+	l_x1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + p_cp->tw * p_cp->tdx), (OPJ_INT32)p_image_header->x1);
+	l_y1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + p_cp->th * p_cp->tdy), (OPJ_INT32)p_image_header->y1);
+
+	l_img_comp = p_image_header->comps;
+	for	(i = 0; i < p_image_header->numcomps; ++i) {
+		l_comp_x0 = opj_int_ceildiv(l_x0, (OPJ_INT32)l_img_comp->dx);
+		l_comp_y0 = opj_int_ceildiv(l_y0, (OPJ_INT32)l_img_comp->dy);
+		l_comp_x1 = opj_int_ceildiv(l_x1, (OPJ_INT32)l_img_comp->dx);
+		l_comp_y1 = opj_int_ceildiv(l_y1, (OPJ_INT32)l_img_comp->dy);
+		l_width = (OPJ_UINT32)opj_int_ceildivpow2(l_comp_x1 - l_comp_x0, (OPJ_INT32)l_img_comp->factor);
+		l_height = (OPJ_UINT32)opj_int_ceildivpow2(l_comp_y1 - l_comp_y0, (OPJ_INT32)l_img_comp->factor);
+		l_img_comp->w = l_width;
+		l_img_comp->h = l_height;
+		l_img_comp->x0 = (OPJ_UINT32)l_comp_x0/*l_x0*/;
+		l_img_comp->y0 = (OPJ_UINT32)l_comp_y0/*l_y0*/;
+		++l_img_comp;
+	}
+}
+
+
+/**
+ * Copy only header of image and its component header (no data are copied)
+ * if dest image have data, they will be freed
+ *
+ * @param	p_image_src		the src image
+ * @param	p_image_dest	the dest image
+ *
+ */
+void opj_copy_image_header(const opj_image_t* p_image_src, opj_image_t* p_image_dest)
+{
+	OPJ_UINT32 compno;
+
+	/* preconditions */
+	assert(p_image_src != 00);
+	assert(p_image_dest != 00);
+
+	p_image_dest->x0 = p_image_src->x0;
+	p_image_dest->y0 = p_image_src->y0;
+	p_image_dest->x1 = p_image_src->x1;
+	p_image_dest->y1 = p_image_src->y1;
+
+	if (p_image_dest->comps){
+		for(compno = 0; compno < p_image_dest->numcomps; compno++) {
+			opj_image_comp_t *image_comp = &(p_image_dest->comps[compno]);
+			if(image_comp->data) {
+				opj_free(image_comp->data);
+			}
+		}
+		opj_free(p_image_dest->comps);
+		p_image_dest->comps = NULL;
+	}
+
+	p_image_dest->numcomps = p_image_src->numcomps;
+
+	p_image_dest->comps = (opj_image_comp_t*) opj_malloc(p_image_dest->numcomps * sizeof(opj_image_comp_t));
+	if (!p_image_dest->comps){
+		p_image_dest->comps = NULL;
+		p_image_dest->numcomps = 0;
+		return;
+	}
+
+	for (compno=0; compno < p_image_dest->numcomps; compno++){
+		memcpy( &(p_image_dest->comps[compno]),
+				&(p_image_src->comps[compno]),
+				sizeof(opj_image_comp_t));
+		p_image_dest->comps[compno].data = NULL;
+	}
+
+	p_image_dest->color_space = p_image_src->color_space;
+	p_image_dest->icc_profile_len = p_image_src->icc_profile_len;
+
+	if (p_image_dest->icc_profile_len) {
+		p_image_dest->icc_profile_buf = (OPJ_BYTE*)opj_malloc(p_image_dest->icc_profile_len);
+		if (!p_image_dest->icc_profile_buf){
+			p_image_dest->icc_profile_buf = NULL;
+			p_image_dest->icc_profile_len = 0;
+			return;
+		}
+		memcpy( p_image_dest->icc_profile_buf,
+				p_image_src->icc_profile_buf,
+				p_image_src->icc_profile_len);
+		}
+		else
+			p_image_dest->icc_profile_buf = NULL;
+
+	return;
+}
+
+opj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
+	OPJ_UINT32 compno;
+	opj_image_t *image = 00;
+
+	image = (opj_image_t*) opj_malloc(sizeof(opj_image_t));
+	if (image)
+	{
+		memset(image,0,sizeof(opj_image_t));
+		
+		image->color_space = clrspc;
+		image->numcomps = numcmpts;
+		
+		/* allocate memory for the per-component information */
+		image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t));
+		if (!image->comps) {
+			opj_image_destroy(image);
+			return 00;
+		}
+		memset(image->comps,0,image->numcomps * sizeof(opj_image_comp_t));
+		
+		/* create the individual image components */
+		for(compno = 0; compno < numcmpts; compno++) {
+			opj_image_comp_t *comp = &image->comps[compno];
+			comp->dx = cmptparms[compno].dx;
+			comp->dy = cmptparms[compno].dy;
+			comp->w = cmptparms[compno].w;
+			comp->h = cmptparms[compno].h;
+			comp->x0 = cmptparms[compno].x0;
+			comp->y0 = cmptparms[compno].y0;
+			comp->prec = cmptparms[compno].prec;
+			comp->sgnd = cmptparms[compno].sgnd;
+			comp->data = 0;
+		}
+	}
+
+	return image;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.h
new file mode 100644
index 0000000..e0e2772
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.h
@@ -0,0 +1,68 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __IMAGE_H
+#define __IMAGE_H
+/**
+@file image.h
+@brief Implementation of operations on images (IMAGE)
+
+The functions in IMAGE.C have for goal to realize operations on images.
+*/
+
+struct opj_image;
+struct opj_cp;
+
+/** @defgroup IMAGE IMAGE - Implementation of operations on images */
+/*@{*/
+
+/**
+ * Create an empty image
+ *
+ * @return returns an empty image if successful, returns NULL otherwise
+ */
+opj_image_t* opj_image_create0(void);
+
+
+
+/**
+ * Updates the components characteristics of the image from the coding parameters.
+ *
+ * @param p_image_header		the image header to update.
+ * @param p_cp					the coding parameters from which to update the image.
+ */
+void opj_image_comp_header_update(opj_image_t * p_image, const struct opj_cp* p_cp);
+
+void opj_copy_image_header(const opj_image_t* p_image_src, opj_image_t* p_image_dest);
+
+/*@}*/
+
+#endif /* __IMAGE_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/indexbox_manager.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/indexbox_manager.h
new file mode 100644
index 0000000..ec5525f
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/indexbox_manager.h
@@ -0,0 +1,148 @@
+/*
+ * $Id: indexbox_manager.h 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*! \file
+ *  \brief Modification of jpip.c from 2KAN indexer
+ */
+
+#ifndef  INDEXBOX_MANAGER_H_
+# define INDEXBOX_MANAGER_H_
+
+#include "openjpeg.h"
+#include "j2k.h" /* needed to use jp2.h */
+#include "jp2.h"
+
+#define JPIP_CIDX 0x63696478   /* Codestream index                */
+#define JPIP_CPTR 0x63707472   /* Codestream Finder Box           */
+#define JPIP_MANF 0x6d616e66   /* Manifest Box                    */
+#define JPIP_FAIX 0x66616978   /* Fragment array Index box        */
+#define JPIP_MHIX 0x6d686978   /* Main Header Index Table         */
+#define JPIP_TPIX 0x74706978   /* Tile-part Index Table box       */
+#define JPIP_THIX 0x74686978   /* Tile header Index Table box     */
+#define JPIP_PPIX 0x70706978   /* Precinct Packet Index Table box */
+#define JPIP_PHIX 0x70686978   /* Packet Header index Table       */
+#define JPIP_FIDX 0x66696478   /* File Index                      */
+#define JPIP_FPTR 0x66707472   /* File Finder                     */
+#define JPIP_PRXY 0x70727879   /* Proxy boxes                     */
+#define JPIP_IPTR 0x69707472   /* Index finder box                */
+#define JPIP_PHLD 0x70686c64   /* Place holder                    */
+
+
+/* 
+ * Write tile-part Index table box (superbox)
+ *
+ * @param[in] coff      offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] j2klen    length of j2k codestream
+ * @param[in] cio       file output handle
+ * @return              length of tpix box
+ */
+int opj_write_tpix( int coff, opj_codestream_info_t cstr_info, int j2klen, opj_stream_private_t *cio,
+              opj_event_mgr_t * p_manager );
+
+
+/* 
+ * Write tile header index table box (superbox)
+ *
+ * @param[in] coff      offset of j2k codestream
+ * @param[in] cstr_info codestream information pointer
+ * @param[in] cio       file output handle
+ * @return              length of thix box
+ */
+int opj_write_thix( int coff, opj_codestream_info_t cstr_info, opj_stream_private_t *cio, opj_event_mgr_t * p_manager );
+
+
+/* 
+ * Write precinct packet index table box (superbox)
+ *
+ * @param[in] coff      offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] EPHused   true if EPH option used
+ * @param[in] j2klen    length of j2k codestream
+ * @param[in] cio       file output handle
+ * @return              length of ppix box
+ */
+int opj_write_ppix( int coff, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
+              opj_event_mgr_t * p_manager );
+
+
+/* 
+ * Write packet header index table box (superbox)
+ *
+ * @param[in] coff      offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] EPHused   true if EPH option used
+ * @param[in] j2klen    length of j2k codestream
+ * @param[in] cio       file output handle
+ * @return              length of ppix box
+ */
+int opj_write_phix( int coff, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
+              opj_event_mgr_t * p_manager );
+
+/* 
+ * Wriet manifest box (box)
+ *
+ * @param[in] second number to be visited
+ * @param[in] v      number of boxes
+ * @param[in] box    box to be manifested
+ * @param[in] cio    file output handle
+ */
+
+void opj_write_manf(int second, 
+                    int v, 
+                    opj_jp2_box_t *box, 
+                    opj_stream_private_t *cio,
+                    opj_event_mgr_t * p_manager );
+
+/* 
+ * Write main header index table (box)
+ *
+ * @param[in] coff offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] cio  file output handle
+ * @return         length of mainmhix box
+ */
+int opj_write_mainmhix( int coff, opj_codestream_info_t cstr_info, opj_stream_private_t *cio,
+              opj_event_mgr_t * p_manager );
+
+int opj_write_phixfaix( int coff, int compno, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
+              opj_event_mgr_t * p_manager );
+
+int opj_write_ppixfaix( int coff, int compno, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
+              opj_event_mgr_t * p_manager );
+
+int opj_write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_stream_private_t *cio,
+              opj_event_mgr_t * p_manager );
+
+int opj_write_tpixfaix( int coff, int compno, opj_codestream_info_t cstr_info, int j2klen, opj_stream_private_t *cio,
+              opj_event_mgr_t * p_manager );
+
+#endif      /* !INDEXBOX_MANAGER_H_ */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.c
new file mode 100644
index 0000000..4c1ee78
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.c
@@ -0,0 +1,294 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/** 
+ * LUP decomposition
+ */
+static OPJ_BOOL opj_lupDecompose(OPJ_FLOAT32 * matrix,
+                                 OPJ_UINT32 * permutations, 
+                                 OPJ_FLOAT32 * p_swap_area,
+                                 OPJ_UINT32 nb_compo);
+/** 
+ * LUP solving
+ */
+static void opj_lupSolve(OPJ_FLOAT32 * pResult, 
+                         OPJ_FLOAT32* pMatrix, 
+                         OPJ_FLOAT32* pVector, 
+                         OPJ_UINT32* pPermutations, 
+                         OPJ_UINT32 nb_compo,
+                         OPJ_FLOAT32 * p_intermediate_data);
+
+/** 
+ *LUP inversion (call with the result of lupDecompose)
+ */
+static void opj_lupInvert ( OPJ_FLOAT32 * pSrcMatrix,
+                            OPJ_FLOAT32 * pDestMatrix,
+                            OPJ_UINT32 nb_compo,
+                            OPJ_UINT32 * pPermutations,
+                            OPJ_FLOAT32 * p_src_temp,
+                            OPJ_FLOAT32 * p_dest_temp,
+                            OPJ_FLOAT32 * p_swap_area);
+
+/*
+==========================================================
+   Matric inversion interface
+==========================================================
+*/
+/**
+ * Matrix inversion.
+ */
+OPJ_BOOL opj_matrix_inversion_f(OPJ_FLOAT32 * pSrcMatrix,
+                                OPJ_FLOAT32 * pDestMatrix, 
+                                OPJ_UINT32 nb_compo)
+{
+	OPJ_BYTE * l_data = 00;
+	OPJ_UINT32 l_permutation_size = nb_compo * (OPJ_UINT32)sizeof(OPJ_UINT32);
+	OPJ_UINT32 l_swap_size = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+	OPJ_UINT32 l_total_size = l_permutation_size + 3 * l_swap_size;
+	OPJ_UINT32 * lPermutations = 00;
+	OPJ_FLOAT32 * l_double_data = 00;
+
+	l_data = (OPJ_BYTE *) opj_malloc(l_total_size);
+	if (l_data == 0) {
+		return OPJ_FALSE;
+	}
+	lPermutations = (OPJ_UINT32 *) l_data;
+	l_double_data = (OPJ_FLOAT32 *) (l_data + l_permutation_size);
+	memset(lPermutations,0,l_permutation_size);
+
+	if(! opj_lupDecompose(pSrcMatrix,lPermutations,l_double_data,nb_compo)) {
+		opj_free(l_data);
+		return OPJ_FALSE;
+	}
+	
+    opj_lupInvert(pSrcMatrix,pDestMatrix,nb_compo,lPermutations,l_double_data,l_double_data + nb_compo,l_double_data + 2*nb_compo);
+	opj_free(l_data);
+	
+    return OPJ_TRUE;
+}
+
+
+/*
+==========================================================
+   Local functions
+==========================================================
+*/
+OPJ_BOOL opj_lupDecompose(OPJ_FLOAT32 * matrix,OPJ_UINT32 * permutations, 
+                          OPJ_FLOAT32 * p_swap_area,
+                          OPJ_UINT32 nb_compo) 
+{
+	OPJ_UINT32 * tmpPermutations = permutations;
+	OPJ_UINT32 * dstPermutations;
+	OPJ_UINT32 k2=0,t;
+	OPJ_FLOAT32 temp;
+	OPJ_UINT32 i,j,k;
+	OPJ_FLOAT32 p;
+	OPJ_UINT32 lLastColum = nb_compo - 1;
+	OPJ_UINT32 lSwapSize = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+	OPJ_FLOAT32 * lTmpMatrix = matrix;
+	OPJ_FLOAT32 * lColumnMatrix,* lDestMatrix;
+	OPJ_UINT32 offset = 1;
+	OPJ_UINT32 lStride = nb_compo-1;
+
+	/*initialize permutations */
+	for (i = 0; i < nb_compo; ++i) 
+	{
+    	*tmpPermutations++ = i;
+	}
+	/* now make a pivot with colum switch */
+	tmpPermutations = permutations;
+	for (k = 0; k < lLastColum; ++k) {
+		p = 0.0;
+
+		/* take the middle element */
+		lColumnMatrix = lTmpMatrix + k;
+		
+		/* make permutation with the biggest value in the column */
+        for (i = k; i < nb_compo; ++i) {
+			temp = ((*lColumnMatrix > 0) ? *lColumnMatrix : -(*lColumnMatrix));
+     		if (temp > p) {
+     			p = temp;
+     			k2 = i;
+     		}
+			/* next line */
+			lColumnMatrix += nb_compo;
+     	}
+
+     	/* a whole rest of 0 -> non singular */
+     	if (p == 0.0) {
+    		return OPJ_FALSE;
+		}
+
+		/* should we permute ? */
+		if (k2 != k) {
+			/*exchange of line */
+     		/* k2 > k */
+			dstPermutations = tmpPermutations + k2 - k;
+			/* swap indices */
+			t = *tmpPermutations;
+     		*tmpPermutations = *dstPermutations;
+     		*dstPermutations = t;
+
+			/* and swap entire line. */
+			lColumnMatrix = lTmpMatrix + (k2 - k) * nb_compo;
+			memcpy(p_swap_area,lColumnMatrix,lSwapSize);
+			memcpy(lColumnMatrix,lTmpMatrix,lSwapSize);
+			memcpy(lTmpMatrix,p_swap_area,lSwapSize);
+		}
+
+		/* now update data in the rest of the line and line after */
+		lDestMatrix = lTmpMatrix + k;
+		lColumnMatrix = lDestMatrix + nb_compo;
+		/* take the middle element */
+		temp = *(lDestMatrix++);
+
+		/* now compute up data (i.e. coeff up of the diagonal). */
+     	for (i = offset; i < nb_compo; ++i)  {
+			/*lColumnMatrix; */
+			/* divide the lower column elements by the diagonal value */
+
+			/* matrix[i][k] /= matrix[k][k]; */
+     		/* p = matrix[i][k] */
+			p = *lColumnMatrix / temp;
+			*(lColumnMatrix++) = p;
+     		
+            for (j = /* k + 1 */ offset; j < nb_compo; ++j) {
+				/* matrix[i][j] -= matrix[i][k] * matrix[k][j]; */
+     			*(lColumnMatrix++) -= p * (*(lDestMatrix++));
+			}
+			/* come back to the k+1th element */
+			lDestMatrix -= lStride;
+			/* go to kth element of the next line */
+			lColumnMatrix += k;
+     	}
+
+		/* offset is now k+2 */
+		++offset;
+		/* 1 element less for stride */
+		--lStride;
+		/* next line */
+		lTmpMatrix+=nb_compo;
+		/* next permutation element */
+		++tmpPermutations;
+	}
+    return OPJ_TRUE;
+}
+   		
+void opj_lupSolve (OPJ_FLOAT32 * pResult, 
+                   OPJ_FLOAT32 * pMatrix, 
+                   OPJ_FLOAT32 * pVector, 
+                   OPJ_UINT32* pPermutations, 
+                   OPJ_UINT32 nb_compo,OPJ_FLOAT32 * p_intermediate_data) 
+{
+	OPJ_INT32 k;
+    OPJ_UINT32 i,j;
+	OPJ_FLOAT32 sum;
+	OPJ_FLOAT32 u;
+    OPJ_UINT32 lStride = nb_compo+1;
+	OPJ_FLOAT32 * lCurrentPtr;
+	OPJ_FLOAT32 * lIntermediatePtr;
+	OPJ_FLOAT32 * lDestPtr;
+	OPJ_FLOAT32 * lTmpMatrix;
+	OPJ_FLOAT32 * lLineMatrix = pMatrix;
+	OPJ_FLOAT32 * lBeginPtr = pResult + nb_compo - 1;
+	OPJ_FLOAT32 * lGeneratedData;
+	OPJ_UINT32 * lCurrentPermutationPtr = pPermutations;
+
+	
+	lIntermediatePtr = p_intermediate_data;
+	lGeneratedData = p_intermediate_data + nb_compo - 1;
+	
+    for (i = 0; i < nb_compo; ++i) {
+       	sum = 0.0;
+		lCurrentPtr = p_intermediate_data;
+		lTmpMatrix = lLineMatrix;
+        for (j = 1; j <= i; ++j) 
+		{
+			/* sum += matrix[i][j-1] * y[j-1]; */
+        	sum += (*(lTmpMatrix++)) * (*(lCurrentPtr++));
+        }
+		/*y[i] = pVector[pPermutations[i]] - sum; */
+        *(lIntermediatePtr++) = pVector[*(lCurrentPermutationPtr++)] - sum;
+		lLineMatrix += nb_compo;
+	}
+
+	/* we take the last point of the matrix */
+	lLineMatrix = pMatrix + nb_compo*nb_compo - 1;
+
+	/* and we take after the last point of the destination vector */
+	lDestPtr = pResult + nb_compo;
+
+
+    assert(nb_compo != 0);
+	for (k = (OPJ_INT32)nb_compo - 1; k != -1 ; --k) {
+		sum = 0.0;
+		lTmpMatrix = lLineMatrix;
+        u = *(lTmpMatrix++);
+		lCurrentPtr = lDestPtr--;
+        for (j = (OPJ_UINT32)(k + 1); j < nb_compo; ++j) {
+			/* sum += matrix[k][j] * x[j] */
+        	sum += (*(lTmpMatrix++)) * (*(lCurrentPtr++));
+		}
+		/*x[k] = (y[k] - sum) / u; */
+        *(lBeginPtr--) = (*(lGeneratedData--) - sum) / u;
+		lLineMatrix -= lStride;
+	}
+}
+    
+
+void opj_lupInvert (OPJ_FLOAT32 * pSrcMatrix,
+                    OPJ_FLOAT32 * pDestMatrix,
+                    OPJ_UINT32 nb_compo,
+                    OPJ_UINT32 * pPermutations,
+                    OPJ_FLOAT32 * p_src_temp,
+                    OPJ_FLOAT32 * p_dest_temp,
+                    OPJ_FLOAT32 * p_swap_area )
+{
+	OPJ_UINT32 j,i;
+	OPJ_FLOAT32 * lCurrentPtr;
+	OPJ_FLOAT32 * lLineMatrix = pDestMatrix;
+	OPJ_UINT32 lSwapSize = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+
+	for (j = 0; j < nb_compo; ++j) {
+		lCurrentPtr = lLineMatrix++;
+        memset(p_src_temp,0,lSwapSize);
+    	p_src_temp[j] = 1.0;
+		opj_lupSolve(p_dest_temp,pSrcMatrix,p_src_temp, pPermutations, nb_compo , p_swap_area);
+
+		for (i = 0; i < nb_compo; ++i) {
+    		*(lCurrentPtr) = p_dest_temp[i];
+			lCurrentPtr+=nb_compo;
+    	}
+    }
+}
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.h
new file mode 100644
index 0000000..2fae8e5
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.h
@@ -0,0 +1,64 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __INVERT_H
+#define __INVERT_H
+/**
+@file invert.h
+@brief Implementation of the matrix inversion
+
+The function in INVERT.H compute a matrix inversion with a LUP method
+*/
+
+/** @defgroup INVERT INVERT - Implementation of a matrix inversion */
+/*@{*/
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Calculates a n x n double matrix inversion with a LUP method. Data is aligned, rows after rows (or columns after columns).
+ * The function does not take ownership of any memory block, data must be fred by the user.
+ *
+ * @param pSrcMatrix	the matrix to invert.
+ * @param pDestMatrix	data to store the inverted matrix. 
+ * @param n size of the matrix
+ * @return OPJ_TRUE if the inversion is successful, OPJ_FALSE if the matrix is singular.
+ */
+OPJ_BOOL opj_matrix_inversion_f(OPJ_FLOAT32 * pSrcMatrix,
+                                OPJ_FLOAT32 * pDestMatrix, 
+                                OPJ_UINT32 nb_compo);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __INVERT_H */ 
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.c
new file mode 100644
index 0000000..77a864e
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.c
@@ -0,0 +1,10295 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+#define CINEMA_24_CS 1302083	/*Codestream length for 24fps*/
+#define CINEMA_48_CS 651041		/*Codestream length for 48fps*/
+#define COMP_24_CS 1041666		/*Maximum size per color component for 2K & 4K @ 24fps*/
+#define COMP_48_CS 520833		/*Maximum size per color component for 2K @ 48fps*/
+
+/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+ * Sets up the procedures to do on reading header. Developpers wanting to extend the library can add their own reading procedures.
+ */
+static void opj_j2k_setup_header_reading (opj_j2k_t *p_j2k);
+
+/**
+ * The read header procedure.
+ */
+static OPJ_BOOL opj_j2k_read_header_procedure(  opj_j2k_t *p_j2k,
+                                                opj_stream_private_t *p_stream,
+                                                opj_event_mgr_t * p_manager);
+
+/**
+ * The default encoding validation procedure without any extension.
+ *
+ * @param       p_j2k                   the jpeg2000 codec to validate.
+ * @param       p_stream                the input stream to validate.
+ * @param       p_manager               the user event manager.
+ *
+ * @return true if the parameters are correct.
+ */
+static OPJ_BOOL opj_j2k_encoding_validation (   opj_j2k_t * p_j2k,
+                                                opj_stream_private_t *p_stream,
+                                                opj_event_mgr_t * p_manager );
+
+/**
+ * The default decoding validation procedure without any extension.
+ *
+ * @param       p_j2k                   the jpeg2000 codec to validate.
+ * @param       p_stream                                the input stream to validate.
+ * @param       p_manager               the user event manager.
+ *
+ * @return true if the parameters are correct.
+ */
+static OPJ_BOOL opj_j2k_decoding_validation (   opj_j2k_t * p_j2k,
+                                                opj_stream_private_t *p_stream,
+                                                opj_event_mgr_t * p_manager );
+
+/**
+ * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
+ * are valid. Developpers wanting to extend the library can add their own validation procedures.
+ */
+static void opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k);
+
+/**
+ * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
+ * are valid. Developpers wanting to extend the library can add their own validation procedures.
+ */
+static void opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k);
+
+/**
+ * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
+ * are valid. Developpers wanting to extend the library can add their own validation procedures.
+ */
+static void opj_j2k_setup_end_compress (opj_j2k_t *p_j2k);
+
+/**
+ * The mct encoding validation procedure.
+ *
+ * @param       p_j2k                   the jpeg2000 codec to validate.
+ * @param       p_stream                                the input stream to validate.
+ * @param       p_manager               the user event manager.
+ *
+ * @return true if the parameters are correct.
+ */
+static OPJ_BOOL opj_j2k_mct_validation (opj_j2k_t * p_j2k,
+                                        opj_stream_private_t *p_stream,
+                                        opj_event_mgr_t * p_manager );
+
+/**
+ * Builds the tcd decoder to use to decode tile.
+ */
+static OPJ_BOOL opj_j2k_build_decoder ( opj_j2k_t * p_j2k,
+                                        opj_stream_private_t *p_stream,
+                                        opj_event_mgr_t * p_manager );
+/**
+ * Builds the tcd encoder to use to encode tile.
+ */
+static OPJ_BOOL opj_j2k_build_encoder ( opj_j2k_t * p_j2k,
+                                        opj_stream_private_t *p_stream,
+                                        opj_event_mgr_t * p_manager );
+
+/**
+ * Creates a tile-coder decoder.
+ *
+ * @param       p_stream                        the stream to write data to.
+ * @param       p_j2k                           J2K codec.
+ * @param       p_manager                   the user event manager.
+*/
+static OPJ_BOOL opj_j2k_create_tcd(     opj_j2k_t *p_j2k,
+                                                                    opj_stream_private_t *p_stream,
+                                                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Excutes the given procedures on the given codec.
+ *
+ * @param       p_procedure_list        the list of procedures to execute
+ * @param       p_j2k                           the jpeg2000 codec to execute the procedures on.
+ * @param       p_stream                        the stream to execute the procedures on.
+ * @param       p_manager                       the user manager.
+ *
+ * @return      true                            if all the procedures were successfully executed.
+ */
+static OPJ_BOOL opj_j2k_exec (  opj_j2k_t * p_j2k,
+                            opj_procedure_list_t * p_procedure_list,
+                            opj_stream_private_t *p_stream,
+                            opj_event_mgr_t * p_manager);
+
+/**
+ * Updates the rates of the tcp.
+ *
+ * @param       p_stream                                the stream to write data to.
+ * @param       p_j2k                           J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_update_rates(   opj_j2k_t *p_j2k,
+                                                                            opj_stream_private_t *p_stream,
+                                                                            opj_event_mgr_t * p_manager );
+
+/**
+ * Copies the decoding tile parameters onto all the tile parameters.
+ * Creates also the tile decoder.
+ */
+static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd (       opj_j2k_t * p_j2k,
+                                                            opj_stream_private_t *p_stream,
+                                                            opj_event_mgr_t * p_manager );
+
+/**
+ * Destroys the memory associated with the decoding of headers.
+ */
+static OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k,
+                                                opj_stream_private_t *p_stream,
+                                                opj_event_mgr_t * p_manager );
+
+/**
+ * Reads the lookup table containing all the marker, status and action, and returns the handler associated
+ * with the marker value.
+ * @param       p_id            Marker value to look up
+ *
+ * @return      the handler associated with the id.
+*/
+static const struct opj_dec_memory_marker_handler * opj_j2k_get_marker_handler (OPJ_UINT32 p_id);
+
+/**
+ * Destroys a tile coding parameter structure.
+ *
+ * @param       p_tcp           the tile coding parameter to destroy.
+ */
+static void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp);
+
+/**
+ * Destroys the data inside a tile coding parameter structure.
+ *
+ * @param       p_tcp           the tile coding parameter which contain data to destroy.
+ */
+static void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp);
+
+/**
+ * Destroys a coding parameter structure.
+ *
+ * @param       p_cp            the coding parameter to destroy.
+ */
+static void opj_j2k_cp_destroy (opj_cp_t *p_cp);
+
+/**
+ * Writes a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
+ *
+ * @param       p_j2k           J2K codec.
+ * @param       p_tile_no       FIXME DOC
+ * @param       p_comp_no       the component number to output.
+ * @param       p_data          FIXME DOC
+ * @param       p_header_size   FIXME DOC
+ * @param       p_manager       the user event manager.
+ *
+ * @return FIXME DOC
+*/
+static OPJ_BOOL opj_j2k_write_SPCod_SPCoc(      opj_j2k_t *p_j2k,
+                                                                                    OPJ_UINT32 p_tile_no,
+                                                                                    OPJ_UINT32 p_comp_no,
+                                                                                    OPJ_BYTE * p_data,
+                                                                                    OPJ_UINT32 * p_header_size,
+                                                                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Gets the size taken by writing a SPCod or SPCoc for the given tile and component.
+ *
+ * @param       p_j2k                   the J2K codec.
+ * @param       p_tile_no               the tile index.
+ * @param       p_comp_no               the component being outputted.
+ *
+ * @return      the number of bytes taken by the SPCod element.
+ */
+static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size (opj_j2k_t *p_j2k,
+                                                                                            OPJ_UINT32 p_tile_no,
+                                                                                            OPJ_UINT32 p_comp_no );
+
+/**
+ * Reads a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
+ * @param       p_j2k           the jpeg2000 codec.
+ * @param       compno          FIXME DOC
+ * @param       p_header_data   the data contained in the COM box.
+ * @param       p_header_size   the size of the data contained in the COM marker.
+ * @param       p_manager       the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(   opj_j2k_t *p_j2k,
+                                            OPJ_UINT32 compno,
+                                            OPJ_BYTE * p_header_data,
+                                            OPJ_UINT32 * p_header_size,
+                                            opj_event_mgr_t * p_manager );
+
+/**
+ * Gets the size taken by writing SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
+ *
+ * @param       p_tile_no               the tile index.
+ * @param       p_comp_no               the component being outputted.
+ * @param       p_j2k                   the J2K codec.
+ *
+ * @return      the number of bytes taken by the SPCod element.
+ */
+static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size (  opj_j2k_t *p_j2k,
+                                                                                    OPJ_UINT32 p_tile_no,
+                                                                                    OPJ_UINT32 p_comp_no );
+
+/**
+ * Writes a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
+ *
+ * @param       p_tile_no               the tile to output.
+ * @param       p_comp_no               the component number to output.
+ * @param       p_data                  the data buffer.
+ * @param       p_header_size   pointer to the size of the data buffer, it is changed by the function.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+ *
+*/
+static OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k,
+                                                                            OPJ_UINT32 p_tile_no,
+                                                                            OPJ_UINT32 p_comp_no,
+                                                                            OPJ_BYTE * p_data,
+                                                                            OPJ_UINT32 * p_header_size,
+                                                                            opj_event_mgr_t * p_manager);
+
+/**
+ * Updates the Tile Length Marker.
+ */
+static void opj_j2k_update_tlm ( opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size);
+
+/**
+ * Reads a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
+ *
+ * @param       p_j2k           J2K codec.
+ * @param       compno          the component number to output.
+ * @param       p_header_data   the data buffer.
+ * @param       p_header_size   pointer to the size of the data buffer, it is changed by the function.
+ * @param       p_manager       the user event manager.
+ *
+*/
+static OPJ_BOOL opj_j2k_read_SQcd_SQcc( opj_j2k_t *p_j2k,
+                                        OPJ_UINT32 compno,
+                                        OPJ_BYTE * p_header_data,
+                                        OPJ_UINT32 * p_header_size,
+                                        opj_event_mgr_t * p_manager );
+
+/**
+ * Copies the tile component parameters of all the component from the first tile component.
+ *
+ * @param               p_j2k           the J2k codec.
+ */
+static void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k );
+
+/**
+ * Copies the tile quantization parameters of all the component from the first tile component.
+ *
+ * @param               p_j2k           the J2k codec.
+ */
+static void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k );
+
+/**
+ * Reads the tiles.
+ */
+static OPJ_BOOL opj_j2k_decode_tiles (  opj_j2k_t *p_j2k,
+                                        opj_stream_private_t *p_stream,
+                                        opj_event_mgr_t * p_manager);
+
+static OPJ_BOOL opj_j2k_pre_write_tile ( opj_j2k_t * p_j2k,
+                                                                             OPJ_UINT32 p_tile_index,
+                                                                             opj_stream_private_t *p_stream,
+                                                                             opj_event_mgr_t * p_manager );
+
+static OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image);
+
+static void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data);
+
+static OPJ_BOOL opj_j2k_post_write_tile (opj_j2k_t * p_j2k,
+                                                                             OPJ_BYTE * p_data,
+                                                                             OPJ_UINT32 p_data_size,
+                                                                             opj_stream_private_t *p_stream,
+                                                                             opj_event_mgr_t * p_manager );
+
+/**
+ * Sets up the procedures to do on writing header.
+ * Developers wanting to extend the library can add their own writing procedures.
+ */
+static void opj_j2k_setup_header_writing (opj_j2k_t *p_j2k);
+
+static OPJ_BOOL opj_j2k_write_first_tile_part(  opj_j2k_t *p_j2k,
+                                                                                            OPJ_BYTE * p_data,
+                                                                                            OPJ_UINT32 * p_data_written,
+                                                                                            OPJ_UINT32 p_total_data_size,
+                                                                                            opj_stream_private_t *p_stream,
+                                                                                            struct opj_event_mgr * p_manager );
+
+static OPJ_BOOL opj_j2k_write_all_tile_parts(   opj_j2k_t *p_j2k,
+                                                                                            OPJ_BYTE * p_data,
+                                                                                            OPJ_UINT32 * p_data_written,
+                                                                                            OPJ_UINT32 p_total_data_size,
+                                                                                            opj_stream_private_t *p_stream,
+                                                                                            struct opj_event_mgr * p_manager );
+
+/**
+ * Gets the offset of the header.
+ *
+ * @param       p_stream                the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_get_end_header( opj_j2k_t *p_j2k,
+                                        opj_stream_private_t *p_stream,
+                                        opj_event_mgr_t * p_manager );
+
+static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k);
+
+/*
+ * -----------------------------------------------------------------------
+ * -----------------------------------------------------------------------
+ * -----------------------------------------------------------------------
+ */
+
+/**
+ * Writes the SOC marker (Start Of Codestream)
+ *
+ * @param       p_stream                        the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager       the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_soc(      opj_j2k_t *p_j2k,
+                                                        opj_stream_private_t *p_stream,
+                                                            opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a SOC marker (Start of Codestream)
+ * @param       p_j2k           the jpeg2000 file codec.
+ * @param       p_stream        XXX needs data
+ * @param       p_manager       the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_soc(   opj_j2k_t *p_j2k,
+                                    opj_stream_private_t *p_stream,
+                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the SIZ marker (image and tile size)
+ *
+ * @param       p_j2k           J2K codec.
+ * @param       p_stream        the stream to write data to.
+ * @param       p_manager       the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_siz(      opj_j2k_t *p_j2k,
+                                                                opj_stream_private_t *p_stream,
+                                                                opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a SIZ marker (image and tile size)
+ * @param       p_j2k           the jpeg2000 file codec.
+ * @param       p_header_data   the data contained in the SIZ box.
+ * @param       p_header_size   the size of the data contained in the SIZ marker.
+ * @param       p_manager       the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
+
+/**
+ * Writes the COM marker (comment)
+ *
+ * @param       p_stream                        the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager       the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_com(      opj_j2k_t *p_j2k,
+                                                                        opj_stream_private_t *p_stream,
+                                                                        opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a COM marker (comments)
+ * @param       p_j2k           the jpeg2000 file codec.
+ * @param       p_header_data   the data contained in the COM box.
+ * @param       p_header_size   the size of the data contained in the COM marker.
+ * @param       p_manager       the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_com (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager );
+/**
+ * Writes the COD marker (Coding style default)
+ *
+ * @param       p_stream                        the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager       the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_cod(      opj_j2k_t *p_j2k,
+                                                                        opj_stream_private_t *p_stream,
+                                                                        opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a COD marker (Coding Styke defaults)
+ * @param       p_header_data   the data contained in the COD box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the COD marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_cod (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager);
+
+#if 0
+/**
+ * Writes the COC marker (Coding style component)
+ *
+ * @param       p_j2k       J2K codec.
+ * @param       p_comp_no   the index of the component to output.
+ * @param       p_stream    the stream to write data to.
+ * @param       p_manager   the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_coc(  opj_j2k_t *p_j2k,
+                                                                OPJ_UINT32 p_comp_no,
+                                                                opj_stream_private_t *p_stream,
+                                                                opj_event_mgr_t * p_manager );
+#endif
+
+#if 0
+/**
+ * Writes the COC marker (Coding style component)
+ *
+ * @param       p_j2k                   J2K codec.
+ * @param       p_comp_no               the index of the component to output.
+ * @param       p_data          FIXME DOC
+ * @param       p_data_written  FIXME DOC
+ * @param       p_manager               the user event manager.
+*/
+static void opj_j2k_write_coc_in_memory(opj_j2k_t *p_j2k,
+                                                                            OPJ_UINT32 p_comp_no,
+                                                                            OPJ_BYTE * p_data,
+                                                                            OPJ_UINT32 * p_data_written,
+                                                                            opj_event_mgr_t * p_manager );
+#endif
+
+/**
+ * Gets the maximum size taken by a coc.
+ *
+ * @param       p_j2k   the jpeg2000 codec to use.
+ */
+static OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k);
+
+/**
+ * Reads a COC marker (Coding Style Component)
+ * @param       p_header_data   the data contained in the COC box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the COC marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_coc (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the QCD marker (quantization default)
+ *
+ * @param       p_j2k                   J2K codec.
+ * @param       p_stream                the stream to write data to.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_qcd(      opj_j2k_t *p_j2k,
+                                                                        opj_stream_private_t *p_stream,
+                                                                        opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a QCD marker (Quantization defaults)
+ * @param       p_header_data   the data contained in the QCD box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the QCD marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_qcd (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager );
+#if 0
+/**
+ * Writes the QCC marker (quantization component)
+ *
+ * @param       p_comp_no       the index of the component to output.
+ * @param       p_stream                the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_qcc(      opj_j2k_t *p_j2k,
+                                                                        OPJ_UINT32 p_comp_no,
+                                                                        opj_stream_private_t *p_stream,
+                                                                        opj_event_mgr_t * p_manager );
+#endif
+
+#if 0
+/**
+ * Writes the QCC marker (quantization component)
+ *
+ * @param       p_j2k           J2K codec.
+ * @param       p_comp_no       the index of the component to output.
+ * @param       p_data          FIXME DOC
+ * @param       p_data_written  the stream to write data to.
+ * @param       p_manager       the user event manager.
+*/
+static void opj_j2k_write_qcc_in_memory(opj_j2k_t *p_j2k,
+                                                                            OPJ_UINT32 p_comp_no,
+                                                                            OPJ_BYTE * p_data,
+                                                                            OPJ_UINT32 * p_data_written,
+                                                                            opj_event_mgr_t * p_manager );
+#endif
+
+/**
+ * Gets the maximum size taken by a qcc.
+ */
+static OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k);
+
+/**
+ * Reads a QCC marker (Quantization component)
+ * @param       p_header_data   the data contained in the QCC box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the QCC marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_qcc(   opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager);
+/**
+ * Writes the POC marker (Progression Order Change)
+ *
+ * @param       p_stream                                the stream to write data to.
+ * @param       p_j2k                           J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_poc(      opj_j2k_t *p_j2k,
+                                                                        opj_stream_private_t *p_stream,
+                                                                        opj_event_mgr_t * p_manager );
+/**
+ * Writes the POC marker (Progression Order Change)
+ *
+ * @param       p_j2k          J2K codec.
+ * @param       p_data         FIXME DOC
+ * @param       p_data_written the stream to write data to.
+ * @param       p_manager      the user event manager.
+ */
+static void opj_j2k_write_poc_in_memory(opj_j2k_t *p_j2k,
+                                                                            OPJ_BYTE * p_data,
+                                                                            OPJ_UINT32 * p_data_written,
+                                                                            opj_event_mgr_t * p_manager );
+/**
+ * Gets the maximum size taken by the writing of a POC.
+ */
+static OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k);
+
+/**
+ * Reads a POC marker (Progression Order Change)
+ *
+ * @param       p_header_data   the data contained in the POC box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the POC marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_poc (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Gets the maximum size taken by the toc headers of all the tile parts of any given tile.
+ */
+static OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k);
+
+/**
+ * Gets the maximum size taken by the headers of the SOT.
+ *
+ * @param       p_j2k   the jpeg2000 codec to use.
+ */
+static OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k);
+
+/**
+ * Reads a CRG marker (Component registration)
+ *
+ * @param       p_header_data   the data contained in the TLM box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the TLM marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_crg (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager );
+/**
+ * Reads a TLM marker (Tile Length Marker)
+ *
+ * @param       p_header_data   the data contained in the TLM box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the TLM marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_tlm (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager);
+
+/**
+ * Writes the updated tlm.
+ *
+ * @param       p_stream                the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_updated_tlm(      opj_j2k_t *p_j2k,
+                                            opj_stream_private_t *p_stream,
+                                            opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a PLM marker (Packet length, main header marker)
+ *
+ * @param       p_header_data   the data contained in the TLM box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the TLM marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_plm (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager);
+/**
+ * Reads a PLT marker (Packet length, tile-part header)
+ *
+ * @param       p_header_data   the data contained in the PLT box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the PLT marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_plt (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager );
+
+#if 0
+/**
+ * Reads a PPM marker (Packed packet headers, main header)
+ *
+ * @param       p_header_data   the data contained in the POC box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the POC marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL j2k_read_ppm_v2 (
+                                                opj_j2k_t *p_j2k,
+                                                OPJ_BYTE * p_header_data,
+                                                OPJ_UINT32 p_header_size,
+                                                struct opj_event_mgr * p_manager
+                                        );
+#endif
+
+static OPJ_BOOL j2k_read_ppm_v3 (
+                                                opj_j2k_t *p_j2k,
+                                                OPJ_BYTE * p_header_data,
+                                                OPJ_UINT32 p_header_size,
+                                                opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a PPT marker (Packed packet headers, tile-part header)
+ *
+ * @param       p_header_data   the data contained in the PPT box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the PPT marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_ppt (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager );
+/**
+ * Writes the TLM marker (Tile Length Marker)
+ *
+ * @param       p_stream                                the stream to write data to.
+ * @param       p_j2k                           J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_tlm(      opj_j2k_t *p_j2k,
+                                                                        opj_stream_private_t *p_stream,
+                                                                        opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the SOT marker (Start of tile-part)
+ *
+ * @param       p_j2k            J2K codec.
+ * @param       p_data           FIXME DOC
+ * @param       p_data_written   FIXME DOC
+ * @param       p_stream         the stream to write data to.
+ * @param       p_manager        the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_sot(      opj_j2k_t *p_j2k,
+                                                                        OPJ_BYTE * p_data,
+                                                                        OPJ_UINT32 * p_data_written,
+                                                                        const opj_stream_private_t *p_stream,
+                                                                        opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a PPT marker (Packed packet headers, tile-part header)
+ *
+ * @param       p_header_data   the data contained in the PPT box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the PPT marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_sot (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager );
+/**
+ * Writes the SOD marker (Start of data)
+ *
+ * @param       p_j2k               J2K codec.
+ * @param       p_tile_coder        FIXME DOC
+ * @param       p_data              FIXME DOC
+ * @param       p_data_written      FIXME DOC
+ * @param       p_total_data_size   FIXME DOC
+ * @param       p_stream            the stream to write data to.
+ * @param       p_manager           the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_sod(      opj_j2k_t *p_j2k,
+                                                                        opj_tcd_t * p_tile_coder,
+                                                                        OPJ_BYTE * p_data,
+                                                                        OPJ_UINT32 * p_data_written,
+                                                                        OPJ_UINT32 p_total_data_size,
+                                                                        const opj_stream_private_t *p_stream,
+                                                                        opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a SOD marker (Start Of Data)
+ *
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_stream                FIXME DOC
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_sod(   opj_j2k_t *p_j2k,
+                                    opj_stream_private_t *p_stream,
+                                    opj_event_mgr_t * p_manager );
+
+void opj_j2k_update_tlm (opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size )
+{
+        opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_j2k->m_current_tile_number,1);            /* PSOT */
+        ++p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current;
+
+        opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_tile_part_size,4);                                        /* PSOT */
+        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 4;
+}
+
+/**
+ * Writes the RGN marker (Region Of Interest)
+ *
+ * @param       p_tile_no               the tile to output
+ * @param       p_comp_no               the component to output
+ * @param       nb_comps                the number of components
+ * @param       p_stream                the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_rgn(  opj_j2k_t *p_j2k,
+                                    OPJ_UINT32 p_tile_no,
+                                    OPJ_UINT32 p_comp_no,
+                                    OPJ_UINT32 nb_comps,
+                                    opj_stream_private_t *p_stream,
+                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a RGN marker (Region Of Interest)
+ *
+ * @param       p_header_data   the data contained in the POC box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the POC marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k,
+                                  OPJ_BYTE * p_header_data,
+                                  OPJ_UINT32 p_header_size,
+                                  opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the EOC marker (End of Codestream)
+ *
+ * @param       p_stream                the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_eoc(      opj_j2k_t *p_j2k,
+                                    opj_stream_private_t *p_stream,
+                                    opj_event_mgr_t * p_manager );
+
+#if 0
+/**
+ * Reads a EOC marker (End Of Codestream)
+ *
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_stream                FIXME DOC
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_eoc (      opj_j2k_t *p_j2k,
+                                                                opj_stream_private_t *p_stream,
+                                                                opj_event_mgr_t * p_manager );
+#endif
+
+/**
+ * Writes the CBD-MCT-MCC-MCO markers (Multi components transform)
+ *
+ * @param       p_stream                        the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager       the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_mct_data_group(   opj_j2k_t *p_j2k,
+                                                opj_stream_private_t *p_stream,
+                                                opj_event_mgr_t * p_manager );
+
+/**
+ * Inits the Info
+ *
+ * @param       p_stream                the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_init_info(      opj_j2k_t *p_j2k,
+                                    opj_stream_private_t *p_stream,
+                                    opj_event_mgr_t * p_manager );
+
+/**
+Add main header marker information
+@param cstr_index    Codestream information structure
+@param type         marker type
+@param pos          byte offset of marker segment
+@param len          length of marker segment
+ */
+static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len) ;
+/**
+Add tile header marker information
+@param tileno       tile index number
+@param cstr_index   Codestream information structure
+@param type         marker type
+@param pos          byte offset of marker segment
+@param len          length of marker segment
+ */
+static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno, opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len);
+
+/**
+ * Reads an unknown marker
+ *
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_stream                the stream object to read from.
+ * @param       output_marker           FIXME DOC
+ * @param       p_manager               the user event manager.
+ *
+ * @return      true                    if the marker could be deduced.
+*/
+static OPJ_BOOL opj_j2k_read_unk( opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  OPJ_UINT32 *output_marker,
+                                  opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the MCT marker (Multiple Component Transform)
+ *
+ * @param       p_j2k           J2K codec.
+ * @param       p_mct_record    FIXME DOC
+ * @param       p_stream        the stream to write data to.
+ * @param       p_manager       the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_mct_record(       opj_j2k_t *p_j2k,
+                                                                                    opj_mct_data_t * p_mct_record,
+                                            opj_stream_private_t *p_stream,
+                                            opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a MCT marker (Multiple Component Transform)
+ *
+ * @param       p_header_data   the data contained in the MCT box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the MCT marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_mct (      opj_j2k_t *p_j2k,
+                                                                    OPJ_BYTE * p_header_data,
+                                                                    OPJ_UINT32 p_header_size,
+                                                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the MCC marker (Multiple Component Collection)
+ *
+ * @param       p_j2k                   J2K codec.
+ * @param       p_mcc_record            FIXME DOC
+ * @param       p_stream                the stream to write data to.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_mcc_record(   opj_j2k_t *p_j2k,
+                                            opj_simple_mcc_decorrelation_data_t * p_mcc_record,
+                                            opj_stream_private_t *p_stream,
+                                            opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a MCC marker (Multiple Component Collection)
+ *
+ * @param       p_header_data   the data contained in the MCC box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the MCC marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_mcc (      opj_j2k_t *p_j2k,
+                                                                    OPJ_BYTE * p_header_data,
+                                                                    OPJ_UINT32 p_header_size,
+                                                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the MCO marker (Multiple component transformation ordering)
+ *
+ * @param       p_stream                                the stream to write data to.
+ * @param       p_j2k                           J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_mco(      opj_j2k_t *p_j2k,
+                                    opj_stream_private_t *p_stream,
+                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a MCO marker (Multiple Component Transform Ordering)
+ *
+ * @param       p_header_data   the data contained in the MCO box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the MCO marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_mco (      opj_j2k_t *p_j2k,
+                                                                    OPJ_BYTE * p_header_data,
+                                                                    OPJ_UINT32 p_header_size,
+                                                                    opj_event_mgr_t * p_manager );
+
+static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index);
+
+static void  opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+
+static void  opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+
+static void  opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+
+/**
+ * Ends the encoding, i.e. frees memory.
+ *
+ * @param       p_stream                the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_end_encoding(   opj_j2k_t *p_j2k,
+                                                                            opj_stream_private_t *p_stream,
+                                                                            opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the CBD marker (Component bit depth definition)
+ *
+ * @param       p_stream                                the stream to write data to.
+ * @param       p_j2k                           J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_cbd(      opj_j2k_t *p_j2k,
+                                                                    opj_stream_private_t *p_stream,
+                                                                        opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a CBD marker (Component bit depth definition)
+ * @param       p_header_data   the data contained in the CBD box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the CBD marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_cbd (      opj_j2k_t *p_j2k,
+                                                                OPJ_BYTE * p_header_data,
+                                                                OPJ_UINT32 p_header_size,
+                                                                opj_event_mgr_t * p_manager);
+
+#if 0
+/**
+ * Writes COC marker for each component.
+ *
+ * @param       p_stream                the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_all_coc( opj_j2k_t *p_j2k,
+                                                                        opj_stream_private_t *p_stream,
+                                                                        opj_event_mgr_t * p_manager );
+#endif
+
+#if 0
+/**
+ * Writes QCC marker for each component.
+ *
+ * @param       p_stream                the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_all_qcc( opj_j2k_t *p_j2k,
+                                                                        opj_stream_private_t *p_stream,
+                                                                        opj_event_mgr_t * p_manager );
+#endif
+
+/**
+ * Writes regions of interests.
+ *
+ * @param       p_stream                the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_regions(  opj_j2k_t *p_j2k,
+                                                                        opj_stream_private_t *p_stream,
+                                                                        opj_event_mgr_t * p_manager );
+
+/**
+ * Writes EPC ????
+ *
+ * @param       p_stream                the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_epc(      opj_j2k_t *p_j2k,
+                                                                    opj_stream_private_t *p_stream,
+                                                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Checks the progression order changes values. Tells of the poc given as input are valid.
+ * A nice message is outputted at errors.
+ *
+ * @param       p_pocs                  the progression order changes.
+ * @param       p_nb_pocs               the number of progression order changes.
+ * @param       p_nb_resolutions        the number of resolutions.
+ * @param       numcomps                the number of components
+ * @param       numlayers               the number of layers.
+ * @param       p_manager               the user event manager.
+ *
+ * @return      true if the pocs are valid.
+ */
+static OPJ_BOOL opj_j2k_check_poc_val(  const opj_poc_t *p_pocs,
+                                                                            OPJ_UINT32 p_nb_pocs,
+                                                                            OPJ_UINT32 p_nb_resolutions,
+                                                                            OPJ_UINT32 numcomps,
+                                                                            OPJ_UINT32 numlayers,
+                                                                            opj_event_mgr_t * p_manager);
+
+/**
+ * Gets the number of tile parts used for the given change of progression (if any) and the given tile.
+ *
+ * @param               cp                      the coding parameters.
+ * @param               pino            the offset of the given poc (i.e. its position in the coding parameter).
+ * @param               tileno          the given tile.
+ *
+ * @return              the number of tile parts.
+ */
+static OPJ_UINT32 opj_j2k_get_num_tp( opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno);
+
+/**
+ * Calculates the total number of tile parts needed by the encoder to
+ * encode such an image. If not enough memory is available, then the function return false.
+ *
+ * @param       p_nb_tiles      pointer that will hold the number of tile parts.
+ * @param       cp                      the coding parameters for the image.
+ * @param       image           the image to encode.
+ * @param       p_j2k                   the p_j2k encoder.
+ * @param       p_manager       the user event manager.
+ *
+ * @return true if the function was successful, false else.
+ */
+static OPJ_BOOL opj_j2k_calculate_tp(   opj_j2k_t *p_j2k,
+                                                                            opj_cp_t *cp,
+                                                                            OPJ_UINT32 * p_nb_tiles,
+                                                                            opj_image_t *image,
+                                                                            opj_event_mgr_t * p_manager);
+
+static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream);
+
+static void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream);
+
+static opj_codestream_index_t* opj_j2k_create_cstr_index(void);
+
+static OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp);
+
+static OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp);
+
+static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres);
+
+static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager);
+
+static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_CINEMA_MODE cinema_mode, opj_event_mgr_t *p_manager);
+
+/*@}*/
+
+/*@}*/
+
+/* ----------------------------------------------------------------------- */
+typedef struct j2k_prog_order{
+        OPJ_PROG_ORDER enum_prog;
+        char str_prog[5];
+}j2k_prog_order_t;
+
+j2k_prog_order_t j2k_prog_order_list[] = {
+        {OPJ_CPRL, "CPRL"},
+        {OPJ_LRCP, "LRCP"},
+        {OPJ_PCRL, "PCRL"},
+        {OPJ_RLCP, "RLCP"},
+        {OPJ_RPCL, "RPCL"},
+        {(OPJ_PROG_ORDER)-1, ""}
+};
+
+/**
+ * FIXME DOC
+ */
+static const OPJ_UINT32 MCT_ELEMENT_SIZE [] =
+{
+        2,
+        4,
+        4,
+        8
+};
+
+typedef void (* opj_j2k_mct_function) (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+
+const opj_j2k_mct_function j2k_mct_read_functions_to_float [] =
+{
+        opj_j2k_read_int16_to_float,
+        opj_j2k_read_int32_to_float,
+        opj_j2k_read_float32_to_float,
+        opj_j2k_read_float64_to_float
+};
+
+const opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] =
+{
+        opj_j2k_read_int16_to_int32,
+        opj_j2k_read_int32_to_int32,
+        opj_j2k_read_float32_to_int32,
+        opj_j2k_read_float64_to_int32
+};
+
+const opj_j2k_mct_function j2k_mct_write_functions_from_float [] =
+{
+        opj_j2k_write_float_to_int16,
+        opj_j2k_write_float_to_int32,
+        opj_j2k_write_float_to_float,
+        opj_j2k_write_float_to_float64
+};
+
+typedef struct opj_dec_memory_marker_handler
+{
+        /** marker value */
+        OPJ_UINT32 id;
+        /** value of the state when the marker can appear */
+        OPJ_UINT32 states;
+        /** action linked to the marker */
+        OPJ_BOOL (*handler) (   opj_j2k_t *p_j2k,
+                            OPJ_BYTE * p_header_data,
+                            OPJ_UINT32 p_header_size,
+                            opj_event_mgr_t * p_manager );
+}
+opj_dec_memory_marker_handler_t;
+
+const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] =
+{
+  {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, opj_j2k_read_sot},
+  {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_cod},
+  {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_coc},
+  {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_rgn},
+  {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcd},
+  {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcc},
+  {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_poc},
+  {J2K_MS_SIZ, J2K_STATE_MHSIZ, opj_j2k_read_siz},
+  {J2K_MS_TLM, J2K_STATE_MH, opj_j2k_read_tlm},
+  {J2K_MS_PLM, J2K_STATE_MH, opj_j2k_read_plm},
+  {J2K_MS_PLT, J2K_STATE_TPH, opj_j2k_read_plt},
+  {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm_v3},
+  {J2K_MS_PPT, J2K_STATE_TPH, opj_j2k_read_ppt},
+  {J2K_MS_SOP, 0, 0},
+  {J2K_MS_CRG, J2K_STATE_MH, opj_j2k_read_crg},
+  {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_com},
+  {J2K_MS_MCT, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mct},
+  {J2K_MS_CBD, J2K_STATE_MH , opj_j2k_read_cbd},
+  {J2K_MS_MCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mcc},
+  {J2K_MS_MCO, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mco},
+#ifdef USE_JPWL
+#ifdef TODO_MS /* remove these functions which are not commpatible with the v2 API */
+  {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},
+  {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb},
+  {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd},
+  {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red},
+#endif
+#endif /* USE_JPWL */
+#ifdef USE_JPSEC
+  {J2K_MS_SEC, J2K_DEC_STATE_MH, j2k_read_sec},
+  {J2K_MS_INSEC, 0, j2k_read_insec}
+#endif /* USE_JPSEC */
+  {J2K_MS_UNK, J2K_STATE_MH | J2K_STATE_TPH, 0}/*opj_j2k_read_unk is directly used*/
+};
+
+void  opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+        OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_temp;
+
+        for (i=0;i<p_nb_elem;++i) {
+                opj_read_bytes(l_src_data,&l_temp,2);
+
+                l_src_data+=sizeof(OPJ_INT16);
+
+                *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
+        }
+}
+
+void  opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+        OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_temp;
+
+        for (i=0;i<p_nb_elem;++i) {
+                opj_read_bytes(l_src_data,&l_temp,4);
+
+                l_src_data+=sizeof(OPJ_INT32);
+
+                *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
+        }
+}
+
+void  opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+        OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
+        OPJ_UINT32 i;
+        OPJ_FLOAT32 l_temp;
+
+        for (i=0;i<p_nb_elem;++i) {
+                opj_read_float(l_src_data,&l_temp);
+
+                l_src_data+=sizeof(OPJ_FLOAT32);
+
+                *(l_dest_data++) = l_temp;
+        }
+}
+
+void  opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+        OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
+        OPJ_UINT32 i;
+        OPJ_FLOAT64 l_temp;
+
+        for (i=0;i<p_nb_elem;++i) {
+                opj_read_double(l_src_data,&l_temp);
+
+                l_src_data+=sizeof(OPJ_FLOAT64);
+
+                *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
+        }
+}
+
+void  opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+        OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_temp;
+
+        for (i=0;i<p_nb_elem;++i) {
+                opj_read_bytes(l_src_data,&l_temp,2);
+
+                l_src_data+=sizeof(OPJ_INT16);
+
+                *(l_dest_data++) = (OPJ_INT32) l_temp;
+        }
+}
+
+void  opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+        OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_temp;
+
+        for (i=0;i<p_nb_elem;++i) {
+                opj_read_bytes(l_src_data,&l_temp,4);
+
+                l_src_data+=sizeof(OPJ_INT32);
+
+                *(l_dest_data++) = (OPJ_INT32) l_temp;
+        }
+}
+
+void  opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+        OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
+        OPJ_UINT32 i;
+        OPJ_FLOAT32 l_temp;
+
+        for (i=0;i<p_nb_elem;++i) {
+                opj_read_float(l_src_data,&l_temp);
+
+                l_src_data+=sizeof(OPJ_FLOAT32);
+
+                *(l_dest_data++) = (OPJ_INT32) l_temp;
+        }
+}
+
+void  opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+        OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
+        OPJ_UINT32 i;
+        OPJ_FLOAT64 l_temp;
+
+        for (i=0;i<p_nb_elem;++i) {
+                opj_read_double(l_src_data,&l_temp);
+
+                l_src_data+=sizeof(OPJ_FLOAT64);
+
+                *(l_dest_data++) = (OPJ_INT32) l_temp;
+        }
+}
+
+void  opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+        OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
+        OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_temp;
+
+        for (i=0;i<p_nb_elem;++i) {
+                l_temp = (OPJ_UINT32) *(l_src_data++);
+
+                opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT16));
+
+                l_dest_data+=sizeof(OPJ_INT16);
+        }
+}
+
+void opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+        OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
+        OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_temp;
+
+        for (i=0;i<p_nb_elem;++i) {
+                l_temp = (OPJ_UINT32) *(l_src_data++);
+
+                opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT32));
+
+                l_dest_data+=sizeof(OPJ_INT32);
+        }
+}
+
+void  opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+        OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
+        OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
+        OPJ_UINT32 i;
+        OPJ_FLOAT32 l_temp;
+
+        for (i=0;i<p_nb_elem;++i) {
+                l_temp = (OPJ_FLOAT32) *(l_src_data++);
+
+                opj_write_float(l_dest_data,l_temp);
+
+                l_dest_data+=sizeof(OPJ_FLOAT32);
+        }
+}
+
+void  opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+        OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
+        OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
+        OPJ_UINT32 i;
+        OPJ_FLOAT64 l_temp;
+
+        for (i=0;i<p_nb_elem;++i) {
+                l_temp = (OPJ_FLOAT64) *(l_src_data++);
+
+                opj_write_double(l_dest_data,l_temp);
+
+                l_dest_data+=sizeof(OPJ_FLOAT64);
+        }
+}
+
+char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){
+        j2k_prog_order_t *po;
+        for(po = j2k_prog_order_list; po->enum_prog != -1; po++ ){
+                if(po->enum_prog == prg_order){
+                        return po->str_prog;
+                }
+        }
+        return po->str_prog;
+}
+
+OPJ_BOOL opj_j2k_check_poc_val( const opj_poc_t *p_pocs,
+                                                        OPJ_UINT32 p_nb_pocs,
+                                                        OPJ_UINT32 p_nb_resolutions,
+                                                        OPJ_UINT32 p_num_comps,
+                                                        OPJ_UINT32 p_num_layers,
+                                                        opj_event_mgr_t * p_manager)
+{
+        OPJ_UINT32* packet_array;
+        OPJ_UINT32 index , resno, compno, layno;
+        OPJ_UINT32 i;
+        OPJ_UINT32 step_c = 1;
+        OPJ_UINT32 step_r = p_num_comps * step_c;
+        OPJ_UINT32 step_l = p_nb_resolutions * step_r;
+        OPJ_BOOL loss = OPJ_FALSE;
+        OPJ_UINT32 layno0 = 0;
+
+        packet_array = (OPJ_UINT32*) opj_calloc(step_l * p_num_layers, sizeof(OPJ_UINT32));
+        if (packet_array == 00) {
+                opj_event_msg(p_manager , EVT_ERROR, "Not enough memory for checking the poc values.\n");
+                return OPJ_FALSE;
+        }
+        memset(packet_array,0,step_l * p_num_layers* sizeof(OPJ_UINT32));
+
+        if (p_nb_pocs == 0) {
+        opj_free(packet_array);
+                return OPJ_TRUE;
+        }
+
+        index = step_r * p_pocs->resno0;
+        /* take each resolution for each poc */
+        for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno)
+        {
+                OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;
+
+                /* take each comp of each resolution for each poc */
+                for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) {
+                        OPJ_UINT32 comp_index = res_index + layno0 * step_l;
+
+                        /* and finally take each layer of each res of ... */
+                        for (layno = layno0; layno < p_pocs->layno1 ; ++layno) {
+                                /*index = step_r * resno + step_c * compno + step_l * layno;*/
+                                packet_array[comp_index] = 1;
+                                comp_index += step_l;
+                        }
+
+                        res_index += step_c;
+                }
+
+                index += step_r;
+        }
+        ++p_pocs;
+
+        /* iterate through all the pocs */
+        for (i = 1; i < p_nb_pocs ; ++i) {
+                OPJ_UINT32 l_last_layno1 = (p_pocs-1)->layno1 ;
+
+                layno0 = (p_pocs->layno1 > l_last_layno1)? l_last_layno1 : 0;
+                index = step_r * p_pocs->resno0;
+
+                /* take each resolution for each poc */
+                for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno) {
+                        OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;
+
+                        /* take each comp of each resolution for each poc */
+                        for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) {
+                                OPJ_UINT32 comp_index = res_index + layno0 * step_l;
+
+                                /* and finally take each layer of each res of ... */
+                                for (layno = layno0; layno < p_pocs->layno1 ; ++layno) {
+                                        /*index = step_r * resno + step_c * compno + step_l * layno;*/
+                                        packet_array[comp_index] = 1;
+                                        comp_index += step_l;
+                                }
+
+                                res_index += step_c;
+                        }
+
+                        index += step_r;
+                }
+
+                ++p_pocs;
+        }
+
+        index = 0;
+        for (layno = 0; layno < p_num_layers ; ++layno) {
+                for (resno = 0; resno < p_nb_resolutions; ++resno) {
+                        for (compno = 0; compno < p_num_comps; ++compno) {
+                                loss |= (packet_array[index]!=1);
+                                /*index = step_r * resno + step_c * compno + step_l * layno;*/
+                                index += step_c;
+                        }
+                }
+        }
+
+        if (loss) {
+                opj_event_msg(p_manager , EVT_ERROR, "Missing packets possible loss of data\n");
+        }
+
+        opj_free(packet_array);
+
+        return !loss;
+}
+
+/* ----------------------------------------------------------------------- */
+
+OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno)
+{
+        const OPJ_CHAR *prog = 00;
+        OPJ_INT32 i;
+        OPJ_UINT32 tpnum = 1;
+        opj_tcp_t *tcp = 00;
+        opj_poc_t * l_current_poc = 00;
+
+        /*  preconditions */
+        assert(tileno < (cp->tw * cp->th));
+        assert(pino < (cp->tcps[tileno].numpocs + 1));
+
+        /* get the given tile coding parameter */
+        tcp = &cp->tcps[tileno];
+        assert(tcp != 00);
+
+        l_current_poc = &(tcp->pocs[pino]);
+        assert(l_current_poc != 0);
+
+        /* get the progression order as a character string */
+        prog = opj_j2k_convert_progression_order(tcp->prg);
+        assert(strlen(prog) > 0);
+
+        if (cp->m_specific_param.m_enc.m_tp_on == 1) {
+                for (i=0;i<4;++i) {
+                        switch (prog[i])
+                        {
+                                /* component wise */
+                                case 'C':
+                                        tpnum *= l_current_poc->compE;
+                                        break;
+                                /* resolution wise */
+                                case 'R':
+                                        tpnum *= l_current_poc->resE;
+                                        break;
+                                /* precinct wise */
+                                case 'P':
+                                        tpnum *= l_current_poc->prcE;
+                                        break;
+                                /* layer wise */
+                                case 'L':
+                                        tpnum *= l_current_poc->layE;
+                                        break;
+                        }
+                        /* whould we split here ? */
+                        if ( cp->m_specific_param.m_enc.m_tp_flag == prog[i] ) {
+                                cp->m_specific_param.m_enc.m_tp_pos=i;
+                                break;
+                        }
+                }
+        }
+        else {
+                tpnum=1;
+        }
+
+        return tpnum;
+}
+
+OPJ_BOOL opj_j2k_calculate_tp(  opj_j2k_t *p_j2k,
+                                                        opj_cp_t *cp,
+                                                        OPJ_UINT32 * p_nb_tiles,
+                                                        opj_image_t *image,
+                                                        opj_event_mgr_t * p_manager
+                                )
+{
+        OPJ_UINT32 pino,tileno;
+        OPJ_UINT32 l_nb_tiles;
+        opj_tcp_t *tcp;
+
+        /* preconditions */
+        assert(p_nb_tiles != 00);
+        assert(cp != 00);
+        assert(image != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_nb_tiles = cp->tw * cp->th;
+        * p_nb_tiles = 0;
+        tcp = cp->tcps;
+
+        /* INDEX >> */
+        /* TODO mergeV2: check this part which use cstr_info */
+        /*if (p_j2k->cstr_info) {
+                opj_tile_info_t * l_info_tile_ptr = p_j2k->cstr_info->tile;
+
+                for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
+                        OPJ_UINT32 cur_totnum_tp = 0;
+
+                        opj_pi_update_encoding_parameters(image,cp,tileno);
+
+                        for (pino = 0; pino <= tcp->numpocs; ++pino)
+                        {
+                                OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);
+
+                                *p_nb_tiles = *p_nb_tiles + tp_num;
+
+                                cur_totnum_tp += tp_num;
+                        }
+
+                        tcp->m_nb_tile_parts = cur_totnum_tp;
+
+                        l_info_tile_ptr->tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t));
+                        if (l_info_tile_ptr->tp == 00) {
+                                return OPJ_FALSE;
+                        }
+
+                        memset(l_info_tile_ptr->tp,0,cur_totnum_tp * sizeof(opj_tp_info_t));
+
+                        l_info_tile_ptr->num_tps = cur_totnum_tp;
+
+                        ++l_info_tile_ptr;
+                        ++tcp;
+                }
+        }
+        else */{
+                for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
+                        OPJ_UINT32 cur_totnum_tp = 0;
+
+                        opj_pi_update_encoding_parameters(image,cp,tileno);
+
+                        for (pino = 0; pino <= tcp->numpocs; ++pino) {
+                                OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);
+
+                                *p_nb_tiles = *p_nb_tiles + tp_num;
+
+                                cur_totnum_tp += tp_num;
+                        }
+                        tcp->m_nb_tile_parts = cur_totnum_tp;
+
+                        ++tcp;
+                }
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_soc(     opj_j2k_t *p_j2k,
+                                                opj_stream_private_t *p_stream,
+                                                    opj_event_mgr_t * p_manager )
+{
+        /* 2 bytes will be written */
+        OPJ_BYTE * l_start_stream = 00;
+
+        /* preconditions */
+        assert(p_stream != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+        /* write SOC identifier */
+        opj_write_bytes(l_start_stream,J2K_MS_SOC,2);
+
+        if (opj_stream_write_data(p_stream,l_start_stream,2,p_manager) != 2) {
+                return OPJ_FALSE;
+        }
+
+/* UniPG>> */
+#ifdef USE_JPWL
+        /* update markers struct */
+/*
+        OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOC, p_stream_tell(p_stream) - 2, 2);
+*/
+  assert( 0 && "TODO" );
+#endif /* USE_JPWL */
+/* <<UniPG */
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a SOC marker (Start of Codestream)
+ * @param       p_j2k           the jpeg2000 file codec.
+ * @param       p_stream        FIXME DOC
+ * @param       p_manager       the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_soc(   opj_j2k_t *p_j2k,
+                                    opj_stream_private_t *p_stream,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        OPJ_BYTE l_data [2];
+        OPJ_UINT32 l_marker;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) {
+                return OPJ_FALSE;
+        }
+
+        opj_read_bytes(l_data,&l_marker,2);
+        if (l_marker != J2K_MS_SOC) {
+                return OPJ_FALSE;
+        }
+
+        /* Next marker should be a SIZ marker in the main header */
+        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSIZ;
+
+        /* FIXME move it in a index structure included in p_j2k*/
+        p_j2k->cstr_index->main_head_start = opj_stream_tell(p_stream) - 2;
+
+        opj_event_msg(p_manager, EVT_INFO, "Start to read j2k main header (%d).\n", p_j2k->cstr_index->main_head_start);
+
+        /* Add the marker to the codestream index*/
+        if (OPJ_FALSE == opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_SOC, p_j2k->cstr_index->main_head_start, 2)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
+                return OPJ_FALSE;
+        }
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_siz(     opj_j2k_t *p_j2k,
+                                                        opj_stream_private_t *p_stream,
+                                                        opj_event_mgr_t * p_manager )
+{
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_size_len;
+        OPJ_BYTE * l_current_ptr;
+        opj_image_t * l_image = 00;
+        opj_cp_t *cp = 00;
+        opj_image_comp_t * l_img_comp = 00;
+
+        /* preconditions */
+        assert(p_stream != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_image = p_j2k->m_private_image;
+        cp = &(p_j2k->m_cp);
+        l_size_len = 40 + 3 * l_image->numcomps;
+        l_img_comp = l_image->comps;
+
+        if (l_size_len > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+
+                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len);
+                if (! new_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for the SIZ marker\n");
+                        return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_size_len;
+        }
+
+        l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+        /* write SOC identifier */
+        opj_write_bytes(l_current_ptr,J2K_MS_SIZ,2);    /* SIZ */
+        l_current_ptr+=2;
+
+        opj_write_bytes(l_current_ptr,l_size_len-2,2); /* L_SIZ */
+        l_current_ptr+=2;
+
+        opj_write_bytes(l_current_ptr, cp->rsiz, 2);    /* Rsiz (capabilities) */
+        l_current_ptr+=2;
+
+        opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */
+        l_current_ptr+=4;
+
+        opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */
+        l_current_ptr+=4;
+
+        opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */
+        l_current_ptr+=4;
+
+        opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */
+        l_current_ptr+=4;
+
+        opj_write_bytes(l_current_ptr, cp->tdx, 4);             /* XTsiz */
+        l_current_ptr+=4;
+
+        opj_write_bytes(l_current_ptr, cp->tdy, 4);             /* YTsiz */
+        l_current_ptr+=4;
+
+        opj_write_bytes(l_current_ptr, cp->tx0, 4);             /* XT0siz */
+        l_current_ptr+=4;
+
+        opj_write_bytes(l_current_ptr, cp->ty0, 4);             /* YT0siz */
+        l_current_ptr+=4;
+
+        opj_write_bytes(l_current_ptr, l_image->numcomps, 2);   /* Csiz */
+        l_current_ptr+=2;
+
+        for (i = 0; i < l_image->numcomps; ++i) {
+                /* TODO here with MCT ? */
+                opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7), 1);      /* Ssiz_i */
+                ++l_current_ptr;
+
+                opj_write_bytes(l_current_ptr, l_img_comp->dx, 1);      /* XRsiz_i */
+                ++l_current_ptr;
+
+                opj_write_bytes(l_current_ptr, l_img_comp->dy, 1);      /* YRsiz_i */
+                ++l_current_ptr;
+
+                ++l_img_comp;
+        }
+
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_size_len,p_manager) != l_size_len) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a SIZ marker (image and tile size)
+ * @param       p_j2k           the jpeg2000 file codec.
+ * @param       p_header_data   the data contained in the SIZ box.
+ * @param       p_header_size   the size of the data contained in the SIZ marker.
+ * @param       p_manager       the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                 )
+{
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_nb_comp;
+        OPJ_UINT32 l_nb_comp_remain;
+        OPJ_UINT32 l_remaining_size;
+        OPJ_UINT32 l_nb_tiles;
+        OPJ_UINT32 l_tmp;
+        opj_image_t *l_image = 00;
+        opj_cp_t *l_cp = 00;
+        opj_image_comp_t * l_img_comp = 00;
+        opj_tcp_t * l_current_tile_param = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_header_data != 00);
+
+        l_image = p_j2k->m_private_image;
+        l_cp = &(p_j2k->m_cp);
+
+        /* minimum size == 39 - 3 (= minimum component parameter) */
+        if (p_header_size < 36) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
+                return OPJ_FALSE;
+        }
+
+        l_remaining_size = p_header_size - 36;
+        l_nb_comp = l_remaining_size / 3;
+        l_nb_comp_remain = l_remaining_size % 3;
+        if (l_nb_comp_remain != 0){
+                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
+                return OPJ_FALSE;
+        }
+
+        opj_read_bytes(p_header_data,&l_tmp ,2);                                                /* Rsiz (capabilities) */
+        p_header_data+=2;
+        l_cp->rsiz = (OPJ_RSIZ_CAPABILITIES) l_tmp;
+        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x1, 4);   /* Xsiz */
+        p_header_data+=4;
+        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y1, 4);   /* Ysiz */
+        p_header_data+=4;
+        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x0, 4);   /* X0siz */
+        p_header_data+=4;
+        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y0, 4);   /* Y0siz */
+        p_header_data+=4;
+        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdx, 4);             /* XTsiz */
+        p_header_data+=4;
+        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdy, 4);             /* YTsiz */
+        p_header_data+=4;
+        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tx0, 4);             /* XT0siz */
+        p_header_data+=4;
+        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->ty0, 4);             /* YT0siz */
+        p_header_data+=4;
+        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_tmp, 2);                 /* Csiz */
+        p_header_data+=2;
+        if (l_tmp < 16385)
+                l_image->numcomps = (OPJ_UINT16) l_tmp;
+        else {
+                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: number of component is illegal -> %d\n", l_tmp);
+                return OPJ_FALSE;
+        }
+
+        if (l_image->numcomps != l_nb_comp) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: number of component is not compatible with the remaining number of parameters ( %d vs %d)\n", l_image->numcomps, l_nb_comp);
+                return OPJ_FALSE;
+        }
+
+        /* testcase 4035.pdf.SIGSEGV.d8b.3375 */
+        if (l_image->x0 > l_image->x1 || l_image->y0 > l_image->y1) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: negative image size (%d x %d)\n", l_image->x1 - l_image->x0, l_image->y1 - l_image->y0);
+                return OPJ_FALSE;
+        }
+        /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */
+        if (!(l_cp->tdx * l_cp->tdy)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\n", l_cp->tdx, l_cp->tdy);
+                return OPJ_FALSE;
+        }
+
+        /* testcase 1610.pdf.SIGSEGV.59c.681 */
+        if (((OPJ_UINT64)l_image->x1) * ((OPJ_UINT64)l_image->y1) != (l_image->x1 * l_image->y1)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Prevent buffer overflow (x1: %d, y1: %d)\n", l_image->x1, l_image->y1);
+                return OPJ_FALSE;
+        }
+
+#ifdef USE_JPWL
+        if (l_cp->correct) {
+                /* if JPWL is on, we check whether TX errors have damaged
+                  too much the SIZ parameters */
+                if (!(l_image->x1 * l_image->y1)) {
+                        opj_event_msg(p_manager, EVT_ERROR,
+                                "JPWL: bad image size (%d x %d)\n",
+                                l_image->x1, l_image->y1);
+                        if (!JPWL_ASSUME || JPWL_ASSUME) {
+                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                                return OPJ_FALSE;
+                        }
+                }
+
+        /* FIXME check previously in the function so why keep this piece of code ? Need by the norm ?
+                if (l_image->numcomps != ((len - 38) / 3)) {
+                        opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+                                "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n",
+                                l_image->numcomps, ((len - 38) / 3));
+                        if (!JPWL_ASSUME) {
+                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                                return OPJ_FALSE;
+                        }
+        */              /* we try to correct */
+        /*              opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n");
+                        if (l_image->numcomps < ((len - 38) / 3)) {
+                                len = 38 + 3 * l_image->numcomps;
+                                opj_event_msg(p_manager, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n",
+                                        len);
+                        } else {
+                                l_image->numcomps = ((len - 38) / 3);
+                                opj_event_msg(p_manager, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n",
+                                        l_image->numcomps);
+                        }
+                }
+        */
+
+                /* update components number in the jpwl_exp_comps filed */
+                l_cp->exp_comps = l_image->numcomps;
+        }
+#endif /* USE_JPWL */
+
+        /* Allocate the resulting image components */
+        l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps, sizeof(opj_image_comp_t));
+        if (l_image->comps == 00){
+                l_image->numcomps = 0;
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+                return OPJ_FALSE;
+        }
+
+        memset(l_image->comps,0,l_image->numcomps * sizeof(opj_image_comp_t));
+        l_img_comp = l_image->comps;
+
+        /* Read the component information */
+        for (i = 0; i < l_image->numcomps; ++i){
+                OPJ_UINT32 tmp;
+                opj_read_bytes(p_header_data,&tmp,1);   /* Ssiz_i */
+                ++p_header_data;
+                l_img_comp->prec = (tmp & 0x7f) + 1;
+                l_img_comp->sgnd = tmp >> 7;
+                opj_read_bytes(p_header_data,&tmp,1);   /* XRsiz_i */
+                ++p_header_data;
+                l_img_comp->dx = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
+                opj_read_bytes(p_header_data,&tmp,1);   /* YRsiz_i */
+                ++p_header_data;
+                l_img_comp->dy = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
+                if( l_img_comp->dx < 1 || l_img_comp->dx > 255 ||
+                    l_img_comp->dy < 1 || l_img_comp->dy > 255 ) {
+                    opj_event_msg(p_manager, EVT_ERROR,
+                                  "Invalid values for comp = %d : dx=%u dy=%u\n (should be between 1 and 255 according the JPEG2000 norm)",
+                                  i, l_img_comp->dx, l_img_comp->dy);
+                    return OPJ_FALSE;
+                }
+
+#ifdef USE_JPWL
+                if (l_cp->correct) {
+                /* if JPWL is on, we check whether TX errors have damaged
+                        too much the SIZ parameters, again */
+                        if (!(l_image->comps[i].dx * l_image->comps[i].dy)) {
+                                opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+                                        "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n",
+                                        i, i, l_image->comps[i].dx, l_image->comps[i].dy);
+                                if (!JPWL_ASSUME) {
+                                        opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                                        return OPJ_FALSE;
+                                }
+                                /* we try to correct */
+                                opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
+                                if (!l_image->comps[i].dx) {
+                                        l_image->comps[i].dx = 1;
+                                        opj_event_msg(p_manager, EVT_WARNING, "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n",
+                                                i, l_image->comps[i].dx);
+                                }
+                                if (!l_image->comps[i].dy) {
+                                        l_image->comps[i].dy = 1;
+                                        opj_event_msg(p_manager, EVT_WARNING, "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n",
+                                                i, l_image->comps[i].dy);
+                                }
+                        }
+                }
+#endif /* USE_JPWL */
+                l_img_comp->resno_decoded = 0;                                                          /* number of resolution decoded */
+                l_img_comp->factor = l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */
+                ++l_img_comp;
+        }
+
+        /* Compute the number of tiles */
+        l_cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->x1 - l_cp->tx0), (OPJ_INT32)l_cp->tdx);
+        l_cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->y1 - l_cp->ty0), (OPJ_INT32)l_cp->tdy);
+
+        /* Check that the number of tiles is valid */
+        if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {
+            opj_event_msg(  p_manager, EVT_ERROR, 
+                            "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
+                            l_cp->tw, l_cp->th);
+            return OPJ_FALSE;
+        }
+        l_nb_tiles = l_cp->tw * l_cp->th;
+
+        /* Define the tiles which will be decoded */
+        if (p_j2k->m_specific_param.m_decoder.m_discard_tiles) {
+                p_j2k->m_specific_param.m_decoder.m_start_tile_x = (p_j2k->m_specific_param.m_decoder.m_start_tile_x - l_cp->tx0) / l_cp->tdx;
+                p_j2k->m_specific_param.m_decoder.m_start_tile_y = (p_j2k->m_specific_param.m_decoder.m_start_tile_y - l_cp->ty0) / l_cp->tdy;
+                p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0), (OPJ_INT32)l_cp->tdx);
+                p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0), (OPJ_INT32)l_cp->tdy);
+        }
+        else {
+                p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
+                p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
+                p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
+                p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
+        }
+
+#ifdef USE_JPWL
+        if (l_cp->correct) {
+                /* if JPWL is on, we check whether TX errors have damaged
+                  too much the SIZ parameters */
+                if ((l_cp->tw < 1) || (l_cp->th < 1) || (l_cp->tw > l_cp->max_tiles) || (l_cp->th > l_cp->max_tiles)) {
+                        opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+                                "JPWL: bad number of tiles (%d x %d)\n",
+                                l_cp->tw, l_cp->th);
+                        if (!JPWL_ASSUME) {
+                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                                return OPJ_FALSE;
+                        }
+                        /* we try to correct */
+                        opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
+                        if (l_cp->tw < 1) {
+                                l_cp->tw= 1;
+                                opj_event_msg(p_manager, EVT_WARNING, "- setting %d tiles in x => HYPOTHESIS!!!\n",
+                                                l_cp->tw);
+                        }
+                        if (l_cp->tw > l_cp->max_tiles) {
+                                l_cp->tw= 1;
+                                opj_event_msg(p_manager, EVT_WARNING, "- too large x, increase expectance of %d\n"
+                                        "- setting %d tiles in x => HYPOTHESIS!!!\n",
+                                        l_cp->max_tiles, l_cp->tw);
+                        }
+                        if (l_cp->th < 1) {
+                                l_cp->th= 1;
+                                opj_event_msg(p_manager, EVT_WARNING, "- setting %d tiles in y => HYPOTHESIS!!!\n",
+                                                l_cp->th);
+                        }
+                        if (l_cp->th > l_cp->max_tiles) {
+                                l_cp->th= 1;
+                                opj_event_msg(p_manager, EVT_WARNING, "- too large y, increase expectance of %d to continue\n",
+                                        "- setting %d tiles in y => HYPOTHESIS!!!\n",
+                                        l_cp->max_tiles, l_cp->th);
+                        }
+                }
+        }
+#endif /* USE_JPWL */
+
+        /* memory allocations */
+        l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t));
+        if (l_cp->tcps == 00) {
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+                return OPJ_FALSE;
+        }
+        memset(l_cp->tcps,0,l_nb_tiles*sizeof(opj_tcp_t));
+
+#ifdef USE_JPWL
+        if (l_cp->correct) {
+                if (!l_cp->tcps) {
+                        opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+                                "JPWL: could not alloc tcps field of cp\n");
+                        if (!JPWL_ASSUME || JPWL_ASSUME) {
+                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                                return OPJ_FALSE;
+                        }
+                }
+        }
+#endif /* USE_JPWL */
+
+        p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps =
+                        (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
+        if(p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps  == 00) {
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+                return OPJ_FALSE;
+        }
+        memset(p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps ,0,l_image->numcomps*sizeof(opj_tccp_t));
+
+        p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records =
+                        (opj_mct_data_t*)opj_malloc(OPJ_J2K_MCT_DEFAULT_NB_RECORDS * sizeof(opj_mct_data_t));
+
+        if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records) {
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+                return OPJ_FALSE;
+        }
+        memset(p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records,0,OPJ_J2K_MCT_DEFAULT_NB_RECORDS * sizeof(opj_mct_data_t));
+        p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records = OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+
+        p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records =
+                        (opj_simple_mcc_decorrelation_data_t*)
+                        opj_malloc(OPJ_J2K_MCC_DEFAULT_NB_RECORDS * sizeof(opj_simple_mcc_decorrelation_data_t));
+
+        if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records) {
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+                return OPJ_FALSE;
+        }
+        memset(p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records,0,OPJ_J2K_MCC_DEFAULT_NB_RECORDS * sizeof(opj_simple_mcc_decorrelation_data_t));
+        p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records = OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
+
+        /* set up default dc level shift */
+        for (i=0;i<l_image->numcomps;++i) {
+                if (! l_image->comps[i].sgnd) {
+                        p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1 << (l_image->comps[i].prec - 1);
+                }
+        }
+
+        l_current_tile_param = l_cp->tcps;
+        for     (i = 0; i < l_nb_tiles; ++i) {
+                l_current_tile_param->tccps = (opj_tccp_t*) opj_malloc(l_image->numcomps * sizeof(opj_tccp_t));
+                if (l_current_tile_param->tccps == 00) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+                        return OPJ_FALSE;
+                }
+                memset(l_current_tile_param->tccps,0,l_image->numcomps * sizeof(opj_tccp_t));
+
+                ++l_current_tile_param;
+        }
+
+        p_j2k->m_specific_param.m_decoder.m_state =  J2K_STATE_MH; /* FIXME J2K_DEC_STATE_MH; */
+        opj_image_comp_header_update(l_image,l_cp);
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_com(     opj_j2k_t *p_j2k,
+                                                        opj_stream_private_t *p_stream,
+                                                        opj_event_mgr_t * p_manager
+                            )
+{
+        OPJ_UINT32 l_comment_size;
+        OPJ_UINT32 l_total_com_size;
+        const OPJ_CHAR *l_comment;
+        OPJ_BYTE * l_current_ptr = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_stream != 00);
+        assert(p_manager != 00);
+
+        l_comment = p_j2k->m_cp.comment;
+        l_comment_size = (OPJ_UINT32)strlen(l_comment);
+        l_total_com_size = l_comment_size + 6;
+
+        if (l_total_com_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size);
+                if (! new_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write the COM marker\n");
+                        return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_total_com_size;
+        }
+
+        l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+        opj_write_bytes(l_current_ptr,J2K_MS_COM , 2);  /* COM */
+        l_current_ptr+=2;
+
+        opj_write_bytes(l_current_ptr,l_total_com_size - 2 , 2);        /* L_COM */
+        l_current_ptr+=2;
+
+        opj_write_bytes(l_current_ptr,1 , 2);   /* General use (IS 8859-15:1999 (Latin) values) */
+        l_current_ptr+=2;
+
+        memcpy( l_current_ptr,l_comment,l_comment_size);
+
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_total_com_size,p_manager) != l_total_com_size) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a COM marker (comments)
+ * @param       p_j2k           the jpeg2000 file codec.
+ * @param       p_header_data   the data contained in the COM box.
+ * @param       p_header_size   the size of the data contained in the COM marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_com (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_header_data != 00);
+  (void)p_header_size;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_cod(     opj_j2k_t *p_j2k,
+                                                        opj_stream_private_t *p_stream,
+                                                        opj_event_mgr_t * p_manager )
+{
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        OPJ_UINT32 l_code_size,l_remaining_size;
+        OPJ_BYTE * l_current_data = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
+        l_code_size = 9 + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,0);
+        l_remaining_size = l_code_size;
+
+        if (l_code_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size);
+                if (! new_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COD marker\n");
+                        return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_code_size;
+        }
+
+        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+        opj_write_bytes(l_current_data,J2K_MS_COD,2);           /* COD */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_code_size-2,2);        /* L_COD */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_tcp->csty,1);          /* Scod */
+        ++l_current_data;
+
+        opj_write_bytes(l_current_data,l_tcp->prg,1);           /* SGcod (A) */
+        ++l_current_data;
+
+        opj_write_bytes(l_current_data,l_tcp->numlayers,2);     /* SGcod (B) */
+        l_current_data+=2;
+
+        opj_write_bytes(l_current_data,l_tcp->mct,1);           /* SGcod (C) */
+        ++l_current_data;
+
+        l_remaining_size -= 9;
+
+        if (! opj_j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
+                return OPJ_FALSE;
+        }
+
+        if (l_remaining_size != 0) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
+                return OPJ_FALSE;
+        }
+
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_code_size,p_manager) != l_code_size) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a COD marker (Coding Styke defaults)
+ * @param       p_header_data   the data contained in the COD box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the COD marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_cod (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        /* loop */
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_tmp;
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        opj_image_t *l_image = 00;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_image = p_j2k->m_private_image;
+        l_cp = &(p_j2k->m_cp);
+
+        /* If we are in the first tile-part header of the current tile */
+        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
+                                &l_cp->tcps[p_j2k->m_current_tile_number] :
+                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+        /* Make sure room is sufficient */
+        if (p_header_size < 5) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
+                return OPJ_FALSE;
+        }
+
+        opj_read_bytes(p_header_data,&l_tcp->csty,1);           /* Scod */
+        ++p_header_data;
+        opj_read_bytes(p_header_data,&l_tmp,1);                         /* SGcod (A) */
+        ++p_header_data;
+        l_tcp->prg = (OPJ_PROG_ORDER) l_tmp;
+        opj_read_bytes(p_header_data,&l_tcp->numlayers,2);      /* SGcod (B) */
+        p_header_data+=2;
+
+        /* If user didn't set a number layer to decode take the max specify in the codestream. */
+        if      (l_cp->m_specific_param.m_dec.m_layer) {
+                l_tcp->num_layers_to_decode = l_cp->m_specific_param.m_dec.m_layer;
+        }
+        else {
+                l_tcp->num_layers_to_decode = l_tcp->numlayers;
+        }
+
+        opj_read_bytes(p_header_data,&l_tcp->mct,1);            /* SGcod (C) */
+        ++p_header_data;
+
+        p_header_size -= 5;
+        for     (i = 0; i < l_image->numcomps; ++i) {
+                l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT;
+        }
+
+        if (! opj_j2k_read_SPCod_SPCoc(p_j2k,0,p_header_data,&p_header_size,p_manager)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
+                return OPJ_FALSE;
+        }
+
+        if (p_header_size != 0) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
+                return OPJ_FALSE;
+        }
+
+        /* Apply the coding style to other components of the current tile or the m_default_tcp*/
+        opj_j2k_copy_tile_component_parameters(p_j2k);
+
+        /* Index */
+#ifdef WIP_REMOVE_MSD
+        if (p_j2k->cstr_info) {
+                /*opj_codestream_info_t *l_cstr_info = p_j2k->cstr_info;*/
+                p_j2k->cstr_info->prog = l_tcp->prg;
+                p_j2k->cstr_info->numlayers = l_tcp->numlayers;
+                p_j2k->cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(l_image->numcomps * sizeof(OPJ_UINT32));
+                for     (i = 0; i < l_image->numcomps; ++i) {
+                        p_j2k->cstr_info->numdecompos[i] = l_tcp->tccps[i].numresolutions - 1;
+                }
+        }
+#endif
+
+        return OPJ_TRUE;
+}
+
+#if 0
+OPJ_BOOL opj_j2k_write_coc( opj_j2k_t *p_j2k,
+                                                OPJ_UINT32 p_comp_no,
+                                                opj_stream_private_t *p_stream,
+                                                opj_event_mgr_t * p_manager )
+{
+        OPJ_UINT32 l_coc_size,l_remaining_size;
+        OPJ_UINT32 l_comp_room;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_comp_room = (p_j2k->m_private_image->numcomps <= 256) ? 1 : 2;
+
+        l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
+
+        if (l_coc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+                OPJ_BYTE *new_header_tile_data;
+                /*p_j2k->m_specific_param.m_encoder.m_header_tile_data
+                        = (OPJ_BYTE*)opj_realloc(
+                                p_j2k->m_specific_param.m_encoder.m_header_tile_data,
+                                l_coc_size);*/
+
+                new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size);
+                if (! new_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COC marker\n");
+                        return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_coc_size;
+        }
+
+        opj_j2k_write_coc_in_memory(p_j2k,p_comp_no,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_remaining_size,p_manager);
+
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_coc_size,p_manager) != l_coc_size) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+#endif
+
+#if 0
+void opj_j2k_write_coc_in_memory(   opj_j2k_t *p_j2k,
+                                                OPJ_UINT32 p_comp_no,
+                                                OPJ_BYTE * p_data,
+                                                OPJ_UINT32 * p_data_written,
+                                                opj_event_mgr_t * p_manager
+                                    )
+{
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        OPJ_UINT32 l_coc_size,l_remaining_size;
+        OPJ_BYTE * l_current_data = 00;
+        opj_image_t *l_image = 00;
+        OPJ_UINT32 l_comp_room;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
+        l_image = p_j2k->m_private_image;
+        l_comp_room = (l_image->numcomps <= 256) ? 1 : 2;
+
+        l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
+        l_remaining_size = l_coc_size;
+
+        l_current_data = p_data;
+
+        opj_write_bytes(l_current_data,J2K_MS_COC,2);                           /* COC */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_coc_size-2,2);                         /* L_COC */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,p_comp_no, l_comp_room);         /* Ccoc */
+        l_current_data+=l_comp_room;
+
+        opj_write_bytes(l_current_data, l_tcp->tccps[p_comp_no].csty, 1);               /* Scoc */
+        ++l_current_data;
+
+        l_remaining_size -= (5 + l_comp_room);
+        opj_j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager);
+        * p_data_written = l_coc_size;
+}
+#endif
+
+OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k)
+{
+        OPJ_UINT32 i,j;
+        OPJ_UINT32 l_nb_comp;
+        OPJ_UINT32 l_nb_tiles;
+        OPJ_UINT32 l_max = 0;
+
+        /* preconditions */
+
+        l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
+        l_nb_comp = p_j2k->m_private_image->numcomps;
+
+        for (i=0;i<l_nb_tiles;++i) {
+                for (j=0;j<l_nb_comp;++j) {
+                        l_max = opj_uint_max(l_max,opj_j2k_get_SPCod_SPCoc_size(p_j2k,i,j));
+                }
+        }
+
+        return 6 + l_max;
+}
+
+/**
+ * Reads a COC marker (Coding Style Component)
+ * @param       p_header_data   the data contained in the COC box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the COC marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_coc (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        opj_cp_t *l_cp = NULL;
+        opj_tcp_t *l_tcp = NULL;
+        opj_image_t *l_image = NULL;
+        OPJ_UINT32 l_comp_room;
+        OPJ_UINT32 l_comp_no;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ) ? /*FIXME J2K_DEC_STATE_TPH*/
+                                &l_cp->tcps[p_j2k->m_current_tile_number] :
+                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
+        l_image = p_j2k->m_private_image;
+
+        l_comp_room = l_image->numcomps <= 256 ? 1 : 2;
+
+        /* make sure room is sufficient*/
+        if (p_header_size < l_comp_room + 1) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
+                return OPJ_FALSE;
+        }
+        p_header_size -= l_comp_room + 1;
+
+        opj_read_bytes(p_header_data,&l_comp_no,l_comp_room);                   /* Ccoc */
+        p_header_data += l_comp_room;
+        if (l_comp_no >= l_image->numcomps) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker (bad number of components)\n");
+                return OPJ_FALSE;
+        }
+
+        opj_read_bytes(p_header_data,&l_tcp->tccps[l_comp_no].csty,1);                  /* Scoc */
+        ++p_header_data ;
+
+        if (! opj_j2k_read_SPCod_SPCoc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
+                return OPJ_FALSE;
+        }
+
+        if (p_header_size != 0) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
+                return OPJ_FALSE;
+        }
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_qcd(     opj_j2k_t *p_j2k,
+                                                        opj_stream_private_t *p_stream,
+                                                        opj_event_mgr_t * p_manager
+                            )
+{
+        OPJ_UINT32 l_qcd_size,l_remaining_size;
+        OPJ_BYTE * l_current_data = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_qcd_size = 4 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,0);
+        l_remaining_size = l_qcd_size;
+
+        if (l_qcd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size);
+                if (! new_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCD marker\n");
+                        return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcd_size;
+        }
+
+        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+        opj_write_bytes(l_current_data,J2K_MS_QCD,2);           /* QCD */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_qcd_size-2,2);         /* L_QCD */
+        l_current_data += 2;
+
+        l_remaining_size -= 4;
+
+        if (! opj_j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
+                return OPJ_FALSE;
+        }
+
+        if (l_remaining_size != 0) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
+                return OPJ_FALSE;
+        }
+
+        if (opj_stream_write_data(p_stream, p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_qcd_size,p_manager) != l_qcd_size) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a QCD marker (Quantization defaults)
+ * @param       p_header_data   the data contained in the QCD box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the QCD marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_qcd (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        if (! opj_j2k_read_SQcd_SQcc(p_j2k,0,p_header_data,&p_header_size,p_manager)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
+                return OPJ_FALSE;
+        }
+
+        if (p_header_size != 0) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
+                return OPJ_FALSE;
+        }
+
+        /* Apply the quantization parameters to other components of the current tile or the m_default_tcp */
+        opj_j2k_copy_tile_quantization_parameters(p_j2k);
+
+        return OPJ_TRUE;
+}
+
+#if 0
+OPJ_BOOL opj_j2k_write_qcc(     opj_j2k_t *p_j2k,
+                                                OPJ_UINT32 p_comp_no,
+                                                opj_stream_private_t *p_stream,
+                                                opj_event_mgr_t * p_manager
+                            )
+{
+        OPJ_UINT32 l_qcc_size,l_remaining_size;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_qcc_size = 5 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
+        l_qcc_size += p_j2k->m_private_image->numcomps <= 256 ? 0:1;
+        l_remaining_size = l_qcc_size;
+
+        if (l_qcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size);
+                if (! new_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCC marker\n");
+                        return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcc_size;
+        }
+
+        opj_j2k_write_qcc_in_memory(p_j2k,p_comp_no,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_remaining_size,p_manager);
+
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_qcc_size,p_manager) != l_qcc_size) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+#endif
+
+#if 0
+void opj_j2k_write_qcc_in_memory(   opj_j2k_t *p_j2k,
+                                                                OPJ_UINT32 p_comp_no,
+                                                                OPJ_BYTE * p_data,
+                                                                OPJ_UINT32 * p_data_written,
+                                                                opj_event_mgr_t * p_manager
+                                    )
+{
+        OPJ_UINT32 l_qcc_size,l_remaining_size;
+        OPJ_BYTE * l_current_data = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_qcc_size = 6 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
+        l_remaining_size = l_qcc_size;
+
+        l_current_data = p_data;
+
+        opj_write_bytes(l_current_data,J2K_MS_QCC,2);           /* QCC */
+        l_current_data += 2;
+
+        if (p_j2k->m_private_image->numcomps <= 256) {
+                --l_qcc_size;
+
+                opj_write_bytes(l_current_data,l_qcc_size-2,2);         /* L_QCC */
+                l_current_data += 2;
+
+                opj_write_bytes(l_current_data, p_comp_no, 1);  /* Cqcc */
+                ++l_current_data;
+
+                /* in the case only one byte is sufficient the last byte allocated is useless -> still do -6 for available */
+                l_remaining_size -= 6;
+        }
+        else {
+                opj_write_bytes(l_current_data,l_qcc_size-2,2);         /* L_QCC */
+                l_current_data += 2;
+
+                opj_write_bytes(l_current_data, p_comp_no, 2);  /* Cqcc */
+                l_current_data+=2;
+
+                l_remaining_size -= 6;
+        }
+
+        opj_j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,p_comp_no,l_current_data,&l_remaining_size,p_manager);
+
+        *p_data_written = l_qcc_size;
+}
+#endif
+
+OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k)
+{
+        return opj_j2k_get_max_coc_size(p_j2k);
+}
+
+/**
+ * Reads a QCC marker (Quantization component)
+ * @param       p_header_data   the data contained in the QCC box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the QCC marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_qcc(   opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        OPJ_UINT32 l_num_comp,l_comp_no;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_num_comp = p_j2k->m_private_image->numcomps;
+
+        if (l_num_comp <= 256) {
+                if (p_header_size < 1) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
+                        return OPJ_FALSE;
+                }
+                opj_read_bytes(p_header_data,&l_comp_no,1);
+                ++p_header_data;
+                --p_header_size;
+        }
+        else {
+                if (p_header_size < 2) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
+                        return OPJ_FALSE;
+                }
+                opj_read_bytes(p_header_data,&l_comp_no,2);
+                p_header_data+=2;
+                p_header_size-=2;
+        }
+
+#ifdef USE_JPWL
+        if (p_j2k->m_cp.correct) {
+
+                static OPJ_UINT32 backup_compno = 0;
+
+                /* compno is negative or larger than the number of components!!! */
+                if (/*(l_comp_no < 0) ||*/ (l_comp_no >= l_num_comp)) {
+                        opj_event_msg(p_manager, EVT_ERROR,
+                                "JPWL: bad component number in QCC (%d out of a maximum of %d)\n",
+                                l_comp_no, l_num_comp);
+                        if (!JPWL_ASSUME) {
+                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                                return OPJ_FALSE;
+                        }
+                        /* we try to correct */
+                        l_comp_no = backup_compno % l_num_comp;
+                        opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
+                                "- setting component number to %d\n",
+                                l_comp_no);
+                }
+
+                /* keep your private count of tiles */
+                backup_compno++;
+        };
+#endif /* USE_JPWL */
+
+        if (l_comp_no >= p_j2k->m_private_image->numcomps) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Invalid component number: %d, regarding the number of components %d\n",
+                              l_comp_no, p_j2k->m_private_image->numcomps);
+                return OPJ_FALSE;
+        }
+
+        if (! opj_j2k_read_SQcd_SQcc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
+                return OPJ_FALSE;
+        }
+
+        if (p_header_size != 0) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_poc(     opj_j2k_t *p_j2k,
+                                                        opj_stream_private_t *p_stream,
+                                                        opj_event_mgr_t * p_manager
+                            )
+{
+        OPJ_UINT32 l_nb_comp;
+        OPJ_UINT32 l_nb_poc;
+        OPJ_UINT32 l_poc_size;
+        OPJ_UINT32 l_written_size = 0;
+        opj_tcp_t *l_tcp = 00;
+        OPJ_UINT32 l_poc_room;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
+        l_nb_comp = p_j2k->m_private_image->numcomps;
+        l_nb_poc = 1 + l_tcp->numpocs;
+
+        if (l_nb_comp <= 256) {
+                l_poc_room = 1;
+        }
+        else {
+                l_poc_room = 2;
+        }
+        l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
+
+        if (l_poc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size);
+                if (! new_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write POC marker\n");
+                        return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_poc_size;
+        }
+
+        opj_j2k_write_poc_in_memory(p_j2k,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_written_size,p_manager);
+
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_poc_size,p_manager) != l_poc_size) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+void opj_j2k_write_poc_in_memory(   opj_j2k_t *p_j2k,
+                                                                OPJ_BYTE * p_data,
+                                                                OPJ_UINT32 * p_data_written,
+                                                                opj_event_mgr_t * p_manager
+                                    )
+{
+        OPJ_UINT32 i;
+        OPJ_BYTE * l_current_data = 00;
+        OPJ_UINT32 l_nb_comp;
+        OPJ_UINT32 l_nb_poc;
+        OPJ_UINT32 l_poc_size;
+        opj_image_t *l_image = 00;
+        opj_tcp_t *l_tcp = 00;
+        opj_tccp_t *l_tccp = 00;
+        opj_poc_t *l_current_poc = 00;
+        OPJ_UINT32 l_poc_room;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
+        l_tccp = &l_tcp->tccps[0];
+        l_image = p_j2k->m_private_image;
+        l_nb_comp = l_image->numcomps;
+        l_nb_poc = 1 + l_tcp->numpocs;
+
+        if (l_nb_comp <= 256) {
+                l_poc_room = 1;
+        }
+        else {
+                l_poc_room = 2;
+        }
+
+        l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
+
+        l_current_data = p_data;
+
+        opj_write_bytes(l_current_data,J2K_MS_POC,2);                                   /* POC  */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_poc_size-2,2);                                 /* Lpoc */
+        l_current_data += 2;
+
+        l_current_poc =  l_tcp->pocs;
+        for (i = 0; i < l_nb_poc; ++i) {
+                opj_write_bytes(l_current_data,l_current_poc->resno0,1);                                /* RSpoc_i */
+                ++l_current_data;
+
+                opj_write_bytes(l_current_data,l_current_poc->compno0,l_poc_room);              /* CSpoc_i */
+                l_current_data+=l_poc_room;
+
+                opj_write_bytes(l_current_data,l_current_poc->layno1,2);                                /* LYEpoc_i */
+                l_current_data+=2;
+
+                opj_write_bytes(l_current_data,l_current_poc->resno1,1);                                /* REpoc_i */
+                ++l_current_data;
+
+                opj_write_bytes(l_current_data,l_current_poc->compno1,l_poc_room);              /* CEpoc_i */
+                l_current_data+=l_poc_room;
+
+                opj_write_bytes(l_current_data,l_current_poc->prg,1);                                   /* Ppoc_i */
+                ++l_current_data;
+
+                /* change the value of the max layer according to the actual number of layers in the file, components and resolutions*/
+                l_current_poc->layno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->layno1, (OPJ_INT32)l_tcp->numlayers);
+                l_current_poc->resno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->resno1, (OPJ_INT32)l_tccp->numresolutions);
+                l_current_poc->compno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->compno1, (OPJ_INT32)l_nb_comp);
+
+                ++l_current_poc;
+        }
+
+        *p_data_written = l_poc_size;
+}
+
+OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k)
+{
+        opj_tcp_t * l_tcp = 00;
+        OPJ_UINT32 l_nb_tiles = 0;
+        OPJ_UINT32 l_max_poc = 0;
+        OPJ_UINT32 i;
+
+        l_tcp = p_j2k->m_cp.tcps;
+        l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+
+        for (i=0;i<l_nb_tiles;++i) {
+                l_max_poc = opj_uint_max(l_max_poc,l_tcp->numpocs);
+                ++l_tcp;
+        }
+
+        ++l_max_poc;
+
+        return 4 + 9 * l_max_poc;
+}
+
+OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k)
+{
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_nb_tiles;
+        OPJ_UINT32 l_max = 0;
+        opj_tcp_t * l_tcp = 00;
+
+        l_tcp = p_j2k->m_cp.tcps;
+        l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
+
+        for (i=0;i<l_nb_tiles;++i) {
+                l_max = opj_uint_max(l_max,l_tcp->m_nb_tile_parts);
+
+                ++l_tcp;
+        }
+
+        return 12 * l_max;
+}
+
+OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k)
+{
+        OPJ_UINT32 l_nb_bytes = 0;
+        OPJ_UINT32 l_nb_comps;
+        OPJ_UINT32 l_coc_bytes,l_qcc_bytes;
+
+        l_nb_comps = p_j2k->m_private_image->numcomps - 1;
+        l_nb_bytes += opj_j2k_get_max_toc_size(p_j2k);
+
+        if (p_j2k->m_cp.m_specific_param.m_enc.m_cinema == 0) {
+                l_coc_bytes = opj_j2k_get_max_coc_size(p_j2k);
+                l_nb_bytes += l_nb_comps * l_coc_bytes;
+
+                l_qcc_bytes = opj_j2k_get_max_qcc_size(p_j2k);
+                l_nb_bytes += l_nb_comps * l_qcc_bytes;
+        }
+
+        l_nb_bytes += opj_j2k_get_max_poc_size(p_j2k);
+
+        /*** DEVELOPER CORNER, Add room for your headers ***/
+
+        return l_nb_bytes;
+}
+
+/**
+ * Reads a POC marker (Progression Order Change)
+ *
+ * @param       p_header_data   the data contained in the POC box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the POC marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_poc (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        OPJ_UINT32 i, l_nb_comp, l_tmp;
+        opj_image_t * l_image = 00;
+        OPJ_UINT32 l_old_poc_nb, l_current_poc_nb, l_current_poc_remaining;
+        OPJ_UINT32 l_chunk_size, l_comp_room;
+
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        opj_poc_t *l_current_poc = 00;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_image = p_j2k->m_private_image;
+        l_nb_comp = l_image->numcomps;
+        if (l_nb_comp <= 256) {
+                l_comp_room = 1;
+        }
+        else {
+                l_comp_room = 2;
+        }
+        l_chunk_size = 5 + 2 * l_comp_room;
+        l_current_poc_nb = p_header_size / l_chunk_size;
+        l_current_poc_remaining = p_header_size % l_chunk_size;
+
+        if ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading POC marker\n");
+                return OPJ_FALSE;
+        }
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
+                                &l_cp->tcps[p_j2k->m_current_tile_number] :
+                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
+        l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0;
+        l_current_poc_nb += l_old_poc_nb;
+
+        if(l_current_poc_nb >= 32)
+          {
+          opj_event_msg(p_manager, EVT_ERROR, "Too many POCs %d\n", l_current_poc_nb);
+          return OPJ_FALSE;
+          }
+        assert(l_current_poc_nb < 32);
+
+        /* now poc is in use.*/
+        l_tcp->POC = 1;
+
+        l_current_poc = &l_tcp->pocs[l_old_poc_nb];
+        for     (i = l_old_poc_nb; i < l_current_poc_nb; ++i) {
+                opj_read_bytes(p_header_data,&(l_current_poc->resno0),1);                               /* RSpoc_i */
+                ++p_header_data;
+                opj_read_bytes(p_header_data,&(l_current_poc->compno0),l_comp_room);    /* CSpoc_i */
+                p_header_data+=l_comp_room;
+                opj_read_bytes(p_header_data,&(l_current_poc->layno1),2);                               /* LYEpoc_i */
+                /* make sure layer end is in acceptable bounds */
+                l_current_poc->layno1 = opj_uint_min(l_current_poc->layno1, l_tcp->numlayers);
+                p_header_data+=2;
+                opj_read_bytes(p_header_data,&(l_current_poc->resno1),1);                               /* REpoc_i */
+                ++p_header_data;
+                opj_read_bytes(p_header_data,&(l_current_poc->compno1),l_comp_room);    /* CEpoc_i */
+                p_header_data+=l_comp_room;
+                opj_read_bytes(p_header_data,&l_tmp,1);                                                                 /* Ppoc_i */
+                ++p_header_data;
+                l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp;
+                /* make sure comp is in acceptable bounds */
+                l_current_poc->compno1 = opj_uint_min(l_current_poc->compno1, l_nb_comp);
+                ++l_current_poc;
+        }
+
+        l_tcp->numpocs = l_current_poc_nb - 1;
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a CRG marker (Component registration)
+ *
+ * @param       p_header_data   the data contained in the TLM box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the TLM marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_crg (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        OPJ_UINT32 l_nb_comp;
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_nb_comp = p_j2k->m_private_image->numcomps;
+
+        if (p_header_size != l_nb_comp *4) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading CRG marker\n");
+                return OPJ_FALSE;
+        }
+        /* Do not care of this at the moment since only local variables are set here */
+        /*
+        for
+                (i = 0; i < l_nb_comp; ++i)
+        {
+                opj_read_bytes(p_header_data,&l_Xcrg_i,2);                              // Xcrg_i
+                p_header_data+=2;
+                opj_read_bytes(p_header_data,&l_Ycrg_i,2);                              // Xcrg_i
+                p_header_data+=2;
+        }
+        */
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a TLM marker (Tile Length Marker)
+ *
+ * @param       p_header_data   the data contained in the TLM box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the TLM marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_tlm (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP, l_tot_num_tp_remaining, l_quotient, l_Ptlm_size;
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        if (p_header_size < 2) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
+                return OPJ_FALSE;
+        }
+        p_header_size -= 2;
+
+        opj_read_bytes(p_header_data,&l_Ztlm,1);                                /* Ztlm */
+        ++p_header_data;
+        opj_read_bytes(p_header_data,&l_Stlm,1);                                /* Stlm */
+        ++p_header_data;
+
+        l_ST = ((l_Stlm >> 4) & 0x3);
+        l_SP = (l_Stlm >> 6) & 0x1;
+
+        l_Ptlm_size = (l_SP + 1) * 2;
+        l_quotient = l_Ptlm_size + l_ST;
+
+        l_tot_num_tp_remaining = p_header_size % l_quotient;
+
+        if (l_tot_num_tp_remaining != 0) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
+                return OPJ_FALSE;
+        }
+        /* FIXME Do not care of this at the moment since only local variables are set here */
+        /*
+        for
+                (i = 0; i < l_tot_num_tp; ++i)
+        {
+                opj_read_bytes(p_header_data,&l_Ttlm_i,l_ST);                           // Ttlm_i
+                p_header_data += l_ST;
+                opj_read_bytes(p_header_data,&l_Ptlm_i,l_Ptlm_size);            // Ptlm_i
+                p_header_data += l_Ptlm_size;
+        }*/
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a PLM marker (Packet length, main header marker)
+ *
+ * @param       p_header_data   the data contained in the TLM box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the TLM marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_plm (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        if (p_header_size < 1) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
+                return OPJ_FALSE;
+        }
+        /* Do not care of this at the moment since only local variables are set here */
+        /*
+        opj_read_bytes(p_header_data,&l_Zplm,1);                                        // Zplm
+        ++p_header_data;
+        --p_header_size;
+
+        while
+                (p_header_size > 0)
+        {
+                opj_read_bytes(p_header_data,&l_Nplm,1);                                // Nplm
+                ++p_header_data;
+                p_header_size -= (1+l_Nplm);
+                if
+                        (p_header_size < 0)
+                {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
+                        return false;
+                }
+                for
+                        (i = 0; i < l_Nplm; ++i)
+                {
+                        opj_read_bytes(p_header_data,&l_tmp,1);                         // Iplm_ij
+                        ++p_header_data;
+                        // take only the last seven bytes
+                        l_packet_len |= (l_tmp & 0x7f);
+                        if
+                                (l_tmp & 0x80)
+                        {
+                                l_packet_len <<= 7;
+                        }
+                        else
+                        {
+                // store packet length and proceed to next packet
+                                l_packet_len = 0;
+                        }
+                }
+                if
+                        (l_packet_len != 0)
+                {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
+                        return false;
+                }
+        }
+        */
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a PLT marker (Packet length, tile-part header)
+ *
+ * @param       p_header_data   the data contained in the PLT box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the PLT marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_plt (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        if (p_header_size < 1) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
+                return OPJ_FALSE;
+        }
+
+        opj_read_bytes(p_header_data,&l_Zplt,1);                /* Zplt */
+        ++p_header_data;
+        --p_header_size;
+
+        for (i = 0; i < p_header_size; ++i) {
+                opj_read_bytes(p_header_data,&l_tmp,1);         /* Iplt_ij */
+                ++p_header_data;
+                /* take only the last seven bytes */
+                l_packet_len |= (l_tmp & 0x7f);
+                if (l_tmp & 0x80) {
+                        l_packet_len <<= 7;
+                }
+                else {
+            /* store packet length and proceed to next packet */
+                        l_packet_len = 0;
+                }
+        }
+
+        if (l_packet_len != 0) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+#if 0
+OPJ_BOOL j2k_read_ppm_v2 (
+                                                opj_j2k_t *p_j2k,
+                                                OPJ_BYTE * p_header_data,
+                                                OPJ_UINT32 p_header_size,
+                                                struct opj_event_mgr * p_manager
+                                        )
+{
+
+        opj_cp_t *l_cp = 00;
+        OPJ_UINT32 l_remaining_data, l_Z_ppm, l_N_ppm;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        if (p_header_size < 1) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
+                return OPJ_FALSE;
+        }
+
+        l_cp = &(p_j2k->m_cp);
+        l_cp->ppm = 1;
+
+        opj_read_bytes(p_header_data,&l_Z_ppm,1);               /* Z_ppm */
+        ++p_header_data;
+        --p_header_size;
+
+        /* First PPM marker */
+        if (l_Z_ppm == 0) {
+                if (p_header_size < 4) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
+                        return OPJ_FALSE;
+                }
+
+                opj_read_bytes(p_header_data,&l_N_ppm,4);               /* N_ppm */
+                p_header_data+=4;
+                p_header_size-=4;
+
+                /* First PPM marker: Initialization */
+                l_cp->ppm_len = l_N_ppm;
+                l_cp->ppm_data_size = 0;
+
+                l_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_cp->ppm_len);
+                if (l_cp->ppm_buffer == 00) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory reading ppm marker\n");
+                        return OPJ_FALSE;
+                }
+                memset(l_cp->ppm_buffer,0,l_cp->ppm_len);
+
+                l_cp->ppm_data = l_cp->ppm_buffer;
+        }
+
+        while (1) {
+                if (l_cp->ppm_data_size == l_cp->ppm_len) {
+                        if (p_header_size >= 4) {
+                                /* read a N_ppm */
+                                opj_read_bytes(p_header_data,&l_N_ppm,4);               /* N_ppm */
+                                p_header_data+=4;
+                                p_header_size-=4;
+                                l_cp->ppm_len += l_N_ppm ;
+
+                                OPJ_BYTE *new_ppm_buffer = (OPJ_BYTE *) opj_realloc(l_cp->ppm_buffer, l_cp->ppm_len);
+                                if (! new_ppm_buffer) {
+                                        opj_free(l_cp->ppm_buffer);
+                                        l_cp->ppm_buffer = NULL;
+                                        l_cp->ppm_len = 0;
+                                        l_cp->ppm_data = NULL;
+                                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory reading ppm marker\n");
+                                        return OPJ_FALSE;
+                                }
+                                l_cp->ppm_buffer = new_ppm_buffer;
+                                memset(l_cp->ppm_buffer+l_cp->ppm_data_size,0,l_N_ppm);
+                                l_cp->ppm_data = l_cp->ppm_buffer;
+                        }
+                        else {
+                                return OPJ_FALSE;
+                        }
+                }
+
+                l_remaining_data = l_cp->ppm_len - l_cp->ppm_data_size;
+
+                if (l_remaining_data <= p_header_size) {
+                        /* we must store less information than available in the packet */
+                        memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , l_remaining_data);
+                        l_cp->ppm_data_size = l_cp->ppm_len;
+                        p_header_size -= l_remaining_data;
+                        p_header_data += l_remaining_data;
+                }
+                else {
+                        memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , p_header_size);
+                        l_cp->ppm_data_size += p_header_size;
+                        p_header_data += p_header_size;
+                        p_header_size = 0;
+                        break;
+                }
+        }
+
+        return OPJ_TRUE;
+}
+#endif
+
+OPJ_BOOL j2k_read_ppm_v3 (
+                                                opj_j2k_t *p_j2k,
+                                                OPJ_BYTE * p_header_data,
+                                                OPJ_UINT32 p_header_size,
+                                                struct opj_event_mgr * p_manager
+                                        )
+{
+        opj_cp_t *l_cp = 00;
+        OPJ_UINT32 l_remaining_data, l_Z_ppm, l_N_ppm;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        /* Minimum size of PPM marker is equal to the size of Zppm element */
+        if (p_header_size < 1) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
+                return OPJ_FALSE;
+        }
+
+        l_cp = &(p_j2k->m_cp);
+        l_cp->ppm = 1;
+
+        opj_read_bytes(p_header_data,&l_Z_ppm,1);               /* Z_ppm */
+        ++p_header_data;
+        --p_header_size;
+
+        /* First PPM marker */
+        if (l_Z_ppm == 0) {
+                /* We need now at least the Nppm^0 element */
+                if (p_header_size < 4) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
+                        return OPJ_FALSE;
+                }
+
+                opj_read_bytes(p_header_data,&l_N_ppm,4);               /* First N_ppm */
+                p_header_data+=4;
+                p_header_size-=4;
+
+                /* sanity check: how much bytes is left for Ippm */
+                if( p_header_size < l_N_ppm )
+                  {
+                  opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes (%u) to hold Ippm series (%u), Index (%d)\n", p_header_size, l_N_ppm, l_Z_ppm );
+                  opj_free(l_cp->ppm_data);
+                  l_cp->ppm_data = NULL;
+                  l_cp->ppm_buffer = NULL;
+                  l_cp->ppm = 0; /* do not use PPM */
+                  return OPJ_FALSE;
+                  }
+
+                /* First PPM marker: Initialization */
+                l_cp->ppm_len = l_N_ppm;
+                l_cp->ppm_data_read = 0;
+
+                l_cp->ppm_data = (OPJ_BYTE *) opj_malloc(l_cp->ppm_len);
+                l_cp->ppm_buffer = l_cp->ppm_data;
+                if (l_cp->ppm_data == 00) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read ppm marker\n");
+                        return OPJ_FALSE;
+                }
+                memset(l_cp->ppm_data,0,l_cp->ppm_len);
+
+                l_cp->ppm_data_current = l_cp->ppm_data;
+
+                /*l_cp->ppm_data = l_cp->ppm_buffer;*/
+        }
+        else {
+                if (p_header_size < 4) {
+                        opj_event_msg(p_manager, EVT_WARNING, "Empty PPM marker\n");
+                        return OPJ_TRUE;
+                }
+                else {
+                        /* Uncompleted Ippm series in the previous PPM marker?*/
+                        if (l_cp->ppm_data_read < l_cp->ppm_len) {
+                                /* Get the place where add the remaining Ippm series*/
+                                l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_data_read]);
+                                l_N_ppm = l_cp->ppm_len - l_cp->ppm_data_read;
+                        }
+                        else {
+                                OPJ_BYTE *new_ppm_data;
+                                opj_read_bytes(p_header_data,&l_N_ppm,4);               /* First N_ppm */
+                                p_header_data+=4;
+                                p_header_size-=4;
+
+                                /* sanity check: how much bytes is left for Ippm */
+                                if( p_header_size < l_N_ppm )
+                                  {
+                                  opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes (%u) to hold Ippm series (%u), Index (%d)\n", p_header_size, l_N_ppm, l_Z_ppm );
+                                  opj_free(l_cp->ppm_data);
+                                  l_cp->ppm_data = NULL;
+                                  l_cp->ppm_buffer = NULL;
+                                  l_cp->ppm = 0; /* do not use PPM */
+                                  return OPJ_FALSE;
+                                  }
+                                /* Increase the size of ppm_data to add the new Ippm series*/
+                                assert(l_cp->ppm_data == l_cp->ppm_buffer && "We need ppm_data and ppm_buffer to be the same when reallocating");
+                                new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm);
+                                if (! new_ppm_data) {
+                                        opj_free(l_cp->ppm_data);
+                                        l_cp->ppm_data = NULL;
+                                        l_cp->ppm_buffer = NULL;  /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */
+                                        l_cp->ppm_len = 0;
+                                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new Ippm series\n");
+                                        return OPJ_FALSE;
+                                }
+                                l_cp->ppm_data = new_ppm_data;
+                                l_cp->ppm_buffer = l_cp->ppm_data;
+
+                                /* Keep the position of the place where concatenate the new series*/
+                                l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]);
+                                l_cp->ppm_len += l_N_ppm;
+                        }
+                }
+        }
+
+        l_remaining_data = p_header_size;
+
+        while (l_remaining_data >= l_N_ppm) {
+                /* read a complete Ippm series*/
+                memcpy(l_cp->ppm_data_current, p_header_data, l_N_ppm);
+                p_header_size -= l_N_ppm;
+                p_header_data += l_N_ppm;
+
+                l_cp->ppm_data_read += l_N_ppm; /* Increase the number of data read*/
+
+                if (p_header_size)
+                {
+						if (p_header_size < 4) return OPJ_FALSE;
+                        opj_read_bytes(p_header_data,&l_N_ppm,4);               /* N_ppm^i */
+                        p_header_data+=4;
+                        p_header_size-=4;
+                }
+                else {
+                        l_remaining_data = p_header_size;
+                        break;
+                }
+
+                l_remaining_data = p_header_size;
+
+                /* Next Ippm series is a complete series ?*/
+                if (l_remaining_data >= l_N_ppm) {
+                        OPJ_BYTE *new_ppm_data;
+                        /* Increase the size of ppm_data to add the new Ippm series*/
+                        assert(l_cp->ppm_data == l_cp->ppm_buffer && "We need ppm_data and ppm_buffer to be the same when reallocating");
+                        new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm);
+                        if (! new_ppm_data) {
+                                opj_free(l_cp->ppm_data);
+                                l_cp->ppm_data = NULL;
+                                l_cp->ppm_buffer = NULL;  /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */
+                                l_cp->ppm_len = 0;
+                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new (complete) Ippm series\n");
+                                return OPJ_FALSE;
+                        }
+                        l_cp->ppm_data = new_ppm_data;
+                        l_cp->ppm_buffer = l_cp->ppm_data;
+
+                        /* Keep the position of the place where concatenate the new series */
+                        l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]);
+                        l_cp->ppm_len += l_N_ppm;
+                }
+
+        }
+
+        /* Need to read an incomplete Ippm series*/
+        if (l_remaining_data) {
+                OPJ_BYTE *new_ppm_data;
+                assert(l_cp->ppm_data == l_cp->ppm_buffer && "We need ppm_data and ppm_buffer to be the same when reallocating");
+                new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm);
+                if (! new_ppm_data) {
+                        opj_free(l_cp->ppm_data);
+                        l_cp->ppm_data = NULL;
+                        l_cp->ppm_buffer = NULL;  /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */
+                        l_cp->ppm_len = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new (incomplete) Ippm series\n");
+                        return OPJ_FALSE;
+                }
+                l_cp->ppm_data = new_ppm_data;
+                l_cp->ppm_buffer = l_cp->ppm_data;
+
+                /* Keep the position of the place where concatenate the new series*/
+                l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]);
+                l_cp->ppm_len += l_N_ppm;
+
+                /* Read incomplete Ippm series*/
+                memcpy(l_cp->ppm_data_current, p_header_data, l_remaining_data);
+                p_header_size -= l_remaining_data;
+                p_header_data += l_remaining_data;
+
+                l_cp->ppm_data_read += l_remaining_data; /* Increase the number of data read*/
+        }
+
+#ifdef CLEAN_MSD
+
+                if (l_cp->ppm_data_size == l_cp->ppm_len) {
+                        if (p_header_size >= 4) {
+                                /* read a N_ppm*/
+                                opj_read_bytes(p_header_data,&l_N_ppm,4);               /* N_ppm */
+                                p_header_data+=4;
+                                p_header_size-=4;
+                                l_cp->ppm_len += l_N_ppm ;
+
+                                OPJ_BYTE *new_ppm_buffer = (OPJ_BYTE *) opj_realloc(l_cp->ppm_buffer, l_cp->ppm_len);
+                                if (! new_ppm_buffer) {
+                                        opj_free(l_cp->ppm_buffer);
+                                        l_cp->ppm_buffer = NULL;
+                                        l_cp->ppm_len = 0;
+                                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read ppm marker\n");
+                                        return OPJ_FALSE;
+                                }
+                                l_cp->ppm_buffer = new_ppm_buffer;
+                                memset(l_cp->ppm_buffer+l_cp->ppm_data_size,0,l_N_ppm);
+
+                                l_cp->ppm_data = l_cp->ppm_buffer;
+                        }
+                        else {
+                                return OPJ_FALSE;
+                        }
+                }
+
+                l_remaining_data = l_cp->ppm_len - l_cp->ppm_data_size;
+
+                if (l_remaining_data <= p_header_size) {
+                        /* we must store less information than available in the packet */
+                        memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , l_remaining_data);
+                        l_cp->ppm_data_size = l_cp->ppm_len;
+                        p_header_size -= l_remaining_data;
+                        p_header_data += l_remaining_data;
+                }
+                else {
+                        memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , p_header_size);
+                        l_cp->ppm_data_size += p_header_size;
+                        p_header_data += p_header_size;
+                        p_header_size = 0;
+                        break;
+                }
+        }
+#endif
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a PPT marker (Packed packet headers, tile-part header)
+ *
+ * @param       p_header_data   the data contained in the PPT box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the PPT marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_ppt (  opj_j2k_t *p_j2k,
+                                    OPJ_BYTE * p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        OPJ_UINT32 l_Z_ppt;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        /* We need to have the Z_ppt element at minimum */
+        if (p_header_size < 1) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n");
+                return OPJ_FALSE;
+        }
+
+        l_cp = &(p_j2k->m_cp);
+        if (l_cp->ppm){
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\n");
+                return OPJ_FALSE;
+        }
+
+        l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]);
+        l_tcp->ppt = 1;
+
+        opj_read_bytes(p_header_data,&l_Z_ppt,1);               /* Z_ppt */
+        ++p_header_data;
+        --p_header_size;
+
+        /* Allocate buffer to read the packet header */
+        if (l_Z_ppt == 0) {
+                /* First PPT marker */
+                l_tcp->ppt_data_size = 0;
+                l_tcp->ppt_len = p_header_size;
+
+                opj_free(l_tcp->ppt_buffer);
+                l_tcp->ppt_buffer = (OPJ_BYTE *) opj_calloc(l_tcp->ppt_len, sizeof(OPJ_BYTE) );
+                if (l_tcp->ppt_buffer == 00) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
+                        return OPJ_FALSE;
+                }
+                l_tcp->ppt_data = l_tcp->ppt_buffer;
+
+                /* memset(l_tcp->ppt_buffer,0,l_tcp->ppt_len); */
+        }
+        else {
+                OPJ_BYTE *new_ppt_buffer;
+                l_tcp->ppt_len += p_header_size;
+
+                new_ppt_buffer = (OPJ_BYTE *) opj_realloc(l_tcp->ppt_buffer, l_tcp->ppt_len);
+                if (! new_ppt_buffer) {
+                        opj_free(l_tcp->ppt_buffer);
+                        l_tcp->ppt_buffer = NULL;
+                        l_tcp->ppt_len = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
+                        return OPJ_FALSE;
+                }
+                l_tcp->ppt_buffer = new_ppt_buffer;
+                l_tcp->ppt_data = l_tcp->ppt_buffer;
+
+                memset(l_tcp->ppt_buffer+l_tcp->ppt_data_size,0,p_header_size);
+        }
+
+        /* Read packet header from buffer */
+        memcpy(l_tcp->ppt_buffer+l_tcp->ppt_data_size,p_header_data,p_header_size);
+
+        l_tcp->ppt_data_size += p_header_size;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_tlm(     opj_j2k_t *p_j2k,
+                                                        opj_stream_private_t *p_stream,
+                                                        opj_event_mgr_t * p_manager
+                            )
+{
+        OPJ_BYTE * l_current_data = 00;
+        OPJ_UINT32 l_tlm_size;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_tlm_size = 6 + (5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
+
+        if (l_tlm_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size);
+                if (! new_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write TLM marker\n");
+                        return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_tlm_size;
+        }
+
+        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+        /* change the way data is written to avoid seeking if possible */
+        /* TODO */
+        p_j2k->m_specific_param.m_encoder.m_tlm_start = opj_stream_tell(p_stream);
+
+        opj_write_bytes(l_current_data,J2K_MS_TLM,2);                                   /* TLM */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_tlm_size-2,2);                                 /* Lpoc */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,0,1);                                                    /* Ztlm=0*/
+        ++l_current_data;
+
+        opj_write_bytes(l_current_data,0x50,1);                                                 /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */
+        ++l_current_data;
+
+        /* do nothing on the 5 * l_j2k->m_specific_param.m_encoder.m_total_tile_parts remaining data */
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_tlm_size,p_manager) != l_tlm_size) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_sot(     opj_j2k_t *p_j2k,
+                                                        OPJ_BYTE * p_data,
+                                                        OPJ_UINT32 * p_data_written,
+                                                        const opj_stream_private_t *p_stream,
+                                                        opj_event_mgr_t * p_manager
+                            )
+{
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        opj_write_bytes(p_data,J2K_MS_SOT,2);                                   /* SOT */
+        p_data += 2;
+
+        opj_write_bytes(p_data,10,2);                                                   /* Lsot */
+        p_data += 2;
+
+        opj_write_bytes(p_data, p_j2k->m_current_tile_number,2);                        /* Isot */
+        p_data += 2;
+
+        /* Psot  */
+        p_data += 4;
+
+        opj_write_bytes(p_data, p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,1);                        /* TPsot */
+        ++p_data;
+
+        opj_write_bytes(p_data, p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,1);                      /* TNsot */
+        ++p_data;
+
+        /* UniPG>> */
+#ifdef USE_JPWL
+        /* update markers struct */
+/*
+        OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOT, p_j2k->sot_start, len + 2);
+*/
+  assert( 0 && "TODO" );
+#endif /* USE_JPWL */
+
+        * p_data_written = 12;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k,
+                            OPJ_BYTE * p_header_data,
+                            OPJ_UINT32 p_header_size,
+                            opj_event_mgr_t * p_manager )
+{
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        OPJ_UINT32 l_tot_len, l_num_parts = 0;
+        OPJ_UINT32 l_current_part;
+        OPJ_UINT32 l_tile_x,l_tile_y;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        /* Size of this marker is fixed = 12 (we have already read marker and its size)*/
+        if (p_header_size != 8) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
+                return OPJ_FALSE;
+        }
+
+        l_cp = &(p_j2k->m_cp);
+        opj_read_bytes(p_header_data,&(p_j2k->m_current_tile_number),2);                /* Isot */
+        p_header_data+=2;
+
+        /* testcase 2.pdf.SIGFPE.706.1112 */
+        if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) {
+                opj_event_msg(p_manager, EVT_ERROR, "Invalid tile number %d\n", p_j2k->m_current_tile_number);
+                return OPJ_FALSE;
+        }
+
+        l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
+        l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;
+        l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;
+
+#ifdef USE_JPWL
+        if (l_cp->correct) {
+
+                OPJ_UINT32 tileno = p_j2k->m_current_tile_number;
+                static OPJ_UINT32 backup_tileno = 0;
+
+                /* tileno is negative or larger than the number of tiles!!! */
+                if (tileno > (l_cp->tw * l_cp->th)) {
+                        opj_event_msg(p_manager, EVT_ERROR,
+                                        "JPWL: bad tile number (%d out of a maximum of %d)\n",
+                                        tileno, (l_cp->tw * l_cp->th));
+                        if (!JPWL_ASSUME) {
+                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                                return OPJ_FALSE;
+                        }
+                        /* we try to correct */
+                        tileno = backup_tileno;
+                        opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
+                                        "- setting tile number to %d\n",
+                                        tileno);
+                }
+
+                /* keep your private count of tiles */
+                backup_tileno++;
+        };
+#endif /* USE_JPWL */
+
+        /* look for the tile in the list of already processed tile (in parts). */
+        /* Optimization possible here with a more complex data structure and with the removing of tiles */
+        /* since the time taken by this function can only grow at the time */
+
+        opj_read_bytes(p_header_data,&l_tot_len,4);             /* Psot */
+        p_header_data+=4;
+
+        /* PSot should be equal to zero or >=14 or <= 2^32-1 */
+        if ((l_tot_len !=0 ) && (l_tot_len < 14) )
+        {
+            if (l_tot_len == 12 ) /* MSD: Special case for the PHR data which are read by kakadu*/
+            {
+                opj_event_msg(p_manager, EVT_WARNING, "Empty SOT marker detected: Psot=%d.\n", l_tot_len);
+            }
+            else
+            {
+                opj_event_msg(p_manager, EVT_ERROR, "Psot value is not correct regards to the JPEG2000 norm: %d.\n", l_tot_len);
+                return OPJ_FALSE;
+            }
+        }
+
+#ifdef USE_JPWL
+        if (l_cp->correct) {
+
+                /* totlen is negative or larger than the bytes left!!! */
+                if (/*(l_tot_len < 0) ||*/ (l_tot_len > p_header_size ) ) { /* FIXME it seems correct; for info in V1 -> (p_stream_numbytesleft(p_stream) + 8))) { */
+                        opj_event_msg(p_manager, EVT_ERROR,
+                                        "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
+                                        l_tot_len, p_header_size ); /* FIXME it seems correct; for info in V1 -> p_stream_numbytesleft(p_stream) + 8); */
+                        if (!JPWL_ASSUME) {
+                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                                return OPJ_FALSE;
+                        }
+                        /* we try to correct */
+                        l_tot_len = 0;
+                        opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
+                                        "- setting Psot to %d => assuming it is the last tile\n",
+                                        l_tot_len);
+                }
+                };
+#endif /* USE_JPWL */
+
+                /* Ref A.4.2: Psot could be equal zero if it is the last tile-part of the codestream.*/
+                if (!l_tot_len) {
+                        opj_event_msg(p_manager, EVT_INFO, "Psot value of the current tile-part is equal to zero, "
+                                        "we assuming it is the last tile-part of the codestream.\n");
+                        p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
+                }
+
+                opj_read_bytes(p_header_data,&l_current_part ,1);       /* TPsot */
+                ++p_header_data;
+
+                opj_read_bytes(p_header_data,&l_num_parts ,1);          /* TNsot */
+                ++p_header_data;
+
+                if (l_num_parts != 0) { /* Number of tile-part header is provided by this tile-part header */
+                        /* Useful to manage the case of textGBR.jp2 file because two values of TNSot are allowed: the correct numbers of
+                         * tile-parts for that tile and zero (A.4.2 of 15444-1 : 2002). */
+                        if (l_tcp->m_nb_tile_parts) {
+                                if (l_current_part >= l_tcp->m_nb_tile_parts){
+                                        opj_event_msg(p_manager, EVT_ERROR, "In SOT marker, TPSot (%d) is not valid regards to the current "
+                                                        "number of tile-part (%d), giving up\n", l_current_part, l_tcp->m_nb_tile_parts );
+                                      //  p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
+                                     //   return OPJ_FALSE;
+										
+										l_num_parts++; 
+                                }
+                        }
+                        if( l_current_part >= l_num_parts ) {
+                          /* testcase 451.pdf.SIGSEGV.ce9.3723 */
+                          opj_event_msg(p_manager, EVT_ERROR, "In SOT marker, TPSot (%d) is not valid regards to the current "
+                            "number of tile-part (header) (%d), giving up\n", l_current_part, l_num_parts );
+                          p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
+                          return OPJ_FALSE;
+                        }
+                        l_tcp->m_nb_tile_parts = l_num_parts;
+                }
+
+                /* If know the number of tile part header we will check if we didn't read the last*/
+                if (l_tcp->m_nb_tile_parts) {
+                        if (l_tcp->m_nb_tile_parts == (l_current_part+1)) {
+                                p_j2k->m_specific_param.m_decoder.m_can_decode = 0; /* Process the last tile-part header*/
+                        }
+                }
+
+                if (!p_j2k->m_specific_param.m_decoder.m_last_tile_part){
+                        /* Keep the size of data to skip after this marker */
+                        p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len - 12; /* SOT_marker_size = 12 */
+                }
+                else {
+                        /* FIXME: need to be computed from the number of bytes remaining in the codestream */
+                        p_j2k->m_specific_param.m_decoder.m_sot_length = 0;
+                }
+
+                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPH;
+
+                /* Check if the current tile is outside the area we want decode or not corresponding to the tile index*/
+                if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec == -1) {
+                        p_j2k->m_specific_param.m_decoder.m_skip_data =
+                                (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x)
+                                ||      (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x)
+                                ||  (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y)
+                                ||      (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y);
+                }
+                else {
+                        assert( p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec >= 0 );
+                        p_j2k->m_specific_param.m_decoder.m_skip_data =
+                                (p_j2k->m_current_tile_number != (OPJ_UINT32)p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec);
+                }
+
+                /* Index */
+                if (p_j2k->cstr_index)
+                {
+                        assert(p_j2k->cstr_index->tile_index != 00);
+                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
+                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno = l_current_part;
+
+                        if (l_num_parts != 0){
+                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps = l_num_parts;
+                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = l_num_parts;
+
+                                if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
+                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
+                                                (opj_tp_index_t*)opj_calloc(l_num_parts, sizeof(opj_tp_index_t));
+                                }
+                                else {
+                                        opj_tp_index_t *new_tp_index = (opj_tp_index_t *) opj_realloc(
+                                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index, l_num_parts* sizeof(opj_tp_index_t));
+                                        if (! new_tp_index) {
+                                                opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
+                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
+                                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
+                                                return OPJ_FALSE;
+                                        }
+                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = new_tp_index;
+                                }
+                        }
+                        else{
+                                /*if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index)*/ {
+
+                                        if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
+                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 10;
+                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
+                                                        (opj_tp_index_t*)opj_calloc( p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps,
+                                                                        sizeof(opj_tp_index_t));
+                                        }
+
+                                        if ( l_current_part >= p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps ){
+                                                opj_tp_index_t *new_tp_index;
+                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = l_current_part + 1;
+                                                new_tp_index = (opj_tp_index_t *) opj_realloc(
+                                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
+                                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps * sizeof(opj_tp_index_t));
+                                                if (! new_tp_index) {
+                                                        opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
+                                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
+                                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
+                                                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
+                                                        return OPJ_FALSE;
+                                                }
+                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = new_tp_index;
+                                        }
+                                }
+
+                        }
+
+                }
+
+                /* FIXME move this onto a separate method to call before reading any SOT, remove part about main_end header, use a index struct inside p_j2k */
+                /* if (p_j2k->cstr_info) {
+                   if (l_tcp->first) {
+                   if (tileno == 0) {
+                   p_j2k->cstr_info->main_head_end = p_stream_tell(p_stream) - 13;
+                   }
+
+                   p_j2k->cstr_info->tile[tileno].tileno = tileno;
+                   p_j2k->cstr_info->tile[tileno].start_pos = p_stream_tell(p_stream) - 12;
+                   p_j2k->cstr_info->tile[tileno].end_pos = p_j2k->cstr_info->tile[tileno].start_pos + totlen - 1;
+                   p_j2k->cstr_info->tile[tileno].num_tps = numparts;
+
+                   if (numparts) {
+                   p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t));
+                   }
+                   else {
+                   p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10)
+                   }
+                   }
+                   else {
+                   p_j2k->cstr_info->tile[tileno].end_pos += totlen;
+                   }
+
+                   p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = p_stream_tell(p_stream) - 12;
+                   p_j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos =
+                   p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;
+                   }*/
+                return OPJ_TRUE;
+        }
+
+OPJ_BOOL opj_j2k_write_sod(     opj_j2k_t *p_j2k,
+                                                        opj_tcd_t * p_tile_coder,
+                                                        OPJ_BYTE * p_data,
+                                                        OPJ_UINT32 * p_data_written,
+                                                        OPJ_UINT32 p_total_data_size,
+                                                        const opj_stream_private_t *p_stream,
+                                                        opj_event_mgr_t * p_manager
+                            )
+{
+        opj_codestream_info_t *l_cstr_info = 00;
+        OPJ_UINT32 l_remaining_data;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        opj_write_bytes(p_data,J2K_MS_SOD,2);                                   /* SOD */
+        p_data += 2;
+
+        /* make room for the EOF marker */
+        l_remaining_data =  p_total_data_size - 4;
+
+        /* update tile coder */
+        p_tile_coder->tp_num = p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ;
+        p_tile_coder->cur_tp_num = p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
+
+         /* INDEX >> */
+        /* TODO mergeV2: check this part which use cstr_info */
+        /*l_cstr_info = p_j2k->cstr_info;
+        if (l_cstr_info) {
+                if (!p_j2k->m_specific_param.m_encoder.m_current_tile_part_number ) {
+                        //TODO cstr_info->tile[p_j2k->m_current_tile_number].end_header = p_stream_tell(p_stream) + p_j2k->pos_correction - 1;
+                        l_cstr_info->tile[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
+                }
+                else {*/
+                        /*
+                        TODO
+                        if
+                                (cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno - 1].end_pos < p_stream_tell(p_stream))
+                        {
+                                cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno].start_pos = p_stream_tell(p_stream);
+                        }*/
+                /*}*/
+                /* UniPG>> */
+#ifdef USE_JPWL
+                /* update markers struct */
+                /*OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOD, p_j2k->sod_start, 2);
+*/
+  assert( 0 && "TODO" );
+#endif /* USE_JPWL */
+                /* <<UniPG */
+        /*}*/
+        /* << INDEX */
+
+        if (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0) {
+                p_tile_coder->tcd_image->tiles->packno = 0;
+                if (l_cstr_info) {
+                        l_cstr_info->packno = 0;
+                }
+        }
+
+        *p_data_written = 0;
+
+        if (! opj_tcd_encode_tile(p_tile_coder, p_j2k->m_current_tile_number, p_data, p_data_written, l_remaining_data , l_cstr_info)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Cannot encode tile\n");
+                return OPJ_FALSE;
+        }
+
+        *p_data_written += 2;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_sod (opj_j2k_t *p_j2k,
+                           opj_stream_private_t *p_stream,
+                                                   opj_event_mgr_t * p_manager
+                           )
+{
+        OPJ_SIZE_T l_current_read_size;
+        opj_codestream_index_t * l_cstr_index = 00;
+        OPJ_BYTE ** l_current_data = 00;
+        opj_tcp_t * l_tcp = 00;
+        OPJ_UINT32 * l_tile_len = 00;
+        OPJ_BOOL l_sot_length_pb_detected = OPJ_FALSE;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
+
+        if (p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
+                /* opj_stream_get_number_byte_left returns OPJ_OFF_T
+                // but we are in the last tile part,
+                // so its result will fit on OPJ_UINT32 unless we find
+                // a file with a single tile part of more than 4 GB...*/
+                p_j2k->m_specific_param.m_decoder.m_sot_length = (OPJ_UINT32)(opj_stream_get_number_byte_left(p_stream) - 2);
+        }
+        else {
+            /* Check to avoid pass the limit of OPJ_UINT32 */
+            if (p_j2k->m_specific_param.m_decoder.m_sot_length >= 2 )
+                p_j2k->m_specific_param.m_decoder.m_sot_length -= 2;
+            else {
+                /* MSD: case commented to support empty SOT marker (PHR data) */
+            }
+        }
+
+        l_current_data = &(l_tcp->m_data);
+        l_tile_len = &l_tcp->m_data_size;
+
+        /* Patch to support new PHR data */
+        if (p_j2k->m_specific_param.m_decoder.m_sot_length) {
+            if (! *l_current_data) {
+                /* LH: oddly enough, in this path, l_tile_len!=0.
+                 * TODO: If this was consistant, we could simplify the code to only use realloc(), as realloc(0,...) default to malloc(0,...).
+                 */
+                *l_current_data = (OPJ_BYTE*) opj_malloc(p_j2k->m_specific_param.m_decoder.m_sot_length);
+            }
+            else {
+				OPJ_BYTE *l_new_current_data = NULL;
+				//BUGID: 0056005 and 0056022.
+				//test file: 366683_fuzz-asan_heap-oob_6bae99_3155_5245.pdf and fuzz-12.pdf.
+				if ((OPJ_UINT32)-1 - p_j2k->m_specific_param.m_decoder.m_sot_length >= *l_tile_len)
+					l_new_current_data = (OPJ_BYTE *) opj_realloc(*l_current_data, *l_tile_len + p_j2k->m_specific_param.m_decoder.m_sot_length);
+                if (! l_new_current_data) {
+                        opj_free(*l_current_data);
+                        /*nothing more is done as l_current_data will be set to null, and just
+                          afterward we enter in the error path
+                          and the actual tile_len is updated (committed) at the end of the
+                          function. */
+                }
+                *l_current_data = l_new_current_data;
+            }
+            
+            if (*l_current_data == 00) {
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile\n");
+                return OPJ_FALSE;
+            }
+        }
+        else {
+            l_sot_length_pb_detected = OPJ_TRUE;
+        }
+
+        /* Index */
+        l_cstr_index = p_j2k->cstr_index;
+        if (l_cstr_index) {
+                OPJ_OFF_T l_current_pos = opj_stream_tell(p_stream) - 2;
+
+                OPJ_UINT32 l_current_tile_part = l_cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno;
+                l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_header =
+                                l_current_pos;
+                l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_pos =
+                                l_current_pos + p_j2k->m_specific_param.m_decoder.m_sot_length + 2;
+
+                if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
+                                        l_cstr_index,
+                                        J2K_MS_SOD,
+                                        l_current_pos,
+                                        p_j2k->m_specific_param.m_decoder.m_sot_length + 2)) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
+                        return OPJ_FALSE;
+                }
+
+                /*l_cstr_index->packno = 0;*/
+        }
+
+        /* Patch to support new PHR data */
+        if (!l_sot_length_pb_detected) {
+            l_current_read_size = opj_stream_read_data(
+                        p_stream,
+                        *l_current_data + *l_tile_len,
+                        p_j2k->m_specific_param.m_decoder.m_sot_length,
+                        p_manager);
+        }
+        else
+        {
+            l_current_read_size = 0;
+        }
+
+        if (l_current_read_size != p_j2k->m_specific_param.m_decoder.m_sot_length) {
+                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+        }
+        else {
+                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+        }
+
+        *l_tile_len += (OPJ_UINT32)l_current_read_size;
+
+        return OPJ_TRUE;
+}
+
+ OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k,
+                            OPJ_UINT32 p_tile_no,
+                            OPJ_UINT32 p_comp_no,
+                            OPJ_UINT32 nb_comps,
+                            opj_stream_private_t *p_stream,
+                            opj_event_mgr_t * p_manager
+                            )
+{
+        OPJ_BYTE * l_current_data = 00;
+        OPJ_UINT32 l_rgn_size;
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        opj_tccp_t *l_tccp = 00;
+        OPJ_UINT32 l_comp_room;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = &l_cp->tcps[p_tile_no];
+        l_tccp = &l_tcp->tccps[p_comp_no];
+
+        if (nb_comps <= 256) {
+                l_comp_room = 1;
+        }
+        else {
+                l_comp_room = 2;
+        }
+
+        l_rgn_size = 6 + l_comp_room;
+
+        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+        opj_write_bytes(l_current_data,J2K_MS_RGN,2);                                   /* RGN  */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_rgn_size-2,2);                                 /* Lrgn */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,p_comp_no,l_comp_room);                          /* Crgn */
+        l_current_data+=l_comp_room;
+
+        opj_write_bytes(l_current_data, 0,1);                                           /* Srgn */
+        ++l_current_data;
+
+        opj_write_bytes(l_current_data, (OPJ_UINT32)l_tccp->roishift,1);                            /* SPrgn */
+        ++l_current_data;
+
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_rgn_size,p_manager) != l_rgn_size) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_eoc(     opj_j2k_t *p_j2k,
+                            opj_stream_private_t *p_stream,
+                            opj_event_mgr_t * p_manager
+                            )
+{
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,J2K_MS_EOC,2);                                     /* EOC */
+
+/* UniPG>> */
+#ifdef USE_JPWL
+        /* update markers struct */
+        /*
+        OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_EOC, p_stream_tell(p_stream) - 2, 2);
+*/
+#endif /* USE_JPWL */
+
+        if ( opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,2,p_manager) != 2) {
+                return OPJ_FALSE;
+        }
+
+        if ( ! opj_stream_flush(p_stream,p_manager) ) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a RGN marker (Region Of Interest)
+ *
+ * @param       p_header_data   the data contained in the POC box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the POC marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k,
+                                  OPJ_BYTE * p_header_data,
+                                  OPJ_UINT32 p_header_size,
+                                  opj_event_mgr_t * p_manager
+                                  )
+{
+        OPJ_UINT32 l_nb_comp;
+        opj_image_t * l_image = 00;
+
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        OPJ_UINT32 l_comp_room, l_comp_no, l_roi_sty;
+
+        /* preconditions*/
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_image = p_j2k->m_private_image;
+        l_nb_comp = l_image->numcomps;
+
+        if (l_nb_comp <= 256) {
+                l_comp_room = 1; }
+        else {
+                l_comp_room = 2; }
+
+        if (p_header_size != 2 + l_comp_room) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n");
+                return OPJ_FALSE;
+        }
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
+                                &l_cp->tcps[p_j2k->m_current_tile_number] :
+                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+        opj_read_bytes(p_header_data,&l_comp_no,l_comp_room);           /* Crgn */
+        p_header_data+=l_comp_room;
+        opj_read_bytes(p_header_data,&l_roi_sty,1);                                     /* Srgn */
+        ++p_header_data;
+
+#ifdef USE_JPWL
+        if (l_cp->correct) {
+                /* totlen is negative or larger than the bytes left!!! */
+                if (l_comp_room >= l_nb_comp) {
+                        opj_event_msg(p_manager, EVT_ERROR,
+                                "JPWL: bad component number in RGN (%d when there are only %d)\n",
+                                l_comp_room, l_nb_comp);
+                        if (!JPWL_ASSUME || JPWL_ASSUME) {
+                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                                return OPJ_FALSE;
+                        }
+                }
+        };
+#endif /* USE_JPWL */
+
+        /* testcase 3635.pdf.asan.77.2930 */
+        if (l_comp_no >= l_nb_comp) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                        "bad component number in RGN (%d when there are only %d)\n",
+                        l_comp_no, l_nb_comp);
+                return OPJ_FALSE;
+        }
+
+        opj_read_bytes(p_header_data,(OPJ_UINT32 *) (&(l_tcp->tccps[l_comp_no].roishift)),1);   /* SPrgn */
+        ++p_header_data;
+
+        return OPJ_TRUE;
+
+}
+
+OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp)
+{
+        return (OPJ_FLOAT32) ((p_tcp->m_nb_tile_parts - 1) * 14);
+}
+
+OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp)
+{
+    (void)p_tcp;
+    return 0;
+}
+
+OPJ_BOOL opj_j2k_update_rates(  opj_j2k_t *p_j2k,
+                                                            opj_stream_private_t *p_stream,
+                                                            opj_event_mgr_t * p_manager )
+{
+        opj_cp_t * l_cp = 00;
+        opj_image_t * l_image = 00;
+        opj_tcp_t * l_tcp = 00;
+        opj_image_comp_t * l_img_comp = 00;
+
+        OPJ_UINT32 i,j,k;
+        OPJ_INT32 l_x0,l_y0,l_x1,l_y1;
+        OPJ_FLOAT32 * l_rates = 0;
+        OPJ_FLOAT32 l_sot_remove;
+        OPJ_UINT32 l_bits_empty, l_size_pixel;
+        OPJ_UINT32 l_tile_size = 0;
+        OPJ_UINT32 l_last_res;
+        OPJ_FLOAT32 (* l_tp_stride_func)(opj_tcp_t *) = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        l_image = p_j2k->m_private_image;
+        l_tcp = l_cp->tcps;
+
+        l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy;
+        l_size_pixel = l_image->numcomps * l_image->comps->prec;
+        l_sot_remove = (OPJ_FLOAT32) opj_stream_tell(p_stream) / (OPJ_FLOAT32)(l_cp->th * l_cp->tw);
+
+        if (l_cp->m_specific_param.m_enc.m_tp_on) {
+                l_tp_stride_func = opj_j2k_get_tp_stride;
+        }
+        else {
+                l_tp_stride_func = opj_j2k_get_default_stride;
+        }
+
+        for (i=0;i<l_cp->th;++i) {
+                for (j=0;j<l_cp->tw;++j) {
+                        OPJ_FLOAT32 l_offset = (OPJ_FLOAT32)(*l_tp_stride_func)(l_tcp) / (OPJ_FLOAT32)l_tcp->numlayers;
+
+                        /* 4 borders of the tile rescale on the image if necessary */
+                        l_x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + j * l_cp->tdx), (OPJ_INT32)l_image->x0);
+                        l_y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + i * l_cp->tdy), (OPJ_INT32)l_image->y0);
+                        l_x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (j + 1) * l_cp->tdx), (OPJ_INT32)l_image->x1);
+                        l_y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (i + 1) * l_cp->tdy), (OPJ_INT32)l_image->y1);
+
+                        l_rates = l_tcp->rates;
+
+                        /* Modification of the RATE >> */
+                        if (*l_rates) {
+                                *l_rates =              (( (OPJ_FLOAT32) (l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) * (OPJ_UINT32)(l_y1 - l_y0)))
+                                                                /
+                                                                ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)
+                                                                )
+                                                                -
+                                                                l_offset;
+                        }
+
+                        ++l_rates;
+
+                        for (k = 1; k < l_tcp->numlayers; ++k) {
+                                if (*l_rates) {
+                                        *l_rates =              (( (OPJ_FLOAT32) (l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) * (OPJ_UINT32)(l_y1 - l_y0)))
+                                                                        /
+                                                                                ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)
+                                                                        )
+                                                                        -
+                                                                        l_offset;
+                                }
+
+                                ++l_rates;
+                        }
+
+                        ++l_tcp;
+
+                }
+        }
+
+        l_tcp = l_cp->tcps;
+
+        for (i=0;i<l_cp->th;++i) {
+                for     (j=0;j<l_cp->tw;++j) {
+                        l_rates = l_tcp->rates;
+
+                        if (*l_rates) {
+                                *l_rates -= l_sot_remove;
+
+                                if (*l_rates < 30) {
+                                        *l_rates = 30;
+                                }
+                        }
+
+                        ++l_rates;
+
+                        l_last_res = l_tcp->numlayers - 1;
+
+                        for (k = 1; k < l_last_res; ++k) {
+
+                                if (*l_rates) {
+                                        *l_rates -= l_sot_remove;
+
+                                        if (*l_rates < *(l_rates - 1) + 10) {
+                                                *l_rates  = (*(l_rates - 1)) + 20;
+                                        }
+                                }
+
+                                ++l_rates;
+                        }
+
+                        if (*l_rates) {
+                                *l_rates -= (l_sot_remove + 2.f);
+
+                                if (*l_rates < *(l_rates - 1) + 10) {
+                                        *l_rates  = (*(l_rates - 1)) + 20;
+                                }
+                        }
+
+                        ++l_tcp;
+                }
+        }
+
+        l_img_comp = l_image->comps;
+        l_tile_size = 0;
+
+        for (i=0;i<l_image->numcomps;++i) {
+                l_tile_size += (        opj_uint_ceildiv(l_cp->tdx,l_img_comp->dx)
+                                                        *
+                                                        opj_uint_ceildiv(l_cp->tdy,l_img_comp->dy)
+                                                        *
+                                                        l_img_comp->prec
+                                                );
+
+                ++l_img_comp;
+        }
+
+        l_tile_size = (OPJ_UINT32) (l_tile_size * 0.1625); /* 1.3/8 = 0.1625 */
+
+        l_tile_size += opj_j2k_get_specific_header_sizes(p_j2k);
+
+        p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = l_tile_size;
+        p_j2k->m_specific_param.m_encoder.m_encoded_tile_data =
+                        (OPJ_BYTE *) opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size);
+        if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data == 00) {
+                return OPJ_FALSE;
+        }
+
+        if (l_cp->m_specific_param.m_enc.m_cinema) {
+                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer =
+                                (OPJ_BYTE *) opj_malloc(5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
+                if (! p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
+                        return OPJ_FALSE;
+                }
+
+                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current =
+                                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer;
+        }
+
+        return OPJ_TRUE;
+}
+
+#if 0
+OPJ_BOOL opj_j2k_read_eoc (     opj_j2k_t *p_j2k,
+                                                        opj_stream_private_t *p_stream,
+                                                        opj_event_mgr_t * p_manager )
+{
+        OPJ_UINT32 i;
+        opj_tcd_t * l_tcd = 00;
+        OPJ_UINT32 l_nb_tiles;
+        opj_tcp_t * l_tcp = 00;
+        OPJ_BOOL l_success;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+        l_tcp = p_j2k->m_cp.tcps;
+
+        l_tcd = opj_tcd_create(OPJ_TRUE);
+        if (l_tcd == 00) {
+                opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
+                return OPJ_FALSE;
+        }
+
+        for (i = 0; i < l_nb_tiles; ++i) {
+                if (l_tcp->m_data) {
+                        if (! opj_tcd_init_decode_tile(l_tcd, i)) {
+                                opj_tcd_destroy(l_tcd);
+                                opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
+                                return OPJ_FALSE;
+                        }
+
+                        l_success = opj_tcd_decode_tile(l_tcd, l_tcp->m_data, l_tcp->m_data_size, i, p_j2k->cstr_index);
+                        /* cleanup */
+
+                        if (! l_success) {
+                                p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
+                                break;
+                        }
+                }
+
+                opj_j2k_tcp_destroy(l_tcp);
+                ++l_tcp;
+        }
+
+        opj_tcd_destroy(l_tcd);
+        return OPJ_TRUE;
+}
+#endif
+
+OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k,
+                                                        struct opj_stream_private *p_stream,
+                                                        struct opj_event_mgr * p_manager )
+{
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        p_j2k->cstr_index->main_head_end = opj_stream_tell(p_stream);
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_mct_data_group(  opj_j2k_t *p_j2k,
+                                                                        struct opj_stream_private *p_stream,
+                                                                        struct opj_event_mgr * p_manager )
+{
+        OPJ_UINT32 i;
+        opj_simple_mcc_decorrelation_data_t * l_mcc_record;
+        opj_mct_data_t * l_mct_record;
+        opj_tcp_t * l_tcp;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_stream != 00);
+        assert(p_manager != 00);
+
+        if (! opj_j2k_write_cbd(p_j2k,p_stream,p_manager)) {
+                return OPJ_FALSE;
+        }
+
+        l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
+        l_mct_record = l_tcp->m_mct_records;
+
+        for (i=0;i<l_tcp->m_nb_mct_records;++i) {
+
+                if (! opj_j2k_write_mct_record(p_j2k,l_mct_record,p_stream,p_manager)) {
+                        return OPJ_FALSE;
+                }
+
+                ++l_mct_record;
+        }
+
+        l_mcc_record = l_tcp->m_mcc_records;
+
+        for     (i=0;i<l_tcp->m_nb_mcc_records;++i) {
+
+                if (! opj_j2k_write_mcc_record(p_j2k,l_mcc_record,p_stream,p_manager)) {
+                        return OPJ_FALSE;
+                }
+
+                ++l_mcc_record;
+        }
+
+        if (! opj_j2k_write_mco(p_j2k,p_stream,p_manager)) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+#if 0
+OPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k,
+                                                                        struct opj_stream_private *p_stream,
+                                                                        struct opj_event_mgr * p_manager )
+{
+        OPJ_UINT32 compno;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)
+        {
+                if (! opj_j2k_write_coc(p_j2k,compno,p_stream, p_manager)) {
+                        return OPJ_FALSE;
+                }
+        }
+
+        return OPJ_TRUE;
+}
+#endif
+
+#if 0
+OPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k,
+                                                                        struct opj_stream_private *p_stream,
+                                                                        struct opj_event_mgr * p_manager )
+{
+        OPJ_UINT32 compno;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)
+        {
+                if (! opj_j2k_write_qcc(p_j2k,compno,p_stream, p_manager)) {
+                        return OPJ_FALSE;
+                }
+        }
+
+        return OPJ_TRUE;
+}
+#endif
+
+
+OPJ_BOOL opj_j2k_write_regions( opj_j2k_t *p_j2k,
+                                                        struct opj_stream_private *p_stream,
+                                                        struct opj_event_mgr * p_manager )
+{
+        OPJ_UINT32 compno;
+        const opj_tccp_t *l_tccp = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_tccp = p_j2k->m_cp.tcps->tccps;
+
+        for     (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)  {
+                if (l_tccp->roishift) {
+
+                        if (! opj_j2k_write_rgn(p_j2k,0,compno,p_j2k->m_private_image->numcomps,p_stream,p_manager)) {
+                                return OPJ_FALSE;
+                        }
+                }
+
+                ++l_tccp;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_epc(     opj_j2k_t *p_j2k,
+                                                struct opj_stream_private *p_stream,
+                                                struct opj_event_mgr * p_manager )
+{
+        opj_codestream_index_t * l_cstr_index = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_cstr_index = p_j2k->cstr_index;
+        if (l_cstr_index) {
+                l_cstr_index->codestream_size = (OPJ_UINT64)opj_stream_tell(p_stream);
+                /* UniPG>> */
+                /* The following adjustment is done to adjust the codestream size */
+                /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */
+                /* the first bunch of bytes is not in the codestream              */
+                l_cstr_index->codestream_size -= (OPJ_UINT64)l_cstr_index->main_head_start;
+                /* <<UniPG */
+        }
+
+#ifdef USE_JPWL
+        /* preparation of JPWL marker segments */
+#if 0
+        if(cp->epc_on) {
+
+                /* encode according to JPWL */
+                jpwl_encode(p_j2k, p_stream, image);
+
+        }
+#endif
+  assert( 0 && "TODO" );
+#endif /* USE_JPWL */
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_unk (     opj_j2k_t *p_j2k,
+                                                        opj_stream_private_t *p_stream,
+                                                        OPJ_UINT32 *output_marker,
+                                                        opj_event_mgr_t * p_manager
+                                                        )
+{
+        OPJ_UINT32 l_unknown_marker;
+        const opj_dec_memory_marker_handler_t * l_marker_handler;
+        OPJ_UINT32 l_size_unk = 2;
+
+        /* preconditions*/
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n");
+
+        while(1) {
+                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
+                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                        return OPJ_FALSE;
+                }
+
+                /* read 2 bytes as the new marker ID*/
+                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_unknown_marker,2);
+
+                if (!(l_unknown_marker < 0xff00)) {
+
+                        /* Get the marker handler from the marker ID*/
+                        l_marker_handler = opj_j2k_get_marker_handler(l_unknown_marker);
+
+                        if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
+                                opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
+                                return OPJ_FALSE;
+                        }
+                        else {
+                                if (l_marker_handler->id != J2K_MS_UNK) {
+                                        /* Add the marker to the codestream index*/
+                                        if (l_marker_handler->id != J2K_MS_SOT)
+                                        {
+                                                OPJ_BOOL res = opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_UNK,
+                                                                (OPJ_UINT32) opj_stream_tell(p_stream) - l_size_unk,
+                                                                l_size_unk);
+                                                if (res == OPJ_FALSE) {
+                                                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
+                                                        return OPJ_FALSE;
+                                                }
+                                        }
+                                        break; /* next marker is known and well located */
+                                }
+                                else
+                                        l_size_unk += 2;
+                        }
+                }
+        }
+
+        *output_marker = l_marker_handler->id ;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_mct_record(      opj_j2k_t *p_j2k,
+                                                                opj_mct_data_t * p_mct_record,
+                                                                struct opj_stream_private *p_stream,
+                                                                struct opj_event_mgr * p_manager )
+{
+        OPJ_UINT32 l_mct_size;
+        OPJ_BYTE * l_current_data = 00;
+        OPJ_UINT32 l_tmp;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_mct_size = 10 + p_mct_record->m_data_size;
+
+        if (l_mct_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size);
+                if (! new_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCT marker\n");
+                        return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mct_size;
+        }
+
+        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+        opj_write_bytes(l_current_data,J2K_MS_MCT,2);                                   /* MCT */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_mct_size-2,2);                                 /* Lmct */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,0,2);                                                    /* Zmct */
+        l_current_data += 2;
+
+        /* only one marker atm */
+        l_tmp = (p_mct_record->m_index & 0xff) | (p_mct_record->m_array_type << 8) | (p_mct_record->m_element_type << 10);
+
+        opj_write_bytes(l_current_data,l_tmp,2);
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,0,2);                                                    /* Ymct */
+        l_current_data+=2;
+
+        memcpy(l_current_data,p_mct_record->m_data,p_mct_record->m_data_size);
+
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mct_size,p_manager) != l_mct_size) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a MCT marker (Multiple Component Transform)
+ *
+ * @param       p_header_data   the data contained in the MCT box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the MCT marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_mct (      opj_j2k_t *p_j2k,
+                                                                    OPJ_BYTE * p_header_data,
+                                                                    OPJ_UINT32 p_header_size,
+                                                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        OPJ_UINT32 i;
+        opj_tcp_t *l_tcp = 00;
+        OPJ_UINT32 l_tmp;
+        OPJ_UINT32 l_indix;
+        opj_mct_data_t * l_mct_data;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+
+        l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+                        &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
+                        p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+        if (p_header_size < 2) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+                return OPJ_FALSE;
+        }
+
+        /* first marker */
+        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Zmct */
+        p_header_data += 2;
+        if (l_tmp != 0) {
+                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge mct data within multiple MCT records\n");
+                return OPJ_TRUE;
+        }
+
+        if(p_header_size <= 6) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+                return OPJ_FALSE;
+        }
+
+        /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/
+        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Imct */
+        p_header_data += 2;
+
+        l_indix = l_tmp & 0xff;
+        l_mct_data = l_tcp->m_mct_records;
+
+        for (i=0;i<l_tcp->m_nb_mct_records;++i) {
+                if (l_mct_data->m_index == l_indix) {
+                        break;
+                }
+                ++l_mct_data;
+        }
+
+        /* NOT FOUND */
+        if (i == l_tcp->m_nb_mct_records) {
+                if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) {
+                        opj_mct_data_t *new_mct_records;
+                        l_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+
+                        new_mct_records = (opj_mct_data_t *) opj_realloc(l_tcp->m_mct_records, l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
+                        if (! new_mct_records) {
+                                opj_free(l_tcp->m_mct_records);
+                                l_tcp->m_mct_records = NULL;
+                                l_tcp->m_nb_max_mct_records = 0;
+                                l_tcp->m_nb_mct_records = 0;
+                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCT marker\n");
+                                return OPJ_FALSE;
+                        }
+                        l_tcp->m_mct_records = new_mct_records;
+                        l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
+                        memset(l_mct_data ,0,(l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
+                }
+
+                l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
+        }
+
+        if (l_mct_data->m_data) {
+                opj_free(l_mct_data->m_data);
+                l_mct_data->m_data = 00;
+        }
+
+        l_mct_data->m_index = l_indix;
+        l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp  >> 8) & 3);
+        l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp  >> 10) & 3);
+
+        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Ymct */
+        p_header_data+=2;
+        if (l_tmp != 0) {
+                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple MCT markers\n");
+                return OPJ_TRUE;
+        }
+
+        p_header_size -= 6;
+
+        l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);
+        if (! l_mct_data->m_data) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+                return OPJ_FALSE;
+        }
+        memcpy(l_mct_data->m_data,p_header_data,p_header_size);
+
+        l_mct_data->m_data_size = p_header_size;
+        ++l_tcp->m_nb_mct_records;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_mcc_record(      opj_j2k_t *p_j2k,
+                                                                struct opj_simple_mcc_decorrelation_data * p_mcc_record,
+                                                                struct opj_stream_private *p_stream,
+                                                                struct opj_event_mgr * p_manager )
+{
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_mcc_size;
+        OPJ_BYTE * l_current_data = 00;
+        OPJ_UINT32 l_nb_bytes_for_comp;
+        OPJ_UINT32 l_mask;
+        OPJ_UINT32 l_tmcc;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        if (p_mcc_record->m_nb_comps > 255 ) {
+        l_nb_bytes_for_comp = 2;
+                l_mask = 0x8000;
+        }
+        else {
+                l_nb_bytes_for_comp = 1;
+                l_mask = 0;
+        }
+
+        l_mcc_size = p_mcc_record->m_nb_comps * 2 * l_nb_bytes_for_comp + 19;
+        if (l_mcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
+        {
+                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size);
+                if (! new_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCC marker\n");
+                        return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mcc_size;
+        }
+
+        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+        opj_write_bytes(l_current_data,J2K_MS_MCC,2);                                   /* MCC */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_mcc_size-2,2);                                 /* Lmcc */
+        l_current_data += 2;
+
+        /* first marker */
+        opj_write_bytes(l_current_data,0,2);                                    /* Zmcc */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,p_mcc_record->m_index,1);                                        /* Imcc -> no need for other values, take the first */
+        ++l_current_data;
+
+        /* only one marker atm */
+        opj_write_bytes(l_current_data,0,2);                                    /* Ymcc */
+        l_current_data+=2;
+
+        opj_write_bytes(l_current_data,1,2);                                    /* Qmcc -> number of collections -> 1 */
+        l_current_data+=2;
+
+        opj_write_bytes(l_current_data,0x1,1);                                  /* Xmcci type of component transformation -> array based decorrelation */
+        ++l_current_data;
+
+        opj_write_bytes(l_current_data,p_mcc_record->m_nb_comps | l_mask,2);    /* Nmcci number of input components involved and size for each component offset = 8 bits */
+        l_current_data+=2;
+
+        for (i=0;i<p_mcc_record->m_nb_comps;++i) {
+                opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp);                          /* Cmccij Component offset*/
+                l_current_data+=l_nb_bytes_for_comp;
+        }
+
+        opj_write_bytes(l_current_data,p_mcc_record->m_nb_comps|l_mask,2);      /* Mmcci number of output components involved and size for each component offset = 8 bits */
+        l_current_data+=2;
+
+        for (i=0;i<p_mcc_record->m_nb_comps;++i)
+        {
+                opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp);                          /* Wmccij Component offset*/
+                l_current_data+=l_nb_bytes_for_comp;
+        }
+
+        l_tmcc = ((!p_mcc_record->m_is_irreversible)&1)<<16;
+
+        if (p_mcc_record->m_decorrelation_array) {
+                l_tmcc |= p_mcc_record->m_decorrelation_array->m_index;
+        }
+
+        if (p_mcc_record->m_offset_array) {
+                l_tmcc |= ((p_mcc_record->m_offset_array->m_index)<<8);
+        }
+
+        opj_write_bytes(l_current_data,l_tmcc,3);       /* Tmcci : use MCT defined as number 1 and irreversible array based. */
+        l_current_data+=3;
+
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mcc_size,p_manager) != l_mcc_size) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_mcc (     opj_j2k_t *p_j2k,
+                                                OPJ_BYTE * p_header_data,
+                                                OPJ_UINT32 p_header_size,
+                                                opj_event_mgr_t * p_manager )
+{
+        OPJ_UINT32 i,j;
+        OPJ_UINT32 l_tmp;
+        OPJ_UINT32 l_indix;
+        opj_tcp_t * l_tcp;
+        opj_simple_mcc_decorrelation_data_t * l_mcc_record;
+        opj_mct_data_t * l_mct_data;
+        OPJ_UINT32 l_nb_collections;
+        OPJ_UINT32 l_nb_comps;
+        OPJ_UINT32 l_nb_bytes_by_comp;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+                        &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
+                        p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+        if (p_header_size < 2) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+                return OPJ_FALSE;
+        }
+
+        /* first marker */
+        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Zmcc */
+        p_header_data += 2;
+        if (l_tmp != 0) {
+                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple data spanning\n");
+                return OPJ_TRUE;
+        }
+
+        if (p_header_size < 7) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+                return OPJ_FALSE;
+        }
+
+        opj_read_bytes(p_header_data,&l_indix,1); /* Imcc -> no need for other values, take the first */
+        ++p_header_data;
+
+        l_mcc_record = l_tcp->m_mcc_records;
+
+        for(i=0;i<l_tcp->m_nb_mcc_records;++i) {
+                if (l_mcc_record->m_index == l_indix) {
+                        break;
+                }
+                ++l_mcc_record;
+        }
+
+        /** NOT FOUND */
+        if (i == l_tcp->m_nb_mcc_records) {
+                if (l_tcp->m_nb_mcc_records == l_tcp->m_nb_max_mcc_records) {
+                        opj_simple_mcc_decorrelation_data_t *new_mcc_records;
+                        l_tcp->m_nb_max_mcc_records += OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
+
+                        new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
+                                        l_tcp->m_mcc_records, l_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t));
+                        if (! new_mcc_records) {
+                                opj_free(l_tcp->m_mcc_records);
+                                l_tcp->m_mcc_records = NULL;
+                                l_tcp->m_nb_max_mcc_records = 0;
+                                l_tcp->m_nb_mcc_records = 0;
+                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCC marker\n");
+                                return OPJ_FALSE;
+                        }
+                        l_tcp->m_mcc_records = new_mcc_records;
+                        l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
+                        memset(l_mcc_record,0,(l_tcp->m_nb_max_mcc_records-l_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
+                }
+                l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
+        }
+        l_mcc_record->m_index = l_indix;
+
+        /* only one marker atm */
+        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Ymcc */
+        p_header_data+=2;
+        if (l_tmp != 0) {
+                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple data spanning\n");
+                return OPJ_TRUE;
+        }
+
+        opj_read_bytes(p_header_data,&l_nb_collections,2);                              /* Qmcc -> number of collections -> 1 */
+        p_header_data+=2;
+
+        if (l_nb_collections > 1) {
+                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple collections\n");
+                return OPJ_TRUE;
+        }
+
+        p_header_size -= 7;
+
+        for (i=0;i<l_nb_collections;++i) {
+                if (p_header_size < 3) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+                        return OPJ_FALSE;
+                }
+
+                opj_read_bytes(p_header_data,&l_tmp,1); /* Xmcci type of component transformation -> array based decorrelation */
+                ++p_header_data;
+
+                if (l_tmp != 1) {
+                        opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections other than array decorrelation\n");
+                        return OPJ_TRUE;
+                }
+
+                opj_read_bytes(p_header_data,&l_nb_comps,2);
+
+                p_header_data+=2;
+                p_header_size-=3;
+
+                l_nb_bytes_by_comp = 1 + (l_nb_comps>>15);
+                l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff;
+
+                if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2)) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+                        return OPJ_FALSE;
+                }
+
+                p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2);
+
+                for (j=0;j<l_mcc_record->m_nb_comps;++j) {
+                        opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp);        /* Cmccij Component offset*/
+                        p_header_data+=l_nb_bytes_by_comp;
+
+                        if (l_tmp != j) {
+                                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections with indix shuffle\n");
+                                return OPJ_TRUE;
+                        }
+                }
+
+                opj_read_bytes(p_header_data,&l_nb_comps,2);
+                p_header_data+=2;
+
+                l_nb_bytes_by_comp = 1 + (l_nb_comps>>15);
+                l_nb_comps &= 0x7fff;
+
+                if (l_nb_comps != l_mcc_record->m_nb_comps) {
+                        opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections without same number of indixes\n");
+                        return OPJ_TRUE;
+                }
+
+                if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3)) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+                        return OPJ_FALSE;
+                }
+
+                p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3);
+
+                for (j=0;j<l_mcc_record->m_nb_comps;++j) {
+                        opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp);        /* Wmccij Component offset*/
+                        p_header_data+=l_nb_bytes_by_comp;
+
+                        if (l_tmp != j) {
+                                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections with indix shuffle\n");
+                                return OPJ_TRUE;
+                        }
+                }
+
+                opj_read_bytes(p_header_data,&l_tmp,3); /* Wmccij Component offset*/
+                p_header_data += 3;
+
+                l_mcc_record->m_is_irreversible = ! ((l_tmp>>16) & 1);
+                l_mcc_record->m_decorrelation_array = 00;
+                l_mcc_record->m_offset_array = 00;
+
+                l_indix = l_tmp & 0xff;
+                if (l_indix != 0) {
+                        l_mct_data = l_tcp->m_mct_records;
+                        for (j=0;j<l_tcp->m_nb_mct_records;++j) {
+                                if (l_mct_data->m_index == l_indix) {
+                                        l_mcc_record->m_decorrelation_array = l_mct_data;
+                                        break;
+                                }
+                                ++l_mct_data;
+                        }
+
+                        if (l_mcc_record->m_decorrelation_array == 00) {
+                                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+                                return OPJ_FALSE;
+                        }
+                }
+
+                l_indix = (l_tmp >> 8) & 0xff;
+                if (l_indix != 0) {
+                        l_mct_data = l_tcp->m_mct_records;
+                        for (j=0;j<l_tcp->m_nb_mct_records;++j) {
+                                if (l_mct_data->m_index == l_indix) {
+                                        l_mcc_record->m_offset_array = l_mct_data;
+                                        break;
+                                }
+                                ++l_mct_data;
+                        }
+
+                        if (l_mcc_record->m_offset_array == 00) {
+                                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+                                return OPJ_FALSE;
+                        }
+                }
+        }
+
+        if (p_header_size != 0) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+                return OPJ_FALSE;
+        }
+
+        ++l_tcp->m_nb_mcc_records;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_mco(     opj_j2k_t *p_j2k,
+                                                struct opj_stream_private *p_stream,
+                                                struct opj_event_mgr * p_manager
+                                  )
+{
+        OPJ_BYTE * l_current_data = 00;
+        OPJ_UINT32 l_mco_size;
+        opj_tcp_t * l_tcp = 00;
+        opj_simple_mcc_decorrelation_data_t * l_mcc_record;
+        OPJ_UINT32 i;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_tcp =&(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
+        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+        l_mco_size = 5 + l_tcp->m_nb_mcc_records;
+        if (l_mco_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+
+                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size);
+                if (! new_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCO marker\n");
+                        return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mco_size;
+        }
+
+        opj_write_bytes(l_current_data,J2K_MS_MCO,2);                   /* MCO */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_mco_size-2,2);                 /* Lmco */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_tcp->m_nb_mcc_records,1);      /* Nmco : only one tranform stage*/
+        ++l_current_data;
+
+        l_mcc_record = l_tcp->m_mcc_records;
+        for     (i=0;i<l_tcp->m_nb_mcc_records;++i) {
+                opj_write_bytes(l_current_data,l_mcc_record->m_index,1);/* Imco -> use the mcc indicated by 1*/
+                ++l_current_data;
+
+                ++l_mcc_record;
+        }
+
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mco_size,p_manager) != l_mco_size) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a MCO marker (Multiple Component Transform Ordering)
+ *
+ * @param       p_header_data   the data contained in the MCO box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the MCO marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_mco (      opj_j2k_t *p_j2k,
+                                                                    OPJ_BYTE * p_header_data,
+                                                                    OPJ_UINT32 p_header_size,
+                                                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        OPJ_UINT32 l_tmp, i;
+        OPJ_UINT32 l_nb_stages;
+        opj_tcp_t * l_tcp;
+        opj_tccp_t * l_tccp;
+        opj_image_t * l_image;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_image = p_j2k->m_private_image;
+        l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+                        &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
+                        p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+        if (p_header_size < 1) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCO marker\n");
+                return OPJ_FALSE;
+        }
+
+        opj_read_bytes(p_header_data,&l_nb_stages,1);                           /* Nmco : only one tranform stage*/
+        ++p_header_data;
+
+        if (l_nb_stages > 1) {
+                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple transformation stages.\n");
+                return OPJ_TRUE;
+        }
+
+        if (p_header_size != l_nb_stages + 1) {
+                opj_event_msg(p_manager, EVT_WARNING, "Error reading MCO marker\n");
+                return OPJ_FALSE;
+        }
+
+        l_tccp = l_tcp->tccps;
+
+        for (i=0;i<l_image->numcomps;++i) {
+                l_tccp->m_dc_level_shift = 0;
+                ++l_tccp;
+        }
+
+        if (l_tcp->m_mct_decoding_matrix) {
+                opj_free(l_tcp->m_mct_decoding_matrix);
+                l_tcp->m_mct_decoding_matrix = 00;
+        }
+
+        for (i=0;i<l_nb_stages;++i) {
+                opj_read_bytes(p_header_data,&l_tmp,1);
+                ++p_header_data;
+
+                if (! opj_j2k_add_mct(l_tcp,p_j2k->m_private_image,l_tmp)) {
+                        return OPJ_FALSE;
+                }
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index)
+{
+        OPJ_UINT32 i;
+        opj_simple_mcc_decorrelation_data_t * l_mcc_record;
+        opj_mct_data_t * l_deco_array, * l_offset_array;
+        OPJ_UINT32 l_data_size,l_mct_size, l_offset_size;
+        OPJ_UINT32 l_nb_elem;
+        OPJ_UINT32 * l_offset_data, * l_current_offset_data;
+        opj_tccp_t * l_tccp;
+
+        /* preconditions */
+        assert(p_tcp != 00);
+
+        l_mcc_record = p_tcp->m_mcc_records;
+
+        for (i=0;i<p_tcp->m_nb_mcc_records;++i) {
+                if (l_mcc_record->m_index == p_index) {
+                        break;
+                }
+        }
+
+        if (i==p_tcp->m_nb_mcc_records) {
+                /** element discarded **/
+                return OPJ_TRUE;
+        }
+
+        if (l_mcc_record->m_nb_comps != p_image->numcomps) {
+                /** do not support number of comps != image */
+                return OPJ_TRUE;
+        }
+
+        l_deco_array = l_mcc_record->m_decorrelation_array;
+
+        if (l_deco_array) {
+                l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps * p_image->numcomps;
+                if (l_deco_array->m_data_size != l_data_size) {
+                        return OPJ_FALSE;
+                }
+
+                l_nb_elem = p_image->numcomps * p_image->numcomps;
+                l_mct_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+                p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
+
+                if (! p_tcp->m_mct_decoding_matrix ) {
+                        return OPJ_FALSE;
+                }
+
+                j2k_mct_read_functions_to_float[l_deco_array->m_element_type](l_deco_array->m_data,p_tcp->m_mct_decoding_matrix,l_nb_elem);
+        }
+
+        l_offset_array = l_mcc_record->m_offset_array;
+
+        if (l_offset_array) {
+                l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] * p_image->numcomps;
+                if (l_offset_array->m_data_size != l_data_size) {
+                        return OPJ_FALSE;
+                }
+
+                l_nb_elem = p_image->numcomps;
+                l_offset_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_UINT32);
+                l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size);
+
+                if (! l_offset_data ) {
+                        return OPJ_FALSE;
+                }
+
+                j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](l_offset_array->m_data,l_offset_data,l_nb_elem);
+
+                l_tccp = p_tcp->tccps;
+                l_current_offset_data = l_offset_data;
+
+                for (i=0;i<p_image->numcomps;++i) {
+                        l_tccp->m_dc_level_shift = (OPJ_INT32)*(l_current_offset_data++);
+                        ++l_tccp;
+                }
+
+                opj_free(l_offset_data);
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_cbd( opj_j2k_t *p_j2k,
+                                                struct opj_stream_private *p_stream,
+                                                struct opj_event_mgr * p_manager )
+{
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_cbd_size;
+        OPJ_BYTE * l_current_data = 00;
+        opj_image_t *l_image = 00;
+        opj_image_comp_t * l_comp = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_image = p_j2k->m_private_image;
+        l_cbd_size = 6 + p_j2k->m_private_image->numcomps;
+
+        if (l_cbd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size);
+                if (! new_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write CBD marker\n");
+                        return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_cbd_size;
+        }
+
+        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+        opj_write_bytes(l_current_data,J2K_MS_CBD,2);                   /* CBD */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_cbd_size-2,2);                 /* L_CBD */
+        l_current_data += 2;
+
+        opj_write_bytes(l_current_data,l_image->numcomps, 2);           /* Ncbd */
+        l_current_data+=2;
+
+        l_comp = l_image->comps;
+
+        for (i=0;i<l_image->numcomps;++i) {
+                opj_write_bytes(l_current_data, (l_comp->sgnd << 7) | (l_comp->prec - 1), 1);           /* Component bit depth */
+                ++l_current_data;
+
+                ++l_comp;
+        }
+
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_cbd_size,p_manager) != l_cbd_size) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Reads a CBD marker (Component bit depth definition)
+ * @param       p_header_data   the data contained in the CBD box.
+ * @param       p_j2k                   the jpeg2000 codec.
+ * @param       p_header_size   the size of the data contained in the CBD marker.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_cbd (      opj_j2k_t *p_j2k,
+                                                                OPJ_BYTE * p_header_data,
+                                                                OPJ_UINT32 p_header_size,
+                                                                opj_event_mgr_t * p_manager
+                                    )
+{
+        OPJ_UINT32 l_nb_comp,l_num_comp;
+        OPJ_UINT32 l_comp_def;
+        OPJ_UINT32 i;
+        opj_image_comp_t * l_comp = 00;
+
+        /* preconditions */
+        assert(p_header_data != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        l_num_comp = p_j2k->m_private_image->numcomps;
+
+        if (p_header_size != (p_j2k->m_private_image->numcomps + 2)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
+                return OPJ_FALSE;
+        }
+
+        opj_read_bytes(p_header_data,&l_nb_comp,2);                             /* Ncbd */
+        p_header_data+=2;
+
+        if (l_nb_comp != l_num_comp) {
+                opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
+                return OPJ_FALSE;
+        }
+
+        l_comp = p_j2k->m_private_image->comps;
+        for (i=0;i<l_num_comp;++i) {
+                opj_read_bytes(p_header_data,&l_comp_def,1);                    /* Component bit depth */
+                ++p_header_data;
+        l_comp->sgnd = (l_comp_def>>7) & 1;
+                l_comp->prec = (l_comp_def&0x7f) + 1;
+                ++l_comp;
+        }
+
+        return OPJ_TRUE;
+}
+
+/* ----------------------------------------------------------------------- */
+/* J2K / JPT decoder interface                                             */
+/* ----------------------------------------------------------------------- */
+
+void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters)
+{
+        if(j2k && parameters) {
+                j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer;
+                j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;
+
+#ifdef USE_JPWL
+                j2k->m_cp.correct = parameters->jpwl_correct;
+                j2k->m_cp.exp_comps = parameters->jpwl_exp_comps;
+                j2k->m_cp.max_tiles = parameters->jpwl_max_tiles;
+#endif /* USE_JPWL */
+        }
+}
+
+/* ----------------------------------------------------------------------- */
+/* J2K encoder interface                                                       */
+/* ----------------------------------------------------------------------- */
+
+opj_j2k_t* opj_j2k_create_compress(void)
+{
+        opj_j2k_t *l_j2k = (opj_j2k_t*) opj_malloc(sizeof(opj_j2k_t));
+        if (!l_j2k) {
+                return NULL;
+        }
+
+        memset(l_j2k,0,sizeof(opj_j2k_t));
+
+        l_j2k->m_is_decoder = 0;
+        l_j2k->m_cp.m_is_decoder = 0;
+
+        l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(OPJ_J2K_DEFAULT_HEADER_SIZE);
+        if (! l_j2k->m_specific_param.m_encoder.m_header_tile_data) {
+                opj_j2k_destroy(l_j2k);
+                return NULL;
+        }
+
+        l_j2k->m_specific_param.m_encoder.m_header_tile_data_size = OPJ_J2K_DEFAULT_HEADER_SIZE;
+
+        /* validation list creation*/
+        l_j2k->m_validation_list = opj_procedure_list_create();
+        if (! l_j2k->m_validation_list) {
+                opj_j2k_destroy(l_j2k);
+                return NULL;
+        }
+
+        /* execution list creation*/
+        l_j2k->m_procedure_list = opj_procedure_list_create();
+        if (! l_j2k->m_procedure_list) {
+                opj_j2k_destroy(l_j2k);
+                return NULL;
+        }
+
+        return l_j2k;
+}
+
+int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres){
+    POC[0].tile  = 1;
+    POC[0].resno0  = 0;
+    POC[0].compno0 = 0;
+    POC[0].layno1  = 1;
+    POC[0].resno1  = (OPJ_UINT32)(numres-1);
+    POC[0].compno1 = 3;
+    POC[0].prg1 = OPJ_CPRL;
+    POC[1].tile  = 1;
+    POC[1].resno0  = (OPJ_UINT32)(numres-1);
+    POC[1].compno0 = 0;
+    POC[1].layno1  = 1;
+    POC[1].resno1  = (OPJ_UINT32)numres;
+    POC[1].compno1 = 3;
+    POC[1].prg1 = OPJ_CPRL;
+    return 2;
+}
+
+void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager)
+{
+    /* Configure cinema parameters */
+    OPJ_FLOAT32 max_rate = 0;
+    OPJ_FLOAT32 temp_rate = 0;
+    int i;
+
+    /* profile (Rsiz) */
+    switch (parameters->cp_cinema){
+    case OPJ_CINEMA2K_24:
+    case OPJ_CINEMA2K_48:
+        parameters->cp_rsiz = OPJ_CINEMA2K;
+        break;
+    case OPJ_CINEMA4K_24:
+        parameters->cp_rsiz = OPJ_CINEMA4K;
+        break;
+    case OPJ_OFF:
+        assert(0);
+        break;
+    }
+
+    /* No tiling */
+    parameters->tile_size_on = OPJ_FALSE;
+    parameters->cp_tdx=1;
+    parameters->cp_tdy=1;
+
+    /* One tile part for each component */
+    parameters->tp_flag = 'C';
+    parameters->tp_on = 1;
+
+    /* Tile and Image shall be at (0,0) */
+    parameters->cp_tx0 = 0;
+    parameters->cp_ty0 = 0;
+    parameters->image_offset_x0 = 0;
+    parameters->image_offset_y0 = 0;
+
+    /* Codeblock size= 32*32 */
+    parameters->cblockw_init = 32;
+    parameters->cblockh_init = 32;
+
+    /* Codeblock style: no mode switch enabled */
+    parameters->mode = 0;
+
+    /* No ROI */
+    parameters->roi_compno = -1;
+
+    /* No subsampling */
+    parameters->subsampling_dx = 1;
+    parameters->subsampling_dy = 1;
+
+    /* 9-7 transform */
+    parameters->irreversible = 1;
+
+    /* Number of layers */
+    if (parameters->tcp_numlayers > 1){
+        opj_event_msg(p_manager, EVT_WARNING,
+                "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
+                "1 single quality layer"
+                "-> Number of layers forced to 1 (rather than %d)\n",
+                parameters->tcp_numlayers);
+        parameters->tcp_numlayers = 1;
+    }
+
+    /* Resolution levels */
+    switch (parameters->cp_cinema){
+    case OPJ_CINEMA2K_24:
+    case OPJ_CINEMA2K_48:
+        if(parameters->numresolution > 6){
+            opj_event_msg(p_manager, EVT_WARNING,
+                    "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+                    "Number of decomposition levels <= 5\n"
+                    "-> Number of decomposition levels forced to 5 (rather than %d)\n",
+                    parameters->numresolution+1);
+            parameters->numresolution = 6;
+        }
+        break;
+    case OPJ_CINEMA4K_24:
+        if(parameters->numresolution < 2){
+            opj_event_msg(p_manager, EVT_WARNING,
+                    "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
+                    "Number of decomposition levels >= 1 && <= 6\n"
+                    "-> Number of decomposition levels forced to 1 (rather than %d)\n",
+                    parameters->numresolution+1);
+            parameters->numresolution = 1;
+        }else if(parameters->numresolution > 7){
+            opj_event_msg(p_manager, EVT_WARNING,
+                    "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
+                    "Number of decomposition levels >= 1 && <= 6\n"
+                    "-> Number of decomposition levels forced to 6 (rather than %d)\n",
+                    parameters->numresolution+1);
+            parameters->numresolution = 7;
+        }
+        break;
+    default :
+        break;
+    }
+
+    /* Precincts */
+    parameters->csty |= 0x01;
+    parameters->res_spec = parameters->numresolution-1;
+    for (i = 0; i<parameters->res_spec; i++) {
+        parameters->prcw_init[i] = 256;
+        parameters->prch_init[i] = 256;
+    }
+
+    /* The progression order shall be CPRL */
+    parameters->prog_order = OPJ_CPRL;
+
+    /* Progression order changes for 4K, disallowed for 2K */
+    if (parameters->cp_cinema == OPJ_CINEMA4K_24) {
+        parameters->numpocs = (OPJ_UINT32)opj_j2k_initialise_4K_poc(parameters->POC,parameters->numresolution);
+    } else {
+        parameters->numpocs = 0;
+    }
+
+    /* Limited bit-rate */
+    parameters->cp_disto_alloc = 1;
+    switch (parameters->cp_cinema){
+    case OPJ_CINEMA2K_24:
+    case OPJ_CINEMA4K_24:
+        max_rate = (OPJ_FLOAT32) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/
+                (OPJ_FLOAT32)(CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy);
+        if (parameters->tcp_rates[0] == 0){
+            parameters->tcp_rates[0] = max_rate;
+        }else{
+            temp_rate =(OPJ_FLOAT32)(image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/
+                    (parameters->tcp_rates[0] * 8 * (OPJ_FLOAT32)image->comps[0].dx * (OPJ_FLOAT32)image->comps[0].dy);
+            if (temp_rate > CINEMA_24_CS ){
+                opj_event_msg(p_manager, EVT_WARNING,
+                        "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
+                        "Maximum 1302083 compressed bytes @ 24fps\n"
+                        "-> Specified rate (%3.1f) exceeds this limit. Rate will be forced to %3.1f.\n",
+                        parameters->tcp_rates[0], max_rate);
+                parameters->tcp_rates[0]= max_rate;
+            }else{
+                opj_event_msg(p_manager, EVT_WARNING,
+                        "JPEG 2000 Profile-3 and 4 (2k/4k dc profile):\n"
+                        "INFO : Specified rate (%3.1f) is below the 2k/4k limit @ 24fps.\n",
+                        parameters->tcp_rates[0]);
+            }
+        }
+        parameters->max_comp_size = COMP_24_CS;
+        break;
+    case OPJ_CINEMA2K_48:
+        max_rate = ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+                (float)(CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy);
+        if (parameters->tcp_rates[0] == 0){
+            parameters->tcp_rates[0] = max_rate;
+        }else{
+            temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+                    (parameters->tcp_rates[0] * 8 * (float)image->comps[0].dx * (float)image->comps[0].dy);
+            if (temp_rate > CINEMA_48_CS ){
+                opj_event_msg(p_manager, EVT_WARNING,
+                        "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+                        "Maximum 651041 compressed bytes @ 48fps\n"
+                        "-> Specified rate (%3.1f) exceeds this limit. Rate will be forced to %3.1f.\n",
+                        parameters->tcp_rates[0], max_rate);
+                parameters->tcp_rates[0]= max_rate;
+            }else{
+                opj_event_msg(p_manager, EVT_WARNING,
+                        "JPEG 2000 Profile-3 (2k dc profile):\n"
+                        "INFO : Specified rate (%3.1f) is below the 2k limit @ 48 fps.\n",
+                        parameters->tcp_rates[0]);
+            }
+        }
+        parameters->max_comp_size = COMP_48_CS;
+        break;
+    default:
+        break;
+    }
+}
+
+OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_CINEMA_MODE cinema_mode, opj_event_mgr_t *p_manager)
+{
+    OPJ_UINT32 i;
+
+    /* Number of components */
+    if (image->numcomps != 3){
+        opj_event_msg(p_manager, EVT_WARNING,
+                "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+                "3 components"
+                "-> Number of components of input image (%d) is not compliant\n"
+                "-> Non-profile-3 codestream will be generated\n",
+                image->numcomps);
+        return OPJ_FALSE;
+    }
+
+    /* Bitdepth */
+    for (i = 0; i < image->numcomps; i++) {
+        if ((image->comps[i].bpp != 12) | (image->comps[i].sgnd)){
+            char signed_str[] = "signed";
+            char unsigned_str[] = "unsigned";
+            char *tmp_str = image->comps[i].sgnd?signed_str:unsigned_str;
+            opj_event_msg(p_manager, EVT_WARNING,
+                    "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+                    "Precision of each component shall be 12 bits unsigned"
+                    "-> At least component %d of input image (%d bits, %s) is not compliant\n"
+                    "-> Non-profile-3 codestream will be generated\n",
+                    i,image->comps[i].bpp, tmp_str);
+            return OPJ_FALSE;
+        }
+    }
+
+    /* Image size */
+    switch (cinema_mode){
+    case OPJ_CINEMA2K_24:
+    case OPJ_CINEMA2K_48:
+        if (((image->comps[0].w > 2048) | (image->comps[0].h > 1080))){
+            opj_event_msg(p_manager, EVT_WARNING,
+                    "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+                    "width <= 2048 and height <= 1080\n"
+                    "-> Input image size %d x %d is not compliant\n"
+                    "-> Non-profile-3 codestream will be generated\n",
+                    image->comps[0].w,image->comps[0].h);
+            return OPJ_FALSE;
+        }
+        break;
+    case OPJ_CINEMA4K_24:
+        if (((image->comps[0].w > 4096) | (image->comps[0].h > 2160))){
+            opj_event_msg(p_manager, EVT_WARNING,
+                    "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
+                    "width <= 4096 and height <= 2160\n"
+                    "-> Image size %d x %d is not compliant\n"
+                    "-> Non-profile-4 codestream will be generated\n",
+                    image->comps[0].w,image->comps[0].h);
+            return OPJ_FALSE;
+        }
+        break;
+    default :
+        break;
+    }
+
+    return OPJ_TRUE;
+}
+
+void opj_j2k_setup_encoder(     opj_j2k_t *p_j2k,
+                                                    opj_cparameters_t *parameters,
+                                                    opj_image_t *image,
+                                                    opj_event_mgr_t * p_manager)
+{
+        OPJ_UINT32 i, j, tileno, numpocs_tile;
+        opj_cp_t *cp = 00;
+
+        if(!p_j2k || !parameters || ! image) {
+                return;
+        }
+
+        /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
+        cp = &(p_j2k->m_cp);
+
+        /* set default values for cp */
+        cp->tw = 1;
+        cp->th = 1;
+
+        /* set cinema parameters if required */
+        if (parameters->cp_cinema){
+            opj_j2k_set_cinema_parameters(parameters,image,p_manager);
+            if (!opj_j2k_is_cinema_compliant(image,parameters->cp_cinema,p_manager)) {
+                parameters->cp_rsiz = OPJ_STD_RSIZ;
+            }
+        }
+
+        /*
+        copy user encoding parameters
+        */
+        cp->m_specific_param.m_enc.m_cinema = parameters->cp_cinema;
+        cp->m_specific_param.m_enc.m_max_comp_size = (OPJ_UINT32)parameters->max_comp_size;
+        cp->rsiz   = parameters->cp_rsiz;
+        cp->m_specific_param.m_enc.m_disto_alloc = (OPJ_UINT32)parameters->cp_disto_alloc & 1u;
+        cp->m_specific_param.m_enc.m_fixed_alloc = (OPJ_UINT32)parameters->cp_fixed_alloc & 1u;
+        cp->m_specific_param.m_enc.m_fixed_quality = (OPJ_UINT32)parameters->cp_fixed_quality & 1u;
+
+        /* mod fixed_quality */
+        if (parameters->cp_fixed_alloc && parameters->cp_matrice) {
+                size_t array_size = (size_t)parameters->tcp_numlayers * (size_t)parameters->numresolution * 3 * sizeof(OPJ_INT32);
+                cp->m_specific_param.m_enc.m_matrice = (OPJ_INT32 *) opj_malloc(array_size);
+                memcpy(cp->m_specific_param.m_enc.m_matrice, parameters->cp_matrice, array_size);
+        }
+
+        /* tiles */
+        cp->tdx = (OPJ_UINT32)parameters->cp_tdx;
+        cp->tdy = (OPJ_UINT32)parameters->cp_tdy;
+
+        /* tile offset */
+        cp->tx0 = (OPJ_UINT32)parameters->cp_tx0;
+        cp->ty0 = (OPJ_UINT32)parameters->cp_ty0;
+
+        /* comment string */
+        if(parameters->cp_comment) {
+                cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1);
+                if(cp->comment) {
+                        strcpy(cp->comment, parameters->cp_comment);
+                }
+        }
+
+        /*
+        calculate other encoding parameters
+        */
+
+        if (parameters->tile_size_on) {
+                cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->x1 - cp->tx0), (OPJ_INT32)cp->tdx);
+                cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->y1 - cp->ty0), (OPJ_INT32)cp->tdy);
+        } else {
+                cp->tdx = image->x1 - cp->tx0;
+                cp->tdy = image->y1 - cp->ty0;
+        }
+
+        if (parameters->tp_on) {
+                cp->m_specific_param.m_enc.m_tp_flag = (OPJ_BYTE)parameters->tp_flag;
+                cp->m_specific_param.m_enc.m_tp_on = 1;
+        }
+
+#ifdef USE_JPWL
+        /*
+        calculate JPWL encoding parameters
+        */
+
+        if (parameters->jpwl_epc_on) {
+                OPJ_INT32 i;
+
+                /* set JPWL on */
+                cp->epc_on = OPJ_TRUE;
+                cp->info_on = OPJ_FALSE; /* no informative technique */
+
+                /* set EPB on */
+                if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
+                        cp->epb_on = OPJ_TRUE;
+
+                        cp->hprot_MH = parameters->jpwl_hprot_MH;
+                        for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
+                                cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
+                                cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
+                        }
+                        /* if tile specs are not specified, copy MH specs */
+                        if (cp->hprot_TPH[0] == -1) {
+                                cp->hprot_TPH_tileno[0] = 0;
+                                cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
+                        }
+                        for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
+                                cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
+                                cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
+                                cp->pprot[i] = parameters->jpwl_pprot[i];
+                        }
+                }
+
+                /* set ESD writing */
+                if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
+                        cp->esd_on = OPJ_TRUE;
+
+                        cp->sens_size = parameters->jpwl_sens_size;
+                        cp->sens_addr = parameters->jpwl_sens_addr;
+                        cp->sens_range = parameters->jpwl_sens_range;
+
+                        cp->sens_MH = parameters->jpwl_sens_MH;
+                        for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
+                                cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
+                                cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
+                        }
+                }
+
+                /* always set RED writing to false: we are at the encoder */
+                cp->red_on = OPJ_FALSE;
+
+        } else {
+                cp->epc_on = OPJ_FALSE;
+        }
+#endif /* USE_JPWL */
+
+        /* initialize the mutiple tiles */
+        /* ---------------------------- */
+        cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
+        if (parameters->numpocs) {
+                /* initialisation of POC */
+                opj_j2k_check_poc_val(parameters->POC,parameters->numpocs, (OPJ_UINT32)parameters->numresolution, image->numcomps, (OPJ_UINT32)parameters->tcp_numlayers, p_manager);
+                /* TODO MSD use the return value*/
+        }
+
+        for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
+                opj_tcp_t *tcp = &cp->tcps[tileno];
+                tcp->numlayers = (OPJ_UINT32)parameters->tcp_numlayers;
+
+                for (j = 0; j < tcp->numlayers; j++) {
+                        if(cp->m_specific_param.m_enc.m_cinema){
+                                if (cp->m_specific_param.m_enc.m_fixed_quality) {
+                                        tcp->distoratio[j] = parameters->tcp_distoratio[j];
+                                }
+                                tcp->rates[j] = parameters->tcp_rates[j];
+                        }else{
+                                if (cp->m_specific_param.m_enc.m_fixed_quality) {       /* add fixed_quality */
+                                        tcp->distoratio[j] = parameters->tcp_distoratio[j];
+                                } else {
+                                        tcp->rates[j] = parameters->tcp_rates[j];
+                                }
+                        }
+                }
+
+                tcp->csty = (OPJ_UINT32)parameters->csty;
+                tcp->prg = parameters->prog_order;
+                tcp->mct = (OPJ_UINT32)parameters->tcp_mct;
+
+                numpocs_tile = 0;
+                tcp->POC = 0;
+
+                if (parameters->numpocs) {
+                        /* initialisation of POC */
+                        tcp->POC = 1;
+                        for (i = 0; i < parameters->numpocs; i++) {
+                                if (tileno + 1 == parameters->POC[i].tile )  {
+                                        opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
+
+                                        tcp_poc->resno0         = parameters->POC[numpocs_tile].resno0;
+                                        tcp_poc->compno0        = parameters->POC[numpocs_tile].compno0;
+                                        tcp_poc->layno1         = parameters->POC[numpocs_tile].layno1;
+                                        tcp_poc->resno1         = parameters->POC[numpocs_tile].resno1;
+                                        tcp_poc->compno1        = parameters->POC[numpocs_tile].compno1;
+                                        tcp_poc->prg1           = parameters->POC[numpocs_tile].prg1;
+                                        tcp_poc->tile           = parameters->POC[numpocs_tile].tile;
+
+                                        numpocs_tile++;
+                                }
+                        }
+
+                        tcp->numpocs = numpocs_tile -1 ;
+                }else{
+                        tcp->numpocs = 0;
+                }
+
+                tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
+
+                if (parameters->mct_data) {
+                      
+                    OPJ_UINT32 lMctSize = image->numcomps * image->numcomps * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+                    OPJ_FLOAT32 * lTmpBuf = (OPJ_FLOAT32*)opj_malloc(lMctSize);
+                    OPJ_INT32 * l_dc_shift = (OPJ_INT32 *) ((OPJ_BYTE *) parameters->mct_data + lMctSize);
+
+                    tcp->mct = 2;
+                    tcp->m_mct_coding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
+                    memcpy(tcp->m_mct_coding_matrix,parameters->mct_data,lMctSize);
+                    memcpy(lTmpBuf,parameters->mct_data,lMctSize);
+
+                    tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
+                    assert(opj_matrix_inversion_f(lTmpBuf,(tcp->m_mct_decoding_matrix),image->numcomps));
+
+                    tcp->mct_norms = (OPJ_FLOAT64*)
+                                    opj_malloc(image->numcomps * sizeof(OPJ_FLOAT64));
+
+                    opj_calculate_norms(tcp->mct_norms,image->numcomps,tcp->m_mct_decoding_matrix);
+                    opj_free(lTmpBuf);
+
+                    for (i = 0; i < image->numcomps; i++) {
+                            opj_tccp_t *tccp = &tcp->tccps[i];
+                            tccp->m_dc_level_shift = l_dc_shift[i];
+                    }
+
+                    opj_j2k_setup_mct_encoding(tcp,image);                        
+                }
+                else {
+                        for (i = 0; i < image->numcomps; i++) {
+                                opj_tccp_t *tccp = &tcp->tccps[i];
+                                opj_image_comp_t * l_comp = &(image->comps[i]);
+
+                                if (! l_comp->sgnd) {
+                                        tccp->m_dc_level_shift = 1 << (l_comp->prec - 1);
+                                }
+                        }
+                }
+
+                for (i = 0; i < image->numcomps; i++) {
+                        opj_tccp_t *tccp = &tcp->tccps[i];
+
+                        tccp->csty = parameters->csty & 0x01;   /* 0 => one precinct || 1 => custom precinct  */
+                        tccp->numresolutions = (OPJ_UINT32)parameters->numresolution;
+                        tccp->cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
+                        tccp->cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
+                        tccp->cblksty = (OPJ_UINT32)parameters->mode;
+                        tccp->qmfbid = parameters->irreversible ? 0 : 1;
+                        tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT;
+                        tccp->numgbits = 2;
+
+                        if ((OPJ_INT32)i == parameters->roi_compno) {
+                                tccp->roishift = parameters->roi_shift;
+                        } else {
+                                tccp->roishift = 0;
+                        }
+
+                                if (parameters->csty & J2K_CCP_CSTY_PRT) {
+                                        OPJ_INT32 p = 0, it_res;
+                                        assert( tccp->numresolutions > 0 );
+                                        for (it_res = (OPJ_INT32)tccp->numresolutions - 1; it_res >= 0; it_res--) {
+                                                if (p < parameters->res_spec) {
+
+                                                        if (parameters->prcw_init[p] < 1) {
+                                                                tccp->prcw[it_res] = 1;
+                                                        } else {
+                                                                tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prcw_init[p]);
+                                                        }
+
+                                                        if (parameters->prch_init[p] < 1) {
+                                                                tccp->prch[it_res] = 1;
+                                                        }else {
+                                                                tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prch_init[p]);
+                                                        }
+
+                                                } else {
+                                                        OPJ_INT32 res_spec = parameters->res_spec;
+                                                        OPJ_INT32 size_prcw = 0;
+                                                        OPJ_INT32 size_prch = 0;
+
+                                                        assert(res_spec>0); /* issue 189 */
+                                                        size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
+                                                        size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
+
+
+                                                        if (size_prcw < 1) {
+                                                                tccp->prcw[it_res] = 1;
+                                                        } else {
+                                                                tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prcw);
+                                                        }
+
+                                                        if (size_prch < 1) {
+                                                                tccp->prch[it_res] = 1;
+                                                        } else {
+                                                                tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prch);
+                                                        }
+                                                }
+                                                p++;
+                                                /*printf("\nsize precinct for level %d : %d,%d\n", it_res,tccp->prcw[it_res], tccp->prch[it_res]); */
+                                        }       /*end for*/
+                                } else {
+                                        for (j = 0; j < tccp->numresolutions; j++) {
+                                                tccp->prcw[j] = 15;
+                                                tccp->prch[j] = 15;
+                                        }
+                                }
+
+                        opj_dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
+                }
+        }
+
+        if (parameters->mct_data) {
+                opj_free(parameters->mct_data);
+                parameters->mct_data = 00;
+        }
+}
+
+static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
+{
+        assert(cstr_index != 00);
+
+        /* expand the list? */
+        if ((cstr_index->marknum + 1) > cstr_index->maxmarknum) {
+                opj_marker_info_t *new_marker;
+                cstr_index->maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32) cstr_index->maxmarknum);
+                new_marker = (opj_marker_info_t *) opj_realloc(cstr_index->marker, cstr_index->maxmarknum *sizeof(opj_marker_info_t));
+                if (! new_marker) {
+                        opj_free(cstr_index->marker);
+                        cstr_index->marker = NULL;
+                        cstr_index->maxmarknum = 0;
+                        cstr_index->marknum = 0;
+                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); */
+                        return OPJ_FALSE;
+                }
+                cstr_index->marker = new_marker;
+        }
+
+        /* add the marker */
+        cstr_index->marker[cstr_index->marknum].type = (OPJ_UINT16)type;
+        cstr_index->marker[cstr_index->marknum].pos = (OPJ_INT32)pos;
+        cstr_index->marker[cstr_index->marknum].len = (OPJ_INT32)len;
+        cstr_index->marknum++;
+        return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno, opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
+{
+        assert(cstr_index != 00);
+        assert(cstr_index->tile_index != 00);
+
+        /* expand the list? */
+        if ((cstr_index->tile_index[tileno].marknum + 1) > cstr_index->tile_index[tileno].maxmarknum) {
+                opj_marker_info_t *new_marker;
+                cstr_index->tile_index[tileno].maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32) cstr_index->tile_index[tileno].maxmarknum);
+                new_marker = (opj_marker_info_t *) opj_realloc(
+                                cstr_index->tile_index[tileno].marker,
+                                cstr_index->tile_index[tileno].maxmarknum *sizeof(opj_marker_info_t));
+                if (! new_marker) {
+                        opj_free(cstr_index->tile_index[tileno].marker);
+                        cstr_index->tile_index[tileno].marker = NULL;
+                        cstr_index->tile_index[tileno].maxmarknum = 0;
+                        cstr_index->tile_index[tileno].marknum = 0;
+                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n"); */
+                        return OPJ_FALSE;
+                }
+                cstr_index->tile_index[tileno].marker = new_marker;
+        }
+
+        /* add the marker */
+        cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].type = (OPJ_UINT16)type;
+        cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].pos = (OPJ_INT32)pos;
+        cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].len = (OPJ_INT32)len;
+        cstr_index->tile_index[tileno].marknum++;
+
+        if (type == J2K_MS_SOT) {
+                OPJ_UINT32 l_current_tile_part = cstr_index->tile_index[tileno].current_tpsno;
+
+                if (cstr_index->tile_index[tileno].tp_index)
+                        cstr_index->tile_index[tileno].tp_index[l_current_tile_part].start_pos = pos;
+
+        }
+        return OPJ_TRUE;
+}
+
+/*
+ * -----------------------------------------------------------------------
+ * -----------------------------------------------------------------------
+ * -----------------------------------------------------------------------
+ */
+
+OPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *p_j2k,
+                                opj_stream_private_t *p_stream,
+                                opj_event_mgr_t * p_manager
+                                )
+{
+    (void)p_j2k;
+    (void)p_stream;
+    (void)p_manager;
+    return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_header(   opj_stream_private_t *p_stream,
+                                                            opj_j2k_t* p_j2k,
+                                                            opj_image_t** p_image,
+                                                            opj_event_mgr_t* p_manager )
+{
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_stream != 00);
+        assert(p_manager != 00);
+
+        /* create an empty image header */
+        p_j2k->m_private_image = opj_image_create0();
+        if (! p_j2k->m_private_image) {
+                return OPJ_FALSE;
+        }
+
+        /* customization of the validation */
+        opj_j2k_setup_decoding_validation(p_j2k);
+
+        /* validation of the parameters codec */
+        if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream,p_manager)) {
+                opj_image_destroy(p_j2k->m_private_image);
+                p_j2k->m_private_image = NULL;
+                return OPJ_FALSE;
+        }
+
+        /* customization of the encoding */
+        opj_j2k_setup_header_reading(p_j2k);
+
+        /* read header */
+        if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
+                opj_image_destroy(p_j2k->m_private_image);
+                p_j2k->m_private_image = NULL;
+                return OPJ_FALSE;
+        }
+
+        *p_image = opj_image_create0();
+        if (! (*p_image)) {
+                return OPJ_FALSE;
+        }
+
+        /* Copy codestream image information to the output image */
+        opj_copy_image_header(p_j2k->m_private_image, *p_image);
+
+    /*Allocate and initialize some elements of codestrem index*/
+        if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)){
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+void opj_j2k_setup_header_reading (opj_j2k_t *p_j2k)
+{
+        /* preconditions*/
+        assert(p_j2k != 00);
+
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_read_header_procedure);
+
+        /* DEVELOPER CORNER, add your custom procedures */
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd);
+
+}
+
+void opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k)
+{
+        /* preconditions*/
+        assert(p_j2k != 00);
+
+        opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_decoder);
+        opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_decoding_validation);
+        /* DEVELOPER CORNER, add your custom validation procedure */
+
+}
+
+OPJ_BOOL opj_j2k_mct_validation (       opj_j2k_t * p_j2k,
+                                                                opj_stream_private_t *p_stream,
+                                                                opj_event_mgr_t * p_manager )
+{
+        OPJ_BOOL l_is_valid = OPJ_TRUE;
+        OPJ_UINT32 i,j;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_stream != 00);
+        assert(p_manager != 00);
+
+        if ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200) {
+                OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+                opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
+
+                for (i=0;i<l_nb_tiles;++i) {
+                        if (l_tcp->mct == 2) {
+                                opj_tccp_t * l_tccp = l_tcp->tccps;
+                                l_is_valid &= (l_tcp->m_mct_coding_matrix != 00);
+
+                                for (j=0;j<p_j2k->m_private_image->numcomps;++j) {
+                                        l_is_valid &= ! (l_tccp->qmfbid & 1);
+                                        ++l_tccp;
+                                }
+                        }
+                        ++l_tcp;
+                }
+        }
+
+        return l_is_valid;
+}
+
+OPJ_BOOL opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp, opj_image_t * p_image)
+{
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_indix = 1;
+        opj_mct_data_t * l_mct_deco_data = 00,* l_mct_offset_data = 00;
+        opj_simple_mcc_decorrelation_data_t * l_mcc_data;
+        OPJ_UINT32 l_mct_size,l_nb_elem;
+        OPJ_FLOAT32 * l_data, * l_current_data;
+        opj_tccp_t * l_tccp;
+
+        /* preconditions */
+        assert(p_tcp != 00);
+
+        if (p_tcp->mct != 2) {
+                return OPJ_TRUE;
+        }
+
+        if (p_tcp->m_mct_decoding_matrix) {
+                if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
+                        opj_mct_data_t *new_mct_records;
+                        p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+
+                        new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records, p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
+                        if (! new_mct_records) {
+                                opj_free(p_tcp->m_mct_records);
+                                p_tcp->m_mct_records = NULL;
+                                p_tcp->m_nb_max_mct_records = 0;
+                                p_tcp->m_nb_mct_records = 0;
+                                /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
+                                return OPJ_FALSE;
+                        }
+                        p_tcp->m_mct_records = new_mct_records;
+                        l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
+
+                        memset(l_mct_deco_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
+                }
+                l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
+
+                if (l_mct_deco_data->m_data) {
+                        opj_free(l_mct_deco_data->m_data);
+                        l_mct_deco_data->m_data = 00;
+                }
+
+                l_mct_deco_data->m_index = l_indix++;
+                l_mct_deco_data->m_array_type = MCT_TYPE_DECORRELATION;
+                l_mct_deco_data->m_element_type = MCT_TYPE_FLOAT;
+                l_nb_elem = p_image->numcomps * p_image->numcomps;
+                l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_deco_data->m_element_type];
+                l_mct_deco_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size );
+
+                if (! l_mct_deco_data->m_data) {
+                        return OPJ_FALSE;
+                }
+
+                j2k_mct_write_functions_from_float[l_mct_deco_data->m_element_type](p_tcp->m_mct_decoding_matrix,l_mct_deco_data->m_data,l_nb_elem);
+
+                l_mct_deco_data->m_data_size = l_mct_size;
+                ++p_tcp->m_nb_mct_records;
+        }
+
+        if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
+                opj_mct_data_t *new_mct_records;
+                p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+                new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records, p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
+                if (! new_mct_records) {
+                        opj_free(p_tcp->m_mct_records);
+                        p_tcp->m_mct_records = NULL;
+                        p_tcp->m_nb_max_mct_records = 0;
+                        p_tcp->m_nb_mct_records = 0;
+                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
+                        return OPJ_FALSE;
+                }
+                p_tcp->m_mct_records = new_mct_records;
+                l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
+
+                memset(l_mct_offset_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
+
+                if (l_mct_deco_data) {
+                        l_mct_deco_data = l_mct_offset_data - 1;
+                }
+        }
+
+        l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
+
+        if (l_mct_offset_data->m_data) {
+                opj_free(l_mct_offset_data->m_data);
+                l_mct_offset_data->m_data = 00;
+        }
+
+        l_mct_offset_data->m_index = l_indix++;
+        l_mct_offset_data->m_array_type = MCT_TYPE_OFFSET;
+        l_mct_offset_data->m_element_type = MCT_TYPE_FLOAT;
+        l_nb_elem = p_image->numcomps;
+        l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_offset_data->m_element_type];
+        l_mct_offset_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size );
+
+        if (! l_mct_offset_data->m_data) {
+                return OPJ_FALSE;
+        }
+
+        l_data = (OPJ_FLOAT32*)opj_malloc(l_nb_elem * sizeof(OPJ_FLOAT32));
+        if (! l_data) {
+                opj_free(l_mct_offset_data->m_data);
+                l_mct_offset_data->m_data = 00;
+                return OPJ_FALSE;
+        }
+
+        l_tccp = p_tcp->tccps;
+        l_current_data = l_data;
+
+        for (i=0;i<l_nb_elem;++i) {
+                *(l_current_data++) = (OPJ_FLOAT32) (l_tccp->m_dc_level_shift);
+                ++l_tccp;
+        }
+
+        j2k_mct_write_functions_from_float[l_mct_offset_data->m_element_type](l_data,l_mct_offset_data->m_data,l_nb_elem);
+
+        opj_free(l_data);
+
+        l_mct_offset_data->m_data_size = l_mct_size;
+
+        ++p_tcp->m_nb_mct_records;
+
+        if (p_tcp->m_nb_mcc_records == p_tcp->m_nb_max_mcc_records) {
+                opj_simple_mcc_decorrelation_data_t *new_mcc_records;
+                p_tcp->m_nb_max_mcc_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+                new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
+                                p_tcp->m_mcc_records, p_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t));
+                if (! new_mcc_records) {
+                        opj_free(p_tcp->m_mcc_records);
+                        p_tcp->m_mcc_records = NULL;
+                        p_tcp->m_nb_max_mcc_records = 0;
+                        p_tcp->m_nb_mcc_records = 0;
+                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
+                        return OPJ_FALSE;
+                }
+                p_tcp->m_mcc_records = new_mcc_records;
+                l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
+                memset(l_mcc_data ,0,(p_tcp->m_nb_max_mcc_records - p_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
+
+        }
+
+        l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
+        l_mcc_data->m_decorrelation_array = l_mct_deco_data;
+        l_mcc_data->m_is_irreversible = 1;
+        l_mcc_data->m_nb_comps = p_image->numcomps;
+        l_mcc_data->m_index = l_indix++;
+        l_mcc_data->m_offset_array = l_mct_offset_data;
+        ++p_tcp->m_nb_mcc_records;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_build_decoder (opj_j2k_t * p_j2k,
+                                                            opj_stream_private_t *p_stream,
+                                                            opj_event_mgr_t * p_manager )
+{
+        /* add here initialization of cp
+           copy paste of setup_decoder */
+  (void)p_j2k;
+  (void)p_stream;
+  (void)p_manager;
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_build_encoder (opj_j2k_t * p_j2k,
+                                                        opj_stream_private_t *p_stream,
+                                                        opj_event_mgr_t * p_manager )
+{
+        /* add here initialization of cp
+           copy paste of setup_encoder */
+  (void)p_j2k;
+  (void)p_stream;
+  (void)p_manager;
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_encoding_validation (  opj_j2k_t * p_j2k,
+                                                                            opj_stream_private_t *p_stream,
+                                                                            opj_event_mgr_t * p_manager )
+{
+        OPJ_BOOL l_is_valid = OPJ_TRUE;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_stream != 00);
+        assert(p_manager != 00);
+
+        /* STATE checking */
+        /* make sure the state is at 0 */
+        l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NONE);
+
+        /* POINTER validation */
+        /* make sure a p_j2k codec is present */
+        l_is_valid &= (p_j2k->m_procedure_list != 00);
+        /* make sure a validation list is present */
+        l_is_valid &= (p_j2k->m_validation_list != 00);
+
+        if ((p_j2k->m_cp.tdx) < (OPJ_UINT32) (1 << p_j2k->m_cp.tcps->tccps->numresolutions)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n");
+                return OPJ_FALSE;
+        }
+
+        if ((p_j2k->m_cp.tdy) < (OPJ_UINT32) (1 << p_j2k->m_cp.tcps->tccps->numresolutions)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n");
+                return OPJ_FALSE;
+        }
+
+        /* PARAMETER VALIDATION */
+        return l_is_valid;
+}
+
+OPJ_BOOL opj_j2k_decoding_validation (  opj_j2k_t *p_j2k,
+                                        opj_stream_private_t *p_stream,
+                                        opj_event_mgr_t * p_manager
+                                        )
+{
+        OPJ_BOOL l_is_valid = OPJ_TRUE;
+
+        /* preconditions*/
+        assert(p_j2k != 00);
+        assert(p_stream != 00);
+        assert(p_manager != 00);
+
+        /* STATE checking */
+        /* make sure the state is at 0 */
+#ifdef TODO_MSD
+        l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE);
+#endif
+        l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == 0x0000);
+
+        /* POINTER validation */
+        /* make sure a p_j2k codec is present */
+        /* make sure a procedure list is present */
+        l_is_valid &= (p_j2k->m_procedure_list != 00);
+        /* make sure a validation list is present */
+        l_is_valid &= (p_j2k->m_validation_list != 00);
+
+        /* PARAMETER VALIDATION */
+        return l_is_valid;
+}
+
+OPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k,
+                                                                            opj_stream_private_t *p_stream,
+                                                                            opj_event_mgr_t * p_manager)
+{
+        OPJ_UINT32 l_current_marker;
+        OPJ_UINT32 l_marker_size;
+        const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
+
+        /* preconditions */
+        assert(p_stream != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        /*  We enter in the main header */
+        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSOC;
+
+        /* Try to read the SOC marker, the codestream must begin with SOC marker */
+        if (! opj_j2k_read_soc(p_j2k,p_stream,p_manager)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Expected a SOC marker \n");
+                return OPJ_FALSE;
+        }
+
+        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
+        if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                return OPJ_FALSE;
+        }
+
+        /* Read 2 bytes as the new marker ID */
+        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
+
+        /* Try to read until the SOT is detected */
+        while (l_current_marker != J2K_MS_SOT) {
+
+                /* Check if the current marker ID is valid */
+                if (l_current_marker < 0xff00) {
+                        opj_event_msg(p_manager, EVT_ERROR, "We expected read a marker ID (0xff--) instead of %.8x\n", l_current_marker);
+                        return OPJ_FALSE;
+                }
+
+                /* Get the marker handler from the marker ID */
+                l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
+
+                /* Manage case where marker is unknown */
+                if (l_marker_handler->id == J2K_MS_UNK) {
+                        if (! opj_j2k_read_unk(p_j2k, p_stream, &l_current_marker, p_manager)){
+                                opj_event_msg(p_manager, EVT_ERROR, "Unknow marker have been detected and generated error.\n");
+                                return OPJ_FALSE;
+                        }
+
+                        if (l_current_marker == J2K_MS_SOT)
+                                break; /* SOT marker is detected main header is completely read */
+                        else    /* Get the marker handler from the marker ID */
+                                l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
+                }
+
+                /* Check if the marker is known and if it is the right place to find it */
+                if (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) ) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
+                        return OPJ_FALSE;
+                }
+
+                /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
+                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                        return OPJ_FALSE;
+                }
+
+                /* read 2 bytes as the marker size */
+                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);
+                l_marker_size -= 2; /* Subtract the size of the marker ID already read */
+
+                /* Check if the marker size is compatible with the header data size */
+                if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
+                        OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
+                        if (! new_header_data) {
+                                opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
+                                p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
+                                p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
+                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
+                                return OPJ_FALSE;
+                        }
+                        p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
+                        p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
+                }
+
+                /* Try to read the rest of the marker segment from stream and copy them into the buffer */
+                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager) != l_marker_size) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                        return OPJ_FALSE;
+                }
+
+                /* Read the marker segment with the correct marker handler */
+                if (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager)) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Marker handler function failed to read the marker segment\n");
+                        return OPJ_FALSE;
+                }
+
+                /* Add the marker to the codestream index*/
+                if (OPJ_FALSE == opj_j2k_add_mhmarker(
+                                        p_j2k->cstr_index,
+                                        l_marker_handler->id,
+                                        (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
+                                        l_marker_size + 4 )) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
+                        return OPJ_FALSE;
+                }
+
+                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
+                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                        return OPJ_FALSE;
+                }
+
+                /* read 2 bytes as the new marker ID */
+                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
+        }
+
+        opj_event_msg(p_manager, EVT_INFO, "Main header has been correctly decoded.\n");
+
+        /* Position of the last element if the main header */
+        p_j2k->cstr_index->main_head_end = (OPJ_UINT32) opj_stream_tell(p_stream) - 2;
+
+        /* Next step: read a tile-part header */
+        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_exec ( opj_j2k_t * p_j2k,
+                                        opj_procedure_list_t * p_procedure_list,
+                                        opj_stream_private_t *p_stream,
+                                        opj_event_mgr_t * p_manager )
+{
+        OPJ_BOOL (** l_procedure) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *) = 00;
+        OPJ_BOOL l_result = OPJ_TRUE;
+        OPJ_UINT32 l_nb_proc, i;
+
+        /* preconditions*/
+        assert(p_procedure_list != 00);
+        assert(p_j2k != 00);
+        assert(p_stream != 00);
+        assert(p_manager != 00);
+
+        l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
+        l_procedure = (OPJ_BOOL (**) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
+
+        for     (i=0;i<l_nb_proc;++i) {
+                l_result = l_result && ((*l_procedure) (p_j2k,p_stream,p_manager));
+                ++l_procedure;
+        }
+
+        /* and clear the procedure list at the end.*/
+        opj_procedure_list_clear(p_procedure_list);
+        return l_result;
+}
+
+/* FIXME DOC*/
+static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd (       opj_j2k_t * p_j2k,
+                                                            opj_stream_private_t *p_stream,
+                                                            opj_event_mgr_t * p_manager
+                                                            )
+{
+        opj_tcp_t * l_tcp = 00;
+        opj_tcp_t * l_default_tcp = 00;
+        OPJ_UINT32 l_nb_tiles;
+        OPJ_UINT32 i,j;
+        opj_tccp_t *l_current_tccp = 00;
+        OPJ_UINT32 l_tccp_size;
+        OPJ_UINT32 l_mct_size;
+        opj_image_t * l_image;
+        OPJ_UINT32 l_mcc_records_size,l_mct_records_size;
+        opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec;
+        opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec;
+        OPJ_UINT32 l_offset;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_stream != 00);
+        assert(p_manager != 00);
+
+        l_image = p_j2k->m_private_image;
+        l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+        l_tcp = p_j2k->m_cp.tcps;
+        l_tccp_size = l_image->numcomps * (OPJ_UINT32)sizeof(opj_tccp_t);
+        l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp;
+        l_mct_size = l_image->numcomps * l_image->numcomps * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+
+        /* For each tile */
+        for (i=0; i<l_nb_tiles; ++i) {
+                /* keep the tile-compo coding parameters pointer of the current tile coding parameters*/
+                l_current_tccp = l_tcp->tccps;
+                /*Copy default coding parameters into the current tile coding parameters*/
+                memcpy(l_tcp, l_default_tcp, sizeof(opj_tcp_t));
+                /* Initialize some values of the current tile coding parameters*/
+                l_tcp->ppt = 0;
+                l_tcp->ppt_data = 00;
+                /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/
+                l_tcp->tccps = l_current_tccp;
+
+                /* Get the mct_decoding_matrix of the dflt_tile_cp and copy them into the current tile cp*/
+                if (l_default_tcp->m_mct_decoding_matrix) {
+                        l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
+                        if (! l_tcp->m_mct_decoding_matrix ) {
+                                return OPJ_FALSE;
+                        }
+                        memcpy(l_tcp->m_mct_decoding_matrix,l_default_tcp->m_mct_decoding_matrix,l_mct_size);
+                }
+
+                /* Get the mct_record of the dflt_tile_cp and copy them into the current tile cp*/
+                l_mct_records_size = l_default_tcp->m_nb_max_mct_records * (OPJ_UINT32)sizeof(opj_mct_data_t);
+                l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size);
+                if (! l_tcp->m_mct_records) {
+                        return OPJ_FALSE;
+                }
+                memcpy(l_tcp->m_mct_records, l_default_tcp->m_mct_records,l_mct_records_size);
+
+                /* Copy the mct record data from dflt_tile_cp to the current tile*/
+                l_src_mct_rec = l_default_tcp->m_mct_records;
+                l_dest_mct_rec = l_tcp->m_mct_records;
+
+                for (j=0;j<l_default_tcp->m_nb_mct_records;++j) {
+
+                        if (l_src_mct_rec->m_data) {
+
+                                l_dest_mct_rec->m_data = (OPJ_BYTE*) opj_malloc(l_src_mct_rec->m_data_size);
+                                if(! l_dest_mct_rec->m_data) {
+                                        return OPJ_FALSE;
+                                }
+                                memcpy(l_dest_mct_rec->m_data,l_src_mct_rec->m_data,l_src_mct_rec->m_data_size);
+                        }
+
+                        ++l_src_mct_rec;
+                        ++l_dest_mct_rec;
+                }
+
+                /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/
+                l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * (OPJ_UINT32)sizeof(opj_simple_mcc_decorrelation_data_t);
+                l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*) opj_malloc(l_mcc_records_size);
+                if (! l_tcp->m_mcc_records) {
+                        return OPJ_FALSE;
+                }
+                memcpy(l_tcp->m_mcc_records,l_default_tcp->m_mcc_records,l_mcc_records_size);
+
+                /* Copy the mcc record data from dflt_tile_cp to the current tile*/
+                l_src_mcc_rec = l_default_tcp->m_mcc_records;
+                l_dest_mcc_rec = l_tcp->m_mcc_records;
+
+                for (j=0;j<l_default_tcp->m_nb_max_mcc_records;++j) {
+
+                        if (l_src_mcc_rec->m_decorrelation_array) {
+                                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_decorrelation_array - l_default_tcp->m_mct_records);
+                                l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset;
+                        }
+
+                        if (l_src_mcc_rec->m_offset_array) {
+                                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_offset_array - l_default_tcp->m_mct_records);
+                                l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset;
+                        }
+
+                        ++l_src_mcc_rec;
+                        ++l_dest_mcc_rec;
+                }
+
+                /* Copy all the dflt_tile_compo_cp to the current tile cp */
+                memcpy(l_current_tccp,l_default_tcp->tccps,l_tccp_size);
+
+                /* Move to next tile cp*/
+                ++l_tcp;
+        }
+
+        /* Create the current tile decoder*/
+        p_j2k->m_tcd = (opj_tcd_t*)opj_tcd_create(OPJ_TRUE); /* FIXME why a cast ? */
+        if (! p_j2k->m_tcd ) {
+                return OPJ_FALSE;
+        }
+
+        if ( !opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp)) ) {
+                opj_tcd_destroy(p_j2k->m_tcd);
+                p_j2k->m_tcd = 00;
+                opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler (OPJ_UINT32 p_id)
+{
+        const opj_dec_memory_marker_handler_t *e;
+        for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) {
+                if (e->id == p_id) {
+                        break; /* we find a handler corresponding to the marker ID*/
+                }
+        }
+        return e;
+}
+
+void opj_j2k_destroy (opj_j2k_t *p_j2k)
+{
+        if (p_j2k == 00) {
+                return;
+        }
+
+        if (p_j2k->m_is_decoder) {
+
+                if (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00) {
+                        opj_j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp);
+                        opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp);
+                        p_j2k->m_specific_param.m_decoder.m_default_tcp = 00;
+                }
+
+                if (p_j2k->m_specific_param.m_decoder.m_header_data != 00) {
+                        opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
+                        p_j2k->m_specific_param.m_decoder.m_header_data = 00;
+                        p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
+                }
+        }
+        else {
+
+                if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00;
+                }
+
+                if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
+                        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 00;
+                        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 00;
+                }
+
+                if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
+                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00;
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+                }
+        }
+
+        opj_tcd_destroy(p_j2k->m_tcd);
+
+        opj_j2k_cp_destroy(&(p_j2k->m_cp));
+        memset(&(p_j2k->m_cp),0,sizeof(opj_cp_t));
+
+        opj_procedure_list_destroy(p_j2k->m_procedure_list);
+        p_j2k->m_procedure_list = 00;
+
+        opj_procedure_list_destroy(p_j2k->m_validation_list);
+        p_j2k->m_procedure_list = 00;
+
+        j2k_destroy_cstr_index(p_j2k->cstr_index);
+        p_j2k->cstr_index = NULL;
+
+        opj_image_destroy(p_j2k->m_private_image);
+        p_j2k->m_private_image = NULL;
+
+        opj_image_destroy(p_j2k->m_output_image);
+        p_j2k->m_output_image = NULL;
+
+        opj_free(p_j2k);
+}
+
+void j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind)
+{
+        if (p_cstr_ind) {
+
+                if (p_cstr_ind->marker) {
+                        opj_free(p_cstr_ind->marker);
+                        p_cstr_ind->marker = NULL;
+                }
+
+                if (p_cstr_ind->tile_index) {
+                        OPJ_UINT32 it_tile = 0;
+
+                        for (it_tile=0; it_tile < p_cstr_ind->nb_of_tiles; it_tile++) {
+
+                                if(p_cstr_ind->tile_index[it_tile].packet_index) {
+                                        opj_free(p_cstr_ind->tile_index[it_tile].packet_index);
+                                        p_cstr_ind->tile_index[it_tile].packet_index = NULL;
+                                }
+
+                                if(p_cstr_ind->tile_index[it_tile].tp_index){
+                                        opj_free(p_cstr_ind->tile_index[it_tile].tp_index);
+                                        p_cstr_ind->tile_index[it_tile].tp_index = NULL;
+                                }
+
+                                if(p_cstr_ind->tile_index[it_tile].marker){
+                                        opj_free(p_cstr_ind->tile_index[it_tile].marker);
+                                        p_cstr_ind->tile_index[it_tile].marker = NULL;
+
+                                }
+                        }
+
+                        opj_free( p_cstr_ind->tile_index);
+                        p_cstr_ind->tile_index = NULL;
+                }
+
+                opj_free(p_cstr_ind);
+        }
+}
+
+void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp)
+{
+        if (p_tcp == 00) {
+                return;
+        }
+
+        if (p_tcp->ppt_buffer != 00) {
+                opj_free(p_tcp->ppt_buffer);
+                p_tcp->ppt_buffer = 00;
+        }
+
+        if (p_tcp->tccps != 00) {
+                opj_free(p_tcp->tccps);
+                p_tcp->tccps = 00;
+        }
+
+        if (p_tcp->m_mct_coding_matrix != 00) {
+                opj_free(p_tcp->m_mct_coding_matrix);
+                p_tcp->m_mct_coding_matrix = 00;
+        }
+
+        if (p_tcp->m_mct_decoding_matrix != 00) {
+                opj_free(p_tcp->m_mct_decoding_matrix);
+                p_tcp->m_mct_decoding_matrix = 00;
+        }
+
+        if (p_tcp->m_mcc_records) {
+                opj_free(p_tcp->m_mcc_records);
+                p_tcp->m_mcc_records = 00;
+                p_tcp->m_nb_max_mcc_records = 0;
+                p_tcp->m_nb_mcc_records = 0;
+        }
+
+        if (p_tcp->m_mct_records) {
+                opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;
+                OPJ_UINT32 i;
+
+                for (i=0;i<p_tcp->m_nb_mct_records;++i) {
+                        if (l_mct_data->m_data) {
+                                opj_free(l_mct_data->m_data);
+                                l_mct_data->m_data = 00;
+                        }
+
+                        ++l_mct_data;
+                }
+
+                opj_free(p_tcp->m_mct_records);
+                p_tcp->m_mct_records = 00;
+        }
+
+        if (p_tcp->mct_norms != 00) {
+                opj_free(p_tcp->mct_norms);
+                p_tcp->mct_norms = 00;
+        }
+
+        opj_j2k_tcp_data_destroy(p_tcp);
+
+}
+
+void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp)
+{
+        if (p_tcp->m_data) {
+                opj_free(p_tcp->m_data);
+                p_tcp->m_data = NULL;
+                p_tcp->m_data_size = 0;
+        }
+}
+
+void opj_j2k_cp_destroy (opj_cp_t *p_cp)
+{
+        OPJ_UINT32 l_nb_tiles;
+        opj_tcp_t * l_current_tile = 00;
+        OPJ_UINT32 i;
+
+        if (p_cp == 00)
+        {
+                return;
+        }
+        if (p_cp->tcps != 00)
+        {
+                l_current_tile = p_cp->tcps;
+                l_nb_tiles = p_cp->th * p_cp->tw;
+
+                for (i = 0; i < l_nb_tiles; ++i)
+                {
+                        opj_j2k_tcp_destroy(l_current_tile);
+                        ++l_current_tile;
+                }
+                opj_free(p_cp->tcps);
+                p_cp->tcps = 00;
+        }
+        opj_free(p_cp->ppm_buffer);
+        p_cp->ppm_buffer = 00;
+        p_cp->ppm_data = NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */
+        opj_free(p_cp->comment);
+        p_cp->comment = 00;
+        if (! p_cp->m_is_decoder)
+        {
+                opj_free(p_cp->m_specific_param.m_enc.m_matrice);
+                p_cp->m_specific_param.m_enc.m_matrice = 00;
+        }
+}
+
+OPJ_BOOL opj_j2k_read_tile_header(      opj_j2k_t * p_j2k,
+                                                                    OPJ_UINT32 * p_tile_index,
+                                                                    OPJ_UINT32 * p_data_size,
+                                                                    OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
+                                                                    OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
+                                                                    OPJ_UINT32 * p_nb_comps,
+                                                                    OPJ_BOOL * p_go_on,
+                                                                    opj_stream_private_t *p_stream,
+                                                                    opj_event_mgr_t * p_manager )
+{
+        OPJ_UINT32 l_current_marker = J2K_MS_SOT;
+        OPJ_UINT32 l_marker_size;
+        const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
+        opj_tcp_t * l_tcp = NULL;
+        OPJ_UINT32 l_nb_tiles;
+
+        /* preconditions */
+        assert(p_stream != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        /* Reach the End Of Codestream ?*/
+        if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC){
+                l_current_marker = J2K_MS_EOC;
+        }
+        /* We need to encounter a SOT marker (a new tile-part header) */
+        else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT){
+                return OPJ_FALSE;
+        }
+
+        /* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */
+        while ( (!p_j2k->m_specific_param.m_decoder.m_can_decode) && (l_current_marker != J2K_MS_EOC) ) {
+
+                /* Try to read until the Start Of Data is detected */
+                while (l_current_marker != J2K_MS_SOD) {
+                    
+                    if(opj_stream_get_number_byte_left(p_stream) == 0)
+                    {
+                        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+                        break;
+                    }
+
+                        /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
+                        if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+                                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                                return OPJ_FALSE;
+                        }
+
+                        /* Read 2 bytes from the buffer as the marker size */
+                        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);
+
+                        /* cf. https://code.google.com/p/openjpeg/issues/detail?id=226 */
+                        if (l_current_marker == 0x8080 && opj_stream_get_number_byte_left(p_stream) == 0) {
+                                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+                                break;
+                        }
+
+                        /* Why this condition? FIXME */
+                        if (p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_TPH){
+                                p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2);
+                        }
+                        l_marker_size -= 2; /* Subtract the size of the marker ID already read */
+
+                        /* Get the marker handler from the marker ID */
+                        l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
+
+                        /* Check if the marker is known and if it is the right place to find it */
+                        if (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) ) {
+                                opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
+                                return OPJ_FALSE;
+                        }
+/* FIXME manage case of unknown marker as in the main header ? */
+
+                        /* Check if the marker size is compatible with the header data size */
+                        if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
+                                OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
+                                if (! new_header_data) {
+                                        opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
+                                        p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
+                                        p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
+                                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
+                                        return OPJ_FALSE;
+                                }
+                                p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
+                                p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
+                        }
+
+                        /* Try to read the rest of the marker segment from stream and copy them into the buffer */
+                        if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager) != l_marker_size) {
+                                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                                return OPJ_FALSE;
+                        }
+
+                        if (!l_marker_handler->handler) {
+                                /* See issue #175 */
+                                opj_event_msg(p_manager, EVT_ERROR, "Not sure how that happened.\n");
+                                return OPJ_FALSE;
+                        }
+                        /* Read the marker segment with the correct marker handler */
+                        if (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager)) {
+                                opj_event_msg(p_manager, EVT_ERROR, "Fail to read the current marker segment (%#x)\n", l_current_marker);
+                                return OPJ_FALSE;
+                        }
+
+                        /* Add the marker to the codestream index*/
+                        if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
+                                                p_j2k->cstr_index,
+                                                l_marker_handler->id,
+                                                (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
+                                                l_marker_size + 4 )) {
+                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
+                                return OPJ_FALSE;
+                        }
+
+                        /* Keep the position of the last SOT marker read */
+                        if ( l_marker_handler->id == J2K_MS_SOT ) {
+                                OPJ_UINT32 sot_pos = (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4 ;
+                                if (sot_pos > p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos)
+                                {
+                                        p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = sot_pos;
+                                }
+                        }
+
+                        if (p_j2k->m_specific_param.m_decoder.m_skip_data) {
+                                /* Skip the rest of the tile part header*/
+                                if (opj_stream_skip(p_stream,p_j2k->m_specific_param.m_decoder.m_sot_length,p_manager) != p_j2k->m_specific_param.m_decoder.m_sot_length) {
+                                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                                        return OPJ_FALSE;
+                                }
+                                l_current_marker = J2K_MS_SOD; /* Normally we reached a SOD */
+                        }
+                        else {
+                                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
+                                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+                                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                                        return OPJ_FALSE;
+                                }
+                                /* Read 2 bytes from the buffer as the new marker ID */
+                                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
+                        }
+                }
+                if(opj_stream_get_number_byte_left(p_stream) == 0
+                    && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC)
+                    break;
+
+                /* If we didn't skip data before, we need to read the SOD marker*/
+                if (! p_j2k->m_specific_param.m_decoder.m_skip_data) {
+                        /* Try to read the SOD marker and skip data ? FIXME */
+                        if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) {
+                                return OPJ_FALSE;
+                        }
+
+                        if (! p_j2k->m_specific_param.m_decoder.m_can_decode){
+                                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
+							while(1)  //liang
+							{
+                                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+                                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                                        return OPJ_FALSE;
+                                }
+
+                                /* Read 2 bytes from buffer as the new marker ID */
+                                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
+								if((l_current_marker & 0xff00) == 0xff00) break;
+							}
+                        }
+                }
+                else {
+                        /* Indicate we will try to read a new tile-part header*/
+                        p_j2k->m_specific_param.m_decoder.m_skip_data = 0;
+                        p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
+                        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+
+                        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
+                        if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+                                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                                return OPJ_FALSE;
+                        }
+
+                        /* Read 2 bytes from buffer as the new marker ID */
+                        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
+                }
+        }
+
+        /* Current marker is the EOC marker ?*/
+        if (l_current_marker == J2K_MS_EOC) {
+                if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC ){
+                        p_j2k->m_current_tile_number = 0;
+                        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
+                }
+        }
+
+        /* FIXME DOC ???*/
+        if ( ! p_j2k->m_specific_param.m_decoder.m_can_decode) {
+                l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
+                l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+
+                while( (p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00) ) {
+                        ++p_j2k->m_current_tile_number;
+                        ++l_tcp;
+                }
+
+                if (p_j2k->m_current_tile_number == l_nb_tiles) {
+                        *p_go_on = OPJ_FALSE;
+                        return OPJ_TRUE;
+                }
+        }
+
+        /*FIXME ???*/
+        if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
+                return OPJ_FALSE;
+        }
+
+        opj_event_msg(p_manager, EVT_INFO, "Header of tile %d / %d has been read.\n",
+                        p_j2k->m_current_tile_number, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);
+
+        *p_tile_index = p_j2k->m_current_tile_number;
+        *p_go_on = OPJ_TRUE;
+        *p_data_size = opj_tcd_get_decoded_tile_size(p_j2k->m_tcd);
+        *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;
+        *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;
+        *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
+        *p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
+        *p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
+
+         p_j2k->m_specific_param.m_decoder.m_state |= 0x0080;/* FIXME J2K_DEC_STATE_DATA;*/
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_decode_tile (  opj_j2k_t * p_j2k,
+                                                        OPJ_UINT32 p_tile_index,
+                                                        OPJ_BYTE * p_data,
+                                                        OPJ_UINT32 p_data_size,
+                                                        opj_stream_private_t *p_stream,
+                                                        opj_event_mgr_t * p_manager )
+{
+        OPJ_UINT32 l_current_marker;
+        OPJ_BYTE l_data [2];
+        opj_tcp_t * l_tcp;
+
+        /* preconditions */
+        assert(p_stream != 00);
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+
+        if ( !(p_j2k->m_specific_param.m_decoder.m_state & 0x0080/*FIXME J2K_DEC_STATE_DATA*/)
+                || (p_tile_index != p_j2k->m_current_tile_number) ) {
+                return OPJ_FALSE;
+        }
+
+        l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
+        if (! l_tcp->m_data) {
+                opj_j2k_tcp_destroy(l_tcp);
+                return OPJ_FALSE;
+        }
+
+        if (! opj_tcd_decode_tile(      p_j2k->m_tcd,
+                                                                l_tcp->m_data,
+                                                                l_tcp->m_data_size,
+                                                                p_tile_index,
+                                                                p_j2k->cstr_index) ) {
+                opj_j2k_tcp_destroy(l_tcp);
+                p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/*FIXME J2K_DEC_STATE_ERR;*/
+                opj_event_msg(p_manager, EVT_ERROR, "Failed to decode.\n");
+                return OPJ_FALSE;
+        }
+
+        if (! opj_tcd_update_tile_data(p_j2k->m_tcd,p_data,p_data_size)) {
+                return OPJ_FALSE;
+        }
+
+        /* To avoid to destroy the tcp which can be useful when we try to decode a tile decoded before (cf j2k_random_tile_access)
+         * we destroy just the data which will be re-read in read_tile_header*/
+        /*opj_j2k_tcp_destroy(l_tcp);
+        p_j2k->m_tcd->tcp = 0;*/
+        opj_j2k_tcp_data_destroy(l_tcp);
+
+        p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
+        p_j2k->m_specific_param.m_decoder.m_state &= (~ (0x0080u));/* FIXME J2K_DEC_STATE_DATA);*/
+
+        if(opj_stream_get_number_byte_left(p_stream) == 0 
+            && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC){
+            return OPJ_TRUE;
+        }
+
+        if (p_j2k->m_specific_param.m_decoder.m_state != 0x0100){ /*FIXME J2K_DEC_STATE_EOC)*/
+                if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                        return OPJ_FALSE;
+                }
+
+                opj_read_bytes(l_data,&l_current_marker,2);
+
+                if (l_current_marker == J2K_MS_EOC) {
+                        p_j2k->m_current_tile_number = 0;
+                        p_j2k->m_specific_param.m_decoder.m_state =  0x0100;/*FIXME J2K_DEC_STATE_EOC;*/
+                }
+                else if (l_current_marker != J2K_MS_SOT)
+                {
+                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
+                        
+                        if(opj_stream_get_number_byte_left(p_stream) == 0) {
+                            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+                            return OPJ_TRUE;
+                        }
+                        return OPJ_FALSE;
+                }
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image)
+{
+        OPJ_UINT32 i,j,k = 0;
+        OPJ_UINT32 l_width_src,l_height_src;
+        OPJ_UINT32 l_width_dest,l_height_dest;
+        OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src;
+        OPJ_INT32 l_start_offset_src, l_line_offset_src, l_end_offset_src ;
+        OPJ_UINT32 l_start_x_dest , l_start_y_dest;
+        OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest;
+        OPJ_INT32 l_start_offset_dest, l_line_offset_dest;
+
+        opj_image_comp_t * l_img_comp_src = 00;
+        opj_image_comp_t * l_img_comp_dest = 00;
+
+        opj_tcd_tilecomp_t * l_tilec = 00;
+        opj_image_t * l_image_src = 00;
+        OPJ_UINT32 l_size_comp, l_remaining;
+        OPJ_INT32 * l_dest_ptr;
+        opj_tcd_resolution_t* l_res= 00;
+
+        l_tilec = p_tcd->tcd_image->tiles->comps;
+        l_image_src = p_tcd->image;
+        l_img_comp_src = l_image_src->comps;
+
+        l_img_comp_dest = p_output_image->comps;
+
+        for (i=0; i<l_image_src->numcomps; i++) {
+
+                /* Allocate output component buffer if necessary */
+                if (!l_img_comp_dest->data) {
+
+                        l_img_comp_dest->data = (OPJ_INT32*) opj_calloc(l_img_comp_dest->w * l_img_comp_dest->h, sizeof(OPJ_INT32));
+                        if (! l_img_comp_dest->data) {
+                                return OPJ_FALSE;
+                        }
+                }
+
+                /* Copy info from decoded comp image to output image */
+                l_img_comp_dest->resno_decoded = l_img_comp_src->resno_decoded;
+
+                /*-----*/
+                /* Compute the precision of the output buffer */
+                l_size_comp = l_img_comp_src->prec >> 3; /*(/ 8)*/
+                l_remaining = l_img_comp_src->prec & 7;  /* (%8) */
+                l_res = l_tilec->resolutions + l_img_comp_src->resno_decoded;
+
+                if (l_remaining) {
+                        ++l_size_comp;
+                }
+
+                if (l_size_comp == 3) {
+                        l_size_comp = 4;
+                }
+                /*-----*/
+
+                /* Current tile component size*/
+                /*if (i == 0) {
+                fprintf(stdout, "SRC: l_res_x0=%d, l_res_x1=%d, l_res_y0=%d, l_res_y1=%d\n",
+                                l_res->x0, l_res->x1, l_res->y0, l_res->y1);
+                }*/
+
+                l_width_src = (OPJ_UINT32)(l_res->x1 - l_res->x0);
+                l_height_src = (OPJ_UINT32)(l_res->y1 - l_res->y0);
+
+                /* Border of the current output component*/
+                l_x0_dest = (OPJ_UINT32)opj_int_ceildivpow2((OPJ_INT32)l_img_comp_dest->x0, (OPJ_INT32)l_img_comp_dest->factor);
+                l_y0_dest = (OPJ_UINT32)opj_int_ceildivpow2((OPJ_INT32)l_img_comp_dest->y0, (OPJ_INT32)l_img_comp_dest->factor);
+                l_x1_dest = l_x0_dest + l_img_comp_dest->w;
+                l_y1_dest = l_y0_dest + l_img_comp_dest->h;
+
+                /*if (i == 0) {
+                fprintf(stdout, "DEST: l_x0_dest=%d, l_x1_dest=%d, l_y0_dest=%d, l_y1_dest=%d (%d)\n",
+                                l_x0_dest, l_x1_dest, l_y0_dest, l_y1_dest, l_img_comp_dest->factor );
+                }*/
+
+                /*-----*/
+                /* Compute the area (l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src)
+                 * of the input buffer (decoded tile component) which will be move
+                 * in the output buffer. Compute the area of the output buffer (l_start_x_dest,
+                 * l_start_y_dest, l_width_dest, l_height_dest)  which will be modified
+                 * by this input area.
+                 * */
+                assert( l_res->x0 >= 0);
+                assert( l_res->x1 >= 0);
+                if ( l_x0_dest < (OPJ_UINT32)l_res->x0 ) {
+                        l_start_x_dest = (OPJ_UINT32)l_res->x0 - l_x0_dest;
+                        l_offset_x0_src = 0;
+
+                        if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) {
+                                l_width_dest = l_width_src;
+                                l_offset_x1_src = 0;
+                        }
+                        else {
+                                l_width_dest = l_x1_dest - (OPJ_UINT32)l_res->x0 ;
+                                l_offset_x1_src = (OPJ_INT32)(l_width_src - l_width_dest);
+                        }
+                }
+                else {
+                        l_start_x_dest = 0 ;
+                        l_offset_x0_src = (OPJ_INT32)l_x0_dest - l_res->x0;
+
+                        if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) {
+                                l_width_dest = l_width_src - (OPJ_UINT32)l_offset_x0_src;
+                                l_offset_x1_src = 0;
+                        }
+                        else {
+                                l_width_dest = l_img_comp_dest->w ;
+                                l_offset_x1_src = l_res->x1 - (OPJ_INT32)l_x1_dest;
+                        }
+                }
+
+                if ( l_y0_dest < (OPJ_UINT32)l_res->y0 ) {
+                        l_start_y_dest = (OPJ_UINT32)l_res->y0 - l_y0_dest;
+                        l_offset_y0_src = 0;
+
+                        if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) {
+                                l_height_dest = l_height_src;
+                                l_offset_y1_src = 0;
+                        }
+                        else {
+                                l_height_dest = l_y1_dest - (OPJ_UINT32)l_res->y0 ;
+                                l_offset_y1_src =  (OPJ_INT32)(l_height_src - l_height_dest);
+                        }
+                }
+                else {
+                        l_start_y_dest = 0 ;
+                        l_offset_y0_src = (OPJ_INT32)l_y0_dest - l_res->y0;
+
+                        if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) {
+                                l_height_dest = l_height_src - (OPJ_UINT32)l_offset_y0_src;
+                                l_offset_y1_src = 0;
+                        }
+                        else {
+                                l_height_dest = l_img_comp_dest->h ;
+                                l_offset_y1_src = l_res->y1 - (OPJ_INT32)l_y1_dest;
+                        }
+                }
+
+                if( (l_offset_x0_src < 0 ) || (l_offset_y0_src < 0 ) || (l_offset_x1_src < 0 ) || (l_offset_y1_src < 0 ) ){
+                        return OPJ_FALSE;
+                }
+                /* testcase 2977.pdf.asan.67.2198 */
+                if ((OPJ_INT32)l_width_dest < 0 || (OPJ_INT32)l_height_dest < 0) {
+                        return OPJ_FALSE;
+                }
+                /*-----*/
+
+                /* Compute the input buffer offset */
+                l_start_offset_src = l_offset_x0_src + l_offset_y0_src * (OPJ_INT32)l_width_src;
+                l_line_offset_src = l_offset_x1_src + l_offset_x0_src;
+                l_end_offset_src = l_offset_y1_src * (OPJ_INT32)l_width_src - l_offset_x0_src;
+
+                /* Compute the output buffer offset */
+                l_start_offset_dest = (OPJ_INT32)(l_start_x_dest + l_start_y_dest * l_img_comp_dest->w);
+                l_line_offset_dest = (OPJ_INT32)(l_img_comp_dest->w - l_width_dest);
+
+                /* Move the output buffer to the first place where we will write*/
+                l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest;
+
+                /*if (i == 0) {
+                        fprintf(stdout, "COMPO[%d]:\n",i);
+                        fprintf(stdout, "SRC: l_start_x_src=%d, l_start_y_src=%d, l_width_src=%d, l_height_src=%d\n"
+                                        "\t tile offset:%d, %d, %d, %d\n"
+                                        "\t buffer offset: %d; %d, %d\n",
+                                        l_res->x0, l_res->y0, l_width_src, l_height_src,
+                                        l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src,
+                                        l_start_offset_src, l_line_offset_src, l_end_offset_src);
+
+                        fprintf(stdout, "DEST: l_start_x_dest=%d, l_start_y_dest=%d, l_width_dest=%d, l_height_dest=%d\n"
+                                        "\t start offset: %d, line offset= %d\n",
+                                        l_start_x_dest, l_start_y_dest, l_width_dest, l_height_dest, l_start_offset_dest, l_line_offset_dest);
+                }*/
+
+                switch (l_size_comp) {
+                        case 1:
+                                {
+                                        OPJ_CHAR * l_src_ptr = (OPJ_CHAR*) p_data;
+                                        l_src_ptr += l_start_offset_src; /* Move to the first place where we will read*/
+
+                                        if (l_img_comp_src->sgnd) {
+                                                for (j = 0 ; j < l_height_dest ; ++j) {
+                                                        for ( k = 0 ; k < l_width_dest ; ++k) {
+                                                                *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++)); /* Copy only the data needed for the output image */
+                                                        }
+
+                                                        l_dest_ptr+= l_line_offset_dest; /* Move to the next place where we will write */
+                                                        l_src_ptr += l_line_offset_src ; /* Move to the next place where we will read */
+                                                }
+                                        }
+                                        else {
+                                                for ( j = 0 ; j < l_height_dest ; ++j ) {
+                                                        for ( k = 0 ; k < l_width_dest ; ++k) {
+                                                                *(l_dest_ptr++) = (OPJ_INT32) ((*(l_src_ptr++))&0xff);
+                                                        }
+
+                                                        l_dest_ptr+= l_line_offset_dest;
+                                                        l_src_ptr += l_line_offset_src;
+                                                }
+                                        }
+
+                                        l_src_ptr += l_end_offset_src; /* Move to the end of this component-part of the input buffer */
+                                        p_data = (OPJ_BYTE*) l_src_ptr; /* Keep the current position for the next component-part */
+                                }
+                                break;
+                        case 2:
+                                {
+                                        OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_data;
+                                        l_src_ptr += l_start_offset_src;
+
+                                        if (l_img_comp_src->sgnd) {
+                                                for (j=0;j<l_height_dest;++j) {
+                                                        for (k=0;k<l_width_dest;++k) {
+                                                                *(l_dest_ptr++) = *(l_src_ptr++);
+                                                        }
+
+                                                        l_dest_ptr+= l_line_offset_dest;
+                                                        l_src_ptr += l_line_offset_src ;
+                                                }
+                                        }
+                                        else {
+                                                for (j=0;j<l_height_dest;++j) {
+                                                        for (k=0;k<l_width_dest;++k) {
+                                                                *(l_dest_ptr++) = (*(l_src_ptr++))&0xffff;
+                                                        }
+
+                                                        l_dest_ptr+= l_line_offset_dest;
+                                                        l_src_ptr += l_line_offset_src ;
+                                                }
+                                        }
+
+                                        l_src_ptr += l_end_offset_src;
+                                        p_data = (OPJ_BYTE*) l_src_ptr;
+                                }
+                                break;
+                        case 4:
+                                {
+                                        OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_data;
+                                        l_src_ptr += l_start_offset_src;
+
+                                        for (j=0;j<l_height_dest;++j) {
+                                                for (k=0;k<l_width_dest;++k) {
+                                                        *(l_dest_ptr++) = (*(l_src_ptr++));
+                                                }
+
+                                                l_dest_ptr+= l_line_offset_dest;
+                                                l_src_ptr += l_line_offset_src ;
+                                        }
+
+                                        l_src_ptr += l_end_offset_src;
+                                        p_data = (OPJ_BYTE*) l_src_ptr;
+                                }
+                                break;
+                }
+
+                ++l_img_comp_dest;
+                ++l_img_comp_src;
+                ++l_tilec;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_set_decode_area(       opj_j2k_t *p_j2k,
+                                                                    opj_image_t* p_image,
+                                                                    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+                                                                    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
+                                                                    opj_event_mgr_t * p_manager )
+{
+        opj_cp_t * l_cp = &(p_j2k->m_cp);
+        opj_image_t * l_image = p_j2k->m_private_image;
+
+        OPJ_UINT32 it_comp;
+        OPJ_INT32 l_comp_x1, l_comp_y1;
+        opj_image_comp_t* l_img_comp = NULL;
+
+        /* Check if we are read the main header */
+        if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) { /* FIXME J2K_DEC_STATE_TPHSOT)*/
+                opj_event_msg(p_manager, EVT_ERROR, "Need to decode the main header before begin to decode the remaining codestream");
+                return OPJ_FALSE;
+        }
+
+        if ( !p_start_x && !p_start_y && !p_end_x && !p_end_y){
+                opj_event_msg(p_manager, EVT_INFO, "No decoded area parameters, set the decoded area to the whole image\n");
+
+                p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
+                p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
+                p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
+                p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
+
+                return OPJ_TRUE;
+        }
+
+        /* ----- */
+        /* Check if the positions provided by the user are correct */
+
+        /* Left */
+        assert(p_start_x >= 0 );
+        assert(p_start_y >= 0 );
+
+        if ((OPJ_UINT32)p_start_x > l_image->x1 ) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                        "Left position of the decoded area (region_x0=%d) is outside the image area (Xsiz=%d).\n",
+                        p_start_x, l_image->x1);
+                return OPJ_FALSE;
+        }
+        else if ((OPJ_UINT32)p_start_x < l_image->x0){
+                opj_event_msg(p_manager, EVT_WARNING,
+                                "Left position of the decoded area (region_x0=%d) is outside the image area (XOsiz=%d).\n",
+                                p_start_x, l_image->x0);
+                p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
+                p_image->x0 = l_image->x0;
+        }
+        else {
+                p_j2k->m_specific_param.m_decoder.m_start_tile_x = ((OPJ_UINT32)p_start_x - l_cp->tx0) / l_cp->tdx;
+                p_image->x0 = (OPJ_UINT32)p_start_x;
+        }
+
+        /* Up */
+        if ((OPJ_UINT32)p_start_y > l_image->y1){
+                opj_event_msg(p_manager, EVT_ERROR,
+                                "Up position of the decoded area (region_y0=%d) is outside the image area (Ysiz=%d).\n",
+                                p_start_y, l_image->y1);
+                return OPJ_FALSE;
+        }
+        else if ((OPJ_UINT32)p_start_y < l_image->y0){
+                opj_event_msg(p_manager, EVT_WARNING,
+                                "Up position of the decoded area (region_y0=%d) is outside the image area (YOsiz=%d).\n",
+                                p_start_y, l_image->y0);
+                p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
+                p_image->y0 = l_image->y0;
+        }
+        else {
+                p_j2k->m_specific_param.m_decoder.m_start_tile_y = ((OPJ_UINT32)p_start_y - l_cp->ty0) / l_cp->tdy;
+                p_image->y0 = (OPJ_UINT32)p_start_y;
+        }
+
+        /* Right */
+        assert((OPJ_UINT32)p_end_x > 0);
+        assert((OPJ_UINT32)p_end_y > 0);
+        if ((OPJ_UINT32)p_end_x < l_image->x0) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                        "Right position of the decoded area (region_x1=%d) is outside the image area (XOsiz=%d).\n",
+                        p_end_x, l_image->x0);
+                return OPJ_FALSE;
+        }
+        else if ((OPJ_UINT32)p_end_x > l_image->x1) {
+                opj_event_msg(p_manager, EVT_WARNING,
+                        "Right position of the decoded area (region_x1=%d) is outside the image area (Xsiz=%d).\n",
+                        p_end_x, l_image->x1);
+                p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
+                p_image->x1 = l_image->x1;
+        }
+        else {
+                p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv(p_end_x - (OPJ_INT32)l_cp->tx0, (OPJ_INT32)l_cp->tdx);
+                p_image->x1 = (OPJ_UINT32)p_end_x;
+        }
+
+        /* Bottom */
+        if ((OPJ_UINT32)p_end_y < l_image->y0) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                        "Bottom position of the decoded area (region_y1=%d) is outside the image area (YOsiz=%d).\n",
+                        p_end_y, l_image->y0);
+                return OPJ_FALSE;
+        }
+        if ((OPJ_UINT32)p_end_y > l_image->y1){
+                opj_event_msg(p_manager, EVT_WARNING,
+                        "Bottom position of the decoded area (region_y1=%d) is outside the image area (Ysiz=%d).\n",
+                        p_end_y, l_image->y1);
+                p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
+                p_image->y1 = l_image->y1;
+        }
+        else{
+                p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv(p_end_y - (OPJ_INT32)l_cp->ty0, (OPJ_INT32)l_cp->tdy);
+                p_image->y1 = (OPJ_UINT32)p_end_y;
+        }
+        /* ----- */
+
+        p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1;
+
+        l_img_comp = p_image->comps;
+        for (it_comp=0; it_comp < p_image->numcomps; ++it_comp)
+        {
+                OPJ_INT32 l_h,l_w;
+
+                l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0, (OPJ_INT32)l_img_comp->dx);
+                l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0, (OPJ_INT32)l_img_comp->dy);
+                l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
+                l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
+
+                l_w = opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor)
+                                - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor);
+                if (l_w < 0){
+                        opj_event_msg(p_manager, EVT_ERROR,
+                                "Size x of the decoded component image is incorrect (comp[%d].w=%d).\n",
+                                it_comp, l_w);
+                        return OPJ_FALSE;
+                }
+                l_img_comp->w = (OPJ_UINT32)l_w;
+
+                l_h = opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor)
+                                - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor);
+                if (l_h < 0){
+                        opj_event_msg(p_manager, EVT_ERROR,
+                                "Size y of the decoded component image is incorrect (comp[%d].h=%d).\n",
+                                it_comp, l_h);
+                        return OPJ_FALSE;
+                }
+                l_img_comp->h = (OPJ_UINT32)l_h;
+
+                l_img_comp++;
+        }
+
+        opj_event_msg( p_manager, EVT_INFO,"Setting decoding area to %d,%d,%d,%d\n",
+                        p_image->x0, p_image->y0, p_image->x1, p_image->y1);
+
+        return OPJ_TRUE;
+}
+
+opj_j2k_t* opj_j2k_create_decompress(void)
+{
+        opj_j2k_t *l_j2k = (opj_j2k_t*) opj_malloc(sizeof(opj_j2k_t));
+        if (!l_j2k) {
+                return 00;
+        }
+        memset(l_j2k,0,sizeof(opj_j2k_t));
+
+        l_j2k->m_is_decoder = 1;
+        l_j2k->m_cp.m_is_decoder = 1;
+
+        l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_malloc(sizeof(opj_tcp_t));
+        if (!l_j2k->m_specific_param.m_decoder.m_default_tcp) {
+                opj_j2k_destroy(l_j2k);
+                return 00;
+        }
+        memset(l_j2k->m_specific_param.m_decoder.m_default_tcp,0,sizeof(opj_tcp_t));
+
+        l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_malloc(OPJ_J2K_DEFAULT_HEADER_SIZE);
+        if (! l_j2k->m_specific_param.m_decoder.m_header_data) {
+                opj_j2k_destroy(l_j2k);
+                return 00;
+        }
+
+        l_j2k->m_specific_param.m_decoder.m_header_data_size = OPJ_J2K_DEFAULT_HEADER_SIZE;
+
+        l_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = -1 ;
+
+        l_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = 0 ;
+
+        /* codestream index creation */
+        l_j2k->cstr_index = opj_j2k_create_cstr_index();
+
+                        /*(opj_codestream_index_t*) opj_malloc(sizeof(opj_codestream_index_t));
+        if (!l_j2k->cstr_index){
+                opj_j2k_destroy(l_j2k);
+                return NULL;
+        }
+
+        l_j2k->cstr_index->marker = (opj_marker_info_t*) opj_malloc(100 * sizeof(opj_marker_info_t));
+*/
+
+        /* validation list creation */
+        l_j2k->m_validation_list = opj_procedure_list_create();
+        if (! l_j2k->m_validation_list) {
+                opj_j2k_destroy(l_j2k);
+                return 00;
+        }
+
+        /* execution list creation */
+        l_j2k->m_procedure_list = opj_procedure_list_create();
+        if (! l_j2k->m_procedure_list) {
+                opj_j2k_destroy(l_j2k);
+                return 00;
+        }
+
+        return l_j2k;
+}
+
+opj_codestream_index_t* opj_j2k_create_cstr_index(void)
+{
+        opj_codestream_index_t* cstr_index = (opj_codestream_index_t*)
+                        opj_calloc(1,sizeof(opj_codestream_index_t));
+        if (!cstr_index)
+                return NULL;
+
+        cstr_index->maxmarknum = 100;
+        cstr_index->marknum = 0;
+        cstr_index->marker = (opj_marker_info_t*)
+                        opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t));
+        if (!cstr_index-> marker)
+                return NULL;
+
+        cstr_index->tile_index = NULL;
+
+        return cstr_index;
+}
+
+OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size (       opj_j2k_t *p_j2k,
+                                                                                OPJ_UINT32 p_tile_no,
+                                                                                OPJ_UINT32 p_comp_no )
+{
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        opj_tccp_t *l_tccp = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = &l_cp->tcps[p_tile_no];
+        l_tccp = &l_tcp->tccps[p_comp_no];
+
+        /* preconditions again */
+        assert(p_tile_no < (l_cp->tw * l_cp->th));
+        assert(p_comp_no < p_j2k->m_private_image->numcomps);
+
+        if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
+                return 5 + l_tccp->numresolutions;
+        }
+        else {
+                return 5;
+        }
+}
+
+OPJ_BOOL opj_j2k_write_SPCod_SPCoc(     opj_j2k_t *p_j2k,
+                                                                    OPJ_UINT32 p_tile_no,
+                                                                    OPJ_UINT32 p_comp_no,
+                                                                    OPJ_BYTE * p_data,
+                                                                    OPJ_UINT32 * p_header_size,
+                                                                    struct opj_event_mgr * p_manager )
+{
+        OPJ_UINT32 i;
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        opj_tccp_t *l_tccp = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_header_size != 00);
+        assert(p_manager != 00);
+        assert(p_data != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = &l_cp->tcps[p_tile_no];
+        l_tccp = &l_tcp->tccps[p_comp_no];
+
+        /* preconditions again */
+        assert(p_tile_no < (l_cp->tw * l_cp->th));
+        assert(p_comp_no <(p_j2k->m_private_image->numcomps));
+
+        if (*p_header_size < 5) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
+                return OPJ_FALSE;
+        }
+
+        opj_write_bytes(p_data,l_tccp->numresolutions - 1, 1);  /* SPcoc (D) */
+        ++p_data;
+
+        opj_write_bytes(p_data,l_tccp->cblkw - 2, 1);                   /* SPcoc (E) */
+        ++p_data;
+
+        opj_write_bytes(p_data,l_tccp->cblkh - 2, 1);                   /* SPcoc (F) */
+        ++p_data;
+
+        opj_write_bytes(p_data,l_tccp->cblksty, 1);                             /* SPcoc (G) */
+        ++p_data;
+
+        opj_write_bytes(p_data,l_tccp->qmfbid, 1);                              /* SPcoc (H) */
+        ++p_data;
+
+        *p_header_size = *p_header_size - 5;
+
+        if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
+
+                if (*p_header_size < l_tccp->numresolutions) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
+                        return OPJ_FALSE;
+                }
+
+                for (i = 0; i < l_tccp->numresolutions; ++i) {
+                        opj_write_bytes(p_data,l_tccp->prcw[i] + (l_tccp->prch[i] << 4), 1);    /* SPcoc (I_i) */
+                        ++p_data;
+                }
+
+                *p_header_size = *p_header_size - l_tccp->numresolutions;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_SPCod_SPCoc(  opj_j2k_t *p_j2k,
+                                                                OPJ_UINT32 compno,
+                                                                OPJ_BYTE * p_header_data,
+                                                                OPJ_UINT32 * p_header_size,
+                                                                opj_event_mgr_t * p_manager)
+{
+        OPJ_UINT32 i, l_tmp;
+        opj_cp_t *l_cp = NULL;
+        opj_tcp_t *l_tcp = NULL;
+        opj_tccp_t *l_tccp = NULL;
+        OPJ_BYTE * l_current_ptr = NULL;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_header_data != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
+                                &l_cp->tcps[p_j2k->m_current_tile_number] :
+                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+        /* precondition again */
+        assert(compno < p_j2k->m_private_image->numcomps);
+
+        l_tccp = &l_tcp->tccps[compno];
+        l_current_ptr = p_header_data;
+
+        /* make sure room is sufficient */
+        if (*p_header_size < 5) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
+                return OPJ_FALSE;
+        }
+
+        opj_read_bytes(l_current_ptr, &l_tccp->numresolutions ,1);              /* SPcox (D) */
+        ++l_tccp->numresolutions;                                                                               /* tccp->numresolutions = read() + 1 */
+        if (l_tccp->numresolutions > OPJ_J2K_MAXRLVLS) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Invalid value for numresolutions : %d, max value is set in openjpeg.h at %d\n",
+                              l_tccp->numresolutions, OPJ_J2K_MAXRLVLS);
+                return OPJ_FALSE;
+        }
+        ++l_current_ptr;
+
+        /* If user wants to remove more resolutions than the codestream contains, return error */
+        if (l_cp->m_specific_param.m_dec.m_reduce >= l_tccp->numresolutions) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number "
+                                        "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno);
+                p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/* FIXME J2K_DEC_STATE_ERR;*/
+                return OPJ_FALSE;
+        }
+
+        opj_read_bytes(l_current_ptr,&l_tccp->cblkw ,1);                /* SPcoc (E) */
+        ++l_current_ptr;
+        l_tccp->cblkw += 2;
+
+        opj_read_bytes(l_current_ptr,&l_tccp->cblkh ,1);                /* SPcoc (F) */
+        ++l_current_ptr;
+        l_tccp->cblkh += 2;
+
+        opj_read_bytes(l_current_ptr,&l_tccp->cblksty ,1);              /* SPcoc (G) */
+        ++l_current_ptr;
+
+        opj_read_bytes(l_current_ptr,&l_tccp->qmfbid ,1);               /* SPcoc (H) */
+        ++l_current_ptr;
+
+        *p_header_size = *p_header_size - 5;
+
+        /* use custom precinct size ? */
+        if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
+                if (*p_header_size < l_tccp->numresolutions) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
+                        return OPJ_FALSE;
+                }
+
+                for     (i = 0; i < l_tccp->numresolutions; ++i) {
+                        opj_read_bytes(l_current_ptr,&l_tmp ,1);                /* SPcoc (I_i) */
+                        ++l_current_ptr;
+                        l_tccp->prcw[i] = l_tmp & 0xf;
+                        l_tccp->prch[i] = l_tmp >> 4;
+                }
+
+                *p_header_size = *p_header_size - l_tccp->numresolutions;
+        }
+        else {
+                /* set default size for the precinct width and height */
+                for     (i = 0; i < l_tccp->numresolutions; ++i) {
+                        l_tccp->prcw[i] = 15;
+                        l_tccp->prch[i] = 15;
+                }
+        }
+
+#ifdef WIP_REMOVE_MSD
+        /* INDEX >> */
+        if (p_j2k->cstr_info && compno == 0) {
+                OPJ_UINT32 l_data_size = l_tccp->numresolutions * sizeof(OPJ_UINT32);
+
+                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkh = l_tccp->cblkh;
+                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkw = l_tccp->cblkw;
+                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].numresolutions = l_tccp->numresolutions;
+                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblksty = l_tccp->cblksty;
+                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].qmfbid = l_tccp->qmfbid;
+
+                memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdx,l_tccp->prcw, l_data_size);
+                memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdy,l_tccp->prch, l_data_size);
+        }
+        /* << INDEX */
+#endif
+
+        return OPJ_TRUE;
+}
+
+void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k )
+{
+        /* loop */
+        OPJ_UINT32 i;
+        opj_cp_t *l_cp = NULL;
+        opj_tcp_t *l_tcp = NULL;
+        opj_tccp_t *l_ref_tccp = NULL, *l_copied_tccp = NULL;
+        OPJ_UINT32 l_prc_size;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? /* FIXME J2K_DEC_STATE_TPH*/
+                                &l_cp->tcps[p_j2k->m_current_tile_number] :
+                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+        l_ref_tccp = &l_tcp->tccps[0];
+        l_copied_tccp = l_ref_tccp + 1;
+        l_prc_size = l_ref_tccp->numresolutions * (OPJ_UINT32)sizeof(OPJ_UINT32);
+
+        for     (i=1; i<p_j2k->m_private_image->numcomps; ++i) {
+                l_copied_tccp->numresolutions = l_ref_tccp->numresolutions;
+                l_copied_tccp->cblkw = l_ref_tccp->cblkw;
+                l_copied_tccp->cblkh = l_ref_tccp->cblkh;
+                l_copied_tccp->cblksty = l_ref_tccp->cblksty;
+                l_copied_tccp->qmfbid = l_ref_tccp->qmfbid;
+                memcpy(l_copied_tccp->prcw,l_ref_tccp->prcw,l_prc_size);
+                memcpy(l_copied_tccp->prch,l_ref_tccp->prch,l_prc_size);
+                ++l_copied_tccp;
+        }
+}
+
+OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size ( opj_j2k_t *p_j2k,
+                                                                        OPJ_UINT32 p_tile_no,
+                                                                        OPJ_UINT32 p_comp_no )
+{
+        OPJ_UINT32 l_num_bands;
+
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        opj_tccp_t *l_tccp = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = &l_cp->tcps[p_tile_no];
+        l_tccp = &l_tcp->tccps[p_comp_no];
+
+        /* preconditions again */
+        assert(p_tile_no < l_cp->tw * l_cp->th);
+        assert(p_comp_no < p_j2k->m_private_image->numcomps);
+
+        l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2);
+
+        if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
+                return 1 + l_num_bands;
+        }
+        else {
+                return 1 + 2*l_num_bands;
+        }
+}
+
+OPJ_BOOL opj_j2k_write_SQcd_SQcc(       opj_j2k_t *p_j2k,
+                                                                OPJ_UINT32 p_tile_no,
+                                                                OPJ_UINT32 p_comp_no,
+                                                                OPJ_BYTE * p_data,
+                                                                OPJ_UINT32 * p_header_size,
+                                                                struct opj_event_mgr * p_manager )
+{
+        OPJ_UINT32 l_header_size;
+        OPJ_UINT32 l_band_no, l_num_bands;
+        OPJ_UINT32 l_expn,l_mant;
+
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        opj_tccp_t *l_tccp = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_header_size != 00);
+        assert(p_manager != 00);
+        assert(p_data != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = &l_cp->tcps[p_tile_no];
+        l_tccp = &l_tcp->tccps[p_comp_no];
+
+        /* preconditions again */
+        assert(p_tile_no < l_cp->tw * l_cp->th);
+        assert(p_comp_no <p_j2k->m_private_image->numcomps);
+
+        l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2);
+
+        if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
+                l_header_size = 1 + l_num_bands;
+
+                if (*p_header_size < l_header_size) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
+                        return OPJ_FALSE;
+                }
+
+                opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1);    /* Sqcx */
+                ++p_data;
+
+                for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
+                        l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
+                        opj_write_bytes(p_data, l_expn << 3, 1);        /* SPqcx_i */
+                        ++p_data;
+                }
+        }
+        else {
+                l_header_size = 1 + 2*l_num_bands;
+
+                if (*p_header_size < l_header_size) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
+                        return OPJ_FALSE;
+                }
+
+                opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1);    /* Sqcx */
+                ++p_data;
+
+                for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
+                        l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
+                        l_mant = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].mant;
+
+                        opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2);    /* SPqcx_i */
+                        p_data += 2;
+                }
+        }
+
+        *p_header_size = *p_header_size - l_header_size;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
+                                                            OPJ_UINT32 p_comp_no,
+                                                            OPJ_BYTE* p_header_data,
+                                                            OPJ_UINT32 * p_header_size,
+                                                            opj_event_mgr_t * p_manager
+                                                            )
+{
+        /* loop*/
+        OPJ_UINT32 l_band_no;
+        opj_cp_t *l_cp = 00;
+        opj_tcp_t *l_tcp = 00;
+        opj_tccp_t *l_tccp = 00;
+        OPJ_BYTE * l_current_ptr = 00;
+        OPJ_UINT32 l_tmp, l_num_band;
+
+        /* preconditions*/
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_header_data != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        /* come from tile part header or main header ?*/
+        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? /*FIXME J2K_DEC_STATE_TPH*/
+                                &l_cp->tcps[p_j2k->m_current_tile_number] :
+                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+        /* precondition again*/
+        assert(p_comp_no <  p_j2k->m_private_image->numcomps);
+
+        l_tccp = &l_tcp->tccps[p_comp_no];
+        l_current_ptr = p_header_data;
+
+        if (*p_header_size < 1) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading SQcd or SQcc element\n");
+                return OPJ_FALSE;
+        }
+        *p_header_size -= 1;
+
+        opj_read_bytes(l_current_ptr, &l_tmp ,1);                       /* Sqcx */
+        ++l_current_ptr;
+
+        l_tccp->qntsty = l_tmp & 0x1f;
+        l_tccp->numgbits = l_tmp >> 5;
+        if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
+        l_num_band = 1;
+        }
+        else {
+                l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ?
+                        (*p_header_size) :
+                        (*p_header_size) / 2;
+
+                if( l_num_band > OPJ_J2K_MAXBANDS ) {
+                        opj_event_msg(p_manager, EVT_WARNING, "While reading CCP_QNTSTY element inside QCD or QCC marker segment, "
+                                "number of subbands (%d) is greater to OPJ_J2K_MAXBANDS (%d). So we limit the number of elements stored to "
+                                "OPJ_J2K_MAXBANDS (%d) and skip the rest. \n", l_num_band, OPJ_J2K_MAXBANDS, OPJ_J2K_MAXBANDS);
+                        /*return OPJ_FALSE;*/
+                }
+        }
+
+#ifdef USE_JPWL
+        if (l_cp->correct) {
+
+                /* if JPWL is on, we check whether there are too many subbands */
+                if (/*(l_num_band < 0) ||*/ (l_num_band >= OPJ_J2K_MAXBANDS)) {
+                        opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+                                "JPWL: bad number of subbands in Sqcx (%d)\n",
+                                l_num_band);
+                        if (!JPWL_ASSUME) {
+                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                                return OPJ_FALSE;
+                        }
+                        /* we try to correct */
+                        l_num_band = 1;
+                        opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n"
+                                "- setting number of bands to %d => HYPOTHESIS!!!\n",
+                                l_num_band);
+                };
+
+        };
+#endif /* USE_JPWL */
+
+        if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
+                for     (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
+                        opj_read_bytes(l_current_ptr, &l_tmp ,1);                       /* SPqcx_i */
+                        ++l_current_ptr;
+                        if (l_band_no < OPJ_J2K_MAXBANDS){
+                                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 3);
+                                l_tccp->stepsizes[l_band_no].mant = 0;
+                        }
+                }
+                *p_header_size = *p_header_size - l_num_band;
+        }
+        else {
+                for     (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
+                        opj_read_bytes(l_current_ptr, &l_tmp ,2);                       /* SPqcx_i */
+                        l_current_ptr+=2;
+                        if (l_band_no < OPJ_J2K_MAXBANDS){
+                                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 11);
+                                l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff;
+                        }
+                }
+                *p_header_size = *p_header_size - 2*l_num_band;
+        }
+
+        /* Add Antonin : if scalar_derived -> compute other stepsizes */
+        if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
+                for (l_band_no = 1; l_band_no < OPJ_J2K_MAXBANDS; l_band_no++) {
+                        l_tccp->stepsizes[l_band_no].expn =
+                                ((OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) > 0) ?
+                                        (OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) : 0;
+                        l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant;
+                }
+        }
+
+        return OPJ_TRUE;
+}
+
+void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k )
+{
+        OPJ_UINT32 i;
+        opj_cp_t *l_cp = NULL;
+        opj_tcp_t *l_tcp = NULL;
+        opj_tccp_t *l_ref_tccp = NULL;
+        opj_tccp_t *l_copied_tccp = NULL;
+        OPJ_UINT32 l_size;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+                        &l_cp->tcps[p_j2k->m_current_tile_number] :
+                        p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+        l_ref_tccp = &l_tcp->tccps[0];
+        l_copied_tccp = l_ref_tccp + 1;
+        l_size = OPJ_J2K_MAXBANDS * sizeof(opj_stepsize_t);
+
+        for     (i=1;i<p_j2k->m_private_image->numcomps;++i) {
+                l_copied_tccp->qntsty = l_ref_tccp->qntsty;
+                l_copied_tccp->numgbits = l_ref_tccp->numgbits;
+                memcpy(l_copied_tccp->stepsizes,l_ref_tccp->stepsizes,l_size);
+                ++l_copied_tccp;
+        }
+}
+
+static void opj_j2k_dump_tile_info( opj_tcp_t * l_default_tile,OPJ_INT32 numcomps,FILE* out_stream)
+{
+        if (l_default_tile)
+        {
+                OPJ_INT32 compno;
+
+                fprintf(out_stream, "\t default tile {\n");
+                fprintf(out_stream, "\t\t csty=%#x\n", l_default_tile->csty);
+                fprintf(out_stream, "\t\t prg=%#x\n", l_default_tile->prg);
+                fprintf(out_stream, "\t\t numlayers=%d\n", l_default_tile->numlayers);
+                fprintf(out_stream, "\t\t mct=%x\n", l_default_tile->mct);
+
+                for (compno = 0; compno < numcomps; compno++) {
+                        opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
+                        OPJ_UINT32 resno;
+      OPJ_INT32 bandno, numbands;
+
+                        /* coding style*/
+                        fprintf(out_stream, "\t\t comp %d {\n", compno);
+                        fprintf(out_stream, "\t\t\t csty=%#x\n", l_tccp->csty);
+                        fprintf(out_stream, "\t\t\t numresolutions=%d\n", l_tccp->numresolutions);
+                        fprintf(out_stream, "\t\t\t cblkw=2^%d\n", l_tccp->cblkw);
+                        fprintf(out_stream, "\t\t\t cblkh=2^%d\n", l_tccp->cblkh);
+                        fprintf(out_stream, "\t\t\t cblksty=%#x\n", l_tccp->cblksty);
+                        fprintf(out_stream, "\t\t\t qmfbid=%d\n", l_tccp->qmfbid);
+
+                        fprintf(out_stream, "\t\t\t preccintsize (w,h)=");
+                        for (resno = 0; resno < l_tccp->numresolutions; resno++) {
+                                fprintf(out_stream, "(%d,%d) ", l_tccp->prcw[resno], l_tccp->prch[resno]);
+                        }
+                        fprintf(out_stream, "\n");
+
+                        /* quantization style*/
+                        fprintf(out_stream, "\t\t\t qntsty=%d\n", l_tccp->qntsty);
+                        fprintf(out_stream, "\t\t\t numgbits=%d\n", l_tccp->numgbits);
+                        fprintf(out_stream, "\t\t\t stepsizes (m,e)=");
+                        numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
+                        for (bandno = 0; bandno < numbands; bandno++) {
+                                fprintf(out_stream, "(%d,%d) ", l_tccp->stepsizes[bandno].mant,
+                                        l_tccp->stepsizes[bandno].expn);
+                        }
+                        fprintf(out_stream, "\n");
+
+                        /* RGN value*/
+                        fprintf(out_stream, "\t\t\t roishift=%d\n", l_tccp->roishift);
+
+                        fprintf(out_stream, "\t\t }\n");
+                } /*end of component of default tile*/
+                fprintf(out_stream, "\t }\n"); /*end of default tile*/
+            }
+}
+
+void j2k_dump (opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream)
+{
+        /* Check if the flag is compatible with j2k file*/
+        if ( (flag & OPJ_JP2_INFO) || (flag & OPJ_JP2_IND)){
+                fprintf(out_stream, "Wrong flag\n");
+                return;
+        }
+
+        /* Dump the image_header */
+        if (flag & OPJ_IMG_INFO){
+                if (p_j2k->m_private_image)
+                        j2k_dump_image_header(p_j2k->m_private_image, 0, out_stream);
+        }
+
+        /* Dump the codestream info from main header */
+        if (flag & OPJ_J2K_MH_INFO){
+                opj_j2k_dump_MH_info(p_j2k, out_stream);
+        }
+        /* Dump all tile/codestream info */
+        if (flag & OPJ_J2K_TCH_INFO){
+          OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+          OPJ_UINT32 i;
+          opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
+          for (i=0;i<l_nb_tiles;++i) {
+            opj_j2k_dump_tile_info( l_tcp,(OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
+            ++l_tcp;
+          }
+        }
+
+        /* Dump the codestream info of the current tile */
+        if (flag & OPJ_J2K_TH_INFO){
+
+        }
+
+        /* Dump the codestream index from main header */
+        if (flag & OPJ_J2K_MH_IND){
+                opj_j2k_dump_MH_index(p_j2k, out_stream);
+        }
+
+        /* Dump the codestream index of the current tile */
+        if (flag & OPJ_J2K_TH_IND){
+
+        }
+
+}
+
+void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream)
+{
+        opj_codestream_index_t* cstr_index = p_j2k->cstr_index;
+        OPJ_UINT32 it_marker, it_tile, it_tile_part;
+
+        fprintf(out_stream, "Codestream index from main header: {\n");
+
+        fprintf(out_stream, "\t Main header start position=%" PRIi64 "\n"
+                                    "\t Main header end position=%" PRIi64 "\n",
+                        cstr_index->main_head_start, cstr_index->main_head_end);
+
+        fprintf(out_stream, "\t Marker list: {\n");
+
+        if (cstr_index->marker){
+                for (it_marker=0; it_marker < cstr_index->marknum ; it_marker++){
+                        fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
+                                        cstr_index->marker[it_marker].type,
+                                        cstr_index->marker[it_marker].pos,
+                                        cstr_index->marker[it_marker].len );
+                }
+        }
+
+        fprintf(out_stream, "\t }\n");
+
+        if (cstr_index->tile_index){
+
+        /* Simple test to avoid to write empty information*/
+        OPJ_UINT32 l_acc_nb_of_tile_part = 0;
+        for (it_tile=0; it_tile < cstr_index->nb_of_tiles ; it_tile++){
+                        l_acc_nb_of_tile_part += cstr_index->tile_index[it_tile].nb_tps;
+        }
+
+        if (l_acc_nb_of_tile_part)
+        {
+            fprintf(out_stream, "\t Tile index: {\n");
+
+                    for (it_tile=0; it_tile < cstr_index->nb_of_tiles ; it_tile++){
+                            OPJ_UINT32 nb_of_tile_part = cstr_index->tile_index[it_tile].nb_tps;
+
+                            fprintf(out_stream, "\t\t nb of tile-part in tile [%d]=%d\n", it_tile, nb_of_tile_part);
+
+                            if (cstr_index->tile_index[it_tile].tp_index){
+                                    for (it_tile_part =0; it_tile_part < nb_of_tile_part; it_tile_part++){
+                                            fprintf(out_stream, "\t\t\t tile-part[%d]: star_pos=%" PRIi64 ", end_header=%" PRIi64 ", end_pos=%" PRIi64 ".\n",
+                                                            it_tile_part,
+                                                            cstr_index->tile_index[it_tile].tp_index[it_tile_part].start_pos,
+                                                            cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_header,
+                                                            cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_pos);
+                                    }
+                            }
+
+                            if (cstr_index->tile_index[it_tile].marker){
+                                    for (it_marker=0; it_marker < cstr_index->tile_index[it_tile].marknum ; it_marker++){
+                                            fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
+                                                            cstr_index->tile_index[it_tile].marker[it_marker].type,
+                                                            cstr_index->tile_index[it_tile].marker[it_marker].pos,
+                                                            cstr_index->tile_index[it_tile].marker[it_marker].len );
+                                    }
+                            }
+                    }
+                    fprintf(out_stream,"\t }\n");
+        }
+        }
+
+        fprintf(out_stream,"}\n");
+
+}
+
+
+void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream)
+{
+
+        fprintf(out_stream, "Codestream info from main header: {\n");
+
+        fprintf(out_stream, "\t tx0=%d, ty0=%d\n", p_j2k->m_cp.tx0, p_j2k->m_cp.ty0);
+        fprintf(out_stream, "\t tdx=%d, tdy=%d\n", p_j2k->m_cp.tdx, p_j2k->m_cp.tdy);
+        fprintf(out_stream, "\t tw=%d, th=%d\n", p_j2k->m_cp.tw, p_j2k->m_cp.th);
+        opj_j2k_dump_tile_info(p_j2k->m_specific_param.m_decoder.m_default_tcp,(OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
+        fprintf(out_stream, "}\n");
+}
+
+void j2k_dump_image_header(opj_image_t* img_header, OPJ_BOOL dev_dump_flag, FILE* out_stream)
+{
+        char tab[2];
+
+        if (dev_dump_flag){
+                fprintf(stdout, "[DEV] Dump an image_header struct {\n");
+                tab[0] = '\0';
+        }
+        else {
+                fprintf(out_stream, "Image info {\n");
+                tab[0] = '\t';tab[1] = '\0';
+        }
+
+        fprintf(out_stream, "%s x0=%d, y0=%d\n", tab, img_header->x0, img_header->y0);
+        fprintf(out_stream,     "%s x1=%d, y1=%d\n", tab, img_header->x1, img_header->y1);
+        fprintf(out_stream, "%s numcomps=%d\n", tab, img_header->numcomps);
+
+        if (img_header->comps){
+                OPJ_UINT32 compno;
+                for (compno = 0; compno < img_header->numcomps; compno++) {
+                        fprintf(out_stream, "%s\t component %d {\n", tab, compno);
+                        j2k_dump_image_comp_header(&(img_header->comps[compno]), dev_dump_flag, out_stream);
+                        fprintf(out_stream,"%s}\n",tab);
+                }
+        }
+
+        fprintf(out_stream, "}\n");
+}
+
+void j2k_dump_image_comp_header(opj_image_comp_t* comp_header, OPJ_BOOL dev_dump_flag, FILE* out_stream)
+{
+        char tab[3];
+
+        if (dev_dump_flag){
+                fprintf(stdout, "[DEV] Dump an image_comp_header struct {\n");
+                tab[0] = '\0';
+        }       else {
+                tab[0] = '\t';tab[1] = '\t';tab[2] = '\0';
+        }
+
+        fprintf(out_stream, "%s dx=%d, dy=%d\n", tab, comp_header->dx, comp_header->dy);
+        fprintf(out_stream, "%s prec=%d\n", tab, comp_header->prec);
+        fprintf(out_stream, "%s sgnd=%d\n", tab, comp_header->sgnd);
+
+        if (dev_dump_flag)
+                fprintf(out_stream, "}\n");
+}
+
+opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k)
+{
+        OPJ_UINT32 compno;
+        OPJ_UINT32 numcomps = p_j2k->m_private_image->numcomps;
+        opj_tcp_t *l_default_tile;
+        opj_codestream_info_v2_t* cstr_info = (opj_codestream_info_v2_t*) opj_calloc(1,sizeof(opj_codestream_info_v2_t));
+		if (!cstr_info)
+			return NULL;
+
+        cstr_info->nbcomps = p_j2k->m_private_image->numcomps;
+
+        cstr_info->tx0 = p_j2k->m_cp.tx0;
+        cstr_info->ty0 = p_j2k->m_cp.ty0;
+        cstr_info->tdx = p_j2k->m_cp.tdx;
+        cstr_info->tdy = p_j2k->m_cp.tdy;
+        cstr_info->tw = p_j2k->m_cp.tw;
+        cstr_info->th = p_j2k->m_cp.th;
+
+        cstr_info->tile_info = NULL; /* Not fill from the main header*/
+
+        l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+        cstr_info->m_default_tile_info.csty = l_default_tile->csty;
+        cstr_info->m_default_tile_info.prg = l_default_tile->prg;
+        cstr_info->m_default_tile_info.numlayers = l_default_tile->numlayers;
+        cstr_info->m_default_tile_info.mct = l_default_tile->mct;
+
+        cstr_info->m_default_tile_info.tccp_info = (opj_tccp_info_t*) opj_calloc(cstr_info->nbcomps, sizeof(opj_tccp_info_t));
+		if (!cstr_info->m_default_tile_info.tccp_info)
+		{
+			opj_destroy_cstr_info(&cstr_info);
+			return NULL;
+		}
+
+        for (compno = 0; compno < numcomps; compno++) {
+                opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
+                opj_tccp_info_t *l_tccp_info = &(cstr_info->m_default_tile_info.tccp_info[compno]);
+                OPJ_INT32 bandno, numbands;
+
+                /* coding style*/
+                l_tccp_info->csty = l_tccp->csty;
+                l_tccp_info->numresolutions = l_tccp->numresolutions;
+                l_tccp_info->cblkw = l_tccp->cblkw;
+                l_tccp_info->cblkh = l_tccp->cblkh;
+                l_tccp_info->cblksty = l_tccp->cblksty;
+                l_tccp_info->qmfbid = l_tccp->qmfbid;
+                if (l_tccp->numresolutions < OPJ_J2K_MAXRLVLS)
+                {
+                        memcpy(l_tccp_info->prch, l_tccp->prch, l_tccp->numresolutions);
+                        memcpy(l_tccp_info->prcw, l_tccp->prcw, l_tccp->numresolutions);
+                }
+
+                /* quantization style*/
+                l_tccp_info->qntsty = l_tccp->qntsty;
+                l_tccp_info->numgbits = l_tccp->numgbits;
+
+                numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
+                if (numbands < OPJ_J2K_MAXBANDS) {
+                        for (bandno = 0; bandno < numbands; bandno++) {
+                                l_tccp_info->stepsizes_mant[bandno] = (OPJ_UINT32)l_tccp->stepsizes[bandno].mant;
+                                l_tccp_info->stepsizes_expn[bandno] = (OPJ_UINT32)l_tccp->stepsizes[bandno].expn;
+                        }
+                }
+
+                /* RGN value*/
+                l_tccp_info->roishift = l_tccp->roishift;
+        }
+
+        return cstr_info;
+}
+
+opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k)
+{
+        opj_codestream_index_t* l_cstr_index = (opj_codestream_index_t*)
+                        opj_calloc(1,sizeof(opj_codestream_index_t));
+        if (!l_cstr_index)
+                return NULL;
+
+        l_cstr_index->main_head_start = p_j2k->cstr_index->main_head_start;
+        l_cstr_index->main_head_end = p_j2k->cstr_index->main_head_end;
+        l_cstr_index->codestream_size = p_j2k->cstr_index->codestream_size;
+
+        l_cstr_index->marknum = p_j2k->cstr_index->marknum;
+        l_cstr_index->marker = (opj_marker_info_t*)opj_malloc(l_cstr_index->marknum*sizeof(opj_marker_info_t));
+        if (!l_cstr_index->marker){
+                opj_free( l_cstr_index);
+                return NULL;
+        }
+
+        if (p_j2k->cstr_index->marker)
+                memcpy(l_cstr_index->marker, p_j2k->cstr_index->marker, l_cstr_index->marknum * sizeof(opj_marker_info_t) );
+        else{
+                opj_free(l_cstr_index->marker);
+                l_cstr_index->marker = NULL;
+        }
+
+        l_cstr_index->nb_of_tiles = p_j2k->cstr_index->nb_of_tiles;
+        l_cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(l_cstr_index->nb_of_tiles, sizeof(opj_tile_index_t) );
+        if (!l_cstr_index->tile_index){
+                opj_free( l_cstr_index->marker);
+                opj_free( l_cstr_index);
+                return NULL;
+        }
+
+        if (!p_j2k->cstr_index->tile_index){
+                opj_free(l_cstr_index->tile_index);
+                l_cstr_index->tile_index = NULL;
+        }
+        else {
+                OPJ_UINT32 it_tile = 0;
+                for (it_tile = 0; it_tile < l_cstr_index->nb_of_tiles; it_tile++ ){
+
+                        /* Tile Marker*/
+                        l_cstr_index->tile_index[it_tile].marknum = p_j2k->cstr_index->tile_index[it_tile].marknum;
+
+                        l_cstr_index->tile_index[it_tile].marker =
+                                (opj_marker_info_t*)opj_malloc(l_cstr_index->tile_index[it_tile].marknum*sizeof(opj_marker_info_t));
+
+                        if (!l_cstr_index->tile_index[it_tile].marker) {
+                                OPJ_UINT32 it_tile_free;
+
+                                for (it_tile_free=0; it_tile_free < it_tile; it_tile_free++){
+                                        opj_free(l_cstr_index->tile_index[it_tile_free].marker);
+                                }
+
+                                opj_free( l_cstr_index->tile_index);
+                                opj_free( l_cstr_index->marker);
+                                opj_free( l_cstr_index);
+                                return NULL;
+                        }
+
+                        if (p_j2k->cstr_index->tile_index[it_tile].marker)
+                                memcpy( l_cstr_index->tile_index[it_tile].marker,
+                                                p_j2k->cstr_index->tile_index[it_tile].marker,
+                                                l_cstr_index->tile_index[it_tile].marknum * sizeof(opj_marker_info_t) );
+                        else{
+                                opj_free(l_cstr_index->tile_index[it_tile].marker);
+                                l_cstr_index->tile_index[it_tile].marker = NULL;
+                        }
+
+                        /* Tile part index*/
+                        l_cstr_index->tile_index[it_tile].nb_tps = p_j2k->cstr_index->tile_index[it_tile].nb_tps;
+
+                        l_cstr_index->tile_index[it_tile].tp_index =
+                                (opj_tp_index_t*)opj_malloc(l_cstr_index->tile_index[it_tile].nb_tps*sizeof(opj_tp_index_t));
+
+                        if(!l_cstr_index->tile_index[it_tile].tp_index){
+                                OPJ_UINT32 it_tile_free;
+
+                                for (it_tile_free=0; it_tile_free < it_tile; it_tile_free++){
+                                        opj_free(l_cstr_index->tile_index[it_tile_free].marker);
+                                        opj_free(l_cstr_index->tile_index[it_tile_free].tp_index);
+                                }
+
+                                opj_free( l_cstr_index->tile_index);
+                                opj_free( l_cstr_index->marker);
+                                opj_free( l_cstr_index);
+                                return NULL;
+                        }
+
+                        if (p_j2k->cstr_index->tile_index[it_tile].tp_index){
+                                memcpy( l_cstr_index->tile_index[it_tile].tp_index,
+                                                p_j2k->cstr_index->tile_index[it_tile].tp_index,
+                                                l_cstr_index->tile_index[it_tile].nb_tps * sizeof(opj_tp_index_t) );
+                        }
+                        else{
+                                opj_free(l_cstr_index->tile_index[it_tile].tp_index);
+                                l_cstr_index->tile_index[it_tile].tp_index = NULL;
+                        }
+
+                        /* Packet index (NOT USED)*/
+                        l_cstr_index->tile_index[it_tile].nb_packet = 0;
+                        l_cstr_index->tile_index[it_tile].packet_index = NULL;
+
+                }
+        }
+
+        return l_cstr_index;
+}
+
+OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k)
+{
+        OPJ_UINT32 it_tile=0;
+
+        p_j2k->cstr_index->nb_of_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
+        p_j2k->cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(p_j2k->cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
+        if (!p_j2k->cstr_index->tile_index)
+                return OPJ_FALSE;
+
+        for (it_tile=0; it_tile < p_j2k->cstr_index->nb_of_tiles; it_tile++){
+                p_j2k->cstr_index->tile_index[it_tile].maxmarknum = 100;
+                p_j2k->cstr_index->tile_index[it_tile].marknum = 0;
+                p_j2k->cstr_index->tile_index[it_tile].marker = (opj_marker_info_t*)
+                                opj_calloc(p_j2k->cstr_index->tile_index[it_tile].maxmarknum, sizeof(opj_marker_info_t));
+                if (!p_j2k->cstr_index->tile_index[it_tile].marker)
+                        return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_decode_tiles ( opj_j2k_t *p_j2k,
+                                                            opj_stream_private_t *p_stream,
+                                                            opj_event_mgr_t * p_manager)
+{
+        OPJ_BOOL l_go_on = OPJ_TRUE;
+        OPJ_UINT32 l_current_tile_no;
+        OPJ_UINT32 l_data_size,l_max_data_size;
+        OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1;
+        OPJ_UINT32 l_nb_comps;
+        OPJ_BYTE * l_current_data;
+        OPJ_UINT32 nr_tiles = 0;
+
+        l_current_data = (OPJ_BYTE*)opj_malloc(1000);
+        if (! l_current_data) {
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tiles\n");
+                return OPJ_FALSE;
+        }
+        l_max_data_size = 1000;
+
+        while (OPJ_TRUE) {
+                if (! opj_j2k_read_tile_header( p_j2k,
+                                        &l_current_tile_no,
+                                        &l_data_size,
+                                        &l_tile_x0, &l_tile_y0,
+                                        &l_tile_x1, &l_tile_y1,
+                                        &l_nb_comps,
+                                        &l_go_on,
+                                        p_stream,
+                                        p_manager)) {
+                        opj_free(l_current_data);
+                        return OPJ_FALSE;
+                }
+
+                if (! l_go_on) {
+                        break;
+                }
+
+                if (l_data_size > l_max_data_size) {
+                        OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_data_size);
+                        if (! l_new_current_data) {
+                                opj_free(l_current_data);
+                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile %d/%d\n", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
+                                return OPJ_FALSE;
+                        }
+                        l_current_data = l_new_current_data;
+                        l_max_data_size = l_data_size;
+                }
+
+                if (! opj_j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager)) {
+                        opj_free(l_current_data);
+                        opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile %d/%d\n", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
+                        return OPJ_FALSE;
+                }
+                opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
+
+                if (! opj_j2k_update_image_data(p_j2k->m_tcd,l_current_data, p_j2k->m_output_image)) {
+                        opj_free(l_current_data);
+                        return OPJ_FALSE;
+                }
+                opj_event_msg(p_manager, EVT_INFO, "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
+                
+                if(opj_stream_get_number_byte_left(p_stream) == 0  
+                    && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC)
+                    break;
+                if(++nr_tiles ==  p_j2k->m_cp.th * p_j2k->m_cp.tw) 
+                    break;
+        }
+
+        opj_free(l_current_data);
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Sets up the procedures to do on decoding data. Developpers wanting to extend the library can add their own reading procedures.
+ */
+static void opj_j2k_setup_decoding (opj_j2k_t *p_j2k)
+{
+        /* preconditions*/
+        assert(p_j2k != 00);
+
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_tiles);
+        /* DEVELOPER CORNER, add your custom procedures */
+
+}
+
+/*
+ * Read and decode one tile.
+ */
+static OPJ_BOOL opj_j2k_decode_one_tile (       opj_j2k_t *p_j2k,
+                                                                            opj_stream_private_t *p_stream,
+                                                                            opj_event_mgr_t * p_manager)
+{
+        OPJ_BOOL l_go_on = OPJ_TRUE;
+        OPJ_UINT32 l_current_tile_no;
+        OPJ_UINT32 l_tile_no_to_dec;
+        OPJ_UINT32 l_data_size,l_max_data_size;
+        OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1;
+        OPJ_UINT32 l_nb_comps;
+        OPJ_BYTE * l_current_data;
+
+        l_current_data = (OPJ_BYTE*)opj_malloc(1000);
+        if (! l_current_data) {
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode one tile\n");
+                return OPJ_FALSE;
+        }
+        l_max_data_size = 1000;
+
+        /*Allocate and initialize some elements of codestrem index if not already done*/
+        if( !p_j2k->cstr_index->tile_index)
+        {
+                if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)){
+                        opj_free(l_current_data);
+                        return OPJ_FALSE;
+                }
+        }
+        /* Move into the codestream to the first SOT used to decode the desired tile */
+        l_tile_no_to_dec = (OPJ_UINT32)p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec;
+        if (p_j2k->cstr_index->tile_index)
+                if(p_j2k->cstr_index->tile_index->tp_index)
+                {
+                        if ( ! p_j2k->cstr_index->tile_index[l_tile_no_to_dec].nb_tps) {
+                                /* the index for this tile has not been built,
+                                 *  so move to the last SOT read */
+                                if ( !(opj_stream_read_seek(p_stream, p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos+2, p_manager)) ){
+                                        opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
+                        opj_free(l_current_data);
+                                        return OPJ_FALSE;
+                                }
+                        }
+                        else{
+                                if ( !(opj_stream_read_seek(p_stream, p_j2k->cstr_index->tile_index[l_tile_no_to_dec].tp_index[0].start_pos+2, p_manager)) ) {
+                                        opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
+                        opj_free(l_current_data);
+                                        return OPJ_FALSE;
+                                }
+                        }
+                        /* Special case if we have previously read the EOC marker (if the previous tile getted is the last ) */
+                        if(p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC)
+                                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+                }
+
+        while (OPJ_TRUE) {
+                if (! opj_j2k_read_tile_header( p_j2k,
+                                        &l_current_tile_no,
+                                        &l_data_size,
+                                        &l_tile_x0, &l_tile_y0,
+                                        &l_tile_x1, &l_tile_y1,
+                                        &l_nb_comps,
+                                        &l_go_on,
+                                        p_stream,
+                                        p_manager)) {
+                        opj_free(l_current_data);
+                        return OPJ_FALSE;
+                }
+
+                if (! l_go_on) {
+                        break;
+                }
+
+                if (l_data_size > l_max_data_size) {
+                        OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_data_size);
+                        if (! l_new_current_data) {
+                                opj_free(l_current_data);
+                                l_current_data = NULL;
+                                /* TODO: LH: why tile numbering policy used in messages differs from
+                                   the one used in opj_j2k_decode_tiles() ? */
+                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile %d/%d\n", l_current_tile_no, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);
+                                return OPJ_FALSE;
+                        }
+                        l_current_data = l_new_current_data;
+                        l_max_data_size = l_data_size;
+                }
+
+                if (! opj_j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager)) {
+                        opj_free(l_current_data);
+                        return OPJ_FALSE;
+                }
+                opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n", l_current_tile_no, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);
+
+                if (! opj_j2k_update_image_data(p_j2k->m_tcd,l_current_data, p_j2k->m_output_image)) {
+                        opj_free(l_current_data);
+                        return OPJ_FALSE;
+                }
+                opj_event_msg(p_manager, EVT_INFO, "Image data has been updated with tile %d.\n\n", l_current_tile_no);
+
+                if(l_current_tile_no == l_tile_no_to_dec)
+                {
+                        /* move into the codestream to the the first SOT (FIXME or not move?)*/
+                        if (!(opj_stream_read_seek(p_stream, p_j2k->cstr_index->main_head_end + 2, p_manager) ) ) {
+                                opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
+                                return OPJ_FALSE;
+                        }
+                        break;
+                }
+                else {
+                        opj_event_msg(p_manager, EVT_WARNING, "Tile read, decode and updated is not the desired (%d vs %d).\n", l_current_tile_no, l_tile_no_to_dec);
+                }
+
+        }
+
+        opj_free(l_current_data);
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Sets up the procedures to do on decoding one tile. Developpers wanting to extend the library can add their own reading procedures.
+ */
+static void opj_j2k_setup_decoding_tile (opj_j2k_t *p_j2k)
+{
+        /* preconditions*/
+        assert(p_j2k != 00);
+
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_one_tile);
+        /* DEVELOPER CORNER, add your custom procedures */
+
+}
+
+OPJ_BOOL opj_j2k_decode(opj_j2k_t * p_j2k,
+                                                opj_stream_private_t * p_stream,
+                                                opj_image_t * p_image,
+                                                opj_event_mgr_t * p_manager)
+{
+        OPJ_UINT32 compno;
+
+        if (!p_image)
+                return OPJ_FALSE;
+
+        p_j2k->m_output_image = opj_image_create0();
+        if (! (p_j2k->m_output_image)) {
+                return OPJ_FALSE;
+        }
+        opj_copy_image_header(p_image, p_j2k->m_output_image);
+
+        /* customization of the decoding */
+        opj_j2k_setup_decoding(p_j2k);
+
+        /* Decode the codestream */
+        if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
+                opj_image_destroy(p_j2k->m_private_image);
+                p_j2k->m_private_image = NULL;
+                return OPJ_FALSE;
+        }
+
+        /* Move data and copy one information from codec to output image*/
+        for (compno = 0; compno < p_image->numcomps; compno++) {
+                p_image->comps[compno].resno_decoded = p_j2k->m_output_image->comps[compno].resno_decoded;
+                p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
+#if 0
+                char fn[256];
+                sprintf( fn, "/tmp/%d.raw", compno );
+                FILE *debug = fopen( fn, "wb" );
+                fwrite( p_image->comps[compno].data, sizeof(OPJ_INT32), p_image->comps[compno].w * p_image->comps[compno].h, debug );
+                fclose( debug );
+#endif
+                p_j2k->m_output_image->comps[compno].data = NULL;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_get_tile(      opj_j2k_t *p_j2k,
+                                                    opj_stream_private_t *p_stream,
+                                                    opj_image_t* p_image,
+                                                    opj_event_mgr_t * p_manager,
+                                                    OPJ_UINT32 tile_index )
+{
+        OPJ_UINT32 compno;
+        OPJ_UINT32 l_tile_x, l_tile_y;
+        opj_image_comp_t* l_img_comp;
+
+        if (!p_image) {
+                opj_event_msg(p_manager, EVT_ERROR, "We need an image previously created.\n");
+                return OPJ_FALSE;
+        }
+
+        if ( /*(tile_index < 0) &&*/ (tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th) ){
+                opj_event_msg(p_manager, EVT_ERROR, "Tile index provided by the user is incorrect %d (max = %d) \n", tile_index, (p_j2k->m_cp.tw * p_j2k->m_cp.th) - 1);
+                return OPJ_FALSE;
+        }
+
+        /* Compute the dimension of the desired tile*/
+        l_tile_x = tile_index % p_j2k->m_cp.tw;
+        l_tile_y = tile_index / p_j2k->m_cp.tw;
+
+        p_image->x0 = l_tile_x * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
+        if (p_image->x0 < p_j2k->m_private_image->x0)
+                p_image->x0 = p_j2k->m_private_image->x0;
+        p_image->x1 = (l_tile_x + 1) * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
+        if (p_image->x1 > p_j2k->m_private_image->x1)
+                p_image->x1 = p_j2k->m_private_image->x1;
+
+        p_image->y0 = l_tile_y * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
+        if (p_image->y0 < p_j2k->m_private_image->y0)
+                p_image->y0 = p_j2k->m_private_image->y0;
+        p_image->y1 = (l_tile_y + 1) * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
+        if (p_image->y1 > p_j2k->m_private_image->y1)
+                p_image->y1 = p_j2k->m_private_image->y1;
+
+        l_img_comp = p_image->comps;
+        for (compno=0; compno < p_image->numcomps; ++compno)
+        {
+                OPJ_INT32 l_comp_x1, l_comp_y1;
+
+                l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor;
+
+                l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0, (OPJ_INT32)l_img_comp->dx);
+                l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0, (OPJ_INT32)l_img_comp->dy);
+                l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
+                l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
+
+                l_img_comp->w = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor));
+                l_img_comp->h = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor));
+
+                l_img_comp++;
+        }
+
+        /* Destroy the previous output image*/
+        if (p_j2k->m_output_image)
+                opj_image_destroy(p_j2k->m_output_image);
+
+        /* Create the ouput image from the information previously computed*/
+        p_j2k->m_output_image = opj_image_create0();
+        if (! (p_j2k->m_output_image)) {
+                return OPJ_FALSE;
+        }
+        opj_copy_image_header(p_image, p_j2k->m_output_image);
+
+        p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index;
+
+        /* customization of the decoding */
+        opj_j2k_setup_decoding_tile(p_j2k);
+
+        /* Decode the codestream */
+        if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
+                opj_image_destroy(p_j2k->m_private_image);
+                p_j2k->m_private_image = NULL;
+                return OPJ_FALSE;
+        }
+
+        /* Move data and copy one information from codec to output image*/
+        for (compno = 0; compno < p_image->numcomps; compno++) {
+                p_image->comps[compno].resno_decoded = p_j2k->m_output_image->comps[compno].resno_decoded;
+
+                if (p_image->comps[compno].data)
+                        opj_free(p_image->comps[compno].data);
+
+                p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
+
+                p_j2k->m_output_image->comps[compno].data = NULL;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k,
+                                               OPJ_UINT32 res_factor,
+                                               opj_event_mgr_t * p_manager)
+{
+        OPJ_UINT32 it_comp;
+
+        p_j2k->m_cp.m_specific_param.m_dec.m_reduce = res_factor;
+
+        if (p_j2k->m_private_image) {
+                if (p_j2k->m_private_image->comps) {
+                        if (p_j2k->m_specific_param.m_decoder.m_default_tcp) {
+                                if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps) {
+                                        for (it_comp = 0 ; it_comp < p_j2k->m_private_image->numcomps; it_comp++) {
+                                                OPJ_UINT32 max_res = p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[it_comp].numresolutions;
+                                                if ( res_factor >= max_res){
+                                                        opj_event_msg(p_manager, EVT_ERROR, "Resolution factor is greater than the maximum resolution in the component.\n");
+                                                        return OPJ_FALSE;
+                                                }
+                                                p_j2k->m_private_image->comps[it_comp].factor = res_factor;
+                                        }
+                                        return OPJ_TRUE;
+                                }
+                        }
+                }
+        }
+
+        return OPJ_FALSE;
+}
+
+OPJ_BOOL opj_j2k_encode(opj_j2k_t * p_j2k,
+                        opj_stream_private_t *p_stream,
+                        opj_event_mgr_t * p_manager )
+{
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_nb_tiles;
+        OPJ_UINT32 l_max_tile_size, l_current_tile_size;
+        OPJ_BYTE * l_current_data;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_stream != 00);
+        assert(p_manager != 00);
+
+        l_current_data = (OPJ_BYTE*)opj_malloc(1000);
+        if (! l_current_data) {
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to encode all tiles\n");
+                return OPJ_FALSE;
+        }
+        l_max_tile_size = 1000;
+
+        l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+        for (i=0;i<l_nb_tiles;++i) {
+                if (! opj_j2k_pre_write_tile(p_j2k,i,p_stream,p_manager)) {
+                        opj_free(l_current_data);
+                        return OPJ_FALSE;
+                }
+
+                l_current_tile_size = opj_tcd_get_encoded_tile_size(p_j2k->m_tcd);
+                if (l_current_tile_size > l_max_tile_size) {
+                        OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_current_tile_size);
+                        if (! l_new_current_data) {
+                                opj_free(l_current_data);
+                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to encode all tiles\n");
+                                return OPJ_FALSE;
+                        }
+                        l_current_data = l_new_current_data;
+                        l_max_tile_size = l_current_tile_size;
+                }
+
+                opj_j2k_get_tile_data(p_j2k->m_tcd,l_current_data);
+
+                if (! opj_j2k_post_write_tile (p_j2k,l_current_data,l_current_tile_size,p_stream,p_manager)) {
+                        return OPJ_FALSE;
+                }
+        }
+
+        opj_free(l_current_data);
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_end_compress(  opj_j2k_t *p_j2k,
+                                                        opj_stream_private_t *p_stream,
+                                                        opj_event_mgr_t * p_manager)
+{
+        /* customization of the encoding */
+        opj_j2k_setup_end_compress(p_j2k);
+
+        if (! opj_j2k_exec (p_j2k, p_j2k->m_procedure_list, p_stream, p_manager))
+        {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,
+                                                            opj_stream_private_t *p_stream,
+                                                            opj_image_t * p_image,
+                                                            opj_event_mgr_t * p_manager)
+{
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_stream != 00);
+        assert(p_manager != 00);
+
+        p_j2k->m_private_image = opj_image_create0();
+        opj_copy_image_header(p_image, p_j2k->m_private_image);
+
+        /* TODO_MSD: Find a better way */
+        if (p_image->comps) {
+                OPJ_UINT32 it_comp;
+                for (it_comp = 0 ; it_comp < p_image->numcomps; it_comp++) {
+                        if (p_image->comps[it_comp].data) {
+                                p_j2k->m_private_image->comps[it_comp].data =p_image->comps[it_comp].data;
+                                p_image->comps[it_comp].data = NULL;
+
+                        }
+                }
+        }
+
+        /* customization of the validation */
+        opj_j2k_setup_encoding_validation (p_j2k);
+
+        /* validation of the parameters codec */
+        if (! opj_j2k_exec(p_j2k,p_j2k->m_validation_list,p_stream,p_manager)) {
+                return OPJ_FALSE;
+        }
+
+        /* customization of the encoding */
+        opj_j2k_setup_header_writing(p_j2k);
+
+        /* write header */
+        if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_pre_write_tile (       opj_j2k_t * p_j2k,
+                                                                OPJ_UINT32 p_tile_index,
+                                                                opj_stream_private_t *p_stream,
+                                                                opj_event_mgr_t * p_manager )
+{
+  (void)p_stream;
+        if (p_tile_index != p_j2k->m_current_tile_number) {
+                opj_event_msg(p_manager, EVT_ERROR, "The given tile index does not match." );
+                return OPJ_FALSE;
+        }
+
+        opj_event_msg(p_manager, EVT_INFO, "tile number %d / %d\n", p_j2k->m_current_tile_number + 1, p_j2k->m_cp.tw * p_j2k->m_cp.th);
+
+        p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0;
+        p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts;
+        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
+
+        /* initialisation before tile encoding  */
+        if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number)) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data)
+{
+        OPJ_UINT32 i,j,k = 0;
+        OPJ_UINT32 l_width,l_height,l_stride, l_offset_x,l_offset_y, l_image_width;
+        opj_image_comp_t * l_img_comp = 00;
+        opj_tcd_tilecomp_t * l_tilec = 00;
+        opj_image_t * l_image = 00;
+        OPJ_UINT32 l_size_comp, l_remaining;
+        OPJ_INT32 * l_src_ptr;
+        l_tilec = p_tcd->tcd_image->tiles->comps;
+        l_image = p_tcd->image;
+        l_img_comp = l_image->comps;
+
+        for (i=0;i<p_tcd->image->numcomps;++i) {
+                l_size_comp = l_img_comp->prec >> 3; /* (/8) */
+                l_remaining = l_img_comp->prec & 7;  /* (%8) */
+                if (l_remaining) {
+                        ++l_size_comp;
+                }
+
+                if (l_size_comp == 3) {
+                        l_size_comp = 4;
+                }
+
+                l_width  = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
+                l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
+                l_offset_x = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
+                l_offset_y = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->y0, (OPJ_INT32)l_img_comp->dy);
+                l_image_width = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x1 - (OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
+                l_stride = l_image_width - l_width;
+                l_src_ptr = l_img_comp->data + ((OPJ_UINT32)l_tilec->x0 - l_offset_x) + ((OPJ_UINT32)l_tilec->y0 - l_offset_y) * l_image_width;
+
+                switch (l_size_comp) {
+                        case 1:
+                                {
+                                        OPJ_CHAR * l_dest_ptr = (OPJ_CHAR*) p_data;
+                                        if (l_img_comp->sgnd) {
+                                                for     (j=0;j<l_height;++j) {
+                                                        for (k=0;k<l_width;++k) {
+                                                                *(l_dest_ptr) = (OPJ_CHAR) (*l_src_ptr);
+                                                                ++l_dest_ptr;
+                                                                ++l_src_ptr;
+                                                        }
+                                                        l_src_ptr += l_stride;
+                                                }
+                                        }
+                                        else {
+                                                for (j=0;j<l_height;++j) {
+                                                        for (k=0;k<l_width;++k) {
+                                                                *(l_dest_ptr) = (OPJ_CHAR)((*l_src_ptr)&0xff);
+                                                                ++l_dest_ptr;
+                                                                ++l_src_ptr;
+                                                        }
+                                                        l_src_ptr += l_stride;
+                                                }
+                                        }
+
+                                        p_data = (OPJ_BYTE*) l_dest_ptr;
+                                }
+                                break;
+                        case 2:
+                                {
+                                        OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_data;
+                                        if (l_img_comp->sgnd) {
+                                                for (j=0;j<l_height;++j) {
+                                                        for (k=0;k<l_width;++k) {
+                                                                *(l_dest_ptr++) = (OPJ_INT16) (*(l_src_ptr++));
+                                                        }
+                                                        l_src_ptr += l_stride;
+                                                }
+                                        }
+                                        else {
+                                                for (j=0;j<l_height;++j) {
+                                                        for (k=0;k<l_width;++k) {
+                                                                *(l_dest_ptr++) = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff);
+                                                        }
+                                                        l_src_ptr += l_stride;
+                                                }
+                                        }
+
+                                        p_data = (OPJ_BYTE*) l_dest_ptr;
+                                }
+                                break;
+                        case 4:
+                                {
+                                        OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_data;
+                                        for (j=0;j<l_height;++j) {
+                                                for (k=0;k<l_width;++k) {
+                                                        *(l_dest_ptr++) = *(l_src_ptr++);
+                                                }
+                                                l_src_ptr += l_stride;
+                                        }
+
+                                        p_data = (OPJ_BYTE*) l_dest_ptr;
+                                }
+                                break;
+                }
+
+                ++l_img_comp;
+                ++l_tilec;
+        }
+}
+
+OPJ_BOOL opj_j2k_post_write_tile (      opj_j2k_t * p_j2k,
+                                                                OPJ_BYTE * p_data,
+                                                                OPJ_UINT32 p_data_size,
+                                                                opj_stream_private_t *p_stream,
+                                                                opj_event_mgr_t * p_manager )
+{
+        opj_tcd_t * l_tcd = 00;
+        OPJ_UINT32 l_nb_bytes_written;
+        OPJ_BYTE * l_current_data = 00;
+        OPJ_UINT32 l_tile_size = 0;
+        OPJ_UINT32 l_available_data;
+
+        /* preconditions */
+        assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
+
+        l_tcd = p_j2k->m_tcd;
+        
+        l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size;
+        l_available_data = l_tile_size;
+        l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data;
+
+        if (! opj_tcd_copy_tile_data(l_tcd,p_data,p_data_size)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Size mismatch between tile data and sent data." );
+                return OPJ_FALSE;
+        }
+
+        l_nb_bytes_written = 0;
+        if (! opj_j2k_write_first_tile_part(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager)) {
+                return OPJ_FALSE;
+        }
+        l_current_data += l_nb_bytes_written;
+        l_available_data -= l_nb_bytes_written;
+
+        l_nb_bytes_written = 0;
+        if (! opj_j2k_write_all_tile_parts(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager)) {
+                return OPJ_FALSE;
+        }
+
+        l_available_data -= l_nb_bytes_written;
+        l_nb_bytes_written = l_tile_size - l_available_data;
+
+        if ( opj_stream_write_data(     p_stream,
+                                                                p_j2k->m_specific_param.m_encoder.m_encoded_tile_data,
+                                                                l_nb_bytes_written,p_manager) != l_nb_bytes_written) {
+                return OPJ_FALSE;
+        }
+
+        ++p_j2k->m_current_tile_number;
+
+        return OPJ_TRUE;
+}
+
+void opj_j2k_setup_end_compress (opj_j2k_t *p_j2k)
+{
+        /* preconditions */
+        assert(p_j2k != 00);
+
+        /* DEVELOPER CORNER, insert your custom procedures */
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_eoc );
+
+        if (p_j2k->m_cp.m_specific_param.m_enc.m_cinema) {
+                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_updated_tlm);
+        }
+
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_epc );
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_end_encoding );
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_destroy_header_memory);
+}
+
+void opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k)
+{
+        /* preconditions */
+        assert(p_j2k != 00);
+
+        opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_encoder);
+        opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_encoding_validation);
+
+        /* DEVELOPER CORNER, add your custom validation procedure */
+        opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_mct_validation);
+}
+
+void opj_j2k_setup_header_writing (opj_j2k_t *p_j2k)
+{
+        /* preconditions */
+        assert(p_j2k != 00);
+
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_init_info );
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_soc );
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_siz );
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_cod );
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_qcd );
+
+        if (p_j2k->m_cp.m_specific_param.m_enc.m_cinema) {
+                /* No need for COC or QCC, QCD and COD are used
+                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_coc );
+                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_qcc );
+                */
+                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_tlm );
+
+                if (p_j2k->m_cp.m_specific_param.m_enc.m_cinema == OPJ_CINEMA4K_24) {
+                        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_poc );
+                }
+        }
+
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_regions);
+
+        if (p_j2k->m_cp.comment != 00)  {
+                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_com);
+        }
+
+        /* DEVELOPER CORNER, insert your custom procedures */
+        if (p_j2k->m_cp.rsiz & OPJ_MCT) {
+                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_mct_data_group );
+        }
+        /* End of Developer Corner */
+
+        if (p_j2k->cstr_index) {
+                opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_get_end_header );
+        }
+
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_create_tcd);
+        opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_update_rates);
+}
+
+OPJ_BOOL opj_j2k_write_first_tile_part (opj_j2k_t *p_j2k,
+                                                                        OPJ_BYTE * p_data,
+                                                                        OPJ_UINT32 * p_data_written,
+                                                                        OPJ_UINT32 p_total_data_size,
+                                                                        opj_stream_private_t *p_stream,
+                                                                        struct opj_event_mgr * p_manager )
+{
+        OPJ_UINT32 l_nb_bytes_written = 0;
+        OPJ_UINT32 l_current_nb_bytes_written;
+        OPJ_BYTE * l_begin_data = 00;
+
+        opj_tcd_t * l_tcd = 00;
+        opj_cp_t * l_cp = 00;
+
+        l_tcd = p_j2k->m_tcd;
+        l_cp = &(p_j2k->m_cp);
+
+        l_tcd->cur_pino = 0;
+
+        /*Get number of tile parts*/
+        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
+
+        /* INDEX >> */
+        /* << INDEX */
+
+        l_current_nb_bytes_written = 0;
+        l_begin_data = p_data;
+        if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager))
+        {
+                return OPJ_FALSE;
+        }
+
+        l_nb_bytes_written += l_current_nb_bytes_written;
+        p_data += l_current_nb_bytes_written;
+        p_total_data_size -= l_current_nb_bytes_written;
+
+        if (l_cp->m_specific_param.m_enc.m_cinema == 0) {
+#if 0
+                for (compno = 1; compno < p_j2k->m_private_image->numcomps; compno++) {
+                        l_current_nb_bytes_written = 0;
+                        opj_j2k_write_coc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager);
+                        l_nb_bytes_written += l_current_nb_bytes_written;
+                        p_data += l_current_nb_bytes_written;
+                        p_total_data_size -= l_current_nb_bytes_written;
+
+                        l_current_nb_bytes_written = 0;
+                        opj_j2k_write_qcc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager);
+                        l_nb_bytes_written += l_current_nb_bytes_written;
+                        p_data += l_current_nb_bytes_written;
+                        p_total_data_size -= l_current_nb_bytes_written;
+                }
+#endif
+
+                if (l_cp->tcps[p_j2k->m_current_tile_number].numpocs) {
+                        l_current_nb_bytes_written = 0;
+                        opj_j2k_write_poc_in_memory(p_j2k,p_data,&l_current_nb_bytes_written,p_manager);
+                        l_nb_bytes_written += l_current_nb_bytes_written;
+                        p_data += l_current_nb_bytes_written;
+                        p_total_data_size -= l_current_nb_bytes_written;
+                }
+        }
+
+        l_current_nb_bytes_written = 0;
+        if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {
+                return OPJ_FALSE;
+        }
+
+        l_nb_bytes_written += l_current_nb_bytes_written;
+        * p_data_written = l_nb_bytes_written;
+
+        /* Writing Psot in SOT marker */
+        opj_write_bytes(l_begin_data + 6,l_nb_bytes_written,4);                                 /* PSOT */
+
+        if (l_cp->m_specific_param.m_enc.m_cinema){
+                opj_j2k_update_tlm(p_j2k,l_nb_bytes_written);
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_all_tile_parts(  opj_j2k_t *p_j2k,
+                                                                        OPJ_BYTE * p_data,
+                                                                        OPJ_UINT32 * p_data_written,
+                                                                        OPJ_UINT32 p_total_data_size,
+                                                                        opj_stream_private_t *p_stream,
+                                                                        struct opj_event_mgr * p_manager
+                                                                )
+{
+        OPJ_UINT32 tilepartno=0;
+        OPJ_UINT32 l_nb_bytes_written = 0;
+        OPJ_UINT32 l_current_nb_bytes_written;
+        OPJ_UINT32 l_part_tile_size;
+        OPJ_UINT32 tot_num_tp;
+        OPJ_UINT32 pino;
+
+        OPJ_BYTE * l_begin_data;
+        opj_tcp_t *l_tcp = 00;
+        opj_tcd_t * l_tcd = 00;
+        opj_cp_t * l_cp = 00;
+
+        l_tcd = p_j2k->m_tcd;
+        l_cp = &(p_j2k->m_cp);
+        l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
+
+        /*Get number of tile parts*/
+        tot_num_tp = opj_j2k_get_num_tp(l_cp,0,p_j2k->m_current_tile_number);
+
+        /* start writing remaining tile parts */
+        ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
+        for (tilepartno = 1; tilepartno < tot_num_tp ; ++tilepartno) {
+                p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
+                l_current_nb_bytes_written = 0;
+                l_part_tile_size = 0;
+                l_begin_data = p_data;
+
+                if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) {
+                        return OPJ_FALSE;
+                }
+
+                l_nb_bytes_written += l_current_nb_bytes_written;
+                p_data += l_current_nb_bytes_written;
+                p_total_data_size -= l_current_nb_bytes_written;
+                l_part_tile_size += l_current_nb_bytes_written;
+
+                l_current_nb_bytes_written = 0;
+                if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {
+                        return OPJ_FALSE;
+                }
+
+                p_data += l_current_nb_bytes_written;
+                l_nb_bytes_written += l_current_nb_bytes_written;
+                p_total_data_size -= l_current_nb_bytes_written;
+                l_part_tile_size += l_current_nb_bytes_written;
+
+                /* Writing Psot in SOT marker */
+                opj_write_bytes(l_begin_data + 6,l_part_tile_size,4);                                   /* PSOT */
+
+                if (l_cp->m_specific_param.m_enc.m_cinema) {
+                        opj_j2k_update_tlm(p_j2k,l_part_tile_size);
+                }
+
+                ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
+        }
+
+        for (pino = 1; pino <= l_tcp->numpocs; ++pino) {
+                l_tcd->cur_pino = pino;
+
+                /*Get number of tile parts*/
+                tot_num_tp = opj_j2k_get_num_tp(l_cp,pino,p_j2k->m_current_tile_number);
+                for (tilepartno = 0; tilepartno < tot_num_tp ; ++tilepartno) {
+                        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
+                        l_current_nb_bytes_written = 0;
+                        l_part_tile_size = 0;
+                        l_begin_data = p_data;
+
+                        if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) {
+                                return OPJ_FALSE;
+                        }
+
+                        l_nb_bytes_written += l_current_nb_bytes_written;
+                        p_data += l_current_nb_bytes_written;
+                        p_total_data_size -= l_current_nb_bytes_written;
+                        l_part_tile_size += l_current_nb_bytes_written;
+
+                        l_current_nb_bytes_written = 0;
+
+                        if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {
+                                return OPJ_FALSE;
+                        }
+
+                        l_nb_bytes_written += l_current_nb_bytes_written;
+                        p_data += l_current_nb_bytes_written;
+                        p_total_data_size -= l_current_nb_bytes_written;
+                        l_part_tile_size += l_current_nb_bytes_written;
+
+                        /* Writing Psot in SOT marker */
+                        opj_write_bytes(l_begin_data + 6,l_part_tile_size,4);                                   /* PSOT */
+
+                        if (l_cp->m_specific_param.m_enc.m_cinema) {
+                                opj_j2k_update_tlm(p_j2k,l_part_tile_size);
+                        }
+
+                        ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
+                }
+        }
+
+        *p_data_written = l_nb_bytes_written;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_updated_tlm( opj_j2k_t *p_j2k,
+                                                                    struct opj_stream_private *p_stream,
+                                                                    struct opj_event_mgr * p_manager )
+{
+        OPJ_UINT32 l_tlm_size;
+        OPJ_OFF_T l_tlm_position, l_current_position;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        l_tlm_size = 5 * p_j2k->m_specific_param.m_encoder.m_total_tile_parts;
+        l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start;
+        l_current_position = opj_stream_tell(p_stream);
+
+        if (! opj_stream_seek(p_stream,l_tlm_position,p_manager)) {
+                return OPJ_FALSE;
+        }
+
+        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer,l_tlm_size,p_manager) != l_tlm_size) {
+                return OPJ_FALSE;
+        }
+
+        if (! opj_stream_seek(p_stream,l_current_position,p_manager)) {
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_end_encoding(  opj_j2k_t *p_j2k,
+                                                        struct opj_stream_private *p_stream,
+                                                        struct opj_event_mgr * p_manager )
+{
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        opj_tcd_destroy(p_j2k->m_tcd);
+        p_j2k->m_tcd = 00;
+
+        if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
+                opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
+                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0;
+                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0;
+        }
+
+        if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
+                opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
+                p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0;
+        }
+
+        p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0;
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Destroys the memory associated with the decoding of headers.
+ */
+static OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k,
+                                                opj_stream_private_t *p_stream,
+                                                opj_event_mgr_t * p_manager
+                                                )
+{
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_stream != 00);
+        assert(p_manager != 00);
+
+        if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
+                opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+                p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;
+        }
+
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_init_info(     opj_j2k_t *p_j2k,
+                                                struct opj_stream_private *p_stream,
+                                                struct opj_event_mgr * p_manager )
+{
+        opj_codestream_info_t * l_cstr_info = 00;
+
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+  (void)l_cstr_info;
+
+        /* TODO mergeV2: check this part which use cstr_info */
+        /*l_cstr_info = p_j2k->cstr_info;
+
+        if (l_cstr_info)  {
+                OPJ_UINT32 compno;
+                l_cstr_info->tile = (opj_tile_info_t *) opj_malloc(p_j2k->m_cp.tw * p_j2k->m_cp.th * sizeof(opj_tile_info_t));
+
+                l_cstr_info->image_w = p_j2k->m_image->x1 - p_j2k->m_image->x0;
+                l_cstr_info->image_h = p_j2k->m_image->y1 - p_j2k->m_image->y0;
+
+                l_cstr_info->prog = (&p_j2k->m_cp.tcps[0])->prg;
+
+                l_cstr_info->tw = p_j2k->m_cp.tw;
+                l_cstr_info->th = p_j2k->m_cp.th;
+
+                l_cstr_info->tile_x = p_j2k->m_cp.tdx;*/        /* new version parser */
+                /*l_cstr_info->tile_y = p_j2k->m_cp.tdy;*/      /* new version parser */
+                /*l_cstr_info->tile_Ox = p_j2k->m_cp.tx0;*/     /* new version parser */
+                /*l_cstr_info->tile_Oy = p_j2k->m_cp.ty0;*/     /* new version parser */
+
+                /*l_cstr_info->numcomps = p_j2k->m_image->numcomps;
+
+                l_cstr_info->numlayers = (&p_j2k->m_cp.tcps[0])->numlayers;
+
+                l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(p_j2k->m_image->numcomps * sizeof(OPJ_INT32));
+
+                for (compno=0; compno < p_j2k->m_image->numcomps; compno++) {
+                        l_cstr_info->numdecompos[compno] = (&p_j2k->m_cp.tcps[0])->tccps->numresolutions - 1;
+                }
+
+                l_cstr_info->D_max = 0.0;       */      /* ADD Marcela */
+
+                /*l_cstr_info->main_head_start = opj_stream_tell(p_stream);*/ /* position of SOC */
+
+                /*l_cstr_info->maxmarknum = 100;
+                l_cstr_info->marker = (opj_marker_info_t *) opj_malloc(l_cstr_info->maxmarknum * sizeof(opj_marker_info_t));
+                l_cstr_info->marknum = 0;
+        }*/
+
+        return opj_j2k_calculate_tp(p_j2k,&(p_j2k->m_cp),&p_j2k->m_specific_param.m_encoder.m_total_tile_parts,p_j2k->m_private_image,p_manager);
+}
+
+/**
+ * Creates a tile-coder decoder.
+ *
+ * @param       p_stream                the stream to write data to.
+ * @param       p_j2k                   J2K codec.
+ * @param       p_manager               the user event manager.
+*/
+static OPJ_BOOL opj_j2k_create_tcd(     opj_j2k_t *p_j2k,
+                                                                    opj_stream_private_t *p_stream,
+                                                                    opj_event_mgr_t * p_manager
+                                    )
+{
+        /* preconditions */
+        assert(p_j2k != 00);
+        assert(p_manager != 00);
+        assert(p_stream != 00);
+
+        p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE);
+
+        if (! p_j2k->m_tcd) {
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to create Tile Coder\n");
+                return OPJ_FALSE;
+        }
+
+        if (!opj_tcd_init(p_j2k->m_tcd,p_j2k->m_private_image,&p_j2k->m_cp)) {
+                opj_tcd_destroy(p_j2k->m_tcd);
+                p_j2k->m_tcd = 00;
+                return OPJ_FALSE;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_tile (opj_j2k_t * p_j2k,
+                                                 OPJ_UINT32 p_tile_index,
+                                                 OPJ_BYTE * p_data,
+                                                 OPJ_UINT32 p_data_size,
+                                                 opj_stream_private_t *p_stream,
+                                                 opj_event_mgr_t * p_manager )
+{
+        if (! opj_j2k_pre_write_tile(p_j2k,p_tile_index,p_stream,p_manager)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error while opj_j2k_pre_write_tile with tile index = %d\n", p_tile_index);
+                return OPJ_FALSE;
+        }
+        else {
+                if (! opj_j2k_post_write_tile(p_j2k,p_data,p_data_size,p_stream,p_manager)) {
+                        opj_event_msg(p_manager, EVT_ERROR, "Error while opj_j2k_post_write_tile with tile index = %d\n", p_tile_index);
+                        return OPJ_FALSE;
+                }
+        }
+
+        return OPJ_TRUE;
+}
+
+#ifdef _FOXIT_MEM_MANAGER_
+/** Allocate number of bytes */
+void*	FXMEM_DefaultAlloc(int byte_size, int flags);
+void*	FXMEM_DefaultRealloc(void* pointer, int new_size, int flags);
+void	FXMEM_DefaultFree(void* pointer, int flags);
+
+void* opj_malloc(size_t size)
+{
+	if (size >= (size_t)-0x100 || (int)size < 0) return NULL;
+
+	return FXMEM_DefaultAlloc(size, 0);
+}
+
+void* opj_calloc(size_t _NumOfElements, size_t _SizeOfElements)
+{
+	void* buffer = NULL;
+
+	if (_NumOfElements != 0 && _NumOfElements >= (size_t)-0x100 / _SizeOfElements) return NULL;
+	if ((int)_NumOfElements < 0 || (int)_SizeOfElements < 0) return NULL;
+
+	buffer = FXMEM_DefaultAlloc(_NumOfElements * _SizeOfElements, 0);
+	if (!buffer) return 0;
+
+	memset(buffer, 0, _NumOfElements * _SizeOfElements);
+	return buffer;
+}
+
+void* opj_realloc(void * m, size_t s)
+{
+	if (s >= (size_t)-0x100 || (int)s < 0) return NULL;
+	return FXMEM_DefaultRealloc(m, s, 0);
+}
+
+void opj_free(void * m)
+{
+	FXMEM_DefaultFree(m, 0);
+}
+
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.h
new file mode 100644
index 0000000..4228bd6
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.h
@@ -0,0 +1,844 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __J2K_H
+#define __J2K_H
+/**
+@file j2k.h
+@brief The JPEG-2000 Codestream Reader/Writer (J2K)
+
+The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.
+*/
+
+/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
+/*@{*/
+
+#define J2K_CP_CSTY_PRT 0x01
+#define J2K_CP_CSTY_SOP 0x02
+#define J2K_CP_CSTY_EPH 0x04
+#define J2K_CCP_CSTY_PRT 0x01
+#define J2K_CCP_CBLKSTY_LAZY 0x01     /**< Selective arithmetic coding bypass */
+#define J2K_CCP_CBLKSTY_RESET 0x02    /**< Reset context probabilities on coding pass boundaries */
+#define J2K_CCP_CBLKSTY_TERMALL 0x04  /**< Termination on each coding pass */
+#define J2K_CCP_CBLKSTY_VSC 0x08      /**< Vertically stripe causal context */
+#define J2K_CCP_CBLKSTY_PTERM 0x10    /**< Predictable termination */
+#define J2K_CCP_CBLKSTY_SEGSYM 0x20   /**< Segmentation symbols are used */
+#define J2K_CCP_QNTSTY_NOQNT 0
+#define J2K_CCP_QNTSTY_SIQNT 1
+#define J2K_CCP_QNTSTY_SEQNT 2
+
+#define OPJ_J2K_DEFAULT_CBLK_DATA_SIZE 8192
+
+/* ----------------------------------------------------------------------- */
+
+#define J2K_MS_SOC 0xff4f	/**< SOC marker value */
+#define J2K_MS_SOT 0xff90	/**< SOT marker value */
+#define J2K_MS_SOD 0xff93	/**< SOD marker value */
+#define J2K_MS_EOC 0xffd9	/**< EOC marker value */
+#define J2K_MS_SIZ 0xff51	/**< SIZ marker value */
+#define J2K_MS_COD 0xff52	/**< COD marker value */
+#define J2K_MS_COC 0xff53	/**< COC marker value */
+#define J2K_MS_RGN 0xff5e	/**< RGN marker value */
+#define J2K_MS_QCD 0xff5c	/**< QCD marker value */
+#define J2K_MS_QCC 0xff5d	/**< QCC marker value */
+#define J2K_MS_POC 0xff5f	/**< POC marker value */
+#define J2K_MS_TLM 0xff55	/**< TLM marker value */
+#define J2K_MS_PLM 0xff57	/**< PLM marker value */
+#define J2K_MS_PLT 0xff58	/**< PLT marker value */
+#define J2K_MS_PPM 0xff60	/**< PPM marker value */
+#define J2K_MS_PPT 0xff61	/**< PPT marker value */
+#define J2K_MS_SOP 0xff91	/**< SOP marker value */
+#define J2K_MS_EPH 0xff92	/**< EPH marker value */
+#define J2K_MS_CRG 0xff63	/**< CRG marker value */
+#define J2K_MS_COM 0xff64	/**< COM marker value */
+#define J2K_MS_CBD 0xff78	/**< CBD marker value */
+#define J2K_MS_MCC 0xff75	/**< MCC marker value */
+#define J2K_MS_MCT 0xff74	/**< MCT marker value */
+#define J2K_MS_MCO 0xff77	/**< MCO marker value */
+
+#define J2K_MS_UNK 0		/**< UNKNOWN marker value */
+
+/* UniPG>> */
+#ifdef USE_JPWL
+#define J2K_MS_EPC 0xff68	/**< EPC marker value (Part 11: JPEG 2000 for Wireless) */
+#define J2K_MS_EPB 0xff66	/**< EPB marker value (Part 11: JPEG 2000 for Wireless) */ 
+#define J2K_MS_ESD 0xff67	/**< ESD marker value (Part 11: JPEG 2000 for Wireless) */ 
+#define J2K_MS_RED 0xff69	/**< RED marker value (Part 11: JPEG 2000 for Wireless) */
+#endif /* USE_JPWL */
+#ifdef USE_JPSEC
+#define J2K_MS_SEC 0xff65    /**< SEC marker value (Part 8: Secure JPEG 2000) */
+#define J2K_MS_INSEC 0xff94  /**< INSEC marker value (Part 8: Secure JPEG 2000) */
+#endif /* USE_JPSEC */
+/* <<UniPG */
+
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Values that specify the status of the decoding process when decoding the main header.
+ * These values may be combined with a | operator.
+ * */
+typedef enum J2K_STATUS {
+	J2K_STATE_NONE  =  0x0000, /**< a SOC marker is expected */
+	J2K_STATE_MHSOC  = 0x0001, /**< a SOC marker is expected */
+	J2K_STATE_MHSIZ  = 0x0002, /**< a SIZ marker is expected */
+	J2K_STATE_MH     = 0x0004, /**< the decoding process is in the main header */
+	J2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */
+	J2K_STATE_TPH    = 0x0010, /**< the decoding process is in a tile part header */
+	J2K_STATE_MT     = 0x0020, /**< the EOC marker has just been read */
+	J2K_STATE_NEOC   = 0x0040, /**< the decoding process must not expect a EOC marker because the codestream is truncated */
+
+	J2K_STATE_EOC	 = 0x0100, /**< the decoding process has encountered the EOC marker */
+	J2K_STATE_ERR    = 0x8000  /**< the decoding process has encountered an error (FIXME warning V1 = 0x0080)*/
+} J2K_STATUS;
+
+/**
+ * Type of elements storing in the MCT data
+ */
+typedef enum MCT_ELEMENT_TYPE
+{
+	MCT_TYPE_INT16 = 0,		/** MCT data is stored as signed shorts*/
+	MCT_TYPE_INT32 = 1,		/** MCT data is stored as signed integers*/
+	MCT_TYPE_FLOAT = 2,		/** MCT data is stored as floats*/
+	MCT_TYPE_DOUBLE = 3		/** MCT data is stored as doubles*/
+} J2K_MCT_ELEMENT_TYPE;
+
+/**
+ * Type of MCT array
+ */
+typedef enum MCT_ARRAY_TYPE
+{
+	MCT_TYPE_DEPENDENCY = 0,
+	MCT_TYPE_DECORRELATION = 1,
+	MCT_TYPE_OFFSET = 2
+} J2K_MCT_ARRAY_TYPE;
+
+/* ----------------------------------------------------------------------- */
+
+/** 
+T2 encoding mode 
+*/
+typedef enum T2_MODE {
+	THRESH_CALC = 0,	/** Function called in Rate allocation process*/
+	FINAL_PASS = 1		/** Function called in Tier 2 process*/
+}J2K_T2_MODE;
+
+/**
+ * Quantization stepsize
+ */
+typedef struct opj_stepsize {
+	/** exponent */
+	OPJ_INT32 expn;
+	/** mantissa */
+	OPJ_INT32 mant;
+} opj_stepsize_t;
+
+/**
+Tile-component coding parameters
+*/
+typedef struct opj_tccp
+{
+	/** coding style */
+	OPJ_UINT32 csty;
+	/** number of resolutions */
+	OPJ_UINT32 numresolutions;
+	/** code-blocks width */
+	OPJ_UINT32 cblkw;
+	/** code-blocks height */
+	OPJ_UINT32 cblkh;
+	/** code-block coding style */
+	OPJ_UINT32 cblksty;
+	/** discrete wavelet transform identifier */
+	OPJ_UINT32 qmfbid;
+	/** quantisation style */
+	OPJ_UINT32 qntsty;
+	/** stepsizes used for quantization */
+	opj_stepsize_t stepsizes[OPJ_J2K_MAXBANDS];
+	/** number of guard bits */
+	OPJ_UINT32 numgbits;
+	/** Region Of Interest shift */
+	OPJ_INT32 roishift;
+	/** precinct width */
+	OPJ_UINT32 prcw[OPJ_J2K_MAXRLVLS];
+	/** precinct height */
+	OPJ_UINT32 prch[OPJ_J2K_MAXRLVLS];
+	/** the dc_level_shift **/
+	OPJ_INT32 m_dc_level_shift;
+}
+opj_tccp_t;
+
+
+
+/**
+ * FIXME DOC
+ */
+typedef struct opj_mct_data
+{
+	J2K_MCT_ELEMENT_TYPE m_element_type;
+	J2K_MCT_ARRAY_TYPE	 m_array_type;
+	OPJ_UINT32			 m_index;
+	OPJ_BYTE *			 m_data;
+	OPJ_UINT32			 m_data_size;
+}
+opj_mct_data_t;
+
+/**
+ * FIXME DOC
+ */
+typedef struct opj_simple_mcc_decorrelation_data
+{
+	OPJ_UINT32			 m_index;
+	OPJ_UINT32			 m_nb_comps;
+	opj_mct_data_t *	 m_decorrelation_array;
+	opj_mct_data_t *	 m_offset_array;
+	OPJ_UINT32			 m_is_irreversible : 1;
+}
+opj_simple_mcc_decorrelation_data_t;
+
+/**
+Tile coding parameters :
+this structure is used to store coding/decoding parameters common to all
+tiles (information like COD, COC in main header)
+*/
+typedef struct opj_tcp
+{
+	/** coding style */
+	OPJ_UINT32 csty;
+	/** progression order */
+	OPJ_PROG_ORDER prg;
+	/** number of layers */
+	OPJ_UINT32 numlayers;
+	OPJ_UINT32 num_layers_to_decode;
+	/** multi-component transform identifier */
+	OPJ_UINT32 mct;
+	/** rates of layers */
+	OPJ_FLOAT32 rates[100];
+	/** number of progression order changes */
+	OPJ_UINT32 numpocs;
+	/** progression order changes */
+	opj_poc_t pocs[32];
+	/** packet header store there for futur use in t2_decode_packet */
+	OPJ_BYTE *ppt_data;
+	/** used to keep a track of the allocated memory */
+	OPJ_BYTE *ppt_buffer;
+	/** Number of bytes stored inside ppt_data*/
+	OPJ_UINT32 ppt_data_size;
+	/** size of ppt_data*/
+	OPJ_UINT32 ppt_len;
+	/** add fixed_quality */
+	OPJ_FLOAT32 distoratio[100];
+	/** tile-component coding parameters */
+	opj_tccp_t *tccps;
+	/** number of tile parts for the tile. */
+	OPJ_UINT32 m_nb_tile_parts;
+	/** data for the tile */
+	OPJ_BYTE *		m_data;
+	/** size of data */
+	OPJ_UINT32		m_data_size;
+	/** encoding norms */
+	OPJ_FLOAT64 *	mct_norms;
+	/** the mct decoding matrix */
+	OPJ_FLOAT32 *	m_mct_decoding_matrix;
+	/** the mct coding matrix */
+	OPJ_FLOAT32 *	m_mct_coding_matrix;
+	/** mct records */
+	opj_mct_data_t * m_mct_records;
+	/** the number of mct records. */
+	OPJ_UINT32 m_nb_mct_records;
+	/** the max number of mct records. */
+	OPJ_UINT32 m_nb_max_mct_records;
+	/** mcc records */
+	opj_simple_mcc_decorrelation_data_t * m_mcc_records;
+	/** the number of mct records. */
+	OPJ_UINT32 m_nb_mcc_records;
+	/** the max number of mct records. */
+	OPJ_UINT32 m_nb_max_mcc_records;
+
+
+	/***** FLAGS *******/
+	/** If ppt == 1 --> there was a PPT marker for the present tile */
+	OPJ_UINT32 ppt : 1;
+	/** indicates if a POC marker has been used O:NO, 1:YES */
+	OPJ_UINT32 POC : 1;
+} opj_tcp_t;
+
+
+
+
+typedef struct opj_encoding_param
+{
+	/** Digital cinema profile*/
+	OPJ_CINEMA_MODE m_cinema;
+	/** Maximum rate for each component. If == 0, component size limitation is not considered */
+	OPJ_UINT32 m_max_comp_size;
+	/** Position of tile part flag in progression order*/
+	OPJ_INT32 m_tp_pos;
+	/** fixed layer */
+	OPJ_INT32 *m_matrice;
+	/** Flag determining tile part generation*/
+	OPJ_BYTE m_tp_flag;
+	/** allocation by rate/distortion */
+	OPJ_UINT32 m_disto_alloc : 1;
+	/** allocation by fixed layer */
+	OPJ_UINT32 m_fixed_alloc : 1;
+	/** add fixed_quality */
+	OPJ_UINT32 m_fixed_quality : 1;
+	/** Enabling Tile part generation*/
+	OPJ_UINT32 m_tp_on : 1;
+}
+opj_encoding_param_t;
+
+typedef struct opj_decoding_param
+{
+	/** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
+	OPJ_UINT32 m_reduce;
+	/** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
+	OPJ_UINT32 m_layer;
+}
+opj_decoding_param_t;
+
+
+/**
+ * Coding parameters
+ */
+typedef struct opj_cp
+{
+	/** Size of the image in bits*/
+	/*int img_size;*/
+	/** Rsiz*/
+	OPJ_RSIZ_CAPABILITIES rsiz;
+	/** XTOsiz */
+	OPJ_UINT32 tx0; /* MSD see norm */
+	/** YTOsiz */
+	OPJ_UINT32 ty0; /* MSD see norm */
+	/** XTsiz */
+	OPJ_UINT32 tdx;
+	/** YTsiz */
+	OPJ_UINT32 tdy;
+	/** comment */
+	OPJ_CHAR *comment;
+	/** number of tiles in width */
+	OPJ_UINT32 tw;
+	/** number of tiles in heigth */
+	OPJ_UINT32 th;
+
+	/** packet header store there for futur use in t2_decode_packet */
+	OPJ_BYTE *ppm_data;
+	/** size of the ppm_data*/
+	OPJ_UINT32 ppm_len;
+	/** size of the ppm_data*/
+	OPJ_UINT32 ppm_data_read;
+
+	OPJ_BYTE *ppm_data_current;
+
+	/** packet header storage original buffer */
+	OPJ_BYTE *ppm_buffer;
+	/** pointer remaining on the first byte of the first header if ppm is used */
+	OPJ_BYTE *ppm_data_first;
+	/** Number of bytes actually stored inside the ppm_data */
+	OPJ_UINT32 ppm_data_size;
+	/** use in case of multiple marker PPM (number of info already store) */
+	OPJ_INT32 ppm_store;
+	/** use in case of multiple marker PPM (case on non-finished previous info) */
+	OPJ_INT32 ppm_previous;
+
+	/** tile coding parameters */
+	opj_tcp_t *tcps;
+
+	union
+	{
+		opj_decoding_param_t m_dec;
+		opj_encoding_param_t m_enc;
+	}
+	m_specific_param;
+
+
+/* UniPG>> */
+#ifdef USE_JPWL
+	/** enables writing of EPC in MH, thus activating JPWL */
+	OPJ_BOOL epc_on;
+	/** enables writing of EPB, in case of activated JPWL */
+	OPJ_BOOL epb_on;
+	/** enables writing of ESD, in case of activated JPWL */
+	OPJ_BOOL esd_on;
+	/** enables writing of informative techniques of ESD, in case of activated JPWL */
+	OPJ_BOOL info_on;
+	/** enables writing of RED, in case of activated JPWL */
+	OPJ_BOOL red_on;
+	/** error protection method for MH (0,1,16,32,37-128) */
+	int hprot_MH;
+	/** tile number of header protection specification (>=0) */
+	int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+	/** error protection methods for TPHs (0,1,16,32,37-128) */
+	int hprot_TPH[JPWL_MAX_NO_TILESPECS];
+	/** tile number of packet protection specification (>=0) */
+	int pprot_tileno[JPWL_MAX_NO_PACKSPECS];
+	/** packet number of packet protection specification (>=0) */
+	int pprot_packno[JPWL_MAX_NO_PACKSPECS];
+	/** error protection methods for packets (0,1,16,32,37-128) */
+	int pprot[JPWL_MAX_NO_PACKSPECS];
+	/** enables writing of ESD, (0/2/4 bytes) */
+	int sens_size;
+	/** sensitivity addressing size (0=auto/2/4 bytes) */
+	int sens_addr;
+	/** sensitivity range (0-3) */
+	int sens_range;
+	/** sensitivity method for MH (-1,0-7) */
+	int sens_MH;
+	/** tile number of sensitivity specification (>=0) */
+	int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+	/** sensitivity methods for TPHs (-1,0-7) */
+	int sens_TPH[JPWL_MAX_NO_TILESPECS];
+	/** enables JPWL correction at the decoder */
+	OPJ_BOOL correct;
+	/** expected number of components at the decoder */
+	int exp_comps;
+	/** maximum number of tiles at the decoder */
+	OPJ_UINT32 max_tiles;
+#endif /* USE_JPWL */
+
+	/******** FLAGS *********/
+	/** if ppm == 1 --> there was a PPM marker*/
+	OPJ_UINT32 ppm : 1;
+	/** tells if the parameter is a coding or decoding one */
+	OPJ_UINT32 m_is_decoder : 1;
+/* <<UniPG */
+} opj_cp_t;
+
+
+typedef struct opj_j2k_dec
+{
+	/** locate in which part of the codestream the decoder is (main header, tile header, end) */
+	OPJ_UINT32 m_state;
+	/**
+	 * store decoding parameters common to all tiles (information like COD, COC in main header)
+	 */
+	opj_tcp_t *m_default_tcp;
+	OPJ_BYTE  *m_header_data;
+	OPJ_UINT32 m_header_data_size;
+	/** to tell the tile part length */
+	OPJ_UINT32 m_sot_length;
+	/** Only tiles index in the correct range will be decoded.*/
+	OPJ_UINT32 m_start_tile_x;
+	OPJ_UINT32 m_start_tile_y;
+	OPJ_UINT32 m_end_tile_x;
+	OPJ_UINT32 m_end_tile_y;
+	/**
+	 * Decoded area set by the user
+	 */
+	OPJ_UINT32 m_DA_x0;
+	OPJ_UINT32 m_DA_y0;
+	OPJ_UINT32 m_DA_x1;
+	OPJ_UINT32 m_DA_y1;
+
+	/** Index of the tile to decode (used in get_tile) */
+	OPJ_INT32 m_tile_ind_to_dec;
+	/** Position of the last SOT marker read */
+	OPJ_OFF_T m_last_sot_read_pos;
+
+	/**
+	 * Indicate that the current tile-part is assume as the last tile part of the codestream.
+	 * It is useful in the case of PSot is equal to zero. The sot length will be compute in the
+	 * SOD reader function. FIXME NOT USED for the moment
+	 */
+	OPJ_BOOL   m_last_tile_part;
+	/** to tell that a tile can be decoded. */
+	OPJ_UINT32 m_can_decode			: 1;
+	OPJ_UINT32 m_discard_tiles		: 1;
+	OPJ_UINT32 m_skip_data			: 1;
+
+} opj_j2k_dec_t;
+
+typedef struct opj_j2k_enc
+{
+	/** Tile part number, regardless of poc, for each new poc, tp is reset to 1*/
+	OPJ_UINT32 m_current_poc_tile_part_number; /* tp_num */
+
+	/** Tile part number currently coding, taking into account POC. m_current_tile_part_number holds the total number of tile parts while encoding the last tile part.*/
+	OPJ_UINT32 m_current_tile_part_number; /*cur_tp_num */
+
+	/**
+	locate the start position of the TLM marker
+	after encoding the tilepart, a jump (in j2k_write_sod) is done to the TLM marker to store the value of its length.
+	*/
+    OPJ_OFF_T m_tlm_start;
+	/**
+	 * Stores the sizes of the tlm.
+	 */
+	OPJ_BYTE * m_tlm_sot_offsets_buffer;
+	/**
+	 * The current offset of the tlm buffer.
+	 */
+	OPJ_BYTE * m_tlm_sot_offsets_current;
+
+	/** Total num of tile parts in whole image = num tiles* num tileparts in each tile*/
+	/** used in TLMmarker*/
+	OPJ_UINT32 m_total_tile_parts;	 /* totnum_tp */
+
+	/* encoded data for a tile */
+	OPJ_BYTE * m_encoded_tile_data;
+
+	/* size of the encoded_data */
+	OPJ_UINT32 m_encoded_tile_size;
+
+	/* encoded data for a tile */
+	OPJ_BYTE * m_header_tile_data;
+
+	/* size of the encoded_data */
+	OPJ_UINT32 m_header_tile_data_size;
+
+
+} opj_j2k_enc_t;
+
+
+
+struct opj_tcd;
+/**
+JPEG-2000 codestream reader/writer
+*/
+typedef struct opj_j2k
+{
+	/* J2K codestream is decoded*/
+	OPJ_BOOL m_is_decoder;
+
+	/* FIXME DOC*/
+	union
+	{
+		opj_j2k_dec_t m_decoder;
+		opj_j2k_enc_t m_encoder;
+	}
+	m_specific_param;
+
+	/** pointer to the internal/private encoded / decoded image */
+	opj_image_t* m_private_image;
+
+	/* pointer to the output image (decoded)*/
+	opj_image_t* m_output_image;
+
+	/** Coding parameters */
+	opj_cp_t m_cp;
+
+	/** the list of procedures to exec **/
+	opj_procedure_list_t *	m_procedure_list;
+
+	/** the list of validation procedures to follow to make sure the code is valid **/
+	opj_procedure_list_t *	m_validation_list;
+
+	/** helper used to write the index file */
+	opj_codestream_index_t *cstr_index;
+
+	/** number of the tile curently concern by coding/decoding */
+	OPJ_UINT32 m_current_tile_number;
+
+	/** the current tile coder/decoder **/
+	struct opj_tcd *	m_tcd;
+
+}
+opj_j2k_t;
+
+
+
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Setup the decoder decoding parameters using user parameters.
+Decoding parameters are returned in j2k->cp. 
+@param j2k J2K decompressor handle
+@param parameters decompression parameters
+*/
+void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
+
+/**
+ * Creates a J2K compression structure
+ *
+ * @return Returns a handle to a J2K compressor if successful, returns NULL otherwise
+*/
+opj_j2k_t* opj_j2k_create_compress(void);
+
+
+void opj_j2k_setup_encoder(	opj_j2k_t *p_j2k,
+						    opj_cparameters_t *parameters,
+						    opj_image_t *image,
+						    opj_event_mgr_t * p_manager);
+
+/**
+Converts an enum type progression order to string type
+*/
+char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order);
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+/**
+ * Ends the decompression procedures and possibiliy add data to be read after the
+ * codestream.
+ */
+OPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *j2k,
+                                opj_stream_private_t *p_stream,
+                                opj_event_mgr_t * p_manager);
+
+/**
+ * Reads a jpeg2000 codestream header structure.
+ *
+ * @param p_stream the stream to read data from.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_image FIXME DOC
+ * @param p_manager the user event manager.
+ *
+ * @return true if the box is valid.
+ */
+OPJ_BOOL opj_j2k_read_header(	opj_stream_private_t *p_stream,
+                                opj_j2k_t* p_j2k,
+                                opj_image_t** p_image,
+                                opj_event_mgr_t* p_manager );
+
+
+/**
+ * Destroys a jpeg2000 codec.
+ *
+ * @param	p_j2k	the jpeg20000 structure to destroy.
+ */
+void opj_j2k_destroy (opj_j2k_t *p_j2k);
+
+/**
+ * Destroys a codestream index structure.
+ *
+ * @param	p_cstr_ind	the codestream index parameter to destroy.
+ */
+void j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind);
+
+/**
+ * Decode tile data.
+ * @param	p_j2k		the jpeg2000 codec.
+ * @param	p_tile_index
+ * @param p_data       FIXME DOC
+ * @param p_data_size  FIXME DOC
+ * @param	p_stream			the stream to write data to.
+ * @param	p_manager	the user event manager.
+ */
+OPJ_BOOL opj_j2k_decode_tile (  opj_j2k_t * p_j2k,
+                                OPJ_UINT32 p_tile_index,
+                                OPJ_BYTE * p_data,
+                                OPJ_UINT32 p_data_size,
+                                opj_stream_private_t *p_stream,
+                                opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a tile header.
+ * @param	p_j2k		the jpeg2000 codec.
+ * @param	p_tile_index FIXME DOC
+ * @param	p_data_size FIXME DOC
+ * @param	p_tile_x0 FIXME DOC
+ * @param	p_tile_y0 FIXME DOC
+ * @param	p_tile_x1 FIXME DOC
+ * @param	p_tile_y1 FIXME DOC
+ * @param	p_nb_comps FIXME DOC
+ * @param	p_go_on FIXME DOC
+ * @param	p_stream			the stream to write data to.
+ * @param	p_manager	the user event manager.
+ */
+OPJ_BOOL opj_j2k_read_tile_header ( opj_j2k_t * p_j2k,
+                                    OPJ_UINT32 * p_tile_index,
+                                    OPJ_UINT32 * p_data_size,
+                                    OPJ_INT32 * p_tile_x0,
+                                    OPJ_INT32 * p_tile_y0,
+                                    OPJ_INT32 * p_tile_x1,
+                                    OPJ_INT32 * p_tile_y1,
+                                    OPJ_UINT32 * p_nb_comps,
+                                    OPJ_BOOL * p_go_on,
+                                    opj_stream_private_t *p_stream,
+                                    opj_event_mgr_t * p_manager );
+
+
+/**
+ * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.
+ *
+ * @param	p_j2k			the jpeg2000 codec.
+ * @param	p_image     FIXME DOC
+ * @param	p_start_x		the left position of the rectangle to decode (in image coordinates).
+ * @param	p_start_y		the up position of the rectangle to decode (in image coordinates).
+ * @param	p_end_x			the right position of the rectangle to decode (in image coordinates).
+ * @param	p_end_y			the bottom position of the rectangle to decode (in image coordinates).
+ * @param	p_manager		the user event manager
+ *
+ * @return	true			if the area could be set.
+ */
+OPJ_BOOL opj_j2k_set_decode_area(	opj_j2k_t *p_j2k,
+								    opj_image_t* p_image,
+								    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+								    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
+								    opj_event_mgr_t * p_manager );
+
+/**
+ * Creates a J2K decompression structure.
+ *
+ * @return a handle to a J2K decompressor if successful, NULL otherwise.
+ */
+opj_j2k_t* opj_j2k_create_decompress(void);
+
+
+/**
+ * Dump some elements from the J2K decompression structure .
+ *
+ *@param p_j2k				the jpeg2000 codec.
+ *@param flag				flag to describe what elments are dump.
+ *@param out_stream			output stream where dump the elements.
+ *
+*/
+void j2k_dump (opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream);
+
+
+
+/**
+ * Dump an image header structure.
+ *
+ *@param image			the image header to dump.
+ *@param dev_dump_flag		flag to describe if we are in the case of this function is use outside j2k_dump function
+ *@param out_stream			output stream where dump the elements.
+ */
+void j2k_dump_image_header(opj_image_t* image, OPJ_BOOL dev_dump_flag, FILE* out_stream);
+
+/**
+ * Dump a component image header structure.
+ *
+ *@param comp		the component image header to dump.
+ *@param dev_dump_flag		flag to describe if we are in the case of this function is use outside j2k_dump function
+ *@param out_stream			output stream where dump the elements.
+ */
+void j2k_dump_image_comp_header(opj_image_comp_t* comp, OPJ_BOOL dev_dump_flag, FILE* out_stream);
+
+/**
+ * Get the codestream info from a JPEG2000 codec.
+ *
+ *@param	p_j2k				the component image header to dump.
+ *
+ *@return	the codestream information extract from the jpg2000 codec
+ */
+opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k);
+
+/**
+ * Get the codestream index from a JPEG2000 codec.
+ *
+ *@param	p_j2k				the component image header to dump.
+ *
+ *@return	the codestream index extract from the jpg2000 codec
+ */
+opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k);
+
+/**
+ * Decode an image from a JPEG-2000 codestream
+ * @param j2k J2K decompressor handle
+ * @param p_stream  FIXME DOC
+ * @param p_image   FIXME DOC
+ * @param p_manager FIXME DOC
+ * @return FIXME DOC
+*/
+OPJ_BOOL opj_j2k_decode(opj_j2k_t *j2k,
+                        opj_stream_private_t *p_stream,
+                        opj_image_t *p_image,
+                        opj_event_mgr_t *p_manager);
+
+
+OPJ_BOOL opj_j2k_get_tile(	opj_j2k_t *p_j2k,
+			    			opj_stream_private_t *p_stream,
+				    		opj_image_t* p_image,
+					    	opj_event_mgr_t * p_manager,
+						    OPJ_UINT32 tile_index );
+
+OPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k, 
+                                               OPJ_UINT32 res_factor,
+                                               opj_event_mgr_t * p_manager);
+
+
+/**
+ * Writes a tile.
+ * @param	p_j2k		the jpeg2000 codec.
+ * @param p_tile_index FIXME DOC
+ * @param p_data FIXME DOC
+ * @param p_data_size FIXME DOC
+ * @param	p_stream			the stream to write data to.
+ * @param	p_manager	the user event manager.
+ */
+OPJ_BOOL opj_j2k_write_tile (	opj_j2k_t * p_j2k,
+							    OPJ_UINT32 p_tile_index,
+							    OPJ_BYTE * p_data,
+							    OPJ_UINT32 p_data_size,
+							    opj_stream_private_t *p_stream,
+							    opj_event_mgr_t * p_manager );
+
+/**
+ * Encodes an image into a JPEG-2000 codestream
+ */
+OPJ_BOOL opj_j2k_encode(	opj_j2k_t * p_j2k,
+			    			opj_stream_private_t *cio,
+				    		opj_event_mgr_t * p_manager );
+
+/**
+ * Starts a compression scheme, i.e. validates the codec parameters, writes the header.
+ *
+ * @param	p_j2k		the jpeg2000 codec.
+ * @param	p_stream			the stream object.
+ * @param	p_image FIXME DOC
+ * @param	p_manager	the user event manager.
+ *
+ * @return true if the codec is valid.
+ */
+OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,
+							    opj_stream_private_t *p_stream,
+							    opj_image_t * p_image,
+							    opj_event_mgr_t * p_manager);
+
+/**
+ * Ends the compression procedures and possibiliy add data to be read after the
+ * codestream.
+ */
+OPJ_BOOL opj_j2k_end_compress( 	opj_j2k_t *p_j2k,
+							    opj_stream_private_t *cio,
+							    opj_event_mgr_t * p_manager);
+
+OPJ_BOOL opj_j2k_setup_mct_encoding (opj_tcp_t * p_tcp, opj_image_t * p_image);
+
+
+#endif /* __J2K_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c
new file mode 100644
index 0000000..0a16d1e
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c
@@ -0,0 +1,2825 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "opj_includes.h"
+
+/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
+/*@{*/
+
+#define OPJ_BOX_SIZE	1024
+
+/** @name Local static functions */
+/*@{*/
+
+/*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/
+
+/**
+ * Reads a IHDR box - Image Header box
+ *
+ * @param	p_image_header_data			pointer to actual data (already read from file)
+ * @param	jp2							the jpeg2000 file codec.
+ * @param	p_image_header_size			the size of the image header
+ * @param	p_manager					the user event manager.
+ *
+ * @return	true if the image header is valid, false else.
+ */
+static OPJ_BOOL opj_jp2_read_ihdr(  opj_jp2_t *jp2,
+                                    OPJ_BYTE *p_image_header_data,
+                                    OPJ_UINT32 p_image_header_size,
+                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the Image Header box - Image Header box.
+ *
+ * @param jp2					jpeg2000 file codec.
+ * @param p_nb_bytes_written	pointer to store the nb of bytes written by the function.
+ *
+ * @return	the data being copied.
+*/
+static OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
+                                     OPJ_UINT32 * p_nb_bytes_written );
+
+/**
+ * Writes the Bit per Component box.
+ *
+ * @param	jp2						jpeg2000 file codec.
+ * @param	p_nb_bytes_written		pointer to store the nb of bytes written by the function.
+ *
+ * @return	the data being copied.
+*/
+static OPJ_BYTE * opj_jp2_write_bpcc(	opj_jp2_t *jp2,
+								        OPJ_UINT32 * p_nb_bytes_written );
+
+/**
+ * Reads a Bit per Component box.
+ *
+ * @param	p_bpc_header_data			pointer to actual data (already read from file)
+ * @param	jp2							the jpeg2000 file codec.
+ * @param	p_bpc_header_size			the size of the bpc header
+ * @param	p_manager					the user event manager.
+ *
+ * @return	true if the bpc header is valid, fale else.
+ */
+static OPJ_BOOL opj_jp2_read_bpcc(  opj_jp2_t *jp2,
+                                    OPJ_BYTE * p_bpc_header_data,
+                                    OPJ_UINT32 p_bpc_header_size,
+                                    opj_event_mgr_t * p_manager );
+
+static OPJ_BOOL opj_jp2_read_cdef(	opj_jp2_t * jp2,
+                                    OPJ_BYTE * p_cdef_header_data,
+									OPJ_UINT32 p_cdef_header_size,
+									opj_event_mgr_t * p_manager );
+
+static void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color);
+
+/**
+ * Writes the Colour Specification box.
+ *
+ * @param jp2					jpeg2000 file codec.
+ * @param p_nb_bytes_written	pointer to store the nb of bytes written by the function.
+ *
+ * @return	the data being copied.
+*/
+static OPJ_BYTE * opj_jp2_write_colr(   opj_jp2_t *jp2,
+									    OPJ_UINT32 * p_nb_bytes_written );
+
+/**
+ * Writes a FTYP box - File type box
+ *
+ * @param	cio			the stream to write data to.
+ * @param	jp2			the jpeg2000 file codec.
+ * @param	p_manager	the user event manager.
+ *
+ * @return	true if writing was successful.
+ */
+static OPJ_BOOL opj_jp2_write_ftyp(	opj_jp2_t *jp2,
+									opj_stream_private_t *cio,
+									opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a a FTYP box - File type box
+ *
+ * @param	p_header_data	the data contained in the FTYP box.
+ * @param	jp2				the jpeg2000 file codec.
+ * @param	p_header_size	the size of the data contained in the FTYP box.
+ * @param	p_manager		the user event manager.
+ *
+ * @return true if the FTYP box is valid.
+ */
+static OPJ_BOOL opj_jp2_read_ftyp(	opj_jp2_t *jp2,
+									OPJ_BYTE * p_header_data,
+									OPJ_UINT32 p_header_size,
+									opj_event_mgr_t * p_manager );
+
+OPJ_BOOL opj_jp2_skip_jp2c(	opj_jp2_t *jp2,
+						    opj_stream_private_t *cio,
+						    opj_event_mgr_t * p_manager );
+
+/**
+ * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
+ *
+ * @param	p_header_data	the data contained in the file header box.
+ * @param	jp2				the jpeg2000 file codec.
+ * @param	p_header_size	the size of the data contained in the file header box.
+ * @param	p_manager		the user event manager.
+ *
+ * @return true if the JP2 Header box was successfully reconized.
+*/
+static OPJ_BOOL opj_jp2_read_jp2h(  opj_jp2_t *jp2,
+                                    OPJ_BYTE *p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the Jpeg2000 codestream Header box - JP2C Header box. This function must be called AFTER the coding has been done.
+ *
+ * @param	cio			the stream to write data to.
+ * @param	jp2			the jpeg2000 file codec.
+ * @param	p_manager	user event manager.
+ *
+ * @return true if writing was successful.
+*/
+static OPJ_BOOL opj_jp2_write_jp2c(	opj_jp2_t *jp2,
+								    opj_stream_private_t *cio,
+								    opj_event_mgr_t * p_manager );
+
+#ifdef USE_JPIP
+/**
+ * Write index Finder box
+ * @param cio     the stream to write to.
+ * @param	jp2			the jpeg2000 file codec.
+ * @param	p_manager	user event manager.
+*/
+static OPJ_BOOL opj_jpip_write_iptr(	opj_jp2_t *jp2,
+								    opj_stream_private_t *cio,
+								    opj_event_mgr_t * p_manager );
+
+/**
+ * Write index Finder box
+ * @param cio     the stream to write to.
+ * @param	jp2			the jpeg2000 file codec.
+ * @param	p_manager	user event manager.
+ */
+static OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,
+  opj_stream_private_t *cio,
+  opj_event_mgr_t * p_manager );
+
+/**
+ * Write file Index (superbox)
+ * @param cio     the stream to write to.
+ * @param	jp2			the jpeg2000 file codec.
+ * @param	p_manager	user event manager.
+ */
+static OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,
+  opj_stream_private_t *cio,
+  opj_event_mgr_t * p_manager );
+#endif /* USE_JPIP */
+
+/**
+ * Reads a jpeg2000 file signature box.
+ *
+ * @param	p_header_data	the data contained in the signature box.
+ * @param	jp2				the jpeg2000 file codec.
+ * @param	p_header_size	the size of the data contained in the signature box.
+ * @param	p_manager		the user event manager.
+ *
+ * @return true if the file signature box is valid.
+ */
+static OPJ_BOOL opj_jp2_read_jp(opj_jp2_t *jp2,
+                                OPJ_BYTE * p_header_data,
+                                OPJ_UINT32 p_header_size,
+                                opj_event_mgr_t * p_manager);
+
+/**
+ * Writes a jpeg2000 file signature box.
+ *
+ * @param cio the stream to write data to.
+ * @param	jp2			the jpeg2000 file codec.
+ * @param p_manager the user event manager.
+ *
+ * @return true if writing was successful.
+ */
+static OPJ_BOOL opj_jp2_write_jp(	opj_jp2_t *jp2,
+			    	        	    opj_stream_private_t *cio,
+				            		opj_event_mgr_t * p_manager );
+
+/**
+Apply collected palette data
+@param color Collector for profile, cdef and pclr data
+@param image
+*/
+static void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color);
+
+static void opj_jp2_free_pclr(opj_jp2_color_t *color);
+
+/**
+ * Collect palette data
+ *
+ * @param jp2 JP2 handle
+ * @param p_pclr_header_data    FIXME DOC
+ * @param p_pclr_header_size    FIXME DOC
+ * @param p_manager
+ *
+ * @return Returns true if successful, returns false otherwise
+*/
+static OPJ_BOOL opj_jp2_read_pclr(	opj_jp2_t *jp2,
+                                    OPJ_BYTE * p_pclr_header_data,
+                                    OPJ_UINT32 p_pclr_header_size,
+                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Collect component mapping data
+ *
+ * @param jp2                 JP2 handle
+ * @param p_cmap_header_data  FIXME DOC
+ * @param p_cmap_header_size  FIXME DOC
+ * @param p_manager           FIXME DOC
+ *
+ * @return Returns true if successful, returns false otherwise
+*/
+
+static OPJ_BOOL opj_jp2_read_cmap(	opj_jp2_t * jp2,
+                                    OPJ_BYTE * p_cmap_header_data,
+                                    OPJ_UINT32 p_cmap_header_size,
+                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Reads the Color Specification box.
+ *
+ * @param	p_colr_header_data			pointer to actual data (already read from file)
+ * @param	jp2							the jpeg2000 file codec.
+ * @param	p_colr_header_size			the size of the color header
+ * @param	p_manager					the user event manager.
+ *
+ * @return	true if the bpc header is valid, fale else.
+*/
+static OPJ_BOOL opj_jp2_read_colr(  opj_jp2_t *jp2,
+                                    OPJ_BYTE * p_colr_header_data,
+                                    OPJ_UINT32 p_colr_header_size,
+                                    opj_event_mgr_t * p_manager );
+
+/*@}*/
+
+/*@}*/
+
+/**
+ * Sets up the procedures to do on writing header after the codestream.
+ * Developpers wanting to extend the library can add their own writing procedures.
+ */
+static void opj_jp2_setup_end_header_writing (opj_jp2_t *jp2);
+
+/**
+ * Sets up the procedures to do on reading header after the codestream.
+ * Developpers wanting to extend the library can add their own writing procedures.
+ */
+static void opj_jp2_setup_end_header_reading (opj_jp2_t *jp2);
+
+/**
+ * Reads a jpeg2000 file header structure.
+ *
+ * @param jp2 the jpeg2000 file header structure.
+ * @param stream the stream to read data from.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the box is valid.
+ */
+static OPJ_BOOL opj_jp2_read_header_procedure(  opj_jp2_t *jp2,
+                                                opj_stream_private_t *stream,
+                                                opj_event_mgr_t * p_manager );
+
+/**
+ * Excutes the given procedures on the given codec.
+ *
+ * @param	p_procedure_list	the list of procedures to execute
+ * @param	jp2					the jpeg2000 file codec to execute the procedures on.
+ * @param	stream					the stream to execute the procedures on.
+ * @param	p_manager			the user manager.
+ *
+ * @return	true				if all the procedures were successfully executed.
+ */
+static OPJ_BOOL opj_jp2_exec (  opj_jp2_t * jp2,
+                                opj_procedure_list_t * p_procedure_list,
+                                opj_stream_private_t *stream,
+                                opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure.
+ *
+ * @param	cio						the input stream to read data from.
+ * @param	box						the box structure to fill.
+ * @param	p_number_bytes_read		pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
+ * @param	p_manager				user event manager.
+ *
+ * @return	true if the box is reconized, false otherwise
+*/
+static OPJ_BOOL opj_jp2_read_boxhdr(opj_jp2_box_t *box,
+                                    OPJ_UINT32 * p_number_bytes_read,
+                                    opj_stream_private_t *cio,
+                                    opj_event_mgr_t * p_manager);
+
+/**
+ * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
+ * are valid. Developpers wanting to extend the library can add their own validation procedures.
+ */
+static void opj_jp2_setup_encoding_validation (opj_jp2_t *jp2);
+
+/**
+ * Sets up the procedures to do on writing header. Developpers wanting to extend the library can add their own writing procedures.
+ */
+static void opj_jp2_setup_header_writing (opj_jp2_t *jp2);
+
+OPJ_BOOL opj_jp2_default_validation (	opj_jp2_t * jp2,
+                                        opj_stream_private_t *cio,
+                                        opj_event_mgr_t * p_manager );
+
+/**
+ * Finds the image execution function related to the given box id.
+ *
+ * @param	p_id	the id of the handler to fetch.
+ *
+ * @return	the given handler or NULL if it could not be found.
+ */
+static const opj_jp2_header_handler_t * opj_jp2_img_find_handler (OPJ_UINT32 p_id);
+
+/**
+ * Finds the execution function related to the given box id.
+ *
+ * @param	p_id	the id of the handler to fetch.
+ *
+ * @return	the given handler or NULL if it could not be found.
+ */
+static const opj_jp2_header_handler_t * opj_jp2_find_handler (OPJ_UINT32 p_id );
+
+const opj_jp2_header_handler_t jp2_header [] =
+{
+	{JP2_JP,opj_jp2_read_jp},
+	{JP2_FTYP,opj_jp2_read_ftyp},
+	{JP2_JP2H,opj_jp2_read_jp2h}
+};
+
+const opj_jp2_header_handler_t jp2_img_header [] =
+{
+	{JP2_IHDR,opj_jp2_read_ihdr},
+	{JP2_COLR,opj_jp2_read_colr},
+	{JP2_BPCC,opj_jp2_read_bpcc},
+	{JP2_PCLR,opj_jp2_read_pclr},
+	{JP2_CMAP,opj_jp2_read_cmap},
+	{JP2_CDEF,opj_jp2_read_cdef}
+
+};
+
+/**
+ * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure. Data is read from a character string
+ *
+ * @param	box						the box structure to fill.
+ * @param	p_data					the character string to read data from.
+ * @param	p_number_bytes_read		pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
+ * @param	p_box_max_size			the maximum number of bytes in the box.
+ * @param	p_manager         FIXME DOC
+ *
+ * @return	true if the box is reconized, false otherwise
+*/
+static OPJ_BOOL opj_jp2_read_boxhdr_char(   opj_jp2_box_t *box,
+                                            OPJ_BYTE * p_data,
+                                            OPJ_UINT32 * p_number_bytes_read,
+                                            OPJ_UINT32 p_box_max_size,
+                                            opj_event_mgr_t * p_manager );
+
+/**
+ * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
+ * are valid. Developpers wanting to extend the library can add their own validation procedures.
+ */
+static void opj_jp2_setup_decoding_validation (opj_jp2_t *jp2);
+
+/**
+ * Sets up the procedures to do on reading header.
+ * Developpers wanting to extend the library can add their own writing procedures.
+ */
+static void opj_jp2_setup_header_reading (opj_jp2_t *jp2);
+
+/* ----------------------------------------------------------------------- */
+ OPJ_BOOL opj_jp2_read_boxhdr(opj_jp2_box_t *box,
+                              OPJ_UINT32 * p_number_bytes_read,
+                              opj_stream_private_t *cio,
+                              opj_event_mgr_t * p_manager )
+{
+	/* read header from file */
+	OPJ_BYTE l_data_header [8];
+
+	/* preconditions */
+	assert(cio != 00);
+	assert(box != 00);
+	assert(p_number_bytes_read != 00);
+	assert(p_manager != 00);
+
+	*p_number_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio,l_data_header,8,p_manager);
+	if (*p_number_bytes_read != 8) {
+		return OPJ_FALSE;
+	}
+
+	/* process read data */
+	opj_read_bytes(l_data_header,&(box->length), 4);
+	opj_read_bytes(l_data_header+4,&(box->type), 4);
+    
+  if(box->length == 0)/* last box */
+    {
+    const OPJ_OFF_T bleft = opj_stream_get_number_byte_left(cio);
+    box->length = (OPJ_UINT32)bleft;
+    assert( (OPJ_OFF_T)box->length == bleft );
+    return OPJ_TRUE;
+    }
+
+	/* do we have a "special very large box ?" */
+	/* read then the XLBox */
+	if (box->length == 1) {
+		OPJ_UINT32 l_xl_part_size;
+
+		OPJ_UINT32 l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio,l_data_header,8,p_manager);
+		if (l_nb_bytes_read != 8) {
+			if (l_nb_bytes_read > 0) {
+				*p_number_bytes_read += l_nb_bytes_read;
+			}
+
+			return OPJ_FALSE;
+		}
+
+        *p_number_bytes_read = 16;
+		opj_read_bytes(l_data_header,&l_xl_part_size, 4);
+		if (l_xl_part_size != 0) {
+			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
+			return OPJ_FALSE;
+		}
+		opj_read_bytes(l_data_header+4,&(box->length), 4);
+	}
+    return OPJ_TRUE;
+}
+
+#if 0
+static void jp2_write_url(opj_cio_t *cio, char *Idx_file) {
+	OPJ_UINT32 i;
+	opj_jp2_box_t box;
+
+	box.init_pos = cio_tell(cio);
+	cio_skip(cio, 4);
+	cio_write(cio, JP2_URL, 4);	/* DBTL */
+	cio_write(cio, 0, 1);		/* VERS */
+	cio_write(cio, 0, 3);		/* FLAG */
+
+	if(Idx_file) {
+		for (i = 0; i < strlen(Idx_file); i++) {
+			cio_write(cio, Idx_file[i], 1);
+		}
+	}
+
+	box.length = cio_tell(cio) - box.init_pos;
+	cio_seek(cio, box.init_pos);
+	cio_write(cio, box.length, 4);	/* L */
+	cio_seek(cio, box.init_pos + box.length);
+}
+#endif
+
+OPJ_BOOL opj_jp2_read_ihdr( opj_jp2_t *jp2,
+                            OPJ_BYTE *p_image_header_data,
+                            OPJ_UINT32 p_image_header_size,
+                            opj_event_mgr_t * p_manager )
+{
+	/* preconditions */
+	assert(p_image_header_data != 00);
+	assert(jp2 != 00);
+	assert(p_manager != 00);
+
+	if (p_image_header_size != 14) {
+		opj_event_msg(p_manager, EVT_ERROR, "Bad image header box (bad size)\n");
+		return OPJ_FALSE;
+	}
+
+	opj_read_bytes(p_image_header_data,&(jp2->h),4);			/* HEIGHT */
+	p_image_header_data += 4;
+	opj_read_bytes(p_image_header_data,&(jp2->w),4);			/* WIDTH */
+	p_image_header_data += 4;
+	opj_read_bytes(p_image_header_data,&(jp2->numcomps),2);		/* NC */
+	p_image_header_data += 2;
+
+	/* allocate memory for components */
+	jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
+	if (jp2->comps == 0) {
+		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle image header (ihdr)\n");
+		return OPJ_FALSE;
+	}
+	memset(jp2->comps,0,jp2->numcomps * sizeof(opj_jp2_comps_t));
+
+	opj_read_bytes(p_image_header_data,&(jp2->bpc),1);			/* BPC */
+	++ p_image_header_data;
+
+	opj_read_bytes(p_image_header_data,&(jp2->C),1);			/* C */
+	++ p_image_header_data;
+
+	/* Should be equal to 7 cf. chapter about image header box of the norm */
+	if (jp2->C != 7){
+		opj_event_msg(p_manager, EVT_INFO, "JP2 IHDR box: compression type indicate that the file is not a conforming JP2 file (%d) \n", jp2->C);
+	}
+
+	opj_read_bytes(p_image_header_data,&(jp2->UnkC),1);			/* UnkC */
+	++ p_image_header_data;
+	opj_read_bytes(p_image_header_data,&(jp2->IPR),1);			/* IPR */
+	++ p_image_header_data;
+
+	return OPJ_TRUE;
+}
+
+OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
+                              OPJ_UINT32 * p_nb_bytes_written
+                              )
+{
+	OPJ_BYTE * l_ihdr_data,* l_current_ihdr_ptr;
+	
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(p_nb_bytes_written != 00);
+
+	/* default image header is 22 bytes wide */
+	l_ihdr_data = (OPJ_BYTE *) opj_malloc(22);
+	if (l_ihdr_data == 00) {
+		return 00;
+	}
+	memset(l_ihdr_data,0,22);
+
+	l_current_ihdr_ptr = l_ihdr_data;
+	
+	opj_write_bytes(l_current_ihdr_ptr,22,4);				/* write box size */
+	l_current_ihdr_ptr+=4;
+
+	opj_write_bytes(l_current_ihdr_ptr,JP2_IHDR, 4);		/* IHDR */
+	l_current_ihdr_ptr+=4;
+	
+	opj_write_bytes(l_current_ihdr_ptr,jp2->h, 4);		/* HEIGHT */
+	l_current_ihdr_ptr+=4;
+	
+	opj_write_bytes(l_current_ihdr_ptr, jp2->w, 4);		/* WIDTH */
+	l_current_ihdr_ptr+=4;
+	
+	opj_write_bytes(l_current_ihdr_ptr, jp2->numcomps, 2);		/* NC */
+	l_current_ihdr_ptr+=2;
+	
+	opj_write_bytes(l_current_ihdr_ptr, jp2->bpc, 1);		/* BPC */
+	++l_current_ihdr_ptr;
+	
+	opj_write_bytes(l_current_ihdr_ptr, jp2->C, 1);		/* C : Always 7 */
+	++l_current_ihdr_ptr;
+	
+	opj_write_bytes(l_current_ihdr_ptr, jp2->UnkC, 1);		/* UnkC, colorspace unknown */
+	++l_current_ihdr_ptr;
+	
+	opj_write_bytes(l_current_ihdr_ptr, jp2->IPR, 1);		/* IPR, no intellectual property */
+	++l_current_ihdr_ptr;
+	
+	*p_nb_bytes_written = 22;
+	
+	return l_ihdr_data;
+}
+
+OPJ_BYTE * opj_jp2_write_bpcc(	opj_jp2_t *jp2,
+						        OPJ_UINT32 * p_nb_bytes_written
+                                )
+{
+	OPJ_UINT32 i;
+	/* room for 8 bytes for box and 1 byte for each component */
+	OPJ_UINT32 l_bpcc_size = 8 + jp2->numcomps;
+	OPJ_BYTE * l_bpcc_data,* l_current_bpcc_ptr;
+	
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(p_nb_bytes_written != 00);
+
+	l_bpcc_data = (OPJ_BYTE *) opj_malloc(l_bpcc_size);
+	if (l_bpcc_data == 00) {
+		return 00;
+	}
+	memset(l_bpcc_data,0,l_bpcc_size);
+
+	l_current_bpcc_ptr = l_bpcc_data;
+
+	opj_write_bytes(l_current_bpcc_ptr,l_bpcc_size,4);				/* write box size */
+	l_current_bpcc_ptr += 4;
+	
+	opj_write_bytes(l_current_bpcc_ptr,JP2_BPCC,4);					/* BPCC */
+	l_current_bpcc_ptr += 4;
+
+	for (i = 0; i < jp2->numcomps; ++i)  {
+		opj_write_bytes(l_current_bpcc_ptr, jp2->comps[i].bpcc, 1); /* write each component information */
+		++l_current_bpcc_ptr;
+	}
+
+	*p_nb_bytes_written = l_bpcc_size;
+	
+	return l_bpcc_data;
+}
+
+OPJ_BOOL opj_jp2_read_bpcc( opj_jp2_t *jp2,
+                            OPJ_BYTE * p_bpc_header_data,
+                            OPJ_UINT32 p_bpc_header_size,
+                            opj_event_mgr_t * p_manager
+                            )
+{
+	OPJ_UINT32 i;
+
+	/* preconditions */
+	assert(p_bpc_header_data != 00);
+	assert(jp2 != 00);
+	assert(p_manager != 00);
+
+	
+	if (jp2->bpc != 255 ){
+		opj_event_msg(p_manager, EVT_WARNING, "A BPCC header box is available although BPC given by the IHDR box (%d) indicate components bit depth is constant\n",jp2->bpc);
+	}
+
+	/* and length is relevant */
+	if (p_bpc_header_size != jp2->numcomps) {
+		opj_event_msg(p_manager, EVT_ERROR, "Bad BPCC header box (bad size)\n");
+		return OPJ_FALSE;
+	}
+
+	/* read info for each component */
+	for (i = 0; i < jp2->numcomps; ++i) {
+		opj_read_bytes(p_bpc_header_data,&jp2->comps[i].bpcc ,1);	/* read each BPCC component */
+		++p_bpc_header_data;
+	}
+
+	return OPJ_TRUE;
+}
+
+OPJ_BYTE * opj_jp2_write_colr(  opj_jp2_t *jp2,
+							    OPJ_UINT32 * p_nb_bytes_written
+                                )
+{
+	/* room for 8 bytes for box 3 for common data and variable upon profile*/
+	OPJ_UINT32 l_colr_size = 11;
+	OPJ_BYTE * l_colr_data,* l_current_colr_ptr;
+	
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(p_nb_bytes_written != 00);
+    assert(jp2->meth == 1 || jp2->meth == 2);
+
+	switch (jp2->meth) { 
+		case 1 :
+			l_colr_size += 4; /* EnumCS */
+			break;
+		case 2 :
+            assert(jp2->color.icc_profile_len);	/* ICC profile */
+            l_colr_size += jp2->color.icc_profile_len;
+			break;
+		default :
+			return 00;
+	}
+
+	l_colr_data = (OPJ_BYTE *) opj_malloc(l_colr_size);
+	if (l_colr_data == 00) {
+		return 00;
+	}
+	memset(l_colr_data,0,l_colr_size);
+	
+	l_current_colr_ptr = l_colr_data;
+
+	opj_write_bytes(l_current_colr_ptr,l_colr_size,4);				/* write box size */
+	l_current_colr_ptr += 4;
+	
+	opj_write_bytes(l_current_colr_ptr,JP2_COLR,4);					/* BPCC */
+	l_current_colr_ptr += 4;
+	
+	opj_write_bytes(l_current_colr_ptr, jp2->meth,1);				/* METH */
+	++l_current_colr_ptr;
+	
+	opj_write_bytes(l_current_colr_ptr, jp2->precedence,1);			/* PRECEDENCE */
+	++l_current_colr_ptr;
+	
+	opj_write_bytes(l_current_colr_ptr, jp2->approx,1);				/* APPROX */
+	++l_current_colr_ptr;
+	
+	if (jp2->meth == 1) { /* Meth value is restricted to 1 or 2 (Table I.9 of part 1) */
+        opj_write_bytes(l_current_colr_ptr, jp2->enumcs,4); }       /* EnumCS */
+    else {
+        if (jp2->meth == 2) {                                      /* ICC profile */
+            OPJ_UINT32 i;
+            for(i = 0; i < jp2->color.icc_profile_len; ++i) {
+                opj_write_bytes(l_current_colr_ptr, jp2->color.icc_profile_buf[i], 1);
+                ++l_current_colr_ptr;
+            }
+        }
+	}
+
+	*p_nb_bytes_written = l_colr_size;
+	
+	return l_colr_data;
+}
+
+void opj_jp2_free_pclr(opj_jp2_color_t *color)
+{
+    opj_free(color->jp2_pclr->channel_sign);
+    opj_free(color->jp2_pclr->channel_size);
+    opj_free(color->jp2_pclr->entries);
+
+	if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap);
+
+    opj_free(color->jp2_pclr); color->jp2_pclr = NULL;
+}
+
+static OPJ_BOOL opj_jp2_check_color(opj_image_t *image, opj_jp2_color_t *color, opj_event_mgr_t *p_manager)
+{
+	OPJ_UINT16 i;
+
+	/* testcase 4149.pdf.SIGSEGV.cf7.3501 */
+	if (color->jp2_cdef) {
+		opj_jp2_cdef_info_t *info = color->jp2_cdef->info;
+		OPJ_UINT16 n = color->jp2_cdef->n;
+
+		for (i = 0; i < n; i++) {
+			if (info[i].cn >= image->numcomps) {
+				opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n", info[i].cn, image->numcomps);
+				return OPJ_FALSE;
+			}
+			if (info[i].asoc > 0 && (OPJ_UINT32)(info[i].asoc - 1) >= image->numcomps) {
+				opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n", info[i].asoc - 1, image->numcomps);
+				return OPJ_FALSE;
+			}
+		}
+	}
+
+	/* testcases 451.pdf.SIGSEGV.f4c.3723, 451.pdf.SIGSEGV.5b5.3723 and
+	   66ea31acbb0f23a2bbc91f64d69a03f5_signal_sigsegv_13937c0_7030_5725.pdf */
+	if (color->jp2_pclr && color->jp2_pclr->cmap) {
+		OPJ_UINT16 nr_channels = color->jp2_pclr->nr_channels;
+		opj_jp2_cmap_comp_t *cmap = color->jp2_pclr->cmap;
+		OPJ_BOOL *pcol_usage, is_sane = OPJ_TRUE;
+
+		/* verify that all original components match an existing one */
+		for (i = 0; i < nr_channels; i++) {
+			if (cmap[i].cmp >= image->numcomps) {
+				opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n", cmap[i].cmp, image->numcomps);
+				is_sane = OPJ_FALSE;
+			}
+		}
+
+		pcol_usage = opj_calloc(nr_channels, sizeof(OPJ_BOOL));
+		if (!pcol_usage) {
+			opj_event_msg(p_manager, EVT_ERROR, "Unexpected OOM.\n");
+			return OPJ_FALSE;
+		}
+		/* verify that no component is targeted more than once */
+		for (i = 0; i < nr_channels; i++) {
+      OPJ_UINT16 pcol = cmap[i].pcol;
+      assert(cmap[i].mtyp == 0 || cmap[i].mtyp == 1);
+			if (pcol >= nr_channels) {
+				opj_event_msg(p_manager, EVT_ERROR, "Invalid component/palette index for direct mapping %d.\n", pcol);
+				is_sane = OPJ_FALSE;
+			}
+			else if (pcol_usage[pcol] && cmap[i].mtyp == 1) {
+				opj_event_msg(p_manager, EVT_ERROR, "Component %d is mapped twice.\n", pcol);
+				is_sane = OPJ_FALSE;
+			}
+      else if (cmap[i].mtyp == 0 && cmap[i].pcol != 0) {
+        /* I.5.3.5 PCOL: If the value of the MTYP field for this channel is 0, then
+         * the value of this field shall be 0. */
+				opj_event_msg(p_manager, EVT_ERROR, "Direct use at #%d however pcol=%d.\n", i, pcol);
+				is_sane = OPJ_FALSE;
+      }
+			else
+				pcol_usage[pcol] = OPJ_TRUE;
+		}
+		/* verify that all components are targeted at least once */
+		for (i = 0; i < nr_channels; i++) {
+			if (!pcol_usage[i] && cmap[i].mtyp != 0) {
+				opj_event_msg(p_manager, EVT_ERROR, "Component %d doesn't have a mapping.\n", i);
+				is_sane = OPJ_FALSE;
+			}
+		}
+		opj_free(pcol_usage);
+		if (!is_sane) {
+			return OPJ_FALSE;
+		}
+	}
+
+	return OPJ_TRUE;
+}
+
+/* file9.jp2 */
+void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)
+{
+	opj_image_comp_t *old_comps, *new_comps;
+	OPJ_BYTE *channel_size, *channel_sign;
+	OPJ_UINT32 *entries;
+	opj_jp2_cmap_comp_t *cmap;
+	OPJ_INT32 *src, *dst;
+	OPJ_UINT32 j, max;
+	OPJ_UINT16 i, nr_channels, cmp, pcol;
+	OPJ_INT32 k, top_k;
+
+	channel_size = color->jp2_pclr->channel_size;
+	channel_sign = color->jp2_pclr->channel_sign;
+	entries = color->jp2_pclr->entries;
+	cmap = color->jp2_pclr->cmap;
+	nr_channels = color->jp2_pclr->nr_channels;
+
+	old_comps = image->comps;
+	new_comps = (opj_image_comp_t*)
+			opj_malloc(nr_channels * sizeof(opj_image_comp_t));
+
+	for(i = 0; i < nr_channels; ++i) {
+		pcol = cmap[i].pcol; cmp = cmap[i].cmp;
+
+		/* Direct use */
+    if(cmap[i].mtyp == 0){
+      assert( pcol == 0 );
+      new_comps[i] = old_comps[cmp];
+    } else {
+      assert( i == pcol );
+      new_comps[pcol] = old_comps[cmp];
+    }
+
+		/* Palette mapping: */
+		new_comps[i].data = (OPJ_INT32*)
+				opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(OPJ_INT32));
+		new_comps[i].prec = channel_size[i];
+		new_comps[i].sgnd = channel_sign[i];
+	}
+
+	top_k = color->jp2_pclr->nr_entries - 1;
+
+	for(i = 0; i < nr_channels; ++i) {
+		/* Palette mapping: */
+		cmp = cmap[i].cmp; pcol = cmap[i].pcol;
+		src = old_comps[cmp].data;
+    assert( src );
+		max = new_comps[pcol].w * new_comps[pcol].h;
+
+		/* Direct use: */
+    if(cmap[i].mtyp == 0) {
+      assert( cmp == 0 );
+      dst = new_comps[i].data;
+      assert( dst );
+      for(j = 0; j < max; ++j) {
+        dst[j] = src[j];
+      }
+    }
+    else {
+      assert( i == pcol );
+      dst = new_comps[pcol].data;
+      assert( dst );
+      for(j = 0; j < max; ++j) {
+        /* The index */
+        if((k = src[j]) < 0) k = 0; else if(k > top_k) k = top_k;
+
+        /* The colour */
+        dst[j] = (OPJ_INT32)entries[k * nr_channels + pcol];
+        }
+    }
+	}
+
+	max = image->numcomps;
+	for(i = 0; i < max; ++i) {
+		if(old_comps[i].data) opj_free(old_comps[i].data);
+	}
+
+	opj_free(old_comps);
+	image->comps = new_comps;
+	image->numcomps = nr_channels;
+
+	opj_jp2_free_pclr(color);
+
+}/* apply_pclr() */
+
+OPJ_BOOL opj_jp2_read_pclr(	opj_jp2_t *jp2,
+                            OPJ_BYTE * p_pclr_header_data,
+                            OPJ_UINT32 p_pclr_header_size,
+                            opj_event_mgr_t * p_manager
+                            )
+{
+	opj_jp2_pclr_t *jp2_pclr;
+	OPJ_BYTE *channel_size, *channel_sign;
+	OPJ_UINT32 *entries;
+	OPJ_UINT16 nr_entries,nr_channels;
+	OPJ_UINT16 i, j;
+	OPJ_UINT32 l_value;
+	OPJ_BYTE *orig_header_data = p_pclr_header_data;
+
+	/* preconditions */
+	assert(p_pclr_header_data != 00);
+	assert(jp2 != 00);
+	assert(p_manager != 00);
+    (void)p_pclr_header_size;
+
+	if(jp2->color.jp2_pclr)
+		return OPJ_FALSE;
+
+	if (p_pclr_header_size < 3)
+		return OPJ_FALSE;
+
+	opj_read_bytes(p_pclr_header_data, &l_value , 2);	/* NE */
+	p_pclr_header_data += 2;
+	nr_entries = (OPJ_UINT16) l_value;
+
+	opj_read_bytes(p_pclr_header_data, &l_value , 1);	/* NPC */
+	++p_pclr_header_data;
+	nr_channels = (OPJ_UINT16) l_value;
+
+	if (p_pclr_header_size < 3 + (OPJ_UINT32)nr_channels || nr_channels == 0 || nr_entries >= (OPJ_UINT32)-1 / nr_channels)
+		return OPJ_FALSE;
+
+	entries = (OPJ_UINT32*) opj_malloc((size_t)nr_channels * nr_entries * sizeof(OPJ_UINT32));
+    if (!entries)
+        return OPJ_FALSE;
+	channel_size = (OPJ_BYTE*) opj_malloc(nr_channels);
+    if (!channel_size)
+    {
+        opj_free(entries);
+        return OPJ_FALSE;
+    }
+	channel_sign = (OPJ_BYTE*) opj_malloc(nr_channels);
+	if (!channel_sign)
+	{
+        opj_free(entries);
+        opj_free(channel_size);
+        return OPJ_FALSE;
+	}
+
+	jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t));
+    if (!jp2_pclr)
+    {
+        opj_free(entries);
+        opj_free(channel_size);
+        opj_free(channel_sign);
+        return OPJ_FALSE;
+    }
+
+	jp2_pclr->channel_sign = channel_sign;
+	jp2_pclr->channel_size = channel_size;
+	jp2_pclr->entries = entries;
+	jp2_pclr->nr_entries = nr_entries;
+	jp2_pclr->nr_channels = (OPJ_BYTE) l_value;
+	jp2_pclr->cmap = NULL;
+
+	jp2->color.jp2_pclr = jp2_pclr;
+
+	for(i = 0; i < nr_channels; ++i) {
+		opj_read_bytes(p_pclr_header_data, &l_value , 1);	/* Bi */
+		++p_pclr_header_data;
+
+		channel_size[i] = (OPJ_BYTE)((l_value & 0x7f) + 1);
+		channel_sign[i] = (l_value & 0x80) ? 1 : 0;
+	}
+
+	for(j = 0; j < nr_entries; ++j) {
+		for(i = 0; i < nr_channels; ++i) {
+			OPJ_UINT32 bytes_to_read = (OPJ_UINT32)((channel_size[i]+7)>>3);
+
+			if (bytes_to_read > sizeof(OPJ_UINT32))
+				bytes_to_read = sizeof(OPJ_UINT32);
+			if ((ptrdiff_t)p_pclr_header_size < p_pclr_header_data - orig_header_data + (ptrdiff_t)bytes_to_read)
+				return OPJ_FALSE;
+
+			opj_read_bytes(p_pclr_header_data, &l_value , bytes_to_read);	/* Cji */
+			p_pclr_header_data += bytes_to_read;
+			*entries = (OPJ_UINT32) l_value;
+			entries++;
+		}
+	}
+
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_read_cmap(	opj_jp2_t * jp2,
+                            OPJ_BYTE * p_cmap_header_data,
+                            OPJ_UINT32 p_cmap_header_size,
+                            opj_event_mgr_t * p_manager
+                            )
+{
+	opj_jp2_cmap_comp_t *cmap;
+	OPJ_BYTE i, nr_channels;
+	OPJ_UINT32 l_value;
+
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(p_cmap_header_data != 00);
+	assert(p_manager != 00);
+    (void)p_cmap_header_size;
+
+	/* Need nr_channels: */
+	if(jp2->color.jp2_pclr == NULL) {
+		opj_event_msg(p_manager, EVT_ERROR, "Need to read a PCLR box before the CMAP box.\n");
+		return OPJ_FALSE;
+	}
+
+	/* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box
+	 * inside a JP2 Header box' :
+	*/
+	if(jp2->color.jp2_pclr->cmap) {
+		opj_event_msg(p_manager, EVT_ERROR, "Only one CMAP box is allowed.\n");
+		return OPJ_FALSE;
+	}
+
+	nr_channels = jp2->color.jp2_pclr->nr_channels;
+	if (p_cmap_header_size < (OPJ_UINT32)nr_channels * 4) {
+		opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CMAP box.\n");
+		return OPJ_FALSE;
+	}
+
+	cmap = (opj_jp2_cmap_comp_t*) opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t));
+    if (!cmap)
+        return OPJ_FALSE;
+
+
+	for(i = 0; i < nr_channels; ++i) {
+		opj_read_bytes(p_cmap_header_data, &l_value, 2);			/* CMP^i */
+		p_cmap_header_data +=2;
+		cmap[i].cmp = (OPJ_UINT16) l_value;
+
+		opj_read_bytes(p_cmap_header_data, &l_value, 1);			/* MTYP^i */
+		++p_cmap_header_data;
+		cmap[i].mtyp = (OPJ_BYTE) l_value;
+
+		opj_read_bytes(p_cmap_header_data, &l_value, 1);			/* PCOL^i */
+		++p_cmap_header_data;
+		cmap[i].pcol = (OPJ_BYTE) l_value;
+	}
+
+	jp2->color.jp2_pclr->cmap = cmap;
+
+	return OPJ_TRUE;
+}
+
+void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color)
+{
+	opj_jp2_cdef_info_t *info;
+	OPJ_UINT16 i, n, cn, asoc, acn;
+
+	info = color->jp2_cdef->info;
+	n = color->jp2_cdef->n;
+
+  for(i = 0; i < n; ++i)
+    {
+    /* WATCH: acn = asoc - 1 ! */
+    asoc = info[i].asoc;
+    if(asoc == 0 || asoc == 65535)
+      {
+      if (i < image->numcomps)
+        image->comps[i].alpha = info[i].typ;
+      continue;
+      }
+
+    cn = info[i].cn; 
+    acn = (OPJ_UINT16)(asoc - 1);
+    if( cn >= image->numcomps || acn >= image->numcomps )
+      {
+      fprintf(stderr, "cn=%d, acn=%d, numcomps=%d\n", cn, acn, image->numcomps);
+      continue;
+      }
+
+		if(cn != acn)
+		{
+			opj_image_comp_t saved;
+
+			memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t));
+			memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t));
+			memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t));
+
+			info[i].asoc = (OPJ_UINT16)(cn + 1);
+			info[acn].asoc = (OPJ_UINT16)(info[acn].cn + 1);
+		}
+
+		image->comps[cn].alpha = info[i].typ;
+	}
+
+	if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);
+
+	opj_free(color->jp2_cdef); color->jp2_cdef = NULL;
+
+}/* jp2_apply_cdef() */
+
+OPJ_BOOL opj_jp2_read_cdef(	opj_jp2_t * jp2,
+                            OPJ_BYTE * p_cdef_header_data,
+							OPJ_UINT32 p_cdef_header_size,
+							opj_event_mgr_t * p_manager
+                            )
+{
+	opj_jp2_cdef_info_t *cdef_info;
+	OPJ_UINT16 i;
+	OPJ_UINT32 l_value;
+
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(p_cdef_header_data != 00);
+	assert(p_manager != 00);
+    (void)p_cdef_header_size;
+
+	/* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box
+	 * inside a JP2 Header box.'*/
+	if(jp2->color.jp2_cdef) return OPJ_FALSE;
+
+	if (p_cdef_header_size < 2) {
+		opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CDEF box.\n");
+		return OPJ_FALSE;
+	}
+
+	opj_read_bytes(p_cdef_header_data,&l_value ,2);			/* N */
+	p_cdef_header_data+= 2;
+
+	if ( (OPJ_UINT16)l_value == 0){ /* szukw000: FIXME */
+		opj_event_msg(p_manager, EVT_ERROR, "Number of channel description is equal to zero in CDEF box.\n");
+		return OPJ_FALSE;
+	}
+
+	if (p_cdef_header_size < 2 + (OPJ_UINT32)(OPJ_UINT16)l_value * 6) {
+		opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CDEF box.\n");
+		return OPJ_FALSE;
+	}
+
+	cdef_info = (opj_jp2_cdef_info_t*) opj_malloc(l_value * sizeof(opj_jp2_cdef_info_t));
+    if (!cdef_info)
+        return OPJ_FALSE;
+
+	jp2->color.jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
+    if(!jp2->color.jp2_cdef)
+    {
+        opj_free(cdef_info);
+        return OPJ_FALSE;
+    }
+	jp2->color.jp2_cdef->info = cdef_info;
+	jp2->color.jp2_cdef->n = (OPJ_UINT16) l_value;
+
+	for(i = 0; i < jp2->color.jp2_cdef->n; ++i) {
+		opj_read_bytes(p_cdef_header_data, &l_value, 2);			/* Cn^i */
+		p_cdef_header_data +=2;
+		cdef_info[i].cn = (OPJ_UINT16) l_value;
+
+		opj_read_bytes(p_cdef_header_data, &l_value, 2);			/* Typ^i */
+		p_cdef_header_data +=2;
+		cdef_info[i].typ = (OPJ_UINT16) l_value;
+
+		opj_read_bytes(p_cdef_header_data, &l_value, 2);			/* Asoc^i */
+		p_cdef_header_data +=2;
+		cdef_info[i].asoc = (OPJ_UINT16) l_value;
+   }
+
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_read_colr( opj_jp2_t *jp2,
+                            OPJ_BYTE * p_colr_header_data,
+                            OPJ_UINT32 p_colr_header_size,
+                            opj_event_mgr_t * p_manager
+                            )
+{
+	OPJ_UINT32 l_value;
+
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(p_colr_header_data != 00);
+	assert(p_manager != 00);
+
+	if (p_colr_header_size < 3) {
+		opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size)\n");
+		return OPJ_FALSE;
+	}
+
+	/* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour
+	 * Specification boxes after the first.'
+	*/
+	if(jp2->color.jp2_has_colr) {
+		opj_event_msg(p_manager, EVT_INFO, "A conforming JP2 reader shall ignore all Colour Specification boxes after the first, so we ignore this one.\n");
+		p_colr_header_data += p_colr_header_size;
+		return OPJ_TRUE;
+	}
+
+	opj_read_bytes(p_colr_header_data,&jp2->meth ,1);			/* METH */
+	++p_colr_header_data;
+
+	opj_read_bytes(p_colr_header_data,&jp2->precedence ,1);		/* PRECEDENCE */
+	++p_colr_header_data;
+
+	opj_read_bytes(p_colr_header_data,&jp2->approx ,1);			/* APPROX */
+	++p_colr_header_data;
+
+	if (jp2->meth == 1) {
+		if (p_colr_header_size > 7) {
+			/* testcase Altona_Technical_v20_x4.pdf */
+			opj_event_msg(p_manager, EVT_WARNING, "Bad COLR header box (bad size: %d)\n", p_colr_header_size);
+		}
+
+		opj_read_bytes(p_colr_header_data,&jp2->enumcs ,4);			/* EnumCS */
+        
+		p_colr_header_data += 4;
+
+		if(jp2->enumcs == 14)/* CIELab */
+		{
+			OPJ_UINT32 *cielab;
+			OPJ_UINT32 rl, ol, ra, oa, rb, ob, il;
+
+			cielab = (OPJ_UINT32*)opj_malloc(9 * sizeof(OPJ_UINT32));
+			cielab[0] = 14; /* enumcs */
+
+			if(p_colr_header_size == 7)/* default values */
+			{
+				rl = ra = rb = ol = oa = ob = 0;
+				il = 0x00443530; /* D50 */
+				cielab[1] = 0x44454600;/* DEF */
+			}
+			else if(p_colr_header_size == 35)
+			{
+				opj_read_bytes(p_colr_header_data, &rl, 4);
+				p_colr_header_data += 4;
+				opj_read_bytes(p_colr_header_data, &ol, 4);
+				p_colr_header_data += 4;
+				opj_read_bytes(p_colr_header_data, &ra, 4);
+				p_colr_header_data += 4;
+				opj_read_bytes(p_colr_header_data, &oa, 4);
+				p_colr_header_data += 4;
+				opj_read_bytes(p_colr_header_data, &rb, 4);
+				p_colr_header_data += 4;
+				opj_read_bytes(p_colr_header_data, &ob, 4);
+				p_colr_header_data += 4;
+				opj_read_bytes(p_colr_header_data, &il, 4);
+				p_colr_header_data += 4;
+				cielab[1] = 0;
+			}
+			cielab[2] = rl; cielab[4] = ra; cielab[6] = rb;
+			cielab[3] = ol; cielab[5] = oa; cielab[7] = ob;
+			cielab[8] = il;
+
+			jp2->color.icc_profile_buf = (unsigned char*)cielab;
+			jp2->color.icc_profile_len = 0;
+		}
+
+        jp2->color.jp2_has_colr = 1;
+	}
+	else if (jp2->meth == 2) {
+		/* ICC profile */
+		OPJ_INT32 it_icc_value = 0;
+		OPJ_INT32 icc_len = (OPJ_INT32)p_colr_header_size - 3;
+
+		jp2->color.icc_profile_len = (OPJ_UINT32)icc_len;
+		jp2->color.icc_profile_buf = (OPJ_BYTE*) opj_malloc((size_t)icc_len);
+        if (!jp2->color.icc_profile_buf)
+        {
+            jp2->color.icc_profile_len = 0;
+            return OPJ_FALSE;
+        }
+		memset(jp2->color.icc_profile_buf, 0, (size_t)icc_len * sizeof(OPJ_BYTE));
+
+		for (it_icc_value = 0; it_icc_value < icc_len; ++it_icc_value)
+		{
+			opj_read_bytes(p_colr_header_data,&l_value,1);		/* icc values */
+			++p_colr_header_data;
+			jp2->color.icc_profile_buf[it_icc_value] = (OPJ_BYTE) l_value;
+		}
+	    
+        jp2->color.jp2_has_colr = 1;
+	}
+	else if (jp2->meth > 2)
+    {
+        /*	ISO/IEC 15444-1:2004 (E), Table I.9 ?Legal METH values:
+        conforming JP2 reader shall ignore the entire Colour Specification box.*/
+        opj_event_msg(p_manager, EVT_INFO, "COLR BOX meth value is not a regular value (%d), " 
+            "so we will ignore the entire Colour Specification box. \n", jp2->meth);
+    }
+    return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,
+                        opj_stream_private_t *p_stream,
+                        opj_image_t* p_image,
+                        opj_event_mgr_t * p_manager)
+{
+	if (!p_image)
+		return OPJ_FALSE;
+
+	/* J2K decoding */
+	if( ! opj_j2k_decode(jp2->j2k, p_stream, p_image, p_manager) ) {
+		opj_event_msg(p_manager, EVT_ERROR, "Failed to decode the codestream in the JP2 file\n");
+		return OPJ_FALSE;
+	}
+
+    if (!jp2->ignore_pclr_cmap_cdef){
+	    if (!opj_jp2_check_color(p_image, &(jp2->color), p_manager)) {
+		    return OPJ_FALSE;
+	    }
+
+	    /* Set Image Color Space */
+	    if (jp2->enumcs == 16)
+		    p_image->color_space = OPJ_CLRSPC_SRGB;
+	    else if (jp2->enumcs == 17)
+		    p_image->color_space = OPJ_CLRSPC_GRAY;
+	    else if (jp2->enumcs == 18)
+		    p_image->color_space = OPJ_CLRSPC_SYCC;
+            else if (jp2->enumcs == 24)
+                    p_image->color_space = OPJ_CLRSPC_EYCC;
+	    else
+		    p_image->color_space = OPJ_CLRSPC_UNKNOWN;
+
+	    /* Apply the color space if needed */
+	    if(jp2->color.jp2_cdef) {
+		    opj_jp2_apply_cdef(p_image, &(jp2->color));
+	    }
+
+	    if(jp2->color.jp2_pclr) {
+		    /* Part 1, I.5.3.4: Either both or none : */
+		    if( !jp2->color.jp2_pclr->cmap)
+			    opj_jp2_free_pclr(&(jp2->color));
+		    else
+				if(!p_image->useColorSpace)
+			    opj_jp2_apply_pclr(p_image, &(jp2->color));
+	    }
+
+	    if(jp2->color.icc_profile_buf) {
+		    p_image->icc_profile_buf = jp2->color.icc_profile_buf;
+		    p_image->icc_profile_len = jp2->color.icc_profile_len;
+		    jp2->color.icc_profile_buf = NULL;
+	    }
+    }
+
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_write_jp2h(opj_jp2_t *jp2,
+                            opj_stream_private_t *stream,
+                            opj_event_mgr_t * p_manager
+                            )
+{
+	opj_jp2_img_header_writer_handler_t l_writers [3];
+	opj_jp2_img_header_writer_handler_t * l_current_writer;
+
+	OPJ_INT32 i, l_nb_pass;
+	/* size of data for super box*/
+	OPJ_UINT32 l_jp2h_size = 8;
+	OPJ_BOOL l_result = OPJ_TRUE;
+
+	/* to store the data of the super box */
+	OPJ_BYTE l_jp2h_data [8];
+	
+	/* preconditions */
+	assert(stream != 00);
+	assert(jp2 != 00);
+	assert(p_manager != 00);
+
+	memset(l_writers,0,sizeof(l_writers));
+
+	if (jp2->bpc == 255) {
+		l_nb_pass = 3;
+		l_writers[0].handler = opj_jp2_write_ihdr;
+		l_writers[1].handler = opj_jp2_write_bpcc;
+		l_writers[2].handler = opj_jp2_write_colr;
+	}
+	else {
+		l_nb_pass = 2;
+		l_writers[0].handler = opj_jp2_write_ihdr;
+		l_writers[1].handler = opj_jp2_write_colr;
+	}
+	
+	/* write box header */
+	/* write JP2H type */
+	opj_write_bytes(l_jp2h_data+4,JP2_JP2H,4);
+
+	l_current_writer = l_writers;
+	for (i=0;i<l_nb_pass;++i) {
+		l_current_writer->m_data = l_current_writer->handler(jp2,&(l_current_writer->m_size));
+		if (l_current_writer->m_data == 00) {
+			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to hold JP2 Header data\n");
+			l_result = OPJ_FALSE;
+			break;
+		}
+
+		l_jp2h_size += l_current_writer->m_size;
+		++l_current_writer;
+	}
+
+	if (! l_result) {
+		l_current_writer = l_writers;
+		for (i=0;i<l_nb_pass;++i) {
+			if (l_current_writer->m_data != 00) {
+				opj_free(l_current_writer->m_data );
+			}
+			++l_current_writer;
+		}
+
+		return OPJ_FALSE;
+	}
+
+	/* write super box size */
+	opj_write_bytes(l_jp2h_data,l_jp2h_size,4);
+	
+	/* write super box data on stream */
+	if (opj_stream_write_data(stream,l_jp2h_data,8,p_manager) != 8) {
+		opj_event_msg(p_manager, EVT_ERROR, "Stream error while writing JP2 Header box\n");
+		l_result = OPJ_FALSE;
+	}
+	
+	if (l_result) {
+		l_current_writer = l_writers;
+		for (i=0;i<l_nb_pass;++i) {
+			if (opj_stream_write_data(stream,l_current_writer->m_data,l_current_writer->m_size,p_manager) != l_current_writer->m_size) {
+				opj_event_msg(p_manager, EVT_ERROR, "Stream error while writing JP2 Header box\n");
+				l_result = OPJ_FALSE;
+				break;
+			}
+			++l_current_writer;
+		}
+	}
+
+	l_current_writer = l_writers;
+	
+	/* cleanup */
+	for (i=0;i<l_nb_pass;++i) {
+		if (l_current_writer->m_data != 00) {
+			opj_free(l_current_writer->m_data );
+		}
+		++l_current_writer;
+	}
+
+	return l_result;
+}
+
+OPJ_BOOL opj_jp2_write_ftyp(opj_jp2_t *jp2,
+							opj_stream_private_t *cio,
+							opj_event_mgr_t * p_manager )
+{
+	OPJ_UINT32 i;
+	OPJ_UINT32 l_ftyp_size = 16 + 4 * jp2->numcl;
+	OPJ_BYTE * l_ftyp_data, * l_current_data_ptr;
+	OPJ_BOOL l_result;
+
+	/* preconditions */
+	assert(cio != 00);
+	assert(jp2 != 00);
+	assert(p_manager != 00);
+
+	l_ftyp_data = (OPJ_BYTE *) opj_malloc(l_ftyp_size);
+	
+	if (l_ftyp_data == 00) {
+		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle ftyp data\n");
+		return OPJ_FALSE;
+	}
+
+	memset(l_ftyp_data,0,l_ftyp_size);
+
+	l_current_data_ptr = l_ftyp_data;
+
+	opj_write_bytes(l_current_data_ptr, l_ftyp_size,4); /* box size */
+	l_current_data_ptr += 4;
+
+	opj_write_bytes(l_current_data_ptr, JP2_FTYP,4); /* FTYP */
+	l_current_data_ptr += 4;
+
+	opj_write_bytes(l_current_data_ptr, jp2->brand,4); /* BR */
+	l_current_data_ptr += 4;
+
+	opj_write_bytes(l_current_data_ptr, jp2->minversion,4); /* MinV */
+	l_current_data_ptr += 4;
+
+	for (i = 0; i < jp2->numcl; i++)  {
+		opj_write_bytes(l_current_data_ptr, jp2->cl[i],4);	/* CL */
+	}
+	
+	l_result = (opj_stream_write_data(cio,l_ftyp_data,l_ftyp_size,p_manager) == l_ftyp_size);
+	if (! l_result)
+	{
+		opj_event_msg(p_manager, EVT_ERROR, "Error while writing ftyp data to stream\n");
+	}
+
+	opj_free(l_ftyp_data);
+	
+	return l_result;
+}
+
+OPJ_BOOL opj_jp2_write_jp2c(opj_jp2_t *jp2,
+							opj_stream_private_t *cio,
+							opj_event_mgr_t * p_manager )
+{
+	OPJ_OFF_T j2k_codestream_exit;
+	OPJ_BYTE l_data_header [8];
+	
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(cio != 00);
+	assert(p_manager != 00);
+	assert(opj_stream_has_seek(cio));
+	
+	j2k_codestream_exit = opj_stream_tell(cio);
+	opj_write_bytes(l_data_header,
+                    (OPJ_UINT32) (j2k_codestream_exit - jp2->j2k_codestream_offset),
+                    4); /* size of codestream */
+	opj_write_bytes(l_data_header + 4,JP2_JP2C,4);									   /* JP2C */
+
+	if (! opj_stream_seek(cio,jp2->j2k_codestream_offset,p_manager)) {
+		opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+		return OPJ_FALSE;
+	}
+	
+	if (opj_stream_write_data(cio,l_data_header,8,p_manager) != 8) {
+		opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+		return OPJ_FALSE;
+	}
+
+	if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
+		opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+		return OPJ_FALSE;
+	}
+
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_write_jp(	opj_jp2_t *jp2,
+			    		    opj_stream_private_t *cio,
+				    		opj_event_mgr_t * p_manager )
+{
+	/* 12 bytes will be read */
+	OPJ_BYTE l_signature_data [12];
+
+	/* preconditions */
+	assert(cio != 00);
+	assert(jp2 != 00);
+	assert(p_manager != 00);
+
+	/* write box length */
+	opj_write_bytes(l_signature_data,12,4);
+	/* writes box type */
+	opj_write_bytes(l_signature_data+4,JP2_JP,4);
+	/* writes magic number*/
+	opj_write_bytes(l_signature_data+8,0x0d0a870a,4);
+	
+	if (opj_stream_write_data(cio,l_signature_data,12,p_manager) != 12) {
+		return OPJ_FALSE;
+	}
+
+	return OPJ_TRUE;
+}
+
+/* ----------------------------------------------------------------------- */
+/* JP2 decoder interface                                             */
+/* ----------------------------------------------------------------------- */
+
+void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters)
+{
+	/* setup the J2K codec */
+	opj_j2k_setup_decoder(jp2->j2k, parameters);
+
+	/* further JP2 initializations go here */
+	jp2->color.jp2_has_colr = 0;
+    jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
+}
+
+/* ----------------------------------------------------------------------- */
+/* JP2 encoder interface                                             */
+/* ----------------------------------------------------------------------- */
+
+void opj_jp2_setup_encoder(	opj_jp2_t *jp2,
+                            opj_cparameters_t *parameters,
+                            opj_image_t *image,
+                            opj_event_mgr_t * p_manager)
+{
+    OPJ_UINT32 i;
+	OPJ_UINT32 depth_0;
+  OPJ_UINT32 sign;
+
+	if(!jp2 || !parameters || !image)
+		return;
+
+	/* setup the J2K codec */
+	/* ------------------- */
+
+	/* Check if number of components respects standard */
+	if (image->numcomps < 1 || image->numcomps > 16384) {
+		opj_event_msg(p_manager, EVT_ERROR, "Invalid number of components specified while setting up JP2 encoder\n");
+		return;
+	}
+
+	opj_j2k_setup_encoder(jp2->j2k, parameters, image, p_manager );
+
+	/* setup the JP2 codec */
+	/* ------------------- */
+	
+	/* Profile box */
+
+	jp2->brand = JP2_JP2;	/* BR */
+	jp2->minversion = 0;	/* MinV */
+	jp2->numcl = 1;
+	jp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
+    if (!jp2->cl){
+        jp2->cl = NULL;
+        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
+        return;
+    }
+	jp2->cl[0] = JP2_JP2;	/* CL0 : JP2 */
+
+	/* Image Header box */
+
+	jp2->numcomps = image->numcomps;	/* NC */
+	jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
+    if (!jp2->comps) {
+        jp2->comps = NULL;
+        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
+        return;
+    }
+
+	jp2->h = image->y1 - image->y0;		/* HEIGHT */
+	jp2->w = image->x1 - image->x0;		/* WIDTH */
+	/* BPC */
+	depth_0 = image->comps[0].prec - 1;
+	sign = image->comps[0].sgnd;
+	jp2->bpc = depth_0 + (sign << 7);
+	for (i = 1; i < image->numcomps; i++) {
+		OPJ_UINT32 depth = image->comps[i].prec - 1;
+		sign = image->comps[i].sgnd;
+		if (depth_0 != depth)
+			jp2->bpc = 255;
+	}
+	jp2->C = 7;			/* C : Always 7 */
+	jp2->UnkC = 0;		/* UnkC, colorspace specified in colr box */
+	jp2->IPR = 0;		/* IPR, no intellectual property */
+	
+	/* BitsPerComponent box */
+	for (i = 0; i < image->numcomps; i++) {
+		jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
+	}
+
+	/* Colour Specification box */
+    if(image->icc_profile_len) {
+        jp2->meth = 2;
+        jp2->enumcs = 0;
+    } 
+    else {
+        jp2->meth = 1;
+        if (image->color_space == 1)
+            jp2->enumcs = 16;	/* sRGB as defined by IEC 61966-2-1 */
+        else if (image->color_space == 2)
+            jp2->enumcs = 17;	/* greyscale */
+        else if (image->color_space == 3)
+            jp2->enumcs = 18;	/* YUV */
+    }
+
+
+	jp2->precedence = 0;	/* PRECEDENCE */
+	jp2->approx = 0;		/* APPROX */
+
+	jp2->jpip_on = parameters->jpip_on;
+}
+
+OPJ_BOOL opj_jp2_encode(opj_jp2_t *jp2,
+						opj_stream_private_t *stream,
+						opj_event_mgr_t * p_manager)
+{
+	return opj_j2k_encode(jp2->j2k, stream, p_manager);
+}
+
+OPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2,
+                                opj_stream_private_t *cio,
+                                opj_event_mgr_t * p_manager
+                                )
+{
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(cio != 00);
+	assert(p_manager != 00);
+
+	/* customization of the end encoding */
+	opj_jp2_setup_end_header_reading(jp2);
+
+	/* write header */
+	if (! opj_jp2_exec (jp2,jp2->m_procedure_list,cio,p_manager)) {
+		return OPJ_FALSE;
+	}
+
+	return opj_j2k_end_decompress(jp2->j2k, cio, p_manager);
+}
+
+OPJ_BOOL opj_jp2_end_compress(	opj_jp2_t *jp2,
+							    opj_stream_private_t *cio,
+							    opj_event_mgr_t * p_manager
+                                )
+{
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(cio != 00);
+	assert(p_manager != 00);
+
+	/* customization of the end encoding */
+	opj_jp2_setup_end_header_writing(jp2);
+
+	if (! opj_j2k_end_compress(jp2->j2k,cio,p_manager)) {
+		return OPJ_FALSE;
+	}
+
+	/* write header */
+	return opj_jp2_exec(jp2,jp2->m_procedure_list,cio,p_manager);
+}
+
+void opj_jp2_setup_end_header_writing (opj_jp2_t *jp2)
+{
+	/* preconditions */
+	assert(jp2 != 00);
+
+#ifdef USE_JPIP
+  if( jp2->jpip_on )
+    opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_iptr );
+#endif
+	opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp2c );
+	/* DEVELOPER CORNER, add your custom procedures */
+#ifdef USE_JPIP
+  if( jp2->jpip_on )
+    {
+    opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_cidx );
+    opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_fidx );
+    }
+#endif
+}
+
+void opj_jp2_setup_end_header_reading (opj_jp2_t *jp2)
+{
+	/* preconditions */
+	assert(jp2 != 00);
+	opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_read_header_procedure );
+	/* DEVELOPER CORNER, add your custom procedures */
+}
+
+OPJ_BOOL opj_jp2_default_validation (	opj_jp2_t * jp2,
+                                        opj_stream_private_t *cio,
+                                        opj_event_mgr_t * p_manager
+                                        )
+{
+	OPJ_BOOL l_is_valid = OPJ_TRUE;
+	OPJ_UINT32 i;
+
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(cio != 00);
+	assert(p_manager != 00);
+
+	/* JPEG2000 codec validation */
+
+	/* STATE checking */
+	/* make sure the state is at 0 */
+	l_is_valid &= (jp2->jp2_state == JP2_STATE_NONE);
+
+	/* make sure not reading a jp2h ???? WEIRD */
+	l_is_valid &= (jp2->jp2_img_state == JP2_IMG_STATE_NONE);
+
+	/* POINTER validation */
+	/* make sure a j2k codec is present */
+	l_is_valid &= (jp2->j2k != 00);
+
+	/* make sure a procedure list is present */
+	l_is_valid &= (jp2->m_procedure_list != 00);
+
+	/* make sure a validation list is present */
+	l_is_valid &= (jp2->m_validation_list != 00);
+
+	/* PARAMETER VALIDATION */
+	/* number of components */
+	l_is_valid &= (jp2->numcl > 0);
+	/* width */
+	l_is_valid &= (jp2->h > 0);
+	/* height */
+	l_is_valid &= (jp2->w > 0);
+	/* precision */
+	for (i = 0; i < jp2->numcomps; ++i)	{
+		l_is_valid &= (jp2->comps[i].bpcc > 0);
+	}
+
+	/* METH */
+	l_is_valid &= ((jp2->meth > 0) && (jp2->meth < 3));
+
+	/* stream validation */
+	/* back and forth is needed */
+	l_is_valid &= opj_stream_has_seek(cio);
+
+	return l_is_valid;
+}
+
+OPJ_BOOL opj_jp2_read_header_procedure(  opj_jp2_t *jp2,
+                                                opj_stream_private_t *stream,
+                                                opj_event_mgr_t * p_manager
+                                                )
+{
+	opj_jp2_box_t box;
+	OPJ_UINT32 l_nb_bytes_read;
+	const opj_jp2_header_handler_t * l_current_handler;
+	OPJ_UINT32 l_last_data_size = OPJ_BOX_SIZE;
+	OPJ_UINT32 l_current_data_size;
+	OPJ_BYTE * l_current_data = 00;
+
+	/* preconditions */
+	assert(stream != 00);
+	assert(jp2 != 00);
+	assert(p_manager != 00);
+
+	l_current_data = (OPJ_BYTE*)opj_malloc(l_last_data_size);
+
+	if (l_current_data == 00) {
+		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 file header\n");
+		return OPJ_FALSE;
+	}
+	memset(l_current_data, 0 , l_last_data_size);
+
+	while (opj_jp2_read_boxhdr(&box,&l_nb_bytes_read,stream,p_manager)) {
+		/* is it the codestream box ? */
+		if (box.type == JP2_JP2C) {
+			if (jp2->jp2_state & JP2_STATE_HEADER) {
+				jp2->jp2_state |= JP2_STATE_CODESTREAM;
+                                opj_free(l_current_data);
+				return OPJ_TRUE;
+			}
+			else {
+				opj_event_msg(p_manager, EVT_ERROR, "bad placed jpeg codestream\n");
+				opj_free(l_current_data);
+				return OPJ_FALSE;
+			}
+		}
+		else if	(box.length == 0) {
+			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
+			opj_free(l_current_data);
+			return OPJ_FALSE;
+		}
+		/* testcase 1851.pdf.SIGSEGV.ce9.948 */
+		/* testcase K-5787457125613568 */
+		else if	(box.length < l_nb_bytes_read || box.length > opj_stream_get_number_byte_left(stream)) {
+			opj_event_msg(p_manager, EVT_ERROR, "invalid box size %d (%x)\n", box.length, box.type);
+			opj_free(l_current_data);
+			return OPJ_FALSE;
+		}
+
+		l_current_handler = opj_jp2_find_handler(box.type);
+		l_current_data_size = box.length - l_nb_bytes_read;
+
+		if (l_current_handler != 00) {
+			if (l_current_data_size > l_last_data_size) {
+				OPJ_BYTE* new_current_data = (OPJ_BYTE*)opj_realloc(l_current_data,l_current_data_size);
+				if (!new_current_data) {
+					opj_free(l_current_data);
+                    opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 box\n");
+					return OPJ_FALSE;
+				}
+                l_current_data = new_current_data;
+				l_last_data_size = l_current_data_size;
+			}
+
+			l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(stream,l_current_data,l_current_data_size,p_manager);
+			if (l_nb_bytes_read != l_current_data_size) {
+				opj_event_msg(p_manager, EVT_ERROR, "Problem with reading JPEG2000 box, stream error\n");
+                opj_free(l_current_data);                
+				return OPJ_FALSE;
+			}
+
+			if (! l_current_handler->handler(jp2,l_current_data,l_current_data_size,p_manager)) {
+				opj_free(l_current_data);
+				return OPJ_FALSE;
+			}
+		}
+		else {
+			jp2->jp2_state |= JP2_STATE_UNKNOWN;
+			if (opj_stream_skip(stream,l_current_data_size,p_manager) != l_current_data_size) {
+				opj_event_msg(p_manager, EVT_ERROR, "Problem with skipping JPEG2000 box, stream error\n");
+				opj_free(l_current_data);
+				return OPJ_FALSE;
+			}
+		}
+	}
+
+	opj_free(l_current_data);
+
+	return OPJ_TRUE;
+}
+
+/**
+ * Excutes the given procedures on the given codec.
+ *
+ * @param	p_procedure_list	the list of procedures to execute
+ * @param	jp2					the jpeg2000 file codec to execute the procedures on.
+ * @param	stream					the stream to execute the procedures on.
+ * @param	p_manager			the user manager.
+ *
+ * @return	true				if all the procedures were successfully executed.
+ */
+static OPJ_BOOL opj_jp2_exec (  opj_jp2_t * jp2,
+                                opj_procedure_list_t * p_procedure_list,
+                                opj_stream_private_t *stream,
+                                opj_event_mgr_t * p_manager
+                                )
+
+{
+	OPJ_BOOL (** l_procedure) (opj_jp2_t * jp2, opj_stream_private_t *, opj_event_mgr_t *) = 00;
+	OPJ_BOOL l_result = OPJ_TRUE;
+	OPJ_UINT32 l_nb_proc, i;
+
+	/* preconditions */
+	assert(p_procedure_list != 00);
+	assert(jp2 != 00);
+	assert(stream != 00);
+	assert(p_manager != 00);
+
+	l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
+	l_procedure = (OPJ_BOOL (**) (opj_jp2_t * jp2, opj_stream_private_t *, opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
+
+	for	(i=0;i<l_nb_proc;++i) {
+		l_result = l_result && (*l_procedure) (jp2,stream,p_manager);
+		++l_procedure;
+	}
+
+	/* and clear the procedure list at the end. */
+	opj_procedure_list_clear(p_procedure_list);
+	return l_result;
+}
+
+OPJ_BOOL opj_jp2_start_compress(opj_jp2_t *jp2,
+                                opj_stream_private_t *stream,
+                                opj_image_t * p_image,
+                                opj_event_mgr_t * p_manager
+                                )
+{
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(stream != 00);
+	assert(p_manager != 00);
+
+	/* customization of the validation */
+	opj_jp2_setup_encoding_validation (jp2);
+
+	/* validation of the parameters codec */
+	if (! opj_jp2_exec(jp2,jp2->m_validation_list,stream,p_manager)) {
+		return OPJ_FALSE;
+	}
+
+	/* customization of the encoding */
+	opj_jp2_setup_header_writing(jp2);
+
+	/* write header */
+	if (! opj_jp2_exec (jp2,jp2->m_procedure_list,stream,p_manager)) {
+		return OPJ_FALSE;
+	}
+
+	return opj_j2k_start_compress(jp2->j2k,stream,p_image,p_manager);
+}
+
+const opj_jp2_header_handler_t * opj_jp2_find_handler (OPJ_UINT32 p_id)
+{
+	OPJ_UINT32 i, l_handler_size = sizeof(jp2_header) / sizeof(opj_jp2_header_handler_t);
+
+	for (i=0;i<l_handler_size;++i) {
+		if (jp2_header[i].id == p_id) {
+			return &jp2_header[i];
+		}
+	}
+	return NULL;
+}
+
+/**
+ * Finds the image execution function related to the given box id.
+ *
+ * @param	p_id	the id of the handler to fetch.
+ *
+ * @return	the given handler or 00 if it could not be found.
+ */
+static const opj_jp2_header_handler_t * opj_jp2_img_find_handler (OPJ_UINT32 p_id)
+{
+	OPJ_UINT32 i, l_handler_size = sizeof(jp2_img_header) / sizeof(opj_jp2_header_handler_t);
+	for (i=0;i<l_handler_size;++i)
+	{
+		if (jp2_img_header[i].id == p_id) {
+			return &jp2_img_header[i];
+		}
+	}
+
+	return NULL;
+}
+
+/**
+ * Reads a jpeg2000 file signature box.
+ *
+ * @param	p_header_data	the data contained in the signature box.
+ * @param	jp2				the jpeg2000 file codec.
+ * @param	p_header_size	the size of the data contained in the signature box.
+ * @param	p_manager		the user event manager.
+ *
+ * @return true if the file signature box is valid.
+ */
+static OPJ_BOOL opj_jp2_read_jp(opj_jp2_t *jp2,
+                                OPJ_BYTE * p_header_data,
+                                OPJ_UINT32 p_header_size,
+                                opj_event_mgr_t * p_manager
+                                )
+
+{
+	OPJ_UINT32 l_magic_number;
+
+	/* preconditions */
+	assert(p_header_data != 00);
+	assert(jp2 != 00);
+	assert(p_manager != 00);
+
+	if (jp2->jp2_state != JP2_STATE_NONE) {
+		opj_event_msg(p_manager, EVT_ERROR, "The signature box must be the first box in the file.\n");
+		return OPJ_FALSE;
+	}
+
+	/* assure length of data is correct (4 -> magic number) */
+	if (p_header_size != 4) {
+		opj_event_msg(p_manager, EVT_ERROR, "Error with JP signature Box size\n");
+		return OPJ_FALSE;
+	}
+
+	/* rearrange data */
+	opj_read_bytes(p_header_data,&l_magic_number,4);
+	if (l_magic_number != 0x0d0a870a ) {
+		opj_event_msg(p_manager, EVT_ERROR, "Error with JP Signature : bad magic number\n");
+		return OPJ_FALSE;
+	}
+
+	jp2->jp2_state |= JP2_STATE_SIGNATURE;
+
+	return OPJ_TRUE;
+}
+
+/**
+ * Reads a a FTYP box - File type box
+ *
+ * @param	p_header_data	the data contained in the FTYP box.
+ * @param	jp2				the jpeg2000 file codec.
+ * @param	p_header_size	the size of the data contained in the FTYP box.
+ * @param	p_manager		the user event manager.
+ *
+ * @return true if the FTYP box is valid.
+ */
+static OPJ_BOOL opj_jp2_read_ftyp(	opj_jp2_t *jp2,
+									OPJ_BYTE * p_header_data,
+									OPJ_UINT32 p_header_size,
+									opj_event_mgr_t * p_manager
+                                    )
+{
+	OPJ_UINT32 i, l_remaining_bytes;
+
+	/* preconditions */
+	assert(p_header_data != 00);
+	assert(jp2 != 00);
+	assert(p_manager != 00);
+
+	if (jp2->jp2_state != JP2_STATE_SIGNATURE) {
+		opj_event_msg(p_manager, EVT_ERROR, "The ftyp box must be the second box in the file.\n");
+		return OPJ_FALSE;
+	}
+
+	/* assure length of data is correct */
+	if (p_header_size < 8) {
+		opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
+		return OPJ_FALSE;
+	}
+
+	opj_read_bytes(p_header_data,&jp2->brand,4);		/* BR */
+	p_header_data += 4;
+
+	opj_read_bytes(p_header_data,&jp2->minversion,4);		/* MinV */
+	p_header_data += 4;
+
+	l_remaining_bytes = p_header_size - 8;
+
+	/* the number of remaining bytes should be a multiple of 4 */
+	if ((l_remaining_bytes & 0x3) != 0) {
+		opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
+		return OPJ_FALSE;
+	}
+
+	/* div by 4 */
+	jp2->numcl = l_remaining_bytes >> 2;
+	if (jp2->numcl) {
+		jp2->cl = (OPJ_UINT32 *) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
+		if (jp2->cl == 00) {
+			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory with FTYP Box\n");
+			return OPJ_FALSE;
+		}
+		memset(jp2->cl,0,jp2->numcl * sizeof(OPJ_UINT32));
+	}
+
+	for (i = 0; i < jp2->numcl; ++i)
+	{
+		opj_read_bytes(p_header_data,&jp2->cl[i],4);		/* CLi */
+		p_header_data += 4;
+	}
+
+	jp2->jp2_state |= JP2_STATE_FILE_TYPE;
+
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_skip_jp2c(	opj_jp2_t *jp2,
+					    	opj_stream_private_t *stream,
+					    	opj_event_mgr_t * p_manager )
+{
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(stream != 00);
+	assert(p_manager != 00);
+
+	jp2->j2k_codestream_offset = opj_stream_tell(stream);
+
+	if (opj_stream_skip(stream,8,p_manager) != 8) {
+		return OPJ_FALSE;
+	}
+
+	return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_jpip_skip_iptr(	opj_jp2_t *jp2,
+  opj_stream_private_t *stream,
+  opj_event_mgr_t * p_manager )
+{
+  /* preconditions */
+  assert(jp2 != 00);
+  assert(stream != 00);
+  assert(p_manager != 00);
+
+  jp2->jpip_iptr_offset = opj_stream_tell(stream);
+
+  if (opj_stream_skip(stream,24,p_manager) != 24) {
+    return OPJ_FALSE;
+  }
+
+  return OPJ_TRUE;
+}
+
+/**
+ * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
+ *
+ * @param	p_header_data	the data contained in the file header box.
+ * @param	jp2				the jpeg2000 file codec.
+ * @param	p_header_size	the size of the data contained in the file header box.
+ * @param	p_manager		the user event manager.
+ *
+ * @return true if the JP2 Header box was successfully reconized.
+*/
+static OPJ_BOOL opj_jp2_read_jp2h(  opj_jp2_t *jp2,
+                                    OPJ_BYTE *p_header_data,
+                                    OPJ_UINT32 p_header_size,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+	OPJ_UINT32 l_box_size=0, l_current_data_size = 0;
+	opj_jp2_box_t box;
+	const opj_jp2_header_handler_t * l_current_handler;
+
+	/* preconditions */
+	assert(p_header_data != 00);
+	assert(jp2 != 00);
+	assert(p_manager != 00);
+
+	/* make sure the box is well placed */
+	if ((jp2->jp2_state & JP2_STATE_FILE_TYPE) != JP2_STATE_FILE_TYPE ) {
+		opj_event_msg(p_manager, EVT_ERROR, "The  box must be the first box in the file.\n");
+		return OPJ_FALSE;
+	}
+
+	jp2->jp2_img_state = JP2_IMG_STATE_NONE;
+
+	/* iterate while remaining data */
+	while (p_header_size > 0) {
+
+		if (! opj_jp2_read_boxhdr_char(&box,p_header_data,&l_box_size,p_header_size, p_manager)) {
+			opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box\n");
+			return OPJ_FALSE;
+		}
+
+		if (box.length > p_header_size) {
+			opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box: box length is inconsistent.\n");
+			return OPJ_FALSE;
+		}
+
+		l_current_handler = opj_jp2_img_find_handler(box.type);
+		//BUGID:0055999
+		//test file: fuzz-signal_sigsegv_6b88de_1123_2509.pdf
+		if (box.length < l_box_size) return OPJ_FALSE;
+		l_current_data_size = box.length - l_box_size;
+		p_header_data += l_box_size;
+
+		if (l_current_handler != 00) {
+			if (! l_current_handler->handler(jp2,p_header_data,l_current_data_size,p_manager)) {
+				return OPJ_FALSE;
+			}
+		}
+		else {
+			jp2->jp2_img_state |= JP2_IMG_STATE_UNKNOWN;
+		}
+
+		p_header_data += l_current_data_size;
+		p_header_size -= box.length;
+	}
+
+	jp2->jp2_state |= JP2_STATE_HEADER;
+
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_read_boxhdr_char(   opj_jp2_box_t *box,
+                                     OPJ_BYTE * p_data,
+                                     OPJ_UINT32 * p_number_bytes_read,
+                                     OPJ_UINT32 p_box_max_size,
+                                     opj_event_mgr_t * p_manager
+                                     )
+{
+	OPJ_UINT32 l_value;
+
+	/* preconditions */
+	assert(p_data != 00);
+	assert(box != 00);
+	assert(p_number_bytes_read != 00);
+	assert(p_manager != 00);
+
+	if (p_box_max_size < 8) {
+		opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of less than 8 bytes\n");
+		return OPJ_FALSE;
+	}
+
+	/* process read data */
+	opj_read_bytes(p_data, &l_value, 4);
+	p_data += 4;
+	box->length = (OPJ_UINT32)(l_value);
+
+	opj_read_bytes(p_data, &l_value, 4);
+	p_data += 4;
+	box->type = (OPJ_UINT32)(l_value);
+
+	*p_number_bytes_read = 8;
+
+	/* do we have a "special very large box ?" */
+	/* read then the XLBox */
+	if (box->length == 1) {
+		OPJ_UINT32 l_xl_part_size;
+
+		if (p_box_max_size < 16) {
+			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle XL box of less than 16 bytes\n");
+			return OPJ_FALSE;
+		}
+
+		opj_read_bytes(p_data,&l_xl_part_size, 4);
+		p_data += 4;
+		*p_number_bytes_read += 4;
+
+		if (l_xl_part_size != 0) {
+			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
+			return OPJ_FALSE;
+		}
+
+		opj_read_bytes(p_data, &l_value, 4);
+		*p_number_bytes_read += 4;
+		box->length = (OPJ_UINT32)(l_value);
+
+		if (box->length == 0) {
+			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
+			return OPJ_FALSE;
+		}
+	}
+	else if (box->length == 0) {
+		opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
+		return OPJ_FALSE;
+	}
+
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_read_header(	opj_stream_private_t *p_stream,
+                                opj_jp2_t *jp2,
+                                opj_image_t ** p_image,
+                                opj_event_mgr_t * p_manager
+                                )
+{
+	/* preconditions */
+	assert(jp2 != 00);
+	assert(p_stream != 00);
+	assert(p_manager != 00);
+
+	/* customization of the validation */
+	opj_jp2_setup_decoding_validation (jp2);
+
+	/* customization of the encoding */
+	opj_jp2_setup_header_reading(jp2);
+
+	/* validation of the parameters codec */
+	if (! opj_jp2_exec(jp2,jp2->m_validation_list,p_stream,p_manager)) {
+		return OPJ_FALSE;
+	}
+
+	/* read header */
+	if (! opj_jp2_exec (jp2,jp2->m_procedure_list,p_stream,p_manager)) {
+		return OPJ_FALSE;
+	}
+
+	return opj_j2k_read_header(	p_stream,
+							jp2->j2k,
+							p_image,
+							p_manager);
+}
+
+void opj_jp2_setup_encoding_validation (opj_jp2_t *jp2)
+{
+	/* preconditions */
+	assert(jp2 != 00);
+
+	opj_procedure_list_add_procedure(jp2->m_validation_list, (opj_procedure)opj_jp2_default_validation);
+	/* DEVELOPER CORNER, add your custom validation procedure */
+}
+
+void opj_jp2_setup_decoding_validation (opj_jp2_t *jp2)
+{
+	/* preconditions */
+	assert(jp2 != 00);
+	/* DEVELOPER CORNER, add your custom validation procedure */
+}
+
+void opj_jp2_setup_header_writing (opj_jp2_t *jp2)
+{
+	/* preconditions */
+	assert(jp2 != 00);
+
+	opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp );
+	opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_ftyp );
+	opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp2h );
+  if( jp2->jpip_on )
+    opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_skip_iptr );
+	opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_skip_jp2c );
+
+	/* DEVELOPER CORNER, insert your custom procedures */
+
+}
+
+void opj_jp2_setup_header_reading (opj_jp2_t *jp2)
+{
+	/* preconditions */
+	assert(jp2 != 00);
+
+	opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_read_header_procedure );
+	/* DEVELOPER CORNER, add your custom procedures */
+}
+
+OPJ_BOOL opj_jp2_read_tile_header ( opj_jp2_t * p_jp2,
+                                    OPJ_UINT32 * p_tile_index,
+                                    OPJ_UINT32 * p_data_size,
+                                    OPJ_INT32 * p_tile_x0,
+                                    OPJ_INT32 * p_tile_y0,
+                                    OPJ_INT32 * p_tile_x1,
+                                    OPJ_INT32 * p_tile_y1,
+                                    OPJ_UINT32 * p_nb_comps,
+                                    OPJ_BOOL * p_go_on,
+                                    opj_stream_private_t *p_stream,
+                                    opj_event_mgr_t * p_manager
+                                    )
+{
+	return opj_j2k_read_tile_header(p_jp2->j2k,
+								p_tile_index,
+								p_data_size,
+								p_tile_x0, p_tile_y0,
+								p_tile_x1, p_tile_y1,
+								p_nb_comps,
+								p_go_on,
+								p_stream,
+								p_manager);
+}
+
+OPJ_BOOL opj_jp2_write_tile (	opj_jp2_t *p_jp2,
+					 	 	    OPJ_UINT32 p_tile_index,
+					 	 	    OPJ_BYTE * p_data,
+					 	 	    OPJ_UINT32 p_data_size,
+					 	 	    opj_stream_private_t *p_stream,
+					 	 	    opj_event_mgr_t * p_manager
+                                )
+
+{
+	return opj_j2k_write_tile (p_jp2->j2k,p_tile_index,p_data,p_data_size,p_stream,p_manager);
+}
+
+OPJ_BOOL opj_jp2_decode_tile (  opj_jp2_t * p_jp2,
+                                OPJ_UINT32 p_tile_index,
+                                OPJ_BYTE * p_data,
+                                OPJ_UINT32 p_data_size,
+                                opj_stream_private_t *p_stream,
+                                opj_event_mgr_t * p_manager
+                                )
+{
+	return opj_j2k_decode_tile (p_jp2->j2k,p_tile_index,p_data,p_data_size,p_stream,p_manager);
+}
+
+void opj_jp2_destroy(opj_jp2_t *jp2)
+{
+	if (jp2) {
+		/* destroy the J2K codec */
+		opj_j2k_destroy(jp2->j2k);
+		jp2->j2k = 00;
+
+		if (jp2->comps) {
+			opj_free(jp2->comps);
+			jp2->comps = 00;
+		}
+
+		if (jp2->cl) {
+			opj_free(jp2->cl);
+			jp2->cl = 00;
+		}
+
+		if (jp2->color.icc_profile_buf) {
+			opj_free(jp2->color.icc_profile_buf);
+			jp2->color.icc_profile_buf = 00;
+		}
+
+		if (jp2->color.jp2_cdef) {
+			if (jp2->color.jp2_cdef->info) {
+				opj_free(jp2->color.jp2_cdef->info);
+				jp2->color.jp2_cdef->info = NULL;
+			}
+
+			opj_free(jp2->color.jp2_cdef);
+			jp2->color.jp2_cdef = 00;
+		}
+
+		if (jp2->color.jp2_pclr) {
+			if (jp2->color.jp2_pclr->cmap) {
+				opj_free(jp2->color.jp2_pclr->cmap);
+				jp2->color.jp2_pclr->cmap = NULL;
+			}
+			if (jp2->color.jp2_pclr->channel_sign) {
+				opj_free(jp2->color.jp2_pclr->channel_sign);
+				jp2->color.jp2_pclr->channel_sign = NULL;
+			}
+			if (jp2->color.jp2_pclr->channel_size) {
+				opj_free(jp2->color.jp2_pclr->channel_size);
+				jp2->color.jp2_pclr->channel_size = NULL;
+			}
+			if (jp2->color.jp2_pclr->entries) {
+				opj_free(jp2->color.jp2_pclr->entries);
+				jp2->color.jp2_pclr->entries = NULL;
+			}
+
+			opj_free(jp2->color.jp2_pclr);
+			jp2->color.jp2_pclr = 00;
+		}
+
+		if (jp2->m_validation_list) {
+			opj_procedure_list_destroy(jp2->m_validation_list);
+			jp2->m_validation_list = 00;
+		}
+
+		if (jp2->m_procedure_list) {
+			opj_procedure_list_destroy(jp2->m_procedure_list);
+			jp2->m_procedure_list = 00;
+		}
+
+		opj_free(jp2);
+	}
+}
+
+OPJ_BOOL opj_jp2_set_decode_area(	opj_jp2_t *p_jp2,
+								    opj_image_t* p_image,
+								    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+								    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
+								    opj_event_mgr_t * p_manager
+                                    )
+{
+	return opj_j2k_set_decode_area(p_jp2->j2k, p_image, p_start_x, p_start_y, p_end_x, p_end_y, p_manager);
+}
+
+OPJ_BOOL opj_jp2_get_tile(	opj_jp2_t *p_jp2,
+                            opj_stream_private_t *p_stream,
+                            opj_image_t* p_image,
+                            opj_event_mgr_t * p_manager,
+                            OPJ_UINT32 tile_index
+                            )
+{
+	if (!p_image)
+		return OPJ_FALSE;
+
+	opj_event_msg(p_manager, EVT_WARNING, "JP2 box which are after the codestream will not be read by this function.\n");
+
+	if (! opj_j2k_get_tile(p_jp2->j2k, p_stream, p_image, p_manager, tile_index) ){
+		opj_event_msg(p_manager, EVT_ERROR, "Failed to decode the codestream in the JP2 file\n");
+		return OPJ_FALSE;
+	}
+
+	if (!opj_jp2_check_color(p_image, &(p_jp2->color), p_manager)) {
+		return OPJ_FALSE;
+	}
+
+	/* Set Image Color Space */
+	if (p_jp2->enumcs == 16)
+		p_image->color_space = OPJ_CLRSPC_SRGB;
+	else if (p_jp2->enumcs == 17)
+		p_image->color_space = OPJ_CLRSPC_GRAY;
+	else if (p_jp2->enumcs == 18)
+		p_image->color_space = OPJ_CLRSPC_SYCC;
+	else
+		p_image->color_space = OPJ_CLRSPC_UNKNOWN;
+
+	/* Apply the color space if needed */
+	if(p_jp2->color.jp2_cdef) {
+		opj_jp2_apply_cdef(p_image, &(p_jp2->color));
+	}
+
+	if(p_jp2->color.jp2_pclr) {
+		/* Part 1, I.5.3.4: Either both or none : */
+		if( !p_jp2->color.jp2_pclr->cmap)
+			opj_jp2_free_pclr(&(p_jp2->color));
+		else
+			opj_jp2_apply_pclr(p_image, &(p_jp2->color));
+	}
+
+	if(p_jp2->color.icc_profile_buf) {
+		p_image->icc_profile_buf = p_jp2->color.icc_profile_buf;
+		p_image->icc_profile_len = p_jp2->color.icc_profile_len;
+		p_jp2->color.icc_profile_buf = NULL;
+	}
+
+	return OPJ_TRUE;
+}
+
+/* ----------------------------------------------------------------------- */
+/* JP2 encoder interface                                             */
+/* ----------------------------------------------------------------------- */
+
+opj_jp2_t* opj_jp2_create(OPJ_BOOL p_is_decoder)
+{
+	opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t));
+	if (jp2) {
+		memset(jp2,0,sizeof(opj_jp2_t));
+
+		/* create the J2K codec */
+		if (! p_is_decoder) {
+			jp2->j2k = opj_j2k_create_compress();
+		}
+		else {
+			jp2->j2k = opj_j2k_create_decompress();
+		}
+
+		if (jp2->j2k == 00) {
+			opj_jp2_destroy(jp2);
+			return 00;
+		}
+
+		/* Color structure */
+		jp2->color.icc_profile_buf = NULL;
+		jp2->color.icc_profile_len = 0;
+		jp2->color.jp2_cdef = NULL;
+		jp2->color.jp2_pclr = NULL;
+		jp2->color.jp2_has_colr = 0;
+
+		/* validation list creation */
+		jp2->m_validation_list = opj_procedure_list_create();
+		if (! jp2->m_validation_list) {
+			opj_jp2_destroy(jp2);
+			return 00;
+		}
+
+		/* execution list creation */
+		jp2->m_procedure_list = opj_procedure_list_create();
+		if (! jp2->m_procedure_list) {
+			opj_jp2_destroy(jp2);
+			return 00;
+		}
+	}
+
+	return jp2;
+}
+
+void jp2_dump(opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream)
+{
+	/* preconditions */
+	assert(p_jp2 != 00);
+
+	j2k_dump(p_jp2->j2k,
+					flag,
+					out_stream);
+}
+
+opj_codestream_index_t* jp2_get_cstr_index(opj_jp2_t* p_jp2)
+{
+	return j2k_get_cstr_index(p_jp2->j2k);
+}
+
+opj_codestream_info_v2_t* jp2_get_cstr_info(opj_jp2_t* p_jp2)
+{
+	return j2k_get_cstr_info(p_jp2->j2k);
+}
+
+OPJ_BOOL opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2,
+                                               OPJ_UINT32 res_factor,
+                                               opj_event_mgr_t * p_manager)
+{
+	return opj_j2k_set_decoded_resolution_factor(p_jp2->j2k, res_factor, p_manager);
+}
+
+/* JPIP specific */
+
+#ifdef USE_JPIP
+static OPJ_BOOL opj_jpip_write_iptr(opj_jp2_t *jp2,
+  opj_stream_private_t *cio,
+  opj_event_mgr_t * p_manager )
+{
+  OPJ_OFF_T j2k_codestream_exit;
+  OPJ_BYTE l_data_header [24];
+
+  /* preconditions */
+  assert(jp2 != 00);
+  assert(cio != 00);
+  assert(p_manager != 00);
+  assert(opj_stream_has_seek(cio));
+
+  j2k_codestream_exit = opj_stream_tell(cio);
+  opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
+  opj_write_bytes(l_data_header + 4,JPIP_IPTR,4);									   /* IPTR */
+#if 0
+  opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
+  opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
+#else
+  opj_write_double(l_data_header + 4 + 4, 0); /* offset */
+  opj_write_double(l_data_header + 8 + 8, 0); /* length */
+#endif
+
+  if (! opj_stream_seek(cio,jp2->jpip_iptr_offset,p_manager)) {
+    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+    return OPJ_FALSE;
+  }
+
+  if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {
+    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+    return OPJ_FALSE;
+  }
+
+  if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
+    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+    return OPJ_FALSE;
+  }
+
+  return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,
+  opj_stream_private_t *cio,
+  opj_event_mgr_t * p_manager )
+{
+  OPJ_OFF_T j2k_codestream_exit;
+  OPJ_BYTE l_data_header [24];
+
+  /* preconditions */
+  assert(jp2 != 00);
+  assert(cio != 00);
+  assert(p_manager != 00);
+  assert(opj_stream_has_seek(cio));
+
+  opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
+  opj_write_bytes(l_data_header + 4,JPIP_FIDX,4);									   /* IPTR */
+  opj_write_double(l_data_header + 4 + 4, 0); /* offset */
+  opj_write_double(l_data_header + 8 + 8, 0); /* length */
+
+  if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {
+    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+    return OPJ_FALSE;
+  }
+
+  j2k_codestream_exit = opj_stream_tell(cio);
+  if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
+    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+    return OPJ_FALSE;
+  }
+
+  return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,
+  opj_stream_private_t *cio,
+  opj_event_mgr_t * p_manager )
+{
+  OPJ_OFF_T j2k_codestream_exit;
+  OPJ_BYTE l_data_header [24];
+
+  /* preconditions */
+  assert(jp2 != 00);
+  assert(cio != 00);
+  assert(p_manager != 00);
+  assert(opj_stream_has_seek(cio));
+
+  j2k_codestream_exit = opj_stream_tell(cio);
+  opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
+  opj_write_bytes(l_data_header + 4,JPIP_CIDX,4);									   /* IPTR */
+#if 0
+  opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
+  opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
+#else
+  opj_write_double(l_data_header + 4 + 4, 0); /* offset */
+  opj_write_double(l_data_header + 8 + 8, 0); /* length */
+#endif
+
+  if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
+    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+    return OPJ_FALSE;
+  }
+
+  if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {
+    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+    return OPJ_FALSE;
+  }
+
+  j2k_codestream_exit = opj_stream_tell(cio);
+  if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
+    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+    return OPJ_FALSE;
+  }
+
+  return OPJ_TRUE;
+}
+
+#if 0
+static void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_stream_private_t *cio,
+  opj_event_mgr_t * p_manager )
+{
+  OPJ_BYTE l_data_header [8];
+  OPJ_OFF_T len, lenp;
+
+  lenp = opj_stream_tell(cio);
+  opj_stream_skip(cio, 4, p_manager);         /* L [at the end] */
+  opj_write_bytes(l_data_header,JPIP_PRXY,4); /* IPTR           */
+  opj_stream_write_data(cio,l_data_header,4,p_manager);
+
+  opj_write_bytes( l_data_header, offset_jp2c, 8); /* OOFF           */
+  opj_stream_write_data(cio,l_data_header,8,p_manager);
+  opj_write_bytes( l_data_header, length_jp2c, 4); /* OBH part 1     */
+  opj_write_bytes( l_data_header+4, JP2_JP2C, 4);  /* OBH part 2     */
+  opj_stream_write_data(cio,l_data_header,8,p_manager);
+
+  opj_write_bytes( l_data_header, 1, 1);/* NI             */
+  opj_stream_write_data(cio,l_data_header,1,p_manager);
+
+  opj_write_bytes( l_data_header, offset_idx, 8);  /* IOFF           */
+  opj_stream_write_data(cio,l_data_header,8,p_manager);
+  opj_write_bytes( l_data_header, length_idx, 4);  /* IBH part 1     */
+  opj_write_bytes( l_data_header+4, JPIP_CIDX, 4);   /* IBH part 2     */
+  opj_stream_write_data(cio,l_data_header,8,p_manager);
+
+  len = opj_stream_tell(cio)-lenp;
+  opj_stream_skip(cio, lenp, p_manager);
+  opj_write_bytes(l_data_header,len,4);/* L              */
+  opj_stream_write_data(cio,l_data_header,4,p_manager);
+  opj_stream_seek(cio, lenp+len,p_manager);
+}
+#endif
+
+
+#if 0
+static int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_stream_private_t *cio,
+  opj_event_mgr_t * p_manager )
+{
+  OPJ_BYTE l_data_header [4];
+  OPJ_OFF_T len, lenp;
+
+  lenp = opj_stream_tell(cio);
+  opj_stream_skip(cio, 4, p_manager);
+  opj_write_bytes(l_data_header,JPIP_FIDX,4); /* FIDX */
+  opj_stream_write_data(cio,l_data_header,4,p_manager);
+
+  write_prxy( offset_jp2c, length_jp2c, offset_idx, length_idx, cio,p_manager);
+
+  len = opj_stream_tell(cio)-lenp;
+  opj_stream_skip(cio, lenp, p_manager);
+  opj_write_bytes(l_data_header,len,4);/* L              */
+  opj_stream_write_data(cio,l_data_header,4,p_manager);
+  opj_stream_seek(cio, lenp+len,p_manager);
+
+  return len;
+}
+#endif
+#endif /* USE_JPIP */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.h
new file mode 100644
index 0000000..c11d2f3
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.h
@@ -0,0 +1,495 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __JP2_H
+#define __JP2_H
+/**
+@file jp2.h
+@brief The JPEG-2000 file format Reader/Writer (JP2)
+
+*/
+
+/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
+/*@{*/
+
+/*#define JPIP_JPIP 0x6a706970*/
+
+#define     JP2_JP   0x6a502020    /**< JPEG 2000 signature box */
+#define     JP2_FTYP 0x66747970    /**< File type box */
+#define     JP2_JP2H 0x6a703268    /**< JP2 header box (super-box) */
+#define     JP2_IHDR 0x69686472    /**< Image header box */
+#define     JP2_COLR 0x636f6c72    /**< Colour specification box */
+#define     JP2_JP2C 0x6a703263    /**< Contiguous codestream box */
+#define     JP2_URL  0x75726c20    /**< Data entry URL box */
+#define     JP2_PCLR 0x70636c72    /**< Palette box */
+#define     JP2_CMAP 0x636d6170    /**< Component Mapping box */
+#define     JP2_CDEF 0x63646566    /**< Channel Definition box */
+#define     JP2_DTBL 0x6474626c    /**< Data Reference box */
+#define     JP2_BPCC 0x62706363    /**< Bits per component box */
+#define     JP2_JP2  0x6a703220    /**< File type fields */
+
+/* For the future */
+/* #define JP2_RES 0x72657320 */  /**< Resolution box (super-box) */
+/* #define JP2_JP2I 0x6a703269 */  /**< Intellectual property box */
+/* #define JP2_XML  0x786d6c20 */  /**< XML box */
+/* #define JP2_UUID 0x75756994 */  /**< UUID box */
+/* #define JP2_UINF 0x75696e66 */  /**< UUID info box (super-box) */
+/* #define JP2_ULST 0x756c7374 */  /**< UUID list box */
+
+/* ----------------------------------------------------------------------- */
+
+typedef enum
+{
+  JP2_STATE_NONE            = 0x0,
+  JP2_STATE_SIGNATURE       = 0x1,
+  JP2_STATE_FILE_TYPE       = 0x2,
+  JP2_STATE_HEADER          = 0x4,
+  JP2_STATE_CODESTREAM      = 0x8,
+  JP2_STATE_END_CODESTREAM  = 0x10,
+  JP2_STATE_UNKNOWN         = 0x7fffffff /* ISO C restricts enumerator values to range of 'int' */
+}
+JP2_STATE;
+
+typedef enum
+{
+  JP2_IMG_STATE_NONE        = 0x0,
+  JP2_IMG_STATE_UNKNOWN     = 0x7fffffff
+}
+JP2_IMG_STATE;
+
+/** 
+Channel description: channel index, type, assocation
+*/
+typedef struct opj_jp2_cdef_info
+{
+    OPJ_UINT16 cn, typ, asoc;
+} opj_jp2_cdef_info_t;
+
+/** 
+Channel descriptions and number of descriptions
+*/
+typedef struct opj_jp2_cdef
+{
+    opj_jp2_cdef_info_t *info;
+    OPJ_UINT16 n;
+} opj_jp2_cdef_t;
+
+/** 
+Component mappings: channel index, mapping type, palette index
+*/
+typedef struct opj_jp2_cmap_comp
+{
+    OPJ_UINT16 cmp;
+    OPJ_BYTE mtyp, pcol;
+} opj_jp2_cmap_comp_t;
+
+/** 
+Palette data: table entries, palette columns
+*/
+typedef struct opj_jp2_pclr
+{
+    OPJ_UINT32 *entries;
+    OPJ_BYTE *channel_sign;
+    OPJ_BYTE *channel_size;
+    opj_jp2_cmap_comp_t *cmap;
+    OPJ_UINT16 nr_entries;
+    OPJ_BYTE nr_channels;
+} opj_jp2_pclr_t;
+
+/** 
+Collector for ICC profile, palette, component mapping, channel description 
+*/
+typedef struct opj_jp2_color
+{
+    OPJ_BYTE *icc_profile_buf;
+    OPJ_UINT32 icc_profile_len;
+
+    opj_jp2_cdef_t *jp2_cdef;
+    opj_jp2_pclr_t *jp2_pclr;
+    OPJ_BYTE jp2_has_colr;
+} opj_jp2_color_t;
+
+/** 
+JP2 component
+*/
+typedef struct opj_jp2_comps {
+  OPJ_UINT32 depth;      
+  OPJ_UINT32 sgnd;       
+  OPJ_UINT32 bpcc;
+} opj_jp2_comps_t;
+
+/**
+JPEG-2000 file format reader/writer
+*/
+typedef struct opj_jp2
+{
+  /** handle to the J2K codec  */
+  opj_j2k_t *j2k;
+  /** list of validation procedures */
+  struct opj_procedure_list * m_validation_list;
+  /** list of execution procedures */
+  struct opj_procedure_list * m_procedure_list;
+
+  /* width of image */
+  OPJ_UINT32 w;
+  /* height of image */
+  OPJ_UINT32 h;
+  /* number of components in the image */
+  OPJ_UINT32 numcomps;
+  OPJ_UINT32 bpc;
+  OPJ_UINT32 C;
+  OPJ_UINT32 UnkC;
+  OPJ_UINT32 IPR;
+  OPJ_UINT32 meth;
+  OPJ_UINT32 approx;
+  OPJ_UINT32 enumcs;
+  OPJ_UINT32 precedence;
+  OPJ_UINT32 brand;
+  OPJ_UINT32 minversion;
+  OPJ_UINT32 numcl;
+  OPJ_UINT32 *cl;
+  opj_jp2_comps_t *comps;
+  /* FIXME: The following two variables are used to save offset
+    as we write out a JP2 file to disk. This mecanism is not flexible
+    as codec writers will need to extand those fields as new part
+    of the standard are implemented.
+  */
+    OPJ_OFF_T j2k_codestream_offset;
+    OPJ_OFF_T jpip_iptr_offset;
+	OPJ_BOOL jpip_on;
+  OPJ_UINT32 jp2_state;
+  OPJ_UINT32 jp2_img_state;
+
+  opj_jp2_color_t color;
+    
+    OPJ_BOOL ignore_pclr_cmap_cdef;
+}
+opj_jp2_t;
+
+/**
+JP2 Box
+*/
+typedef struct opj_jp2_box {
+    OPJ_UINT32 length;
+    OPJ_UINT32 type;
+    OPJ_INT32 init_pos;
+} opj_jp2_box_t;
+
+typedef struct opj_jp2_header_handler
+{
+  /* marker value */
+  OPJ_UINT32 id;
+  /* action linked to the marker */
+  OPJ_BOOL (*handler) (     opj_jp2_t *jp2, 
+                            OPJ_BYTE *p_header_data, 
+                            OPJ_UINT32 p_header_size, 
+                            opj_event_mgr_t * p_manager);
+}
+opj_jp2_header_handler_t;
+
+
+typedef struct opj_jp2_img_header_writer_handler 
+{
+  /* action to perform */
+  OPJ_BYTE*   (*handler) (opj_jp2_t *jp2, OPJ_UINT32 * p_data_size);
+  /* result of the action : data */
+  OPJ_BYTE*   m_data;
+  /* size of data */
+  OPJ_UINT32  m_size;
+} 
+opj_jp2_img_header_writer_handler_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Writes the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
+ *
+ * @param  jp2      the jpeg2000 file codec.
+ * @param  stream      the stream to write data to.
+ * @param  p_manager  user event manager.
+ *
+ * @return true if writing was successful.
+*/
+OPJ_BOOL opj_jp2_write_jp2h(opj_jp2_t *jp2,
+                            opj_stream_private_t *stream,
+                            opj_event_mgr_t * p_manager );
+
+/**
+Setup the decoder decoding parameters using user parameters.
+Decoding parameters are returned in jp2->j2k->cp.
+@param jp2 JP2 decompressor handle
+@param parameters decompression parameters
+*/
+void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);
+
+/**
+ * Decode an image from a JPEG-2000 file stream
+ * @param jp2 JP2 decompressor handle
+ * @param p_stream  FIXME DOC
+ * @param p_image   FIXME DOC
+ * @param p_manager FIXME DOC
+ *
+ * @return Returns a decoded image if successful, returns NULL otherwise
+*/
+OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,
+                        opj_stream_private_t *p_stream,
+            opj_image_t* p_image,
+            opj_event_mgr_t * p_manager);
+
+/**
+ * Setup the encoder parameters using the current image and using user parameters. 
+ * Coding parameters are returned in jp2->j2k->cp. 
+ *
+ * @param jp2 JP2 compressor handle
+ * @param parameters compression parameters
+ * @param image input filled image
+ * @param p_manager  FIXME DOC
+*/
+void opj_jp2_setup_encoder(  opj_jp2_t *jp2, 
+                            opj_cparameters_t *parameters, 
+                            opj_image_t *image, 
+                            opj_event_mgr_t * p_manager);
+
+/**
+Encode an image into a JPEG-2000 file stream
+@param jp2      JP2 compressor handle
+@param stream    Output buffer stream
+@param p_manager  event manager
+@return Returns true if successful, returns false otherwise
+*/
+OPJ_BOOL opj_jp2_encode(  opj_jp2_t *jp2, 
+              opj_stream_private_t *stream, 
+              opj_event_mgr_t * p_manager);
+
+
+/**
+ * Starts a compression scheme, i.e. validates the codec parameters, writes the header.
+ *
+ * @param  jp2    the jpeg2000 file codec.
+ * @param  stream    the stream object.
+ * @param  p_image   FIXME DOC
+ * @param p_manager FIXME DOC
+ *
+ * @return true if the codec is valid.
+ */
+OPJ_BOOL opj_jp2_start_compress(opj_jp2_t *jp2,
+                                opj_stream_private_t *stream,
+                                opj_image_t * p_image,
+                                opj_event_mgr_t * p_manager);
+
+
+/**
+ * Ends the compression procedures and possibiliy add data to be read after the
+ * codestream.
+ */
+OPJ_BOOL opj_jp2_end_compress(  opj_jp2_t *jp2,
+                  opj_stream_private_t *cio,
+                  opj_event_mgr_t * p_manager);
+
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Ends the decompression procedures and possibiliy add data to be read after the
+ * codestream.
+ */
+OPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2, 
+                                opj_stream_private_t *cio,
+                                opj_event_mgr_t * p_manager);
+
+/**
+ * Reads a jpeg2000 file header structure.
+ *
+ * @param p_stream the stream to read data from.
+ * @param jp2 the jpeg2000 file header structure.
+ * @param p_image   FIXME DOC
+ * @param p_manager the user event manager.
+ *
+ * @return true if the box is valid.
+ */
+OPJ_BOOL opj_jp2_read_header(  opj_stream_private_t *p_stream,
+                                opj_jp2_t *jp2,
+                                opj_image_t ** p_image,
+                                opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a tile header.
+ * @param  p_jp2         the jpeg2000 codec.
+ * @param  p_tile_index  FIXME DOC
+ * @param  p_data_size   FIXME DOC
+ * @param  p_tile_x0     FIXME DOC
+ * @param  p_tile_y0     FIXME DOC
+ * @param  p_tile_x1     FIXME DOC
+ * @param  p_tile_y1     FIXME DOC
+ * @param  p_nb_comps    FIXME DOC
+ * @param  p_go_on       FIXME DOC
+ * @param  p_stream      the stream to write data to.
+ * @param  p_manager     the user event manager.
+ */
+OPJ_BOOL opj_jp2_read_tile_header ( opj_jp2_t * p_jp2,
+                                    OPJ_UINT32 * p_tile_index,
+                                    OPJ_UINT32 * p_data_size,
+                                    OPJ_INT32 * p_tile_x0,
+                                    OPJ_INT32 * p_tile_y0,
+                                    OPJ_INT32 * p_tile_x1,
+                                    OPJ_INT32 * p_tile_y1,
+                                    OPJ_UINT32 * p_nb_comps,
+                                    OPJ_BOOL * p_go_on,
+                                    opj_stream_private_t *p_stream,
+                                    opj_event_mgr_t * p_manager );
+
+/**
+ * Writes a tile.
+ *
+ * @param  p_jp2    the jpeg2000 codec.
+ * @param p_tile_index  FIXME DOC
+ * @param p_data        FIXME DOC
+ * @param p_data_size   FIXME DOC
+ * @param  p_stream      the stream to write data to.
+ * @param  p_manager  the user event manager.
+ */
+OPJ_BOOL opj_jp2_write_tile (  opj_jp2_t *p_jp2,
+                    OPJ_UINT32 p_tile_index,
+                    OPJ_BYTE * p_data,
+                    OPJ_UINT32 p_data_size,
+                    opj_stream_private_t *p_stream,
+                    opj_event_mgr_t * p_manager );
+
+/**
+ * Decode tile data.
+ * @param  p_jp2    the jpeg2000 codec.
+ * @param  p_tile_index FIXME DOC
+ * @param  p_data       FIXME DOC
+ * @param  p_data_size  FIXME DOC
+ * @param  p_stream      the stream to write data to.
+ * @param  p_manager  the user event manager.
+ *
+ * @return FIXME DOC
+ */
+OPJ_BOOL opj_jp2_decode_tile (  opj_jp2_t * p_jp2,
+                                OPJ_UINT32 p_tile_index,
+                                OPJ_BYTE * p_data,
+                                OPJ_UINT32 p_data_size,
+                                opj_stream_private_t *p_stream,
+                                opj_event_mgr_t * p_manager );
+
+/**
+ * Creates a jpeg2000 file decompressor.
+ *
+ * @return  an empty jpeg2000 file codec.
+ */
+opj_jp2_t* opj_jp2_create (OPJ_BOOL p_is_decoder);
+
+/**
+Destroy a JP2 decompressor handle
+@param jp2 JP2 decompressor handle to destroy
+*/
+void opj_jp2_destroy(opj_jp2_t *jp2);
+
+
+/**
+ * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.
+ *
+ * @param  p_jp2      the jpeg2000 codec.
+ * @param  p_image     FIXME DOC
+ * @param  p_start_x   the left position of the rectangle to decode (in image coordinates).
+ * @param  p_start_y    the up position of the rectangle to decode (in image coordinates).
+ * @param  p_end_x      the right position of the rectangle to decode (in image coordinates).
+ * @param  p_end_y      the bottom position of the rectangle to decode (in image coordinates).
+ * @param  p_manager    the user event manager
+ *
+ * @return  true      if the area could be set.
+ */
+OPJ_BOOL opj_jp2_set_decode_area(  opj_jp2_t *p_jp2,
+                    opj_image_t* p_image,
+                    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+                    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
+                    opj_event_mgr_t * p_manager );
+
+ /**
+ * 
+ */
+OPJ_BOOL opj_jp2_get_tile(  opj_jp2_t *p_jp2,
+                            opj_stream_private_t *p_stream,
+                            opj_image_t* p_image,
+                            opj_event_mgr_t * p_manager,
+                            OPJ_UINT32 tile_index );
+
+
+/**
+ * 
+ */
+OPJ_BOOL opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2, 
+                                               OPJ_UINT32 res_factor, 
+                                               opj_event_mgr_t * p_manager);
+
+
+/* TODO MSD: clean these 3 functions */
+/**
+ * Dump some elements from the JP2 decompression structure .
+ *
+ *@param p_jp2        the jp2 codec.
+ *@param flag        flag to describe what elments are dump.
+ *@param out_stream      output stream where dump the elements.
+ *
+*/
+void jp2_dump (opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream);
+
+/**
+ * Get the codestream info from a JPEG2000 codec.
+ *
+ *@param  p_jp2        jp2 codec.
+ *
+ *@return  the codestream information extract from the jpg2000 codec
+ */
+opj_codestream_info_v2_t* jp2_get_cstr_info(opj_jp2_t* p_jp2);
+
+/**
+ * Get the codestream index from a JPEG2000 codec.
+ *
+ *@param  p_jp2        jp2 codec.
+ *
+ *@return  the codestream index extract from the jpg2000 codec
+ */
+opj_codestream_index_t* jp2_get_cstr_index(opj_jp2_t* p_jp2);
+
+
+/*@}*/
+
+/*@}*/
+
+#endif /* __JP2_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c
new file mode 100644
index 0000000..0a64938
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c
@@ -0,0 +1,342 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef __SSE__
+#include <xmmintrin.h>
+#endif
+
+#include "opj_includes.h"
+
+/* <summary> */
+/* This table contains the norms of the basis function of the reversible MCT. */
+/* </summary> */
+static const OPJ_FLOAT64 opj_mct_norms[3] = { 1.732, .8292, .8292 };
+
+/* <summary> */
+/* This table contains the norms of the basis function of the irreversible MCT. */
+/* </summary> */
+static const OPJ_FLOAT64 opj_mct_norms_real[3] = { 1.732, 1.805, 1.573 };
+
+const OPJ_FLOAT64 * opj_mct_get_mct_norms ()
+{
+	return opj_mct_norms;
+}
+
+const OPJ_FLOAT64 * opj_mct_get_mct_norms_real ()
+{
+	return opj_mct_norms_real;
+}
+
+/* <summary> */
+/* Foward reversible MCT. */
+/* </summary> */
+void opj_mct_encode(
+		OPJ_INT32* restrict c0,
+		OPJ_INT32* restrict c1,
+		OPJ_INT32* restrict c2,
+		OPJ_UINT32 n)
+{
+	OPJ_UINT32 i;
+	for(i = 0; i < n; ++i) {
+		OPJ_INT32 r = c0[i];
+		OPJ_INT32 g = c1[i];
+		OPJ_INT32 b = c2[i];
+		OPJ_INT32 y = (r + (g * 2) + b) >> 2;
+		OPJ_INT32 u = b - g;
+		OPJ_INT32 v = r - g;
+		c0[i] = y;
+		c1[i] = u;
+		c2[i] = v;
+	}
+}
+
+/* <summary> */
+/* Inverse reversible MCT. */
+/* </summary> */
+void opj_mct_decode(
+		OPJ_INT32* restrict c0,
+		OPJ_INT32* restrict c1, 
+		OPJ_INT32* restrict c2, 
+		OPJ_UINT32 n)
+{
+	OPJ_UINT32 i;
+	for (i = 0; i < n; ++i) {
+		OPJ_INT32 y = c0[i];
+		OPJ_INT32 u = c1[i];
+		OPJ_INT32 v = c2[i];
+		OPJ_INT32 g = y - ((u + v) >> 2);
+		OPJ_INT32 r = v + g;
+		OPJ_INT32 b = u + g;
+		c0[i] = r;
+		c1[i] = g;
+		c2[i] = b;
+	}
+}
+
+/* <summary> */
+/* Get norm of basis function of reversible MCT. */
+/* </summary> */
+OPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno) {
+	return opj_mct_norms[compno];
+}
+
+/* <summary> */
+/* Foward irreversible MCT. */
+/* </summary> */
+void opj_mct_encode_real(
+		OPJ_INT32* restrict c0,
+		OPJ_INT32* restrict c1,
+		OPJ_INT32* restrict c2,
+		OPJ_UINT32 n)
+{
+	OPJ_UINT32 i;
+	for(i = 0; i < n; ++i) {
+		OPJ_INT32 r = c0[i];
+		OPJ_INT32 g = c1[i];
+		OPJ_INT32 b = c2[i];
+		OPJ_INT32 y =  opj_int_fix_mul(r, 2449) + opj_int_fix_mul(g, 4809) + opj_int_fix_mul(b, 934);
+		OPJ_INT32 u = -opj_int_fix_mul(r, 1382) - opj_int_fix_mul(g, 2714) + opj_int_fix_mul(b, 4096);
+		OPJ_INT32 v =  opj_int_fix_mul(r, 4096) - opj_int_fix_mul(g, 3430) - opj_int_fix_mul(b, 666);
+		c0[i] = y;
+		c1[i] = u;
+		c2[i] = v;
+	}
+}
+
+/* <summary> */
+/* Inverse irreversible MCT. */
+/* </summary> */
+void opj_mct_decode_real(
+		OPJ_FLOAT32* restrict c0,
+		OPJ_FLOAT32* restrict c1,
+		OPJ_FLOAT32* restrict c2,
+		OPJ_UINT32 n)
+{
+	OPJ_UINT32 i;
+#ifdef __SSE__
+	// Mantis BUGID: 0056291. The address must be 16-byte aligned.
+	// TestFile: fuzz-signal_sigsegv_6e9e7f_5076_5265.pdf
+	if ((OPJ_UINT32)c0 % 16 == 0 && (OPJ_UINT32)c1 % 16 == 0 && (OPJ_UINT32)c2 % 16 == 0){
+		__m128 vrv, vgu, vgv, vbu;
+		vrv = _mm_set1_ps(1.402f);
+		vgu = _mm_set1_ps(0.34413f);
+		vgv = _mm_set1_ps(0.71414f);
+		vbu = _mm_set1_ps(1.772f);
+		for (i = 0; i < (n >> 3); ++i) {
+			__m128 vy, vu, vv;
+			__m128 vr, vg, vb;
+
+			vy = _mm_load_ps(c0);
+			vu = _mm_load_ps(c1);
+			vv = _mm_load_ps(c2);
+			vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
+			vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
+			vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
+			_mm_store_ps(c0, vr);
+			_mm_store_ps(c1, vg);
+			_mm_store_ps(c2, vb);
+			c0 += 4;
+			c1 += 4;
+			c2 += 4;
+
+			vy = _mm_load_ps(c0);
+			vu = _mm_load_ps(c1);
+			vv = _mm_load_ps(c2);
+			vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
+			vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
+			vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
+			_mm_store_ps(c0, vr);
+			_mm_store_ps(c1, vg);
+			_mm_store_ps(c2, vb);
+			c0 += 4;
+			c1 += 4;
+			c2 += 4;
+		}
+		n &= 7;
+	} else {
+		for(i = 0; i < n; ++i) {
+			OPJ_FLOAT32 y = c0[i];
+			OPJ_FLOAT32 u = c1[i];
+			OPJ_FLOAT32 v = c2[i];
+			OPJ_FLOAT32 r = y + (v * 1.402f);
+			OPJ_FLOAT32 g = y - (u * 0.34413f) - (v * (0.71414f));
+			OPJ_FLOAT32 b = y + (u * 1.772f);
+			c0[i] = r;
+			c1[i] = g;
+			c2[i] = b;
+		}
+	}
+	
+#endif
+	for(i = 0; i < n; ++i) {
+		OPJ_FLOAT32 y = c0[i];
+		OPJ_FLOAT32 u = c1[i];
+		OPJ_FLOAT32 v = c2[i];
+		OPJ_FLOAT32 r = y + (v * 1.402f);
+		OPJ_FLOAT32 g = y - (u * 0.34413f) - (v * (0.71414f));
+		OPJ_FLOAT32 b = y + (u * 1.772f);
+		c0[i] = r;
+		c1[i] = g;
+		c2[i] = b;
+	}
+}
+
+/* <summary> */
+/* Get norm of basis function of irreversible MCT. */
+/* </summary> */
+OPJ_FLOAT64 opj_mct_getnorm_real(OPJ_UINT32 compno) {
+	return opj_mct_norms_real[compno];
+}
+
+
+OPJ_BOOL opj_mct_encode_custom(
+					   OPJ_BYTE * pCodingdata,
+					   OPJ_UINT32 n,
+					   OPJ_BYTE ** pData,
+					   OPJ_UINT32 pNbComp,
+					   OPJ_UINT32 isSigned)
+{
+	OPJ_FLOAT32 * lMct = (OPJ_FLOAT32 *) pCodingdata;
+	OPJ_UINT32 i;
+	OPJ_UINT32 j;
+	OPJ_UINT32 k;
+	OPJ_UINT32 lNbMatCoeff = pNbComp * pNbComp;
+	OPJ_INT32 * lCurrentData = 00;
+	OPJ_INT32 * lCurrentMatrix = 00;
+	OPJ_INT32 ** lData = (OPJ_INT32 **) pData;
+	OPJ_UINT32 lMultiplicator = 1 << 13;
+	OPJ_INT32 * lMctPtr;
+
+    OPJ_ARG_NOT_USED(isSigned);
+
+	lCurrentData = (OPJ_INT32 *) opj_malloc((pNbComp + lNbMatCoeff) * sizeof(OPJ_INT32));
+	if (! lCurrentData) {
+		return OPJ_FALSE;
+	}
+
+	lCurrentMatrix = lCurrentData + pNbComp;
+
+	for (i =0;i<lNbMatCoeff;++i) {
+		lCurrentMatrix[i] = (OPJ_INT32) (*(lMct++) * (OPJ_FLOAT32)lMultiplicator);
+	}
+
+	for (i = 0; i < n; ++i)  {
+		lMctPtr = lCurrentMatrix;
+		for (j=0;j<pNbComp;++j) {
+			lCurrentData[j] = (*(lData[j]));
+		}
+
+		for (j=0;j<pNbComp;++j) {
+			*(lData[j]) = 0;
+			for (k=0;k<pNbComp;++k) {
+				*(lData[j]) += opj_int_fix_mul(*lMctPtr, lCurrentData[k]);
+				++lMctPtr;
+			}
+
+			++lData[j];
+		}
+	}
+
+	opj_free(lCurrentData);
+
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_mct_decode_custom(
+					   OPJ_BYTE * pDecodingData,
+					   OPJ_UINT32 n,
+					   OPJ_BYTE ** pData,
+					   OPJ_UINT32 pNbComp,
+					   OPJ_UINT32 isSigned)
+{
+	OPJ_FLOAT32 * lMct;
+	OPJ_UINT32 i;
+	OPJ_UINT32 j;
+	OPJ_UINT32 k;
+
+	OPJ_FLOAT32 * lCurrentData = 00;
+	OPJ_FLOAT32 * lCurrentResult = 00;
+	OPJ_FLOAT32 ** lData = (OPJ_FLOAT32 **) pData;
+
+    OPJ_ARG_NOT_USED(isSigned);
+
+	lCurrentData = (OPJ_FLOAT32 *) opj_malloc (2 * pNbComp * sizeof(OPJ_FLOAT32));
+	if (! lCurrentData) {
+		return OPJ_FALSE;
+	}
+	lCurrentResult = lCurrentData + pNbComp;
+
+	for (i = 0; i < n; ++i) {
+		lMct = (OPJ_FLOAT32 *) pDecodingData;
+		for (j=0;j<pNbComp;++j) {
+			lCurrentData[j] = (OPJ_FLOAT32) (*(lData[j]));
+		}
+		for (j=0;j<pNbComp;++j) {
+			lCurrentResult[j] = 0;
+			for	(k=0;k<pNbComp;++k)	{
+				lCurrentResult[j] += *(lMct++) * lCurrentData[k];
+			}
+			*(lData[j]++) = (OPJ_FLOAT32) (lCurrentResult[j]);
+		}
+	}
+	opj_free(lCurrentData);
+	return OPJ_TRUE;
+}
+
+void opj_calculate_norms(	OPJ_FLOAT64 * pNorms,
+							OPJ_UINT32 pNbComps,
+							OPJ_FLOAT32 * pMatrix)
+{
+	OPJ_UINT32 i,j,lIndex;
+	OPJ_FLOAT32 lCurrentValue;
+	OPJ_FLOAT64 * lNorms = (OPJ_FLOAT64 *) pNorms;
+	OPJ_FLOAT32 * lMatrix = (OPJ_FLOAT32 *) pMatrix;
+
+	for	(i=0;i<pNbComps;++i) {
+		lNorms[i] = 0;
+		lIndex = i;
+
+		for	(j=0;j<pNbComps;++j) {
+			lCurrentValue = lMatrix[lIndex];
+			lIndex += pNbComps;
+			lNorms[i] += lCurrentValue * lCurrentValue;
+		}
+		lNorms[i] = sqrt(lNorms[i]);
+	}
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.h
new file mode 100644
index 0000000..1c1f4d0
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.h
@@ -0,0 +1,155 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MCT_H
+#define __MCT_H
+/**
+@file mct.h
+@brief Implementation of a multi-component transforms (MCT)
+
+The functions in MCT.C have for goal to realize reversible and irreversible multicomponent
+transform. The functions in MCT.C are used by some function in TCD.C.
+*/
+
+/** @defgroup MCT MCT - Implementation of a multi-component transform */
+/*@{*/
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Apply a reversible multi-component transform to an image
+@param c0 Samples for red component
+@param c1 Samples for green component
+@param c2 Samples blue component
+@param n Number of samples for each component
+*/
+void opj_mct_encode(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);
+/**
+Apply a reversible multi-component inverse transform to an image
+@param c0 Samples for luminance component
+@param c1 Samples for red chrominance component
+@param c2 Samples for blue chrominance component
+@param n Number of samples for each component
+*/
+void opj_mct_decode(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);
+/**
+Get norm of the basis function used for the reversible multi-component transform
+@param compno Number of the component (0->Y, 1->U, 2->V)
+@return 
+*/
+OPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno);
+
+/**
+Apply an irreversible multi-component transform to an image
+@param c0 Samples for red component
+@param c1 Samples for green component
+@param c2 Samples blue component
+@param n Number of samples for each component
+*/
+void opj_mct_encode_real(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);
+/**
+Apply an irreversible multi-component inverse transform to an image
+@param c0 Samples for luminance component
+@param c1 Samples for red chrominance component
+@param c2 Samples for blue chrominance component
+@param n Number of samples for each component
+*/
+void opj_mct_decode_real(OPJ_FLOAT32* c0, OPJ_FLOAT32* c1, OPJ_FLOAT32* c2, OPJ_UINT32 n);
+/**
+Get norm of the basis function used for the irreversible multi-component transform
+@param compno Number of the component (0->Y, 1->U, 2->V)
+@return 
+*/
+OPJ_FLOAT64 opj_mct_getnorm_real(OPJ_UINT32 compno);
+
+/**
+FIXME DOC
+@param p_coding_data    MCT data
+@param n                size of components
+@param p_data           components
+@param p_nb_comp        nb of components (i.e. size of p_data)
+@param is_signed        tells if the data is signed
+@return OPJ_FALSE if function encounter a problem, OPJ_TRUE otherwise
+*/
+OPJ_BOOL opj_mct_encode_custom(
+					   OPJ_BYTE * p_coding_data,
+					   OPJ_UINT32 n,
+					   OPJ_BYTE ** p_data,
+					   OPJ_UINT32 p_nb_comp,
+					   OPJ_UINT32 is_signed);
+/**
+FIXME DOC
+@param pDecodingData    MCT data
+@param n                size of components
+@param pData            components
+@param pNbComp          nb of components (i.e. size of p_data)
+@param isSigned         tells if the data is signed
+@return OPJ_FALSE if function encounter a problem, OPJ_TRUE otherwise
+*/
+OPJ_BOOL opj_mct_decode_custom(
+					   OPJ_BYTE * pDecodingData,
+					   OPJ_UINT32 n,
+					   OPJ_BYTE ** pData,
+					   OPJ_UINT32 pNbComp,
+					   OPJ_UINT32 isSigned);
+/**
+FIXME DOC
+@param pNorms           MCT data
+@param p_nb_comps       size of components
+@param pMatrix          components
+@return 
+*/
+void opj_calculate_norms(   OPJ_FLOAT64 * pNorms,
+                            OPJ_UINT32 p_nb_comps,
+                            OPJ_FLOAT32 * pMatrix);
+/**
+FIXME DOC 
+*/
+const OPJ_FLOAT64 * opj_mct_get_mct_norms (void);
+/**
+FIXME DOC 
+*/
+const OPJ_FLOAT64 * opj_mct_get_mct_norms_real (void);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __MCT_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.c
new file mode 100644
index 0000000..18fcc47
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.c
@@ -0,0 +1,610 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/** @defgroup MQC MQC - Implementation of an MQ-Coder */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Output a byte, doing bit-stuffing if necessary.
+After a 0xff byte, the next byte must be smaller than 0x90.
+@param mqc MQC handle
+*/
+static void opj_mqc_byteout(opj_mqc_t *mqc);
+/**
+Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000
+@param mqc MQC handle
+*/
+static void opj_mqc_renorme(opj_mqc_t *mqc);
+/**
+Encode the most probable symbol
+@param mqc MQC handle
+*/
+static void opj_mqc_codemps(opj_mqc_t *mqc);
+/**
+Encode the most least symbol
+@param mqc MQC handle
+*/
+static void opj_mqc_codelps(opj_mqc_t *mqc);
+/**
+Fill mqc->c with 1's for flushing
+@param mqc MQC handle
+*/
+static void opj_mqc_setbits(opj_mqc_t *mqc);
+/**
+FIXME DOC
+@param mqc MQC handle
+@return 
+*/
+static INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc);
+/**
+FIXME DOC
+@param mqc MQC handle
+@return 
+*/
+static INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc);
+/**
+Input a byte
+@param mqc MQC handle
+*/
+static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc);
+/**
+Renormalize mqc->a and mqc->c while decoding
+@param mqc MQC handle
+*/
+static INLINE void opj_mqc_renormd(opj_mqc_t *const mqc);
+/*@}*/
+
+/*@}*/
+
+/* <summary> */
+/* This array defines all the possible states for a context. */
+/* </summary> */
+static opj_mqc_state_t mqc_states[47 * 2] = {
+	{0x5601, 0, &mqc_states[2], &mqc_states[3]},
+	{0x5601, 1, &mqc_states[3], &mqc_states[2]},
+	{0x3401, 0, &mqc_states[4], &mqc_states[12]},
+	{0x3401, 1, &mqc_states[5], &mqc_states[13]},
+	{0x1801, 0, &mqc_states[6], &mqc_states[18]},
+	{0x1801, 1, &mqc_states[7], &mqc_states[19]},
+	{0x0ac1, 0, &mqc_states[8], &mqc_states[24]},
+	{0x0ac1, 1, &mqc_states[9], &mqc_states[25]},
+	{0x0521, 0, &mqc_states[10], &mqc_states[58]},
+	{0x0521, 1, &mqc_states[11], &mqc_states[59]},
+	{0x0221, 0, &mqc_states[76], &mqc_states[66]},
+	{0x0221, 1, &mqc_states[77], &mqc_states[67]},
+	{0x5601, 0, &mqc_states[14], &mqc_states[13]},
+	{0x5601, 1, &mqc_states[15], &mqc_states[12]},
+	{0x5401, 0, &mqc_states[16], &mqc_states[28]},
+	{0x5401, 1, &mqc_states[17], &mqc_states[29]},
+	{0x4801, 0, &mqc_states[18], &mqc_states[28]},
+	{0x4801, 1, &mqc_states[19], &mqc_states[29]},
+	{0x3801, 0, &mqc_states[20], &mqc_states[28]},
+	{0x3801, 1, &mqc_states[21], &mqc_states[29]},
+	{0x3001, 0, &mqc_states[22], &mqc_states[34]},
+	{0x3001, 1, &mqc_states[23], &mqc_states[35]},
+	{0x2401, 0, &mqc_states[24], &mqc_states[36]},
+	{0x2401, 1, &mqc_states[25], &mqc_states[37]},
+	{0x1c01, 0, &mqc_states[26], &mqc_states[40]},
+	{0x1c01, 1, &mqc_states[27], &mqc_states[41]},
+	{0x1601, 0, &mqc_states[58], &mqc_states[42]},
+	{0x1601, 1, &mqc_states[59], &mqc_states[43]},
+	{0x5601, 0, &mqc_states[30], &mqc_states[29]},
+	{0x5601, 1, &mqc_states[31], &mqc_states[28]},
+	{0x5401, 0, &mqc_states[32], &mqc_states[28]},
+	{0x5401, 1, &mqc_states[33], &mqc_states[29]},
+	{0x5101, 0, &mqc_states[34], &mqc_states[30]},
+	{0x5101, 1, &mqc_states[35], &mqc_states[31]},
+	{0x4801, 0, &mqc_states[36], &mqc_states[32]},
+	{0x4801, 1, &mqc_states[37], &mqc_states[33]},
+	{0x3801, 0, &mqc_states[38], &mqc_states[34]},
+	{0x3801, 1, &mqc_states[39], &mqc_states[35]},
+	{0x3401, 0, &mqc_states[40], &mqc_states[36]},
+	{0x3401, 1, &mqc_states[41], &mqc_states[37]},
+	{0x3001, 0, &mqc_states[42], &mqc_states[38]},
+	{0x3001, 1, &mqc_states[43], &mqc_states[39]},
+	{0x2801, 0, &mqc_states[44], &mqc_states[38]},
+	{0x2801, 1, &mqc_states[45], &mqc_states[39]},
+	{0x2401, 0, &mqc_states[46], &mqc_states[40]},
+	{0x2401, 1, &mqc_states[47], &mqc_states[41]},
+	{0x2201, 0, &mqc_states[48], &mqc_states[42]},
+	{0x2201, 1, &mqc_states[49], &mqc_states[43]},
+	{0x1c01, 0, &mqc_states[50], &mqc_states[44]},
+	{0x1c01, 1, &mqc_states[51], &mqc_states[45]},
+	{0x1801, 0, &mqc_states[52], &mqc_states[46]},
+	{0x1801, 1, &mqc_states[53], &mqc_states[47]},
+	{0x1601, 0, &mqc_states[54], &mqc_states[48]},
+	{0x1601, 1, &mqc_states[55], &mqc_states[49]},
+	{0x1401, 0, &mqc_states[56], &mqc_states[50]},
+	{0x1401, 1, &mqc_states[57], &mqc_states[51]},
+	{0x1201, 0, &mqc_states[58], &mqc_states[52]},
+	{0x1201, 1, &mqc_states[59], &mqc_states[53]},
+	{0x1101, 0, &mqc_states[60], &mqc_states[54]},
+	{0x1101, 1, &mqc_states[61], &mqc_states[55]},
+	{0x0ac1, 0, &mqc_states[62], &mqc_states[56]},
+	{0x0ac1, 1, &mqc_states[63], &mqc_states[57]},
+	{0x09c1, 0, &mqc_states[64], &mqc_states[58]},
+	{0x09c1, 1, &mqc_states[65], &mqc_states[59]},
+	{0x08a1, 0, &mqc_states[66], &mqc_states[60]},
+	{0x08a1, 1, &mqc_states[67], &mqc_states[61]},
+	{0x0521, 0, &mqc_states[68], &mqc_states[62]},
+	{0x0521, 1, &mqc_states[69], &mqc_states[63]},
+	{0x0441, 0, &mqc_states[70], &mqc_states[64]},
+	{0x0441, 1, &mqc_states[71], &mqc_states[65]},
+	{0x02a1, 0, &mqc_states[72], &mqc_states[66]},
+	{0x02a1, 1, &mqc_states[73], &mqc_states[67]},
+	{0x0221, 0, &mqc_states[74], &mqc_states[68]},
+	{0x0221, 1, &mqc_states[75], &mqc_states[69]},
+	{0x0141, 0, &mqc_states[76], &mqc_states[70]},
+	{0x0141, 1, &mqc_states[77], &mqc_states[71]},
+	{0x0111, 0, &mqc_states[78], &mqc_states[72]},
+	{0x0111, 1, &mqc_states[79], &mqc_states[73]},
+	{0x0085, 0, &mqc_states[80], &mqc_states[74]},
+	{0x0085, 1, &mqc_states[81], &mqc_states[75]},
+	{0x0049, 0, &mqc_states[82], &mqc_states[76]},
+	{0x0049, 1, &mqc_states[83], &mqc_states[77]},
+	{0x0025, 0, &mqc_states[84], &mqc_states[78]},
+	{0x0025, 1, &mqc_states[85], &mqc_states[79]},
+	{0x0015, 0, &mqc_states[86], &mqc_states[80]},
+	{0x0015, 1, &mqc_states[87], &mqc_states[81]},
+	{0x0009, 0, &mqc_states[88], &mqc_states[82]},
+	{0x0009, 1, &mqc_states[89], &mqc_states[83]},
+	{0x0005, 0, &mqc_states[90], &mqc_states[84]},
+	{0x0005, 1, &mqc_states[91], &mqc_states[85]},
+	{0x0001, 0, &mqc_states[90], &mqc_states[86]},
+	{0x0001, 1, &mqc_states[91], &mqc_states[87]},
+	{0x5601, 0, &mqc_states[92], &mqc_states[92]},
+	{0x5601, 1, &mqc_states[93], &mqc_states[93]},
+};
+
+/* 
+==========================================================
+   local functions
+==========================================================
+*/
+
+void opj_mqc_byteout(opj_mqc_t *mqc) {
+	if (*mqc->bp == 0xff) {
+		mqc->bp++;
+		*mqc->bp = (OPJ_BYTE)(mqc->c >> 20);
+		mqc->c &= 0xfffff;
+		mqc->ct = 7;
+	} else {
+		if ((mqc->c & 0x8000000) == 0) {	/* ((mqc->c&0x8000000)==0) CHANGE */
+			mqc->bp++;
+			*mqc->bp = (OPJ_BYTE)(mqc->c >> 19);
+			mqc->c &= 0x7ffff;
+			mqc->ct = 8;
+		} else {
+			(*mqc->bp)++;
+			if (*mqc->bp == 0xff) {
+				mqc->c &= 0x7ffffff;
+				mqc->bp++;
+				*mqc->bp = (OPJ_BYTE)(mqc->c >> 20);
+				mqc->c &= 0xfffff;
+				mqc->ct = 7;
+			} else {
+				mqc->bp++;
+				*mqc->bp = (OPJ_BYTE)(mqc->c >> 19);
+				mqc->c &= 0x7ffff;
+				mqc->ct = 8;
+			}
+		}
+	}
+}
+
+void opj_mqc_renorme(opj_mqc_t *mqc) {
+	do {
+		mqc->a <<= 1;
+		mqc->c <<= 1;
+		mqc->ct--;
+		if (mqc->ct == 0) {
+			opj_mqc_byteout(mqc);
+		}
+	} while ((mqc->a & 0x8000) == 0);
+}
+
+void opj_mqc_codemps(opj_mqc_t *mqc) {
+	mqc->a -= (*mqc->curctx)->qeval;
+	if ((mqc->a & 0x8000) == 0) {
+		if (mqc->a < (*mqc->curctx)->qeval) {
+			mqc->a = (*mqc->curctx)->qeval;
+		} else {
+			mqc->c += (*mqc->curctx)->qeval;
+		}
+		*mqc->curctx = (*mqc->curctx)->nmps;
+		opj_mqc_renorme(mqc);
+	} else {
+		mqc->c += (*mqc->curctx)->qeval;
+	}
+}
+
+void opj_mqc_codelps(opj_mqc_t *mqc) {
+	mqc->a -= (*mqc->curctx)->qeval;
+	if (mqc->a < (*mqc->curctx)->qeval) {
+		mqc->c += (*mqc->curctx)->qeval;
+	} else {
+		mqc->a = (*mqc->curctx)->qeval;
+	}
+	*mqc->curctx = (*mqc->curctx)->nlps;
+	opj_mqc_renorme(mqc);
+}
+
+void opj_mqc_setbits(opj_mqc_t *mqc) {
+	OPJ_UINT32 tempc = mqc->c + mqc->a;
+	mqc->c |= 0xffff;
+	if (mqc->c >= tempc) {
+		mqc->c -= 0x8000;
+	}
+}
+
+static INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc) {
+	OPJ_INT32 d;
+	if (mqc->a < (*mqc->curctx)->qeval) {
+		d = (OPJ_INT32)(1 - (*mqc->curctx)->mps);
+		*mqc->curctx = (*mqc->curctx)->nlps;
+	} else {
+		d = (OPJ_INT32)(*mqc->curctx)->mps;
+		*mqc->curctx = (*mqc->curctx)->nmps;
+	}
+	
+	return d;
+}
+
+static INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc) {
+	OPJ_INT32 d;
+	if (mqc->a < (*mqc->curctx)->qeval) {
+		mqc->a = (*mqc->curctx)->qeval;
+		d = (OPJ_INT32)(*mqc->curctx)->mps;
+		*mqc->curctx = (*mqc->curctx)->nmps;
+	} else {
+		mqc->a = (*mqc->curctx)->qeval;
+		d = (OPJ_INT32)(1 - (*mqc->curctx)->mps);
+		*mqc->curctx = (*mqc->curctx)->nlps;
+	}
+	
+	return d;
+}
+
+#ifdef MQC_PERF_OPT
+static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc) {
+	unsigned int i = *((unsigned int *) mqc->bp);
+	mqc->c += i & 0xffff00;
+	mqc->ct = i & 0x0f;
+	mqc->bp += (i >> 2) & 0x04;
+}
+#else
+static void opj_mqc_bytein(opj_mqc_t *const mqc) {
+	if (mqc->bp != mqc->end) {
+		OPJ_UINT32 c;
+		if (mqc->bp + 1 != mqc->end) {
+			c = *(mqc->bp + 1);
+		} else {
+			c = 0xff;
+		}
+		if (*mqc->bp == 0xff) {
+			if (c > 0x8f) {
+				mqc->c += 0xff00;
+				mqc->ct = 8;
+			} else {
+				mqc->bp++;
+				mqc->c += c << 9;
+				mqc->ct = 7;
+			}
+		} else {
+			mqc->bp++;
+			mqc->c += c << 8;
+			mqc->ct = 8;
+		}
+	} else {
+		mqc->c += 0xff00;
+		mqc->ct = 8;
+	}
+}
+#endif
+
+static INLINE void opj_mqc_renormd(opj_mqc_t *const mqc) {
+	do {
+		if (mqc->ct == 0) {
+			opj_mqc_bytein(mqc);
+		}
+		mqc->a <<= 1;
+		mqc->c <<= 1;
+		mqc->ct--;
+	} while (mqc->a < 0x8000);
+}
+
+/* 
+==========================================================
+   MQ-Coder interface
+==========================================================
+*/
+
+opj_mqc_t* opj_mqc_create(void) {
+	opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
+#ifdef MQC_PERF_OPT
+	mqc->buffer = NULL;
+#endif
+	return mqc;
+}
+
+void opj_mqc_destroy(opj_mqc_t *mqc) {
+	if(mqc) {
+#ifdef MQC_PERF_OPT
+		opj_free(mqc->buffer);
+#endif
+		opj_free(mqc);
+	}
+}
+
+OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc) {
+	const ptrdiff_t diff = mqc->bp - mqc->start;
+#if 0
+  assert( diff <= 0xffffffff && diff >= 0 ); /* UINT32_MAX */
+#endif
+	return (OPJ_UINT32)diff;
+}
+
+void opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp) {
+    /* TODO MSD: need to take a look to the v2 version */
+	opj_mqc_setcurctx(mqc, 0);
+	mqc->a = 0x8000;
+	mqc->c = 0;
+	mqc->bp = bp - 1;
+	mqc->ct = 12;
+	if (*mqc->bp == 0xff) {
+		mqc->ct = 13;
+	}
+	mqc->start = bp;
+}
+
+void opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d) {
+	if ((*mqc->curctx)->mps == d) {
+		opj_mqc_codemps(mqc);
+	} else {
+		opj_mqc_codelps(mqc);
+	}
+}
+
+void opj_mqc_flush(opj_mqc_t *mqc) {
+	opj_mqc_setbits(mqc);
+	mqc->c <<= mqc->ct;
+	opj_mqc_byteout(mqc);
+	mqc->c <<= mqc->ct;
+	opj_mqc_byteout(mqc);
+	
+	if (*mqc->bp != 0xff) {
+		mqc->bp++;
+	}
+}
+
+void opj_mqc_bypass_init_enc(opj_mqc_t *mqc) {
+	mqc->c = 0;
+	mqc->ct = 8;
+	/*if (*mqc->bp == 0xff) {
+	mqc->ct = 7;
+     } */
+}
+
+void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d) {
+	mqc->ct--;
+	mqc->c = mqc->c + (d << mqc->ct);
+	if (mqc->ct == 0) {
+		mqc->bp++;
+		*mqc->bp = (OPJ_BYTE)mqc->c;
+		mqc->ct = 8;
+		if (*mqc->bp == 0xff) {
+			mqc->ct = 7;
+		}
+		mqc->c = 0;
+	}
+}
+
+OPJ_UINT32 opj_mqc_bypass_flush_enc(opj_mqc_t *mqc) {
+	OPJ_BYTE bit_padding;
+	
+	bit_padding = 0;
+	
+	if (mqc->ct != 0) {
+		while (mqc->ct > 0) {
+			mqc->ct--;
+			mqc->c += (OPJ_UINT32)(bit_padding << mqc->ct);
+			bit_padding = (bit_padding + 1) & 0x01;
+		}
+		mqc->bp++;
+		*mqc->bp = (OPJ_BYTE)mqc->c;
+		mqc->ct = 8;
+		mqc->c = 0;
+	}
+	
+	return 1;
+}
+
+void opj_mqc_reset_enc(opj_mqc_t *mqc) {
+	opj_mqc_resetstates(mqc);
+	opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+	opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+	opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+}
+
+OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc) {
+	OPJ_UINT32 correction = 1;
+	
+	/* <flush part> */
+	OPJ_INT32 n = (OPJ_INT32)(27 - 15 - mqc->ct);
+	mqc->c <<= mqc->ct;
+	while (n > 0) {
+		opj_mqc_byteout(mqc);
+		n -= (OPJ_INT32)mqc->ct;
+		mqc->c <<= mqc->ct;
+	}
+	opj_mqc_byteout(mqc);
+	
+	return correction;
+}
+
+void opj_mqc_restart_init_enc(opj_mqc_t *mqc) {
+	/* <Re-init part> */
+	opj_mqc_setcurctx(mqc, 0);
+	mqc->a = 0x8000;
+	mqc->c = 0;
+	mqc->ct = 12;
+	mqc->bp--;
+	if (*mqc->bp == 0xff) {
+		mqc->ct = 13;
+	}
+}
+
+void opj_mqc_erterm_enc(opj_mqc_t *mqc) {
+	OPJ_INT32 k = (OPJ_INT32)(11 - mqc->ct + 1);
+	
+	while (k > 0) {
+		mqc->c <<= mqc->ct;
+		mqc->ct = 0;
+		opj_mqc_byteout(mqc);
+		k -= (OPJ_INT32)mqc->ct;
+	}
+	
+	if (*mqc->bp != 0xff) {
+		opj_mqc_byteout(mqc);
+	}
+}
+
+void opj_mqc_segmark_enc(opj_mqc_t *mqc) {
+	OPJ_UINT32 i;
+	opj_mqc_setcurctx(mqc, 18);
+	
+	for (i = 1; i < 5; i++) {
+		opj_mqc_encode(mqc, i % 2);
+	}
+}
+
+OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len) {
+	opj_mqc_setcurctx(mqc, 0);
+	mqc->start = bp;
+	mqc->end = bp + len;
+	mqc->bp = bp;
+	if (len==0) mqc->c = 0xff << 16;
+	else mqc->c = (OPJ_UINT32)(*mqc->bp << 16);
+
+#ifdef MQC_PERF_OPT /* TODO_MSD: check this option and put in experimental */
+	{
+        OPJ_UINT32 c;
+		OPJ_UINT32 *ip;
+		OPJ_BYTE *end = mqc->end - 1;
+        void* new_buffer = opj_realloc(mqc->buffer, (len + 1) * sizeof(OPJ_UINT32));
+        if (! new_buffer) {
+            opj_free(mqc->buffer);
+            mqc->buffer = NULL;
+            return OPJ_FALSE;
+        }
+        mqc->buffer = new_buffer;
+		
+        ip = (OPJ_UINT32 *) mqc->buffer;
+
+		while (bp < end) {
+			c = *(bp + 1);
+			if (*bp == 0xff) {
+				if (c > 0x8f) {
+					break;
+				} else {
+					*ip = 0x00000017 | (c << 9);
+				}
+			} else {
+				*ip = 0x00000018 | (c << 8);
+			}
+			bp++;
+			ip++;
+		}
+
+		/* Handle last byte of data */
+		c = 0xff;
+		if (*bp == 0xff) {
+			*ip = 0x0000ff18;
+		} else {
+			bp++;
+			*ip = 0x00000018 | (c << 8);
+		}
+		ip++;
+
+		*ip = 0x0000ff08;
+		mqc->bp = mqc->buffer;
+	}
+#endif
+	opj_mqc_bytein(mqc);
+	mqc->c <<= 7;
+	mqc->ct -= 7;
+	mqc->a = 0x8000;
+        return OPJ_TRUE;
+}
+
+OPJ_INT32 opj_mqc_decode(opj_mqc_t *const mqc) {
+	OPJ_INT32 d;
+	mqc->a -= (*mqc->curctx)->qeval;
+	if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
+		d = opj_mqc_lpsexchange(mqc);
+		opj_mqc_renormd(mqc);
+	} else {
+		mqc->c -= (*mqc->curctx)->qeval << 16;
+		if ((mqc->a & 0x8000) == 0) {
+			d = opj_mqc_mpsexchange(mqc);
+			opj_mqc_renormd(mqc);
+		} else {
+			d = (OPJ_INT32)(*mqc->curctx)->mps;
+		}
+	}
+
+	return d;
+}
+
+void opj_mqc_resetstates(opj_mqc_t *mqc) {
+	OPJ_UINT32 i;
+	for (i = 0; i < MQC_NUMCTXS; i++) {
+		mqc->ctxs[i] = mqc_states;
+	}
+}
+
+void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob) {
+	mqc->ctxs[ctxno] = &mqc_states[msb + (OPJ_UINT32)(prob << 1)];
+}
+
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.h
new file mode 100644
index 0000000..69a2d46
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.h
@@ -0,0 +1,207 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MQC_H
+#define __MQC_H
+/**
+@file mqc.h
+@brief Implementation of an MQ-Coder (MQC)
+
+The functions in MQC.C have for goal to realize the MQ-coder operations. The functions
+in MQC.C are used by some function in T1.C.
+*/
+
+/** @defgroup MQC MQC - Implementation of an MQ-Coder */
+/*@{*/
+
+/**
+This struct defines the state of a context.
+*/
+typedef struct opj_mqc_state {
+	/** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
+	OPJ_UINT32 qeval;
+	/** the Most Probable Symbol (0 or 1) */
+	OPJ_UINT32 mps;
+	/** next state if the next encoded symbol is the MPS */
+	struct opj_mqc_state *nmps;
+	/** next state if the next encoded symbol is the LPS */
+	struct opj_mqc_state *nlps;
+} opj_mqc_state_t;
+
+#define MQC_NUMCTXS 19
+
+/**
+MQ coder
+*/
+typedef struct opj_mqc {
+	OPJ_UINT32 c;
+	OPJ_UINT32 a;
+	OPJ_UINT32 ct;
+	OPJ_BYTE *bp;
+	OPJ_BYTE *start;
+	OPJ_BYTE *end;
+	opj_mqc_state_t *ctxs[MQC_NUMCTXS];
+	opj_mqc_state_t **curctx;
+#ifdef MQC_PERF_OPT
+	unsigned char *buffer;
+#endif
+} opj_mqc_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a new MQC handle 
+@return Returns a new MQC handle if successful, returns NULL otherwise
+*/
+opj_mqc_t* opj_mqc_create(void);
+/**
+Destroy a previously created MQC handle
+@param mqc MQC handle to destroy
+*/
+void opj_mqc_destroy(opj_mqc_t *mqc);
+/**
+Return the number of bytes written/read since initialisation
+@param mqc MQC handle
+@return Returns the number of bytes already encoded
+*/
+OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc);
+/**
+Reset the states of all the context of the coder/decoder 
+(each context is set to a state where 0 and 1 are more or less equiprobable)
+@param mqc MQC handle
+*/
+void opj_mqc_resetstates(opj_mqc_t *mqc);
+/**
+Set the state of a particular context
+@param mqc MQC handle
+@param ctxno Number that identifies the context
+@param msb The MSB of the new state of the context
+@param prob Number that identifies the probability of the symbols for the new state of the context
+*/
+void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob);
+/**
+Initialize the encoder
+@param mqc MQC handle
+@param bp Pointer to the start of the buffer where the bytes will be written
+*/
+void opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp);
+/**
+Set the current context used for coding/decoding
+@param mqc MQC handle
+@param ctxno Number that identifies the context
+*/
+#define opj_mqc_setcurctx(mqc, ctxno)	(mqc)->curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)]
+/**
+Encode a symbol using the MQ-coder
+@param mqc MQC handle
+@param d The symbol to be encoded (0 or 1)
+*/
+void opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d);
+/**
+Flush the encoder, so that all remaining data is written
+@param mqc MQC handle
+*/
+void opj_mqc_flush(opj_mqc_t *mqc);
+/**
+BYPASS mode switch, initialization operation. 
+JPEG 2000 p 505. 
+<h2>Not fully implemented and tested !!</h2>
+@param mqc MQC handle
+*/
+void opj_mqc_bypass_init_enc(opj_mqc_t *mqc);
+/**
+BYPASS mode switch, coding operation. 
+JPEG 2000 p 505. 
+<h2>Not fully implemented and tested !!</h2>
+@param mqc MQC handle
+@param d The symbol to be encoded (0 or 1)
+*/
+void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d);
+/**
+BYPASS mode switch, flush operation
+<h2>Not fully implemented and tested !!</h2>
+@param mqc MQC handle
+@return Returns 1 (always)
+*/
+OPJ_UINT32 opj_mqc_bypass_flush_enc(opj_mqc_t *mqc);
+/**
+RESET mode switch
+@param mqc MQC handle
+*/
+void opj_mqc_reset_enc(opj_mqc_t *mqc);
+/**
+RESTART mode switch (TERMALL)
+@param mqc MQC handle
+@return Returns 1 (always)
+*/
+OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc);
+/**
+RESTART mode switch (TERMALL) reinitialisation
+@param mqc MQC handle
+*/
+void opj_mqc_restart_init_enc(opj_mqc_t *mqc);
+/**
+ERTERM mode switch (PTERM)
+@param mqc MQC handle
+*/
+void opj_mqc_erterm_enc(opj_mqc_t *mqc);
+/**
+SEGMARK mode switch (SEGSYM)
+@param mqc MQC handle
+*/
+void opj_mqc_segmark_enc(opj_mqc_t *mqc);
+/**
+Initialize the decoder
+@param mqc MQC handle
+@param bp Pointer to the start of the buffer from which the bytes will be read
+@param len Length of the input buffer
+*/
+OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len);
+/**
+Decode a symbol
+@param mqc MQC handle
+@return Returns the decoded symbol (0 or 1)
+*/
+OPJ_INT32 opj_mqc_decode(opj_mqc_t * const mqc);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __MQC_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.c
new file mode 100644
index 0000000..89bb75a
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.c
@@ -0,0 +1,960 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef _WIN32
+#include <windows.h>
+#endif /* _WIN32 */
+
+#include "opj_includes.h"
+
+
+/* ---------------------------------------------------------------------- */
+/* Functions to set the message handlers */
+
+OPJ_BOOL OPJ_CALLCONV opj_set_info_handler(	opj_codec_t * p_codec, 
+											opj_msg_callback p_callback,
+											void * p_user_data)
+{
+	opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+	if(! l_codec){
+		return OPJ_FALSE;
+	}
+	
+	l_codec->m_event_mgr.info_handler = p_callback;
+	l_codec->m_event_mgr.m_info_data = p_user_data;
+	
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_set_warning_handler(	opj_codec_t * p_codec, 
+												opj_msg_callback p_callback,
+												void * p_user_data)
+{
+	opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+	if (! l_codec) {
+		return OPJ_FALSE;
+	}
+	
+	l_codec->m_event_mgr.warning_handler = p_callback;
+	l_codec->m_event_mgr.m_warning_data = p_user_data;
+	
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec, 
+											opj_msg_callback p_callback,
+											void * p_user_data)
+{
+	opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+	if (! l_codec) {
+		return OPJ_FALSE;
+	}
+	
+	l_codec->m_event_mgr.error_handler = p_callback;
+	l_codec->m_event_mgr.m_error_data = p_user_data;
+	
+	return OPJ_TRUE;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static OPJ_SIZE_T opj_read_from_file (void * p_buffer, OPJ_SIZE_T p_nb_bytes, FILE * p_file)
+{
+	OPJ_SIZE_T l_nb_read = fread(p_buffer,1,p_nb_bytes,p_file);
+	return l_nb_read ? l_nb_read : (OPJ_SIZE_T)-1;
+}
+
+static OPJ_UINT64 opj_get_data_length_from_file (FILE * p_file)
+{
+	OPJ_OFF_T file_length = 0;
+
+	OPJ_FSEEK(p_file, 0, SEEK_END);
+	file_length = (OPJ_OFF_T)OPJ_FTELL(p_file);
+	OPJ_FSEEK(p_file, 0, SEEK_SET);
+
+	return (OPJ_UINT64)file_length;
+}
+
+static OPJ_SIZE_T opj_write_from_file (void * p_buffer, OPJ_SIZE_T p_nb_bytes, FILE * p_file)
+{
+	return fwrite(p_buffer,1,p_nb_bytes,p_file);
+}
+
+static OPJ_OFF_T opj_skip_from_file (OPJ_OFF_T p_nb_bytes, FILE * p_user_data)
+{
+	if (OPJ_FSEEK(p_user_data,p_nb_bytes,SEEK_CUR)) {
+		return -1;
+	}
+
+	return p_nb_bytes;
+}
+
+static OPJ_BOOL opj_seek_from_file (OPJ_OFF_T p_nb_bytes, FILE * p_user_data)
+{
+	if (OPJ_FSEEK(p_user_data,p_nb_bytes,SEEK_SET)) {
+		return OPJ_FALSE;
+	}
+
+	return OPJ_TRUE;
+}
+
+/* ---------------------------------------------------------------------- */
+#ifdef _WIN32
+#ifndef OPJ_STATIC
+BOOL APIENTRY
+DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
+
+	OPJ_ARG_NOT_USED(lpReserved);
+	OPJ_ARG_NOT_USED(hModule);
+
+	switch (ul_reason_for_call) {
+		case DLL_PROCESS_ATTACH :
+			break;
+		case DLL_PROCESS_DETACH :
+			break;
+		case DLL_THREAD_ATTACH :
+		case DLL_THREAD_DETACH :
+			break;
+    }
+
+    return TRUE;
+}
+#endif /* OPJ_STATIC */
+#endif /* _WIN32 */
+
+/* ---------------------------------------------------------------------- */
+
+const char* OPJ_CALLCONV opj_version(void) {
+    return OPJ_PACKAGE_VERSION;
+}
+
+/* ---------------------------------------------------------------------- */
+/* DECOMPRESSION FUNCTIONS*/
+
+opj_codec_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT p_format)
+{
+	opj_codec_private_t *l_codec = 00;
+
+	l_codec = (opj_codec_private_t*) opj_calloc(1, sizeof(opj_codec_private_t));
+	if (!l_codec){
+		return 00;
+	}
+	memset(l_codec, 0, sizeof(opj_codec_private_t));
+
+	l_codec->is_decompressor = 1;
+
+	switch (p_format) {
+		case OPJ_CODEC_J2K:
+			l_codec->opj_dump_codec = (void (*) (void*, OPJ_INT32, FILE*)) j2k_dump;
+
+			l_codec->opj_get_codec_info = (opj_codestream_info_v2_t* (*) (void*) ) j2k_get_cstr_info;
+
+			l_codec->opj_get_codec_index = (opj_codestream_index_t* (*) (void*) ) j2k_get_cstr_index;
+
+			l_codec->m_codec_data.m_decompression.opj_decode =
+					(OPJ_BOOL (*) (	void *,
+									struct opj_stream_private *,
+									opj_image_t*, struct opj_event_mgr * )) opj_j2k_decode;
+
+			l_codec->m_codec_data.m_decompression.opj_end_decompress =
+					(OPJ_BOOL (*) (	void *,
+									struct opj_stream_private *,
+									struct opj_event_mgr *)) opj_j2k_end_decompress;
+
+			l_codec->m_codec_data.m_decompression.opj_read_header =
+					(OPJ_BOOL (*) (	struct opj_stream_private *,
+									void *,
+									opj_image_t **,
+									struct opj_event_mgr * )) opj_j2k_read_header;
+
+			l_codec->m_codec_data.m_decompression.opj_destroy =
+					(void (*) (void *))opj_j2k_destroy;
+
+			l_codec->m_codec_data.m_decompression.opj_setup_decoder =
+					(void (*) (void * , opj_dparameters_t * )) opj_j2k_setup_decoder;
+
+			l_codec->m_codec_data.m_decompression.opj_read_tile_header =
+					(OPJ_BOOL (*) (	void *,
+									OPJ_UINT32*,
+									OPJ_UINT32*,
+									OPJ_INT32*, OPJ_INT32*,
+									OPJ_INT32*, OPJ_INT32*,
+									OPJ_UINT32*,
+									OPJ_BOOL*,
+									struct opj_stream_private *,
+									struct opj_event_mgr * )) opj_j2k_read_tile_header;
+
+			l_codec->m_codec_data.m_decompression.opj_decode_tile_data =
+					(OPJ_BOOL (*) ( void *, 
+                                    OPJ_UINT32, 
+                                    OPJ_BYTE*, 
+                                    OPJ_UINT32, 
+                                    struct opj_stream_private *,
+                                    struct opj_event_mgr *)) opj_j2k_decode_tile;
+
+			l_codec->m_codec_data.m_decompression.opj_set_decode_area =
+					(OPJ_BOOL (*) ( void *, 
+                                    opj_image_t*, 
+                                    OPJ_INT32, OPJ_INT32, OPJ_INT32, OPJ_INT32, 
+                                    struct opj_event_mgr *)) opj_j2k_set_decode_area;
+
+			l_codec->m_codec_data.m_decompression.opj_get_decoded_tile = 
+                    (OPJ_BOOL (*) ( void *p_codec,
+								    opj_stream_private_t *p_cio,
+								    opj_image_t *p_image,
+								    struct opj_event_mgr * p_manager,
+								    OPJ_UINT32 tile_index)) opj_j2k_get_tile;
+
+			l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor = 
+                    (OPJ_BOOL (*) ( void * p_codec,
+									OPJ_UINT32 res_factor,
+									struct opj_event_mgr * p_manager)) opj_j2k_set_decoded_resolution_factor;
+
+			l_codec->m_codec = opj_j2k_create_decompress();
+
+			if (! l_codec->m_codec) {
+				opj_free(l_codec);
+				return NULL;
+			}
+
+			break;
+
+		case OPJ_CODEC_JP2:
+			/* get a JP2 decoder handle */
+			l_codec->opj_dump_codec = (void (*) (void*, OPJ_INT32, FILE*)) jp2_dump;
+
+			l_codec->opj_get_codec_info = (opj_codestream_info_v2_t* (*) (void*) ) jp2_get_cstr_info;
+
+			l_codec->opj_get_codec_index = (opj_codestream_index_t* (*) (void*) ) jp2_get_cstr_index;
+
+			l_codec->m_codec_data.m_decompression.opj_decode =
+					(OPJ_BOOL (*) (	void *,
+									struct opj_stream_private *,
+									opj_image_t*,
+									struct opj_event_mgr * )) opj_jp2_decode;
+
+			l_codec->m_codec_data.m_decompression.opj_end_decompress =  
+                    (OPJ_BOOL (*) ( void *,
+                                    struct opj_stream_private *,
+                                    struct opj_event_mgr *)) opj_jp2_end_decompress;
+
+			l_codec->m_codec_data.m_decompression.opj_read_header =  
+                    (OPJ_BOOL (*) ( struct opj_stream_private *,
+					                void *,
+					                opj_image_t **,
+					                struct opj_event_mgr * )) opj_jp2_read_header;
+
+			l_codec->m_codec_data.m_decompression.opj_read_tile_header = 
+                    (OPJ_BOOL (*) ( void *,
+					                OPJ_UINT32*,
+					                OPJ_UINT32*,
+					                OPJ_INT32*,
+					                OPJ_INT32*,
+					                OPJ_INT32 * ,
+					                OPJ_INT32 * ,
+					                OPJ_UINT32 * ,
+					                OPJ_BOOL *,
+					                struct opj_stream_private *,
+					                struct opj_event_mgr * )) opj_jp2_read_tile_header;
+
+			l_codec->m_codec_data.m_decompression.opj_decode_tile_data = 
+                    (OPJ_BOOL (*) ( void *,
+                                    OPJ_UINT32,OPJ_BYTE*,OPJ_UINT32,
+                                    struct opj_stream_private *,
+                                    struct opj_event_mgr * )) opj_jp2_decode_tile;
+
+			l_codec->m_codec_data.m_decompression.opj_destroy = (void (*) (void *))opj_jp2_destroy;
+
+			l_codec->m_codec_data.m_decompression.opj_setup_decoder = 
+                    (void (*) (void * ,opj_dparameters_t * )) opj_jp2_setup_decoder;
+
+			l_codec->m_codec_data.m_decompression.opj_set_decode_area = 
+                    (OPJ_BOOL (*) ( void *,
+                                    opj_image_t*, 
+                                    OPJ_INT32,OPJ_INT32,OPJ_INT32,OPJ_INT32,
+                                    struct opj_event_mgr * )) opj_jp2_set_decode_area;
+
+			l_codec->m_codec_data.m_decompression.opj_get_decoded_tile = 
+                    (OPJ_BOOL (*) ( void *p_codec,
+									opj_stream_private_t *p_cio,
+									opj_image_t *p_image,
+									struct opj_event_mgr * p_manager,
+									OPJ_UINT32 tile_index)) opj_jp2_get_tile;
+
+			l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor = 
+                    (OPJ_BOOL (*) ( void * p_codec,
+						    		OPJ_UINT32 res_factor,
+							    	opj_event_mgr_t * p_manager)) opj_jp2_set_decoded_resolution_factor;
+
+			l_codec->m_codec = opj_jp2_create(OPJ_TRUE);
+
+			if (! l_codec->m_codec) {
+				opj_free(l_codec);
+				return 00;
+			}
+
+			break;
+		case OPJ_CODEC_UNKNOWN:
+		case OPJ_CODEC_JPT:
+		default:
+			opj_free(l_codec);
+			return 00;
+	}
+
+	opj_set_default_event_handler(&(l_codec->m_event_mgr));
+	return (opj_codec_t*) l_codec;
+}
+
+void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters) {
+	if(parameters) {
+		memset(parameters, 0, sizeof(opj_dparameters_t));
+		/* default decoding parameters */
+		parameters->cp_layer = 0;
+		parameters->cp_reduce = 0;
+
+		parameters->decod_format = -1;
+		parameters->cod_format = -1;
+		parameters->flags = 0;		
+/* UniPG>> */
+#ifdef USE_JPWL
+		parameters->jpwl_correct = OPJ_FALSE;
+		parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS;
+		parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES;
+#endif /* USE_JPWL */
+/* <<UniPG */
+	}
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,
+                                        opj_dparameters_t *parameters 
+										)
+{
+	if (p_codec && parameters) { 
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+
+		if (! l_codec->is_decompressor) {
+			opj_event_msg(&(l_codec->m_event_mgr), EVT_ERROR, 
+                "Codec provided to the opj_setup_decoder function is not a decompressor handler.\n");
+			return OPJ_FALSE;
+		}
+
+		l_codec->m_codec_data.m_decompression.opj_setup_decoder(l_codec->m_codec,
+																parameters);
+		return OPJ_TRUE;
+	}
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_read_header (	opj_stream_t *p_stream,
+										opj_codec_t *p_codec,
+										opj_image_t **p_image )
+{
+	if (p_codec && p_stream) {
+		opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
+		opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+
+		if(! l_codec->is_decompressor) {
+			opj_event_msg(&(l_codec->m_event_mgr), EVT_ERROR, 
+                "Codec provided to the opj_read_header function is not a decompressor handler.\n");
+			return OPJ_FALSE;
+		}
+
+		return l_codec->m_codec_data.m_decompression.opj_read_header(	l_stream,
+																		l_codec->m_codec,
+																		p_image,
+																		&(l_codec->m_event_mgr) );
+	}
+
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_decode(   opj_codec_t *p_codec,
+                                    opj_stream_t *p_stream,
+                                    opj_image_t* p_image)
+{
+	if (p_codec && p_stream) {
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+		if (! l_codec->is_decompressor) {
+			return OPJ_FALSE;
+		}
+
+		return l_codec->m_codec_data.m_decompression.opj_decode(l_codec->m_codec,
+																l_stream,
+																p_image,
+																&(l_codec->m_event_mgr) );
+	}
+
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_set_decode_area(	opj_codec_t *p_codec,
+											opj_image_t* p_image,
+											OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+											OPJ_INT32 p_end_x, OPJ_INT32 p_end_y
+											)
+{
+	if (p_codec) {
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+		
+		if (! l_codec->is_decompressor) {
+			return OPJ_FALSE;
+		}
+
+		return  l_codec->m_codec_data.m_decompression.opj_set_decode_area(	l_codec->m_codec,
+																			p_image,
+																			p_start_x, p_start_y,
+																			p_end_x, p_end_y,
+																			&(l_codec->m_event_mgr) );
+	}
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_read_tile_header(	opj_codec_t *p_codec,
+											opj_stream_t * p_stream,
+											OPJ_UINT32 * p_tile_index,
+											OPJ_UINT32 * p_data_size,
+											OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
+											OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
+											OPJ_UINT32 * p_nb_comps,
+											OPJ_BOOL * p_should_go_on)
+{
+	if (p_codec && p_stream && p_data_size && p_tile_index) {
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+		if (! l_codec->is_decompressor) {
+			return OPJ_FALSE;
+		}
+
+		return l_codec->m_codec_data.m_decompression.opj_read_tile_header(	l_codec->m_codec,
+																			p_tile_index,
+																			p_data_size,
+																			p_tile_x0, p_tile_y0,
+																			p_tile_x1, p_tile_y1,
+																			p_nb_comps,
+																			p_should_go_on,
+																			l_stream,
+																			&(l_codec->m_event_mgr));
+	}
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_decode_tile_data(	opj_codec_t *p_codec,
+											OPJ_UINT32 p_tile_index,
+											OPJ_BYTE * p_data,
+											OPJ_UINT32 p_data_size,
+											opj_stream_t *p_stream
+											)
+{
+	if (p_codec && p_data && p_stream) {
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+		if (! l_codec->is_decompressor) {
+			return OPJ_FALSE;
+		}
+
+		return l_codec->m_codec_data.m_decompression.opj_decode_tile_data(	l_codec->m_codec,
+																			p_tile_index,
+																			p_data,
+																			p_data_size,
+																			l_stream,
+																			&(l_codec->m_event_mgr) );
+	}
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_get_decoded_tile(	opj_codec_t *p_codec,
+											opj_stream_t *p_stream,
+											opj_image_t *p_image,
+											OPJ_UINT32 tile_index)
+{
+	if (p_codec && p_stream) {
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+		if (! l_codec->is_decompressor) {
+			return OPJ_FALSE;
+		}
+		
+		return l_codec->m_codec_data.m_decompression.opj_get_decoded_tile(	l_codec->m_codec,
+																			l_stream,
+																			p_image,
+																			&(l_codec->m_event_mgr),
+																			tile_index);
+	}
+
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_set_decoded_resolution_factor(opj_codec_t *p_codec, 
+														OPJ_UINT32 res_factor )
+{
+	opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+
+	if ( !l_codec ){
+		fprintf(stderr, "[ERROR] Input parameters of the setup_decoder function are incorrect.\n");
+		return OPJ_FALSE;
+	}
+
+	l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor(l_codec->m_codec, 
+																			res_factor,
+																			&(l_codec->m_event_mgr) );
+	return OPJ_TRUE;
+}
+
+/* ---------------------------------------------------------------------- */
+/* COMPRESSION FUNCTIONS*/
+
+opj_codec_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT p_format)
+{
+	opj_codec_private_t *l_codec = 00;
+
+	l_codec = (opj_codec_private_t*)opj_calloc(1, sizeof(opj_codec_private_t));
+	if (!l_codec) {
+		return 00;
+	}
+	memset(l_codec, 0, sizeof(opj_codec_private_t));
+	
+	l_codec->is_decompressor = 0;
+
+	switch(p_format) {
+		case OPJ_CODEC_J2K:
+			l_codec->m_codec_data.m_compression.opj_encode = (OPJ_BOOL (*) (void *,
+																			struct opj_stream_private *,
+																			struct opj_event_mgr * )) opj_j2k_encode;
+
+			l_codec->m_codec_data.m_compression.opj_end_compress = (OPJ_BOOL (*) (	void *,
+																					struct opj_stream_private *,
+																					struct opj_event_mgr *)) opj_j2k_end_compress;
+
+			l_codec->m_codec_data.m_compression.opj_start_compress = (OPJ_BOOL (*) (void *,
+																					struct opj_stream_private *,
+																					struct opj_image * ,
+																					struct opj_event_mgr *)) opj_j2k_start_compress;
+
+			l_codec->m_codec_data.m_compression.opj_write_tile = (OPJ_BOOL (*) (void *,
+																				OPJ_UINT32,
+																				OPJ_BYTE*,
+																				OPJ_UINT32,
+																				struct opj_stream_private *,
+																				struct opj_event_mgr *) ) opj_j2k_write_tile;
+
+			l_codec->m_codec_data.m_compression.opj_destroy = (void (*) (void *)) opj_j2k_destroy;
+
+			l_codec->m_codec_data.m_compression.opj_setup_encoder = (void (*) (	void *,
+																				opj_cparameters_t *,
+																				struct opj_image *,
+																				struct opj_event_mgr * )) opj_j2k_setup_encoder;
+
+			l_codec->m_codec = opj_j2k_create_compress();
+			if (! l_codec->m_codec) {
+				opj_free(l_codec);
+				return 00;
+			}
+
+			break;
+
+		case OPJ_CODEC_JP2:
+			/* get a JP2 decoder handle */
+			l_codec->m_codec_data.m_compression.opj_encode = (OPJ_BOOL (*) (void *,
+																			struct opj_stream_private *,
+																			struct opj_event_mgr * )) opj_jp2_encode;
+
+			l_codec->m_codec_data.m_compression.opj_end_compress = (OPJ_BOOL (*) (	void *,
+																					struct opj_stream_private *,
+																					struct opj_event_mgr *)) opj_jp2_end_compress;
+
+			l_codec->m_codec_data.m_compression.opj_start_compress = (OPJ_BOOL (*) (void *,
+																					struct opj_stream_private *,
+																					struct opj_image * ,
+																					struct opj_event_mgr *))  opj_jp2_start_compress;
+
+			l_codec->m_codec_data.m_compression.opj_write_tile = (OPJ_BOOL (*) (void *,
+																				OPJ_UINT32,
+																				OPJ_BYTE*,
+																				OPJ_UINT32,
+																				struct opj_stream_private *,
+																				struct opj_event_mgr *)) opj_jp2_write_tile;
+
+			l_codec->m_codec_data.m_compression.opj_destroy = (void (*) (void *)) opj_jp2_destroy;
+
+			l_codec->m_codec_data.m_compression.opj_setup_encoder = (void (*) (	void *,
+																				opj_cparameters_t *,
+																				struct opj_image *,
+																				struct opj_event_mgr * )) opj_jp2_setup_encoder;
+
+			l_codec->m_codec = opj_jp2_create(OPJ_FALSE);
+			if (! l_codec->m_codec) {
+				opj_free(l_codec);
+				return 00;
+			}
+
+			break;
+
+		case OPJ_CODEC_UNKNOWN:
+		case OPJ_CODEC_JPT:
+		default:
+			opj_free(l_codec);
+			return 00;
+	}
+
+	opj_set_default_event_handler(&(l_codec->m_event_mgr));
+	return (opj_codec_t*) l_codec;
+}
+
+void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters) {
+	if(parameters) {
+		memset(parameters, 0, sizeof(opj_cparameters_t));
+		/* default coding parameters */
+		parameters->cp_cinema = OPJ_OFF; 
+		parameters->max_comp_size = 0;
+		parameters->numresolution = 6;
+		parameters->cp_rsiz = OPJ_STD_RSIZ;
+		parameters->cblockw_init = 64;
+		parameters->cblockh_init = 64;
+		parameters->prog_order = OPJ_LRCP;
+		parameters->roi_compno = -1;		/* no ROI */
+		parameters->subsampling_dx = 1;
+		parameters->subsampling_dy = 1;
+		parameters->tp_on = 0;
+		parameters->decod_format = -1;
+		parameters->cod_format = -1;
+		parameters->tcp_rates[0] = 0;   
+		parameters->tcp_numlayers = 0;
+		parameters->cp_disto_alloc = 0;
+		parameters->cp_fixed_alloc = 0;
+		parameters->cp_fixed_quality = 0;
+		parameters->jpip_on = OPJ_FALSE;
+/* UniPG>> */
+#ifdef USE_JPWL
+		parameters->jpwl_epc_on = OPJ_FALSE;
+		parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */
+		{
+			int i;
+			for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
+				parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */
+				parameters->jpwl_hprot_TPH[i] = 0; /* absent */
+			}
+		};
+		{
+			int i;
+			for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
+				parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */
+				parameters->jpwl_pprot_packno[i] = -1; /* unassigned */
+				parameters->jpwl_pprot[i] = 0; /* absent */
+			}
+		};
+		parameters->jpwl_sens_size = 0; /* 0 means no ESD */
+		parameters->jpwl_sens_addr = 0; /* 0 means auto */
+		parameters->jpwl_sens_range = 0; /* 0 means packet */
+		parameters->jpwl_sens_MH = -1; /* -1 means unassigned */
+		{
+			int i;
+			for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
+				parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */
+				parameters->jpwl_sens_TPH[i] = -1; /* absent */
+			}
+		};
+#endif /* USE_JPWL */
+/* <<UniPG */
+	}
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec, 
+										opj_cparameters_t *parameters, 
+										opj_image_t *p_image)
+{
+	if (p_codec && parameters && p_image) {
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+
+		if (! l_codec->is_decompressor) {
+			l_codec->m_codec_data.m_compression.opj_setup_encoder(	l_codec->m_codec,
+																	parameters,
+																	p_image,
+																	&(l_codec->m_event_mgr) );
+			return OPJ_TRUE;
+		}
+	}
+
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_start_compress (	opj_codec_t *p_codec,
+											opj_image_t * p_image,
+											opj_stream_t *p_stream)
+{
+	if (p_codec && p_stream) {
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+		if (! l_codec->is_decompressor) {
+			return l_codec->m_codec_data.m_compression.opj_start_compress(	l_codec->m_codec,
+																			l_stream,
+																			p_image,
+																			&(l_codec->m_event_mgr));
+		}
+	}
+
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_encode(opj_codec_t *p_info, opj_stream_t *p_stream)
+{
+	if (p_info && p_stream) {
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_info;
+		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+		if (! l_codec->is_decompressor) {
+			return l_codec->m_codec_data.m_compression.opj_encode(	l_codec->m_codec,
+															l_stream,
+															&(l_codec->m_event_mgr));
+		}
+	}
+
+	return OPJ_FALSE;
+
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_end_compress (opj_codec_t *p_codec,
+										opj_stream_t *p_stream)
+{
+	if (p_codec && p_stream) {
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+		if (! l_codec->is_decompressor) {
+			return l_codec->m_codec_data.m_compression.opj_end_compress(l_codec->m_codec,
+																		l_stream,
+																		&(l_codec->m_event_mgr));
+		}
+	}
+	return OPJ_FALSE;
+
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_end_decompress (	opj_codec_t *p_codec,
+											opj_stream_t *p_stream)
+{
+	if (p_codec && p_stream) {
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+		if (! l_codec->is_decompressor) {
+			return OPJ_FALSE;
+		}
+		
+		return l_codec->m_codec_data.m_decompression.opj_end_decompress(l_codec->m_codec,
+																		l_stream,
+																		&(l_codec->m_event_mgr) );
+	}
+
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_set_MCT(opj_cparameters_t *parameters,
+                                  OPJ_FLOAT32 * pEncodingMatrix,
+                                  OPJ_INT32 * p_dc_shift,OPJ_UINT32 pNbComp)
+{
+	OPJ_UINT32 l_matrix_size = pNbComp * pNbComp * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+	OPJ_UINT32 l_dc_shift_size = pNbComp * (OPJ_UINT32)sizeof(OPJ_INT32);
+	OPJ_UINT32 l_mct_total_size = l_matrix_size + l_dc_shift_size;
+
+	/* add MCT capability */
+	OPJ_INT32 rsiz = (OPJ_INT32)parameters->cp_rsiz | (OPJ_INT32)OPJ_MCT;
+	parameters->cp_rsiz = (OPJ_RSIZ_CAPABILITIES)rsiz;
+	parameters->irreversible = 1;
+
+	/* use array based MCT */
+	parameters->tcp_mct = 2;
+	parameters->mct_data = opj_malloc(l_mct_total_size);
+	if (! parameters->mct_data) {
+		return OPJ_FALSE;
+	}
+
+	memcpy(parameters->mct_data,pEncodingMatrix,l_matrix_size);
+	memcpy(((OPJ_BYTE *) parameters->mct_data) +  l_matrix_size,p_dc_shift,l_dc_shift_size);
+
+	return OPJ_TRUE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_write_tile (	opj_codec_t *p_codec,
+										OPJ_UINT32 p_tile_index,
+										OPJ_BYTE * p_data,
+										OPJ_UINT32 p_data_size,
+										opj_stream_t *p_stream )
+{
+	if (p_codec && p_stream && p_data) {
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+		if (l_codec->is_decompressor) {
+			return OPJ_FALSE;
+		}
+
+		return l_codec->m_codec_data.m_compression.opj_write_tile(	l_codec->m_codec,
+																	p_tile_index,
+																	p_data,
+																	p_data_size,
+																	l_stream,
+																	&(l_codec->m_event_mgr) );
+	}
+
+	return OPJ_FALSE;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void OPJ_CALLCONV opj_destroy_codec(opj_codec_t *p_codec)
+{
+	if (p_codec) {
+		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+
+		if (l_codec->is_decompressor) {
+			l_codec->m_codec_data.m_decompression.opj_destroy(l_codec->m_codec);
+		}
+		else {
+			l_codec->m_codec_data.m_compression.opj_destroy(l_codec->m_codec);
+		}
+
+		l_codec->m_codec = 00;
+		opj_free(l_codec);
+	}
+}
+
+/* ---------------------------------------------------------------------- */
+
+void OPJ_CALLCONV opj_dump_codec(	opj_codec_t *p_codec,
+									OPJ_INT32 info_flag,
+									FILE* output_stream)
+{
+	if (p_codec) {
+		opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
+
+		l_codec->opj_dump_codec(l_codec->m_codec, info_flag, output_stream);
+		return;
+	}
+
+	fprintf(stderr, "[ERROR] Input parameter of the dump_codec function are incorrect.\n");
+	return;
+}
+
+opj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(opj_codec_t *p_codec)
+{
+	if (p_codec) {
+		opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
+
+		return l_codec->opj_get_codec_info(l_codec->m_codec);
+	}
+
+	return NULL;
+}
+
+void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_v2_t **cstr_info) {
+	if (cstr_info) {
+
+		if ((*cstr_info)->m_default_tile_info.tccp_info){
+			opj_free((*cstr_info)->m_default_tile_info.tccp_info);
+		}
+
+		if ((*cstr_info)->tile_info){
+			/* FIXME not used for the moment*/
+		}
+
+		opj_free((*cstr_info));
+		(*cstr_info) = NULL;
+	}
+}
+
+opj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(opj_codec_t *p_codec)
+{
+	if (p_codec) {
+		opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
+
+		return l_codec->opj_get_codec_index(l_codec->m_codec);
+	}
+
+	return NULL;
+}
+
+void OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t **p_cstr_index)
+{
+	if (*p_cstr_index){
+		j2k_destroy_cstr_index(*p_cstr_index);
+		(*p_cstr_index) = NULL;
+	}
+}
+
+opj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream_v3 (const char *fname, OPJ_BOOL p_is_read_stream)
+{
+    return opj_stream_create_file_stream_v3(fname, OPJ_J2K_STREAM_CHUNK_SIZE, p_is_read_stream);
+}
+
+opj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream_v3 (
+        const char *fname, 
+		OPJ_SIZE_T p_size, 
+        OPJ_BOOL p_is_read_stream)
+{
+    opj_stream_t* l_stream = 00;
+    FILE *p_file;
+    const char *mode;
+
+    if (! fname) {
+        return NULL;
+    }
+    
+    if(p_is_read_stream) mode = "rb"; else mode = "wb";
+
+    p_file = fopen(fname, mode);
+
+    if (! p_file) {
+	    return NULL;
+    }
+
+    l_stream = opj_stream_create(p_size,p_is_read_stream);
+    if (! l_stream) {
+        fclose(p_file);
+        return NULL;
+    }
+
+    opj_stream_set_user_data_v3(l_stream, p_file, (opj_stream_free_user_data_fn) fclose);
+    opj_stream_set_user_data_length(l_stream, opj_get_data_length_from_file(p_file));
+    opj_stream_set_read_function(l_stream, (opj_stream_read_fn) opj_read_from_file);
+    opj_stream_set_write_function(l_stream, (opj_stream_write_fn) opj_write_from_file);
+    opj_stream_set_skip_function(l_stream, (opj_stream_skip_fn) opj_skip_from_file);
+    opj_stream_set_seek_function(l_stream, (opj_stream_seek_fn) opj_seek_from_file);
+
+    return l_stream;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.h
new file mode 100644
index 0000000..29a9a90
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.h
@@ -0,0 +1,1501 @@
+ /*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef OPENJPEG_H
+#define OPENJPEG_H
+
+#ifndef OPJ_STATIC
+#define OPJ_STATIC
+#endif
+
+
+
+/* 
+==========================================================
+   Compiler directives
+==========================================================
+*/
+
+/*
+The inline keyword is supported by C99 but not by C90. 
+Most compilers implement their own version of this keyword ... 
+*/
+#ifndef INLINE
+	#if defined(_MSC_VER)
+		#define INLINE __forceinline
+	#elif defined(__GNUC__)
+		#define INLINE __inline__
+	#elif defined(__MWERKS__)
+		#define INLINE inline
+	#else 
+		/* add other compilers here ... */
+		#define INLINE 
+	#endif /* defined(<Compiler>) */
+#endif /* INLINE */
+
+/* deprecated attribute */
+#ifdef __GNUC__
+	#define OPJ_DEPRECATED(func) func __attribute__ ((deprecated))
+#elif defined(_MSC_VER)
+	#define OPJ_DEPRECATED(func) __declspec(deprecated) func
+#else
+	#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
+	#define OPJ_DEPRECATED(func) func
+#endif
+
+#if defined(OPJ_STATIC) || !defined(_WIN32)
+/* http://gcc.gnu.org/wiki/Visibility */
+#if __GNUC__ >= 4
+#define OPJ_API    __attribute__ ((visibility ("default")))
+#define OPJ_LOCAL  __attribute__ ((visibility ("hidden")))
+#else
+#define OPJ_API
+#define OPJ_LOCAL
+#endif
+#define OPJ_CALLCONV
+#else
+#define OPJ_CALLCONV __stdcall
+/*
+The following ifdef block is the standard way of creating macros which make exporting 
+from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS
+symbol defined on the command line. this symbol should not be defined on any project
+that uses this DLL. This way any other project whose source files include this file see 
+OPJ_API functions as being imported from a DLL, wheras this DLL sees symbols
+defined with this macro as being exported.
+*/
+#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT)
+#define OPJ_API __declspec(dllexport)
+#else
+#define OPJ_API __declspec(dllimport)
+#endif /* OPJ_EXPORTS */
+#endif /* !OPJ_STATIC || !_WIN32 */
+
+typedef int OPJ_BOOL;
+#define OPJ_TRUE 1
+#define OPJ_FALSE 0
+
+typedef char          OPJ_CHAR;
+typedef float         OPJ_FLOAT32;
+typedef double        OPJ_FLOAT64;
+typedef unsigned char OPJ_BYTE;
+#include "opj_stdint.h"
+
+typedef int8_t   OPJ_INT8;
+typedef uint8_t  OPJ_UINT8;
+typedef int16_t  OPJ_INT16;
+typedef uint16_t OPJ_UINT16;
+typedef int32_t  OPJ_INT32;
+typedef uint32_t OPJ_UINT32;
+typedef int64_t  OPJ_INT64;
+typedef uint64_t OPJ_UINT64;
+
+typedef int64_t  OPJ_OFF_T; /* 64-bit file offset type */
+
+#include <stdio.h>
+typedef size_t   OPJ_SIZE_T;
+
+/* Avoid compile-time warning because parameter is not used */
+#define OPJ_ARG_NOT_USED(x) (void)(x)
+
+/* 
+==========================================================
+   Useful constant definitions
+==========================================================
+*/
+
+#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */
+
+#define OPJ_J2K_MAXRLVLS 33					/**< Number of maximum resolution level authorized */
+#define OPJ_J2K_MAXBANDS (3*OPJ_J2K_MAXRLVLS-2)	/**< Number of maximum sub-band linked to number of resolution level */
+
+#define OPJ_J2K_DEFAULT_NB_SEGS				10
+#define OPJ_J2K_STREAM_CHUNK_SIZE			0x100000 /** 1 mega by default */
+#define OPJ_J2K_DEFAULT_HEADER_SIZE			1000
+#define OPJ_J2K_MCC_DEFAULT_NB_RECORDS		10
+#define OPJ_J2K_MCT_DEFAULT_NB_RECORDS		10
+
+/* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */
+#define JPWL_MAX_NO_TILESPECS	16 /**< Maximum number of tile parts expected by JPWL: increase at your will */
+#define JPWL_MAX_NO_PACKSPECS	16 /**< Maximum number of packet parts expected by JPWL: increase at your will */
+#define JPWL_MAX_NO_MARKERS	512 /**< Maximum number of JPWL markers: increase at your will */
+#define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */
+#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */
+#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */
+#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */
+#define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */
+/* <<UniPG */
+
+/**
+ * EXPERIMENTAL FOR THE MOMENT
+ * Supported options about file information used only in j2k_dump
+*/
+#define OPJ_IMG_INFO		1	/**< Basic image information provided to the user */
+#define OPJ_J2K_MH_INFO		2	/**< Codestream information based only on the main header */
+#define OPJ_J2K_TH_INFO		4	/**< Tile information based on the current tile header */
+#define OPJ_J2K_TCH_INFO	8	/**< Tile/Component information of all tiles */
+#define OPJ_J2K_MH_IND		16	/**< Codestream index based only on the main header */
+#define OPJ_J2K_TH_IND		32	/**< Tile index based on the current tile */
+/*FIXME #define OPJ_J2K_CSTR_IND	48*/	/**<  */
+#define OPJ_JP2_INFO		128	/**< JP2 file information */
+#define OPJ_JP2_IND			256	/**< JP2 file index */
+
+
+/* 
+==========================================================
+   enum definitions
+==========================================================
+*/
+/** 
+ * Rsiz Capabilities
+ * */
+typedef enum RSIZ_CAPABILITIES {
+	OPJ_STD_RSIZ = 0,		/** Standard JPEG2000 profile*/
+	OPJ_CINEMA2K = 3,		/** Profile name for a 2K image*/
+	OPJ_CINEMA4K = 4,		/** Profile name for a 4K image*/
+	OPJ_MCT = 0x8100
+} OPJ_RSIZ_CAPABILITIES;
+
+/** 
+ * Digital cinema operation mode
+ * */
+typedef enum CINEMA_MODE {
+	OPJ_OFF = 0,			/** Not Digital Cinema*/
+	OPJ_CINEMA2K_24 = 1,	/** 2K Digital Cinema at 24 fps*/
+	OPJ_CINEMA2K_48 = 2,	/** 2K Digital Cinema at 48 fps*/
+	OPJ_CINEMA4K_24 = 3		/** 4K Digital Cinema at 24 fps*/
+}OPJ_CINEMA_MODE;
+
+/** 
+ * Progression order
+ * */
+typedef enum PROG_ORDER {
+	OPJ_PROG_UNKNOWN = -1,	/**< place-holder */
+	OPJ_LRCP = 0,			/**< layer-resolution-component-precinct order */
+	OPJ_RLCP = 1,			/**< resolution-layer-component-precinct order */
+	OPJ_RPCL = 2,			/**< resolution-precinct-component-layer order */
+	OPJ_PCRL = 3,			/**< precinct-component-resolution-layer order */
+	OPJ_CPRL = 4			/**< component-precinct-resolution-layer order */
+} OPJ_PROG_ORDER;
+
+/**
+ * Supported image color spaces
+*/
+typedef enum COLOR_SPACE {
+	OPJ_CLRSPC_UNKNOWN = -1,	/**< not supported by the library */
+	OPJ_CLRSPC_UNSPECIFIED = 0,	/**< not specified in the codestream */ 
+	OPJ_CLRSPC_SRGB = 1,		/**< sRGB */
+	OPJ_CLRSPC_GRAY = 2,		/**< grayscale */
+	OPJ_CLRSPC_SYCC = 3,		/**< YUV */
+  OPJ_CLRSPC_EYCC = 4		/**< e-YCC */
+} OPJ_COLOR_SPACE;
+
+/**
+ * Supported codec
+*/
+typedef enum CODEC_FORMAT {
+	OPJ_CODEC_UNKNOWN = -1,	/**< place-holder */
+	OPJ_CODEC_J2K  = 0,		/**< JPEG-2000 codestream : read/write */
+	OPJ_CODEC_JPT  = 1,		/**< JPT-stream (JPEG 2000, JPIP) : read only */
+	OPJ_CODEC_JP2  = 2 		/**< JPEG-2000 file format : read/write */
+} OPJ_CODEC_FORMAT;
+
+
+/* 
+==========================================================
+   event manager typedef definitions
+==========================================================
+*/
+
+/**
+ * Callback function prototype for events
+ * @param msg               Event message
+ * @param client_data       Client object where will be return the event message 
+ * */
+typedef void (*opj_msg_callback) (const char *msg, void *client_data);
+
+/* 
+==========================================================
+   codec typedef definitions
+==========================================================
+*/
+
+/**
+ * Progression order changes
+ * 
+ */
+typedef struct opj_poc {
+	/** Resolution num start, Component num start, given by POC */
+	OPJ_UINT32 resno0, compno0;
+	/** Layer num end,Resolution num end, Component num end, given by POC */
+	OPJ_UINT32 layno1, resno1, compno1;
+	/** Layer num start,Precinct num start, Precinct num end */
+	OPJ_UINT32 layno0, precno0, precno1;
+	/** Progression order enum*/
+	OPJ_PROG_ORDER prg1,prg;
+	/** Progression order string*/
+	OPJ_CHAR progorder[5];
+	/** Tile number */
+	OPJ_UINT32 tile;
+	/** Start and end values for Tile width and height*/
+	OPJ_INT32 tx0,tx1,ty0,ty1;
+	/** Start value, initialised in pi_initialise_encode*/
+	OPJ_UINT32 layS, resS, compS, prcS;
+	/** End value, initialised in pi_initialise_encode */
+	OPJ_UINT32 layE, resE, compE, prcE;
+	/** Start and end values of Tile width and height, initialised in pi_initialise_encode*/
+	OPJ_UINT32 txS,txE,tyS,tyE,dx,dy;
+	/** Temporary values for Tile parts, initialised in pi_create_encode */
+	OPJ_UINT32 lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t;
+} opj_poc_t;
+
+/**
+ * Compression parameters
+ * */
+typedef struct opj_cparameters {
+	/** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
+	OPJ_BOOL tile_size_on;
+	/** XTOsiz */
+	int cp_tx0;
+	/** YTOsiz */
+	int cp_ty0;
+	/** XTsiz */
+	int cp_tdx;
+	/** YTsiz */
+	int cp_tdy;
+	/** allocation by rate/distortion */
+	int cp_disto_alloc;
+	/** allocation by fixed layer */
+	int cp_fixed_alloc;
+	/** add fixed_quality */
+	int cp_fixed_quality;
+	/** fixed layer */
+	int *cp_matrice;
+	/** comment for coding */
+	char *cp_comment;
+	/** csty : coding style */
+	int csty;
+	/** progression order (default OPJ_LRCP) */
+	OPJ_PROG_ORDER prog_order;
+	/** progression order changes */
+	opj_poc_t POC[32];
+	/** number of progression order changes (POC), default to 0 */
+	OPJ_UINT32 numpocs;
+	/** number of layers */
+	int tcp_numlayers;
+	/** rates of layers */
+	float tcp_rates[100];
+	/** different psnr for successive layers */
+	float tcp_distoratio[100];
+	/** number of resolutions */
+	int numresolution;
+	/** initial code block width, default to 64 */
+ 	int cblockw_init;
+	/** initial code block height, default to 64 */
+	int cblockh_init;
+	/** mode switch (cblk_style) */
+	int mode;
+	/** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */
+	int irreversible;
+	/** region of interest: affected component in [0..3], -1 means no ROI */
+	int roi_compno;
+	/** region of interest: upshift value */
+	int roi_shift;
+	/* number of precinct size specifications */
+	int res_spec;
+	/** initial precinct width */
+	int prcw_init[OPJ_J2K_MAXRLVLS];
+	/** initial precinct height */
+	int prch_init[OPJ_J2K_MAXRLVLS];
+
+	/**@name command line encoder parameters (not used inside the library) */
+	/*@{*/
+	/** input file name */
+	char infile[OPJ_PATH_LEN];
+	/** output file name */
+	char outfile[OPJ_PATH_LEN];
+	/** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
+	int index_on;
+	/** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
+	char index[OPJ_PATH_LEN];
+	/** subimage encoding: origin image offset in x direction */
+	int image_offset_x0;
+	/** subimage encoding: origin image offset in y direction */
+	int image_offset_y0;
+	/** subsampling value for dx */
+	int subsampling_dx;
+	/** subsampling value for dy */
+	int subsampling_dy;
+	/** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/
+	int decod_format;
+	/** output file format 0: J2K, 1: JP2, 2: JPT */
+	int cod_format;
+	/*@}*/
+
+/* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */
+	/**@name JPWL encoding parameters */
+	/*@{*/
+	/** enables writing of EPC in MH, thus activating JPWL */
+	OPJ_BOOL jpwl_epc_on;
+	/** error protection method for MH (0,1,16,32,37-128) */
+	int jpwl_hprot_MH;
+	/** tile number of header protection specification (>=0) */
+	int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+	/** error protection methods for TPHs (0,1,16,32,37-128) */
+	int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS];
+	/** tile number of packet protection specification (>=0) */
+	int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS];
+	/** packet number of packet protection specification (>=0) */
+	int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS];
+	/** error protection methods for packets (0,1,16,32,37-128) */
+	int jpwl_pprot[JPWL_MAX_NO_PACKSPECS];
+	/** enables writing of ESD, (0=no/1/2 bytes) */
+	int jpwl_sens_size;
+	/** sensitivity addressing size (0=auto/2/4 bytes) */
+	int jpwl_sens_addr;
+	/** sensitivity range (0-3) */
+	int jpwl_sens_range;
+	/** sensitivity method for MH (-1=no,0-7) */
+	int jpwl_sens_MH;
+	/** tile number of sensitivity specification (>=0) */
+	int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+	/** sensitivity methods for TPHs (-1=no,0-7) */
+	int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS];
+	/*@}*/
+/* <<UniPG */
+
+	/** Digital Cinema compliance 0-not compliant, 1-compliant*/
+	OPJ_CINEMA_MODE cp_cinema;
+	/** Maximum rate for each component. If == 0, component size limitation is not considered */
+	int max_comp_size;
+	/** Profile name*/
+	OPJ_RSIZ_CAPABILITIES cp_rsiz;
+	/** Tile part generation*/
+	char tp_on;
+	/** Flag for Tile part generation*/
+	char tp_flag;
+	/** MCT (multiple component transform) */
+	char tcp_mct;
+	/** Enable JPIP indexing*/
+	OPJ_BOOL jpip_on;
+	/** Naive implementation of MCT restricted to a single reversible array based 
+        encoding without offset concerning all the components. */
+	void * mct_data;
+} opj_cparameters_t;  
+
+#define OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG	0x0001
+
+/**
+ * Decompression parameters
+ * */
+typedef struct opj_dparameters {
+	/** 
+	Set the number of highest resolution levels to be discarded. 
+	The image resolution is effectively divided by 2 to the power of the number of discarded levels. 
+	The reduce factor is limited by the smallest total number of decomposition levels among tiles.
+	if != 0, then original dimension divided by 2^(reduce); 
+	if == 0 or not used, image is decoded to the full resolution 
+	*/
+	OPJ_UINT32 cp_reduce;
+	/** 
+	Set the maximum number of quality layers to decode. 
+	If there are less quality layers than the specified number, all the quality layers are decoded.
+	if != 0, then only the first "layer" layers are decoded; 
+	if == 0 or not used, all the quality layers are decoded 
+	*/
+	OPJ_UINT32 cp_layer;
+
+	/**@name command line decoder parameters (not used inside the library) */
+	/*@{*/
+	/** input file name */
+	char infile[OPJ_PATH_LEN];
+	/** output file name */
+	char outfile[OPJ_PATH_LEN];
+	/** input file format 0: J2K, 1: JP2, 2: JPT */
+	int decod_format;
+	/** output file format 0: PGX, 1: PxM, 2: BMP */
+	int cod_format;
+
+	/** Decoding area left boundary */
+	OPJ_UINT32 DA_x0;
+	/** Decoding area right boundary */
+	OPJ_UINT32 DA_x1;
+	/** Decoding area up boundary */
+	OPJ_UINT32 DA_y0;
+	/** Decoding area bottom boundary */
+	OPJ_UINT32 DA_y1;
+	/** Verbose mode */
+	OPJ_BOOL m_verbose;
+
+	/** tile number ot the decoded tile*/
+	OPJ_UINT32 tile_index;
+	/** Nb of tile to decode */
+	OPJ_UINT32 nb_tile_to_decode;
+
+	/*@}*/
+
+/* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */
+	/**@name JPWL decoding parameters */
+	/*@{*/
+	/** activates the JPWL correction capabilities */
+	OPJ_BOOL jpwl_correct;
+	/** expected number of components */
+	int jpwl_exp_comps;
+	/** maximum number of tiles */
+	int jpwl_max_tiles;
+	/*@}*/
+/* <<UniPG */
+
+	unsigned int flags;
+
+} opj_dparameters_t;
+
+
+/**
+ * JPEG2000 codec V2.
+ * */
+typedef void * opj_codec_t;
+
+/* 
+==========================================================
+   I/O stream typedef definitions
+==========================================================
+*/
+
+/**
+ * Stream open flags.
+ * */
+/** The stream was opened for reading. */
+#define OPJ_STREAM_READ	OPJ_TRUE
+/** The stream was opened for writing. */
+#define OPJ_STREAM_WRITE OPJ_FALSE
+
+/*
+ * Callback function prototype for read function
+ */
+typedef OPJ_SIZE_T (* opj_stream_read_fn) (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) ;
+
+/*
+ * Callback function prototype for write function
+ */
+typedef OPJ_SIZE_T (* opj_stream_write_fn) (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) ;
+
+/*
+ * Callback function prototype for skip function
+ */
+typedef OPJ_OFF_T (* opj_stream_skip_fn) (OPJ_OFF_T p_nb_bytes, void * p_user_data) ;
+
+/*
+ * Callback function prototype for seek function
+ */
+typedef OPJ_BOOL (* opj_stream_seek_fn) (OPJ_OFF_T p_nb_bytes, void * p_user_data) ;
+
+/*
+ * Callback function prototype for free user data function
+ */
+typedef void (* opj_stream_free_user_data_fn) (void * p_user_data) ;
+
+/*
+ * JPEG2000 Stream.
+ */
+typedef void * opj_stream_t;
+
+/* 
+==========================================================
+   image typedef definitions
+==========================================================
+*/
+
+/**
+ * Defines a single image component
+ * */
+typedef struct opj_image_comp {
+	/** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
+	OPJ_UINT32 dx;
+	/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
+	OPJ_UINT32 dy;
+	/** data width */
+	OPJ_UINT32 w;
+	/** data height */
+	OPJ_UINT32 h;
+	/** x component offset compared to the whole image */
+	OPJ_UINT32 x0;
+	/** y component offset compared to the whole image */
+	OPJ_UINT32 y0;
+	/** precision */
+	OPJ_UINT32 prec;
+	/** image depth in bits */
+	OPJ_UINT32 bpp;
+	/** signed (1) / unsigned (0) */
+	OPJ_UINT32 sgnd;
+	/** number of decoded resolution */
+	OPJ_UINT32 resno_decoded;
+	/** number of division by 2 of the out image compared to the original size of image */
+	OPJ_UINT32 factor;
+	/** image component data */
+	OPJ_INT32 *data;
+  /** alpha channel */
+  OPJ_UINT16 alpha;
+} opj_image_comp_t;
+
+/** 
+ * Defines image data and characteristics
+ * */
+typedef struct opj_image {
+	/** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */
+	OPJ_UINT32 x0;
+	/** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */
+	OPJ_UINT32 y0;
+	/** Xsiz: width of the reference grid */
+	OPJ_UINT32 x1;
+	/** Ysiz: height of the reference grid */
+	OPJ_UINT32 y1;
+	/** number of components in the image */
+	OPJ_UINT32 numcomps;
+	/** color space: sRGB, Greyscale or YUV */
+	OPJ_COLOR_SPACE color_space;
+	/** image components */
+	opj_image_comp_t *comps;
+	/** 'restricted' ICC profile */
+	OPJ_BYTE *icc_profile_buf;
+	/** size of ICC profile */
+	OPJ_UINT32 icc_profile_len;
+
+	OPJ_INT8  useColorSpace;  //liang
+} opj_image_t;
+
+
+/**
+ * Component parameters structure used by the opj_image_create function
+ * */
+typedef struct opj_image_comptparm {
+	/** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
+	OPJ_UINT32 dx;
+	/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
+	OPJ_UINT32 dy;
+	/** data width */
+	OPJ_UINT32 w;
+	/** data height */
+	OPJ_UINT32 h;
+	/** x component offset compared to the whole image */
+	OPJ_UINT32 x0;
+	/** y component offset compared to the whole image */
+	OPJ_UINT32 y0;
+	/** precision */
+	OPJ_UINT32 prec;
+	/** image depth in bits */
+	OPJ_UINT32 bpp;
+	/** signed (1) / unsigned (0) */
+	OPJ_UINT32 sgnd;
+} opj_image_cmptparm_t;
+
+
+/* 
+==========================================================
+   Information on the JPEG 2000 codestream
+==========================================================
+*/
+/* QUITE EXPERIMENTAL FOR THE MOMENT */
+
+/**
+ * Index structure : Information concerning a packet inside tile
+ * */
+typedef struct opj_packet_info {
+	/** packet start position (including SOP marker if it exists) */
+	OPJ_OFF_T start_pos;
+	/** end of packet header position (including EPH marker if it exists)*/
+	OPJ_OFF_T end_ph_pos;
+	/** packet end position */
+	OPJ_OFF_T end_pos;
+	/** packet distorsion */
+	double disto;
+} opj_packet_info_t;
+
+
+/* UniPG>> */
+/**
+ * Marker structure
+ * */
+typedef struct opj_marker_info {
+	/** marker type */
+	unsigned short int type;
+	/** position in codestream */
+	OPJ_OFF_T pos;
+	/** length, marker val included */
+	int len;
+} opj_marker_info_t;
+/* <<UniPG */
+
+/**
+ * Index structure : Information concerning tile-parts
+*/
+typedef struct opj_tp_info {
+	/** start position of tile part */
+	int tp_start_pos;
+	/** end position of tile part header */
+	int tp_end_header;
+	/** end position of tile part */
+	int tp_end_pos;
+	/** start packet of tile part */
+	int tp_start_pack;
+	/** number of packets of tile part */
+	int tp_numpacks;
+} opj_tp_info_t;
+
+/**
+ * Index structure : information regarding tiles
+*/
+typedef struct opj_tile_info {
+	/** value of thresh for each layer by tile cfr. Marcela   */
+	double *thresh;
+	/** number of tile */
+	int tileno;
+	/** start position */
+	int start_pos;
+	/** end position of the header */
+	int end_header;
+	/** end position */
+	int end_pos;
+	/** precinct number for each resolution level (width) */
+	int pw[33];
+	/** precinct number for each resolution level (height) */
+	int ph[33];
+	/** precinct size (in power of 2), in X for each resolution level */
+	int pdx[33];
+	/** precinct size (in power of 2), in Y for each resolution level */
+	int pdy[33];
+	/** information concerning packets inside tile */
+	opj_packet_info_t *packet;
+	/** add fixed_quality */
+	int numpix;
+	/** add fixed_quality */
+	double distotile;
+  	/** number of markers */
+	int marknum;
+	/** list of markers */
+	opj_marker_info_t *marker;
+	/** actual size of markers array */
+	int maxmarknum;
+	/** number of tile parts */
+	int num_tps;
+	/** information concerning tile parts */
+	opj_tp_info_t *tp;
+} opj_tile_info_t;
+
+/**
+ * Index structure of the codestream
+*/
+typedef struct opj_codestream_info {
+	/** maximum distortion reduction on the whole image (add for Marcela) */
+	double D_max;
+	/** packet number */
+	int packno;
+	/** writing the packet in the index with t2_encode_packets */
+	int index_write;
+	/** image width */
+	int image_w;
+	/** image height */
+	int image_h;
+	/** progression order */
+	OPJ_PROG_ORDER prog;
+	/** tile size in x */
+	int tile_x;
+	/** tile size in y */
+	int tile_y;
+	/** */
+	int tile_Ox;
+	/** */
+	int tile_Oy;
+	/** number of tiles in X */
+	int tw;
+	/** number of tiles in Y */
+	int th;
+	/** component numbers */
+	int numcomps;
+	/** number of layer */
+	int numlayers;
+	/** number of decomposition for each component */
+	int *numdecompos;
+/* UniPG>> */
+	/** number of markers */
+	int marknum;
+	/** list of markers */
+	opj_marker_info_t *marker;
+	/** actual size of markers array */
+	int maxmarknum;
+/* <<UniPG */
+	/** main header position */
+	int main_head_start;
+	/** main header position */
+	int main_head_end;
+	/** codestream's size */
+	int codestream_size;
+	/** information regarding tiles inside image */
+	opj_tile_info_t *tile;
+} opj_codestream_info_t;
+
+/* <----------------------------------------------------------- */
+/* new output managment of the codestream information and index */
+
+/**
+ * Tile-component coding parameters information
+ */
+typedef struct opj_tccp_info
+{
+	/** component index */
+	OPJ_UINT32 compno;
+	/** coding style */
+	OPJ_UINT32 csty;
+	/** number of resolutions */
+	OPJ_UINT32 numresolutions;
+	/** code-blocks width */
+	OPJ_UINT32 cblkw;
+	/** code-blocks height */
+	OPJ_UINT32 cblkh;
+	/** code-block coding style */
+	OPJ_UINT32 cblksty;
+	/** discrete wavelet transform identifier */
+	OPJ_UINT32 qmfbid;
+	/** quantisation style */
+	OPJ_UINT32 qntsty;
+	/** stepsizes used for quantization */
+	OPJ_UINT32 stepsizes_mant[OPJ_J2K_MAXBANDS];
+	/** stepsizes used for quantization */
+	OPJ_UINT32 stepsizes_expn[OPJ_J2K_MAXBANDS];
+	/** number of guard bits */
+	OPJ_UINT32 numgbits;
+	/** Region Of Interest shift */
+	OPJ_INT32 roishift;
+	/** precinct width */
+	OPJ_UINT32 prcw[OPJ_J2K_MAXRLVLS];
+	/** precinct height */
+	OPJ_UINT32 prch[OPJ_J2K_MAXRLVLS];
+}
+opj_tccp_info_t;
+
+/**
+ * Tile coding parameters information
+ */
+typedef struct opj_tile_v2_info {
+
+	/** number (index) of tile */
+	int tileno;
+	/** coding style */
+	OPJ_UINT32 csty;
+	/** progression order */
+	OPJ_PROG_ORDER prg;
+	/** number of layers */
+	OPJ_UINT32 numlayers;
+	/** multi-component transform identifier */
+	OPJ_UINT32 mct;
+
+	/** information concerning tile component parameters*/
+	opj_tccp_info_t *tccp_info;
+
+} opj_tile_info_v2_t;
+
+/**
+ * Information structure about the codestream (FIXME should be expand and enhance)
+ */
+typedef struct opj_codestream_info_v2 {
+	/* Tile info */
+	/** tile origin in x = XTOsiz */
+	OPJ_UINT32 tx0;
+	/** tile origin in y = YTOsiz */
+	OPJ_UINT32 ty0;
+	/** tile size in x = XTsiz */
+	OPJ_UINT32 tdx;
+	/** tile size in y = YTsiz */
+	OPJ_UINT32 tdy;
+	/** number of tiles in X */
+	OPJ_UINT32 tw;
+	/** number of tiles in Y */
+	OPJ_UINT32 th;
+
+	/** number of components*/
+	OPJ_UINT32 nbcomps;
+
+	/** Default information regarding tiles inside image */
+	opj_tile_info_v2_t m_default_tile_info;
+
+	/** information regarding tiles inside image */
+	opj_tile_info_v2_t *tile_info; /* FIXME not used for the moment */
+
+} opj_codestream_info_v2_t;
+
+
+/**
+ * Index structure about a tile part
+ */
+typedef struct opj_tp_index {
+	/** start position */
+	OPJ_OFF_T start_pos;
+	/** end position of the header */
+	OPJ_OFF_T end_header;
+	/** end position */
+	OPJ_OFF_T end_pos;
+
+} opj_tp_index_t;
+
+/**
+ * Index structure about a tile
+ */
+typedef struct opj_tile_index {
+	/** tile index */
+	OPJ_UINT32 tileno;
+
+	/** number of tile parts */
+	OPJ_UINT32 nb_tps;
+	/** current nb of tile part (allocated)*/
+	OPJ_UINT32 current_nb_tps;
+	/** current tile-part index */
+	OPJ_UINT32 current_tpsno;
+	/** information concerning tile parts */
+	opj_tp_index_t *tp_index;
+
+	/* UniPG>> */ /* NOT USED FOR THE MOMENT IN THE V2 VERSION */
+		/** number of markers */
+		OPJ_UINT32 marknum;
+		/** list of markers */
+		opj_marker_info_t *marker;
+		/** actual size of markers array */
+		OPJ_UINT32 maxmarknum;
+	/* <<UniPG */
+
+	/** packet number */
+	OPJ_UINT32 nb_packet;
+	/** information concerning packets inside tile */
+	opj_packet_info_t *packet_index;
+
+} opj_tile_index_t;
+
+/**
+ * Index structure of the codestream (FIXME should be expand and enhance)
+ */
+typedef struct opj_codestream_index {
+	/** main header start position (SOC position) */
+	OPJ_OFF_T main_head_start;
+	/** main header end position (first SOT position) */
+	OPJ_OFF_T main_head_end;
+
+	/** codestream's size */
+	OPJ_UINT64 codestream_size;
+
+/* UniPG>> */ /* NOT USED FOR THE MOMENT IN THE V2 VERSION */
+	/** number of markers */
+	OPJ_UINT32 marknum;
+	/** list of markers */
+	opj_marker_info_t *marker;
+	/** actual size of markers array */
+	OPJ_UINT32 maxmarknum;
+/* <<UniPG */
+
+	/** */
+	OPJ_UINT32 nb_of_tiles;
+	/** */
+	opj_tile_index_t *tile_index; /* FIXME not used for the moment */
+
+}opj_codestream_index_t;
+/* -----------------------------------------------------------> */
+
+/*
+==========================================================
+   Metadata from the JP2file
+==========================================================
+*/
+
+/**
+ * Info structure of the JP2 file
+ * EXPERIMENTAL FOR THE MOMENT
+ */
+typedef struct opj_jp2_metadata {
+	/** */
+	OPJ_INT32	not_used;
+
+} opj_jp2_metadata_t;
+
+/**
+ * Index structure of the JP2 file
+ * EXPERIMENTAL FOR THE MOMENT
+ */
+typedef struct opj_jp2_index {
+	/** */
+	OPJ_INT32	not_used;
+
+} opj_jp2_index_t;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* 
+==========================================================
+   openjpeg version
+==========================================================
+*/
+
+/* Get the version of the openjpeg library*/
+OPJ_API const char * OPJ_CALLCONV opj_version(void);
+
+/* 
+==========================================================
+   image functions definitions
+==========================================================
+*/
+
+/**
+ * Create an image
+ *
+ * @param numcmpts      number of components
+ * @param cmptparms     components parameters
+ * @param clrspc        image color space
+ * @return returns      a new image structure if successful, returns NULL otherwise
+ * */
+OPJ_API opj_image_t* OPJ_CALLCONV opj_image_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
+
+/**
+ * Deallocate any resources associated with an image
+ *
+ * @param image         image to be destroyed
+ */
+OPJ_API void OPJ_CALLCONV opj_image_destroy(opj_image_t *image);
+
+/**
+ * Creates an image without allocating memory for the image (used in the new version of the library).
+ *
+ * @param	numcmpts    the number of components
+ * @param	cmptparms   the components parameters
+ * @param	clrspc      the image color space
+ *
+ * @return	a new image structure if successful, NULL otherwise.
+*/
+OPJ_API opj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
+
+/* 
+==========================================================
+   stream functions definitions
+==========================================================
+*/
+
+/**
+ * Creates an abstract stream. This function does nothing except allocating memory and initializing the abstract stream.
+ *
+ * @param	p_is_input		if set to true then the stream will be an input stream, an output stream else.
+ *
+ * @return	a stream object.
+*/
+OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_default_create(OPJ_BOOL p_is_input);
+
+/**
+ * Creates an abstract stream. This function does nothing except allocating memory and initializing the abstract stream.
+ *
+ * @param	p_buffer_size  FIXME DOC
+ * @param	p_is_input		if set to true then the stream will be an input stream, an output stream else.
+ *
+ * @return	a stream object.
+*/
+OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create(OPJ_SIZE_T p_buffer_size, OPJ_BOOL p_is_input);
+
+/**
+ * Destroys a stream created by opj_create_stream. This function does NOT close the abstract stream. If needed the user must
+ * close its own implementation of the stream.
+ *
+ * @param	p_stream	the stream to destroy.
+ */
+OPJ_API void OPJ_CALLCONV opj_stream_destroy(opj_stream_t* p_stream);
+
+/**
+ * Destroys a stream created by opj_create_stream. This function does NOT close the abstract stream. 
+ * If needed the user must close its own implementation of the stream.
+ *
+ * @param	p_stream	the stream to destroy.
+ */
+OPJ_API void OPJ_CALLCONV opj_stream_destroy_v3(opj_stream_t* p_stream);
+ 
+/**
+ * Sets the given function to be used as a read function.
+ * @param		p_stream	the stream to modify
+ * @param		p_function	the function to use a read function.
+*/
+OPJ_API void OPJ_CALLCONV opj_stream_set_read_function(opj_stream_t* p_stream, opj_stream_read_fn p_function);
+
+/**
+ * Sets the given function to be used as a write function.
+ * @param		p_stream	the stream to modify
+ * @param		p_function	the function to use a write function.
+*/
+OPJ_API void OPJ_CALLCONV opj_stream_set_write_function(opj_stream_t* p_stream, opj_stream_write_fn p_function);
+
+/**
+ * Sets the given function to be used as a skip function.
+ * @param		p_stream	the stream to modify
+ * @param		p_function	the function to use a skip function.
+*/
+OPJ_API void OPJ_CALLCONV opj_stream_set_skip_function(opj_stream_t* p_stream, opj_stream_skip_fn p_function);
+
+/**
+ * Sets the given function to be used as a seek function, the stream is then seekable.
+ * @param		p_stream	the stream to modify
+ * @param		p_function	the function to use a skip function.
+*/
+OPJ_API void OPJ_CALLCONV opj_stream_set_seek_function(opj_stream_t* p_stream, opj_stream_seek_fn p_function);
+
+/**
+ * Sets the given data to be used as a user data for the stream.
+ * @param		p_stream	the stream to modify
+ * @param		p_data		the data to set.
+ * @warning depending on your source object p_stream this function may leak, use opj_stream_set_user_data_v3
+*/
+OPJ_DEPRECATED(OPJ_API void OPJ_CALLCONV opj_stream_set_user_data (opj_stream_t* p_stream, void * p_data));
+
+/**
+ * Sets the given data to be used as a user data for the stream.
+ * @param		p_stream	the stream to modify
+ * @param		p_data		the data to set.
+ * @param		p_function	the function to free p_data when opj_stream_destroy() is called.
+*/
+OPJ_API void OPJ_CALLCONV opj_stream_set_user_data_v3 (opj_stream_t* p_stream, void * p_data, opj_stream_free_user_data_fn p_function);
+
+/**
+ * Sets the length of the user data for the stream.
+ *
+ * @param p_stream    the stream to modify
+ * @param data_length length of the user_data.
+*/
+OPJ_API void OPJ_CALLCONV opj_stream_set_user_data_length(opj_stream_t* p_stream, OPJ_UINT64 data_length);
+
+/**
+ * Create a stream from a file identified with its filename with default parameters (helper function)
+ * @param fname             the filename of the file to stream
+ * @param p_is_read_stream  whether the stream is a read stream (true) or not (false)
+*/
+OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream_v3 (const char *fname, OPJ_BOOL p_is_read_stream);
+ 
+/** Create a stream from a file identified with its filename with a specific buffer size
+ * @param fname             the filename of the file to stream
+ * @param p_buffer_size     size of the chunk used to stream
+ * @param p_is_read_stream  whether the stream is a read stream (true) or not (false)
+*/
+OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream_v3 (const char *fname, 
+                                                                     OPJ_SIZE_T p_buffer_size,
+                                                                     OPJ_BOOL p_is_read_stream);
+ 
+/* 
+==========================================================
+   event manager functions definitions
+==========================================================
+*/
+/**
+ * Set the info handler use by openjpeg.
+ * @param p_codec       the codec previously initialise
+ * @param p_callback    the callback function which will be used
+ * @param p_user_data   client object where will be returned the message
+*/
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_info_handler(opj_codec_t * p_codec, 
+                                                   opj_msg_callback p_callback,
+                                                   void * p_user_data);
+/**
+ * Set the warning handler use by openjpeg.
+ * @param p_codec       the codec previously initialise
+ * @param p_callback    the callback function which will be used
+ * @param p_user_data   client object where will be returned the message
+*/
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_warning_handler(opj_codec_t * p_codec,
+                                                      opj_msg_callback p_callback,
+                                                      void * p_user_data);
+/**
+ * Set the error handler use by openjpeg.
+ * @param p_codec       the codec previously initialise
+ * @param p_callback    the callback function which will be used
+ * @param p_user_data   client object where will be returned the message
+*/
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec, 
+                                                    opj_msg_callback p_callback,
+                                                    void * p_user_data);
+
+/* 
+==========================================================
+   codec functions definitions
+==========================================================
+*/
+
+/**
+ * Creates a J2K/JP2 decompression structure
+ * @param format 		Decoder to select
+ *
+ * @return Returns a handle to a decompressor if successful, returns NULL otherwise
+ * */
+OPJ_API opj_codec_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format);
+
+/**
+ * Destroy a decompressor handle
+ *
+ * @param	p_codec			decompressor handle to destroy
+ */
+OPJ_API void OPJ_CALLCONV opj_destroy_codec(opj_codec_t * p_codec);
+
+/**
+ * Read after the codestream if necessary
+ * @param	p_codec			the JPEG2000 codec to read.
+ * @param	p_stream		the JPEG2000 stream.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_end_decompress (	opj_codec_t *p_codec,
+													opj_stream_t *p_stream);
+
+
+/**
+ * Set decoding parameters to default values
+ * @param parameters Decompression parameters
+ */
+OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters);
+
+/**
+ * Setup the decoder with decompression parameters provided by the user and with the message handler
+ * provided by the user.
+ *
+ * @param p_codec 		decompressor handler
+ * @param parameters 	decompression parameters
+ *
+ * @return true			if the decoder is correctly set
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,
+												opj_dparameters_t *parameters );
+
+/**
+ * Decodes an image header.
+ *
+ * @param	p_stream		the jpeg2000 stream.
+ * @param	p_codec			the jpeg2000 codec to read.
+ * @param	p_image			the image structure initialized with the characteristics of encoded image.
+ *
+ * @return true				if the main header of the codestream and the JP2 header is correctly read.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_read_header (	opj_stream_t *p_stream,
+												opj_codec_t *p_codec,
+												opj_image_t **p_image);
+
+/**
+ * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.
+ *
+ * @param	p_codec			the jpeg2000 codec.
+ * @param	p_image         the decoded image previously setted by opj_read_header
+ * @param	p_start_x		the left position of the rectangle to decode (in image coordinates).
+ * @param	p_end_x			the right position of the rectangle to decode (in image coordinates).
+ * @param	p_start_y		the up position of the rectangle to decode (in image coordinates).
+ * @param	p_end_y			the bottom position of the rectangle to decode (in image coordinates).
+ *
+ * @return	true			if the area could be set.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_decode_area(	opj_codec_t *p_codec,
+													opj_image_t* p_image,
+													OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+													OPJ_INT32 p_end_x, OPJ_INT32 p_end_y );
+
+/**
+ * Decode an image from a JPEG-2000 codestream
+ *
+ * @param p_decompressor 	decompressor handle
+ * @param p_stream			Input buffer stream
+ * @param p_image 			the decoded image
+ * @return 					true if success, otherwise false
+ * */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_decode(   opj_codec_t *p_decompressor,
+                                            opj_stream_t *p_stream,
+                                            opj_image_t *p_image);
+
+/**
+ * Get the decoded tile from the codec
+ *
+ * @param	p_codec			the jpeg2000 codec.
+ * @param	p_stream		input streamm
+ * @param	p_image			output image
+ * @param	tile_index		index of the tile which will be decode
+ *
+ * @return					true if success, otherwise false
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_get_decoded_tile(	opj_codec_t *p_codec,
+													opj_stream_t *p_stream,
+													opj_image_t *p_image,
+													OPJ_UINT32 tile_index);
+
+/**
+ * Set the resolution factor of the decoded image
+ * @param	p_codec			the jpeg2000 codec.
+ * @param	res_factor		resolution factor to set
+ *
+ * @return					true if success, otherwise false
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_decoded_resolution_factor(opj_codec_t *p_codec, OPJ_UINT32 res_factor);
+
+/**
+ * Writes a tile with the given data.
+ *
+ * @param	p_codec		        the jpeg2000 codec.
+ * @param	p_tile_index		the index of the tile to write. At the moment, the tiles must be written from 0 to n-1 in sequence.
+ * @param	p_data				pointer to the data to write. Data is arranged in sequence, data_comp0, then data_comp1, then ... NO INTERLEAVING should be set.
+ * @param	p_data_size			this value os used to make sure the data being written is correct. The size must be equal to the sum for each component of 
+ *                              tile_width * tile_height * component_size. component_size can be 1,2 or 4 bytes, depending on the precision of the given component.
+ * @param	p_stream			the stream to write data to.
+ *
+ * @return	true if the data could be written.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_write_tile (	opj_codec_t *p_codec,
+												OPJ_UINT32 p_tile_index,
+												OPJ_BYTE * p_data,
+												OPJ_UINT32 p_data_size,
+												opj_stream_t *p_stream );
+
+/**
+ * Reads a tile header. This function is compulsory and allows one to know the size of the tile thta will be decoded.
+ * The user may need to refer to the image got by opj_read_header to understand the size being taken by the tile.
+ *
+ * @param	p_codec			the jpeg2000 codec.
+ * @param	p_tile_index	pointer to a value that will hold the index of the tile being decoded, in case of success.
+ * @param	p_data_size		pointer to a value that will hold the maximum size of the decoded data, in case of success. In case
+ *							of truncated codestreams, the actual number of bytes decoded may be lower. The computation of the size is the same
+ *							as depicted in opj_write_tile.
+ * @param	p_tile_x0		pointer to a value that will hold the x0 pos of the tile (in the image).
+ * @param	p_tile_y0		pointer to a value that will hold the y0 pos of the tile (in the image).
+ * @param	p_tile_x1		pointer to a value that will hold the x1 pos of the tile (in the image).
+ * @param	p_tile_y1		pointer to a value that will hold the y1 pos of the tile (in the image).
+ * @param	p_nb_comps		pointer to a value that will hold the number of components in the tile.
+ * @param	p_should_go_on	pointer to a boolean that will hold the fact that the decoding should go on. In case the
+ *							codestream is over at the time of the call, the value will be set to false. The user should then stop
+ *							the decoding.
+ * @param	p_stream		the stream to decode.
+ * @return	true			if the tile header could be decoded. In case the decoding should end, the returned value is still true.
+ *							returning false may be the result of a shortage of memory or an internal error.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_read_tile_header(	opj_codec_t *p_codec,
+												opj_stream_t * p_stream,
+												OPJ_UINT32 * p_tile_index,
+												OPJ_UINT32 * p_data_size,
+												OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
+												OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
+												OPJ_UINT32 * p_nb_comps,
+												OPJ_BOOL * p_should_go_on );
+
+/**
+ * Reads a tile data. This function is compulsory and allows one to decode tile data. opj_read_tile_header should be called before.
+ * The user may need to refer to the image got by opj_read_header to understand the size being taken by the tile.
+ *
+ * @param	p_codec			the jpeg2000 codec.
+ * @param	p_tile_index	the index of the tile being decoded, this should be the value set by opj_read_tile_header.
+ * @param	p_data			pointer to a memory block that will hold the decoded data.
+ * @param	p_data_size		size of p_data. p_data_size should be bigger or equal to the value set by opj_read_tile_header.
+ * @param	p_stream		the stream to decode.
+ *
+ * @return	true			if the data could be decoded.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_decode_tile_data(	opj_codec_t *p_codec,
+													OPJ_UINT32 p_tile_index,
+													OPJ_BYTE * p_data,
+													OPJ_UINT32 p_data_size,
+													opj_stream_t *p_stream );
+
+/* COMPRESSION FUNCTIONS*/
+
+/**
+ * Creates a J2K/JP2 compression structure
+ * @param 	format 		Coder to select
+ * @return 				Returns a handle to a compressor if successful, returns NULL otherwise
+ */
+OPJ_API opj_codec_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format);
+
+/**
+Set encoding parameters to default values, that means : 
+<ul>
+<li>Lossless
+<li>1 tile
+<li>Size of precinct : 2^15 x 2^15 (means 1 precinct)
+<li>Size of code-block : 64 x 64
+<li>Number of resolutions: 6
+<li>No SOP marker in the codestream
+<li>No EPH marker in the codestream
+<li>No sub-sampling in x or y direction
+<li>No mode switch activated
+<li>Progression order: LRCP
+<li>No index file
+<li>No ROI upshifted
+<li>No offset of the origin of the image
+<li>No offset of the origin of the tiles
+<li>Reversible DWT 5-3
+</ul>
+@param parameters Compression parameters
+*/
+OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters);
+
+/**
+ * Setup the encoder parameters using the current image and using user parameters.
+ * @param p_codec 		Compressor handle
+ * @param parameters 	Compression parameters
+ * @param image 		Input filled image
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec, 
+												opj_cparameters_t *parameters, 
+												opj_image_t *image);
+
+/**
+ * Start to compress the current image.
+ * @param p_codec 		Compressor handle
+ * @param image 	    Input filled image
+ * @param p_stream 		Input stgream
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_start_compress (	opj_codec_t *p_codec,
+													opj_image_t * p_image,
+													opj_stream_t *p_stream);
+
+/**
+ * End to compress the current image.
+ * @param p_codec 		Compressor handle
+ * @param p_stream 		Input stgream
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_end_compress (opj_codec_t *p_codec,
+												opj_stream_t *p_stream);
+
+/**
+ * Encode an image into a JPEG-2000 codestream
+ * @param p_codec 		compressor handle
+ * @param p_stream 		Output buffer stream
+ *
+ * @return 				Returns true if successful, returns false otherwise
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_encode(opj_codec_t *p_codec,
+                                         opj_stream_t *p_stream);
+/*
+==========================================================
+   codec output functions definitions
+==========================================================
+*/
+/* EXPERIMENTAL FUNCTIONS FOR NOW, USED ONLY IN J2K_DUMP*/
+
+/**
+Destroy Codestream information after compression or decompression
+@param cstr_info Codestream information structure
+*/
+OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_v2_t **cstr_info);
+
+
+/**
+ * Dump the codec information into the output stream
+ *
+ * @param	p_codec			the jpeg2000 codec.
+ * @param	info_flag		type of information dump.
+ * @param	output_stream	output stream where dump the informations get from the codec.
+ *
+ */
+OPJ_API void OPJ_CALLCONV opj_dump_codec(	opj_codec_t *p_codec,
+											OPJ_INT32 info_flag,
+											FILE* output_stream);
+
+/**
+ * Get the codestream information from the codec
+ *
+ * @param	p_codec			the jpeg2000 codec.
+ *
+ * @return					a pointer to a codestream information structure.
+ *
+ */
+OPJ_API opj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(opj_codec_t *p_codec);
+
+/**
+ * Get the codestream index from the codec
+ *
+ * @param	p_codec			the jpeg2000 codec.
+ *
+ * @return					a pointer to a codestream index structure.
+ *
+ */
+OPJ_API opj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(opj_codec_t *p_codec);
+
+OPJ_API void OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t **p_cstr_index);
+
+
+/**
+ * Get the JP2 file information from the codec FIXME
+ *
+ * @param	p_codec			the jpeg2000 codec.
+ *
+ * @return					a pointer to a JP2 metadata structure.
+ *
+ */
+OPJ_API opj_jp2_metadata_t* OPJ_CALLCONV opj_get_jp2_metadata(opj_codec_t *p_codec);
+
+/**
+ * Get the JP2 file index from the codec FIXME
+ *
+ * @param	p_codec			the jpeg2000 codec.
+ *
+ * @return					a pointer to a JP2 index structure.
+ *
+ */
+OPJ_API opj_jp2_index_t* OPJ_CALLCONV opj_get_jp2_index(opj_codec_t *p_codec);
+
+
+/*
+==========================================================
+   MCT functions
+==========================================================
+*/
+
+/**
+ * Sets the MCT matrix to use.
+ *
+ * @param	parameters		the parameters to change.
+ * @param	pEncodingMatrix	the encoding matrix.
+ * @param	p_dc_shift		the dc shift coefficients to use.
+ * @param	pNbComp			the number of components of the image.
+ *
+ * @return	true if the parameters could be set.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_MCT( opj_cparameters_t *parameters,
+		                               	   OPJ_FLOAT32 * pEncodingMatrix,
+		                               	   OPJ_INT32 * p_dc_shift,
+		                               	   OPJ_UINT32 pNbComp);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OPENJPEG_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.c
new file mode 100644
index 0000000..0df99ef
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.c
@@ -0,0 +1,64 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/times.h>
+#endif /* _WIN32 */
+#include "opj_includes.h"
+
+OPJ_FLOAT64 opj_clock(void) {
+#ifdef _WIN32
+	/* _WIN32: use QueryPerformance (very accurate) */
+    LARGE_INTEGER freq , t ;
+    /* freq is the clock speed of the CPU */
+    QueryPerformanceFrequency(&freq) ;
+	/* cout << "freq = " << ((double) freq.QuadPart) << endl; */
+    /* t is the high resolution performance counter (see MSDN) */
+    QueryPerformanceCounter ( & t ) ;
+    return ( t.QuadPart /(OPJ_FLOAT64) freq.QuadPart ) ;
+#else
+	/* Unix or Linux: use resource usage */
+    struct rusage t;
+    OPJ_FLOAT64 procTime;
+    /* (1) Get the rusage data structure at this moment (man getrusage) */
+    getrusage(0,&t);
+    /* (2) What is the elapsed time ? - CPU time = User time + System time */
+	/* (2a) Get the seconds */
+    procTime = (OPJ_FLOAT64)(t.ru_utime.tv_sec + t.ru_stime.tv_sec);
+    /* (2b) More precisely! Get the microseconds part ! */
+    return ( procTime + (OPJ_FLOAT64)(t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ;
+#endif
+}
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.h
new file mode 100644
index 0000000..6f5168b
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.h
@@ -0,0 +1,59 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __OPJ_CLOCK_H
+#define __OPJ_CLOCK_H
+/**
+@file opj_clock.h
+@brief Internal function for timing
+
+The functions in OPJ_CLOCK.C are internal utilities mainly used for timing.
+*/
+
+/** @defgroup MISC MISC - Miscellaneous internal functions */
+/*@{*/
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Difference in successive opj_clock() calls tells you the elapsed time
+@return Returns time in seconds
+*/
+OPJ_FLOAT64 opj_clock(void);
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __OPJ_CLOCK_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_codec.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_codec.h
new file mode 100644
index 0000000..4fdfa7d
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_codec.h
@@ -0,0 +1,165 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __OPJ_CODEC_H
+#define __OPJ_CODEC_H
+/**
+@file opj_codec.h
+*/
+
+
+/**
+ * Main codec handler used for compression or decompression.
+ */
+typedef struct opj_codec_private
+{
+    /** FIXME DOC */
+    union
+    {
+        /**
+         * Decompression handler.
+         */
+        struct opj_decompression
+        {
+            /** Main header reading function handler */
+            OPJ_BOOL (*opj_read_header) ( struct opj_stream_private * cio,
+                                          void * p_codec,
+                                          opj_image_t **p_image,
+                                          struct opj_event_mgr * p_manager);
+
+            /** Decoding function */
+            OPJ_BOOL (*opj_decode) ( void * p_codec,
+                                     struct opj_stream_private * p_cio,
+                                     opj_image_t * p_image,
+                                     struct opj_event_mgr * p_manager);
+
+            /** FIXME DOC */
+            OPJ_BOOL (*opj_read_tile_header)( void * p_codec,
+                                              OPJ_UINT32 * p_tile_index,
+                                              OPJ_UINT32 * p_data_size,
+                                              OPJ_INT32 * p_tile_x0,
+                                              OPJ_INT32 * p_tile_y0,
+                                              OPJ_INT32 * p_tile_x1,
+                                              OPJ_INT32 * p_tile_y1,
+                                              OPJ_UINT32 * p_nb_comps,
+                                              OPJ_BOOL * p_should_go_on,
+                                              struct opj_stream_private * p_cio,
+                                              struct opj_event_mgr * p_manager);
+
+            /** FIXME DOC */
+            OPJ_BOOL (*opj_decode_tile_data)( void * p_codec,
+                                              OPJ_UINT32 p_tile_index,
+                                              OPJ_BYTE * p_data,
+                                              OPJ_UINT32 p_data_size,
+                                              struct opj_stream_private * p_cio,
+                                              struct opj_event_mgr * p_manager);
+
+            /** Reading function used after codestream if necessary */
+            OPJ_BOOL (* opj_end_decompress) ( void *p_codec,
+                                              struct opj_stream_private * cio,
+                                              struct opj_event_mgr * p_manager);
+
+            /** Codec destroy function handler */
+            void (*opj_destroy) (void * p_codec);
+
+            /** Setup decoder function handler */
+            void (*opj_setup_decoder) ( void * p_codec, opj_dparameters_t * p_param);
+
+            /** Set decode area function handler */
+            OPJ_BOOL (*opj_set_decode_area) ( void * p_codec,
+                                              opj_image_t * p_image,
+                                              OPJ_INT32 p_start_x,
+                                              OPJ_INT32 p_end_x,
+                                              OPJ_INT32 p_start_y,
+                                              OPJ_INT32 p_end_y,
+                                              struct opj_event_mgr * p_manager);
+
+            /** Get tile function */
+            OPJ_BOOL (*opj_get_decoded_tile) ( void *p_codec,
+                                               opj_stream_private_t * p_cio,
+                                               opj_image_t *p_image,
+                                               struct opj_event_mgr * p_manager,
+                                               OPJ_UINT32 tile_index);
+
+            /** Set the decoded resolution factor */
+            OPJ_BOOL (*opj_set_decoded_resolution_factor) ( void * p_codec,
+                                                            OPJ_UINT32 res_factor,
+                                                            opj_event_mgr_t * p_manager);
+        } m_decompression;
+
+        /**
+         * Compression handler. FIXME DOC
+         */
+        struct opj_compression
+        {
+            OPJ_BOOL (* opj_start_compress) ( void *p_codec,
+                                              struct opj_stream_private * cio,
+                                              struct opj_image * p_image,
+                                              struct opj_event_mgr * p_manager);
+
+            OPJ_BOOL (* opj_encode) ( void * p_codec,
+                                      struct opj_stream_private *p_cio,
+                                      struct opj_event_mgr * p_manager);
+
+            OPJ_BOOL (* opj_write_tile) ( void * p_codec,
+                                          OPJ_UINT32 p_tile_index,
+                                          OPJ_BYTE * p_data,
+                                          OPJ_UINT32 p_data_size,
+                                          struct opj_stream_private * p_cio,
+                                          struct opj_event_mgr * p_manager);
+
+            OPJ_BOOL (* opj_end_compress) (	void * p_codec,
+                                            struct opj_stream_private * p_cio,
+                                            struct opj_event_mgr * p_manager);
+
+            void (* opj_destroy) (void * p_codec);
+
+            void (* opj_setup_encoder) ( void * p_codec,
+                                         opj_cparameters_t * p_param,
+                                         struct opj_image * p_image,
+                                         struct opj_event_mgr * p_manager);
+        } m_compression;
+    } m_codec_data;
+    /** FIXME DOC*/
+    void * m_codec;
+    /** Event handler */
+    opj_event_mgr_t m_event_mgr;
+    /** Flag to indicate if the codec is used to decode or encode*/
+    OPJ_BOOL is_decompressor;
+    void (*opj_dump_codec) (void * p_codec, OPJ_INT32 info_flag, FILE* output_stream);
+    opj_codestream_info_v2_t* (*opj_get_codec_info)(void* p_codec);
+    opj_codestream_index_t* (*opj_get_codec_index)(void* p_codec);
+}
+opj_codec_private_t;
+
+
+#endif /* __OPJ_CODEC_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h
new file mode 100644
index 0000000..2f91e85
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h
@@ -0,0 +1,2 @@
+/* create opj_config.h for CMake */
+#define OPJ_HAVE_STDINT_H 		1
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h.cmake.in b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h.cmake.in
new file mode 100644
index 0000000..2f5311b
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h.cmake.in
@@ -0,0 +1,2 @@
+/* create opj_config.h for CMake */
+#cmakedefine OPJ_HAVE_STDINT_H 		@OPJ_HAVE_STDINT_H@
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config_private.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config_private.h
new file mode 100644
index 0000000..37077fc
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config_private.h
@@ -0,0 +1,43 @@
+/* create opj_config_private.h for CMake */
+/* #undef OPJ_HAVE_INTTYPES_H */
+
+#ifndef _WIN32
+#ifndef OPJ_HAVE_INTTYPES_H
+#define OPJ_HAVE_INTTYPES_H
+#endif
+#endif
+
+#define OPJ_PACKAGE_VERSION "2.1.0"
+
+/* Not used by openjp2*/
+/*#define HAVE_MEMORY_H 1*/
+/*#define HAVE_STDLIB_H 1*/
+/* #undef HAVE_STRINGS_H */
+/*#define HAVE_STRING_H 1*/
+/*#define HAVE_SYS_STAT_H 1*/
+/*#define HAVE_SYS_TYPES_H 1 */
+/* #undef HAVE_UNISTD_H */
+
+/* #undef _LARGEFILE_SOURCE */
+/* #undef _LARGE_FILES */
+/* #undef _FILE_OFFSET_BITS */
+/* #undef OPJ_HAVE_FSEEKO */
+
+#ifndef _WIN32
+#ifndef OPJ_HAVE_FSEEKO
+#define OPJ_HAVE_FSEEKO
+#endif
+#endif
+
+/* Byte order.  */
+/* All compilers that support Mac OS X define either __BIG_ENDIAN__ or
+__LITTLE_ENDIAN__ to match the endianness of the architecture being
+compiled for. This is not necessarily the same as the architecture of the
+machine doing the building. In order to support Universal Binaries on
+Mac OS X, we prefer those defines to decide the endianness.
+On other platforms we use the result of the TRY_RUN. */
+#if !defined(__APPLE__)
+/* #undef OPJ_BIG_ENDIAN */
+#elif defined(__BIG_ENDIAN__)
+# define OPJ_BIG_ENDIAN
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_includes.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_includes.h
new file mode 100644
index 0000000..d9238b1
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_includes.h
@@ -0,0 +1,180 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef OPJ_INCLUDES_H
+#define OPJ_INCLUDES_H
+
+/*
+ * This must be included before any system headers,
+ * since they can react to macro defined there
+ */
+#include "opj_config_private.h"
+
+/*
+ ==========================================================
+   Standard includes used by the library
+ ==========================================================
+*/
+#include <memory.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <float.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <assert.h>
+
+/*
+  Use fseeko() and ftello() if they are available since they use
+  'off_t' rather than 'long'.  It is wrong to use fseeko() and
+  ftello() only on systems with special LFS support since some systems
+  (e.g. FreeBSD) support a 64-bit off_t by default.
+*/
+#if defined(OPJ_HAVE_FSEEKO) && !defined(fseek)
+#  define fseek  fseeko
+#  define ftell  ftello
+#endif
+
+
+#if defined(WIN32) && !defined(Windows95) && !defined(__BORLANDC__) && \
+  !(defined(_MSC_VER) && _MSC_VER < 1400) && \
+  !(defined(__MINGW32__) && __MSVCRT_VERSION__ < 0x800)
+  /*
+    Windows '95 and Borland C do not support _lseeki64
+    Visual Studio does not support _fseeki64 and _ftelli64 until the 2005 release.
+    Without these interfaces, files over 2GB in size are not supported for Windows.
+  */
+#  define OPJ_FSEEK(stream,offset,whence) _fseeki64(stream,/* __int64 */ offset,whence)
+#  define OPJ_FSTAT(fildes,stat_buff) _fstati64(fildes,/* struct _stati64 */ stat_buff)
+#  define OPJ_FTELL(stream) /* __int64 */ _ftelli64(stream)
+#  define OPJ_STAT_STRUCT_T struct _stati64
+#  define OPJ_STAT(path,stat_buff) _stati64(path,/* struct _stati64 */ stat_buff)
+#else
+#  define OPJ_FSEEK(stream,offset,whence) fseek(stream,offset,whence)
+#  define OPJ_FSTAT(fildes,stat_buff) fstat(fildes,stat_buff)
+#  define OPJ_FTELL(stream) ftell(stream)
+#  define OPJ_STAT_STRUCT_T struct stat
+#  define OPJ_STAT(path,stat_buff) stat(path,stat_buff)
+#endif
+
+
+/*
+ ==========================================================
+   OpenJPEG interface
+ ==========================================================
+ */
+#include "openjpeg.h"
+
+/*
+ ==========================================================
+   OpenJPEG modules
+ ==========================================================
+*/
+
+/* Ignore GCC attributes if this is not GCC */
+#ifndef __GNUC__
+	#define __attribute__(x) /* __attribute__(x) */
+#endif
+
+
+/* Are restricted pointers available? (C99) */
+#if (__STDC_VERSION__ != 199901L)
+	/* Not a C99 compiler */
+	#ifdef __GNUC__
+		#define restrict __restrict__
+	#else
+		#define restrict /* restrict */
+	#endif
+#endif
+
+/* MSVC before 2013 and Borland C do not have lrintf */
+#if defined(_MSC_VER) && (_MSC_VER < 1800) || defined(__BORLANDC__)
+static INLINE long lrintf(float f){
+#ifdef _M_X64
+    return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f));
+#else
+    int i;
+ 
+    _asm{
+        fld f
+        fistp i
+    };
+ 
+    return i;
+#endif
+}
+#endif
+
+#include "opj_inttypes.h"
+#include "opj_clock.h"
+#include "opj_malloc.h"
+#include "function_list.h"
+#include "event.h"
+#include "bio.h"
+#include "cio.h"
+
+#include "image.h"
+#include "invert.h"
+#include "j2k.h"
+#include "jp2.h"
+
+#include "mqc.h"
+#include "raw.h"
+#include "bio.h"
+
+#include "pi.h"
+#include "tgt.h"
+#include "tcd.h"
+#include "t1.h"
+#include "dwt.h"
+#include "t2.h"
+#include "mct.h"
+#include "opj_intmath.h"
+
+#ifdef USE_JPIP
+#include "cidx_manager.h"
+#include "indexbox_manager.h"
+#endif
+
+/* JPWL>> */
+#ifdef USE_JPWL
+#include "openjpwl/jpwl.h"
+#endif /* USE_JPWL */
+/* <<JPWL */
+
+/* V2 */
+#include "opj_codec.h"
+
+
+#endif /* OPJ_INCLUDES_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_intmath.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_intmath.h
new file mode 100644
index 0000000..dc89895
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_intmath.h
@@ -0,0 +1,178 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __INT_H
+#define __INT_H
+/**
+@file opj_intmath.h
+@brief Implementation of operations on integers (INT)
+
+The functions in OPJ_INTMATH.H have for goal to realize operations on integers.
+*/
+
+/** @defgroup OPJ_INTMATH OPJ_INTMATH - Implementation of operations on integers */
+/*@{*/
+
+/** @name Exported functions (see also openjpeg.h) */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Get the minimum of two integers
+@return Returns a if a < b else b
+*/
+static INLINE OPJ_INT32 opj_int_min(OPJ_INT32 a, OPJ_INT32 b) {
+	return a < b ? a : b;
+}
+
+/**
+Get the minimum of two integers
+@return Returns a if a < b else b
+*/
+static INLINE OPJ_UINT32 opj_uint_min(OPJ_UINT32 a, OPJ_UINT32 b) {
+	return a < b ? a : b;
+}
+
+/**
+Get the maximum of two integers
+@return Returns a if a > b else b
+*/
+static INLINE OPJ_INT32 opj_int_max(OPJ_INT32 a, OPJ_INT32 b) {
+	return (a > b) ? a : b;
+}
+
+/**
+Get the maximum of two integers
+@return Returns a if a > b else b
+*/
+static INLINE OPJ_UINT32 opj_uint_max(OPJ_UINT32  a, OPJ_UINT32  b) {
+	return (a > b) ? a : b;
+}
+
+/**
+Clamp an integer inside an interval
+@return
+<ul>
+<li>Returns a if (min < a < max)
+<li>Returns max if (a > max)
+<li>Returns min if (a < min) 
+</ul>
+*/
+static INLINE OPJ_INT32 opj_int_clamp(OPJ_INT32 a, OPJ_INT32 min, OPJ_INT32 max) {
+	if (a < min)
+		return min;
+	if (a > max)
+		return max;
+	return a;
+}
+/**
+@return Get absolute value of integer
+*/
+static INLINE OPJ_INT32 opj_int_abs(OPJ_INT32 a) {
+	return a < 0 ? -a : a;
+}
+/**
+Divide an integer and round upwards
+@return Returns a divided by b
+*/
+static INLINE OPJ_INT32 opj_int_ceildiv(OPJ_INT32 a, OPJ_INT32 b) {
+  assert(b);
+	return (a + b - 1) / b;
+}
+
+/**
+Divide an integer and round upwards
+@return Returns a divided by b
+*/
+static INLINE OPJ_UINT32  opj_uint_ceildiv(OPJ_UINT32  a, OPJ_UINT32  b) {
+	return (a + b - 1) / b;
+}
+
+/**
+Divide an integer by a power of 2 and round upwards
+@return Returns a divided by 2^b
+*/
+static INLINE OPJ_INT32 opj_int_ceildivpow2(OPJ_INT32 a, OPJ_INT32 b) {
+	return (OPJ_INT32)((a + (OPJ_INT64)(1 << b) - 1) >> b);
+}
+/**
+Divide an integer by a power of 2 and round downwards
+@return Returns a divided by 2^b
+*/
+static INLINE OPJ_INT32 opj_int_floordivpow2(OPJ_INT32 a, OPJ_INT32 b) {
+	return a >> b;
+}
+/**
+Get logarithm of an integer and round downwards
+@return Returns log2(a)
+*/
+static INLINE OPJ_INT32 opj_int_floorlog2(OPJ_INT32 a) {
+	OPJ_INT32 l;
+	for (l = 0; a > 1; l++) {
+		a >>= 1;
+	}
+	return l;
+}
+/**
+Get logarithm of an integer and round downwards
+@return Returns log2(a)
+*/
+static INLINE OPJ_UINT32  opj_uint_floorlog2(OPJ_UINT32  a) {
+	OPJ_UINT32  l;
+	for (l = 0; a > 1; ++l)
+	{
+		a >>= 1;
+	}
+	return l;
+}
+
+/**
+Multiply two fixed-precision rational numbers.
+@param a
+@param b
+@return Returns a * b
+*/
+static INLINE OPJ_INT32 opj_int_fix_mul(OPJ_INT32 a, OPJ_INT32 b) {
+    OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
+    temp += temp & 4096;
+    return (OPJ_INT32) (temp >> 13) ;
+}
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_inttypes.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_inttypes.h
new file mode 100644
index 0000000..e74aed6
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_inttypes.h
@@ -0,0 +1,48 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2012, Mathieu Malaterre <mathieu.malaterre@gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef OPJ_INTTYPES_H
+#define OPJ_INTTYPES_H
+
+#include "opj_config_private.h"
+#ifdef OPJ_HAVE_INTTYPES_H
+#include <inttypes.h>
+#else
+#if defined(_WIN32)
+#define PRId64 "I64d"
+#define PRIi64 "I64i"
+#define PRIu64 "I64u"
+#define PRIx64 "I64x"
+#else
+#error unsupported platform
+#endif
+#endif
+
+#endif /* OPJ_INTTYPES_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_malloc.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_malloc.h
new file mode 100644
index 0000000..ed1dfaf
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_malloc.h
@@ -0,0 +1,194 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __OPJ_MALLOC_H
+#define __OPJ_MALLOC_H
+/**
+@file opj_malloc.h
+@brief Internal functions
+
+The functions in opj_malloc.h are internal utilities used for memory management.
+*/
+
+/** @defgroup MISC MISC - Miscellaneous internal functions */
+/*@{*/
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Allocate an uninitialized memory block
+@param size Bytes to allocate
+@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
+*/
+#define _FOXIT_MEM_MANAGER_
+#ifdef _FOXIT_MEM_MANAGER_
+void* opj_malloc(size_t size);
+void* opj_calloc(size_t _NumOfElements, size_t _SizeOfElements);
+void* opj_realloc(void * m, size_t s);
+void opj_free(void * m);
+
+#define opj_aligned_malloc(size) opj_malloc(size)
+#define opj_aligned_free(m) opj_free(m)
+#else
+#ifdef ALLOC_PERF_OPT
+void * OPJ_CALLCONV opj_malloc(size_t size);
+#else
+/* prevent assertion on overflow for MSVC */
+#ifdef _MSC_VER
+#define opj_malloc(size) ((size_t)(size) >= (size_t)-0x100 ? NULL : malloc(size))
+#else
+#define opj_malloc(size) malloc(size)
+#endif
+#endif
+
+/**
+Allocate a memory block with elements initialized to 0
+@param num Blocks to allocate
+@param size Bytes per block to allocate
+@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
+*/
+#ifdef ALLOC_PERF_OPT
+void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements);
+#else
+/* prevent assertion on overflow for MSVC */
+#ifdef _MSC_VER
+#define opj_calloc(num, size) ((size_t)(num) != 0 && (size_t)(num) >= (size_t)-0x100 / (size_t)(size) ? NULL : calloc(num, size))
+#else
+#define opj_calloc(num, size) calloc(num, size)
+#endif
+#endif
+
+/**
+Allocate memory aligned to a 16 byte boundry
+@param size Bytes to allocate
+@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
+*/
+/* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */
+#ifdef _WIN32
+	/* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */
+	#ifdef __GNUC__
+		#include <mm_malloc.h>
+		#define HAVE_MM_MALLOC
+	#else /* MSVC, Intel C++ */
+		#include <malloc.h>
+		#ifdef _mm_malloc
+			#define HAVE_MM_MALLOC
+		#endif
+	#endif
+#else /* Not _WIN32 */
+	#if defined(__sun)
+		#define HAVE_MEMALIGN
+  #elif defined(__FreeBSD__)
+    #define HAVE_POSIX_MEMALIGN
+	/* Linux x86_64 and OSX always align allocations to 16 bytes */
+	#elif !defined(__amd64__) && !defined(__APPLE__) && !defined(_AIX)
+		#define HAVE_MEMALIGN
+		#include <malloc.h>			
+	#endif
+#endif
+
+#define opj_aligned_malloc(size) malloc(size)
+#define opj_aligned_free(m) free(m)
+
+#ifdef HAVE_MM_MALLOC
+	#undef opj_aligned_malloc
+	#define opj_aligned_malloc(size) _mm_malloc(size, 16)
+	#undef opj_aligned_free
+	#define opj_aligned_free(m) _mm_free(m)
+#endif
+
+#ifdef HAVE_MEMALIGN
+	extern void* memalign(size_t, size_t);
+	#undef opj_aligned_malloc
+	#define opj_aligned_malloc(size) memalign(16, (size))
+	#undef opj_aligned_free
+	#define opj_aligned_free(m) free(m)
+#endif
+
+#ifdef HAVE_POSIX_MEMALIGN
+	#undef opj_aligned_malloc
+	extern int posix_memalign(void**, size_t, size_t);
+
+	static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){
+		void* mem = NULL;
+		posix_memalign(&mem, 16, size);
+		return mem;
+	}
+	#undef opj_aligned_free
+	#define opj_aligned_free(m) free(m)
+#endif
+
+#ifdef ALLOC_PERF_OPT
+	#undef opj_aligned_malloc
+	#define opj_aligned_malloc(size) opj_malloc(size)
+	#undef opj_aligned_free
+	#define opj_aligned_free(m) opj_free(m)
+#endif
+
+/**
+Reallocate memory blocks.
+@param m Pointer to previously allocated memory block
+@param s New size in bytes
+@return Returns a void pointer to the reallocated (and possibly moved) memory block
+*/
+#ifdef ALLOC_PERF_OPT
+void * OPJ_CALLCONV opj_realloc(void * m, size_t s);
+#else
+/* prevent assertion on overflow for MSVC */
+#ifdef _MSC_VER
+#define opj_realloc(m, s) ((size_t)(s) >= (size_t)-0x100 ? NULL : realloc(m, s))
+#else
+#define opj_realloc(m, s) realloc(m, s)
+#endif
+#endif
+
+/**
+Deallocates or frees a memory block.
+@param m Previously allocated memory block to be freed
+*/
+#ifdef ALLOC_PERF_OPT
+void OPJ_CALLCONV opj_free(void * m);
+#else
+#define opj_free(m) free(m)
+#endif
+
+#ifdef __GNUC__
+#pragma GCC poison malloc calloc realloc free
+#endif
+#endif
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __OPJ_MALLOC_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_stdint.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_stdint.h
new file mode 100644
index 0000000..b8556a1
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_stdint.h
@@ -0,0 +1,52 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2012, Mathieu Malaterre <mathieu.malaterre@gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef OPJ_STDINT_H
+#define OPJ_STDINT_H
+
+#include "opj_config.h"
+#ifdef OPJ_HAVE_STDINT_H
+#include <stdint.h>
+#else
+#if defined(_WIN32)
+typedef   signed __int8   int8_t;
+typedef unsigned __int8   uint8_t;
+typedef   signed __int16  int16_t;
+typedef unsigned __int16  uint16_t;
+typedef   signed __int32  int32_t;
+typedef unsigned __int32  uint32_t;
+typedef   signed __int64  int64_t;
+typedef unsigned __int64  uint64_t;
+#else
+#error unsupported platform
+#endif
+#endif
+
+#endif /* OPJ_STDINT_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.c
new file mode 100644
index 0000000..02bbefe
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.c
@@ -0,0 +1,1876 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/** @defgroup PI PI - Implementation of a packet iterator */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Get next packet in layer-resolution-component-precinct order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true
+*/
+static OPJ_BOOL opj_pi_next_lrcp(opj_pi_iterator_t * pi);
+/**
+Get next packet in resolution-layer-component-precinct order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true
+*/
+static OPJ_BOOL opj_pi_next_rlcp(opj_pi_iterator_t * pi);
+/**
+Get next packet in resolution-precinct-component-layer order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true
+*/
+static OPJ_BOOL opj_pi_next_rpcl(opj_pi_iterator_t * pi);
+/**
+Get next packet in precinct-component-resolution-layer order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true
+*/
+static OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi);
+/**
+Get next packet in component-precinct-resolution-layer order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true
+*/
+static OPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi);
+
+/**
+ * Updates the coding parameters if the encoding is used with Progression order changes and final (or cinema parameters are used).
+ *
+ * @param	p_cp		the coding parameters to modify
+ * @param	p_tileno	the tile index being concerned.
+ * @param	p_tx0		X0 parameter for the tile
+ * @param	p_tx1		X1 parameter for the tile
+ * @param	p_ty0		Y0 parameter for the tile
+ * @param	p_ty1		Y1 parameter for the tile
+ * @param	p_max_prec	the maximum precision for all the bands of the tile
+ * @param	p_max_res	the maximum number of resolutions for all the poc inside the tile.
+ * @param	p_dx_min		the minimum dx of all the components of all the resolutions for the tile.
+ * @param	p_dy_min		the minimum dy of all the components of all the resolutions for the tile.
+ */
+static void opj_pi_update_encode_poc_and_final ( opj_cp_t *p_cp,
+                                                 OPJ_UINT32 p_tileno,
+                                                 OPJ_INT32 p_tx0,
+                                                 OPJ_INT32 p_tx1,
+                                                 OPJ_INT32 p_ty0,
+                                                 OPJ_INT32 p_ty1,
+                                                 OPJ_UINT32 p_max_prec,
+                                                 OPJ_UINT32 p_max_res,
+                                                 OPJ_UINT32 p_dx_min,
+                                                 OPJ_UINT32 p_dy_min);
+
+/**
+ * Updates the coding parameters if the encoding is not used with Progression order changes and final (and cinema parameters are used).
+ *
+ * @param	p_cp		the coding parameters to modify
+ * @param	p_num_comps		the number of components
+ * @param	p_tileno	the tile index being concerned.
+ * @param	p_tx0		X0 parameter for the tile
+ * @param	p_tx1		X1 parameter for the tile
+ * @param	p_ty0		Y0 parameter for the tile
+ * @param	p_ty1		Y1 parameter for the tile
+ * @param	p_max_prec	the maximum precision for all the bands of the tile
+ * @param	p_max_res	the maximum number of resolutions for all the poc inside the tile.
+ * @param	p_dx_min		the minimum dx of all the components of all the resolutions for the tile.
+ * @param	p_dy_min		the minimum dy of all the components of all the resolutions for the tile.
+ */
+static void opj_pi_update_encode_not_poc (  opj_cp_t *p_cp,
+                                            OPJ_UINT32 p_num_comps,
+                                            OPJ_UINT32 p_tileno,
+                                            OPJ_INT32 p_tx0,
+                                            OPJ_INT32 p_tx1,
+                                            OPJ_INT32 p_ty0,
+                                            OPJ_INT32 p_ty1,
+                                            OPJ_UINT32 p_max_prec,
+                                            OPJ_UINT32 p_max_res,
+                                            OPJ_UINT32 p_dx_min,
+                                            OPJ_UINT32 p_dy_min);
+/**
+ * Gets the encoding parameters needed to update the coding parameters and all the pocs.
+ * 
+ * @param	p_image			the image being encoded.
+ * @param	p_cp			the coding parameters.
+ * @param	tileno			the tile index of the tile being encoded.
+ * @param	p_tx0			pointer that will hold the X0 parameter for the tile
+ * @param	p_tx1			pointer that will hold the X1 parameter for the tile
+ * @param	p_ty0			pointer that will hold the Y0 parameter for the tile
+ * @param	p_ty1			pointer that will hold the Y1 parameter for the tile
+ * @param	p_max_prec		pointer that will hold the the maximum precision for all the bands of the tile
+ * @param	p_max_res		pointer that will hold the the maximum number of resolutions for all the poc inside the tile.
+ * @param	p_dx_min			pointer that will hold the the minimum dx of all the components of all the resolutions for the tile.
+ * @param	p_dy_min			pointer that will hold the the minimum dy of all the components of all the resolutions for the tile.
+ */
+static void opj_get_encoding_parameters(const opj_image_t *p_image,
+                                        const opj_cp_t *p_cp,
+                                        OPJ_UINT32  tileno,
+                                        OPJ_INT32  * p_tx0,
+                                        OPJ_INT32 * p_tx1,
+                                        OPJ_INT32 * p_ty0,
+                                        OPJ_INT32 * p_ty1,
+                                        OPJ_UINT32 * p_dx_min,
+                                        OPJ_UINT32 * p_dy_min,
+                                        OPJ_UINT32 * p_max_prec,
+                                        OPJ_UINT32 * p_max_res );
+
+/**
+ * Gets the encoding parameters needed to update the coding parameters and all the pocs.
+ * The precinct widths, heights, dx and dy for each component at each resolution will be stored as well.
+ * the last parameter of the function should be an array of pointers of size nb components, each pointer leading
+ * to an area of size 4 * max_res. The data is stored inside this area with the following pattern :
+ * dx_compi_res0 , dy_compi_res0 , w_compi_res0, h_compi_res0 , dx_compi_res1 , dy_compi_res1 , w_compi_res1, h_compi_res1 , ...
+ *
+ * @param	p_image			the image being encoded.
+ * @param	p_cp			the coding parameters.
+ * @param	tileno			the tile index of the tile being encoded.
+ * @param	p_tx0			pointer that will hold the X0 parameter for the tile
+ * @param	p_tx1			pointer that will hold the X1 parameter for the tile
+ * @param	p_ty0			pointer that will hold the Y0 parameter for the tile
+ * @param	p_ty1			pointer that will hold the Y1 parameter for the tile
+ * @param	p_max_prec		pointer that will hold the the maximum precision for all the bands of the tile
+ * @param	p_max_res		pointer that will hold the the maximum number of resolutions for all the poc inside the tile.
+ * @param	p_dx_min		pointer that will hold the the minimum dx of all the components of all the resolutions for the tile.
+ * @param	p_dy_min		pointer that will hold the the minimum dy of all the components of all the resolutions for the tile.
+ * @param	p_resolutions	pointer to an area corresponding to the one described above.
+ */
+static void opj_get_all_encoding_parameters(const opj_image_t *p_image,
+                                            const opj_cp_t *p_cp,
+                                            OPJ_UINT32 tileno,
+                                            OPJ_INT32 * p_tx0,
+                                            OPJ_INT32 * p_tx1,
+                                            OPJ_INT32 * p_ty0,
+                                            OPJ_INT32 * p_ty1,
+                                            OPJ_UINT32 * p_dx_min,
+                                            OPJ_UINT32 * p_dy_min,
+                                            OPJ_UINT32 * p_max_prec,
+                                            OPJ_UINT32 * p_max_res,
+                                            OPJ_UINT32 ** p_resolutions );
+/**
+ * Allocates memory for a packet iterator. Data and data sizes are set by this operation.
+ * No other data is set. The include section of the packet  iterator is not allocated.
+ * 
+ * @param	p_image		the image used to initialize the packet iterator (in fact only the number of components is relevant.
+ * @param	p_cp		the coding parameters.
+ * @param	tileno	the index of the tile from which creating the packet iterator.
+ */
+static opj_pi_iterator_t * opj_pi_create(	const opj_image_t *p_image,
+                                            const opj_cp_t *p_cp,
+                                            OPJ_UINT32 tileno );
+/**
+ * FIXME DOC
+ */
+static void opj_pi_update_decode_not_poc (opj_pi_iterator_t * p_pi,
+                                          opj_tcp_t * p_tcp,
+                                          OPJ_UINT32 p_max_precision,
+                                          OPJ_UINT32 p_max_res);
+/**
+ * FIXME DOC
+ */
+static void opj_pi_update_decode_poc (  opj_pi_iterator_t * p_pi,
+                                        opj_tcp_t * p_tcp,
+                                        OPJ_UINT32 p_max_precision,
+                                        OPJ_UINT32 p_max_res);
+
+/**
+ * FIXME DOC
+ */
+OPJ_BOOL opj_pi_check_next_level(	OPJ_INT32 pos,
+								opj_cp_t *cp,
+								OPJ_UINT32 tileno,
+								OPJ_UINT32 pino,
+								const OPJ_CHAR *prog);
+
+/*@}*/
+
+/*@}*/
+
+/*
+==========================================================
+   local functions
+==========================================================
+*/
+
+OPJ_BOOL opj_pi_next_lrcp(opj_pi_iterator_t * pi) {
+	opj_pi_comp_t *comp = NULL;
+	opj_pi_resolution_t *res = NULL;
+	OPJ_UINT32 index = 0;
+	
+	if (!pi->first) {
+		comp = &pi->comps[pi->compno];
+		res = &comp->resolutions[pi->resno];
+		goto LABEL_SKIP;
+	} else {
+		pi->first = 0;
+	}
+
+	for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
+		for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1;
+		pi->resno++) {
+			for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
+				comp = &pi->comps[pi->compno];
+				if (pi->resno >= comp->numresolutions) {
+					continue;
+				}
+				res = &comp->resolutions[pi->resno];
+				if (!pi->tp_on){
+					pi->poc.precno1 = res->pw * res->ph;
+				}
+				for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
+					index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+					if (!pi->include[index]) {
+						pi->include[index] = 1;
+						return OPJ_TRUE;
+					}
+LABEL_SKIP:;
+				}
+			}
+		}
+	}
+	
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL opj_pi_next_rlcp(opj_pi_iterator_t * pi) {
+	opj_pi_comp_t *comp = NULL;
+	opj_pi_resolution_t *res = NULL;
+	OPJ_UINT32 index = 0;
+
+	if (!pi->first) {
+		comp = &pi->comps[pi->compno];
+		res = &comp->resolutions[pi->resno];
+		goto LABEL_SKIP;
+	} else {
+		pi->first = 0;
+	}
+
+	for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
+		for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
+			for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
+				comp = &pi->comps[pi->compno];
+				if (pi->resno >= comp->numresolutions) {
+					continue;
+				}
+				res = &comp->resolutions[pi->resno];
+				if(!pi->tp_on){
+					pi->poc.precno1 = res->pw * res->ph;
+				}
+				for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
+					index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+					if (!pi->include[index]) {
+						pi->include[index] = 1;
+						return OPJ_TRUE;
+					}
+LABEL_SKIP:;
+				}
+			}
+		}
+	}
+	
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL opj_pi_next_rpcl(opj_pi_iterator_t * pi) {
+	opj_pi_comp_t *comp = NULL;
+	opj_pi_resolution_t *res = NULL;
+	OPJ_UINT32 index = 0;
+
+	if (!pi->first) {
+		goto LABEL_SKIP;
+	} else {
+		OPJ_UINT32 compno, resno;
+		pi->first = 0;
+		pi->dx = 0;
+		pi->dy = 0;
+		for (compno = 0; compno < pi->numcomps; compno++) {
+			comp = &pi->comps[compno];
+			for (resno = 0; resno < comp->numresolutions; resno++) {
+				OPJ_UINT32 dx, dy;
+				res = &comp->resolutions[resno];
+				dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
+				dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
+				pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
+				pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
+			}
+		}
+	}
+if (!pi->tp_on){
+			pi->poc.ty0 = pi->ty0;
+			pi->poc.tx0 = pi->tx0;
+			pi->poc.ty1 = pi->ty1;
+			pi->poc.tx1 = pi->tx1;
+		}
+	for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
+		for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
+			for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
+				for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
+					OPJ_UINT32 levelno;
+					OPJ_INT32 trx0, try0;
+					OPJ_INT32  trx1, try1;
+					OPJ_UINT32  rpx, rpy;
+					OPJ_INT32  prci, prcj;
+					comp = &pi->comps[pi->compno];
+					if (pi->resno >= comp->numresolutions) {
+						continue;
+					}
+					res = &comp->resolutions[pi->resno];
+					levelno = comp->numresolutions - 1 - pi->resno;
+					trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
+					try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
+					trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
+					try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
+					rpx = res->pdx + levelno;
+					rpy = res->pdy + levelno;
+					if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
+						continue;	
+					}
+					if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
+						continue;
+					}
+					
+					if ((res->pw==0)||(res->ph==0)) continue;
+					
+					if ((trx0==trx1)||(try0==try1)) continue;
+					
+					prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
+						 - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
+					prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
+						 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
+					pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
+					for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
+						index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+						if (!pi->include[index]) {
+							pi->include[index] = 1;
+							return OPJ_TRUE;
+						}
+LABEL_SKIP:;
+					}
+				}
+			}
+		}
+	}
+	
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi) {
+	opj_pi_comp_t *comp = NULL;
+	opj_pi_resolution_t *res = NULL;
+	OPJ_UINT32 index = 0;
+
+	if (!pi->first) {
+		comp = &pi->comps[pi->compno];
+		goto LABEL_SKIP;
+	} else {
+		OPJ_UINT32 compno, resno;
+		pi->first = 0;
+		pi->dx = 0;
+		pi->dy = 0;
+		for (compno = 0; compno < pi->numcomps; compno++) {
+			comp = &pi->comps[compno];
+			for (resno = 0; resno < comp->numresolutions; resno++) {
+				OPJ_UINT32 dx, dy;
+				res = &comp->resolutions[resno];
+				dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
+				dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
+				pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
+				pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
+			}
+		}
+	}
+	if (!pi->tp_on){
+			pi->poc.ty0 = pi->ty0;
+			pi->poc.tx0 = pi->tx0;
+			pi->poc.ty1 = pi->ty1;
+			pi->poc.tx1 = pi->tx1;
+		}
+	for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
+		for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
+			for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
+				comp = &pi->comps[pi->compno];
+				for (pi->resno = pi->poc.resno0; pi->resno < opj_uint_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
+					OPJ_UINT32 levelno;
+					OPJ_INT32 trx0, try0;
+					OPJ_INT32 trx1, try1;
+					OPJ_UINT32 rpx, rpy;
+					OPJ_INT32 prci, prcj;
+					res = &comp->resolutions[pi->resno];
+					levelno = comp->numresolutions - 1 - pi->resno;
+					trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
+					try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
+					trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
+					try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
+					rpx = res->pdx + levelno;
+					rpy = res->pdy + levelno;
+					if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
+						continue;	
+					}
+					if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
+						continue;
+					}
+					
+					if ((res->pw==0)||(res->ph==0)) continue;
+					
+					if ((trx0==trx1)||(try0==try1)) continue;
+					
+					prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
+						 - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
+					prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
+						 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
+					pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
+					for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
+						index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+						if (!pi->include[index]) {
+							pi->include[index] = 1;
+							return OPJ_TRUE;
+						}	
+LABEL_SKIP:;
+					}
+				}
+			}
+		}
+	}
+	
+	return OPJ_FALSE;
+}
+
+OPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi) {
+	opj_pi_comp_t *comp = NULL;
+	opj_pi_resolution_t *res = NULL;
+	OPJ_UINT32 index = 0;
+
+	if (!pi->first) {
+		comp = &pi->comps[pi->compno];
+		goto LABEL_SKIP;
+	} else {
+		pi->first = 0;
+	}
+
+	for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
+		OPJ_UINT32 resno;
+		comp = &pi->comps[pi->compno];
+		pi->dx = 0;
+		pi->dy = 0;
+		for (resno = 0; resno < comp->numresolutions; resno++) {
+			OPJ_UINT32 dx, dy;
+			res = &comp->resolutions[resno];
+			dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
+			dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
+			pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
+			pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
+		}
+		if (!pi->tp_on){
+			pi->poc.ty0 = pi->ty0;
+			pi->poc.tx0 = pi->tx0;
+			pi->poc.ty1 = pi->ty1;
+			pi->poc.tx1 = pi->tx1;
+		}
+		for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
+			for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
+				for (pi->resno = pi->poc.resno0; pi->resno < opj_uint_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
+					OPJ_UINT32 levelno;
+					OPJ_INT32 trx0, try0;
+					OPJ_INT32 trx1, try1;
+					OPJ_UINT32 rpx, rpy;
+					OPJ_INT32 prci, prcj;
+					res = &comp->resolutions[pi->resno];
+					levelno = comp->numresolutions - 1 - pi->resno;
+					trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
+					try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
+					trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
+					try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
+					rpx = res->pdx + levelno;
+					rpy = res->pdy + levelno;
+					if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
+						continue;	
+					}
+					if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
+						continue;
+					}
+					
+					if ((res->pw==0)||(res->ph==0)) continue;
+					
+					if ((trx0==trx1)||(try0==try1)) continue;
+					
+					prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
+						 - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
+					prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
+						 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
+					pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
+					for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
+						index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+						if (!pi->include[index]) {
+							pi->include[index] = 1;
+							return OPJ_TRUE;
+						}
+LABEL_SKIP:;
+					}
+				}
+			}
+		}
+	}
+	
+	return OPJ_FALSE;
+}
+
+void opj_get_encoding_parameters(	const opj_image_t *p_image,
+                                    const opj_cp_t *p_cp,
+                                    OPJ_UINT32 p_tileno,
+                                    OPJ_INT32 * p_tx0,
+                                    OPJ_INT32  * p_tx1,
+                                    OPJ_INT32  * p_ty0,
+                                    OPJ_INT32  * p_ty1,
+                                    OPJ_UINT32 * p_dx_min,
+                                    OPJ_UINT32 * p_dy_min,
+                                    OPJ_UINT32 * p_max_prec,
+                                    OPJ_UINT32 * p_max_res )
+{
+	/* loop */
+	OPJ_UINT32  compno, resno;
+	/* pointers */
+	const opj_tcp_t *l_tcp = 00;
+	const opj_tccp_t * l_tccp = 00;
+	const opj_image_comp_t * l_img_comp = 00;
+
+	/* position in x and y of tile */
+	OPJ_UINT32 p, q;
+
+	/* preconditions */
+	assert(p_cp != 00);
+	assert(p_image != 00);
+	assert(p_tileno < p_cp->tw * p_cp->th);
+
+	/* initializations */
+	l_tcp = &p_cp->tcps [p_tileno];
+	l_img_comp = p_image->comps;
+	l_tccp = l_tcp->tccps;
+
+	/* here calculation of tx0, tx1, ty0, ty1, maxprec, dx and dy */
+	p = p_tileno % p_cp->tw;
+	q = p_tileno / p_cp->tw;
+
+	/* find extent of tile */
+	*p_tx0 = opj_int_max((OPJ_INT32)(p_cp->tx0 + p * p_cp->tdx), (OPJ_INT32)p_image->x0);
+	*p_tx1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + (p + 1) * p_cp->tdx), (OPJ_INT32)p_image->x1);
+	*p_ty0 = opj_int_max((OPJ_INT32)(p_cp->ty0 + q * p_cp->tdy), (OPJ_INT32)p_image->y0);
+	*p_ty1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + (q + 1) * p_cp->tdy), (OPJ_INT32)p_image->y1);
+
+	/* max precision is 0 (can only grow) */
+	*p_max_prec = 0;
+	*p_max_res = 0;
+
+	/* take the largest value for dx_min and dy_min */
+	*p_dx_min = 0x7fffffff;
+	*p_dy_min  = 0x7fffffff;
+
+	for (compno = 0; compno < p_image->numcomps; ++compno) {
+		/* arithmetic variables to calculate */
+		OPJ_UINT32 l_level_no;
+		OPJ_INT32 l_rx0, l_ry0, l_rx1, l_ry1;
+		OPJ_INT32 l_px0, l_py0, l_px1, py1;
+		OPJ_UINT32 l_pdx, l_pdy;
+		OPJ_UINT32 l_pw, l_ph;
+		OPJ_UINT32 l_product;
+		OPJ_INT32 l_tcx0, l_tcy0, l_tcx1, l_tcy1;
+
+		l_tcx0 = opj_int_ceildiv(*p_tx0, (OPJ_INT32)l_img_comp->dx);
+		l_tcy0 = opj_int_ceildiv(*p_ty0, (OPJ_INT32)l_img_comp->dy);
+		l_tcx1 = opj_int_ceildiv(*p_tx1, (OPJ_INT32)l_img_comp->dx);
+		l_tcy1 = opj_int_ceildiv(*p_ty1, (OPJ_INT32)l_img_comp->dy);
+
+		if (l_tccp->numresolutions > *p_max_res) {
+			*p_max_res = l_tccp->numresolutions;
+		}
+
+		/* use custom size for precincts */
+		for (resno = 0; resno < l_tccp->numresolutions; ++resno) {
+			OPJ_UINT32 l_dx, l_dy;
+
+			/* precinct width and height */
+			l_pdx = l_tccp->prcw[resno];
+			l_pdy = l_tccp->prch[resno];
+
+			l_dx = l_img_comp->dx * (1u << (l_pdx + l_tccp->numresolutions - 1 - resno));
+			l_dy = l_img_comp->dy * (1u << (l_pdy + l_tccp->numresolutions - 1 - resno));
+
+			/* take the minimum size for dx for each comp and resolution */
+			*p_dx_min = opj_uint_min(*p_dx_min, l_dx);
+			*p_dy_min = opj_uint_min(*p_dy_min, l_dy);
+
+			/* various calculations of extents */
+			l_level_no = l_tccp->numresolutions - 1 - resno;
+
+			l_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);
+			l_ry0 = opj_int_ceildivpow2(l_tcy0, (OPJ_INT32)l_level_no);
+			l_rx1 = opj_int_ceildivpow2(l_tcx1, (OPJ_INT32)l_level_no);
+			l_ry1 = opj_int_ceildivpow2(l_tcy1, (OPJ_INT32)l_level_no);
+
+			l_px0 = opj_int_floordivpow2(l_rx0, (OPJ_INT32)l_pdx) << l_pdx;
+			l_py0 = opj_int_floordivpow2(l_ry0, (OPJ_INT32)l_pdy) << l_pdy;
+			l_px1 = opj_int_ceildivpow2(l_rx1, (OPJ_INT32)l_pdx) << l_pdx;
+
+			py1 = opj_int_ceildivpow2(l_ry1, (OPJ_INT32)l_pdy) << l_pdy;
+
+			l_pw = (l_rx0==l_rx1)?0:(OPJ_UINT32)((l_px1 - l_px0) >> l_pdx);
+			l_ph = (l_ry0==l_ry1)?0:(OPJ_UINT32)((py1 - l_py0) >> l_pdy);
+
+			l_product = l_pw * l_ph;
+
+			/* update precision */
+			if (l_product > *p_max_prec) {
+				*p_max_prec = l_product;
+			}
+		}
+		++l_img_comp;
+		++l_tccp;
+	}
+}
+
+
+void opj_get_all_encoding_parameters(   const opj_image_t *p_image,
+                                        const opj_cp_t *p_cp,
+                                        OPJ_UINT32 tileno,
+                                        OPJ_INT32 * p_tx0,
+                                        OPJ_INT32 * p_tx1,
+                                        OPJ_INT32 * p_ty0,
+                                        OPJ_INT32 * p_ty1,
+                                        OPJ_UINT32 * p_dx_min,
+                                        OPJ_UINT32 * p_dy_min,
+                                        OPJ_UINT32 * p_max_prec,
+                                        OPJ_UINT32 * p_max_res,
+                                        OPJ_UINT32 ** p_resolutions )
+{
+	/* loop*/
+	OPJ_UINT32 compno, resno;
+
+	/* pointers*/
+	const opj_tcp_t *tcp = 00;
+	const opj_tccp_t * l_tccp = 00;
+	const opj_image_comp_t * l_img_comp = 00;
+
+	/* to store l_dx, l_dy, w and h for each resolution and component.*/
+	OPJ_UINT32 * lResolutionPtr;
+
+	/* position in x and y of tile*/
+	OPJ_UINT32 p, q;
+
+	/* preconditions in debug*/
+	assert(p_cp != 00);
+	assert(p_image != 00);
+	assert(tileno < p_cp->tw * p_cp->th);
+
+	/* initializations*/
+	tcp = &p_cp->tcps [tileno];
+	l_tccp = tcp->tccps;
+	l_img_comp = p_image->comps;
+
+	/* position in x and y of tile*/
+	p = tileno % p_cp->tw;
+	q = tileno / p_cp->tw;
+
+	/* here calculation of tx0, tx1, ty0, ty1, maxprec, l_dx and l_dy */
+	*p_tx0 = opj_int_max((OPJ_INT32)(p_cp->tx0 + p * p_cp->tdx), (OPJ_INT32)p_image->x0);
+	*p_tx1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + (p + 1) * p_cp->tdx), (OPJ_INT32)p_image->x1);
+	*p_ty0 = opj_int_max((OPJ_INT32)(p_cp->ty0 + q * p_cp->tdy), (OPJ_INT32)p_image->y0);
+	*p_ty1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + (q + 1) * p_cp->tdy), (OPJ_INT32)p_image->y1);
+
+	/* max precision and resolution is 0 (can only grow)*/
+	*p_max_prec = 0;
+	*p_max_res = 0;
+
+	/* take the largest value for dx_min and dy_min*/
+	*p_dx_min = 0x7fffffff;
+	*p_dy_min = 0x7fffffff;
+
+	for (compno = 0; compno < p_image->numcomps; ++compno) {
+		/* aritmetic variables to calculate*/
+		OPJ_UINT32 l_level_no;
+		OPJ_INT32 l_rx0, l_ry0, l_rx1, l_ry1;
+		OPJ_INT32 l_px0, l_py0, l_px1, py1;
+		OPJ_UINT32 l_product;
+		OPJ_INT32 l_tcx0, l_tcy0, l_tcx1, l_tcy1;
+		OPJ_UINT32 l_pdx, l_pdy , l_pw , l_ph;
+
+		lResolutionPtr = p_resolutions[compno];
+
+		l_tcx0 = opj_int_ceildiv(*p_tx0, (OPJ_INT32)l_img_comp->dx);
+		l_tcy0 = opj_int_ceildiv(*p_ty0, (OPJ_INT32)l_img_comp->dy);
+		l_tcx1 = opj_int_ceildiv(*p_tx1, (OPJ_INT32)l_img_comp->dx);
+		l_tcy1 = opj_int_ceildiv(*p_ty1, (OPJ_INT32)l_img_comp->dy);
+
+		if (l_tccp->numresolutions > *p_max_res) {
+			*p_max_res = l_tccp->numresolutions;
+		}
+
+		/* use custom size for precincts*/
+		l_level_no = l_tccp->numresolutions - 1;
+		for (resno = 0; resno < l_tccp->numresolutions; ++resno) {
+			OPJ_UINT32 l_dx, l_dy;
+
+			/* precinct width and height*/
+			l_pdx = l_tccp->prcw[resno];
+			l_pdy = l_tccp->prch[resno];
+			*lResolutionPtr++ = l_pdx;
+			*lResolutionPtr++ = l_pdy;
+			l_dx = l_img_comp->dx * (1u << (l_pdx + l_level_no));
+			l_dy = l_img_comp->dy * (1u << (l_pdy + l_level_no));
+			/* take the minimum size for l_dx for each comp and resolution*/
+			*p_dx_min = (OPJ_UINT32)opj_int_min((OPJ_INT32)*p_dx_min, (OPJ_INT32)l_dx);
+			*p_dy_min = (OPJ_UINT32)opj_int_min((OPJ_INT32)*p_dy_min, (OPJ_INT32)l_dy);
+
+			/* various calculations of extents*/
+			l_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);
+			l_ry0 = opj_int_ceildivpow2(l_tcy0, (OPJ_INT32)l_level_no);
+			l_rx1 = opj_int_ceildivpow2(l_tcx1, (OPJ_INT32)l_level_no);
+			l_ry1 = opj_int_ceildivpow2(l_tcy1, (OPJ_INT32)l_level_no);
+			l_px0 = opj_int_floordivpow2(l_rx0, (OPJ_INT32)l_pdx) << l_pdx;
+			l_py0 = opj_int_floordivpow2(l_ry0, (OPJ_INT32)l_pdy) << l_pdy;
+			l_px1 = opj_int_ceildivpow2(l_rx1, (OPJ_INT32)l_pdx) << l_pdx;
+			py1 = opj_int_ceildivpow2(l_ry1, (OPJ_INT32)l_pdy) << l_pdy;
+			l_pw = (l_rx0==l_rx1)?0:(OPJ_UINT32)((l_px1 - l_px0) >> l_pdx);
+			l_ph = (l_ry0==l_ry1)?0:(OPJ_UINT32)((py1 - l_py0) >> l_pdy);
+			*lResolutionPtr++ = l_pw;
+			*lResolutionPtr++ = l_ph;
+			l_product = l_pw * l_ph;
+			
+            /* update precision*/
+			if (l_product > *p_max_prec) {
+				*p_max_prec = l_product;
+			}
+
+			--l_level_no;
+		}
+		++l_tccp;
+		++l_img_comp;
+	}
+}
+
+opj_pi_iterator_t * opj_pi_create(	const opj_image_t *image,
+                                    const opj_cp_t *cp,
+                                    OPJ_UINT32 tileno )
+{
+	/* loop*/
+	OPJ_UINT32 pino, compno;
+	/* number of poc in the p_pi*/
+	OPJ_UINT32 l_poc_bound;
+
+	/* pointers to tile coding parameters and components.*/
+	opj_pi_iterator_t *l_pi = 00;
+	opj_tcp_t *tcp = 00;
+	const opj_tccp_t *tccp = 00;
+
+	/* current packet iterator being allocated*/
+	opj_pi_iterator_t *l_current_pi = 00;
+
+	/* preconditions in debug*/
+	assert(cp != 00);
+	assert(image != 00);
+	assert(tileno < cp->tw * cp->th);
+
+	/* initializations*/
+	tcp = &cp->tcps[tileno];
+	l_poc_bound = tcp->numpocs+1;
+
+	/* memory allocations*/
+	l_pi = (opj_pi_iterator_t*) opj_calloc((l_poc_bound), sizeof(opj_pi_iterator_t));
+	if (!l_pi) {
+		return NULL;
+	}
+	memset(l_pi,0,l_poc_bound * sizeof(opj_pi_iterator_t));
+
+	l_current_pi = l_pi;
+	for (pino = 0; pino < l_poc_bound ; ++pino) {
+
+		l_current_pi->comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t));
+		if (! l_current_pi->comps) {
+			opj_pi_destroy(l_pi, l_poc_bound);
+			return NULL;
+		}
+
+		l_current_pi->numcomps = image->numcomps;
+		memset(l_current_pi->comps,0,image->numcomps * sizeof(opj_pi_comp_t));
+
+		for (compno = 0; compno < image->numcomps; ++compno) {
+			opj_pi_comp_t *comp = &l_current_pi->comps[compno];
+
+			tccp = &tcp->tccps[compno];
+
+			comp->resolutions = (opj_pi_resolution_t*) opj_malloc(tccp->numresolutions * sizeof(opj_pi_resolution_t));
+			if (!comp->resolutions) {
+				opj_pi_destroy(l_pi, l_poc_bound);
+				return 00;
+			}
+
+			comp->numresolutions = tccp->numresolutions;
+			memset(comp->resolutions,0,tccp->numresolutions * sizeof(opj_pi_resolution_t));
+		}
+		++l_current_pi;
+	}
+	return l_pi;
+}
+
+void opj_pi_update_encode_poc_and_final (   opj_cp_t *p_cp,
+                                            OPJ_UINT32 p_tileno,
+                                            OPJ_INT32 p_tx0,
+                                            OPJ_INT32 p_tx1,
+                                            OPJ_INT32 p_ty0,
+                                            OPJ_INT32 p_ty1,
+                                            OPJ_UINT32 p_max_prec,
+                                            OPJ_UINT32 p_max_res,
+                                            OPJ_UINT32 p_dx_min,
+                                            OPJ_UINT32 p_dy_min)
+{
+	/* loop*/
+	OPJ_UINT32 pino;
+	/* tile coding parameter*/
+	opj_tcp_t *l_tcp = 00;
+	/* current poc being updated*/
+	opj_poc_t * l_current_poc = 00;
+
+	/* number of pocs*/
+	OPJ_UINT32 l_poc_bound;
+
+    OPJ_ARG_NOT_USED(p_max_res);
+
+	/* preconditions in debug*/
+	assert(p_cp != 00);
+	assert(p_tileno < p_cp->tw * p_cp->th);
+
+	/* initializations*/
+	l_tcp = &p_cp->tcps [p_tileno];
+	/* number of iterations in the loop */
+	l_poc_bound = l_tcp->numpocs+1;
+
+	/* start at first element, and to make sure the compiler will not make a calculation each time in the loop
+	   store a pointer to the current element to modify rather than l_tcp->pocs[i]*/
+	l_current_poc = l_tcp->pocs;
+
+	l_current_poc->compS = l_current_poc->compno0;
+	l_current_poc->compE = l_current_poc->compno1;
+	l_current_poc->resS = l_current_poc->resno0;
+	l_current_poc->resE = l_current_poc->resno1;
+	l_current_poc->layE = l_current_poc->layno1;
+
+	/* special treatment for the first element*/
+	l_current_poc->layS = 0;
+	l_current_poc->prg  = l_current_poc->prg1;
+	l_current_poc->prcS = 0;
+
+	l_current_poc->prcE = p_max_prec;
+	l_current_poc->txS = (OPJ_UINT32)p_tx0;
+	l_current_poc->txE = (OPJ_UINT32)p_tx1;
+	l_current_poc->tyS = (OPJ_UINT32)p_ty0;
+	l_current_poc->tyE = (OPJ_UINT32)p_ty1;
+	l_current_poc->dx = p_dx_min;
+	l_current_poc->dy = p_dy_min;
+
+	++ l_current_poc;
+	for (pino = 1;pino < l_poc_bound ; ++pino) {
+		l_current_poc->compS = l_current_poc->compno0;
+		l_current_poc->compE= l_current_poc->compno1;
+		l_current_poc->resS = l_current_poc->resno0;
+		l_current_poc->resE = l_current_poc->resno1;
+		l_current_poc->layE = l_current_poc->layno1;
+		l_current_poc->prg  = l_current_poc->prg1;
+		l_current_poc->prcS = 0;
+		/* special treatment here different from the first element*/
+		l_current_poc->layS = (l_current_poc->layE > (l_current_poc-1)->layE) ? l_current_poc->layE : 0;
+
+		l_current_poc->prcE = p_max_prec;
+		l_current_poc->txS = (OPJ_UINT32)p_tx0;
+		l_current_poc->txE = (OPJ_UINT32)p_tx1;
+		l_current_poc->tyS = (OPJ_UINT32)p_ty0;
+		l_current_poc->tyE = (OPJ_UINT32)p_ty1;
+		l_current_poc->dx = p_dx_min;
+		l_current_poc->dy = p_dy_min;
+		++ l_current_poc;
+	}
+}
+
+void opj_pi_update_encode_not_poc (	opj_cp_t *p_cp,
+                                    OPJ_UINT32 p_num_comps,
+                                    OPJ_UINT32 p_tileno,
+                                    OPJ_INT32 p_tx0,
+                                    OPJ_INT32 p_tx1,
+                                    OPJ_INT32 p_ty0,
+                                    OPJ_INT32 p_ty1,
+                                    OPJ_UINT32 p_max_prec,
+                                    OPJ_UINT32 p_max_res,
+                                    OPJ_UINT32 p_dx_min,
+                                    OPJ_UINT32 p_dy_min)
+{
+	/* loop*/
+	OPJ_UINT32 pino;
+	/* tile coding parameter*/
+	opj_tcp_t *l_tcp = 00;
+	/* current poc being updated*/
+	opj_poc_t * l_current_poc = 00;
+	/* number of pocs*/
+	OPJ_UINT32 l_poc_bound;
+
+	/* preconditions in debug*/
+	assert(p_cp != 00);
+	assert(p_tileno < p_cp->tw * p_cp->th);
+
+	/* initializations*/
+	l_tcp = &p_cp->tcps [p_tileno];
+
+	/* number of iterations in the loop */
+	l_poc_bound = l_tcp->numpocs+1;
+
+	/* start at first element, and to make sure the compiler will not make a calculation each time in the loop
+	   store a pointer to the current element to modify rather than l_tcp->pocs[i]*/
+	l_current_poc = l_tcp->pocs;
+
+	for (pino = 0; pino < l_poc_bound ; ++pino) {
+		l_current_poc->compS = 0;
+		l_current_poc->compE = p_num_comps;/*p_image->numcomps;*/
+		l_current_poc->resS = 0;
+		l_current_poc->resE = p_max_res;
+		l_current_poc->layS = 0;
+		l_current_poc->layE = l_tcp->numlayers;
+		l_current_poc->prg  = l_tcp->prg;
+		l_current_poc->prcS = 0;
+		l_current_poc->prcE = p_max_prec;
+		l_current_poc->txS = (OPJ_UINT32)p_tx0;
+		l_current_poc->txE = (OPJ_UINT32)p_tx1;
+		l_current_poc->tyS = (OPJ_UINT32)p_ty0;
+		l_current_poc->tyE = (OPJ_UINT32)p_ty1;
+		l_current_poc->dx = p_dx_min;
+		l_current_poc->dy = p_dy_min;
+		++ l_current_poc;
+	}
+}
+
+void opj_pi_update_decode_poc (opj_pi_iterator_t * p_pi,
+                               opj_tcp_t * p_tcp,
+                               OPJ_UINT32 p_max_precision,
+                               OPJ_UINT32 p_max_res)
+{
+	/* loop*/
+	OPJ_UINT32 pino;
+
+	/* encoding prameters to set*/
+	OPJ_UINT32 l_bound;
+
+	opj_pi_iterator_t * l_current_pi = 00;
+	opj_poc_t* l_current_poc = 0;
+
+    OPJ_ARG_NOT_USED(p_max_res);
+
+	/* preconditions in debug*/
+	assert(p_pi != 00);
+	assert(p_tcp != 00);
+
+	/* initializations*/
+	l_bound = p_tcp->numpocs+1;
+	l_current_pi = p_pi;
+	l_current_poc = p_tcp->pocs;
+
+	for	(pino = 0;pino<l_bound;++pino) {
+		l_current_pi->poc.prg = l_current_poc->prg; /* Progression Order #0 */
+		l_current_pi->first = 1;
+
+		l_current_pi->poc.resno0 = l_current_poc->resno0; /* Resolution Level Index #0 (Start) */
+		l_current_pi->poc.compno0 = l_current_poc->compno0; /* Component Index #0 (Start) */
+		l_current_pi->poc.layno0 = 0;
+		l_current_pi->poc.precno0 = 0;
+		l_current_pi->poc.resno1 = l_current_poc->resno1; /* Resolution Level Index #0 (End) */
+		l_current_pi->poc.compno1 = l_current_poc->compno1; /* Component Index #0 (End) */
+		l_current_pi->poc.layno1 = l_current_poc->layno1; /* Layer Index #0 (End) */
+		l_current_pi->poc.precno1 = p_max_precision;
+		++l_current_pi;
+		++l_current_poc;
+	}
+}
+
+void opj_pi_update_decode_not_poc (opj_pi_iterator_t * p_pi,
+                                   opj_tcp_t * p_tcp,
+                                   OPJ_UINT32 p_max_precision,
+                                   OPJ_UINT32 p_max_res)
+{
+	/* loop*/
+	OPJ_UINT32 pino;
+
+	/* encoding prameters to set*/
+	OPJ_UINT32 l_bound;
+
+	opj_pi_iterator_t * l_current_pi = 00;
+	/* preconditions in debug*/
+	assert(p_tcp != 00);
+	assert(p_pi != 00);
+
+	/* initializations*/
+	l_bound = p_tcp->numpocs+1;
+	l_current_pi = p_pi;
+
+	for (pino = 0;pino<l_bound;++pino) {
+		l_current_pi->poc.prg = p_tcp->prg;
+		l_current_pi->first = 1;
+		l_current_pi->poc.resno0 = 0;
+		l_current_pi->poc.compno0 = 0;
+		l_current_pi->poc.layno0 = 0;
+		l_current_pi->poc.precno0 = 0;
+		l_current_pi->poc.resno1 = p_max_res;
+		l_current_pi->poc.compno1 = l_current_pi->numcomps;
+		l_current_pi->poc.layno1 = p_tcp->numlayers;
+		l_current_pi->poc.precno1 = p_max_precision;
+		++l_current_pi;
+	}
+}
+
+
+
+OPJ_BOOL opj_pi_check_next_level(	OPJ_INT32 pos,
+								opj_cp_t *cp,
+								OPJ_UINT32 tileno,
+								OPJ_UINT32 pino,
+								const OPJ_CHAR *prog)
+{
+	OPJ_INT32 i;
+	opj_tcp_t *tcps =&cp->tcps[tileno];
+	opj_poc_t *tcp = &tcps->pocs[pino];
+
+	if(pos>=0){
+		for(i=pos;pos>=0;i--){
+			switch(prog[i]){
+		    case 'R':
+			    if(tcp->res_t==tcp->resE){
+				    if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){
+					    return OPJ_TRUE;
+				    }else{
+					    return OPJ_FALSE;
+				    }
+			    }else{
+				    return OPJ_TRUE;
+			    }
+			    break;
+		    case 'C':
+			    if(tcp->comp_t==tcp->compE){
+				    if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){
+					    return OPJ_TRUE;
+				    }else{
+					    return OPJ_FALSE;
+				    }
+			    }else{
+				    return OPJ_TRUE;
+			    }
+			    break;
+		    case 'L':
+			    if(tcp->lay_t==tcp->layE){
+				    if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){
+					    return OPJ_TRUE;
+				    }else{
+					    return OPJ_FALSE;
+				    }
+			    }else{
+				    return OPJ_TRUE;
+			    }
+			    break;
+		    case 'P':
+			    switch(tcp->prg){
+				    case OPJ_LRCP||OPJ_RLCP:
+					    if(tcp->prc_t == tcp->prcE){
+						    if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+							    return OPJ_TRUE;
+						    }else{
+							    return OPJ_FALSE;
+						    }
+					    }else{
+						    return OPJ_TRUE;
+					    }
+					    break;
+			    default:
+				    if(tcp->tx0_t == tcp->txE){
+					    /*TY*/
+					    if(tcp->ty0_t == tcp->tyE){
+						    if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+							    return OPJ_TRUE;
+						    }else{
+							    return OPJ_FALSE;
+						    }
+					    }else{
+						    return OPJ_TRUE;
+					    }/*TY*/
+				    }else{
+					    return OPJ_TRUE;
+				    }
+				    break;
+			    }/*end case P*/
+		    }/*end switch*/
+		}/*end for*/
+	}/*end if*/
+	return OPJ_FALSE;
+}
+
+
+/*
+==========================================================
+   Packet iterator interface
+==========================================================
+*/
+opj_pi_iterator_t *opj_pi_create_decode(opj_image_t *p_image,
+										opj_cp_t *p_cp,
+										OPJ_UINT32 p_tile_no)
+{
+	/* loop */
+	OPJ_UINT32 pino;
+	OPJ_UINT32 compno, resno;
+
+	/* to store w, h, dx and dy fro all components and resolutions */
+	OPJ_UINT32 * l_tmp_data;
+	OPJ_UINT32 ** l_tmp_ptr;
+
+	/* encoding prameters to set */
+	OPJ_UINT32 l_max_res;
+	OPJ_UINT32 l_max_prec;
+	OPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;
+	OPJ_UINT32 l_dx_min,l_dy_min;
+	OPJ_UINT32 l_bound;
+	OPJ_UINT32 l_step_p , l_step_c , l_step_r , l_step_l ;
+	OPJ_UINT32 l_data_stride;
+
+	/* pointers */
+	opj_pi_iterator_t *l_pi = 00;
+	opj_tcp_t *l_tcp = 00;
+	const opj_tccp_t *l_tccp = 00;
+	opj_pi_comp_t *l_current_comp = 00;
+	opj_image_comp_t * l_img_comp = 00;
+	opj_pi_iterator_t * l_current_pi = 00;
+	OPJ_UINT32 * l_encoding_value_ptr = 00;
+
+	/* preconditions in debug */
+	assert(p_cp != 00);
+	assert(p_image != 00);
+	assert(p_tile_no < p_cp->tw * p_cp->th);
+
+	/* initializations */
+	l_tcp = &p_cp->tcps[p_tile_no];
+	l_bound = l_tcp->numpocs+1;
+
+	l_data_stride = 4 * OPJ_J2K_MAXRLVLS;
+	l_tmp_data = (OPJ_UINT32*)opj_malloc(
+		l_data_stride * p_image->numcomps * sizeof(OPJ_UINT32));
+	if
+		(! l_tmp_data)
+	{
+		return 00;
+	}
+	l_tmp_ptr = (OPJ_UINT32**)opj_malloc(
+		p_image->numcomps * sizeof(OPJ_UINT32 *));
+	if
+		(! l_tmp_ptr)
+	{
+		opj_free(l_tmp_data);
+		return 00;
+	}
+
+	/* memory allocation for pi */
+	l_pi = opj_pi_create(p_image, p_cp, p_tile_no);
+	if (!l_pi) {
+		opj_free(l_tmp_data);
+		opj_free(l_tmp_ptr);
+		return 00;
+	}
+
+	l_encoding_value_ptr = l_tmp_data;
+	/* update pointer array */
+	for
+		(compno = 0; compno < p_image->numcomps; ++compno)
+	{
+		l_tmp_ptr[compno] = l_encoding_value_ptr;
+		l_encoding_value_ptr += l_data_stride;
+	}
+	/* get encoding parameters */
+	opj_get_all_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res,l_tmp_ptr);
+
+	/* step calculations */
+	l_step_p = 1;
+	l_step_c = l_max_prec * l_step_p;
+	l_step_r = p_image->numcomps * l_step_c;
+	l_step_l = l_max_res * l_step_r;
+
+	/* set values for first packet iterator */
+	l_current_pi = l_pi;
+
+	/* memory allocation for include */
+	l_current_pi->include = (OPJ_INT16*) opj_calloc((l_tcp->numlayers +1) * l_step_l, sizeof(OPJ_INT16));
+	if
+		(!l_current_pi->include)
+	{
+		opj_free(l_tmp_data);
+		opj_free(l_tmp_ptr);
+		opj_pi_destroy(l_pi, l_bound);
+		return 00;
+	}
+	memset(l_current_pi->include,0, (l_tcp->numlayers + 1) * l_step_l* sizeof(OPJ_INT16));
+
+	/* special treatment for the first packet iterator */
+	l_current_comp = l_current_pi->comps;
+	l_img_comp = p_image->comps;
+	l_tccp = l_tcp->tccps;
+
+	l_current_pi->tx0 = l_tx0;
+	l_current_pi->ty0 = l_ty0;
+	l_current_pi->tx1 = l_tx1;
+	l_current_pi->ty1 = l_ty1;
+
+	/*l_current_pi->dx = l_img_comp->dx;*/
+	/*l_current_pi->dy = l_img_comp->dy;*/
+
+	l_current_pi->step_p = l_step_p;
+	l_current_pi->step_c = l_step_c;
+	l_current_pi->step_r = l_step_r;
+	l_current_pi->step_l = l_step_l;
+
+	/* allocation for components and number of components has already been calculated by opj_pi_create */
+	for
+		(compno = 0; compno < l_current_pi->numcomps; ++compno)
+	{
+		opj_pi_resolution_t *l_res = l_current_comp->resolutions;
+		l_encoding_value_ptr = l_tmp_ptr[compno];
+
+		l_current_comp->dx = l_img_comp->dx;
+		l_current_comp->dy = l_img_comp->dy;
+		/* resolutions have already been initialized */
+		for
+			(resno = 0; resno < l_current_comp->numresolutions; resno++)
+		{
+			l_res->pdx = *(l_encoding_value_ptr++);
+			l_res->pdy = *(l_encoding_value_ptr++);
+			l_res->pw =  *(l_encoding_value_ptr++);
+			l_res->ph =  *(l_encoding_value_ptr++);
+			++l_res;
+		}
+		++l_current_comp;
+		++l_img_comp;
+		++l_tccp;
+	}
+	++l_current_pi;
+
+	for (pino = 1 ; pino<l_bound ; ++pino )
+	{
+		l_current_comp = l_current_pi->comps;
+		l_img_comp = p_image->comps;
+		l_tccp = l_tcp->tccps;
+
+		l_current_pi->tx0 = l_tx0;
+		l_current_pi->ty0 = l_ty0;
+		l_current_pi->tx1 = l_tx1;
+		l_current_pi->ty1 = l_ty1;
+		/*l_current_pi->dx = l_dx_min;*/
+		/*l_current_pi->dy = l_dy_min;*/
+		l_current_pi->step_p = l_step_p;
+		l_current_pi->step_c = l_step_c;
+		l_current_pi->step_r = l_step_r;
+		l_current_pi->step_l = l_step_l;
+
+		/* allocation for components and number of components has already been calculated by opj_pi_create */
+		for
+			(compno = 0; compno < l_current_pi->numcomps; ++compno)
+		{
+			opj_pi_resolution_t *l_res = l_current_comp->resolutions;
+			l_encoding_value_ptr = l_tmp_ptr[compno];
+
+			l_current_comp->dx = l_img_comp->dx;
+			l_current_comp->dy = l_img_comp->dy;
+			/* resolutions have already been initialized */
+			for
+				(resno = 0; resno < l_current_comp->numresolutions; resno++)
+			{
+				l_res->pdx = *(l_encoding_value_ptr++);
+				l_res->pdy = *(l_encoding_value_ptr++);
+				l_res->pw =  *(l_encoding_value_ptr++);
+				l_res->ph =  *(l_encoding_value_ptr++);
+				++l_res;
+			}
+			++l_current_comp;
+			++l_img_comp;
+			++l_tccp;
+		}
+		/* special treatment*/
+		l_current_pi->include = (l_current_pi-1)->include;
+		++l_current_pi;
+	}
+	opj_free(l_tmp_data);
+	l_tmp_data = 00;
+	opj_free(l_tmp_ptr);
+	l_tmp_ptr = 00;
+	if
+		(l_tcp->POC)
+	{
+		opj_pi_update_decode_poc (l_pi,l_tcp,l_max_prec,l_max_res);
+	}
+	else
+	{
+		opj_pi_update_decode_not_poc(l_pi,l_tcp,l_max_prec,l_max_res);
+	}
+	return l_pi;
+}
+
+
+
+opj_pi_iterator_t *opj_pi_initialise_encode(const opj_image_t *p_image,
+                                            opj_cp_t *p_cp,
+                                            OPJ_UINT32 p_tile_no,
+                                            J2K_T2_MODE p_t2_mode )
+{
+	/* loop*/
+	OPJ_UINT32 pino;
+	OPJ_UINT32 compno, resno;
+
+	/* to store w, h, dx and dy fro all components and resolutions*/
+	OPJ_UINT32 * l_tmp_data;
+	OPJ_UINT32 ** l_tmp_ptr;
+
+	/* encoding prameters to set*/
+	OPJ_UINT32 l_max_res;
+	OPJ_UINT32 l_max_prec;
+	OPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;
+	OPJ_UINT32 l_dx_min,l_dy_min;
+	OPJ_UINT32 l_bound;
+	OPJ_UINT32 l_step_p , l_step_c , l_step_r , l_step_l ;
+	OPJ_UINT32 l_data_stride;
+
+	/* pointers*/
+	opj_pi_iterator_t *l_pi = 00;
+	opj_tcp_t *l_tcp = 00;
+	const opj_tccp_t *l_tccp = 00;
+	opj_pi_comp_t *l_current_comp = 00;
+	opj_image_comp_t * l_img_comp = 00;
+	opj_pi_iterator_t * l_current_pi = 00;
+	OPJ_UINT32 * l_encoding_value_ptr = 00;
+
+	/* preconditions in debug*/
+	assert(p_cp != 00);
+	assert(p_image != 00);
+	assert(p_tile_no < p_cp->tw * p_cp->th);
+
+	/* initializations*/
+	l_tcp = &p_cp->tcps[p_tile_no];
+	l_bound = l_tcp->numpocs+1;
+
+	l_data_stride = 4 * OPJ_J2K_MAXRLVLS;
+	l_tmp_data = (OPJ_UINT32*)opj_malloc(
+		l_data_stride * p_image->numcomps * sizeof(OPJ_UINT32));
+	if (! l_tmp_data) {
+		return 00;
+	}
+
+	l_tmp_ptr = (OPJ_UINT32**)opj_malloc(
+		p_image->numcomps * sizeof(OPJ_UINT32 *));
+	if (! l_tmp_ptr) {
+		opj_free(l_tmp_data);
+		return 00;
+	}
+
+	/* memory allocation for pi*/
+	l_pi = opj_pi_create(p_image,p_cp,p_tile_no);
+	if (!l_pi) {
+		opj_free(l_tmp_data);
+		opj_free(l_tmp_ptr);
+		return 00;
+	}
+
+	l_encoding_value_ptr = l_tmp_data;
+	/* update pointer array*/
+	for (compno = 0; compno < p_image->numcomps; ++compno) {
+		l_tmp_ptr[compno] = l_encoding_value_ptr;
+		l_encoding_value_ptr += l_data_stride;
+	}
+
+	/* get encoding parameters*/
+	opj_get_all_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res,l_tmp_ptr);
+
+	/* step calculations*/
+	l_step_p = 1;
+	l_step_c = l_max_prec * l_step_p;
+	l_step_r = p_image->numcomps * l_step_c;
+	l_step_l = l_max_res * l_step_r;
+
+	/* set values for first packet iterator*/
+	l_pi->tp_on = p_cp->m_specific_param.m_enc.m_tp_on;
+	l_current_pi = l_pi;
+
+	/* memory allocation for include*/
+	l_current_pi->include = (OPJ_INT16*) opj_calloc(l_tcp->numlayers * l_step_l, sizeof(OPJ_INT16));
+	if (!l_current_pi->include) {
+		opj_free(l_tmp_data);
+		opj_free(l_tmp_ptr);
+		opj_pi_destroy(l_pi, l_bound);
+		return 00;
+	}
+	memset(l_current_pi->include,0,l_tcp->numlayers * l_step_l* sizeof(OPJ_INT16));
+
+	/* special treatment for the first packet iterator*/
+	l_current_comp = l_current_pi->comps;
+	l_img_comp = p_image->comps;
+	l_tccp = l_tcp->tccps;
+	l_current_pi->tx0 = l_tx0;
+	l_current_pi->ty0 = l_ty0;
+	l_current_pi->tx1 = l_tx1;
+	l_current_pi->ty1 = l_ty1;
+	l_current_pi->dx = l_dx_min;
+	l_current_pi->dy = l_dy_min;
+	l_current_pi->step_p = l_step_p;
+	l_current_pi->step_c = l_step_c;
+	l_current_pi->step_r = l_step_r;
+	l_current_pi->step_l = l_step_l;
+
+	/* allocation for components and number of components has already been calculated by opj_pi_create */
+	for (compno = 0; compno < l_current_pi->numcomps; ++compno) {
+		opj_pi_resolution_t *l_res = l_current_comp->resolutions;
+		l_encoding_value_ptr = l_tmp_ptr[compno];
+
+		l_current_comp->dx = l_img_comp->dx;
+		l_current_comp->dy = l_img_comp->dy;
+
+		/* resolutions have already been initialized */
+		for (resno = 0; resno < l_current_comp->numresolutions; resno++) {
+			l_res->pdx = *(l_encoding_value_ptr++);
+			l_res->pdy = *(l_encoding_value_ptr++);
+			l_res->pw =  *(l_encoding_value_ptr++);
+			l_res->ph =  *(l_encoding_value_ptr++);
+			++l_res;
+		}
+
+		++l_current_comp;
+		++l_img_comp;
+		++l_tccp;
+	}
+	++l_current_pi;
+
+	for (pino = 1 ; pino<l_bound ; ++pino ) {
+		l_current_comp = l_current_pi->comps;
+		l_img_comp = p_image->comps;
+		l_tccp = l_tcp->tccps;
+
+		l_current_pi->tx0 = l_tx0;
+		l_current_pi->ty0 = l_ty0;
+		l_current_pi->tx1 = l_tx1;
+		l_current_pi->ty1 = l_ty1;
+		l_current_pi->dx = l_dx_min;
+		l_current_pi->dy = l_dy_min;
+		l_current_pi->step_p = l_step_p;
+		l_current_pi->step_c = l_step_c;
+		l_current_pi->step_r = l_step_r;
+		l_current_pi->step_l = l_step_l;
+
+		/* allocation for components and number of components has already been calculated by opj_pi_create */
+		for (compno = 0; compno < l_current_pi->numcomps; ++compno) {
+			opj_pi_resolution_t *l_res = l_current_comp->resolutions;
+			l_encoding_value_ptr = l_tmp_ptr[compno];
+
+			l_current_comp->dx = l_img_comp->dx;
+			l_current_comp->dy = l_img_comp->dy;
+			/* resolutions have already been initialized */
+			for (resno = 0; resno < l_current_comp->numresolutions; resno++) {
+				l_res->pdx = *(l_encoding_value_ptr++);
+				l_res->pdy = *(l_encoding_value_ptr++);
+				l_res->pw =  *(l_encoding_value_ptr++);
+				l_res->ph =  *(l_encoding_value_ptr++);
+				++l_res;
+			}
+			++l_current_comp;
+			++l_img_comp;
+			++l_tccp;
+		}
+
+		/* special treatment*/
+		l_current_pi->include = (l_current_pi-1)->include;
+		++l_current_pi;
+	}
+
+	opj_free(l_tmp_data);
+	l_tmp_data = 00;
+	opj_free(l_tmp_ptr);
+	l_tmp_ptr = 00;
+
+	if (l_tcp->POC && ( p_cp->m_specific_param.m_enc.m_cinema || p_t2_mode == FINAL_PASS)) {
+		opj_pi_update_encode_poc_and_final(p_cp,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
+	}
+	else {
+		opj_pi_update_encode_not_poc(p_cp,p_image->numcomps,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
+	}
+
+	return l_pi;
+}
+
+void opj_pi_create_encode( 	opj_pi_iterator_t *pi,
+							opj_cp_t *cp,
+							OPJ_UINT32 tileno,
+							OPJ_UINT32 pino,
+							OPJ_UINT32 tpnum,
+							OPJ_INT32 tppos,
+							J2K_T2_MODE t2_mode)
+{
+	const OPJ_CHAR *prog;
+	OPJ_INT32 i;
+	OPJ_UINT32 incr_top=1,resetX=0;
+	opj_tcp_t *tcps =&cp->tcps[tileno];
+	opj_poc_t *tcp= &tcps->pocs[pino];
+
+	prog = opj_j2k_convert_progression_order(tcp->prg);
+
+	pi[pino].first = 1;
+	pi[pino].poc.prg = tcp->prg;
+
+	if(!(cp->m_specific_param.m_enc.m_tp_on && ((!cp->m_specific_param.m_enc.m_cinema && (t2_mode == FINAL_PASS)) || cp->m_specific_param.m_enc.m_cinema))){
+		pi[pino].poc.resno0 = tcp->resS;
+		pi[pino].poc.resno1 = tcp->resE;
+		pi[pino].poc.compno0 = tcp->compS;
+		pi[pino].poc.compno1 = tcp->compE;
+		pi[pino].poc.layno0 = tcp->layS;
+		pi[pino].poc.layno1 = tcp->layE;
+		pi[pino].poc.precno0 = tcp->prcS;
+		pi[pino].poc.precno1 = tcp->prcE;
+		pi[pino].poc.tx0 = (OPJ_INT32)tcp->txS;
+		pi[pino].poc.ty0 = (OPJ_INT32)tcp->tyS;
+		pi[pino].poc.tx1 = (OPJ_INT32)tcp->txE;
+		pi[pino].poc.ty1 = (OPJ_INT32)tcp->tyE;
+	}else {
+		for(i=tppos+1;i<4;i++){
+			switch(prog[i]){
+			case 'R':
+				pi[pino].poc.resno0 = tcp->resS;
+				pi[pino].poc.resno1 = tcp->resE;
+				break;
+			case 'C':
+				pi[pino].poc.compno0 = tcp->compS;
+				pi[pino].poc.compno1 = tcp->compE;
+				break;
+			case 'L':
+				pi[pino].poc.layno0 = tcp->layS;
+				pi[pino].poc.layno1 = tcp->layE;
+				break;
+			case 'P':
+				switch(tcp->prg){
+				case OPJ_LRCP:
+				case OPJ_RLCP:
+					pi[pino].poc.precno0 = tcp->prcS;
+					pi[pino].poc.precno1 = tcp->prcE;
+					break;
+				default:
+					pi[pino].poc.tx0 = (OPJ_INT32)tcp->txS;
+					pi[pino].poc.ty0 = (OPJ_INT32)tcp->tyS;
+					pi[pino].poc.tx1 = (OPJ_INT32)tcp->txE;
+					pi[pino].poc.ty1 = (OPJ_INT32)tcp->tyE;
+					break;
+				}
+				break;
+			}
+		}
+
+		if(tpnum==0){
+			for(i=tppos;i>=0;i--){
+				switch(prog[i]){
+				case 'C':
+					tcp->comp_t = tcp->compS;
+					pi[pino].poc.compno0 = tcp->comp_t;
+					pi[pino].poc.compno1 = tcp->comp_t+1;
+					tcp->comp_t+=1;
+					break;
+				case 'R':
+					tcp->res_t = tcp->resS;
+					pi[pino].poc.resno0 = tcp->res_t;
+					pi[pino].poc.resno1 = tcp->res_t+1;
+					tcp->res_t+=1;
+					break;
+				case 'L':
+					tcp->lay_t = tcp->layS;
+					pi[pino].poc.layno0 = tcp->lay_t;
+					pi[pino].poc.layno1 = tcp->lay_t+1;
+					tcp->lay_t+=1;
+					break;
+				case 'P':
+					switch(tcp->prg){
+					case OPJ_LRCP:
+					case OPJ_RLCP:
+						tcp->prc_t = tcp->prcS;
+						pi[pino].poc.precno0 = tcp->prc_t;
+						pi[pino].poc.precno1 = tcp->prc_t+1;
+						tcp->prc_t+=1;
+						break;
+					default:
+						tcp->tx0_t = tcp->txS;
+						tcp->ty0_t = tcp->tyS;
+						pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
+						pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx));
+						pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
+						pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
+						tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
+						tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
+						break;
+					}
+					break;
+				}
+			}
+			incr_top=1;
+		}else{
+			for(i=tppos;i>=0;i--){
+				switch(prog[i]){
+				case 'C':
+					pi[pino].poc.compno0 = tcp->comp_t-1;
+					pi[pino].poc.compno1 = tcp->comp_t;
+					break;
+				case 'R':
+					pi[pino].poc.resno0 = tcp->res_t-1;
+					pi[pino].poc.resno1 = tcp->res_t;
+					break;
+				case 'L':
+					pi[pino].poc.layno0 = tcp->lay_t-1;
+					pi[pino].poc.layno1 = tcp->lay_t;
+					break;
+				case 'P':
+					switch(tcp->prg){
+					case OPJ_LRCP:
+					case OPJ_RLCP:
+						pi[pino].poc.precno0 = tcp->prc_t-1;
+						pi[pino].poc.precno1 = tcp->prc_t;
+						break;
+					default:
+						pi[pino].poc.tx0 = (OPJ_INT32)(tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx));
+						pi[pino].poc.tx1 = (OPJ_INT32)tcp->tx0_t ;
+						pi[pino].poc.ty0 = (OPJ_INT32)(tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy));
+						pi[pino].poc.ty1 = (OPJ_INT32)tcp->ty0_t ;
+						break;
+					}
+					break;
+				}
+				if(incr_top==1){
+					switch(prog[i]){
+					case 'R':
+						if(tcp->res_t==tcp->resE){
+							if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+								tcp->res_t = tcp->resS;
+								pi[pino].poc.resno0 = tcp->res_t;
+								pi[pino].poc.resno1 = tcp->res_t+1;
+								tcp->res_t+=1;
+								incr_top=1;
+							}else{
+								incr_top=0;
+							}
+						}else{
+							pi[pino].poc.resno0 = tcp->res_t;
+							pi[pino].poc.resno1 = tcp->res_t+1;
+							tcp->res_t+=1;
+							incr_top=0;
+						}
+						break;
+					case 'C':
+						if(tcp->comp_t ==tcp->compE){
+							if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+								tcp->comp_t = tcp->compS;
+								pi[pino].poc.compno0 = tcp->comp_t;
+								pi[pino].poc.compno1 = tcp->comp_t+1;
+								tcp->comp_t+=1;
+								incr_top=1;
+							}else{
+								incr_top=0;
+							}
+						}else{
+							pi[pino].poc.compno0 = tcp->comp_t;
+							pi[pino].poc.compno1 = tcp->comp_t+1;
+							tcp->comp_t+=1;
+							incr_top=0;
+						}
+						break;
+					case 'L':
+						if(tcp->lay_t == tcp->layE){
+							if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+								tcp->lay_t = tcp->layS;
+								pi[pino].poc.layno0 = tcp->lay_t;
+								pi[pino].poc.layno1 = tcp->lay_t+1;
+								tcp->lay_t+=1;
+								incr_top=1;
+							}else{
+								incr_top=0;
+							}
+						}else{
+							pi[pino].poc.layno0 = tcp->lay_t;
+							pi[pino].poc.layno1 = tcp->lay_t+1;
+							tcp->lay_t+=1;
+							incr_top=0;
+						}
+						break;
+					case 'P':
+						switch(tcp->prg){
+						case OPJ_LRCP:
+						case OPJ_RLCP:
+							if(tcp->prc_t == tcp->prcE){
+								if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+									tcp->prc_t = tcp->prcS;
+									pi[pino].poc.precno0 = tcp->prc_t;
+									pi[pino].poc.precno1 = tcp->prc_t+1;
+									tcp->prc_t+=1;
+									incr_top=1;
+								}else{
+									incr_top=0;
+								}
+							}else{
+								pi[pino].poc.precno0 = tcp->prc_t;
+								pi[pino].poc.precno1 = tcp->prc_t+1;
+								tcp->prc_t+=1;
+								incr_top=0;
+							}
+							break;
+						default:
+							if(tcp->tx0_t >= tcp->txE){
+								if(tcp->ty0_t >= tcp->tyE){
+									if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+										tcp->ty0_t = tcp->tyS;
+										pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
+										pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
+										tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
+										incr_top=1;resetX=1;
+									}else{
+										incr_top=0;resetX=0;
+									}
+								}else{
+									pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
+									pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
+									tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
+									incr_top=0;resetX=1;
+								}
+								if(resetX==1){
+									tcp->tx0_t = tcp->txS;
+									pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
+									pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx));
+									tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
+								}
+							}else{
+								pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
+								pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx));
+								tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
+								incr_top=0;
+							}
+							break;
+						}
+						break;
+					}
+				}
+			}
+		}
+	}
+}
+
+void opj_pi_destroy(opj_pi_iterator_t *p_pi,
+                    OPJ_UINT32 p_nb_elements)
+{
+	OPJ_UINT32 compno, pino;
+	opj_pi_iterator_t *l_current_pi = p_pi;
+    if (p_pi) {
+		if (p_pi->include) {
+			opj_free(p_pi->include);
+			p_pi->include = 00;
+		}
+		for (pino = 0; pino < p_nb_elements; ++pino){
+			if(l_current_pi->comps) {
+				opj_pi_comp_t *l_current_component = l_current_pi->comps;
+                for (compno = 0; compno < l_current_pi->numcomps; compno++){
+                    if(l_current_component->resolutions) {
+						opj_free(l_current_component->resolutions);
+						l_current_component->resolutions = 00;
+					}
+
+					++l_current_component;
+				}
+				opj_free(l_current_pi->comps);
+				l_current_pi->comps = 0;
+			}
+			++l_current_pi;
+		}
+		opj_free(p_pi);
+	}
+}
+
+
+
+void opj_pi_update_encoding_parameters(	const opj_image_t *p_image,
+                                        opj_cp_t *p_cp,
+                                        OPJ_UINT32 p_tile_no )
+{
+	/* encoding parameters to set */
+	OPJ_UINT32 l_max_res;
+	OPJ_UINT32 l_max_prec;
+	OPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;
+	OPJ_UINT32 l_dx_min,l_dy_min;
+
+	/* pointers */
+	opj_tcp_t *l_tcp = 00;
+
+	/* preconditions */
+	assert(p_cp != 00);
+	assert(p_image != 00);
+	assert(p_tile_no < p_cp->tw * p_cp->th);
+
+	l_tcp = &(p_cp->tcps[p_tile_no]);
+
+	/* get encoding parameters */
+	opj_get_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res);
+
+	if (l_tcp->POC) {
+		opj_pi_update_encode_poc_and_final(p_cp,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
+	}
+	else {
+		opj_pi_update_encode_not_poc(p_cp,p_image->numcomps,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
+	}
+}
+
+OPJ_BOOL opj_pi_next(opj_pi_iterator_t * pi) {
+	switch (pi->poc.prg) {
+		case OPJ_LRCP:
+			return opj_pi_next_lrcp(pi);
+		case OPJ_RLCP:
+			return opj_pi_next_rlcp(pi);
+		case OPJ_RPCL:
+			return opj_pi_next_rpcl(pi);
+		case OPJ_PCRL:
+			return opj_pi_next_pcrl(pi);
+		case OPJ_CPRL:
+			return opj_pi_next_cprl(pi);
+		case OPJ_PROG_UNKNOWN:
+			return OPJ_FALSE;
+	}
+	
+	return OPJ_FALSE;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.h
new file mode 100644
index 0000000..f239679
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.h
@@ -0,0 +1,188 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __PI_H
+#define __PI_H
+/**
+@file pi.h
+@brief Implementation of a packet iterator (PI)
+
+The functions in PI.C have for goal to realize a packet iterator that permits to get the next
+packet following the progression order and change of it. The functions in PI.C are used
+by some function in T2.C.
+*/
+
+/** @defgroup PI PI - Implementation of a packet iterator */
+/*@{*/
+
+/**
+FIXME DOC
+*/
+typedef struct opj_pi_resolution {
+  OPJ_UINT32 pdx, pdy;
+  OPJ_UINT32 pw, ph;
+} opj_pi_resolution_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_pi_comp {
+  OPJ_UINT32 dx, dy;
+  /** number of resolution levels */
+  OPJ_UINT32 numresolutions;
+  opj_pi_resolution_t *resolutions;
+} opj_pi_comp_t;
+
+/**
+Packet iterator
+*/
+typedef struct opj_pi_iterator {
+  /** Enabling Tile part generation*/
+  OPJ_BYTE tp_on;
+  /** precise if the packet has been already used (usefull for progression order change) */
+  OPJ_INT16 *include;
+  /** layer step used to localize the packet in the include vector */
+  OPJ_UINT32 step_l;
+  /** resolution step used to localize the packet in the include vector */
+  OPJ_UINT32 step_r;
+  /** component step used to localize the packet in the include vector */
+  OPJ_UINT32 step_c;
+  /** precinct step used to localize the packet in the include vector */
+  OPJ_UINT32 step_p;
+  /** component that identify the packet */
+  OPJ_UINT32 compno;
+  /** resolution that identify the packet */
+  OPJ_UINT32 resno;
+  /** precinct that identify the packet */
+  OPJ_UINT32 precno;
+  /** layer that identify the packet */
+  OPJ_UINT32 layno;
+  /** 0 if the first packet */
+  OPJ_BOOL first;
+  /** progression order change information */
+  opj_poc_t poc;
+  /** number of components in the image */
+  OPJ_UINT32 numcomps;
+  /** Components*/
+  opj_pi_comp_t *comps;
+  /** FIXME DOC*/
+  OPJ_INT32 tx0, ty0, tx1, ty1;
+  /** FIXME DOC*/
+  OPJ_INT32 x, y;
+  /** FIXME DOC*/
+  OPJ_UINT32 dx, dy;
+} opj_pi_iterator_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+ * Creates a packet iterator for encoding.
+ *
+ * @param	image		the image being encoded.
+ * @param	cp		the coding parameters.
+ * @param	tileno	index of the tile being encoded.
+ * @param	t2_mode	the type of pass for generating the packet iterator
+ *
+ * @return	a list of packet iterator that points to the first packet of the tile (not true).
+*/
+opj_pi_iterator_t *opj_pi_initialise_encode(const opj_image_t *image,
+                                            opj_cp_t *cp,
+                                            OPJ_UINT32 tileno,
+                                            J2K_T2_MODE t2_mode);
+
+/**
+ * Updates the encoding parameters of the codec.
+ *
+ * @param	p_image		the image being encoded.
+ * @param	p_cp		the coding parameters.
+ * @param	p_tile_no	index of the tile being encoded.
+*/
+void opj_pi_update_encoding_parameters(	const opj_image_t *p_image,
+                                        opj_cp_t *p_cp,
+                                        OPJ_UINT32 p_tile_no );
+
+/**
+Modify the packet iterator for enabling tile part generation
+@param pi Handle to the packet iterator generated in pi_initialise_encode
+@param cp Coding parameters
+@param tileno Number that identifies the tile for which to list the packets
+@param pino   FIXME DOC
+@param tpnum Tile part number of the current tile
+@param tppos The position of the tile part flag in the progression order
+@param t2_mode FIXME DOC
+*/
+void opj_pi_create_encode(  opj_pi_iterator_t *pi, 
+                            opj_cp_t *cp,
+                            OPJ_UINT32 tileno, 
+                            OPJ_UINT32 pino,
+                            OPJ_UINT32 tpnum, 
+                            OPJ_INT32 tppos, 
+                            J2K_T2_MODE t2_mode);
+
+/**
+Create a packet iterator for Decoder
+@param image Raw image for which the packets will be listed
+@param cp Coding parameters
+@param tileno Number that identifies the tile for which to list the packets
+@return Returns a packet iterator that points to the first packet of the tile
+@see opj_pi_destroy
+*/
+opj_pi_iterator_t *opj_pi_create_decode(opj_image_t * image, 
+                                        opj_cp_t * cp,
+                                        OPJ_UINT32 tileno);
+/**
+ * Destroys a packet iterator array.
+ *
+ * @param	p_pi			the packet iterator array to destroy.
+ * @param	p_nb_elements	the number of elements in the array.
+ */
+void opj_pi_destroy(opj_pi_iterator_t *p_pi,
+                    OPJ_UINT32 p_nb_elements);
+
+/**
+Modify the packet iterator to point to the next packet
+@param pi Packet iterator to modify
+@return Returns false if pi pointed to the last packet or else returns true
+*/
+OPJ_BOOL opj_pi_next(opj_pi_iterator_t * pi);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __PI_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.c
new file mode 100644
index 0000000..2498761
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.c
@@ -0,0 +1,95 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/* 
+==========================================================
+   local functions
+==========================================================
+*/
+
+
+/* 
+==========================================================
+   RAW encoding interface
+==========================================================
+*/
+
+opj_raw_t* opj_raw_create(void) {
+	opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));
+	return raw;
+}
+
+void opj_raw_destroy(opj_raw_t *raw) {
+	if(raw) {
+		opj_free(raw);
+	}
+}
+
+OPJ_UINT32 opj_raw_numbytes(opj_raw_t *raw) {
+	const ptrdiff_t diff = raw->bp - raw->start;
+  assert( diff <= (ptrdiff_t)0xffffffff && diff >= 0 ); /* UINT32_MAX */
+	return (OPJ_UINT32)diff;
+}
+
+void opj_raw_init_dec(opj_raw_t *raw, OPJ_BYTE *bp, OPJ_UINT32 len) {
+	raw->start = bp;
+	raw->lenmax = len;
+	raw->len = 0;
+	raw->c = 0;
+	raw->ct = 0;
+}
+
+OPJ_UINT32 opj_raw_decode(opj_raw_t *raw) {
+	OPJ_UINT32 d;
+	if (raw->ct == 0) {
+		raw->ct = 8;
+		if (raw->len == raw->lenmax) {
+			raw->c = 0xff;
+		} else {
+			if (raw->c == 0xff) {
+				raw->ct = 7;
+			}
+			raw->c = *(raw->start + raw->len);
+			raw->len++;
+		}
+	}
+	raw->ct--;
+	d = (raw->c >> raw->ct) & 0x01;
+	
+	return d;
+}
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.h
new file mode 100644
index 0000000..572c666
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.h
@@ -0,0 +1,106 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __RAW_H
+#define __RAW_H
+/**
+@file raw.h
+@brief Implementation of operations for raw encoding (RAW)
+
+The functions in RAW.C have for goal to realize the operation of raw encoding linked
+with the corresponding mode switch.
+*/
+
+/** @defgroup RAW RAW - Implementation of operations for raw encoding */
+/*@{*/
+
+/**
+RAW encoding operations
+*/
+typedef struct opj_raw {
+	/** temporary buffer where bits are coded or decoded */
+	OPJ_BYTE c;
+	/** number of bits already read or free to write */
+	OPJ_UINT32 ct;
+	/** maximum length to decode */
+	OPJ_UINT32 lenmax;
+	/** length decoded */
+	OPJ_UINT32 len;
+	/** pointer to the current position in the buffer */
+	OPJ_BYTE *bp;
+	/** pointer to the start of the buffer */
+	OPJ_BYTE *start;
+	/** pointer to the end of the buffer */
+	OPJ_BYTE *end;
+} opj_raw_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a new RAW handle 
+@return Returns a new RAW handle if successful, returns NULL otherwise
+*/
+opj_raw_t* opj_raw_create(void);
+/**
+Destroy a previously created RAW handle
+@param raw RAW handle to destroy
+*/
+void opj_raw_destroy(opj_raw_t *raw);
+/**
+Return the number of bytes written/read since initialisation
+@param raw RAW handle to destroy
+@return Returns the number of bytes already encoded
+*/
+OPJ_UINT32 opj_raw_numbytes(opj_raw_t *raw);
+/**
+Initialize the decoder
+@param raw RAW handle
+@param bp Pointer to the start of the buffer from which the bytes will be read
+@param len Length of the input buffer
+*/
+void opj_raw_init_dec(opj_raw_t *raw, OPJ_BYTE *bp, OPJ_UINT32 len);
+/**
+Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN
+@param raw RAW handle
+@return Returns the decoded symbol (0 or 1)
+*/
+OPJ_UINT32 opj_raw_decode(opj_raw_t *raw);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __RAW_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c
new file mode 100644
index 0000000..0d6c2f6
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c
@@ -0,0 +1,1757 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+#include "t1_luts.h"
+
+/** @defgroup T1 T1 - Implementation of the tier-1 coding */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+static INLINE OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient);
+static OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f);
+static INLINE OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f);
+static OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f);
+static OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos);
+static OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos);
+static void opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stride);
+/**
+Encode significant pass
+*/
+static void opj_t1_enc_sigpass_step(opj_t1_t *t1,
+                                    opj_flag_t *flagsp,
+                                    OPJ_INT32 *datap,
+                                    OPJ_UINT32 orient,
+                                    OPJ_INT32 bpno,
+                                    OPJ_INT32 one,
+                                    OPJ_INT32 *nmsedec,
+                                    OPJ_BYTE type,
+                                    OPJ_UINT32 vsc);
+
+/**
+Decode significant pass
+*/
+#if 0
+static void opj_t1_dec_sigpass_step(opj_t1_t *t1,
+                                    opj_flag_t *flagsp,
+                                    OPJ_INT32 *datap,
+                                    OPJ_UINT32 orient,
+                                    OPJ_INT32 oneplushalf,
+                                    OPJ_BYTE type,
+                                    OPJ_UINT32 vsc);
+#endif
+
+static INLINE void opj_t1_dec_sigpass_step_raw(
+                opj_t1_t *t1,
+                opj_flag_t *flagsp,
+                OPJ_INT32 *datap,
+                OPJ_INT32 orient,
+                OPJ_INT32 oneplushalf,
+                OPJ_INT32 vsc);
+static INLINE void opj_t1_dec_sigpass_step_mqc(
+                opj_t1_t *t1,
+                opj_flag_t *flagsp,
+                OPJ_INT32 *datap,
+                OPJ_INT32 orient,
+                OPJ_INT32 oneplushalf);
+static INLINE void opj_t1_dec_sigpass_step_mqc_vsc(
+                opj_t1_t *t1,
+                opj_flag_t *flagsp,
+                OPJ_INT32 *datap,
+                OPJ_INT32 orient,
+                OPJ_INT32 oneplushalf,
+                OPJ_INT32 vsc);
+
+
+/**
+Encode significant pass
+*/
+static void opj_t1_enc_sigpass( opj_t1_t *t1,
+                                OPJ_INT32 bpno,
+                                OPJ_UINT32 orient,
+                                OPJ_INT32 *nmsedec,
+                                OPJ_BYTE type,
+                                OPJ_UINT32 cblksty);
+
+/**
+Decode significant pass
+*/
+static void opj_t1_dec_sigpass_raw(
+                opj_t1_t *t1,
+                OPJ_INT32 bpno,
+                OPJ_INT32 orient,
+                OPJ_INT32 cblksty);
+static void opj_t1_dec_sigpass_mqc(
+                opj_t1_t *t1,
+                OPJ_INT32 bpno,
+                OPJ_INT32 orient);
+static void opj_t1_dec_sigpass_mqc_vsc(
+                opj_t1_t *t1,
+                OPJ_INT32 bpno,
+                OPJ_INT32 orient);
+
+
+
+/**
+Encode refinement pass
+*/
+static void opj_t1_enc_refpass_step(opj_t1_t *t1,
+                                    opj_flag_t *flagsp,
+                                    OPJ_INT32 *datap,
+                                    OPJ_INT32 bpno,
+                                    OPJ_INT32 one,
+                                    OPJ_INT32 *nmsedec,
+                                    OPJ_BYTE type,
+                                    OPJ_UINT32 vsc);
+
+
+/**
+Encode refinement pass
+*/
+static void opj_t1_enc_refpass( opj_t1_t *t1,
+                                OPJ_INT32 bpno,
+                                OPJ_INT32 *nmsedec,
+                                OPJ_BYTE type,
+                                OPJ_UINT32 cblksty);
+
+/**
+Decode refinement pass
+*/
+static void opj_t1_dec_refpass_raw(
+                opj_t1_t *t1,
+                OPJ_INT32 bpno,
+                OPJ_INT32 cblksty);
+static void opj_t1_dec_refpass_mqc(
+                opj_t1_t *t1,
+                OPJ_INT32 bpno);
+static void opj_t1_dec_refpass_mqc_vsc(
+                opj_t1_t *t1,
+                OPJ_INT32 bpno);
+
+
+/**
+Decode refinement pass
+*/
+#if 0
+static void opj_t1_dec_refpass_step(opj_t1_t *t1,
+                                    opj_flag_t *flagsp,
+                                    OPJ_INT32 *datap,
+                                    OPJ_INT32 poshalf,
+                                    OPJ_INT32 neghalf,
+                                    OPJ_BYTE type,
+                                    OPJ_UINT32 vsc);
+#endif
+
+static INLINE void  opj_t1_dec_refpass_step_raw(
+                opj_t1_t *t1,
+                opj_flag_t *flagsp,
+                OPJ_INT32 *datap,
+                OPJ_INT32 poshalf,
+                OPJ_INT32 neghalf,
+                OPJ_INT32 vsc);
+static INLINE void opj_t1_dec_refpass_step_mqc(
+                opj_t1_t *t1,
+                opj_flag_t *flagsp,
+                OPJ_INT32 *datap,
+                OPJ_INT32 poshalf,
+                OPJ_INT32 neghalf);
+static INLINE void opj_t1_dec_refpass_step_mqc_vsc(
+                opj_t1_t *t1,
+                opj_flag_t *flagsp,
+                OPJ_INT32 *datap,
+                OPJ_INT32 poshalf,
+                OPJ_INT32 neghalf,
+                OPJ_INT32 vsc);
+
+
+
+/**
+Encode clean-up pass
+*/
+static void opj_t1_enc_clnpass_step(
+		opj_t1_t *t1,
+		opj_flag_t *flagsp,
+		OPJ_INT32 *datap,
+		OPJ_UINT32 orient,
+		OPJ_INT32 bpno,
+		OPJ_INT32 one,
+		OPJ_INT32 *nmsedec,
+		OPJ_UINT32 partial,
+		OPJ_UINT32 vsc);
+/**
+Decode clean-up pass
+*/
+static void opj_t1_dec_clnpass_step_partial(
+		opj_t1_t *t1,
+		opj_flag_t *flagsp,
+		OPJ_INT32 *datap,
+		OPJ_INT32 orient,
+		OPJ_INT32 oneplushalf);
+static void opj_t1_dec_clnpass_step(
+		opj_t1_t *t1,
+		opj_flag_t *flagsp,
+		OPJ_INT32 *datap,
+		OPJ_INT32 orient,
+		OPJ_INT32 oneplushalf);
+static void opj_t1_dec_clnpass_step_vsc(
+		opj_t1_t *t1,
+		opj_flag_t *flagsp,
+		OPJ_INT32 *datap,
+		OPJ_INT32 orient,
+		OPJ_INT32 oneplushalf,
+		OPJ_INT32 partial,
+		OPJ_INT32 vsc);
+/**
+Encode clean-up pass
+*/
+static void opj_t1_enc_clnpass(
+		opj_t1_t *t1,
+		OPJ_INT32 bpno,
+		OPJ_UINT32 orient,
+		OPJ_INT32 *nmsedec,
+		OPJ_UINT32 cblksty);
+/**
+Decode clean-up pass
+*/
+static void opj_t1_dec_clnpass(
+		opj_t1_t *t1,
+		OPJ_INT32 bpno,
+		OPJ_INT32 orient,
+		OPJ_INT32 cblksty);
+
+static OPJ_FLOAT64 opj_t1_getwmsedec(
+		OPJ_INT32 nmsedec,
+		OPJ_UINT32 compno,
+		OPJ_UINT32 level,
+		OPJ_UINT32 orient,
+		OPJ_INT32 bpno,
+		OPJ_UINT32 qmfbid,
+		OPJ_FLOAT64 stepsize,
+		OPJ_UINT32 numcomps,
+		const OPJ_FLOAT64 * mct_norms);
+
+static void opj_t1_encode_cblk( opj_t1_t *t1,
+                                opj_tcd_cblk_enc_t* cblk,
+                                OPJ_UINT32 orient,
+                                OPJ_UINT32 compno,
+                                OPJ_UINT32 level,
+                                OPJ_UINT32 qmfbid,
+                                OPJ_FLOAT64 stepsize,
+                                OPJ_UINT32 cblksty,
+                                OPJ_UINT32 numcomps,
+                                opj_tcd_tile_t * tile,
+                                const OPJ_FLOAT64 * mct_norms);
+
+/**
+Decode 1 code-block
+@param t1 T1 handle
+@param cblk Code-block coding parameters
+@param orient
+@param roishift Region of interest shifting value
+@param cblksty Code-block style
+*/
+static OPJ_BOOL opj_t1_decode_cblk( opj_t1_t *t1,
+                                    opj_tcd_cblk_dec_t* cblk,
+                                    OPJ_UINT32 orient,
+                                    OPJ_UINT32 roishift,
+                                    OPJ_UINT32 cblksty);
+
+OPJ_BOOL opj_t1_allocate_buffers(   opj_t1_t *t1,
+                                    OPJ_UINT32 w,
+                                    OPJ_UINT32 h);
+
+/*@}*/
+
+/*@}*/
+
+/* ----------------------------------------------------------------------- */
+
+OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient) {
+	return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
+}
+
+OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f) {
+	return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
+}
+
+OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f) {
+	OPJ_UINT32 tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;
+	OPJ_UINT32 tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1;
+	return (tmp2);
+}
+
+OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f) {
+	return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
+}
+
+OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos) {
+	if (bitpos > T1_NMSEDEC_FRACBITS) {
+		return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
+	}
+	
+	return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
+}
+
+OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos) {
+	if (bitpos > T1_NMSEDEC_FRACBITS) {
+		return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
+	}
+
+    return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
+}
+
+void opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stride) {
+	opj_flag_t *np = flagsp - stride;
+	opj_flag_t *sp = flagsp + stride;
+
+	static const opj_flag_t mod[] = {
+		T1_SIG_S, T1_SIG_S|T1_SGN_S,
+		T1_SIG_E, T1_SIG_E|T1_SGN_E,
+		T1_SIG_W, T1_SIG_W|T1_SGN_W,
+		T1_SIG_N, T1_SIG_N|T1_SGN_N
+	};
+
+	np[-1] |= T1_SIG_SE;
+	np[0]  |= mod[s];
+	np[1]  |= T1_SIG_SW;
+
+	flagsp[-1] |= mod[s+2];
+	flagsp[0]  |= T1_SIG;
+	flagsp[1]  |= mod[s+4];
+
+	sp[-1] |= T1_SIG_NE;
+	sp[0]  |= mod[s+6];
+	sp[1]  |= T1_SIG_NW;
+}
+
+void opj_t1_enc_sigpass_step(   opj_t1_t *t1,
+                                opj_flag_t *flagsp,
+                                OPJ_INT32 *datap,
+                                OPJ_UINT32 orient,
+                                OPJ_INT32 bpno,
+                                OPJ_INT32 one,
+                                OPJ_INT32 *nmsedec,
+                                OPJ_BYTE type,
+                                OPJ_UINT32 vsc
+                                )
+{
+	OPJ_INT32 v;
+    OPJ_UINT32 flag;
+	
+	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+	
+	flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
+	if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
+		v = opj_int_abs(*datap) & one ? 1 : 0;
+		opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));	/* ESSAI */
+		if (type == T1_TYPE_RAW) {	/* BYPASS/LAZY MODE */
+			opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
+		} else {
+			opj_mqc_encode(mqc, (OPJ_UINT32)v);
+		}
+		if (v) {
+			v = *datap < 0 ? 1 : 0;
+			*nmsedec +=	opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno + T1_NMSEDEC_FRACBITS));
+			opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));	/* ESSAI */
+			if (type == T1_TYPE_RAW) {	/* BYPASS/LAZY MODE */
+				opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
+			} else {
+				opj_mqc_encode(mqc, (OPJ_UINT32)(v ^ opj_t1_getspb((OPJ_UINT32)flag)));
+			}
+			opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+		}
+		*flagsp |= T1_VISIT;
+	}
+}
+
+
+static INLINE void opj_t1_dec_sigpass_step_raw(
+                opj_t1_t *t1,
+                opj_flag_t *flagsp,
+                OPJ_INT32 *datap,
+                OPJ_INT32 orient,
+                OPJ_INT32 oneplushalf,
+                OPJ_INT32 vsc)
+{
+        OPJ_INT32 v, flag;
+        opj_raw_t *raw = t1->raw;       /* RAW component */
+        OPJ_ARG_NOT_USED(orient);
+       
+        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+        if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
+                        if (opj_raw_decode(raw)) {
+                                v = (OPJ_INT32)opj_raw_decode(raw);    /* ESSAI */
+                                *datap = v ? -oneplushalf : oneplushalf;
+                                opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+                        }
+                *flagsp |= T1_VISIT;
+        }
+}      
+
+INLINE void opj_t1_dec_sigpass_step_mqc(
+                opj_t1_t *t1,
+                opj_flag_t *flagsp,
+                OPJ_INT32 *datap,
+                OPJ_INT32 orient,
+                OPJ_INT32 oneplushalf)
+{
+        OPJ_INT32 v, flag;
+       
+        opj_mqc_t *mqc = t1->mqc;       /* MQC component */
+       
+        flag = *flagsp;
+        if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
+                        opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
+                        if (opj_mqc_decode(mqc)) {
+                                opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
+                                v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
+                                *datap = v ? -oneplushalf : oneplushalf;
+                                opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+                        }
+                *flagsp |= T1_VISIT;
+        }
+}                               /* VSC and  BYPASS by Antonin */
+
+INLINE void opj_t1_dec_sigpass_step_mqc_vsc(
+                opj_t1_t *t1,
+                opj_flag_t *flagsp,
+                OPJ_INT32 *datap,
+                OPJ_INT32 orient,
+                OPJ_INT32 oneplushalf,
+                OPJ_INT32 vsc)
+{
+        OPJ_INT32 v, flag;
+       
+        opj_mqc_t *mqc = t1->mqc;       /* MQC component */
+       
+        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+        if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
+                opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
+                if (opj_mqc_decode(mqc)) {
+                        opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
+                        v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
+                        *datap = v ? -oneplushalf : oneplushalf;
+                        opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+                }
+                *flagsp |= T1_VISIT;
+        }
+}                               /* VSC and  BYPASS by Antonin */
+
+
+
+void opj_t1_enc_sigpass(opj_t1_t *t1,
+                        OPJ_INT32 bpno,
+                        OPJ_UINT32 orient,
+                        OPJ_INT32 *nmsedec,
+                        OPJ_BYTE type,
+                        OPJ_UINT32 cblksty
+                        )
+{
+	OPJ_UINT32 i, j, k, vsc; 
+    OPJ_INT32 one;
+
+	*nmsedec = 0;
+	one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
+	for (k = 0; k < t1->h; k += 4) {
+		for (i = 0; i < t1->w; ++i) {
+			for (j = k; j < k + 4 && j < t1->h; ++j) {
+				vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
+				opj_t1_enc_sigpass_step(
+						t1,
+						&t1->flags[((j+1) * t1->flags_stride) + i + 1],
+						&t1->data[(j * t1->w) + i],
+						orient,
+						bpno,
+						one,
+						nmsedec,
+						type,
+						vsc);
+			}
+		}
+	}
+}
+
+void opj_t1_dec_sigpass_raw(
+                opj_t1_t *t1,
+                OPJ_INT32 bpno,
+                OPJ_INT32 orient,
+                OPJ_INT32 cblksty)
+{
+        OPJ_INT32 one, half, oneplushalf, vsc;
+        OPJ_UINT32 i, j, k; 
+        one = 1 << bpno;
+        half = one >> 1;
+        oneplushalf = one | half;
+        for (k = 0; k < t1->h; k += 4) {
+                for (i = 0; i < t1->w; ++i) {
+                        for (j = k; j < k + 4 && j < t1->h; ++j) {
+                                vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
+                                opj_t1_dec_sigpass_step_raw(
+                                                t1,
+                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
+                                                &t1->data[(j * t1->w) + i],
+                                                orient,
+                                                oneplushalf,
+                                                vsc);
+                        }
+                }
+        }
+}                               /* VSC and  BYPASS by Antonin */
+
+void opj_t1_dec_sigpass_mqc(
+                opj_t1_t *t1,
+                OPJ_INT32 bpno,
+                OPJ_INT32 orient)
+{
+        OPJ_INT32 one, half, oneplushalf;
+        OPJ_UINT32 i, j, k;
+        OPJ_INT32 *data1 = t1->data;
+        opj_flag_t *flags1 = &t1->flags[1];
+        one = 1 << bpno;
+        half = one >> 1;
+        oneplushalf = one | half;
+        for (k = 0; k < (t1->h & ~3u); k += 4) {
+                for (i = 0; i < t1->w; ++i) {
+                        OPJ_INT32 *data2 = data1 + i;
+                        opj_flag_t *flags2 = flags1 + i;
+                        flags2 += t1->flags_stride;
+                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+                        data2 += t1->w;
+                        flags2 += t1->flags_stride;
+                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+                        data2 += t1->w;
+                        flags2 += t1->flags_stride;
+                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+                        data2 += t1->w;
+                        flags2 += t1->flags_stride;
+                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+                        data2 += t1->w;
+                }
+                data1 += t1->w << 2;
+                flags1 += t1->flags_stride << 2;
+        }
+        for (i = 0; i < t1->w; ++i) {
+                OPJ_INT32 *data2 = data1 + i;
+                opj_flag_t *flags2 = flags1 + i;
+                for (j = k; j < t1->h; ++j) {
+                        flags2 += t1->flags_stride;
+                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+                        data2 += t1->w;
+                }
+        }
+}                               /* VSC and  BYPASS by Antonin */
+
+void opj_t1_dec_sigpass_mqc_vsc(
+                opj_t1_t *t1,
+                OPJ_INT32 bpno,
+                OPJ_INT32 orient)
+{
+        OPJ_INT32 one, half, oneplushalf, vsc;
+        OPJ_UINT32 i, j, k;
+        one = 1 << bpno;
+        half = one >> 1;
+        oneplushalf = one | half;
+        for (k = 0; k < t1->h; k += 4) {
+                for (i = 0; i < t1->w; ++i) {
+                        for (j = k; j < k + 4 && j < t1->h; ++j) {
+                                vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
+                                opj_t1_dec_sigpass_step_mqc_vsc(
+                                                t1,
+                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
+                                                &t1->data[(j * t1->w) + i],
+                                                orient,
+                                                oneplushalf,
+                                                vsc);
+                        }
+                }
+        }
+}                               /* VSC and  BYPASS by Antonin */
+
+
+
+void opj_t1_enc_refpass_step(   opj_t1_t *t1,
+                                opj_flag_t *flagsp,
+                                OPJ_INT32 *datap,
+                                OPJ_INT32 bpno,
+                                OPJ_INT32 one,
+                                OPJ_INT32 *nmsedec,
+                                OPJ_BYTE type,
+                                OPJ_UINT32 vsc)
+{
+	OPJ_INT32 v;
+	OPJ_UINT32 flag;
+	
+	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+	
+	flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
+	if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
+		*nmsedec += opj_t1_getnmsedec_ref((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno + T1_NMSEDEC_FRACBITS));
+		v = opj_int_abs(*datap) & one ? 1 : 0;
+		opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag(flag));	/* ESSAI */
+		if (type == T1_TYPE_RAW) {	/* BYPASS/LAZY MODE */
+			opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
+		} else {
+			opj_mqc_encode(mqc, (OPJ_UINT32)v);
+		}
+		*flagsp |= T1_REFINE;
+	}
+}
+
+INLINE void opj_t1_dec_refpass_step_raw(
+                opj_t1_t *t1,
+                opj_flag_t *flagsp,
+                OPJ_INT32 *datap,
+                OPJ_INT32 poshalf,
+                OPJ_INT32 neghalf,
+                OPJ_INT32 vsc)
+{
+        OPJ_INT32 v, t, flag;
+       
+        opj_raw_t *raw = t1->raw;       /* RAW component */
+       
+        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
+                        v = (OPJ_INT32)opj_raw_decode(raw);
+                t = v ? poshalf : neghalf;
+                *datap += *datap < 0 ? -t : t;
+                *flagsp |= T1_REFINE;
+        }
+}                               /* VSC and  BYPASS by Antonin  */
+
+INLINE void opj_t1_dec_refpass_step_mqc(
+                opj_t1_t *t1,
+                opj_flag_t *flagsp,
+                OPJ_INT32 *datap,
+                OPJ_INT32 poshalf,
+                OPJ_INT32 neghalf)
+{
+        OPJ_INT32 v, t, flag;
+       
+        opj_mqc_t *mqc = t1->mqc;       /* MQC component */
+       
+        flag = *flagsp;
+        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
+                opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag((OPJ_UINT32)flag));      /* ESSAI */
+                        v = opj_mqc_decode(mqc);
+                t = v ? poshalf : neghalf;
+                *datap += *datap < 0 ? -t : t;
+                *flagsp |= T1_REFINE;
+                }
+}                               /* VSC and  BYPASS by Antonin  */
+
+INLINE void opj_t1_dec_refpass_step_mqc_vsc(
+                opj_t1_t *t1,
+                opj_flag_t *flagsp,
+                OPJ_INT32 *datap,
+                OPJ_INT32 poshalf,
+                OPJ_INT32 neghalf,
+                OPJ_INT32 vsc)
+{
+        OPJ_INT32 v, t, flag;
+       
+        opj_mqc_t *mqc = t1->mqc;       /* MQC component */
+       
+        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
+                opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag((OPJ_UINT32)flag));      /* ESSAI */
+                v = opj_mqc_decode(mqc);
+                t = v ? poshalf : neghalf;
+                *datap += *datap < 0 ? -t : t;
+                *flagsp |= T1_REFINE;
+        }
+}                               /* VSC and  BYPASS by Antonin  */
+
+
+void opj_t1_enc_refpass(
+		opj_t1_t *t1,
+		OPJ_INT32 bpno,
+		OPJ_INT32 *nmsedec,
+		OPJ_BYTE type,
+		OPJ_UINT32 cblksty)
+{
+	OPJ_UINT32 i, j, k, vsc;
+    OPJ_INT32 one;
+
+	*nmsedec = 0;
+	one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
+	for (k = 0; k < t1->h; k += 4) {
+		for (i = 0; i < t1->w; ++i) {
+			for (j = k; j < k + 4 && j < t1->h; ++j) {
+				vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
+				opj_t1_enc_refpass_step(
+						t1,
+						&t1->flags[((j+1) * t1->flags_stride) + i + 1],
+						&t1->data[(j * t1->w) + i],
+						bpno,
+						one,
+						nmsedec,
+						type,
+						vsc);
+			}
+		}
+	}
+}
+
+void opj_t1_dec_refpass_raw(
+                opj_t1_t *t1,
+                OPJ_INT32 bpno,
+                OPJ_INT32 cblksty)
+{
+        OPJ_INT32 one, poshalf, neghalf;
+        OPJ_UINT32 i, j, k;
+        OPJ_INT32 vsc;
+        one = 1 << bpno;
+        poshalf = one >> 1;
+        neghalf = bpno > 0 ? -poshalf : -1;
+        for (k = 0; k < t1->h; k += 4) {
+                for (i = 0; i < t1->w; ++i) {
+                        for (j = k; j < k + 4 && j < t1->h; ++j) {
+                                vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
+                                opj_t1_dec_refpass_step_raw(
+                                                t1,
+                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
+                                                &t1->data[(j * t1->w) + i],
+                                                poshalf,
+                                                neghalf,
+                                                vsc);
+                        }
+                }
+        }
+}                               /* VSC and  BYPASS by Antonin */
+
+void opj_t1_dec_refpass_mqc(
+                opj_t1_t *t1,
+                OPJ_INT32 bpno)
+{
+        OPJ_INT32 one, poshalf, neghalf;
+        OPJ_UINT32 i, j, k;
+        OPJ_INT32 *data1 = t1->data;
+        opj_flag_t *flags1 = &t1->flags[1];
+        one = 1 << bpno;
+        poshalf = one >> 1;
+        neghalf = bpno > 0 ? -poshalf : -1;
+        for (k = 0; k < (t1->h & ~3u); k += 4) {
+                for (i = 0; i < t1->w; ++i) {
+                        OPJ_INT32 *data2 = data1 + i;
+                        opj_flag_t *flags2 = flags1 + i;
+                        flags2 += t1->flags_stride;
+                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+                        data2 += t1->w;
+                        flags2 += t1->flags_stride;
+                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+                        data2 += t1->w;
+                        flags2 += t1->flags_stride;
+                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+                        data2 += t1->w;
+                        flags2 += t1->flags_stride;
+                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+                        data2 += t1->w;
+                }
+                data1 += t1->w << 2;
+                flags1 += t1->flags_stride << 2;
+        }
+        for (i = 0; i < t1->w; ++i) {
+                OPJ_INT32 *data2 = data1 + i;
+                opj_flag_t *flags2 = flags1 + i;
+                for (j = k; j < t1->h; ++j) {
+                        flags2 += t1->flags_stride;
+                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+                        data2 += t1->w;
+                }
+        }
+}                               /* VSC and  BYPASS by Antonin */
+
+void opj_t1_dec_refpass_mqc_vsc(
+                opj_t1_t *t1,
+                OPJ_INT32 bpno)
+{
+        OPJ_INT32 one, poshalf, neghalf;
+        OPJ_UINT32 i, j, k;
+        OPJ_INT32 vsc;
+        one = 1 << bpno;
+        poshalf = one >> 1;
+        neghalf = bpno > 0 ? -poshalf : -1;
+        for (k = 0; k < t1->h; k += 4) {
+                for (i = 0; i < t1->w; ++i) {
+                        for (j = k; j < k + 4 && j < t1->h; ++j) {
+                                vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0;
+                                opj_t1_dec_refpass_step_mqc_vsc(
+                                                t1,
+                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
+                                                &t1->data[(j * t1->w) + i],
+                                                poshalf,
+                                                neghalf,
+                                                vsc);
+                        }
+                }
+        }
+}                               /* VSC and  BYPASS by Antonin */
+
+
+void opj_t1_enc_clnpass_step(
+		opj_t1_t *t1,
+		opj_flag_t *flagsp,
+		OPJ_INT32 *datap,
+		OPJ_UINT32 orient,
+		OPJ_INT32 bpno,
+		OPJ_INT32 one,
+		OPJ_INT32 *nmsedec,
+		OPJ_UINT32 partial,
+		OPJ_UINT32 vsc)
+{
+	OPJ_INT32 v;
+	OPJ_UINT32 flag;
+	
+	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+	
+	flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
+	if (partial) {
+		goto LABEL_PARTIAL;
+	}
+	if (!(*flagsp & (T1_SIG | T1_VISIT))) {
+		opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));
+		v = opj_int_abs(*datap) & one ? 1 : 0;
+		opj_mqc_encode(mqc, (OPJ_UINT32)v);
+		if (v) {
+LABEL_PARTIAL:
+			*nmsedec += opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno + T1_NMSEDEC_FRACBITS));
+			opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));
+			v = *datap < 0 ? 1 : 0;
+			opj_mqc_encode(mqc, (OPJ_UINT32)(v ^ opj_t1_getspb((OPJ_UINT32)flag)));
+			opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+		}
+	}
+	*flagsp &= ~T1_VISIT;
+}
+
+static void opj_t1_dec_clnpass_step_partial(
+		opj_t1_t *t1,
+		opj_flag_t *flagsp,
+		OPJ_INT32 *datap,
+		OPJ_INT32 orient,
+		OPJ_INT32 oneplushalf)
+{
+	OPJ_INT32 v, flag;
+	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+	
+	OPJ_ARG_NOT_USED(orient);
+	
+	flag = *flagsp;
+	opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
+	v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
+	*datap = v ? -oneplushalf : oneplushalf;
+	opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+	*flagsp &= ~T1_VISIT;
+}				/* VSC and  BYPASS by Antonin */
+
+static void opj_t1_dec_clnpass_step(
+		opj_t1_t *t1,
+		opj_flag_t *flagsp,
+		OPJ_INT32 *datap,
+		OPJ_INT32 orient,
+		OPJ_INT32 oneplushalf)
+{
+	OPJ_INT32 v, flag;
+	
+	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+	
+	flag = *flagsp;
+	if (!(flag & (T1_SIG | T1_VISIT))) {
+		opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
+		if (opj_mqc_decode(mqc)) {
+			opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
+			v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
+			*datap = v ? -oneplushalf : oneplushalf;
+			opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+		}
+	}
+	*flagsp &= ~T1_VISIT;
+}				/* VSC and  BYPASS by Antonin */
+
+static void opj_t1_dec_clnpass_step_vsc(
+		opj_t1_t *t1,
+		opj_flag_t *flagsp,
+		OPJ_INT32 *datap,
+		OPJ_INT32 orient,
+		OPJ_INT32 oneplushalf,
+		OPJ_INT32 partial,
+		OPJ_INT32 vsc)
+{
+	OPJ_INT32 v, flag;
+	
+	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+	
+	flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+	if (partial) {
+		goto LABEL_PARTIAL;
+	}
+	if (!(flag & (T1_SIG | T1_VISIT))) {
+		opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
+		if (opj_mqc_decode(mqc)) {
+LABEL_PARTIAL:
+			opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
+			v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
+			*datap = v ? -oneplushalf : oneplushalf;
+			opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+		}
+	}
+	*flagsp &= ~T1_VISIT;
+}
+
+void opj_t1_enc_clnpass(
+		opj_t1_t *t1,
+		OPJ_INT32 bpno,
+		OPJ_UINT32 orient,
+		OPJ_INT32 *nmsedec,
+		OPJ_UINT32 cblksty)
+{
+	OPJ_UINT32 i, j, k;
+	OPJ_INT32 one;
+	OPJ_UINT32 agg, runlen, vsc;
+	
+	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+	
+	*nmsedec = 0;
+	one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
+	for (k = 0; k < t1->h; k += 4) {
+		for (i = 0; i < t1->w; ++i) {
+			if (k + 3 < t1->h) {
+				if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+					agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+						|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+						|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+						|| (MACRO_t1_flags(1 + k + 3,1 + i) 
+						& (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW |	T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
+				} else {
+					agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+						|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+						|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+						|| MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
+				}
+			} else {
+				agg = 0;
+			}
+			if (agg) {
+				for (runlen = 0; runlen < 4; ++runlen) {
+					if (opj_int_abs(t1->data[((k + runlen)*t1->w) + i]) & one)
+						break;
+				}
+				opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
+				opj_mqc_encode(mqc, runlen != 4);
+				if (runlen == 4) {
+					continue;
+				}
+				opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
+				opj_mqc_encode(mqc, runlen >> 1);
+				opj_mqc_encode(mqc, runlen & 1);
+			} else {
+				runlen = 0;
+			}
+			for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
+				vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
+				opj_t1_enc_clnpass_step(
+						t1,
+						&t1->flags[((j+1) * t1->flags_stride) + i + 1],
+						&t1->data[(j * t1->w) + i],
+						orient,
+						bpno,
+						one,
+						nmsedec,
+						agg && (j == k + runlen),
+						vsc);
+			}
+		}
+	}
+}
+
+static void opj_t1_dec_clnpass(
+		opj_t1_t *t1,
+		OPJ_INT32 bpno,
+		OPJ_INT32 orient,
+		OPJ_INT32 cblksty)
+{
+	OPJ_INT32 one, half, oneplushalf, agg, runlen, vsc;
+    OPJ_UINT32 i, j, k;
+	OPJ_INT32 segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;
+	
+	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+	
+	one = 1 << bpno;
+	half = one >> 1;
+	oneplushalf = one | half;
+	if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+	for (k = 0; k < t1->h; k += 4) {
+		for (i = 0; i < t1->w; ++i) {
+			if (k + 3 < t1->h) {
+					agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+						|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+						|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+						|| (MACRO_t1_flags(1 + k + 3,1 + i) 
+						& (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW |	T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
+				} else {
+				agg = 0;
+			}
+			if (agg) {
+				opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
+				if (!opj_mqc_decode(mqc)) {
+					continue;
+				}
+				opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
+				runlen = opj_mqc_decode(mqc);
+				runlen = (runlen << 1) | opj_mqc_decode(mqc);
+			} else {
+				runlen = 0;
+			}
+			for (j = k + (OPJ_UINT32)runlen; j < k + 4 && j < t1->h; ++j) {
+					vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
+					opj_t1_dec_clnpass_step_vsc(
+						t1,
+						&t1->flags[((j+1) * t1->flags_stride) + i + 1],
+						&t1->data[(j * t1->w) + i],
+						orient,
+						oneplushalf,
+						agg && (j == k + (OPJ_UINT32)runlen),
+						vsc);
+			}
+		}
+	}
+	} else {
+		OPJ_INT32 *data1 = t1->data;
+		opj_flag_t *flags1 = &t1->flags[1];
+		for (k = 0; k < (t1->h & ~3u); k += 4) {
+			for (i = 0; i < t1->w; ++i) {
+				OPJ_INT32 *data2 = data1 + i;
+				opj_flag_t *flags2 = flags1 + i;
+				agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+					|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+					|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+					|| MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
+				if (agg) {
+					opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
+					if (!opj_mqc_decode(mqc)) {
+						continue;
+					}
+					opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
+					runlen = opj_mqc_decode(mqc);
+					runlen = (runlen << 1) | opj_mqc_decode(mqc);
+					flags2 += (OPJ_UINT32)runlen * t1->flags_stride;
+					data2 += (OPJ_UINT32)runlen * t1->w;
+					for (j = k + (OPJ_UINT32)runlen; j < k + 4 && j < t1->h; ++j) {
+						flags2 += t1->flags_stride;
+						if (agg && (j == k + (OPJ_UINT32)runlen)) {
+							opj_t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf);
+						} else {
+							opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+						}
+						data2 += t1->w;
+					}
+				} else {
+					flags2 += t1->flags_stride;
+					opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+					data2 += t1->w;
+					flags2 += t1->flags_stride;
+					opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+					data2 += t1->w;
+					flags2 += t1->flags_stride;
+					opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+					data2 += t1->w;
+					flags2 += t1->flags_stride;
+					opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+					data2 += t1->w;
+				}
+			}
+			data1 += t1->w << 2;
+			flags1 += t1->flags_stride << 2;
+		}
+		for (i = 0; i < t1->w; ++i) {
+			OPJ_INT32 *data2 = data1 + i;
+			opj_flag_t *flags2 = flags1 + i;
+			for (j = k; j < t1->h; ++j) {
+				flags2 += t1->flags_stride;
+				opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+				data2 += t1->w;
+			}
+		}
+	}
+
+	if (segsym) {
+		OPJ_INT32 v = 0;
+		opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
+		v = opj_mqc_decode(mqc);
+		v = (v << 1) | opj_mqc_decode(mqc);
+		v = (v << 1) | opj_mqc_decode(mqc);
+		v = (v << 1) | opj_mqc_decode(mqc);
+		/*
+		if (v!=0xa) {
+			opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
+		} 
+		*/
+	}
+}				/* VSC and  BYPASS by Antonin */
+
+
+/** mod fixed_quality */
+static OPJ_FLOAT64 opj_t1_getwmsedec(
+		OPJ_INT32 nmsedec,
+		OPJ_UINT32 compno,
+		OPJ_UINT32 level,
+		OPJ_UINT32 orient,
+		OPJ_INT32 bpno,
+		OPJ_UINT32 qmfbid,
+		OPJ_FLOAT64 stepsize,
+		OPJ_UINT32 numcomps,
+		const OPJ_FLOAT64 * mct_norms)
+{
+	OPJ_FLOAT64 w1 = 1, w2, wmsedec;
+    OPJ_ARG_NOT_USED(numcomps);
+
+	if (mct_norms) {
+		w1 = mct_norms[compno];
+	}
+
+	if (qmfbid == 1) {
+		w2 = opj_dwt_getnorm(level, orient);
+	} else {	/* if (qmfbid == 0) */
+		w2 = opj_dwt_getnorm_real(level, orient);
+	}
+
+	wmsedec = w1 * w2 * stepsize * (1 << bpno);
+	wmsedec *= wmsedec * nmsedec / 8192.0;
+
+	return wmsedec;
+}
+
+OPJ_BOOL opj_t1_allocate_buffers(
+		opj_t1_t *t1,
+		OPJ_UINT32 w,
+		OPJ_UINT32 h)
+{
+	OPJ_UINT32 datasize=w * h;
+	OPJ_UINT32 flagssize;
+
+	if(datasize > t1->datasize){
+		opj_aligned_free(t1->data);
+		t1->data = (OPJ_INT32*) opj_aligned_malloc(datasize * sizeof(OPJ_INT32));
+		if(!t1->data){
+			return OPJ_FALSE;
+		}
+		t1->datasize=datasize;
+	}
+	memset(t1->data,0,datasize * sizeof(OPJ_INT32));
+
+	t1->flags_stride=w+2;
+	flagssize=t1->flags_stride * (h+2);
+
+	if(flagssize > t1->flagssize){
+		opj_aligned_free(t1->flags);
+		t1->flags = (opj_flag_t*) opj_aligned_malloc(flagssize * sizeof(opj_flag_t));
+		if(!t1->flags){
+			return OPJ_FALSE;
+		}
+		t1->flagssize=flagssize;
+	}
+	memset(t1->flags,0,flagssize * sizeof(opj_flag_t));
+
+	t1->w=w;
+	t1->h=h;
+
+	return OPJ_TRUE;
+}
+
+/* ----------------------------------------------------------------------- */
+
+/* ----------------------------------------------------------------------- */
+/**
+ * Creates a new Tier 1 handle
+ * and initializes the look-up tables of the Tier-1 coder/decoder
+ * @return a new T1 handle if successful, returns NULL otherwise
+*/
+opj_t1_t* opj_t1_create()
+{
+	opj_t1_t *l_t1 = 00;
+
+	l_t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t));
+	if (!l_t1) {
+		return 00;
+	}
+	memset(l_t1,0,sizeof(opj_t1_t));
+
+	/* create MQC and RAW handles */
+	l_t1->mqc = opj_mqc_create();
+	if (! l_t1->mqc) {
+		opj_t1_destroy(l_t1);
+		return 00;
+	}
+
+	l_t1->raw = opj_raw_create();
+	if (! l_t1->raw) {
+		opj_t1_destroy(l_t1);
+		return 00;
+	}
+
+	return l_t1;
+}
+
+
+/**
+ * Destroys a previously created T1 handle
+ *
+ * @param p_t1 Tier 1 handle to destroy
+*/
+void opj_t1_destroy(opj_t1_t *p_t1)
+{
+	if (! p_t1) {
+		return;
+	}
+
+	/* destroy MQC and RAW handles */
+	opj_mqc_destroy(p_t1->mqc);
+	p_t1->mqc = 00;
+	opj_raw_destroy(p_t1->raw);
+	p_t1->raw = 00;
+	
+    if (p_t1->data) {
+		opj_aligned_free(p_t1->data);
+		p_t1->data = 00;
+	}
+
+	if (p_t1->flags) {
+		opj_aligned_free(p_t1->flags);
+		p_t1->flags = 00;
+	}
+
+	opj_free(p_t1);
+}
+
+OPJ_BOOL opj_t1_decode_cblks(   opj_t1_t* t1,
+                            opj_tcd_tilecomp_t* tilec,
+                            opj_tccp_t* tccp
+                            )
+{
+	OPJ_UINT32 resno, bandno, precno, cblkno;
+	OPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+
+	for (resno = 0; resno < tilec->minimum_num_resolutions; ++resno) {
+		opj_tcd_resolution_t* res = &tilec->resolutions[resno];
+
+		for (bandno = 0; bandno < res->numbands; ++bandno) {
+			opj_tcd_band_t* restrict band = &res->bands[bandno];
+
+			for (precno = 0; precno < res->pw * res->ph; ++precno) {
+				opj_tcd_precinct_t* precinct = &band->precincts[precno];
+
+				for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
+					opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
+					OPJ_INT32* restrict datap;
+					/*void* restrict tiledp;*/
+					OPJ_UINT32 cblk_w, cblk_h;
+					OPJ_INT32 x, y;
+					OPJ_UINT32 i, j;
+
+                    if (OPJ_FALSE == opj_t1_decode_cblk(
+                                            t1,
+                                            cblk,
+                                            band->bandno,
+                                            (OPJ_UINT32)tccp->roishift,
+                                            tccp->cblksty)) {
+                            return OPJ_FALSE;
+                    }
+
+					x = cblk->x0 - band->x0;
+					y = cblk->y0 - band->y0;
+					if (band->bandno & 1) {
+						opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
+						x += pres->x1 - pres->x0;
+					}
+					if (band->bandno & 2) {
+						opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
+						y += pres->y1 - pres->y0;
+					}
+
+					datap=t1->data;
+					cblk_w = t1->w;
+					cblk_h = t1->h;
+
+					if (tccp->roishift) {
+						OPJ_INT32 thresh = 1 << tccp->roishift;
+						for (j = 0; j < cblk_h; ++j) {
+							for (i = 0; i < cblk_w; ++i) {
+								OPJ_INT32 val = datap[(j * cblk_w) + i];
+								OPJ_INT32 mag = abs(val);
+								if (mag >= thresh) {
+									mag >>= tccp->roishift;
+									datap[(j * cblk_w) + i] = val < 0 ? -mag : mag;
+								}
+							}
+						}
+					}
+
+					/*tiledp=(void*)&tilec->data[(y * tile_w) + x];*/
+					if (tccp->qmfbid == 1) {
+                        OPJ_INT32* restrict tiledp = &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
+						for (j = 0; j < cblk_h; ++j) {
+							for (i = 0; i < cblk_w; ++i) {
+								OPJ_INT32 tmp = datap[(j * cblk_w) + i];
+								((OPJ_INT32*)tiledp)[(j * tile_w) + i] = tmp / 2;
+							}
+						}
+					} else {		/* if (tccp->qmfbid == 0) */
+                        OPJ_FLOAT32* restrict tiledp = (OPJ_FLOAT32*) &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
+						for (j = 0; j < cblk_h; ++j) {
+                            OPJ_FLOAT32* restrict tiledp2 = tiledp;
+							for (i = 0; i < cblk_w; ++i) {
+                                OPJ_FLOAT32 tmp = (OPJ_FLOAT32)*datap * band->stepsize;
+                                *tiledp2 = tmp;
+                                datap++;
+                                tiledp2++;
+								/*float tmp = datap[(j * cblk_w) + i] * band->stepsize;
+								((float*)tiledp)[(j * tile_w) + i] = tmp;*/
+
+							}
+                            tiledp += tile_w;
+						}
+					}
+                    /*opj_free(cblk->data);
+					opj_free(cblk->segs);*/
+					/*cblk->segs = 00;*/
+				} /* cblkno */
+                /*opj_free(precinct->cblks.dec);*/
+			} /* precno */
+		} /* bandno */
+	} /* resno */
+        return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
+                            opj_tcd_cblk_dec_t* cblk,
+                            OPJ_UINT32 orient,
+                            OPJ_UINT32 roishift,
+                            OPJ_UINT32 cblksty)
+{
+	opj_raw_t *raw = t1->raw;	/* RAW component */
+	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+
+	OPJ_INT32 bpno;
+	OPJ_UINT32 passtype;
+	OPJ_UINT32 segno, passno;
+	OPJ_BYTE type = T1_TYPE_MQ; /* BYPASS mode */
+
+	if(!opj_t1_allocate_buffers(
+				t1,
+				(OPJ_UINT32)(cblk->x1 - cblk->x0),
+				(OPJ_UINT32)(cblk->y1 - cblk->y0)))
+	{
+		return OPJ_FALSE;
+	}
+
+	bpno = (OPJ_INT32)(roishift + cblk->numbps - 1);
+	passtype = 2;
+
+	opj_mqc_resetstates(mqc);
+	opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+	opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+	opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+
+	for (segno = 0; segno < cblk->real_num_segs; ++segno) {
+		opj_tcd_seg_t *seg = &cblk->segs[segno];
+
+		/* BYPASS mode */
+		type = ((bpno <= ((OPJ_INT32) (cblk->numbps) - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
+		/* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */
+		if(seg->data == 00){
+			continue;
+		}
+		if (type == T1_TYPE_RAW) {
+			opj_raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len);
+		} else {
+            if (OPJ_FALSE == opj_mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len)) {
+                    return OPJ_FALSE;
+            }
+		}
+
+		for (passno = 0; passno < seg->real_num_passes; ++passno) {
+            switch (passtype) {
+                case 0:
+                    if (type == T1_TYPE_RAW) {
+                        opj_t1_dec_sigpass_raw(t1, bpno+1, (OPJ_INT32)orient, (OPJ_INT32)cblksty);
+                    } else {
+                        if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+                            opj_t1_dec_sigpass_mqc_vsc(t1, bpno+1, (OPJ_INT32)orient);
+                        } else {
+                            opj_t1_dec_sigpass_mqc(t1, bpno+1, (OPJ_INT32)orient);
+                        }
+                    }
+                    break;
+                case 1:
+                    if (type == T1_TYPE_RAW) {
+                            opj_t1_dec_refpass_raw(t1, bpno+1, (OPJ_INT32)cblksty);
+                    } else {
+                        if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+                            opj_t1_dec_refpass_mqc_vsc(t1, bpno+1);
+                        } else {
+                            opj_t1_dec_refpass_mqc(t1, bpno+1);
+                        }
+                    }
+                    break;
+                case 2:
+                    opj_t1_dec_clnpass(t1, bpno+1, (OPJ_INT32)orient, (OPJ_INT32)cblksty);
+                    break;
+            }
+
+			if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
+				opj_mqc_resetstates(mqc);
+				opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+				opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+				opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+			}
+			if (++passtype == 3) {
+				passtype = 0;
+				bpno--;
+			}
+		}
+	}
+        return OPJ_TRUE;
+}
+
+
+
+
+OPJ_BOOL opj_t1_encode_cblks(   opj_t1_t *t1,
+                                opj_tcd_tile_t *tile,
+                                opj_tcp_t *tcp,
+                                const OPJ_FLOAT64 * mct_norms
+                                )
+{
+	OPJ_UINT32 compno, resno, bandno, precno, cblkno;
+
+	tile->distotile = 0;		/* fixed_quality */
+
+	for (compno = 0; compno < tile->numcomps; ++compno) {
+		opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
+		opj_tccp_t* tccp = &tcp->tccps[compno];
+		OPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+
+		for (resno = 0; resno < tilec->numresolutions; ++resno) {
+			opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+
+			for (bandno = 0; bandno < res->numbands; ++bandno) {
+				opj_tcd_band_t* restrict band = &res->bands[bandno];
+                OPJ_INT32 bandconst = 8192 * 8192 / ((OPJ_INT32) floor(band->stepsize * 8192));
+
+				for (precno = 0; precno < res->pw * res->ph; ++precno) {
+					opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+					for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
+						opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
+						OPJ_INT32 * restrict datap;
+						OPJ_INT32* restrict tiledp;
+						OPJ_UINT32 cblk_w;
+						OPJ_UINT32 cblk_h;
+						OPJ_UINT32 i, j;
+
+						OPJ_INT32 x = cblk->x0 - band->x0;
+						OPJ_INT32 y = cblk->y0 - band->y0;
+						if (band->bandno & 1) {
+							opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
+							x += pres->x1 - pres->x0;
+						}
+						if (band->bandno & 2) {
+							opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
+							y += pres->y1 - pres->y0;
+						}
+
+						if(!opj_t1_allocate_buffers(
+									t1,
+									(OPJ_UINT32)(cblk->x1 - cblk->x0),
+									(OPJ_UINT32)(cblk->y1 - cblk->y0)))
+						{
+							return OPJ_FALSE;
+						}
+
+						datap=t1->data;
+						cblk_w = t1->w;
+						cblk_h = t1->h;
+
+						tiledp=&tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
+						if (tccp->qmfbid == 1) {
+							for (j = 0; j < cblk_h; ++j) {
+								for (i = 0; i < cblk_w; ++i) {
+									OPJ_INT32 tmp = tiledp[(j * tile_w) + i];
+									datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS;
+								}
+							}
+						} else {		/* if (tccp->qmfbid == 0) */
+							for (j = 0; j < cblk_h; ++j) {
+								for (i = 0; i < cblk_w; ++i) {
+									OPJ_INT32 tmp = tiledp[(j * tile_w) + i];
+									datap[(j * cblk_w) + i] =
+										opj_int_fix_mul(
+										tmp,
+										bandconst) >> (11 - T1_NMSEDEC_FRACBITS);
+								}
+							}
+						}
+
+						opj_t1_encode_cblk(
+								t1,
+								cblk,
+								band->bandno,
+								compno,
+								tilec->numresolutions - 1 - resno,
+								tccp->qmfbid,
+								band->stepsize,
+								tccp->cblksty,
+								tile->numcomps,
+								tile,
+								mct_norms);
+
+					} /* cblkno */
+				} /* precno */
+			} /* bandno */
+		} /* resno  */
+	} /* compno  */
+	return OPJ_TRUE;
+}
+
+/** mod fixed_quality */
+void opj_t1_encode_cblk(opj_t1_t *t1,
+                        opj_tcd_cblk_enc_t* cblk,
+                        OPJ_UINT32 orient,
+                        OPJ_UINT32 compno,
+                        OPJ_UINT32 level,
+                        OPJ_UINT32 qmfbid,
+                        OPJ_FLOAT64 stepsize,
+                        OPJ_UINT32 cblksty,
+                        OPJ_UINT32 numcomps,
+                        opj_tcd_tile_t * tile,
+                        const OPJ_FLOAT64 * mct_norms)
+{
+	OPJ_FLOAT64 cumwmsedec = 0.0;
+
+	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+
+	OPJ_UINT32 passno;
+	OPJ_INT32 bpno;
+	OPJ_UINT32 passtype;
+	OPJ_INT32 nmsedec = 0;
+	OPJ_INT32 max;
+	OPJ_UINT32 i;
+	OPJ_BYTE type = T1_TYPE_MQ;
+	OPJ_FLOAT64 tempwmsedec;
+
+	max = 0;
+	for (i = 0; i < t1->w * t1->h; ++i) {
+		OPJ_INT32 tmp = abs(t1->data[i]);
+		max = opj_int_max(max, tmp);
+	}
+
+	cblk->numbps = max ? (OPJ_UINT32)((opj_int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS) : 0;
+
+	bpno = (OPJ_INT32)(cblk->numbps - 1);
+	passtype = 2;
+
+	opj_mqc_resetstates(mqc);
+	opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+	opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+	opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+	opj_mqc_init_enc(mqc, cblk->data);
+
+	for (passno = 0; bpno >= 0; ++passno) {
+		opj_tcd_pass_t *pass = &cblk->passes[passno];
+		OPJ_UINT32 correction = 3;
+		type = ((bpno < ((OPJ_INT32) (cblk->numbps) - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
+
+		switch (passtype) {
+			case 0:
+				opj_t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty);
+				break;
+			case 1:
+				opj_t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty);
+				break;
+			case 2:
+				opj_t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty);
+				/* code switch SEGMARK (i.e. SEGSYM) */
+				if (cblksty & J2K_CCP_CBLKSTY_SEGSYM)
+					opj_mqc_segmark_enc(mqc);
+				break;
+		}
+
+		/* fixed_quality */
+		tempwmsedec = opj_t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps,mct_norms) ;
+		cumwmsedec += tempwmsedec;
+		tile->distotile += tempwmsedec;
+
+		/* Code switch "RESTART" (i.e. TERMALL) */
+		if ((cblksty & J2K_CCP_CBLKSTY_TERMALL)	&& !((passtype == 2) && (bpno - 1 < 0))) {
+			if (type == T1_TYPE_RAW) {
+				opj_mqc_flush(mqc);
+				correction = 1;
+				/* correction = mqc_bypass_flush_enc(); */
+			} else {			/* correction = mqc_restart_enc(); */
+				opj_mqc_flush(mqc);
+				correction = 1;
+			}
+			pass->term = 1;
+		} else {
+			if (((bpno < ((OPJ_INT32) (cblk->numbps) - 4) && (passtype > 0))
+				|| ((bpno == ((OPJ_INT32)cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) {
+				if (type == T1_TYPE_RAW) {
+					opj_mqc_flush(mqc);
+					correction = 1;
+					/* correction = mqc_bypass_flush_enc(); */
+				} else {		/* correction = mqc_restart_enc(); */
+					opj_mqc_flush(mqc);
+					correction = 1;
+				}
+				pass->term = 1;
+			} else {
+				pass->term = 0;
+			}
+		}
+
+		if (++passtype == 3) {
+			passtype = 0;
+			bpno--;
+		}
+
+		if (pass->term && bpno > 0) {
+			type = ((bpno < ((OPJ_INT32) (cblk->numbps) - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
+			if (type == T1_TYPE_RAW)
+				opj_mqc_bypass_init_enc(mqc);
+			else
+				opj_mqc_restart_init_enc(mqc);
+		}
+
+		pass->distortiondec = cumwmsedec;
+		pass->rate = opj_mqc_numbytes(mqc) + correction;	/* FIXME */
+
+		/* Code-switch "RESET" */
+		if (cblksty & J2K_CCP_CBLKSTY_RESET)
+			opj_mqc_reset_enc(mqc);
+	}
+
+	/* Code switch "ERTERM" (i.e. PTERM) */
+	if (cblksty & J2K_CCP_CBLKSTY_PTERM)
+		opj_mqc_erterm_enc(mqc);
+	else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY))
+		opj_mqc_flush(mqc);
+
+	cblk->totalpasses = passno;
+
+	for (passno = 0; passno<cblk->totalpasses; passno++) {
+		opj_tcd_pass_t *pass = &cblk->passes[passno];
+		if (pass->rate > opj_mqc_numbytes(mqc))
+			pass->rate = opj_mqc_numbytes(mqc);
+		/*Preventing generation of FF as last data byte of a pass*/
+		if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){
+			pass->rate--;
+		}
+		pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
+	}
+}
+
+#if 0
+void opj_t1_dec_refpass_step(   opj_t1_t *t1,
+                                opj_flag_t *flagsp,
+                                OPJ_INT32 *datap,
+                                OPJ_INT32 poshalf,
+                                OPJ_INT32 neghalf,
+                                OPJ_BYTE type,
+                                OPJ_UINT32 vsc)
+{
+	OPJ_INT32  t;
+	OPJ_UINT32 v,flag;
+
+	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+	opj_raw_t *raw = t1->raw;	/* RAW component */
+
+	flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+	if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
+		opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag(flag));	/* ESSAI */
+		if (type == T1_TYPE_RAW) {
+			v = opj_raw_decode(raw);
+		} else {
+			v = opj_mqc_decode(mqc);
+		}
+		t = v ? poshalf : neghalf;
+		*datap += *datap < 0 ? -t : t;
+		*flagsp |= T1_REFINE;
+	}
+}				/* VSC and  BYPASS by Antonin  */
+#endif
+
+
+
+#if 0
+void opj_t1_dec_sigpass_step(   opj_t1_t *t1,
+                                opj_flag_t *flagsp,
+                                OPJ_INT32 *datap,
+                                OPJ_UINT32 orient,
+                                OPJ_INT32 oneplushalf,
+                                OPJ_BYTE type,
+                                OPJ_UINT32 vsc)
+{
+	OPJ_UINT32 v, flag;
+
+	opj_raw_t *raw = t1->raw;	/* RAW component */
+	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+
+	flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+	if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
+		if (type == T1_TYPE_RAW) {
+			if (opj_raw_decode(raw)) {
+				v = opj_raw_decode(raw);	/* ESSAI */
+				*datap = v ? -oneplushalf : oneplushalf;
+				opj_t1_updateflags(flagsp, v, t1->flags_stride);
+			}
+		} else {
+			opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));
+			if (opj_mqc_decode(mqc)) {
+				opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));
+				v = opj_mqc_decode(mqc) ^ opj_t1_getspb(flag);
+				*datap = v ? -oneplushalf : oneplushalf;
+				opj_t1_updateflags(flagsp, v, t1->flags_stride);
+			}
+		}
+		*flagsp |= T1_VISIT;
+	}
+}				/* VSC and  BYPASS by Antonin */
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.h
new file mode 100644
index 0000000..e5be70e
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.h
@@ -0,0 +1,163 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __T1_H
+#define __T1_H
+/**
+@file t1.h
+@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1)
+
+The functions in T1.C have for goal to realize the tier-1 coding operation. The functions
+in T1.C are used by some function in TCD.C.
+*/
+
+/** @defgroup T1 T1 - Implementation of the tier-1 coding */
+/*@{*/
+
+/* ----------------------------------------------------------------------- */
+#define T1_NMSEDEC_BITS 7
+
+#define T1_SIG_NE 0x0001	/**< Context orientation : North-East direction */
+#define T1_SIG_SE 0x0002	/**< Context orientation : South-East direction */
+#define T1_SIG_SW 0x0004	/**< Context orientation : South-West direction */
+#define T1_SIG_NW 0x0008	/**< Context orientation : North-West direction */
+#define T1_SIG_N 0x0010		/**< Context orientation : North direction */
+#define T1_SIG_E 0x0020		/**< Context orientation : East direction */
+#define T1_SIG_S 0x0040		/**< Context orientation : South direction */
+#define T1_SIG_W 0x0080		/**< Context orientation : West direction */
+#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)
+#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
+
+#define T1_SGN_N 0x0100
+#define T1_SGN_E 0x0200
+#define T1_SGN_S 0x0400
+#define T1_SGN_W 0x0800
+#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)
+
+#define T1_SIG 0x1000
+#define T1_REFINE 0x2000
+#define T1_VISIT 0x4000
+
+#define T1_NUMCTXS_ZC 9
+#define T1_NUMCTXS_SC 5
+#define T1_NUMCTXS_MAG 3
+#define T1_NUMCTXS_AGG 1
+#define T1_NUMCTXS_UNI 1
+
+#define T1_CTXNO_ZC 0
+#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
+#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC)
+#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
+#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
+#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
+
+#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
+
+#define T1_TYPE_MQ 0	/**< Normal coding using entropy coder */
+#define T1_TYPE_RAW 1	/**< No encoding the information is store under raw format in codestream (mode switch RAW)*/
+
+/* ----------------------------------------------------------------------- */
+
+typedef OPJ_INT16 opj_flag_t;
+
+/**
+Tier-1 coding (coding of code-block coefficients)
+*/
+typedef struct opj_t1 {
+
+	/** MQC component */
+	opj_mqc_t *mqc;
+	/** RAW component */
+	opj_raw_t *raw;
+
+    OPJ_INT32 *data;
+	opj_flag_t *flags;
+	OPJ_UINT32 w;
+	OPJ_UINT32 h;
+	OPJ_UINT32 datasize;
+	OPJ_UINT32 flagssize;
+	OPJ_UINT32 flags_stride;
+} opj_t1_t;
+
+#define MACRO_t1_flags(x,y) t1->flags[((x)*(t1->flags_stride))+(y)]
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Encode the code-blocks of a tile
+@param t1 T1 handle
+@param tile The tile to encode
+@param tcp Tile coding parameters
+@param mct_norms  FIXME DOC
+*/
+OPJ_BOOL opj_t1_encode_cblks(   opj_t1_t *t1,
+                                opj_tcd_tile_t *tile,
+                                opj_tcp_t *tcp,
+                                const OPJ_FLOAT64 * mct_norms);
+
+/**
+Decode the code-blocks of a tile
+@param t1 T1 handle
+@param tilec The tile to decode
+@param tccp Tile coding parameters
+*/
+OPJ_BOOL opj_t1_decode_cblks(   opj_t1_t* t1,
+                                opj_tcd_tilecomp_t* tilec,
+                                opj_tccp_t* tccp);
+
+
+
+/**
+ * Creates a new Tier 1 handle
+ * and initializes the look-up tables of the Tier-1 coder/decoder
+ * @return a new T1 handle if successful, returns NULL otherwise
+*/
+opj_t1_t* opj_t1_create(void);
+
+/**
+ * Destroys a previously created T1 handle
+ *
+ * @param p_t1 Tier 1 handle to destroy
+*/
+void opj_t1_destroy(opj_t1_t *p_t1);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __T1_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_generate_luts.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_generate_luts.c
new file mode 100644
index 0000000..1997d39
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_generate_luts.c
@@ -0,0 +1,282 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+static int t1_init_ctxno_zc(int f, int orient) {
+	int h, v, d, n, t, hv;
+	n = 0;
+	h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0);
+	v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0);
+	d = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) != 0) + ((f & T1_SIG_SE) != 0) + ((f & T1_SIG_SW) != 0);
+
+	switch (orient) {
+		case 2:
+			t = h;
+			h = v;
+			v = t;
+		case 0:
+		case 1:
+			if (!h) {
+				if (!v) {
+					if (!d)
+						n = 0;
+					else if (d == 1)
+						n = 1;
+					else
+						n = 2;
+				} else if (v == 1) {
+					n = 3;
+				} else {
+					n = 4;
+				}
+			} else if (h == 1) {
+				if (!v) {
+					if (!d)
+						n = 5;
+					else
+						n = 6;
+				} else {
+					n = 7;
+				}
+			} else
+				n = 8;
+			break;
+		case 3:
+			hv = h + v;
+			if (!d) {
+				if (!hv) {
+					n = 0;
+				} else if (hv == 1) {
+					n = 1;
+				} else {
+					n = 2;
+				}
+			} else if (d == 1) {
+				if (!hv) {
+					n = 3;
+				} else if (hv == 1) {
+					n = 4;
+				} else {
+					n = 5;
+				}
+			} else if (d == 2) {
+				if (!hv) {
+					n = 6;
+				} else {
+					n = 7;
+				}
+			} else {
+				n = 8;
+			}
+			break;
+	}
+
+	return (T1_CTXNO_ZC + n);
+}
+
+static int t1_init_ctxno_sc(int f) {
+	int hc, vc, n;
+	n = 0;
+
+	hc = opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
+				T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
+			1) - opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
+					(T1_SIG_E | T1_SGN_E)) +
+				((f & (T1_SIG_W | T1_SGN_W)) ==
+				 (T1_SIG_W | T1_SGN_W)), 1);
+
+	vc = opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
+				T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
+			1) - opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
+					(T1_SIG_N | T1_SGN_N)) +
+				((f & (T1_SIG_S | T1_SGN_S)) ==
+				 (T1_SIG_S | T1_SGN_S)), 1);
+
+	if (hc < 0) {
+		hc = -hc;
+		vc = -vc;
+	}
+	if (!hc) {
+		if (vc == -1)
+			n = 1;
+		else if (!vc)
+			n = 0;
+		else
+			n = 1;
+	} else if (hc == 1) {
+		if (vc == -1)
+			n = 2;
+		else if (!vc)
+			n = 3;
+		else
+			n = 4;
+	}
+
+	return (T1_CTXNO_SC + n);
+}
+
+static int t1_init_spb(int f) {
+	int hc, vc, n;
+
+	hc = opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
+				T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
+			1) - opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
+					(T1_SIG_E | T1_SGN_E)) +
+				((f & (T1_SIG_W | T1_SGN_W)) ==
+				 (T1_SIG_W | T1_SGN_W)), 1);
+
+	vc = opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
+				T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
+			1) - opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
+					(T1_SIG_N | T1_SGN_N)) +
+				((f & (T1_SIG_S | T1_SGN_S)) ==
+				 (T1_SIG_S | T1_SGN_S)), 1);
+
+	if (!hc && !vc)
+		n = 0;
+	else
+		n = (!(hc > 0 || (!hc && vc > 0)));
+
+	return n;
+}
+
+static void dump_array16(int array[],int size){
+	int i;
+	--size;
+	for (i = 0; i < size; ++i) {
+		printf("0x%04x, ", array[i]);
+		if(!((i+1)&0x7))
+			printf("\n  ");
+	}
+	printf("0x%04x\n};\n\n", array[size]);
+}
+
+int main(int argc, char **argv)
+{
+	int i, j;
+	double u, v, t;
+
+	int lut_ctxno_zc[1024];
+	int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];
+	int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];
+	int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];
+	int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];
+  (void)argc; (void)argv;
+
+	printf("/* This file was automatically generated by t1_generate_luts.c */\n\n");
+
+	/* lut_ctxno_zc */
+	for (j = 0; j < 4; ++j) {
+		for (i = 0; i < 256; ++i) {
+			int orient = j;
+			if (orient == 2) {
+				orient = 1;
+			} else if (orient == 1) {
+				orient = 2;
+			}
+			lut_ctxno_zc[(orient << 8) | i] = t1_init_ctxno_zc(i, j);
+		}
+	}
+
+	printf("static OPJ_BYTE lut_ctxno_zc[1024] = {\n  ");
+	for (i = 0; i < 1023; ++i) {
+		printf("%i, ", lut_ctxno_zc[i]);
+		if(!((i+1)&0x1f))
+			printf("\n  ");
+	}
+	printf("%i\n};\n\n", lut_ctxno_zc[1023]);
+
+	/* lut_ctxno_sc */
+	printf("static OPJ_BYTE lut_ctxno_sc[256] = {\n  ");
+	for (i = 0; i < 255; ++i) {
+		printf("0x%x, ", t1_init_ctxno_sc(i << 4));
+		if(!((i+1)&0xf))
+			printf("\n  ");
+	}
+	printf("0x%x\n};\n\n", t1_init_ctxno_sc(255 << 4));
+
+	/* lut_spb */
+	printf("static OPJ_BYTE lut_spb[256] = {\n  ");
+	for (i = 0; i < 255; ++i) {
+		printf("%i, ", t1_init_spb(i << 4));
+		if(!((i+1)&0x1f))
+			printf("\n  ");
+	}
+	printf("%i\n};\n\n", t1_init_spb(255 << 4));
+
+	/* FIXME FIXME FIXME */
+	/* fprintf(stdout,"nmsedec luts:\n"); */
+	for (i = 0; i < (1 << T1_NMSEDEC_BITS); ++i) {
+		t = i / pow(2, T1_NMSEDEC_FRACBITS);
+		u = t;
+		v = t - 1.5;
+		lut_nmsedec_sig[i] = 
+			opj_int_max(0, 
+					(int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
+		lut_nmsedec_sig0[i] =
+			opj_int_max(0,
+					(int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
+		u = t - 1.0;
+		if (i & (1 << (T1_NMSEDEC_BITS - 1))) {
+			v = t - 1.5;
+		} else {
+			v = t - 0.5;
+		}
+		lut_nmsedec_ref[i] =
+			opj_int_max(0,
+					(int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
+		lut_nmsedec_ref0[i] =
+			opj_int_max(0,
+					(int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
+	}
+
+	printf("static OPJ_INT16 lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {\n  ");
+	dump_array16(lut_nmsedec_sig, 1 << T1_NMSEDEC_BITS);
+
+	printf("static OPJ_INT16 lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {\n  ");
+	dump_array16(lut_nmsedec_sig0, 1 << T1_NMSEDEC_BITS);
+
+	printf("static OPJ_INT16 lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {\n  ");
+	dump_array16(lut_nmsedec_ref, 1 << T1_NMSEDEC_BITS);
+
+	printf("static OPJ_INT16 lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {\n  ");
+	dump_array16(lut_nmsedec_ref0, 1 << T1_NMSEDEC_BITS);
+
+	return 0;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_luts.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_luts.h
new file mode 100644
index 0000000..37776b6
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_luts.h
@@ -0,0 +1,143 @@
+/* This file was automatically generated by t1_generate_luts.c */
+
+static OPJ_BYTE lut_ctxno_zc[1024] = {
+  0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+  5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+  5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
+  0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
+  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+  5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
+  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
+  0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
+  5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+  5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
+  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
+  0, 3, 3, 6, 3, 6, 6, 8, 3, 6, 6, 8, 6, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 
+  1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 
+  1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 
+  2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 
+  1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 
+  2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 
+  2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 
+  2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8
+};
+
+static OPJ_BYTE lut_ctxno_sc[256] = {
+  0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, 
+  0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, 
+  0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, 
+  0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, 
+  0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, 
+  0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, 
+  0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, 
+  0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, 
+  0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, 
+  0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, 
+  0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, 
+  0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, 
+  0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, 
+  0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, 
+  0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, 
+  0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd
+};
+
+static OPJ_BYTE lut_spb[256] = {
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 
+  0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+  0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 
+  0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 
+  0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
+  0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
+  0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+
+static OPJ_INT16 lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+  0x0000, 0x0180, 0x0300, 0x0480, 0x0600, 0x0780, 0x0900, 0x0a80, 
+  0x0c00, 0x0d80, 0x0f00, 0x1080, 0x1200, 0x1380, 0x1500, 0x1680, 
+  0x1800, 0x1980, 0x1b00, 0x1c80, 0x1e00, 0x1f80, 0x2100, 0x2280, 
+  0x2400, 0x2580, 0x2700, 0x2880, 0x2a00, 0x2b80, 0x2d00, 0x2e80, 
+  0x3000, 0x3180, 0x3300, 0x3480, 0x3600, 0x3780, 0x3900, 0x3a80, 
+  0x3c00, 0x3d80, 0x3f00, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, 
+  0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5100, 0x5280, 
+  0x5400, 0x5580, 0x5700, 0x5880, 0x5a00, 0x5b80, 0x5d00, 0x5e80, 
+  0x6000, 0x6180, 0x6300, 0x6480, 0x6600, 0x6780, 0x6900, 0x6a80, 
+  0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680
+};
+
+static OPJ_INT16 lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, 
+  0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, 
+  0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, 
+  0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, 
+  0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, 
+  0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, 
+  0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, 
+  0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00, 
+  0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2680, 0x2780, 
+  0x2880, 0x2980, 0x2b00, 0x2c00, 0x2d00, 0x2e80, 0x2f80, 0x3100, 
+  0x3200, 0x3380, 0x3480, 0x3600, 0x3700, 0x3880, 0x3a00, 0x3b00, 
+  0x3c80, 0x3e00, 0x3f80, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, 
+  0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5180, 0x5300, 
+  0x5480, 0x5600, 0x5800, 0x5980, 0x5b00, 0x5d00, 0x5e80, 0x6080, 
+  0x6200, 0x6400, 0x6580, 0x6780, 0x6900, 0x6b00, 0x6d00, 0x6e80, 
+  0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00
+};
+
+static OPJ_INT16 lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {
+  0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480, 
+  0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080, 
+  0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80, 
+  0x0c00, 0x0b80, 0x0b00, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, 
+  0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0500, 0x0480, 
+  0x0400, 0x0380, 0x0300, 0x0280, 0x0200, 0x0180, 0x0100, 0x0080, 
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+  0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380, 
+  0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, 
+  0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b00, 0x0b80, 
+  0x0c00, 0x0c80, 0x0d00, 0x0d80, 0x0e00, 0x0e80, 0x0f00, 0x0f80, 
+  0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380, 
+  0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780
+};
+
+static OPJ_INT16 lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {
+  0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980, 
+  0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300, 
+  0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00, 
+  0x0c80, 0x0c00, 0x0b80, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, 
+  0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0580, 0x0500, 
+  0x0480, 0x0400, 0x0400, 0x0380, 0x0300, 0x0300, 0x0280, 0x0280, 
+  0x0200, 0x0200, 0x0180, 0x0180, 0x0100, 0x0100, 0x0100, 0x0080, 
+  0x0080, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, 
+  0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, 
+  0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, 
+  0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, 
+  0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, 
+  0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, 
+  0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, 
+  0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00
+};
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c
new file mode 100644
index 0000000..de054ac
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c
@@ -0,0 +1,1344 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/** @defgroup T2 T2 - Implementation of a tier-2 coding */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+static void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n);
+
+static OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio); 
+/**
+Variable length code for signalling delta Zil (truncation point)
+@param bio  Bit Input/Output component
+@param n    delta Zil
+*/
+static void opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n);
+static OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio);
+
+/**
+Encode a packet of a tile to a destination buffer
+@param tileno Number of the tile encoded
+@param tile Tile for which to write the packets
+@param tcp Tile coding parameters
+@param pi Packet identity
+@param dest Destination buffer
+@param p_data_written   FIXME DOC
+@param len Length of the destination buffer
+@param cstr_info Codestream information structure
+@return
+*/
+static OPJ_BOOL opj_t2_encode_packet(   OPJ_UINT32 tileno,
+                                        opj_tcd_tile_t *tile,
+                                        opj_tcp_t *tcp,
+                                        opj_pi_iterator_t *pi,
+                                        OPJ_BYTE *dest,
+                                        OPJ_UINT32 * p_data_written,
+                                        OPJ_UINT32 len,
+                                        opj_codestream_info_t *cstr_info);
+
+/**
+Decode a packet of a tile from a source buffer
+@param t2 T2 handle
+@param tile Tile for which to write the packets
+@param tcp Tile coding parameters
+@param pi Packet identity
+@param src Source buffer
+@param data_read   FIXME DOC
+@param max_length  FIXME DOC
+@param pack_info Packet information
+
+@return  FIXME DOC
+*/
+static OPJ_BOOL opj_t2_decode_packet(   opj_t2_t* t2,
+                                        opj_tcd_tile_t *tile,
+                                        opj_tcp_t *tcp,
+                                        opj_pi_iterator_t *pi,
+                                        OPJ_BYTE *src,
+                                        OPJ_UINT32 * data_read,
+                                        OPJ_UINT32 max_length,
+                                        opj_packet_info_t *pack_info);
+
+static OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,
+                                    opj_tcd_tile_t *p_tile,
+                                    opj_tcp_t *p_tcp,
+                                    opj_pi_iterator_t *p_pi,
+                                    OPJ_BYTE *p_src,
+                                    OPJ_UINT32 * p_data_read,
+                                    OPJ_UINT32 p_max_length,
+                                    opj_packet_info_t *p_pack_info);
+
+static OPJ_BOOL opj_t2_read_packet_header(  opj_t2_t* p_t2,
+                                            opj_tcd_tile_t *p_tile,
+                                            opj_tcp_t *p_tcp,
+                                            opj_pi_iterator_t *p_pi,
+                                            OPJ_BOOL * p_is_data_present,
+                                            OPJ_BYTE *p_src_data,
+                                            OPJ_UINT32 * p_data_read,
+                                            OPJ_UINT32 p_max_length,
+                                            opj_packet_info_t *p_pack_info);
+
+static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
+                                        opj_tcd_tile_t *p_tile,
+                                        opj_pi_iterator_t *p_pi,
+                                        OPJ_BYTE *p_src_data,
+                                        OPJ_UINT32 * p_data_read,
+                                        OPJ_UINT32 p_max_length,
+                                        opj_packet_info_t *pack_info);
+
+static OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2,
+                                        opj_tcd_tile_t *p_tile,
+                                        opj_pi_iterator_t *p_pi,
+                                        OPJ_UINT32 * p_data_read,
+                                        OPJ_UINT32 p_max_length,
+                                        opj_packet_info_t *pack_info);
+
+/**
+@param cblk
+@param index
+@param cblksty
+@param first
+*/
+static OPJ_BOOL opj_t2_init_seg(    opj_tcd_cblk_dec_t* cblk,
+                                    OPJ_UINT32 index,
+                                    OPJ_UINT32 cblksty,
+                                    OPJ_UINT32 first);
+
+/*@}*/
+
+/*@}*/
+
+/* ----------------------------------------------------------------------- */
+
+/* #define RESTART 0x04 */
+static void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n) {
+        while (--n >= 0) {
+                opj_bio_write(bio, 1, 1);
+        }
+        opj_bio_write(bio, 0, 1);
+}
+
+OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio) 
+{
+    OPJ_UINT32 n = 0;
+    while (opj_bio_read(bio, 1)) {
+	    ++n;
+    }
+    return n;
+}
+
+void opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n) {
+        if (n == 1) {
+                opj_bio_write(bio, 0, 1);
+        } else if (n == 2) {
+                opj_bio_write(bio, 2, 2);
+        } else if (n <= 5) {
+                opj_bio_write(bio, 0xc | (n - 3), 4);
+        } else if (n <= 36) {
+                opj_bio_write(bio, 0x1e0 | (n - 6), 9);
+        } else if (n <= 164) {
+                opj_bio_write(bio, 0xff80 | (n - 37), 16);
+        }
+}
+
+OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio) {
+        OPJ_UINT32 n;
+        if (!opj_bio_read(bio, 1))
+                return 1;
+        if (!opj_bio_read(bio, 1))
+                return 2;
+        if ((n = opj_bio_read(bio, 2)) != 3)
+                return (3 + n);
+        if ((n = opj_bio_read(bio, 5)) != 31)
+                return (6 + n);
+        return (37 + opj_bio_read(bio, 7));
+}
+
+/* ----------------------------------------------------------------------- */
+
+OPJ_BOOL opj_t2_encode_packets( opj_t2_t* p_t2,
+                                OPJ_UINT32 p_tile_no,
+                                opj_tcd_tile_t *p_tile,
+                                OPJ_UINT32 p_maxlayers,
+                                OPJ_BYTE *p_dest,
+                                OPJ_UINT32 * p_data_written,
+                                OPJ_UINT32 p_max_len,
+                                opj_codestream_info_t *cstr_info,
+                                OPJ_UINT32 p_tp_num,
+                                OPJ_INT32 p_tp_pos,
+                                OPJ_UINT32 p_pino,
+                                J2K_T2_MODE p_t2_mode)
+{
+        OPJ_BYTE *l_current_data = p_dest;
+        OPJ_UINT32 l_nb_bytes = 0;
+        OPJ_UINT32 compno;
+        OPJ_UINT32 poc;
+        opj_pi_iterator_t *l_pi = 00;
+        opj_pi_iterator_t *l_current_pi = 00;
+        opj_image_t *l_image = p_t2->image;
+        opj_cp_t *l_cp = p_t2->cp;
+        opj_tcp_t *l_tcp = &l_cp->tcps[p_tile_no];
+        OPJ_UINT32 pocno = l_cp->m_specific_param.m_enc.m_cinema == OPJ_CINEMA4K_24? 2: 1;
+        OPJ_UINT32 l_max_comp = l_cp->m_specific_param.m_enc.m_max_comp_size > 0 ? l_image->numcomps : 1;
+        OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
+
+        l_pi = opj_pi_initialise_encode(l_image, l_cp, p_tile_no, p_t2_mode);
+        if (!l_pi) {
+                return OPJ_FALSE;
+        }
+
+        * p_data_written = 0;
+
+        if (p_t2_mode == THRESH_CALC ){ /* Calculating threshold */
+                l_current_pi = l_pi;
+
+                for     (compno = 0; compno < l_max_comp; ++compno) {
+                        OPJ_UINT32 l_comp_len = 0;
+                        l_current_pi = l_pi;
+
+                        for (poc = 0; poc < pocno ; ++poc) {
+                                OPJ_UINT32 l_tp_num = compno;
+
+                                /* TODO MSD : check why this function cannot fail (cf. v1) */
+                                opj_pi_create_encode(l_pi, l_cp,p_tile_no,poc,l_tp_num,p_tp_pos,p_t2_mode);
+
+                                while (opj_pi_next(l_current_pi)) {
+                                        if (l_current_pi->layno < p_maxlayers) {
+                                                l_nb_bytes = 0;
+
+                                                if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {
+                                                        opj_pi_destroy(l_pi, l_nb_pocs);
+                                                        return OPJ_FALSE;
+                                                }
+
+                                                l_comp_len += l_nb_bytes;
+                                                l_current_data += l_nb_bytes;
+                                                p_max_len -= l_nb_bytes;
+
+                                                * p_data_written += l_nb_bytes;
+                                        }
+                                }
+
+                                if (l_cp->m_specific_param.m_enc.m_max_comp_size) {
+                                        if (l_comp_len > l_cp->m_specific_param.m_enc.m_max_comp_size) {
+                                                opj_pi_destroy(l_pi, l_nb_pocs);
+                                                return OPJ_FALSE;
+                                        }
+                                }
+
+                                ++l_current_pi;
+                        }
+                }
+        }
+        else {  /* t2_mode == FINAL_PASS  */
+                opj_pi_create_encode(l_pi, l_cp,p_tile_no,p_pino,p_tp_num,p_tp_pos,p_t2_mode);
+
+                l_current_pi = &l_pi[p_pino];
+
+                while (opj_pi_next(l_current_pi)) {
+                        if (l_current_pi->layno < p_maxlayers) {
+                                l_nb_bytes=0;
+
+                                if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {
+                                        opj_pi_destroy(l_pi, l_nb_pocs);
+                                        return OPJ_FALSE;
+                                }
+
+                                l_current_data += l_nb_bytes;
+                                p_max_len -= l_nb_bytes;
+
+                                * p_data_written += l_nb_bytes;
+
+                                /* INDEX >> */
+                                if(cstr_info) {
+                                        if(cstr_info->index_write) {
+                                                opj_tile_info_t *info_TL = &cstr_info->tile[p_tile_no];
+                                                opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
+                                                if (!cstr_info->packno) {
+                                                        info_PK->start_pos = info_TL->end_header + 1;
+                                                } else {
+                                                        info_PK->start_pos = ((l_cp->m_specific_param.m_enc.m_tp_on | l_tcp->POC)&& info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1;
+                                                }
+                                                info_PK->end_pos = info_PK->start_pos + l_nb_bytes - 1;
+                                                info_PK->end_ph_pos += info_PK->start_pos - 1;  /* End of packet header which now only represents the distance
+                                                                                                                                                                                                                                                   to start of packet is incremented by value of start of packet*/
+                                        }
+
+                                        cstr_info->packno++;
+                                }
+                                /* << INDEX */
+                                ++p_tile->packno;
+                        }
+                }
+        }
+
+        opj_pi_destroy(l_pi, l_nb_pocs);
+
+        return OPJ_TRUE;
+}
+
+/* see issue 80 */
+#if 0
+#define JAS_FPRINTF fprintf
+#else
+/* issue 290 */
+static void opj_null_jas_fprintf(FILE* file, const char * format, ...)
+{
+  (void)file;
+  (void)format;
+}
+#define JAS_FPRINTF opj_null_jas_fprintf
+#endif
+
+OPJ_BOOL opj_t2_decode_packets( opj_t2_t *p_t2,
+                                OPJ_UINT32 p_tile_no,
+                                opj_tcd_tile_t *p_tile,
+                                OPJ_BYTE *p_src,
+                                OPJ_UINT32 * p_data_read,
+                                OPJ_UINT32 p_max_len,
+                                opj_codestream_index_t *p_cstr_index)
+{
+        OPJ_BYTE *l_current_data = p_src;
+        opj_pi_iterator_t *l_pi = 00;
+        OPJ_UINT32 pino;
+        opj_image_t *l_image = p_t2->image;
+        opj_cp_t *l_cp = p_t2->cp;
+        opj_tcp_t *l_tcp = &(p_t2->cp->tcps[p_tile_no]);
+        OPJ_UINT32 l_nb_bytes_read;
+        OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
+        opj_pi_iterator_t *l_current_pi = 00;
+#ifdef TODO_MSD
+        OPJ_UINT32 curtp = 0;
+        OPJ_UINT32 tp_start_packno;
+#endif 
+        opj_packet_info_t *l_pack_info = 00;
+        opj_image_comp_t* l_img_comp = 00;
+
+        OPJ_ARG_NOT_USED(p_cstr_index);
+
+#ifdef TODO_MSD
+        if (p_cstr_index) {
+                l_pack_info = p_cstr_index->tile_index[p_tile_no].packet;
+        }
+#endif
+
+        /* create a packet iterator */
+        l_pi = opj_pi_create_decode(l_image, l_cp, p_tile_no);
+        if (!l_pi) {
+                return OPJ_FALSE;
+        }
+
+
+        l_current_pi = l_pi;
+
+        for     (pino = 0; pino <= l_tcp->numpocs; ++pino) {
+
+                /* if the resolution needed is too low, one dim of the tilec could be equal to zero
+                 * and no packets are used to decode this resolution and
+                 * l_current_pi->resno is always >= p_tile->comps[l_current_pi->compno].minimum_num_resolutions
+                 * and no l_img_comp->resno_decoded are computed
+                 */
+                OPJ_BOOL* first_pass_failed = (OPJ_BOOL*)opj_malloc(l_image->numcomps * sizeof(OPJ_BOOL));
+                if (!first_pass_failed)
+                {
+                    opj_pi_destroy(l_pi,l_nb_pocs);
+                    return OPJ_FALSE;
+                }
+                memset(first_pass_failed, OPJ_TRUE, l_image->numcomps * sizeof(OPJ_BOOL));
+
+                while (opj_pi_next(l_current_pi)) {
+                  JAS_FPRINTF( stderr, "packet offset=00000166 prg=%d cmptno=%02d rlvlno=%02d prcno=%03d lyrno=%02d\n\n",
+                    l_current_pi->poc.prg1, l_current_pi->compno, l_current_pi->resno, l_current_pi->precno, l_current_pi->layno );
+
+                        if (l_tcp->num_layers_to_decode > l_current_pi->layno
+                                        && l_current_pi->resno < p_tile->comps[l_current_pi->compno].minimum_num_resolutions) {
+                                l_nb_bytes_read = 0;
+
+                                first_pass_failed[l_current_pi->compno] = OPJ_FALSE;
+
+                                if (! opj_t2_decode_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info)) {
+                                        opj_pi_destroy(l_pi,l_nb_pocs);
+                                        opj_free(first_pass_failed);
+                                        return OPJ_FALSE;
+                                }
+
+                                l_img_comp = &(l_image->comps[l_current_pi->compno]);
+                                l_img_comp->resno_decoded = opj_uint_max(l_current_pi->resno, l_img_comp->resno_decoded);
+                        }
+                        else {
+                                l_nb_bytes_read = 0;
+                                if (! opj_t2_skip_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info)) {
+                                        opj_pi_destroy(l_pi,l_nb_pocs);
+                                        opj_free(first_pass_failed);
+                                        return OPJ_FALSE;
+                                }
+                        }
+
+                        if (first_pass_failed[l_current_pi->compno]) {
+                                l_img_comp = &(l_image->comps[l_current_pi->compno]);
+                                if (l_img_comp->resno_decoded == 0)
+                                        l_img_comp->resno_decoded = p_tile->comps[l_current_pi->compno].minimum_num_resolutions - 1;
+                        }
+
+                        l_current_data += l_nb_bytes_read;
+                        p_max_len -= l_nb_bytes_read;
+
+                        /* INDEX >> */
+#ifdef TODO_MSD
+                        if(p_cstr_info) {
+                                opj_tile_info_v2_t *info_TL = &p_cstr_info->tile[p_tile_no];
+                                opj_packet_info_t *info_PK = &info_TL->packet[p_cstr_info->packno];
+                                tp_start_packno = 0;
+                                if (!p_cstr_info->packno) {
+                                        info_PK->start_pos = info_TL->end_header + 1;
+                                } else if (info_TL->packet[p_cstr_info->packno-1].end_pos >= (OPJ_INT32)p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_pos){ /* New tile part */
+                                        info_TL->tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in previous tile-part */
+                                        tp_start_packno = p_cstr_info->packno;
+                                        curtp++;
+                                        info_PK->start_pos = p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_header+1;
+                                } else {
+                                        info_PK->start_pos = (l_cp->m_specific_param.m_enc.m_tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[p_cstr_info->packno - 1].end_pos + 1;
+                                }
+                                info_PK->end_pos = info_PK->start_pos + l_nb_bytes_read - 1;
+                                info_PK->end_ph_pos += info_PK->start_pos - 1;  /* End of packet header which now only represents the distance */
+                                ++p_cstr_info->packno;
+                        }
+#endif
+                        /* << INDEX */
+                }
+                ++l_current_pi;
+
+                opj_free(first_pass_failed);
+        }
+        /* INDEX >> */
+#ifdef TODO_MSD
+        if
+                (p_cstr_info) {
+                p_cstr_info->tile[p_tile_no].tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in last tile-part */
+        }
+#endif
+        /* << INDEX */
+
+        /* don't forget to release pi */
+        opj_pi_destroy(l_pi,l_nb_pocs);
+        *p_data_read = (OPJ_UINT32)(l_current_data - p_src);
+        return OPJ_TRUE;
+}
+
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Creates a Tier 2 handle
+ *
+ * @param       p_image         Source or destination image
+ * @param       p_cp            Image coding parameters.
+ * @return              a new T2 handle if successful, NULL otherwise.
+*/
+opj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp)
+{
+        /* create the t2 structure */
+        opj_t2_t *l_t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t));
+        if (!l_t2) {
+                return NULL;
+        }
+        memset(l_t2,0,sizeof(opj_t2_t));
+
+        l_t2->image = p_image;
+        l_t2->cp = p_cp;
+
+        return l_t2;
+}
+
+void opj_t2_destroy(opj_t2_t *t2) {
+        if(t2) {
+                opj_free(t2);
+        }
+}
+
+OPJ_BOOL opj_t2_decode_packet(  opj_t2_t* p_t2,
+                                opj_tcd_tile_t *p_tile,
+                                opj_tcp_t *p_tcp,
+                                opj_pi_iterator_t *p_pi,
+                                OPJ_BYTE *p_src,
+                                OPJ_UINT32 * p_data_read,
+                                OPJ_UINT32 p_max_length,
+                                opj_packet_info_t *p_pack_info)
+{
+        OPJ_BOOL l_read_data;
+        OPJ_UINT32 l_nb_bytes_read = 0;
+        OPJ_UINT32 l_nb_total_bytes_read = 0;
+
+        *p_data_read = 0;
+
+        if (! opj_t2_read_packet_header(p_t2,p_tile,p_tcp,p_pi,&l_read_data,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {
+                return OPJ_FALSE;
+        }
+
+        p_src += l_nb_bytes_read;
+        l_nb_total_bytes_read += l_nb_bytes_read;
+        p_max_length -= l_nb_bytes_read;
+
+        /* we should read data for the packet */
+        if (l_read_data) {
+                l_nb_bytes_read = 0;
+
+                if (! opj_t2_read_packet_data(p_t2,p_tile,p_pi,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {
+                        return OPJ_FALSE;
+                }
+
+                l_nb_total_bytes_read += l_nb_bytes_read;
+        }
+
+        *p_data_read = l_nb_total_bytes_read;
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_t2_encode_packet(  OPJ_UINT32 tileno,
+                                opj_tcd_tile_t * tile,
+                                opj_tcp_t * tcp,
+                                opj_pi_iterator_t *pi,
+                                OPJ_BYTE *dest,
+                                OPJ_UINT32 * p_data_written,
+                                OPJ_UINT32 length,
+                                opj_codestream_info_t *cstr_info)
+{
+        OPJ_UINT32 bandno, cblkno;
+        OPJ_BYTE* c = dest;
+        OPJ_UINT32 l_nb_bytes;
+        OPJ_UINT32 compno = pi->compno;     /* component value */
+        OPJ_UINT32 resno  = pi->resno;      /* resolution level value */
+        OPJ_UINT32 precno = pi->precno;     /* precinct value */
+        OPJ_UINT32 layno  = pi->layno;      /* quality layer value */
+        OPJ_UINT32 l_nb_blocks;
+        opj_tcd_band_t *band = 00;
+        opj_tcd_cblk_enc_t* cblk = 00;
+        opj_tcd_pass_t *pass = 00;
+
+        opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+        opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+
+        opj_bio_t *bio = 00;    /* BIO component */
+
+        /* <SOP 0xff91> */
+        if (tcp->csty & J2K_CP_CSTY_SOP) {
+                c[0] = 255;
+                c[1] = 145;
+                c[2] = 0;
+                c[3] = 4;
+#if 0
+                c[4] = (tile->packno % 65536) / 256;
+                c[5] = (tile->packno % 65536) % 256;
+#else
+                c[4] = (tile->packno >> 8) & 0xff; /* packno is uint32_t */
+                c[5] = tile->packno & 0xff;
+#endif
+                c += 6;
+                length -= 6;
+        }
+        /* </SOP> */
+
+        if (!layno) {
+                band = res->bands;
+
+                for(bandno = 0; bandno < res->numbands; ++bandno) {
+                        opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+                        opj_tgt_reset(prc->incltree);
+                        opj_tgt_reset(prc->imsbtree);
+
+                        l_nb_blocks = prc->cw * prc->ch;
+                        for     (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
+                                cblk = &prc->cblks.enc[cblkno];
+
+                                cblk->numpasses = 0;
+                                opj_tgt_setvalue(prc->imsbtree, cblkno, band->numbps - (OPJ_INT32)cblk->numbps);
+                        }
+                        ++band;
+                }
+        }
+
+        bio = opj_bio_create();
+        opj_bio_init_enc(bio, c, length);
+        opj_bio_write(bio, 1, 1);           /* Empty header bit */
+
+        /* Writing Packet header */
+        band = res->bands;
+        for (bandno = 0; bandno < res->numbands; ++bandno)      {
+                opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+                l_nb_blocks = prc->cw * prc->ch;
+                cblk = prc->cblks.enc;
+
+                for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
+                        opj_tcd_layer_t *layer = &cblk->layers[layno];
+
+                        if (!cblk->numpasses && layer->numpasses) {
+                                opj_tgt_setvalue(prc->incltree, cblkno, (OPJ_INT32)layno);
+                        }
+
+                        ++cblk;
+                }
+
+                cblk = prc->cblks.enc;
+                for (cblkno = 0; cblkno < l_nb_blocks; cblkno++) {
+                        opj_tcd_layer_t *layer = &cblk->layers[layno];
+                        OPJ_UINT32 increment = 0;
+                        OPJ_UINT32 nump = 0;
+                        OPJ_UINT32 len = 0, passno;
+                        OPJ_UINT32 l_nb_passes;
+
+                        /* cblk inclusion bits */
+                        if (!cblk->numpasses) {
+                                opj_tgt_encode(bio, prc->incltree, cblkno, (OPJ_INT32)(layno + 1));
+                        } else {
+                                opj_bio_write(bio, layer->numpasses != 0, 1);
+                        }
+
+                        /* if cblk not included, go to the next cblk  */
+                        if (!layer->numpasses) {
+                                ++cblk;
+                                continue;
+                        }
+
+                        /* if first instance of cblk --> zero bit-planes information */
+                        if (!cblk->numpasses) {
+                                cblk->numlenbits = 3;
+                                opj_tgt_encode(bio, prc->imsbtree, cblkno, 999);
+                        }
+
+                        /* number of coding passes included */
+                        opj_t2_putnumpasses(bio, layer->numpasses);
+                        l_nb_passes = cblk->numpasses + layer->numpasses;
+                        pass = cblk->passes +  cblk->numpasses;
+
+                        /* computation of the increase of the length indicator and insertion in the header     */
+                        for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
+                                ++nump;
+                                len += pass->len;
+
+                                if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
+                                  increment = (OPJ_UINT32)opj_int_max((OPJ_INT32)increment, opj_int_floorlog2((OPJ_INT32)len) + 1
+                                    - ((OPJ_INT32)cblk->numlenbits + opj_int_floorlog2((OPJ_INT32)nump)));
+                                        len = 0;
+                                        nump = 0;
+                                }
+
+                                ++pass;
+                        }
+                        opj_t2_putcommacode(bio, (OPJ_INT32)increment);
+
+                        /* computation of the new Length indicator */
+                        cblk->numlenbits += increment;
+
+                        pass = cblk->passes +  cblk->numpasses;
+                        /* insertion of the codeword segment length */
+                        for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
+                                nump++;
+                                len += pass->len;
+
+                                if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
+                                        opj_bio_write(bio, (OPJ_UINT32)len, cblk->numlenbits + (OPJ_UINT32)opj_int_floorlog2((OPJ_INT32)nump));
+                                        len = 0;
+                                        nump = 0;
+                                }
+                                ++pass;
+                        }
+
+                        ++cblk;
+                }
+
+                ++band;
+        }
+
+        if (!opj_bio_flush(bio)) {
+                opj_bio_destroy(bio);
+                return OPJ_FALSE;               /* modified to eliminate longjmp !! */
+        }
+
+        l_nb_bytes = (OPJ_UINT32)opj_bio_numbytes(bio);
+        c += l_nb_bytes;
+        length -= l_nb_bytes;
+
+        opj_bio_destroy(bio);
+
+        /* <EPH 0xff92> */
+        if (tcp->csty & J2K_CP_CSTY_EPH) {
+                c[0] = 255;
+                c[1] = 146;
+                c += 2;
+                length -= 2;
+        }
+        /* </EPH> */
+
+        /* << INDEX */
+        /* End of packet header position. Currently only represents the distance to start of packet
+           Will be updated later by incrementing with packet start value*/
+        if(cstr_info && cstr_info->index_write) {
+                opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
+                info_PK->end_ph_pos = (OPJ_INT32)(c - dest);
+        }
+        /* INDEX >> */
+
+        /* Writing the packet body */
+        band = res->bands;
+        for (bandno = 0; bandno < res->numbands; bandno++) {
+                opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+                l_nb_blocks = prc->cw * prc->ch;
+                cblk = prc->cblks.enc;
+
+                for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
+                        opj_tcd_layer_t *layer = &cblk->layers[layno];
+
+                        if (!layer->numpasses) {
+                                ++cblk;
+                                continue;
+                        }
+
+                        if (layer->len > length) {
+                                return OPJ_FALSE;
+                        }
+
+                        memcpy(c, layer->data, layer->len);
+                        cblk->numpasses += layer->numpasses;
+                        c += layer->len;
+                        length -= layer->len;
+
+                        /* << INDEX */
+                        if(cstr_info && cstr_info->index_write) {
+                                opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
+                                info_PK->disto += layer->disto;
+                                if (cstr_info->D_max < info_PK->disto) {
+                                        cstr_info->D_max = info_PK->disto;
+                                }
+                        }
+
+                        ++cblk;
+                        /* INDEX >> */
+                }
+                ++band;
+        }
+
+        assert( c >= dest );
+        * p_data_written += (OPJ_UINT32)(c - dest);
+
+        return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,
+                                    opj_tcd_tile_t *p_tile,
+                                    opj_tcp_t *p_tcp,
+                                    opj_pi_iterator_t *p_pi,
+                                    OPJ_BYTE *p_src,
+                                    OPJ_UINT32 * p_data_read,
+                                    OPJ_UINT32 p_max_length,
+                                    opj_packet_info_t *p_pack_info)
+{
+        OPJ_BOOL l_read_data;
+        OPJ_UINT32 l_nb_bytes_read = 0;
+        OPJ_UINT32 l_nb_total_bytes_read = 0;
+
+        *p_data_read = 0;
+
+        if (! opj_t2_read_packet_header(p_t2,p_tile,p_tcp,p_pi,&l_read_data,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {
+                return OPJ_FALSE;
+        }
+
+        p_src += l_nb_bytes_read;
+        l_nb_total_bytes_read += l_nb_bytes_read;
+        p_max_length -= l_nb_bytes_read;
+
+        /* we should read data for the packet */
+        if (l_read_data) {
+                l_nb_bytes_read = 0;
+
+                if (! opj_t2_skip_packet_data(p_t2,p_tile,p_pi,&l_nb_bytes_read,p_max_length,p_pack_info)) {
+                        return OPJ_FALSE;
+                }
+
+                l_nb_total_bytes_read += l_nb_bytes_read;
+        }
+        *p_data_read = l_nb_total_bytes_read;
+
+        return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2,
+                                    opj_tcd_tile_t *p_tile,
+                                    opj_tcp_t *p_tcp,
+                                    opj_pi_iterator_t *p_pi,
+                                    OPJ_BOOL * p_is_data_present,
+                                    OPJ_BYTE *p_src_data,
+                                    OPJ_UINT32 * p_data_read,
+                                    OPJ_UINT32 p_max_length,
+                                    opj_packet_info_t *p_pack_info)
+
+{
+        /* loop */
+        OPJ_UINT32 bandno, cblkno;
+        OPJ_UINT32 l_nb_code_blocks;
+        OPJ_UINT32 l_remaining_length;
+        OPJ_UINT32 l_header_length;
+        OPJ_UINT32 * l_modified_length_ptr = 00;
+        OPJ_BYTE *l_current_data = p_src_data;
+        opj_cp_t *l_cp = p_t2->cp;
+        opj_bio_t *l_bio = 00;  /* BIO component */
+        opj_tcd_band_t *l_band = 00;
+        opj_tcd_cblk_dec_t* l_cblk = 00;
+        opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
+
+        OPJ_BYTE *l_header_data = 00;
+        OPJ_BYTE **l_header_data_start = 00;
+
+        OPJ_UINT32 l_present;
+
+        if (p_pi->layno == 0) {
+                l_band = l_res->bands;
+
+                /* reset tagtrees */
+                for (bandno = 0; bandno < l_res->numbands; ++bandno) {
+                        opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
+
+                        if ( ! ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) ) {
+                                opj_tgt_reset(l_prc->incltree);
+                                opj_tgt_reset(l_prc->imsbtree);
+                                l_cblk = l_prc->cblks.dec;
+
+                                l_nb_code_blocks = l_prc->cw * l_prc->ch;
+                                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+                                        l_cblk->numsegs = 0;
+                                        l_cblk->real_num_segs = 0;
+                                        ++l_cblk;
+                                }
+                        }
+
+                        ++l_band;
+                }
+        }
+
+        /* SOP markers */
+
+        if (p_tcp->csty & J2K_CP_CSTY_SOP) {
+                if (p_max_length < 6) {
+                        /* TODO opj_event_msg(p_t2->cinfo->event_mgr, EVT_WARNING, "Not enough space for expected SOP marker\n"); */
+                        printf("Not enough space for expected SOP marker\n");
+                } else if ((*l_current_data) != 0xff || (*(l_current_data + 1) != 0x91)) {
+                        /* TODO opj_event_msg(p_t2->cinfo->event_mgr, EVT_WARNING, "Expected SOP marker\n"); */
+                        printf("Expected SOP marker\n");
+                        fprintf(stderr, "Error : expected SOP marker\n");
+                } else {
+                        l_current_data += 6;
+                }
+
+                /** TODO : check the Nsop value */
+        }
+
+        /*
+        When the marker PPT/PPM is used the packet header are store in PPT/PPM marker
+        This part deal with this caracteristic
+        step 1: Read packet header in the saved structure
+        step 2: Return to codestream for decoding
+        */
+
+        l_bio = opj_bio_create();
+        if (! l_bio) {
+                return OPJ_FALSE;
+        }
+
+        if (l_cp->ppm == 1) { /* PPM */
+                l_header_data_start = &l_cp->ppm_data;
+                l_header_data = *l_header_data_start;
+                l_modified_length_ptr = &(l_cp->ppm_len);
+
+        }
+        else if (p_tcp->ppt == 1) { /* PPT */
+                l_header_data_start = &(p_tcp->ppt_data);
+                l_header_data = *l_header_data_start;
+                l_modified_length_ptr = &(p_tcp->ppt_len);
+        }
+        else {  /* Normal Case */
+                l_header_data_start = &(l_current_data);
+                l_header_data = *l_header_data_start;
+                l_remaining_length = (OPJ_UINT32)(p_src_data+p_max_length-l_header_data);
+                l_modified_length_ptr = &(l_remaining_length);
+        }
+
+        opj_bio_init_dec(l_bio, l_header_data,*l_modified_length_ptr);
+
+        l_present = opj_bio_read(l_bio, 1);
+        JAS_FPRINTF(stderr, "present=%d \n", l_present );
+        if (!l_present) {
+            /* TODO MSD: no test to control the output of this function*/
+                opj_bio_inalign(l_bio);
+                l_header_data += opj_bio_numbytes(l_bio);
+                opj_bio_destroy(l_bio);
+
+                /* EPH markers */
+                if (p_tcp->csty & J2K_CP_CSTY_EPH) {
+                        if (p_max_length < 2) {
+                                fprintf(stderr, "Not enough space for expected EPH marker\n");
+                        } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
+                                fprintf(stderr, "Error : expected EPH marker\n");
+                        } else {
+                                l_header_data += 2;
+                        }
+                }
+
+                l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
+                *l_modified_length_ptr -= l_header_length;
+                *l_header_data_start += l_header_length;
+
+                /* << INDEX */
+                /* End of packet header position. Currently only represents the distance to start of packet
+                   Will be updated later by incrementing with packet start value */
+                if (p_pack_info) {
+                        p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
+                }
+                /* INDEX >> */
+
+                * p_is_data_present = OPJ_FALSE;
+                *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
+                return OPJ_TRUE;
+        }
+
+        l_band = l_res->bands;
+        for (bandno = 0; bandno < l_res->numbands; ++bandno) {
+                opj_tcd_precinct_t *l_prc = &(l_band->precincts[p_pi->precno]);
+
+                if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
+                        ++l_band;
+                        continue;
+                }
+
+                l_nb_code_blocks = l_prc->cw * l_prc->ch;
+                l_cblk = l_prc->cblks.dec;
+                for (cblkno = 0; cblkno < l_nb_code_blocks; cblkno++) {
+                        OPJ_UINT32 l_included,l_increment, l_segno;
+                        OPJ_INT32 n;
+
+                        /* if cblk not yet included before --> inclusion tagtree */
+                        if (!l_cblk->numsegs) {
+                                l_included = opj_tgt_decode(l_bio, l_prc->incltree, cblkno, (OPJ_INT32)(p_pi->layno + 1));
+                                /* else one bit */
+                        }
+                        else {
+                                l_included = opj_bio_read(l_bio, 1);
+                        }
+
+                        /* if cblk not included */
+                        if (!l_included) {
+                                l_cblk->numnewpasses = 0;
+                                ++l_cblk;
+        JAS_FPRINTF(stderr, "included=%d \n", l_included);
+                                continue;
+                        }
+
+                        /* if cblk not yet included --> zero-bitplane tagtree */
+                        if (!l_cblk->numsegs) {
+                                OPJ_UINT32 i = 0;
+
+                                while (!opj_tgt_decode(l_bio, l_prc->imsbtree, cblkno, (OPJ_INT32)i)) {
+                                        ++i;
+                                }
+
+                                l_cblk->numbps = (OPJ_UINT32)l_band->numbps + 1 - i;
+                                l_cblk->numlenbits = 3;
+                        }
+
+                        /* number of coding passes */
+                        l_cblk->numnewpasses = opj_t2_getnumpasses(l_bio);
+                        l_increment = opj_t2_getcommacode(l_bio);
+
+                        /* length indicator increment */
+                        l_cblk->numlenbits += l_increment;
+                        l_segno = 0;
+
+                        if (!l_cblk->numsegs) {
+                                if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 1)) {
+                                        opj_bio_destroy(l_bio);
+                                        return OPJ_FALSE;
+                                }
+                        }
+                        else {
+                                l_segno = l_cblk->numsegs - 1;
+                                if (l_cblk->segs[l_segno].numpasses == l_cblk->segs[l_segno].maxpasses) {
+                                        ++l_segno;
+                                        if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
+                                                opj_bio_destroy(l_bio);
+                                                return OPJ_FALSE;
+                                        }
+                                }
+                        }
+                        n = (OPJ_INT32)l_cblk->numnewpasses;
+
+                        do {
+                                l_cblk->segs[l_segno].numnewpasses = (OPJ_UINT32)opj_int_min((OPJ_INT32)(l_cblk->segs[l_segno].maxpasses - l_cblk->segs[l_segno].numpasses), n);
+                                l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, l_cblk->numlenbits + opj_uint_floorlog2(l_cblk->segs[l_segno].numnewpasses));
+                                        JAS_FPRINTF(stderr, "included=%d numnewpasses=%d increment=%d len=%d \n", l_included, l_cblk->segs[l_segno].numnewpasses, l_increment, l_cblk->segs[l_segno].newlen );
+
+                                n -= (OPJ_INT32)l_cblk->segs[l_segno].numnewpasses;
+                                if (n > 0) {
+                                        ++l_segno;
+
+                                        if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
+                                                opj_bio_destroy(l_bio);
+                                                return OPJ_FALSE;
+                                        }
+                                }
+                        } while (n > 0);
+
+                        ++l_cblk;
+                }
+
+                ++l_band;
+        }
+
+        if (!opj_bio_inalign(l_bio)) {
+                opj_bio_destroy(l_bio);
+                return OPJ_FALSE;
+        }
+
+        l_header_data += opj_bio_numbytes(l_bio);
+        opj_bio_destroy(l_bio);
+
+        /* EPH markers */
+        if (p_tcp->csty & J2K_CP_CSTY_EPH) {
+                if (p_max_length < 2) {
+                        fprintf(stderr, "Not enough space for expected EPH marker\n");
+                } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
+                        /* TODO opj_event_msg(t2->cinfo->event_mgr, EVT_ERROR, "Expected EPH marker\n"); */
+                        fprintf(stderr, "Error : expected EPH marker\n");
+                } else {
+                        l_header_data += 2;
+                }
+        }
+
+        l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
+        JAS_FPRINTF( stderr, "hdrlen=%d \n", l_header_length );
+        JAS_FPRINTF( stderr, "packet body\n");
+        *l_modified_length_ptr -= l_header_length;
+        *l_header_data_start += l_header_length;
+
+        /* << INDEX */
+        /* End of packet header position. Currently only represents the distance to start of packet
+         Will be updated later by incrementing with packet start value */
+        if (p_pack_info) {
+                p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
+        }
+        /* INDEX >> */
+
+        *p_is_data_present = OPJ_TRUE;
+        *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_t2_read_packet_data(   opj_t2_t* p_t2,
+                                    opj_tcd_tile_t *p_tile,
+                                    opj_pi_iterator_t *p_pi,
+                                    OPJ_BYTE *p_src_data,
+                                    OPJ_UINT32 * p_data_read,
+                                    OPJ_UINT32 p_max_length,
+                                    opj_packet_info_t *pack_info)
+{
+        OPJ_UINT32 bandno, cblkno;
+        OPJ_UINT32 l_nb_code_blocks;
+        OPJ_BYTE *l_current_data = p_src_data;
+        opj_tcd_band_t *l_band = 00;
+        opj_tcd_cblk_dec_t* l_cblk = 00;
+        opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
+
+        OPJ_ARG_NOT_USED(p_t2);
+        OPJ_ARG_NOT_USED(pack_info);
+
+        l_band = l_res->bands;
+        for (bandno = 0; bandno < l_res->numbands; ++bandno) {
+                opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
+
+                if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
+                        ++l_band;
+                        continue;
+                }
+
+                l_nb_code_blocks = l_prc->cw * l_prc->ch;
+                l_cblk = l_prc->cblks.dec;
+
+                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+                        opj_tcd_seg_t *l_seg = 00;
+
+                        if (!l_cblk->numnewpasses) {
+                                /* nothing to do */
+                                ++l_cblk;
+                                continue;
+                        }
+
+                        if (!l_cblk->numsegs) {
+                                l_seg = l_cblk->segs;
+                                ++l_cblk->numsegs;
+                                l_cblk->data_current_size = 0;
+                        }
+                        else {
+                                l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
+
+                                if (l_seg->numpasses == l_seg->maxpasses) {
+                                        ++l_seg;
+                                        ++l_cblk->numsegs;
+                                }
+                        }
+
+                        do {
+                                if (l_current_data + l_seg->newlen > p_src_data + p_max_length) {
+                                        fprintf(stderr, "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
+                                                l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
+                                        return OPJ_FALSE;
+                                }
+
+#ifdef USE_JPWL
+                        /* we need here a j2k handle to verify if making a check to
+                        the validity of cblocks parameters is selected from user (-W) */
+
+                                /* let's check that we are not exceeding */
+                                if ((l_cblk->len + l_seg->newlen) > 8192) {
+                                        opj_event_msg(p_t2->cinfo, EVT_WARNING,
+                                                "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
+                                                l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
+                                        if (!JPWL_ASSUME) {
+                                                opj_event_msg(p_t2->cinfo, EVT_ERROR, "JPWL: giving up\n");
+                                                return OPJ_FALSE;
+                                        }
+                                        l_seg->newlen = 8192 - l_cblk->len;
+                                        opj_event_msg(p_t2->cinfo, EVT_WARNING, "      - truncating segment to %d\n", l_seg->newlen);
+                                        break;
+                                };
+
+#endif /* USE_JPWL */
+                                /* Check if the cblk->data have allocated enough memory */
+                                if ((l_cblk->data_current_size + l_seg->newlen) > l_cblk->data_max_size) {
+                                    OPJ_BYTE* new_cblk_data = (OPJ_BYTE*) opj_realloc(l_cblk->data, l_cblk->data_current_size + l_seg->newlen);
+                                    if(! new_cblk_data) {
+                                        opj_free(l_cblk->data);
+                                        l_cblk->data_max_size = 0;
+                                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to realloc code block cata!\n"); */
+                                        return OPJ_FALSE;
+                                    }
+                                    l_cblk->data_max_size = l_cblk->data_current_size + l_seg->newlen;
+                                    l_cblk->data = new_cblk_data;
+                                }
+                               
+                                memcpy(l_cblk->data + l_cblk->data_current_size, l_current_data, l_seg->newlen);
+
+                                if (l_seg->numpasses == 0) {
+                                        l_seg->data = &l_cblk->data;
+                                        l_seg->dataindex = l_cblk->data_current_size;
+                                }
+
+                                l_current_data += l_seg->newlen;
+                                l_seg->numpasses += l_seg->numnewpasses;
+                                l_cblk->numnewpasses -= l_seg->numnewpasses;
+
+                                l_seg->real_num_passes = l_seg->numpasses;
+                                l_cblk->data_current_size += l_seg->newlen;
+                                l_seg->len += l_seg->newlen;
+
+                                if (l_cblk->numnewpasses > 0) {
+                                        ++l_seg;
+                                        ++l_cblk->numsegs;
+                                }
+                        } while (l_cblk->numnewpasses > 0);
+
+                        l_cblk->real_num_segs = l_cblk->numsegs;
+                        ++l_cblk;
+                } /* next code_block */
+
+                ++l_band;
+        }
+
+        *(p_data_read) = (OPJ_UINT32)(l_current_data - p_src_data);
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_t2_skip_packet_data(   opj_t2_t* p_t2,
+                                    opj_tcd_tile_t *p_tile,
+                                    opj_pi_iterator_t *p_pi,
+                                    OPJ_UINT32 * p_data_read,
+                                    OPJ_UINT32 p_max_length,
+                                    opj_packet_info_t *pack_info)
+{
+        OPJ_UINT32 bandno, cblkno;
+        OPJ_UINT32 l_nb_code_blocks;
+        opj_tcd_band_t *l_band = 00;
+        opj_tcd_cblk_dec_t* l_cblk = 00;
+        opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
+
+        OPJ_ARG_NOT_USED(p_t2);
+        OPJ_ARG_NOT_USED(pack_info);
+
+        *p_data_read = 0;
+        l_band = l_res->bands;
+
+        for (bandno = 0; bandno < l_res->numbands; ++bandno) {
+                opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
+
+                if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
+                        ++l_band;
+                        continue;
+                }
+
+                l_nb_code_blocks = l_prc->cw * l_prc->ch;
+                l_cblk = l_prc->cblks.dec;
+
+                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+                        opj_tcd_seg_t *l_seg = 00;
+
+                        if (!l_cblk->numnewpasses) {
+                                /* nothing to do */
+                                ++l_cblk;
+                                continue;
+                        }
+
+                        if (!l_cblk->numsegs) {
+                                l_seg = l_cblk->segs;
+                                ++l_cblk->numsegs;
+                                l_cblk->data_current_size = 0;
+                        }
+                        else {
+                                l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
+
+                                if (l_seg->numpasses == l_seg->maxpasses) {
+                                        ++l_seg;
+                                        ++l_cblk->numsegs;
+                                }
+                        }
+
+                        do {
+                                if (* p_data_read + l_seg->newlen > p_max_length) {
+                                        fprintf(stderr, "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
+                                                l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
+                                        return OPJ_FALSE;
+                                }
+
+#ifdef USE_JPWL
+                        /* we need here a j2k handle to verify if making a check to
+                        the validity of cblocks parameters is selected from user (-W) */
+
+                                /* let's check that we are not exceeding */
+                                if ((l_cblk->len + l_seg->newlen) > 8192) {
+                                        opj_event_msg(p_t2->cinfo, EVT_WARNING,
+                                                "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
+                                                l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
+                                        if (!JPWL_ASSUME) {
+                                                opj_event_msg(p_t2->cinfo, EVT_ERROR, "JPWL: giving up\n");
+                                                return -999;
+                                        }
+                                        l_seg->newlen = 8192 - l_cblk->len;
+                                        opj_event_msg(p_t2->cinfo, EVT_WARNING, "      - truncating segment to %d\n", l_seg->newlen);
+                                        break;
+                                };
+
+#endif /* USE_JPWL */
+                                        JAS_FPRINTF(stderr, "p_data_read (%d) newlen (%d) \n", *p_data_read, l_seg->newlen );
+                                *(p_data_read) += l_seg->newlen;
+
+                                l_seg->numpasses += l_seg->numnewpasses;
+                                l_cblk->numnewpasses -= l_seg->numnewpasses;
+                                if (l_cblk->numnewpasses > 0)
+                                {
+                                        ++l_seg;
+                                        ++l_cblk->numsegs;
+                                }
+                        } while (l_cblk->numnewpasses > 0);
+
+                        ++l_cblk;
+                }
+
+                ++l_band;
+        }
+
+        return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_t2_init_seg(   opj_tcd_cblk_dec_t* cblk,
+                            OPJ_UINT32 index, 
+                            OPJ_UINT32 cblksty, 
+                            OPJ_UINT32 first)
+{
+        opj_tcd_seg_t* seg = 00;
+        OPJ_UINT32 l_nb_segs = index + 1;
+
+        if (l_nb_segs > cblk->m_current_max_segs) {
+                opj_tcd_seg_t* new_segs;
+                cblk->m_current_max_segs += OPJ_J2K_DEFAULT_NB_SEGS;
+
+                new_segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, cblk->m_current_max_segs * sizeof(opj_tcd_seg_t));
+                if(! new_segs) {
+                        opj_free(cblk->segs);
+                        cblk->segs = NULL;
+                        cblk->m_current_max_segs = 0;
+                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to initialize segment %d\n", l_nb_segs); */
+                        return OPJ_FALSE;
+                }
+                cblk->segs = new_segs;
+        }
+
+        seg = &cblk->segs[index];
+        memset(seg,0,sizeof(opj_tcd_seg_t));
+
+        if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {
+                seg->maxpasses = 1;
+        }
+        else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {
+                if (first) {
+                        seg->maxpasses = 10;
+                } else {
+                        seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1;
+                }
+        } else {
+                seg->maxpasses = 109;
+        }
+
+        return OPJ_TRUE;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.h
new file mode 100644
index 0000000..931141e
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.h
@@ -0,0 +1,133 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __T2_H
+#define __T2_H
+/**
+@file t2.h
+@brief Implementation of a tier-2 coding (packetization of code-block data) (T2)
+
+*/
+
+/** @defgroup T2 T2 - Implementation of a tier-2 coding */
+/*@{*/
+
+/**
+Tier-2 coding
+*/
+typedef struct opj_t2 {
+
+	/** Encoding: pointer to the src image. Decoding: pointer to the dst image. */
+	opj_image_t *image;
+	/** pointer to the image coding parameters */
+	opj_cp_t *cp;
+} opj_t2_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Encode the packets of a tile to a destination buffer
+@param t2               T2 handle
+@param tileno           number of the tile encoded
+@param tile             the tile for which to write the packets
+@param maxlayers        maximum number of layers
+@param dest             the destination buffer
+@param p_data_written   FIXME DOC
+@param len              the length of the destination buffer
+@param cstr_info        Codestream information structure
+@param tpnum            Tile part number of the current tile
+@param tppos            The position of the tile part flag in the progression order
+@param pino             FIXME DOC
+@param t2_mode          If == 0 In Threshold calculation ,If == 1 Final pass
+*/
+OPJ_BOOL opj_t2_encode_packets(	opj_t2_t* t2,
+								OPJ_UINT32 tileno,
+								opj_tcd_tile_t *tile,
+								OPJ_UINT32 maxlayers,
+								OPJ_BYTE *dest,
+								OPJ_UINT32 * p_data_written,
+								OPJ_UINT32 len,
+								opj_codestream_info_t *cstr_info,
+								OPJ_UINT32 tpnum,
+								OPJ_INT32 tppos,
+								OPJ_UINT32 pino,
+								J2K_T2_MODE t2_mode);
+
+/**
+Decode the packets of a tile from a source buffer
+@param t2 T2 handle
+@param tileno number that identifies the tile for which to decode the packets
+@param tile tile for which to decode the packets
+@param src         FIXME DOC
+@param p_data_read the source buffer
+@param len length of the source buffer
+@param cstr_info   FIXME DOC
+
+@return FIXME DOC
+ */
+OPJ_BOOL opj_t2_decode_packets(	opj_t2_t *t2,
+                                OPJ_UINT32 tileno,
+                                opj_tcd_tile_t *tile,
+                                OPJ_BYTE *src,
+                                OPJ_UINT32 * p_data_read,
+                                OPJ_UINT32 len,
+                                opj_codestream_index_t *cstr_info);
+
+/**
+ * Creates a Tier 2 handle
+ *
+ * @param	p_image		Source or destination image
+ * @param	p_cp		Image coding parameters.
+ * @return		a new T2 handle if successful, NULL otherwise.
+*/
+opj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp);
+
+/**
+Destroy a T2 handle
+@param t2 T2 handle to destroy
+*/
+void opj_t2_destroy(opj_t2_t *t2);
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __T2_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.c
new file mode 100644
index 0000000..94feb17
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.c
@@ -0,0 +1,2129 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/* ----------------------------------------------------------------------- */
+
+/* TODO MSD: */
+#ifdef TODO_MSD 
+void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) {
+        int tileno, compno, resno, bandno, precno;/*, cblkno;*/
+
+        fprintf(fd, "image {\n");
+        fprintf(fd, "  tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n", 
+                img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1);
+
+        for (tileno = 0; tileno < img->th * img->tw; tileno++) {
+                opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno];
+                fprintf(fd, "  tile {\n");
+                fprintf(fd, "    x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n",
+                        tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps);
+                for (compno = 0; compno < tile->numcomps; compno++) {
+                        opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+                        fprintf(fd, "    tilec {\n");
+                        fprintf(fd,
+                                "      x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n",
+                                tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions);
+                        for (resno = 0; resno < tilec->numresolutions; resno++) {
+                                opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+                                fprintf(fd, "\n   res {\n");
+                                fprintf(fd,
+                                        "          x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n",
+                                        res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands);
+                                for (bandno = 0; bandno < res->numbands; bandno++) {
+                                        opj_tcd_band_t *band = &res->bands[bandno];
+                                        fprintf(fd, "        band {\n");
+                                        fprintf(fd,
+                                                "          x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n",
+                                                band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps);
+                                        for (precno = 0; precno < res->pw * res->ph; precno++) {
+                                                opj_tcd_precinct_t *prec = &band->precincts[precno];
+                                                fprintf(fd, "          prec {\n");
+                                                fprintf(fd,
+                                                        "            x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n",
+                                                        prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch);
+                                                /*
+                                                for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) {
+                                                        opj_tcd_cblk_t *cblk = &prec->cblks[cblkno];
+                                                        fprintf(fd, "            cblk {\n");
+                                                        fprintf(fd,
+                                                                "              x0=%d, y0=%d, x1=%d, y1=%d\n",
+                                                                cblk->x0, cblk->y0, cblk->x1, cblk->y1);
+                                                        fprintf(fd, "            }\n");
+                                                }
+                                                */
+                                                fprintf(fd, "          }\n");
+                                        }
+                                        fprintf(fd, "        }\n");
+                                }
+                                fprintf(fd, "      }\n");
+                        }
+                        fprintf(fd, "    }\n");
+                }
+                fprintf(fd, "  }\n");
+        }
+        fprintf(fd, "}\n");
+}
+#endif
+/**
+* Allocates memory for a decoding code block.
+*/
+static OPJ_BOOL opj_tcd_code_block_dec_allocate (opj_tcd_cblk_dec_t * p_code_block);
+
+/**
+ * Deallocates the decoding data of the given precinct.
+ */
+static void opj_tcd_code_block_dec_deallocate (opj_tcd_precinct_t * p_precinct);
+
+/**
+ * Allocates memory for an encoding code block.
+ */
+static OPJ_BOOL opj_tcd_code_block_enc_allocate (opj_tcd_cblk_enc_t * p_code_block);
+
+/**
+ * Deallocates the encoding data of the given precinct.
+ */
+static void opj_tcd_code_block_enc_deallocate (opj_tcd_precinct_t * p_precinct);
+
+
+/**
+Free the memory allocated for encoding
+@param tcd TCD handle
+*/
+static void opj_tcd_free_tile(opj_tcd_t *tcd);
+
+
+static OPJ_BOOL opj_tcd_t2_decode ( opj_tcd_t *p_tcd,
+                                    OPJ_BYTE * p_src_data,
+                                    OPJ_UINT32 * p_data_read,
+                                    OPJ_UINT32 p_max_src_size,
+                                    opj_codestream_index_t *p_cstr_index );
+
+static OPJ_BOOL opj_tcd_t1_decode (opj_tcd_t *p_tcd);
+
+static OPJ_BOOL opj_tcd_dwt_decode (opj_tcd_t *p_tcd);
+
+static OPJ_BOOL opj_tcd_mct_decode (opj_tcd_t *p_tcd);
+
+static OPJ_BOOL opj_tcd_dc_level_shift_decode (opj_tcd_t *p_tcd);
+
+
+static OPJ_BOOL opj_tcd_dc_level_shift_encode ( opj_tcd_t *p_tcd );
+
+static OPJ_BOOL opj_tcd_mct_encode ( opj_tcd_t *p_tcd );
+
+static OPJ_BOOL opj_tcd_dwt_encode ( opj_tcd_t *p_tcd );
+
+static OPJ_BOOL opj_tcd_t1_encode ( opj_tcd_t *p_tcd );
+
+static OPJ_BOOL opj_tcd_t2_encode (     opj_tcd_t *p_tcd,
+                                                                    OPJ_BYTE * p_dest_data,
+                                                                    OPJ_UINT32 * p_data_written,
+                                                                    OPJ_UINT32 p_max_dest_size,
+                                                                    opj_codestream_info_t *p_cstr_info );
+
+static OPJ_BOOL opj_tcd_rate_allocate_encode(   opj_tcd_t *p_tcd,
+                                                                                        OPJ_BYTE * p_dest_data,
+                                                                                        OPJ_UINT32 p_max_dest_size,
+                                                                                        opj_codestream_info_t *p_cstr_info );
+
+/* ----------------------------------------------------------------------- */
+
+/**
+Create a new TCD handle
+*/
+opj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder)
+{
+        opj_tcd_t *l_tcd = 00;
+
+        /* create the tcd structure */
+        l_tcd = (opj_tcd_t*) opj_malloc(sizeof(opj_tcd_t));
+        if (!l_tcd) {
+                return 00;
+        }
+        memset(l_tcd,0,sizeof(opj_tcd_t));
+
+        l_tcd->m_is_decoder = p_is_decoder ? 1 : 0;
+
+        l_tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t));
+        if (!l_tcd->tcd_image) {
+                opj_free(l_tcd);
+                return 00;
+        }
+        memset(l_tcd->tcd_image,0,sizeof(opj_tcd_image_t));
+
+        return l_tcd;
+}
+
+
+/* ----------------------------------------------------------------------- */
+
+void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd) {
+        OPJ_UINT32 layno;
+
+        for (layno = 0; layno < tcd->tcp->numlayers; layno++) {
+                opj_tcd_makelayer_fixed(tcd, layno, 1);
+        }
+}
+
+
+void opj_tcd_makelayer( opj_tcd_t *tcd,
+                                                OPJ_UINT32 layno,
+                                                OPJ_FLOAT64 thresh,
+                                                OPJ_UINT32 final)
+{
+        OPJ_UINT32 compno, resno, bandno, precno, cblkno;
+        OPJ_UINT32 passno;
+
+        opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;
+
+        tcd_tile->distolayer[layno] = 0;        /* fixed_quality */
+
+        for (compno = 0; compno < tcd_tile->numcomps; compno++) {
+                opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
+
+                for (resno = 0; resno < tilec->numresolutions; resno++) {
+                        opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+
+                        for (bandno = 0; bandno < res->numbands; bandno++) {
+                                opj_tcd_band_t *band = &res->bands[bandno];
+
+                                for (precno = 0; precno < res->pw * res->ph; precno++) {
+                                        opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+                                        for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+                                                opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
+                                                opj_tcd_layer_t *layer = &cblk->layers[layno];
+                                                OPJ_UINT32 n;
+
+                                                if (layno == 0) {
+                                                        cblk->numpassesinlayers = 0;
+                                                }
+
+                                                n = cblk->numpassesinlayers;
+
+                                                for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) {
+                                                        OPJ_UINT32 dr;
+                                                        OPJ_FLOAT64 dd;
+                                                        opj_tcd_pass_t *pass = &cblk->passes[passno];
+
+                                                        if (n == 0) {
+                                                                dr = pass->rate;
+                                                                dd = pass->distortiondec;
+                                                        } else {
+                                                                dr = pass->rate - cblk->passes[n - 1].rate;
+                                                                dd = pass->distortiondec - cblk->passes[n - 1].distortiondec;
+                                                        }
+
+                                                        if (!dr) {
+                                                                if (dd != 0)
+                                                                        n = passno + 1;
+                                                                continue;
+                                                        }
+                                                        if (dd / dr >= thresh)
+                                                                n = passno + 1;
+                                                }
+
+                                                layer->numpasses = n - cblk->numpassesinlayers;
+
+                                                if (!layer->numpasses) {
+                                                        layer->disto = 0;
+                                                        continue;
+                                                }
+
+                                                if (cblk->numpassesinlayers == 0) {
+                                                        layer->len = cblk->passes[n - 1].rate;
+                                                        layer->data = cblk->data;
+                                                        layer->disto = cblk->passes[n - 1].distortiondec;
+                                                } else {
+                                                        layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;
+                                                        layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
+                                                        layer->disto = cblk->passes[n - 1].distortiondec - cblk->passes[cblk->numpassesinlayers - 1].distortiondec;
+                                                }
+
+                                                tcd_tile->distolayer[layno] += layer->disto;    /* fixed_quality */
+
+                                                if (final)
+                                                        cblk->numpassesinlayers = n;
+                                        }
+                                }
+                        }
+                }
+        }
+}
+
+void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final) {
+        OPJ_UINT32 compno, resno, bandno, precno, cblkno;
+        OPJ_INT32 value;                        /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */
+        OPJ_INT32 matrice[10][10][3];
+        OPJ_UINT32 i, j, k;
+
+        opj_cp_t *cp = tcd->cp;
+        opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;
+        opj_tcp_t *tcd_tcp = tcd->tcp;
+
+        for (compno = 0; compno < tcd_tile->numcomps; compno++) {
+                opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
+
+                for (i = 0; i < tcd_tcp->numlayers; i++) {
+                        for (j = 0; j < tilec->numresolutions; j++) {
+                                for (k = 0; k < 3; k++) {
+                                        matrice[i][j][k] =
+                                                (OPJ_INT32) ((OPJ_FLOAT32)cp->m_specific_param.m_enc.m_matrice[i * tilec->numresolutions * 3 + j * 3 + k]
+                                                * (OPJ_FLOAT32) (tcd->image->comps[compno].prec / 16.0));
+                                }
+                        }
+                }
+
+                for (resno = 0; resno < tilec->numresolutions; resno++) {
+                        opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+
+                        for (bandno = 0; bandno < res->numbands; bandno++) {
+                                opj_tcd_band_t *band = &res->bands[bandno];
+
+                                for (precno = 0; precno < res->pw * res->ph; precno++) {
+                                        opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+                                        for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+                                                opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
+                                                opj_tcd_layer_t *layer = &cblk->layers[layno];
+                                                OPJ_UINT32 n;
+                                                OPJ_INT32 imsb = (OPJ_INT32)(tcd->image->comps[compno].prec - cblk->numbps); /* number of bit-plan equal to zero */
+
+                                                /* Correction of the matrix of coefficient to include the IMSB information */
+                                                if (layno == 0) {
+                                                        value = matrice[layno][resno][bandno];
+                                                        if (imsb >= value) {
+                                                                value = 0;
+                                                        } else {
+                                                                value -= imsb;
+                                                        }
+                                                } else {
+                                                        value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno];
+                                                        if (imsb >= matrice[layno - 1][resno][bandno]) {
+                                                                value -= (imsb - matrice[layno - 1][resno][bandno]);
+                                                                if (value < 0) {
+                                                                        value = 0;
+                                                                }
+                                                        }
+                                                }
+
+                                                if (layno == 0) {
+                                                        cblk->numpassesinlayers = 0;
+                                                }
+
+                                                n = cblk->numpassesinlayers;
+                                                if (cblk->numpassesinlayers == 0) {
+                                                        if (value != 0) {
+                                                                n = 3 * (OPJ_UINT32)value - 2 + cblk->numpassesinlayers;
+                                                        } else {
+                                                                n = cblk->numpassesinlayers;
+                                                        }
+                                                } else {
+                                                        n = 3 * (OPJ_UINT32)value + cblk->numpassesinlayers;
+                                                }
+
+                                                layer->numpasses = n - cblk->numpassesinlayers;
+
+                                                if (!layer->numpasses)
+                                                        continue;
+
+                                                if (cblk->numpassesinlayers == 0) {
+                                                        layer->len = cblk->passes[n - 1].rate;
+                                                        layer->data = cblk->data;
+                                                } else {
+                                                        layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;
+                                                        layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
+                                                }
+
+                                                if (final)
+                                                        cblk->numpassesinlayers = n;
+                                        }
+                                }
+                        }
+                }
+        }
+}
+
+OPJ_BOOL opj_tcd_rateallocate(  opj_tcd_t *tcd,
+                                                                OPJ_BYTE *dest,
+                                                                OPJ_UINT32 * p_data_written,
+                                                                OPJ_UINT32 len,
+                                                                opj_codestream_info_t *cstr_info)
+{
+        OPJ_UINT32 compno, resno, bandno, precno, cblkno, layno;
+        OPJ_UINT32 passno;
+        OPJ_FLOAT64 min, max;
+        OPJ_FLOAT64 cumdisto[100];      /* fixed_quality */
+        const OPJ_FLOAT64 K = 1;                /* 1.1; fixed_quality */
+        OPJ_FLOAT64 maxSE = 0;
+
+        opj_cp_t *cp = tcd->cp;
+        opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;
+        opj_tcp_t *tcd_tcp = tcd->tcp;
+
+        min = DBL_MAX;
+        max = 0;
+
+        tcd_tile->numpix = 0;           /* fixed_quality */
+
+        for (compno = 0; compno < tcd_tile->numcomps; compno++) {
+                opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
+                tilec->numpix = 0;
+
+                for (resno = 0; resno < tilec->numresolutions; resno++) {
+                        opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+
+                        for (bandno = 0; bandno < res->numbands; bandno++) {
+                                opj_tcd_band_t *band = &res->bands[bandno];
+
+                                for (precno = 0; precno < res->pw * res->ph; precno++) {
+                                        opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+                                        for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+                                                opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
+
+                                                for (passno = 0; passno < cblk->totalpasses; passno++) {
+                                                        opj_tcd_pass_t *pass = &cblk->passes[passno];
+                                                        OPJ_INT32 dr;
+                                                        OPJ_FLOAT64 dd, rdslope;
+
+                                                        if (passno == 0) {
+                                                                dr = (OPJ_INT32)pass->rate;
+                                                                dd = pass->distortiondec;
+                                                        } else {
+                                                                dr = (OPJ_INT32)(pass->rate - cblk->passes[passno - 1].rate);
+                                                                dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec;
+                                                        }
+
+                                                        if (dr == 0) {
+                                                                continue;
+                                                        }
+
+                                                        rdslope = dd / dr;
+                                                        if (rdslope < min) {
+                                                                min = rdslope;
+                                                        }
+
+                                                        if (rdslope > max) {
+                                                                max = rdslope;
+                                                        }
+                                                } /* passno */
+
+                                                /* fixed_quality */
+                                                tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
+                                                tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
+                                        } /* cbklno */
+                                } /* precno */
+                        } /* bandno */
+                } /* resno */
+
+                maxSE += (((OPJ_FLOAT64)(1 << tcd->image->comps[compno].prec) - 1.0)
+                        * ((OPJ_FLOAT64)(1 << tcd->image->comps[compno].prec) -1.0))
+                        * ((OPJ_FLOAT64)(tilec->numpix));
+        } /* compno */
+
+        /* index file */
+        if(cstr_info) {
+                opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno];
+                tile_info->numpix = tcd_tile->numpix;
+                tile_info->distotile = tcd_tile->distotile;
+                tile_info->thresh = (OPJ_FLOAT64 *) opj_malloc(tcd_tcp->numlayers * sizeof(OPJ_FLOAT64));
+        }
+
+        for (layno = 0; layno < tcd_tcp->numlayers; layno++) {
+                OPJ_FLOAT64 lo = min;
+                OPJ_FLOAT64 hi = max;
+                OPJ_BOOL success = OPJ_FALSE;
+                OPJ_UINT32 maxlen = tcd_tcp->rates[layno] ? opj_uint_min(((OPJ_UINT32) ceil(tcd_tcp->rates[layno])), len) : len;
+                OPJ_FLOAT64 goodthresh = 0;
+                OPJ_FLOAT64 stable_thresh = 0;
+                OPJ_UINT32 i;
+                OPJ_FLOAT64 distotarget;                /* fixed_quality */
+
+                /* fixed_quality */
+                distotarget = tcd_tile->distotile - ((K * maxSE) / pow((OPJ_FLOAT32)10, tcd_tcp->distoratio[layno] / 10));
+
+                /* Don't try to find an optimal threshold but rather take everything not included yet, if
+                  -r xx,yy,zz,0   (disto_alloc == 1 and rates == 0)
+                  -q xx,yy,zz,0   (fixed_quality == 1 and distoratio == 0)
+                  ==> possible to have some lossy layers and the last layer for sure lossless */
+                if ( ((cp->m_specific_param.m_enc.m_disto_alloc==1) && (tcd_tcp->rates[layno]>0)) || ((cp->m_specific_param.m_enc.m_fixed_quality==1) && (tcd_tcp->distoratio[layno]>0))) {
+                        opj_t2_t*t2 = opj_t2_create(tcd->image, cp);
+                        OPJ_FLOAT64 thresh = 0;
+
+                        if (t2 == 00) {
+                                return OPJ_FALSE;
+                        }
+
+                        for     (i = 0; i < 128; ++i) {
+                                OPJ_FLOAT64 distoachieved = 0;  /* fixed_quality */
+
+                                thresh = (lo + hi) / 2;
+
+                                opj_tcd_makelayer(tcd, layno, thresh, 0);
+
+                                if (cp->m_specific_param.m_enc.m_fixed_quality) {       /* fixed_quality */
+                                        if(cp->m_specific_param.m_enc.m_cinema){
+                                                if (! opj_t2_encode_packets(t2,tcd->tcd_tileno, tcd_tile, layno + 1, dest, p_data_written, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC)) {
+
+                                                        lo = thresh;
+                                                        continue;
+                                                }
+                                                else {
+                                                        distoachieved = layno == 0 ?
+                                                                        tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno];
+
+                                                        if (distoachieved < distotarget) {
+                                                                hi=thresh;
+                                                                stable_thresh = thresh;
+                                                                continue;
+                                                        }else{
+                                                                lo=thresh;
+                                                        }
+                                                }
+                                        }else{
+                                                distoachieved = (layno == 0) ?
+                                                                tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
+
+                                                if (distoachieved < distotarget) {
+                                                        hi = thresh;
+                                                        stable_thresh = thresh;
+                                                        continue;
+                                                }
+                                                lo = thresh;
+                                        }
+                                } else {
+                                        if (! opj_t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest,p_data_written, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC))
+                                        {
+                                                /* TODO: what to do with l ??? seek / tell ??? */
+                                                /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */
+                                                lo = thresh;
+                                                continue;
+                                        }
+
+                                        hi = thresh;
+                                        stable_thresh = thresh;
+                                }
+                        }
+
+                        success = OPJ_TRUE;
+                        goodthresh = stable_thresh == 0? thresh : stable_thresh;
+
+                        opj_t2_destroy(t2);
+                } else {
+                        success = OPJ_TRUE;
+                        goodthresh = min;
+                }
+
+                if (!success) {
+                        return OPJ_FALSE;
+                }
+
+                if(cstr_info) { /* Threshold for Marcela Index */
+                        cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh;
+                }
+
+                opj_tcd_makelayer(tcd, layno, goodthresh, 1);
+
+                /* fixed_quality */
+                cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_init( opj_tcd_t *p_tcd,
+                                           opj_image_t * p_image,
+                                           opj_cp_t * p_cp )
+{
+        OPJ_UINT32 l_tile_comp_size;
+
+        p_tcd->image = p_image;
+        p_tcd->cp = p_cp;
+
+        p_tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t));
+        if (! p_tcd->tcd_image->tiles) {
+                return OPJ_FALSE;
+        }
+        memset(p_tcd->tcd_image->tiles,0, sizeof(opj_tcd_tile_t));
+
+        l_tile_comp_size = p_image->numcomps * (OPJ_UINT32)sizeof(opj_tcd_tilecomp_t);
+        p_tcd->tcd_image->tiles->comps = (opj_tcd_tilecomp_t *) opj_malloc(l_tile_comp_size);
+        if (! p_tcd->tcd_image->tiles->comps ) {
+                return OPJ_FALSE;
+        }
+        memset( p_tcd->tcd_image->tiles->comps , 0 , l_tile_comp_size);
+
+        p_tcd->tcd_image->tiles->numcomps = p_image->numcomps;
+        p_tcd->tp_pos = p_cp->m_specific_param.m_enc.m_tp_pos;
+
+        return OPJ_TRUE;
+}
+
+/**
+Destroy a previously created TCD handle
+*/
+void opj_tcd_destroy(opj_tcd_t *tcd) {
+        if (tcd) {
+                opj_tcd_free_tile(tcd);
+
+                if (tcd->tcd_image) {
+                        opj_free(tcd->tcd_image);
+                        tcd->tcd_image = 00;
+                }
+                opj_free(tcd);
+        }
+}
+
+/* ----------------------------------------------------------------------- */
+#define OPJ_MACRO_TCD_ALLOCATE(FUNCTION,TYPE,FRACTION,ELEMENT,FUNCTION_ELEMENT)                                                                                                                                       \
+OPJ_BOOL FUNCTION (     opj_tcd_t *p_tcd,                        \
+                        OPJ_UINT32 p_tile_no                        \
+                        )                                           \
+{                                                                   \
+        OPJ_UINT32 (*l_gain_ptr)(OPJ_UINT32) = 00;                  \
+        OPJ_UINT32 compno, resno, bandno, precno, cblkno;           \
+        opj_tcp_t * l_tcp = 00;                                  \
+        opj_cp_t * l_cp = 00;                                    \
+        opj_tcd_tile_t * l_tile = 00;                            \
+        opj_tccp_t *l_tccp = 00;                                    \
+        opj_tcd_tilecomp_t *l_tilec = 00;                        \
+        opj_image_comp_t * l_image_comp = 00;                       \
+        opj_tcd_resolution_t *l_res = 00;                        \
+        opj_tcd_band_t *l_band = 00;                             \
+        opj_stepsize_t * l_step_size = 00;                          \
+        opj_tcd_precinct_t *l_current_precinct = 00;             \
+        TYPE* l_code_block = 00;                                    \
+        opj_image_t *l_image = 00;                                  \
+        OPJ_UINT32 p,q;                                             \
+        OPJ_UINT32 l_level_no;                                      \
+        OPJ_UINT32 l_pdx, l_pdy;                                    \
+        OPJ_UINT32 l_gain;                                          \
+        OPJ_INT32 l_x0b, l_y0b;                                     \
+        /* extent of precincts , top left, bottom right**/          \
+        OPJ_INT32 l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end, l_br_prc_y_end;                                                                                                                             \
+        /* number of precinct for a resolution */                   \
+        OPJ_UINT32 l_nb_precincts;                                  \
+        /* room needed to store l_nb_precinct precinct for a resolution */                                                                                                                                        \
+        OPJ_UINT32 l_nb_precinct_size;                              \
+        /* number of code blocks for a precinct*/                   \
+        OPJ_UINT32 l_nb_code_blocks;                                \
+        /* room needed to store l_nb_code_blocks code blocks for a precinct*/                                                                                                                                     \
+        OPJ_UINT32 l_nb_code_blocks_size;                           \
+        /* size of data for a tile */                               \
+        OPJ_UINT32 l_data_size;                                     \
+                                                                    \
+        l_cp = p_tcd->cp;                                           \
+        l_tcp = &(l_cp->tcps[p_tile_no]);                           \
+        l_tile = p_tcd->tcd_image->tiles;                           \
+        l_tccp = l_tcp->tccps;                                      \
+        l_tilec = l_tile->comps;                                    \
+        l_image = p_tcd->image;                                     \
+        l_image_comp = p_tcd->image->comps;                         \
+                                                                    \
+        p = p_tile_no % l_cp->tw;       /* tile coordinates */      \
+        q = p_tile_no / l_cp->tw;                                   \
+        /*fprintf(stderr, "Tile coordinate = %d,%d\n", p, q);*/     \
+                                                                    \
+        /* 4 borders of the tile rescale on the image if necessary */                                                                                                                                             \
+        l_tile->x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + p * l_cp->tdx), (OPJ_INT32)l_image->x0);                                                                                                                                             \
+        l_tile->y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + q * l_cp->tdy), (OPJ_INT32)l_image->y0);                                                                                                                                             \
+        l_tile->x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (p + 1) * l_cp->tdx), (OPJ_INT32)l_image->x1);                                                                                                                                       \
+        l_tile->y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (q + 1) * l_cp->tdy), (OPJ_INT32)l_image->y1);                                                                                                                                       \
+        /* testcase 1888.pdf.asan.35.988 */ \
+        if (l_tccp->numresolutions == 0) { \
+            fprintf(stderr, "tiles require at least one resolution\n"); \
+            return OPJ_FALSE; \
+        } \
+        /*fprintf(stderr, "Tile border = %d,%d,%d,%d\n", l_tile->x0, l_tile->y0,l_tile->x1,l_tile->y1);*/                                                                                                         \
+                                                                    \
+        /*tile->numcomps = image->numcomps; */                      \
+        for(compno = 0; compno < l_tile->numcomps; ++compno) {      \
+                /*fprintf(stderr, "compno = %d/%d\n", compno, l_tile->numcomps);*/                                                                                                                                \
+                                                                    \
+                /* border of each l_tile component (global) */      \
+                l_tilec->x0 = opj_int_ceildiv(l_tile->x0, (OPJ_INT32)l_image_comp->dx);                                                                                                                                          \
+                l_tilec->y0 = opj_int_ceildiv(l_tile->y0, (OPJ_INT32)l_image_comp->dy);                                                                                                                                          \
+                l_tilec->x1 = opj_int_ceildiv(l_tile->x1, (OPJ_INT32)l_image_comp->dx);                                                                                                                                          \
+                l_tilec->y1 = opj_int_ceildiv(l_tile->y1, (OPJ_INT32)l_image_comp->dy);                                                                                                                                          \
+                /*fprintf(stderr, "\tTile compo border = %d,%d,%d,%d\n", l_tilec->x0, l_tilec->y0,l_tilec->x1,l_tilec->y1);*/                                                                                     \
+                if (l_tilec->x1 < 0 || l_tilec->x0 < 0 || l_tilec->y1 < 0 || l_tilec->y0 < 0) return OPJ_FALSE;\
+                l_data_size = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0)           \
+                * (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0) * (OPJ_UINT32)sizeof(OPJ_UINT32 );\
+                l_tilec->numresolutions = l_tccp->numresolutions;   \
+                if (l_tccp->numresolutions < l_cp->m_specific_param.m_dec.m_reduce) {                                                                                                                             \
+                        l_tilec->minimum_num_resolutions = 1;       \
+                }                                                   \
+                else {                                              \
+                        l_tilec->minimum_num_resolutions = l_tccp->numresolutions                                                                                                                                 \
+                        - l_cp->m_specific_param.m_dec.m_reduce;    \
+                }                                                   \
+                                                                    \
+                if (l_tilec->data == 00) {                          \
+                        l_tilec->data = (OPJ_INT32 *) opj_malloc(l_data_size);                                                                                                                                    \
+                        if (! l_tilec->data ) {                     \
+                                return OPJ_FALSE;                   \
+                        }                                           \
+                        /*fprintf(stderr, "\tAllocate data of tilec (int): %d x OPJ_UINT32\n",l_data_size);*/                                                                                                     \
+                                                                    \
+                        l_tilec->data_size = l_data_size;           \
+                }                                                   \
+                else if (l_data_size > l_tilec->data_size) {        \
+                        OPJ_INT32 * new_data = (OPJ_INT32 *) opj_realloc(l_tilec->data, l_data_size);                                                                                                             \
+                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle tile data\n");                                                                                                 */  \
+                        fprintf(stderr, "Not enough memory to handle tile data\n");                                                                                                                               \
+                        if (! new_data) {                           \
+                                opj_free(l_tilec->data);            \
+                                l_tilec->data = NULL;               \
+                                l_tilec->data_size = 0;             \
+                                return OPJ_FALSE;                   \
+                        }                                           \
+                        l_tilec->data = new_data;                   \
+                        /*fprintf(stderr, "\tReallocate data of tilec (int): from %d to %d x OPJ_UINT32\n", l_tilec->data_size, l_data_size);*/                                                                   \
+                        l_tilec->data_size = l_data_size;           \
+                }                                                   \
+                                                                    \
+                l_data_size = l_tilec->numresolutions * (OPJ_UINT32)sizeof(opj_tcd_resolution_t);                                                                                                                          \
+                                                                    \
+                if (l_tilec->resolutions == 00) {                   \
+                        l_tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(l_data_size);                                                                                                               \
+                        if (! l_tilec->resolutions ) {              \
+                                return OPJ_FALSE;                   \
+                        }                                           \
+                        /*fprintf(stderr, "\tAllocate resolutions of tilec (opj_tcd_resolution_t): %d\n",l_data_size);*/                                                                                       \
+                        l_tilec->resolutions_size = l_data_size;    \
+                        memset(l_tilec->resolutions,0,l_data_size); \
+                }                                                   \
+                else if (l_data_size > l_tilec->resolutions_size) { \
+                        opj_tcd_resolution_t* new_resolutions = (opj_tcd_resolution_t *) opj_realloc(l_tilec->resolutions, l_data_size);                                                                    \
+                        if (! new_resolutions) {                    \
+                                /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to tile resolutions\n");                                                                                         */  \
+                                fprintf(stderr, "Not enough memory to tile resolutions\n");                                                                                                                       \
+                                opj_free(l_tilec->resolutions);     \
+                                l_tilec->resolutions = NULL;        \
+                                l_tilec->resolutions_size = 0;      \
+                                return OPJ_FALSE;                   \
+                        }                                           \
+                        l_tilec->resolutions = new_resolutions;     \
+                        /*fprintf(stderr, "\tReallocate data of tilec (int): from %d to %d x OPJ_UINT32\n", l_tilec->resolutions_size, l_data_size);*/                                                            \
+                        memset(((OPJ_BYTE*) l_tilec->resolutions)+l_tilec->resolutions_size,0,l_data_size - l_tilec->resolutions_size);                                                                           \
+                        l_tilec->resolutions_size = l_data_size;    \
+                }                                                   \
+                                                                    \
+                l_level_no = l_tilec->numresolutions - 1;           \
+                l_res = l_tilec->resolutions;                       \
+                l_step_size = l_tccp->stepsizes;                    \
+                if (l_tccp->qmfbid == 0) {                          \
+                        l_gain_ptr = &opj_dwt_getgain_real;         \
+                }                                                   \
+                else {                                              \
+                        l_gain_ptr  = &opj_dwt_getgain;             \
+                }                                                   \
+                /*fprintf(stderr, "\tlevel_no=%d\n",l_level_no);*/  \
+                                                                                                                                                                                                                  \
+                for(resno = 0; resno < l_tilec->numresolutions; ++resno) {                                                                                                                                        \
+                        /*fprintf(stderr, "\t\tresno = %d/%d\n", resno, l_tilec->numresolutions);*/                                                                                                               \
+                        OPJ_INT32 tlcbgxstart, tlcbgystart /*, brcbgxend, brcbgyend*/;                                                                                                                                 \
+                        OPJ_UINT32 cbgwidthexpn, cbgheightexpn;                                                                                                                                                   \
+                        OPJ_UINT32 cblkwidthexpn, cblkheightexpn;                                                                                                                                                 \
+                                                                                                                                                                                                                  \
+                        /* border for each resolution level (global) */                                                                                                                                           \
+                        l_res->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no);                                                                                                                                     \
+                        l_res->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no);                                                                                                                                     \
+                        l_res->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no);                                                                                                                                     \
+                        l_res->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no);                                                                                                                                     \
+                        /*fprintf(stderr, "\t\t\tres_x0= %d, res_y0 =%d, res_x1=%d, res_y1=%d\n", l_res->x0, l_res->y0, l_res->x1, l_res->y1);*/                                                                  \
+                        /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */                                                                                                                     \
+                        l_pdx = l_tccp->prcw[resno];                                                                                                                                                              \
+                        l_pdy = l_tccp->prch[resno];                                                                                                                                                              \
+                        /*fprintf(stderr, "\t\t\tpdx=%d, pdy=%d\n", l_pdx, l_pdy);*/                                                                                                                              \
+                        /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */                                                                                                                            \
+                        l_tl_prc_x_start = opj_int_floordivpow2(l_res->x0, (OPJ_INT32)l_pdx) << l_pdx;                                                                                                                           \
+                        l_tl_prc_y_start = opj_int_floordivpow2(l_res->y0, (OPJ_INT32)l_pdy) << l_pdy;                                                                                                                           \
+                        l_br_prc_x_end = opj_int_ceildivpow2(l_res->x1, (OPJ_INT32)l_pdx) << l_pdx;                                                                                                                              \
+                        l_br_prc_y_end = opj_int_ceildivpow2(l_res->y1, (OPJ_INT32)l_pdy) << l_pdy;                                                                                                                              \
+                        /*fprintf(stderr, "\t\t\tprc_x_start=%d, prc_y_start=%d, br_prc_x_end=%d, br_prc_y_end=%d \n", l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end ,l_br_prc_y_end );*/                    \
+                                                                                                                                                                                                                  \
+                        l_res->pw = (l_res->x0 == l_res->x1) ? 0 : (OPJ_UINT32)((l_br_prc_x_end - l_tl_prc_x_start) >> l_pdx);                                                                                                \
+                        l_res->ph = (l_res->y0 == l_res->y1) ? 0 : (OPJ_UINT32)((l_br_prc_y_end - l_tl_prc_y_start) >> l_pdy);                                                                                                \
+                        /*fprintf(stderr, "\t\t\tres_pw=%d, res_ph=%d\n", l_res->pw, l_res->ph );*/                                                                                                               \
+                                                                                                                                                                                                                  \
+                        l_nb_precincts = l_res->pw * l_res->ph;                                                                                                                                                   \
+                        l_nb_precinct_size = l_nb_precincts * (OPJ_UINT32)sizeof(opj_tcd_precinct_t);                                                                                                                      \
+                        if (resno == 0) {                                                                                                                                                                         \
+                                tlcbgxstart = l_tl_prc_x_start;                                                                                                                                                   \
+                                tlcbgystart = l_tl_prc_y_start;                                                                                                                                                   \
+                                /*brcbgxend = l_br_prc_x_end;*/                                                                                                                                                       \
+                               /* brcbgyend = l_br_prc_y_end;*/                                                                                                                                                       \
+                                cbgwidthexpn = l_pdx;                                                                                                                                                             \
+                                cbgheightexpn = l_pdy;                                                                                                                                                            \
+                                l_res->numbands = 1;                                                                                                                                                              \
+                        }                                                                                                                                                                                         \
+                        else {                                                                                                                                                                                    \
+                                tlcbgxstart = opj_int_ceildivpow2(l_tl_prc_x_start, 1);                                                                                                                               \
+                                tlcbgystart = opj_int_ceildivpow2(l_tl_prc_y_start, 1);                                                                                                                               \
+                                /*brcbgxend = opj_int_ceildivpow2(l_br_prc_x_end, 1);*/                                                                                                                            \
+                                /*brcbgyend = opj_int_ceildivpow2(l_br_prc_y_end, 1);*/                                                                                                                            \
+                                cbgwidthexpn = l_pdx - 1;                                                                                                                                                         \
+                                cbgheightexpn = l_pdy - 1;                                                                                                                                                        \
+                                l_res->numbands = 3;                                                                                                                                                              \
+                        }                                                                                                                                                                                         \
+                                                                                                                                                                                                                  \
+                        cblkwidthexpn = opj_uint_min(l_tccp->cblkw, cbgwidthexpn);                                                                                                                                    \
+                        cblkheightexpn = opj_uint_min(l_tccp->cblkh, cbgheightexpn);                                                                                                                                  \
+                        l_band = l_res->bands;                                                                                                                                                                    \
+                                                                                                                                                                                                                  \
+                        for (bandno = 0; bandno < l_res->numbands; ++bandno) {                                                                                                                                    \
+                                OPJ_INT32 numbps;                                                                                                                                                                 \
+                                /*fprintf(stderr, "\t\t\tband_no=%d/%d\n", bandno, l_res->numbands );*/                                                                                                           \
+                                                                                                                                                                                                                  \
+                                if (resno == 0) {                                                                                                                                                                 \
+                                        l_band->bandno = 0 ;                                                                                                                                                      \
+                                        l_band->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no);                                                                                                                    \
+                                        l_band->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no);                                                                                                                    \
+                                        l_band->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no);                                                                                                                    \
+                                        l_band->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no);                                                                                                                    \
+                                }                                                                                                                                                                                 \
+                                else {                                                                                                                                                                            \
+                                        l_band->bandno = bandno + 1;                                                                                                                                              \
+                                        /* x0b = 1 if bandno = 1 or 3 */                                                                                                                                          \
+                                        l_x0b = l_band->bandno&1;                                                                                                                                                 \
+                                        /* y0b = 1 if bandno = 2 or 3 */                                                                                                                                          \
+                                        l_y0b = (OPJ_INT32)((l_band->bandno)>>1);                                                                                                                                              \
+                                        /* l_band border (global) */                                                                                                                                              \
+                                        l_band->x0 = opj_int_ceildivpow2(l_tilec->x0 - (1 << l_level_no) * l_x0b, (OPJ_INT32)(l_level_no + 1));                                                                                    \
+                                        l_band->y0 = opj_int_ceildivpow2(l_tilec->y0 - (1 << l_level_no) * l_y0b, (OPJ_INT32)(l_level_no + 1));                                                                                    \
+                                        l_band->x1 = opj_int_ceildivpow2(l_tilec->x1 - (1 << l_level_no) * l_x0b, (OPJ_INT32)(l_level_no + 1));                                                                                    \
+                                        l_band->y1 = opj_int_ceildivpow2(l_tilec->y1 - (1 << l_level_no) * l_y0b, (OPJ_INT32)(l_level_no + 1));                                                                                    \
+                                }                                                                                                                                                                                 \
+                                                                                                                                                                                                                  \
+                                /** avoid an if with storing function pointer */                                                                                                                                  \
+                                l_gain = (*l_gain_ptr) (l_band->bandno);                                                                                                                                          \
+                                numbps = (OPJ_INT32)(l_image_comp->prec + l_gain);                                                                                                                                             \
+                                l_band->stepsize = (OPJ_FLOAT32)(((1.0 + l_step_size->mant / 2048.0) * pow(2.0, (OPJ_INT32) (numbps - l_step_size->expn)))) * FRACTION;                                           \
+                                l_band->numbps = l_step_size->expn + (OPJ_INT32)l_tccp->numgbits - 1;      /* WHY -1 ? */                                                                                                    \
+                                                                                                                                                                                                                  \
+                                if (! l_band->precincts) {                                                                                                                                                        \
+                                        l_band->precincts = (opj_tcd_precinct_t *) opj_malloc( /*3 * */ l_nb_precinct_size);                                                                                   \
+                                        if (! l_band->precincts) {                                                                                                                                                \
+                                                return OPJ_FALSE;                                                                                                                                                 \
+                                        }                                                                                                                                                                         \
+                                        /*fprintf(stderr, "\t\t\t\tAllocate precincts of a band (opj_tcd_precinct_t): %d\n",l_nb_precinct_size);     */                                                        \
+                                        memset(l_band->precincts,0,l_nb_precinct_size);                                                                                                                           \
+                                        l_band->precincts_data_size = l_nb_precinct_size;                                                                                                                         \
+                                }                                                                                                                                                                                 \
+                                else if (l_band->precincts_data_size < l_nb_precinct_size) {                                                                                                                      \
+                                                                                                                                                                                                                  \
+                                        opj_tcd_precinct_t * new_precincts = (opj_tcd_precinct_t *) opj_realloc(l_band->precincts,/*3 * */ l_nb_precinct_size);                                             \
+                                        if (! new_precincts) {                                                                                                                                                    \
+                                                /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle band precints\n");                                                                    */   \
+                                                fprintf(stderr, "Not enough memory to handle band precints\n");                                                                                                   \
+                                                opj_free(l_band->precincts);                                                                                                                                      \
+                                                l_band->precincts = NULL;                                                                                                                                         \
+                                                l_band->precincts_data_size = 0;                                                                                                                                  \
+                                                return OPJ_FALSE;                                                                                                                                                 \
+                                        }                                                                                                                                                                         \
+                                        l_band->precincts = new_precincts;                                                                                                                                        \
+                                        /*fprintf(stderr, "\t\t\t\tReallocate precincts of a band (opj_tcd_precinct_t): from %d to %d\n",l_band->precincts_data_size, l_nb_precinct_size);*/                   \
+                                        memset(((OPJ_BYTE *) l_band->precincts) + l_band->precincts_data_size,0,l_nb_precinct_size - l_band->precincts_data_size);                                                \
+                                        l_band->precincts_data_size = l_nb_precinct_size;                                                                                                                         \
+                                }                                                                                                                                                                                 \
+                                                                                                                                                                                                                  \
+                                l_current_precinct = l_band->precincts;                                                                                                                                           \
+                                for     (precno = 0; precno < l_nb_precincts; ++precno) {                                                                                                                         \
+                                        OPJ_INT32 tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;                                                                                                             \
+                                        OPJ_INT32 cbgxstart = tlcbgxstart + (OPJ_INT32)(precno % l_res->pw) * (1 << cbgwidthexpn);                                                                                           \
+                                        OPJ_INT32 cbgystart = tlcbgystart + (OPJ_INT32)(precno / l_res->pw) * (1 << cbgheightexpn);                                                                                          \
+                                        OPJ_INT32 cbgxend = cbgxstart + (1 << cbgwidthexpn);                                                                                                                      \
+                                        OPJ_INT32 cbgyend = cbgystart + (1 << cbgheightexpn);                                                                                                                     \
+                                        /*fprintf(stderr, "\t precno=%d; bandno=%d, resno=%d; compno=%d\n", precno, bandno , resno, compno);*/                                                                    \
+                                        /*fprintf(stderr, "\t tlcbgxstart(=%d) + (precno(=%d) percent res->pw(=%d)) * (1 << cbgwidthexpn(=%d)) \n",tlcbgxstart,precno,l_res->pw,cbgwidthexpn);*/                  \
+                                                                                                                                                                                                                  \
+                                        /* precinct size (global) */                                                                                                                                              \
+                                        /*fprintf(stderr, "\t cbgxstart=%d, l_band->x0 = %d \n",cbgxstart, l_band->x0);*/                                                                                         \
+                                                                                                                                                                                                                  \
+                                        l_current_precinct->x0 = opj_int_max(cbgxstart, l_band->x0);                                                                                                                  \
+                                        l_current_precinct->y0 = opj_int_max(cbgystart, l_band->y0);                                                                                                                  \
+                                        l_current_precinct->x1 = opj_int_min(cbgxend, l_band->x1);                                                                                                                    \
+                                        l_current_precinct->y1 = opj_int_min(cbgyend, l_band->y1);                                                                                                                    \
+                                        /*fprintf(stderr, "\t prc_x0=%d; prc_y0=%d, prc_x1=%d; prc_y1=%d\n",l_current_precinct->x0, l_current_precinct->y0 ,l_current_precinct->x1, l_current_precinct->y1);*/    \
+                                                                                                                                                                                                                  \
+                                        tlcblkxstart = opj_int_floordivpow2(l_current_precinct->x0, (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn;                                                                                  \
+                                        /*fprintf(stderr, "\t tlcblkxstart =%d\n",tlcblkxstart );*/                                                                                                               \
+                                        tlcblkystart = opj_int_floordivpow2(l_current_precinct->y0, (OPJ_INT32)cblkheightexpn) << cblkheightexpn;                                                                                \
+                                        /*fprintf(stderr, "\t tlcblkystart =%d\n",tlcblkystart );*/                                                                                                               \
+                                        brcblkxend = opj_int_ceildivpow2(l_current_precinct->x1, (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn;                                                                                     \
+                                        /*fprintf(stderr, "\t brcblkxend =%d\n",brcblkxend );*/                                                                                                                   \
+                                        brcblkyend = opj_int_ceildivpow2(l_current_precinct->y1, (OPJ_INT32)cblkheightexpn) << cblkheightexpn;                                                                                   \
+                                        /*fprintf(stderr, "\t brcblkyend =%d\n",brcblkyend );*/                                                                                                                   \
+                                        l_current_precinct->cw = (OPJ_UINT32)((brcblkxend - tlcblkxstart) >> cblkwidthexpn);                                                                                                    \
+                                        l_current_precinct->ch = (OPJ_UINT32)((brcblkyend - tlcblkystart) >> cblkheightexpn);                                                                                                   \
+                                                                                                                                                                                                                  \
+                                        l_nb_code_blocks = l_current_precinct->cw * l_current_precinct->ch;                                                                                                       \
+                                        /*fprintf(stderr, "\t\t\t\t precinct_cw = %d x recinct_ch = %d\n",l_current_precinct->cw, l_current_precinct->ch);      */                                                \
+                                        l_nb_code_blocks_size = l_nb_code_blocks * (OPJ_UINT32)sizeof(TYPE);                                                                                                                  \
+                                                                                                                                                                                                                  \
+                                        if (! l_current_precinct->cblks.ELEMENT) {                                                                                                                                \
+                                                l_current_precinct->cblks.ELEMENT = (TYPE*) opj_malloc(l_nb_code_blocks_size);                                                                                    \
+                                                if (! l_current_precinct->cblks.ELEMENT ) {                                                                                                                       \
+                                                        return OPJ_FALSE;                                                                                                                                         \
+                                                }                                                                                                                                                                 \
+                                                /*fprintf(stderr, "\t\t\t\tAllocate cblks of a precinct (opj_tcd_cblk_dec_t): %d\n",l_nb_code_blocks_size);*/                                                  \
+                                                                                                                                                                                                                  \
+                                                memset(l_current_precinct->cblks.ELEMENT,0,l_nb_code_blocks_size);                                                                                                \
+                                                                                                                                                                                                                  \
+                                                l_current_precinct->block_size = l_nb_code_blocks_size;                                                                                                           \
+                                        }                                                                                                                                                                         \
+                                        else if (l_nb_code_blocks_size > l_current_precinct->block_size) {                                                                                                        \
+                                                TYPE *new_ELEMENT = (TYPE*) opj_realloc(l_current_precinct->cblks.ELEMENT, l_nb_code_blocks_size);                                                                \
+                                                if (! new_ELEMENT) {                                                                                                                                              \
+                                                        opj_free(l_current_precinct->cblks.ELEMENT);                                                                                                              \
+                                                        l_current_precinct->cblks.ELEMENT = NULL;                                                                                                                 \
+                                                        l_current_precinct->block_size = 0;                                                                                                                       \
+                                                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for current precinct codeblock element\n");                                              */  \
+                                                        fprintf(stderr, "Not enough memory for current precinct codeblock element\n");                                                                            \
+                                                        return OPJ_FALSE;                                                                                                                                         \
+                                                }                                                                                                                                                                 \
+                                                l_current_precinct->cblks.ELEMENT = new_ELEMENT;                                                                                                                  \
+                                                /*fprintf(stderr, "\t\t\t\tReallocate cblks of a precinct (opj_tcd_cblk_dec_t): from %d to %d\n",l_current_precinct->block_size, l_nb_code_blocks_size);     */\
+                                                                                                                                                                                                                  \
+                                                memset(((OPJ_BYTE *) l_current_precinct->cblks.ELEMENT) + l_current_precinct->block_size                                                                          \
+                                                                ,0                                                                                                                                                \
+                                                                ,l_nb_code_blocks_size - l_current_precinct->block_size);                                                                                         \
+                                                                                                                                                                                                                  \
+                                                l_current_precinct->block_size = l_nb_code_blocks_size;                                                                                                           \
+                                        }                                                                                                                                                                         \
+                                                                                                                                                                                                                  \
+                                        if (! l_current_precinct->incltree) {                                                                                                                                     \
+                                                l_current_precinct->incltree = opj_tgt_create(l_current_precinct->cw,                                                                                              \
+                                                                l_current_precinct->ch);                                                                                                                          \
+                                        }                                                                                                                                                                         \
+                                        else{                                                                                                                                                                     \
+                                                l_current_precinct->incltree = opj_tgt_init(l_current_precinct->incltree,                                                                                             \
+                                                                l_current_precinct->cw,                                                                                                                           \
+                                                                l_current_precinct->ch);                                                                                                                          \
+                                        }                                                                                                                                                                         \
+                                                                                                                                                                                                                  \
+                                        if (! l_current_precinct->incltree)     {                                                                                                                                 \
+                                                fprintf(stderr, "WARNING: No incltree created.\n");                                                                                                               \
+                                                /*return OPJ_FALSE;*/                                                                                                                                             \
+                                        }                                                                                                                                                                         \
+                                                                                                                                                                                                                  \
+                                        if (! l_current_precinct->imsbtree) {                                                                                                                                     \
+                                                l_current_precinct->imsbtree = opj_tgt_create(                                                                                                                     \
+                                                                l_current_precinct->cw,                                                                                                                           \
+                                                                l_current_precinct->ch);                                                                                                                          \
+                                        }                                                                                                                                                                         \
+                                        else {                                                                                                                                                                    \
+                                                l_current_precinct->imsbtree = opj_tgt_init(                                                                                                                          \
+                                                                l_current_precinct->imsbtree,                                                                                                                     \
+                                                                l_current_precinct->cw,                                                                                                                           \
+                                                                l_current_precinct->ch);                                                                                                                          \
+                                        }                                                                                                                                                                         \
+                                                                                                                                                                                                                  \
+                                        if (! l_current_precinct->imsbtree) {                                                                                                                                     \
+                                                fprintf(stderr, "WARNING: No imsbtree created.\n");                                                                                                               \
+                                                /*return OPJ_FALSE;*/                                                                                                                                             \
+                                        }                                                                                                                                                                         \
+                                                                                                                                                                                                                  \
+                                        l_code_block = l_current_precinct->cblks.ELEMENT;                                                                                                                         \
+                                                                                                                                                                                                                  \
+                                        for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {                                                                                                                   \
+                                                OPJ_INT32 cblkxstart = tlcblkxstart + (OPJ_INT32)(cblkno % l_current_precinct->cw) * (1 << cblkwidthexpn);                                                                   \
+                                                OPJ_INT32 cblkystart = tlcblkystart + (OPJ_INT32)(cblkno / l_current_precinct->cw) * (1 << cblkheightexpn);                                                                  \
+                                                OPJ_INT32 cblkxend = cblkxstart + (1 << cblkwidthexpn);                                                                                                           \
+                                                OPJ_INT32 cblkyend = cblkystart + (1 << cblkheightexpn);                                                                                                          \
+                                                                                                                                                                                                                  \
+                                                /* code-block size (global) */                                                                                                                                    \
+                                                l_code_block->x0 = opj_int_max(cblkxstart, l_current_precinct->x0);                                                                                                   \
+                                                l_code_block->y0 = opj_int_max(cblkystart, l_current_precinct->y0);                                                                                                   \
+                                                l_code_block->x1 = opj_int_min(cblkxend, l_current_precinct->x1);                                                                                                     \
+                                                l_code_block->y1 = opj_int_min(cblkyend, l_current_precinct->y1);                                                                                                     \
+                                                                                                                                                                                                                  \
+                                                if (! FUNCTION_ELEMENT(l_code_block)) {                                                                                                                           \
+                                                        return OPJ_FALSE;                                                                                                                                         \
+                                                }                                                                                                                                                                 \
+                                                ++l_code_block;                                                                                                                                                   \
+                                        }                                                                                                                                                                         \
+                                        ++l_current_precinct;                                                                                                                                                     \
+                                } /* precno */                                                                                                                                                                    \
+                                ++l_band;                                                                                                                                                                         \
+                                ++l_step_size;                                                                                                                                                                    \
+                        } /* bandno */                                                                                                                                                                            \
+                        ++l_res;                                                                                                                                                                                  \
+                        --l_level_no;                                                                                                                                                                             \
+                } /* resno */                                                                                                                                                                                     \
+                ++l_tccp;                                                                                                                                                                                         \
+                ++l_tilec;                                                                                                                                                                                        \
+                ++l_image_comp;                                                                                                                                                                                   \
+        } /* compno */                                                                                                                                                                                            \
+        return OPJ_TRUE;                                                                                                                                                                                          \
+}                                                                                                                                                                                                                 \
+
+
+OPJ_MACRO_TCD_ALLOCATE(opj_tcd_init_encode_tile, opj_tcd_cblk_enc_t, 1.f, enc, opj_tcd_code_block_enc_allocate)
+OPJ_MACRO_TCD_ALLOCATE(opj_tcd_init_decode_tile, opj_tcd_cblk_dec_t, 0.5f, dec, opj_tcd_code_block_dec_allocate)
+
+#undef OPJ_MACRO_TCD_ALLOCATE
+
+/**
+ * Allocates memory for an encoding code block.
+ */
+OPJ_BOOL opj_tcd_code_block_enc_allocate (opj_tcd_cblk_enc_t * p_code_block)
+{
+        if (! p_code_block->data) {
+
+                p_code_block->data = (OPJ_BYTE*) opj_malloc(OPJ_J2K_DEFAULT_CBLK_DATA_SIZE*2); /*why +1 ?*/
+                if(! p_code_block->data) {
+                        return OPJ_FALSE;
+                }
+
+                p_code_block->data[0] = 0;
+                p_code_block->data+=1;
+
+                /* no memset since data */
+                p_code_block->layers = (opj_tcd_layer_t*) opj_malloc(100 * sizeof(opj_tcd_layer_t));
+                if (! p_code_block->layers) {
+                        return OPJ_FALSE;
+                }
+
+                p_code_block->passes = (opj_tcd_pass_t*) opj_malloc(100 * sizeof(opj_tcd_pass_t));
+                if (! p_code_block->passes) {
+                        return OPJ_FALSE;
+                }
+        }
+
+        memset(p_code_block->layers,0,100 * sizeof(opj_tcd_layer_t));
+        memset(p_code_block->passes,0,100 * sizeof(opj_tcd_pass_t));
+
+        return OPJ_TRUE;
+}
+
+/**
+ * Allocates memory for a decoding code block.
+ */
+OPJ_BOOL opj_tcd_code_block_dec_allocate (opj_tcd_cblk_dec_t * p_code_block)
+{
+        OPJ_UINT32 l_seg_size;
+
+        if (! p_code_block->data) {
+
+                p_code_block->data = (OPJ_BYTE*) opj_malloc(OPJ_J2K_DEFAULT_CBLK_DATA_SIZE);
+                if (! p_code_block->data) {
+                        return OPJ_FALSE;
+                }
+                p_code_block->data_max_size = OPJ_J2K_DEFAULT_CBLK_DATA_SIZE;
+                /*fprintf(stderr, "Allocate 8192 elements of code_block->data\n");*/
+
+                l_seg_size = OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t);
+                p_code_block->segs = (opj_tcd_seg_t *) opj_malloc(l_seg_size);
+                if (! p_code_block->segs) {
+                        return OPJ_FALSE;
+                }
+                memset(p_code_block->segs,0,l_seg_size);
+                /*fprintf(stderr, "Allocate %d elements of code_block->data\n", OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t));*/
+
+                p_code_block->m_current_max_segs = OPJ_J2K_DEFAULT_NB_SEGS;
+                /*fprintf(stderr, "m_current_max_segs of code_block->data = %d\n", p_code_block->m_current_max_segs);*/
+        }
+        /* TODO */
+        /*p_code_block->numsegs = 0; */
+
+        return OPJ_TRUE;
+}
+
+OPJ_UINT32 opj_tcd_get_decoded_tile_size ( opj_tcd_t *p_tcd )
+{
+        OPJ_UINT32 i;
+        OPJ_UINT32 l_data_size = 0;
+        opj_image_comp_t * l_img_comp = 00;
+        opj_tcd_tilecomp_t * l_tile_comp = 00;
+        opj_tcd_resolution_t * l_res = 00;
+        OPJ_UINT32 l_size_comp, l_remaining;
+
+        l_tile_comp = p_tcd->tcd_image->tiles->comps;
+        l_img_comp = p_tcd->image->comps;
+
+        for (i=0;i<p_tcd->image->numcomps;++i) {
+                l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
+                l_remaining = l_img_comp->prec & 7;  /* (%8) */
+
+                if(l_remaining) {
+                        ++l_size_comp;
+                }
+
+                if (l_size_comp == 3) {
+                        l_size_comp = 4;
+                }
+
+                l_res = l_tile_comp->resolutions + l_tile_comp->minimum_num_resolutions - 1;
+                l_data_size += l_size_comp * (OPJ_UINT32)((l_res->x1 - l_res->x0) * (l_res->y1 - l_res->y0));
+                ++l_img_comp;
+                ++l_tile_comp;
+        }
+
+        return l_data_size;
+}
+
+OPJ_BOOL opj_tcd_encode_tile(   opj_tcd_t *p_tcd,
+                                                        OPJ_UINT32 p_tile_no,
+                                                        OPJ_BYTE *p_dest,
+                                                        OPJ_UINT32 * p_data_written,
+                                                        OPJ_UINT32 p_max_length,
+                                                        opj_codestream_info_t *p_cstr_info)
+{
+
+        if (p_tcd->cur_tp_num == 0) {
+
+                p_tcd->tcd_tileno = p_tile_no;
+                p_tcd->tcp = &p_tcd->cp->tcps[p_tile_no];
+
+                /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
+                if(p_cstr_info)  {
+                        OPJ_UINT32 l_num_packs = 0;
+                        OPJ_UINT32 i;
+                        opj_tcd_tilecomp_t *l_tilec_idx = &p_tcd->tcd_image->tiles->comps[0];        /* based on component 0 */
+                        opj_tccp_t *l_tccp = p_tcd->tcp->tccps; /* based on component 0 */
+
+                        for (i = 0; i < l_tilec_idx->numresolutions; i++) {
+                                opj_tcd_resolution_t *l_res_idx = &l_tilec_idx->resolutions[i];
+
+                                p_cstr_info->tile[p_tile_no].pw[i] = (int)l_res_idx->pw;
+                                p_cstr_info->tile[p_tile_no].ph[i] = (int)l_res_idx->ph;
+
+                                l_num_packs += l_res_idx->pw * l_res_idx->ph;
+                                p_cstr_info->tile[p_tile_no].pdx[i] = (int)l_tccp->prcw[i];
+                                p_cstr_info->tile[p_tile_no].pdy[i] = (int)l_tccp->prch[i];
+                        }
+                        p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t*) opj_calloc((size_t)p_cstr_info->numcomps * (size_t)p_cstr_info->numlayers * l_num_packs, sizeof(opj_packet_info_t));
+                }
+                /* << INDEX */
+
+                /* FIXME _ProfStart(PGROUP_DC_SHIFT); */
+                /*---------------TILE-------------------*/
+                if (! opj_tcd_dc_level_shift_encode(p_tcd)) {
+                        return OPJ_FALSE;
+                }
+                /* FIXME _ProfStop(PGROUP_DC_SHIFT); */
+
+                /* FIXME _ProfStart(PGROUP_MCT); */
+                if (! opj_tcd_mct_encode(p_tcd)) {
+                        return OPJ_FALSE;
+                }
+                /* FIXME _ProfStop(PGROUP_MCT); */
+
+                /* FIXME _ProfStart(PGROUP_DWT); */
+                if (! opj_tcd_dwt_encode(p_tcd)) {
+                        return OPJ_FALSE;
+                }
+                /* FIXME  _ProfStop(PGROUP_DWT); */
+
+                /* FIXME  _ProfStart(PGROUP_T1); */
+                if (! opj_tcd_t1_encode(p_tcd)) {
+                        return OPJ_FALSE;
+                }
+                /* FIXME _ProfStop(PGROUP_T1); */
+
+                /* FIXME _ProfStart(PGROUP_RATE); */
+                if (! opj_tcd_rate_allocate_encode(p_tcd,p_dest,p_max_length,p_cstr_info)) {
+                        return OPJ_FALSE;
+                }
+                /* FIXME _ProfStop(PGROUP_RATE); */
+
+        }
+        /*--------------TIER2------------------*/
+
+        /* INDEX */
+        if (p_cstr_info) {
+                p_cstr_info->index_write = 1;
+        }
+        /* FIXME _ProfStart(PGROUP_T2); */
+
+        if (! opj_tcd_t2_encode(p_tcd,p_dest,p_data_written,p_max_length,p_cstr_info)) {
+                return OPJ_FALSE;
+        }
+        /* FIXME _ProfStop(PGROUP_T2); */
+
+        /*---------------CLEAN-------------------*/
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_decode_tile(   opj_tcd_t *p_tcd,
+                                OPJ_BYTE *p_src,
+                                OPJ_UINT32 p_max_length,
+                                OPJ_UINT32 p_tile_no,
+                                opj_codestream_index_t *p_cstr_index
+                                )
+{
+        OPJ_UINT32 l_data_read;
+        p_tcd->tcd_tileno = p_tile_no;
+        p_tcd->tcp = &(p_tcd->cp->tcps[p_tile_no]);
+
+#ifdef TODO_MSD /* FIXME */
+        /* INDEX >>  */
+        if(p_cstr_info) {
+                OPJ_UINT32 resno, compno, numprec = 0;
+                for (compno = 0; compno < (OPJ_UINT32) p_cstr_info->numcomps; compno++) {
+                        opj_tcp_t *tcp = &p_tcd->cp->tcps[0];
+                        opj_tccp_t *tccp = &tcp->tccps[compno];
+                        opj_tcd_tilecomp_t *tilec_idx = &p_tcd->tcd_image->tiles->comps[compno];
+                        for (resno = 0; resno < tilec_idx->numresolutions; resno++) {
+                                opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno];
+                                p_cstr_info->tile[p_tile_no].pw[resno] = res_idx->pw;
+                                p_cstr_info->tile[p_tile_no].ph[resno] = res_idx->ph;
+                                numprec += res_idx->pw * res_idx->ph;
+                                p_cstr_info->tile[p_tile_no].pdx[resno] = tccp->prcw[resno];
+                                p_cstr_info->tile[p_tile_no].pdy[resno] = tccp->prch[resno];
+                        }
+                }
+                p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t *) opj_malloc(p_cstr_info->numlayers * numprec * sizeof(opj_packet_info_t));
+                p_cstr_info->packno = 0;
+        }
+        /* << INDEX */
+#endif
+
+        /*--------------TIER2------------------*/
+        /* FIXME _ProfStart(PGROUP_T2); */
+        l_data_read = 0;
+        if (! opj_tcd_t2_decode(p_tcd, p_src, &l_data_read, p_max_length, p_cstr_index))
+        {
+                return OPJ_FALSE;
+        }
+        /* FIXME _ProfStop(PGROUP_T2); */
+
+        /*------------------TIER1-----------------*/
+
+        /* FIXME _ProfStart(PGROUP_T1); */
+        if
+                (! opj_tcd_t1_decode(p_tcd))
+        {
+                return OPJ_FALSE;
+        }
+        /* FIXME _ProfStop(PGROUP_T1); */
+
+        /*----------------DWT---------------------*/
+
+        /* FIXME _ProfStart(PGROUP_DWT); */
+        if
+                (! opj_tcd_dwt_decode(p_tcd))
+        {
+                return OPJ_FALSE;
+        }
+        /* FIXME _ProfStop(PGROUP_DWT); */
+
+        /*----------------MCT-------------------*/
+        /* FIXME _ProfStart(PGROUP_MCT); */
+        if
+                (! opj_tcd_mct_decode(p_tcd))
+        {
+                return OPJ_FALSE;
+        }
+        /* FIXME _ProfStop(PGROUP_MCT); */
+
+        /* FIXME _ProfStart(PGROUP_DC_SHIFT); */
+        if
+                (! opj_tcd_dc_level_shift_decode(p_tcd))
+        {
+                return OPJ_FALSE;
+        }
+        /* FIXME _ProfStop(PGROUP_DC_SHIFT); */
+
+
+        /*---------------TILE-------------------*/
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_update_tile_data ( opj_tcd_t *p_tcd,
+                                    OPJ_BYTE * p_dest,
+                                    OPJ_UINT32 p_dest_length
+                                    )
+{
+        OPJ_UINT32 i,j,k,l_data_size = 0;
+        opj_image_comp_t * l_img_comp = 00;
+        opj_tcd_tilecomp_t * l_tilec = 00;
+        opj_tcd_resolution_t * l_res;
+        OPJ_UINT32 l_size_comp, l_remaining;
+        OPJ_UINT32 l_stride, l_width,l_height;
+
+        l_data_size = opj_tcd_get_decoded_tile_size(p_tcd);
+        if (l_data_size > p_dest_length) {
+                return OPJ_FALSE;
+        }
+
+        l_tilec = p_tcd->tcd_image->tiles->comps;
+        l_img_comp = p_tcd->image->comps;
+
+        for (i=0;i<p_tcd->image->numcomps;++i) {
+                l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
+                l_remaining = l_img_comp->prec & 7;  /* (%8) */
+                l_res = l_tilec->resolutions + l_img_comp->resno_decoded;
+                l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0);
+                l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0);
+                l_stride = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0) - l_width;
+
+                if (l_remaining) {
+                        ++l_size_comp;
+                }
+
+                if (l_size_comp == 3) {
+                        l_size_comp = 4;
+                }
+
+                switch (l_size_comp)
+                        {
+                        case 1:
+                                {
+                                        OPJ_CHAR * l_dest_ptr = (OPJ_CHAR *) p_dest;
+                                        const OPJ_INT32 * l_src_ptr = l_tilec->data;
+
+                                        if (l_img_comp->sgnd) {
+                                                for (j=0;j<l_height;++j) {
+                                                        for (k=0;k<l_width;++k) {
+                                                                *(l_dest_ptr++) = (OPJ_CHAR) (*(l_src_ptr++));
+                                                        }
+                                                        l_src_ptr += l_stride;
+                                                }
+                                        }
+                                        else {
+                                                for (j=0;j<l_height;++j) {
+                                                        for     (k=0;k<l_width;++k) {
+                                                                *(l_dest_ptr++) = (OPJ_CHAR) ((*(l_src_ptr++))&0xff);
+                                                        }
+                                                        l_src_ptr += l_stride;
+                                                }
+                                        }
+
+                                        p_dest = (OPJ_BYTE *)l_dest_ptr;
+                                }
+                                break;
+                        case 2:
+                                {
+                                        const OPJ_INT32 * l_src_ptr = l_tilec->data;
+                                        OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_dest;
+
+                                        if (l_img_comp->sgnd) {
+                                                for (j=0;j<l_height;++j) {
+                                                        for (k=0;k<l_width;++k) {
+                                                                *(l_dest_ptr++) = (OPJ_INT16) (*(l_src_ptr++));
+                                                        }
+                                                        l_src_ptr += l_stride;
+                                                }
+                                        }
+                                        else {
+                                                for (j=0;j<l_height;++j) {
+                                                        for (k=0;k<l_width;++k) {
+                                                                *(l_dest_ptr++) = (OPJ_INT16) ((*(l_src_ptr++))&0xffff);
+                                                        }
+                                                        l_src_ptr += l_stride;
+                                                }
+                                        }
+
+                                        p_dest = (OPJ_BYTE*) l_dest_ptr;
+                                }
+                                break;
+                        case 4:
+                                {
+                                        OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_dest;
+                                        OPJ_INT32 * l_src_ptr = l_tilec->data;
+
+                                        for (j=0;j<l_height;++j) {
+                                                for (k=0;k<l_width;++k) {
+                                                        *(l_dest_ptr++) = (*(l_src_ptr++));
+                                                }
+                                                l_src_ptr += l_stride;
+                                        }
+
+                                        p_dest = (OPJ_BYTE*) l_dest_ptr;
+                                }
+                                break;
+                }
+
+                ++l_img_comp;
+                ++l_tilec;
+        }
+
+        return OPJ_TRUE;
+}
+
+
+
+
+void opj_tcd_free_tile(opj_tcd_t *p_tcd)
+{
+        OPJ_UINT32 compno, resno, bandno, precno;
+        opj_tcd_tile_t *l_tile = 00;
+        opj_tcd_tilecomp_t *l_tile_comp = 00;
+        opj_tcd_resolution_t *l_res = 00;
+        opj_tcd_band_t *l_band = 00;
+        opj_tcd_precinct_t *l_precinct = 00;
+        OPJ_UINT32 l_nb_resolutions, l_nb_precincts;
+        void (* l_tcd_code_block_deallocate) (opj_tcd_precinct_t *) = 00;
+
+        if (! p_tcd) {
+                return;
+        }
+
+        if (! p_tcd->tcd_image) {
+                return;
+        }
+
+        if (p_tcd->m_is_decoder) {
+                l_tcd_code_block_deallocate = opj_tcd_code_block_dec_deallocate;
+        }
+        else {
+                l_tcd_code_block_deallocate = opj_tcd_code_block_enc_deallocate;
+        }
+
+        l_tile = p_tcd->tcd_image->tiles;
+        if (! l_tile) {
+                return;
+        }
+
+        l_tile_comp = l_tile->comps;
+
+        for (compno = 0; compno < l_tile->numcomps; ++compno) {
+                l_res = l_tile_comp->resolutions;
+                if (l_res) {
+
+                        l_nb_resolutions = l_tile_comp->resolutions_size / sizeof(opj_tcd_resolution_t);
+                        for (resno = 0; resno < l_nb_resolutions; ++resno) {
+                                l_band = l_res->bands;
+                                for     (bandno = 0; bandno < 3; ++bandno) {
+                                        l_precinct = l_band->precincts;
+                                        if (l_precinct) {
+
+                                                l_nb_precincts = l_band->precincts_data_size / sizeof(opj_tcd_precinct_t);
+                                                for (precno = 0; precno < l_nb_precincts; ++precno) {
+                                                        opj_tgt_destroy(l_precinct->incltree);
+                                                        l_precinct->incltree = 00;
+                                                        opj_tgt_destroy(l_precinct->imsbtree);
+                                                        l_precinct->imsbtree = 00;
+                                                        (*l_tcd_code_block_deallocate) (l_precinct);
+                                                        ++l_precinct;
+                                                }
+
+                                                opj_free(l_band->precincts);
+                                                l_band->precincts = 00;
+                                        }
+                                        ++l_band;
+                                } /* for (resno */
+                                ++l_res;
+                        }
+
+                        opj_free(l_tile_comp->resolutions);
+                        l_tile_comp->resolutions = 00;
+                }
+
+                if (l_tile_comp->data) {
+                        opj_free(l_tile_comp->data);
+                        l_tile_comp->data = 00;
+                }
+                ++l_tile_comp;
+        }
+
+        opj_free(l_tile->comps);
+        l_tile->comps = 00;
+        opj_free(p_tcd->tcd_image->tiles);
+        p_tcd->tcd_image->tiles = 00;
+}
+
+
+OPJ_BOOL opj_tcd_t2_decode (opj_tcd_t *p_tcd,
+                            OPJ_BYTE * p_src_data,
+                            OPJ_UINT32 * p_data_read,
+                            OPJ_UINT32 p_max_src_size,
+                            opj_codestream_index_t *p_cstr_index
+                            )
+{
+        opj_t2_t * l_t2;
+
+        l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp);
+        if (l_t2 == 00) {
+                return OPJ_FALSE;
+        }
+
+        if (! opj_t2_decode_packets(
+                                        l_t2,
+                                        p_tcd->tcd_tileno,
+                                        p_tcd->tcd_image->tiles,
+                                        p_src_data,
+                                        p_data_read,
+                                        p_max_src_size,
+                                        p_cstr_index)) {
+                opj_t2_destroy(l_t2);
+                return OPJ_FALSE;
+        }
+
+        opj_t2_destroy(l_t2);
+
+        /*---------------CLEAN-------------------*/
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_t1_decode ( opj_tcd_t *p_tcd )
+{
+        OPJ_UINT32 compno;
+        opj_t1_t * l_t1;
+        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+        opj_tcd_tilecomp_t* l_tile_comp = l_tile->comps;
+        opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
+
+
+        l_t1 = opj_t1_create();
+        if (l_t1 == 00) {
+                return OPJ_FALSE;
+        }
+
+        for (compno = 0; compno < l_tile->numcomps; ++compno) {
+                /* The +3 is headroom required by the vectorized DWT */
+                if (OPJ_FALSE == opj_t1_decode_cblks(l_t1, l_tile_comp, l_tccp)) {
+                        opj_t1_destroy(l_t1);
+                        return OPJ_FALSE;
+                }
+                ++l_tile_comp;
+                ++l_tccp;
+        }
+
+        opj_t1_destroy(l_t1);
+
+        return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_tcd_dwt_decode ( opj_tcd_t *p_tcd )
+{
+        OPJ_UINT32 compno;
+        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+        opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps;
+        opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
+        opj_image_comp_t * l_img_comp = p_tcd->image->comps;
+
+        for (compno = 0; compno < l_tile->numcomps; compno++) {
+                /*
+                if (tcd->cp->reduce != 0) {
+                        tcd->image->comps[compno].resno_decoded =
+                                tile->comps[compno].numresolutions - tcd->cp->reduce - 1;
+                        if (tcd->image->comps[compno].resno_decoded < 0)
+                        {
+                                return false;
+                        }
+                }
+                numres2decode = tcd->image->comps[compno].resno_decoded + 1;
+                if(numres2decode > 0){
+                */
+
+                if (l_tccp->qmfbid == 1) {
+                        if (! opj_dwt_decode(l_tile_comp, l_img_comp->resno_decoded+1)) {
+                                return OPJ_FALSE;
+                        }
+                }
+                else {
+                        if (! opj_dwt_decode_real(l_tile_comp, l_img_comp->resno_decoded+1)) {
+                                return OPJ_FALSE;
+                        }
+                }
+
+                ++l_tile_comp;
+                ++l_img_comp;
+                ++l_tccp;
+        }
+
+        return OPJ_TRUE;
+}
+OPJ_BOOL opj_tcd_mct_decode ( opj_tcd_t *p_tcd )
+{
+        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+        opj_tcp_t * l_tcp = p_tcd->tcp;
+        opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps;
+        OPJ_UINT32 l_samples,i;
+
+        if (! l_tcp->mct) {
+                return OPJ_TRUE;
+        }
+
+        l_samples = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) * (l_tile_comp->y1 - l_tile_comp->y0));
+
+        if (l_tile->numcomps >= 3 ){
+                /* testcase 1336.pdf.asan.47.376 */
+                if ((l_tile->comps[0].x1 - l_tile->comps[0].x0) * (l_tile->comps[0].y1 - l_tile->comps[0].y0) < (OPJ_INT32)l_samples ||
+                    (l_tile->comps[1].x1 - l_tile->comps[1].x0) * (l_tile->comps[1].y1 - l_tile->comps[1].y0) < (OPJ_INT32)l_samples ||
+                    (l_tile->comps[2].x1 - l_tile->comps[2].x0) * (l_tile->comps[2].y1 - l_tile->comps[2].y0) < (OPJ_INT32)l_samples) {
+                        fprintf(stderr, "Tiles don't all have the same dimension. Skip the MCT step.\n");
+                        return OPJ_FALSE;
+                }
+                else if (l_tcp->mct == 2) {
+                        OPJ_BYTE ** l_data;
+
+                        if (! l_tcp->m_mct_decoding_matrix) {
+                                return OPJ_TRUE;
+                        }
+
+                        l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps*sizeof(OPJ_BYTE*));
+                        if (! l_data) {
+                                return OPJ_FALSE;
+                        }
+
+                        for (i=0;i<l_tile->numcomps;++i) {
+                                l_data[i] = (OPJ_BYTE*) l_tile_comp->data;
+                                ++l_tile_comp;
+                        }
+
+                        if (! opj_mct_decode_custom(/* MCT data */
+                                                                        (OPJ_BYTE*) l_tcp->m_mct_decoding_matrix,
+                                                                        /* size of components */
+                                                                        l_samples,
+                                                                        /* components */
+                                                                        l_data,
+                                                                        /* nb of components (i.e. size of pData) */
+                                                                        l_tile->numcomps,
+                                                                        /* tells if the data is signed */
+                                                                        p_tcd->image->comps->sgnd)) {
+                                opj_free(l_data);
+                                return OPJ_FALSE;
+                        }
+
+                        opj_free(l_data);
+                }
+                else {
+                        if (l_tcp->tccps->qmfbid == 1) {
+                                opj_mct_decode(     l_tile->comps[0].data,
+                                                        l_tile->comps[1].data,
+                                                        l_tile->comps[2].data,
+                                                        l_samples);
+                        }
+                        else {
+                            opj_mct_decode_real((OPJ_FLOAT32*)l_tile->comps[0].data,
+                                                (OPJ_FLOAT32*)l_tile->comps[1].data,
+                                                (OPJ_FLOAT32*)l_tile->comps[2].data,
+                                                l_samples);
+                        }
+                }
+        }
+        else {
+                /* FIXME need to use opj_event_msg function */
+                fprintf(stderr,"Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\n",l_tile->numcomps);
+        }
+
+        return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_tcd_dc_level_shift_decode ( opj_tcd_t *p_tcd )
+{
+        OPJ_UINT32 compno;
+        opj_tcd_tilecomp_t * l_tile_comp = 00;
+        opj_tccp_t * l_tccp = 00;
+        opj_image_comp_t * l_img_comp = 00;
+        opj_tcd_resolution_t* l_res = 00;
+        opj_tcd_tile_t * l_tile;
+        OPJ_UINT32 l_width,l_height,i,j;
+        OPJ_INT32 * l_current_ptr;
+        OPJ_INT32 l_min, l_max;
+        OPJ_UINT32 l_stride;
+
+        l_tile = p_tcd->tcd_image->tiles;
+        l_tile_comp = l_tile->comps;
+        l_tccp = p_tcd->tcp->tccps;
+        l_img_comp = p_tcd->image->comps;
+
+        for (compno = 0; compno < l_tile->numcomps; compno++) {
+                l_res = l_tile_comp->resolutions + l_img_comp->resno_decoded;
+                l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0);
+                l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0);
+                l_stride = (OPJ_UINT32)(l_tile_comp->x1 - l_tile_comp->x0) - l_width;
+
+                assert(l_height == 0 || l_width + l_stride <= l_tile_comp->data_size / l_height); /*MUPDF*/
+
+                if (l_img_comp->sgnd) {
+                        l_min = -(1 << (l_img_comp->prec - 1));
+                        l_max = (1 << (l_img_comp->prec - 1)) - 1;
+                }
+                else {
+            l_min = 0;
+                        l_max = (1 << l_img_comp->prec) - 1;
+                }
+
+                l_current_ptr = l_tile_comp->data;
+
+                if (l_tccp->qmfbid == 1) {
+                        for (j=0;j<l_height;++j) {
+                                for (i = 0; i < l_width; ++i) {
+                                        *l_current_ptr = opj_int_clamp(*l_current_ptr + l_tccp->m_dc_level_shift, l_min, l_max);
+                                        ++l_current_ptr;
+                                }
+                                l_current_ptr += l_stride;
+                        }
+                }
+                else {
+                        for (j=0;j<l_height;++j) {
+                                for (i = 0; i < l_width; ++i) {
+                                        OPJ_FLOAT32 l_value = *((OPJ_FLOAT32 *) l_current_ptr);
+                                        *l_current_ptr = opj_int_clamp((OPJ_INT32)lrintf(l_value) + l_tccp->m_dc_level_shift, l_min, l_max); ;
+                                        ++l_current_ptr;
+                                }
+                                l_current_ptr += l_stride;
+                        }
+                }
+
+                ++l_img_comp;
+                ++l_tccp;
+                ++l_tile_comp;
+        }
+
+        return OPJ_TRUE;
+}
+
+
+
+/**
+ * Deallocates the encoding data of the given precinct.
+ */
+void opj_tcd_code_block_dec_deallocate (opj_tcd_precinct_t * p_precinct)
+{
+        OPJ_UINT32 cblkno , l_nb_code_blocks;
+
+        opj_tcd_cblk_dec_t * l_code_block = p_precinct->cblks.dec;
+        if (l_code_block) {
+                /*fprintf(stderr,"deallocate codeblock:{\n");*/
+                /*fprintf(stderr,"\t x0=%d, y0=%d, x1=%d, y1=%d\n",l_code_block->x0, l_code_block->y0, l_code_block->x1, l_code_block->y1);*/
+                /*fprintf(stderr,"\t numbps=%d, numlenbits=%d, len=%d, numnewpasses=%d, real_num_segs=%d, m_current_max_segs=%d\n ",
+                                l_code_block->numbps, l_code_block->numlenbits, l_code_block->len, l_code_block->numnewpasses, l_code_block->real_num_segs, l_code_block->m_current_max_segs );*/
+
+
+                l_nb_code_blocks = p_precinct->block_size / sizeof(opj_tcd_cblk_dec_t);
+                /*fprintf(stderr,"nb_code_blocks =%d\t}\n", l_nb_code_blocks);*/
+
+                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+
+                        if (l_code_block->data) {
+                                opj_free(l_code_block->data);
+                                l_code_block->data = 00;
+                        }
+
+                        if (l_code_block->segs) {
+                                opj_free(l_code_block->segs );
+                                l_code_block->segs = 00;
+                        }
+
+                        ++l_code_block;
+                }
+
+                opj_free(p_precinct->cblks.dec);
+                p_precinct->cblks.dec = 00;
+        }
+}
+
+/**
+ * Deallocates the encoding data of the given precinct.
+ */
+void opj_tcd_code_block_enc_deallocate (opj_tcd_precinct_t * p_precinct)
+{       
+        OPJ_UINT32 cblkno , l_nb_code_blocks;
+
+        opj_tcd_cblk_enc_t * l_code_block = p_precinct->cblks.enc;
+        if (l_code_block) {
+                l_nb_code_blocks = p_precinct->block_size / sizeof(opj_tcd_cblk_enc_t);
+                
+                for     (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno)  {
+                        if (l_code_block->data) {
+                                opj_free(l_code_block->data - 1);
+                                l_code_block->data = 00;
+                        }
+
+                        if (l_code_block->layers) {
+                                opj_free(l_code_block->layers );
+                                l_code_block->layers = 00;
+                        }
+
+                        if (l_code_block->passes) {
+                                opj_free(l_code_block->passes );
+                                l_code_block->passes = 00;
+                        }
+                        ++l_code_block;
+                }
+
+                opj_free(p_precinct->cblks.enc);
+                
+                p_precinct->cblks.enc = 00;
+        }
+}
+
+OPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd )
+{
+        OPJ_UINT32 i,l_data_size = 0;
+        opj_image_comp_t * l_img_comp = 00;
+        opj_tcd_tilecomp_t * l_tilec = 00;
+        OPJ_UINT32 l_size_comp, l_remaining;
+
+        l_tilec = p_tcd->tcd_image->tiles->comps;
+        l_img_comp = p_tcd->image->comps;
+        for (i=0;i<p_tcd->image->numcomps;++i) {
+                l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
+                l_remaining = l_img_comp->prec & 7;  /* (%8) */
+
+                if (l_remaining) {
+                        ++l_size_comp;
+                }
+
+                if (l_size_comp == 3) {
+                        l_size_comp = 4;
+                }
+
+                l_data_size += l_size_comp * (OPJ_UINT32)((l_tilec->x1 - l_tilec->x0) * (l_tilec->y1 - l_tilec->y0));
+                ++l_img_comp;
+                ++l_tilec;
+        }
+
+        return l_data_size;
+}
+                
+OPJ_BOOL opj_tcd_dc_level_shift_encode ( opj_tcd_t *p_tcd )
+{
+        OPJ_UINT32 compno;
+        opj_tcd_tilecomp_t * l_tile_comp = 00;
+        opj_tccp_t * l_tccp = 00;
+        opj_image_comp_t * l_img_comp = 00;
+        opj_tcd_tile_t * l_tile;
+        OPJ_UINT32 l_nb_elem,i;
+        OPJ_INT32 * l_current_ptr;
+
+        l_tile = p_tcd->tcd_image->tiles;
+        l_tile_comp = l_tile->comps;
+        l_tccp = p_tcd->tcp->tccps;
+        l_img_comp = p_tcd->image->comps;
+
+        for (compno = 0; compno < l_tile->numcomps; compno++) {
+                l_current_ptr = l_tile_comp->data;
+                l_nb_elem = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) * (l_tile_comp->y1 - l_tile_comp->y0));
+
+                if (l_tccp->qmfbid == 1) {
+                        for     (i = 0; i < l_nb_elem; ++i) {
+                                *l_current_ptr -= l_tccp->m_dc_level_shift ;
+                                ++l_current_ptr;
+                        }
+                }
+                else {
+                        for (i = 0; i < l_nb_elem; ++i) {
+                                *l_current_ptr = (*l_current_ptr - l_tccp->m_dc_level_shift) << 11 ;
+                                ++l_current_ptr;
+                        }
+                }
+
+                ++l_img_comp;
+                ++l_tccp;
+                ++l_tile_comp;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_mct_encode ( opj_tcd_t *p_tcd )
+{
+        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+        opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps;
+        OPJ_UINT32 samples = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) * (l_tile_comp->y1 - l_tile_comp->y0));
+        OPJ_UINT32 i;
+        OPJ_BYTE ** l_data = 00;
+        opj_tcp_t * l_tcp = p_tcd->tcp;
+
+        if(!p_tcd->tcp->mct) {
+                return OPJ_TRUE;
+        }
+
+        if (p_tcd->tcp->mct == 2) {
+                if (! p_tcd->tcp->m_mct_coding_matrix) {
+                        return OPJ_TRUE;
+                }
+
+        l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps*sizeof(OPJ_BYTE*));
+                if (! l_data) {
+                        return OPJ_FALSE;
+                }
+
+                for (i=0;i<l_tile->numcomps;++i) {
+                        l_data[i] = (OPJ_BYTE*) l_tile_comp->data;
+                        ++l_tile_comp;
+                }
+
+                if (! opj_mct_encode_custom(/* MCT data */
+                                        (OPJ_BYTE*) p_tcd->tcp->m_mct_coding_matrix,
+                                        /* size of components */
+                                        samples,
+                                        /* components */
+                                        l_data,
+                                        /* nb of components (i.e. size of pData) */
+                                        l_tile->numcomps,
+                                        /* tells if the data is signed */
+                                        p_tcd->image->comps->sgnd) )
+                {
+            opj_free(l_data);
+                        return OPJ_FALSE;
+                }
+
+                opj_free(l_data);
+        }
+        else if (l_tcp->tccps->qmfbid == 0) {
+                opj_mct_encode_real(l_tile->comps[0].data, l_tile->comps[1].data, l_tile->comps[2].data, samples);
+        }
+        else {
+                opj_mct_encode(l_tile->comps[0].data, l_tile->comps[1].data, l_tile->comps[2].data, samples);
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_dwt_encode ( opj_tcd_t *p_tcd )
+{
+        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+        opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps;
+        opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
+        OPJ_UINT32 compno;
+
+        for (compno = 0; compno < l_tile->numcomps; ++compno) {
+                if (l_tccp->qmfbid == 1) {
+                        if (! opj_dwt_encode(l_tile_comp)) {
+                                return OPJ_FALSE;
+                        }
+                }
+                else if (l_tccp->qmfbid == 0) {
+                        if (! opj_dwt_encode_real(l_tile_comp)) {
+                                return OPJ_FALSE;
+                        }
+                }
+
+                ++l_tile_comp;
+                ++l_tccp;
+        }
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_t1_encode ( opj_tcd_t *p_tcd )
+{
+        opj_t1_t * l_t1;
+        const OPJ_FLOAT64 * l_mct_norms;
+        opj_tcp_t * l_tcp = p_tcd->tcp;
+
+        l_t1 = opj_t1_create();
+        if (l_t1 == 00) {
+                return OPJ_FALSE;
+        }
+
+        if (l_tcp->mct == 1) {
+                /* irreversible encoding */
+                if (l_tcp->tccps->qmfbid == 0) {
+                        l_mct_norms = opj_mct_get_mct_norms_real();
+                }
+                else {
+                        l_mct_norms = opj_mct_get_mct_norms();
+                }
+        }
+        else {
+                l_mct_norms = (const OPJ_FLOAT64 *) (l_tcp->mct_norms);
+        }
+
+        if (! opj_t1_encode_cblks(l_t1, p_tcd->tcd_image->tiles , l_tcp, l_mct_norms)) {
+        opj_t1_destroy(l_t1);
+                return OPJ_FALSE;
+        }
+
+        opj_t1_destroy(l_t1);
+
+        return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_t2_encode (opj_tcd_t *p_tcd,
+                                                OPJ_BYTE * p_dest_data,
+                                                OPJ_UINT32 * p_data_written,
+                                                OPJ_UINT32 p_max_dest_size,
+                                                opj_codestream_info_t *p_cstr_info )
+{
+        opj_t2_t * l_t2;
+
+        l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp);
+        if (l_t2 == 00) {
+                return OPJ_FALSE;
+        }
+
+        if (! opj_t2_encode_packets(
+                                        l_t2,
+                                        p_tcd->tcd_tileno,
+                                        p_tcd->tcd_image->tiles,
+                                        p_tcd->tcp->numlayers,
+                                        p_dest_data,
+                                        p_data_written,
+                                        p_max_dest_size,
+                                        p_cstr_info,
+                                        p_tcd->tp_num,
+                                        p_tcd->tp_pos,
+                                        p_tcd->cur_pino,
+                                        FINAL_PASS))
+        {
+                opj_t2_destroy(l_t2);
+                return OPJ_FALSE;
+        }
+
+        opj_t2_destroy(l_t2);
+
+        /*---------------CLEAN-------------------*/
+        return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_tcd_rate_allocate_encode(  opj_tcd_t *p_tcd,
+                                                                            OPJ_BYTE * p_dest_data,
+                                                                            OPJ_UINT32 p_max_dest_size,
+                                                                            opj_codestream_info_t *p_cstr_info )
+{
+        opj_cp_t * l_cp = p_tcd->cp;
+        OPJ_UINT32 l_nb_written = 0;
+
+        if (p_cstr_info)  {
+                p_cstr_info->index_write = 0;
+        }
+
+        if (l_cp->m_specific_param.m_enc.m_disto_alloc|| l_cp->m_specific_param.m_enc.m_fixed_quality)  {
+                /* fixed_quality */
+                /* Normal Rate/distortion allocation */
+                if (! opj_tcd_rateallocate(p_tcd, p_dest_data,&l_nb_written, p_max_dest_size, p_cstr_info)) {
+                        return OPJ_FALSE;
+                }
+        }
+        else {
+                /* Fixed layer allocation */
+                opj_tcd_rateallocate_fixed(p_tcd);
+        }
+
+        return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_tcd_copy_tile_data (       opj_tcd_t *p_tcd,
+                                                                    OPJ_BYTE * p_src,
+                                                                    OPJ_UINT32 p_src_length )
+{
+        OPJ_UINT32 i,j,l_data_size = 0;
+        opj_image_comp_t * l_img_comp = 00;
+        opj_tcd_tilecomp_t * l_tilec = 00;
+        OPJ_UINT32 l_size_comp, l_remaining;
+        OPJ_UINT32 l_nb_elem;
+
+        l_data_size = opj_tcd_get_encoded_tile_size(p_tcd);
+        if (l_data_size != p_src_length) {
+                return OPJ_FALSE;
+        }
+
+        l_tilec = p_tcd->tcd_image->tiles->comps;
+        l_img_comp = p_tcd->image->comps;
+        for (i=0;i<p_tcd->image->numcomps;++i) {
+                l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
+                l_remaining = l_img_comp->prec & 7;  /* (%8) */
+                l_nb_elem = (OPJ_UINT32)((l_tilec->x1 - l_tilec->x0) * (l_tilec->y1 - l_tilec->y0));
+
+                if (l_remaining) {
+                        ++l_size_comp;
+                }
+
+                if (l_size_comp == 3) {
+                        l_size_comp = 4;
+                }
+
+                switch (l_size_comp) {
+                        case 1:
+                                {
+                                        OPJ_CHAR * l_src_ptr = (OPJ_CHAR *) p_src;
+                                        OPJ_INT32 * l_dest_ptr = l_tilec->data;
+
+                                        if (l_img_comp->sgnd) {
+                                                for (j=0;j<l_nb_elem;++j) {
+                                                        *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));
+                                                }
+                                        }
+                                        else {
+                                                for (j=0;j<l_nb_elem;++j) {
+                                                        *(l_dest_ptr++) = (*(l_src_ptr++))&0xff;
+                                                }
+                                        }
+
+                                        p_src = (OPJ_BYTE*) l_src_ptr;
+                                }
+                                break;
+                        case 2:
+                                {
+                                        OPJ_INT32 * l_dest_ptr = l_tilec->data;
+                                        OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_src;
+
+                                        if (l_img_comp->sgnd) {
+                                                for (j=0;j<l_nb_elem;++j) {
+                                                        *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));
+                                                }
+                                        }
+                                        else {
+                                                for (j=0;j<l_nb_elem;++j) {
+                                                        *(l_dest_ptr++) = (*(l_src_ptr++))&0xffff;
+                                                }
+                                        }
+
+                                        p_src = (OPJ_BYTE*) l_src_ptr;
+                                }
+                                break;
+                        case 4:
+                                {
+                                        OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_src;
+                                        OPJ_INT32 * l_dest_ptr = l_tilec->data;
+
+                                        for (j=0;j<l_nb_elem;++j) {
+                                                *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));
+                                        }
+
+                                        p_src = (OPJ_BYTE*) l_src_ptr;
+                                }
+                                break;
+                }
+
+                ++l_img_comp;
+                ++l_tilec;
+        }
+
+        return OPJ_TRUE;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.h
new file mode 100644
index 0000000..360923b
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.h
@@ -0,0 +1,354 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __TCD_H
+#define __TCD_H
+/**
+@file tcd.h
+@brief Implementation of a tile coder/decoder (TCD)
+
+The functions in TCD.C encode or decode each tile independently from
+each other. The functions in TCD.C are used by other functions in J2K.C.
+*/
+
+/** @defgroup TCD TCD - Implementation of a tile coder/decoder */
+/*@{*/
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_seg {
+	OPJ_BYTE ** data;
+	OPJ_UINT32 dataindex;
+	OPJ_UINT32 numpasses;
+	OPJ_UINT32 real_num_passes;
+	OPJ_UINT32 len;
+	OPJ_UINT32 maxpasses;
+	OPJ_UINT32 numnewpasses;
+	OPJ_UINT32 newlen;
+} opj_tcd_seg_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_pass {
+	OPJ_UINT32 rate;
+	OPJ_FLOAT64 distortiondec;
+	OPJ_UINT32 len;
+	OPJ_UINT32 term : 1;
+} opj_tcd_pass_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_layer {
+	OPJ_UINT32 numpasses;		/* Number of passes in the layer */
+	OPJ_UINT32 len;				/* len of information */
+	OPJ_FLOAT64 disto;			/* add for index (Cfr. Marcela) */
+	OPJ_BYTE *data;				/* data */
+} opj_tcd_layer_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_cblk_enc {
+	OPJ_BYTE* data;					/* Data */
+	opj_tcd_layer_t* layers;		/* layer information */
+	opj_tcd_pass_t* passes;		/* information about the passes */
+	OPJ_INT32 x0, y0, x1, y1;		/* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
+	OPJ_UINT32 numbps;
+	OPJ_UINT32 numlenbits;
+	OPJ_UINT32 numpasses;			/* number of pass already done for the code-blocks */
+	OPJ_UINT32 numpassesinlayers;	/* number of passes in the layer */
+	OPJ_UINT32 totalpasses;			/* total number of passes */
+} opj_tcd_cblk_enc_t;
+
+
+typedef struct opj_tcd_cblk_dec {
+	OPJ_BYTE * data;				/* Data */
+	opj_tcd_seg_t* segs;			/* segments information */
+	OPJ_INT32 x0, y0, x1, y1;		/* position of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
+	OPJ_UINT32 numbps;
+	OPJ_UINT32 numlenbits;
+    OPJ_UINT32 data_max_size;		/* Size of allocated data buffer */
+	OPJ_UINT32 data_current_size;	/* Size of used data buffer */
+	OPJ_UINT32 numnewpasses;		/* number of pass added to the code-blocks */
+	OPJ_UINT32 numsegs;				/* number of segments */
+	OPJ_UINT32 real_num_segs;
+	OPJ_UINT32 m_current_max_segs;
+} opj_tcd_cblk_dec_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_precinct {
+	OPJ_INT32 x0, y0, x1, y1;		/* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
+	OPJ_UINT32 cw, ch;				/* number of precinct in width and height */
+	union{							/* code-blocks information */
+		opj_tcd_cblk_enc_t* enc;
+		opj_tcd_cblk_dec_t* dec;
+	} cblks;
+	OPJ_UINT32 block_size;			/* size taken by cblks (in bytes) */
+	opj_tgt_tree_t *incltree;	    /* inclusion tree */
+	opj_tgt_tree_t *imsbtree;	    /* IMSB tree */
+} opj_tcd_precinct_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_band {
+	OPJ_INT32 x0, y0, x1, y1;		/* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
+	OPJ_UINT32 bandno;
+	opj_tcd_precinct_t *precincts;	/* precinct information */
+	OPJ_UINT32 precincts_data_size;	/* size of data taken by precincts */
+	OPJ_INT32 numbps;
+	OPJ_FLOAT32 stepsize;
+} opj_tcd_band_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_resolution {
+	OPJ_INT32 x0, y0, x1, y1;		/* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
+	OPJ_UINT32 pw, ph;
+	OPJ_UINT32 numbands;			/* number sub-band for the resolution level */
+	opj_tcd_band_t bands[3];		/* subband information */
+} opj_tcd_resolution_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_tilecomp
+{
+	OPJ_INT32 x0, y0, x1, y1;				/* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
+	OPJ_UINT32 numresolutions;				/* number of resolutions level */
+	OPJ_UINT32 minimum_num_resolutions;		/* number of resolutions level to decode (at max)*/
+	opj_tcd_resolution_t *resolutions;	/* resolutions information */
+	OPJ_UINT32 resolutions_size;			/* size of data for resolutions (in bytes) */
+	OPJ_INT32 *data;						/* data of the component */
+	OPJ_UINT32 data_size;					/* size of the data of the component */
+	OPJ_INT32 numpix;						/* add fixed_quality */
+} opj_tcd_tilecomp_t;
+
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_tile {
+	OPJ_INT32 x0, y0, x1, y1;		/* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
+	OPJ_UINT32 numcomps;			/* number of components in tile */
+	opj_tcd_tilecomp_t *comps;	/* Components information */
+	OPJ_INT32 numpix;				/* add fixed_quality */
+	OPJ_FLOAT64 distotile;			/* add fixed_quality */
+	OPJ_FLOAT64 distolayer[100];	/* add fixed_quality */
+	OPJ_UINT32 packno;              /* packet number */
+} opj_tcd_tile_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_image
+{
+	opj_tcd_tile_t *tiles;		/* Tiles information */
+}
+opj_tcd_image_t;
+
+
+/**
+Tile coder/decoder
+*/
+typedef struct opj_tcd
+{
+	/** Position of the tilepart flag in Progression order*/
+	OPJ_INT32 tp_pos;
+	/** Tile part number*/
+	OPJ_UINT32 tp_num;
+	/** Current tile part number*/
+	OPJ_UINT32 cur_tp_num;
+	/** Total number of tileparts of the current tile*/
+	OPJ_UINT32 cur_totnum_tp;
+	/** Current Packet iterator number */
+	OPJ_UINT32 cur_pino;
+	/** info on each image tile */
+	opj_tcd_image_t *tcd_image;
+	/** image header */
+	opj_image_t *image;
+	/** coding parameters */
+	opj_cp_t *cp;
+	/** coding/decoding parameters common to all tiles */
+	opj_tcp_t *tcp;
+	/** current encoded/decoded tile */
+	OPJ_UINT32 tcd_tileno;
+	/** tell if the tcd is a decoder. */
+	OPJ_UINT32 m_is_decoder : 1;
+} opj_tcd_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Dump the content of a tcd structure
+*/
+/*void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);*/ /* TODO MSD shoul use the new v2 structures */ 
+
+/**
+Create a new TCD handle
+@param p_is_decoder FIXME DOC
+@return Returns a new TCD handle if successful returns NULL otherwise
+*/
+opj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder);
+
+/**
+Destroy a previously created TCD handle
+@param tcd TCD handle to destroy
+*/
+void opj_tcd_destroy(opj_tcd_t *tcd);
+
+/**
+ * Initialize the tile coder and may reuse some memory.
+ * @param	p_tcd		TCD handle.
+ * @param	p_image		raw image.
+ * @param	p_cp		coding parameters.
+ *
+ * @return true if the encoding values could be set (false otherwise).
+*/
+OPJ_BOOL opj_tcd_init(	opj_tcd_t *p_tcd,
+						opj_image_t * p_image,
+						opj_cp_t * p_cp );
+
+/**
+ * Allocates memory for decoding a specific tile.
+ *
+ * @param	p_tcd		the tile decoder.
+ * @param	p_tile_no	the index of the tile received in sequence. This not necessarily lead to the
+ * tile at index p_tile_no.
+ *
+ * @return	true if the remaining data is sufficient.
+ */
+OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no);
+
+void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final);
+
+void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd);
+
+void opj_tcd_makelayer(	opj_tcd_t *tcd,
+						OPJ_UINT32 layno,
+						OPJ_FLOAT64 thresh,
+						OPJ_UINT32 final);
+
+OPJ_BOOL opj_tcd_rateallocate(	opj_tcd_t *tcd,
+								OPJ_BYTE *dest,
+								OPJ_UINT32 * p_data_written,
+								OPJ_UINT32 len,
+								opj_codestream_info_t *cstr_info);
+
+/**
+ * Gets the maximum tile size that will be taken by the tile once decoded.
+ */
+OPJ_UINT32 opj_tcd_get_decoded_tile_size (opj_tcd_t *p_tcd );
+
+/**
+ * Encodes a tile from the raw image into the given buffer.
+ * @param	p_tcd			Tile Coder handle
+ * @param	p_tile_no		Index of the tile to encode.
+ * @param	p_dest			Destination buffer
+ * @param	p_data_written	pointer to an int that is incremented by the number of bytes really written on p_dest
+ * @param	p_len			Maximum length of the destination buffer
+ * @param	p_cstr_info		Codestream information structure
+ * @return  true if the coding is successfull.
+*/
+OPJ_BOOL opj_tcd_encode_tile(   opj_tcd_t *p_tcd,
+							    OPJ_UINT32 p_tile_no,
+							    OPJ_BYTE *p_dest,
+							    OPJ_UINT32 * p_data_written,
+							    OPJ_UINT32 p_len,
+							    struct opj_codestream_info *p_cstr_info);
+
+
+/**
+Decode a tile from a buffer into a raw image
+@param tcd TCD handle
+@param src Source buffer
+@param len Length of source buffer
+@param tileno Number that identifies one of the tiles to be decoded
+@param cstr_info  FIXME DOC
+*/
+OPJ_BOOL opj_tcd_decode_tile(   opj_tcd_t *tcd,
+							    OPJ_BYTE *src,
+							    OPJ_UINT32 len,
+							    OPJ_UINT32 tileno,
+							    opj_codestream_index_t *cstr_info);
+
+
+/**
+ * Copies tile data from the system onto the given memory block.
+ */
+OPJ_BOOL opj_tcd_update_tile_data (	opj_tcd_t *p_tcd,
+								    OPJ_BYTE * p_dest,
+								    OPJ_UINT32 p_dest_length );
+
+/**
+ *
+ */
+OPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd );
+
+/**
+ * Initialize the tile coder and may reuse some meory.
+ *
+ * @param	p_tcd		TCD handle.
+ * @param	p_tile_no	current tile index to encode.
+ *
+ * @return true if the encoding values could be set (false otherwise).
+*/
+OPJ_BOOL opj_tcd_init_encode_tile (	opj_tcd_t *p_tcd,
+								    OPJ_UINT32 p_tile_no );
+
+/**
+ * Copies tile data from the given memory block onto the system.
+ */
+OPJ_BOOL opj_tcd_copy_tile_data (opj_tcd_t *p_tcd,
+                                 OPJ_BYTE * p_src,
+                                 OPJ_UINT32 p_src_length );
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __TCD_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.c
new file mode 100644
index 0000000..e77adb3
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.c
@@ -0,0 +1,337 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/* 
+==========================================================
+   Tag-tree coder interface
+==========================================================
+*/
+
+opj_tgt_tree_t *opj_tgt_create(OPJ_UINT32 numleafsh, OPJ_UINT32 numleafsv) {
+        OPJ_INT32 nplh[32];
+        OPJ_INT32 nplv[32];
+        opj_tgt_node_t *node = 00;
+        opj_tgt_node_t *l_parent_node = 00;
+        opj_tgt_node_t *l_parent_node0 = 00;
+        opj_tgt_tree_t *tree = 00;
+        OPJ_UINT32 i;
+        OPJ_INT32  j,k;
+        OPJ_UINT32 numlvls;
+        OPJ_UINT32 n;
+
+        tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t));
+        if(!tree) {
+                fprintf(stderr, "ERROR in tgt_create while allocating tree\n");
+                return 00;
+        }
+        memset(tree,0,sizeof(opj_tgt_tree_t));
+
+        tree->numleafsh = numleafsh;
+        tree->numleafsv = numleafsv;
+
+        numlvls = 0;
+        nplh[0] = (OPJ_INT32)numleafsh;
+        nplv[0] = (OPJ_INT32)numleafsv;
+        tree->numnodes = 0;
+        do {
+                n = (OPJ_UINT32)(nplh[numlvls] * nplv[numlvls]);
+                nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2;
+                nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2;
+                tree->numnodes += n;
+                ++numlvls;
+        } while (n > 1);
+
+        /* ADD */
+        if (tree->numnodes == 0) {
+                opj_free(tree);
+                fprintf(stderr, "WARNING in tgt_create tree->numnodes == 0, no tree created.\n");
+                return 00;
+        }
+
+        tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes, sizeof(opj_tgt_node_t));
+        if(!tree->nodes) {
+                fprintf(stderr, "ERROR in tgt_create while allocating node of the tree\n");
+                opj_free(tree);
+                return 00;
+        }
+        memset(tree->nodes,0,tree->numnodes * sizeof(opj_tgt_node_t));
+        tree->nodes_size = tree->numnodes * (OPJ_UINT32)sizeof(opj_tgt_node_t);
+
+        node = tree->nodes;
+        l_parent_node = &tree->nodes[tree->numleafsh * tree->numleafsv];
+        l_parent_node0 = l_parent_node;
+
+        for (i = 0; i < numlvls - 1; ++i) {
+                for (j = 0; j < nplv[i]; ++j) {
+                        k = nplh[i];
+                        while (--k >= 0) {
+                                node->parent = l_parent_node;
+                                ++node;
+                                if (--k >= 0) {
+                                        node->parent = l_parent_node;
+                                        ++node;
+                                }
+                                ++l_parent_node;
+                        }
+                        if ((j & 1) || j == nplv[i] - 1) {
+                                l_parent_node0 = l_parent_node;
+                        } else {
+                                l_parent_node = l_parent_node0;
+                                l_parent_node0 += nplh[i];
+                        }
+                }
+        }
+        node->parent = 0;
+        opj_tgt_reset(tree);
+        return tree;
+}
+
+/**
+ * Reinitialises a tag-tree from an existing one.
+ *
+ * @param       p_tree                          the tree to reinitialize.
+ * @param       p_num_leafs_h           the width of the array of leafs of the tree
+ * @param       p_num_leafs_v           the height of the array of leafs of the tree
+ * @return      a new tag-tree if successful, NULL otherwise
+*/
+opj_tgt_tree_t *opj_tgt_init(opj_tgt_tree_t * p_tree,OPJ_UINT32 p_num_leafs_h, OPJ_UINT32 p_num_leafs_v)
+{
+        OPJ_INT32 l_nplh[32];
+        OPJ_INT32 l_nplv[32];
+        opj_tgt_node_t *l_node = 00;
+        opj_tgt_node_t *l_parent_node = 00;
+        opj_tgt_node_t *l_parent_node0 = 00;
+        OPJ_UINT32 i;
+        OPJ_INT32 j,k;
+        OPJ_UINT32 l_num_levels;
+        OPJ_UINT32 n;
+        OPJ_UINT32 l_node_size;
+
+        if (! p_tree){
+                return 00;
+        }
+
+        if ((p_tree->numleafsh != p_num_leafs_h) || (p_tree->numleafsv != p_num_leafs_v)) {
+                p_tree->numleafsh = p_num_leafs_h;
+                p_tree->numleafsv = p_num_leafs_v;
+
+                l_num_levels = 0;
+                l_nplh[0] = (OPJ_INT32)p_num_leafs_h;
+                l_nplv[0] = (OPJ_INT32)p_num_leafs_v;
+                p_tree->numnodes = 0;
+                do
+                {
+                        n = (OPJ_UINT32)(l_nplh[l_num_levels] * l_nplv[l_num_levels]);
+                        l_nplh[l_num_levels + 1] = (l_nplh[l_num_levels] + 1) / 2;
+                        l_nplv[l_num_levels + 1] = (l_nplv[l_num_levels] + 1) / 2;
+                        p_tree->numnodes += n;
+                        ++l_num_levels;
+                }
+                while (n > 1);
+
+                /* ADD */
+                if (p_tree->numnodes == 0) {
+                        opj_tgt_destroy(p_tree);
+                        return 00;
+                }
+                l_node_size = p_tree->numnodes * (OPJ_UINT32)sizeof(opj_tgt_node_t);
+                
+                if (l_node_size > p_tree->nodes_size) {
+                        opj_tgt_node_t* new_nodes = (opj_tgt_node_t*) opj_realloc(p_tree->nodes, l_node_size);
+                        if (! new_nodes) {
+                                fprintf(stderr, "ERROR Not enough memory to reinitialize the tag tree\n");
+                                opj_tgt_destroy(p_tree);
+                                return 00;
+                        }
+                        p_tree->nodes = new_nodes;
+                        memset(((char *) p_tree->nodes) + p_tree->nodes_size, 0 , l_node_size - p_tree->nodes_size);
+                        p_tree->nodes_size = l_node_size;
+                }
+                l_node = p_tree->nodes;
+                l_parent_node = &p_tree->nodes[p_tree->numleafsh * p_tree->numleafsv];
+                l_parent_node0 = l_parent_node;
+
+                for (i = 0; i < l_num_levels - 1; ++i) {
+                        for (j = 0; j < l_nplv[i]; ++j) {
+                                k = l_nplh[i];
+                                while (--k >= 0) {
+                                        l_node->parent = l_parent_node;
+                                        ++l_node;
+                                        if (--k >= 0) {
+                                                l_node->parent = l_parent_node;
+                                                ++l_node;
+                                        }
+                                        ++l_parent_node;
+                                        }
+                                if ((j & 1) || j == l_nplv[i] - 1)
+                                {
+                                        l_parent_node0 = l_parent_node;
+                                }
+                                else
+                                {
+                                        l_parent_node = l_parent_node0;
+                                        l_parent_node0 += l_nplh[i];
+                                }
+                        }
+                }
+                l_node->parent = 0;
+        }
+        opj_tgt_reset(p_tree);
+
+        return p_tree;
+}
+
+void opj_tgt_destroy(opj_tgt_tree_t *p_tree)
+{
+        if (! p_tree) {
+                return;
+        }
+
+        if (p_tree->nodes) {
+                opj_free(p_tree->nodes);
+                p_tree->nodes = 00;
+        }
+        opj_free(p_tree);
+}
+
+void opj_tgt_reset(opj_tgt_tree_t *p_tree) {
+        OPJ_UINT32 i;
+        opj_tgt_node_t * l_current_node = 00;;
+
+        if (! p_tree) {
+                return;
+        }
+
+        l_current_node = p_tree->nodes;
+        for     (i = 0; i < p_tree->numnodes; ++i)
+        {
+                l_current_node->value = 999;
+                l_current_node->low = 0;
+                l_current_node->known = 0;
+                ++l_current_node;
+        }
+}
+
+void opj_tgt_setvalue(opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 value) {
+        opj_tgt_node_t *node;
+        node = &tree->nodes[leafno];
+        while (node && node->value > value) {
+                node->value = value;
+                node = node->parent;
+        }
+}
+
+void opj_tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 threshold) {
+        opj_tgt_node_t *stk[31];
+        opj_tgt_node_t **stkptr;
+        opj_tgt_node_t *node;
+        OPJ_INT32 low;
+
+        stkptr = stk;
+        node = &tree->nodes[leafno];
+        while (node->parent) {
+                *stkptr++ = node;
+                node = node->parent;
+        }
+        
+        low = 0;
+        for (;;) {
+                if (low > node->low) {
+                        node->low = low;
+                } else {
+                        low = node->low;
+                }
+                
+                while (low < threshold) {
+                        if (low >= node->value) {
+                                if (!node->known) {
+                                        opj_bio_write(bio, 1, 1);
+                                        node->known = 1;
+                                }
+                                break;
+                        }
+                        opj_bio_write(bio, 0, 1);
+                        ++low;
+                }
+                
+                node->low = low;
+                if (stkptr == stk)
+                        break;
+                node = *--stkptr;
+        }
+}
+
+OPJ_UINT32 opj_tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 threshold) {
+        opj_tgt_node_t *stk[31];
+        opj_tgt_node_t **stkptr;
+        opj_tgt_node_t *node;
+        OPJ_INT32 low;
+
+        stkptr = stk;
+        node = &tree->nodes[leafno];
+        while (node->parent) {
+                *stkptr++ = node;
+                node = node->parent;
+        }
+        
+        low = 0;
+        for (;;) {
+                if (low > node->low) {
+                        node->low = low;
+                } else {
+                        low = node->low;
+                }
+                while (low < threshold && low < node->value) {
+                        if (opj_bio_read(bio, 1)) {
+                                node->value = low;
+                        } else {
+                                ++low;
+                        }
+                }
+                node->low = low;
+                if (stkptr == stk) {
+                        break;
+                }
+                node = *--stkptr;
+        }
+        
+        return (node->value < threshold) ? 1 : 0;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.h
new file mode 100644
index 0000000..3d152f8
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.h
@@ -0,0 +1,146 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses 
+ * BSD License, included below. This software may be subject to other third 
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France 
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __TGT_H
+#define __TGT_H
+/**
+@file tgt.h
+@brief Implementation of a tag-tree coder (TGT)
+
+The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C
+are used by some function in T2.C.
+*/
+
+/** @defgroup TGT TGT - Implementation of a tag-tree coder */
+/*@{*/
+
+/**
+Tag node
+*/
+typedef struct opj_tgt_node {
+    struct opj_tgt_node *parent;
+    OPJ_INT32 value;
+    OPJ_INT32 low;
+    OPJ_UINT32 known;
+} opj_tgt_node_t;
+
+/**
+Tag tree
+*/
+typedef struct opj_tgt_tree
+{
+	OPJ_UINT32  numleafsh;
+	OPJ_UINT32  numleafsv;
+	OPJ_UINT32 numnodes;
+	opj_tgt_node_t *nodes;
+	OPJ_UINT32  nodes_size;		/* maximum size taken by nodes */
+} opj_tgt_tree_t;
+
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a tag-tree
+@param numleafsh Width of the array of leafs of the tree
+@param numleafsv Height of the array of leafs of the tree
+@return Returns a new tag-tree if successful, returns NULL otherwise
+*/
+opj_tgt_tree_t *opj_tgt_create(OPJ_UINT32 numleafsh, OPJ_UINT32 numleafsv);
+
+/**
+ * Reinitialises a tag-tree from an exixting one.
+ *
+ * @param	p_tree				the tree to reinitialize.
+ * @param	p_num_leafs_h		the width of the array of leafs of the tree
+ * @param	p_num_leafs_v		the height of the array of leafs of the tree
+ * @return	a new tag-tree if successful, NULL otherwise
+*/
+opj_tgt_tree_t *opj_tgt_init(opj_tgt_tree_t * p_tree, 
+                             OPJ_UINT32  p_num_leafs_h, 
+                             OPJ_UINT32  p_num_leafs_v);
+/**
+Destroy a tag-tree, liberating memory
+@param tree Tag-tree to destroy
+*/
+void opj_tgt_destroy(opj_tgt_tree_t *tree);
+/**
+Reset a tag-tree (set all leaves to 0)
+@param tree Tag-tree to reset
+*/
+void opj_tgt_reset(opj_tgt_tree_t *tree);
+/**
+Set the value of a leaf of a tag-tree
+@param tree Tag-tree to modify
+@param leafno Number that identifies the leaf to modify
+@param value New value of the leaf
+*/
+void opj_tgt_setvalue(opj_tgt_tree_t *tree, 
+                      OPJ_UINT32 leafno, 
+                      OPJ_INT32 value);
+/**
+Encode the value of a leaf of the tag-tree up to a given threshold
+@param bio Pointer to a BIO handle
+@param tree Tag-tree to modify
+@param leafno Number that identifies the leaf to encode
+@param threshold Threshold to use when encoding value of the leaf
+*/
+void opj_tgt_encode(opj_bio_t *bio, 
+                    opj_tgt_tree_t *tree, 
+                    OPJ_UINT32 leafno, 
+                    OPJ_INT32 threshold);
+/**
+Decode the value of a leaf of the tag-tree up to a given threshold
+@param bio Pointer to a BIO handle
+@param tree Tag-tree to decode
+@param leafno Number that identifies the leaf to decode
+@param threshold Threshold to use when decoding value of the leaf
+@return Returns 1 if the node's value < threshold, returns 0 otherwise
+*/
+OPJ_UINT32 opj_tgt_decode(opj_bio_t *bio, 
+                          opj_tgt_tree_t *tree, 
+                          OPJ_UINT32 leafno, 
+                          OPJ_INT32 threshold);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __TGT_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_bio.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_bio.c
new file mode 100644
index 0000000..57ed6f8
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_bio.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/bio.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_cio.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_cio.c
new file mode 100644
index 0000000..5f70ee5
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_cio.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/cio.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_dwt.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_dwt.c
new file mode 100644
index 0000000..2dd428f
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_dwt.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/dwt.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_event.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_event.c
new file mode 100644
index 0000000..a7d9bca
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_event.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/event.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_function_list.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_function_list.c
new file mode 100644
index 0000000..499b141
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_function_list.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/function_list.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_image.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_image.c
new file mode 100644
index 0000000..46b0faa
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_image.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/image.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_invert.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_invert.c
new file mode 100644
index 0000000..daa89ab
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_invert.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/invert.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_j2k.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_j2k.c
new file mode 100644
index 0000000..c3ae6d4
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_j2k.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/j2k.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_j2k_lib.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_j2k_lib.c
new file mode 100644
index 0000000..0aa62a0
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_j2k_lib.c
@@ -0,0 +1,9 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_jpt.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_jpt.c
new file mode 100644
index 0000000..0aa62a0
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_jpt.c
@@ -0,0 +1,9 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c
new file mode 100644
index 0000000..d2a3861
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/mct.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_mqc.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_mqc.c
new file mode 100644
index 0000000..bda851d
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_mqc.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/mqc.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg.c
new file mode 100644
index 0000000..8addb90
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/openjpeg.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg_jp2.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg_jp2.c
new file mode 100644
index 0000000..4271dd0
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg_jp2.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/jp2.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_opj_clock.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_opj_clock.c
new file mode 100644
index 0000000..1aed471
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_opj_clock.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/opj_clock.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_pi.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_pi.c
new file mode 100644
index 0000000..034a120
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_pi.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/pi.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_raw.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_raw.c
new file mode 100644
index 0000000..c475df2
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_raw.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/raw.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_t1.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_t1.c
new file mode 100644
index 0000000..ada8ae2
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_t1.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/t1.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_t1_generate_luts.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_t1_generate_luts.c
new file mode 100644
index 0000000..a4b8890
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_t1_generate_luts.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/t1_generate_luts.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_t2.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_t2.c
new file mode 100644
index 0000000..4e5ca50
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_t2.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/t2.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_tcd.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_tcd.c
new file mode 100644
index 0000000..8d57570
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_tcd.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/tcd.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_tgt.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_tgt.c
new file mode 100644
index 0000000..283dc54
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_tgt.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/tgt.c"
diff --git a/core/src/fxcodec/fx_zlib/include/fx_zlib.h b/core/src/fxcodec/fx_zlib/include/fx_zlib.h
new file mode 100644
index 0000000..955481c
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/include/fx_zlib.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/zlib.h"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_adler32.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_adler32.c
new file mode 100644
index 0000000..38a35a0
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_adler32.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_adler32.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_compress.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_compress.c
new file mode 100644
index 0000000..c88a675
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_compress.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_compress.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_crc32.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_crc32.c
new file mode 100644
index 0000000..e7f7453
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_crc32.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_crc32.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_deflate.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_deflate.c
new file mode 100644
index 0000000..377779a
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_deflate.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_deflate.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_gzclose.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzclose.c
new file mode 100644
index 0000000..726cbc2
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzclose.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/gzclose.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_gzlib.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzlib.c
new file mode 100644
index 0000000..3e95454
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzlib.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/gzlib.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_gzread.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzread.c
new file mode 100644
index 0000000..2c14ff7
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzread.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/gzread.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_gzwrite.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzwrite.c
new file mode 100644
index 0000000..2a37fed
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzwrite.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/gzwrite.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_infback.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_infback.c
new file mode 100644
index 0000000..17bc781
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_infback.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_infback.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_inffast.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_inffast.c
new file mode 100644
index 0000000..a6828cc
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_inffast.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_inffast.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_inflate.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_inflate.c
new file mode 100644
index 0000000..f28a389
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_inflate.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_inflate.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_inftrees.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_inftrees.c
new file mode 100644
index 0000000..9abe3f0
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_inftrees.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_inftrees.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_trees.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_trees.c
new file mode 100644
index 0000000..05e175b
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_trees.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_trees.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_uncompr.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_uncompr.c
new file mode 100644
index 0000000..451cb6f
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_uncompr.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_uncompr.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_zutil.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_zutil.c
new file mode 100644
index 0000000..f97edd5
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_zutil.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_zutil.c"
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/crc32.h b/core/src/fxcodec/fx_zlib/zlib_v128/crc32.h
new file mode 100644
index 0000000..9e0c778
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/crc32.h
@@ -0,0 +1,441 @@
+/* crc32.h -- tables for rapid CRC calculation
+ * Generated automatically by crc32.c
+ */
+
+local const z_crc_t FAR crc_table[TBLS][256] =
+{
+  {
+    0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
+    0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
+    0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
+    0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
+    0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
+    0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
+    0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
+    0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
+    0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
+    0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
+    0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
+    0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
+    0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
+    0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
+    0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
+    0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
+    0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
+    0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
+    0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
+    0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
+    0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
+    0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
+    0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
+    0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
+    0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
+    0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
+    0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
+    0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
+    0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
+    0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
+    0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
+    0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
+    0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
+    0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
+    0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
+    0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
+    0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
+    0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
+    0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
+    0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
+    0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
+    0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
+    0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
+    0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
+    0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
+    0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
+    0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
+    0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
+    0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
+    0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
+    0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
+    0x2d02ef8dUL
+#ifdef BYFOUR
+  },
+  {
+    0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,
+    0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,
+    0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,
+    0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,
+    0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,
+    0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,
+    0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,
+    0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,
+    0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,
+    0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,
+    0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,
+    0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,
+    0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,
+    0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,
+    0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,
+    0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,
+    0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,
+    0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,
+    0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,
+    0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,
+    0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,
+    0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,
+    0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,
+    0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,
+    0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,
+    0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,
+    0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,
+    0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,
+    0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,
+    0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,
+    0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,
+    0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,
+    0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,
+    0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,
+    0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,
+    0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,
+    0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,
+    0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,
+    0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,
+    0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,
+    0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,
+    0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,
+    0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,
+    0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,
+    0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,
+    0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,
+    0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,
+    0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,
+    0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,
+    0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,
+    0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,
+    0x9324fd72UL
+  },
+  {
+    0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,
+    0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,
+    0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,
+    0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,
+    0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,
+    0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,
+    0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,
+    0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,
+    0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,
+    0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,
+    0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,
+    0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,
+    0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,
+    0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,
+    0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,
+    0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,
+    0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,
+    0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,
+    0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,
+    0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,
+    0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,
+    0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,
+    0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,
+    0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,
+    0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,
+    0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,
+    0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,
+    0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,
+    0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,
+    0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,
+    0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,
+    0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,
+    0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,
+    0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,
+    0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,
+    0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,
+    0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,
+    0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,
+    0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,
+    0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,
+    0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,
+    0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,
+    0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,
+    0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,
+    0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,
+    0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,
+    0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,
+    0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,
+    0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,
+    0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,
+    0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,
+    0xbe9834edUL
+  },
+  {
+    0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,
+    0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,
+    0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,
+    0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,
+    0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,
+    0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,
+    0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,
+    0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,
+    0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,
+    0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,
+    0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,
+    0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,
+    0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,
+    0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,
+    0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,
+    0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,
+    0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,
+    0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,
+    0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,
+    0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,
+    0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,
+    0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,
+    0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,
+    0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,
+    0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,
+    0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,
+    0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,
+    0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,
+    0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,
+    0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,
+    0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,
+    0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,
+    0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,
+    0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,
+    0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,
+    0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,
+    0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,
+    0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,
+    0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,
+    0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,
+    0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,
+    0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,
+    0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,
+    0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,
+    0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,
+    0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,
+    0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,
+    0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,
+    0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,
+    0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,
+    0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,
+    0xde0506f1UL
+  },
+  {
+    0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL,
+    0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL,
+    0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL,
+    0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL,
+    0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL,
+    0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL,
+    0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL,
+    0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL,
+    0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL,
+    0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL,
+    0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL,
+    0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL,
+    0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL,
+    0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL,
+    0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL,
+    0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL,
+    0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL,
+    0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL,
+    0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL,
+    0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL,
+    0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL,
+    0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL,
+    0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL,
+    0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL,
+    0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL,
+    0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL,
+    0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL,
+    0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL,
+    0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL,
+    0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL,
+    0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL,
+    0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL,
+    0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL,
+    0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL,
+    0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL,
+    0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL,
+    0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL,
+    0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL,
+    0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL,
+    0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL,
+    0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL,
+    0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL,
+    0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL,
+    0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL,
+    0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL,
+    0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL,
+    0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL,
+    0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL,
+    0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL,
+    0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL,
+    0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL,
+    0x8def022dUL
+  },
+  {
+    0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL,
+    0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL,
+    0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL,
+    0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL,
+    0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL,
+    0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL,
+    0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL,
+    0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL,
+    0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL,
+    0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL,
+    0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL,
+    0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL,
+    0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL,
+    0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL,
+    0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL,
+    0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL,
+    0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL,
+    0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL,
+    0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL,
+    0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL,
+    0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL,
+    0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL,
+    0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL,
+    0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL,
+    0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL,
+    0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL,
+    0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL,
+    0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL,
+    0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL,
+    0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL,
+    0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL,
+    0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL,
+    0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL,
+    0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL,
+    0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL,
+    0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL,
+    0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL,
+    0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL,
+    0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL,
+    0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL,
+    0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL,
+    0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL,
+    0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL,
+    0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL,
+    0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL,
+    0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL,
+    0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL,
+    0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL,
+    0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL,
+    0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL,
+    0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL,
+    0x72fd2493UL
+  },
+  {
+    0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL,
+    0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL,
+    0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL,
+    0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL,
+    0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL,
+    0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL,
+    0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL,
+    0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL,
+    0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL,
+    0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL,
+    0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL,
+    0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL,
+    0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL,
+    0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL,
+    0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL,
+    0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL,
+    0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL,
+    0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL,
+    0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL,
+    0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL,
+    0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL,
+    0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL,
+    0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL,
+    0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL,
+    0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL,
+    0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL,
+    0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL,
+    0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL,
+    0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL,
+    0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL,
+    0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL,
+    0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL,
+    0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL,
+    0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL,
+    0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL,
+    0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL,
+    0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL,
+    0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL,
+    0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL,
+    0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL,
+    0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL,
+    0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL,
+    0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL,
+    0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL,
+    0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL,
+    0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL,
+    0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL,
+    0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL,
+    0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL,
+    0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL,
+    0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL,
+    0xed3498beUL
+  },
+  {
+    0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL,
+    0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL,
+    0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL,
+    0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL,
+    0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL,
+    0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL,
+    0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL,
+    0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL,
+    0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL,
+    0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL,
+    0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL,
+    0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL,
+    0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL,
+    0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL,
+    0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL,
+    0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL,
+    0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL,
+    0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL,
+    0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL,
+    0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL,
+    0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL,
+    0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL,
+    0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL,
+    0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL,
+    0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL,
+    0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL,
+    0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL,
+    0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL,
+    0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL,
+    0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL,
+    0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL,
+    0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL,
+    0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL,
+    0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL,
+    0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL,
+    0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL,
+    0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL,
+    0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL,
+    0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL,
+    0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL,
+    0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL,
+    0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL,
+    0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL,
+    0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL,
+    0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL,
+    0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL,
+    0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL,
+    0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL,
+    0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL,
+    0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL,
+    0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL,
+    0xf10605deUL
+#endif
+  }
+};
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/deflate.h b/core/src/fxcodec/fx_zlib/zlib_v128/deflate.h
new file mode 100644
index 0000000..ce0299e
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/deflate.h
@@ -0,0 +1,346 @@
+/* deflate.h -- internal compression state
+ * Copyright (C) 1995-2012 Jean-loup Gailly
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+/* @(#) $Id$ */
+
+#ifndef DEFLATE_H
+#define DEFLATE_H
+
+#include "zutil.h"
+
+/* define NO_GZIP when compiling if you want to disable gzip header and
+   trailer creation by deflate().  NO_GZIP would be used to avoid linking in
+   the crc code when it is not needed.  For shared libraries, gzip encoding
+   should be left enabled. */
+#ifndef NO_GZIP
+#  define GZIP
+#endif
+
+/* ===========================================================================
+ * Internal compression state.
+ */
+
+#define LENGTH_CODES 29
+/* number of length codes, not counting the special END_BLOCK code */
+
+#define LITERALS  256
+/* number of literal bytes 0..255 */
+
+#define L_CODES (LITERALS+1+LENGTH_CODES)
+/* number of Literal or Length codes, including the END_BLOCK code */
+
+#define D_CODES   30
+/* number of distance codes */
+
+#define BL_CODES  19
+/* number of codes used to transfer the bit lengths */
+
+#define HEAP_SIZE (2*L_CODES+1)
+/* maximum heap size */
+
+#define MAX_BITS 15
+/* All codes must not exceed MAX_BITS bits */
+
+#define Buf_size 16
+/* size of bit buffer in bi_buf */
+
+#define INIT_STATE    42
+#define EXTRA_STATE   69
+#define NAME_STATE    73
+#define COMMENT_STATE 91
+#define HCRC_STATE   103
+#define BUSY_STATE   113
+#define FINISH_STATE 666
+/* Stream status */
+
+
+/* Data structure describing a single value and its code string. */
+typedef struct ct_data_s {
+    union {
+        ush  freq;       /* frequency count */
+        ush  code;       /* bit string */
+    } fc;
+    union {
+        ush  dad;        /* father node in Huffman tree */
+        ush  len;        /* length of bit string */
+    } dl;
+} FAR ct_data;
+
+#define Freq fc.freq
+#define Code fc.code
+#define Dad  dl.dad
+#define Len  dl.len
+
+typedef struct static_tree_desc_s  static_tree_desc;
+
+typedef struct tree_desc_s {
+    ct_data *dyn_tree;           /* the dynamic tree */
+    int     max_code;            /* largest code with non zero frequency */
+    static_tree_desc *stat_desc; /* the corresponding static tree */
+} FAR tree_desc;
+
+typedef ush Pos;
+typedef Pos FAR Posf;
+typedef unsigned IPos;
+
+/* A Pos is an index in the character window. We use short instead of int to
+ * save space in the various tables. IPos is used only for parameter passing.
+ */
+
+typedef struct internal_state {
+    z_streamp strm;      /* pointer back to this zlib stream */
+    int   status;        /* as the name implies */
+    Bytef *pending_buf;  /* output still pending */
+    ulg   pending_buf_size; /* size of pending_buf */
+    Bytef *pending_out;  /* next pending byte to output to the stream */
+    uInt   pending;      /* nb of bytes in the pending buffer */
+    int   wrap;          /* bit 0 true for zlib, bit 1 true for gzip */
+    gz_headerp  gzhead;  /* gzip header information to write */
+    uInt   gzindex;      /* where in extra, name, or comment */
+    Byte  method;        /* can only be DEFLATED */
+    int   last_flush;    /* value of flush param for previous deflate call */
+
+                /* used by deflate.c: */
+
+    uInt  w_size;        /* LZ77 window size (32K by default) */
+    uInt  w_bits;        /* log2(w_size)  (8..16) */
+    uInt  w_mask;        /* w_size - 1 */
+
+    Bytef *window;
+    /* Sliding window. Input bytes are read into the second half of the window,
+     * and move to the first half later to keep a dictionary of at least wSize
+     * bytes. With this organization, matches are limited to a distance of
+     * wSize-MAX_MATCH bytes, but this ensures that IO is always
+     * performed with a length multiple of the block size. Also, it limits
+     * the window size to 64K, which is quite useful on MSDOS.
+     * To do: use the user input buffer as sliding window.
+     */
+
+    ulg window_size;
+    /* Actual size of window: 2*wSize, except when the user input buffer
+     * is directly used as sliding window.
+     */
+
+    Posf *prev;
+    /* Link to older string with same hash index. To limit the size of this
+     * array to 64K, this link is maintained only for the last 32K strings.
+     * An index in this array is thus a window index modulo 32K.
+     */
+
+    Posf *head; /* Heads of the hash chains or NIL. */
+
+    uInt  ins_h;          /* hash index of string to be inserted */
+    uInt  hash_size;      /* number of elements in hash table */
+    uInt  hash_bits;      /* log2(hash_size) */
+    uInt  hash_mask;      /* hash_size-1 */
+
+    uInt  hash_shift;
+    /* Number of bits by which ins_h must be shifted at each input
+     * step. It must be such that after MIN_MATCH steps, the oldest
+     * byte no longer takes part in the hash key, that is:
+     *   hash_shift * MIN_MATCH >= hash_bits
+     */
+
+    long block_start;
+    /* Window position at the beginning of the current output block. Gets
+     * negative when the window is moved backwards.
+     */
+
+    uInt match_length;           /* length of best match */
+    IPos prev_match;             /* previous match */
+    int match_available;         /* set if previous match exists */
+    uInt strstart;               /* start of string to insert */
+    uInt match_start;            /* start of matching string */
+    uInt lookahead;              /* number of valid bytes ahead in window */
+
+    uInt prev_length;
+    /* Length of the best match at previous step. Matches not greater than this
+     * are discarded. This is used in the lazy match evaluation.
+     */
+
+    uInt max_chain_length;
+    /* To speed up deflation, hash chains are never searched beyond this
+     * length.  A higher limit improves compression ratio but degrades the
+     * speed.
+     */
+
+    uInt max_lazy_match;
+    /* Attempt to find a better match only when the current match is strictly
+     * smaller than this value. This mechanism is used only for compression
+     * levels >= 4.
+     */
+#   define max_insert_length  max_lazy_match
+    /* Insert new strings in the hash table only if the match length is not
+     * greater than this length. This saves time but degrades compression.
+     * max_insert_length is used only for compression levels <= 3.
+     */
+
+    int level;    /* compression level (1..9) */
+    int strategy; /* favor or force Huffman coding*/
+
+    uInt good_match;
+    /* Use a faster search when the previous match is longer than this */
+
+    int nice_match; /* Stop searching when current match exceeds this */
+
+                /* used by trees.c: */
+    /* Didn't use ct_data typedef below to suppress compiler warning */
+    struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
+    struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
+    struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
+
+    struct tree_desc_s l_desc;               /* desc. for literal tree */
+    struct tree_desc_s d_desc;               /* desc. for distance tree */
+    struct tree_desc_s bl_desc;              /* desc. for bit length tree */
+
+    ush bl_count[MAX_BITS+1];
+    /* number of codes at each bit length for an optimal tree */
+
+    int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
+    int heap_len;               /* number of elements in the heap */
+    int heap_max;               /* element of largest frequency */
+    /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
+     * The same heap array is used to build all trees.
+     */
+
+    uch depth[2*L_CODES+1];
+    /* Depth of each subtree used as tie breaker for trees of equal frequency
+     */
+
+    uchf *l_buf;          /* buffer for literals or lengths */
+
+    uInt  lit_bufsize;
+    /* Size of match buffer for literals/lengths.  There are 4 reasons for
+     * limiting lit_bufsize to 64K:
+     *   - frequencies can be kept in 16 bit counters
+     *   - if compression is not successful for the first block, all input
+     *     data is still in the window so we can still emit a stored block even
+     *     when input comes from standard input.  (This can also be done for
+     *     all blocks if lit_bufsize is not greater than 32K.)
+     *   - if compression is not successful for a file smaller than 64K, we can
+     *     even emit a stored file instead of a stored block (saving 5 bytes).
+     *     This is applicable only for zip (not gzip or zlib).
+     *   - creating new Huffman trees less frequently may not provide fast
+     *     adaptation to changes in the input data statistics. (Take for
+     *     example a binary file with poorly compressible code followed by
+     *     a highly compressible string table.) Smaller buffer sizes give
+     *     fast adaptation but have of course the overhead of transmitting
+     *     trees more frequently.
+     *   - I can't count above 4
+     */
+
+    uInt last_lit;      /* running index in l_buf */
+
+    ushf *d_buf;
+    /* Buffer for distances. To simplify the code, d_buf and l_buf have
+     * the same number of elements. To use different lengths, an extra flag
+     * array would be necessary.
+     */
+
+    ulg opt_len;        /* bit length of current block with optimal trees */
+    ulg static_len;     /* bit length of current block with static trees */
+    uInt matches;       /* number of string matches in current block */
+    uInt insert;        /* bytes at end of window left to insert */
+
+#ifdef DEBUG
+    ulg compressed_len; /* total bit length of compressed file mod 2^32 */
+    ulg bits_sent;      /* bit length of compressed data sent mod 2^32 */
+#endif
+
+    ush bi_buf;
+    /* Output buffer. bits are inserted starting at the bottom (least
+     * significant bits).
+     */
+    int bi_valid;
+    /* Number of valid bits in bi_buf.  All bits above the last valid bit
+     * are always zero.
+     */
+
+    ulg high_water;
+    /* High water mark offset in window for initialized bytes -- bytes above
+     * this are set to zero in order to avoid memory check warnings when
+     * longest match routines access bytes past the input.  This is then
+     * updated to the new high water mark.
+     */
+
+} FAR deflate_state;
+
+/* Output a byte on the stream.
+ * IN assertion: there is enough room in pending_buf.
+ */
+#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}
+
+
+#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
+/* Minimum amount of lookahead, except at the end of the input file.
+ * See deflate.c for comments about the MIN_MATCH+1.
+ */
+
+#define MAX_DIST(s)  ((s)->w_size-MIN_LOOKAHEAD)
+/* In order to simplify the code, particularly on 16 bit machines, match
+ * distances are limited to MAX_DIST instead of WSIZE.
+ */
+
+#define WIN_INIT MAX_MATCH
+/* Number of bytes after end of data in window to initialize in order to avoid
+   memory checker errors from longest match routines */
+
+        /* in trees.c */
+void ZLIB_INTERNAL _tr_init OF((deflate_state *s));
+int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
+void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,
+                        ulg stored_len, int last));
+void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));
+void ZLIB_INTERNAL _tr_align OF((deflate_state *s));
+void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
+                        ulg stored_len, int last));
+
+#define d_code(dist) \
+   ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
+/* Mapping from a distance to a distance code. dist is the distance - 1 and
+ * must not have side effects. _dist_code[256] and _dist_code[257] are never
+ * used.
+ */
+
+#ifndef DEBUG
+/* Inline versions of _tr_tally for speed: */
+
+#if defined(GEN_TREES_H) || !defined(STDC)
+  extern uch ZLIB_INTERNAL _length_code[];
+  extern uch ZLIB_INTERNAL _dist_code[];
+#else
+  extern const uch ZLIB_INTERNAL _length_code[];
+  extern const uch ZLIB_INTERNAL _dist_code[];
+#endif
+
+# define _tr_tally_lit(s, c, flush) \
+  { uch cc = (c); \
+    s->d_buf[s->last_lit] = 0; \
+    s->l_buf[s->last_lit++] = cc; \
+    s->dyn_ltree[cc].Freq++; \
+    flush = (s->last_lit == s->lit_bufsize-1); \
+   }
+# define _tr_tally_dist(s, distance, length, flush) \
+  { uch len = (length); \
+    ush dist = (distance); \
+    s->d_buf[s->last_lit] = dist; \
+    s->l_buf[s->last_lit++] = len; \
+    dist--; \
+    s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
+    s->dyn_dtree[d_code(dist)].Freq++; \
+    flush = (s->last_lit == s->lit_bufsize-1); \
+  }
+#else
+# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
+# define _tr_tally_dist(s, distance, length, flush) \
+              flush = _tr_tally(s, distance, length)
+#endif
+
+#endif /* DEFLATE_H */
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_adler32.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_adler32.c
new file mode 100644
index 0000000..82a84ce
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_adler32.c
@@ -0,0 +1,179 @@
+/* adler32.c -- compute the Adler-32 checksum of a data stream
+ * Copyright (C) 1995-2011 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zutil.h"
+
+#define local static
+
+local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
+
+#define BASE 65521      /* largest prime smaller than 65536 */
+#define NMAX 5552
+/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
+
+#define DO1(buf,i)  {adler += (buf)[i]; sum2 += adler;}
+#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
+#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
+#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
+#define DO16(buf)   DO8(buf,0); DO8(buf,8);
+
+/* use NO_DIVIDE if your processor does not do division in hardware --
+   try it both ways to see which is faster */
+#ifdef NO_DIVIDE
+/* note that this assumes BASE is 65521, where 65536 % 65521 == 15
+   (thank you to John Reiser for pointing this out) */
+#  define CHOP(a) \
+    do { \
+        unsigned long tmp = a >> 16; \
+        a &= 0xffffUL; \
+        a += (tmp << 4) - tmp; \
+    } while (0)
+#  define MOD28(a) \
+    do { \
+        CHOP(a); \
+        if (a >= BASE) a -= BASE; \
+    } while (0)
+#  define MOD(a) \
+    do { \
+        CHOP(a); \
+        MOD28(a); \
+    } while (0)
+#  define MOD63(a) \
+    do { /* this assumes a is not negative */ \
+        z_off64_t tmp = a >> 32; \
+        a &= 0xffffffffL; \
+        a += (tmp << 8) - (tmp << 5) + tmp; \
+        tmp = a >> 16; \
+        a &= 0xffffL; \
+        a += (tmp << 4) - tmp; \
+        tmp = a >> 16; \
+        a &= 0xffffL; \
+        a += (tmp << 4) - tmp; \
+        if (a >= BASE) a -= BASE; \
+    } while (0)
+#else
+#  define MOD(a) a %= BASE
+#  define MOD28(a) a %= BASE
+#  define MOD63(a) a %= BASE
+#endif
+
+/* ========================================================================= */
+uLong ZEXPORT adler32(
+    uLong adler,
+    const Bytef *buf,
+    uInt len)
+{
+    unsigned long sum2;
+    unsigned n;
+
+    /* split Adler-32 into component sums */
+    sum2 = (adler >> 16) & 0xffff;
+    adler &= 0xffff;
+
+    /* in case user likes doing a byte at a time, keep it fast */
+    if (len == 1) {
+        adler += buf[0];
+        if (adler >= BASE)
+            adler -= BASE;
+        sum2 += adler;
+        if (sum2 >= BASE)
+            sum2 -= BASE;
+        return adler | (sum2 << 16);
+    }
+
+    /* initial Adler-32 value (deferred check for len == 1 speed) */
+    if (buf == Z_NULL)
+        return 1L;
+
+    /* in case short lengths are provided, keep it somewhat fast */
+    if (len < 16) {
+        while (len--) {
+            adler += *buf++;
+            sum2 += adler;
+        }
+        if (adler >= BASE)
+            adler -= BASE;
+        MOD28(sum2);            /* only added so many BASE's */
+        return adler | (sum2 << 16);
+    }
+
+    /* do length NMAX blocks -- requires just one modulo operation */
+    while (len >= NMAX) {
+        len -= NMAX;
+        n = NMAX / 16;          /* NMAX is divisible by 16 */
+        do {
+            DO16(buf);          /* 16 sums unrolled */
+            buf += 16;
+        } while (--n);
+        MOD(adler);
+        MOD(sum2);
+    }
+
+    /* do remaining bytes (less than NMAX, still just one modulo) */
+    if (len) {                  /* avoid modulos if none remaining */
+        while (len >= 16) {
+            len -= 16;
+            DO16(buf);
+            buf += 16;
+        }
+        while (len--) {
+            adler += *buf++;
+            sum2 += adler;
+        }
+        MOD(adler);
+        MOD(sum2);
+    }
+
+    /* return recombined sums */
+    return adler | (sum2 << 16);
+}
+
+/* ========================================================================= */
+local uLong adler32_combine_(
+    uLong adler1,
+    uLong adler2,
+    z_off64_t len2)
+{
+    unsigned long sum1;
+    unsigned long sum2;
+    unsigned rem;
+
+    /* for negative len, return invalid adler32 as a clue for debugging */
+    if (len2 < 0)
+        return 0xffffffffUL;
+
+    /* the derivation of this formula is left as an exercise for the reader */
+    MOD63(len2);                /* assumes len2 >= 0 */
+    rem = (unsigned)len2;
+    sum1 = adler1 & 0xffff;
+    sum2 = rem * sum1;
+    MOD(sum2);
+    sum1 += (adler2 & 0xffff) + BASE - 1;
+    sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
+    if (sum1 >= BASE) sum1 -= BASE;
+    if (sum1 >= BASE) sum1 -= BASE;
+    if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);
+    if (sum2 >= BASE) sum2 -= BASE;
+    return sum1 | (sum2 << 16);
+}
+
+/* ========================================================================= */
+uLong ZEXPORT adler32_combine(
+    uLong adler1,
+    uLong adler2,
+    z_off_t len2)
+{
+    return adler32_combine_(adler1, adler2, len2);
+}
+
+uLong ZEXPORT adler32_combine64(
+    uLong adler1,
+    uLong adler2,
+    z_off64_t len2)
+{
+    return adler32_combine_(adler1, adler2, len2);
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_compress.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_compress.c
new file mode 100644
index 0000000..0314fbc
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_compress.c
@@ -0,0 +1,80 @@
+/* compress.c -- compress a memory buffer
+ * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#define ZLIB_INTERNAL
+#include "zlib.h"
+
+/* ===========================================================================
+     Compresses the source buffer into the destination buffer. The level
+   parameter has the same meaning as in deflateInit.  sourceLen is the byte
+   length of the source buffer. Upon entry, destLen is the total size of the
+   destination buffer, which must be at least 0.1% larger than sourceLen plus
+   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
+
+     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+   Z_STREAM_ERROR if the level parameter is invalid.
+*/
+int ZEXPORT compress2 (
+    Bytef *dest,
+    uLongf *destLen,
+    const Bytef *source,
+    uLong sourceLen,
+    int level)
+{
+    z_stream stream;
+    int err;
+
+    stream.next_in = (z_const Bytef *)source;
+    stream.avail_in = (uInt)sourceLen;
+#ifdef MAXSEG_64K
+    /* Check for source > 64K on 16-bit machine: */
+    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+#endif
+    stream.next_out = dest;
+    stream.avail_out = (uInt)*destLen;
+    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+    stream.zalloc = (alloc_func)0;
+    stream.zfree = (free_func)0;
+    stream.opaque = (voidpf)0;
+
+    err = deflateInit(&stream, level);
+    if (err != Z_OK) return err;
+
+    err = deflate(&stream, Z_FINISH);
+    if (err != Z_STREAM_END) {
+        deflateEnd(&stream);
+        return err == Z_OK ? Z_BUF_ERROR : err;
+    }
+    *destLen = stream.total_out;
+
+    err = deflateEnd(&stream);
+    return err;
+}
+
+/* ===========================================================================
+ */
+int ZEXPORT compress (
+    Bytef *dest,
+    uLongf *destLen,
+    const Bytef *source,
+    uLong sourceLen)
+{
+    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
+}
+
+/* ===========================================================================
+     If the default memLevel or windowBits for deflateInit() is changed, then
+   this function needs to be updated.
+ */
+uLong ZEXPORT compressBound (
+    uLong sourceLen)
+{
+    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
+           (sourceLen >> 25) + 13;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_crc32.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_crc32.c
new file mode 100644
index 0000000..f0072c9
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_crc32.c
@@ -0,0 +1,425 @@
+/* crc32.c -- compute the CRC-32 of a data stream
+ * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ *
+ * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
+ * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
+ * tables for updating the shift register in one step with three exclusive-ors
+ * instead of four steps with four exclusive-ors.  This results in about a
+ * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
+ */
+
+/* @(#) $Id$ */
+
+/*
+  Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
+  protection on the static variables used to control the first-use generation
+  of the crc tables.  Therefore, if you #define DYNAMIC_CRC_TABLE, you should
+  first call get_crc_table() to initialize the tables before allowing more than
+  one thread to use crc32().
+
+  DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h.
+ */
+
+#ifdef MAKECRCH
+#  include <stdio.h>
+#  ifndef DYNAMIC_CRC_TABLE
+#    define DYNAMIC_CRC_TABLE
+#  endif /* !DYNAMIC_CRC_TABLE */
+#endif /* MAKECRCH */
+
+#include "zutil.h"      /* for STDC and FAR definitions */
+
+#define local static
+
+/* Definitions for doing the crc four data bytes at a time. */
+#if !defined(NOBYFOUR) && defined(Z_U4)
+#  define BYFOUR
+#endif
+#ifdef BYFOUR
+   local unsigned long crc32_little OF((unsigned long,
+                        const unsigned char FAR *, unsigned));
+   local unsigned long crc32_big OF((unsigned long,
+                        const unsigned char FAR *, unsigned));
+#  define TBLS 8
+#else
+#  define TBLS 1
+#endif /* BYFOUR */
+
+/* Local functions for crc concatenation */
+local unsigned long gf2_matrix_times OF((unsigned long *mat,
+                                         unsigned long vec));
+local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));
+local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));
+
+
+#ifdef DYNAMIC_CRC_TABLE
+
+local volatile int crc_table_empty = 1;
+local z_crc_t FAR crc_table[TBLS][256];
+local void make_crc_table OF((void));
+#ifdef MAKECRCH
+   local void write_table OF((FILE *, const z_crc_t FAR *));
+#endif /* MAKECRCH */
+/*
+  Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
+  x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
+
+  Polynomials over GF(2) are represented in binary, one bit per coefficient,
+  with the lowest powers in the most significant bit.  Then adding polynomials
+  is just exclusive-or, and multiplying a polynomial by x is a right shift by
+  one.  If we call the above polynomial p, and represent a byte as the
+  polynomial q, also with the lowest power in the most significant bit (so the
+  byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
+  where a mod b means the remainder after dividing a by b.
+
+  This calculation is done using the shift-register method of multiplying and
+  taking the remainder.  The register is initialized to zero, and for each
+  incoming bit, x^32 is added mod p to the register if the bit is a one (where
+  x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
+  x (which is shifting right by one and adding x^32 mod p if the bit shifted
+  out is a one).  We start with the highest power (least significant bit) of
+  q and repeat for all eight bits of q.
+
+  The first table is simply the CRC of all possible eight bit values.  This is
+  all the information needed to generate CRCs on data a byte at a time for all
+  combinations of CRC register values and incoming bytes.  The remaining tables
+  allow for word-at-a-time CRC calculation for both big-endian and little-
+  endian machines, where a word is four bytes.
+*/
+local void make_crc_table()
+{
+    z_crc_t c;
+    int n, k;
+    z_crc_t poly;                       /* polynomial exclusive-or pattern */
+    /* terms of polynomial defining this crc (except x^32): */
+    static volatile int first = 1;      /* flag to limit concurrent making */
+    static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
+
+    /* See if another task is already doing this (not thread-safe, but better
+       than nothing -- significantly reduces duration of vulnerability in
+       case the advice about DYNAMIC_CRC_TABLE is ignored) */
+    if (first) {
+        first = 0;
+
+        /* make exclusive-or pattern from polynomial (0xedb88320UL) */
+        poly = 0;
+        for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++)
+            poly |= (z_crc_t)1 << (31 - p[n]);
+
+        /* generate a crc for every 8-bit value */
+        for (n = 0; n < 256; n++) {
+            c = (z_crc_t)n;
+            for (k = 0; k < 8; k++)
+                c = c & 1 ? poly ^ (c >> 1) : c >> 1;
+            crc_table[0][n] = c;
+        }
+
+#ifdef BYFOUR
+        /* generate crc for each value followed by one, two, and three zeros,
+           and then the byte reversal of those as well as the first table */
+        for (n = 0; n < 256; n++) {
+            c = crc_table[0][n];
+            crc_table[4][n] = ZSWAP32(c);
+            for (k = 1; k < 4; k++) {
+                c = crc_table[0][c & 0xff] ^ (c >> 8);
+                crc_table[k][n] = c;
+                crc_table[k + 4][n] = ZSWAP32(c);
+            }
+        }
+#endif /* BYFOUR */
+
+        crc_table_empty = 0;
+    }
+    else {      /* not first */
+        /* wait for the other guy to finish (not efficient, but rare) */
+        while (crc_table_empty)
+            ;
+    }
+
+#ifdef MAKECRCH
+    /* write out CRC tables to crc32.h */
+    {
+        FILE *out;
+
+        out = fopen("crc32.h", "w");
+        if (out == NULL) return;
+        fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
+        fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
+        fprintf(out, "local const z_crc_t FAR ");
+        fprintf(out, "crc_table[TBLS][256] =\n{\n  {\n");
+        write_table(out, crc_table[0]);
+#  ifdef BYFOUR
+        fprintf(out, "#ifdef BYFOUR\n");
+        for (k = 1; k < 8; k++) {
+            fprintf(out, "  },\n  {\n");
+            write_table(out, crc_table[k]);
+        }
+        fprintf(out, "#endif\n");
+#  endif /* BYFOUR */
+        fprintf(out, "  }\n};\n");
+        fclose(out);
+    }
+#endif /* MAKECRCH */
+}
+
+#ifdef MAKECRCH
+local void write_table(
+    FILE *out,
+    const z_crc_t FAR *table)
+{
+    int n;
+
+    for (n = 0; n < 256; n++)
+        fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : "    ",
+                (unsigned long)(table[n]),
+                n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
+}
+#endif /* MAKECRCH */
+
+#else /* !DYNAMIC_CRC_TABLE */
+/* ========================================================================
+ * Tables of CRC-32s of all single-byte values, made by make_crc_table().
+ */
+#include "crc32.h"
+#endif /* DYNAMIC_CRC_TABLE */
+
+/* =========================================================================
+ * This function can be used by asm versions of crc32()
+ */
+const z_crc_t FAR * ZEXPORT get_crc_table()
+{
+#ifdef DYNAMIC_CRC_TABLE
+    if (crc_table_empty)
+        make_crc_table();
+#endif /* DYNAMIC_CRC_TABLE */
+    return (const z_crc_t FAR *)crc_table;
+}
+
+/* ========================================================================= */
+#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
+#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
+
+/* ========================================================================= */
+unsigned long ZEXPORT crc32(
+    unsigned long crc,
+    const unsigned char FAR *buf,
+    uInt len)
+{
+    if (buf == Z_NULL) return 0UL;
+
+#ifdef DYNAMIC_CRC_TABLE
+    if (crc_table_empty)
+        make_crc_table();
+#endif /* DYNAMIC_CRC_TABLE */
+
+#ifdef BYFOUR
+    if (sizeof(void *) == sizeof(ptrdiff_t)) {
+        z_crc_t endian;
+
+        endian = 1;
+        if (*((unsigned char *)(&endian)))
+            return crc32_little(crc, buf, len);
+        else
+            return crc32_big(crc, buf, len);
+    }
+#endif /* BYFOUR */
+    crc = crc ^ 0xffffffffUL;
+    while (len >= 8) {
+        DO8;
+        len -= 8;
+    }
+    if (len) do {
+        DO1;
+    } while (--len);
+    return crc ^ 0xffffffffUL;
+}
+
+#ifdef BYFOUR
+
+/* ========================================================================= */
+#define DOLIT4 c ^= *buf4++; \
+        c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
+            crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
+#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
+
+/* ========================================================================= */
+local unsigned long crc32_little(
+    unsigned long crc,
+    const unsigned char FAR *buf,
+    unsigned len)
+{
+    register z_crc_t c;
+    register const z_crc_t FAR *buf4;
+
+    c = (z_crc_t)crc;
+    c = ~c;
+    while (len && ((ptrdiff_t)buf & 3)) {
+        c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
+        len--;
+    }
+
+    buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
+    while (len >= 32) {
+        DOLIT32;
+        len -= 32;
+    }
+    while (len >= 4) {
+        DOLIT4;
+        len -= 4;
+    }
+    buf = (const unsigned char FAR *)buf4;
+
+    if (len) do {
+        c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
+    } while (--len);
+    c = ~c;
+    return (unsigned long)c;
+}
+
+/* ========================================================================= */
+#define DOBIG4 c ^= *++buf4; \
+        c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
+            crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
+#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
+
+/* ========================================================================= */
+local unsigned long crc32_big(
+    unsigned long crc,
+    const unsigned char FAR *buf,
+    unsigned len)
+{
+    register z_crc_t c;
+    register const z_crc_t FAR *buf4;
+
+    c = ZSWAP32((z_crc_t)crc);
+    c = ~c;
+    while (len && ((ptrdiff_t)buf & 3)) {
+        c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
+        len--;
+    }
+
+    buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
+    buf4--;
+    while (len >= 32) {
+        DOBIG32;
+        len -= 32;
+    }
+    while (len >= 4) {
+        DOBIG4;
+        len -= 4;
+    }
+    buf4++;
+    buf = (const unsigned char FAR *)buf4;
+
+    if (len) do {
+        c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
+    } while (--len);
+    c = ~c;
+    return (unsigned long)(ZSWAP32(c));
+}
+
+#endif /* BYFOUR */
+
+#define GF2_DIM 32      /* dimension of GF(2) vectors (length of CRC) */
+
+/* ========================================================================= */
+local unsigned long gf2_matrix_times(
+    unsigned long *mat,
+    unsigned long vec)
+{
+    unsigned long sum;
+
+    sum = 0;
+    while (vec) {
+        if (vec & 1)
+            sum ^= *mat;
+        vec >>= 1;
+        mat++;
+    }
+    return sum;
+}
+
+/* ========================================================================= */
+local void gf2_matrix_square(
+    unsigned long *square,
+    unsigned long *mat)
+{
+    int n;
+
+    for (n = 0; n < GF2_DIM; n++)
+        square[n] = gf2_matrix_times(mat, mat[n]);
+}
+
+/* ========================================================================= */
+local uLong crc32_combine_(
+    uLong crc1,
+    uLong crc2,
+    z_off64_t len2)
+{
+    int n;
+    unsigned long row;
+    unsigned long even[GF2_DIM];    /* even-power-of-two zeros operator */
+    unsigned long odd[GF2_DIM];     /* odd-power-of-two zeros operator */
+
+    /* degenerate case (also disallow negative lengths) */
+    if (len2 <= 0)
+        return crc1;
+
+    /* put operator for one zero bit in odd */
+    odd[0] = 0xedb88320UL;          /* CRC-32 polynomial */
+    row = 1;
+    for (n = 1; n < GF2_DIM; n++) {
+        odd[n] = row;
+        row <<= 1;
+    }
+
+    /* put operator for two zero bits in even */
+    gf2_matrix_square(even, odd);
+
+    /* put operator for four zero bits in odd */
+    gf2_matrix_square(odd, even);
+
+    /* apply len2 zeros to crc1 (first square will put the operator for one
+       zero byte, eight zero bits, in even) */
+    do {
+        /* apply zeros operator for this bit of len2 */
+        gf2_matrix_square(even, odd);
+        if (len2 & 1)
+            crc1 = gf2_matrix_times(even, crc1);
+        len2 >>= 1;
+
+        /* if no more bits set, then done */
+        if (len2 == 0)
+            break;
+
+        /* another iteration of the loop with odd and even swapped */
+        gf2_matrix_square(odd, even);
+        if (len2 & 1)
+            crc1 = gf2_matrix_times(odd, crc1);
+        len2 >>= 1;
+
+        /* if no more bits set, then done */
+    } while (len2 != 0);
+
+    /* return combined crc */
+    crc1 ^= crc2;
+    return crc1;
+}
+
+/* ========================================================================= */
+uLong ZEXPORT crc32_combine(
+    uLong crc1,
+    uLong crc2,
+    z_off_t len2)
+{
+    return crc32_combine_(crc1, crc2, len2);
+}
+
+uLong ZEXPORT crc32_combine64(
+    uLong crc1,
+    uLong crc2,
+    z_off64_t len2)
+{
+    return crc32_combine_(crc1, crc2, len2);
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_deflate.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_deflate.c
new file mode 100644
index 0000000..1afe233
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_deflate.c
@@ -0,0 +1,1966 @@
+/* deflate.c -- compress data using the deflation algorithm
+ * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ *  ALGORITHM
+ *
+ *      The "deflation" process depends on being able to identify portions
+ *      of the input text which are identical to earlier input (within a
+ *      sliding window trailing behind the input currently being processed).
+ *
+ *      The most straightforward technique turns out to be the fastest for
+ *      most input files: try all possible matches and select the longest.
+ *      The key feature of this algorithm is that insertions into the string
+ *      dictionary are very simple and thus fast, and deletions are avoided
+ *      completely. Insertions are performed at each input character, whereas
+ *      string matches are performed only when the previous match ends. So it
+ *      is preferable to spend more time in matches to allow very fast string
+ *      insertions and avoid deletions. The matching algorithm for small
+ *      strings is inspired from that of Rabin & Karp. A brute force approach
+ *      is used to find longer strings when a small match has been found.
+ *      A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
+ *      (by Leonid Broukhis).
+ *         A previous version of this file used a more sophisticated algorithm
+ *      (by Fiala and Greene) which is guaranteed to run in linear amortized
+ *      time, but has a larger average cost, uses more memory and is patented.
+ *      However the F&G algorithm may be faster for some highly redundant
+ *      files if the parameter max_chain_length (described below) is too large.
+ *
+ *  ACKNOWLEDGEMENTS
+ *
+ *      The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
+ *      I found it in 'freeze' written by Leonid Broukhis.
+ *      Thanks to many people for bug reports and testing.
+ *
+ *  REFERENCES
+ *
+ *      Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
+ *      Available in http://tools.ietf.org/html/rfc1951
+ *
+ *      A description of the Rabin and Karp algorithm is given in the book
+ *         "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
+ *
+ *      Fiala,E.R., and Greene,D.H.
+ *         Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
+ *
+ */
+
+/* @(#) $Id$ */
+
+#include "deflate.h"
+
+const char deflate_copyright[] =
+   " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler ";
+/*
+  If you use the zlib library in a product, an acknowledgment is welcome
+  in the documentation of your product. If for some reason you cannot
+  include such an acknowledgment, I would appreciate that you keep this
+  copyright string in the executable of your product.
+ */
+
+/* ===========================================================================
+ *  Function prototypes.
+ */
+typedef enum {
+    need_more,      /* block not completed, need more input or more output */
+    block_done,     /* block flush performed */
+    finish_started, /* finish started, need only more output at next deflate */
+    finish_done     /* finish done, accept no more input or output */
+} block_state;
+
+typedef block_state (*compress_func) OF((deflate_state *s, int flush));
+/* Compression function. Returns the block state after the call. */
+
+local void fill_window    OF((deflate_state *s));
+local block_state deflate_stored OF((deflate_state *s, int flush));
+local block_state deflate_fast   OF((deflate_state *s, int flush));
+#ifndef FASTEST
+local block_state deflate_slow   OF((deflate_state *s, int flush));
+#endif
+local block_state deflate_rle    OF((deflate_state *s, int flush));
+local block_state deflate_huff   OF((deflate_state *s, int flush));
+local void lm_init        OF((deflate_state *s));
+local void putShortMSB    OF((deflate_state *s, uInt b));
+local void flush_pending  OF((z_streamp strm));
+local int read_buf        OF((z_streamp strm, Bytef *buf, unsigned size));
+#ifdef ASMV
+      void match_init OF((void)); /* asm code initialization */
+      uInt longest_match  OF((deflate_state *s, IPos cur_match));
+#else
+local uInt longest_match  OF((deflate_state *s, IPos cur_match));
+#endif
+
+#ifdef DEBUG
+local  void check_match OF((deflate_state *s, IPos start, IPos match,
+                            int length));
+#endif
+
+/* ===========================================================================
+ * Local data
+ */
+
+#define NIL 0
+/* Tail of hash chains */
+
+#ifndef TOO_FAR
+#  define TOO_FAR 4096
+#endif
+/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
+
+/* Values for max_lazy_match, good_match and max_chain_length, depending on
+ * the desired pack level (0..9). The values given below have been tuned to
+ * exclude worst case performance for pathological files. Better values may be
+ * found for specific files.
+ */
+typedef struct config_s {
+   ush good_length; /* reduce lazy search above this match length */
+   ush max_lazy;    /* do not perform lazy search above this match length */
+   ush nice_length; /* quit search above this match length */
+   ush max_chain;
+   compress_func func;
+} config;
+
+#ifdef FASTEST
+local const config configuration_table[2] = {
+/*      good lazy nice chain */
+/* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */
+/* 1 */ {4,    4,  8,    4, deflate_fast}}; /* max speed, no lazy matches */
+#else
+local const config configuration_table[10] = {
+/*      good lazy nice chain */
+/* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */
+/* 1 */ {4,    4,  8,    4, deflate_fast}, /* max speed, no lazy matches */
+/* 2 */ {4,    5, 16,    8, deflate_fast},
+/* 3 */ {4,    6, 32,   32, deflate_fast},
+
+/* 4 */ {4,    4, 16,   16, deflate_slow},  /* lazy matches */
+/* 5 */ {8,   16, 32,   32, deflate_slow},
+/* 6 */ {8,   16, 128, 128, deflate_slow},
+/* 7 */ {8,   32, 128, 256, deflate_slow},
+/* 8 */ {32, 128, 258, 1024, deflate_slow},
+/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */
+#endif
+
+/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
+ * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
+ * meaning.
+ */
+
+#define EQUAL 0
+/* result of memcmp for equal strings */
+
+#ifndef NO_DUMMY_DECL
+struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
+#endif
+
+/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */
+#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0))
+
+/* ===========================================================================
+ * Update a hash value with the given input byte
+ * IN  assertion: all calls to to UPDATE_HASH are made with consecutive
+ *    input characters, so that a running hash key can be computed from the
+ *    previous key instead of complete recalculation each time.
+ */
+#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
+
+
+/* ===========================================================================
+ * Insert string str in the dictionary and set match_head to the previous head
+ * of the hash chain (the most recent string with same hash key). Return
+ * the previous length of the hash chain.
+ * If this file is compiled with -DFASTEST, the compression level is forced
+ * to 1, and no hash chains are maintained.
+ * IN  assertion: all calls to to INSERT_STRING are made with consecutive
+ *    input characters and the first MIN_MATCH bytes of str are valid
+ *    (except for the last MIN_MATCH-1 bytes of the input file).
+ */
+#ifdef FASTEST
+#define INSERT_STRING(s, str, match_head) \
+   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
+    match_head = s->head[s->ins_h], \
+    s->head[s->ins_h] = (Pos)(str))
+#else
+#define INSERT_STRING(s, str, match_head) \
+   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
+    match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
+    s->head[s->ins_h] = (Pos)(str))
+#endif
+
+/* ===========================================================================
+ * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
+ * prev[] will be initialized on the fly.
+ */
+#define CLEAR_HASH(s) \
+    s->head[s->hash_size-1] = NIL; \
+    zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
+
+/* ========================================================================= */
+int ZEXPORT deflateInit_(
+    z_streamp strm,
+    int level,
+    const char *version,
+    int stream_size)
+{
+    return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
+                         Z_DEFAULT_STRATEGY, version, stream_size);
+    /* To do: ignore strm->next_in if we use it as window */
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateInit2_(
+    z_streamp strm,
+    int  level,
+    int  method,
+    int  windowBits,
+    int  memLevel,
+    int  strategy,
+    const char *version,
+    int stream_size)
+{
+    deflate_state *s;
+    int wrap = 1;
+    static const char my_version[] = ZLIB_VERSION;
+
+    ushf *overlay;
+    /* We overlay pending_buf and d_buf+l_buf. This works since the average
+     * output size for (length,distance) codes is <= 24 bits.
+     */
+
+    if (version == Z_NULL || version[0] != my_version[0] ||
+        stream_size != sizeof(z_stream)) {
+        return Z_VERSION_ERROR;
+    }
+    if (strm == Z_NULL) return Z_STREAM_ERROR;
+
+    strm->msg = Z_NULL;
+    if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+        return Z_STREAM_ERROR;
+#else
+        strm->zalloc = zcalloc;
+        strm->opaque = (voidpf)0;
+#endif
+    }
+    if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+        return Z_STREAM_ERROR;
+#else
+        strm->zfree = zcfree;
+#endif
+
+#ifdef FASTEST
+    if (level != 0) level = 1;
+#else
+    if (level == Z_DEFAULT_COMPRESSION) level = 6;
+#endif
+
+    if (windowBits < 0) { /* suppress zlib wrapper */
+        wrap = 0;
+        windowBits = -windowBits;
+    }
+#ifdef GZIP
+    else if (windowBits > 15) {
+        wrap = 2;       /* write gzip wrapper instead */
+        windowBits -= 16;
+    }
+#endif
+    if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
+        windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
+        strategy < 0 || strategy > Z_FIXED) {
+        return Z_STREAM_ERROR;
+    }
+    if (windowBits == 8) windowBits = 9;  /* until 256-byte window bug fixed */
+    s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
+    if (s == Z_NULL) return Z_MEM_ERROR;
+    strm->state = (struct internal_state FAR *)s;
+    s->strm = strm;
+
+    s->wrap = wrap;
+    s->gzhead = Z_NULL;
+    s->w_bits = windowBits;
+    s->w_size = 1 << s->w_bits;
+    s->w_mask = s->w_size - 1;
+
+    s->hash_bits = memLevel + 7;
+    s->hash_size = 1 << s->hash_bits;
+    s->hash_mask = s->hash_size - 1;
+    s->hash_shift =  ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
+
+    s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
+    s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));
+    s->head   = (Posf *)  ZALLOC(strm, s->hash_size, sizeof(Pos));
+
+    s->high_water = 0;      /* nothing written to s->window yet */
+
+    s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
+
+    overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
+    s->pending_buf = (uchf *) overlay;
+    s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
+
+    if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
+        s->pending_buf == Z_NULL) {
+        s->status = FINISH_STATE;
+        strm->msg = ERR_MSG(Z_MEM_ERROR);
+        deflateEnd (strm);
+        return Z_MEM_ERROR;
+    }
+    s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
+    s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
+
+    s->level = level;
+    s->strategy = strategy;
+    s->method = (Byte)method;
+
+    return deflateReset(strm);
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateSetDictionary (
+    z_streamp strm,
+    const Bytef *dictionary,
+    uInt  dictLength)
+{
+    deflate_state *s;
+    uInt str, n;
+    int wrap;
+    unsigned avail;
+    z_const unsigned char *next;
+
+    if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL)
+        return Z_STREAM_ERROR;
+    s = strm->state;
+    wrap = s->wrap;
+    if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead)
+        return Z_STREAM_ERROR;
+
+    /* when using zlib wrappers, compute Adler-32 for provided dictionary */
+    if (wrap == 1)
+        strm->adler = adler32(strm->adler, dictionary, dictLength);
+    s->wrap = 0;                    /* avoid computing Adler-32 in read_buf */
+
+    /* if dictionary would fill window, just replace the history */
+    if (dictLength >= s->w_size) {
+        if (wrap == 0) {            /* already empty otherwise */
+            CLEAR_HASH(s);
+            s->strstart = 0;
+            s->block_start = 0L;
+            s->insert = 0;
+        }
+        dictionary += dictLength - s->w_size;  /* use the tail */
+        dictLength = s->w_size;
+    }
+
+    /* insert dictionary into window and hash */
+    avail = strm->avail_in;
+    next = strm->next_in;
+    strm->avail_in = dictLength;
+    strm->next_in = (z_const Bytef *)dictionary;
+    fill_window(s);
+    while (s->lookahead >= MIN_MATCH) {
+        str = s->strstart;
+        n = s->lookahead - (MIN_MATCH-1);
+        do {
+            UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
+#ifndef FASTEST
+            s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+            s->head[s->ins_h] = (Pos)str;
+            str++;
+        } while (--n);
+        s->strstart = str;
+        s->lookahead = MIN_MATCH-1;
+        fill_window(s);
+    }
+    s->strstart += s->lookahead;
+    s->block_start = (long)s->strstart;
+    s->insert = s->lookahead;
+    s->lookahead = 0;
+    s->match_length = s->prev_length = MIN_MATCH-1;
+    s->match_available = 0;
+    strm->next_in = next;
+    strm->avail_in = avail;
+    s->wrap = wrap;
+    return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateResetKeep (
+    z_streamp strm)
+{
+    deflate_state *s;
+
+    if (strm == Z_NULL || strm->state == Z_NULL ||
+        strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {
+        return Z_STREAM_ERROR;
+    }
+
+    strm->total_in = strm->total_out = 0;
+    strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
+    strm->data_type = Z_UNKNOWN;
+
+    s = (deflate_state *)strm->state;
+    s->pending = 0;
+    s->pending_out = s->pending_buf;
+
+    if (s->wrap < 0) {
+        s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */
+    }
+    s->status = s->wrap ? INIT_STATE : BUSY_STATE;
+    strm->adler =
+#ifdef GZIP
+        s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
+#endif
+        adler32(0L, Z_NULL, 0);
+    s->last_flush = Z_NO_FLUSH;
+
+    _tr_init(s);
+
+    return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateReset (
+    z_streamp strm)
+{
+    int ret;
+
+    ret = deflateResetKeep(strm);
+    if (ret == Z_OK)
+        lm_init(strm->state);
+    return ret;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateSetHeader (strm, head)
+    z_streamp strm;
+    gz_headerp head;
+{
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    if (strm->state->wrap != 2) return Z_STREAM_ERROR;
+    strm->state->gzhead = head;
+    return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflatePending (
+	z_streamp strm,
+    unsigned *pending,
+    int *bits)
+{
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    if (pending != Z_NULL)
+        *pending = strm->state->pending;
+    if (bits != Z_NULL)
+        *bits = strm->state->bi_valid;
+    return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflatePrime (strm, bits, value)
+    z_streamp strm;
+    int bits;
+    int value;
+{
+    deflate_state *s;
+    int put;
+
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    s = strm->state;
+    if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3))
+        return Z_BUF_ERROR;
+    do {
+        put = Buf_size - s->bi_valid;
+        if (put > bits)
+            put = bits;
+        s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid);
+        s->bi_valid += put;
+        _tr_flush_bits(s);
+        value >>= put;
+        bits -= put;
+    } while (bits);
+    return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateParams(
+    z_streamp strm,
+    int level,
+    int strategy)
+{
+    deflate_state *s;
+    compress_func func;
+    int err = Z_OK;
+
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    s = strm->state;
+
+#ifdef FASTEST
+    if (level != 0) level = 1;
+#else
+    if (level == Z_DEFAULT_COMPRESSION) level = 6;
+#endif
+    if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {
+        return Z_STREAM_ERROR;
+    }
+    func = configuration_table[s->level].func;
+
+    if ((strategy != s->strategy || func != configuration_table[level].func) &&
+        strm->total_in != 0) {
+        /* Flush the last buffer: */
+        err = deflate(strm, Z_BLOCK);
+        if (err == Z_BUF_ERROR && s->pending == 0)
+            err = Z_OK;
+    }
+    if (s->level != level) {
+        s->level = level;
+        s->max_lazy_match   = configuration_table[level].max_lazy;
+        s->good_match       = configuration_table[level].good_length;
+        s->nice_match       = configuration_table[level].nice_length;
+        s->max_chain_length = configuration_table[level].max_chain;
+    }
+    s->strategy = strategy;
+    return err;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateTune(
+    z_streamp strm,
+    int good_length,
+    int max_lazy,
+    int nice_length,
+    int max_chain)
+{
+    deflate_state *s;
+
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    s = strm->state;
+    s->good_match = good_length;
+    s->max_lazy_match = max_lazy;
+    s->nice_match = nice_length;
+    s->max_chain_length = max_chain;
+    return Z_OK;
+}
+
+/* =========================================================================
+ * For the default windowBits of 15 and memLevel of 8, this function returns
+ * a close to exact, as well as small, upper bound on the compressed size.
+ * They are coded as constants here for a reason--if the #define's are
+ * changed, then this function needs to be changed as well.  The return
+ * value for 15 and 8 only works for those exact settings.
+ *
+ * For any setting other than those defaults for windowBits and memLevel,
+ * the value returned is a conservative worst case for the maximum expansion
+ * resulting from using fixed blocks instead of stored blocks, which deflate
+ * can emit on compressed data for some combinations of the parameters.
+ *
+ * This function could be more sophisticated to provide closer upper bounds for
+ * every combination of windowBits and memLevel.  But even the conservative
+ * upper bound of about 14% expansion does not seem onerous for output buffer
+ * allocation.
+ */
+uLong ZEXPORT deflateBound(
+    z_streamp strm,
+    uLong sourceLen)
+{
+    deflate_state *s;
+    uLong complen, wraplen;
+    Bytef *str;
+
+    /* conservative upper bound for compressed data */
+    complen = sourceLen +
+              ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
+
+    /* if can't get parameters, return conservative bound plus zlib wrapper */
+    if (strm == Z_NULL || strm->state == Z_NULL)
+        return complen + 6;
+
+    /* compute wrapper length */
+    s = strm->state;
+    switch (s->wrap) {
+    case 0:                                 /* raw deflate */
+        wraplen = 0;
+        break;
+    case 1:                                 /* zlib wrapper */
+        wraplen = 6 + (s->strstart ? 4 : 0);
+        break;
+    case 2:                                 /* gzip wrapper */
+        wraplen = 18;
+        if (s->gzhead != Z_NULL) {          /* user-supplied gzip header */
+            if (s->gzhead->extra != Z_NULL)
+                wraplen += 2 + s->gzhead->extra_len;
+            str = s->gzhead->name;
+            if (str != Z_NULL)
+                do {
+                    wraplen++;
+                } while (*str++);
+            str = s->gzhead->comment;
+            if (str != Z_NULL)
+                do {
+                    wraplen++;
+                } while (*str++);
+            if (s->gzhead->hcrc)
+                wraplen += 2;
+        }
+        break;
+    default:                                /* for compiler happiness */
+        wraplen = 6;
+    }
+
+    /* if not default parameters, return conservative bound */
+    if (s->w_bits != 15 || s->hash_bits != 8 + 7)
+        return complen + wraplen;
+
+    /* default settings: return tight bound for that case */
+    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
+           (sourceLen >> 25) + 13 - 6 + wraplen;
+}
+
+/* =========================================================================
+ * Put a short in the pending buffer. The 16-bit value is put in MSB order.
+ * IN assertion: the stream state is correct and there is enough room in
+ * pending_buf.
+ */
+local void putShortMSB (
+    deflate_state *s,
+    uInt b)
+{
+    put_byte(s, (Byte)(b >> 8));
+    put_byte(s, (Byte)(b & 0xff));
+}
+
+/* =========================================================================
+ * Flush as much pending output as possible. All deflate() output goes
+ * through this function so some applications may wish to modify it
+ * to avoid allocating a large strm->next_out buffer and copying into it.
+ * (See also read_buf()).
+ */
+local void flush_pending(
+    z_streamp strm)
+{
+    unsigned len;
+    deflate_state *s = strm->state;
+
+    _tr_flush_bits(s);
+    len = s->pending;
+    if (len > strm->avail_out) len = strm->avail_out;
+    if (len == 0) return;
+
+    zmemcpy(strm->next_out, s->pending_out, len);
+    strm->next_out  += len;
+    s->pending_out  += len;
+    strm->total_out += len;
+    strm->avail_out  -= len;
+    s->pending -= len;
+    if (s->pending == 0) {
+        s->pending_out = s->pending_buf;
+    }
+}
+
+/* ========================================================================= */
+int ZEXPORT deflate (
+    z_streamp strm,
+    int flush)
+{
+    int old_flush; /* value of flush param for previous deflate call */
+    deflate_state *s;
+
+    if (strm == Z_NULL || strm->state == Z_NULL ||
+        flush > Z_BLOCK || flush < 0) {
+        return Z_STREAM_ERROR;
+    }
+    s = strm->state;
+
+    if (strm->next_out == Z_NULL ||
+        (strm->next_in == Z_NULL && strm->avail_in != 0) ||
+        (s->status == FINISH_STATE && flush != Z_FINISH)) {
+        ERR_RETURN(strm, Z_STREAM_ERROR);
+    }
+    if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
+
+    s->strm = strm; /* just in case */
+    old_flush = s->last_flush;
+    s->last_flush = flush;
+
+    /* Write the header */
+    if (s->status == INIT_STATE) {
+#ifdef GZIP
+        if (s->wrap == 2) {
+            strm->adler = crc32(0L, Z_NULL, 0);
+            put_byte(s, 31);
+            put_byte(s, 139);
+            put_byte(s, 8);
+            if (s->gzhead == Z_NULL) {
+                put_byte(s, 0);
+                put_byte(s, 0);
+                put_byte(s, 0);
+                put_byte(s, 0);
+                put_byte(s, 0);
+                put_byte(s, s->level == 9 ? 2 :
+                            (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
+                             4 : 0));
+                put_byte(s, OS_CODE);
+                s->status = BUSY_STATE;
+            }
+            else {
+                put_byte(s, (s->gzhead->text ? 1 : 0) +
+                            (s->gzhead->hcrc ? 2 : 0) +
+                            (s->gzhead->extra == Z_NULL ? 0 : 4) +
+                            (s->gzhead->name == Z_NULL ? 0 : 8) +
+                            (s->gzhead->comment == Z_NULL ? 0 : 16)
+                        );
+                put_byte(s, (Byte)(s->gzhead->time & 0xff));
+                put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));
+                put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));
+                put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));
+                put_byte(s, s->level == 9 ? 2 :
+                            (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
+                             4 : 0));
+                put_byte(s, s->gzhead->os & 0xff);
+                if (s->gzhead->extra != Z_NULL) {
+                    put_byte(s, s->gzhead->extra_len & 0xff);
+                    put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);
+                }
+                if (s->gzhead->hcrc)
+                    strm->adler = crc32(strm->adler, s->pending_buf,
+                                        s->pending);
+                s->gzindex = 0;
+                s->status = EXTRA_STATE;
+            }
+        }
+        else
+#endif
+        {
+            uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
+            uInt level_flags;
+
+            if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
+                level_flags = 0;
+            else if (s->level < 6)
+                level_flags = 1;
+            else if (s->level == 6)
+                level_flags = 2;
+            else
+                level_flags = 3;
+            header |= (level_flags << 6);
+            if (s->strstart != 0) header |= PRESET_DICT;
+            header += 31 - (header % 31);
+
+            s->status = BUSY_STATE;
+            putShortMSB(s, header);
+
+            /* Save the adler32 of the preset dictionary: */
+            if (s->strstart != 0) {
+                putShortMSB(s, (uInt)(strm->adler >> 16));
+                putShortMSB(s, (uInt)(strm->adler & 0xffff));
+            }
+            strm->adler = adler32(0L, Z_NULL, 0);
+        }
+    }
+#ifdef GZIP
+    if (s->status == EXTRA_STATE) {
+        if (s->gzhead->extra != Z_NULL) {
+            uInt beg = s->pending;  /* start of bytes to update crc */
+
+            while (s->gzindex < (s->gzhead->extra_len & 0xffff)) {
+                if (s->pending == s->pending_buf_size) {
+                    if (s->gzhead->hcrc && s->pending > beg)
+                        strm->adler = crc32(strm->adler, s->pending_buf + beg,
+                                            s->pending - beg);
+                    flush_pending(strm);
+                    beg = s->pending;
+                    if (s->pending == s->pending_buf_size)
+                        break;
+                }
+                put_byte(s, s->gzhead->extra[s->gzindex]);
+                s->gzindex++;
+            }
+            if (s->gzhead->hcrc && s->pending > beg)
+                strm->adler = crc32(strm->adler, s->pending_buf + beg,
+                                    s->pending - beg);
+            if (s->gzindex == s->gzhead->extra_len) {
+                s->gzindex = 0;
+                s->status = NAME_STATE;
+            }
+        }
+        else
+            s->status = NAME_STATE;
+    }
+    if (s->status == NAME_STATE) {
+        if (s->gzhead->name != Z_NULL) {
+            uInt beg = s->pending;  /* start of bytes to update crc */
+            int val;
+
+            do {
+                if (s->pending == s->pending_buf_size) {
+                    if (s->gzhead->hcrc && s->pending > beg)
+                        strm->adler = crc32(strm->adler, s->pending_buf + beg,
+                                            s->pending - beg);
+                    flush_pending(strm);
+                    beg = s->pending;
+                    if (s->pending == s->pending_buf_size) {
+                        val = 1;
+                        break;
+                    }
+                }
+                val = s->gzhead->name[s->gzindex++];
+                put_byte(s, val);
+            } while (val != 0);
+            if (s->gzhead->hcrc && s->pending > beg)
+                strm->adler = crc32(strm->adler, s->pending_buf + beg,
+                                    s->pending - beg);
+            if (val == 0) {
+                s->gzindex = 0;
+                s->status = COMMENT_STATE;
+            }
+        }
+        else
+            s->status = COMMENT_STATE;
+    }
+    if (s->status == COMMENT_STATE) {
+        if (s->gzhead->comment != Z_NULL) {
+            uInt beg = s->pending;  /* start of bytes to update crc */
+            int val;
+
+            do {
+                if (s->pending == s->pending_buf_size) {
+                    if (s->gzhead->hcrc && s->pending > beg)
+                        strm->adler = crc32(strm->adler, s->pending_buf + beg,
+                                            s->pending - beg);
+                    flush_pending(strm);
+                    beg = s->pending;
+                    if (s->pending == s->pending_buf_size) {
+                        val = 1;
+                        break;
+                    }
+                }
+                val = s->gzhead->comment[s->gzindex++];
+                put_byte(s, val);
+            } while (val != 0);
+            if (s->gzhead->hcrc && s->pending > beg)
+                strm->adler = crc32(strm->adler, s->pending_buf + beg,
+                                    s->pending - beg);
+            if (val == 0)
+                s->status = HCRC_STATE;
+        }
+        else
+            s->status = HCRC_STATE;
+    }
+    if (s->status == HCRC_STATE) {
+        if (s->gzhead->hcrc) {
+            if (s->pending + 2 > s->pending_buf_size)
+                flush_pending(strm);
+            if (s->pending + 2 <= s->pending_buf_size) {
+                put_byte(s, (Byte)(strm->adler & 0xff));
+                put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
+                strm->adler = crc32(0L, Z_NULL, 0);
+                s->status = BUSY_STATE;
+            }
+        }
+        else
+            s->status = BUSY_STATE;
+    }
+#endif
+
+    /* Flush as much pending output as possible */
+    if (s->pending != 0) {
+        flush_pending(strm);
+        if (strm->avail_out == 0) {
+            /* Since avail_out is 0, deflate will be called again with
+             * more output space, but possibly with both pending and
+             * avail_in equal to zero. There won't be anything to do,
+             * but this is not an error situation so make sure we
+             * return OK instead of BUF_ERROR at next call of deflate:
+             */
+            s->last_flush = -1;
+            return Z_OK;
+        }
+
+    /* Make sure there is something to do and avoid duplicate consecutive
+     * flushes. For repeated and useless calls with Z_FINISH, we keep
+     * returning Z_STREAM_END instead of Z_BUF_ERROR.
+     */
+    } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&
+               flush != Z_FINISH) {
+        ERR_RETURN(strm, Z_BUF_ERROR);
+    }
+
+    /* User must not provide more input after the first FINISH: */
+    if (s->status == FINISH_STATE && strm->avail_in != 0) {
+        ERR_RETURN(strm, Z_BUF_ERROR);
+    }
+
+    /* Start a new block or continue the current one.
+     */
+    if (strm->avail_in != 0 || s->lookahead != 0 ||
+        (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
+        block_state bstate;
+
+        bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
+                    (s->strategy == Z_RLE ? deflate_rle(s, flush) :
+                        (*(configuration_table[s->level].func))(s, flush));
+
+        if (bstate == finish_started || bstate == finish_done) {
+            s->status = FINISH_STATE;
+        }
+        if (bstate == need_more || bstate == finish_started) {
+            if (strm->avail_out == 0) {
+                s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
+            }
+            return Z_OK;
+            /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
+             * of deflate should use the same flush parameter to make sure
+             * that the flush is complete. So we don't have to output an
+             * empty block here, this will be done at next call. This also
+             * ensures that for a very small output buffer, we emit at most
+             * one empty block.
+             */
+        }
+        if (bstate == block_done) {
+            if (flush == Z_PARTIAL_FLUSH) {
+                _tr_align(s);
+            } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
+                _tr_stored_block(s, (char*)0, 0L, 0);
+                /* For a full flush, this empty block will be recognized
+                 * as a special marker by inflate_sync().
+                 */
+                if (flush == Z_FULL_FLUSH) {
+                    CLEAR_HASH(s);             /* forget history */
+                    if (s->lookahead == 0) {
+                        s->strstart = 0;
+                        s->block_start = 0L;
+                        s->insert = 0;
+                    }
+                }
+            }
+            flush_pending(strm);
+            if (strm->avail_out == 0) {
+              s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
+              return Z_OK;
+            }
+        }
+    }
+    Assert(strm->avail_out > 0, "bug2");
+
+    if (flush != Z_FINISH) return Z_OK;
+    if (s->wrap <= 0) return Z_STREAM_END;
+
+    /* Write the trailer */
+#ifdef GZIP
+    if (s->wrap == 2) {
+        put_byte(s, (Byte)(strm->adler & 0xff));
+        put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
+        put_byte(s, (Byte)((strm->adler >> 16) & 0xff));
+        put_byte(s, (Byte)((strm->adler >> 24) & 0xff));
+        put_byte(s, (Byte)(strm->total_in & 0xff));
+        put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));
+        put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));
+        put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));
+    }
+    else
+#endif
+    {
+        putShortMSB(s, (uInt)(strm->adler >> 16));
+        putShortMSB(s, (uInt)(strm->adler & 0xffff));
+    }
+    flush_pending(strm);
+    /* If avail_out is zero, the application will call deflate again
+     * to flush the rest.
+     */
+    if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */
+    return s->pending != 0 ? Z_OK : Z_STREAM_END;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateEnd (
+    z_streamp strm)
+{
+    int status;
+
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+
+    status = strm->state->status;
+    if (status != INIT_STATE &&
+        status != EXTRA_STATE &&
+        status != NAME_STATE &&
+        status != COMMENT_STATE &&
+        status != HCRC_STATE &&
+        status != BUSY_STATE &&
+        status != FINISH_STATE) {
+      return Z_STREAM_ERROR;
+    }
+
+    /* Deallocate in reverse order of allocations: */
+    TRY_FREE(strm, strm->state->pending_buf);
+    TRY_FREE(strm, strm->state->head);
+    TRY_FREE(strm, strm->state->prev);
+    TRY_FREE(strm, strm->state->window);
+
+    ZFREE(strm, strm->state);
+    strm->state = Z_NULL;
+
+    return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
+}
+
+/* =========================================================================
+ * Copy the source state to the destination state.
+ * To simplify the source, this is not supported for 16-bit MSDOS (which
+ * doesn't have enough memory anyway to duplicate compression states).
+ */
+int ZEXPORT deflateCopy (
+    z_streamp dest,
+    z_streamp source)
+{
+#ifdef MAXSEG_64K
+    return Z_STREAM_ERROR;
+#else
+    deflate_state *ds;
+    deflate_state *ss;
+    ushf *overlay;
+
+
+    if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
+        return Z_STREAM_ERROR;
+    }
+
+    ss = source->state;
+
+    zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
+
+    ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
+    if (ds == Z_NULL) return Z_MEM_ERROR;
+    dest->state = (struct internal_state FAR *) ds;
+    zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));
+    ds->strm = dest;
+
+    ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
+    ds->prev   = (Posf *)  ZALLOC(dest, ds->w_size, sizeof(Pos));
+    ds->head   = (Posf *)  ZALLOC(dest, ds->hash_size, sizeof(Pos));
+    overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
+    ds->pending_buf = (uchf *) overlay;
+
+    if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
+        ds->pending_buf == Z_NULL) {
+        deflateEnd (dest);
+        return Z_MEM_ERROR;
+    }
+    /* following zmemcpy do not work for 16-bit MSDOS */
+    zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
+    zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
+    zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
+    zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
+
+    ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
+    ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
+    ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
+
+    ds->l_desc.dyn_tree = ds->dyn_ltree;
+    ds->d_desc.dyn_tree = ds->dyn_dtree;
+    ds->bl_desc.dyn_tree = ds->bl_tree;
+
+    return Z_OK;
+#endif /* MAXSEG_64K */
+}
+
+/* ===========================================================================
+ * Read a new buffer from the current input stream, update the adler32
+ * and total number of bytes read.  All deflate() input goes through
+ * this function so some applications may wish to modify it to avoid
+ * allocating a large strm->next_in buffer and copying from it.
+ * (See also flush_pending()).
+ */
+local int read_buf(
+    z_streamp strm,
+    Bytef *buf,
+    unsigned size)
+{
+    unsigned len = strm->avail_in;
+
+    if (len > size) len = size;
+    if (len == 0) return 0;
+
+    strm->avail_in  -= len;
+
+    zmemcpy(buf, strm->next_in, len);
+    if (strm->state->wrap == 1) {
+        strm->adler = adler32(strm->adler, buf, len);
+    }
+#ifdef GZIP
+    else if (strm->state->wrap == 2) {
+        strm->adler = crc32(strm->adler, buf, len);
+    }
+#endif
+    strm->next_in  += len;
+    strm->total_in += len;
+
+    return (int)len;
+}
+
+/* ===========================================================================
+ * Initialize the "longest match" routines for a new zlib stream
+ */
+local void lm_init (
+    deflate_state *s)
+{
+    s->window_size = (ulg)2L*s->w_size;
+
+    CLEAR_HASH(s);
+
+    /* Set the default configuration parameters:
+     */
+    s->max_lazy_match   = configuration_table[s->level].max_lazy;
+    s->good_match       = configuration_table[s->level].good_length;
+    s->nice_match       = configuration_table[s->level].nice_length;
+    s->max_chain_length = configuration_table[s->level].max_chain;
+
+    s->strstart = 0;
+    s->block_start = 0L;
+    s->lookahead = 0;
+    s->insert = 0;
+    s->match_length = s->prev_length = MIN_MATCH-1;
+    s->match_available = 0;
+    s->ins_h = 0;
+#ifndef FASTEST
+#ifdef ASMV
+    match_init(); /* initialize the asm code */
+#endif
+#endif
+}
+
+#ifndef FASTEST
+/* ===========================================================================
+ * Set match_start to the longest match starting at the given string and
+ * return its length. Matches shorter or equal to prev_length are discarded,
+ * in which case the result is equal to prev_length and match_start is
+ * garbage.
+ * IN assertions: cur_match is the head of the hash chain for the current
+ *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
+ * OUT assertion: the match length is not greater than s->lookahead.
+ */
+#ifndef ASMV
+/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
+ * match.S. The code will be functionally equivalent.
+ */
+local uInt longest_match(
+    deflate_state *s,
+    IPos cur_match)                             /* current match */
+{
+    unsigned chain_length = s->max_chain_length;/* max hash chain length */
+    register Bytef *scan = s->window + s->strstart; /* current string */
+    register Bytef *match;                       /* matched string */
+    register int len;                           /* length of current match */
+    int best_len = s->prev_length;              /* best match length so far */
+    int nice_match = s->nice_match;             /* stop if match long enough */
+    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+        s->strstart - (IPos)MAX_DIST(s) : NIL;
+    /* Stop when cur_match becomes <= limit. To simplify the code,
+     * we prevent matches with the string of window index 0.
+     */
+    Posf *prev = s->prev;
+    uInt wmask = s->w_mask;
+
+#ifdef UNALIGNED_OK
+    /* Compare two bytes at a time. Note: this is not always beneficial.
+     * Try with and without -DUNALIGNED_OK to check.
+     */
+    register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
+    register ush scan_start = *(ushf*)scan;
+    register ush scan_end   = *(ushf*)(scan+best_len-1);
+#else
+    register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+    register Byte scan_end1  = scan[best_len-1];
+    register Byte scan_end   = scan[best_len];
+#endif
+
+    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+     * It is easy to get rid of this optimization if necessary.
+     */
+    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+    /* Do not waste too much time if we already have a good match: */
+    if (s->prev_length >= s->good_match) {
+        chain_length >>= 2;
+    }
+    /* Do not look for matches beyond the end of the input. This is necessary
+     * to make deflate deterministic.
+     */
+    if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
+
+    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+    do {
+        Assert(cur_match < s->strstart, "no future");
+        match = s->window + cur_match;
+
+        /* Skip to next match if the match length cannot increase
+         * or if the match length is less than 2.  Note that the checks below
+         * for insufficient lookahead only occur occasionally for performance
+         * reasons.  Therefore uninitialized memory will be accessed, and
+         * conditional jumps will be made that depend on those values.
+         * However the length of the match is limited to the lookahead, so
+         * the output of deflate is not affected by the uninitialized values.
+         */
+#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
+        /* This code assumes sizeof(unsigned short) == 2. Do not use
+         * UNALIGNED_OK if your compiler uses a different size.
+         */
+        if (*(ushf*)(match+best_len-1) != scan_end ||
+            *(ushf*)match != scan_start) continue;
+
+        /* It is not necessary to compare scan[2] and match[2] since they are
+         * always equal when the other bytes match, given that the hash keys
+         * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
+         * strstart+3, +5, ... up to strstart+257. We check for insufficient
+         * lookahead only every 4th comparison; the 128th check will be made
+         * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
+         * necessary to put more guard bytes at the end of the window, or
+         * to check more often for insufficient lookahead.
+         */
+        Assert(scan[2] == match[2], "scan[2]?");
+        scan++, match++;
+        do {
+        } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+                 scan < strend);
+        /* The funny "do {}" generates better code on most compilers */
+
+        /* Here, scan <= window+strstart+257 */
+        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+        if (*scan == *match) scan++;
+
+        len = (MAX_MATCH - 1) - (int)(strend-scan);
+        scan = strend - (MAX_MATCH-1);
+
+#else /* UNALIGNED_OK */
+
+        if (match[best_len]   != scan_end  ||
+            match[best_len-1] != scan_end1 ||
+            *match            != *scan     ||
+            *++match          != scan[1])      continue;
+
+        /* The check at best_len-1 can be removed because it will be made
+         * again later. (This heuristic is not always a win.)
+         * It is not necessary to compare scan[2] and match[2] since they
+         * are always equal when the other bytes match, given that
+         * the hash keys are equal and that HASH_BITS >= 8.
+         */
+        scan += 2, match++;
+        Assert(*scan == *match, "match[2]?");
+
+        /* We check for insufficient lookahead only every 8th comparison;
+         * the 256th check will be made at strstart+258.
+         */
+        do {
+        } while (*++scan == *++match && *++scan == *++match &&
+                 *++scan == *++match && *++scan == *++match &&
+                 *++scan == *++match && *++scan == *++match &&
+                 *++scan == *++match && *++scan == *++match &&
+                 scan < strend);
+
+        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+        len = MAX_MATCH - (int)(strend - scan);
+        scan = strend - MAX_MATCH;
+
+#endif /* UNALIGNED_OK */
+
+        if (len > best_len) {
+            s->match_start = cur_match;
+            best_len = len;
+            if (len >= nice_match) break;
+#ifdef UNALIGNED_OK
+            scan_end = *(ushf*)(scan+best_len-1);
+#else
+            scan_end1  = scan[best_len-1];
+            scan_end   = scan[best_len];
+#endif
+        }
+    } while ((cur_match = prev[cur_match & wmask]) > limit
+             && --chain_length != 0);
+
+    if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
+    return s->lookahead;
+}
+#endif /* ASMV */
+
+#else /* FASTEST */
+
+/* ---------------------------------------------------------------------------
+ * Optimized version for FASTEST only
+ */
+local uInt longest_match(
+    deflate_state *s,
+    IPos cur_match)                             /* current match */
+{
+    register Bytef *scan = s->window + s->strstart; /* current string */
+    register Bytef *match;                       /* matched string */
+    register int len;                           /* length of current match */
+    register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+
+    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+     * It is easy to get rid of this optimization if necessary.
+     */
+    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+    Assert(cur_match < s->strstart, "no future");
+
+    match = s->window + cur_match;
+
+    /* Return failure if the match length is less than 2:
+     */
+    if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
+
+    /* The check at best_len-1 can be removed because it will be made
+     * again later. (This heuristic is not always a win.)
+     * It is not necessary to compare scan[2] and match[2] since they
+     * are always equal when the other bytes match, given that
+     * the hash keys are equal and that HASH_BITS >= 8.
+     */
+    scan += 2, match += 2;
+    Assert(*scan == *match, "match[2]?");
+
+    /* We check for insufficient lookahead only every 8th comparison;
+     * the 256th check will be made at strstart+258.
+     */
+    do {
+    } while (*++scan == *++match && *++scan == *++match &&
+             *++scan == *++match && *++scan == *++match &&
+             *++scan == *++match && *++scan == *++match &&
+             *++scan == *++match && *++scan == *++match &&
+             scan < strend);
+
+    Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+    len = MAX_MATCH - (int)(strend - scan);
+
+    if (len < MIN_MATCH) return MIN_MATCH - 1;
+
+    s->match_start = cur_match;
+    return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;
+}
+
+#endif /* FASTEST */
+
+#ifdef DEBUG
+/* ===========================================================================
+ * Check that the match at match_start is indeed a match.
+ */
+local void check_match(
+    deflate_state *s,
+    IPos start, IPos match,
+    int length)
+{
+    /* check that the match is indeed a match */
+    if (zmemcmp(s->window + match,
+                s->window + start, length) != EQUAL) {
+        fprintf(stderr, " start %u, match %u, length %d\n",
+                start, match, length);
+        do {
+            fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
+        } while (--length != 0);
+        z_error("invalid match");
+    }
+    if (z_verbose > 1) {
+        fprintf(stderr,"\\[%d,%d]", start-match, length);
+        do { putc(s->window[start++], stderr); } while (--length != 0);
+    }
+}
+#else
+#  define check_match(s, start, match, length)
+#endif /* DEBUG */
+
+/* ===========================================================================
+ * Fill the window when the lookahead becomes insufficient.
+ * Updates strstart and lookahead.
+ *
+ * IN assertion: lookahead < MIN_LOOKAHEAD
+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
+ *    At least one byte has been read, or avail_in == 0; reads are
+ *    performed for at least two bytes (required for the zip translate_eol
+ *    option -- not supported here).
+ */
+local void fill_window(
+    deflate_state *s)
+{
+    register unsigned n, m;
+    register Posf *p;
+    unsigned more;    /* Amount of free space at the end of the window. */
+    uInt wsize = s->w_size;
+
+    Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
+
+    do {
+        more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
+
+        /* Deal with !@#$% 64K limit: */
+        if (sizeof(int) <= 2) {
+            if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
+                more = wsize;
+
+            } else if (more == (unsigned)(-1)) {
+                /* Very unlikely, but possible on 16 bit machine if
+                 * strstart == 0 && lookahead == 1 (input done a byte at time)
+                 */
+                more--;
+            }
+        }
+
+        /* If the window is almost full and there is insufficient lookahead,
+         * move the upper half to the lower one to make room in the upper half.
+         */
+        if (s->strstart >= wsize+MAX_DIST(s)) {
+
+            zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
+            s->match_start -= wsize;
+            s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */
+            s->block_start -= (long) wsize;
+
+            /* Slide the hash table (could be avoided with 32 bit values
+               at the expense of memory usage). We slide even when level == 0
+               to keep the hash table consistent if we switch back to level > 0
+               later. (Using level 0 permanently is not an optimal usage of
+               zlib, so we don't care about this pathological case.)
+             */
+            n = s->hash_size;
+            p = &s->head[n];
+            do {
+                m = *--p;
+                *p = (Pos)(m >= wsize ? m-wsize : NIL);
+            } while (--n);
+
+            n = wsize;
+#ifndef FASTEST
+            p = &s->prev[n];
+            do {
+                m = *--p;
+                *p = (Pos)(m >= wsize ? m-wsize : NIL);
+                /* If n is not on any hash chain, prev[n] is garbage but
+                 * its value will never be used.
+                 */
+            } while (--n);
+#endif
+            more += wsize;
+        }
+        if (s->strm->avail_in == 0) break;
+
+        /* If there was no sliding:
+         *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
+         *    more == window_size - lookahead - strstart
+         * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
+         * => more >= window_size - 2*WSIZE + 2
+         * In the BIG_MEM or MMAP case (not yet supported),
+         *   window_size == input_size + MIN_LOOKAHEAD  &&
+         *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
+         * Otherwise, window_size == 2*WSIZE so more >= 2.
+         * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
+         */
+        Assert(more >= 2, "more < 2");
+
+        n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
+        s->lookahead += n;
+
+        /* Initialize the hash value now that we have some input: */
+        if (s->lookahead + s->insert >= MIN_MATCH) {
+            uInt str = s->strstart - s->insert;
+            s->ins_h = s->window[str];
+            UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
+#if MIN_MATCH != 3
+            Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+            while (s->insert) {
+                UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
+#ifndef FASTEST
+                s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+                s->head[s->ins_h] = (Pos)str;
+                str++;
+                s->insert--;
+                if (s->lookahead + s->insert < MIN_MATCH)
+                    break;
+            }
+        }
+        /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
+         * but this is not important since only literal bytes will be emitted.
+         */
+
+    } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
+
+    /* If the WIN_INIT bytes after the end of the current data have never been
+     * written, then zero those bytes in order to avoid memory check reports of
+     * the use of uninitialized (or uninitialised as Julian writes) bytes by
+     * the longest match routines.  Update the high water mark for the next
+     * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
+     * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
+     */
+    if (s->high_water < s->window_size) {
+        ulg curr = s->strstart + (ulg)(s->lookahead);
+        ulg init;
+
+        if (s->high_water < curr) {
+            /* Previous high water mark below current data -- zero WIN_INIT
+             * bytes or up to end of window, whichever is less.
+             */
+            init = s->window_size - curr;
+            if (init > WIN_INIT)
+                init = WIN_INIT;
+            zmemzero(s->window + curr, (unsigned)init);
+            s->high_water = curr + init;
+        }
+        else if (s->high_water < (ulg)curr + WIN_INIT) {
+            /* High water mark at or above current data, but below current data
+             * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
+             * to end of window, whichever is less.
+             */
+            init = (ulg)curr + WIN_INIT - s->high_water;
+            if (init > s->window_size - s->high_water)
+                init = s->window_size - s->high_water;
+            zmemzero(s->window + s->high_water, (unsigned)init);
+            s->high_water += init;
+        }
+    }
+
+    Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+           "not enough room for search");
+}
+
+/* ===========================================================================
+ * Flush the current block, with given end-of-file flag.
+ * IN assertion: strstart is set to the end of the current match.
+ */
+#define FLUSH_BLOCK_ONLY(s, last) { \
+   _tr_flush_block(s, (s->block_start >= 0L ? \
+                   (charf *)&s->window[(unsigned)s->block_start] : \
+                   (charf *)Z_NULL), \
+                (ulg)((long)s->strstart - s->block_start), \
+                (last)); \
+   s->block_start = s->strstart; \
+   flush_pending(s->strm); \
+   Tracev((stderr,"[FLUSH]")); \
+}
+
+/* Same but force premature exit if necessary. */
+#define FLUSH_BLOCK(s, last) { \
+   FLUSH_BLOCK_ONLY(s, last); \
+   if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \
+}
+
+/* ===========================================================================
+ * Copy without compression as much as possible from the input stream, return
+ * the current block state.
+ * This function does not insert new strings in the dictionary since
+ * uncompressible data is probably not useful. This function is used
+ * only for the level=0 compression option.
+ * NOTE: this function should be optimized to avoid extra copying from
+ * window to pending_buf.
+ */
+local block_state deflate_stored(
+    deflate_state *s,
+    int flush)
+{
+    /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
+     * to pending_buf_size, and each stored block has a 5 byte header:
+     */
+    ulg max_block_size = 0xffff;
+    ulg max_start;
+
+    if (max_block_size > s->pending_buf_size - 5) {
+        max_block_size = s->pending_buf_size - 5;
+    }
+
+    /* Copy as much as possible from input to output: */
+    for (;;) {
+        /* Fill the window as much as possible: */
+        if (s->lookahead <= 1) {
+
+            Assert(s->strstart < s->w_size+MAX_DIST(s) ||
+                   s->block_start >= (long)s->w_size, "slide too late");
+
+            fill_window(s);
+            if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;
+
+            if (s->lookahead == 0) break; /* flush the current block */
+        }
+        Assert(s->block_start >= 0L, "block gone");
+
+        s->strstart += s->lookahead;
+        s->lookahead = 0;
+
+        /* Emit a stored block if pending_buf will be full: */
+        max_start = s->block_start + max_block_size;
+        if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
+            /* strstart == 0 is possible when wraparound on 16-bit machine */
+            s->lookahead = (uInt)(s->strstart - max_start);
+            s->strstart = (uInt)max_start;
+            FLUSH_BLOCK(s, 0);
+        }
+        /* Flush if we may have to slide, otherwise block_start may become
+         * negative and the data will be gone:
+         */
+        if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
+            FLUSH_BLOCK(s, 0);
+        }
+    }
+    s->insert = 0;
+    if (flush == Z_FINISH) {
+        FLUSH_BLOCK(s, 1);
+        return finish_done;
+    }
+    if ((long)s->strstart > s->block_start)
+        FLUSH_BLOCK(s, 0);
+    return block_done;
+}
+
+/* ===========================================================================
+ * Compress as much as possible from the input stream, return the current
+ * block state.
+ * This function does not perform lazy evaluation of matches and inserts
+ * new strings in the dictionary only for unmatched strings or for short
+ * matches. It is used only for the fast compression options.
+ */
+local block_state deflate_fast(
+    deflate_state *s,
+    int flush)
+{
+    IPos hash_head;       /* head of the hash chain */
+    int bflush;           /* set if current block must be flushed */
+
+    for (;;) {
+        /* Make sure that we always have enough lookahead, except
+         * at the end of the input file. We need MAX_MATCH bytes
+         * for the next match, plus MIN_MATCH bytes to insert the
+         * string following the next match.
+         */
+        if (s->lookahead < MIN_LOOKAHEAD) {
+            fill_window(s);
+            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+                return need_more;
+            }
+            if (s->lookahead == 0) break; /* flush the current block */
+        }
+
+        /* Insert the string window[strstart .. strstart+2] in the
+         * dictionary, and set hash_head to the head of the hash chain:
+         */
+        hash_head = NIL;
+        if (s->lookahead >= MIN_MATCH) {
+            INSERT_STRING(s, s->strstart, hash_head);
+        }
+
+        /* Find the longest match, discarding those <= prev_length.
+         * At this point we have always match_length < MIN_MATCH
+         */
+        if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
+            /* To simplify the code, we prevent matches with the string
+             * of window index 0 (in particular we have to avoid a match
+             * of the string with itself at the start of the input file).
+             */
+            s->match_length = longest_match (s, hash_head);
+            /* longest_match() sets match_start */
+        }
+        if (s->match_length >= MIN_MATCH) {
+            check_match(s, s->strstart, s->match_start, s->match_length);
+
+            _tr_tally_dist(s, s->strstart - s->match_start,
+                           s->match_length - MIN_MATCH, bflush);
+
+            s->lookahead -= s->match_length;
+
+            /* Insert new strings in the hash table only if the match length
+             * is not too large. This saves time but degrades compression.
+             */
+#ifndef FASTEST
+            if (s->match_length <= s->max_insert_length &&
+                s->lookahead >= MIN_MATCH) {
+                s->match_length--; /* string at strstart already in table */
+                do {
+                    s->strstart++;
+                    INSERT_STRING(s, s->strstart, hash_head);
+                    /* strstart never exceeds WSIZE-MAX_MATCH, so there are
+                     * always MIN_MATCH bytes ahead.
+                     */
+                } while (--s->match_length != 0);
+                s->strstart++;
+            } else
+#endif
+            {
+                s->strstart += s->match_length;
+                s->match_length = 0;
+                s->ins_h = s->window[s->strstart];
+                UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+#if MIN_MATCH != 3
+                Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+                /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
+                 * matter since it will be recomputed at next deflate call.
+                 */
+            }
+        } else {
+            /* No match, output a literal byte */
+            Tracevv((stderr,"%c", s->window[s->strstart]));
+            _tr_tally_lit (s, s->window[s->strstart], bflush);
+            s->lookahead--;
+            s->strstart++;
+        }
+        if (bflush) FLUSH_BLOCK(s, 0);
+    }
+    s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
+    if (flush == Z_FINISH) {
+        FLUSH_BLOCK(s, 1);
+        return finish_done;
+    }
+    if (s->last_lit)
+        FLUSH_BLOCK(s, 0);
+    return block_done;
+}
+
+#ifndef FASTEST
+/* ===========================================================================
+ * Same as above, but achieves better compression. We use a lazy
+ * evaluation for matches: a match is finally adopted only if there is
+ * no better match at the next window position.
+ */
+local block_state deflate_slow(
+    deflate_state *s,
+    int flush)
+{
+    IPos hash_head;          /* head of hash chain */
+    int bflush;              /* set if current block must be flushed */
+
+    /* Process the input block. */
+    for (;;) {
+        /* Make sure that we always have enough lookahead, except
+         * at the end of the input file. We need MAX_MATCH bytes
+         * for the next match, plus MIN_MATCH bytes to insert the
+         * string following the next match.
+         */
+        if (s->lookahead < MIN_LOOKAHEAD) {
+            fill_window(s);
+            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+                return need_more;
+            }
+            if (s->lookahead == 0) break; /* flush the current block */
+        }
+
+        /* Insert the string window[strstart .. strstart+2] in the
+         * dictionary, and set hash_head to the head of the hash chain:
+         */
+        hash_head = NIL;
+        if (s->lookahead >= MIN_MATCH) {
+            INSERT_STRING(s, s->strstart, hash_head);
+        }
+
+        /* Find the longest match, discarding those <= prev_length.
+         */
+        s->prev_length = s->match_length, s->prev_match = s->match_start;
+        s->match_length = MIN_MATCH-1;
+
+        if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
+            s->strstart - hash_head <= MAX_DIST(s)) {
+            /* To simplify the code, we prevent matches with the string
+             * of window index 0 (in particular we have to avoid a match
+             * of the string with itself at the start of the input file).
+             */
+            s->match_length = longest_match (s, hash_head);
+            /* longest_match() sets match_start */
+
+            if (s->match_length <= 5 && (s->strategy == Z_FILTERED
+#if TOO_FAR <= 32767
+                || (s->match_length == MIN_MATCH &&
+                    s->strstart - s->match_start > TOO_FAR)
+#endif
+                )) {
+
+                /* If prev_match is also MIN_MATCH, match_start is garbage
+                 * but we will ignore the current match anyway.
+                 */
+                s->match_length = MIN_MATCH-1;
+            }
+        }
+        /* If there was a match at the previous step and the current
+         * match is not better, output the previous match:
+         */
+        if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
+            uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
+            /* Do not insert strings in hash table beyond this. */
+
+            check_match(s, s->strstart-1, s->prev_match, s->prev_length);
+
+            _tr_tally_dist(s, s->strstart -1 - s->prev_match,
+                           s->prev_length - MIN_MATCH, bflush);
+
+            /* Insert in hash table all strings up to the end of the match.
+             * strstart-1 and strstart are already inserted. If there is not
+             * enough lookahead, the last two strings are not inserted in
+             * the hash table.
+             */
+            s->lookahead -= s->prev_length-1;
+            s->prev_length -= 2;
+            do {
+                if (++s->strstart <= max_insert) {
+                    INSERT_STRING(s, s->strstart, hash_head);
+                }
+            } while (--s->prev_length != 0);
+            s->match_available = 0;
+            s->match_length = MIN_MATCH-1;
+            s->strstart++;
+
+            if (bflush) FLUSH_BLOCK(s, 0);
+
+        } else if (s->match_available) {
+            /* If there was no match at the previous position, output a
+             * single literal. If there was a match but the current match
+             * is longer, truncate the previous match to a single literal.
+             */
+            Tracevv((stderr,"%c", s->window[s->strstart-1]));
+            _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+            if (bflush) {
+                FLUSH_BLOCK_ONLY(s, 0);
+            }
+            s->strstart++;
+            s->lookahead--;
+            if (s->strm->avail_out == 0) return need_more;
+        } else {
+            /* There is no previous match to compare with, wait for
+             * the next step to decide.
+             */
+            s->match_available = 1;
+            s->strstart++;
+            s->lookahead--;
+        }
+    }
+    Assert (flush != Z_NO_FLUSH, "no flush?");
+    if (s->match_available) {
+        Tracevv((stderr,"%c", s->window[s->strstart-1]));
+        _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+        s->match_available = 0;
+    }
+    s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
+    if (flush == Z_FINISH) {
+        FLUSH_BLOCK(s, 1);
+        return finish_done;
+    }
+    if (s->last_lit)
+        FLUSH_BLOCK(s, 0);
+    return block_done;
+}
+#endif /* FASTEST */
+
+/* ===========================================================================
+ * For Z_RLE, simply look for runs of bytes, generate matches only of distance
+ * one.  Do not maintain a hash table.  (It will be regenerated if this run of
+ * deflate switches away from Z_RLE.)
+ */
+local block_state deflate_rle(
+    deflate_state *s,
+    int flush)
+{
+    int bflush;             /* set if current block must be flushed */
+    uInt prev;              /* byte at distance one to match */
+    Bytef *scan, *strend;   /* scan goes up to strend for length of run */
+
+    for (;;) {
+        /* Make sure that we always have enough lookahead, except
+         * at the end of the input file. We need MAX_MATCH bytes
+         * for the longest run, plus one for the unrolled loop.
+         */
+        if (s->lookahead <= MAX_MATCH) {
+            fill_window(s);
+            if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) {
+                return need_more;
+            }
+            if (s->lookahead == 0) break; /* flush the current block */
+        }
+
+        /* See how many times the previous byte repeats */
+        s->match_length = 0;
+        if (s->lookahead >= MIN_MATCH && s->strstart > 0) {
+            scan = s->window + s->strstart - 1;
+            prev = *scan;
+            if (prev == *++scan && prev == *++scan && prev == *++scan) {
+                strend = s->window + s->strstart + MAX_MATCH;
+                do {
+                } while (prev == *++scan && prev == *++scan &&
+                         prev == *++scan && prev == *++scan &&
+                         prev == *++scan && prev == *++scan &&
+                         prev == *++scan && prev == *++scan &&
+                         scan < strend);
+                s->match_length = MAX_MATCH - (int)(strend - scan);
+                if (s->match_length > s->lookahead)
+                    s->match_length = s->lookahead;
+            }
+            Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
+        }
+
+        /* Emit match if have run of MIN_MATCH or longer, else emit literal */
+        if (s->match_length >= MIN_MATCH) {
+            check_match(s, s->strstart, s->strstart - 1, s->match_length);
+
+            _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);
+
+            s->lookahead -= s->match_length;
+            s->strstart += s->match_length;
+            s->match_length = 0;
+        } else {
+            /* No match, output a literal byte */
+            Tracevv((stderr,"%c", s->window[s->strstart]));
+            _tr_tally_lit (s, s->window[s->strstart], bflush);
+            s->lookahead--;
+            s->strstart++;
+        }
+        if (bflush) FLUSH_BLOCK(s, 0);
+    }
+    s->insert = 0;
+    if (flush == Z_FINISH) {
+        FLUSH_BLOCK(s, 1);
+        return finish_done;
+    }
+    if (s->last_lit)
+        FLUSH_BLOCK(s, 0);
+    return block_done;
+}
+
+/* ===========================================================================
+ * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
+ * (It will be regenerated if this run of deflate switches away from Huffman.)
+ */
+local block_state deflate_huff(
+    deflate_state *s,
+    int flush)
+{
+    int bflush;             /* set if current block must be flushed */
+
+    for (;;) {
+        /* Make sure that we have a literal to write. */
+        if (s->lookahead == 0) {
+            fill_window(s);
+            if (s->lookahead == 0) {
+                if (flush == Z_NO_FLUSH)
+                    return need_more;
+                break;      /* flush the current block */
+            }
+        }
+
+        /* Output a literal byte */
+        s->match_length = 0;
+        Tracevv((stderr,"%c", s->window[s->strstart]));
+        _tr_tally_lit (s, s->window[s->strstart], bflush);
+        s->lookahead--;
+        s->strstart++;
+        if (bflush) FLUSH_BLOCK(s, 0);
+    }
+    s->insert = 0;
+    if (flush == Z_FINISH) {
+        FLUSH_BLOCK(s, 1);
+        return finish_done;
+    }
+    if (s->last_lit)
+        FLUSH_BLOCK(s, 0);
+    return block_done;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_infback.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_infback.c
new file mode 100644
index 0000000..157bbd6
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_infback.c
@@ -0,0 +1,640 @@
+/* infback.c -- inflate using a call-back interface
+ * Copyright (C) 1995-2011 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+   This code is largely copied from inflate.c.  Normally either infback.o or
+   inflate.o would be linked into an application--not both.  The interface
+   with inffast.c is retained so that optimized assembler-coded versions of
+   inflate_fast() can be used with either inflate.c or infback.c.
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+/* function prototypes */
+local void fixedtables OF((struct inflate_state FAR *state));
+
+/*
+   strm provides memory allocation functions in zalloc and zfree, or
+   Z_NULL to use the library memory allocation functions.
+
+   windowBits is in the range 8..15, and window is a user-supplied
+   window and output buffer that is 2**windowBits bytes.
+ */
+int ZEXPORT inflateBackInit_(
+z_streamp strm,
+int windowBits,
+unsigned char FAR *window,
+const char *version,
+int stream_size)
+{
+    struct inflate_state FAR *state;
+
+    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+        stream_size != (int)(sizeof(z_stream)))
+        return Z_VERSION_ERROR;
+    if (strm == Z_NULL || window == Z_NULL ||
+        windowBits < 8 || windowBits > 15)
+        return Z_STREAM_ERROR;
+    strm->msg = Z_NULL;                 /* in case we return an error */
+    if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+        return Z_STREAM_ERROR;
+#else
+        strm->zalloc = zcalloc;
+        strm->opaque = (voidpf)0;
+#endif
+    }
+    if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+        return Z_STREAM_ERROR;
+#else
+    strm->zfree = zcfree;
+#endif
+    state = (struct inflate_state FAR *)ZALLOC(strm, 1,
+                                               sizeof(struct inflate_state));
+    if (state == Z_NULL) return Z_MEM_ERROR;
+    Tracev((stderr, "inflate: allocated\n"));
+    strm->state = (struct internal_state FAR *)state;
+    state->dmax = 32768U;
+    state->wbits = windowBits;
+    state->wsize = 1U << windowBits;
+    state->window = window;
+    state->wnext = 0;
+    state->whave = 0;
+    return Z_OK;
+}
+
+/*
+   Return state with length and distance decoding tables and index sizes set to
+   fixed code decoding.  Normally this returns fixed tables from inffixed.h.
+   If BUILDFIXED is defined, then instead this routine builds the tables the
+   first time it's called, and returns those tables the first time and
+   thereafter.  This reduces the size of the code by about 2K bytes, in
+   exchange for a little execution time.  However, BUILDFIXED should not be
+   used for threaded applications, since the rewriting of the tables and virgin
+   may not be thread-safe.
+ */
+local void fixedtables(
+struct inflate_state FAR *state)
+{
+#ifdef BUILDFIXED
+    static int virgin = 1;
+    static code *lenfix, *distfix;
+    static code fixed[544];
+
+    /* build fixed huffman tables if first call (may not be thread safe) */
+    if (virgin) {
+        unsigned sym, bits;
+        static code *next;
+
+        /* literal/length table */
+        sym = 0;
+        while (sym < 144) state->lens[sym++] = 8;
+        while (sym < 256) state->lens[sym++] = 9;
+        while (sym < 280) state->lens[sym++] = 7;
+        while (sym < 288) state->lens[sym++] = 8;
+        next = fixed;
+        lenfix = next;
+        bits = 9;
+        inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
+
+        /* distance table */
+        sym = 0;
+        while (sym < 32) state->lens[sym++] = 5;
+        distfix = next;
+        bits = 5;
+        inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
+
+        /* do this just once */
+        virgin = 0;
+    }
+#else /* !BUILDFIXED */
+#   include "inffixed.h"
+#endif /* BUILDFIXED */
+    state->lencode = lenfix;
+    state->lenbits = 9;
+    state->distcode = distfix;
+    state->distbits = 5;
+}
+
+/* Macros for inflateBack(): */
+
+/* Load returned state from inflate_fast() */
+#define LOAD() \
+    do { \
+        put = strm->next_out; \
+        left = strm->avail_out; \
+        next = strm->next_in; \
+        have = strm->avail_in; \
+        hold = state->hold; \
+        bits = state->bits; \
+    } while (0)
+
+/* Set state from registers for inflate_fast() */
+#define RESTORE() \
+    do { \
+        strm->next_out = put; \
+        strm->avail_out = left; \
+        strm->next_in = next; \
+        strm->avail_in = have; \
+        state->hold = hold; \
+        state->bits = bits; \
+    } while (0)
+
+/* Clear the input bit accumulator */
+#define INITBITS() \
+    do { \
+        hold = 0; \
+        bits = 0; \
+    } while (0)
+
+/* Assure that some input is available.  If input is requested, but denied,
+   then return a Z_BUF_ERROR from inflateBack(). */
+#define PULL() \
+    do { \
+        if (have == 0) { \
+            have = in(in_desc, &next); \
+            if (have == 0) { \
+                next = Z_NULL; \
+                ret = Z_BUF_ERROR; \
+                goto inf_leave; \
+            } \
+        } \
+    } while (0)
+
+/* Get a byte of input into the bit accumulator, or return from inflateBack()
+   with an error if there is no input available. */
+#define PULLBYTE() \
+    do { \
+        PULL(); \
+        have--; \
+        hold += (unsigned long)(*next++) << bits; \
+        bits += 8; \
+    } while (0)
+
+/* Assure that there are at least n bits in the bit accumulator.  If there is
+   not enough available input to do that, then return from inflateBack() with
+   an error. */
+#define NEEDBITS(n) \
+    do { \
+        while (bits < (unsigned)(n)) \
+            PULLBYTE(); \
+    } while (0)
+
+/* Return the low n bits of the bit accumulator (n < 16) */
+#define BITS(n) \
+    ((unsigned)hold & ((1U << (n)) - 1))
+
+/* Remove n bits from the bit accumulator */
+#define DROPBITS(n) \
+    do { \
+        hold >>= (n); \
+        bits -= (unsigned)(n); \
+    } while (0)
+
+/* Remove zero to seven bits as needed to go to a byte boundary */
+#define BYTEBITS() \
+    do { \
+        hold >>= bits & 7; \
+        bits -= bits & 7; \
+    } while (0)
+
+/* Assure that some output space is available, by writing out the window
+   if it's full.  If the write fails, return from inflateBack() with a
+   Z_BUF_ERROR. */
+#define ROOM() \
+    do { \
+        if (left == 0) { \
+            put = state->window; \
+            left = state->wsize; \
+            state->whave = left; \
+            if (out(out_desc, put, left)) { \
+                ret = Z_BUF_ERROR; \
+                goto inf_leave; \
+            } \
+        } \
+    } while (0)
+
+/*
+   strm provides the memory allocation functions and window buffer on input,
+   and provides information on the unused input on return.  For Z_DATA_ERROR
+   returns, strm will also provide an error message.
+
+   in() and out() are the call-back input and output functions.  When
+   inflateBack() needs more input, it calls in().  When inflateBack() has
+   filled the window with output, or when it completes with data in the
+   window, it calls out() to write out the data.  The application must not
+   change the provided input until in() is called again or inflateBack()
+   returns.  The application must not change the window/output buffer until
+   inflateBack() returns.
+
+   in() and out() are called with a descriptor parameter provided in the
+   inflateBack() call.  This parameter can be a structure that provides the
+   information required to do the read or write, as well as accumulated
+   information on the input and output such as totals and check values.
+
+   in() should return zero on failure.  out() should return non-zero on
+   failure.  If either in() or out() fails, than inflateBack() returns a
+   Z_BUF_ERROR.  strm->next_in can be checked for Z_NULL to see whether it
+   was in() or out() that caused in the error.  Otherwise,  inflateBack()
+   returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
+   error, or Z_MEM_ERROR if it could not allocate memory for the state.
+   inflateBack() can also return Z_STREAM_ERROR if the input parameters
+   are not correct, i.e. strm is Z_NULL or the state was not initialized.
+ */
+int ZEXPORT inflateBack(
+z_streamp strm,
+in_func in,
+void FAR *in_desc,
+out_func out,
+void FAR *out_desc)
+{
+    struct inflate_state FAR *state;
+    z_const unsigned char FAR *next;    /* next input */
+    unsigned char FAR *put;     /* next output */
+    unsigned have, left;        /* available input and output */
+    unsigned long hold;         /* bit buffer */
+    unsigned bits;              /* bits in bit buffer */
+    unsigned copy;              /* number of stored or match bytes to copy */
+    unsigned char FAR *from;    /* where to copy match bytes from */
+    code here;                  /* current decoding table entry */
+    code last;                  /* parent table entry */
+    unsigned len;               /* length to copy for repeats, bits to drop */
+    int ret;                    /* return code */
+    static const unsigned short order[19] = /* permutation of code lengths */
+        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+    /* Check that the strm exists and that the state was initialized */
+    if (strm == Z_NULL || strm->state == Z_NULL)
+        return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)strm->state;
+
+    /* Reset the state */
+    strm->msg = Z_NULL;
+    state->mode = TYPE;
+    state->last = 0;
+    state->whave = 0;
+    next = strm->next_in;
+    have = next != Z_NULL ? strm->avail_in : 0;
+    hold = 0;
+    bits = 0;
+    put = state->window;
+    left = state->wsize;
+
+    /* Inflate until end of block marked as last */
+    for (;;)
+        switch (state->mode) {
+        case TYPE:
+            /* determine and dispatch block type */
+            if (state->last) {
+                BYTEBITS();
+                state->mode = DONE;
+                break;
+            }
+            NEEDBITS(3);
+            state->last = BITS(1);
+            DROPBITS(1);
+            switch (BITS(2)) {
+            case 0:                             /* stored block */
+                Tracev((stderr, "inflate:     stored block%s\n",
+                        state->last ? " (last)" : ""));
+                state->mode = STORED;
+                break;
+            case 1:                             /* fixed block */
+                fixedtables(state);
+                Tracev((stderr, "inflate:     fixed codes block%s\n",
+                        state->last ? " (last)" : ""));
+                state->mode = LEN;              /* decode codes */
+                break;
+            case 2:                             /* dynamic block */
+                Tracev((stderr, "inflate:     dynamic codes block%s\n",
+                        state->last ? " (last)" : ""));
+                state->mode = TABLE;
+                break;
+            case 3:
+                strm->msg = (char *)"invalid block type";
+                state->mode = BAD;
+            }
+            DROPBITS(2);
+            break;
+
+        case STORED:
+            /* get and verify stored block length */
+            BYTEBITS();                         /* go to byte boundary */
+            NEEDBITS(32);
+            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
+                strm->msg = (char *)"invalid stored block lengths";
+                state->mode = BAD;
+                break;
+            }
+            state->length = (unsigned)hold & 0xffff;
+            Tracev((stderr, "inflate:       stored length %u\n",
+                    state->length));
+            INITBITS();
+
+            /* copy stored block from input to output */
+            while (state->length != 0) {
+                copy = state->length;
+                PULL();
+                ROOM();
+                if (copy > have) copy = have;
+                if (copy > left) copy = left;
+                zmemcpy(put, next, copy);
+                have -= copy;
+                next += copy;
+                left -= copy;
+                put += copy;
+                state->length -= copy;
+            }
+            Tracev((stderr, "inflate:       stored end\n"));
+            state->mode = TYPE;
+            break;
+
+        case TABLE:
+            /* get dynamic table entries descriptor */
+            NEEDBITS(14);
+            state->nlen = BITS(5) + 257;
+            DROPBITS(5);
+            state->ndist = BITS(5) + 1;
+            DROPBITS(5);
+            state->ncode = BITS(4) + 4;
+            DROPBITS(4);
+#ifndef PKZIP_BUG_WORKAROUND
+            if (state->nlen > 286 || state->ndist > 30) {
+                strm->msg = (char *)"too many length or distance symbols";
+                state->mode = BAD;
+                break;
+            }
+#endif
+            Tracev((stderr, "inflate:       table sizes ok\n"));
+
+            /* get code length code lengths (not a typo) */
+            state->have = 0;
+            while (state->have < state->ncode) {
+                NEEDBITS(3);
+                state->lens[order[state->have++]] = (unsigned short)BITS(3);
+                DROPBITS(3);
+            }
+            while (state->have < 19)
+                state->lens[order[state->have++]] = 0;
+            state->next = state->codes;
+            state->lencode = (code const FAR *)(state->next);
+            state->lenbits = 7;
+            ret = inflate_table(CODES, state->lens, 19, &(state->next),
+                                &(state->lenbits), state->work);
+            if (ret) {
+                strm->msg = (char *)"invalid code lengths set";
+                state->mode = BAD;
+                break;
+            }
+            Tracev((stderr, "inflate:       code lengths ok\n"));
+
+            /* get length and distance code code lengths */
+            state->have = 0;
+            while (state->have < state->nlen + state->ndist) {
+                for (;;) {
+                    here = state->lencode[BITS(state->lenbits)];
+                    if ((unsigned)(here.bits) <= bits) break;
+                    PULLBYTE();
+                }
+                if (here.val < 16) {
+                    DROPBITS(here.bits);
+                    state->lens[state->have++] = here.val;
+                }
+                else {
+                    if (here.val == 16) {
+                        NEEDBITS(here.bits + 2);
+                        DROPBITS(here.bits);
+                        if (state->have == 0) {
+                            strm->msg = (char *)"invalid bit length repeat";
+                            state->mode = BAD;
+                            break;
+                        }
+                        len = (unsigned)(state->lens[state->have - 1]);
+                        copy = 3 + BITS(2);
+                        DROPBITS(2);
+                    }
+                    else if (here.val == 17) {
+                        NEEDBITS(here.bits + 3);
+                        DROPBITS(here.bits);
+                        len = 0;
+                        copy = 3 + BITS(3);
+                        DROPBITS(3);
+                    }
+                    else {
+                        NEEDBITS(here.bits + 7);
+                        DROPBITS(here.bits);
+                        len = 0;
+                        copy = 11 + BITS(7);
+                        DROPBITS(7);
+                    }
+                    if (state->have + copy > state->nlen + state->ndist) {
+                        strm->msg = (char *)"invalid bit length repeat";
+                        state->mode = BAD;
+                        break;
+                    }
+                    while (copy--)
+                        state->lens[state->have++] = (unsigned short)len;
+                }
+            }
+
+            /* handle error breaks in while */
+            if (state->mode == BAD) break;
+
+            /* check for end-of-block code (better have one) */
+            if (state->lens[256] == 0) {
+                strm->msg = (char *)"invalid code -- missing end-of-block";
+                state->mode = BAD;
+                break;
+            }
+
+            /* build code tables -- note: do not change the lenbits or distbits
+               values here (9 and 6) without reading the comments in inftrees.h
+               concerning the ENOUGH constants, which depend on those values */
+            state->next = state->codes;
+            state->lencode = (code const FAR *)(state->next);
+            state->lenbits = 9;
+            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
+                                &(state->lenbits), state->work);
+            if (ret) {
+                strm->msg = (char *)"invalid literal/lengths set";
+                state->mode = BAD;
+                break;
+            }
+            state->distcode = (code const FAR *)(state->next);
+            state->distbits = 6;
+            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
+                            &(state->next), &(state->distbits), state->work);
+            if (ret) {
+                strm->msg = (char *)"invalid distances set";
+                state->mode = BAD;
+                break;
+            }
+            Tracev((stderr, "inflate:       codes ok\n"));
+            state->mode = LEN;
+
+        case LEN:
+            /* use inflate_fast() if we have enough input and output */
+            if (have >= 6 && left >= 258) {
+                RESTORE();
+                if (state->whave < state->wsize)
+                    state->whave = state->wsize - left;
+                inflate_fast(strm, state->wsize);
+                LOAD();
+                break;
+            }
+
+            /* get a literal, length, or end-of-block code */
+            for (;;) {
+                here = state->lencode[BITS(state->lenbits)];
+                if ((unsigned)(here.bits) <= bits) break;
+                PULLBYTE();
+            }
+            if (here.op && (here.op & 0xf0) == 0) {
+                last = here;
+                for (;;) {
+                    here = state->lencode[last.val +
+                            (BITS(last.bits + last.op) >> last.bits)];
+                    if ((unsigned)(last.bits + here.bits) <= bits) break;
+                    PULLBYTE();
+                }
+                DROPBITS(last.bits);
+            }
+            DROPBITS(here.bits);
+            state->length = (unsigned)here.val;
+
+            /* process literal */
+            if (here.op == 0) {
+                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+                        "inflate:         literal '%c'\n" :
+                        "inflate:         literal 0x%02x\n", here.val));
+                ROOM();
+                *put++ = (unsigned char)(state->length);
+                left--;
+                state->mode = LEN;
+                break;
+            }
+
+            /* process end of block */
+            if (here.op & 32) {
+                Tracevv((stderr, "inflate:         end of block\n"));
+                state->mode = TYPE;
+                break;
+            }
+
+            /* invalid code */
+            if (here.op & 64) {
+                strm->msg = (char *)"invalid literal/length code";
+                state->mode = BAD;
+                break;
+            }
+
+            /* length code -- get extra bits, if any */
+            state->extra = (unsigned)(here.op) & 15;
+            if (state->extra != 0) {
+                NEEDBITS(state->extra);
+                state->length += BITS(state->extra);
+                DROPBITS(state->extra);
+            }
+            Tracevv((stderr, "inflate:         length %u\n", state->length));
+
+            /* get distance code */
+            for (;;) {
+                here = state->distcode[BITS(state->distbits)];
+                if ((unsigned)(here.bits) <= bits) break;
+                PULLBYTE();
+            }
+            if ((here.op & 0xf0) == 0) {
+                last = here;
+                for (;;) {
+                    here = state->distcode[last.val +
+                            (BITS(last.bits + last.op) >> last.bits)];
+                    if ((unsigned)(last.bits + here.bits) <= bits) break;
+                    PULLBYTE();
+                }
+                DROPBITS(last.bits);
+            }
+            DROPBITS(here.bits);
+            if (here.op & 64) {
+                strm->msg = (char *)"invalid distance code";
+                state->mode = BAD;
+                break;
+            }
+            state->offset = (unsigned)here.val;
+
+            /* get distance extra bits, if any */
+            state->extra = (unsigned)(here.op) & 15;
+            if (state->extra != 0) {
+                NEEDBITS(state->extra);
+                state->offset += BITS(state->extra);
+                DROPBITS(state->extra);
+            }
+            if (state->offset > state->wsize - (state->whave < state->wsize ?
+                                                left : 0)) {
+                strm->msg = (char *)"invalid distance too far back";
+                state->mode = BAD;
+                break;
+            }
+            Tracevv((stderr, "inflate:         distance %u\n", state->offset));
+
+            /* copy match from window to output */
+            do {
+                ROOM();
+                copy = state->wsize - state->offset;
+                if (copy < left) {
+                    from = put + copy;
+                    copy = left - copy;
+                }
+                else {
+                    from = put - state->offset;
+                    copy = left;
+                }
+                if (copy > state->length) copy = state->length;
+                state->length -= copy;
+                left -= copy;
+                do {
+                    *put++ = *from++;
+                } while (--copy);
+            } while (state->length != 0);
+            break;
+
+        case DONE:
+            /* inflate stream terminated properly -- write leftover output */
+            ret = Z_STREAM_END;
+            if (left < state->wsize) {
+                if (out(out_desc, state->window, state->wsize - left))
+                    ret = Z_BUF_ERROR;
+            }
+            goto inf_leave;
+
+        case BAD:
+            ret = Z_DATA_ERROR;
+            goto inf_leave;
+
+        default:                /* can't happen, but makes compilers happy */
+            ret = Z_STREAM_ERROR;
+            goto inf_leave;
+        }
+
+    /* Return unused input */
+  inf_leave:
+    strm->next_in = next;
+    strm->avail_in = have;
+    return ret;
+}
+
+int ZEXPORT inflateBackEnd(
+z_streamp strm)
+{
+    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
+        return Z_STREAM_ERROR;
+    ZFREE(strm, strm->state);
+    strm->state = Z_NULL;
+    Tracev((stderr, "inflate: end\n"));
+    return Z_OK;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inffast.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inffast.c
new file mode 100644
index 0000000..3fcffae
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inffast.c
@@ -0,0 +1,340 @@
+/* inffast.c -- fast decoding
+ * Copyright (C) 1995-2008, 2010, 2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+#ifndef ASMINF
+
+/* Allow machine dependent optimization for post-increment or pre-increment.
+   Based on testing to date,
+   Pre-increment preferred for:
+   - PowerPC G3 (Adler)
+   - MIPS R5000 (Randers-Pehrson)
+   Post-increment preferred for:
+   - none
+   No measurable difference:
+   - Pentium III (Anderson)
+   - M68060 (Nikl)
+ */
+#ifdef POSTINC
+#  define OFF 0
+#  define PUP(a) *(a)++
+#else
+#  define OFF 1
+#  define PUP(a) *++(a)
+#endif
+
+/*
+   Decode literal, length, and distance codes and write out the resulting
+   literal and match bytes until either not enough input or output is
+   available, an end-of-block is encountered, or a data error is encountered.
+   When large enough input and output buffers are supplied to inflate(), for
+   example, a 16K input buffer and a 64K output buffer, more than 95% of the
+   inflate execution time is spent in this routine.
+
+   Entry assumptions:
+
+        state->mode == LEN
+        strm->avail_in >= 6
+        strm->avail_out >= 258
+        start >= strm->avail_out
+        state->bits < 8
+
+   On return, state->mode is one of:
+
+        LEN -- ran out of enough output space or enough available input
+        TYPE -- reached end of block code, inflate() to interpret next block
+        BAD -- error in block data
+
+   Notes:
+
+    - The maximum input bits used by a length/distance pair is 15 bits for the
+      length code, 5 bits for the length extra, 15 bits for the distance code,
+      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
+      Therefore if strm->avail_in >= 6, then there is enough input to avoid
+      checking for available input while decoding.
+
+    - The maximum bytes that a single length/distance pair can output is 258
+      bytes, which is the maximum length that can be coded.  inflate_fast()
+      requires strm->avail_out >= 258 for each loop to avoid checking for
+      output space.
+ */
+void ZLIB_INTERNAL inflate_fast(
+z_streamp strm,
+unsigned start)         /* inflate()'s starting value for strm->avail_out */
+{
+    struct inflate_state FAR *state;
+    z_const unsigned char FAR *in;      /* local strm->next_in */
+    z_const unsigned char FAR *last;    /* have enough input while in < last */
+    unsigned char FAR *out;     /* local strm->next_out */
+    unsigned char FAR *beg;     /* inflate()'s initial strm->next_out */
+    unsigned char FAR *end;     /* while out < end, enough space available */
+#ifdef INFLATE_STRICT
+    unsigned dmax;              /* maximum distance from zlib header */
+#endif
+    unsigned wsize;             /* window size or zero if not using window */
+    unsigned whave;             /* valid bytes in the window */
+    unsigned wnext;             /* window write index */
+    unsigned char FAR *window;  /* allocated sliding window, if wsize != 0 */
+    unsigned long hold;         /* local strm->hold */
+    unsigned bits;              /* local strm->bits */
+    code const FAR *lcode;      /* local strm->lencode */
+    code const FAR *dcode;      /* local strm->distcode */
+    unsigned lmask;             /* mask for first level of length codes */
+    unsigned dmask;             /* mask for first level of distance codes */
+    code here;                  /* retrieved table entry */
+    unsigned op;                /* code bits, operation, extra bits, or */
+                                /*  window position, window bytes to copy */
+    unsigned len;               /* match length, unused bytes */
+    unsigned dist;              /* match distance */
+    unsigned char FAR *from;    /* where to copy match from */
+
+    /* copy state to local variables */
+    state = (struct inflate_state FAR *)strm->state;
+    in = strm->next_in - OFF;
+    last = in + (strm->avail_in - 5);
+    out = strm->next_out - OFF;
+    beg = out - (start - strm->avail_out);
+    end = out + (strm->avail_out - 257);
+#ifdef INFLATE_STRICT
+    dmax = state->dmax;
+#endif
+    wsize = state->wsize;
+    whave = state->whave;
+    wnext = state->wnext;
+    window = state->window;
+    hold = state->hold;
+    bits = state->bits;
+    lcode = state->lencode;
+    dcode = state->distcode;
+    lmask = (1U << state->lenbits) - 1;
+    dmask = (1U << state->distbits) - 1;
+
+    /* decode literals and length/distances until end-of-block or not enough
+       input data or output space */
+    do {
+        if (bits < 15) {
+            hold += (unsigned long)(PUP(in)) << bits;
+            bits += 8;
+            hold += (unsigned long)(PUP(in)) << bits;
+            bits += 8;
+        }
+        here = lcode[hold & lmask];
+      dolen:
+        op = (unsigned)(here.bits);
+        hold >>= op;
+        bits -= op;
+        op = (unsigned)(here.op);
+        if (op == 0) {                          /* literal */
+            Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+                    "inflate:         literal '%c'\n" :
+                    "inflate:         literal 0x%02x\n", here.val));
+            PUP(out) = (unsigned char)(here.val);
+        }
+        else if (op & 16) {                     /* length base */
+            len = (unsigned)(here.val);
+            op &= 15;                           /* number of extra bits */
+            if (op) {
+                if (bits < op) {
+                    hold += (unsigned long)(PUP(in)) << bits;
+                    bits += 8;
+                }
+                len += (unsigned)hold & ((1U << op) - 1);
+                hold >>= op;
+                bits -= op;
+            }
+            Tracevv((stderr, "inflate:         length %u\n", len));
+            if (bits < 15) {
+                hold += (unsigned long)(PUP(in)) << bits;
+                bits += 8;
+                hold += (unsigned long)(PUP(in)) << bits;
+                bits += 8;
+            }
+            here = dcode[hold & dmask];
+          dodist:
+            op = (unsigned)(here.bits);
+            hold >>= op;
+            bits -= op;
+            op = (unsigned)(here.op);
+            if (op & 16) {                      /* distance base */
+                dist = (unsigned)(here.val);
+                op &= 15;                       /* number of extra bits */
+                if (bits < op) {
+                    hold += (unsigned long)(PUP(in)) << bits;
+                    bits += 8;
+                    if (bits < op) {
+                        hold += (unsigned long)(PUP(in)) << bits;
+                        bits += 8;
+                    }
+                }
+                dist += (unsigned)hold & ((1U << op) - 1);
+#ifdef INFLATE_STRICT
+                if (dist > dmax) {
+                    strm->msg = (char *)"invalid distance too far back";
+                    state->mode = BAD;
+                    break;
+                }
+#endif
+                hold >>= op;
+                bits -= op;
+                Tracevv((stderr, "inflate:         distance %u\n", dist));
+                op = (unsigned)(out - beg);     /* max distance in output */
+                if (dist > op) {                /* see if copy from window */
+                    op = dist - op;             /* distance back in window */
+                    if (op > whave) {
+                        if (state->sane) {
+                            strm->msg =
+                                (char *)"invalid distance too far back";
+                            state->mode = BAD;
+                            break;
+                        }
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+                        if (len <= op - whave) {
+                            do {
+                                PUP(out) = 0;
+                            } while (--len);
+                            continue;
+                        }
+                        len -= op - whave;
+                        do {
+                            PUP(out) = 0;
+                        } while (--op > whave);
+                        if (op == 0) {
+                            from = out - dist;
+                            do {
+                                PUP(out) = PUP(from);
+                            } while (--len);
+                            continue;
+                        }
+#endif
+                    }
+                    from = window - OFF;
+                    if (wnext == 0) {           /* very common case */
+                        from += wsize - op;
+                        if (op < len) {         /* some from window */
+                            len -= op;
+                            do {
+                                PUP(out) = PUP(from);
+                            } while (--op);
+                            from = out - dist;  /* rest from output */
+                        }
+                    }
+                    else if (wnext < op) {      /* wrap around window */
+                        from += wsize + wnext - op;
+                        op -= wnext;
+                        if (op < len) {         /* some from end of window */
+                            len -= op;
+                            do {
+                                PUP(out) = PUP(from);
+                            } while (--op);
+                            from = window - OFF;
+                            if (wnext < len) {  /* some from start of window */
+                                op = wnext;
+                                len -= op;
+                                do {
+                                    PUP(out) = PUP(from);
+                                } while (--op);
+                                from = out - dist;      /* rest from output */
+                            }
+                        }
+                    }
+                    else {                      /* contiguous in window */
+                        from += wnext - op;
+                        if (op < len) {         /* some from window */
+                            len -= op;
+                            do {
+                                PUP(out) = PUP(from);
+                            } while (--op);
+                            from = out - dist;  /* rest from output */
+                        }
+                    }
+                    while (len > 2) {
+                        PUP(out) = PUP(from);
+                        PUP(out) = PUP(from);
+                        PUP(out) = PUP(from);
+                        len -= 3;
+                    }
+                    if (len) {
+                        PUP(out) = PUP(from);
+                        if (len > 1)
+                            PUP(out) = PUP(from);
+                    }
+                }
+                else {
+                    from = out - dist;          /* copy direct from output */
+                    do {                        /* minimum length is three */
+                        PUP(out) = PUP(from);
+                        PUP(out) = PUP(from);
+                        PUP(out) = PUP(from);
+                        len -= 3;
+                    } while (len > 2);
+                    if (len) {
+                        PUP(out) = PUP(from);
+                        if (len > 1)
+                            PUP(out) = PUP(from);
+                    }
+                }
+            }
+            else if ((op & 64) == 0) {          /* 2nd level distance code */
+                here = dcode[here.val + (hold & ((1U << op) - 1))];
+                goto dodist;
+            }
+            else {
+                strm->msg = (char *)"invalid distance code";
+                state->mode = BAD;
+                break;
+            }
+        }
+        else if ((op & 64) == 0) {              /* 2nd level length code */
+            here = lcode[here.val + (hold & ((1U << op) - 1))];
+            goto dolen;
+        }
+        else if (op & 32) {                     /* end-of-block */
+            Tracevv((stderr, "inflate:         end of block\n"));
+            state->mode = TYPE;
+            break;
+        }
+        else {
+            strm->msg = (char *)"invalid literal/length code";
+            state->mode = BAD;
+            break;
+        }
+    } while (in < last && out < end);
+
+    /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
+    len = bits >> 3;
+    in -= len;
+    bits -= len << 3;
+    hold &= (1U << bits) - 1;
+
+    /* update state and return */
+    strm->next_in = in + OFF;
+    strm->next_out = out + OFF;
+    strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));
+    strm->avail_out = (unsigned)(out < end ?
+                                 257 + (end - out) : 257 - (out - end));
+    state->hold = hold;
+    state->bits = bits;
+    return;
+}
+
+/*
+   inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):
+   - Using bit fields for code structure
+   - Different op definition to avoid & for extra bits (do & for table bits)
+   - Three separate decoding do-loops for direct, window, and wnext == 0
+   - Special case for distance > 1 copies to do overlapped load and store copy
+   - Explicit branch predictions (based on measured branch probabilities)
+   - Deferring match copy and interspersed it with decoding subsequent codes
+   - Swapping literal/length else
+   - Swapping window/direct else
+   - Larger unrolled copy loops (three is about right)
+   - Moving len -= 3 statement into middle of loop
+ */
+
+#endif /* !ASMINF */
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inflate.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inflate.c
new file mode 100644
index 0000000..bc5e448
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inflate.c
@@ -0,0 +1,1513 @@
+/* inflate.c -- zlib decompression
+ * Copyright (C) 1995-2012 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * Change history:
+ *
+ * 1.2.beta0    24 Nov 2002
+ * - First version -- complete rewrite of inflate to simplify code, avoid
+ *   creation of window when not needed, minimize use of window when it is
+ *   needed, make inffast.c even faster, implement gzip decoding, and to
+ *   improve code readability and style over the previous zlib inflate code
+ *
+ * 1.2.beta1    25 Nov 2002
+ * - Use pointers for available input and output checking in inffast.c
+ * - Remove input and output counters in inffast.c
+ * - Change inffast.c entry and loop from avail_in >= 7 to >= 6
+ * - Remove unnecessary second byte pull from length extra in inffast.c
+ * - Unroll direct copy to three copies per loop in inffast.c
+ *
+ * 1.2.beta2    4 Dec 2002
+ * - Change external routine names to reduce potential conflicts
+ * - Correct filename to inffixed.h for fixed tables in inflate.c
+ * - Make hbuf[] unsigned char to match parameter type in inflate.c
+ * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)
+ *   to avoid negation problem on Alphas (64 bit) in inflate.c
+ *
+ * 1.2.beta3    22 Dec 2002
+ * - Add comments on state->bits assertion in inffast.c
+ * - Add comments on op field in inftrees.h
+ * - Fix bug in reuse of allocated window after inflateReset()
+ * - Remove bit fields--back to byte structure for speed
+ * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths
+ * - Change post-increments to pre-increments in inflate_fast(), PPC biased?
+ * - Add compile time option, POSTINC, to use post-increments instead (Intel?)
+ * - Make MATCH copy in inflate() much faster for when inflate_fast() not used
+ * - Use local copies of stream next and avail values, as well as local bit
+ *   buffer and bit count in inflate()--for speed when inflate_fast() not used
+ *
+ * 1.2.beta4    1 Jan 2003
+ * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings
+ * - Move a comment on output buffer sizes from inffast.c to inflate.c
+ * - Add comments in inffast.c to introduce the inflate_fast() routine
+ * - Rearrange window copies in inflate_fast() for speed and simplification
+ * - Unroll last copy for window match in inflate_fast()
+ * - Use local copies of window variables in inflate_fast() for speed
+ * - Pull out common wnext == 0 case for speed in inflate_fast()
+ * - Make op and len in inflate_fast() unsigned for consistency
+ * - Add FAR to lcode and dcode declarations in inflate_fast()
+ * - Simplified bad distance check in inflate_fast()
+ * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new
+ *   source file infback.c to provide a call-back interface to inflate for
+ *   programs like gzip and unzip -- uses window as output buffer to avoid
+ *   window copying
+ *
+ * 1.2.beta5    1 Jan 2003
+ * - Improved inflateBack() interface to allow the caller to provide initial
+ *   input in strm.
+ * - Fixed stored blocks bug in inflateBack()
+ *
+ * 1.2.beta6    4 Jan 2003
+ * - Added comments in inffast.c on effectiveness of POSTINC
+ * - Typecasting all around to reduce compiler warnings
+ * - Changed loops from while (1) or do {} while (1) to for (;;), again to
+ *   make compilers happy
+ * - Changed type of window in inflateBackInit() to unsigned char *
+ *
+ * 1.2.beta7    27 Jan 2003
+ * - Changed many types to unsigned or unsigned short to avoid warnings
+ * - Added inflateCopy() function
+ *
+ * 1.2.0        9 Mar 2003
+ * - Changed inflateBack() interface to provide separate opaque descriptors
+ *   for the in() and out() functions
+ * - Changed inflateBack() argument and in_func typedef to swap the length
+ *   and buffer address return values for the input function
+ * - Check next_in and next_out for Z_NULL on entry to inflate()
+ *
+ * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+#ifdef MAKEFIXED
+#  ifndef BUILDFIXED
+#    define BUILDFIXED
+#  endif
+#endif
+
+/* function prototypes */
+local void fixedtables OF((struct inflate_state FAR *state));
+local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,
+                           unsigned copy));
+#ifdef BUILDFIXED
+   void makefixed OF((void));
+#endif
+local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf,
+                              unsigned len));
+
+int ZEXPORT inflateResetKeep(
+z_streamp strm)
+{
+    struct inflate_state FAR *state;
+
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)strm->state;
+    strm->total_in = strm->total_out = state->total = 0;
+    strm->msg = Z_NULL;
+    if (state->wrap)        /* to support ill-conceived Java test suite */
+        strm->adler = state->wrap & 1;
+    state->mode = HEAD;
+    state->last = 0;
+    state->havedict = 0;
+    state->dmax = 32768U;
+    state->head = Z_NULL;
+    state->hold = 0;
+    state->bits = 0;
+    state->lencode = state->distcode = state->next = state->codes;
+    state->sane = 1;
+    state->back = -1;
+    Tracev((stderr, "inflate: reset\n"));
+    return Z_OK;
+}
+
+int ZEXPORT inflateReset(
+z_streamp strm)
+{
+    struct inflate_state FAR *state;
+
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)strm->state;
+    state->wsize = 0;
+    state->whave = 0;
+    state->wnext = 0;
+    return inflateResetKeep(strm);
+}
+
+int ZEXPORT inflateReset2(
+z_streamp strm,
+int windowBits)
+{
+    int wrap;
+    struct inflate_state FAR *state;
+
+    /* get the state */
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)strm->state;
+
+    /* extract wrap request from windowBits parameter */
+    if (windowBits < 0) {
+        wrap = 0;
+        windowBits = -windowBits;
+    }
+    else {
+        wrap = (windowBits >> 4) + 1;
+#ifdef GUNZIP
+        if (windowBits < 48)
+            windowBits &= 15;
+#endif
+    }
+
+    /* set number of window bits, free window if different */
+    if (windowBits && (windowBits < 8 || windowBits > 15))
+        return Z_STREAM_ERROR;
+    if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) {
+        ZFREE(strm, state->window);
+        state->window = Z_NULL;
+    }
+
+    /* update state and reset the rest of it */
+    state->wrap = wrap;
+    state->wbits = (unsigned)windowBits;
+    return inflateReset(strm);
+}
+
+int ZEXPORT inflateInit2_(
+z_streamp strm,
+int windowBits,
+const char *version,
+int stream_size)
+{
+    int ret;
+    struct inflate_state FAR *state;
+
+    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+        stream_size != (int)(sizeof(z_stream)))
+        return Z_VERSION_ERROR;
+    if (strm == Z_NULL) return Z_STREAM_ERROR;
+    strm->msg = Z_NULL;                 /* in case we return an error */
+    if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+        return Z_STREAM_ERROR;
+#else
+        strm->zalloc = zcalloc;
+        strm->opaque = (voidpf)0;
+#endif
+    }
+    if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+        return Z_STREAM_ERROR;
+#else
+        strm->zfree = zcfree;
+#endif
+    state = (struct inflate_state FAR *)
+            ZALLOC(strm, 1, sizeof(struct inflate_state));
+    if (state == Z_NULL) return Z_MEM_ERROR;
+    Tracev((stderr, "inflate: allocated\n"));
+    strm->state = (struct internal_state FAR *)state;
+    state->window = Z_NULL;
+    ret = inflateReset2(strm, windowBits);
+    if (ret != Z_OK) {
+        ZFREE(strm, state);
+        strm->state = Z_NULL;
+    }
+    return ret;
+}
+
+int ZEXPORT inflateInit_(
+z_streamp strm,
+const char *version,
+int stream_size)
+{
+    return inflateInit2_(strm, DEF_WBITS, version, stream_size);
+}
+
+int ZEXPORT inflatePrime(
+z_streamp strm,
+int bits,
+int value)
+{
+    struct inflate_state FAR *state;
+
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)strm->state;
+    if (bits < 0) {
+        state->hold = 0;
+        state->bits = 0;
+        return Z_OK;
+    }
+    if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR;
+    value &= (1L << bits) - 1;
+    state->hold += value << state->bits;
+    state->bits += bits;
+    return Z_OK;
+}
+
+/*
+   Return state with length and distance decoding tables and index sizes set to
+   fixed code decoding.  Normally this returns fixed tables from inffixed.h.
+   If BUILDFIXED is defined, then instead this routine builds the tables the
+   first time it's called, and returns those tables the first time and
+   thereafter.  This reduces the size of the code by about 2K bytes, in
+   exchange for a little execution time.  However, BUILDFIXED should not be
+   used for threaded applications, since the rewriting of the tables and virgin
+   may not be thread-safe.
+ */
+local void fixedtables(
+struct inflate_state FAR *state)
+{
+#ifdef BUILDFIXED
+    static int virgin = 1;
+    static code *lenfix, *distfix;
+    static code fixed[544];
+
+    /* build fixed huffman tables if first call (may not be thread safe) */
+    if (virgin) {
+        unsigned sym, bits;
+        static code *next;
+
+        /* literal/length table */
+        sym = 0;
+        while (sym < 144) state->lens[sym++] = 8;
+        while (sym < 256) state->lens[sym++] = 9;
+        while (sym < 280) state->lens[sym++] = 7;
+        while (sym < 288) state->lens[sym++] = 8;
+        next = fixed;
+        lenfix = next;
+        bits = 9;
+        inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
+
+        /* distance table */
+        sym = 0;
+        while (sym < 32) state->lens[sym++] = 5;
+        distfix = next;
+        bits = 5;
+        inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
+
+        /* do this just once */
+        virgin = 0;
+    }
+#else /* !BUILDFIXED */
+#   include "inffixed.h"
+#endif /* BUILDFIXED */
+    state->lencode = lenfix;
+    state->lenbits = 9;
+    state->distcode = distfix;
+    state->distbits = 5;
+}
+
+#ifdef MAKEFIXED
+#include <stdio.h>
+
+/*
+   Write out the inffixed.h that is #include'd above.  Defining MAKEFIXED also
+   defines BUILDFIXED, so the tables are built on the fly.  makefixed() writes
+   those tables to stdout, which would be piped to inffixed.h.  A small program
+   can simply call makefixed to do this:
+
+    void makefixed(void);
+
+    int main(void)
+    {
+        makefixed();
+        return 0;
+    }
+
+   Then that can be linked with zlib built with MAKEFIXED defined and run:
+
+    a.out > inffixed.h
+ */
+void makefixed()
+{
+    unsigned low, size;
+    struct inflate_state state;
+
+    fixedtables(&state);
+    puts("    /* inffixed.h -- table for decoding fixed codes");
+    puts("     * Generated automatically by makefixed().");
+    puts("     */");
+    puts("");
+    puts("    /* WARNING: this file should *not* be used by applications.");
+    puts("       It is part of the implementation of this library and is");
+    puts("       subject to change. Applications should only use zlib.h.");
+    puts("     */");
+    puts("");
+    size = 1U << 9;
+    printf("    static const code lenfix[%u] = {", size);
+    low = 0;
+    for (;;) {
+        if ((low % 7) == 0) printf("\n        ");
+        printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,
+               state.lencode[low].bits, state.lencode[low].val);
+        if (++low == size) break;
+        putchar(',');
+    }
+    puts("\n    };");
+    size = 1U << 5;
+    printf("\n    static const code distfix[%u] = {", size);
+    low = 0;
+    for (;;) {
+        if ((low % 6) == 0) printf("\n        ");
+        printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
+               state.distcode[low].val);
+        if (++low == size) break;
+        putchar(',');
+    }
+    puts("\n    };");
+}
+#endif /* MAKEFIXED */
+
+/*
+   Update the window with the last wsize (normally 32K) bytes written before
+   returning.  If window does not exist yet, create it.  This is only called
+   when a window is already in use, or when output has been written during this
+   inflate call, but the end of the deflate stream has not been reached yet.
+   It is also called to create a window for dictionary data when a dictionary
+   is loaded.
+
+   Providing output buffers larger than 32K to inflate() should provide a speed
+   advantage, since only the last 32K of output is copied to the sliding window
+   upon return from inflate(), and since all distances after the first 32K of
+   output will fall in the output data, making match copies simpler and faster.
+   The advantage may be dependent on the size of the processor's data caches.
+ */
+local int updatewindow(
+z_streamp strm,
+const Bytef *end,
+unsigned copy)
+{
+    struct inflate_state FAR *state;
+    unsigned dist;
+
+    state = (struct inflate_state FAR *)strm->state;
+
+    /* if it hasn't been done already, allocate space for the window */
+    if (state->window == Z_NULL) {
+        state->window = (unsigned char FAR *)
+                        ZALLOC(strm, 1U << state->wbits,
+                               sizeof(unsigned char));
+        if (state->window == Z_NULL) return 1;
+    }
+
+    /* if window not in use yet, initialize */
+    if (state->wsize == 0) {
+        state->wsize = 1U << state->wbits;
+        state->wnext = 0;
+        state->whave = 0;
+    }
+
+    /* copy state->wsize or less output bytes into the circular window */
+    if (copy >= state->wsize) {
+        zmemcpy(state->window, end - state->wsize, state->wsize);
+        state->wnext = 0;
+        state->whave = state->wsize;
+    }
+    else {
+        dist = state->wsize - state->wnext;
+        if (dist > copy) dist = copy;
+        zmemcpy(state->window + state->wnext, end - copy, dist);
+        copy -= dist;
+        if (copy) {
+            zmemcpy(state->window, end - copy, copy);
+            state->wnext = copy;
+            state->whave = state->wsize;
+        }
+        else {
+            state->wnext += dist;
+            if (state->wnext == state->wsize) state->wnext = 0;
+            if (state->whave < state->wsize) state->whave += dist;
+        }
+    }
+    return 0;
+}
+
+/* Macros for inflate(): */
+
+/* check function to use adler32() for zlib or crc32() for gzip */
+#ifdef GUNZIP
+#  define UPDATE(check, buf, len) \
+    (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
+#else
+#  define UPDATE(check, buf, len) adler32(check, buf, len)
+#endif
+
+/* check macros for header crc */
+#ifdef GUNZIP
+#  define CRC2(check, word) \
+    do { \
+        hbuf[0] = (unsigned char)(word); \
+        hbuf[1] = (unsigned char)((word) >> 8); \
+        check = crc32(check, hbuf, 2); \
+    } while (0)
+
+#  define CRC4(check, word) \
+    do { \
+        hbuf[0] = (unsigned char)(word); \
+        hbuf[1] = (unsigned char)((word) >> 8); \
+        hbuf[2] = (unsigned char)((word) >> 16); \
+        hbuf[3] = (unsigned char)((word) >> 24); \
+        check = crc32(check, hbuf, 4); \
+    } while (0)
+#endif
+
+/* Load registers with state in inflate() for speed */
+#define LOAD() \
+    do { \
+        put = strm->next_out; \
+        left = strm->avail_out; \
+        next = strm->next_in; \
+        have = strm->avail_in; \
+        hold = state->hold; \
+        bits = state->bits; \
+    } while (0)
+
+/* Restore state from registers in inflate() */
+#define RESTORE() \
+    do { \
+        strm->next_out = put; \
+        strm->avail_out = left; \
+        strm->next_in = next; \
+        strm->avail_in = have; \
+        state->hold = hold; \
+        state->bits = bits; \
+    } while (0)
+
+/* Clear the input bit accumulator */
+#define INITBITS() \
+    do { \
+        hold = 0; \
+        bits = 0; \
+    } while (0)
+
+/* Get a byte of input into the bit accumulator, or return from inflate()
+   if there is no input available. */
+#define PULLBYTE() \
+    do { \
+        if (have == 0) goto inf_leave; \
+        have--; \
+        hold += (unsigned long)(*next++) << bits; \
+        bits += 8; \
+    } while (0)
+
+/* Assure that there are at least n bits in the bit accumulator.  If there is
+   not enough available input to do that, then return from inflate(). */
+#define NEEDBITS(n) \
+    do { \
+        while (bits < (unsigned)(n)) \
+            PULLBYTE(); \
+    } while (0)
+
+/* Return the low n bits of the bit accumulator (n < 16) */
+#define BITS(n) \
+    ((unsigned)hold & ((1U << (n)) - 1))
+
+/* Remove n bits from the bit accumulator */
+#define DROPBITS(n) \
+    do { \
+        hold >>= (n); \
+        bits -= (unsigned)(n); \
+    } while (0)
+
+/* Remove zero to seven bits as needed to go to a byte boundary */
+#define BYTEBITS() \
+    do { \
+        hold >>= bits & 7; \
+        bits -= bits & 7; \
+    } while (0)
+
+/*
+   inflate() uses a state machine to process as much input data and generate as
+   much output data as possible before returning.  The state machine is
+   structured roughly as follows:
+
+    for (;;) switch (state) {
+    ...
+    case STATEn:
+        if (not enough input data or output space to make progress)
+            return;
+        ... make progress ...
+        state = STATEm;
+        break;
+    ...
+    }
+
+   so when inflate() is called again, the same case is attempted again, and
+   if the appropriate resources are provided, the machine proceeds to the
+   next state.  The NEEDBITS() macro is usually the way the state evaluates
+   whether it can proceed or should return.  NEEDBITS() does the return if
+   the requested bits are not available.  The typical use of the BITS macros
+   is:
+
+        NEEDBITS(n);
+        ... do something with BITS(n) ...
+        DROPBITS(n);
+
+   where NEEDBITS(n) either returns from inflate() if there isn't enough
+   input left to load n bits into the accumulator, or it continues.  BITS(n)
+   gives the low n bits in the accumulator.  When done, DROPBITS(n) drops
+   the low n bits off the accumulator.  INITBITS() clears the accumulator
+   and sets the number of available bits to zero.  BYTEBITS() discards just
+   enough bits to put the accumulator on a byte boundary.  After BYTEBITS()
+   and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
+
+   NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
+   if there is no input available.  The decoding of variable length codes uses
+   PULLBYTE() directly in order to pull just enough bytes to decode the next
+   code, and no more.
+
+   Some states loop until they get enough input, making sure that enough
+   state information is maintained to continue the loop where it left off
+   if NEEDBITS() returns in the loop.  For example, want, need, and keep
+   would all have to actually be part of the saved state in case NEEDBITS()
+   returns:
+
+    case STATEw:
+        while (want < need) {
+            NEEDBITS(n);
+            keep[want++] = BITS(n);
+            DROPBITS(n);
+        }
+        state = STATEx;
+    case STATEx:
+
+   As shown above, if the next state is also the next case, then the break
+   is omitted.
+
+   A state may also return if there is not enough output space available to
+   complete that state.  Those states are copying stored data, writing a
+   literal byte, and copying a matching string.
+
+   When returning, a "goto inf_leave" is used to update the total counters,
+   update the check value, and determine whether any progress has been made
+   during that inflate() call in order to return the proper return code.
+   Progress is defined as a change in either strm->avail_in or strm->avail_out.
+   When there is a window, goto inf_leave will update the window with the last
+   output written.  If a goto inf_leave occurs in the middle of decompression
+   and there is no window currently, goto inf_leave will create one and copy
+   output to the window for the next call of inflate().
+
+   In this implementation, the flush parameter of inflate() only affects the
+   return code (per zlib.h).  inflate() always writes as much as possible to
+   strm->next_out, given the space available and the provided input--the effect
+   documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers
+   the allocation of and copying into a sliding window until necessary, which
+   provides the effect documented in zlib.h for Z_FINISH when the entire input
+   stream available.  So the only thing the flush parameter actually does is:
+   when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it
+   will return Z_BUF_ERROR if it has not reached the end of the stream.
+ */
+
+int ZEXPORT inflate(
+z_streamp strm,
+int flush)
+{
+    struct inflate_state FAR *state;
+    z_const unsigned char FAR *next;    /* next input */
+    unsigned char FAR *put;     /* next output */
+    unsigned have, left;        /* available input and output */
+    unsigned long hold;         /* bit buffer */
+    unsigned bits;              /* bits in bit buffer */
+    unsigned in, out;           /* save starting available input and output */
+    unsigned copy;              /* number of stored or match bytes to copy */
+    unsigned char FAR *from;    /* where to copy match bytes from */
+    code here;                  /* current decoding table entry */
+    code last;                  /* parent table entry */
+    unsigned len;               /* length to copy for repeats, bits to drop */
+    int ret;                    /* return code */
+#ifdef GUNZIP
+    unsigned char hbuf[4];      /* buffer for gzip header crc calculation */
+#endif
+    static const unsigned short order[19] = /* permutation of code lengths */
+        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+    if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL ||
+        (strm->next_in == Z_NULL && strm->avail_in != 0))
+        return Z_STREAM_ERROR;
+
+    state = (struct inflate_state FAR *)strm->state;
+    if (state->mode == TYPE) state->mode = TYPEDO;      /* skip check */
+    LOAD();
+    in = have;
+    out = left;
+    ret = Z_OK;
+    for (;;)
+        switch (state->mode) {
+        case HEAD:
+            if (state->wrap == 0) {
+                state->mode = TYPEDO;
+                break;
+            }
+            NEEDBITS(16);
+#ifdef GUNZIP
+            if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */
+                state->check = crc32(0L, Z_NULL, 0);
+                CRC2(state->check, hold);
+                INITBITS();
+                state->mode = FLAGS;
+                break;
+            }
+            state->flags = 0;           /* expect zlib header */
+            if (state->head != Z_NULL)
+                state->head->done = -1;
+            if (!(state->wrap & 1) ||   /* check if zlib header allowed */
+#else
+            if (
+#endif
+                ((BITS(8) << 8) + (hold >> 8)) % 31) {
+                strm->msg = (char *)"incorrect header check";
+                state->mode = BAD;
+                break;
+            }
+            if (BITS(4) != Z_DEFLATED) {
+                strm->msg = (char *)"unknown compression method";
+                state->mode = BAD;
+                break;
+            }
+            DROPBITS(4);
+            len = BITS(4) + 8;
+            if (state->wbits == 0)
+                state->wbits = len;
+            else if (len > state->wbits) {
+                strm->msg = (char *)"invalid window size";
+                state->mode = BAD;
+                break;
+            }
+            state->dmax = 1U << len;
+            Tracev((stderr, "inflate:   zlib header ok\n"));
+            strm->adler = state->check = adler32(0L, Z_NULL, 0);
+            state->mode = hold & 0x200 ? DICTID : TYPE;
+            INITBITS();
+            break;
+#ifdef GUNZIP
+        case FLAGS:
+            NEEDBITS(16);
+            state->flags = (int)(hold);
+            if ((state->flags & 0xff) != Z_DEFLATED) {
+                strm->msg = (char *)"unknown compression method";
+                state->mode = BAD;
+                break;
+            }
+            if (state->flags & 0xe000) {
+                strm->msg = (char *)"unknown header flags set";
+                state->mode = BAD;
+                break;
+            }
+            if (state->head != Z_NULL)
+                state->head->text = (int)((hold >> 8) & 1);
+            if (state->flags & 0x0200) CRC2(state->check, hold);
+            INITBITS();
+            state->mode = TIME;
+        case TIME:
+            NEEDBITS(32);
+            if (state->head != Z_NULL)
+                state->head->time = hold;
+            if (state->flags & 0x0200) CRC4(state->check, hold);
+            INITBITS();
+            state->mode = OS;
+        case OS:
+            NEEDBITS(16);
+            if (state->head != Z_NULL) {
+                state->head->xflags = (int)(hold & 0xff);
+                state->head->os = (int)(hold >> 8);
+            }
+            if (state->flags & 0x0200) CRC2(state->check, hold);
+            INITBITS();
+            state->mode = EXLEN;
+        case EXLEN:
+            if (state->flags & 0x0400) {
+                NEEDBITS(16);
+                state->length = (unsigned)(hold);
+                if (state->head != Z_NULL)
+                    state->head->extra_len = (unsigned)hold;
+                if (state->flags & 0x0200) CRC2(state->check, hold);
+                INITBITS();
+            }
+            else if (state->head != Z_NULL)
+                state->head->extra = Z_NULL;
+            state->mode = EXTRA;
+        case EXTRA:
+            if (state->flags & 0x0400) {
+                copy = state->length;
+                if (copy > have) copy = have;
+                if (copy) {
+                    if (state->head != Z_NULL &&
+                        state->head->extra != Z_NULL) {
+                        len = state->head->extra_len - state->length;
+                        zmemcpy(state->head->extra + len, next,
+                                len + copy > state->head->extra_max ?
+                                state->head->extra_max - len : copy);
+                    }
+                    if (state->flags & 0x0200)
+                        state->check = crc32(state->check, next, copy);
+                    have -= copy;
+                    next += copy;
+                    state->length -= copy;
+                }
+                if (state->length) goto inf_leave;
+            }
+            state->length = 0;
+            state->mode = NAME;
+        case NAME:
+            if (state->flags & 0x0800) {
+                if (have == 0) goto inf_leave;
+                copy = 0;
+                do {
+                    len = (unsigned)(next[copy++]);
+                    if (state->head != Z_NULL &&
+                            state->head->name != Z_NULL &&
+                            state->length < state->head->name_max)
+                        state->head->name[state->length++] = len;
+                } while (len && copy < have);
+                if (state->flags & 0x0200)
+                    state->check = crc32(state->check, next, copy);
+                have -= copy;
+                next += copy;
+                if (len) goto inf_leave;
+            }
+            else if (state->head != Z_NULL)
+                state->head->name = Z_NULL;
+            state->length = 0;
+            state->mode = COMMENT;
+        case COMMENT:
+            if (state->flags & 0x1000) {
+                if (have == 0) goto inf_leave;
+                copy = 0;
+                do {
+                    len = (unsigned)(next[copy++]);
+                    if (state->head != Z_NULL &&
+                            state->head->comment != Z_NULL &&
+                            state->length < state->head->comm_max)
+                        state->head->comment[state->length++] = len;
+                } while (len && copy < have);
+                if (state->flags & 0x0200)
+                    state->check = crc32(state->check, next, copy);
+                have -= copy;
+                next += copy;
+                if (len) goto inf_leave;
+            }
+            else if (state->head != Z_NULL)
+                state->head->comment = Z_NULL;
+            state->mode = HCRC;
+        case HCRC:
+            if (state->flags & 0x0200) {
+                NEEDBITS(16);
+                if (hold != (state->check & 0xffff)) {
+                    strm->msg = (char *)"header crc mismatch";
+                    state->mode = BAD;
+                    break;
+                }
+                INITBITS();
+            }
+            if (state->head != Z_NULL) {
+                state->head->hcrc = (int)((state->flags >> 9) & 1);
+                state->head->done = 1;
+            }
+            strm->adler = state->check = crc32(0L, Z_NULL, 0);
+            state->mode = TYPE;
+            break;
+#endif
+        case DICTID:
+            NEEDBITS(32);
+            strm->adler = state->check = ZSWAP32(hold);
+            INITBITS();
+            state->mode = DICT;
+        case DICT:
+            if (state->havedict == 0) {
+                RESTORE();
+                return Z_NEED_DICT;
+            }
+            strm->adler = state->check = adler32(0L, Z_NULL, 0);
+            state->mode = TYPE;
+        case TYPE:
+            if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
+        case TYPEDO:
+            if (state->last) {
+                BYTEBITS();
+                state->mode = CHECK;
+                break;
+            }
+            NEEDBITS(3);
+            state->last = BITS(1);
+            DROPBITS(1);
+            switch (BITS(2)) {
+            case 0:                             /* stored block */
+                Tracev((stderr, "inflate:     stored block%s\n",
+                        state->last ? " (last)" : ""));
+                state->mode = STORED;
+                break;
+            case 1:                             /* fixed block */
+                fixedtables(state);
+                Tracev((stderr, "inflate:     fixed codes block%s\n",
+                        state->last ? " (last)" : ""));
+                state->mode = LEN_;             /* decode codes */
+                if (flush == Z_TREES) {
+                    DROPBITS(2);
+                    goto inf_leave;
+                }
+                break;
+            case 2:                             /* dynamic block */
+                Tracev((stderr, "inflate:     dynamic codes block%s\n",
+                        state->last ? " (last)" : ""));
+                state->mode = TABLE;
+                break;
+            case 3:
+                strm->msg = (char *)"invalid block type";
+                state->mode = BAD;
+            }
+            DROPBITS(2);
+            break;
+        case STORED:
+            BYTEBITS();                         /* go to byte boundary */
+            NEEDBITS(32);
+            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
+                strm->msg = (char *)"invalid stored block lengths";
+                state->mode = BAD;
+                break;
+            }
+            state->length = (unsigned)hold & 0xffff;
+            Tracev((stderr, "inflate:       stored length %u\n",
+                    state->length));
+            INITBITS();
+            state->mode = COPY_;
+            if (flush == Z_TREES) goto inf_leave;
+        case COPY_:
+            state->mode = COPY;
+        case COPY:
+            copy = state->length;
+            if (copy) {
+                if (copy > have) copy = have;
+                if (copy > left) copy = left;
+                if (copy == 0) goto inf_leave;
+                zmemcpy(put, next, copy);
+                have -= copy;
+                next += copy;
+                left -= copy;
+                put += copy;
+                state->length -= copy;
+                break;
+            }
+            Tracev((stderr, "inflate:       stored end\n"));
+            state->mode = TYPE;
+            break;
+        case TABLE:
+            NEEDBITS(14);
+            state->nlen = BITS(5) + 257;
+            DROPBITS(5);
+            state->ndist = BITS(5) + 1;
+            DROPBITS(5);
+            state->ncode = BITS(4) + 4;
+            DROPBITS(4);
+#ifndef PKZIP_BUG_WORKAROUND
+            if (state->nlen > 286 || state->ndist > 30) {
+                strm->msg = (char *)"too many length or distance symbols";
+                state->mode = BAD;
+                break;
+            }
+#endif
+            Tracev((stderr, "inflate:       table sizes ok\n"));
+            state->have = 0;
+            state->mode = LENLENS;
+        case LENLENS:
+            while (state->have < state->ncode) {
+                NEEDBITS(3);
+                state->lens[order[state->have++]] = (unsigned short)BITS(3);
+                DROPBITS(3);
+            }
+            while (state->have < 19)
+                state->lens[order[state->have++]] = 0;
+            state->next = state->codes;
+            state->lencode = (const code FAR *)(state->next);
+            state->lenbits = 7;
+            ret = inflate_table(CODES, state->lens, 19, &(state->next),
+                                &(state->lenbits), state->work);
+            if (ret) {
+                strm->msg = (char *)"invalid code lengths set";
+                state->mode = BAD;
+                break;
+            }
+            Tracev((stderr, "inflate:       code lengths ok\n"));
+            state->have = 0;
+            state->mode = CODELENS;
+        case CODELENS:
+            while (state->have < state->nlen + state->ndist) {
+                for (;;) {
+                    here = state->lencode[BITS(state->lenbits)];
+                    if ((unsigned)(here.bits) <= bits) break;
+                    PULLBYTE();
+                }
+                if (here.val < 16) {
+                    DROPBITS(here.bits);
+                    state->lens[state->have++] = here.val;
+                }
+                else {
+                    if (here.val == 16) {
+                        NEEDBITS(here.bits + 2);
+                        DROPBITS(here.bits);
+                        if (state->have == 0) {
+                            strm->msg = (char *)"invalid bit length repeat";
+                            state->mode = BAD;
+                            break;
+                        }
+                        len = state->lens[state->have - 1];
+                        copy = 3 + BITS(2);
+                        DROPBITS(2);
+                    }
+                    else if (here.val == 17) {
+                        NEEDBITS(here.bits + 3);
+                        DROPBITS(here.bits);
+                        len = 0;
+                        copy = 3 + BITS(3);
+                        DROPBITS(3);
+                    }
+                    else {
+                        NEEDBITS(here.bits + 7);
+                        DROPBITS(here.bits);
+                        len = 0;
+                        copy = 11 + BITS(7);
+                        DROPBITS(7);
+                    }
+                    if (state->have + copy > state->nlen + state->ndist) {
+                        strm->msg = (char *)"invalid bit length repeat";
+                        state->mode = BAD;
+                        break;
+                    }
+                    while (copy--)
+                        state->lens[state->have++] = (unsigned short)len;
+                }
+            }
+
+            /* handle error breaks in while */
+            if (state->mode == BAD) break;
+
+            /* check for end-of-block code (better have one) */
+            if (state->lens[256] == 0) {
+                strm->msg = (char *)"invalid code -- missing end-of-block";
+                state->mode = BAD;
+                break;
+            }
+
+            /* build code tables -- note: do not change the lenbits or distbits
+               values here (9 and 6) without reading the comments in inftrees.h
+               concerning the ENOUGH constants, which depend on those values */
+            state->next = state->codes;
+            state->lencode = (const code FAR *)(state->next);
+            state->lenbits = 9;
+            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
+                                &(state->lenbits), state->work);
+            if (ret) {
+                strm->msg = (char *)"invalid literal/lengths set";
+                state->mode = BAD;
+                break;
+            }
+            state->distcode = (const code FAR *)(state->next);
+            state->distbits = 6;
+            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
+                            &(state->next), &(state->distbits), state->work);
+            if (ret) {
+                strm->msg = (char *)"invalid distances set";
+                state->mode = BAD;
+                break;
+            }
+            Tracev((stderr, "inflate:       codes ok\n"));
+            state->mode = LEN_;
+            if (flush == Z_TREES) goto inf_leave;
+        case LEN_:
+            state->mode = LEN;
+        case LEN:
+            if (have >= 6 && left >= 258) {
+                RESTORE();
+                inflate_fast(strm, out);
+                LOAD();
+                if (state->mode == TYPE)
+                    state->back = -1;
+                break;
+            }
+            state->back = 0;
+            for (;;) {
+                here = state->lencode[BITS(state->lenbits)];
+                if ((unsigned)(here.bits) <= bits) break;
+                PULLBYTE();
+            }
+            if (here.op && (here.op & 0xf0) == 0) {
+                last = here;
+                for (;;) {
+                    here = state->lencode[last.val +
+                            (BITS(last.bits + last.op) >> last.bits)];
+                    if ((unsigned)(last.bits + here.bits) <= bits) break;
+                    PULLBYTE();
+                }
+                DROPBITS(last.bits);
+                state->back += last.bits;
+            }
+            DROPBITS(here.bits);
+            state->back += here.bits;
+            state->length = (unsigned)here.val;
+            if ((int)(here.op) == 0) {
+                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+                        "inflate:         literal '%c'\n" :
+                        "inflate:         literal 0x%02x\n", here.val));
+                state->mode = LIT;
+                break;
+            }
+            if (here.op & 32) {
+                Tracevv((stderr, "inflate:         end of block\n"));
+                state->back = -1;
+                state->mode = TYPE;
+                break;
+            }
+            if (here.op & 64) {
+                strm->msg = (char *)"invalid literal/length code";
+                state->mode = BAD;
+                break;
+            }
+            state->extra = (unsigned)(here.op) & 15;
+            state->mode = LENEXT;
+        case LENEXT:
+            if (state->extra) {
+                NEEDBITS(state->extra);
+                state->length += BITS(state->extra);
+                DROPBITS(state->extra);
+                state->back += state->extra;
+            }
+            Tracevv((stderr, "inflate:         length %u\n", state->length));
+            state->was = state->length;
+            state->mode = DIST;
+        case DIST:
+            for (;;) {
+                here = state->distcode[BITS(state->distbits)];
+                if ((unsigned)(here.bits) <= bits) break;
+                PULLBYTE();
+            }
+            if ((here.op & 0xf0) == 0) {
+                last = here;
+                for (;;) {
+                    here = state->distcode[last.val +
+                            (BITS(last.bits + last.op) >> last.bits)];
+                    if ((unsigned)(last.bits + here.bits) <= bits) break;
+                    PULLBYTE();
+                }
+                DROPBITS(last.bits);
+                state->back += last.bits;
+            }
+            DROPBITS(here.bits);
+            state->back += here.bits;
+            if (here.op & 64) {
+                strm->msg = (char *)"invalid distance code";
+                state->mode = BAD;
+                break;
+            }
+            state->offset = (unsigned)here.val;
+            state->extra = (unsigned)(here.op) & 15;
+            state->mode = DISTEXT;
+        case DISTEXT:
+            if (state->extra) {
+                NEEDBITS(state->extra);
+                state->offset += BITS(state->extra);
+                DROPBITS(state->extra);
+                state->back += state->extra;
+            }
+#ifdef INFLATE_STRICT
+            if (state->offset > state->dmax) {
+                strm->msg = (char *)"invalid distance too far back";
+                state->mode = BAD;
+                break;
+            }
+#endif
+            Tracevv((stderr, "inflate:         distance %u\n", state->offset));
+            state->mode = MATCH;
+        case MATCH:
+            if (left == 0) goto inf_leave;
+            copy = out - left;
+            if (state->offset > copy) {         /* copy from window */
+                copy = state->offset - copy;
+                if (copy > state->whave) {
+                    if (state->sane) {
+                        strm->msg = (char *)"invalid distance too far back";
+                        state->mode = BAD;
+                        break;
+                    }
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+                    Trace((stderr, "inflate.c too far\n"));
+                    copy -= state->whave;
+                    if (copy > state->length) copy = state->length;
+                    if (copy > left) copy = left;
+                    left -= copy;
+                    state->length -= copy;
+                    do {
+                        *put++ = 0;
+                    } while (--copy);
+                    if (state->length == 0) state->mode = LEN;
+                    break;
+#endif
+                }
+                if (copy > state->wnext) {
+                    copy -= state->wnext;
+                    from = state->window + (state->wsize - copy);
+                }
+                else
+                    from = state->window + (state->wnext - copy);
+                if (copy > state->length) copy = state->length;
+            }
+            else {                              /* copy from output */
+                from = put - state->offset;
+                copy = state->length;
+            }
+            if (copy > left) copy = left;
+            left -= copy;
+            state->length -= copy;
+            do {
+                *put++ = *from++;
+            } while (--copy);
+            if (state->length == 0) state->mode = LEN;
+            break;
+        case LIT:
+            if (left == 0) goto inf_leave;
+            *put++ = (unsigned char)(state->length);
+            left--;
+            state->mode = LEN;
+            break;
+        case CHECK:
+            if (state->wrap) {
+                NEEDBITS(32);
+                out -= left;
+                strm->total_out += out;
+                state->total += out;
+                if (out)
+                    strm->adler = state->check =
+                        UPDATE(state->check, put - out, out);
+                out = left;
+                if ((
+#ifdef GUNZIP
+                     state->flags ? hold :
+#endif
+                     ZSWAP32(hold)) != state->check) {
+                    strm->msg = (char *)"incorrect data check";
+                    state->mode = BAD;
+                    break;
+                }
+                INITBITS();
+                Tracev((stderr, "inflate:   check matches trailer\n"));
+            }
+#ifdef GUNZIP
+            state->mode = LENGTH;
+        case LENGTH:
+            if (state->wrap && state->flags) {
+                NEEDBITS(32);
+                if (hold != (state->total & 0xffffffffUL)) {
+                    strm->msg = (char *)"incorrect length check";
+                    state->mode = BAD;
+                    break;
+                }
+                INITBITS();
+                Tracev((stderr, "inflate:   length matches trailer\n"));
+            }
+#endif
+            state->mode = DONE;
+        case DONE:
+            ret = Z_STREAM_END;
+            goto inf_leave;
+        case BAD:
+            ret = Z_DATA_ERROR;
+            goto inf_leave;
+        case MEM:
+            return Z_MEM_ERROR;
+        case SYNC:
+        default:
+            return Z_STREAM_ERROR;
+        }
+
+    /*
+       Return from inflate(), updating the total counts and the check value.
+       If there was no progress during the inflate() call, return a buffer
+       error.  Call updatewindow() to create and/or update the window state.
+       Note: a memory error from inflate() is non-recoverable.
+     */
+  inf_leave:
+    RESTORE();
+    if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
+            (state->mode < CHECK || flush != Z_FINISH)))
+        if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {
+            state->mode = MEM;
+            return Z_MEM_ERROR;
+        }
+    in -= strm->avail_in;
+    out -= strm->avail_out;
+    strm->total_in += in;
+    strm->total_out += out;
+    state->total += out;
+    if (state->wrap && out)
+        strm->adler = state->check =
+            UPDATE(state->check, strm->next_out - out, out);
+    strm->data_type = state->bits + (state->last ? 64 : 0) +
+                      (state->mode == TYPE ? 128 : 0) +
+                      (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
+    if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
+        ret = Z_BUF_ERROR;
+    return ret;
+}
+
+int ZEXPORT inflateEnd(
+z_streamp strm)
+{
+    struct inflate_state FAR *state;
+    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
+        return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)strm->state;
+    if (state->window != Z_NULL) ZFREE(strm, state->window);
+    ZFREE(strm, strm->state);
+    strm->state = Z_NULL;
+    Tracev((stderr, "inflate: end\n"));
+    return Z_OK;
+}
+
+int ZEXPORT inflateGetDictionary(
+z_streamp strm,
+Bytef *dictionary,
+uInt *dictLength)
+{
+    struct inflate_state FAR *state;
+
+    /* check state */
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)strm->state;
+
+    /* copy dictionary */
+    if (state->whave && dictionary != Z_NULL) {
+        zmemcpy(dictionary, state->window + state->wnext,
+                state->whave - state->wnext);
+        zmemcpy(dictionary + state->whave - state->wnext,
+                state->window, state->wnext);
+    }
+    if (dictLength != Z_NULL)
+        *dictLength = state->whave;
+    return Z_OK;
+}
+
+int ZEXPORT inflateSetDictionary(
+z_streamp strm,
+const Bytef *dictionary,
+uInt dictLength)
+{
+    struct inflate_state FAR *state;
+    unsigned long dictid;
+    int ret;
+
+    dictid = 0;
+    /* check state */
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)strm->state;
+    if (state->wrap != 0 && state->mode != DICT)
+        return Z_STREAM_ERROR;
+
+    /* check for correct dictionary identifier */
+    if (state->mode == DICT) {
+        dictid = adler32(0L, Z_NULL, 0);
+        dictid = adler32(dictid, dictionary, dictLength);
+        if (dictid != state->check)
+            return Z_DATA_ERROR;
+    }
+
+    /* copy dictionary to window using updatewindow(), which will amend the
+       existing dictionary if appropriate */
+    ret = updatewindow(strm, dictionary + dictLength, dictLength);
+    if (ret) {
+        state->mode = MEM;
+        return Z_MEM_ERROR;
+    }
+    state->havedict = 1;
+    Tracev((stderr, "inflate:   dictionary set\n"));
+    return Z_OK;
+}
+
+int ZEXPORT inflateGetHeader(
+z_streamp strm,
+gz_headerp head)
+{
+    struct inflate_state FAR *state;
+
+    /* check state */
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)strm->state;
+    if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
+
+    /* save header structure */
+    state->head = head;
+    head->done = 0;
+    return Z_OK;
+}
+
+/*
+   Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff.  Return when found
+   or when out of input.  When called, *have is the number of pattern bytes
+   found in order so far, in 0..3.  On return *have is updated to the new
+   state.  If on return *have equals four, then the pattern was found and the
+   return value is how many bytes were read including the last byte of the
+   pattern.  If *have is less than four, then the pattern has not been found
+   yet and the return value is len.  In the latter case, syncsearch() can be
+   called again with more data and the *have state.  *have is initialized to
+   zero for the first call.
+ */
+local unsigned syncsearch(
+unsigned FAR *have,
+const unsigned char FAR *buf,
+unsigned len)
+{
+    unsigned got;
+    unsigned next;
+
+    got = *have;
+    next = 0;
+    while (next < len && got < 4) {
+        if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
+            got++;
+        else if (buf[next])
+            got = 0;
+        else
+            got = 4 - got;
+        next++;
+    }
+    *have = got;
+    return next;
+}
+
+int ZEXPORT inflateSync(
+z_streamp strm)
+{
+    unsigned len;               /* number of bytes to look at or looked at */
+    unsigned long in, out;      /* temporary to save total_in and total_out */
+    unsigned char buf[4];       /* to restore bit buffer to byte string */
+    struct inflate_state FAR *state;
+
+    /* check parameters */
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)strm->state;
+    if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
+
+    /* if first time, start search in bit buffer */
+    if (state->mode != SYNC) {
+        state->mode = SYNC;
+        state->hold <<= state->bits & 7;
+        state->bits -= state->bits & 7;
+        len = 0;
+        while (state->bits >= 8) {
+            buf[len++] = (unsigned char)(state->hold);
+            state->hold >>= 8;
+            state->bits -= 8;
+        }
+        state->have = 0;
+        syncsearch(&(state->have), buf, len);
+    }
+
+    /* search available input */
+    len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
+    strm->avail_in -= len;
+    strm->next_in += len;
+    strm->total_in += len;
+
+    /* return no joy or set up to restart inflate() on a new block */
+    if (state->have != 4) return Z_DATA_ERROR;
+    in = strm->total_in;  out = strm->total_out;
+    inflateReset(strm);
+    strm->total_in = in;  strm->total_out = out;
+    state->mode = TYPE;
+    return Z_OK;
+}
+
+/*
+   Returns true if inflate is currently at the end of a block generated by
+   Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
+   implementation to provide an additional safety check. PPP uses
+   Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
+   block. When decompressing, PPP checks that at the end of input packet,
+   inflate is waiting for these length bytes.
+ */
+int ZEXPORT inflateSyncPoint(
+z_streamp strm)
+{
+    struct inflate_state FAR *state;
+
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)strm->state;
+    return state->mode == STORED && state->bits == 0;
+}
+
+int ZEXPORT inflateCopy(
+z_streamp dest,
+z_streamp source)
+{
+    struct inflate_state FAR *state;
+    struct inflate_state FAR *copy;
+    unsigned char FAR *window;
+    unsigned wsize;
+
+    /* check input */
+    if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||
+        source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)
+        return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)source->state;
+
+    /* allocate space */
+    copy = (struct inflate_state FAR *)
+           ZALLOC(source, 1, sizeof(struct inflate_state));
+    if (copy == Z_NULL) return Z_MEM_ERROR;
+    window = Z_NULL;
+    if (state->window != Z_NULL) {
+        window = (unsigned char FAR *)
+                 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
+        if (window == Z_NULL) {
+            ZFREE(source, copy);
+            return Z_MEM_ERROR;
+        }
+    }
+
+    /* copy state */
+    zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
+    zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));
+    if (state->lencode >= state->codes &&
+        state->lencode <= state->codes + ENOUGH - 1) {
+        copy->lencode = copy->codes + (state->lencode - state->codes);
+        copy->distcode = copy->codes + (state->distcode - state->codes);
+    }
+    copy->next = copy->codes + (state->next - state->codes);
+    if (window != Z_NULL) {
+        wsize = 1U << state->wbits;
+        zmemcpy(window, state->window, wsize);
+    }
+    copy->window = window;
+    dest->state = (struct internal_state FAR *)copy;
+    return Z_OK;
+}
+
+int ZEXPORT inflateUndermine(
+z_streamp strm,
+int subvert)
+{
+    struct inflate_state FAR *state;
+
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    state = (struct inflate_state FAR *)strm->state;
+    state->sane = !subvert;
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+    return Z_OK;
+#else
+    state->sane = 1;
+    return Z_DATA_ERROR;
+#endif
+}
+
+long ZEXPORT inflateMark(
+z_streamp strm)
+{
+    struct inflate_state FAR *state;
+
+    if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16;
+    state = (struct inflate_state FAR *)strm->state;
+    return ((long)(state->back) << 16) +
+        (state->mode == COPY ? state->length :
+            (state->mode == MATCH ? state->was - state->length : 0));
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inftrees.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inftrees.c
new file mode 100644
index 0000000..05ba132
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inftrees.c
@@ -0,0 +1,306 @@
+/* inftrees.c -- generate Huffman trees for efficient decoding
+ * Copyright (C) 1995-2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+
+#define MAXBITS 15
+
+const char inflate_copyright[] =
+   " inflate 1.2.8 Copyright 1995-2013 Mark Adler ";
+/*
+  If you use the zlib library in a product, an acknowledgment is welcome
+  in the documentation of your product. If for some reason you cannot
+  include such an acknowledgment, I would appreciate that you keep this
+  copyright string in the executable of your product.
+ */
+
+/*
+   Build a set of tables to decode the provided canonical Huffman code.
+   The code lengths are lens[0..codes-1].  The result starts at *table,
+   whose indices are 0..2^bits-1.  work is a writable array of at least
+   lens shorts, which is used as a work area.  type is the type of code
+   to be generated, CODES, LENS, or DISTS.  On return, zero is success,
+   -1 is an invalid code, and +1 means that ENOUGH isn't enough.  table
+   on return points to the next available entry's address.  bits is the
+   requested root table index bits, and on return it is the actual root
+   table index bits.  It will differ if the request is greater than the
+   longest code or if it is less than the shortest code.
+ */
+int ZLIB_INTERNAL inflate_table(
+codetype type,
+unsigned short FAR *lens,
+unsigned codes,
+code FAR * FAR *table,
+unsigned FAR *bits,
+unsigned short FAR *work)
+{
+    unsigned len;               /* a code's length in bits */
+    unsigned sym;               /* index of code symbols */
+    unsigned min, max;          /* minimum and maximum code lengths */
+    unsigned root;              /* number of index bits for root table */
+    unsigned curr;              /* number of index bits for current table */
+    unsigned drop;              /* code bits to drop for sub-table */
+    int left;                   /* number of prefix codes available */
+    unsigned used;              /* code entries in table used */
+    unsigned huff;              /* Huffman code */
+    unsigned incr;              /* for incrementing code, index */
+    unsigned fill;              /* index for replicating entries */
+    unsigned low;               /* low bits for current root entry */
+    unsigned mask;              /* mask for low root bits */
+    code here;                  /* table entry for duplication */
+    code FAR *next;             /* next available space in table */
+    const unsigned short FAR *base;     /* base value table to use */
+    const unsigned short FAR *extra;    /* extra bits table to use */
+    int end;                    /* use base and extra for symbol > end */
+    unsigned short count[MAXBITS+1];    /* number of codes of each length */
+    unsigned short offs[MAXBITS+1];     /* offsets in table for each length */
+    static const unsigned short lbase[31] = { /* Length codes 257..285 base */
+        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
+    static const unsigned short lext[31] = { /* Length codes 257..285 extra */
+        16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
+        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78};
+    static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
+        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+        8193, 12289, 16385, 24577, 0, 0};
+    static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
+        16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
+        23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
+        28, 28, 29, 29, 64, 64};
+
+    /*
+       Process a set of code lengths to create a canonical Huffman code.  The
+       code lengths are lens[0..codes-1].  Each length corresponds to the
+       symbols 0..codes-1.  The Huffman code is generated by first sorting the
+       symbols by length from short to long, and retaining the symbol order
+       for codes with equal lengths.  Then the code starts with all zero bits
+       for the first code of the shortest length, and the codes are integer
+       increments for the same length, and zeros are appended as the length
+       increases.  For the deflate format, these bits are stored backwards
+       from their more natural integer increment ordering, and so when the
+       decoding tables are built in the large loop below, the integer codes
+       are incremented backwards.
+
+       This routine assumes, but does not check, that all of the entries in
+       lens[] are in the range 0..MAXBITS.  The caller must assure this.
+       1..MAXBITS is interpreted as that code length.  zero means that that
+       symbol does not occur in this code.
+
+       The codes are sorted by computing a count of codes for each length,
+       creating from that a table of starting indices for each length in the
+       sorted table, and then entering the symbols in order in the sorted
+       table.  The sorted table is work[], with that space being provided by
+       the caller.
+
+       The length counts are used for other purposes as well, i.e. finding
+       the minimum and maximum length codes, determining if there are any
+       codes at all, checking for a valid set of lengths, and looking ahead
+       at length counts to determine sub-table sizes when building the
+       decoding tables.
+     */
+
+    /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
+    for (len = 0; len <= MAXBITS; len++)
+        count[len] = 0;
+    for (sym = 0; sym < codes; sym++)
+        count[lens[sym]]++;
+
+    /* bound code lengths, force root to be within code lengths */
+    root = *bits;
+    for (max = MAXBITS; max >= 1; max--)
+        if (count[max] != 0) break;
+    if (root > max) root = max;
+    if (max == 0) {                     /* no symbols to code at all */
+        here.op = (unsigned char)64;    /* invalid code marker */
+        here.bits = (unsigned char)1;
+        here.val = (unsigned short)0;
+        *(*table)++ = here;             /* make a table to force an error */
+        *(*table)++ = here;
+        *bits = 1;
+        return 0;     /* no symbols, but wait for decoding to report error */
+    }
+    for (min = 1; min < max; min++)
+        if (count[min] != 0) break;
+    if (root < min) root = min;
+
+    /* check for an over-subscribed or incomplete set of lengths */
+    left = 1;
+    for (len = 1; len <= MAXBITS; len++) {
+        left <<= 1;
+        left -= count[len];
+        if (left < 0) return -1;        /* over-subscribed */
+    }
+    if (left > 0 && (type == CODES || max != 1))
+        return -1;                      /* incomplete set */
+
+    /* generate offsets into symbol table for each length for sorting */
+    offs[1] = 0;
+    for (len = 1; len < MAXBITS; len++)
+        offs[len + 1] = offs[len] + count[len];
+
+    /* sort symbols by length, by symbol order within each length */
+    for (sym = 0; sym < codes; sym++)
+        if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;
+
+    /*
+       Create and fill in decoding tables.  In this loop, the table being
+       filled is at next and has curr index bits.  The code being used is huff
+       with length len.  That code is converted to an index by dropping drop
+       bits off of the bottom.  For codes where len is less than drop + curr,
+       those top drop + curr - len bits are incremented through all values to
+       fill the table with replicated entries.
+
+       root is the number of index bits for the root table.  When len exceeds
+       root, sub-tables are created pointed to by the root entry with an index
+       of the low root bits of huff.  This is saved in low to check for when a
+       new sub-table should be started.  drop is zero when the root table is
+       being filled, and drop is root when sub-tables are being filled.
+
+       When a new sub-table is needed, it is necessary to look ahead in the
+       code lengths to determine what size sub-table is needed.  The length
+       counts are used for this, and so count[] is decremented as codes are
+       entered in the tables.
+
+       used keeps track of how many table entries have been allocated from the
+       provided *table space.  It is checked for LENS and DIST tables against
+       the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
+       the initial root table size constants.  See the comments in inftrees.h
+       for more information.
+
+       sym increments through all symbols, and the loop terminates when
+       all codes of length max, i.e. all codes, have been processed.  This
+       routine permits incomplete codes, so another loop after this one fills
+       in the rest of the decoding tables with invalid code markers.
+     */
+
+    /* set up for code type */
+    switch (type) {
+    case CODES:
+        base = extra = work;    /* dummy value--not used */
+        end = 19;
+        break;
+    case LENS:
+        base = lbase;
+        base -= 257;
+        extra = lext;
+        extra -= 257;
+        end = 256;
+        break;
+    default:            /* DISTS */
+        base = dbase;
+        extra = dext;
+        end = -1;
+    }
+
+    /* initialize state for loop */
+    huff = 0;                   /* starting code */
+    sym = 0;                    /* starting code symbol */
+    len = min;                  /* starting code length */
+    next = *table;              /* current table to fill in */
+    curr = root;                /* current table index bits */
+    drop = 0;                   /* current bits to drop from code for index */
+    low = (unsigned)(-1);       /* trigger new sub-table when len > root */
+    used = 1U << root;          /* use root table entries */
+    mask = used - 1;            /* mask for comparing low */
+
+    /* check available table space */
+    if ((type == LENS && used > ENOUGH_LENS) ||
+        (type == DISTS && used > ENOUGH_DISTS))
+        return 1;
+
+    /* process all codes and make table entries */
+    for (;;) {
+        /* create table entry */
+        here.bits = (unsigned char)(len - drop);
+        if ((int)(work[sym]) < end) {
+            here.op = (unsigned char)0;
+            here.val = work[sym];
+        }
+        else if ((int)(work[sym]) > end) {
+            here.op = (unsigned char)(extra[work[sym]]);
+            here.val = base[work[sym]];
+        }
+        else {
+            here.op = (unsigned char)(32 + 64);         /* end of block */
+            here.val = 0;
+        }
+
+        /* replicate for those indices with low len bits equal to huff */
+        incr = 1U << (len - drop);
+        fill = 1U << curr;
+        min = fill;                 /* save offset to next table */
+        do {
+            fill -= incr;
+            next[(huff >> drop) + fill] = here;
+        } while (fill != 0);
+
+        /* backwards increment the len-bit code huff */
+        incr = 1U << (len - 1);
+        while (huff & incr)
+            incr >>= 1;
+        if (incr != 0) {
+            huff &= incr - 1;
+            huff += incr;
+        }
+        else
+            huff = 0;
+
+        /* go to next symbol, update count, len */
+        sym++;
+        if (--(count[len]) == 0) {
+            if (len == max) break;
+            len = lens[work[sym]];
+        }
+
+        /* create new sub-table if needed */
+        if (len > root && (huff & mask) != low) {
+            /* if first time, transition to sub-tables */
+            if (drop == 0)
+                drop = root;
+
+            /* increment past last table */
+            next += min;            /* here min is 1 << curr */
+
+            /* determine length of next table */
+            curr = len - drop;
+            left = (int)(1 << curr);
+            while (curr + drop < max) {
+                left -= count[curr + drop];
+                if (left <= 0) break;
+                curr++;
+                left <<= 1;
+            }
+
+            /* check for enough space */
+            used += 1U << curr;
+            if ((type == LENS && used > ENOUGH_LENS) ||
+                (type == DISTS && used > ENOUGH_DISTS))
+                return 1;
+
+            /* point entry in root table to sub-table */
+            low = huff & mask;
+            (*table)[low].op = (unsigned char)curr;
+            (*table)[low].bits = (unsigned char)root;
+            (*table)[low].val = (unsigned short)(next - *table);
+        }
+    }
+
+    /* fill in remaining table entry if code is incomplete (guaranteed to have
+       at most one remaining entry, since if the code is incomplete, the
+       maximum code length that was allowed to get this far is one bit) */
+    if (huff != 0) {
+        here.op = (unsigned char)64;            /* invalid code marker */
+        here.bits = (unsigned char)(len - drop);
+        here.val = (unsigned short)0;
+        next[huff] = here;
+    }
+
+    /* set return parameters */
+    *table += used;
+    *bits = root;
+    return 0;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_trees.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_trees.c
new file mode 100644
index 0000000..e1fd952
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_trees.c
@@ -0,0 +1,1226 @@
+/* trees.c -- output deflated data using Huffman coding
+ * Copyright (C) 1995-2012 Jean-loup Gailly
+ * detect_data_type() function provided freely by Cosmin Truta, 2006
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ *  ALGORITHM
+ *
+ *      The "deflation" process uses several Huffman trees. The more
+ *      common source values are represented by shorter bit sequences.
+ *
+ *      Each code tree is stored in a compressed form which is itself
+ * a Huffman encoding of the lengths of all the code strings (in
+ * ascending order by source values).  The actual code strings are
+ * reconstructed from the lengths in the inflate process, as described
+ * in the deflate specification.
+ *
+ *  REFERENCES
+ *
+ *      Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
+ *      Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
+ *
+ *      Storer, James A.
+ *          Data Compression:  Methods and Theory, pp. 49-50.
+ *          Computer Science Press, 1988.  ISBN 0-7167-8156-5.
+ *
+ *      Sedgewick, R.
+ *          Algorithms, p290.
+ *          Addison-Wesley, 1983. ISBN 0-201-06672-6.
+ */
+
+/* @(#) $Id$ */
+
+/* #define GEN_TREES_H */
+
+#include "deflate.h"
+
+#ifdef DEBUG
+#  include <ctype.h>
+#endif
+
+/* ===========================================================================
+ * Constants
+ */
+
+#define MAX_BL_BITS 7
+/* Bit length codes must not exceed MAX_BL_BITS bits */
+
+#define END_BLOCK 256
+/* end of block literal code */
+
+#define REP_3_6      16
+/* repeat previous bit length 3-6 times (2 bits of repeat count) */
+
+#define REPZ_3_10    17
+/* repeat a zero length 3-10 times  (3 bits of repeat count) */
+
+#define REPZ_11_138  18
+/* repeat a zero length 11-138 times  (7 bits of repeat count) */
+
+local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
+   = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
+
+local const int extra_dbits[D_CODES] /* extra bits for each distance code */
+   = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
+
+local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */
+   = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
+
+local const uch bl_order[BL_CODES]
+   = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
+/* The lengths of the bit length codes are sent in order of decreasing
+ * probability, to avoid transmitting the lengths for unused bit length codes.
+ */
+
+/* ===========================================================================
+ * Local data. These are initialized only once.
+ */
+
+#define DIST_CODE_LEN  512 /* see definition of array dist_code below */
+
+#if defined(GEN_TREES_H) || !defined(STDC)
+/* non ANSI compilers may not accept trees.h */
+
+local ct_data static_ltree[L_CODES+2];
+/* The static literal tree. Since the bit lengths are imposed, there is no
+ * need for the L_CODES extra codes used during heap construction. However
+ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
+ * below).
+ */
+
+local ct_data static_dtree[D_CODES];
+/* The static distance tree. (Actually a trivial tree since all codes use
+ * 5 bits.)
+ */
+
+uch _dist_code[DIST_CODE_LEN];
+/* Distance codes. The first 256 values correspond to the distances
+ * 3 .. 258, the last 256 values correspond to the top 8 bits of
+ * the 15 bit distances.
+ */
+
+uch _length_code[MAX_MATCH-MIN_MATCH+1];
+/* length code for each normalized match length (0 == MIN_MATCH) */
+
+local int base_length[LENGTH_CODES];
+/* First normalized length for each code (0 = MIN_MATCH) */
+
+local int base_dist[D_CODES];
+/* First normalized distance for each code (0 = distance of 1) */
+
+#else
+#  include "trees.h"
+#endif /* GEN_TREES_H */
+
+struct static_tree_desc_s {
+    const ct_data *static_tree;  /* static tree or NULL */
+    const intf *extra_bits;      /* extra bits for each code or NULL */
+    int     extra_base;          /* base index for extra_bits */
+    int     elems;               /* max number of elements in the tree */
+    int     max_length;          /* max bit length for the codes */
+};
+
+local static_tree_desc  static_l_desc =
+{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
+
+local static_tree_desc  static_d_desc =
+{static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS};
+
+local static_tree_desc  static_bl_desc =
+{(const ct_data *)0, extra_blbits, 0,   BL_CODES, MAX_BL_BITS};
+
+/* ===========================================================================
+ * Local (static) routines in this file.
+ */
+
+local void tr_static_init OF((void));
+local void init_block     OF((deflate_state *s));
+local void pqdownheap     OF((deflate_state *s, ct_data *tree, int k));
+local void gen_bitlen     OF((deflate_state *s, tree_desc *desc));
+local void gen_codes      OF((ct_data *tree, int max_code, ushf *bl_count));
+local void build_tree     OF((deflate_state *s, tree_desc *desc));
+local void scan_tree      OF((deflate_state *s, ct_data *tree, int max_code));
+local void send_tree      OF((deflate_state *s, ct_data *tree, int max_code));
+local int  build_bl_tree  OF((deflate_state *s));
+local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
+                              int blcodes));
+local void compress_block OF((deflate_state *s, const ct_data *ltree,
+                              const ct_data *dtree));
+local int  detect_data_type OF((deflate_state *s));
+local unsigned bi_reverse OF((unsigned value, int length));
+local void bi_windup      OF((deflate_state *s));
+local void bi_flush       OF((deflate_state *s));
+local void copy_block     OF((deflate_state *s, charf *buf, unsigned len,
+                              int header));
+
+#ifdef GEN_TREES_H
+local void gen_trees_header OF((void));
+#endif
+
+#ifndef DEBUG
+#  define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
+   /* Send a code of the given tree. c and tree must not have side effects */
+
+#else /* DEBUG */
+#  define send_code(s, c, tree) \
+     { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
+       send_bits(s, tree[c].Code, tree[c].Len); }
+#endif
+
+/* ===========================================================================
+ * Output a short LSB first on the stream.
+ * IN assertion: there is enough room in pendingBuf.
+ */
+#define put_short(s, w) { \
+    put_byte(s, (uch)((w) & 0xff)); \
+    put_byte(s, (uch)((ush)(w) >> 8)); \
+}
+
+/* ===========================================================================
+ * Send a value on a given number of bits.
+ * IN assertion: length <= 16 and value fits in length bits.
+ */
+#ifdef DEBUG
+local void send_bits      OF((deflate_state *s, int value, int length));
+
+local void send_bits(
+    deflate_state *s,
+    int value,  /* value to send */
+    int length) /* number of bits */
+{
+    Tracevv((stderr," l %2d v %4x ", length, value));
+    Assert(length > 0 && length <= 15, "invalid length");
+    s->bits_sent += (ulg)length;
+
+    /* If not enough room in bi_buf, use (valid) bits from bi_buf and
+     * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
+     * unused bits in value.
+     */
+    if (s->bi_valid > (int)Buf_size - length) {
+        s->bi_buf |= (ush)value << s->bi_valid;
+        put_short(s, s->bi_buf);
+        s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
+        s->bi_valid += length - Buf_size;
+    } else {
+        s->bi_buf |= (ush)value << s->bi_valid;
+        s->bi_valid += length;
+    }
+}
+#else /* !DEBUG */
+
+#define send_bits(s, value, length) \
+{ int len = length;\
+  if (s->bi_valid > (int)Buf_size - len) {\
+    int val = value;\
+    s->bi_buf |= (ush)val << s->bi_valid;\
+    put_short(s, s->bi_buf);\
+    s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\
+    s->bi_valid += len - Buf_size;\
+  } else {\
+    s->bi_buf |= (ush)(value) << s->bi_valid;\
+    s->bi_valid += len;\
+  }\
+}
+#endif /* DEBUG */
+
+
+/* the arguments must not have side effects */
+
+/* ===========================================================================
+ * Initialize the various 'constant' tables.
+ */
+local void tr_static_init()
+{
+#if defined(GEN_TREES_H) || !defined(STDC)
+    static int static_init_done = 0;
+    int n;        /* iterates over tree elements */
+    int bits;     /* bit counter */
+    int length;   /* length value */
+    int code;     /* code value */
+    int dist;     /* distance index */
+    ush bl_count[MAX_BITS+1];
+    /* number of codes at each bit length for an optimal tree */
+
+    if (static_init_done) return;
+
+    /* For some embedded targets, global variables are not initialized: */
+#ifdef NO_INIT_GLOBAL_POINTERS
+    static_l_desc.static_tree = static_ltree;
+    static_l_desc.extra_bits = extra_lbits;
+    static_d_desc.static_tree = static_dtree;
+    static_d_desc.extra_bits = extra_dbits;
+    static_bl_desc.extra_bits = extra_blbits;
+#endif
+
+    /* Initialize the mapping length (0..255) -> length code (0..28) */
+    length = 0;
+    for (code = 0; code < LENGTH_CODES-1; code++) {
+        base_length[code] = length;
+        for (n = 0; n < (1<<extra_lbits[code]); n++) {
+            _length_code[length++] = (uch)code;
+        }
+    }
+    Assert (length == 256, "tr_static_init: length != 256");
+    /* Note that the length 255 (match length 258) can be represented
+     * in two different ways: code 284 + 5 bits or code 285, so we
+     * overwrite length_code[255] to use the best encoding:
+     */
+    _length_code[length-1] = (uch)code;
+
+    /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
+    dist = 0;
+    for (code = 0 ; code < 16; code++) {
+        base_dist[code] = dist;
+        for (n = 0; n < (1<<extra_dbits[code]); n++) {
+            _dist_code[dist++] = (uch)code;
+        }
+    }
+    Assert (dist == 256, "tr_static_init: dist != 256");
+    dist >>= 7; /* from now on, all distances are divided by 128 */
+    for ( ; code < D_CODES; code++) {
+        base_dist[code] = dist << 7;
+        for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
+            _dist_code[256 + dist++] = (uch)code;
+        }
+    }
+    Assert (dist == 256, "tr_static_init: 256+dist != 512");
+
+    /* Construct the codes of the static literal tree */
+    for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
+    n = 0;
+    while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
+    while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
+    while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
+    while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
+    /* Codes 286 and 287 do not exist, but we must include them in the
+     * tree construction to get a canonical Huffman tree (longest code
+     * all ones)
+     */
+    gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);
+
+    /* The static distance tree is trivial: */
+    for (n = 0; n < D_CODES; n++) {
+        static_dtree[n].Len = 5;
+        static_dtree[n].Code = bi_reverse((unsigned)n, 5);
+    }
+    static_init_done = 1;
+
+#  ifdef GEN_TREES_H
+    gen_trees_header();
+#  endif
+#endif /* defined(GEN_TREES_H) || !defined(STDC) */
+}
+
+/* ===========================================================================
+ * Genererate the file trees.h describing the static trees.
+ */
+#ifdef GEN_TREES_H
+#  ifndef DEBUG
+#    include <stdio.h>
+#  endif
+
+#  define SEPARATOR(i, last, width) \
+      ((i) == (last)? "\n};\n\n" :    \
+       ((i) % (width) == (width)-1 ? ",\n" : ", "))
+
+void gen_trees_header()
+{
+    FILE *header = fopen("trees.h", "w");
+    int i;
+
+    Assert (header != NULL, "Can't open trees.h");
+    fprintf(header,
+            "/* header created automatically with -DGEN_TREES_H */\n\n");
+
+    fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");
+    for (i = 0; i < L_CODES+2; i++) {
+        fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,
+                static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));
+    }
+
+    fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");
+    for (i = 0; i < D_CODES; i++) {
+        fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,
+                static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));
+    }
+
+    fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n");
+    for (i = 0; i < DIST_CODE_LEN; i++) {
+        fprintf(header, "%2u%s", _dist_code[i],
+                SEPARATOR(i, DIST_CODE_LEN-1, 20));
+    }
+
+    fprintf(header,
+        "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
+    for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {
+        fprintf(header, "%2u%s", _length_code[i],
+                SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));
+    }
+
+    fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");
+    for (i = 0; i < LENGTH_CODES; i++) {
+        fprintf(header, "%1u%s", base_length[i],
+                SEPARATOR(i, LENGTH_CODES-1, 20));
+    }
+
+    fprintf(header, "local const int base_dist[D_CODES] = {\n");
+    for (i = 0; i < D_CODES; i++) {
+        fprintf(header, "%5u%s", base_dist[i],
+                SEPARATOR(i, D_CODES-1, 10));
+    }
+
+    fclose(header);
+}
+#endif /* GEN_TREES_H */
+
+/* ===========================================================================
+ * Initialize the tree data structures for a new zlib stream.
+ */
+void ZLIB_INTERNAL _tr_init(
+    deflate_state *s)
+{
+    tr_static_init();
+
+    s->l_desc.dyn_tree = s->dyn_ltree;
+    s->l_desc.stat_desc = &static_l_desc;
+
+    s->d_desc.dyn_tree = s->dyn_dtree;
+    s->d_desc.stat_desc = &static_d_desc;
+
+    s->bl_desc.dyn_tree = s->bl_tree;
+    s->bl_desc.stat_desc = &static_bl_desc;
+
+    s->bi_buf = 0;
+    s->bi_valid = 0;
+#ifdef DEBUG
+    s->compressed_len = 0L;
+    s->bits_sent = 0L;
+#endif
+
+    /* Initialize the first block of the first file: */
+    init_block(s);
+}
+
+/* ===========================================================================
+ * Initialize a new block.
+ */
+local void init_block(
+    deflate_state *s)
+{
+    int n; /* iterates over tree elements */
+
+    /* Initialize the trees. */
+    for (n = 0; n < L_CODES;  n++) s->dyn_ltree[n].Freq = 0;
+    for (n = 0; n < D_CODES;  n++) s->dyn_dtree[n].Freq = 0;
+    for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
+
+    s->dyn_ltree[END_BLOCK].Freq = 1;
+    s->opt_len = s->static_len = 0L;
+    s->last_lit = s->matches = 0;
+}
+
+#define SMALLEST 1
+/* Index within the heap array of least frequent node in the Huffman tree */
+
+
+/* ===========================================================================
+ * Remove the smallest element from the heap and recreate the heap with
+ * one less element. Updates heap and heap_len.
+ */
+#define pqremove(s, tree, top) \
+{\
+    top = s->heap[SMALLEST]; \
+    s->heap[SMALLEST] = s->heap[s->heap_len--]; \
+    pqdownheap(s, tree, SMALLEST); \
+}
+
+/* ===========================================================================
+ * Compares to subtrees, using the tree depth as tie breaker when
+ * the subtrees have equal frequency. This minimizes the worst case length.
+ */
+#define smaller(tree, n, m, depth) \
+   (tree[n].Freq < tree[m].Freq || \
+   (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
+
+/* ===========================================================================
+ * Restore the heap property by moving down the tree starting at node k,
+ * exchanging a node with the smallest of its two sons if necessary, stopping
+ * when the heap property is re-established (each father smaller than its
+ * two sons).
+ */
+local void pqdownheap(
+    deflate_state *s,
+    ct_data *tree,  /* the tree to restore */
+    int k)               /* node to move down */
+{
+    int v = s->heap[k];
+    int j = k << 1;  /* left son of k */
+    while (j <= s->heap_len) {
+        /* Set j to the smallest of the two sons: */
+        if (j < s->heap_len &&
+            smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
+            j++;
+        }
+        /* Exit if v is smaller than both sons */
+        if (smaller(tree, v, s->heap[j], s->depth)) break;
+
+        /* Exchange v with the smallest son */
+        s->heap[k] = s->heap[j];  k = j;
+
+        /* And continue down the tree, setting j to the left son of k */
+        j <<= 1;
+    }
+    s->heap[k] = v;
+}
+
+/* ===========================================================================
+ * Compute the optimal bit lengths for a tree and update the total bit length
+ * for the current block.
+ * IN assertion: the fields freq and dad are set, heap[heap_max] and
+ *    above are the tree nodes sorted by increasing frequency.
+ * OUT assertions: the field len is set to the optimal bit length, the
+ *     array bl_count contains the frequencies for each bit length.
+ *     The length opt_len is updated; static_len is also updated if stree is
+ *     not null.
+ */
+local void gen_bitlen(
+    deflate_state *s,
+    tree_desc *desc)    /* the tree descriptor */
+{
+    ct_data *tree        = desc->dyn_tree;
+    int max_code         = desc->max_code;
+    const ct_data *stree = desc->stat_desc->static_tree;
+    const intf *extra    = desc->stat_desc->extra_bits;
+    int base             = desc->stat_desc->extra_base;
+    int max_length       = desc->stat_desc->max_length;
+    int h;              /* heap index */
+    int n, m;           /* iterate over the tree elements */
+    int bits;           /* bit length */
+    int xbits;          /* extra bits */
+    ush f;              /* frequency */
+    int overflow = 0;   /* number of elements with bit length too large */
+
+    for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;
+
+    /* In a first pass, compute the optimal bit lengths (which may
+     * overflow in the case of the bit length tree).
+     */
+    tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
+
+    for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
+        n = s->heap[h];
+        bits = tree[tree[n].Dad].Len + 1;
+        if (bits > max_length) bits = max_length, overflow++;
+        tree[n].Len = (ush)bits;
+        /* We overwrite tree[n].Dad which is no longer needed */
+
+        if (n > max_code) continue; /* not a leaf node */
+
+        s->bl_count[bits]++;
+        xbits = 0;
+        if (n >= base) xbits = extra[n-base];
+        f = tree[n].Freq;
+        s->opt_len += (ulg)f * (bits + xbits);
+        if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);
+    }
+    if (overflow == 0) return;
+
+    Trace((stderr,"\nbit length overflow\n"));
+    /* This happens for example on obj2 and pic of the Calgary corpus */
+
+    /* Find the first bit length which could increase: */
+    do {
+        bits = max_length-1;
+        while (s->bl_count[bits] == 0) bits--;
+        s->bl_count[bits]--;      /* move one leaf down the tree */
+        s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
+        s->bl_count[max_length]--;
+        /* The brother of the overflow item also moves one step up,
+         * but this does not affect bl_count[max_length]
+         */
+        overflow -= 2;
+    } while (overflow > 0);
+
+    /* Now recompute all bit lengths, scanning in increasing frequency.
+     * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
+     * lengths instead of fixing only the wrong ones. This idea is taken
+     * from 'ar' written by Haruhiko Okumura.)
+     */
+    for (bits = max_length; bits != 0; bits--) {
+        n = s->bl_count[bits];
+        while (n != 0) {
+            m = s->heap[--h];
+            if (m > max_code) continue;
+            if ((unsigned) tree[m].Len != (unsigned) bits) {
+                Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
+                s->opt_len += ((long)bits - (long)tree[m].Len)
+                              *(long)tree[m].Freq;
+                tree[m].Len = (ush)bits;
+            }
+            n--;
+        }
+    }
+}
+
+/* ===========================================================================
+ * Generate the codes for a given tree and bit counts (which need not be
+ * optimal).
+ * IN assertion: the array bl_count contains the bit length statistics for
+ * the given tree and the field len is set for all tree elements.
+ * OUT assertion: the field code is set for all tree elements of non
+ *     zero code length.
+ */
+local void gen_codes (
+    ct_data *tree,             /* the tree to decorate */
+    int max_code,              /* largest code with non zero frequency */
+    ushf *bl_count)            /* number of codes at each bit length */
+{
+    ush next_code[MAX_BITS+1]; /* next code value for each bit length */
+    ush code = 0;              /* running code value */
+    int bits;                  /* bit index */
+    int n;                     /* code index */
+
+    /* The distribution counts are first used to generate the code values
+     * without bit reversal.
+     */
+    for (bits = 1; bits <= MAX_BITS; bits++) {
+        next_code[bits] = code = (code + bl_count[bits-1]) << 1;
+    }
+    /* Check that the bit counts in bl_count are consistent. The last code
+     * must be all ones.
+     */
+    Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+            "inconsistent bit counts");
+    Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+    for (n = 0;  n <= max_code; n++) {
+        int len = tree[n].Len;
+        if (len == 0) continue;
+        /* Now reverse the bits */
+        tree[n].Code = bi_reverse(next_code[len]++, len);
+
+        Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
+             n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+    }
+}
+
+/* ===========================================================================
+ * Construct one Huffman tree and assigns the code bit strings and lengths.
+ * Update the total bit length for the current block.
+ * IN assertion: the field freq is set for all tree elements.
+ * OUT assertions: the fields len and code are set to the optimal bit length
+ *     and corresponding code. The length opt_len is updated; static_len is
+ *     also updated if stree is not null. The field max_code is set.
+ */
+local void build_tree(
+    deflate_state *s,
+    tree_desc *desc) /* the tree descriptor */
+{
+    ct_data *tree         = desc->dyn_tree;
+    const ct_data *stree  = desc->stat_desc->static_tree;
+    int elems             = desc->stat_desc->elems;
+    int n, m;          /* iterate over heap elements */
+    int max_code = -1; /* largest code with non zero frequency */
+    int node;          /* new node being created */
+
+    /* Construct the initial heap, with least frequent element in
+     * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+     * heap[0] is not used.
+     */
+    s->heap_len = 0, s->heap_max = HEAP_SIZE;
+
+    for (n = 0; n < elems; n++) {
+        if (tree[n].Freq != 0) {
+            s->heap[++(s->heap_len)] = max_code = n;
+            s->depth[n] = 0;
+        } else {
+            tree[n].Len = 0;
+        }
+    }
+
+    /* The pkzip format requires that at least one distance code exists,
+     * and that at least one bit should be sent even if there is only one
+     * possible code. So to avoid special checks later on we force at least
+     * two codes of non zero frequency.
+     */
+    while (s->heap_len < 2) {
+        node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);
+        tree[node].Freq = 1;
+        s->depth[node] = 0;
+        s->opt_len--; if (stree) s->static_len -= stree[node].Len;
+        /* node is 0 or 1 so it does not have extra bits */
+    }
+    desc->max_code = max_code;
+
+    /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+     * establish sub-heaps of increasing lengths:
+     */
+    for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
+
+    /* Construct the Huffman tree by repeatedly combining the least two
+     * frequent nodes.
+     */
+    node = elems;              /* next internal node of the tree */
+    do {
+        pqremove(s, tree, n);  /* n = node of least frequency */
+        m = s->heap[SMALLEST]; /* m = node of next least frequency */
+
+        s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */
+        s->heap[--(s->heap_max)] = m;
+
+        /* Create a new node father of n and m */
+        tree[node].Freq = tree[n].Freq + tree[m].Freq;
+        s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ?
+                                s->depth[n] : s->depth[m]) + 1);
+        tree[n].Dad = tree[m].Dad = (ush)node;
+#ifdef DUMP_BL_TREE
+        if (tree == s->bl_tree) {
+            fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
+                    node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
+        }
+#endif
+        /* and insert the new node in the heap */
+        s->heap[SMALLEST] = node++;
+        pqdownheap(s, tree, SMALLEST);
+
+    } while (s->heap_len >= 2);
+
+    s->heap[--(s->heap_max)] = s->heap[SMALLEST];
+
+    /* At this point, the fields freq and dad are set. We can now
+     * generate the bit lengths.
+     */
+    gen_bitlen(s, (tree_desc *)desc);
+
+    /* The field len is now set, we can generate the bit codes */
+    gen_codes ((ct_data *)tree, max_code, s->bl_count);
+}
+
+/* ===========================================================================
+ * Scan a literal or distance tree to determine the frequencies of the codes
+ * in the bit length tree.
+ */
+local void scan_tree (
+    deflate_state *s,
+    ct_data *tree,   /* the tree to be scanned */
+    int max_code)    /* and its largest code of non zero frequency */
+{
+    int n;                     /* iterates over all tree elements */
+    int prevlen = -1;          /* last emitted length */
+    int curlen;                /* length of current code */
+    int nextlen = tree[0].Len; /* length of next code */
+    int count = 0;             /* repeat count of the current code */
+    int max_count = 7;         /* max repeat count */
+    int min_count = 4;         /* min repeat count */
+
+    if (nextlen == 0) max_count = 138, min_count = 3;
+    tree[max_code+1].Len = (ush)0xffff; /* guard */
+
+    for (n = 0; n <= max_code; n++) {
+        curlen = nextlen; nextlen = tree[n+1].Len;
+        if (++count < max_count && curlen == nextlen) {
+            continue;
+        } else if (count < min_count) {
+            s->bl_tree[curlen].Freq += count;
+        } else if (curlen != 0) {
+            if (curlen != prevlen) s->bl_tree[curlen].Freq++;
+            s->bl_tree[REP_3_6].Freq++;
+        } else if (count <= 10) {
+            s->bl_tree[REPZ_3_10].Freq++;
+        } else {
+            s->bl_tree[REPZ_11_138].Freq++;
+        }
+        count = 0; prevlen = curlen;
+        if (nextlen == 0) {
+            max_count = 138, min_count = 3;
+        } else if (curlen == nextlen) {
+            max_count = 6, min_count = 3;
+        } else {
+            max_count = 7, min_count = 4;
+        }
+    }
+}
+
+/* ===========================================================================
+ * Send a literal or distance tree in compressed form, using the codes in
+ * bl_tree.
+ */
+local void send_tree (
+    deflate_state *s,
+    ct_data *tree, /* the tree to be scanned */
+    int max_code)       /* and its largest code of non zero frequency */
+{
+    int n;                     /* iterates over all tree elements */
+    int prevlen = -1;          /* last emitted length */
+    int curlen;                /* length of current code */
+    int nextlen = tree[0].Len; /* length of next code */
+    int count = 0;             /* repeat count of the current code */
+    int max_count = 7;         /* max repeat count */
+    int min_count = 4;         /* min repeat count */
+
+    /* tree[max_code+1].Len = -1; */  /* guard already set */
+    if (nextlen == 0) max_count = 138, min_count = 3;
+
+    for (n = 0; n <= max_code; n++) {
+        curlen = nextlen; nextlen = tree[n+1].Len;
+        if (++count < max_count && curlen == nextlen) {
+            continue;
+        } else if (count < min_count) {
+            do { send_code(s, curlen, s->bl_tree); } while (--count != 0);
+
+        } else if (curlen != 0) {
+            if (curlen != prevlen) {
+                send_code(s, curlen, s->bl_tree); count--;
+            }
+            Assert(count >= 3 && count <= 6, " 3_6?");
+            send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
+
+        } else if (count <= 10) {
+            send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
+
+        } else {
+            send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
+        }
+        count = 0; prevlen = curlen;
+        if (nextlen == 0) {
+            max_count = 138, min_count = 3;
+        } else if (curlen == nextlen) {
+            max_count = 6, min_count = 3;
+        } else {
+            max_count = 7, min_count = 4;
+        }
+    }
+}
+
+/* ===========================================================================
+ * Construct the Huffman tree for the bit lengths and return the index in
+ * bl_order of the last bit length code to send.
+ */
+local int build_bl_tree(
+    deflate_state *s)
+{
+    int max_blindex;  /* index of last bit length code of non zero freq */
+
+    /* Determine the bit length frequencies for literal and distance trees */
+    scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);
+    scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);
+
+    /* Build the bit length tree: */
+    build_tree(s, (tree_desc *)(&(s->bl_desc)));
+    /* opt_len now includes the length of the tree representations, except
+     * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
+     */
+
+    /* Determine the number of bit length codes to send. The pkzip format
+     * requires that at least 4 bit length codes be sent. (appnote.txt says
+     * 3 but the actual value used is 4.)
+     */
+    for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
+        if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
+    }
+    /* Update opt_len to include the bit length tree and counts */
+    s->opt_len += 3*(max_blindex+1) + 5+5+4;
+    Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
+            s->opt_len, s->static_len));
+
+    return max_blindex;
+}
+
+/* ===========================================================================
+ * Send the header for a block using dynamic Huffman trees: the counts, the
+ * lengths of the bit length codes, the literal tree and the distance tree.
+ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
+ */
+local void send_all_trees(
+    deflate_state *s,
+    int lcodes, int dcodes, int blcodes) /* number of codes for each tree */
+{
+    int rank;                    /* index in bl_order */
+
+    Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
+    Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
+            "too many codes");
+    Tracev((stderr, "\nbl counts: "));
+    send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
+    send_bits(s, dcodes-1,   5);
+    send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */
+    for (rank = 0; rank < blcodes; rank++) {
+        Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
+        send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
+    }
+    Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
+
+    send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
+    Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
+
+    send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
+    Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
+}
+
+/* ===========================================================================
+ * Send a stored block
+ */
+void ZLIB_INTERNAL _tr_stored_block(
+    deflate_state *s,
+    charf *buf,       /* input block */
+    ulg stored_len,   /* length of input block */
+    int last)         /* one if this is the last block for a file */
+{
+    send_bits(s, (STORED_BLOCK<<1)+last, 3);    /* send block type */
+#ifdef DEBUG
+    s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
+    s->compressed_len += (stored_len + 4) << 3;
+#endif
+    copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
+}
+
+/* ===========================================================================
+ * Flush the bits in the bit buffer to pending output (leaves at most 7 bits)
+ */
+void ZLIB_INTERNAL _tr_flush_bits(
+    deflate_state *s)
+{
+    bi_flush(s);
+}
+
+/* ===========================================================================
+ * Send one empty static block to give enough lookahead for inflate.
+ * This takes 10 bits, of which 7 may remain in the bit buffer.
+ */
+void ZLIB_INTERNAL _tr_align(
+    deflate_state *s)
+{
+    send_bits(s, STATIC_TREES<<1, 3);
+    send_code(s, END_BLOCK, static_ltree);
+#ifdef DEBUG
+    s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
+#endif
+    bi_flush(s);
+}
+
+/* ===========================================================================
+ * Determine the best encoding for the current block: dynamic trees, static
+ * trees or store, and output the encoded block to the zip file.
+ */
+void ZLIB_INTERNAL _tr_flush_block(
+    deflate_state *s,
+    charf *buf,       /* input block, or NULL if too old */
+    ulg stored_len,   /* length of input block */
+    int last)         /* one if this is the last block for a file */
+{
+    ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
+    int max_blindex = 0;  /* index of last bit length code of non zero freq */
+
+    /* Build the Huffman trees unless a stored block is forced */
+    if (s->level > 0) {
+
+        /* Check if the file is binary or text */
+        if (s->strm->data_type == Z_UNKNOWN)
+            s->strm->data_type = detect_data_type(s);
+
+        /* Construct the literal and distance trees */
+        build_tree(s, (tree_desc *)(&(s->l_desc)));
+        Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
+                s->static_len));
+
+        build_tree(s, (tree_desc *)(&(s->d_desc)));
+        Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
+                s->static_len));
+        /* At this point, opt_len and static_len are the total bit lengths of
+         * the compressed block data, excluding the tree representations.
+         */
+
+        /* Build the bit length tree for the above two trees, and get the index
+         * in bl_order of the last bit length code to send.
+         */
+        max_blindex = build_bl_tree(s);
+
+        /* Determine the best encoding. Compute the block lengths in bytes. */
+        opt_lenb = (s->opt_len+3+7)>>3;
+        static_lenb = (s->static_len+3+7)>>3;
+
+        Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
+                opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
+                s->last_lit));
+
+        if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
+
+    } else {
+        Assert(buf != (char*)0, "lost buf");
+        opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
+    }
+
+#ifdef FORCE_STORED
+    if (buf != (char*)0) { /* force stored block */
+#else
+    if (stored_len+4 <= opt_lenb && buf != (char*)0) {
+                       /* 4: two words for the lengths */
+#endif
+        /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
+         * Otherwise we can't have processed more than WSIZE input bytes since
+         * the last block flush, because compression would have been
+         * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
+         * transform a block into a stored block.
+         */
+        _tr_stored_block(s, buf, stored_len, last);
+
+#ifdef FORCE_STATIC
+    } else if (static_lenb >= 0) { /* force static trees */
+#else
+    } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {
+#endif
+        send_bits(s, (STATIC_TREES<<1)+last, 3);
+        compress_block(s, (const ct_data *)static_ltree,
+                       (const ct_data *)static_dtree);
+#ifdef DEBUG
+        s->compressed_len += 3 + s->static_len;
+#endif
+    } else {
+        send_bits(s, (DYN_TREES<<1)+last, 3);
+        send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
+                       max_blindex+1);
+        compress_block(s, (const ct_data *)s->dyn_ltree,
+                       (const ct_data *)s->dyn_dtree);
+#ifdef DEBUG
+        s->compressed_len += 3 + s->opt_len;
+#endif
+    }
+    Assert (s->compressed_len == s->bits_sent, "bad compressed size");
+    /* The above check is made mod 2^32, for files larger than 512 MB
+     * and uLong implemented on 32 bits.
+     */
+    init_block(s);
+
+    if (last) {
+        bi_windup(s);
+#ifdef DEBUG
+        s->compressed_len += 7;  /* align on byte boundary */
+#endif
+    }
+    Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
+           s->compressed_len-7*last));
+}
+
+/* ===========================================================================
+ * Save the match info and tally the frequency counts. Return true if
+ * the current block must be flushed.
+ */
+int ZLIB_INTERNAL _tr_tally (
+    deflate_state *s,
+    unsigned dist,  /* distance of matched string */
+    unsigned lc)    /* match length-MIN_MATCH or unmatched char (if dist==0) */
+{
+    s->d_buf[s->last_lit] = (ush)dist;
+    s->l_buf[s->last_lit++] = (uch)lc;
+    if (dist == 0) {
+        /* lc is the unmatched char */
+        s->dyn_ltree[lc].Freq++;
+    } else {
+        s->matches++;
+        /* Here, lc is the match length - MIN_MATCH */
+        dist--;             /* dist = match distance - 1 */
+        Assert((ush)dist < (ush)MAX_DIST(s) &&
+               (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
+               (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
+
+        s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
+        s->dyn_dtree[d_code(dist)].Freq++;
+    }
+
+#ifdef TRUNCATE_BLOCK
+    /* Try to guess if it is profitable to stop the current block here */
+    if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {
+        /* Compute an upper bound for the compressed length */
+        ulg out_length = (ulg)s->last_lit*8L;
+        ulg in_length = (ulg)((long)s->strstart - s->block_start);
+        int dcode;
+        for (dcode = 0; dcode < D_CODES; dcode++) {
+            out_length += (ulg)s->dyn_dtree[dcode].Freq *
+                (5L+extra_dbits[dcode]);
+        }
+        out_length >>= 3;
+        Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
+               s->last_lit, in_length, out_length,
+               100L - out_length*100L/in_length));
+        if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
+    }
+#endif
+    return (s->last_lit == s->lit_bufsize-1);
+    /* We avoid equality with lit_bufsize because of wraparound at 64K
+     * on 16 bit machines and because stored blocks are restricted to
+     * 64K-1 bytes.
+     */
+}
+
+/* ===========================================================================
+ * Send the block data compressed using the given Huffman trees
+ */
+local void compress_block(
+    deflate_state *s,
+    const ct_data *ltree, /* literal tree */
+    const ct_data *dtree) /* distance tree */
+{
+    unsigned dist;      /* distance of matched string */
+    int lc;             /* match length or unmatched char (if dist == 0) */
+    unsigned lx = 0;    /* running index in l_buf */
+    unsigned code;      /* the code to send */
+    int extra;          /* number of extra bits to send */
+
+    if (s->last_lit != 0) do {
+        dist = s->d_buf[lx];
+        lc = s->l_buf[lx++];
+        if (dist == 0) {
+            send_code(s, lc, ltree); /* send a literal byte */
+            Tracecv(isgraph(lc), (stderr," '%c' ", lc));
+        } else {
+            /* Here, lc is the match length - MIN_MATCH */
+            code = _length_code[lc];
+            send_code(s, code+LITERALS+1, ltree); /* send the length code */
+            extra = extra_lbits[code];
+            if (extra != 0) {
+                lc -= base_length[code];
+                send_bits(s, lc, extra);       /* send the extra length bits */
+            }
+            dist--; /* dist is now the match distance - 1 */
+            code = d_code(dist);
+            Assert (code < D_CODES, "bad d_code");
+
+            send_code(s, code, dtree);       /* send the distance code */
+            extra = extra_dbits[code];
+            if (extra != 0) {
+                dist -= base_dist[code];
+                send_bits(s, dist, extra);   /* send the extra distance bits */
+            }
+        } /* literal or match pair ? */
+
+        /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
+        Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
+               "pendingBuf overflow");
+
+    } while (lx < s->last_lit);
+
+    send_code(s, END_BLOCK, ltree);
+}
+
+/* ===========================================================================
+ * Check if the data type is TEXT or BINARY, using the following algorithm:
+ * - TEXT if the two conditions below are satisfied:
+ *    a) There are no non-portable control characters belonging to the
+ *       "black list" (0..6, 14..25, 28..31).
+ *    b) There is at least one printable character belonging to the
+ *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
+ * - BINARY otherwise.
+ * - The following partially-portable control characters form a
+ *   "gray list" that is ignored in this detection algorithm:
+ *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
+ * IN assertion: the fields Freq of dyn_ltree are set.
+ */
+local int detect_data_type(
+    deflate_state *s)
+{
+    /* black_mask is the bit mask of black-listed bytes
+     * set bits 0..6, 14..25, and 28..31
+     * 0xf3ffc07f = binary 11110011111111111100000001111111
+     */
+    unsigned long black_mask = 0xf3ffc07fUL;
+    int n;
+
+    /* Check for non-textual ("black-listed") bytes. */
+    for (n = 0; n <= 31; n++, black_mask >>= 1)
+        if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0))
+            return Z_BINARY;
+
+    /* Check for textual ("white-listed") bytes. */
+    if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
+            || s->dyn_ltree[13].Freq != 0)
+        return Z_TEXT;
+    for (n = 32; n < LITERALS; n++)
+        if (s->dyn_ltree[n].Freq != 0)
+            return Z_TEXT;
+
+    /* There are no "black-listed" or "white-listed" bytes:
+     * this stream either is empty or has tolerated ("gray-listed") bytes only.
+     */
+    return Z_BINARY;
+}
+
+/* ===========================================================================
+ * Reverse the first len bits of a code, using straightforward code (a faster
+ * method would use a table)
+ * IN assertion: 1 <= len <= 15
+ */
+local unsigned bi_reverse(
+    unsigned code, /* the value to invert */
+    int len)       /* its bit length */
+{
+    register unsigned res = 0;
+    do {
+        res |= code & 1;
+        code >>= 1, res <<= 1;
+    } while (--len > 0);
+    return res >> 1;
+}
+
+/* ===========================================================================
+ * Flush the bit buffer, keeping at most 7 bits in it.
+ */
+local void bi_flush(
+    deflate_state *s)
+{
+    if (s->bi_valid == 16) {
+        put_short(s, s->bi_buf);
+        s->bi_buf = 0;
+        s->bi_valid = 0;
+    } else if (s->bi_valid >= 8) {
+        put_byte(s, (Byte)s->bi_buf);
+        s->bi_buf >>= 8;
+        s->bi_valid -= 8;
+    }
+}
+
+/* ===========================================================================
+ * Flush the bit buffer and align the output on a byte boundary
+ */
+local void bi_windup(
+    deflate_state *s)
+{
+    if (s->bi_valid > 8) {
+        put_short(s, s->bi_buf);
+    } else if (s->bi_valid > 0) {
+        put_byte(s, (Byte)s->bi_buf);
+    }
+    s->bi_buf = 0;
+    s->bi_valid = 0;
+#ifdef DEBUG
+    s->bits_sent = (s->bits_sent+7) & ~7;
+#endif
+}
+
+/* ===========================================================================
+ * Copy a stored block, storing first the length and its
+ * one's complement if requested.
+ */
+local void copy_block(
+    deflate_state *s,
+    charf    *buf,    /* the input data */
+    unsigned len,     /* its length */
+    int      header)  /* true if block header must be written */
+{
+    bi_windup(s);        /* align on byte boundary */
+
+    if (header) {
+        put_short(s, (ush)len);
+        put_short(s, (ush)~len);
+#ifdef DEBUG
+        s->bits_sent += 2*16;
+#endif
+    }
+#ifdef DEBUG
+    s->bits_sent += (ulg)len<<3;
+#endif
+    while (len--) {
+        put_byte(s, *buf++);
+    }
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_uncompr.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_uncompr.c
new file mode 100644
index 0000000..d3cb8fe
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_uncompr.c
@@ -0,0 +1,59 @@
+/* uncompr.c -- decompress a memory buffer
+ * Copyright (C) 1995-2003, 2010 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#define ZLIB_INTERNAL
+#include "zlib.h"
+
+/* ===========================================================================
+     Decompresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer. Upon entry, destLen is the total
+   size of the destination buffer, which must be large enough to hold the
+   entire uncompressed data. (The size of the uncompressed data must have
+   been saved previously by the compressor and transmitted to the decompressor
+   by some mechanism outside the scope of this compression library.)
+   Upon exit, destLen is the actual size of the compressed buffer.
+
+     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer, or Z_DATA_ERROR if the input data was corrupted.
+*/
+int ZEXPORT uncompress (
+    Bytef *dest,
+    uLongf *destLen,
+    const Bytef *source,
+    uLong sourceLen)
+{
+    z_stream stream;
+    int err;
+
+    stream.next_in = (z_const Bytef *)source;
+    stream.avail_in = (uInt)sourceLen;
+    /* Check for source > 64K on 16-bit machine: */
+    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+
+    stream.next_out = dest;
+    stream.avail_out = (uInt)*destLen;
+    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+    stream.zalloc = (alloc_func)0;
+    stream.zfree = (free_func)0;
+
+    err = inflateInit(&stream);
+    if (err != Z_OK) return err;
+
+    err = inflate(&stream, Z_FINISH);
+    if (err != Z_STREAM_END) {
+        inflateEnd(&stream);
+        if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
+            return Z_DATA_ERROR;
+        return err;
+    }
+    *destLen = stream.total_out;
+
+    err = inflateEnd(&stream);
+    return err;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_zutil.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_zutil.c
new file mode 100644
index 0000000..02b945f
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_zutil.c
@@ -0,0 +1,349 @@
+/* zutil.c -- target dependent utility functions for the compression library
+ * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zutil.h"
+#ifndef Z_SOLO
+#  include "gzguts.h"
+#endif
+
+#ifndef NO_DUMMY_DECL
+struct internal_state      {int dummy;}; /* for buggy compilers */
+#endif
+
+z_const char * const z_errmsg[10] = {
+"need dictionary",     /* Z_NEED_DICT       2  */
+"stream end",          /* Z_STREAM_END      1  */
+"",                    /* Z_OK              0  */
+"file error",          /* Z_ERRNO         (-1) */
+"stream error",        /* Z_STREAM_ERROR  (-2) */
+"data error",          /* Z_DATA_ERROR    (-3) */
+"insufficient memory", /* Z_MEM_ERROR     (-4) */
+"buffer error",        /* Z_BUF_ERROR     (-5) */
+"incompatible version",/* Z_VERSION_ERROR (-6) */
+""};
+
+
+const char * ZEXPORT zlibVersion()
+{
+    return ZLIB_VERSION;
+}
+
+uLong ZEXPORT zlibCompileFlags()
+{
+    uLong flags;
+
+    flags = 0;
+    switch ((int)(sizeof(uInt))) {
+    case 2:     break;
+    case 4:     flags += 1;     break;
+    case 8:     flags += 2;     break;
+    default:    flags += 3;
+    }
+    switch ((int)(sizeof(uLong))) {
+    case 2:     break;
+    case 4:     flags += 1 << 2;        break;
+    case 8:     flags += 2 << 2;        break;
+    default:    flags += 3 << 2;
+    }
+    switch ((int)(sizeof(voidpf))) {
+    case 2:     break;
+    case 4:     flags += 1 << 4;        break;
+    case 8:     flags += 2 << 4;        break;
+    default:    flags += 3 << 4;
+    }
+    switch ((int)(sizeof(z_off_t))) {
+    case 2:     break;
+    case 4:     flags += 1 << 6;        break;
+    case 8:     flags += 2 << 6;        break;
+    default:    flags += 3 << 6;
+    }
+#ifdef DEBUG
+    flags += 1 << 8;
+#endif
+#if defined(ASMV) || defined(ASMINF)
+    flags += 1 << 9;
+#endif
+#ifdef ZLIB_WINAPI
+    flags += 1 << 10;
+#endif
+#ifdef BUILDFIXED
+    flags += 1 << 12;
+#endif
+#ifdef DYNAMIC_CRC_TABLE
+    flags += 1 << 13;
+#endif
+#ifdef NO_GZCOMPRESS
+    flags += 1L << 16;
+#endif
+#ifdef NO_GZIP
+    flags += 1L << 17;
+#endif
+#ifdef PKZIP_BUG_WORKAROUND
+    flags += 1L << 20;
+#endif
+#ifdef FASTEST
+    flags += 1L << 21;
+#endif
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+#  ifdef NO_vsnprintf
+    flags += 1L << 25;
+#    ifdef HAS_vsprintf_void
+    flags += 1L << 26;
+#    endif
+#  else
+#    ifdef HAS_vsnprintf_void
+    flags += 1L << 26;
+#    endif
+#  endif
+#else
+    flags += 1L << 24;
+#  ifdef NO_snprintf
+    flags += 1L << 25;
+#    ifdef HAS_sprintf_void
+    flags += 1L << 26;
+#    endif
+#  else
+#    ifdef HAS_snprintf_void
+    flags += 1L << 26;
+#    endif
+#  endif
+#endif
+    return flags;
+}
+
+#ifdef DEBUG
+
+#  ifndef verbose
+#    define verbose 0
+#  endif
+int ZLIB_INTERNAL z_verbose = verbose;
+
+void ZLIB_INTERNAL z_error (
+    char *m)
+{
+    fprintf(stderr, "%s\n", m);
+    exit(1);
+}
+#endif
+
+/* exported to allow conversion of error code to string for compress() and
+ * uncompress()
+ */
+const char * ZEXPORT zError(
+    int err)
+{
+    return ERR_MSG(err);
+}
+
+#if defined(_WIN32_WCE)
+    /* The Microsoft C Run-Time Library for Windows CE doesn't have
+     * errno.  We define it as a global variable to simplify porting.
+     * Its value is always 0 and should not be used.
+     */
+	/* does not exist on WCE. XYQ: and we don't need it! */
+    /*int errno = 0;*/
+#endif
+
+#ifndef HAVE_MEMCPY
+
+void ZLIB_INTERNAL zmemcpy(
+    Bytef* dest,
+    const Bytef* source,
+    uInt  len)
+{
+    if (len == 0) return;
+    do {
+        *dest++ = *source++; /* ??? to be unrolled */
+    } while (--len != 0);
+}
+
+int ZLIB_INTERNAL zmemcmp(
+    const Bytef* s1,
+    const Bytef* s2,
+    uInt  len)
+{
+    uInt j;
+
+    for (j = 0; j < len; j++) {
+        if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
+    }
+    return 0;
+}
+
+void ZLIB_INTERNAL zmemzero(
+    Bytef* dest,
+    uInt  len)
+{
+    if (len == 0) return;
+    do {
+        *dest++ = 0;  /* ??? to be unrolled */
+    } while (--len != 0);
+}
+#endif
+
+#if 0
+#ifndef Z_SOLO
+
+#ifdef SYS16BIT
+
+#ifdef __TURBOC__
+/* Turbo C in 16-bit mode */
+
+#  define MY_ZCALLOC
+
+/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
+ * and farmalloc(64K) returns a pointer with an offset of 8, so we
+ * must fix the pointer. Warning: the pointer must be put back to its
+ * original form in order to free it, use zcfree().
+ */
+
+#define MAX_PTR 10
+/* 10*64K = 640K */
+
+local int next_ptr = 0;
+
+typedef struct ptr_table_s {
+    voidpf org_ptr;
+    voidpf new_ptr;
+} ptr_table;
+
+local ptr_table table[MAX_PTR];
+/* This table is used to remember the original form of pointers
+ * to large buffers (64K). Such pointers are normalized with a zero offset.
+ * Since MSDOS is not a preemptive multitasking OS, this table is not
+ * protected from concurrent access. This hack doesn't work anyway on
+ * a protected system like OS/2. Use Microsoft C instead.
+ */
+
+voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
+{
+    voidpf buf = opaque; /* just to make some compilers happy */
+    ulg bsize = (ulg)items*size;
+
+    /* If we allocate less than 65520 bytes, we assume that farmalloc
+     * will return a usable pointer which doesn't have to be normalized.
+     */
+    if (bsize < 65520L) {
+        buf = farmalloc(bsize);
+        if (*(ush*)&buf != 0) return buf;
+    } else {
+        buf = farmalloc(bsize + 16L);
+    }
+    if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
+    table[next_ptr].org_ptr = buf;
+
+    /* Normalize the pointer to seg:0 */
+    *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
+    *(ush*)&buf = 0;
+    table[next_ptr++].new_ptr = buf;
+    return buf;
+}
+
+void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
+{
+    int n;
+    if (*(ush*)&ptr != 0) { /* object < 64K */
+        farfree(ptr);
+        return;
+    }
+    /* Find the original pointer */
+    for (n = 0; n < next_ptr; n++) {
+        if (ptr != table[n].new_ptr) continue;
+
+        farfree(table[n].org_ptr);
+        while (++n < next_ptr) {
+            table[n-1] = table[n];
+        }
+        next_ptr--;
+        return;
+    }
+    ptr = opaque; /* just to make some compilers happy */
+    Assert(0, "zcfree: ptr not found");
+}
+
+#endif /* __TURBOC__ */
+
+
+#ifdef M_I86
+/* Microsoft C in 16-bit mode */
+
+#  define MY_ZCALLOC
+
+#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
+#  define _halloc  halloc
+#  define _hfree   hfree
+#endif
+
+voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size)
+{
+    if (opaque) opaque = 0; /* to make compiler happy */
+    return _halloc((long)items, size);
+}
+
+void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
+{
+    if (opaque) opaque = 0; /* to make compiler happy */
+    _hfree(ptr);
+}
+
+#endif /* M_I86 */
+
+#endif /* SYS16BIT */
+
+
+#ifndef MY_ZCALLOC /* Any system without a special alloc function */
+
+#ifndef STDC
+extern voidp  malloc OF((uInt size));
+extern voidp  calloc OF((uInt items, uInt size));
+extern void   free   OF((voidpf ptr));
+#endif
+
+voidpf ZLIB_INTERNAL zcalloc (opaque, items, size)
+    voidpf opaque;
+    unsigned items;
+    unsigned size;
+{
+    if (opaque) items += size - size; /* make compiler happy */
+    return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
+                              (voidpf)calloc(items, size);
+}
+
+void ZLIB_INTERNAL zcfree (opaque, ptr)
+    voidpf opaque;
+    voidpf ptr;
+{
+    free(ptr);
+    if (opaque) return; /* make compiler happy */
+}
+
+#endif /* MY_ZCALLOC */
+
+#endif /* !Z_SOLO */
+#endif	/* 0 */
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+extern "C" {
+#endif
+
+extern void* FXMEM_DefaultAlloc(size_t, int);
+extern void FXMEM_DefaultFree(void*, int);
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+}
+#endif
+
+/* XYQ 2007-1-19 */
+voidpf zcalloc(voidpf opaque, unsigned items, unsigned size)
+{
+	return FXMEM_DefaultAlloc(items * size, 0);
+}
+
+void zcfree(voidpf opaque, voidpf ptr)
+{
+	FXMEM_DefaultFree(ptr, 0);
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/gzclose.c b/core/src/fxcodec/fx_zlib/zlib_v128/gzclose.c
new file mode 100644
index 0000000..0f010b8
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/gzclose.c
@@ -0,0 +1,25 @@
+/* gzclose.c -- zlib gzclose() function
+ * Copyright (C) 2004, 2010 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "gzguts.h"
+
+/* gzclose() is in a separate file so that it is linked in only if it is used.
+   That way the other gzclose functions can be used instead to avoid linking in
+   unneeded compression or decompression routines. */
+int ZEXPORT gzclose(
+    gzFile file)
+{
+#ifndef NO_GZCOMPRESS
+    gz_statep state;
+
+    if (file == NULL)
+        return Z_STREAM_ERROR;
+    state = (gz_statep)file;
+
+    return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file);
+#else
+    return gzclose_r(file);
+#endif
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/gzguts.h b/core/src/fxcodec/fx_zlib/zlib_v128/gzguts.h
new file mode 100644
index 0000000..e4454aa
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/gzguts.h
@@ -0,0 +1,227 @@
+/* gzguts.h -- zlib internal header definitions for gz* operations
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#ifdef _LARGEFILE64_SOURCE
+#  ifndef _LARGEFILE_SOURCE
+#    define _LARGEFILE_SOURCE 1
+#  endif
+#  ifdef _FILE_OFFSET_BITS
+#    undef _FILE_OFFSET_BITS
+#  endif
+#endif
+
+#ifdef HAVE_HIDDEN
+#  define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
+#else
+#  define ZLIB_INTERNAL
+#endif
+
+#include <stdio.h>
+#include "zlib.h"
+#ifdef STDC
+#  include <string.h>
+#  include <stdlib.h>
+#  include <limits.h>
+#endif
+#include <fcntl.h>
+
+#ifdef _WIN32
+#  include <stddef.h>
+#endif
+
+#ifdef __APPLE__
+#include <unistd.h>
+#endif
+
+#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32)
+#  include <io.h>
+#endif
+
+#ifdef WINAPI_FAMILY
+#  define open _open
+#  define read _read
+#  define write _write
+#  define close _close
+#endif
+
+#ifdef NO_DEFLATE       /* for compatibility with old definition */
+#  define NO_GZCOMPRESS
+#endif
+
+#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
+#  ifndef HAVE_VSNPRINTF
+#    define HAVE_VSNPRINTF
+#  endif
+#endif
+
+#if defined(__CYGWIN__)
+#  ifndef HAVE_VSNPRINTF
+#    define HAVE_VSNPRINTF
+#  endif
+#endif
+
+#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410)
+#  ifndef HAVE_VSNPRINTF
+#    define HAVE_VSNPRINTF
+#  endif
+#endif
+
+#ifndef HAVE_VSNPRINTF
+#  ifdef MSDOS
+/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
+   but for now we just assume it doesn't. */
+#    define NO_vsnprintf
+#  endif
+#  ifdef __TURBOC__
+#    define NO_vsnprintf
+#  endif
+#  ifdef WIN32
+/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
+#    if !defined(vsnprintf) && !defined(NO_vsnprintf)
+#      if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )
+#         define vsnprintf _vsnprintf
+#      endif
+#    endif
+#  endif
+#  ifdef __SASC
+#    define NO_vsnprintf
+#  endif
+#  ifdef VMS
+#    define NO_vsnprintf
+#  endif
+#  ifdef __OS400__
+#    define NO_vsnprintf
+#  endif
+#  ifdef __MVS__
+#    define NO_vsnprintf
+#  endif
+#endif
+
+/* unlike snprintf (which is required in C99, yet still not supported by
+   Microsoft more than a decade later!), _snprintf does not guarantee null
+   termination of the result -- however this is only used in gzlib.c where
+   the result is assured to fit in the space provided */
+#ifdef _MSC_VER
+#  define snprintf _snprintf
+#endif
+
+#ifndef local
+#  define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+/* gz* functions always use library allocation functions */
+#ifndef STDC
+  extern voidp  malloc OF((uInt size));
+  extern void   free   OF((voidpf ptr));
+#endif
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+extern "C" {
+#endif
+
+extern void* FXMEM_DefaultAlloc(size_t, int);
+extern void FXMEM_DefaultFree(void*, int);
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+}
+#endif
+
+#define malloc(size) FXMEM_DefaultAlloc(size, 0)
+#define free(ptr) FXMEM_DefaultFree(ptr, 0)
+
+/* get errno and strerror definition */
+#if defined UNDER_CE
+#  include <windows.h>
+#  define zstrerror() gz_strwinerror((DWORD)GetLastError())
+#else
+#  ifndef NO_STRERROR
+#    include <errno.h>
+#    define zstrerror() strerror(errno)
+#  else
+#    define zstrerror() "stdio error (consult errno)"
+#  endif
+#endif
+
+/* provide prototypes for these when building zlib without LFS */
+#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
+    ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+    ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
+    ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
+    ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+#endif
+
+/* default memLevel */
+#if MAX_MEM_LEVEL >= 8
+#  define DEF_MEM_LEVEL 8
+#else
+#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
+#endif
+
+/* default i/o buffer size -- double this for output when reading (this and
+   twice this must be able to fit in an unsigned type) */
+#define GZBUFSIZE 8192
+
+/* gzip modes, also provide a little integrity check on the passed structure */
+#define GZ_NONE 0
+#define GZ_READ 7247
+#define GZ_WRITE 31153
+#define GZ_APPEND 1     /* mode set to GZ_WRITE after the file is opened */
+
+/* values for gz_state how */
+#define LOOK 0      /* look for a gzip header */
+#define COPY 1      /* copy input directly */
+#define GZIP 2      /* decompress a gzip stream */
+
+/* internal gzip file state data structure */
+typedef struct {
+        /* exposed contents for gzgetc() macro */
+    struct gzFile_s x;      /* "x" for exposed */
+                            /* x.have: number of bytes available at x.next */
+                            /* x.next: next output data to deliver or write */
+                            /* x.pos: current position in uncompressed data */
+        /* used for both reading and writing */
+    int mode;               /* see gzip modes above */
+    int fd;                 /* file descriptor */
+    char *path;             /* path or fd for error messages */
+    unsigned size;          /* buffer size, zero if not allocated yet */
+    unsigned want;          /* requested buffer size, default is GZBUFSIZE */
+    unsigned char *in;      /* input buffer */
+    unsigned char *out;     /* output buffer (double-sized when reading) */
+    int direct;             /* 0 if processing gzip, 1 if transparent */
+        /* just for reading */
+    int how;                /* 0: get header, 1: copy, 2: decompress */
+    z_off64_t start;        /* where the gzip data started, for rewinding */
+    int eof;                /* true if end of input file reached */
+    int past;               /* true if read requested past end */
+        /* just for writing */
+    int level;              /* compression level */
+    int strategy;           /* compression strategy */
+        /* seek request */
+    z_off64_t skip;         /* amount to skip (already rewound if backwards) */
+    int seek;               /* true if seek request pending */
+        /* error information */
+    int err;                /* error code */
+    char *msg;              /* error message */
+        /* zlib inflate or deflate stream */
+    z_stream strm;          /* stream structure in-place (not a pointer) */
+} gz_state;
+typedef gz_state FAR *gz_statep;
+
+/* shared functions */
+void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));
+#if defined UNDER_CE
+char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
+#endif
+
+/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
+   value -- needed when comparing unsigned to z_off64_t, which is signed
+   (possible z_off64_t types off_t, off64_t, and long are all signed) */
+#ifdef INT_MAX
+#  define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
+#else
+unsigned ZLIB_INTERNAL gz_intmax OF((void));
+#  define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
+#endif
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/gzlib.c b/core/src/fxcodec/fx_zlib/zlib_v128/gzlib.c
new file mode 100644
index 0000000..68b1764
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/gzlib.c
@@ -0,0 +1,634 @@
+/* gzlib.c -- zlib functions common to reading and writing gzip files
+ * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "gzguts.h"
+
+#if defined(_WIN32) && !defined(__BORLANDC__)
+#  define LSEEK _lseeki64
+#else
+#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
+#  define LSEEK lseek64
+#else
+#  define LSEEK lseek
+#endif
+#endif
+
+/* Local functions */
+local void gz_reset OF((gz_statep));
+local gzFile gz_open OF((const void *, int, const char *));
+
+#if defined UNDER_CE
+
+/* Map the Windows error number in ERROR to a locale-dependent error message
+   string and return a pointer to it.  Typically, the values for ERROR come
+   from GetLastError.
+
+   The string pointed to shall not be modified by the application, but may be
+   overwritten by a subsequent call to gz_strwinerror
+
+   The gz_strwinerror function does not change the current setting of
+   GetLastError. */
+char ZLIB_INTERNAL *gz_strwinerror (
+     DWORD error)
+{
+    static char buf[1024];
+
+    wchar_t *msgbuf;
+    DWORD lasterr = GetLastError();
+    DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
+        | FORMAT_MESSAGE_ALLOCATE_BUFFER,
+        NULL,
+        error,
+        0, /* Default language */
+        (LPVOID)&msgbuf,
+        0,
+        NULL);
+    if (chars != 0) {
+        /* If there is an \r\n appended, zap it.  */
+        if (chars >= 2
+            && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') {
+            chars -= 2;
+            msgbuf[chars] = 0;
+        }
+
+        if (chars > sizeof (buf) - 1) {
+            chars = sizeof (buf) - 1;
+            msgbuf[chars] = 0;
+        }
+
+        wcstombs(buf, msgbuf, chars + 1);
+        LocalFree(msgbuf);
+    }
+    else {
+        sprintf(buf, "unknown win32 error (%ld)", error);
+    }
+
+    SetLastError(lasterr);
+    return buf;
+}
+
+#endif /* UNDER_CE */
+
+/* Reset gzip file state */
+local void gz_reset(
+    gz_statep state)
+{
+    state->x.have = 0;              /* no output data available */
+    if (state->mode == GZ_READ) {   /* for reading ... */
+        state->eof = 0;             /* not at end of file */
+        state->past = 0;            /* have not read past end yet */
+        state->how = LOOK;          /* look for gzip header */
+    }
+    state->seek = 0;                /* no seek request pending */
+    gz_error(state, Z_OK, NULL);    /* clear error */
+    state->x.pos = 0;               /* no uncompressed data yet */
+    state->strm.avail_in = 0;       /* no input data yet */
+}
+
+/* Open a gzip file either by name or file descriptor. */
+local gzFile gz_open(
+    const void *path,
+    int fd,
+    const char *mode)
+{
+    gz_statep state;
+    size_t len;
+    int oflag;
+#ifdef O_CLOEXEC
+    int cloexec = 0;
+#endif
+#ifdef O_EXCL
+    int exclusive = 0;
+#endif
+
+    /* check input */
+    if (path == NULL)
+        return NULL;
+
+    /* allocate gzFile structure to return */
+    state = (gz_statep)malloc(sizeof(gz_state));
+    if (state == NULL)
+        return NULL;
+    state->size = 0;            /* no buffers allocated yet */
+    state->want = GZBUFSIZE;    /* requested buffer size */
+    state->msg = NULL;          /* no error message yet */
+
+    /* interpret mode */
+    state->mode = GZ_NONE;
+    state->level = Z_DEFAULT_COMPRESSION;
+    state->strategy = Z_DEFAULT_STRATEGY;
+    state->direct = 0;
+    while (*mode) {
+        if (*mode >= '0' && *mode <= '9')
+            state->level = *mode - '0';
+        else
+            switch (*mode) {
+            case 'r':
+                state->mode = GZ_READ;
+                break;
+#ifndef NO_GZCOMPRESS
+            case 'w':
+                state->mode = GZ_WRITE;
+                break;
+            case 'a':
+                state->mode = GZ_APPEND;
+                break;
+#endif
+            case '+':       /* can't read and write at the same time */
+                free(state);
+                return NULL;
+            case 'b':       /* ignore -- will request binary anyway */
+                break;
+#ifdef O_CLOEXEC
+            case 'e':
+                cloexec = 1;
+                break;
+#endif
+#ifdef O_EXCL
+            case 'x':
+                exclusive = 1;
+                break;
+#endif
+            case 'f':
+                state->strategy = Z_FILTERED;
+                break;
+            case 'h':
+                state->strategy = Z_HUFFMAN_ONLY;
+                break;
+            case 'R':
+                state->strategy = Z_RLE;
+                break;
+            case 'F':
+                state->strategy = Z_FIXED;
+                break;
+            case 'T':
+                state->direct = 1;
+                break;
+            default:        /* could consider as an error, but just ignore */
+                ;
+            }
+        mode++;
+    }
+
+    /* must provide an "r", "w", or "a" */
+    if (state->mode == GZ_NONE) {
+        free(state);
+        return NULL;
+    }
+
+    /* can't force transparent read */
+    if (state->mode == GZ_READ) {
+        if (state->direct) {
+            free(state);
+            return NULL;
+        }
+        state->direct = 1;      /* for empty file */
+    }
+
+    /* save the path name for error messages */
+#ifdef _WIN32
+    if (fd == -2) {
+        len = wcstombs(NULL, path, 0);
+        if (len == (size_t)-1)
+            len = 0;
+    }
+    else
+#endif
+        len = strlen((const char *)path);
+    state->path = (char *)malloc(len + 1);
+    if (state->path == NULL) {
+        free(state);
+        return NULL;
+    }
+#ifdef _WIN32
+    if (fd == -2)
+        if (len)
+            wcstombs(state->path, path, len + 1);
+        else
+            *(state->path) = 0;
+    else
+#endif
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+        snprintf(state->path, len + 1, "%s", (const char *)path);
+#else
+        strcpy(state->path, path);
+#endif
+
+    /* compute the flags for open() */
+    oflag =
+#ifdef O_LARGEFILE
+        O_LARGEFILE |
+#endif
+#ifdef O_BINARY
+        O_BINARY |
+#endif
+#ifdef O_CLOEXEC
+        (cloexec ? O_CLOEXEC : 0) |
+#endif
+        (state->mode == GZ_READ ?
+         O_RDONLY :
+         (O_WRONLY | O_CREAT |
+#ifdef O_EXCL
+          (exclusive ? O_EXCL : 0) |
+#endif
+          (state->mode == GZ_WRITE ?
+           O_TRUNC :
+           O_APPEND)));
+
+    /* open the file with the appropriate flags (or just use fd) */
+    state->fd = fd > -1 ? fd : (
+#ifdef _WIN32
+        fd == -2 ? _wopen(path, oflag, 0666) :
+#endif
+        open((const char *)path, oflag, 0666));
+    if (state->fd == -1) {
+        free(state->path);
+        free(state);
+        return NULL;
+    }
+    if (state->mode == GZ_APPEND)
+        state->mode = GZ_WRITE;         /* simplify later checks */
+
+    /* save the current position for rewinding (only if reading) */
+    if (state->mode == GZ_READ) {
+        state->start = LSEEK(state->fd, 0, SEEK_CUR);
+        if (state->start == -1) state->start = 0;
+    }
+
+    /* initialize stream */
+    gz_reset(state);
+
+    /* return stream */
+    return (gzFile)state;
+}
+
+/* -- see zlib.h -- */
+gzFile ZEXPORT gzopen(
+    const char *path,
+    const char *mode)
+{
+    return gz_open(path, -1, mode);
+}
+
+/* -- see zlib.h -- */
+gzFile ZEXPORT gzopen64(
+    const char *path,
+    const char *mode)
+{
+    return gz_open(path, -1, mode);
+}
+
+/* -- see zlib.h -- */
+gzFile ZEXPORT gzdopen(
+    int fd,
+    const char *mode)
+{
+    char *path;         /* identifier for error messages */
+    gzFile gz;
+
+    if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL)
+        return NULL;
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+    snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd); /* for debugging */
+#else
+    sprintf(path, "<fd:%d>", fd);   /* for debugging */
+#endif
+    gz = gz_open(path, fd, mode);
+    free(path);
+    return gz;
+}
+
+/* -- see zlib.h -- */
+#ifdef _WIN32
+gzFile ZEXPORT gzopen_w(
+    const wchar_t *path,
+    const char *mode)
+{
+    return gz_open(path, -2, mode);
+}
+#endif
+
+/* -- see zlib.h -- */
+int ZEXPORT gzbuffer(
+    gzFile file,
+    unsigned size)
+{
+    gz_statep state;
+
+    /* get internal structure and check integrity */
+    if (file == NULL)
+        return -1;
+    state = (gz_statep)file;
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+        return -1;
+
+    /* make sure we haven't already allocated memory */
+    if (state->size != 0)
+        return -1;
+
+    /* check and set requested size */
+    if (size < 2)
+        size = 2;               /* need two bytes to check magic header */
+    state->want = size;
+    return 0;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzrewind(
+    gzFile file)
+{
+    gz_statep state;
+
+    /* get internal structure */
+    if (file == NULL)
+        return -1;
+    state = (gz_statep)file;
+
+    /* check that we're reading and that there's no error */
+    if (state->mode != GZ_READ ||
+            (state->err != Z_OK && state->err != Z_BUF_ERROR))
+        return -1;
+
+    /* back up and start over */
+    if (LSEEK(state->fd, state->start, SEEK_SET) == -1)
+        return -1;
+    gz_reset(state);
+    return 0;
+}
+
+/* -- see zlib.h -- */
+z_off64_t ZEXPORT gzseek64(
+    gzFile file,
+    z_off64_t offset,
+    int whence)
+{
+    unsigned n;
+    z_off64_t ret;
+    gz_statep state;
+
+    /* get internal structure and check integrity */
+    if (file == NULL)
+        return -1;
+    state = (gz_statep)file;
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+        return -1;
+
+    /* check that there's no error */
+    if (state->err != Z_OK && state->err != Z_BUF_ERROR)
+        return -1;
+
+    /* can only seek from start or relative to current position */
+    if (whence != SEEK_SET && whence != SEEK_CUR)
+        return -1;
+
+    /* normalize offset to a SEEK_CUR specification */
+    if (whence == SEEK_SET)
+        offset -= state->x.pos;
+    else if (state->seek)
+        offset += state->skip;
+    state->seek = 0;
+
+    /* if within raw area while reading, just go there */
+    if (state->mode == GZ_READ && state->how == COPY &&
+            state->x.pos + offset >= 0) {
+        ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR);
+        if (ret == -1)
+            return -1;
+        state->x.have = 0;
+        state->eof = 0;
+        state->past = 0;
+        state->seek = 0;
+        gz_error(state, Z_OK, NULL);
+        state->strm.avail_in = 0;
+        state->x.pos += offset;
+        return state->x.pos;
+    }
+
+    /* calculate skip amount, rewinding if needed for back seek when reading */
+    if (offset < 0) {
+        if (state->mode != GZ_READ)         /* writing -- can't go backwards */
+            return -1;
+        offset += state->x.pos;
+        if (offset < 0)                     /* before start of file! */
+            return -1;
+        if (gzrewind(file) == -1)           /* rewind, then skip to offset */
+            return -1;
+    }
+
+    /* if reading, skip what's in output buffer (one less gzgetc() check) */
+    if (state->mode == GZ_READ) {
+        n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ?
+            (unsigned)offset : state->x.have;
+        state->x.have -= n;
+        state->x.next += n;
+        state->x.pos += n;
+        offset -= n;
+    }
+
+    /* request skip (if not zero) */
+    if (offset) {
+        state->seek = 1;
+        state->skip = offset;
+    }
+    return state->x.pos + offset;
+}
+
+/* -- see zlib.h -- */
+z_off_t ZEXPORT gzseek(
+    gzFile file,
+    z_off_t offset,
+    int whence)
+{
+    z_off64_t ret;
+
+    ret = gzseek64(file, (z_off64_t)offset, whence);
+    return ret == (z_off_t)ret ? (z_off_t)ret : -1;
+}
+
+/* -- see zlib.h -- */
+z_off64_t ZEXPORT gztell64(
+    gzFile file)
+{
+    gz_statep state;
+
+    /* get internal structure and check integrity */
+    if (file == NULL)
+        return -1;
+    state = (gz_statep)file;
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+        return -1;
+
+    /* return position */
+    return state->x.pos + (state->seek ? state->skip : 0);
+}
+
+/* -- see zlib.h -- */
+z_off_t ZEXPORT gztell(
+    gzFile file)
+{
+    z_off64_t ret;
+
+    ret = gztell64(file);
+    return ret == (z_off_t)ret ? (z_off_t)ret : -1;
+}
+
+/* -- see zlib.h -- */
+z_off64_t ZEXPORT gzoffset64(
+    gzFile file)
+{
+    z_off64_t offset;
+    gz_statep state;
+
+    /* get internal structure and check integrity */
+    if (file == NULL)
+        return -1;
+    state = (gz_statep)file;
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+        return -1;
+
+    /* compute and return effective offset in file */
+    offset = LSEEK(state->fd, 0, SEEK_CUR);
+    if (offset == -1)
+        return -1;
+    if (state->mode == GZ_READ)             /* reading */
+        offset -= state->strm.avail_in;     /* don't count buffered input */
+    return offset;
+}
+
+/* -- see zlib.h -- */
+z_off_t ZEXPORT gzoffset(
+    gzFile file)
+{
+    z_off64_t ret;
+
+    ret = gzoffset64(file);
+    return ret == (z_off_t)ret ? (z_off_t)ret : -1;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzeof(
+    gzFile file)
+{
+    gz_statep state;
+
+    /* get internal structure and check integrity */
+    if (file == NULL)
+        return 0;
+    state = (gz_statep)file;
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+        return 0;
+
+    /* return end-of-file state */
+    return state->mode == GZ_READ ? state->past : 0;
+}
+
+/* -- see zlib.h -- */
+const char * ZEXPORT gzerror(
+    gzFile file,
+    int *errnum)
+{
+    gz_statep state;
+
+    /* get internal structure and check integrity */
+    if (file == NULL)
+        return NULL;
+    state = (gz_statep)file;
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+        return NULL;
+
+    /* return error information */
+    if (errnum != NULL)
+        *errnum = state->err;
+    return state->err == Z_MEM_ERROR ? "out of memory" :
+                                       (state->msg == NULL ? "" : state->msg);
+}
+
+/* -- see zlib.h -- */
+void ZEXPORT gzclearerr(
+    gzFile file)
+{
+    gz_statep state;
+
+    /* get internal structure and check integrity */
+    if (file == NULL)
+        return;
+    state = (gz_statep)file;
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+        return;
+
+    /* clear error and end-of-file */
+    if (state->mode == GZ_READ) {
+        state->eof = 0;
+        state->past = 0;
+    }
+    gz_error(state, Z_OK, NULL);
+}
+
+/* Create an error message in allocated memory and set state->err and
+   state->msg accordingly.  Free any previous error message already there.  Do
+   not try to free or allocate space if the error is Z_MEM_ERROR (out of
+   memory).  Simply save the error message as a static string.  If there is an
+   allocation failure constructing the error message, then convert the error to
+   out of memory. */
+void ZLIB_INTERNAL gz_error(
+    gz_statep state,
+    int err,
+    const char *msg)
+{
+    /* free previously allocated message and clear */
+    if (state->msg != NULL) {
+        if (state->err != Z_MEM_ERROR)
+            free(state->msg);
+        state->msg = NULL;
+    }
+
+    /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */
+    if (err != Z_OK && err != Z_BUF_ERROR)
+        state->x.have = 0;
+
+    /* set error code, and if no message, then done */
+    state->err = err;
+    if (msg == NULL)
+        return;
+
+    /* for an out of memory error, return literal string when requested */
+    if (err == Z_MEM_ERROR)
+        return;
+
+    /* construct error message with path */
+    if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) ==
+            NULL) {
+        state->err = Z_MEM_ERROR;
+        return;
+    }
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+    snprintf(state->msg, strlen(state->path) + strlen(msg) + 3,
+             "%s%s%s", state->path, ": ", msg);
+#else
+    strcpy(state->msg, state->path);
+    strcat(state->msg, ": ");
+    strcat(state->msg, msg);
+#endif
+    return;
+}
+
+#ifndef INT_MAX
+/* portably return maximum value for an int (when limits.h presumed not
+   available) -- we need to do this to cover cases where 2's complement not
+   used, since C standard permits 1's complement and sign-bit representations,
+   otherwise we could just use ((unsigned)-1) >> 1 */
+unsigned ZLIB_INTERNAL gz_intmax()
+{
+    unsigned p, q;
+
+    p = 1;
+    do {
+        q = p;
+        p <<= 1;
+        p++;
+    } while (p > q);
+    return q >> 1;
+}
+#endif
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/gzread.c b/core/src/fxcodec/fx_zlib/zlib_v128/gzread.c
new file mode 100644
index 0000000..f162a32
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/gzread.c
@@ -0,0 +1,594 @@
+/* gzread.c -- zlib functions for reading gzip files
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "gzguts.h"
+
+/* Local functions */
+local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));
+local int gz_avail OF((gz_statep));
+local int gz_look OF((gz_statep));
+local int gz_decomp OF((gz_statep));
+local int gz_fetch OF((gz_statep));
+local int gz_skip OF((gz_statep, z_off64_t));
+
+/* Use read() to load a buffer -- return -1 on error, otherwise 0.  Read from
+   state->fd, and update state->eof, state->err, and state->msg as appropriate.
+   This function needs to loop on read(), since read() is not guaranteed to
+   read the number of bytes requested, depending on the type of descriptor. */
+local int gz_load(
+    gz_statep state,
+    unsigned char *buf,
+    unsigned len,
+    unsigned *have)
+{
+    int ret;
+
+    *have = 0;
+    do {
+        ret = read(state->fd, buf + *have, len - *have);
+        if (ret <= 0)
+            break;
+        *have += ret;
+    } while (*have < len);
+    if (ret < 0) {
+        gz_error(state, Z_ERRNO, zstrerror());
+        return -1;
+    }
+    if (ret == 0)
+        state->eof = 1;
+    return 0;
+}
+
+/* Load up input buffer and set eof flag if last data loaded -- return -1 on
+   error, 0 otherwise.  Note that the eof flag is set when the end of the input
+   file is reached, even though there may be unused data in the buffer.  Once
+   that data has been used, no more attempts will be made to read the file.
+   If strm->avail_in != 0, then the current data is moved to the beginning of
+   the input buffer, and then the remainder of the buffer is loaded with the
+   available data from the input file. */
+local int gz_avail(
+    gz_statep state)
+{
+    unsigned got;
+    z_streamp strm = &(state->strm);
+
+    if (state->err != Z_OK && state->err != Z_BUF_ERROR)
+        return -1;
+    if (state->eof == 0) {
+        if (strm->avail_in) {       /* copy what's there to the start */
+            unsigned char *p = state->in;
+            unsigned const char *q = strm->next_in;
+            unsigned n = strm->avail_in;
+            do {
+                *p++ = *q++;
+            } while (--n);
+        }
+        if (gz_load(state, state->in + strm->avail_in,
+                    state->size - strm->avail_in, &got) == -1)
+            return -1;
+        strm->avail_in += got;
+        strm->next_in = state->in;
+    }
+    return 0;
+}
+
+/* Look for gzip header, set up for inflate or copy.  state->x.have must be 0.
+   If this is the first time in, allocate required memory.  state->how will be
+   left unchanged if there is no more input data available, will be set to COPY
+   if there is no gzip header and direct copying will be performed, or it will
+   be set to GZIP for decompression.  If direct copying, then leftover input
+   data from the input buffer will be copied to the output buffer.  In that
+   case, all further file reads will be directly to either the output buffer or
+   a user buffer.  If decompressing, the inflate state will be initialized.
+   gz_look() will return 0 on success or -1 on failure. */
+local int gz_look(
+    gz_statep state)
+{
+    z_streamp strm = &(state->strm);
+
+    /* allocate read buffers and inflate memory */
+    if (state->size == 0) {
+        /* allocate buffers */
+        state->in = (unsigned char *)malloc(state->want);
+        state->out = (unsigned char *)malloc(state->want << 1);
+        if (state->in == NULL || state->out == NULL) {
+            if (state->out != NULL)
+                free(state->out);
+            if (state->in != NULL)
+                free(state->in);
+            gz_error(state, Z_MEM_ERROR, "out of memory");
+            return -1;
+        }
+        state->size = state->want;
+
+        /* allocate inflate memory */
+        state->strm.zalloc = Z_NULL;
+        state->strm.zfree = Z_NULL;
+        state->strm.opaque = Z_NULL;
+        state->strm.avail_in = 0;
+        state->strm.next_in = Z_NULL;
+        if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) {    /* gunzip */
+            free(state->out);
+            free(state->in);
+            state->size = 0;
+            gz_error(state, Z_MEM_ERROR, "out of memory");
+            return -1;
+        }
+    }
+
+    /* get at least the magic bytes in the input buffer */
+    if (strm->avail_in < 2) {
+        if (gz_avail(state) == -1)
+            return -1;
+        if (strm->avail_in == 0)
+            return 0;
+    }
+
+    /* look for gzip magic bytes -- if there, do gzip decoding (note: there is
+       a logical dilemma here when considering the case of a partially written
+       gzip file, to wit, if a single 31 byte is written, then we cannot tell
+       whether this is a single-byte file, or just a partially written gzip
+       file -- for here we assume that if a gzip file is being written, then
+       the header will be written in a single operation, so that reading a
+       single byte is sufficient indication that it is not a gzip file) */
+    if (strm->avail_in > 1 &&
+            strm->next_in[0] == 31 && strm->next_in[1] == 139) {
+        inflateReset(strm);
+        state->how = GZIP;
+        state->direct = 0;
+        return 0;
+    }
+
+    /* no gzip header -- if we were decoding gzip before, then this is trailing
+       garbage.  Ignore the trailing garbage and finish. */
+    if (state->direct == 0) {
+        strm->avail_in = 0;
+        state->eof = 1;
+        state->x.have = 0;
+        return 0;
+    }
+
+    /* doing raw i/o, copy any leftover input to output -- this assumes that
+       the output buffer is larger than the input buffer, which also assures
+       space for gzungetc() */
+    state->x.next = state->out;
+    if (strm->avail_in) {
+        memcpy(state->x.next, strm->next_in, strm->avail_in);
+        state->x.have = strm->avail_in;
+        strm->avail_in = 0;
+    }
+    state->how = COPY;
+    state->direct = 1;
+    return 0;
+}
+
+/* Decompress from input to the provided next_out and avail_out in the state.
+   On return, state->x.have and state->x.next point to the just decompressed
+   data.  If the gzip stream completes, state->how is reset to LOOK to look for
+   the next gzip stream or raw data, once state->x.have is depleted.  Returns 0
+   on success, -1 on failure. */
+local int gz_decomp(
+    gz_statep state)
+{
+    int ret = Z_OK;
+    unsigned had;
+    z_streamp strm = &(state->strm);
+
+    /* fill output buffer up to end of deflate stream */
+    had = strm->avail_out;
+    do {
+        /* get more input for inflate() */
+        if (strm->avail_in == 0 && gz_avail(state) == -1)
+            return -1;
+        if (strm->avail_in == 0) {
+            gz_error(state, Z_BUF_ERROR, "unexpected end of file");
+            break;
+        }
+
+        /* decompress and handle errors */
+        ret = inflate(strm, Z_NO_FLUSH);
+        if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {
+            gz_error(state, Z_STREAM_ERROR,
+                     "internal error: inflate stream corrupt");
+            return -1;
+        }
+        if (ret == Z_MEM_ERROR) {
+            gz_error(state, Z_MEM_ERROR, "out of memory");
+            return -1;
+        }
+        if (ret == Z_DATA_ERROR) {              /* deflate stream invalid */
+            gz_error(state, Z_DATA_ERROR,
+                     strm->msg == NULL ? "compressed data error" : strm->msg);
+            return -1;
+        }
+    } while (strm->avail_out && ret != Z_STREAM_END);
+
+    /* update available output */
+    state->x.have = had - strm->avail_out;
+    state->x.next = strm->next_out - state->x.have;
+
+    /* if the gzip stream completed successfully, look for another */
+    if (ret == Z_STREAM_END)
+        state->how = LOOK;
+
+    /* good decompression */
+    return 0;
+}
+
+/* Fetch data and put it in the output buffer.  Assumes state->x.have is 0.
+   Data is either copied from the input file or decompressed from the input
+   file depending on state->how.  If state->how is LOOK, then a gzip header is
+   looked for to determine whether to copy or decompress.  Returns -1 on error,
+   otherwise 0.  gz_fetch() will leave state->how as COPY or GZIP unless the
+   end of the input file has been reached and all data has been processed.  */
+local int gz_fetch(
+    gz_statep state)
+{
+    z_streamp strm = &(state->strm);
+
+    do {
+        switch(state->how) {
+        case LOOK:      /* -> LOOK, COPY (only if never GZIP), or GZIP */
+            if (gz_look(state) == -1)
+                return -1;
+            if (state->how == LOOK)
+                return 0;
+            break;
+        case COPY:      /* -> COPY */
+            if (gz_load(state, state->out, state->size << 1, &(state->x.have))
+                    == -1)
+                return -1;
+            state->x.next = state->out;
+            return 0;
+        case GZIP:      /* -> GZIP or LOOK (if end of gzip stream) */
+            strm->avail_out = state->size << 1;
+            strm->next_out = state->out;
+            if (gz_decomp(state) == -1)
+                return -1;
+        }
+    } while (state->x.have == 0 && (!state->eof || strm->avail_in));
+    return 0;
+}
+
+/* Skip len uncompressed bytes of output.  Return -1 on error, 0 on success. */
+local int gz_skip(
+    gz_statep state,
+    z_off64_t len)
+{
+    unsigned n;
+
+    /* skip over len bytes or reach end-of-file, whichever comes first */
+    while (len)
+        /* skip over whatever is in output buffer */
+        if (state->x.have) {
+            n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ?
+                (unsigned)len : state->x.have;
+            state->x.have -= n;
+            state->x.next += n;
+            state->x.pos += n;
+            len -= n;
+        }
+
+        /* output buffer empty -- return if we're at the end of the input */
+        else if (state->eof && state->strm.avail_in == 0)
+            break;
+
+        /* need more data to skip -- load up output buffer */
+        else {
+            /* get more output, looking for header if required */
+            if (gz_fetch(state) == -1)
+                return -1;
+        }
+    return 0;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzread(
+    gzFile file,
+    voidp buf,
+    unsigned len)
+{
+    unsigned got, n;
+    gz_statep state;
+    z_streamp strm;
+
+    /* get internal structure */
+    if (file == NULL)
+        return -1;
+    state = (gz_statep)file;
+    strm = &(state->strm);
+
+    /* check that we're reading and that there's no (serious) error */
+    if (state->mode != GZ_READ ||
+            (state->err != Z_OK && state->err != Z_BUF_ERROR))
+        return -1;
+
+    /* since an int is returned, make sure len fits in one, otherwise return
+       with an error (this avoids the flaw in the interface) */
+    if ((int)len < 0) {
+        gz_error(state, Z_DATA_ERROR, "requested length does not fit in int");
+        return -1;
+    }
+
+    /* if len is zero, avoid unnecessary operations */
+    if (len == 0)
+        return 0;
+
+    /* process a skip request */
+    if (state->seek) {
+        state->seek = 0;
+        if (gz_skip(state, state->skip) == -1)
+            return -1;
+    }
+
+    /* get len bytes to buf, or less than len if at the end */
+    got = 0;
+    do {
+        /* first just try copying data from the output buffer */
+        if (state->x.have) {
+            n = state->x.have > len ? len : state->x.have;
+            memcpy(buf, state->x.next, n);
+            state->x.next += n;
+            state->x.have -= n;
+        }
+
+        /* output buffer empty -- return if we're at the end of the input */
+        else if (state->eof && strm->avail_in == 0) {
+            state->past = 1;        /* tried to read past end */
+            break;
+        }
+
+        /* need output data -- for small len or new stream load up our output
+           buffer */
+        else if (state->how == LOOK || len < (state->size << 1)) {
+            /* get more output, looking for header if required */
+            if (gz_fetch(state) == -1)
+                return -1;
+            continue;       /* no progress yet -- go back to copy above */
+            /* the copy above assures that we will leave with space in the
+               output buffer, allowing at least one gzungetc() to succeed */
+        }
+
+        /* large len -- read directly into user buffer */
+        else if (state->how == COPY) {      /* read directly */
+            if (gz_load(state, (unsigned char *)buf, len, &n) == -1)
+                return -1;
+        }
+
+        /* large len -- decompress directly into user buffer */
+        else {  /* state->how == GZIP */
+            strm->avail_out = len;
+            strm->next_out = (unsigned char *)buf;
+            if (gz_decomp(state) == -1)
+                return -1;
+            n = state->x.have;
+            state->x.have = 0;
+        }
+
+        /* update progress */
+        len -= n;
+        buf = (char *)buf + n;
+        got += n;
+        state->x.pos += n;
+    } while (len);
+
+    /* return number of bytes read into user buffer (will fit in int) */
+    return (int)got;
+}
+
+/* -- see zlib.h -- */
+#ifdef Z_PREFIX_SET
+#  undef z_gzgetc
+#else
+#  undef gzgetc
+#endif
+int ZEXPORT gzgetc(
+    gzFile file)
+{
+    int ret;
+    unsigned char buf[1];
+    gz_statep state;
+
+    /* get internal structure */
+    if (file == NULL)
+        return -1;
+    state = (gz_statep)file;
+
+    /* check that we're reading and that there's no (serious) error */
+    if (state->mode != GZ_READ ||
+        (state->err != Z_OK && state->err != Z_BUF_ERROR))
+        return -1;
+
+    /* try output buffer (no need to check for skip request) */
+    if (state->x.have) {
+        state->x.have--;
+        state->x.pos++;
+        return *(state->x.next)++;
+    }
+
+    /* nothing there -- try gzread() */
+    ret = gzread(file, buf, 1);
+    return ret < 1 ? -1 : buf[0];
+}
+
+int ZEXPORT gzgetc_(
+gzFile file)
+{
+    return gzgetc(file);
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzungetc(
+    int c,
+    gzFile file)
+{
+    gz_statep state;
+
+    /* get internal structure */
+    if (file == NULL)
+        return -1;
+    state = (gz_statep)file;
+
+    /* check that we're reading and that there's no (serious) error */
+    if (state->mode != GZ_READ ||
+        (state->err != Z_OK && state->err != Z_BUF_ERROR))
+        return -1;
+
+    /* process a skip request */
+    if (state->seek) {
+        state->seek = 0;
+        if (gz_skip(state, state->skip) == -1)
+            return -1;
+    }
+
+    /* can't push EOF */
+    if (c < 0)
+        return -1;
+
+    /* if output buffer empty, put byte at end (allows more pushing) */
+    if (state->x.have == 0) {
+        state->x.have = 1;
+        state->x.next = state->out + (state->size << 1) - 1;
+        state->x.next[0] = c;
+        state->x.pos--;
+        state->past = 0;
+        return c;
+    }
+
+    /* if no room, give up (must have already done a gzungetc()) */
+    if (state->x.have == (state->size << 1)) {
+        gz_error(state, Z_DATA_ERROR, "out of room to push characters");
+        return -1;
+    }
+
+    /* slide output data if needed and insert byte before existing data */
+    if (state->x.next == state->out) {
+        unsigned char *src = state->out + state->x.have;
+        unsigned char *dest = state->out + (state->size << 1);
+        while (src > state->out)
+            *--dest = *--src;
+        state->x.next = dest;
+    }
+    state->x.have++;
+    state->x.next--;
+    state->x.next[0] = c;
+    state->x.pos--;
+    state->past = 0;
+    return c;
+}
+
+/* -- see zlib.h -- */
+char * ZEXPORT gzgets(
+    gzFile file,
+    char *buf,
+    int len)
+{
+    unsigned left, n;
+    char *str;
+    unsigned char *eol;
+    gz_statep state;
+
+    /* check parameters and get internal structure */
+    if (file == NULL || buf == NULL || len < 1)
+        return NULL;
+    state = (gz_statep)file;
+
+    /* check that we're reading and that there's no (serious) error */
+    if (state->mode != GZ_READ ||
+        (state->err != Z_OK && state->err != Z_BUF_ERROR))
+        return NULL;
+
+    /* process a skip request */
+    if (state->seek) {
+        state->seek = 0;
+        if (gz_skip(state, state->skip) == -1)
+            return NULL;
+    }
+
+    /* copy output bytes up to new line or len - 1, whichever comes first --
+       append a terminating zero to the string (we don't check for a zero in
+       the contents, let the user worry about that) */
+    str = buf;
+    left = (unsigned)len - 1;
+    if (left) do {
+        /* assure that something is in the output buffer */
+        if (state->x.have == 0 && gz_fetch(state) == -1)
+            return NULL;                /* error */
+        if (state->x.have == 0) {       /* end of file */
+            state->past = 1;            /* read past end */
+            break;                      /* return what we have */
+        }
+
+        /* look for end-of-line in current output buffer */
+        n = state->x.have > left ? left : state->x.have;
+        eol = (unsigned char *)memchr(state->x.next, '\n', n);
+        if (eol != NULL)
+            n = (unsigned)(eol - state->x.next) + 1;
+
+        /* copy through end-of-line, or remainder if not found */
+        memcpy(buf, state->x.next, n);
+        state->x.have -= n;
+        state->x.next += n;
+        state->x.pos += n;
+        left -= n;
+        buf += n;
+    } while (left && eol == NULL);
+
+    /* return terminated string, or if nothing, end of file */
+    if (buf == str)
+        return NULL;
+    buf[0] = 0;
+    return str;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzdirect(
+    gzFile file)
+{
+    gz_statep state;
+
+    /* get internal structure */
+    if (file == NULL)
+        return 0;
+    state = (gz_statep)file;
+
+    /* if the state is not known, but we can find out, then do so (this is
+       mainly for right after a gzopen() or gzdopen()) */
+    if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
+        (void)gz_look(state);
+
+    /* return 1 if transparent, 0 if processing a gzip stream */
+    return state->direct;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzclose_r(
+    gzFile file)
+{
+    int ret, err;
+    gz_statep state;
+
+    /* get internal structure */
+    if (file == NULL)
+        return Z_STREAM_ERROR;
+    state = (gz_statep)file;
+
+    /* check that we're reading */
+    if (state->mode != GZ_READ)
+        return Z_STREAM_ERROR;
+
+    /* free memory and close file */
+    if (state->size) {
+        inflateEnd(&(state->strm));
+        free(state->out);
+        free(state->in);
+    }
+    err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK;
+    gz_error(state, Z_OK, NULL);
+    free(state->path);
+    ret = close(state->fd);
+    free(state);
+    return ret ? Z_ERRNO : err;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/gzwrite.c b/core/src/fxcodec/fx_zlib/zlib_v128/gzwrite.c
new file mode 100644
index 0000000..1610708
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/gzwrite.c
@@ -0,0 +1,576 @@
+/* gzwrite.c -- zlib functions for writing gzip files
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "gzguts.h"
+
+/* Local functions */
+local int gz_init OF((gz_statep));
+local int gz_comp OF((gz_statep, int));
+local int gz_zero OF((gz_statep, z_off64_t));
+
+/* Initialize state for writing a gzip file.  Mark initialization by setting
+   state->size to non-zero.  Return -1 on failure or 0 on success. */
+local int gz_init(
+    gz_statep state)
+{
+    int ret;
+    z_streamp strm = &(state->strm);
+
+    /* allocate input buffer */
+    state->in = (unsigned char *)malloc(state->want);
+    if (state->in == NULL) {
+        gz_error(state, Z_MEM_ERROR, "out of memory");
+        return -1;
+    }
+
+    /* only need output buffer and deflate state if compressing */
+    if (!state->direct) {
+        /* allocate output buffer */
+        state->out = (unsigned char *)malloc(state->want);
+        if (state->out == NULL) {
+            free(state->in);
+            gz_error(state, Z_MEM_ERROR, "out of memory");
+            return -1;
+        }
+
+        /* allocate deflate memory, set up for gzip compression */
+        strm->zalloc = Z_NULL;
+        strm->zfree = Z_NULL;
+        strm->opaque = Z_NULL;
+        ret = deflateInit2(strm, state->level, Z_DEFLATED,
+                           MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy);
+        if (ret != Z_OK) {
+            free(state->out);
+            free(state->in);
+            gz_error(state, Z_MEM_ERROR, "out of memory");
+            return -1;
+        }
+    }
+
+    /* mark state as initialized */
+    state->size = state->want;
+
+    /* initialize write buffer if compressing */
+    if (!state->direct) {
+        strm->avail_out = state->size;
+        strm->next_out = state->out;
+        state->x.next = strm->next_out;
+    }
+    return 0;
+}
+
+/* Compress whatever is at avail_in and next_in and write to the output file.
+   Return -1 if there is an error writing to the output file, otherwise 0.
+   flush is assumed to be a valid deflate() flush value.  If flush is Z_FINISH,
+   then the deflate() state is reset to start a new gzip stream.  If gz->direct
+   is true, then simply write to the output file without compressing, and
+   ignore flush. */
+local int gz_comp(
+    gz_statep state,
+    int flush)
+{
+    int ret, got;
+    unsigned have;
+    z_streamp strm = &(state->strm);
+
+    /* allocate memory if this is the first time through */
+    if (state->size == 0 && gz_init(state) == -1)
+        return -1;
+
+    /* write directly if requested */
+    if (state->direct) {
+        got = write(state->fd, strm->next_in, strm->avail_in);
+        if (got < 0 || (unsigned)got != strm->avail_in) {
+            gz_error(state, Z_ERRNO, zstrerror());
+            return -1;
+        }
+        strm->avail_in = 0;
+        return 0;
+    }
+
+    /* run deflate() on provided input until it produces no more output */
+    ret = Z_OK;
+    do {
+        /* write out current buffer contents if full, or if flushing, but if
+           doing Z_FINISH then don't write until we get to Z_STREAM_END */
+        if (strm->avail_out == 0 || (flush != Z_NO_FLUSH &&
+            (flush != Z_FINISH || ret == Z_STREAM_END))) {
+            have = (unsigned)(strm->next_out - state->x.next);
+            if (have && ((got = write(state->fd, state->x.next, have)) < 0 ||
+                         (unsigned)got != have)) {
+                gz_error(state, Z_ERRNO, zstrerror());
+                return -1;
+            }
+            if (strm->avail_out == 0) {
+                strm->avail_out = state->size;
+                strm->next_out = state->out;
+            }
+            state->x.next = strm->next_out;
+        }
+
+        /* compress */
+        have = strm->avail_out;
+        ret = deflate(strm, flush);
+        if (ret == Z_STREAM_ERROR) {
+            gz_error(state, Z_STREAM_ERROR,
+                      "internal error: deflate stream corrupt");
+            return -1;
+        }
+        have -= strm->avail_out;
+    } while (have);
+
+    /* if that completed a deflate stream, allow another to start */
+    if (flush == Z_FINISH)
+        deflateReset(strm);
+
+    /* all done, no errors */
+    return 0;
+}
+
+/* Compress len zeros to output.  Return -1 on error, 0 on success. */
+local int gz_zero(
+    gz_statep state,
+    z_off64_t len)
+{
+    int first;
+    unsigned n;
+    z_streamp strm = &(state->strm);
+
+    /* consume whatever's left in the input buffer */
+    if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
+        return -1;
+
+    /* compress len zeros (len guaranteed > 0) */
+    first = 1;
+    while (len) {
+        n = GT_OFF(state->size) || (z_off64_t)state->size > len ?
+            (unsigned)len : state->size;
+        if (first) {
+            memset(state->in, 0, n);
+            first = 0;
+        }
+        strm->avail_in = n;
+        strm->next_in = state->in;
+        state->x.pos += n;
+        if (gz_comp(state, Z_NO_FLUSH) == -1)
+            return -1;
+        len -= n;
+    }
+    return 0;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzwrite(
+    gzFile file,
+    voidpc buf,
+    unsigned len)
+{
+    unsigned put = len;
+    gz_statep state;
+    z_streamp strm;
+
+    /* get internal structure */
+    if (file == NULL)
+        return 0;
+    state = (gz_statep)file;
+    strm = &(state->strm);
+
+    /* check that we're writing and that there's no error */
+    if (state->mode != GZ_WRITE || state->err != Z_OK)
+        return 0;
+
+    /* since an int is returned, make sure len fits in one, otherwise return
+       with an error (this avoids the flaw in the interface) */
+    if ((int)len < 0) {
+        gz_error(state, Z_DATA_ERROR, "requested length does not fit in int");
+        return 0;
+    }
+
+    /* if len is zero, avoid unnecessary operations */
+    if (len == 0)
+        return 0;
+
+    /* allocate memory if this is the first time through */
+    if (state->size == 0 && gz_init(state) == -1)
+        return 0;
+
+    /* check for seek request */
+    if (state->seek) {
+        state->seek = 0;
+        if (gz_zero(state, state->skip) == -1)
+            return 0;
+    }
+
+    /* for small len, copy to input buffer, otherwise compress directly */
+    if (len < state->size) {
+        /* copy to input buffer, compress when full */
+        do {
+            unsigned have, copy;
+
+            if (strm->avail_in == 0)
+                strm->next_in = state->in;
+            have = (unsigned)((strm->next_in + strm->avail_in) - state->in);
+            copy = state->size - have;
+            if (copy > len)
+                copy = len;
+            memcpy(state->in + have, buf, copy);
+            strm->avail_in += copy;
+            state->x.pos += copy;
+            buf = (const char *)buf + copy;
+            len -= copy;
+            if (len && gz_comp(state, Z_NO_FLUSH) == -1)
+                return 0;
+        } while (len);
+    }
+    else {
+        /* consume whatever's left in the input buffer */
+        if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
+            return 0;
+
+        /* directly compress user buffer to file */
+        strm->avail_in = len;
+        strm->next_in = (z_const Bytef *)buf;
+        state->x.pos += len;
+        if (gz_comp(state, Z_NO_FLUSH) == -1)
+            return 0;
+    }
+
+    /* input was all buffered or compressed (put will fit in int) */
+    return (int)put;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzputc(
+    gzFile file,
+    int c)
+{
+    unsigned have;
+    unsigned char buf[1];
+    gz_statep state;
+    z_streamp strm;
+
+    /* get internal structure */
+    if (file == NULL)
+        return -1;
+    state = (gz_statep)file;
+    strm = &(state->strm);
+
+    /* check that we're writing and that there's no error */
+    if (state->mode != GZ_WRITE || state->err != Z_OK)
+        return -1;
+
+    /* check for seek request */
+    if (state->seek) {
+        state->seek = 0;
+        if (gz_zero(state, state->skip) == -1)
+            return -1;
+    }
+
+    /* try writing to input buffer for speed (state->size == 0 if buffer not
+       initialized) */
+    if (state->size) {
+        if (strm->avail_in == 0)
+            strm->next_in = state->in;
+        have = (unsigned)((strm->next_in + strm->avail_in) - state->in);
+        if (have < state->size) {
+            state->in[have] = c;
+            strm->avail_in++;
+            state->x.pos++;
+            return c & 0xff;
+        }
+    }
+
+    /* no room in buffer or not initialized, use gz_write() */
+    buf[0] = c;
+    if (gzwrite(file, buf, 1) != 1)
+        return -1;
+    return c & 0xff;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzputs(
+    gzFile file,
+    const char *str)
+{
+    int ret;
+    unsigned len;
+
+    /* write string */
+    len = (unsigned)strlen(str);
+    ret = gzwrite(file, str, len);
+    return ret == 0 && len != 0 ? -1 : ret;
+}
+
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+#include <stdarg.h>
+
+/* -- see zlib.h -- */
+int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)
+{
+    int size, len;
+    gz_statep state;
+    z_streamp strm;
+
+    /* get internal structure */
+    if (file == NULL)
+        return -1;
+    state = (gz_statep)file;
+    strm = &(state->strm);
+
+    /* check that we're writing and that there's no error */
+    if (state->mode != GZ_WRITE || state->err != Z_OK)
+        return 0;
+
+    /* make sure we have some buffer space */
+    if (state->size == 0 && gz_init(state) == -1)
+        return 0;
+
+    /* check for seek request */
+    if (state->seek) {
+        state->seek = 0;
+        if (gz_zero(state, state->skip) == -1)
+            return 0;
+    }
+
+    /* consume whatever's left in the input buffer */
+    if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
+        return 0;
+
+    /* do the printf() into the input buffer, put length in len */
+    size = (int)(state->size);
+    state->in[size - 1] = 0;
+#ifdef NO_vsnprintf
+#  ifdef HAS_vsprintf_void
+    (void)vsprintf((char *)(state->in), format, va);
+    for (len = 0; len < size; len++)
+        if (state->in[len] == 0) break;
+#  else
+    len = vsprintf((char *)(state->in), format, va);
+#  endif
+#else
+#  ifdef HAS_vsnprintf_void
+    (void)vsnprintf((char *)(state->in), size, format, va);
+    len = strlen((char *)(state->in));
+#  else
+    len = vsnprintf((char *)(state->in), size, format, va);
+#  endif
+#endif
+
+    /* check that printf() results fit in buffer */
+    if (len <= 0 || len >= (int)size || state->in[size - 1] != 0)
+        return 0;
+
+    /* update buffer and position, defer compression until needed */
+    strm->avail_in = (unsigned)len;
+    strm->next_in = state->in;
+    state->x.pos += len;
+    return len;
+}
+
+int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)
+{
+    va_list va;
+    int ret;
+
+    va_start(va, format);
+    ret = gzvprintf(file, format, va);
+    va_end(va);
+    return ret;
+}
+
+#else /* !STDC && !Z_HAVE_STDARG_H */
+
+/* -- see zlib.h -- */
+int ZEXPORTVA gzprintf (
+    gzFile file,
+    const char *format,
+    int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10,
+        int a11, int a12, int a13, int a14, int a15, int a16, int a17, int a18, int a19, int a20)
+{
+    int size, len;
+    gz_statep state;
+    z_streamp strm;
+
+    /* get internal structure */
+    if (file == NULL)
+        return -1;
+    state = (gz_statep)file;
+    strm = &(state->strm);
+
+    /* check that can really pass pointer in ints */
+    if (sizeof(int) != sizeof(void *))
+        return 0;
+
+    /* check that we're writing and that there's no error */
+    if (state->mode != GZ_WRITE || state->err != Z_OK)
+        return 0;
+
+    /* make sure we have some buffer space */
+    if (state->size == 0 && gz_init(state) == -1)
+        return 0;
+
+    /* check for seek request */
+    if (state->seek) {
+        state->seek = 0;
+        if (gz_zero(state, state->skip) == -1)
+            return 0;
+    }
+
+    /* consume whatever's left in the input buffer */
+    if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
+        return 0;
+
+    /* do the printf() into the input buffer, put length in len */
+    size = (int)(state->size);
+    state->in[size - 1] = 0;
+#ifdef NO_snprintf
+#  ifdef HAS_sprintf_void
+    sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8,
+            a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
+    for (len = 0; len < size; len++)
+        if (state->in[len] == 0) break;
+#  else
+    len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8,
+                  a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
+#  endif
+#else
+#  ifdef HAS_snprintf_void
+    snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8,
+             a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
+    len = strlen((char *)(state->in));
+#  else
+    len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6,
+                   a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18,
+                   a19, a20);
+#  endif
+#endif
+
+    /* check that printf() results fit in buffer */
+    if (len <= 0 || len >= (int)size || state->in[size - 1] != 0)
+        return 0;
+
+    /* update buffer and position, defer compression until needed */
+    strm->avail_in = (unsigned)len;
+    strm->next_in = state->in;
+    state->x.pos += len;
+    return len;
+}
+
+#endif
+
+/* -- see zlib.h -- */
+int ZEXPORT gzflush(
+    gzFile file,
+    int flush)
+{
+    gz_statep state;
+
+    /* get internal structure */
+    if (file == NULL)
+        return -1;
+    state = (gz_statep)file;
+
+    /* check that we're writing and that there's no error */
+    if (state->mode != GZ_WRITE || state->err != Z_OK)
+        return Z_STREAM_ERROR;
+
+    /* check flush parameter */
+    if (flush < 0 || flush > Z_FINISH)
+        return Z_STREAM_ERROR;
+
+    /* check for seek request */
+    if (state->seek) {
+        state->seek = 0;
+        if (gz_zero(state, state->skip) == -1)
+            return -1;
+    }
+
+    /* compress remaining data with requested flush */
+    gz_comp(state, flush);
+    return state->err;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzsetparams(
+    gzFile file,
+    int level,
+    int strategy)
+{
+    gz_statep state;
+    z_streamp strm;
+
+    /* get internal structure */
+    if (file == NULL)
+        return Z_STREAM_ERROR;
+    state = (gz_statep)file;
+    strm = &(state->strm);
+
+    /* check that we're writing and that there's no error */
+    if (state->mode != GZ_WRITE || state->err != Z_OK)
+        return Z_STREAM_ERROR;
+
+    /* if no change is requested, then do nothing */
+    if (level == state->level && strategy == state->strategy)
+        return Z_OK;
+
+    /* check for seek request */
+    if (state->seek) {
+        state->seek = 0;
+        if (gz_zero(state, state->skip) == -1)
+            return -1;
+    }
+
+    /* change compression parameters for subsequent input */
+    if (state->size) {
+        /* flush previous input with previous parameters before changing */
+        if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1)
+            return state->err;
+        deflateParams(strm, level, strategy);
+    }
+    state->level = level;
+    state->strategy = strategy;
+    return Z_OK;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzclose_w(
+    gzFile file)
+{
+    int ret = Z_OK;
+    gz_statep state;
+
+    /* get internal structure */
+    if (file == NULL)
+        return Z_STREAM_ERROR;
+    state = (gz_statep)file;
+
+    /* check that we're writing */
+    if (state->mode != GZ_WRITE)
+        return Z_STREAM_ERROR;
+
+    /* check for seek request */
+    if (state->seek) {
+        state->seek = 0;
+        if (gz_zero(state, state->skip) == -1)
+            ret = state->err;
+    }
+
+    /* flush, free memory, and close file */
+    if (gz_comp(state, Z_FINISH) == -1)
+        ret = state->err;
+    if (state->size) {
+        if (!state->direct) {
+            (void)deflateEnd(&(state->strm));
+            free(state->out);
+        }
+        free(state->in);
+    }
+    gz_error(state, Z_OK, NULL);
+    free(state->path);
+    if (close(state->fd) == -1)
+        ret = Z_ERRNO;
+    free(state);
+    return ret;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/inffast.h b/core/src/fxcodec/fx_zlib/zlib_v128/inffast.h
new file mode 100644
index 0000000..e5c1aa4
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/inffast.h
@@ -0,0 +1,11 @@
+/* inffast.h -- header to use inffast.c
+ * Copyright (C) 1995-2003, 2010 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start));
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/inffixed.h b/core/src/fxcodec/fx_zlib/zlib_v128/inffixed.h
new file mode 100644
index 0000000..d628327
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/inffixed.h
@@ -0,0 +1,94 @@
+    /* inffixed.h -- table for decoding fixed codes
+     * Generated automatically by makefixed().
+     */
+
+    /* WARNING: this file should *not* be used by applications.
+       It is part of the implementation of this library and is
+       subject to change. Applications should only use zlib.h.
+     */
+
+    static const code lenfix[512] = {
+        {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},
+        {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},
+        {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},
+        {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},
+        {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},
+        {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},
+        {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},
+        {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},
+        {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},
+        {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},
+        {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},
+        {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},
+        {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},
+        {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},
+        {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},
+        {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},
+        {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},
+        {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
+        {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},
+        {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},
+        {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},
+        {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},
+        {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},
+        {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},
+        {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},
+        {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},
+        {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},
+        {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},
+        {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},
+        {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},
+        {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},
+        {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},
+        {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},
+        {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},
+        {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},
+        {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},
+        {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},
+        {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},
+        {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},
+        {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},
+        {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},
+        {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},
+        {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},
+        {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},
+        {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},
+        {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},
+        {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},
+        {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
+        {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},
+        {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},
+        {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},
+        {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},
+        {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},
+        {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},
+        {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},
+        {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},
+        {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},
+        {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},
+        {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},
+        {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},
+        {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},
+        {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},
+        {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},
+        {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},
+        {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},
+        {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
+        {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},
+        {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},
+        {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},
+        {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},
+        {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},
+        {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},
+        {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},
+        {0,9,255}
+    };
+
+    static const code distfix[32] = {
+        {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},
+        {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},
+        {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},
+        {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},
+        {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},
+        {22,5,193},{64,5,0}
+    };
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/inflate.h b/core/src/fxcodec/fx_zlib/zlib_v128/inflate.h
new file mode 100644
index 0000000..95f4986
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/inflate.h
@@ -0,0 +1,122 @@
+/* inflate.h -- internal inflate state definition
+ * Copyright (C) 1995-2009 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+/* define NO_GZIP when compiling if you want to disable gzip header and
+   trailer decoding by inflate().  NO_GZIP would be used to avoid linking in
+   the crc code when it is not needed.  For shared libraries, gzip decoding
+   should be left enabled. */
+#ifndef NO_GZIP
+#  define GUNZIP
+#endif
+
+/* Possible inflate modes between inflate() calls */
+typedef enum {
+    HEAD,       /* i: waiting for magic header */
+    FLAGS,      /* i: waiting for method and flags (gzip) */
+    TIME,       /* i: waiting for modification time (gzip) */
+    OS,         /* i: waiting for extra flags and operating system (gzip) */
+    EXLEN,      /* i: waiting for extra length (gzip) */
+    EXTRA,      /* i: waiting for extra bytes (gzip) */
+    NAME,       /* i: waiting for end of file name (gzip) */
+    COMMENT,    /* i: waiting for end of comment (gzip) */
+    HCRC,       /* i: waiting for header crc (gzip) */
+    DICTID,     /* i: waiting for dictionary check value */
+    DICT,       /* waiting for inflateSetDictionary() call */
+        TYPE,       /* i: waiting for type bits, including last-flag bit */
+        TYPEDO,     /* i: same, but skip check to exit inflate on new block */
+        STORED,     /* i: waiting for stored size (length and complement) */
+        COPY_,      /* i/o: same as COPY below, but only first time in */
+        COPY,       /* i/o: waiting for input or output to copy stored block */
+        TABLE,      /* i: waiting for dynamic block table lengths */
+        LENLENS,    /* i: waiting for code length code lengths */
+        CODELENS,   /* i: waiting for length/lit and distance code lengths */
+            LEN_,       /* i: same as LEN below, but only first time in */
+            LEN,        /* i: waiting for length/lit/eob code */
+            LENEXT,     /* i: waiting for length extra bits */
+            DIST,       /* i: waiting for distance code */
+            DISTEXT,    /* i: waiting for distance extra bits */
+            MATCH,      /* o: waiting for output space to copy string */
+            LIT,        /* o: waiting for output space to write literal */
+    CHECK,      /* i: waiting for 32-bit check value */
+    LENGTH,     /* i: waiting for 32-bit length (gzip) */
+    DONE,       /* finished check, done -- remain here until reset */
+    BAD,        /* got a data error -- remain here until reset */
+    MEM,        /* got an inflate() memory error -- remain here until reset */
+    SYNC        /* looking for synchronization bytes to restart inflate() */
+} inflate_mode;
+
+/*
+    State transitions between above modes -
+
+    (most modes can go to BAD or MEM on error -- not shown for clarity)
+
+    Process header:
+        HEAD -> (gzip) or (zlib) or (raw)
+        (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT ->
+                  HCRC -> TYPE
+        (zlib) -> DICTID or TYPE
+        DICTID -> DICT -> TYPE
+        (raw) -> TYPEDO
+    Read deflate blocks:
+            TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK
+            STORED -> COPY_ -> COPY -> TYPE
+            TABLE -> LENLENS -> CODELENS -> LEN_
+            LEN_ -> LEN
+    Read deflate codes in fixed or dynamic block:
+                LEN -> LENEXT or LIT or TYPE
+                LENEXT -> DIST -> DISTEXT -> MATCH -> LEN
+                LIT -> LEN
+    Process trailer:
+        CHECK -> LENGTH -> DONE
+ */
+
+/* state maintained between inflate() calls.  Approximately 10K bytes. */
+struct inflate_state {
+    inflate_mode mode;          /* current inflate mode */
+    int last;                   /* true if processing last block */
+    int wrap;                   /* bit 0 true for zlib, bit 1 true for gzip */
+    int havedict;               /* true if dictionary provided */
+    int flags;                  /* gzip header method and flags (0 if zlib) */
+    unsigned dmax;              /* zlib header max distance (INFLATE_STRICT) */
+    unsigned long check;        /* protected copy of check value */
+    unsigned long total;        /* protected copy of output count */
+    gz_headerp head;            /* where to save gzip header information */
+        /* sliding window */
+    unsigned wbits;             /* log base 2 of requested window size */
+    unsigned wsize;             /* window size or zero if not using window */
+    unsigned whave;             /* valid bytes in the window */
+    unsigned wnext;             /* window write index */
+    unsigned char FAR *window;  /* allocated sliding window, if needed */
+        /* bit accumulator */
+    unsigned long hold;         /* input bit accumulator */
+    unsigned bits;              /* number of bits in "in" */
+        /* for string and stored block copying */
+    unsigned length;            /* literal or length of data to copy */
+    unsigned offset;            /* distance back to copy string from */
+        /* for table and code decoding */
+    unsigned extra;             /* extra bits needed */
+        /* fixed and dynamic code tables */
+    code const FAR *lencode;    /* starting table for length/literal codes */
+    code const FAR *distcode;   /* starting table for distance codes */
+    unsigned lenbits;           /* index bits for lencode */
+    unsigned distbits;          /* index bits for distcode */
+        /* dynamic table building */
+    unsigned ncode;             /* number of code length code lengths */
+    unsigned nlen;              /* number of length code lengths */
+    unsigned ndist;             /* number of distance code lengths */
+    unsigned have;              /* number of code lengths in lens[] */
+    code FAR *next;             /* next available space in codes[] */
+    unsigned short lens[320];   /* temporary storage for code lengths */
+    unsigned short work[288];   /* work area for code table building */
+    code codes[ENOUGH];         /* space for code tables */
+    int sane;                   /* if false, allow invalid distance too far */
+    int back;                   /* bits back of last unprocessed length/lit */
+    unsigned was;               /* initial length of match */
+};
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/inftrees.h b/core/src/fxcodec/fx_zlib/zlib_v128/inftrees.h
new file mode 100644
index 0000000..baa53a0
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/inftrees.h
@@ -0,0 +1,62 @@
+/* inftrees.h -- header to use inftrees.c
+ * Copyright (C) 1995-2005, 2010 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+/* Structure for decoding tables.  Each entry provides either the
+   information needed to do the operation requested by the code that
+   indexed that table entry, or it provides a pointer to another
+   table that indexes more bits of the code.  op indicates whether
+   the entry is a pointer to another table, a literal, a length or
+   distance, an end-of-block, or an invalid code.  For a table
+   pointer, the low four bits of op is the number of index bits of
+   that table.  For a length or distance, the low four bits of op
+   is the number of extra bits to get after the code.  bits is
+   the number of bits in this code or part of the code to drop off
+   of the bit buffer.  val is the actual byte to output in the case
+   of a literal, the base length or distance, or the offset from
+   the current table to the next table.  Each entry is four bytes. */
+typedef struct {
+    unsigned char op;           /* operation, extra bits, table bits */
+    unsigned char bits;         /* bits in this part of the code */
+    unsigned short val;         /* offset in table or code value */
+} code;
+
+/* op values as set by inflate_table():
+    00000000 - literal
+    0000tttt - table link, tttt != 0 is the number of table index bits
+    0001eeee - length or distance, eeee is the number of extra bits
+    01100000 - end of block
+    01000000 - invalid code
+ */
+
+/* Maximum size of the dynamic table.  The maximum number of code structures is
+   1444, which is the sum of 852 for literal/length codes and 592 for distance
+   codes.  These values were found by exhaustive searches using the program
+   examples/enough.c found in the zlib distribtution.  The arguments to that
+   program are the number of symbols, the initial root table size, and the
+   maximum bit length of a code.  "enough 286 9 15" for literal/length codes
+   returns returns 852, and "enough 30 6 15" for distance codes returns 592.
+   The initial root table size (9 or 6) is found in the fifth argument of the
+   inflate_table() calls in inflate.c and infback.c.  If the root table size is
+   changed, then these maximum sizes would be need to be recalculated and
+   updated. */
+#define ENOUGH_LENS 852
+#define ENOUGH_DISTS 592
+#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS)
+
+/* Type of code to build for inflate_table() */
+typedef enum {
+    CODES,
+    LENS,
+    DISTS
+} codetype;
+
+int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens,
+                             unsigned codes, code FAR * FAR *table,
+                             unsigned FAR *bits, unsigned short FAR *work));
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/trees.h b/core/src/fxcodec/fx_zlib/zlib_v128/trees.h
new file mode 100644
index 0000000..d35639d
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/trees.h
@@ -0,0 +1,128 @@
+/* header created automatically with -DGEN_TREES_H */
+
+local const ct_data static_ltree[L_CODES+2] = {
+{{ 12},{  8}}, {{140},{  8}}, {{ 76},{  8}}, {{204},{  8}}, {{ 44},{  8}},
+{{172},{  8}}, {{108},{  8}}, {{236},{  8}}, {{ 28},{  8}}, {{156},{  8}},
+{{ 92},{  8}}, {{220},{  8}}, {{ 60},{  8}}, {{188},{  8}}, {{124},{  8}},
+{{252},{  8}}, {{  2},{  8}}, {{130},{  8}}, {{ 66},{  8}}, {{194},{  8}},
+{{ 34},{  8}}, {{162},{  8}}, {{ 98},{  8}}, {{226},{  8}}, {{ 18},{  8}},
+{{146},{  8}}, {{ 82},{  8}}, {{210},{  8}}, {{ 50},{  8}}, {{178},{  8}},
+{{114},{  8}}, {{242},{  8}}, {{ 10},{  8}}, {{138},{  8}}, {{ 74},{  8}},
+{{202},{  8}}, {{ 42},{  8}}, {{170},{  8}}, {{106},{  8}}, {{234},{  8}},
+{{ 26},{  8}}, {{154},{  8}}, {{ 90},{  8}}, {{218},{  8}}, {{ 58},{  8}},
+{{186},{  8}}, {{122},{  8}}, {{250},{  8}}, {{  6},{  8}}, {{134},{  8}},
+{{ 70},{  8}}, {{198},{  8}}, {{ 38},{  8}}, {{166},{  8}}, {{102},{  8}},
+{{230},{  8}}, {{ 22},{  8}}, {{150},{  8}}, {{ 86},{  8}}, {{214},{  8}},
+{{ 54},{  8}}, {{182},{  8}}, {{118},{  8}}, {{246},{  8}}, {{ 14},{  8}},
+{{142},{  8}}, {{ 78},{  8}}, {{206},{  8}}, {{ 46},{  8}}, {{174},{  8}},
+{{110},{  8}}, {{238},{  8}}, {{ 30},{  8}}, {{158},{  8}}, {{ 94},{  8}},
+{{222},{  8}}, {{ 62},{  8}}, {{190},{  8}}, {{126},{  8}}, {{254},{  8}},
+{{  1},{  8}}, {{129},{  8}}, {{ 65},{  8}}, {{193},{  8}}, {{ 33},{  8}},
+{{161},{  8}}, {{ 97},{  8}}, {{225},{  8}}, {{ 17},{  8}}, {{145},{  8}},
+{{ 81},{  8}}, {{209},{  8}}, {{ 49},{  8}}, {{177},{  8}}, {{113},{  8}},
+{{241},{  8}}, {{  9},{  8}}, {{137},{  8}}, {{ 73},{  8}}, {{201},{  8}},
+{{ 41},{  8}}, {{169},{  8}}, {{105},{  8}}, {{233},{  8}}, {{ 25},{  8}},
+{{153},{  8}}, {{ 89},{  8}}, {{217},{  8}}, {{ 57},{  8}}, {{185},{  8}},
+{{121},{  8}}, {{249},{  8}}, {{  5},{  8}}, {{133},{  8}}, {{ 69},{  8}},
+{{197},{  8}}, {{ 37},{  8}}, {{165},{  8}}, {{101},{  8}}, {{229},{  8}},
+{{ 21},{  8}}, {{149},{  8}}, {{ 85},{  8}}, {{213},{  8}}, {{ 53},{  8}},
+{{181},{  8}}, {{117},{  8}}, {{245},{  8}}, {{ 13},{  8}}, {{141},{  8}},
+{{ 77},{  8}}, {{205},{  8}}, {{ 45},{  8}}, {{173},{  8}}, {{109},{  8}},
+{{237},{  8}}, {{ 29},{  8}}, {{157},{  8}}, {{ 93},{  8}}, {{221},{  8}},
+{{ 61},{  8}}, {{189},{  8}}, {{125},{  8}}, {{253},{  8}}, {{ 19},{  9}},
+{{275},{  9}}, {{147},{  9}}, {{403},{  9}}, {{ 83},{  9}}, {{339},{  9}},
+{{211},{  9}}, {{467},{  9}}, {{ 51},{  9}}, {{307},{  9}}, {{179},{  9}},
+{{435},{  9}}, {{115},{  9}}, {{371},{  9}}, {{243},{  9}}, {{499},{  9}},
+{{ 11},{  9}}, {{267},{  9}}, {{139},{  9}}, {{395},{  9}}, {{ 75},{  9}},
+{{331},{  9}}, {{203},{  9}}, {{459},{  9}}, {{ 43},{  9}}, {{299},{  9}},
+{{171},{  9}}, {{427},{  9}}, {{107},{  9}}, {{363},{  9}}, {{235},{  9}},
+{{491},{  9}}, {{ 27},{  9}}, {{283},{  9}}, {{155},{  9}}, {{411},{  9}},
+{{ 91},{  9}}, {{347},{  9}}, {{219},{  9}}, {{475},{  9}}, {{ 59},{  9}},
+{{315},{  9}}, {{187},{  9}}, {{443},{  9}}, {{123},{  9}}, {{379},{  9}},
+{{251},{  9}}, {{507},{  9}}, {{  7},{  9}}, {{263},{  9}}, {{135},{  9}},
+{{391},{  9}}, {{ 71},{  9}}, {{327},{  9}}, {{199},{  9}}, {{455},{  9}},
+{{ 39},{  9}}, {{295},{  9}}, {{167},{  9}}, {{423},{  9}}, {{103},{  9}},
+{{359},{  9}}, {{231},{  9}}, {{487},{  9}}, {{ 23},{  9}}, {{279},{  9}},
+{{151},{  9}}, {{407},{  9}}, {{ 87},{  9}}, {{343},{  9}}, {{215},{  9}},
+{{471},{  9}}, {{ 55},{  9}}, {{311},{  9}}, {{183},{  9}}, {{439},{  9}},
+{{119},{  9}}, {{375},{  9}}, {{247},{  9}}, {{503},{  9}}, {{ 15},{  9}},
+{{271},{  9}}, {{143},{  9}}, {{399},{  9}}, {{ 79},{  9}}, {{335},{  9}},
+{{207},{  9}}, {{463},{  9}}, {{ 47},{  9}}, {{303},{  9}}, {{175},{  9}},
+{{431},{  9}}, {{111},{  9}}, {{367},{  9}}, {{239},{  9}}, {{495},{  9}},
+{{ 31},{  9}}, {{287},{  9}}, {{159},{  9}}, {{415},{  9}}, {{ 95},{  9}},
+{{351},{  9}}, {{223},{  9}}, {{479},{  9}}, {{ 63},{  9}}, {{319},{  9}},
+{{191},{  9}}, {{447},{  9}}, {{127},{  9}}, {{383},{  9}}, {{255},{  9}},
+{{511},{  9}}, {{  0},{  7}}, {{ 64},{  7}}, {{ 32},{  7}}, {{ 96},{  7}},
+{{ 16},{  7}}, {{ 80},{  7}}, {{ 48},{  7}}, {{112},{  7}}, {{  8},{  7}},
+{{ 72},{  7}}, {{ 40},{  7}}, {{104},{  7}}, {{ 24},{  7}}, {{ 88},{  7}},
+{{ 56},{  7}}, {{120},{  7}}, {{  4},{  7}}, {{ 68},{  7}}, {{ 36},{  7}},
+{{100},{  7}}, {{ 20},{  7}}, {{ 84},{  7}}, {{ 52},{  7}}, {{116},{  7}},
+{{  3},{  8}}, {{131},{  8}}, {{ 67},{  8}}, {{195},{  8}}, {{ 35},{  8}},
+{{163},{  8}}, {{ 99},{  8}}, {{227},{  8}}
+};
+
+local const ct_data static_dtree[D_CODES] = {
+{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},
+{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},
+{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},
+{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},
+{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},
+{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}
+};
+
+const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {
+ 0,  1,  2,  3,  4,  4,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  8,
+ 8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 16, 17,
+18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,
+23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
+};
+
+const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {
+ 0,  1,  2,  3,  4,  5,  6,  7,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 12, 12,
+13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
+17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,
+19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,
+22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
+23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28
+};
+
+local const int base_length[LENGTH_CODES] = {
+0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,
+64, 80, 96, 112, 128, 160, 192, 224, 0
+};
+
+local const int base_dist[D_CODES] = {
+    0,     1,     2,     3,     4,     6,     8,    12,    16,    24,
+   32,    48,    64,    96,   128,   192,   256,   384,   512,   768,
+ 1024,  1536,  2048,  3072,  4096,  6144,  8192, 12288, 16384, 24576
+};
+
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/zconf.h b/core/src/fxcodec/fx_zlib/zlib_v128/zconf.h
new file mode 100644
index 0000000..5708a37
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/zconf.h
@@ -0,0 +1,519 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-2013 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZCONF_H
+#define ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ * Even better than compiling with -DZ_PREFIX would be to use configure to set
+ * this permanently in zconf.h using "./configure --zprefix".
+ */
+#ifdef Z_PREFIX     /* may be set to #if 1 by ./configure */
+#  define Z_PREFIX_SET
+
+/* all linked symbols */
+#  define _dist_code            z__dist_code
+#  define _length_code          z__length_code
+#  define _tr_align             z__tr_align
+#  define _tr_flush_bits        z__tr_flush_bits
+#  define _tr_flush_block       z__tr_flush_block
+#  define _tr_init              z__tr_init
+#  define _tr_stored_block      z__tr_stored_block
+#  define _tr_tally             z__tr_tally
+#  define adler32               z_adler32
+#  define adler32_combine       z_adler32_combine
+#  define adler32_combine64     z_adler32_combine64
+#  ifndef Z_SOLO
+#    define compress              z_compress
+#    define compress2             z_compress2
+#    define compressBound         z_compressBound
+#  endif
+#  define crc32                 z_crc32
+#  define crc32_combine         z_crc32_combine
+#  define crc32_combine64       z_crc32_combine64
+#  define deflate               z_deflate
+#  define deflateBound          z_deflateBound
+#  define deflateCopy           z_deflateCopy
+#  define deflateEnd            z_deflateEnd
+#  define deflateInit2_         z_deflateInit2_
+#  define deflateInit_          z_deflateInit_
+#  define deflateParams         z_deflateParams
+#  define deflatePending        z_deflatePending
+#  define deflatePrime          z_deflatePrime
+#  define deflateReset          z_deflateReset
+#  define deflateResetKeep      z_deflateResetKeep
+#  define deflateSetDictionary  z_deflateSetDictionary
+#  define deflateSetHeader      z_deflateSetHeader
+#  define deflateTune           z_deflateTune
+#  define deflate_copyright     z_deflate_copyright
+#  define get_crc_table         z_get_crc_table
+#  ifndef Z_SOLO
+#    define gz_error              z_gz_error
+#    define gz_intmax             z_gz_intmax
+#    define gz_strwinerror        z_gz_strwinerror
+#    define gzbuffer              z_gzbuffer
+#    define gzclearerr            z_gzclearerr
+#    define gzclose               z_gzclose
+#    define gzclose_r             z_gzclose_r
+#    define gzclose_w             z_gzclose_w
+#    define gzdirect              z_gzdirect
+#    define gzdopen               z_gzdopen
+#    define gzeof                 z_gzeof
+#    define gzerror               z_gzerror
+#    define gzflush               z_gzflush
+#    define gzgetc                z_gzgetc
+#    define gzgetc_               z_gzgetc_
+#    define gzgets                z_gzgets
+#    define gzoffset              z_gzoffset
+#    define gzoffset64            z_gzoffset64
+#    define gzopen                z_gzopen
+#    define gzopen64              z_gzopen64
+#    ifdef _WIN32
+#      define gzopen_w              z_gzopen_w
+#    endif
+#    define gzprintf              z_gzprintf
+#    define gzvprintf             z_gzvprintf
+#    define gzputc                z_gzputc
+#    define gzputs                z_gzputs
+#    define gzread                z_gzread
+#    define gzrewind              z_gzrewind
+#    define gzseek                z_gzseek
+#    define gzseek64              z_gzseek64
+#    define gzsetparams           z_gzsetparams
+#    define gztell                z_gztell
+#    define gztell64              z_gztell64
+#    define gzungetc              z_gzungetc
+#    define gzwrite               z_gzwrite
+#  endif
+#  define inflate               z_inflate
+#  define inflateBack           z_inflateBack
+#  define inflateBackEnd        z_inflateBackEnd
+#  define inflateBackInit_      z_inflateBackInit_
+#  define inflateCopy           z_inflateCopy
+#  define inflateEnd            z_inflateEnd
+#  define inflateGetHeader      z_inflateGetHeader
+#  define inflateInit2_         z_inflateInit2_
+#  define inflateInit_          z_inflateInit_
+#  define inflateMark           z_inflateMark
+#  define inflatePrime          z_inflatePrime
+#  define inflateReset          z_inflateReset
+#  define inflateReset2         z_inflateReset2
+#  define inflateSetDictionary  z_inflateSetDictionary
+#  define inflateGetDictionary  z_inflateGetDictionary
+#  define inflateSync           z_inflateSync
+#  define inflateSyncPoint      z_inflateSyncPoint
+#  define inflateUndermine      z_inflateUndermine
+#  define inflateResetKeep      z_inflateResetKeep
+#  define inflate_copyright     z_inflate_copyright
+#  define inflate_fast          z_inflate_fast
+#  define inflate_table         z_inflate_table
+#  ifndef Z_SOLO
+#    define uncompress            z_uncompress
+#  endif
+#  define zError                z_zError
+#  ifndef Z_SOLO
+#    define zcalloc               z_zcalloc
+#    define zcfree                z_zcfree
+#  endif
+#  define zlibCompileFlags      z_zlibCompileFlags
+#  define zlibVersion           z_zlibVersion
+
+/* all zlib typedefs in zlib.h and zconf.h */
+#  define Byte                  z_Byte
+#  define Bytef                 z_Bytef
+#  define alloc_func            z_alloc_func
+#  define charf                 z_charf
+#  define free_func             z_free_func
+#  ifndef Z_SOLO
+#    define gzFile                z_gzFile
+#  endif
+#  define gz_header             z_gz_header
+#  define gz_headerp            z_gz_headerp
+#  define in_func               z_in_func
+#  define intf                  z_intf
+#  define out_func              z_out_func
+#  define uInt                  z_uInt
+#  define uIntf                 z_uIntf
+#  define uLong                 z_uLong
+#  define uLongf                z_uLongf
+#  define voidp                 z_voidp
+#  define voidpc                z_voidpc
+#  define voidpf                z_voidpf
+
+/* all zlib structs in zlib.h and zconf.h */
+#  define gz_header_s           z_gz_header_s
+#  define internal_state        z_internal_state
+
+#endif
+
+#if defined(__MSDOS__) && !defined(MSDOS)
+#  define MSDOS
+#endif
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
+#  define OS2
+#endif
+#if defined(_WINDOWS) && !defined(WINDOWS)
+#  define WINDOWS
+#endif
+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
+#  ifndef WIN32
+#    define WIN32
+#  endif
+#endif
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
+#  if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
+#    ifndef SYS16BIT
+#      define SYS16BIT
+#    endif
+#  endif
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#ifdef SYS16BIT
+#  define MAXSEG_64K
+#endif
+#ifdef MSDOS
+#  define UNALIGNED_OK
+#endif
+
+#ifdef __STDC_VERSION__
+#  ifndef STDC
+#    define STDC
+#  endif
+#  if __STDC_VERSION__ >= 199901L
+#    ifndef STDC99
+#      define STDC99
+#    endif
+#  endif
+#endif
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
+#  define STDC
+#endif
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
+#  define STDC
+#endif
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
+#  define STDC
+#endif
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
+#  define STDC
+#endif
+
+#if defined(__OS400__) && !defined(STDC)    /* iSeries (formerly AS/400). */
+#  define STDC
+#endif
+
+#ifndef STDC
+#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+#    define const       /* note: need a more gentle solution here */
+#  endif
+#endif
+
+#if defined(ZLIB_CONST) && !defined(z_const)
+#  define z_const const
+#else
+#  define z_const
+#endif
+
+/* Some Mac compilers merge all .h files incorrectly: */
+#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
+#  define NO_DUMMY_DECL
+#endif
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+#  ifdef MAXSEG_64K
+#    define MAX_MEM_LEVEL 8
+#  else
+#    define MAX_MEM_LEVEL 9
+#  endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+#  define MAX_WBITS   15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+            (1 << (windowBits+2)) +  (1 << (memLevel+9))
+ that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+     make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+   The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects.
+*/
+
+                        /* Type declarations */
+
+#ifndef OF /* function prototypes */
+#  ifdef STDC
+#    define OF(args)  args
+#  else
+#    define OF(args)  ()
+#  endif
+#endif
+
+#ifndef Z_ARG /* function prototypes for stdarg */
+#  if defined(STDC) || defined(Z_HAVE_STDARG_H)
+#    define Z_ARG(args)  args
+#  else
+#    define Z_ARG(args)  ()
+#  endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#ifdef SYS16BIT
+#  if defined(M_I86SM) || defined(M_I86MM)
+     /* MSC small or medium model */
+#    define SMALL_MEDIUM
+#    ifdef _MSC_VER
+#      define FAR _far
+#    else
+#      define FAR far
+#    endif
+#  endif
+#  if (defined(__SMALL__) || defined(__MEDIUM__))
+     /* Turbo C small or medium model */
+#    define SMALL_MEDIUM
+#    ifdef __BORLANDC__
+#      define FAR _far
+#    else
+#      define FAR far
+#    endif
+#  endif
+#endif
+
+#if defined(WINDOWS) || defined(WIN32)
+   /* If building or using zlib as a DLL, define ZLIB_DLL.
+    * This is not mandatory, but it offers a little performance increase.
+    */
+#  ifdef ZLIB_DLL
+#    if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
+#      ifdef ZLIB_INTERNAL
+#        define ZEXTERN extern __declspec(dllexport)
+#      else
+#        define ZEXTERN extern __declspec(dllimport)
+#      endif
+#    endif
+#  endif  /* ZLIB_DLL */
+   /* If building or using zlib with the WINAPI/WINAPIV calling convention,
+    * define ZLIB_WINAPI.
+    * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
+    */
+#  ifdef ZLIB_WINAPI
+#    ifdef FAR
+#      undef FAR
+#    endif
+#    include <windows.h>
+     /* No need for _export, use ZLIB.DEF instead. */
+     /* For complete Windows compatibility, use WINAPI, not __stdcall. */
+#    define ZEXPORT WINAPI
+#    ifdef WIN32
+#      define ZEXPORTVA WINAPIV
+#    else
+#      define ZEXPORTVA FAR CDECL
+#    endif
+#  endif
+#endif
+
+#if defined (__BEOS__)
+#  ifdef ZLIB_DLL
+#    ifdef ZLIB_INTERNAL
+#      define ZEXPORT   __declspec(dllexport)
+#      define ZEXPORTVA __declspec(dllexport)
+#    else
+#      define ZEXPORT   __declspec(dllimport)
+#      define ZEXPORTVA __declspec(dllimport)
+#    endif
+#  endif
+#endif
+
+#ifndef ZEXTERN
+#  define ZEXTERN extern
+#endif
+#ifndef ZEXPORT
+#  define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+#  define ZEXPORTVA
+#endif
+
+#ifndef FAR
+#  define FAR
+#endif
+
+#if !defined(__MACTYPES__)
+typedef unsigned char  Byte;  /* 8 bits */
+#endif
+typedef unsigned int   uInt;  /* 16 bits or more */
+typedef unsigned long  uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+#  define Bytef Byte FAR
+#else
+   typedef Byte  FAR Bytef;
+#endif
+typedef char  FAR charf;
+typedef int   FAR intf;
+typedef uInt  FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+   typedef void const *voidpc;
+   typedef void FAR   *voidpf;
+   typedef void       *voidp;
+#else
+   typedef Byte const *voidpc;
+   typedef Byte FAR   *voidpf;
+   typedef Byte       *voidp;
+#endif
+
+#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
+#  include <limits.h>
+#  if (UINT_MAX == 0xffffffffUL)
+#    define Z_U4 unsigned
+#  elif (ULONG_MAX == 0xffffffffUL)
+#    define Z_U4 unsigned long
+#  elif (USHRT_MAX == 0xffffffffUL)
+#    define Z_U4 unsigned short
+#  endif
+#endif
+
+#ifdef Z_U4
+   typedef Z_U4 z_crc_t;
+#else
+   typedef unsigned long z_crc_t;
+#endif
+
+#if 0				/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */
+#ifdef HAVE_UNISTD_H    /* may be set to #if 1 by ./configure */
+#  define Z_HAVE_UNISTD_H
+#endif
+#endif /* 0 */
+
+#ifdef HAVE_STDARG_H    /* may be set to #if 1 by ./configure */
+#  define Z_HAVE_STDARG_H
+#endif
+
+#if 0				/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */
+#ifdef STDC
+#  ifndef Z_SOLO
+#    include <sys/types.h>      /* for off_t */
+#  endif
+#endif
+#endif /* 0 */
+
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+#  ifndef Z_SOLO
+#    include <stdarg.h>         /* for va_list */
+#  endif
+#endif
+
+#ifdef _WIN32
+#  ifndef Z_SOLO
+#    include <stddef.h>         /* for wchar_t */
+#  endif
+#endif
+
+#if 0				/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */
+/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
+ * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even
+ * though the former does not conform to the LFS document), but considering
+ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
+ * equivalently requesting no 64-bit operations
+ */
+#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
+#  undef _LARGEFILE64_SOURCE
+#endif
+#endif /* 0 */
+
+#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
+#  define Z_HAVE_UNISTD_H
+#endif
+#ifndef Z_SOLO
+#if 0				/* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */
+#  if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
+#    include <unistd.h>         /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
+#    ifdef VMS
+#      include <unixio.h>       /* for off_t */
+#    endif
+#    ifndef z_off_t
+#      define z_off_t off_t
+#    endif
+#  endif
+#endif /* 0 */
+#endif
+
+#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
+#  define Z_LFS64
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
+#  define Z_LARGE64
+#endif
+
+#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
+#  define Z_WANT64
+#endif
+
+#if !defined(SEEK_SET) && !defined(Z_SOLO)
+#  define SEEK_SET        0       /* Seek from beginning of file.  */
+#  define SEEK_CUR        1       /* Seek from current position.  */
+#  define SEEK_END        2       /* Set file pointer to EOF plus "offset" */
+#endif
+
+#ifndef z_off_t
+#  define z_off_t long
+#endif
+
+#if !defined(_WIN32) && defined(Z_LARGE64)
+#  define z_off64_t off64_t
+#else
+#  if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
+#    define z_off64_t __int64
+#  else
+#    define z_off64_t z_off_t
+#  endif
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+  #pragma map(deflateInit_,"DEIN")
+  #pragma map(deflateInit2_,"DEIN2")
+  #pragma map(deflateEnd,"DEEND")
+  #pragma map(deflateBound,"DEBND")
+  #pragma map(inflateInit_,"ININ")
+  #pragma map(inflateInit2_,"ININ2")
+  #pragma map(inflateEnd,"INEND")
+  #pragma map(inflateSync,"INSY")
+  #pragma map(inflateSetDictionary,"INSEDI")
+  #pragma map(compressBound,"CMBND")
+  #pragma map(inflate_table,"INTABL")
+  #pragma map(inflate_fast,"INFA")
+  #pragma map(inflate_copyright,"INCOPY")
+#endif
+
+#endif /* ZCONF_H */
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/zlib.h b/core/src/fxcodec/fx_zlib/zlib_v128/zlib.h
new file mode 100644
index 0000000..ec8ca7a
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/zlib.h
@@ -0,0 +1,1832 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+  version 1.2.8, April 28th, 2013
+
+  Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jean-loup Gailly        Mark Adler
+  jloup@gzip.org          madler@alumni.caltech.edu
+
+
+  The data format used by the zlib library is described by RFCs (Request for
+  Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
+  (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
+*/
+
+#ifndef ZLIB_H
+#define ZLIB_H
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+
+#define deflate_copyright FPDFAPI_deflate_copyright
+#define adler32 FPDFAPI_adler32
+#define compress2 FPDFAPI_compress2
+#define compress FPDFAPI_compress
+#define compressBound FPDFAPI_compressBound
+#define get_crc_table FPDFAPI_get_crc_table
+#define crc32 FPDFAPI_crc32
+#define deflateInit_ FPDFAPI_deflateInit_
+#define deflateInit2_ FPDFAPI_deflateInit2_
+#define deflateSetDictionary FPDFAPI_deflateSetDictionary
+#define deflateReset FPDFAPI_deflateReset
+#define deflatePrime FPDFAPI_deflatePrime
+#define deflateParams FPDFAPI_deflateParams
+#define deflateBound FPDFAPI_deflateBound
+#define deflateSetHeader FPDFAPI_deflateSetHeader
+#define deflateTune FPDFAPI_deflateTune
+#define deflate FPDFAPI_deflate
+#define deflateEnd FPDFAPI_deflateEnd
+#define deflateCopy FPDFAPI_deflateCopy
+#define inflateBackInit_ FPDFAPI_inflateBackInit_
+#define inflateBack FPDFAPI_inflateBack
+#define inflateBackEnd FPDFAPI_inflateBackEnd
+#define inflateReset FPDFAPI_inflateReset
+#define inflateInit2_ FPDFAPI_inflateInit2_
+#define inflateInit_ FPDFAPI_inflateInit_
+#define inflate FPDFAPI_inflate
+#define inflateEnd FPDFAPI_inflateEnd
+#define inflateSetDictionary FPDFAPI_inflateSetDictionary
+#define inflateSync FPDFAPI_inflateSync
+#define inflateSyncPoint FPDFAPI_inflateSyncPoint
+#define inflateCopy FPDFAPI_inflateCopy
+#define uncompress FPDFAPI_uncompress
+#define zlibVersion FPDFAPI_zlibVersion
+#define zlibCompileFlags FPDFAPI_zlibCompileFlags
+#define zError FPDFAPI_zError
+#define z_errmsg FPDFAPI_z_errmsg
+#define zcfree FPDFAPI_zcfree
+#define zcalloc FPDFAPI_zcalloc
+#define inflate_fast FPDFAPI_inflate_fast
+#define inflate_table FPDFAPI_inflate_table
+#define inflate_copyright FPDFAPI_inflate_copyright
+#define _length_code FPDFAPI_length_code
+#define _tr_flush_block FPDFAPI_tr_flush_block
+#define _dist_code FPDFAPI_dist_code
+#define _tr_stored_block FPDFAPI_tr_stored_block
+#define _tr_init FPDFAPI_tr_init
+#define _tr_align FPDFAPI_tr_align
+#define _tr_tally FPDFAPI_tr_tally
+#define adler32_combine FPDFAPI_adler32_combine
+#define inflatePrime FPDFAPI_inflatePrime
+#define inflateGetHeader FPDFAPI_inflateGetHeader
+#define crc32_combine FPDFAPI_crc32_combine
+#define inflateReset2 FPDFAPI_inflateReset2
+#define inflateUndermine FPDFAPI_inflateUndermine
+#define inflateMark FPDFAPI_inflateMark
+#define adler32_combine64 FPDFAPI_adler32_combine64
+
+#include "zconf.h"
+
+/* Sunliang.Liu 20100908 sync the config to the old revision. NO_GZIP */
+#define NO_GZIP		/* XYQ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.2.8"
+#define ZLIB_VERNUM 0x1280
+#define ZLIB_VER_MAJOR 1
+#define ZLIB_VER_MINOR 2
+#define ZLIB_VER_REVISION 8
+#define ZLIB_VER_SUBREVISION 0
+
+/*
+    The 'zlib' compression library provides in-memory compression and
+  decompression functions, including integrity checks of the uncompressed data.
+  This version of the library supports only one compression method (deflation)
+  but other algorithms will be added later and will have the same stream
+  interface.
+
+    Compression can be done in a single step if the buffers are large enough,
+  or can be done by repeated calls of the compression function.  In the latter
+  case, the application must provide more input and/or consume the output
+  (providing more output space) before each call.
+
+    The compressed data format used by default by the in-memory functions is
+  the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
+  around a deflate stream, which is itself documented in RFC 1951.
+
+    The library also supports reading and writing files in gzip (.gz) format
+  with an interface similar to that of stdio using the functions that start
+  with "gz".  The gzip format is different from the zlib format.  gzip is a
+  gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
+
+    This library can optionally read and write gzip streams in memory as well.
+
+    The zlib format was designed to be compact and fast for use in memory
+  and on communications channels.  The gzip format was designed for single-
+  file compression on file systems, has a larger header than zlib to maintain
+  directory information, and uses a different, slower check method than zlib.
+
+    The library does not install any signal handler.  The decoder checks
+  the consistency of the compressed data, so the library should never crash
+  even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void   (*free_func)  OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+    z_const Bytef *next_in;     /* next input byte */
+    uInt     avail_in;  /* number of bytes available at next_in */
+    uLong    total_in;  /* total number of input bytes read so far */
+
+    Bytef    *next_out; /* next output byte should be put there */
+    uInt     avail_out; /* remaining free space at next_out */
+    uLong    total_out; /* total number of bytes output so far */
+
+    z_const char *msg;  /* last error message, NULL if no error */
+    struct internal_state FAR *state; /* not visible by applications */
+
+    alloc_func zalloc;  /* used to allocate the internal state */
+    free_func  zfree;   /* used to free the internal state */
+    voidpf     opaque;  /* private data object passed to zalloc and zfree */
+
+    int     data_type;  /* best guess about the data type: binary or text */
+    uLong   adler;      /* adler32 value of the uncompressed data */
+    uLong   reserved;   /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+     gzip header information passed to and from zlib routines.  See RFC 1952
+  for more details on the meanings of these fields.
+*/
+typedef struct gz_header_s {
+    int     text;       /* true if compressed data believed to be text */
+    uLong   time;       /* modification time */
+    int     xflags;     /* extra flags (not used when writing a gzip file) */
+    int     os;         /* operating system */
+    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */
+    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */
+    uInt    extra_max;  /* space at extra (only when reading header) */
+    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */
+    uInt    name_max;   /* space at name (only when reading header) */
+    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */
+    uInt    comm_max;   /* space at comment (only when reading header) */
+    int     hcrc;       /* true if there was or will be a header crc */
+    int     done;       /* true when done reading gzip header (not used
+                           when writing a gzip file) */
+} gz_header;
+
+typedef gz_header FAR *gz_headerp;
+
+/*
+     The application must update next_in and avail_in when avail_in has dropped
+   to zero.  It must update next_out and avail_out when avail_out has dropped
+   to zero.  The application must initialize zalloc, zfree and opaque before
+   calling the init function.  All other fields are set by the compression
+   library and must not be updated by the application.
+
+     The opaque value provided by the application will be passed as the first
+   parameter for calls of zalloc and zfree.  This can be useful for custom
+   memory management.  The compression library attaches no meaning to the
+   opaque value.
+
+     zalloc must return Z_NULL if there is not enough memory for the object.
+   If zlib is used in a multi-threaded application, zalloc and zfree must be
+   thread safe.
+
+     On 16-bit systems, the functions zalloc and zfree must be able to allocate
+   exactly 65536 bytes, but will not be required to allocate more than this if
+   the symbol MAXSEG_64K is defined (see zconf.h).  WARNING: On MSDOS, pointers
+   returned by zalloc for objects of exactly 65536 bytes *must* have their
+   offset normalized to zero.  The default allocation function provided by this
+   library ensures this (see zutil.c).  To reduce memory requirements and avoid
+   any allocation of 64K objects, at the expense of compression ratio, compile
+   the library with -DMAX_WBITS=14 (see zconf.h).
+
+     The fields total_in and total_out can be used for statistics or progress
+   reports.  After compression, total_in holds the total size of the
+   uncompressed data and may be saved for use in the decompressor (particularly
+   if the decompressor wants to decompress everything in a single step).
+*/
+
+                        /* constants */
+
+#define Z_NO_FLUSH      0
+#define Z_PARTIAL_FLUSH 1
+#define Z_SYNC_FLUSH    2
+#define Z_FULL_FLUSH    3
+#define Z_FINISH        4
+#define Z_BLOCK         5
+#define Z_TREES         6
+/* Allowed flush values; see deflate() and inflate() below for details */
+
+#define Z_OK            0
+#define Z_STREAM_END    1
+#define Z_NEED_DICT     2
+#define Z_ERRNO        (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR   (-3)
+#define Z_MEM_ERROR    (-4)
+#define Z_BUF_ERROR    (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative values
+ * are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION         0
+#define Z_BEST_SPEED             1
+#define Z_BEST_COMPRESSION       9
+#define Z_DEFAULT_COMPRESSION  (-1)
+/* compression levels */
+
+#define Z_FILTERED            1
+#define Z_HUFFMAN_ONLY        2
+#define Z_RLE                 3
+#define Z_FIXED               4
+#define Z_DEFAULT_STRATEGY    0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY   0
+#define Z_TEXT     1
+#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */
+#define Z_UNKNOWN  2
+/* Possible values of the data_type field (though see inflate()) */
+
+#define Z_DEFLATED   8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+
+                        /* basic functions */
+
+ZEXTERN const char * ZEXPORT zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+   If the first character differs, the library code actually used is not
+   compatible with the zlib.h header file used by the application.  This check
+   is automatically made by deflateInit and inflateInit.
+ */
+
+/*
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+     Initializes the internal stream state for compression.  The fields
+   zalloc, zfree and opaque must be initialized before by the caller.  If
+   zalloc and zfree are set to Z_NULL, deflateInit updates them to use default
+   allocation functions.
+
+     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+   1 gives best speed, 9 gives best compression, 0 gives no compression at all
+   (the input data is simply copied a block at a time).  Z_DEFAULT_COMPRESSION
+   requests a default compromise between speed and compression (currently
+   equivalent to level 6).
+
+     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_STREAM_ERROR if level is not a valid compression level, or
+   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+   with the version assumed by the caller (ZLIB_VERSION).  msg is set to null
+   if there is no error message.  deflateInit does not perform any compression:
+   this will be done by deflate().
+*/
+
+
+ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+    deflate compresses as much data as possible, and stops when the input
+  buffer becomes empty or the output buffer becomes full.  It may introduce
+  some output latency (reading input without producing any output) except when
+  forced to flush.
+
+    The detailed semantics are as follows.  deflate performs one or both of the
+  following actions:
+
+  - Compress more input starting at next_in and update next_in and avail_in
+    accordingly.  If not all input can be processed (because there is not
+    enough room in the output buffer), next_in and avail_in are updated and
+    processing will resume at this point for the next call of deflate().
+
+  - Provide more output starting at next_out and update next_out and avail_out
+    accordingly.  This action is forced if the parameter flush is non zero.
+    Forcing flush frequently degrades the compression ratio, so this parameter
+    should be set only when necessary (in interactive applications).  Some
+    output may be provided even if flush is not set.
+
+    Before the call of deflate(), the application should ensure that at least
+  one of the actions is possible, by providing more input and/or consuming more
+  output, and updating avail_in or avail_out accordingly; avail_out should
+  never be zero before the call.  The application can consume the compressed
+  output when it wants, for example when the output buffer is full (avail_out
+  == 0), or after each call of deflate().  If deflate returns Z_OK and with
+  zero avail_out, it must be called again after making room in the output
+  buffer because there might be more output pending.
+
+    Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
+  decide how much data to accumulate before producing output, in order to
+  maximize compression.
+
+    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+  flushed to the output buffer and the output is aligned on a byte boundary, so
+  that the decompressor can get all input data available so far.  (In
+  particular avail_in is zero after the call if enough output space has been
+  provided before the call.) Flushing may degrade compression for some
+  compression algorithms and so it should be used only when necessary.  This
+  completes the current deflate block and follows it with an empty stored block
+  that is three bits plus filler bits to the next byte, followed by four bytes
+  (00 00 ff ff).
+
+    If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the
+  output buffer, but the output is not aligned to a byte boundary.  All of the
+  input data so far will be available to the decompressor, as for Z_SYNC_FLUSH.
+  This completes the current deflate block and follows it with an empty fixed
+  codes block that is 10 bits long.  This assures that enough bytes are output
+  in order for the decompressor to finish the block before the empty fixed code
+  block.
+
+    If flush is set to Z_BLOCK, a deflate block is completed and emitted, as
+  for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to
+  seven bits of the current block are held to be written as the next byte after
+  the next deflate block is completed.  In this case, the decompressor may not
+  be provided enough bits at this point in order to complete decompression of
+  the data provided so far to the compressor.  It may need to wait for the next
+  block to be emitted.  This is for advanced applications that need to control
+  the emission of deflate blocks.
+
+    If flush is set to Z_FULL_FLUSH, all output is flushed as with
+  Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+  restart from this point if previous compressed data has been damaged or if
+  random access is desired.  Using Z_FULL_FLUSH too often can seriously degrade
+  compression.
+
+    If deflate returns with avail_out == 0, this function must be called again
+  with the same value of the flush parameter and more output space (updated
+  avail_out), until the flush is complete (deflate returns with non-zero
+  avail_out).  In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
+  avail_out is greater than six to avoid repeated flush markers due to
+  avail_out == 0 on return.
+
+    If the parameter flush is set to Z_FINISH, pending input is processed,
+  pending output is flushed and deflate returns with Z_STREAM_END if there was
+  enough output space; if deflate returns with Z_OK, this function must be
+  called again with Z_FINISH and more output space (updated avail_out) but no
+  more input data, until it returns with Z_STREAM_END or an error.  After
+  deflate has returned Z_STREAM_END, the only possible operations on the stream
+  are deflateReset or deflateEnd.
+
+    Z_FINISH can be used immediately after deflateInit if all the compression
+  is to be done in a single step.  In this case, avail_out must be at least the
+  value returned by deflateBound (see below).  Then deflate is guaranteed to
+  return Z_STREAM_END.  If not enough output space is provided, deflate will
+  not return Z_STREAM_END, and it must be called again as described above.
+
+    deflate() sets strm->adler to the adler32 checksum of all input read
+  so far (that is, total_in bytes).
+
+    deflate() may update strm->data_type if it can make a good guess about
+  the input data type (Z_BINARY or Z_TEXT).  In doubt, the data is considered
+  binary.  This field is only for information purposes and does not affect the
+  compression algorithm in any manner.
+
+    deflate() returns Z_OK if some progress has been made (more input
+  processed or more output produced), Z_STREAM_END if all input has been
+  consumed and all output has been produced (only when flush is set to
+  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+  if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible
+  (for example avail_in or avail_out was zero).  Note that Z_BUF_ERROR is not
+  fatal, and deflate() can be called again with more input and more output
+  space to continue compressing.
+*/
+
+
+ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+     All dynamically allocated data structures for this stream are freed.
+   This function discards any unprocessed input and does not flush any pending
+   output.
+
+     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+   stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+   prematurely (some input or output was discarded).  In the error case, msg
+   may be set but then points to a static string (which must not be
+   deallocated).
+*/
+
+
+/*
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+     Initializes the internal stream state for decompression.  The fields
+   next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+   the caller.  If next_in is not Z_NULL and avail_in is large enough (the
+   exact value depends on the compression method), inflateInit determines the
+   compression method from the zlib header and allocates all data structures
+   accordingly; otherwise the allocation will be deferred to the first call of
+   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+   use default allocation functions.
+
+     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+   version assumed by the caller, or Z_STREAM_ERROR if the parameters are
+   invalid, such as a null pointer to the structure.  msg is set to null if
+   there is no error message.  inflateInit does not perform any decompression
+   apart from possibly reading the zlib header if present: actual decompression
+   will be done by inflate().  (So next_in and avail_in may be modified, but
+   next_out and avail_out are unused and unchanged.) The current implementation
+   of inflateInit() does not process any header information -- that is deferred
+   until inflate() is called.
+*/
+
+
+ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+    inflate decompresses as much data as possible, and stops when the input
+  buffer becomes empty or the output buffer becomes full.  It may introduce
+  some output latency (reading input without producing any output) except when
+  forced to flush.
+
+  The detailed semantics are as follows.  inflate performs one or both of the
+  following actions:
+
+  - Decompress more input starting at next_in and update next_in and avail_in
+    accordingly.  If not all input can be processed (because there is not
+    enough room in the output buffer), next_in is updated and processing will
+    resume at this point for the next call of inflate().
+
+  - Provide more output starting at next_out and update next_out and avail_out
+    accordingly.  inflate() provides as much output as possible, until there is
+    no more input data or no more space in the output buffer (see below about
+    the flush parameter).
+
+    Before the call of inflate(), the application should ensure that at least
+  one of the actions is possible, by providing more input and/or consuming more
+  output, and updating the next_* and avail_* values accordingly.  The
+  application can consume the uncompressed output when it wants, for example
+  when the output buffer is full (avail_out == 0), or after each call of
+  inflate().  If inflate returns Z_OK and with zero avail_out, it must be
+  called again after making room in the output buffer because there might be
+  more output pending.
+
+    The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH,
+  Z_BLOCK, or Z_TREES.  Z_SYNC_FLUSH requests that inflate() flush as much
+  output as possible to the output buffer.  Z_BLOCK requests that inflate()
+  stop if and when it gets to the next deflate block boundary.  When decoding
+  the zlib or gzip format, this will cause inflate() to return immediately
+  after the header and before the first block.  When doing a raw inflate,
+  inflate() will go ahead and process the first block, and will return when it
+  gets to the end of that block, or when it runs out of data.
+
+    The Z_BLOCK option assists in appending to or combining deflate streams.
+  Also to assist in this, on return inflate() will set strm->data_type to the
+  number of unused bits in the last byte taken from strm->next_in, plus 64 if
+  inflate() is currently decoding the last block in the deflate stream, plus
+  128 if inflate() returned immediately after decoding an end-of-block code or
+  decoding the complete header up to just before the first byte of the deflate
+  stream.  The end-of-block will not be indicated until all of the uncompressed
+  data from that block has been written to strm->next_out.  The number of
+  unused bits may in general be greater than seven, except when bit 7 of
+  data_type is set, in which case the number of unused bits will be less than
+  eight.  data_type is set as noted here every time inflate() returns for all
+  flush options, and so can be used to determine the amount of currently
+  consumed input in bits.
+
+    The Z_TREES option behaves as Z_BLOCK does, but it also returns when the
+  end of each deflate block header is reached, before any actual data in that
+  block is decoded.  This allows the caller to determine the length of the
+  deflate block header for later use in random access within a deflate block.
+  256 is added to the value of strm->data_type when inflate() returns
+  immediately after reaching the end of the deflate block header.
+
+    inflate() should normally be called until it returns Z_STREAM_END or an
+  error.  However if all decompression is to be performed in a single step (a
+  single call of inflate), the parameter flush should be set to Z_FINISH.  In
+  this case all pending input is processed and all pending output is flushed;
+  avail_out must be large enough to hold all of the uncompressed data for the
+  operation to complete.  (The size of the uncompressed data may have been
+  saved by the compressor for this purpose.) The use of Z_FINISH is not
+  required to perform an inflation in one step.  However it may be used to
+  inform inflate that a faster approach can be used for the single inflate()
+  call.  Z_FINISH also informs inflate to not maintain a sliding window if the
+  stream completes, which reduces inflate's memory footprint.  If the stream
+  does not complete, either because not all of the stream is provided or not
+  enough output space is provided, then a sliding window will be allocated and
+  inflate() can be called again to continue the operation as if Z_NO_FLUSH had
+  been used.
+
+     In this implementation, inflate() always flushes as much output as
+  possible to the output buffer, and always uses the faster approach on the
+  first call.  So the effects of the flush parameter in this implementation are
+  on the return value of inflate() as noted below, when inflate() returns early
+  when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of
+  memory for a sliding window when Z_FINISH is used.
+
+     If a preset dictionary is needed after this call (see inflateSetDictionary
+  below), inflate sets strm->adler to the Adler-32 checksum of the dictionary
+  chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
+  strm->adler to the Adler-32 checksum of all output produced so far (that is,
+  total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
+  below.  At the end of the stream, inflate() checks that its computed adler32
+  checksum is equal to that saved by the compressor and returns Z_STREAM_END
+  only if the checksum is correct.
+
+    inflate() can decompress and check either zlib-wrapped or gzip-wrapped
+  deflate data.  The header type is detected automatically, if requested when
+  initializing with inflateInit2().  Any information contained in the gzip
+  header is not retained, so applications that need that information should
+  instead use raw inflate, see inflateInit2() below, or inflateBack() and
+  perform their own processing of the gzip header and trailer.  When processing
+  gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output
+  producted so far.  The CRC-32 is checked against the gzip trailer.
+
+    inflate() returns Z_OK if some progress has been made (more input processed
+  or more output produced), Z_STREAM_END if the end of the compressed data has
+  been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+  corrupted (input stream not conforming to the zlib format or incorrect check
+  value), Z_STREAM_ERROR if the stream structure was inconsistent (for example
+  next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory,
+  Z_BUF_ERROR if no progress is possible or if there was not enough room in the
+  output buffer when Z_FINISH is used.  Note that Z_BUF_ERROR is not fatal, and
+  inflate() can be called again with more input and more output space to
+  continue decompressing.  If Z_DATA_ERROR is returned, the application may
+  then call inflateSync() to look for a good compression block if a partial
+  recovery of the data is desired.
+*/
+
+
+ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+     All dynamically allocated data structures for this stream are freed.
+   This function discards any unprocessed input and does not flush any pending
+   output.
+
+     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+   was inconsistent.  In the error case, msg may be set but then points to a
+   static string (which must not be deallocated).
+*/
+
+
+                        /* Advanced functions */
+
+/*
+    The following functions are needed only in some special applications.
+*/
+
+/*
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+                                     int  level,
+                                     int  method,
+                                     int  windowBits,
+                                     int  memLevel,
+                                     int  strategy));
+
+     This is another version of deflateInit with more compression options.  The
+   fields next_in, zalloc, zfree and opaque must be initialized before by the
+   caller.
+
+     The method parameter is the compression method.  It must be Z_DEFLATED in
+   this version of the library.
+
+     The windowBits parameter is the base two logarithm of the window size
+   (the size of the history buffer).  It should be in the range 8..15 for this
+   version of the library.  Larger values of this parameter result in better
+   compression at the expense of memory usage.  The default value is 15 if
+   deflateInit is used instead.
+
+     windowBits can also be -8..-15 for raw deflate.  In this case, -windowBits
+   determines the window size.  deflate() will then generate raw deflate data
+   with no zlib header or trailer, and will not compute an adler32 check value.
+
+     windowBits can also be greater than 15 for optional gzip encoding.  Add
+   16 to windowBits to write a simple gzip header and trailer around the
+   compressed data instead of a zlib wrapper.  The gzip header will have no
+   file name, no extra data, no comment, no modification time (set to zero), no
+   header crc, and the operating system will be set to 255 (unknown).  If a
+   gzip stream is being written, strm->adler is a crc32 instead of an adler32.
+
+     The memLevel parameter specifies how much memory should be allocated
+   for the internal compression state.  memLevel=1 uses minimum memory but is
+   slow and reduces compression ratio; memLevel=9 uses maximum memory for
+   optimal speed.  The default value is 8.  See zconf.h for total memory usage
+   as a function of windowBits and memLevel.
+
+     The strategy parameter is used to tune the compression algorithm.  Use the
+   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+   filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
+   string match), or Z_RLE to limit match distances to one (run-length
+   encoding).  Filtered data consists mostly of small values with a somewhat
+   random distribution.  In this case, the compression algorithm is tuned to
+   compress them better.  The effect of Z_FILTERED is to force more Huffman
+   coding and less string matching; it is somewhat intermediate between
+   Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY.  Z_RLE is designed to be almost as
+   fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data.  The
+   strategy parameter only affects the compression ratio but not the
+   correctness of the compressed output even if it is not set appropriately.
+   Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler
+   decoder for special applications.
+
+     deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid
+   method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is
+   incompatible with the version assumed by the caller (ZLIB_VERSION).  msg is
+   set to null if there is no error message.  deflateInit2 does not perform any
+   compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
+                                             const Bytef *dictionary,
+                                             uInt  dictLength));
+/*
+     Initializes the compression dictionary from the given byte sequence
+   without producing any compressed output.  When using the zlib format, this
+   function must be called immediately after deflateInit, deflateInit2 or
+   deflateReset, and before any call of deflate.  When doing raw deflate, this
+   function must be called either before any call of deflate, or immediately
+   after the completion of a deflate block, i.e. after all input has been
+   consumed and all output has been delivered when using any of the flush
+   options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH.  The
+   compressor and decompressor must use exactly the same dictionary (see
+   inflateSetDictionary).
+
+     The dictionary should consist of strings (byte sequences) that are likely
+   to be encountered later in the data to be compressed, with the most commonly
+   used strings preferably put towards the end of the dictionary.  Using a
+   dictionary is most useful when the data to be compressed is short and can be
+   predicted with good accuracy; the data can then be compressed better than
+   with the default empty dictionary.
+
+     Depending on the size of the compression data structures selected by
+   deflateInit or deflateInit2, a part of the dictionary may in effect be
+   discarded, for example if the dictionary is larger than the window size
+   provided in deflateInit or deflateInit2.  Thus the strings most likely to be
+   useful should be put at the end of the dictionary, not at the front.  In
+   addition, the current implementation of deflate will use at most the window
+   size minus 262 bytes of the provided dictionary.
+
+     Upon return of this function, strm->adler is set to the adler32 value
+   of the dictionary; the decompressor may later use this value to determine
+   which dictionary has been used by the compressor.  (The adler32 value
+   applies to the whole dictionary even if only a subset of the dictionary is
+   actually used by the compressor.) If a raw deflate was requested, then the
+   adler32 value is not computed and strm->adler is not set.
+
+     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+   parameter is invalid (e.g.  dictionary being Z_NULL) or the stream state is
+   inconsistent (for example if deflate has already been called for this stream
+   or if not at a block boundary for raw deflate).  deflateSetDictionary does
+   not perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
+                                    z_streamp source));
+/*
+     Sets the destination stream as a complete copy of the source stream.
+
+     This function can be useful when several compression strategies will be
+   tried, for example when there are several ways of pre-processing the input
+   data with a filter.  The streams that will be discarded should then be freed
+   by calling deflateEnd.  Note that deflateCopy duplicates the internal
+   compression state which can be quite large, so this strategy is slow and can
+   consume lots of memory.
+
+     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+   (such as zalloc being Z_NULL).  msg is left unchanged in both source and
+   destination.
+*/
+
+ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
+/*
+     This function is equivalent to deflateEnd followed by deflateInit,
+   but does not free and reallocate all the internal compression state.  The
+   stream will keep the same compression level and any other attributes that
+   may have been set by deflateInit2.
+
+     deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent (such as zalloc or state being Z_NULL).
+*/
+
+ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
+                                      int level,
+                                      int strategy));
+/*
+     Dynamically update the compression level and compression strategy.  The
+   interpretation of level and strategy is as in deflateInit2.  This can be
+   used to switch between compression and straight copy of the input data, or
+   to switch to a different kind of input data requiring a different strategy.
+   If the compression level is changed, the input available so far is
+   compressed with the old level (and may be flushed); the new level will take
+   effect only at the next call of deflate().
+
+     Before the call of deflateParams, the stream state must be set as for
+   a call of deflate(), since the currently available input may have to be
+   compressed and flushed.  In particular, strm->avail_out must be non-zero.
+
+     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if
+   strm->avail_out was zero.
+*/
+
+ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
+                                    int good_length,
+                                    int max_lazy,
+                                    int nice_length,
+                                    int max_chain));
+/*
+     Fine tune deflate's internal compression parameters.  This should only be
+   used by someone who understands the algorithm used by zlib's deflate for
+   searching for the best matching string, and even then only by the most
+   fanatic optimizer trying to squeeze out the last compressed bit for their
+   specific input data.  Read the deflate.c source code for the meaning of the
+   max_lazy, good_length, nice_length, and max_chain parameters.
+
+     deflateTune() can be called after deflateInit() or deflateInit2(), and
+   returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
+ */
+
+ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
+                                       uLong sourceLen));
+/*
+     deflateBound() returns an upper bound on the compressed size after
+   deflation of sourceLen bytes.  It must be called after deflateInit() or
+   deflateInit2(), and after deflateSetHeader(), if used.  This would be used
+   to allocate an output buffer for deflation in a single pass, and so would be
+   called before deflate().  If that first deflate() call is provided the
+   sourceLen input bytes, an output buffer allocated to the size returned by
+   deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed
+   to return Z_STREAM_END.  Note that it is possible for the compressed size to
+   be larger than the value returned by deflateBound() if flush options other
+   than Z_FINISH or Z_NO_FLUSH are used.
+*/
+
+ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,
+                                       unsigned *pending,
+                                       int *bits));
+/*
+     deflatePending() returns the number of bytes and bits of output that have
+   been generated, but not yet provided in the available output.  The bytes not
+   provided would be due to the available output space having being consumed.
+   The number of bits of output not provided are between 0 and 7, where they
+   await more bits to join them in order to fill out a full byte.  If pending
+   or bits are Z_NULL, then those values are not set.
+
+     deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent.
+ */
+
+ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
+                                     int bits,
+                                     int value));
+/*
+     deflatePrime() inserts bits in the deflate output stream.  The intent
+   is that this function is used to start off the deflate output with the bits
+   leftover from a previous deflate stream when appending to it.  As such, this
+   function can only be used for raw deflate, and must be used before the first
+   deflate() call after a deflateInit2() or deflateReset().  bits must be less
+   than or equal to 16, and that many of the least significant bits of value
+   will be inserted in the output.
+
+     deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough
+   room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the
+   source stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
+                                         gz_headerp head));
+/*
+     deflateSetHeader() provides gzip header information for when a gzip
+   stream is requested by deflateInit2().  deflateSetHeader() may be called
+   after deflateInit2() or deflateReset() and before the first call of
+   deflate().  The text, time, os, extra field, name, and comment information
+   in the provided gz_header structure are written to the gzip header (xflag is
+   ignored -- the extra flags are set according to the compression level).  The
+   caller must assure that, if not Z_NULL, name and comment are terminated with
+   a zero byte, and that if extra is not Z_NULL, that extra_len bytes are
+   available there.  If hcrc is true, a gzip header crc is included.  Note that
+   the current versions of the command-line version of gzip (up through version
+   1.3.x) do not support header crc's, and will report that it is a "multi-part
+   gzip file" and give up.
+
+     If deflateSetHeader is not used, the default gzip header has text false,
+   the time set to zero, and os set to 255, with no extra, name, or comment
+   fields.  The gzip header is returned to the default state by deflateReset().
+
+     deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+                                     int  windowBits));
+
+     This is another version of inflateInit with an extra parameter.  The
+   fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+   before by the caller.
+
+     The windowBits parameter is the base two logarithm of the maximum window
+   size (the size of the history buffer).  It should be in the range 8..15 for
+   this version of the library.  The default value is 15 if inflateInit is used
+   instead.  windowBits must be greater than or equal to the windowBits value
+   provided to deflateInit2() while compressing, or it must be equal to 15 if
+   deflateInit2() was not used.  If a compressed stream with a larger window
+   size is given as input, inflate() will return with the error code
+   Z_DATA_ERROR instead of trying to allocate a larger window.
+
+     windowBits can also be zero to request that inflate use the window size in
+   the zlib header of the compressed stream.
+
+     windowBits can also be -8..-15 for raw inflate.  In this case, -windowBits
+   determines the window size.  inflate() will then process raw deflate data,
+   not looking for a zlib or gzip header, not generating a check value, and not
+   looking for any check values for comparison at the end of the stream.  This
+   is for use with other formats that use the deflate compressed data format
+   such as zip.  Those formats provide their own check values.  If a custom
+   format is developed using the raw deflate format for compressed data, it is
+   recommended that a check value such as an adler32 or a crc32 be applied to
+   the uncompressed data as is done in the zlib, gzip, and zip formats.  For
+   most applications, the zlib format should be used as is.  Note that comments
+   above on the use in deflateInit2() applies to the magnitude of windowBits.
+
+     windowBits can also be greater than 15 for optional gzip decoding.  Add
+   32 to windowBits to enable zlib and gzip decoding with automatic header
+   detection, or add 16 to decode only the gzip format (the zlib format will
+   return a Z_DATA_ERROR).  If a gzip stream is being decoded, strm->adler is a
+   crc32 instead of an adler32.
+
+     inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+   version assumed by the caller, or Z_STREAM_ERROR if the parameters are
+   invalid, such as a null pointer to the structure.  msg is set to null if
+   there is no error message.  inflateInit2 does not perform any decompression
+   apart from possibly reading the zlib header if present: actual decompression
+   will be done by inflate().  (So next_in and avail_in may be modified, but
+   next_out and avail_out are unused and unchanged.) The current implementation
+   of inflateInit2() does not process any header information -- that is
+   deferred until inflate() is called.
+*/
+
+ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
+                                             const Bytef *dictionary,
+                                             uInt  dictLength));
+/*
+     Initializes the decompression dictionary from the given uncompressed byte
+   sequence.  This function must be called immediately after a call of inflate,
+   if that call returned Z_NEED_DICT.  The dictionary chosen by the compressor
+   can be determined from the adler32 value returned by that call of inflate.
+   The compressor and decompressor must use exactly the same dictionary (see
+   deflateSetDictionary).  For raw inflate, this function can be called at any
+   time to set the dictionary.  If the provided dictionary is smaller than the
+   window and there is already data in the window, then the provided dictionary
+   will amend what's there.  The application must insure that the dictionary
+   that was used for compression is provided.
+
+     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+   parameter is invalid (e.g.  dictionary being Z_NULL) or the stream state is
+   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+   expected one (incorrect adler32 value).  inflateSetDictionary does not
+   perform any decompression: this will be done by subsequent calls of
+   inflate().
+*/
+
+ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
+                                             Bytef *dictionary,
+                                             uInt  *dictLength));
+/*
+     Returns the sliding dictionary being maintained by inflate.  dictLength is
+   set to the number of bytes in the dictionary, and that many bytes are copied
+   to dictionary.  dictionary must have enough space, where 32768 bytes is
+   always enough.  If inflateGetDictionary() is called with dictionary equal to
+   Z_NULL, then only the dictionary length is returned, and nothing is copied.
+   Similary, if dictLength is Z_NULL, then it is not set.
+
+     inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the
+   stream state is inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+/*
+     Skips invalid compressed data until a possible full flush point (see above
+   for the description of deflate with Z_FULL_FLUSH) can be found, or until all
+   available input is skipped.  No output is provided.
+
+     inflateSync searches for a 00 00 FF FF pattern in the compressed data.
+   All full flush points have this pattern, but not all occurrences of this
+   pattern are full flush points.
+
+     inflateSync returns Z_OK if a possible full flush point has been found,
+   Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point
+   has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.
+   In the success case, the application may save the current current value of
+   total_in which indicates where valid compressed data was found.  In the
+   error case, the application may repeatedly call inflateSync, providing more
+   input each time, until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
+                                    z_streamp source));
+/*
+     Sets the destination stream as a complete copy of the source stream.
+
+     This function can be useful when randomly accessing a large stream.  The
+   first pass through the stream can periodically record the inflate state,
+   allowing restarting inflate at those points when randomly accessing the
+   stream.
+
+     inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+   (such as zalloc being Z_NULL).  msg is left unchanged in both source and
+   destination.
+*/
+
+ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
+/*
+     This function is equivalent to inflateEnd followed by inflateInit,
+   but does not free and reallocate all the internal decompression state.  The
+   stream will keep attributes that may have been set by inflateInit2.
+
+     inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent (such as zalloc or state being Z_NULL).
+*/
+
+ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
+                                      int windowBits));
+/*
+     This function is the same as inflateReset, but it also permits changing
+   the wrap and window size requests.  The windowBits parameter is interpreted
+   the same as it is for inflateInit2.
+
+     inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent (such as zalloc or state being Z_NULL), or if
+   the windowBits parameter is invalid.
+*/
+
+ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
+                                     int bits,
+                                     int value));
+/*
+     This function inserts bits in the inflate input stream.  The intent is
+   that this function is used to start inflating at a bit position in the
+   middle of a byte.  The provided bits will be used before any bytes are used
+   from next_in.  This function should only be used with raw inflate, and
+   should be used before the first inflate() call after inflateInit2() or
+   inflateReset().  bits must be less than or equal to 16, and that many of the
+   least significant bits of value will be inserted in the input.
+
+     If bits is negative, then the input stream bit buffer is emptied.  Then
+   inflatePrime() can be called again to put bits in the buffer.  This is used
+   to clear out bits leftover after feeding inflate a block description prior
+   to feeding inflate codes.
+
+     inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent.
+*/
+
+ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));
+/*
+     This function returns two values, one in the lower 16 bits of the return
+   value, and the other in the remaining upper bits, obtained by shifting the
+   return value down 16 bits.  If the upper value is -1 and the lower value is
+   zero, then inflate() is currently decoding information outside of a block.
+   If the upper value is -1 and the lower value is non-zero, then inflate is in
+   the middle of a stored block, with the lower value equaling the number of
+   bytes from the input remaining to copy.  If the upper value is not -1, then
+   it is the number of bits back from the current bit position in the input of
+   the code (literal or length/distance pair) currently being processed.  In
+   that case the lower value is the number of bytes already emitted for that
+   code.
+
+     A code is being processed if inflate is waiting for more input to complete
+   decoding of the code, or if it has completed decoding but is waiting for
+   more output space to write the literal or match data.
+
+     inflateMark() is used to mark locations in the input data for random
+   access, which may be at bit positions, and to note those cases where the
+   output of a code may span boundaries of random access blocks.  The current
+   location in the input stream can be determined from avail_in and data_type
+   as noted in the description for the Z_BLOCK flush parameter for inflate.
+
+     inflateMark returns the value noted above or -1 << 16 if the provided
+   source stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
+                                         gz_headerp head));
+/*
+     inflateGetHeader() requests that gzip header information be stored in the
+   provided gz_header structure.  inflateGetHeader() may be called after
+   inflateInit2() or inflateReset(), and before the first call of inflate().
+   As inflate() processes the gzip stream, head->done is zero until the header
+   is completed, at which time head->done is set to one.  If a zlib stream is
+   being decoded, then head->done is set to -1 to indicate that there will be
+   no gzip header information forthcoming.  Note that Z_BLOCK or Z_TREES can be
+   used to force inflate() to return immediately after header processing is
+   complete and before any actual data is decompressed.
+
+     The text, time, xflags, and os fields are filled in with the gzip header
+   contents.  hcrc is set to true if there is a header CRC.  (The header CRC
+   was valid if done is set to one.) If extra is not Z_NULL, then extra_max
+   contains the maximum number of bytes to write to extra.  Once done is true,
+   extra_len contains the actual extra field length, and extra contains the
+   extra field, or that field truncated if extra_max is less than extra_len.
+   If name is not Z_NULL, then up to name_max characters are written there,
+   terminated with a zero unless the length is greater than name_max.  If
+   comment is not Z_NULL, then up to comm_max characters are written there,
+   terminated with a zero unless the length is greater than comm_max.  When any
+   of extra, name, or comment are not Z_NULL and the respective field is not
+   present in the header, then that field is set to Z_NULL to signal its
+   absence.  This allows the use of deflateSetHeader() with the returned
+   structure to duplicate the header.  However if those fields are set to
+   allocated memory, then the application will need to save those pointers
+   elsewhere so that they can be eventually freed.
+
+     If inflateGetHeader is not used, then the header information is simply
+   discarded.  The header is always checked for validity, including the header
+   CRC if present.  inflateReset() will reset the process to discard the header
+   information.  The application would need to call inflateGetHeader() again to
+   retrieve the header from the next gzip stream.
+
+     inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
+                                        unsigned char FAR *window));
+
+     Initialize the internal stream state for decompression using inflateBack()
+   calls.  The fields zalloc, zfree and opaque in strm must be initialized
+   before the call.  If zalloc and zfree are Z_NULL, then the default library-
+   derived memory allocation routines are used.  windowBits is the base two
+   logarithm of the window size, in the range 8..15.  window is a caller
+   supplied buffer of that size.  Except for special applications where it is
+   assured that deflate was used with small window sizes, windowBits must be 15
+   and a 32K byte window must be supplied to be able to decompress general
+   deflate streams.
+
+     See inflateBack() for the usage of these routines.
+
+     inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
+   the parameters are invalid, Z_MEM_ERROR if the internal state could not be
+   allocated, or Z_VERSION_ERROR if the version of the library does not match
+   the version of the header file.
+*/
+
+typedef unsigned (*in_func) OF((void FAR *,
+                                z_const unsigned char FAR * FAR *));
+typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
+
+ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
+                                    in_func in, void FAR *in_desc,
+                                    out_func out, void FAR *out_desc));
+/*
+     inflateBack() does a raw inflate with a single call using a call-back
+   interface for input and output.  This is potentially more efficient than
+   inflate() for file i/o applications, in that it avoids copying between the
+   output and the sliding window by simply making the window itself the output
+   buffer.  inflate() can be faster on modern CPUs when used with large
+   buffers.  inflateBack() trusts the application to not change the output
+   buffer passed by the output function, at least until inflateBack() returns.
+
+     inflateBackInit() must be called first to allocate the internal state
+   and to initialize the state with the user-provided window buffer.
+   inflateBack() may then be used multiple times to inflate a complete, raw
+   deflate stream with each call.  inflateBackEnd() is then called to free the
+   allocated state.
+
+     A raw deflate stream is one with no zlib or gzip header or trailer.
+   This routine would normally be used in a utility that reads zip or gzip
+   files and writes out uncompressed files.  The utility would decode the
+   header and process the trailer on its own, hence this routine expects only
+   the raw deflate stream to decompress.  This is different from the normal
+   behavior of inflate(), which expects either a zlib or gzip header and
+   trailer around the deflate stream.
+
+     inflateBack() uses two subroutines supplied by the caller that are then
+   called by inflateBack() for input and output.  inflateBack() calls those
+   routines until it reads a complete deflate stream and writes out all of the
+   uncompressed data, or until it encounters an error.  The function's
+   parameters and return types are defined above in the in_func and out_func
+   typedefs.  inflateBack() will call in(in_desc, &buf) which should return the
+   number of bytes of provided input, and a pointer to that input in buf.  If
+   there is no input available, in() must return zero--buf is ignored in that
+   case--and inflateBack() will return a buffer error.  inflateBack() will call
+   out(out_desc, buf, len) to write the uncompressed data buf[0..len-1].  out()
+   should return zero on success, or non-zero on failure.  If out() returns
+   non-zero, inflateBack() will return with an error.  Neither in() nor out()
+   are permitted to change the contents of the window provided to
+   inflateBackInit(), which is also the buffer that out() uses to write from.
+   The length written by out() will be at most the window size.  Any non-zero
+   amount of input may be provided by in().
+
+     For convenience, inflateBack() can be provided input on the first call by
+   setting strm->next_in and strm->avail_in.  If that input is exhausted, then
+   in() will be called.  Therefore strm->next_in must be initialized before
+   calling inflateBack().  If strm->next_in is Z_NULL, then in() will be called
+   immediately for input.  If strm->next_in is not Z_NULL, then strm->avail_in
+   must also be initialized, and then if strm->avail_in is not zero, input will
+   initially be taken from strm->next_in[0 ..  strm->avail_in - 1].
+
+     The in_desc and out_desc parameters of inflateBack() is passed as the
+   first parameter of in() and out() respectively when they are called.  These
+   descriptors can be optionally used to pass any information that the caller-
+   supplied in() and out() functions need to do their job.
+
+     On return, inflateBack() will set strm->next_in and strm->avail_in to
+   pass back any unused input that was provided by the last in() call.  The
+   return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR
+   if in() or out() returned an error, Z_DATA_ERROR if there was a format error
+   in the deflate stream (in which case strm->msg is set to indicate the nature
+   of the error), or Z_STREAM_ERROR if the stream was not properly initialized.
+   In the case of Z_BUF_ERROR, an input or output error can be distinguished
+   using strm->next_in which will be Z_NULL only if in() returned an error.  If
+   strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning
+   non-zero.  (in() will always be called before out(), so strm->next_in is
+   assured to be defined if out() returns non-zero.) Note that inflateBack()
+   cannot return Z_OK.
+*/
+
+ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
+/*
+     All memory allocated by inflateBackInit() is freed.
+
+     inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream
+   state was inconsistent.
+*/
+
+ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
+/* Return flags indicating compile-time options.
+
+    Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
+     1.0: size of uInt
+     3.2: size of uLong
+     5.4: size of voidpf (pointer)
+     7.6: size of z_off_t
+
+    Compiler, assembler, and debug options:
+     8: DEBUG
+     9: ASMV or ASMINF -- use ASM code
+     10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
+     11: 0 (reserved)
+
+    One-time table building (smaller code, but not thread-safe if true):
+     12: BUILDFIXED -- build static block decoding tables when needed
+     13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed
+     14,15: 0 (reserved)
+
+    Library content (indicates missing functionality):
+     16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking
+                          deflate code when not needed)
+     17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect
+                    and decode gzip streams (to avoid linking crc code)
+     18-19: 0 (reserved)
+
+    Operation variations (changes in library functionality):
+     20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate
+     21: FASTEST -- deflate algorithm with only one, lowest compression level
+     22,23: 0 (reserved)
+
+    The sprintf variant used by gzprintf (zero is best):
+     24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format
+     25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!
+     26: 0 = returns value, 1 = void -- 1 means inferred string length returned
+
+    Remainder:
+     27-31: 0 (reserved)
+ */
+
+#ifndef Z_SOLO
+
+                        /* utility functions */
+
+/*
+     The following utility functions are implemented on top of the basic
+   stream-oriented functions.  To simplify the interface, some default options
+   are assumed (compression level and memory usage, standard memory allocation
+   functions).  The source code of these utility functions can be modified if
+   you need special options.
+*/
+
+ZEXTERN int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,
+                                 const Bytef *source, uLong sourceLen));
+/*
+     Compresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer.  Upon entry, destLen is the total size
+   of the destination buffer, which must be at least the value returned by
+   compressBound(sourceLen).  Upon exit, destLen is the actual size of the
+   compressed buffer.
+
+     compress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer.
+*/
+
+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,
+                                  const Bytef *source, uLong sourceLen,
+                                  int level));
+/*
+     Compresses the source buffer into the destination buffer.  The level
+   parameter has the same meaning as in deflateInit.  sourceLen is the byte
+   length of the source buffer.  Upon entry, destLen is the total size of the
+   destination buffer, which must be at least the value returned by
+   compressBound(sourceLen).  Upon exit, destLen is the actual size of the
+   compressed buffer.
+
+     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+   Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
+/*
+     compressBound() returns an upper bound on the compressed size after
+   compress() or compress2() on sourceLen bytes.  It would be used before a
+   compress() or compress2() call to allocate the destination buffer.
+*/
+
+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,
+                                   const Bytef *source, uLong sourceLen));
+/*
+     Decompresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer.  Upon entry, destLen is the total size
+   of the destination buffer, which must be large enough to hold the entire
+   uncompressed data.  (The size of the uncompressed data must have been saved
+   previously by the compressor and transmitted to the decompressor by some
+   mechanism outside the scope of this compression library.) Upon exit, destLen
+   is the actual size of the uncompressed buffer.
+
+     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.  In
+   the case where there is not enough room, uncompress() will fill the output
+   buffer with the uncompressed data up to that point.
+*/
+
+                        /* gzip file access functions */
+
+/*
+     This library supports reading and writing files in gzip (.gz) format with
+   an interface similar to that of stdio, using the functions that start with
+   "gz".  The gzip format is different from the zlib format.  gzip is a gzip
+   wrapper, documented in RFC 1952, wrapped around a deflate stream.
+*/
+
+typedef struct gzFile_s *gzFile;    /* semi-opaque gzip file descriptor */
+
+/*
+ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
+
+     Opens a gzip (.gz) file for reading or writing.  The mode parameter is as
+   in fopen ("rb" or "wb") but can also include a compression level ("wb9") or
+   a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only
+   compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F'
+   for fixed code compression as in "wb9F".  (See the description of
+   deflateInit2 for more information about the strategy parameter.)  'T' will
+   request transparent writing or appending with no compression and not using
+   the gzip format.
+
+     "a" can be used instead of "w" to request that the gzip stream that will
+   be written be appended to the file.  "+" will result in an error, since
+   reading and writing to the same gzip file is not supported.  The addition of
+   "x" when writing will create the file exclusively, which fails if the file
+   already exists.  On systems that support it, the addition of "e" when
+   reading or writing will set the flag to close the file on an execve() call.
+
+     These functions, as well as gzip, will read and decode a sequence of gzip
+   streams in a file.  The append function of gzopen() can be used to create
+   such a file.  (Also see gzflush() for another way to do this.)  When
+   appending, gzopen does not test whether the file begins with a gzip stream,
+   nor does it look for the end of the gzip streams to begin appending.  gzopen
+   will simply append a gzip stream to the existing file.
+
+     gzopen can be used to read a file which is not in gzip format; in this
+   case gzread will directly read from the file without decompression.  When
+   reading, this will be detected automatically by looking for the magic two-
+   byte gzip header.
+
+     gzopen returns NULL if the file could not be opened, if there was
+   insufficient memory to allocate the gzFile state, or if an invalid mode was
+   specified (an 'r', 'w', or 'a' was not provided, or '+' was provided).
+   errno can be checked to determine if the reason gzopen failed was that the
+   file could not be opened.
+*/
+
+ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
+/*
+     gzdopen associates a gzFile with the file descriptor fd.  File descriptors
+   are obtained from calls like open, dup, creat, pipe or fileno (if the file
+   has been previously opened with fopen).  The mode parameter is as in gzopen.
+
+     The next call of gzclose on the returned gzFile will also close the file
+   descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor
+   fd.  If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd,
+   mode);.  The duplicated descriptor should be saved to avoid a leak, since
+   gzdopen does not close fd if it fails.  If you are using fileno() to get the
+   file descriptor from a FILE *, then you will have to use dup() to avoid
+   double-close()ing the file descriptor.  Both gzclose() and fclose() will
+   close the associated file descriptor, so they need to have different file
+   descriptors.
+
+     gzdopen returns NULL if there was insufficient memory to allocate the
+   gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not
+   provided, or '+' was provided), or if fd is -1.  The file descriptor is not
+   used until the next gz* read, write, seek, or close operation, so gzdopen
+   will not detect if fd is invalid (unless fd is -1).
+*/
+
+ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
+/*
+     Set the internal buffer size used by this library's functions.  The
+   default buffer size is 8192 bytes.  This function must be called after
+   gzopen() or gzdopen(), and before any other calls that read or write the
+   file.  The buffer memory allocation is always deferred to the first read or
+   write.  Two buffers are allocated, either both of the specified size when
+   writing, or one of the specified size and the other twice that size when
+   reading.  A larger buffer size of, for example, 64K or 128K bytes will
+   noticeably increase the speed of decompression (reading).
+
+     The new buffer size also affects the maximum length for gzprintf().
+
+     gzbuffer() returns 0 on success, or -1 on failure, such as being called
+   too late.
+*/
+
+ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+     Dynamically update the compression level or strategy.  See the description
+   of deflateInit2 for the meaning of these parameters.
+
+     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+   opened for writing.
+*/
+
+ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+/*
+     Reads the given number of uncompressed bytes from the compressed file.  If
+   the input file is not in gzip format, gzread copies the given number of
+   bytes into the buffer directly from the file.
+
+     After reaching the end of a gzip stream in the input, gzread will continue
+   to read, looking for another gzip stream.  Any number of gzip streams may be
+   concatenated in the input file, and will all be decompressed by gzread().
+   If something other than a gzip stream is encountered after a gzip stream,
+   that remaining trailing garbage is ignored (and no error is returned).
+
+     gzread can be used to read a gzip file that is being concurrently written.
+   Upon reaching the end of the input, gzread will return with the available
+   data.  If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then
+   gzclearerr can be used to clear the end of file indicator in order to permit
+   gzread to be tried again.  Z_OK indicates that a gzip stream was completed
+   on the last gzread.  Z_BUF_ERROR indicates that the input file ended in the
+   middle of a gzip stream.  Note that gzread does not return -1 in the event
+   of an incomplete gzip stream.  This error is deferred until gzclose(), which
+   will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip
+   stream.  Alternatively, gzerror can be used before gzclose to detect this
+   case.
+
+     gzread returns the number of uncompressed bytes actually read, less than
+   len for end of file, or -1 for error.
+*/
+
+ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
+                                voidpc buf, unsigned len));
+/*
+     Writes the given number of uncompressed bytes into the compressed file.
+   gzwrite returns the number of uncompressed bytes written or 0 in case of
+   error.
+*/
+
+ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
+/*
+     Converts, formats, and writes the arguments to the compressed file under
+   control of the format string, as in fprintf.  gzprintf returns the number of
+   uncompressed bytes actually written, or 0 in case of error.  The number of
+   uncompressed bytes written is limited to 8191, or one less than the buffer
+   size given to gzbuffer().  The caller should assure that this limit is not
+   exceeded.  If it is exceeded, then gzprintf() will return an error (0) with
+   nothing written.  In this case, there may also be a buffer overflow with
+   unpredictable consequences, which is possible only if zlib was compiled with
+   the insecure functions sprintf() or vsprintf() because the secure snprintf()
+   or vsnprintf() functions were not available.  This can be determined using
+   zlibCompileFlags().
+*/
+
+ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+     Writes the given null-terminated string to the compressed file, excluding
+   the terminating null character.
+
+     gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
+/*
+     Reads bytes from the compressed file until len-1 characters are read, or a
+   newline character is read and transferred to buf, or an end-of-file
+   condition is encountered.  If any characters are read or if len == 1, the
+   string is terminated with a null character.  If no characters are read due
+   to an end-of-file or len < 1, then the buffer is left untouched.
+
+     gzgets returns buf which is a null-terminated string, or it returns NULL
+   for end-of-file or in case of error.  If there was an error, the contents at
+   buf are indeterminate.
+*/
+
+ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
+/*
+     Writes c, converted to an unsigned char, into the compressed file.  gzputc
+   returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
+/*
+     Reads one byte from the compressed file.  gzgetc returns this byte or -1
+   in case of end of file or error.  This is implemented as a macro for speed.
+   As such, it does not do all of the checking the other functions do.  I.e.
+   it does not check to see if file is NULL, nor whether the structure file
+   points to has been clobbered or not.
+*/
+
+ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
+/*
+     Push one character back onto the stream to be read as the first character
+   on the next read.  At least one character of push-back is allowed.
+   gzungetc() returns the character pushed, or -1 on failure.  gzungetc() will
+   fail if c is -1, and may fail if a character has been pushed but not read
+   yet.  If gzungetc is used immediately after gzopen or gzdopen, at least the
+   output buffer size of pushed characters is allowed.  (See gzbuffer above.)
+   The pushed character will be discarded if the stream is repositioned with
+   gzseek() or gzrewind().
+*/
+
+ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
+/*
+     Flushes all pending output into the compressed file.  The parameter flush
+   is as in the deflate() function.  The return value is the zlib error number
+   (see function gzerror below).  gzflush is only permitted when writing.
+
+     If the flush parameter is Z_FINISH, the remaining data is written and the
+   gzip stream is completed in the output.  If gzwrite() is called again, a new
+   gzip stream will be started in the output.  gzread() is able to read such
+   concatented gzip streams.
+
+     gzflush should be called only when strictly necessary because it will
+   degrade compression if called too often.
+*/
+
+/*
+ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
+                                   z_off_t offset, int whence));
+
+     Sets the starting position for the next gzread or gzwrite on the given
+   compressed file.  The offset represents a number of bytes in the
+   uncompressed data stream.  The whence parameter is defined as in lseek(2);
+   the value SEEK_END is not supported.
+
+     If the file is opened for reading, this function is emulated but can be
+   extremely slow.  If the file is opened for writing, only forward seeks are
+   supported; gzseek then compresses a sequence of zeroes up to the new
+   starting position.
+
+     gzseek returns the resulting offset location as measured in bytes from
+   the beginning of the uncompressed stream, or -1 in case of error, in
+   particular if the file is opened for writing and the new starting position
+   would be before the current position.
+*/
+
+ZEXTERN int ZEXPORT    gzrewind OF((gzFile file));
+/*
+     Rewinds the given file. This function is supported only for reading.
+
+     gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+/*
+ZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));
+
+     Returns the starting position for the next gzread or gzwrite on the given
+   compressed file.  This position represents a number of bytes in the
+   uncompressed data stream, and is zero when starting, even if appending or
+   reading a gzip stream from the middle of a file using gzdopen().
+
+     gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+/*
+ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
+
+     Returns the current offset in the file being read or written.  This offset
+   includes the count of bytes that precede the gzip stream, for example when
+   appending or when using gzdopen() for reading.  When reading, the offset
+   does not include as yet unused buffered input.  This information can be used
+   for a progress indicator.  On error, gzoffset() returns -1.
+*/
+
+ZEXTERN int ZEXPORT gzeof OF((gzFile file));
+/*
+     Returns true (1) if the end-of-file indicator has been set while reading,
+   false (0) otherwise.  Note that the end-of-file indicator is set only if the
+   read tried to go past the end of the input, but came up short.  Therefore,
+   just like feof(), gzeof() may return false even if there is no more data to
+   read, in the event that the last read request was for the exact number of
+   bytes remaining in the input file.  This will happen if the input file size
+   is an exact multiple of the buffer size.
+
+     If gzeof() returns true, then the read functions will return no more data,
+   unless the end-of-file indicator is reset by gzclearerr() and the input file
+   has grown since the previous end of file was detected.
+*/
+
+ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
+/*
+     Returns true (1) if file is being copied directly while reading, or false
+   (0) if file is a gzip stream being decompressed.
+
+     If the input file is empty, gzdirect() will return true, since the input
+   does not contain a gzip stream.
+
+     If gzdirect() is used immediately after gzopen() or gzdopen() it will
+   cause buffers to be allocated to allow reading the file to determine if it
+   is a gzip file.  Therefore if gzbuffer() is used, it should be called before
+   gzdirect().
+
+     When writing, gzdirect() returns true (1) if transparent writing was
+   requested ("wT" for the gzopen() mode), or false (0) otherwise.  (Note:
+   gzdirect() is not needed when writing.  Transparent writing must be
+   explicitly requested, so the application already knows the answer.  When
+   linking statically, using gzdirect() will include all of the zlib code for
+   gzip file reading and decompression, which may not be desired.)
+*/
+
+ZEXTERN int ZEXPORT    gzclose OF((gzFile file));
+/*
+     Flushes all pending output if necessary, closes the compressed file and
+   deallocates the (de)compression state.  Note that once file is closed, you
+   cannot call gzerror with file, since its structures have been deallocated.
+   gzclose must not be called more than once on the same file, just as free
+   must not be called more than once on the same allocation.
+
+     gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a
+   file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the
+   last read ended in the middle of a gzip stream, or Z_OK on success.
+*/
+
+ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));
+ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
+/*
+     Same as gzclose(), but gzclose_r() is only for use when reading, and
+   gzclose_w() is only for use when writing or appending.  The advantage to
+   using these instead of gzclose() is that they avoid linking in zlib
+   compression or decompression code that is not used when only reading or only
+   writing respectively.  If gzclose() is used, then both compression and
+   decompression code will be included the application when linking to a static
+   zlib library.
+*/
+
+ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
+/*
+     Returns the error message for the last error which occurred on the given
+   compressed file.  errnum is set to zlib error number.  If an error occurred
+   in the file system and not in the compression library, errnum is set to
+   Z_ERRNO and the application may consult errno to get the exact error code.
+
+     The application must not modify the returned string.  Future calls to
+   this function may invalidate the previously returned string.  If file is
+   closed, then the string previously returned by gzerror will no longer be
+   available.
+
+     gzerror() should be used to distinguish errors from end-of-file for those
+   functions above that do not distinguish those cases in their return values.
+*/
+
+ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
+/*
+     Clears the error and end-of-file flags for file.  This is analogous to the
+   clearerr() function in stdio.  This is useful for continuing to read a gzip
+   file that is being written concurrently.
+*/
+
+#endif /* !Z_SOLO */
+
+                        /* checksum functions */
+
+/*
+     These functions are not related to compression but are exported
+   anyway because they might be useful in applications using the compression
+   library.
+*/
+
+ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+/*
+     Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+   return the updated checksum.  If buf is Z_NULL, this function returns the
+   required initial value for the checksum.
+
+     An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+   much faster.
+
+   Usage example:
+
+     uLong adler = adler32(0L, Z_NULL, 0);
+
+     while (read_buffer(buffer, length) != EOF) {
+       adler = adler32(adler, buffer, length);
+     }
+     if (adler != original_adler) error();
+*/
+
+/*
+ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
+                                          z_off_t len2));
+
+     Combine two Adler-32 checksums into one.  For two sequences of bytes, seq1
+   and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
+   each, adler1 and adler2.  adler32_combine() returns the Adler-32 checksum of
+   seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.  Note
+   that the z_off_t type (like off_t) is a signed integer.  If len2 is
+   negative, the result has no meaning or utility.
+*/
+
+ZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));
+/*
+     Update a running CRC-32 with the bytes buf[0..len-1] and return the
+   updated CRC-32.  If buf is Z_NULL, this function returns the required
+   initial value for the crc.  Pre- and post-conditioning (one's complement) is
+   performed within this function so it shouldn't be done by the application.
+
+   Usage example:
+
+     uLong crc = crc32(0L, Z_NULL, 0);
+
+     while (read_buffer(buffer, length) != EOF) {
+       crc = crc32(crc, buffer, length);
+     }
+     if (crc != original_crc) error();
+*/
+
+/*
+ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
+
+     Combine two CRC-32 check values into one.  For two sequences of bytes,
+   seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
+   calculated for each, crc1 and crc2.  crc32_combine() returns the CRC-32
+   check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
+   len2.
+*/
+
+
+                        /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+                                     const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
+                                     const char *version, int stream_size));
+ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,
+                                      int windowBits, int memLevel,
+                                      int strategy, const char *version,
+                                      int stream_size));
+ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,
+                                      const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
+                                         unsigned char FAR *window,
+                                         const char *version,
+                                         int stream_size));
+#define deflateInit(strm, level) \
+        deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
+#define inflateInit(strm) \
+        inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+                      (strategy), ZLIB_VERSION, (int)sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+        inflateInit2_((strm), (windowBits), ZLIB_VERSION, \
+                      (int)sizeof(z_stream))
+#define inflateBackInit(strm, windowBits, window) \
+        inflateBackInit_((strm), (windowBits), (window), \
+                      ZLIB_VERSION, (int)sizeof(z_stream))
+
+#ifndef Z_SOLO
+
+/* gzgetc() macro and its supporting function and exposed data structure.  Note
+ * that the real internal state is much larger than the exposed structure.
+ * This abbreviated structure exposes just enough for the gzgetc() macro.  The
+ * user should not mess with these exposed elements, since their names or
+ * behavior could change in the future, perhaps even capriciously.  They can
+ * only be used by the gzgetc() macro.  You have been warned.
+ */
+struct gzFile_s {
+    unsigned have;
+    unsigned char *next;
+    z_off64_t pos;
+};
+ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file));  /* backward compatibility */
+#ifdef Z_PREFIX_SET
+#  undef z_gzgetc
+#  define z_gzgetc(g) \
+          ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))
+#else
+#  define gzgetc(g) \
+          ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))
+#endif
+
+/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or
+ * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if
+ * both are true, the application gets the *64 functions, and the regular
+ * functions are changed to 64 bits) -- in case these are set on systems
+ * without large file support, _LFS64_LARGEFILE must also be true
+ */
+#ifdef Z_LARGE64
+   ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+   ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
+   ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
+   ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+   ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));
+   ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));
+#endif
+
+#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
+#  ifdef Z_PREFIX_SET
+#    define z_gzopen z_gzopen64
+#    define z_gzseek z_gzseek64
+#    define z_gztell z_gztell64
+#    define z_gzoffset z_gzoffset64
+#    define z_adler32_combine z_adler32_combine64
+#    define z_crc32_combine z_crc32_combine64
+#  else
+#    define gzopen gzopen64
+#    define gzseek gzseek64
+#    define gztell gztell64
+#    define gzoffset gzoffset64
+#    define adler32_combine adler32_combine64
+#    define crc32_combine crc32_combine64
+#  endif
+#  ifndef Z_LARGE64
+     ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+     ZEXTERN off64_t ZEXPORT gzseek64 OF((gzFile, off64_t, int));
+     ZEXTERN off64_t ZEXPORT gztell64 OF((gzFile));
+     ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+     ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, off64_t));
+     ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, off64_t));
+#  endif
+#else
+   ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));
+   ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));
+   ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));
+   ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));
+   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
+   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+#endif
+
+#else /* Z_SOLO */
+
+   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
+   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+
+#endif /* !Z_SOLO */
+
+/* hack for buggy compilers */
+#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)
+    struct internal_state {int dummy;};
+#endif
+
+/* undocumented functions */
+ZEXTERN const char   * ZEXPORT zError           OF((int));
+ZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp));
+ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table    OF((void));
+ZEXTERN int            ZEXPORT inflateUndermine OF((z_streamp, int));
+ZEXTERN int            ZEXPORT inflateResetKeep OF((z_streamp));
+ZEXTERN int            ZEXPORT deflateResetKeep OF((z_streamp));
+#if defined(_WIN32) && !defined(Z_SOLO)
+ZEXTERN gzFile         ZEXPORT gzopen_w OF((const wchar_t *path,
+                                            const char *mode));
+#endif
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+#  ifndef Z_SOLO
+ZEXTERN int            ZEXPORTVA gzvprintf Z_ARG((gzFile file,
+                                                  const char *format,
+                                                  va_list va));
+#  endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ZLIB_H */
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/zutil.h b/core/src/fxcodec/fx_zlib/zlib_v128/zutil.h
new file mode 100644
index 0000000..582d1b5
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/zutil.h
@@ -0,0 +1,255 @@
+/* zutil.h -- internal interface and configuration of the compression library
+ * Copyright (C) 1995-2013 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZUTIL_H
+#define ZUTIL_H
+
+#include "../../../../include/fxcrt/fx_system.h"		/* XYQ 2007-5-22 */
+
+#ifdef HAVE_HIDDEN
+#  define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
+#else
+#  define ZLIB_INTERNAL
+#endif
+
+#include "zlib.h"
+
+#if defined(STDC) && !defined(Z_SOLO)
+#  if !(defined(_WIN32_WCE) && defined(_MSC_VER))
+#    include <stddef.h>
+#  endif
+#  include <string.h>
+#  include <stdlib.h>
+#endif
+
+#ifdef Z_SOLO
+   typedef long ptrdiff_t;  /* guess -- will be caught if guess is wrong */
+#endif
+
+#ifndef local
+#  define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+typedef unsigned char  uch;
+typedef uch FAR uchf;
+typedef unsigned short ush;
+typedef ush FAR ushf;
+typedef unsigned long  ulg;
+
+extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
+/* (size given to avoid silly warnings with Visual C++) */
+
+#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
+
+#define ERR_RETURN(strm,err) \
+  return (strm->msg = ERR_MSG(err), (err))
+/* To be used only when the state is known to be valid */
+
+        /* common constants */
+
+#ifndef DEF_WBITS
+#  define DEF_WBITS MAX_WBITS
+#endif
+/* default windowBits for decompression. MAX_WBITS is for compression only */
+
+#if MAX_MEM_LEVEL >= 8
+#  define DEF_MEM_LEVEL 8
+#else
+#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
+#endif
+/* default memLevel */
+
+#define STORED_BLOCK 0
+#define STATIC_TREES 1
+#define DYN_TREES    2
+/* The three kinds of block type */
+
+#define MIN_MATCH  3
+#define MAX_MATCH  258
+/* The minimum and maximum match lengths */
+
+#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
+
+        /* target dependencies */
+
+#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))
+#  define OS_CODE  0x00
+#  ifndef Z_SOLO
+#    if defined(__TURBOC__) || defined(__BORLANDC__)
+#      if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
+         /* Allow compilation with ANSI keywords only enabled */
+         void _Cdecl farfree( void *block );
+         void *_Cdecl farmalloc( unsigned long nbytes );
+#      else
+#        include <alloc.h>
+#      endif
+#    else /* MSC or DJGPP */
+#      include <malloc.h>
+#    endif
+#  endif
+#endif
+
+#ifdef AMIGA
+#  define OS_CODE  0x01
+#endif
+
+#if defined(VAXC) || defined(VMS)
+#  define OS_CODE  0x02
+#  define F_OPEN(name, mode) \
+     FXSYS_fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
+#endif
+
+#if defined(ATARI) || defined(atarist)
+#  define OS_CODE  0x05
+#endif
+
+#ifdef OS2
+#  define OS_CODE  0x06
+#  if defined(M_I86) && !defined(Z_SOLO)
+#    include <malloc.h>
+#  endif
+#endif
+
+#if defined(MACOS) || defined(TARGET_OS_MAC)
+#  define OS_CODE  0x07
+#  ifndef Z_SOLO
+#    if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
+#      include <unix.h> /* for fdopen */
+#    else
+#      ifndef fdopen
+#        define fdopen(fd,mode) NULL /* No fdopen() */
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef TOPS20
+#  define OS_CODE  0x0a
+#endif
+
+#ifdef WIN32
+#  ifndef __CYGWIN__  /* Cygwin is Unix, not Win32 */
+#    define OS_CODE  0x0b
+#  endif
+#endif
+
+#ifdef __50SERIES /* Prime/PRIMOS */
+#  define OS_CODE  0x0f
+#endif
+
+#if defined(_BEOS_) || defined(RISCOS)
+#  define fdopen(fd,mode) NULL /* No fdopen() */
+#endif
+
+#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
+#  if defined(_WIN32_WCE)
+#    define fdopen(fd,mode) NULL /* No fdopen() */
+#    ifndef _PTRDIFF_T_DEFINED
+       typedef int ptrdiff_t;
+#      define _PTRDIFF_T_DEFINED
+#    endif
+#  else
+#    define fdopen(fd,type)  _fdopen(fd,type)
+#  endif
+#endif
+
+#if defined(__BORLANDC__) && !defined(MSDOS)
+  #pragma warn -8004
+  #pragma warn -8008
+  #pragma warn -8066
+#endif
+
+/* provide prototypes for these when building zlib without LFS */
+#if !defined(_WIN32) && \
+    (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
+    ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
+    ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
+#endif
+
+        /* common defaults */
+
+#ifndef OS_CODE
+#  define OS_CODE  0x03  /* assume Unix */
+#endif
+
+#ifndef F_OPEN
+#  define F_OPEN(name, mode) FXSYS_fopen((name), (mode))
+#endif
+
+         /* functions */
+
+#if defined(pyr) || defined(Z_SOLO)
+#  define NO_MEMCPY
+#endif
+#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
+ /* Use our own functions for small and medium model with MSC <= 5.0.
+  * You may have to use the same strategy for Borland C (untested).
+  * The __SC__ check is for Symantec.
+  */
+#  define NO_MEMCPY
+#endif
+#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
+#  define HAVE_MEMCPY
+#endif
+#ifdef HAVE_MEMCPY
+#  ifdef SMALL_MEDIUM /* MSDOS small or medium model */
+#    define zmemcpy _fmemcpy
+#    define zmemcmp _fmemcmp
+#    define zmemzero(dest, len) _fmemset(dest, 0, len)
+#  else
+#    define zmemcpy FXSYS_memcpy32
+#    define zmemcmp FXSYS_memcmp32
+#    define zmemzero(dest, len) FXSYS_memset32(dest, 0, len)
+#  endif
+#else
+   void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
+   int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
+   void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));
+#endif
+
+/* Diagnostic functions */
+#ifdef DEBUG
+#  include <stdio.h>
+   extern int ZLIB_INTERNAL z_verbose;
+   extern void ZLIB_INTERNAL z_error OF((char *m));
+#  define Assert(cond,msg) {if(!(cond)) z_error(msg);}
+#  define Trace(x) {if (z_verbose>=0) FXSYS_fprintf x ;}
+#  define Tracev(x) {if (z_verbose>0) FXSYS_fprintf x ;}
+#  define Tracevv(x) {if (z_verbose>1) FXSYS_fprintf x ;}
+#  define Tracec(c,x) {if (z_verbose>0 && (c)) FXSYS_fprintf x ;}
+#  define Tracecv(c,x) {if (z_verbose>1 && (c)) FXSYS_fprintf x ;}
+#else
+#  define Assert(cond,msg)
+#  define Trace(x)
+#  define Tracev(x)
+#  define Tracevv(x)
+#  define Tracec(c,x)
+#  define Tracecv(c,x)
+#endif
+
+#ifndef Z_SOLO
+   voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,
+                                    unsigned size));
+   void ZLIB_INTERNAL zcfree  OF((voidpf opaque, voidpf ptr));
+#endif
+
+#define ZALLOC(strm, items, size) \
+           (*((strm)->zalloc))((strm)->opaque, (items), (size))
+#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
+#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
+
+/* Reverse the bytes in a 32-bit value */
+#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
+                    (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
+
+#endif /* ZUTIL_H */
diff --git a/core/src/fxcodec/jbig2/JBig2_ArithDecoder.h b/core/src/fxcodec/jbig2/JBig2_ArithDecoder.h
new file mode 100644
index 0000000..1664257
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_ArithDecoder.h
@@ -0,0 +1,126 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_ARITHMETIC_DECODER_H_

+#define _JBIG2_ARITHMETIC_DECODER_H_

+#include "JBig2_Define.h"

+#include "JBig2_BitStream.h"

+#include "JBig2_ArithQe.h"

+typedef struct {

+    unsigned int MPS;

+    unsigned int I;

+} JBig2ArithCtx;

+class CJBig2_ArithDecoder : public CJBig2_Object

+{

+public:

+

+    CJBig2_ArithDecoder(CJBig2_BitStream *pStream);

+

+    ~CJBig2_ArithDecoder();

+

+    int DECODE(JBig2ArithCtx *pCX);

+private:

+

+    void INITDEC();

+

+    void BYTEIN();

+    unsigned char B;

+    unsigned int C;

+    unsigned int A;

+    unsigned int CT;

+    CJBig2_BitStream *m_pStream;

+};

+inline CJBig2_ArithDecoder::CJBig2_ArithDecoder(CJBig2_BitStream *pStream)

+{

+    m_pStream = pStream;

+    INITDEC();

+}

+inline CJBig2_ArithDecoder::~CJBig2_ArithDecoder()

+{

+}

+inline void CJBig2_ArithDecoder::INITDEC()

+{

+    B = m_pStream->getCurByte_arith();

+    C = (B ^ 0xff) << 16;;

+    BYTEIN();

+    C = C << 7;

+    CT = CT - 7;

+    A = 0x8000;

+}

+inline void CJBig2_ArithDecoder::BYTEIN()

+{

+    unsigned char B1;

+    if(B == 0xff) {

+        B1 = m_pStream->getNextByte_arith();

+        if(B1 > 0x8f) {

+            CT = 8;

+        } else {

+            m_pStream->incByteIdx();

+            B = B1;

+            C = C + 0xfe00 - (B << 9);

+            CT = 7;

+        }

+    } else {

+        m_pStream->incByteIdx();

+        B = m_pStream->getCurByte_arith();

+        C = C + 0xff00 - (B << 8);

+        CT = 8;

+    }

+}

+inline int CJBig2_ArithDecoder::DECODE(JBig2ArithCtx *pCX)

+{

+    int D;

+    const JBig2ArithQe * qe = &QeTable[pCX->I];

+    A = A - qe->Qe;

+    if((C >> 16) < A) {

+        if(A & 0x8000) {

+            D = pCX->MPS;

+        } else {

+            if(A < qe->Qe) {

+                D = 1 - pCX->MPS;

+                if(qe->nSwitch == 1) {

+                    pCX->MPS = 1 - pCX->MPS;

+                }

+                pCX->I = qe->NLPS;

+            } else {

+                D = pCX->MPS;

+                pCX->I = qe->NMPS;

+            }

+            do {

+                if (CT == 0) {

+                    BYTEIN();

+                }

+                A <<= 1;

+                C <<= 1;

+                CT--;

+            } while ((A & 0x8000) == 0);

+        }

+    } else {

+        C -= A << 16;

+        if(A < qe->Qe) {

+            A = qe->Qe;

+            D = pCX->MPS;

+            pCX->I = qe->NMPS;

+        } else {

+            A = qe->Qe;

+            D = 1 - pCX->MPS;

+            if(qe->nSwitch == 1) {

+                pCX->MPS = 1 - pCX->MPS;

+            }

+            pCX->I = qe->NLPS;

+        }

+        do {

+            if (CT == 0) {

+                BYTEIN();

+            }

+            A <<= 1;

+            C <<= 1;

+            CT--;

+        } while ((A & 0x8000) == 0);

+    }

+    return D;

+}

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp
new file mode 100644
index 0000000..bb4e0bb
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp
@@ -0,0 +1,105 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "JBig2_ArithIntDecoder.h"

+CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder()

+{

+    IAx = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), 512);

+    JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);

+}

+CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder()

+{

+    m_pModule->JBig2_Free(IAx);

+}

+int CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)

+{

+    int PREV, V;

+    int S, D;

+    int nNeedBits, nTemp, i;

+    PREV = 1;

+    S = pArithDecoder->DECODE(IAx + PREV);

+    PREV = (PREV << 1) | S;

+    D = pArithDecoder->DECODE(IAx + PREV);

+    PREV = (PREV << 1) | D;

+    if(D) {

+        D = pArithDecoder->DECODE(IAx + PREV);

+        PREV = (PREV << 1) | D;

+        if(D) {

+            D = pArithDecoder->DECODE(IAx + PREV);

+            PREV = (PREV << 1) | D;

+            if(D) {

+                D = pArithDecoder->DECODE(IAx + PREV);

+                PREV = (PREV << 1) | D;

+                if(D) {

+                    D = pArithDecoder->DECODE(IAx + PREV);

+                    PREV = (PREV << 1) | D;

+                    if(D) {

+                        nNeedBits = 32;

+                        V = 4436;

+                    } else {

+                        nNeedBits = 12;

+                        V = 340;

+                    }

+                } else {

+                    nNeedBits = 8;

+                    V = 84;

+                }

+            } else {

+                nNeedBits = 6;

+                V = 20;

+            }

+        } else {

+            nNeedBits = 4;

+            V = 4;

+        }

+    } else {

+        nNeedBits = 2;

+        V = 0;

+    }

+    nTemp = 0;

+    for(i = 0; i < nNeedBits; i++) {

+        D = pArithDecoder->DECODE(IAx + PREV);

+        if(PREV < 256) {

+            PREV = (PREV << 1) | D;

+        } else {

+            PREV = (((PREV << 1) | D) & 511) | 256;

+        }

+        nTemp = (nTemp << 1) | D;

+    }

+    V += nTemp;

+    if(S == 1 && V > 0) {

+        V = -V;

+    }

+    *nResult = V;

+    if(S == 1 && V == 0) {

+        return JBIG2_OOB;

+    }

+    return 0;

+}

+CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA)

+{

+    SBSYMCODELEN = SBSYMCODELENA;

+    IAID = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), (1 << SBSYMCODELEN));

+    JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));

+}

+CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder()

+{

+    m_pModule->JBig2_Free(IAID);

+}

+int CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)

+{

+    int PREV;

+    int D;

+    int i;

+    PREV = 1;

+    for(i = 0; i < SBSYMCODELEN; i++) {

+        D = pArithDecoder->DECODE(IAID + PREV);

+        PREV = (PREV << 1) | D;

+    }

+    PREV = PREV - (1 << SBSYMCODELEN);

+    *nResult = PREV;

+    return 0;

+}

diff --git a/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h
new file mode 100644
index 0000000..ad4656f
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h
@@ -0,0 +1,39 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_ARITH_INT_DECODER_H_

+#define _JBIG2_ARITH_INT_DECODER_H_

+#include "JBig2_Module.h"

+#include "JBig2_ArithDecoder.h"

+class CJBig2_ArithIntDecoder : public CJBig2_Object

+{

+public:

+

+    CJBig2_ArithIntDecoder();

+

+    ~CJBig2_ArithIntDecoder();

+

+    int decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult);

+private:

+

+    JBig2ArithCtx *IAx;

+};

+class CJBig2_ArithIaidDecoder : public CJBig2_Object

+{

+public:

+

+    CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA);

+

+    ~CJBig2_ArithIaidDecoder();

+

+    int decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult);

+private:

+

+    JBig2ArithCtx *IAID;

+

+    unsigned char SBSYMCODELEN;

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_ArithQe.h b/core/src/fxcodec/jbig2/JBig2_ArithQe.h
new file mode 100644
index 0000000..17bc18a
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_ArithQe.h
@@ -0,0 +1,64 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_ARITH_QE_H_

+#define _JBIG2_ARITH_QE_H_

+typedef struct {

+    unsigned int Qe;

+    unsigned int NMPS;

+    unsigned int NLPS;

+    unsigned int nSwitch;

+} JBig2ArithQe;

+const JBig2ArithQe QeTable[] = {

+    { 0x5601,  1,  1, 1 },

+    { 0x3401,  2,  6, 0 },

+    { 0x1801,  3,  9, 0 },

+    { 0x0AC1,  4, 12, 0 },

+    { 0x0521,  5, 29, 0 },

+    { 0x0221, 38, 33, 0 },

+    { 0x5601,  7,  6, 1 },

+    { 0x5401,  8, 14, 0 },

+    { 0x4801,  9, 14, 0 },

+    { 0x3801, 10, 14, 0 },

+    { 0x3001, 11, 17, 0 },

+    { 0x2401, 12, 18, 0 },

+    { 0x1C01, 13, 20, 0 },

+    { 0x1601, 29, 21, 0 },

+    { 0x5601, 15, 14, 1 },

+    { 0x5401, 16, 14, 0 },

+    { 0x5101, 17, 15, 0 },

+    { 0x4801, 18, 16, 0 },

+    { 0x3801, 19, 17, 0 },

+    { 0x3401, 20, 18, 0 },

+    { 0x3001, 21, 19, 0 },

+    { 0x2801, 22, 19, 0 },

+    { 0x2401, 23, 20, 0 },

+    { 0x2201, 24, 21, 0 },

+    { 0x1C01, 25, 22, 0 },

+    { 0x1801, 26, 23, 0 },

+    { 0x1601, 27, 24, 0 },

+    { 0x1401, 28, 25, 0 },

+    { 0x1201, 29, 26, 0 },

+    { 0x1101, 30, 27, 0 },

+    { 0x0AC1, 31, 28, 0 },

+    { 0x09C1, 32, 29, 0 },

+    { 0x08A1, 33, 30, 0 },

+    { 0x0521, 34, 31, 0 },

+    { 0x0441, 35, 32, 0 },

+    { 0x02A1, 36, 33, 0 },

+    { 0x0221, 37, 34, 0 },

+    { 0x0141, 38, 35, 0 },

+    { 0x0111, 39, 36, 0 },

+    { 0x0085, 40, 37, 0 },

+    { 0x0049, 41, 38, 0 },

+    { 0x0025, 42, 39, 0 },

+    { 0x0015, 43, 40, 0 },

+    { 0x0009, 44, 41, 0 },

+    { 0x0005, 45, 42, 0 },

+    { 0x0001, 45, 43, 0 },

+    { 0x5601, 46, 46, 0 }

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_BitStream.h b/core/src/fxcodec/jbig2/JBig2_BitStream.h
new file mode 100644
index 0000000..8ed473a
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_BitStream.h
@@ -0,0 +1,316 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_BIT_STREAM_H_

+#define _JBIG2_BIT_STREAM_H_

+#include "JBig2_Define.h"

+class CJBig2_BitStream : public CJBig2_Object

+{

+public:

+

+    CJBig2_BitStream(FX_BYTE *pBuffer, FX_DWORD dwLength);

+

+    CJBig2_BitStream(CJBig2_BitStream &bs);

+

+    ~CJBig2_BitStream();

+

+    FX_INT32 readNBits(FX_DWORD nBits, FX_DWORD *dwResult);

+

+    FX_INT32 readNBits(FX_DWORD nBits, FX_INT32 *nResult);

+

+    FX_INT32 read1Bit(FX_DWORD *dwResult);

+

+    FX_INT32 read1Bit(FX_BOOL  *bResult);

+

+    FX_INT32 read1Byte(FX_BYTE *cResult);

+

+    FX_INT32 readInteger(FX_DWORD *dwResult);

+

+    FX_INT32 readShortInteger(FX_WORD *wResult);

+

+    void alignByte();

+

+    void align4Byte();

+

+    FX_BYTE getAt(FX_DWORD dwOffset);

+

+    FX_BYTE getCurByte();

+

+    FX_BYTE getNextByte();

+

+    FX_INT32 incByteIdx();

+

+    FX_BYTE getCurByte_arith();

+

+    FX_BYTE getNextByte_arith();

+

+    FX_DWORD getOffset();

+

+    void setOffset(FX_DWORD dwOffset);

+

+    FX_DWORD getBitPos();

+

+    void setBitPos(FX_DWORD dwBitPos);

+

+    FX_BYTE *getBuf();

+

+    FX_DWORD getLength()

+    {

+        return m_dwLength;

+    }

+

+    FX_BYTE *getPointer();

+

+    void offset(FX_DWORD dwOffset);

+

+    FX_DWORD getByteLeft();

+private:

+

+    FX_BYTE *m_pBuf;

+

+    FX_DWORD m_dwLength;

+

+    FX_DWORD m_dwByteIdx;

+

+    FX_DWORD m_dwBitIdx;

+};

+inline CJBig2_BitStream::CJBig2_BitStream(FX_BYTE *pBuffer, FX_DWORD dwLength)

+{

+    m_pBuf = pBuffer;

+    m_dwLength = dwLength;

+    m_dwByteIdx = 0;

+    m_dwBitIdx  = 0;

+    if (m_dwLength > 256 * 1024 * 1024) {

+        m_dwLength = 0;

+        m_pBuf = NULL;

+    }

+}

+inline CJBig2_BitStream::CJBig2_BitStream(CJBig2_BitStream &bs)

+{

+    m_pBuf = bs.m_pBuf;

+    m_dwLength = bs.m_dwLength;

+    m_dwByteIdx = bs.m_dwByteIdx;

+    m_dwBitIdx = bs.m_dwBitIdx;

+}

+inline CJBig2_BitStream::~CJBig2_BitStream()

+{

+}

+inline FX_INT32 CJBig2_BitStream::readNBits(FX_DWORD dwBits, FX_DWORD *dwResult)

+{

+    FX_DWORD dwTemp = (m_dwByteIdx << 3) + m_dwBitIdx;

+    if(dwTemp <= (m_dwLength << 3)) {

+        *dwResult = 0;

+        if(dwTemp + dwBits <= (m_dwLength << 3)) {

+            dwTemp = dwBits;

+        } else {

+            dwTemp = (m_dwLength << 3) - dwTemp;

+        }

+        while(dwTemp > 0) {

+            *dwResult = (*dwResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);

+            if(m_dwBitIdx == 7) {

+                m_dwByteIdx ++;

+                m_dwBitIdx = 0;

+            } else {

+                m_dwBitIdx ++;

+            }

+            dwTemp --;

+        }

+        return 0;

+    } else {

+        return -1;

+    }

+}

+inline FX_INT32 CJBig2_BitStream::readNBits(FX_DWORD dwBits, FX_INT32 *nResult)

+{

+    FX_DWORD dwTemp = (m_dwByteIdx << 3) + m_dwBitIdx;

+    if(dwTemp <= (m_dwLength << 3)) {

+        *nResult = 0;

+        if(dwTemp + dwBits <= (m_dwLength << 3)) {

+            dwTemp = dwBits;

+        } else {

+            dwTemp = (m_dwLength << 3) - dwTemp;

+        }

+        while(dwTemp > 0) {

+            *nResult = (*nResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);

+            if(m_dwBitIdx == 7) {

+                m_dwByteIdx ++;

+                m_dwBitIdx = 0;

+            } else {

+                m_dwBitIdx ++;

+            }

+            dwTemp --;

+        }

+        return 0;

+    } else {

+        return -1;

+    }

+}

+

+inline FX_INT32 CJBig2_BitStream::read1Bit(FX_DWORD *dwResult)

+{

+    if(m_dwByteIdx < m_dwLength) {

+        *dwResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;

+        if(m_dwBitIdx == 7) {

+            m_dwByteIdx ++;

+            m_dwBitIdx = 0;

+        } else {

+            m_dwBitIdx ++;

+        }

+        return 0;

+    } else {

+        return -1;

+    }

+}

+

+inline FX_INT32 CJBig2_BitStream::read1Bit(FX_BOOL *bResult)

+{

+    if(m_dwByteIdx < m_dwLength) {

+        *bResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;

+        if(m_dwBitIdx == 7) {

+            m_dwByteIdx ++;

+            m_dwBitIdx = 0;

+        } else {

+            m_dwBitIdx ++;

+        }

+        return 0;

+    } else {

+        return -1;

+    }

+}

+inline FX_INT32 CJBig2_BitStream::read1Byte(FX_BYTE *cResult)

+{

+    if(m_dwByteIdx < m_dwLength) {

+        *cResult = m_pBuf[m_dwByteIdx];

+        m_dwByteIdx ++;

+        return 0;

+    } else {

+        return -1;

+    }

+}

+

+inline FX_INT32 CJBig2_BitStream::readInteger(FX_DWORD *dwResult)

+{

+    if(m_dwByteIdx + 3 < m_dwLength) {

+        *dwResult = (m_pBuf[m_dwByteIdx] << 24) | (m_pBuf[m_dwByteIdx + 1] << 16)

+                    | (m_pBuf[m_dwByteIdx + 2] << 8) | m_pBuf[m_dwByteIdx + 3];

+        m_dwByteIdx += 4;

+        return 0;

+    } else {

+        return -1;

+    }

+}

+

+inline FX_INT32 CJBig2_BitStream::readShortInteger(FX_WORD *dwResult)

+{

+    if(m_dwByteIdx + 1 < m_dwLength) {

+        *dwResult = (m_pBuf[m_dwByteIdx] << 8) | m_pBuf[m_dwByteIdx + 1];

+        m_dwByteIdx += 2;

+        return 0;

+    } else {

+        return -1;

+    }

+}

+inline void CJBig2_BitStream::alignByte()

+{

+    if(m_dwBitIdx != 0) {

+        m_dwByteIdx ++;

+        m_dwBitIdx = 0;

+    }

+}

+inline void CJBig2_BitStream::align4Byte()

+{

+    if(m_dwBitIdx != 0) {

+        m_dwByteIdx ++;

+        m_dwBitIdx = 0;

+    }

+    m_dwByteIdx = (m_dwByteIdx + 3) & -4;

+}

+inline FX_BYTE CJBig2_BitStream::getAt(FX_DWORD dwOffset)

+{

+    if(dwOffset < m_dwLength) {

+        return m_pBuf[dwOffset];

+    } else {

+        return 0;

+    }

+}

+inline FX_BYTE CJBig2_BitStream::getCurByte()

+{

+    if(m_dwByteIdx < m_dwLength) {

+        return m_pBuf[m_dwByteIdx];

+    } else {

+        return 0;

+    }

+}

+inline FX_BYTE CJBig2_BitStream::getNextByte()

+{

+    if(m_dwByteIdx + 1 < m_dwLength) {

+        return m_pBuf[m_dwByteIdx + 1];

+    } else {

+        return 0;

+    }

+}

+inline FX_INT32 CJBig2_BitStream::incByteIdx()

+{

+    if(m_dwByteIdx < m_dwLength) {

+        m_dwByteIdx ++;

+        return 0;

+    } else {

+        return -1;

+    }

+}

+inline FX_BYTE CJBig2_BitStream::getCurByte_arith()

+{

+    if(m_dwByteIdx < m_dwLength) {

+        return m_pBuf[m_dwByteIdx];

+    } else {

+        return 0xff;

+    }

+}

+inline FX_BYTE CJBig2_BitStream::getNextByte_arith()

+{

+    if(m_dwByteIdx + 1 < m_dwLength) {

+        return m_pBuf[m_dwByteIdx + 1];

+    } else {

+        return 0xff;

+    }

+}

+inline FX_DWORD CJBig2_BitStream::getOffset()

+{

+    return m_dwByteIdx;

+}

+inline void CJBig2_BitStream::setOffset(FX_DWORD dwOffset)

+{

+    if (dwOffset > m_dwLength) {

+        dwOffset = m_dwLength;

+    }

+    m_dwByteIdx = dwOffset;

+}

+inline FX_DWORD CJBig2_BitStream::getBitPos()

+{

+    return (m_dwByteIdx << 3) + m_dwBitIdx;

+}

+inline void CJBig2_BitStream::setBitPos(FX_DWORD dwBitPos)

+{

+    m_dwByteIdx = dwBitPos >> 3;

+    m_dwBitIdx = dwBitPos & 7;

+}

+inline FX_BYTE *CJBig2_BitStream::getBuf()

+{

+    return m_pBuf;

+}

+inline FX_BYTE *CJBig2_BitStream::getPointer()

+{

+    return m_pBuf + m_dwByteIdx;

+}

+inline void CJBig2_BitStream::offset(FX_DWORD dwOffset)

+{

+    m_dwByteIdx += dwOffset;

+}

+inline FX_DWORD CJBig2_BitStream::getByteLeft()

+{

+    return m_dwLength - m_dwByteIdx;

+}

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_Context.cpp b/core/src/fxcodec/jbig2/JBig2_Context.cpp
new file mode 100644
index 0000000..856c0c3
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Context.cpp
@@ -0,0 +1,1812 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "JBig2_Context.h"

+void OutputBitmap(CJBig2_Image* pImage)

+{

+    if(!pImage) {

+        return;

+    }

+}

+CJBig2_Context *CJBig2_Context::CreateContext(CJBig2_Module *pModule, FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,

+        FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause)

+{

+    return new(pModule) CJBig2_Context(pGlobalData, dwGlobalLength, pData, dwLength, nStreamType, pPause);

+}

+void CJBig2_Context::DestroyContext(CJBig2_Context *pContext)

+{

+    if(pContext) {

+        delete pContext;

+    }

+}

+CJBig2_Context::CJBig2_Context(FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,

+                               FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause)

+{

+    if(pGlobalData && (dwGlobalLength > 0)) {

+        JBIG2_ALLOC(m_pGlobalContext, CJBig2_Context(NULL, 0, pGlobalData, dwGlobalLength,

+                    JBIG2_EMBED_STREAM, pPause));

+    } else {

+        m_pGlobalContext = NULL;

+    }

+    JBIG2_ALLOC(m_pStream, CJBig2_BitStream(pData, dwLength));

+    m_nStreamType = nStreamType;

+    m_nState = JBIG2_OUT_OF_PAGE;

+    JBIG2_ALLOC(m_pSegmentList, CJBig2_List<CJBig2_Segment>);

+    JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(1));

+    m_pPage = NULL;

+    m_bBufSpecified = FALSE;

+    m_pPause = pPause;

+    m_nSegmentDecoded = 0;

+    m_PauseStep = 10;

+    m_pArithDecoder = NULL;

+    m_pGRD = NULL;

+    m_gbContext = NULL;

+    m_pSegment = NULL;

+    m_dwOffset = 0;

+    m_ProcessiveStatus = FXCODEC_STATUS_FRAME_READY;

+}

+CJBig2_Context::~CJBig2_Context()

+{

+    if(m_pArithDecoder) {

+        delete m_pArithDecoder;

+    }

+    m_pArithDecoder = NULL;

+    if(m_pGRD) {

+        delete m_pGRD;

+    }

+    m_pGRD = NULL;

+    if(m_gbContext) {

+        delete m_gbContext;

+    }

+    m_gbContext = NULL;

+    if(m_pGlobalContext) {

+        delete m_pGlobalContext;

+    }

+    m_pGlobalContext = NULL;

+    if(m_pPageInfoList) {

+        delete m_pPageInfoList;

+    }

+    m_pPageInfoList = NULL;

+    if(m_bBufSpecified && m_pPage) {

+        delete m_pPage;

+    }

+    m_pPage = NULL;

+    if(m_pStream) {

+        delete m_pStream;

+    }

+    m_pStream = NULL;

+    if(m_pSegmentList) {

+        delete m_pSegmentList;

+    }

+    m_pSegmentList = NULL;

+}

+FX_INT32 CJBig2_Context::decodeFile(IFX_Pause* pPause)

+{

+    FX_BYTE cFlags;

+    FX_DWORD dwTemp;

+    const FX_BYTE fileID[] = {0x97, 0x4A, 0x42, 0x32, 0x0D, 0x0A, 0x1A, 0x0A};

+    FX_INT32 nRet;

+    if(m_pStream->getByteLeft() < 8) {

+        m_pModule->JBig2_Error("file header too short.");

+        nRet = JBIG2_ERROR_TOO_SHORT;

+        goto failed;

+    }

+    if(JBIG2_memcmp(m_pStream->getPointer(), fileID, 8) != 0) {

+        m_pModule->JBig2_Error("not jbig2 file");

+        nRet = JBIG2_ERROR_FILE_FORMAT;

+        goto failed;

+    }

+    m_pStream->offset(8);

+    if(m_pStream->read1Byte(&cFlags) != 0) {

+        m_pModule->JBig2_Error("file header too short.");

+        nRet = JBIG2_ERROR_TOO_SHORT;

+        goto failed;

+    }

+    if(!(cFlags & 0x02)) {

+        if(m_pStream->readInteger(&dwTemp) != 0) {

+            m_pModule->JBig2_Error("file header too short.");

+            nRet = JBIG2_ERROR_TOO_SHORT;

+            goto failed;

+        }

+        if(dwTemp > 0) {

+            delete m_pPageInfoList;

+            JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(dwTemp));

+        }

+    }

+    if(cFlags & 0x01) {

+        m_nStreamType = JBIG2_SQUENTIAL_STREAM;

+        return decode_SquentialOrgnazation(pPause);

+    } else {

+        m_nStreamType = JBIG2_RANDOM_STREAM;

+        return decode_RandomOrgnazation_FirstPage(pPause);

+    }

+failed:

+    return nRet;

+}

+FX_INT32 CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause)

+{

+    FX_INT32 nRet;

+    if(m_pStream->getByteLeft() > 0) {

+        while(m_pStream->getByteLeft() >= JBIG2_MIN_SEGMENT_SIZE) {

+            if(m_pSegment == NULL) {

+                JBIG2_ALLOC(m_pSegment, CJBig2_Segment());

+                nRet = parseSegmentHeader(m_pSegment);

+                if(nRet != JBIG2_SUCCESS) {

+                    delete m_pSegment;

+                    m_pSegment = NULL;

+                    return nRet;

+                }

+                m_dwOffset = m_pStream->getOffset();

+            }

+            nRet = parseSegmentData(m_pSegment, pPause);

+            if(m_ProcessiveStatus  == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+                m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+                m_PauseStep = 2;

+                return JBIG2_SUCCESS;

+            }

+            if((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) {

+                delete m_pSegment;

+                m_pSegment = NULL;

+                break;

+            } else if(nRet != JBIG2_SUCCESS) {

+                delete m_pSegment;

+                m_pSegment = NULL;

+                return nRet;

+            }

+            m_pSegmentList->addItem(m_pSegment);

+            if(m_pSegment->m_dwData_length != 0xffffffff) {

+                m_dwOffset = m_dwOffset + m_pSegment->m_dwData_length;

+                m_pStream->setOffset(m_dwOffset);

+            } else {

+                m_pStream->offset(4);

+            }

+            OutputBitmap(m_pPage);

+            m_pSegment = NULL;

+            if(m_pStream->getByteLeft() > 0 && m_pPage && pPause && pPause->NeedToPauseNow()) {

+                m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+                m_PauseStep = 2;

+                return JBIG2_SUCCESS;

+            }

+        }

+    } else {

+        return JBIG2_END_OF_FILE;

+    }

+    return JBIG2_SUCCESS;

+}

+FX_INT32 CJBig2_Context::decode_EmbedOrgnazation(IFX_Pause* pPause)

+{

+    return decode_SquentialOrgnazation(pPause);

+}

+FX_INT32 CJBig2_Context::decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause)

+{

+    CJBig2_Segment *pSegment;

+    FX_INT32 nRet;

+    while(m_pStream->getByteLeft() > JBIG2_MIN_SEGMENT_SIZE) {

+        JBIG2_ALLOC(pSegment, CJBig2_Segment());

+        nRet = parseSegmentHeader(pSegment);

+        if(nRet != JBIG2_SUCCESS) {

+            delete pSegment;

+            return nRet;

+        } else if(pSegment->m_cFlags.s.type == 51) {

+            delete pSegment;

+            break;

+        }

+        m_pSegmentList->addItem(pSegment);

+        if(pPause && m_pPause && pPause->NeedToPauseNow()) {

+            m_PauseStep = 3;

+            m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+            return JBIG2_SUCCESS;

+        }

+    }

+    m_nSegmentDecoded = 0;

+    return decode_RandomOrgnazation(pPause);

+}

+FX_INT32 CJBig2_Context::decode_RandomOrgnazation(IFX_Pause* pPause)

+{

+    FX_INT32 nRet;

+    for(; m_nSegmentDecoded < m_pSegmentList->getLength(); m_nSegmentDecoded++) {

+        nRet = parseSegmentData(m_pSegmentList->getAt(m_nSegmentDecoded), pPause);

+        if((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) {

+            break;

+        } else if(nRet != JBIG2_SUCCESS) {

+            return nRet;

+        }

+        if(m_pPage && pPause && pPause->NeedToPauseNow()) {

+            m_PauseStep = 4;

+            m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+            return JBIG2_SUCCESS;

+        }

+    }

+    return JBIG2_SUCCESS;

+}

+FX_INT32 CJBig2_Context::getFirstPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause)

+{

+    FX_INT32 nRet = 0;

+    if(m_pGlobalContext) {

+        nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause);

+        if(nRet != JBIG2_SUCCESS) {

+            m_ProcessiveStatus = FXCODEC_STATUS_ERROR;

+            return nRet;

+        }

+    }

+    m_bFirstPage = TRUE;

+    m_PauseStep = 0;

+    if(m_pPage) {

+        delete m_pPage;

+    }

+    JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf));

+    m_bBufSpecified = TRUE;

+    if(m_pPage && pPause && pPause->NeedToPauseNow()) {

+        m_PauseStep = 1;

+        m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+        return nRet;

+    }

+    int ret = Continue(pPause);

+    return ret;

+}

+FX_INT32 CJBig2_Context::Continue(IFX_Pause* pPause)

+{

+    m_ProcessiveStatus = FXCODEC_STATUS_DECODE_READY;

+    FX_INT32 nRet;

+    if(m_PauseStep <= 1) {

+        switch(m_nStreamType) {

+            case JBIG2_FILE_STREAM:

+                nRet = decodeFile(pPause);

+                break;

+            case JBIG2_SQUENTIAL_STREAM:

+                nRet = decode_SquentialOrgnazation(pPause);

+                break;

+            case JBIG2_RANDOM_STREAM:

+                if(m_bFirstPage) {

+                    nRet = decode_RandomOrgnazation_FirstPage(pPause);

+                } else {

+                    nRet = decode_RandomOrgnazation(pPause);

+                }

+                break;

+            case JBIG2_EMBED_STREAM:

+                nRet = decode_EmbedOrgnazation(pPause);

+                break;

+            default:

+                m_ProcessiveStatus = FXCODEC_STATUS_ERROR;

+                return JBIG2_ERROR_STREAM_TYPE;

+        }

+    } else if(m_PauseStep == 2) {

+        nRet = decode_SquentialOrgnazation(pPause);

+    } else if(m_PauseStep == 3) {

+        nRet = decode_RandomOrgnazation_FirstPage(pPause);

+    } else if(m_PauseStep == 4) {

+        nRet = decode_RandomOrgnazation(pPause);

+    } else if(m_PauseStep == 5) {

+        m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+        return JBIG2_SUCCESS;

+    }

+    if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+        return nRet;

+    }

+    m_PauseStep = 5;

+    if(!m_bBufSpecified && nRet == JBIG2_SUCCESS) {

+        m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+        return JBIG2_SUCCESS;

+    }

+    if(nRet == JBIG2_SUCCESS) {

+        m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+    } else {

+        m_ProcessiveStatus = FXCODEC_STATUS_ERROR;

+    }

+    return nRet;

+}

+FX_INT32 CJBig2_Context::getNextPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause)

+{

+    FX_INT32 nRet = JBIG2_ERROR_STREAM_TYPE;

+    m_bFirstPage = FALSE;

+    m_PauseStep = 0;

+    if(m_pPage) {

+        delete m_pPage;

+    }

+    JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf));

+    m_bBufSpecified = TRUE;

+    if(m_pPage && pPause && pPause->NeedToPauseNow()) {

+        m_PauseStep = 1;

+        m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+        return nRet;

+    }

+    return Continue(pPause);

+    switch(m_nStreamType) {

+        case JBIG2_FILE_STREAM:

+            nRet = decodeFile(pPause);

+            break;

+        case JBIG2_SQUENTIAL_STREAM:

+            nRet = decode_SquentialOrgnazation(pPause);

+            break;

+        case JBIG2_RANDOM_STREAM:

+            nRet = decode_RandomOrgnazation(pPause);

+            break;

+        case JBIG2_EMBED_STREAM:

+            nRet = decode_EmbedOrgnazation(pPause);

+            break;

+        default:

+            return JBIG2_ERROR_STREAM_TYPE;

+    }

+    return nRet;

+}

+FX_INT32 CJBig2_Context::getFirstPage(CJBig2_Image **image, IFX_Pause* pPause)

+{

+    FX_INT32 nRet;

+    m_bFirstPage = TRUE;

+    m_PauseStep = 0;

+    if(m_pGlobalContext) {

+        nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause);

+        if(nRet != JBIG2_SUCCESS) {

+            return nRet;

+        }

+    }

+    m_bBufSpecified = FALSE;

+    return Continue(pPause);

+}

+FX_INT32 CJBig2_Context::getNextPage(CJBig2_Image **image, IFX_Pause* pPause)

+{

+    FX_INT32 nRet;

+    m_bBufSpecified = FALSE;

+    m_bFirstPage = FALSE;

+    m_PauseStep = 0;

+    switch(m_nStreamType) {

+        case JBIG2_FILE_STREAM:

+            nRet = decodeFile(pPause);

+            break;

+        case JBIG2_SQUENTIAL_STREAM:

+            nRet = decode_SquentialOrgnazation(pPause);

+            break;

+        case JBIG2_RANDOM_STREAM:

+            nRet = decode_RandomOrgnazation(pPause);

+            break;

+        case JBIG2_EMBED_STREAM:

+            nRet = decode_EmbedOrgnazation(pPause);

+            break;

+        default:

+            return JBIG2_ERROR_STREAM_TYPE;

+    }

+    if(nRet == JBIG2_SUCCESS) {

+        *image = m_pPage;

+        m_pPage = NULL;

+        return JBIG2_SUCCESS;

+    }

+    return nRet;

+}

+CJBig2_Segment *CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber)

+{

+    CJBig2_Segment *pSeg;

+    FX_INT32 i;

+    if(m_pGlobalContext) {

+        pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber);

+        if(pSeg) {

+            return pSeg;

+        }

+    }

+    for(i = 0; i < m_pSegmentList->getLength(); i++) {

+        pSeg = m_pSegmentList->getAt(i);

+        if(pSeg->m_dwNumber == dwNumber) {

+            return pSeg;

+        }

+    }

+    return NULL;

+}

+CJBig2_Segment *CJBig2_Context::findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment,

+        FX_BYTE cType, FX_INT32 nIndex)

+{

+    CJBig2_Segment *pSeg;

+    FX_INT32 i, count;

+    count = 0;

+    for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {

+        pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);

+        if(pSeg && pSeg->m_cFlags.s.type == cType) {

+            if(count == nIndex) {

+                return pSeg;

+            } else {

+                count ++;

+            }

+        }

+    }

+    return NULL;

+}

+FX_INT32 CJBig2_Context::parseSegmentHeader(CJBig2_Segment *pSegment)

+{

+    FX_BYTE  cSSize, cPSize;

+    FX_BYTE cTemp;

+    FX_WORD wTemp;

+    FX_DWORD dwTemp;

+    if((m_pStream->readInteger(&pSegment->m_dwNumber) != 0)

+            || (m_pStream->read1Byte(&pSegment->m_cFlags.c) != 0)) {

+        goto failed;

+    }

+    cTemp = m_pStream->getCurByte();

+    if((cTemp >> 5) == 7) {

+        if(m_pStream->readInteger((FX_DWORD*)&pSegment->m_nReferred_to_segment_count) != 0) {

+            goto failed;

+        }

+        pSegment->m_nReferred_to_segment_count &= 0x1fffffff;

+        if (pSegment->m_nReferred_to_segment_count > JBIG2_MAX_REFERRED_SEGMENT_COUNT) {

+            m_pModule->JBig2_Error("Too many referred segments.");

+            return JBIG2_ERROR_LIMIT;

+        }

+        dwTemp = 5 + 4 + (pSegment->m_nReferred_to_segment_count + 1) / 8;

+    } else {

+        if(m_pStream->read1Byte(&cTemp) != 0) {

+            goto failed;

+        }

+        pSegment->m_nReferred_to_segment_count = cTemp >> 5;

+        dwTemp = 5 + 1;

+    }

+    cSSize = pSegment->m_dwNumber > 65536 ? 4 : pSegment->m_dwNumber > 256 ? 2 : 1;

+    cPSize = pSegment->m_cFlags.s.page_association_size ? 4 : 1;

+    if(pSegment->m_nReferred_to_segment_count) {

+        pSegment->m_pReferred_to_segment_numbers = (FX_DWORD*)m_pModule->JBig2_Malloc2(

+                    sizeof(FX_DWORD), pSegment->m_nReferred_to_segment_count);

+        for(FX_INT32 i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {

+            switch(cSSize) {

+                case 1:

+                    if(m_pStream->read1Byte(&cTemp) != 0) {

+                        goto failed;

+                    }

+                    pSegment->m_pReferred_to_segment_numbers[i] = cTemp;

+                    break;

+                case 2:

+                    if(m_pStream->readShortInteger(&wTemp) != 0) {

+                        goto failed;

+                    }

+                    pSegment->m_pReferred_to_segment_numbers[i] = wTemp;

+                    break;

+                case 4:

+                    if(m_pStream->readInteger(&dwTemp) != 0) {

+                        goto failed;

+                    }

+                    pSegment->m_pReferred_to_segment_numbers[i] = dwTemp;

+                    break;

+            }

+            if (pSegment->m_pReferred_to_segment_numbers[i] >= pSegment->m_dwNumber) {

+                m_pModule->JBig2_Error("The referred segment number is greater than this segment number.");

+                goto failed;

+            }

+        }

+    }

+    if(cPSize == 1) {

+        if(m_pStream->read1Byte(&cTemp) != 0) {

+            goto failed;

+        }

+        pSegment->m_dwPage_association = cTemp;

+    } else {

+        if(m_pStream->readInteger(&pSegment->m_dwPage_association) != 0) {

+            goto failed;

+        }

+    }

+    if(m_pStream->readInteger(&pSegment->m_dwData_length) != 0) {

+        goto failed;

+    }

+    pSegment->m_pData = m_pStream->getPointer();

+    pSegment->m_State = JBIG2_SEGMENT_DATA_UNPARSED;

+    return JBIG2_SUCCESS;

+failed:

+    m_pModule->JBig2_Error("header too short.");

+    return JBIG2_ERROR_TOO_SHORT;

+}

+FX_INT32 CJBig2_Context::parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause)

+{

+    FX_INT32 ret = ProcessiveParseSegmentData(pSegment, pPause);

+    while(m_ProcessiveStatus  == FXCODEC_STATUS_DECODE_TOBECONTINUE && m_pStream->getByteLeft() > 0) {

+        ret = ProcessiveParseSegmentData(pSegment, pPause);

+    }

+    return ret;

+}

+FX_INT32 CJBig2_Context::ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause)

+{

+    switch(pSegment->m_cFlags.s.type) {

+        case 0:

+            return parseSymbolDict(pSegment, pPause);

+        case 4:

+        case 6:

+        case 7:

+            if(m_nState == JBIG2_OUT_OF_PAGE) {

+                goto failed2;

+            } else {

+                return parseTextRegion(pSegment);

+            }

+        case 16:

+            return parsePatternDict(pSegment, pPause);

+        case 20:

+        case 22:

+        case 23:

+            if(m_nState == JBIG2_OUT_OF_PAGE) {

+                goto failed2;

+            } else {

+                return parseHalftoneRegion(pSegment, pPause);

+            }

+        case 36:

+        case 38:

+        case 39:

+            if(m_nState == JBIG2_OUT_OF_PAGE) {

+                goto failed2;

+            } else {

+                return parseGenericRegion(pSegment, pPause);

+            }

+        case 40:

+        case 42:

+        case 43:

+            if(m_nState == JBIG2_OUT_OF_PAGE) {

+                goto failed2;

+            } else {

+                return parseGenericRefinementRegion(pSegment);

+            }

+        case 48: {

+                FX_WORD wTemp;

+                JBig2PageInfo *pPageInfo;

+                JBIG2_ALLOC(pPageInfo, JBig2PageInfo);

+                if((m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0)

+                        || (m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0)

+                        || (m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0)

+                        || (m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0)

+                        || (m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0)

+                        || (m_pStream->readShortInteger(&wTemp) != 0)) {

+                    delete pPageInfo;

+                    goto failed1;

+                }

+                pPageInfo->m_bIsStriped = ((wTemp >> 15) & 1) ? 1 : 0;

+                pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff;

+                if((pPageInfo->m_dwHeight == 0xffffffff) && (pPageInfo->m_bIsStriped != 1)) {

+                    m_pModule->JBig2_Warn("page height = 0xffffffff buf stripe field is 0");

+                    pPageInfo->m_bIsStriped = 1;

+                }

+                if(!m_bBufSpecified) {

+                    if(m_pPage) {

+                        delete m_pPage;

+                    }

+                    if(pPageInfo->m_dwHeight == 0xffffffff) {

+                        JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_wMaxStripeSize));

+                    } else {

+                        JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_dwHeight));

+                    }

+                }

+                m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0);

+                m_pPageInfoList->addItem(pPageInfo);

+                m_nState = JBIG2_IN_PAGE;

+            }

+            break;

+        case 49:

+            m_nState = JBIG2_OUT_OF_PAGE;

+            return JBIG2_END_OF_PAGE;

+            break;

+        case 50:

+            m_pStream->offset(pSegment->m_dwData_length);

+            break;

+        case 51:

+            return JBIG2_END_OF_FILE;

+        case 52:

+            m_pStream->offset(pSegment->m_dwData_length);

+            break;

+        case 53:

+            return parseTable(pSegment);

+        case 62:

+            m_pStream->offset(pSegment->m_dwData_length);

+            break;

+        default:

+            break;

+    }

+    return JBIG2_SUCCESS;

+failed1:

+    m_pModule->JBig2_Error("segment data too short.");

+    return JBIG2_ERROR_TOO_SHORT;

+failed2:

+    m_pModule->JBig2_Error("segment syntax error.");

+    return JBIG2_ERROR_FETAL;

+}

+FX_INT32 CJBig2_Context::parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause)

+{

+    FX_DWORD dwTemp;

+    FX_WORD wFlags;

+    FX_BYTE cSDHUFFDH, cSDHUFFDW, cSDHUFFBMSIZE, cSDHUFFAGGINST;

+    CJBig2_HuffmanTable *Table_B1 = NULL, *Table_B2 = NULL, *Table_B3 = NULL, *Table_B4 = NULL, *Table_B5 = NULL;

+    FX_INT32 i, nIndex, nRet;

+    CJBig2_Segment *pSeg = NULL, *pLRSeg = NULL;

+    FX_BOOL bUsed;

+    CJBig2_Image ** SDINSYMS = NULL;

+    CJBig2_SDDProc *pSymbolDictDecoder;

+    JBig2ArithCtx *gbContext = NULL, *grContext = NULL;

+    CJBig2_ArithDecoder *pArithDecoder;

+    JBIG2_ALLOC(pSymbolDictDecoder, CJBig2_SDDProc());

+    if(m_pStream->readShortInteger(&wFlags) != 0) {

+        m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");

+        nRet = JBIG2_ERROR_TOO_SHORT;

+        goto failed;

+    }

+    pSymbolDictDecoder->SDHUFF = wFlags & 0x0001;

+    pSymbolDictDecoder->SDREFAGG = (wFlags >> 1) & 0x0001;

+    pSymbolDictDecoder->SDTEMPLATE = (wFlags >> 10) & 0x0003;

+    pSymbolDictDecoder->SDRTEMPLATE = (wFlags >> 12) & 0x0003;

+    cSDHUFFDH = (wFlags >> 2) & 0x0003;

+    cSDHUFFDW = (wFlags >> 4) & 0x0003;

+    cSDHUFFBMSIZE = (wFlags >> 6) & 0x0001;

+    cSDHUFFAGGINST = (wFlags >> 7) & 0x0001;

+    if(pSymbolDictDecoder->SDHUFF == 0) {

+        if(pSymbolDictDecoder->SDTEMPLATE == 0) {

+            dwTemp = 8;

+        } else {

+            dwTemp = 2;

+        }

+        for(i = 0; i < (FX_INT32)dwTemp; i++) {

+            if(m_pStream->read1Byte((FX_BYTE*)&pSymbolDictDecoder->SDAT[i]) != 0) {

+                m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");

+                nRet = JBIG2_ERROR_TOO_SHORT;

+                goto failed;

+            }

+        }

+    }

+    if((pSymbolDictDecoder->SDREFAGG == 1) && (pSymbolDictDecoder->SDRTEMPLATE == 0)) {

+        for(i = 0; i < 4; i++) {

+            if(m_pStream->read1Byte((FX_BYTE*)&pSymbolDictDecoder->SDRAT[i]) != 0) {

+                m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");

+                nRet = JBIG2_ERROR_TOO_SHORT;

+                goto failed;

+            }

+        }

+    }

+    if((m_pStream->readInteger(&pSymbolDictDecoder->SDNUMEXSYMS) != 0)

+            || (m_pStream->readInteger(&pSymbolDictDecoder->SDNUMNEWSYMS) != 0)) {

+        m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");

+        nRet = JBIG2_ERROR_TOO_SHORT;

+        goto failed;

+    }

+    if (pSymbolDictDecoder->SDNUMEXSYMS > JBIG2_MAX_EXPORT_SYSMBOLS

+            || pSymbolDictDecoder->SDNUMNEWSYMS > JBIG2_MAX_NEW_SYSMBOLS) {

+        m_pModule->JBig2_Error("symbol dictionary segment : too many export/new symbols.");

+        nRet = JBIG2_ERROR_LIMIT;

+        goto failed;

+    }

+    for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {

+        if(!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) {

+            m_pModule->JBig2_Error("symbol dictionary segment : can't find refered to segments");

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+    }

+    pSymbolDictDecoder->SDNUMINSYMS = 0;

+    for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {

+        pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);

+        if(pSeg->m_cFlags.s.type == 0) {

+            pSymbolDictDecoder->SDNUMINSYMS += pSeg->m_Result.sd->SDNUMEXSYMS;

+            pLRSeg = pSeg;

+        }

+    }

+    if(pSymbolDictDecoder->SDNUMINSYMS == 0) {

+        SDINSYMS = NULL;

+    } else {

+        SDINSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(

+                       sizeof(CJBig2_Image*), pSymbolDictDecoder->SDNUMINSYMS);

+        dwTemp = 0;

+        for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {

+            pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);

+            if(pSeg->m_cFlags.s.type == 0) {

+                JBIG2_memcpy(SDINSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,

+                             pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));

+                dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;

+            }

+        }

+    }

+    pSymbolDictDecoder->SDINSYMS = SDINSYMS;

+    if(pSymbolDictDecoder->SDHUFF == 1) {

+        if((cSDHUFFDH == 2) || (cSDHUFFDW == 2)) {

+            m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDH=2 or SDHUFFDW=2 is not permitted.");

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        nIndex = 0;

+        if(cSDHUFFDH == 0) {

+            JBIG2_ALLOC(Table_B4, CJBig2_HuffmanTable(HuffmanTable_B4,

+                        sizeof(HuffmanTable_B4) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B4));

+            pSymbolDictDecoder->SDHUFFDH = Table_B4;

+        } else if(cSDHUFFDH == 1) {

+            JBIG2_ALLOC(Table_B5, CJBig2_HuffmanTable(HuffmanTable_B5,

+                        sizeof(HuffmanTable_B5) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B5));

+            pSymbolDictDecoder->SDHUFFDH = Table_B5;

+        } else {

+            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);

+            if(!pSeg) {

+                m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDH can't find user supplied table.");

+                nRet = JBIG2_ERROR_FETAL;

+                goto failed;

+            }

+            pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht;

+        }

+        if(cSDHUFFDW == 0) {

+            JBIG2_ALLOC(Table_B2, CJBig2_HuffmanTable(HuffmanTable_B2,

+                        sizeof(HuffmanTable_B2) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B2));

+            pSymbolDictDecoder->SDHUFFDW = Table_B2;

+        } else if(cSDHUFFDW == 1) {

+            JBIG2_ALLOC(Table_B3, CJBig2_HuffmanTable(HuffmanTable_B3,

+                        sizeof(HuffmanTable_B3) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B3));

+            pSymbolDictDecoder->SDHUFFDW = Table_B3;

+        } else {

+            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);

+            if(!pSeg) {

+                m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDW can't find user supplied table.");

+                nRet = JBIG2_ERROR_FETAL;

+                goto failed;

+            }

+            pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht;

+        }

+        if(cSDHUFFBMSIZE == 0) {

+            JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,

+                        sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));

+            pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1;

+        } else {

+            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);

+            if(!pSeg) {

+                m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFBMSIZE can't find user supplied table.");

+                nRet = JBIG2_ERROR_FETAL;

+                goto failed;

+            }

+            pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht;

+        }

+        if(pSymbolDictDecoder->SDREFAGG == 1) {

+            if(cSDHUFFAGGINST == 0) {

+                if(!Table_B1) {

+                    JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,

+                                sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));

+                }

+                pSymbolDictDecoder->SDHUFFAGGINST = Table_B1;

+            } else {

+                pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);

+                if(!pSeg) {

+                    m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFAGGINST can't find user supplied table.");

+                    nRet = JBIG2_ERROR_FETAL;

+                    goto failed;

+                }

+                pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht;

+            }

+        }

+    }

+    if((wFlags & 0x0100) && pLRSeg && pLRSeg->m_Result.sd->m_bContextRetained) {

+        if (pSymbolDictDecoder->SDHUFF == 0) {

+            dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 ? 65536 : pSymbolDictDecoder->SDTEMPLATE == 1 ?

+                     8192 : 1024;

+            gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);

+            JBIG2_memcpy(gbContext, pLRSeg->m_Result.sd->m_gbContext, sizeof(JBig2ArithCtx)*dwTemp);

+        }

+        if (pSymbolDictDecoder->SDREFAGG == 1) {

+            dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13;

+            grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);

+            JBIG2_memcpy(grContext, pLRSeg->m_Result.sd->m_grContext, sizeof(JBig2ArithCtx)*dwTemp);

+        }

+    } else {

+        if (pSymbolDictDecoder->SDHUFF == 0) {

+            dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 ? 65536 : pSymbolDictDecoder->SDTEMPLATE == 1 ?

+                     8192 : 1024;

+            gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);

+            JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);

+        }

+        if (pSymbolDictDecoder->SDREFAGG == 1) {

+            dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13;

+            grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);

+            JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);

+        }

+    }

+    pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER;

+    if(pSymbolDictDecoder->SDHUFF == 0) {

+        JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));

+        pSegment->m_Result.sd = pSymbolDictDecoder->decode_Arith(pArithDecoder, gbContext, grContext);

+        delete pArithDecoder;

+        if(pSegment->m_Result.sd == NULL) {

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        m_pStream->alignByte();

+        m_pStream->offset(2);

+    } else {

+        pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman(m_pStream, gbContext, grContext, pPause);

+        if(pSegment->m_Result.sd == NULL) {

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        m_pStream->alignByte();

+    }

+    if(wFlags & 0x0200) {

+        pSegment->m_Result.sd->m_bContextRetained = TRUE;

+        if(pSymbolDictDecoder->SDHUFF == 0) {

+            pSegment->m_Result.sd->m_gbContext = gbContext;

+        }

+        if(pSymbolDictDecoder->SDREFAGG == 1) {

+            pSegment->m_Result.sd->m_grContext = grContext;

+        }

+        bUsed = TRUE;

+    } else {

+        bUsed = FALSE;

+    }

+    delete pSymbolDictDecoder;

+    if(SDINSYMS) {

+        m_pModule->JBig2_Free(SDINSYMS);

+    }

+    if(Table_B1) {

+        delete Table_B1;

+    }

+    if(Table_B2) {

+        delete Table_B2;

+    }

+    if(Table_B3) {

+        delete Table_B3;

+    }

+    if(Table_B4) {

+        delete Table_B4;

+    }

+    if(Table_B5) {

+        delete Table_B5;

+    }

+    if(bUsed == FALSE) {

+        if(gbContext) {

+            m_pModule->JBig2_Free(gbContext);

+        }

+        if(grContext) {

+            m_pModule->JBig2_Free(grContext);

+        }

+    }

+    return JBIG2_SUCCESS;

+failed:

+    delete pSymbolDictDecoder;

+    if(SDINSYMS) {

+        m_pModule->JBig2_Free(SDINSYMS);

+    }

+    if(Table_B1) {

+        delete Table_B1;

+    }

+    if(Table_B2) {

+        delete Table_B2;

+    }

+    if(Table_B3) {

+        delete Table_B3;

+    }

+    if(Table_B4) {

+        delete Table_B4;

+    }

+    if(Table_B5) {

+        delete Table_B5;

+    }

+    if(gbContext) {

+        m_pModule->JBig2_Free(gbContext);

+    }

+    if(grContext) {

+        m_pModule->JBig2_Free(grContext);

+    }

+    return nRet;

+}

+

+FX_BOOL CJBig2_Context::parseTextRegion(CJBig2_Segment *pSegment)

+{

+    FX_DWORD dwTemp;

+    FX_WORD wFlags;

+    FX_INT32 i, nIndex, nRet;

+    JBig2RegionInfo ri;

+    CJBig2_Segment *pSeg;

+    CJBig2_Image **SBSYMS = NULL;

+    JBig2HuffmanCode *SBSYMCODES = NULL;

+    FX_BYTE cSBHUFFFS, cSBHUFFDS, cSBHUFFDT, cSBHUFFRDW, cSBHUFFRDH, cSBHUFFRDX, cSBHUFFRDY, cSBHUFFRSIZE;

+    CJBig2_HuffmanTable *Table_B1 = NULL,

+                         *Table_B6 = NULL,

+                          *Table_B7 = NULL,

+                           *Table_B8 = NULL,

+                            *Table_B9 = NULL,

+                             *Table_B10 = NULL,

+                              *Table_B11 = NULL,

+                               *Table_B12 = NULL,

+                                *Table_B13 = NULL,

+                                 *Table_B14 = NULL,

+                                  *Table_B15 = NULL;

+    JBig2ArithCtx *grContext = NULL;

+    CJBig2_ArithDecoder *pArithDecoder;

+    CJBig2_TRDProc *pTRD;

+    JBIG2_ALLOC(pTRD, CJBig2_TRDProc());

+    if((parseRegionInfo(&ri) != JBIG2_SUCCESS)

+            || (m_pStream->readShortInteger(&wFlags) != 0)) {

+        m_pModule->JBig2_Error("text region segment : data header too short.");

+        nRet = JBIG2_ERROR_TOO_SHORT;

+        goto failed;

+    }

+    pTRD->SBW = ri.width;

+    pTRD->SBH = ri.height;

+    pTRD->SBHUFF = wFlags & 0x0001;

+    pTRD->SBREFINE = (wFlags >> 1) & 0x0001;

+    dwTemp = (wFlags >> 2) & 0x0003;

+    pTRD->SBSTRIPS = 1 << dwTemp;

+    pTRD->REFCORNER = (JBig2Corner)((wFlags >> 4) & 0x0003);

+    pTRD->TRANSPOSED = (wFlags >> 6) & 0x0001;

+    pTRD->SBCOMBOP = (JBig2ComposeOp)((wFlags >> 7) & 0x0003);

+    pTRD->SBDEFPIXEL = (wFlags >> 9) & 0x0001;

+    pTRD->SBDSOFFSET = (wFlags >> 10) & 0x001f;

+    if(pTRD->SBDSOFFSET >= 0x0010) {

+        pTRD->SBDSOFFSET = pTRD->SBDSOFFSET - 0x0020;

+    }

+    pTRD->SBRTEMPLATE = (wFlags >> 15) & 0x0001;

+    if(pTRD->SBHUFF == 1) {

+        if(m_pStream->readShortInteger(&wFlags) != 0) {

+            m_pModule->JBig2_Error("text region segment : data header too short.");

+            nRet = JBIG2_ERROR_TOO_SHORT;

+            goto failed;

+        }

+        cSBHUFFFS = wFlags & 0x0003;

+        cSBHUFFDS = (wFlags >> 2) & 0x0003;

+        cSBHUFFDT = (wFlags >> 4) & 0x0003;

+        cSBHUFFRDW = (wFlags >> 6) & 0x0003;

+        cSBHUFFRDH = (wFlags >> 8) & 0x0003;

+        cSBHUFFRDX = (wFlags >> 10) & 0x0003;

+        cSBHUFFRDY = (wFlags >> 12) & 0x0003;

+        cSBHUFFRSIZE = (wFlags >> 14) & 0x0001;

+    }

+    if((pTRD->SBREFINE == 1) && (pTRD->SBRTEMPLATE == 0)) {

+        for(i = 0; i < 4; i++) {

+            if(m_pStream->read1Byte((FX_BYTE*)&pTRD->SBRAT[i]) != 0) {

+                m_pModule->JBig2_Error("text region segment : data header too short.");

+                nRet = JBIG2_ERROR_TOO_SHORT;

+                goto failed;

+            }

+        }

+    }

+    if(m_pStream->readInteger(&pTRD->SBNUMINSTANCES) != 0) {

+        m_pModule->JBig2_Error("text region segment : data header too short.");

+        nRet = JBIG2_ERROR_TOO_SHORT;

+        goto failed;

+    }

+    for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {

+        if(!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) {

+            m_pModule->JBig2_Error("text region segment : can't find refered to segments");

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+    }

+    pTRD->SBNUMSYMS = 0;

+    for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {

+        pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);

+        if(pSeg->m_cFlags.s.type == 0) {

+            pTRD->SBNUMSYMS += pSeg->m_Result.sd->SDNUMEXSYMS;

+        }

+    }

+    if (pTRD->SBNUMSYMS > 0) {

+        SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(

+                     sizeof(CJBig2_Image*), pTRD->SBNUMSYMS);

+        dwTemp = 0;

+        for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {

+            pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);

+            if(pSeg->m_cFlags.s.type == 0) {

+                JBIG2_memcpy(SBSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,

+                             pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));

+                dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;

+            }

+        }

+        pTRD->SBSYMS = SBSYMS;

+    } else {

+        pTRD->SBSYMS = NULL;

+    }

+    if(pTRD->SBHUFF == 1) {

+        SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream, pTRD->SBNUMSYMS);

+        if(SBSYMCODES == NULL) {

+            m_pModule->JBig2_Error("text region segment: symbol ID huffman table decode failure!");

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        m_pStream->alignByte();

+        pTRD->SBSYMCODES = SBSYMCODES;

+    } else {

+        dwTemp = 0;

+        while((FX_DWORD)(1 << dwTemp) < pTRD->SBNUMSYMS) {

+            dwTemp ++;

+        }

+        pTRD->SBSYMCODELEN = (FX_BYTE)dwTemp;

+    }

+    if(pTRD->SBHUFF == 1) {

+        if((cSBHUFFFS == 2) || (cSBHUFFRDW == 2) || (cSBHUFFRDH == 2)

+                || (cSBHUFFRDX == 2) || (cSBHUFFRDY == 2)) {

+            m_pModule->JBig2_Error("text region segment : SBHUFFFS=2 or SBHUFFRDW=2 or "

+                                   "SBHUFFRDH=2 or SBHUFFRDX=2 or SBHUFFRDY=2 is not permitted");

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        nIndex = 0;

+        if(cSBHUFFFS == 0) {

+            JBIG2_ALLOC(Table_B6, CJBig2_HuffmanTable(HuffmanTable_B6,

+                        sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));

+            pTRD->SBHUFFFS = Table_B6;

+        } else if(cSBHUFFFS == 1) {

+            JBIG2_ALLOC(Table_B7, CJBig2_HuffmanTable(HuffmanTable_B7,

+                        sizeof(HuffmanTable_B7) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B7));

+            pTRD->SBHUFFFS = Table_B7;

+        } else {

+            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);

+            if(!pSeg) {

+                m_pModule->JBig2_Error("text region segment : SBHUFFFS can't find user supplied table");

+                nRet = JBIG2_ERROR_FETAL;

+                goto failed;

+            }

+            pTRD->SBHUFFFS = pSeg->m_Result.ht;

+        }

+        if(cSBHUFFDS == 0) {

+            JBIG2_ALLOC(Table_B8, CJBig2_HuffmanTable(HuffmanTable_B8,

+                        sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));

+            pTRD->SBHUFFDS = Table_B8;

+        } else if(cSBHUFFDS == 1) {

+            JBIG2_ALLOC(Table_B9, CJBig2_HuffmanTable(HuffmanTable_B9,

+                        sizeof(HuffmanTable_B9) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B9));

+            pTRD->SBHUFFDS = Table_B9;

+        } else if(cSBHUFFDS == 2) {

+            JBIG2_ALLOC(Table_B10, CJBig2_HuffmanTable(HuffmanTable_B10,

+                        sizeof(HuffmanTable_B10) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B10));

+            pTRD->SBHUFFDS = Table_B10;

+        } else {

+            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);

+            if(!pSeg) {

+                m_pModule->JBig2_Error("text region segment : SBHUFFDS can't find user supplied table");

+                nRet = JBIG2_ERROR_FETAL;

+                goto failed;

+            }

+            pTRD->SBHUFFDS = pSeg->m_Result.ht;

+        }

+        if(cSBHUFFDT == 0) {

+            JBIG2_ALLOC(Table_B11, CJBig2_HuffmanTable(HuffmanTable_B11,

+                        sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));

+            pTRD->SBHUFFDT = Table_B11;

+        } else if(cSBHUFFDT == 1) {

+            JBIG2_ALLOC(Table_B12, CJBig2_HuffmanTable(HuffmanTable_B12,

+                        sizeof(HuffmanTable_B12) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B12));

+            pTRD->SBHUFFDT = Table_B12;

+        } else if(cSBHUFFDT == 2) {

+            JBIG2_ALLOC(Table_B13, CJBig2_HuffmanTable(HuffmanTable_B13,

+                        sizeof(HuffmanTable_B13) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B13));

+            pTRD->SBHUFFDT = Table_B13;

+        } else {

+            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);

+            if(!pSeg) {

+                m_pModule->JBig2_Error("text region segment : SBHUFFDT can't find user supplied table");

+                nRet = JBIG2_ERROR_FETAL;

+                goto failed;

+            }

+            pTRD->SBHUFFDT = pSeg->m_Result.ht;

+        }

+        if(cSBHUFFRDW == 0) {

+            JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,

+                        sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));

+            pTRD->SBHUFFRDW = Table_B14;

+        } else if(cSBHUFFRDW == 1) {

+            JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,

+                        sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+            pTRD->SBHUFFRDW = Table_B15;

+        } else {

+            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);

+            if(!pSeg) {

+                m_pModule->JBig2_Error("text region segment : SBHUFFRDW can't find user supplied table");

+                nRet = JBIG2_ERROR_FETAL;

+                goto failed;

+            }

+            pTRD->SBHUFFRDW = pSeg->m_Result.ht;

+        }

+        if(cSBHUFFRDH == 0) {

+            if(!Table_B14) {

+                JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,

+                            sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));

+            }

+            pTRD->SBHUFFRDH = Table_B14;

+        } else if(cSBHUFFRDH == 1) {

+            if(!Table_B15) {

+                JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,

+                            sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+            }

+            pTRD->SBHUFFRDH = Table_B15;

+        } else {

+            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);

+            if(!pSeg) {

+                m_pModule->JBig2_Error("text region segment : SBHUFFRDH can't find user supplied table");

+                nRet = JBIG2_ERROR_FETAL;

+                goto failed;

+            }

+            pTRD->SBHUFFRDH = pSeg->m_Result.ht;

+        }

+        if(cSBHUFFRDX == 0) {

+            if(!Table_B14) {

+                JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,

+                            sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));

+            }

+            pTRD->SBHUFFRDX = Table_B14;

+        } else if(cSBHUFFRDX == 1) {

+            if(!Table_B15) {

+                JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,

+                            sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+            }

+            pTRD->SBHUFFRDX = Table_B15;

+        } else {

+            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);

+            if(!pSeg) {

+                m_pModule->JBig2_Error("text region segment : SBHUFFRDX can't find user supplied table");

+                nRet = JBIG2_ERROR_FETAL;

+                goto failed;

+            }

+            pTRD->SBHUFFRDX = pSeg->m_Result.ht;

+        }

+        if(cSBHUFFRDY == 0) {

+            if(!Table_B14) {

+                JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,

+                            sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));

+            }

+            pTRD->SBHUFFRDY = Table_B14;

+        } else if(cSBHUFFRDY == 1) {

+            if(!Table_B15) {

+                JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,

+                            sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+            }

+            pTRD->SBHUFFRDY = Table_B15;

+        } else {

+            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);

+            if(!pSeg) {

+                m_pModule->JBig2_Error("text region segment : SBHUFFRDY can't find user supplied table");

+                nRet = JBIG2_ERROR_FETAL;

+                goto failed;

+            }

+            pTRD->SBHUFFRDY = pSeg->m_Result.ht;

+        }

+        if(cSBHUFFRSIZE == 0) {

+            JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,

+                        sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));

+            pTRD->SBHUFFRSIZE = Table_B1;

+        } else {

+            pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);

+            if(!pSeg) {

+                m_pModule->JBig2_Error("text region segment : SBHUFFRSIZE can't find user supplied table");

+                nRet = JBIG2_ERROR_FETAL;

+                goto failed;

+            }

+            pTRD->SBHUFFRSIZE = pSeg->m_Result.ht;

+        }

+    }

+    if(pTRD->SBREFINE == 1) {

+        dwTemp = pTRD->SBRTEMPLATE ? 1 << 10 : 1 << 13;

+        grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);

+        JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);

+    }

+    if(pTRD->SBHUFF == 0) {

+        JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));

+        pSegment->m_nResultType = JBIG2_IMAGE_POINTER;

+        pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext);

+        delete pArithDecoder;

+        if(pSegment->m_Result.im == NULL) {

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        m_pStream->alignByte();

+        m_pStream->offset(2);

+    } else {

+        pSegment->m_nResultType = JBIG2_IMAGE_POINTER;

+        pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream, grContext);

+        if(pSegment->m_Result.im == NULL) {

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        m_pStream->alignByte();

+    }

+    if(pSegment->m_cFlags.s.type != 4) {

+        if(!m_bBufSpecified) {

+            JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();

+            if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {

+                m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);

+            }

+        }

+        m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));

+        delete pSegment->m_Result.im;

+        pSegment->m_Result.im = NULL;

+    }

+    delete pTRD;

+    if(SBSYMS) {

+        m_pModule->JBig2_Free(SBSYMS);

+    }

+    if(SBSYMCODES) {

+        m_pModule->JBig2_Free(SBSYMCODES);

+    }

+    if(grContext) {

+        m_pModule->JBig2_Free(grContext);

+    }

+    if(Table_B1) {

+        delete Table_B1;

+    }

+    if(Table_B6) {

+        delete Table_B6;

+    }

+    if(Table_B7) {

+        delete Table_B7;

+    }

+    if(Table_B8) {

+        delete Table_B8;

+    }

+    if(Table_B9) {

+        delete Table_B9;

+    }

+    if(Table_B10) {

+        delete Table_B10;

+    }

+    if(Table_B11) {

+        delete Table_B11;

+    }

+    if(Table_B12) {

+        delete Table_B12;

+    }

+    if(Table_B13) {

+        delete Table_B13;

+    }

+    if(Table_B14) {

+        delete Table_B14;

+    }

+    if(Table_B15) {

+        delete Table_B15;

+    }

+    return JBIG2_SUCCESS;

+failed:

+    delete pTRD;

+    if(SBSYMS) {

+        m_pModule->JBig2_Free(SBSYMS);

+    }

+    if(SBSYMCODES) {

+        m_pModule->JBig2_Free(SBSYMCODES);

+    }

+    if(grContext) {

+        m_pModule->JBig2_Free(grContext);

+    }

+    if(Table_B1) {

+        delete Table_B1;

+    }

+    if(Table_B6) {

+        delete Table_B6;

+    }

+    if(Table_B7) {

+        delete Table_B7;

+    }

+    if(Table_B8) {

+        delete Table_B8;

+    }

+    if(Table_B9) {

+        delete Table_B9;

+    }

+    if(Table_B10) {

+        delete Table_B10;

+    }

+    if(Table_B11) {

+        delete Table_B11;

+    }

+    if(Table_B12) {

+        delete Table_B12;

+    }

+    if(Table_B13) {

+        delete Table_B13;

+    }

+    if(Table_B14) {

+        delete Table_B14;

+    }

+    if(Table_B15) {

+        delete Table_B15;

+    }

+    return nRet;

+}

+

+FX_BOOL CJBig2_Context::parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause)

+{

+    FX_DWORD dwTemp;

+    FX_BYTE cFlags;

+    JBig2ArithCtx *gbContext;

+    CJBig2_ArithDecoder *pArithDecoder;

+    CJBig2_PDDProc *pPDD;

+    FX_INT32 nRet;

+    JBIG2_ALLOC(pPDD, CJBig2_PDDProc());

+    if((m_pStream->read1Byte(&cFlags) != 0)

+            || (m_pStream->read1Byte(&pPDD->HDPW) != 0)

+            || (m_pStream->read1Byte(&pPDD->HDPH) != 0)

+            || (m_pStream->readInteger(&pPDD->GRAYMAX) != 0)) {

+        m_pModule->JBig2_Error("pattern dictionary segment : data header too short.");

+        nRet = JBIG2_ERROR_TOO_SHORT;

+        goto failed;

+    }

+    if (pPDD->GRAYMAX > JBIG2_MAX_PATTERN_INDEX) {

+        m_pModule->JBig2_Error("pattern dictionary segment : too max gray max.");

+        nRet = JBIG2_ERROR_LIMIT;

+        goto failed;

+    }

+    pPDD->HDMMR = cFlags & 0x01;

+    pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03;

+    pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER;

+    if(pPDD->HDMMR == 0) {

+        dwTemp = pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024;

+        gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);

+        JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);

+        JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));

+        pSegment->m_Result.pd = pPDD->decode_Arith(pArithDecoder, gbContext, pPause);

+        delete pArithDecoder;

+        if(pSegment->m_Result.pd == NULL) {

+            m_pModule->JBig2_Free(gbContext);

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        m_pModule->JBig2_Free(gbContext);

+        m_pStream->alignByte();

+        m_pStream->offset(2);

+    } else {

+        pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream, pPause);

+        if(pSegment->m_Result.pd == NULL) {

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        m_pStream->alignByte();

+    }

+    delete pPDD;

+    return JBIG2_SUCCESS;

+failed:

+    delete pPDD;

+    return nRet;

+}

+FX_BOOL CJBig2_Context::parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause)

+{

+    FX_DWORD dwTemp;

+    FX_BYTE cFlags;

+    JBig2RegionInfo ri;

+    CJBig2_Segment *pSeg;

+    CJBig2_PatternDict *pPatternDict;

+    JBig2ArithCtx *gbContext;

+    CJBig2_ArithDecoder *pArithDecoder;

+    CJBig2_HTRDProc *pHRD;

+    FX_INT32 nRet;

+    JBIG2_ALLOC(pHRD, CJBig2_HTRDProc());

+    if((parseRegionInfo(&ri) != JBIG2_SUCCESS)

+            || (m_pStream->read1Byte(&cFlags) != 0)

+            || (m_pStream->readInteger(&pHRD->HGW) != 0)

+            || (m_pStream->readInteger(&pHRD->HGH) != 0)

+            || (m_pStream->readInteger((FX_DWORD*)&pHRD->HGX) != 0)

+            || (m_pStream->readInteger((FX_DWORD*)&pHRD->HGY) != 0)

+            || (m_pStream->readShortInteger(&pHRD->HRX) != 0)

+            || (m_pStream->readShortInteger(&pHRD->HRY) != 0)) {

+        m_pModule->JBig2_Error("halftone region segment : data header too short.");

+        nRet = JBIG2_ERROR_TOO_SHORT;

+        goto failed;

+    }

+    pHRD->HBW = ri.width;

+    pHRD->HBH = ri.height;

+    pHRD->HMMR = cFlags & 0x01;

+    pHRD->HTEMPLATE = (cFlags >> 1) & 0x03;

+    pHRD->HENABLESKIP = (cFlags >> 3) & 0x01;

+    pHRD->HCOMBOP = (JBig2ComposeOp)((cFlags >> 4) & 0x07);

+    pHRD->HDEFPIXEL = (cFlags >> 7) & 0x01;

+    if(pSegment->m_nReferred_to_segment_count != 1) {

+        m_pModule->JBig2_Error("halftone region segment : refered to segment count not equals 1");

+        nRet = JBIG2_ERROR_FETAL;

+        goto failed;

+    }

+    pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);

+    if( (pSeg == NULL) || (pSeg->m_cFlags.s.type != 16)) {

+        m_pModule->JBig2_Error("halftone region segment : refered to segment is not pattern dict");

+        nRet = JBIG2_ERROR_FETAL;

+        goto failed;

+    }

+    pPatternDict = pSeg->m_Result.pd;

+    if((pPatternDict == NULL) || (pPatternDict->NUMPATS == 0)) {

+        m_pModule->JBig2_Error("halftone region segment : has no patterns input");

+        nRet = JBIG2_ERROR_FETAL;

+        goto failed;

+    }

+    pHRD->HNUMPATS = pPatternDict->NUMPATS;

+    pHRD->HPATS = pPatternDict->HDPATS;

+    pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth;

+    pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight;

+    pSegment->m_nResultType = JBIG2_IMAGE_POINTER;

+    if(pHRD->HMMR == 0) {

+        dwTemp = pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024;

+        gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);

+        JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);

+        JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));

+        pSegment->m_Result.im = pHRD->decode_Arith(pArithDecoder, gbContext, pPause);

+        delete pArithDecoder;

+        if(pSegment->m_Result.im == NULL) {

+            m_pModule->JBig2_Free(gbContext);

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        m_pModule->JBig2_Free(gbContext);

+        m_pStream->alignByte();

+        m_pStream->offset(2);

+    } else {

+        pSegment->m_Result.im = pHRD->decode_MMR(m_pStream, pPause);

+        if(pSegment->m_Result.im == NULL) {

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        m_pStream->alignByte();

+    }

+    if(pSegment->m_cFlags.s.type != 20) {

+        if(!m_bBufSpecified) {

+            JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();

+            if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {

+                m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);

+            }

+        }

+        m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));

+        delete pSegment->m_Result.im;

+        pSegment->m_Result.im = NULL;

+    }

+    delete pHRD;

+    return JBIG2_SUCCESS;

+failed:

+    delete pHRD;

+    return nRet;

+}

+

+FX_BOOL CJBig2_Context::parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause)

+{

+    FX_DWORD dwTemp;

+    FX_BYTE cFlags;

+    FX_INT32 i, nRet;

+    if(m_pGRD == NULL) {

+        JBIG2_ALLOC(m_pGRD, CJBig2_GRDProc());

+        if((parseRegionInfo(&m_ri) != JBIG2_SUCCESS)

+                || (m_pStream->read1Byte(&cFlags) != 0)) {

+            m_pModule->JBig2_Error("generic region segment : data header too short.");

+            nRet = JBIG2_ERROR_TOO_SHORT;

+            goto failed;

+        }

+        if (m_ri.height < 0 || m_ri.width < 0) {

+            m_pModule->JBig2_Error("generic region segment : wrong data.");

+            nRet = JBIG2_FAILED;

+            goto failed;

+        }

+        m_pGRD->GBW = m_ri.width;

+        m_pGRD->GBH = m_ri.height;

+        m_pGRD->MMR = cFlags & 0x01;

+        m_pGRD->GBTEMPLATE = (cFlags >> 1) & 0x03;

+        m_pGRD->TPGDON = (cFlags >> 3) & 0x01;

+        if(m_pGRD->MMR == 0) {

+            if(m_pGRD->GBTEMPLATE == 0) {

+                for(i = 0; i < 8; i++) {

+                    if(m_pStream->read1Byte((FX_BYTE*)&m_pGRD->GBAT[i]) != 0) {

+                        m_pModule->JBig2_Error("generic region segment : data header too short.");

+                        nRet = JBIG2_ERROR_TOO_SHORT;

+                        goto failed;

+                    }

+                }

+            } else {

+                for(i = 0; i < 2; i++) {

+                    if(m_pStream->read1Byte((FX_BYTE*)&m_pGRD->GBAT[i]) != 0) {

+                        m_pModule->JBig2_Error("generic region segment : data header too short.");

+                        nRet = JBIG2_ERROR_TOO_SHORT;

+                        goto failed;

+                    }

+                }

+            }

+        }

+        m_pGRD->USESKIP = 0;

+    }

+    pSegment->m_nResultType = JBIG2_IMAGE_POINTER;

+    if(m_pGRD->MMR == 0) {

+        dwTemp = m_pGRD->GBTEMPLATE == 0 ? 65536 : m_pGRD->GBTEMPLATE == 1 ? 8192 : 1024;

+        if(m_gbContext == NULL) {

+            m_gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc(sizeof(JBig2ArithCtx) * dwTemp);

+            JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);

+        }

+        if(m_pArithDecoder == NULL) {

+            JBIG2_ALLOC(m_pArithDecoder, CJBig2_ArithDecoder(m_pStream));

+            m_ProcessiveStatus = m_pGRD->Start_decode_Arith(&pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause);

+        } else {

+            m_ProcessiveStatus = m_pGRD->Continue_decode(pPause);

+        }

+        OutputBitmap(pSegment->m_Result.im);

+        if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+            if(pSegment->m_cFlags.s.type != 36) {

+                if(!m_bBufSpecified) {

+                    JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();

+                    if ((pPageInfo->m_bIsStriped == 1) && (m_ri.y + m_ri.height > m_pPage->m_nHeight)) {

+                        m_pPage->expand(m_ri.y + m_ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);

+                    }

+                }

+                FX_RECT Rect = m_pGRD->GetReplaceRect();

+                m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, pSegment->m_Result.im, (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);

+            }

+            return JBIG2_SUCCESS;

+        } else {

+            delete m_pArithDecoder;

+            m_pArithDecoder = NULL;

+            if(pSegment->m_Result.im == NULL) {

+                m_pModule->JBig2_Free(m_gbContext);

+                nRet = JBIG2_ERROR_FETAL;

+                m_gbContext = NULL;

+                m_ProcessiveStatus = FXCODEC_STATUS_ERROR;

+                goto failed;

+            }

+            m_pModule->JBig2_Free(m_gbContext);

+            m_gbContext = NULL;

+            m_pStream->alignByte();

+            m_pStream->offset(2);

+        }

+    } else {

+        FXCODEC_STATUS status = m_pGRD->Start_decode_MMR(&pSegment->m_Result.im, m_pStream, pPause);

+        while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+            m_pGRD->Continue_decode(pPause);

+        }

+        if(pSegment->m_Result.im == NULL) {

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        m_pStream->alignByte();

+    }

+    if(pSegment->m_cFlags.s.type != 36) {

+        if(!m_bBufSpecified) {

+            JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();

+            if ((pPageInfo->m_bIsStriped == 1) && (m_ri.y + m_ri.height > m_pPage->m_nHeight)) {

+                m_pPage->expand(m_ri.y + m_ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);

+            }

+        }

+        FX_RECT Rect = m_pGRD->GetReplaceRect();

+        m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, pSegment->m_Result.im, (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);

+        delete pSegment->m_Result.im;

+        pSegment->m_Result.im = NULL;

+    }

+    delete m_pGRD;

+    m_pGRD = NULL;

+    return JBIG2_SUCCESS;

+failed:

+    delete m_pGRD;

+    m_pGRD = NULL;

+    return nRet;

+}

+

+FX_BOOL CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment *pSegment)

+{

+    FX_DWORD dwTemp;

+    JBig2RegionInfo ri;

+    CJBig2_Segment *pSeg;

+    FX_INT32 i, nRet;

+    FX_BYTE cFlags;

+    JBig2ArithCtx *grContext;

+    CJBig2_GRRDProc *pGRRD;

+    CJBig2_ArithDecoder *pArithDecoder;

+    JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());

+    if((parseRegionInfo(&ri) != JBIG2_SUCCESS)

+            || (m_pStream->read1Byte(&cFlags) != 0)) {

+        m_pModule->JBig2_Error("generic refinement region segment : data header too short.");

+        nRet = JBIG2_ERROR_TOO_SHORT;

+        goto failed;

+    }

+    pGRRD->GRW = ri.width;

+    pGRRD->GRH = ri.height;

+    pGRRD->GRTEMPLATE = cFlags & 0x01;

+    pGRRD->TPGRON = (cFlags >> 1) & 0x01;

+    if(pGRRD->GRTEMPLATE == 0) {

+        for(i = 0; i < 4; i++) {

+            if(m_pStream->read1Byte((FX_BYTE*)&pGRRD->GRAT[i]) != 0) {

+                m_pModule->JBig2_Error("generic refinement region segment : data header too short.");

+                nRet = JBIG2_ERROR_TOO_SHORT;

+                goto failed;

+            }

+        }

+    }

+    pSeg = NULL;

+    if(pSegment->m_nReferred_to_segment_count > 0) {

+        for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {

+            pSeg = this->findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);

+            if(pSeg == NULL) {

+                m_pModule->JBig2_Error("generic refinement region segment : can't find refered to segments");

+                nRet = JBIG2_ERROR_FETAL;

+                goto failed;

+            }

+            if((pSeg->m_cFlags.s.type == 4) || (pSeg->m_cFlags.s.type == 20)

+                    || (pSeg->m_cFlags.s.type == 36) || (pSeg->m_cFlags.s.type == 40)) {

+                break;

+            }

+        }

+        if(i >= pSegment->m_nReferred_to_segment_count) {

+            m_pModule->JBig2_Error("generic refinement region segment : can't find refered to intermediate region");

+            nRet = JBIG2_ERROR_FETAL;

+            goto failed;

+        }

+        pGRRD->GRREFERENCE = pSeg->m_Result.im;

+    } else {

+        pGRRD->GRREFERENCE = m_pPage;

+    }

+    pGRRD->GRREFERENCEDX = 0;

+    pGRRD->GRREFERENCEDY = 0;

+    dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13;

+    grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);

+    JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);

+    JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));

+    pSegment->m_nResultType = JBIG2_IMAGE_POINTER;

+    pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext);

+    delete pArithDecoder;

+    if(pSegment->m_Result.im == NULL) {

+        m_pModule->JBig2_Free(grContext);

+        nRet = JBIG2_ERROR_FETAL;

+        goto failed;

+    }

+    m_pModule->JBig2_Free(grContext);

+    m_pStream->alignByte();

+    m_pStream->offset(2);

+    if(pSegment->m_cFlags.s.type != 40) {

+        if(!m_bBufSpecified) {

+            JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();

+            if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {

+                m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);

+            }

+        }

+        m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));

+        delete pSegment->m_Result.im;

+        pSegment->m_Result.im = NULL;

+    }

+    delete pGRRD;

+    return JBIG2_SUCCESS;

+failed:

+    delete pGRRD;

+    return nRet;

+}

+FX_BOOL CJBig2_Context::parseTable(CJBig2_Segment *pSegment)

+{

+    pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER;

+    JBIG2_ALLOC(pSegment->m_Result.ht, CJBig2_HuffmanTable(m_pStream));

+    if(!pSegment->m_Result.ht->isOK()) {

+        delete pSegment->m_Result.ht;

+        pSegment->m_Result.ht = NULL;

+        return JBIG2_ERROR_FETAL;

+    }

+    m_pStream->alignByte();

+    return JBIG2_SUCCESS;

+}

+FX_INT32 CJBig2_Context::parseRegionInfo(JBig2RegionInfo *pRI)

+{

+    if((m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0)

+            || (m_pStream->readInteger((FX_DWORD*)&pRI->height) != 0)

+            || (m_pStream->readInteger((FX_DWORD*)&pRI->x) != 0)

+            || (m_pStream->readInteger((FX_DWORD*)&pRI->y) != 0)

+            || (m_pStream->read1Byte(&pRI->flags) != 0)) {

+        return JBIG2_ERROR_TOO_SHORT;

+    }

+    return JBIG2_SUCCESS;

+}

+JBig2HuffmanCode *CJBig2_Context::decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream,

+        FX_DWORD SBNUMSYMS)

+{

+    JBig2HuffmanCode *SBSYMCODES;

+    FX_INT32 runcodes[35], runcodes_len[35], runcode;

+    FX_INT32 i, j, nTemp, nVal, nBits;

+    FX_INT32 run;

+    SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(sizeof(JBig2HuffmanCode), SBNUMSYMS);

+    for (i = 0; i < 35; i ++) {

+        if(pStream->readNBits(4, &runcodes_len[i]) != 0) {

+            goto failed;

+        }

+    }

+    huffman_assign_code(runcodes, runcodes_len, 35);

+    i = 0;

+    while(i < (int)SBNUMSYMS) {

+        nVal = 0;

+        nBits = 0;

+        for(;;) {

+            if(pStream->read1Bit(&nTemp) != 0) {

+                goto failed;

+            }

+            nVal = (nVal << 1) | nTemp;

+            nBits ++;

+            for(j = 0; j < 35; j++) {

+                if((nBits == runcodes_len[j]) && (nVal == runcodes[j])) {

+                    break;

+                }

+            }

+            if(j < 35) {

+                break;

+            }

+        }

+        runcode = j;

+        if(runcode < 32) {

+            SBSYMCODES[i].codelen = runcode;

+            run = 0;

+        } else if(runcode == 32) {

+            if(pStream->readNBits(2, &nTemp) != 0) {

+                goto failed;

+            }

+            run = nTemp + 3;

+        } else if(runcode == 33) {

+            if(pStream->readNBits(3, &nTemp) != 0) {

+                goto failed;

+            }

+            run = nTemp + 3;

+        } else if(runcode == 34) {

+            if(pStream->readNBits(7, &nTemp) != 0) {

+                goto failed;

+            }

+            run = nTemp + 11;

+        }

+        if(run > 0) {

+            if (i + run > (int)SBNUMSYMS) {

+                goto failed;

+            }

+            for(j = 0; j < run; j++) {

+                if(runcode == 32 && i > 0) {

+                    SBSYMCODES[i + j].codelen = SBSYMCODES[i - 1].codelen;

+                } else {

+                    SBSYMCODES[i + j].codelen = 0;

+                }

+            }

+            i += run;

+        } else {

+            i ++;

+        }

+    }

+    huffman_assign_code(SBSYMCODES, SBNUMSYMS);

+    return SBSYMCODES;

+failed:

+    m_pModule->JBig2_Free(SBSYMCODES);

+    return NULL;

+}

+void CJBig2_Context::huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP)

+{

+    int CURLEN, LENMAX, CURCODE, CURTEMP, i;

+    int *LENCOUNT;

+    int *FIRSTCODE;

+    LENMAX = 0;

+    for(i = 0; i < NTEMP; i++) {

+        if(PREFLEN[i] > LENMAX) {

+            LENMAX = PREFLEN[i];

+        }

+    }

+    LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));

+    JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));

+    FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));

+    for(i = 0; i < NTEMP; i++) {

+        LENCOUNT[PREFLEN[i]] ++;

+    }

+    CURLEN = 1;

+    FIRSTCODE[0] = 0;

+    LENCOUNT[0]  = 0;

+    while(CURLEN <= LENMAX) {

+        FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;

+        CURCODE = FIRSTCODE[CURLEN];

+        CURTEMP = 0;

+        while(CURTEMP < NTEMP) {

+            if(PREFLEN[CURTEMP] == CURLEN) {

+                CODES[CURTEMP] = CURCODE;

+                CURCODE = CURCODE + 1;

+            }

+            CURTEMP = CURTEMP + 1;

+        }

+        CURLEN = CURLEN + 1;

+    }

+    m_pModule->JBig2_Free(LENCOUNT);

+    m_pModule->JBig2_Free(FIRSTCODE);

+}

+void CJBig2_Context::huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP)

+{

+    int CURLEN, LENMAX, CURCODE, CURTEMP, i;

+    int *LENCOUNT;

+    int *FIRSTCODE;

+    LENMAX = 0;

+    for(i = 0; i < NTEMP; i++) {

+        if(SBSYMCODES[i].codelen > LENMAX) {

+            LENMAX = SBSYMCODES[i].codelen;

+        }

+    }

+    LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));

+    JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));

+    FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));

+    for(i = 0; i < NTEMP; i++) {

+        LENCOUNT[SBSYMCODES[i].codelen] ++;

+    }

+    CURLEN = 1;

+    FIRSTCODE[0] = 0;

+    LENCOUNT[0]  = 0;

+    while(CURLEN <= LENMAX) {

+        FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;

+        CURCODE = FIRSTCODE[CURLEN];

+        CURTEMP = 0;

+        while(CURTEMP < NTEMP) {

+            if(SBSYMCODES[CURTEMP].codelen == CURLEN) {

+                SBSYMCODES[CURTEMP].code = CURCODE;

+                CURCODE = CURCODE + 1;

+            }

+            CURTEMP = CURTEMP + 1;

+        }

+        CURLEN = CURLEN + 1;

+    }

+    m_pModule->JBig2_Free(LENCOUNT);

+    m_pModule->JBig2_Free(FIRSTCODE);

+}

diff --git a/core/src/fxcodec/jbig2/JBig2_Context.h b/core/src/fxcodec/jbig2/JBig2_Context.h
new file mode 100644
index 0000000..369dba3
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Context.h
@@ -0,0 +1,135 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_CONTEXT_H_

+#define _JBIG2_CONTEXT_H_

+#include "JBig2_Module.h"

+#include "JBig2_List.h"

+#include "JBig2_Segment.h"

+#include "JBig2_Page.h"

+#include "JBig2_GeneralDecoder.h"

+#include "../../../include/fxcodec/fx_codec_def.h"

+#include "../../../include/fxcrt/fx_basic.h"

+typedef enum {

+    JBIG2_OUT_OF_PAGE = 0,

+    JBIG2_IN_PAGE,

+} JBig2State;

+#define JBIG2_SUCCESS			 0

+#define JBIG2_FAILED			-1

+#define JBIG2_ERROR_TOO_SHORT	-2

+#define JBIG2_ERROR_FETAL		-3

+#define JBIG2_END_OF_PAGE		 2

+#define JBIG2_END_OF_FILE		 3

+#define JBIG2_ERROR_FILE_FORMAT -4

+#define JBIG2_ERROR_STREAM_TYPE -5

+#define JBIG2_ERROR_LIMIT		-6

+#define JBIG2_FILE_STREAM			0

+#define JBIG2_SQUENTIAL_STREAM		1

+#define JBIG2_RANDOM_STREAM			2

+#define JBIG2_EMBED_STREAM			3

+#define JBIG2_MIN_SEGMENT_SIZE					11

+class CJBig2_Context : public CJBig2_Object

+{

+public:

+

+    static CJBig2_Context *CreateContext(CJBig2_Module *pModule, FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,

+                                         FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause = NULL);

+

+    static void DestroyContext(CJBig2_Context *pContext);

+

+    FX_INT32 getFirstPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);

+

+    FX_INT32 getNextPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);

+

+    FX_INT32 getFirstPage(CJBig2_Image **image, IFX_Pause* pPause);

+

+    FX_INT32 getNextPage(CJBig2_Image **image, IFX_Pause* pPause);

+    FX_INT32 Continue(IFX_Pause* pPause);

+    FXCODEC_STATUS GetProcessiveStatus()

+    {

+        return m_ProcessiveStatus;

+    };

+private:

+

+    CJBig2_Context(FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,

+                   FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause);

+

+    ~CJBig2_Context();

+

+    FX_INT32 decodeFile(IFX_Pause* pPause);

+

+    FX_INT32 decode_SquentialOrgnazation(IFX_Pause* pPause);

+

+    FX_INT32 decode_EmbedOrgnazation(IFX_Pause* pPause);

+

+    FX_INT32 decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause);

+

+    FX_INT32 decode_RandomOrgnazation(IFX_Pause* pPause);

+

+    CJBig2_Segment *findSegmentByNumber(FX_DWORD dwNumber);

+

+    CJBig2_Segment *findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment, FX_BYTE cType, FX_INT32 nIndex);

+

+    FX_INT32 parseSegmentHeader(CJBig2_Segment *pSegment);

+

+    FX_INT32 parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);

+    FX_INT32 ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);

+

+    FX_INT32 parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);

+

+    FX_INT32 parseTextRegion(CJBig2_Segment *pSegment);

+

+    FX_INT32 parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);

+

+    FX_INT32 parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);

+

+    FX_INT32 parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);

+

+    FX_INT32 parseGenericRefinementRegion(CJBig2_Segment *pSegment);

+

+    FX_INT32 parseTable(CJBig2_Segment *pSegment);

+

+    FX_INT32 parseRegionInfo(JBig2RegionInfo *pRI);

+

+

+

+    JBig2HuffmanCode *decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream, FX_DWORD SBNUMSYMS);

+

+    void huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP);

+

+    void huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP);

+

+private:

+

+    CJBig2_Context *m_pGlobalContext;

+

+    FX_INT32 m_nStreamType;

+

+    CJBig2_BitStream *m_pStream;

+

+    FX_INT32 m_nState;

+

+    CJBig2_List<CJBig2_Segment> *m_pSegmentList;

+

+    CJBig2_List<JBig2PageInfo> *m_pPageInfoList;

+

+    CJBig2_Image *m_pPage;

+

+    FX_BOOL m_bBufSpecified;

+

+    FX_INT32 m_nSegmentDecoded;

+    IFX_Pause*	m_pPause;

+    FX_INT32	m_PauseStep;

+    FXCODEC_STATUS m_ProcessiveStatus;

+    FX_BOOL	m_bFirstPage;

+    CJBig2_ArithDecoder *m_pArithDecoder;

+    CJBig2_GRDProc *m_pGRD;

+    JBig2ArithCtx *m_gbContext;

+    CJBig2_Segment *m_pSegment;

+    FX_DWORD m_dwOffset;

+    JBig2RegionInfo m_ri;

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_Define.h b/core/src/fxcodec/jbig2/JBig2_Define.h
new file mode 100644
index 0000000..1019b6a
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Define.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_DEFINE_H_

+#define _JBIG2_DEFINE_H_

+#include "../../../include/fxcrt/fx_system.h"

+#define JBIG2_memset	FXSYS_memset8

+#define JBIG2_memcmp	FXSYS_memcmp32

+#define JBIG2_memcpy	FXSYS_memcpy32

+#include "JBig2_Object.h"

+#define JBIG2_OOB			1

+typedef struct {

+    FX_INT32 width,

+             height;

+    FX_INT32 x,

+             y;

+    FX_BYTE flags;

+} JBig2RegionInfo;

+typedef struct {

+    FX_INT32 codelen;

+    FX_INT32 code;

+} JBig2HuffmanCode;

+extern "C" {

+    void _FaxG4Decode(void *pModule, FX_LPCBYTE src_buf, FX_DWORD src_size, int* pbitpos, FX_LPBYTE dest_buf, int width, int height, int pitch = 0);

+};

+#define JBIG2_MAX_REFERRED_SEGMENT_COUNT		64

+#define JBIG2_MAX_EXPORT_SYSMBOLS				65535

+#define JBIG2_MAX_NEW_SYSMBOLS					65535

+#define JBIG2_MAX_PATTERN_INDEX					65535

+#define JBIG2_MAX_IMAGE_SIZE					65535

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp
new file mode 100644
index 0000000..9aa714a
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp
@@ -0,0 +1,4290 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "JBig2_GeneralDecoder.h"

+#include "JBig2_ArithDecoder.h"

+#include "JBig2_ArithIntDecoder.h"

+#include "JBig2_HuffmanDecoder.h"

+#include "JBig2_HuffmanTable.h"

+#include "JBig2_PatternDict.h"

+CJBig2_Image *CJBig2_GRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    if (GBW == 0 || GBH == 0) {

+        CJBig2_Image* pImage;

+        JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));

+        return pImage;

+    }

+    if(GBTEMPLATE == 0) {

+        if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)

+                && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1)

+                && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2)

+                && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) {

+            return decode_Arith_Template0_opt3(pArithDecoder, gbContext);

+        } else {

+            return decode_Arith_Template0_unopt(pArithDecoder, gbContext);

+        }

+    } else if(GBTEMPLATE == 1) {

+        if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) {

+            return decode_Arith_Template1_opt3(pArithDecoder, gbContext);

+        } else {

+            return decode_Arith_Template1_unopt(pArithDecoder, gbContext);

+        }

+    } else if(GBTEMPLATE == 2) {

+        if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {

+            return decode_Arith_Template2_opt3(pArithDecoder, gbContext);

+        } else {

+            return decode_Arith_Template2_unopt(pArithDecoder, gbContext);

+        }

+    } else {

+        if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {

+            return decode_Arith_Template3_opt3(pArithDecoder, gbContext);

+        } else {

+            return decode_Arith_Template3_unopt(pArithDecoder, gbContext);

+        }

+    }

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2, line3;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    GBREG->fill(0);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            line1 = GBREG->getPixel(2, h - 2);

+            line1 |= GBREG->getPixel(1, h - 2) << 1;

+            line1 |= GBREG->getPixel(0, h - 2) << 2;

+            line2 = GBREG->getPixel(3, h - 1);

+            line2 |= GBREG->getPixel(2, h - 1) << 1;

+            line2 |= GBREG->getPixel(1, h - 1) << 2;

+            line2 |= GBREG->getPixel(0, h - 1) << 3;

+            line3 = 0;

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, h)) {

+                    bVal = 0;

+                } else {

+                    CONTEXT = line3;

+                    CONTEXT |= line2 << 4;

+                    CONTEXT |= line1 << 11;

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                }

+                if(bVal) {

+                    GBREG->setPixel(w, h, bVal);

+                }

+                line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x1f;

+                line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x7f;

+                line3 = ((line3 << 1) | bVal) & 0x0f;

+            }

+        }

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2;

+    FX_BYTE *pLine, cVal;

+    FX_INTPTR nStride, nStride2;

+    FX_INT32 nBits, k;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    if (GBREG->m_pData == NULL) {

+        delete GBREG;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        return NULL;

+    }

+    pLine = GBREG->m_pData;

+    nStride = GBREG->m_nStride;

+    nStride2 = nStride << 1;

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            line1 = (h > 1) ? pLine[-nStride2] << 6 : 0;

+            line2 = (h > 0) ? pLine[-nStride] : 0;

+            CONTEXT = (line1 & 0xf800) | (line2 & 0x07f0);

+            for(FX_DWORD w = 0; w < GBW; w += 8) {

+                if(w + 8 < GBW) {

+                    nBits = 8;

+                    if(h > 1) {

+                        line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 6);

+                    }

+                    if(h > 0) {

+                        line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);

+                    }

+                } else {

+                    nBits = GBW - w;

+                    if(h > 1) {

+                        line1 <<= 8;

+                    }

+                    if(h > 0) {

+                        line2 <<= 8;

+                    }

+                }

+                cVal = 0;

+                for(k = 0; k < nBits; k++) {

+                    if(USESKIP && SKIP->getPixel(w, h)) {

+                        bVal = 0;

+                    } else {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    }

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bVal

+                              | ((line1 >> (7 - k)) & 0x0800)

+                              | ((line2 >> (7 - k)) & 0x0010);

+                }

+                pLine[w >> 3] = cVal;

+            }

+        }

+        pLine += nStride;

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2;

+    FX_BYTE *pLine, *pLine1, *pLine2, cVal;

+    FX_INT32 nStride, nStride2, k;

+    FX_INT32 nLineBytes, nBitsLeft, cc;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    if (GBREG->m_pData == NULL) {

+        delete GBREG;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        return NULL;

+    }

+    pLine = GBREG->m_pData;

+    nStride = GBREG->m_nStride;

+    nStride2 = nStride << 1;

+    nLineBytes = ((GBW + 7) >> 3) - 1;

+    nBitsLeft = GBW - (nLineBytes << 3);

+    FX_DWORD height = GBH & 0x7fffffff;

+    for(FX_DWORD h = 0; h < height; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            if(h > 1) {

+                pLine1 = pLine - nStride2;

+                pLine2 = pLine - nStride;

+                line1 = (*pLine1++) << 6;

+                line2 = *pLine2++;

+                CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0));

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    line1 = (line1 << 8) | ((*pLine1++) << 6);

+                    line2 = (line2 << 8) | (*pLine2++);

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal

+                                   | ((line1 >> k) & 0x0800)

+                                   | ((line2 >> k) & 0x0010));

+                    }

+                    pLine[cc] = cVal;

+                }

+                line1 <<= 8;

+                line2 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal

+                               | ((line1 >> (7 - k)) & 0x0800)

+                               | ((line2 >> (7 - k)) & 0x0010));

+                }

+                pLine[nLineBytes] = cVal;

+            } else {

+                pLine2 = pLine - nStride;

+                line2 = (h & 1) ? (*pLine2++) : 0;

+                CONTEXT = (line2 & 0x07f0);

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    if(h & 1) {

+                        line2 = (line2 << 8) | (*pLine2++);

+                    }

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal

+                                   | ((line2 >> k) & 0x0010));

+                    }

+                    pLine[cc] = cVal;

+                }

+                line2 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal

+                               | (((line2 >> (7 - k))) & 0x0010));

+                }

+                pLine[nLineBytes] = cVal;

+            }

+        }

+        pLine += nStride;

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2, line3;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    GBREG->fill(0);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            line1 = GBREG->getPixel(1, h - 2);

+            line1 |= GBREG->getPixel(0, h - 2) << 1;

+            line2 = GBREG->getPixel(2, h - 1);

+            line2 |= GBREG->getPixel(1, h - 1) << 1;

+            line2 |= GBREG->getPixel(0, h - 1) << 2;

+            line3 = 0;

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, h)) {

+                    bVal = 0;

+                } else {

+                    CONTEXT = line3;

+                    CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;

+                    CONTEXT |= line2 << 5;

+                    CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;

+                    CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;

+                    CONTEXT |= line1 << 12;

+                    CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                }

+                if(bVal) {

+                    GBREG->setPixel(w, h, bVal);

+                }

+                line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;

+                line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;

+                line3 = ((line3 << 1) | bVal) & 0x0f;

+            }

+        }

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2, line3;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    GBREG->fill(0);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            line1 = GBREG->getPixel(2, h - 2);

+            line1 |= GBREG->getPixel(1, h - 2) << 1;

+            line1 |= GBREG->getPixel(0, h - 2) << 2;

+            line2 = GBREG->getPixel(3, h - 1);

+            line2 |= GBREG->getPixel(2, h - 1) << 1;

+            line2 |= GBREG->getPixel(1, h - 1) << 2;

+            line2 |= GBREG->getPixel(0, h - 1) << 3;

+            line3 = 0;

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, h)) {

+                    bVal = 0;

+                } else {

+                    CONTEXT = line3;

+                    CONTEXT |= line2 << 3;

+                    CONTEXT |= line1 << 9;

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                }

+                if(bVal) {

+                    GBREG->setPixel(w, h, bVal);

+                }

+                line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;

+                line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x3f;

+                line3 = ((line3 << 1) | bVal) & 0x07;

+            }

+        }

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2;

+    FX_BYTE *pLine, cVal;

+    FX_INTPTR nStride, nStride2;

+    FX_INT32 nBits, k;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    if (GBREG->m_pData == NULL) {

+        delete GBREG;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        return NULL;

+    }

+    pLine = GBREG->m_pData;

+    nStride = GBREG->m_nStride;

+    nStride2 = nStride << 1;

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            line1 = (h > 1) ? pLine[-nStride2] << 4 : 0;

+            line2 = (h > 0) ? pLine[-nStride] : 0;

+            CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);

+            for(FX_DWORD w = 0; w < GBW; w += 8) {

+                if(w + 8 < GBW) {

+                    nBits = 8;

+                    if(h > 1) {

+                        line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 4);

+                    }

+                    if(h > 0) {

+                        line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);

+                    }

+                } else {

+                    nBits = GBW - w;

+                    if(h > 1) {

+                        line1 <<= 8;

+                    }

+                    if(h > 0) {

+                        line2 <<= 8;

+                    }

+                }

+                cVal = 0;

+                for(k = 0; k < nBits; k++) {

+                    if(USESKIP && SKIP->getPixel(w, h)) {

+                        bVal = 0;

+                    } else {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    }

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal

+                              | ((line1 >> (7 - k)) & 0x0200)

+                              | ((line2 >> (8 - k)) & 0x0008);

+                }

+                pLine[w >> 3] = cVal;

+            }

+        }

+        pLine += nStride;

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2;

+    FX_BYTE *pLine, *pLine1, *pLine2, cVal;

+    FX_INT32 nStride, nStride2, k;

+    FX_INT32 nLineBytes, nBitsLeft, cc;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    if (GBREG->m_pData == NULL) {

+        delete GBREG;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        return NULL;

+    }

+    pLine = GBREG->m_pData;

+    nStride = GBREG->m_nStride;

+    nStride2 = nStride << 1;

+    nLineBytes = ((GBW + 7) >> 3) - 1;

+    nBitsLeft = GBW - (nLineBytes << 3);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            if(h > 1) {

+                pLine1 = pLine - nStride2;

+                pLine2 = pLine - nStride;

+                line1 = (*pLine1++) << 4;

+                line2 = *pLine2++;

+                CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    line1 = (line1 << 8) | ((*pLine1++) << 4);

+                    line2 = (line2 << 8) | (*pLine2++);

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal

+                                  | ((line1 >> k) & 0x0200)

+                                  | ((line2 >> (k + 1)) & 0x0008);

+                    }

+                    pLine[cc] = cVal;

+                }

+                line1 <<= 8;

+                line2 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal

+                              | ((line1 >> (7 - k)) & 0x0200)

+                              | ((line2 >> (8 - k)) & 0x0008);

+                }

+                pLine[nLineBytes] = cVal;

+            } else {

+                pLine2 = pLine - nStride;

+                line2 = (h & 1) ? (*pLine2++) : 0;

+                CONTEXT = (line2 >> 1) & 0x01f8;

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    if(h & 1) {

+                        line2 = (line2 << 8) | (*pLine2++);

+                    }

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal

+                                  | ((line2 >> (k + 1)) & 0x0008);

+                    }

+                    pLine[cc] = cVal;

+                }

+                line2 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal

+                              | ((line2 >> (8 - k)) & 0x0008);

+                }

+                pLine[nLineBytes] = cVal;

+            }

+        }

+        pLine += nStride;

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2, line3;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    GBREG->fill(0);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            line1 = GBREG->getPixel(2, h - 2);

+            line1 |= GBREG->getPixel(1, h - 2) << 1;

+            line1 |= GBREG->getPixel(0, h - 2) << 2;

+            line2 = GBREG->getPixel(2, h - 1);

+            line2 |= GBREG->getPixel(1, h - 1) << 1;

+            line2 |= GBREG->getPixel(0, h - 1) << 2;

+            line3 = 0;

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, h)) {

+                    bVal = 0;

+                } else {

+                    CONTEXT = line3;

+                    CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;

+                    CONTEXT |= line2 << 4;

+                    CONTEXT |= line1 << 9;

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                }

+                if(bVal) {

+                    GBREG->setPixel(w, h, bVal);

+                }

+                line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;

+                line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;

+                line3 = ((line3 << 1) | bVal) & 0x07;

+            }

+        }

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2, line3;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    GBREG->fill(0);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            line1 = GBREG->getPixel(1, h - 2);

+            line1 |= GBREG->getPixel(0, h - 2) << 1;

+            line2 = GBREG->getPixel(2, h - 1);

+            line2 |= GBREG->getPixel(1, h - 1) << 1;

+            line2 |= GBREG->getPixel(0, h - 1) << 2;

+            line3 = 0;

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, h)) {

+                    bVal = 0;

+                } else {

+                    CONTEXT = line3;

+                    CONTEXT |= line2 << 2;

+                    CONTEXT |= line1 << 7;

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                }

+                if(bVal) {

+                    GBREG->setPixel(w, h, bVal);

+                }

+                line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;

+                line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;

+                line3 = ((line3 << 1) | bVal) & 0x03;

+            }

+        }

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2;

+    FX_BYTE *pLine, cVal;

+    FX_INTPTR nStride, nStride2;

+    FX_INT32 nBits, k;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    if (GBREG->m_pData == NULL) {

+        delete GBREG;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        return NULL;

+    }

+    pLine = GBREG->m_pData;

+    nStride = GBREG->m_nStride;

+    nStride2 = nStride << 1;

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            line1 = (h > 1) ? pLine[-nStride2] << 1 : 0;

+            line2 = (h > 0) ? pLine[-nStride] : 0;

+            CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);

+            for(FX_DWORD w = 0; w < GBW; w += 8) {

+                if(w + 8 < GBW) {

+                    nBits = 8;

+                    if(h > 1) {

+                        line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 1);

+                    }

+                    if(h > 0) {

+                        line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);

+                    }

+                } else {

+                    nBits = GBW - w;

+                    if(h > 1) {

+                        line1 <<= 8;

+                    }

+                    if(h > 0) {

+                        line2 <<= 8;

+                    }

+                }

+                cVal = 0;

+                for(k = 0; k < nBits; k++) {

+                    if(USESKIP && SKIP->getPixel(w, h)) {

+                        bVal = 0;

+                    } else {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    }

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal

+                              | ((line1 >> (7 - k)) & 0x0080)

+                              | ((line2 >> (10 - k)) & 0x0004);

+                }

+                pLine[w >> 3] = cVal;

+            }

+        }

+        pLine += nStride;

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2;

+    FX_BYTE *pLine, *pLine1, *pLine2, cVal;

+    FX_INT32 nStride, nStride2, k;

+    FX_INT32 nLineBytes, nBitsLeft, cc;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    if (GBREG->m_pData == NULL) {

+        delete GBREG;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        return NULL;

+    }

+    pLine = GBREG->m_pData;

+    nStride = GBREG->m_nStride;

+    nStride2 = nStride << 1;

+    nLineBytes = ((GBW + 7) >> 3) - 1;

+    nBitsLeft = GBW - (nLineBytes << 3);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            if(h > 1) {

+                pLine1 = pLine - nStride2;

+                pLine2 = pLine - nStride;

+                line1 = (*pLine1++) << 1;

+                line2 = *pLine2++;

+                CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    line1 = (line1 << 8) | ((*pLine1++) << 1);

+                    line2 = (line2 << 8) | (*pLine2++);

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal

+                                  | ((line1 >> k) & 0x0080)

+                                  | ((line2 >> (k + 3)) & 0x0004);

+                    }

+                    pLine[cc] = cVal;

+                }

+                line1 <<= 8;

+                line2 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal

+                              | ((line1 >> (7 - k)) & 0x0080)

+                              | ((line2 >> (10 - k)) & 0x0004);

+                }

+                pLine[nLineBytes] = cVal;

+            } else {

+                pLine2 = pLine - nStride;

+                line2 = (h & 1) ? (*pLine2++) : 0;

+                CONTEXT = (line2 >> 3) & 0x007c;

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    if(h & 1) {

+                        line2 = (line2 << 8) | (*pLine2++);

+                    }

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal

+                                  | ((line2 >> (k + 3)) & 0x0004);

+                    }

+                    pLine[cc] = cVal;

+                }

+                line2 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal

+                              | (((line2 >> (10 - k))) & 0x0004);

+                }

+                pLine[nLineBytes] = cVal;

+            }

+        }

+        pLine += nStride;

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2, line3;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    GBREG->fill(0);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            line1 = GBREG->getPixel(1, h - 2);

+            line1 |= GBREG->getPixel(0, h - 2) << 1;

+            line2 = GBREG->getPixel(1, h - 1);

+            line2 |= GBREG->getPixel(0, h - 1) << 1;

+            line3 = 0;

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, h)) {

+                    bVal = 0;

+                } else {

+                    CONTEXT = line3;

+                    CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;

+                    CONTEXT |= line2 << 3;

+                    CONTEXT |= line1 << 7;

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                }

+                if(bVal) {

+                    GBREG->setPixel(w, h, bVal);

+                }

+                line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;

+                line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;

+                line3 = ((line3 << 1) | bVal) & 0x03;

+            }

+        }

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    GBREG->fill(0);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            line1 = GBREG->getPixel(2, h - 1);

+            line1 |= GBREG->getPixel(1, h - 1) << 1;

+            line1 |= GBREG->getPixel(0, h - 1) << 2;

+            line2 = 0;

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, h)) {

+                    bVal = 0;

+                } else {

+                    CONTEXT = line2;

+                    CONTEXT |= line1 << 4;

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                }

+                if(bVal) {

+                    GBREG->setPixel(w, h, bVal);

+                }

+                line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x3f;

+                line2 = ((line2 << 1) | bVal) & 0x0f;

+            }

+        }

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1;

+    FX_BYTE *pLine, cVal;

+    FX_INTPTR nStride, nStride2;

+    FX_INT32 nBits, k;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    if (GBREG->m_pData == NULL) {

+        delete GBREG;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        return NULL;

+    }

+    pLine = GBREG->m_pData;

+    nStride = GBREG->m_nStride;

+    nStride2 = nStride << 1;

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            line1 = (h > 0) ? pLine[-nStride] : 0;

+            CONTEXT = (line1 >> 1) & 0x03f0;

+            for(FX_DWORD w = 0; w < GBW; w += 8) {

+                if(w + 8 < GBW) {

+                    nBits = 8;

+                    if(h > 0) {

+                        line1 = (line1 << 8) | (pLine[-nStride + (w >> 3) + 1]);

+                    }

+                } else {

+                    nBits = GBW - w;

+                    if(h > 0) {

+                        line1 <<= 8;

+                    }

+                }

+                cVal = 0;

+                for(k = 0; k < nBits; k++) {

+                    if(USESKIP && SKIP->getPixel(w, h)) {

+                        bVal = 0;

+                    } else {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    }

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal

+                              | ((line1 >> (8 - k)) & 0x0010);

+                }

+                pLine[w >> 3] = cVal;

+            }

+        }

+        pLine += nStride;

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1;

+    FX_BYTE *pLine, *pLine1, cVal;

+    FX_INT32 nStride, k;

+    FX_INT32 nLineBytes, nBitsLeft, cc;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    if (GBREG->m_pData == NULL) {

+        delete GBREG;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        return NULL;

+    }

+    pLine = GBREG->m_pData;

+    nStride = GBREG->m_nStride;

+    nLineBytes = ((GBW + 7) >> 3) - 1;

+    nBitsLeft = GBW - (nLineBytes << 3);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            if(h > 0) {

+                pLine1 = pLine - nStride;

+                line1 = *pLine1++;

+                CONTEXT = (line1 >> 1) & 0x03f0;

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    line1 = (line1 << 8) | (*pLine1++);

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal

+                                  | ((line1 >> (k + 1)) & 0x0010);

+                    }

+                    pLine[cc] = cVal;

+                }

+                line1 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal

+                              | ((line1 >> (8 - k)) & 0x0010);

+                }

+                pLine[nLineBytes] = cVal;

+            } else {

+                CONTEXT = 0;

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;

+                    }

+                    pLine[cc] = cVal;

+                }

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;

+                }

+                pLine[nLineBytes] = cVal;

+            }

+        }

+        pLine += nStride;

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    GBREG->fill(0);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            line1 = GBREG->getPixel(1, h - 1);

+            line1 |= GBREG->getPixel(0, h - 1) << 1;

+            line2 = 0;

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, h)) {

+                    bVal = 0;

+                } else {

+                    CONTEXT = line2;

+                    CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;

+                    CONTEXT |= line1 << 5;

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                }

+                if(bVal) {

+                    GBREG->setPixel(w, h, bVal);

+                }

+                line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;

+                line2 = ((line2 << 1) | bVal) & 0x0f;

+            }

+        }

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG;

+    FX_DWORD line1, line2, line3;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    GBREG->fill(0);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            switch(GBTEMPLATE) {

+                case 0:

+                    CONTEXT = 0x9b25;

+                    break;

+                case 1:

+                    CONTEXT = 0x0795;

+                    break;

+                case 2:

+                    CONTEXT = 0x00e5;

+                    break;

+                case 3:

+                    CONTEXT = 0x0195;

+                    break;

+            }

+            SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(h, h - 1);

+        } else {

+            switch(GBTEMPLATE) {

+                case 0: {

+                        line1 = GBREG->getPixel(1, h - 2);

+                        line1 |= GBREG->getPixel(0, h - 2) << 1;

+                        line2 = GBREG->getPixel(2, h - 1);

+                        line2 |= GBREG->getPixel(1, h - 1) << 1;

+                        line2 |= GBREG->getPixel(0, h - 1) << 2;

+                        line3 = 0;

+                        for(FX_DWORD w = 0; w < GBW; w++) {

+                            if(USESKIP && SKIP->getPixel(w, h)) {

+                                bVal = 0;

+                            } else {

+                                CONTEXT = line3;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;

+                                CONTEXT |= line2 << 5;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;

+                                CONTEXT |= line1 << 12;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;

+                                bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                            }

+                            if(bVal) {

+                                GBREG->setPixel(w, h, bVal);

+                            }

+                            line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;

+                            line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;

+                            line3 = ((line3 << 1) | bVal) & 0x0f;

+                        }

+                    }

+                    break;

+                case 1: {

+                        line1 = GBREG->getPixel(2, h - 2);

+                        line1 |= GBREG->getPixel(1, h - 2) << 1;

+                        line1 |= GBREG->getPixel(0, h - 2) << 2;

+                        line2 = GBREG->getPixel(2, h - 1);

+                        line2 |= GBREG->getPixel(1, h - 1) << 1;

+                        line2 |= GBREG->getPixel(0, h - 1) << 2;

+                        line3 = 0;

+                        for(FX_DWORD w = 0; w < GBW; w++) {

+                            if(USESKIP && SKIP->getPixel(w, h)) {

+                                bVal = 0;

+                            } else {

+                                CONTEXT = line3;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;

+                                CONTEXT |= line2 << 4;

+                                CONTEXT |= line1 << 9;

+                                bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                            }

+                            if(bVal) {

+                                GBREG->setPixel(w, h, bVal);

+                            }

+                            line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;

+                            line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;

+                            line3 = ((line3 << 1) | bVal) & 0x07;

+                        }

+                    }

+                    break;

+                case 2: {

+                        line1 = GBREG->getPixel(1, h - 2);

+                        line1 |= GBREG->getPixel(0, h - 2) << 1;

+                        line2 = GBREG->getPixel(1, h - 1);

+                        line2 |= GBREG->getPixel(0, h - 1) << 1;

+                        line3 = 0;

+                        for(FX_DWORD w = 0; w < GBW; w++) {

+                            if(USESKIP && SKIP->getPixel(w, h)) {

+                                bVal = 0;

+                            } else {

+                                CONTEXT = line3;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;

+                                CONTEXT |= line2 << 3;

+                                CONTEXT |= line1 << 7;

+                                bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                            }

+                            if(bVal) {

+                                GBREG->setPixel(w, h, bVal);

+                            }

+                            line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;

+                            line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;

+                            line3 = ((line3 << 1) | bVal) & 0x03;

+                        }

+                    }

+                    break;

+                case 3: {

+                        line1 = GBREG->getPixel(1, h - 1);

+                        line1 |= GBREG->getPixel(0, h - 1) << 1;

+                        line2 = 0;

+                        for(FX_DWORD w = 0; w < GBW; w++) {

+                            if(USESKIP && SKIP->getPixel(w, h)) {

+                                bVal = 0;

+                            } else {

+                                CONTEXT = line2;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;

+                                CONTEXT |= line1 << 5;

+                                bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                            }

+                            if(bVal) {

+                                GBREG->setPixel(w, h, bVal);

+                            }

+                            line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;

+                            line2 = ((line2 << 1) | bVal) & 0x0f;

+                        }

+                    }

+                    break;

+            }

+        }

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT = 0;

+    CJBig2_Image *GBREG;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    GBREG->fill(0);

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            switch(GBTEMPLATE) {

+                case 0:

+                    CONTEXT = 0x9b25;

+                    break;

+                case 1:

+                    CONTEXT = 0x0795;

+                    break;

+                case 2:

+                    CONTEXT = 0x00e5;

+                    break;

+                case 3:

+                    CONTEXT = 0x0195;

+                    break;

+            }

+            SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                GBREG->setPixel(w, h, GBREG->getPixel(w, h - 1));

+            }

+        } else {

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, h)) {

+                    GBREG->setPixel(w, h, 0);

+                } else {

+                    CONTEXT = 0;

+                    switch(GBTEMPLATE) {

+                        case 0:

+                            CONTEXT |= GBREG->getPixel(w - 1, h);

+                            CONTEXT |= GBREG->getPixel(w - 2, h) << 1;

+                            CONTEXT |= GBREG->getPixel(w - 3, h) << 2;

+                            CONTEXT |= GBREG->getPixel(w - 4, h) << 3;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;

+                            CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 5;

+                            CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 6;

+                            CONTEXT |= GBREG->getPixel(w, h - 1) << 7;

+                            CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 8;

+                            CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 9;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;

+                            CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 12;

+                            CONTEXT |= GBREG->getPixel(w, h - 2) << 13;

+                            CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 14;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;

+                            break;

+                        case 1:

+                            CONTEXT |= GBREG->getPixel(w - 1, h);

+                            CONTEXT |= GBREG->getPixel(w - 2, h) << 1;

+                            CONTEXT |= GBREG->getPixel(w - 3, h) << 2;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;

+                            CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 4;

+                            CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;

+                            CONTEXT |= GBREG->getPixel(w, h - 1) << 6;

+                            CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;

+                            CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;

+                            CONTEXT |= GBREG->getPixel(w + 2, h - 2) << 9;

+                            CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 10;

+                            CONTEXT |= GBREG->getPixel(w, h - 2) << 11;

+                            CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 12;

+                            break;

+                        case 2:

+                            CONTEXT |= GBREG->getPixel(w - 1, h);

+                            CONTEXT |= GBREG->getPixel(w - 2, h) << 1;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;

+                            CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 3;

+                            CONTEXT |= GBREG->getPixel(w, h - 1) << 4;

+                            CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 5;

+                            CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 6;

+                            CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 7;

+                            CONTEXT |= GBREG->getPixel(w, h - 2) << 8;

+                            CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 9;

+                            break;

+                        case 3:

+                            CONTEXT |= GBREG->getPixel(w - 1, h);

+                            CONTEXT |= GBREG->getPixel(w - 2, h) << 1;

+                            CONTEXT |= GBREG->getPixel(w - 3, h) << 2;

+                            CONTEXT |= GBREG->getPixel(w - 4, h) << 3;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;

+                            CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;

+                            CONTEXT |= GBREG->getPixel(w, h - 1) << 6;

+                            CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;

+                            CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;

+                            CONTEXT |= GBREG->getPixel(w - 3, h - 1) << 9;

+                            break;

+                    }

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    GBREG->setPixel(w, h, bVal);

+                }

+            }

+        }

+    }

+    return GBREG;

+}

+CJBig2_Image *CJBig2_GRDProc::decode_MMR(CJBig2_BitStream *pStream)

+{

+    int bitpos, i;

+    CJBig2_Image *pImage;

+    JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));

+    if (pImage->m_pData == NULL) {

+        delete pImage;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        return NULL;

+    }

+    bitpos = (int)pStream->getBitPos();

+    _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, pImage->m_pData, GBW, GBH, pImage->m_nStride);

+    pStream->setBitPos(bitpos);

+    for(i = 0; (FX_DWORD)i < pImage->m_nStride * GBH; i++) {

+        pImage->m_pData[i] = ~pImage->m_pData[i];

+    }

+    return pImage;

+}

+CJBig2_Image *CJBig2_GRRDProc::decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)

+{

+    if (GRW == 0 || GRH == 0) {

+        CJBig2_Image* pImage;

+        JBIG2_ALLOC(pImage, CJBig2_Image(GRW, GRH));

+        return pImage;

+    }

+    if(GRTEMPLATE == 0) {

+        if((GRAT[0] == (signed char) - 1) && (GRAT[1] == (signed char) - 1)

+                && (GRAT[2] == (signed char) - 1) && (GRAT[3] == (signed char) - 1)

+                && (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {

+            return decode_Template0_opt(pArithDecoder, grContext);

+        } else {

+            return decode_Template0_unopt(pArithDecoder, grContext);

+        }

+    } else {

+        if((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {

+            return decode_Template1_opt(pArithDecoder, grContext);

+        } else {

+            return decode_Template1_unopt(pArithDecoder, grContext);

+        }

+    }

+}

+CJBig2_Image *CJBig2_GRRDProc::decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GRREG;

+    FX_DWORD line1, line2, line3, line4, line5;

+    LTP = 0;

+    JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));

+    GRREG->fill(0);

+    for(FX_DWORD h = 0; h < GRH; h++) {

+        if(TPGRON) {

+            SLTP = pArithDecoder->DECODE(&grContext[0x0010]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 0) {

+            line1 = GRREG->getPixel(1, h - 1);

+            line1 |= GRREG->getPixel(0, h - 1) << 1;

+            line2 = 0;

+            line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);

+            line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) << 1;

+            line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);

+            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;

+            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;

+            line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);

+            line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;

+            line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;

+            for(FX_DWORD w = 0; w < GRW; w++) {

+                CONTEXT = line5;

+                CONTEXT |= line4 << 3;

+                CONTEXT |= line3 << 6;

+                CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;

+                CONTEXT |= line2 << 9;

+                CONTEXT |= line1 << 10;

+                CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;

+                bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);

+                GRREG->setPixel(w, h, bVal);

+                line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;

+                line2 = ((line2 << 1) | bVal) & 0x01;

+                line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03;

+                line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;

+                line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07;

+            }

+        } else {

+            line1 = GRREG->getPixel(1, h - 1);

+            line1 |= GRREG->getPixel(0, h - 1) << 1;

+            line2 = 0;

+            line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);

+            line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) << 1;

+            line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);

+            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;

+            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;

+            line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);

+            line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;

+            line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;

+            for(FX_DWORD w = 0; w < GRW; w++) {

+                bVal = GRREFERENCE->getPixel(w, h);

+                if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))

+                        && (bVal == GRREFERENCE->getPixel(w, h - 1))

+                        && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))

+                        && (bVal == GRREFERENCE->getPixel(w - 1, h))

+                        && (bVal == GRREFERENCE->getPixel(w + 1, h))

+                        && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))

+                        && (bVal == GRREFERENCE->getPixel(w, h + 1))

+                        && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {

+                    CONTEXT = line5;

+                    CONTEXT |= line4 << 3;

+                    CONTEXT |= line3 << 6;

+                    CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;

+                    CONTEXT |= line2 << 9;

+                    CONTEXT |= line1 << 10;

+                    CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;

+                    bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);

+                }

+                GRREG->setPixel(w, h, bVal);

+                line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;

+                line2 = ((line2 << 1) | bVal) & 0x01;

+                line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03;

+                line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;

+                line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07;

+            }

+        }

+    }

+    return GRREG;

+}

+CJBig2_Image *CJBig2_GRRDProc::decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GRREG;

+    FX_DWORD line1, line1_r, line2_r, line3_r;

+    FX_BYTE *pLine, *pLineR, cVal;

+    FX_INTPTR nStride, nStrideR, nOffset;

+    FX_INT32 k, nBits;

+    FX_INT32 GRWR, GRHR;

+    FX_INT32 GRW, GRH;

+    GRW = (FX_INT32)CJBig2_GRRDProc::GRW;

+    GRH = (FX_INT32)CJBig2_GRRDProc::GRH;

+    LTP = 0;

+    JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));

+    if (GRREG->m_pData == NULL) {

+        delete GRREG;

+        m_pModule->JBig2_Error("Generic refinement region decoding procedure: Create Image Failed with width = %d, height = %d\n", GRW, GRH);

+        return NULL;

+    }

+    pLine = GRREG->m_pData;

+    pLineR = GRREFERENCE->m_pData;

+    nStride = GRREG->m_nStride;

+    nStrideR = GRREFERENCE->m_nStride;

+    GRWR = (FX_INT32)GRREFERENCE->m_nWidth;

+    GRHR = (FX_INT32)GRREFERENCE->m_nHeight;

+    if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {

+        GRREFERENCEDY = 0;

+    }

+    nOffset = -GRREFERENCEDY * nStrideR;

+    for (FX_INT32 h = 0; h < GRH; h++) {

+        if(TPGRON) {

+            SLTP = pArithDecoder->DECODE(&grContext[0x0010]);

+            LTP = LTP ^ SLTP;

+        }

+        line1 = (h > 0) ? pLine[-nStride] << 4 : 0;

+        FX_INT32 reference_h = h - GRREFERENCEDY;

+        FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);

+        FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);

+        FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);

+        line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;

+        line2_r = line2_r_ok ? pLineR[nOffset] : 0;

+        line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;

+        if(LTP == 0) {

+            CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0)

+                      | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);

+            for (FX_INT32 w = 0; w < GRW; w += 8) {

+                nBits = GRW - w > 8 ? 8 : GRW - w;

+                if (h > 0)

+                    line1 = (line1 << 8) |

+                            (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);

+                if (h > GRHR + GRREFERENCEDY + 1) {

+                    line1_r = 0;

+                    line2_r  = 0;

+                    line3_r = 0;

+                } else {

+                    if(line1_r_ok)

+                        line1_r = (line1_r << 8) |

+                                  (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);

+                    if(line2_r_ok)

+                        line2_r = (line2_r << 8) |

+                                  (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);

+                    if(line3_r_ok)

+                        line3_r = (line3_r << 8) |

+                                  (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);

+                    else {

+                        line3_r = 0;

+                    }

+                }

+                cVal = 0;

+                for (k = 0; k < nBits; k++) {

+                    bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |

+                              ((line1 >> (7 - k)) & 0x0400) |

+                              ((line1_r >> (7 - k)) & 0x0040) |

+                              ((line2_r >> (10 - k)) & 0x0008) |

+                              ((line3_r >> (13 - k)) & 0x0001);

+                }

+                pLine[w >> 3] = cVal;

+            }

+        } else {

+            CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0)

+                      | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);

+            for (FX_INT32 w = 0; w < GRW; w += 8) {

+                nBits = GRW - w > 8 ? 8 : GRW - w;

+                if (h > 0)

+                    line1 = (line1 << 8) |

+                            (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);

+                if(line1_r_ok)

+                    line1_r = (line1_r << 8) |

+                              (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);

+                if(line2_r_ok)

+                    line2_r = (line2_r << 8) |

+                              (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);

+                if(line3_r_ok)

+                    line3_r = (line3_r << 8) |

+                              (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);

+                else {

+                    line3_r = 0;

+                }

+                cVal = 0;

+                for (k = 0; k < nBits; k++) {

+                    bVal = GRREFERENCE->getPixel(w + k, h);

+                    if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1))

+                            && (bVal == GRREFERENCE->getPixel(w + k, h - 1))

+                            && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1))

+                            && (bVal == GRREFERENCE->getPixel(w + k - 1, h))

+                            && (bVal == GRREFERENCE->getPixel(w + k + 1, h))

+                            && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1))

+                            && (bVal == GRREFERENCE->getPixel(w + k, h + 1))

+                            && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) {

+                        bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);

+                    }

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |

+                              ((line1 >> (7 - k)) & 0x0400) |

+                              ((line1_r >> (7 - k)) & 0x0040) |

+                              ((line2_r >> (10 - k)) & 0x0008) |

+                              ((line3_r >> (13 - k)) & 0x0001);

+                }

+                pLine[w >> 3] = cVal;

+            }

+        }

+        pLine += nStride;

+        if (h < GRHR + GRREFERENCEDY) {

+            pLineR += nStrideR;

+        }

+    }

+    return GRREG;

+}

+CJBig2_Image *CJBig2_GRRDProc::decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GRREG;

+    FX_DWORD line1, line2, line3, line4, line5;

+    LTP = 0;

+    JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));

+    GRREG->fill(0);

+    for(FX_DWORD h = 0; h < GRH; h++) {

+        if(TPGRON) {

+            SLTP = pArithDecoder->DECODE(&grContext[0x0008]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 0) {

+            line1 = GRREG->getPixel(1, h - 1);

+            line1 |= GRREG->getPixel(0, h - 1) << 1;

+            line1 |= GRREG->getPixel(-1, h - 1) << 2;

+            line2 = 0;

+            line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1);

+            line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);

+            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;

+            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;

+            line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);

+            line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;

+            for(FX_DWORD w = 0; w < GRW; w++) {

+                CONTEXT = line5;

+                CONTEXT |= line4 << 2;

+                CONTEXT |= line3 << 5;

+                CONTEXT |= line2 << 6;

+                CONTEXT |= line1 << 7;

+                bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);

+                GRREG->setPixel(w, h, bVal);

+                line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;

+                line2 = ((line2 << 1) | bVal) & 0x01;

+                line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01;

+                line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;

+                line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03;

+            }

+        } else {

+            line1 = GRREG->getPixel(1, h - 1);

+            line1 |= GRREG->getPixel(0, h - 1) << 1;

+            line1 |= GRREG->getPixel(-1, h - 1) << 2;

+            line2 = 0;

+            line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1);

+            line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);

+            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;

+            line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;

+            line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);

+            line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;

+            for(FX_DWORD w = 0; w < GRW; w++) {

+                bVal = GRREFERENCE->getPixel(w, h);

+                if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))

+                        && (bVal == GRREFERENCE->getPixel(w, h - 1))

+                        && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))

+                        && (bVal == GRREFERENCE->getPixel(w - 1, h))

+                        && (bVal == GRREFERENCE->getPixel(w + 1, h))

+                        && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))

+                        && (bVal == GRREFERENCE->getPixel(w, h + 1))

+                        && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {

+                    CONTEXT = line5;

+                    CONTEXT |= line4 << 2;

+                    CONTEXT |= line3 << 5;

+                    CONTEXT |= line2 << 6;

+                    CONTEXT |= line1 << 7;

+                    bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);

+                }

+                GRREG->setPixel(w, h, bVal);

+                line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;

+                line2 = ((line2 << 1) | bVal) & 0x01;

+                line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01;

+                line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;

+                line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03;

+            }

+        }

+    }

+    return GRREG;

+}

+CJBig2_Image *CJBig2_GRRDProc::decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GRREG;

+    FX_DWORD line1, line1_r, line2_r, line3_r;

+    FX_BYTE *pLine, *pLineR, cVal;

+    FX_INTPTR nStride, nStrideR, nOffset;

+    FX_INT32 k, nBits;

+    FX_INT32 GRWR, GRHR;

+    FX_INT32 GRW, GRH;

+    GRW = (FX_INT32)CJBig2_GRRDProc::GRW;

+    GRH = (FX_INT32)CJBig2_GRRDProc::GRH;

+    LTP = 0;

+    JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));

+    if (GRREG->m_pData == NULL) {

+        delete GRREG;

+        m_pModule->JBig2_Error("Generic refinement region decoding procedure: Create Image Failed with width = %d, height = %d\n", GRW, GRH);

+        return NULL;

+    }

+    pLine = GRREG->m_pData;

+    pLineR = GRREFERENCE->m_pData;

+    nStride = GRREG->m_nStride;

+    nStrideR = GRREFERENCE->m_nStride;

+    GRWR = (FX_INT32)GRREFERENCE->m_nWidth;

+    GRHR = (FX_INT32)GRREFERENCE->m_nHeight;

+    if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {

+        GRREFERENCEDY = 0;

+    }

+    nOffset = -GRREFERENCEDY * nStrideR;

+    for (FX_INT32 h = 0; h < GRH; h++) {

+        if(TPGRON) {

+            SLTP = pArithDecoder->DECODE(&grContext[0x0008]);

+            LTP = LTP ^ SLTP;

+        }

+        line1 = (h > 0) ? pLine[-nStride] << 1 : 0;

+        FX_INT32 reference_h = h - GRREFERENCEDY;

+        FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);

+        FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);

+        FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);

+        line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;

+        line2_r = line2_r_ok ? pLineR[nOffset] : 0;

+        line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;

+        if(LTP == 0) {

+            CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020)

+                      | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);

+            for (FX_INT32 w = 0; w < GRW; w += 8) {

+                nBits = GRW - w > 8 ? 8 : GRW - w;

+                if (h > 0)

+                    line1 = (line1 << 8) |

+                            (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);

+                if(line1_r_ok)

+                    line1_r = (line1_r << 8) |

+                              (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);

+                if(line2_r_ok)

+                    line2_r = (line2_r << 8) |

+                              (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);

+                if(line3_r_ok)

+                    line3_r = (line3_r << 8) |

+                              (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);

+                else {

+                    line3_r = 0;

+                }

+                cVal = 0;

+                for (k = 0; k < nBits; k++) {

+                    bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |

+                              ((line1 >> (7 - k)) & 0x0080) |

+                              ((line1_r >> (9 - k)) & 0x0020) |

+                              ((line2_r >> (11 - k)) & 0x0004) |

+                              ((line3_r >> (13 - k)) & 0x0001);

+                }

+                pLine[w >> 3] = cVal;

+            }

+        } else {

+            CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020)

+                      | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);

+            for (FX_INT32 w = 0; w < GRW; w += 8) {

+                nBits = GRW - w > 8 ? 8 : GRW - w;

+                if (h > 0)

+                    line1 = (line1 << 8) |

+                            (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);

+                if(line1_r_ok)

+                    line1_r = (line1_r << 8) |

+                              (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);

+                if(line2_r_ok)

+                    line2_r = (line2_r << 8) |

+                              (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);

+                if(line3_r_ok)

+                    line3_r = (line3_r << 8) |

+                              (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);

+                else {

+                    line3_r = 0;

+                }

+                cVal = 0;

+                for (k = 0; k < nBits; k++) {

+                    bVal = GRREFERENCE->getPixel(w + k, h);

+                    if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1))

+                            && (bVal == GRREFERENCE->getPixel(w + k, h - 1))

+                            && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1))

+                            && (bVal == GRREFERENCE->getPixel(w + k - 1, h))

+                            && (bVal == GRREFERENCE->getPixel(w + k + 1, h))

+                            && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1))

+                            && (bVal == GRREFERENCE->getPixel(w + k, h + 1))

+                            && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) {

+                        bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);

+                    }

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |

+                              ((line1 >> (7 - k)) & 0x0080) |

+                              ((line1_r >> (9 - k)) & 0x0020) |

+                              ((line2_r >> (11 - k)) & 0x0004) |

+                              ((line3_r >> (13 - k)) & 0x0001);

+                }

+                pLine[w >> 3] = cVal;

+            }

+        }

+        pLine += nStride;

+        if (h < GRHR + GRREFERENCEDY) {

+            pLineR += nStrideR;

+        }

+    }

+    return GRREG;

+}

+CJBig2_Image *CJBig2_GRRDProc::decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)

+{

+    FX_BOOL LTP, SLTP, bVal;

+    FX_BOOL TPGRPIX, TPGRVAL;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GRREG;

+    LTP = 0;

+    JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));

+    GRREG->fill(0);

+    for(FX_DWORD h = 0; h < GRH; h++) {

+        if(TPGRON) {

+            switch(GRTEMPLATE) {

+                case 0:

+                    CONTEXT = 0x0010;

+                    break;

+                case 1:

+                    CONTEXT = 0x0008;

+                    break;

+            }

+            SLTP = pArithDecoder->DECODE(&grContext[CONTEXT]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 0) {

+            for(FX_DWORD w = 0; w < GRW; w++) {

+                CONTEXT = 0;

+                switch(GRTEMPLATE) {

+                    case 0:

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3;

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4;

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5;

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6;

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7;

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;

+                        CONTEXT |= GRREG->getPixel(w - 1, h) << 9;

+                        CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;

+                        CONTEXT |= GRREG->getPixel(w, h - 1) << 11;

+                        CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;

+                        break;

+                    case 1:

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2;

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3;

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4;

+                        CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5;

+                        CONTEXT |= GRREG->getPixel(w - 1, h) << 6;

+                        CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;

+                        CONTEXT |= GRREG->getPixel(w, h - 1) << 8;

+                        CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;

+                        break;

+                }

+                bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);

+                GRREG->setPixel(w, h, bVal);

+            }

+        } else {

+            for(FX_DWORD w = 0; w < GRW; w++) {

+                bVal = GRREFERENCE->getPixel(w, h);

+                if(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))

+                        && (bVal == GRREFERENCE->getPixel(w, h - 1))

+                        && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))

+                        && (bVal == GRREFERENCE->getPixel(w - 1, h))

+                        && (bVal == GRREFERENCE->getPixel(w + 1, h))

+                        && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))

+                        && (bVal == GRREFERENCE->getPixel(w, h + 1))

+                        && (bVal == GRREFERENCE->getPixel(w + 1, h + 1))) {

+                    TPGRPIX = 1;

+                    TPGRVAL = bVal;

+                } else {

+                    TPGRPIX = 0;

+                }

+                if(TPGRPIX) {

+                    GRREG->setPixel(w, h, TPGRVAL);

+                } else {

+                    CONTEXT = 0;

+                    switch(GRTEMPLATE) {

+                        case 0:

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3;

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4;

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5;

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6;

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7;

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;

+                            CONTEXT |= GRREG->getPixel(w - 1, h) << 9;

+                            CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;

+                            CONTEXT |= GRREG->getPixel(w, h - 1) << 11;

+                            CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;

+                            break;

+                        case 1:

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2;

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3;

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4;

+                            CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5;

+                            CONTEXT |= GRREG->getPixel(w - 1, h) << 6;

+                            CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;

+                            CONTEXT |= GRREG->getPixel(w, h - 1) << 8;

+                            CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;

+                            break;

+                    }

+                    bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);

+                    GRREG->setPixel(w, h, bVal);

+                }

+            }

+        }

+    }

+    return GRREG;

+}

+CJBig2_Image *CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext)

+{

+    FX_INT32 STRIPT, FIRSTS;

+    FX_DWORD NINSTANCES;

+    FX_INT32 DT, DFS, CURS;

+    FX_BYTE CURT;

+    FX_INT32 SI, TI;

+    FX_DWORD IDI;

+    CJBig2_Image *IBI;

+    FX_DWORD WI, HI;

+    FX_INT32 IDS;

+    FX_BOOL RI;

+    FX_INT32 RDWI, RDHI, RDXI, RDYI;

+    CJBig2_Image *IBOI;

+    FX_DWORD WOI, HOI;

+    CJBig2_Image *SBREG;

+    FX_BOOL bFirst;

+    FX_DWORD nTmp;

+    FX_INT32 nVal, nBits;

+    CJBig2_HuffmanDecoder *pHuffmanDecoder;

+    CJBig2_GRRDProc *pGRRD;

+    CJBig2_ArithDecoder *pArithDecoder;

+    JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));

+    JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));

+    SBREG->fill(SBDEFPIXEL);

+    if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) {

+        m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");

+        goto failed;

+    }

+    STRIPT *= SBSTRIPS;

+    STRIPT = -STRIPT;

+    FIRSTS = 0;

+    NINSTANCES = 0;

+    while(NINSTANCES < SBNUMINSTANCES) {

+        if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) {

+            m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");

+            goto failed;

+        }

+        DT *= SBSTRIPS;

+        STRIPT = STRIPT + DT;

+        bFirst = TRUE;

+        for(;;) {

+            if(bFirst) {

+                if(pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) {

+                    m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");

+                    goto failed;

+                }

+                FIRSTS = FIRSTS + DFS;

+                CURS = FIRSTS;

+                bFirst = FALSE;

+            } else {

+                nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS);

+                if(nVal == JBIG2_OOB) {

+                    break;

+                } else if(nVal != 0) {

+                    m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");

+                    goto failed;

+                } else {

+                    CURS = CURS + IDS + SBDSOFFSET;

+                }

+            }

+            if(SBSTRIPS == 1) {

+                CURT = 0;

+            } else {

+                nTmp = 1;

+                while((FX_DWORD)(1 << nTmp) < SBSTRIPS) {

+                    nTmp ++;

+                }

+                if(pStream->readNBits(nTmp, &nVal) != 0) {

+                    m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");

+                    goto failed;

+                }

+                CURT = nVal;

+            }

+            TI = STRIPT + CURT;

+            nVal = 0;

+            nBits = 0;

+            for(;;) {

+                if(pStream->read1Bit(&nTmp) != 0) {

+                    m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");

+                    goto failed;

+                }

+                nVal = (nVal << 1) | nTmp;

+                nBits ++;

+                for(IDI = 0; IDI < SBNUMSYMS; IDI++) {

+                    if((nBits == SBSYMCODES[IDI].codelen) && (nVal == SBSYMCODES[IDI].code)) {

+                        break;

+                    }

+                }

+                if(IDI < SBNUMSYMS) {

+                    break;

+                }

+            }

+            if(SBREFINE == 0) {

+                RI = 0;

+            } else {

+                if(pStream->read1Bit(&RI) != 0) {

+                    m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");

+                    goto failed;

+                }

+            }

+            if(RI == 0) {

+                IBI = SBSYMS[IDI];

+            } else {

+                if((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0)

+                        || (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0)

+                        || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0)

+                        || (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0)

+                        || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {

+                    m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");

+                    goto failed;

+                }

+                pStream->alignByte();

+                nTmp = pStream->getOffset();

+                IBOI = SBSYMS[IDI];

+                if (!IBOI) {

+                    goto failed;

+                }

+                WOI = IBOI->m_nWidth;

+                HOI = IBOI->m_nHeight;

+                if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {

+                    m_pModule->JBig2_Error("text region decoding procedure (huffman): Invalid RDWI or RDHI value.");

+                    goto failed;

+                }

+                JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());

+                pGRRD->GRW = WOI + RDWI;

+                pGRRD->GRH = HOI + RDHI;

+                pGRRD->GRTEMPLATE = SBRTEMPLATE;

+                pGRRD->GRREFERENCE = IBOI;

+                pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI;

+                pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI;

+                pGRRD->TPGRON = 0;

+                pGRRD->GRAT[0] = SBRAT[0];

+                pGRRD->GRAT[1] = SBRAT[1];

+                pGRRD->GRAT[2] = SBRAT[2];

+                pGRRD->GRAT[3] = SBRAT[3];

+                JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));

+                IBI = pGRRD->decode(pArithDecoder, grContext);

+                if(IBI == NULL) {

+                    delete pGRRD;

+                    delete pArithDecoder;

+                    goto failed;

+                }

+                delete pArithDecoder;

+                pStream->alignByte();

+                pStream->offset(2);

+                if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {

+                    delete IBI;

+                    delete pGRRD;

+                    m_pModule->JBig2_Error("text region decoding procedure (huffman):"

+                                           "bytes processed by generic refinement region decoding procedure doesn't equal SBHUFFRSIZE.");

+                    goto failed;

+                }

+                delete pGRRD;

+            }

+            if (!IBI) {

+                continue;

+            }

+            WI = IBI->m_nWidth;

+            HI = IBI->m_nHeight;

+            if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT)

+                                   || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {

+                CURS = CURS + WI - 1;

+            } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT)

+                                          || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {

+                CURS = CURS + HI - 1;

+            }

+            SI = CURS;

+            if(TRANSPOSED == 0) {

+                switch(REFCORNER) {

+                    case JBIG2_CORNER_TOPLEFT:

+                        SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);

+                        break;

+                    case JBIG2_CORNER_TOPRIGHT:

+                        SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);

+                        break;

+                    case JBIG2_CORNER_BOTTOMLEFT:

+                        SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);

+                        break;

+                    case JBIG2_CORNER_BOTTOMRIGHT:

+                        SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP);

+                        break;

+                }

+            } else {

+                switch(REFCORNER) {

+                    case JBIG2_CORNER_TOPLEFT:

+                        SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);

+                        break;

+                    case JBIG2_CORNER_TOPRIGHT:

+                        SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);

+                        break;

+                    case JBIG2_CORNER_BOTTOMLEFT:

+                        SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);

+                        break;

+                    case JBIG2_CORNER_BOTTOMRIGHT:

+                        SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP);

+                        break;

+                }

+            }

+            if(RI != 0) {

+                delete IBI;

+            }

+            if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)

+                                   || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {

+                CURS = CURS + WI - 1;

+            } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)

+                                          || (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {

+                CURS = CURS + HI - 1;

+            }

+            NINSTANCES = NINSTANCES + 1;

+        }

+    }

+    delete pHuffmanDecoder;

+    return SBREG;

+failed:

+    delete pHuffmanDecoder;

+    delete SBREG;

+    return NULL;

+}

+CJBig2_Image *CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext,

+        JBig2IntDecoderState *pIDS)

+{

+    FX_INT32 STRIPT, FIRSTS;

+    FX_DWORD NINSTANCES;

+    FX_INT32 DT, DFS, CURS;

+    FX_INT32 CURT;

+    FX_INT32 SI, TI;

+    FX_DWORD IDI;

+    CJBig2_Image *IBI;

+    FX_DWORD WI, HI;

+    FX_INT32 IDS;

+    FX_BOOL RI;

+    FX_INT32 RDWI, RDHI, RDXI, RDYI;

+    CJBig2_Image *IBOI;

+    FX_DWORD WOI, HOI;

+    CJBig2_Image *SBREG;

+    FX_BOOL bFirst;

+    FX_INT32 nRet, nVal;

+    FX_INT32 bRetained;

+    CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH, *IARDX, *IARDY;

+    CJBig2_ArithIaidDecoder *IAID;

+    CJBig2_GRRDProc *pGRRD;

+    if(pIDS) {

+        IADT = pIDS->IADT;

+        IAFS = pIDS->IAFS;

+        IADS = pIDS->IADS;

+        IAIT = pIDS->IAIT;

+        IARI = pIDS->IARI;

+        IARDW = pIDS->IARDW;

+        IARDH = pIDS->IARDH;

+        IARDX = pIDS->IARDX;

+        IARDY = pIDS->IARDY;

+        IAID = pIDS->IAID;

+        bRetained = TRUE;

+    } else {

+        JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder());

+        JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());

+        JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());

+        JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());

+        JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());

+        JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());

+        JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());

+        JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());

+        JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());

+        JBIG2_ALLOC(IAID , CJBig2_ArithIaidDecoder(SBSYMCODELEN));

+        bRetained = FALSE;

+    }

+    JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));

+    SBREG->fill(SBDEFPIXEL);

+    if(IADT->decode(pArithDecoder, &STRIPT) == -1) {

+        m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");

+        goto failed;

+    }

+    STRIPT *= SBSTRIPS;

+    STRIPT = -STRIPT;

+    FIRSTS = 0;

+    NINSTANCES = 0;

+    while(NINSTANCES < SBNUMINSTANCES) {

+        if(IADT->decode(pArithDecoder, &DT) == -1) {

+            m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");

+            goto failed;

+        }

+        DT *= SBSTRIPS;

+        STRIPT = STRIPT + DT;

+        bFirst = TRUE;

+        for(;;) {

+            if(bFirst) {

+                if(IAFS->decode(pArithDecoder, &DFS) == -1) {

+                    m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");

+                    goto failed;

+                }

+                FIRSTS = FIRSTS + DFS;

+                CURS = FIRSTS;

+                bFirst = FALSE;

+            } else {

+                nRet = IADS->decode(pArithDecoder, &IDS);

+                if(nRet == JBIG2_OOB) {

+                    break;

+                } else if(nRet != 0) {

+                    m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");

+                    goto failed;

+                } else {

+                    CURS = CURS + IDS + SBDSOFFSET;

+                }

+            }

+            if (NINSTANCES >= SBNUMINSTANCES) {

+                break;

+            }

+            if(SBSTRIPS == 1) {

+                CURT = 0;

+            } else {

+                if(IAIT->decode(pArithDecoder, &nVal) == -1) {

+                    m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");

+                    goto failed;

+                }

+                CURT = nVal;

+            }

+            TI = STRIPT + CURT;

+            if(IAID->decode(pArithDecoder, &nVal) == -1) {

+                m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");

+                goto failed;

+            }

+            IDI = nVal;

+            if(IDI >= SBNUMSYMS) {

+                m_pModule->JBig2_Error("text region decoding procedure (arith): symbol id out of range.(%d/%d)",

+                                       IDI, SBNUMSYMS);

+                goto failed;

+            }

+            if(SBREFINE == 0) {

+                RI = 0;

+            } else {

+                if(IARI->decode(pArithDecoder, &RI) == -1) {

+                    m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");

+                    goto failed;

+                }

+            }

+            if (!SBSYMS[IDI]) {

+                goto failed;

+            }

+            if(RI == 0) {

+                IBI = SBSYMS[IDI];

+            } else {

+                if((IARDW->decode(pArithDecoder, &RDWI) == -1)

+                        || (IARDH->decode(pArithDecoder, &RDHI) == -1)

+                        || (IARDX->decode(pArithDecoder, &RDXI) == -1)

+                        || (IARDY->decode(pArithDecoder, &RDYI) == -1)) {

+                    m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");

+                    goto failed;

+                }

+                IBOI = SBSYMS[IDI];

+                WOI = IBOI->m_nWidth;

+                HOI = IBOI->m_nHeight;

+                if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {

+                    m_pModule->JBig2_Error("text region decoding procedure (arith): Invalid RDWI or RDHI value.");

+                    goto failed;

+                }

+                JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());

+                pGRRD->GRW = WOI + RDWI;

+                pGRRD->GRH = HOI + RDHI;

+                pGRRD->GRTEMPLATE = SBRTEMPLATE;

+                pGRRD->GRREFERENCE = IBOI;

+                pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI;

+                pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI;

+                pGRRD->TPGRON = 0;

+                pGRRD->GRAT[0] = SBRAT[0];

+                pGRRD->GRAT[1] = SBRAT[1];

+                pGRRD->GRAT[2] = SBRAT[2];

+                pGRRD->GRAT[3] = SBRAT[3];

+                IBI = pGRRD->decode(pArithDecoder, grContext);

+                if(IBI == NULL) {

+                    delete pGRRD;

+                    goto failed;

+                }

+                delete pGRRD;

+            }

+            WI = IBI->m_nWidth;

+            HI = IBI->m_nHeight;

+            if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT)

+                                   || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {

+                CURS = CURS + WI - 1;

+            } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT)

+                                          || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {

+                CURS = CURS + HI - 1;

+            }

+            SI = CURS;

+            if(TRANSPOSED == 0) {

+                switch(REFCORNER) {

+                    case JBIG2_CORNER_TOPLEFT:

+                        SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);

+                        break;

+                    case JBIG2_CORNER_TOPRIGHT:

+                        SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);

+                        break;

+                    case JBIG2_CORNER_BOTTOMLEFT:

+                        SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);

+                        break;

+                    case JBIG2_CORNER_BOTTOMRIGHT:

+                        SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP);

+                        break;

+                }

+            } else {

+                switch(REFCORNER) {

+                    case JBIG2_CORNER_TOPLEFT:

+                        SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);

+                        break;

+                    case JBIG2_CORNER_TOPRIGHT:

+                        SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);

+                        break;

+                    case JBIG2_CORNER_BOTTOMLEFT:

+                        SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);

+                        break;

+                    case JBIG2_CORNER_BOTTOMRIGHT:

+                        SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP);

+                        break;

+                }

+            }

+            if(RI != 0) {

+                delete IBI;

+            }

+            if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)

+                                   || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {

+                CURS = CURS + WI - 1;

+            } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)

+                                          || (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {

+                CURS = CURS + HI - 1;

+            }

+            NINSTANCES = NINSTANCES + 1;

+        }

+    }

+    if(bRetained == FALSE) {

+        delete IADT;

+        delete IAFS;

+        delete IADS;

+        delete IAIT;

+        delete IARI;

+        delete IARDW;

+        delete IARDH;

+        delete IARDX;

+        delete IARDY;

+        delete IAID;

+    }

+    return SBREG;

+failed:

+    if(bRetained == FALSE) {

+        delete IADT;

+        delete IAFS;

+        delete IADS;

+        delete IAIT;

+        delete IARI;

+        delete IARDW;

+        delete IARDH;

+        delete IARDX;

+        delete IARDY;

+        delete IAID;

+    }

+    delete SBREG;

+    return NULL;

+}

+CJBig2_SymbolDict *CJBig2_SDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,

+        JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext)

+{

+    CJBig2_Image **SDNEWSYMS;

+    FX_DWORD HCHEIGHT, NSYMSDECODED;

+    FX_INT32 HCDH;

+    FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM;

+    FX_INT32 DW;

+    CJBig2_Image *BS;

+    FX_DWORD I, J, REFAGGNINST;

+    FX_BOOL *EXFLAGS;

+    FX_DWORD EXINDEX;

+    FX_BOOL CUREXFLAG;

+    FX_DWORD EXRUNLENGTH;

+    FX_INT32 nVal;

+    FX_DWORD nTmp;

+    FX_BOOL SBHUFF;

+    FX_DWORD SBNUMSYMS;

+    FX_BYTE SBSYMCODELEN;

+    FX_DWORD IDI;

+    FX_INT32 RDXI, RDYI;

+    CJBig2_Image **SBSYMS;

+    CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY,

+                        *SBHUFFRSIZE;

+    CJBig2_GRRDProc *pGRRD;

+    CJBig2_GRDProc *pGRD;

+    CJBig2_ArithIntDecoder *IADH, *IADW, *IAAI, *IARDX, *IARDY, *IAEX,

+                           *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH;

+    CJBig2_ArithIaidDecoder *IAID;

+    CJBig2_SymbolDict *pDict;

+    JBIG2_ALLOC(IADH, CJBig2_ArithIntDecoder());

+    JBIG2_ALLOC(IADW, CJBig2_ArithIntDecoder());

+    JBIG2_ALLOC(IAAI, CJBig2_ArithIntDecoder());

+    JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());

+    JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());

+    JBIG2_ALLOC(IAEX, CJBig2_ArithIntDecoder());

+    JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder());

+    JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());

+    JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());

+    JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());

+    JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());

+    JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());

+    JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());

+    nTmp = 0;

+    while((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) {

+        nTmp ++;

+    }

+    JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder((FX_BYTE)nTmp));

+    SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJBig2_Image*));

+    FXSYS_memset32(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*));

+    HCHEIGHT = 0;

+    NSYMSDECODED = 0;

+    while(NSYMSDECODED < SDNUMNEWSYMS) {

+        BS = NULL;

+        if(IADH->decode(pArithDecoder, &HCDH) == -1) {

+            m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");

+            goto failed;

+        }

+        HCHEIGHT = HCHEIGHT + HCDH;

+        if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {

+            m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): invalid HCHEIGHT value.");

+            goto failed;

+        }

+        SYMWIDTH = 0;

+        TOTWIDTH = 0;

+        HCFIRSTSYM = NSYMSDECODED;

+        for(;;) {

+            nVal = IADW->decode(pArithDecoder, &DW);

+            if(nVal == JBIG2_OOB) {

+                break;

+            } else if(nVal != 0) {

+                m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");

+                goto failed;

+            } else {

+                if (NSYMSDECODED >= SDNUMNEWSYMS) {

+                    m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): NSYMSDECODED >= SDNUMNEWSYMS.");

+                    goto failed;

+                }

+                SYMWIDTH = SYMWIDTH + DW;

+                if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {

+                    m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): invalid SYMWIDTH value.");

+                    goto failed;

+                } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {

+                    TOTWIDTH = TOTWIDTH + SYMWIDTH;

+                    SDNEWSYMS[NSYMSDECODED] = NULL;

+                    NSYMSDECODED = NSYMSDECODED + 1;

+                    continue;

+                }

+                TOTWIDTH = TOTWIDTH + SYMWIDTH;

+            }

+            if(SDREFAGG == 0) {

+                JBIG2_ALLOC(pGRD, CJBig2_GRDProc());

+                pGRD->MMR = 0;

+                pGRD->GBW = SYMWIDTH;

+                pGRD->GBH = HCHEIGHT;

+                pGRD->GBTEMPLATE = SDTEMPLATE;

+                pGRD->TPGDON = 0;

+                pGRD->USESKIP = 0;

+                pGRD->GBAT[0] = SDAT[0];

+                pGRD->GBAT[1] = SDAT[1];

+                pGRD->GBAT[2] = SDAT[2];

+                pGRD->GBAT[3] = SDAT[3];

+                pGRD->GBAT[4] = SDAT[4];

+                pGRD->GBAT[5] = SDAT[5];

+                pGRD->GBAT[6] = SDAT[6];

+                pGRD->GBAT[7] = SDAT[7];

+                BS = pGRD->decode_Arith(pArithDecoder, gbContext);

+                if(BS == NULL) {

+                    delete pGRD;

+                    goto failed;

+                }

+                delete pGRD;

+            } else {

+                if(IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) {

+                    m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");

+                    goto failed;

+                }

+                if(REFAGGNINST > 1) {

+                    CJBig2_TRDProc *pDecoder;

+                    JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());

+                    pDecoder->SBHUFF = SDHUFF;

+                    pDecoder->SBREFINE = 1;

+                    pDecoder->SBW = SYMWIDTH;

+                    pDecoder->SBH = HCHEIGHT;

+                    pDecoder->SBNUMINSTANCES = REFAGGNINST;

+                    pDecoder->SBSTRIPS = 1;

+                    pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;

+                    SBNUMSYMS = pDecoder->SBNUMSYMS;

+                    nTmp = 0;

+                    while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {

+                        nTmp ++;

+                    }

+                    SBSYMCODELEN = (FX_BYTE)nTmp;

+                    pDecoder->SBSYMCODELEN = SBSYMCODELEN;

+                    SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));

+                    JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));

+                    JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));

+                    pDecoder->SBSYMS = SBSYMS;

+                    pDecoder->SBDEFPIXEL = 0;

+                    pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;

+                    pDecoder->TRANSPOSED = 0;

+                    pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;

+                    pDecoder->SBDSOFFSET = 0;

+                    JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,

+                                sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));

+                    JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,

+                                sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));

+                    JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,

+                                sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));

+                    JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,

+                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+                    JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,

+                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+                    JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,

+                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+                    JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,

+                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+                    JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,

+                                sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));

+                    pDecoder->SBHUFFFS = SBHUFFFS;

+                    pDecoder->SBHUFFDS = SBHUFFDS;

+                    pDecoder->SBHUFFDT = SBHUFFDT;

+                    pDecoder->SBHUFFRDW = SBHUFFRDW;

+                    pDecoder->SBHUFFRDH = SBHUFFRDH;

+                    pDecoder->SBHUFFRDX = SBHUFFRDX;

+                    pDecoder->SBHUFFRDY = SBHUFFRDY;

+                    pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;

+                    pDecoder->SBRTEMPLATE = SDRTEMPLATE;

+                    pDecoder->SBRAT[0] = SDRAT[0];

+                    pDecoder->SBRAT[1] = SDRAT[1];

+                    pDecoder->SBRAT[2] = SDRAT[2];

+                    pDecoder->SBRAT[3] = SDRAT[3];

+                    JBig2IntDecoderState ids;

+                    ids.IADT = IADT;

+                    ids.IAFS = IAFS;

+                    ids.IADS = IADS;

+                    ids.IAIT = IAIT;

+                    ids.IARI = IARI;

+                    ids.IARDW = IARDW;

+                    ids.IARDH = IARDH;

+                    ids.IARDX = IARDX;

+                    ids.IARDY = IARDY;

+                    ids.IAID = IAID;

+                    BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids);

+                    if(BS == NULL) {

+                        m_pModule->JBig2_Free(SBSYMS);

+                        delete SBHUFFFS;

+                        delete SBHUFFDS;

+                        delete SBHUFFDT;

+                        delete SBHUFFRDW;

+                        delete SBHUFFRDH;

+                        delete SBHUFFRDX;

+                        delete SBHUFFRDY;

+                        delete SBHUFFRSIZE;

+                        delete pDecoder;

+                        goto failed;

+                    }

+                    m_pModule->JBig2_Free(SBSYMS);

+                    delete SBHUFFFS;

+                    delete SBHUFFDS;

+                    delete SBHUFFDT;

+                    delete SBHUFFRDW;

+                    delete SBHUFFRDH;

+                    delete SBHUFFRDX;

+                    delete SBHUFFRDY;

+                    delete SBHUFFRSIZE;

+                    delete pDecoder;

+                } else if(REFAGGNINST == 1) {

+                    SBHUFF = SDHUFF;

+                    SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;

+                    if(IAID->decode(pArithDecoder, (int*)&IDI) == -1) {

+                        m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");

+                        goto failed;

+                    }

+                    if((IARDX->decode(pArithDecoder, &RDXI) == -1)

+                            || (IARDY->decode(pArithDecoder, &RDYI) == -1)) {

+                        m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");

+                        goto failed;

+                    }

+                    if (IDI >= SBNUMSYMS) {

+                        m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith):"

+                                               " refinement references unknown symbol %d", IDI);

+                        goto failed;

+                    }

+                    SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));

+                    JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));

+                    JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));

+                    if (!SBSYMS[IDI]) {

+                        m_pModule->JBig2_Free(SBSYMS);

+                        goto failed;

+                    }

+                    JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());

+                    pGRRD->GRW = SYMWIDTH;

+                    pGRRD->GRH = HCHEIGHT;

+                    pGRRD->GRTEMPLATE = SDRTEMPLATE;

+                    pGRRD->GRREFERENCE = SBSYMS[IDI];

+                    pGRRD->GRREFERENCEDX = RDXI;

+                    pGRRD->GRREFERENCEDY = RDYI;

+                    pGRRD->TPGRON = 0;

+                    pGRRD->GRAT[0] = SDRAT[0];

+                    pGRRD->GRAT[1] = SDRAT[1];

+                    pGRRD->GRAT[2] = SDRAT[2];

+                    pGRRD->GRAT[3] = SDRAT[3];

+                    BS = pGRRD->decode(pArithDecoder, grContext);

+                    if(BS == NULL) {

+                        m_pModule->JBig2_Free(SBSYMS);

+                        delete pGRRD;

+                        goto failed;

+                    }

+                    m_pModule->JBig2_Free(SBSYMS);

+                    delete pGRRD;

+                }

+            }

+            SDNEWSYMS[NSYMSDECODED] = BS;

+            BS = NULL;

+            NSYMSDECODED = NSYMSDECODED + 1;

+        }

+    }

+    EXINDEX = 0;

+    CUREXFLAG = 0;

+    EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS));

+    while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {

+        if(IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) {

+            m_pModule->JBig2_Free(EXFLAGS);

+            m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");

+            goto failed;

+        }

+        if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {

+            m_pModule->JBig2_Free(EXFLAGS);

+            m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH value.");

+            goto failed;

+        }

+        if(EXRUNLENGTH != 0) {

+            for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {

+                EXFLAGS[I] = CUREXFLAG;

+            }

+        }

+        EXINDEX = EXINDEX + EXRUNLENGTH;

+        CUREXFLAG = !CUREXFLAG;

+    }

+    JBIG2_ALLOC(pDict, CJBig2_SymbolDict());

+    pDict->SDNUMEXSYMS = SDNUMEXSYMS;

+    pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), SDNUMEXSYMS);

+    I = J = 0;

+    for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {

+        if(EXFLAGS[I] && J < SDNUMEXSYMS) {

+            if(I < SDNUMINSYMS) {

+                JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));

+            } else {

+                pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];

+            }

+            J = J + 1;

+        } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {

+            delete SDNEWSYMS[I - SDNUMINSYMS];

+        }

+    }

+    if (J < SDNUMEXSYMS) {

+        pDict->SDNUMEXSYMS = J;

+    }

+    m_pModule->JBig2_Free(EXFLAGS);

+    m_pModule->JBig2_Free(SDNEWSYMS);

+    delete IADH;

+    delete IADW;

+    delete IAAI;

+    delete IARDX;

+    delete IARDY;

+    delete IAEX;

+    delete IAID;

+    delete IADT;

+    delete IAFS;

+    delete IADS;

+    delete IAIT;

+    delete IARI;

+    delete IARDW;

+    delete IARDH;

+    return pDict;

+failed:

+    for(I = 0; I < NSYMSDECODED; I++) {

+        if (SDNEWSYMS[I]) {

+            delete SDNEWSYMS[I];

+            SDNEWSYMS[I] = NULL;

+        }

+    }

+    m_pModule->JBig2_Free(SDNEWSYMS);

+    delete IADH;

+    delete IADW;

+    delete IAAI;

+    delete IARDX;

+    delete IARDY;

+    delete IAEX;

+    delete IAID;

+    delete IADT;

+    delete IAFS;

+    delete IADS;

+    delete IAIT;

+    delete IARI;

+    delete IARDW;

+    delete IARDH;

+    return NULL;

+}

+CJBig2_SymbolDict *CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream *pStream,

+        JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause)

+{

+    CJBig2_Image **SDNEWSYMS;

+    FX_DWORD *SDNEWSYMWIDTHS;

+    FX_DWORD HCHEIGHT, NSYMSDECODED;

+    FX_INT32 HCDH;

+    FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM;

+    FX_INT32 DW;

+    CJBig2_Image *BS, *BHC;

+    FX_DWORD I, J, REFAGGNINST;

+    FX_BOOL *EXFLAGS;

+    FX_DWORD EXINDEX;

+    FX_BOOL CUREXFLAG;

+    FX_DWORD EXRUNLENGTH;

+    FX_INT32 nVal, nBits;

+    FX_DWORD nTmp;

+    FX_BOOL SBHUFF;

+    FX_DWORD SBNUMSYMS;

+    FX_BYTE SBSYMCODELEN;

+    JBig2HuffmanCode *SBSYMCODES;

+    FX_DWORD IDI;

+    FX_INT32 RDXI, RDYI;

+    FX_DWORD BMSIZE;

+    FX_DWORD stride;

+    CJBig2_Image **SBSYMS;

+    CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY,

+                        *SBHUFFRSIZE, *pTable;

+    CJBig2_HuffmanDecoder *pHuffmanDecoder;

+    CJBig2_GRRDProc *pGRRD;

+    CJBig2_ArithDecoder *pArithDecoder;

+    CJBig2_GRDProc *pGRD;

+    CJBig2_SymbolDict *pDict;

+    JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));

+    SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJBig2_Image*));

+    FXSYS_memset32(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*));

+    SDNEWSYMWIDTHS = NULL;

+    BHC = NULL;

+    if(SDREFAGG == 0) {

+        SDNEWSYMWIDTHS = (FX_DWORD *)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(FX_DWORD));

+        FXSYS_memset32(SDNEWSYMWIDTHS, 0 , SDNUMNEWSYMS * sizeof(FX_DWORD));

+    }

+    HCHEIGHT = 0;

+    NSYMSDECODED = 0;

+    BS = NULL;

+    while(NSYMSDECODED < SDNUMNEWSYMS) {

+        if(pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) {

+            m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");

+            goto failed;

+        }

+        HCHEIGHT = HCHEIGHT + HCDH;

+        if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {

+            m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): invalid HCHEIGHT value.");

+            goto failed;

+        }

+        SYMWIDTH = 0;

+        TOTWIDTH = 0;

+        HCFIRSTSYM = NSYMSDECODED;

+        for(;;) {

+            nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW);

+            if(nVal == JBIG2_OOB) {

+                break;

+            } else if(nVal != 0) {

+                m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");

+                goto failed;

+            } else {

+                if (NSYMSDECODED >= SDNUMNEWSYMS) {

+                    m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): NSYMSDECODED >= SDNUMNEWSYMS.");

+                    goto failed;

+                }

+                SYMWIDTH = SYMWIDTH + DW;

+                if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {

+                    m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): invalid SYMWIDTH value.");

+                    goto failed;

+                } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {

+                    TOTWIDTH = TOTWIDTH + SYMWIDTH;

+                    SDNEWSYMS[NSYMSDECODED] = NULL;

+                    NSYMSDECODED = NSYMSDECODED + 1;

+                    continue;

+                }

+                TOTWIDTH = TOTWIDTH + SYMWIDTH;

+            }

+            if(SDREFAGG == 1) {

+                if(pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != 0) {

+                    m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");

+                    goto failed;

+                }

+                BS = NULL;

+                if(REFAGGNINST > 1) {

+                    CJBig2_TRDProc *pDecoder;

+                    JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());

+                    pDecoder->SBHUFF = SDHUFF;

+                    pDecoder->SBREFINE = 1;

+                    pDecoder->SBW = SYMWIDTH;

+                    pDecoder->SBH = HCHEIGHT;

+                    pDecoder->SBNUMINSTANCES = REFAGGNINST;

+                    pDecoder->SBSTRIPS = 1;

+                    pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;

+                    SBNUMSYMS = pDecoder->SBNUMSYMS;

+                    SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(JBig2HuffmanCode));

+                    nTmp = 1;

+                    while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {

+                        nTmp ++;

+                    }

+                    for(I = 0; I < SBNUMSYMS; I++) {

+                        SBSYMCODES[I].codelen = nTmp;

+                        SBSYMCODES[I].code = I;

+                    }

+                    pDecoder->SBSYMCODES = SBSYMCODES;

+                    SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));

+                    JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));

+                    JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));

+                    pDecoder->SBSYMS = SBSYMS;

+                    pDecoder->SBDEFPIXEL = 0;

+                    pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;

+                    pDecoder->TRANSPOSED = 0;

+                    pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;

+                    pDecoder->SBDSOFFSET = 0;

+                    JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,

+                                sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));

+                    JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,

+                                sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));

+                    JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,

+                                sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));

+                    JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,

+                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+                    JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,

+                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+                    JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,

+                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+                    JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,

+                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+                    JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,

+                                sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));

+                    pDecoder->SBHUFFFS = SBHUFFFS;

+                    pDecoder->SBHUFFDS = SBHUFFDS;

+                    pDecoder->SBHUFFDT = SBHUFFDT;

+                    pDecoder->SBHUFFRDW = SBHUFFRDW;

+                    pDecoder->SBHUFFRDH = SBHUFFRDH;

+                    pDecoder->SBHUFFRDX = SBHUFFRDX;

+                    pDecoder->SBHUFFRDY = SBHUFFRDY;

+                    pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;

+                    pDecoder->SBRTEMPLATE = SDRTEMPLATE;

+                    pDecoder->SBRAT[0] = SDRAT[0];

+                    pDecoder->SBRAT[1] = SDRAT[1];

+                    pDecoder->SBRAT[2] = SDRAT[2];

+                    pDecoder->SBRAT[3] = SDRAT[3];

+                    BS = pDecoder->decode_Huffman(pStream, grContext);

+                    if(BS == NULL) {

+                        m_pModule->JBig2_Free(SBSYMCODES);

+                        m_pModule->JBig2_Free(SBSYMS);

+                        delete SBHUFFFS;

+                        delete SBHUFFDS;

+                        delete SBHUFFDT;

+                        delete SBHUFFRDW;

+                        delete SBHUFFRDH;

+                        delete SBHUFFRDX;

+                        delete SBHUFFRDY;

+                        delete SBHUFFRSIZE;

+                        delete pDecoder;

+                        goto failed;

+                    }

+                    m_pModule->JBig2_Free(SBSYMCODES);

+                    m_pModule->JBig2_Free(SBSYMS);

+                    delete SBHUFFFS;

+                    delete SBHUFFDS;

+                    delete SBHUFFDT;

+                    delete SBHUFFRDW;

+                    delete SBHUFFRDH;

+                    delete SBHUFFRDX;

+                    delete SBHUFFRDY;

+                    delete SBHUFFRSIZE;

+                    delete pDecoder;

+                } else if(REFAGGNINST == 1) {

+                    SBHUFF = SDHUFF;

+                    SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS;

+                    nTmp = 1;

+                    while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {

+                        nTmp ++;

+                    }

+                    SBSYMCODELEN = (FX_BYTE)nTmp;

+                    SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(JBig2HuffmanCode));

+                    for(I = 0; I < SBNUMSYMS; I++) {

+                        SBSYMCODES[I].codelen = SBSYMCODELEN;

+                        SBSYMCODES[I].code = I;

+                    }

+                    nVal = 0;

+                    nBits = 0;

+                    for(;;) {

+                        if(pStream->read1Bit(&nTmp) != 0) {

+                            m_pModule->JBig2_Free(SBSYMCODES);

+                            m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");

+                            goto failed;

+                        }

+                        nVal = (nVal << 1) | nTmp;

+                        for(IDI = 0; IDI < SBNUMSYMS; IDI++) {

+                            if((nVal == SBSYMCODES[IDI].code)

+                                    && (nBits == SBSYMCODES[IDI].codelen)) {

+                                break;

+                            }

+                        }

+                        if(IDI < SBNUMSYMS) {

+                            break;

+                        }

+                    }

+                    m_pModule->JBig2_Free(SBSYMCODES);

+                    JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,

+                                sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));

+                    JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,

+                                sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));

+                    if((pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0)

+                            || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDYI) != 0)

+                            || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {

+                        delete SBHUFFRDX;

+                        delete SBHUFFRSIZE;

+                        m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");

+                        goto failed;

+                    }

+                    delete SBHUFFRDX;

+                    delete SBHUFFRSIZE;

+                    pStream->alignByte();

+                    nTmp = pStream->getOffset();

+                    SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));

+                    JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));

+                    JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));

+                    JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());

+                    pGRRD->GRW = SYMWIDTH;

+                    pGRRD->GRH = HCHEIGHT;

+                    pGRRD->GRTEMPLATE = SDRTEMPLATE;

+                    pGRRD->GRREFERENCE = SBSYMS[IDI];

+                    pGRRD->GRREFERENCEDX = RDXI;

+                    pGRRD->GRREFERENCEDY = RDYI;

+                    pGRRD->TPGRON = 0;

+                    pGRRD->GRAT[0] = SDRAT[0];

+                    pGRRD->GRAT[1] = SDRAT[1];

+                    pGRRD->GRAT[2] = SDRAT[2];

+                    pGRRD->GRAT[3] = SDRAT[3];

+                    JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));

+                    BS = pGRRD->decode(pArithDecoder, grContext);

+                    if(BS == NULL) {

+                        m_pModule->JBig2_Free(SBSYMS);

+                        delete pGRRD;

+                        delete pArithDecoder;

+                        goto failed;

+                    }

+                    pStream->alignByte();

+                    pStream->offset(2);

+                    if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {

+                        delete BS;

+                        m_pModule->JBig2_Free(SBSYMS);

+                        delete pGRRD;

+                        delete pArithDecoder;

+                        m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman):"

+                                               "bytes processed by generic refinement region decoding procedure doesn't equal SBHUFFRSIZE.");

+                        goto failed;

+                    }

+                    m_pModule->JBig2_Free(SBSYMS);

+                    delete pGRRD;

+                    delete pArithDecoder;

+                }

+                SDNEWSYMS[NSYMSDECODED] = BS;

+            }

+            if(SDREFAGG == 0) {

+                SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH;

+            }

+            NSYMSDECODED = NSYMSDECODED + 1;

+        }

+        if(SDREFAGG == 0) {

+            if(pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (FX_INT32*)&BMSIZE) != 0) {

+                m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");

+                goto failed;

+            }

+            pStream->alignByte();

+            if(BMSIZE == 0) {

+                stride = (TOTWIDTH + 7) >> 3;

+                if(pStream->getByteLeft() >= stride * HCHEIGHT) {

+                    JBIG2_ALLOC(BHC, CJBig2_Image(TOTWIDTH, HCHEIGHT));

+                    for(I = 0; I < HCHEIGHT; I ++) {

+                        JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, pStream->getPointer(), stride);

+                        pStream->offset(stride);

+                    }

+                } else {

+                    m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");

+                    goto failed;

+                }

+            } else {

+                JBIG2_ALLOC(pGRD, CJBig2_GRDProc());

+                pGRD->MMR = 1;

+                pGRD->GBW = TOTWIDTH;

+                pGRD->GBH = HCHEIGHT;

+                FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream);

+                while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+                    pGRD->Continue_decode(pPause);

+                }

+                delete pGRD;

+                pStream->alignByte();

+            }

+            nTmp = 0;

+            if (!BHC) {

+                continue;

+            }

+            for(I = HCFIRSTSYM; I < NSYMSDECODED; I++) {

+                SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT);

+                nTmp += SDNEWSYMWIDTHS[I];

+            }

+            delete BHC;

+            BHC = NULL;

+        }

+    }

+    EXINDEX = 0;

+    CUREXFLAG = 0;

+    JBIG2_ALLOC(pTable, CJBig2_HuffmanTable(HuffmanTable_B1,

+                                            sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));

+    EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS));

+    while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {

+        if(pHuffmanDecoder->decodeAValue(pTable, (int*)&EXRUNLENGTH) != 0) {

+            delete pTable;

+            m_pModule->JBig2_Free(EXFLAGS);

+            m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");

+            goto failed;

+        }

+        if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {

+            delete pTable;

+            m_pModule->JBig2_Free(EXFLAGS);

+            m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH value.");

+            goto failed;

+        }

+        if(EXRUNLENGTH != 0) {

+            for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {

+                EXFLAGS[I] = CUREXFLAG;

+            }

+        }

+        EXINDEX = EXINDEX + EXRUNLENGTH;

+        CUREXFLAG = !CUREXFLAG;

+    }

+    delete pTable;

+    JBIG2_ALLOC(pDict, CJBig2_SymbolDict());

+    pDict->SDNUMEXSYMS = SDNUMEXSYMS;

+    pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), SDNUMEXSYMS);

+    I = J = 0;

+    for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {

+        if(EXFLAGS[I] && J < SDNUMEXSYMS) {

+            if(I < SDNUMINSYMS) {

+                JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));

+            } else {

+                pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];

+            }

+            J = J + 1;

+        } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {

+            delete SDNEWSYMS[I - SDNUMINSYMS];

+        }

+    }

+    if (J < SDNUMEXSYMS) {

+        pDict->SDNUMEXSYMS = J;

+    }

+    m_pModule->JBig2_Free(EXFLAGS);

+    m_pModule->JBig2_Free(SDNEWSYMS);

+    if(SDREFAGG == 0) {

+        m_pModule->JBig2_Free(SDNEWSYMWIDTHS);

+    }

+    delete pHuffmanDecoder;

+    return pDict;

+failed:

+    for(I = 0; I < NSYMSDECODED; I++) {

+        if (SDNEWSYMS[I]) {

+            delete SDNEWSYMS[I];

+        }

+    }

+    m_pModule->JBig2_Free(SDNEWSYMS);

+    if(SDREFAGG == 0) {

+        m_pModule->JBig2_Free(SDNEWSYMWIDTHS);

+    }

+    delete pHuffmanDecoder;

+    return NULL;

+}

+CJBig2_Image *CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,

+        JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    FX_DWORD ng, mg;

+    FX_INT32 x, y;

+    CJBig2_Image *HSKIP;

+    FX_DWORD HBPP;

+    FX_DWORD *GI;

+    CJBig2_Image *HTREG;

+    CJBig2_GSIDProc *pGID;

+    JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));

+    HTREG->fill(HDEFPIXEL);

+    HSKIP = NULL;

+    if(HENABLESKIP == 1) {

+        JBIG2_ALLOC(HSKIP, CJBig2_Image(HGW, HGH));

+        for(mg = 0; mg < HGH; mg++) {

+            for(ng = 0; ng < HGW; ng++) {

+                x = (HGX + mg * HRY + ng * HRX) >> 8;

+                y = (HGY + mg * HRX - ng * HRY) >> 8;

+                if((x + HPW <= 0) | (x >= (FX_INT32)HBW)

+                        | (y + HPH <= 0) | (y >= (FX_INT32)HPH)) {

+                    HSKIP->setPixel(ng, mg, 1);

+                } else {

+                    HSKIP->setPixel(ng, mg, 0);

+                }

+            }

+        }

+    }

+    HBPP = 1;

+    while((FX_DWORD)(1 << HBPP) < HNUMPATS) {

+        HBPP ++;

+    }

+    JBIG2_ALLOC(pGID, CJBig2_GSIDProc());

+    pGID->GSMMR = HMMR;

+    pGID->GSW = HGW;

+    pGID->GSH = HGH;

+    pGID->GSBPP = (FX_BYTE)HBPP;

+    pGID->GSUSESKIP = HENABLESKIP;

+    pGID->GSKIP = HSKIP;

+    pGID->GSTEMPLATE = HTEMPLATE;

+    GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause);

+    if(GI == NULL) {

+        goto failed;

+    }

+    for(mg = 0; mg < HGH; mg++) {

+        for(ng = 0; ng < HGW; ng++) {

+            x = (HGX + mg * HRY + ng * HRX) >> 8;

+            y = (HGY + mg * HRX - ng * HRY) >> 8;

+            FX_DWORD pat_index = GI[mg * HGW + ng];

+            if (pat_index >= HNUMPATS) {

+                pat_index = HNUMPATS - 1;

+            }

+            HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);

+        }

+    }

+    m_pModule->JBig2_Free(GI);

+    if(HSKIP) {

+        delete HSKIP;

+    }

+    delete pGID;

+    return HTREG;

+failed:

+    if(HSKIP) {

+        delete HSKIP;

+    }

+    delete pGID;

+    delete HTREG;

+    return NULL;

+}

+CJBig2_Image *CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)

+{

+    FX_DWORD ng, mg;

+    FX_INT32 x, y;

+    FX_DWORD HBPP;

+    FX_DWORD *GI;

+    CJBig2_Image *HTREG;

+    CJBig2_GSIDProc *pGID;

+    JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));

+    HTREG->fill(HDEFPIXEL);

+    HBPP = 1;

+    while((FX_DWORD)(1 << HBPP) < HNUMPATS) {

+        HBPP ++;

+    }

+    JBIG2_ALLOC(pGID, CJBig2_GSIDProc());

+    pGID->GSMMR = HMMR;

+    pGID->GSW = HGW;

+    pGID->GSH = HGH;

+    pGID->GSBPP = (FX_BYTE)HBPP;

+    pGID->GSUSESKIP = 0;

+    GI = pGID->decode_MMR(pStream, pPause);

+    if(GI == NULL) {

+        goto failed;

+    }

+    for(mg = 0; mg < HGH; mg++) {

+        for(ng = 0; ng < HGW; ng++) {

+            x = (HGX + mg * HRY + ng * HRX) >> 8;

+            y = (HGY + mg * HRX - ng * HRY) >> 8;

+            FX_DWORD pat_index = GI[mg * HGW + ng];

+            if (pat_index >= HNUMPATS) {

+                pat_index = HNUMPATS - 1;

+            }

+            HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);

+        }

+    }

+    m_pModule->JBig2_Free(GI);

+    delete pGID;

+    return HTREG;

+failed:

+    delete pGID;

+    delete HTREG;

+    return NULL;

+}

+CJBig2_PatternDict *CJBig2_PDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,

+        JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    FX_DWORD GRAY;

+    CJBig2_Image *BHDC = NULL;

+    CJBig2_PatternDict *pDict;

+    CJBig2_GRDProc *pGRD;

+    JBIG2_ALLOC(pDict, CJBig2_PatternDict());

+    pDict->NUMPATS = GRAYMAX + 1;

+    pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), pDict->NUMPATS);

+    JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS);

+    JBIG2_ALLOC(pGRD, CJBig2_GRDProc());

+    pGRD->MMR = HDMMR;

+    pGRD->GBW = (GRAYMAX + 1) * HDPW;

+    pGRD->GBH = HDPH;

+    pGRD->GBTEMPLATE = HDTEMPLATE;

+    pGRD->TPGDON = 0;

+    pGRD->USESKIP = 0;

+    pGRD->GBAT[0] = -(FX_INT32)HDPW;

+    pGRD->GBAT[1] = 0;

+    if(pGRD->GBTEMPLATE == 0) {

+        pGRD->GBAT[2] = -3;

+        pGRD->GBAT[3] = -1;

+        pGRD->GBAT[4] = 2;

+        pGRD->GBAT[5] = -2;

+        pGRD->GBAT[6] = -2;

+        pGRD->GBAT[7] = -2;

+    }

+    FXCODEC_STATUS status = pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbContext);

+    while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+        pGRD->Continue_decode(pPause);

+    }

+    if(BHDC == NULL) {

+        delete pGRD;

+        goto failed;

+    }

+    delete pGRD;

+    GRAY = 0;

+    while(GRAY <= GRAYMAX) {

+        pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);

+        GRAY = GRAY + 1;

+    }

+    delete BHDC;

+    return pDict;

+failed:

+    delete pDict;

+    return NULL;

+}

+

+CJBig2_PatternDict *CJBig2_PDDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)

+{

+    FX_DWORD GRAY;

+    CJBig2_Image *BHDC = NULL;

+    CJBig2_PatternDict *pDict;

+    CJBig2_GRDProc *pGRD;

+    JBIG2_ALLOC(pDict, CJBig2_PatternDict());

+    pDict->NUMPATS = GRAYMAX + 1;

+    pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), pDict->NUMPATS);

+    JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS);

+    JBIG2_ALLOC(pGRD, CJBig2_GRDProc());

+    pGRD->MMR = HDMMR;

+    pGRD->GBW = (GRAYMAX + 1) * HDPW;

+    pGRD->GBH = HDPH;

+    FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream);

+    while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+        pGRD->Continue_decode(pPause);

+    }

+    if(BHDC == NULL) {

+        delete pGRD;

+        goto failed;

+    }

+    delete pGRD;

+    GRAY = 0;

+    while(GRAY <= GRAYMAX) {

+        pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);

+        GRAY = GRAY + 1;

+    }

+    delete BHDC;

+    return pDict;

+failed:

+    delete pDict;

+    return NULL;

+}

+FX_DWORD *CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,

+                                        JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    CJBig2_Image **GSPLANES;

+    FX_INT32 J, K;

+    FX_DWORD x, y;

+    FX_DWORD *GSVALS;

+    CJBig2_GRDProc *pGRD;

+    GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);

+    if (!GSPLANES) {

+        return NULL;

+    }

+    GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);

+    if (!GSVALS) {

+        m_pModule->JBig2_Free(GSPLANES);

+        return NULL;

+    }

+    JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP);

+    JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH);

+    JBIG2_ALLOC(pGRD, CJBig2_GRDProc());

+    pGRD->MMR = GSMMR;

+    pGRD->GBW = GSW;

+    pGRD->GBH = GSH;

+    pGRD->GBTEMPLATE = GSTEMPLATE;

+    pGRD->TPGDON = 0;

+    pGRD->USESKIP = GSUSESKIP;

+    pGRD->SKIP = GSKIP;

+    if(GSTEMPLATE <= 1) {

+        pGRD->GBAT[0] = 3;

+    } else {

+        pGRD->GBAT[0] = 2;

+    }

+    pGRD->GBAT[1] = -1;

+    if(pGRD->GBTEMPLATE == 0) {

+        pGRD->GBAT[2] = -3;

+        pGRD->GBAT[3] = -1;

+        pGRD->GBAT[4] = 2;

+        pGRD->GBAT[5] = -2;

+        pGRD->GBAT[6] = -2;

+        pGRD->GBAT[7] = -2;

+    }

+    FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArithDecoder, gbContext);

+    while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+        pGRD->Continue_decode(pPause);

+    }

+    if(GSPLANES[GSBPP - 1] == NULL) {

+        goto failed;

+    }

+    J = GSBPP - 2;

+    while(J >= 0) {

+        FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[J], pArithDecoder, gbContext);

+        while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+            pGRD->Continue_decode(pPause);

+        }

+        if(GSPLANES[J] == NULL) {

+            for(K = GSBPP - 1; K > J; K--) {

+                delete GSPLANES[K];

+                goto failed;

+            }

+        }

+        GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);

+        J = J - 1;

+    }

+    for(y = 0; y < GSH; y++) {

+        for(x = 0; x < GSW; x++) {

+            for(J = 0; J < GSBPP; J++) {

+                GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;

+            }

+        }

+    }

+    for(J = 0; J < GSBPP; J++) {

+        delete GSPLANES[J];

+    }

+    m_pModule->JBig2_Free(GSPLANES);

+    delete pGRD;

+    return GSVALS;

+failed:

+    m_pModule->JBig2_Free(GSPLANES);

+    delete pGRD;

+    m_pModule->JBig2_Free(GSVALS);

+    return NULL;

+}

+FX_DWORD *CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)

+{

+    CJBig2_Image **GSPLANES;

+    FX_INT32 J, K;

+    FX_DWORD x, y;

+    FX_DWORD *GSVALS;

+    CJBig2_GRDProc *pGRD;

+    GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);

+    if (!GSPLANES) {

+        return NULL;

+    }

+    GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);

+    if (!GSVALS) {

+        if (GSPLANES) {

+            m_pModule->JBig2_Free(GSPLANES);

+        }

+        return NULL;

+    }

+    JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP);

+    JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH);

+    JBIG2_ALLOC(pGRD, CJBig2_GRDProc());

+    pGRD->MMR = GSMMR;

+    pGRD->GBW = GSW;

+    pGRD->GBH = GSH;

+    FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream);

+    while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+        pGRD->Continue_decode(pPause);

+    }

+    if(GSPLANES[GSBPP - 1] == NULL) {

+        goto failed;

+    }

+    pStream->alignByte();

+    pStream->offset(3);

+    J = GSBPP - 2;

+    while(J >= 0) {

+        FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream);

+        while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+            pGRD->Continue_decode(pPause);

+        }

+        if(GSPLANES[J] == NULL) {

+            for(K = GSBPP - 1; K > J; K--) {

+                delete GSPLANES[K];

+                goto failed;

+            }

+        }

+        pStream->alignByte();

+        pStream->offset(3);

+        GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);

+        J = J - 1;

+    }

+    for(y = 0; y < GSH; y++) {

+        for(x = 0; x < GSW; x++) {

+            for(J = 0; J < GSBPP; J++) {

+                GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;

+            }

+        }

+    }

+    for(J = 0; J < GSBPP; J++) {

+        delete GSPLANES[J];

+    }

+    m_pModule->JBig2_Free(GSPLANES);

+    delete pGRD;

+    return GSVALS;

+failed:

+    m_pModule->JBig2_Free(GSPLANES);

+    delete pGRD;

+    m_pModule->JBig2_Free(GSVALS);

+    return NULL;

+}

+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    if (GBW == 0 || GBH == 0) {

+        m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+        return FXCODEC_STATUS_DECODE_FINISH;

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;

+    m_pPause = pPause;

+    if(*pImage == NULL) {

+        JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));

+    }

+    if ((*pImage)->m_pData == NULL) {

+        delete *pImage;

+        *pImage = NULL;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        m_ProssiveStatus = FXCODEC_STATUS_ERROR;

+        return FXCODEC_STATUS_ERROR;

+    }

+    m_DecodeType = 1;

+    m_pImage = pImage;

+    (*m_pImage)->fill(0);

+    m_pArithDecoder = pArithDecoder;

+    m_gbContext = gbContext;

+    LTP = 0;

+    m_pLine = NULL;

+    m_loopIndex = 0;

+    return decode_Arith(pPause);

+}

+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause)

+{

+    int iline = m_loopIndex;

+    CJBig2_Image* pImage = *m_pImage;

+    if(GBTEMPLATE == 0) {

+        if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)

+                && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1)

+                && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2)

+                && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) {

+            m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);

+        } else {

+            m_ProssiveStatus = decode_Arith_Template0_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);

+        }

+    } else if(GBTEMPLATE == 1) {

+        if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) {

+            m_ProssiveStatus = decode_Arith_Template1_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);

+        } else {

+            m_ProssiveStatus = decode_Arith_Template1_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);

+        }

+    } else if(GBTEMPLATE == 2) {

+        if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {

+            m_ProssiveStatus =  decode_Arith_Template2_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);

+        } else {

+            m_ProssiveStatus =  decode_Arith_Template2_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);

+        }

+    } else {

+        if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {

+            m_ProssiveStatus = decode_Arith_Template3_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);

+        } else {

+            m_ProssiveStatus = decode_Arith_Template3_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);

+        }

+    }

+    m_ReplaceRect.left = 0;

+    m_ReplaceRect.right = pImage->m_nWidth;

+    m_ReplaceRect.top = iline;

+    m_ReplaceRect.bottom = m_loopIndex;

+    if(m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) {

+        m_loopIndex = 0;

+    }

+    return m_ProssiveStatus;

+}

+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    if(GBW == 0 || GBH == 0) {

+        * pImage = NULL;

+        m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+        return FXCODEC_STATUS_DECODE_FINISH;

+    }

+    if(*pImage == NULL) {

+        JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));

+    }

+    if ((*pImage)->m_pData == NULL) {

+        delete *pImage;

+        *pImage = NULL;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        m_ProssiveStatus = FXCODEC_STATUS_ERROR;

+        return FXCODEC_STATUS_ERROR;

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;

+    m_DecodeType = 2;

+    m_pPause = pPause;

+    m_pImage = pImage;

+    (*m_pImage)->fill(0);

+    LTP = 0;

+    m_loopIndex = 0;

+    m_pArithDecoder = pArithDecoder;

+    m_gbContext = gbContext;

+    return decode_Arith_V2(pPause);

+}

+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V2(IFX_Pause* pPause)

+{

+    FX_BOOL SLTP, bVal;

+    FX_DWORD CONTEXT;

+    CJBig2_Image *GBREG = *m_pImage;

+    FX_DWORD line1, line2, line3;

+    LTP = 0;

+    JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));

+    GBREG->fill(0);

+    for(; m_loopIndex < GBH; m_loopIndex++) {

+        if(TPGDON) {

+            switch(GBTEMPLATE) {

+                case 0:

+                    CONTEXT = 0x9b25;

+                    break;

+                case 1:

+                    CONTEXT = 0x0795;

+                    break;

+                case 2:

+                    CONTEXT = 0x00e5;

+                    break;

+                case 3:

+                    CONTEXT = 0x0195;

+                    break;

+            }

+            SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            GBREG->copyLine(m_loopIndex, m_loopIndex - 1);

+        } else {

+            switch(GBTEMPLATE) {

+                case 0: {

+                        line1 = GBREG->getPixel(1, m_loopIndex - 2);

+                        line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;

+                        line2 = GBREG->getPixel(2, m_loopIndex - 1);

+                        line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;

+                        line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;

+                        line3 = 0;

+                        for(FX_DWORD w = 0; w < GBW; w++) {

+                            if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {

+                                bVal = 0;

+                            } else {

+                                CONTEXT = line3;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;

+                                CONTEXT |= line2 << 5;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;

+                                CONTEXT |= line1 << 12;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;

+                                bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);

+                            }

+                            if(bVal) {

+                                GBREG->setPixel(w, m_loopIndex, bVal);

+                            }

+                            line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07;

+                            line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;

+                            line3 = ((line3 << 1) | bVal) & 0x0f;

+                        }

+                    }

+                    break;

+                case 1: {

+                        line1 = GBREG->getPixel(2, m_loopIndex - 2);

+                        line1 |= GBREG->getPixel(1, m_loopIndex - 2) << 1;

+                        line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 2;

+                        line2 = GBREG->getPixel(2, m_loopIndex - 1);

+                        line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;

+                        line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;

+                        line3 = 0;

+                        for(FX_DWORD w = 0; w < GBW; w++) {

+                            if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {

+                                bVal = 0;

+                            } else {

+                                CONTEXT = line3;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3;

+                                CONTEXT |= line2 << 4;

+                                CONTEXT |= line1 << 9;

+                                bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);

+                            }

+                            if(bVal) {

+                                GBREG->setPixel(w, m_loopIndex, bVal);

+                            }

+                            line1 = ((line1 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 2)) & 0x0f;

+                            line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;

+                            line3 = ((line3 << 1) | bVal) & 0x07;

+                        }

+                    }

+                    break;

+                case 2: {

+                        line1 = GBREG->getPixel(1, m_loopIndex - 2);

+                        line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;

+                        line2 = GBREG->getPixel(1, m_loopIndex - 1);

+                        line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;

+                        line3 = 0;

+                        for(FX_DWORD w = 0; w < GBW; w++) {

+                            if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {

+                                bVal = 0;

+                            } else {

+                                CONTEXT = line3;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;

+                                CONTEXT |= line2 << 3;

+                                CONTEXT |= line1 << 7;

+                                bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);

+                            }

+                            if(bVal) {

+                                GBREG->setPixel(w, m_loopIndex, bVal);

+                            }

+                            line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07;

+                            line2 = ((line2 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x0f;

+                            line3 = ((line3 << 1) | bVal) & 0x03;

+                        }

+                    }

+                    break;

+                case 3: {

+                        line1 = GBREG->getPixel(1, m_loopIndex - 1);

+                        line1 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;

+                        line2 = 0;

+                        for(FX_DWORD w = 0; w < GBW; w++) {

+                            if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {

+                                bVal = 0;

+                            } else {

+                                CONTEXT = line2;

+                                CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;

+                                CONTEXT |= line1 << 5;

+                                bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);

+                            }

+                            if(bVal) {

+                                GBREG->setPixel(w, m_loopIndex, bVal);

+                            }

+                            line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x1f;

+                            line2 = ((line2 << 1) | bVal) & 0x0f;

+                        }

+                    }

+                    break;

+            }

+        }

+        if(pPause && pPause->NeedToPauseNow()) {

+            m_loopIndex ++;

+            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+            return FXCODEC_STATUS_DECODE_TOBECONTINUE;

+        }

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+    return FXCODEC_STATUS_DECODE_FINISH;

+}

+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    if(GBW == 0 || GBH == 0) {

+        * pImage = NULL;

+        m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+        return FXCODEC_STATUS_DECODE_FINISH;

+    }

+    if(*pImage == NULL) {

+        JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));

+    }

+    if ((*pImage)->m_pData == NULL) {

+        delete *pImage;

+        *pImage = NULL;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        m_ProssiveStatus = FXCODEC_STATUS_ERROR;

+        return FXCODEC_STATUS_ERROR;

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;

+    m_pPause = pPause;

+    m_pImage = pImage;

+    m_DecodeType = 3;

+    (*m_pImage)->fill(0);

+    LTP = 0;

+    m_loopIndex = 0;

+    m_pArithDecoder = pArithDecoder;

+    m_gbContext = gbContext;

+    return decode_Arith_V1(pPause);

+}

+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V1(IFX_Pause* pPause)

+{

+    FX_BOOL SLTP, bVal;

+    FX_DWORD CONTEXT = 0;

+    CJBig2_Image *GBREG = (*m_pImage);

+    for(; m_loopIndex < GBH; m_loopIndex++) {

+        if(TPGDON) {

+            switch(GBTEMPLATE) {

+                case 0:

+                    CONTEXT = 0x9b25;

+                    break;

+                case 1:

+                    CONTEXT = 0x0795;

+                    break;

+                case 2:

+                    CONTEXT = 0x00e5;

+                    break;

+                case 3:

+                    CONTEXT = 0x0195;

+                    break;

+            }

+            SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                GBREG->setPixel(w, m_loopIndex, GBREG->getPixel(w, m_loopIndex - 1));

+            }

+        } else {

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {

+                    GBREG->setPixel(w, m_loopIndex, 0);

+                } else {

+                    CONTEXT = 0;

+                    switch(GBTEMPLATE) {

+                        case 0:

+                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);

+                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;

+                            CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;

+                            CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;

+                            CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 5;

+                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 6;

+                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 7;

+                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 8;

+                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 9;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;

+                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 12;

+                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 13;

+                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 14;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;

+                            break;

+                        case 1:

+                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);

+                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;

+                            CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3;

+                            CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 4;

+                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5;

+                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;

+                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7;

+                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8;

+                            CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 2) << 9;

+                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 10;

+                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 11;

+                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 12;

+                            break;

+                        case 2:

+                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);

+                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;

+                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 3;

+                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 4;

+                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 5;

+                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 6;

+                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 7;

+                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 8;

+                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 9;

+                            break;

+                        case 3:

+                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);

+                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;

+                            CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;

+                            CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;

+                            CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;

+                            CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5;

+                            CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;

+                            CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7;

+                            CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8;

+                            CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex - 1) << 9;

+                            break;

+                    }

+                    bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);

+                    GBREG->setPixel(w, m_loopIndex, bVal);

+                }

+            }

+        }

+        if(pPause && pPause->NeedToPauseNow()) {

+            m_loopIndex ++;

+            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+            return FXCODEC_STATUS_DECODE_TOBECONTINUE;

+        }

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+    return FXCODEC_STATUS_DECODE_FINISH;

+}

+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause)

+{

+    int bitpos, i;

+    JBIG2_ALLOC((* pImage), CJBig2_Image(GBW, GBH));

+    if ((* pImage)->m_pData == NULL) {

+        delete (* pImage);

+        (* pImage) = NULL;

+        m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);

+        m_ProssiveStatus = FXCODEC_STATUS_ERROR;

+        return m_ProssiveStatus;

+    }

+    bitpos = (int)pStream->getBitPos();

+    _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, (* pImage)->m_pData, GBW, GBH, (* pImage)->m_nStride);

+    pStream->setBitPos(bitpos);

+    for(i = 0; (FX_DWORD)i < (* pImage)->m_nStride * GBH; i++) {

+        (* pImage)->m_pData[i] = ~(* pImage)->m_pData[i];

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+    return m_ProssiveStatus;

+}

+FXCODEC_STATUS CJBig2_GRDProc::decode_MMR()

+{

+    return m_ProssiveStatus;

+}

+FXCODEC_STATUS CJBig2_GRDProc::Continue_decode(IFX_Pause* pPause)

+{

+    if(m_ProssiveStatus != FXCODEC_STATUS_DECODE_TOBECONTINUE) {

+        return m_ProssiveStatus;

+    }

+    switch (m_DecodeType) {

+        case 1:

+            return decode_Arith(pPause);

+        case 2:

+            return decode_Arith_V2(pPause);

+        case 3:

+            return decode_Arith_V1(pPause);

+        case 4:

+            return decode_MMR();

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_ERROR;

+    return m_ProssiveStatus;

+}

+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    FX_BOOL SLTP, bVal;

+    FX_DWORD CONTEXT;

+    FX_DWORD line1, line2;

+    FX_BYTE *pLine1, *pLine2, cVal;

+    FX_INT32 nStride, nStride2, k;

+    FX_INT32 nLineBytes, nBitsLeft, cc;

+    if(m_pLine == NULL) {

+        m_pLine = pImage->m_pData;

+    }

+    nStride = pImage->m_nStride;

+    nStride2 = nStride << 1;

+    nLineBytes = ((GBW + 7) >> 3) - 1;

+    nBitsLeft = GBW - (nLineBytes << 3);

+    FX_DWORD height = GBH & 0x7fffffff;

+    for(; m_loopIndex < height; m_loopIndex++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            pImage->copyLine(m_loopIndex, m_loopIndex - 1);

+        } else {

+            if(m_loopIndex > 1) {

+                pLine1 = m_pLine - nStride2;

+                pLine2 = m_pLine - nStride;

+                line1 = (*pLine1++) << 6;

+                line2 = *pLine2++;

+                CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0));

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    line1 = (line1 << 8) | ((*pLine1++) << 6);

+                    line2 = (line2 << 8) | (*pLine2++);

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal

+                                   | ((line1 >> k) & 0x0800)

+                                   | ((line2 >> k) & 0x0010));

+                    }

+                    m_pLine[cc] = cVal;

+                }

+                line1 <<= 8;

+                line2 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal

+                               | ((line1 >> (7 - k)) & 0x0800)

+                               | ((line2 >> (7 - k)) & 0x0010));

+                }

+                m_pLine[nLineBytes] = cVal;

+            } else {

+                pLine2 = m_pLine - nStride;

+                line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;

+                CONTEXT = (line2 & 0x07f0);

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    if(m_loopIndex & 1) {

+                        line2 = (line2 << 8) | (*pLine2++);

+                    }

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal

+                                   | ((line2 >> k) & 0x0010));

+                    }

+                    m_pLine[cc] = cVal;

+                }

+                line2 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal

+                               | ((line2 >> (7 - k)) & 0x0010));

+                }

+                m_pLine[nLineBytes] = cVal;

+            }

+        }

+        m_pLine += nStride;

+        if(pPause && pPause->NeedToPauseNow()) {

+            m_loopIndex++;

+            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+            return FXCODEC_STATUS_DECODE_TOBECONTINUE;

+        }

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+    return FXCODEC_STATUS_DECODE_FINISH;

+}

+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    FX_BOOL SLTP, bVal;

+    FX_DWORD CONTEXT;

+    FX_DWORD line1, line2, line3;

+    for(; m_loopIndex < GBH; m_loopIndex++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            pImage->copyLine(m_loopIndex, m_loopIndex - 1);

+        } else {

+            line1 = pImage->getPixel(1, m_loopIndex - 2);

+            line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;

+            line2 = pImage->getPixel(2, m_loopIndex - 1);

+            line2 |= pImage->getPixel(1, m_loopIndex - 1) << 1;

+            line2 |= pImage->getPixel(0, m_loopIndex - 1) << 2;

+            line3 = 0;

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {

+                    bVal = 0;

+                } else {

+                    CONTEXT = line3;

+                    CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;

+                    CONTEXT |= line2 << 5;

+                    CONTEXT |= pImage->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;

+                    CONTEXT |= pImage->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;

+                    CONTEXT |= line1 << 12;

+                    CONTEXT |= pImage->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                }

+                if(bVal) {

+                    pImage->setPixel(w, m_loopIndex, bVal);

+                }

+                line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07;

+                line2 = ((line2 << 1) | pImage->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;

+                line3 = ((line3 << 1) | bVal) & 0x0f;

+            }

+        }

+        if(pPause && pPause->NeedToPauseNow()) {

+            m_loopIndex++;

+            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+            return FXCODEC_STATUS_DECODE_TOBECONTINUE;

+        }

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+    return FXCODEC_STATUS_DECODE_FINISH;

+}

+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    FX_BOOL SLTP, bVal;

+    FX_DWORD CONTEXT;

+    FX_DWORD line1, line2;

+    FX_BYTE *pLine1, *pLine2, cVal;

+    FX_INT32 nStride, nStride2, k;

+    FX_INT32 nLineBytes, nBitsLeft, cc;

+    if (!m_pLine) {

+        m_pLine = pImage->m_pData;

+    }

+    nStride = pImage->m_nStride;

+    nStride2 = nStride << 1;

+    nLineBytes = ((GBW + 7) >> 3) - 1;

+    nBitsLeft = GBW - (nLineBytes << 3);

+    for(; m_loopIndex < GBH; m_loopIndex++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            pImage->copyLine(m_loopIndex, m_loopIndex - 1);

+        } else {

+            if(m_loopIndex > 1) {

+                pLine1 = m_pLine - nStride2;

+                pLine2 = m_pLine - nStride;

+                line1 = (*pLine1++) << 4;

+                line2 = *pLine2++;

+                CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    line1 = (line1 << 8) | ((*pLine1++) << 4);

+                    line2 = (line2 << 8) | (*pLine2++);

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal

+                                  | ((line1 >> k) & 0x0200)

+                                  | ((line2 >> (k + 1)) & 0x0008);

+                    }

+                    m_pLine[cc] = cVal;

+                }

+                line1 <<= 8;

+                line2 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal

+                              | ((line1 >> (7 - k)) & 0x0200)

+                              | ((line2 >> (8 - k)) & 0x0008);

+                }

+                m_pLine[nLineBytes] = cVal;

+            } else {

+                pLine2 = m_pLine - nStride;

+                line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;

+                CONTEXT = (line2 >> 1) & 0x01f8;

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    if(m_loopIndex & 1) {

+                        line2 = (line2 << 8) | (*pLine2++);

+                    }

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal

+                                  | ((line2 >> (k + 1)) & 0x0008);

+                    }

+                    m_pLine[cc] = cVal;

+                }

+                line2 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal

+                              | ((line2 >> (8 - k)) & 0x0008);

+                }

+                m_pLine[nLineBytes] = cVal;

+            }

+        }

+        m_pLine += nStride;

+        if(pPause && pPause->NeedToPauseNow()) {

+            m_loopIndex++;

+            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+            return FXCODEC_STATUS_DECODE_TOBECONTINUE;

+        }

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+    return FXCODEC_STATUS_DECODE_FINISH;

+}

+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    FX_BOOL SLTP, bVal;

+    FX_DWORD CONTEXT;

+    FX_DWORD line1, line2, line3;

+    for(FX_DWORD h = 0; h < GBH; h++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            pImage->copyLine(h, h - 1);

+        } else {

+            line1 = pImage->getPixel(2, h - 2);

+            line1 |= pImage->getPixel(1, h - 2) << 1;

+            line1 |= pImage->getPixel(0, h - 2) << 2;

+            line2 = pImage->getPixel(2, h - 1);

+            line2 |= pImage->getPixel(1, h - 1) << 1;

+            line2 |= pImage->getPixel(0, h - 1) << 2;

+            line3 = 0;

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, h)) {

+                    bVal = 0;

+                } else {

+                    CONTEXT = line3;

+                    CONTEXT |= pImage->getPixel(w + GBAT[0], h + GBAT[1]) << 3;

+                    CONTEXT |= line2 << 4;

+                    CONTEXT |= line1 << 9;

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                }

+                if(bVal) {

+                    pImage->setPixel(w, h, bVal);

+                }

+                line1 = ((line1 << 1) | pImage->getPixel(w + 3, h - 2)) & 0x0f;

+                line2 = ((line2 << 1) | pImage->getPixel(w + 3, h - 1)) & 0x1f;

+                line3 = ((line3 << 1) | bVal) & 0x07;

+            }

+        }

+        if(pPause && pPause->NeedToPauseNow()) {

+            m_loopIndex++;

+            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+            return FXCODEC_STATUS_DECODE_TOBECONTINUE;

+        }

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+    return FXCODEC_STATUS_DECODE_FINISH;

+}

+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    FX_BOOL SLTP, bVal;

+    FX_DWORD CONTEXT;

+    FX_DWORD line1, line2;

+    FX_BYTE *pLine1, *pLine2, cVal;

+    FX_INT32 nStride, nStride2, k;

+    FX_INT32 nLineBytes, nBitsLeft, cc;

+    if(!m_pLine) {

+        m_pLine = pImage->m_pData;

+    }

+    nStride = pImage->m_nStride;

+    nStride2 = nStride << 1;

+    nLineBytes = ((GBW + 7) >> 3) - 1;

+    nBitsLeft = GBW - (nLineBytes << 3);

+    for(; m_loopIndex < GBH; m_loopIndex++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            pImage->copyLine(m_loopIndex, m_loopIndex - 1);

+        } else {

+            if(m_loopIndex > 1) {

+                pLine1 = m_pLine - nStride2;

+                pLine2 = m_pLine - nStride;

+                line1 = (*pLine1++) << 1;

+                line2 = *pLine2++;

+                CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    line1 = (line1 << 8) | ((*pLine1++) << 1);

+                    line2 = (line2 << 8) | (*pLine2++);

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal

+                                  | ((line1 >> k) & 0x0080)

+                                  | ((line2 >> (k + 3)) & 0x0004);

+                    }

+                    m_pLine[cc] = cVal;

+                }

+                line1 <<= 8;

+                line2 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal

+                              | ((line1 >> (7 - k)) & 0x0080)

+                              | ((line2 >> (10 - k)) & 0x0004);

+                }

+                m_pLine[nLineBytes] = cVal;

+            } else {

+                pLine2 = m_pLine - nStride;

+                line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;

+                CONTEXT = (line2 >> 3) & 0x007c;

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    if(m_loopIndex & 1) {

+                        line2 = (line2 << 8) | (*pLine2++);

+                    }

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal

+                                  | ((line2 >> (k + 3)) & 0x0004);

+                    }

+                    m_pLine[cc] = cVal;

+                }

+                line2 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal

+                              | (((line2 >> (10 - k))) & 0x0004);

+                }

+                m_pLine[nLineBytes] = cVal;

+            }

+        }

+        m_pLine += nStride;

+        if(pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) {

+            m_loopIndex++;

+            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+            return FXCODEC_STATUS_DECODE_TOBECONTINUE;

+        }

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+    return FXCODEC_STATUS_DECODE_FINISH;

+}

+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    FX_BOOL SLTP, bVal;

+    FX_DWORD CONTEXT;

+    FX_DWORD line1, line2, line3;

+    for(; m_loopIndex < GBH; m_loopIndex++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            pImage->copyLine(m_loopIndex, m_loopIndex - 1);

+        } else {

+            line1 = pImage->getPixel(1, m_loopIndex - 2);

+            line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;

+            line2 = pImage->getPixel(1, m_loopIndex - 1);

+            line2 |= pImage->getPixel(0, m_loopIndex - 1) << 1;

+            line3 = 0;

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {

+                    bVal = 0;

+                } else {

+                    CONTEXT = line3;

+                    CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;

+                    CONTEXT |= line2 << 3;

+                    CONTEXT |= line1 << 7;

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                }

+                if(bVal) {

+                    pImage->setPixel(w, m_loopIndex, bVal);

+                }

+                line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07;

+                line2 = ((line2 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x0f;

+                line3 = ((line3 << 1) | bVal) & 0x03;

+            }

+        }

+        if(pPause && pPause->NeedToPauseNow()) {

+            m_loopIndex++;

+            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+            return FXCODEC_STATUS_DECODE_TOBECONTINUE;

+        }

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+    return FXCODEC_STATUS_DECODE_FINISH;

+}

+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    FX_BOOL SLTP, bVal;

+    FX_DWORD CONTEXT;

+    FX_DWORD line1;

+    FX_BYTE *pLine1, cVal;

+    FX_INT32 nStride, k;

+    FX_INT32 nLineBytes, nBitsLeft, cc;

+    if (!m_pLine) {

+        m_pLine = pImage->m_pData;

+    }

+    nStride = pImage->m_nStride;

+    nLineBytes = ((GBW + 7) >> 3) - 1;

+    nBitsLeft = GBW - (nLineBytes << 3);

+    for(; m_loopIndex < GBH; m_loopIndex++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            pImage->copyLine(m_loopIndex, m_loopIndex - 1);

+        } else {

+            if(m_loopIndex > 0) {

+                pLine1 = m_pLine - nStride;

+                line1 = *pLine1++;

+                CONTEXT = (line1 >> 1) & 0x03f0;

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    line1 = (line1 << 8) | (*pLine1++);

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal

+                                  | ((line1 >> (k + 1)) & 0x0010);

+                    }

+                    m_pLine[cc] = cVal;

+                }

+                line1 <<= 8;

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal

+                              | ((line1 >> (8 - k)) & 0x0010);

+                }

+                m_pLine[nLineBytes] = cVal;

+            } else {

+                CONTEXT = 0;

+                for(cc = 0; cc < nLineBytes; cc++) {

+                    cVal = 0;

+                    for(k = 7; k >= 0; k--) {

+                        bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                        cVal |= bVal << k;

+                        CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;

+                    }

+                    m_pLine[cc] = cVal;

+                }

+                cVal = 0;

+                for(k = 0; k < nBitsLeft; k++) {

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                    cVal |= bVal << (7 - k);

+                    CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;

+                }

+                m_pLine[nLineBytes] = cVal;

+            }

+        }

+        m_pLine += nStride;

+        if(pPause && pPause->NeedToPauseNow()) {

+            m_loopIndex++;

+            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+            return FXCODEC_STATUS_DECODE_TOBECONTINUE;

+        }

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+    return FXCODEC_STATUS_DECODE_FINISH;

+}

+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)

+{

+    FX_BOOL SLTP, bVal;

+    FX_DWORD CONTEXT;

+    FX_DWORD line1, line2;

+    for(; m_loopIndex < GBH; m_loopIndex++) {

+        if(TPGDON) {

+            SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);

+            LTP = LTP ^ SLTP;

+        }

+        if(LTP == 1) {

+            pImage->copyLine(m_loopIndex, m_loopIndex - 1);

+        } else {

+            line1 = pImage->getPixel(1, m_loopIndex - 1);

+            line1 |= pImage->getPixel(0, m_loopIndex - 1) << 1;

+            line2 = 0;

+            for(FX_DWORD w = 0; w < GBW; w++) {

+                if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {

+                    bVal = 0;

+                } else {

+                    CONTEXT = line2;

+                    CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;

+                    CONTEXT |= line1 << 5;

+                    bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);

+                }

+                if(bVal) {

+                    pImage->setPixel(w, m_loopIndex, bVal);

+                }

+                line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x1f;

+                line2 = ((line2 << 1) | bVal) & 0x0f;

+            }

+        }

+        if(pPause && pPause->NeedToPauseNow()) {

+            m_loopIndex++;

+            m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;

+            return FXCODEC_STATUS_DECODE_TOBECONTINUE;

+        }

+    }

+    m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;

+    return FXCODEC_STATUS_DECODE_FINISH;

+}

diff --git a/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h
new file mode 100644
index 0000000..a89d0d6
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h
@@ -0,0 +1,278 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_GENERAL_DECODER_H_

+#define _JBIG2_GENERAL_DECODER_H_

+#include "../../../include/fxcodec/fx_codec_def.h"

+#include "../../../include/fxcrt/fx_basic.h"

+#include "JBig2_Define.h"

+#include "JBig2_SymbolDict.h"

+#include "JBig2_ArithDecoder.h"

+#include "JBig2_ArithIntDecoder.h"

+#include "../../../include/fxcrt/fx_coordinates.h"

+class CJBig2_HuffmanTable;

+class CJBig2_Image;

+class CJBig2_PatternDict;

+typedef enum {

+    JBIG2_CORNER_BOTTOMLEFT = 0,

+    JBIG2_CORNER_TOPLEFT	= 1,

+    JBIG2_CORNER_BOTTOMRIGHT = 2,

+    JBIG2_CORNER_TOPRIGHT	= 3

+} JBig2Corner;

+class CJBig2_GRDProc : public CJBig2_Object

+{

+public:

+    CJBig2_GRDProc()

+    {

+        m_loopIndex = 0;

+        m_pLine = NULL;

+        m_pPause = NULL;

+        m_DecodeType = 0;

+        LTP = 0;

+        m_ReplaceRect.left = 0;

+        m_ReplaceRect.bottom = 0;

+        m_ReplaceRect.top = 0;

+        m_ReplaceRect.right = 0;

+    }

+

+    CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream);

+    FXCODEC_STATUS Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);

+    FXCODEC_STATUS Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);

+    FXCODEC_STATUS Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);

+    FXCODEC_STATUS Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause = NULL);

+    FXCODEC_STATUS Continue_decode(IFX_Pause* pPause);

+    FX_RECT		   GetReplaceRect()

+    {

+        return m_ReplaceRect;

+    };

+private:

+    FXCODEC_STATUS decode_Arith(IFX_Pause* pPause);

+    FXCODEC_STATUS decode_Arith_V2(IFX_Pause* pPause);

+    FXCODEC_STATUS decode_Arith_V1(IFX_Pause* pPause);

+    FXCODEC_STATUS decode_MMR();

+    FXCODEC_STATUS decode_Arith_Template0_opt3(CJBig2_Image*pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);

+    FXCODEC_STATUS decode_Arith_Template0_unopt(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);

+    FXCODEC_STATUS decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);

+    FXCODEC_STATUS decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);

+    FXCODEC_STATUS decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);

+    FXCODEC_STATUS decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);

+    FXCODEC_STATUS decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);

+    FXCODEC_STATUS decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);

+    FX_DWORD	m_loopIndex;

+    FX_BYTE *	m_pLine;

+    IFX_Pause*	m_pPause;

+    FXCODEC_STATUS	m_ProssiveStatus;

+    CJBig2_Image** m_pImage;

+    CJBig2_ArithDecoder *m_pArithDecoder;

+    JBig2ArithCtx *m_gbContext;

+    FX_WORD		m_DecodeType;

+    FX_BOOL LTP;

+    FX_RECT m_ReplaceRect;

+private:

+

+    CJBig2_Image *decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+

+    CJBig2_Image *decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);

+public:

+    FX_BOOL MMR;

+    FX_DWORD GBW;

+    FX_DWORD GBH;

+    FX_BYTE GBTEMPLATE;

+    FX_BOOL TPGDON;

+    FX_BOOL USESKIP;

+    CJBig2_Image * SKIP;

+    signed char GBAT[8];

+};

+class CJBig2_GRRDProc : public CJBig2_Object

+{

+public:

+

+    CJBig2_Image *decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);

+

+    CJBig2_Image *decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);

+

+    CJBig2_Image *decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);

+

+    CJBig2_Image *decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);

+

+    CJBig2_Image *decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);

+

+    CJBig2_Image *decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);

+public:

+    FX_DWORD GRW;

+    FX_DWORD GRH;

+    FX_BOOL GRTEMPLATE;

+    CJBig2_Image *GRREFERENCE;

+    FX_INT32 GRREFERENCEDX;

+    FX_INT32 GRREFERENCEDY;

+    FX_BOOL TPGRON;

+    signed char	GRAT[4];

+};

+typedef struct {

+    CJBig2_ArithIntDecoder *IADT,

+                           *IAFS,

+                           *IADS,

+                           *IAIT,

+                           *IARI,

+                           *IARDW,

+                           *IARDH,

+                           *IARDX,

+                           *IARDY;

+    CJBig2_ArithIaidDecoder *IAID;

+} JBig2IntDecoderState;

+class CJBig2_TRDProc : public CJBig2_Object

+{

+public:

+

+    CJBig2_Image *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext);

+

+    CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext,

+                               JBig2IntDecoderState *pIDS = NULL);

+public:

+    FX_BOOL SBHUFF;

+    FX_BOOL SBREFINE;

+    FX_DWORD SBW;

+    FX_DWORD SBH;

+    FX_DWORD SBNUMINSTANCES;

+    FX_DWORD SBSTRIPS;

+    FX_DWORD SBNUMSYMS;

+

+    JBig2HuffmanCode *SBSYMCODES;

+    FX_BYTE SBSYMCODELEN;

+

+    CJBig2_Image **SBSYMS;

+    FX_BOOL SBDEFPIXEL;

+

+    JBig2ComposeOp SBCOMBOP;

+    FX_BOOL TRANSPOSED;

+

+    JBig2Corner REFCORNER;

+    signed char SBDSOFFSET;

+    CJBig2_HuffmanTable *SBHUFFFS,

+                        *SBHUFFDS,

+                        *SBHUFFDT,

+                        *SBHUFFRDW,

+                        *SBHUFFRDH,

+                        *SBHUFFRDX,

+                        *SBHUFFRDY,

+                        *SBHUFFRSIZE;

+    FX_BOOL SBRTEMPLATE;

+    signed char SBRAT[4];

+};

+class CJBig2_SDDProc : public CJBig2_Object

+{

+public:

+

+    CJBig2_SymbolDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext);

+

+    CJBig2_SymbolDict *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause);

+public:

+    FX_BOOL SDHUFF;

+    FX_BOOL SDREFAGG;

+    FX_DWORD SDNUMINSYMS;

+    CJBig2_Image ** SDINSYMS;

+    FX_DWORD SDNUMNEWSYMS;

+    FX_DWORD SDNUMEXSYMS;

+    CJBig2_HuffmanTable *SDHUFFDH,

+                        *SDHUFFDW,

+                        *SDHUFFBMSIZE,

+                        *SDHUFFAGGINST;

+    FX_BYTE SDTEMPLATE;

+    signed char SDAT[8];

+    FX_BOOL SDRTEMPLATE;

+    signed char SDRAT[4];

+};

+class CJBig2_HTRDProc : public CJBig2_Object

+{

+public:

+

+    CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);

+

+    CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);

+public:

+    FX_DWORD HBW,

+             HBH;

+    FX_BOOL HMMR;

+    FX_BYTE HTEMPLATE;

+    FX_DWORD HNUMPATS;

+    CJBig2_Image **HPATS;

+    FX_BOOL HDEFPIXEL;

+    JBig2ComposeOp HCOMBOP;

+    FX_BOOL HENABLESKIP;

+    FX_DWORD HGW,

+             HGH;

+    FX_INT32 HGX,

+             HGY;

+    FX_WORD HRX,

+            HRY;

+    FX_BYTE HPW,

+            HPH;

+};

+class CJBig2_PDDProc : public CJBig2_Object

+{

+public:

+

+    CJBig2_PatternDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);

+

+    CJBig2_PatternDict *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);

+public:

+    FX_BOOL HDMMR;

+    FX_BYTE HDPW,

+            HDPH;

+    FX_DWORD GRAYMAX;

+    FX_BYTE HDTEMPLATE;

+};

+class CJBig2_GSIDProc : public CJBig2_Object

+{

+public:

+

+    FX_DWORD *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);

+

+    FX_DWORD *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);

+public:

+    FX_BOOL GSMMR;

+    FX_BOOL GSUSESKIP;

+    FX_BYTE GSBPP;

+    FX_DWORD GSW,

+             GSH;

+    FX_BYTE GSTEMPLATE;

+    CJBig2_Image *GSKIP;

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp
new file mode 100644
index 0000000..8199fe7
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp
@@ -0,0 +1,55 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "JBig2_HuffmanDecoder.h"

+CJBig2_HuffmanDecoder::CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream)

+{

+    m_pStream = pStream;

+}

+CJBig2_HuffmanDecoder::~CJBig2_HuffmanDecoder()

+{

+}

+int CJBig2_HuffmanDecoder::decodeAValue(CJBig2_HuffmanTable *pTable, int *nResult)

+{

+    int nVal, nTmp, i, nBits;

+    nVal = 0;

+    nBits = 0;

+    while(1) {

+        if(m_pStream->read1Bit(&nTmp) == -1) {

+            return -1;

+        }

+        nVal = (nVal << 1) | nTmp;

+        nBits ++;

+        for(i = 0; i < pTable->NTEMP; i++) {

+            if((pTable->PREFLEN[i] == nBits) && (pTable->CODES[i] == nVal)) {

+                if((pTable->HTOOB == 1) && (i == pTable->NTEMP - 1)) {

+                    return JBIG2_OOB;

+                }

+                if(m_pStream->readNBits(pTable->RANGELEN[i], &nTmp) == -1) {

+                    return -1;

+                }

+                if(pTable->HTOOB) {

+                    if(i == pTable->NTEMP - 3) {

+                        *nResult = pTable->RANGELOW[i] - nTmp;

+                        return 0;

+                    } else {

+                        *nResult = pTable->RANGELOW[i] + nTmp;

+                        return 0;

+                    }

+                } else {

+                    if(i == pTable->NTEMP - 2) {

+                        *nResult = pTable->RANGELOW[i] - nTmp;

+                        return 0;

+                    } else {

+                        *nResult = pTable->RANGELOW[i] + nTmp;

+                        return 0;

+                    }

+                }

+            }

+        }

+    }

+    return -2;

+}

diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h
new file mode 100644
index 0000000..38b2021
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h
@@ -0,0 +1,24 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_HUFFMAN_DECODER_H_

+#define _JBIG2_HUFFMAN_DECODER_H_

+#include "JBig2_BitStream.h"

+#include "JBig2_HuffmanTable.h"

+class CJBig2_HuffmanDecoder : public CJBig2_Object

+{

+public:

+

+    CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream);

+

+    ~CJBig2_HuffmanDecoder();

+

+    int decodeAValue(CJBig2_HuffmanTable *pTable, int *nResult);

+private:

+

+    CJBig2_BitStream *m_pStream;

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp
new file mode 100644
index 0000000..af4a549
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp
@@ -0,0 +1,193 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "JBig2_HuffmanTable.h"

+#include "JBig2_BitStream.h"

+#include <string.h>

+

+CJBig2_HuffmanTable::CJBig2_HuffmanTable(const JBig2TableLine *pTable, int nLines,

+        FX_BOOL bHTOOB)

+{

+    init();

+    m_bOK = parseFromStandardTable(pTable, nLines, bHTOOB);

+}

+

+CJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream *pStream)

+{

+    init();

+    m_bOK = parseFromCodedBuffer(pStream);

+}

+

+CJBig2_HuffmanTable::~CJBig2_HuffmanTable()

+{

+    if(CODES) {

+        m_pModule->JBig2_Free(CODES);

+    }

+    if(PREFLEN) {

+        m_pModule->JBig2_Free(PREFLEN);

+    }

+    if(RANGELEN) {

+        m_pModule->JBig2_Free(RANGELEN);

+    }

+    if(RANGELOW) {

+        m_pModule->JBig2_Free(RANGELOW);

+    }

+}

+void CJBig2_HuffmanTable::init()

+{

+    HTOOB = FALSE;

+    NTEMP = 0;

+    CODES = NULL;

+    PREFLEN = NULL;

+    RANGELEN = NULL;

+    RANGELOW = NULL;

+}

+int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB)

+{

+    int CURLEN, LENMAX, CURCODE, CURTEMP, i;

+    int *LENCOUNT;

+    int *FIRSTCODE;

+    HTOOB = bHTOOB;

+    NTEMP = nLines;

+    CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);

+    PREFLEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);

+    RANGELEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);

+    RANGELOW = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);

+    LENMAX = 0;

+    for(i = 0; i < NTEMP; i++) {

+        PREFLEN[i] = pTable[i].PREFLEN;

+        RANGELEN[i] = pTable[i].RANDELEN;

+        RANGELOW[i] = pTable[i].RANGELOW;

+        if(PREFLEN[i] > LENMAX) {

+            LENMAX = PREFLEN[i];

+        }

+    }

+    LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));

+    JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));

+    FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));

+    for(i = 0; i < NTEMP; i++) {

+        LENCOUNT[PREFLEN[i]] ++;

+    }

+    CURLEN = 1;

+    FIRSTCODE[0] = 0;

+    LENCOUNT[0]  = 0;

+    while(CURLEN <= LENMAX) {

+        FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;

+        CURCODE = FIRSTCODE[CURLEN];

+        CURTEMP = 0;

+        while(CURTEMP < NTEMP) {

+            if(PREFLEN[CURTEMP] == CURLEN) {

+                CODES[CURTEMP] = CURCODE;

+                CURCODE = CURCODE + 1;

+            }

+            CURTEMP = CURTEMP + 1;

+        }

+        CURLEN = CURLEN + 1;

+    }

+    m_pModule->JBig2_Free(LENCOUNT);

+    m_pModule->JBig2_Free(FIRSTCODE);

+    return 1;

+}

+

+#define HT_CHECK_MEMORY_ADJUST			\

+    if(NTEMP >= nSize)	\

+    {	\

+        nSize += 16;	\

+        PREFLEN  = (int*)m_pModule->JBig2_Realloc(PREFLEN,sizeof(int)*nSize);	\

+        RANGELEN = (int*)m_pModule->JBig2_Realloc(RANGELEN,sizeof(int)*nSize);	\

+        RANGELOW = (int*)m_pModule->JBig2_Realloc(RANGELOW,sizeof(int)*nSize);	\

+    }

+int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream *pStream)

+{

+    unsigned char HTPS, HTRS;

+    int HTLOW, HTHIGH;

+    int CURRANGELOW;

+    int nSize = 16;

+    int CURLEN, LENMAX, CURCODE, CURTEMP, i;

+    int *LENCOUNT;

+    int *FIRSTCODE;

+    unsigned char cTemp;

+    if(pStream->read1Byte(&cTemp) == -1) {

+        goto failed;

+    }

+    HTOOB = cTemp & 0x01;

+    HTPS  = ((cTemp >> 1) & 0x07) + 1;

+    HTRS  = ((cTemp >> 4) & 0x07) + 1;

+    if(pStream->readInteger((FX_DWORD*)&HTLOW) == -1 ||

+            pStream->readInteger((FX_DWORD*)&HTHIGH) == -1) {

+        goto failed;

+    }

+    PREFLEN  = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);

+    RANGELEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);

+    RANGELOW = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);

+    CURRANGELOW = HTLOW;

+    NTEMP = 0;

+    do {

+        HT_CHECK_MEMORY_ADJUST

+        if((pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1)

+                || (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1)) {

+            goto failed;

+        }

+        RANGELOW[NTEMP] = CURRANGELOW;

+        CURRANGELOW = CURRANGELOW + (1 << RANGELEN[NTEMP]);

+        NTEMP = NTEMP + 1;

+    } while(CURRANGELOW < HTHIGH);

+    HT_CHECK_MEMORY_ADJUST

+    if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {

+        goto failed;

+    }

+    RANGELEN[NTEMP] = 32;

+    RANGELOW[NTEMP] = HTLOW - 1;

+    NTEMP = NTEMP + 1;

+    HT_CHECK_MEMORY_ADJUST

+    if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {

+        goto failed;

+    }

+    RANGELEN[NTEMP] = 32;

+    RANGELOW[NTEMP] = HTHIGH;

+    NTEMP = NTEMP + 1;

+    if(HTOOB) {

+        HT_CHECK_MEMORY_ADJUST

+        if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {

+            goto failed;

+        }

+        NTEMP = NTEMP + 1;

+    }

+    CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);

+    LENMAX = 0;

+    for(i = 0; i < NTEMP; i++) {

+        if(PREFLEN[i] > LENMAX) {

+            LENMAX = PREFLEN[i];

+        }

+    }

+    LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));

+    JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));

+    FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));

+    for(i = 0; i < NTEMP; i++) {

+        LENCOUNT[PREFLEN[i]] ++;

+    }

+    CURLEN = 1;

+    FIRSTCODE[0] = 0;

+    LENCOUNT[0]  = 0;

+    while(CURLEN <= LENMAX) {

+        FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;

+        CURCODE = FIRSTCODE[CURLEN];

+        CURTEMP = 0;

+        while(CURTEMP < NTEMP) {

+            if(PREFLEN[CURTEMP] == CURLEN) {

+                CODES[CURTEMP] = CURCODE;

+                CURCODE = CURCODE + 1;

+            }

+            CURTEMP = CURTEMP + 1;

+        }

+        CURLEN = CURLEN + 1;

+    }

+    m_pModule->JBig2_Free(LENCOUNT);

+    m_pModule->JBig2_Free(FIRSTCODE);

+    return TRUE;

+failed:

+    return FALSE;

+}

diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.h b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.h
new file mode 100644
index 0000000..df051c2
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.h
@@ -0,0 +1,42 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_HUFFMAN_TABLE_H_

+#define _JBIG2_HUFFMAN_TABLE_H_

+#include "JBig2_Module.h"

+#include "JBig2_HuffmanTable_Standard.h"

+#include "JBig2_BitStream.h"

+class CJBig2_HuffmanTable : public CJBig2_Object

+{

+public:

+

+    CJBig2_HuffmanTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB);

+

+    CJBig2_HuffmanTable(CJBig2_BitStream *pStream);

+

+    ~CJBig2_HuffmanTable();

+

+    void init();

+

+    int parseFromStandardTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB);

+

+    int parseFromCodedBuffer(CJBig2_BitStream *pStream);

+

+    FX_BOOL isOK()

+    {

+        return m_bOK;

+    }

+private:

+    FX_BOOL HTOOB;

+    int NTEMP;

+    int *CODES;

+    int *PREFLEN;

+    int *RANGELEN;

+    int *RANGELOW;

+    FX_BOOL m_bOK;

+    friend class CJBig2_HuffmanDecoder;

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h b/core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h
new file mode 100644
index 0000000..f611436
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h
@@ -0,0 +1,251 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_HUFFMAN_TABLE_STANDARD_H_

+#define _JBIG2_HUFFMAN_TABLE_STANDARD_H_

+typedef struct {

+    int PREFLEN;

+    int RANDELEN;

+    int RANGELOW;

+} JBig2TableLine;

+const FX_BOOL HuffmanTable_HTOOB_B1 = FALSE;

+const JBig2TableLine HuffmanTable_B1[] = {

+    { 1,	4,		0 },

+    { 2,	8,	   16 },

+    { 3,   16,	  272 },

+    { 0,   32,	   -1 },

+    { 3,   32,	65808 }

+};

+const FX_BOOL HuffmanTable_HTOOB_B2 = TRUE;

+const JBig2TableLine HuffmanTable_B2[] = {

+    { 1,	0,		0 },

+    { 2,	0,		1 },

+    { 3,	0,		2 },

+    { 4,	3,		3 },

+    { 5,	6,	   11 },

+    { 0,   32,	   -1 },

+    { 6,   32,     75 },

+    { 6,	0,      0 }

+};

+const FX_BOOL HuffmanTable_HTOOB_B3 = TRUE;

+const JBig2TableLine HuffmanTable_B3[] = {

+    { 8,	8,   -256 },

+    { 1,	0,		0 },

+    { 2,	0,		1 },

+    { 3,	0,		2 },

+    { 4,	3,		3 },

+    { 5,	6,	   11 },

+    { 8,   32,   -257 },

+    { 7,   32,     75 },

+    { 6,	0,		0 }

+};

+const FX_BOOL HuffmanTable_HTOOB_B4 = FALSE;

+const JBig2TableLine HuffmanTable_B4[] = {

+    { 1,	0,		1 },

+    { 2,	0,		2 },

+    { 3,	0,		3 },

+    { 4,	3,		4 },

+    { 5,	6,	   12 },

+    { 0,   32,     -1 },

+    { 5,   32,	   76 },

+};

+const FX_BOOL HuffmanTable_HTOOB_B5 = FALSE;

+const JBig2TableLine HuffmanTable_B5[] = {

+    { 7,	8,	 -255 },

+    { 1,	0,	    1 },

+    { 2,	0,	    2 },

+    { 3,    0,      3 },

+    { 4,	3,	    4 },

+    { 5,	6,	   12 },

+    { 7,   32,   -256 },

+    { 6,   32,     76 }

+};

+const FX_BOOL HuffmanTable_HTOOB_B6 = FALSE;

+const JBig2TableLine HuffmanTable_B6[] = {

+    { 5,   10,	-2048 },

+    { 4,    9,	-1024 },

+    { 4,	8,	 -512 },

+    { 4,	7,	 -256 },

+    { 5,	6,	 -128 },

+    { 5,	5,	  -64 },

+    { 4,	5,	  -32 },

+    { 2,	7,		0 },

+    { 3,	7,	  128 },

+    { 3,	8,	  256 },

+    { 4,	9,	  512 },

+    { 4,   10,	 1024 },

+    { 6,   32,	-2049 },

+    { 6,   32,	 2048 }

+};

+const FX_BOOL HuffmanTable_HTOOB_B7 = FALSE;

+const JBig2TableLine HuffmanTable_B7[] = {

+    { 4,	9,	-1024 },

+    { 3,	8,	 -512 },

+    { 4,	7,	 -256 },

+    { 5,	6,	 -128 },

+    { 5,	5,	  -64 },

+    { 4,	5,	  -32 },

+    { 4,	5,		0 },

+    { 5,	5,	   32 },

+    { 5,	6,	   64 },

+    { 4,	7,	  128 },

+    { 3,	8,	  256 },

+    { 3,	9,	  512 },

+    { 3,   10,	 1024 },

+    { 5,   32,	-1025 },

+    { 5,   32,	 2048 },

+};

+const FX_BOOL HuffmanTable_HTOOB_B8 = TRUE;

+const JBig2TableLine HuffmanTable_B8[] = {

+    { 8,	3,	  -15 },

+    { 9,	1,	   -7 },

+    { 8,	1,	   -5 },

+    { 9,	0,	   -3 },

+    { 7,	0,	   -2 },

+    { 4,	0,	   -1 },

+    { 2,	1,		0 },

+    { 5,	0,		2 },

+    { 6,	0,		3 },

+    { 3,	4,		4 },

+    { 6,	1,	   20 },

+    { 4,	4,	   22 },

+    { 4,	5,	   38 },

+    { 5,	6,	   70 },

+    { 5,	7,	  134 },

+    { 6,	7,	  262 },

+    { 7,	8,	  390 },

+    { 6,   10,	  646 },

+    { 9,   32,	  -16 },

+    { 9,   32,	 1670 },

+    { 2,	0,		0 }

+};

+const FX_BOOL HuffmanTable_HTOOB_B9 = TRUE;

+const JBig2TableLine HuffmanTable_B9[] = {

+    { 8,	4,	  -31 },

+    { 9,	2,	  -15 },

+    { 8,	2,	  -11 },

+    { 9,	1,	   -7 },

+    { 7,	1,	   -5 },

+    { 4,	1,	   -3 },

+    { 3,	1,	   -1 },

+    { 3,	1,		1 },

+    { 5,	1,		3 },

+    { 6,	1,		5 },

+    { 3,	5,		7 },

+    { 6,	2,	   39 },

+    { 4,	5,	   43 },

+    { 4,	6,	   75 },

+    { 5,	7,	  139 },

+    { 5,	8,	  267 },

+    { 6,	8,	  523 },

+    { 7,	9,	  779 },

+    { 6,   11,	 1291 },

+    { 9,   32,	  -32 },

+    { 9,   32,	 3339 },

+    { 2,	0,		0 }

+};

+const FX_BOOL HuffmanTable_HTOOB_B10 = TRUE;

+const JBig2TableLine HuffmanTable_B10[] = {

+    { 7,	4,	  -21 },

+    { 8,	0,	   -5 },

+    { 7,	0,	   -4 },

+    { 5,	0,	   -3 },

+    { 2,	2,	   -2 },

+    { 5,	0,		2 },

+    { 6,	0,		3 },

+    { 7,	0,		4 },

+    { 8,	0,		5 },

+    { 2,	6,		6 },

+    { 5,	5,	   70 },

+    { 6,	5,	  102 },

+    { 6,	6,	  134 },

+    { 6,	7,	  198 },

+    { 6,	8,	  326 },

+    { 6,	9,	  582 },

+    { 6,   10,	 1094 },

+    { 7,   11,	 2118 },

+    { 8,   32,	  -22 },

+    { 8,   32,	 4166 },

+    { 2,	0,		0 }

+};

+const FX_BOOL HuffmanTable_HTOOB_B11 = FALSE;

+const JBig2TableLine HuffmanTable_B11[] = {

+    { 1,	0,		1 },

+    { 2,	1,		2 },

+    { 4,	0,		4 },

+    { 4,	1,		5 },

+    { 5,	1,		7 },

+    { 5,	2,		9 },

+    { 6,	2,	   13 },

+    { 7,	2,	   17 },

+    { 7,	3,	   21 },

+    { 7,	4,	   29 },

+    { 7,	5,	   45 },

+    { 7,	6,	   77 },

+    { 0,   32,		0 },

+    { 7,   32,	  141 }

+};

+const FX_BOOL HuffmanTable_HTOOB_B12 = FALSE;

+const JBig2TableLine HuffmanTable_B12[] = {

+    { 1,	0,		1 },

+    { 2,	0,		2 },

+    { 3,	1,		3 },

+    { 5,	0,		5 },

+    { 5,	1,		6 },

+    { 6,	1,		8 },

+    { 7,	0,	   10 },

+    { 7,	1,	   11 },

+    { 7,	2,	   13 },

+    { 7,	3,	   17 },

+    { 7,	4,	   25 },

+    { 8,	5,	   41 },

+    { 0,   32,		0 },

+    { 8,   32,	   73 }

+};

+const FX_BOOL HuffmanTable_HTOOB_B13 = FALSE;

+const JBig2TableLine HuffmanTable_B13[] = {

+    { 1,	0,		1 },

+    { 3,	0,		2 },

+    { 4,	0,		3 },

+    { 5,	0,		4 },

+    { 4,	1,		5 },

+    { 3,	3,		7 },

+    { 6,	1,	   15 },

+    { 6,	2,	   17 },

+    { 6,	3,	   21 },

+    { 6,	4,	   29 },

+    { 6,	5,	   45 },

+    { 7,	6,	   77 },

+    { 0,   32,		0 },

+    { 7,   32,	  141 }

+};

+const FX_BOOL HuffmanTable_HTOOB_B14 = FALSE;

+const JBig2TableLine HuffmanTable_B14[] = {

+    { 3,	0,	   -2 },

+    { 3,	0,	   -1 },

+    { 1,	0,		0 },

+    { 3,	0,		1 },

+    { 3,	0,		2 },

+    { 0,   32,	   -3 },

+    { 0,   32,		3 }

+};

+const FX_BOOL HuffmanTable_HTOOB_B15 = FALSE;

+const JBig2TableLine HuffmanTable_B15[] = {

+    { 7,	4,	  -24 },

+    { 6,	2,	   -8 },

+    { 5,	1,	   -4 },

+    { 4,	0,	   -2 },

+    { 3,	0,	   -1 },

+    { 1,	0,		0 },

+    { 3,	0,		1 },

+    { 4,	0,		2 },

+    { 5,	1,		3 },

+    { 6,	2,		5 },

+    { 7,	4,		9 },

+    { 7,   32,	  -25 },

+    { 7,   32,	   25 }

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_Image.cpp b/core/src/fxcodec/jbig2/JBig2_Image.cpp
new file mode 100644
index 0000000..1719028
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Image.cpp
@@ -0,0 +1,1619 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "JBig2_Image.h"

+#include "../../../include/fxcrt/fx_basic.h"

+#include "../../../include/fxcrt/fx_coordinates.h"

+#include <limits.h>

+CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h)

+{

+    m_nWidth	= w;

+    m_nHeight	= h;

+    if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) {

+        m_pData = NULL;

+        m_bNeedFree = FALSE;

+        return;

+    }

+    m_nStride  = ((w + 31) >> 5) << 2;

+    if (m_nStride * m_nHeight > 0 && 104857600 / (int)m_nStride > m_nHeight) {

+        m_pData = (FX_BYTE *)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);

+    } else {

+        m_pData = NULL;

+    }

+    m_bNeedFree = TRUE;

+}

+CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf)

+{

+    m_nWidth = w;

+    m_nHeight = h;

+    m_nStride = stride;

+    m_pData = pBuf;

+    m_bNeedFree = FALSE;

+}

+CJBig2_Image::CJBig2_Image(CJBig2_Image &im)

+{

+    m_pModule = im.m_pModule;

+    m_nWidth	= im.m_nWidth;

+    m_nHeight	= im.m_nHeight;

+    m_nStride	= im.m_nStride;

+    if (im.m_pData) {

+        m_pData = (FX_BYTE*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);

+        JBIG2_memcpy(m_pData, im.m_pData, m_nStride * m_nHeight);

+    } else {

+        m_pData = NULL;

+    }

+    m_bNeedFree = TRUE;

+}

+CJBig2_Image::~CJBig2_Image()

+{

+    if(m_bNeedFree && m_pData) {

+        m_pModule->JBig2_Free(m_pData);

+    }

+}

+FX_BOOL CJBig2_Image::getPixel(FX_INT32 x, FX_INT32 y)

+{

+    if (!m_pData) {

+        return 0;

+    }

+    FX_INT32 m, n;

+    if(x < 0 || x >= m_nWidth) {

+        return 0;

+    }

+    if(y < 0 || y >= m_nHeight) {

+        return 0;

+    }

+    m = y * m_nStride + (x >> 3);

+    n = x & 7;

+    return ((m_pData[m] >> (7 - n)) & 1);

+}

+

+FX_INT32 CJBig2_Image::setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v)

+{

+    if (!m_pData) {

+        return 0;

+    }

+    FX_INT32 m, n;

+    if(x < 0 || x >= m_nWidth) {

+        return 0;

+    }

+    if(y < 0 || y >= m_nHeight) {

+        return 0;

+    }

+    m = y * m_nStride + (x >> 3);

+    n = x & 7;

+    if(v) {

+        m_pData[m] |= 1 << (7 - n);

+    } else {

+        m_pData[m] &= ~(1 << (7 - n));

+    }

+    return 1;

+}

+void CJBig2_Image::copyLine(FX_INT32 hTo, FX_INT32 hFrom)

+{

+    if (!m_pData) {

+        return;

+    }

+    if(hFrom < 0 || hFrom >= m_nHeight) {

+        JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride);

+    } else {

+        JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, m_nStride);

+    }

+}

+void CJBig2_Image::fill(FX_BOOL v)

+{

+    if (!m_pData) {

+        return;

+    }

+    JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight);

+}

+FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)

+{

+    if (!m_pData) {

+        return FALSE;

+    }

+    return composeTo_opt2(pDst, x, y, op);

+}

+FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)

+{

+    if (!m_pData) {

+        return FALSE;

+    }

+    if (NULL == pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) {

+        return composeTo_opt2(pDst, x, y, op);

+    }

+    return composeTo_opt2(pDst, x, y, op, pSrcRect);

+}

+FX_BOOL CJBig2_Image::composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)

+{

+    FX_INT32 w, h, dx, dy;

+    FX_INT32 i, j;

+    w = m_nWidth;

+    h = m_nHeight;

+    dx = dy = 0;

+    if(x < 0) {

+        dx += -x;

+        w  -= -x;

+        x = 0;

+    }

+    if(y < 0) {

+        dy += -y;

+        h  -= -y;

+        y = 0;

+    }

+    if(x + w > pDst->m_nWidth) {

+        w = pDst->m_nWidth - x;

+    }

+    if(y + h > pDst->m_nHeight) {

+        h = pDst->m_nHeight - y;

+    }

+    switch(op) {

+        case JBIG2_COMPOSE_OR:

+            for(j = 0; j < h; j++) {

+                for(i = 0; i < w; i++) {

+                    pDst->setPixel(x + i, y + j,

+                                   (getPixel(i + dx, j + dy) | pDst->getPixel(x + i, y + j)) & 1);

+                }

+            }

+            break;

+        case JBIG2_COMPOSE_AND:

+            for(j = 0; j < h; j++) {

+                for(i = 0; i < w; i++) {

+                    pDst->setPixel(x + i, y + j,

+                                   (getPixel(i + dx, j + dy) & pDst->getPixel(x + i, y + j)) & 1);

+                }

+            }

+            break;

+        case JBIG2_COMPOSE_XOR:

+            for(j = 0; j < h; j++) {

+                for(i = 0; i < w; i++) {

+                    pDst->setPixel(x + i, y + j,

+                                   (getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j)) & 1);

+                }

+            }

+            break;

+        case JBIG2_COMPOSE_XNOR:

+            for(j = 0; j < h; j++) {

+                for(i = 0; i < w; i++) {

+                    pDst->setPixel(x + i, y + j,

+                                   (~(getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j))) & 1);

+                }

+            }

+            break;

+        case JBIG2_COMPOSE_REPLACE:

+            for(j = 0; j < h; j++) {

+                for(i = 0; i < w; i++) {

+                    pDst->setPixel(x + i, y + j, getPixel(i + dx, j + dy));

+                }

+            }

+            break;

+    }

+    return TRUE;

+}

+

+FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)

+{

+    FX_INT32 x0, x1, y0, y1, xx, yy;

+    FX_BYTE *pLineSrc, *pLineDst, *srcPtr, *destPtr;

+    FX_DWORD src0, src1, src, dest, s1, s2, m1, m2, m3;

+    FX_BOOL oneByte;

+    if (!m_pData) {

+        return FALSE;

+    }

+    if (y < 0) {

+        y0 = -y;

+    } else {

+        y0 = 0;

+    }

+    if (y + m_nHeight > pDst->m_nHeight) {

+        y1 = pDst->m_nHeight - y;

+    } else {

+        y1 = m_nHeight;

+    }

+    if (y0 >= y1) {

+        return FALSE;

+    }

+    if (x >= 0) {

+        x0 = x & ~7;

+    } else {

+        x0 = 0;

+    }

+    x1 = x + m_nWidth;

+    if (x1 > pDst->m_nWidth) {

+        x1 = pDst->m_nWidth;

+    }

+    if (x0 >= x1) {

+        return FALSE;

+    }

+    s1 = x & 7;

+    s2 = 8 - s1;

+    m1 = 0xff >> (x1 & 7);

+    m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7));

+    m3 = (0xff >> s1) & m2;

+    oneByte = x0 == ((x1 - 1) & ~7);

+    pLineDst = pDst->m_pData + y * pDst->m_nStride;

+    pLineSrc = m_pData + y0 * m_nStride;

+    if(oneByte) {

+        if(x >= 0) {

+            switch(op) {

+                case JBIG2_COMPOSE_OR: {

+                        for (yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst + (x >> 3);

+                            srcPtr = pLineSrc;

+                            dest = *destPtr;

+                            dest |= (*srcPtr >> s1) & m2;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_AND: {

+                        for (yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst + (x >> 3);

+                            srcPtr = pLineSrc;

+                            dest = *destPtr;

+                            dest &= ((0xff00 | *srcPtr) >> s1) | m1;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_XOR: {

+                        for (yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst + (x >> 3);

+                            srcPtr = pLineSrc;

+                            dest = *destPtr;

+                            dest ^= (*srcPtr >> s1) & m2;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_XNOR: {

+                        for (yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst + (x >> 3);

+                            srcPtr = pLineSrc;

+                            dest = *destPtr;

+                            dest ^= ((*srcPtr ^ 0xff) >> s1) & m2;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_REPLACE: {

+                        for (yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst + (x >> 3);

+                            srcPtr = pLineSrc;

+                            dest = *destPtr;

+                            dest = (dest & ~m3) | ((*srcPtr >> s1) & m3);

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+            }

+        } else {

+            switch(op) {

+                case JBIG2_COMPOSE_OR: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst;

+                            srcPtr = pLineSrc + (-x >> 3);

+                            dest = *destPtr;

+                            dest |= *srcPtr & m2;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_AND: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst;

+                            srcPtr = pLineSrc + (-x >> 3);

+                            dest = *destPtr;

+                            dest &= *srcPtr | m1;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_XOR: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst;

+                            srcPtr = pLineSrc + (-x >> 3);

+                            dest = *destPtr;

+                            dest ^= *srcPtr & m2;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_XNOR: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst;

+                            srcPtr = pLineSrc + (-x >> 3);

+                            dest = *destPtr;

+                            dest ^= (*srcPtr ^ 0xff) & m2;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_REPLACE: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst;

+                            srcPtr = pLineSrc + (-x >> 3);

+                            dest = *destPtr;

+                            dest = (*srcPtr & m2) | (dest & m1);

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+            }

+        }

+    } else {

+        if(x >= 0) {

+            switch(op) {

+                case JBIG2_COMPOSE_OR: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst + (x >> 3);

+                            srcPtr = pLineSrc;

+                            src1 = *srcPtr++;

+                            dest = *destPtr;

+                            dest |= src1 >> s1;

+                            *destPtr++ = (FX_BYTE)dest;

+                            xx = x0 + 8;

+                            for (; xx < x1 - 8; xx += 8) {

+                                dest = *destPtr;

+                                src0 = src1;

+                                src1 = *srcPtr++;

+                                src = (((src0 << 8) | src1) >> s1) & 0xff;

+                                dest |= src;

+                                *destPtr++ = (FX_BYTE)dest;

+                            }

+                            dest = *destPtr;

+                            src0 = src1;

+                            if(srcPtr - pLineSrc < m_nStride) {

+                                src1 = *srcPtr++;

+                            } else {

+                                src1 = 0;

+                            }

+                            src = (((src0 << 8) | src1) >> s1) & 0xff;

+                            dest |= src & m2;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_AND: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst + (x >> 3);

+                            srcPtr = pLineSrc;

+                            src1 = *srcPtr++;

+                            dest = *destPtr;

+                            dest &= (0xff00 | src1) >> s1;

+                            *destPtr++ = (FX_BYTE)dest;

+                            xx = x0 + 8;

+                            for (; xx < x1 - 8; xx += 8) {

+                                dest = *destPtr;

+                                src0 = src1;

+                                src1 = *srcPtr++;

+                                src = (((src0 << 8) | src1) >> s1) & 0xff;

+                                dest &= src;

+                                *destPtr++ = (FX_BYTE)dest;

+                            }

+                            dest = *destPtr;

+                            src0 = src1;

+                            if(srcPtr - pLineSrc < m_nStride) {

+                                src1 = *srcPtr++;

+                            } else {

+                                src1 = 0;

+                            }

+                            src = (((src0 << 8) | src1) >> s1) & 0xff;

+                            dest &= src | m1;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_XOR: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst + (x >> 3);

+                            srcPtr = pLineSrc;

+                            src1 = *srcPtr++;

+                            dest = *destPtr;

+                            dest ^= src1 >> s1;

+                            *destPtr++ = (FX_BYTE)dest;

+                            xx = x0 + 8;

+                            for (; xx < x1 - 8; xx += 8) {

+                                dest = *destPtr;

+                                src0 = src1;

+                                src1 = *srcPtr++;

+                                src = (((src0 << 8) | src1) >> s1) & 0xff;

+                                dest ^= src;

+                                *destPtr++ = (FX_BYTE)dest;

+                            }

+                            dest = *destPtr;

+                            src0 = src1;

+                            if(srcPtr - pLineSrc < m_nStride) {

+                                src1 = *srcPtr++;

+                            } else {

+                                src1 = 0;

+                            }

+                            src = (((src0 << 8) | src1) >> s1) & 0xff;

+                            dest ^= src & m2;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_XNOR: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst + (x >> 3);

+                            srcPtr = pLineSrc;

+                            src1 = *srcPtr++;

+                            dest = *destPtr;

+                            dest ^= (src1 ^ 0xff) >> s1;

+                            *destPtr++ = (FX_BYTE)dest;

+                            xx = x0 + 8;

+                            for (; xx < x1 - 8; xx += 8) {

+                                dest = *destPtr;

+                                src0 = src1;

+                                src1 = *srcPtr++;

+                                src = (((src0 << 8) | src1) >> s1) & 0xff;

+                                dest ^= src ^ 0xff;

+                                *destPtr++ = (FX_BYTE)dest;

+                            }

+                            dest = *destPtr;

+                            src0 = src1;

+                            if(srcPtr - pLineSrc < m_nStride) {

+                                src1 = *srcPtr++;

+                            } else {

+                                src1 = 0;

+                            }

+                            src = (((src0 << 8) | src1) >> s1) & 0xff;

+                            dest ^= (src ^ 0xff) & m2;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_REPLACE: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst + (x >> 3);

+                            srcPtr = pLineSrc;

+                            src1 = *srcPtr++;

+                            dest = *destPtr;

+                            dest = (dest & (0xff << s2)) | (src1 >> s1);

+                            *destPtr++ = (FX_BYTE)dest;

+                            xx = x0 + 8;

+                            for (; xx < x1 - 8; xx += 8) {

+                                dest = *destPtr;

+                                src0 = src1;

+                                src1 = *srcPtr++;

+                                src = (((src0 << 8) | src1) >> s1) & 0xff;

+                                dest = src;

+                                *destPtr++ = (FX_BYTE)dest;

+                            }

+                            dest = *destPtr;

+                            src0 = src1;

+                            if(srcPtr - pLineSrc < m_nStride) {

+                                src1 = *srcPtr++;

+                            } else {

+                                src1 = 0;

+                            }

+                            src = (((src0 << 8) | src1) >> s1) & 0xff;

+                            dest = (src & m2) | (dest & m1);

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+            }

+        } else {

+            switch(op) {

+                case JBIG2_COMPOSE_OR: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst;

+                            srcPtr = pLineSrc + (-x >> 3);

+                            src1 = *srcPtr++;

+                            xx = x0;

+                            for (; xx < x1 - 8; xx += 8) {

+                                dest = *destPtr;

+                                src0 = src1;

+                                src1 = *srcPtr++;

+                                src = (((src0 << 8) | src1) >> s1) & 0xff;

+                                dest |= src;

+                                *destPtr++ = (FX_BYTE)dest;

+                            }

+                            dest = *destPtr;

+                            src0 = src1;

+                            if(srcPtr - pLineSrc < m_nStride) {

+                                src1 = *srcPtr++;

+                            } else {

+                                src1 = 0;

+                            }

+                            src = (((src0 << 8) | src1) >> s1) & 0xff;

+                            dest |= src & m2;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_AND: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst;

+                            srcPtr = pLineSrc + (-x >> 3);

+                            src1 = *srcPtr++;

+                            xx = x0;

+                            for (; xx < x1 - 8; xx += 8) {

+                                dest = *destPtr;

+                                src0 = src1;

+                                src1 = *srcPtr++;

+                                src = (((src0 << 8) | src1) >> s1) & 0xff;

+                                dest &= src;

+                                *destPtr++ = (FX_BYTE)dest;

+                            }

+                            dest = *destPtr;

+                            src0 = src1;

+                            if(srcPtr - pLineSrc < m_nStride) {

+                                src1 = *srcPtr++;

+                            } else {

+                                src1 = 0;

+                            }

+                            src = (((src0 << 8) | src1) >> s1) & 0xff;

+                            dest &= src | m1;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_XOR: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst;

+                            srcPtr = pLineSrc + (-x >> 3);

+                            src1 = *srcPtr++;

+                            xx = x0;

+                            for (; xx < x1 - 8; xx += 8) {

+                                dest = *destPtr;

+                                src0 = src1;

+                                src1 = *srcPtr++;

+                                src = (((src0 << 8) | src1) >> s1) & 0xff;

+                                dest ^= src;

+                                *destPtr++ = (FX_BYTE)dest;

+                            }

+                            dest = *destPtr;

+                            src0 = src1;

+                            if(srcPtr - pLineSrc < m_nStride) {

+                                src1 = *srcPtr++;

+                            } else {

+                                src1 = 0;

+                            }

+                            src = (((src0 << 8) | src1) >> s1) & 0xff;

+                            dest ^= src & m2;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_XNOR: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst;

+                            srcPtr = pLineSrc + (-x >> 3);

+                            src1 = *srcPtr++;

+                            xx = x0;

+                            for (; xx < x1 - 8; xx += 8) {

+                                dest = *destPtr;

+                                src0 = src1;

+                                src1 = *srcPtr++;

+                                src = (((src0 << 8) | src1) >> s1) & 0xff;

+                                dest ^= src ^ 0xff;

+                                *destPtr++ = (FX_BYTE)dest;

+                            }

+                            dest = *destPtr;

+                            src0 = src1;

+                            if(srcPtr - pLineSrc < m_nStride) {

+                                src1 = *srcPtr++;

+                            } else {

+                                src1 = 0;

+                            }

+                            src = (((src0 << 8) | src1) >> s1) & 0xff;

+                            dest ^= (src ^ 0xff) & m2;

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+                case JBIG2_COMPOSE_REPLACE: {

+                        for(yy = y0; yy < y1; ++yy) {

+                            destPtr = pLineDst;

+                            srcPtr = pLineSrc + (-x >> 3);

+                            src1 = *srcPtr++;

+                            xx = x0;

+                            for (; xx < x1 - 8; xx += 8) {

+                                dest = *destPtr;

+                                src0 = src1;

+                                src1 = *srcPtr++;

+                                src = (((src0 << 8) | src1) >> s1) & 0xff;

+                                dest = src;

+                                *destPtr++ = (FX_BYTE)dest;

+                            }

+                            dest = *destPtr;

+                            src0 = src1;

+                            if(srcPtr - pLineSrc < m_nStride) {

+                                src1 = *srcPtr++;

+                            } else {

+                                src1 = 0;

+                            }

+                            src = (((src0 << 8) | src1) >> s1) & 0xff;

+                            dest = (src & m2) | (dest & m1);

+                            *destPtr = (FX_BYTE)dest;

+                            pLineDst += pDst->m_nStride;

+                            pLineSrc += m_nStride;

+                        }

+                    }

+                    break;

+            }

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op)

+{

+    if (!m_pData) {

+        return FALSE;

+    }

+    return pSrc->composeTo(this, x, y, op);

+}

+FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect)

+{

+    if (!m_pData) {

+        return FALSE;

+    }

+    return pSrc->composeTo(this, x, y, op, pSrcRect);

+}

+CJBig2_Image *CJBig2_Image::subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)

+{

+    CJBig2_Image *pImage;

+    FX_INT32 i, j;

+    JBIG2_ALLOC(pImage, CJBig2_Image(w, h));

+    for(j = 0; j < h; j++) {

+        for(i = 0; i < w; i++) {

+            pImage->setPixel(i, j, getPixel(x + i, y + j));

+        }

+    }

+    return pImage;

+}

+#define JBIG2_GETDWORD(buf)	((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3]))

+CJBig2_Image *CJBig2_Image::subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)

+{

+    CJBig2_Image *pImage;

+    FX_INT32 m, n, j;

+    FX_BYTE *pLineSrc, *pLineDst;

+    FX_DWORD wTmp;

+    FX_BYTE *pSrc, *pSrcEnd, *pDst, *pDstEnd;

+    if (w == 0 || h == 0) {

+        return NULL;

+    }

+    JBIG2_ALLOC(pImage, CJBig2_Image(w, h));

+    if (!m_pData) {

+        pImage->fill(0);

+        return pImage;

+    }

+    if (!pImage->m_pData) {

+        return pImage;

+    }

+    pLineSrc = m_pData + m_nStride * y;

+    pLineDst = pImage->m_pData;

+    m = (x >> 5) << 2;

+    n = x & 31;

+    if(n == 0) {

+        for(j = 0; j < h; j++) {

+            pSrc = pLineSrc + m;

+            pSrcEnd = pLineSrc + m_nStride;

+            pDst = pLineDst;

+            pDstEnd = pLineDst + pImage->m_nStride;

+            for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {

+                *((FX_DWORD *)pDst) = *((FX_DWORD *)pSrc);

+            }

+            pLineSrc += m_nStride;

+            pLineDst += pImage->m_nStride;

+        }

+    } else {

+        for(j = 0; j < h; j++) {

+            pSrc = pLineSrc + m;

+            pSrcEnd = pLineSrc + m_nStride;

+            pDst = pLineDst;

+            pDstEnd = pLineDst + pImage->m_nStride;

+            for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {

+                if(pSrc + 4 < pSrcEnd) {

+                    wTmp = (JBIG2_GETDWORD(pSrc) << n) | (JBIG2_GETDWORD(pSrc + 4) >> (32 - n));

+                } else {

+                    wTmp = JBIG2_GETDWORD(pSrc) << n;

+                }

+                pDst[0] = (FX_BYTE)(wTmp >> 24);

+                pDst[1] = (FX_BYTE)(wTmp >> 16);

+                pDst[2] = (FX_BYTE)(wTmp >> 8);

+                pDst[3] = (FX_BYTE)wTmp;

+            }

+            pLineSrc += m_nStride;

+            pLineDst += pImage->m_nStride;

+        }

+    }

+    return pImage;

+}

+void CJBig2_Image::expand(FX_INT32 h, FX_BOOL v)

+{

+    if (!m_pData) {

+        return;

+    }

+    m_pData = (FX_BYTE*)m_pModule->JBig2_Realloc(m_pData, h * m_nStride);

+    if(h > m_nHeight) {

+        JBIG2_memset(m_pData + m_nHeight * m_nStride, v ? 0xff : 0, (h - m_nHeight)*m_nStride);

+    }

+    m_nHeight = h;

+}

+FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)

+{

+    FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;

+    FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM;

+    FX_BYTE *lineSrc, *lineDst, *sp, *dp;

+    if (!m_pData) {

+        return FALSE;

+    }

+    if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {

+        return FALSE;

+    }

+    if(y < 0) {

+        ys0 = -y;

+    } else {

+        ys0 = 0;

+    }

+    if(y + m_nHeight > pDst->m_nHeight) {

+        ys1 = pDst->m_nHeight - y;

+    } else {

+        ys1 = m_nHeight;

+    }

+    if(x < 0) {

+        xs0 = -x;

+    } else {

+        xs0 = 0;

+    }

+    if(x + m_nWidth > pDst->m_nWidth) {

+        xs1 = pDst->m_nWidth - x;

+    } else {

+        xs1 = m_nWidth;

+    }

+    if((ys0 >= ys1) || (xs0 >= xs1)) {

+        return 0;

+    }

+    w = xs1 - xs0;

+    h = ys1 - ys0;

+    if(y < 0) {

+        yd0 = 0;

+    } else {

+        yd0 = y;

+    }

+    if(x < 0) {

+        xd0 = 0;

+    } else {

+        xd0 = x;

+    }

+    xd1 = xd0 + w;

+    yd1 = yd0 + h;

+    d1 = xd0 & 31;

+    d2 = xd1 & 31;

+    s1 = xs0 & 31;

+    maskL = 0xffffffff >> d1;

+    maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);

+    maskM = maskL & maskR;

+    lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2);

+    lineLeft = m_nStride - ((xs0 >> 5) << 2);

+    lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);

+    if((xd0 & ~31) == ((xd1 - 1) & ~31)) {

+        if((xs0 & ~31) == ((xs1 - 1) & ~31)) {

+            if(s1 > d1) {

+                shift = s1 - d1;

+                for(yy = yd0; yy < yd1; yy++) {

+                    tmp1 = JBIG2_GETDWORD(lineSrc) << shift;

+                    tmp2 = JBIG2_GETDWORD(lineDst);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskM) | (tmp1 & maskM);

+                            break;

+                    }

+                    lineDst[0] = (FX_BYTE)(tmp >> 24);

+                    lineDst[1] = (FX_BYTE)(tmp >> 16);

+                    lineDst[2] = (FX_BYTE)(tmp >> 8);

+                    lineDst[3] = (FX_BYTE)tmp;

+                    lineSrc += m_nStride;

+                    lineDst += pDst->m_nStride;

+                }

+            } else {

+                shift = d1 - s1;

+                for(yy = yd0; yy < yd1; yy++) {

+                    tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;

+                    tmp2 = JBIG2_GETDWORD(lineDst);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskM) | (tmp1 & maskM);

+                            break;

+                    }

+                    lineDst[0] = (FX_BYTE)(tmp >> 24);

+                    lineDst[1] = (FX_BYTE)(tmp >> 16);

+                    lineDst[2] = (FX_BYTE)(tmp >> 8);

+                    lineDst[3] = (FX_BYTE)tmp;

+                    lineSrc += m_nStride;

+                    lineDst += pDst->m_nStride;

+                }

+            }

+        } else {

+            shift1 = s1 - d1;

+            shift2 = 32 - shift1;

+            for(yy = yd0; yy < yd1; yy++) {

+                tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);

+                tmp2 = JBIG2_GETDWORD(lineDst);

+                switch(op) {

+                    case JBIG2_COMPOSE_OR:

+                        tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);

+                        break;

+                    case JBIG2_COMPOSE_AND:

+                        tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);

+                        break;

+                    case JBIG2_COMPOSE_XOR:

+                        tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);

+                        break;

+                    case JBIG2_COMPOSE_XNOR:

+                        tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);

+                        break;

+                    case JBIG2_COMPOSE_REPLACE:

+                        tmp = (tmp2 & ~maskM) | (tmp1 & maskM);

+                        break;

+                }

+                lineDst[0] = (FX_BYTE)(tmp >> 24);

+                lineDst[1] = (FX_BYTE)(tmp >> 16);

+                lineDst[2] = (FX_BYTE)(tmp >> 8);

+                lineDst[3] = (FX_BYTE)tmp;

+                lineSrc += m_nStride;

+                lineDst += pDst->m_nStride;

+            }

+        }

+    } else {

+        if(s1 > d1) {

+            shift1 = s1 - d1;

+            shift2 = 32 - shift1;

+            middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);

+            for(yy = yd0; yy < yd1; yy++) {

+                sp = lineSrc;

+                dp = lineDst;

+                if(d1 != 0) {

+                    tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskL) | (tmp1 & maskL);

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                    sp += 4;

+                    dp += 4;

+                }

+                for(xx = 0; xx < middleDwords; xx++) {

+                    tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = tmp1 | tmp2;

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = tmp1 & tmp2;

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = tmp1 ^ tmp2;

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = ~(tmp1 ^ tmp2);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = tmp1;

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                    sp += 4;

+                    dp += 4;

+                }

+                if(d2 != 0) {

+                    tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (

+                               ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskR) | (tmp1 & maskR);

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                }

+                lineSrc += m_nStride;

+                lineDst += pDst->m_nStride;

+            }

+        } else if(s1 == d1) {

+            middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);

+            for(yy = yd0; yy < yd1; yy++) {

+                sp = lineSrc;

+                dp = lineDst;

+                if(d1 != 0) {

+                    tmp1 = JBIG2_GETDWORD(sp);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskL) | (tmp1 & maskL);

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                    sp += 4;

+                    dp += 4;

+                }

+                for(xx = 0; xx < middleDwords; xx++) {

+                    tmp1 = JBIG2_GETDWORD(sp);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = tmp1 | tmp2;

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = tmp1 & tmp2;

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = tmp1 ^ tmp2;

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = ~(tmp1 ^ tmp2);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = tmp1;

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                    sp += 4;

+                    dp += 4;

+                }

+                if(d2 != 0) {

+                    tmp1 = JBIG2_GETDWORD(sp);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskR) | (tmp1 & maskR);

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                }

+                lineSrc += m_nStride;

+                lineDst += pDst->m_nStride;

+            }

+        } else {

+            shift1 = d1 - s1;

+            shift2 = 32 - shift1;

+            middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);

+            for(yy = yd0; yy < yd1; yy++) {

+                sp = lineSrc;

+                dp = lineDst;

+                if(d1 != 0) {

+                    tmp1 = JBIG2_GETDWORD(sp) >> shift1;

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskL) | (tmp1 & maskL);

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                    dp += 4;

+                }

+                for(xx = 0; xx < middleDwords; xx++) {

+                    tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = tmp1 | tmp2;

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = tmp1 & tmp2;

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = tmp1 ^ tmp2;

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = ~(tmp1 ^ tmp2);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = tmp1;

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                    sp += 4;

+                    dp += 4;

+                }

+                if(d2 != 0) {

+                    tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (

+                               ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskR) | (tmp1 & maskR);

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                }

+                lineSrc += m_nStride;

+                lineDst += pDst->m_nStride;

+            }

+        }

+    }

+    return 1;

+}

+FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)

+{

+    FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;

+    FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM;

+    FX_BYTE *lineSrc, *lineDst, *sp, *dp;

+    FX_INT32 sw, sh;

+    if (!m_pData) {

+        return FALSE;

+    }

+    if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {

+        return FALSE;

+    }

+    sw = pSrcRect->Width();

+    sh = pSrcRect->Height();

+    if(y < 0) {

+        ys0 = -y;

+    } else {

+        ys0 = 0;

+    }

+    if(y + sh > pDst->m_nHeight) {

+        ys1 = pDst->m_nHeight - y;

+    } else {

+        ys1 = sh;

+    }

+    if(x < 0) {

+        xs0 = -x;

+    } else {

+        xs0 = 0;

+    }

+    if(x + sw > pDst->m_nWidth) {

+        xs1 = pDst->m_nWidth - x;

+    } else {

+        xs1 = sw;

+    }

+    if((ys0 >= ys1) || (xs0 >= xs1)) {

+        return 0;

+    }

+    w = xs1 - xs0;

+    h = ys1 - ys0;

+    if(y < 0) {

+        yd0 = 0;

+    } else {

+        yd0 = y;

+    }

+    if(x < 0) {

+        xd0 = 0;

+    } else {

+        xd0 = x;

+    }

+    xd1 = xd0 + w;

+    yd1 = yd0 + h;

+    d1 = xd0 & 31;

+    d2 = xd1 & 31;

+    s1 = xs0 & 31;

+    maskL = 0xffffffff >> d1;

+    maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);

+    maskM = maskL & maskR;

+    lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride + (((xs0 + pSrcRect->left) >> 5) << 2);

+    lineLeft = m_nStride - ((xs0 >> 5) << 2);

+    lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);

+    if((xd0 & ~31) == ((xd1 - 1) & ~31)) {

+        if((xs0 & ~31) == ((xs1 - 1) & ~31)) {

+            if(s1 > d1) {

+                shift = s1 - d1;

+                for(yy = yd0; yy < yd1; yy++) {

+                    tmp1 = JBIG2_GETDWORD(lineSrc) << shift;

+                    tmp2 = JBIG2_GETDWORD(lineDst);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskM) | (tmp1 & maskM);

+                            break;

+                    }

+                    lineDst[0] = (FX_BYTE)(tmp >> 24);

+                    lineDst[1] = (FX_BYTE)(tmp >> 16);

+                    lineDst[2] = (FX_BYTE)(tmp >> 8);

+                    lineDst[3] = (FX_BYTE)tmp;

+                    lineSrc += m_nStride;

+                    lineDst += pDst->m_nStride;

+                }

+            } else {

+                shift = d1 - s1;

+                for(yy = yd0; yy < yd1; yy++) {

+                    tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;

+                    tmp2 = JBIG2_GETDWORD(lineDst);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskM) | (tmp1 & maskM);

+                            break;

+                    }

+                    lineDst[0] = (FX_BYTE)(tmp >> 24);

+                    lineDst[1] = (FX_BYTE)(tmp >> 16);

+                    lineDst[2] = (FX_BYTE)(tmp >> 8);

+                    lineDst[3] = (FX_BYTE)tmp;

+                    lineSrc += m_nStride;

+                    lineDst += pDst->m_nStride;

+                }

+            }

+        } else {

+            shift1 = s1 - d1;

+            shift2 = 32 - shift1;

+            for(yy = yd0; yy < yd1; yy++) {

+                tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);

+                tmp2 = JBIG2_GETDWORD(lineDst);

+                switch(op) {

+                    case JBIG2_COMPOSE_OR:

+                        tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);

+                        break;

+                    case JBIG2_COMPOSE_AND:

+                        tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);

+                        break;

+                    case JBIG2_COMPOSE_XOR:

+                        tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);

+                        break;

+                    case JBIG2_COMPOSE_XNOR:

+                        tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);

+                        break;

+                    case JBIG2_COMPOSE_REPLACE:

+                        tmp = (tmp2 & ~maskM) | (tmp1 & maskM);

+                        break;

+                }

+                lineDst[0] = (FX_BYTE)(tmp >> 24);

+                lineDst[1] = (FX_BYTE)(tmp >> 16);

+                lineDst[2] = (FX_BYTE)(tmp >> 8);

+                lineDst[3] = (FX_BYTE)tmp;

+                lineSrc += m_nStride;

+                lineDst += pDst->m_nStride;

+            }

+        }

+    } else {

+        if(s1 > d1) {

+            shift1 = s1 - d1;

+            shift2 = 32 - shift1;

+            middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);

+            for(yy = yd0; yy < yd1; yy++) {

+                sp = lineSrc;

+                dp = lineDst;

+                if(d1 != 0) {

+                    tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskL) | (tmp1 & maskL);

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                    sp += 4;

+                    dp += 4;

+                }

+                for(xx = 0; xx < middleDwords; xx++) {

+                    tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = tmp1 | tmp2;

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = tmp1 & tmp2;

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = tmp1 ^ tmp2;

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = ~(tmp1 ^ tmp2);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = tmp1;

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                    sp += 4;

+                    dp += 4;

+                }

+                if(d2 != 0) {

+                    tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (

+                               ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskR) | (tmp1 & maskR);

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                }

+                lineSrc += m_nStride;

+                lineDst += pDst->m_nStride;

+            }

+        } else if(s1 == d1) {

+            middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);

+            for(yy = yd0; yy < yd1; yy++) {

+                sp = lineSrc;

+                dp = lineDst;

+                if(d1 != 0) {

+                    tmp1 = JBIG2_GETDWORD(sp);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskL) | (tmp1 & maskL);

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                    sp += 4;

+                    dp += 4;

+                }

+                for(xx = 0; xx < middleDwords; xx++) {

+                    tmp1 = JBIG2_GETDWORD(sp);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = tmp1 | tmp2;

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = tmp1 & tmp2;

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = tmp1 ^ tmp2;

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = ~(tmp1 ^ tmp2);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = tmp1;

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                    sp += 4;

+                    dp += 4;

+                }

+                if(d2 != 0) {

+                    tmp1 = JBIG2_GETDWORD(sp);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskR) | (tmp1 & maskR);

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                }

+                lineSrc += m_nStride;

+                lineDst += pDst->m_nStride;

+            }

+        } else {

+            shift1 = d1 - s1;

+            shift2 = 32 - shift1;

+            middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);

+            for(yy = yd0; yy < yd1; yy++) {

+                sp = lineSrc;

+                dp = lineDst;

+                if(d1 != 0) {

+                    tmp1 = JBIG2_GETDWORD(sp) >> shift1;

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskL) | (tmp1 & maskL);

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                    dp += 4;

+                }

+                for(xx = 0; xx < middleDwords; xx++) {

+                    tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = tmp1 | tmp2;

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = tmp1 & tmp2;

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = tmp1 ^ tmp2;

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = ~(tmp1 ^ tmp2);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = tmp1;

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                    sp += 4;

+                    dp += 4;

+                }

+                if(d2 != 0) {

+                    tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (

+                               ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);

+                    tmp2 = JBIG2_GETDWORD(dp);

+                    switch(op) {

+                        case JBIG2_COMPOSE_OR:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_AND:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_XOR:

+                            tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_XNOR:

+                            tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);

+                            break;

+                        case JBIG2_COMPOSE_REPLACE:

+                            tmp = (tmp2 & ~maskR) | (tmp1 & maskR);

+                            break;

+                    }

+                    dp[0] = (FX_BYTE)(tmp >> 24);

+                    dp[1] = (FX_BYTE)(tmp >> 16);

+                    dp[2] = (FX_BYTE)(tmp >> 8);

+                    dp[3] = (FX_BYTE)tmp;

+                }

+                lineSrc += m_nStride;

+                lineDst += pDst->m_nStride;

+            }

+        }

+    }

+    return 1;

+}

diff --git a/core/src/fxcodec/jbig2/JBig2_Image.h b/core/src/fxcodec/jbig2/JBig2_Image.h
new file mode 100644
index 0000000..3c69f64
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Image.h
@@ -0,0 +1,68 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_IMAGE_H_

+#define _JBIG2_IMAGE_H_

+#include "JBig2_Define.h"

+#include "JBig2_Module.h"

+typedef enum {

+    JBIG2_COMPOSE_OR		= 0,

+    JBIG2_COMPOSE_AND		= 1,

+    JBIG2_COMPOSE_XOR		= 2,

+    JBIG2_COMPOSE_XNOR		= 3,

+    JBIG2_COMPOSE_REPLACE	= 4

+} JBig2ComposeOp;

+struct FX_RECT;

+class CJBig2_Image : public CJBig2_Object

+{

+public:

+

+    CJBig2_Image(FX_INT32 w, FX_INT32 h);

+

+    CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf);

+

+    CJBig2_Image(CJBig2_Image &im);

+

+    ~CJBig2_Image();

+

+    FX_BOOL getPixel(FX_INT32 x, FX_INT32 y);

+

+    FX_INT32 setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v);

+

+    void copyLine(FX_INT32 hTo, FX_INT32 hFrom);

+

+    void fill(FX_BOOL v);

+

+    FX_BOOL composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);

+    FX_BOOL composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect);

+

+    FX_BOOL composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);

+

+    FX_BOOL composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);

+

+    FX_BOOL composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);

+    FX_BOOL composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect);

+

+    FX_BOOL composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op);

+    FX_BOOL composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect);

+    CJBig2_Image *subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h);

+

+    CJBig2_Image *subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h);

+

+    void expand(FX_INT32 h, FX_BOOL v);

+public:

+

+    FX_INT32 m_nWidth;

+

+    FX_INT32 m_nHeight;

+

+    FX_INT32 m_nStride;

+

+    FX_BYTE *m_pData;

+

+    FX_BOOL m_bNeedFree;

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_List.h b/core/src/fxcodec/jbig2/JBig2_List.h
new file mode 100644
index 0000000..a737d9e
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_List.h
@@ -0,0 +1,67 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_LIST_H_

+#define _JBIG2_LIST_H_

+#include "JBig2_Define.h"

+#include "JBig2_Object.h"

+template <class TYPE>

+class CJBig2_List : public CJBig2_Object

+{

+public:

+

+    CJBig2_List(FX_INT32 nSize = 8)

+    {

+        m_nSize = nSize;

+        m_pArray = (TYPE**)m_pModule->JBig2_Malloc2(sizeof(TYPE*), nSize);

+        m_nLength = 0;

+    }

+

+    ~CJBig2_List()

+    {

+        clear();

+        m_pModule->JBig2_Free(m_pArray);

+    }

+

+    void clear()

+    {

+        FX_INT32 i;

+        for(i = 0; i < m_nLength; i++) {

+            delete m_pArray[i];

+        }

+        m_nLength = 0;

+    }

+

+    void addItem(TYPE *pItem)

+    {

+        if(m_nLength >= m_nSize) {

+            m_nSize += 8;

+            m_pArray = (TYPE**)m_pModule->JBig2_Realloc(m_pArray, sizeof(TYPE*)*m_nSize);

+        }

+        m_pArray[m_nLength++] = pItem;

+    }

+

+

+    FX_INT32 getLength()

+    {

+        return m_nLength;

+    }

+

+    TYPE *getAt(FX_INT32 nIndex)

+    {

+        return m_pArray[nIndex];

+    }

+

+    TYPE *getLast()

+    {

+        return m_pArray[m_nLength - 1];

+    }

+private:

+    FX_INT32 m_nSize;

+    TYPE **m_pArray;

+    FX_INT32 m_nLength;

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_Module.h b/core/src/fxcodec/jbig2/JBig2_Module.h
new file mode 100644
index 0000000..ccde5ad
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Module.h
@@ -0,0 +1,32 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_MODULE_H_

+#define _JBIG2_MODULE_H_

+#include "JBig2_Define.h"

+class CJBig2_Module

+{

+public:

+

+    virtual void *JBig2_Malloc(FX_DWORD dwSize) = 0;

+

+    virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize) = 0;

+

+    virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2) = 0;

+

+    virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize) = 0;

+

+    virtual void JBig2_Free(FX_LPVOID pMem) = 0;

+

+    virtual void JBig2_Assert(FX_INT32 nExpression) {};

+

+    virtual	void JBig2_Error(FX_LPCSTR format, ...) {};

+

+    virtual void JBig2_Warn(FX_LPCSTR format, ...) {};

+

+    virtual void JBig2_Log(FX_LPCSTR format, ...) {};

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_Object.cpp b/core/src/fxcodec/jbig2/JBig2_Object.cpp
new file mode 100644
index 0000000..3a94f0e
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Object.cpp
@@ -0,0 +1,72 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "JBig2_Object.h"

+#include "JBig2_Module.h"

+void *CJBig2_Object::operator new(size_t size, CJBig2_Module *pModule, FX_LPCSTR filename, int line)

+{

+    CJBig2_Object *p;

+    p = (CJBig2_Object *)pModule->JBig2_Malloc((FX_DWORD)size);

+    p->m_pModule = pModule;

+    return p;

+}

+void CJBig2_Object::operator delete(void *p, CJBig2_Module *pModule, FX_LPCSTR filename, int line)

+{

+    pModule->JBig2_Free(p);

+}

+void *CJBig2_Object::operator new(size_t size, CJBig2_Module *pModule)

+{

+    CJBig2_Object *p;

+    p = (CJBig2_Object *)pModule->JBig2_Malloc((FX_DWORD)size);

+    p->m_pModule = pModule;

+    return p;

+}

+void CJBig2_Object::operator delete(void *p)

+{

+    ((CJBig2_Object *)p)->m_pModule->JBig2_Free(p);

+}

+void CJBig2_Object::operator delete(void *p, CJBig2_Module *pModule)

+{

+    pModule->JBig2_Free(p);

+}

+void *CJBig2_Object::operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size,

+                                    FX_LPCSTR filename, int line)

+{

+    void *p;

+    FX_BYTE *pCur, *pEnd;

+    p = (FX_BYTE *)pModule->JBig2_Malloc((FX_DWORD)size);

+    pCur = (FX_BYTE *)p;

+    pEnd = pCur + size;

+    for(; pCur < pEnd; pCur += unit_size) {

+        ((CJBig2_Object *)pCur)->m_pModule = pModule;

+    }

+    return p;

+}

+void CJBig2_Object::operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size,

+                                      FX_LPCSTR filename, int line)

+{

+    pModule->JBig2_Free(p);

+}

+void *CJBig2_Object::operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size)

+{

+    void *p;

+    FX_BYTE *pCur, *pEnd;

+    p = (FX_BYTE *)pModule->JBig2_Malloc((FX_DWORD)size);

+    pCur = (FX_BYTE *)p;

+    pEnd = pCur + size;

+    for(; pCur < pEnd; pCur += unit_size) {

+        ((CJBig2_Object *)pCur)->m_pModule = pModule;

+    }

+    return p;

+}

+void CJBig2_Object::operator delete[](void* p)

+{

+    ((CJBig2_Object *)p)->m_pModule->JBig2_Free(p);

+}

+void CJBig2_Object::operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size)

+{

+    pModule->JBig2_Free(p);

+}

diff --git a/core/src/fxcodec/jbig2/JBig2_Object.h b/core/src/fxcodec/jbig2/JBig2_Object.h
new file mode 100644
index 0000000..7fef1a2
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Object.h
@@ -0,0 +1,43 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_OBJECT_H_

+#define _JBIG2_OBJECT_H_

+#include "JBig2_Define.h"

+class CJBig2_Module;

+#define _JBIG2_NO_EXPECTION_

+class CJBig2_Object

+{

+public:

+

+    void *operator new(size_t size, CJBig2_Module *pModule, FX_LPCSTR filename, int line);

+

+    void operator delete(void *p, CJBig2_Module *pModule, FX_LPCSTR filename, int line);

+

+    void *operator new(size_t size, CJBig2_Module *pModule);

+

+    void operator delete(void *p);

+

+    void operator delete(void *p, CJBig2_Module *pModule);

+

+    void *operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size,

+                         FX_LPCSTR filename, int line);

+

+    void operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size,

+                           FX_LPCSTR filename, int line);

+

+    void *operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size);

+

+    void operator delete[](void* p);

+

+    void operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size);

+public:

+

+    CJBig2_Module *m_pModule;

+};

+#define JBIG2_NEW new(m_pModule)

+#define JBIG2_ALLOC(p, a) p = JBIG2_NEW a; p->m_pModule = m_pModule;

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_Page.h b/core/src/fxcodec/jbig2/JBig2_Page.h
new file mode 100644
index 0000000..4907054
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Page.h
@@ -0,0 +1,19 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_PAGE_H_

+#define _JBIG2_PAGE_H_

+#include "JBig2_Image.h"

+struct JBig2PageInfo : public CJBig2_Object {

+    FX_DWORD m_dwWidth,

+             m_dwHeight;

+    FX_DWORD m_dwResolutionX,

+             m_dwResolutionY;

+    FX_BYTE m_cFlags;

+    FX_BOOL m_bIsStriped;

+    FX_WORD m_wMaxStripeSize;

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_PatternDict.cpp b/core/src/fxcodec/jbig2/JBig2_PatternDict.cpp
new file mode 100644
index 0000000..58c52a5
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_PatternDict.cpp
@@ -0,0 +1,24 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "JBig2_PatternDict.h"

+CJBig2_PatternDict::CJBig2_PatternDict()

+{

+    NUMPATS = 0;

+    HDPATS = NULL;

+}

+

+CJBig2_PatternDict::~CJBig2_PatternDict()

+{

+    if(HDPATS) {

+        for(FX_DWORD i = 0; i < NUMPATS; i++) {

+            if(HDPATS[i]) {

+                delete HDPATS[i];

+            }

+        }

+        m_pModule->JBig2_Free(HDPATS);

+    }

+}

diff --git a/core/src/fxcodec/jbig2/JBig2_PatternDict.h b/core/src/fxcodec/jbig2/JBig2_PatternDict.h
new file mode 100644
index 0000000..c868650
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_PatternDict.h
@@ -0,0 +1,22 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_PATTERN_DICT_H_

+#define _JBIG2_PATTERN_DICT_H_

+#include "JBig2_Define.h"

+#include "JBig2_Image.h"

+class CJBig2_PatternDict : public CJBig2_Object

+{

+public:

+

+    CJBig2_PatternDict();

+

+    ~CJBig2_PatternDict();

+public:

+    FX_DWORD NUMPATS;

+    CJBig2_Image **HDPATS;

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_Segment.cpp b/core/src/fxcodec/jbig2/JBig2_Segment.cpp
new file mode 100644
index 0000000..788207d
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Segment.cpp
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "JBig2_Segment.h"

+CJBig2_Segment::CJBig2_Segment()

+{

+    init();

+}

+CJBig2_Segment::~CJBig2_Segment()

+{

+    clean();

+}

+void CJBig2_Segment::init()

+{

+    m_dwNumber = 0;

+    m_cFlags.c = 0;

+    m_nReferred_to_segment_count = 0;

+    m_pReferred_to_segment_numbers = NULL;

+    m_dwPage_association = 0;

+    m_dwData_length = 0;

+    m_dwHeader_Length = 0;

+    m_pData = NULL;

+    m_State = JBIG2_SEGMENT_HEADER_UNPARSED;

+    m_nResultType = JBIG2_VOID_POINTER;

+    m_Result.vd = NULL;

+}

+void CJBig2_Segment::clean()

+{

+    if(m_pReferred_to_segment_numbers) {

+        m_pModule->JBig2_Free(m_pReferred_to_segment_numbers);

+    }

+    if(m_Result.vd) {

+        switch(m_nResultType) {

+            case JBIG2_IMAGE_POINTER:

+                delete m_Result.im;

+                break;

+            case JBIG2_SYMBOL_DICT_POINTER:

+                delete m_Result.sd;

+                break;

+            case JBIG2_PATTERN_DICT_POINTER:

+                delete m_Result.pd;

+                break;

+            case JBIG2_HUFFMAN_TABLE_POINTER:

+                delete m_Result.ht;

+                break;

+            default:

+                m_pModule->JBig2_Free(m_Result.vd);

+        }

+    }

+}

diff --git a/core/src/fxcodec/jbig2/JBig2_Segment.h b/core/src/fxcodec/jbig2/JBig2_Segment.h
new file mode 100644
index 0000000..48c31b1
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Segment.h
@@ -0,0 +1,68 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_SEGMENT_H_

+#define _JBIG2_SEGMENT_H_

+#include "JBig2_Define.h"

+#include "JBig2_SymbolDict.h"

+#include "JBig2_PatternDict.h"

+#include "JBig2_Module.h"

+#include "JBig2_HuffmanTable.h"

+#define JBIG2_GET_INT32(buf) (((buf)[0]<<24) | ((buf)[1]<<16) | ((buf)[2]<<8) | (buf)[3])

+#define JBIG2_GET_INT16(buf) (((buf)[0]<<8) | (buf)[1])

+typedef enum {

+    JBIG2_SEGMENT_HEADER_UNPARSED,

+    JBIG2_SEGMENT_DATA_UNPARSED,

+    JBIG2_SEGMENT_PARSE_COMPLETE,

+    JBIG2_SEGMENT_PAUSED,

+    JBIG2_SEGMENT_ERROR

+} JBig2_SegmentState;

+typedef enum {

+    JBIG2_VOID_POINTER	= 0,

+    JBIG2_IMAGE_POINTER,

+    JBIG2_SYMBOL_DICT_POINTER,

+    JBIG2_PATTERN_DICT_POINTER,

+    JBIG2_HUFFMAN_TABLE_POINTER

+} JBig2_ResultType;

+class CJBig2_Segment : public CJBig2_Object

+{

+public:

+

+    CJBig2_Segment();

+

+    ~CJBig2_Segment();

+

+    void init();

+

+    void clean();

+public:

+    FX_DWORD m_dwNumber;

+    union {

+        struct {

+            FX_BYTE type					:	6;

+            FX_BYTE page_association_size	:	1;

+            FX_BYTE deferred_non_retain		:	1;

+        } s;

+        FX_BYTE c;

+    } m_cFlags;

+    FX_INT32 m_nReferred_to_segment_count;

+    FX_DWORD * m_pReferred_to_segment_numbers;

+    FX_DWORD m_dwPage_association;

+    FX_DWORD m_dwData_length;

+

+    FX_DWORD m_dwHeader_Length;

+    FX_BYTE  *m_pData;

+    JBig2_SegmentState m_State;

+    JBig2_ResultType m_nResultType;

+    union {

+        CJBig2_SymbolDict	*sd;

+        CJBig2_PatternDict	*pd;

+        CJBig2_Image		*im;

+        CJBig2_HuffmanTable	*ht;

+        FX_LPVOID			 vd;

+    } m_Result;

+};

+#endif

diff --git a/core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp b/core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp
new file mode 100644
index 0000000..8516c04
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "JBig2_SymbolDict.h"

+CJBig2_SymbolDict::CJBig2_SymbolDict()

+{

+    SDNUMEXSYMS = 0;

+    SDEXSYMS = NULL;

+    m_bContextRetained = FALSE;

+    m_gbContext = m_grContext = NULL;

+}

+

+CJBig2_SymbolDict::~CJBig2_SymbolDict()

+{

+    if(SDEXSYMS) {

+        for(FX_DWORD i = 0; i < SDNUMEXSYMS; i++) {

+            if(SDEXSYMS[i]) {

+                delete SDEXSYMS[i];

+            }

+        }

+        m_pModule->JBig2_Free(SDEXSYMS);

+    }

+    if(m_bContextRetained) {

+        if(m_gbContext) {

+            m_pModule->JBig2_Free(m_gbContext);

+        }

+        if(m_grContext) {

+            m_pModule->JBig2_Free(m_grContext);

+        }

+    }

+}

diff --git a/core/src/fxcodec/jbig2/JBig2_SymbolDict.h b/core/src/fxcodec/jbig2/JBig2_SymbolDict.h
new file mode 100644
index 0000000..cb97a16
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_SymbolDict.h
@@ -0,0 +1,26 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _JBIG2_SYMBOL_DICT_H_

+#define _JBIG2_SYMBOL_DICT_H_

+#include "JBig2_Define.h"

+#include "JBig2_ArithDecoder.h"

+#include "JBig2_Image.h"

+class CJBig2_SymbolDict : public CJBig2_Object

+{

+public:

+

+    CJBig2_SymbolDict();

+

+    ~CJBig2_SymbolDict();

+public:

+    FX_DWORD SDNUMEXSYMS;

+    CJBig2_Image **SDEXSYMS;

+    FX_BOOL m_bContextRetained;

+    JBig2ArithCtx *m_gbContext,

+                  *m_grContext;

+};

+#endif

diff --git a/core/src/fxcodec/lcms2/include/fx_lcms2.h b/core/src/fxcodec/lcms2/include/fx_lcms2.h
new file mode 100644
index 0000000..5303832
--- /dev/null
+++ b/core/src/fxcodec/lcms2/include/fx_lcms2.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_LCMS2_H_

+#define _FX_LCMS2_H_

+#include "../lcms2-2.6/include/lcms2.h"

+#endif

diff --git a/core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h b/core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h
new file mode 100644
index 0000000..1103b7f
--- /dev/null
+++ b/core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_LCMS2_H_

+#define _FX_LCMS2_H_

+#include "../lcms2-2.6/include/lcms2_plugin.h"

+#endif

diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2.h b/core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2.h
new file mode 100644
index 0000000..8595f70
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2.h
@@ -0,0 +1,1882 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2014 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+// Version 2.6
+//
+
+#ifndef _lcms2_H
+
+// ********** Configuration toggles ****************************************
+
+// Uncomment this one if you are using big endian machines
+// #define CMS_USE_BIG_ENDIAN   1
+
+// Uncomment this one if your compiler/machine does NOT support the
+// "long long" type.
+// #define CMS_DONT_USE_INT64        1
+
+// Uncomment this if your compiler doesn't work with fast floor function
+// #define CMS_DONT_USE_FAST_FLOOR 1
+
+// Uncomment this line if you want lcms to use the black point tag in profile,
+// if commented, lcms will compute the black point by its own.
+// It is safer to leave it commented out
+// #define CMS_USE_PROFILE_BLACK_POINT_TAG    1
+
+// Uncomment this line if you are compiling as C++ and want a C++ API
+// #define CMS_USE_CPP_API
+
+// Uncomment this line if you need strict CGATS syntax. Makes CGATS files to
+// require "KEYWORD" on undefined identifiers, keep it comented out unless needed
+// #define CMS_STRICT_CGATS  1
+
+// Uncomment to get rid of the tables for "half" float support
+// #define CMS_NO_HALF_SUPPORT 1
+
+// Uncomment to get rid of pthreads/windows dependency
+// #define CMS_NO_PTHREADS  1
+
+// ********** End of configuration toggles ******************************
+
+// Needed for streams
+#include <stdio.h>
+
+// Needed for portability (C99 per 7.1.2)
+#include <limits.h>
+#include <time.h>
+#include <stddef.h>
+
+#ifndef CMS_USE_CPP_API
+#   ifdef __cplusplus
+extern "C" {
+#   endif
+#endif
+
+// Version/release
+#define LCMS_VERSION        2060
+
+// I will give the chance of redefining basic types for compilers that are not fully C99 compliant
+#ifndef CMS_BASIC_TYPES_ALREADY_DEFINED
+
+// Base types
+typedef unsigned char        cmsUInt8Number;   // That is guaranteed by the C99 spec
+typedef signed char          cmsInt8Number;    // That is guaranteed by the C99 spec
+
+#if CHAR_BIT != 8
+#  error "Unable to find 8 bit type, unsupported compiler"
+#endif
+
+// IEEE float storage numbers
+typedef float                cmsFloat32Number;
+typedef double               cmsFloat64Number;
+
+// 16-bit base types
+#if (USHRT_MAX == 65535U)
+ typedef unsigned short      cmsUInt16Number;
+#elif (UINT_MAX == 65535U)
+ typedef unsigned int        cmsUInt16Number;
+#else
+#  error "Unable to find 16 bits unsigned type, unsupported compiler"
+#endif
+
+#if (SHRT_MAX == 32767)
+  typedef  short             cmsInt16Number;
+#elif (INT_MAX == 32767)
+  typedef  int               cmsInt16Number;
+#else
+#  error "Unable to find 16 bits signed type, unsupported compiler"
+#endif
+
+// 32-bit base type
+#if (UINT_MAX == 4294967295U)
+ typedef unsigned int        cmsUInt32Number;
+#elif (ULONG_MAX == 4294967295U)
+ typedef unsigned long       cmsUInt32Number;
+#else
+#  error "Unable to find 32 bit unsigned type, unsupported compiler"
+#endif
+
+#if (INT_MAX == +2147483647)
+ typedef  int                cmsInt32Number;
+#elif (LONG_MAX == +2147483647)
+ typedef  long               cmsInt32Number;
+#else
+#  error "Unable to find 32 bit signed type, unsupported compiler"
+#endif
+
+// 64-bit base types
+#ifndef CMS_DONT_USE_INT64
+#  if (ULONG_MAX  == 18446744073709551615U)
+    typedef unsigned long   cmsUInt64Number;
+#  elif (ULLONG_MAX == 18446744073709551615U)
+      typedef unsigned long long   cmsUInt64Number;
+#  else
+#     define CMS_DONT_USE_INT64 1
+#  endif
+#  if (LONG_MAX == +9223372036854775807)
+      typedef  long          cmsInt64Number;
+#  elif (LLONG_MAX == +9223372036854775807)
+      typedef  long long     cmsInt64Number;
+#  else
+#     define CMS_DONT_USE_INT64 1
+#  endif
+#endif
+#endif
+
+// In the case 64 bit numbers are not supported by the compiler
+#ifdef CMS_DONT_USE_INT64
+    typedef cmsUInt32Number      cmsUInt64Number[2];
+    typedef cmsInt32Number       cmsInt64Number[2];
+#endif
+
+// Derivative types
+typedef cmsUInt32Number      cmsSignature;
+typedef cmsUInt16Number      cmsU8Fixed8Number;
+typedef cmsInt32Number       cmsS15Fixed16Number;
+typedef cmsUInt32Number      cmsU16Fixed16Number;
+
+// Boolean type, which will be using the native integer
+typedef int                  cmsBool;
+
+// Try to detect windows
+#if defined (_WIN32) || defined(_WIN64) || defined(WIN32) || defined(_WIN32_)
+#  define CMS_IS_WINDOWS_ 1
+#endif
+
+#ifdef _MSC_VER
+#  define CMS_IS_WINDOWS_ 1
+#endif
+
+#ifdef __BORLANDC__
+#  define CMS_IS_WINDOWS_ 1
+#endif
+
+// Try to detect big endian platforms. This list can be endless, so only some checks are performed over here.
+// you can pass this toggle to the compiler by using -DCMS_USE_BIG_ENDIAN or something similar
+
+#if defined(__sgi__) || defined(__sgi) || defined(sparc)
+#   define CMS_USE_BIG_ENDIAN      1
+#endif
+
+#if defined(__s390__) || defined(__s390x__)
+#   define CMS_USE_BIG_ENDIAN   1
+#endif
+
+#  ifdef TARGET_CPU_PPC
+#    if TARGET_CPU_PPC
+#      define CMS_USE_BIG_ENDIAN   1
+#    endif
+#  endif
+
+#if defined(__powerpc__) || defined(__ppc__) || defined(TARGET_CPU_PPC)
+#   define CMS_USE_BIG_ENDIAN   1
+#   if defined (__GNUC__) && defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN)
+#       if __BYTE_ORDER  == __LITTLE_ENDIAN
+//               // Don't use big endian for PowerPC little endian mode
+#                undef CMS_USE_BIG_ENDIAN
+#       endif
+#   endif
+#endif
+
+// WORDS_BIGENDIAN takes precedence
+#if defined(_HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(WORDS_BIGENDIAN)
+#   define CMS_USE_BIG_ENDIAN      1
+#endif
+
+#ifdef macintosh
+# ifdef __BIG_ENDIAN__
+#   define CMS_USE_BIG_ENDIAN      1
+# endif
+# ifdef __LITTLE_ENDIAN__
+#   undef CMS_USE_BIG_ENDIAN
+# endif
+#endif
+
+// Calling convention -- this is hardly platform and compiler dependent
+#ifdef CMS_IS_WINDOWS_
+#  if defined(CMS_DLL) || defined(CMS_DLL_BUILD)
+#     ifdef __BORLANDC__
+#        define CMSEXPORT       __stdcall _export
+#        define CMSAPI
+#     else
+#        define CMSEXPORT      _stdcall
+#        ifdef CMS_DLL_BUILD
+#            define CMSAPI    __declspec(dllexport)
+#        else
+#           define CMSAPI     __declspec(dllimport)
+#       endif
+#     endif
+#  else
+#       define CMSEXPORT
+#       define CMSAPI
+#  endif
+#else
+# define CMSEXPORT
+# define CMSAPI
+#endif
+
+#ifdef HasTHREADS
+# if HasTHREADS == 1
+#    undef CMS_NO_PTHREADS
+# else
+#    define CMS_NO_PTHREADS 1
+# endif
+#endif
+
+// Some common definitions
+#define cmsMAX_PATH     256
+
+#ifndef FALSE
+#       define FALSE 0
+#endif
+#ifndef TRUE
+#       define TRUE  1
+#endif
+
+// D50 XYZ normalized to Y=1.0
+#define cmsD50X             0.9642
+#define cmsD50Y             1.0
+#define cmsD50Z             0.8249
+
+// V4 perceptual black
+#define cmsPERCEPTUAL_BLACK_X  0.00336
+#define cmsPERCEPTUAL_BLACK_Y  0.0034731
+#define cmsPERCEPTUAL_BLACK_Z  0.00287
+
+// Definitions in ICC spec
+#define cmsMagicNumber      0x61637370     // 'acsp'
+#define lcmsSignature       0x6c636d73     // 'lcms'
+
+
+// Base ICC type definitions
+typedef enum {
+    cmsSigChromaticityType                  = 0x6368726D,  // 'chrm'
+    cmsSigColorantOrderType                 = 0x636C726F,  // 'clro'
+    cmsSigColorantTableType                 = 0x636C7274,  // 'clrt'
+    cmsSigCrdInfoType                       = 0x63726469,  // 'crdi'
+    cmsSigCurveType                         = 0x63757276,  // 'curv'
+    cmsSigDataType                          = 0x64617461,  // 'data'
+    cmsSigDictType                          = 0x64696374,  // 'dict'
+    cmsSigDateTimeType                      = 0x6474696D,  // 'dtim'
+    cmsSigDeviceSettingsType                = 0x64657673,  // 'devs'
+    cmsSigLut16Type                         = 0x6d667432,  // 'mft2'
+    cmsSigLut8Type                          = 0x6d667431,  // 'mft1'
+    cmsSigLutAtoBType                       = 0x6d414220,  // 'mAB '
+    cmsSigLutBtoAType                       = 0x6d424120,  // 'mBA '
+    cmsSigMeasurementType                   = 0x6D656173,  // 'meas'
+    cmsSigMultiLocalizedUnicodeType         = 0x6D6C7563,  // 'mluc'
+    cmsSigMultiProcessElementType           = 0x6D706574,  // 'mpet'
+    cmsSigNamedColorType                    = 0x6E636f6C,  // 'ncol' -- DEPRECATED!
+    cmsSigNamedColor2Type                   = 0x6E636C32,  // 'ncl2'
+    cmsSigParametricCurveType               = 0x70617261,  // 'para'
+    cmsSigProfileSequenceDescType           = 0x70736571,  // 'pseq'
+    cmsSigProfileSequenceIdType             = 0x70736964,  // 'psid'
+    cmsSigResponseCurveSet16Type            = 0x72637332,  // 'rcs2'
+    cmsSigS15Fixed16ArrayType               = 0x73663332,  // 'sf32'
+    cmsSigScreeningType                     = 0x7363726E,  // 'scrn'
+    cmsSigSignatureType                     = 0x73696720,  // 'sig '
+    cmsSigTextType                          = 0x74657874,  // 'text'
+    cmsSigTextDescriptionType               = 0x64657363,  // 'desc'
+    cmsSigU16Fixed16ArrayType               = 0x75663332,  // 'uf32'
+    cmsSigUcrBgType                         = 0x62666420,  // 'bfd '
+    cmsSigUInt16ArrayType                   = 0x75693136,  // 'ui16'
+    cmsSigUInt32ArrayType                   = 0x75693332,  // 'ui32'
+    cmsSigUInt64ArrayType                   = 0x75693634,  // 'ui64'
+    cmsSigUInt8ArrayType                    = 0x75693038,  // 'ui08'
+    cmsSigVcgtType                          = 0x76636774,  // 'vcgt'
+    cmsSigViewingConditionsType             = 0x76696577,  // 'view'
+    cmsSigXYZType                           = 0x58595A20   // 'XYZ '
+
+
+} cmsTagTypeSignature;
+
+// Base ICC tag definitions
+typedef enum {
+    cmsSigAToB0Tag                          = 0x41324230,  // 'A2B0'
+    cmsSigAToB1Tag                          = 0x41324231,  // 'A2B1'
+    cmsSigAToB2Tag                          = 0x41324232,  // 'A2B2'
+    cmsSigBlueColorantTag                   = 0x6258595A,  // 'bXYZ'
+    cmsSigBlueMatrixColumnTag               = 0x6258595A,  // 'bXYZ'
+    cmsSigBlueTRCTag                        = 0x62545243,  // 'bTRC'
+    cmsSigBToA0Tag                          = 0x42324130,  // 'B2A0'
+    cmsSigBToA1Tag                          = 0x42324131,  // 'B2A1'
+    cmsSigBToA2Tag                          = 0x42324132,  // 'B2A2'
+    cmsSigCalibrationDateTimeTag            = 0x63616C74,  // 'calt'
+    cmsSigCharTargetTag                     = 0x74617267,  // 'targ'
+    cmsSigChromaticAdaptationTag            = 0x63686164,  // 'chad'
+    cmsSigChromaticityTag                   = 0x6368726D,  // 'chrm'
+    cmsSigColorantOrderTag                  = 0x636C726F,  // 'clro'
+    cmsSigColorantTableTag                  = 0x636C7274,  // 'clrt'
+    cmsSigColorantTableOutTag               = 0x636C6F74,  // 'clot'
+    cmsSigColorimetricIntentImageStateTag   = 0x63696973,  // 'ciis'
+    cmsSigCopyrightTag                      = 0x63707274,  // 'cprt'
+    cmsSigCrdInfoTag                        = 0x63726469,  // 'crdi'
+    cmsSigDataTag                           = 0x64617461,  // 'data'
+    cmsSigDateTimeTag                       = 0x6474696D,  // 'dtim'
+    cmsSigDeviceMfgDescTag                  = 0x646D6E64,  // 'dmnd'
+    cmsSigDeviceModelDescTag                = 0x646D6464,  // 'dmdd'
+    cmsSigDeviceSettingsTag                 = 0x64657673,  // 'devs'
+    cmsSigDToB0Tag                          = 0x44324230,  // 'D2B0'
+    cmsSigDToB1Tag                          = 0x44324231,  // 'D2B1'
+    cmsSigDToB2Tag                          = 0x44324232,  // 'D2B2'
+    cmsSigDToB3Tag                          = 0x44324233,  // 'D2B3'
+    cmsSigBToD0Tag                          = 0x42324430,  // 'B2D0'
+    cmsSigBToD1Tag                          = 0x42324431,  // 'B2D1'
+    cmsSigBToD2Tag                          = 0x42324432,  // 'B2D2'
+    cmsSigBToD3Tag                          = 0x42324433,  // 'B2D3'
+    cmsSigGamutTag                          = 0x67616D74,  // 'gamt'
+    cmsSigGrayTRCTag                        = 0x6b545243,  // 'kTRC'
+    cmsSigGreenColorantTag                  = 0x6758595A,  // 'gXYZ'
+    cmsSigGreenMatrixColumnTag              = 0x6758595A,  // 'gXYZ'
+    cmsSigGreenTRCTag                       = 0x67545243,  // 'gTRC'
+    cmsSigLuminanceTag                      = 0x6C756d69,  // 'lumi'
+    cmsSigMeasurementTag                    = 0x6D656173,  // 'meas'
+    cmsSigMediaBlackPointTag                = 0x626B7074,  // 'bkpt'
+    cmsSigMediaWhitePointTag                = 0x77747074,  // 'wtpt'
+    cmsSigNamedColorTag                     = 0x6E636f6C,  // 'ncol' // Deprecated by the ICC
+    cmsSigNamedColor2Tag                    = 0x6E636C32,  // 'ncl2'
+    cmsSigOutputResponseTag                 = 0x72657370,  // 'resp'
+    cmsSigPerceptualRenderingIntentGamutTag = 0x72696730,  // 'rig0'
+    cmsSigPreview0Tag                       = 0x70726530,  // 'pre0'
+    cmsSigPreview1Tag                       = 0x70726531,  // 'pre1'
+    cmsSigPreview2Tag                       = 0x70726532,  // 'pre2'
+    cmsSigProfileDescriptionTag             = 0x64657363,  // 'desc'
+    cmsSigProfileDescriptionMLTag           = 0x6473636d,  // 'dscm'
+    cmsSigProfileSequenceDescTag            = 0x70736571,  // 'pseq'
+    cmsSigProfileSequenceIdTag              = 0x70736964,  // 'psid'
+    cmsSigPs2CRD0Tag                        = 0x70736430,  // 'psd0'
+    cmsSigPs2CRD1Tag                        = 0x70736431,  // 'psd1'
+    cmsSigPs2CRD2Tag                        = 0x70736432,  // 'psd2'
+    cmsSigPs2CRD3Tag                        = 0x70736433,  // 'psd3'
+    cmsSigPs2CSATag                         = 0x70733273,  // 'ps2s'
+    cmsSigPs2RenderingIntentTag             = 0x70733269,  // 'ps2i'
+    cmsSigRedColorantTag                    = 0x7258595A,  // 'rXYZ'
+    cmsSigRedMatrixColumnTag                = 0x7258595A,  // 'rXYZ'
+    cmsSigRedTRCTag                         = 0x72545243,  // 'rTRC'
+    cmsSigSaturationRenderingIntentGamutTag = 0x72696732,  // 'rig2'
+    cmsSigScreeningDescTag                  = 0x73637264,  // 'scrd'
+    cmsSigScreeningTag                      = 0x7363726E,  // 'scrn'
+    cmsSigTechnologyTag                     = 0x74656368,  // 'tech'
+    cmsSigUcrBgTag                          = 0x62666420,  // 'bfd '
+    cmsSigViewingCondDescTag                = 0x76756564,  // 'vued'
+    cmsSigViewingConditionsTag              = 0x76696577,  // 'view'
+    cmsSigVcgtTag                           = 0x76636774,  // 'vcgt'
+    cmsSigMetaTag                           = 0x6D657461   // 'meta'
+
+} cmsTagSignature;
+
+
+// ICC Technology tag
+typedef enum {
+    cmsSigDigitalCamera                     = 0x6463616D,  // 'dcam'
+    cmsSigFilmScanner                       = 0x6673636E,  // 'fscn'
+    cmsSigReflectiveScanner                 = 0x7273636E,  // 'rscn'
+    cmsSigInkJetPrinter                     = 0x696A6574,  // 'ijet'
+    cmsSigThermalWaxPrinter                 = 0x74776178,  // 'twax'
+    cmsSigElectrophotographicPrinter        = 0x6570686F,  // 'epho'
+    cmsSigElectrostaticPrinter              = 0x65737461,  // 'esta'
+    cmsSigDyeSublimationPrinter             = 0x64737562,  // 'dsub'
+    cmsSigPhotographicPaperPrinter          = 0x7270686F,  // 'rpho'
+    cmsSigFilmWriter                        = 0x6670726E,  // 'fprn'
+    cmsSigVideoMonitor                      = 0x7669646D,  // 'vidm'
+    cmsSigVideoCamera                       = 0x76696463,  // 'vidc'
+    cmsSigProjectionTelevision              = 0x706A7476,  // 'pjtv'
+    cmsSigCRTDisplay                        = 0x43525420,  // 'CRT '
+    cmsSigPMDisplay                         = 0x504D4420,  // 'PMD '
+    cmsSigAMDisplay                         = 0x414D4420,  // 'AMD '
+    cmsSigPhotoCD                           = 0x4B504344,  // 'KPCD'
+    cmsSigPhotoImageSetter                  = 0x696D6773,  // 'imgs'
+    cmsSigGravure                           = 0x67726176,  // 'grav'
+    cmsSigOffsetLithography                 = 0x6F666673,  // 'offs'
+    cmsSigSilkscreen                        = 0x73696C6B,  // 'silk'
+    cmsSigFlexography                       = 0x666C6578,  // 'flex'
+    cmsSigMotionPictureFilmScanner          = 0x6D706673,  // 'mpfs'
+    cmsSigMotionPictureFilmRecorder         = 0x6D706672,  // 'mpfr'
+    cmsSigDigitalMotionPictureCamera        = 0x646D7063,  // 'dmpc'
+    cmsSigDigitalCinemaProjector            = 0x64636A70   // 'dcpj'
+
+} cmsTechnologySignature;
+
+
+// ICC Color spaces
+typedef enum {
+    cmsSigXYZData                           = 0x58595A20,  // 'XYZ '
+    cmsSigLabData                           = 0x4C616220,  // 'Lab '
+    cmsSigLuvData                           = 0x4C757620,  // 'Luv '
+    cmsSigYCbCrData                         = 0x59436272,  // 'YCbr'
+    cmsSigYxyData                           = 0x59787920,  // 'Yxy '
+    cmsSigRgbData                           = 0x52474220,  // 'RGB '
+    cmsSigGrayData                          = 0x47524159,  // 'GRAY'
+    cmsSigHsvData                           = 0x48535620,  // 'HSV '
+    cmsSigHlsData                           = 0x484C5320,  // 'HLS '
+    cmsSigCmykData                          = 0x434D594B,  // 'CMYK'
+    cmsSigCmyData                           = 0x434D5920,  // 'CMY '
+    cmsSigMCH1Data                          = 0x4D434831,  // 'MCH1'
+    cmsSigMCH2Data                          = 0x4D434832,  // 'MCH2'
+    cmsSigMCH3Data                          = 0x4D434833,  // 'MCH3'
+    cmsSigMCH4Data                          = 0x4D434834,  // 'MCH4'
+    cmsSigMCH5Data                          = 0x4D434835,  // 'MCH5'
+    cmsSigMCH6Data                          = 0x4D434836,  // 'MCH6'
+    cmsSigMCH7Data                          = 0x4D434837,  // 'MCH7'
+    cmsSigMCH8Data                          = 0x4D434838,  // 'MCH8'
+    cmsSigMCH9Data                          = 0x4D434839,  // 'MCH9'
+    cmsSigMCHAData                          = 0x4D434841,  // 'MCHA'
+    cmsSigMCHBData                          = 0x4D434842,  // 'MCHB'
+    cmsSigMCHCData                          = 0x4D434843,  // 'MCHC'
+    cmsSigMCHDData                          = 0x4D434844,  // 'MCHD'
+    cmsSigMCHEData                          = 0x4D434845,  // 'MCHE'
+    cmsSigMCHFData                          = 0x4D434846,  // 'MCHF'
+    cmsSigNamedData                         = 0x6e6d636c,  // 'nmcl'
+    cmsSig1colorData                        = 0x31434C52,  // '1CLR'
+    cmsSig2colorData                        = 0x32434C52,  // '2CLR'
+    cmsSig3colorData                        = 0x33434C52,  // '3CLR'
+    cmsSig4colorData                        = 0x34434C52,  // '4CLR'
+    cmsSig5colorData                        = 0x35434C52,  // '5CLR'
+    cmsSig6colorData                        = 0x36434C52,  // '6CLR'
+    cmsSig7colorData                        = 0x37434C52,  // '7CLR'
+    cmsSig8colorData                        = 0x38434C52,  // '8CLR'
+    cmsSig9colorData                        = 0x39434C52,  // '9CLR'
+    cmsSig10colorData                       = 0x41434C52,  // 'ACLR'
+    cmsSig11colorData                       = 0x42434C52,  // 'BCLR'
+    cmsSig12colorData                       = 0x43434C52,  // 'CCLR'
+    cmsSig13colorData                       = 0x44434C52,  // 'DCLR'
+    cmsSig14colorData                       = 0x45434C52,  // 'ECLR'
+    cmsSig15colorData                       = 0x46434C52,  // 'FCLR'
+    cmsSigLuvKData                          = 0x4C75764B   // 'LuvK'
+
+} cmsColorSpaceSignature;
+
+// ICC Profile Class
+typedef enum {
+    cmsSigInputClass                        = 0x73636E72,  // 'scnr'
+    cmsSigDisplayClass                      = 0x6D6E7472,  // 'mntr'
+    cmsSigOutputClass                       = 0x70727472,  // 'prtr'
+    cmsSigLinkClass                         = 0x6C696E6B,  // 'link'
+    cmsSigAbstractClass                     = 0x61627374,  // 'abst'
+    cmsSigColorSpaceClass                   = 0x73706163,  // 'spac'
+    cmsSigNamedColorClass                   = 0x6e6d636c   // 'nmcl'
+
+} cmsProfileClassSignature;
+
+// ICC Platforms
+typedef enum {
+    cmsSigMacintosh                         = 0x4150504C,  // 'APPL'
+    cmsSigMicrosoft                         = 0x4D534654,  // 'MSFT'
+    cmsSigSolaris                           = 0x53554E57,  // 'SUNW'
+    cmsSigSGI                               = 0x53474920,  // 'SGI '
+    cmsSigTaligent                          = 0x54474E54,  // 'TGNT'
+    cmsSigUnices                            = 0x2A6E6978   // '*nix'   // From argyll -- Not official
+
+} cmsPlatformSignature;
+
+// Reference gamut
+#define  cmsSigPerceptualReferenceMediumGamut         0x70726d67  //'prmg'
+
+// For cmsSigColorimetricIntentImageStateTag
+#define  cmsSigSceneColorimetryEstimates              0x73636F65  //'scoe'
+#define  cmsSigSceneAppearanceEstimates               0x73617065  //'sape'
+#define  cmsSigFocalPlaneColorimetryEstimates         0x66706365  //'fpce'
+#define  cmsSigReflectionHardcopyOriginalColorimetry  0x72686F63  //'rhoc'
+#define  cmsSigReflectionPrintOutputColorimetry       0x72706F63  //'rpoc'
+
+// Multi process elements types
+typedef enum {
+    cmsSigCurveSetElemType              = 0x63767374,  //'cvst'
+    cmsSigMatrixElemType                = 0x6D617466,  //'matf'
+    cmsSigCLutElemType                  = 0x636C7574,  //'clut'
+
+    cmsSigBAcsElemType                  = 0x62414353,  // 'bACS'
+    cmsSigEAcsElemType                  = 0x65414353,  // 'eACS'
+
+    // Custom from here, not in the ICC Spec
+    cmsSigXYZ2LabElemType               = 0x6C327820,  // 'l2x '
+    cmsSigLab2XYZElemType               = 0x78326C20,  // 'x2l '
+    cmsSigNamedColorElemType            = 0x6E636C20,  // 'ncl '
+    cmsSigLabV2toV4                     = 0x32203420,  // '2 4 '
+    cmsSigLabV4toV2                     = 0x34203220,  // '4 2 '
+
+    // Identities
+    cmsSigIdentityElemType              = 0x69646E20,  // 'idn '
+
+    // Float to floatPCS
+    cmsSigLab2FloatPCS                  = 0x64326C20,  // 'd2l '
+    cmsSigFloatPCS2Lab                  = 0x6C326420,  // 'l2d '
+    cmsSigXYZ2FloatPCS                  = 0x64327820,  // 'd2x '
+    cmsSigFloatPCS2XYZ                  = 0x78326420   // 'x2d '
+
+} cmsStageSignature;
+
+// Types of CurveElements
+typedef enum {
+
+    cmsSigFormulaCurveSeg               = 0x70617266, // 'parf'
+    cmsSigSampledCurveSeg               = 0x73616D66, // 'samf'
+    cmsSigSegmentedCurve                = 0x63757266  // 'curf'
+
+} cmsCurveSegSignature;
+
+// Used in ResponseCurveType
+#define  cmsSigStatusA                    0x53746141 //'StaA'
+#define  cmsSigStatusE                    0x53746145 //'StaE'
+#define  cmsSigStatusI                    0x53746149 //'StaI'
+#define  cmsSigStatusT                    0x53746154 //'StaT'
+#define  cmsSigStatusM                    0x5374614D //'StaM'
+#define  cmsSigDN                         0x444E2020 //'DN  '
+#define  cmsSigDNP                        0x444E2050 //'DN P'
+#define  cmsSigDNN                        0x444E4E20 //'DNN '
+#define  cmsSigDNNP                       0x444E4E50 //'DNNP'
+
+// Device attributes, currently defined values correspond to the low 4 bytes
+// of the 8 byte attribute quantity
+#define cmsReflective     0
+#define cmsTransparency   1
+#define cmsGlossy         0
+#define cmsMatte          2
+
+// Common structures in ICC tags
+typedef struct {
+    cmsUInt32Number len;
+    cmsUInt32Number flag;
+    cmsUInt8Number  data[1];
+
+} cmsICCData;
+
+// ICC date time
+typedef struct {
+    cmsUInt16Number      year;
+    cmsUInt16Number      month;
+    cmsUInt16Number      day;
+    cmsUInt16Number      hours;
+    cmsUInt16Number      minutes;
+    cmsUInt16Number      seconds;
+
+} cmsDateTimeNumber;
+
+// ICC XYZ
+typedef struct {
+    cmsS15Fixed16Number  X;
+    cmsS15Fixed16Number  Y;
+    cmsS15Fixed16Number  Z;
+
+} cmsEncodedXYZNumber;
+
+
+// Profile ID as computed by MD5 algorithm
+typedef union {
+    cmsUInt8Number       ID8[16];
+    cmsUInt16Number      ID16[8];
+    cmsUInt32Number      ID32[4];
+
+} cmsProfileID;
+
+
+// ----------------------------------------------------------------------------------------------
+// ICC profile internal base types. Strictly, shouldn't be declared in this header, but maybe
+// somebody want to use this info for accessing profile header directly, so here it is.
+
+// Profile header -- it is 32-bit aligned, so no issues are expected on alignment
+typedef struct {
+    cmsUInt32Number              size;           // Profile size in bytes
+    cmsSignature                 cmmId;          // CMM for this profile
+    cmsUInt32Number              version;        // Format version number
+    cmsProfileClassSignature     deviceClass;    // Type of profile
+    cmsColorSpaceSignature       colorSpace;     // Color space of data
+    cmsColorSpaceSignature       pcs;            // PCS, XYZ or Lab only
+    cmsDateTimeNumber            date;           // Date profile was created
+    cmsSignature                 magic;          // Magic Number to identify an ICC profile
+    cmsPlatformSignature         platform;       // Primary Platform
+    cmsUInt32Number              flags;          // Various bit settings
+    cmsSignature                 manufacturer;   // Device manufacturer
+    cmsUInt32Number              model;          // Device model number
+    cmsUInt64Number              attributes;     // Device attributes
+    cmsUInt32Number              renderingIntent;// Rendering intent
+    cmsEncodedXYZNumber          illuminant;     // Profile illuminant
+    cmsSignature                 creator;        // Profile creator
+    cmsProfileID                 profileID;      // Profile ID using MD5
+    cmsInt8Number                reserved[28];   // Reserved for future use
+
+} cmsICCHeader;
+
+// ICC base tag
+typedef struct {
+    cmsTagTypeSignature  sig;
+    cmsInt8Number        reserved[4];
+
+} cmsTagBase;
+
+// A tag entry in directory
+typedef struct {
+    cmsTagSignature      sig;            // The tag signature
+    cmsUInt32Number      offset;         // Start of tag
+    cmsUInt32Number      size;           // Size in bytes
+
+} cmsTagEntry;
+
+// ----------------------------------------------------------------------------------------------
+
+// Little CMS specific typedefs
+
+typedef void* cmsHANDLE ;              // Generic handle
+typedef void* cmsHPROFILE;             // Opaque typedefs to hide internals
+typedef void* cmsHTRANSFORM;
+
+#define cmsMAXCHANNELS  16                // Maximum number of channels in ICC profiles
+
+// Format of pixel is defined by one cmsUInt32Number, using bit fields as follows
+//
+//                               2                1          0
+//                          3 2 10987 6 5 4 3 2 1 098 7654 321
+//                          A O TTTTT U Y F P X S EEE CCCC BBB
+//
+//            A: Floating point -- With this flag we can differentiate 16 bits as float and as int
+//            O: Optimized -- previous optimization already returns the final 8-bit value
+//            T: Pixeltype
+//            F: Flavor  0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla)
+//            P: Planar? 0=Chunky, 1=Planar
+//            X: swap 16 bps endianess?
+//            S: Do swap? ie, BGR, KYMC
+//            E: Extra samples
+//            C: Channels (Samples per pixel)
+//            B: bytes per sample
+//            Y: Swap first - changes ABGR to BGRA and KCMY to CMYK
+
+#define FLOAT_SH(a)            ((a) << 22)
+#define OPTIMIZED_SH(s)        ((s) << 21)
+#define COLORSPACE_SH(s)       ((s) << 16)
+#define SWAPFIRST_SH(s)        ((s) << 14)
+#define FLAVOR_SH(s)           ((s) << 13)
+#define PLANAR_SH(p)           ((p) << 12)
+#define ENDIAN16_SH(e)         ((e) << 11)
+#define DOSWAP_SH(e)           ((e) << 10)
+#define EXTRA_SH(e)            ((e) << 7)
+#define CHANNELS_SH(c)         ((c) << 3)
+#define BYTES_SH(b)            (b)
+
+// These macros unpack format specifiers into integers
+#define T_FLOAT(a)            (((a)>>22)&1)
+#define T_OPTIMIZED(o)        (((o)>>21)&1)
+#define T_COLORSPACE(s)       (((s)>>16)&31)
+#define T_SWAPFIRST(s)        (((s)>>14)&1)
+#define T_FLAVOR(s)           (((s)>>13)&1)
+#define T_PLANAR(p)           (((p)>>12)&1)
+#define T_ENDIAN16(e)         (((e)>>11)&1)
+#define T_DOSWAP(e)           (((e)>>10)&1)
+#define T_EXTRA(e)            (((e)>>7)&7)
+#define T_CHANNELS(c)         (((c)>>3)&15)
+#define T_BYTES(b)            ((b)&7)
+
+
+// Pixel types
+#define PT_ANY       0    // Don't check colorspace
+                          // 1 & 2 are reserved
+#define PT_GRAY      3
+#define PT_RGB       4
+#define PT_CMY       5
+#define PT_CMYK      6
+#define PT_YCbCr     7
+#define PT_YUV       8      // Lu'v'
+#define PT_XYZ       9
+#define PT_Lab       10
+#define PT_YUVK      11     // Lu'v'K
+#define PT_HSV       12
+#define PT_HLS       13
+#define PT_Yxy       14
+
+#define PT_MCH1      15
+#define PT_MCH2      16
+#define PT_MCH3      17
+#define PT_MCH4      18
+#define PT_MCH5      19
+#define PT_MCH6      20
+#define PT_MCH7      21
+#define PT_MCH8      22
+#define PT_MCH9      23
+#define PT_MCH10     24
+#define PT_MCH11     25
+#define PT_MCH12     26
+#define PT_MCH13     27
+#define PT_MCH14     28
+#define PT_MCH15     29
+
+#define PT_LabV2     30     // Identical to PT_Lab, but using the V2 old encoding
+
+// Some (not all!) representations
+
+#ifndef TYPE_RGB_8      // TYPE_RGB_8 is a very common identifier, so don't include ours
+                        // if user has it already defined.
+
+#define TYPE_GRAY_8            (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1))
+#define TYPE_GRAY_8_REV        (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1))
+#define TYPE_GRAY_16           (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))
+#define TYPE_GRAY_16_REV       (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1))
+#define TYPE_GRAY_16_SE        (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_GRAYA_8           (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1))
+#define TYPE_GRAYA_16          (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2))
+#define TYPE_GRAYA_16_SE       (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_GRAYA_8_PLANAR    (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_GRAYA_16_PLANAR   (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1))
+
+#define TYPE_RGB_8             (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_RGB_8_PLANAR      (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_BGR_8             (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_BGR_8_PLANAR      (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_RGB_16            (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_RGB_16_PLANAR     (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_RGB_16_SE         (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_BGR_16            (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_BGR_16_PLANAR     (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_BGR_16_SE         (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_RGBA_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_RGBA_8_PLANAR     (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_RGBA_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_RGBA_16_PLANAR    (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_RGBA_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+#define TYPE_ARGB_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_ARGB_8_PLANAR     (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1))
+#define TYPE_ARGB_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))
+
+#define TYPE_ABGR_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_ABGR_8_PLANAR     (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_ABGR_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_ABGR_16_PLANAR    (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_ABGR_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_BGRA_8            (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_BGRA_8_PLANAR     (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1))
+#define TYPE_BGRA_16           (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_BGRA_16_SE        (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+
+#define TYPE_CMY_8             (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_CMY_8_PLANAR      (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_CMY_16            (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_CMY_16_PLANAR     (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_CMY_16_SE         (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+#define TYPE_CMYK_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1))
+#define TYPE_CMYKA_8           (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1))
+#define TYPE_CMYK_8_REV        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1))
+#define TYPE_YUVK_8            TYPE_CMYK_8_REV
+#define TYPE_CMYK_8_PLANAR     (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_CMYK_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))
+#define TYPE_CMYK_16_REV       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1))
+#define TYPE_YUVK_16           TYPE_CMYK_16_REV
+#define TYPE_CMYK_16_PLANAR    (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_CMYK_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+#define TYPE_KYMC_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_KCMY_8            (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_8_REV        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_16           (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_16_REV       (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_16_SE        (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))
+
+#define TYPE_CMYK5_8           (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1))
+#define TYPE_CMYK5_16          (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2))
+#define TYPE_CMYK5_16_SE       (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC5_8           (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC5_16          (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC5_16_SE       (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK6_8           (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1))
+#define TYPE_CMYK6_8_PLANAR    (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_CMYK6_16          (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2))
+#define TYPE_CMYK6_16_PLANAR   (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_CMYK6_16_SE       (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_CMYK7_8           (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1))
+#define TYPE_CMYK7_16          (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2))
+#define TYPE_CMYK7_16_SE       (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC7_8           (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC7_16          (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC7_16_SE       (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK8_8           (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1))
+#define TYPE_CMYK8_16          (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2))
+#define TYPE_CMYK8_16_SE       (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC8_8           (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC8_16          (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC8_16_SE       (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK9_8           (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1))
+#define TYPE_CMYK9_16          (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2))
+#define TYPE_CMYK9_16_SE       (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC9_8           (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC9_16          (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC9_16_SE       (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK10_8          (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1))
+#define TYPE_CMYK10_16         (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2))
+#define TYPE_CMYK10_16_SE      (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC10_8          (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC10_16         (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC10_16_SE      (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK11_8          (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1))
+#define TYPE_CMYK11_16         (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2))
+#define TYPE_CMYK11_16_SE      (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC11_8          (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC11_16         (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC11_16_SE      (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK12_8          (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1))
+#define TYPE_CMYK12_16         (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2))
+#define TYPE_CMYK12_16_SE      (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC12_8          (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC12_16         (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC12_16_SE      (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+// Colorimetric
+#define TYPE_XYZ_16            (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_Lab_8             (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_LabV2_8           (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1))
+
+#define TYPE_ALab_8            (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_ALabV2_8          (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_Lab_16            (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_LabV2_16          (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_Yxy_16            (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2))
+
+// YCbCr
+#define TYPE_YCbCr_8           (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_YCbCr_8_PLANAR    (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_YCbCr_16          (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_YCbCr_16_PLANAR   (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_YCbCr_16_SE       (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// YUV
+#define TYPE_YUV_8             (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_YUV_8_PLANAR      (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_YUV_16            (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_YUV_16_PLANAR     (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_YUV_16_SE         (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// HLS
+#define TYPE_HLS_8             (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_HLS_8_PLANAR      (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_HLS_16            (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_HLS_16_PLANAR     (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_HLS_16_SE         (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// HSV
+#define TYPE_HSV_8             (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_HSV_8_PLANAR      (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_HSV_16            (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_HSV_16_PLANAR     (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_HSV_16_SE         (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// Named color index. Only 16 bits allowed (don't check colorspace)
+#define TYPE_NAMED_COLOR_INDEX (CHANNELS_SH(1)|BYTES_SH(2))
+
+// Float formatters.
+#define TYPE_XYZ_FLT          (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(4))
+#define TYPE_Lab_FLT          (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(4))
+#define TYPE_LabA_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4))
+#define TYPE_GRAY_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4))
+#define TYPE_RGB_FLT          (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4))
+
+#define TYPE_RGBA_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4))
+#define TYPE_ARGB_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|SWAPFIRST_SH(1))
+#define TYPE_BGR_FLT          (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1))
+#define TYPE_BGRA_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_ABGR_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1))
+
+#define TYPE_CMYK_FLT         (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(4))
+
+// Floating point formatters.
+// NOTE THAT 'BYTES' FIELD IS SET TO ZERO ON DLB because 8 bytes overflows the bitfield
+#define TYPE_XYZ_DBL          (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(0))
+#define TYPE_Lab_DBL          (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0))
+#define TYPE_GRAY_DBL         (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0))
+#define TYPE_RGB_DBL          (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0))
+#define TYPE_BGR_DBL          (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)|DOSWAP_SH(1))
+#define TYPE_CMYK_DBL         (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0))
+
+// IEEE 754-2008 "half"
+#define TYPE_GRAY_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))
+#define TYPE_RGB_HALF_FLT     (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_RGBA_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_CMYK_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))
+
+#define TYPE_RGBA_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_ARGB_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))
+#define TYPE_BGR_HALF_FLT     (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_BGRA_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_ABGR_HALF_FLT    (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
+
+#endif
+
+// Colorspaces
+typedef struct {
+        cmsFloat64Number X;
+        cmsFloat64Number Y;
+        cmsFloat64Number Z;
+
+    } cmsCIEXYZ;
+
+typedef struct {
+        cmsFloat64Number x;
+        cmsFloat64Number y;
+        cmsFloat64Number Y;
+
+    } cmsCIExyY;
+
+typedef struct {
+        cmsFloat64Number L;
+        cmsFloat64Number a;
+        cmsFloat64Number b;
+
+    } cmsCIELab;
+
+typedef struct {
+        cmsFloat64Number L;
+        cmsFloat64Number C;
+        cmsFloat64Number h;
+
+    } cmsCIELCh;
+
+typedef struct {
+        cmsFloat64Number J;
+        cmsFloat64Number C;
+        cmsFloat64Number h;
+
+    } cmsJCh;
+
+typedef struct {
+        cmsCIEXYZ  Red;
+        cmsCIEXYZ  Green;
+        cmsCIEXYZ  Blue;
+
+    } cmsCIEXYZTRIPLE;
+
+typedef struct {
+        cmsCIExyY  Red;
+        cmsCIExyY  Green;
+        cmsCIExyY  Blue;
+
+    } cmsCIExyYTRIPLE;
+
+// Illuminant types for structs below
+#define cmsILLUMINANT_TYPE_UNKNOWN 0x0000000
+#define cmsILLUMINANT_TYPE_D50     0x0000001
+#define cmsILLUMINANT_TYPE_D65     0x0000002
+#define cmsILLUMINANT_TYPE_D93     0x0000003
+#define cmsILLUMINANT_TYPE_F2      0x0000004
+#define cmsILLUMINANT_TYPE_D55     0x0000005
+#define cmsILLUMINANT_TYPE_A       0x0000006
+#define cmsILLUMINANT_TYPE_E       0x0000007
+#define cmsILLUMINANT_TYPE_F8      0x0000008
+
+typedef struct {
+        cmsUInt32Number  Observer;    // 0 = unknown, 1=CIE 1931, 2=CIE 1964
+        cmsCIEXYZ        Backing;     // Value of backing
+        cmsUInt32Number  Geometry;    // 0=unknown, 1=45/0, 0/45 2=0d, d/0
+        cmsFloat64Number Flare;       // 0..1.0
+        cmsUInt32Number  IlluminantType;
+
+    } cmsICCMeasurementConditions;
+
+typedef struct {
+        cmsCIEXYZ       IlluminantXYZ;   // Not the same struct as CAM02,
+        cmsCIEXYZ       SurroundXYZ;     // This is for storing the tag
+        cmsUInt32Number IlluminantType;  // viewing condition
+
+    } cmsICCViewingConditions;
+
+// Support of non-standard functions --------------------------------------------------------------------------------------
+
+CMSAPI int               CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2);
+CMSAPI long int          CMSEXPORT cmsfilelength(FILE* f);
+
+
+// Context handling --------------------------------------------------------------------------------------------------------
+
+// Each context holds its owns globals and its own plug-ins. There is a global context with the id = 0 for lecacy compatibility
+// though using the global context is not recomended. Proper context handling makes lcms more thread-safe.
+
+typedef struct _cmsContext_struct* cmsContext;
+
+CMSAPI cmsContext       CMSEXPORT cmsCreateContext(void* Plugin, void* UserData);
+CMSAPI void             CMSEXPORT cmsDeleteContext(cmsContext ContexID);
+CMSAPI cmsContext       CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData);
+CMSAPI void*            CMSEXPORT cmsGetContextUserData(cmsContext ContextID);
+
+// Plug-In registering  --------------------------------------------------------------------------------------------------
+
+CMSAPI cmsBool           CMSEXPORT cmsPlugin(void* Plugin);
+CMSAPI cmsBool           CMSEXPORT cmsPluginTHR(cmsContext ContextID, void* Plugin);
+CMSAPI void              CMSEXPORT cmsUnregisterPlugins(void);
+CMSAPI void              CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID);
+
+// Error logging ----------------------------------------------------------------------------------------------------------
+
+// There is no error handling at all. When a function fails, it returns proper value.
+// For example, all create functions does return NULL on failure. Other may return FALSE.
+// It may be interesting, for the developer, to know why the function is failing.
+// for that reason, lcms2 does offer a logging function. This function will get
+// an ENGLISH string with some clues on what is going wrong. You can show this
+// info to the end user if you wish, or just create some sort of log on disk.
+// The logging function should NOT terminate the program, as this obviously can leave
+// unfreed resources. It is the programmer's responsibility to check each function
+// return code to make sure it didn't fail.
+
+#define cmsERROR_UNDEFINED                    0
+#define cmsERROR_FILE                         1
+#define cmsERROR_RANGE                        2
+#define cmsERROR_INTERNAL                     3
+#define cmsERROR_NULL                         4
+#define cmsERROR_READ                         5
+#define cmsERROR_SEEK                         6
+#define cmsERROR_WRITE                        7
+#define cmsERROR_UNKNOWN_EXTENSION            8
+#define cmsERROR_COLORSPACE_CHECK             9
+#define cmsERROR_ALREADY_DEFINED              10
+#define cmsERROR_BAD_SIGNATURE                11
+#define cmsERROR_CORRUPTION_DETECTED          12
+#define cmsERROR_NOT_SUITABLE                 13
+
+// Error logger is called with the ContextID when a message is raised. This gives the
+// chance to know which thread is responsible of the warning and any environment associated
+// with it. Non-multithreading applications may safely ignore this parameter.
+// Note that under certain special circumstances, ContextID may be NULL.
+typedef void  (* cmsLogErrorHandlerFunction)(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text);
+
+// Allows user to set any specific logger
+CMSAPI void              CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn);
+CMSAPI void              CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn);
+
+// Conversions --------------------------------------------------------------------------------------------------------------
+
+// Returns pointers to constant structs
+CMSAPI const cmsCIEXYZ*  CMSEXPORT cmsD50_XYZ(void);
+CMSAPI const cmsCIExyY*  CMSEXPORT cmsD50_xyY(void);
+
+// Colorimetric space conversions
+CMSAPI void              CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source);
+CMSAPI void              CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source);
+CMSAPI void              CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz);
+CMSAPI void              CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz, const cmsCIELab* Lab);
+CMSAPI void              CMSEXPORT cmsLab2LCh(cmsCIELCh*LCh, const cmsCIELab* Lab);
+CMSAPI void              CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh);
+
+// Encoding /Decoding on PCS
+CMSAPI void              CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3]);
+CMSAPI void              CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3]);
+CMSAPI void              CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* Lab);
+CMSAPI void              CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* Lab);
+CMSAPI void              CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fxyz, const cmsUInt16Number XYZ[3]);
+CMSAPI void              CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ);
+
+// DeltaE metrics
+CMSAPI cmsFloat64Number  CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2);
+CMSAPI cmsFloat64Number  CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2);
+CMSAPI cmsFloat64Number  CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2);
+CMSAPI cmsFloat64Number  CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c);
+CMSAPI cmsFloat64Number  CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh);
+
+// Temperature <-> Chromaticity (Black body)
+CMSAPI cmsBool           CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number  TempK);
+CMSAPI cmsBool           CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint);
+
+// Chromatic adaptation
+CMSAPI cmsBool           CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, const cmsCIEXYZ* SourceWhitePt,
+                                                                           const cmsCIEXYZ* Illuminant,
+                                                                           const cmsCIEXYZ* Value);
+
+// CIECAM02 ---------------------------------------------------------------------------------------------------
+
+// Viewing conditions. Please note those are CAM model viewing conditions, and not the ICC tag viewing
+// conditions, which I'm naming cmsICCViewingConditions to make differences evident. Unfortunately, the tag
+// cannot deal with surround La, Yb and D value so is basically useless to store CAM02 viewing conditions.
+
+
+#define AVG_SURROUND       1
+#define DIM_SURROUND       2
+#define DARK_SURROUND      3
+#define CUTSHEET_SURROUND  4
+
+#define D_CALCULATE        (-1)
+
+typedef struct {
+    cmsCIEXYZ        whitePoint;
+    cmsFloat64Number Yb;
+    cmsFloat64Number La;
+    int              surround;
+    cmsFloat64Number D_value;
+
+    } cmsViewingConditions;
+
+CMSAPI cmsHANDLE         CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC);
+CMSAPI void              CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel);
+CMSAPI void              CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut);
+CMSAPI void              CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn,    cmsCIEXYZ* pOut);
+
+
+// Tone curves -----------------------------------------------------------------------------------------
+
+// This describes a curve segment. For a table of supported types, see the manual. User can increase the number of
+// available types by using a proper plug-in. Parametric segments allow 10 parameters at most
+
+typedef struct {
+    cmsFloat32Number   x0, x1;           // Domain; for x0 < x <= x1
+    cmsInt32Number     Type;             // Parametric type, Type == 0 means sampled segment. Negative values are reserved
+    cmsFloat64Number   Params[10];       // Parameters if Type != 0
+    cmsUInt32Number    nGridPoints;      // Number of grid points if Type == 0
+    cmsFloat32Number*  SampledPoints;    // Points to an array of floats if Type == 0
+
+} cmsCurveSegment;
+
+// The internal representation is none of your business.
+typedef struct _cms_curve_struct cmsToneCurve;
+
+CMSAPI cmsToneCurve*     CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID, cmsInt32Number nSegments, const cmsCurveSegment Segments[]);
+CMSAPI cmsToneCurve*     CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[]);
+CMSAPI cmsToneCurve*     CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma);
+CMSAPI cmsToneCurve*     CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsInt32Number nEntries, const cmsUInt16Number values[]);
+CMSAPI cmsToneCurve*     CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[]);
+CMSAPI void              CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve);
+CMSAPI void              CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3]);
+CMSAPI cmsToneCurve*     CMSEXPORT cmsDupToneCurve(const cmsToneCurve* Src);
+CMSAPI cmsToneCurve*     CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma);
+CMSAPI cmsToneCurve*     CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, const cmsToneCurve* InGamma);
+CMSAPI cmsToneCurve*     CMSEXPORT cmsJoinToneCurve(cmsContext ContextID, const cmsToneCurve* X,  const cmsToneCurve* Y, cmsUInt32Number nPoints);
+CMSAPI cmsBool           CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda);
+CMSAPI cmsFloat32Number  CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v);
+CMSAPI cmsUInt16Number   CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v);
+CMSAPI cmsBool           CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* InGamma);
+CMSAPI cmsBool           CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve);
+CMSAPI cmsBool           CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t);
+CMSAPI cmsBool           CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t);
+CMSAPI cmsInt32Number    CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t);
+CMSAPI cmsFloat64Number  CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision);
+
+// Tone curve tabular estimation
+CMSAPI cmsUInt32Number         CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t);
+CMSAPI const cmsUInt16Number*  CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t);
+
+
+// Implements pipelines of multi-processing elements -------------------------------------------------------------
+
+// Nothing to see here, move along
+typedef struct _cmsPipeline_struct cmsPipeline;
+typedef struct _cmsStage_struct cmsStage;
+
+// Those are hi-level pipelines
+CMSAPI cmsPipeline*      CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels);
+CMSAPI void              CMSEXPORT cmsPipelineFree(cmsPipeline* lut);
+CMSAPI cmsPipeline*      CMSEXPORT cmsPipelineDup(const cmsPipeline* Orig);
+
+CMSAPI cmsContext        CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut);
+CMSAPI cmsUInt32Number   CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut);
+CMSAPI cmsUInt32Number   CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut);
+
+CMSAPI cmsUInt32Number   CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut);
+CMSAPI cmsStage*         CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut);
+CMSAPI cmsStage*         CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut);
+
+CMSAPI void              CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[], const cmsPipeline* lut);
+CMSAPI void              CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut);
+CMSAPI cmsBool           CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[], cmsFloat32Number Result[], cmsFloat32Number Hint[], const cmsPipeline* lut);
+CMSAPI cmsBool           CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2);
+CMSAPI cmsBool           CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On);
+
+// Where to place/locate the stages in the pipeline chain
+typedef enum { cmsAT_BEGIN, cmsAT_END } cmsStageLoc;
+
+CMSAPI int               CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe);
+CMSAPI void              CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe);
+
+// This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements
+// that conform the Pipeline. It should be called with the Pipeline, the number of expected elements and
+// then a list of expected types followed with a list of double pointers to Stage elements. If
+// the function founds a match with current pipeline, it fills the pointers and returns TRUE
+// if not, returns FALSE without touching anything.
+CMSAPI cmsBool           CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...);
+
+// Matrix has double precision and CLUT has only float precision. That is because an ICC profile can encode
+// matrices with far more precision that CLUTS
+CMSAPI cmsStage*         CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels);
+CMSAPI cmsStage*         CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[]);
+CMSAPI cmsStage*         CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols, const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset);
+
+CMSAPI cmsStage*         CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table);
+CMSAPI cmsStage*         CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table);
+
+CMSAPI cmsStage*         CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table);
+CMSAPI cmsStage*         CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table);
+
+CMSAPI cmsStage*         CMSEXPORT cmsStageDup(cmsStage* mpe);
+CMSAPI void              CMSEXPORT cmsStageFree(cmsStage* mpe);
+CMSAPI cmsStage*         CMSEXPORT cmsStageNext(const cmsStage* mpe);
+
+CMSAPI cmsUInt32Number   CMSEXPORT cmsStageInputChannels(const cmsStage* mpe);
+CMSAPI cmsUInt32Number   CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe);
+CMSAPI cmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe);
+CMSAPI void*             CMSEXPORT cmsStageData(const cmsStage* mpe);
+
+// Sampling
+typedef cmsInt32Number (* cmsSAMPLER16)   (register const cmsUInt16Number In[],
+                                            register cmsUInt16Number Out[],
+                                            register void * Cargo);
+
+typedef cmsInt32Number (* cmsSAMPLERFLOAT)(register const cmsFloat32Number In[],
+                                            register cmsFloat32Number Out[],
+                                            register void * Cargo);
+
+// Use this flag to prevent changes being written to destination
+#define SAMPLER_INSPECT     0x01000000
+
+// For CLUT only
+CMSAPI cmsBool           CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe,    cmsSAMPLER16 Sampler, void* Cargo, cmsUInt32Number dwFlags);
+CMSAPI cmsBool           CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void* Cargo, cmsUInt32Number dwFlags);
+
+// Slicers
+CMSAPI cmsBool           CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],
+                                                   cmsSAMPLER16 Sampler, void * Cargo);
+
+CMSAPI cmsBool           CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],
+                                                   cmsSAMPLERFLOAT Sampler, void * Cargo);
+
+// Multilocalized Unicode management ---------------------------------------------------------------------------------------
+
+typedef struct _cms_MLU_struct cmsMLU;
+
+#define  cmsNoLanguage "\0\0"
+#define  cmsNoCountry  "\0\0"
+
+CMSAPI cmsMLU*           CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems);
+CMSAPI void              CMSEXPORT cmsMLUfree(cmsMLU* mlu);
+CMSAPI cmsMLU*           CMSEXPORT cmsMLUdup(const cmsMLU* mlu);
+
+CMSAPI cmsBool           CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu,
+                                                  const char LanguageCode[3], const char CountryCode[3],
+                                                  const char* ASCIIString);
+CMSAPI cmsBool           CMSEXPORT cmsMLUsetWide(cmsMLU* mlu,
+                                                  const char LanguageCode[3], const char CountryCode[3],
+                                                  const wchar_t* WideString);
+
+CMSAPI cmsUInt32Number   CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu,
+                                                  const char LanguageCode[3], const char CountryCode[3],
+                                                  char* Buffer,    cmsUInt32Number BufferSize);
+
+CMSAPI cmsUInt32Number   CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu,
+                                                 const char LanguageCode[3], const char CountryCode[3],
+                                                 wchar_t* Buffer, cmsUInt32Number BufferSize);
+
+CMSAPI cmsBool           CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu,
+                                                         const char LanguageCode[3], const char CountryCode[3],
+                                                         char ObtainedLanguage[3], char ObtainedCountry[3]);
+
+CMSAPI cmsUInt32Number   CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu);
+
+CMSAPI cmsBool           CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,
+                                                             cmsUInt32Number idx,
+                                                             char LanguageCode[3],
+                                                             char CountryCode[3]);
+ 
+// Undercolorremoval & black generation -------------------------------------------------------------------------------------
+
+typedef struct {
+        cmsToneCurve* Ucr;
+        cmsToneCurve* Bg;
+        cmsMLU*       Desc;
+
+} cmsUcrBg;
+
+// Screening ----------------------------------------------------------------------------------------------------------------
+
+#define cmsPRINTER_DEFAULT_SCREENS     0x0001
+#define cmsFREQUENCE_UNITS_LINES_CM    0x0000
+#define cmsFREQUENCE_UNITS_LINES_INCH  0x0002
+
+#define cmsSPOT_UNKNOWN         0
+#define cmsSPOT_PRINTER_DEFAULT 1
+#define cmsSPOT_ROUND           2
+#define cmsSPOT_DIAMOND         3
+#define cmsSPOT_ELLIPSE         4
+#define cmsSPOT_LINE            5
+#define cmsSPOT_SQUARE          6
+#define cmsSPOT_CROSS           7
+
+typedef struct {
+    cmsFloat64Number  Frequency;
+    cmsFloat64Number  ScreenAngle;
+    cmsUInt32Number   SpotShape;
+
+} cmsScreeningChannel;
+
+typedef struct {
+    cmsUInt32Number Flag;
+    cmsUInt32Number nChannels;
+    cmsScreeningChannel Channels[cmsMAXCHANNELS];
+
+} cmsScreening;
+
+
+// Named color -----------------------------------------------------------------------------------------------------------------
+
+typedef struct _cms_NAMEDCOLORLIST_struct cmsNAMEDCOLORLIST;
+
+CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID,
+                                                           cmsUInt32Number n,
+                                                           cmsUInt32Number ColorantCount,
+                                                           const char* Prefix, const char* Suffix);
+
+CMSAPI void               CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v);
+CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v);
+CMSAPI cmsBool            CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* v, const char* Name,
+                                                            cmsUInt16Number PCS[3],
+                                                            cmsUInt16Number Colorant[cmsMAXCHANNELS]);
+
+CMSAPI cmsUInt32Number    CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* v);
+CMSAPI cmsInt32Number     CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* v, const char* Name);
+
+CMSAPI cmsBool            CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor,
+                                                      char* Name,
+                                                      char* Prefix,
+                                                      char* Suffix,
+                                                      cmsUInt16Number* PCS,
+                                                      cmsUInt16Number* Colorant);
+
+// Retrieve named color list from transform
+CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform);
+
+// Profile sequence -----------------------------------------------------------------------------------------------------
+
+// Profile sequence descriptor. Some fields come from profile sequence descriptor tag, others
+// come from Profile Sequence Identifier Tag
+typedef struct {
+
+    cmsSignature           deviceMfg;
+    cmsSignature           deviceModel;
+    cmsUInt64Number        attributes;
+    cmsTechnologySignature technology;
+    cmsProfileID           ProfileID;
+    cmsMLU*                Manufacturer;
+    cmsMLU*                Model;
+    cmsMLU*                Description;
+
+} cmsPSEQDESC;
+
+typedef struct {
+
+    cmsUInt32Number n;
+    cmsContext     ContextID;
+    cmsPSEQDESC*    seq;
+
+} cmsSEQ;
+
+CMSAPI cmsSEQ*           CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n);
+CMSAPI cmsSEQ*           CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq);
+CMSAPI void              CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq);
+
+// Dictionaries --------------------------------------------------------------------------------------------------------
+
+typedef struct _cmsDICTentry_struct {
+
+    struct _cmsDICTentry_struct* Next;
+
+    cmsMLU *DisplayName;
+    cmsMLU *DisplayValue;
+    wchar_t* Name;
+    wchar_t* Value;
+
+} cmsDICTentry;
+
+CMSAPI cmsHANDLE           CMSEXPORT cmsDictAlloc(cmsContext ContextID);
+CMSAPI void                CMSEXPORT cmsDictFree(cmsHANDLE hDict);
+CMSAPI cmsHANDLE           CMSEXPORT cmsDictDup(cmsHANDLE hDict);
+
+CMSAPI cmsBool             CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue);
+CMSAPI const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict);
+CMSAPI const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e);
+
+// Access to Profile data ----------------------------------------------------------------------------------------------
+CMSAPI cmsHPROFILE       CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID);
+
+CMSAPI cmsContext        CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile);
+CMSAPI cmsInt32Number    CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile);
+CMSAPI cmsTagSignature   CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n);
+CMSAPI cmsBool           CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig);
+
+// Read and write pre-formatted data
+CMSAPI void*             CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig);
+CMSAPI cmsBool           CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data);
+CMSAPI cmsBool           CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest);
+CMSAPI cmsTagSignature   CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig);
+
+// Read and write raw data
+CMSAPI cmsInt32Number    CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* Buffer, cmsUInt32Number BufferSize);
+CMSAPI cmsBool           CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size);
+
+// Access header data
+#define cmsEmbeddedProfileFalse    0x00000000
+#define cmsEmbeddedProfileTrue     0x00000001
+#define cmsUseAnywhere             0x00000000
+#define cmsUseWithEmbeddedDataOnly 0x00000002
+
+CMSAPI cmsUInt32Number   CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile);
+CMSAPI void              CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags);
+CMSAPI void              CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID);
+CMSAPI cmsBool           CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest);
+CMSAPI cmsUInt32Number   CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile);
+
+CMSAPI void              CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags);
+CMSAPI cmsUInt32Number   CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile);
+CMSAPI void              CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer);
+CMSAPI cmsUInt32Number   CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile);
+CMSAPI cmsUInt32Number   CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile);
+CMSAPI void              CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model);
+CMSAPI void              CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags);
+CMSAPI void              CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID);
+CMSAPI void              CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent);
+
+CMSAPI cmsColorSpaceSignature
+                         CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile);
+CMSAPI void              CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs);
+CMSAPI cmsColorSpaceSignature
+                         CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile);
+CMSAPI void              CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig);
+CMSAPI cmsProfileClassSignature
+                         CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile);
+CMSAPI void              CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig);
+CMSAPI void              CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version);
+CMSAPI cmsFloat64Number  CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile);
+
+CMSAPI cmsUInt32Number   CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile);
+CMSAPI void              CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version);
+
+// How profiles may be used
+#define LCMS_USED_AS_INPUT      0
+#define LCMS_USED_AS_OUTPUT     1
+#define LCMS_USED_AS_PROOF      2
+
+CMSAPI cmsBool           CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection);
+CMSAPI cmsBool           CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile);
+CMSAPI cmsBool           CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection);
+
+// Translate form/to our notation to ICC
+CMSAPI cmsColorSpaceSignature   CMSEXPORT _cmsICCcolorSpace(int OurNotation);
+CMSAPI int                      CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace);
+
+CMSAPI cmsUInt32Number   CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace);
+
+// Build a suitable formatter for the colorspace of this profile
+CMSAPI cmsUInt32Number   CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat);
+CMSAPI cmsUInt32Number   CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat);
+
+
+// Localized info
+typedef enum {
+             cmsInfoDescription  = 0,
+             cmsInfoManufacturer = 1,
+             cmsInfoModel        = 2,
+             cmsInfoCopyright    = 3
+} cmsInfoType;
+
+CMSAPI cmsUInt32Number   CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info,
+                                                            const char LanguageCode[3], const char CountryCode[3],
+                                                            wchar_t* Buffer, cmsUInt32Number BufferSize);
+
+CMSAPI cmsUInt32Number   CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info,
+                                                            const char LanguageCode[3], const char CountryCode[3],
+                                                            char* Buffer, cmsUInt32Number BufferSize);
+
+// IO handlers ----------------------------------------------------------------------------------------------------------
+
+typedef struct _cms_io_handler cmsIOHANDLER;
+
+CMSAPI cmsIOHANDLER*     CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode);
+CMSAPI cmsIOHANDLER*     CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream);
+CMSAPI cmsIOHANDLER*     CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode);
+CMSAPI cmsIOHANDLER*     CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID);
+CMSAPI cmsBool           CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io);
+
+// MD5 message digest --------------------------------------------------------------------------------------------------
+
+CMSAPI cmsBool           CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile);
+CMSAPI cmsBool			 CMSEXPORT cmsMD5computeIDExt(const void* buf, unsigned long size, unsigned char ProfileID[16]);
+
+// Profile high level funtions ------------------------------------------------------------------------------------------
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *ICCProfile, const char *sAccess);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char* sAccess);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromMem(const void * MemPtr, cmsUInt32Number dwSize);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void * MemPtr, cmsUInt32Number dwSize);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write);
+CMSAPI cmsBool          CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile);
+
+CMSAPI cmsBool          CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName);
+CMSAPI cmsBool          CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream);
+CMSAPI cmsBool          CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded);
+CMSAPI cmsUInt32Number  CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io);
+
+// Predefined virtual profiles ------------------------------------------------------------------------------------------
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID,
+                                                   const cmsCIExyY* WhitePoint,
+                                                   const cmsCIExyYTRIPLE* Primaries,
+                                                   cmsToneCurve* const TransferFunction[3]);
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint,
+                                                   const cmsCIExyYTRIPLE* Primaries,
+                                                   cmsToneCurve* const TransferFunction[3]);
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID,
+                                                    const cmsCIExyY* WhitePoint,
+                                                    const cmsToneCurve* TransferFunction);
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint,
+                                                    const cmsToneCurve* TransferFunction);
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID,
+                                                                cmsColorSpaceSignature ColorSpace,
+                                                                cmsToneCurve* const TransferFunctions[]);
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace,
+                                                                cmsToneCurve* const TransferFunctions[]);
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID,
+                                                              cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit);
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit);
+
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint);
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateXYZProfile(void);
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreate_sRGBProfile(void);
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID,
+                                                             int nLUTPoints,
+                                                             cmsFloat64Number Bright,
+                                                             cmsFloat64Number Contrast,
+                                                             cmsFloat64Number Hue,
+                                                             cmsFloat64Number Saturation,
+                                                             int TempSrc,
+                                                             int TempDest);
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints,
+                                                             cmsFloat64Number Bright,
+                                                             cmsFloat64Number Contrast,
+                                                             cmsFloat64Number Hue,
+                                                             cmsFloat64Number Saturation,
+                                                             int TempSrc,
+                                                             int TempDest);
+
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID);
+CMSAPI cmsHPROFILE      CMSEXPORT cmsCreateNULLProfile(void);
+
+// Converts a transform to a devicelink profile
+CMSAPI cmsHPROFILE      CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags);
+
+// Intents ----------------------------------------------------------------------------------------------
+
+// ICC Intents
+#define INTENT_PERCEPTUAL                              0
+#define INTENT_RELATIVE_COLORIMETRIC                   1
+#define INTENT_SATURATION                              2
+#define INTENT_ABSOLUTE_COLORIMETRIC                   3
+
+// Non-ICC intents
+#define INTENT_PRESERVE_K_ONLY_PERCEPTUAL             10
+#define INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC  11
+#define INTENT_PRESERVE_K_ONLY_SATURATION             12
+#define INTENT_PRESERVE_K_PLANE_PERCEPTUAL            13
+#define INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC 14
+#define INTENT_PRESERVE_K_PLANE_SATURATION            15
+
+// Call with NULL as parameters to get the intent count
+CMSAPI cmsUInt32Number  CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions);
+CMSAPI cmsUInt32Number  CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions);
+
+// Flags
+
+#define cmsFLAGS_NOCACHE                  0x0040    // Inhibit 1-pixel cache
+#define cmsFLAGS_NOOPTIMIZE               0x0100    // Inhibit optimizations
+#define cmsFLAGS_NULLTRANSFORM            0x0200    // Don't transform anyway
+
+// Proofing flags
+#define cmsFLAGS_GAMUTCHECK               0x1000    // Out of Gamut alarm
+#define cmsFLAGS_SOFTPROOFING             0x4000    // Do softproofing
+
+// Misc
+#define cmsFLAGS_BLACKPOINTCOMPENSATION   0x2000
+#define cmsFLAGS_NOWHITEONWHITEFIXUP      0x0004    // Don't fix scum dot
+#define cmsFLAGS_HIGHRESPRECALC           0x0400    // Use more memory to give better accurancy
+#define cmsFLAGS_LOWRESPRECALC            0x0800    // Use less memory to minimize resouces
+
+// For devicelink creation
+#define cmsFLAGS_8BITS_DEVICELINK         0x0008   // Create 8 bits devicelinks
+#define cmsFLAGS_GUESSDEVICECLASS         0x0020   // Guess device class (for transform2devicelink)
+#define cmsFLAGS_KEEP_SEQUENCE            0x0080   // Keep profile sequence for devicelink creation
+
+// Specific to a particular optimizations
+#define cmsFLAGS_FORCE_CLUT               0x0002    // Force CLUT optimization
+#define cmsFLAGS_CLUT_POST_LINEARIZATION  0x0001    // create postlinearization tables if possible
+#define cmsFLAGS_CLUT_PRE_LINEARIZATION   0x0010    // create prelinearization tables if possible
+
+// Fine-tune control over number of gridpoints
+#define cmsFLAGS_GRIDPOINTS(n)           (((n) & 0xFF) << 16)
+
+// CRD special
+#define cmsFLAGS_NODEFAULTRESOURCEDEF     0x01000000
+
+// Transforms ---------------------------------------------------------------------------------------------------
+
+CMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID,
+                                                  cmsHPROFILE Input,
+                                                  cmsUInt32Number InputFormat,
+                                                  cmsHPROFILE Output,
+                                                  cmsUInt32Number OutputFormat,
+                                                  cmsUInt32Number Intent,
+                                                  cmsUInt32Number dwFlags);
+
+CMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateTransform(cmsHPROFILE Input,
+                                                  cmsUInt32Number InputFormat,
+                                                  cmsHPROFILE Output,
+                                                  cmsUInt32Number OutputFormat,
+                                                  cmsUInt32Number Intent,
+                                                  cmsUInt32Number dwFlags);
+
+CMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID,
+                                                  cmsHPROFILE Input,
+                                                  cmsUInt32Number InputFormat,
+                                                  cmsHPROFILE Output,
+                                                  cmsUInt32Number OutputFormat,
+                                                  cmsHPROFILE Proofing,
+                                                  cmsUInt32Number Intent,
+                                                  cmsUInt32Number ProofingIntent,
+                                                  cmsUInt32Number dwFlags);
+
+CMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE Input,
+                                                  cmsUInt32Number InputFormat,
+                                                  cmsHPROFILE Output,
+                                                  cmsUInt32Number OutputFormat,
+                                                  cmsHPROFILE Proofing,
+                                                  cmsUInt32Number Intent,
+                                                  cmsUInt32Number ProofingIntent,
+                                                  cmsUInt32Number dwFlags);
+
+CMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID,
+                                                  cmsHPROFILE hProfiles[],
+                                                  cmsUInt32Number nProfiles,
+                                                  cmsUInt32Number InputFormat,
+                                                  cmsUInt32Number OutputFormat,
+                                                  cmsUInt32Number Intent,
+                                                  cmsUInt32Number dwFlags);
+
+
+CMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],
+                                                  cmsUInt32Number nProfiles,
+                                                  cmsUInt32Number InputFormat,
+                                                  cmsUInt32Number OutputFormat,
+                                                  cmsUInt32Number Intent,
+                                                  cmsUInt32Number dwFlags);
+
+
+CMSAPI cmsHTRANSFORM    CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID,
+                                                   cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[],
+                                                   cmsBool  BPC[],
+                                                   cmsUInt32Number Intents[],
+                                                   cmsFloat64Number AdaptationStates[],
+                                                   cmsHPROFILE hGamutProfile,
+                                                   cmsUInt32Number nGamutPCSposition,
+                                                   cmsUInt32Number InputFormat,
+                                                   cmsUInt32Number OutputFormat,
+                                                   cmsUInt32Number dwFlags);
+
+CMSAPI void             CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform);
+
+CMSAPI void             CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform,
+                                                 const void * InputBuffer,
+                                                 void * OutputBuffer,
+                                                 cmsUInt32Number Size);
+
+CMSAPI void             CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform,
+                                                 const void * InputBuffer,
+                                                 void * OutputBuffer,
+                                                 cmsUInt32Number Size,
+                                                 cmsUInt32Number Stride);
+
+
+CMSAPI void             CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS]);
+CMSAPI void             CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number NewAlarm[cmsMAXCHANNELS]);
+
+
+CMSAPI void             CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID, 
+                                                          const cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]);
+CMSAPI void             CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID, 
+                                                          cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]);
+
+
+
+// Adaptation state for absolute colorimetric intent
+CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d);
+CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d);
+
+
+
+// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed
+CMSAPI cmsContext       CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform);
+
+// Grab the input/output formats
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform);
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform);
+
+// For backwards compatibility
+CMSAPI cmsBool          CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform,
+                                                         cmsUInt32Number InputFormat,
+                                                         cmsUInt32Number OutputFormat);
+
+
+
+// PostScript ColorRenderingDictionary and ColorSpaceArray ----------------------------------------------------
+
+typedef enum { cmsPS_RESOURCE_CSA, cmsPS_RESOURCE_CRD } cmsPSResourceType;
+
+// lcms2 unified method to access postscript color resources
+CMSAPI cmsUInt32Number  CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID,
+                                                                cmsPSResourceType Type,
+                                                                cmsHPROFILE hProfile,
+                                                                cmsUInt32Number Intent,
+                                                                cmsUInt32Number dwFlags,
+                                                                cmsIOHANDLER* io);
+
+CMSAPI cmsUInt32Number  CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen);
+CMSAPI cmsUInt32Number  CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen);
+
+
+// IT8.7 / CGATS.17-200x handling -----------------------------------------------------------------------------
+
+CMSAPI cmsHANDLE        CMSEXPORT cmsIT8Alloc(cmsContext ContextID);
+CMSAPI void             CMSEXPORT cmsIT8Free(cmsHANDLE hIT8);
+
+// Tables
+CMSAPI cmsUInt32Number  CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8);
+CMSAPI cmsInt32Number   CMSEXPORT cmsIT8SetTable(cmsHANDLE hIT8, cmsUInt32Number nTable);
+
+// Persistence
+CMSAPI cmsHANDLE        CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName);
+CMSAPI cmsHANDLE        CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, void *Ptr, cmsUInt32Number len);
+// CMSAPI cmsHANDLE        CMSEXPORT cmsIT8LoadFromIOhandler(cmsContext ContextID, cmsIOHANDLER* io);
+
+CMSAPI cmsBool          CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName);
+CMSAPI cmsBool          CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded);
+
+// Properties
+CMSAPI const char*      CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8);
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type);
+
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* cComment);
+
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* cProp, const char *Str);
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val);
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val);
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer);
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer);
+
+
+CMSAPI const char*      CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* cProp);
+CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp);
+CMSAPI const char*      CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey);
+CMSAPI cmsUInt32Number  CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames);
+CMSAPI cmsUInt32Number  CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames);
+
+// Datasets
+CMSAPI const char*      CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col);
+CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col);
+
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col,
+                                                const char* Val);
+
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col,
+                                                cmsFloat64Number Val);
+
+CMSAPI const char*      CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample);
+
+
+CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE hIT8, const char* cPatch, const char* cSample);
+
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch,
+                                                const char* cSample,
+                                                const char *Val);
+
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch,
+                                                const char* cSample,
+                                                cmsFloat64Number Val);
+
+CMSAPI int              CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample);
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE hIT8, int n, const char *Sample);
+CMSAPI int              CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames);
+
+CMSAPI const char*      CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer);
+CMSAPI int              CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch);
+
+// The LABEL extension
+CMSAPI int              CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType);
+
+CMSAPI cmsBool          CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample);
+
+// Formatter for double
+CMSAPI void             CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter);
+
+// Gamut boundary description routines ------------------------------------------------------------------------------
+
+CMSAPI cmsHANDLE        CMSEXPORT cmsGBDAlloc(cmsContext ContextID);
+CMSAPI void             CMSEXPORT cmsGBDFree(cmsHANDLE hGBD);
+CMSAPI cmsBool          CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab);
+CMSAPI cmsBool          CMSEXPORT cmsGDBCompute(cmsHANDLE  hGDB, cmsUInt32Number dwFlags);
+CMSAPI cmsBool          CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab);
+
+// Feature detection  ----------------------------------------------------------------------------------------------
+
+// Estimate the black point
+CMSAPI cmsBool          CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags);
+CMSAPI cmsBool          CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags);
+
+// Estimate total area coverage
+CMSAPI cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile);
+
+
+// Poor man's gamut mapping
+CMSAPI cmsBool          CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab,
+                                                   double amax, double amin,
+                                                   double bmax, double bmin);
+
+#ifndef CMS_USE_CPP_API
+#   ifdef __cplusplus
+    }
+#   endif
+#endif
+
+#define _lcms2_H
+#endif
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2_plugin.h b/core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2_plugin.h
new file mode 100644
index 0000000..0c95d1f
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2_plugin.h
@@ -0,0 +1,637 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2011 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+// This is the plug-in header file. Normal LittleCMS clients should not use it.
+// It is provided for plug-in writters that may want to access the support
+// functions to do low level operations. All plug-in related structures
+// are defined here. Including this file forces to include the standard API too.
+
+#ifndef _lcms_plugin_H
+
+// Deal with Microsoft's attempt at deprecating C standard runtime functions
+#ifdef _MSC_VER
+#    if (_MSC_VER >= 1400)
+#      ifndef _CRT_SECURE_NO_DEPRECATE
+#        define _CRT_SECURE_NO_DEPRECATE
+#      endif
+#      ifndef _CRT_SECURE_NO_WARNINGS
+#        define _CRT_SECURE_NO_WARNINGS
+#      endif
+#    endif
+#endif
+
+#ifndef _lcms2_H
+#include "lcms2.h"
+#endif
+
+// We need some standard C functions.
+#include <stdlib.h>
+#include <math.h>
+#include <stdarg.h>
+#include <memory.h>
+#include <string.h>
+
+
+#ifndef CMS_USE_CPP_API
+#   ifdef __cplusplus
+extern "C" {
+#   endif
+#endif
+
+// Vector & Matrix operations -----------------------------------------------------------------------
+
+// Axis of the matrix/array. No specific meaning at all.
+#define VX      0
+#define VY      1
+#define VZ      2
+
+// Vectors
+typedef struct {
+    cmsFloat64Number n[3];
+
+    } cmsVEC3;
+
+// 3x3 Matrix
+typedef struct {
+    cmsVEC3 v[3];
+
+    } cmsMAT3;
+
+CMSAPI void               CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z);
+CMSAPI void               CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b);
+CMSAPI void               CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v);
+CMSAPI cmsFloat64Number   CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v);
+CMSAPI cmsFloat64Number   CMSEXPORT _cmsVEC3length(const cmsVEC3* a);
+CMSAPI cmsFloat64Number   CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b);
+
+CMSAPI void               CMSEXPORT _cmsMAT3identity(cmsMAT3* a);
+CMSAPI cmsBool            CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a);
+CMSAPI void               CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b);
+CMSAPI cmsBool            CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b);
+CMSAPI cmsBool            CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b);
+CMSAPI void               CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v);
+
+
+// Error logging  -------------------------------------------------------------------------------------
+
+CMSAPI void               CMSEXPORT  cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...);
+
+// Memory management ----------------------------------------------------------------------------------
+
+CMSAPI void*              CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size);
+CMSAPI void*              CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size);
+CMSAPI void*              CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size);
+CMSAPI void*              CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize);
+CMSAPI void               CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr);
+CMSAPI void*              CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size);
+
+// I/O handler ----------------------------------------------------------------------------------
+
+struct _cms_io_handler {
+
+    void* stream;   // Associated stream, which is implemented differently depending on media.
+
+    cmsContext        ContextID;
+    cmsUInt32Number   UsedSpace;
+    cmsUInt32Number   ReportedSize;
+    char              PhysicalFile[cmsMAX_PATH];
+
+    cmsUInt32Number   (* Read)(struct _cms_io_handler* iohandler, void *Buffer,
+                                                                  cmsUInt32Number size,
+                                                                  cmsUInt32Number count);
+    cmsBool           (* Seek)(struct _cms_io_handler* iohandler, cmsUInt32Number offset);
+    cmsBool           (* Close)(struct _cms_io_handler* iohandler);
+    cmsUInt32Number   (* Tell)(struct _cms_io_handler* iohandler);
+    cmsBool           (* Write)(struct _cms_io_handler* iohandler, cmsUInt32Number size,
+                                                                   const void* Buffer);
+};
+
+// Endianess adjust functions
+CMSAPI cmsUInt16Number   CMSEXPORT  _cmsAdjustEndianess16(cmsUInt16Number Word);
+CMSAPI cmsUInt32Number   CMSEXPORT  _cmsAdjustEndianess32(cmsUInt32Number Value);
+CMSAPI void              CMSEXPORT  _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord);
+
+// Helper IO functions
+CMSAPI cmsBool           CMSEXPORT  _cmsReadUInt8Number(cmsIOHANDLER* io,  cmsUInt8Number* n);
+CMSAPI cmsBool           CMSEXPORT  _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n);
+CMSAPI cmsBool           CMSEXPORT  _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n);
+CMSAPI cmsBool           CMSEXPORT  _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n);
+CMSAPI cmsBool           CMSEXPORT  _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n);
+CMSAPI cmsBool           CMSEXPORT  _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n);
+CMSAPI cmsBool           CMSEXPORT  _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ);
+CMSAPI cmsBool           CMSEXPORT  _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array);
+
+CMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n);
+CMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n);
+CMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n);
+CMSAPI cmsBool           CMSEXPORT  _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n);
+CMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n);
+CMSAPI cmsBool           CMSEXPORT  _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n);
+CMSAPI cmsBool           CMSEXPORT  _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ);
+CMSAPI cmsBool           CMSEXPORT  _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array);
+
+// ICC base tag
+typedef struct {
+    cmsTagTypeSignature  sig;
+    cmsInt8Number        reserved[4];
+
+} _cmsTagBase;
+
+// Type base helper functions
+CMSAPI cmsTagTypeSignature  CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io);
+CMSAPI cmsBool              CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig);
+
+// Alignment functions
+CMSAPI cmsBool             CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io);
+CMSAPI cmsBool             CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io);
+
+// To deal with text streams. 2K at most
+CMSAPI cmsBool             CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...);
+
+// Fixed point helper functions
+CMSAPI cmsFloat64Number    CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8);
+CMSAPI cmsUInt16Number     CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val);
+
+CMSAPI cmsFloat64Number    CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32);
+CMSAPI cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v);
+
+// Date/time helper functions
+CMSAPI void                CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source);
+CMSAPI void                CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest);
+
+//----------------------------------------------------------------------------------------------------------
+
+// Shared callbacks for user data
+typedef void     (* _cmsFreeUserDataFn)(cmsContext ContextID, void* Data);
+typedef void*    (* _cmsDupUserDataFn)(cmsContext ContextID, const void* Data);
+
+//----------------------------------------------------------------------------------------------------------
+
+// Plug-in foundation
+#define cmsPluginMagicNumber                 0x61637070     // 'acpp'
+
+#define cmsPluginMemHandlerSig               0x6D656D48     // 'memH'
+#define cmsPluginInterpolationSig            0x696E7048     // 'inpH'
+#define cmsPluginParametricCurveSig          0x70617248     // 'parH'
+#define cmsPluginFormattersSig               0x66726D48     // 'frmH
+#define cmsPluginTagTypeSig                  0x74797048     // 'typH'
+#define cmsPluginTagSig                      0x74616748     // 'tagH'
+#define cmsPluginRenderingIntentSig          0x696E7448     // 'intH'
+#define cmsPluginMultiProcessElementSig      0x6D706548     // 'mpeH'
+#define cmsPluginOptimizationSig             0x6F707448     // 'optH'
+#define cmsPluginTransformSig                0x7A666D48     // 'xfmH'
+#define cmsPluginMutexSig                    0x6D747A48     // 'mtxH'
+
+typedef struct _cmsPluginBaseStruct {
+
+        cmsUInt32Number                Magic;               // 'acpp' signature
+        cmsUInt32Number                ExpectedVersion;     // Expected version of LittleCMS
+        cmsUInt32Number                Type;                // Type of plug-in
+        struct _cmsPluginBaseStruct*   Next;                // For multiple plugin definition. NULL for end of list.
+
+} cmsPluginBase;
+
+// Maximum number of types in a plugin array
+#define MAX_TYPES_IN_LCMS_PLUGIN    20
+
+//----------------------------------------------------------------------------------------------------------
+
+// Memory handler. Each new plug-in type replaces current behaviour
+
+typedef void* (* _cmsMallocFnPtrType)(cmsContext ContextID, cmsUInt32Number size); 
+typedef void  (* _cmsFreeFnPtrType)(cmsContext ContextID, void *Ptr);
+typedef void* (* _cmsReallocFnPtrType)(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize);
+
+typedef void* (* _cmsMalloZerocFnPtrType)(cmsContext ContextID, cmsUInt32Number size); 
+typedef void* (* _cmsCallocFnPtrType)(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size);
+typedef void* (* _cmsDupFnPtrType)(cmsContext ContextID, const void* Org, cmsUInt32Number size);
+
+typedef struct {
+
+        cmsPluginBase base;
+
+        // Required
+        _cmsMallocFnPtrType  MallocPtr;
+        _cmsFreeFnPtrType    FreePtr;
+        _cmsReallocFnPtrType ReallocPtr;
+
+        // Optional
+       _cmsMalloZerocFnPtrType MallocZeroPtr;
+       _cmsCallocFnPtrType     CallocPtr;
+       _cmsDupFnPtrType        DupPtr;
+
+} cmsPluginMemHandler;
+
+
+// ------------------------------------------------------------------------------------------------------------------
+
+// Interpolation. 16 bits and floating point versions.
+struct _cms_interp_struc;
+
+// Interpolation callbacks
+
+// 16 bits forward interpolation. This function performs precision-limited linear interpolation
+// and is supposed to be quite fast. Implementation may be tetrahedral or trilinear, and plug-ins may
+// choose to implement any other interpolation algorithm.
+typedef void (* _cmsInterpFn16)(register const cmsUInt16Number Input[],
+                                register cmsUInt16Number Output[],
+                                register const struct _cms_interp_struc* p);
+
+// Floating point forward interpolation. Full precision interpolation using floats. This is not a
+// time critical function. Implementation may be tetrahedral or trilinear, and plug-ins may
+// choose to implement any other interpolation algorithm.
+typedef void (* _cmsInterpFnFloat)(cmsFloat32Number const Input[],
+                                   cmsFloat32Number Output[],
+                                   const struct _cms_interp_struc* p);
+
+
+
+// This type holds a pointer to an interpolator that can be either 16 bits or float
+typedef union {
+    _cmsInterpFn16       Lerp16;            // Forward interpolation in 16 bits
+    _cmsInterpFnFloat    LerpFloat;         // Forward interpolation in floating point
+} cmsInterpFunction;
+
+// Flags for interpolator selection
+#define CMS_LERP_FLAGS_16BITS             0x0000        // The default
+#define CMS_LERP_FLAGS_FLOAT              0x0001        // Requires different implementation
+#define CMS_LERP_FLAGS_TRILINEAR          0x0100        // Hint only
+
+
+#define MAX_INPUT_DIMENSIONS 8
+
+typedef struct _cms_interp_struc {  // Used on all interpolations. Supplied by lcms2 when calling the interpolation function
+
+    cmsContext ContextID;     // The calling thread
+
+    cmsUInt32Number dwFlags;  // Keep original flags
+    cmsUInt32Number nInputs;  // != 1 only in 3D interpolation
+    cmsUInt32Number nOutputs; // != 1 only in 3D interpolation
+
+    cmsUInt32Number nSamples[MAX_INPUT_DIMENSIONS];  // Valid on all kinds of tables
+    cmsUInt32Number Domain[MAX_INPUT_DIMENSIONS];    // Domain = nSamples - 1
+
+    cmsUInt32Number opta[MAX_INPUT_DIMENSIONS];     // Optimization for 3D CLUT. This is the number of nodes premultiplied for each
+                                                    // dimension. For example, in 7 nodes, 7, 7^2 , 7^3, 7^4, etc. On non-regular
+                                                    // Samplings may vary according of the number of nodes for each dimension.
+
+    const void *Table;                // Points to the actual interpolation table
+    cmsInterpFunction Interpolation;  // Points to the function to do the interpolation
+
+ } cmsInterpParams;
+
+// Interpolators factory
+typedef cmsInterpFunction (* cmsInterpFnFactory)(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags);
+
+// The plug-in
+typedef struct {
+    cmsPluginBase base;
+
+    // Points to a user-supplied function which implements the factory
+    cmsInterpFnFactory InterpolatorsFactory;
+
+} cmsPluginInterpolation;
+
+//----------------------------------------------------------------------------------------------------------
+
+// Parametric curves. A negative type means same function but analytically inverted. Max. number of params is 10
+
+// Evaluator callback for user-suplied parametric curves. May implement more than one type
+typedef  cmsFloat64Number (* cmsParametricCurveEvaluator)(cmsInt32Number Type, const cmsFloat64Number Params[10], cmsFloat64Number R);
+
+// Plug-in may implement an arbitrary number of parametric curves
+typedef struct {
+    cmsPluginBase base;
+
+    cmsUInt32Number nFunctions;                                     // Number of supported functions
+    cmsUInt32Number FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN];        // The identification types
+    cmsUInt32Number ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN];       // Number of parameters for each function
+
+    cmsParametricCurveEvaluator    Evaluator;                       // The evaluator
+
+} cmsPluginParametricCurves;
+//----------------------------------------------------------------------------------------------------------
+
+// Formatters. This plug-in adds new handlers, replacing them if they already exist. Formatters dealing with
+// cmsFloat32Number (bps = 4) or double (bps = 0) types are requested via FormatterFloat callback. Others come across
+// Formatter16 callback
+
+struct _cmstransform_struct;
+
+typedef cmsUInt8Number* (* cmsFormatter16)(register struct _cmstransform_struct* CMMcargo,
+                                           register cmsUInt16Number Values[],
+                                           register cmsUInt8Number*  Buffer,
+                                           register cmsUInt32Number  Stride);
+
+typedef cmsUInt8Number* (* cmsFormatterFloat)(struct _cmstransform_struct* CMMcargo,
+                                              cmsFloat32Number Values[],
+                                              cmsUInt8Number*  Buffer,
+                                              cmsUInt32Number  Stride);
+
+// This type holds a pointer to a formatter that can be either 16 bits or cmsFloat32Number
+typedef union {
+    cmsFormatter16    Fmt16;
+    cmsFormatterFloat FmtFloat;
+
+} cmsFormatter;
+
+#define CMS_PACK_FLAGS_16BITS       0x0000
+#define CMS_PACK_FLAGS_FLOAT        0x0001
+
+typedef enum { cmsFormatterInput=0, cmsFormatterOutput=1 } cmsFormatterDirection;
+
+typedef cmsFormatter (* cmsFormatterFactory)(cmsUInt32Number Type,           // Specific type, i.e. TYPE_RGB_8
+                                             cmsFormatterDirection Dir,
+                                             cmsUInt32Number dwFlags);      // precision
+
+// Plug-in may implement an arbitrary number of formatters
+typedef struct {
+    cmsPluginBase          base;
+    cmsFormatterFactory    FormattersFactory;
+
+} cmsPluginFormatters;
+
+//----------------------------------------------------------------------------------------------------------
+
+// Tag type handler. Each type is free to return anything it wants, and it is up to the caller to
+// know in advance what is the type contained in the tag.
+typedef struct _cms_typehandler_struct {
+
+        cmsTagTypeSignature Signature;     // The signature of the type
+
+        // Allocates and reads items
+        void *   (* ReadPtr)(struct _cms_typehandler_struct* self,
+                             cmsIOHANDLER*      io,
+                             cmsUInt32Number*   nItems,
+                             cmsUInt32Number    SizeOfTag);
+
+        // Writes n Items
+        cmsBool  (* WritePtr)(struct _cms_typehandler_struct* self,
+                              cmsIOHANDLER*     io,
+                              void*             Ptr,
+                              cmsUInt32Number   nItems);
+
+        // Duplicate an item or array of items
+        void*   (* DupPtr)(struct _cms_typehandler_struct* self,
+                           const void *Ptr,
+                           cmsUInt32Number n);
+
+        // Free all resources
+        void    (* FreePtr)(struct _cms_typehandler_struct* self,
+                            void *Ptr);
+
+        // Additional parameters used by the calling thread
+        cmsContext       ContextID;
+        cmsUInt32Number  ICCVersion;
+
+} cmsTagTypeHandler;
+
+// Each plug-in implements a single type
+typedef struct {
+        cmsPluginBase      base;
+        cmsTagTypeHandler  Handler;
+
+} cmsPluginTagType;
+
+//----------------------------------------------------------------------------------------------------------
+
+// This is the tag plugin, which identifies tags. For writing, a pointer to function is provided.
+// This function should return the desired type for this tag, given the version of profile
+// and the data being serialized.
+typedef struct {
+
+    cmsUInt32Number     ElemCount;          // If this tag needs an array, how many elements should keep
+
+    // For reading.
+    cmsUInt32Number     nSupportedTypes;    // In how many types this tag can come (MAX_TYPES_IN_LCMS_PLUGIN maximum)
+    cmsTagTypeSignature SupportedTypes[MAX_TYPES_IN_LCMS_PLUGIN];
+
+    // For writting
+    cmsTagTypeSignature (* DecideType)(cmsFloat64Number ICCVersion, const void *Data);
+
+} cmsTagDescriptor;
+
+// Plug-in implements a single tag
+typedef struct {
+    cmsPluginBase    base;
+
+    cmsTagSignature  Signature;
+    cmsTagDescriptor Descriptor;
+
+} cmsPluginTag;
+
+//----------------------------------------------------------------------------------------------------------
+
+// Custom intents. This function should join all profiles specified in the array in
+// a single LUT. Any custom intent in the chain redirects to custom function. If more than
+// one custom intent is found, the one located first is invoked. Usually users should use only one
+// custom intent, so mixing custom intents in same multiprofile transform is not supported.
+
+typedef cmsPipeline* (* cmsIntentFn)( cmsContext       ContextID,
+                                      cmsUInt32Number  nProfiles,
+                                      cmsUInt32Number  Intents[],
+                                      cmsHPROFILE      hProfiles[],
+                                      cmsBool          BPC[],
+                                      cmsFloat64Number AdaptationStates[],
+                                      cmsUInt32Number  dwFlags);
+
+
+// Each plug-in defines a single intent number.
+typedef struct {
+    cmsPluginBase     base;
+    cmsUInt32Number   Intent;
+    cmsIntentFn       Link;
+    char              Description[256];
+
+} cmsPluginRenderingIntent;
+
+
+// The default ICC intents (perceptual, saturation, rel.col and abs.col)
+CMSAPI cmsPipeline*  CMSEXPORT _cmsDefaultICCintents(cmsContext       ContextID,
+                                                     cmsUInt32Number  nProfiles,
+                                                     cmsUInt32Number  Intents[],
+                                                     cmsHPROFILE      hProfiles[],
+                                                     cmsBool          BPC[],
+                                                     cmsFloat64Number AdaptationStates[],
+                                                     cmsUInt32Number  dwFlags);
+
+
+//----------------------------------------------------------------------------------------------------------
+
+// Pipelines, Multi Process Elements.
+
+typedef void (* _cmsStageEvalFn)     (const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage* mpe);
+typedef void*(* _cmsStageDupElemFn)  (cmsStage* mpe);
+typedef void (* _cmsStageFreeElemFn) (cmsStage* mpe);
+
+
+// This function allocates a generic MPE
+CMSAPI cmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID,
+                                cmsStageSignature     Type,
+                                cmsUInt32Number       InputChannels,
+                                cmsUInt32Number       OutputChannels,
+                                _cmsStageEvalFn       EvalPtr,            // Points to fn that evaluates the element (always in floating point)
+                                _cmsStageDupElemFn    DupElemPtr,         // Points to a fn that duplicates the stage
+                                _cmsStageFreeElemFn   FreePtr,            // Points to a fn that sets the element free
+                                void*                 Data);              // A generic pointer to whatever memory needed by the element
+typedef struct {
+      cmsPluginBase     base;
+      cmsTagTypeHandler Handler;
+
+}  cmsPluginMultiProcessElement;
+
+
+// Data kept in "Element" member of cmsStage
+
+// Curves
+typedef struct {
+    cmsUInt32Number nCurves;
+    cmsToneCurve**  TheCurves;
+
+} _cmsStageToneCurvesData;
+
+// Matrix
+typedef struct {
+    cmsFloat64Number*  Double;          // floating point for the matrix
+    cmsFloat64Number*  Offset;          // The offset
+
+} _cmsStageMatrixData;
+
+// CLUT
+typedef struct {
+
+    union {                       // Can have only one of both representations at same time
+        cmsUInt16Number*  T;      // Points to the table 16 bits table
+        cmsFloat32Number* TFloat; // Points to the cmsFloat32Number table
+
+    } Tab;
+
+    cmsInterpParams* Params;
+    cmsUInt32Number  nEntries;
+    cmsBool          HasFloatValues;
+
+} _cmsStageCLutData;
+
+
+//----------------------------------------------------------------------------------------------------------
+// Optimization. Using this plug-in, additional optimization strategies may be implemented.
+// The function should return TRUE if any optimization is done on the LUT, this terminates
+// the optimization  search. Or FALSE if it is unable to optimize and want to give a chance
+// to the rest of optimizers.
+
+typedef void     (* _cmsOPTeval16Fn)(register const cmsUInt16Number In[],
+                                     register cmsUInt16Number Out[],
+                                     register const void* Data);
+
+
+typedef cmsBool  (* _cmsOPToptimizeFn)(cmsPipeline** Lut,
+                                       cmsUInt32Number  Intent,
+                                       cmsUInt32Number* InputFormat,
+                                       cmsUInt32Number* OutputFormat,
+                                       cmsUInt32Number* dwFlags);
+
+// This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional
+// duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality.
+
+CMSAPI void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut,
+                                               _cmsOPTeval16Fn Eval16,
+                                               void* PrivateData,
+                                               _cmsFreeUserDataFn FreePrivateDataFn,
+                                               _cmsDupUserDataFn DupPrivateDataFn);
+
+typedef struct {
+      cmsPluginBase     base;
+
+      // Optimize entry point
+      _cmsOPToptimizeFn  OptimizePtr;
+
+}  cmsPluginOptimization;
+
+//----------------------------------------------------------------------------------------------------------
+// Full xform
+typedef void     (* _cmsTransformFn)(struct _cmstransform_struct *CMMcargo,
+                                     const void* InputBuffer,
+                                     void* OutputBuffer,
+                                     cmsUInt32Number Size,
+                                     cmsUInt32Number Stride);
+
+typedef cmsBool  (* _cmsTransformFactory)(_cmsTransformFn* xform,
+                                         void** UserData,
+                                         _cmsFreeUserDataFn* FreePrivateDataFn,
+                                         cmsPipeline** Lut,
+                                         cmsUInt32Number* InputFormat,
+                                         cmsUInt32Number* OutputFormat,
+                                         cmsUInt32Number* dwFlags);
+
+
+// Retrieve user data as specified by the factory
+CMSAPI void   CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn);
+CMSAPI void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo);
+
+
+// Retrieve formatters
+CMSAPI void   CMSEXPORT _cmsGetTransformFormatters16   (struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput);
+CMSAPI void   CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput);
+
+typedef struct {
+      cmsPluginBase     base;
+
+      // Transform entry point
+      _cmsTransformFactory  Factory;
+
+}  cmsPluginTransform;
+
+//----------------------------------------------------------------------------------------------------------
+// Mutex 
+
+typedef void*    (* _cmsCreateMutexFnPtrType)(cmsContext ContextID);
+typedef void     (* _cmsDestroyMutexFnPtrType)(cmsContext ContextID, void* mtx);
+typedef cmsBool  (* _cmsLockMutexFnPtrType)(cmsContext ContextID, void* mtx);
+typedef void     (* _cmsUnlockMutexFnPtrType)(cmsContext ContextID, void* mtx);
+
+typedef struct {
+      cmsPluginBase     base;
+
+     _cmsCreateMutexFnPtrType  CreateMutexPtr;
+     _cmsDestroyMutexFnPtrType DestroyMutexPtr;
+     _cmsLockMutexFnPtrType    LockMutexPtr;
+     _cmsUnlockMutexFnPtrType  UnlockMutexPtr;
+
+}  cmsPluginMutex;
+
+CMSAPI void*   CMSEXPORT _cmsCreateMutex(cmsContext ContextID);
+CMSAPI void    CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx);
+CMSAPI cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx);
+CMSAPI void    CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx);
+
+
+#ifndef CMS_USE_CPP_API
+#   ifdef __cplusplus
+    }
+#   endif
+#endif
+
+#define _lcms_plugin_H
+#endif
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscam02.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscam02.c
new file mode 100644
index 0000000..9d874aa
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscam02.c
@@ -0,0 +1,486 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// CIECAM 02 appearance model. Many thanks to Jordi Vilar for the debugging.
+
+// ---------- Implementation --------------------------------------------
+
+typedef struct  {
+
+    cmsFloat64Number XYZ[3];
+    cmsFloat64Number RGB[3];
+    cmsFloat64Number RGBc[3];
+    cmsFloat64Number RGBp[3];
+    cmsFloat64Number RGBpa[3];
+    cmsFloat64Number a, b, h, e, H, A, J, Q, s, t, C, M;
+    cmsFloat64Number abC[2];
+    cmsFloat64Number abs[2];
+    cmsFloat64Number abM[2];
+
+} CAM02COLOR;
+
+typedef struct  {
+
+    CAM02COLOR adoptedWhite;
+    cmsFloat64Number LA, Yb;
+    cmsFloat64Number F, c, Nc;
+    cmsUInt32Number surround;
+    cmsFloat64Number n, Nbb, Ncb, z, FL, D;
+
+    cmsContext ContextID;
+
+} cmsCIECAM02;
+
+
+static
+cmsFloat64Number compute_n(cmsCIECAM02* pMod)
+{
+    return (pMod -> Yb / pMod -> adoptedWhite.XYZ[1]);
+}
+
+static
+cmsFloat64Number compute_z(cmsCIECAM02* pMod)
+{
+    return (1.48 + pow(pMod -> n, 0.5));
+}
+
+static
+cmsFloat64Number computeNbb(cmsCIECAM02* pMod)
+{
+    return (0.725 * pow((1.0 / pMod -> n), 0.2));
+}
+
+static
+cmsFloat64Number computeFL(cmsCIECAM02* pMod)
+{
+    cmsFloat64Number k, FL;
+
+    k = 1.0 / ((5.0 * pMod->LA) + 1.0);
+    FL = 0.2 * pow(k, 4.0) * (5.0 * pMod->LA) + 0.1 *
+        (pow((1.0 - pow(k, 4.0)), 2.0)) *
+        (pow((5.0 * pMod->LA), (1.0 / 3.0)));
+
+    return FL;
+}
+
+static
+cmsFloat64Number computeD(cmsCIECAM02* pMod)
+{
+    cmsFloat64Number D;
+
+    D = pMod->F - (1.0/3.6)*(exp(((-pMod ->LA-42) / 92.0)));
+
+    return D;
+}
+
+
+static
+CAM02COLOR XYZtoCAT02(CAM02COLOR clr)
+{
+    clr.RGB[0] = (clr.XYZ[0] *  0.7328) + (clr.XYZ[1] *  0.4296) + (clr.XYZ[2] * -0.1624);
+    clr.RGB[1] = (clr.XYZ[0] * -0.7036) + (clr.XYZ[1] *  1.6975) + (clr.XYZ[2] *  0.0061);
+    clr.RGB[2] = (clr.XYZ[0] *  0.0030) + (clr.XYZ[1] *  0.0136) + (clr.XYZ[2] *  0.9834);
+
+    return clr;
+}
+
+static
+CAM02COLOR ChromaticAdaptation(CAM02COLOR clr, cmsCIECAM02* pMod)
+{
+    cmsUInt32Number i;
+
+    for (i = 0; i < 3; i++) {
+        clr.RGBc[i] = ((pMod -> adoptedWhite.XYZ[1] *
+            (pMod->D / pMod -> adoptedWhite.RGB[i])) +
+            (1.0 - pMod->D)) * clr.RGB[i];
+    }
+
+    return clr;
+}
+
+
+static
+CAM02COLOR CAT02toHPE(CAM02COLOR clr)
+{
+    cmsFloat64Number M[9];
+
+    M[0] =(( 0.38971 *  1.096124) + (0.68898 * 0.454369) + (-0.07868 * -0.009628));
+    M[1] =(( 0.38971 * -0.278869) + (0.68898 * 0.473533) + (-0.07868 * -0.005698));
+    M[2] =(( 0.38971 *  0.182745) + (0.68898 * 0.072098) + (-0.07868 *  1.015326));
+    M[3] =((-0.22981 *  1.096124) + (1.18340 * 0.454369) + ( 0.04641 * -0.009628));
+    M[4] =((-0.22981 * -0.278869) + (1.18340 * 0.473533) + ( 0.04641 * -0.005698));
+    M[5] =((-0.22981 *  0.182745) + (1.18340 * 0.072098) + ( 0.04641 *  1.015326));
+    M[6] =(-0.009628);
+    M[7] =(-0.005698);
+    M[8] =( 1.015326);
+
+    clr.RGBp[0] = (clr.RGBc[0] * M[0]) +  (clr.RGBc[1] * M[1]) + (clr.RGBc[2] * M[2]);
+    clr.RGBp[1] = (clr.RGBc[0] * M[3]) +  (clr.RGBc[1] * M[4]) + (clr.RGBc[2] * M[5]);
+    clr.RGBp[2] = (clr.RGBc[0] * M[6]) +  (clr.RGBc[1] * M[7]) + (clr.RGBc[2] * M[8]);
+
+    return  clr;
+}
+
+static
+CAM02COLOR NonlinearCompression(CAM02COLOR clr, cmsCIECAM02* pMod)
+{
+    cmsUInt32Number i;
+    cmsFloat64Number temp;
+
+    for (i = 0; i < 3; i++) {
+        if (clr.RGBp[i] < 0) {
+
+            temp = pow((-1.0 * pMod->FL * clr.RGBp[i] / 100.0), 0.42);
+            clr.RGBpa[i] = (-1.0 * 400.0 * temp) / (temp + 27.13) + 0.1;
+        }
+        else {
+            temp = pow((pMod->FL * clr.RGBp[i] / 100.0), 0.42);
+            clr.RGBpa[i] = (400.0 * temp) / (temp + 27.13) + 0.1;
+        }
+    }
+
+    clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] +
+        (clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb;
+
+    return clr;
+}
+
+static
+CAM02COLOR ComputeCorrelates(CAM02COLOR clr, cmsCIECAM02* pMod)
+{
+    cmsFloat64Number a, b, temp, e, t, r2d, d2r;
+
+    a = clr.RGBpa[0] - (12.0 * clr.RGBpa[1] / 11.0) + (clr.RGBpa[2] / 11.0);
+    b = (clr.RGBpa[0] + clr.RGBpa[1] - (2.0 * clr.RGBpa[2])) / 9.0;
+
+    r2d = (180.0 / 3.141592654);
+    if (a == 0) {
+        if (b == 0)     clr.h = 0;
+        else if (b > 0) clr.h = 90;
+        else            clr.h = 270;
+    }
+    else if (a > 0) {
+        temp = b / a;
+        if (b > 0)       clr.h = (r2d * atan(temp));
+        else if (b == 0) clr.h = 0;
+        else             clr.h = (r2d * atan(temp)) + 360;
+    }
+    else {
+        temp = b / a;
+        clr.h = (r2d * atan(temp)) + 180;
+    }
+
+    d2r = (3.141592654 / 180.0);
+    e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) *
+        (cos((clr.h * d2r + 2.0)) + 3.8);
+
+    if (clr.h < 20.14) {
+        temp = ((clr.h + 122.47)/1.2) + ((20.14 - clr.h)/0.8);
+        clr.H = 300 + (100*((clr.h + 122.47)/1.2)) / temp;
+    }
+    else if (clr.h < 90.0) {
+        temp = ((clr.h - 20.14)/0.8) + ((90.00 - clr.h)/0.7);
+        clr.H = (100*((clr.h - 20.14)/0.8)) / temp;
+    }
+    else if (clr.h < 164.25) {
+        temp = ((clr.h - 90.00)/0.7) + ((164.25 - clr.h)/1.0);
+        clr.H = 100 + ((100*((clr.h - 90.00)/0.7)) / temp);
+    }
+    else if (clr.h < 237.53) {
+        temp = ((clr.h - 164.25)/1.0) + ((237.53 - clr.h)/1.2);
+        clr.H = 200 + ((100*((clr.h - 164.25)/1.0)) / temp);
+    }
+    else {
+        temp = ((clr.h - 237.53)/1.2) + ((360 - clr.h + 20.14)/0.8);
+        clr.H = 300 + ((100*((clr.h - 237.53)/1.2)) / temp);
+    }
+
+    clr.J = 100.0 * pow((clr.A / pMod->adoptedWhite.A),
+        (pMod->c * pMod->z));
+
+    clr.Q = (4.0 / pMod->c) * pow((clr.J / 100.0), 0.5) *
+        (pMod->adoptedWhite.A + 4.0) * pow(pMod->FL, 0.25);
+
+    t = (e * pow(((a * a) + (b * b)), 0.5)) /
+        (clr.RGBpa[0] + clr.RGBpa[1] +
+        ((21.0 / 20.0) * clr.RGBpa[2]));
+
+    clr.C = pow(t, 0.9) * pow((clr.J / 100.0), 0.5) *
+        pow((1.64 - pow(0.29, pMod->n)), 0.73);
+
+    clr.M = clr.C * pow(pMod->FL, 0.25);
+    clr.s = 100.0 * pow((clr.M / clr.Q), 0.5);
+
+    return clr;
+}
+
+
+static
+CAM02COLOR InverseCorrelates(CAM02COLOR clr, cmsCIECAM02* pMod)
+{
+
+    cmsFloat64Number t, e, p1, p2, p3, p4, p5, hr, d2r;
+    d2r = 3.141592654 / 180.0;
+
+    t = pow( (clr.C / (pow((clr.J / 100.0), 0.5) *
+        (pow((1.64 - pow(0.29, pMod->n)), 0.73)))),
+        (1.0 / 0.9) );
+    e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) *
+        (cos((clr.h * d2r + 2.0)) + 3.8);
+
+    clr.A = pMod->adoptedWhite.A * pow(
+           (clr.J / 100.0),
+           (1.0 / (pMod->c * pMod->z)));
+
+    p1 = e / t;
+    p2 = (clr.A / pMod->Nbb) + 0.305;
+    p3 = 21.0 / 20.0;
+
+    hr = clr.h * d2r;
+
+    if (fabs(sin(hr)) >= fabs(cos(hr))) {
+        p4 = p1 / sin(hr);
+        clr.b = (p2 * (2.0 + p3) * (460.0 / 1403.0)) /
+            (p4 + (2.0 + p3) * (220.0 / 1403.0) *
+            (cos(hr) / sin(hr)) - (27.0 / 1403.0) +
+            p3 * (6300.0 / 1403.0));
+        clr.a = clr.b * (cos(hr) / sin(hr));
+    }
+    else {
+        p5 = p1 / cos(hr);
+        clr.a = (p2 * (2.0 + p3) * (460.0 / 1403.0)) /
+            (p5 + (2.0 + p3) * (220.0 / 1403.0) -
+            ((27.0 / 1403.0) - p3 * (6300.0 / 1403.0)) *
+            (sin(hr) / cos(hr)));
+        clr.b = clr.a * (sin(hr) / cos(hr));
+    }
+
+    clr.RGBpa[0] = ((460.0 / 1403.0) * p2) +
+              ((451.0 / 1403.0) * clr.a) +
+              ((288.0 / 1403.0) * clr.b);
+    clr.RGBpa[1] = ((460.0 / 1403.0) * p2) -
+              ((891.0 / 1403.0) * clr.a) -
+              ((261.0 / 1403.0) * clr.b);
+    clr.RGBpa[2] = ((460.0 / 1403.0) * p2) -
+              ((220.0 / 1403.0) * clr.a) -
+              ((6300.0 / 1403.0) * clr.b);
+
+    return clr;
+}
+
+static
+CAM02COLOR InverseNonlinearity(CAM02COLOR clr, cmsCIECAM02* pMod)
+{
+    cmsUInt32Number i;
+    cmsFloat64Number c1;
+
+    for (i = 0; i < 3; i++) {
+        if ((clr.RGBpa[i] - 0.1) < 0) c1 = -1;
+        else                               c1 = 1;
+        clr.RGBp[i] = c1 * (100.0 / pMod->FL) *
+            pow(((27.13 * fabs(clr.RGBpa[i] - 0.1)) /
+            (400.0 - fabs(clr.RGBpa[i] - 0.1))),
+            (1.0 / 0.42));
+    }
+
+    return clr;
+}
+
+static
+CAM02COLOR HPEtoCAT02(CAM02COLOR clr)
+{
+    cmsFloat64Number M[9];
+
+    M[0] = (( 0.7328 *  1.910197) + (0.4296 * 0.370950));
+    M[1] = (( 0.7328 * -1.112124) + (0.4296 * 0.629054));
+    M[2] = (( 0.7328 *  0.201908) + (0.4296 * 0.000008) - 0.1624);
+    M[3] = ((-0.7036 *  1.910197) + (1.6975 * 0.370950));
+    M[4] = ((-0.7036 * -1.112124) + (1.6975 * 0.629054));
+    M[5] = ((-0.7036 *  0.201908) + (1.6975 * 0.000008) + 0.0061);
+    M[6] = (( 0.0030 *  1.910197) + (0.0136 * 0.370950));
+    M[7] = (( 0.0030 * -1.112124) + (0.0136 * 0.629054));
+    M[8] = (( 0.0030 *  0.201908) + (0.0136 * 0.000008) + 0.9834);;
+
+    clr.RGBc[0] = (clr.RGBp[0] * M[0]) + (clr.RGBp[1] * M[1]) + (clr.RGBp[2] * M[2]);
+    clr.RGBc[1] = (clr.RGBp[0] * M[3]) + (clr.RGBp[1] * M[4]) + (clr.RGBp[2] * M[5]);
+    clr.RGBc[2] = (clr.RGBp[0] * M[6]) + (clr.RGBp[1] * M[7]) + (clr.RGBp[2] * M[8]);
+    return clr;
+}
+
+
+static
+CAM02COLOR InverseChromaticAdaptation(CAM02COLOR clr,  cmsCIECAM02* pMod)
+{
+    cmsUInt32Number i;
+    for (i = 0; i < 3; i++) {
+        clr.RGB[i] = clr.RGBc[i] /
+            ((pMod->adoptedWhite.XYZ[1] * pMod->D / pMod->adoptedWhite.RGB[i]) + 1.0 - pMod->D);
+    }
+    return clr;
+}
+
+
+static
+CAM02COLOR CAT02toXYZ(CAM02COLOR clr)
+{
+    clr.XYZ[0] = (clr.RGB[0] *  1.096124) + (clr.RGB[1] * -0.278869) + (clr.RGB[2] *  0.182745);
+    clr.XYZ[1] = (clr.RGB[0] *  0.454369) + (clr.RGB[1] *  0.473533) + (clr.RGB[2] *  0.072098);
+    clr.XYZ[2] = (clr.RGB[0] * -0.009628) + (clr.RGB[1] * -0.005698) + (clr.RGB[2] *  1.015326);
+
+    return clr;
+}
+
+
+cmsHANDLE  CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC)
+{
+    cmsCIECAM02* lpMod;
+
+    _cmsAssert(pVC != NULL);
+
+    if((lpMod = (cmsCIECAM02*) _cmsMallocZero(ContextID, sizeof(cmsCIECAM02))) == NULL) {
+        return NULL;
+    }
+
+    lpMod ->ContextID = ContextID;
+
+    lpMod ->adoptedWhite.XYZ[0] = pVC ->whitePoint.X;
+    lpMod ->adoptedWhite.XYZ[1] = pVC ->whitePoint.Y;
+    lpMod ->adoptedWhite.XYZ[2] = pVC ->whitePoint.Z;
+
+    lpMod -> LA       = pVC ->La;
+    lpMod -> Yb       = pVC ->Yb;
+    lpMod -> D        = pVC ->D_value;
+    lpMod -> surround = pVC ->surround;
+
+    switch (lpMod -> surround) {
+
+
+    case CUTSHEET_SURROUND:
+        lpMod->F = 0.8;
+        lpMod->c = 0.41;
+        lpMod->Nc = 0.8;
+        break;
+
+    case DARK_SURROUND:
+        lpMod -> F  = 0.8;
+        lpMod -> c  = 0.525;
+        lpMod -> Nc = 0.8;
+        break;
+
+    case DIM_SURROUND:
+        lpMod -> F  = 0.9;
+        lpMod -> c  = 0.59;
+        lpMod -> Nc = 0.95;
+        break;
+
+    default:
+        // Average surround
+        lpMod -> F  = 1.0;
+        lpMod -> c  = 0.69;
+        lpMod -> Nc = 1.0;
+    }
+
+    lpMod -> n   = compute_n(lpMod);
+    lpMod -> z   = compute_z(lpMod);
+    lpMod -> Nbb = computeNbb(lpMod);
+    lpMod -> FL  = computeFL(lpMod);
+
+    if (lpMod -> D == D_CALCULATE) {
+        lpMod -> D   = computeD(lpMod);
+    }
+
+    lpMod -> Ncb = lpMod -> Nbb;
+
+    lpMod -> adoptedWhite = XYZtoCAT02(lpMod -> adoptedWhite);
+    lpMod -> adoptedWhite = ChromaticAdaptation(lpMod -> adoptedWhite, lpMod);
+    lpMod -> adoptedWhite = CAT02toHPE(lpMod -> adoptedWhite);
+    lpMod -> adoptedWhite = NonlinearCompression(lpMod -> adoptedWhite, lpMod);
+
+    return (cmsHANDLE) lpMod;
+
+}
+
+void CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel)
+{
+    cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;
+
+    if (lpMod) _cmsFree(lpMod ->ContextID, lpMod);
+}
+
+
+void CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut)
+{
+    CAM02COLOR clr;
+    cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;
+  
+    _cmsAssert(lpMod != NULL);
+    _cmsAssert(pIn != NULL);
+    _cmsAssert(pOut != NULL);
+
+    memset(&clr, 0, sizeof(clr));
+
+    clr.XYZ[0] = pIn ->X;
+    clr.XYZ[1] = pIn ->Y;
+    clr.XYZ[2] = pIn ->Z;
+
+    clr = XYZtoCAT02(clr);
+    clr = ChromaticAdaptation(clr, lpMod);
+    clr = CAT02toHPE(clr);
+    clr = NonlinearCompression(clr, lpMod);
+    clr = ComputeCorrelates(clr, lpMod);
+
+    pOut ->J = clr.J;
+    pOut ->C = clr.C;
+    pOut ->h = clr.h;
+}
+
+void CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ* pOut)
+{
+    CAM02COLOR clr;
+    cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;
+    
+    _cmsAssert(lpMod != NULL);
+    _cmsAssert(pIn != NULL);
+    _cmsAssert(pOut != NULL);
+
+    memset(&clr, 0, sizeof(clr));
+
+    clr.J = pIn -> J;
+    clr.C = pIn -> C;
+    clr.h = pIn -> h;
+
+    clr = InverseCorrelates(clr, lpMod);
+    clr = InverseNonlinearity(clr, lpMod);
+    clr = HPEtoCAT02(clr);
+    clr = InverseChromaticAdaptation(clr, lpMod);
+    clr = CAT02toXYZ(clr);
+
+    pOut ->X = clr.XYZ[0];
+    pOut ->Y = clr.XYZ[1];
+    pOut ->Z = clr.XYZ[2];
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscgats.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscgats.c
new file mode 100644
index 0000000..9017435
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscgats.c
@@ -0,0 +1,2775 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// IT8.7 / CGATS.17-200x handling -----------------------------------------------------------------------------
+
+
+#define MAXID        128     // Max length of identifier
+#define MAXSTR      1024     // Max length of string
+#define MAXTABLES    255     // Max Number of tables in a single stream
+#define MAXINCLUDE    20     // Max number of nested includes
+
+#define DEFAULT_DBL_FORMAT  "%.10g" // Double formatting
+
+#ifdef CMS_IS_WINDOWS_
+//sunliang.liu modified 2010426 for wince error
+#	ifndef _WIN32_WCE
+#		include <io.h>
+#	endif
+#    define DIR_CHAR    '\\'
+#else
+#    define DIR_CHAR    '/'
+#endif
+
+
+// Symbols
+typedef enum {
+
+        SNONE,
+        SINUM,      // Integer
+        SDNUM,      // Real
+        SIDENT,     // Identifier
+        SSTRING,    // string
+        SCOMMENT,   // comment
+        SEOLN,      // End of line
+        SEOF,       // End of stream
+        SSYNERROR,  // Syntax error found on stream
+
+        // Keywords
+
+        SBEGIN_DATA,
+        SBEGIN_DATA_FORMAT,
+        SEND_DATA,
+        SEND_DATA_FORMAT,
+        SKEYWORD,
+        SDATA_FORMAT_ID,
+        SINCLUDE
+
+    } SYMBOL;
+
+
+// How to write the value
+typedef enum {
+
+        WRITE_UNCOOKED,
+        WRITE_STRINGIFY,
+        WRITE_HEXADECIMAL,
+        WRITE_BINARY,
+        WRITE_PAIR
+
+    } WRITEMODE;
+
+// Linked list of variable names
+typedef struct _KeyVal {
+
+        struct _KeyVal*  Next;
+        char*            Keyword;       // Name of variable
+        struct _KeyVal*  NextSubkey;    // If key is a dictionary, points to the next item
+        char*            Subkey;        // If key is a dictionary, points to the subkey name
+        char*            Value;         // Points to value
+        WRITEMODE        WriteAs;       // How to write the value
+
+   } KEYVALUE;
+
+
+// Linked list of memory chunks (Memory sink)
+typedef struct _OwnedMem {
+
+        struct _OwnedMem* Next;
+        void *            Ptr;          // Point to value
+
+   } OWNEDMEM;
+
+// Suballocator
+typedef struct _SubAllocator {
+
+         cmsUInt8Number* Block;
+         cmsUInt32Number BlockSize;
+         cmsUInt32Number Used;
+
+    } SUBALLOCATOR;
+
+// Table. Each individual table can hold properties and rows & cols
+typedef struct _Table {
+
+        char SheetType[MAXSTR];               // The first row of the IT8 (the type)
+
+        int            nSamples, nPatches;    // Cols, Rows
+        int            SampleID;              // Pos of ID
+
+        KEYVALUE*      HeaderList;            // The properties
+
+        char**         DataFormat;            // The binary stream descriptor
+        char**         Data;                  // The binary stream
+
+    } TABLE;
+
+// File stream being parsed
+typedef struct _FileContext {
+        char           FileName[cmsMAX_PATH];    // File name if being readed from file
+        FILE*          Stream;                   // File stream or NULL if holded in memory
+    } FILECTX;
+
+// This struct hold all information about an open IT8 handler.
+typedef struct {
+
+
+        cmsUInt32Number  TablesCount;                     // How many tables in this stream
+        cmsUInt32Number  nTable;                          // The actual table
+
+        TABLE Tab[MAXTABLES];
+
+        // Memory management
+        OWNEDMEM*      MemorySink;            // The storage backend
+        SUBALLOCATOR   Allocator;             // String suballocator -- just to keep it fast
+
+        // Parser state machine
+        SYMBOL         sy;                    // Current symbol
+        int            ch;                    // Current character
+
+        int            inum;                  // integer value
+        cmsFloat64Number         dnum;                  // real value
+        char           id[MAXID];             // identifier
+        char           str[MAXSTR];           // string
+
+        // Allowed keywords & datasets. They have visibility on whole stream
+        KEYVALUE*     ValidKeywords;
+        KEYVALUE*     ValidSampleID;
+
+        char*          Source;                // Points to loc. being parsed
+        int            lineno;                // line counter for error reporting
+
+        FILECTX*       FileStack[MAXINCLUDE]; // Stack of files being parsed
+        int            IncludeSP;             // Include Stack Pointer
+
+        char*          MemoryBlock;           // The stream if holded in memory
+
+        char           DoubleFormatter[MAXID];// Printf-like 'cmsFloat64Number' formatter
+
+        cmsContext    ContextID;              // The threading context
+
+   } cmsIT8;
+
+
+// The stream for save operations
+typedef struct {
+
+        FILE* stream;   // For save-to-file behaviour
+
+        cmsUInt8Number* Base;
+        cmsUInt8Number* Ptr;        // For save-to-mem behaviour
+        cmsUInt32Number Used;
+        cmsUInt32Number Max;
+
+    } SAVESTREAM;
+
+
+// ------------------------------------------------------ cmsIT8 parsing routines
+
+
+// A keyword
+typedef struct {
+
+        const char *id;
+        SYMBOL sy;
+
+   } KEYWORD;
+
+// The keyword->symbol translation table. Sorting is required.
+static const KEYWORD TabKeys[] = {
+
+        {"$INCLUDE",               SINCLUDE},   // This is an extension!
+        {".INCLUDE",               SINCLUDE},   // This is an extension!
+
+        {"BEGIN_DATA",             SBEGIN_DATA },
+        {"BEGIN_DATA_FORMAT",      SBEGIN_DATA_FORMAT },
+        {"DATA_FORMAT_IDENTIFIER", SDATA_FORMAT_ID},
+        {"END_DATA",               SEND_DATA},
+        {"END_DATA_FORMAT",        SEND_DATA_FORMAT},
+        {"KEYWORD",                SKEYWORD}
+        };
+
+#define NUMKEYS (sizeof(TabKeys)/sizeof(KEYWORD))
+
+// Predefined properties
+
+// A property
+typedef struct {
+        const char *id;    // The identifier
+        WRITEMODE as;      // How is supposed to be written
+    } PROPERTY;
+
+static PROPERTY PredefinedProperties[] = {
+
+        {"NUMBER_OF_FIELDS", WRITE_UNCOOKED},    // Required - NUMBER OF FIELDS
+        {"NUMBER_OF_SETS",   WRITE_UNCOOKED},    // Required - NUMBER OF SETS
+        {"ORIGINATOR",       WRITE_STRINGIFY},   // Required - Identifies the specific system, organization or individual that created the data file.
+        {"FILE_DESCRIPTOR",  WRITE_STRINGIFY},   // Required - Describes the purpose or contents of the data file.
+        {"CREATED",          WRITE_STRINGIFY},   // Required - Indicates date of creation of the data file.
+        {"DESCRIPTOR",       WRITE_STRINGIFY},   // Required  - Describes the purpose or contents of the data file.
+        {"DIFFUSE_GEOMETRY", WRITE_STRINGIFY},   // The diffuse geometry used. Allowed values are "sphere" or "opal".
+        {"MANUFACTURER",     WRITE_STRINGIFY},
+        {"MANUFACTURE",      WRITE_STRINGIFY},   // Some broken Fuji targets does store this value
+        {"PROD_DATE",        WRITE_STRINGIFY},   // Identifies year and month of production of the target in the form yyyy:mm.
+        {"SERIAL",           WRITE_STRINGIFY},   // Uniquely identifies individual physical target.
+
+        {"MATERIAL",         WRITE_STRINGIFY},   // Identifies the material on which the target was produced using a code
+                               // uniquely identifying th e material. This is intend ed to be used for IT8.7
+                               // physical targets only (i.e . IT8.7/1 a nd IT8.7/2).
+
+        {"INSTRUMENTATION",  WRITE_STRINGIFY},   // Used to report the specific instrumentation used (manufacturer and
+                               // model number) to generate the data reported. This data will often
+                               // provide more information about the particular data collected than an
+                               // extensive list of specific details. This is particularly important for
+                               // spectral data or data derived from spectrophotometry.
+
+        {"MEASUREMENT_SOURCE", WRITE_STRINGIFY}, // Illumination used for spectral measurements. This data helps provide
+                               // a guide to the potential for issues of paper fluorescence, etc.
+
+        {"PRINT_CONDITIONS", WRITE_STRINGIFY},   // Used to define the characteristics of the printed sheet being reported.
+                               // Where standard conditions have been defined (e.g., SWOP at nominal)
+                               // named conditions may suffice. Otherwise, detailed information is
+                               // needed.
+
+        {"SAMPLE_BACKING",   WRITE_STRINGIFY},   // Identifies the backing material used behind the sample during
+                               // measurement. Allowed values are “black? “white? or {"na".
+
+        {"CHISQ_DOF",        WRITE_STRINGIFY},   // Degrees of freedom associated with the Chi squared statistic
+
+       // below properties are new in recent specs:
+
+        {"MEASUREMENT_GEOMETRY", WRITE_STRINGIFY}, // The type of measurement, either reflection or transmission, should be indicated
+                               // along with details of the geometry and the aperture size and shape. For example,
+                               // for transmission measurements it is important to identify 0/diffuse, diffuse/0,
+                               // opal or integrating sphere, etc. For reflection it is important to identify 0/45,
+                               // 45/0, sphere (specular included or excluded), etc.
+
+       {"FILTER",            WRITE_STRINGIFY},   // Identifies the use of physical filter(s) during measurement. Typically used to
+                               // denote the use of filters such as none, D65, Red, Green or Blue.
+
+       {"POLARIZATION",      WRITE_STRINGIFY},   // Identifies the use of a physical polarization filter during measurement. Allowed
+                               // values are {"yes? “white? “none?or “na?
+
+       {"WEIGHTING_FUNCTION", WRITE_PAIR},   // Indicates such functions as: the CIE standard observer functions used in the
+                               // calculation of various data parameters (2 degree and 10 degree), CIE standard
+                               // illuminant functions used in the calculation of various data parameters (e.g., D50,
+                               // D65, etc.), density status response, etc. If used there shall be at least one
+                               // name-value pair following the WEIGHTING_FUNCTION tag/keyword. The first attribute
+                               // in the set shall be {"name" and shall identify the particular parameter used.
+                               // The second shall be {"value" and shall provide the value associated with that name.
+                               // For ASCII data, a string containing the Name and Value attribute pairs shall follow
+                               // the weighting function keyword. A semi-colon separates attribute pairs from each
+                               // other and within the attribute the name and value are separated by a comma.
+
+       {"COMPUTATIONAL_PARAMETER", WRITE_PAIR}, // Parameter that is used in computing a value from measured data. Name is the name
+                               // of the calculation, parameter is the name of the parameter used in the calculation
+                               // and value is the value of the parameter.
+
+       {"TARGET_TYPE",        WRITE_STRINGIFY},  // The type of target being measured, e.g. IT8.7/1, IT8.7/3, user defined, etc.
+
+       {"COLORANT",           WRITE_STRINGIFY},  // Identifies the colorant(s) used in creating the target.
+
+       {"TABLE_DESCRIPTOR",   WRITE_STRINGIFY},  // Describes the purpose or contents of a data table.
+
+       {"TABLE_NAME",         WRITE_STRINGIFY}   // Provides a short name for a data table.
+};
+
+#define NUMPREDEFINEDPROPS (sizeof(PredefinedProperties)/sizeof(PROPERTY))
+
+
+// Predefined sample types on dataset
+static const char* PredefinedSampleID[] = {
+        "SAMPLE_ID",      // Identifies sample that data represents
+        "STRING",         // Identifies label, or other non-machine readable value.
+                          // Value must begin and end with a " symbol
+
+        "CMYK_C",         // Cyan component of CMYK data expressed as a percentage
+        "CMYK_M",         // Magenta component of CMYK data expressed as a percentage
+        "CMYK_Y",         // Yellow component of CMYK data expressed as a percentage
+        "CMYK_K",         // Black component of CMYK data expressed as a percentage
+        "D_RED",          // Red filter density
+        "D_GREEN",        // Green filter density
+        "D_BLUE",         // Blue filter density
+        "D_VIS",          // Visual filter density
+        "D_MAJOR_FILTER", // Major filter d ensity
+        "RGB_R",          // Red component of RGB data
+        "RGB_G",          // Green component of RGB data
+        "RGB_B",          // Blue com ponent of RGB data
+        "SPECTRAL_NM",    // Wavelength of measurement expressed in nanometers
+        "SPECTRAL_PCT",   // Percentage reflectance/transmittance
+        "SPECTRAL_DEC",   // Reflectance/transmittance
+        "XYZ_X",          // X component of tristimulus data
+        "XYZ_Y",          // Y component of tristimulus data
+        "XYZ_Z",          // Z component of tristimulus data
+        "XYY_X"           // x component of chromaticity data
+        "XYY_Y",          // y component of chromaticity data
+        "XYY_CAPY",       // Y component of tristimulus data
+        "LAB_L",          // L* component of Lab data
+        "LAB_A",          // a* component of Lab data
+        "LAB_B",          // b* component of Lab data
+        "LAB_C",          // C*ab component of Lab data
+        "LAB_H",          // hab component of Lab data
+        "LAB_DE",         // CIE dE
+        "LAB_DE_94",      // CIE dE using CIE 94
+        "LAB_DE_CMC",     // dE using CMC
+        "LAB_DE_2000",    // CIE dE using CIE DE 2000
+        "MEAN_DE",        // Mean Delta E (LAB_DE) of samples compared to batch average
+                          // (Used for data files for ANSI IT8.7/1 and IT8.7/2 targets)
+        "STDEV_X",        // Standard deviation of X (tristimulus data)
+        "STDEV_Y",        // Standard deviation of Y (tristimulus data)
+        "STDEV_Z",        // Standard deviation of Z (tristimulus data)
+        "STDEV_L",        // Standard deviation of L*
+        "STDEV_A",        // Standard deviation of a*
+        "STDEV_B",        // Standard deviation of b*
+        "STDEV_DE",       // Standard deviation of CIE dE
+        "CHI_SQD_PAR"};   // The average of the standard deviations of L*, a* and b*. It is
+                          // used to derive an estimate of the chi-squared parameter which is
+                          // recommended as the predictor of the variability of dE
+
+#define NUMPREDEFINEDSAMPLEID (sizeof(PredefinedSampleID)/sizeof(char *))
+
+//Forward declaration of some internal functions
+static void* AllocChunk(cmsIT8* it8, cmsUInt32Number size);
+
+// Checks whatever c is a separator
+static
+cmsBool isseparator(int c)
+{
+    return (c == ' ') || (c == '\t') ; 
+}
+
+// Checks whatever c is a valid identifier char
+static
+cmsBool ismiddle(int c)
+{
+   return (!isseparator(c) && (c != '#') && (c !='\"') && (c != '\'') && (c > 32) && (c < 127));
+}
+
+// Checks whatsever c is a valid identifier middle char.
+static
+cmsBool isidchar(int c)
+{
+   return isalnum(c) || ismiddle(c);
+}
+
+// Checks whatsever c is a valid identifier first char.
+static
+cmsBool isfirstidchar(int c)
+{
+     return !isdigit(c) && ismiddle(c);
+}
+
+// Guess whether the supplied path looks like an absolute path
+static
+cmsBool isabsolutepath(const char *path)
+{
+    char ThreeChars[4];
+
+    if(path == NULL)
+        return FALSE;
+    if (path[0] == 0)
+        return FALSE;
+
+    strncpy(ThreeChars, path, 3);
+    ThreeChars[3] = 0;
+
+    if(ThreeChars[0] == DIR_CHAR)
+        return TRUE;
+
+#ifdef  CMS_IS_WINDOWS_
+    if (isalpha((int) ThreeChars[0]) && ThreeChars[1] == ':')
+        return TRUE;
+#endif
+    return FALSE;
+}
+
+
+// Makes a file path based on a given reference path
+// NOTE: this function doesn't check if the path exists or even if it's legal
+static
+cmsBool BuildAbsolutePath(const char *relPath, const char *basePath, char *buffer, cmsUInt32Number MaxLen)
+{
+    char *tail;
+    cmsUInt32Number len;
+
+    // Already absolute?
+    if (isabsolutepath(relPath)) {
+
+        strncpy(buffer, relPath, MaxLen);
+        buffer[MaxLen-1] = 0;
+        return TRUE;
+    }
+
+    // No, search for last
+    strncpy(buffer, basePath, MaxLen);
+    buffer[MaxLen-1] = 0;
+
+    tail = strrchr(buffer, DIR_CHAR);
+    if (tail == NULL) return FALSE;    // Is not absolute and has no separators??
+
+    len = (cmsUInt32Number) (tail - buffer);
+    if (len >= MaxLen) return FALSE;
+
+    // No need to assure zero terminator over here
+    strncpy(tail + 1, relPath, MaxLen - len);
+
+    return TRUE;
+}
+
+
+// Make sure no exploit is being even tried
+static
+const char* NoMeta(const char* str)
+{
+    if (strchr(str, '%') != NULL)
+        return "**** CORRUPTED FORMAT STRING ***";
+
+    return str;
+}
+
+// Syntax error
+static
+cmsBool SynError(cmsIT8* it8, const char *Txt, ...)
+{
+    char Buffer[256], ErrMsg[1024];
+    va_list args;
+
+    va_start(args, Txt);
+    vsnprintf(Buffer, 255, Txt, args);
+    Buffer[255] = 0;
+    va_end(args);
+
+    snprintf(ErrMsg, 1023, "%s: Line %d, %s", it8->FileStack[it8 ->IncludeSP]->FileName, it8->lineno, Buffer);
+    ErrMsg[1023] = 0;
+    it8->sy = SSYNERROR;
+    cmsSignalError(it8 ->ContextID, cmsERROR_CORRUPTION_DETECTED, "%s", ErrMsg);
+    return FALSE;
+}
+
+// Check if current symbol is same as specified. issue an error else.
+static
+cmsBool Check(cmsIT8* it8, SYMBOL sy, const char* Err)
+{
+        if (it8 -> sy != sy)
+                return SynError(it8, NoMeta(Err));
+        return TRUE;
+}
+
+// Read Next character from stream
+static
+void NextCh(cmsIT8* it8)
+{
+    if (it8 -> FileStack[it8 ->IncludeSP]->Stream) {
+
+        it8 ->ch = fgetc(it8 ->FileStack[it8 ->IncludeSP]->Stream);
+
+        if (feof(it8 -> FileStack[it8 ->IncludeSP]->Stream))  {
+
+            if (it8 ->IncludeSP > 0) {
+
+                fclose(it8 ->FileStack[it8->IncludeSP--]->Stream);
+                it8 -> ch = ' ';                            // Whitespace to be ignored
+
+            } else
+                it8 ->ch = 0;   // EOF
+        }
+    }
+    else {
+        it8->ch = *it8->Source;
+        if (it8->ch) it8->Source++;
+    }
+}
+
+
+// Try to see if current identifier is a keyword, if so return the referred symbol
+static
+SYMBOL BinSrchKey(const char *id)
+{
+    int l = 1;
+    int r = NUMKEYS;
+    int x, res;
+
+    while (r >= l)
+    {
+        x = (l+r)/2;
+        res = cmsstrcasecmp(id, TabKeys[x-1].id);
+        if (res == 0) return TabKeys[x-1].sy;
+        if (res < 0) r = x - 1;
+        else l = x + 1;
+    }
+
+    return SNONE;
+}
+
+
+// 10 ^n
+static
+cmsFloat64Number xpow10(int n)
+{
+    return pow(10, (cmsFloat64Number) n);
+}
+
+
+//  Reads a Real number, tries to follow from integer number
+static
+void ReadReal(cmsIT8* it8, int inum)
+{
+    it8->dnum = (cmsFloat64Number) inum;
+
+    while (isdigit(it8->ch)) {
+
+        it8->dnum = it8->dnum * 10.0 + (it8->ch - '0');
+        NextCh(it8);
+    }
+
+    if (it8->ch == '.') {        // Decimal point
+
+        cmsFloat64Number frac = 0.0;      // fraction
+        int prec = 0;                     // precision
+
+        NextCh(it8);               // Eats dec. point
+
+        while (isdigit(it8->ch)) {
+
+            frac = frac * 10.0 + (it8->ch - '0');
+            prec++;
+            NextCh(it8);
+        }
+
+        it8->dnum = it8->dnum + (frac / xpow10(prec));
+    }
+
+    // Exponent, example 34.00E+20
+    if (toupper(it8->ch) == 'E') {
+
+        int e;
+        int sgn;
+
+        NextCh(it8); sgn = 1;
+
+        if (it8->ch == '-') {
+
+            sgn = -1; NextCh(it8);
+        }
+        else
+            if (it8->ch == '+') {
+
+                sgn = +1;
+                NextCh(it8);
+            }
+
+            e = 0;
+            while (isdigit(it8->ch)) {
+
+                if ((cmsFloat64Number) e * 10L < INT_MAX)
+                    e = e * 10 + (it8->ch - '0');
+
+                NextCh(it8);
+            }
+
+            e = sgn*e;
+            it8 -> dnum = it8 -> dnum * xpow10(e);
+    }
+}
+
+// Parses a float number
+// This can not call directly atof because it uses locale dependant
+// parsing, while CCMX files always use . as decimal separator
+static
+cmsFloat64Number ParseFloatNumber(const char *Buffer)
+{
+    cmsFloat64Number dnum = 0.0;
+    int sign = 1;
+
+    // keep safe
+    if (Buffer == NULL) return 0.0;
+
+    if (*Buffer == '-' || *Buffer == '+') {
+
+         sign = (*Buffer == '-') ? -1 : 1;
+         Buffer++;
+    }
+
+
+    while (*Buffer && isdigit((int) *Buffer)) {
+
+        dnum = dnum * 10.0 + (*Buffer - '0');
+        if (*Buffer) Buffer++;
+    }
+
+    if (*Buffer == '.') {
+
+        cmsFloat64Number frac = 0.0;      // fraction
+        int prec = 0;                     // precission
+
+        if (*Buffer) Buffer++;
+
+        while (*Buffer && isdigit((int) *Buffer)) {
+
+            frac = frac * 10.0 + (*Buffer - '0');
+            prec++;
+            if (*Buffer) Buffer++;
+        }
+
+        dnum = dnum + (frac / xpow10(prec));
+    }
+
+    // Exponent, example 34.00E+20
+    if (*Buffer && toupper(*Buffer) == 'E') {
+
+        int e;
+        int sgn;
+
+        if (*Buffer) Buffer++;
+        sgn = 1;
+
+        if (*Buffer == '-') {
+
+            sgn = -1;
+            if (*Buffer) Buffer++;
+        }
+        else
+            if (*Buffer == '+') {
+
+                sgn = +1;
+                if (*Buffer) Buffer++;
+            }
+
+            e = 0;
+            while (*Buffer && isdigit((int) *Buffer)) {
+
+                if ((cmsFloat64Number) e * 10L < INT_MAX)
+                    e = e * 10 + (*Buffer - '0');
+
+                if (*Buffer) Buffer++;
+            }
+
+            e = sgn*e;
+            dnum = dnum * xpow10(e);
+    }
+
+    return sign * dnum;
+}
+
+
+// Reads next symbol
+static
+void InSymbol(cmsIT8* it8)
+{
+    register char *idptr;
+    register int k;
+    SYMBOL key;
+    int sng;
+    
+    do {
+
+        while (isseparator(it8->ch))
+            NextCh(it8);
+
+        if (isfirstidchar(it8->ch)) {          // Identifier
+
+            k = 0;
+            idptr = it8->id;
+
+            do {
+
+                if (++k < MAXID) *idptr++ = (char) it8->ch;
+
+                NextCh(it8);
+
+            } while (isidchar(it8->ch));
+
+            *idptr = '\0';
+
+
+            key = BinSrchKey(it8->id);
+            if (key == SNONE) it8->sy = SIDENT;
+            else it8->sy = key;
+
+        }
+        else                         // Is a number?
+            if (isdigit(it8->ch) || it8->ch == '.' || it8->ch == '-' || it8->ch == '+')
+            {
+                int sign = 1;
+
+                if (it8->ch == '-') {
+                    sign = -1;
+                    NextCh(it8);
+                }
+
+                it8->inum = 0;
+                it8->sy   = SINUM;
+
+                if (it8->ch == '0') {          // 0xnnnn (Hexa) or 0bnnnn (Binary)
+
+                    NextCh(it8);
+                    if (toupper(it8->ch) == 'X') {
+
+                        int j;
+
+                        NextCh(it8);
+                        while (isxdigit(it8->ch))
+                        {
+                            it8->ch = toupper(it8->ch);
+                            if (it8->ch >= 'A' && it8->ch <= 'F')  j = it8->ch -'A'+10;
+                            else j = it8->ch - '0';
+
+                            if ((long) it8->inum * 16L > (long) INT_MAX)
+                            {
+                                SynError(it8, "Invalid hexadecimal number");
+                                return;
+                            }
+
+                            it8->inum = it8->inum * 16 + j;
+                            NextCh(it8);
+                        }
+                        return;
+                    }
+
+                    if (toupper(it8->ch) == 'B') {  // Binary
+
+                        int j;
+
+                        NextCh(it8);
+                        while (it8->ch == '0' || it8->ch == '1')
+                        {
+                            j = it8->ch - '0';
+
+                            if ((long) it8->inum * 2L > (long) INT_MAX)
+                            {
+                                SynError(it8, "Invalid binary number");
+                                return;
+                            }
+
+                            it8->inum = it8->inum * 2 + j;
+                            NextCh(it8);
+                        }
+                        return;
+                    }
+                }
+
+
+                while (isdigit(it8->ch)) {
+
+                    if ((long) it8->inum * 10L > (long) INT_MAX) {
+                        ReadReal(it8, it8->inum);
+                        it8->sy = SDNUM;
+                        it8->dnum *= sign;
+                        return;
+                    }
+
+                    it8->inum = it8->inum * 10 + (it8->ch - '0');
+                    NextCh(it8);
+                }
+
+                if (it8->ch == '.') {
+
+                    ReadReal(it8, it8->inum);
+                    it8->sy = SDNUM;
+                    it8->dnum *= sign;
+                    return;
+                }
+
+                it8 -> inum *= sign;
+
+                // Special case. Numbers followed by letters are taken as identifiers
+
+                if (isidchar(it8 ->ch)) {
+
+                    if (it8 ->sy == SINUM) {
+
+                        sprintf(it8->id, "%d", it8->inum);
+                    }
+                    else {
+
+                        sprintf(it8->id, it8 ->DoubleFormatter, it8->dnum);
+                    }
+
+                    k = (int) strlen(it8 ->id);
+                    idptr = it8 ->id + k;
+                    do {
+
+                        if (++k < MAXID) *idptr++ = (char) it8->ch;
+
+                        NextCh(it8);
+
+                    } while (isidchar(it8->ch));
+
+                    *idptr = '\0';
+                    it8->sy = SIDENT;
+                }
+                return;
+
+            }
+            else
+                switch ((int) it8->ch) {
+
+        // EOF marker -- ignore it
+        case '\x1a':
+            NextCh(it8);
+            break;
+
+        // Eof stream markers
+        case 0:
+        case -1:
+            it8->sy = SEOF;
+            break;
+
+
+        // Next line
+        case '\r':
+            NextCh(it8);
+            if (it8 ->ch == '\n') 
+                NextCh(it8);
+            it8->sy = SEOLN;
+            it8->lineno++;
+            break;
+
+        case '\n':
+            NextCh(it8);
+            it8->sy = SEOLN;
+            it8->lineno++;
+            break;
+
+        // Comment
+        case '#':
+            NextCh(it8);
+            while (it8->ch && it8->ch != '\n' && it8->ch != '\r')
+                NextCh(it8);
+
+            it8->sy = SCOMMENT;
+            break;
+
+        // String.
+        case '\'':
+        case '\"':
+            idptr = it8->str;
+            sng = it8->ch;
+            k = 0;
+            NextCh(it8);
+
+            while (k < MAXSTR && it8->ch != sng) {
+
+                if (it8->ch == '\n'|| it8->ch == '\r') k = MAXSTR+1;
+                else {
+                    *idptr++ = (char) it8->ch;
+                    NextCh(it8);
+                    k++;
+                }
+            }
+
+            it8->sy = SSTRING;
+            *idptr = '\0';
+            NextCh(it8);
+            break;
+
+
+        default:
+            SynError(it8, "Unrecognized character: 0x%x", it8 ->ch);
+            return;
+            }
+
+    } while (it8->sy == SCOMMENT);
+
+    // Handle the include special token
+
+    if (it8 -> sy == SINCLUDE) {
+
+                FILECTX* FileNest;
+
+                if(it8 -> IncludeSP >= (MAXINCLUDE-1)) {
+
+                    SynError(it8, "Too many recursion levels");
+                    return;
+                }
+
+                InSymbol(it8);
+                if (!Check(it8, SSTRING, "Filename expected")) return;
+
+                FileNest = it8 -> FileStack[it8 -> IncludeSP + 1];
+                if(FileNest == NULL) {
+
+                    FileNest = it8 ->FileStack[it8 -> IncludeSP + 1] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX));
+                    //if(FileNest == NULL)
+                    //  TODO: how to manage out-of-memory conditions?
+                }
+
+                if (BuildAbsolutePath(it8->str,
+                                      it8->FileStack[it8->IncludeSP]->FileName,
+                                      FileNest->FileName, cmsMAX_PATH-1) == FALSE) {
+                    SynError(it8, "File path too long");
+                    return;
+                }
+
+                FileNest->Stream = fopen(FileNest->FileName, "rt");
+                if (FileNest->Stream == NULL) {
+
+                        SynError(it8, "File %s not found", FileNest->FileName);
+                        return;
+                }
+                it8->IncludeSP++;
+
+                it8 ->ch = ' ';
+                InSymbol(it8);
+    }
+
+}
+
+// Checks end of line separator
+static
+cmsBool CheckEOLN(cmsIT8* it8)
+{
+        if (!Check(it8, SEOLN, "Expected separator")) return FALSE;
+        while (it8 -> sy == SEOLN)
+                        InSymbol(it8);
+        return TRUE;
+
+}
+
+// Skip a symbol
+
+static
+void Skip(cmsIT8* it8, SYMBOL sy)
+{
+        if (it8->sy == sy && it8->sy != SEOF)
+                        InSymbol(it8);
+}
+
+
+// Skip multiple EOLN
+static
+void SkipEOLN(cmsIT8* it8)
+{
+    while (it8->sy == SEOLN) {
+             InSymbol(it8);
+    }
+}
+
+
+// Returns a string holding current value
+static
+cmsBool GetVal(cmsIT8* it8, char* Buffer, cmsUInt32Number max, const char* ErrorTitle)
+{
+    switch (it8->sy) {
+
+    case SEOLN:   // Empty value
+                  Buffer[0]=0;
+                  break;
+    case SIDENT:  strncpy(Buffer, it8->id, max);
+                  Buffer[max-1]=0;
+                  break;
+    case SINUM:   snprintf(Buffer, max, "%d", it8 -> inum); break;
+    case SDNUM:   snprintf(Buffer, max, it8->DoubleFormatter, it8 -> dnum); break;
+    case SSTRING: strncpy(Buffer, it8->str, max);
+                  Buffer[max-1] = 0;
+                  break;
+
+
+    default:
+         return SynError(it8, "%s", ErrorTitle);
+    }
+
+    Buffer[max] = 0;
+    return TRUE;
+}
+
+// ---------------------------------------------------------- Table
+
+static
+TABLE* GetTable(cmsIT8* it8)
+{
+   if ((it8 -> nTable >= it8 ->TablesCount)) {
+
+           SynError(it8, "Table %d out of sequence", it8 -> nTable);
+           return it8 -> Tab;
+   }
+
+   return it8 ->Tab + it8 ->nTable;
+}
+
+// ---------------------------------------------------------- Memory management
+
+
+// Frees an allocator and owned memory
+void CMSEXPORT cmsIT8Free(cmsHANDLE hIT8)
+{
+   cmsIT8* it8 = (cmsIT8*) hIT8;
+
+    if (it8 == NULL)
+        return;
+
+    if (it8->MemorySink) {
+
+        OWNEDMEM* p;
+        OWNEDMEM* n;
+
+        for (p = it8->MemorySink; p != NULL; p = n) {
+
+            n = p->Next;
+            if (p->Ptr) _cmsFree(it8 ->ContextID, p->Ptr);
+            _cmsFree(it8 ->ContextID, p);
+        }
+    }
+
+    if (it8->MemoryBlock)
+        _cmsFree(it8 ->ContextID, it8->MemoryBlock);
+
+    _cmsFree(it8 ->ContextID, it8);
+}
+
+
+// Allocates a chunk of data, keep linked list
+static
+void* AllocBigBlock(cmsIT8* it8, cmsUInt32Number size)
+{
+    OWNEDMEM* ptr1;
+    void* ptr = _cmsMallocZero(it8->ContextID, size);
+
+    if (ptr != NULL) {
+
+        ptr1 = (OWNEDMEM*) _cmsMallocZero(it8 ->ContextID, sizeof(OWNEDMEM));
+
+        if (ptr1 == NULL) {
+
+            _cmsFree(it8 ->ContextID, ptr);
+            return NULL;
+        }
+
+        ptr1-> Ptr        = ptr;
+        ptr1-> Next       = it8 -> MemorySink;
+        it8 -> MemorySink = ptr1;
+    }
+
+    return ptr;
+}
+
+
+// Suballocator.
+static
+void* AllocChunk(cmsIT8* it8, cmsUInt32Number size)
+{
+    cmsUInt32Number Free = it8 ->Allocator.BlockSize - it8 ->Allocator.Used;
+    cmsUInt8Number* ptr;
+
+    size = _cmsALIGNMEM(size);
+
+    if (size > Free) {
+
+        if (it8 -> Allocator.BlockSize == 0)
+
+                it8 -> Allocator.BlockSize = 20*1024;
+        else
+                it8 ->Allocator.BlockSize *= 2;
+
+        if (it8 ->Allocator.BlockSize < size)
+                it8 ->Allocator.BlockSize = size;
+
+        it8 ->Allocator.Used = 0;
+        it8 ->Allocator.Block = (cmsUInt8Number*)  AllocBigBlock(it8, it8 ->Allocator.BlockSize);
+    }
+
+    ptr = it8 ->Allocator.Block + it8 ->Allocator.Used;
+    it8 ->Allocator.Used += size;
+
+    return (void*) ptr;
+
+}
+
+
+// Allocates a string
+static
+char *AllocString(cmsIT8* it8, const char* str)
+{
+    cmsUInt32Number Size = (cmsUInt32Number) strlen(str)+1;
+    char *ptr;
+
+
+    ptr = (char *) AllocChunk(it8, Size);
+    if (ptr) strncpy (ptr, str, Size-1);
+
+    return ptr;
+}
+
+// Searches through linked list
+
+static
+cmsBool IsAvailableOnList(KEYVALUE* p, const char* Key, const char* Subkey, KEYVALUE** LastPtr)
+{
+    if (LastPtr) *LastPtr = p;
+
+    for (;  p != NULL; p = p->Next) {
+
+        if (LastPtr) *LastPtr = p;
+
+        if (*Key != '#') { // Comments are ignored
+
+            if (cmsstrcasecmp(Key, p->Keyword) == 0)
+                break;
+        }
+    }
+
+    if (p == NULL)
+        return FALSE;
+
+    if (Subkey == 0)
+        return TRUE;
+
+    for (; p != NULL; p = p->NextSubkey) {
+
+        if (p ->Subkey == NULL) continue;
+
+        if (LastPtr) *LastPtr = p;
+
+        if (cmsstrcasecmp(Subkey, p->Subkey) == 0)
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+
+
+// Add a property into a linked list
+static
+KEYVALUE* AddToList(cmsIT8* it8, KEYVALUE** Head, const char *Key, const char *Subkey, const char* xValue, WRITEMODE WriteAs)
+{
+    KEYVALUE* p;
+    KEYVALUE* last;
+
+
+    // Check if property is already in list
+
+    if (IsAvailableOnList(*Head, Key, Subkey, &p)) {
+
+        // This may work for editing properties
+
+        //     return SynError(it8, "duplicate key <%s>", Key);
+    }
+    else {
+
+        last = p;
+
+        // Allocate the container
+        p = (KEYVALUE*) AllocChunk(it8, sizeof(KEYVALUE));
+        if (p == NULL)
+        {
+            SynError(it8, "AddToList: out of memory");
+            return NULL;
+        }
+
+        // Store name and value
+        p->Keyword = AllocString(it8, Key);
+        p->Subkey = (Subkey == NULL) ? NULL : AllocString(it8, Subkey);
+
+        // Keep the container in our list
+        if (*Head == NULL) {
+            *Head = p;
+        }
+        else
+        {
+            if (Subkey != NULL && last != NULL) {
+
+                last->NextSubkey = p;
+
+                // If Subkey is not null, then last is the last property with the same key,
+                // but not necessarily is the last property in the list, so we need to move
+                // to the actual list end
+                while (last->Next != NULL)
+                         last = last->Next;
+            }
+
+            if (last != NULL) last->Next = p;
+        }
+
+        p->Next    = NULL;
+        p->NextSubkey = NULL;
+    }
+
+    p->WriteAs = WriteAs;
+
+    if (xValue != NULL) {
+
+        p->Value   = AllocString(it8, xValue);
+    }
+    else {
+        p->Value   = NULL;
+    }
+
+    return p;
+}
+
+static
+KEYVALUE* AddAvailableProperty(cmsIT8* it8, const char* Key, WRITEMODE as)
+{
+    return AddToList(it8, &it8->ValidKeywords, Key, NULL, NULL, as);
+}
+
+
+static
+KEYVALUE* AddAvailableSampleID(cmsIT8* it8, const char* Key)
+{
+    return AddToList(it8, &it8->ValidSampleID, Key, NULL, NULL, WRITE_UNCOOKED);
+}
+
+
+static
+void AllocTable(cmsIT8* it8)
+{
+    TABLE* t;
+
+    t = it8 ->Tab + it8 ->TablesCount;
+
+    t->HeaderList = NULL;
+    t->DataFormat = NULL;
+    t->Data       = NULL;
+
+    it8 ->TablesCount++;
+}
+
+
+cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE  IT8, cmsUInt32Number nTable)
+{
+     cmsIT8* it8 = (cmsIT8*) IT8;
+
+     if (nTable >= it8 ->TablesCount) {
+
+         if (nTable == it8 ->TablesCount) {
+
+             AllocTable(it8);
+         }
+         else {
+             SynError(it8, "Table %d is out of sequence", nTable);
+             return -1;
+         }
+     }
+
+     it8 ->nTable = nTable;
+
+     return (cmsInt32Number) nTable;
+}
+
+
+
+// Init an empty container
+cmsHANDLE  CMSEXPORT cmsIT8Alloc(cmsContext ContextID)
+{
+    cmsIT8* it8;
+    cmsUInt32Number i;
+
+    it8 = (cmsIT8*) _cmsMallocZero(ContextID, sizeof(cmsIT8));
+    if (it8 == NULL) return NULL;
+
+    AllocTable(it8);
+
+    it8->MemoryBlock = NULL;
+    it8->MemorySink  = NULL;
+
+    it8 ->nTable = 0;
+
+    it8->ContextID = ContextID;
+    it8->Allocator.Used = 0;
+    it8->Allocator.Block = NULL;
+    it8->Allocator.BlockSize = 0;
+
+    it8->ValidKeywords = NULL;
+    it8->ValidSampleID = NULL;
+
+    it8 -> sy = SNONE;
+    it8 -> ch = ' ';
+    it8 -> Source = NULL;
+    it8 -> inum = 0;
+    it8 -> dnum = 0.0;
+
+    it8->FileStack[0] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX));
+    it8->IncludeSP   = 0;
+    it8 -> lineno = 1;
+
+    strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT);
+    cmsIT8SetSheetType((cmsHANDLE) it8, "CGATS.17");
+
+    // Initialize predefined properties & data
+
+    for (i=0; i < NUMPREDEFINEDPROPS; i++)
+            AddAvailableProperty(it8, PredefinedProperties[i].id, PredefinedProperties[i].as);
+
+    for (i=0; i < NUMPREDEFINEDSAMPLEID; i++)
+            AddAvailableSampleID(it8, PredefinedSampleID[i]);
+
+
+   return (cmsHANDLE) it8;
+}
+
+
+const char* CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8)
+{
+        return GetTable((cmsIT8*) hIT8)->SheetType;
+}
+
+cmsBool CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type)
+{
+        TABLE* t = GetTable((cmsIT8*) hIT8);
+
+        strncpy(t ->SheetType, Type, MAXSTR-1);
+        t ->SheetType[MAXSTR-1] = 0;
+        return TRUE;
+}
+
+cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* Val)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+
+    if (!Val) return FALSE;
+    if (!*Val) return FALSE;
+
+    return AddToList(it8, &GetTable(it8)->HeaderList, "# ", NULL, Val, WRITE_UNCOOKED) != NULL;
+}
+
+// Sets a property
+cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* Key, const char *Val)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+
+    if (!Val) return FALSE;
+    if (!*Val) return FALSE;
+
+    return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Val, WRITE_STRINGIFY) != NULL;
+}
+
+cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    char Buffer[1024];
+
+    sprintf(Buffer, it8->DoubleFormatter, Val);
+
+    return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_UNCOOKED) != NULL;
+}
+
+cmsBool CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    char Buffer[1024];
+
+    sprintf(Buffer, "%u", Val);
+
+    return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_HEXADECIMAL) != NULL;
+}
+
+cmsBool CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+
+    return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Buffer, WRITE_UNCOOKED) != NULL;
+}
+
+cmsBool CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+
+    return AddToList(it8, &GetTable(it8)->HeaderList, Key, SubKey, Buffer, WRITE_PAIR) != NULL;
+}
+
+// Gets a property
+const char* CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* Key)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    KEYVALUE* p;
+
+    if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, NULL, &p))
+    {
+        return p -> Value;
+    }
+    return NULL;
+}
+
+
+cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp)
+{
+    const char *v = cmsIT8GetProperty(hIT8, cProp);
+
+    if (v == NULL) return 0.0;
+
+    return ParseFloatNumber(v);
+}
+
+const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    KEYVALUE* p;
+
+    if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, SubKey, &p)) {
+        return p -> Value;
+    }
+    return NULL;
+}
+
+// ----------------------------------------------------------------- Datasets
+
+
+static
+void AllocateDataFormat(cmsIT8* it8)
+{
+    TABLE* t = GetTable(it8);
+
+    if (t -> DataFormat) return;    // Already allocated
+
+    t -> nSamples  = (int) cmsIT8GetPropertyDbl(it8, "NUMBER_OF_FIELDS");
+
+    if (t -> nSamples <= 0) {
+
+        SynError(it8, "AllocateDataFormat: Unknown NUMBER_OF_FIELDS");
+        t -> nSamples = 10;
+        }
+
+    t -> DataFormat = (char**) AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * sizeof(char *));
+    if (t->DataFormat == NULL) {
+
+        SynError(it8, "AllocateDataFormat: Unable to allocate dataFormat array");
+    }
+
+}
+
+static
+const char *GetDataFormat(cmsIT8* it8, int n)
+{
+    TABLE* t = GetTable(it8);
+
+    if (t->DataFormat)
+        return t->DataFormat[n];
+
+    return NULL;
+}
+
+static
+cmsBool SetDataFormat(cmsIT8* it8, int n, const char *label)
+{
+    TABLE* t = GetTable(it8);
+
+    if (!t->DataFormat)
+        AllocateDataFormat(it8);
+
+    if (n > t -> nSamples) {
+        SynError(it8, "More than NUMBER_OF_FIELDS fields.");
+        return FALSE;
+    }
+
+    if (t->DataFormat) {
+        t->DataFormat[n] = AllocString(it8, label);
+    }
+
+    return TRUE;
+}
+
+
+cmsBool CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE  h, int n, const char *Sample)
+{
+        cmsIT8* it8 = (cmsIT8*) h;
+        return SetDataFormat(it8, n, Sample);
+}
+
+static
+void AllocateDataSet(cmsIT8* it8)
+{
+    TABLE* t = GetTable(it8);
+
+    if (t -> Data) return;    // Already allocated
+
+    t-> nSamples   = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS"));
+    t-> nPatches   = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS"));
+
+    t-> Data = (char**)AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * ((cmsUInt32Number) t->nPatches + 1) *sizeof (char*));
+    if (t->Data == NULL) {
+
+        SynError(it8, "AllocateDataSet: Unable to allocate data array");
+    }
+
+}
+
+static
+char* GetData(cmsIT8* it8, int nSet, int nField)
+{
+    TABLE* t = GetTable(it8);
+    int  nSamples   = t -> nSamples;
+    int  nPatches   = t -> nPatches;
+
+    if (nSet >= nPatches || nField >= nSamples)
+        return NULL;
+
+    if (!t->Data) return NULL;
+    return t->Data [nSet * nSamples + nField];
+}
+
+static
+cmsBool SetData(cmsIT8* it8, int nSet, int nField, const char *Val)
+{
+    TABLE* t = GetTable(it8);
+
+    if (!t->Data)
+        AllocateDataSet(it8);
+
+    if (!t->Data) return FALSE;
+
+    if (nSet > t -> nPatches || nSet < 0) {
+
+            return SynError(it8, "Patch %d out of range, there are %d patches", nSet, t -> nPatches);
+    }
+
+    if (nField > t ->nSamples || nField < 0) {
+            return SynError(it8, "Sample %d out of range, there are %d samples", nField, t ->nSamples);
+
+    }
+
+    t->Data [nSet * t -> nSamples + nField] = AllocString(it8, Val);
+    return TRUE;
+}
+
+
+// --------------------------------------------------------------- File I/O
+
+
+// Writes a string to file
+static
+void WriteStr(SAVESTREAM* f, const char *str)
+{
+    cmsUInt32Number len;
+
+    if (str == NULL)
+        str = " ";
+
+    // Length to write
+    len = (cmsUInt32Number) strlen(str);
+    f ->Used += len;
+
+
+    if (f ->stream) {   // Should I write it to a file?
+
+        if (fwrite(str, 1, len, f->stream) != len) {
+            cmsSignalError(0, cmsERROR_WRITE, "Write to file error in CGATS parser");
+            return;
+        }
+
+    }
+    else {  // Or to a memory block?
+
+        if (f ->Base) {   // Am I just counting the bytes?
+
+            if (f ->Used > f ->Max) {
+
+                 cmsSignalError(0, cmsERROR_WRITE, "Write to memory overflows in CGATS parser");
+                 return;
+            }
+
+            memmove(f ->Ptr, str, len);
+            f->Ptr += len;
+        }
+
+    }
+}
+
+
+// Write formatted
+
+static
+void Writef(SAVESTREAM* f, const char* frm, ...)
+{
+    char Buffer[4096];
+    va_list args;
+
+    va_start(args, frm);
+    vsnprintf(Buffer, 4095, frm, args);
+    Buffer[4095] = 0;
+    WriteStr(f, Buffer);
+    va_end(args);
+
+}
+
+// Writes full header
+static
+void WriteHeader(cmsIT8* it8, SAVESTREAM* fp)
+{
+    KEYVALUE* p;
+    TABLE* t = GetTable(it8);
+
+    // Writes the type
+    WriteStr(fp, t->SheetType);
+    WriteStr(fp, "\n");
+
+    for (p = t->HeaderList; (p != NULL); p = p->Next)
+    {
+        if (*p ->Keyword == '#') {
+
+            char* Pt;
+
+            WriteStr(fp, "#\n# ");
+            for (Pt = p ->Value; *Pt; Pt++) {
+
+
+                Writef(fp, "%c", *Pt);
+
+                if (*Pt == '\n') {
+                    WriteStr(fp, "# ");
+                }
+            }
+
+            WriteStr(fp, "\n#\n");
+            continue;
+        }
+
+
+        if (!IsAvailableOnList(it8-> ValidKeywords, p->Keyword, NULL, NULL)) {
+
+#ifdef CMS_STRICT_CGATS
+            WriteStr(fp, "KEYWORD\t\"");
+            WriteStr(fp, p->Keyword);
+            WriteStr(fp, "\"\n");
+#endif
+
+            AddAvailableProperty(it8, p->Keyword, WRITE_UNCOOKED);
+        }
+
+        WriteStr(fp, p->Keyword);
+        if (p->Value) {
+
+            switch (p ->WriteAs) {
+
+            case WRITE_UNCOOKED:
+                    Writef(fp, "\t%s", p ->Value);
+                    break;
+
+            case WRITE_STRINGIFY:
+                    Writef(fp, "\t\"%s\"", p->Value );
+                    break;
+
+            case WRITE_HEXADECIMAL:
+                    Writef(fp, "\t0x%X", atoi(p ->Value));
+                    break;
+
+            case WRITE_BINARY:
+                    Writef(fp, "\t0x%B", atoi(p ->Value));
+                    break;
+
+            case WRITE_PAIR:
+                    Writef(fp, "\t\"%s,%s\"", p->Subkey, p->Value);
+                    break;
+
+            default: SynError(it8, "Unknown write mode %d", p ->WriteAs);
+                     return;
+            }
+        }
+
+        WriteStr (fp, "\n");
+    }
+
+}
+
+
+// Writes the data format
+static
+void WriteDataFormat(SAVESTREAM* fp, cmsIT8* it8)
+{
+    int i, nSamples;
+    TABLE* t = GetTable(it8);
+
+    if (!t -> DataFormat) return;
+
+       WriteStr(fp, "BEGIN_DATA_FORMAT\n");
+       WriteStr(fp, " ");
+       nSamples = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS"));
+
+       for (i = 0; i < nSamples; i++) {
+
+              WriteStr(fp, t->DataFormat[i]);
+              WriteStr(fp, ((i == (nSamples-1)) ? "\n" : "\t"));
+          }
+
+       WriteStr (fp, "END_DATA_FORMAT\n");
+}
+
+
+// Writes data array
+static
+void WriteData(SAVESTREAM* fp, cmsIT8* it8)
+{
+       int  i, j;
+       TABLE* t = GetTable(it8);
+
+       if (!t->Data) return;
+
+       WriteStr (fp, "BEGIN_DATA\n");
+
+       t->nPatches = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS"));
+
+       for (i = 0; i < t-> nPatches; i++) {
+
+              WriteStr(fp, " ");
+
+              for (j = 0; j < t->nSamples; j++) {
+
+                     char *ptr = t->Data[i*t->nSamples+j];
+
+                     if (ptr == NULL) WriteStr(fp, "\"\"");
+                     else {
+                         // If value contains whitespace, enclose within quote
+
+                         if (strchr(ptr, ' ') != NULL) {
+
+                             WriteStr(fp, "\"");
+                             WriteStr(fp, ptr);
+                             WriteStr(fp, "\"");
+                         }
+                         else
+                            WriteStr(fp, ptr);
+                     }
+
+                     WriteStr(fp, ((j == (t->nSamples-1)) ? "\n" : "\t"));
+              }
+       }
+       WriteStr (fp, "END_DATA\n");
+}
+
+
+
+// Saves whole file
+cmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName)
+{
+    SAVESTREAM sd;
+    cmsUInt32Number i;
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+
+    memset(&sd, 0, sizeof(sd));
+
+    sd.stream = fopen(cFileName, "wt");
+    if (!sd.stream) return FALSE;
+
+    for (i=0; i < it8 ->TablesCount; i++) {
+
+            cmsIT8SetTable(hIT8, i);
+            WriteHeader(it8, &sd);
+            WriteDataFormat(&sd, it8);
+            WriteData(&sd, it8);
+    }
+
+    if (fclose(sd.stream) != 0) return FALSE;
+
+    return TRUE;
+}
+
+
+// Saves to memory
+cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded)
+{
+    SAVESTREAM sd;
+    cmsUInt32Number i;
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+
+    memset(&sd, 0, sizeof(sd));
+
+    sd.stream = NULL;
+    sd.Base   = (cmsUInt8Number*)  MemPtr;
+    sd.Ptr    = sd.Base;
+
+    sd.Used = 0;
+
+    if (sd.Base)
+        sd.Max  = *BytesNeeded;     // Write to memory?
+    else
+        sd.Max  = 0;                // Just counting the needed bytes
+
+    for (i=0; i < it8 ->TablesCount; i++) {
+
+        cmsIT8SetTable(hIT8, i);
+        WriteHeader(it8, &sd);
+        WriteDataFormat(&sd, it8);
+        WriteData(&sd, it8);
+    }
+
+    sd.Used++;  // The \0 at the very end
+
+    if (sd.Base)
+        *sd.Ptr = 0;
+
+    *BytesNeeded = sd.Used;
+
+    return TRUE;
+}
+
+
+// -------------------------------------------------------------- Higer level parsing
+
+static
+cmsBool DataFormatSection(cmsIT8* it8)
+{
+    int iField = 0;
+    TABLE* t = GetTable(it8);
+
+    InSymbol(it8);   // Eats "BEGIN_DATA_FORMAT"
+    CheckEOLN(it8);
+
+    while (it8->sy != SEND_DATA_FORMAT &&
+        it8->sy != SEOLN &&
+        it8->sy != SEOF &&
+        it8->sy != SSYNERROR)  {
+
+            if (it8->sy != SIDENT) {
+
+                return SynError(it8, "Sample type expected");
+            }
+
+            if (!SetDataFormat(it8, iField, it8->id)) return FALSE;
+            iField++;
+
+            InSymbol(it8);
+            SkipEOLN(it8);
+       }
+
+       SkipEOLN(it8);
+       Skip(it8, SEND_DATA_FORMAT);
+       SkipEOLN(it8);
+
+       if (iField != t ->nSamples) {
+           SynError(it8, "Count mismatch. NUMBER_OF_FIELDS was %d, found %d\n", t ->nSamples, iField);
+
+
+       }
+
+       return TRUE;
+}
+
+
+
+static
+cmsBool DataSection (cmsIT8* it8)
+{
+    int  iField = 0;
+    int  iSet   = 0;
+    char Buffer[256];
+    TABLE* t = GetTable(it8);
+
+    InSymbol(it8);   // Eats "BEGIN_DATA"
+    CheckEOLN(it8);
+
+    if (!t->Data)
+        AllocateDataSet(it8);
+
+    while (it8->sy != SEND_DATA && it8->sy != SEOF)
+    {
+        if (iField >= t -> nSamples) {
+            iField = 0;
+            iSet++;
+
+        }
+
+        if (it8->sy != SEND_DATA && it8->sy != SEOF) {
+
+            if (!GetVal(it8, Buffer, 255, "Sample data expected"))
+                return FALSE;
+
+            if (!SetData(it8, iSet, iField, Buffer))
+                return FALSE;
+
+            iField++;
+
+            InSymbol(it8);
+            SkipEOLN(it8);
+        }
+    }
+
+    SkipEOLN(it8);
+    Skip(it8, SEND_DATA);
+    SkipEOLN(it8);
+
+    // Check for data completion.
+
+    if ((iSet+1) != t -> nPatches)
+        return SynError(it8, "Count mismatch. NUMBER_OF_SETS was %d, found %d\n", t ->nPatches, iSet+1);
+
+    return TRUE;
+}
+
+
+
+
+static
+cmsBool HeaderSection(cmsIT8* it8)
+{
+    char VarName[MAXID];
+    char Buffer[MAXSTR];
+    KEYVALUE* Key;
+
+        while (it8->sy != SEOF &&
+               it8->sy != SSYNERROR &&
+               it8->sy != SBEGIN_DATA_FORMAT &&
+               it8->sy != SBEGIN_DATA) {
+
+
+        switch (it8 -> sy) {
+
+        case SKEYWORD:
+                InSymbol(it8);
+                if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE;
+                if (!AddAvailableProperty(it8, Buffer, WRITE_UNCOOKED)) return FALSE;
+                InSymbol(it8);
+                break;
+
+
+        case SDATA_FORMAT_ID:
+                InSymbol(it8);
+                if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE;
+                if (!AddAvailableSampleID(it8, Buffer)) return FALSE;
+                InSymbol(it8);
+                break;
+
+
+        case SIDENT:
+                strncpy(VarName, it8->id, MAXID-1);
+                VarName[MAXID-1] = 0;
+
+                if (!IsAvailableOnList(it8-> ValidKeywords, VarName, NULL, &Key)) {
+
+#ifdef CMS_STRICT_CGATS
+                 return SynError(it8, "Undefined keyword '%s'", VarName);
+#else
+                    Key = AddAvailableProperty(it8, VarName, WRITE_UNCOOKED);
+                    if (Key == NULL) return FALSE;
+#endif
+                }
+
+                InSymbol(it8);
+                if (!GetVal(it8, Buffer, MAXSTR-1, "Property data expected")) return FALSE;
+
+                if(Key->WriteAs != WRITE_PAIR) {
+                    AddToList(it8, &GetTable(it8)->HeaderList, VarName, NULL, Buffer,
+                                (it8->sy == SSTRING) ? WRITE_STRINGIFY : WRITE_UNCOOKED);
+                }
+                else {
+                    const char *Subkey;
+                    char *Nextkey;
+                    if (it8->sy != SSTRING)
+                        return SynError(it8, "Invalid value '%s' for property '%s'.", Buffer, VarName);
+
+                    // chop the string as a list of "subkey, value" pairs, using ';' as a separator
+                    for (Subkey = Buffer; Subkey != NULL; Subkey = Nextkey)
+                    {
+                        char *Value, *temp;
+
+                        //  identify token pair boundary
+                        Nextkey = (char*) strchr(Subkey, ';');
+                        if(Nextkey)
+                            *Nextkey++ = '\0';
+
+                        // for each pair, split the subkey and the value
+                        Value = (char*) strrchr(Subkey, ',');
+                        if(Value == NULL)
+                            return SynError(it8, "Invalid value for property '%s'.", VarName);
+
+                        // gobble the spaces before the coma, and the coma itself
+                        temp = Value++;
+                        do *temp-- = '\0'; while(temp >= Subkey && *temp == ' ');
+
+                        // gobble any space at the right
+                        temp = Value + strlen(Value) - 1;
+                        while(*temp == ' ') *temp-- = '\0';
+
+                        // trim the strings from the left
+                        Subkey += strspn(Subkey, " ");
+                        Value += strspn(Value, " ");
+
+                        if(Subkey[0] == 0 || Value[0] == 0)
+                            return SynError(it8, "Invalid value for property '%s'.", VarName);
+                        AddToList(it8, &GetTable(it8)->HeaderList, VarName, Subkey, Value, WRITE_PAIR);
+                    }
+                }
+
+                InSymbol(it8);
+                break;
+
+
+        case SEOLN: break;
+
+        default:
+                return SynError(it8, "expected keyword or identifier");
+        }
+
+    SkipEOLN(it8);
+    }
+
+    return TRUE;
+
+}
+
+
+static
+void ReadType(cmsIT8* it8, char* SheetTypePtr)
+{
+    // First line is a very special case.
+
+    while (isseparator(it8->ch))
+            NextCh(it8);
+
+    while (it8->ch != '\r' && it8 ->ch != '\n' && it8->ch != '\t' && it8 -> ch != -1) {
+
+        *SheetTypePtr++= (char) it8 ->ch;
+        NextCh(it8);
+    }
+
+    *SheetTypePtr = 0;
+}
+
+
+static
+cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet)
+{
+    char* SheetTypePtr = it8 ->Tab[0].SheetType;
+
+    if (nosheet == 0) {
+        ReadType(it8, SheetTypePtr);
+    }
+
+    InSymbol(it8);
+
+    SkipEOLN(it8);
+
+    while (it8-> sy != SEOF &&
+           it8-> sy != SSYNERROR) {
+
+            switch (it8 -> sy) {
+
+            case SBEGIN_DATA_FORMAT:
+                    if (!DataFormatSection(it8)) return FALSE;
+                    break;
+
+            case SBEGIN_DATA:
+
+                    if (!DataSection(it8)) return FALSE;
+
+                    if (it8 -> sy != SEOF) {
+
+                            AllocTable(it8);
+                            it8 ->nTable = it8 ->TablesCount - 1;
+
+                            // Read sheet type if present. We only support identifier and string.
+                            // <ident> <eoln> is a type string
+                            // anything else, is not a type string
+                            if (nosheet == 0) {
+
+                                if (it8 ->sy == SIDENT) {
+
+                                    // May be a type sheet or may be a prop value statement. We cannot use insymbol in
+                                    // this special case...
+                                     while (isseparator(it8->ch))
+                                         NextCh(it8);
+
+                                     // If a newline is found, then this is a type string
+                                    if (it8 ->ch == '\n' || it8->ch == '\r') {
+
+                                         cmsIT8SetSheetType(it8, it8 ->id);
+                                         InSymbol(it8);
+                                    }
+                                    else
+                                    {
+                                        // It is not. Just continue
+                                        cmsIT8SetSheetType(it8, "");
+                                    }
+                                }
+                                else
+                                    // Validate quoted strings
+                                    if (it8 ->sy == SSTRING) {
+                                        cmsIT8SetSheetType(it8, it8 ->str);
+                                        InSymbol(it8);
+                                    }
+                           }
+
+                    }
+                    break;
+
+            case SEOLN:
+                    SkipEOLN(it8);
+                    break;
+
+            default:
+                    if (!HeaderSection(it8)) return FALSE;
+           }
+
+    }
+
+    return (it8 -> sy != SSYNERROR);
+}
+
+
+
+// Init usefull pointers
+
+static
+void CookPointers(cmsIT8* it8)
+{
+    int idField, i;
+    char* Fld;
+    cmsUInt32Number j;
+    cmsUInt32Number nOldTable = it8 ->nTable;
+
+    for (j=0; j < it8 ->TablesCount; j++) {
+
+    TABLE* t = it8 ->Tab + j;
+
+    t -> SampleID = 0;
+    it8 ->nTable = j;
+
+    for (idField = 0; idField < t -> nSamples; idField++)
+    {
+        if (t ->DataFormat == NULL){
+            SynError(it8, "Undefined DATA_FORMAT");
+            return;
+        }
+
+        Fld = t->DataFormat[idField];
+        if (!Fld) continue;
+
+
+        if (cmsstrcasecmp(Fld, "SAMPLE_ID") == 0) {
+
+            t -> SampleID = idField;
+
+            for (i=0; i < t -> nPatches; i++) {
+
+                char *Data = GetData(it8, i, idField);
+                if (Data) {
+                    char Buffer[256];
+
+                    strncpy(Buffer, Data, 255);
+                    Buffer[255] = 0;
+
+                    if (strlen(Buffer) <= strlen(Data))
+                        strcpy(Data, Buffer);
+                    else
+                        SetData(it8, i, idField, Buffer);
+
+                }
+            }
+
+        }
+
+        // "LABEL" is an extension. It keeps references to forward tables
+
+        if ((cmsstrcasecmp(Fld, "LABEL") == 0) || Fld[0] == '$' ) {
+
+                    // Search for table references...
+                    for (i=0; i < t -> nPatches; i++) {
+
+                            char *Label = GetData(it8, i, idField);
+
+                            if (Label) {
+
+                                cmsUInt32Number k;
+
+                                // This is the label, search for a table containing
+                                // this property
+
+                                for (k=0; k < it8 ->TablesCount; k++) {
+
+                                    TABLE* Table = it8 ->Tab + k;
+                                    KEYVALUE* p;
+
+                                    if (IsAvailableOnList(Table->HeaderList, Label, NULL, &p)) {
+
+                                        // Available, keep type and table
+                                        char Buffer[256];
+
+                                        char *Type  = p ->Value;
+                                        int  nTable = (int) k;
+
+                                        snprintf(Buffer, 255, "%s %d %s", Label, nTable, Type );
+
+                                        SetData(it8, i, idField, Buffer);
+                                    }
+                                }
+
+
+                            }
+
+                    }
+
+
+        }
+
+    }
+    }
+
+    it8 ->nTable = nOldTable;
+}
+
+// Try to infere if the file is a CGATS/IT8 file at all. Read first line
+// that should be something like some printable characters plus a \n
+// returns 0 if this is not like a CGATS, or an integer otherwise. This integer is the number of words in first line?
+static
+int IsMyBlock(cmsUInt8Number* Buffer, int n)
+{
+    int words = 1, space = 0, quot = 0;
+    int i;
+
+    if (n < 10) return 0;   // Too small
+
+    if (n > 132)
+        n = 132;
+
+    for (i = 1; i < n; i++) {
+
+        switch(Buffer[i])
+        {
+        case '\n':
+        case '\r':
+            return ((quot == 1) || (words > 2)) ? 0 : words;
+        case '\t':
+        case ' ':
+            if(!quot && !space)
+                space = 1;
+            break;
+        case '\"':
+            quot = !quot;
+            break;
+        default:
+            if (Buffer[i] < 32) return 0;
+            if (Buffer[i] > 127) return 0;
+            words += space;
+            space = 0;
+            break;
+        }
+    }
+
+    return 0;
+}
+
+
+static
+cmsBool IsMyFile(const char* FileName)
+{
+   FILE *fp;
+   cmsUInt32Number Size;
+   cmsUInt8Number Ptr[133];
+
+   fp = fopen(FileName, "rt");
+   if (!fp) {
+       cmsSignalError(0, cmsERROR_FILE, "File '%s' not found", FileName);
+       return FALSE;
+   }
+
+   Size = (cmsUInt32Number) fread(Ptr, 1, 132, fp);
+
+   if (fclose(fp) != 0)
+       return FALSE;
+
+   Ptr[Size] = '\0';
+
+   return IsMyBlock(Ptr, Size);
+}
+
+// ---------------------------------------------------------- Exported routines
+
+
+cmsHANDLE  CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, void *Ptr, cmsUInt32Number len)
+{
+    cmsHANDLE hIT8;
+    cmsIT8*  it8;
+    int type;
+
+    _cmsAssert(Ptr != NULL);
+    _cmsAssert(len != 0);
+
+    type = IsMyBlock((cmsUInt8Number*)Ptr, len);
+    if (type == 0) return NULL;
+
+    hIT8 = cmsIT8Alloc(ContextID);
+    if (!hIT8) return NULL;
+
+    it8 = (cmsIT8*) hIT8;
+    it8 ->MemoryBlock = (char*) _cmsMalloc(ContextID, len + 1);
+
+    strncpy(it8 ->MemoryBlock, (const char*) Ptr, len);
+    it8 ->MemoryBlock[len] = 0;
+
+    strncpy(it8->FileStack[0]->FileName, "", cmsMAX_PATH-1);
+    it8-> Source = it8 -> MemoryBlock;
+
+    if (!ParseIT8(it8, type-1)) {
+
+        cmsIT8Free(hIT8);
+        return FALSE;
+    }
+
+    CookPointers(it8);
+    it8 ->nTable = 0;
+
+    _cmsFree(ContextID, it8->MemoryBlock);
+    it8 -> MemoryBlock = NULL;
+
+    return hIT8;
+
+
+}
+
+
+cmsHANDLE  CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName)
+{
+
+     cmsHANDLE hIT8;
+     cmsIT8*  it8;
+     int type;
+
+     _cmsAssert(cFileName != NULL);
+
+     type = IsMyFile(cFileName);
+     if (type == 0) return NULL;
+
+     hIT8 = cmsIT8Alloc(ContextID);
+     it8 = (cmsIT8*) hIT8;
+     if (!hIT8) return NULL;
+
+
+     it8 ->FileStack[0]->Stream = fopen(cFileName, "rt");
+
+     if (!it8 ->FileStack[0]->Stream) {
+         cmsIT8Free(hIT8);
+         return NULL;
+     }
+
+
+    strncpy(it8->FileStack[0]->FileName, cFileName, cmsMAX_PATH-1);
+    it8->FileStack[0]->FileName[cmsMAX_PATH-1] = 0;
+
+    if (!ParseIT8(it8, type-1)) {
+
+            fclose(it8 ->FileStack[0]->Stream);
+            cmsIT8Free(hIT8);
+            return NULL;
+    }
+
+    CookPointers(it8);
+    it8 ->nTable = 0;
+
+    if (fclose(it8 ->FileStack[0]->Stream)!= 0) {
+            cmsIT8Free(hIT8);
+            return NULL;
+    }
+
+    return hIT8;
+
+}
+
+int CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    TABLE* t;
+
+    _cmsAssert(hIT8 != NULL);
+
+    t = GetTable(it8);
+
+    if (SampleNames)
+        *SampleNames = t -> DataFormat;
+    return t -> nSamples;
+}
+
+
+cmsUInt32Number CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    KEYVALUE* p;
+    cmsUInt32Number n;
+    char **Props;
+    TABLE* t;
+
+    _cmsAssert(hIT8 != NULL);
+
+    t = GetTable(it8);
+
+    // Pass#1 - count properties
+
+    n = 0;
+    for (p = t -> HeaderList;  p != NULL; p = p->Next) {
+        n++;
+    }
+
+
+    Props = (char **) AllocChunk(it8, sizeof(char *) * n);
+
+    // Pass#2 - Fill pointers
+    n = 0;
+    for (p = t -> HeaderList;  p != NULL; p = p->Next) {
+        Props[n++] = p -> Keyword;
+    }
+
+    *PropertyNames = Props;
+    return n;
+}
+
+cmsUInt32Number CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    KEYVALUE *p, *tmp;
+    cmsUInt32Number n;
+    const char **Props;
+    TABLE* t;
+
+    _cmsAssert(hIT8 != NULL);
+
+
+    t = GetTable(it8);
+
+    if(!IsAvailableOnList(t->HeaderList, cProp, NULL, &p)) {
+        *SubpropertyNames = 0;
+        return 0;
+    }
+
+    // Pass#1 - count properties
+
+    n = 0;
+    for (tmp = p;  tmp != NULL; tmp = tmp->NextSubkey) {
+        if(tmp->Subkey != NULL)
+            n++;
+    }
+
+
+    Props = (const char **) AllocChunk(it8, sizeof(char *) * n);
+
+    // Pass#2 - Fill pointers
+    n = 0;
+    for (tmp = p;  tmp != NULL; tmp = tmp->NextSubkey) {
+        if(tmp->Subkey != NULL)
+            Props[n++] = p ->Subkey;
+    }
+
+    *SubpropertyNames = Props;
+    return n;
+}
+
+static
+int LocatePatch(cmsIT8* it8, const char* cPatch)
+{
+    int i;
+    const char *data;
+    TABLE* t = GetTable(it8);
+
+    for (i=0; i < t-> nPatches; i++) {
+
+        data = GetData(it8, i, t->SampleID);
+
+        if (data != NULL) {
+
+                if (cmsstrcasecmp(data, cPatch) == 0)
+                        return i;
+                }
+        }
+
+        // SynError(it8, "Couldn't find patch '%s'\n", cPatch);
+        return -1;
+}
+
+
+static
+int LocateEmptyPatch(cmsIT8* it8)
+{
+    int i;
+    const char *data;
+    TABLE* t = GetTable(it8);
+
+    for (i=0; i < t-> nPatches; i++) {
+
+        data = GetData(it8, i, t->SampleID);
+
+        if (data == NULL)
+            return i;
+
+    }
+
+    return -1;
+}
+
+static
+int LocateSample(cmsIT8* it8, const char* cSample)
+{
+    int i;
+    const char *fld;
+    TABLE* t = GetTable(it8);
+
+    for (i=0; i < t->nSamples; i++) {
+
+        fld = GetDataFormat(it8, i);
+        if (cmsstrcasecmp(fld, cSample) == 0)
+            return i;
+    }
+
+    return -1;
+
+}
+
+
+int CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+
+    _cmsAssert(hIT8 != NULL);
+
+    return LocateSample(it8, cSample);
+}
+
+
+
+const char* CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+
+    _cmsAssert(hIT8 != NULL);
+
+    return GetData(it8, row, col);
+}
+
+
+cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col)
+{
+    const char* Buffer;
+
+    Buffer = cmsIT8GetDataRowCol(hIT8, row, col);
+
+    if (Buffer == NULL) return 0.0;
+
+    return ParseFloatNumber(Buffer);
+}
+
+
+cmsBool CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col, const char* Val)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+
+    _cmsAssert(hIT8 != NULL);
+
+    return SetData(it8, row, col, Val);
+}
+
+
+cmsBool CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col, cmsFloat64Number Val)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    char Buff[256];
+
+    _cmsAssert(hIT8 != NULL);
+
+    sprintf(Buff, it8->DoubleFormatter, Val);
+
+    return SetData(it8, row, col, Buff);
+}
+
+
+
+const char* CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    int iField, iSet;
+
+    _cmsAssert(hIT8 != NULL);
+
+    iField = LocateSample(it8, cSample);
+    if (iField < 0) {
+        return NULL;
+    }
+
+    iSet = LocatePatch(it8, cPatch);
+    if (iSet < 0) {
+            return NULL;
+    }
+
+    return GetData(it8, iSet, iField);
+}
+
+
+cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE  it8, const char* cPatch, const char* cSample)
+{
+    const char* Buffer;
+
+    Buffer = cmsIT8GetData(it8, cPatch, cSample);
+
+    return ParseFloatNumber(Buffer);
+}
+
+
+
+cmsBool CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample, const char *Val)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    int iField, iSet;
+    TABLE* t;
+
+    _cmsAssert(hIT8 != NULL);
+
+    t = GetTable(it8);
+
+    iField = LocateSample(it8, cSample);
+
+    if (iField < 0)
+        return FALSE;
+
+    if (t-> nPatches == 0) {
+
+        AllocateDataFormat(it8);
+        AllocateDataSet(it8);
+        CookPointers(it8);
+    }
+
+    if (cmsstrcasecmp(cSample, "SAMPLE_ID") == 0) {
+
+        iSet   = LocateEmptyPatch(it8);
+        if (iSet < 0) {
+            return SynError(it8, "Couldn't add more patches '%s'\n", cPatch);
+        }
+
+        iField = t -> SampleID;
+    }
+    else {
+        iSet = LocatePatch(it8, cPatch);
+        if (iSet < 0) {
+            return FALSE;
+        }
+    }
+
+    return SetData(it8, iSet, iField, Val);
+}
+
+
+cmsBool CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch,
+                                   const char* cSample,
+                                   cmsFloat64Number Val)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    char Buff[256];
+
+    _cmsAssert(hIT8 != NULL);
+
+    snprintf(Buff, 255, it8->DoubleFormatter, Val);
+    return cmsIT8SetData(hIT8, cPatch, cSample, Buff);
+}
+
+// Buffer should get MAXSTR at least
+
+const char* CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    TABLE* t;
+    char* Data;
+
+    _cmsAssert(hIT8 != NULL);
+
+    t = GetTable(it8);
+    Data = GetData(it8, nPatch, t->SampleID);
+
+    if (!Data) return NULL;
+    if (!buffer) return Data;
+
+    strncpy(buffer, Data, MAXSTR-1);
+    buffer[MAXSTR-1] = 0;
+    return buffer;
+}
+
+int CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch)
+{
+    _cmsAssert(hIT8 != NULL);
+
+    return LocatePatch((cmsIT8*)hIT8, cPatch);
+}
+
+cmsUInt32Number CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+
+    _cmsAssert(hIT8 != NULL);
+
+    return it8 ->TablesCount;
+}
+
+// This handles the "LABEL" extension.
+// Label, nTable, Type
+
+int CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType)
+{
+    const char* cLabelFld;
+    char Type[256], Label[256];
+    int nTable;
+
+    _cmsAssert(hIT8 != NULL);
+
+    if (cField != NULL && *cField == 0)
+            cField = "LABEL";
+
+    if (cField == NULL)
+            cField = "LABEL";
+
+    cLabelFld = cmsIT8GetData(hIT8, cSet, cField);
+    if (!cLabelFld) return -1;
+
+    if (sscanf(cLabelFld, "%255s %d %255s", Label, &nTable, Type) != 3)
+            return -1;
+
+    if (ExpectedType != NULL && *ExpectedType == 0)
+        ExpectedType = NULL;
+
+    if (ExpectedType) {
+
+        if (cmsstrcasecmp(Type, ExpectedType) != 0) return -1;
+    }
+
+    return cmsIT8SetTable(hIT8, nTable);
+}
+
+
+cmsBool CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+    int pos;
+
+    _cmsAssert(hIT8 != NULL);
+
+    pos = LocateSample(it8, cSample);
+    if(pos == -1)
+        return FALSE;
+
+    it8->Tab[it8->nTable].SampleID = pos;
+    return TRUE;
+}
+
+
+void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter)
+{
+    cmsIT8* it8 = (cmsIT8*) hIT8;
+
+    _cmsAssert(hIT8 != NULL);
+
+    if (Formatter == NULL)
+        strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT);
+    else
+        strncpy(it8->DoubleFormatter, Formatter, sizeof(it8->DoubleFormatter));
+
+    it8 ->DoubleFormatter[sizeof(it8 ->DoubleFormatter)-1] = 0;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscnvrt.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscnvrt.c
new file mode 100644
index 0000000..1a93e83
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscnvrt.c
@@ -0,0 +1,1142 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// Link several profiles to obtain a single LUT modelling the whole color transform. Intents, Black point
+// compensation and Adaptation parameters may vary across profiles. BPC and Adaptation refers to the PCS
+// after the profile. I.e, BPC[0] refers to connexion between profile(0) and profile(1)
+cmsPipeline* _cmsLinkProfiles(cmsContext     ContextID,
+                              cmsUInt32Number nProfiles,
+                              cmsUInt32Number Intents[],
+                              cmsHPROFILE     hProfiles[],
+                              cmsBool         BPC[],
+                              cmsFloat64Number AdaptationStates[],
+                              cmsUInt32Number dwFlags);
+
+//---------------------------------------------------------------------------------
+
+// This is the default routine for ICC-style intents. A user may decide to override it by using a plugin.
+// Supported intents are perceptual, relative colorimetric, saturation and ICC-absolute colorimetric
+static
+cmsPipeline* DefaultICCintents(cmsContext     ContextID,
+                               cmsUInt32Number nProfiles,
+                               cmsUInt32Number Intents[],
+                               cmsHPROFILE     hProfiles[],
+                               cmsBool         BPC[],
+                               cmsFloat64Number AdaptationStates[],
+                               cmsUInt32Number dwFlags);
+
+//---------------------------------------------------------------------------------
+
+// This is the entry for black-preserving K-only intents, which are non-ICC. Last profile have to be a output profile
+// to do the trick (no devicelinks allowed at that position)
+static
+cmsPipeline*  BlackPreservingKOnlyIntents(cmsContext     ContextID,
+                                          cmsUInt32Number nProfiles,
+                                          cmsUInt32Number Intents[],
+                                          cmsHPROFILE     hProfiles[],
+                                          cmsBool         BPC[],
+                                          cmsFloat64Number AdaptationStates[],
+                                          cmsUInt32Number dwFlags);
+
+//---------------------------------------------------------------------------------
+
+// This is the entry for black-plane preserving, which are non-ICC. Again, Last profile have to be a output profile
+// to do the trick (no devicelinks allowed at that position)
+static
+cmsPipeline*  BlackPreservingKPlaneIntents(cmsContext     ContextID,
+                                           cmsUInt32Number nProfiles,
+                                           cmsUInt32Number Intents[],
+                                           cmsHPROFILE     hProfiles[],
+                                           cmsBool         BPC[],
+                                           cmsFloat64Number AdaptationStates[],
+                                           cmsUInt32Number dwFlags);
+
+//---------------------------------------------------------------------------------
+
+
+// This is a structure holding implementations for all supported intents.
+typedef struct _cms_intents_list {
+
+    cmsUInt32Number Intent;
+    char            Description[256];
+    cmsIntentFn     Link;
+    struct _cms_intents_list*  Next;
+
+} cmsIntentsList;
+
+
+// Built-in intents
+static cmsIntentsList DefaultIntents[] = {
+
+    { INTENT_PERCEPTUAL,                            "Perceptual",                                   DefaultICCintents,            &DefaultIntents[1] },
+    { INTENT_RELATIVE_COLORIMETRIC,                 "Relative colorimetric",                        DefaultICCintents,            &DefaultIntents[2] },
+    { INTENT_SATURATION,                            "Saturation",                                   DefaultICCintents,            &DefaultIntents[3] },
+    { INTENT_ABSOLUTE_COLORIMETRIC,                 "Absolute colorimetric",                        DefaultICCintents,            &DefaultIntents[4] },
+    { INTENT_PRESERVE_K_ONLY_PERCEPTUAL,            "Perceptual preserving black ink",              BlackPreservingKOnlyIntents,  &DefaultIntents[5] },
+    { INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC, "Relative colorimetric preserving black ink",   BlackPreservingKOnlyIntents,  &DefaultIntents[6] },
+    { INTENT_PRESERVE_K_ONLY_SATURATION,            "Saturation preserving black ink",              BlackPreservingKOnlyIntents,  &DefaultIntents[7] },
+    { INTENT_PRESERVE_K_PLANE_PERCEPTUAL,           "Perceptual preserving black plane",            BlackPreservingKPlaneIntents, &DefaultIntents[8] },
+    { INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC,"Relative colorimetric preserving black plane", BlackPreservingKPlaneIntents, &DefaultIntents[9] },
+    { INTENT_PRESERVE_K_PLANE_SATURATION,           "Saturation preserving black plane",            BlackPreservingKPlaneIntents, NULL }
+};
+
+
+// A pointer to the begining of the list
+_cmsIntentsPluginChunkType _cmsIntentsPluginChunk = { NULL };
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupPluginIntentsList(struct _cmsContext_struct* ctx, 
+                                               const struct _cmsContext_struct* src)
+{
+   _cmsIntentsPluginChunkType newHead = { NULL };
+   cmsIntentsList*  entry;
+   cmsIntentsList*  Anterior = NULL;
+   _cmsIntentsPluginChunkType* head = (_cmsIntentsPluginChunkType*) src->chunks[IntentPlugin];
+
+    // Walk the list copying all nodes
+   for (entry = head->Intents;
+        entry != NULL;
+        entry = entry ->Next) {
+
+            cmsIntentsList *newEntry = ( cmsIntentsList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsIntentsList));
+   
+            if (newEntry == NULL) 
+                return;
+
+            // We want to keep the linked list order, so this is a little bit tricky
+            newEntry -> Next = NULL;
+            if (Anterior)
+                Anterior -> Next = newEntry;
+     
+            Anterior = newEntry;
+
+            if (newHead.Intents == NULL)
+                newHead.Intents = newEntry;
+    }
+
+  ctx ->chunks[IntentPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsIntentsPluginChunkType));
+}
+
+void  _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx, 
+                                         const struct _cmsContext_struct* src)
+{
+    if (src != NULL) {
+
+        // Copy all linked list
+        DupPluginIntentsList(ctx, src);
+    }
+    else {
+        static _cmsIntentsPluginChunkType IntentsPluginChunkType = { NULL };
+        ctx ->chunks[IntentPlugin] = _cmsSubAllocDup(ctx ->MemPool, &IntentsPluginChunkType, sizeof(_cmsIntentsPluginChunkType));
+    }
+}
+
+
+// Search the list for a suitable intent. Returns NULL if not found
+static
+cmsIntentsList* SearchIntent(cmsContext ContextID, cmsUInt32Number Intent)
+{
+    _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin);
+    cmsIntentsList* pt;
+
+    for (pt = ctx -> Intents; pt != NULL; pt = pt -> Next)
+        if (pt ->Intent == Intent) return pt;
+
+    for (pt = DefaultIntents; pt != NULL; pt = pt -> Next)
+        if (pt ->Intent == Intent) return pt;
+
+    return NULL;
+}
+
+// Black point compensation. Implemented as a linear scaling in XYZ. Black points
+// should come relative to the white point. Fills an matrix/offset element m
+// which is organized as a 4x4 matrix.
+static
+void ComputeBlackPointCompensation(const cmsCIEXYZ* BlackPointIn,
+                                   const cmsCIEXYZ* BlackPointOut,
+                                   cmsMAT3* m, cmsVEC3* off)
+{
+  cmsFloat64Number ax, ay, az, bx, by, bz, tx, ty, tz;
+
+   // Now we need to compute a matrix plus an offset m and of such of
+   // [m]*bpin + off = bpout
+   // [m]*D50  + off = D50
+   //
+   // This is a linear scaling in the form ax+b, where
+   // a = (bpout - D50) / (bpin - D50)
+   // b = - D50* (bpout - bpin) / (bpin - D50)
+
+   tx = BlackPointIn->X - cmsD50_XYZ()->X;
+   ty = BlackPointIn->Y - cmsD50_XYZ()->Y;
+   tz = BlackPointIn->Z - cmsD50_XYZ()->Z;
+
+   ax = (BlackPointOut->X - cmsD50_XYZ()->X) / tx;
+   ay = (BlackPointOut->Y - cmsD50_XYZ()->Y) / ty;
+   az = (BlackPointOut->Z - cmsD50_XYZ()->Z) / tz;
+
+   bx = - cmsD50_XYZ()-> X * (BlackPointOut->X - BlackPointIn->X) / tx;
+   by = - cmsD50_XYZ()-> Y * (BlackPointOut->Y - BlackPointIn->Y) / ty;
+   bz = - cmsD50_XYZ()-> Z * (BlackPointOut->Z - BlackPointIn->Z) / tz;
+
+   _cmsVEC3init(&m ->v[0], ax, 0,  0);
+   _cmsVEC3init(&m ->v[1], 0, ay,  0);
+   _cmsVEC3init(&m ->v[2], 0,  0,  az);
+   _cmsVEC3init(off, bx, by, bz);
+
+}
+
+
+// Approximate a blackbody illuminant based on CHAD information
+static
+cmsFloat64Number CHAD2Temp(const cmsMAT3* Chad)
+{
+    // Convert D50 across inverse CHAD to get the absolute white point
+    cmsVEC3 d, s;
+    cmsCIEXYZ Dest;
+    cmsCIExyY DestChromaticity;
+    cmsFloat64Number TempK;
+    cmsMAT3 m1, m2;
+
+    m1 = *Chad;
+    if (!_cmsMAT3inverse(&m1, &m2)) return FALSE;
+
+    s.n[VX] = cmsD50_XYZ() -> X;
+    s.n[VY] = cmsD50_XYZ() -> Y;
+    s.n[VZ] = cmsD50_XYZ() -> Z;
+
+    _cmsMAT3eval(&d, &m2, &s);
+
+    Dest.X = d.n[VX];
+    Dest.Y = d.n[VY];
+    Dest.Z = d.n[VZ];
+
+    cmsXYZ2xyY(&DestChromaticity, &Dest);
+
+    if (!cmsTempFromWhitePoint(&TempK, &DestChromaticity))
+        return -1.0;
+
+    return TempK;
+}
+
+// Compute a CHAD based on a given temperature
+static
+    void Temp2CHAD(cmsMAT3* Chad, cmsFloat64Number Temp)
+{
+    cmsCIEXYZ White;
+    cmsCIExyY ChromaticityOfWhite;
+
+    cmsWhitePointFromTemp(&ChromaticityOfWhite, Temp);
+    cmsxyY2XYZ(&White, &ChromaticityOfWhite);
+    _cmsAdaptationMatrix(Chad, NULL, &White, cmsD50_XYZ());
+}
+
+// Join scalings to obtain relative input to absolute and then to relative output.
+// Result is stored in a 3x3 matrix
+static
+cmsBool  ComputeAbsoluteIntent(cmsFloat64Number AdaptationState,
+                               const cmsCIEXYZ* WhitePointIn,
+                               const cmsMAT3* ChromaticAdaptationMatrixIn,
+                               const cmsCIEXYZ* WhitePointOut,
+                               const cmsMAT3* ChromaticAdaptationMatrixOut,
+                               cmsMAT3* m)
+{
+    cmsMAT3 Scale, m1, m2, m3, m4;
+
+    // Adaptation state
+    if (AdaptationState == 1.0) {
+
+        // Observer is fully adapted. Keep chromatic adaptation.
+        // That is the standard V4 behaviour
+        _cmsVEC3init(&m->v[0], WhitePointIn->X / WhitePointOut->X, 0, 0);
+        _cmsVEC3init(&m->v[1], 0, WhitePointIn->Y / WhitePointOut->Y, 0);
+        _cmsVEC3init(&m->v[2], 0, 0, WhitePointIn->Z / WhitePointOut->Z);
+
+    }
+    else  {
+
+        // Incomplete adaptation. This is an advanced feature.
+        _cmsVEC3init(&Scale.v[0], WhitePointIn->X / WhitePointOut->X, 0, 0);
+        _cmsVEC3init(&Scale.v[1], 0,  WhitePointIn->Y / WhitePointOut->Y, 0);
+        _cmsVEC3init(&Scale.v[2], 0, 0,  WhitePointIn->Z / WhitePointOut->Z);
+
+
+        if (AdaptationState == 0.0) {
+
+            m1 = *ChromaticAdaptationMatrixOut;
+            _cmsMAT3per(&m2, &m1, &Scale);
+            // m2 holds CHAD from output white to D50 times abs. col. scaling
+
+            // Observer is not adapted, undo the chromatic adaptation
+            _cmsMAT3per(m, &m2, ChromaticAdaptationMatrixOut);
+
+            m3 = *ChromaticAdaptationMatrixIn;
+            if (!_cmsMAT3inverse(&m3, &m4)) return FALSE;
+            _cmsMAT3per(m, &m2, &m4);
+
+        } else {
+
+            cmsMAT3 MixedCHAD;
+            cmsFloat64Number TempSrc, TempDest, Temp;
+
+            m1 = *ChromaticAdaptationMatrixIn;
+            if (!_cmsMAT3inverse(&m1, &m2)) return FALSE;
+            _cmsMAT3per(&m3, &m2, &Scale);
+            // m3 holds CHAD from input white to D50 times abs. col. scaling
+
+            TempSrc  = CHAD2Temp(ChromaticAdaptationMatrixIn);
+            TempDest = CHAD2Temp(ChromaticAdaptationMatrixOut);
+
+            if (TempSrc < 0.0 || TempDest < 0.0) return FALSE; // Something went wrong
+
+            if (_cmsMAT3isIdentity(&Scale) && fabs(TempSrc - TempDest) < 0.01) {
+
+                _cmsMAT3identity(m);
+                return TRUE;
+            }
+
+            Temp = (1.0 - AdaptationState) * TempDest + AdaptationState * TempSrc;
+
+            // Get a CHAD from whatever output temperature to D50. This replaces output CHAD
+            Temp2CHAD(&MixedCHAD, Temp);
+
+            _cmsMAT3per(m, &m3, &MixedCHAD);
+        }
+
+    }
+    return TRUE;
+
+}
+
+// Just to see if m matrix should be applied
+static
+cmsBool IsEmptyLayer(cmsMAT3* m, cmsVEC3* off)
+{
+    cmsFloat64Number diff = 0;
+    cmsMAT3 Ident;
+    int i;
+
+    if (m == NULL && off == NULL) return TRUE;  // NULL is allowed as an empty layer
+    if (m == NULL && off != NULL) return FALSE; // This is an internal error
+
+    _cmsMAT3identity(&Ident);
+
+    for (i=0; i < 3*3; i++)
+        diff += fabs(((cmsFloat64Number*)m)[i] - ((cmsFloat64Number*)&Ident)[i]);
+
+    for (i=0; i < 3; i++)
+        diff += fabs(((cmsFloat64Number*)off)[i]);
+
+
+    return (diff < 0.002);
+}
+
+
+// Compute the conversion layer
+static
+cmsBool ComputeConversion(int i, cmsHPROFILE hProfiles[],
+                                 cmsUInt32Number Intent,
+                                 cmsBool BPC,
+                                 cmsFloat64Number AdaptationState,
+                                 cmsMAT3* m, cmsVEC3* off)
+{
+
+    int k;
+
+    // m  and off are set to identity and this is detected latter on
+    _cmsMAT3identity(m);
+    _cmsVEC3init(off, 0, 0, 0);
+
+    // If intent is abs. colorimetric,
+    if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) {
+
+        cmsCIEXYZ WhitePointIn, WhitePointOut;
+        cmsMAT3 ChromaticAdaptationMatrixIn, ChromaticAdaptationMatrixOut;
+
+        _cmsReadMediaWhitePoint(&WhitePointIn,  hProfiles[i-1]);
+        _cmsReadCHAD(&ChromaticAdaptationMatrixIn, hProfiles[i-1]);
+
+        _cmsReadMediaWhitePoint(&WhitePointOut,  hProfiles[i]);
+        _cmsReadCHAD(&ChromaticAdaptationMatrixOut, hProfiles[i]);
+
+        if (!ComputeAbsoluteIntent(AdaptationState,
+                                  &WhitePointIn,  &ChromaticAdaptationMatrixIn,
+                                  &WhitePointOut, &ChromaticAdaptationMatrixOut, m)) return FALSE;
+
+    }
+    else {
+        // Rest of intents may apply BPC.
+
+        if (BPC) {
+
+            cmsCIEXYZ BlackPointIn, BlackPointOut;
+
+            cmsDetectBlackPoint(&BlackPointIn,  hProfiles[i-1], Intent, 0);
+            cmsDetectDestinationBlackPoint(&BlackPointOut, hProfiles[i], Intent, 0);
+
+            // If black points are equal, then do nothing
+            if (BlackPointIn.X != BlackPointOut.X ||
+                BlackPointIn.Y != BlackPointOut.Y ||
+                BlackPointIn.Z != BlackPointOut.Z)
+                    ComputeBlackPointCompensation(&BlackPointIn, &BlackPointOut, m, off);
+        }
+    }
+
+    // Offset should be adjusted because the encoding. We encode XYZ normalized to 0..1.0,
+    // to do that, we divide by MAX_ENCODEABLE_XZY. The conversion stage goes XYZ -> XYZ so
+    // we have first to convert from encoded to XYZ and then convert back to encoded.
+    // y = Mx + Off
+    // x = x'c
+    // y = M x'c + Off
+    // y = y'c; y' = y / c
+    // y' = (Mx'c + Off) /c = Mx' + (Off / c)
+
+    for (k=0; k < 3; k++) {
+        off ->n[k] /= MAX_ENCODEABLE_XYZ;
+    }
+
+    return TRUE;
+}
+
+
+// Add a conversion stage if needed. If a matrix/offset m is given, it applies to XYZ space
+static
+cmsBool AddConversion(cmsPipeline* Result, cmsColorSpaceSignature InPCS, cmsColorSpaceSignature OutPCS, cmsMAT3* m, cmsVEC3* off)
+{
+    cmsFloat64Number* m_as_dbl = (cmsFloat64Number*) m;
+    cmsFloat64Number* off_as_dbl = (cmsFloat64Number*) off;
+
+    // Handle PCS mismatches. A specialized stage is added to the LUT in such case
+    switch (InPCS) {
+
+    case cmsSigXYZData: // Input profile operates in XYZ
+
+        switch (OutPCS) {
+
+        case cmsSigXYZData:  // XYZ -> XYZ
+            if (!IsEmptyLayer(m, off) &&
+                !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
+                return FALSE;
+            break;
+
+        case cmsSigLabData:  // XYZ -> Lab
+            if (!IsEmptyLayer(m, off) &&
+                !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
+                return FALSE;
+            if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))
+                return FALSE;
+            break;
+
+        default:
+            return FALSE;   // Colorspace mismatch
+        }
+        break;
+
+    case cmsSigLabData: // Input profile operates in Lab
+
+        switch (OutPCS) {
+
+        case cmsSigXYZData:  // Lab -> XYZ
+
+            if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)))
+                return FALSE;
+            if (!IsEmptyLayer(m, off) &&
+                !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
+                return FALSE;
+            break;
+
+        case cmsSigLabData:  // Lab -> Lab
+
+            if (!IsEmptyLayer(m, off)) {
+                if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)) ||
+                    !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)) ||
+                    !cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))
+                    return FALSE;
+            }
+            break;
+
+        default:
+            return FALSE;  // Mismatch
+        }
+        break;
+
+        // On colorspaces other than PCS, check for same space
+    default:
+        if (InPCS != OutPCS) return FALSE;
+        break;
+    }
+
+    return TRUE;
+}
+
+
+// Is a given space compatible with another?
+static
+cmsBool ColorSpaceIsCompatible(cmsColorSpaceSignature a, cmsColorSpaceSignature b)
+{
+    // If they are same, they are compatible.
+    if (a == b) return TRUE;
+
+    // Check for MCH4 substitution of CMYK
+    if ((a == cmsSig4colorData) && (b == cmsSigCmykData)) return TRUE;
+    if ((a == cmsSigCmykData) && (b == cmsSig4colorData)) return TRUE;
+
+    // Check for XYZ/Lab. Those spaces are interchangeable as they can be computed one from other.
+    if ((a == cmsSigXYZData) && (b == cmsSigLabData)) return TRUE;
+    if ((a == cmsSigLabData) && (b == cmsSigXYZData)) return TRUE;
+
+    return FALSE;
+}
+
+
+// Default handler for ICC-style intents
+static
+cmsPipeline* DefaultICCintents(cmsContext       ContextID,
+                               cmsUInt32Number  nProfiles,
+                               cmsUInt32Number  TheIntents[],
+                               cmsHPROFILE      hProfiles[],
+                               cmsBool          BPC[],
+                               cmsFloat64Number AdaptationStates[],
+                               cmsUInt32Number  dwFlags)
+{
+    cmsPipeline* Lut = NULL;
+    cmsPipeline* Result;
+    cmsHPROFILE hProfile;
+    cmsMAT3 m;
+    cmsVEC3 off;
+    cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut, CurrentColorSpace;
+    cmsProfileClassSignature ClassSig;
+    cmsUInt32Number  i, Intent;
+
+    // For safety
+    if (nProfiles == 0) return NULL;
+
+    // Allocate an empty LUT for holding the result. 0 as channel count means 'undefined'
+    Result = cmsPipelineAlloc(ContextID, 0, 0);
+    if (Result == NULL) return NULL;
+
+    CurrentColorSpace = cmsGetColorSpace(hProfiles[0]);
+
+    for (i=0; i < nProfiles; i++) {
+
+        cmsBool  lIsDeviceLink, lIsInput;
+
+        hProfile      = hProfiles[i];
+        ClassSig      = cmsGetDeviceClass(hProfile);
+        lIsDeviceLink = (ClassSig == cmsSigLinkClass || ClassSig == cmsSigAbstractClass );
+
+        // First profile is used as input unless devicelink or abstract
+        if ((i == 0) && !lIsDeviceLink) {
+            lIsInput = TRUE;
+        }
+        else {
+          // Else use profile in the input direction if current space is not PCS
+        lIsInput      = (CurrentColorSpace != cmsSigXYZData) &&
+                        (CurrentColorSpace != cmsSigLabData);
+        }
+
+        Intent        = TheIntents[i];
+
+        if (lIsInput || lIsDeviceLink) {
+
+            ColorSpaceIn    = cmsGetColorSpace(hProfile);
+            ColorSpaceOut   = cmsGetPCS(hProfile);
+        }
+        else {
+
+            ColorSpaceIn    = cmsGetPCS(hProfile);
+            ColorSpaceOut   = cmsGetColorSpace(hProfile);
+        }
+
+        if (!ColorSpaceIsCompatible(ColorSpaceIn, CurrentColorSpace)) {
+
+            cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "ColorSpace mismatch");
+            goto Error;
+        }
+
+        // If devicelink is found, then no custom intent is allowed and we can
+        // read the LUT to be applied. Settings don't apply here.
+        if (lIsDeviceLink || ((ClassSig == cmsSigNamedColorClass) && (nProfiles == 1))) {
+
+            // Get the involved LUT from the profile
+            Lut = _cmsReadDevicelinkLUT(hProfile, Intent);
+            if (Lut == NULL) goto Error;
+
+            // What about abstract profiles?
+             if (ClassSig == cmsSigAbstractClass && i > 0) {
+                if (!ComputeConversion(i, hProfiles, Intent, BPC[i], AdaptationStates[i], &m, &off)) goto Error;
+             }
+             else {
+                _cmsMAT3identity(&m);
+                _cmsVEC3init(&off, 0, 0, 0);
+             }
+
+
+            if (!AddConversion(Result, CurrentColorSpace, ColorSpaceIn, &m, &off)) goto Error;
+
+        }
+        else {
+
+            if (lIsInput) {
+                // Input direction means non-pcs connection, so proceed like devicelinks
+                Lut = _cmsReadInputLUT(hProfile, Intent);
+                if (Lut == NULL) goto Error;
+            }
+            else {
+
+                // Output direction means PCS connection. Intent may apply here
+                Lut = _cmsReadOutputLUT(hProfile, Intent);
+                if (Lut == NULL) goto Error;
+
+
+                if (!ComputeConversion(i, hProfiles, Intent, BPC[i], AdaptationStates[i], &m, &off)) goto Error;
+                if (!AddConversion(Result, CurrentColorSpace, ColorSpaceIn, &m, &off)) goto Error;
+
+            }
+        }
+
+        // Concatenate to the output LUT
+        if (!cmsPipelineCat(Result, Lut))
+            goto Error;
+
+        cmsPipelineFree(Lut);
+        Lut = NULL;
+
+        // Update current space
+        CurrentColorSpace = ColorSpaceOut;
+    }
+
+    return Result;
+
+Error:
+
+    if (Lut != NULL) cmsPipelineFree(Lut);
+    if (Result != NULL) cmsPipelineFree(Result);
+    return NULL;
+
+    cmsUNUSED_PARAMETER(dwFlags);
+}
+
+
+// Wrapper for DLL calling convention
+cmsPipeline*  CMSEXPORT _cmsDefaultICCintents(cmsContext     ContextID,
+                                              cmsUInt32Number nProfiles,
+                                              cmsUInt32Number TheIntents[],
+                                              cmsHPROFILE     hProfiles[],
+                                              cmsBool         BPC[],
+                                              cmsFloat64Number AdaptationStates[],
+                                              cmsUInt32Number dwFlags)
+{
+    return DefaultICCintents(ContextID, nProfiles, TheIntents, hProfiles, BPC, AdaptationStates, dwFlags);
+}
+
+// Black preserving intents ---------------------------------------------------------------------------------------------
+
+// Translate black-preserving intents to ICC ones
+static
+int TranslateNonICCIntents(int Intent)
+{
+    switch (Intent) {
+        case INTENT_PRESERVE_K_ONLY_PERCEPTUAL:
+        case INTENT_PRESERVE_K_PLANE_PERCEPTUAL:
+            return INTENT_PERCEPTUAL;
+
+        case INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC:
+        case INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC:
+            return INTENT_RELATIVE_COLORIMETRIC;
+
+        case INTENT_PRESERVE_K_ONLY_SATURATION:
+        case INTENT_PRESERVE_K_PLANE_SATURATION:
+            return INTENT_SATURATION;
+
+        default: return Intent;
+    }
+}
+
+// Sampler for Black-only preserving CMYK->CMYK transforms
+
+typedef struct {
+    cmsPipeline*    cmyk2cmyk;      // The original transform
+    cmsToneCurve*   KTone;          // Black-to-black tone curve
+
+} GrayOnlyParams;
+
+
+// Preserve black only if that is the only ink used
+static
+int BlackPreservingGrayOnlySampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+    GrayOnlyParams* bp = (GrayOnlyParams*) Cargo;
+
+    // If going across black only, keep black only
+    if (In[0] == 0 && In[1] == 0 && In[2] == 0) {
+
+        // TAC does not apply because it is black ink!
+        Out[0] = Out[1] = Out[2] = 0;
+        Out[3] = cmsEvalToneCurve16(bp->KTone, In[3]);
+        return TRUE;
+    }
+
+    // Keep normal transform for other colors
+    bp ->cmyk2cmyk ->Eval16Fn(In, Out, bp ->cmyk2cmyk->Data);
+    return TRUE;
+}
+
+// This is the entry for black-preserving K-only intents, which are non-ICC
+static
+cmsPipeline*  BlackPreservingKOnlyIntents(cmsContext     ContextID,
+                                          cmsUInt32Number nProfiles,
+                                          cmsUInt32Number TheIntents[],
+                                          cmsHPROFILE     hProfiles[],
+                                          cmsBool         BPC[],
+                                          cmsFloat64Number AdaptationStates[],
+                                          cmsUInt32Number dwFlags)
+{
+    GrayOnlyParams  bp;
+    cmsPipeline*    Result;
+    cmsUInt32Number ICCIntents[256];
+    cmsStage*         CLUT;
+    cmsUInt32Number i, nGridPoints;
+
+
+    // Sanity check
+    if (nProfiles < 1 || nProfiles > 255) return NULL;
+
+    // Translate black-preserving intents to ICC ones
+    for (i=0; i < nProfiles; i++)
+        ICCIntents[i] = TranslateNonICCIntents(TheIntents[i]);
+
+    // Check for non-cmyk profiles
+    if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData ||
+        cmsGetColorSpace(hProfiles[nProfiles-1]) != cmsSigCmykData)
+           return DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags);
+
+    memset(&bp, 0, sizeof(bp));
+
+    // Allocate an empty LUT for holding the result
+    Result = cmsPipelineAlloc(ContextID, 4, 4);
+    if (Result == NULL) return NULL;
+
+    // Create a LUT holding normal ICC transform
+    bp.cmyk2cmyk = DefaultICCintents(ContextID,
+        nProfiles,
+        ICCIntents,
+        hProfiles,
+        BPC,
+        AdaptationStates,
+        dwFlags);
+
+    if (bp.cmyk2cmyk == NULL) goto Error;
+
+    // Now, compute the tone curve
+    bp.KTone = _cmsBuildKToneCurve(ContextID,
+        4096,
+        nProfiles,
+        ICCIntents,
+        hProfiles,
+        BPC,
+        AdaptationStates,
+        dwFlags);
+
+    if (bp.KTone == NULL) goto Error;
+
+
+    // How many gridpoints are we going to use?
+    nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigCmykData, dwFlags);
+
+    // Create the CLUT. 16 bits
+    CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL);
+    if (CLUT == NULL) goto Error;
+
+    // This is the one and only MPE in this LUT
+    if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT))
+        goto Error;
+
+    // Sample it. We cannot afford pre/post linearization this time.
+    if (!cmsStageSampleCLut16bit(CLUT, BlackPreservingGrayOnlySampler, (void*) &bp, 0))
+        goto Error;
+
+    // Get rid of xform and tone curve
+    cmsPipelineFree(bp.cmyk2cmyk);
+    cmsFreeToneCurve(bp.KTone);
+
+    return Result;
+
+Error:
+
+    if (bp.cmyk2cmyk != NULL) cmsPipelineFree(bp.cmyk2cmyk);
+    if (bp.KTone != NULL)  cmsFreeToneCurve(bp.KTone);
+    if (Result != NULL) cmsPipelineFree(Result);
+    return NULL;
+
+}
+
+// K Plane-preserving CMYK to CMYK ------------------------------------------------------------------------------------
+
+typedef struct {
+
+    cmsPipeline*     cmyk2cmyk;     // The original transform
+    cmsHTRANSFORM    hProofOutput;  // Output CMYK to Lab (last profile)
+    cmsHTRANSFORM    cmyk2Lab;      // The input chain
+    cmsToneCurve*    KTone;         // Black-to-black tone curve
+    cmsPipeline*     LabK2cmyk;     // The output profile
+    cmsFloat64Number MaxError;
+
+    cmsHTRANSFORM    hRoundTrip;
+    cmsFloat64Number MaxTAC;
+
+
+} PreserveKPlaneParams;
+
+
+// The CLUT will be stored at 16 bits, but calculations are performed at cmsFloat32Number precision
+static
+int BlackPreservingSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+    int i;
+    cmsFloat32Number Inf[4], Outf[4];
+    cmsFloat32Number LabK[4];
+    cmsFloat64Number SumCMY, SumCMYK, Error, Ratio;
+    cmsCIELab ColorimetricLab, BlackPreservingLab;
+    PreserveKPlaneParams* bp = (PreserveKPlaneParams*) Cargo;
+
+    // Convert from 16 bits to floating point
+    for (i=0; i < 4; i++)
+        Inf[i] = (cmsFloat32Number) (In[i] / 65535.0);
+
+    // Get the K across Tone curve
+    LabK[3] = cmsEvalToneCurveFloat(bp ->KTone, Inf[3]);
+
+    // If going across black only, keep black only
+    if (In[0] == 0 && In[1] == 0 && In[2] == 0) {
+
+        Out[0] = Out[1] = Out[2] = 0;
+        Out[3] = _cmsQuickSaturateWord(LabK[3] * 65535.0);
+        return TRUE;
+    }
+
+    // Try the original transform,
+    cmsPipelineEvalFloat( Inf, Outf, bp ->cmyk2cmyk);
+
+    // Store a copy of the floating point result into 16-bit
+    for (i=0; i < 4; i++)
+            Out[i] = _cmsQuickSaturateWord(Outf[i] * 65535.0);
+
+    // Maybe K is already ok (mostly on K=0)
+    if ( fabs(Outf[3] - LabK[3]) < (3.0 / 65535.0) ) {
+        return TRUE;
+    }
+
+    // K differ, mesure and keep Lab measurement for further usage
+    // this is done in relative colorimetric intent
+    cmsDoTransform(bp->hProofOutput, Out, &ColorimetricLab, 1);
+
+    // Is not black only and the transform doesn't keep black.
+    // Obtain the Lab of output CMYK. After that we have Lab + K
+    cmsDoTransform(bp ->cmyk2Lab, Outf, LabK, 1);
+
+    // Obtain the corresponding CMY using reverse interpolation
+    // (K is fixed in LabK[3])
+    if (!cmsPipelineEvalReverseFloat(LabK, Outf, Outf, bp ->LabK2cmyk)) {
+
+        // Cannot find a suitable value, so use colorimetric xform
+        // which is already stored in Out[]
+        return TRUE;
+    }
+
+    // Make sure to pass thru K (which now is fixed)
+    Outf[3] = LabK[3];
+
+    // Apply TAC if needed
+    SumCMY   = Outf[0]  + Outf[1] + Outf[2];
+    SumCMYK  = SumCMY + Outf[3];
+
+    if (SumCMYK > bp ->MaxTAC) {
+
+        Ratio = 1 - ((SumCMYK - bp->MaxTAC) / SumCMY);
+        if (Ratio < 0)
+            Ratio = 0;
+    }
+    else
+       Ratio = 1.0;
+
+    Out[0] = _cmsQuickSaturateWord(Outf[0] * Ratio * 65535.0);     // C
+    Out[1] = _cmsQuickSaturateWord(Outf[1] * Ratio * 65535.0);     // M
+    Out[2] = _cmsQuickSaturateWord(Outf[2] * Ratio * 65535.0);     // Y
+    Out[3] = _cmsQuickSaturateWord(Outf[3] * 65535.0);
+
+    // Estimate the error (this goes 16 bits to Lab DBL)
+    cmsDoTransform(bp->hProofOutput, Out, &BlackPreservingLab, 1);
+    Error = cmsDeltaE(&ColorimetricLab, &BlackPreservingLab);
+    if (Error > bp -> MaxError)
+        bp->MaxError = Error;
+
+    return TRUE;
+}
+
+// This is the entry for black-plane preserving, which are non-ICC
+static
+cmsPipeline* BlackPreservingKPlaneIntents(cmsContext     ContextID,
+                                          cmsUInt32Number nProfiles,
+                                          cmsUInt32Number TheIntents[],
+                                          cmsHPROFILE     hProfiles[],
+                                          cmsBool         BPC[],
+                                          cmsFloat64Number AdaptationStates[],
+                                          cmsUInt32Number dwFlags)
+{
+    PreserveKPlaneParams bp;
+    cmsPipeline*    Result = NULL;
+    cmsUInt32Number ICCIntents[256];
+    cmsStage*         CLUT;
+    cmsUInt32Number i, nGridPoints;
+    cmsHPROFILE hLab;
+
+    // Sanity check
+    if (nProfiles < 1 || nProfiles > 255) return NULL;
+
+    // Translate black-preserving intents to ICC ones
+    for (i=0; i < nProfiles; i++)
+        ICCIntents[i] = TranslateNonICCIntents(TheIntents[i]);
+
+    // Check for non-cmyk profiles
+    if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData ||
+        !(cmsGetColorSpace(hProfiles[nProfiles-1]) == cmsSigCmykData ||
+        cmsGetDeviceClass(hProfiles[nProfiles-1]) == cmsSigOutputClass))
+           return  DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags);
+
+    // Allocate an empty LUT for holding the result
+    Result = cmsPipelineAlloc(ContextID, 4, 4);
+    if (Result == NULL) return NULL;
+
+
+    memset(&bp, 0, sizeof(bp));
+
+    // We need the input LUT of the last profile, assuming this one is responsible of
+    // black generation. This LUT will be seached in inverse order.
+    bp.LabK2cmyk = _cmsReadInputLUT(hProfiles[nProfiles-1], INTENT_RELATIVE_COLORIMETRIC);
+    if (bp.LabK2cmyk == NULL) goto Cleanup;
+
+    // Get total area coverage (in 0..1 domain)
+    bp.MaxTAC = cmsDetectTAC(hProfiles[nProfiles-1]) / 100.0;
+    if (bp.MaxTAC <= 0) goto Cleanup;
+
+
+    // Create a LUT holding normal ICC transform
+    bp.cmyk2cmyk = DefaultICCintents(ContextID,
+                                         nProfiles,
+                                         ICCIntents,
+                                         hProfiles,
+                                         BPC,
+                                         AdaptationStates,
+                                         dwFlags);
+    if (bp.cmyk2cmyk == NULL) goto Cleanup;
+
+    // Now the tone curve
+    bp.KTone = _cmsBuildKToneCurve(ContextID, 4096, nProfiles,
+                                   ICCIntents,
+                                   hProfiles,
+                                   BPC,
+                                   AdaptationStates,
+                                   dwFlags);
+    if (bp.KTone == NULL) goto Cleanup;
+
+    // To measure the output, Last profile to Lab
+    hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
+    bp.hProofOutput = cmsCreateTransformTHR(ContextID, hProfiles[nProfiles-1],
+                                         CHANNELS_SH(4)|BYTES_SH(2), hLab, TYPE_Lab_DBL,
+                                         INTENT_RELATIVE_COLORIMETRIC,
+                                         cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE);
+    if ( bp.hProofOutput == NULL) goto Cleanup;
+
+    // Same as anterior, but lab in the 0..1 range
+    bp.cmyk2Lab = cmsCreateTransformTHR(ContextID, hProfiles[nProfiles-1],
+                                         FLOAT_SH(1)|CHANNELS_SH(4)|BYTES_SH(4), hLab,
+                                         FLOAT_SH(1)|CHANNELS_SH(3)|BYTES_SH(4),
+                                         INTENT_RELATIVE_COLORIMETRIC,
+                                         cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE);
+    if (bp.cmyk2Lab == NULL) goto Cleanup;
+    cmsCloseProfile(hLab);
+
+    // Error estimation (for debug only)
+    bp.MaxError = 0;
+
+    // How many gridpoints are we going to use?
+    nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigCmykData, dwFlags);
+
+
+    CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL);
+    if (CLUT == NULL) goto Cleanup;
+
+    if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT))
+        goto Cleanup;
+
+    cmsStageSampleCLut16bit(CLUT, BlackPreservingSampler, (void*) &bp, 0);
+
+Cleanup:
+
+    if (bp.cmyk2cmyk) cmsPipelineFree(bp.cmyk2cmyk);
+    if (bp.cmyk2Lab) cmsDeleteTransform(bp.cmyk2Lab);
+    if (bp.hProofOutput) cmsDeleteTransform(bp.hProofOutput);
+
+    if (bp.KTone) cmsFreeToneCurve(bp.KTone);
+    if (bp.LabK2cmyk) cmsPipelineFree(bp.LabK2cmyk);
+
+    return Result;
+}
+
+// Link routines ------------------------------------------------------------------------------------------------------
+
+// Chain several profiles into a single LUT. It just checks the parameters and then calls the handler
+// for the first intent in chain. The handler may be user-defined. Is up to the handler to deal with the
+// rest of intents in chain. A maximum of 255 profiles at time are supported, which is pretty reasonable.
+cmsPipeline* _cmsLinkProfiles(cmsContext     ContextID,
+                              cmsUInt32Number nProfiles,
+                              cmsUInt32Number TheIntents[],
+                              cmsHPROFILE     hProfiles[],
+                              cmsBool         BPC[],
+                              cmsFloat64Number AdaptationStates[],
+                              cmsUInt32Number dwFlags)
+{
+    cmsUInt32Number i;
+    cmsIntentsList* Intent;
+
+    // Make sure a reasonable number of profiles is provided
+    if (nProfiles <= 0 || nProfiles > 255) {
+         cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't link '%d' profiles", nProfiles);
+        return NULL;
+    }
+
+    for (i=0; i < nProfiles; i++) {
+
+        // Check if black point is really needed or allowed. Note that
+        // following Adobe's document:
+        // BPC does not apply to devicelink profiles, nor to abs colorimetric,
+        // and applies always on V4 perceptual and saturation.
+
+        if (TheIntents[i] == INTENT_ABSOLUTE_COLORIMETRIC)
+            BPC[i] = FALSE;
+
+        if (TheIntents[i] == INTENT_PERCEPTUAL || TheIntents[i] == INTENT_SATURATION) {
+
+            // Force BPC for V4 profiles in perceptual and saturation
+            if (cmsGetProfileVersion(hProfiles[i]) >= 4.0)
+                BPC[i] = TRUE;
+        }
+    }
+
+    // Search for a handler. The first intent in the chain defines the handler. That would
+    // prevent using multiple custom intents in a multiintent chain, but the behaviour of
+    // this case would present some issues if the custom intent tries to do things like
+    // preserve primaries. This solution is not perfect, but works well on most cases.
+
+    Intent = SearchIntent(ContextID, TheIntents[0]);
+    if (Intent == NULL) {
+        cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported intent '%d'", TheIntents[0]);
+        return NULL;
+    }
+
+    // Call the handler
+    return Intent ->Link(ContextID, nProfiles, TheIntents, hProfiles, BPC, AdaptationStates, dwFlags);
+}
+
+// -------------------------------------------------------------------------------------------------
+
+// Get information about available intents. nMax is the maximum space for the supplied "Codes"
+// and "Descriptions" the function returns the total number of intents, which may be greater
+// than nMax, although the matrices are not populated beyond this level.
+cmsUInt32Number CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions)
+{
+    _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin);
+    cmsIntentsList* pt;
+    cmsUInt32Number nIntents;
+
+
+    for (nIntents=0, pt = ctx->Intents; pt != NULL; pt = pt -> Next)
+    {
+        if (nIntents < nMax) {
+            if (Codes != NULL)
+                Codes[nIntents] = pt ->Intent;
+
+            if (Descriptions != NULL)
+                Descriptions[nIntents] = pt ->Description;
+        }
+
+        nIntents++;
+    }
+
+    for (nIntents=0, pt = DefaultIntents; pt != NULL; pt = pt -> Next)
+    {
+        if (nIntents < nMax) {
+            if (Codes != NULL)
+                Codes[nIntents] = pt ->Intent;
+
+            if (Descriptions != NULL)
+                Descriptions[nIntents] = pt ->Description;
+        }
+
+        nIntents++;
+    }
+    return nIntents;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions)
+{
+    return cmsGetSupportedIntentsTHR(NULL, nMax, Codes, Descriptions);
+}
+
+// The plug-in registration. User can add new intents or override default routines
+cmsBool  _cmsRegisterRenderingIntentPlugin(cmsContext id, cmsPluginBase* Data)
+{
+    _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(id, IntentPlugin);
+    cmsPluginRenderingIntent* Plugin = (cmsPluginRenderingIntent*) Data;
+    cmsIntentsList* fl;
+
+    // Do we have to reset the custom intents?
+    if (Data == NULL) {
+
+        ctx->Intents = NULL;
+        return TRUE;
+    }
+
+    fl = (cmsIntentsList*) _cmsPluginMalloc(id, sizeof(cmsIntentsList));
+    if (fl == NULL) return FALSE;
+
+
+    fl ->Intent  = Plugin ->Intent;
+    strncpy(fl ->Description, Plugin ->Description, sizeof(fl ->Description)-1);
+    fl ->Description[sizeof(fl ->Description)-1] = 0;
+
+    fl ->Link    = Plugin ->Link;
+
+    fl ->Next = ctx ->Intents;
+    ctx ->Intents = fl;
+
+    return TRUE;
+}
+
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c
new file mode 100644
index 0000000..745238c
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c
@@ -0,0 +1,707 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+
+#include "lcms2_internal.h"
+
+// I am so tired about incompatibilities on those functions that here are some replacements
+// that hopefully would be fully portable.
+
+// compare two strings ignoring case
+int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2)
+{
+    register const unsigned char *us1 = (const unsigned char *)s1,
+                                 *us2 = (const unsigned char *)s2;
+
+    while (toupper(*us1) == toupper(*us2++))
+        if (*us1++ == '\0')
+            return 0;
+
+    return (toupper(*us1) - toupper(*--us2));
+}
+
+// long int because C99 specifies ftell in such way (7.19.9.2)
+long int CMSEXPORT cmsfilelength(FILE* f)
+{
+    long int p , n;
+
+    p = ftell(f); // register current file position
+
+    if (fseek(f, 0, SEEK_END) != 0) {
+        return -1;
+    }
+
+    n = ftell(f);
+    fseek(f, p, SEEK_SET); // file position restored
+
+    return n;
+}
+
+#if 0
+// Memory handling ------------------------------------------------------------------
+//
+// This is the interface to low-level memory management routines. By default a simple
+// wrapping to malloc/free/realloc is provided, although there is a limit on the max
+// amount of memoy that can be reclaimed. This is mostly as a safety feature to prevent 
+// bogus or evil code to allocate huge blocks that otherwise lcms would never need.
+
+#define MAX_MEMORY_FOR_ALLOC  ((cmsUInt32Number)(1024U*1024U*512U))
+
+// User may override this behaviour by using a memory plug-in, which basically replaces
+// the default memory management functions. In this case, no check is performed and it
+// is up to the plug-in writter to keep in the safe side. There are only three functions
+// required to be implemented: malloc, realloc and free, although the user may want to
+// replace the optional mallocZero, calloc and dup as well.
+
+cmsBool   _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// *********************************************************************************
+
+// This is the default memory allocation function. It does a very coarse
+// check of amout of memory, just to prevent exploits
+static
+void* _cmsMallocDefaultFn(cmsContext ContextID, cmsUInt32Number size)
+{
+    if (size > MAX_MEMORY_FOR_ALLOC) return NULL;  // Never allow over maximum
+
+    return (void*) malloc(size);
+
+    cmsUNUSED_PARAMETER(ContextID);
+}
+
+// Generic allocate & zero
+static
+void* _cmsMallocZeroDefaultFn(cmsContext ContextID, cmsUInt32Number size)
+{
+    void *pt = _cmsMalloc(ContextID, size);
+    if (pt == NULL) return NULL;
+
+    memset(pt, 0, size);
+    return pt;
+}
+
+
+// The default free function. The only check proformed is against NULL pointers
+static
+void _cmsFreeDefaultFn(cmsContext ContextID, void *Ptr)
+{
+    // free(NULL) is defined a no-op by C99, therefore it is safe to
+    // avoid the check, but it is here just in case...
+
+    if (Ptr) free(Ptr);
+
+    cmsUNUSED_PARAMETER(ContextID);
+}
+
+// The default realloc function. Again it checks for exploits. If Ptr is NULL,
+// realloc behaves the same way as malloc and allocates a new block of size bytes.
+static
+void* _cmsReallocDefaultFn(cmsContext ContextID, void* Ptr, cmsUInt32Number size)
+{
+
+    if (size > MAX_MEMORY_FOR_ALLOC) return NULL;  // Never realloc over 512Mb
+
+    return realloc(Ptr, size);
+
+    cmsUNUSED_PARAMETER(ContextID);
+}
+
+
+// The default calloc function. Allocates an array of num elements, each one of size bytes
+// all memory is initialized to zero.
+static
+void* _cmsCallocDefaultFn(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size)
+{
+    cmsUInt32Number Total = num * size;
+
+    // Preserve calloc behaviour
+    if (Total == 0) return NULL;
+
+    // Safe check for overflow.
+    if (num >= UINT_MAX / size) return NULL;
+
+    // Check for overflow
+    if (Total < num || Total < size) {
+        return NULL;
+    }
+
+    if (Total > MAX_MEMORY_FOR_ALLOC) return NULL;  // Never alloc over 512Mb
+
+    return _cmsMallocZero(ContextID, Total);
+}
+
+// Generic block duplication
+static
+void* _cmsDupDefaultFn(cmsContext ContextID, const void* Org, cmsUInt32Number size)
+{
+    void* mem;
+
+    if (size > MAX_MEMORY_FOR_ALLOC) return NULL;  // Never dup over 512Mb
+
+    mem = _cmsMalloc(ContextID, size);
+
+    if (mem != NULL && Org != NULL)
+        memmove(mem, Org, size);
+
+    return mem;
+}
+
+
+// Pointers to memory manager functions in Context0
+_cmsMemPluginChunkType _cmsMemPluginChunk = { _cmsMallocDefaultFn, _cmsMallocZeroDefaultFn, _cmsFreeDefaultFn, 
+                                              _cmsReallocDefaultFn, _cmsCallocDefaultFn,    _cmsDupDefaultFn
+                                            };
+
+
+// Reset and duplicate memory manager
+void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src)
+{
+    _cmsAssert(ctx != NULL);
+
+    if (src != NULL) {    
+
+        // Duplicate
+        ctx ->chunks[MemPlugin] = _cmsSubAllocDup(ctx ->MemPool, src ->chunks[MemPlugin], sizeof(_cmsMemPluginChunkType));  
+    }
+    else {
+
+        // To reset it, we use the default allocators, which cannot be overriden
+        ctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager;
+    } 
+}
+
+// Auxiliar to fill memory management functions from plugin (or context 0 defaults)
+void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr)
+{
+    if (Plugin == NULL) {
+
+        memcpy(ptr, &_cmsMemPluginChunk, sizeof(_cmsMemPluginChunk));
+    }
+    else {
+
+        ptr ->MallocPtr  = Plugin -> MallocPtr;
+        ptr ->FreePtr    = Plugin -> FreePtr;
+        ptr ->ReallocPtr = Plugin -> ReallocPtr;
+
+        // Make sure we revert to defaults
+        ptr ->MallocZeroPtr= _cmsMallocZeroDefaultFn;
+        ptr ->CallocPtr    = _cmsCallocDefaultFn;
+        ptr ->DupPtr       = _cmsDupDefaultFn;
+      
+        if (Plugin ->MallocZeroPtr != NULL) ptr ->MallocZeroPtr = Plugin -> MallocZeroPtr;
+        if (Plugin ->CallocPtr != NULL)     ptr ->CallocPtr     = Plugin -> CallocPtr;
+        if (Plugin ->DupPtr != NULL)        ptr ->DupPtr        = Plugin -> DupPtr;
+        
+    }
+}
+
+
+// Plug-in replacement entry
+cmsBool  _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase *Data)
+{
+    cmsPluginMemHandler* Plugin = (cmsPluginMemHandler*) Data;     
+    _cmsMemPluginChunkType* ptr;
+
+    // NULL forces to reset to defaults. In this special case, the defaults are stored in the context structure. 
+    // Remaining plug-ins does NOT have any copy in the context structure, but this is somehow special as the
+    // context internal data should be malloce'd by using those functions. 
+    if (Data == NULL) {
+
+       struct _cmsContext_struct* ctx = ( struct _cmsContext_struct*) ContextID;
+
+       // Return to the default allocators
+        if (ContextID != NULL) {
+            ctx->chunks[MemPlugin] = (void*) &ctx->DefaultMemoryManager;
+        }
+        return TRUE;
+    }
+
+    // Check for required callbacks
+    if (Plugin -> MallocPtr == NULL ||
+        Plugin -> FreePtr == NULL ||
+        Plugin -> ReallocPtr == NULL) return FALSE;
+
+    // Set replacement functions
+    ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin);
+    if (ptr == NULL) 
+        return FALSE;
+
+    _cmsInstallAllocFunctions(Plugin, ptr);
+    return TRUE;
+}
+#else
+#include "../../../../../include/fxcrt/fx_system.h"
+#include "../../../../../include/fxcrt/fx_memory.h"
+
+cmsBool  _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin)
+{
+	return TRUE;
+}
+
+// Generic allocate
+void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size)

+{

+    return FXMEM_DefaultAlloc(size, FXMEM_NONLEAVE);

+}

+

+// Generic allocate & zero

+void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size)

+{

+	void* p = FXMEM_DefaultAlloc(size, FXMEM_NONLEAVE);

+	if (p) FXSYS_memset32(p, 0, size);

+	return p;

+}

+

+// Generic calloc

+void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size)

+{

+	cmsUInt32Number total = num * size;

+	if (total == 0 || total / size != num || total >= 512 * 1024 * 1024)

+		return NULL;

+

+	return _cmsMallocZero(ContextID, num * size);

+}

+

+// Generic reallocate

+void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number size)

+{

+	return FXMEM_DefaultRealloc(Ptr, size, FXMEM_NONLEAVE);

+}

+

+// Generic free memory

+void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr)

+{

+	if (Ptr != NULL) FXMEM_DefaultFree(Ptr, 0);

+}

+

+// Generic block duplication

+void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size)

+{

+	void* p = FXMEM_DefaultAlloc(size, FXMEM_NONLEAVE);

+	FXSYS_memmove32(p, Org, size);

+	return p;

+}
+
+_cmsMemPluginChunkType _cmsMemPluginChunk = {_cmsMalloc, _cmsMallocZero, _cmsFree, 

+	                                         _cmsRealloc, _cmsCalloc,    _cmsDupMem
+                                            };
+
+void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src)
+{
+	_cmsAssert(ctx != NULL);
+
+	if (src != NULL) {    
+
+		// Duplicate
+		ctx ->chunks[MemPlugin] = _cmsSubAllocDup(ctx ->MemPool, src ->chunks[MemPlugin], sizeof(_cmsMemPluginChunkType));  
+	}
+	else {
+
+		// To reset it, we use the default allocators, which cannot be overriden
+		ctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager;
+	} 
+}
+
+void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr)
+{
+	if (Plugin == NULL) {
+
+		memcpy(ptr, &_cmsMemPluginChunk, sizeof(_cmsMemPluginChunk));
+	}
+	else {
+
+		ptr ->MallocPtr  = Plugin -> MallocPtr;
+		ptr ->FreePtr    = Plugin -> FreePtr;
+		ptr ->ReallocPtr = Plugin -> ReallocPtr;
+
+		// Make sure we revert to defaults
+		ptr ->MallocZeroPtr= _cmsMallocZero;
+		ptr ->CallocPtr    = _cmsCalloc;
+		ptr ->DupPtr       = _cmsDupMem;
+
+		if (Plugin ->MallocZeroPtr != NULL) ptr ->MallocZeroPtr = Plugin -> MallocZeroPtr;
+		if (Plugin ->CallocPtr != NULL)     ptr ->CallocPtr     = Plugin -> CallocPtr;
+		if (Plugin ->DupPtr != NULL)        ptr ->DupPtr        = Plugin -> DupPtr;
+
+	}
+}
+#endif
+
+// ********************************************************************************************
+
+// Sub allocation takes care of many pointers of small size. The memory allocated in
+// this way have be freed at once. Next function allocates a single chunk for linked list
+// I prefer this method over realloc due to the big inpact on xput realloc may have if
+// memory is being swapped to disk. This approach is safer (although that may not be true on all platforms)
+static
+_cmsSubAllocator_chunk* _cmsCreateSubAllocChunk(cmsContext ContextID, cmsUInt32Number Initial)
+{
+    _cmsSubAllocator_chunk* chunk;
+
+    // 20K by default
+    if (Initial == 0)
+        Initial = 20*1024;
+
+    // Create the container
+    chunk = (_cmsSubAllocator_chunk*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator_chunk));
+    if (chunk == NULL) return NULL;
+
+    // Initialize values
+    chunk ->Block     = (cmsUInt8Number*) _cmsMalloc(ContextID, Initial);
+    if (chunk ->Block == NULL) {
+
+        // Something went wrong
+        _cmsFree(ContextID, chunk);
+        return NULL;
+    }
+
+    chunk ->BlockSize = Initial;
+    chunk ->Used      = 0;
+    chunk ->next      = NULL;
+
+    return chunk;
+}
+
+// The suballocated is nothing but a pointer to the first element in the list. We also keep
+// the thread ID in this structure.
+_cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial)
+{
+    _cmsSubAllocator* sub;
+
+    // Create the container
+    sub = (_cmsSubAllocator*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator));
+    if (sub == NULL) return NULL;
+
+    sub ->ContextID = ContextID;
+
+    sub ->h = _cmsCreateSubAllocChunk(ContextID, Initial);
+    if (sub ->h == NULL) {
+        _cmsFree(ContextID, sub);
+        return NULL;
+    }
+
+    return sub;
+}
+
+
+// Get rid of whole linked list
+void _cmsSubAllocDestroy(_cmsSubAllocator* sub)
+{
+    _cmsSubAllocator_chunk *chunk, *n;
+
+    for (chunk = sub ->h; chunk != NULL; chunk = n) {
+
+        n = chunk->next;
+        if (chunk->Block != NULL) _cmsFree(sub ->ContextID, chunk->Block);
+        _cmsFree(sub ->ContextID, chunk);
+    }
+
+    // Free the header
+    _cmsFree(sub ->ContextID, sub);
+}
+
+
+// Get a pointer to small memory block.
+void*  _cmsSubAlloc(_cmsSubAllocator* sub, cmsUInt32Number size)
+{
+    cmsUInt32Number Free = sub -> h ->BlockSize - sub -> h -> Used;
+    cmsUInt8Number* ptr;
+
+    size = _cmsALIGNMEM(size);
+
+    // Check for memory. If there is no room, allocate a new chunk of double memory size.
+    if (size > Free) {
+
+        _cmsSubAllocator_chunk* chunk;
+        cmsUInt32Number newSize;
+
+        newSize = sub -> h ->BlockSize * 2;
+        if (newSize < size) newSize = size;
+
+        chunk = _cmsCreateSubAllocChunk(sub -> ContextID, newSize);
+        if (chunk == NULL) return NULL;
+
+        // Link list
+        chunk ->next = sub ->h;
+        sub ->h    = chunk;
+
+    }
+
+    ptr =  sub -> h ->Block + sub -> h ->Used;
+    sub -> h -> Used += size;
+
+    return (void*) ptr;
+}
+
+// Duplicate in pool
+void* _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size)
+{
+    void *NewPtr;
+    
+    // Dup of null pointer is also NULL
+    if (ptr == NULL)
+        return NULL;
+
+    NewPtr = _cmsSubAlloc(s, size);
+
+    if (ptr != NULL && NewPtr != NULL) {
+        memcpy(NewPtr, ptr, size);
+    }
+
+    return NewPtr;
+}
+
+
+
+// Error logging ******************************************************************
+
+// There is no error handling at all. When a funtion fails, it returns proper value.
+// For example, all create functions does return NULL on failure. Other return FALSE
+// It may be interesting, for the developer, to know why the function is failing.
+// for that reason, lcms2 does offer a logging function. This function does recive
+// a ENGLISH string with some clues on what is going wrong. You can show this
+// info to the end user, or just create some sort of log.
+// The logging function should NOT terminate the program, as this obviously can leave
+// resources. It is the programmer's responsability to check each function return code
+// to make sure it didn't fail.
+
+// Error messages are limited to MAX_ERROR_MESSAGE_LEN
+
+#define MAX_ERROR_MESSAGE_LEN   1024
+
+// ---------------------------------------------------------------------------------------------------------
+
+// This is our default log error
+static void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text);
+
+// Context0 storage, which is global
+_cmsLogErrorChunkType _cmsLogErrorChunk = { DefaultLogErrorHandlerFunction };
+
+// Allocates and inits error logger container for a given context. If src is NULL, only initializes the value
+// to the default. Otherwise, it duplicates the value. The interface is standard across all context clients
+void _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx, 
+                            const struct _cmsContext_struct* src)
+{    
+    static _cmsLogErrorChunkType LogErrorChunk = { DefaultLogErrorHandlerFunction };
+    void* from;
+     
+     if (src != NULL) {
+        from = src ->chunks[Logger];       
+    }
+    else {
+       from = &LogErrorChunk;
+    }
+    
+    ctx ->chunks[Logger] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsLogErrorChunkType));   
+}
+
+// The default error logger does nothing.
+static
+void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text)
+{
+    // fprintf(stderr, "[lcms]: %s\n", Text);
+    // fflush(stderr);
+
+     cmsUNUSED_PARAMETER(ContextID);
+     cmsUNUSED_PARAMETER(ErrorCode);
+     cmsUNUSED_PARAMETER(Text);
+}
+
+// Change log error, context based
+void CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn)
+{
+    _cmsLogErrorChunkType* lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger);
+
+    if (lhg != NULL) {
+
+        if (Fn == NULL)
+            lhg -> LogErrorHandler = DefaultLogErrorHandlerFunction;
+        else
+            lhg -> LogErrorHandler = Fn;
+    }
+}
+
+// Change log error, legacy
+void CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn)
+{
+    cmsSetLogErrorHandlerTHR(NULL, Fn);    
+}
+
+// Log an error
+// ErrorText is a text holding an english description of error.
+void CMSEXPORT cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...)
+{
+    va_list args;
+    char Buffer[MAX_ERROR_MESSAGE_LEN];
+    _cmsLogErrorChunkType* lhg;
+
+
+    va_start(args, ErrorText);
+    vsnprintf(Buffer, MAX_ERROR_MESSAGE_LEN-1, ErrorText, args);
+    va_end(args);
+
+    // Check for the context, if specified go there. If not, go for the global
+    lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger);
+    if (lhg ->LogErrorHandler) {
+        lhg ->LogErrorHandler(ContextID, ErrorCode, Buffer);
+    }   
+}
+
+// Utility function to print signatures
+void _cmsTagSignature2String(char String[5], cmsTagSignature sig)
+{
+    cmsUInt32Number be;
+
+    // Convert to big endian
+    be = _cmsAdjustEndianess32((cmsUInt32Number) sig);
+
+    // Move chars
+    memmove(String, &be, 4);
+
+    // Make sure of terminator
+    String[4] = 0;
+}
+
+//--------------------------------------------------------------------------------------------------
+
+
+static
+void* defMtxCreate(cmsContext id)
+{
+    _cmsMutex* ptr_mutex = (_cmsMutex*) _cmsMalloc(id, sizeof(_cmsMutex));
+    _cmsInitMutexPrimitive(ptr_mutex);
+    return (void*) ptr_mutex;   
+}
+
+static
+void defMtxDestroy(cmsContext id, void* mtx)
+{
+    _cmsDestroyMutexPrimitive((_cmsMutex *) mtx); 
+    _cmsFree(id, mtx);
+}
+
+static
+cmsBool defMtxLock(cmsContext id, void* mtx)
+{
+    cmsUNUSED_PARAMETER(id);
+    return _cmsLockPrimitive((_cmsMutex *) mtx) == 0;     
+}
+
+static
+void defMtxUnlock(cmsContext id, void* mtx)
+{
+    cmsUNUSED_PARAMETER(id);
+    _cmsUnlockPrimitive((_cmsMutex *) mtx); 
+}
+
+
+
+// Pointers to memory manager functions in Context0
+_cmsMutexPluginChunkType _cmsMutexPluginChunk = { defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock };
+
+// Allocate and init mutex container.
+void _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx, 
+                                        const struct _cmsContext_struct* src)
+{
+    static _cmsMutexPluginChunkType MutexChunk = {defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock };
+    void* from;
+     
+     if (src != NULL) {
+        from = src ->chunks[MutexPlugin];       
+    }
+    else {
+       from = &MutexChunk;
+    }
+    
+    ctx ->chunks[MutexPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsMutexPluginChunkType));   
+}
+
+// Register new ways to transform
+cmsBool  _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Data)
+{
+    cmsPluginMutex* Plugin = (cmsPluginMutex*) Data;
+    _cmsMutexPluginChunkType* ctx = ( _cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
+
+    if (Data == NULL) {
+
+        // No lock routines
+        ctx->CreateMutexPtr = NULL; 
+        ctx->DestroyMutexPtr = NULL; 
+        ctx->LockMutexPtr = NULL;
+        ctx ->UnlockMutexPtr = NULL;
+        return TRUE;
+    }
+
+    // Factory callback is required
+    if (Plugin ->CreateMutexPtr == NULL || Plugin ->DestroyMutexPtr == NULL || 
+        Plugin ->LockMutexPtr == NULL || Plugin ->UnlockMutexPtr == NULL) return FALSE;
+
+
+    ctx->CreateMutexPtr  = Plugin->CreateMutexPtr;
+    ctx->DestroyMutexPtr = Plugin ->DestroyMutexPtr;
+    ctx ->LockMutexPtr   = Plugin ->LockMutexPtr;
+    ctx ->UnlockMutexPtr = Plugin ->UnlockMutexPtr;
+
+    // All is ok
+    return TRUE;
+}
+
+// Generic Mutex fns
+void* CMSEXPORT _cmsCreateMutex(cmsContext ContextID)
+{
+    _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
+
+    if (ptr ->CreateMutexPtr == NULL) return NULL;
+
+    return ptr ->CreateMutexPtr(ContextID);
+}
+
+void CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx)
+{
+    _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
+
+    if (ptr ->DestroyMutexPtr != NULL) {
+
+        ptr ->DestroyMutexPtr(ContextID, mtx);
+    }
+}
+
+cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx)
+{
+    _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
+
+    if (ptr ->LockMutexPtr == NULL) return TRUE;
+
+    return ptr ->LockMutexPtr(ContextID, mtx);
+}
+
+void CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx)
+{
+    _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
+
+    if (ptr ->UnlockMutexPtr != NULL) {
+
+        ptr ->UnlockMutexPtr(ContextID, mtx);
+    }
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgamma.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgamma.c
new file mode 100644
index 0000000..d5aa87b
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgamma.c
@@ -0,0 +1,1298 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2013 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// Tone curves are powerful constructs that can contain curves specified in diverse ways.
+// The curve is stored in segments, where each segment can be sampled or specified by parameters.
+// a 16.bit simplification of the *whole* curve is kept for optimization purposes. For float operation,
+// each segment is evaluated separately. Plug-ins may be used to define new parametric schemes,
+// each plug-in may define up to MAX_TYPES_IN_LCMS_PLUGIN functions types. For defining a function,
+// the plug-in should provide the type id, how many parameters each type has, and a pointer to
+// a procedure that evaluates the function. In the case of reverse evaluation, the evaluator will
+// be called with the type id as a negative value, and a sampled version of the reversed curve
+// will be built.
+
+// ----------------------------------------------------------------- Implementation
+// Maxim number of nodes
+#define MAX_NODES_IN_CURVE   4097
+#define MINUS_INF            (-1E22F)
+#define PLUS_INF             (+1E22F)
+
+// The list of supported parametric curves
+typedef struct _cmsParametricCurvesCollection_st {
+
+    int nFunctions;                                     // Number of supported functions in this chunk
+    int FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN];        // The identification types
+    int ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN];       // Number of parameters for each function
+    cmsParametricCurveEvaluator    Evaluator;           // The evaluator
+
+    struct _cmsParametricCurvesCollection_st* Next; // Next in list
+
+} _cmsParametricCurvesCollection;
+
+// This is the default (built-in) evaluator
+static cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R);
+
+// The built-in list
+static _cmsParametricCurvesCollection DefaultCurves = {
+    9,                                  // # of curve types
+    { 1, 2, 3, 4, 5, 6, 7, 8, 108 },    // Parametric curve ID
+    { 1, 3, 4, 5, 7, 4, 5, 5, 1 },      // Parameters by type
+    DefaultEvalParametricFn,            // Evaluator
+    NULL                                // Next in chain
+};
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupPluginCurvesList(struct _cmsContext_struct* ctx, 
+                                               const struct _cmsContext_struct* src)
+{
+   _cmsCurvesPluginChunkType newHead = { NULL };
+   _cmsParametricCurvesCollection*  entry;
+   _cmsParametricCurvesCollection*  Anterior = NULL;
+   _cmsCurvesPluginChunkType* head = (_cmsCurvesPluginChunkType*) src->chunks[CurvesPlugin];
+
+    _cmsAssert(head != NULL);
+
+    // Walk the list copying all nodes
+   for (entry = head->ParametricCurves;
+        entry != NULL;
+        entry = entry ->Next) {
+
+            _cmsParametricCurvesCollection *newEntry = ( _cmsParametricCurvesCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsParametricCurvesCollection));
+   
+            if (newEntry == NULL) 
+                return;
+
+            // We want to keep the linked list order, so this is a little bit tricky
+            newEntry -> Next = NULL;
+            if (Anterior)
+                Anterior -> Next = newEntry;
+     
+            Anterior = newEntry;
+
+            if (newHead.ParametricCurves == NULL)
+                newHead.ParametricCurves = newEntry;
+    }
+
+  ctx ->chunks[CurvesPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsCurvesPluginChunkType));
+}
+
+// The allocator have to follow the chain
+void _cmsAllocCurvesPluginChunk(struct _cmsContext_struct* ctx, 
+                                const struct _cmsContext_struct* src)
+{
+    _cmsAssert(ctx != NULL);
+
+    if (src != NULL) {
+
+        // Copy all linked list
+       DupPluginCurvesList(ctx, src);
+    }
+    else {
+        static _cmsCurvesPluginChunkType CurvesPluginChunk = { NULL };
+        ctx ->chunks[CurvesPlugin] = _cmsSubAllocDup(ctx ->MemPool, &CurvesPluginChunk, sizeof(_cmsCurvesPluginChunkType));
+    }
+}
+
+
+// The linked list head
+_cmsCurvesPluginChunkType _cmsCurvesPluginChunk = { NULL };
+
+// As a way to install new parametric curves
+cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Data)
+{
+    _cmsCurvesPluginChunkType* ctx = ( _cmsCurvesPluginChunkType*) _cmsContextGetClientChunk(ContextID, CurvesPlugin);
+    cmsPluginParametricCurves* Plugin = (cmsPluginParametricCurves*) Data;
+    _cmsParametricCurvesCollection* fl;
+
+    if (Data == NULL) {
+
+          ctx -> ParametricCurves =  NULL;
+          return TRUE;
+    }
+
+    fl = (_cmsParametricCurvesCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsParametricCurvesCollection));
+    if (fl == NULL) return FALSE;
+
+    // Copy the parameters
+    fl ->Evaluator  = Plugin ->Evaluator;
+    fl ->nFunctions = Plugin ->nFunctions;
+
+    // Make sure no mem overwrites
+    if (fl ->nFunctions > MAX_TYPES_IN_LCMS_PLUGIN)
+        fl ->nFunctions = MAX_TYPES_IN_LCMS_PLUGIN;
+
+    // Copy the data
+    memmove(fl->FunctionTypes,  Plugin ->FunctionTypes,   fl->nFunctions * sizeof(cmsUInt32Number));
+    memmove(fl->ParameterCount, Plugin ->ParameterCount,  fl->nFunctions * sizeof(cmsUInt32Number));
+
+    // Keep linked list
+    fl ->Next = ctx->ParametricCurves;
+    ctx->ParametricCurves = fl;
+
+    // All is ok
+    return TRUE;
+}
+
+
+// Search in type list, return position or -1 if not found
+static
+int IsInSet(int Type, _cmsParametricCurvesCollection* c)
+{
+    int i;
+
+    for (i=0; i < c ->nFunctions; i++)
+        if (abs(Type) == c ->FunctionTypes[i]) return i;
+
+    return -1;
+}
+
+
+// Search for the collection which contains a specific type
+static
+_cmsParametricCurvesCollection *GetParametricCurveByType(cmsContext ContextID, int Type, int* index)
+{
+    _cmsParametricCurvesCollection* c;
+    int Position;
+    _cmsCurvesPluginChunkType* ctx = ( _cmsCurvesPluginChunkType*) _cmsContextGetClientChunk(ContextID, CurvesPlugin);
+
+    for (c = ctx->ParametricCurves; c != NULL; c = c ->Next) {
+
+        Position = IsInSet(Type, c);
+
+        if (Position != -1) {
+            if (index != NULL)
+                *index = Position;
+            return c;
+        }
+    }
+    // If none found, revert for defaults
+    for (c = &DefaultCurves; c != NULL; c = c ->Next) {
+
+        Position = IsInSet(Type, c);
+
+        if (Position != -1) {
+            if (index != NULL)
+                *index = Position;
+            return c;
+        }
+    }
+
+    return NULL;
+}
+
+// Low level allocate, which takes care of memory details. nEntries may be zero, and in this case
+// no optimation curve is computed. nSegments may also be zero in the inverse case, where only the
+// optimization curve is given. Both features simultaneously is an error
+static
+cmsToneCurve* AllocateToneCurveStruct(cmsContext ContextID, cmsInt32Number nEntries,
+                                      cmsInt32Number nSegments, const cmsCurveSegment* Segments,
+                                      const cmsUInt16Number* Values)
+{
+    cmsToneCurve* p;
+    int i;
+
+    // We allow huge tables, which are then restricted for smoothing operations
+    if (nEntries > 65530 || nEntries < 0) {
+        cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't create tone curve of more than 65530 entries");
+        return NULL;
+    }
+
+    if (nEntries <= 0 && nSegments <= 0) {
+        cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't create tone curve with zero segments and no table");
+        return NULL;
+    }
+
+    // Allocate all required pointers, etc.
+    p = (cmsToneCurve*) _cmsMallocZero(ContextID, sizeof(cmsToneCurve));
+    if (!p) return NULL;
+
+    // In this case, there are no segments
+    if (nSegments <= 0) {
+        p ->Segments = NULL;
+        p ->Evals = NULL;
+    }
+    else {
+        p ->Segments = (cmsCurveSegment*) _cmsCalloc(ContextID, nSegments, sizeof(cmsCurveSegment));
+        if (p ->Segments == NULL) goto Error;
+
+        p ->Evals    = (cmsParametricCurveEvaluator*) _cmsCalloc(ContextID, nSegments, sizeof(cmsParametricCurveEvaluator));
+        if (p ->Evals == NULL) goto Error;
+    }
+
+    p -> nSegments = nSegments;
+
+    // This 16-bit table contains a limited precision representation of the whole curve and is kept for
+    // increasing xput on certain operations.
+    if (nEntries <= 0) {
+        p ->Table16 = NULL;
+    }
+    else {
+       p ->Table16 = (cmsUInt16Number*)  _cmsCalloc(ContextID, nEntries, sizeof(cmsUInt16Number));
+       if (p ->Table16 == NULL) goto Error;
+    }
+
+    p -> nEntries  = nEntries;
+
+    // Initialize members if requested
+    if (Values != NULL && (nEntries > 0)) {
+
+        for (i=0; i < nEntries; i++)
+            p ->Table16[i] = Values[i];
+    }
+
+    // Initialize the segments stuff. The evaluator for each segment is located and a pointer to it
+    // is placed in advance to maximize performance.
+    if (Segments != NULL && (nSegments > 0)) {
+
+        _cmsParametricCurvesCollection *c;
+
+        p ->SegInterp = (cmsInterpParams**) _cmsCalloc(ContextID, nSegments, sizeof(cmsInterpParams*));
+        if (p ->SegInterp == NULL) goto Error;
+
+        for (i=0; i< nSegments; i++) {
+
+            // Type 0 is a special marker for table-based curves
+            if (Segments[i].Type == 0)
+                p ->SegInterp[i] = _cmsComputeInterpParams(ContextID, Segments[i].nGridPoints, 1, 1, NULL, CMS_LERP_FLAGS_FLOAT);
+
+            memmove(&p ->Segments[i], &Segments[i], sizeof(cmsCurveSegment));
+
+            if (Segments[i].Type == 0 && Segments[i].SampledPoints != NULL)
+                p ->Segments[i].SampledPoints = (cmsFloat32Number*) _cmsDupMem(ContextID, Segments[i].SampledPoints, sizeof(cmsFloat32Number) * Segments[i].nGridPoints);
+            else
+                p ->Segments[i].SampledPoints = NULL;
+
+
+            c = GetParametricCurveByType(ContextID, Segments[i].Type, NULL);
+            if (c != NULL)
+                    p ->Evals[i] = c ->Evaluator;
+        }
+    }
+
+    p ->InterpParams = _cmsComputeInterpParams(ContextID, p ->nEntries, 1, 1, p->Table16, CMS_LERP_FLAGS_16BITS);
+    if (p->InterpParams != NULL)
+        return p;
+
+Error:
+    if (p -> Segments) _cmsFree(ContextID, p ->Segments);
+    if (p -> Evals) _cmsFree(ContextID, p -> Evals);
+    if (p ->Table16) _cmsFree(ContextID, p ->Table16);
+    _cmsFree(ContextID, p);
+    return NULL;
+}
+
+
+// Parametric Fn using floating point
+static
+cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R)
+{
+    cmsFloat64Number e, Val, disc;
+
+    switch (Type) {
+
+   // X = Y ^ Gamma
+    case 1:
+        if (R < 0) {
+
+            if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE)
+                Val = R;
+            else
+                Val = 0;
+        }
+        else
+            Val = pow(R, Params[0]);
+        break;
+
+    // Type 1 Reversed: X = Y ^1/gamma
+    case -1:
+         if (R < 0) {
+
+            if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE)
+                Val = R;
+            else
+                Val = 0;
+        }
+        else
+            Val = pow(R, 1/Params[0]);
+        break;
+
+    // CIE 122-1966
+    // Y = (aX + b)^Gamma  | X >= -b/a
+    // Y = 0               | else
+    case 2:
+        disc = -Params[2] / Params[1];
+
+        if (R >= disc ) {
+
+            e = Params[1]*R + Params[2];
+
+            if (e > 0)
+                Val = pow(e, Params[0]);
+            else
+                Val = 0;
+        }
+        else
+            Val = 0;
+        break;
+
+     // Type 2 Reversed
+     // X = (Y ^1/g  - b) / a
+     case -2:
+         if (R < 0)
+             Val = 0;
+         else
+             Val = (pow(R, 1.0/Params[0]) - Params[2]) / Params[1];
+
+         if (Val < 0)
+              Val = 0;
+         break;
+
+
+    // IEC 61966-3
+    // Y = (aX + b)^Gamma | X <= -b/a
+    // Y = c              | else
+    case 3:
+        disc = -Params[2] / Params[1];
+        if (disc < 0)
+            disc = 0;
+
+        if (R >= disc) {
+
+            e = Params[1]*R + Params[2];
+
+            if (e > 0)
+                Val = pow(e, Params[0]) + Params[3];
+            else
+                Val = 0;
+        }
+        else
+            Val = Params[3];
+        break;
+
+
+    // Type 3 reversed
+    // X=((Y-c)^1/g - b)/a      | (Y>=c)
+    // X=-b/a                   | (Y<c)
+    case -3:
+        if (R >= Params[3])  {
+
+            e = R - Params[3];
+
+            if (e > 0)
+                Val = (pow(e, 1/Params[0]) - Params[2]) / Params[1];
+            else
+                Val = 0;
+        }
+        else {
+            Val = -Params[2] / Params[1];
+        }
+        break;
+
+
+    // IEC 61966-2.1 (sRGB)
+    // Y = (aX + b)^Gamma | X >= d
+    // Y = cX             | X < d
+    case 4:
+        if (R >= Params[4]) {
+
+            e = Params[1]*R + Params[2];
+
+            if (e > 0)
+                Val = pow(e, Params[0]);
+            else
+                Val = 0;
+        }
+        else
+            Val = R * Params[3];
+        break;
+
+    // Type 4 reversed
+    // X=((Y^1/g-b)/a)    | Y >= (ad+b)^g
+    // X=Y/c              | Y< (ad+b)^g
+    case -4:
+        e = Params[1] * Params[4] + Params[2];
+        if (e < 0)
+            disc = 0;
+        else
+            disc = pow(e, Params[0]);
+
+        if (R >= disc) {
+
+            Val = (pow(R, 1.0/Params[0]) - Params[2]) / Params[1];
+        }
+        else {
+            Val = R / Params[3];
+        }
+        break;
+
+
+    // Y = (aX + b)^Gamma + e | X >= d
+    // Y = cX + f             | X < d
+    case 5:
+        if (R >= Params[4]) {
+
+            e = Params[1]*R + Params[2];
+
+            if (e > 0)
+                Val = pow(e, Params[0]) + Params[5];
+            else
+                Val = Params[5];
+        }
+        else
+            Val = R*Params[3] + Params[6];
+        break;
+
+
+    // Reversed type 5
+    // X=((Y-e)1/g-b)/a   | Y >=(ad+b)^g+e), cd+f
+    // X=(Y-f)/c          | else
+    case -5:
+
+        disc = Params[3] * Params[4] + Params[6];
+        if (R >= disc) {
+
+            e = R - Params[5];
+            if (e < 0)
+                Val = 0;
+            else
+                Val = (pow(e, 1.0/Params[0]) - Params[2]) / Params[1];
+        }
+        else {
+            Val = (R - Params[6]) / Params[3];
+        }
+        break;
+
+
+    // Types 6,7,8 comes from segmented curves as described in ICCSpecRevision_02_11_06_Float.pdf
+    // Type 6 is basically identical to type 5 without d
+
+    // Y = (a * X + b) ^ Gamma + c
+    case 6:
+        e = Params[1]*R + Params[2];
+
+        if (e < 0)
+            Val = Params[3];
+        else
+            Val = pow(e, Params[0]) + Params[3];
+        break;
+
+    // ((Y - c) ^1/Gamma - b) / a
+    case -6:
+        e = R - Params[3];
+        if (e < 0)
+            Val = 0;
+        else
+        Val = (pow(e, 1.0/Params[0]) - Params[2]) / Params[1];
+        break;
+
+
+    // Y = a * log (b * X^Gamma + c) + d
+    case 7:
+
+       e = Params[2] * pow(R, Params[0]) + Params[3];
+       if (e <= 0)
+           Val = Params[4];
+       else
+           Val = Params[1]*log10(e) + Params[4];
+       break;
+
+    // (Y - d) / a = log(b * X ^Gamma + c)
+    // pow(10, (Y-d) / a) = b * X ^Gamma + c
+    // pow((pow(10, (Y-d) / a) - c) / b, 1/g) = X
+    case -7:
+       Val = pow((pow(10.0, (R-Params[4]) / Params[1]) - Params[3]) / Params[2], 1.0 / Params[0]);
+       break;
+
+
+   //Y = a * b^(c*X+d) + e
+   case 8:
+       Val = (Params[0] * pow(Params[1], Params[2] * R + Params[3]) + Params[4]);
+       break;
+
+
+   // Y = (log((y-e) / a) / log(b) - d ) / c
+   // a=0, b=1, c=2, d=3, e=4,
+   case -8:
+
+       disc = R - Params[4];
+       if (disc < 0) Val = 0;
+       else
+           Val = (log(disc / Params[0]) / log(Params[1]) - Params[3]) / Params[2];
+       break;
+
+   // S-Shaped: (1 - (1-x)^1/g)^1/g
+   case 108:
+      Val = pow(1.0 - pow(1 - R, 1/Params[0]), 1/Params[0]);
+      break;
+
+    // y = (1 - (1-x)^1/g)^1/g
+    // y^g = (1 - (1-x)^1/g)
+    // 1 - y^g = (1-x)^1/g
+    // (1 - y^g)^g = 1 - x
+    // 1 - (1 - y^g)^g
+    case -108:
+        Val = 1 - pow(1 - pow(R, Params[0]), Params[0]);
+        break;
+
+    default:
+        // Unsupported parametric curve. Should never reach here
+        return 0;
+    }
+
+    return Val;
+}
+
+// Evaluate a segmented funtion for a single value. Return -1 if no valid segment found .
+// If fn type is 0, perform an interpolation on the table
+static
+cmsFloat64Number EvalSegmentedFn(const cmsToneCurve *g, cmsFloat64Number R)
+{
+    int i;
+
+    for (i = g ->nSegments-1; i >= 0 ; --i) {
+
+        // Check for domain
+        if ((R > g ->Segments[i].x0) && (R <= g ->Segments[i].x1)) {
+
+            // Type == 0 means segment is sampled
+            if (g ->Segments[i].Type == 0) {
+
+                cmsFloat32Number R1 = (cmsFloat32Number) (R - g ->Segments[i].x0) / (g ->Segments[i].x1 - g ->Segments[i].x0);
+                cmsFloat32Number Out;
+
+                // Setup the table (TODO: clean that)
+                g ->SegInterp[i]-> Table = g ->Segments[i].SampledPoints;
+
+                g ->SegInterp[i] -> Interpolation.LerpFloat(&R1, &Out, g ->SegInterp[i]);
+
+                return Out;
+            }
+            else
+                return g ->Evals[i](g->Segments[i].Type, g ->Segments[i].Params, R);
+        }
+    }
+
+    return MINUS_INF;
+}
+
+// Access to estimated low-res table
+cmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t)
+{
+    _cmsAssert(t != NULL);
+    return t ->nEntries;
+}
+
+const cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t)
+{
+    _cmsAssert(t != NULL);
+    return t ->Table16;
+}
+
+
+// Create an empty gamma curve, by using tables. This specifies only the limited-precision part, and leaves the
+// floating point description empty.
+cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsInt32Number nEntries, const cmsUInt16Number Values[])
+{
+    return AllocateToneCurveStruct(ContextID, nEntries, 0, NULL, Values);
+}
+
+static
+int EntriesByGamma(cmsFloat64Number Gamma)
+{
+    if (fabs(Gamma - 1.0) < 0.001) return 2;
+    return 4096;
+}
+
+
+// Create a segmented gamma, fill the table
+cmsToneCurve* CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID,
+                                                   cmsInt32Number nSegments, const cmsCurveSegment Segments[])
+{
+    int i;
+    cmsFloat64Number R, Val;
+    cmsToneCurve* g;
+    int nGridPoints = 4096;
+
+    _cmsAssert(Segments != NULL);
+
+    // Optimizatin for identity curves.
+    if (nSegments == 1 && Segments[0].Type == 1) {
+
+        nGridPoints = EntriesByGamma(Segments[0].Params[0]);
+    }
+
+    g = AllocateToneCurveStruct(ContextID, nGridPoints, nSegments, Segments, NULL);
+    if (g == NULL) return NULL;
+
+    // Once we have the floating point version, we can approximate a 16 bit table of 4096 entries
+    // for performance reasons. This table would normally not be used except on 8/16 bits transforms.
+    for (i=0; i < nGridPoints; i++) {
+
+        R   = (cmsFloat64Number) i / (nGridPoints-1);
+
+        Val = EvalSegmentedFn(g, R);
+
+        // Round and saturate
+        g ->Table16[i] = _cmsQuickSaturateWord(Val * 65535.0);
+    }
+
+    return g;
+}
+
+// Use a segmented curve to store the floating point table
+cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[])
+{
+    cmsCurveSegment Seg[3];
+
+    // A segmented tone curve should have function segments in the first and last positions
+    // Initialize segmented curve part up to 0 to constant value = samples[0]
+    Seg[0].x0 = MINUS_INF;
+    Seg[0].x1 = 0;
+    Seg[0].Type = 6;
+
+    Seg[0].Params[0] = 1;
+    Seg[0].Params[1] = 0;
+    Seg[0].Params[2] = 0;
+    Seg[0].Params[3] = values[0];
+    Seg[0].Params[4] = 0;
+
+    // From zero to 1
+    Seg[1].x0 = 0;
+    Seg[1].x1 = 1.0;
+    Seg[1].Type = 0;
+
+    Seg[1].nGridPoints = nEntries;
+    Seg[1].SampledPoints = (cmsFloat32Number*) values;
+
+    // Final segment is constant = lastsample
+    Seg[2].x0 = 1.0;
+    Seg[2].x1 = PLUS_INF;
+    Seg[2].Type = 6;
+    
+    Seg[2].Params[0] = 1;
+    Seg[2].Params[1] = 0;
+    Seg[2].Params[2] = 0;
+    Seg[2].Params[3] = values[nEntries-1];
+    Seg[2].Params[4] = 0;
+    
+
+    return cmsBuildSegmentedToneCurve(ContextID, 3, Seg);
+}
+
+// Parametric curves
+//
+// Parameters goes as: Curve, a, b, c, d, e, f
+// Type is the ICC type +1
+// if type is negative, then the curve is analyticaly inverted
+cmsToneCurve* CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[])
+{
+    cmsCurveSegment Seg0;
+    int Pos = 0;
+    cmsUInt32Number size;
+    _cmsParametricCurvesCollection* c = GetParametricCurveByType(ContextID, Type, &Pos);
+
+    _cmsAssert(Params != NULL);
+
+    if (c == NULL) {
+        cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Invalid parametric curve type %d", Type);
+        return NULL;
+    }
+
+    memset(&Seg0, 0, sizeof(Seg0));
+
+    Seg0.x0   = MINUS_INF;
+    Seg0.x1   = PLUS_INF;
+    Seg0.Type = Type;
+
+    size = c->ParameterCount[Pos] * sizeof(cmsFloat64Number);
+    memmove(Seg0.Params, Params, size);
+
+    return cmsBuildSegmentedToneCurve(ContextID, 1, &Seg0);
+}
+
+
+
+// Build a gamma table based on gamma constant
+cmsToneCurve* CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma)
+{
+    return cmsBuildParametricToneCurve(ContextID, 1, &Gamma);
+}
+
+
+// Free all memory taken by the gamma curve
+void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve)
+{
+    cmsContext ContextID;
+
+	// added by Xiaochuan Liu
+	// Curve->InterpParams may be null
+    if (Curve == NULL || Curve->InterpParams == NULL) return;
+
+    ContextID = Curve ->InterpParams->ContextID;
+
+    _cmsFreeInterpParams(Curve ->InterpParams);
+	Curve ->InterpParams = NULL;
+
+    if (Curve -> Table16)
+	{
+        _cmsFree(ContextID, Curve ->Table16);
+		Curve ->Table16 = NULL;
+	}
+
+    if (Curve ->Segments) {
+
+        cmsUInt32Number i;
+
+        for (i=0; i < Curve ->nSegments; i++) {
+
+            if (Curve ->Segments[i].SampledPoints) {
+                _cmsFree(ContextID, Curve ->Segments[i].SampledPoints);
+				Curve ->Segments[i].SampledPoints = NULL;
+            }
+
+            if (Curve ->SegInterp[i] != 0)
+			{
+                _cmsFreeInterpParams(Curve->SegInterp[i]);
+				Curve->SegInterp[i] = NULL;
+			}
+        }
+
+        _cmsFree(ContextID, Curve ->Segments);
+		Curve ->Segments = NULL;
+        _cmsFree(ContextID, Curve ->SegInterp);
+		Curve ->SegInterp = NULL;
+    }
+
+    if (Curve -> Evals)
+	{
+        _cmsFree(ContextID, Curve -> Evals);
+		Curve -> Evals = NULL;
+	}
+
+    if (Curve)
+	{
+		_cmsFree(ContextID, Curve);
+		Curve = NULL;
+	}
+}
+
+// Utility function, free 3 gamma tables
+void CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3])
+{
+
+    _cmsAssert(Curve != NULL);
+
+    if (Curve[0] != NULL) cmsFreeToneCurve(Curve[0]);
+    if (Curve[1] != NULL) cmsFreeToneCurve(Curve[1]);
+    if (Curve[2] != NULL) cmsFreeToneCurve(Curve[2]);
+
+    Curve[0] = Curve[1] = Curve[2] = NULL;
+}
+
+
+// Duplicate a gamma table
+cmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* In)
+{   
+	// Xiaochuan Liu
+	// fix openpdf bug(mantis id:0055683, google id:360198)
+	// the function CurveSetElemTypeFree in cmslut.c also needs to check pointer
+    if (In == NULL || In ->InterpParams == NULL) return NULL;
+
+    return  AllocateToneCurveStruct(In ->InterpParams ->ContextID, In ->nEntries, In ->nSegments, In ->Segments, In ->Table16);
+}
+
+// Joins two curves for X and Y. Curves should be monotonic.
+// We want to get
+//
+//      y = Y^-1(X(t))
+//
+cmsToneCurve* CMSEXPORT cmsJoinToneCurve(cmsContext ContextID,
+                                      const cmsToneCurve* X,
+                                      const cmsToneCurve* Y, cmsUInt32Number nResultingPoints)
+{
+    cmsToneCurve* out = NULL;
+    cmsToneCurve* Yreversed = NULL;
+    cmsFloat32Number t, x;
+    cmsFloat32Number* Res = NULL;
+    cmsUInt32Number i;
+
+
+    _cmsAssert(X != NULL);
+    _cmsAssert(Y != NULL);
+
+    Yreversed = cmsReverseToneCurveEx(nResultingPoints, Y);
+    if (Yreversed == NULL) goto Error;
+
+    Res = (cmsFloat32Number*) _cmsCalloc(ContextID, nResultingPoints, sizeof(cmsFloat32Number));
+    if (Res == NULL) goto Error;
+
+    //Iterate
+    for (i=0; i <  nResultingPoints; i++) {
+
+        t = (cmsFloat32Number) i / (nResultingPoints-1);
+        x = cmsEvalToneCurveFloat(X,  t);
+        Res[i] = cmsEvalToneCurveFloat(Yreversed, x);
+    }
+
+    // Allocate space for output
+    out = cmsBuildTabulatedToneCurveFloat(ContextID, nResultingPoints, Res);
+
+Error:
+
+    if (Res != NULL) _cmsFree(ContextID, Res);
+    if (Yreversed != NULL) cmsFreeToneCurve(Yreversed);
+
+    return out;
+}
+
+
+
+// Get the surrounding nodes. This is tricky on non-monotonic tables
+static
+int GetInterval(cmsFloat64Number In, const cmsUInt16Number LutTable[], const struct _cms_interp_struc* p)
+{
+    int i;
+    int y0, y1;
+
+    // A 1 point table is not allowed
+    if (p -> Domain[0] < 1) return -1;
+
+    // Let's see if ascending or descending.
+    if (LutTable[0] < LutTable[p ->Domain[0]]) {
+
+        // Table is overall ascending
+        for (i=p->Domain[0]-1; i >=0; --i) {
+
+            y0 = LutTable[i];
+            y1 = LutTable[i+1];
+
+            if (y0 <= y1) { // Increasing
+                if (In >= y0 && In <= y1) return i;
+            }
+            else
+                if (y1 < y0) { // Decreasing
+                    if (In >= y1 && In <= y0) return i;
+                }
+        }
+    }
+    else {
+        // Table is overall descending
+        for (i=0; i < (int) p -> Domain[0]; i++) {
+
+            y0 = LutTable[i];
+            y1 = LutTable[i+1];
+
+            if (y0 <= y1) { // Increasing
+                if (In >= y0 && In <= y1) return i;
+            }
+            else
+                if (y1 < y0) { // Decreasing
+                    if (In >= y1 && In <= y0) return i;
+                }
+        }
+    }
+
+    return -1;
+}
+
+// Reverse a gamma table
+cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, const cmsToneCurve* InCurve)
+{
+    cmsToneCurve *out;
+    cmsFloat64Number a = 0, b = 0, y, x1, y1, x2, y2;
+    int i, j;
+    int Ascending;
+
+    _cmsAssert(InCurve != NULL);
+
+    // Try to reverse it analytically whatever possible
+ 
+    if (InCurve ->nSegments == 1 && InCurve ->Segments[0].Type > 0 && 
+        /* InCurve -> Segments[0].Type <= 5 */ 
+        GetParametricCurveByType(InCurve ->InterpParams->ContextID, InCurve ->Segments[0].Type, NULL) != NULL) {
+
+        return cmsBuildParametricToneCurve(InCurve ->InterpParams->ContextID,
+                                       -(InCurve -> Segments[0].Type),
+                                       InCurve -> Segments[0].Params);
+    }
+
+    // Nope, reverse the table.
+    out = cmsBuildTabulatedToneCurve16(InCurve ->InterpParams->ContextID, nResultSamples, NULL);
+    if (out == NULL)
+        return NULL;
+
+    // We want to know if this is an ascending or descending table
+    Ascending = !cmsIsToneCurveDescending(InCurve);
+
+    // Iterate across Y axis
+    for (i=0; i <  nResultSamples; i++) {
+
+        y = (cmsFloat64Number) i * 65535.0 / (nResultSamples - 1);
+
+        // Find interval in which y is within.
+        j = GetInterval(y, InCurve->Table16, InCurve->InterpParams);
+        if (j >= 0) {
+
+
+            // Get limits of interval
+            x1 = InCurve ->Table16[j];
+            x2 = InCurve ->Table16[j+1];
+
+            y1 = (cmsFloat64Number) (j * 65535.0) / (InCurve ->nEntries - 1);
+            y2 = (cmsFloat64Number) ((j+1) * 65535.0 ) / (InCurve ->nEntries - 1);
+
+            // If collapsed, then use any
+            if (x1 == x2) {
+
+                out ->Table16[i] = _cmsQuickSaturateWord(Ascending ? y2 : y1);
+                continue;
+
+            } else {
+
+                // Interpolate
+                a = (y2 - y1) / (x2 - x1);
+                b = y2 - a * x2;
+            }
+        }
+
+        out ->Table16[i] = _cmsQuickSaturateWord(a* y + b);
+    }
+
+
+    return out;
+}
+
+// Reverse a gamma table
+cmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma)
+{
+    _cmsAssert(InGamma != NULL);
+
+    return cmsReverseToneCurveEx(4096, InGamma);
+}
+
+// From: Eilers, P.H.C. (1994) Smoothing and interpolation with finite
+// differences. in: Graphic Gems IV, Heckbert, P.S. (ed.), Academic press.
+//
+// Smoothing and interpolation with second differences.
+//
+//   Input:  weights (w), data (y): vector from 1 to m.
+//   Input:  smoothing parameter (lambda), length (m).
+//   Output: smoothed vector (z): vector from 1 to m.
+
+static
+cmsBool smooth2(cmsContext ContextID, cmsFloat32Number w[], cmsFloat32Number y[], cmsFloat32Number z[], cmsFloat32Number lambda, int m)
+{
+    int i, i1, i2;
+    cmsFloat32Number *c, *d, *e;
+    cmsBool st;
+
+
+    c = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number));
+    d = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number));
+    e = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number));
+
+    if (c != NULL && d != NULL && e != NULL) {
+
+
+    d[1] = w[1] + lambda;
+    c[1] = -2 * lambda / d[1];
+    e[1] = lambda /d[1];
+    z[1] = w[1] * y[1];
+    d[2] = w[2] + 5 * lambda - d[1] * c[1] *  c[1];
+    c[2] = (-4 * lambda - d[1] * c[1] * e[1]) / d[2];
+    e[2] = lambda / d[2];
+    z[2] = w[2] * y[2] - c[1] * z[1];
+
+    for (i = 3; i < m - 1; i++) {
+        i1 = i - 1; i2 = i - 2;
+        d[i]= w[i] + 6 * lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2];
+        c[i] = (-4 * lambda -d[i1] * c[i1] * e[i1])/ d[i];
+        e[i] = lambda / d[i];
+        z[i] = w[i] * y[i] - c[i1] * z[i1] - e[i2] * z[i2];
+    }
+
+    i1 = m - 2; i2 = m - 3;
+
+    d[m - 1] = w[m - 1] + 5 * lambda -c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2];
+    c[m - 1] = (-2 * lambda - d[i1] * c[i1] * e[i1]) / d[m - 1];
+    z[m - 1] = w[m - 1] * y[m - 1] - c[i1] * z[i1] - e[i2] * z[i2];
+    i1 = m - 1; i2 = m - 2;
+
+    d[m] = w[m] + lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2];
+    z[m] = (w[m] * y[m] - c[i1] * z[i1] - e[i2] * z[i2]) / d[m];
+    z[m - 1] = z[m - 1] / d[m - 1] - c[m - 1] * z[m];
+
+    for (i = m - 2; 1<= i; i--)
+        z[i] = z[i] / d[i] - c[i] * z[i + 1] - e[i] * z[i + 2];
+
+      st = TRUE;
+    }
+    else st = FALSE;
+
+    if (c != NULL) _cmsFree(ContextID, c);
+    if (d != NULL) _cmsFree(ContextID, d);
+    if (e != NULL) _cmsFree(ContextID, e);
+
+    return st;
+}
+
+// Smooths a curve sampled at regular intervals.
+cmsBool  CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda)
+{
+    cmsFloat32Number w[MAX_NODES_IN_CURVE], y[MAX_NODES_IN_CURVE], z[MAX_NODES_IN_CURVE];
+    int i, nItems, Zeros, Poles;
+
+    if (Tab == NULL) return FALSE;
+
+    if (cmsIsToneCurveLinear(Tab)) return TRUE; // Nothing to do
+
+    nItems = Tab -> nEntries;
+
+    if (nItems >= MAX_NODES_IN_CURVE) {
+        cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: too many points.");
+        return FALSE;
+    }
+
+    memset(w, 0, nItems * sizeof(cmsFloat32Number));
+    memset(y, 0, nItems * sizeof(cmsFloat32Number));
+    memset(z, 0, nItems * sizeof(cmsFloat32Number));
+
+    for (i=0; i < nItems; i++)
+    {
+        y[i+1] = (cmsFloat32Number) Tab -> Table16[i];
+        w[i+1] = 1.0;
+    }
+
+    if (!smooth2(Tab ->InterpParams->ContextID, w, y, z, (cmsFloat32Number) lambda, nItems)) return FALSE;
+
+    // Do some reality - checking...
+    Zeros = Poles = 0;
+    for (i=nItems; i > 1; --i) {
+
+        if (z[i] == 0.) Zeros++;
+        if (z[i] >= 65535.) Poles++;
+        if (z[i] < z[i-1]) {
+            cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Non-Monotonic.");
+            return FALSE;
+        }
+    }
+
+    if (Zeros > (nItems / 3)) {
+        cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly zeros.");
+        return FALSE;
+    }
+    if (Poles > (nItems / 3)) {
+        cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly poles.");
+        return FALSE;
+    }
+
+    // Seems ok
+    for (i=0; i < nItems; i++) {
+
+        // Clamp to cmsUInt16Number
+        Tab -> Table16[i] = _cmsQuickSaturateWord(z[i+1]);
+    }
+
+    return TRUE;
+}
+
+// Is a table linear? Do not use parametric since we cannot guarantee some weird parameters resulting
+// in a linear table. This way assures it is linear in 12 bits, which should be enought in most cases.
+cmsBool CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve)
+{
+    cmsUInt32Number i;
+    int diff;
+
+    _cmsAssert(Curve != NULL);
+
+    for (i=0; i < Curve ->nEntries; i++) {
+
+        diff = abs((int) Curve->Table16[i] - (int) _cmsQuantizeVal(i, Curve ->nEntries));
+        if (diff > 0x0f)
+            return FALSE;
+    }
+
+    return TRUE;
+}
+
+// Same, but for monotonicity
+cmsBool  CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t)
+{
+    int n;
+    int i, last;
+    cmsBool lDescending;
+
+    _cmsAssert(t != NULL);
+
+    // Degenerated curves are monotonic? Ok, let's pass them
+    n = t ->nEntries;
+    if (n < 2) return TRUE;
+
+    // Curve direction
+    lDescending = cmsIsToneCurveDescending(t);
+
+    if (lDescending) {
+
+        last = t ->Table16[0];
+
+        for (i = 1; i < n; i++) {
+
+            if (t ->Table16[i] - last > 2) // We allow some ripple
+                return FALSE;
+            else
+                last = t ->Table16[i];
+
+        }
+    }
+    else {
+
+        last = t ->Table16[n-1];
+
+        for (i = n-2; i >= 0; --i) {
+
+            if (t ->Table16[i] - last > 2)
+                return FALSE;
+            else
+                last = t ->Table16[i];
+
+        }
+    }
+
+    return TRUE;
+}
+
+// Same, but for descending tables
+cmsBool  CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t)
+{
+    _cmsAssert(t != NULL);
+
+    return t ->Table16[0] > t ->Table16[t ->nEntries-1];
+}
+
+
+// Another info fn: is out gamma table multisegment?
+cmsBool  CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* t)
+{
+    _cmsAssert(t != NULL);
+
+    return t -> nSegments > 1;
+}
+
+cmsInt32Number  CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t)
+{
+    _cmsAssert(t != NULL);
+
+    if (t -> nSegments != 1) return 0;
+    return t ->Segments[0].Type;
+}
+
+// We need accuracy this time
+cmsFloat32Number CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v)
+{
+    _cmsAssert(Curve != NULL);
+
+    // Check for 16 bits table. If so, this is a limited-precision tone curve
+    if (Curve ->nSegments == 0) {
+
+        cmsUInt16Number In, Out;
+
+        In = (cmsUInt16Number) _cmsQuickSaturateWord(v * 65535.0);
+        Out = cmsEvalToneCurve16(Curve, In);
+
+        return (cmsFloat32Number) (Out / 65535.0);
+    }
+
+    return (cmsFloat32Number) EvalSegmentedFn(Curve, v);
+}
+
+// We need xput over here
+cmsUInt16Number CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v)
+{
+    cmsUInt16Number out;
+
+    _cmsAssert(Curve != NULL);
+
+    Curve ->InterpParams ->Interpolation.Lerp16(&v, &out, Curve ->InterpParams);
+    return out;
+}
+
+
+// Least squares fitting.
+// A mathematical procedure for finding the best-fitting curve to a given set of points by
+// minimizing the sum of the squares of the offsets ("the residuals") of the points from the curve.
+// The sum of the squares of the offsets is used instead of the offset absolute values because
+// this allows the residuals to be treated as a continuous differentiable quantity.
+//
+// y = f(x) = x ^ g
+//
+// R  = (yi - (xi^g))
+// R2 = (yi - (xi^g))2
+// SUM R2 = SUM (yi - (xi^g))2
+//
+// dR2/dg = -2 SUM x^g log(x)(y - x^g)
+// solving for dR2/dg = 0
+//
+// g = 1/n * SUM(log(y) / log(x))
+
+cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision)
+{
+    cmsFloat64Number gamma, sum, sum2;
+    cmsFloat64Number n, x, y, Std;
+    cmsUInt32Number i;
+
+    _cmsAssert(t != NULL);
+
+    sum = sum2 = n = 0;
+
+    // Excluding endpoints
+    for (i=1; i < (MAX_NODES_IN_CURVE-1); i++) {
+
+        x = (cmsFloat64Number) i / (MAX_NODES_IN_CURVE-1);
+        y = (cmsFloat64Number) cmsEvalToneCurveFloat(t, (cmsFloat32Number) x);
+
+        // Avoid 7% on lower part to prevent
+        // artifacts due to linear ramps
+
+        if (y > 0. && y < 1. && x > 0.07) {
+
+            gamma = log(y) / log(x);
+            sum  += gamma;
+            sum2 += gamma * gamma;
+            n++;
+        }
+    }
+
+    // Take a look on SD to see if gamma isn't exponential at all
+    Std = sqrt((n * sum2 - sum * sum) / (n*(n-1)));
+
+    if (Std > Precision)
+        return -1.0;
+
+    return (sum / n);   // The mean
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c
new file mode 100644
index 0000000..0942765
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c
@@ -0,0 +1,590 @@
+//---------------------------------------------------------------------------------

+//

+//  Little Color Management System

+//  Copyright (c) 1998-2012 Marti Maria Saguer

+//

+// Permission is hereby granted, free of charge, to any person obtaining

+// a copy of this software and associated documentation files (the "Software"),

+// to deal in the Software without restriction, including without limitation

+// the rights to use, copy, modify, merge, publish, distribute, sublicense,

+// and/or sell copies of the Software, and to permit persons to whom the Software

+// is furnished to do so, subject to the following conditions:

+//

+// The above copyright notice and this permission notice shall be included in

+// all copies or substantial portions of the Software.

+//

+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,

+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO

+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND

+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE

+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION

+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION

+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+//

+//---------------------------------------------------------------------------------

+//

+

+#include "lcms2_internal.h"

+

+

+// Auxiliar: append a Lab identity after the given sequence of profiles

+// and return the transform. Lab profile is closed, rest of profiles are kept open.

+cmsHTRANSFORM _cmsChain2Lab(cmsContext            ContextID,

+                            cmsUInt32Number        nProfiles,

+                            cmsUInt32Number        InputFormat,

+                            cmsUInt32Number        OutputFormat,

+                            const cmsUInt32Number  Intents[],

+                            const cmsHPROFILE      hProfiles[],

+                            const cmsBool          BPC[],

+                            const cmsFloat64Number AdaptationStates[],

+                            cmsUInt32Number        dwFlags)

+{

+    cmsHTRANSFORM xform;

+    cmsHPROFILE   hLab;

+    cmsHPROFILE   ProfileList[256];

+    cmsBool       BPCList[256];

+    cmsFloat64Number AdaptationList[256];

+    cmsUInt32Number IntentList[256];

+    cmsUInt32Number i;

+

+    // This is a rather big number and there is no need of dynamic memory

+    // since we are adding a profile, 254 + 1 = 255 and this is the limit

+    if (nProfiles > 254) return NULL;

+

+    // The output space

+    hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);

+    if (hLab == NULL) return NULL;

+

+    // Create a copy of parameters

+    for (i=0; i < nProfiles; i++) {

+

+        ProfileList[i]    = hProfiles[i];

+        BPCList[i]        = BPC[i];

+        AdaptationList[i] = AdaptationStates[i];

+        IntentList[i]     = Intents[i];

+    }

+

+    // Place Lab identity at chain's end.

+    ProfileList[nProfiles]    = hLab;

+    BPCList[nProfiles]        = 0;

+    AdaptationList[nProfiles] = 1.0;

+    IntentList[nProfiles]     = INTENT_RELATIVE_COLORIMETRIC;

+

+    // Create the transform

+    xform = cmsCreateExtendedTransform(ContextID, nProfiles + 1, ProfileList,

+                                       BPCList,

+                                       IntentList,

+                                       AdaptationList,

+                                       NULL, 0,

+                                       InputFormat,

+                                       OutputFormat,

+                                       dwFlags);

+

+    cmsCloseProfile(hLab);

+

+    return xform;

+}

+

+

+// Compute K -> L* relationship. Flags may include black point compensation. In this case,

+// the relationship is assumed from the profile with BPC to a black point zero.

+static

+cmsToneCurve* ComputeKToLstar(cmsContext            ContextID,

+                               cmsUInt32Number       nPoints,

+                               cmsUInt32Number       nProfiles,

+                               const cmsUInt32Number Intents[],

+                               const cmsHPROFILE     hProfiles[],

+                               const cmsBool         BPC[],

+                               const cmsFloat64Number AdaptationStates[],

+                               cmsUInt32Number dwFlags)

+{

+    cmsToneCurve* out = NULL;

+    cmsUInt32Number i;

+    cmsHTRANSFORM xform;

+    cmsCIELab Lab;

+    cmsFloat32Number cmyk[4];

+    cmsFloat32Number* SampledPoints;

+

+    xform = _cmsChain2Lab(ContextID, nProfiles, TYPE_CMYK_FLT, TYPE_Lab_DBL, Intents, hProfiles, BPC, AdaptationStates, dwFlags);

+    if (xform == NULL) return NULL;

+

+    SampledPoints = (cmsFloat32Number*) _cmsCalloc(ContextID, nPoints, sizeof(cmsFloat32Number));

+    if (SampledPoints  == NULL) goto Error;

+

+    for (i=0; i < nPoints; i++) {

+

+        cmyk[0] = 0;

+        cmyk[1] = 0;

+        cmyk[2] = 0;

+        cmyk[3] = (cmsFloat32Number) ((i * 100.0) / (nPoints-1));

+

+        cmsDoTransform(xform, cmyk, &Lab, 1);

+        SampledPoints[i]= (cmsFloat32Number) (1.0 - Lab.L / 100.0); // Negate K for easier operation

+    }

+

+    out = cmsBuildTabulatedToneCurveFloat(ContextID, nPoints, SampledPoints);

+

+Error:

+

+    cmsDeleteTransform(xform);

+    if (SampledPoints) _cmsFree(ContextID, SampledPoints);

+

+    return out;

+}

+

+

+// Compute Black tone curve on a CMYK -> CMYK transform. This is done by

+// using the proof direction on both profiles to find K->L* relationship

+// then joining both curves. dwFlags may include black point compensation.

+cmsToneCurve* _cmsBuildKToneCurve(cmsContext        ContextID,

+                                   cmsUInt32Number   nPoints,

+                                   cmsUInt32Number   nProfiles,

+                                   const cmsUInt32Number Intents[],

+                                   const cmsHPROFILE hProfiles[],

+                                   const cmsBool     BPC[],

+                                   const cmsFloat64Number AdaptationStates[],

+                                   cmsUInt32Number   dwFlags)

+{

+    cmsToneCurve *in, *out, *KTone;

+

+    // Make sure CMYK -> CMYK

+    if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData ||

+        cmsGetColorSpace(hProfiles[nProfiles-1])!= cmsSigCmykData) return NULL;

+

+

+    // Make sure last is an output profile

+    if (cmsGetDeviceClass(hProfiles[nProfiles - 1]) != cmsSigOutputClass) return NULL;

+

+    // Create individual curves. BPC works also as each K to L* is

+    // computed as a BPC to zero black point in case of L*

+    in  = ComputeKToLstar(ContextID, nPoints, nProfiles - 1, Intents, hProfiles, BPC, AdaptationStates, dwFlags);

+    if (in == NULL) return NULL;

+

+    out = ComputeKToLstar(ContextID, nPoints, 1,

+                            Intents + (nProfiles - 1),

+                            &hProfiles [nProfiles - 1],

+                            BPC + (nProfiles - 1),

+                            AdaptationStates + (nProfiles - 1),

+                            dwFlags);

+    if (out == NULL) {

+        cmsFreeToneCurve(in);

+        return NULL;

+    }

+

+    // Build the relationship. This effectively limits the maximum accuracy to 16 bits, but

+    // since this is used on black-preserving LUTs, we are not loosing  accuracy in any case

+    KTone = cmsJoinToneCurve(ContextID, in, out, nPoints);

+

+    // Get rid of components

+    cmsFreeToneCurve(in); cmsFreeToneCurve(out);

+

+    // Something went wrong...

+    if (KTone == NULL) return NULL;

+

+    // Make sure it is monotonic

+    if (!cmsIsToneCurveMonotonic(KTone)) {

+        cmsFreeToneCurve(KTone);

+        return NULL;

+    }

+

+    return KTone;

+}

+

+

+// Gamut LUT Creation -----------------------------------------------------------------------------------------

+

+// Used by gamut & softproofing

+

+typedef struct {

+

+    cmsHTRANSFORM hInput;               // From whatever input color space. 16 bits to DBL

+    cmsHTRANSFORM hForward, hReverse;   // Transforms going from Lab to colorant and back

+    cmsFloat64Number Thereshold;        // The thereshold after which is considered out of gamut

+

+    } GAMUTCHAIN;

+

+// This sampler does compute gamut boundaries by comparing original

+// values with a transform going back and forth. Values above ERR_THERESHOLD

+// of maximum are considered out of gamut.

+

+#define ERR_THERESHOLD      5

+

+

+static

+int GamutSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)

+{

+    GAMUTCHAIN*  t = (GAMUTCHAIN* ) Cargo;

+    cmsCIELab LabIn1, LabOut1;

+    cmsCIELab LabIn2, LabOut2;

+    cmsUInt16Number Proof[cmsMAXCHANNELS], Proof2[cmsMAXCHANNELS];

+    cmsFloat64Number dE1, dE2, ErrorRatio;

+

+    // Assume in-gamut by default.

+    ErrorRatio = 1.0;

+

+    // Convert input to Lab

+    cmsDoTransform(t -> hInput, In, &LabIn1, 1);

+

+    // converts from PCS to colorant. This always

+    // does return in-gamut values,

+    cmsDoTransform(t -> hForward, &LabIn1, Proof, 1);

+

+    // Now, do the inverse, from colorant to PCS.

+    cmsDoTransform(t -> hReverse, Proof, &LabOut1, 1);

+

+    memmove(&LabIn2, &LabOut1, sizeof(cmsCIELab));

+

+    // Try again, but this time taking Check as input

+    cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1);

+    cmsDoTransform(t -> hReverse, Proof2, &LabOut2, 1);

+

+    // Take difference of direct value

+    dE1 = cmsDeltaE(&LabIn1, &LabOut1);

+

+    // Take difference of converted value

+    dE2 = cmsDeltaE(&LabIn2, &LabOut2);

+

+

+    // if dE1 is small and dE2 is small, value is likely to be in gamut

+    if (dE1 < t->Thereshold && dE2 < t->Thereshold)

+        Out[0] = 0;

+    else {

+

+        // if dE1 is small and dE2 is big, undefined. Assume in gamut

+        if (dE1 < t->Thereshold && dE2 > t->Thereshold)

+            Out[0] = 0;

+        else

+            // dE1 is big and dE2 is small, clearly out of gamut

+            if (dE1 > t->Thereshold && dE2 < t->Thereshold)

+                Out[0] = (cmsUInt16Number) _cmsQuickFloor((dE1 - t->Thereshold) + .5);

+            else  {

+

+                // dE1 is big and dE2 is also big, could be due to perceptual mapping

+                // so take error ratio

+                if (dE2 == 0.0)

+                    ErrorRatio = dE1;

+                else

+                    ErrorRatio = dE1 / dE2;

+

+                if (ErrorRatio > t->Thereshold)

+                    Out[0] = (cmsUInt16Number)  _cmsQuickFloor((ErrorRatio - t->Thereshold) + .5);

+                else

+                    Out[0] = 0;

+            }

+    }

+

+

+    return TRUE;

+}

+

+// Does compute a gamut LUT going back and forth across pcs -> relativ. colorimetric intent -> pcs

+// the dE obtained is then annotated on the LUT. Values truely out of gamut are clipped to dE = 0xFFFE

+// and values changed are supposed to be handled by any gamut remapping, so, are out of gamut as well.

+//

+// **WARNING: This algorithm does assume that gamut remapping algorithms does NOT move in-gamut colors,

+// of course, many perceptual and saturation intents does not work in such way, but relativ. ones should.

+

+cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID,

+                                          cmsHPROFILE hProfiles[],

+                                          cmsBool  BPC[],

+                                          cmsUInt32Number Intents[],

+                                          cmsFloat64Number AdaptationStates[],

+                                          cmsUInt32Number nGamutPCSposition,

+                                          cmsHPROFILE hGamut)

+{

+    cmsHPROFILE hLab;

+    cmsPipeline* Gamut;

+    cmsStage* CLUT;

+    cmsUInt32Number dwFormat;

+    GAMUTCHAIN Chain;

+    int nChannels, nGridpoints;

+    cmsColorSpaceSignature ColorSpace;

+    cmsUInt32Number i;

+    cmsHPROFILE ProfileList[256];

+    cmsBool     BPCList[256];

+    cmsFloat64Number AdaptationList[256];

+    cmsUInt32Number IntentList[256];

+

+    memset(&Chain, 0, sizeof(GAMUTCHAIN));

+

+

+    if (nGamutPCSposition <= 0 || nGamutPCSposition > 255) {

+        cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong position of PCS. 1..255 expected, %d found.", nGamutPCSposition);

+        return NULL;

+    }

+

+    hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);

+    if (hLab == NULL) return NULL;

+

+

+    // The figure of merit. On matrix-shaper profiles, should be almost zero as

+    // the conversion is pretty exact. On LUT based profiles, different resolutions

+    // of input and output CLUT may result in differences.

+

+    if (cmsIsMatrixShaper(hGamut)) {

+

+        Chain.Thereshold = 1.0;

+    }

+    else {

+        Chain.Thereshold = ERR_THERESHOLD;

+    }

+

+

+    // Create a copy of parameters

+    for (i=0; i < nGamutPCSposition; i++) {

+        ProfileList[i]    = hProfiles[i];

+        BPCList[i]        = BPC[i];

+        AdaptationList[i] = AdaptationStates[i];

+        IntentList[i]     = Intents[i];

+    }

+

+    // Fill Lab identity

+    ProfileList[nGamutPCSposition] = hLab;

+    BPCList[nGamutPCSposition] = 0;

+    AdaptationList[nGamutPCSposition] = 1.0;

+    IntentList[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC;

+

+

+    ColorSpace  = cmsGetColorSpace(hGamut);

+

+    nChannels   = cmsChannelsOf(ColorSpace);

+    nGridpoints = _cmsReasonableGridpointsByColorspace(ColorSpace, cmsFLAGS_HIGHRESPRECALC);

+    dwFormat    = (CHANNELS_SH(nChannels)|BYTES_SH(2));

+

+    // 16 bits to Lab double

+    Chain.hInput = cmsCreateExtendedTransform(ContextID,

+        nGamutPCSposition + 1,

+        ProfileList,

+        BPCList,

+        IntentList,

+        AdaptationList,

+        NULL, 0,

+        dwFormat, TYPE_Lab_DBL,

+        cmsFLAGS_NOCACHE);

+

+

+    // Does create the forward step. Lab double to device

+    dwFormat    = (CHANNELS_SH(nChannels)|BYTES_SH(2));

+    Chain.hForward = cmsCreateTransformTHR(ContextID,

+        hLab, TYPE_Lab_DBL,

+        hGamut, dwFormat,

+        INTENT_RELATIVE_COLORIMETRIC,

+        cmsFLAGS_NOCACHE);

+

+    // Does create the backwards step

+    Chain.hReverse = cmsCreateTransformTHR(ContextID, hGamut, dwFormat,

+        hLab, TYPE_Lab_DBL,

+        INTENT_RELATIVE_COLORIMETRIC,

+        cmsFLAGS_NOCACHE);

+

+

+    // All ok?

+    if (Chain.hInput && Chain.hForward && Chain.hReverse) {

+

+        // Go on, try to compute gamut LUT from PCS. This consist on a single channel containing

+        // dE when doing a transform back and forth on the colorimetric intent.

+

+        Gamut = cmsPipelineAlloc(ContextID, 3, 1);

+        if (Gamut != NULL) {

+

+            CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL);

+            if (!cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT)) {

+                cmsPipelineFree(Gamut);

+                Gamut = NULL;

+            } 

+            else {

+                cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0);

+            }

+        }

+    }

+    else

+        Gamut = NULL;   // Didn't work...

+

+    // Free all needed stuff.

+    if (Chain.hInput)   cmsDeleteTransform(Chain.hInput);

+    if (Chain.hForward) cmsDeleteTransform(Chain.hForward);

+    if (Chain.hReverse) cmsDeleteTransform(Chain.hReverse);

+    if (hLab) cmsCloseProfile(hLab);

+

+    // And return computed hull

+    return Gamut;

+}

+

+// Total Area Coverage estimation ----------------------------------------------------------------

+

+typedef struct {

+    cmsUInt32Number  nOutputChans;

+    cmsHTRANSFORM    hRoundTrip;

+    cmsFloat32Number MaxTAC;

+    cmsFloat32Number MaxInput[cmsMAXCHANNELS];

+

+} cmsTACestimator;

+

+

+// This callback just accounts the maximum ink dropped in the given node. It does not populate any

+// memory, as the destination table is NULL. Its only purpose it to know the global maximum.

+static

+int EstimateTAC(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo)

+{

+    cmsTACestimator* bp = (cmsTACestimator*) Cargo;

+    cmsFloat32Number RoundTrip[cmsMAXCHANNELS];

+    cmsUInt32Number i;

+    cmsFloat32Number Sum;

+

+

+    // Evaluate the xform

+    cmsDoTransform(bp->hRoundTrip, In, RoundTrip, 1);

+

+    // All all amounts of ink

+    for (Sum=0, i=0; i < bp ->nOutputChans; i++)

+            Sum += RoundTrip[i];

+

+    // If above maximum, keep track of input values

+    if (Sum > bp ->MaxTAC) {

+

+            bp ->MaxTAC = Sum;

+

+            for (i=0; i < bp ->nOutputChans; i++) {

+                bp ->MaxInput[i] = In[i];

+            }

+    }

+

+    return TRUE;

+

+    cmsUNUSED_PARAMETER(Out);

+}

+

+

+// Detect Total area coverage of the profile

+cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile)

+{

+    cmsTACestimator bp;

+    cmsUInt32Number dwFormatter;

+    cmsUInt32Number GridPoints[MAX_INPUT_DIMENSIONS];

+    cmsHPROFILE hLab;

+    cmsContext ContextID = cmsGetProfileContextID(hProfile);

+

+    // TAC only works on output profiles

+    if (cmsGetDeviceClass(hProfile) != cmsSigOutputClass) {

+        return 0;

+    }

+

+    // Create a fake formatter for result

+    dwFormatter = cmsFormatterForColorspaceOfProfile(hProfile, 4, TRUE);

+

+    bp.nOutputChans = T_CHANNELS(dwFormatter);

+    bp.MaxTAC = 0;    // Initial TAC is 0

+

+    //  for safety

+    if (bp.nOutputChans >= cmsMAXCHANNELS) return 0;

+

+    hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);

+    if (hLab == NULL) return 0;

+    // Setup a roundtrip on perceptual intent in output profile for TAC estimation

+    bp.hRoundTrip = cmsCreateTransformTHR(ContextID, hLab, TYPE_Lab_16,

+                                          hProfile, dwFormatter, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE);

+

+    cmsCloseProfile(hLab);

+    if (bp.hRoundTrip == NULL) return 0;

+

+    // For L* we only need black and white. For C* we need many points

+    GridPoints[0] = 6;

+    GridPoints[1] = 74;

+    GridPoints[2] = 74;

+

+

+    if (!cmsSliceSpace16(3, GridPoints, EstimateTAC, &bp)) {

+        bp.MaxTAC = 0;

+    }

+

+    cmsDeleteTransform(bp.hRoundTrip);

+

+    // Results in %

+    return bp.MaxTAC;

+}

+

+

+// Carefully,  clamp on CIELab space.

+

+cmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab,

+                                   double amax, double amin,

+                                   double bmax, double bmin)

+{

+

+    // Whole Luma surface to zero

+

+    if (Lab -> L < 0) {

+

+        Lab-> L = Lab->a = Lab-> b = 0.0;

+        return FALSE;

+    }

+

+    // Clamp white, DISCARD HIGHLIGHTS. This is done

+    // in such way because icc spec doesn't allow the

+    // use of L>100 as a highlight means.

+

+    if (Lab->L > 100)

+        Lab -> L = 100;

+

+    // Check out gamut prism, on a, b faces

+

+    if (Lab -> a < amin || Lab->a > amax||

+        Lab -> b < bmin || Lab->b > bmax) {

+

+            cmsCIELCh LCh;

+            double h, slope;

+

+            // Falls outside a, b limits. Transports to LCh space,

+            // and then do the clipping

+

+

+            if (Lab -> a == 0.0) { // Is hue exactly 90?

+

+                // atan will not work, so clamp here

+                Lab -> b = Lab->b < 0 ? bmin : bmax;

+                return TRUE;

+            }

+

+            cmsLab2LCh(&LCh, Lab);

+

+            slope = Lab -> b / Lab -> a;

+            h = LCh.h;

+

+            // There are 4 zones

+

+            if ((h >= 0. && h < 45.) ||

+                (h >= 315 && h <= 360.)) {

+

+                    // clip by amax

+                    Lab -> a = amax;

+                    Lab -> b = amax * slope;

+            }

+            else

+                if (h >= 45. && h < 135.)

+                {

+                    // clip by bmax

+                    Lab -> b = bmax;

+                    Lab -> a = bmax / slope;

+                }

+                else

+                    if (h >= 135. && h < 225.) {

+                        // clip by amin

+                        Lab -> a = amin;

+                        Lab -> b = amin * slope;

+

+                    }

+                    else

+                        if (h >= 225. && h < 315.) {

+                            // clip by bmin

+                            Lab -> b = bmin;

+                            Lab -> a = bmin / slope;

+                        }

+                        else  {

+                            cmsSignalError(0, cmsERROR_RANGE, "Invalid angle");

+                            return FALSE;

+                        }

+

+    }

+

+    return TRUE;

+}

diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmshalf.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmshalf.c
new file mode 100644
index 0000000..f038b57
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmshalf.c
@@ -0,0 +1,534 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+
+#include "lcms2_internal.h"
+
+#ifndef CMS_NO_HALF_SUPPORT 
+
+// This code is inspired in the paper "Fast Half Float Conversions"
+// by Jeroen van der Zijp
+
+static cmsUInt32Number Mantissa[2048] = {
+
+0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34a00000,
+0x34c00000, 0x34e00000, 0x35000000, 0x35100000, 0x35200000, 0x35300000,
+0x35400000, 0x35500000, 0x35600000, 0x35700000, 0x35800000, 0x35880000,
+0x35900000, 0x35980000, 0x35a00000, 0x35a80000, 0x35b00000, 0x35b80000,
+0x35c00000, 0x35c80000, 0x35d00000, 0x35d80000, 0x35e00000, 0x35e80000,
+0x35f00000, 0x35f80000, 0x36000000, 0x36040000, 0x36080000, 0x360c0000,
+0x36100000, 0x36140000, 0x36180000, 0x361c0000, 0x36200000, 0x36240000,
+0x36280000, 0x362c0000, 0x36300000, 0x36340000, 0x36380000, 0x363c0000,
+0x36400000, 0x36440000, 0x36480000, 0x364c0000, 0x36500000, 0x36540000,
+0x36580000, 0x365c0000, 0x36600000, 0x36640000, 0x36680000, 0x366c0000,
+0x36700000, 0x36740000, 0x36780000, 0x367c0000, 0x36800000, 0x36820000,
+0x36840000, 0x36860000, 0x36880000, 0x368a0000, 0x368c0000, 0x368e0000,
+0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369a0000,
+0x369c0000, 0x369e0000, 0x36a00000, 0x36a20000, 0x36a40000, 0x36a60000,
+0x36a80000, 0x36aa0000, 0x36ac0000, 0x36ae0000, 0x36b00000, 0x36b20000,
+0x36b40000, 0x36b60000, 0x36b80000, 0x36ba0000, 0x36bc0000, 0x36be0000,
+0x36c00000, 0x36c20000, 0x36c40000, 0x36c60000, 0x36c80000, 0x36ca0000,
+0x36cc0000, 0x36ce0000, 0x36d00000, 0x36d20000, 0x36d40000, 0x36d60000,
+0x36d80000, 0x36da0000, 0x36dc0000, 0x36de0000, 0x36e00000, 0x36e20000,
+0x36e40000, 0x36e60000, 0x36e80000, 0x36ea0000, 0x36ec0000, 0x36ee0000,
+0x36f00000, 0x36f20000, 0x36f40000, 0x36f60000, 0x36f80000, 0x36fa0000,
+0x36fc0000, 0x36fe0000, 0x37000000, 0x37010000, 0x37020000, 0x37030000,
+0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000,
+0x370a0000, 0x370b0000, 0x370c0000, 0x370d0000, 0x370e0000, 0x370f0000,
+0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000,
+0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371a0000, 0x371b0000,
+0x371c0000, 0x371d0000, 0x371e0000, 0x371f0000, 0x37200000, 0x37210000,
+0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000,
+0x37280000, 0x37290000, 0x372a0000, 0x372b0000, 0x372c0000, 0x372d0000,
+0x372e0000, 0x372f0000, 0x37300000, 0x37310000, 0x37320000, 0x37330000,
+0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000,
+0x373a0000, 0x373b0000, 0x373c0000, 0x373d0000, 0x373e0000, 0x373f0000,
+0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000,
+0x37460000, 0x37470000, 0x37480000, 0x37490000, 0x374a0000, 0x374b0000,
+0x374c0000, 0x374d0000, 0x374e0000, 0x374f0000, 0x37500000, 0x37510000,
+0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000,
+0x37580000, 0x37590000, 0x375a0000, 0x375b0000, 0x375c0000, 0x375d0000,
+0x375e0000, 0x375f0000, 0x37600000, 0x37610000, 0x37620000, 0x37630000,
+0x37640000, 0x37650000, 0x37660000, 0x37670000, 0x37680000, 0x37690000,
+0x376a0000, 0x376b0000, 0x376c0000, 0x376d0000, 0x376e0000, 0x376f0000,
+0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000,
+0x37760000, 0x37770000, 0x37780000, 0x37790000, 0x377a0000, 0x377b0000,
+0x377c0000, 0x377d0000, 0x377e0000, 0x377f0000, 0x37800000, 0x37808000,
+0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000,
+0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000,
+0x37870000, 0x37878000, 0x37880000, 0x37888000, 0x37890000, 0x37898000,
+0x378a0000, 0x378a8000, 0x378b0000, 0x378b8000, 0x378c0000, 0x378c8000,
+0x378d0000, 0x378d8000, 0x378e0000, 0x378e8000, 0x378f0000, 0x378f8000,
+0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000,
+0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000,
+0x37960000, 0x37968000, 0x37970000, 0x37978000, 0x37980000, 0x37988000,
+0x37990000, 0x37998000, 0x379a0000, 0x379a8000, 0x379b0000, 0x379b8000,
+0x379c0000, 0x379c8000, 0x379d0000, 0x379d8000, 0x379e0000, 0x379e8000,
+0x379f0000, 0x379f8000, 0x37a00000, 0x37a08000, 0x37a10000, 0x37a18000,
+0x37a20000, 0x37a28000, 0x37a30000, 0x37a38000, 0x37a40000, 0x37a48000,
+0x37a50000, 0x37a58000, 0x37a60000, 0x37a68000, 0x37a70000, 0x37a78000,
+0x37a80000, 0x37a88000, 0x37a90000, 0x37a98000, 0x37aa0000, 0x37aa8000,
+0x37ab0000, 0x37ab8000, 0x37ac0000, 0x37ac8000, 0x37ad0000, 0x37ad8000,
+0x37ae0000, 0x37ae8000, 0x37af0000, 0x37af8000, 0x37b00000, 0x37b08000,
+0x37b10000, 0x37b18000, 0x37b20000, 0x37b28000, 0x37b30000, 0x37b38000,
+0x37b40000, 0x37b48000, 0x37b50000, 0x37b58000, 0x37b60000, 0x37b68000,
+0x37b70000, 0x37b78000, 0x37b80000, 0x37b88000, 0x37b90000, 0x37b98000,
+0x37ba0000, 0x37ba8000, 0x37bb0000, 0x37bb8000, 0x37bc0000, 0x37bc8000,
+0x37bd0000, 0x37bd8000, 0x37be0000, 0x37be8000, 0x37bf0000, 0x37bf8000,
+0x37c00000, 0x37c08000, 0x37c10000, 0x37c18000, 0x37c20000, 0x37c28000,
+0x37c30000, 0x37c38000, 0x37c40000, 0x37c48000, 0x37c50000, 0x37c58000,
+0x37c60000, 0x37c68000, 0x37c70000, 0x37c78000, 0x37c80000, 0x37c88000,
+0x37c90000, 0x37c98000, 0x37ca0000, 0x37ca8000, 0x37cb0000, 0x37cb8000,
+0x37cc0000, 0x37cc8000, 0x37cd0000, 0x37cd8000, 0x37ce0000, 0x37ce8000,
+0x37cf0000, 0x37cf8000, 0x37d00000, 0x37d08000, 0x37d10000, 0x37d18000,
+0x37d20000, 0x37d28000, 0x37d30000, 0x37d38000, 0x37d40000, 0x37d48000,
+0x37d50000, 0x37d58000, 0x37d60000, 0x37d68000, 0x37d70000, 0x37d78000,
+0x37d80000, 0x37d88000, 0x37d90000, 0x37d98000, 0x37da0000, 0x37da8000,
+0x37db0000, 0x37db8000, 0x37dc0000, 0x37dc8000, 0x37dd0000, 0x37dd8000,
+0x37de0000, 0x37de8000, 0x37df0000, 0x37df8000, 0x37e00000, 0x37e08000,
+0x37e10000, 0x37e18000, 0x37e20000, 0x37e28000, 0x37e30000, 0x37e38000,
+0x37e40000, 0x37e48000, 0x37e50000, 0x37e58000, 0x37e60000, 0x37e68000,
+0x37e70000, 0x37e78000, 0x37e80000, 0x37e88000, 0x37e90000, 0x37e98000,
+0x37ea0000, 0x37ea8000, 0x37eb0000, 0x37eb8000, 0x37ec0000, 0x37ec8000,
+0x37ed0000, 0x37ed8000, 0x37ee0000, 0x37ee8000, 0x37ef0000, 0x37ef8000,
+0x37f00000, 0x37f08000, 0x37f10000, 0x37f18000, 0x37f20000, 0x37f28000,
+0x37f30000, 0x37f38000, 0x37f40000, 0x37f48000, 0x37f50000, 0x37f58000,
+0x37f60000, 0x37f68000, 0x37f70000, 0x37f78000, 0x37f80000, 0x37f88000,
+0x37f90000, 0x37f98000, 0x37fa0000, 0x37fa8000, 0x37fb0000, 0x37fb8000,
+0x37fc0000, 0x37fc8000, 0x37fd0000, 0x37fd8000, 0x37fe0000, 0x37fe8000,
+0x37ff0000, 0x37ff8000, 0x38000000, 0x38004000, 0x38008000, 0x3800c000,
+0x38010000, 0x38014000, 0x38018000, 0x3801c000, 0x38020000, 0x38024000,
+0x38028000, 0x3802c000, 0x38030000, 0x38034000, 0x38038000, 0x3803c000,
+0x38040000, 0x38044000, 0x38048000, 0x3804c000, 0x38050000, 0x38054000,
+0x38058000, 0x3805c000, 0x38060000, 0x38064000, 0x38068000, 0x3806c000,
+0x38070000, 0x38074000, 0x38078000, 0x3807c000, 0x38080000, 0x38084000,
+0x38088000, 0x3808c000, 0x38090000, 0x38094000, 0x38098000, 0x3809c000,
+0x380a0000, 0x380a4000, 0x380a8000, 0x380ac000, 0x380b0000, 0x380b4000,
+0x380b8000, 0x380bc000, 0x380c0000, 0x380c4000, 0x380c8000, 0x380cc000,
+0x380d0000, 0x380d4000, 0x380d8000, 0x380dc000, 0x380e0000, 0x380e4000,
+0x380e8000, 0x380ec000, 0x380f0000, 0x380f4000, 0x380f8000, 0x380fc000,
+0x38100000, 0x38104000, 0x38108000, 0x3810c000, 0x38110000, 0x38114000,
+0x38118000, 0x3811c000, 0x38120000, 0x38124000, 0x38128000, 0x3812c000,
+0x38130000, 0x38134000, 0x38138000, 0x3813c000, 0x38140000, 0x38144000,
+0x38148000, 0x3814c000, 0x38150000, 0x38154000, 0x38158000, 0x3815c000,
+0x38160000, 0x38164000, 0x38168000, 0x3816c000, 0x38170000, 0x38174000,
+0x38178000, 0x3817c000, 0x38180000, 0x38184000, 0x38188000, 0x3818c000,
+0x38190000, 0x38194000, 0x38198000, 0x3819c000, 0x381a0000, 0x381a4000,
+0x381a8000, 0x381ac000, 0x381b0000, 0x381b4000, 0x381b8000, 0x381bc000,
+0x381c0000, 0x381c4000, 0x381c8000, 0x381cc000, 0x381d0000, 0x381d4000,
+0x381d8000, 0x381dc000, 0x381e0000, 0x381e4000, 0x381e8000, 0x381ec000,
+0x381f0000, 0x381f4000, 0x381f8000, 0x381fc000, 0x38200000, 0x38204000,
+0x38208000, 0x3820c000, 0x38210000, 0x38214000, 0x38218000, 0x3821c000,
+0x38220000, 0x38224000, 0x38228000, 0x3822c000, 0x38230000, 0x38234000,
+0x38238000, 0x3823c000, 0x38240000, 0x38244000, 0x38248000, 0x3824c000,
+0x38250000, 0x38254000, 0x38258000, 0x3825c000, 0x38260000, 0x38264000,
+0x38268000, 0x3826c000, 0x38270000, 0x38274000, 0x38278000, 0x3827c000,
+0x38280000, 0x38284000, 0x38288000, 0x3828c000, 0x38290000, 0x38294000,
+0x38298000, 0x3829c000, 0x382a0000, 0x382a4000, 0x382a8000, 0x382ac000,
+0x382b0000, 0x382b4000, 0x382b8000, 0x382bc000, 0x382c0000, 0x382c4000,
+0x382c8000, 0x382cc000, 0x382d0000, 0x382d4000, 0x382d8000, 0x382dc000,
+0x382e0000, 0x382e4000, 0x382e8000, 0x382ec000, 0x382f0000, 0x382f4000,
+0x382f8000, 0x382fc000, 0x38300000, 0x38304000, 0x38308000, 0x3830c000,
+0x38310000, 0x38314000, 0x38318000, 0x3831c000, 0x38320000, 0x38324000,
+0x38328000, 0x3832c000, 0x38330000, 0x38334000, 0x38338000, 0x3833c000,
+0x38340000, 0x38344000, 0x38348000, 0x3834c000, 0x38350000, 0x38354000,
+0x38358000, 0x3835c000, 0x38360000, 0x38364000, 0x38368000, 0x3836c000,
+0x38370000, 0x38374000, 0x38378000, 0x3837c000, 0x38380000, 0x38384000,
+0x38388000, 0x3838c000, 0x38390000, 0x38394000, 0x38398000, 0x3839c000,
+0x383a0000, 0x383a4000, 0x383a8000, 0x383ac000, 0x383b0000, 0x383b4000,
+0x383b8000, 0x383bc000, 0x383c0000, 0x383c4000, 0x383c8000, 0x383cc000,
+0x383d0000, 0x383d4000, 0x383d8000, 0x383dc000, 0x383e0000, 0x383e4000,
+0x383e8000, 0x383ec000, 0x383f0000, 0x383f4000, 0x383f8000, 0x383fc000,
+0x38400000, 0x38404000, 0x38408000, 0x3840c000, 0x38410000, 0x38414000,
+0x38418000, 0x3841c000, 0x38420000, 0x38424000, 0x38428000, 0x3842c000,
+0x38430000, 0x38434000, 0x38438000, 0x3843c000, 0x38440000, 0x38444000,
+0x38448000, 0x3844c000, 0x38450000, 0x38454000, 0x38458000, 0x3845c000,
+0x38460000, 0x38464000, 0x38468000, 0x3846c000, 0x38470000, 0x38474000,
+0x38478000, 0x3847c000, 0x38480000, 0x38484000, 0x38488000, 0x3848c000,
+0x38490000, 0x38494000, 0x38498000, 0x3849c000, 0x384a0000, 0x384a4000,
+0x384a8000, 0x384ac000, 0x384b0000, 0x384b4000, 0x384b8000, 0x384bc000,
+0x384c0000, 0x384c4000, 0x384c8000, 0x384cc000, 0x384d0000, 0x384d4000,
+0x384d8000, 0x384dc000, 0x384e0000, 0x384e4000, 0x384e8000, 0x384ec000,
+0x384f0000, 0x384f4000, 0x384f8000, 0x384fc000, 0x38500000, 0x38504000,
+0x38508000, 0x3850c000, 0x38510000, 0x38514000, 0x38518000, 0x3851c000,
+0x38520000, 0x38524000, 0x38528000, 0x3852c000, 0x38530000, 0x38534000,
+0x38538000, 0x3853c000, 0x38540000, 0x38544000, 0x38548000, 0x3854c000,
+0x38550000, 0x38554000, 0x38558000, 0x3855c000, 0x38560000, 0x38564000,
+0x38568000, 0x3856c000, 0x38570000, 0x38574000, 0x38578000, 0x3857c000,
+0x38580000, 0x38584000, 0x38588000, 0x3858c000, 0x38590000, 0x38594000,
+0x38598000, 0x3859c000, 0x385a0000, 0x385a4000, 0x385a8000, 0x385ac000,
+0x385b0000, 0x385b4000, 0x385b8000, 0x385bc000, 0x385c0000, 0x385c4000,
+0x385c8000, 0x385cc000, 0x385d0000, 0x385d4000, 0x385d8000, 0x385dc000,
+0x385e0000, 0x385e4000, 0x385e8000, 0x385ec000, 0x385f0000, 0x385f4000,
+0x385f8000, 0x385fc000, 0x38600000, 0x38604000, 0x38608000, 0x3860c000,
+0x38610000, 0x38614000, 0x38618000, 0x3861c000, 0x38620000, 0x38624000,
+0x38628000, 0x3862c000, 0x38630000, 0x38634000, 0x38638000, 0x3863c000,
+0x38640000, 0x38644000, 0x38648000, 0x3864c000, 0x38650000, 0x38654000,
+0x38658000, 0x3865c000, 0x38660000, 0x38664000, 0x38668000, 0x3866c000,
+0x38670000, 0x38674000, 0x38678000, 0x3867c000, 0x38680000, 0x38684000,
+0x38688000, 0x3868c000, 0x38690000, 0x38694000, 0x38698000, 0x3869c000,
+0x386a0000, 0x386a4000, 0x386a8000, 0x386ac000, 0x386b0000, 0x386b4000,
+0x386b8000, 0x386bc000, 0x386c0000, 0x386c4000, 0x386c8000, 0x386cc000,
+0x386d0000, 0x386d4000, 0x386d8000, 0x386dc000, 0x386e0000, 0x386e4000,
+0x386e8000, 0x386ec000, 0x386f0000, 0x386f4000, 0x386f8000, 0x386fc000,
+0x38700000, 0x38704000, 0x38708000, 0x3870c000, 0x38710000, 0x38714000,
+0x38718000, 0x3871c000, 0x38720000, 0x38724000, 0x38728000, 0x3872c000,
+0x38730000, 0x38734000, 0x38738000, 0x3873c000, 0x38740000, 0x38744000,
+0x38748000, 0x3874c000, 0x38750000, 0x38754000, 0x38758000, 0x3875c000,
+0x38760000, 0x38764000, 0x38768000, 0x3876c000, 0x38770000, 0x38774000,
+0x38778000, 0x3877c000, 0x38780000, 0x38784000, 0x38788000, 0x3878c000,
+0x38790000, 0x38794000, 0x38798000, 0x3879c000, 0x387a0000, 0x387a4000,
+0x387a8000, 0x387ac000, 0x387b0000, 0x387b4000, 0x387b8000, 0x387bc000,
+0x387c0000, 0x387c4000, 0x387c8000, 0x387cc000, 0x387d0000, 0x387d4000,
+0x387d8000, 0x387dc000, 0x387e0000, 0x387e4000, 0x387e8000, 0x387ec000,
+0x387f0000, 0x387f4000, 0x387f8000, 0x387fc000, 0x38000000, 0x38002000,
+0x38004000, 0x38006000, 0x38008000, 0x3800a000, 0x3800c000, 0x3800e000,
+0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801a000,
+0x3801c000, 0x3801e000, 0x38020000, 0x38022000, 0x38024000, 0x38026000,
+0x38028000, 0x3802a000, 0x3802c000, 0x3802e000, 0x38030000, 0x38032000,
+0x38034000, 0x38036000, 0x38038000, 0x3803a000, 0x3803c000, 0x3803e000,
+0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804a000,
+0x3804c000, 0x3804e000, 0x38050000, 0x38052000, 0x38054000, 0x38056000,
+0x38058000, 0x3805a000, 0x3805c000, 0x3805e000, 0x38060000, 0x38062000,
+0x38064000, 0x38066000, 0x38068000, 0x3806a000, 0x3806c000, 0x3806e000,
+0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807a000,
+0x3807c000, 0x3807e000, 0x38080000, 0x38082000, 0x38084000, 0x38086000,
+0x38088000, 0x3808a000, 0x3808c000, 0x3808e000, 0x38090000, 0x38092000,
+0x38094000, 0x38096000, 0x38098000, 0x3809a000, 0x3809c000, 0x3809e000,
+0x380a0000, 0x380a2000, 0x380a4000, 0x380a6000, 0x380a8000, 0x380aa000,
+0x380ac000, 0x380ae000, 0x380b0000, 0x380b2000, 0x380b4000, 0x380b6000,
+0x380b8000, 0x380ba000, 0x380bc000, 0x380be000, 0x380c0000, 0x380c2000,
+0x380c4000, 0x380c6000, 0x380c8000, 0x380ca000, 0x380cc000, 0x380ce000,
+0x380d0000, 0x380d2000, 0x380d4000, 0x380d6000, 0x380d8000, 0x380da000,
+0x380dc000, 0x380de000, 0x380e0000, 0x380e2000, 0x380e4000, 0x380e6000,
+0x380e8000, 0x380ea000, 0x380ec000, 0x380ee000, 0x380f0000, 0x380f2000,
+0x380f4000, 0x380f6000, 0x380f8000, 0x380fa000, 0x380fc000, 0x380fe000,
+0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810a000,
+0x3810c000, 0x3810e000, 0x38110000, 0x38112000, 0x38114000, 0x38116000,
+0x38118000, 0x3811a000, 0x3811c000, 0x3811e000, 0x38120000, 0x38122000,
+0x38124000, 0x38126000, 0x38128000, 0x3812a000, 0x3812c000, 0x3812e000,
+0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813a000,
+0x3813c000, 0x3813e000, 0x38140000, 0x38142000, 0x38144000, 0x38146000,
+0x38148000, 0x3814a000, 0x3814c000, 0x3814e000, 0x38150000, 0x38152000,
+0x38154000, 0x38156000, 0x38158000, 0x3815a000, 0x3815c000, 0x3815e000,
+0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816a000,
+0x3816c000, 0x3816e000, 0x38170000, 0x38172000, 0x38174000, 0x38176000,
+0x38178000, 0x3817a000, 0x3817c000, 0x3817e000, 0x38180000, 0x38182000,
+0x38184000, 0x38186000, 0x38188000, 0x3818a000, 0x3818c000, 0x3818e000,
+0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819a000,
+0x3819c000, 0x3819e000, 0x381a0000, 0x381a2000, 0x381a4000, 0x381a6000,
+0x381a8000, 0x381aa000, 0x381ac000, 0x381ae000, 0x381b0000, 0x381b2000,
+0x381b4000, 0x381b6000, 0x381b8000, 0x381ba000, 0x381bc000, 0x381be000,
+0x381c0000, 0x381c2000, 0x381c4000, 0x381c6000, 0x381c8000, 0x381ca000,
+0x381cc000, 0x381ce000, 0x381d0000, 0x381d2000, 0x381d4000, 0x381d6000,
+0x381d8000, 0x381da000, 0x381dc000, 0x381de000, 0x381e0000, 0x381e2000,
+0x381e4000, 0x381e6000, 0x381e8000, 0x381ea000, 0x381ec000, 0x381ee000,
+0x381f0000, 0x381f2000, 0x381f4000, 0x381f6000, 0x381f8000, 0x381fa000,
+0x381fc000, 0x381fe000, 0x38200000, 0x38202000, 0x38204000, 0x38206000,
+0x38208000, 0x3820a000, 0x3820c000, 0x3820e000, 0x38210000, 0x38212000,
+0x38214000, 0x38216000, 0x38218000, 0x3821a000, 0x3821c000, 0x3821e000,
+0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822a000,
+0x3822c000, 0x3822e000, 0x38230000, 0x38232000, 0x38234000, 0x38236000,
+0x38238000, 0x3823a000, 0x3823c000, 0x3823e000, 0x38240000, 0x38242000,
+0x38244000, 0x38246000, 0x38248000, 0x3824a000, 0x3824c000, 0x3824e000,
+0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825a000,
+0x3825c000, 0x3825e000, 0x38260000, 0x38262000, 0x38264000, 0x38266000,
+0x38268000, 0x3826a000, 0x3826c000, 0x3826e000, 0x38270000, 0x38272000,
+0x38274000, 0x38276000, 0x38278000, 0x3827a000, 0x3827c000, 0x3827e000,
+0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828a000,
+0x3828c000, 0x3828e000, 0x38290000, 0x38292000, 0x38294000, 0x38296000,
+0x38298000, 0x3829a000, 0x3829c000, 0x3829e000, 0x382a0000, 0x382a2000,
+0x382a4000, 0x382a6000, 0x382a8000, 0x382aa000, 0x382ac000, 0x382ae000,
+0x382b0000, 0x382b2000, 0x382b4000, 0x382b6000, 0x382b8000, 0x382ba000,
+0x382bc000, 0x382be000, 0x382c0000, 0x382c2000, 0x382c4000, 0x382c6000,
+0x382c8000, 0x382ca000, 0x382cc000, 0x382ce000, 0x382d0000, 0x382d2000,
+0x382d4000, 0x382d6000, 0x382d8000, 0x382da000, 0x382dc000, 0x382de000,
+0x382e0000, 0x382e2000, 0x382e4000, 0x382e6000, 0x382e8000, 0x382ea000,
+0x382ec000, 0x382ee000, 0x382f0000, 0x382f2000, 0x382f4000, 0x382f6000,
+0x382f8000, 0x382fa000, 0x382fc000, 0x382fe000, 0x38300000, 0x38302000,
+0x38304000, 0x38306000, 0x38308000, 0x3830a000, 0x3830c000, 0x3830e000,
+0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831a000,
+0x3831c000, 0x3831e000, 0x38320000, 0x38322000, 0x38324000, 0x38326000,
+0x38328000, 0x3832a000, 0x3832c000, 0x3832e000, 0x38330000, 0x38332000,
+0x38334000, 0x38336000, 0x38338000, 0x3833a000, 0x3833c000, 0x3833e000,
+0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834a000,
+0x3834c000, 0x3834e000, 0x38350000, 0x38352000, 0x38354000, 0x38356000,
+0x38358000, 0x3835a000, 0x3835c000, 0x3835e000, 0x38360000, 0x38362000,
+0x38364000, 0x38366000, 0x38368000, 0x3836a000, 0x3836c000, 0x3836e000,
+0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837a000,
+0x3837c000, 0x3837e000, 0x38380000, 0x38382000, 0x38384000, 0x38386000,
+0x38388000, 0x3838a000, 0x3838c000, 0x3838e000, 0x38390000, 0x38392000,
+0x38394000, 0x38396000, 0x38398000, 0x3839a000, 0x3839c000, 0x3839e000,
+0x383a0000, 0x383a2000, 0x383a4000, 0x383a6000, 0x383a8000, 0x383aa000,
+0x383ac000, 0x383ae000, 0x383b0000, 0x383b2000, 0x383b4000, 0x383b6000,
+0x383b8000, 0x383ba000, 0x383bc000, 0x383be000, 0x383c0000, 0x383c2000,
+0x383c4000, 0x383c6000, 0x383c8000, 0x383ca000, 0x383cc000, 0x383ce000,
+0x383d0000, 0x383d2000, 0x383d4000, 0x383d6000, 0x383d8000, 0x383da000,
+0x383dc000, 0x383de000, 0x383e0000, 0x383e2000, 0x383e4000, 0x383e6000,
+0x383e8000, 0x383ea000, 0x383ec000, 0x383ee000, 0x383f0000, 0x383f2000,
+0x383f4000, 0x383f6000, 0x383f8000, 0x383fa000, 0x383fc000, 0x383fe000,
+0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840a000,
+0x3840c000, 0x3840e000, 0x38410000, 0x38412000, 0x38414000, 0x38416000,
+0x38418000, 0x3841a000, 0x3841c000, 0x3841e000, 0x38420000, 0x38422000,
+0x38424000, 0x38426000, 0x38428000, 0x3842a000, 0x3842c000, 0x3842e000,
+0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843a000,
+0x3843c000, 0x3843e000, 0x38440000, 0x38442000, 0x38444000, 0x38446000,
+0x38448000, 0x3844a000, 0x3844c000, 0x3844e000, 0x38450000, 0x38452000,
+0x38454000, 0x38456000, 0x38458000, 0x3845a000, 0x3845c000, 0x3845e000,
+0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846a000,
+0x3846c000, 0x3846e000, 0x38470000, 0x38472000, 0x38474000, 0x38476000,
+0x38478000, 0x3847a000, 0x3847c000, 0x3847e000, 0x38480000, 0x38482000,
+0x38484000, 0x38486000, 0x38488000, 0x3848a000, 0x3848c000, 0x3848e000,
+0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849a000,
+0x3849c000, 0x3849e000, 0x384a0000, 0x384a2000, 0x384a4000, 0x384a6000,
+0x384a8000, 0x384aa000, 0x384ac000, 0x384ae000, 0x384b0000, 0x384b2000,
+0x384b4000, 0x384b6000, 0x384b8000, 0x384ba000, 0x384bc000, 0x384be000,
+0x384c0000, 0x384c2000, 0x384c4000, 0x384c6000, 0x384c8000, 0x384ca000,
+0x384cc000, 0x384ce000, 0x384d0000, 0x384d2000, 0x384d4000, 0x384d6000,
+0x384d8000, 0x384da000, 0x384dc000, 0x384de000, 0x384e0000, 0x384e2000,
+0x384e4000, 0x384e6000, 0x384e8000, 0x384ea000, 0x384ec000, 0x384ee000,
+0x384f0000, 0x384f2000, 0x384f4000, 0x384f6000, 0x384f8000, 0x384fa000,
+0x384fc000, 0x384fe000, 0x38500000, 0x38502000, 0x38504000, 0x38506000,
+0x38508000, 0x3850a000, 0x3850c000, 0x3850e000, 0x38510000, 0x38512000,
+0x38514000, 0x38516000, 0x38518000, 0x3851a000, 0x3851c000, 0x3851e000,
+0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852a000,
+0x3852c000, 0x3852e000, 0x38530000, 0x38532000, 0x38534000, 0x38536000,
+0x38538000, 0x3853a000, 0x3853c000, 0x3853e000, 0x38540000, 0x38542000,
+0x38544000, 0x38546000, 0x38548000, 0x3854a000, 0x3854c000, 0x3854e000,
+0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855a000,
+0x3855c000, 0x3855e000, 0x38560000, 0x38562000, 0x38564000, 0x38566000,
+0x38568000, 0x3856a000, 0x3856c000, 0x3856e000, 0x38570000, 0x38572000,
+0x38574000, 0x38576000, 0x38578000, 0x3857a000, 0x3857c000, 0x3857e000,
+0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858a000,
+0x3858c000, 0x3858e000, 0x38590000, 0x38592000, 0x38594000, 0x38596000,
+0x38598000, 0x3859a000, 0x3859c000, 0x3859e000, 0x385a0000, 0x385a2000,
+0x385a4000, 0x385a6000, 0x385a8000, 0x385aa000, 0x385ac000, 0x385ae000,
+0x385b0000, 0x385b2000, 0x385b4000, 0x385b6000, 0x385b8000, 0x385ba000,
+0x385bc000, 0x385be000, 0x385c0000, 0x385c2000, 0x385c4000, 0x385c6000,
+0x385c8000, 0x385ca000, 0x385cc000, 0x385ce000, 0x385d0000, 0x385d2000,
+0x385d4000, 0x385d6000, 0x385d8000, 0x385da000, 0x385dc000, 0x385de000,
+0x385e0000, 0x385e2000, 0x385e4000, 0x385e6000, 0x385e8000, 0x385ea000,
+0x385ec000, 0x385ee000, 0x385f0000, 0x385f2000, 0x385f4000, 0x385f6000,
+0x385f8000, 0x385fa000, 0x385fc000, 0x385fe000, 0x38600000, 0x38602000,
+0x38604000, 0x38606000, 0x38608000, 0x3860a000, 0x3860c000, 0x3860e000,
+0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861a000,
+0x3861c000, 0x3861e000, 0x38620000, 0x38622000, 0x38624000, 0x38626000,
+0x38628000, 0x3862a000, 0x3862c000, 0x3862e000, 0x38630000, 0x38632000,
+0x38634000, 0x38636000, 0x38638000, 0x3863a000, 0x3863c000, 0x3863e000,
+0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864a000,
+0x3864c000, 0x3864e000, 0x38650000, 0x38652000, 0x38654000, 0x38656000,
+0x38658000, 0x3865a000, 0x3865c000, 0x3865e000, 0x38660000, 0x38662000,
+0x38664000, 0x38666000, 0x38668000, 0x3866a000, 0x3866c000, 0x3866e000,
+0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867a000,
+0x3867c000, 0x3867e000, 0x38680000, 0x38682000, 0x38684000, 0x38686000,
+0x38688000, 0x3868a000, 0x3868c000, 0x3868e000, 0x38690000, 0x38692000,
+0x38694000, 0x38696000, 0x38698000, 0x3869a000, 0x3869c000, 0x3869e000,
+0x386a0000, 0x386a2000, 0x386a4000, 0x386a6000, 0x386a8000, 0x386aa000,
+0x386ac000, 0x386ae000, 0x386b0000, 0x386b2000, 0x386b4000, 0x386b6000,
+0x386b8000, 0x386ba000, 0x386bc000, 0x386be000, 0x386c0000, 0x386c2000,
+0x386c4000, 0x386c6000, 0x386c8000, 0x386ca000, 0x386cc000, 0x386ce000,
+0x386d0000, 0x386d2000, 0x386d4000, 0x386d6000, 0x386d8000, 0x386da000,
+0x386dc000, 0x386de000, 0x386e0000, 0x386e2000, 0x386e4000, 0x386e6000,
+0x386e8000, 0x386ea000, 0x386ec000, 0x386ee000, 0x386f0000, 0x386f2000,
+0x386f4000, 0x386f6000, 0x386f8000, 0x386fa000, 0x386fc000, 0x386fe000,
+0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870a000,
+0x3870c000, 0x3870e000, 0x38710000, 0x38712000, 0x38714000, 0x38716000,
+0x38718000, 0x3871a000, 0x3871c000, 0x3871e000, 0x38720000, 0x38722000,
+0x38724000, 0x38726000, 0x38728000, 0x3872a000, 0x3872c000, 0x3872e000,
+0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873a000,
+0x3873c000, 0x3873e000, 0x38740000, 0x38742000, 0x38744000, 0x38746000,
+0x38748000, 0x3874a000, 0x3874c000, 0x3874e000, 0x38750000, 0x38752000,
+0x38754000, 0x38756000, 0x38758000, 0x3875a000, 0x3875c000, 0x3875e000,
+0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876a000,
+0x3876c000, 0x3876e000, 0x38770000, 0x38772000, 0x38774000, 0x38776000,
+0x38778000, 0x3877a000, 0x3877c000, 0x3877e000, 0x38780000, 0x38782000,
+0x38784000, 0x38786000, 0x38788000, 0x3878a000, 0x3878c000, 0x3878e000,
+0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879a000,
+0x3879c000, 0x3879e000, 0x387a0000, 0x387a2000, 0x387a4000, 0x387a6000,
+0x387a8000, 0x387aa000, 0x387ac000, 0x387ae000, 0x387b0000, 0x387b2000,
+0x387b4000, 0x387b6000, 0x387b8000, 0x387ba000, 0x387bc000, 0x387be000,
+0x387c0000, 0x387c2000, 0x387c4000, 0x387c6000, 0x387c8000, 0x387ca000,
+0x387cc000, 0x387ce000, 0x387d0000, 0x387d2000, 0x387d4000, 0x387d6000,
+0x387d8000, 0x387da000, 0x387dc000, 0x387de000, 0x387e0000, 0x387e2000,
+0x387e4000, 0x387e6000, 0x387e8000, 0x387ea000, 0x387ec000, 0x387ee000,
+0x387f0000, 0x387f2000, 0x387f4000, 0x387f6000, 0x387f8000, 0x387fa000,
+0x387fc000, 0x387fe000
+};
+
+static cmsUInt16Number Offset[64] = {
+0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0000, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400
+};
+
+static cmsUInt32Number Exponent[64] = {
+0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000,
+0x03000000, 0x03800000, 0x04000000, 0x04800000, 0x05000000, 0x05800000,
+0x06000000, 0x06800000, 0x07000000, 0x07800000, 0x08000000, 0x08800000,
+0x09000000, 0x09800000, 0x0a000000, 0x0a800000, 0x0b000000, 0x0b800000,
+0x0c000000, 0x0c800000, 0x0d000000, 0x0d800000, 0x0e000000, 0x0e800000,
+0x0f000000, 0x47800000, 0x80000000, 0x80800000, 0x81000000, 0x81800000,
+0x82000000, 0x82800000, 0x83000000, 0x83800000, 0x84000000, 0x84800000,
+0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000,
+0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8a000000, 0x8a800000,
+0x8b000000, 0x8b800000, 0x8c000000, 0x8c800000, 0x8d000000, 0x8d800000,
+0x8e000000, 0x8e800000, 0x8f000000, 0xc7800000
+};
+
+static cmsUInt16Number Base[512] = {
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040,
+0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x0c00, 0x1000, 0x1400, 0x1800, 0x1c00,
+0x2000, 0x2400, 0x2800, 0x2c00, 0x3000, 0x3400, 0x3800, 0x3c00, 0x4000, 0x4400,
+0x4800, 0x4c00, 0x5000, 0x5400, 0x5800, 0x5c00, 0x6000, 0x6400, 0x6800, 0x6c00,
+0x7000, 0x7400, 0x7800, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001,
+0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100, 0x8200, 0x8400,
+0x8800, 0x8c00, 0x9000, 0x9400, 0x9800, 0x9c00, 0xa000, 0xa400, 0xa800, 0xac00,
+0xb000, 0xb400, 0xb800, 0xbc00, 0xc000, 0xc400, 0xc800, 0xcc00, 0xd000, 0xd400,
+0xd800, 0xdc00, 0xe000, 0xe400, 0xe800, 0xec00, 0xf000, 0xf400, 0xf800, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00
+};
+
+static cmsUInt8Number  Shift[512] = {
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17,
+0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d,
+0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0d, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13,
+0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x0d
+};
+
+cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h)
+{
+    union {
+        cmsFloat32Number flt;
+        cmsUInt32Number  num;
+    } out;
+
+    int n = h >> 10;
+
+    out.num = Mantissa[  (h & 0x3ff) + Offset[ n ] ] + Exponent[ n ];
+    return out.flt;
+}
+
+cmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt)
+{
+    union {
+        cmsFloat32Number flt;
+        cmsUInt32Number  num;
+    } in;
+
+    cmsUInt32Number n, j;
+
+    in.flt = flt;
+    n = in.num;
+    j = (n >> 23) & 0x1ff;
+
+    return (cmsUInt16Number) ((cmsUInt32Number) Base[ j ] + (( n & 0x007fffff) >> Shift[ j ]));
+}
+
+#endif
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsintrp.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsintrp.c
new file mode 100644
index 0000000..5d5f35d
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsintrp.c
@@ -0,0 +1,1506 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// This module incorporates several interpolation routines, for 1 to 8 channels on input and
+// up to 65535 channels on output. The user may change those by using the interpolation plug-in
+
+// Interpolation routines by default
+static cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags);
+
+// This is the default factory
+_cmsInterpPluginChunkType _cmsInterpPluginChunk = { NULL };
+
+// The interpolation plug-in memory chunk allocator/dup
+void _cmsAllocInterpPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src)
+{
+    void* from;
+
+    _cmsAssert(ctx != NULL);
+
+    if (src != NULL) {
+        from = src ->chunks[InterpPlugin];       
+    }
+    else { 
+        static _cmsInterpPluginChunkType InterpPluginChunk = { NULL };
+
+        from = &InterpPluginChunk;
+    }
+
+    _cmsAssert(from != NULL);
+    ctx ->chunks[InterpPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsInterpPluginChunkType));
+}
+
+
+// Main plug-in entry
+cmsBool  _cmsRegisterInterpPlugin(cmsContext ContextID, cmsPluginBase* Data)
+{
+    cmsPluginInterpolation* Plugin = (cmsPluginInterpolation*) Data;
+    _cmsInterpPluginChunkType* ptr = (_cmsInterpPluginChunkType*) _cmsContextGetClientChunk(ContextID, InterpPlugin);
+
+    if (Data == NULL) {
+
+        ptr ->Interpolators = NULL;
+        return TRUE;
+    }
+
+    // Set replacement functions
+    ptr ->Interpolators = Plugin ->InterpolatorsFactory;
+    return TRUE;
+}
+
+
+// Set the interpolation method
+cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p)
+{      
+    _cmsInterpPluginChunkType* ptr = (_cmsInterpPluginChunkType*) _cmsContextGetClientChunk(ContextID, InterpPlugin);
+
+    p ->Interpolation.Lerp16 = NULL;
+
+   // Invoke factory, possibly in the Plug-in
+    if (ptr ->Interpolators != NULL)
+        p ->Interpolation = ptr->Interpolators(p -> nInputs, p ->nOutputs, p ->dwFlags);
+    
+    // If unsupported by the plug-in, go for the LittleCMS default.
+    // If happens only if an extern plug-in is being used
+    if (p ->Interpolation.Lerp16 == NULL)
+        p ->Interpolation = DefaultInterpolatorsFactory(p ->nInputs, p ->nOutputs, p ->dwFlags);
+
+    // Check for valid interpolator (we just check one member of the union)
+    if (p ->Interpolation.Lerp16 == NULL) {
+            return FALSE;
+    }
+
+    return TRUE;
+}
+
+
+// This function precalculates as many parameters as possible to speed up the interpolation.
+cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID,
+                                           const cmsUInt32Number nSamples[],
+                                           int InputChan, int OutputChan,
+                                           const void *Table,
+                                           cmsUInt32Number dwFlags)
+{
+    cmsInterpParams* p;
+    int i;
+
+    // Check for maximum inputs
+    if (InputChan > MAX_INPUT_DIMENSIONS) {
+             cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", InputChan, MAX_INPUT_DIMENSIONS);
+            return NULL;
+    }
+
+    // Creates an empty object
+    p = (cmsInterpParams*) _cmsMallocZero(ContextID, sizeof(cmsInterpParams));
+    if (p == NULL) return NULL;
+
+    // Keep original parameters
+    p -> dwFlags  = dwFlags;
+    p -> nInputs  = InputChan;
+    p -> nOutputs = OutputChan;
+    p ->Table     = Table;
+    p ->ContextID  = ContextID;
+
+    // Fill samples per input direction and domain (which is number of nodes minus one)
+    for (i=0; i < InputChan; i++) {
+
+        p -> nSamples[i] = nSamples[i];
+        p -> Domain[i]   = nSamples[i] - 1;
+    }
+
+    // Compute factors to apply to each component to index the grid array
+    p -> opta[0] = p -> nOutputs;
+    for (i=1; i < InputChan; i++)
+        p ->opta[i] = p ->opta[i-1] * nSamples[InputChan-i];
+
+
+    if (!_cmsSetInterpolationRoutine(ContextID, p)) {
+         cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported interpolation (%d->%d channels)", InputChan, OutputChan);
+        _cmsFree(ContextID, p);
+        return NULL;
+    }
+
+    // All seems ok
+    return p;
+}
+
+
+// This one is a wrapper on the anterior, but assuming all directions have same number of nodes
+cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags)
+{
+    int i;
+    cmsUInt32Number Samples[MAX_INPUT_DIMENSIONS];
+
+    // Fill the auxiliar array
+    for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
+        Samples[i] = nSamples;
+
+    // Call the extended function
+    return _cmsComputeInterpParamsEx(ContextID, Samples, InputChan, OutputChan, Table, dwFlags);
+}
+
+
+// Free all associated memory
+void _cmsFreeInterpParams(cmsInterpParams* p)
+{
+    if (p != NULL) _cmsFree(p ->ContextID, p);
+}
+
+
+// Inline fixed point interpolation
+cmsINLINE cmsUInt16Number LinearInterp(cmsS15Fixed16Number a, cmsS15Fixed16Number l, cmsS15Fixed16Number h)
+{
+    cmsUInt32Number dif = (cmsUInt32Number) (h - l) * a + 0x8000;
+    dif = (dif >> 16) + l;
+    return (cmsUInt16Number) (dif);
+}
+
+
+//  Linear interpolation (Fixed-point optimized)
+static
+void LinLerp1D(register const cmsUInt16Number Value[],
+               register cmsUInt16Number Output[],
+               register const cmsInterpParams* p)
+{
+    cmsUInt16Number y1, y0;
+    int cell0, rest;
+    int val3;
+    const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table;
+
+    // if last value...
+    if (Value[0] == 0xffff) {
+
+        Output[0] = LutTable[p -> Domain[0]];
+        return;
+    }
+
+    val3 = p -> Domain[0] * Value[0];
+    val3 = _cmsToFixedDomain(val3);    // To fixed 15.16
+
+    cell0 = FIXED_TO_INT(val3);             // Cell is 16 MSB bits
+    rest  = FIXED_REST_TO_INT(val3);        // Rest is 16 LSB bits
+
+    y0 = LutTable[cell0];
+    y1 = LutTable[cell0+1];
+
+
+    Output[0] = LinearInterp(rest, y0, y1);
+}
+
+// To prevent out of bounds indexing
+cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v) 
+{
+    return v < 0.0f ? 0.0f : (v > 1.0f ? 1.0f : v);
+}
+
+// Floating-point version of 1D interpolation
+static
+void LinLerp1Dfloat(const cmsFloat32Number Value[],
+                    cmsFloat32Number Output[],
+                    const cmsInterpParams* p)
+{
+       cmsFloat32Number y1, y0;
+       cmsFloat32Number val2, rest;
+       int cell0, cell1;
+       const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
+
+       val2 = fclamp(Value[0]);
+
+       // if last value...
+       if (val2 == 1.0) {
+           Output[0] = LutTable[p -> Domain[0]];
+           return;
+       }
+
+       val2 *= p -> Domain[0];
+
+       cell0 = (int) floor(val2);
+       cell1 = (int) ceil(val2);
+
+       // Rest is 16 LSB bits
+       rest = val2 - cell0;
+
+       y0 = LutTable[cell0] ;
+       y1 = LutTable[cell1] ;
+
+       Output[0] = y0 + (y1 - y0) * rest;
+}
+
+
+
+// Eval gray LUT having only one input channel
+static
+void Eval1Input(register const cmsUInt16Number Input[],
+                register cmsUInt16Number Output[],
+                register const cmsInterpParams* p16)
+{
+       cmsS15Fixed16Number fk;
+       cmsS15Fixed16Number k0, k1, rk, K0, K1;
+       int v;
+       cmsUInt32Number OutChan;
+       const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
+
+       v = Input[0] * p16 -> Domain[0];
+       fk = _cmsToFixedDomain(v);
+
+       k0 = FIXED_TO_INT(fk);
+       rk = (cmsUInt16Number) FIXED_REST_TO_INT(fk);
+
+       k1 = k0 + (Input[0] != 0xFFFFU ? 1 : 0);
+
+       K0 = p16 -> opta[0] * k0;
+       K1 = p16 -> opta[0] * k1;
+
+       for (OutChan=0; OutChan < p16->nOutputs; OutChan++) {
+
+           Output[OutChan] = LinearInterp(rk, LutTable[K0+OutChan], LutTable[K1+OutChan]);
+       }
+}
+
+
+
+// Eval gray LUT having only one input channel
+static
+void Eval1InputFloat(const cmsFloat32Number Value[],
+                     cmsFloat32Number Output[],
+                     const cmsInterpParams* p)
+{
+    cmsFloat32Number y1, y0;
+    cmsFloat32Number val2, rest;
+    int cell0, cell1;
+    cmsUInt32Number OutChan;
+    const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
+
+    val2 = fclamp(Value[0]);
+
+        // if last value...
+       if (val2 == 1.0) {
+           Output[0] = LutTable[p -> Domain[0]];
+           return;
+       }
+
+       val2 *= p -> Domain[0];
+
+       cell0 = (int) floor(val2);
+       cell1 = (int) ceil(val2);
+
+       // Rest is 16 LSB bits
+       rest = val2 - cell0;
+
+       cell0 *= p -> opta[0];
+       cell1 *= p -> opta[0];
+
+       for (OutChan=0; OutChan < p->nOutputs; OutChan++) {
+
+            y0 = LutTable[cell0 + OutChan] ;
+            y1 = LutTable[cell1 + OutChan] ;
+
+            Output[OutChan] = y0 + (y1 - y0) * rest;
+       }
+}
+
+// Bilinear interpolation (16 bits) - cmsFloat32Number version
+static
+void BilinearInterpFloat(const cmsFloat32Number Input[],
+                         cmsFloat32Number Output[],
+                         const cmsInterpParams* p)
+
+{
+#   define LERP(a,l,h)    (cmsFloat32Number) ((l)+(((h)-(l))*(a)))
+#   define DENS(i,j)      (LutTable[(i)+(j)+OutChan])
+
+    const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
+    cmsFloat32Number      px, py;
+    int        x0, y0,
+               X0, Y0, X1, Y1;
+    int        TotalOut, OutChan;
+    cmsFloat32Number      fx, fy,
+        d00, d01, d10, d11,
+        dx0, dx1,
+        dxy;
+
+    TotalOut   = p -> nOutputs;
+    px = fclamp(Input[0]) * p->Domain[0];
+    py = fclamp(Input[1]) * p->Domain[1];
+
+    x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0;
+    y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;
+
+    X0 = p -> opta[1] * x0;
+    X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[1]);
+
+    Y0 = p -> opta[0] * y0;
+    Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[0]);
+
+    for (OutChan = 0; OutChan < TotalOut; OutChan++) {
+
+        d00 = DENS(X0, Y0);
+        d01 = DENS(X0, Y1);
+        d10 = DENS(X1, Y0);
+        d11 = DENS(X1, Y1);
+
+        dx0 = LERP(fx, d00, d10);
+        dx1 = LERP(fx, d01, d11);
+
+        dxy = LERP(fy, dx0, dx1);
+
+        Output[OutChan] = dxy;
+    }
+
+
+#   undef LERP
+#   undef DENS
+}
+
+// Bilinear interpolation (16 bits) - optimized version
+static
+void BilinearInterp16(register const cmsUInt16Number Input[],
+                      register cmsUInt16Number Output[],
+                      register const cmsInterpParams* p)
+
+{
+#define DENS(i,j) (LutTable[(i)+(j)+OutChan])
+#define LERP(a,l,h)     (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a)))
+
+           const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table;
+           int        OutChan, TotalOut;
+           cmsS15Fixed16Number    fx, fy;
+  register int        rx, ry;
+           int        x0, y0;
+  register int        X0, X1, Y0, Y1;
+           int        d00, d01, d10, d11,
+                      dx0, dx1,
+                      dxy;
+
+    TotalOut   = p -> nOutputs;
+
+    fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]);
+    x0  = FIXED_TO_INT(fx);
+    rx  = FIXED_REST_TO_INT(fx);    // Rest in 0..1.0 domain
+
+
+    fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]);
+    y0  = FIXED_TO_INT(fy);
+    ry  = FIXED_REST_TO_INT(fy);
+
+
+    X0 = p -> opta[1] * x0;
+    X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[1]);
+
+    Y0 = p -> opta[0] * y0;
+    Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[0]);
+
+    for (OutChan = 0; OutChan < TotalOut; OutChan++) {
+
+        d00 = DENS(X0, Y0);
+        d01 = DENS(X0, Y1);
+        d10 = DENS(X1, Y0);
+        d11 = DENS(X1, Y1);
+
+        dx0 = LERP(rx, d00, d10);
+        dx1 = LERP(rx, d01, d11);
+
+        dxy = LERP(ry, dx0, dx1);
+
+        Output[OutChan] = (cmsUInt16Number) dxy;
+    }
+
+
+#   undef LERP
+#   undef DENS
+}
+
+
+// Trilinear interpolation (16 bits) - cmsFloat32Number version
+static
+void TrilinearInterpFloat(const cmsFloat32Number Input[],
+                          cmsFloat32Number Output[],
+                          const cmsInterpParams* p)
+
+{
+#   define LERP(a,l,h)      (cmsFloat32Number) ((l)+(((h)-(l))*(a)))
+#   define DENS(i,j,k)      (LutTable[(i)+(j)+(k)+OutChan])
+
+    const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
+    cmsFloat32Number      px, py, pz;
+    int        x0, y0, z0,
+               X0, Y0, Z0, X1, Y1, Z1;
+    int        TotalOut, OutChan;
+    cmsFloat32Number      fx, fy, fz,
+        d000, d001, d010, d011,
+        d100, d101, d110, d111,
+        dx00, dx01, dx10, dx11,
+        dxy0, dxy1, dxyz;
+
+    TotalOut   = p -> nOutputs;
+
+    // We need some clipping here
+    px = fclamp(Input[0]) * p->Domain[0];
+    py = fclamp(Input[1]) * p->Domain[1];
+    pz = fclamp(Input[2]) * p->Domain[2];
+
+    x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0;
+    y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;
+    z0 = (int) _cmsQuickFloor(pz); fz = pz - (cmsFloat32Number) z0;
+
+    X0 = p -> opta[2] * x0;
+    X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[2]);
+
+    Y0 = p -> opta[1] * y0;
+    Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[1]);
+
+    Z0 = p -> opta[0] * z0;
+    Z1 = Z0 + (Input[2] >= 1.0 ? 0 : p->opta[0]);
+
+    for (OutChan = 0; OutChan < TotalOut; OutChan++) {
+
+        d000 = DENS(X0, Y0, Z0);
+        d001 = DENS(X0, Y0, Z1);
+        d010 = DENS(X0, Y1, Z0);
+        d011 = DENS(X0, Y1, Z1);
+
+        d100 = DENS(X1, Y0, Z0);
+        d101 = DENS(X1, Y0, Z1);
+        d110 = DENS(X1, Y1, Z0);
+        d111 = DENS(X1, Y1, Z1);
+
+
+        dx00 = LERP(fx, d000, d100);
+        dx01 = LERP(fx, d001, d101);
+        dx10 = LERP(fx, d010, d110);
+        dx11 = LERP(fx, d011, d111);
+
+        dxy0 = LERP(fy, dx00, dx10);
+        dxy1 = LERP(fy, dx01, dx11);
+
+        dxyz = LERP(fz, dxy0, dxy1);
+
+        Output[OutChan] = dxyz;
+    }
+
+
+#   undef LERP
+#   undef DENS
+}
+
+// Trilinear interpolation (16 bits) - optimized version
+static
+void TrilinearInterp16(register const cmsUInt16Number Input[],
+                       register cmsUInt16Number Output[],
+                       register const cmsInterpParams* p)
+
+{
+#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
+#define LERP(a,l,h)     (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a)))
+
+           const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table;
+           int        OutChan, TotalOut;
+           cmsS15Fixed16Number    fx, fy, fz;
+  register int        rx, ry, rz;
+           int        x0, y0, z0;
+  register int        X0, X1, Y0, Y1, Z0, Z1;
+           int        d000, d001, d010, d011,
+                      d100, d101, d110, d111,
+                      dx00, dx01, dx10, dx11,
+                      dxy0, dxy1, dxyz;
+
+    TotalOut   = p -> nOutputs;
+
+    fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]);
+    x0  = FIXED_TO_INT(fx);
+    rx  = FIXED_REST_TO_INT(fx);    // Rest in 0..1.0 domain
+
+
+    fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]);
+    y0  = FIXED_TO_INT(fy);
+    ry  = FIXED_REST_TO_INT(fy);
+
+    fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]);
+    z0 = FIXED_TO_INT(fz);
+    rz = FIXED_REST_TO_INT(fz);
+
+
+    X0 = p -> opta[2] * x0;
+    X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[2]);
+
+    Y0 = p -> opta[1] * y0;
+    Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[1]);
+
+    Z0 = p -> opta[0] * z0;
+    Z1 = Z0 + (Input[2] == 0xFFFFU ? 0 : p->opta[0]);
+
+    for (OutChan = 0; OutChan < TotalOut; OutChan++) {
+
+        d000 = DENS(X0, Y0, Z0);
+        d001 = DENS(X0, Y0, Z1);
+        d010 = DENS(X0, Y1, Z0);
+        d011 = DENS(X0, Y1, Z1);
+
+        d100 = DENS(X1, Y0, Z0);
+        d101 = DENS(X1, Y0, Z1);
+        d110 = DENS(X1, Y1, Z0);
+        d111 = DENS(X1, Y1, Z1);
+
+
+        dx00 = LERP(rx, d000, d100);
+        dx01 = LERP(rx, d001, d101);
+        dx10 = LERP(rx, d010, d110);
+        dx11 = LERP(rx, d011, d111);
+
+        dxy0 = LERP(ry, dx00, dx10);
+        dxy1 = LERP(ry, dx01, dx11);
+
+        dxyz = LERP(rz, dxy0, dxy1);
+
+        Output[OutChan] = (cmsUInt16Number) dxyz;
+    }
+
+
+#   undef LERP
+#   undef DENS
+}
+
+
+// Tetrahedral interpolation, using Sakamoto algorithm.
+#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
+static
+void TetrahedralInterpFloat(const cmsFloat32Number Input[],
+                            cmsFloat32Number Output[],
+                            const cmsInterpParams* p)
+{
+    const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;
+    cmsFloat32Number     px, py, pz;
+    int        x0, y0, z0,
+               X0, Y0, Z0, X1, Y1, Z1;
+    cmsFloat32Number     rx, ry, rz;
+    cmsFloat32Number     c0, c1=0, c2=0, c3=0;
+    int                  OutChan, TotalOut;
+
+    TotalOut   = p -> nOutputs;
+
+    // We need some clipping here
+    px = fclamp(Input[0]) * p->Domain[0];
+    py = fclamp(Input[1]) * p->Domain[1];
+    pz = fclamp(Input[2]) * p->Domain[2];
+
+    x0 = (int) _cmsQuickFloor(px); rx = (px - (cmsFloat32Number) x0);
+    y0 = (int) _cmsQuickFloor(py); ry = (py - (cmsFloat32Number) y0);
+    z0 = (int) _cmsQuickFloor(pz); rz = (pz - (cmsFloat32Number) z0);
+
+
+    X0 = p -> opta[2] * x0;
+    X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[2]);
+
+    Y0 = p -> opta[1] * y0;
+    Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[1]);
+
+    Z0 = p -> opta[0] * z0;
+    Z1 = Z0 + (Input[2] >= 1.0 ? 0 : p->opta[0]);
+
+    for (OutChan=0; OutChan < TotalOut; OutChan++) {
+
+       // These are the 6 Tetrahedral
+
+        c0 = DENS(X0, Y0, Z0);
+
+        if (rx >= ry && ry >= rz) {
+
+            c1 = DENS(X1, Y0, Z0) - c0;
+            c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);
+            c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+        }
+        else
+            if (rx >= rz && rz >= ry) {
+
+                c1 = DENS(X1, Y0, Z0) - c0;
+                c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+                c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);
+
+            }
+            else
+                if (rz >= rx && rx >= ry) {
+
+                    c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);
+                    c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+                    c3 = DENS(X0, Y0, Z1) - c0;
+
+                }
+                else
+                    if (ry >= rx && rx >= rz) {
+
+                        c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);
+                        c2 = DENS(X0, Y1, Z0) - c0;
+                        c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+                    }
+                    else
+                        if (ry >= rz && rz >= rx) {
+
+                            c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+                            c2 = DENS(X0, Y1, Z0) - c0;
+                            c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);
+
+                        }
+                        else
+                            if (rz >= ry && ry >= rx) {
+
+                                c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+                                c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);
+                                c3 = DENS(X0, Y0, Z1) - c0;
+
+                            }
+                            else  {
+                                c1 = c2 = c3 = 0;
+                            }
+
+       Output[OutChan] = c0 + c1 * rx + c2 * ry + c3 * rz;
+       }
+
+}
+
+#undef DENS
+
+
+
+
+static
+void TetrahedralInterp16(register const cmsUInt16Number Input[],
+                         register cmsUInt16Number Output[],
+                         register const cmsInterpParams* p)
+{
+    const cmsUInt16Number* LutTable = (cmsUInt16Number*) p -> Table;
+    cmsS15Fixed16Number fx, fy, fz;
+    cmsS15Fixed16Number rx, ry, rz;
+    int x0, y0, z0;
+    cmsS15Fixed16Number c0, c1, c2, c3, Rest;
+    cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1;
+    cmsUInt32Number TotalOut = p -> nOutputs;
+
+    fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]);
+    fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]);
+    fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]);
+
+    x0 = FIXED_TO_INT(fx);
+    y0 = FIXED_TO_INT(fy);
+    z0 = FIXED_TO_INT(fz);
+
+    rx = FIXED_REST_TO_INT(fx);
+    ry = FIXED_REST_TO_INT(fy);
+    rz = FIXED_REST_TO_INT(fz);
+
+    X0 = p -> opta[2] * x0;
+    X1 = (Input[0] == 0xFFFFU ? 0 : p->opta[2]);
+
+    Y0 = p -> opta[1] * y0;
+    Y1 = (Input[1] == 0xFFFFU ? 0 : p->opta[1]);
+
+    Z0 = p -> opta[0] * z0;
+    Z1 = (Input[2] == 0xFFFFU ? 0 : p->opta[0]);
+
+    LutTable = &LutTable[X0+Y0+Z0];
+
+    // Output should be computed as x = ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest))
+    // which expands as: x = (Rest + ((Rest+0x7fff)/0xFFFF) + 0x8000)>>16
+    // This can be replaced by: t = Rest+0x8001, x = (t + (t>>16))>>16
+    // at the cost of being off by one at 7fff and 17ffe.
+
+    if (rx >= ry) {
+        if (ry >= rz) {
+            Y1 += X1;
+            Z1 += Y1;
+            for (; TotalOut; TotalOut--) {
+                c1 = LutTable[X1];
+                c2 = LutTable[Y1];
+                c3 = LutTable[Z1];
+                c0 = *LutTable++;
+                c3 -= c2;
+                c2 -= c1;
+                c1 -= c0;
+                Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+                *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);
+            }
+        } else if (rz >= rx) {
+            X1 += Z1;
+            Y1 += X1;
+            for (; TotalOut; TotalOut--) {
+                c1 = LutTable[X1];
+                c2 = LutTable[Y1];
+                c3 = LutTable[Z1];
+                c0 = *LutTable++;
+                c2 -= c1;
+                c1 -= c3;
+                c3 -= c0;
+                Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+                *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);
+            }
+        } else {
+            Z1 += X1;
+            Y1 += Z1;
+            for (; TotalOut; TotalOut--) {
+                c1 = LutTable[X1];
+                c2 = LutTable[Y1];
+                c3 = LutTable[Z1];
+                c0 = *LutTable++;
+                c2 -= c3;
+                c3 -= c1;
+                c1 -= c0;
+                Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+                *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);
+            }
+        }
+    } else {
+        if (rx >= rz) {
+            X1 += Y1;
+            Z1 += X1;
+            for (; TotalOut; TotalOut--) {
+                c1 = LutTable[X1];
+                c2 = LutTable[Y1];
+                c3 = LutTable[Z1];
+                c0 = *LutTable++;
+                c3 -= c1;
+                c1 -= c2;
+                c2 -= c0;
+                Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+                *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);
+            }
+        } else if (ry >= rz) {
+            Z1 += Y1;
+            X1 += Z1;
+            for (; TotalOut; TotalOut--) {
+                c1 = LutTable[X1];
+                c2 = LutTable[Y1];
+                c3 = LutTable[Z1];
+                c0 = *LutTable++;
+                c1 -= c3;
+                c3 -= c2;
+                c2 -= c0;
+                Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+                *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);
+            }
+        } else {
+            Y1 += Z1;
+            X1 += Y1;
+            for (; TotalOut; TotalOut--) {
+                c1 = LutTable[X1];
+                c2 = LutTable[Y1];
+                c3 = LutTable[Z1];
+                c0 = *LutTable++;
+                c1 -= c2;
+                c2 -= c3;
+                c3 -= c0;
+                Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+                *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);
+            }
+        }
+    }
+}
+
+
+#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
+static
+void Eval4Inputs(register const cmsUInt16Number Input[],
+                     register cmsUInt16Number Output[],
+                     register const cmsInterpParams* p16)
+{
+    const cmsUInt16Number* LutTable;
+    cmsS15Fixed16Number fk;
+    cmsS15Fixed16Number k0, rk;
+    int K0, K1;
+    cmsS15Fixed16Number    fx, fy, fz;
+    cmsS15Fixed16Number    rx, ry, rz;
+    int                    x0, y0, z0;
+    cmsS15Fixed16Number    X0, X1, Y0, Y1, Z0, Z1;
+    cmsUInt32Number i;
+    cmsS15Fixed16Number    c0, c1, c2, c3, Rest;
+    cmsUInt32Number        OutChan;
+    cmsUInt16Number        Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+
+
+    fk  = _cmsToFixedDomain((int) Input[0] * p16 -> Domain[0]);
+    fx  = _cmsToFixedDomain((int) Input[1] * p16 -> Domain[1]);
+    fy  = _cmsToFixedDomain((int) Input[2] * p16 -> Domain[2]);
+    fz  = _cmsToFixedDomain((int) Input[3] * p16 -> Domain[3]);
+
+    k0  = FIXED_TO_INT(fk);
+    x0  = FIXED_TO_INT(fx);
+    y0  = FIXED_TO_INT(fy);
+    z0  = FIXED_TO_INT(fz);
+
+    rk  = FIXED_REST_TO_INT(fk);
+    rx  = FIXED_REST_TO_INT(fx);
+    ry  = FIXED_REST_TO_INT(fy);
+    rz  = FIXED_REST_TO_INT(fz);
+
+    K0 = p16 -> opta[3] * k0;
+    K1 = K0 + (Input[0] == 0xFFFFU ? 0 : p16->opta[3]);
+
+    X0 = p16 -> opta[2] * x0;
+    X1 = X0 + (Input[1] == 0xFFFFU ? 0 : p16->opta[2]);
+
+    Y0 = p16 -> opta[1] * y0;
+    Y1 = Y0 + (Input[2] == 0xFFFFU ? 0 : p16->opta[1]);
+
+    Z0 = p16 -> opta[0] * z0;
+    Z1 = Z0 + (Input[3] == 0xFFFFU ? 0 : p16->opta[0]);
+
+    LutTable = (cmsUInt16Number*) p16 -> Table;
+    LutTable += K0;
+
+    for (OutChan=0; OutChan < p16 -> nOutputs; OutChan++) {
+
+        c0 = DENS(X0, Y0, Z0);
+
+        if (rx >= ry && ry >= rz) {
+
+            c1 = DENS(X1, Y0, Z0) - c0;
+            c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);
+            c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+        }
+        else
+            if (rx >= rz && rz >= ry) {
+
+                c1 = DENS(X1, Y0, Z0) - c0;
+                c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+                c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);
+
+            }
+            else
+                if (rz >= rx && rx >= ry) {
+
+                    c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);
+                    c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+                    c3 = DENS(X0, Y0, Z1) - c0;
+
+                }
+                else
+                    if (ry >= rx && rx >= rz) {
+
+                        c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);
+                        c2 = DENS(X0, Y1, Z0) - c0;
+                        c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+                    }
+                    else
+                        if (ry >= rz && rz >= rx) {
+
+                            c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+                            c2 = DENS(X0, Y1, Z0) - c0;
+                            c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);
+
+                        }
+                        else
+                            if (rz >= ry && ry >= rx) {
+
+                                c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+                                c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);
+                                c3 = DENS(X0, Y0, Z1) - c0;
+
+                            }
+                            else  {
+                                c1 = c2 = c3 = 0;
+                            }
+
+                            Rest = c1 * rx + c2 * ry + c3 * rz;
+
+                            Tmp1[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest));
+    }
+
+
+    LutTable = (cmsUInt16Number*) p16 -> Table;
+    LutTable += K1;
+
+    for (OutChan=0; OutChan < p16 -> nOutputs; OutChan++) {
+
+        c0 = DENS(X0, Y0, Z0);
+
+        if (rx >= ry && ry >= rz) {
+
+            c1 = DENS(X1, Y0, Z0) - c0;
+            c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);
+            c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+        }
+        else
+            if (rx >= rz && rz >= ry) {
+
+                c1 = DENS(X1, Y0, Z0) - c0;
+                c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+                c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);
+
+            }
+            else
+                if (rz >= rx && rx >= ry) {
+
+                    c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);
+                    c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+                    c3 = DENS(X0, Y0, Z1) - c0;
+
+                }
+                else
+                    if (ry >= rx && rx >= rz) {
+
+                        c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);
+                        c2 = DENS(X0, Y1, Z0) - c0;
+                        c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+                    }
+                    else
+                        if (ry >= rz && rz >= rx) {
+
+                            c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+                            c2 = DENS(X0, Y1, Z0) - c0;
+                            c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);
+
+                        }
+                        else
+                            if (rz >= ry && ry >= rx) {
+
+                                c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+                                c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);
+                                c3 = DENS(X0, Y0, Z1) - c0;
+
+                            }
+                            else  {
+                                c1 = c2 = c3 = 0;
+                            }
+
+                            Rest = c1 * rx + c2 * ry + c3 * rz;
+
+                            Tmp2[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest));
+    }
+
+
+
+    for (i=0; i < p16 -> nOutputs; i++) {
+        Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);
+    }
+}
+#undef DENS
+
+
+// For more that 3 inputs (i.e., CMYK)
+// evaluate two 3-dimensional interpolations and then linearly interpolate between them.
+
+
+static
+void Eval4InputsFloat(const cmsFloat32Number Input[],
+                      cmsFloat32Number Output[],
+                      const cmsInterpParams* p)
+{
+       const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;
+       cmsFloat32Number rest;
+       cmsFloat32Number pk;
+       int k0, K0, K1;
+       const cmsFloat32Number* T;
+       cmsUInt32Number i;
+       cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+       cmsInterpParams p1;
+
+       pk = fclamp(Input[0]) * p->Domain[0];
+       k0 = _cmsQuickFloor(pk);
+       rest = pk - (cmsFloat32Number) k0;
+
+       K0 = p -> opta[3] * k0;
+       K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[3]);
+
+       p1 = *p;
+       memmove(&p1.Domain[0], &p ->Domain[1], 3*sizeof(cmsUInt32Number));
+
+       T = LutTable + K0;
+       p1.Table = T;
+
+       TetrahedralInterpFloat(Input + 1,  Tmp1, &p1);
+
+       T = LutTable + K1;
+       p1.Table = T;
+       TetrahedralInterpFloat(Input + 1,  Tmp2, &p1);
+
+       for (i=0; i < p -> nOutputs; i++)
+       {
+              cmsFloat32Number y0 = Tmp1[i];
+              cmsFloat32Number y1 = Tmp2[i];
+
+              Output[i] = y0 + (y1 - y0) * rest;
+       }
+}
+
+
+static
+void Eval5Inputs(register const cmsUInt16Number Input[],
+                 register cmsUInt16Number Output[],
+
+                 register const cmsInterpParams* p16)
+{
+       const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
+       cmsS15Fixed16Number fk;
+       cmsS15Fixed16Number k0, rk;
+       int K0, K1;
+       const cmsUInt16Number* T;
+       cmsUInt32Number i;
+       cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+       cmsInterpParams p1;
+
+
+       fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);
+       k0 = FIXED_TO_INT(fk);
+       rk = FIXED_REST_TO_INT(fk);
+
+       K0 = p16 -> opta[4] * k0;
+       K1 = p16 -> opta[4] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));
+
+       p1 = *p16;
+       memmove(&p1.Domain[0], &p16 ->Domain[1], 4*sizeof(cmsUInt32Number));
+
+       T = LutTable + K0;
+       p1.Table = T;
+
+       Eval4Inputs(Input + 1, Tmp1, &p1);
+
+       T = LutTable + K1;
+       p1.Table = T;
+
+       Eval4Inputs(Input + 1, Tmp2, &p1);
+
+       for (i=0; i < p16 -> nOutputs; i++) {
+
+              Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);
+       }
+
+}
+
+
+static
+void Eval5InputsFloat(const cmsFloat32Number Input[],
+                      cmsFloat32Number Output[],
+                      const cmsInterpParams* p)
+{
+       const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;
+       cmsFloat32Number rest;
+       cmsFloat32Number pk;
+       int k0, K0, K1;
+       const cmsFloat32Number* T;
+       cmsUInt32Number i;
+       cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+       cmsInterpParams p1;
+
+       pk = fclamp(Input[0]) * p->Domain[0];
+       k0 = _cmsQuickFloor(pk);
+       rest = pk - (cmsFloat32Number) k0;
+
+       K0 = p -> opta[4] * k0;
+       K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[4]);
+
+       p1 = *p;
+       memmove(&p1.Domain[0], &p ->Domain[1], 4*sizeof(cmsUInt32Number));
+
+       T = LutTable + K0;
+       p1.Table = T;
+
+       Eval4InputsFloat(Input + 1,  Tmp1, &p1);
+
+       T = LutTable + K1;
+       p1.Table = T;
+
+       Eval4InputsFloat(Input + 1,  Tmp2, &p1);
+
+       for (i=0; i < p -> nOutputs; i++) {
+
+              cmsFloat32Number y0 = Tmp1[i];
+              cmsFloat32Number y1 = Tmp2[i];
+
+              Output[i] = y0 + (y1 - y0) * rest;
+       }
+}
+
+
+
+static
+void Eval6Inputs(register const cmsUInt16Number Input[],
+                 register cmsUInt16Number Output[],
+                 register const cmsInterpParams* p16)
+{
+       const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
+       cmsS15Fixed16Number fk;
+       cmsS15Fixed16Number k0, rk;
+       int K0, K1;
+       const cmsUInt16Number* T;
+       cmsUInt32Number i;
+       cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+       cmsInterpParams p1;
+
+       fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);
+       k0 = FIXED_TO_INT(fk);
+       rk = FIXED_REST_TO_INT(fk);
+
+       K0 = p16 -> opta[5] * k0;
+       K1 = p16 -> opta[5] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));
+
+       p1 = *p16;
+       memmove(&p1.Domain[0], &p16 ->Domain[1], 5*sizeof(cmsUInt32Number));
+
+       T = LutTable + K0;
+       p1.Table = T;
+
+       Eval5Inputs(Input + 1, Tmp1, &p1);
+
+       T = LutTable + K1;
+       p1.Table = T;
+
+       Eval5Inputs(Input + 1, Tmp2, &p1);
+
+       for (i=0; i < p16 -> nOutputs; i++) {
+
+              Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);
+       }
+
+}
+
+
+static
+void Eval6InputsFloat(const cmsFloat32Number Input[],
+                      cmsFloat32Number Output[],
+                      const cmsInterpParams* p)
+{
+       const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;
+       cmsFloat32Number rest;
+       cmsFloat32Number pk;
+       int k0, K0, K1;
+       const cmsFloat32Number* T;
+       cmsUInt32Number i;
+       cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+       cmsInterpParams p1;
+
+       pk = fclamp(Input[0]) * p->Domain[0];
+       k0 = _cmsQuickFloor(pk);
+       rest = pk - (cmsFloat32Number) k0;
+
+       K0 = p -> opta[5] * k0;
+       K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[5]);
+
+       p1 = *p;
+       memmove(&p1.Domain[0], &p ->Domain[1], 5*sizeof(cmsUInt32Number));
+
+       T = LutTable + K0;
+       p1.Table = T;
+
+       Eval5InputsFloat(Input + 1,  Tmp1, &p1);
+
+       T = LutTable + K1;
+       p1.Table = T;
+
+       Eval5InputsFloat(Input + 1,  Tmp2, &p1);
+
+       for (i=0; i < p -> nOutputs; i++) {
+
+              cmsFloat32Number y0 = Tmp1[i];
+              cmsFloat32Number y1 = Tmp2[i];
+
+              Output[i] = y0 + (y1 - y0) * rest;
+       }
+}
+
+
+static
+void Eval7Inputs(register const cmsUInt16Number Input[],
+                 register cmsUInt16Number Output[],
+                 register const cmsInterpParams* p16)
+{
+       const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
+       cmsS15Fixed16Number fk;
+       cmsS15Fixed16Number k0, rk;
+       int K0, K1;
+       const cmsUInt16Number* T;
+       cmsUInt32Number i;
+       cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+       cmsInterpParams p1;
+
+
+       fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);
+       k0 = FIXED_TO_INT(fk);
+       rk = FIXED_REST_TO_INT(fk);
+
+       K0 = p16 -> opta[6] * k0;
+       K1 = p16 -> opta[6] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));
+
+       p1 = *p16;
+       memmove(&p1.Domain[0], &p16 ->Domain[1], 6*sizeof(cmsUInt32Number));
+
+       T = LutTable + K0;
+       p1.Table = T;
+
+       Eval6Inputs(Input + 1, Tmp1, &p1);
+
+       T = LutTable + K1;
+       p1.Table = T;
+
+       Eval6Inputs(Input + 1, Tmp2, &p1);
+
+       for (i=0; i < p16 -> nOutputs; i++) {
+              Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);
+       }
+}
+
+
+static
+void Eval7InputsFloat(const cmsFloat32Number Input[],
+                      cmsFloat32Number Output[],
+                      const cmsInterpParams* p)
+{
+       const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;
+       cmsFloat32Number rest;
+       cmsFloat32Number pk;
+       int k0, K0, K1;
+       const cmsFloat32Number* T;
+       cmsUInt32Number i;
+       cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+       cmsInterpParams p1;
+
+       pk = fclamp(Input[0]) * p->Domain[0];
+       k0 = _cmsQuickFloor(pk);
+       rest = pk - (cmsFloat32Number) k0;
+
+       K0 = p -> opta[6] * k0;
+       K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[6]);
+
+       p1 = *p;
+       memmove(&p1.Domain[0], &p ->Domain[1], 6*sizeof(cmsUInt32Number));
+
+       T = LutTable + K0;
+       p1.Table = T;
+
+       Eval6InputsFloat(Input + 1,  Tmp1, &p1);
+
+       T = LutTable + K1;
+       p1.Table = T;
+
+       Eval6InputsFloat(Input + 1,  Tmp2, &p1);
+
+
+       for (i=0; i < p -> nOutputs; i++) {
+
+              cmsFloat32Number y0 = Tmp1[i];
+              cmsFloat32Number y1 = Tmp2[i];
+
+              Output[i] = y0 + (y1 - y0) * rest;
+
+       }
+}
+
+static
+void Eval8Inputs(register const cmsUInt16Number Input[],
+                 register cmsUInt16Number Output[],
+                 register const cmsInterpParams* p16)
+{
+       const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
+       cmsS15Fixed16Number fk;
+       cmsS15Fixed16Number k0, rk;
+       int K0, K1;
+       const cmsUInt16Number* T;
+       cmsUInt32Number i;
+       cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+       cmsInterpParams p1;
+
+       fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);
+       k0 = FIXED_TO_INT(fk);
+       rk = FIXED_REST_TO_INT(fk);
+
+       K0 = p16 -> opta[7] * k0;
+       K1 = p16 -> opta[7] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));
+
+       p1 = *p16;
+       memmove(&p1.Domain[0], &p16 ->Domain[1], 7*sizeof(cmsUInt32Number));
+
+       T = LutTable + K0;
+       p1.Table = T;
+
+       Eval7Inputs(Input + 1, Tmp1, &p1);
+
+       T = LutTable + K1;
+       p1.Table = T;
+       Eval7Inputs(Input + 1, Tmp2, &p1);
+
+       for (i=0; i < p16 -> nOutputs; i++) {
+              Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);
+       }
+}
+
+
+
+static
+void Eval8InputsFloat(const cmsFloat32Number Input[],
+                      cmsFloat32Number Output[],
+                      const cmsInterpParams* p)
+{
+       const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;
+       cmsFloat32Number rest;
+       cmsFloat32Number pk;
+       int k0, K0, K1;
+       const cmsFloat32Number* T;
+       cmsUInt32Number i;
+       cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+       cmsInterpParams p1;
+
+       pk = fclamp(Input[0]) * p->Domain[0];
+       k0 = _cmsQuickFloor(pk);
+       rest = pk - (cmsFloat32Number) k0;
+
+       K0 = p -> opta[7] * k0;
+       K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[7]);
+
+       p1 = *p;
+       memmove(&p1.Domain[0], &p ->Domain[1], 7*sizeof(cmsUInt32Number));
+
+       T = LutTable + K0;
+       p1.Table = T;
+
+       Eval7InputsFloat(Input + 1,  Tmp1, &p1);
+
+       T = LutTable + K1;
+       p1.Table = T;
+
+       Eval7InputsFloat(Input + 1,  Tmp2, &p1);
+
+
+       for (i=0; i < p -> nOutputs; i++) {
+
+              cmsFloat32Number y0 = Tmp1[i];
+              cmsFloat32Number y1 = Tmp2[i];
+
+              Output[i] = y0 + (y1 - y0) * rest;
+       }
+}
+
+// The default factory
+static
+cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags)
+{
+
+    cmsInterpFunction Interpolation;
+    cmsBool  IsFloat     = (dwFlags & CMS_LERP_FLAGS_FLOAT);
+    cmsBool  IsTrilinear = (dwFlags & CMS_LERP_FLAGS_TRILINEAR);
+
+    memset(&Interpolation, 0, sizeof(Interpolation));
+
+    // Safety check
+    if (nInputChannels >= 4 && nOutputChannels >= MAX_STAGE_CHANNELS)
+        return Interpolation;
+
+    switch (nInputChannels) {
+
+           case 1: // Gray LUT / linear
+
+               if (nOutputChannels == 1) {
+
+                   if (IsFloat)
+                       Interpolation.LerpFloat = LinLerp1Dfloat;
+                   else
+                       Interpolation.Lerp16 = LinLerp1D;
+
+               }
+               else {
+
+                   if (IsFloat)
+                       Interpolation.LerpFloat = Eval1InputFloat;
+                   else
+                       Interpolation.Lerp16 = Eval1Input;
+               }
+               break;
+
+           case 2: // Duotone
+               if (IsFloat)
+                      Interpolation.LerpFloat =  BilinearInterpFloat;
+               else
+                      Interpolation.Lerp16    =  BilinearInterp16;
+               break;
+
+           case 3:  // RGB et al
+
+               if (IsTrilinear) {
+
+                   if (IsFloat)
+                       Interpolation.LerpFloat = TrilinearInterpFloat;
+                   else
+                       Interpolation.Lerp16 = TrilinearInterp16;
+               }
+               else {
+
+                   if (IsFloat)
+                       Interpolation.LerpFloat = TetrahedralInterpFloat;
+                   else {
+
+                       Interpolation.Lerp16 = TetrahedralInterp16;
+                   }
+               }
+               break;
+
+           case 4:  // CMYK lut
+
+               if (IsFloat)
+                   Interpolation.LerpFloat =  Eval4InputsFloat;
+               else
+                   Interpolation.Lerp16    =  Eval4Inputs;
+               break;
+
+           case 5: // 5 Inks
+               if (IsFloat)
+                   Interpolation.LerpFloat =  Eval5InputsFloat;
+               else
+                   Interpolation.Lerp16    =  Eval5Inputs;
+               break;
+
+           case 6: // 6 Inks
+               if (IsFloat)
+                   Interpolation.LerpFloat =  Eval6InputsFloat;
+               else
+                   Interpolation.Lerp16    =  Eval6Inputs;
+               break;
+
+           case 7: // 7 inks
+               if (IsFloat)
+                   Interpolation.LerpFloat =  Eval7InputsFloat;
+               else
+                   Interpolation.Lerp16    =  Eval7Inputs;
+               break;
+
+           case 8: // 8 inks
+               if (IsFloat)
+                   Interpolation.LerpFloat =  Eval8InputsFloat;
+               else
+                   Interpolation.Lerp16    =  Eval8Inputs;
+               break;
+
+               break;
+
+           default:
+               Interpolation.Lerp16 = NULL;
+    }
+
+    return Interpolation;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio0.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio0.c
new file mode 100644
index 0000000..6549d15
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio0.c
@@ -0,0 +1,1883 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+#include "lcms2_internal.h"
+
+// Generic I/O, tag dictionary management, profile struct
+
+// IOhandlers are abstractions used by littleCMS to read from whatever file, stream,
+// memory block or any storage. Each IOhandler provides implementations for read,
+// write, seek and tell functions. LittleCMS code deals with IO across those objects.
+// In this way, is easier to add support for new storage media.
+
+// NULL stream, for taking care of used space -------------------------------------
+
+// NULL IOhandler basically does nothing but keep track on how many bytes have been
+// written. This is handy when creating profiles, where the file size is needed in the
+// header. Then, whole profile is serialized across NULL IOhandler and a second pass
+// writes the bytes to the pertinent IOhandler.
+
+typedef struct {
+    cmsUInt32Number Pointer;         // Points to current location
+} FILENULL;
+
+static
+cmsUInt32Number NULLRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count)
+{
+    FILENULL* ResData = (FILENULL*) iohandler ->stream;
+
+    cmsUInt32Number len = size * count;
+    ResData -> Pointer += len;
+    return count;
+
+    cmsUNUSED_PARAMETER(Buffer);
+}
+
+static
+cmsBool  NULLSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset)
+{
+    FILENULL* ResData = (FILENULL*) iohandler ->stream;
+
+    ResData ->Pointer = offset;
+    return TRUE;
+}
+
+static
+cmsUInt32Number NULLTell(cmsIOHANDLER* iohandler)
+{
+    FILENULL* ResData = (FILENULL*) iohandler ->stream;
+    return ResData -> Pointer;
+}
+
+static
+cmsBool  NULLWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void *Ptr)
+{
+    FILENULL* ResData = (FILENULL*) iohandler ->stream;
+
+    ResData ->Pointer += size;
+    if (ResData ->Pointer > iohandler->UsedSpace)
+        iohandler->UsedSpace = ResData ->Pointer;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(Ptr);
+}
+
+static
+cmsBool  NULLClose(cmsIOHANDLER* iohandler)
+{
+    FILENULL* ResData = (FILENULL*) iohandler ->stream;
+
+    _cmsFree(iohandler ->ContextID, ResData);
+    _cmsFree(iohandler ->ContextID, iohandler);
+    return TRUE;
+}
+
+// The NULL IOhandler creator
+cmsIOHANDLER*  CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID)
+{
+    struct _cms_io_handler* iohandler = NULL;
+    FILENULL* fm = NULL;
+
+    iohandler = (struct _cms_io_handler*) _cmsMallocZero(ContextID, sizeof(struct _cms_io_handler));
+    if (iohandler == NULL) return NULL;
+
+    fm = (FILENULL*) _cmsMallocZero(ContextID, sizeof(FILENULL));
+    if (fm == NULL) goto Error;
+
+    fm ->Pointer = 0;
+
+    iohandler ->ContextID = ContextID;
+    iohandler ->stream  = (void*) fm;
+    iohandler ->UsedSpace = 0;
+    iohandler ->ReportedSize = 0;
+    iohandler ->PhysicalFile[0] = 0;
+
+    iohandler ->Read    = NULLRead;
+    iohandler ->Seek    = NULLSeek;
+    iohandler ->Close   = NULLClose;
+    iohandler ->Tell    = NULLTell;
+    iohandler ->Write   = NULLWrite;
+
+    return iohandler;
+
+Error:    
+    if (iohandler) _cmsFree(ContextID, iohandler);
+    return NULL;
+
+}
+
+
+// Memory-based stream --------------------------------------------------------------
+
+// Those functions implements an iohandler which takes a block of memory as storage medium.
+
+typedef struct {
+    cmsUInt8Number* Block;    // Points to allocated memory
+    cmsUInt32Number Size;     // Size of allocated memory
+    cmsUInt32Number Pointer;  // Points to current location
+    int FreeBlockOnClose;     // As title
+
+} FILEMEM;
+
+static
+cmsUInt32Number MemoryRead(struct _cms_io_handler* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count)
+{
+    FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
+    cmsUInt8Number* Ptr;
+    cmsUInt32Number len = size * count;
+
+    if (ResData -> Pointer + len > ResData -> Size){
+
+        len = (ResData -> Size - ResData -> Pointer);
+        cmsSignalError(iohandler ->ContextID, cmsERROR_READ, "Read from memory error. Got %d bytes, block should be of %d bytes", len, count * size);
+        return 0;
+    }
+
+    Ptr  = ResData -> Block;
+    Ptr += ResData -> Pointer;
+    memmove(Buffer, Ptr, len);
+    ResData -> Pointer += len;
+
+    return count;
+}
+
+// SEEK_CUR is assumed
+static
+cmsBool  MemorySeek(struct _cms_io_handler* iohandler, cmsUInt32Number offset)
+{
+    FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
+
+    if (offset > ResData ->Size) {
+        cmsSignalError(iohandler ->ContextID, cmsERROR_SEEK,  "Too few data; probably corrupted profile");
+        return FALSE;
+    }
+
+    ResData ->Pointer = offset;
+    return TRUE;
+}
+
+// Tell for memory
+static
+cmsUInt32Number MemoryTell(struct _cms_io_handler* iohandler)
+{
+    FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
+
+    if (ResData == NULL) return 0;
+    return ResData -> Pointer;
+}
+
+
+// Writes data to memory, also keeps used space for further reference.
+static
+cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void *Ptr)
+{
+    FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
+
+    if (ResData == NULL) return FALSE; // Housekeeping
+
+    // Check for available space. Clip.
+    if (ResData->Pointer + size > ResData->Size) {
+        size = ResData ->Size - ResData->Pointer;
+    }
+      
+    if (size == 0) return TRUE;     // Write zero bytes is ok, but does nothing
+
+    memmove(ResData ->Block + ResData ->Pointer, Ptr, size);
+    ResData ->Pointer += size;
+
+    if (ResData ->Pointer > iohandler->UsedSpace)
+        iohandler->UsedSpace = ResData ->Pointer;
+
+    return TRUE;
+}
+
+
+static
+cmsBool  MemoryClose(struct _cms_io_handler* iohandler)
+{
+    FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
+
+    if (ResData ->FreeBlockOnClose) {
+
+        if (ResData ->Block) _cmsFree(iohandler ->ContextID, ResData ->Block);
+    }
+
+    _cmsFree(iohandler ->ContextID, ResData);
+    _cmsFree(iohandler ->ContextID, iohandler);
+
+    return TRUE;
+}
+
+// Create a iohandler for memory block. AccessMode=='r' assumes the iohandler is going to read, and makes
+// a copy of the memory block for letting user to free the memory after invoking open profile. In write
+// mode ("w"), Buffere points to the begin of memory block to be written.
+cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode)
+{
+    cmsIOHANDLER* iohandler = NULL;
+    FILEMEM* fm = NULL;
+
+    _cmsAssert(AccessMode != NULL);
+
+    iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));
+    if (iohandler == NULL) return NULL;
+
+    switch (*AccessMode) {
+
+    case 'r':
+        fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM));
+        if (fm == NULL) goto Error;
+
+        if (Buffer == NULL) {
+            cmsSignalError(ContextID, cmsERROR_READ, "Couldn't read profile from NULL pointer");
+            goto Error;
+        }
+
+        fm ->Block = (cmsUInt8Number*) _cmsMalloc(ContextID, size);
+        if (fm ->Block == NULL) {
+
+            _cmsFree(ContextID, fm);
+            _cmsFree(ContextID, iohandler);
+            cmsSignalError(ContextID, cmsERROR_READ, "Couldn't allocate %ld bytes for profile", size);
+            return NULL;
+        }
+
+
+        memmove(fm->Block, Buffer, size);
+        fm ->FreeBlockOnClose = TRUE;
+        fm ->Size    = size;
+        fm ->Pointer = 0;
+        iohandler -> ReportedSize = size;
+        break;
+
+    case 'w':
+        fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM));
+        if (fm == NULL) goto Error;
+
+        fm ->Block = (cmsUInt8Number*) Buffer;
+        fm ->FreeBlockOnClose = FALSE;
+        fm ->Size    = size;
+        fm ->Pointer = 0;
+        iohandler -> ReportedSize = 0;
+        break;
+
+    default:
+        cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown access mode '%c'", *AccessMode);
+        return NULL;
+    }
+
+    iohandler ->ContextID = ContextID;
+    iohandler ->stream  = (void*) fm;
+    iohandler ->UsedSpace = 0;
+    iohandler ->PhysicalFile[0] = 0;
+
+    iohandler ->Read    = MemoryRead;
+    iohandler ->Seek    = MemorySeek;
+    iohandler ->Close   = MemoryClose;
+    iohandler ->Tell    = MemoryTell;
+    iohandler ->Write   = MemoryWrite;
+
+    return iohandler;
+
+Error:
+    if (fm) _cmsFree(ContextID, fm);
+    if (iohandler) _cmsFree(ContextID, iohandler);
+    return NULL;
+}
+
+// File-based stream -------------------------------------------------------
+
+// Read count elements of size bytes each. Return number of elements read
+static
+cmsUInt32Number FileRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count)
+{
+    cmsUInt32Number nReaded = (cmsUInt32Number) fread(Buffer, size, count, (FILE*) iohandler->stream);
+
+    if (nReaded != count) {
+            cmsSignalError(iohandler ->ContextID, cmsERROR_FILE, "Read error. Got %d bytes, block should be of %d bytes", nReaded * size, count * size);
+            return 0;
+    }
+
+    return nReaded;
+}
+
+// Postion file pointer in the file
+static
+cmsBool  FileSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset)
+{
+    if (fseek((FILE*) iohandler ->stream, (long) offset, SEEK_SET) != 0) {
+
+       cmsSignalError(iohandler ->ContextID, cmsERROR_FILE, "Seek error; probably corrupted file");
+       return FALSE;
+    }
+
+    return TRUE;
+}
+
+// Returns file pointer position
+static
+cmsUInt32Number FileTell(cmsIOHANDLER* iohandler)
+{
+    return (cmsUInt32Number) ftell((FILE*)iohandler ->stream);
+}
+
+// Writes data to stream, also keeps used space for further reference. Returns TRUE on success, FALSE on error
+static
+cmsBool  FileWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void* Buffer)
+{
+       if (size == 0) return TRUE;  // We allow to write 0 bytes, but nothing is written
+
+       iohandler->UsedSpace += size;
+       return (fwrite(Buffer, size, 1, (FILE*) iohandler->stream) == 1);
+}
+
+// Closes the file
+static
+cmsBool  FileClose(cmsIOHANDLER* iohandler)
+{
+    if (fclose((FILE*) iohandler ->stream) != 0) return FALSE;
+    _cmsFree(iohandler ->ContextID, iohandler);
+    return TRUE;
+}
+
+// Create a iohandler for disk based files.
+cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode)
+{
+    cmsIOHANDLER* iohandler = NULL;
+    FILE* fm = NULL;
+
+    _cmsAssert(FileName != NULL);
+    _cmsAssert(AccessMode != NULL);
+
+    iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));
+    if (iohandler == NULL) return NULL;
+
+    switch (*AccessMode) {
+
+    case 'r':
+        fm = fopen(FileName, "rb");
+        if (fm == NULL) {
+            _cmsFree(ContextID, iohandler);
+             cmsSignalError(ContextID, cmsERROR_FILE, "File '%s' not found", FileName);
+            return NULL;
+        }
+        iohandler -> ReportedSize = (cmsUInt32Number) cmsfilelength(fm);
+        break;
+
+    case 'w':
+        fm = fopen(FileName, "wb");
+        if (fm == NULL) {
+            _cmsFree(ContextID, iohandler);
+             cmsSignalError(ContextID, cmsERROR_FILE, "Couldn't create '%s'", FileName);
+            return NULL;
+        }
+        iohandler -> ReportedSize = 0;
+        break;
+
+    default:
+        _cmsFree(ContextID, iohandler);
+         cmsSignalError(ContextID, cmsERROR_FILE, "Unknown access mode '%c'", *AccessMode);
+        return NULL;
+    }
+
+    iohandler ->ContextID = ContextID;
+    iohandler ->stream = (void*) fm;
+    iohandler ->UsedSpace = 0;
+
+    // Keep track of the original file    
+    strncpy(iohandler -> PhysicalFile, FileName, sizeof(iohandler -> PhysicalFile)-1);
+    iohandler -> PhysicalFile[sizeof(iohandler -> PhysicalFile)-1] = 0;
+
+    iohandler ->Read    = FileRead;
+    iohandler ->Seek    = FileSeek;
+    iohandler ->Close   = FileClose;
+    iohandler ->Tell    = FileTell;
+    iohandler ->Write   = FileWrite;
+
+    return iohandler;
+}
+
+// Create a iohandler for stream based files
+cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream)
+{
+    cmsIOHANDLER* iohandler = NULL;
+
+    iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));
+    if (iohandler == NULL) return NULL;
+
+    iohandler -> ContextID = ContextID;
+    iohandler -> stream = (void*) Stream;
+    iohandler -> UsedSpace = 0;
+    iohandler -> ReportedSize = (cmsUInt32Number) cmsfilelength(Stream);
+    iohandler -> PhysicalFile[0] = 0;
+
+    iohandler ->Read    = FileRead;
+    iohandler ->Seek    = FileSeek;
+    iohandler ->Close   = FileClose;
+    iohandler ->Tell    = FileTell;
+    iohandler ->Write   = FileWrite;
+
+    return iohandler;
+}
+
+
+
+// Close an open IO handler
+cmsBool CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io)
+{
+    return io -> Close(io);
+}
+
+// -------------------------------------------------------------------------------------------------------
+
+#ifdef _WIN32_WCE
+time_t wceex_time(time_t *timer);
+struct tm * wceex_gmtime(const time_t *timer);
+
+#define time wceex_time
+#define gmtime wceex_gmtime
+#endif
+
+// Creates an empty structure holding all required parameters
+cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID)
+{
+    time_t now = time(NULL);
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) _cmsMallocZero(ContextID, sizeof(_cmsICCPROFILE));
+    if (Icc == NULL) return NULL;
+
+    Icc ->ContextID = ContextID;
+
+    // Set it to empty
+    Icc -> TagCount   = 0;
+
+    // Set default version
+    Icc ->Version =  0x02100000;
+
+    // Set creation date/time
+    memmove(&Icc ->Created, gmtime(&now), sizeof(Icc ->Created));
+
+    // Create a mutex if the user provided proper plugin. NULL otherwise
+    Icc ->UsrMutex = _cmsCreateMutex(ContextID);
+
+    // Return the handle
+    return (cmsHPROFILE) Icc;
+}
+
+cmsContext CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile)
+{
+     _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+
+    if (Icc == NULL) return NULL;
+    return Icc -> ContextID;
+}
+
+
+// Return the number of tags
+cmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile)
+{
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+    if (Icc == NULL) return -1;
+
+    return  Icc->TagCount;
+}
+
+// Return the tag signature of a given tag number
+cmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n)
+{
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+
+    if (n > Icc->TagCount) return (cmsTagSignature) 0;  // Mark as not available
+    if (n >= MAX_TABLE_TAG) return (cmsTagSignature) 0; // As double check
+
+    return Icc ->TagNames[n];
+}
+
+
+static
+int SearchOneTag(_cmsICCPROFILE* Profile, cmsTagSignature sig)
+{
+    cmsUInt32Number i;
+
+    for (i=0; i < Profile -> TagCount; i++) {
+
+        if (sig == Profile -> TagNames[i])
+            return i;
+    }
+
+    return -1;
+}
+
+// Search for a specific tag in tag dictionary. Returns position or -1 if tag not found.
+// If followlinks is turned on, then the position of the linked tag is returned
+int _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks)
+{
+    int n;
+    cmsTagSignature LinkedSig;
+
+    do {
+
+        // Search for given tag in ICC profile directory
+        n = SearchOneTag(Icc, sig);
+        if (n < 0)
+            return -1;        // Not found
+
+        if (!lFollowLinks)
+            return n;         // Found, don't follow links
+
+        // Is this a linked tag?
+        LinkedSig = Icc ->TagLinked[n];
+
+        // Yes, follow link
+        if (LinkedSig != (cmsTagSignature) 0) {
+			// fix bug mantis id#0055942
+			// assume that TRCTag and ColorantTag can't be linked.
+			// Xiaochuan Liu 2014-04-23
+			if ((sig == cmsSigRedTRCTag || sig == cmsSigGreenTRCTag || sig == cmsSigBlueTRCTag) && 
+				(LinkedSig == cmsSigRedColorantTag || LinkedSig == cmsSigGreenColorantTag || LinkedSig == cmsSigBlueColorantTag))
+			{
+				return n;
+			}
+            sig = LinkedSig;
+        }
+
+    } while (LinkedSig != (cmsTagSignature) 0);
+
+    return n;
+}
+
+// Deletes a tag entry
+
+static
+void _cmsDeleteTagByPos(_cmsICCPROFILE* Icc, int i)
+{
+    _cmsAssert(Icc != NULL);
+    _cmsAssert(i >= 0);
+
+   
+    if (Icc -> TagPtrs[i] != NULL) {
+
+        // Free previous version
+        if (Icc ->TagSaveAsRaw[i]) {
+            _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]);
+        }
+        else {
+            cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i];
+
+            if (TypeHandler != NULL) {
+
+                cmsTagTypeHandler LocalTypeHandler = *TypeHandler;
+                LocalTypeHandler.ContextID = Icc ->ContextID;              // As an additional parameter
+                LocalTypeHandler.ICCVersion = Icc ->Version;
+                LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]);
+                Icc ->TagPtrs[i] = NULL;
+            }
+        }
+
+    } 
+}
+
+
+// Creates a new tag entry
+static
+cmsBool _cmsNewTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, int* NewPos)
+{
+    int i;
+
+    // Search for the tag
+    i = _cmsSearchTag(Icc, sig, FALSE);
+    if (i >= 0) {
+
+        // Already exists? delete it
+        _cmsDeleteTagByPos(Icc, i);
+        *NewPos = i;
+    }
+    else  {
+
+        // No, make a new one
+
+        if (Icc -> TagCount >= MAX_TABLE_TAG) {
+            cmsSignalError(Icc ->ContextID, cmsERROR_RANGE, "Too many tags (%d)", MAX_TABLE_TAG);
+            return FALSE;
+        }
+
+        *NewPos = Icc ->TagCount;
+        Icc -> TagCount++;
+    }
+
+    return TRUE;
+}
+
+
+// Check existance
+cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig)
+{
+       _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) (void*) hProfile;
+       return _cmsSearchTag(Icc, sig, FALSE) >= 0;
+}
+
+
+// Read profile header and validate it
+cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc)
+{
+    cmsTagEntry Tag;
+    cmsICCHeader Header;
+    cmsUInt32Number i, j;
+    cmsUInt32Number HeaderSize;
+    cmsIOHANDLER* io = Icc ->IOhandler;
+    cmsUInt32Number TagCount;
+
+
+    // Read the header
+    if (io -> Read(io, &Header, sizeof(cmsICCHeader), 1) != 1) {
+        return FALSE;
+    }
+
+    // Validate file as an ICC profile
+    if (_cmsAdjustEndianess32(Header.magic) != cmsMagicNumber) {
+        cmsSignalError(Icc ->ContextID, cmsERROR_BAD_SIGNATURE, "not an ICC profile, invalid signature");
+        return FALSE;
+    }
+
+    // Adjust endianess of the used parameters
+    Icc -> DeviceClass     = (cmsProfileClassSignature) _cmsAdjustEndianess32(Header.deviceClass);
+    Icc -> ColorSpace      = (cmsColorSpaceSignature)   _cmsAdjustEndianess32(Header.colorSpace);
+    Icc -> PCS             = (cmsColorSpaceSignature)   _cmsAdjustEndianess32(Header.pcs);
+   
+    Icc -> RenderingIntent = _cmsAdjustEndianess32(Header.renderingIntent);
+    Icc -> flags           = _cmsAdjustEndianess32(Header.flags);
+    Icc -> manufacturer    = _cmsAdjustEndianess32(Header.manufacturer);
+    Icc -> model           = _cmsAdjustEndianess32(Header.model);
+    Icc -> creator         = _cmsAdjustEndianess32(Header.creator);
+    
+    _cmsAdjustEndianess64(&Icc -> attributes, &Header.attributes);
+    Icc -> Version         = _cmsAdjustEndianess32(Header.version);
+
+    // Get size as reported in header
+    HeaderSize = _cmsAdjustEndianess32(Header.size);
+
+    // Make sure HeaderSize is lower than profile size
+    if (HeaderSize >= Icc ->IOhandler ->ReportedSize)
+            HeaderSize = Icc ->IOhandler ->ReportedSize;
+
+
+    // Get creation date/time
+    _cmsDecodeDateTimeNumber(&Header.date, &Icc ->Created);
+
+    // The profile ID are 32 raw bytes
+    memmove(Icc ->ProfileID.ID32, Header.profileID.ID32, 16);
+
+
+    // Read tag directory
+    if (!_cmsReadUInt32Number(io, &TagCount)) return FALSE;
+    if (TagCount > MAX_TABLE_TAG) {
+
+        cmsSignalError(Icc ->ContextID, cmsERROR_RANGE, "Too many tags (%d)", TagCount);
+        return FALSE;
+    }
+
+
+    // Read tag directory
+    Icc -> TagCount = 0;
+    for (i=0; i < TagCount; i++) {
+
+        if (!_cmsReadUInt32Number(io, (cmsUInt32Number *) &Tag.sig)) return FALSE;
+        if (!_cmsReadUInt32Number(io, &Tag.offset)) return FALSE;
+        if (!_cmsReadUInt32Number(io, &Tag.size)) return FALSE;
+
+        // Perform some sanity check. Offset + size should fall inside file.
+        if (Tag.offset + Tag.size > HeaderSize ||
+            Tag.offset + Tag.size < Tag.offset)
+                  continue;
+
+        Icc -> TagNames[Icc ->TagCount]   = Tag.sig;
+        Icc -> TagOffsets[Icc ->TagCount] = Tag.offset;
+        Icc -> TagSizes[Icc ->TagCount]   = Tag.size;
+
+       // Search for links
+        for (j=0; j < Icc ->TagCount; j++) {
+
+            if ((Icc ->TagOffsets[j] == Tag.offset) &&
+                (Icc ->TagSizes[j]   == Tag.size)) {
+
+                Icc ->TagLinked[Icc ->TagCount] = Icc ->TagNames[j];
+            }
+
+        }
+
+        Icc ->TagCount++;
+    }
+
+    return TRUE;
+}
+
+// Saves profile header
+cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace)
+{
+    cmsICCHeader Header;
+    cmsUInt32Number i;
+    cmsTagEntry Tag;
+    cmsInt32Number Count = 0;
+
+    Header.size        = _cmsAdjustEndianess32(UsedSpace);
+    Header.cmmId       = _cmsAdjustEndianess32(lcmsSignature);
+    Header.version     = _cmsAdjustEndianess32(Icc ->Version);
+
+    Header.deviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Icc -> DeviceClass);
+    Header.colorSpace  = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Icc -> ColorSpace);
+    Header.pcs         = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Icc -> PCS);
+
+    //   NOTE: in v4 Timestamp must be in UTC rather than in local time
+    _cmsEncodeDateTimeNumber(&Header.date, &Icc ->Created);
+
+    Header.magic       = _cmsAdjustEndianess32(cmsMagicNumber);
+
+#ifdef CMS_IS_WINDOWS_
+    Header.platform    = (cmsPlatformSignature) _cmsAdjustEndianess32(cmsSigMicrosoft);
+#else
+    Header.platform    = (cmsPlatformSignature) _cmsAdjustEndianess32(cmsSigMacintosh);
+#endif
+
+    Header.flags        = _cmsAdjustEndianess32(Icc -> flags);
+    Header.manufacturer = _cmsAdjustEndianess32(Icc -> manufacturer);
+    Header.model        = _cmsAdjustEndianess32(Icc -> model);
+
+    _cmsAdjustEndianess64(&Header.attributes, &Icc -> attributes);
+
+    // Rendering intent in the header (for embedded profiles)
+    Header.renderingIntent = _cmsAdjustEndianess32(Icc -> RenderingIntent);
+
+    // Illuminant is always D50
+    Header.illuminant.X = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->X));
+    Header.illuminant.Y = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->Y));
+    Header.illuminant.Z = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->Z));
+
+    // Created by LittleCMS (that's me!)
+    Header.creator      = _cmsAdjustEndianess32(lcmsSignature);
+
+    memset(&Header.reserved, 0, sizeof(Header.reserved));
+
+    // Set profile ID. Endianess is always big endian
+    memmove(&Header.profileID, &Icc ->ProfileID, 16);
+
+    // Dump the header
+    if (!Icc -> IOhandler->Write(Icc->IOhandler, sizeof(cmsICCHeader), &Header)) return FALSE;
+
+    // Saves Tag directory
+
+    // Get true count
+    for (i=0;  i < Icc -> TagCount; i++) {
+        if (Icc ->TagNames[i] != 0)
+            Count++;
+    }
+
+    // Store number of tags
+    if (!_cmsWriteUInt32Number(Icc ->IOhandler, Count)) return FALSE;
+
+    for (i=0; i < Icc -> TagCount; i++) {
+
+        if (Icc ->TagNames[i] == 0) continue;   // It is just a placeholder
+
+        Tag.sig    = (cmsTagSignature) _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagNames[i]);
+        Tag.offset = _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagOffsets[i]);
+        Tag.size   = _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagSizes[i]);
+
+        if (!Icc ->IOhandler -> Write(Icc-> IOhandler, sizeof(cmsTagEntry), &Tag)) return FALSE;
+    }
+
+    return TRUE;
+}
+
+// ----------------------------------------------------------------------- Set/Get several struct members
+
+
+cmsUInt32Number CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    return Icc -> RenderingIntent;
+}
+
+void CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    Icc -> RenderingIntent = RenderingIntent;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    return (cmsUInt32Number) Icc -> flags;
+}
+
+void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    Icc -> flags = (cmsUInt32Number) Flags;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    return Icc ->manufacturer;
+}
+
+void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    Icc -> manufacturer = manufacturer;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    return Icc ->creator;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    return Icc ->model;
+}
+
+void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    Icc -> model = model;
+}
+
+void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    memmove(Flags, &Icc -> attributes, sizeof(cmsUInt64Number));
+}
+
+void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    memmove(&Icc -> attributes, &Flags, sizeof(cmsUInt64Number));
+}
+
+void CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    memmove(ProfileID, Icc ->ProfileID.ID8, 16);
+}
+
+void CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    memmove(&Icc -> ProfileID, ProfileID, 16);
+}
+
+cmsBool  CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    memmove(Dest, &Icc ->Created, sizeof(struct tm));
+    return TRUE;
+}
+
+cmsColorSpaceSignature CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    return Icc -> PCS;
+}
+
+void CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    Icc -> PCS = pcs;
+}
+
+cmsColorSpaceSignature CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    return Icc -> ColorSpace;
+}
+
+void CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    Icc -> ColorSpace = sig;
+}
+
+cmsProfileClassSignature CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    return Icc -> DeviceClass;
+}
+
+void CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    Icc -> DeviceClass = sig;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    return Icc -> Version;
+}
+
+void CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    Icc -> Version = Version;
+}
+
+// Get an hexadecimal number with same digits as v
+static
+cmsUInt32Number BaseToBase(cmsUInt32Number in, int BaseIn, int BaseOut)
+{
+    char Buff[100];
+    int i, len;
+    cmsUInt32Number out;
+
+    for (len=0; in > 0 && len < 100; len++) {
+
+        Buff[len] = (char) (in % BaseIn);
+        in /= BaseIn;
+    }
+
+    for (i=len-1, out=0; i >= 0; --i) {
+        out = out * BaseOut + Buff[i];
+    }
+
+    return out;
+}
+
+void  CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+
+    // 4.2 -> 0x4200000
+
+    Icc -> Version = BaseToBase((cmsUInt32Number) floor(Version * 100.0 + 0.5), 10, 16) << 16;
+}
+
+cmsFloat64Number CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile)
+{
+    _cmsICCPROFILE*  Icc = (_cmsICCPROFILE*) hProfile;
+    cmsUInt32Number n = Icc -> Version >> 16;
+
+    return BaseToBase(n, 16, 10) / 100.0;
+}
+// --------------------------------------------------------------------------------------------------------------
+
+
+// Create profile from IOhandler
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io)
+{
+    _cmsICCPROFILE* NewIcc;
+    cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID);
+
+    if (hEmpty == NULL) return NULL;
+
+    NewIcc = (_cmsICCPROFILE*) hEmpty;
+
+    NewIcc ->IOhandler = io;
+    if (!_cmsReadHeader(NewIcc)) goto Error;
+    return hEmpty;
+
+Error:
+    cmsCloseProfile(hEmpty);
+    return NULL;
+}
+
+// Create profile from IOhandler
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write)
+{
+    _cmsICCPROFILE* NewIcc;
+    cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID);
+
+    if (hEmpty == NULL) return NULL;
+
+    NewIcc = (_cmsICCPROFILE*) hEmpty;
+
+    NewIcc ->IOhandler = io;
+    if (write) {
+
+        NewIcc -> IsWrite = TRUE;
+        return hEmpty;
+    }
+
+    if (!_cmsReadHeader(NewIcc)) goto Error;
+    return hEmpty;
+
+Error:
+    cmsCloseProfile(hEmpty);
+    return NULL;
+}
+
+
+// Create profile from disk file
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *lpFileName, const char *sAccess)
+{
+    _cmsICCPROFILE* NewIcc;
+    cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID);
+
+    if (hEmpty == NULL) return NULL;
+
+    NewIcc = (_cmsICCPROFILE*) hEmpty;
+
+    NewIcc ->IOhandler = cmsOpenIOhandlerFromFile(ContextID, lpFileName, sAccess);
+    if (NewIcc ->IOhandler == NULL) goto Error;
+
+    if (*sAccess == 'W' || *sAccess == 'w') {
+
+        NewIcc -> IsWrite = TRUE;
+
+        return hEmpty;
+    }
+
+    if (!_cmsReadHeader(NewIcc)) goto Error;
+    return hEmpty;
+
+Error:
+    cmsCloseProfile(hEmpty);
+    return NULL;
+}
+
+
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess)
+{
+    return cmsOpenProfileFromFileTHR(NULL, ICCProfile, sAccess);
+}
+
+
+cmsHPROFILE  CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char *sAccess)
+{
+    _cmsICCPROFILE* NewIcc;
+    cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID);
+
+    if (hEmpty == NULL) return NULL;
+
+    NewIcc = (_cmsICCPROFILE*) hEmpty;
+
+    NewIcc ->IOhandler = cmsOpenIOhandlerFromStream(ContextID, ICCProfile);
+    if (NewIcc ->IOhandler == NULL) goto Error;
+
+    if (*sAccess == 'w') {
+
+        NewIcc -> IsWrite = TRUE;
+        return hEmpty;
+    }
+
+    if (!_cmsReadHeader(NewIcc)) goto Error;
+    return hEmpty;
+
+Error:
+    cmsCloseProfile(hEmpty);
+    return NULL;
+
+}
+
+cmsHPROFILE  CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char *sAccess)
+{
+    return cmsOpenProfileFromStreamTHR(NULL, ICCProfile, sAccess);
+}
+
+
+// Open from memory block
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void* MemPtr, cmsUInt32Number dwSize)
+{
+    _cmsICCPROFILE* NewIcc;
+    cmsHPROFILE hEmpty;
+
+    hEmpty = cmsCreateProfilePlaceholder(ContextID);
+    if (hEmpty == NULL) return NULL;
+
+    NewIcc = (_cmsICCPROFILE*) hEmpty;
+
+    // Ok, in this case const void* is casted to void* just because open IO handler
+    // shares read and writting modes. Don't abuse this feature!
+    NewIcc ->IOhandler = cmsOpenIOhandlerFromMem(ContextID, (void*) MemPtr, dwSize, "r");
+    if (NewIcc ->IOhandler == NULL) goto Error;
+
+    if (!_cmsReadHeader(NewIcc)) goto Error;
+
+    return hEmpty;
+
+Error:
+    cmsCloseProfile(hEmpty);
+    return NULL;
+}
+
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void* MemPtr, cmsUInt32Number dwSize)
+{
+    return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize);
+}
+
+
+
+// Dump tag contents. If the profile is being modified, untouched tags are copied from FileOrig
+static
+cmsBool SaveTags(_cmsICCPROFILE* Icc, _cmsICCPROFILE* FileOrig)
+{
+    cmsUInt8Number* Data;
+    cmsUInt32Number i;
+    cmsUInt32Number Begin;
+    cmsIOHANDLER* io = Icc ->IOhandler;
+    cmsTagDescriptor* TagDescriptor;
+    cmsTagTypeSignature TypeBase;
+    cmsTagTypeSignature Type;
+    cmsTagTypeHandler* TypeHandler;
+    cmsFloat64Number   Version = cmsGetProfileVersion((cmsHPROFILE) Icc);
+    cmsTagTypeHandler LocalTypeHandler;
+
+    for (i=0; i < Icc -> TagCount; i++) {
+
+        if (Icc ->TagNames[i] == 0) continue;
+
+        // Linked tags are not written
+        if (Icc ->TagLinked[i] != (cmsTagSignature) 0) continue;
+
+        Icc -> TagOffsets[i] = Begin = io ->UsedSpace;
+
+        Data = (cmsUInt8Number*)  Icc -> TagPtrs[i];
+
+        if (!Data) {
+
+            // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user.
+            // In this case a blind copy of the block data is performed
+            if (FileOrig != NULL && Icc -> TagOffsets[i]) {
+
+                cmsUInt32Number TagSize   = FileOrig -> TagSizes[i];
+                cmsUInt32Number TagOffset = FileOrig -> TagOffsets[i];
+                void* Mem;
+
+                if (!FileOrig ->IOhandler->Seek(FileOrig ->IOhandler, TagOffset)) return FALSE;
+
+                Mem = _cmsMalloc(Icc ->ContextID, TagSize);
+                if (Mem == NULL) return FALSE;
+
+                if (FileOrig ->IOhandler->Read(FileOrig->IOhandler, Mem, TagSize, 1) != 1) return FALSE;
+                if (!io ->Write(io, TagSize, Mem)) return FALSE;
+                _cmsFree(Icc ->ContextID, Mem);
+
+                Icc -> TagSizes[i] = (io ->UsedSpace - Begin);
+
+
+                // Align to 32 bit boundary.
+                if (! _cmsWriteAlignment(io))
+                    return FALSE;
+            }
+
+            continue;
+        }
+
+
+        // Should this tag be saved as RAW? If so, tagsizes should be specified in advance (no further cooking is done)
+        if (Icc ->TagSaveAsRaw[i]) {
+
+            if (io -> Write(io, Icc ->TagSizes[i], Data) != 1) return FALSE;
+        }
+        else {
+
+            // Search for support on this tag
+            TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, Icc -> TagNames[i]);
+            if (TagDescriptor == NULL) continue;                        // Unsupported, ignore it
+           
+            if (TagDescriptor ->DecideType != NULL) {
+
+                Type = TagDescriptor ->DecideType(Version, Data);
+            }
+            else {
+
+                Type = TagDescriptor ->SupportedTypes[0];
+            }
+
+            TypeHandler =  _cmsGetTagTypeHandler(Icc->ContextID, Type);
+
+            if (TypeHandler == NULL) {
+                cmsSignalError(Icc ->ContextID, cmsERROR_INTERNAL, "(Internal) no handler for tag %x", Icc -> TagNames[i]);
+                continue;
+            }
+
+            TypeBase = TypeHandler ->Signature;
+            if (!_cmsWriteTypeBase(io, TypeBase))
+                return FALSE;
+
+            LocalTypeHandler = *TypeHandler;
+            LocalTypeHandler.ContextID  = Icc ->ContextID;
+            LocalTypeHandler.ICCVersion = Icc ->Version;
+            if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, io, Data, TagDescriptor ->ElemCount)) {
+
+                char String[5];
+
+                _cmsTagSignature2String(String, (cmsTagSignature) TypeBase);
+                cmsSignalError(Icc ->ContextID, cmsERROR_WRITE, "Couldn't write type '%s'", String);
+                return FALSE;
+            }
+        }
+
+
+        Icc -> TagSizes[i] = (io ->UsedSpace - Begin);
+
+        // Align to 32 bit boundary.
+        if (! _cmsWriteAlignment(io))
+            return FALSE;
+    }
+
+
+    return TRUE;
+}
+
+
+// Fill the offset and size fields for all linked tags
+static
+cmsBool SetLinks( _cmsICCPROFILE* Icc)
+{
+    cmsUInt32Number i;
+
+    for (i=0; i < Icc -> TagCount; i++) {
+
+        cmsTagSignature lnk = Icc ->TagLinked[i];
+        if (lnk != (cmsTagSignature) 0) {
+
+            int j = _cmsSearchTag(Icc, lnk, FALSE);
+            if (j >= 0) {
+
+                Icc ->TagOffsets[i] = Icc ->TagOffsets[j];
+                Icc ->TagSizes[i]   = Icc ->TagSizes[j];
+            }
+
+        }
+    }
+
+    return TRUE;
+}
+
+// Low-level save to IOHANDLER. It returns the number of bytes used to
+// store the profile, or zero on error. io may be NULL and in this case
+// no data is written--only sizes are calculated
+cmsUInt32Number CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io)
+{
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+    _cmsICCPROFILE Keep;
+    cmsIOHANDLER* PrevIO = NULL;
+    cmsUInt32Number UsedSpace;
+    cmsContext ContextID;
+
+    _cmsAssert(hProfile != NULL);
+
+    memmove(&Keep, Icc, sizeof(_cmsICCPROFILE));
+
+    ContextID = cmsGetProfileContextID(hProfile);
+    PrevIO = Icc ->IOhandler = cmsOpenIOhandlerFromNULL(ContextID);
+    if (PrevIO == NULL) return 0;
+
+    // Pass #1 does compute offsets
+
+    if (!_cmsWriteHeader(Icc, 0)) goto Error;
+    if (!SaveTags(Icc, &Keep)) goto Error;
+
+    UsedSpace = PrevIO ->UsedSpace;
+
+    // Pass #2 does save to iohandler
+
+    if (io != NULL) {
+
+        Icc ->IOhandler = io;
+        if (!SetLinks(Icc)) goto Error;
+        if (!_cmsWriteHeader(Icc, UsedSpace)) goto Error;
+        if (!SaveTags(Icc, &Keep)) goto Error;
+    }
+
+    memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));
+    if (!cmsCloseIOhandler(PrevIO)) return 0;
+
+    return UsedSpace;
+
+
+Error:
+    cmsCloseIOhandler(PrevIO);
+    memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));
+    return 0;
+}
+
+#ifdef _WIN32_WCE
+int wceex_unlink(const char *filename);
+#ifndef remove
+#	define remove wceex_unlink
+#endif
+#endif
+
+// Low-level save to disk.
+cmsBool  CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName)
+{
+    cmsContext ContextID = cmsGetProfileContextID(hProfile);
+    cmsIOHANDLER* io = cmsOpenIOhandlerFromFile(ContextID, FileName, "w");
+    cmsBool rc;
+
+    if (io == NULL) return FALSE;
+
+    rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0);
+    rc &= cmsCloseIOhandler(io);
+
+    if (rc == FALSE) {          // remove() is C99 per 7.19.4.1
+            remove(FileName);   // We have to IGNORE return value in this case
+    }
+    return rc;
+}
+
+// Same as anterior, but for streams
+cmsBool CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream)
+{
+    cmsBool rc;
+    cmsContext ContextID = cmsGetProfileContextID(hProfile);
+    cmsIOHANDLER* io = cmsOpenIOhandlerFromStream(ContextID, Stream);
+
+    if (io == NULL) return FALSE;
+
+    rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0);
+    rc &= cmsCloseIOhandler(io);
+
+    return rc;
+}
+
+
+// Same as anterior, but for memory blocks. In this case, a NULL as MemPtr means calculate needed space only
+cmsBool CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded)
+{
+    cmsBool rc;
+    cmsIOHANDLER* io;
+    cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+    _cmsAssert(BytesNeeded != NULL);
+
+    // Should we just calculate the needed space?
+    if (MemPtr == NULL) {
+
+           *BytesNeeded =  cmsSaveProfileToIOhandler(hProfile, NULL);
+            return (*BytesNeeded == 0) ? FALSE : TRUE;
+    }
+
+    // That is a real write operation
+    io =  cmsOpenIOhandlerFromMem(ContextID, MemPtr, *BytesNeeded, "w");
+    if (io == NULL) return FALSE;
+
+    rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0);
+    rc &= cmsCloseIOhandler(io);
+
+    return rc;
+}
+
+
+
+// Closes a profile freeing any involved resources
+cmsBool  CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile)
+{
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+    cmsBool  rc = TRUE;
+    cmsUInt32Number i;
+
+    if (!Icc) return FALSE;
+
+    // Was open in write mode?
+    if (Icc ->IsWrite) {
+
+        Icc ->IsWrite = FALSE;      // Assure no further writting
+        rc &= cmsSaveProfileToFile(hProfile, Icc ->IOhandler->PhysicalFile);
+    }
+
+    for (i=0; i < Icc -> TagCount; i++) {
+
+        if (Icc -> TagPtrs[i]) {
+
+            cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i];
+
+            if (TypeHandler != NULL) {
+                cmsTagTypeHandler LocalTypeHandler = *TypeHandler;
+
+                LocalTypeHandler.ContextID = Icc ->ContextID;              // As an additional parameters
+                LocalTypeHandler.ICCVersion = Icc ->Version;
+                LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]);
+            }
+            else
+                _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]);
+        }
+    }
+
+    if (Icc ->IOhandler != NULL) {
+        rc &= cmsCloseIOhandler(Icc->IOhandler);
+    }
+
+    _cmsDestroyMutex(Icc->ContextID, Icc->UsrMutex);
+
+    _cmsFree(Icc ->ContextID, Icc);   // Free placeholder memory
+
+    return rc;
+}
+
+
+// -------------------------------------------------------------------------------------------------------------------
+
+
+// Returns TRUE if a given tag is supported by a plug-in
+static
+cmsBool IsTypeSupported(cmsTagDescriptor* TagDescriptor, cmsTagTypeSignature Type)
+{
+    cmsUInt32Number i, nMaxTypes;
+
+    nMaxTypes = TagDescriptor->nSupportedTypes;
+    if (nMaxTypes >= MAX_TYPES_IN_LCMS_PLUGIN)
+        nMaxTypes = MAX_TYPES_IN_LCMS_PLUGIN;
+
+    for (i=0; i < nMaxTypes; i++) {
+        if (Type == TagDescriptor ->SupportedTypes[i]) return TRUE;
+    }
+
+    return FALSE;
+}
+
+
+// That's the main read function
+void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig)
+{
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+    cmsIOHANDLER* io = Icc ->IOhandler;
+    cmsTagTypeHandler* TypeHandler;
+    cmsTagTypeHandler LocalTypeHandler;
+    cmsTagDescriptor*  TagDescriptor;
+    cmsTagTypeSignature BaseType;
+    cmsUInt32Number Offset, TagSize;
+    cmsUInt32Number ElemCount;
+    int n;
+
+    if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return NULL;
+
+    n = _cmsSearchTag(Icc, sig, TRUE);
+    if (n < 0) goto Error;               // Not found, return NULL
+
+
+    // If the element is already in memory, return the pointer
+    if (Icc -> TagPtrs[n]) {
+
+        if (Icc ->TagSaveAsRaw[n]) goto Error;  // We don't support read raw tags as cooked
+
+        _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+        return Icc -> TagPtrs[n];
+    }
+
+    // We need to read it. Get the offset and size to the file
+    Offset    = Icc -> TagOffsets[n];
+    TagSize   = Icc -> TagSizes[n];
+
+    // Seek to its location
+    if (!io -> Seek(io, Offset))
+        goto Error;
+
+    // Search for support on this tag
+    TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig);
+    if (TagDescriptor == NULL) {
+
+        char String[5];
+
+        _cmsTagSignature2String(String, sig);
+
+        // An unknown element was found.
+        cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown tag type '%s' found.", String);
+        goto Error;     // Unsupported.
+    }
+
+    // if supported, get type and check if in list
+    BaseType = _cmsReadTypeBase(io);
+    if (BaseType == 0) goto Error;
+
+    if (!IsTypeSupported(TagDescriptor, BaseType)) goto Error;
+
+    TagSize  -= 8;                      // Alredy read by the type base logic
+
+    // Get type handler
+    TypeHandler = _cmsGetTagTypeHandler(Icc ->ContextID, BaseType);
+    if (TypeHandler == NULL) goto Error;
+    LocalTypeHandler = *TypeHandler;
+
+
+    // Read the tag
+    Icc -> TagTypeHandlers[n] = TypeHandler;
+
+    LocalTypeHandler.ContextID = Icc ->ContextID;
+    LocalTypeHandler.ICCVersion = Icc ->Version;
+    Icc -> TagPtrs[n] = LocalTypeHandler.ReadPtr(&LocalTypeHandler, io, &ElemCount, TagSize);
+
+    // The tag type is supported, but something wrong happend and we cannot read the tag.
+    // let know the user about this (although it is just a warning)
+    if (Icc -> TagPtrs[n] == NULL) {
+
+        char String[5];
+
+        _cmsTagSignature2String(String, sig);
+        cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "Corrupted tag '%s'", String);
+        goto Error;
+    }
+
+    // This is a weird error that may be a symptom of something more serious, the number of
+    // stored item is actually less than the number of required elements.
+    if (ElemCount < TagDescriptor ->ElemCount) {
+
+        char String[5];
+
+        _cmsTagSignature2String(String, sig);
+        cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "'%s' Inconsistent number of items: expected %d, got %d",
+            String, TagDescriptor ->ElemCount, ElemCount);
+    }
+
+
+    // Return the data
+    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+    return Icc -> TagPtrs[n];
+
+
+    // Return error and unlock tha data
+Error:
+    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+    return NULL;
+}
+
+
+// Get true type of data
+cmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig)
+{
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+    cmsTagTypeHandler* TypeHandler;
+    int n;
+
+    // Search for given tag in ICC profile directory
+    n = _cmsSearchTag(Icc, sig, TRUE);
+    if (n < 0) return (cmsTagTypeSignature) 0;                // Not found, return NULL
+
+    // Get the handler. The true type is there
+    TypeHandler =  Icc -> TagTypeHandlers[n];
+    return TypeHandler ->Signature;
+}
+
+
+// Write a single tag. This just keeps track of the tak into a list of "to be written". If the tag is already
+// in that list, the previous version is deleted.
+cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data)
+{
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+    cmsTagTypeHandler* TypeHandler = NULL;
+    cmsTagTypeHandler LocalTypeHandler;
+    cmsTagDescriptor* TagDescriptor = NULL;
+    cmsTagTypeSignature Type;
+    int i;
+    cmsFloat64Number Version;
+    char TypeString[5], SigString[5];
+
+    if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return FALSE;
+
+    // To delete tags.
+    if (data == NULL) {
+
+         // Delete the tag
+         i = _cmsSearchTag(Icc, sig, FALSE);
+         if (i >= 0) {
+                
+             // Use zero as a mark of deleted 
+             _cmsDeleteTagByPos(Icc, i);
+             Icc ->TagNames[i] = (cmsTagSignature) 0;
+             _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+             return TRUE;
+         }
+         // Didn't find the tag
+        goto Error;
+    }
+
+    if (!_cmsNewTag(Icc, sig, &i)) goto Error;
+
+    // This is not raw
+    Icc ->TagSaveAsRaw[i] = FALSE;
+
+    // This is not a link
+    Icc ->TagLinked[i] = (cmsTagSignature) 0;
+
+    // Get information about the TAG.
+    TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig);
+    if (TagDescriptor == NULL){
+         cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported tag '%x'", sig);
+        goto Error;
+    }
+
+
+    // Now we need to know which type to use. It depends on the version.
+    Version = cmsGetProfileVersion(hProfile);
+
+    if (TagDescriptor ->DecideType != NULL) {
+
+        // Let the tag descriptor to decide the type base on depending on
+        // the data. This is useful for example on parametric curves, where
+        // curves specified by a table cannot be saved as parametric and needs
+        // to be casted to single v2-curves, even on v4 profiles.
+
+        Type = TagDescriptor ->DecideType(Version, data);
+    }
+    else {
+
+        Type = TagDescriptor ->SupportedTypes[0];
+    }
+
+    // Does the tag support this type?
+    if (!IsTypeSupported(TagDescriptor, Type)) {
+
+        _cmsTagSignature2String(TypeString, (cmsTagSignature) Type);
+        _cmsTagSignature2String(SigString,  sig);
+
+        cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%s' for tag '%s'", TypeString, SigString);
+        goto Error;
+    }
+
+    // Does we have a handler for this type?
+    TypeHandler =  _cmsGetTagTypeHandler(Icc->ContextID, Type);
+    if (TypeHandler == NULL) {
+
+        _cmsTagSignature2String(TypeString, (cmsTagSignature) Type);
+        _cmsTagSignature2String(SigString,  sig);
+
+        cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%s' for tag '%s'", TypeString, SigString);
+        goto Error;           // Should never happen
+    }
+
+
+    // Fill fields on icc structure
+    Icc ->TagTypeHandlers[i]  = TypeHandler;
+    Icc ->TagNames[i]         = sig;
+    Icc ->TagSizes[i]         = 0;
+    Icc ->TagOffsets[i]       = 0;
+
+    LocalTypeHandler = *TypeHandler;
+    LocalTypeHandler.ContextID  = Icc ->ContextID;
+    LocalTypeHandler.ICCVersion = Icc ->Version;
+    Icc ->TagPtrs[i]            = LocalTypeHandler.DupPtr(&LocalTypeHandler, data, TagDescriptor ->ElemCount);
+
+    if (Icc ->TagPtrs[i] == NULL)  {
+
+        _cmsTagSignature2String(TypeString, (cmsTagSignature) Type);
+        _cmsTagSignature2String(SigString,  sig);
+        cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "Malformed struct in type '%s' for tag '%s'", TypeString, SigString);
+
+        goto Error;
+    }
+
+    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+    return TRUE;
+
+Error:
+    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+    return FALSE;
+
+}
+
+// Read and write raw data. The only way those function would work and keep consistence with normal read and write
+// is to do an additional step of serialization. That means, readRaw would issue a normal read and then convert the obtained
+// data to raw bytes by using the "write" serialization logic. And vice-versa. I know this may end in situations where
+// raw data written does not exactly correspond with the raw data proposed to cmsWriteRaw data, but this approach allows
+// to write a tag as raw data and the read it as handled.
+
+cmsInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* data, cmsUInt32Number BufferSize)
+{
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+    void *Object;
+    int i;
+    cmsIOHANDLER* MemIO;
+    cmsTagTypeHandler* TypeHandler = NULL;
+    cmsTagTypeHandler LocalTypeHandler;
+    cmsTagDescriptor* TagDescriptor = NULL;
+    cmsUInt32Number rc;
+    cmsUInt32Number Offset, TagSize;
+
+    if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0;
+
+    // Search for given tag in ICC profile directory
+    i = _cmsSearchTag(Icc, sig, TRUE);
+    if (i < 0) goto Error;                 // Not found, 
+
+    // It is already read?
+    if (Icc -> TagPtrs[i] == NULL) {
+
+        // No yet, get original position
+        Offset   = Icc ->TagOffsets[i];
+        TagSize  = Icc ->TagSizes[i];
+
+        // read the data directly, don't keep copy
+        if (data != NULL) {
+
+            if (BufferSize < TagSize)
+                TagSize = BufferSize;
+
+            if (!Icc ->IOhandler ->Seek(Icc ->IOhandler, Offset)) goto Error;
+            if (!Icc ->IOhandler ->Read(Icc ->IOhandler, data, 1, TagSize)) goto Error;
+
+            _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+            return TagSize;
+        }
+
+        _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+        return Icc ->TagSizes[i];
+    }
+
+    // The data has been already read, or written. But wait!, maybe the user choosed to save as
+    // raw data. In this case, return the raw data directly
+    if (Icc ->TagSaveAsRaw[i]) {
+
+        if (data != NULL)  {
+
+            TagSize  = Icc ->TagSizes[i];
+            if (BufferSize < TagSize)
+                TagSize = BufferSize;
+
+            memmove(data, Icc ->TagPtrs[i], TagSize);
+
+            _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+            return TagSize;
+        }
+
+        _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+        return Icc ->TagSizes[i];
+    }
+
+    // Already readed, or previously set by cmsWriteTag(). We need to serialize that
+    // data to raw in order to maintain consistency.
+
+    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+    Object = cmsReadTag(hProfile, sig);
+    if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0;
+
+    if (Object == NULL) goto Error;
+
+    // Now we need to serialize to a memory block: just use a memory iohandler
+
+    if (data == NULL) {
+        MemIO = cmsOpenIOhandlerFromNULL(cmsGetProfileContextID(hProfile));
+    } else{
+        MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w");
+    }
+    if (MemIO == NULL) goto Error;
+
+    // Obtain type handling for the tag
+    TypeHandler = Icc ->TagTypeHandlers[i];
+    TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig);
+    if (TagDescriptor == NULL) {
+        cmsCloseIOhandler(MemIO);
+        goto Error;
+    }
+    
+    if (TypeHandler == NULL) goto Error;
+
+    // Serialize
+    LocalTypeHandler = *TypeHandler;
+    LocalTypeHandler.ContextID  = Icc ->ContextID;
+    LocalTypeHandler.ICCVersion = Icc ->Version;
+
+    if (!_cmsWriteTypeBase(MemIO, TypeHandler ->Signature)) {
+        cmsCloseIOhandler(MemIO);
+        goto Error;
+    }
+
+    if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) {
+        cmsCloseIOhandler(MemIO);
+        goto Error;
+    }
+
+    // Get Size and close
+    rc = MemIO ->Tell(MemIO);
+    cmsCloseIOhandler(MemIO);      // Ignore return code this time
+
+    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+    return rc;
+
+Error:
+    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+    return 0;
+}
+
+// Similar to the anterior. This function allows to write directly to the ICC profile any data, without
+// checking anything. As a rule, mixing Raw with cooked doesn't work, so writting a tag as raw and then reading
+// it as cooked without serializing does result into an error. If that is wha you want, you will need to dump
+// the profile to memry or disk and then reopen it.
+cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size)
+{
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+    int i;
+
+    if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0;
+
+    if (!_cmsNewTag(Icc, sig, &i)) {
+        _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+         return FALSE;
+    }
+
+    // Mark the tag as being written as RAW
+    Icc ->TagSaveAsRaw[i] = TRUE;
+    Icc ->TagNames[i]     = sig;
+    Icc ->TagLinked[i]    = (cmsTagSignature) 0;
+
+    // Keep a copy of the block
+    Icc ->TagPtrs[i]  = _cmsDupMem(Icc ->ContextID, data, Size);
+    Icc ->TagSizes[i] = Size;
+
+    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+    return TRUE;
+}
+
+// Using this function you can collapse several tag entries to the same block in the profile
+cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest)
+{
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+    int i;
+
+     if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return FALSE;
+
+    if (!_cmsNewTag(Icc, sig, &i)) {
+        _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+        return FALSE;
+    }
+
+    // Keep necessary information
+    Icc ->TagSaveAsRaw[i] = FALSE;
+    Icc ->TagNames[i]     = sig;
+    Icc ->TagLinked[i]    = dest;
+
+    Icc ->TagPtrs[i]    = NULL;
+    Icc ->TagSizes[i]   = 0;
+    Icc ->TagOffsets[i] = 0;
+
+    _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+    return TRUE;
+}
+
+
+// Returns the tag linked to sig, in the case two tags are sharing same resource
+cmsTagSignature  CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig)
+{
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+    int i;
+
+    // Search for given tag in ICC profile directory
+    i = _cmsSearchTag(Icc, sig, FALSE);
+    if (i < 0) return (cmsTagSignature) 0;                 // Not found, return 0
+
+    return Icc -> TagLinked[i];
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio1.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio1.c
new file mode 100644
index 0000000..778aa2b
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio1.c
@@ -0,0 +1,1020 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// Read tags using low-level functions, provides necessary glue code to adapt versions, etc.
+
+// LUT tags
+static const cmsTagSignature Device2PCS16[]   =  {cmsSigAToB0Tag,     // Perceptual
+                                                  cmsSigAToB1Tag,     // Relative colorimetric
+                                                  cmsSigAToB2Tag,     // Saturation
+                                                  cmsSigAToB1Tag };   // Absolute colorimetric
+
+static const cmsTagSignature Device2PCSFloat[] = {cmsSigDToB0Tag,     // Perceptual
+                                                  cmsSigDToB1Tag,     // Relative colorimetric
+                                                  cmsSigDToB2Tag,     // Saturation
+                                                  cmsSigDToB3Tag };   // Absolute colorimetric
+
+static const cmsTagSignature PCS2Device16[]    = {cmsSigBToA0Tag,     // Perceptual
+                                                  cmsSigBToA1Tag,     // Relative colorimetric
+                                                  cmsSigBToA2Tag,     // Saturation
+                                                  cmsSigBToA1Tag };   // Absolute colorimetric
+
+static const cmsTagSignature PCS2DeviceFloat[] = {cmsSigBToD0Tag,     // Perceptual
+                                                  cmsSigBToD1Tag,     // Relative colorimetric
+                                                  cmsSigBToD2Tag,     // Saturation
+                                                  cmsSigBToD3Tag };   // Absolute colorimetric
+
+
+// Factors to convert from 1.15 fixed point to 0..1.0 range and vice-versa
+#define InpAdj   (1.0/MAX_ENCODEABLE_XYZ)     // (65536.0/(65535.0*2.0))
+#define OutpAdj  (MAX_ENCODEABLE_XYZ)         // ((2.0*65535.0)/65536.0)
+
+// Several resources for gray conversions.
+static const cmsFloat64Number GrayInputMatrix[] = { (InpAdj*cmsD50X),  (InpAdj*cmsD50Y),  (InpAdj*cmsD50Z) };
+static const cmsFloat64Number OneToThreeInputMatrix[] = { 1, 1, 1 };
+static const cmsFloat64Number PickYMatrix[] = { 0, (OutpAdj*cmsD50Y), 0 };
+static const cmsFloat64Number PickLstarMatrix[] = { 1, 0, 0 };
+
+// Get a media white point fixing some issues found in certain old profiles
+cmsBool  _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile)
+{
+    cmsCIEXYZ* Tag;
+
+    _cmsAssert(Dest != NULL);
+
+    Tag = (cmsCIEXYZ*) cmsReadTag(hProfile, cmsSigMediaWhitePointTag);
+
+    // If no wp, take D50
+    if (Tag == NULL) {
+        *Dest = *cmsD50_XYZ();
+        return TRUE;
+    }
+
+    // V2 display profiles should give D50
+    if (cmsGetEncodedICCversion(hProfile) < 0x4000000) {
+
+        if (cmsGetDeviceClass(hProfile) == cmsSigDisplayClass) {
+            *Dest = *cmsD50_XYZ();
+            return TRUE;
+        }
+    }
+
+    // All seems ok
+    *Dest = *Tag;
+    return TRUE;
+}
+
+
+// Chromatic adaptation matrix. Fix some issues as well
+cmsBool  _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile)
+{
+    cmsMAT3* Tag;
+
+    _cmsAssert(Dest != NULL);
+
+    Tag = (cmsMAT3*) cmsReadTag(hProfile, cmsSigChromaticAdaptationTag);
+
+    if (Tag != NULL) {
+        *Dest = *Tag;
+        return TRUE;
+    }
+
+    // No CHAD available, default it to identity
+    _cmsMAT3identity(Dest);
+
+    // V2 display profiles should give D50
+    if (cmsGetEncodedICCversion(hProfile) < 0x4000000) {
+
+        if (cmsGetDeviceClass(hProfile) == cmsSigDisplayClass) {
+
+            cmsCIEXYZ* White = (cmsCIEXYZ*) cmsReadTag(hProfile, cmsSigMediaWhitePointTag);
+
+            if (White == NULL) {
+
+                _cmsMAT3identity(Dest);
+                return TRUE;
+            }
+
+            return _cmsAdaptationMatrix(Dest, NULL, White, cmsD50_XYZ());
+        }
+    }
+
+    return TRUE;
+}
+
+
+// Auxiliar, read colorants as a MAT3 structure. Used by any function that needs a matrix-shaper
+static
+cmsBool ReadICCMatrixRGB2XYZ(cmsMAT3* r, cmsHPROFILE hProfile)
+{
+    cmsCIEXYZ *PtrRed, *PtrGreen, *PtrBlue;
+
+    _cmsAssert(r != NULL);
+
+    PtrRed   = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigRedColorantTag);
+    PtrGreen = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigGreenColorantTag);
+    PtrBlue  = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigBlueColorantTag);
+
+    if (PtrRed == NULL || PtrGreen == NULL || PtrBlue == NULL)
+        return FALSE;
+
+    _cmsVEC3init(&r -> v[0], PtrRed -> X, PtrGreen -> X,  PtrBlue -> X);
+    _cmsVEC3init(&r -> v[1], PtrRed -> Y, PtrGreen -> Y,  PtrBlue -> Y);
+    _cmsVEC3init(&r -> v[2], PtrRed -> Z, PtrGreen -> Z,  PtrBlue -> Z);
+
+    return TRUE;
+}
+
+
+// Gray input pipeline
+static
+cmsPipeline* BuildGrayInputMatrixPipeline(cmsHPROFILE hProfile)
+{
+    cmsToneCurve *GrayTRC;
+    cmsPipeline* Lut;
+    cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+    GrayTRC = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGrayTRCTag);
+    if (GrayTRC == NULL) return NULL;
+
+    Lut = cmsPipelineAlloc(ContextID, 1, 3);
+    if (Lut == NULL)
+        goto Error;
+
+    if (cmsGetPCS(hProfile) == cmsSigLabData) {
+
+        // In this case we implement the profile as an  identity matrix plus 3 tone curves
+        cmsUInt16Number Zero[2] = { 0x8080, 0x8080 };
+        cmsToneCurve* EmptyTab;
+        cmsToneCurve* LabCurves[3];
+
+        EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero);
+
+        if (EmptyTab == NULL)
+            goto Error;
+
+        LabCurves[0] = GrayTRC;
+        LabCurves[1] = EmptyTab;
+        LabCurves[2] = EmptyTab;
+
+        if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3,  1, OneToThreeInputMatrix, NULL)) ||
+            !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, LabCurves))) {
+                cmsFreeToneCurve(EmptyTab);
+                goto Error;
+        }
+
+        cmsFreeToneCurve(EmptyTab);
+
+    }
+    else  {
+
+        if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &GrayTRC)) ||
+            !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3,  1, GrayInputMatrix, NULL)))
+            goto Error;
+    }
+
+    return Lut;
+
+Error:
+	// memory pointed by GrayTRC is not a new malloc memory, so don't free it here, 
+	// memory pointed by GrayTRC will be freed when hProfile is closed.
+	// test file :0047776_Pocket Medicine_ The Massachusetts General Hospital Handbook of Internal Medicine-2.pdf
+	// Xiaochuan Liu, 20140421
+    //cmsFreeToneCurve(GrayTRC);
+    cmsPipelineFree(Lut);
+    return NULL;
+}
+
+// RGB Matrix shaper
+static
+cmsPipeline* BuildRGBInputMatrixShaper(cmsHPROFILE hProfile)
+{
+    cmsPipeline* Lut;
+    cmsMAT3 Mat;
+    cmsToneCurve *Shapes[3];
+    cmsContext ContextID = cmsGetProfileContextID(hProfile);
+    int i, j;
+
+    if (!ReadICCMatrixRGB2XYZ(&Mat, hProfile)) return NULL;
+
+    // XYZ PCS in encoded in 1.15 format, and the matrix output comes in 0..0xffff range, so
+    // we need to adjust the output by a factor of (0x10000/0xffff) to put data in
+    // a 1.16 range, and then a >> 1 to obtain 1.15. The total factor is (65536.0)/(65535.0*2)
+
+    for (i=0; i < 3; i++)
+        for (j=0; j < 3; j++)
+            Mat.v[i].n[j] *= InpAdj;
+
+
+    Shapes[0] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigRedTRCTag);
+    Shapes[1] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGreenTRCTag);
+    Shapes[2] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigBlueTRCTag);
+
+    if (!Shapes[0] || !Shapes[1] || !Shapes[2])
+        return NULL;
+
+    Lut = cmsPipelineAlloc(ContextID, 3, 3);
+    if (Lut != NULL) {
+
+        if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes)) ||
+            !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL)))
+            goto Error;
+
+        // Note that it is certainly possible a single profile would have a LUT based
+        // tag for output working in lab and a matrix-shaper for the fallback cases. 
+        // This is not allowed by the spec, but this code is tolerant to those cases    
+        if (cmsGetPCS(hProfile) == cmsSigLabData) {
+
+            if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID)))
+                goto Error;
+        }
+
+    }
+
+    return Lut;
+
+Error:
+    cmsPipelineFree(Lut);
+    return NULL;
+}
+
+
+
+// Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded
+static
+cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
+{
+    cmsContext ContextID       = cmsGetProfileContextID(hProfile);
+    cmsPipeline* Lut           = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
+    cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile);
+    cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);
+    
+    if (Lut == NULL) return NULL;
+    
+    // input and output of transform are in lcms 0..1 encoding.  If XYZ or Lab spaces are used, 
+    //  these need to be normalized into the appropriate ranges (Lab = 100,0,0, XYZ=1.0,1.0,1.0)
+    if ( spc == cmsSigLabData)
+    {
+        if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
+            goto Error;
+    }
+    else if (spc == cmsSigXYZData)
+    {
+        if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
+            goto Error;
+    }
+    
+    if ( PCS == cmsSigLabData)
+    {
+        if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
+            goto Error;
+    }
+    else if( PCS == cmsSigXYZData)
+    {
+        if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
+            goto Error;
+    }
+    
+    return Lut;
+
+Error:
+    cmsPipelineFree(Lut);
+    return NULL;
+}
+
+
+// Read and create a BRAND NEW MPE LUT from a given profile. All stuff dependent of version, etc
+// is adjusted here in order to create a LUT that takes care of all those details.
+// We add intent = -1 as a way to read matrix shaper always, no matter of other LUT
+cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent)
+{
+    cmsTagTypeSignature OriginalType;
+    cmsTagSignature tag16    = Device2PCS16[Intent];
+    cmsTagSignature tagFloat = Device2PCSFloat[Intent];
+    cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+    // On named color, take the appropiate tag
+    if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {
+
+        cmsPipeline* Lut;
+        cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag);
+
+        if (nc == NULL) return NULL;
+
+        Lut = cmsPipelineAlloc(ContextID, 0, 0);
+        if (Lut == NULL) {
+            cmsFreeNamedColorList(nc);
+            return NULL;
+        }
+
+        if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE)) ||
+            !cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) {
+            cmsPipelineFree(Lut);
+            return NULL;
+        }
+        return Lut;
+    }
+
+    // This is an attempt to reuse this funtion to retrieve the matrix-shaper as pipeline no
+    // matter other LUT are present and have precedence. Intent = -1 means just this.
+    if (Intent != -1) {
+
+        if (cmsIsTag(hProfile, tagFloat)) {  // Float tag takes precedence
+
+            // Floating point LUT are always V4, but the encoding range is no
+            // longer 0..1.0, so we need to add an stage depending on the color space
+            return _cmsReadFloatInputTag(hProfile, tagFloat);
+        }
+
+        // Revert to perceptual if no tag is found
+        if (!cmsIsTag(hProfile, tag16)) {
+            tag16 = Device2PCS16[0];
+        }
+
+        if (cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table?
+
+            // Check profile version and LUT type. Do the necessary adjustments if needed
+
+            // First read the tag
+            cmsPipeline* Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16);
+            if (Lut == NULL) return NULL;
+
+            // After reading it, we have now info about the original type
+            OriginalType =  _cmsGetTagTrueType(hProfile, tag16);
+
+            // The profile owns the Lut, so we need to copy it
+            Lut = cmsPipelineDup(Lut);
+
+            // We need to adjust data only for Lab16 on output
+            if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData)
+                return Lut;
+
+            // If the input is Lab, add also a conversion at the begin
+            if (cmsGetColorSpace(hProfile) == cmsSigLabData &&
+                !cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
+                goto Error;
+
+            // Add a matrix for conversion V2 to V4 Lab PCS
+            if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
+                goto Error;
+
+            return Lut;
+Error:
+            cmsPipelineFree(Lut);
+            return NULL;
+        }
+    }
+
+    // Lut was not found, try to create a matrix-shaper
+
+    // Check if this is a grayscale profile.
+    if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
+
+        // if so, build appropiate conversion tables.
+        // The tables are the PCS iluminant, scaled across GrayTRC
+        return BuildGrayInputMatrixPipeline(hProfile);
+    }
+
+    // Not gray, create a normal matrix-shaper
+    return BuildRGBInputMatrixShaper(hProfile);
+}
+
+// ---------------------------------------------------------------------------------------------------------------
+
+// Gray output pipeline.
+// XYZ -> Gray or Lab -> Gray. Since we only know the GrayTRC, we need to do some assumptions. Gray component will be
+// given by Y on XYZ PCS and by L* on Lab PCS, Both across inverse TRC curve.
+// The complete pipeline on XYZ is Matrix[3:1] -> Tone curve and in Lab Matrix[3:1] -> Tone Curve as well.
+
+static
+cmsPipeline* BuildGrayOutputPipeline(cmsHPROFILE hProfile)
+{
+    cmsToneCurve *GrayTRC, *RevGrayTRC;
+    cmsPipeline* Lut;
+    cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+    GrayTRC = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGrayTRCTag);
+    if (GrayTRC == NULL) return NULL;
+
+    RevGrayTRC = cmsReverseToneCurve(GrayTRC);
+    if (RevGrayTRC == NULL) return NULL;
+
+    Lut = cmsPipelineAlloc(ContextID, 3, 1);
+    if (Lut == NULL) {
+        cmsFreeToneCurve(RevGrayTRC);
+        return NULL;
+    }
+
+    if (cmsGetPCS(hProfile) == cmsSigLabData) {
+
+        if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1,  3, PickLstarMatrix, NULL)))
+            goto Error;
+    }
+    else  {
+        if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1,  3, PickYMatrix, NULL)))
+            goto Error;
+    }
+
+    if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC)))
+        goto Error;
+
+    cmsFreeToneCurve(RevGrayTRC);
+    return Lut;
+
+Error:
+    cmsFreeToneCurve(RevGrayTRC);
+    cmsPipelineFree(Lut);
+    return NULL;
+}
+
+
+static
+cmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile)
+{
+    cmsPipeline* Lut;
+    cmsToneCurve *Shapes[3], *InvShapes[3];
+    cmsMAT3 Mat, Inv;
+    int i, j;
+    cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+    if (!ReadICCMatrixRGB2XYZ(&Mat, hProfile))
+        return NULL;
+
+    if (!_cmsMAT3inverse(&Mat, &Inv))
+        return NULL;
+
+    // XYZ PCS in encoded in 1.15 format, and the matrix input should come in 0..0xffff range, so
+    // we need to adjust the input by a << 1 to obtain a 1.16 fixed and then by a factor of
+    // (0xffff/0x10000) to put data in 0..0xffff range. Total factor is (2.0*65535.0)/65536.0;
+
+    for (i=0; i < 3; i++)
+        for (j=0; j < 3; j++)
+            Inv.v[i].n[j] *= OutpAdj;
+
+    Shapes[0] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigRedTRCTag);
+    Shapes[1] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGreenTRCTag);
+    Shapes[2] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigBlueTRCTag);
+
+    if (!Shapes[0] || !Shapes[1] || !Shapes[2])
+        return NULL;
+
+    InvShapes[0] = cmsReverseToneCurve(Shapes[0]);
+    InvShapes[1] = cmsReverseToneCurve(Shapes[1]);
+    InvShapes[2] = cmsReverseToneCurve(Shapes[2]);
+
+    if (!InvShapes[0] || !InvShapes[1] || !InvShapes[2]) {
+        return NULL;
+    }
+
+    Lut = cmsPipelineAlloc(ContextID, 3, 3);
+    if (Lut != NULL) {
+
+        // Note that it is certainly possible a single profile would have a LUT based
+        // tag for output working in lab and a matrix-shaper for the fallback cases. 
+        // This is not allowed by the spec, but this code is tolerant to those cases    
+        if (cmsGetPCS(hProfile) == cmsSigLabData) {
+
+            if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID)))
+                goto Error;
+        }
+
+        if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL)) ||
+            !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes)))
+            goto Error;
+    }
+
+    cmsFreeToneCurveTriple(InvShapes);
+    return Lut;
+Error:
+    cmsFreeToneCurveTriple(InvShapes);
+    cmsPipelineFree(Lut);
+    return NULL;
+}
+
+
+// Change CLUT interpolation to trilinear
+static
+void ChangeInterpolationToTrilinear(cmsPipeline* Lut)
+{
+    cmsStage* Stage;
+
+    for (Stage = cmsPipelineGetPtrToFirstStage(Lut);
+        Stage != NULL;
+        Stage = cmsStageNext(Stage)) {
+
+            if (cmsStageType(Stage) == cmsSigCLutElemType) {
+
+                _cmsStageCLutData* CLUT = (_cmsStageCLutData*) Stage ->Data;
+
+                CLUT ->Params->dwFlags |= CMS_LERP_FLAGS_TRILINEAR;
+                _cmsSetInterpolationRoutine(Lut->ContextID, CLUT ->Params);
+            }
+    }
+}
+
+
+// Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded
+static
+cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
+{
+    cmsContext ContextID       = cmsGetProfileContextID(hProfile);
+    cmsPipeline* Lut           = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
+    cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);
+    cmsColorSpaceSignature dataSpace = cmsGetColorSpace(hProfile);
+    
+    if (Lut == NULL) return NULL;
+    
+    // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
+    // and since the formatter has already accomodated to 0..1.0, we should undo this change
+    if ( PCS == cmsSigLabData)
+    {
+        if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
+            goto Error;
+    }
+    else
+        if (PCS == cmsSigXYZData)
+        {
+            if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
+                goto Error;
+        }
+    
+    // the output can be Lab or XYZ, in which case normalisation is needed on the end of the pipeline
+    if ( dataSpace == cmsSigLabData)
+    {
+        if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
+            goto Error;
+    }
+    else if (dataSpace == cmsSigXYZData)
+    {
+        if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
+            goto Error;
+    }
+    
+    return Lut;
+
+Error:
+    cmsPipelineFree(Lut);
+    return NULL;
+}
+
+// Create an output MPE LUT from agiven profile. Version mismatches are handled here
+cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent)
+{
+    cmsTagTypeSignature OriginalType;
+    cmsTagSignature tag16    = PCS2Device16[Intent];
+    cmsTagSignature tagFloat = PCS2DeviceFloat[Intent];
+    cmsContext ContextID     = cmsGetProfileContextID(hProfile);
+
+
+    if (Intent != -1) {
+
+        if (cmsIsTag(hProfile, tagFloat)) {  // Float tag takes precedence
+
+            // Floating point LUT are always V4
+            return _cmsReadFloatOutputTag(hProfile, tagFloat);
+        }
+
+        // Revert to perceptual if no tag is found
+        if (!cmsIsTag(hProfile, tag16)) {
+            tag16 = PCS2Device16[0];
+        }
+
+        if (cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table?
+
+            // Check profile version and LUT type. Do the necessary adjustments if needed
+
+            // First read the tag
+            cmsPipeline* Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16);
+            if (Lut == NULL) return NULL;
+
+            // After reading it, we have info about the original type
+            OriginalType =  _cmsGetTagTrueType(hProfile, tag16);
+
+            // The profile owns the Lut, so we need to copy it
+            Lut = cmsPipelineDup(Lut);
+            if (Lut == NULL) return NULL;
+
+            // Now it is time for a controversial stuff. I found that for 3D LUTS using
+            // Lab used as indexer space,  trilinear interpolation should be used
+            if (cmsGetPCS(hProfile) == cmsSigLabData)
+                ChangeInterpolationToTrilinear(Lut);
+
+            // We need to adjust data only for Lab and Lut16 type
+            if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData)
+                return Lut;
+
+            // Add a matrix for conversion V4 to V2 Lab PCS
+            if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
+                goto Error;
+
+            // If the output is Lab, add also a conversion at the end
+            if (cmsGetColorSpace(hProfile) == cmsSigLabData)
+                if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
+                    goto Error;
+
+            return Lut;
+Error:
+            cmsPipelineFree(Lut);
+            return NULL;
+        }
+    }
+
+    // Lut not found, try to create a matrix-shaper
+
+    // Check if this is a grayscale profile.
+    if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
+
+        // if so, build appropiate conversion tables.
+        // The tables are the PCS iluminant, scaled across GrayTRC
+        return BuildGrayOutputPipeline(hProfile);
+    }
+
+    // Not gray, create a normal matrix-shaper, which only operates in XYZ space  
+    return BuildRGBOutputMatrixShaper(hProfile);
+}
+
+// ---------------------------------------------------------------------------------------------------------------
+
+// Read the AToD0 tag, adjusting the encoding of Lab or XYZ if neded
+static
+cmsPipeline* _cmsReadFloatDevicelinkTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
+{
+    cmsContext ContextID       = cmsGetProfileContextID(hProfile);
+    cmsPipeline* Lut           = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
+    cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);
+    cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile);
+
+    if (Lut == NULL) return NULL;
+
+    if (spc == cmsSigLabData)
+    {
+        if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
+            goto Error;
+    }
+    else
+        if (spc == cmsSigXYZData)
+        {
+            if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
+                goto Error;
+        }
+
+        if (PCS == cmsSigLabData)
+        {
+            if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
+                goto Error;
+        }
+        else
+            if (PCS == cmsSigXYZData)
+            {
+                if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
+                    goto Error;
+            }
+
+    return Lut;
+Error:
+    cmsPipelineFree(Lut);
+    return NULL;
+}
+
+// This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The
+// tag name here may default to AToB0
+cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent)
+{
+    cmsPipeline* Lut;
+    cmsTagTypeSignature OriginalType;
+    cmsTagSignature tag16    = Device2PCS16[Intent];
+    cmsTagSignature tagFloat = Device2PCSFloat[Intent];
+    cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+
+    // On named color, take the appropiate tag
+    if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {
+
+        cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag);
+
+        if (nc == NULL) return NULL;
+
+        Lut = cmsPipelineAlloc(ContextID, 0, 0);
+        if (Lut == NULL)
+            goto Error;
+
+        if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE)))
+            goto Error;
+
+        if (cmsGetColorSpace(hProfile) == cmsSigLabData)
+            if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
+                goto Error;
+
+        return Lut;
+Error:
+        cmsPipelineFree(Lut);
+        cmsFreeNamedColorList(nc);
+        return NULL;
+    }
+
+    if (cmsIsTag(hProfile, tagFloat)) {  // Float tag takes precedence
+
+        // Floating point LUT are always V
+        return _cmsReadFloatDevicelinkTag(hProfile, tagFloat);
+    }
+
+    tagFloat = Device2PCSFloat[0];
+    if (cmsIsTag(hProfile, tagFloat)) {
+
+        return cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
+    }
+
+    if (!cmsIsTag(hProfile, tag16)) {  // Is there any LUT-Based table?
+
+        tag16    = Device2PCS16[0];
+        if (!cmsIsTag(hProfile, tag16)) return NULL;
+    }
+
+    // Check profile version and LUT type. Do the necessary adjustments if needed
+
+    // Read the tag
+    Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16);
+    if (Lut == NULL) return NULL;
+
+    // The profile owns the Lut, so we need to copy it
+    Lut = cmsPipelineDup(Lut);
+    if (Lut == NULL) return NULL;
+
+    // Now it is time for a controversial stuff. I found that for 3D LUTS using
+    // Lab used as indexer space,  trilinear interpolation should be used
+    if (cmsGetPCS(hProfile) == cmsSigLabData)
+        ChangeInterpolationToTrilinear(Lut);
+
+    // After reading it, we have info about the original type
+    OriginalType =  _cmsGetTagTrueType(hProfile, tag16);
+
+    // We need to adjust data for Lab16 on output
+    if (OriginalType != cmsSigLut16Type) return Lut;
+
+    // Here it is possible to get Lab on both sides
+
+    if (cmsGetColorSpace(hProfile) == cmsSigLabData) {
+        if(!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
+            goto Error2;
+    }
+
+    if (cmsGetPCS(hProfile) == cmsSigLabData) {
+        if(!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
+            goto Error2;
+    }
+
+    return Lut;
+
+Error2:
+    cmsPipelineFree(Lut);
+    return NULL;
+}
+
+// ---------------------------------------------------------------------------------------------------------------
+
+// Returns TRUE if the profile is implemented as matrix-shaper
+cmsBool  CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile)
+{
+    switch (cmsGetColorSpace(hProfile)) {
+
+    case cmsSigGrayData:
+
+        return cmsIsTag(hProfile, cmsSigGrayTRCTag);
+
+    case cmsSigRgbData:
+
+        return (cmsIsTag(hProfile, cmsSigRedColorantTag) &&
+                cmsIsTag(hProfile, cmsSigGreenColorantTag) &&
+                cmsIsTag(hProfile, cmsSigBlueColorantTag) &&
+                cmsIsTag(hProfile, cmsSigRedTRCTag) &&
+                cmsIsTag(hProfile, cmsSigGreenTRCTag) &&
+                cmsIsTag(hProfile, cmsSigBlueTRCTag));
+
+    default:
+
+        return FALSE;
+    }
+}
+
+// Returns TRUE if the intent is implemented as CLUT
+cmsBool  CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection)
+{
+    const cmsTagSignature* TagTable;
+
+    // For devicelinks, the supported intent is that one stated in the header
+    if (cmsGetDeviceClass(hProfile) == cmsSigLinkClass) {
+            return (cmsGetHeaderRenderingIntent(hProfile) == Intent);
+    }
+
+    switch (UsedDirection) {
+
+       case LCMS_USED_AS_INPUT: TagTable = Device2PCS16; break;
+       case LCMS_USED_AS_OUTPUT:TagTable = PCS2Device16; break;
+
+       // For proofing, we need rel. colorimetric in output. Let's do some recursion
+       case LCMS_USED_AS_PROOF:
+           return cmsIsIntentSupported(hProfile, Intent, LCMS_USED_AS_INPUT) &&
+                  cmsIsIntentSupported(hProfile, INTENT_RELATIVE_COLORIMETRIC, LCMS_USED_AS_OUTPUT);
+
+       default:
+           cmsSignalError(cmsGetProfileContextID(hProfile), cmsERROR_RANGE, "Unexpected direction (%d)", UsedDirection);
+           return FALSE;
+    }
+
+    return cmsIsTag(hProfile, TagTable[Intent]);
+
+}
+
+
+// Return info about supported intents
+cmsBool  CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
+                                        cmsUInt32Number Intent, cmsUInt32Number UsedDirection)
+{
+
+    if (cmsIsCLUT(hProfile, Intent, UsedDirection)) return TRUE;
+
+    // Is there any matrix-shaper? If so, the intent is supported. This is a bit odd, since V2 matrix shaper
+    // does not fully support relative colorimetric because they cannot deal with non-zero black points, but
+    // many profiles claims that, and this is certainly not true for V4 profiles. Lets answer "yes" no matter
+    // the accuracy would be less than optimal in rel.col and v2 case.
+
+    return cmsIsMatrixShaper(hProfile);
+}
+
+
+// ---------------------------------------------------------------------------------------------------------------
+
+// Read both, profile sequence description and profile sequence id if present. Then combine both to
+// create qa unique structure holding both. Shame on ICC to store things in such complicated way.
+cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile)
+{
+    cmsSEQ* ProfileSeq;
+    cmsSEQ* ProfileId;
+    cmsSEQ* NewSeq;
+    cmsUInt32Number i;
+
+    // Take profile sequence description first
+    ProfileSeq = (cmsSEQ*) cmsReadTag(hProfile, cmsSigProfileSequenceDescTag);
+
+    // Take profile sequence ID
+    ProfileId  = (cmsSEQ*) cmsReadTag(hProfile, cmsSigProfileSequenceIdTag);
+
+    if (ProfileSeq == NULL && ProfileId == NULL) return NULL;
+
+    if (ProfileSeq == NULL) return cmsDupProfileSequenceDescription(ProfileId);
+    if (ProfileId  == NULL) return cmsDupProfileSequenceDescription(ProfileSeq);
+
+    // We have to mix both together. For that they must agree
+    if (ProfileSeq ->n != ProfileId ->n) return cmsDupProfileSequenceDescription(ProfileSeq);
+
+    NewSeq = cmsDupProfileSequenceDescription(ProfileSeq);
+
+    // Ok, proceed to the mixing
+    if (NewSeq != NULL) {
+        for (i=0; i < ProfileSeq ->n; i++) {
+
+            memmove(&NewSeq ->seq[i].ProfileID, &ProfileId ->seq[i].ProfileID, sizeof(cmsProfileID));
+            NewSeq ->seq[i].Description = cmsMLUdup(ProfileId ->seq[i].Description);
+        }
+    }
+    return NewSeq;
+}
+
+// Dump the contents of profile sequence in both tags (if v4 available)
+cmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq)
+{
+    if (!cmsWriteTag(hProfile, cmsSigProfileSequenceDescTag, seq)) return FALSE;
+
+    if (cmsGetProfileVersion(hProfile) >= 4.0) {
+
+            if (!cmsWriteTag(hProfile, cmsSigProfileSequenceIdTag, seq)) return FALSE;
+    }
+
+    return TRUE;
+}
+
+
+// Auxiliar, read and duplicate a MLU if found.
+static
+cmsMLU* GetMLUFromProfile(cmsHPROFILE h, cmsTagSignature sig)
+{
+    cmsMLU* mlu = (cmsMLU*) cmsReadTag(h, sig);
+    if (mlu == NULL) return NULL;
+
+    return cmsMLUdup(mlu);
+}
+
+// Create a sequence description out of an array of profiles
+cmsSEQ* _cmsCompileProfileSequence(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[])
+{
+    cmsUInt32Number i;
+    cmsSEQ* seq = cmsAllocProfileSequenceDescription(ContextID, nProfiles);
+
+    if (seq == NULL) return NULL;
+
+    for (i=0; i < nProfiles; i++) {
+
+        cmsPSEQDESC* ps = &seq ->seq[i];
+        cmsHPROFILE h = hProfiles[i];
+        cmsTechnologySignature* techpt;
+
+        cmsGetHeaderAttributes(h, &ps ->attributes);
+        cmsGetHeaderProfileID(h, ps ->ProfileID.ID8);
+        ps ->deviceMfg   = cmsGetHeaderManufacturer(h);
+        ps ->deviceModel = cmsGetHeaderModel(h);
+
+        techpt = (cmsTechnologySignature*) cmsReadTag(h, cmsSigTechnologyTag);
+        if (techpt == NULL)
+            ps ->technology   =  (cmsTechnologySignature) 0;
+        else
+            ps ->technology   = *techpt;
+
+        ps ->Manufacturer = GetMLUFromProfile(h,  cmsSigDeviceMfgDescTag);
+        ps ->Model        = GetMLUFromProfile(h,  cmsSigDeviceModelDescTag);
+        ps ->Description  = GetMLUFromProfile(h, cmsSigProfileDescriptionTag);
+
+    }
+
+    return seq;
+}
+
+// -------------------------------------------------------------------------------------------------------------------
+
+
+static
+const cmsMLU* GetInfo(cmsHPROFILE hProfile, cmsInfoType Info)
+{
+    cmsTagSignature sig;
+
+    switch (Info) {
+
+    case cmsInfoDescription:
+        sig = cmsSigProfileDescriptionTag;
+        break;
+
+    case cmsInfoManufacturer:
+        sig = cmsSigDeviceMfgDescTag;
+        break;
+
+    case cmsInfoModel:
+        sig = cmsSigDeviceModelDescTag;
+         break;
+
+    case cmsInfoCopyright:
+        sig = cmsSigCopyrightTag;
+        break;
+
+    default: return NULL;
+    }
+
+
+    return (cmsMLU*) cmsReadTag(hProfile, sig);
+}
+
+
+
+cmsUInt32Number CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info,
+                                            const char LanguageCode[3], const char CountryCode[3],
+                                            wchar_t* Buffer, cmsUInt32Number BufferSize)
+{
+    const cmsMLU* mlu = GetInfo(hProfile, Info);
+    if (mlu == NULL) return 0;
+
+    return cmsMLUgetWide(mlu, LanguageCode, CountryCode, Buffer, BufferSize);
+}
+
+
+cmsUInt32Number  CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info,
+                                                          const char LanguageCode[3], const char CountryCode[3],
+                                                          char* Buffer, cmsUInt32Number BufferSize)
+{
+    const cmsMLU* mlu = GetInfo(hProfile, Info);
+    if (mlu == NULL) return 0;
+
+    return cmsMLUgetASCII(mlu, LanguageCode, CountryCode, Buffer, BufferSize);
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmslut.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmslut.c
new file mode 100644
index 0000000..c4f9346
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmslut.c
@@ -0,0 +1,1793 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// Allocates an empty multi profile element
+cmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID,
+                                cmsStageSignature Type,
+                                cmsUInt32Number InputChannels,
+                                cmsUInt32Number OutputChannels,
+                                _cmsStageEvalFn     EvalPtr,
+                                _cmsStageDupElemFn  DupElemPtr,
+                                _cmsStageFreeElemFn FreePtr,
+                                void*             Data)
+{
+    cmsStage* ph = (cmsStage*) _cmsMallocZero(ContextID, sizeof(cmsStage));
+
+    if (ph == NULL) return NULL;
+
+
+    ph ->ContextID = ContextID;
+
+    ph ->Type       = Type;
+    ph ->Implements = Type;   // By default, no clue on what is implementing
+
+    ph ->InputChannels  = InputChannels;
+    ph ->OutputChannels = OutputChannels;
+    ph ->EvalPtr        = EvalPtr;
+    ph ->DupElemPtr     = DupElemPtr;
+    ph ->FreePtr        = FreePtr;
+    ph ->Data           = Data;
+
+    return ph;
+}
+
+
+static
+void EvaluateIdentity(const cmsFloat32Number In[],
+                            cmsFloat32Number Out[],
+                      const cmsStage *mpe)
+{
+    memmove(Out, In, mpe ->InputChannels * sizeof(cmsFloat32Number));
+}
+
+
+cmsStage* CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels)
+{
+    return _cmsStageAllocPlaceholder(ContextID,
+                                   cmsSigIdentityElemType,
+                                   nChannels, nChannels,
+                                   EvaluateIdentity,
+                                   NULL,
+                                   NULL,
+                                   NULL);
+ }
+
+// Conversion functions. From floating point to 16 bits
+static
+void FromFloatTo16(const cmsFloat32Number In[], cmsUInt16Number Out[], cmsUInt32Number n)
+{
+    cmsUInt32Number i;
+
+    for (i=0; i < n; i++) {
+        Out[i] = _cmsQuickSaturateWord(In[i] * 65535.0);
+    }
+}
+
+// From 16 bits to floating point
+static
+void From16ToFloat(const cmsUInt16Number In[], cmsFloat32Number Out[], cmsUInt32Number n)
+{
+    cmsUInt32Number i;
+
+    for (i=0; i < n; i++) {
+        Out[i] = (cmsFloat32Number) In[i] / 65535.0F;
+    }
+}
+
+
+// This function is quite useful to analyze the structure of a LUT and retrieve the MPE elements
+// that conform the LUT. It should be called with the LUT, the number of expected elements and
+// then a list of expected types followed with a list of cmsFloat64Number pointers to MPE elements. If
+// the function founds a match with current pipeline, it fills the pointers and returns TRUE
+// if not, returns FALSE without touching anything. Setting pointers to NULL does bypass
+// the storage process.
+cmsBool  CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...)
+{
+    va_list args;
+    cmsUInt32Number i;
+    cmsStage* mpe;
+    cmsStageSignature Type;
+    void** ElemPtr;
+
+    // Make sure same number of elements
+    if (cmsPipelineStageCount(Lut) != n) return FALSE;
+
+    va_start(args, n);
+
+    // Iterate across asked types
+    mpe = Lut ->Elements;
+    for (i=0; i < n; i++) {
+
+        // Get asked type
+        Type  = (cmsStageSignature)va_arg(args, cmsStageSignature);
+        if (mpe ->Type != Type) {
+
+            va_end(args);       // Mismatch. We are done.
+            return FALSE;
+        }
+        mpe = mpe ->Next;
+    }
+
+    // Found a combination, fill pointers if not NULL
+    mpe = Lut ->Elements;
+    for (i=0; i < n; i++) {
+
+        ElemPtr = va_arg(args, void**);
+        if (ElemPtr != NULL)
+            *ElemPtr = mpe;
+
+        mpe = mpe ->Next;
+    }
+
+    va_end(args);
+    return TRUE;
+}
+
+// Below there are implementations for several types of elements. Each type may be implemented by a
+// evaluation function, a duplication function, a function to free resources and a constructor.
+
+// *************************************************************************************************
+// Type cmsSigCurveSetElemType (curves)
+// *************************************************************************************************
+
+cmsToneCurve** _cmsStageGetPtrToCurveSet(const cmsStage* mpe)
+{
+    _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data;
+
+    return Data ->TheCurves;
+}
+
+static
+void EvaluateCurves(const cmsFloat32Number In[],
+                    cmsFloat32Number Out[],
+                    const cmsStage *mpe)
+{
+    _cmsStageToneCurvesData* Data;
+    cmsUInt32Number i;
+
+    _cmsAssert(mpe != NULL);
+
+    Data = (_cmsStageToneCurvesData*) mpe ->Data;
+    if (Data == NULL) return;
+
+    if (Data ->TheCurves == NULL) return;
+
+    for (i=0; i < Data ->nCurves; i++) {
+        Out[i] = cmsEvalToneCurveFloat(Data ->TheCurves[i], In[i]);
+    }
+}
+
+static
+void CurveSetElemTypeFree(cmsStage* mpe)
+{
+    _cmsStageToneCurvesData* Data;
+    cmsUInt32Number i;
+
+    _cmsAssert(mpe != NULL);
+
+    Data = (_cmsStageToneCurvesData*) mpe ->Data;
+    if (Data == NULL) return;
+
+    if (Data ->TheCurves != NULL) {
+        for (i=0; i < Data ->nCurves; i++) {
+            if (Data ->TheCurves[i] != NULL)
+                cmsFreeToneCurve(Data ->TheCurves[i]);
+        }
+    }
+    _cmsFree(mpe ->ContextID, Data ->TheCurves);
+    _cmsFree(mpe ->ContextID, Data);
+}
+
+
+static
+void* CurveSetDup(cmsStage* mpe)
+{
+    _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data;
+    _cmsStageToneCurvesData* NewElem;
+    cmsUInt32Number i;
+
+    NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageToneCurvesData));
+    if (NewElem == NULL) return NULL;
+
+    NewElem ->nCurves   = Data ->nCurves;
+    NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(mpe ->ContextID, NewElem ->nCurves, sizeof(cmsToneCurve*));
+
+    if (NewElem ->TheCurves == NULL) goto Error;
+
+    for (i=0; i < NewElem ->nCurves; i++) {
+
+        // Duplicate each curve. It may fail.
+        NewElem ->TheCurves[i] = cmsDupToneCurve(Data ->TheCurves[i]);
+        if (NewElem ->TheCurves[i] == NULL) goto Error;
+
+
+    }
+    return (void*) NewElem;
+
+Error:
+
+    if (NewElem ->TheCurves != NULL) {
+        for (i=0; i < NewElem ->nCurves; i++) {
+            if (NewElem ->TheCurves[i])
+                cmsFreeToneCurve(NewElem ->TheCurves[i]);
+        }
+    }
+    _cmsFree(mpe ->ContextID, NewElem ->TheCurves);
+    _cmsFree(mpe ->ContextID, NewElem);
+    return NULL;
+}
+
+
+// Curves == NULL forces identity curves
+cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[])
+{
+    cmsUInt32Number i;
+    _cmsStageToneCurvesData* NewElem;
+    cmsStage* NewMPE;
+
+
+    NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCurveSetElemType, nChannels, nChannels,
+                                     EvaluateCurves, CurveSetDup, CurveSetElemTypeFree, NULL );
+    if (NewMPE == NULL) return NULL;
+
+    NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(ContextID, sizeof(_cmsStageToneCurvesData));
+    if (NewElem == NULL) {
+        cmsStageFree(NewMPE);
+        return NULL;
+    }
+
+    NewMPE ->Data  = (void*) NewElem;
+
+    NewElem ->nCurves   = nChannels;
+    NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(ContextID, nChannels, sizeof(cmsToneCurve*));
+    if (NewElem ->TheCurves == NULL) {
+        cmsStageFree(NewMPE);
+        return NULL;
+    }
+
+    for (i=0; i < nChannels; i++) {
+
+        if (Curves == NULL) {
+            NewElem ->TheCurves[i] = cmsBuildGamma(ContextID, 1.0);
+        }
+        else {
+            NewElem ->TheCurves[i] = cmsDupToneCurve(Curves[i]);
+        }
+
+        if (NewElem ->TheCurves[i] == NULL) {
+            cmsStageFree(NewMPE);
+            return NULL;
+        }
+
+    }
+
+   return NewMPE;
+}
+
+
+// Create a bunch of identity curves
+cmsStage* _cmsStageAllocIdentityCurves(cmsContext ContextID, int nChannels)
+{
+    cmsStage* mpe = cmsStageAllocToneCurves(ContextID, nChannels, NULL);
+
+    if (mpe == NULL) return NULL;
+    mpe ->Implements = cmsSigIdentityElemType;
+    return mpe;
+}
+
+
+// *************************************************************************************************
+// Type cmsSigMatrixElemType (Matrices)
+// *************************************************************************************************
+
+
+// Special care should be taken here because precision loss. A temporary cmsFloat64Number buffer is being used
+static
+void EvaluateMatrix(const cmsFloat32Number In[],
+                    cmsFloat32Number Out[],
+                    const cmsStage *mpe)
+{
+    cmsUInt32Number i, j;
+    _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;
+    cmsFloat64Number Tmp;
+
+    // Input is already in 0..1.0 notation
+    for (i=0; i < mpe ->OutputChannels; i++) {
+
+        Tmp = 0;
+        for (j=0; j < mpe->InputChannels; j++) {
+            Tmp += In[j] * Data->Double[i*mpe->InputChannels + j];
+        }
+
+        if (Data ->Offset != NULL)
+            Tmp += Data->Offset[i];
+
+        Out[i] = (cmsFloat32Number) Tmp;
+    }
+
+
+    // Output in 0..1.0 domain
+}
+
+
+// Duplicate a yet-existing matrix element
+static
+void* MatrixElemDup(cmsStage* mpe)
+{
+    _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;
+    _cmsStageMatrixData* NewElem;
+    cmsUInt32Number sz;
+
+    NewElem = (_cmsStageMatrixData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageMatrixData));
+    if (NewElem == NULL) return NULL;
+
+    sz = mpe ->InputChannels * mpe ->OutputChannels;
+
+    NewElem ->Double = (cmsFloat64Number*) _cmsDupMem(mpe ->ContextID, Data ->Double, sz * sizeof(cmsFloat64Number)) ;
+
+    if (Data ->Offset)
+        NewElem ->Offset = (cmsFloat64Number*) _cmsDupMem(mpe ->ContextID,
+                                                Data ->Offset, mpe -> OutputChannels * sizeof(cmsFloat64Number)) ;
+
+    return (void*) NewElem;
+}
+
+
+static
+void MatrixElemTypeFree(cmsStage* mpe)
+{
+    _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;
+    if (Data == NULL)
+        return;
+    if (Data ->Double)
+        _cmsFree(mpe ->ContextID, Data ->Double);
+
+    if (Data ->Offset)
+        _cmsFree(mpe ->ContextID, Data ->Offset);
+
+    _cmsFree(mpe ->ContextID, mpe ->Data);
+}
+
+
+
+cmsStage*  CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols,
+                                     const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset)
+{
+    cmsUInt32Number i, n;
+    _cmsStageMatrixData* NewElem;
+    cmsStage* NewMPE;
+
+    n = Rows * Cols;
+
+    // Check for overflow
+    if (n == 0) return NULL;
+    if (n >= UINT_MAX / Cols) return NULL;
+    if (n >= UINT_MAX / Rows) return NULL;
+    if (n < Rows || n < Cols) return NULL;
+
+    NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigMatrixElemType, Cols, Rows,
+                                     EvaluateMatrix, MatrixElemDup, MatrixElemTypeFree, NULL );
+    if (NewMPE == NULL) return NULL;
+
+
+    NewElem = (_cmsStageMatrixData*) _cmsMallocZero(ContextID, sizeof(_cmsStageMatrixData));
+    if (NewElem == NULL) return NULL;
+
+
+    NewElem ->Double = (cmsFloat64Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat64Number));
+
+    if (NewElem->Double == NULL) {
+        MatrixElemTypeFree(NewMPE);
+        return NULL;
+    }
+
+    for (i=0; i < n; i++) {
+        NewElem ->Double[i] = Matrix[i];
+    }
+
+
+    if (Offset != NULL) {
+
+        NewElem ->Offset = (cmsFloat64Number*) _cmsCalloc(ContextID, Cols, sizeof(cmsFloat64Number));
+        if (NewElem->Offset == NULL) {
+           MatrixElemTypeFree(NewMPE);
+           return NULL;
+        }
+
+        for (i=0; i < Cols; i++) {
+                NewElem ->Offset[i] = Offset[i];
+        }
+
+    }
+
+    NewMPE ->Data  = (void*) NewElem;
+    return NewMPE;
+}
+
+
+// *************************************************************************************************
+// Type cmsSigCLutElemType
+// *************************************************************************************************
+
+
+// Evaluate in true floating point
+static
+void EvaluateCLUTfloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)
+{
+    _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data;
+
+    Data -> Params ->Interpolation.LerpFloat(In, Out, Data->Params);
+}
+
+
+// Convert to 16 bits, evaluate, and back to floating point
+static
+void EvaluateCLUTfloatIn16(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)
+{
+    _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data;
+    cmsUInt16Number In16[MAX_STAGE_CHANNELS], Out16[MAX_STAGE_CHANNELS];
+
+    _cmsAssert(mpe ->InputChannels  <= MAX_STAGE_CHANNELS);
+    _cmsAssert(mpe ->OutputChannels <= MAX_STAGE_CHANNELS);
+
+    FromFloatTo16(In, In16, mpe ->InputChannels);
+    Data -> Params ->Interpolation.Lerp16(In16, Out16, Data->Params);
+    From16ToFloat(Out16, Out,  mpe ->OutputChannels);
+}
+
+
+// Given an hypercube of b dimensions, with Dims[] number of nodes by dimension, calculate the total amount of nodes
+static
+cmsUInt32Number CubeSize(const cmsUInt32Number Dims[], cmsUInt32Number b)
+{
+    cmsUInt32Number rv, dim;
+
+    _cmsAssert(Dims != NULL);
+
+    for (rv = 1; b > 0; b--) {
+
+        dim = Dims[b-1];
+        if (dim == 0) return 0;  // Error
+
+        rv *= dim;
+
+        // Check for overflow
+        if (rv > UINT_MAX / dim) return 0;
+    }
+
+    return rv;
+}
+
+static
+void* CLUTElemDup(cmsStage* mpe)
+{
+    _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data;
+    _cmsStageCLutData* NewElem;
+
+
+    NewElem = (_cmsStageCLutData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageCLutData));
+    if (NewElem == NULL) return NULL;
+
+    NewElem ->nEntries       = Data ->nEntries;
+    NewElem ->HasFloatValues = Data ->HasFloatValues;
+
+    if (Data ->Tab.T) {
+
+        if (Data ->HasFloatValues) {
+            NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.TFloat, Data ->nEntries * sizeof (cmsFloat32Number));
+            if (NewElem ->Tab.TFloat == NULL)
+                goto Error;
+        } else {
+            NewElem ->Tab.T = (cmsUInt16Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.T, Data ->nEntries * sizeof (cmsUInt16Number));
+            if (NewElem ->Tab.TFloat == NULL)
+                goto Error;
+        }
+    }
+
+    NewElem ->Params   = _cmsComputeInterpParamsEx(mpe ->ContextID,
+                                                   Data ->Params ->nSamples,
+                                                   Data ->Params ->nInputs,
+                                                   Data ->Params ->nOutputs,
+                                                   NewElem ->Tab.T,
+                                                   Data ->Params ->dwFlags);
+    if (NewElem->Params != NULL)
+        return (void*) NewElem;
+ Error:
+    if (NewElem->Tab.T)
+        // This works for both types
+        _cmsFree(mpe ->ContextID, NewElem -> Tab.T);
+    _cmsFree(mpe ->ContextID, NewElem);
+    return NULL;
+}
+
+
+static
+void CLutElemTypeFree(cmsStage* mpe)
+{
+
+    _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data;
+
+    // Already empty
+    if (Data == NULL) return;
+
+    // This works for both types
+    if (Data -> Tab.T)
+        _cmsFree(mpe ->ContextID, Data -> Tab.T);
+
+    _cmsFreeInterpParams(Data ->Params);
+    _cmsFree(mpe ->ContextID, mpe ->Data);
+}
+
+
+// Allocates a 16-bit multidimensional CLUT. This is evaluated at 16-bit precision. Table may have different
+// granularity on each dimension.
+cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID,
+                                         const cmsUInt32Number clutPoints[],
+                                         cmsUInt32Number inputChan,
+                                         cmsUInt32Number outputChan,
+                                         const cmsUInt16Number* Table)
+{
+    cmsUInt32Number i, n;
+    _cmsStageCLutData* NewElem;
+    cmsStage* NewMPE;
+
+    _cmsAssert(clutPoints != NULL);
+
+    if (inputChan > MAX_INPUT_DIMENSIONS) {
+        cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", inputChan, MAX_INPUT_DIMENSIONS);
+        return NULL;
+    }
+
+    NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan,
+                                     EvaluateCLUTfloatIn16, CLUTElemDup, CLutElemTypeFree, NULL );
+
+    if (NewMPE == NULL) return NULL;
+
+    NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData));
+    if (NewElem == NULL) {
+        cmsStageFree(NewMPE);
+        return NULL;
+    }
+
+    NewMPE ->Data  = (void*) NewElem;
+
+    NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan);
+    NewElem -> HasFloatValues = FALSE;
+
+    if (n == 0) {
+        cmsStageFree(NewMPE);
+        return NULL;
+    }
+
+
+    NewElem ->Tab.T  = (cmsUInt16Number*) _cmsCalloc(ContextID, n, sizeof(cmsUInt16Number));
+    if (NewElem ->Tab.T == NULL) {
+        cmsStageFree(NewMPE);
+        return NULL;
+    }
+
+    if (Table != NULL) {
+        for (i=0; i < n; i++) {
+            NewElem ->Tab.T[i] = Table[i];
+        }
+    }
+
+    NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.T, CMS_LERP_FLAGS_16BITS);
+    if (NewElem ->Params == NULL) {
+        cmsStageFree(NewMPE);
+        return NULL;
+    }
+
+    return NewMPE;
+}
+
+cmsStage* CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID,
+                                    cmsUInt32Number nGridPoints,
+                                    cmsUInt32Number inputChan,
+                                    cmsUInt32Number outputChan,
+                                    const cmsUInt16Number* Table)
+{
+    cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
+    int i;
+
+   // Our resulting LUT would be same gridpoints on all dimensions
+    for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
+        Dimensions[i] = nGridPoints;
+
+    return cmsStageAllocCLut16bitGranular(ContextID, Dimensions, inputChan, outputChan, Table);
+}
+
+
+cmsStage* CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID,
+                                       cmsUInt32Number nGridPoints,
+                                       cmsUInt32Number inputChan,
+                                       cmsUInt32Number outputChan,
+                                       const cmsFloat32Number* Table)
+{
+   cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
+   int i;
+
+    // Our resulting LUT would be same gridpoints on all dimensions
+    for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
+        Dimensions[i] = nGridPoints;
+
+    return cmsStageAllocCLutFloatGranular(ContextID, Dimensions, inputChan, outputChan, Table);
+}
+
+
+
+cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table)
+{
+    cmsUInt32Number i, n;
+    _cmsStageCLutData* NewElem;
+    cmsStage* NewMPE;
+
+    _cmsAssert(clutPoints != NULL);
+
+    if (inputChan > MAX_INPUT_DIMENSIONS) {
+        cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", inputChan, MAX_INPUT_DIMENSIONS);
+        return NULL;
+    }
+
+    NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan,
+                                             EvaluateCLUTfloat, CLUTElemDup, CLutElemTypeFree, NULL);
+    if (NewMPE == NULL) return NULL;
+
+
+    NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData));
+    if (NewElem == NULL) {
+        cmsStageFree(NewMPE);
+        return NULL;
+    }
+
+    NewMPE ->Data  = (void*) NewElem;
+
+    // There is a potential integer overflow on conputing n and nEntries.
+    NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan);
+    NewElem -> HasFloatValues = TRUE;
+
+    if (n == 0) {
+        cmsStageFree(NewMPE);
+        return NULL;
+    }
+
+    NewElem ->Tab.TFloat  = (cmsFloat32Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat32Number));
+    if (NewElem ->Tab.TFloat == NULL) {
+        cmsStageFree(NewMPE);
+        return NULL;
+    }
+
+    if (Table != NULL) {
+        for (i=0; i < n; i++) {
+            NewElem ->Tab.TFloat[i] = Table[i];
+        }
+    }
+
+    NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints,  inputChan, outputChan, NewElem ->Tab.TFloat, CMS_LERP_FLAGS_FLOAT);
+    if (NewElem ->Params == NULL) {
+        cmsStageFree(NewMPE);
+        return NULL;
+    }
+
+    return NewMPE;
+}
+
+
+static
+int IdentitySampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo)
+{
+    int nChan = *(int*) Cargo;
+    int i;
+
+    for (i=0; i < nChan; i++)
+        Out[i] = In[i];
+
+    return 1;
+}
+
+// Creates an MPE that just copies input to output
+cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, int nChan)
+{
+    cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
+    cmsStage* mpe ;
+    int i;
+
+    for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
+        Dimensions[i] = 2;
+
+    mpe = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, nChan, nChan, NULL);
+    if (mpe == NULL) return NULL;
+
+    if (!cmsStageSampleCLut16bit(mpe, IdentitySampler, &nChan, 0)) {
+        cmsStageFree(mpe);
+        return NULL;
+    }
+
+    mpe ->Implements = cmsSigIdentityElemType;
+    return mpe;
+}
+
+
+
+// Quantize a value 0 <= i < MaxSamples to 0..0xffff
+cmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, int MaxSamples)
+{
+    cmsFloat64Number x;
+
+    x = ((cmsFloat64Number) i * 65535.) / (cmsFloat64Number) (MaxSamples - 1);
+    return _cmsQuickSaturateWord(x);
+}
+
+
+// This routine does a sweep on whole input space, and calls its callback
+// function on knots. returns TRUE if all ok, FALSE otherwise.
+cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void * Cargo, cmsUInt32Number dwFlags)
+{
+    int i, t, nTotalPoints, index, rest;
+    int nInputs, nOutputs;
+    cmsUInt32Number* nSamples;
+    cmsUInt16Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];
+    _cmsStageCLutData* clut;
+
+    if (mpe == NULL) return FALSE;
+
+    clut = (_cmsStageCLutData*) mpe->Data;
+
+    if (clut == NULL) return FALSE;
+
+    nSamples = clut->Params ->nSamples;
+    nInputs  = clut->Params ->nInputs;
+    nOutputs = clut->Params ->nOutputs;
+
+    if (nInputs <= 0) return FALSE;
+    if (nOutputs <= 0) return FALSE;
+    if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE;
+    if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
+
+    nTotalPoints = CubeSize(nSamples, nInputs);
+    if (nTotalPoints == 0) return FALSE;
+
+    index = 0;
+    for (i = 0; i < nTotalPoints; i++) {
+
+        rest = i;
+        for (t = nInputs-1; t >=0; --t) {
+
+            cmsUInt32Number  Colorant = rest % nSamples[t];
+
+            rest /= nSamples[t];
+
+            In[t] = _cmsQuantizeVal(Colorant, nSamples[t]);
+        }
+
+        if (clut ->Tab.T != NULL) {
+            for (t=0; t < nOutputs; t++)
+                Out[t] = clut->Tab.T[index + t];
+        }
+
+        if (!Sampler(In, Out, Cargo))
+            return FALSE;
+
+        if (!(dwFlags & SAMPLER_INSPECT)) {
+
+            if (clut ->Tab.T != NULL) {
+                for (t=0; t < nOutputs; t++)
+                    clut->Tab.T[index + t] = Out[t];
+            }
+        }
+
+        index += nOutputs;
+    }
+
+    return TRUE;
+}
+
+// Same as anterior, but for floting point
+cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void * Cargo, cmsUInt32Number dwFlags)
+{
+    int i, t, nTotalPoints, index, rest;
+    int nInputs, nOutputs;
+    cmsUInt32Number* nSamples;
+    cmsFloat32Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];
+    _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe->Data;
+
+    nSamples = clut->Params ->nSamples;
+    nInputs  = clut->Params ->nInputs;
+    nOutputs = clut->Params ->nOutputs;
+
+    if (nInputs <= 0) return FALSE;
+    if (nOutputs <= 0) return FALSE;
+    if (nInputs  > MAX_INPUT_DIMENSIONS) return FALSE;
+    if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
+
+    nTotalPoints = CubeSize(nSamples, nInputs);
+    if (nTotalPoints == 0) return FALSE;
+
+    index = 0;
+    for (i = 0; i < nTotalPoints; i++) {
+
+        rest = i;
+        for (t = nInputs-1; t >=0; --t) {
+
+            cmsUInt32Number  Colorant = rest % nSamples[t];
+
+            rest /= nSamples[t];
+
+            In[t] =  (cmsFloat32Number) (_cmsQuantizeVal(Colorant, nSamples[t]) / 65535.0);
+        }
+
+        if (clut ->Tab.TFloat != NULL) {
+            for (t=0; t < nOutputs; t++)
+                Out[t] = clut->Tab.TFloat[index + t];
+        }
+
+        if (!Sampler(In, Out, Cargo))
+            return FALSE;
+
+        if (!(dwFlags & SAMPLER_INSPECT)) {
+
+            if (clut ->Tab.TFloat != NULL) {
+                for (t=0; t < nOutputs; t++)
+                    clut->Tab.TFloat[index + t] = Out[t];
+            }
+        }
+
+        index += nOutputs;
+    }
+
+    return TRUE;
+}
+
+
+
+// This routine does a sweep on whole input space, and calls its callback
+// function on knots. returns TRUE if all ok, FALSE otherwise.
+cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],
+                                         cmsSAMPLER16 Sampler, void * Cargo)
+{
+    int i, t, nTotalPoints, rest;
+    cmsUInt16Number In[cmsMAXCHANNELS];
+
+    if (nInputs >= cmsMAXCHANNELS) return FALSE;
+
+    nTotalPoints = CubeSize(clutPoints, nInputs);
+    if (nTotalPoints == 0) return FALSE;
+
+    for (i = 0; i < nTotalPoints; i++) {
+
+        rest = i;
+        for (t = nInputs-1; t >=0; --t) {
+
+            cmsUInt32Number  Colorant = rest % clutPoints[t];
+
+            rest /= clutPoints[t];
+            In[t] = _cmsQuantizeVal(Colorant, clutPoints[t]);
+
+        }
+
+        if (!Sampler(In, NULL, Cargo))
+            return FALSE;
+    }
+
+    return TRUE;
+}
+
+cmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],
+                                            cmsSAMPLERFLOAT Sampler, void * Cargo)
+{
+    int i, t, nTotalPoints, rest;
+    cmsFloat32Number In[cmsMAXCHANNELS];
+
+    if (nInputs >= cmsMAXCHANNELS) return FALSE;
+
+    nTotalPoints = CubeSize(clutPoints, nInputs);
+    if (nTotalPoints == 0) return FALSE;
+
+    for (i = 0; i < nTotalPoints; i++) {
+
+        rest = i;
+        for (t = nInputs-1; t >=0; --t) {
+
+            cmsUInt32Number  Colorant = rest % clutPoints[t];
+
+            rest /= clutPoints[t];
+            In[t] =  (cmsFloat32Number) (_cmsQuantizeVal(Colorant, clutPoints[t]) / 65535.0);
+
+        }
+
+        if (!Sampler(In, NULL, Cargo))
+            return FALSE;
+    }
+
+    return TRUE;
+}
+
+// ********************************************************************************
+// Type cmsSigLab2XYZElemType
+// ********************************************************************************
+
+
+static
+void EvaluateLab2XYZ(const cmsFloat32Number In[],
+                     cmsFloat32Number Out[],
+                     const cmsStage *mpe)
+{
+    cmsCIELab Lab;
+    cmsCIEXYZ XYZ;
+    const cmsFloat64Number XYZadj = MAX_ENCODEABLE_XYZ;
+
+    // V4 rules
+    Lab.L = In[0] * 100.0;
+    Lab.a = In[1] * 255.0 - 128.0;
+    Lab.b = In[2] * 255.0 - 128.0;
+
+    cmsLab2XYZ(NULL, &XYZ, &Lab);
+
+    // From XYZ, range 0..19997 to 0..1.0, note that 1.99997 comes from 0xffff
+    // encoded as 1.15 fixed point, so 1 + (32767.0 / 32768.0)
+
+    Out[0] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.X / XYZadj);
+    Out[1] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.Y / XYZadj);
+    Out[2] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.Z / XYZadj);
+    return;
+
+    cmsUNUSED_PARAMETER(mpe);
+}
+
+
+// No dup or free routines needed, as the structure has no pointers in it.
+cmsStage* _cmsStageAllocLab2XYZ(cmsContext ContextID)
+{
+    return _cmsStageAllocPlaceholder(ContextID, cmsSigLab2XYZElemType, 3, 3, EvaluateLab2XYZ, NULL, NULL, NULL);
+}
+
+// ********************************************************************************
+
+// v2 L=100 is supposed to be placed on 0xFF00. There is no reasonable
+// number of gridpoints that would make exact match. However, a prelinearization
+// of 258 entries, would map 0xFF00 exactly on entry 257, and this is good to avoid scum dot.
+// Almost all what we need but unfortunately, the rest of entries should be scaled by
+// (255*257/256) and this is not exact.
+
+cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID)
+{
+    cmsStage* mpe;
+    cmsToneCurve* LabTable[3];
+    int i, j;
+
+    LabTable[0] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL);
+    LabTable[1] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL);
+    LabTable[2] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL);
+
+    for (j=0; j < 3; j++) {
+
+        if (LabTable[j] == NULL) {
+            cmsFreeToneCurveTriple(LabTable);
+            return NULL;
+        }
+
+        // We need to map * (0xffff / 0xff00), thats same as (257 / 256)
+        // So we can use 258-entry tables to do the trick (i / 257) * (255 * 257) * (257 / 256);
+        for (i=0; i < 257; i++)  {
+
+            LabTable[j]->Table16[i] = (cmsUInt16Number) ((i * 0xffff + 0x80) >> 8);
+        }
+
+        LabTable[j] ->Table16[257] = 0xffff;
+    }
+
+    mpe = cmsStageAllocToneCurves(ContextID, 3, LabTable);
+    cmsFreeToneCurveTriple(LabTable);
+
+    if (mpe == NULL) return NULL;
+    mpe ->Implements = cmsSigLabV2toV4;
+    return mpe;
+}
+
+// ********************************************************************************
+
+// Matrix-based conversion, which is more accurate, but slower and cannot properly be saved in devicelink profiles
+cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID)
+{
+    static const cmsFloat64Number V2ToV4[] = { 65535.0/65280.0, 0, 0,
+                                     0, 65535.0/65280.0, 0,
+                                     0, 0, 65535.0/65280.0
+                                     };
+
+    cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, V2ToV4, NULL);
+
+    if (mpe == NULL) return mpe;
+    mpe ->Implements = cmsSigLabV2toV4;
+    return mpe;
+}
+
+
+// Reverse direction
+cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID)
+{
+    static const cmsFloat64Number V4ToV2[] = { 65280.0/65535.0, 0, 0,
+                                     0, 65280.0/65535.0, 0,
+                                     0, 0, 65280.0/65535.0
+                                     };
+
+     cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, V4ToV2, NULL);
+
+    if (mpe == NULL) return mpe;
+    mpe ->Implements = cmsSigLabV4toV2;
+    return mpe;
+}
+
+
+// To Lab to float. Note that the MPE gives numbers in normal Lab range
+// and we need 0..1.0 range for the formatters
+// L* : 0...100 => 0...1.0  (L* / 100)
+// ab* : -128..+127 to 0..1  ((ab* + 128) / 255)
+
+cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID)
+{
+    static const cmsFloat64Number a1[] = {
+        1.0/100.0, 0, 0,
+        0, 1.0/255.0, 0,
+        0, 0, 1.0/255.0
+    };
+
+    static const cmsFloat64Number o1[] = {
+        0,
+        128.0/255.0,
+        128.0/255.0
+    };
+
+    cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, o1);
+
+    if (mpe == NULL) return mpe;
+    mpe ->Implements = cmsSigLab2FloatPCS;
+    return mpe;
+}
+
+// Fom XYZ to floating point PCS
+cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID)
+{
+#define n (32768.0/65535.0)
+    static const cmsFloat64Number a1[] = {
+        n, 0, 0,
+        0, n, 0,
+        0, 0, n
+    };
+#undef n
+
+    cmsStage *mpe =  cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL);
+
+    if (mpe == NULL) return mpe;
+    mpe ->Implements = cmsSigXYZ2FloatPCS;
+    return mpe;
+}
+
+cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID)
+{
+    static const cmsFloat64Number a1[] = {
+        100.0, 0, 0,
+        0, 255.0, 0,
+        0, 0, 255.0
+    };
+
+    static const cmsFloat64Number o1[] = {
+        0,
+        -128.0,
+        -128.0
+    };
+
+    cmsStage *mpe =  cmsStageAllocMatrix(ContextID, 3, 3, a1, o1);
+    if (mpe == NULL) return mpe;
+    mpe ->Implements = cmsSigFloatPCS2Lab;
+    return mpe;
+}
+
+cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID)
+{
+#define n (65535.0/32768.0)
+
+    static const cmsFloat64Number a1[] = {
+        n, 0, 0,
+        0, n, 0,
+        0, 0, n
+    };
+#undef n
+
+    cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL);
+    if (mpe == NULL) return mpe;
+    mpe ->Implements = cmsSigFloatPCS2XYZ;
+    return mpe;
+}
+
+
+
+// ********************************************************************************
+// Type cmsSigXYZ2LabElemType
+// ********************************************************************************
+
+static
+void EvaluateXYZ2Lab(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)
+{
+    cmsCIELab Lab;
+    cmsCIEXYZ XYZ;
+    const cmsFloat64Number XYZadj = MAX_ENCODEABLE_XYZ;
+
+    // From 0..1.0 to XYZ
+
+    XYZ.X = In[0] * XYZadj;
+    XYZ.Y = In[1] * XYZadj;
+    XYZ.Z = In[2] * XYZadj;
+
+    cmsXYZ2Lab(NULL, &Lab, &XYZ);
+
+    // From V4 Lab to 0..1.0
+
+    Out[0] = (cmsFloat32Number) (Lab.L / 100.0);
+    Out[1] = (cmsFloat32Number) ((Lab.a + 128.0) / 255.0);
+    Out[2] = (cmsFloat32Number) ((Lab.b + 128.0) / 255.0);
+    return;
+
+    cmsUNUSED_PARAMETER(mpe);
+}
+
+cmsStage* _cmsStageAllocXYZ2Lab(cmsContext ContextID)
+{
+    return _cmsStageAllocPlaceholder(ContextID, cmsSigXYZ2LabElemType, 3, 3, EvaluateXYZ2Lab, NULL, NULL, NULL);
+
+}
+
+// ********************************************************************************
+
+// For v4, S-Shaped curves are placed in a/b axis to increase resolution near gray
+
+cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID)
+{
+    cmsToneCurve* LabTable[3];
+    cmsFloat64Number Params[1] =  {2.4} ;
+
+    LabTable[0] = cmsBuildGamma(ContextID, 1.0);
+    LabTable[1] = cmsBuildParametricToneCurve(ContextID, 108, Params);
+    LabTable[2] = cmsBuildParametricToneCurve(ContextID, 108, Params);
+
+    return cmsStageAllocToneCurves(ContextID, 3, LabTable);
+}
+
+
+// Free a single MPE
+void CMSEXPORT cmsStageFree(cmsStage* mpe)
+{
+    if (mpe ->FreePtr)
+        mpe ->FreePtr(mpe);
+
+    _cmsFree(mpe ->ContextID, mpe);
+}
+
+
+cmsUInt32Number  CMSEXPORT cmsStageInputChannels(const cmsStage* mpe)
+{
+    return mpe ->InputChannels;
+}
+
+cmsUInt32Number  CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe)
+{
+    return mpe ->OutputChannels;
+}
+
+cmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe)
+{
+    return mpe -> Type;
+}
+
+void* CMSEXPORT cmsStageData(const cmsStage* mpe)
+{
+    return mpe -> Data;
+}
+
+cmsStage*  CMSEXPORT cmsStageNext(const cmsStage* mpe)
+{
+    return mpe -> Next;
+}
+
+
+// Duplicates an MPE
+cmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe)
+{
+    cmsStage* NewMPE;
+
+    if (mpe == NULL) return NULL;
+    NewMPE = _cmsStageAllocPlaceholder(mpe ->ContextID,
+                                     mpe ->Type,
+                                     mpe ->InputChannels,
+                                     mpe ->OutputChannels,
+                                     mpe ->EvalPtr,
+                                     mpe ->DupElemPtr,
+                                     mpe ->FreePtr,
+                                     NULL);
+    if (NewMPE == NULL) return NULL;
+
+    NewMPE ->Implements = mpe ->Implements;
+
+    if (mpe ->DupElemPtr) {
+
+        NewMPE ->Data = mpe ->DupElemPtr(mpe);
+
+        if (NewMPE->Data == NULL) {
+
+            cmsStageFree(NewMPE);
+            return NULL;
+        }
+
+    } else {
+
+        NewMPE ->Data       = NULL;
+    }
+
+    return NewMPE;
+}
+
+
+// ***********************************************************************************************************
+
+// This function sets up the channel count
+
+static
+void BlessLUT(cmsPipeline* lut)
+{
+    // We can set the input/ouput channels only if we have elements.
+    if (lut ->Elements != NULL) {
+
+        cmsStage *First, *Last;
+
+        First  = cmsPipelineGetPtrToFirstStage(lut);
+        Last   = cmsPipelineGetPtrToLastStage(lut);
+
+        if (First != NULL)lut ->InputChannels = First ->InputChannels;
+        if (Last != NULL) lut ->OutputChannels = Last ->OutputChannels;
+    }
+}
+
+
+// Default to evaluate the LUT on 16 bit-basis. Precision is retained.
+static
+void _LUTeval16(register const cmsUInt16Number In[], register cmsUInt16Number Out[],  register const void* D)
+{
+    cmsPipeline* lut = (cmsPipeline*) D;
+    cmsStage *mpe;
+    cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS];
+    int Phase = 0, NextPhase;
+
+    From16ToFloat(In, &Storage[Phase][0], lut ->InputChannels);
+
+    for (mpe = lut ->Elements;
+         mpe != NULL;
+         mpe = mpe ->Next) {
+
+             NextPhase = Phase ^ 1;
+             mpe ->EvalPtr(&Storage[Phase][0], &Storage[NextPhase][0], mpe);
+             Phase = NextPhase;
+    }
+
+
+    FromFloatTo16(&Storage[Phase][0], Out, lut ->OutputChannels);
+}
+
+
+
+// Does evaluate the LUT on cmsFloat32Number-basis.
+static
+void _LUTevalFloat(register const cmsFloat32Number In[], register cmsFloat32Number Out[], const void* D)
+{
+    cmsPipeline* lut = (cmsPipeline*) D;
+    cmsStage *mpe;
+    cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS];
+    int Phase = 0, NextPhase;
+
+    memmove(&Storage[Phase][0], In, lut ->InputChannels  * sizeof(cmsFloat32Number));
+
+    for (mpe = lut ->Elements;
+         mpe != NULL;
+         mpe = mpe ->Next) {
+
+              NextPhase = Phase ^ 1;
+              mpe ->EvalPtr(&Storage[Phase][0], &Storage[NextPhase][0], mpe);
+              Phase = NextPhase;
+    }
+
+    memmove(Out, &Storage[Phase][0], lut ->OutputChannels * sizeof(cmsFloat32Number));
+}
+
+
+
+
+// LUT Creation & Destruction
+
+cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels)
+{
+       cmsPipeline* NewLUT;
+
+       if (InputChannels >= cmsMAXCHANNELS ||
+           OutputChannels >= cmsMAXCHANNELS) return NULL;
+
+       NewLUT = (cmsPipeline*) _cmsMallocZero(ContextID, sizeof(cmsPipeline));
+       if (NewLUT == NULL) return NULL;
+
+
+       NewLUT -> InputChannels  = InputChannels;
+       NewLUT -> OutputChannels = OutputChannels;
+
+       NewLUT ->Eval16Fn    = _LUTeval16;
+       NewLUT ->EvalFloatFn = _LUTevalFloat;
+       NewLUT ->DupDataFn   = NULL;
+       NewLUT ->FreeDataFn  = NULL;
+       NewLUT ->Data        = NewLUT;
+       NewLUT ->ContextID   = ContextID;
+
+       BlessLUT(NewLUT);
+
+       return NewLUT;
+}
+
+cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut)
+{
+    _cmsAssert(lut != NULL);
+    return lut ->ContextID;
+}
+
+cmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut)
+{
+    _cmsAssert(lut != NULL);
+    return lut ->InputChannels;
+}
+
+cmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut)
+{
+    _cmsAssert(lut != NULL);
+    return lut ->OutputChannels;
+}
+
+// Free a profile elements LUT
+void CMSEXPORT cmsPipelineFree(cmsPipeline* lut)
+{
+    cmsStage *mpe, *Next;
+
+    if (lut == NULL) return;
+
+    for (mpe = lut ->Elements;
+        mpe != NULL;
+        mpe = Next) {
+
+            Next = mpe ->Next;
+            cmsStageFree(mpe);
+    }
+
+    if (lut ->FreeDataFn) lut ->FreeDataFn(lut ->ContextID, lut ->Data);
+
+    _cmsFree(lut ->ContextID, lut);
+}
+
+
+// Default to evaluate the LUT on 16 bit-basis.
+void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[],  const cmsPipeline* lut)
+{
+    _cmsAssert(lut != NULL);
+    lut ->Eval16Fn(In, Out, lut->Data);
+}
+
+
+// Does evaluate the LUT on cmsFloat32Number-basis.
+void CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut)
+{
+    _cmsAssert(lut != NULL);
+    lut ->EvalFloatFn(In, Out, lut);
+}
+
+
+
+// Duplicates a LUT
+cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* lut)
+{
+    cmsPipeline* NewLUT;
+    cmsStage *NewMPE, *Anterior = NULL, *mpe;
+    cmsBool  First = TRUE;
+
+    if (lut == NULL) return NULL;
+
+    NewLUT = cmsPipelineAlloc(lut ->ContextID, lut ->InputChannels, lut ->OutputChannels);
+    if (NewLUT == NULL) return NULL;
+
+    for (mpe = lut ->Elements;
+         mpe != NULL;
+         mpe = mpe ->Next) {
+
+             NewMPE = cmsStageDup(mpe);
+
+             if (NewMPE == NULL) {
+                 cmsPipelineFree(NewLUT);
+                 return NULL;
+             }
+
+             if (First) {
+                 NewLUT ->Elements = NewMPE;
+                 First = FALSE;
+             }
+             else {
+                Anterior ->Next = NewMPE;
+             }
+
+            Anterior = NewMPE;
+    }
+
+    NewLUT ->Eval16Fn    = lut ->Eval16Fn;
+    NewLUT ->EvalFloatFn = lut ->EvalFloatFn;
+    NewLUT ->DupDataFn   = lut ->DupDataFn;
+    NewLUT ->FreeDataFn  = lut ->FreeDataFn;
+
+    if (NewLUT ->DupDataFn != NULL)
+        NewLUT ->Data = NewLUT ->DupDataFn(lut ->ContextID, lut->Data);
+
+
+    NewLUT ->SaveAs8Bits    = lut ->SaveAs8Bits;
+
+    BlessLUT(NewLUT);
+    return NewLUT;
+}
+
+
+int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe)
+{
+    cmsStage* Anterior = NULL, *pt;
+
+    if (lut == NULL || mpe == NULL)
+        return FALSE;
+
+    switch (loc) {
+
+        case cmsAT_BEGIN:
+            mpe ->Next = lut ->Elements;
+            lut ->Elements = mpe;
+            break;
+
+        case cmsAT_END:
+
+            if (lut ->Elements == NULL)
+                lut ->Elements = mpe;
+            else {
+
+                for (pt = lut ->Elements;
+                     pt != NULL;
+                     pt = pt -> Next) Anterior = pt;
+
+                Anterior ->Next = mpe;
+                mpe ->Next = NULL;
+            }
+            break;
+        default:;
+            return FALSE;
+    }
+
+    BlessLUT(lut);
+    return TRUE;
+}
+
+// Unlink an element and return the pointer to it
+void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe)
+{
+    cmsStage *Anterior, *pt, *Last;
+    cmsStage *Unlinked = NULL;
+
+
+    // If empty LUT, there is nothing to remove
+    if (lut ->Elements == NULL) {
+        if (mpe) *mpe = NULL;
+        return;
+    }
+
+    // On depending on the strategy...
+    switch (loc) {
+
+        case cmsAT_BEGIN:
+            {
+                cmsStage* elem = lut ->Elements;
+
+                lut ->Elements = elem -> Next;
+                elem ->Next = NULL;
+                Unlinked = elem;
+
+            }
+            break;
+
+        case cmsAT_END:
+            Anterior = Last = NULL;
+            for (pt = lut ->Elements;
+                pt != NULL;
+                pt = pt -> Next) {
+                    Anterior = Last;
+                    Last = pt;
+            }
+
+            Unlinked = Last;  // Next already points to NULL
+
+            // Truncate the chain
+            if (Anterior)
+                Anterior ->Next = NULL;
+            else
+                lut ->Elements = NULL;
+            break;
+        default:;
+    }
+
+    if (mpe)
+        *mpe = Unlinked;
+    else
+        cmsStageFree(Unlinked);
+
+    BlessLUT(lut);
+}
+
+
+// Concatenate two LUT into a new single one
+cmsBool  CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2)
+{
+    cmsStage* mpe;
+
+    // If both LUTS does not have elements, we need to inherit
+    // the number of channels
+    if (l1 ->Elements == NULL && l2 ->Elements == NULL) {
+        l1 ->InputChannels  = l2 ->InputChannels;
+        l1 ->OutputChannels = l2 ->OutputChannels;
+    }
+
+    // Cat second
+    for (mpe = l2 ->Elements;
+         mpe != NULL;
+         mpe = mpe ->Next) {
+
+            // We have to dup each element
+            if (!cmsPipelineInsertStage(l1, cmsAT_END, cmsStageDup(mpe)))
+                return FALSE;
+    }
+
+    BlessLUT(l1);
+    return TRUE;
+}
+
+
+cmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On)
+{
+    cmsBool Anterior = lut ->SaveAs8Bits;
+
+    lut ->SaveAs8Bits = On;
+    return Anterior;
+}
+
+
+cmsStage* CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut)
+{
+    return lut ->Elements;
+}
+
+cmsStage* CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut)
+{
+    cmsStage *mpe, *Anterior = NULL;
+
+    for (mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next)
+        Anterior = mpe;
+
+    return Anterior;
+}
+
+cmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut)
+{
+    cmsStage *mpe;
+    cmsUInt32Number n;
+
+    for (n=0, mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next)
+            n++;
+
+    return n;
+}
+
+// This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional
+// duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality.
+void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut,
+                                        _cmsOPTeval16Fn Eval16,
+                                        void* PrivateData,
+                                        _cmsFreeUserDataFn FreePrivateDataFn,
+                                        _cmsDupUserDataFn  DupPrivateDataFn)
+{
+
+    Lut ->Eval16Fn = Eval16;
+    Lut ->DupDataFn = DupPrivateDataFn;
+    Lut ->FreeDataFn = FreePrivateDataFn;
+    Lut ->Data = PrivateData;
+}
+
+
+// ----------------------------------------------------------- Reverse interpolation
+// Here's how it goes. The derivative Df(x) of the function f is the linear
+// transformation that best approximates f near the point x. It can be represented
+// by a matrix A whose entries are the partial derivatives of the components of f
+// with respect to all the coordinates. This is know as the Jacobian
+//
+// The best linear approximation to f is given by the matrix equation:
+//
+// y-y0 = A (x-x0)
+//
+// So, if x0 is a good "guess" for the zero of f, then solving for the zero of this
+// linear approximation will give a "better guess" for the zero of f. Thus let y=0,
+// and since y0=f(x0) one can solve the above equation for x. This leads to the
+// Newton's method formula:
+//
+// xn+1 = xn - A-1 f(xn)
+//
+// where xn+1 denotes the (n+1)-st guess, obtained from the n-th guess xn in the
+// fashion described above. Iterating this will give better and better approximations
+// if you have a "good enough" initial guess.
+
+
+#define JACOBIAN_EPSILON            0.001f
+#define INVERSION_MAX_ITERATIONS    30
+
+// Increment with reflexion on boundary
+static
+void IncDelta(cmsFloat32Number *Val)
+{
+    if (*Val < (1.0 - JACOBIAN_EPSILON))
+
+        *Val += JACOBIAN_EPSILON;
+
+    else
+        *Val -= JACOBIAN_EPSILON;
+
+}
+
+
+
+// Euclidean distance between two vectors of n elements each one
+static
+cmsFloat32Number EuclideanDistance(cmsFloat32Number a[], cmsFloat32Number b[], int n)
+{
+    cmsFloat32Number sum = 0;
+    int i;
+
+    for (i=0; i < n; i++) {
+        cmsFloat32Number dif = b[i] - a[i];
+        sum +=  dif * dif;
+    }
+
+    return sqrtf(sum);
+}
+
+
+// Evaluate a LUT in reverse direction. It only searches on 3->3 LUT. Uses Newton method
+//
+// x1 <- x - [J(x)]^-1 * f(x)
+//
+// lut: The LUT on where to do the search
+// Target: LabK, 3 values of Lab plus destination K which is fixed
+// Result: The obtained CMYK
+// Hint:   Location where begin the search
+
+cmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[],
+                                              cmsFloat32Number Result[],
+                                              cmsFloat32Number Hint[],
+                                              const cmsPipeline* lut)
+{
+    cmsUInt32Number  i, j;
+    cmsFloat64Number  error, LastError = 1E20;
+    cmsFloat32Number  fx[4], x[4], xd[4], fxd[4];
+    cmsVEC3 tmp, tmp2;
+    cmsMAT3 Jacobian;
+    
+    // Only 3->3 and 4->3 are supported
+    if (lut ->InputChannels != 3 && lut ->InputChannels != 4) return FALSE;
+    if (lut ->OutputChannels != 3) return FALSE;
+   
+    // Take the hint as starting point if specified
+    if (Hint == NULL) {
+
+        // Begin at any point, we choose 1/3 of CMY axis
+        x[0] = x[1] = x[2] = 0.3f;
+    }
+    else {
+
+        // Only copy 3 channels from hint...
+        for (j=0; j < 3; j++)
+            x[j] = Hint[j];
+    }
+
+    // If Lut is 4-dimensions, then grab target[3], which is fixed
+    if (lut ->InputChannels == 4) {
+        x[3] = Target[3];
+    }
+    else x[3] = 0; // To keep lint happy
+
+
+    // Iterate
+    for (i = 0; i < INVERSION_MAX_ITERATIONS; i++) {
+
+        // Get beginning fx
+        cmsPipelineEvalFloat(x, fx, lut);
+
+        // Compute error
+        error = EuclideanDistance(fx, Target, 3);
+
+        // If not convergent, return last safe value
+        if (error >= LastError)
+            break;
+
+        // Keep latest values
+        LastError     = error;
+        for (j=0; j < lut ->InputChannels; j++)
+                Result[j] = x[j];
+
+        // Found an exact match?
+        if (error <= 0)
+            break;
+
+        // Obtain slope (the Jacobian)
+        for (j = 0; j < 3; j++) {
+
+            xd[0] = x[0];
+            xd[1] = x[1];
+            xd[2] = x[2];
+            xd[3] = x[3];  // Keep fixed channel
+
+            IncDelta(&xd[j]);
+
+            cmsPipelineEvalFloat(xd, fxd, lut);
+
+            Jacobian.v[0].n[j] = ((fxd[0] - fx[0]) / JACOBIAN_EPSILON);
+            Jacobian.v[1].n[j] = ((fxd[1] - fx[1]) / JACOBIAN_EPSILON);
+            Jacobian.v[2].n[j] = ((fxd[2] - fx[2]) / JACOBIAN_EPSILON);
+        }
+
+        // Solve system
+        tmp2.n[0] = fx[0] - Target[0];
+        tmp2.n[1] = fx[1] - Target[1];
+        tmp2.n[2] = fx[2] - Target[2];
+
+        if (!_cmsMAT3solve(&tmp, &Jacobian, &tmp2))
+            return FALSE;
+
+        // Move our guess
+        x[0] -= (cmsFloat32Number) tmp.n[0];
+        x[1] -= (cmsFloat32Number) tmp.n[1];
+        x[2] -= (cmsFloat32Number) tmp.n[2];
+
+        // Some clipping....
+        for (j=0; j < 3; j++) {
+            if (x[j] < 0) x[j] = 0;
+            else
+                if (x[j] > 1.0) x[j] = 1.0;
+        }
+    }
+
+    return TRUE;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmd5.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmd5.c
new file mode 100644
index 0000000..a4758ff
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmd5.c
@@ -0,0 +1,343 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+
+#include "lcms2_internal.h"
+
+#ifdef CMS_USE_BIG_ENDIAN
+
+static
+void byteReverse(cmsUInt8Number * buf, cmsUInt32Number longs)
+{
+    do {
+
+        cmsUInt32Number t = _cmsAdjustEndianess32(*(cmsUInt32Number *) buf);
+        *(cmsUInt32Number *) buf = t;
+        buf += sizeof(cmsUInt32Number);
+
+    } while (--longs);
+
+}
+
+#else
+#define byteReverse(buf, len)
+#endif
+
+
+typedef struct {
+
+    cmsUInt32Number buf[4];
+    cmsUInt32Number bits[2];
+    cmsUInt8Number in[64];
+    cmsContext ContextID;
+
+} _cmsMD5;
+
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
+
+#define STEP(f, w, x, y, z, data, s) \
+    ( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
+
+
+static
+void MD5_Transform(cmsUInt32Number buf[4], cmsUInt32Number in[16])
+
+{
+    register cmsUInt32Number a, b, c, d;
+
+    a = buf[0];
+    b = buf[1];
+    c = buf[2];
+    d = buf[3];
+
+    STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
+    STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
+    STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
+    STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
+    STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
+    STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
+    STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
+    STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
+    STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
+    STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
+    STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
+    STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
+    STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
+    STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
+    STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
+    STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
+
+    STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
+    STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
+    STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
+    STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
+    STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
+    STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
+    STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
+    STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
+    STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
+    STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
+    STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
+    STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
+    STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
+    STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
+    STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
+    STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
+
+    STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
+    STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
+    STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
+    STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
+    STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
+    STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
+    STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
+    STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
+    STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
+    STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
+    STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
+    STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
+    STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
+    STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
+    STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
+    STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
+
+    STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
+    STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
+    STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
+    STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
+    STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
+    STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
+    STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
+    STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
+    STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
+    STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
+    STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
+    STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
+    STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
+    STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
+    STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
+    STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
+
+    buf[0] += a;
+    buf[1] += b;
+    buf[2] += c;
+    buf[3] += d;
+}
+
+
+// Create a MD5 object
+static
+cmsHANDLE  MD5alloc(cmsContext ContextID)
+{
+    _cmsMD5* ctx = (_cmsMD5*) _cmsMallocZero(ContextID, sizeof(_cmsMD5));
+    if (ctx == NULL) return NULL;
+
+    ctx ->ContextID = ContextID;
+
+    ctx->buf[0] = 0x67452301;
+    ctx->buf[1] = 0xefcdab89;
+    ctx->buf[2] = 0x98badcfe;
+    ctx->buf[3] = 0x10325476;
+
+    ctx->bits[0] = 0;
+    ctx->bits[1] = 0;
+
+    return (cmsHANDLE) ctx;
+}
+
+
+static
+void MD5add(cmsHANDLE Handle, cmsUInt8Number* buf, cmsUInt32Number len)
+{
+    _cmsMD5* ctx = (_cmsMD5*) Handle;
+    cmsUInt32Number t;
+
+    t = ctx->bits[0];
+    if ((ctx->bits[0] = t + (len << 3)) < t)
+        ctx->bits[1]++;
+
+    ctx->bits[1] += len >> 29;
+
+    t = (t >> 3) & 0x3f;
+
+    if (t) {
+
+        cmsUInt8Number *p = (cmsUInt8Number *) ctx->in + t;
+
+        t = 64 - t;
+        if (len < t) {
+            memmove(p, buf, len);
+            return;
+        }
+
+        memmove(p, buf, t);
+        byteReverse(ctx->in, 16);
+
+        MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in);
+        buf += t;
+        len -= t;
+    }
+
+    while (len >= 64) {
+        memmove(ctx->in, buf, 64);
+        byteReverse(ctx->in, 16);
+        MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in);
+        buf += 64;
+        len -= 64;
+    }
+
+    memmove(ctx->in, buf, len);
+}
+
+// Destroy the object and return the checksum
+static
+void MD5finish(cmsProfileID* ProfileID,  cmsHANDLE Handle)
+{
+    _cmsMD5* ctx = (_cmsMD5*) Handle;
+    cmsUInt32Number count;
+    cmsUInt8Number *p;
+
+    count = (ctx->bits[0] >> 3) & 0x3F;
+
+    p = ctx->in + count;
+    *p++ = 0x80;
+
+    count = 64 - 1 - count;
+
+    if (count < 8) {
+
+        memset(p, 0, count);
+        byteReverse(ctx->in, 16);
+        MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in);
+
+        memset(ctx->in, 0, 56);
+    } else {
+        memset(p, 0, count - 8);
+    }
+    byteReverse(ctx->in, 14);
+
+    ((cmsUInt32Number *) ctx->in)[14] = ctx->bits[0];
+    ((cmsUInt32Number *) ctx->in)[15] = ctx->bits[1];
+
+    MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in);
+
+    byteReverse((cmsUInt8Number *) ctx->buf, 4);
+    memmove(ProfileID ->ID8, ctx->buf, 16);
+
+    _cmsFree(ctx ->ContextID, ctx);
+}
+
+
+
+// Assuming io points to an ICC profile, compute and store MD5 checksum
+// In the header, rendering intentent, attributes and ID should be set to zero
+// before computing MD5 checksum (per 6.1.13 in ICC spec)
+
+cmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile)
+{
+    cmsContext   ContextID;
+    cmsUInt32Number BytesNeeded;
+    cmsUInt8Number* Mem = NULL;
+    cmsHANDLE  MD5 = NULL;
+    _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+    _cmsICCPROFILE Keep;
+
+    _cmsAssert(hProfile != NULL);
+
+    ContextID = cmsGetProfileContextID(hProfile);
+
+    // Save a copy of the profile header
+    memmove(&Keep, Icc, sizeof(_cmsICCPROFILE));
+
+    // Set RI, attributes and ID
+    memset(&Icc ->attributes, 0, sizeof(Icc ->attributes));
+    Icc ->RenderingIntent = 0;
+    memset(&Icc ->ProfileID, 0, sizeof(Icc ->ProfileID));
+
+    // Compute needed storage
+    if (!cmsSaveProfileToMem(hProfile, NULL, &BytesNeeded)) goto Error;
+
+    // Allocate memory
+    Mem = (cmsUInt8Number*) _cmsMalloc(ContextID, BytesNeeded);
+    if (Mem == NULL) goto Error;
+
+    // Save to temporary storage
+    if (!cmsSaveProfileToMem(hProfile, Mem, &BytesNeeded)) goto Error;
+
+    // Create MD5 object
+    MD5 = MD5alloc(ContextID);
+    if (MD5 == NULL) goto Error;
+
+    // Add all bytes
+    MD5add(MD5, Mem, BytesNeeded);
+
+    // Temp storage is no longer needed
+    _cmsFree(ContextID, Mem);
+
+    // Restore header
+    memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));
+
+    // And store the ID
+    MD5finish(&Icc ->ProfileID,  MD5);
+    return TRUE;
+
+Error:
+
+    // Free resources as something went wrong
+    // "MD5" cannot be other than NULL here, so no need to free it
+    if (Mem != NULL) _cmsFree(ContextID, Mem);
+    memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));
+    return FALSE;
+}
+
+cmsBool CMSEXPORT cmsMD5computeIDExt(const void* buf, unsigned long size, unsigned char ProfileID[16])
+{
+	cmsHANDLE  MD5;
+	cmsUInt8Number* Mem;
+
+	if (buf == NULL)
+		return FALSE;
+    MD5 = NULL;
+	Mem = (cmsUInt8Number*)_cmsMalloc(NULL,size);
+	memmove(Mem,buf,size);
+	// Create MD5 object
+    MD5 = MD5alloc(NULL);
+    if (MD5 == NULL) goto Error;
+
+	// Add all bytes
+    MD5add(MD5, Mem, size);
+
+	// Temp storage is no longer needed
+    _cmsFree(NULL, Mem);
+
+	// And store the ID
+    MD5finish((cmsProfileID*)ProfileID,  MD5);
+	return TRUE;
+Error:
+	if (MD5 != NULL) _cmsFree(NULL, MD5);
+	return FALSE;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmtrx.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmtrx.c
new file mode 100644
index 0000000..fb7b91c
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmtrx.c
@@ -0,0 +1,175 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+#define DSWAP(x, y)     {cmsFloat64Number tmp = (x); (x)=(y); (y)=tmp;}
+
+
+// Initiate a vector
+void CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z)
+{
+    r -> n[VX] = x;
+    r -> n[VY] = y;
+    r -> n[VZ] = z;
+}
+
+// Vector substraction
+void CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b)
+{
+  r -> n[VX] = a -> n[VX] - b -> n[VX];
+  r -> n[VY] = a -> n[VY] - b -> n[VY];
+  r -> n[VZ] = a -> n[VZ] - b -> n[VZ];
+}
+
+// Vector cross product
+void CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v)
+{
+    r ->n[VX] = u->n[VY] * v->n[VZ] - v->n[VY] * u->n[VZ];
+    r ->n[VY] = u->n[VZ] * v->n[VX] - v->n[VZ] * u->n[VX];
+    r ->n[VZ] = u->n[VX] * v->n[VY] - v->n[VX] * u->n[VY];
+}
+
+// Vector dot product
+cmsFloat64Number CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v)
+{
+    return u->n[VX] * v->n[VX] + u->n[VY] * v->n[VY] + u->n[VZ] * v->n[VZ];
+}
+
+// Euclidean length
+cmsFloat64Number CMSEXPORT _cmsVEC3length(const cmsVEC3* a)
+{
+    return sqrt(a ->n[VX] * a ->n[VX] +
+                a ->n[VY] * a ->n[VY] +
+                a ->n[VZ] * a ->n[VZ]);
+}
+
+// Euclidean distance
+cmsFloat64Number CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b)
+{
+    cmsFloat64Number d1 = a ->n[VX] - b ->n[VX];
+    cmsFloat64Number d2 = a ->n[VY] - b ->n[VY];
+    cmsFloat64Number d3 = a ->n[VZ] - b ->n[VZ];
+
+    return sqrt(d1*d1 + d2*d2 + d3*d3);
+}
+
+
+
+// 3x3 Identity
+void CMSEXPORT _cmsMAT3identity(cmsMAT3* a)
+{
+    _cmsVEC3init(&a-> v[0], 1.0, 0.0, 0.0);
+    _cmsVEC3init(&a-> v[1], 0.0, 1.0, 0.0);
+    _cmsVEC3init(&a-> v[2], 0.0, 0.0, 1.0);
+}
+
+static
+cmsBool CloseEnough(cmsFloat64Number a, cmsFloat64Number b)
+{
+    return fabs(b - a) < (1.0 / 65535.0);
+}
+
+
+cmsBool CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a)
+{
+    cmsMAT3 Identity;
+    int i, j;
+
+    _cmsMAT3identity(&Identity);
+
+    for (i=0; i < 3; i++)
+        for (j=0; j < 3; j++)
+            if (!CloseEnough(a ->v[i].n[j], Identity.v[i].n[j])) return FALSE;
+
+    return TRUE;
+}
+
+
+// Multiply two matrices
+void CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b)
+{
+#define ROWCOL(i, j) \
+    a->v[i].n[0]*b->v[0].n[j] + a->v[i].n[1]*b->v[1].n[j] + a->v[i].n[2]*b->v[2].n[j]
+
+    _cmsVEC3init(&r-> v[0], ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2));
+    _cmsVEC3init(&r-> v[1], ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2));
+    _cmsVEC3init(&r-> v[2], ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2));
+
+#undef ROWCOL //(i, j)
+}
+
+
+
+// Inverse of a matrix b = a^(-1)
+cmsBool  CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b)
+{
+   cmsFloat64Number det, c0, c1, c2;
+
+   c0 =  a -> v[1].n[1]*a -> v[2].n[2] - a -> v[1].n[2]*a -> v[2].n[1];
+   c1 = -a -> v[1].n[0]*a -> v[2].n[2] + a -> v[1].n[2]*a -> v[2].n[0];
+   c2 =  a -> v[1].n[0]*a -> v[2].n[1] - a -> v[1].n[1]*a -> v[2].n[0];
+
+   det = a -> v[0].n[0]*c0 + a -> v[0].n[1]*c1 + a -> v[0].n[2]*c2;
+
+   if (fabs(det) < MATRIX_DET_TOLERANCE) return FALSE;  // singular matrix; can't invert
+
+   b -> v[0].n[0] = c0/det;
+   b -> v[0].n[1] = (a -> v[0].n[2]*a -> v[2].n[1] - a -> v[0].n[1]*a -> v[2].n[2])/det;
+   b -> v[0].n[2] = (a -> v[0].n[1]*a -> v[1].n[2] - a -> v[0].n[2]*a -> v[1].n[1])/det;
+   b -> v[1].n[0] = c1/det;
+   b -> v[1].n[1] = (a -> v[0].n[0]*a -> v[2].n[2] - a -> v[0].n[2]*a -> v[2].n[0])/det;
+   b -> v[1].n[2] = (a -> v[0].n[2]*a -> v[1].n[0] - a -> v[0].n[0]*a -> v[1].n[2])/det;
+   b -> v[2].n[0] = c2/det;
+   b -> v[2].n[1] = (a -> v[0].n[1]*a -> v[2].n[0] - a -> v[0].n[0]*a -> v[2].n[1])/det;
+   b -> v[2].n[2] = (a -> v[0].n[0]*a -> v[1].n[1] - a -> v[0].n[1]*a -> v[1].n[0])/det;
+
+   return TRUE;
+}
+
+
+// Solve a system in the form Ax = b
+cmsBool  CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b)
+{
+    cmsMAT3 m, a_1;
+
+    memmove(&m, a, sizeof(cmsMAT3));
+
+    if (!_cmsMAT3inverse(&m, &a_1)) return FALSE;  // Singular matrix
+
+    _cmsMAT3eval(x, &a_1, b);
+    return TRUE;
+}
+
+// Evaluate a vector across a matrix
+void CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v)
+{
+    r->n[VX] = a->v[0].n[VX]*v->n[VX] + a->v[0].n[VY]*v->n[VY] + a->v[0].n[VZ]*v->n[VZ];
+    r->n[VY] = a->v[1].n[VX]*v->n[VX] + a->v[1].n[VY]*v->n[VY] + a->v[1].n[VZ]*v->n[VZ];
+    r->n[VZ] = a->v[2].n[VX]*v->n[VX] + a->v[2].n[VY]*v->n[VY] + a->v[2].n[VZ]*v->n[VZ];
+}
+
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsnamed.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsnamed.c
new file mode 100644
index 0000000..acfd1c8
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsnamed.c
@@ -0,0 +1,929 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// Multilocalized unicode objects. That is an attempt to encapsulate i18n.
+
+
+// Allocates an empty multi localizad unicode object
+cmsMLU* CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems)
+{
+    cmsMLU* mlu;
+
+    // nItems should be positive if given
+    if (nItems <= 0) nItems = 2;
+
+    // Create the container
+    mlu = (cmsMLU*) _cmsMallocZero(ContextID, sizeof(cmsMLU));
+    if (mlu == NULL) return NULL;
+
+    mlu ->ContextID = ContextID;
+
+    // Create entry array
+    mlu ->Entries = (_cmsMLUentry*) _cmsCalloc(ContextID, nItems, sizeof(_cmsMLUentry));
+    if (mlu ->Entries == NULL) {
+        _cmsFree(ContextID, mlu);
+        return NULL;
+    }
+
+    // Ok, keep indexes up to date
+    mlu ->AllocatedEntries    = nItems;
+    mlu ->UsedEntries         = 0;
+
+    return mlu;
+}
+
+
+// Grows a mempool table for a MLU. Each time this function is called, mempool size is multiplied times two.
+static
+cmsBool GrowMLUpool(cmsMLU* mlu)
+{
+    cmsUInt32Number size;
+    void *NewPtr;
+
+    // Sanity check
+    if (mlu == NULL) return FALSE;
+
+    if (mlu ->PoolSize == 0)
+        size = 256;
+    else
+        size = mlu ->PoolSize * 2;
+
+    // Check for overflow
+    if (size < mlu ->PoolSize) return FALSE;
+
+    // Reallocate the pool
+    NewPtr = _cmsRealloc(mlu ->ContextID, mlu ->MemPool, size);
+    if (NewPtr == NULL) return FALSE;
+
+
+    mlu ->MemPool  = NewPtr;
+    mlu ->PoolSize = size;
+
+    return TRUE;
+}
+
+
+// Grows a entry table for a MLU. Each time this function is called, table size is multiplied times two.
+static
+cmsBool GrowMLUtable(cmsMLU* mlu)
+{
+    int AllocatedEntries;
+    _cmsMLUentry *NewPtr;
+
+    // Sanity check
+    if (mlu == NULL) return FALSE;
+
+    AllocatedEntries = mlu ->AllocatedEntries * 2;
+
+    // Check for overflow
+    if (AllocatedEntries / 2 != mlu ->AllocatedEntries) return FALSE;
+
+    // Reallocate the memory
+    NewPtr = (_cmsMLUentry*)_cmsRealloc(mlu ->ContextID, mlu ->Entries, AllocatedEntries*sizeof(_cmsMLUentry));
+    if (NewPtr == NULL) return FALSE;
+
+    mlu ->Entries          = NewPtr;
+    mlu ->AllocatedEntries = AllocatedEntries;
+
+    return TRUE;
+}
+
+
+// Search for a specific entry in the structure. Language and Country are used.
+static
+int SearchMLUEntry(cmsMLU* mlu, cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode)
+{
+    int i;
+
+    // Sanity check
+    if (mlu == NULL) return -1;
+
+    // Iterate whole table
+    for (i=0; i < mlu ->UsedEntries; i++) {
+
+        if (mlu ->Entries[i].Country  == CountryCode &&
+            mlu ->Entries[i].Language == LanguageCode) return i;
+    }
+
+    // Not found
+    return -1;
+}
+
+// Add a block of characters to the intended MLU. Language and country are specified.
+// Only one entry for Language/country pair is allowed.
+static
+cmsBool AddMLUBlock(cmsMLU* mlu, cmsUInt32Number size, const wchar_t *Block,
+                     cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode)
+{
+    cmsUInt32Number Offset;
+    cmsUInt8Number* Ptr;
+
+    // Sanity check
+    if (mlu == NULL) return FALSE;
+
+    // Is there any room available?
+    if (mlu ->UsedEntries >= mlu ->AllocatedEntries) {
+        if (!GrowMLUtable(mlu)) return FALSE;
+    }
+
+    // Only one ASCII string
+    if (SearchMLUEntry(mlu, LanguageCode, CountryCode) >= 0) return FALSE;  // Only one  is allowed!
+
+    // Check for size
+    while ((mlu ->PoolSize - mlu ->PoolUsed) < size) {
+
+            if (!GrowMLUpool(mlu)) return FALSE;
+    }
+
+    Offset = mlu ->PoolUsed;
+
+    Ptr = (cmsUInt8Number*) mlu ->MemPool;
+    if (Ptr == NULL) return FALSE;
+
+    // Set the entry
+    memmove(Ptr + Offset, Block, size);
+    mlu ->PoolUsed += size;
+
+    mlu ->Entries[mlu ->UsedEntries].StrW     = Offset;
+    mlu ->Entries[mlu ->UsedEntries].Len      = size;
+    mlu ->Entries[mlu ->UsedEntries].Country  = CountryCode;
+    mlu ->Entries[mlu ->UsedEntries].Language = LanguageCode;
+    mlu ->UsedEntries++;
+
+    return TRUE;
+}
+
+
+// Add an ASCII entry.
+cmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* ASCIIString)
+{
+    cmsUInt32Number i, len = (cmsUInt32Number) strlen(ASCIIString)+1;
+    wchar_t* WStr;
+    cmsBool  rc;
+    cmsUInt16Number Lang  = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);
+    cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);
+
+    if (mlu == NULL) return FALSE;
+
+    WStr = (wchar_t*) _cmsCalloc(mlu ->ContextID, len,  sizeof(wchar_t));
+    if (WStr == NULL) return FALSE;
+
+    for (i=0; i < len; i++)
+        WStr[i] = (wchar_t) ASCIIString[i];
+
+    rc = AddMLUBlock(mlu, len  * sizeof(wchar_t), WStr, Lang, Cntry);
+
+    _cmsFree(mlu ->ContextID, WStr);
+    return rc;
+
+}
+
+// We don't need any wcs support library
+static
+cmsUInt32Number mywcslen(const wchar_t *s)
+{
+    const wchar_t *p;
+
+    p = s;
+    while (*p)
+        p++;
+
+    return (cmsUInt32Number)(p - s);
+}
+
+
+// Add a wide entry
+cmsBool  CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, const char Language[3], const char Country[3], const wchar_t* WideString)
+{
+    cmsUInt16Number Lang  = _cmsAdjustEndianess16(*(cmsUInt16Number*) Language);
+    cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) Country);
+    cmsUInt32Number len;
+
+    if (mlu == NULL) return FALSE;
+    if (WideString == NULL) return FALSE;
+
+    len = (cmsUInt32Number) (mywcslen(WideString) + 1) * sizeof(wchar_t);
+    return AddMLUBlock(mlu, len, WideString, Lang, Cntry);
+}
+
+// Duplicating a MLU is as easy as copying all members
+cmsMLU* CMSEXPORT cmsMLUdup(const cmsMLU* mlu)
+{
+    cmsMLU* NewMlu = NULL;
+
+    // Duplicating a NULL obtains a NULL
+    if (mlu == NULL) return NULL;
+
+    NewMlu = cmsMLUalloc(mlu ->ContextID, mlu ->UsedEntries);
+    if (NewMlu == NULL) return NULL;
+
+    // Should never happen
+    if (NewMlu ->AllocatedEntries < mlu ->UsedEntries)
+        goto Error;
+
+    // Sanitize...
+    if (NewMlu ->Entries == NULL || mlu ->Entries == NULL)  goto Error;
+
+    memmove(NewMlu ->Entries, mlu ->Entries, mlu ->UsedEntries * sizeof(_cmsMLUentry));
+    NewMlu ->UsedEntries = mlu ->UsedEntries;
+
+    // The MLU may be empty
+    if (mlu ->PoolUsed == 0) {
+        NewMlu ->MemPool = NULL;
+    }
+    else {
+        // It is not empty
+        NewMlu ->MemPool = _cmsMalloc(mlu ->ContextID, mlu ->PoolUsed);
+        if (NewMlu ->MemPool == NULL) goto Error;
+    }
+
+    NewMlu ->PoolSize = mlu ->PoolUsed;
+
+    if (NewMlu ->MemPool == NULL || mlu ->MemPool == NULL) goto Error;
+
+    memmove(NewMlu ->MemPool, mlu->MemPool, mlu ->PoolUsed);
+    NewMlu ->PoolUsed = mlu ->PoolUsed;
+
+    return NewMlu;
+
+Error:
+
+    if (NewMlu != NULL) cmsMLUfree(NewMlu);
+    return NULL;
+}
+
+// Free any used memory
+void CMSEXPORT cmsMLUfree(cmsMLU* mlu)
+{
+    if (mlu) {
+
+        if (mlu -> Entries) _cmsFree(mlu ->ContextID, mlu->Entries);
+        if (mlu -> MemPool) _cmsFree(mlu ->ContextID, mlu->MemPool);
+
+        _cmsFree(mlu ->ContextID, mlu);
+    }
+}
+
+
+// The algorithm first searches for an exact match of country and language, if not found it uses
+// the Language. If none is found, first entry is used instead.
+static
+const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu,
+                              cmsUInt32Number *len,
+                              cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode,
+                              cmsUInt16Number* UsedLanguageCode, cmsUInt16Number* UsedCountryCode)
+{
+    int i;
+    int Best = -1;
+    _cmsMLUentry* v;
+
+    if (mlu == NULL) return NULL;
+
+    if (mlu -> AllocatedEntries <= 0) return NULL;
+
+    for (i=0; i < mlu ->UsedEntries; i++) {
+
+        v = mlu ->Entries + i;
+
+        if (v -> Language == LanguageCode) {
+
+            if (Best == -1) Best = i;
+
+            if (v -> Country == CountryCode) {
+
+                if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language;
+                if (UsedCountryCode  != NULL) *UsedCountryCode = v ->Country;
+
+                if (len != NULL) *len = v ->Len;
+
+                return (wchar_t*) ((cmsUInt8Number*) mlu ->MemPool + v -> StrW);        // Found exact match
+            }
+        }
+    }
+
+    // No string found. Return First one
+    if (Best == -1)
+        Best = 0;
+
+    v = mlu ->Entries + Best;
+
+    if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language;
+    if (UsedCountryCode  != NULL) *UsedCountryCode = v ->Country;
+
+    if (len != NULL) *len   = v ->Len;
+
+    return(wchar_t*) ((cmsUInt8Number*) mlu ->MemPool + v ->StrW);
+}
+
+
+// Obtain an ASCII representation of the wide string. Setting buffer to NULL returns the len
+cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu,
+                                       const char LanguageCode[3], const char CountryCode[3],
+                                       char* Buffer, cmsUInt32Number BufferSize)
+{
+    const wchar_t *Wide;
+    cmsUInt32Number  StrLen = 0;
+    cmsUInt32Number ASCIIlen, i;
+
+    cmsUInt16Number Lang  = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);
+    cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);
+
+    // Sanitize
+    if (mlu == NULL) return 0;
+
+    // Get WideChar
+    Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL);
+    if (Wide == NULL) return 0;
+
+    ASCIIlen = StrLen / sizeof(wchar_t);
+
+    // Maybe we want only to know the len?
+    if (Buffer == NULL) return ASCIIlen + 1; // Note the zero at the end
+
+    // No buffer size means no data
+    if (BufferSize <= 0) return 0;
+
+    // Some clipping may be required
+    if (BufferSize < ASCIIlen + 1)
+        ASCIIlen = BufferSize - 1;
+
+    // Precess each character
+    for (i=0; i < ASCIIlen; i++) {
+
+        if (Wide[i] == 0)
+            Buffer[i] = 0;
+        else
+            Buffer[i] = (char) Wide[i];
+    }
+
+    // We put a termination "\0"
+    Buffer[ASCIIlen] = 0;
+    return ASCIIlen + 1;
+}
+
+// Obtain a wide representation of the MLU, on depending on current locale settings
+cmsUInt32Number CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu,
+                                      const char LanguageCode[3], const char CountryCode[3],
+                                      wchar_t* Buffer, cmsUInt32Number BufferSize)
+{
+    const wchar_t *Wide;
+    cmsUInt32Number  StrLen = 0;
+
+    cmsUInt16Number Lang  = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);
+    cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);
+
+    // Sanitize
+    if (mlu == NULL) return 0;
+
+    Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL);
+    if (Wide == NULL) return 0;
+
+    // Maybe we want only to know the len?
+    if (Buffer == NULL) return StrLen + sizeof(wchar_t);
+
+  // No buffer size means no data
+    if (BufferSize <= 0) return 0;
+
+    // Some clipping may be required
+    if (BufferSize < StrLen + sizeof(wchar_t))
+        StrLen = BufferSize - + sizeof(wchar_t);
+
+    memmove(Buffer, Wide, StrLen);
+    Buffer[StrLen / sizeof(wchar_t)] = 0;
+
+    return StrLen + sizeof(wchar_t);
+}
+
+
+// Get also the language and country
+CMSAPI cmsBool CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu,
+                                              const char LanguageCode[3], const char CountryCode[3],
+                                              char ObtainedLanguage[3], char ObtainedCountry[3])
+{
+    const wchar_t *Wide;
+
+    cmsUInt16Number Lang  = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);
+    cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);
+    cmsUInt16Number ObtLang, ObtCode;
+
+    // Sanitize
+    if (mlu == NULL) return FALSE;
+
+    Wide = _cmsMLUgetWide(mlu, NULL, Lang, Cntry, &ObtLang, &ObtCode);
+    if (Wide == NULL) return FALSE;
+
+    // Get used language and code
+    *(cmsUInt16Number *)ObtainedLanguage = _cmsAdjustEndianess16(ObtLang);
+    *(cmsUInt16Number *)ObtainedCountry  = _cmsAdjustEndianess16(ObtCode);
+
+    ObtainedLanguage[2] = ObtainedCountry[2] = 0;
+    return TRUE;
+}
+
+
+
+// Get the number of translations in the MLU object
+cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu)
+{
+    if (mlu == NULL) return 0;
+    return mlu->UsedEntries;
+}
+
+// Get the language and country codes for a specific MLU index
+cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,
+                                          cmsUInt32Number idx,
+                                          char LanguageCode[3],
+                                          char CountryCode[3])
+{
+    _cmsMLUentry *entry;
+
+    if (mlu == NULL) return FALSE;
+
+    if (idx >= (cmsUInt32Number) mlu->UsedEntries) return FALSE;
+
+    entry = &mlu->Entries[idx];
+    
+    *(cmsUInt16Number *)LanguageCode = _cmsAdjustEndianess16(entry->Language);
+    *(cmsUInt16Number *)CountryCode  = _cmsAdjustEndianess16(entry->Country);
+
+    return TRUE;
+}
+
+
+// Named color lists --------------------------------------------------------------------------------------------
+
+// Grow the list to keep at least NumElements
+static
+cmsBool  GrowNamedColorList(cmsNAMEDCOLORLIST* v)
+{
+    cmsUInt32Number size;
+    _cmsNAMEDCOLOR * NewPtr;
+
+    if (v == NULL) return FALSE;
+
+    if (v ->Allocated == 0)
+        size = 64;   // Initial guess
+    else
+        size = v ->Allocated * 2;
+
+    // Keep a maximum color lists can grow, 100K entries seems reasonable
+    if (size > 1024*100) return FALSE;
+
+    NewPtr = (_cmsNAMEDCOLOR*) _cmsRealloc(v ->ContextID, v ->List, size * sizeof(_cmsNAMEDCOLOR));
+    if (NewPtr == NULL)
+        return FALSE;
+
+    v ->List      = NewPtr;
+    v ->Allocated = size;
+    return TRUE;
+}
+
+// Allocate a list for n elements
+cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, cmsUInt32Number n, cmsUInt32Number ColorantCount, const char* Prefix, const char* Suffix)
+{
+    cmsNAMEDCOLORLIST* v = (cmsNAMEDCOLORLIST*) _cmsMallocZero(ContextID, sizeof(cmsNAMEDCOLORLIST));
+
+    if (v == NULL) return NULL;
+
+    v ->List      = NULL;
+    v ->nColors   = 0;
+    v ->ContextID  = ContextID;
+
+    while (v -> Allocated < n)
+        GrowNamedColorList(v);
+
+    strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)-1);
+    strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)-1);
+    v->Prefix[32] = v->Suffix[32] = 0;
+
+    v -> ColorantCount = ColorantCount;
+
+    return v;
+}
+
+// Free a list
+void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v)
+{
+    if (v == NULL) return;
+    if (v ->List) _cmsFree(v ->ContextID, v ->List);
+    _cmsFree(v ->ContextID, v);
+}
+
+cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v)
+{
+    cmsNAMEDCOLORLIST* NewNC;
+
+    if (v == NULL) return NULL;
+
+    NewNC= cmsAllocNamedColorList(v ->ContextID, v -> nColors, v ->ColorantCount, v ->Prefix, v ->Suffix);
+    if (NewNC == NULL) return NULL;
+
+    // For really large tables we need this
+    while (NewNC ->Allocated < v ->Allocated)
+        GrowNamedColorList(NewNC);
+
+    memmove(NewNC ->Prefix, v ->Prefix, sizeof(v ->Prefix));
+    memmove(NewNC ->Suffix, v ->Suffix, sizeof(v ->Suffix));
+    NewNC ->ColorantCount = v ->ColorantCount;
+    memmove(NewNC->List, v ->List, v->nColors * sizeof(_cmsNAMEDCOLOR));
+    NewNC ->nColors = v ->nColors;
+    return NewNC;
+}
+
+
+// Append a color to a list. List pointer may change if reallocated
+cmsBool  CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* NamedColorList,
+                                       const char* Name,
+                                       cmsUInt16Number PCS[3], cmsUInt16Number Colorant[cmsMAXCHANNELS])
+{
+    cmsUInt32Number i;
+
+    if (NamedColorList == NULL) return FALSE;
+
+    if (NamedColorList ->nColors + 1 > NamedColorList ->Allocated) {
+        if (!GrowNamedColorList(NamedColorList)) return FALSE;
+    }
+
+    for (i=0; i < NamedColorList ->ColorantCount; i++)
+        NamedColorList ->List[NamedColorList ->nColors].DeviceColorant[i] = Colorant == NULL? 0 : Colorant[i];
+
+    for (i=0; i < 3; i++)
+        NamedColorList ->List[NamedColorList ->nColors].PCS[i] = PCS == NULL ? 0 : PCS[i];
+
+    if (Name != NULL) {
+
+        strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name, cmsMAX_PATH-1);
+        NamedColorList ->List[NamedColorList ->nColors].Name[cmsMAX_PATH-1] = 0;
+
+    }
+    else
+        NamedColorList ->List[NamedColorList ->nColors].Name[0] = 0;
+
+
+    NamedColorList ->nColors++;
+    return TRUE;
+}
+
+// Returns number of elements
+cmsUInt32Number CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* NamedColorList)
+{
+     if (NamedColorList == NULL) return 0;
+     return NamedColorList ->nColors;
+}
+
+// Info aboout a given color
+cmsBool  CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor,
+                                     char* Name,
+                                     char* Prefix,
+                                     char* Suffix,
+                                     cmsUInt16Number* PCS,
+                                     cmsUInt16Number* Colorant)
+{
+    if (NamedColorList == NULL) return FALSE;
+
+    if (nColor >= cmsNamedColorCount(NamedColorList)) return FALSE;
+
+    if (Name) strcpy(Name, NamedColorList->List[nColor].Name);
+    if (Prefix) strcpy(Prefix, NamedColorList->Prefix);
+    if (Suffix) strcpy(Suffix, NamedColorList->Suffix);
+    if (PCS)
+        memmove(PCS, NamedColorList ->List[nColor].PCS, 3*sizeof(cmsUInt16Number));
+
+    if (Colorant)
+        memmove(Colorant, NamedColorList ->List[nColor].DeviceColorant,
+                                sizeof(cmsUInt16Number) * NamedColorList ->ColorantCount);
+
+
+    return TRUE;
+}
+
+// Search for a given color name (no prefix or suffix)
+cmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* NamedColorList, const char* Name)
+{
+    int i, n;
+
+    if (NamedColorList == NULL) return -1;
+    n = cmsNamedColorCount(NamedColorList);
+    for (i=0; i < n; i++) {
+        if (cmsstrcasecmp(Name,  NamedColorList->List[i].Name) == 0)
+            return i;
+    }
+
+    return -1;
+}
+
+// MPE support -----------------------------------------------------------------------------------------------------------------
+
+static
+void FreeNamedColorList(cmsStage* mpe)
+{
+    cmsNAMEDCOLORLIST* List = (cmsNAMEDCOLORLIST*) mpe ->Data;
+    cmsFreeNamedColorList(List);
+}
+
+static
+void* DupNamedColorList(cmsStage* mpe)
+{
+    cmsNAMEDCOLORLIST* List = (cmsNAMEDCOLORLIST*) mpe ->Data;
+    return cmsDupNamedColorList(List);
+}
+
+static
+void EvalNamedColorPCS(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)
+{
+    cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data;
+    cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0);
+
+    if (index >= NamedColorList-> nColors) {
+        cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range; ignored", index);
+    }
+    else {
+
+            // Named color always uses Lab
+            Out[0] = (cmsFloat32Number) (NamedColorList->List[index].PCS[0] / 65535.0);
+            Out[1] = (cmsFloat32Number) (NamedColorList->List[index].PCS[1] / 65535.0);
+            Out[2] = (cmsFloat32Number) (NamedColorList->List[index].PCS[2] / 65535.0);
+    }
+}
+
+static
+void EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)
+{
+    cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data;
+    cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0);
+    cmsUInt32Number j;
+
+    if (index >= NamedColorList-> nColors) {
+        cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range; ignored", index);
+    }
+    else {
+        for (j=0; j < NamedColorList ->ColorantCount; j++)
+            Out[j] = (cmsFloat32Number) (NamedColorList->List[index].DeviceColorant[j] / 65535.0);
+    }
+}
+
+
+// Named color lookup element
+cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS)
+{
+    return _cmsStageAllocPlaceholder(NamedColorList ->ContextID,
+                                   cmsSigNamedColorElemType,
+                                   1, UsePCS ? 3 : NamedColorList ->ColorantCount,
+                                   UsePCS ? EvalNamedColorPCS : EvalNamedColor,
+                                   DupNamedColorList,
+                                   FreeNamedColorList,
+                                   cmsDupNamedColorList(NamedColorList));
+
+}
+
+
+// Retrieve the named color list from a transform. Should be first element in the LUT
+cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform)
+{
+    _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform;
+    cmsStage* mpe  = v ->Lut->Elements;
+
+    if (mpe ->Type != cmsSigNamedColorElemType) return NULL;
+    return (cmsNAMEDCOLORLIST*) mpe ->Data;
+}
+
+
+// Profile sequence description routines -------------------------------------------------------------------------------------
+
+cmsSEQ* CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n)
+{
+    cmsSEQ* Seq;
+    cmsUInt32Number i;
+
+    if (n == 0) return NULL;
+
+    // In a absolutely arbitrary way, I hereby decide to allow a maxim of 255 profiles linked
+    // in a devicelink. It makes not sense anyway and may be used for exploits, so let's close the door!
+    if (n > 255) return NULL;
+
+    Seq = (cmsSEQ*) _cmsMallocZero(ContextID, sizeof(cmsSEQ));
+    if (Seq == NULL) return NULL;
+
+    Seq -> ContextID = ContextID;
+    Seq -> seq      = (cmsPSEQDESC*) _cmsCalloc(ContextID, n, sizeof(cmsPSEQDESC));
+    Seq -> n        = n;
+
+    if (Seq -> seq == NULL) {
+        _cmsFree(ContextID, Seq);
+        return NULL;
+    }
+
+    for (i=0; i < n; i++) {
+        Seq -> seq[i].Manufacturer = NULL;
+        Seq -> seq[i].Model        = NULL;
+        Seq -> seq[i].Description  = NULL;
+    }
+
+    return Seq;
+}
+
+void CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq)
+{
+    cmsUInt32Number i;
+
+    for (i=0; i < pseq ->n; i++) {
+        if (pseq ->seq[i].Manufacturer != NULL) cmsMLUfree(pseq ->seq[i].Manufacturer);
+        if (pseq ->seq[i].Model != NULL) cmsMLUfree(pseq ->seq[i].Model);
+        if (pseq ->seq[i].Description != NULL) cmsMLUfree(pseq ->seq[i].Description);
+    }
+
+    if (pseq ->seq != NULL) _cmsFree(pseq ->ContextID, pseq ->seq);
+    _cmsFree(pseq -> ContextID, pseq);
+}
+
+cmsSEQ* CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq)
+{
+    cmsSEQ *NewSeq;
+    cmsUInt32Number i;
+
+    if (pseq == NULL)
+        return NULL;
+
+    NewSeq = (cmsSEQ*) _cmsMalloc(pseq -> ContextID, sizeof(cmsSEQ));
+    if (NewSeq == NULL) return NULL;
+
+
+    NewSeq -> seq      = (cmsPSEQDESC*) _cmsCalloc(pseq ->ContextID, pseq ->n, sizeof(cmsPSEQDESC));
+    if (NewSeq ->seq == NULL) goto Error;
+
+    NewSeq -> ContextID = pseq ->ContextID;
+    NewSeq -> n        = pseq ->n;
+
+    for (i=0; i < pseq->n; i++) {
+
+        memmove(&NewSeq ->seq[i].attributes, &pseq ->seq[i].attributes, sizeof(cmsUInt64Number));
+
+        NewSeq ->seq[i].deviceMfg   = pseq ->seq[i].deviceMfg;
+        NewSeq ->seq[i].deviceModel = pseq ->seq[i].deviceModel;
+        memmove(&NewSeq ->seq[i].ProfileID, &pseq ->seq[i].ProfileID, sizeof(cmsProfileID));
+        NewSeq ->seq[i].technology  = pseq ->seq[i].technology;
+
+        NewSeq ->seq[i].Manufacturer = cmsMLUdup(pseq ->seq[i].Manufacturer);
+        NewSeq ->seq[i].Model        = cmsMLUdup(pseq ->seq[i].Model);
+        NewSeq ->seq[i].Description  = cmsMLUdup(pseq ->seq[i].Description);
+
+    }
+
+    return NewSeq;
+
+Error:
+
+    cmsFreeProfileSequenceDescription(NewSeq);
+    return NULL;
+}
+
+// Dictionaries --------------------------------------------------------------------------------------------------------
+
+// Dictionaries are just very simple linked lists
+
+
+typedef struct _cmsDICT_struct {
+    cmsDICTentry* head;
+    cmsContext ContextID;
+} _cmsDICT;
+
+
+// Allocate an empty dictionary
+cmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID)
+{
+    _cmsDICT* dict = (_cmsDICT*) _cmsMallocZero(ContextID, sizeof(_cmsDICT));
+    if (dict == NULL) return NULL;
+
+    dict ->ContextID = ContextID;
+    return (cmsHANDLE) dict;
+
+}
+
+// Dispose resources
+void CMSEXPORT cmsDictFree(cmsHANDLE hDict)
+{
+    _cmsDICT* dict = (_cmsDICT*) hDict;
+    cmsDICTentry *entry, *next;
+
+    _cmsAssert(dict != NULL);
+
+    // Walk the list freeing all nodes
+    entry = dict ->head;
+    while (entry != NULL) {
+
+            if (entry ->DisplayName  != NULL) cmsMLUfree(entry ->DisplayName);
+            if (entry ->DisplayValue != NULL) cmsMLUfree(entry ->DisplayValue);
+            if (entry ->Name != NULL) _cmsFree(dict ->ContextID, entry -> Name);
+            if (entry ->Value != NULL) _cmsFree(dict ->ContextID, entry -> Value);
+
+            // Don't fall in the habitual trap...
+            next = entry ->Next;
+            _cmsFree(dict ->ContextID, entry);
+
+            entry = next;
+    }
+
+    _cmsFree(dict ->ContextID, dict);
+}
+
+
+// Duplicate a wide char string
+static
+wchar_t* DupWcs(cmsContext ContextID, const wchar_t* ptr)
+{
+    if (ptr == NULL) return NULL;
+    return (wchar_t*) _cmsDupMem(ContextID, ptr, (mywcslen(ptr) + 1) * sizeof(wchar_t));
+}
+
+// Add a new entry to the linked list
+cmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue)
+{
+    _cmsDICT* dict = (_cmsDICT*) hDict;
+    cmsDICTentry *entry;
+
+    _cmsAssert(dict != NULL);
+    _cmsAssert(Name != NULL);
+
+    entry = (cmsDICTentry*) _cmsMallocZero(dict ->ContextID, sizeof(cmsDICTentry));
+    if (entry == NULL) return FALSE;
+
+    entry ->DisplayName  = cmsMLUdup(DisplayName);
+    entry ->DisplayValue = cmsMLUdup(DisplayValue);
+    entry ->Name         = DupWcs(dict ->ContextID, Name);
+    entry ->Value        = DupWcs(dict ->ContextID, Value);
+
+    entry ->Next = dict ->head;
+    dict ->head = entry;
+
+    return TRUE;
+}
+
+
+// Duplicates an existing dictionary
+cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict)
+{
+    _cmsDICT* old_dict = (_cmsDICT*) hDict;
+    cmsHANDLE hNew;
+    cmsDICTentry *entry;
+
+    _cmsAssert(old_dict != NULL);
+
+    hNew  = cmsDictAlloc(old_dict ->ContextID);
+    if (hNew == NULL) return NULL;
+
+    // Walk the list freeing all nodes
+    entry = old_dict ->head;
+    while (entry != NULL) {
+
+        if (!cmsDictAddEntry(hNew, entry ->Name, entry ->Value, entry ->DisplayName, entry ->DisplayValue)) {
+
+            cmsDictFree(hNew);
+            return NULL;
+        }
+
+        entry = entry -> Next;
+    }
+
+    return hNew;
+}
+
+// Get a pointer to the linked list
+const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict)
+{
+    _cmsDICT* dict = (_cmsDICT*) hDict;
+
+    if (dict == NULL) return NULL;
+    return dict ->head;
+}
+
+// Helper For external languages
+const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e)
+{
+     if (e == NULL) return NULL;
+     return e ->Next;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsopt.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsopt.c
new file mode 100644
index 0000000..f885ef3
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsopt.c
@@ -0,0 +1,1795 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2011 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+//----------------------------------------------------------------------------------
+
+// Optimization for 8 bits, Shaper-CLUT (3 inputs only)
+typedef struct {
+
+    cmsContext ContextID;
+
+    const cmsInterpParams* p;   // Tetrahedrical interpolation parameters. This is a not-owned pointer.
+
+    cmsUInt16Number rx[256], ry[256], rz[256];
+    cmsUInt32Number X0[256], Y0[256], Z0[256];  // Precomputed nodes and offsets for 8-bit input data
+
+
+} Prelin8Data;
+
+
+// Generic optimization for 16 bits Shaper-CLUT-Shaper (any inputs)
+typedef struct {
+
+    cmsContext ContextID;
+
+    // Number of channels
+    int nInputs;
+    int nOutputs;
+
+    _cmsInterpFn16 EvalCurveIn16[MAX_INPUT_DIMENSIONS];       // The maximum number of input channels is known in advance
+    cmsInterpParams*  ParamsCurveIn16[MAX_INPUT_DIMENSIONS];
+
+    _cmsInterpFn16 EvalCLUT;            // The evaluator for 3D grid
+    const cmsInterpParams* CLUTparams;  // (not-owned pointer)
+
+
+    _cmsInterpFn16* EvalCurveOut16;       // Points to an array of curve evaluators in 16 bits (not-owned pointer)
+    cmsInterpParams**  ParamsCurveOut16;  // Points to an array of references to interpolation params (not-owned pointer)
+
+
+} Prelin16Data;
+
+
+// Optimization for matrix-shaper in 8 bits. Numbers are operated in n.14 signed, tables are stored in 1.14 fixed
+
+typedef cmsInt32Number cmsS1Fixed14Number;   // Note that this may hold more than 16 bits!
+
+#define DOUBLE_TO_1FIXED14(x) ((cmsS1Fixed14Number) floor((x) * 16384.0 + 0.5))
+
+typedef struct {
+
+    cmsContext ContextID;
+
+    cmsS1Fixed14Number Shaper1R[256];  // from 0..255 to 1.14  (0.0...1.0)
+    cmsS1Fixed14Number Shaper1G[256];
+    cmsS1Fixed14Number Shaper1B[256];
+
+    cmsS1Fixed14Number Mat[3][3];     // n.14 to n.14 (needs a saturation after that)
+    cmsS1Fixed14Number Off[3];
+
+    cmsUInt16Number Shaper2R[16385];    // 1.14 to 0..255
+    cmsUInt16Number Shaper2G[16385];
+    cmsUInt16Number Shaper2B[16385];
+
+} MatShaper8Data;
+
+// Curves, optimization is shared between 8 and 16 bits
+typedef struct {
+
+    cmsContext ContextID;
+
+    int nCurves;                  // Number of curves
+    int nElements;                // Elements in curves
+    cmsUInt16Number** Curves;     // Points to a dynamically  allocated array
+
+} Curves16Data;
+
+
+// Simple optimizations ----------------------------------------------------------------------------------------------------------
+
+
+// Remove an element in linked chain
+static
+void _RemoveElement(cmsStage** head)
+{
+    cmsStage* mpe = *head;
+    cmsStage* next = mpe ->Next;
+    *head = next;
+    cmsStageFree(mpe);
+}
+
+// Remove all identities in chain. Note that pt actually is a double pointer to the element that holds the pointer.
+static
+cmsBool _Remove1Op(cmsPipeline* Lut, cmsStageSignature UnaryOp)
+{
+    cmsStage** pt = &Lut ->Elements;
+    cmsBool AnyOpt = FALSE;
+
+    while (*pt != NULL) {
+
+        if ((*pt) ->Implements == UnaryOp) {
+            _RemoveElement(pt);
+            AnyOpt = TRUE;
+        }
+        else
+            pt = &((*pt) -> Next);
+    }
+
+    return AnyOpt;
+}
+
+// Same, but only if two adjacent elements are found
+static
+cmsBool _Remove2Op(cmsPipeline* Lut, cmsStageSignature Op1, cmsStageSignature Op2)
+{
+    cmsStage** pt1;
+    cmsStage** pt2;
+    cmsBool AnyOpt = FALSE;
+
+    pt1 = &Lut ->Elements;
+    if (*pt1 == NULL) return AnyOpt;
+
+    while (*pt1 != NULL) {
+
+        pt2 = &((*pt1) -> Next);
+        if (*pt2 == NULL) return AnyOpt;
+
+        if ((*pt1) ->Implements == Op1 && (*pt2) ->Implements == Op2) {
+            _RemoveElement(pt2);
+            _RemoveElement(pt1);
+            AnyOpt = TRUE;
+        }
+        else
+            pt1 = &((*pt1) -> Next);
+    }
+
+    return AnyOpt;
+}
+
+// Preoptimize just gets rif of no-ops coming paired. Conversion from v2 to v4 followed
+// by a v4 to v2 and vice-versa. The elements are then discarded.
+static
+cmsBool PreOptimize(cmsPipeline* Lut)
+{
+    cmsBool AnyOpt = FALSE, Opt;
+
+    do {
+
+        Opt = FALSE;
+
+        // Remove all identities
+        Opt |= _Remove1Op(Lut, cmsSigIdentityElemType);
+
+        // Remove XYZ2Lab followed by Lab2XYZ
+        Opt |= _Remove2Op(Lut, cmsSigXYZ2LabElemType, cmsSigLab2XYZElemType);
+
+        // Remove Lab2XYZ followed by XYZ2Lab
+        Opt |= _Remove2Op(Lut, cmsSigLab2XYZElemType, cmsSigXYZ2LabElemType);
+
+        // Remove V4 to V2 followed by V2 to V4
+        Opt |= _Remove2Op(Lut, cmsSigLabV4toV2, cmsSigLabV2toV4);
+
+        // Remove V2 to V4 followed by V4 to V2
+        Opt |= _Remove2Op(Lut, cmsSigLabV2toV4, cmsSigLabV4toV2);
+
+        // Remove float pcs Lab conversions
+        Opt |= _Remove2Op(Lut, cmsSigLab2FloatPCS, cmsSigFloatPCS2Lab);
+
+        // Remove float pcs Lab conversions
+        Opt |= _Remove2Op(Lut, cmsSigXYZ2FloatPCS, cmsSigFloatPCS2XYZ);
+
+        if (Opt) AnyOpt = TRUE;
+
+    } while (Opt);
+
+    return AnyOpt;
+}
+
+static
+void Eval16nop1D(register const cmsUInt16Number Input[],
+                 register cmsUInt16Number Output[],
+                 register const struct _cms_interp_struc* p)
+{
+    Output[0] = Input[0];
+
+    cmsUNUSED_PARAMETER(p);
+}
+
+static
+void PrelinEval16(register const cmsUInt16Number Input[],
+                  register cmsUInt16Number Output[],
+                  register const void* D)
+{
+    Prelin16Data* p16 = (Prelin16Data*) D;
+    cmsUInt16Number  StageABC[MAX_INPUT_DIMENSIONS];
+    cmsUInt16Number  StageDEF[cmsMAXCHANNELS];
+    int i;
+
+    for (i=0; i < p16 ->nInputs; i++) {
+
+        p16 ->EvalCurveIn16[i](&Input[i], &StageABC[i], p16 ->ParamsCurveIn16[i]);
+    }
+
+    p16 ->EvalCLUT(StageABC, StageDEF, p16 ->CLUTparams);
+
+    for (i=0; i < p16 ->nOutputs; i++) {
+
+        p16 ->EvalCurveOut16[i](&StageDEF[i], &Output[i], p16 ->ParamsCurveOut16[i]);
+    }
+}
+
+
+static
+void PrelinOpt16free(cmsContext ContextID, void* ptr)
+{
+    Prelin16Data* p16 = (Prelin16Data*) ptr;
+
+    _cmsFree(ContextID, p16 ->EvalCurveOut16);
+    _cmsFree(ContextID, p16 ->ParamsCurveOut16);
+
+    _cmsFree(ContextID, p16);
+}
+
+static
+void* Prelin16dup(cmsContext ContextID, const void* ptr)
+{
+    Prelin16Data* p16 = (Prelin16Data*) ptr;
+    Prelin16Data* Duped = _cmsDupMem(ContextID, p16, sizeof(Prelin16Data));
+
+    if (Duped == NULL) return NULL;
+
+    Duped ->EvalCurveOut16   = (_cmsInterpFn16*)_cmsDupMem(ContextID, p16 ->EvalCurveOut16, p16 ->nOutputs * sizeof(_cmsInterpFn16));
+    Duped ->ParamsCurveOut16 = (cmsInterpParams**)_cmsDupMem(ContextID, p16 ->ParamsCurveOut16, p16 ->nOutputs * sizeof(cmsInterpParams* ));
+
+    return Duped;
+}
+
+
+static
+Prelin16Data* PrelinOpt16alloc(cmsContext ContextID,
+                               const cmsInterpParams* ColorMap,
+                               int nInputs, cmsToneCurve** In,
+                               int nOutputs, cmsToneCurve** Out )
+{
+    int i;
+    Prelin16Data* p16 = _cmsMallocZero(ContextID, sizeof(Prelin16Data));
+    if (p16 == NULL) return NULL;
+
+    p16 ->nInputs = nInputs;
+    p16 -> nOutputs = nOutputs;
+
+
+    for (i=0; i < nInputs; i++) {
+
+        if (In == NULL) {
+            p16 -> ParamsCurveIn16[i] = NULL;
+            p16 -> EvalCurveIn16[i] = Eval16nop1D;
+
+        }
+        else {
+            p16 -> ParamsCurveIn16[i] = In[i] ->InterpParams;
+            p16 -> EvalCurveIn16[i] = p16 ->ParamsCurveIn16[i]->Interpolation.Lerp16;
+        }
+    }
+
+    p16 ->CLUTparams = ColorMap;
+    p16 ->EvalCLUT   = ColorMap ->Interpolation.Lerp16;
+
+
+    p16 -> EvalCurveOut16 = (_cmsInterpFn16*) _cmsCalloc(ContextID, nOutputs, sizeof(_cmsInterpFn16));
+    p16 -> ParamsCurveOut16 = (cmsInterpParams**) _cmsCalloc(ContextID, nOutputs, sizeof(cmsInterpParams* ));
+
+    for (i=0; i < nOutputs; i++) {
+
+        if (Out == NULL) {
+            p16 ->ParamsCurveOut16[i] = NULL;
+            p16 -> EvalCurveOut16[i] = Eval16nop1D;
+        }
+        else {
+
+            p16 ->ParamsCurveOut16[i] = Out[i] ->InterpParams;
+            p16 -> EvalCurveOut16[i] = p16 ->ParamsCurveOut16[i]->Interpolation.Lerp16;
+        }
+    }
+
+    return p16;
+}
+
+
+
+// Resampling ---------------------------------------------------------------------------------
+
+#define PRELINEARIZATION_POINTS 4096
+
+// Sampler implemented by another LUT. This is a clean way to precalculate the devicelink 3D CLUT for
+// almost any transform. We use floating point precision and then convert from floating point to 16 bits.
+static
+int XFormSampler16(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+    cmsPipeline* Lut = (cmsPipeline*) Cargo;
+    cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS];
+    cmsUInt32Number i;
+
+    _cmsAssert(Lut -> InputChannels < cmsMAXCHANNELS);
+    _cmsAssert(Lut -> OutputChannels < cmsMAXCHANNELS);
+
+    // From 16 bit to floating point
+    for (i=0; i < Lut ->InputChannels; i++)
+        InFloat[i] = (cmsFloat32Number) (In[i] / 65535.0);
+
+    // Evaluate in floating point
+    cmsPipelineEvalFloat(InFloat, OutFloat, Lut);
+
+    // Back to 16 bits representation
+    for (i=0; i < Lut ->OutputChannels; i++)
+        Out[i] = _cmsQuickSaturateWord(OutFloat[i] * 65535.0);
+
+    // Always succeed
+    return TRUE;
+}
+
+// Try to see if the curves of a given MPE are linear
+static
+cmsBool AllCurvesAreLinear(cmsStage* mpe)
+{
+    cmsToneCurve** Curves;
+    cmsUInt32Number i, n;
+
+    Curves = _cmsStageGetPtrToCurveSet(mpe);
+    if (Curves == NULL) return FALSE;
+
+    n = cmsStageOutputChannels(mpe);
+
+    for (i=0; i < n; i++) {
+        if (!cmsIsToneCurveLinear(Curves[i])) return FALSE;
+    }
+
+    return TRUE;
+}
+
+// This function replaces a specific node placed in "At" by the "Value" numbers. Its purpose
+// is to fix scum dot on broken profiles/transforms. Works on 1, 3 and 4 channels
+static
+cmsBool  PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[],
+                  int nChannelsOut, int nChannelsIn)
+{
+    _cmsStageCLutData* Grid = (_cmsStageCLutData*) CLUT ->Data;
+    cmsInterpParams* p16  = Grid ->Params;
+    cmsFloat64Number px, py, pz, pw;
+    int        x0, y0, z0, w0;
+    int        i, index;
+
+    if (CLUT -> Type != cmsSigCLutElemType) {
+        cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) Attempt to PatchLUT on non-lut stage");
+        return FALSE;
+    }
+
+	if (nChannelsIn != 1 && nChannelsIn != 3 && nChannelsIn != 4) {
+		cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) %d Channels are not supported on PatchLUT", nChannelsIn);
+        return FALSE;
+	}
+    if (nChannelsIn == 4) {
+
+        px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0;
+        py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0;
+        pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0;
+        pw = ((cmsFloat64Number) At[3] * (p16->Domain[3])) / 65535.0;
+
+        x0 = (int) floor(px);
+        y0 = (int) floor(py);
+        z0 = (int) floor(pz);
+        w0 = (int) floor(pw);
+
+        if (((px - x0) != 0) ||
+            ((py - y0) != 0) ||
+            ((pz - z0) != 0) ||
+            ((pw - w0) != 0)) return FALSE; // Not on exact node
+
+        index = p16 -> opta[3] * x0 +
+                p16 -> opta[2] * y0 +
+                p16 -> opta[1] * z0 +
+                p16 -> opta[0] * w0;
+    }
+    else
+        if (nChannelsIn == 3) {
+
+            px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0;
+            py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0;
+            pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0;
+           
+            x0 = (int) floor(px);
+            y0 = (int) floor(py);
+            z0 = (int) floor(pz);
+           
+            if (((px - x0) != 0) ||
+                ((py - y0) != 0) ||
+                ((pz - z0) != 0)) return FALSE;  // Not on exact node
+
+            index = p16 -> opta[2] * x0 +
+                    p16 -> opta[1] * y0 +
+                    p16 -> opta[0] * z0;
+        }
+        else
+            if (nChannelsIn == 1) {
+
+                px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0;
+                
+                x0 = (int) floor(px);
+                
+                if (((px - x0) != 0)) return FALSE; // Not on exact node
+
+                index = p16 -> opta[0] * x0;
+            }
+            else {
+                cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) %d Channels are not supported on PatchLUT", nChannelsIn);
+                return FALSE;
+            }
+
+            for (i=0; i < nChannelsOut; i++)
+                Grid -> Tab.T[index + i] = Value[i];
+
+            return TRUE;
+}
+
+// Auxiliar, to see if two values are equal or very different
+static
+cmsBool WhitesAreEqual(int n, cmsUInt16Number White1[], cmsUInt16Number White2[] )
+{
+    int i;
+
+    for (i=0; i < n; i++) {
+
+        if (abs(White1[i] - White2[i]) > 0xf000) return TRUE;  // Values are so extremly different that the fixup should be avoided
+        if (White1[i] != White2[i]) return FALSE;
+    }
+    return TRUE;
+}
+
+
+// Locate the node for the white point and fix it to pure white in order to avoid scum dot.
+static
+cmsBool FixWhiteMisalignment(cmsPipeline* Lut, cmsColorSpaceSignature EntryColorSpace, cmsColorSpaceSignature ExitColorSpace)
+{
+    cmsUInt16Number *WhitePointIn, *WhitePointOut;
+    cmsUInt16Number  WhiteIn[cmsMAXCHANNELS], WhiteOut[cmsMAXCHANNELS], ObtainedOut[cmsMAXCHANNELS];
+    cmsUInt32Number i, nOuts, nIns;
+    cmsStage *PreLin = NULL, *CLUT = NULL, *PostLin = NULL;
+
+    if (!_cmsEndPointsBySpace(EntryColorSpace,
+        &WhitePointIn, NULL, &nIns)) return FALSE;
+
+    if (!_cmsEndPointsBySpace(ExitColorSpace,
+        &WhitePointOut, NULL, &nOuts)) return FALSE;
+
+    // It needs to be fixed?
+    if (Lut ->InputChannels != nIns) return FALSE;
+    if (Lut ->OutputChannels != nOuts) return FALSE;
+
+    cmsPipelineEval16(WhitePointIn, ObtainedOut, Lut);
+
+    if (WhitesAreEqual(nOuts, WhitePointOut, ObtainedOut)) return TRUE; // whites already match
+
+    // Check if the LUT comes as Prelin, CLUT or Postlin. We allow all combinations
+    if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &PreLin, &CLUT, &PostLin))
+        if (!cmsPipelineCheckAndRetreiveStages(Lut, 2, cmsSigCurveSetElemType, cmsSigCLutElemType, &PreLin, &CLUT))
+            if (!cmsPipelineCheckAndRetreiveStages(Lut, 2, cmsSigCLutElemType, cmsSigCurveSetElemType, &CLUT, &PostLin))
+                if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCLutElemType, &CLUT))
+                    return FALSE;
+
+    // We need to interpolate white points of both, pre and post curves
+    if (PreLin) {
+
+        cmsToneCurve** Curves = _cmsStageGetPtrToCurveSet(PreLin);
+
+        for (i=0; i < nIns; i++) {
+            WhiteIn[i] = cmsEvalToneCurve16(Curves[i], WhitePointIn[i]);
+        }
+    }
+    else {
+        for (i=0; i < nIns; i++)
+            WhiteIn[i] = WhitePointIn[i];
+    }
+
+    // If any post-linearization, we need to find how is represented white before the curve, do
+    // a reverse interpolation in this case.
+    if (PostLin) {
+
+        cmsToneCurve** Curves = _cmsStageGetPtrToCurveSet(PostLin);
+
+        for (i=0; i < nOuts; i++) {
+
+            cmsToneCurve* InversePostLin = cmsReverseToneCurve(Curves[i]);
+            if (InversePostLin == NULL) {
+                WhiteOut[i] = WhitePointOut[i];    
+
+            } else {
+
+                WhiteOut[i] = cmsEvalToneCurve16(InversePostLin, WhitePointOut[i]);
+                cmsFreeToneCurve(InversePostLin);
+            }
+        }
+    }
+    else {
+        for (i=0; i < nOuts; i++)
+            WhiteOut[i] = WhitePointOut[i];
+    }
+
+    // Ok, proceed with patching. May fail and we don't care if it fails
+    PatchLUT(CLUT, WhiteIn, WhiteOut, nOuts, nIns);
+
+    return TRUE;
+}
+
+// -----------------------------------------------------------------------------------------------------------------------------------------------
+// This function creates simple LUT from complex ones. The generated LUT has an optional set of
+// prelinearization curves, a CLUT of nGridPoints and optional postlinearization tables.
+// These curves have to exist in the original LUT in order to be used in the simplified output.
+// Caller may also use the flags to allow this feature.
+// LUTS with all curves will be simplified to a single curve. Parametric curves are lost.
+// This function should be used on 16-bits LUTS only, as floating point losses precision when simplified
+// -----------------------------------------------------------------------------------------------------------------------------------------------
+
+static
+cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
+{
+    cmsPipeline* Src = NULL;
+    cmsPipeline* Dest = NULL;
+    cmsStage* mpe;
+    cmsStage* CLUT;
+    cmsStage *KeepPreLin = NULL, *KeepPostLin = NULL;
+    int nGridPoints;
+    cmsColorSpaceSignature ColorSpace, OutputColorSpace;
+    cmsStage *NewPreLin = NULL;
+    cmsStage *NewPostLin = NULL;
+    _cmsStageCLutData* DataCLUT;
+    cmsToneCurve** DataSetIn;
+    cmsToneCurve** DataSetOut;
+    Prelin16Data* p16;
+
+    // This is a loosy optimization! does not apply in floating-point cases
+    if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;
+
+    ColorSpace       = _cmsICCcolorSpace(T_COLORSPACE(*InputFormat));
+    OutputColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*OutputFormat));
+    nGridPoints      = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags);
+
+    // For empty LUTs, 2 points are enough
+    if (cmsPipelineStageCount(*Lut) == 0)
+        nGridPoints = 2;
+
+    Src = *Lut;
+
+    // Named color pipelines cannot be optimized either
+    for (mpe = cmsPipelineGetPtrToFirstStage(Src);
+        mpe != NULL;
+        mpe = cmsStageNext(mpe)) {
+            if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE;
+    }
+
+    // Allocate an empty LUT
+    Dest =  cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels);
+    if (!Dest) return FALSE;
+
+    // Prelinearization tables are kept unless indicated by flags
+    if (*dwFlags & cmsFLAGS_CLUT_PRE_LINEARIZATION) {
+
+        // Get a pointer to the prelinearization element
+        cmsStage* PreLin = cmsPipelineGetPtrToFirstStage(Src);
+
+        // Check if suitable
+        if (PreLin ->Type == cmsSigCurveSetElemType) {
+
+            // Maybe this is a linear tram, so we can avoid the whole stuff
+            if (!AllCurvesAreLinear(PreLin)) {
+
+                // All seems ok, proceed.
+                NewPreLin = cmsStageDup(PreLin);
+                if(!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, NewPreLin))
+                    goto Error;
+
+                // Remove prelinearization. Since we have duplicated the curve
+                // in destination LUT, the sampling shoud be applied after this stage.
+                cmsPipelineUnlinkStage(Src, cmsAT_BEGIN, &KeepPreLin);
+            }
+        }
+    }
+
+    // Allocate the CLUT
+    CLUT = cmsStageAllocCLut16bit(Src ->ContextID, nGridPoints, Src ->InputChannels, Src->OutputChannels, NULL);
+    if (CLUT == NULL) return FALSE;
+
+    // Add the CLUT to the destination LUT
+    if (!cmsPipelineInsertStage(Dest, cmsAT_END, CLUT)) {
+        goto Error;
+    }
+
+    // Postlinearization tables are kept unless indicated by flags
+    if (*dwFlags & cmsFLAGS_CLUT_POST_LINEARIZATION) {
+
+        // Get a pointer to the postlinearization if present
+        cmsStage* PostLin = cmsPipelineGetPtrToLastStage(Src);
+
+        // Check if suitable
+        if (cmsStageType(PostLin) == cmsSigCurveSetElemType) {
+
+            // Maybe this is a linear tram, so we can avoid the whole stuff
+            if (!AllCurvesAreLinear(PostLin)) {
+
+                // All seems ok, proceed.
+                NewPostLin = cmsStageDup(PostLin);
+                if (!cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin))
+                    goto Error;
+
+                // In destination LUT, the sampling shoud be applied after this stage.
+                cmsPipelineUnlinkStage(Src, cmsAT_END, &KeepPostLin);
+            }
+        }
+    }
+
+    // Now its time to do the sampling. We have to ignore pre/post linearization
+    // The source LUT whithout pre/post curves is passed as parameter.
+    if (!cmsStageSampleCLut16bit(CLUT, XFormSampler16, (void*) Src, 0)) {
+Error:
+        // Ops, something went wrong, Restore stages
+        if (KeepPreLin != NULL) {
+            if (!cmsPipelineInsertStage(Src, cmsAT_BEGIN, KeepPreLin)) {
+                _cmsAssert(0); // This never happens
+            }
+        }
+        if (KeepPostLin != NULL) {
+            if (!cmsPipelineInsertStage(Src, cmsAT_END,   KeepPostLin)) {
+                _cmsAssert(0); // This never happens
+            }
+        }
+        cmsPipelineFree(Dest);
+        return FALSE;
+    }
+
+    // Done.
+
+    if (KeepPreLin != NULL) cmsStageFree(KeepPreLin);
+    if (KeepPostLin != NULL) cmsStageFree(KeepPostLin);
+    cmsPipelineFree(Src);
+
+    DataCLUT = (_cmsStageCLutData*) CLUT ->Data;
+
+    if (NewPreLin == NULL) DataSetIn = NULL;
+    else DataSetIn = ((_cmsStageToneCurvesData*) NewPreLin ->Data) ->TheCurves;
+
+    if (NewPostLin == NULL) DataSetOut = NULL;
+    else  DataSetOut = ((_cmsStageToneCurvesData*) NewPostLin ->Data) ->TheCurves;
+
+
+    if (DataSetIn == NULL && DataSetOut == NULL) {
+
+        _cmsPipelineSetOptimizationParameters(Dest, (_cmsOPTeval16Fn) DataCLUT->Params->Interpolation.Lerp16, DataCLUT->Params, NULL, NULL);
+    }
+    else {
+
+        p16 = PrelinOpt16alloc(Dest ->ContextID,
+            DataCLUT ->Params,
+            Dest ->InputChannels,
+            DataSetIn,
+            Dest ->OutputChannels,
+            DataSetOut);
+
+        _cmsPipelineSetOptimizationParameters(Dest, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup);
+    }
+
+
+    // Don't fix white on absolute colorimetric
+    if (Intent == INTENT_ABSOLUTE_COLORIMETRIC)
+        *dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP;
+
+    if (!(*dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) {
+
+        FixWhiteMisalignment(Dest, ColorSpace, OutputColorSpace);
+    }
+
+    *Lut = Dest;
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(Intent);
+}
+
+
+// -----------------------------------------------------------------------------------------------------------------------------------------------
+// Fixes the gamma balancing of transform. This is described in my paper "Prelinearization Stages on
+// Color-Management Application-Specific Integrated Circuits (ASICs)" presented at NIP24. It only works
+// for RGB transforms. See the paper for more details
+// -----------------------------------------------------------------------------------------------------------------------------------------------
+
+
+// Normalize endpoints by slope limiting max and min. This assures endpoints as well.
+// Descending curves are handled as well.
+static
+void SlopeLimiting(cmsToneCurve* g)
+{
+    int BeginVal, EndVal;
+    int AtBegin = (int) floor((cmsFloat64Number) g ->nEntries * 0.02 + 0.5);   // Cutoff at 2%
+    int AtEnd   = g ->nEntries - AtBegin - 1;                                  // And 98%
+    cmsFloat64Number Val, Slope, beta;
+    int i;
+
+    if (cmsIsToneCurveDescending(g)) {
+        BeginVal = 0xffff; EndVal = 0;
+    }
+    else {
+        BeginVal = 0; EndVal = 0xffff;
+    }
+
+    // Compute slope and offset for begin of curve
+    Val   = g ->Table16[AtBegin];
+    Slope = (Val - BeginVal) / AtBegin;
+    beta  = Val - Slope * AtBegin;
+
+    for (i=0; i < AtBegin; i++)
+        g ->Table16[i] = _cmsQuickSaturateWord(i * Slope + beta);
+
+    // Compute slope and offset for the end
+    Val   = g ->Table16[AtEnd];
+    Slope = (EndVal - Val) / AtBegin;   // AtBegin holds the X interval, which is same in both cases
+    beta  = Val - Slope * AtEnd;
+
+    for (i = AtEnd; i < (int) g ->nEntries; i++)
+        g ->Table16[i] = _cmsQuickSaturateWord(i * Slope + beta);
+}
+
+
+// Precomputes tables for 8-bit on input devicelink.
+static
+Prelin8Data* PrelinOpt8alloc(cmsContext ContextID, const cmsInterpParams* p, cmsToneCurve* G[3])
+{
+    int i;
+    cmsUInt16Number Input[3];
+    cmsS15Fixed16Number v1, v2, v3;
+    Prelin8Data* p8;
+
+    p8 = (Prelin8Data*)_cmsMallocZero(ContextID, sizeof(Prelin8Data));
+    if (p8 == NULL) return NULL;
+
+    // Since this only works for 8 bit input, values comes always as x * 257,
+    // we can safely take msb byte (x << 8 + x)
+
+    for (i=0; i < 256; i++) {
+
+        if (G != NULL) {
+
+            // Get 16-bit representation
+            Input[0] = cmsEvalToneCurve16(G[0], FROM_8_TO_16(i));
+            Input[1] = cmsEvalToneCurve16(G[1], FROM_8_TO_16(i));
+            Input[2] = cmsEvalToneCurve16(G[2], FROM_8_TO_16(i));
+        }
+        else {
+            Input[0] = FROM_8_TO_16(i);
+            Input[1] = FROM_8_TO_16(i);
+            Input[2] = FROM_8_TO_16(i);
+        }
+
+
+        // Move to 0..1.0 in fixed domain
+        v1 = _cmsToFixedDomain(Input[0] * p -> Domain[0]);
+        v2 = _cmsToFixedDomain(Input[1] * p -> Domain[1]);
+        v3 = _cmsToFixedDomain(Input[2] * p -> Domain[2]);
+
+        // Store the precalculated table of nodes
+        p8 ->X0[i] = (p->opta[2] * FIXED_TO_INT(v1));
+        p8 ->Y0[i] = (p->opta[1] * FIXED_TO_INT(v2));
+        p8 ->Z0[i] = (p->opta[0] * FIXED_TO_INT(v3));
+
+        // Store the precalculated table of offsets
+        p8 ->rx[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v1);
+        p8 ->ry[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v2);
+        p8 ->rz[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v3);
+    }
+
+    p8 ->ContextID = ContextID;
+    p8 ->p = p;
+
+    return p8;
+}
+
+static
+void Prelin8free(cmsContext ContextID, void* ptr)
+{
+    _cmsFree(ContextID, ptr);
+}
+
+static
+void* Prelin8dup(cmsContext ContextID, const void* ptr)
+{
+    return _cmsDupMem(ContextID, ptr, sizeof(Prelin8Data));
+}
+
+
+
+// A optimized interpolation for 8-bit input.
+#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
+static
+void PrelinEval8(register const cmsUInt16Number Input[],
+                  register cmsUInt16Number Output[],
+                  register const void* D)
+{
+
+    cmsUInt8Number         r, g, b;
+    cmsS15Fixed16Number    rx, ry, rz;
+    cmsS15Fixed16Number    c0, c1, c2, c3, Rest;
+    int                    OutChan;
+    register cmsS15Fixed16Number    X0, X1, Y0, Y1, Z0, Z1;
+    Prelin8Data* p8 = (Prelin8Data*) D;
+    register const cmsInterpParams* p = p8 ->p;
+    int                    TotalOut = p -> nOutputs;
+    const cmsUInt16Number* LutTable = (const cmsUInt16Number*)p -> Table;
+
+    r = Input[0] >> 8;
+    g = Input[1] >> 8;
+    b = Input[2] >> 8;
+
+    X0 = X1 = p8->X0[r];
+    Y0 = Y1 = p8->Y0[g];
+    Z0 = Z1 = p8->Z0[b];
+
+    rx = p8 ->rx[r];
+    ry = p8 ->ry[g];
+    rz = p8 ->rz[b];
+
+    X1 = X0 + ((rx == 0) ? 0 : p ->opta[2]);
+    Y1 = Y0 + ((ry == 0) ? 0 : p ->opta[1]);
+    Z1 = Z0 + ((rz == 0) ? 0 : p ->opta[0]);
+
+
+    // These are the 6 Tetrahedral
+    for (OutChan=0; OutChan < TotalOut; OutChan++) {
+
+        c0 = DENS(X0, Y0, Z0);
+
+        if (rx >= ry && ry >= rz)
+        {
+            c1 = DENS(X1, Y0, Z0) - c0;
+            c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);
+            c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+        }
+        else
+            if (rx >= rz && rz >= ry)
+            {
+                c1 = DENS(X1, Y0, Z0) - c0;
+                c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+                c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);
+            }
+            else
+                if (rz >= rx && rx >= ry)
+                {
+                    c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);
+                    c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+                    c3 = DENS(X0, Y0, Z1) - c0;
+                }
+                else
+                    if (ry >= rx && rx >= rz)
+                    {
+                        c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);
+                        c2 = DENS(X0, Y1, Z0) - c0;
+                        c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+                    }
+                    else
+                        if (ry >= rz && rz >= rx)
+                        {
+                            c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+                            c2 = DENS(X0, Y1, Z0) - c0;
+                            c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);
+                        }
+                        else
+                            if (rz >= ry && ry >= rx)
+                            {
+                                c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+                                c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);
+                                c3 = DENS(X0, Y0, Z1) - c0;
+                            }
+                            else  {
+                                c1 = c2 = c3 = 0;
+                            }
+
+
+                            Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+                            Output[OutChan] = (cmsUInt16Number)c0 + ((Rest + (Rest>>16))>>16);
+
+    }
+}
+
+#undef DENS
+
+
+// Curves that contain wide empty areas are not optimizeable
+static
+cmsBool IsDegenerated(const cmsToneCurve* g)
+{
+    int i, Zeros = 0, Poles = 0;
+    int nEntries = g ->nEntries;
+
+    for (i=0; i < nEntries; i++) {
+
+        if (g ->Table16[i] == 0x0000) Zeros++;
+        if (g ->Table16[i] == 0xffff) Poles++;
+    }
+
+    if (Zeros == 1 && Poles == 1) return FALSE;  // For linear tables
+    if (Zeros > (nEntries / 4)) return TRUE;  // Degenerated, mostly zeros
+    if (Poles > (nEntries / 4)) return TRUE;  // Degenerated, mostly poles
+
+    return FALSE;
+}
+
+// --------------------------------------------------------------------------------------------------------------
+// We need xput over here
+
+static
+cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
+{
+    cmsPipeline* OriginalLut;
+    int nGridPoints;
+    cmsToneCurve *Trans[cmsMAXCHANNELS], *TransReverse[cmsMAXCHANNELS];
+    cmsUInt32Number t, i;
+    cmsFloat32Number v, In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS];
+    cmsBool lIsSuitable, lIsLinear;
+    cmsPipeline* OptimizedLUT = NULL, *LutPlusCurves = NULL;
+    cmsStage* OptimizedCLUTmpe;
+    cmsColorSpaceSignature ColorSpace, OutputColorSpace;
+    cmsStage* OptimizedPrelinMpe;
+    cmsStage* mpe;
+    cmsToneCurve**   OptimizedPrelinCurves;
+    _cmsStageCLutData*     OptimizedPrelinCLUT;
+
+
+    // This is a loosy optimization! does not apply in floating-point cases
+    if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;
+
+    // Only on RGB
+    if (T_COLORSPACE(*InputFormat)  != PT_RGB) return FALSE;
+    if (T_COLORSPACE(*OutputFormat) != PT_RGB) return FALSE;
+
+
+    // On 16 bits, user has to specify the feature
+    if (!_cmsFormatterIs8bit(*InputFormat)) {
+        if (!(*dwFlags & cmsFLAGS_CLUT_PRE_LINEARIZATION)) return FALSE;
+    }
+
+    OriginalLut = *Lut;
+
+   // Named color pipelines cannot be optimized either
+   for (mpe = cmsPipelineGetPtrToFirstStage(OriginalLut);
+         mpe != NULL;
+         mpe = cmsStageNext(mpe)) {
+            if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE;
+    }
+
+    ColorSpace       = _cmsICCcolorSpace(T_COLORSPACE(*InputFormat));
+    OutputColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*OutputFormat));
+    nGridPoints      = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags);
+
+    // Empty gamma containers
+    memset(Trans, 0, sizeof(Trans));
+    memset(TransReverse, 0, sizeof(TransReverse));
+
+    for (t = 0; t < OriginalLut ->InputChannels; t++) {
+        Trans[t] = cmsBuildTabulatedToneCurve16(OriginalLut ->ContextID, PRELINEARIZATION_POINTS, NULL);
+        if (Trans[t] == NULL) goto Error;
+    }
+
+    // Populate the curves
+    for (i=0; i < PRELINEARIZATION_POINTS; i++) {
+
+        v = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1));
+
+        // Feed input with a gray ramp
+        for (t=0; t < OriginalLut ->InputChannels; t++)
+            In[t] = v;
+
+        // Evaluate the gray value
+        cmsPipelineEvalFloat(In, Out, OriginalLut);
+
+        // Store result in curve
+        for (t=0; t < OriginalLut ->InputChannels; t++)
+            Trans[t] ->Table16[i] = _cmsQuickSaturateWord(Out[t] * 65535.0);
+    }
+
+    // Slope-limit the obtained curves
+    for (t = 0; t < OriginalLut ->InputChannels; t++)
+        SlopeLimiting(Trans[t]);
+
+    // Check for validity
+    lIsSuitable = TRUE;
+    lIsLinear   = TRUE;
+    for (t=0; (lIsSuitable && (t < OriginalLut ->InputChannels)); t++) {
+
+        // Exclude if already linear
+        if (!cmsIsToneCurveLinear(Trans[t]))
+            lIsLinear = FALSE;
+
+        // Exclude if non-monotonic
+        if (!cmsIsToneCurveMonotonic(Trans[t]))
+            lIsSuitable = FALSE;
+
+        if (IsDegenerated(Trans[t]))
+            lIsSuitable = FALSE;
+    }
+
+    // If it is not suitable, just quit
+    if (!lIsSuitable) goto Error;
+
+    // Invert curves if possible
+    for (t = 0; t < OriginalLut ->InputChannels; t++) {
+        TransReverse[t] = cmsReverseToneCurveEx(PRELINEARIZATION_POINTS, Trans[t]);
+        if (TransReverse[t] == NULL) goto Error;
+    }
+
+    // Now inset the reversed curves at the begin of transform
+    LutPlusCurves = cmsPipelineDup(OriginalLut);
+    if (LutPlusCurves == NULL) goto Error;
+
+    if (!cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, TransReverse)))
+        goto Error;
+
+    // Create the result LUT
+    OptimizedLUT = cmsPipelineAlloc(OriginalLut ->ContextID, OriginalLut ->InputChannels, OriginalLut ->OutputChannels);
+    if (OptimizedLUT == NULL) goto Error;
+
+    OptimizedPrelinMpe = cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, Trans);
+
+    // Create and insert the curves at the beginning
+    if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe))
+        goto Error;
+
+    // Allocate the CLUT for result
+    OptimizedCLUTmpe = cmsStageAllocCLut16bit(OriginalLut ->ContextID, nGridPoints, OriginalLut ->InputChannels, OriginalLut ->OutputChannels, NULL);
+
+    // Add the CLUT to the destination LUT
+    if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe))
+        goto Error;
+
+    // Resample the LUT
+    if (!cmsStageSampleCLut16bit(OptimizedCLUTmpe, XFormSampler16, (void*) LutPlusCurves, 0)) goto Error;
+
+    // Free resources
+    for (t = 0; t < OriginalLut ->InputChannels; t++) {
+
+        if (Trans[t]) cmsFreeToneCurve(Trans[t]);
+        if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]);
+    }
+
+    cmsPipelineFree(LutPlusCurves);
+
+
+    OptimizedPrelinCurves = _cmsStageGetPtrToCurveSet(OptimizedPrelinMpe);
+    OptimizedPrelinCLUT   = (_cmsStageCLutData*) OptimizedCLUTmpe ->Data;
+
+    // Set the evaluator if 8-bit
+    if (_cmsFormatterIs8bit(*InputFormat)) {
+
+        Prelin8Data* p8 = PrelinOpt8alloc(OptimizedLUT ->ContextID,
+                                                OptimizedPrelinCLUT ->Params,
+                                                OptimizedPrelinCurves);
+        if (p8 == NULL) return FALSE;
+
+        _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval8, (void*) p8, Prelin8free, Prelin8dup);
+
+    }
+    else
+    {
+        Prelin16Data* p16 = PrelinOpt16alloc(OptimizedLUT ->ContextID,
+            OptimizedPrelinCLUT ->Params,
+            3, OptimizedPrelinCurves, 3, NULL);
+        if (p16 == NULL) return FALSE;
+
+        _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup);
+
+    }
+
+    // Don't fix white on absolute colorimetric
+    if (Intent == INTENT_ABSOLUTE_COLORIMETRIC)
+        *dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP;
+
+    if (!(*dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) {
+
+        if (!FixWhiteMisalignment(OptimizedLUT, ColorSpace, OutputColorSpace)) {
+
+            return FALSE;
+        }
+    }
+
+    // And return the obtained LUT
+
+    cmsPipelineFree(OriginalLut);
+    *Lut = OptimizedLUT;
+    return TRUE;
+
+Error:
+
+    for (t = 0; t < OriginalLut ->InputChannels; t++) {
+
+        if (Trans[t]) cmsFreeToneCurve(Trans[t]);
+        if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]);
+    }
+
+    if (LutPlusCurves != NULL) cmsPipelineFree(LutPlusCurves);
+    if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT);
+
+    return FALSE;
+
+    cmsUNUSED_PARAMETER(Intent);
+}
+
+
+// Curves optimizer ------------------------------------------------------------------------------------------------------------------
+
+static
+void CurvesFree(cmsContext ContextID, void* ptr)
+{
+     Curves16Data* Data = (Curves16Data*) ptr;
+     int i;
+
+     for (i=0; i < Data -> nCurves; i++) {
+
+         _cmsFree(ContextID, Data ->Curves[i]);
+     }
+
+     _cmsFree(ContextID, Data ->Curves);
+     _cmsFree(ContextID, ptr);
+}
+
+static
+void* CurvesDup(cmsContext ContextID, const void* ptr)
+{
+    Curves16Data* Data = (Curves16Data*)_cmsDupMem(ContextID, ptr, sizeof(Curves16Data));
+    int i;
+
+    if (Data == NULL) return NULL;
+
+    Data ->Curves = (cmsUInt16Number**)_cmsDupMem(ContextID, Data ->Curves, Data ->nCurves * sizeof(cmsUInt16Number*));
+
+    for (i=0; i < Data -> nCurves; i++) {
+        Data ->Curves[i] = (cmsUInt16Number*)_cmsDupMem(ContextID, Data ->Curves[i], Data -> nElements * sizeof(cmsUInt16Number));
+    }
+
+    return (void*) Data;
+}
+
+// Precomputes tables for 8-bit on input devicelink.
+static
+Curves16Data* CurvesAlloc(cmsContext ContextID, int nCurves, int nElements, cmsToneCurve** G)
+{
+    int i, j;
+    Curves16Data* c16;
+
+    c16 = (Curves16Data*)_cmsMallocZero(ContextID, sizeof(Curves16Data));
+    if (c16 == NULL) return NULL;
+
+    c16 ->nCurves = nCurves;
+    c16 ->nElements = nElements;
+
+    c16 ->Curves = (cmsUInt16Number**)_cmsCalloc(ContextID, nCurves, sizeof(cmsUInt16Number*));
+    if (c16 ->Curves == NULL) return NULL;
+
+    for (i=0; i < nCurves; i++) {
+
+        c16->Curves[i] = (cmsUInt16Number*)_cmsCalloc(ContextID, nElements, sizeof(cmsUInt16Number));
+
+        if (c16->Curves[i] == NULL) {
+
+            for (j=0; j < i; j++) {
+                _cmsFree(ContextID, c16->Curves[j]);
+            }
+            _cmsFree(ContextID, c16->Curves);
+            _cmsFree(ContextID, c16);
+            return NULL;
+        }
+
+        if (nElements == 256) {
+
+            for (j=0; j < nElements; j++) {
+
+                c16 ->Curves[i][j] = cmsEvalToneCurve16(G[i], FROM_8_TO_16(j));
+            }
+        }
+        else {
+
+            for (j=0; j < nElements; j++) {
+                c16 ->Curves[i][j] = cmsEvalToneCurve16(G[i], (cmsUInt16Number) j);
+            }
+        }
+    }
+
+    return c16;
+}
+
+static
+void FastEvaluateCurves8(register const cmsUInt16Number In[],
+                          register cmsUInt16Number Out[],
+                          register const void* D)
+{
+    Curves16Data* Data = (Curves16Data*) D;
+    cmsUInt8Number x;
+    int i;
+
+    for (i=0; i < Data ->nCurves; i++) {
+
+         x = (In[i] >> 8);
+         Out[i] = Data -> Curves[i][x];
+    }
+}
+
+
+static
+void FastEvaluateCurves16(register const cmsUInt16Number In[],
+                          register cmsUInt16Number Out[],
+                          register const void* D)
+{
+    Curves16Data* Data = (Curves16Data*) D;
+    int i;
+
+    for (i=0; i < Data ->nCurves; i++) {
+         Out[i] = Data -> Curves[i][In[i]];
+    }
+}
+
+
+static
+void FastIdentity16(register const cmsUInt16Number In[],
+                    register cmsUInt16Number Out[],
+                    register const void* D)
+{
+    cmsPipeline* Lut = (cmsPipeline*) D;
+    cmsUInt32Number i;
+
+    for (i=0; i < Lut ->InputChannels; i++) {
+         Out[i] = In[i];
+    }
+}
+
+
+// If the target LUT holds only curves, the optimization procedure is to join all those
+// curves together. That only works on curves and does not work on matrices.
+static
+cmsBool OptimizeByJoiningCurves(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
+{
+    cmsToneCurve** GammaTables = NULL;
+    cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS];
+    cmsUInt32Number i, j;
+    cmsPipeline* Src = *Lut;
+    cmsPipeline* Dest = NULL;
+    cmsStage* mpe;
+    cmsStage* ObtainedCurves = NULL;
+
+
+    // This is a loosy optimization! does not apply in floating-point cases
+    if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;
+
+    //  Only curves in this LUT?
+    for (mpe = cmsPipelineGetPtrToFirstStage(Src);
+         mpe != NULL;
+         mpe = cmsStageNext(mpe)) {
+            if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE;
+    }
+
+    // Allocate an empty LUT
+    Dest =  cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels);
+    if (Dest == NULL) return FALSE;
+
+    // Create target curves
+    GammaTables = (cmsToneCurve**) _cmsCalloc(Src ->ContextID, Src ->InputChannels, sizeof(cmsToneCurve*));
+    if (GammaTables == NULL) goto Error;
+
+    for (i=0; i < Src ->InputChannels; i++) {
+        GammaTables[i] = cmsBuildTabulatedToneCurve16(Src ->ContextID, PRELINEARIZATION_POINTS, NULL);
+        if (GammaTables[i] == NULL) goto Error;
+    }
+
+    // Compute 16 bit result by using floating point
+    for (i=0; i < PRELINEARIZATION_POINTS; i++) {
+
+        for (j=0; j < Src ->InputChannels; j++)
+            InFloat[j] = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1));
+
+        cmsPipelineEvalFloat(InFloat, OutFloat, Src);
+
+        for (j=0; j < Src ->InputChannels; j++)
+            GammaTables[j] -> Table16[i] = _cmsQuickSaturateWord(OutFloat[j] * 65535.0);
+    }
+
+    ObtainedCurves = cmsStageAllocToneCurves(Src ->ContextID, Src ->InputChannels, GammaTables);
+    if (ObtainedCurves == NULL) goto Error;
+
+    for (i=0; i < Src ->InputChannels; i++) {
+        cmsFreeToneCurve(GammaTables[i]);
+        GammaTables[i] = NULL;
+    }
+
+    if (GammaTables != NULL) _cmsFree(Src ->ContextID, GammaTables);
+
+    // Maybe the curves are linear at the end
+    if (!AllCurvesAreLinear(ObtainedCurves)) {
+
+        if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves))
+            goto Error;
+
+        // If the curves are to be applied in 8 bits, we can save memory
+        if (_cmsFormatterIs8bit(*InputFormat)) {
+
+            _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) ObtainedCurves ->Data;
+             Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 256, Data ->TheCurves);
+
+             if (c16 == NULL) goto Error; 
+             *dwFlags |= cmsFLAGS_NOCACHE;
+            _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves8, c16, CurvesFree, CurvesDup);
+
+        }
+        else {
+
+            _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) cmsStageData(ObtainedCurves);
+             Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 65536, Data ->TheCurves);
+
+             if (c16 == NULL) goto Error; 
+             *dwFlags |= cmsFLAGS_NOCACHE;
+            _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves16, c16, CurvesFree, CurvesDup);
+        }
+    }
+    else {
+
+        // LUT optimizes to nothing. Set the identity LUT
+        cmsStageFree(ObtainedCurves);
+
+        if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageAllocIdentity(Dest ->ContextID, Src ->InputChannels)))
+            goto Error;
+
+        *dwFlags |= cmsFLAGS_NOCACHE;
+        _cmsPipelineSetOptimizationParameters(Dest, FastIdentity16, (void*) Dest, NULL, NULL);
+    }
+
+    // We are done.
+    cmsPipelineFree(Src);
+    *Lut = Dest;
+    return TRUE;
+
+Error:
+
+    if (ObtainedCurves != NULL) cmsStageFree(ObtainedCurves);
+    if (GammaTables != NULL) {
+        for (i=0; i < Src ->InputChannels; i++) {
+            if (GammaTables[i] != NULL) cmsFreeToneCurve(GammaTables[i]);
+        }
+
+        _cmsFree(Src ->ContextID, GammaTables);
+    }
+
+    if (Dest != NULL) cmsPipelineFree(Dest);
+    return FALSE;
+
+    cmsUNUSED_PARAMETER(Intent);
+    cmsUNUSED_PARAMETER(InputFormat);
+    cmsUNUSED_PARAMETER(OutputFormat);
+    cmsUNUSED_PARAMETER(dwFlags);
+}
+
+// -------------------------------------------------------------------------------------------------------------------------------------
+// LUT is Shaper - Matrix - Matrix - Shaper, which is very frequent when combining two matrix-shaper profiles
+
+
+static
+void  FreeMatShaper(cmsContext ContextID, void* Data)
+{
+    if (Data != NULL) _cmsFree(ContextID, Data);
+}
+
+static
+void* DupMatShaper(cmsContext ContextID, const void* Data)
+{
+    return _cmsDupMem(ContextID, Data, sizeof(MatShaper8Data));
+}
+
+
+// A fast matrix-shaper evaluator for 8 bits. This is a bit ticky since I'm using 1.14 signed fixed point
+// to accomplish some performance. Actually it takes 256x3 16 bits tables and 16385 x 3 tables of 8 bits,
+// in total about 50K, and the performance boost is huge!
+static
+void MatShaperEval16(register const cmsUInt16Number In[],
+                     register cmsUInt16Number Out[],
+                     register const void* D)
+{
+    MatShaper8Data* p = (MatShaper8Data*) D;
+    cmsS1Fixed14Number l1, l2, l3, r, g, b;
+    cmsUInt32Number ri, gi, bi;
+
+    // In this case (and only in this case!) we can use this simplification since
+    // In[] is assured to come from a 8 bit number. (a << 8 | a)
+    ri = In[0] & 0xFF;
+    gi = In[1] & 0xFF;
+    bi = In[2] & 0xFF;
+
+    // Across first shaper, which also converts to 1.14 fixed point
+    r = p->Shaper1R[ri];
+    g = p->Shaper1G[gi];
+    b = p->Shaper1B[bi];
+
+    // Evaluate the matrix in 1.14 fixed point
+    l1 =  (p->Mat[0][0] * r + p->Mat[0][1] * g + p->Mat[0][2] * b + p->Off[0] + 0x2000) >> 14;
+    l2 =  (p->Mat[1][0] * r + p->Mat[1][1] * g + p->Mat[1][2] * b + p->Off[1] + 0x2000) >> 14;
+    l3 =  (p->Mat[2][0] * r + p->Mat[2][1] * g + p->Mat[2][2] * b + p->Off[2] + 0x2000) >> 14;
+
+    // Now we have to clip to 0..1.0 range
+    ri = (l1 < 0) ? 0 : ((l1 > 16384) ? 16384 : l1);
+    gi = (l2 < 0) ? 0 : ((l2 > 16384) ? 16384 : l2);
+    bi = (l3 < 0) ? 0 : ((l3 > 16384) ? 16384 : l3);
+
+    // And across second shaper,
+    Out[0] = p->Shaper2R[ri];
+    Out[1] = p->Shaper2G[gi];
+    Out[2] = p->Shaper2B[bi];
+
+}
+
+// This table converts from 8 bits to 1.14 after applying the curve
+static
+void FillFirstShaper(cmsS1Fixed14Number* Table, cmsToneCurve* Curve)
+{
+    int i;
+    cmsFloat32Number R, y;
+
+    for (i=0; i < 256; i++) {
+
+        R   = (cmsFloat32Number) (i / 255.0);
+        y   = cmsEvalToneCurveFloat(Curve, R);
+
+        Table[i] = DOUBLE_TO_1FIXED14(y);
+    }
+}
+
+// This table converts form 1.14 (being 0x4000 the last entry) to 8 bits after applying the curve
+static
+void FillSecondShaper(cmsUInt16Number* Table, cmsToneCurve* Curve, cmsBool Is8BitsOutput)
+{
+    int i;
+    cmsFloat32Number R, Val;
+
+    for (i=0; i < 16385; i++) {
+
+        R   = (cmsFloat32Number) (i / 16384.0);
+        Val = cmsEvalToneCurveFloat(Curve, R);    // Val comes 0..1.0
+
+        if (Is8BitsOutput) {
+
+            // If 8 bits output, we can optimize further by computing the / 257 part.
+            // first we compute the resulting byte and then we store the byte times
+            // 257. This quantization allows to round very quick by doing a >> 8, but
+            // since the low byte is always equal to msb, we can do a & 0xff and this works!
+            cmsUInt16Number w = _cmsQuickSaturateWord(Val * 65535.0);
+            cmsUInt8Number  b = FROM_16_TO_8(w);
+
+            Table[i] = FROM_8_TO_16(b);
+        }
+        else Table[i]  = _cmsQuickSaturateWord(Val * 65535.0);
+    }
+}
+
+// Compute the matrix-shaper structure
+static
+cmsBool SetMatShaper(cmsPipeline* Dest, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3], cmsUInt32Number* OutputFormat)
+{
+    MatShaper8Data* p;
+    int i, j;
+    cmsBool Is8Bits = _cmsFormatterIs8bit(*OutputFormat);
+
+    // Allocate a big chuck of memory to store precomputed tables
+    p = (MatShaper8Data*) _cmsMalloc(Dest ->ContextID, sizeof(MatShaper8Data));
+    if (p == NULL) return FALSE;
+
+    p -> ContextID = Dest -> ContextID;
+
+    // Precompute tables
+    FillFirstShaper(p ->Shaper1R, Curve1[0]);
+    FillFirstShaper(p ->Shaper1G, Curve1[1]);
+    FillFirstShaper(p ->Shaper1B, Curve1[2]);
+
+    FillSecondShaper(p ->Shaper2R, Curve2[0], Is8Bits);
+    FillSecondShaper(p ->Shaper2G, Curve2[1], Is8Bits);
+    FillSecondShaper(p ->Shaper2B, Curve2[2], Is8Bits);
+
+    // Convert matrix to nFixed14. Note that those values may take more than 16 bits as
+    for (i=0; i < 3; i++) {
+        for (j=0; j < 3; j++) {
+            p ->Mat[i][j] = DOUBLE_TO_1FIXED14(Mat->v[i].n[j]);
+        }
+    }
+
+    for (i=0; i < 3; i++) {
+
+        if (Off == NULL) {
+            p ->Off[i] = 0;
+        }
+        else {
+            p ->Off[i] = DOUBLE_TO_1FIXED14(Off->n[i]);
+        }
+    }
+
+    // Mark as optimized for faster formatter
+    if (Is8Bits)
+        *OutputFormat |= OPTIMIZED_SH(1);
+
+    // Fill function pointers
+    _cmsPipelineSetOptimizationParameters(Dest, MatShaperEval16, (void*) p, FreeMatShaper, DupMatShaper);
+    return TRUE;
+}
+
+//  8 bits on input allows matrix-shaper boot up to 25 Mpixels per second on RGB. That's fast!
+// TODO: Allow a third matrix for abs. colorimetric
+static
+cmsBool OptimizeMatrixShaper(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
+{
+    cmsStage* Curve1, *Curve2;
+    cmsStage* Matrix1, *Matrix2;
+    _cmsStageMatrixData* Data1;
+    _cmsStageMatrixData* Data2;
+    cmsMAT3 res;
+    cmsBool IdentityMat;
+    cmsPipeline* Dest, *Src;
+
+    // Only works on RGB to RGB
+    if (T_CHANNELS(*InputFormat) != 3 || T_CHANNELS(*OutputFormat) != 3) return FALSE;
+
+    // Only works on 8 bit input
+    if (!_cmsFormatterIs8bit(*InputFormat)) return FALSE;
+
+    // Seems suitable, proceed
+    Src = *Lut;
+
+    // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for
+    if (!cmsPipelineCheckAndRetreiveStages(Src, 4,
+        cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType,
+        &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE;
+
+    // Get both matrices
+    Data1 = (_cmsStageMatrixData*) cmsStageData(Matrix1);
+    Data2 = (_cmsStageMatrixData*) cmsStageData(Matrix2);
+
+    // Input offset should be zero
+    if (Data1 ->Offset != NULL) return FALSE;
+
+    // Multiply both matrices to get the result
+    _cmsMAT3per(&res, (cmsMAT3*) Data2 ->Double, (cmsMAT3*) Data1 ->Double);
+
+    // Now the result is in res + Data2 -> Offset. Maybe is a plain identity?
+    IdentityMat = FALSE;
+    if (_cmsMAT3isIdentity(&res) && Data2 ->Offset == NULL) {
+
+        // We can get rid of full matrix
+        IdentityMat = TRUE;
+    }
+
+      // Allocate an empty LUT
+    Dest =  cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels);
+    if (!Dest) return FALSE;
+
+    // Assamble the new LUT
+    if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)))
+        goto Error;
+
+    if (!IdentityMat)
+        if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest ->ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)))
+            goto Error;
+    if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)))
+        goto Error;
+
+    // If identity on matrix, we can further optimize the curves, so call the join curves routine
+    if (IdentityMat) {
+
+        OptimizeByJoiningCurves(&Dest, Intent, InputFormat, OutputFormat, dwFlags);
+    }
+    else {
+        _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1);
+        _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2);
+
+        // In this particular optimization, cach?does not help as it takes more time to deal with
+        // the cach?that with the pixel handling
+        *dwFlags |= cmsFLAGS_NOCACHE;
+
+        // Setup the optimizarion routines
+        SetMatShaper(Dest, mpeC1 ->TheCurves, &res, (cmsVEC3*) Data2 ->Offset, mpeC2->TheCurves, OutputFormat);
+    }
+
+    cmsPipelineFree(Src);
+    *Lut = Dest;
+    return TRUE;
+Error:
+    // Leave Src unchanged
+    cmsPipelineFree(Dest);
+    return FALSE;
+}
+
+
+// -------------------------------------------------------------------------------------------------------------------------------------
+// Optimization plug-ins
+
+// List of optimizations
+typedef struct _cmsOptimizationCollection_st {
+
+    _cmsOPToptimizeFn  OptimizePtr;
+
+    struct _cmsOptimizationCollection_st *Next;
+
+} _cmsOptimizationCollection;
+
+
+// The built-in list. We currently implement 4 types of optimizations. Joining of curves, matrix-shaper, linearization and resampling
+static _cmsOptimizationCollection DefaultOptimization[] = {
+
+    { OptimizeByJoiningCurves,            &DefaultOptimization[1] },
+    { OptimizeMatrixShaper,               &DefaultOptimization[2] },
+    { OptimizeByComputingLinearization,   &DefaultOptimization[3] },
+    { OptimizeByResampling,               NULL }
+};
+
+// The linked list head
+_cmsOptimizationPluginChunkType _cmsOptimizationPluginChunk = { NULL };
+
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupPluginOptimizationList(struct _cmsContext_struct* ctx, 
+                               const struct _cmsContext_struct* src)
+{
+   _cmsOptimizationPluginChunkType newHead = { NULL };
+   _cmsOptimizationCollection*  entry;
+   _cmsOptimizationCollection*  Anterior = NULL;
+   _cmsOptimizationPluginChunkType* head = (_cmsOptimizationPluginChunkType*) src->chunks[OptimizationPlugin];
+
+    _cmsAssert(ctx != NULL);
+    _cmsAssert(head != NULL);
+
+    // Walk the list copying all nodes
+   for (entry = head->OptimizationCollection;
+        entry != NULL;
+        entry = entry ->Next) {
+
+            _cmsOptimizationCollection *newEntry = ( _cmsOptimizationCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsOptimizationCollection));
+   
+            if (newEntry == NULL) 
+                return;
+
+            // We want to keep the linked list order, so this is a little bit tricky
+            newEntry -> Next = NULL;
+            if (Anterior)
+                Anterior -> Next = newEntry;
+     
+            Anterior = newEntry;
+
+            if (newHead.OptimizationCollection == NULL)
+                newHead.OptimizationCollection = newEntry;
+    }
+
+  ctx ->chunks[OptimizationPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsOptimizationPluginChunkType));
+}
+
+void  _cmsAllocOptimizationPluginChunk(struct _cmsContext_struct* ctx, 
+                                         const struct _cmsContext_struct* src)
+{
+  if (src != NULL) {
+
+        // Copy all linked list
+       DupPluginOptimizationList(ctx, src);
+    }
+    else {
+        static _cmsOptimizationPluginChunkType OptimizationPluginChunkType = { NULL };
+        ctx ->chunks[OptimizationPlugin] = _cmsSubAllocDup(ctx ->MemPool, &OptimizationPluginChunkType, sizeof(_cmsOptimizationPluginChunkType));
+    }
+}
+
+
+// Register new ways to optimize
+cmsBool  _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Data)
+{
+    cmsPluginOptimization* Plugin = (cmsPluginOptimization*) Data;
+    _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin);
+    _cmsOptimizationCollection* fl;
+
+    if (Data == NULL) {
+
+        ctx->OptimizationCollection = NULL;
+        return TRUE;
+    }
+
+    // Optimizer callback is required
+    if (Plugin ->OptimizePtr == NULL) return FALSE;
+
+    fl = (_cmsOptimizationCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsOptimizationCollection));
+    if (fl == NULL) return FALSE;
+
+    // Copy the parameters
+    fl ->OptimizePtr = Plugin ->OptimizePtr;
+
+    // Keep linked list
+    fl ->Next = ctx->OptimizationCollection;
+
+    // Set the head
+    ctx ->OptimizationCollection = fl;
+
+    // All is ok
+    return TRUE;
+}
+
+// The entry point for LUT optimization
+cmsBool _cmsOptimizePipeline(cmsContext ContextID,
+                             cmsPipeline**    PtrLut,
+                             int              Intent,
+                             cmsUInt32Number* InputFormat,
+                             cmsUInt32Number* OutputFormat,
+                             cmsUInt32Number* dwFlags)
+{
+    _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin);
+    _cmsOptimizationCollection* Opts;
+    cmsBool AnySuccess = FALSE;
+
+    // A CLUT is being asked, so force this specific optimization
+    if (*dwFlags & cmsFLAGS_FORCE_CLUT) {
+
+        PreOptimize(*PtrLut);
+        return OptimizeByResampling(PtrLut, Intent, InputFormat, OutputFormat, dwFlags);
+    }
+
+    // Anything to optimize?
+    if ((*PtrLut) ->Elements == NULL) {
+        _cmsPipelineSetOptimizationParameters(*PtrLut, FastIdentity16, (void*) *PtrLut, NULL, NULL);
+        return TRUE;
+    }
+
+    // Try to get rid of identities and trivial conversions.
+    AnySuccess = PreOptimize(*PtrLut);
+
+    // After removal do we end with an identity?
+    if ((*PtrLut) ->Elements == NULL) {
+        _cmsPipelineSetOptimizationParameters(*PtrLut, FastIdentity16, (void*) *PtrLut, NULL, NULL);
+        return TRUE;
+    }
+
+    // Do not optimize, keep all precision
+    if (*dwFlags & cmsFLAGS_NOOPTIMIZE)
+        return FALSE;
+
+    // Try plug-in optimizations 
+    for (Opts = ctx->OptimizationCollection;
+         Opts != NULL;
+         Opts = Opts ->Next) {
+
+            // If one schema succeeded, we are done
+            if (Opts ->OptimizePtr(PtrLut, Intent, InputFormat, OutputFormat, dwFlags)) {
+
+                return TRUE;    // Optimized!
+            }
+    }
+
+   // Try built-in optimizations 
+    for (Opts = DefaultOptimization;
+         Opts != NULL;
+         Opts = Opts ->Next) {
+
+            if (Opts ->OptimizePtr(PtrLut, Intent, InputFormat, OutputFormat, dwFlags)) {
+
+                return TRUE;  
+            }
+    }
+
+    // Only simple optimizations succeeded
+    return AnySuccess;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmspack.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmspack.c
new file mode 100644
index 0000000..9323b53
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmspack.c
@@ -0,0 +1,3369 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2010 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+#include "lcms2_internal.h"
+
+// This module handles all formats supported by lcms. There are two flavors, 16 bits and
+// floating point. Floating point is supported only in a subset, those formats holding
+// cmsFloat32Number (4 bytes per component) and double (marked as 0 bytes per component
+// as special case)
+
+// ---------------------------------------------------------------------------
+
+
+// This macro return words stored as big endian
+#define CHANGE_ENDIAN(w)    (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8))
+
+// These macros handles reversing (negative)
+#define REVERSE_FLAVOR_8(x)     ((cmsUInt8Number) (0xff-(x)))
+#define REVERSE_FLAVOR_16(x)    ((cmsUInt16Number)(0xffff-(x)))
+
+// * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256
+cmsINLINE cmsUInt16Number FomLabV2ToLabV4(cmsUInt16Number x)
+{
+    int a = (x << 8 | x) >> 8;  // * 257 / 256
+    if ( a > 0xffff) return 0xffff;
+    return (cmsUInt16Number) a;
+}
+
+// * 0xf00 / 0xffff = * 256 / 257
+cmsINLINE cmsUInt16Number FomLabV4ToLabV2(cmsUInt16Number x)
+{
+    return (cmsUInt16Number) (((x << 8) + 0x80) / 257);
+}
+
+
+typedef struct {
+    cmsUInt32Number Type;
+    cmsUInt32Number Mask;
+    cmsFormatter16  Frm;
+
+} cmsFormatters16;
+
+typedef struct {
+    cmsUInt32Number    Type;
+    cmsUInt32Number    Mask;
+    cmsFormatterFloat  Frm;
+
+} cmsFormattersFloat;
+
+
+#define ANYSPACE        COLORSPACE_SH(31)
+#define ANYCHANNELS     CHANNELS_SH(15)
+#define ANYEXTRA        EXTRA_SH(7)
+#define ANYPLANAR       PLANAR_SH(1)
+#define ANYENDIAN       ENDIAN16_SH(1)
+#define ANYSWAP         DOSWAP_SH(1)
+#define ANYSWAPFIRST    SWAPFIRST_SH(1)
+#define ANYFLAVOR       FLAVOR_SH(1)
+
+
+// Supress waning about info never being used
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4100)
+#endif
+
+// Unpacking routines (16 bits) ----------------------------------------------------------------------------------------
+
+
+// Does almost everything but is slow
+static
+cmsUInt8Number* UnrollChunkyBytes(register _cmsTRANSFORM* info,
+                                  register cmsUInt16Number wIn[],
+                                  register cmsUInt8Number* accum,
+                                  register cmsUInt32Number Stride)
+{
+    int nChan      = T_CHANNELS(info -> InputFormat);
+    int DoSwap     = T_DOSWAP(info ->InputFormat);
+    int Reverse    = T_FLAVOR(info ->InputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);
+    int Extra      = T_EXTRA(info -> InputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    cmsUInt16Number v;
+    int i;
+
+    if (ExtraFirst) {
+        accum += Extra;
+    }
+
+    for (i=0; i < nChan; i++) {
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        v = FROM_8_TO_16(*accum);
+        v = Reverse ? REVERSE_FLAVOR_16(v) : v;
+        wIn[index] = v;
+        accum++;
+    }
+
+    if (!ExtraFirst) {
+        accum += Extra;
+    }
+
+    if (Extra == 0 && SwapFirst) {
+        cmsUInt16Number tmp = wIn[0];
+
+        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
+        wIn[nChan-1] = tmp;
+    }
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+
+}
+
+// Extra channels are just ignored because come in the next planes
+static
+cmsUInt8Number* UnrollPlanarBytes(register _cmsTRANSFORM* info,
+                                  register cmsUInt16Number wIn[],
+                                  register cmsUInt8Number* accum,
+                                  register cmsUInt32Number Stride)
+{
+    int nChan     = T_CHANNELS(info -> InputFormat);
+    int DoSwap    = T_DOSWAP(info ->InputFormat);
+    int SwapFirst = T_SWAPFIRST(info ->InputFormat);
+    int Reverse   = T_FLAVOR(info ->InputFormat);
+    int i;
+    cmsUInt8Number* Init = accum;
+
+    if (DoSwap ^ SwapFirst) {
+        accum += T_EXTRA(info -> InputFormat) * Stride;
+    }
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+        cmsUInt16Number v = FROM_8_TO_16(*accum);
+
+        wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v;
+        accum += Stride;
+    }
+
+    return (Init + 1);
+}
+
+// Special cases, provided for performance
+static
+cmsUInt8Number* Unroll4Bytes(register _cmsTRANSFORM* info,
+                             register cmsUInt16Number wIn[],
+                             register cmsUInt8Number* accum,
+                             register cmsUInt32Number Stride)
+{
+    wIn[0] = FROM_8_TO_16(*accum); accum++; // C
+    wIn[1] = FROM_8_TO_16(*accum); accum++; // M
+    wIn[2] = FROM_8_TO_16(*accum); accum++; // Y
+    wIn[3] = FROM_8_TO_16(*accum); accum++; // K
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll4BytesReverse(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wIn[],
+                                    register cmsUInt8Number* accum,
+                                    register cmsUInt32Number Stride)
+{
+    wIn[0] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // C
+    wIn[1] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // M
+    wIn[2] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // Y
+    wIn[3] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // K
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll4BytesSwapFirst(register _cmsTRANSFORM* info,
+                                      register cmsUInt16Number wIn[],
+                                      register cmsUInt8Number* accum,
+                                      register cmsUInt32Number Stride)
+{
+    wIn[3] = FROM_8_TO_16(*accum); accum++; // K
+    wIn[0] = FROM_8_TO_16(*accum); accum++; // C
+    wIn[1] = FROM_8_TO_16(*accum); accum++; // M
+    wIn[2] = FROM_8_TO_16(*accum); accum++; // Y
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+// KYMC
+static
+cmsUInt8Number* Unroll4BytesSwap(register _cmsTRANSFORM* info,
+                                 register cmsUInt16Number wIn[],
+                                 register cmsUInt8Number* accum,
+                                 register cmsUInt32Number Stride)
+{
+    wIn[3] = FROM_8_TO_16(*accum); accum++;  // K
+    wIn[2] = FROM_8_TO_16(*accum); accum++;  // Y
+    wIn[1] = FROM_8_TO_16(*accum); accum++;  // M
+    wIn[0] = FROM_8_TO_16(*accum); accum++;  // C
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll4BytesSwapSwapFirst(register _cmsTRANSFORM* info,
+                                          register cmsUInt16Number wIn[],
+                                          register cmsUInt8Number* accum,
+                                          register cmsUInt32Number Stride)
+{
+    wIn[2] = FROM_8_TO_16(*accum); accum++;  // K
+    wIn[1] = FROM_8_TO_16(*accum); accum++;  // Y
+    wIn[0] = FROM_8_TO_16(*accum); accum++;  // M
+    wIn[3] = FROM_8_TO_16(*accum); accum++;  // C
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3Bytes(register _cmsTRANSFORM* info,
+                             register cmsUInt16Number wIn[],
+                             register cmsUInt8Number* accum,
+                             register cmsUInt32Number Stride)
+{
+    wIn[0] = FROM_8_TO_16(*accum); accum++;     // R
+    wIn[1] = FROM_8_TO_16(*accum); accum++;     // G
+    wIn[2] = FROM_8_TO_16(*accum); accum++;     // B
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3BytesSkip1Swap(register _cmsTRANSFORM* info,
+                                      register cmsUInt16Number wIn[],
+                                      register cmsUInt8Number* accum,
+                                      register cmsUInt32Number Stride)
+{
+    accum++; // A
+    wIn[2] = FROM_8_TO_16(*accum); accum++; // B
+    wIn[1] = FROM_8_TO_16(*accum); accum++; // G
+    wIn[0] = FROM_8_TO_16(*accum); accum++; // R
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3BytesSkip1SwapSwapFirst(register _cmsTRANSFORM* info, 
+                                              register cmsUInt16Number wIn[], 
+                                              register cmsUInt8Number* accum,
+                                              register cmsUInt32Number Stride)
+{
+    wIn[2] = FROM_8_TO_16(*accum); accum++; // B
+    wIn[1] = FROM_8_TO_16(*accum); accum++; // G
+    wIn[0] = FROM_8_TO_16(*accum); accum++; // R
+    accum++; // A
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3BytesSkip1SwapFirst(register _cmsTRANSFORM* info, 
+                                           register cmsUInt16Number wIn[], 
+                                           register cmsUInt8Number* accum,
+                                           register cmsUInt32Number Stride)
+{
+    accum++; // A
+    wIn[0] = FROM_8_TO_16(*accum); accum++; // R
+    wIn[1] = FROM_8_TO_16(*accum); accum++; // G
+    wIn[2] = FROM_8_TO_16(*accum); accum++; // B
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+// BRG
+static
+cmsUInt8Number* Unroll3BytesSwap(register _cmsTRANSFORM* info,
+                                 register cmsUInt16Number wIn[],
+                                 register cmsUInt8Number* accum,
+                                 register cmsUInt32Number Stride)
+{
+    wIn[2] = FROM_8_TO_16(*accum); accum++;     // B
+    wIn[1] = FROM_8_TO_16(*accum); accum++;     // G
+    wIn[0] = FROM_8_TO_16(*accum); accum++;     // R
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* UnrollLabV2_8(register _cmsTRANSFORM* info,
+                              register cmsUInt16Number wIn[],
+                              register cmsUInt8Number* accum,
+                              register cmsUInt32Number Stride)
+{
+    wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++;     // L
+    wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++;     // a
+    wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++;     // b
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* UnrollALabV2_8(register _cmsTRANSFORM* info,
+                               register cmsUInt16Number wIn[],
+                               register cmsUInt8Number* accum,
+                               register cmsUInt32Number Stride)
+{
+    accum++;  // A
+    wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++;     // L
+    wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++;     // a
+    wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++;     // b
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* UnrollLabV2_16(register _cmsTRANSFORM* info,
+                               register cmsUInt16Number wIn[],
+                               register cmsUInt8Number* accum,
+                               register cmsUInt32Number Stride)
+{
+    wIn[0] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2;     // L
+    wIn[1] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2;     // a
+    wIn[2] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2;     // b
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+// for duplex
+static
+cmsUInt8Number* Unroll2Bytes(register _cmsTRANSFORM* info,
+                                     register cmsUInt16Number wIn[],
+                                     register cmsUInt8Number* accum,
+                                     register cmsUInt32Number Stride)
+{
+    wIn[0] = FROM_8_TO_16(*accum); accum++;     // ch1
+    wIn[1] = FROM_8_TO_16(*accum); accum++;     // ch2
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+
+
+// Monochrome duplicates L into RGB for null-transforms
+static
+cmsUInt8Number* Unroll1Byte(register _cmsTRANSFORM* info,
+                            register cmsUInt16Number wIn[],
+                            register cmsUInt8Number* accum,
+                            register cmsUInt32Number Stride)
+{
+    wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++;     // L
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Unroll1ByteSkip1(register _cmsTRANSFORM* info,
+                                 register cmsUInt16Number wIn[],
+                                 register cmsUInt8Number* accum,
+                                 register cmsUInt32Number Stride)
+{
+    wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++;     // L
+    accum += 1;
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll1ByteSkip2(register _cmsTRANSFORM* info,
+                                 register cmsUInt16Number wIn[],
+                                 register cmsUInt8Number* accum,
+                                 register cmsUInt32Number Stride)
+{
+    wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++;     // L
+    accum += 2;
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll1ByteReversed(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wIn[],
+                                    register cmsUInt8Number* accum,
+                                    register cmsUInt32Number Stride)
+{
+    wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(FROM_8_TO_16(*accum)); accum++;     // L
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* UnrollAnyWords(register _cmsTRANSFORM* info,
+                               register cmsUInt16Number wIn[],
+                               register cmsUInt8Number* accum,
+                               register cmsUInt32Number Stride)
+{
+    int nChan       = T_CHANNELS(info -> InputFormat);
+    int SwapEndian  = T_ENDIAN16(info -> InputFormat);
+    int DoSwap      = T_DOSWAP(info ->InputFormat);
+    int Reverse     = T_FLAVOR(info ->InputFormat);
+    int SwapFirst   = T_SWAPFIRST(info -> InputFormat);
+    int Extra       = T_EXTRA(info -> InputFormat);
+    int ExtraFirst  = DoSwap ^ SwapFirst;
+    int i;
+
+    if (ExtraFirst) {
+        accum += Extra * sizeof(cmsUInt16Number);
+    }
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+        cmsUInt16Number v = *(cmsUInt16Number*) accum;
+
+        if (SwapEndian)
+            v = CHANGE_ENDIAN(v);
+
+        wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v;
+
+        accum += sizeof(cmsUInt16Number);
+    }
+
+    if (!ExtraFirst) {
+        accum += Extra * sizeof(cmsUInt16Number);
+    }
+
+    if (Extra == 0 && SwapFirst) {
+
+        cmsUInt16Number tmp = wIn[0];
+
+        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
+        wIn[nChan-1] = tmp;
+    }
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* UnrollPlanarWords(register _cmsTRANSFORM* info,
+                                  register cmsUInt16Number wIn[],
+                                  register cmsUInt8Number* accum,
+                                  register cmsUInt32Number Stride)
+{
+    int nChan = T_CHANNELS(info -> InputFormat);
+    int DoSwap= T_DOSWAP(info ->InputFormat);
+    int Reverse= T_FLAVOR(info ->InputFormat);
+    int SwapEndian = T_ENDIAN16(info -> InputFormat);
+    int i;
+    cmsUInt8Number* Init = accum;
+
+    if (DoSwap) {
+        accum += T_EXTRA(info -> InputFormat) * Stride * sizeof(cmsUInt16Number);
+    }
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+        cmsUInt16Number v = *(cmsUInt16Number*) accum;
+
+        if (SwapEndian)
+            v = CHANGE_ENDIAN(v);
+
+        wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v;
+
+        accum +=  Stride * sizeof(cmsUInt16Number);
+    }
+
+    return (Init + sizeof(cmsUInt16Number));
+}
+
+
+static
+cmsUInt8Number* Unroll4Words(register _cmsTRANSFORM* info,
+                             register cmsUInt16Number wIn[],
+                             register cmsUInt8Number* accum,
+                             register cmsUInt32Number Stride)
+{
+    wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C
+    wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M
+    wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y
+    wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll4WordsReverse(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wIn[],
+                                    register cmsUInt8Number* accum,
+                                    register cmsUInt32Number Stride)
+{
+    wIn[0] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // C
+    wIn[1] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // M
+    wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // Y
+    wIn[3] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // K
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll4WordsSwapFirst(register _cmsTRANSFORM* info,
+                                      register cmsUInt16Number wIn[],
+                                      register cmsUInt8Number* accum,
+                                      register cmsUInt32Number Stride)
+{
+    wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K
+    wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C
+    wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M
+    wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+// KYMC
+static
+cmsUInt8Number* Unroll4WordsSwap(register _cmsTRANSFORM* info,
+                                 register cmsUInt16Number wIn[],
+                                 register cmsUInt8Number* accum,
+                                 register cmsUInt32Number Stride)
+{
+    wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K
+    wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y
+    wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M
+    wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll4WordsSwapSwapFirst(register _cmsTRANSFORM* info,
+                                          register cmsUInt16Number wIn[],
+                                          register cmsUInt8Number* accum,
+                                          register cmsUInt32Number Stride)
+{
+    wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // K
+    wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // Y
+    wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // M
+    wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // C
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3Words(register _cmsTRANSFORM* info,
+                             register cmsUInt16Number wIn[],
+                             register cmsUInt8Number* accum,
+                             register cmsUInt32Number Stride)
+{
+    wIn[0] = *(cmsUInt16Number*) accum; accum+= 2;  // C R
+    wIn[1] = *(cmsUInt16Number*) accum; accum+= 2;  // M G
+    wIn[2] = *(cmsUInt16Number*) accum; accum+= 2;  // Y B
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3WordsSwap(register _cmsTRANSFORM* info,
+                                 register cmsUInt16Number wIn[],
+                                 register cmsUInt8Number* accum,
+                                 register cmsUInt32Number Stride)
+{
+    wIn[2] = *(cmsUInt16Number*) accum; accum+= 2;  // C R
+    wIn[1] = *(cmsUInt16Number*) accum; accum+= 2;  // M G
+    wIn[0] = *(cmsUInt16Number*) accum; accum+= 2;  // Y B
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3WordsSkip1Swap(register _cmsTRANSFORM* info,
+                                      register cmsUInt16Number wIn[],
+                                      register cmsUInt8Number* accum,
+                                      register cmsUInt32Number Stride)
+{
+    accum += 2; // A
+    wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // R
+    wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G
+    wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // B
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3WordsSkip1SwapFirst(register _cmsTRANSFORM* info,
+                                           register cmsUInt16Number wIn[],
+                                           register cmsUInt8Number* accum,
+                                           register cmsUInt32Number Stride)
+{
+    accum += 2; // A
+    wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // R
+    wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G
+    wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // B
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll1Word(register _cmsTRANSFORM* info,
+                            register cmsUInt16Number wIn[],
+                            register cmsUInt8Number* accum,
+                            register cmsUInt32Number Stride)
+{
+    wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum+= 2;   // L
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll1WordReversed(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wIn[],
+                                    register cmsUInt8Number* accum,
+                                    register cmsUInt32Number Stride)
+{
+    wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2;
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll1WordSkip3(register _cmsTRANSFORM* info,
+                                 register cmsUInt16Number wIn[],
+                                 register cmsUInt8Number* accum,
+                                 register cmsUInt32Number Stride)
+{
+    wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum;
+
+    accum += 8;
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll2Words(register _cmsTRANSFORM* info,
+                                     register cmsUInt16Number wIn[],
+                                     register cmsUInt8Number* accum,
+                                     register cmsUInt32Number Stride)
+{
+    wIn[0] = *(cmsUInt16Number*) accum; accum += 2;    // ch1
+    wIn[1] = *(cmsUInt16Number*) accum; accum += 2;    // ch2
+
+    return accum;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+// This is a conversion of Lab double to 16 bits
+static
+cmsUInt8Number* UnrollLabDoubleTo16(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wIn[],
+                                    register cmsUInt8Number* accum,
+                                    register cmsUInt32Number  Stride)
+{
+    if (T_PLANAR(info -> InputFormat)) {
+
+        cmsFloat64Number* Pt = (cmsFloat64Number*) accum;
+
+        cmsCIELab Lab;
+
+        Lab.L = Pt[0];
+        Lab.a = Pt[Stride];
+        Lab.b = Pt[Stride*2];
+
+        cmsFloat2LabEncoded(wIn, &Lab);
+        return accum + sizeof(cmsFloat64Number);
+    }
+    else {
+
+        cmsFloat2LabEncoded(wIn, (cmsCIELab*) accum);
+        accum += sizeof(cmsCIELab) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number);
+        return accum;
+    }
+}
+
+
+// This is a conversion of Lab float to 16 bits
+static
+cmsUInt8Number* UnrollLabFloatTo16(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wIn[],
+                                    register cmsUInt8Number* accum,
+                                    register cmsUInt32Number  Stride)
+{
+    cmsCIELab Lab;
+    
+    if (T_PLANAR(info -> InputFormat)) {
+
+        cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
+
+     
+        Lab.L = Pt[0];
+        Lab.a = Pt[Stride];
+        Lab.b = Pt[Stride*2];
+
+        cmsFloat2LabEncoded(wIn, &Lab);
+        return accum + sizeof(cmsFloat32Number);
+    }
+    else {
+ 
+        Lab.L = ((cmsFloat32Number*) accum)[0];
+        Lab.a = ((cmsFloat32Number*) accum)[1];
+        Lab.b = ((cmsFloat32Number*) accum)[2];
+
+        cmsFloat2LabEncoded(wIn, &Lab);
+        accum += (3 + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat32Number);
+        return accum;
+    }
+}
+
+// This is a conversion of XYZ double to 16 bits
+static
+cmsUInt8Number* UnrollXYZDoubleTo16(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wIn[],
+                                    register cmsUInt8Number* accum,
+                                    register cmsUInt32Number Stride)
+{
+    if (T_PLANAR(info -> InputFormat)) {
+
+        cmsFloat64Number* Pt = (cmsFloat64Number*) accum;
+        cmsCIEXYZ XYZ;
+
+        XYZ.X = Pt[0];
+        XYZ.Y = Pt[Stride];
+        XYZ.Z = Pt[Stride*2];
+        cmsFloat2XYZEncoded(wIn, &XYZ);
+
+        return accum + sizeof(cmsFloat64Number);
+
+    }
+
+    else {
+        cmsFloat2XYZEncoded(wIn, (cmsCIEXYZ*) accum);
+        accum += sizeof(cmsCIEXYZ) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number);
+
+        return accum;
+    }
+}
+
+// This is a conversion of XYZ float to 16 bits
+static
+cmsUInt8Number* UnrollXYZFloatTo16(register _cmsTRANSFORM* info,
+                                   register cmsUInt16Number wIn[],
+                                   register cmsUInt8Number* accum,
+                                   register cmsUInt32Number Stride)
+{
+    if (T_PLANAR(info -> InputFormat)) {
+
+        cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
+        cmsCIEXYZ XYZ;
+
+        XYZ.X = Pt[0];
+        XYZ.Y = Pt[Stride];
+        XYZ.Z = Pt[Stride*2];
+        cmsFloat2XYZEncoded(wIn, &XYZ);
+
+        return accum + sizeof(cmsFloat32Number);
+
+    }
+
+    else {
+        cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
+        cmsCIEXYZ XYZ;
+
+        XYZ.X = Pt[0];
+        XYZ.Y = Pt[1];
+        XYZ.Z = Pt[2];
+        cmsFloat2XYZEncoded(wIn, &XYZ);
+
+        accum += 3 * sizeof(cmsFloat32Number) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat32Number);
+
+        return accum;
+    }
+}
+
+// Check if space is marked as ink
+cmsINLINE cmsBool IsInkSpace(cmsUInt32Number Type)
+{
+    switch (T_COLORSPACE(Type)) {
+
+     case PT_CMY:
+     case PT_CMYK:
+     case PT_MCH5:
+     case PT_MCH6:
+     case PT_MCH7:
+     case PT_MCH8:
+     case PT_MCH9:
+     case PT_MCH10:
+     case PT_MCH11:
+     case PT_MCH12:
+     case PT_MCH13:
+     case PT_MCH14:
+     case PT_MCH15: return TRUE;
+
+     default: return FALSE;
+    }
+}
+
+// Inks does come in percentage, remaining cases are between 0..1.0, again to 16 bits
+static
+cmsUInt8Number* UnrollDoubleTo16(register _cmsTRANSFORM* info,
+                                register cmsUInt16Number wIn[],
+                                register cmsUInt8Number* accum,
+                                register cmsUInt32Number Stride)
+{
+
+    int nChan      = T_CHANNELS(info -> InputFormat);
+    int DoSwap     = T_DOSWAP(info ->InputFormat);
+    int Reverse    = T_FLAVOR(info ->InputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);
+    int Extra      = T_EXTRA(info -> InputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    int Planar     = T_PLANAR(info -> InputFormat);
+    cmsFloat64Number v;
+    cmsUInt16Number  vi;
+    int i, start = 0;
+   cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0;
+
+
+    if (ExtraFirst)
+            start = Extra;
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        if (Planar)
+            v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[(i + start) * Stride];
+        else
+            v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[i + start];
+
+        vi = _cmsQuickSaturateWord(v * maximum);
+
+        if (Reverse)
+            vi = REVERSE_FLAVOR_16(vi);
+
+        wIn[index] = vi;
+    }
+
+
+    if (Extra == 0 && SwapFirst) {
+        cmsUInt16Number tmp = wIn[0];
+
+        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
+        wIn[nChan-1] = tmp;
+    }
+
+    if (T_PLANAR(info -> InputFormat))
+        return accum + sizeof(cmsFloat64Number);
+    else
+        return accum + (nChan + Extra) * sizeof(cmsFloat64Number);
+}
+
+
+
+static
+cmsUInt8Number* UnrollFloatTo16(register _cmsTRANSFORM* info,
+                                register cmsUInt16Number wIn[],
+                                register cmsUInt8Number* accum,
+                                register cmsUInt32Number Stride)
+{
+
+    int nChan      = T_CHANNELS(info -> InputFormat);
+    int DoSwap     = T_DOSWAP(info ->InputFormat);
+    int Reverse    = T_FLAVOR(info ->InputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);
+    int Extra      = T_EXTRA(info -> InputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    int Planar     = T_PLANAR(info -> InputFormat);
+    cmsFloat32Number v;
+    cmsUInt16Number  vi;
+    int i, start = 0;
+   cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0;
+
+
+    if (ExtraFirst)
+            start = Extra;
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        if (Planar)
+            v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride];
+        else
+            v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start];
+
+        vi = _cmsQuickSaturateWord(v * maximum);
+
+        if (Reverse)
+            vi = REVERSE_FLAVOR_16(vi);
+
+        wIn[index] = vi;
+    }
+
+
+    if (Extra == 0 && SwapFirst) {
+        cmsUInt16Number tmp = wIn[0];
+
+        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
+        wIn[nChan-1] = tmp;
+    }
+
+    if (T_PLANAR(info -> InputFormat))
+        return accum + sizeof(cmsFloat32Number);
+    else
+        return accum + (nChan + Extra) * sizeof(cmsFloat32Number);
+}
+
+
+
+
+// For 1 channel, we need to duplicate data (it comes in 0..1.0 range)
+static
+cmsUInt8Number* UnrollDouble1Chan(register _cmsTRANSFORM* info,
+                                  register cmsUInt16Number wIn[],
+                                  register cmsUInt8Number* accum,
+                                  register cmsUInt32Number Stride)
+{
+    cmsFloat64Number* Inks = (cmsFloat64Number*) accum;
+
+    wIn[0] = wIn[1] = wIn[2] = _cmsQuickSaturateWord(Inks[0] * 65535.0);
+
+    return accum + sizeof(cmsFloat64Number);
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+
+// For anything going from cmsFloat32Number
+static
+cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info,
+                                    cmsFloat32Number wIn[],
+                                    cmsUInt8Number* accum,
+                                    cmsUInt32Number Stride)
+{
+
+    int nChan      = T_CHANNELS(info -> InputFormat);
+    int DoSwap     = T_DOSWAP(info ->InputFormat);
+    int Reverse    = T_FLAVOR(info ->InputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);
+    int Extra      = T_EXTRA(info -> InputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    int Planar     = T_PLANAR(info -> InputFormat);
+    cmsFloat32Number v;
+    int i, start = 0;
+    cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F;
+
+
+    if (ExtraFirst)
+            start = Extra;
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        if (Planar)
+            v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride];
+        else
+            v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start];
+
+        v /= maximum;
+
+        wIn[index] = Reverse ? 1 - v : v;
+    }
+
+
+    if (Extra == 0 && SwapFirst) {
+        cmsFloat32Number tmp = wIn[0];
+
+        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number));
+        wIn[nChan-1] = tmp;
+    }
+
+    if (T_PLANAR(info -> InputFormat))
+        return accum + sizeof(cmsFloat32Number);
+    else
+        return accum + (nChan + Extra) * sizeof(cmsFloat32Number);
+}
+
+// For anything going from double
+
+static
+cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info,
+                                    cmsFloat32Number wIn[],
+                                    cmsUInt8Number* accum,
+                                    cmsUInt32Number Stride)
+{
+
+    int nChan      = T_CHANNELS(info -> InputFormat);
+    int DoSwap     = T_DOSWAP(info ->InputFormat);
+    int Reverse    = T_FLAVOR(info ->InputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);
+    int Extra      = T_EXTRA(info -> InputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    int Planar     = T_PLANAR(info -> InputFormat);
+    cmsFloat64Number v;
+    int i, start = 0;
+    cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0;
+
+
+    if (ExtraFirst)
+            start = Extra;
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        if (Planar)
+            v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[(i + start)  * Stride];
+        else
+            v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[i + start];
+
+        v /= maximum;
+
+        wIn[index] = (cmsFloat32Number) (Reverse ? 1.0 - v : v);
+    }
+
+
+    if (Extra == 0 && SwapFirst) {
+        cmsFloat32Number tmp = wIn[0];
+
+        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number));
+        wIn[nChan-1] = tmp;
+    }
+
+    if (T_PLANAR(info -> InputFormat))
+        return accum + sizeof(cmsFloat64Number);
+    else
+        return accum + (nChan + Extra) * sizeof(cmsFloat64Number);
+}
+
+
+
+// From Lab double to cmsFloat32Number
+static
+cmsUInt8Number* UnrollLabDoubleToFloat(_cmsTRANSFORM* info,
+                                       cmsFloat32Number wIn[],
+                                       cmsUInt8Number* accum,
+                                       cmsUInt32Number Stride)
+{
+    cmsFloat64Number* Pt = (cmsFloat64Number*) accum;
+
+    if (T_PLANAR(info -> InputFormat)) {
+
+        wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0);                            // from 0..100 to 0..1
+        wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0);    // form -128..+127 to 0..1
+        wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0);
+
+        return accum + sizeof(cmsFloat64Number);
+    }
+    else {
+
+        wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0);            // from 0..100 to 0..1
+        wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0);    // form -128..+127 to 0..1
+        wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0);
+
+        accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat));
+        return accum;
+    }
+}
+
+// From Lab double to cmsFloat32Number
+static
+cmsUInt8Number* UnrollLabFloatToFloat(_cmsTRANSFORM* info,
+                                      cmsFloat32Number wIn[],
+                                      cmsUInt8Number* accum,
+                                      cmsUInt32Number Stride)
+{
+    cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
+
+    if (T_PLANAR(info -> InputFormat)) {
+
+        wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0);                 // from 0..100 to 0..1
+        wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0);    // form -128..+127 to 0..1
+        wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0);
+
+        return accum + sizeof(cmsFloat32Number);
+    }
+    else {
+
+        wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0);            // from 0..100 to 0..1
+        wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0);    // form -128..+127 to 0..1
+        wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0);
+
+        accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat));
+        return accum;
+    }
+}
+
+
+
+// 1.15 fixed point, that means maximum value is MAX_ENCODEABLE_XYZ (0xFFFF)
+static
+cmsUInt8Number* UnrollXYZDoubleToFloat(_cmsTRANSFORM* info,
+                                       cmsFloat32Number wIn[],
+                                       cmsUInt8Number* accum,
+                                       cmsUInt32Number Stride)
+{
+    cmsFloat64Number* Pt = (cmsFloat64Number*) accum;
+
+    if (T_PLANAR(info -> InputFormat)) {
+
+        wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
+        wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ);
+        wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ);
+
+        return accum + sizeof(cmsFloat64Number);
+    }
+    else {
+
+        wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
+        wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ);
+        wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ);
+
+        accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat));
+        return accum;
+    }
+}
+
+static
+cmsUInt8Number* UnrollXYZFloatToFloat(_cmsTRANSFORM* info,
+                                      cmsFloat32Number wIn[],
+                                      cmsUInt8Number* accum,
+                                      cmsUInt32Number Stride)
+{
+    cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
+
+    if (T_PLANAR(info -> InputFormat)) {
+
+        wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
+        wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ);
+        wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ);
+
+        return accum + sizeof(cmsFloat32Number);
+    }
+    else {
+
+        wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
+        wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ);
+        wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ);
+
+        accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat));
+        return accum;
+    }
+}
+
+
+
+// Packing routines -----------------------------------------------------------------------------------------------------------
+
+
+// Generic chunky for byte
+
+static
+cmsUInt8Number* PackAnyBytes(register _cmsTRANSFORM* info,
+                             register cmsUInt16Number wOut[],
+                             register cmsUInt8Number* output,
+                             register cmsUInt32Number Stride)
+{
+    int nChan      = T_CHANNELS(info -> OutputFormat);
+    int DoSwap     = T_DOSWAP(info ->OutputFormat);
+    int Reverse    = T_FLAVOR(info ->OutputFormat);
+    int Extra      = T_EXTRA(info -> OutputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    cmsUInt8Number* swap1;
+    cmsUInt8Number v = 0;
+    int i;
+
+    swap1 = output;
+
+    if (ExtraFirst) {
+        output += Extra;
+    }
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        v = FROM_16_TO_8(wOut[index]);
+
+        if (Reverse)
+            v = REVERSE_FLAVOR_8(v);
+
+        *output++ = v;
+    }
+
+    if (!ExtraFirst) {
+        output += Extra;
+    }
+
+    if (Extra == 0 && SwapFirst) {
+
+        memmove(swap1 + 1, swap1, nChan-1);
+        *swap1 = v;
+    }
+
+
+    return output;
+
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+
+static
+cmsUInt8Number* PackAnyWords(register _cmsTRANSFORM* info,
+                             register cmsUInt16Number wOut[],
+                             register cmsUInt8Number* output,
+                             register cmsUInt32Number Stride)
+{
+    int nChan      = T_CHANNELS(info -> OutputFormat);
+    int SwapEndian = T_ENDIAN16(info -> InputFormat);
+    int DoSwap     = T_DOSWAP(info ->OutputFormat);
+    int Reverse    = T_FLAVOR(info ->OutputFormat);
+    int Extra      = T_EXTRA(info -> OutputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    cmsUInt16Number* swap1;
+    cmsUInt16Number v = 0;
+    int i;
+
+    swap1 = (cmsUInt16Number*) output;
+
+    if (ExtraFirst) {
+        output += Extra * sizeof(cmsUInt16Number);
+    }
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        v = wOut[index];
+
+        if (SwapEndian)
+            v = CHANGE_ENDIAN(v);
+
+        if (Reverse)
+            v = REVERSE_FLAVOR_16(v);
+
+        *(cmsUInt16Number*) output = v;
+
+        output += sizeof(cmsUInt16Number);
+    }
+
+    if (!ExtraFirst) {
+        output += Extra * sizeof(cmsUInt16Number);
+    }
+
+    if (Extra == 0 && SwapFirst) {
+
+        memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number));
+        *swap1 = v;
+    }
+
+
+    return output;
+
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* PackPlanarBytes(register _cmsTRANSFORM* info,
+                                register cmsUInt16Number wOut[],
+                                register cmsUInt8Number* output,
+                                register cmsUInt32Number Stride)
+{
+    int nChan     = T_CHANNELS(info -> OutputFormat);
+    int DoSwap    = T_DOSWAP(info ->OutputFormat);
+    int SwapFirst = T_SWAPFIRST(info ->OutputFormat);
+    int Reverse   = T_FLAVOR(info ->OutputFormat);
+    int i;
+    cmsUInt8Number* Init = output;
+
+
+    if (DoSwap ^ SwapFirst) {
+        output += T_EXTRA(info -> OutputFormat) * Stride;
+    }
+
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+        cmsUInt8Number v = FROM_16_TO_8(wOut[index]);
+
+        *(cmsUInt8Number*)  output = (cmsUInt8Number) (Reverse ? REVERSE_FLAVOR_8(v) : v);
+        output += Stride;
+    }
+
+    return (Init + 1);
+
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* PackPlanarWords(register _cmsTRANSFORM* info,
+                                register cmsUInt16Number wOut[],
+                                register cmsUInt8Number* output,
+                                register cmsUInt32Number Stride)
+{
+    int nChan = T_CHANNELS(info -> OutputFormat);
+    int DoSwap = T_DOSWAP(info ->OutputFormat);
+    int Reverse= T_FLAVOR(info ->OutputFormat);
+    int SwapEndian = T_ENDIAN16(info -> OutputFormat);
+    int i;
+    cmsUInt8Number* Init = output;
+    cmsUInt16Number v;
+
+    if (DoSwap) {
+        output += T_EXTRA(info -> OutputFormat) * Stride * sizeof(cmsUInt16Number);
+    }
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        v = wOut[index];
+
+        if (SwapEndian)
+            v = CHANGE_ENDIAN(v);
+
+        if (Reverse)
+            v =  REVERSE_FLAVOR_16(v);
+
+        *(cmsUInt16Number*) output = v;
+        output += (Stride * sizeof(cmsUInt16Number));
+    }
+
+    return (Init + sizeof(cmsUInt16Number));
+}
+
+// CMYKcm (unrolled for speed)
+
+static
+cmsUInt8Number* Pack6Bytes(register _cmsTRANSFORM* info,
+                           register cmsUInt16Number wOut[],
+                           register cmsUInt8Number* output,
+                           register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(wOut[0]);
+    *output++ = FROM_16_TO_8(wOut[1]);
+    *output++ = FROM_16_TO_8(wOut[2]);
+    *output++ = FROM_16_TO_8(wOut[3]);
+    *output++ = FROM_16_TO_8(wOut[4]);
+    *output++ = FROM_16_TO_8(wOut[5]);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+// KCMYcm
+
+static
+cmsUInt8Number* Pack6BytesSwap(register _cmsTRANSFORM* info,
+                               register cmsUInt16Number wOut[],
+                               register cmsUInt8Number* output,
+                               register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(wOut[5]);
+    *output++ = FROM_16_TO_8(wOut[4]);
+    *output++ = FROM_16_TO_8(wOut[3]);
+    *output++ = FROM_16_TO_8(wOut[2]);
+    *output++ = FROM_16_TO_8(wOut[1]);
+    *output++ = FROM_16_TO_8(wOut[0]);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+// CMYKcm
+static
+cmsUInt8Number* Pack6Words(register _cmsTRANSFORM* info,
+                           register cmsUInt16Number wOut[],
+                           register cmsUInt8Number* output,
+                           register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[1];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[2];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[3];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[4];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[5];
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+// KCMYcm
+static
+cmsUInt8Number* Pack6WordsSwap(register _cmsTRANSFORM* info,
+                               register cmsUInt16Number wOut[],
+                               register cmsUInt8Number* output,
+                               register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = wOut[5];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[4];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[3];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[2];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[1];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack4Bytes(register _cmsTRANSFORM* info,
+                           register cmsUInt16Number wOut[],
+                           register cmsUInt8Number* output,
+                           register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(wOut[0]);
+    *output++ = FROM_16_TO_8(wOut[1]);
+    *output++ = FROM_16_TO_8(wOut[2]);
+    *output++ = FROM_16_TO_8(wOut[3]);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack4BytesReverse(register _cmsTRANSFORM* info,
+                                  register cmsUInt16Number wOut[],
+                                  register cmsUInt8Number* output,
+                                  register cmsUInt32Number Stride)
+{
+    *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[0]));
+    *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[1]));
+    *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[2]));
+    *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[3]));
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack4BytesSwapFirst(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wOut[],
+                                    register cmsUInt8Number* output,
+                                    register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(wOut[3]);
+    *output++ = FROM_16_TO_8(wOut[0]);
+    *output++ = FROM_16_TO_8(wOut[1]);
+    *output++ = FROM_16_TO_8(wOut[2]);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+// ABGR
+static
+cmsUInt8Number* Pack4BytesSwap(register _cmsTRANSFORM* info,
+                               register cmsUInt16Number wOut[],
+                               register cmsUInt8Number* output,
+                               register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(wOut[3]);
+    *output++ = FROM_16_TO_8(wOut[2]);
+    *output++ = FROM_16_TO_8(wOut[1]);
+    *output++ = FROM_16_TO_8(wOut[0]);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack4BytesSwapSwapFirst(register _cmsTRANSFORM* info,
+                                        register cmsUInt16Number wOut[],
+                                        register cmsUInt8Number* output,
+                                        register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(wOut[2]);
+    *output++ = FROM_16_TO_8(wOut[1]);
+    *output++ = FROM_16_TO_8(wOut[0]);
+    *output++ = FROM_16_TO_8(wOut[3]);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack4Words(register _cmsTRANSFORM* info,
+                           register cmsUInt16Number wOut[],
+                           register cmsUInt8Number* output,
+                           register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[1];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[2];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[3];
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack4WordsReverse(register _cmsTRANSFORM* info,
+                                  register cmsUInt16Number wOut[],
+                                  register cmsUInt8Number* output,
+                                  register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]);
+    output+= 2;
+    *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[1]);
+    output+= 2;
+    *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[2]);
+    output+= 2;
+    *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[3]);
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+// ABGR
+static
+cmsUInt8Number* Pack4WordsSwap(register _cmsTRANSFORM* info,
+                               register cmsUInt16Number wOut[],
+                               register cmsUInt8Number* output,
+                               register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = wOut[3];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[2];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[1];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+// CMYK
+static
+cmsUInt8Number* Pack4WordsBigEndian(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wOut[],
+                                    register cmsUInt8Number* output,
+                                    register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]);
+    output+= 2;
+    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]);
+    output+= 2;
+    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]);
+    output+= 2;
+    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[3]);
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* PackLabV2_8(register _cmsTRANSFORM* info,
+                            register cmsUInt16Number wOut[],
+                            register cmsUInt8Number* output,
+                            register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0]));
+    *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1]));
+    *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2]));
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* PackALabV2_8(register _cmsTRANSFORM* info,
+                             register cmsUInt16Number wOut[],
+                             register cmsUInt8Number* output,
+                             register cmsUInt32Number Stride)
+{
+    output++;
+    *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0]));
+    *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1]));
+    *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2]));
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* PackLabV2_16(register _cmsTRANSFORM* info,
+                             register cmsUInt16Number wOut[],
+                             register cmsUInt8Number* output,
+                             register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[0]);
+    output += 2;
+    *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[1]);
+    output += 2;
+    *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[2]);
+    output += 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3Bytes(register _cmsTRANSFORM* info,
+                           register cmsUInt16Number wOut[],
+                           register cmsUInt8Number* output,
+                           register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(wOut[0]);
+    *output++ = FROM_16_TO_8(wOut[1]);
+    *output++ = FROM_16_TO_8(wOut[2]);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesOptimized(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wOut[],
+                                    register cmsUInt8Number* output,
+                                    register cmsUInt32Number Stride)
+{
+    *output++ = (wOut[0] & 0xFF);
+    *output++ = (wOut[1] & 0xFF);
+    *output++ = (wOut[2] & 0xFF);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesSwap(register _cmsTRANSFORM* info,
+                               register cmsUInt16Number wOut[],
+                               register cmsUInt8Number* output,
+                               register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(wOut[2]);
+    *output++ = FROM_16_TO_8(wOut[1]);
+    *output++ = FROM_16_TO_8(wOut[0]);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesSwapOptimized(register _cmsTRANSFORM* info,
+                                        register cmsUInt16Number wOut[],
+                                        register cmsUInt8Number* output,
+                                        register cmsUInt32Number Stride)
+{
+    *output++ = (wOut[2] & 0xFF);
+    *output++ = (wOut[1] & 0xFF);
+    *output++ = (wOut[0] & 0xFF);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack3Words(register _cmsTRANSFORM* info,
+                           register cmsUInt16Number wOut[],
+                           register cmsUInt8Number* output,
+                           register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[1];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[2];
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3WordsSwap(register _cmsTRANSFORM* info,
+                               register cmsUInt16Number wOut[],
+                               register cmsUInt8Number* output,
+                               register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = wOut[2];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[1];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3WordsBigEndian(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wOut[],
+                                    register cmsUInt8Number* output,
+                                    register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]);
+    output+= 2;
+    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]);
+    output+= 2;
+    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]);
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1(register _cmsTRANSFORM* info,
+                                   register cmsUInt16Number wOut[],
+                                   register cmsUInt8Number* output,
+                                   register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(wOut[0]);
+    *output++ = FROM_16_TO_8(wOut[1]);
+    *output++ = FROM_16_TO_8(wOut[2]);
+    output++;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1Optimized(register _cmsTRANSFORM* info,
+                                            register cmsUInt16Number wOut[],
+                                            register cmsUInt8Number* output,
+                                            register cmsUInt32Number Stride)
+{
+    *output++ = (wOut[0] & 0xFF);
+    *output++ = (wOut[1] & 0xFF);
+    *output++ = (wOut[2] & 0xFF);
+    output++;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1SwapFirst(register _cmsTRANSFORM* info,
+                                            register cmsUInt16Number wOut[],
+                                            register cmsUInt8Number* output,
+                                            register cmsUInt32Number Stride)
+{
+    output++;
+    *output++ = FROM_16_TO_8(wOut[0]);
+    *output++ = FROM_16_TO_8(wOut[1]);
+    *output++ = FROM_16_TO_8(wOut[2]);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1SwapFirstOptimized(register _cmsTRANSFORM* info,
+                                                     register cmsUInt16Number wOut[],
+                                                     register cmsUInt8Number* output,
+                                                     register cmsUInt32Number Stride)
+{
+    output++;
+    *output++ = (wOut[0] & 0xFF);
+    *output++ = (wOut[1] & 0xFF);
+    *output++ = (wOut[2] & 0xFF);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1Swap(register _cmsTRANSFORM* info,
+                                       register cmsUInt16Number wOut[],
+                                       register cmsUInt8Number* output,
+                                       register cmsUInt32Number Stride)
+{
+    output++;
+    *output++ = FROM_16_TO_8(wOut[2]);
+    *output++ = FROM_16_TO_8(wOut[1]);
+    *output++ = FROM_16_TO_8(wOut[0]);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1SwapOptimized(register _cmsTRANSFORM* info,
+                                                register cmsUInt16Number wOut[],
+                                                register cmsUInt8Number* output,
+                                                register cmsUInt32Number Stride)
+{
+    output++;
+    *output++ = (wOut[2] & 0xFF);
+    *output++ = (wOut[1] & 0xFF);
+    *output++ = (wOut[0] & 0xFF);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirst(register _cmsTRANSFORM* info,
+                                                register cmsUInt16Number wOut[],
+                                                register cmsUInt8Number* output,
+                                                register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(wOut[2]);
+    *output++ = FROM_16_TO_8(wOut[1]);
+    *output++ = FROM_16_TO_8(wOut[0]);
+    output++;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirstOptimized(register _cmsTRANSFORM* info,
+                                                         register cmsUInt16Number wOut[],
+                                                         register cmsUInt8Number* output,
+                                                         register cmsUInt32Number Stride)
+{
+    *output++ = (wOut[2] & 0xFF);
+    *output++ = (wOut[1] & 0xFF);
+    *output++ = (wOut[0] & 0xFF);
+    output++;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3WordsAndSkip1(register _cmsTRANSFORM* info,
+                                   register cmsUInt16Number wOut[],
+                                   register cmsUInt8Number* output,
+                                   register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[1];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[2];
+    output+= 2;
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3WordsAndSkip1Swap(register _cmsTRANSFORM* info,
+                                       register cmsUInt16Number wOut[],
+                                       register cmsUInt8Number* output,
+                                       register cmsUInt32Number Stride)
+{
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[2];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[1];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack3WordsAndSkip1SwapFirst(register _cmsTRANSFORM* info,
+                                            register cmsUInt16Number wOut[],
+                                            register cmsUInt8Number* output,
+                                            register cmsUInt32Number Stride)
+{
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[1];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[2];
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack3WordsAndSkip1SwapSwapFirst(register _cmsTRANSFORM* info,
+                                                register cmsUInt16Number wOut[],
+                                                register cmsUInt8Number* output,
+                                                register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = wOut[2];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[1];
+    output+= 2;
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 2;
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+
+static
+cmsUInt8Number* Pack1Byte(register _cmsTRANSFORM* info,
+                          register cmsUInt16Number wOut[],
+                          register cmsUInt8Number* output,
+                          register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(wOut[0]);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack1ByteReversed(register _cmsTRANSFORM* info,
+                                  register cmsUInt16Number wOut[],
+                                  register cmsUInt8Number* output,
+                                  register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(REVERSE_FLAVOR_16(wOut[0]));
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack1ByteSkip1(register _cmsTRANSFORM* info,
+                               register cmsUInt16Number wOut[],
+                               register cmsUInt8Number* output,
+                               register cmsUInt32Number Stride)
+{
+    *output++ = FROM_16_TO_8(wOut[0]);
+    output++;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack1ByteSkip1SwapFirst(register _cmsTRANSFORM* info,
+                                        register cmsUInt16Number wOut[],
+                                        register cmsUInt8Number* output,
+                                        register cmsUInt32Number Stride)
+{
+    output++;
+    *output++ = FROM_16_TO_8(wOut[0]);
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack1Word(register _cmsTRANSFORM* info,
+                          register cmsUInt16Number wOut[],
+                          register cmsUInt8Number* output,
+                          register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack1WordReversed(register _cmsTRANSFORM* info,
+                                  register cmsUInt16Number wOut[],
+                                  register cmsUInt8Number* output,
+                                  register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]);
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack1WordBigEndian(register _cmsTRANSFORM* info,
+                                   register cmsUInt16Number wOut[],
+                                   register cmsUInt8Number* output,
+                                   register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]);
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack1WordSkip1(register _cmsTRANSFORM* info,
+                               register cmsUInt16Number wOut[],
+                               register cmsUInt8Number* output,
+                               register cmsUInt32Number Stride)
+{
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 4;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack1WordSkip1SwapFirst(register _cmsTRANSFORM* info,
+                                        register cmsUInt16Number wOut[],
+                                        register cmsUInt8Number* output,
+                                        register cmsUInt32Number Stride)
+{
+    output += 2;
+    *(cmsUInt16Number*) output = wOut[0];
+    output+= 2;
+
+    return output;
+
+    cmsUNUSED_PARAMETER(info);
+    cmsUNUSED_PARAMETER(Stride);
+}
+
+
+// Unencoded Float values -- don't try optimize speed
+static
+cmsUInt8Number* PackLabDoubleFrom16(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wOut[],
+                                    register cmsUInt8Number* output,
+                                    register cmsUInt32Number Stride)
+{
+
+    if (T_PLANAR(info -> OutputFormat)) {
+
+        cmsCIELab  Lab;
+        cmsFloat64Number* Out = (cmsFloat64Number*) output;
+        cmsLabEncoded2Float(&Lab, wOut);
+
+        Out[0]        = Lab.L;
+        Out[Stride]   = Lab.a;
+        Out[Stride*2] = Lab.b;
+
+        return output + sizeof(cmsFloat64Number);
+    }
+    else {
+
+        cmsLabEncoded2Float((cmsCIELab*) output, wOut);
+        return output + (sizeof(cmsCIELab) + T_EXTRA(info ->OutputFormat) * sizeof(cmsFloat64Number));
+    }
+}
+
+
+static
+cmsUInt8Number* PackLabFloatFrom16(register _cmsTRANSFORM* info,
+                                    register cmsUInt16Number wOut[],
+                                    register cmsUInt8Number* output,
+                                    register cmsUInt32Number Stride)
+{
+    cmsCIELab  Lab;
+    cmsLabEncoded2Float(&Lab, wOut);
+
+    if (T_PLANAR(info -> OutputFormat)) {
+       
+        cmsFloat32Number* Out = (cmsFloat32Number*) output;
+    
+        Out[0]        = (cmsFloat32Number)Lab.L;
+        Out[Stride]   = (cmsFloat32Number)Lab.a;
+        Out[Stride*2] = (cmsFloat32Number)Lab.b;
+
+        return output + sizeof(cmsFloat32Number);
+    }
+    else {
+
+       ((cmsFloat32Number*) output)[0] = (cmsFloat32Number) Lab.L;
+       ((cmsFloat32Number*) output)[1] = (cmsFloat32Number) Lab.a;
+       ((cmsFloat32Number*) output)[2] = (cmsFloat32Number) Lab.b;
+
+        return output + (3 + T_EXTRA(info ->OutputFormat)) * sizeof(cmsFloat32Number);
+    }
+}
+
+static
+cmsUInt8Number* PackXYZDoubleFrom16(register _cmsTRANSFORM* Info,
+                                    register cmsUInt16Number wOut[],
+                                    register cmsUInt8Number* output,
+                                    register cmsUInt32Number Stride)
+{
+    if (T_PLANAR(Info -> OutputFormat)) {
+
+        cmsCIEXYZ XYZ;
+        cmsFloat64Number* Out = (cmsFloat64Number*) output;
+        cmsXYZEncoded2Float(&XYZ, wOut);
+
+        Out[0]        = XYZ.X;
+        Out[Stride]   = XYZ.Y;
+        Out[Stride*2] = XYZ.Z;
+
+        return output + sizeof(cmsFloat64Number);
+
+    }
+    else {
+
+        cmsXYZEncoded2Float((cmsCIEXYZ*) output, wOut);
+
+        return output + (sizeof(cmsCIEXYZ) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number));
+    }
+}
+
+static
+cmsUInt8Number* PackXYZFloatFrom16(register _cmsTRANSFORM* Info,
+                                   register cmsUInt16Number wOut[],
+                                   register cmsUInt8Number* output,
+                                   register cmsUInt32Number Stride)
+{
+    if (T_PLANAR(Info -> OutputFormat)) {
+
+        cmsCIEXYZ XYZ;
+        cmsFloat32Number* Out = (cmsFloat32Number*) output;
+        cmsXYZEncoded2Float(&XYZ, wOut);
+
+        Out[0]        = (cmsFloat32Number) XYZ.X;
+        Out[Stride]   = (cmsFloat32Number) XYZ.Y;
+        Out[Stride*2] = (cmsFloat32Number) XYZ.Z;
+
+        return output + sizeof(cmsFloat32Number);
+
+    }
+    else {
+
+        cmsCIEXYZ XYZ;
+        cmsFloat32Number* Out = (cmsFloat32Number*) output;
+        cmsXYZEncoded2Float(&XYZ, wOut);
+
+        Out[0] = (cmsFloat32Number) XYZ.X;
+        Out[1] = (cmsFloat32Number) XYZ.Y;
+        Out[2] = (cmsFloat32Number) XYZ.Z;
+
+        return output + (3 * sizeof(cmsFloat32Number) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number));
+    }
+}
+
+static
+cmsUInt8Number* PackDoubleFrom16(register _cmsTRANSFORM* info,
+                                register cmsUInt16Number wOut[],
+                                register cmsUInt8Number* output,
+                                register cmsUInt32Number Stride)
+{
+    int nChan      = T_CHANNELS(info -> OutputFormat);
+    int DoSwap     = T_DOSWAP(info ->OutputFormat);
+    int Reverse    = T_FLAVOR(info ->OutputFormat);
+    int Extra      = T_EXTRA(info -> OutputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
+    int Planar     = T_PLANAR(info -> OutputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0;
+    cmsFloat64Number v = 0;
+    cmsFloat64Number* swap1 = (cmsFloat64Number*) output;
+    int i, start = 0;
+
+    if (ExtraFirst)
+        start = Extra;
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        v = (cmsFloat64Number) wOut[index] / maximum;
+
+        if (Reverse)
+            v = maximum - v;
+
+        if (Planar)
+            ((cmsFloat64Number*) output)[(i + start)  * Stride]= v;
+        else
+            ((cmsFloat64Number*) output)[i + start] = v;
+    }
+
+    if (!ExtraFirst) {
+        output += Extra * sizeof(cmsFloat64Number);
+    }
+
+    if (Extra == 0 && SwapFirst) {
+
+         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number));
+        *swap1 = v;
+    }
+
+    if (T_PLANAR(info -> OutputFormat))
+        return output + sizeof(cmsFloat64Number);
+    else
+        return output + nChan * sizeof(cmsFloat64Number);
+
+}
+
+
+static
+cmsUInt8Number* PackFloatFrom16(register _cmsTRANSFORM* info,
+                                register cmsUInt16Number wOut[],
+                                register cmsUInt8Number* output,
+                                register cmsUInt32Number Stride)
+{
+    int nChan      = T_CHANNELS(info -> OutputFormat);
+    int DoSwap     = T_DOSWAP(info ->OutputFormat);
+    int Reverse    = T_FLAVOR(info ->OutputFormat);
+    int Extra      = T_EXTRA(info -> OutputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
+    int Planar     = T_PLANAR(info -> OutputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0;
+    cmsFloat64Number v = 0;
+    cmsFloat32Number* swap1 = (cmsFloat32Number*) output;
+    int i, start = 0;
+
+    if (ExtraFirst)
+        start = Extra;
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        v = (cmsFloat64Number) wOut[index] / maximum;
+
+        if (Reverse)
+            v = maximum - v;
+
+        if (Planar)
+            ((cmsFloat32Number*) output)[(i + start ) * Stride]= (cmsFloat32Number) v;
+        else
+            ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v;
+    }
+
+    if (!ExtraFirst) {
+        output += Extra * sizeof(cmsFloat32Number);
+    }
+
+  if (Extra == 0 && SwapFirst) {
+
+         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number));
+        *swap1 = (cmsFloat32Number) v;
+    }
+
+    if (T_PLANAR(info -> OutputFormat))
+        return output + sizeof(cmsFloat32Number);
+    else
+        return output + nChan * sizeof(cmsFloat32Number);
+}
+
+
+
+// --------------------------------------------------------------------------------------------------------
+
+static
+cmsUInt8Number* PackFloatsFromFloat(_cmsTRANSFORM* info,
+                                    cmsFloat32Number wOut[],
+                                    cmsUInt8Number* output,
+                                    cmsUInt32Number Stride)
+{
+    int nChan      = T_CHANNELS(info -> OutputFormat);
+    int DoSwap     = T_DOSWAP(info ->OutputFormat);
+    int Reverse    = T_FLAVOR(info ->OutputFormat);
+    int Extra      = T_EXTRA(info -> OutputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
+    int Planar     = T_PLANAR(info -> OutputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0;
+    cmsFloat32Number* swap1 = (cmsFloat32Number*) output;
+    cmsFloat64Number v = 0;
+    int i, start = 0;
+
+    if (ExtraFirst)
+        start = Extra;
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        v = wOut[index] * maximum;
+
+        if (Reverse)
+            v = maximum - v;
+
+        if (Planar)
+            ((cmsFloat32Number*) output)[(i + start)* Stride]= (cmsFloat32Number) v;
+        else
+            ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v;
+    }
+
+    if (!ExtraFirst) {
+        output += Extra * sizeof(cmsFloat32Number);
+    }
+
+   if (Extra == 0 && SwapFirst) {
+
+         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number));
+        *swap1 = (cmsFloat32Number) v;
+    }
+
+    if (T_PLANAR(info -> OutputFormat))
+        return output + sizeof(cmsFloat32Number);
+    else
+        return output + nChan * sizeof(cmsFloat32Number);
+}
+
+static
+cmsUInt8Number* PackDoublesFromFloat(_cmsTRANSFORM* info,
+                                    cmsFloat32Number wOut[],
+                                    cmsUInt8Number* output,
+                                    cmsUInt32Number Stride)
+{
+    int nChan      = T_CHANNELS(info -> OutputFormat);
+    int DoSwap     = T_DOSWAP(info ->OutputFormat);
+    int Reverse    = T_FLAVOR(info ->OutputFormat);
+    int Extra      = T_EXTRA(info -> OutputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
+    int Planar     = T_PLANAR(info -> OutputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0;
+    cmsFloat64Number v = 0;
+    cmsFloat64Number* swap1 = (cmsFloat64Number*) output;
+    int i, start = 0;
+
+    if (ExtraFirst)
+        start = Extra;
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        v = wOut[index] * maximum;
+
+        if (Reverse)
+            v = maximum - v;
+
+        if (Planar)
+            ((cmsFloat64Number*) output)[(i + start) * Stride] =  v;
+        else
+            ((cmsFloat64Number*) output)[i + start] =  v;
+    }
+
+    if (!ExtraFirst) {
+        output += Extra * sizeof(cmsFloat64Number);
+    }
+
+   if (Extra == 0 && SwapFirst) {
+
+         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number));
+        *swap1 = v;
+    }
+
+
+    if (T_PLANAR(info -> OutputFormat))
+        return output + sizeof(cmsFloat64Number);
+    else
+        return output + nChan * sizeof(cmsFloat64Number);
+
+}
+
+
+
+
+
+static
+cmsUInt8Number* PackLabFloatFromFloat(_cmsTRANSFORM* Info,
+                                      cmsFloat32Number wOut[],
+                                      cmsUInt8Number* output,
+                                      cmsUInt32Number Stride)
+{
+    cmsFloat32Number* Out = (cmsFloat32Number*) output;
+
+    if (T_PLANAR(Info -> OutputFormat)) {
+
+        Out[0]        = (cmsFloat32Number) (wOut[0] * 100.0);
+        Out[Stride]   = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0);
+        Out[Stride*2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0);
+
+        return output + sizeof(cmsFloat32Number);
+    }
+    else {
+
+        Out[0] = (cmsFloat32Number) (wOut[0] * 100.0);
+        Out[1] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0);
+        Out[2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0);
+
+        return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number));
+    }
+
+}
+
+
+static
+cmsUInt8Number* PackLabDoubleFromFloat(_cmsTRANSFORM* Info,
+                                       cmsFloat32Number wOut[],
+                                       cmsUInt8Number* output,
+                                       cmsUInt32Number Stride)
+{
+    cmsFloat64Number* Out = (cmsFloat64Number*) output;
+
+    if (T_PLANAR(Info -> OutputFormat)) {
+
+        Out[0]        = (cmsFloat64Number) (wOut[0] * 100.0);
+        Out[Stride]   = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0);
+        Out[Stride*2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0);
+
+        return output + sizeof(cmsFloat64Number);
+    }
+    else {
+
+        Out[0] = (cmsFloat64Number) (wOut[0] * 100.0);
+        Out[1] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0);
+        Out[2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0);
+
+        return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number));
+    }
+
+}
+
+
+// From 0..1 range to 0..MAX_ENCODEABLE_XYZ
+static
+cmsUInt8Number* PackXYZFloatFromFloat(_cmsTRANSFORM* Info,
+                                      cmsFloat32Number wOut[],
+                                      cmsUInt8Number* output,
+                                      cmsUInt32Number Stride)
+{
+    cmsFloat32Number* Out = (cmsFloat32Number*) output;
+
+    if (T_PLANAR(Info -> OutputFormat)) {
+
+        Out[0]        = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
+        Out[Stride]   = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
+        Out[Stride*2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
+
+        return output + sizeof(cmsFloat32Number);
+    }
+    else {
+
+        Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
+        Out[1] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
+        Out[2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
+
+        return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number));
+    }
+
+}
+
+// Same, but convert to double
+static
+cmsUInt8Number* PackXYZDoubleFromFloat(_cmsTRANSFORM* Info,
+                                       cmsFloat32Number wOut[],
+                                       cmsUInt8Number* output,
+                                       cmsUInt32Number Stride)
+{
+    cmsFloat64Number* Out = (cmsFloat64Number*) output;
+
+    if (T_PLANAR(Info -> OutputFormat)) {
+
+        Out[0]        = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
+        Out[Stride]   = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
+        Out[Stride*2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
+
+        return output + sizeof(cmsFloat64Number);
+    }
+    else {
+
+        Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
+        Out[1] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
+        Out[2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
+
+        return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number));
+    }
+
+}
+
+
+// ----------------------------------------------------------------------------------------------------------------
+
+#ifndef CMS_NO_HALF_SUPPORT 
+
+// Decodes an stream of half floats to wIn[] described by input format
+
+static
+cmsUInt8Number* UnrollHalfTo16(register _cmsTRANSFORM* info,
+                                register cmsUInt16Number wIn[],
+                                register cmsUInt8Number* accum,
+                                register cmsUInt32Number Stride)
+{
+
+    int nChan      = T_CHANNELS(info -> InputFormat);
+    int DoSwap     = T_DOSWAP(info ->InputFormat);
+    int Reverse    = T_FLAVOR(info ->InputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);
+    int Extra      = T_EXTRA(info -> InputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    int Planar     = T_PLANAR(info -> InputFormat);
+    cmsFloat32Number v;
+    int i, start = 0;
+    cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 655.35F : 65535.0F;
+
+
+    if (ExtraFirst)
+            start = Extra;
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        if (Planar)
+            v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] );
+        else
+            v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ;
+
+        if (Reverse) v = maximum - v;
+
+        wIn[index] = _cmsQuickSaturateWord(v * maximum);
+    }
+
+
+    if (Extra == 0 && SwapFirst) {
+        cmsUInt16Number tmp = wIn[0];
+
+        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
+        wIn[nChan-1] = tmp;
+    }
+
+    if (T_PLANAR(info -> InputFormat))
+        return accum + sizeof(cmsUInt16Number);
+    else
+        return accum + (nChan + Extra) * sizeof(cmsUInt16Number);
+}
+
+// Decodes an stream of half floats to wIn[] described by input format
+
+static
+cmsUInt8Number* UnrollHalfToFloat(_cmsTRANSFORM* info,
+                                    cmsFloat32Number wIn[],
+                                    cmsUInt8Number* accum,
+                                    cmsUInt32Number Stride)
+{
+
+    int nChan      = T_CHANNELS(info -> InputFormat);
+    int DoSwap     = T_DOSWAP(info ->InputFormat);
+    int Reverse    = T_FLAVOR(info ->InputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> InputFormat);
+    int Extra      = T_EXTRA(info -> InputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    int Planar     = T_PLANAR(info -> InputFormat);
+    cmsFloat32Number v;
+    int i, start = 0;
+    cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F;
+
+
+    if (ExtraFirst)
+            start = Extra;
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        if (Planar)
+            v =  _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] );
+        else
+            v =  _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ;
+
+        v /= maximum;
+
+        wIn[index] = Reverse ? 1 - v : v;
+    }
+
+
+    if (Extra == 0 && SwapFirst) {
+        cmsFloat32Number tmp = wIn[0];
+
+        memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number));
+        wIn[nChan-1] = tmp;
+    }
+
+    if (T_PLANAR(info -> InputFormat))
+        return accum + sizeof(cmsUInt16Number);
+    else
+        return accum + (nChan + Extra) * sizeof(cmsUInt16Number);
+}
+
+
+static
+cmsUInt8Number* PackHalfFrom16(register _cmsTRANSFORM* info,
+                                register cmsUInt16Number wOut[],
+                                register cmsUInt8Number* output,
+                                register cmsUInt32Number Stride)
+{
+    int nChan      = T_CHANNELS(info -> OutputFormat);
+    int DoSwap     = T_DOSWAP(info ->OutputFormat);
+    int Reverse    = T_FLAVOR(info ->OutputFormat);
+    int Extra      = T_EXTRA(info -> OutputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
+    int Planar     = T_PLANAR(info -> OutputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35F : 65535.0F;
+    cmsFloat32Number v = 0;
+    cmsUInt16Number* swap1 = (cmsUInt16Number*) output;
+    int i, start = 0;
+
+    if (ExtraFirst)
+        start = Extra;
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        v = (cmsFloat32Number) wOut[index] / maximum;
+
+        if (Reverse)
+            v = maximum - v;
+
+        if (Planar)
+            ((cmsUInt16Number*) output)[(i + start ) * Stride]= _cmsFloat2Half(v);
+        else
+            ((cmsUInt16Number*) output)[i + start] =  _cmsFloat2Half(v);
+    }
+
+    if (!ExtraFirst) {
+        output += Extra * sizeof(cmsUInt16Number);
+    }
+
+  if (Extra == 0 && SwapFirst) {
+
+         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number));
+        *swap1 = _cmsFloat2Half(v);
+    }
+
+    if (T_PLANAR(info -> OutputFormat))
+        return output + sizeof(cmsUInt16Number);
+    else
+        return output + nChan * sizeof(cmsUInt16Number);
+}
+
+
+
+static
+cmsUInt8Number* PackHalfFromFloat(_cmsTRANSFORM* info,
+                                    cmsFloat32Number wOut[],
+                                    cmsUInt8Number* output,
+                                    cmsUInt32Number Stride)
+{
+    int nChan      = T_CHANNELS(info -> OutputFormat);
+    int DoSwap     = T_DOSWAP(info ->OutputFormat);
+    int Reverse    = T_FLAVOR(info ->OutputFormat);
+    int Extra      = T_EXTRA(info -> OutputFormat);
+    int SwapFirst  = T_SWAPFIRST(info -> OutputFormat);
+    int Planar     = T_PLANAR(info -> OutputFormat);
+    int ExtraFirst = DoSwap ^ SwapFirst;
+    cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0F : 1.0F;
+    cmsUInt16Number* swap1 = (cmsUInt16Number*) output;
+    cmsFloat32Number v = 0;
+    int i, start = 0;
+
+    if (ExtraFirst)
+        start = Extra;
+
+    for (i=0; i < nChan; i++) {
+
+        int index = DoSwap ? (nChan - i - 1) : i;
+
+        v = wOut[index] * maximum;
+
+        if (Reverse)
+            v = maximum - v;
+
+        if (Planar)
+            ((cmsUInt16Number*) output)[(i + start)* Stride]= _cmsFloat2Half( v );
+        else
+            ((cmsUInt16Number*) output)[i + start] = _cmsFloat2Half( v );
+    }
+
+    if (!ExtraFirst) {
+        output += Extra * sizeof(cmsUInt16Number);
+    }
+
+   if (Extra == 0 && SwapFirst) {
+
+         memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number));
+        *swap1 = (cmsUInt16Number)  _cmsFloat2Half( v );
+    }
+
+    if (T_PLANAR(info -> OutputFormat))
+        return output + sizeof(cmsUInt16Number);
+    else
+        return output + nChan * sizeof(cmsUInt16Number);
+}
+
+#endif
+
+// ----------------------------------------------------------------------------------------------------------------
+
+
+static cmsFormatters16 InputFormatters16[] = {
+
+    //    Type                                          Mask                  Function
+    //  ----------------------------   ------------------------------------  ----------------------------
+    { TYPE_Lab_DBL,                                 ANYPLANAR|ANYEXTRA,   UnrollLabDoubleTo16},
+    { TYPE_XYZ_DBL,                                 ANYPLANAR|ANYEXTRA,   UnrollXYZDoubleTo16},
+    { TYPE_Lab_FLT,                                 ANYPLANAR|ANYEXTRA,   UnrollLabFloatTo16},
+    { TYPE_XYZ_FLT,                                 ANYPLANAR|ANYEXTRA,   UnrollXYZFloatTo16},
+    { TYPE_GRAY_DBL,                                                 0,   UnrollDouble1Chan},
+    { FLOAT_SH(1)|BYTES_SH(0), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR|
+                                             ANYSWAP|ANYEXTRA|ANYSPACE,   UnrollDoubleTo16},
+    { FLOAT_SH(1)|BYTES_SH(4), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR|
+                                             ANYSWAP|ANYEXTRA|ANYSPACE,   UnrollFloatTo16},
+#ifndef CMS_NO_HALF_SUPPORT 
+    { FLOAT_SH(1)|BYTES_SH(2), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR|
+                                            ANYEXTRA|ANYSWAP|ANYSPACE,   UnrollHalfTo16},
+#endif
+
+    { CHANNELS_SH(1)|BYTES_SH(1),                              ANYSPACE,  Unroll1Byte},
+    { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1),                  ANYSPACE,  Unroll1ByteSkip1},
+    { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(2),                  ANYSPACE,  Unroll1ByteSkip2},
+    { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1),                 ANYSPACE,  Unroll1ByteReversed},
+    { COLORSPACE_SH(PT_MCH2)|CHANNELS_SH(2)|BYTES_SH(1),              0,  Unroll2Bytes},
+
+    { TYPE_LabV2_8,                                                   0,  UnrollLabV2_8 },
+    { TYPE_ALabV2_8,                                                  0,  UnrollALabV2_8 },
+    { TYPE_LabV2_16,                                                  0,  UnrollLabV2_16 },
+
+    { CHANNELS_SH(3)|BYTES_SH(1),                              ANYSPACE,  Unroll3Bytes},
+    { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1),                 ANYSPACE,  Unroll3BytesSwap},
+    { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1),     ANYSPACE,  Unroll3BytesSkip1Swap},
+    { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|SWAPFIRST_SH(1),  ANYSPACE,  Unroll3BytesSkip1SwapFirst},
+
+    { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),  
+                                                               ANYSPACE,  Unroll3BytesSkip1SwapSwapFirst},
+
+    { CHANNELS_SH(4)|BYTES_SH(1),                              ANYSPACE,  Unroll4Bytes},
+    { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1),                 ANYSPACE,  Unroll4BytesReverse},
+    { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1),              ANYSPACE,  Unroll4BytesSwapFirst},
+    { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1),                 ANYSPACE,  Unroll4BytesSwap},
+    { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE,  Unroll4BytesSwapSwapFirst},
+
+    { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|
+                                   ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarBytes},
+
+    { BYTES_SH(1),    ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|
+                                           ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollChunkyBytes},
+
+    { CHANNELS_SH(1)|BYTES_SH(2),                              ANYSPACE,  Unroll1Word},
+    { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1),                 ANYSPACE,  Unroll1WordReversed},
+    { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(3),                  ANYSPACE,  Unroll1WordSkip3},
+
+    { CHANNELS_SH(2)|BYTES_SH(2),                              ANYSPACE,  Unroll2Words},
+    { CHANNELS_SH(3)|BYTES_SH(2),                              ANYSPACE,  Unroll3Words},
+    { CHANNELS_SH(4)|BYTES_SH(2),                              ANYSPACE,  Unroll4Words},
+
+    { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1),                 ANYSPACE,  Unroll3WordsSwap},
+    { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1),  ANYSPACE,  Unroll3WordsSkip1SwapFirst},
+    { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1),     ANYSPACE,  Unroll3WordsSkip1Swap},
+    { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1),                 ANYSPACE,  Unroll4WordsReverse},
+    { CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1),              ANYSPACE,  Unroll4WordsSwapFirst},
+    { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1),                 ANYSPACE,  Unroll4WordsSwap},
+    { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE,  Unroll4WordsSwapSwapFirst},
+
+
+    { BYTES_SH(2)|PLANAR_SH(1),  ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE,  UnrollPlanarWords},
+    { BYTES_SH(2),  ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE,  UnrollAnyWords},
+};
+
+
+
+static cmsFormattersFloat InputFormattersFloat[] = {
+
+    //    Type                                          Mask                  Function
+    //  ----------------------------   ------------------------------------  ----------------------------
+    {     TYPE_Lab_DBL,                                ANYPLANAR|ANYEXTRA,   UnrollLabDoubleToFloat},
+    {     TYPE_Lab_FLT,                                ANYPLANAR|ANYEXTRA,   UnrollLabFloatToFloat},
+
+    {     TYPE_XYZ_DBL,                                ANYPLANAR|ANYEXTRA,   UnrollXYZDoubleToFloat},
+    {     TYPE_XYZ_FLT,                                ANYPLANAR|ANYEXTRA,   UnrollXYZFloatToFloat},
+
+    {     FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|
+                                                      ANYCHANNELS|ANYSPACE,  UnrollFloatsToFloat},
+
+    {     FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|
+                                                        ANYCHANNELS|ANYSPACE,  UnrollDoublesToFloat},
+#ifndef CMS_NO_HALF_SUPPORT 
+    {     FLOAT_SH(1)|BYTES_SH(2), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|
+                                                        ANYCHANNELS|ANYSPACE,  UnrollHalfToFloat},
+#endif
+};
+
+
+// Bit fields set to one in the mask are not compared
+static
+cmsFormatter _cmsGetStockInputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags)
+{
+    cmsUInt32Number i;
+    cmsFormatter fr;
+
+    switch (dwFlags) {
+
+    case CMS_PACK_FLAGS_16BITS: {
+        for (i=0; i < sizeof(InputFormatters16) / sizeof(cmsFormatters16); i++) {
+            cmsFormatters16* f = InputFormatters16 + i;
+
+            if ((dwInput & ~f ->Mask) == f ->Type) {
+                fr.Fmt16 = f ->Frm;
+                return fr;
+            }
+        }
+    }
+    break;
+
+    case CMS_PACK_FLAGS_FLOAT: {
+        for (i=0; i < sizeof(InputFormattersFloat) / sizeof(cmsFormattersFloat); i++) {
+            cmsFormattersFloat* f = InputFormattersFloat + i;
+
+            if ((dwInput & ~f ->Mask) == f ->Type) {
+                fr.FmtFloat = f ->Frm;
+                return fr;
+            }
+        }
+    }
+    break;
+
+    default:;
+
+    }
+
+    fr.Fmt16 = NULL;
+    return fr;
+}
+
+static cmsFormatters16 OutputFormatters16[] = {
+    //    Type                                          Mask                  Function
+    //  ----------------------------   ------------------------------------  ----------------------------
+
+    { TYPE_Lab_DBL,                                      ANYPLANAR|ANYEXTRA,  PackLabDoubleFrom16},
+    { TYPE_XYZ_DBL,                                      ANYPLANAR|ANYEXTRA,  PackXYZDoubleFrom16},
+
+    { TYPE_Lab_FLT,                                      ANYPLANAR|ANYEXTRA,  PackLabFloatFrom16},
+    { TYPE_XYZ_FLT,                                      ANYPLANAR|ANYEXTRA,  PackXYZFloatFrom16},
+    
+    { FLOAT_SH(1)|BYTES_SH(0),      ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|
+                                    ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE,  PackDoubleFrom16},
+    { FLOAT_SH(1)|BYTES_SH(4),      ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|
+                                    ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE,  PackFloatFrom16},
+#ifndef CMS_NO_HALF_SUPPORT 
+    { FLOAT_SH(1)|BYTES_SH(2),      ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|
+                                    ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE,  PackHalfFrom16},
+#endif
+
+    { CHANNELS_SH(1)|BYTES_SH(1),                                  ANYSPACE,  Pack1Byte},
+    { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1),                      ANYSPACE,  Pack1ByteSkip1},
+    { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1),      ANYSPACE,  Pack1ByteSkip1SwapFirst},
+
+    { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1),                     ANYSPACE,  Pack1ByteReversed},
+
+    { TYPE_LabV2_8,                                                       0,  PackLabV2_8 },
+    { TYPE_ALabV2_8,                                                      0,  PackALabV2_8 },
+    { TYPE_LabV2_16,                                                      0,  PackLabV2_16 },
+
+    { CHANNELS_SH(3)|BYTES_SH(1)|OPTIMIZED_SH(1),                  ANYSPACE,  Pack3BytesOptimized},
+    { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1),      ANYSPACE,  Pack3BytesAndSkip1Optimized},
+    { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1),
+                                                                   ANYSPACE,  Pack3BytesAndSkip1SwapFirstOptimized},
+    { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1),
+                                                                   ANYSPACE,  Pack3BytesAndSkip1SwapSwapFirstOptimized},
+    { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1),
+                                                                   ANYSPACE,  Pack3BytesAndSkip1SwapOptimized},
+    { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|OPTIMIZED_SH(1),     ANYSPACE,  Pack3BytesSwapOptimized},
+
+
+
+    { CHANNELS_SH(3)|BYTES_SH(1),                                  ANYSPACE,  Pack3Bytes},
+    { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1),                      ANYSPACE,  Pack3BytesAndSkip1},
+    { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1),      ANYSPACE,  Pack3BytesAndSkip1SwapFirst},
+    { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),
+                                                                   ANYSPACE,  Pack3BytesAndSkip1SwapSwapFirst},
+    { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1),         ANYSPACE,  Pack3BytesAndSkip1Swap},
+    { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1),                     ANYSPACE,  Pack3BytesSwap},
+    { CHANNELS_SH(6)|BYTES_SH(1),                                  ANYSPACE,  Pack6Bytes},
+    { CHANNELS_SH(6)|BYTES_SH(1)|DOSWAP_SH(1),                     ANYSPACE,  Pack6BytesSwap},
+    { CHANNELS_SH(4)|BYTES_SH(1),                                  ANYSPACE,  Pack4Bytes},
+    { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1),                     ANYSPACE,  Pack4BytesReverse},
+    { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1),                  ANYSPACE,  Pack4BytesSwapFirst},
+    { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1),                     ANYSPACE,  Pack4BytesSwap},
+    { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),     ANYSPACE,  Pack4BytesSwapSwapFirst},
+
+    { BYTES_SH(1),                 ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackAnyBytes},
+    { BYTES_SH(1)|PLANAR_SH(1),    ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarBytes},
+
+    { CHANNELS_SH(1)|BYTES_SH(2),                                  ANYSPACE,  Pack1Word},
+    { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1),                      ANYSPACE,  Pack1WordSkip1},
+    { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1),      ANYSPACE,  Pack1WordSkip1SwapFirst},
+    { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1),                     ANYSPACE,  Pack1WordReversed},
+    { CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1),                   ANYSPACE,  Pack1WordBigEndian},
+    { CHANNELS_SH(3)|BYTES_SH(2),                                  ANYSPACE,  Pack3Words},
+    { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1),                     ANYSPACE,  Pack3WordsSwap},
+    { CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1),                   ANYSPACE,  Pack3WordsBigEndian},
+    { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1),                      ANYSPACE,  Pack3WordsAndSkip1},
+    { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1),         ANYSPACE,  Pack3WordsAndSkip1Swap},
+    { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1),      ANYSPACE,  Pack3WordsAndSkip1SwapFirst},
+
+    { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),
+                                                                   ANYSPACE,  Pack3WordsAndSkip1SwapSwapFirst},
+
+    { CHANNELS_SH(4)|BYTES_SH(2),                                  ANYSPACE,  Pack4Words},
+    { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1),                     ANYSPACE,  Pack4WordsReverse},
+    { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1),                     ANYSPACE,  Pack4WordsSwap},
+    { CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1),                   ANYSPACE,  Pack4WordsBigEndian},
+
+    { CHANNELS_SH(6)|BYTES_SH(2),                                  ANYSPACE,  Pack6Words},
+    { CHANNELS_SH(6)|BYTES_SH(2)|DOSWAP_SH(1),                     ANYSPACE,  Pack6WordsSwap},
+
+    { BYTES_SH(2)|PLANAR_SH(1),     ANYFLAVOR|ANYENDIAN|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarWords},
+    { BYTES_SH(2),                  ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackAnyWords}
+
+};
+
+
+static cmsFormattersFloat OutputFormattersFloat[] = {
+    //    Type                                          Mask                                 Function
+    //  ----------------------------   ---------------------------------------------------  ----------------------------
+    {     TYPE_Lab_FLT,                                                ANYPLANAR|ANYEXTRA,   PackLabFloatFromFloat},
+    {     TYPE_XYZ_FLT,                                                ANYPLANAR|ANYEXTRA,   PackXYZFloatFromFloat},
+
+    {     TYPE_Lab_DBL,                                                ANYPLANAR|ANYEXTRA,   PackLabDoubleFromFloat},
+    {     TYPE_XYZ_DBL,                                                ANYPLANAR|ANYEXTRA,   PackXYZDoubleFromFloat},
+
+    {     FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|
+                             ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE,   PackFloatsFromFloat },
+    {     FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|
+                             ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE,   PackDoublesFromFloat },
+#ifndef CMS_NO_HALF_SUPPORT 
+    {     FLOAT_SH(1)|BYTES_SH(2),                                   
+                             ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE,   PackHalfFromFloat },
+#endif
+
+
+
+};
+
+
+// Bit fields set to one in the mask are not compared
+static
+cmsFormatter _cmsGetStockOutputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags)
+{
+    cmsUInt32Number i;
+    cmsFormatter fr;
+
+
+    switch (dwFlags)
+    {
+
+     case CMS_PACK_FLAGS_16BITS: {
+
+        for (i=0; i < sizeof(OutputFormatters16) / sizeof(cmsFormatters16); i++) {
+            cmsFormatters16* f = OutputFormatters16 + i;
+
+            if ((dwInput & ~f ->Mask) == f ->Type) {
+                fr.Fmt16 = f ->Frm;
+                return fr;
+            }
+        }
+        }
+        break;
+
+    case CMS_PACK_FLAGS_FLOAT: {
+
+        for (i=0; i < sizeof(OutputFormattersFloat) / sizeof(cmsFormattersFloat); i++) {
+            cmsFormattersFloat* f = OutputFormattersFloat + i;
+
+            if ((dwInput & ~f ->Mask) == f ->Type) {
+                fr.FmtFloat = f ->Frm;
+                return fr;
+            }
+        }
+        }
+        break;
+
+    default:;
+
+    }
+
+    fr.Fmt16 = NULL;
+    return fr;
+}
+
+
+typedef struct _cms_formatters_factory_list {
+
+    cmsFormatterFactory Factory;
+    struct _cms_formatters_factory_list *Next;
+
+} cmsFormattersFactoryList;
+
+_cmsFormattersPluginChunkType _cmsFormattersPluginChunk = { NULL };
+
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupFormatterFactoryList(struct _cmsContext_struct* ctx, 
+                                               const struct _cmsContext_struct* src)
+{
+   _cmsFormattersPluginChunkType newHead = { NULL };
+   cmsFormattersFactoryList*  entry;
+   cmsFormattersFactoryList*  Anterior = NULL;
+   _cmsFormattersPluginChunkType* head = (_cmsFormattersPluginChunkType*) src->chunks[FormattersPlugin];
+
+     _cmsAssert(head != NULL);
+
+   // Walk the list copying all nodes
+   for (entry = head->FactoryList;
+       entry != NULL;
+       entry = entry ->Next) {
+
+           cmsFormattersFactoryList *newEntry = ( cmsFormattersFactoryList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsFormattersFactoryList));
+
+           if (newEntry == NULL) 
+               return;
+
+           // We want to keep the linked list order, so this is a little bit tricky
+           newEntry -> Next = NULL;
+           if (Anterior)
+               Anterior -> Next = newEntry;
+
+           Anterior = newEntry;
+
+           if (newHead.FactoryList == NULL)
+               newHead.FactoryList = newEntry;
+   }
+
+   ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsFormattersPluginChunkType));
+}
+
+// The interpolation plug-in memory chunk allocator/dup
+void _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx, 
+                                    const struct _cmsContext_struct* src)
+{
+      _cmsAssert(ctx != NULL);
+
+     if (src != NULL) {
+        
+         // Duplicate the LIST
+         DupFormatterFactoryList(ctx, src);
+     }
+     else {
+          static _cmsFormattersPluginChunkType FormattersPluginChunk = { NULL };
+          ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx ->MemPool, &FormattersPluginChunk, sizeof(_cmsFormattersPluginChunkType));
+     }
+}
+
+
+
+// Formatters management
+cmsBool  _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Data)
+{
+    _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin);
+    cmsPluginFormatters* Plugin = (cmsPluginFormatters*) Data;
+    cmsFormattersFactoryList* fl ;
+
+    // Reset to built-in defaults
+    if (Data == NULL) {
+
+          ctx ->FactoryList = NULL;
+          return TRUE;
+    }
+
+    fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(ContextID, sizeof(cmsFormattersFactoryList));
+    if (fl == NULL) return FALSE;
+
+    fl ->Factory    = Plugin ->FormattersFactory;
+
+    fl ->Next = ctx -> FactoryList;
+    ctx ->FactoryList = fl;
+
+    return TRUE;
+}
+
+cmsFormatter _cmsGetFormatter(cmsContext ContextID,
+                             cmsUInt32Number Type,         // Specific type, i.e. TYPE_RGB_8
+                             cmsFormatterDirection Dir,
+                             cmsUInt32Number dwFlags)
+{
+    _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin);
+    cmsFormattersFactoryList* f;
+
+    for (f =ctx->FactoryList; f != NULL; f = f ->Next) {
+
+        cmsFormatter fn = f ->Factory(Type, Dir, dwFlags);
+        if (fn.Fmt16 != NULL) return fn;
+    }
+
+    // Revert to default
+    if (Dir == cmsFormatterInput)
+        return _cmsGetStockInputFormatter(Type, dwFlags);
+    else
+        return _cmsGetStockOutputFormatter(Type, dwFlags);
+}
+
+
+// Return whatever given formatter refers to float values
+cmsBool  _cmsFormatterIsFloat(cmsUInt32Number Type)
+{
+    return T_FLOAT(Type) ? TRUE : FALSE;
+}
+
+// Return whatever given formatter refers to 8 bits
+cmsBool  _cmsFormatterIs8bit(cmsUInt32Number Type)
+{
+    int Bytes = T_BYTES(Type);
+
+    return (Bytes == 1);
+}
+
+// Build a suitable formatter for the colorspace of this profile
+cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat)
+{
+
+    cmsColorSpaceSignature ColorSpace      = cmsGetColorSpace(hProfile);
+    cmsUInt32Number        ColorSpaceBits  = _cmsLCMScolorSpace(ColorSpace);
+    cmsUInt32Number        nOutputChans    = cmsChannelsOf(ColorSpace);
+    cmsUInt32Number        Float           = lIsFloat ? 1 : 0;
+
+    // Create a fake formatter for result
+    return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans);
+}
+
+// Build a suitable formatter for the colorspace of this profile
+cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat)
+{
+
+    cmsColorSpaceSignature ColorSpace      = cmsGetPCS(hProfile);
+    int                    ColorSpaceBits  = _cmsLCMScolorSpace(ColorSpace);
+    cmsUInt32Number        nOutputChans    = cmsChannelsOf(ColorSpace);
+    cmsUInt32Number        Float           = lIsFloat ? 1 : 0;
+
+    // Create a fake formatter for result
+    return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans);
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmspcs.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmspcs.c
new file mode 100644
index 0000000..102cd7d
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmspcs.c
@@ -0,0 +1,931 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2010 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+//      inter PCS conversions XYZ <-> CIE L* a* b*
+/*
+
+
+       CIE 15:2004 CIELab is defined as:
+
+       L* = 116*f(Y/Yn) - 16                     0 <= L* <= 100
+       a* = 500*[f(X/Xn) - f(Y/Yn)]
+       b* = 200*[f(Y/Yn) - f(Z/Zn)]
+
+       and
+
+              f(t) = t^(1/3)                     1 >= t >  (24/116)^3
+                     (841/108)*t + (16/116)      0 <= t <= (24/116)^3
+
+
+       Reverse transform is:
+
+       X = Xn*[a* / 500 + (L* + 16) / 116] ^ 3   if (X/Xn) > (24/116)
+         = Xn*(a* / 500 + L* / 116) / 7.787      if (X/Xn) <= (24/116)
+
+
+
+       PCS in Lab2 is encoded as:
+
+              8 bit Lab PCS:
+
+                     L*      0..100 into a 0..ff byte.
+                     a*      t + 128 range is -128.0  +127.0
+                     b*
+
+             16 bit Lab PCS:
+
+                     L*     0..100  into a 0..ff00 word.
+                     a*     t + 128  range is  -128.0  +127.9961
+                     b*
+
+
+
+Interchange Space   Component     Actual Range        Encoded Range
+CIE XYZ             X             0 -> 1.99997        0x0000 -> 0xffff
+CIE XYZ             Y             0 -> 1.99997        0x0000 -> 0xffff
+CIE XYZ             Z             0 -> 1.99997        0x0000 -> 0xffff
+
+Version 2,3
+-----------
+
+CIELAB (16 bit)     L*            0 -> 100.0          0x0000 -> 0xff00
+CIELAB (16 bit)     a*            -128.0 -> +127.996  0x0000 -> 0x8000 -> 0xffff
+CIELAB (16 bit)     b*            -128.0 -> +127.996  0x0000 -> 0x8000 -> 0xffff
+
+
+Version 4
+---------
+
+CIELAB (16 bit)     L*            0 -> 100.0          0x0000 -> 0xffff
+CIELAB (16 bit)     a*            -128.0 -> +127      0x0000 -> 0x8080 -> 0xffff
+CIELAB (16 bit)     b*            -128.0 -> +127      0x0000 -> 0x8080 -> 0xffff
+
+*/
+
+// Conversions
+void CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source)
+{
+    cmsFloat64Number ISum;
+
+    ISum = 1./(Source -> X + Source -> Y + Source -> Z);
+
+    Dest -> x = (Source -> X) * ISum;
+    Dest -> y = (Source -> Y) * ISum;
+    Dest -> Y = Source -> Y;
+}
+
+void CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source)
+{
+    Dest -> X = (Source -> x / Source -> y) * Source -> Y;
+    Dest -> Y = Source -> Y;
+    Dest -> Z = ((1 - Source -> x - Source -> y) / Source -> y) * Source -> Y;
+}
+
+static
+cmsFloat64Number f(cmsFloat64Number t)
+{
+    const cmsFloat64Number Limit = (24.0/116.0) * (24.0/116.0) * (24.0/116.0);
+
+    if (t <= Limit)
+        return (841.0/108.0) * t + (16.0/116.0);
+    else
+        return pow(t, 1.0/3.0);
+}
+
+static
+cmsFloat64Number f_1(cmsFloat64Number t)
+{
+    const cmsFloat64Number Limit = (24.0/116.0);
+
+    if (t <= Limit) {
+        return (108.0/841.0) * (t - (16.0/116.0));
+    }
+
+    return t * t * t;
+}
+
+
+// Standard XYZ to Lab. it can handle negative XZY numbers in some cases
+void CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz)
+{
+    cmsFloat64Number fx, fy, fz;
+
+    if (WhitePoint == NULL)
+        WhitePoint = cmsD50_XYZ();
+
+    fx = f(xyz->X / WhitePoint->X);
+    fy = f(xyz->Y / WhitePoint->Y);
+    fz = f(xyz->Z / WhitePoint->Z);
+
+    Lab->L = 116.0*fy - 16.0;
+    Lab->a = 500.0*(fx - fy);
+    Lab->b = 200.0*(fy - fz);
+}
+
+
+// Standard XYZ to Lab. It can return negative XYZ in some cases
+void CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz,  const cmsCIELab* Lab)
+{
+    cmsFloat64Number x, y, z;
+
+    if (WhitePoint == NULL)
+        WhitePoint = cmsD50_XYZ();
+
+    y = (Lab-> L + 16.0) / 116.0;
+    x = y + 0.002 * Lab -> a;
+    z = y - 0.005 * Lab -> b;
+
+    xyz -> X = f_1(x) * WhitePoint -> X;
+    xyz -> Y = f_1(y) * WhitePoint -> Y;
+    xyz -> Z = f_1(z) * WhitePoint -> Z;
+
+}
+
+static
+cmsFloat64Number L2float2(cmsUInt16Number v)
+{
+    return (cmsFloat64Number) v / 652.800;
+}
+
+// the a/b part
+static
+cmsFloat64Number ab2float2(cmsUInt16Number v)
+{
+    return ((cmsFloat64Number) v / 256.0) - 128.0;
+}
+
+static
+cmsUInt16Number L2Fix2(cmsFloat64Number L)
+{
+    return _cmsQuickSaturateWord(L *  652.8);
+}
+
+static
+cmsUInt16Number ab2Fix2(cmsFloat64Number ab)
+{
+    return _cmsQuickSaturateWord((ab + 128.0) * 256.0);
+}
+
+
+static
+cmsFloat64Number L2float4(cmsUInt16Number v)
+{
+    return (cmsFloat64Number) v / 655.35;
+}
+
+// the a/b part
+static
+cmsFloat64Number ab2float4(cmsUInt16Number v)
+{
+    return ((cmsFloat64Number) v / 257.0) - 128.0;
+}
+
+
+void CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3])
+{
+        Lab->L = L2float2(wLab[0]);
+        Lab->a = ab2float2(wLab[1]);
+        Lab->b = ab2float2(wLab[2]);
+}
+
+
+void CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3])
+{
+        Lab->L = L2float4(wLab[0]);
+        Lab->a = ab2float4(wLab[1]);
+        Lab->b = ab2float4(wLab[2]);
+}
+
+static
+cmsFloat64Number Clamp_L_doubleV2(cmsFloat64Number L)
+{
+    const cmsFloat64Number L_max = (cmsFloat64Number) (0xFFFF * 100.0) / 0xFF00;
+
+    if (L < 0) L = 0;
+    if (L > L_max) L = L_max;
+
+    return L;
+}
+
+
+static
+cmsFloat64Number Clamp_ab_doubleV2(cmsFloat64Number ab)
+{
+    if (ab < MIN_ENCODEABLE_ab2) ab = MIN_ENCODEABLE_ab2;
+    if (ab > MAX_ENCODEABLE_ab2) ab = MAX_ENCODEABLE_ab2;
+
+    return ab;
+}
+
+void CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* fLab)
+{
+    cmsCIELab Lab;
+
+    Lab.L = Clamp_L_doubleV2(fLab ->L);
+    Lab.a = Clamp_ab_doubleV2(fLab ->a);
+    Lab.b = Clamp_ab_doubleV2(fLab ->b);
+
+    wLab[0] = L2Fix2(Lab.L);
+    wLab[1] = ab2Fix2(Lab.a);
+    wLab[2] = ab2Fix2(Lab.b);
+}
+
+
+static
+cmsFloat64Number Clamp_L_doubleV4(cmsFloat64Number L)
+{
+    if (L < 0) L = 0;
+    if (L > 100.0) L = 100.0;
+
+    return L;
+}
+
+static
+cmsFloat64Number Clamp_ab_doubleV4(cmsFloat64Number ab)
+{
+    if (ab < MIN_ENCODEABLE_ab4) ab = MIN_ENCODEABLE_ab4;
+    if (ab > MAX_ENCODEABLE_ab4) ab = MAX_ENCODEABLE_ab4;
+
+    return ab;
+}
+
+static
+cmsUInt16Number L2Fix4(cmsFloat64Number L)
+{
+    return _cmsQuickSaturateWord(L *  655.35);
+}
+
+static
+cmsUInt16Number ab2Fix4(cmsFloat64Number ab)
+{
+    return _cmsQuickSaturateWord((ab + 128.0) * 257.0);
+}
+
+void CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* fLab)
+{
+    cmsCIELab Lab;
+
+    Lab.L = Clamp_L_doubleV4(fLab ->L);
+    Lab.a = Clamp_ab_doubleV4(fLab ->a);
+    Lab.b = Clamp_ab_doubleV4(fLab ->b);
+
+    wLab[0] = L2Fix4(Lab.L);
+    wLab[1] = ab2Fix4(Lab.a);
+    wLab[2] = ab2Fix4(Lab.b);
+}
+
+// Auxiliar: convert to Radians
+static
+cmsFloat64Number RADIANS(cmsFloat64Number deg)
+{
+    return (deg * M_PI) / 180.;
+}
+
+
+// Auxiliar: atan2 but operating in degrees and returning 0 if a==b==0
+static
+cmsFloat64Number atan2deg(cmsFloat64Number a, cmsFloat64Number b)
+{
+   cmsFloat64Number h;
+
+   if (a == 0 && b == 0)
+            h   = 0;
+    else
+            h = atan2(a, b);
+
+    h *= (180. / M_PI);
+
+    while (h > 360.)
+        h -= 360.;
+
+    while ( h < 0)
+        h += 360.;
+
+    return h;
+}
+
+
+// Auxiliar: Square
+static
+cmsFloat64Number Sqr(cmsFloat64Number v)
+{
+    return v *  v;
+}
+// From cylindrical coordinates. No check is performed, then negative values are allowed
+void CMSEXPORT cmsLab2LCh(cmsCIELCh* LCh, const cmsCIELab* Lab)
+{
+    LCh -> L = Lab -> L;
+    LCh -> C = pow(Sqr(Lab ->a) + Sqr(Lab ->b), 0.5);
+    LCh -> h = atan2deg(Lab ->b, Lab ->a);
+}
+
+
+// To cylindrical coordinates. No check is performed, then negative values are allowed
+void CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh)
+{
+    cmsFloat64Number h = (LCh -> h * M_PI) / 180.0;
+
+    Lab -> L = LCh -> L;
+    Lab -> a = LCh -> C * cos(h);
+    Lab -> b = LCh -> C * sin(h);
+}
+
+// In XYZ All 3 components are encoded using 1.15 fixed point
+static
+cmsUInt16Number XYZ2Fix(cmsFloat64Number d)
+{
+    return _cmsQuickSaturateWord(d * 32768.0);
+}
+
+void CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ)
+{
+    cmsCIEXYZ xyz;
+
+    xyz.X = fXYZ -> X;
+    xyz.Y = fXYZ -> Y;
+    xyz.Z = fXYZ -> Z;
+
+    // Clamp to encodeable values.
+    if (xyz.Y <= 0) {
+
+        xyz.X = 0;
+        xyz.Y = 0;
+        xyz.Z = 0;
+    }
+
+    if (xyz.X > MAX_ENCODEABLE_XYZ)
+        xyz.X = MAX_ENCODEABLE_XYZ;
+
+    if (xyz.X < 0)
+        xyz.X = 0;
+
+    if (xyz.Y > MAX_ENCODEABLE_XYZ)
+        xyz.Y = MAX_ENCODEABLE_XYZ;
+
+    if (xyz.Y < 0)
+        xyz.Y = 0;
+
+    if (xyz.Z > MAX_ENCODEABLE_XYZ)
+        xyz.Z = MAX_ENCODEABLE_XYZ;
+
+    if (xyz.Z < 0)
+        xyz.Z = 0;
+
+
+    XYZ[0] = XYZ2Fix(xyz.X);
+    XYZ[1] = XYZ2Fix(xyz.Y);
+    XYZ[2] = XYZ2Fix(xyz.Z);
+}
+
+
+//  To convert from Fixed 1.15 point to cmsFloat64Number
+static
+cmsFloat64Number XYZ2float(cmsUInt16Number v)
+{
+    cmsS15Fixed16Number fix32;
+
+    // From 1.15 to 15.16
+    fix32 = v << 1;
+
+    // From fixed 15.16 to cmsFloat64Number
+    return _cms15Fixed16toDouble(fix32);
+}
+
+
+void CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fXYZ, const cmsUInt16Number XYZ[3])
+{
+    fXYZ -> X = XYZ2float(XYZ[0]);
+    fXYZ -> Y = XYZ2float(XYZ[1]);
+    fXYZ -> Z = XYZ2float(XYZ[2]);
+}
+
+
+// Returns dE on two Lab values
+cmsFloat64Number CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2)
+{
+    cmsFloat64Number dL, da, db;
+
+    dL = fabs(Lab1 -> L - Lab2 -> L);
+    da = fabs(Lab1 -> a - Lab2 -> a);
+    db = fabs(Lab1 -> b - Lab2 -> b);
+
+    return pow(Sqr(dL) + Sqr(da) + Sqr(db), 0.5);
+}
+
+
+// Return the CIE94 Delta E
+cmsFloat64Number CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2)
+{
+    cmsCIELCh LCh1, LCh2;
+    cmsFloat64Number dE, dL, dC, dh, dhsq;
+    cmsFloat64Number c12, sc, sh;
+
+    dL = fabs(Lab1 ->L - Lab2 ->L);
+
+    cmsLab2LCh(&LCh1, Lab1);
+    cmsLab2LCh(&LCh2, Lab2);
+
+    dC  = fabs(LCh1.C - LCh2.C);
+    dE  = cmsDeltaE(Lab1, Lab2);
+
+    dhsq = Sqr(dE) - Sqr(dL) - Sqr(dC);
+    if (dhsq < 0)
+        dh = 0;
+    else
+        dh = pow(dhsq, 0.5);
+
+    c12 = sqrt(LCh1.C * LCh2.C);
+
+    sc = 1.0 + (0.048 * c12);
+    sh = 1.0 + (0.014 * c12);
+
+    return sqrt(Sqr(dL)  + Sqr(dC) / Sqr(sc) + Sqr(dh) / Sqr(sh));
+}
+
+
+// Auxiliary
+static
+cmsFloat64Number ComputeLBFD(const cmsCIELab* Lab)
+{
+  cmsFloat64Number yt;
+
+  if (Lab->L > 7.996969)
+        yt = (Sqr((Lab->L+16)/116)*((Lab->L+16)/116))*100;
+  else
+        yt = 100 * (Lab->L / 903.3);
+
+  return (54.6 * (M_LOG10E * (log(yt + 1.5))) - 9.6);
+}
+
+
+
+// bfd - gets BFD(1:1) difference between Lab1, Lab2
+cmsFloat64Number CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2)
+{
+    cmsFloat64Number lbfd1,lbfd2,AveC,Aveh,dE,deltaL,
+        deltaC,deltah,dc,t,g,dh,rh,rc,rt,bfd;
+    cmsCIELCh LCh1, LCh2;
+
+
+    lbfd1 = ComputeLBFD(Lab1);
+    lbfd2 = ComputeLBFD(Lab2);
+    deltaL = lbfd2 - lbfd1;
+
+    cmsLab2LCh(&LCh1, Lab1);
+    cmsLab2LCh(&LCh2, Lab2);
+
+    deltaC = LCh2.C - LCh1.C;
+    AveC = (LCh1.C+LCh2.C)/2;
+    Aveh = (LCh1.h+LCh2.h)/2;
+
+    dE = cmsDeltaE(Lab1, Lab2);
+
+    if (Sqr(dE)>(Sqr(Lab2->L-Lab1->L)+Sqr(deltaC)))
+        deltah = sqrt(Sqr(dE)-Sqr(Lab2->L-Lab1->L)-Sqr(deltaC));
+    else
+        deltah =0;
+
+
+    dc   = 0.035 * AveC / (1 + 0.00365 * AveC)+0.521;
+    g    = sqrt(Sqr(Sqr(AveC))/(Sqr(Sqr(AveC))+14000));
+    t    = 0.627+(0.055*cos((Aveh-254)/(180/M_PI))-
+           0.040*cos((2*Aveh-136)/(180/M_PI))+
+           0.070*cos((3*Aveh-31)/(180/M_PI))+
+           0.049*cos((4*Aveh+114)/(180/M_PI))-
+           0.015*cos((5*Aveh-103)/(180/M_PI)));
+
+    dh    = dc*(g*t+1-g);
+    rh    = -0.260*cos((Aveh-308)/(180/M_PI))-
+           0.379*cos((2*Aveh-160)/(180/M_PI))-
+           0.636*cos((3*Aveh+254)/(180/M_PI))+
+           0.226*cos((4*Aveh+140)/(180/M_PI))-
+           0.194*cos((5*Aveh+280)/(180/M_PI));
+
+    rc = sqrt((AveC*AveC*AveC*AveC*AveC*AveC)/((AveC*AveC*AveC*AveC*AveC*AveC)+70000000));
+    rt = rh*rc;
+
+    bfd = sqrt(Sqr(deltaL)+Sqr(deltaC/dc)+Sqr(deltah/dh)+(rt*(deltaC/dc)*(deltah/dh)));
+
+    return bfd;
+}
+
+
+//  cmc - CMC(l:c) difference between Lab1, Lab2
+cmsFloat64Number CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c)
+{
+  cmsFloat64Number dE,dL,dC,dh,sl,sc,sh,t,f,cmc;
+  cmsCIELCh LCh1, LCh2;
+
+  if (Lab1 ->L == 0 && Lab2 ->L == 0) return 0;
+
+  cmsLab2LCh(&LCh1, Lab1);
+  cmsLab2LCh(&LCh2, Lab2);
+
+
+  dL = Lab2->L-Lab1->L;
+  dC = LCh2.C-LCh1.C;
+
+  dE = cmsDeltaE(Lab1, Lab2);
+
+  if (Sqr(dE)>(Sqr(dL)+Sqr(dC)))
+            dh = sqrt(Sqr(dE)-Sqr(dL)-Sqr(dC));
+  else
+            dh =0;
+
+  if ((LCh1.h > 164) && (LCh1.h < 345))
+      t = 0.56 + fabs(0.2 * cos(((LCh1.h + 168)/(180/M_PI))));
+  else
+      t = 0.36 + fabs(0.4 * cos(((LCh1.h + 35 )/(180/M_PI))));
+
+   sc  = 0.0638   * LCh1.C / (1 + 0.0131  * LCh1.C) + 0.638;
+   sl  = 0.040975 * Lab1->L /(1 + 0.01765 * Lab1->L);
+
+   if (Lab1->L<16)
+         sl = 0.511;
+
+   f   = sqrt((LCh1.C * LCh1.C * LCh1.C * LCh1.C)/((LCh1.C * LCh1.C * LCh1.C * LCh1.C)+1900));
+   sh  = sc*(t*f+1-f);
+   cmc = sqrt(Sqr(dL/(l*sl))+Sqr(dC/(c*sc))+Sqr(dh/sh));
+
+   return cmc;
+}
+
+// dE2000 The weightings KL, KC and KH can be modified to reflect the relative
+// importance of lightness, chroma and hue in different industrial applications
+cmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2,
+                                  cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh)
+{
+    cmsFloat64Number L1  = Lab1->L;
+    cmsFloat64Number a1  = Lab1->a;
+    cmsFloat64Number b1  = Lab1->b;
+    cmsFloat64Number C   = sqrt( Sqr(a1) + Sqr(b1) );
+
+    cmsFloat64Number Ls = Lab2 ->L;
+    cmsFloat64Number as = Lab2 ->a;
+    cmsFloat64Number bs = Lab2 ->b;
+    cmsFloat64Number Cs = sqrt( Sqr(as) + Sqr(bs) );
+
+    cmsFloat64Number G = 0.5 * ( 1 - sqrt(pow((C + Cs) / 2 , 7.0) / (pow((C + Cs) / 2, 7.0) + pow(25.0, 7.0) ) ));
+
+    cmsFloat64Number a_p = (1 + G ) * a1;
+    cmsFloat64Number b_p = b1;
+    cmsFloat64Number C_p = sqrt( Sqr(a_p) + Sqr(b_p));
+    cmsFloat64Number h_p = atan2deg(b_p, a_p);
+
+
+    cmsFloat64Number a_ps = (1 + G) * as;
+    cmsFloat64Number b_ps = bs;
+    cmsFloat64Number C_ps = sqrt(Sqr(a_ps) + Sqr(b_ps));
+    cmsFloat64Number h_ps = atan2deg(b_ps, a_ps);
+
+    cmsFloat64Number meanC_p =(C_p + C_ps) / 2;
+
+    cmsFloat64Number hps_plus_hp  = h_ps + h_p;
+    cmsFloat64Number hps_minus_hp = h_ps - h_p;
+
+    cmsFloat64Number meanh_p = fabs(hps_minus_hp) <= 180.000001 ? (hps_plus_hp)/2 :
+                            (hps_plus_hp) < 360 ? (hps_plus_hp + 360)/2 :
+                                                 (hps_plus_hp - 360)/2;
+
+    cmsFloat64Number delta_h = (hps_minus_hp) <= -180.000001 ?  (hps_minus_hp + 360) :
+                            (hps_minus_hp) > 180 ? (hps_minus_hp - 360) :
+                                                    (hps_minus_hp);
+    cmsFloat64Number delta_L = (Ls - L1);
+    cmsFloat64Number delta_C = (C_ps - C_p );
+
+
+    cmsFloat64Number delta_H =2 * sqrt(C_ps*C_p) * sin(RADIANS(delta_h) / 2);
+
+    cmsFloat64Number T = 1 - 0.17 * cos(RADIANS(meanh_p-30))
+                 + 0.24 * cos(RADIANS(2*meanh_p))
+                 + 0.32 * cos(RADIANS(3*meanh_p + 6))
+                 - 0.2  * cos(RADIANS(4*meanh_p - 63));
+
+    cmsFloat64Number Sl = 1 + (0.015 * Sqr((Ls + L1) /2- 50) )/ sqrt(20 + Sqr( (Ls+L1)/2 - 50) );
+
+    cmsFloat64Number Sc = 1 + 0.045 * (C_p + C_ps)/2;
+    cmsFloat64Number Sh = 1 + 0.015 * ((C_ps + C_p)/2) * T;
+
+    cmsFloat64Number delta_ro = 30 * exp( -Sqr(((meanh_p - 275 ) / 25)));
+
+    cmsFloat64Number Rc = 2 * sqrt(( pow(meanC_p, 7.0) )/( pow(meanC_p, 7.0) + pow(25.0, 7.0)));
+
+    cmsFloat64Number Rt = -sin(2 * RADIANS(delta_ro)) * Rc;
+
+    cmsFloat64Number deltaE00 = sqrt( Sqr(delta_L /(Sl * Kl)) +
+                            Sqr(delta_C/(Sc * Kc))  +
+                            Sqr(delta_H/(Sh * Kh))  +
+                            Rt*(delta_C/(Sc * Kc)) * (delta_H / (Sh * Kh)));
+
+    return deltaE00;
+}
+
+// This function returns a number of gridpoints to be used as LUT table. It assumes same number
+// of gripdpoints in all dimensions. Flags may override the choice.
+int _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags)
+{
+    int nChannels;
+
+    // Already specified?
+    if (dwFlags & 0x00FF0000) {
+            // Yes, grab'em
+            return (dwFlags >> 16) & 0xFF;
+    }
+
+    nChannels = cmsChannelsOf(Colorspace);
+
+    // HighResPrecalc is maximum resolution
+    if (dwFlags & cmsFLAGS_HIGHRESPRECALC) {
+
+        if (nChannels > 4)
+                return 7;       // 7 for Hifi
+
+        if (nChannels == 4)     // 23 for CMYK
+                return 23;
+
+        return 49;      // 49 for RGB and others
+    }
+
+
+    // LowResPrecal is lower resolution
+    if (dwFlags & cmsFLAGS_LOWRESPRECALC) {
+
+        if (nChannels > 4)
+                return 6;       // 6 for more than 4 channels
+
+        if (nChannels == 1)
+                return 33;      // For monochrome
+
+        return 17;              // 17 for remaining
+    }
+
+    // Default values
+    if (nChannels > 4)
+                return 7;       // 7 for Hifi
+
+    if (nChannels == 4)
+                return 17;      // 17 for CMYK
+
+    return 33;                  // 33 for RGB
+}
+
+
+cmsBool  _cmsEndPointsBySpace(cmsColorSpaceSignature Space,
+                             cmsUInt16Number **White,
+                             cmsUInt16Number **Black,
+                             cmsUInt32Number *nOutputs)
+{
+       // Only most common spaces
+
+       static cmsUInt16Number RGBblack[4]  = { 0, 0, 0 };
+       static cmsUInt16Number RGBwhite[4]  = { 0xffff, 0xffff, 0xffff };
+       static cmsUInt16Number CMYKblack[4] = { 0xffff, 0xffff, 0xffff, 0xffff };   // 400% of ink
+       static cmsUInt16Number CMYKwhite[4] = { 0, 0, 0, 0 };
+       static cmsUInt16Number LABblack[4]  = { 0, 0x8080, 0x8080 };               // V4 Lab encoding
+       static cmsUInt16Number LABwhite[4]  = { 0xFFFF, 0x8080, 0x8080 };
+       static cmsUInt16Number CMYblack[4]  = { 0xffff, 0xffff, 0xffff };
+       static cmsUInt16Number CMYwhite[4]  = { 0, 0, 0 };
+       static cmsUInt16Number Grayblack[4] = { 0 };
+       static cmsUInt16Number GrayWhite[4] = { 0xffff };
+
+       switch (Space) {
+
+       case cmsSigGrayData: if (White)    *White = GrayWhite;
+                           if (Black)    *Black = Grayblack;
+                           if (nOutputs) *nOutputs = 1;
+                           return TRUE;
+
+       case cmsSigRgbData:  if (White)    *White = RGBwhite;
+                           if (Black)    *Black = RGBblack;
+                           if (nOutputs) *nOutputs = 3;
+                           return TRUE;
+
+       case cmsSigLabData:  if (White)    *White = LABwhite;
+                           if (Black)    *Black = LABblack;
+                           if (nOutputs) *nOutputs = 3;
+                           return TRUE;
+
+       case cmsSigCmykData: if (White)    *White = CMYKwhite;
+                           if (Black)    *Black = CMYKblack;
+                           if (nOutputs) *nOutputs = 4;
+                           return TRUE;
+
+       case cmsSigCmyData:  if (White)    *White = CMYwhite;
+                           if (Black)    *Black = CMYblack;
+                           if (nOutputs) *nOutputs = 3;
+                           return TRUE;
+
+       default:;
+       }
+
+  return FALSE;
+}
+
+
+
+// Several utilities -------------------------------------------------------
+
+// Translate from our colorspace to ICC representation
+
+cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation)
+{
+       switch (OurNotation) {
+
+       case 1:
+       case PT_GRAY: return cmsSigGrayData;
+
+       case 2:
+       case PT_RGB:  return cmsSigRgbData;
+
+       case PT_CMY:  return cmsSigCmyData;
+       case PT_CMYK: return cmsSigCmykData;
+       case PT_YCbCr:return cmsSigYCbCrData;
+       case PT_YUV:  return cmsSigLuvData;
+       case PT_XYZ:  return cmsSigXYZData;
+
+       case PT_LabV2:
+       case PT_Lab:  return cmsSigLabData;
+
+       case PT_YUVK: return cmsSigLuvKData;
+       case PT_HSV:  return cmsSigHsvData;
+       case PT_HLS:  return cmsSigHlsData;
+       case PT_Yxy:  return cmsSigYxyData;
+
+       case PT_MCH1: return cmsSigMCH1Data;
+       case PT_MCH2: return cmsSigMCH2Data;
+       case PT_MCH3: return cmsSigMCH3Data;
+       case PT_MCH4: return cmsSigMCH4Data;
+       case PT_MCH5: return cmsSigMCH5Data;
+       case PT_MCH6: return cmsSigMCH6Data;
+       case PT_MCH7: return cmsSigMCH7Data;
+       case PT_MCH8: return cmsSigMCH8Data;
+
+       case PT_MCH9:  return cmsSigMCH9Data;
+       case PT_MCH10: return cmsSigMCHAData;
+       case PT_MCH11: return cmsSigMCHBData;
+       case PT_MCH12: return cmsSigMCHCData;
+       case PT_MCH13: return cmsSigMCHDData;
+       case PT_MCH14: return cmsSigMCHEData;
+       case PT_MCH15: return cmsSigMCHFData;
+
+       default:  return (cmsColorSpaceSignature) (-1);
+       }
+}
+
+
+int CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace)
+{
+    switch (ProfileSpace) {
+
+    case cmsSigGrayData: return  PT_GRAY;
+    case cmsSigRgbData:  return  PT_RGB;
+    case cmsSigCmyData:  return  PT_CMY;
+    case cmsSigCmykData: return  PT_CMYK;
+    case cmsSigYCbCrData:return  PT_YCbCr;
+    case cmsSigLuvData:  return  PT_YUV;
+    case cmsSigXYZData:  return  PT_XYZ;
+    case cmsSigLabData:  return  PT_Lab;
+    case cmsSigLuvKData: return  PT_YUVK;
+    case cmsSigHsvData:  return  PT_HSV;
+    case cmsSigHlsData:  return  PT_HLS;
+    case cmsSigYxyData:  return  PT_Yxy;
+
+    case cmsSig1colorData:
+    case cmsSigMCH1Data: return PT_MCH1;
+
+    case cmsSig2colorData:
+    case cmsSigMCH2Data: return PT_MCH2;
+
+    case cmsSig3colorData:
+    case cmsSigMCH3Data: return PT_MCH3;
+
+    case cmsSig4colorData:
+    case cmsSigMCH4Data: return PT_MCH4;
+
+    case cmsSig5colorData:
+    case cmsSigMCH5Data: return PT_MCH5;
+
+    case cmsSig6colorData:
+    case cmsSigMCH6Data: return PT_MCH6;
+
+    case cmsSigMCH7Data:
+    case cmsSig7colorData:return PT_MCH7;
+
+    case cmsSigMCH8Data:
+    case cmsSig8colorData:return PT_MCH8;
+
+    case cmsSigMCH9Data:
+    case cmsSig9colorData:return PT_MCH9;
+
+    case cmsSigMCHAData:
+    case cmsSig10colorData:return PT_MCH10;
+
+    case cmsSigMCHBData:
+    case cmsSig11colorData:return PT_MCH11;
+
+    case cmsSigMCHCData:
+    case cmsSig12colorData:return PT_MCH12;
+
+    case cmsSigMCHDData:
+    case cmsSig13colorData:return PT_MCH13;
+
+    case cmsSigMCHEData:
+    case cmsSig14colorData:return PT_MCH14;
+
+    case cmsSigMCHFData:
+    case cmsSig15colorData:return PT_MCH15;
+
+    default:  return (cmsColorSpaceSignature) (-1);
+    }
+}
+
+
+cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace)
+{
+    switch (ColorSpace) {
+
+    case cmsSigMCH1Data:
+    case cmsSig1colorData:
+    case cmsSigGrayData: return 1;
+
+    case cmsSigMCH2Data:
+    case cmsSig2colorData:  return 2;
+
+    case cmsSigXYZData:
+    case cmsSigLabData:
+    case cmsSigLuvData:
+    case cmsSigYCbCrData:
+    case cmsSigYxyData:
+    case cmsSigRgbData:
+    case cmsSigHsvData:
+    case cmsSigHlsData:
+    case cmsSigCmyData:
+    case cmsSigMCH3Data:
+    case cmsSig3colorData:  return 3;
+
+    case cmsSigLuvKData:
+    case cmsSigCmykData:
+    case cmsSigMCH4Data:
+    case cmsSig4colorData:  return 4;
+
+    case cmsSigMCH5Data:
+    case cmsSig5colorData:  return 5;
+
+    case cmsSigMCH6Data:
+    case cmsSig6colorData:  return 6;
+
+    case cmsSigMCH7Data:
+    case cmsSig7colorData:  return  7;
+
+    case cmsSigMCH8Data:
+    case cmsSig8colorData:  return  8;
+
+    case cmsSigMCH9Data:
+    case cmsSig9colorData:  return  9;
+
+    case cmsSigMCHAData:
+    case cmsSig10colorData: return 10;
+
+    case cmsSigMCHBData:
+    case cmsSig11colorData: return 11;
+
+    case cmsSigMCHCData:
+    case cmsSig12colorData: return 12;
+
+    case cmsSigMCHDData:
+    case cmsSig13colorData: return 13;
+
+    case cmsSigMCHEData:
+    case cmsSig14colorData: return 14;
+
+    case cmsSigMCHFData:
+    case cmsSig15colorData: return 15;
+
+    default: return 3;
+    }
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsplugin.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsplugin.c
new file mode 100644
index 0000000..55928b7
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsplugin.c
@@ -0,0 +1,955 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2010 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// ----------------------------------------------------------------------------------
+// Encoding & Decoding support functions
+// ----------------------------------------------------------------------------------
+
+//      Little-Endian to Big-Endian
+
+// Adjust a word value after being readed/ before being written from/to an ICC profile
+cmsUInt16Number CMSEXPORT  _cmsAdjustEndianess16(cmsUInt16Number Word)
+{
+#ifndef CMS_USE_BIG_ENDIAN
+
+    cmsUInt8Number* pByte = (cmsUInt8Number*) &Word;
+    cmsUInt8Number tmp;
+
+    tmp = pByte[0];
+    pByte[0] = pByte[1];
+    pByte[1] = tmp;
+#endif
+
+    return Word;
+}
+
+
+// Transports to properly encoded values - note that icc profiles does use big endian notation.
+
+// 1 2 3 4
+// 4 3 2 1
+
+cmsUInt32Number CMSEXPORT  _cmsAdjustEndianess32(cmsUInt32Number DWord)
+{
+#ifndef CMS_USE_BIG_ENDIAN
+
+    cmsUInt8Number* pByte = (cmsUInt8Number*) &DWord;
+    cmsUInt8Number temp1;
+    cmsUInt8Number temp2;
+
+    temp1 = *pByte++;
+    temp2 = *pByte++;
+    *(pByte-1) = *pByte;
+    *pByte++ = temp2;
+    *(pByte-3) = *pByte;
+    *pByte = temp1;
+#endif
+    return DWord;
+}
+
+// 1 2 3 4 5 6 7 8
+// 8 7 6 5 4 3 2 1
+
+void CMSEXPORT  _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord)
+{
+
+#ifndef CMS_USE_BIG_ENDIAN
+
+    cmsUInt8Number* pIn  = (cmsUInt8Number*) QWord;
+    cmsUInt8Number* pOut = (cmsUInt8Number*) Result;
+
+    _cmsAssert(Result != NULL);
+
+    pOut[7] = pIn[0];
+    pOut[6] = pIn[1];
+    pOut[5] = pIn[2];
+    pOut[4] = pIn[3];
+    pOut[3] = pIn[4];
+    pOut[2] = pIn[5];
+    pOut[1] = pIn[6];
+    pOut[0] = pIn[7];
+
+#else
+    _cmsAssert(Result != NULL);
+
+#  ifdef CMS_DONT_USE_INT64
+    (*Result)[0] = QWord[0];
+    (*Result)[1] = QWord[1];
+#  else
+    *Result = *QWord;
+#  endif
+#endif
+}
+
+// Auxiliar -- read 8, 16 and 32-bit numbers
+cmsBool CMSEXPORT  _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n)
+{
+    cmsUInt8Number tmp;
+
+    _cmsAssert(io != NULL);
+
+    if (io -> Read(io, &tmp, sizeof(cmsUInt8Number), 1) != 1)
+            return FALSE;
+
+    if (n != NULL) *n = tmp;
+    return TRUE;
+}
+
+cmsBool CMSEXPORT  _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n)
+{
+    cmsUInt16Number tmp;
+
+    _cmsAssert(io != NULL);
+
+    if (io -> Read(io, &tmp, sizeof(cmsUInt16Number), 1) != 1)
+            return FALSE;
+
+    if (n != NULL) *n = _cmsAdjustEndianess16(tmp);
+    return TRUE;
+}
+
+cmsBool CMSEXPORT  _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array)
+{
+    cmsUInt32Number i;
+
+    _cmsAssert(io != NULL);
+
+    for (i=0; i < n; i++) {
+
+        if (Array != NULL) {
+            if (!_cmsReadUInt16Number(io, Array + i)) return FALSE;
+        }
+        else {
+            if (!_cmsReadUInt16Number(io, NULL)) return FALSE;
+        }
+
+    }
+    return TRUE;
+}
+
+cmsBool CMSEXPORT  _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n)
+{
+    cmsUInt32Number tmp;
+
+    _cmsAssert(io != NULL);
+
+    if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1)
+            return FALSE;
+
+    if (n != NULL) *n = _cmsAdjustEndianess32(tmp);
+    return TRUE;
+}
+
+cmsBool CMSEXPORT  _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n)
+{
+    cmsUInt32Number tmp;
+
+    _cmsAssert(io != NULL);
+
+    if (io -> Read(io, &tmp, sizeof(cmsFloat32Number), 1) != 1)
+            return FALSE;
+
+    if (n != NULL) {
+
+        tmp = _cmsAdjustEndianess32(tmp);
+        *n = *(cmsFloat32Number*) &tmp;
+    }
+    return TRUE;
+}
+
+
+cmsBool CMSEXPORT   _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n)
+{
+    cmsUInt64Number tmp;
+
+    _cmsAssert(io != NULL);
+
+    if (io -> Read(io, &tmp, sizeof(cmsUInt64Number), 1) != 1)
+            return FALSE;
+
+    if (n != NULL) _cmsAdjustEndianess64(n, &tmp);
+    return TRUE;
+}
+
+
+cmsBool CMSEXPORT  _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n)
+{
+    cmsUInt32Number tmp;
+
+    _cmsAssert(io != NULL);
+
+    if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1)
+            return FALSE;
+
+    if (n != NULL) {
+        *n = _cms15Fixed16toDouble(_cmsAdjustEndianess32(tmp));
+    }
+
+    return TRUE;
+}
+
+
+// Jun-21-2000: Some profiles (those that comes with W2K) comes
+// with the media white (media black?) x 100. Add a sanity check
+
+static
+void NormalizeXYZ(cmsCIEXYZ* Dest)
+{
+    while (Dest -> X > 2. &&
+           Dest -> Y > 2. &&
+           Dest -> Z > 2.) {
+
+               Dest -> X /= 10.;
+               Dest -> Y /= 10.;
+               Dest -> Z /= 10.;
+       }
+}
+
+cmsBool CMSEXPORT  _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ)
+{
+    cmsEncodedXYZNumber xyz;
+
+    _cmsAssert(io != NULL);
+
+    if (io ->Read(io, &xyz, sizeof(cmsEncodedXYZNumber), 1) != 1) return FALSE;
+
+    if (XYZ != NULL) {
+
+        XYZ->X = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.X));
+        XYZ->Y = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.Y));
+        XYZ->Z = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.Z));
+
+        NormalizeXYZ(XYZ);
+    }
+    return TRUE;
+}
+
+cmsBool CMSEXPORT  _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n)
+{
+    _cmsAssert(io != NULL);
+
+    if (io -> Write(io, sizeof(cmsUInt8Number), &n) != 1)
+            return FALSE;
+
+    return TRUE;
+}
+
+cmsBool CMSEXPORT  _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n)
+{
+    cmsUInt16Number tmp;
+
+    _cmsAssert(io != NULL);
+
+    tmp = _cmsAdjustEndianess16(n);
+    if (io -> Write(io, sizeof(cmsUInt16Number), &tmp) != 1)
+            return FALSE;
+
+    return TRUE;
+}
+
+cmsBool CMSEXPORT  _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array)
+{
+    cmsUInt32Number i;
+
+    _cmsAssert(io != NULL);
+    _cmsAssert(Array != NULL);
+
+    for (i=0; i < n; i++) {
+        if (!_cmsWriteUInt16Number(io, Array[i])) return FALSE;
+    }
+
+    return TRUE;
+}
+
+cmsBool CMSEXPORT  _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n)
+{
+    cmsUInt32Number tmp;
+
+    _cmsAssert(io != NULL);
+
+    tmp = _cmsAdjustEndianess32(n);
+    if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1)
+            return FALSE;
+
+    return TRUE;
+}
+
+
+cmsBool CMSEXPORT  _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n)
+{
+    cmsUInt32Number tmp;
+
+    _cmsAssert(io != NULL);
+
+    tmp = *(cmsUInt32Number*) &n;
+    tmp = _cmsAdjustEndianess32(tmp);
+    if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1)
+            return FALSE;
+
+    return TRUE;
+}
+
+cmsBool CMSEXPORT  _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n)
+{
+    cmsUInt64Number tmp;
+
+    _cmsAssert(io != NULL);
+
+    _cmsAdjustEndianess64(&tmp, n);
+    if (io -> Write(io, sizeof(cmsUInt64Number), &tmp) != 1)
+            return FALSE;
+
+    return TRUE;
+}
+
+cmsBool CMSEXPORT  _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n)
+{
+    cmsUInt32Number tmp;
+
+    _cmsAssert(io != NULL);
+
+    tmp = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(n));
+    if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1)
+            return FALSE;
+
+    return TRUE;
+}
+
+cmsBool CMSEXPORT  _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ)
+{
+    cmsEncodedXYZNumber xyz;
+
+    _cmsAssert(io != NULL);
+    _cmsAssert(XYZ != NULL);
+
+    xyz.X = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->X));
+    xyz.Y = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->Y));
+    xyz.Z = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->Z));
+
+    return io -> Write(io,  sizeof(cmsEncodedXYZNumber), &xyz);
+}
+
+// from Fixed point 8.8 to double
+cmsFloat64Number CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8)
+{
+       cmsUInt8Number  msb, lsb;
+
+       lsb = (cmsUInt8Number) (fixed8 & 0xff);
+       msb = (cmsUInt8Number) (((cmsUInt16Number) fixed8 >> 8) & 0xff);
+
+       return (cmsFloat64Number) ((cmsFloat64Number) msb + ((cmsFloat64Number) lsb / 256.0));
+}
+
+cmsUInt16Number CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val)
+{
+    cmsS15Fixed16Number GammaFixed32 = _cmsDoubleTo15Fixed16(val);
+    return  (cmsUInt16Number) ((GammaFixed32 >> 8) & 0xFFFF);
+}
+
+// from Fixed point 15.16 to double
+cmsFloat64Number CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32)
+{
+    cmsFloat64Number floater, sign, mid;
+    int Whole, FracPart;
+
+    sign  = (fix32 < 0 ? -1 : 1);
+    fix32 = abs(fix32);
+
+    Whole     = (cmsUInt16Number)(fix32 >> 16) & 0xffff;
+    FracPart  = (cmsUInt16Number)(fix32 & 0xffff);
+
+    mid     = (cmsFloat64Number) FracPart / 65536.0;
+    floater = (cmsFloat64Number) Whole + mid;
+
+    return sign * floater;
+}
+
+// from double to Fixed point 15.16
+cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v)
+{
+    return ((cmsS15Fixed16Number) floor((v)*65536.0 + 0.5));
+}
+
+// Date/Time functions
+
+void CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest)
+{
+
+    _cmsAssert(Dest != NULL);
+    _cmsAssert(Source != NULL);
+
+    Dest->tm_sec   = _cmsAdjustEndianess16(Source->seconds);
+    Dest->tm_min   = _cmsAdjustEndianess16(Source->minutes);
+    Dest->tm_hour  = _cmsAdjustEndianess16(Source->hours);
+    Dest->tm_mday  = _cmsAdjustEndianess16(Source->day);
+    Dest->tm_mon   = _cmsAdjustEndianess16(Source->month) - 1;
+    Dest->tm_year  = _cmsAdjustEndianess16(Source->year) - 1900;
+    Dest->tm_wday  = -1;
+    Dest->tm_yday  = -1;
+    Dest->tm_isdst = 0;
+}
+
+void CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source)
+{
+    _cmsAssert(Dest != NULL);
+    _cmsAssert(Source != NULL);
+
+    Dest->seconds = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_sec);
+    Dest->minutes = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_min);
+    Dest->hours   = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_hour);
+    Dest->day     = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_mday);
+    Dest->month   = _cmsAdjustEndianess16((cmsUInt16Number) (Source->tm_mon + 1));
+    Dest->year    = _cmsAdjustEndianess16((cmsUInt16Number) (Source->tm_year + 1900));
+}
+
+// Read base and return type base
+cmsTagTypeSignature CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io)
+{
+    _cmsTagBase Base;
+
+    _cmsAssert(io != NULL);
+
+    if (io -> Read(io, &Base, sizeof(_cmsTagBase), 1) != 1)
+        return (cmsTagTypeSignature) 0;
+
+    return (cmsTagTypeSignature) _cmsAdjustEndianess32(Base.sig);
+}
+
+// Setup base marker
+cmsBool  CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig)
+{
+    _cmsTagBase  Base;
+
+    _cmsAssert(io != NULL);
+
+    Base.sig = (cmsTagTypeSignature) _cmsAdjustEndianess32(sig);
+    memset(&Base.reserved, 0, sizeof(Base.reserved));
+    return io -> Write(io, sizeof(_cmsTagBase), &Base);
+}
+
+cmsBool CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io)
+{
+    cmsUInt8Number  Buffer[4];
+    cmsUInt32Number NextAligned, At;
+    cmsUInt32Number BytesToNextAlignedPos;
+
+    _cmsAssert(io != NULL);
+
+    At = io -> Tell(io);
+    NextAligned = _cmsALIGNLONG(At);
+    BytesToNextAlignedPos = NextAligned - At;
+    if (BytesToNextAlignedPos == 0) return TRUE;
+    if (BytesToNextAlignedPos > 4)  return FALSE;
+
+    return (io ->Read(io, Buffer, BytesToNextAlignedPos, 1) == 1);
+}
+
+cmsBool CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io)
+{
+    cmsUInt8Number  Buffer[4];
+    cmsUInt32Number NextAligned, At;
+    cmsUInt32Number BytesToNextAlignedPos;
+
+    _cmsAssert(io != NULL);
+
+    At = io -> Tell(io);
+    NextAligned = _cmsALIGNLONG(At);
+    BytesToNextAlignedPos = NextAligned - At;
+    if (BytesToNextAlignedPos == 0) return TRUE;
+    if (BytesToNextAlignedPos > 4)  return FALSE;
+
+    memset(Buffer, 0, BytesToNextAlignedPos);
+    return io -> Write(io, BytesToNextAlignedPos, Buffer);
+}
+
+
+// To deal with text streams. 2K at most
+cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...)
+{
+    va_list args;
+    int len;
+    cmsUInt8Number Buffer[2048];
+    cmsBool rc;
+
+    _cmsAssert(io != NULL);
+    _cmsAssert(frm != NULL);
+
+    va_start(args, frm);
+
+    len = vsnprintf((char*) Buffer, 2047, frm, args);
+    if (len < 0) return FALSE;   // Truncated, which is a fatal error for us
+
+    rc = io ->Write(io, len, Buffer);
+
+    va_end(args);
+
+    return rc;
+}
+
+
+// Plugin memory management -------------------------------------------------------------------------------------------------
+
+// Specialized malloc for plug-ins, that is freed upon exit.
+void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size)
+{
+    struct _cmsContext_struct* ctx = _cmsGetContext(ContextID);
+
+    if (ctx ->MemPool == NULL) {
+
+        if (ContextID == NULL) {
+
+            ctx->MemPool = _cmsCreateSubAlloc(0, 2*1024);
+        }
+        else {
+            cmsSignalError(ContextID, cmsERROR_CORRUPTION_DETECTED, "NULL memory pool on context");
+            return NULL;
+        }
+    }
+
+    return _cmsSubAlloc(ctx->MemPool, size);
+}
+
+
+// Main plug-in dispatcher
+cmsBool CMSEXPORT cmsPlugin(void* Plug_in)
+{
+    return cmsPluginTHR(NULL, Plug_in);
+}
+
+cmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in)
+{
+    cmsPluginBase* Plugin;
+
+    for (Plugin = (cmsPluginBase*) Plug_in;
+         Plugin != NULL;
+         Plugin = Plugin -> Next) {
+
+            if (Plugin -> Magic != cmsPluginMagicNumber) {
+                cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized plugin");
+                return FALSE;
+            }
+
+            if (Plugin ->ExpectedVersion > LCMS_VERSION) {
+                cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "plugin needs Little CMS %d, current version is %d",
+                    Plugin ->ExpectedVersion, LCMS_VERSION);
+                return FALSE;
+            }
+
+            switch (Plugin -> Type) {
+
+                case cmsPluginMemHandlerSig:
+                    if (!_cmsRegisterMemHandlerPlugin(id, Plugin)) return FALSE;
+                    break;
+
+                case cmsPluginInterpolationSig:
+                    if (!_cmsRegisterInterpPlugin(id, Plugin)) return FALSE;
+                    break;
+
+                case cmsPluginTagTypeSig:
+                    if (!_cmsRegisterTagTypePlugin(id, Plugin)) return FALSE;
+                    break;
+
+                case cmsPluginTagSig:
+                    if (!_cmsRegisterTagPlugin(id, Plugin)) return FALSE;
+                    break;
+
+                case cmsPluginFormattersSig:
+                    if (!_cmsRegisterFormattersPlugin(id, Plugin)) return FALSE;
+                    break;
+
+                case cmsPluginRenderingIntentSig:
+                    if (!_cmsRegisterRenderingIntentPlugin(id, Plugin)) return FALSE;
+                    break;
+
+                case cmsPluginParametricCurveSig:
+                    if (!_cmsRegisterParametricCurvesPlugin(id, Plugin)) return FALSE;
+                    break;
+
+                case cmsPluginMultiProcessElementSig:
+                    if (!_cmsRegisterMultiProcessElementPlugin(id, Plugin)) return FALSE;
+                    break;
+
+                case cmsPluginOptimizationSig:
+                    if (!_cmsRegisterOptimizationPlugin(id, Plugin)) return FALSE;
+                    break;
+
+                case cmsPluginTransformSig:
+                    if (!_cmsRegisterTransformPlugin(id, Plugin)) return FALSE;
+                    break;
+
+                case cmsPluginMutexSig:
+                    if (!_cmsRegisterMutexPlugin(id, Plugin)) return FALSE;
+                    break;
+
+                default:
+                    cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized plugin type '%X'", Plugin -> Type);
+                    return FALSE;
+            }
+    }
+
+    // Keep a reference to the plug-in
+    return TRUE;
+}
+
+
+// Revert all plug-ins to default
+void CMSEXPORT cmsUnregisterPlugins(void)
+{
+    cmsUnregisterPluginsTHR(NULL);
+}
+
+
+// The Global storage for system context. This is the one and only global variable
+// pointers structure. All global vars are referenced here.
+static struct _cmsContext_struct globalContext = {
+
+    NULL,                              // Not in the linked list
+    NULL,                              // No suballocator
+    {
+        NULL,                          //  UserPtr,            
+        &_cmsLogErrorChunk,            //  Logger,
+        &_cmsAlarmCodesChunk,          //  AlarmCodes,
+        &_cmsAdaptationStateChunk,     //  AdaptationState, 
+        &_cmsMemPluginChunk,           //  MemPlugin,
+        &_cmsInterpPluginChunk,        //  InterpPlugin,
+        &_cmsCurvesPluginChunk,        //  CurvesPlugin,
+        &_cmsFormattersPluginChunk,    //  FormattersPlugin,
+        &_cmsTagTypePluginChunk,       //  TagTypePlugin,
+        &_cmsTagPluginChunk,           //  TagPlugin,
+        &_cmsIntentsPluginChunk,       //  IntentPlugin,
+        &_cmsMPETypePluginChunk,       //  MPEPlugin,
+        &_cmsOptimizationPluginChunk,  //  OptimizationPlugin,
+        &_cmsTransformPluginChunk,     //  TransformPlugin,
+        &_cmsMutexPluginChunk          //  MutexPlugin
+    },
+    
+    { NULL, NULL, NULL, NULL, NULL, NULL } // The default memory allocator is not used for context 0
+};
+
+
+// The context pool (linked list head)
+static _cmsMutex _cmsContextPoolHeadMutex = CMS_MUTEX_INITIALIZER;
+static struct _cmsContext_struct* _cmsContextPoolHead = NULL;
+
+// Internal, get associated pointer, with guessing. Never returns NULL.
+struct _cmsContext_struct* _cmsGetContext(cmsContext ContextID)
+{
+    struct _cmsContext_struct* id = (struct _cmsContext_struct*) ContextID;
+    struct _cmsContext_struct* ctx;
+
+
+    // On 0, use global settings
+    if (id == NULL) 
+        return &globalContext;
+
+    // Search
+    for (ctx = _cmsContextPoolHead;
+         ctx != NULL;
+         ctx = ctx ->Next) {
+
+            // Found it?
+            if (id == ctx)
+                return ctx; // New-style context, 
+    }
+
+    return &globalContext;
+}
+
+
+// Internal: get the memory area associanted with each context client
+// Returns the block assigned to the specific zone. 
+void* _cmsContextGetClientChunk(cmsContext ContextID, _cmsMemoryClient mc)
+{
+    struct _cmsContext_struct* ctx;
+    void *ptr;
+
+    if (mc < 0 || mc >= MemoryClientMax) {
+        cmsSignalError(ContextID, cmsERROR_RANGE, "Bad context client");
+        return NULL;
+    }
+    
+    ctx = _cmsGetContext(ContextID);
+    ptr = ctx ->chunks[mc];
+
+    if (ptr != NULL)
+        return ptr;
+
+    // A null ptr means no special settings for that context, and this 
+    // reverts to Context0 globals
+    return globalContext.chunks[mc];    
+}
+
+
+// This function returns the given context its default pristine state,
+// as no plug-ins were declared. There is no way to unregister a single 
+// plug-in, as a single call to cmsPluginTHR() function may register 
+// many different plug-ins simultaneously, then there is no way to 
+// identify which plug-in to unregister.
+void CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID)
+{
+    _cmsRegisterMemHandlerPlugin(ContextID, NULL);
+    _cmsRegisterInterpPlugin(ContextID, NULL);
+    _cmsRegisterTagTypePlugin(ContextID, NULL);
+    _cmsRegisterTagPlugin(ContextID, NULL);
+    _cmsRegisterFormattersPlugin(ContextID, NULL);
+    _cmsRegisterRenderingIntentPlugin(ContextID, NULL);
+    _cmsRegisterParametricCurvesPlugin(ContextID, NULL);
+    _cmsRegisterMultiProcessElementPlugin(ContextID, NULL);
+    _cmsRegisterOptimizationPlugin(ContextID, NULL);
+    _cmsRegisterTransformPlugin(ContextID, NULL);    
+    _cmsRegisterMutexPlugin(ContextID, NULL);
+}
+
+
+// Returns the memory manager plug-in, if any, from the Plug-in bundle
+static
+cmsPluginMemHandler* _cmsFindMemoryPlugin(void* PluginBundle)
+{
+    cmsPluginBase* Plugin;
+
+    for (Plugin = (cmsPluginBase*) PluginBundle;
+        Plugin != NULL;
+        Plugin = Plugin -> Next) {
+
+            if (Plugin -> Magic == cmsPluginMagicNumber && 
+                Plugin -> ExpectedVersion <= LCMS_VERSION && 
+                Plugin -> Type == cmsPluginMemHandlerSig) {
+
+                    // Found!
+                    return (cmsPluginMemHandler*) Plugin;  
+            }
+    }
+
+    // Nope, revert to defaults 
+    return NULL;
+}
+
+
+// Creates a new context with optional associated plug-ins. Caller may also specify an optional pointer to user-defined 
+// data that will be forwarded to plug-ins and logger.
+cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData)
+{
+    struct _cmsContext_struct* ctx;
+    struct _cmsContext_struct  fakeContext;
+        
+    _cmsInstallAllocFunctions(_cmsFindMemoryPlugin(Plugin), &fakeContext.DefaultMemoryManager);
+    
+    fakeContext.chunks[UserPtr]     = UserData;
+    fakeContext.chunks[MemPlugin]   = &fakeContext.DefaultMemoryManager;
+
+    // Create the context structure.
+    ctx = (struct _cmsContext_struct*) _cmsMalloc(&fakeContext, sizeof(struct _cmsContext_struct));
+    if (ctx == NULL)   
+        return NULL;     // Something very wrong happened!
+
+    // Init the structure and the memory manager
+    memset(ctx, 0, sizeof(struct _cmsContext_struct));
+
+    // Keep memory manager
+    memcpy(&ctx->DefaultMemoryManager, &fakeContext.DefaultMemoryManager, sizeof(_cmsMemPluginChunk)); 
+   
+    // Maintain the linked list (with proper locking)
+    _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);
+       ctx ->Next = _cmsContextPoolHead;
+       _cmsContextPoolHead = ctx;
+    _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);
+
+    ctx ->chunks[UserPtr]     = UserData;
+    ctx ->chunks[MemPlugin]   = &ctx->DefaultMemoryManager;
+   
+    // Now we can allocate the pool by using default memory manager
+    ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*));  // default size about 32 pointers
+    if (ctx ->MemPool == NULL) {
+
+         cmsDeleteContext(ctx);
+        return NULL;
+    }
+
+    _cmsAllocLogErrorChunk(ctx, NULL);
+    _cmsAllocAlarmCodesChunk(ctx, NULL);
+    _cmsAllocAdaptationStateChunk(ctx, NULL);
+    _cmsAllocMemPluginChunk(ctx, NULL);
+    _cmsAllocInterpPluginChunk(ctx, NULL);
+    _cmsAllocCurvesPluginChunk(ctx, NULL);
+    _cmsAllocFormattersPluginChunk(ctx, NULL);
+    _cmsAllocTagTypePluginChunk(ctx, NULL);
+    _cmsAllocMPETypePluginChunk(ctx, NULL);
+    _cmsAllocTagPluginChunk(ctx, NULL);
+    _cmsAllocIntentsPluginChunk(ctx, NULL);
+    _cmsAllocOptimizationPluginChunk(ctx, NULL);
+    _cmsAllocTransformPluginChunk(ctx, NULL);
+    _cmsAllocMutexPluginChunk(ctx, NULL);
+
+    // Setup the plug-ins
+    if (!cmsPluginTHR(ctx, Plugin)) {
+    
+        cmsDeleteContext(ctx);
+        return NULL;
+    }
+
+    return (cmsContext) ctx;  
+}
+
+// Duplicates a context with all associated plug-ins. 
+// Caller may specify an optional pointer to user-defined 
+// data that will be forwarded to plug-ins and logger. 
+cmsContext CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData)
+{
+    int i;
+    struct _cmsContext_struct* ctx;
+    const struct _cmsContext_struct* src = _cmsGetContext(ContextID);
+
+    void* userData = (NewUserData != NULL) ? NewUserData : src -> chunks[UserPtr];
+    
+    
+    ctx = (struct _cmsContext_struct*) _cmsMalloc(ContextID, sizeof(struct _cmsContext_struct));
+    if (ctx == NULL)   
+        return NULL;     // Something very wrong happened
+
+    // Setup default memory allocators
+    memcpy(&ctx->DefaultMemoryManager, &src->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager));
+
+    // Maintain the linked list
+    _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);
+       ctx ->Next = _cmsContextPoolHead;
+       _cmsContextPoolHead = ctx;
+    _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);
+
+    ctx ->chunks[UserPtr]    = userData;
+    ctx ->chunks[MemPlugin]  = &ctx->DefaultMemoryManager;
+
+    ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*));
+    if (ctx ->MemPool == NULL) {
+
+         cmsDeleteContext(ctx);
+        return NULL;
+    }
+
+    // Allocate all required chunks.
+    _cmsAllocLogErrorChunk(ctx, src);
+    _cmsAllocAlarmCodesChunk(ctx, src);
+    _cmsAllocAdaptationStateChunk(ctx, src);
+    _cmsAllocMemPluginChunk(ctx, src);
+    _cmsAllocInterpPluginChunk(ctx, src);
+    _cmsAllocCurvesPluginChunk(ctx, src);
+    _cmsAllocFormattersPluginChunk(ctx, src);
+    _cmsAllocTagTypePluginChunk(ctx, src);
+    _cmsAllocMPETypePluginChunk(ctx, src);
+    _cmsAllocTagPluginChunk(ctx, src);
+    _cmsAllocIntentsPluginChunk(ctx, src);
+    _cmsAllocOptimizationPluginChunk(ctx, src);
+    _cmsAllocTransformPluginChunk(ctx, src);
+    _cmsAllocMutexPluginChunk(ctx, src);
+
+    // Make sure no one failed
+    for (i=Logger; i < MemoryClientMax; i++) {
+
+        if (src ->chunks[i] == NULL) {
+            cmsDeleteContext((cmsContext) ctx);
+            return NULL;
+        }
+    }
+
+    return (cmsContext) ctx;
+}
+
+
+
+static
+struct _cmsContext_struct* FindPrev(struct _cmsContext_struct* id)
+{
+    struct _cmsContext_struct* prev;
+
+    // Search for previous
+    for (prev = _cmsContextPoolHead; 
+             prev != NULL;
+             prev = prev ->Next)
+    {
+        if (prev ->Next == id)
+            return prev;
+    }
+
+    return NULL;  // List is empty or only one element!
+}
+
+// Frees any resources associated with the given context, 
+// and destroys the context placeholder. 
+// The ContextID can no longer be used in any THR operation.  
+void CMSEXPORT cmsDeleteContext(cmsContext ContextID)
+{
+    if (ContextID != NULL) {
+
+        struct _cmsContext_struct* ctx = (struct _cmsContext_struct*) ContextID;              
+        struct _cmsContext_struct  fakeContext;  
+        struct _cmsContext_struct* prev;
+
+        memcpy(&fakeContext.DefaultMemoryManager, &ctx->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager));
+
+        fakeContext.chunks[UserPtr]     = ctx ->chunks[UserPtr];
+        fakeContext.chunks[MemPlugin]   = &fakeContext.DefaultMemoryManager;
+
+        // Get rid of plugins
+        cmsUnregisterPluginsTHR(ContextID); 
+
+        // Since all memory is allocated in the private pool, all what we need to do is destroy the pool
+        if (ctx -> MemPool != NULL)
+              _cmsSubAllocDestroy(ctx ->MemPool);
+        ctx -> MemPool = NULL;
+
+        // Maintain list
+        _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);
+        if (_cmsContextPoolHead == ctx) { 
+
+            _cmsContextPoolHead = ctx->Next;
+        }
+        else {
+
+            // Search for previous
+            for (prev = _cmsContextPoolHead; 
+                prev != NULL;
+                prev = prev ->Next)
+            {
+                if (prev -> Next == ctx) {
+                    prev -> Next = ctx ->Next;
+                    break;
+                }
+            }
+        }
+        _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);
+
+        // free the memory block itself
+        _cmsFree(&fakeContext, ctx);
+    }
+}
+
+// Returns the user data associated to the given ContextID, or NULL if no user data was attached on context creation
+void* CMSEXPORT cmsGetContextUserData(cmsContext ContextID)
+{
+    return _cmsContextGetClientChunk(ContextID, UserPtr);
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsps2.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsps2.c
new file mode 100644
index 0000000..224b44b
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsps2.c
@@ -0,0 +1,1597 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2011 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// PostScript ColorRenderingDictionary and ColorSpaceArray
+
+
+#define MAXPSCOLS   60      // Columns on tables
+
+/*
+    Implementation
+    --------------
+
+  PostScript does use XYZ as its internal PCS. But since PostScript
+  interpolation tables are limited to 8 bits, I use Lab as a way to
+  improve the accuracy, favoring perceptual results. So, for the creation
+  of each CRD, CSA the profiles are converted to Lab via a device
+  link between  profile -> Lab or Lab -> profile. The PS code necessary to
+  convert Lab <-> XYZ is also included.
+
+
+
+  Color Space Arrays (CSA)
+  ==================================================================================
+
+  In order to obtain precision, code chooses between three ways to implement
+  the device -> XYZ transform. These cases identifies monochrome profiles (often
+  implemented as a set of curves), matrix-shaper and Pipeline-based.
+
+  Monochrome
+  -----------
+
+  This is implemented as /CIEBasedA CSA. The prelinearization curve is
+  placed into /DecodeA section, and matrix equals to D50. Since here is
+  no interpolation tables, I do the conversion directly to XYZ
+
+  NOTE: CLUT-based monochrome profiles are NOT supported. So, cmsFLAGS_MATRIXINPUT
+  flag is forced on such profiles.
+
+    [ /CIEBasedA
+      <<
+            /DecodeA { transfer function } bind
+            /MatrixA [D50]
+            /RangeLMN [ 0.0 cmsD50X 0.0 cmsD50Y 0.0 cmsD50Z ]
+            /WhitePoint [D50]
+            /BlackPoint [BP]
+            /RenderingIntent (intent)
+      >>
+    ]
+
+   On simpler profiles, the PCS is already XYZ, so no conversion is required.
+
+
+   Matrix-shaper based
+   -------------------
+
+   This is implemented both with /CIEBasedABC or /CIEBasedDEF on dependig
+   of profile implementation. Since here there are no interpolation tables, I do
+   the conversion directly to XYZ
+
+
+
+    [ /CIEBasedABC
+            <<
+                /DecodeABC [ {transfer1} {transfer2} {transfer3} ]
+                /MatrixABC [Matrix]
+                /RangeLMN [ 0.0 cmsD50X 0.0 cmsD50Y 0.0 cmsD50Z ]
+                /DecodeLMN [ { / 2} dup dup ]
+                /WhitePoint [D50]
+                /BlackPoint [BP]
+                /RenderingIntent (intent)
+            >>
+    ]
+
+
+    CLUT based
+    ----------
+
+     Lab is used in such cases.
+
+    [ /CIEBasedDEF
+            <<
+            /DecodeDEF [ <prelinearization> ]
+            /Table [ p p p [<...>]]
+            /RangeABC [ 0 1 0 1 0 1]
+            /DecodeABC[ <postlinearization> ]
+            /RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]
+               % -128/500 1+127/500 0 1  -127/200 1+128/200
+            /MatrixABC [ 1 1 1 1 0 0 0 0 -1]
+            /WhitePoint [D50]
+            /BlackPoint [BP]
+            /RenderingIntent (intent)
+    ]
+
+
+  Color Rendering Dictionaries (CRD)
+  ==================================
+  These are always implemented as CLUT, and always are using Lab. Since CRD are expected to
+  be used as resources, the code adds the definition as well.
+
+  <<
+    /ColorRenderingType 1
+    /WhitePoint [ D50 ]
+    /BlackPoint [BP]
+    /MatrixPQR [ Bradford ]
+    /RangePQR [-0.125 1.375 -0.125 1.375 -0.125 1.375 ]
+    /TransformPQR [
+    {4 index 3 get div 2 index 3 get mul exch pop exch pop exch pop exch pop } bind
+    {4 index 4 get div 2 index 4 get mul exch pop exch pop exch pop exch pop } bind
+    {4 index 5 get div 2 index 5 get mul exch pop exch pop exch pop exch pop } bind
+    ]
+    /MatrixABC <...>
+    /EncodeABC <...>
+    /RangeABC  <.. used for  XYZ -> Lab>
+    /EncodeLMN
+    /RenderTable [ p p p [<...>]]
+
+    /RenderingIntent (Perceptual)
+  >>
+  /Current exch /ColorRendering defineresource pop
+
+
+  The following stages are used to convert from XYZ to Lab
+  --------------------------------------------------------
+
+  Input is given at LMN stage on X, Y, Z
+
+  Encode LMN gives us f(X/Xn), f(Y/Yn), f(Z/Zn)
+
+  /EncodeLMN [
+
+    { 0.964200  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+    { 1.000000  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+    { 0.824900  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+
+    ]
+
+
+  MatrixABC is used to compute f(Y/Yn), f(X/Xn) - f(Y/Yn), f(Y/Yn) - f(Z/Zn)
+
+  | 0  1  0|
+  | 1 -1  0|
+  | 0  1 -1|
+
+  /MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]
+
+ EncodeABC finally gives Lab values.
+
+  /EncodeABC [
+    { 116 mul  16 sub 100 div  } bind
+    { 500 mul 128 add 255 div  } bind
+    { 200 mul 128 add 255 div  } bind
+    ]
+
+  The following stages are used to convert Lab to XYZ
+  ----------------------------------------------------
+
+    /RangeABC [ 0 1 0 1 0 1]
+    /DecodeABC [ { 100 mul 16 add 116 div } bind
+                 { 255 mul 128 sub 500 div } bind
+                 { 255 mul 128 sub 200 div } bind
+               ]
+
+    /MatrixABC [ 1 1 1 1 0 0 0 0 -1]
+    /DecodeLMN [
+                {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind
+                {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind
+                {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind
+                ]
+
+
+*/
+
+/*
+
+ PostScript algorithms discussion.
+ =========================================================================================================
+
+  1D interpolation algorithm
+
+
+  1D interpolation (float)
+  ------------------------
+
+    val2 = Domain * Value;
+
+    cell0 = (int) floor(val2);
+    cell1 = (int) ceil(val2);
+
+    rest = val2 - cell0;
+
+    y0 = LutTable[cell0] ;
+    y1 = LutTable[cell1] ;
+
+    y = y0 + (y1 - y0) * rest;
+
+
+
+  PostScript code                   Stack
+  ================================================
+
+  {                                 % v
+    <check 0..1.0>
+    [array]                         % v tab
+    dup                             % v tab tab
+    length 1 sub                    % v tab dom
+
+    3 -1 roll                       % tab dom v
+
+    mul                             % tab val2
+    dup                             % tab val2 val2
+    dup                             % tab val2 val2 val2
+    floor cvi                       % tab val2 val2 cell0
+    exch                            % tab val2 cell0 val2
+    ceiling cvi                     % tab val2 cell0 cell1
+
+    3 index                         % tab val2 cell0 cell1 tab
+    exch                            % tab val2 cell0 tab cell1
+    get                             % tab val2 cell0 y1
+
+    4 -1 roll                       % val2 cell0 y1 tab
+    3 -1 roll                       % val2 y1 tab cell0
+    get                             % val2 y1 y0
+
+    dup                             % val2 y1 y0 y0
+    3 1 roll                        % val2 y0 y1 y0
+
+    sub                             % val2 y0 (y1-y0)
+    3 -1 roll                       % y0 (y1-y0) val2
+    dup                             % y0 (y1-y0) val2 val2
+    floor cvi                       % y0 (y1-y0) val2 floor(val2)
+    sub                             % y0 (y1-y0) rest
+    mul                             % y0 t1
+    add                             % y
+    65535 div                       % result
+
+  } bind
+
+
+*/
+
+
+// This struct holds the memory block currently being write
+typedef struct {
+    _cmsStageCLutData* Pipeline;
+    cmsIOHANDLER* m;
+
+    int FirstComponent;
+    int SecondComponent;
+
+    const char* PreMaj;
+    const char* PostMaj;
+    const char* PreMin;
+    const char* PostMin;
+
+    int  FixWhite;    // Force mapping of pure white
+
+    cmsColorSpaceSignature  ColorSpace;  // ColorSpace of profile
+
+
+} cmsPsSamplerCargo;
+
+static int _cmsPSActualColumn = 0;
+
+
+// Convert to byte
+static
+cmsUInt8Number Word2Byte(cmsUInt16Number w)
+{
+    return (cmsUInt8Number) floor((cmsFloat64Number) w / 257.0 + 0.5);
+}
+
+
+// Convert to byte (using ICC2 notation)
+/*
+static
+cmsUInt8Number L2Byte(cmsUInt16Number w)
+{
+    int ww = w + 0x0080;
+
+    if (ww > 0xFFFF) return 0xFF;
+
+    return (cmsUInt8Number) ((cmsUInt16Number) (ww >> 8) & 0xFF);
+}
+*/
+
+// Write a cooked byte
+
+static
+void WriteByte(cmsIOHANDLER* m, cmsUInt8Number b)
+{
+    _cmsIOPrintf(m, "%02x", b);
+    _cmsPSActualColumn += 2;
+
+    if (_cmsPSActualColumn > MAXPSCOLS) {
+
+        _cmsIOPrintf(m, "\n");
+        _cmsPSActualColumn = 0;
+    }
+}
+
+// ----------------------------------------------------------------- PostScript generation
+
+
+// Removes offending Carriage returns
+static
+char* RemoveCR(const char* txt)
+{
+    static char Buffer[2048];
+    char* pt;
+
+    strncpy(Buffer, txt, 2047);
+    Buffer[2047] = 0;
+    for (pt = Buffer; *pt; pt++)
+            if (*pt == '\n' || *pt == '\r') *pt = ' ';
+
+    return Buffer;
+
+}
+
+static
+void EmitHeader(cmsIOHANDLER* m, const char* Title, cmsHPROFILE hProfile)
+{
+    time_t timer;
+    cmsMLU *Description, *Copyright;
+    char DescASCII[256], CopyrightASCII[256];
+
+    time(&timer);
+
+    Description = (cmsMLU*) cmsReadTag(hProfile, cmsSigProfileDescriptionTag);
+    Copyright   = (cmsMLU*) cmsReadTag(hProfile, cmsSigCopyrightTag);
+
+    DescASCII[0] = DescASCII[255] = 0;
+    CopyrightASCII[0] = CopyrightASCII[255] = 0;
+
+    if (Description != NULL) cmsMLUgetASCII(Description,  cmsNoLanguage, cmsNoCountry, DescASCII,       255);
+    if (Copyright != NULL)   cmsMLUgetASCII(Copyright,    cmsNoLanguage, cmsNoCountry, CopyrightASCII,  255);
+
+    _cmsIOPrintf(m, "%%!PS-Adobe-3.0\n");
+    _cmsIOPrintf(m, "%%\n");
+    _cmsIOPrintf(m, "%% %s\n", Title);
+    _cmsIOPrintf(m, "%% Source: %s\n", RemoveCR(DescASCII));
+    _cmsIOPrintf(m, "%%         %s\n", RemoveCR(CopyrightASCII));
+    _cmsIOPrintf(m, "%% Created: %s", ctime(&timer)); // ctime appends a \n!!!
+    _cmsIOPrintf(m, "%%\n");
+    _cmsIOPrintf(m, "%%%%BeginResource\n");
+
+}
+
+
+// Emits White & Black point. White point is always D50, Black point is the device
+// Black point adapted to D50.
+
+static
+void EmitWhiteBlackD50(cmsIOHANDLER* m, cmsCIEXYZ* BlackPoint)
+{
+
+    _cmsIOPrintf(m, "/BlackPoint [%f %f %f]\n", BlackPoint -> X,
+                                          BlackPoint -> Y,
+                                          BlackPoint -> Z);
+
+    _cmsIOPrintf(m, "/WhitePoint [%f %f %f]\n", cmsD50_XYZ()->X,
+                                          cmsD50_XYZ()->Y,
+                                          cmsD50_XYZ()->Z);
+}
+
+
+static
+void EmitRangeCheck(cmsIOHANDLER* m)
+{
+    _cmsIOPrintf(m, "dup 0.0 lt { pop 0.0 } if "
+                    "dup 1.0 gt { pop 1.0 } if ");
+
+}
+
+// Does write the intent
+
+static
+void EmitIntent(cmsIOHANDLER* m, int RenderingIntent)
+{
+    const char *intent;
+
+    switch (RenderingIntent) {
+
+        case INTENT_PERCEPTUAL:            intent = "Perceptual"; break;
+        case INTENT_RELATIVE_COLORIMETRIC: intent = "RelativeColorimetric"; break;
+        case INTENT_ABSOLUTE_COLORIMETRIC: intent = "AbsoluteColorimetric"; break;
+        case INTENT_SATURATION:            intent = "Saturation"; break;
+
+        default: intent = "Undefined"; break;
+    }
+
+    _cmsIOPrintf(m, "/RenderingIntent (%s)\n", intent );
+}
+
+//
+//  Convert L* to Y
+//
+//      Y = Yn*[ (L* + 16) / 116] ^ 3   if (L*) >= 6 / 29
+//        = Yn*( L* / 116) / 7.787      if (L*) < 6 / 29
+//
+
+/*
+static
+void EmitL2Y(cmsIOHANDLER* m)
+{
+    _cmsIOPrintf(m,
+            "{ "
+                "100 mul 16 add 116 div "               // (L * 100 + 16) / 116
+                 "dup 6 29 div ge "                     // >= 6 / 29 ?
+                 "{ dup dup mul mul } "                 // yes, ^3 and done
+                 "{ 4 29 div sub 108 841 div mul } "    // no, slope limiting
+            "ifelse } bind ");
+}
+*/
+
+
+// Lab -> XYZ, see the discussion above
+
+static
+void EmitLab2XYZ(cmsIOHANDLER* m)
+{
+    _cmsIOPrintf(m, "/RangeABC [ 0 1 0 1 0 1]\n");
+    _cmsIOPrintf(m, "/DecodeABC [\n");
+    _cmsIOPrintf(m, "{100 mul  16 add 116 div } bind\n");
+    _cmsIOPrintf(m, "{255 mul 128 sub 500 div } bind\n");
+    _cmsIOPrintf(m, "{255 mul 128 sub 200 div } bind\n");
+    _cmsIOPrintf(m, "]\n");
+    _cmsIOPrintf(m, "/MatrixABC [ 1 1 1 1 0 0 0 0 -1]\n");
+    _cmsIOPrintf(m, "/RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]\n");
+    _cmsIOPrintf(m, "/DecodeLMN [\n");
+    _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind\n");
+    _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind\n");
+    _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind\n");
+    _cmsIOPrintf(m, "]\n");
+}
+
+
+
+// Outputs a table of words. It does use 16 bits
+
+static
+void Emit1Gamma(cmsIOHANDLER* m, cmsToneCurve* Table)
+{
+    cmsUInt32Number i;
+    cmsFloat64Number gamma;
+
+    if (Table == NULL) return; // Error
+
+    if (Table ->nEntries <= 0) return;  // Empty table
+
+    // Suppress whole if identity
+    if (cmsIsToneCurveLinear(Table)) return;
+
+    // Check if is really an exponential. If so, emit "exp"
+    gamma = cmsEstimateGamma(Table, 0.001);
+     if (gamma > 0) {
+            _cmsIOPrintf(m, "{ %g exp } bind ", gamma);
+            return;
+     }
+
+    _cmsIOPrintf(m, "{ ");
+
+    // Bounds check
+    EmitRangeCheck(m);
+
+    // Emit intepolation code
+
+    // PostScript code                      Stack
+    // ===============                      ========================
+                                            // v
+    _cmsIOPrintf(m, " [");
+
+    for (i=0; i < Table->nEntries; i++) {
+        _cmsIOPrintf(m, "%d ", Table->Table16[i]);
+    }
+
+    _cmsIOPrintf(m, "] ");                        // v tab
+
+    _cmsIOPrintf(m, "dup ");                      // v tab tab
+    _cmsIOPrintf(m, "length 1 sub ");             // v tab dom
+    _cmsIOPrintf(m, "3 -1 roll ");                // tab dom v
+    _cmsIOPrintf(m, "mul ");                      // tab val2
+    _cmsIOPrintf(m, "dup ");                      // tab val2 val2
+    _cmsIOPrintf(m, "dup ");                      // tab val2 val2 val2
+    _cmsIOPrintf(m, "floor cvi ");                // tab val2 val2 cell0
+    _cmsIOPrintf(m, "exch ");                     // tab val2 cell0 val2
+    _cmsIOPrintf(m, "ceiling cvi ");              // tab val2 cell0 cell1
+    _cmsIOPrintf(m, "3 index ");                  // tab val2 cell0 cell1 tab
+    _cmsIOPrintf(m, "exch ");                     // tab val2 cell0 tab cell1
+    _cmsIOPrintf(m, "get ");                      // tab val2 cell0 y1
+    _cmsIOPrintf(m, "4 -1 roll ");                // val2 cell0 y1 tab
+    _cmsIOPrintf(m, "3 -1 roll ");                // val2 y1 tab cell0
+    _cmsIOPrintf(m, "get ");                      // val2 y1 y0
+    _cmsIOPrintf(m, "dup ");                      // val2 y1 y0 y0
+    _cmsIOPrintf(m, "3 1 roll ");                 // val2 y0 y1 y0
+    _cmsIOPrintf(m, "sub ");                      // val2 y0 (y1-y0)
+    _cmsIOPrintf(m, "3 -1 roll ");                // y0 (y1-y0) val2
+    _cmsIOPrintf(m, "dup ");                      // y0 (y1-y0) val2 val2
+    _cmsIOPrintf(m, "floor cvi ");                // y0 (y1-y0) val2 floor(val2)
+    _cmsIOPrintf(m, "sub ");                      // y0 (y1-y0) rest
+    _cmsIOPrintf(m, "mul ");                      // y0 t1
+    _cmsIOPrintf(m, "add ");                      // y
+    _cmsIOPrintf(m, "65535 div ");                // result
+
+    _cmsIOPrintf(m, " } bind ");
+}
+
+
+// Compare gamma table
+
+static
+cmsBool GammaTableEquals(cmsUInt16Number* g1, cmsUInt16Number* g2, int nEntries)
+{
+    return memcmp(g1, g2, nEntries* sizeof(cmsUInt16Number)) == 0;
+}
+
+
+// Does write a set of gamma curves
+
+static
+void EmitNGamma(cmsIOHANDLER* m, int n, cmsToneCurve* g[])
+{
+    int i;
+
+    for( i=0; i < n; i++ )
+    {
+        if (g[i] == NULL) return; // Error
+
+        if (i > 0 && GammaTableEquals(g[i-1]->Table16, g[i]->Table16, g[i]->nEntries)) {
+
+            _cmsIOPrintf(m, "dup ");
+        }
+        else {
+            Emit1Gamma(m, g[i]);
+        }
+    }
+
+}
+
+
+
+
+
+// Following code dumps a LUT onto memory stream
+
+
+// This is the sampler. Intended to work in SAMPLER_INSPECT mode,
+// that is, the callback will be called for each knot with
+//
+//          In[]  The grid location coordinates, normalized to 0..ffff
+//          Out[] The Pipeline values, normalized to 0..ffff
+//
+//  Returning a value other than 0 does terminate the sampling process
+//
+//  Each row contains Pipeline values for all but first component. So, I
+//  detect row changing by keeping a copy of last value of first
+//  component. -1 is used to mark begining of whole block.
+
+static
+int OutputValueSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+    cmsPsSamplerCargo* sc = (cmsPsSamplerCargo*) Cargo;
+    cmsUInt32Number i;
+
+
+    if (sc -> FixWhite) {
+
+        if (In[0] == 0xFFFF) {  // Only in L* = 100, ab = [-8..8]
+
+            if ((In[1] >= 0x7800 && In[1] <= 0x8800) &&
+                (In[2] >= 0x7800 && In[2] <= 0x8800)) {
+
+                cmsUInt16Number* Black;
+                cmsUInt16Number* White;
+                cmsUInt32Number nOutputs;
+
+                if (!_cmsEndPointsBySpace(sc ->ColorSpace, &White, &Black, &nOutputs))
+                        return 0;
+
+                for (i=0; i < nOutputs; i++)
+                        Out[i] = White[i];
+            }
+
+
+        }
+    }
+
+
+    // Hadle the parenthesis on rows
+
+    if (In[0] != sc ->FirstComponent) {
+
+            if (sc ->FirstComponent != -1) {
+
+                    _cmsIOPrintf(sc ->m, sc ->PostMin);
+                    sc ->SecondComponent = -1;
+                    _cmsIOPrintf(sc ->m, sc ->PostMaj);
+            }
+
+            // Begin block
+            _cmsPSActualColumn = 0;
+
+            _cmsIOPrintf(sc ->m, sc ->PreMaj);
+            sc ->FirstComponent = In[0];
+    }
+
+
+      if (In[1] != sc ->SecondComponent) {
+
+            if (sc ->SecondComponent != -1) {
+
+                    _cmsIOPrintf(sc ->m, sc ->PostMin);
+            }
+
+            _cmsIOPrintf(sc ->m, sc ->PreMin);
+            sc ->SecondComponent = In[1];
+    }
+
+      // Dump table.
+
+      for (i=0; i < sc -> Pipeline ->Params->nOutputs; i++) {
+
+          cmsUInt16Number wWordOut = Out[i];
+          cmsUInt8Number wByteOut;           // Value as byte
+
+
+          // We always deal with Lab4
+
+          wByteOut = Word2Byte(wWordOut);
+          WriteByte(sc -> m, wByteOut);
+      }
+
+      return 1;
+}
+
+// Writes a Pipeline on memstream. Could be 8 or 16 bits based
+
+static
+void WriteCLUT(cmsIOHANDLER* m, cmsStage* mpe, const char* PreMaj,
+                                             const char* PostMaj,
+                                             const char* PreMin,
+                                             const char* PostMin,
+                                             int FixWhite,
+                                             cmsColorSpaceSignature ColorSpace)
+{
+    cmsUInt32Number i;
+    cmsPsSamplerCargo sc;
+
+    sc.FirstComponent = -1;
+    sc.SecondComponent = -1;
+    sc.Pipeline = (_cmsStageCLutData *) mpe ->Data;
+    sc.m   = m;
+    sc.PreMaj = PreMaj;
+    sc.PostMaj= PostMaj;
+
+    sc.PreMin   = PreMin;
+    sc.PostMin  = PostMin;
+    sc.FixWhite = FixWhite;
+    sc.ColorSpace = ColorSpace;
+
+    _cmsIOPrintf(m, "[");
+
+    for (i=0; i < sc.Pipeline->Params->nInputs; i++)
+        _cmsIOPrintf(m, " %d ", sc.Pipeline->Params->nSamples[i]);
+
+    _cmsIOPrintf(m, " [\n");
+
+    cmsStageSampleCLut16bit(mpe, OutputValueSampler, (void*) &sc, SAMPLER_INSPECT);
+
+    _cmsIOPrintf(m, PostMin);
+    _cmsIOPrintf(m, PostMaj);
+    _cmsIOPrintf(m, "] ");
+
+}
+
+
+// Dumps CIEBasedA Color Space Array
+
+static
+int EmitCIEBasedA(cmsIOHANDLER* m, cmsToneCurve* Curve, cmsCIEXYZ* BlackPoint)
+{
+
+    _cmsIOPrintf(m, "[ /CIEBasedA\n");
+    _cmsIOPrintf(m, "  <<\n");
+
+    _cmsIOPrintf(m, "/DecodeA ");
+
+    Emit1Gamma(m, Curve);
+
+    _cmsIOPrintf(m, " \n");
+
+    _cmsIOPrintf(m, "/MatrixA [ 0.9642 1.0000 0.8249 ]\n");
+    _cmsIOPrintf(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n");
+
+    EmitWhiteBlackD50(m, BlackPoint);
+    EmitIntent(m, INTENT_PERCEPTUAL);
+
+    _cmsIOPrintf(m, ">>\n");
+    _cmsIOPrintf(m, "]\n");
+
+    return 1;
+}
+
+
+// Dumps CIEBasedABC Color Space Array
+
+static
+int EmitCIEBasedABC(cmsIOHANDLER* m, cmsFloat64Number* Matrix, cmsToneCurve** CurveSet, cmsCIEXYZ* BlackPoint)
+{
+    int i;
+
+    _cmsIOPrintf(m, "[ /CIEBasedABC\n");
+    _cmsIOPrintf(m, "<<\n");
+    _cmsIOPrintf(m, "/DecodeABC [ ");
+
+    EmitNGamma(m, 3, CurveSet);
+
+    _cmsIOPrintf(m, "]\n");
+
+    _cmsIOPrintf(m, "/MatrixABC [ " );
+
+    for( i=0; i < 3; i++ ) {
+
+        _cmsIOPrintf(m, "%.6f %.6f %.6f ", Matrix[i + 3*0],
+                                           Matrix[i + 3*1],
+                                           Matrix[i + 3*2]);
+    }
+
+
+    _cmsIOPrintf(m, "]\n");
+
+    _cmsIOPrintf(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n");
+
+    EmitWhiteBlackD50(m, BlackPoint);
+    EmitIntent(m, INTENT_PERCEPTUAL);
+
+    _cmsIOPrintf(m, ">>\n");
+    _cmsIOPrintf(m, "]\n");
+
+
+    return 1;
+}
+
+
+static
+int EmitCIEBasedDEF(cmsIOHANDLER* m, cmsPipeline* Pipeline, int Intent, cmsCIEXYZ* BlackPoint)
+{
+    const char* PreMaj;
+    const char* PostMaj;
+    const char* PreMin, *PostMin;
+    cmsStage* mpe;
+
+    mpe = Pipeline ->Elements;
+
+    switch (cmsStageInputChannels(mpe)) {
+    case 3:
+
+            _cmsIOPrintf(m, "[ /CIEBasedDEF\n");
+            PreMaj ="<";
+            PostMaj= ">\n";
+            PreMin = PostMin = "";
+            break;
+    case 4:
+            _cmsIOPrintf(m, "[ /CIEBasedDEFG\n");
+            PreMaj = "[";
+            PostMaj = "]\n";
+            PreMin = "<";
+            PostMin = ">\n";
+            break;
+    default:
+            return 0;
+
+    }
+
+    _cmsIOPrintf(m, "<<\n");
+
+    if (cmsStageType(mpe) == cmsSigCurveSetElemType) {
+
+        _cmsIOPrintf(m, "/DecodeDEF [ ");
+        EmitNGamma(m, cmsStageOutputChannels(mpe), _cmsStageGetPtrToCurveSet(mpe));
+        _cmsIOPrintf(m, "]\n");
+
+        mpe = mpe ->Next;
+    }
+
+    if (cmsStageType(mpe) == cmsSigCLutElemType) {
+
+            _cmsIOPrintf(m, "/Table ");
+            WriteCLUT(m, mpe, PreMaj, PostMaj, PreMin, PostMin, FALSE, (cmsColorSpaceSignature) 0);
+            _cmsIOPrintf(m, "]\n");
+    }
+
+    EmitLab2XYZ(m);
+    EmitWhiteBlackD50(m, BlackPoint);
+    EmitIntent(m, Intent);
+
+    _cmsIOPrintf(m, "   >>\n");
+    _cmsIOPrintf(m, "]\n");
+
+    return 1;
+}
+
+// Generates a curve from a gray profile
+
+static
+    cmsToneCurve* ExtractGray2Y(cmsContext ContextID, cmsHPROFILE hProfile, int Intent)
+{
+    cmsToneCurve* Out = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL);
+    cmsHPROFILE hXYZ  = cmsCreateXYZProfile();
+    cmsHTRANSFORM xform = cmsCreateTransformTHR(ContextID, hProfile, TYPE_GRAY_8, hXYZ, TYPE_XYZ_DBL, Intent, cmsFLAGS_NOOPTIMIZE);
+    int i;
+
+    if (Out != NULL) {
+        for (i=0; i < 256; i++) {
+
+            cmsUInt8Number Gray = (cmsUInt8Number) i;
+            cmsCIEXYZ XYZ;
+
+            cmsDoTransform(xform, &Gray, &XYZ, 1);
+
+            Out ->Table16[i] =_cmsQuickSaturateWord(XYZ.Y * 65535.0);
+        }
+    }
+
+    cmsDeleteTransform(xform);
+    cmsCloseProfile(hXYZ);
+    return Out;
+}
+
+
+
+// Because PostScript has only 8 bits in /Table, we should use
+// a more perceptually uniform space... I do choose Lab.
+
+static
+int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Number dwFlags)
+{
+    cmsHPROFILE hLab;
+    cmsHTRANSFORM xform;
+    cmsUInt32Number nChannels;
+    cmsUInt32Number InputFormat;
+    int rc;
+    cmsHPROFILE Profiles[2];
+    cmsCIEXYZ BlackPointAdaptedToD50;
+
+    // Does create a device-link based transform.
+    // The DeviceLink is next dumped as working CSA.
+
+    InputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE);
+    nChannels   = T_CHANNELS(InputFormat);
+
+
+    cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0);
+
+    // Adjust output to Lab4
+    hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL);
+
+    Profiles[0] = hProfile;
+    Profiles[1] = hLab;
+
+    xform = cmsCreateMultiprofileTransform(Profiles, 2,  InputFormat, TYPE_Lab_DBL, Intent, 0);
+    cmsCloseProfile(hLab);
+
+    if (xform == NULL) {
+
+        cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Cannot create transform Profile -> Lab");
+        return 0;
+    }
+
+    // Only 1, 3 and 4 channels are allowed
+
+    switch (nChannels) {
+
+    case 1: {
+            cmsToneCurve* Gray2Y = ExtractGray2Y(m ->ContextID, hProfile, Intent);
+            EmitCIEBasedA(m, Gray2Y, &BlackPointAdaptedToD50);
+            cmsFreeToneCurve(Gray2Y);
+            }
+            break;
+
+    case 3:
+    case 4: {
+            cmsUInt32Number OutFrm = TYPE_Lab_16;
+            cmsPipeline* DeviceLink;
+            _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform;
+
+            DeviceLink = cmsPipelineDup(v ->Lut);
+            if (DeviceLink == NULL) return 0;
+
+            dwFlags |= cmsFLAGS_FORCE_CLUT;
+            _cmsOptimizePipeline(m->ContextID, &DeviceLink, Intent, &InputFormat, &OutFrm, &dwFlags);
+
+            rc = EmitCIEBasedDEF(m, DeviceLink, Intent, &BlackPointAdaptedToD50);
+            cmsPipelineFree(DeviceLink);
+            if (rc == 0) return 0;
+            }
+            break;
+
+    default:
+
+        cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Only 3, 4 channels supported for CSA. This profile has %d channels.", nChannels);
+        return 0;
+    }
+
+
+    cmsDeleteTransform(xform);
+
+    return 1;
+}
+
+static
+cmsFloat64Number* GetPtrToMatrix(const cmsStage* mpe)
+{
+    _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;
+
+    return Data -> Double;
+}
+
+
+// Does create CSA based on matrix-shaper. Allowed types are gray and RGB based
+
+static
+int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matrix, cmsStage* Shaper)
+{
+    cmsColorSpaceSignature ColorSpace;
+    int rc;
+    cmsCIEXYZ BlackPointAdaptedToD50;
+
+    ColorSpace = cmsGetColorSpace(hProfile);
+
+    cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0);
+
+    if (ColorSpace == cmsSigGrayData) {
+
+        cmsToneCurve** ShaperCurve = _cmsStageGetPtrToCurveSet(Shaper);
+        rc = EmitCIEBasedA(m, ShaperCurve[0], &BlackPointAdaptedToD50);
+
+    }
+    else
+        if (ColorSpace == cmsSigRgbData) {
+
+            cmsMAT3 Mat;
+            int i, j;
+
+            memmove(&Mat, GetPtrToMatrix(Matrix), sizeof(Mat));
+
+            for (i=0; i < 3; i++)
+                for (j=0; j < 3; j++)
+                    Mat.v[i].n[j] *= MAX_ENCODEABLE_XYZ;
+
+            rc = EmitCIEBasedABC(m,  (cmsFloat64Number *) &Mat,
+                                _cmsStageGetPtrToCurveSet(Shaper),
+                                 &BlackPointAdaptedToD50);
+        }
+        else  {
+
+            cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Profile is not suitable for CSA. Unsupported colorspace.");
+            return 0;
+        }
+
+        return rc;
+}
+
+
+
+// Creates a PostScript color list from a named profile data.
+// This is a HP extension, and it works in Lab instead of XYZ
+
+static
+int WriteNamedColorCSA(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, int Intent)
+{
+    cmsHTRANSFORM xform;
+    cmsHPROFILE   hLab;
+    int i, nColors;
+    char ColorName[32];
+    cmsNAMEDCOLORLIST* NamedColorList;
+
+    hLab  = cmsCreateLab4ProfileTHR(m ->ContextID, NULL);
+    xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX, hLab, TYPE_Lab_DBL, Intent, 0);
+    if (xform == NULL) return 0;
+
+    NamedColorList = cmsGetNamedColorList(xform);
+    if (NamedColorList == NULL) return 0;
+
+    _cmsIOPrintf(m, "<<\n");
+    _cmsIOPrintf(m, "(colorlistcomment) (%s)\n", "Named color CSA");
+    _cmsIOPrintf(m, "(Prefix) [ (Pantone ) (PANTONE ) ]\n");
+    _cmsIOPrintf(m, "(Suffix) [ ( CV) ( CVC) ( C) ]\n");
+
+    nColors   = cmsNamedColorCount(NamedColorList);
+
+
+    for (i=0; i < nColors; i++) {
+
+        cmsUInt16Number In[1];
+        cmsCIELab Lab;
+
+        In[0] = (cmsUInt16Number) i;
+
+        if (!cmsNamedColorInfo(NamedColorList, i, ColorName, NULL, NULL, NULL, NULL))
+                continue;
+
+        cmsDoTransform(xform, In, &Lab, 1);
+        _cmsIOPrintf(m, "  (%s) [ %.3f %.3f %.3f ]\n", ColorName, Lab.L, Lab.a, Lab.b);
+    }
+
+
+
+    _cmsIOPrintf(m, ">>\n");
+
+    cmsDeleteTransform(xform);
+    cmsCloseProfile(hLab);
+    return 1;
+}
+
+
+// Does create a Color Space Array on XYZ colorspace for PostScript usage
+static
+cmsUInt32Number GenerateCSA(cmsContext ContextID,
+                            cmsHPROFILE hProfile,
+                            cmsUInt32Number Intent,
+                            cmsUInt32Number dwFlags,
+                            cmsIOHANDLER* mem)
+{
+    cmsUInt32Number dwBytesUsed;
+    cmsPipeline* lut = NULL;
+    cmsStage* Matrix, *Shaper;
+
+
+    // Is a named color profile?
+    if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {
+
+        if (!WriteNamedColorCSA(mem, hProfile, Intent)) goto Error;
+    }
+    else {
+
+
+        // Any profile class are allowed (including devicelink), but
+        // output (PCS) colorspace must be XYZ or Lab
+        cmsColorSpaceSignature ColorSpace = cmsGetPCS(hProfile);
+
+        if (ColorSpace != cmsSigXYZData &&
+            ColorSpace != cmsSigLabData) {
+
+                cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Invalid output color space");
+                goto Error;
+        }
+
+
+        // Read the lut with all necessary conversion stages
+        lut = _cmsReadInputLUT(hProfile, Intent);
+        if (lut == NULL) goto Error;
+
+
+        // Tone curves + matrix can be implemented without any LUT
+        if (cmsPipelineCheckAndRetreiveStages(lut, 2, cmsSigCurveSetElemType, cmsSigMatrixElemType, &Shaper, &Matrix)) {
+
+            if (!WriteInputMatrixShaper(mem, hProfile, Matrix, Shaper)) goto Error;
+
+        }
+        else {
+           // We need a LUT for the rest
+           if (!WriteInputLUT(mem, hProfile, Intent, dwFlags)) goto Error;
+        }
+    }
+
+
+    // Done, keep memory usage
+    dwBytesUsed = mem ->UsedSpace;
+
+    // Get rid of LUT
+    if (lut != NULL) cmsPipelineFree(lut);
+
+    // Finally, return used byte count
+    return dwBytesUsed;
+
+Error:
+    if (lut != NULL) cmsPipelineFree(lut);
+    return 0;
+}
+
+// ------------------------------------------------------ Color Rendering Dictionary (CRD)
+
+
+
+/*
+
+  Black point compensation plus chromatic adaptation:
+
+  Step 1 - Chromatic adaptation
+  =============================
+
+          WPout
+    X = ------- PQR
+          Wpin
+
+  Step 2 - Black point compensation
+  =================================
+
+          (WPout - BPout)*X - WPout*(BPin - BPout)
+    out = ---------------------------------------
+                        WPout - BPin
+
+
+  Algorithm discussion
+  ====================
+
+  TransformPQR(WPin, BPin, WPout, BPout, PQR)
+
+  Wpin,etc= { Xws Yws Zws Pws Qws Rws }
+
+
+  Algorithm             Stack 0...n
+  ===========================================================
+                        PQR BPout WPout BPin WPin
+  4 index 3 get         WPin PQR BPout WPout BPin WPin
+  div                   (PQR/WPin) BPout WPout BPin WPin
+  2 index 3 get         WPout (PQR/WPin) BPout WPout BPin WPin
+  mult                  WPout*(PQR/WPin) BPout WPout BPin WPin
+
+  2 index 3 get         WPout WPout*(PQR/WPin) BPout WPout BPin WPin
+  2 index 3 get         BPout WPout WPout*(PQR/WPin) BPout WPout BPin WPin
+  sub                   (WPout-BPout) WPout*(PQR/WPin) BPout WPout BPin WPin
+  mult                  (WPout-BPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+
+  2 index 3 get         WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+  4 index 3 get         BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+  3 index 3 get         BPout BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+
+  sub                   (BPin-BPout) WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+  mult                  (BPin-BPout)*WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+  sub                   (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin
+
+  3 index 3 get         BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin
+  3 index 3 get         WPout BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin
+  exch
+  sub                   (WPout-BPin) (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin
+  div
+
+  exch pop
+  exch pop
+  exch pop
+  exch pop
+
+*/
+
+
+static
+void EmitPQRStage(cmsIOHANDLER* m, cmsHPROFILE hProfile, int DoBPC, int lIsAbsolute)
+{
+
+
+        if (lIsAbsolute) {
+
+            // For absolute colorimetric intent, encode back to relative
+            // and generate a relative Pipeline
+
+            // Relative encoding is obtained across XYZpcs*(D50/WhitePoint)
+
+            cmsCIEXYZ White;
+
+            _cmsReadMediaWhitePoint(&White, hProfile);
+
+            _cmsIOPrintf(m,"/MatrixPQR [1 0 0 0 1 0 0 0 1 ]\n");
+            _cmsIOPrintf(m,"/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n");
+
+            _cmsIOPrintf(m, "%% Absolute colorimetric -- encode to relative to maximize LUT usage\n"
+                      "/TransformPQR [\n"
+                      "{0.9642 mul %g div exch pop exch pop exch pop exch pop} bind\n"
+                      "{1.0000 mul %g div exch pop exch pop exch pop exch pop} bind\n"
+                      "{0.8249 mul %g div exch pop exch pop exch pop exch pop} bind\n]\n",
+                      White.X, White.Y, White.Z);
+            return;
+        }
+
+
+        _cmsIOPrintf(m,"%% Bradford Cone Space\n"
+                 "/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] \n");
+
+        _cmsIOPrintf(m, "/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n");
+
+
+        // No BPC
+
+        if (!DoBPC) {
+
+            _cmsIOPrintf(m, "%% VonKries-like transform in Bradford Cone Space\n"
+                      "/TransformPQR [\n"
+                      "{exch pop exch 3 get mul exch pop exch 3 get div} bind\n"
+                      "{exch pop exch 4 get mul exch pop exch 4 get div} bind\n"
+                      "{exch pop exch 5 get mul exch pop exch 5 get div} bind\n]\n");
+        } else {
+
+            // BPC
+
+            _cmsIOPrintf(m, "%% VonKries-like transform in Bradford Cone Space plus BPC\n"
+                      "/TransformPQR [\n");
+
+            _cmsIOPrintf(m, "{4 index 3 get div 2 index 3 get mul "
+                    "2 index 3 get 2 index 3 get sub mul "
+                    "2 index 3 get 4 index 3 get 3 index 3 get sub mul sub "
+                    "3 index 3 get 3 index 3 get exch sub div "
+                    "exch pop exch pop exch pop exch pop } bind\n");
+
+            _cmsIOPrintf(m, "{4 index 4 get div 2 index 4 get mul "
+                    "2 index 4 get 2 index 4 get sub mul "
+                    "2 index 4 get 4 index 4 get 3 index 4 get sub mul sub "
+                    "3 index 4 get 3 index 4 get exch sub div "
+                    "exch pop exch pop exch pop exch pop } bind\n");
+
+            _cmsIOPrintf(m, "{4 index 5 get div 2 index 5 get mul "
+                    "2 index 5 get 2 index 5 get sub mul "
+                    "2 index 5 get 4 index 5 get 3 index 5 get sub mul sub "
+                    "3 index 5 get 3 index 5 get exch sub div "
+                    "exch pop exch pop exch pop exch pop } bind\n]\n");
+
+        }
+
+
+}
+
+
+static
+void EmitXYZ2Lab(cmsIOHANDLER* m)
+{
+    _cmsIOPrintf(m, "/RangeLMN [ -0.635 2.0 0 2 -0.635 2.0 ]\n");
+    _cmsIOPrintf(m, "/EncodeLMN [\n");
+    _cmsIOPrintf(m, "{ 0.964200  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
+    _cmsIOPrintf(m, "{ 1.000000  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
+    _cmsIOPrintf(m, "{ 0.824900  div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
+    _cmsIOPrintf(m, "]\n");
+    _cmsIOPrintf(m, "/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]\n");
+    _cmsIOPrintf(m, "/EncodeABC [\n");
+
+
+    _cmsIOPrintf(m, "{ 116 mul  16 sub 100 div  } bind\n");
+    _cmsIOPrintf(m, "{ 500 mul 128 add 256 div  } bind\n");
+    _cmsIOPrintf(m, "{ 200 mul 128 add 256 div  } bind\n");
+
+
+    _cmsIOPrintf(m, "]\n");
+
+
+}
+
+// Due to impedance mismatch between XYZ and almost all RGB and CMYK spaces
+// I choose to dump LUTS in Lab instead of XYZ. There is still a lot of wasted
+// space on 3D CLUT, but since space seems not to be a problem here, 33 points
+// would give a reasonable accurancy. Note also that CRD tables must operate in
+// 8 bits.
+
+static
+int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Number dwFlags)
+{
+    cmsHPROFILE hLab;
+    cmsHTRANSFORM xform;
+    int i, nChannels;
+    cmsUInt32Number OutputFormat;
+    _cmsTRANSFORM* v;
+    cmsPipeline* DeviceLink;
+    cmsHPROFILE Profiles[3];
+    cmsCIEXYZ BlackPointAdaptedToD50;
+    cmsBool lDoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION);
+    cmsBool lFixWhite = !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP);
+    cmsUInt32Number InFrm = TYPE_Lab_16;
+    int RelativeEncodingIntent;
+    cmsColorSpaceSignature ColorSpace;
+
+
+    hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL);
+    if (hLab == NULL) return 0;
+
+    OutputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE);
+    nChannels    = T_CHANNELS(OutputFormat);
+
+    ColorSpace = cmsGetColorSpace(hProfile);
+
+    // For absolute colorimetric, the LUT is encoded as relative in order to preserve precision.
+
+    RelativeEncodingIntent = Intent;
+    if (RelativeEncodingIntent == INTENT_ABSOLUTE_COLORIMETRIC)
+        RelativeEncodingIntent = INTENT_RELATIVE_COLORIMETRIC;
+
+
+    // Use V4 Lab always
+    Profiles[0] = hLab;
+    Profiles[1] = hProfile;
+
+    xform = cmsCreateMultiprofileTransformTHR(m ->ContextID,
+                                              Profiles, 2, TYPE_Lab_DBL,
+                                              OutputFormat, RelativeEncodingIntent, 0);
+    cmsCloseProfile(hLab);
+
+    if (xform == NULL) {
+
+        cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Cannot create transform Lab -> Profile in CRD creation");
+        return 0;
+    }
+
+    // Get a copy of the internal devicelink
+    v = (_cmsTRANSFORM*) xform;
+    DeviceLink = cmsPipelineDup(v ->Lut);
+    if (DeviceLink == NULL) return 0;
+
+
+    // We need a CLUT
+    dwFlags |= cmsFLAGS_FORCE_CLUT;
+    _cmsOptimizePipeline(m->ContextID, &DeviceLink, RelativeEncodingIntent, &InFrm, &OutputFormat, &dwFlags);
+
+    _cmsIOPrintf(m, "<<\n");
+    _cmsIOPrintf(m, "/ColorRenderingType 1\n");
+
+
+    cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0);
+
+    // Emit headers, etc.
+    EmitWhiteBlackD50(m, &BlackPointAdaptedToD50);
+    EmitPQRStage(m, hProfile, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC);
+    EmitXYZ2Lab(m);
+
+
+    // FIXUP: map Lab (100, 0, 0) to perfect white, because the particular encoding for Lab
+    // does map a=b=0 not falling into any specific node. Since range a,b goes -128..127,
+    // zero is slightly moved towards right, so assure next node (in L=100 slice) is mapped to
+    // zero. This would sacrifice a bit of highlights, but failure to do so would cause
+    // scum dot. Ouch.
+
+    if (Intent == INTENT_ABSOLUTE_COLORIMETRIC)
+            lFixWhite = FALSE;
+
+    _cmsIOPrintf(m, "/RenderTable ");
+
+
+    WriteCLUT(m, cmsPipelineGetPtrToFirstStage(DeviceLink), "<", ">\n", "", "", lFixWhite, ColorSpace);
+
+    _cmsIOPrintf(m, " %d {} bind ", nChannels);
+
+    for (i=1; i < nChannels; i++)
+            _cmsIOPrintf(m, "dup ");
+
+    _cmsIOPrintf(m, "]\n");
+
+
+    EmitIntent(m, Intent);
+
+    _cmsIOPrintf(m, ">>\n");
+
+    if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {
+
+        _cmsIOPrintf(m, "/Current exch /ColorRendering defineresource pop\n");
+    }
+
+    cmsPipelineFree(DeviceLink);
+    cmsDeleteTransform(xform);
+
+    return 1;
+}
+
+
+// Builds a ASCII string containing colorant list in 0..1.0 range
+static
+void BuildColorantList(char *Colorant, int nColorant, cmsUInt16Number Out[])
+{
+    char Buff[32];
+    int j;
+
+    Colorant[0] = 0;
+    if (nColorant > cmsMAXCHANNELS)
+        nColorant = cmsMAXCHANNELS;
+
+    for (j=0; j < nColorant; j++) {
+
+                sprintf(Buff, "%.3f", Out[j] / 65535.0);
+                strcat(Colorant, Buff);
+                if (j < nColorant -1)
+                        strcat(Colorant, " ");
+
+        }
+}
+
+
+// Creates a PostScript color list from a named profile data.
+// This is a HP extension.
+
+static
+int WriteNamedColorCRD(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, int Intent, cmsUInt32Number dwFlags)
+{
+    cmsHTRANSFORM xform;
+    int i, nColors, nColorant;
+    cmsUInt32Number OutputFormat;
+    char ColorName[32];
+    char Colorant[128];
+    cmsNAMEDCOLORLIST* NamedColorList;
+
+
+    OutputFormat = cmsFormatterForColorspaceOfProfile(hNamedColor, 2, FALSE);
+    nColorant    = T_CHANNELS(OutputFormat);
+
+
+    xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX, NULL, OutputFormat, Intent, dwFlags);
+    if (xform == NULL) return 0;
+
+
+    NamedColorList = cmsGetNamedColorList(xform);
+    if (NamedColorList == NULL) return 0;
+
+    _cmsIOPrintf(m, "<<\n");
+    _cmsIOPrintf(m, "(colorlistcomment) (%s) \n", "Named profile");
+    _cmsIOPrintf(m, "(Prefix) [ (Pantone ) (PANTONE ) ]\n");
+    _cmsIOPrintf(m, "(Suffix) [ ( CV) ( CVC) ( C) ]\n");
+
+    nColors   = cmsNamedColorCount(NamedColorList);
+
+    for (i=0; i < nColors; i++) {
+
+        cmsUInt16Number In[1];
+        cmsUInt16Number Out[cmsMAXCHANNELS];
+
+        In[0] = (cmsUInt16Number) i;
+
+        if (!cmsNamedColorInfo(NamedColorList, i, ColorName, NULL, NULL, NULL, NULL))
+                continue;
+
+        cmsDoTransform(xform, In, Out, 1);
+        BuildColorantList(Colorant, nColorant, Out);
+        _cmsIOPrintf(m, "  (%s) [ %s ]\n", ColorName, Colorant);
+    }
+
+    _cmsIOPrintf(m, "   >>");
+
+    if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {
+
+    _cmsIOPrintf(m, " /Current exch /HPSpotTable defineresource pop\n");
+    }
+
+    cmsDeleteTransform(xform);
+    return 1;
+}
+
+
+
+// This one does create a Color Rendering Dictionary.
+// CRD are always LUT-Based, no matter if profile is
+// implemented as matrix-shaper.
+
+static
+cmsUInt32Number  GenerateCRD(cmsContext ContextID,
+                             cmsHPROFILE hProfile,
+                             cmsUInt32Number Intent, cmsUInt32Number dwFlags,
+                             cmsIOHANDLER* mem)
+{
+    cmsUInt32Number dwBytesUsed;
+
+    if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {
+
+        EmitHeader(mem, "Color Rendering Dictionary (CRD)", hProfile);
+    }
+
+
+    // Is a named color profile?
+    if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {
+
+        if (!WriteNamedColorCRD(mem, hProfile, Intent, dwFlags)) {
+            return 0;
+        }
+    }
+    else {
+
+        // CRD are always implemented as LUT
+
+        if (!WriteOutputLUT(mem, hProfile, Intent, dwFlags)) {
+            return 0;
+        }
+    }
+
+    if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {
+
+        _cmsIOPrintf(mem, "%%%%EndResource\n");
+        _cmsIOPrintf(mem, "\n%% CRD End\n");
+    }
+
+    // Done, keep memory usage
+    dwBytesUsed = mem ->UsedSpace;
+
+    // Finally, return used byte count
+    return dwBytesUsed;
+
+    cmsUNUSED_PARAMETER(ContextID);
+}
+
+
+
+
+cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID,
+                                                               cmsPSResourceType Type,
+                                                               cmsHPROFILE hProfile,
+                                                               cmsUInt32Number Intent,
+                                                               cmsUInt32Number dwFlags,
+                                                               cmsIOHANDLER* io)
+{
+    cmsUInt32Number  rc;
+
+
+    switch (Type) {
+
+        case cmsPS_RESOURCE_CSA:
+            rc = GenerateCSA(ContextID, hProfile, Intent, dwFlags, io);
+            break;
+
+        default:
+        case cmsPS_RESOURCE_CRD:
+            rc = GenerateCRD(ContextID, hProfile, Intent, dwFlags, io);
+            break;
+    }
+
+    return rc;
+}
+
+
+
+cmsUInt32Number CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID,
+                              cmsHPROFILE hProfile,
+                              cmsUInt32Number Intent, cmsUInt32Number dwFlags,
+                              void* Buffer, cmsUInt32Number dwBufferLen)
+{
+    cmsIOHANDLER* mem;
+    cmsUInt32Number dwBytesUsed;
+
+    // Set up the serialization engine
+    if (Buffer == NULL)
+        mem = cmsOpenIOhandlerFromNULL(ContextID);
+    else
+        mem = cmsOpenIOhandlerFromMem(ContextID, Buffer, dwBufferLen, "w");
+
+    if (!mem) return 0;
+
+    dwBytesUsed =  cmsGetPostScriptColorResource(ContextID, cmsPS_RESOURCE_CRD, hProfile, Intent, dwFlags, mem);
+
+    // Get rid of memory stream
+    cmsCloseIOhandler(mem);
+
+    return dwBytesUsed;
+}
+
+
+
+// Does create a Color Space Array on XYZ colorspace for PostScript usage
+cmsUInt32Number CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID,
+                                              cmsHPROFILE hProfile,
+                                              cmsUInt32Number Intent,
+                                              cmsUInt32Number dwFlags,
+                                              void* Buffer,
+                                              cmsUInt32Number dwBufferLen)
+{
+    cmsIOHANDLER* mem;
+    cmsUInt32Number dwBytesUsed;
+
+    if (Buffer == NULL)
+        mem = cmsOpenIOhandlerFromNULL(ContextID);
+    else
+        mem = cmsOpenIOhandlerFromMem(ContextID, Buffer, dwBufferLen, "w");
+
+    if (!mem) return 0;
+
+    dwBytesUsed =  cmsGetPostScriptColorResource(ContextID, cmsPS_RESOURCE_CSA, hProfile, Intent, dwFlags, mem);
+
+    // Get rid of memory stream
+    cmsCloseIOhandler(mem);
+
+    return dwBytesUsed;
+
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmssamp.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmssamp.c
new file mode 100644
index 0000000..70e4691
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmssamp.c
@@ -0,0 +1,572 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2010 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+#define cmsmin(a, b) (((a) < (b)) ? (a) : (b))
+#define cmsmax(a, b) (((a) > (b)) ? (a) : (b))
+
+// This file contains routines for resampling and LUT optimization, black point detection
+// and black preservation.
+
+// Black point detection -------------------------------------------------------------------------
+
+
+// PCS -> PCS round trip transform, always uses relative intent on the device -> pcs
+static
+cmsHTRANSFORM CreateRoundtripXForm(cmsHPROFILE hProfile, cmsUInt32Number nIntent)
+{
+    cmsContext ContextID = cmsGetProfileContextID(hProfile);
+    cmsHPROFILE hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
+    cmsHTRANSFORM xform;
+    cmsBool BPC[4] = { FALSE, FALSE, FALSE, FALSE };
+    cmsFloat64Number States[4] = { 1.0, 1.0, 1.0, 1.0 };
+    cmsHPROFILE hProfiles[4];
+    cmsUInt32Number Intents[4];
+
+    hProfiles[0] = hLab; hProfiles[1] = hProfile; hProfiles[2] = hProfile; hProfiles[3] = hLab;
+    Intents[0]   = INTENT_RELATIVE_COLORIMETRIC; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = INTENT_RELATIVE_COLORIMETRIC;
+
+    xform =  cmsCreateExtendedTransform(ContextID, 4, hProfiles, BPC, Intents,
+        States, NULL, 0, TYPE_Lab_DBL, TYPE_Lab_DBL, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE);
+
+    cmsCloseProfile(hLab);
+    return xform;
+}
+
+// Use darker colorants to obtain black point. This works in the relative colorimetric intent and
+// assumes more ink results in darker colors. No ink limit is assumed.
+static
+cmsBool  BlackPointAsDarkerColorant(cmsHPROFILE    hInput,
+                                    cmsUInt32Number Intent,
+                                    cmsCIEXYZ* BlackPoint,
+                                    cmsUInt32Number dwFlags)
+{
+    cmsUInt16Number *Black;
+    cmsHTRANSFORM xform;
+    cmsColorSpaceSignature Space;
+    cmsUInt32Number nChannels;
+    cmsUInt32Number dwFormat;
+    cmsHPROFILE hLab;
+    cmsCIELab  Lab;
+    cmsCIEXYZ  BlackXYZ;
+    cmsContext ContextID = cmsGetProfileContextID(hInput);
+
+    // If the profile does not support input direction, assume Black point 0
+    if (!cmsIsIntentSupported(hInput, Intent, LCMS_USED_AS_INPUT)) {
+
+        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+        return FALSE;
+    }
+
+    // Create a formatter which has n channels and floating point
+    dwFormat = cmsFormatterForColorspaceOfProfile(hInput, 2, FALSE);
+
+   // Try to get black by using black colorant
+    Space = cmsGetColorSpace(hInput);
+
+    // This function returns darker colorant in 16 bits for several spaces
+    if (!_cmsEndPointsBySpace(Space, NULL, &Black, &nChannels)) {
+
+        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+        return FALSE;
+    }
+
+    if (nChannels != T_CHANNELS(dwFormat)) {
+       BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+       return FALSE;
+    }
+
+    // Lab will be used as the output space, but lab2 will avoid recursion
+    hLab = cmsCreateLab2ProfileTHR(ContextID, NULL);
+    if (hLab == NULL) {
+       BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+       return FALSE;
+    }
+
+    // Create the transform
+    xform = cmsCreateTransformTHR(ContextID, hInput, dwFormat,
+                                hLab, TYPE_Lab_DBL, Intent, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE);
+    cmsCloseProfile(hLab);
+
+    if (xform == NULL) {
+
+        // Something went wrong. Get rid of open resources and return zero as black
+        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+        return FALSE;
+    }
+
+    // Convert black to Lab
+    cmsDoTransform(xform, Black, &Lab, 1);
+
+    // Force it to be neutral, clip to max. L* of 50
+    Lab.a = Lab.b = 0;
+    if (Lab.L > 50) Lab.L = 50;
+
+    // Free the resources
+    cmsDeleteTransform(xform);
+
+    // Convert from Lab (which is now clipped) to XYZ.
+    cmsLab2XYZ(NULL, &BlackXYZ, &Lab);
+
+    if (BlackPoint != NULL)
+        *BlackPoint = BlackXYZ;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(dwFlags);
+}
+
+// Get a black point of output CMYK profile, discounting any ink-limiting embedded
+// in the profile. For doing that, we use perceptual intent in input direction:
+// Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab
+static
+cmsBool BlackPointUsingPerceptualBlack(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile)
+{
+    cmsHTRANSFORM hRoundTrip;
+    cmsCIELab LabIn, LabOut;
+    cmsCIEXYZ  BlackXYZ;
+
+     // Is the intent supported by the profile?
+    if (!cmsIsIntentSupported(hProfile, INTENT_PERCEPTUAL, LCMS_USED_AS_INPUT)) {
+
+        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+        return TRUE;
+    }
+
+    hRoundTrip = CreateRoundtripXForm(hProfile, INTENT_PERCEPTUAL);
+    if (hRoundTrip == NULL) {
+        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+        return FALSE;
+    }
+
+    LabIn.L = LabIn.a = LabIn.b = 0;
+    cmsDoTransform(hRoundTrip, &LabIn, &LabOut, 1);
+
+    // Clip Lab to reasonable limits
+    if (LabOut.L > 50) LabOut.L = 50;
+    LabOut.a = LabOut.b = 0;
+
+    cmsDeleteTransform(hRoundTrip);
+
+    // Convert it to XYZ
+    cmsLab2XYZ(NULL, &BlackXYZ, &LabOut);
+
+    if (BlackPoint != NULL)
+        *BlackPoint = BlackXYZ;
+
+    return TRUE;
+}
+
+// This function shouldn't exist at all -- there is such quantity of broken
+// profiles on black point tag, that we must somehow fix chromaticity to
+// avoid huge tint when doing Black point compensation. This function does
+// just that. There is a special flag for using black point tag, but turned
+// off by default because it is bogus on most profiles. The detection algorithm
+// involves to turn BP to neutral and to use only L component.
+cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags)
+{
+    cmsProfileClassSignature devClass;
+
+    // Make sure the device class is adequate
+    devClass = cmsGetDeviceClass(hProfile);
+    if (devClass == cmsSigLinkClass ||
+        devClass == cmsSigAbstractClass ||
+        devClass == cmsSigNamedColorClass) {
+            BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+            return FALSE;
+    }
+
+    // Make sure intent is adequate
+    if (Intent != INTENT_PERCEPTUAL &&
+        Intent != INTENT_RELATIVE_COLORIMETRIC &&
+        Intent != INTENT_SATURATION) {
+            BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+            return FALSE;
+    }
+
+    // v4 + perceptual & saturation intents does have its own black point, and it is
+    // well specified enough to use it. Black point tag is deprecated in V4.
+    if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) &&
+        (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) {
+
+            // Matrix shaper share MRC & perceptual intents
+            if (cmsIsMatrixShaper(hProfile))
+                return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0);
+
+            // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents
+            BlackPoint -> X = cmsPERCEPTUAL_BLACK_X;
+            BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y;
+            BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z;
+
+            return TRUE;
+    }
+
+
+#ifdef CMS_USE_PROFILE_BLACK_POINT_TAG
+
+    // v2, v4 rel/abs colorimetric
+    if (cmsIsTag(hProfile, cmsSigMediaBlackPointTag) &&
+        Intent == INTENT_RELATIVE_COLORIMETRIC) {
+
+            cmsCIEXYZ *BlackPtr, BlackXYZ, UntrustedBlackPoint, TrustedBlackPoint, MediaWhite;
+            cmsCIELab Lab;
+
+            // If black point is specified, then use it,
+
+            BlackPtr = cmsReadTag(hProfile, cmsSigMediaBlackPointTag);
+            if (BlackPtr != NULL) {
+
+                BlackXYZ = *BlackPtr;
+                _cmsReadMediaWhitePoint(&MediaWhite, hProfile);
+
+                // Black point is absolute XYZ, so adapt to D50 to get PCS value
+                cmsAdaptToIlluminant(&UntrustedBlackPoint, &MediaWhite, cmsD50_XYZ(), &BlackXYZ);
+
+                // Force a=b=0 to get rid of any chroma
+                cmsXYZ2Lab(NULL, &Lab, &UntrustedBlackPoint);
+                Lab.a = Lab.b = 0;
+                if (Lab.L > 50) Lab.L = 50; // Clip to L* <= 50
+                cmsLab2XYZ(NULL, &TrustedBlackPoint, &Lab);
+
+                if (BlackPoint != NULL)
+                    *BlackPoint = TrustedBlackPoint;
+
+                return TRUE;
+            }
+    }
+#endif
+
+    // That is about v2 profiles.
+
+    // If output profile, discount ink-limiting and that's all
+    if (Intent == INTENT_RELATIVE_COLORIMETRIC &&
+        (cmsGetDeviceClass(hProfile) == cmsSigOutputClass) &&
+        (cmsGetColorSpace(hProfile)  == cmsSigCmykData))
+        return BlackPointUsingPerceptualBlack(BlackPoint, hProfile);
+
+    // Nope, compute BP using current intent.
+    return BlackPointAsDarkerColorant(hProfile, Intent, BlackPoint, dwFlags);
+}
+
+
+
+// ---------------------------------------------------------------------------------------------------------
+
+// Least Squares Fit of a Quadratic Curve to Data
+// http://www.personal.psu.edu/jhm/f90/lectures/lsq2.html
+
+static
+cmsFloat64Number RootOfLeastSquaresFitQuadraticCurve(int n, cmsFloat64Number x[], cmsFloat64Number y[])
+{
+    double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0;
+    double sum_y = 0, sum_yx = 0, sum_yx2 = 0;
+    double d, a, b, c;
+    int i;
+    cmsMAT3 m;
+    cmsVEC3 v, res;
+
+    if (n < 4) return 0;
+
+    for (i=0; i < n; i++) {
+
+        double xn = x[i];
+        double yn = y[i];
+
+        sum_x  += xn;
+        sum_x2 += xn*xn;
+        sum_x3 += xn*xn*xn;
+        sum_x4 += xn*xn*xn*xn;
+
+        sum_y += yn;
+        sum_yx += yn*xn;
+        sum_yx2 += yn*xn*xn;
+    }
+
+    _cmsVEC3init(&m.v[0], n,      sum_x,  sum_x2);
+    _cmsVEC3init(&m.v[1], sum_x,  sum_x2, sum_x3);
+    _cmsVEC3init(&m.v[2], sum_x2, sum_x3, sum_x4);
+
+    _cmsVEC3init(&v, sum_y, sum_yx, sum_yx2);
+
+    if (!_cmsMAT3solve(&res, &m, &v)) return 0;
+
+      
+    a = res.n[2];
+    b = res.n[1];
+    c = res.n[0];
+
+    if (fabs(a) < 1.0E-10) {
+    
+        return cmsmin(0, cmsmax(50, -c/b ));
+    }
+    else {
+
+         d = b*b - 4.0 * a * c;
+         if (d <= 0) {
+             return 0;
+         }
+         else {
+
+             double rt = (-b + sqrt(d)) / (2.0 * a);
+
+             return cmsmax(0, cmsmin(50, rt));
+         }
+   }
+
+}
+
+/*
+static
+cmsBool IsMonotonic(int n, const cmsFloat64Number Table[])
+{
+    int i;
+    cmsFloat64Number last;
+
+    last = Table[n-1];
+
+    for (i = n-2; i >= 0; --i) {
+
+        if (Table[i] > last)
+
+            return FALSE;
+        else
+            last = Table[i];
+
+    }
+
+    return TRUE;
+}
+*/
+
+// Calculates the black point of a destination profile.
+// This algorithm comes from the Adobe paper disclosing its black point compensation method.
+cmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags)
+{
+    cmsColorSpaceSignature ColorSpace;
+    cmsHTRANSFORM hRoundTrip = NULL;
+    cmsCIELab InitialLab, destLab, Lab;
+    cmsFloat64Number inRamp[256], outRamp[256];
+    cmsFloat64Number MinL, MaxL;
+    cmsBool NearlyStraightMidrange = TRUE;  
+    cmsFloat64Number yRamp[256];
+    cmsFloat64Number x[256], y[256];
+    cmsFloat64Number lo, hi;
+    int n, l;
+    cmsProfileClassSignature devClass;
+
+    // Make sure the device class is adequate
+    devClass = cmsGetDeviceClass(hProfile);
+    if (devClass == cmsSigLinkClass ||
+        devClass == cmsSigAbstractClass ||
+        devClass == cmsSigNamedColorClass) {
+            BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+            return FALSE;
+    }
+
+    // Make sure intent is adequate
+    if (Intent != INTENT_PERCEPTUAL &&
+        Intent != INTENT_RELATIVE_COLORIMETRIC &&
+        Intent != INTENT_SATURATION) {
+            BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+            return FALSE;
+    }
+
+
+    // v4 + perceptual & saturation intents does have its own black point, and it is
+    // well specified enough to use it. Black point tag is deprecated in V4.
+    if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) &&
+        (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) {
+
+            // Matrix shaper share MRC & perceptual intents
+            if (cmsIsMatrixShaper(hProfile))
+                return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0);
+
+            // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents
+            BlackPoint -> X = cmsPERCEPTUAL_BLACK_X;
+            BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y;
+            BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z;
+            return TRUE;
+    }
+
+
+    // Check if the profile is lut based and gray, rgb or cmyk (7.2 in Adobe's document)
+    ColorSpace = cmsGetColorSpace(hProfile);
+    if (!cmsIsCLUT(hProfile, Intent, LCMS_USED_AS_OUTPUT ) ||
+        (ColorSpace != cmsSigGrayData &&
+         ColorSpace != cmsSigRgbData  &&
+         ColorSpace != cmsSigCmykData)) {
+
+        // In this case, handle as input case
+        return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags);
+    }
+
+    // It is one of the valid cases!, use Adobe algorithm
+
+    
+    // Set a first guess, that should work on good profiles.
+    if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
+
+        cmsCIEXYZ IniXYZ;
+
+        // calculate initial Lab as source black point
+        if (!cmsDetectBlackPoint(&IniXYZ, hProfile, Intent, dwFlags)) {
+            return FALSE;
+        }
+
+        // convert the XYZ to lab
+        cmsXYZ2Lab(NULL, &InitialLab, &IniXYZ);
+
+    } else {
+
+        // set the initial Lab to zero, that should be the black point for perceptual and saturation
+        InitialLab.L = 0;
+        InitialLab.a = 0;
+        InitialLab.b = 0;
+    }
+
+
+    // Step 2
+    // ======
+
+    // Create a roundtrip. Define a Transform BT for all x in L*a*b*
+    hRoundTrip = CreateRoundtripXForm(hProfile, Intent);
+    if (hRoundTrip == NULL)  return FALSE;
+
+    // Compute ramps
+
+    for (l=0; l < 256; l++) {
+
+        Lab.L = (cmsFloat64Number) (l * 100.0) / 255.0;
+        Lab.a = cmsmin(50, cmsmax(-50, InitialLab.a));
+        Lab.b = cmsmin(50, cmsmax(-50, InitialLab.b));
+
+        cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
+
+        inRamp[l]  = Lab.L;
+        outRamp[l] = destLab.L;
+    }
+
+    // Make monotonic
+    for (l = 254; l > 0; --l) {
+        outRamp[l] = cmsmin(outRamp[l], outRamp[l+1]);
+    }
+
+    // Check
+    if (! (outRamp[0] < outRamp[255])) {
+
+        cmsDeleteTransform(hRoundTrip);
+        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+        return FALSE;
+    }
+
+
+    // Test for mid range straight (only on relative colorimetric)
+
+    NearlyStraightMidrange = TRUE;
+    MinL = outRamp[0]; MaxL = outRamp[255];
+    if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
+      
+        for (l=0; l < 256; l++) {
+
+            if (! ((inRamp[l] <= MinL + 0.2 * (MaxL - MinL) ) ||   
+                (fabs(inRamp[l] - outRamp[l]) < 4.0 )))
+                NearlyStraightMidrange = FALSE;
+        }
+
+        // If the mid range is straight (as determined above) then the 
+        // DestinationBlackPoint shall be the same as initialLab. 
+        // Otherwise, the DestinationBlackPoint shall be determined 
+        // using curve fitting.
+
+        if (NearlyStraightMidrange) {
+
+            cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
+            cmsDeleteTransform(hRoundTrip);
+            return TRUE;
+        }
+    }
+
+ 
+    // curve fitting: The round-trip curve normally looks like a nearly constant section at the black point,
+    // with a corner and a nearly straight line to the white point.
+  
+    for (l=0; l < 256; l++) {
+    
+        yRamp[l] = (outRamp[l] - MinL) / (MaxL - MinL);
+    }
+
+    // find the black point using the least squares error quadratic curve fitting
+
+    if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
+        lo = 0.1;
+        hi = 0.5;
+    }
+    else {
+
+        // Perceptual and saturation
+        lo = 0.03;
+        hi = 0.25;
+    }
+
+    // Capture shadow points for the fitting.
+    n = 0;
+    for (l=0; l < 256; l++) {
+    
+        cmsFloat64Number ff = yRamp[l];
+
+        if (ff >= lo && ff < hi) {
+            x[n] = inRamp[l];
+            y[n] = yRamp[l];
+            n++;
+        }    
+    }
+
+    
+    // No suitable points
+    if (n < 3 ) {
+        cmsDeleteTransform(hRoundTrip);
+        BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+        return FALSE;
+    }
+
+  
+    // fit and get the vertex of quadratic curve
+    Lab.L = RootOfLeastSquaresFitQuadraticCurve(n, x, y);
+
+    if (Lab.L < 0.0) { // clip to zero L* if the vertex is negative
+        Lab.L = 0;
+    }
+
+    Lab.a = InitialLab.a;
+    Lab.b = InitialLab.b;
+
+    cmsLab2XYZ(NULL, BlackPoint, &Lab);
+
+    cmsDeleteTransform(hRoundTrip);
+    return TRUE;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmssm.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmssm.c
new file mode 100644
index 0000000..5836e15
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmssm.c
@@ -0,0 +1,734 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2011 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// ------------------------------------------------------------------------
+
+// Gamut boundary description by using Jan Morovic's Segment maxima method
+// Many thanks to Jan for allowing me to use his algorithm.
+
+// r = C*
+// alpha = Hab
+// theta = L*
+
+#define SECTORS 16      // number of divisions in alpha and theta
+
+// Spherical coordinates
+typedef struct {
+
+    cmsFloat64Number r;
+    cmsFloat64Number alpha;
+    cmsFloat64Number theta;
+
+} cmsSpherical;
+
+typedef  enum {
+        GP_EMPTY,
+        GP_SPECIFIED,
+        GP_MODELED
+
+    } GDBPointType;
+
+
+typedef struct {
+
+    GDBPointType Type;
+    cmsSpherical p;         // Keep also alpha & theta of maximum
+
+} cmsGDBPoint;
+
+
+typedef struct {
+
+    cmsContext ContextID;
+    cmsGDBPoint Gamut[SECTORS][SECTORS];
+
+} cmsGDB;
+
+
+// A line using the parametric form
+// P = a + t*u
+typedef struct {
+
+    cmsVEC3 a;
+    cmsVEC3 u;
+
+} cmsLine;
+
+
+// A plane using the parametric form
+// Q = b + r*v + s*w
+typedef struct {
+
+    cmsVEC3 b;
+    cmsVEC3 v;
+    cmsVEC3 w;
+
+} cmsPlane;
+
+
+
+// --------------------------------------------------------------------------------------------
+
+// ATAN2() which always returns degree positive numbers
+
+static
+cmsFloat64Number _cmsAtan2(cmsFloat64Number y, cmsFloat64Number x)
+{
+    cmsFloat64Number a;
+
+    // Deal with undefined case
+    if (x == 0.0 && y == 0.0) return 0;
+
+    a = (atan2(y, x) * 180.0) / M_PI;
+
+    while (a < 0) {
+        a += 360;
+    }
+
+    return a;
+}
+
+// Convert to spherical coordinates
+static
+void ToSpherical(cmsSpherical* sp, const cmsVEC3* v)
+{
+
+    cmsFloat64Number L, a, b;
+
+    L = v ->n[VX];
+    a = v ->n[VY];
+    b = v ->n[VZ];
+
+    sp ->r = sqrt( L*L + a*a + b*b );
+
+   if (sp ->r == 0) {
+        sp ->alpha = sp ->theta = 0;
+        return;
+    }
+
+    sp ->alpha = _cmsAtan2(a, b);
+    sp ->theta = _cmsAtan2(sqrt(a*a + b*b), L);
+}
+
+
+// Convert to cartesian from spherical
+static
+void ToCartesian(cmsVEC3* v, const cmsSpherical* sp)
+{
+    cmsFloat64Number sin_alpha;
+    cmsFloat64Number cos_alpha;
+    cmsFloat64Number sin_theta;
+    cmsFloat64Number cos_theta;
+    cmsFloat64Number L, a, b;
+
+    sin_alpha = sin((M_PI * sp ->alpha) / 180.0);
+    cos_alpha = cos((M_PI * sp ->alpha) / 180.0);
+    sin_theta = sin((M_PI * sp ->theta) / 180.0);
+    cos_theta = cos((M_PI * sp ->theta) / 180.0);
+
+    a = sp ->r * sin_theta * sin_alpha;
+    b = sp ->r * sin_theta * cos_alpha;
+    L = sp ->r * cos_theta;
+
+    v ->n[VX] = L;
+    v ->n[VY] = a;
+    v ->n[VZ] = b;
+}
+
+
+// Quantize sector of a spherical coordinate. Saturate 360, 180 to last sector
+// The limits are the centers of each sector, so
+static
+void QuantizeToSector(const cmsSpherical* sp, int* alpha, int* theta)
+{
+    *alpha = (int) floor(((sp->alpha * (SECTORS)) / 360.0) );
+    *theta = (int) floor(((sp->theta * (SECTORS)) / 180.0) );
+
+    if (*alpha >= SECTORS)
+        *alpha = SECTORS-1;
+    if (*theta >= SECTORS)
+        *theta = SECTORS-1;
+}
+
+
+// Line determined by 2 points
+static
+void LineOf2Points(cmsLine* line, cmsVEC3* a, cmsVEC3* b)
+{
+
+    _cmsVEC3init(&line ->a, a ->n[VX], a ->n[VY], a ->n[VZ]);
+    _cmsVEC3init(&line ->u, b ->n[VX] - a ->n[VX],
+                            b ->n[VY] - a ->n[VY],
+                            b ->n[VZ] - a ->n[VZ]);
+}
+
+
+// Evaluate parametric line
+static
+void GetPointOfLine(cmsVEC3* p, const cmsLine* line, cmsFloat64Number t)
+{
+    p ->n[VX] = line ->a.n[VX] + t * line->u.n[VX];
+    p ->n[VY] = line ->a.n[VY] + t * line->u.n[VY];
+    p ->n[VZ] = line ->a.n[VZ] + t * line->u.n[VZ];
+}
+
+
+
+/*
+    Closest point in sector line1 to sector line2 (both are defined as 0 <=t <= 1)
+    http://softsurfer.com/Archive/algorithm_0106/algorithm_0106.htm
+
+    Copyright 2001, softSurfer (www.softsurfer.com)
+    This code may be freely used and modified for any purpose
+    providing that this copyright notice is included with it.
+    SoftSurfer makes no warranty for this code, and cannot be held
+    liable for any real or imagined damage resulting from its use.
+    Users of this code must verify correctness for their application.
+
+*/
+
+static
+cmsBool ClosestLineToLine(cmsVEC3* r, const cmsLine* line1, const cmsLine* line2)
+{
+    cmsFloat64Number a, b, c, d, e, D;
+    cmsFloat64Number sc, sN, sD;
+    cmsFloat64Number tc, tN, tD;
+    cmsVEC3 w0;
+
+    _cmsVEC3minus(&w0, &line1 ->a, &line2 ->a);
+
+    a  = _cmsVEC3dot(&line1 ->u, &line1 ->u);
+    b  = _cmsVEC3dot(&line1 ->u, &line2 ->u);
+    c  = _cmsVEC3dot(&line2 ->u, &line2 ->u);
+    d  = _cmsVEC3dot(&line1 ->u, &w0);
+    e  = _cmsVEC3dot(&line2 ->u, &w0);
+
+    D  = a*c - b * b;      // Denominator
+    sD = tD = D;           // default sD = D >= 0
+
+    if (D <  MATRIX_DET_TOLERANCE) {   // the lines are almost parallel
+
+        sN = 0.0;        // force using point P0 on segment S1
+        sD = 1.0;        // to prevent possible division by 0.0 later
+        tN = e;
+        tD = c;
+    }
+    else {                // get the closest points on the infinite lines
+
+        sN = (b*e - c*d);
+        tN = (a*e - b*d);
+
+        if (sN < 0.0) {       // sc < 0 => the s=0 edge is visible
+
+            sN = 0.0;
+            tN = e;
+            tD = c;
+        }
+        else if (sN > sD) {   // sc > 1 => the s=1 edge is visible
+            sN = sD;
+            tN = e + b;
+            tD = c;
+        }
+    }
+
+    if (tN < 0.0) {           // tc < 0 => the t=0 edge is visible
+
+        tN = 0.0;
+        // recompute sc for this edge
+        if (-d < 0.0)
+            sN = 0.0;
+        else if (-d > a)
+            sN = sD;
+        else {
+            sN = -d;
+            sD = a;
+        }
+    }
+    else if (tN > tD) {      // tc > 1 => the t=1 edge is visible
+
+        tN = tD;
+
+        // recompute sc for this edge
+        if ((-d + b) < 0.0)
+            sN = 0;
+        else if ((-d + b) > a)
+            sN = sD;
+        else {
+            sN = (-d + b);
+            sD = a;
+        }
+    }
+    // finally do the division to get sc and tc
+    sc = (fabs(sN) < MATRIX_DET_TOLERANCE ? 0.0 : sN / sD);
+    tc = (fabs(tN) < MATRIX_DET_TOLERANCE ? 0.0 : tN / tD);
+
+    GetPointOfLine(r, line1, sc);
+    return TRUE;
+}
+
+
+
+// ------------------------------------------------------------------ Wrapper
+
+
+// Allocate & free structure
+cmsHANDLE  CMSEXPORT cmsGBDAlloc(cmsContext ContextID)
+{
+    cmsGDB* gbd = (cmsGDB*) _cmsMallocZero(ContextID, sizeof(cmsGDB));
+    if (gbd == NULL) return NULL;
+
+    gbd -> ContextID = ContextID;
+
+    return (cmsHANDLE) gbd;
+}
+
+
+void CMSEXPORT cmsGBDFree(cmsHANDLE hGBD)
+{
+    cmsGDB* gbd = (cmsGDB*) hGBD;
+    if (hGBD != NULL)
+        _cmsFree(gbd->ContextID, (void*) gbd);
+}
+
+
+// Auxiliar to retrieve a pointer to the segmentr containing the Lab value
+static
+cmsGDBPoint* GetPoint(cmsGDB* gbd, const cmsCIELab* Lab, cmsSpherical* sp)
+{
+    cmsVEC3 v;
+    int alpha, theta;
+
+    // Housekeeping
+    _cmsAssert(gbd != NULL);
+    _cmsAssert(Lab != NULL);
+    _cmsAssert(sp != NULL);
+
+    // Center L* by substracting half of its domain, that's 50
+    _cmsVEC3init(&v, Lab ->L - 50.0, Lab ->a, Lab ->b);
+
+    // Convert to spherical coordinates
+    ToSpherical(sp, &v);
+
+    if (sp ->r < 0 || sp ->alpha < 0 || sp->theta < 0) {
+         cmsSignalError(gbd ->ContextID, cmsERROR_RANGE, "spherical value out of range");
+         return NULL;
+    }
+
+    // On which sector it falls?
+    QuantizeToSector(sp, &alpha, &theta);
+
+    if (alpha < 0 || theta < 0 || alpha >= SECTORS || theta >= SECTORS) {
+         cmsSignalError(gbd ->ContextID, cmsERROR_RANGE, " quadrant out of range");
+         return NULL;
+    }
+
+    // Get pointer to the sector
+    return &gbd ->Gamut[theta][alpha];
+}
+
+// Add a point to gamut descriptor. Point to add is in Lab color space.
+// GBD is centered on a=b=0 and L*=50
+cmsBool CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab)
+{
+    cmsGDB* gbd = (cmsGDB*) hGBD;
+    cmsGDBPoint* ptr;
+    cmsSpherical sp;
+
+
+    // Get pointer to the sector
+    ptr = GetPoint(gbd, Lab, &sp);
+    if (ptr == NULL) return FALSE;
+
+    // If no samples at this sector, add it
+    if (ptr ->Type == GP_EMPTY) {
+
+        ptr -> Type = GP_SPECIFIED;
+        ptr -> p    = sp;
+    }
+    else {
+
+
+        // Substitute only if radius is greater
+        if (sp.r > ptr -> p.r) {
+
+                ptr -> Type = GP_SPECIFIED;
+                ptr -> p    = sp;
+        }
+    }
+
+    return TRUE;
+}
+
+// Check if a given point falls inside gamut
+cmsBool CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab)
+{
+    cmsGDB* gbd = (cmsGDB*) hGBD;
+    cmsGDBPoint* ptr;
+    cmsSpherical sp;
+
+    // Get pointer to the sector
+    ptr = GetPoint(gbd, Lab, &sp);
+    if (ptr == NULL) return FALSE;
+
+    // If no samples at this sector, return no data
+    if (ptr ->Type == GP_EMPTY) return FALSE;
+
+    // In gamut only if radius is greater
+
+    return (sp.r <= ptr -> p.r);
+}
+
+// -----------------------------------------------------------------------------------------------------------------------
+
+// Find near sectors. The list of sectors found is returned on Close[].
+// The function returns the number of sectors as well.
+
+// 24   9  10  11  12
+// 23   8   1   2  13
+// 22   7   *   3  14
+// 21   6   5   4  15
+// 20  19  18  17  16
+//
+// Those are the relative movements
+// {-2,-2}, {-1, -2}, {0, -2}, {+1, -2}, {+2,  -2},
+// {-2,-1}, {-1, -1}, {0, -1}, {+1, -1}, {+2,  -1},
+// {-2, 0}, {-1,  0}, {0,  0}, {+1,  0}, {+2,   0},
+// {-2,+1}, {-1, +1}, {0, +1}, {+1,  +1}, {+2,  +1},
+// {-2,+2}, {-1, +2}, {0, +2}, {+1,  +2}, {+2,  +2}};
+
+
+static
+const struct _spiral {
+
+    int AdvX, AdvY;
+
+    } Spiral[] = { {0,  -1}, {+1, -1}, {+1,  0}, {+1, +1}, {0,  +1}, {-1, +1},
+                   {-1,  0}, {-1, -1}, {-1, -2}, {0,  -2}, {+1, -2}, {+2, -2},
+                   {+2, -1}, {+2,  0}, {+2, +1}, {+2, +2}, {+1, +2}, {0,  +2},
+                   {-1, +2}, {-2, +2}, {-2, +1}, {-2, 0},  {-2, -1}, {-2, -2} };
+
+#define NSTEPS (sizeof(Spiral) / sizeof(struct _spiral))
+
+static
+int FindNearSectors(cmsGDB* gbd, int alpha, int theta, cmsGDBPoint* Close[])
+{
+    int nSectors = 0;
+    int a, t;
+    cmsUInt32Number i;
+    cmsGDBPoint* pt;
+
+    for (i=0; i < NSTEPS; i++) {
+
+        a = alpha + Spiral[i].AdvX;
+        t = theta + Spiral[i].AdvY;
+
+        // Cycle at the end
+        a %= SECTORS;
+        t %= SECTORS;
+
+        // Cycle at the begin
+        if (a < 0) a = SECTORS + a;
+        if (t < 0) t = SECTORS + t;
+
+        pt = &gbd ->Gamut[t][a];
+
+        if (pt -> Type != GP_EMPTY) {
+
+            Close[nSectors++] = pt;
+        }
+    }
+
+    return nSectors;
+}
+
+
+// Interpolate a missing sector. Method identifies whatever this is top, bottom or mid
+static
+cmsBool InterpolateMissingSector(cmsGDB* gbd, int alpha, int theta)
+{
+    cmsSpherical sp;
+    cmsVEC3 Lab;
+    cmsVEC3 Centre;
+    cmsLine ray;
+    int nCloseSectors;
+    cmsGDBPoint* Close[NSTEPS + 1];
+    cmsSpherical closel, templ;
+    cmsLine edge;
+    int k, m;
+
+    // Is that point already specified?
+    if (gbd ->Gamut[theta][alpha].Type != GP_EMPTY) return TRUE;
+
+    // Fill close points
+    nCloseSectors = FindNearSectors(gbd, alpha, theta, Close);
+
+
+    // Find a central point on the sector
+    sp.alpha = (cmsFloat64Number) ((alpha + 0.5) * 360.0) / (SECTORS);
+    sp.theta = (cmsFloat64Number) ((theta + 0.5) * 180.0) / (SECTORS);
+    sp.r     = 50.0;
+
+    // Convert to Cartesian
+    ToCartesian(&Lab, &sp);
+
+    // Create a ray line from centre to this point
+    _cmsVEC3init(&Centre, 50.0, 0, 0);
+    LineOf2Points(&ray, &Lab, &Centre);
+
+    // For all close sectors
+    closel.r = 0.0;
+    closel.alpha = 0;
+    closel.theta = 0;
+
+    for (k=0; k < nCloseSectors; k++) {
+
+        for(m = k+1; m < nCloseSectors; m++) {
+
+            cmsVEC3 temp, a1, a2;
+
+            // A line from sector to sector
+            ToCartesian(&a1, &Close[k]->p);
+            ToCartesian(&a2, &Close[m]->p);
+
+            LineOf2Points(&edge, &a1, &a2);
+
+            // Find a line
+            ClosestLineToLine(&temp, &ray, &edge);
+
+            // Convert to spherical
+            ToSpherical(&templ, &temp);
+
+
+            if ( templ.r > closel.r &&
+                 templ.theta >= (theta*180.0/SECTORS) &&
+                 templ.theta <= ((theta+1)*180.0/SECTORS) &&
+                 templ.alpha >= (alpha*360.0/SECTORS) &&
+                 templ.alpha <= ((alpha+1)*360.0/SECTORS)) {
+
+                closel = templ;
+            }
+        }
+    }
+
+    gbd ->Gamut[theta][alpha].p = closel;
+    gbd ->Gamut[theta][alpha].Type = GP_MODELED;
+
+    return TRUE;
+
+}
+
+
+// Interpolate missing parts. The algorithm fist computes slices at
+// theta=0 and theta=Max.
+cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGBD, cmsUInt32Number dwFlags)
+{
+    int alpha, theta;
+    cmsGDB* gbd = (cmsGDB*) hGBD;
+
+    _cmsAssert(hGBD != NULL);
+
+    // Interpolate black
+    for (alpha = 0; alpha < SECTORS; alpha++) {
+
+        if (!InterpolateMissingSector(gbd, alpha, 0)) return FALSE;
+    }
+
+    // Interpolate white
+    for (alpha = 0; alpha < SECTORS; alpha++) {
+
+        if (!InterpolateMissingSector(gbd, alpha, SECTORS-1)) return FALSE;
+    }
+
+
+    // Interpolate Mid
+    for (theta = 1; theta < SECTORS; theta++) {
+        for (alpha = 0; alpha < SECTORS; alpha++) {
+
+            if (!InterpolateMissingSector(gbd, alpha, theta)) return FALSE;
+        }
+    }
+
+    // Done
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(dwFlags);
+}
+
+
+
+
+// --------------------------------------------------------------------------------------------------------
+
+// Great for debug, but not suitable for real use
+
+#if 0
+cmsBool cmsGBDdumpVRML(cmsHANDLE hGBD, const char* fname)
+{
+    FILE* fp;
+    int   i, j;
+    cmsGDB* gbd = (cmsGDB*) hGBD;
+    cmsGDBPoint* pt;
+
+    fp = fopen (fname, "wt");
+    if (fp == NULL)
+        return FALSE;
+
+    fprintf (fp, "#VRML V2.0 utf8\n");
+
+    // set the viewing orientation and distance
+    fprintf (fp, "DEF CamTest Group {\n");
+    fprintf (fp, "\tchildren [\n");
+    fprintf (fp, "\t\tDEF Cameras Group {\n");
+    fprintf (fp, "\t\t\tchildren [\n");
+    fprintf (fp, "\t\t\t\tDEF DefaultView Viewpoint {\n");
+    fprintf (fp, "\t\t\t\t\tposition 0 0 340\n");
+    fprintf (fp, "\t\t\t\t\torientation 0 0 1 0\n");
+    fprintf (fp, "\t\t\t\t\tdescription \"default view\"\n");
+    fprintf (fp, "\t\t\t\t}\n");
+    fprintf (fp, "\t\t\t]\n");
+    fprintf (fp, "\t\t},\n");
+    fprintf (fp, "\t]\n");
+    fprintf (fp, "}\n");
+
+    // Output the background stuff
+    fprintf (fp, "Background {\n");
+    fprintf (fp, "\tskyColor [\n");
+    fprintf (fp, "\t\t.5 .5 .5\n");
+    fprintf (fp, "\t]\n");
+    fprintf (fp, "}\n");
+
+    // Output the shape stuff
+    fprintf (fp, "Transform {\n");
+    fprintf (fp, "\tscale .3 .3 .3\n");
+    fprintf (fp, "\tchildren [\n");
+
+    // Draw the axes as a shape:
+    fprintf (fp, "\t\tShape {\n");
+    fprintf (fp, "\t\t\tappearance Appearance {\n");
+    fprintf (fp, "\t\t\t\tmaterial Material {\n");
+    fprintf (fp, "\t\t\t\t\tdiffuseColor 0 0.8 0\n");
+    fprintf (fp, "\t\t\t\t\temissiveColor 1.0 1.0 1.0\n");
+    fprintf (fp, "\t\t\t\t\tshininess 0.8\n");
+    fprintf (fp, "\t\t\t\t}\n");
+    fprintf (fp, "\t\t\t}\n");
+    fprintf (fp, "\t\t\tgeometry IndexedLineSet {\n");
+    fprintf (fp, "\t\t\t\tcoord Coordinate {\n");
+    fprintf (fp, "\t\t\t\t\tpoint [\n");
+    fprintf (fp, "\t\t\t\t\t0.0 0.0 0.0,\n");
+    fprintf (fp, "\t\t\t\t\t%f 0.0 0.0,\n",  255.0);
+    fprintf (fp, "\t\t\t\t\t0.0 %f 0.0,\n",  255.0);
+    fprintf (fp, "\t\t\t\t\t0.0 0.0 %f]\n",  255.0);
+    fprintf (fp, "\t\t\t\t}\n");
+    fprintf (fp, "\t\t\t\tcoordIndex [\n");
+    fprintf (fp, "\t\t\t\t\t0, 1, -1\n");
+    fprintf (fp, "\t\t\t\t\t0, 2, -1\n");
+    fprintf (fp, "\t\t\t\t\t0, 3, -1]\n");
+    fprintf (fp, "\t\t\t}\n");
+    fprintf (fp, "\t\t}\n");
+
+
+    fprintf (fp, "\t\tShape {\n");
+    fprintf (fp, "\t\t\tappearance Appearance {\n");
+    fprintf (fp, "\t\t\t\tmaterial Material {\n");
+    fprintf (fp, "\t\t\t\t\tdiffuseColor 0 0.8 0\n");
+    fprintf (fp, "\t\t\t\t\temissiveColor 1 1 1\n");
+    fprintf (fp, "\t\t\t\t\tshininess 0.8\n");
+    fprintf (fp, "\t\t\t\t}\n");
+    fprintf (fp, "\t\t\t}\n");
+    fprintf (fp, "\t\t\tgeometry PointSet {\n");
+
+    // fill in the points here
+    fprintf (fp, "\t\t\t\tcoord Coordinate {\n");
+    fprintf (fp, "\t\t\t\t\tpoint [\n");
+
+    // We need to transverse all gamut hull.
+    for (i=0; i < SECTORS; i++)
+        for (j=0; j < SECTORS; j++) {
+
+            cmsVEC3 v;
+
+            pt = &gbd ->Gamut[i][j];
+            ToCartesian(&v, &pt ->p);
+
+            fprintf (fp, "\t\t\t\t\t%g %g %g", v.n[0]+50, v.n[1], v.n[2]);
+
+            if ((j == SECTORS - 1) && (i == SECTORS - 1))
+                fprintf (fp, "]\n");
+            else
+                fprintf (fp, ",\n");
+
+        }
+
+        fprintf (fp, "\t\t\t\t}\n");
+
+
+
+    // fill in the face colors
+    fprintf (fp, "\t\t\t\tcolor Color {\n");
+    fprintf (fp, "\t\t\t\t\tcolor [\n");
+
+    for (i=0; i < SECTORS; i++)
+        for (j=0; j < SECTORS; j++) {
+
+           cmsVEC3 v;
+
+            pt = &gbd ->Gamut[i][j];
+
+
+            ToCartesian(&v, &pt ->p);
+
+
+        if (pt ->Type == GP_EMPTY)
+            fprintf (fp, "\t\t\t\t\t%g %g %g", 0.0, 0.0, 0.0);
+        else
+            if (pt ->Type == GP_MODELED)
+                fprintf (fp, "\t\t\t\t\t%g %g %g", 1.0, .5, .5);
+            else {
+                fprintf (fp, "\t\t\t\t\t%g %g %g", 1.0, 1.0, 1.0);
+
+            }
+
+        if ((j == SECTORS - 1) && (i == SECTORS - 1))
+                fprintf (fp, "]\n");
+            else
+                fprintf (fp, ",\n");
+    }
+    fprintf (fp, "\t\t\t}\n");
+
+
+    fprintf (fp, "\t\t\t}\n");
+    fprintf (fp, "\t\t}\n");
+    fprintf (fp, "\t]\n");
+    fprintf (fp, "}\n");
+
+    fclose (fp);
+
+    return TRUE;
+}
+#endif
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmstypes.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmstypes.c
new file mode 100644
index 0000000..06742b5
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmstypes.c
@@ -0,0 +1,5564 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2014 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// Tag Serialization  -----------------------------------------------------------------------------
+// This file implements every single tag and tag type as described in the ICC spec. Some types
+// have been deprecated, like ncl and Data. There is no implementation for those types as there
+// are no profiles holding them. The programmer can also extend this list by defining his own types
+// by using the appropiate plug-in. There are three types of plug ins regarding that. First type
+// allows to define new tags using any existing type. Next plug-in type allows to define new types
+// and the third one is very specific: allows to extend the number of elements in the multiprocessing
+// elements special type.
+//--------------------------------------------------------------------------------------------------
+
+// Some broken types
+#define cmsCorbisBrokenXYZtype    ((cmsTagTypeSignature) 0x17A505B8)
+#define cmsMonacoBrokenCurveType  ((cmsTagTypeSignature) 0x9478ee00)
+
+// This is the linked list that keeps track of the defined types
+typedef struct _cmsTagTypeLinkedList_st {
+
+    cmsTagTypeHandler Handler;
+    struct _cmsTagTypeLinkedList_st* Next;
+
+} _cmsTagTypeLinkedList;
+
+// Some macros to define callbacks.
+#define READ_FN(x)  Type_##x##_Read
+#define WRITE_FN(x) Type_##x##_Write
+#define FREE_FN(x)  Type_##x##_Free
+#define DUP_FN(x)   Type_##x##_Dup
+
+// Helper macro to define a handler. Callbacks do have a fixed naming convention.
+#define TYPE_HANDLER(t, x)  { (t), READ_FN(x), WRITE_FN(x), DUP_FN(x), FREE_FN(x), NULL, 0 }
+
+// Helper macro to define a MPE handler. Callbacks do have a fixed naming convention
+#define TYPE_MPE_HANDLER(t, x)  { (t), READ_FN(x), WRITE_FN(x), GenericMPEdup, GenericMPEfree, NULL, 0 }
+
+// Register a new type handler. This routine is shared between normal types and MPE. LinkedList points to the optional list head
+static
+cmsBool RegisterTypesPlugin(cmsContext id, cmsPluginBase* Data, _cmsMemoryClient pos)
+{
+    cmsPluginTagType* Plugin = (cmsPluginTagType*) Data;
+    _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(id, pos);
+    _cmsTagTypeLinkedList *pt;
+
+    // Calling the function with NULL as plug-in would unregister the plug in.
+    if (Data == NULL) {
+
+        // There is no need to set free the memory, as pool is destroyed as a whole.
+        ctx ->TagTypes = NULL;
+        return TRUE;
+    }
+
+    // Registering happens in plug-in memory pool.
+    pt = (_cmsTagTypeLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagTypeLinkedList));
+    if (pt == NULL) return FALSE;
+
+    pt ->Handler   = Plugin ->Handler;
+    pt ->Next      = ctx ->TagTypes;
+
+    ctx ->TagTypes = pt;
+     
+    return TRUE;
+}
+
+// Return handler for a given type or NULL if not found. Shared between normal types and MPE. It first tries the additons 
+// made by plug-ins and then the built-in defaults.
+static
+cmsTagTypeHandler* GetHandler(cmsTagTypeSignature sig, _cmsTagTypeLinkedList* PluginLinkedList, _cmsTagTypeLinkedList* DefaultLinkedList)
+{
+    _cmsTagTypeLinkedList* pt;
+
+    for (pt = PluginLinkedList;
+         pt != NULL;
+         pt = pt ->Next) {
+
+            if (sig == pt -> Handler.Signature) return &pt ->Handler;
+    }
+
+    for (pt = DefaultLinkedList;
+         pt != NULL;
+         pt = pt ->Next) {
+
+            if (sig == pt -> Handler.Signature) return &pt ->Handler;
+    }
+
+    return NULL;
+}
+
+
+// Auxiliar to convert UTF-32 to UTF-16 in some cases
+static
+cmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t* Array)
+{
+    cmsUInt32Number i;
+
+    _cmsAssert(io != NULL);
+    _cmsAssert(!(Array == NULL && n > 0));
+
+    for (i=0; i < n; i++) {
+        if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Array[i])) return FALSE;
+    }
+
+    return TRUE;
+}
+
+// Auxiliar to read an array of wchar_t
+static
+cmsBool _cmsReadWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, wchar_t* Array)
+{
+    cmsUInt32Number i;
+    cmsUInt16Number tmp;
+
+    _cmsAssert(io != NULL);
+
+    for (i=0; i < n; i++) {
+
+        if (Array != NULL) {
+
+            if (!_cmsReadUInt16Number(io, &tmp)) return FALSE;
+            Array[i] = (wchar_t) tmp;
+        }
+        else {
+            if (!_cmsReadUInt16Number(io, NULL)) return FALSE;
+        }
+
+    }
+    return TRUE;
+}
+
+// To deal with position tables
+typedef cmsBool (* PositionTableEntryFn)(struct _cms_typehandler_struct* self,
+                                             cmsIOHANDLER* io,
+                                             void* Cargo,
+                                             cmsUInt32Number n,
+                                             cmsUInt32Number SizeOfTag);
+
+// Helper function to deal with position tables as decribed in ICC spec 4.3
+// A table of n elements is readed, where first comes n records containing offsets and sizes and
+// then a block containing the data itself. This allows to reuse same data in more than one entry
+static
+cmsBool ReadPositionTable(struct _cms_typehandler_struct* self,
+                              cmsIOHANDLER* io,
+                              cmsUInt32Number Count,
+                              cmsUInt32Number BaseOffset,
+                              void *Cargo,
+                              PositionTableEntryFn ElementFn)
+{
+    cmsUInt32Number i;
+    cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL;
+
+    // Let's take the offsets to each element
+    ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
+    if (ElementOffsets == NULL) goto Error;
+
+    ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
+    if (ElementSizes == NULL) goto Error;
+
+    for (i=0; i < Count; i++) {
+
+        if (!_cmsReadUInt32Number(io, &ElementOffsets[i])) goto Error;
+        if (!_cmsReadUInt32Number(io, &ElementSizes[i])) goto Error;
+
+        ElementOffsets[i] += BaseOffset;
+    }
+
+    // Seek to each element and read it
+    for (i=0; i < Count; i++) {
+
+        if (!io -> Seek(io, ElementOffsets[i])) goto Error;
+
+        // This is the reader callback
+        if (!ElementFn(self, io, Cargo, i, ElementSizes[i])) goto Error;
+    }
+
+    // Success
+    if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets);
+    if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes);
+    return TRUE;
+
+Error:
+    if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets);
+    if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes);
+    return FALSE;
+}
+
+// Same as anterior, but for write position tables
+static
+cmsBool WritePositionTable(struct _cms_typehandler_struct* self,
+                               cmsIOHANDLER* io,
+                               cmsUInt32Number SizeOfTag,
+                               cmsUInt32Number Count,
+                               cmsUInt32Number BaseOffset,
+                               void *Cargo,
+                               PositionTableEntryFn ElementFn)
+{
+    cmsUInt32Number i;
+    cmsUInt32Number DirectoryPos, CurrentPos, Before;
+    cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL;
+
+     // Create table
+    ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
+    if (ElementOffsets == NULL) goto Error;
+
+    ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
+    if (ElementSizes == NULL) goto Error;
+
+    // Keep starting position of curve offsets
+    DirectoryPos = io ->Tell(io);
+
+    // Write a fake directory to be filled latter on
+    for (i=0; i < Count; i++) {
+
+        if (!_cmsWriteUInt32Number(io, 0)) goto Error;  // Offset
+        if (!_cmsWriteUInt32Number(io, 0)) goto Error;  // size
+    }
+
+    // Write each element. Keep track of the size as well.
+    for (i=0; i < Count; i++) {
+
+        Before = io ->Tell(io);
+        ElementOffsets[i] = Before - BaseOffset;
+
+        // Callback to write...
+        if (!ElementFn(self, io, Cargo, i, SizeOfTag)) goto Error;
+
+        // Now the size
+        ElementSizes[i] = io ->Tell(io) - Before;
+    }
+
+    // Write the directory
+    CurrentPos = io ->Tell(io);
+    if (!io ->Seek(io, DirectoryPos)) goto Error;
+
+    for (i=0; i <  Count; i++) {
+        if (!_cmsWriteUInt32Number(io, ElementOffsets[i])) goto Error;
+        if (!_cmsWriteUInt32Number(io, ElementSizes[i])) goto Error;
+    }
+
+    if (!io ->Seek(io, CurrentPos)) goto Error;
+
+    if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets);
+    if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes);
+    return TRUE;
+
+Error:
+    if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets);
+    if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes);
+    return FALSE;
+}
+
+
+// ********************************************************************************
+// Type XYZ. Only one value is allowed
+// ********************************************************************************
+
+//The XYZType contains an array of three encoded values for the XYZ tristimulus
+//values. Tristimulus values must be non-negative. The signed encoding allows for
+//implementation optimizations by minimizing the number of fixed formats.
+
+
+static
+void *Type_XYZ_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsCIEXYZ* xyz;
+
+    *nItems = 0;
+    xyz = (cmsCIEXYZ*) _cmsMallocZero(self ->ContextID, sizeof(cmsCIEXYZ));
+    if (xyz == NULL) return NULL;
+
+    if (!_cmsReadXYZNumber(io, xyz)) {
+        _cmsFree(self ->ContextID, xyz);
+        return NULL;
+    }
+
+    *nItems = 1;
+    return (void*) xyz;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+cmsBool  Type_XYZ_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    return _cmsWriteXYZNumber(io, (cmsCIEXYZ*) Ptr);
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_XYZ_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIEXYZ));
+
+    cmsUNUSED_PARAMETER(n);
+}
+
+static
+void Type_XYZ_Free(struct _cms_typehandler_struct* self, void *Ptr)
+{
+    _cmsFree(self ->ContextID, Ptr);
+}
+
+
+static
+cmsTagTypeSignature DecideXYZtype(cmsFloat64Number ICCVersion, const void *Data)
+{
+    return cmsSigXYZType;
+
+    cmsUNUSED_PARAMETER(ICCVersion);
+    cmsUNUSED_PARAMETER(Data);
+}
+
+
+// ********************************************************************************
+// Type chromaticity. Only one value is allowed
+// ********************************************************************************
+// The chromaticity tag type provides basic chromaticity data and type of
+// phosphors or colorants of a monitor to applications and utilities.
+
+static
+void *Type_Chromaticity_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsCIExyYTRIPLE* chrm;
+    cmsUInt16Number nChans, Table;
+
+    *nItems = 0;
+    chrm =  (cmsCIExyYTRIPLE*) _cmsMallocZero(self ->ContextID, sizeof(cmsCIExyYTRIPLE));
+    if (chrm == NULL) return NULL;
+
+    if (!_cmsReadUInt16Number(io, &nChans)) goto Error;
+
+    // Let's recover from a bug introduced in early versions of lcms1
+    if (nChans == 0 && SizeOfTag == 32) {
+
+        if (!_cmsReadUInt16Number(io, NULL)) goto Error;
+        if (!_cmsReadUInt16Number(io, &nChans)) goto Error;
+    }
+
+    if (nChans != 3) goto Error;
+
+    if (!_cmsReadUInt16Number(io, &Table)) goto Error;
+
+    if (!_cmsRead15Fixed16Number(io, &chrm ->Red.x)) goto Error;
+    if (!_cmsRead15Fixed16Number(io, &chrm ->Red.y)) goto Error;
+
+    chrm ->Red.Y = 1.0;
+
+    if (!_cmsRead15Fixed16Number(io, &chrm ->Green.x)) goto Error;
+    if (!_cmsRead15Fixed16Number(io, &chrm ->Green.y)) goto Error;
+
+    chrm ->Green.Y = 1.0;
+
+    if (!_cmsRead15Fixed16Number(io, &chrm ->Blue.x)) goto Error;
+    if (!_cmsRead15Fixed16Number(io, &chrm ->Blue.y)) goto Error;
+
+    chrm ->Blue.Y = 1.0;
+
+    *nItems = 1;
+    return (void*) chrm;
+
+Error:
+    _cmsFree(self ->ContextID, (void*) chrm);
+    return NULL;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+cmsBool  SaveOneChromaticity(cmsFloat64Number x, cmsFloat64Number y, cmsIOHANDLER* io)
+{
+    if (!_cmsWriteUInt32Number(io, _cmsDoubleTo15Fixed16(x))) return FALSE;
+    if (!_cmsWriteUInt32Number(io, _cmsDoubleTo15Fixed16(y))) return FALSE;
+
+    return TRUE;
+}
+
+static
+cmsBool  Type_Chromaticity_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsCIExyYTRIPLE* chrm = (cmsCIExyYTRIPLE*) Ptr;
+
+    if (!_cmsWriteUInt16Number(io, 3)) return FALSE;        // nChannels
+    if (!_cmsWriteUInt16Number(io, 0)) return FALSE;        // Table
+
+    if (!SaveOneChromaticity(chrm -> Red.x,   chrm -> Red.y, io)) return FALSE;
+    if (!SaveOneChromaticity(chrm -> Green.x, chrm -> Green.y, io)) return FALSE;
+    if (!SaveOneChromaticity(chrm -> Blue.x,  chrm -> Blue.y, io)) return FALSE;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_Chromaticity_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIExyYTRIPLE));
+
+    cmsUNUSED_PARAMETER(n);
+}
+
+static
+void Type_Chromaticity_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    _cmsFree(self ->ContextID, Ptr);
+}
+
+
+// ********************************************************************************
+// Type cmsSigColorantOrderType
+// ********************************************************************************
+
+// This is an optional tag which specifies the laydown order in which colorants will
+// be printed on an n-colorant device. The laydown order may be the same as the
+// channel generation order listed in the colorantTableTag or the channel order of a
+// colour space such as CMYK, in which case this tag is not needed. When this is not
+// the case (for example, ink-towers sometimes use the order KCMY), this tag may be
+// used to specify the laydown order of the colorants.
+
+
+static
+void *Type_ColorantOrderType_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsUInt8Number* ColorantOrder;
+    cmsUInt32Number Count;
+
+    *nItems = 0;
+    if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+    if (Count > cmsMAXCHANNELS) return NULL;
+
+    ColorantOrder = (cmsUInt8Number*) _cmsCalloc(self ->ContextID, cmsMAXCHANNELS, sizeof(cmsUInt8Number));
+    if (ColorantOrder == NULL) return NULL;
+
+    // We use FF as end marker
+    memset(ColorantOrder, 0xFF, cmsMAXCHANNELS * sizeof(cmsUInt8Number));
+
+    if (io ->Read(io, ColorantOrder, sizeof(cmsUInt8Number), Count) != Count) {
+
+        _cmsFree(self ->ContextID, (void*) ColorantOrder);
+        return NULL;
+    }
+
+    *nItems = 1;
+    return (void*) ColorantOrder;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+cmsBool Type_ColorantOrderType_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsUInt8Number*  ColorantOrder = (cmsUInt8Number*) Ptr;
+    cmsUInt32Number i, sz, Count;
+
+    // Get the length
+    for (Count=i=0; i < cmsMAXCHANNELS; i++) {
+        if (ColorantOrder[i] != 0xFF) Count++;
+    }
+
+    if (!_cmsWriteUInt32Number(io, Count)) return FALSE;
+
+    sz = Count * sizeof(cmsUInt8Number);
+    if (!io -> Write(io, sz, ColorantOrder)) return FALSE;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_ColorantOrderType_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return _cmsDupMem(self ->ContextID, Ptr, cmsMAXCHANNELS * sizeof(cmsUInt8Number));
+
+    cmsUNUSED_PARAMETER(n);
+}
+
+
+static
+void Type_ColorantOrderType_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    _cmsFree(self ->ContextID, Ptr);
+}
+
+// ********************************************************************************
+// Type cmsSigS15Fixed16ArrayType
+// ********************************************************************************
+// This type represents an array of generic 4-byte/32-bit fixed point quantity.
+// The number of values is determined from the size of the tag.
+
+static
+void *Type_S15Fixed16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsFloat64Number*  array_double;
+    cmsUInt32Number i, n;
+
+    *nItems = 0;
+    n = SizeOfTag / sizeof(cmsUInt32Number);
+    array_double = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, n, sizeof(cmsFloat64Number));
+    if (array_double == NULL) return NULL;
+
+    for (i=0; i < n; i++) {
+
+        if (!_cmsRead15Fixed16Number(io, &array_double[i])) {
+
+            _cmsFree(self ->ContextID, array_double);
+            return NULL;
+        }
+    }
+
+    *nItems = n;
+    return (void*) array_double;
+}
+
+static
+cmsBool Type_S15Fixed16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsFloat64Number* Value = (cmsFloat64Number*) Ptr;
+    cmsUInt32Number i;
+
+    for (i=0; i < nItems; i++) {
+
+        if (!_cmsWrite15Fixed16Number(io, Value[i])) return FALSE;
+    }
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_S15Fixed16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsFloat64Number));
+}
+
+
+static
+void Type_S15Fixed16_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    _cmsFree(self ->ContextID, Ptr);
+}
+
+// ********************************************************************************
+// Type cmsSigU16Fixed16ArrayType
+// ********************************************************************************
+// This type represents an array of generic 4-byte/32-bit quantity.
+// The number of values is determined from the size of the tag.
+
+
+static
+void *Type_U16Fixed16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsFloat64Number*  array_double;
+    cmsUInt32Number v;
+    cmsUInt32Number i, n;
+
+    *nItems = 0;
+    n = SizeOfTag / sizeof(cmsUInt32Number);
+    array_double = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, n, sizeof(cmsFloat64Number));
+    if (array_double == NULL) return NULL;
+
+    for (i=0; i < n; i++) {
+
+        if (!_cmsReadUInt32Number(io, &v)) {
+            _cmsFree(self ->ContextID, (void*) array_double);
+            return NULL;
+        }
+
+        // Convert to cmsFloat64Number
+        array_double[i] =  (cmsFloat64Number) (v / 65536.0);
+    }
+
+    *nItems = n;
+    return (void*) array_double;
+}
+
+static
+cmsBool Type_U16Fixed16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsFloat64Number* Value = (cmsFloat64Number*) Ptr;
+    cmsUInt32Number i;
+
+    for (i=0; i < nItems; i++) {
+
+        cmsUInt32Number v = (cmsUInt32Number) floor(Value[i]*65536.0 + 0.5);
+
+        if (!_cmsWriteUInt32Number(io, v)) return FALSE;
+    }
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_U16Fixed16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsFloat64Number));
+}
+
+static
+void Type_U16Fixed16_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    _cmsFree(self ->ContextID, Ptr);
+}
+
+// ********************************************************************************
+// Type cmsSigSignatureType
+// ********************************************************************************
+//
+// The signatureType contains a four-byte sequence, Sequences of less than four
+// characters are padded at the end with spaces, 20h.
+// Typically this type is used for registered tags that can be displayed on many
+// development systems as a sequence of four characters.
+
+static
+void *Type_Signature_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsSignature* SigPtr = (cmsSignature*) _cmsMalloc(self ->ContextID, sizeof(cmsSignature));
+    if (SigPtr == NULL) return NULL;
+
+     if (!_cmsReadUInt32Number(io, SigPtr)) return NULL;
+     *nItems = 1;
+
+     return SigPtr;
+
+     cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+cmsBool  Type_Signature_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsSignature* SigPtr = (cmsSignature*) Ptr;
+
+    return _cmsWriteUInt32Number(io, *SigPtr);
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_Signature_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsSignature));
+}
+
+static
+void Type_Signature_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    _cmsFree(self ->ContextID, Ptr);
+}
+
+
+// ********************************************************************************
+// Type cmsSigTextType
+// ********************************************************************************
+//
+// The textType is a simple text structure that contains a 7-bit ASCII text string.
+// The length of the string is obtained by subtracting 8 from the element size portion
+// of the tag itself. This string must be terminated with a 00h byte.
+
+static
+void *Type_Text_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    char* Text = NULL;
+    cmsMLU* mlu = NULL;
+
+    // Create a container
+    mlu = cmsMLUalloc(self ->ContextID, 1);
+    if (mlu == NULL) return NULL;
+
+    *nItems = 0;
+
+    // We need to store the "\0" at the end, so +1
+    if (SizeOfTag == UINT_MAX) goto Error;
+
+    Text = (char*) _cmsMalloc(self ->ContextID, SizeOfTag + 1);
+    if (Text == NULL) goto Error;
+
+    if (io -> Read(io, Text, sizeof(char), SizeOfTag) != SizeOfTag) goto Error;
+
+    // Make sure text is properly ended
+    Text[SizeOfTag] = 0;
+    *nItems = 1;
+
+    // Keep the result
+    if (!cmsMLUsetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text)) goto Error;
+
+    _cmsFree(self ->ContextID, Text);
+    return (void*) mlu;
+
+Error:
+    if (mlu != NULL)
+        cmsMLUfree(mlu);
+    if (Text != NULL)
+        _cmsFree(self ->ContextID, Text);
+
+    return NULL;
+}
+
+// The conversion implies to choose a language. So, we choose the actual language.
+static
+cmsBool Type_Text_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsMLU* mlu = (cmsMLU*) Ptr;
+    cmsUInt32Number size;
+    cmsBool  rc;
+    char* Text;
+
+    // Get the size of the string. Note there is an extra "\0" at the end
+    size = cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, NULL, 0);
+    if (size == 0) return FALSE;       // Cannot be zero!
+
+    // Create memory
+    Text = (char*) _cmsMalloc(self ->ContextID, size);
+    if (Text == NULL) return FALSE;
+
+    cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text, size);
+
+    // Write it, including separator
+    rc = io ->Write(io, size, Text);
+
+    _cmsFree(self ->ContextID, Text);
+    return rc;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+static
+void* Type_Text_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsMLUdup((cmsMLU*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void Type_Text_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsMLU* mlu = (cmsMLU*) Ptr;
+    cmsMLUfree(mlu);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+cmsTagTypeSignature DecideTextType(cmsFloat64Number ICCVersion, const void *Data)
+{
+    if (ICCVersion >= 4.0)
+        return cmsSigMultiLocalizedUnicodeType;
+
+    return cmsSigTextType;
+
+    cmsUNUSED_PARAMETER(Data);
+}
+
+
+// ********************************************************************************
+// Type cmsSigDataType
+// ********************************************************************************
+
+// General purpose data type
+static
+void *Type_Data_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsICCData* BinData;
+    cmsUInt32Number LenOfData;
+
+    *nItems = 0;
+
+    if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;
+
+    LenOfData = SizeOfTag - sizeof(cmsUInt32Number);
+    if (LenOfData > INT_MAX) return NULL;
+
+    BinData = (cmsICCData*) _cmsMalloc(self ->ContextID, sizeof(cmsICCData) + LenOfData - 1);
+    if (BinData == NULL) return NULL;
+
+    BinData ->len = LenOfData;
+    if (!_cmsReadUInt32Number(io, &BinData->flag)) {
+        _cmsFree(self ->ContextID, BinData);
+        return NULL;
+    }
+
+    if (io -> Read(io, BinData ->data, sizeof(cmsUInt8Number), LenOfData) != LenOfData) {
+
+        _cmsFree(self ->ContextID, BinData);
+        return NULL;
+    }
+
+    *nItems = 1;
+
+    return (void*) BinData;
+}
+
+
+static
+cmsBool Type_Data_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+   cmsICCData* BinData = (cmsICCData*) Ptr;
+
+   if (!_cmsWriteUInt32Number(io, BinData ->flag)) return FALSE;
+
+   return io ->Write(io, BinData ->len, BinData ->data);
+
+   cmsUNUSED_PARAMETER(nItems);
+   cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_Data_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    cmsICCData* BinData = (cmsICCData*) Ptr;
+
+    return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsICCData) + BinData ->len - 1);
+
+    cmsUNUSED_PARAMETER(n);
+}
+
+static
+void Type_Data_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    _cmsFree(self ->ContextID, Ptr);
+}
+
+// ********************************************************************************
+// Type cmsSigTextDescriptionType
+// ********************************************************************************
+
+static
+void *Type_Text_Description_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    char* Text = NULL;
+    cmsMLU* mlu = NULL;
+    cmsUInt32Number  AsciiCount;
+    cmsUInt32Number  i, UnicodeCode, UnicodeCount;
+    cmsUInt16Number  ScriptCodeCode, Dummy;
+    cmsUInt8Number   ScriptCodeCount;
+
+    *nItems = 0;
+
+    //  One dword should be there
+    if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;
+
+    // Read len of ASCII
+    if (!_cmsReadUInt32Number(io, &AsciiCount)) return NULL;
+    SizeOfTag -= sizeof(cmsUInt32Number);
+
+    // Check for size
+    if (SizeOfTag < AsciiCount) return NULL;
+
+    // All seems Ok, allocate the container
+    mlu = cmsMLUalloc(self ->ContextID, 1);
+    if (mlu == NULL) return NULL;
+
+    // As many memory as size of tag
+    Text = (char*) _cmsMalloc(self ->ContextID, AsciiCount + 1);
+    if (Text == NULL) goto Error;
+
+    // Read it
+    if (io ->Read(io, Text, sizeof(char), AsciiCount) != AsciiCount) goto Error;
+    SizeOfTag -= AsciiCount;
+
+    // Make sure there is a terminator
+    Text[AsciiCount] = 0;
+
+    // Set the MLU entry. From here we can be tolerant to wrong types
+    if (!cmsMLUsetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text)) goto Error;
+    _cmsFree(self ->ContextID, (void*) Text);
+    Text = NULL;
+
+    // Skip Unicode code
+    if (SizeOfTag < 2* sizeof(cmsUInt32Number)) goto Done;
+    if (!_cmsReadUInt32Number(io, &UnicodeCode)) goto Done;
+    if (!_cmsReadUInt32Number(io, &UnicodeCount)) goto Done;
+    SizeOfTag -= 2* sizeof(cmsUInt32Number);
+
+    if (SizeOfTag < UnicodeCount*sizeof(cmsUInt16Number)) goto Done;
+
+    for (i=0; i < UnicodeCount; i++) {
+        if (!io ->Read(io, &Dummy, sizeof(cmsUInt16Number), 1)) goto Done;
+    }
+    SizeOfTag -= UnicodeCount*sizeof(cmsUInt16Number);
+
+    // Skip ScriptCode code if present. Some buggy profiles does have less
+    // data that stricttly required. We need to skip it as this type may come
+    // embedded in other types.
+
+    if (SizeOfTag >= sizeof(cmsUInt16Number) + sizeof(cmsUInt8Number) + 67) {
+
+        if (!_cmsReadUInt16Number(io, &ScriptCodeCode)) goto Done;
+        if (!_cmsReadUInt8Number(io,  &ScriptCodeCount)) goto Done;
+
+        // Skip rest of tag
+        for (i=0; i < 67; i++) {
+            if (!io ->Read(io, &Dummy, sizeof(cmsUInt8Number), 1)) goto Error;
+        }
+    }
+
+Done:
+
+    *nItems = 1;
+    return mlu;
+
+Error:
+    if (Text) _cmsFree(self ->ContextID, (void*) Text);
+    if (mlu) cmsMLUfree(mlu);
+    return NULL;
+}
+
+
+// This tag can come IN UNALIGNED SIZE. In order to prevent issues, we force zeros on description to align it
+static
+cmsBool  Type_Text_Description_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsMLU* mlu = (cmsMLU*) Ptr;
+    char *Text = NULL;
+    wchar_t *Wide = NULL;
+    cmsUInt32Number len, len_aligned, len_filler_alignment;
+    cmsBool  rc = FALSE;
+    char Filler[68];
+
+    // Used below for writting zeroes
+    memset(Filler, 0, sizeof(Filler));
+
+    // Get the len of string
+    len = cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, NULL, 0);
+
+    // From ICC3.4: It has been found that textDescriptionType can contain misaligned data
+    //(see clause 4.1 for the definition of “aligned?. Because the Unicode language
+    // code and Unicode count immediately follow the ASCII description, their
+    // alignment is not correct if the ASCII count is not a multiple of four. The
+    // ScriptCode code is misaligned when the ASCII count is odd. Profile reading and
+    // writing software must be written carefully in order to handle these alignment
+    // problems.
+
+    // Compute an aligned size
+    len_aligned = _cmsALIGNLONG(len);
+    len_filler_alignment = len_aligned - len;
+
+    // Null strings
+    if (len <= 0) {
+
+        Text = (char*)    _cmsDupMem(self ->ContextID, "", sizeof(char));
+        Wide = (wchar_t*) _cmsDupMem(self ->ContextID, L"", sizeof(wchar_t));
+    }
+    else {
+        // Create independent buffers
+        Text = (char*) _cmsCalloc(self ->ContextID, len, sizeof(char));
+        if (Text == NULL) goto Error;
+
+        Wide = (wchar_t*) _cmsCalloc(self ->ContextID, len, sizeof(wchar_t));
+        if (Wide == NULL) goto Error;
+
+        // Get both representations.
+        cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry,  Text, len * sizeof(char));
+        cmsMLUgetWide(mlu,  cmsNoLanguage, cmsNoCountry,  Wide, len * sizeof(wchar_t));
+    }
+
+  // * cmsUInt32Number       count;          * Description length
+  // * cmsInt8Number         desc[count]     * NULL terminated ascii string
+  // * cmsUInt32Number       ucLangCode;     * UniCode language code
+  // * cmsUInt32Number       ucCount;        * UniCode description length
+  // * cmsInt16Number        ucDesc[ucCount];* The UniCode description
+  // * cmsUInt16Number       scCode;         * ScriptCode code
+  // * cmsUInt8Number        scCount;        * ScriptCode count
+  // * cmsInt8Number         scDesc[67];     * ScriptCode Description
+
+    if (!_cmsWriteUInt32Number(io, len_aligned)) goto Error;
+    if (!io ->Write(io, len, Text)) goto Error;
+    if (!io ->Write(io, len_filler_alignment, Filler)) goto Error;
+
+    if (!_cmsWriteUInt32Number(io, 0)) goto Error;  // ucLanguageCode
+
+    // This part is tricky: we need an aligned tag size, and the ScriptCode part
+    // takes 70 bytes, so we need 2 extra bytes to do the alignment
+
+    if (!_cmsWriteUInt32Number(io, len_aligned+1)) goto Error;
+
+    // Note that in some compilers sizeof(cmsUInt16Number) != sizeof(wchar_t)
+    if (!_cmsWriteWCharArray(io, len, Wide)) goto Error;
+    if (!_cmsWriteUInt16Array(io, len_filler_alignment+1, (cmsUInt16Number*) Filler)) goto Error;
+
+    // ScriptCode Code & count (unused)
+    if (!_cmsWriteUInt16Number(io, 0)) goto Error;
+    if (!_cmsWriteUInt8Number(io, 0)) goto Error;
+
+    if (!io ->Write(io, 67, Filler)) goto Error;
+
+    rc = TRUE;
+
+Error:
+    if (Text) _cmsFree(self ->ContextID, Text);
+    if (Wide) _cmsFree(self ->ContextID, Wide);
+
+    return rc;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_Text_Description_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsMLUdup((cmsMLU*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_Text_Description_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsMLU* mlu = (cmsMLU*) Ptr;
+
+    cmsMLUfree(mlu);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+cmsTagTypeSignature DecideTextDescType(cmsFloat64Number ICCVersion, const void *Data)
+{
+    if (ICCVersion >= 4.0)
+        return cmsSigMultiLocalizedUnicodeType;
+
+    return cmsSigTextDescriptionType;
+
+    cmsUNUSED_PARAMETER(Data);
+}
+
+
+// ********************************************************************************
+// Type cmsSigCurveType
+// ********************************************************************************
+
+static
+void *Type_Curve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsUInt32Number Count;
+    cmsToneCurve* NewGamma;
+    
+    *nItems = 0;
+    if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+
+    switch (Count) {
+
+           case 0:   // Linear.
+               {
+                   cmsFloat64Number SingleGamma = 1.0;
+
+                   NewGamma = cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma);
+                   if (!NewGamma) return NULL;
+                   *nItems = 1;
+                   return NewGamma;
+               }
+              
+           case 1:  // Specified as the exponent of gamma function
+               {
+                   cmsUInt16Number SingleGammaFixed;
+                   cmsFloat64Number SingleGamma;
+
+                   if (!_cmsReadUInt16Number(io, &SingleGammaFixed)) return NULL;
+                   SingleGamma = _cms8Fixed8toDouble(SingleGammaFixed);
+
+                   *nItems = 1;
+                   return cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma);
+               }
+
+           default:  // Curve
+
+               if (Count > 0x7FFF)
+                   return NULL; // This is to prevent bad guys for doing bad things
+
+               NewGamma = cmsBuildTabulatedToneCurve16(self ->ContextID, Count, NULL);
+               if (!NewGamma) return NULL;
+
+               if (!_cmsReadUInt16Array(io, Count, NewGamma -> Table16)) return NULL;
+
+               *nItems = 1;
+               return NewGamma;
+    }
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+static
+cmsBool  Type_Curve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsToneCurve* Curve = (cmsToneCurve*) Ptr;
+
+    if (Curve ->nSegments == 1 && Curve ->Segments[0].Type == 1) {
+
+            // Single gamma, preserve number
+            cmsUInt16Number SingleGammaFixed = _cmsDoubleTo8Fixed8(Curve ->Segments[0].Params[0]);
+
+            if (!_cmsWriteUInt32Number(io, 1)) return FALSE;
+            if (!_cmsWriteUInt16Number(io, SingleGammaFixed)) return FALSE;
+            return TRUE;
+
+    }
+
+    if (!_cmsWriteUInt32Number(io, Curve ->nEntries)) return FALSE;
+    return _cmsWriteUInt16Array(io, Curve ->nEntries, Curve ->Table16);
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_Curve_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsDupToneCurve((cmsToneCurve*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_Curve_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsToneCurve* gamma = (cmsToneCurve*) Ptr;
+
+    cmsFreeToneCurve(gamma);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigParametricCurveType
+// ********************************************************************************
+
+
+// Decide which curve type to use on writting
+static
+cmsTagTypeSignature DecideCurveType(cmsFloat64Number ICCVersion, const void *Data)
+{
+    cmsToneCurve* Curve = (cmsToneCurve*) Data;
+
+    if (ICCVersion < 4.0) return cmsSigCurveType;
+    if (Curve ->nSegments != 1) return cmsSigCurveType;          // Only 1-segment curves can be saved as parametric
+    if (Curve ->Segments[0].Type < 0) return cmsSigCurveType;    // Only non-inverted curves
+    if (Curve ->Segments[0].Type > 5) return cmsSigCurveType;    // Only ICC parametric curves
+
+    return cmsSigParametricCurveType;
+}
+
+static
+void *Type_ParametricCurve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    static const int ParamsByType[] = { 1, 3, 4, 5, 7 };
+    cmsFloat64Number Params[10];
+    cmsUInt16Number Type;
+    int i, n;
+    cmsToneCurve* NewGamma;
+
+    if (!_cmsReadUInt16Number(io, &Type)) return NULL;
+    if (!_cmsReadUInt16Number(io, NULL)) return NULL;   // Reserved
+
+    if (Type > 4) {
+
+        cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown parametric curve type '%d'", Type);
+        return NULL;
+    }
+
+    memset(Params, 0, sizeof(Params));
+    n = ParamsByType[Type];
+
+    for (i=0; i < n; i++) {
+
+        if (!_cmsRead15Fixed16Number(io, &Params[i])) return NULL;
+    }
+
+    NewGamma = cmsBuildParametricToneCurve(self ->ContextID, Type+1, Params);
+
+    *nItems = 1;
+    return NewGamma;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+static
+cmsBool  Type_ParametricCurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsToneCurve* Curve = (cmsToneCurve*) Ptr;
+    int i, nParams, typen;
+    static const int ParamsByType[] = { 0, 1, 3, 4, 5, 7 };
+
+    typen = Curve -> Segments[0].Type;
+
+    if (Curve ->nSegments > 1 || typen < 1) {
+
+        cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Multisegment or Inverted parametric curves cannot be written");
+        return FALSE;
+    }
+
+    if (typen > 5) {
+        cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported parametric curve");
+        return FALSE;
+    }
+
+    nParams = ParamsByType[typen];
+
+    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) (Curve ->Segments[0].Type - 1))) return FALSE;
+    if (!_cmsWriteUInt16Number(io, 0)) return FALSE;        // Reserved
+
+    for (i=0; i < nParams; i++) {
+
+        if (!_cmsWrite15Fixed16Number(io, Curve -> Segments[0].Params[i])) return FALSE;
+    }
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+static
+void* Type_ParametricCurve_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsDupToneCurve((cmsToneCurve*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_ParametricCurve_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsToneCurve* gamma = (cmsToneCurve*) Ptr;
+
+    cmsFreeToneCurve(gamma);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigDateTimeType
+// ********************************************************************************
+
+// A 12-byte value representation of the time and date, where the byte usage is assigned
+// as specified in table 1. The actual values are encoded as 16-bit unsigned integers
+// (uInt16Number - see 5.1.6).
+//
+// All the dateTimeNumber values in a profile shall be in Coordinated Universal Time
+// (UTC, also known as GMT or ZULU Time). Profile writers are required to convert local
+// time to UTC when setting these values. Programmes that display these values may show
+// the dateTimeNumber as UTC, show the equivalent local time (at current locale), or
+// display both UTC and local versions of the dateTimeNumber.
+
+static
+void *Type_DateTime_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsDateTimeNumber timestamp;
+    struct tm * NewDateTime;
+
+    *nItems = 0;
+    NewDateTime = (struct tm*) _cmsMalloc(self ->ContextID, sizeof(struct tm));
+    if (NewDateTime == NULL) return NULL;
+
+    if (io->Read(io, &timestamp, sizeof(cmsDateTimeNumber), 1) != 1) return NULL;
+
+     _cmsDecodeDateTimeNumber(&timestamp, NewDateTime);
+
+     *nItems = 1;
+     return NewDateTime;
+
+     cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+static
+cmsBool  Type_DateTime_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    struct tm * DateTime = (struct tm*) Ptr;
+    cmsDateTimeNumber timestamp;
+
+    _cmsEncodeDateTimeNumber(&timestamp, DateTime);
+    if (!io ->Write(io, sizeof(cmsDateTimeNumber), &timestamp)) return FALSE;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_DateTime_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return _cmsDupMem(self ->ContextID, Ptr, sizeof(struct tm));
+
+    cmsUNUSED_PARAMETER(n);
+}
+
+static
+void Type_DateTime_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    _cmsFree(self ->ContextID, Ptr);
+}
+
+
+
+// ********************************************************************************
+// Type icMeasurementType
+// ********************************************************************************
+
+/*
+The measurementType information refers only to the internal profile data and is
+meant to provide profile makers an alternative to the default measurement
+specifications.
+*/
+
+static
+void *Type_Measurement_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsICCMeasurementConditions mc;
+
+	
+    memset(&mc, 0, sizeof(mc));
+	
+    if (!_cmsReadUInt32Number(io, &mc.Observer)) return NULL;
+    if (!_cmsReadXYZNumber(io,    &mc.Backing)) return NULL;
+    if (!_cmsReadUInt32Number(io, &mc.Geometry)) return NULL;
+    if (!_cmsRead15Fixed16Number(io, &mc.Flare)) return NULL;
+    if (!_cmsReadUInt32Number(io, &mc.IlluminantType)) return NULL;
+
+    *nItems = 1;
+    return _cmsDupMem(self ->ContextID, &mc, sizeof(cmsICCMeasurementConditions));
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+static
+cmsBool  Type_Measurement_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsICCMeasurementConditions* mc =(cmsICCMeasurementConditions*) Ptr;
+
+    if (!_cmsWriteUInt32Number(io, mc->Observer)) return FALSE;
+    if (!_cmsWriteXYZNumber(io,    &mc->Backing)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, mc->Geometry)) return FALSE;
+    if (!_cmsWrite15Fixed16Number(io, mc->Flare)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, mc->IlluminantType)) return FALSE;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_Measurement_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+     return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsICCMeasurementConditions));
+
+     cmsUNUSED_PARAMETER(n);
+}
+
+static
+void Type_Measurement_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+   _cmsFree(self ->ContextID, Ptr);
+}
+
+
+// ********************************************************************************
+// Type cmsSigMultiLocalizedUnicodeType
+// ********************************************************************************
+//
+//   Do NOT trust SizeOfTag as there is an issue on the definition of profileSequenceDescTag. See the TechNote from
+//   Max Derhak and Rohit Patil about this: basically the size of the string table should be guessed and cannot be
+//   taken from the size of tag if this tag is embedded as part of bigger structures (profileSequenceDescTag, for instance)
+//
+
+static
+void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsMLU* mlu;
+    cmsUInt32Number Count, RecLen, NumOfWchar;
+    cmsUInt32Number SizeOfHeader;
+    cmsUInt32Number  Len, Offset;
+    cmsUInt32Number  i;
+    wchar_t*         Block;
+    cmsUInt32Number  BeginOfThisString, EndOfThisString, LargestPosition;
+
+    *nItems = 0;
+    if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+    if (!_cmsReadUInt32Number(io, &RecLen)) return NULL;
+
+    if (RecLen != 12) {
+
+        cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "multiLocalizedUnicodeType of len != 12 is not supported.");
+        return NULL;
+    }
+
+    mlu = cmsMLUalloc(self ->ContextID, Count);
+    if (mlu == NULL) return NULL;
+
+    mlu ->UsedEntries = Count;
+
+    SizeOfHeader = 12 * Count + sizeof(_cmsTagBase);
+    LargestPosition = 0;
+
+    for (i=0; i < Count; i++) {
+
+        if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Language)) goto Error;
+        if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Country))  goto Error;
+
+        // Now deal with Len and offset.
+        if (!_cmsReadUInt32Number(io, &Len)) goto Error;
+        if (!_cmsReadUInt32Number(io, &Offset)) goto Error;
+
+        // Check for overflow
+        if (Offset < (SizeOfHeader + 8)) goto Error;
+
+        // True begin of the string
+        BeginOfThisString = Offset - SizeOfHeader - 8;
+
+        // Ajust to wchar_t elements
+        mlu ->Entries[i].Len = (Len * sizeof(wchar_t)) / sizeof(cmsUInt16Number);
+        mlu ->Entries[i].StrW = (BeginOfThisString * sizeof(wchar_t)) / sizeof(cmsUInt16Number);
+
+        // To guess maximum size, add offset + len
+        EndOfThisString = BeginOfThisString + Len;
+        if (EndOfThisString > LargestPosition)
+            LargestPosition = EndOfThisString;
+    }
+
+    // Now read the remaining of tag and fill all strings. Substract the directory
+    SizeOfTag   = (LargestPosition * sizeof(wchar_t)) / sizeof(cmsUInt16Number);
+    if (SizeOfTag == 0)
+    {
+        Block = NULL;
+        NumOfWchar = 0;
+
+    }
+    else
+    {
+        Block = (wchar_t*) _cmsMalloc(self ->ContextID, SizeOfTag);
+        if (Block == NULL) goto Error;
+        NumOfWchar = SizeOfTag / sizeof(wchar_t);
+        if (!_cmsReadWCharArray(io, NumOfWchar, Block)) goto Error;
+    }
+
+    mlu ->MemPool  = Block;
+    mlu ->PoolSize = SizeOfTag;
+    mlu ->PoolUsed = SizeOfTag;
+
+    *nItems = 1;
+    return (void*) mlu;
+
+Error:
+    if (mlu) cmsMLUfree(mlu);
+    return NULL;
+}
+
+static
+cmsBool  Type_MLU_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsMLU* mlu =(cmsMLU*) Ptr;
+    cmsUInt32Number HeaderSize;
+    cmsUInt32Number  Len, Offset;
+    int i;
+
+    if (Ptr == NULL) {
+
+          // Empty placeholder
+          if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+          if (!_cmsWriteUInt32Number(io, 12)) return FALSE;
+          return TRUE;
+    }
+
+    if (!_cmsWriteUInt32Number(io, mlu ->UsedEntries)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, 12)) return FALSE;
+
+    HeaderSize = 12 * mlu ->UsedEntries + sizeof(_cmsTagBase);
+
+    for (i=0; i < mlu ->UsedEntries; i++) {
+
+        Len    =  mlu ->Entries[i].Len;
+        Offset =  mlu ->Entries[i].StrW;
+
+        Len    = (Len * sizeof(cmsUInt16Number)) / sizeof(wchar_t);
+        Offset = (Offset * sizeof(cmsUInt16Number)) / sizeof(wchar_t) + HeaderSize + 8;
+
+        if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Language)) return FALSE;
+        if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Country))  return FALSE;
+        if (!_cmsWriteUInt32Number(io, Len)) return FALSE;
+        if (!_cmsWriteUInt32Number(io, Offset)) return FALSE;
+    }
+
+    if (!_cmsWriteWCharArray(io, mlu ->PoolUsed / sizeof(wchar_t), (wchar_t*)  mlu ->MemPool)) return FALSE;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_MLU_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsMLUdup((cmsMLU*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_MLU_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsMLUfree((cmsMLU*) Ptr);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigLut8Type
+// ********************************************************************************
+
+// Decide which LUT type to use on writting
+static
+cmsTagTypeSignature DecideLUTtypeA2B(cmsFloat64Number ICCVersion, const void *Data)
+{
+    cmsPipeline* Lut = (cmsPipeline*) Data;
+
+    if (ICCVersion < 4.0) {
+        if (Lut ->SaveAs8Bits) return cmsSigLut8Type;
+        return cmsSigLut16Type;
+    }
+    else {
+         return cmsSigLutAtoBType;
+    }
+}
+
+static
+cmsTagTypeSignature DecideLUTtypeB2A(cmsFloat64Number ICCVersion, const void *Data)
+{
+    cmsPipeline* Lut = (cmsPipeline*) Data;
+
+    if (ICCVersion < 4.0) {
+        if (Lut ->SaveAs8Bits) return cmsSigLut8Type;
+        return cmsSigLut16Type;
+    }
+    else {
+         return cmsSigLutBtoAType;
+    }
+}
+
+/*
+This structure represents a colour transform using tables of 8-bit precision.
+This type contains four processing elements: a 3 by 3 matrix (which shall be
+the identity matrix unless the input colour space is XYZ), a set of one dimensional
+input tables, a multidimensional lookup table, and a set of one dimensional output
+tables. Data is processed using these elements via the following sequence:
+(matrix) -> (1d input tables)  -> (multidimensional lookup table - CLUT) -> (1d output tables)
+
+Byte Position   Field Length (bytes)  Content Encoded as...
+8                  1          Number of Input Channels (i)    uInt8Number
+9                  1          Number of Output Channels (o)   uInt8Number
+10                 1          Number of CLUT grid points (identical for each side) (g) uInt8Number
+11                 1          Reserved for padding (fill with 00h)
+
+12..15             4          Encoded e00 parameter   s15Fixed16Number
+*/
+
+
+// Read 8 bit tables as gamma functions
+static
+cmsBool  Read8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels)
+{
+    cmsUInt8Number* Temp = NULL;
+    int i, j;
+    cmsToneCurve* Tables[cmsMAXCHANNELS];
+
+    if (nChannels > cmsMAXCHANNELS) return FALSE;
+    if (nChannels <= 0) return FALSE;
+
+    memset(Tables, 0, sizeof(Tables));
+
+    Temp = (cmsUInt8Number*) _cmsMalloc(ContextID, 256);
+    if (Temp == NULL) return FALSE;
+
+    for (i=0; i < nChannels; i++) {
+        Tables[i] = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL);
+        if (Tables[i] == NULL) goto Error;
+    }
+
+    for (i=0; i < nChannels; i++) {
+
+        if (io ->Read(io, Temp, 256, 1) != 1) goto Error;
+
+        for (j=0; j < 256; j++)
+            Tables[i]->Table16[j] = (cmsUInt16Number) FROM_8_TO_16(Temp[j]);
+    }
+
+    _cmsFree(ContextID, Temp);
+    Temp = NULL;
+
+    if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables)))
+        goto Error;
+
+    for (i=0; i < nChannels; i++)
+        cmsFreeToneCurve(Tables[i]);
+
+    return TRUE;
+
+Error:
+    for (i=0; i < nChannels; i++) {
+        if (Tables[i]) cmsFreeToneCurve(Tables[i]);
+    }
+
+    if (Temp) _cmsFree(ContextID, Temp);
+    return FALSE;
+}
+
+
+static
+cmsBool Write8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsUInt32Number n, _cmsStageToneCurvesData* Tables)
+{
+    int j;
+    cmsUInt32Number i;
+    cmsUInt8Number val;
+
+    for (i=0; i < n; i++) {
+
+        if (Tables) {
+
+            // Usual case of identity curves
+            if ((Tables ->TheCurves[i]->nEntries == 2) && 
+                (Tables->TheCurves[i]->Table16[0] == 0) && 
+                (Tables->TheCurves[i]->Table16[1] == 65535)) {
+
+                    for (j=0; j < 256; j++) {
+                        if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) j)) return FALSE;
+                    }
+            }
+            else 
+                if (Tables ->TheCurves[i]->nEntries != 256) {
+                    cmsSignalError(ContextID, cmsERROR_RANGE, "LUT8 needs 256 entries on prelinearization");
+                    return FALSE;                
+                }
+                else
+                    for (j=0; j < 256; j++) {
+
+                        if (Tables != NULL)
+                            val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]);
+                        else
+                            val = (cmsUInt8Number) j;
+
+                        if (!_cmsWriteUInt8Number(io, val)) return FALSE;
+                    }
+        }
+    }
+    return TRUE;
+}
+
+
+// Check overflow
+static
+cmsUInt32Number uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b)
+{
+    cmsUInt32Number rv = 1, rc;
+
+    if (a == 0) return 0;
+    if (n == 0) return 0;
+
+    for (; b > 0; b--) {
+
+        rv *= a;
+
+        // Check for overflow
+        if (rv > UINT_MAX / a) return (cmsUInt32Number) -1;
+
+    }
+
+    rc = rv * n;
+
+    if (rv != rc / n) return (cmsUInt32Number) -1;
+    return rc;
+}
+
+
+// That will create a MPE LUT with Matrix, pre tables, CLUT and post tables.
+// 8 bit lut may be scaled easely to v4 PCS, but we need also to properly adjust
+// PCS on BToAxx tags and AtoB if abstract. We need to fix input direction.
+
+static
+void *Type_LUT8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsUInt8Number InputChannels, OutputChannels, CLUTpoints;
+    cmsUInt8Number* Temp = NULL;
+    cmsPipeline* NewLUT = NULL;
+    cmsUInt32Number nTabSize, i;
+    cmsFloat64Number Matrix[3*3];
+
+    *nItems = 0;
+
+    if (!_cmsReadUInt8Number(io, &InputChannels)) goto Error;
+    if (!_cmsReadUInt8Number(io, &OutputChannels)) goto Error;
+    if (!_cmsReadUInt8Number(io, &CLUTpoints)) goto Error;
+
+     if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least
+
+    // Padding
+    if (!_cmsReadUInt8Number(io, NULL)) goto Error;
+
+    // Do some checking
+    if (InputChannels > cmsMAXCHANNELS)  goto Error;
+    if (OutputChannels > cmsMAXCHANNELS) goto Error;
+
+   // Allocates an empty Pipeline
+    NewLUT = cmsPipelineAlloc(self ->ContextID, InputChannels, OutputChannels);
+    if (NewLUT == NULL) goto Error;
+
+    // Read the Matrix
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[0])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[1])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[2])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[3])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[4])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[5])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[6])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[7])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[8])) goto Error;
+
+
+    // Only operates if not identity...
+    if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) {
+
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_BEGIN, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL)))
+            goto Error;
+    }
+
+    // Get input tables
+    if (!Read8bitTables(self ->ContextID, io,  NewLUT, InputChannels)) goto Error;
+
+    // Get 3D CLUT. Check the overflow....
+    nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels);
+    if (nTabSize == (cmsUInt32Number) -1) goto Error;
+    if (nTabSize > 0) {
+
+        cmsUInt16Number *PtrW, *T;
+       
+        PtrW = T  = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number));
+        if (T  == NULL) goto Error;
+
+        Temp = (cmsUInt8Number*) _cmsMalloc(self ->ContextID, nTabSize);
+        if (Temp == NULL) {
+            _cmsFree(self ->ContextID, T);
+            goto Error;
+        }
+
+        if (io ->Read(io, Temp, nTabSize, 1) != 1) {
+            _cmsFree(self ->ContextID, T);
+            _cmsFree(self ->ContextID, Temp);
+            goto Error;
+        }
+
+        for (i = 0; i < nTabSize; i++) {
+
+            *PtrW++ = FROM_8_TO_16(Temp[i]);
+        }
+        _cmsFree(self ->ContextID, Temp);
+        Temp = NULL;
+
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T)))
+            goto Error;
+        _cmsFree(self ->ContextID, T);
+    }
+
+
+    // Get output tables
+    if (!Read8bitTables(self ->ContextID, io,  NewLUT, OutputChannels)) goto Error;
+
+    *nItems = 1;
+    return NewLUT;
+
+Error:
+    if (NewLUT != NULL) cmsPipelineFree(NewLUT);
+    return NULL;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+// We only allow a specific MPE structure: Matrix plus prelin, plus clut, plus post-lin.
+static
+cmsBool  Type_LUT8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsUInt32Number j, nTabSize;
+    cmsUInt8Number  val;
+    cmsPipeline* NewLUT = (cmsPipeline*) Ptr;
+    cmsStage* mpe;
+    _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL;
+    _cmsStageMatrixData* MatMPE = NULL;
+    _cmsStageCLutData* clut = NULL;
+    int clutPoints;
+
+    // Disassemble the LUT into components.
+    mpe = NewLUT -> Elements;
+    if (mpe ->Type == cmsSigMatrixElemType) {
+
+        MatMPE = (_cmsStageMatrixData*) mpe ->Data;
+        mpe = mpe -> Next;
+    }
+
+    if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) {
+        PreMPE = (_cmsStageToneCurvesData*) mpe ->Data;
+        mpe = mpe -> Next;
+    }
+
+    if (mpe != NULL && mpe ->Type == cmsSigCLutElemType) {
+        clut  = (_cmsStageCLutData*) mpe -> Data;
+        mpe = mpe ->Next;
+    }
+
+    if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) {
+        PostMPE = (_cmsStageToneCurvesData*) mpe ->Data;
+        mpe = mpe -> Next;
+    }
+
+    // That should be all
+    if (mpe != NULL) {
+        cmsSignalError(mpe->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT is not suitable to be saved as LUT8");
+        return FALSE;
+    }
+
+
+    if (clut == NULL)
+        clutPoints = 0;
+    else
+        clutPoints    = clut->Params->nSamples[0];
+
+    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) NewLUT ->InputChannels)) return FALSE;
+    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) NewLUT ->OutputChannels)) return FALSE;
+    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE;
+    if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding
+
+
+    if (MatMPE != NULL) {
+
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[0])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[1])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[2])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[3])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[4])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[5])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[6])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[7])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[8])) return FALSE;
+
+    }
+    else {
+
+        if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;
+    }
+
+    // The prelinearization table
+    if (!Write8bitTables(self ->ContextID, io, NewLUT ->InputChannels, PreMPE)) return FALSE;
+
+    nTabSize = uipow(NewLUT->OutputChannels, clutPoints, NewLUT ->InputChannels);
+    if (nTabSize == (cmsUInt32Number) -1) return FALSE;
+    if (nTabSize > 0) {
+
+        // The 3D CLUT.
+        if (clut != NULL) {
+
+            for (j=0; j < nTabSize; j++) {
+
+                val = (cmsUInt8Number) FROM_16_TO_8(clut ->Tab.T[j]);
+                if (!_cmsWriteUInt8Number(io, val)) return FALSE;
+            }
+        }
+    }
+
+    // The postlinearization table
+    if (!Write8bitTables(self ->ContextID, io, NewLUT ->OutputChannels, PostMPE)) return FALSE;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_LUT8_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsPipelineDup((cmsPipeline*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_LUT8_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsPipelineFree((cmsPipeline*) Ptr);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+// ********************************************************************************
+// Type cmsSigLut16Type
+// ********************************************************************************
+
+// Read 16 bit tables as gamma functions
+static
+cmsBool  Read16bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels, int nEntries)
+{
+    int i;
+    cmsToneCurve* Tables[cmsMAXCHANNELS];
+
+    // Maybe an empty table? (this is a lcms extension)
+    if (nEntries <= 0) return TRUE;
+
+    // Check for malicious profiles
+    if (nEntries < 2) return FALSE;
+    if (nChannels > cmsMAXCHANNELS) return FALSE;
+
+    // Init table to zero
+    memset(Tables, 0, sizeof(Tables));
+
+    for (i=0; i < nChannels; i++) {
+
+        Tables[i] = cmsBuildTabulatedToneCurve16(ContextID, nEntries, NULL);
+        if (Tables[i] == NULL) goto Error;
+
+        if (!_cmsReadUInt16Array(io, nEntries, Tables[i]->Table16)) goto Error;
+    }
+
+
+    // Add the table (which may certainly be an identity, but this is up to the optimizer, not the reading code)
+    if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables)))
+        goto Error;
+
+    for (i=0; i < nChannels; i++)
+        cmsFreeToneCurve(Tables[i]);
+
+    return TRUE;
+
+Error:
+    for (i=0; i < nChannels; i++) {
+        if (Tables[i]) cmsFreeToneCurve(Tables[i]);
+    }
+
+    return FALSE;
+}
+
+static
+cmsBool Write16bitTables(cmsContext ContextID, cmsIOHANDLER* io, _cmsStageToneCurvesData* Tables)
+{
+    int j;
+    cmsUInt32Number i;
+    cmsUInt16Number val;
+    int nEntries;
+
+    _cmsAssert(Tables != NULL);
+
+    nEntries = Tables->TheCurves[0]->nEntries;
+
+    for (i=0; i < Tables ->nCurves; i++) {
+
+        for (j=0; j < nEntries; j++) {
+
+            val = Tables->TheCurves[i]->Table16[j];        
+            if (!_cmsWriteUInt16Number(io, val)) return FALSE;
+        }
+    }
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(ContextID);
+}
+
+static
+void *Type_LUT16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsUInt8Number InputChannels, OutputChannels, CLUTpoints;
+    cmsPipeline* NewLUT = NULL;
+    cmsUInt32Number nTabSize;
+    cmsFloat64Number Matrix[3*3];
+    cmsUInt16Number InputEntries, OutputEntries;
+
+    *nItems = 0;
+
+    if (!_cmsReadUInt8Number(io, &InputChannels)) return NULL;
+    if (!_cmsReadUInt8Number(io, &OutputChannels)) return NULL;
+    if (!_cmsReadUInt8Number(io, &CLUTpoints)) return NULL;   // 255 maximum
+
+    // Padding
+    if (!_cmsReadUInt8Number(io, NULL)) return NULL;
+
+    // Do some checking
+    if (InputChannels > cmsMAXCHANNELS)  goto Error;
+    if (OutputChannels > cmsMAXCHANNELS) goto Error;
+
+    // Allocates an empty LUT
+    NewLUT = cmsPipelineAlloc(self ->ContextID, InputChannels, OutputChannels);
+    if (NewLUT == NULL) goto Error;
+
+    // Read the Matrix
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[0])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[1])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[2])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[3])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[4])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[5])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[6])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[7])) goto Error;
+    if (!_cmsRead15Fixed16Number(io,  &Matrix[8])) goto Error;
+
+
+    // Only operates on 3 channels
+    if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) {
+
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL)))
+            goto Error;
+    }
+
+    if (!_cmsReadUInt16Number(io, &InputEntries)) goto Error;
+    if (!_cmsReadUInt16Number(io, &OutputEntries)) goto Error;
+
+    if (InputEntries > 0x7FFF || OutputEntries > 0x7FFF) goto Error;
+    if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least
+
+    // Get input tables
+    if (!Read16bitTables(self ->ContextID, io,  NewLUT, InputChannels, InputEntries)) goto Error;
+
+    // Get 3D CLUT
+    nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels);
+    if (nTabSize == (cmsUInt32Number) -1) goto Error;
+    if (nTabSize > 0) {
+
+        cmsUInt16Number *T;
+
+        T  = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number));
+        if (T  == NULL) goto Error;
+
+        if (!_cmsReadUInt16Array(io, nTabSize, T)) {
+            _cmsFree(self ->ContextID, T);
+            goto Error;
+        }
+
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T))) {
+            _cmsFree(self ->ContextID, T);
+            goto Error;
+        }
+        _cmsFree(self ->ContextID, T);
+    }
+
+
+    // Get output tables
+    if (!Read16bitTables(self ->ContextID, io,  NewLUT, OutputChannels, OutputEntries)) goto Error;
+
+    *nItems = 1;
+    return NewLUT;
+
+Error:
+    if (NewLUT != NULL) cmsPipelineFree(NewLUT);
+    return NULL;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+// We only allow some specific MPE structures: Matrix plus prelin, plus clut, plus post-lin.
+// Some empty defaults are created for missing parts
+
+static
+cmsBool  Type_LUT16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsUInt32Number nTabSize;
+    cmsPipeline* NewLUT = (cmsPipeline*) Ptr;
+    cmsStage* mpe;
+    _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL;
+    _cmsStageMatrixData* MatMPE = NULL;
+    _cmsStageCLutData* clut = NULL;
+    int i, InputChannels, OutputChannels, clutPoints;
+
+    // Disassemble the LUT into components.
+    mpe = NewLUT -> Elements;
+    if (mpe != NULL && mpe ->Type == cmsSigMatrixElemType) {
+
+        MatMPE = (_cmsStageMatrixData*) mpe ->Data;
+        mpe = mpe -> Next;
+    }
+
+
+    if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) {
+        PreMPE = (_cmsStageToneCurvesData*) mpe ->Data;
+        mpe = mpe -> Next;
+    }
+
+    if (mpe != NULL && mpe ->Type == cmsSigCLutElemType) {
+        clut  = (_cmsStageCLutData*) mpe -> Data;
+        mpe = mpe ->Next;
+    }
+
+    if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) {
+        PostMPE = (_cmsStageToneCurvesData*) mpe ->Data;
+        mpe = mpe -> Next;
+    }
+
+    // That should be all
+    if (mpe != NULL) {
+        cmsSignalError(mpe->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT is not suitable to be saved as LUT16");
+        return FALSE;
+    }
+
+    InputChannels  = cmsPipelineInputChannels(NewLUT);
+    OutputChannels = cmsPipelineOutputChannels(NewLUT);
+
+    if (clut == NULL)
+        clutPoints = 0;
+    else
+        clutPoints    = clut->Params->nSamples[0];
+
+    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) InputChannels)) return FALSE;
+    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) OutputChannels)) return FALSE;
+    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE;
+    if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding
+
+
+    if (MatMPE != NULL) {
+
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[0])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[1])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[2])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[3])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[4])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[5])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[6])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[7])) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[8])) return FALSE;
+    }
+    else {
+
+        if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;
+    }
+
+
+    if (PreMPE != NULL) {
+        if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PreMPE ->TheCurves[0]->nEntries)) return FALSE;
+    } else {
+            if (!_cmsWriteUInt16Number(io, 2)) return FALSE;
+    }
+
+    if (PostMPE != NULL) {
+        if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PostMPE ->TheCurves[0]->nEntries)) return FALSE;
+    } else {
+        if (!_cmsWriteUInt16Number(io, 2)) return FALSE;
+
+    }
+
+    // The prelinearization table
+
+    if (PreMPE != NULL) {
+        if (!Write16bitTables(self ->ContextID, io, PreMPE)) return FALSE;
+    }
+    else {
+        for (i=0; i < InputChannels; i++) {
+
+            if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
+            if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE;
+        }
+    }
+
+    nTabSize = uipow(OutputChannels, clutPoints, InputChannels);
+    if (nTabSize == (cmsUInt32Number) -1) return FALSE;
+    if (nTabSize > 0) {
+        // The 3D CLUT.
+        if (clut != NULL) {
+            if (!_cmsWriteUInt16Array(io, nTabSize, clut->Tab.T)) return FALSE;
+        }
+    }
+
+    // The postlinearization table
+    if (PostMPE != NULL) {
+        if (!Write16bitTables(self ->ContextID, io, PostMPE)) return FALSE;
+    }
+    else {
+        for (i=0; i < OutputChannels; i++) {
+
+            if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
+            if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE;
+        }
+    }
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+static
+void* Type_LUT16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsPipelineDup((cmsPipeline*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_LUT16_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsPipelineFree((cmsPipeline*) Ptr);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigLutAToBType
+// ********************************************************************************
+
+
+// V4 stuff. Read matrix for LutAtoB and LutBtoA
+
+static
+cmsStage* ReadMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset)
+{
+    cmsFloat64Number dMat[3*3];
+    cmsFloat64Number dOff[3];
+    cmsStage* Mat;
+
+    // Go to address
+    if (!io -> Seek(io, Offset)) return NULL;
+
+    // Read the Matrix
+    if (!_cmsRead15Fixed16Number(io, &dMat[0])) return NULL;
+    if (!_cmsRead15Fixed16Number(io, &dMat[1])) return NULL;
+    if (!_cmsRead15Fixed16Number(io, &dMat[2])) return NULL;
+    if (!_cmsRead15Fixed16Number(io, &dMat[3])) return NULL;
+    if (!_cmsRead15Fixed16Number(io, &dMat[4])) return NULL;
+    if (!_cmsRead15Fixed16Number(io, &dMat[5])) return NULL;
+    if (!_cmsRead15Fixed16Number(io, &dMat[6])) return NULL;
+    if (!_cmsRead15Fixed16Number(io, &dMat[7])) return NULL;
+    if (!_cmsRead15Fixed16Number(io, &dMat[8])) return NULL;
+
+    if (!_cmsRead15Fixed16Number(io, &dOff[0])) return NULL;
+    if (!_cmsRead15Fixed16Number(io, &dOff[1])) return NULL;
+    if (!_cmsRead15Fixed16Number(io, &dOff[2])) return NULL;
+
+    Mat = cmsStageAllocMatrix(self ->ContextID, 3, 3, dMat, dOff);
+
+     return Mat;
+}
+
+
+
+
+//  V4 stuff. Read CLUT part for LutAtoB and LutBtoA
+
+static
+cmsStage* ReadCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, int InputChannels, int OutputChannels)
+{
+    cmsUInt8Number  gridPoints8[cmsMAXCHANNELS]; // Number of grid points in each dimension.
+    cmsUInt32Number GridPoints[cmsMAXCHANNELS], i;
+    cmsUInt8Number  Precision;
+    cmsStage* CLUT;
+    _cmsStageCLutData* Data;
+
+    if (!io -> Seek(io, Offset)) return NULL;
+    if (io -> Read(io, gridPoints8, cmsMAXCHANNELS, 1) != 1) return NULL;
+
+
+    for (i=0; i < cmsMAXCHANNELS; i++) {
+
+        if (gridPoints8[i] == 1) return NULL; // Impossible value, 0 for no CLUT and then 2 at least
+        GridPoints[i] = gridPoints8[i];
+    }
+
+    if (!_cmsReadUInt8Number(io, &Precision)) return NULL;
+
+    if (!_cmsReadUInt8Number(io, NULL)) return NULL;
+    if (!_cmsReadUInt8Number(io, NULL)) return NULL;
+    if (!_cmsReadUInt8Number(io, NULL)) return NULL;
+
+    CLUT = cmsStageAllocCLut16bitGranular(self ->ContextID, GridPoints, InputChannels, OutputChannels, NULL);
+    if (CLUT == NULL) return NULL;
+
+    Data = (_cmsStageCLutData*) CLUT ->Data;
+
+    // Precision can be 1 or 2 bytes
+    if (Precision == 1) {
+
+        cmsUInt8Number  v;
+
+        for (i=0; i < Data ->nEntries; i++) {
+
+            if (io ->Read(io, &v, sizeof(cmsUInt8Number), 1) != 1) return NULL;
+            Data ->Tab.T[i] = FROM_8_TO_16(v);
+        }
+
+    }
+    else
+        if (Precision == 2) {
+
+            if (!_cmsReadUInt16Array(io, Data->nEntries, Data ->Tab.T)) {
+                cmsStageFree(CLUT);
+                return NULL;
+            }
+        }
+        else {
+            cmsStageFree(CLUT);
+            cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown precision of '%d'", Precision);
+            return NULL;
+        }
+
+        return CLUT;
+}
+
+static
+cmsToneCurve* ReadEmbeddedCurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io)
+{
+    cmsTagTypeSignature  BaseType;
+    cmsUInt32Number nItems;
+
+    BaseType = _cmsReadTypeBase(io);
+    switch (BaseType) {
+
+            case cmsSigCurveType:
+                return (cmsToneCurve*) Type_Curve_Read(self, io, &nItems, 0);
+
+            case cmsSigParametricCurveType:
+                return (cmsToneCurve*) Type_ParametricCurve_Read(self, io, &nItems, 0);
+
+            default:
+                {
+                    char String[5];
+
+                    _cmsTagSignature2String(String, (cmsTagSignature) BaseType);
+                    cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve type '%s'", String);
+                }
+                return NULL;
+    }
+}
+
+
+// Read a set of curves from specific offset
+static
+cmsStage* ReadSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, cmsUInt32Number nCurves)
+{
+    cmsToneCurve* Curves[cmsMAXCHANNELS];
+    cmsUInt32Number i;
+    cmsStage* Lin = NULL;
+
+    if (nCurves > cmsMAXCHANNELS) return FALSE;
+
+    if (!io -> Seek(io, Offset)) return FALSE;
+
+    for (i=0; i < nCurves; i++)
+        Curves[i] = NULL;
+
+    for (i=0; i < nCurves; i++) {
+
+        Curves[i] = ReadEmbeddedCurve(self, io);
+        if (Curves[i] == NULL) goto Error;
+        if (!_cmsReadAlignment(io)) goto Error;
+
+    }
+
+    Lin = cmsStageAllocToneCurves(self ->ContextID, nCurves, Curves);
+
+Error:
+    for (i=0; i < nCurves; i++)
+        cmsFreeToneCurve(Curves[i]);
+
+    return Lin;
+}
+
+
+// LutAtoB type
+
+// This structure represents a colour transform. The type contains up to five processing
+// elements which are stored in the AtoBTag tag in the following order: a set of one
+// dimensional curves, a 3 by 3 matrix with offset terms, a set of one dimensional curves,
+// a multidimensional lookup table, and a set of one dimensional output curves.
+// Data are processed using these elements via the following sequence:
+//
+//("A" curves) -> (multidimensional lookup table - CLUT) -> ("M" curves) -> (matrix) -> ("B" curves).
+//
+/*
+It is possible to use any or all of these processing elements. At least one processing element
+must be included.Only the following combinations are allowed:
+
+B
+M - Matrix - B
+A - CLUT - B
+A - CLUT - M - Matrix - B
+
+*/
+
+static
+void* Type_LUTA2B_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsUInt32Number      BaseOffset;
+    cmsUInt8Number       inputChan;      // Number of input channels
+    cmsUInt8Number       outputChan;     // Number of output channels
+    cmsUInt32Number      offsetB;        // Offset to first "B" curve
+    cmsUInt32Number      offsetMat;      // Offset to matrix
+    cmsUInt32Number      offsetM;        // Offset to first "M" curve
+    cmsUInt32Number      offsetC;        // Offset to CLUT
+    cmsUInt32Number      offsetA;        // Offset to first "A" curve
+    cmsPipeline* NewLUT = NULL;
+
+
+    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+    if (!_cmsReadUInt8Number(io, &inputChan)) return NULL;
+    if (!_cmsReadUInt8Number(io, &outputChan)) return NULL;
+
+    if (!_cmsReadUInt16Number(io, NULL)) return NULL;
+
+    if (!_cmsReadUInt32Number(io, &offsetB)) return NULL;
+    if (!_cmsReadUInt32Number(io, &offsetMat)) return NULL;
+    if (!_cmsReadUInt32Number(io, &offsetM)) return NULL;
+    if (!_cmsReadUInt32Number(io, &offsetC)) return NULL;
+    if (!_cmsReadUInt32Number(io, &offsetA)) return NULL;
+
+   // Allocates an empty LUT
+    NewLUT = cmsPipelineAlloc(self ->ContextID, inputChan, outputChan);
+    if (NewLUT == NULL) return NULL;
+
+    if (offsetA!= 0) {
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan)))
+            goto Error;
+    }
+
+    if (offsetC != 0) {
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan)))
+            goto Error;
+    }
+
+    if (offsetM != 0) {
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan)))
+            goto Error;
+    }
+
+    if (offsetMat != 0) {
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat)))
+            goto Error;
+    }
+
+    if (offsetB != 0) {
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan)))
+            goto Error;
+    }
+
+    *nItems = 1;
+    return NewLUT;
+Error:
+    cmsPipelineFree(NewLUT);
+    return NULL;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+// Write a set of curves
+static
+cmsBool  WriteMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsStage* mpe)
+{
+    _cmsStageMatrixData* m = (_cmsStageMatrixData*) mpe -> Data;
+
+    // Write the Matrix
+    if (!_cmsWrite15Fixed16Number(io, m -> Double[0])) return FALSE;
+    if (!_cmsWrite15Fixed16Number(io, m -> Double[1])) return FALSE;
+    if (!_cmsWrite15Fixed16Number(io, m -> Double[2])) return FALSE;
+    if (!_cmsWrite15Fixed16Number(io, m -> Double[3])) return FALSE;
+    if (!_cmsWrite15Fixed16Number(io, m -> Double[4])) return FALSE;
+    if (!_cmsWrite15Fixed16Number(io, m -> Double[5])) return FALSE;
+    if (!_cmsWrite15Fixed16Number(io, m -> Double[6])) return FALSE;
+    if (!_cmsWrite15Fixed16Number(io, m -> Double[7])) return FALSE;
+    if (!_cmsWrite15Fixed16Number(io, m -> Double[8])) return FALSE;
+
+    if (m ->Offset != NULL) {
+
+    if (!_cmsWrite15Fixed16Number(io, m -> Offset[0])) return FALSE;
+    if (!_cmsWrite15Fixed16Number(io, m -> Offset[1])) return FALSE;
+    if (!_cmsWrite15Fixed16Number(io, m -> Offset[2])) return FALSE;
+    }
+    else {
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+
+    }
+
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+// Write a set of curves
+static
+cmsBool WriteSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsTagTypeSignature Type, cmsStage* mpe)
+{
+    cmsUInt32Number i, n;
+    cmsTagTypeSignature CurrentType;
+    cmsToneCurve** Curves;
+
+
+    n      = cmsStageOutputChannels(mpe);
+    Curves = _cmsStageGetPtrToCurveSet(mpe);
+
+    for (i=0; i < n; i++) {
+
+        // If this is a table-based curve, use curve type even on V4
+        CurrentType = Type;
+
+        if ((Curves[i] ->nSegments == 0)||
+            ((Curves[i]->nSegments == 2) && (Curves[i] ->Segments[1].Type == 0)) )
+            CurrentType = cmsSigCurveType;
+        else
+        if (Curves[i] ->Segments[0].Type < 0)
+            CurrentType = cmsSigCurveType;
+
+        if (!_cmsWriteTypeBase(io, CurrentType)) return FALSE;
+
+        switch (CurrentType) {
+
+            case cmsSigCurveType:
+                if (!Type_Curve_Write(self, io, Curves[i], 1)) return FALSE;
+                break;
+
+            case cmsSigParametricCurveType:
+                if (!Type_ParametricCurve_Write(self, io, Curves[i], 1)) return FALSE;
+                break;
+
+            default:
+                {
+                    char String[5];
+
+                    _cmsTagSignature2String(String, (cmsTagSignature) Type);
+                    cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve type '%s'", String);
+                }
+                return FALSE;
+        }
+
+        if (!_cmsWriteAlignment(io)) return FALSE;
+    }
+
+
+    return TRUE;
+}
+
+
+static
+cmsBool WriteCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt8Number  Precision, cmsStage* mpe)
+{
+    cmsUInt8Number  gridPoints[cmsMAXCHANNELS]; // Number of grid points in each dimension.
+    cmsUInt32Number i;
+    _cmsStageCLutData* CLUT = ( _cmsStageCLutData*) mpe -> Data;
+
+    if (CLUT ->HasFloatValues) {
+         cmsSignalError(self ->ContextID, cmsERROR_NOT_SUITABLE, "Cannot save floating point data, CLUT are 8 or 16 bit only");
+         return FALSE;
+    }
+
+    memset(gridPoints, 0, sizeof(gridPoints));
+    for (i=0; i < (cmsUInt32Number) CLUT ->Params ->nInputs; i++)
+        gridPoints[i] = (cmsUInt8Number) CLUT ->Params ->nSamples[i];
+
+    if (!io -> Write(io, cmsMAXCHANNELS*sizeof(cmsUInt8Number), gridPoints)) return FALSE;
+
+    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) Precision)) return FALSE;
+    if (!_cmsWriteUInt8Number(io, 0)) return FALSE;
+    if (!_cmsWriteUInt8Number(io, 0)) return FALSE;
+    if (!_cmsWriteUInt8Number(io, 0)) return FALSE;
+
+    // Precision can be 1 or 2 bytes
+    if (Precision == 1) {
+
+        for (i=0; i < CLUT->nEntries; i++) {
+
+            if (!_cmsWriteUInt8Number(io, FROM_16_TO_8(CLUT->Tab.T[i]))) return FALSE;
+        }
+    }
+    else
+        if (Precision == 2) {
+
+            if (!_cmsWriteUInt16Array(io, CLUT->nEntries, CLUT ->Tab.T)) return FALSE;
+        }
+        else {
+             cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown precision of '%d'", Precision);
+            return FALSE;
+        }
+
+        if (!_cmsWriteAlignment(io)) return FALSE;
+
+        return TRUE;
+}
+
+
+
+
+static
+cmsBool Type_LUTA2B_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsPipeline* Lut = (cmsPipeline*) Ptr;
+    int inputChan, outputChan;
+    cmsStage *A = NULL, *B = NULL, *M = NULL;
+    cmsStage * Matrix = NULL;
+    cmsStage * CLUT = NULL;
+    cmsUInt32Number offsetB = 0, offsetMat = 0, offsetM = 0, offsetC = 0, offsetA = 0;
+    cmsUInt32Number BaseOffset, DirectoryPos, CurrentPos;
+
+    // Get the base for all offsets
+    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+    if (Lut ->Elements != NULL)
+        if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCurveSetElemType, &B))
+            if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &M, &Matrix, &B))
+                if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &A, &CLUT, &B))
+                    if (!cmsPipelineCheckAndRetreiveStages(Lut, 5, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType,
+                        cmsSigMatrixElemType, cmsSigCurveSetElemType, &A, &CLUT, &M, &Matrix, &B)) {
+
+                            cmsSignalError(self->ContextID, cmsERROR_NOT_SUITABLE, "LUT is not suitable to be saved as LutAToB");
+                            return FALSE;
+                    }
+
+    // Get input, output channels
+    inputChan  = cmsPipelineInputChannels(Lut);
+    outputChan = cmsPipelineOutputChannels(Lut);
+
+    // Write channel count
+    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) inputChan)) return FALSE;
+    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) outputChan)) return FALSE;
+    if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
+
+    // Keep directory to be filled latter
+    DirectoryPos = io ->Tell(io);
+
+    // Write the directory
+    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+
+    if (A != NULL) {
+
+        offsetA = io ->Tell(io) - BaseOffset;
+        if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, A)) return FALSE;
+    }
+
+    if (CLUT != NULL) {
+        offsetC = io ->Tell(io) - BaseOffset;
+        if (!WriteCLUT(self, io, Lut ->SaveAs8Bits ? 1 : 2, CLUT)) return FALSE;
+
+    }
+    if (M != NULL) {
+
+        offsetM = io ->Tell(io) - BaseOffset;
+        if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, M)) return FALSE;
+    }
+
+    if (Matrix != NULL) {
+        offsetMat = io ->Tell(io) - BaseOffset;
+        if (!WriteMatrix(self, io, Matrix)) return FALSE;
+    }
+
+    if (B != NULL) {
+
+        offsetB = io ->Tell(io) - BaseOffset;
+        if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, B)) return FALSE;
+    }
+
+    CurrentPos = io ->Tell(io);
+
+    if (!io ->Seek(io, DirectoryPos)) return FALSE;
+
+    if (!_cmsWriteUInt32Number(io, offsetB)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, offsetMat)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, offsetM)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, offsetC)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, offsetA)) return FALSE;
+
+    if (!io ->Seek(io, CurrentPos)) return FALSE;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_LUTA2B_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsPipelineDup((cmsPipeline*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_LUTA2B_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsPipelineFree((cmsPipeline*) Ptr);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+// LutBToA type
+
+static
+void* Type_LUTB2A_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsUInt8Number       inputChan;      // Number of input channels
+    cmsUInt8Number       outputChan;     // Number of output channels
+    cmsUInt32Number      BaseOffset;     // Actual position in file
+    cmsUInt32Number      offsetB;        // Offset to first "B" curve
+    cmsUInt32Number      offsetMat;      // Offset to matrix
+    cmsUInt32Number      offsetM;        // Offset to first "M" curve
+    cmsUInt32Number      offsetC;        // Offset to CLUT
+    cmsUInt32Number      offsetA;        // Offset to first "A" curve
+    cmsPipeline* NewLUT = NULL;
+
+
+    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+    if (!_cmsReadUInt8Number(io, &inputChan)) return NULL;
+    if (!_cmsReadUInt8Number(io, &outputChan)) return NULL;
+
+    // Padding
+    if (!_cmsReadUInt16Number(io, NULL)) return NULL;
+
+    if (!_cmsReadUInt32Number(io, &offsetB)) return NULL;
+    if (!_cmsReadUInt32Number(io, &offsetMat)) return NULL;
+    if (!_cmsReadUInt32Number(io, &offsetM)) return NULL;
+    if (!_cmsReadUInt32Number(io, &offsetC)) return NULL;
+    if (!_cmsReadUInt32Number(io, &offsetA)) return NULL;
+
+    // Allocates an empty LUT
+    NewLUT = cmsPipelineAlloc(self ->ContextID, inputChan, outputChan);
+    if (NewLUT == NULL) return NULL;
+
+    if (offsetB != 0) {
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan)))
+            goto Error;
+    }
+
+    if (offsetMat != 0) {
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat)))
+            goto Error;
+    }
+
+    if (offsetM != 0) {
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan)))
+            goto Error;
+    }
+
+    if (offsetC != 0) {
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan)))
+            goto Error;
+    }
+
+    if (offsetA!= 0) {
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan)))
+            goto Error;
+    }
+
+    *nItems = 1;
+    return NewLUT;
+Error:
+    cmsPipelineFree(NewLUT);
+    return NULL;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+/*
+B
+B - Matrix - M
+B - CLUT - A
+B - Matrix - M - CLUT - A
+*/
+
+static
+cmsBool  Type_LUTB2A_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsPipeline* Lut = (cmsPipeline*) Ptr;
+    int inputChan, outputChan;
+    cmsStage *A = NULL, *B = NULL, *M = NULL;
+    cmsStage *Matrix = NULL;
+    cmsStage *CLUT = NULL;
+    cmsUInt32Number offsetB = 0, offsetMat = 0, offsetM = 0, offsetC = 0, offsetA = 0;
+    cmsUInt32Number BaseOffset, DirectoryPos, CurrentPos;
+
+
+    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+    if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCurveSetElemType, &B))
+        if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &B, &Matrix, &M))
+            if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &B, &CLUT, &A))
+                if (!cmsPipelineCheckAndRetreiveStages(Lut, 5, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType,
+                    cmsSigCLutElemType, cmsSigCurveSetElemType, &B, &Matrix, &M, &CLUT, &A)) {
+                        cmsSignalError(self->ContextID, cmsERROR_NOT_SUITABLE, "LUT is not suitable to be saved as LutBToA");
+                        return FALSE;
+                }
+
+    inputChan  = cmsPipelineInputChannels(Lut);
+    outputChan = cmsPipelineOutputChannels(Lut);
+
+    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) inputChan)) return FALSE;
+    if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) outputChan)) return FALSE;
+    if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
+
+    DirectoryPos = io ->Tell(io);
+
+    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+
+    if (A != NULL) {
+
+        offsetA = io ->Tell(io) - BaseOffset;
+        if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, A)) return FALSE;
+    }
+
+    if (CLUT != NULL) {
+        offsetC = io ->Tell(io) - BaseOffset;
+        if (!WriteCLUT(self, io, Lut ->SaveAs8Bits ? 1 : 2, CLUT)) return FALSE;
+
+    }
+    if (M != NULL) {
+
+        offsetM = io ->Tell(io) - BaseOffset;
+        if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, M)) return FALSE;
+    }
+
+    if (Matrix != NULL) {
+        offsetMat = io ->Tell(io) - BaseOffset;
+        if (!WriteMatrix(self, io, Matrix)) return FALSE;
+    }
+
+    if (B != NULL) {
+
+        offsetB = io ->Tell(io) - BaseOffset;
+        if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, B)) return FALSE;
+    }
+
+    CurrentPos = io ->Tell(io);
+
+    if (!io ->Seek(io, DirectoryPos)) return FALSE;
+
+    if (!_cmsWriteUInt32Number(io, offsetB)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, offsetMat)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, offsetM)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, offsetC)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, offsetA)) return FALSE;
+
+    if (!io ->Seek(io, CurrentPos)) return FALSE;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+
+
+static
+void* Type_LUTB2A_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsPipelineDup((cmsPipeline*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_LUTB2A_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsPipelineFree((cmsPipeline*) Ptr);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+
+// ********************************************************************************
+// Type cmsSigColorantTableType
+// ********************************************************************************
+/*
+The purpose of this tag is to identify the colorants used in the profile by a
+unique name and set of XYZ or L*a*b* values to give the colorant an unambiguous
+value. The first colorant listed is the colorant of the first device channel of
+a lut tag. The second colorant listed is the colorant of the second device channel
+of a lut tag, and so on.
+*/
+
+static
+void *Type_ColorantTable_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsUInt32Number i, Count;
+    cmsNAMEDCOLORLIST* List;
+    char Name[34];
+    cmsUInt16Number PCS[3];
+
+
+    if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+
+    if (Count > cmsMAXCHANNELS) {
+        cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many colorants '%d'", Count);
+        return NULL;
+    }
+
+    List = cmsAllocNamedColorList(self ->ContextID, Count, 0, "", "");
+    for (i=0; i < Count; i++) {
+
+        if (io ->Read(io, Name, 32, 1) != 1) goto Error;
+        Name[33] = 0;
+
+        if (!_cmsReadUInt16Array(io, 3, PCS)) goto Error;
+
+        if (!cmsAppendNamedColor(List, Name, PCS, NULL)) goto Error;
+
+    }
+
+    *nItems = 1;
+    return List;
+
+Error:
+    *nItems = 0;
+    cmsFreeNamedColorList(List);
+    return NULL;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+
+// Saves a colorant table. It is using the named color structure for simplicity sake
+static
+cmsBool  Type_ColorantTable_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) Ptr;
+    int i, nColors;
+
+    nColors = cmsNamedColorCount(NamedColorList);
+
+    if (!_cmsWriteUInt32Number(io, nColors)) return FALSE;
+
+    for (i=0; i < nColors; i++) {
+
+        char root[33];
+        cmsUInt16Number PCS[3];
+
+        if (!cmsNamedColorInfo(NamedColorList, i, root, NULL, NULL, PCS, NULL)) return 0;
+        root[32] = 0;
+
+        if (!io ->Write(io, 32, root)) return FALSE;
+        if (!_cmsWriteUInt16Array(io, 3, PCS)) return FALSE;
+    }
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_ColorantTable_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)
+{
+    cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) Ptr;
+    return (void*) cmsDupNamedColorList(nc);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void Type_ColorantTable_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsFreeNamedColorList((cmsNAMEDCOLORLIST*) Ptr);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigNamedColor2Type
+// ********************************************************************************
+//
+//The namedColor2Type is a count value and array of structures that provide color
+//coordinates for 7-bit ASCII color names. For each named color, a PCS and optional
+//device representation of the color are given. Both representations are 16-bit values.
+//The device representation corresponds to the header’s “color space of data?field.
+//This representation should be consistent with the “number of device components?//field in the namedColor2Type. If this field is 0, device coordinates are not provided.
+//The PCS representation corresponds to the headerÂ’s PCS field. The PCS representation
+//is always provided. Color names are fixed-length, 32-byte fields including null
+//termination. In order to maintain maximum portability, it is strongly recommended
+//that special characters of the 7-bit ASCII set not be used.
+
+static
+void *Type_NamedColor_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+
+    cmsUInt32Number      vendorFlag;     // Bottom 16 bits for ICC use
+    cmsUInt32Number      count;          // Count of named colors
+    cmsUInt32Number      nDeviceCoords;  // Num of device coordinates
+    char                 prefix[32];     // Prefix for each color name
+    char                 suffix[32];     // Suffix for each color name
+    cmsNAMEDCOLORLIST*  v;
+    cmsUInt32Number i;
+
+
+    *nItems = 0;
+    if (!_cmsReadUInt32Number(io, &vendorFlag)) return NULL;
+    if (!_cmsReadUInt32Number(io, &count)) return NULL;
+    if (!_cmsReadUInt32Number(io, &nDeviceCoords)) return NULL;
+
+    if (io -> Read(io, prefix, 32, 1) != 1) return NULL;
+    if (io -> Read(io, suffix, 32, 1) != 1) return NULL;
+
+    prefix[31] = suffix[31] = 0;
+
+    v = cmsAllocNamedColorList(self ->ContextID, count, nDeviceCoords, prefix, suffix);
+    if (v == NULL) {
+        cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many named colors '%d'", count);
+        return NULL;
+    }
+
+    if (nDeviceCoords > cmsMAXCHANNELS) {
+        cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many device coordinates '%d'", nDeviceCoords);
+        return 0;
+    }
+    for (i=0; i < count; i++) {
+
+        cmsUInt16Number PCS[3];
+        cmsUInt16Number Colorant[cmsMAXCHANNELS];
+        char Root[33];
+
+        memset(Colorant, 0, sizeof(Colorant));
+        if (io -> Read(io, Root, 32, 1) != 1) return NULL;
+        if (!_cmsReadUInt16Array(io, 3, PCS)) goto Error;
+        if (!_cmsReadUInt16Array(io, nDeviceCoords, Colorant)) goto Error;
+
+        if (!cmsAppendNamedColor(v, Root, PCS, Colorant)) goto Error;
+    }
+
+    *nItems = 1;
+    return (void*) v ;
+
+Error:
+    cmsFreeNamedColorList(v);
+    return NULL;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+// Saves a named color list into a named color profile
+static
+cmsBool Type_NamedColor_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) Ptr;
+    char                prefix[32];     // Prefix for each color name
+    char                suffix[32];     // Suffix for each color name
+    int i, nColors;
+
+    nColors = cmsNamedColorCount(NamedColorList);
+
+    if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, nColors)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, NamedColorList ->ColorantCount)) return FALSE;
+
+    strncpy(prefix, (const char*) NamedColorList->Prefix, 32);
+    strncpy(suffix, (const char*) NamedColorList->Suffix, 32);
+
+    suffix[31] = prefix[31] = 0;
+
+    if (!io ->Write(io, 32, prefix)) return FALSE;
+    if (!io ->Write(io, 32, suffix)) return FALSE;
+
+    for (i=0; i < nColors; i++) {
+
+       cmsUInt16Number PCS[3];
+       cmsUInt16Number Colorant[cmsMAXCHANNELS];
+       char Root[33];
+
+        if (!cmsNamedColorInfo(NamedColorList, i, Root, NULL, NULL, PCS, Colorant)) return 0;
+        if (!io ->Write(io, 32 , Root)) return FALSE;
+        if (!_cmsWriteUInt16Array(io, 3, PCS)) return FALSE;
+        if (!_cmsWriteUInt16Array(io, NamedColorList ->ColorantCount, Colorant)) return FALSE;
+    }
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_NamedColor_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)
+{
+    cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) Ptr;
+
+    return (void*) cmsDupNamedColorList(nc);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void Type_NamedColor_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsFreeNamedColorList((cmsNAMEDCOLORLIST*) Ptr);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigProfileSequenceDescType
+// ********************************************************************************
+
+// This type is an array of structures, each of which contains information from the
+// header fields and tags from the original profiles which were combined to create
+// the final profile. The order of the structures is the order in which the profiles
+// were combined and includes a structure for the final profile. This provides a
+// description of the profile sequence from source to destination,
+// typically used with the DeviceLink profile.
+
+static
+cmsBool ReadEmbeddedText(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU** mlu, cmsUInt32Number SizeOfTag)
+{
+    cmsTagTypeSignature  BaseType;
+    cmsUInt32Number nItems;
+
+    BaseType = _cmsReadTypeBase(io);
+
+    switch (BaseType) {
+
+       case cmsSigTextType:
+           if (*mlu) cmsMLUfree(*mlu);
+           *mlu = (cmsMLU*)Type_Text_Read(self, io, &nItems, SizeOfTag);
+           return (*mlu != NULL);
+
+       case cmsSigTextDescriptionType:
+           if (*mlu) cmsMLUfree(*mlu);
+           *mlu =  (cmsMLU*) Type_Text_Description_Read(self, io, &nItems, SizeOfTag);
+           return (*mlu != NULL);
+
+           /*
+           TBD: Size is needed for MLU, and we have no idea on which is the available size
+           */
+
+       case cmsSigMultiLocalizedUnicodeType:
+           if (*mlu) cmsMLUfree(*mlu);
+           *mlu =  (cmsMLU*) Type_MLU_Read(self, io, &nItems, SizeOfTag);
+           return (*mlu != NULL);
+
+       default: return FALSE;
+    }
+}
+
+
+static
+void *Type_ProfileSequenceDesc_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsSEQ* OutSeq;
+    cmsUInt32Number i, Count;
+
+    *nItems = 0;
+
+    if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+
+    if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;
+    SizeOfTag -= sizeof(cmsUInt32Number);
+
+
+    OutSeq = cmsAllocProfileSequenceDescription(self ->ContextID, Count);
+    if (OutSeq == NULL) return NULL;
+
+    OutSeq ->n = Count;
+
+    // Get structures as well
+
+    for (i=0; i < Count; i++) {
+
+        cmsPSEQDESC* sec = &OutSeq -> seq[i];
+
+        if (!_cmsReadUInt32Number(io, &sec ->deviceMfg)) goto Error;
+        if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error;
+        SizeOfTag -= sizeof(cmsUInt32Number);
+
+        if (!_cmsReadUInt32Number(io, &sec ->deviceModel)) goto Error;
+        if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error;
+        SizeOfTag -= sizeof(cmsUInt32Number);
+
+        if (!_cmsReadUInt64Number(io, &sec ->attributes)) goto Error;
+        if (SizeOfTag < sizeof(cmsUInt64Number)) goto Error;
+        SizeOfTag -= sizeof(cmsUInt64Number);
+
+        if (!_cmsReadUInt32Number(io, (cmsUInt32Number *)&sec ->technology)) goto Error;
+        if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error;
+        SizeOfTag -= sizeof(cmsUInt32Number);
+
+        if (!ReadEmbeddedText(self, io, &sec ->Manufacturer, SizeOfTag)) goto Error;
+        if (!ReadEmbeddedText(self, io, &sec ->Model, SizeOfTag)) goto Error;
+    }
+
+    *nItems = 1;
+    return OutSeq;
+
+Error:
+    cmsFreeProfileSequenceDescription(OutSeq);
+    return NULL;
+}
+
+
+// Aux--Embed a text description type. It can be of type text description or multilocalized unicode
+// and it depends of the version number passed on cmsTagDescriptor structure instead of stack
+static
+cmsBool  SaveDescription(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* Text)
+{
+    if (self ->ICCVersion < 0x4000000) {
+
+        if (!_cmsWriteTypeBase(io, cmsSigTextDescriptionType)) return FALSE;
+        return Type_Text_Description_Write(self, io, Text, 1);
+    }
+    else {
+        if (!_cmsWriteTypeBase(io, cmsSigMultiLocalizedUnicodeType)) return FALSE;
+        return Type_MLU_Write(self, io, Text, 1);
+    }
+}
+
+
+static
+cmsBool  Type_ProfileSequenceDesc_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsSEQ* Seq = (cmsSEQ*) Ptr;
+    cmsUInt32Number i;
+
+    if (!_cmsWriteUInt32Number(io, Seq->n)) return FALSE;
+
+    for (i=0; i < Seq ->n; i++) {
+
+        cmsPSEQDESC* sec = &Seq -> seq[i];
+
+        if (!_cmsWriteUInt32Number(io, sec ->deviceMfg)) return FALSE;
+        if (!_cmsWriteUInt32Number(io, sec ->deviceModel)) return FALSE;
+        if (!_cmsWriteUInt64Number(io, &sec ->attributes)) return FALSE;
+        if (!_cmsWriteUInt32Number(io, sec ->technology)) return FALSE;
+
+        if (!SaveDescription(self, io, sec ->Manufacturer)) return FALSE;
+        if (!SaveDescription(self, io, sec ->Model)) return FALSE;
+    }
+
+     return TRUE;
+
+     cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_ProfileSequenceDesc_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsDupProfileSequenceDescription((cmsSEQ*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_ProfileSequenceDesc_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsFreeProfileSequenceDescription((cmsSEQ*) Ptr);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigProfileSequenceIdType
+// ********************************************************************************
+/*
+In certain workflows using ICC Device Link Profiles, it is necessary to identify the
+original profiles that were combined to create the Device Link Profile.
+This type is an array of structures, each of which contains information for
+identification of a profile used in a sequence
+*/
+
+
+static
+cmsBool ReadSeqID(struct _cms_typehandler_struct* self,
+                                             cmsIOHANDLER* io,
+                                             void* Cargo,
+                                             cmsUInt32Number n,
+                                             cmsUInt32Number SizeOfTag)
+{
+    cmsSEQ* OutSeq = (cmsSEQ*) Cargo;
+    cmsPSEQDESC* seq = &OutSeq ->seq[n];
+
+    if (io -> Read(io, seq ->ProfileID.ID8, 16, 1) != 1) return FALSE;
+    if (!ReadEmbeddedText(self, io, &seq ->Description, SizeOfTag)) return FALSE;
+
+    return TRUE;
+}
+
+
+
+static
+void *Type_ProfileSequenceId_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsSEQ* OutSeq;
+    cmsUInt32Number Count;
+    cmsUInt32Number BaseOffset;
+
+    *nItems = 0;
+
+    // Get actual position as a basis for element offsets
+    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+    // Get table count
+    if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+    SizeOfTag -= sizeof(cmsUInt32Number);
+
+    // Allocate an empty structure
+    OutSeq = cmsAllocProfileSequenceDescription(self ->ContextID, Count);
+    if (OutSeq == NULL) return NULL;
+
+
+    // Read the position table
+    if (!ReadPositionTable(self, io, Count, BaseOffset, OutSeq, ReadSeqID)) {
+
+        cmsFreeProfileSequenceDescription(OutSeq);
+        return NULL;
+    }
+
+    // Success
+    *nItems = 1;
+    return OutSeq;
+
+}
+
+
+static
+cmsBool WriteSeqID(struct _cms_typehandler_struct* self,
+                                             cmsIOHANDLER* io,
+                                             void* Cargo,
+                                             cmsUInt32Number n,
+                                             cmsUInt32Number SizeOfTag)
+{
+    cmsSEQ* Seq = (cmsSEQ*) Cargo;
+
+    if (!io ->Write(io, 16, Seq ->seq[n].ProfileID.ID8)) return FALSE;
+
+    // Store here the MLU
+    if (!SaveDescription(self, io, Seq ->seq[n].Description)) return FALSE;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+cmsBool  Type_ProfileSequenceId_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsSEQ* Seq = (cmsSEQ*) Ptr;
+    cmsUInt32Number BaseOffset;
+
+    // Keep the base offset
+    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+    // This is the table count
+    if (!_cmsWriteUInt32Number(io, Seq ->n)) return FALSE;
+
+    // This is the position table and content
+    if (!WritePositionTable(self, io, 0, Seq ->n, BaseOffset, Seq, WriteSeqID)) return FALSE;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+static
+void* Type_ProfileSequenceId_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsDupProfileSequenceDescription((cmsSEQ*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_ProfileSequenceId_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsFreeProfileSequenceDescription((cmsSEQ*) Ptr);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigUcrBgType
+// ********************************************************************************
+/*
+This type contains curves representing the under color removal and black
+generation and a text string which is a general description of the method used
+for the ucr/bg.
+*/
+
+static
+void *Type_UcrBg_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsUcrBg* n = (cmsUcrBg*) _cmsMallocZero(self ->ContextID, sizeof(cmsUcrBg));
+    cmsUInt32Number CountUcr, CountBg;
+    char* ASCIIString;
+
+    *nItems = 0;
+    if (n == NULL) return NULL;
+
+    // First curve is Under color removal
+    if (!_cmsReadUInt32Number(io, &CountUcr)) return NULL;
+    if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;
+    SizeOfTag -= sizeof(cmsUInt32Number);
+
+    n ->Ucr = cmsBuildTabulatedToneCurve16(self ->ContextID, CountUcr, NULL);
+    if (n ->Ucr == NULL) return NULL;
+
+    if (!_cmsReadUInt16Array(io, CountUcr, n ->Ucr->Table16)) return NULL;
+    if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;
+    SizeOfTag -= CountUcr * sizeof(cmsUInt16Number);
+
+    // Second curve is Black generation
+    if (!_cmsReadUInt32Number(io, &CountBg)) return NULL;
+    if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;
+    SizeOfTag -= sizeof(cmsUInt32Number);
+
+    n ->Bg = cmsBuildTabulatedToneCurve16(self ->ContextID, CountBg, NULL);
+    if (n ->Bg == NULL) return NULL;
+    if (!_cmsReadUInt16Array(io, CountBg, n ->Bg->Table16)) return NULL;
+    if (SizeOfTag < CountBg * sizeof(cmsUInt16Number)) return NULL;
+    SizeOfTag -= CountBg * sizeof(cmsUInt16Number);
+    if (SizeOfTag == UINT_MAX) return NULL;
+
+    // Now comes the text. The length is specified by the tag size
+    n ->Desc = cmsMLUalloc(self ->ContextID, 1);
+    if (n ->Desc == NULL) return NULL;
+
+    ASCIIString = (char*) _cmsMalloc(self ->ContextID, SizeOfTag + 1);
+    if (io ->Read(io, ASCIIString, sizeof(char), SizeOfTag) != SizeOfTag) return NULL;
+    ASCIIString[SizeOfTag] = 0;
+    cmsMLUsetASCII(n ->Desc, cmsNoLanguage, cmsNoCountry, ASCIIString);
+    _cmsFree(self ->ContextID, ASCIIString);
+
+    *nItems = 1;
+    return (void*) n;
+}
+
+static
+cmsBool  Type_UcrBg_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsUcrBg* Value = (cmsUcrBg*) Ptr;
+    cmsUInt32Number TextSize;
+    char* Text;
+
+    // First curve is Under color removal
+    if (!_cmsWriteUInt32Number(io, Value ->Ucr ->nEntries)) return FALSE;
+    if (!_cmsWriteUInt16Array(io, Value ->Ucr ->nEntries, Value ->Ucr ->Table16)) return FALSE;
+
+    // Then black generation
+    if (!_cmsWriteUInt32Number(io, Value ->Bg ->nEntries)) return FALSE;
+    if (!_cmsWriteUInt16Array(io, Value ->Bg ->nEntries, Value ->Bg ->Table16)) return FALSE;
+
+    // Now comes the text. The length is specified by the tag size
+    TextSize = cmsMLUgetASCII(Value ->Desc, cmsNoLanguage, cmsNoCountry, NULL, 0);
+    Text     = (char*) _cmsMalloc(self ->ContextID, TextSize);
+    if (cmsMLUgetASCII(Value ->Desc, cmsNoLanguage, cmsNoCountry, Text, TextSize) != TextSize) return FALSE;
+
+    if (!io ->Write(io, TextSize, Text)) return FALSE;
+    _cmsFree(self ->ContextID, Text);
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+static
+void* Type_UcrBg_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    cmsUcrBg* Src = (cmsUcrBg*) Ptr;
+    cmsUcrBg* NewUcrBg = (cmsUcrBg*) _cmsMallocZero(self ->ContextID, sizeof(cmsUcrBg));
+
+    if (NewUcrBg == NULL) return NULL;
+
+    NewUcrBg ->Bg   = cmsDupToneCurve(Src ->Bg);
+    NewUcrBg ->Ucr  = cmsDupToneCurve(Src ->Ucr);
+    NewUcrBg ->Desc = cmsMLUdup(Src ->Desc);
+
+    return (void*) NewUcrBg;
+
+    cmsUNUSED_PARAMETER(n);
+}
+
+static
+void Type_UcrBg_Free(struct _cms_typehandler_struct* self, void *Ptr)
+{
+   cmsUcrBg* Src = (cmsUcrBg*) Ptr;
+
+   if (Src ->Ucr) cmsFreeToneCurve(Src ->Ucr);
+   if (Src ->Bg)  cmsFreeToneCurve(Src ->Bg);
+   if (Src ->Desc) cmsMLUfree(Src ->Desc);
+
+   _cmsFree(self ->ContextID, Ptr);
+}
+
+// ********************************************************************************
+// Type cmsSigCrdInfoType
+// ********************************************************************************
+
+/*
+This type contains the PostScript product name to which this profile corresponds
+and the names of the companion CRDs. Recall that a single profile can generate
+multiple CRDs. It is implemented as a MLU being the language code "PS" and then
+country varies for each element:
+
+                nm: PostScript product name
+                #0: Rendering intent 0 CRD name
+                #1: Rendering intent 1 CRD name
+                #2: Rendering intent 2 CRD name
+                #3: Rendering intent 3 CRD name
+*/
+
+
+
+// Auxiliar, read an string specified as count + string
+static
+cmsBool  ReadCountAndSting(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, cmsUInt32Number* SizeOfTag, const char* Section)
+{
+    cmsUInt32Number Count;
+    char* Text;
+
+    if (*SizeOfTag < sizeof(cmsUInt32Number)) return FALSE;
+
+    if (!_cmsReadUInt32Number(io, &Count)) return FALSE;
+
+    if (Count > UINT_MAX - sizeof(cmsUInt32Number)) return FALSE;
+    if (*SizeOfTag < Count + sizeof(cmsUInt32Number)) return FALSE;
+
+    Text     = (char*) _cmsMalloc(self ->ContextID, Count+1);
+    if (Text == NULL) return FALSE;
+
+    if (io ->Read(io, Text, sizeof(cmsUInt8Number), Count) != Count) {
+        _cmsFree(self ->ContextID, Text);
+        return FALSE;
+    }
+
+    Text[Count] = 0;
+
+    cmsMLUsetASCII(mlu, "PS", Section, Text);
+    _cmsFree(self ->ContextID, Text);
+
+    *SizeOfTag -= (Count + sizeof(cmsUInt32Number));
+    return TRUE;
+}
+
+static
+cmsBool  WriteCountAndSting(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, const char* Section)
+{
+ cmsUInt32Number TextSize;
+ char* Text;
+
+    TextSize = cmsMLUgetASCII(mlu, "PS", Section, NULL, 0);
+    Text     = (char*) _cmsMalloc(self ->ContextID, TextSize);
+
+    if (!_cmsWriteUInt32Number(io, TextSize)) return FALSE;
+
+    if (cmsMLUgetASCII(mlu, "PS", Section, Text, TextSize) == 0) return FALSE;
+
+    if (!io ->Write(io, TextSize, Text)) return FALSE;
+    _cmsFree(self ->ContextID, Text);
+
+    return TRUE;
+}
+
+static
+void *Type_CrdInfo_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsMLU* mlu = cmsMLUalloc(self ->ContextID, 5);
+
+    *nItems = 0;
+    if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "nm")) goto Error;
+    if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "#0")) goto Error;
+    if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "#1")) goto Error;
+    if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "#2")) goto Error;
+    if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "#3")) goto Error;
+
+    *nItems = 1;
+    return (void*) mlu;
+
+Error:
+    cmsMLUfree(mlu);
+    return NULL;
+
+}
+
+static
+cmsBool  Type_CrdInfo_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+
+    cmsMLU* mlu = (cmsMLU*) Ptr;
+
+    if (!WriteCountAndSting(self, io, mlu, "nm")) goto Error;
+    if (!WriteCountAndSting(self, io, mlu, "#0")) goto Error;
+    if (!WriteCountAndSting(self, io, mlu, "#1")) goto Error;
+    if (!WriteCountAndSting(self, io, mlu, "#2")) goto Error;
+    if (!WriteCountAndSting(self, io, mlu, "#3")) goto Error;
+
+    return TRUE;
+
+Error:
+    return FALSE;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_CrdInfo_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsMLUdup((cmsMLU*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_CrdInfo_Free(struct _cms_typehandler_struct* self, void *Ptr)
+{
+    cmsMLUfree((cmsMLU*) Ptr);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+// ********************************************************************************
+// Type cmsSigScreeningType
+// ********************************************************************************
+//
+//The screeningType describes various screening parameters including screen
+//frequency, screening angle, and spot shape.
+
+static
+void *Type_Screening_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsScreening* sc = NULL;
+    cmsUInt32Number i;
+
+    sc = (cmsScreening*) _cmsMallocZero(self ->ContextID, sizeof(cmsScreening));
+    if (sc == NULL) return NULL;
+
+    *nItems = 0;
+
+    if (!_cmsReadUInt32Number(io, &sc ->Flag)) goto Error;
+    if (!_cmsReadUInt32Number(io, &sc ->nChannels)) goto Error;
+
+    if (sc ->nChannels > cmsMAXCHANNELS - 1)
+        sc ->nChannels = cmsMAXCHANNELS - 1;
+
+    for (i=0; i < sc ->nChannels; i++) {
+
+        if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].Frequency)) goto Error;
+        if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].ScreenAngle)) goto Error;
+        if (!_cmsReadUInt32Number(io, &sc ->Channels[i].SpotShape)) goto Error;
+    }
+
+
+    *nItems = 1;
+
+    return (void*) sc;
+
+Error:
+    if (sc != NULL)
+        _cmsFree(self ->ContextID, sc);
+
+    return NULL;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+static
+cmsBool Type_Screening_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsScreening* sc = (cmsScreening* ) Ptr;
+    cmsUInt32Number i;
+
+    if (!_cmsWriteUInt32Number(io, sc ->Flag)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, sc ->nChannels)) return FALSE;
+
+    for (i=0; i < sc ->nChannels; i++) {
+
+        if (!_cmsWrite15Fixed16Number(io, sc ->Channels[i].Frequency)) return FALSE;
+        if (!_cmsWrite15Fixed16Number(io, sc ->Channels[i].ScreenAngle)) return FALSE;
+        if (!_cmsWriteUInt32Number(io, sc ->Channels[i].SpotShape)) return FALSE;
+    }
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_Screening_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+   return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsScreening));
+
+   cmsUNUSED_PARAMETER(n);
+}
+
+
+static
+void Type_Screening_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+   _cmsFree(self ->ContextID, Ptr);
+}
+
+// ********************************************************************************
+// Type cmsSigViewingConditionsType
+// ********************************************************************************
+//
+//This type represents a set of viewing condition parameters including:
+//CIE Â’absolute?illuminant white point tristimulus values and CIE Â’absolute?//surround tristimulus values.
+
+static
+void *Type_ViewingConditions_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsICCViewingConditions* vc = NULL;
+
+    vc = (cmsICCViewingConditions*) _cmsMallocZero(self ->ContextID, sizeof(cmsICCViewingConditions));
+    if (vc == NULL) return NULL;
+
+    *nItems = 0;
+
+    if (!_cmsReadXYZNumber(io, &vc ->IlluminantXYZ)) goto Error;
+    if (!_cmsReadXYZNumber(io, &vc ->SurroundXYZ)) goto Error;
+    if (!_cmsReadUInt32Number(io, &vc ->IlluminantType)) goto Error;
+
+    *nItems = 1;
+
+    return (void*) vc;
+
+Error:
+    if (vc != NULL)
+        _cmsFree(self ->ContextID, vc);
+
+    return NULL;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+static
+cmsBool Type_ViewingConditions_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsICCViewingConditions* sc = (cmsICCViewingConditions* ) Ptr;
+
+    if (!_cmsWriteXYZNumber(io, &sc ->IlluminantXYZ)) return FALSE;
+    if (!_cmsWriteXYZNumber(io, &sc ->SurroundXYZ)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, sc ->IlluminantType)) return FALSE;
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_ViewingConditions_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+   return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsScreening));
+
+   cmsUNUSED_PARAMETER(n);
+}
+
+
+static
+void Type_ViewingConditions_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+   _cmsFree(self ->ContextID, Ptr);
+}
+
+
+// ********************************************************************************
+// Type cmsSigMultiProcessElementType
+// ********************************************************************************
+
+
+static
+void* GenericMPEdup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsStageDup((cmsStage*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void GenericMPEfree(struct _cms_typehandler_struct* self, void *Ptr)
+{
+    cmsStageFree((cmsStage*) Ptr);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+// Each curve is stored in one or more curve segments, with break-points specified between curve segments.
+// The first curve segment always starts at –Infinity, and the last curve segment always ends at +Infinity. The
+// first and last curve segments shall be specified in terms of a formula, whereas the other segments shall be
+// specified either in terms of a formula, or by a sampled curve.
+
+
+// Read an embedded segmented curve
+static
+cmsToneCurve* ReadSegmentedCurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io)
+{
+    cmsCurveSegSignature ElementSig;
+    cmsUInt32Number i, j;
+    cmsUInt16Number nSegments;
+    cmsCurveSegment*  Segments;
+    cmsToneCurve* Curve;
+    cmsFloat32Number PrevBreak = -1E22F;    // - infinite
+
+    // Take signature and channels for each element.
+     if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) return NULL;
+
+     // That should be a segmented curve
+     if (ElementSig != cmsSigSegmentedCurve) return NULL;
+
+     if (!_cmsReadUInt32Number(io, NULL)) return NULL;
+     if (!_cmsReadUInt16Number(io, &nSegments)) return NULL;
+     if (!_cmsReadUInt16Number(io, NULL)) return NULL;
+
+     if (nSegments < 1) return NULL;
+     Segments = (cmsCurveSegment*) _cmsCalloc(self ->ContextID, nSegments, sizeof(cmsCurveSegment));
+     if (Segments == NULL) return NULL;
+
+     // Read breakpoints
+     for (i=0; i < (cmsUInt32Number) nSegments - 1; i++) {
+
+         Segments[i].x0 = PrevBreak;
+         if (!_cmsReadFloat32Number(io, &Segments[i].x1)) goto Error;
+         PrevBreak = Segments[i].x1;
+     }
+
+     Segments[nSegments-1].x0 = PrevBreak;
+     Segments[nSegments-1].x1 = 1E22F;     // A big cmsFloat32Number number
+
+     // Read segments
+     for (i=0; i < nSegments; i++) {
+
+          if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) goto Error;
+          if (!_cmsReadUInt32Number(io, NULL)) goto Error;
+
+           switch (ElementSig) {
+
+            case cmsSigFormulaCurveSeg: {
+
+                cmsUInt16Number Type;
+                cmsUInt32Number ParamsByType[] = {4, 5, 5 };
+
+                if (!_cmsReadUInt16Number(io, &Type)) goto Error;
+                if (!_cmsReadUInt16Number(io, NULL)) goto Error;
+
+                Segments[i].Type = Type + 6;
+                if (Type > 2) goto Error;
+
+                for (j=0; j < ParamsByType[Type]; j++) {
+
+                    cmsFloat32Number f;
+                    if (!_cmsReadFloat32Number(io, &f)) goto Error;
+                    Segments[i].Params[j] = f;
+                }
+                }
+                break;
+
+
+            case cmsSigSampledCurveSeg: {
+                cmsUInt32Number Count;
+
+                if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+
+                Segments[i].nGridPoints = Count;
+                Segments[i].SampledPoints = (cmsFloat32Number*) _cmsCalloc(self ->ContextID, Count, sizeof(cmsFloat32Number));
+                if (Segments[i].SampledPoints == NULL) goto Error;
+
+                for (j=0; j < Count; j++) {
+                    if (!_cmsReadFloat32Number(io, &Segments[i].SampledPoints[j])) goto Error;
+                }
+                }
+                break;
+
+            default:
+                {
+                char String[5];
+
+                _cmsTagSignature2String(String, (cmsTagSignature) ElementSig);
+                cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve element type '%s' found.", String);
+                }
+                return NULL;
+
+         }
+     }
+
+     Curve = cmsBuildSegmentedToneCurve(self ->ContextID, nSegments, Segments);
+
+     for (i=0; i < nSegments; i++) {
+         if (Segments[i].SampledPoints) _cmsFree(self ->ContextID, Segments[i].SampledPoints);
+     }
+     _cmsFree(self ->ContextID, Segments);
+     return Curve;
+
+Error:
+     if (Segments) _cmsFree(self ->ContextID, Segments);
+     return NULL;
+}
+
+
+static
+cmsBool ReadMPECurve(struct _cms_typehandler_struct* self,
+                     cmsIOHANDLER* io,
+                     void* Cargo,
+                     cmsUInt32Number n,
+                     cmsUInt32Number SizeOfTag)
+{
+      cmsToneCurve** GammaTables = ( cmsToneCurve**) Cargo;
+
+      GammaTables[n] = ReadSegmentedCurve(self, io);
+      return (GammaTables[n] != NULL);
+
+      cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+void *Type_MPEcurve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsStage* mpe = NULL;
+    cmsUInt16Number InputChans, OutputChans;
+    cmsUInt32Number i, BaseOffset;
+    cmsToneCurve** GammaTables;
+
+    *nItems = 0;
+
+    // Get actual position as a basis for element offsets
+    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+    if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
+    if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
+
+    if (InputChans != OutputChans) return NULL;
+
+    GammaTables = (cmsToneCurve**) _cmsCalloc(self ->ContextID, InputChans, sizeof(cmsToneCurve*));
+    if (GammaTables == NULL) return NULL;
+
+    if (ReadPositionTable(self, io, InputChans, BaseOffset, GammaTables, ReadMPECurve)) {
+
+        mpe = cmsStageAllocToneCurves(self ->ContextID, InputChans, GammaTables);
+    }
+    else {
+        mpe = NULL;
+    }
+
+    for (i=0; i < InputChans; i++) {
+        if (GammaTables[i]) cmsFreeToneCurve(GammaTables[i]);
+    }
+
+    _cmsFree(self ->ContextID, GammaTables);
+    *nItems = (mpe != NULL) ? 1 : 0;
+    return mpe;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+// Write a single segmented curve. NO CHECK IS PERFORMED ON VALIDITY
+static
+cmsBool WriteSegmentedCurve(cmsIOHANDLER* io, cmsToneCurve* g)
+{
+    cmsUInt32Number i, j;
+    cmsCurveSegment* Segments = g ->Segments;
+    cmsUInt32Number nSegments = g ->nSegments;
+
+    if (!_cmsWriteUInt32Number(io, cmsSigSegmentedCurve)) goto Error;
+    if (!_cmsWriteUInt32Number(io, 0)) goto Error;
+    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) nSegments)) goto Error;
+    if (!_cmsWriteUInt16Number(io, 0)) goto Error;
+
+    // Write the break-points
+    for (i=0; i < nSegments - 1; i++) {
+        if (!_cmsWriteFloat32Number(io, Segments[i].x1)) goto Error;
+    }
+
+    // Write the segments
+    for (i=0; i < g ->nSegments; i++) {
+
+        cmsCurveSegment* ActualSeg = Segments + i;
+
+        if (ActualSeg -> Type == 0) {
+
+            // This is a sampled curve
+            if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) cmsSigSampledCurveSeg)) goto Error;
+            if (!_cmsWriteUInt32Number(io, 0)) goto Error;
+            if (!_cmsWriteUInt32Number(io, ActualSeg -> nGridPoints)) goto Error;
+
+            for (j=0; j < g ->Segments[i].nGridPoints; j++) {
+                if (!_cmsWriteFloat32Number(io, ActualSeg -> SampledPoints[j])) goto Error;
+            }
+
+        }
+        else {
+            int Type;
+            cmsUInt32Number ParamsByType[] = { 4, 5, 5 };
+
+            // This is a formula-based
+            if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) cmsSigFormulaCurveSeg)) goto Error;
+            if (!_cmsWriteUInt32Number(io, 0)) goto Error;
+
+            // We only allow 1, 2 and 3 as types
+            Type = ActualSeg ->Type - 6;
+            if (Type > 2 || Type < 0) goto Error;
+
+            if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Type)) goto Error;
+            if (!_cmsWriteUInt16Number(io, 0)) goto Error;
+
+            for (j=0; j < ParamsByType[Type]; j++) {
+                if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) ActualSeg ->Params[j])) goto Error;
+            }
+        }
+
+        // It seems there is no need to align. Code is here, and for safety commented out
+        // if (!_cmsWriteAlignment(io)) goto Error;
+    }
+
+    return TRUE;
+
+Error:
+    return FALSE;
+}
+
+
+static
+cmsBool WriteMPECurve(struct _cms_typehandler_struct* self,
+                      cmsIOHANDLER* io,
+                      void* Cargo,
+                      cmsUInt32Number n,
+                      cmsUInt32Number SizeOfTag)
+{
+    _cmsStageToneCurvesData* Curves  = (_cmsStageToneCurvesData*) Cargo;
+
+    return WriteSegmentedCurve(io, Curves ->TheCurves[n]);
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+    cmsUNUSED_PARAMETER(self);
+}
+
+// Write a curve, checking first for validity
+static
+cmsBool  Type_MPEcurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsUInt32Number BaseOffset;
+    cmsStage* mpe = (cmsStage*) Ptr;
+    _cmsStageToneCurvesData* Curves = (_cmsStageToneCurvesData*) mpe ->Data;
+
+    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+    // Write the header. Since those are curves, input and output channels are same
+    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE;
+    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE;
+
+    if (!WritePositionTable(self, io, 0,
+                                mpe ->InputChannels, BaseOffset, Curves, WriteMPECurve)) return FALSE;
+
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+
+
+// The matrix is organized as an array of PxQ+Q elements, where P is the number of input channels to the
+// matrix, and Q is the number of output channels. The matrix elements are each float32Numbers. The array
+// is organized as follows:
+// array = [e11, e12, ? e1P, e21, e22, ? e2P, ? eQ1, eQ2, ? eQP, e1, e2, ? eQ]
+
+static
+void *Type_MPEmatrix_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsStage* mpe;
+    cmsUInt16Number   InputChans, OutputChans;
+    cmsUInt32Number   nElems, i;
+    cmsFloat64Number* Matrix;
+    cmsFloat64Number* Offsets;
+
+    if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
+    if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
+
+
+    nElems = InputChans * OutputChans;
+
+    // Input and output chans may be ANY (up to 0xffff)
+    Matrix = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, nElems, sizeof(cmsFloat64Number));
+    if (Matrix == NULL) return NULL;
+
+    Offsets = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, OutputChans, sizeof(cmsFloat64Number));
+    if (Offsets == NULL) {
+
+        _cmsFree(self ->ContextID, Matrix);
+        return NULL;
+    }
+
+    for (i=0; i < nElems; i++) {
+
+        cmsFloat32Number v;
+
+        if (!_cmsReadFloat32Number(io, &v)) return NULL;
+        Matrix[i] = v;
+    }
+
+
+    for (i=0; i < OutputChans; i++) {
+
+        cmsFloat32Number v;
+
+        if (!_cmsReadFloat32Number(io, &v)) return NULL;
+        Offsets[i] = v;
+    }
+
+
+    mpe = cmsStageAllocMatrix(self ->ContextID, OutputChans, InputChans, Matrix, Offsets);
+    _cmsFree(self ->ContextID, Matrix);
+    _cmsFree(self ->ContextID, Offsets);
+
+    *nItems = 1;
+
+    return mpe;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+cmsBool  Type_MPEmatrix_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsUInt32Number i, nElems;
+    cmsStage* mpe = (cmsStage*) Ptr;
+    _cmsStageMatrixData* Matrix = (_cmsStageMatrixData*) mpe ->Data;
+
+    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE;
+    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->OutputChannels)) return FALSE;
+
+    nElems = mpe ->InputChannels * mpe ->OutputChannels;
+
+    for (i=0; i < nElems; i++) {
+        if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) Matrix->Double[i])) return FALSE;
+    }
+
+
+    for (i=0; i < mpe ->OutputChannels; i++) {
+
+        if (Matrix ->Offset == NULL) {
+
+               if (!_cmsWriteFloat32Number(io, 0)) return FALSE;
+        }
+        else {
+               if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) Matrix->Offset[i])) return FALSE;
+        }
+    }
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+
+static
+void *Type_MPEclut_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsStage* mpe = NULL;
+    cmsUInt16Number InputChans, OutputChans;
+    cmsUInt8Number Dimensions8[16];
+    cmsUInt32Number i, nMaxGrids, GridPoints[MAX_INPUT_DIMENSIONS];
+    _cmsStageCLutData* clut;
+
+    if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
+    if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
+
+    if (InputChans == 0) goto Error;
+    if (OutputChans == 0) goto Error;
+
+    if (io ->Read(io, Dimensions8, sizeof(cmsUInt8Number), 16) != 16)
+        goto Error;
+
+    // Copy MAX_INPUT_DIMENSIONS at most. Expand to cmsUInt32Number
+    nMaxGrids = InputChans > MAX_INPUT_DIMENSIONS ? MAX_INPUT_DIMENSIONS : InputChans;
+    for (i=0; i < nMaxGrids; i++) GridPoints[i] = (cmsUInt32Number) Dimensions8[i];
+
+    // Allocate the true CLUT
+    mpe = cmsStageAllocCLutFloatGranular(self ->ContextID, GridPoints, InputChans, OutputChans, NULL);
+    if (mpe == NULL) goto Error;
+
+    // Read the data
+    clut = (_cmsStageCLutData*) mpe ->Data;
+    for (i=0; i < clut ->nEntries; i++) {
+
+        if (!_cmsReadFloat32Number(io, &clut ->Tab.TFloat[i])) goto Error;
+    }
+
+    *nItems = 1;
+    return mpe;
+
+Error:
+    *nItems = 0;
+    if (mpe != NULL) cmsStageFree(mpe);
+    return NULL;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+// Write a CLUT in floating point
+static
+cmsBool  Type_MPEclut_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsUInt8Number Dimensions8[16];
+    cmsUInt32Number i;
+    cmsStage* mpe = (cmsStage*) Ptr;
+    _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe ->Data;
+
+    // Check for maximum number of channels
+    if (mpe -> InputChannels > 15) return FALSE;
+
+    // Only floats are supported in MPE
+    if (clut ->HasFloatValues == FALSE) return FALSE;
+
+    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE;
+    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->OutputChannels)) return FALSE;
+
+    memset(Dimensions8, 0, sizeof(Dimensions8));
+
+    for (i=0; i < mpe ->InputChannels; i++)
+        Dimensions8[i] = (cmsUInt8Number) clut ->Params ->nSamples[i];
+
+    if (!io ->Write(io, 16, Dimensions8)) return FALSE;
+
+    for (i=0; i < clut ->nEntries; i++) {
+
+        if (!_cmsWriteFloat32Number(io, clut ->Tab.TFloat[i])) return FALSE;
+    }
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(nItems);
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+
+// This is the list of built-in MPE types
+static _cmsTagTypeLinkedList SupportedMPEtypes[] = {
+
+{{ (cmsTagTypeSignature) cmsSigBAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[1] },   // Ignore those elements for now
+{{ (cmsTagTypeSignature) cmsSigEAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[2] },   // (That's what the spec says)
+
+{TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCurveSetElemType,     MPEcurve),      &SupportedMPEtypes[3] },
+{TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigMatrixElemType,       MPEmatrix),     &SupportedMPEtypes[4] },
+{TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCLutElemType,         MPEclut),        NULL },
+};
+
+_cmsTagTypePluginChunkType _cmsMPETypePluginChunk = { NULL };
+
+static
+cmsBool ReadMPEElem(struct _cms_typehandler_struct* self,
+                    cmsIOHANDLER* io,
+                    void* Cargo,
+                    cmsUInt32Number n,
+                    cmsUInt32Number SizeOfTag)
+{
+    cmsStageSignature ElementSig;
+    cmsTagTypeHandler* TypeHandler;
+    cmsUInt32Number nItems;
+    cmsPipeline *NewLUT = (cmsPipeline *) Cargo;
+    _cmsTagTypePluginChunkType* MPETypePluginChunk  = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin);
+
+
+    // Take signature and channels for each element.
+    if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) return FALSE;
+
+    // The reserved placeholder
+    if (!_cmsReadUInt32Number(io, NULL)) return FALSE;
+
+    // Read diverse MPE types
+    TypeHandler = GetHandler((cmsTagTypeSignature) ElementSig, MPETypePluginChunk ->TagTypes, SupportedMPEtypes);
+    if (TypeHandler == NULL)  {
+
+        char String[5];
+
+        _cmsTagSignature2String(String, (cmsTagSignature) ElementSig);
+
+        // An unknown element was found.
+        cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown MPE type '%s' found.", String);
+        return FALSE;
+    }
+
+    // If no read method, just ignore the element (valid for cmsSigBAcsElemType and cmsSigEAcsElemType)
+    // Read the MPE. No size is given
+    if (TypeHandler ->ReadPtr != NULL) {
+
+        // This is a real element which should be read and processed
+        if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, (cmsStage*) TypeHandler ->ReadPtr(self, io, &nItems, SizeOfTag)))
+            return FALSE;
+    }
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+    cmsUNUSED_PARAMETER(n);
+}
+
+
+// This is the main dispatcher for MPE
+static
+void *Type_MPE_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+    cmsUInt16Number InputChans, OutputChans;
+    cmsUInt32Number ElementCount;
+    cmsPipeline *NewLUT = NULL;
+    cmsUInt32Number BaseOffset;
+
+    // Get actual position as a basis for element offsets
+    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+    // Read channels and element count
+    if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
+    if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
+
+    // Allocates an empty LUT
+    NewLUT = cmsPipelineAlloc(self ->ContextID, InputChans, OutputChans);
+    if (NewLUT == NULL) return NULL;
+
+    if (!_cmsReadUInt32Number(io, &ElementCount)) return NULL;
+
+    if (!ReadPositionTable(self, io, ElementCount, BaseOffset, NewLUT, ReadMPEElem)) {
+        if (NewLUT != NULL) cmsPipelineFree(NewLUT);
+        *nItems = 0;
+        return NULL;
+    }
+
+    // Success
+    *nItems = 1;
+    return NewLUT;
+
+    cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+
+// This one is a liitle bit more complex, so we don't use position tables this time.
+static
+cmsBool Type_MPE_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsUInt32Number i, BaseOffset, DirectoryPos, CurrentPos;
+    int inputChan, outputChan;
+    cmsUInt32Number ElemCount;
+    cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL, Before;
+    cmsStageSignature ElementSig;
+    cmsPipeline* Lut = (cmsPipeline*) Ptr;
+    cmsStage* Elem = Lut ->Elements;
+    cmsTagTypeHandler* TypeHandler;
+    _cmsTagTypePluginChunkType* MPETypePluginChunk  = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin);
+
+    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+    inputChan  = cmsPipelineInputChannels(Lut);
+    outputChan = cmsPipelineOutputChannels(Lut);
+    ElemCount  = cmsPipelineStageCount(Lut);
+
+    ElementOffsets = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number));
+    if (ElementOffsets == NULL) goto Error;
+
+    ElementSizes = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number));
+    if (ElementSizes == NULL) goto Error;
+
+    // Write the head
+    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) inputChan)) goto Error;
+    if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) outputChan)) goto Error;
+    if (!_cmsWriteUInt32Number(io, (cmsUInt16Number) ElemCount)) goto Error;
+
+    DirectoryPos = io ->Tell(io);
+
+    // Write a fake directory to be filled latter on
+    for (i=0; i < ElemCount; i++) {
+        if (!_cmsWriteUInt32Number(io, 0)) goto Error;  // Offset
+        if (!_cmsWriteUInt32Number(io, 0)) goto Error;  // size
+    }
+
+    // Write each single tag. Keep track of the size as well.
+    for (i=0; i < ElemCount; i++) {
+
+        ElementOffsets[i] = io ->Tell(io) - BaseOffset;
+
+        ElementSig = Elem ->Type;
+
+        TypeHandler = GetHandler((cmsTagTypeSignature) ElementSig, MPETypePluginChunk->TagTypes, SupportedMPEtypes);
+        if (TypeHandler == NULL)  {
+
+                char String[5];
+
+                _cmsTagSignature2String(String, (cmsTagSignature) ElementSig);
+
+                 // An unknow element was found.
+                 cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Found unknown MPE type '%s'", String);
+                 goto Error;
+        }
+
+        if (!_cmsWriteUInt32Number(io, ElementSig)) goto Error;
+        if (!_cmsWriteUInt32Number(io, 0)) goto Error;
+        Before = io ->Tell(io);
+        if (!TypeHandler ->WritePtr(self, io, Elem, 1)) goto Error;
+        if (!_cmsWriteAlignment(io)) goto Error;
+
+        ElementSizes[i] = io ->Tell(io) - Before;
+
+        Elem = Elem ->Next;
+    }
+
+    // Write the directory
+    CurrentPos = io ->Tell(io);
+
+    if (!io ->Seek(io, DirectoryPos)) goto Error;
+
+    for (i=0; i < ElemCount; i++) {
+        if (!_cmsWriteUInt32Number(io, ElementOffsets[i])) goto Error;
+        if (!_cmsWriteUInt32Number(io, ElementSizes[i])) goto Error;
+    }
+
+    if (!io ->Seek(io, CurrentPos)) goto Error;
+
+    if (ElementOffsets != NULL) _cmsFree(self ->ContextID, ElementOffsets);
+    if (ElementSizes != NULL) _cmsFree(self ->ContextID, ElementSizes);
+    return TRUE;
+
+Error:
+    if (ElementOffsets != NULL) _cmsFree(self ->ContextID, ElementOffsets);
+    if (ElementSizes != NULL) _cmsFree(self ->ContextID, ElementSizes);
+    return FALSE;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_MPE_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*) cmsPipelineDup((cmsPipeline*) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_MPE_Free(struct _cms_typehandler_struct* self, void *Ptr)
+{
+    cmsPipelineFree((cmsPipeline*) Ptr);
+    return;
+
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigVcgtType
+// ********************************************************************************
+
+
+#define cmsVideoCardGammaTableType    0
+#define cmsVideoCardGammaFormulaType  1
+
+// Used internally
+typedef struct {
+    double Gamma;
+    double Min;
+    double Max;
+} _cmsVCGTGAMMA;
+
+
+static
+void *Type_vcgt_Read(struct _cms_typehandler_struct* self,
+                     cmsIOHANDLER* io,
+                     cmsUInt32Number* nItems,
+                     cmsUInt32Number SizeOfTag)
+{
+    cmsUInt32Number TagType, n, i;
+    cmsToneCurve** Curves;
+
+    *nItems = 0;
+
+    // Read tag type
+    if (!_cmsReadUInt32Number(io, &TagType)) return NULL;
+
+    // Allocate space for the array
+    Curves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*));
+    if (Curves == NULL) return NULL;
+
+    // There are two possible flavors
+    switch (TagType) {
+
+    // Gamma is stored as a table
+    case cmsVideoCardGammaTableType:
+    {
+       cmsUInt16Number nChannels, nElems, nBytes;
+
+       // Check channel count, which should be 3 (we don't support monochrome this time)
+       if (!_cmsReadUInt16Number(io, &nChannels)) goto Error;
+
+       if (nChannels != 3) {
+           cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported number of channels for VCGT '%d'", nChannels);
+           goto Error;
+       }
+
+       // Get Table element count and bytes per element
+       if (!_cmsReadUInt16Number(io, &nElems)) goto Error;
+       if (!_cmsReadUInt16Number(io, &nBytes)) goto Error;
+
+       // Adobe's quirk fixup. Fixing broken profiles...
+       if (nElems == 256 && nBytes == 1 && SizeOfTag == 1576)
+           nBytes = 2;
+
+
+       // Populate tone curves
+       for (n=0; n < 3; n++) {
+
+           Curves[n] = cmsBuildTabulatedToneCurve16(self ->ContextID, nElems, NULL);
+           if (Curves[n] == NULL) goto Error;
+
+           // On depending on byte depth
+           switch (nBytes) {
+
+           // One byte, 0..255
+           case 1:
+               for (i=0; i < nElems; i++) {
+
+                   cmsUInt8Number v;
+
+                      if (!_cmsReadUInt8Number(io, &v)) goto Error;
+                      Curves[n] ->Table16[i] = FROM_8_TO_16(v);
+               }
+               break;
+
+           // One word 0..65535
+           case 2:
+              if (!_cmsReadUInt16Array(io, nElems, Curves[n]->Table16)) goto Error;
+              break;
+
+          // Unsupported
+           default:
+              cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported bit depth for VCGT '%d'", nBytes * 8);
+              goto Error;
+           }
+       } // For all 3 channels
+    }
+    break;
+
+   // In this case, gamma is stored as a formula
+   case cmsVideoCardGammaFormulaType:
+   {
+       _cmsVCGTGAMMA Colorant[3];
+
+        // Populate tone curves
+       for (n=0; n < 3; n++) {
+
+           double Params[10];
+
+           if (!_cmsRead15Fixed16Number(io, &Colorant[n].Gamma)) goto Error;
+           if (!_cmsRead15Fixed16Number(io, &Colorant[n].Min)) goto Error;
+           if (!_cmsRead15Fixed16Number(io, &Colorant[n].Max)) goto Error;
+
+            // Parametric curve type 5 is:
+            // Y = (aX + b)^Gamma + e | X >= d
+            // Y = cX + f             | X < d
+
+            // vcgt formula is:
+            // Y = (Max ?Min) * (X ^ Gamma) + Min
+
+            // So, the translation is
+            // a = (Max ?Min) ^ ( 1 / Gamma)
+            // e = Min
+            // b=c=d=f=0
+
+           Params[0] = Colorant[n].Gamma;
+           Params[1] = pow((Colorant[n].Max - Colorant[n].Min), (1.0 / Colorant[n].Gamma));
+           Params[2] = 0;
+           Params[3] = 0;
+           Params[4] = 0;
+           Params[5] = Colorant[n].Min;
+           Params[6] = 0;
+
+           Curves[n] = cmsBuildParametricToneCurve(self ->ContextID, 5, Params);
+           if (Curves[n] == NULL) goto Error;
+       }
+   }
+   break;
+
+   // Unsupported
+   default:
+      cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported tag type for VCGT '%d'", TagType);
+      goto Error;
+   }
+
+   *nItems = 1;
+   return (void*) Curves;
+
+// Regret,  free all resources
+Error:
+
+    cmsFreeToneCurveTriple(Curves);
+    _cmsFree(self ->ContextID, Curves);
+    return NULL;
+
+     cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+// We don't support all flavors, only 16bits tables and formula
+static
+cmsBool Type_vcgt_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsToneCurve** Curves =  (cmsToneCurve**) Ptr;
+    cmsUInt32Number i, j;
+
+    if (cmsGetToneCurveParametricType(Curves[0]) == 5 &&
+        cmsGetToneCurveParametricType(Curves[1]) == 5 &&
+        cmsGetToneCurveParametricType(Curves[2]) == 5) {
+
+            if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaFormulaType)) return FALSE;
+
+            // Save parameters
+            for (i=0; i < 3; i++) {
+
+                _cmsVCGTGAMMA v;
+
+                v.Gamma = Curves[i] ->Segments[0].Params[0];
+                v.Min   = Curves[i] ->Segments[0].Params[5];
+                v.Max   = pow(Curves[i] ->Segments[0].Params[1], v.Gamma) + v.Min;
+
+                if (!_cmsWrite15Fixed16Number(io, v.Gamma)) return FALSE;
+                if (!_cmsWrite15Fixed16Number(io, v.Min)) return FALSE;
+                if (!_cmsWrite15Fixed16Number(io, v.Max)) return FALSE;
+            }
+    }
+
+    else {
+
+        // Always store as a table of 256 words
+        if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaTableType)) return FALSE;
+        if (!_cmsWriteUInt16Number(io, 3)) return FALSE;
+        if (!_cmsWriteUInt16Number(io, 256)) return FALSE;
+        if (!_cmsWriteUInt16Number(io, 2)) return FALSE;
+
+        for (i=0; i < 3; i++) {
+            for (j=0; j < 256; j++) {
+
+                cmsFloat32Number v = cmsEvalToneCurveFloat(Curves[i], (cmsFloat32Number) (j / 255.0));
+                cmsUInt16Number  n = _cmsQuickSaturateWord(v * 65535.0);
+
+                if (!_cmsWriteUInt16Number(io, n)) return FALSE;
+            }
+        }
+    }
+
+    return TRUE;
+
+    cmsUNUSED_PARAMETER(self);
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+static
+void* Type_vcgt_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    cmsToneCurve** OldCurves =  (cmsToneCurve**) Ptr;
+    cmsToneCurve** NewCurves;
+
+    NewCurves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*));
+    if (NewCurves == NULL) return NULL;
+
+    NewCurves[0] = cmsDupToneCurve(OldCurves[0]);
+    NewCurves[1] = cmsDupToneCurve(OldCurves[1]);
+    NewCurves[2] = cmsDupToneCurve(OldCurves[2]);
+
+    return (void*) NewCurves;
+
+    cmsUNUSED_PARAMETER(n);
+}
+
+
+static
+void Type_vcgt_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsFreeToneCurveTriple((cmsToneCurve**) Ptr);
+    _cmsFree(self ->ContextID, Ptr);
+}
+
+
+// ********************************************************************************
+// Type cmsSigDictType
+// ********************************************************************************
+
+// Single column of the table can point to wchar or MLUC elements. Holds arrays of data
+typedef struct {
+    cmsContext ContextID;
+    cmsUInt32Number *Offsets;
+    cmsUInt32Number *Sizes;
+} _cmsDICelem;
+
+typedef struct {
+    _cmsDICelem Name, Value, DisplayName, DisplayValue;
+
+} _cmsDICarray;
+
+// Allocate an empty array element
+static
+cmsBool AllocElem(cmsContext ContextID, _cmsDICelem* e,  cmsUInt32Number Count)
+{
+    e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number));
+    if (e->Offsets == NULL) return FALSE;
+
+    e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number));
+    if (e->Sizes == NULL) {
+
+        _cmsFree(ContextID, e -> Offsets);
+        return FALSE;
+    }
+
+    e ->ContextID = ContextID;
+    return TRUE;
+}
+
+// Free an array element
+static
+void FreeElem(_cmsDICelem* e)
+{
+    if (e ->Offsets != NULL)  _cmsFree(e -> ContextID, e -> Offsets);
+    if (e ->Sizes   != NULL)  _cmsFree(e -> ContextID, e -> Sizes);
+    e->Offsets = e ->Sizes = NULL;
+}
+
+// Get rid of whole array
+static
+void FreeArray( _cmsDICarray* a)
+{
+    if (a ->Name.Offsets != NULL) FreeElem(&a->Name);
+    if (a ->Value.Offsets != NULL) FreeElem(&a ->Value);
+    if (a ->DisplayName.Offsets != NULL) FreeElem(&a->DisplayName);
+    if (a ->DisplayValue.Offsets != NULL) FreeElem(&a ->DisplayValue);
+}
+
+
+// Allocate whole array
+static
+cmsBool AllocArray(cmsContext ContextID, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length)
+{
+    // Empty values
+    memset(a, 0, sizeof(_cmsDICarray));
+
+    // On depending on record size, create column arrays
+    if (!AllocElem(ContextID, &a ->Name, Count)) goto Error;
+    if (!AllocElem(ContextID, &a ->Value, Count)) goto Error;
+
+    if (Length > 16) {
+        if (!AllocElem(ContextID, &a -> DisplayName, Count)) goto Error;
+
+    }
+    if (Length > 24) {
+        if (!AllocElem(ContextID, &a ->DisplayValue, Count)) goto Error;
+    }
+    return TRUE;
+
+Error:
+    FreeArray(a);
+    return FALSE;
+}
+
+// Read one element
+static
+cmsBool ReadOneElem(cmsIOHANDLER* io,  _cmsDICelem* e, cmsUInt32Number i, cmsUInt32Number BaseOffset)
+{
+    if (!_cmsReadUInt32Number(io, &e->Offsets[i])) return FALSE;
+    if (!_cmsReadUInt32Number(io, &e ->Sizes[i])) return FALSE;
+
+    // An offset of zero has special meaning and shal be preserved
+    if (e ->Offsets[i] > 0)
+        e ->Offsets[i] += BaseOffset;
+    return TRUE;
+}
+
+
+static
+cmsBool ReadOffsetArray(cmsIOHANDLER* io,  _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length, cmsUInt32Number BaseOffset)
+{
+    cmsUInt32Number i;
+
+    // Read column arrays
+    for (i=0; i < Count; i++) {
+
+        if (!ReadOneElem(io, &a -> Name, i, BaseOffset)) return FALSE;
+        if (!ReadOneElem(io, &a -> Value, i, BaseOffset)) return FALSE;
+
+        if (Length > 16) {
+
+            if (!ReadOneElem(io, &a ->DisplayName, i, BaseOffset)) return FALSE;
+
+        }
+
+        if (Length > 24) {
+
+            if (!ReadOneElem(io, & a -> DisplayValue, i, BaseOffset)) return FALSE;
+        }
+    }
+    return TRUE;
+}
+
+
+// Write one element
+static
+cmsBool WriteOneElem(cmsIOHANDLER* io,  _cmsDICelem* e, cmsUInt32Number i)
+{
+    if (!_cmsWriteUInt32Number(io, e->Offsets[i])) return FALSE;
+    if (!_cmsWriteUInt32Number(io, e ->Sizes[i])) return FALSE;
+
+    return TRUE;
+}
+
+static
+cmsBool WriteOffsetArray(cmsIOHANDLER* io,  _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length)
+{
+    cmsUInt32Number i;
+
+    for (i=0; i < Count; i++) {
+
+        if (!WriteOneElem(io, &a -> Name, i)) return FALSE;
+        if (!WriteOneElem(io, &a -> Value, i))  return FALSE;
+
+        if (Length > 16) {
+
+            if (!WriteOneElem(io, &a -> DisplayName, i))  return FALSE;
+        }
+
+        if (Length > 24) {
+
+            if (!WriteOneElem(io, &a -> DisplayValue, i))  return FALSE;
+        }
+    }
+
+    return TRUE;
+}
+
+static
+cmsBool ReadOneWChar(cmsIOHANDLER* io,  _cmsDICelem* e, cmsUInt32Number i, wchar_t ** wcstr)
+{
+
+    cmsUInt32Number nChars;
+
+      // Special case for undefined strings (see ICC Votable
+      // Proposal Submission, Dictionary Type and Metadata TAG Definition)
+      if (e -> Offsets[i] == 0) {
+
+          *wcstr = NULL;
+          return TRUE;
+      }
+
+      if (!io -> Seek(io, e -> Offsets[i])) return FALSE;
+
+      nChars = e ->Sizes[i] / sizeof(cmsUInt16Number);
+
+
+      *wcstr = (wchar_t*) _cmsMallocZero(e ->ContextID, (nChars + 1) * sizeof(wchar_t));
+      if (*wcstr == NULL) return FALSE;
+
+      if (!_cmsReadWCharArray(io, nChars, *wcstr)) {
+          _cmsFree(e ->ContextID, *wcstr);
+          return FALSE;
+      }
+
+      // End of string marker
+      (*wcstr)[nChars] = 0;
+      return TRUE;
+}
+
+static
+cmsUInt32Number mywcslen(const wchar_t *s)
+{
+    const wchar_t *p;
+
+    p = s;
+    while (*p)
+        p++;
+
+    return (cmsUInt32Number)(p - s);
+}
+
+static
+cmsBool WriteOneWChar(cmsIOHANDLER* io,  _cmsDICelem* e, cmsUInt32Number i, const wchar_t * wcstr, cmsUInt32Number BaseOffset)
+{
+    cmsUInt32Number Before = io ->Tell(io);
+    cmsUInt32Number n;
+
+    e ->Offsets[i] = Before - BaseOffset;
+
+    if (wcstr == NULL) {
+        e ->Sizes[i] = 0;
+        e ->Offsets[i] = 0;
+        return TRUE;
+    }
+
+    n = mywcslen(wcstr);
+    if (!_cmsWriteWCharArray(io,  n, wcstr)) return FALSE;
+
+    e ->Sizes[i] = io ->Tell(io) - Before;
+    return TRUE;
+}
+
+static
+cmsBool ReadOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io,  _cmsDICelem* e, cmsUInt32Number i, cmsMLU** mlu)
+{
+    cmsUInt32Number nItems = 0;
+
+    // A way to get null MLUCs
+    if (e -> Offsets[i] == 0 || e ->Sizes[i] == 0) {
+
+        *mlu = NULL;
+        return TRUE;
+    }
+
+    if (!io -> Seek(io, e -> Offsets[i])) return FALSE;
+
+    *mlu = (cmsMLU*) Type_MLU_Read(self, io, &nItems, e ->Sizes[i]);
+    return *mlu != NULL;
+}
+
+static
+cmsBool WriteOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io,  _cmsDICelem* e, cmsUInt32Number i, const cmsMLU* mlu, cmsUInt32Number BaseOffset)
+{
+    cmsUInt32Number Before;
+
+     // Special case for undefined strings (see ICC Votable
+     // Proposal Submission, Dictionary Type and Metadata TAG Definition)
+     if (mlu == NULL) {
+        e ->Sizes[i] = 0;
+        e ->Offsets[i] = 0;
+        return TRUE;
+    }
+
+    Before = io ->Tell(io);
+    e ->Offsets[i] = Before - BaseOffset;
+
+    if (!Type_MLU_Write(self, io, (void*) mlu, 1)) return FALSE;
+
+    e ->Sizes[i] = io ->Tell(io) - Before;
+    return TRUE;
+}
+
+
+static
+void *Type_Dictionary_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+   cmsHANDLE hDict;
+   cmsUInt32Number i, Count, Length;
+   cmsUInt32Number BaseOffset;
+   _cmsDICarray a;
+   wchar_t *NameWCS = NULL, *ValueWCS = NULL;
+   cmsMLU *DisplayNameMLU = NULL, *DisplayValueMLU=NULL;
+   cmsBool rc;
+
+    *nItems = 0;
+
+    // Get actual position as a basis for element offsets
+    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+    // Get name-value record count
+    if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+    SizeOfTag -= sizeof(cmsUInt32Number);
+
+    // Get rec length
+    if (!_cmsReadUInt32Number(io, &Length)) return NULL;
+    SizeOfTag -= sizeof(cmsUInt32Number);
+
+    // Check for valid lengths
+    if (Length != 16 && Length != 24 && Length != 32) {
+         cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown record length in dictionary '%d'", Length);
+         return NULL;
+    }
+
+    // Creates an empty dictionary
+    hDict = cmsDictAlloc(self -> ContextID);
+    if (hDict == NULL) return NULL;
+
+    // On depending on record size, create column arrays
+    if (!AllocArray(self -> ContextID, &a, Count, Length)) goto Error;
+
+    // Read column arrays
+    if (!ReadOffsetArray(io, &a, Count, Length, BaseOffset)) goto Error;
+
+    // Seek to each element and read it
+    for (i=0; i < Count; i++) {
+
+        if (!ReadOneWChar(io, &a.Name, i, &NameWCS)) goto Error;
+        if (!ReadOneWChar(io, &a.Value, i, &ValueWCS)) goto Error;
+
+        if (Length > 16) {
+            if (!ReadOneMLUC(self, io, &a.DisplayName, i, &DisplayNameMLU)) goto Error;
+        }
+
+        if (Length > 24) {
+            if (!ReadOneMLUC(self, io, &a.DisplayValue, i, &DisplayValueMLU)) goto Error;
+        }
+
+        if (NameWCS == NULL || ValueWCS == NULL) {
+        
+            cmsSignalError(self->ContextID, cmsERROR_CORRUPTION_DETECTED, "Bad dictionary Name/Value");        
+            rc = FALSE;
+        }
+        else {
+
+            rc = cmsDictAddEntry(hDict, NameWCS, ValueWCS, DisplayNameMLU, DisplayValueMLU);
+        }
+
+        if (NameWCS != NULL) _cmsFree(self ->ContextID, NameWCS);
+        if (ValueWCS != NULL) _cmsFree(self ->ContextID, ValueWCS);
+        if (DisplayNameMLU != NULL) cmsMLUfree(DisplayNameMLU);
+        if (DisplayValueMLU != NULL) cmsMLUfree(DisplayValueMLU);
+
+        if (!rc) goto Error;
+    }
+
+   FreeArray(&a);
+   *nItems = 1;
+   return (void*) hDict;
+
+Error:
+   FreeArray(&a);
+   cmsDictFree(hDict);
+   return NULL;
+}
+
+
+static
+cmsBool Type_Dictionary_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+    cmsHANDLE hDict = (cmsHANDLE) Ptr;
+    const cmsDICTentry* p;
+    cmsBool AnyName, AnyValue;
+    cmsUInt32Number i, Count, Length;
+    cmsUInt32Number DirectoryPos, CurrentPos, BaseOffset;
+   _cmsDICarray a;
+
+    if (hDict == NULL) return FALSE;
+
+    BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+    // Let's inspect the dictionary
+    Count = 0; AnyName = FALSE; AnyValue = FALSE;
+    for (p = cmsDictGetEntryList(hDict); p != NULL; p = cmsDictNextEntry(p)) {
+
+        if (p ->DisplayName != NULL) AnyName = TRUE;
+        if (p ->DisplayValue != NULL) AnyValue = TRUE;
+        Count++;
+    }
+
+    Length = 16;
+    if (AnyName)  Length += 8;
+    if (AnyValue) Length += 8;
+
+    if (!_cmsWriteUInt32Number(io, Count)) return FALSE;
+    if (!_cmsWriteUInt32Number(io, Length)) return FALSE;
+
+    // Keep starting position of offsets table
+    DirectoryPos = io ->Tell(io);
+
+    // Allocate offsets array
+    if (!AllocArray(self ->ContextID, &a, Count, Length)) goto Error;
+
+    // Write a fake directory to be filled latter on
+    if (!WriteOffsetArray(io, &a, Count, Length)) goto Error;
+
+    // Write each element. Keep track of the size as well.
+    p = cmsDictGetEntryList(hDict);
+    for (i=0; i < Count; i++) {
+
+        if (!WriteOneWChar(io, &a.Name, i,  p ->Name, BaseOffset)) goto Error;
+        if (!WriteOneWChar(io, &a.Value, i, p ->Value, BaseOffset)) goto Error;
+
+        if (p ->DisplayName != NULL) {
+            if (!WriteOneMLUC(self, io, &a.DisplayName, i, p ->DisplayName, BaseOffset)) goto Error;
+        }
+
+        if (p ->DisplayValue != NULL) {
+            if (!WriteOneMLUC(self, io, &a.DisplayValue, i, p ->DisplayValue, BaseOffset)) goto Error;
+        }
+
+       p = cmsDictNextEntry(p);
+    }
+
+    // Write the directory
+    CurrentPos = io ->Tell(io);
+    if (!io ->Seek(io, DirectoryPos)) goto Error;
+
+    if (!WriteOffsetArray(io, &a, Count, Length)) goto Error;
+
+    if (!io ->Seek(io, CurrentPos)) goto Error;
+
+    FreeArray(&a);
+    return TRUE;
+
+Error:
+    FreeArray(&a);
+    return FALSE;
+
+    cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_Dictionary_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+    return (void*)  cmsDictDup((cmsHANDLE) Ptr);
+
+    cmsUNUSED_PARAMETER(n);
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void Type_Dictionary_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+    cmsDictFree((cmsHANDLE) Ptr);
+    cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type support main routines
+// ********************************************************************************
+
+
+// This is the list of built-in types
+static _cmsTagTypeLinkedList SupportedTagTypes[] = {
+
+{TYPE_HANDLER(cmsSigChromaticityType,          Chromaticity),        &SupportedTagTypes[1] },
+{TYPE_HANDLER(cmsSigColorantOrderType,         ColorantOrderType),   &SupportedTagTypes[2] },
+{TYPE_HANDLER(cmsSigS15Fixed16ArrayType,       S15Fixed16),          &SupportedTagTypes[3] },
+{TYPE_HANDLER(cmsSigU16Fixed16ArrayType,       U16Fixed16),          &SupportedTagTypes[4] },
+{TYPE_HANDLER(cmsSigTextType,                  Text),                &SupportedTagTypes[5] },
+{TYPE_HANDLER(cmsSigTextDescriptionType,       Text_Description),    &SupportedTagTypes[6] },
+{TYPE_HANDLER(cmsSigCurveType,                 Curve),               &SupportedTagTypes[7] },
+{TYPE_HANDLER(cmsSigParametricCurveType,       ParametricCurve),     &SupportedTagTypes[8] },
+{TYPE_HANDLER(cmsSigDateTimeType,              DateTime),            &SupportedTagTypes[9] },
+{TYPE_HANDLER(cmsSigLut8Type,                  LUT8),                &SupportedTagTypes[10] },
+{TYPE_HANDLER(cmsSigLut16Type,                 LUT16),               &SupportedTagTypes[11] },
+{TYPE_HANDLER(cmsSigColorantTableType,         ColorantTable),       &SupportedTagTypes[12] },
+{TYPE_HANDLER(cmsSigNamedColor2Type,           NamedColor),          &SupportedTagTypes[13] },
+{TYPE_HANDLER(cmsSigMultiLocalizedUnicodeType, MLU),                 &SupportedTagTypes[14] },
+{TYPE_HANDLER(cmsSigProfileSequenceDescType,   ProfileSequenceDesc), &SupportedTagTypes[15] },
+{TYPE_HANDLER(cmsSigSignatureType,             Signature),           &SupportedTagTypes[16] },
+{TYPE_HANDLER(cmsSigMeasurementType,           Measurement),         &SupportedTagTypes[17] },
+{TYPE_HANDLER(cmsSigDataType,                  Data),                &SupportedTagTypes[18] },
+{TYPE_HANDLER(cmsSigLutAtoBType,               LUTA2B),              &SupportedTagTypes[19] },
+{TYPE_HANDLER(cmsSigLutBtoAType,               LUTB2A),              &SupportedTagTypes[20] },
+{TYPE_HANDLER(cmsSigUcrBgType,                 UcrBg),               &SupportedTagTypes[21] },
+{TYPE_HANDLER(cmsSigCrdInfoType,               CrdInfo),             &SupportedTagTypes[22] },
+{TYPE_HANDLER(cmsSigMultiProcessElementType,   MPE),                 &SupportedTagTypes[23] },
+{TYPE_HANDLER(cmsSigScreeningType,             Screening),           &SupportedTagTypes[24] },
+{TYPE_HANDLER(cmsSigViewingConditionsType,     ViewingConditions),   &SupportedTagTypes[25] },
+{TYPE_HANDLER(cmsSigXYZType,                   XYZ),                 &SupportedTagTypes[26] },
+{TYPE_HANDLER(cmsCorbisBrokenXYZtype,          XYZ),                 &SupportedTagTypes[27] },
+{TYPE_HANDLER(cmsMonacoBrokenCurveType,        Curve),               &SupportedTagTypes[28] },
+{TYPE_HANDLER(cmsSigProfileSequenceIdType,     ProfileSequenceId),   &SupportedTagTypes[29] },
+{TYPE_HANDLER(cmsSigDictType,                  Dictionary),          &SupportedTagTypes[30] },
+{TYPE_HANDLER(cmsSigVcgtType,                  vcgt),                NULL }
+};
+
+
+_cmsTagTypePluginChunkType _cmsTagTypePluginChunk = { NULL };
+
+
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupTagTypeList(struct _cmsContext_struct* ctx, 
+                    const struct _cmsContext_struct* src, 
+                    int loc)
+{
+   _cmsTagTypePluginChunkType newHead = { NULL };
+   _cmsTagTypeLinkedList*  entry;
+   _cmsTagTypeLinkedList*  Anterior = NULL;
+   _cmsTagTypePluginChunkType* head = (_cmsTagTypePluginChunkType*) src->chunks[loc];
+
+   // Walk the list copying all nodes
+   for (entry = head->TagTypes;
+       entry != NULL;
+       entry = entry ->Next) {
+
+           _cmsTagTypeLinkedList *newEntry = ( _cmsTagTypeLinkedList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTagTypeLinkedList));
+
+           if (newEntry == NULL) 
+               return;
+
+           // We want to keep the linked list order, so this is a little bit tricky
+           newEntry -> Next = NULL;
+           if (Anterior)
+               Anterior -> Next = newEntry;
+
+           Anterior = newEntry;
+
+           if (newHead.TagTypes == NULL)
+               newHead.TagTypes = newEntry;
+   }
+
+   ctx ->chunks[loc] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTagTypePluginChunkType));
+}
+
+
+void _cmsAllocTagTypePluginChunk(struct _cmsContext_struct* ctx, 
+                                 const struct _cmsContext_struct* src)
+{
+    if (src != NULL) {
+        
+        // Duplicate the LIST
+        DupTagTypeList(ctx, src, TagTypePlugin);
+    }
+    else {
+        static _cmsTagTypePluginChunkType TagTypePluginChunk = { NULL };
+        ctx ->chunks[TagTypePlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagTypePluginChunk, sizeof(_cmsTagTypePluginChunkType));
+    }
+}
+
+void _cmsAllocMPETypePluginChunk(struct _cmsContext_struct* ctx, 
+                               const struct _cmsContext_struct* src)
+{
+    if (src != NULL) {
+        
+        // Duplicate the LIST
+        DupTagTypeList(ctx, src, MPEPlugin);
+    }
+    else {
+        static _cmsTagTypePluginChunkType TagTypePluginChunk = { NULL };
+        ctx ->chunks[MPEPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagTypePluginChunk, sizeof(_cmsTagTypePluginChunkType));
+    }
+
+}
+
+
+// Both kind of plug-ins share same structure
+cmsBool  _cmsRegisterTagTypePlugin(cmsContext id, cmsPluginBase* Data)
+{
+    return RegisterTypesPlugin(id, Data, TagTypePlugin);
+}
+
+cmsBool  _cmsRegisterMultiProcessElementPlugin(cmsContext id, cmsPluginBase* Data)
+{
+    return RegisterTypesPlugin(id, Data,MPEPlugin);
+}
+
+
+// Wrapper for tag types
+cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig)
+{
+    _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(ContextID, TagTypePlugin);
+
+    return GetHandler(sig, ctx->TagTypes, SupportedTagTypes);
+}
+
+// ********************************************************************************
+// Tag support main routines
+// ********************************************************************************
+
+typedef struct _cmsTagLinkedList_st {
+
+            cmsTagSignature Signature;
+            cmsTagDescriptor Descriptor;
+            struct _cmsTagLinkedList_st* Next;
+
+} _cmsTagLinkedList;
+
+// This is the list of built-in tags
+static _cmsTagLinkedList SupportedTags[] = {
+
+    { cmsSigAToB0Tag,               { 1, 3,  { cmsSigLut16Type,  cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[1]},
+    { cmsSigAToB1Tag,               { 1, 3,  { cmsSigLut16Type,  cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[2]},
+    { cmsSigAToB2Tag,               { 1, 3,  { cmsSigLut16Type,  cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[3]},
+    { cmsSigBToA0Tag,               { 1, 3,  { cmsSigLut16Type,  cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[4]},
+    { cmsSigBToA1Tag,               { 1, 3,  { cmsSigLut16Type,  cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[5]},
+    { cmsSigBToA2Tag,               { 1, 3,  { cmsSigLut16Type,  cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[6]},
+
+    // Allow corbis  and its broken XYZ type
+    { cmsSigRedColorantTag,         { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[7]},
+    { cmsSigGreenColorantTag,       { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[8]},
+    { cmsSigBlueColorantTag,        { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[9]},
+
+    { cmsSigRedTRCTag,              { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[10]},
+    { cmsSigGreenTRCTag,            { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[11]},
+    { cmsSigBlueTRCTag,             { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[12]},
+
+    { cmsSigCalibrationDateTimeTag, { 1, 1, { cmsSigDateTimeType }, NULL}, &SupportedTags[13]},
+    { cmsSigCharTargetTag,          { 1, 1, { cmsSigTextType },     NULL}, &SupportedTags[14]},
+
+    { cmsSigChromaticAdaptationTag, { 9, 1, { cmsSigS15Fixed16ArrayType }, NULL}, &SupportedTags[15]},
+    { cmsSigChromaticityTag,        { 1, 1, { cmsSigChromaticityType    }, NULL}, &SupportedTags[16]},
+    { cmsSigColorantOrderTag,       { 1, 1, { cmsSigColorantOrderType   }, NULL}, &SupportedTags[17]},
+    { cmsSigColorantTableTag,       { 1, 1, { cmsSigColorantTableType   }, NULL}, &SupportedTags[18]},
+    { cmsSigColorantTableOutTag,    { 1, 1, { cmsSigColorantTableType   }, NULL}, &SupportedTags[19]},
+
+    { cmsSigCopyrightTag,           { 1, 3, { cmsSigTextType,  cmsSigMultiLocalizedUnicodeType, cmsSigTextDescriptionType}, DecideTextType}, &SupportedTags[20]},
+    { cmsSigDateTimeTag,            { 1, 1, { cmsSigDateTimeType }, NULL}, &SupportedTags[21]},
+
+    { cmsSigDeviceMfgDescTag,       { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[22]},
+    { cmsSigDeviceModelDescTag,     { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[23]},
+
+    { cmsSigGamutTag,               { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[24]},
+
+    { cmsSigGrayTRCTag,             { 1, 2, { cmsSigCurveType, cmsSigParametricCurveType }, DecideCurveType}, &SupportedTags[25]},
+    { cmsSigLuminanceTag,           { 1, 1, { cmsSigXYZType }, NULL}, &SupportedTags[26]},
+
+    { cmsSigMediaBlackPointTag,     { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, NULL}, &SupportedTags[27]},
+    { cmsSigMediaWhitePointTag,     { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, NULL}, &SupportedTags[28]},
+
+    { cmsSigNamedColor2Tag,         { 1, 1, { cmsSigNamedColor2Type }, NULL}, &SupportedTags[29]},
+
+    { cmsSigPreview0Tag,            { 1, 3,  { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[30]},
+    { cmsSigPreview1Tag,            { 1, 3,  { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[31]},
+    { cmsSigPreview2Tag,            { 1, 3,  { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[32]},
+
+    { cmsSigProfileDescriptionTag,  { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[33]},
+    { cmsSigProfileSequenceDescTag, { 1, 1, { cmsSigProfileSequenceDescType }, NULL}, &SupportedTags[34]},
+    { cmsSigTechnologyTag,          { 1, 1, { cmsSigSignatureType }, NULL},  &SupportedTags[35]},
+
+    { cmsSigColorimetricIntentImageStateTag,   { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[36]},
+    { cmsSigPerceptualRenderingIntentGamutTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[37]},
+    { cmsSigSaturationRenderingIntentGamutTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[38]},
+
+    { cmsSigMeasurementTag,         { 1, 1, { cmsSigMeasurementType }, NULL}, &SupportedTags[39]},
+
+    { cmsSigPs2CRD0Tag,             { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[40]},
+    { cmsSigPs2CRD1Tag,             { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[41]},
+    { cmsSigPs2CRD2Tag,             { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[42]},
+    { cmsSigPs2CRD3Tag,             { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[43]},
+    { cmsSigPs2CSATag,              { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[44]},
+    { cmsSigPs2RenderingIntentTag,  { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[45]},
+
+    { cmsSigViewingCondDescTag,     { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[46]},
+
+    { cmsSigUcrBgTag,               { 1, 1, { cmsSigUcrBgType}, NULL},    &SupportedTags[47]},
+    { cmsSigCrdInfoTag,             { 1, 1, { cmsSigCrdInfoType}, NULL},  &SupportedTags[48]},
+
+    { cmsSigDToB0Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[49]},
+    { cmsSigDToB1Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[50]},
+    { cmsSigDToB2Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[51]},
+    { cmsSigDToB3Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[52]},
+    { cmsSigBToD0Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[53]},
+    { cmsSigBToD1Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[54]},
+    { cmsSigBToD2Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[55]},
+    { cmsSigBToD3Tag,               { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[56]},
+
+    { cmsSigScreeningDescTag,       { 1, 1, { cmsSigTextDescriptionType },    NULL}, &SupportedTags[57]},
+    { cmsSigViewingConditionsTag,   { 1, 1, { cmsSigViewingConditionsType },  NULL}, &SupportedTags[58]},
+
+    { cmsSigScreeningTag,           { 1, 1, { cmsSigScreeningType},          NULL }, &SupportedTags[59]},
+    { cmsSigVcgtTag,                { 1, 1, { cmsSigVcgtType},               NULL }, &SupportedTags[60]},
+    { cmsSigMetaTag,                { 1, 1, { cmsSigDictType},               NULL }, &SupportedTags[61]},
+    { cmsSigProfileSequenceIdTag,   { 1, 1, { cmsSigProfileSequenceIdType},  NULL },  &SupportedTags[62]},
+    { cmsSigProfileDescriptionMLTag,{ 1, 1, { cmsSigMultiLocalizedUnicodeType}, NULL}, NULL}
+
+
+};
+
+/*
+    Not supported                 Why
+    =======================       =========================================
+    cmsSigOutputResponseTag   ==> WARNING, POSSIBLE PATENT ON THIS SUBJECT!
+    cmsSigNamedColorTag       ==> Deprecated
+    cmsSigDataTag             ==> Ancient, unused
+    cmsSigDeviceSettingsTag   ==> Deprecated, useless
+*/
+
+
+_cmsTagPluginChunkType _cmsTagPluginChunk = { NULL };
+
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupTagList(struct _cmsContext_struct* ctx, 
+                    const struct _cmsContext_struct* src)
+{
+   _cmsTagPluginChunkType newHead = { NULL };
+   _cmsTagLinkedList*  entry;
+   _cmsTagLinkedList*  Anterior = NULL;
+   _cmsTagPluginChunkType* head = (_cmsTagPluginChunkType*) src->chunks[TagPlugin];
+
+   // Walk the list copying all nodes
+   for (entry = head->Tag;
+       entry != NULL;
+       entry = entry ->Next) {
+
+           _cmsTagLinkedList *newEntry = ( _cmsTagLinkedList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTagLinkedList));
+
+           if (newEntry == NULL) 
+               return;
+
+           // We want to keep the linked list order, so this is a little bit tricky
+           newEntry -> Next = NULL;
+           if (Anterior)
+               Anterior -> Next = newEntry;
+
+           Anterior = newEntry;
+
+           if (newHead.Tag == NULL)
+               newHead.Tag = newEntry;
+   }
+
+   ctx ->chunks[TagPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTagPluginChunkType));
+}
+
+void _cmsAllocTagPluginChunk(struct _cmsContext_struct* ctx, 
+                                 const struct _cmsContext_struct* src)
+{
+    if (src != NULL) {
+
+        DupTagList(ctx, src);
+    }
+    else {
+        static _cmsTagPluginChunkType TagPluginChunk = { NULL };
+        ctx ->chunks[TagPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagPluginChunk, sizeof(_cmsTagPluginChunkType));
+    }
+
+}
+
+cmsBool  _cmsRegisterTagPlugin(cmsContext id, cmsPluginBase* Data)
+{
+    cmsPluginTag* Plugin = (cmsPluginTag*) Data;
+    _cmsTagLinkedList *pt;
+    _cmsTagPluginChunkType* TagPluginChunk = ( _cmsTagPluginChunkType*) _cmsContextGetClientChunk(id, TagPlugin);
+
+    if (Data == NULL) {
+
+        TagPluginChunk->Tag = NULL;
+        return TRUE;
+    }
+
+    pt = (_cmsTagLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagLinkedList));
+    if (pt == NULL) return FALSE;
+
+    pt ->Signature  = Plugin ->Signature;
+    pt ->Descriptor = Plugin ->Descriptor;
+    pt ->Next       = TagPluginChunk ->Tag;
+
+    TagPluginChunk ->Tag = pt;
+    
+    return TRUE;
+}
+
+// Return a descriptor for a given tag or NULL
+cmsTagDescriptor* _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig)
+{
+    _cmsTagLinkedList* pt;
+    _cmsTagPluginChunkType* TagPluginChunk = ( _cmsTagPluginChunkType*) _cmsContextGetClientChunk(ContextID, TagPlugin);
+
+    for (pt = TagPluginChunk->Tag;
+             pt != NULL;
+             pt = pt ->Next) {
+
+                if (sig == pt -> Signature) return &pt ->Descriptor;
+    }
+
+    for (pt = SupportedTags;
+            pt != NULL;
+            pt = pt ->Next) {
+
+                if (sig == pt -> Signature) return &pt ->Descriptor;
+    }
+
+    return NULL;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsvirt.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsvirt.c
new file mode 100644
index 0000000..b324c99
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsvirt.c
@@ -0,0 +1,1194 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2014 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// Virtual (built-in) profiles
+// -----------------------------------------------------------------------------------
+
+static
+cmsBool SetTextTags(cmsHPROFILE hProfile, const wchar_t* Description)
+{
+    cmsMLU *DescriptionMLU, *CopyrightMLU;
+    cmsBool  rc = FALSE;
+    cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+    DescriptionMLU  = cmsMLUalloc(ContextID, 1);
+    CopyrightMLU    = cmsMLUalloc(ContextID, 1);
+
+    if (DescriptionMLU == NULL || CopyrightMLU == NULL) goto Error;
+
+    if (!cmsMLUsetWide(DescriptionMLU,  "en", "US", Description)) goto Error;
+    if (!cmsMLUsetWide(CopyrightMLU,    "en", "US", L"No copyright, use freely")) goto Error;
+
+    if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag,  DescriptionMLU)) goto Error;
+    if (!cmsWriteTag(hProfile, cmsSigCopyrightTag,           CopyrightMLU)) goto Error;
+
+    rc = TRUE;
+
+Error:
+
+    if (DescriptionMLU)
+        cmsMLUfree(DescriptionMLU);
+    if (CopyrightMLU)
+        cmsMLUfree(CopyrightMLU);
+    return rc;
+}
+
+
+static
+cmsBool  SetSeqDescTag(cmsHPROFILE hProfile, const char* Model)
+{
+    cmsBool  rc = FALSE;
+    cmsContext ContextID = cmsGetProfileContextID(hProfile);
+    cmsSEQ* Seq = cmsAllocProfileSequenceDescription(ContextID, 1);
+
+    if (Seq == NULL) return FALSE;
+
+    Seq->seq[0].deviceMfg = (cmsSignature) 0;
+    Seq->seq[0].deviceModel = (cmsSignature) 0;
+
+#ifdef CMS_DONT_USE_INT64
+    Seq->seq[0].attributes[0] = 0;
+    Seq->seq[0].attributes[1] = 0;
+#else
+    Seq->seq[0].attributes = 0;
+#endif
+
+    Seq->seq[0].technology = (cmsTechnologySignature) 0;
+
+    cmsMLUsetASCII( Seq->seq[0].Manufacturer, cmsNoLanguage, cmsNoCountry, "Little CMS");
+    cmsMLUsetASCII( Seq->seq[0].Model,        cmsNoLanguage, cmsNoCountry, Model);
+
+    if (!_cmsWriteProfileSequence(hProfile, Seq)) goto Error;
+
+    rc = TRUE;
+
+Error:
+    if (Seq)
+        cmsFreeProfileSequenceDescription(Seq);
+
+    return rc;
+}
+
+
+
+// This function creates a profile based on White point, primaries and
+// transfer functions.
+cmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID,
+                                          const cmsCIExyY* WhitePoint,
+                                          const cmsCIExyYTRIPLE* Primaries,
+                                          cmsToneCurve* const TransferFunction[3])
+{
+    cmsHPROFILE hICC;
+    cmsMAT3 MColorants;
+    cmsCIEXYZTRIPLE Colorants;
+    cmsCIExyY MaxWhite;
+    cmsMAT3 CHAD;
+    cmsCIEXYZ WhitePointXYZ;
+
+    hICC = cmsCreateProfilePlaceholder(ContextID);
+    if (!hICC)                          // can't allocate
+        return NULL;
+
+    cmsSetProfileVersion(hICC, 4.3);
+
+    cmsSetDeviceClass(hICC,      cmsSigDisplayClass);
+    cmsSetColorSpace(hICC,       cmsSigRgbData);
+    cmsSetPCS(hICC,              cmsSigXYZData);
+
+    cmsSetHeaderRenderingIntent(hICC,  INTENT_PERCEPTUAL);
+
+
+    // Implement profile using following tags:
+    //
+    //  1 cmsSigProfileDescriptionTag
+    //  2 cmsSigMediaWhitePointTag
+    //  3 cmsSigRedColorantTag
+    //  4 cmsSigGreenColorantTag
+    //  5 cmsSigBlueColorantTag
+    //  6 cmsSigRedTRCTag
+    //  7 cmsSigGreenTRCTag
+    //  8 cmsSigBlueTRCTag
+    //  9 Chromatic adaptation Tag
+    // This conforms a standard RGB DisplayProfile as says ICC, and then I add (As per addendum II)
+    // 10 cmsSigChromaticityTag
+
+
+    if (!SetTextTags(hICC, L"RGB built-in")) goto Error;
+
+    if (WhitePoint) {
+
+        if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error;
+
+        cmsxyY2XYZ(&WhitePointXYZ, WhitePoint);
+        _cmsAdaptationMatrix(&CHAD, NULL, &WhitePointXYZ, cmsD50_XYZ());
+
+        // This is a V4 tag, but many CMM does read and understand it no matter which version
+        if (!cmsWriteTag(hICC, cmsSigChromaticAdaptationTag, (void*) &CHAD)) goto Error;
+    }
+
+    if (WhitePoint && Primaries) {
+
+        MaxWhite.x =  WhitePoint -> x;
+        MaxWhite.y =  WhitePoint -> y;
+        MaxWhite.Y =  1.0;
+
+        if (!_cmsBuildRGB2XYZtransferMatrix(&MColorants, &MaxWhite, Primaries)) goto Error;
+
+        Colorants.Red.X   = MColorants.v[0].n[0];
+        Colorants.Red.Y   = MColorants.v[1].n[0];
+        Colorants.Red.Z   = MColorants.v[2].n[0];
+
+        Colorants.Green.X = MColorants.v[0].n[1];
+        Colorants.Green.Y = MColorants.v[1].n[1];
+        Colorants.Green.Z = MColorants.v[2].n[1];
+
+        Colorants.Blue.X  = MColorants.v[0].n[2];
+        Colorants.Blue.Y  = MColorants.v[1].n[2];
+        Colorants.Blue.Z  = MColorants.v[2].n[2];
+
+        if (!cmsWriteTag(hICC, cmsSigRedColorantTag,   (void*) &Colorants.Red)) goto Error;
+        if (!cmsWriteTag(hICC, cmsSigBlueColorantTag,  (void*) &Colorants.Blue)) goto Error;
+        if (!cmsWriteTag(hICC, cmsSigGreenColorantTag, (void*) &Colorants.Green)) goto Error;
+    }
+
+
+    if (TransferFunction) {
+
+        // Tries to minimize space. Thanks to Richard Hughes for this nice idea         
+        if (!cmsWriteTag(hICC, cmsSigRedTRCTag,   (void*) TransferFunction[0])) goto Error;
+
+        if (TransferFunction[1] == TransferFunction[0]) {
+
+            if (!cmsLinkTag (hICC, cmsSigGreenTRCTag, cmsSigRedTRCTag)) goto Error;
+
+        } else {
+
+            if (!cmsWriteTag(hICC, cmsSigGreenTRCTag, (void*) TransferFunction[1])) goto Error;
+        }
+
+        if (TransferFunction[2] == TransferFunction[0]) {
+
+            if (!cmsLinkTag (hICC, cmsSigBlueTRCTag, cmsSigRedTRCTag)) goto Error;
+
+        } else {
+
+            if (!cmsWriteTag(hICC, cmsSigBlueTRCTag, (void*) TransferFunction[2])) goto Error;
+        }
+    }
+
+    if (Primaries) {
+        if (!cmsWriteTag(hICC, cmsSigChromaticityTag, (void*) Primaries)) goto Error;
+    }
+
+
+    return hICC;
+
+Error:
+    if (hICC)
+        cmsCloseProfile(hICC);
+    return NULL;
+}
+
+cmsHPROFILE CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint,
+                                          const cmsCIExyYTRIPLE* Primaries,
+                                          cmsToneCurve* const TransferFunction[3])
+{
+    return cmsCreateRGBProfileTHR(NULL, WhitePoint, Primaries, TransferFunction);
+}
+
+
+
+// This function creates a profile based on White point and transfer function.
+cmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID,
+                                           const cmsCIExyY* WhitePoint,
+                                           const cmsToneCurve* TransferFunction)
+{
+    cmsHPROFILE hICC;
+    cmsCIEXYZ tmp;
+
+    hICC = cmsCreateProfilePlaceholder(ContextID);
+    if (!hICC)                          // can't allocate
+        return NULL;
+
+    cmsSetProfileVersion(hICC, 4.3);
+
+    cmsSetDeviceClass(hICC,      cmsSigDisplayClass);
+    cmsSetColorSpace(hICC,       cmsSigGrayData);
+    cmsSetPCS(hICC,              cmsSigXYZData);
+    cmsSetHeaderRenderingIntent(hICC,  INTENT_PERCEPTUAL);
+
+
+    // Implement profile using following tags:
+    //
+    //  1 cmsSigProfileDescriptionTag
+    //  2 cmsSigMediaWhitePointTag
+    //  3 cmsSigGrayTRCTag
+
+    // This conforms a standard Gray DisplayProfile
+
+    // Fill-in the tags
+
+    if (!SetTextTags(hICC, L"gray built-in")) goto Error;
+
+
+    if (WhitePoint) {
+
+        cmsxyY2XYZ(&tmp, WhitePoint);
+        if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) &tmp)) goto Error;
+    }
+
+    if (TransferFunction) {
+
+        if (!cmsWriteTag(hICC, cmsSigGrayTRCTag, (void*) TransferFunction)) goto Error;
+    }
+
+    return hICC;
+
+Error:
+    if (hICC)
+        cmsCloseProfile(hICC);
+    return NULL;
+}
+
+
+
+cmsHPROFILE CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint,
+                                                    const cmsToneCurve* TransferFunction)
+{
+    return cmsCreateGrayProfileTHR(NULL, WhitePoint, TransferFunction);
+}
+
+// This is a devicelink operating in the target colorspace with as many transfer functions as components
+
+cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID,
+                                                          cmsColorSpaceSignature ColorSpace,
+                                                          cmsToneCurve* const TransferFunctions[])
+{
+    cmsHPROFILE hICC;
+    cmsPipeline* Pipeline;
+    int nChannels;
+
+    hICC = cmsCreateProfilePlaceholder(ContextID);
+    if (!hICC)
+        return NULL;
+
+    cmsSetProfileVersion(hICC, 4.3);
+
+    cmsSetDeviceClass(hICC,      cmsSigLinkClass);
+    cmsSetColorSpace(hICC,       ColorSpace);
+    cmsSetPCS(hICC,              ColorSpace);
+
+    cmsSetHeaderRenderingIntent(hICC,  INTENT_PERCEPTUAL);
+
+    // Set up channels
+    nChannels = cmsChannelsOf(ColorSpace);
+
+    // Creates a Pipeline with prelinearization step only
+    Pipeline = cmsPipelineAlloc(ContextID, nChannels, nChannels);
+    if (Pipeline == NULL) goto Error;
+
+
+    // Copy tables to Pipeline
+    if (!cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, cmsStageAllocToneCurves(ContextID, nChannels, TransferFunctions)))
+        goto Error;
+
+    // Create tags
+    if (!SetTextTags(hICC, L"Linearization built-in")) goto Error;
+    if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline)) goto Error;
+    if (!SetSeqDescTag(hICC, "Linearization built-in")) goto Error;
+
+    // Pipeline is already on virtual profile
+    cmsPipelineFree(Pipeline);
+
+    // Ok, done
+    return hICC;
+
+Error:
+    cmsPipelineFree(Pipeline);
+    if (hICC)
+        cmsCloseProfile(hICC);
+
+
+    return NULL;
+}
+
+cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace,
+                                                                 cmsToneCurve* const TransferFunctions[])
+{
+    return cmsCreateLinearizationDeviceLinkTHR(NULL, ColorSpace, TransferFunctions);
+}
+
+// Ink-limiting algorithm
+//
+//  Sum = C + M + Y + K
+//  If Sum > InkLimit
+//        Ratio= 1 - (Sum - InkLimit) / (C + M + Y)
+//        if Ratio <0
+//              Ratio=0
+//        endif
+//     Else
+//         Ratio=1
+//     endif
+//
+//     C = Ratio * C
+//     M = Ratio * M
+//     Y = Ratio * Y
+//     K: Does not change
+
+static
+int InkLimitingSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+    cmsFloat64Number InkLimit = *(cmsFloat64Number *) Cargo;
+    cmsFloat64Number SumCMY, SumCMYK, Ratio;
+
+    InkLimit = (InkLimit * 655.35);
+
+    SumCMY   = In[0]  + In[1] + In[2];
+    SumCMYK  = SumCMY + In[3];
+
+    if (SumCMYK > InkLimit) {
+
+        Ratio = 1 - ((SumCMYK - InkLimit) / SumCMY);
+        if (Ratio < 0)
+            Ratio = 0;
+    }
+    else Ratio = 1;
+
+    Out[0] = _cmsQuickSaturateWord(In[0] * Ratio);     // C
+    Out[1] = _cmsQuickSaturateWord(In[1] * Ratio);     // M
+    Out[2] = _cmsQuickSaturateWord(In[2] * Ratio);     // Y
+
+    Out[3] = In[3];                                 // K (untouched)
+
+    return TRUE;
+}
+
+// This is a devicelink operating in CMYK for ink-limiting
+
+cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID,
+                                                     cmsColorSpaceSignature ColorSpace,
+                                                     cmsFloat64Number Limit)
+{
+    cmsHPROFILE hICC;
+    cmsPipeline* LUT;
+    cmsStage* CLUT;
+    int nChannels;
+
+    if (ColorSpace != cmsSigCmykData) {
+        cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "InkLimiting: Only CMYK currently supported");
+        return NULL;
+    }
+
+    if (Limit < 0.0 || Limit > 400) {
+
+        cmsSignalError(ContextID, cmsERROR_RANGE, "InkLimiting: Limit should be between 0..400");
+        if (Limit < 0) Limit = 0;
+        if (Limit > 400) Limit = 400;
+
+    }
+
+    hICC = cmsCreateProfilePlaceholder(ContextID);
+    if (!hICC)                          // can't allocate
+        return NULL;
+
+    cmsSetProfileVersion(hICC, 4.3);
+
+    cmsSetDeviceClass(hICC,      cmsSigLinkClass);
+    cmsSetColorSpace(hICC,       ColorSpace);
+    cmsSetPCS(hICC,              ColorSpace);
+
+    cmsSetHeaderRenderingIntent(hICC,  INTENT_PERCEPTUAL);
+
+
+    // Creates a Pipeline with 3D grid only
+    LUT = cmsPipelineAlloc(ContextID, 4, 4);
+    if (LUT == NULL) goto Error;
+
+
+    nChannels = cmsChannelsOf(ColorSpace);
+
+    CLUT = cmsStageAllocCLut16bit(ContextID, 17, nChannels, nChannels, NULL);
+    if (CLUT == NULL) goto Error;
+
+    if (!cmsStageSampleCLut16bit(CLUT, InkLimitingSampler, (void*) &Limit, 0)) goto Error;
+
+    if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, nChannels)) ||
+        !cmsPipelineInsertStage(LUT, cmsAT_END, CLUT) ||
+        !cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, nChannels)))
+        goto Error;
+
+    // Create tags
+    if (!SetTextTags(hICC, L"ink-limiting built-in")) goto Error;
+
+    if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) LUT))  goto Error;
+    if (!SetSeqDescTag(hICC, "ink-limiting built-in")) goto Error;
+
+    // cmsPipeline is already on virtual profile
+    cmsPipelineFree(LUT);
+
+    // Ok, done
+    return hICC;
+
+Error:
+    if (LUT != NULL)
+        cmsPipelineFree(LUT);
+
+    if (hICC != NULL)
+        cmsCloseProfile(hICC);
+
+    return NULL;
+}
+
+cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit)
+{
+    return cmsCreateInkLimitingDeviceLinkTHR(NULL, ColorSpace, Limit);
+}
+
+
+// Creates a fake Lab identity.
+cmsHPROFILE CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint)
+{
+    cmsHPROFILE hProfile;
+    cmsPipeline* LUT = NULL;
+
+    hProfile = cmsCreateRGBProfileTHR(ContextID, WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL);
+    if (hProfile == NULL) return NULL;
+
+    cmsSetProfileVersion(hProfile, 2.1);
+
+    cmsSetDeviceClass(hProfile, cmsSigAbstractClass);
+    cmsSetColorSpace(hProfile,  cmsSigLabData);
+    cmsSetPCS(hProfile,         cmsSigLabData);
+
+    if (!SetTextTags(hProfile, L"Lab identity built-in")) return NULL;
+
+    // An identity LUT is all we need
+    LUT = cmsPipelineAlloc(ContextID, 3, 3);
+    if (LUT == NULL) goto Error;
+
+    if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3)))
+        goto Error;
+
+    if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
+    cmsPipelineFree(LUT);
+
+    return hProfile;
+
+Error:
+
+    if (LUT != NULL)
+        cmsPipelineFree(LUT);
+
+    if (hProfile != NULL)
+        cmsCloseProfile(hProfile);
+
+    return NULL;
+}
+
+
+cmsHPROFILE CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint)
+{
+    return cmsCreateLab2ProfileTHR(NULL, WhitePoint);
+}
+
+
+// Creates a fake Lab V4 identity.
+cmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint)
+{
+    cmsHPROFILE hProfile;
+    cmsPipeline* LUT = NULL;
+
+    hProfile = cmsCreateRGBProfileTHR(ContextID, WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL);
+    if (hProfile == NULL) return NULL;
+
+    cmsSetProfileVersion(hProfile, 4.3);
+
+    cmsSetDeviceClass(hProfile, cmsSigAbstractClass);
+    cmsSetColorSpace(hProfile,  cmsSigLabData);
+    cmsSetPCS(hProfile,         cmsSigLabData);
+
+    if (!SetTextTags(hProfile, L"Lab identity built-in")) goto Error;
+
+    // An empty LUTs is all we need
+    LUT = cmsPipelineAlloc(ContextID, 3, 3);
+    if (LUT == NULL) goto Error;
+
+    if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)))
+        goto Error;
+
+    if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
+    cmsPipelineFree(LUT);
+
+    return hProfile;
+
+Error:
+
+    if (LUT != NULL)
+        cmsPipelineFree(LUT);
+
+    if (hProfile != NULL)
+        cmsCloseProfile(hProfile);
+
+    return NULL;
+}
+
+cmsHPROFILE CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint)
+{
+    return cmsCreateLab4ProfileTHR(NULL, WhitePoint);
+}
+
+
+// Creates a fake XYZ identity
+cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID)
+{
+    cmsHPROFILE hProfile;
+    cmsPipeline* LUT = NULL;
+
+    hProfile = cmsCreateRGBProfileTHR(ContextID, cmsD50_xyY(), NULL, NULL);
+    if (hProfile == NULL) return NULL;
+
+    cmsSetProfileVersion(hProfile, 4.3);
+
+    cmsSetDeviceClass(hProfile, cmsSigAbstractClass);
+    cmsSetColorSpace(hProfile,  cmsSigXYZData);
+    cmsSetPCS(hProfile,         cmsSigXYZData);
+
+    if (!SetTextTags(hProfile, L"XYZ identity built-in")) goto Error;
+
+    // An identity LUT is all we need
+    LUT = cmsPipelineAlloc(ContextID, 3, 3);
+    if (LUT == NULL) goto Error;
+
+    if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)))
+        goto Error;
+
+    if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
+    cmsPipelineFree(LUT);
+
+    return hProfile;
+
+Error:
+
+    if (LUT != NULL)
+        cmsPipelineFree(LUT);
+
+    if (hProfile != NULL)
+        cmsCloseProfile(hProfile);
+
+    return NULL;
+}
+
+
+cmsHPROFILE CMSEXPORT cmsCreateXYZProfile(void)
+{
+    return cmsCreateXYZProfileTHR(NULL);
+}
+
+
+//sRGB Curves are defined by:
+//
+//If  RÂ’sRGB,GÂ’sRGB, BÂ’sRGB < 0.04045
+//
+//    R =  RÂ’sRGB / 12.92
+//    G =  GÂ’sRGB / 12.92
+//    B =  BÂ’sRGB / 12.92
+//
+//
+//else if  RÂ’sRGB,GÂ’sRGB, BÂ’sRGB >= 0.04045
+//
+//    R = ((RÂ’sRGB + 0.055) / 1.055)^2.4
+//    G = ((GÂ’sRGB + 0.055) / 1.055)^2.4
+//    B = ((BÂ’sRGB + 0.055) / 1.055)^2.4
+
+static
+cmsToneCurve* Build_sRGBGamma(cmsContext ContextID)
+{
+    cmsFloat64Number Parameters[5];
+
+    Parameters[0] = 2.4;
+    Parameters[1] = 1. / 1.055;
+    Parameters[2] = 0.055 / 1.055;
+    Parameters[3] = 1. / 12.92;
+    Parameters[4] = 0.04045;
+
+    return cmsBuildParametricToneCurve(ContextID, 4, Parameters);
+}
+
+// Create the ICC virtual profile for sRGB space
+cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID)
+{
+       cmsCIExyY       D65;
+       cmsCIExyYTRIPLE Rec709Primaries = {
+                                   {0.6400, 0.3300, 1.0},
+                                   {0.3000, 0.6000, 1.0},
+                                   {0.1500, 0.0600, 1.0}
+                                   };
+       cmsToneCurve* Gamma22[3];
+       cmsHPROFILE  hsRGB;
+
+       cmsWhitePointFromTemp(&D65, 6504);
+       Gamma22[0] = Gamma22[1] = Gamma22[2] = Build_sRGBGamma(ContextID);
+       if (Gamma22[0] == NULL) return NULL;
+
+       hsRGB = cmsCreateRGBProfileTHR(ContextID, &D65, &Rec709Primaries, Gamma22);
+       cmsFreeToneCurve(Gamma22[0]);
+       if (hsRGB == NULL) return NULL;
+
+       if (!SetTextTags(hsRGB, L"sRGB built-in")) {
+           cmsCloseProfile(hsRGB);
+           return NULL;
+       }
+
+       return hsRGB;
+}
+
+cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void)
+{
+    return cmsCreate_sRGBProfileTHR(NULL);
+}
+
+
+
+typedef struct {
+                cmsFloat64Number Brightness;
+                cmsFloat64Number Contrast;
+                cmsFloat64Number Hue;
+                cmsFloat64Number Saturation;
+                cmsCIEXYZ WPsrc, WPdest;
+
+} BCHSWADJUSTS, *LPBCHSWADJUSTS;
+
+
+static
+int bchswSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+    cmsCIELab LabIn, LabOut;
+    cmsCIELCh LChIn, LChOut;
+    cmsCIEXYZ XYZ;
+    LPBCHSWADJUSTS bchsw = (LPBCHSWADJUSTS) Cargo;
+
+
+    cmsLabEncoded2Float(&LabIn, In);
+
+
+    cmsLab2LCh(&LChIn, &LabIn);
+
+    // Do some adjusts on LCh
+
+    LChOut.L = LChIn.L * bchsw ->Contrast + bchsw ->Brightness;
+    LChOut.C = LChIn.C + bchsw -> Saturation;
+    LChOut.h = LChIn.h + bchsw -> Hue;
+
+
+    cmsLCh2Lab(&LabOut, &LChOut);
+
+    // Move white point in Lab
+
+    cmsLab2XYZ(&bchsw ->WPsrc,  &XYZ, &LabOut);
+    cmsXYZ2Lab(&bchsw ->WPdest, &LabOut, &XYZ);
+
+    // Back to encoded
+
+    cmsFloat2LabEncoded(Out, &LabOut);
+
+    return TRUE;
+}
+
+
+// Creates an abstract profile operating in Lab space for Brightness,
+// contrast, Saturation and white point displacement
+
+cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID,
+    int nLUTPoints,
+    cmsFloat64Number Bright,
+    cmsFloat64Number Contrast,
+    cmsFloat64Number Hue,
+    cmsFloat64Number Saturation,
+    int TempSrc,
+    int TempDest)
+{
+    cmsHPROFILE hICC;
+    cmsPipeline* Pipeline;
+    BCHSWADJUSTS bchsw;
+    cmsCIExyY WhitePnt;
+    cmsStage* CLUT;
+    cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
+    int i;
+
+    bchsw.Brightness = Bright;
+    bchsw.Contrast   = Contrast;
+    bchsw.Hue        = Hue;
+    bchsw.Saturation = Saturation;
+
+    cmsWhitePointFromTemp(&WhitePnt, TempSrc );
+    cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
+
+    cmsWhitePointFromTemp(&WhitePnt, TempDest);
+    cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
+
+    hICC = cmsCreateProfilePlaceholder(ContextID);
+    if (!hICC)                          // can't allocate
+        return NULL;
+
+
+    cmsSetDeviceClass(hICC,      cmsSigAbstractClass);
+    cmsSetColorSpace(hICC,       cmsSigLabData);
+    cmsSetPCS(hICC,              cmsSigLabData);
+
+    cmsSetHeaderRenderingIntent(hICC,  INTENT_PERCEPTUAL);
+
+    // Creates a Pipeline with 3D grid only
+    Pipeline = cmsPipelineAlloc(ContextID, 3, 3);
+    if (Pipeline == NULL) {
+        cmsCloseProfile(hICC);
+        return NULL;
+    }
+
+    for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints;
+    CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL);
+    if (CLUT == NULL) return NULL;
+
+
+    if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) {
+
+        // Shouldn't reach here
+        goto Error;
+    }
+
+    if (!cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT)) {
+        goto Error;
+    }
+
+    // Create tags
+    if (!SetTextTags(hICC, L"BCHS built-in")) return NULL;
+
+    cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) cmsD50_XYZ());
+
+    cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline);
+
+    // Pipeline is already on virtual profile
+    cmsPipelineFree(Pipeline);
+
+    // Ok, done
+    return hICC;
+
+Error:
+    cmsPipelineFree(Pipeline);
+    cmsCloseProfile(hICC);
+    return NULL;
+}
+
+
+CMSAPI cmsHPROFILE   CMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints,
+                                                             cmsFloat64Number Bright,
+                                                             cmsFloat64Number Contrast,
+                                                             cmsFloat64Number Hue,
+                                                             cmsFloat64Number Saturation,
+                                                             int TempSrc,
+                                                             int TempDest)
+{
+    return cmsCreateBCHSWabstractProfileTHR(NULL, nLUTPoints, Bright, Contrast, Hue, Saturation, TempSrc, TempDest);
+}
+
+
+// Creates a fake NULL profile. This profile return 1 channel as always 0.
+// Is useful only for gamut checking tricks
+cmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID)
+{
+    cmsHPROFILE hProfile;
+    cmsPipeline* LUT = NULL;
+    cmsStage* PostLin;
+    cmsToneCurve* EmptyTab;
+    cmsUInt16Number Zero[2] = { 0, 0 };
+
+    hProfile = cmsCreateProfilePlaceholder(ContextID);
+    if (!hProfile)                          // can't allocate
+        return NULL;
+
+    cmsSetProfileVersion(hProfile, 4.3);
+
+    if (!SetTextTags(hProfile, L"NULL profile built-in")) goto Error;
+
+
+
+    cmsSetDeviceClass(hProfile, cmsSigOutputClass);
+    cmsSetColorSpace(hProfile,  cmsSigGrayData);
+    cmsSetPCS(hProfile,         cmsSigLabData);
+
+    // An empty LUTs is all we need
+    LUT = cmsPipelineAlloc(ContextID, 1, 1);
+    if (LUT == NULL) goto Error;
+
+    EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero);
+    PostLin = cmsStageAllocToneCurves(ContextID, 1, &EmptyTab);
+    cmsFreeToneCurve(EmptyTab);
+
+    if (!cmsPipelineInsertStage(LUT, cmsAT_END, PostLin))
+        goto Error;
+
+    if (!cmsWriteTag(hProfile, cmsSigBToA0Tag, (void*) LUT)) goto Error;
+    if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error;
+
+    cmsPipelineFree(LUT);
+    return hProfile;
+
+Error:
+
+    if (LUT != NULL)
+        cmsPipelineFree(LUT);
+
+    if (hProfile != NULL)
+        cmsCloseProfile(hProfile);
+
+    return NULL;
+}
+
+cmsHPROFILE CMSEXPORT cmsCreateNULLProfile(void)
+{
+    return cmsCreateNULLProfileTHR(NULL);
+}
+
+
+static
+int IsPCS(cmsColorSpaceSignature ColorSpace)
+{
+    return (ColorSpace == cmsSigXYZData ||
+            ColorSpace == cmsSigLabData);
+}
+
+
+static
+void FixColorSpaces(cmsHPROFILE hProfile,
+                              cmsColorSpaceSignature ColorSpace,
+                              cmsColorSpaceSignature PCS,
+                              cmsUInt32Number dwFlags)
+{
+    if (dwFlags & cmsFLAGS_GUESSDEVICECLASS) {
+
+            if (IsPCS(ColorSpace) && IsPCS(PCS)) {
+
+                    cmsSetDeviceClass(hProfile,      cmsSigAbstractClass);
+                    cmsSetColorSpace(hProfile,       ColorSpace);
+                    cmsSetPCS(hProfile,              PCS);
+                    return;
+            }
+
+            if (IsPCS(ColorSpace) && !IsPCS(PCS)) {
+
+                    cmsSetDeviceClass(hProfile, cmsSigOutputClass);
+                    cmsSetPCS(hProfile,         ColorSpace);
+                    cmsSetColorSpace(hProfile,  PCS);
+                    return;
+            }
+
+            if (IsPCS(PCS) && !IsPCS(ColorSpace)) {
+
+                   cmsSetDeviceClass(hProfile,  cmsSigInputClass);
+                   cmsSetColorSpace(hProfile,   ColorSpace);
+                   cmsSetPCS(hProfile,          PCS);
+                   return;
+            }
+    }
+
+    cmsSetDeviceClass(hProfile,      cmsSigLinkClass);
+    cmsSetColorSpace(hProfile,       ColorSpace);
+    cmsSetPCS(hProfile,              PCS);
+}
+
+
+
+// This function creates a named color profile dumping all the contents of transform to a single profile
+// In this way, LittleCMS may be used to "group" several named color databases into a single profile.
+// It has, however, several minor limitations. PCS is always Lab, which is not very critic since this
+// is the normal PCS for named color profiles.
+static
+cmsHPROFILE CreateNamedColorDevicelink(cmsHTRANSFORM xform)
+{
+    _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform;
+    cmsHPROFILE hICC = NULL;
+    int i, nColors;
+    cmsNAMEDCOLORLIST *nc2 = NULL, *Original = NULL;
+
+    // Create an empty placeholder
+    hICC = cmsCreateProfilePlaceholder(v->ContextID);
+    if (hICC == NULL) return NULL;
+
+    // Critical information
+    cmsSetDeviceClass(hICC, cmsSigNamedColorClass);
+    cmsSetColorSpace(hICC, v ->ExitColorSpace);
+    cmsSetPCS(hICC, cmsSigLabData);
+
+    // Tag profile with information
+    if (!SetTextTags(hICC, L"Named color devicelink")) goto Error;
+
+    Original = cmsGetNamedColorList(xform);
+    if (Original == NULL) goto Error;
+
+    nColors = cmsNamedColorCount(Original);
+    nc2     = cmsDupNamedColorList(Original);
+    if (nc2 == NULL) goto Error;
+
+    // Colorant count now depends on the output space
+    nc2 ->ColorantCount = cmsPipelineOutputChannels(v ->Lut);
+
+    // Make sure we have proper formatters
+    cmsChangeBuffersFormat(xform, TYPE_NAMED_COLOR_INDEX,
+        FLOAT_SH(0) | COLORSPACE_SH(_cmsLCMScolorSpace(v ->ExitColorSpace))
+        | BYTES_SH(2) | CHANNELS_SH(cmsChannelsOf(v ->ExitColorSpace)));
+
+    // Apply the transfor to colorants.
+    for (i=0; i < nColors; i++) {
+        cmsDoTransform(xform, &i, nc2 ->List[i].DeviceColorant, 1);
+    }
+
+    if (!cmsWriteTag(hICC, cmsSigNamedColor2Tag, (void*) nc2)) goto Error;
+    cmsFreeNamedColorList(nc2);
+
+    return hICC;
+
+Error:
+    if (hICC != NULL) cmsCloseProfile(hICC);
+    return NULL;
+}
+
+
+// This structure holds information about which MPU can be stored on a profile based on the version
+
+typedef struct {
+    cmsBool              IsV4;             // Is a V4 tag?
+    cmsTagSignature      RequiredTag;      // Set to 0 for both types
+    cmsTagTypeSignature  LutType;          // The LUT type
+    int                  nTypes;           // Number of types (up to 5)
+    cmsStageSignature    MpeTypes[5];      // 5 is the maximum number
+
+} cmsAllowedLUT;
+
+static const cmsAllowedLUT AllowedLUTTypes[] = {
+
+    { FALSE, 0,              cmsSigLut16Type,    4,  { cmsSigMatrixElemType,   cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},
+    { FALSE, 0,              cmsSigLut16Type,    3,  { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},
+    { FALSE, 0,              cmsSigLut16Type,    2,  { cmsSigCurveSetElemType, cmsSigCLutElemType}},
+    { TRUE , 0,              cmsSigLutAtoBType,  1,  { cmsSigCurveSetElemType }},
+    { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType,  3,  { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType } },
+    { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType,  3,  { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType   } },
+    { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType,  5,  { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }},
+    { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType,  1,  { cmsSigCurveSetElemType }},
+    { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType,  3,  { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }},
+    { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType,  3,  { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }},
+    { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType,  5,  { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }}
+};
+
+#define SIZE_OF_ALLOWED_LUT (sizeof(AllowedLUTTypes)/sizeof(cmsAllowedLUT))
+
+// Check a single entry
+static
+cmsBool CheckOne(const cmsAllowedLUT* Tab, const cmsPipeline* Lut)
+{
+    cmsStage* mpe;
+    int n;
+
+    for (n=0, mpe = Lut ->Elements; mpe != NULL; mpe = mpe ->Next, n++) {
+
+        if (n > Tab ->nTypes) return FALSE;
+        if (cmsStageType(mpe) != Tab ->MpeTypes[n]) return FALSE;
+    }
+
+    return (n == Tab ->nTypes);
+}
+
+
+static
+const cmsAllowedLUT* FindCombination(const cmsPipeline* Lut, cmsBool IsV4, cmsTagSignature DestinationTag)
+{
+    cmsUInt32Number n;
+
+    for (n=0; n < SIZE_OF_ALLOWED_LUT; n++) {
+
+        const cmsAllowedLUT* Tab = AllowedLUTTypes + n;
+
+        if (IsV4 ^ Tab -> IsV4) continue;
+        if ((Tab ->RequiredTag != 0) && (Tab ->RequiredTag != DestinationTag)) continue;
+
+        if (CheckOne(Tab, Lut)) return Tab;
+    }
+
+    return NULL;
+}
+
+
+// Does convert a transform into a device link profile
+cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags)
+{
+    cmsHPROFILE hProfile = NULL;
+    cmsUInt32Number FrmIn, FrmOut, ChansIn, ChansOut;
+    cmsUInt32Number ColorSpaceBitsIn, ColorSpaceBitsOut;
+    _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;
+    cmsPipeline* LUT = NULL;
+    cmsStage* mpe;
+    cmsContext ContextID = cmsGetTransformContextID(hTransform);
+    const cmsAllowedLUT* AllowedLUT;
+    cmsTagSignature DestinationTag;
+    cmsProfileClassSignature deviceClass; 
+
+    _cmsAssert(hTransform != NULL);
+
+    // Get the first mpe to check for named color
+    mpe = cmsPipelineGetPtrToFirstStage(xform ->Lut);
+
+    // Check if is a named color transform
+    if (mpe != NULL) {
+
+        if (cmsStageType(mpe) == cmsSigNamedColorElemType) {
+            return CreateNamedColorDevicelink(hTransform);
+        }
+    }
+
+    // First thing to do is to get a copy of the transformation
+    LUT = cmsPipelineDup(xform ->Lut);
+    if (LUT == NULL) return NULL;
+
+    // Time to fix the Lab2/Lab4 issue.
+    if ((xform ->EntryColorSpace == cmsSigLabData) && (Version < 4.0)) {
+
+        if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4curves(ContextID)))
+            goto Error;
+    }
+
+    // On the output side too
+    if ((xform ->ExitColorSpace) == cmsSigLabData && (Version < 4.0)) {
+
+        if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID)))
+            goto Error;
+    }
+
+
+    hProfile = cmsCreateProfilePlaceholder(ContextID);
+    if (!hProfile) goto Error;                    // can't allocate
+
+    cmsSetProfileVersion(hProfile, Version);
+
+    FixColorSpaces(hProfile, xform -> EntryColorSpace, xform -> ExitColorSpace, dwFlags);
+
+    // Optimize the LUT and precalculate a devicelink
+
+    ChansIn  = cmsChannelsOf(xform -> EntryColorSpace);
+    ChansOut = cmsChannelsOf(xform -> ExitColorSpace);
+
+    ColorSpaceBitsIn  = _cmsLCMScolorSpace(xform -> EntryColorSpace);
+    ColorSpaceBitsOut = _cmsLCMScolorSpace(xform -> ExitColorSpace);
+
+    FrmIn  = COLORSPACE_SH(ColorSpaceBitsIn) | CHANNELS_SH(ChansIn)|BYTES_SH(2);
+    FrmOut = COLORSPACE_SH(ColorSpaceBitsOut) | CHANNELS_SH(ChansOut)|BYTES_SH(2);
+
+    deviceClass = cmsGetDeviceClass(hProfile);
+
+     if (deviceClass == cmsSigOutputClass)
+         DestinationTag = cmsSigBToA0Tag;
+     else
+         DestinationTag = cmsSigAToB0Tag;
+
+    // Check if the profile/version can store the result
+    if (dwFlags & cmsFLAGS_FORCE_CLUT)
+        AllowedLUT = NULL;
+    else
+        AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag);
+
+    if (AllowedLUT == NULL) {
+
+        // Try to optimize
+        _cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags);
+        AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag);
+
+    }
+
+    // If no way, then force CLUT that for sure can be written
+    if (AllowedLUT == NULL) {
+
+        dwFlags |= cmsFLAGS_FORCE_CLUT;
+        _cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags);
+
+        // Put identity curves if needed
+        if (cmsPipelineGetPtrToFirstStage(LUT) ->Type != cmsSigCurveSetElemType)
+             if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn)))
+                 goto Error;
+
+        if (cmsPipelineGetPtrToLastStage(LUT) ->Type != cmsSigCurveSetElemType)
+             if (!cmsPipelineInsertStage(LUT, cmsAT_END,   _cmsStageAllocIdentityCurves(ContextID, ChansOut)))
+                 goto Error;
+
+        AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag);
+    }
+
+    // Somethings is wrong...
+    if (AllowedLUT == NULL) {
+        goto Error;
+    }
+
+
+    if (dwFlags & cmsFLAGS_8BITS_DEVICELINK)
+                     cmsPipelineSetSaveAs8bitsFlag(LUT, TRUE);
+
+    // Tag profile with information
+    if (!SetTextTags(hProfile, L"devicelink")) goto Error;
+
+    // Store result
+    if (!cmsWriteTag(hProfile, DestinationTag, LUT)) goto Error;
+
+
+    if (xform -> InputColorant != NULL) {
+           if (!cmsWriteTag(hProfile, cmsSigColorantTableTag, xform->InputColorant)) goto Error;
+    }
+
+    if (xform -> OutputColorant != NULL) {
+           if (!cmsWriteTag(hProfile, cmsSigColorantTableOutTag, xform->OutputColorant)) goto Error;
+    }
+
+    if ((deviceClass == cmsSigLinkClass) && (xform ->Sequence != NULL)) {
+        if (!_cmsWriteProfileSequence(hProfile, xform ->Sequence)) goto Error;
+    }
+
+    // Set the white point
+    if (deviceClass == cmsSigInputClass) {
+        if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->EntryWhitePoint)) goto Error;
+    }
+    else {
+         if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->ExitWhitePoint)) goto Error;
+    }
+
+  
+    // Per 7.2.15 in spec 4.3
+    cmsSetHeaderRenderingIntent(hProfile, xform ->RenderingIntent);
+
+    cmsPipelineFree(LUT);
+    return hProfile;
+
+Error:
+    if (LUT != NULL) cmsPipelineFree(LUT);
+    cmsCloseProfile(hProfile);
+    return NULL;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmswtpnt.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmswtpnt.c
new file mode 100644
index 0000000..903fdd7
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmswtpnt.c
@@ -0,0 +1,349 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2014 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// D50 - Widely used
+const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void)
+{
+    static cmsCIEXYZ D50XYZ = {cmsD50X, cmsD50Y, cmsD50Z};
+
+    return &D50XYZ;
+}
+
+const cmsCIExyY* CMSEXPORT cmsD50_xyY(void)
+{
+    static cmsCIExyY D50xyY;
+
+    cmsXYZ2xyY(&D50xyY, cmsD50_XYZ());
+
+    return &D50xyY;
+}
+
+// Obtains WhitePoint from Temperature
+cmsBool  CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK)
+{
+    cmsFloat64Number x, y;
+    cmsFloat64Number T, T2, T3;
+    // cmsFloat64Number M1, M2;
+
+    _cmsAssert(WhitePoint != NULL);
+
+    T = TempK;
+    T2 = T*T;            // Square
+    T3 = T2*T;           // Cube
+
+    // For correlated color temperature (T) between 4000K and 7000K:
+
+    if (T >= 4000. && T <= 7000.)
+    {
+        x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063;
+    }
+    else
+        // or for correlated color temperature (T) between 7000K and 25000K:
+
+        if (T > 7000.0 && T <= 25000.0)
+        {
+            x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040;
+        }
+        else {
+            cmsSignalError(0, cmsERROR_RANGE, "cmsWhitePointFromTemp: invalid temp");
+            return FALSE;
+        }
+
+        // Obtain y(x)
+
+        y = -3.000*(x*x) + 2.870*x - 0.275;
+
+        // wave factors (not used, but here for futures extensions)
+
+        // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y);
+        // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y);
+
+        WhitePoint -> x = x;
+        WhitePoint -> y = y;
+        WhitePoint -> Y = 1.0;
+
+        return TRUE;
+}
+
+
+
+typedef struct {
+
+    cmsFloat64Number mirek;  // temp (in microreciprocal kelvin)
+    cmsFloat64Number ut;     // u coord of intersection w/ blackbody locus
+    cmsFloat64Number vt;     // v coord of intersection w/ blackbody locus
+    cmsFloat64Number tt;     // slope of ISOTEMPERATURE. line
+
+    } ISOTEMPERATURE;
+
+static ISOTEMPERATURE isotempdata[] = {
+//  {Mirek, Ut,       Vt,      Tt      }
+    {0,     0.18006,  0.26352,  -0.24341},
+    {10,    0.18066,  0.26589,  -0.25479},
+    {20,    0.18133,  0.26846,  -0.26876},
+    {30,    0.18208,  0.27119,  -0.28539},
+    {40,    0.18293,  0.27407,  -0.30470},
+    {50,    0.18388,  0.27709,  -0.32675},
+    {60,    0.18494,  0.28021,  -0.35156},
+    {70,    0.18611,  0.28342,  -0.37915},
+    {80,    0.18740,  0.28668,  -0.40955},
+    {90,    0.18880,  0.28997,  -0.44278},
+    {100,   0.19032,  0.29326,  -0.47888},
+    {125,   0.19462,  0.30141,  -0.58204},
+    {150,   0.19962,  0.30921,  -0.70471},
+    {175,   0.20525,  0.31647,  -0.84901},
+    {200,   0.21142,  0.32312,  -1.0182 },
+    {225,   0.21807,  0.32909,  -1.2168 },
+    {250,   0.22511,  0.33439,  -1.4512 },
+    {275,   0.23247,  0.33904,  -1.7298 },
+    {300,   0.24010,  0.34308,  -2.0637 },
+    {325,   0.24702,  0.34655,  -2.4681 },
+    {350,   0.25591,  0.34951,  -2.9641 },
+    {375,   0.26400,  0.35200,  -3.5814 },
+    {400,   0.27218,  0.35407,  -4.3633 },
+    {425,   0.28039,  0.35577,  -5.3762 },
+    {450,   0.28863,  0.35714,  -6.7262 },
+    {475,   0.29685,  0.35823,  -8.5955 },
+    {500,   0.30505,  0.35907,  -11.324 },
+    {525,   0.31320,  0.35968,  -15.628 },
+    {550,   0.32129,  0.36011,  -23.325 },
+    {575,   0.32931,  0.36038,  -40.770 },
+    {600,   0.33724,  0.36051,  -116.45  }
+};
+
+#define NISO sizeof(isotempdata)/sizeof(ISOTEMPERATURE)
+
+
+// Robertson's method
+cmsBool  CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint)
+{
+    cmsUInt32Number j;
+    cmsFloat64Number us,vs;
+    cmsFloat64Number uj,vj,tj,di,dj,mi,mj;
+    cmsFloat64Number xs, ys;
+
+    _cmsAssert(WhitePoint != NULL);
+    _cmsAssert(TempK != NULL);
+
+    di = mi = 0;
+    xs = WhitePoint -> x;
+    ys = WhitePoint -> y;
+
+    // convert (x,y) to CIE 1960 (u,WhitePoint)
+
+    us = (2*xs) / (-xs + 6*ys + 1.5);
+    vs = (3*ys) / (-xs + 6*ys + 1.5);
+
+
+    for (j=0; j < NISO; j++) {
+
+        uj = isotempdata[j].ut;
+        vj = isotempdata[j].vt;
+        tj = isotempdata[j].tt;
+        mj = isotempdata[j].mirek;
+
+        dj = ((vs - vj) - tj * (us - uj)) / sqrt(1.0 + tj * tj);
+
+        if ((j != 0) && (di/dj < 0.0)) {
+
+            // Found a match
+            *TempK = 1000000.0 / (mi + (di / (di - dj)) * (mj - mi));
+            return TRUE;
+        }
+
+        di = dj;
+        mi = mj;
+    }
+
+    // Not found
+    return FALSE;
+}
+
+
+// Compute chromatic adaptation matrix using Chad as cone matrix
+
+static
+cmsBool ComputeChromaticAdaptation(cmsMAT3* Conversion,
+                                const cmsCIEXYZ* SourceWhitePoint,
+                                const cmsCIEXYZ* DestWhitePoint,
+                                const cmsMAT3* Chad)
+
+{
+
+    cmsMAT3 Chad_Inv;
+    cmsVEC3 ConeSourceXYZ, ConeSourceRGB;
+    cmsVEC3 ConeDestXYZ, ConeDestRGB;
+    cmsMAT3 Cone, Tmp;
+
+
+    Tmp = *Chad;
+    if (!_cmsMAT3inverse(&Tmp, &Chad_Inv)) return FALSE;
+
+    _cmsVEC3init(&ConeSourceXYZ, SourceWhitePoint -> X,
+                             SourceWhitePoint -> Y,
+                             SourceWhitePoint -> Z);
+
+    _cmsVEC3init(&ConeDestXYZ,   DestWhitePoint -> X,
+                             DestWhitePoint -> Y,
+                             DestWhitePoint -> Z);
+
+    _cmsMAT3eval(&ConeSourceRGB, Chad, &ConeSourceXYZ);
+    _cmsMAT3eval(&ConeDestRGB,   Chad, &ConeDestXYZ);
+
+    // Build matrix
+    _cmsVEC3init(&Cone.v[0], ConeDestRGB.n[0]/ConeSourceRGB.n[0],    0.0,  0.0);
+    _cmsVEC3init(&Cone.v[1], 0.0,   ConeDestRGB.n[1]/ConeSourceRGB.n[1],   0.0);
+    _cmsVEC3init(&Cone.v[2], 0.0,   0.0,   ConeDestRGB.n[2]/ConeSourceRGB.n[2]);
+
+
+    // Normalize
+    _cmsMAT3per(&Tmp, &Cone, Chad);
+    _cmsMAT3per(Conversion, &Chad_Inv, &Tmp);
+
+    return TRUE;
+}
+
+// Returns the final chrmatic adaptation from illuminant FromIll to Illuminant ToIll
+// The cone matrix can be specified in ConeMatrix. If NULL, Bradford is assumed
+cmsBool  _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll)
+{
+    cmsMAT3 LamRigg   = {{ // Bradford matrix
+        {{  0.8951,  0.2664, -0.1614 }},
+        {{ -0.7502,  1.7135,  0.0367 }},
+        {{  0.0389, -0.0685,  1.0296 }}
+    }};
+
+    if (ConeMatrix == NULL)
+        ConeMatrix = &LamRigg;
+
+    return ComputeChromaticAdaptation(r, FromIll, ToIll, ConeMatrix);
+}
+
+// Same as anterior, but assuming D50 destination. White point is given in xyY
+static
+cmsBool _cmsAdaptMatrixToD50(cmsMAT3* r, const cmsCIExyY* SourceWhitePt)
+{
+    cmsCIEXYZ Dn;
+    cmsMAT3 Bradford;
+    cmsMAT3 Tmp;
+
+    cmsxyY2XYZ(&Dn, SourceWhitePt);
+
+    if (!_cmsAdaptationMatrix(&Bradford, NULL, &Dn, cmsD50_XYZ())) return FALSE;
+
+    Tmp = *r;
+    _cmsMAT3per(r, &Bradford, &Tmp);
+
+    return TRUE;
+}
+
+// Build a White point, primary chromas transfer matrix from RGB to CIE XYZ
+// This is just an approximation, I am not handling all the non-linear
+// aspects of the RGB to XYZ process, and assumming that the gamma correction
+// has transitive property in the tranformation chain.
+//
+// the alghoritm:
+//
+//            - First I build the absolute conversion matrix using
+//              primaries in XYZ. This matrix is next inverted
+//            - Then I eval the source white point across this matrix
+//              obtaining the coeficients of the transformation
+//            - Then, I apply these coeficients to the original matrix
+//
+cmsBool _cmsBuildRGB2XYZtransferMatrix(cmsMAT3* r, const cmsCIExyY* WhitePt, const cmsCIExyYTRIPLE* Primrs)
+{
+    cmsVEC3 WhitePoint, Coef;
+    cmsMAT3 Result, Primaries;
+    cmsFloat64Number xn, yn;
+    cmsFloat64Number xr, yr;
+    cmsFloat64Number xg, yg;
+    cmsFloat64Number xb, yb;
+
+    xn = WhitePt -> x;
+    yn = WhitePt -> y;
+    xr = Primrs -> Red.x;
+    yr = Primrs -> Red.y;
+    xg = Primrs -> Green.x;
+    yg = Primrs -> Green.y;
+    xb = Primrs -> Blue.x;
+    yb = Primrs -> Blue.y;
+
+    // Build Primaries matrix
+    _cmsVEC3init(&Primaries.v[0], xr,        xg,         xb);
+    _cmsVEC3init(&Primaries.v[1], yr,        yg,         yb);
+    _cmsVEC3init(&Primaries.v[2], (1-xr-yr), (1-xg-yg),  (1-xb-yb));
+
+
+    // Result = Primaries ^ (-1) inverse matrix
+    if (!_cmsMAT3inverse(&Primaries, &Result))
+        return FALSE;
+
+
+    _cmsVEC3init(&WhitePoint, xn/yn, 1.0, (1.0-xn-yn)/yn);
+
+    // Across inverse primaries ...
+    _cmsMAT3eval(&Coef, &Result, &WhitePoint);
+
+    // Give us the Coefs, then I build transformation matrix
+    _cmsVEC3init(&r -> v[0], Coef.n[VX]*xr,          Coef.n[VY]*xg,          Coef.n[VZ]*xb);
+    _cmsVEC3init(&r -> v[1], Coef.n[VX]*yr,          Coef.n[VY]*yg,          Coef.n[VZ]*yb);
+    _cmsVEC3init(&r -> v[2], Coef.n[VX]*(1.0-xr-yr), Coef.n[VY]*(1.0-xg-yg), Coef.n[VZ]*(1.0-xb-yb));
+
+
+    return _cmsAdaptMatrixToD50(r, WhitePt);
+
+}
+
+
+// Adapts a color to a given illuminant. Original color is expected to have
+// a SourceWhitePt white point.
+cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result,
+                                       const cmsCIEXYZ* SourceWhitePt,
+                                       const cmsCIEXYZ* Illuminant,
+                                       const cmsCIEXYZ* Value)
+{
+    cmsMAT3 Bradford;
+    cmsVEC3 In, Out;
+
+    _cmsAssert(Result != NULL);
+    _cmsAssert(SourceWhitePt != NULL);
+    _cmsAssert(Illuminant != NULL);
+    _cmsAssert(Value != NULL);
+
+    if (!_cmsAdaptationMatrix(&Bradford, NULL, SourceWhitePt, Illuminant)) return FALSE;
+
+    _cmsVEC3init(&In, Value -> X, Value -> Y, Value -> Z);
+    _cmsMAT3eval(&Out, &Bradford, &In);
+
+    Result -> X = Out.n[0];
+    Result -> Y = Out.n[1];
+    Result -> Z = Out.n[2];
+
+    return TRUE;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsxform.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsxform.c
new file mode 100644
index 0000000..eddb9bd
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsxform.c
@@ -0,0 +1,1132 @@
+//---------------------------------------------------------------------------------
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2014 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// Transformations stuff
+// -----------------------------------------------------------------------
+
+#define DEFAULT_OBSERVER_ADAPTATION_STATE 1.0
+
+// The Context0 observer adaptation state.
+_cmsAdaptationStateChunkType _cmsAdaptationStateChunk = { DEFAULT_OBSERVER_ADAPTATION_STATE };
+
+// Init and duplicate observer adaptation state
+void _cmsAllocAdaptationStateChunk(struct _cmsContext_struct* ctx, 
+                                   const struct _cmsContext_struct* src)
+{
+    static _cmsAdaptationStateChunkType AdaptationStateChunk = { DEFAULT_OBSERVER_ADAPTATION_STATE };
+    void* from;
+     
+    if (src != NULL) {
+        from = src ->chunks[AdaptationStateContext];       
+    }
+    else {
+       from = &AdaptationStateChunk;
+    }
+    
+    ctx ->chunks[AdaptationStateContext] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsAdaptationStateChunkType));     
+}
+
+
+// Sets adaptation state for absolute colorimetric intent in the given context.  Adaptation state applies on all 
+// but cmsCreateExtendedTransformTHR().  Little CMS can handle incomplete adaptation states.
+cmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d)
+{
+    cmsFloat64Number prev;
+    _cmsAdaptationStateChunkType* ptr = (_cmsAdaptationStateChunkType*) _cmsContextGetClientChunk(ContextID, AdaptationStateContext);
+
+    // Get previous value for return
+    prev = ptr ->AdaptationState;
+
+    // Set the value if d is positive or zero
+    if (d >= 0.0) {
+
+        ptr ->AdaptationState = d;
+    }
+
+    // Always return previous value
+    return prev;
+}
+
+
+// The adaptation state may be defaulted by this function. If you don't like it, use the extended transform routine
+cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d)
+{    
+    return cmsSetAdaptationStateTHR(NULL, d);
+}
+
+// -----------------------------------------------------------------------
+
+// Alarm codes for 16-bit transformations, because the fixed range of containers there are
+// no values left to mark out of gamut. 
+
+#define DEFAULT_ALARM_CODES_VALUE {0x7F00, 0x7F00, 0x7F00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+
+_cmsAlarmCodesChunkType _cmsAlarmCodesChunk = { DEFAULT_ALARM_CODES_VALUE };
+
+// Sets the codes used to mark out-out-gamut on Proofing transforms for a given context. Values are meant to be 
+// encoded in 16 bits.
+void CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID, const cmsUInt16Number AlarmCodesP[cmsMAXCHANNELS])
+{
+    _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(ContextID, AlarmCodesContext);
+       
+    _cmsAssert(ContextAlarmCodes != NULL); // Can't happen
+    
+    memcpy(ContextAlarmCodes->AlarmCodes, AlarmCodesP, sizeof(ContextAlarmCodes->AlarmCodes));    
+}
+
+// Gets the current codes used to mark out-out-gamut on Proofing transforms for the given context.
+// Values are meant to be encoded in 16 bits.
+void CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID, cmsUInt16Number AlarmCodesP[cmsMAXCHANNELS])
+{
+    _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(ContextID, AlarmCodesContext);
+
+    _cmsAssert(ContextAlarmCodes != NULL); // Can't happen
+
+    memcpy(AlarmCodesP, ContextAlarmCodes->AlarmCodes, sizeof(ContextAlarmCodes->AlarmCodes));
+}
+
+void CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS])
+{
+    _cmsAssert(NewAlarm != NULL);
+
+    cmsSetAlarmCodesTHR(NULL, NewAlarm);
+}
+
+void CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number OldAlarm[cmsMAXCHANNELS])
+{ 
+    _cmsAssert(OldAlarm != NULL);
+    cmsGetAlarmCodesTHR(NULL, OldAlarm);
+}
+
+
+// Init and duplicate alarm codes
+void _cmsAllocAlarmCodesChunk(struct _cmsContext_struct* ctx, 
+                              const struct _cmsContext_struct* src)
+{
+    static _cmsAlarmCodesChunkType AlarmCodesChunk = { DEFAULT_ALARM_CODES_VALUE };
+    void* from;
+     
+    if (src != NULL) {
+        from = src ->chunks[AlarmCodesContext];       
+    }
+    else {
+       from = &AlarmCodesChunk;
+    }
+    
+    ctx ->chunks[AlarmCodesContext] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsAlarmCodesChunkType));     
+}
+
+// -----------------------------------------------------------------------
+
+// Get rid of transform resources
+void CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform)
+{
+    _cmsTRANSFORM* p = (_cmsTRANSFORM*) hTransform;
+
+    _cmsAssert(p != NULL);
+
+    if (p -> GamutCheck)
+        cmsPipelineFree(p -> GamutCheck);
+
+    if (p -> Lut)
+        cmsPipelineFree(p -> Lut);
+
+    if (p ->InputColorant)
+        cmsFreeNamedColorList(p ->InputColorant);
+
+    if (p -> OutputColorant)
+        cmsFreeNamedColorList(p ->OutputColorant);
+
+    if (p ->Sequence)
+        cmsFreeProfileSequenceDescription(p ->Sequence);
+
+    if (p ->UserData)
+        p ->FreeUserData(p ->ContextID, p ->UserData);
+
+    _cmsFree(p ->ContextID, (void *) p);
+}
+
+// Apply transform.
+void CMSEXPORT cmsDoTransform(cmsHTRANSFORM  Transform,
+                              const void* InputBuffer,
+                              void* OutputBuffer,
+                              cmsUInt32Number Size)
+
+{
+    _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform;
+
+    p -> xform(p, InputBuffer, OutputBuffer, Size, Size);
+}
+
+
+// Apply transform.
+void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM  Transform,
+                              const void* InputBuffer,
+                              void* OutputBuffer,
+                              cmsUInt32Number Size, cmsUInt32Number Stride)
+
+{
+    _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform;
+
+    p -> xform(p, InputBuffer, OutputBuffer, Size, Stride);
+}
+
+
+// Transform routines ----------------------------------------------------------------------------------------------------------
+
+// Float xform converts floats. Since there are no performance issues, one routine does all job, including gamut check.
+// Note that because extended range, we can use a -1.0 value for out of gamut in this case.
+static
+void FloatXFORM(_cmsTRANSFORM* p,
+                const void* in,
+                void* out, cmsUInt32Number Size, cmsUInt32Number Stride)
+{
+    cmsUInt8Number* accum;
+    cmsUInt8Number* output;
+    cmsFloat32Number fIn[cmsMAXCHANNELS], fOut[cmsMAXCHANNELS];
+    cmsFloat32Number OutOfGamut;
+    cmsUInt32Number i, j;
+
+    accum  = (cmsUInt8Number*)  in;
+    output = (cmsUInt8Number*)  out;
+
+    for (i=0; i < Size; i++) {
+
+        accum = p -> FromInputFloat(p, fIn, accum, Stride);
+
+        // Any gamut chack to do?
+        if (p ->GamutCheck != NULL) {
+
+            // Evaluate gamut marker.
+            cmsPipelineEvalFloat( fIn, &OutOfGamut, p ->GamutCheck);
+
+            // Is current color out of gamut?
+            if (OutOfGamut > 0.0) {
+
+                // Certainly, out of gamut
+                for (j=0; j < cmsMAXCHANNELS; j++)
+                    fOut[j] = -1.0;
+
+            }
+            else {
+                // No, proceed normally
+                cmsPipelineEvalFloat(fIn, fOut, p -> Lut);
+            }
+        }
+        else {
+
+            // No gamut check at all
+            cmsPipelineEvalFloat(fIn, fOut, p -> Lut);
+        }
+
+        // Back to asked representation
+        output = p -> ToOutputFloat(p, fOut, output, Stride);
+    }
+}
+
+
+static
+void NullFloatXFORM(_cmsTRANSFORM* p,
+                    const void* in,
+                    void* out, 
+                    cmsUInt32Number Size,
+                    cmsUInt32Number Stride)
+{
+    cmsUInt8Number* accum;
+    cmsUInt8Number* output;
+    cmsFloat32Number fIn[cmsMAXCHANNELS];
+    cmsUInt32Number i, n;
+
+    accum  = (cmsUInt8Number*)  in;
+    output = (cmsUInt8Number*)  out;
+    n = Size;                   
+
+    for (i=0; i < n; i++) {
+
+        accum  = p -> FromInputFloat(p, fIn, accum, Stride);
+        output = p -> ToOutputFloat(p, fIn, output, Stride);
+    }
+}
+
+// 16 bit precision -----------------------------------------------------------------------------------------------------------
+
+// Null transformation, only applies formatters. No cach?static
+void NullXFORM(_cmsTRANSFORM* p,
+               const void* in,
+               void* out, cmsUInt32Number Size,
+               cmsUInt32Number Stride)
+{
+    cmsUInt8Number* accum;
+    cmsUInt8Number* output;
+    cmsUInt16Number wIn[cmsMAXCHANNELS];
+    cmsUInt32Number i, n;
+
+    accum  = (cmsUInt8Number*)  in;
+    output = (cmsUInt8Number*)  out;
+    n = Size;                    // Buffer len
+
+    for (i=0; i < n; i++) {
+
+        accum  = p -> FromInput(p, wIn, accum, Stride);
+        output = p -> ToOutput(p, wIn, output, Stride);
+    }
+}
+
+
+// No gamut check, no cache, 16 bits
+static
+void PrecalculatedXFORM(_cmsTRANSFORM* p,
+                        const void* in,
+                        void* out, cmsUInt32Number Size, cmsUInt32Number Stride)
+{
+    register cmsUInt8Number* accum;
+    register cmsUInt8Number* output;
+    cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS];
+    cmsUInt32Number i, n;
+
+    accum  = (cmsUInt8Number*)  in;
+    output = (cmsUInt8Number*)  out;
+    n = Size;
+
+    for (i=0; i < n; i++) {
+
+        accum = p -> FromInput(p, wIn, accum, Stride);
+        p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data);
+        output = p -> ToOutput(p, wOut, output, Stride);
+    }
+}
+
+
+// Auxiliar: Handle precalculated gamut check. The retrieval of context may be alittle bit slow, but this function is not critical.
+static
+void TransformOnePixelWithGamutCheck(_cmsTRANSFORM* p,
+                                     const cmsUInt16Number wIn[],
+                                     cmsUInt16Number wOut[])
+{
+    cmsUInt16Number wOutOfGamut;
+
+    p ->GamutCheck ->Eval16Fn(wIn, &wOutOfGamut, p ->GamutCheck ->Data);
+    if (wOutOfGamut >= 1) {
+
+        cmsUInt16Number i;
+        _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(p->ContextID, AlarmCodesContext);        
+
+        for (i=0; i < p ->Lut->OutputChannels; i++) {
+
+            wOut[i] = ContextAlarmCodes ->AlarmCodes[i];
+        }
+    }
+    else
+        p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data);
+}
+
+// Gamut check, No cach? 16 bits.
+static
+void PrecalculatedXFORMGamutCheck(_cmsTRANSFORM* p,
+                                  const void* in,
+                                  void* out, cmsUInt32Number Size, cmsUInt32Number Stride)
+{
+    cmsUInt8Number* accum;
+    cmsUInt8Number* output;
+    cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS];
+    cmsUInt32Number i, n;
+
+    accum  = (cmsUInt8Number*)  in;
+    output = (cmsUInt8Number*)  out;
+    n = Size;                    // Buffer len
+
+    for (i=0; i < n; i++) {
+
+        accum = p -> FromInput(p, wIn, accum, Stride);
+        TransformOnePixelWithGamutCheck(p, wIn, wOut);
+        output = p -> ToOutput(p, wOut, output, Stride);
+    }
+}
+
+
+// No gamut check, Cach? 16 bits,
+static
+void CachedXFORM(_cmsTRANSFORM* p,
+                 const void* in,
+                 void* out, cmsUInt32Number Size, cmsUInt32Number Stride)
+{
+    cmsUInt8Number* accum;
+    cmsUInt8Number* output;
+    cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS];
+    cmsUInt32Number i, n;
+    _cmsCACHE Cache;
+
+    accum  = (cmsUInt8Number*)  in;
+    output = (cmsUInt8Number*)  out;
+    n = Size;                    // Buffer len
+
+    // Empty buffers for quick memcmp
+    memset(wIn,  0, sizeof(wIn));
+    memset(wOut, 0, sizeof(wOut));
+
+    // Get copy of zero cache
+    memcpy(&Cache, &p ->Cache, sizeof(Cache));
+
+    for (i=0; i < n; i++) {
+
+        accum = p -> FromInput(p, wIn, accum, Stride);
+
+        if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) {
+
+            memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut));
+        }
+        else {
+
+            p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data);
+
+            memcpy(Cache.CacheIn,  wIn,  sizeof(Cache.CacheIn));
+            memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut));
+        }
+
+        output = p -> ToOutput(p, wOut, output, Stride);
+    }
+
+}
+
+
+// All those nice features together
+static
+void CachedXFORMGamutCheck(_cmsTRANSFORM* p,
+                           const void* in,
+                           void* out, cmsUInt32Number Size, cmsUInt32Number Stride)
+{
+       cmsUInt8Number* accum;
+       cmsUInt8Number* output;
+       cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS];
+       cmsUInt32Number i, n;
+       _cmsCACHE Cache;
+
+       accum  = (cmsUInt8Number*)  in;
+       output = (cmsUInt8Number*)  out;
+       n = Size;                    // Buffer len
+
+       // Empty buffers for quick memcmp
+       memset(wIn,  0, sizeof(cmsUInt16Number) * cmsMAXCHANNELS);
+       memset(wOut, 0, sizeof(cmsUInt16Number) * cmsMAXCHANNELS);
+
+       // Get copy of zero cache
+       memcpy(&Cache, &p ->Cache, sizeof(Cache));
+
+       for (i=0; i < n; i++) {
+
+            accum = p -> FromInput(p, wIn, accum, Stride);
+
+            if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) {
+                    memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut));
+            }
+            else {
+                    TransformOnePixelWithGamutCheck(p, wIn, wOut);
+                    memcpy(Cache.CacheIn, wIn, sizeof(Cache.CacheIn));
+                    memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut));
+            }
+
+            output = p -> ToOutput(p, wOut, output, Stride);
+       }
+
+}
+
+// -------------------------------------------------------------------------------------------------------------
+
+// List of used-defined transform factories
+typedef struct _cmsTransformCollection_st {
+
+    _cmsTransformFactory  Factory;
+    struct _cmsTransformCollection_st *Next;
+
+} _cmsTransformCollection;
+
+// The linked list head
+_cmsTransformPluginChunkType _cmsTransformPluginChunk = { NULL };
+
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupPluginTransformList(struct _cmsContext_struct* ctx, 
+                                               const struct _cmsContext_struct* src)
+{
+   _cmsTransformPluginChunkType newHead = { NULL };
+   _cmsTransformCollection*  entry;
+   _cmsTransformCollection*  Anterior = NULL;
+   _cmsTransformPluginChunkType* head = (_cmsTransformPluginChunkType*) src->chunks[TransformPlugin];
+
+    // Walk the list copying all nodes
+   for (entry = head->TransformCollection;
+        entry != NULL;
+        entry = entry ->Next) {
+
+            _cmsTransformCollection *newEntry = ( _cmsTransformCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTransformCollection));
+   
+            if (newEntry == NULL) 
+                return;
+
+            // We want to keep the linked list order, so this is a little bit tricky
+            newEntry -> Next = NULL;
+            if (Anterior)
+                Anterior -> Next = newEntry;
+     
+            Anterior = newEntry;
+
+            if (newHead.TransformCollection == NULL)
+                newHead.TransformCollection = newEntry;
+    }
+
+  ctx ->chunks[TransformPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTransformPluginChunkType));
+}
+
+void _cmsAllocTransformPluginChunk(struct _cmsContext_struct* ctx, 
+                                        const struct _cmsContext_struct* src)
+{
+    if (src != NULL) {
+
+        // Copy all linked list
+        DupPluginTransformList(ctx, src);
+    }
+    else {
+        static _cmsTransformPluginChunkType TransformPluginChunkType = { NULL };
+        ctx ->chunks[TransformPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TransformPluginChunkType, sizeof(_cmsTransformPluginChunkType));
+    }
+}
+
+
+
+// Register new ways to transform
+cmsBool  _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Data)
+{
+    cmsPluginTransform* Plugin = (cmsPluginTransform*) Data;
+    _cmsTransformCollection* fl;
+    _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID,TransformPlugin);
+
+    if (Data == NULL) {
+
+        // Free the chain. Memory is safely freed at exit
+        ctx->TransformCollection = NULL;
+        return TRUE;
+    }
+
+    // Factory callback is required
+    if (Plugin ->Factory == NULL) return FALSE;
+
+
+    fl = (_cmsTransformCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsTransformCollection));
+    if (fl == NULL) return FALSE;
+
+    // Copy the parameters
+    fl ->Factory = Plugin ->Factory;
+
+    // Keep linked list
+    fl ->Next = ctx->TransformCollection;
+    ctx->TransformCollection = fl;
+
+    // All is ok
+    return TRUE;
+}
+
+
+void CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn)
+{
+    _cmsAssert(CMMcargo != NULL);
+    CMMcargo ->UserData = ptr;
+    CMMcargo ->FreeUserData = FreePrivateDataFn;
+}
+
+// returns the pointer defined by the plug-in to store private data
+void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo)
+{
+    _cmsAssert(CMMcargo != NULL);
+    return CMMcargo ->UserData;
+}
+
+// returns the current formatters
+void CMSEXPORT _cmsGetTransformFormatters16(struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput)
+{
+     _cmsAssert(CMMcargo != NULL);
+     if (FromInput) *FromInput = CMMcargo ->FromInput;
+     if (ToOutput)  *ToOutput  = CMMcargo ->ToOutput;
+}
+
+void CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput)
+{
+     _cmsAssert(CMMcargo != NULL);
+     if (FromInput) *FromInput = CMMcargo ->FromInputFloat;
+     if (ToOutput)  *ToOutput  = CMMcargo ->ToOutputFloat;
+}
+
+
+// Allocate transform struct and set it to defaults. Ask the optimization plug-in about if those formats are proper
+// for separated transforms. If this is the case,
+static
+_cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut,
+                                               cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
+{
+     _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID, TransformPlugin);
+     _cmsTransformCollection* Plugin;
+
+    // Allocate needed memory
+    _cmsTRANSFORM* p = (_cmsTRANSFORM*) _cmsMallocZero(ContextID, sizeof(_cmsTRANSFORM));
+    if (!p) return NULL;
+
+    // Store the proposed pipeline
+    p ->Lut = lut;
+
+    // Let's see if any plug-in want to do the transform by itself
+    for (Plugin = ctx ->TransformCollection;
+        Plugin != NULL;
+        Plugin = Plugin ->Next) {
+
+            if (Plugin ->Factory(&p->xform, &p->UserData, &p ->FreeUserData, &p ->Lut, InputFormat, OutputFormat, dwFlags)) {
+                
+                // Last plugin in the declaration order takes control. We just keep
+                // the original parameters as a logging. 
+                // Note that cmsFLAGS_CAN_CHANGE_FORMATTER is not set, so by default 
+                // an optimized transform is not reusable. The plug-in can, however, change
+                // the flags and make it suitable.
+
+                p ->ContextID       = ContextID;               
+                p ->InputFormat     = *InputFormat;
+                p ->OutputFormat    = *OutputFormat;
+                p ->dwOriginalFlags = *dwFlags;
+               
+                // Fill the formatters just in case the optimized routine is interested.
+                // No error is thrown if the formatter doesn't exist. It is up to the optimization 
+                // factory to decide what to do in those cases.
+                p ->FromInput      = _cmsGetFormatter(ContextID, *InputFormat,  cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16;
+                p ->ToOutput       = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16;
+                p ->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat,  cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat;
+                p ->ToOutputFloat  = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat;
+
+                return p;
+            }
+    }
+
+    // Not suitable for the transform plug-in, let's check  the pipeline plug-in
+    if (p ->Lut != NULL)
+        _cmsOptimizePipeline(ContextID, &p->Lut, Intent, InputFormat, OutputFormat, dwFlags);
+
+    // Check whatever this is a true floating point transform
+    if (_cmsFormatterIsFloat(*InputFormat) && _cmsFormatterIsFloat(*OutputFormat)) {
+
+        // Get formatter function always return a valid union, but the contents of this union may be NULL.
+        p ->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat,  cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat;
+        p ->ToOutputFloat  = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat;
+        *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER;
+
+        if (p ->FromInputFloat == NULL || p ->ToOutputFloat == NULL) {
+
+            cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format");
+            _cmsFree(ContextID, p);
+            return NULL;
+        }
+
+        if (*dwFlags & cmsFLAGS_NULLTRANSFORM) {
+
+            p ->xform = NullFloatXFORM;
+        }
+        else {
+            // Float transforms don't use cach? always are non-NULL
+            p ->xform = FloatXFORM;
+        }
+
+    }
+    else {
+
+        if (*InputFormat == 0 && *OutputFormat == 0) {
+            p ->FromInput = p ->ToOutput = NULL;
+            *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER;
+        }
+        else {
+
+            int BytesPerPixelInput;
+
+            p ->FromInput = _cmsGetFormatter(ContextID, *InputFormat,  cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16;
+            p ->ToOutput  = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16;
+
+            if (p ->FromInput == NULL || p ->ToOutput == NULL) {
+
+                cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format");
+                _cmsFree(ContextID, p);
+                return NULL;
+            }
+
+            BytesPerPixelInput = T_BYTES(p ->InputFormat);
+            if (BytesPerPixelInput == 0 || BytesPerPixelInput >= 2)
+                   *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER;
+
+        }
+
+        if (*dwFlags & cmsFLAGS_NULLTRANSFORM) {
+
+            p ->xform = NullXFORM;
+        }
+        else {
+            if (*dwFlags & cmsFLAGS_NOCACHE) {
+
+                if (*dwFlags & cmsFLAGS_GAMUTCHECK)
+                    p ->xform = PrecalculatedXFORMGamutCheck;  // Gamut check, no cach?                else
+                    p ->xform = PrecalculatedXFORM;  // No cach? no gamut check
+            }
+            else {
+
+                if (*dwFlags & cmsFLAGS_GAMUTCHECK)
+                    p ->xform = CachedXFORMGamutCheck;    // Gamut check, cach?                else
+                    p ->xform = CachedXFORM;  // No gamut check, cach?
+            }
+        }
+    }
+
+    p ->InputFormat     = *InputFormat;
+    p ->OutputFormat    = *OutputFormat;
+    p ->dwOriginalFlags = *dwFlags;
+    p ->ContextID       = ContextID;
+    p ->UserData        = NULL;
+    return p;
+}
+
+static
+cmsBool GetXFormColorSpaces(int nProfiles, cmsHPROFILE hProfiles[], cmsColorSpaceSignature* Input, cmsColorSpaceSignature* Output)
+{
+    cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut;
+    cmsColorSpaceSignature PostColorSpace;
+    int i;
+
+    if (nProfiles <= 0) return FALSE;
+    if (hProfiles[0] == NULL) return FALSE;
+
+    *Input = PostColorSpace = cmsGetColorSpace(hProfiles[0]);
+
+    for (i=0; i < nProfiles; i++) {
+
+        cmsProfileClassSignature cls;
+        cmsHPROFILE hProfile = hProfiles[i];
+
+        int lIsInput = (PostColorSpace != cmsSigXYZData) &&
+                       (PostColorSpace != cmsSigLabData);
+
+        if (hProfile == NULL) return FALSE;
+
+        cls = cmsGetDeviceClass(hProfile);
+
+        if (cls == cmsSigNamedColorClass) {
+
+            ColorSpaceIn    = cmsSig1colorData;
+            ColorSpaceOut   = (nProfiles > 1) ? cmsGetPCS(hProfile) : cmsGetColorSpace(hProfile);
+        }
+        else
+        if (lIsInput || (cls == cmsSigLinkClass)) {
+
+            ColorSpaceIn    = cmsGetColorSpace(hProfile);
+            ColorSpaceOut   = cmsGetPCS(hProfile);
+        }
+        else
+        {
+            ColorSpaceIn    = cmsGetPCS(hProfile);
+            ColorSpaceOut   = cmsGetColorSpace(hProfile);
+        }
+
+        if (i==0)
+            *Input = ColorSpaceIn;
+
+        PostColorSpace = ColorSpaceOut;
+    }
+
+    *Output = PostColorSpace;
+
+    return TRUE;
+}
+
+// Check colorspace
+static
+cmsBool  IsProperColorSpace(cmsColorSpaceSignature Check, cmsUInt32Number dwFormat)
+{
+    int Space1 = T_COLORSPACE(dwFormat);
+    int Space2 = _cmsLCMScolorSpace(Check);
+
+    if (Space1 == PT_ANY) return TRUE;
+    if (Space1 == Space2) return TRUE;
+
+    if (Space1 == PT_LabV2 && Space2 == PT_Lab) return TRUE;
+    if (Space1 == PT_Lab   && Space2 == PT_LabV2) return TRUE;
+
+    return FALSE;
+}
+
+// ----------------------------------------------------------------------------------------------------------------
+
+static
+void SetWhitePoint(cmsCIEXYZ* wtPt, const cmsCIEXYZ* src)
+{
+    if (src == NULL) {
+        wtPt ->X = cmsD50X;
+        wtPt ->Y = cmsD50Y;
+        wtPt ->Z = cmsD50Z;
+    }
+    else {
+        wtPt ->X = src->X;
+        wtPt ->Y = src->Y;
+        wtPt ->Z = src->Z;
+    }
+
+}
+
+// New to lcms 2.0 -- have all parameters available.
+cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID,
+                                                   cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[],
+                                                   cmsBool  BPC[],
+                                                   cmsUInt32Number Intents[],
+                                                   cmsFloat64Number AdaptationStates[],
+                                                   cmsHPROFILE hGamutProfile,
+                                                   cmsUInt32Number nGamutPCSposition,
+                                                   cmsUInt32Number InputFormat,
+                                                   cmsUInt32Number OutputFormat,
+                                                   cmsUInt32Number dwFlags)
+{
+    _cmsTRANSFORM* xform;    
+    cmsColorSpaceSignature EntryColorSpace;
+    cmsColorSpaceSignature ExitColorSpace;
+    cmsPipeline* Lut;
+    cmsUInt32Number LastIntent = Intents[nProfiles-1];
+
+    // If it is a fake transform
+    if (dwFlags & cmsFLAGS_NULLTRANSFORM)
+    {
+        return AllocEmptyTransform(ContextID, NULL, INTENT_PERCEPTUAL, &InputFormat, &OutputFormat, &dwFlags);
+    }
+
+    // If gamut check is requested, make sure we have a gamut profile
+    if (dwFlags & cmsFLAGS_GAMUTCHECK) {
+        if (hGamutProfile == NULL) dwFlags &= ~cmsFLAGS_GAMUTCHECK;
+    }
+
+    // On floating point transforms, inhibit cache
+    if (_cmsFormatterIsFloat(InputFormat) || _cmsFormatterIsFloat(OutputFormat))
+        dwFlags |= cmsFLAGS_NOCACHE;
+
+    // Mark entry/exit spaces
+    if (!GetXFormColorSpaces(nProfiles, hProfiles, &EntryColorSpace, &ExitColorSpace)) {
+        cmsSignalError(ContextID, cmsERROR_NULL, "NULL input profiles on transform");
+        return NULL;
+    }
+
+    // Check if proper colorspaces
+    if (!IsProperColorSpace(EntryColorSpace, InputFormat)) {
+        cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Wrong input color space on transform");
+        return NULL;
+    }
+
+    if (!IsProperColorSpace(ExitColorSpace, OutputFormat)) {
+        cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Wrong output color space on transform");
+        return NULL;
+    }
+
+    // Create a pipeline with all transformations
+    Lut = _cmsLinkProfiles(ContextID, nProfiles, Intents, hProfiles, BPC, AdaptationStates, dwFlags);
+    if (Lut == NULL) {
+        cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Couldn't link the profiles");
+        return NULL;
+    }
+
+    // Check channel count
+    if ((cmsChannelsOf(EntryColorSpace) != cmsPipelineInputChannels(Lut)) ||
+        (cmsChannelsOf(ExitColorSpace)  != cmsPipelineOutputChannels(Lut))) {
+        cmsPipelineFree(Lut);
+        cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Channel count doesn't match. Profile is corrupted");
+        return NULL;
+    }
+
+
+    // All seems ok
+    xform = AllocEmptyTransform(ContextID, Lut, LastIntent, &InputFormat, &OutputFormat, &dwFlags);
+    if (xform == NULL) {
+        return NULL;
+    }
+
+    // Keep values
+    xform ->EntryColorSpace = EntryColorSpace;
+    xform ->ExitColorSpace  = ExitColorSpace;
+    xform ->RenderingIntent = Intents[nProfiles-1];
+
+    // Take white points
+    SetWhitePoint(&xform->EntryWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[0], cmsSigMediaWhitePointTag));
+    SetWhitePoint(&xform->ExitWhitePoint,  (cmsCIEXYZ*) cmsReadTag(hProfiles[nProfiles-1], cmsSigMediaWhitePointTag));
+   
+
+    // Create a gamut check LUT if requested
+    if (hGamutProfile != NULL && (dwFlags & cmsFLAGS_GAMUTCHECK))
+        xform ->GamutCheck  = _cmsCreateGamutCheckPipeline(ContextID, hProfiles,
+                                                        BPC, Intents,
+                                                        AdaptationStates,
+                                                        nGamutPCSposition,
+                                                        hGamutProfile);
+
+
+    // Try to read input and output colorant table
+    if (cmsIsTag(hProfiles[0], cmsSigColorantTableTag)) {
+
+        // Input table can only come in this way.
+        xform ->InputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[0], cmsSigColorantTableTag));
+    }
+
+    // Output is a little bit more complex.
+    if (cmsGetDeviceClass(hProfiles[nProfiles-1]) == cmsSigLinkClass) {
+
+        // This tag may exist only on devicelink profiles.
+        if (cmsIsTag(hProfiles[nProfiles-1], cmsSigColorantTableOutTag)) {
+
+            // It may be NULL if error
+            xform ->OutputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[nProfiles-1], cmsSigColorantTableOutTag));
+        }
+
+    } else {
+
+        if (cmsIsTag(hProfiles[nProfiles-1], cmsSigColorantTableTag)) {
+
+            xform -> OutputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[nProfiles-1], cmsSigColorantTableTag));
+        }
+    }
+
+    // Store the sequence of profiles
+    if (dwFlags & cmsFLAGS_KEEP_SEQUENCE) {
+        xform ->Sequence = _cmsCompileProfileSequence(ContextID, nProfiles, hProfiles);
+    }
+    else
+        xform ->Sequence = NULL;
+
+    // If this is a cached transform, init first value, which is zero (16 bits only)
+    if (!(dwFlags & cmsFLAGS_NOCACHE)) {
+
+        memset(&xform ->Cache.CacheIn, 0, sizeof(xform ->Cache.CacheIn));
+
+        if (xform ->GamutCheck != NULL) {
+            TransformOnePixelWithGamutCheck(xform, xform ->Cache.CacheIn, xform->Cache.CacheOut);
+        }
+        else {
+
+            xform ->Lut ->Eval16Fn(xform ->Cache.CacheIn, xform->Cache.CacheOut, xform -> Lut->Data);
+        }
+
+    }
+
+    return (cmsHTRANSFORM) xform;
+}
+
+// Multiprofile transforms: Gamut check is not available here, as it is unclear from which profile the gamut comes.
+cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID,
+                                                       cmsHPROFILE hProfiles[],
+                                                       cmsUInt32Number nProfiles,
+                                                       cmsUInt32Number InputFormat,
+                                                       cmsUInt32Number OutputFormat,
+                                                       cmsUInt32Number Intent,
+                                                       cmsUInt32Number dwFlags)
+{
+    cmsUInt32Number i;
+    cmsBool BPC[256];
+    cmsUInt32Number Intents[256];
+    cmsFloat64Number AdaptationStates[256];
+
+    if (nProfiles <= 0 || nProfiles > 255) {
+         cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles);
+        return NULL;
+    }
+
+    for (i=0; i < nProfiles; i++) {
+        BPC[i] = dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION ? TRUE : FALSE;
+        Intents[i] = Intent;
+        AdaptationStates[i] = cmsSetAdaptationStateTHR(ContextID, -1);
+    }
+
+
+    return cmsCreateExtendedTransform(ContextID, nProfiles, hProfiles, BPC, Intents, AdaptationStates, NULL, 0, InputFormat, OutputFormat, dwFlags);
+}
+
+
+
+cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],
+                                                  cmsUInt32Number nProfiles,
+                                                  cmsUInt32Number InputFormat,
+                                                  cmsUInt32Number OutputFormat,
+                                                  cmsUInt32Number Intent,
+                                                  cmsUInt32Number dwFlags)
+{
+
+    if (nProfiles <= 0 || nProfiles > 255) {
+         cmsSignalError(NULL, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles);
+         return NULL;
+    }
+
+    return cmsCreateMultiprofileTransformTHR(cmsGetProfileContextID(hProfiles[0]),
+                                                  hProfiles,
+                                                  nProfiles,
+                                                  InputFormat,
+                                                  OutputFormat,
+                                                  Intent,
+                                                  dwFlags);
+}
+
+cmsHTRANSFORM CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID,
+                                              cmsHPROFILE Input,
+                                              cmsUInt32Number InputFormat,
+                                              cmsHPROFILE Output,
+                                              cmsUInt32Number OutputFormat,
+                                              cmsUInt32Number Intent,
+                                              cmsUInt32Number dwFlags)
+{
+
+    cmsHPROFILE hArray[2];
+
+    hArray[0] = Input;
+    hArray[1] = Output;
+
+    return cmsCreateMultiprofileTransformTHR(ContextID, hArray, Output == NULL ? 1 : 2, InputFormat, OutputFormat, Intent, dwFlags);
+}
+
+CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransform(cmsHPROFILE Input,
+                                                  cmsUInt32Number InputFormat,
+                                                  cmsHPROFILE Output,
+                                                  cmsUInt32Number OutputFormat,
+                                                  cmsUInt32Number Intent,
+                                                  cmsUInt32Number dwFlags)
+{
+    return cmsCreateTransformTHR(cmsGetProfileContextID(Input), Input, InputFormat, Output, OutputFormat, Intent, dwFlags);
+}
+
+
+cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID,
+                                                   cmsHPROFILE InputProfile,
+                                                   cmsUInt32Number InputFormat,
+                                                   cmsHPROFILE OutputProfile,
+                                                   cmsUInt32Number OutputFormat,
+                                                   cmsHPROFILE ProofingProfile,
+                                                   cmsUInt32Number nIntent,
+                                                   cmsUInt32Number ProofingIntent,
+                                                   cmsUInt32Number dwFlags)
+{
+    cmsHPROFILE hArray[4];
+    cmsUInt32Number Intents[4];
+    cmsBool  BPC[4];
+    cmsFloat64Number Adaptation[4];
+    cmsBool  DoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION) ? TRUE : FALSE;
+
+
+    hArray[0]  = InputProfile; hArray[1] = ProofingProfile; hArray[2]  = ProofingProfile;               hArray[3] = OutputProfile;
+    Intents[0] = nIntent;      Intents[1] = nIntent;        Intents[2] = INTENT_RELATIVE_COLORIMETRIC;  Intents[3] = ProofingIntent;
+    BPC[0]     = DoBPC;        BPC[1] = DoBPC;              BPC[2] = 0;                                 BPC[3] = 0;
+
+    Adaptation[0] = Adaptation[1] = Adaptation[2] = Adaptation[3] = cmsSetAdaptationStateTHR(ContextID, -1);
+
+    if (!(dwFlags & (cmsFLAGS_SOFTPROOFING|cmsFLAGS_GAMUTCHECK)))
+        return cmsCreateTransformTHR(ContextID, InputProfile, InputFormat, OutputProfile, OutputFormat, nIntent, dwFlags);
+
+    return cmsCreateExtendedTransform(ContextID, 4, hArray, BPC, Intents, Adaptation,
+                                        ProofingProfile, 1, InputFormat, OutputFormat, dwFlags);
+
+}
+
+
+cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile,
+                                                   cmsUInt32Number InputFormat,
+                                                   cmsHPROFILE OutputProfile,
+                                                   cmsUInt32Number OutputFormat,
+                                                   cmsHPROFILE ProofingProfile,
+                                                   cmsUInt32Number nIntent,
+                                                   cmsUInt32Number ProofingIntent,
+                                                   cmsUInt32Number dwFlags)
+{
+    return cmsCreateProofingTransformTHR(cmsGetProfileContextID(InputProfile),
+                                                   InputProfile,
+                                                   InputFormat,
+                                                   OutputProfile,
+                                                   OutputFormat,
+                                                   ProofingProfile,
+                                                   nIntent,
+                                                   ProofingIntent,
+                                                   dwFlags);
+}
+
+
+// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed
+cmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform)
+{
+    _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;
+
+    if (xform == NULL) return NULL;
+    return xform -> ContextID;
+}
+
+// Grab the input/output formats
+cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform)
+{
+    _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;
+
+    if (xform == NULL) return 0;
+    return xform->InputFormat;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform)
+{
+    _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;
+
+    if (xform == NULL) return 0;
+    return xform->OutputFormat;
+}
+
+// For backwards compatibility
+cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform,
+                                         cmsUInt32Number InputFormat,
+                                         cmsUInt32Number OutputFormat)
+{
+
+    _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;
+    cmsFormatter16 FromInput, ToOutput;
+
+
+    // We only can afford to change formatters if previous transform is at least 16 bits
+    if (!(xform ->dwOriginalFlags & cmsFLAGS_CAN_CHANGE_FORMATTER)) {
+
+        cmsSignalError(xform ->ContextID, cmsERROR_NOT_SUITABLE, "cmsChangeBuffersFormat works only on transforms created originally with at least 16 bits of precision");
+        return FALSE;
+    }
+
+    FromInput = _cmsGetFormatter(xform->ContextID, InputFormat,  cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16;
+    ToOutput  = _cmsGetFormatter(xform->ContextID, OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16;
+
+    if (FromInput == NULL || ToOutput == NULL) {
+
+        cmsSignalError(xform -> ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format");
+        return FALSE;
+    }
+
+    xform ->InputFormat  = InputFormat;
+    xform ->OutputFormat = OutputFormat;
+    xform ->FromInput    = FromInput;
+    xform ->ToOutput     = ToOutput;
+    return TRUE;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/lcms2_internal.h b/core/src/fxcodec/lcms2/lcms2-2.6/src/lcms2_internal.h
new file mode 100644
index 0000000..5119218
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/lcms2_internal.h
@@ -0,0 +1,1032 @@
+//<<<+++OPENSOURCE
+//<<<+++OPENSOURCE_MUST_BEGIN COMMENT==TRUE
+//
+//  Little Color Management System
+//  Copyright (c) 1998-2014 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#ifndef _lcms_internal_H
+
+// Include plug-in foundation
+#ifndef _lcms_plugin_H
+#   include "../include/lcms2_plugin.h"
+#endif
+
+// ctype is part of C99 as per 7.1.2
+#include <ctype.h>
+
+// assert macro is part of C99 as per 7.2
+#include <assert.h>
+
+// Some needed constants
+#ifndef M_PI
+#       define M_PI        3.14159265358979323846
+#endif
+
+#ifndef M_LOG10E
+#       define M_LOG10E    0.434294481903251827651
+#endif
+
+// BorlandC 5.5, VC2003 are broken on that
+#if defined(__BORLANDC__) || (_MSC_VER < 1400) // 1400 == VC++ 8.0
+#define sinf(x) (float)sin((float)x)
+#define sqrtf(x) (float)sqrt((float)x)
+#endif
+
+
+// Alignment of ICC file format uses 4 bytes (cmsUInt32Number)
+#define _cmsALIGNLONG(x) (((x)+(sizeof(cmsUInt32Number)-1)) & ~(sizeof(cmsUInt32Number)-1))
+
+// Alignment to memory pointer
+#define _cmsALIGNMEM(x)  (((x)+(sizeof(void *) - 1)) & ~(sizeof(void *) - 1))
+
+// Maximum encodeable values in floating point
+#define MAX_ENCODEABLE_XYZ  (1.0 + 32767.0/32768.0)
+#define MIN_ENCODEABLE_ab2  (-128.0)
+#define MAX_ENCODEABLE_ab2  ((65535.0/256.0) - 128.0)
+#define MIN_ENCODEABLE_ab4  (-128.0)
+#define MAX_ENCODEABLE_ab4  (127.0)
+
+// Maximum of channels for internal pipeline evaluation
+#define MAX_STAGE_CHANNELS  128
+
+// Unused parameter warning supression
+#define cmsUNUSED_PARAMETER(x) ((void)x)
+
+// The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999).
+// unfortunately VisualC++ does not conform that
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+#   define cmsINLINE __inline
+#else
+#   define cmsINLINE static inline
+#endif
+
+// Other replacement functions
+#ifdef _MSC_VER
+# ifndef snprintf
+#       define snprintf  _snprintf
+# endif
+# ifndef vsnprintf
+#       define vsnprintf  _vsnprintf
+# endif
+#endif
+
+
+// A fast way to convert from/to 16 <-> 8 bits
+#define FROM_8_TO_16(rgb) (cmsUInt16Number) ((((cmsUInt16Number) (rgb)) << 8)|(rgb))
+#define FROM_16_TO_8(rgb) (cmsUInt8Number) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF)
+
+// Code analysis is broken on asserts
+#ifdef _MSC_VER
+#    if (_MSC_VER >= 1500)
+#            define _cmsAssert(a)  { assert((a)); __analysis_assume((a)); }
+#     else
+#            define _cmsAssert(a)   assert((a))
+#     endif
+#else
+#      define _cmsAssert(a)   assert((a))
+#endif
+
+//---------------------------------------------------------------------------------
+
+// Determinant lower than that are assumed zero (used on matrix invert)
+#define MATRIX_DET_TOLERANCE    0.0001
+
+//---------------------------------------------------------------------------------
+
+// Fixed point
+#define FIXED_TO_INT(x)         ((x)>>16)
+#define FIXED_REST_TO_INT(x)    ((x)&0xFFFFU)
+#define ROUND_FIXED_TO_INT(x)   (((x)+0x8000)>>16)
+
+cmsINLINE cmsS15Fixed16Number _cmsToFixedDomain(int a)                   { return a + ((a + 0x7fff) / 0xffff); }
+cmsINLINE int                 _cmsFromFixedDomain(cmsS15Fixed16Number a) { return a - ((a + 0x7fff) >> 16); }
+
+// -----------------------------------------------------------------------------------------------------------
+
+// Fast floor conversion logic. Thanks to Sree Kotay and Stuart Nixon
+// note than this only works in the range ..-32767...+32767 because
+// mantissa is interpreted as 15.16 fixed point.
+// The union is to avoid pointer aliasing overoptimization.
+cmsINLINE int _cmsQuickFloor(cmsFloat64Number val)
+{
+#ifdef CMS_DONT_USE_FAST_FLOOR
+    return (int) floor(val);
+#else
+    const cmsFloat64Number _lcms_double2fixmagic = 68719476736.0 * 1.5;  // 2^36 * 1.5, (52-16=36) uses limited precision to floor
+    union {
+        cmsFloat64Number val;
+        int halves[2];
+    } temp;
+
+    temp.val = val + _lcms_double2fixmagic;
+
+#ifdef CMS_USE_BIG_ENDIAN
+    return temp.halves[1] >> 16;
+#else
+    return temp.halves[0] >> 16;
+#endif
+#endif
+}
+
+// Fast floor restricted to 0..65535.0
+cmsINLINE cmsUInt16Number _cmsQuickFloorWord(cmsFloat64Number d)
+{
+    return (cmsUInt16Number) _cmsQuickFloor(d - 32767.0) + 32767U;
+}
+
+// Floor to word, taking care of saturation
+cmsINLINE cmsUInt16Number _cmsQuickSaturateWord(cmsFloat64Number d)
+{
+    d += 0.5;
+    if (d <= 0) return 0;
+    if (d >= 65535.0) return 0xffff;
+
+    return _cmsQuickFloorWord(d);
+}
+
+
+// Pthread support --------------------------------------------------------------------
+#ifndef CMS_NO_PTHREADS
+
+// This is the threading support. Unfortunately, it has to be platform-dependent because 
+// windows does not support pthreads. 
+
+#ifdef CMS_IS_WINDOWS_
+
+#define WIN32_LEAN_AND_MEAN 1
+#include <windows.h>
+
+
+// From: http://locklessinc.com/articles/pthreads_on_windows/
+// The pthreads API has an initialization macro that has no correspondence to anything in 
+// the windows API. By investigating the internal definition of the critical section type, 
+// one may work out how to initialize one without calling InitializeCriticalSection(). 
+// The trick here is that InitializeCriticalSection() is not allowed to fail. It tries 
+// to allocate a critical section debug object, but if no memory is available, it sets 
+// the pointer to a specific value. (One would expect that value to be NULL, but it is 
+// actually (void *)-1 for some reason.) Thus we can use this special value for that 
+// pointer, and the critical section code will work.
+
+// The other important part of the critical section type to initialize is the number 
+// of waiters. This controls whether or not the mutex is locked. Fortunately, this 
+// part of the critical section is unlikely to change. Apparently, many programs 
+// already test critical sections to see if they are locked using this value, so 
+// Microsoft felt that it was necessary to keep it set at -1 for an unlocked critical
+// section, even when they changed the underlying algorithm to be more scalable. 
+// The final parts of the critical section object are unimportant, and can be set 
+// to zero for their defaults. This yields an initialization macro:
+
+typedef CRITICAL_SECTION _cmsMutex;
+
+#define CMS_MUTEX_INITIALIZER {(void*) -1,-1,0,0,0,0}
+
+cmsINLINE int _cmsLockPrimitive(_cmsMutex *m)
+{
+	EnterCriticalSection(m);
+	return 0;
+}
+
+cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m)
+{
+	LeaveCriticalSection(m);
+	return 0;
+}
+	
+cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m)
+{
+	InitializeCriticalSection(m);
+	return 0;
+}
+
+cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m)
+{
+	DeleteCriticalSection(m);
+	return 0;
+}
+
+cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m)
+{
+	EnterCriticalSection(m);
+	return 0;
+}
+
+cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m)
+{
+	LeaveCriticalSection(m);
+	return 0;
+}
+
+#else
+
+// Rest of the wide world
+#include <pthread.h>
+
+#define CMS_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
+typedef pthread_mutex_t _cmsMutex;
+
+
+cmsINLINE int _cmsLockPrimitive(_cmsMutex *m)
+{
+	return pthread_mutex_lock(m);
+}
+
+cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m)
+{
+	return pthread_mutex_unlock(m);
+}
+	
+cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m)
+{
+	return pthread_mutex_init(m, NULL);
+}
+
+cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m)
+{
+	return pthread_mutex_destroy(m);
+}
+
+cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m)
+{
+	return pthread_mutex_lock(m);
+}
+
+cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m)
+{
+	return pthread_mutex_unlock(m);
+}
+
+#endif
+#else
+
+#define CMS_MUTEX_INITIALIZER 0
+typedef int _cmsMutex;
+
+
+cmsINLINE int _cmsLockPrimitive(_cmsMutex *m)
+{
+	return 0;
+    cmsUNUSED_PARAMETER(m);
+}
+
+cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m)
+{
+	return 0;
+    cmsUNUSED_PARAMETER(m);
+}
+	
+cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m)
+{
+	return 0;
+    cmsUNUSED_PARAMETER(m);
+}
+
+cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m)
+{
+	return 0;
+    cmsUNUSED_PARAMETER(m);
+}
+
+cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m)
+{
+	return 0;
+    cmsUNUSED_PARAMETER(m);
+}
+
+cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m)
+{
+	return 0;
+    cmsUNUSED_PARAMETER(m);
+}
+#endif
+
+// Plug-In registration ---------------------------------------------------------------
+
+// Specialized function for plug-in memory management. No pairing free() since whole pool is freed at once.
+void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size);
+
+// Memory management
+cmsBool   _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Interpolation
+cmsBool  _cmsRegisterInterpPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Parametric curves
+cmsBool  _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Formatters management
+cmsBool  _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Tag type management
+cmsBool  _cmsRegisterTagTypePlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Tag management
+cmsBool  _cmsRegisterTagPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Intent management
+cmsBool  _cmsRegisterRenderingIntentPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Multi Process elements
+cmsBool  _cmsRegisterMultiProcessElementPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Optimization
+cmsBool  _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Transform
+cmsBool  _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Mutex
+cmsBool _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// ---------------------------------------------------------------------------------------------------------
+
+// Suballocators. 
+typedef struct _cmsSubAllocator_chunk_st {
+
+    cmsUInt8Number* Block;
+    cmsUInt32Number BlockSize;
+    cmsUInt32Number Used;
+
+    struct _cmsSubAllocator_chunk_st* next;
+
+} _cmsSubAllocator_chunk;
+
+
+typedef struct {
+
+    cmsContext ContextID;
+    _cmsSubAllocator_chunk* h;
+
+} _cmsSubAllocator;
+
+
+_cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial);
+void              _cmsSubAllocDestroy(_cmsSubAllocator* s);
+void*             _cmsSubAlloc(_cmsSubAllocator* s, cmsUInt32Number size);
+void*             _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size);
+
+// ----------------------------------------------------------------------------------
+
+// The context clients. 
+typedef enum {
+
+    UserPtr,            // User-defined pointer
+    Logger,
+    AlarmCodesContext,
+    AdaptationStateContext, 
+    MemPlugin,
+    InterpPlugin,
+    CurvesPlugin,
+    FormattersPlugin,
+    TagTypePlugin,
+    TagPlugin,
+    IntentPlugin,
+    MPEPlugin,
+    OptimizationPlugin,
+    TransformPlugin,
+    MutexPlugin,
+
+    // Last in list
+    MemoryClientMax
+
+} _cmsMemoryClient;
+
+
+// Container for memory management plug-in.
+typedef struct {
+
+    _cmsMallocFnPtrType     MallocPtr;    
+    _cmsMalloZerocFnPtrType MallocZeroPtr;
+    _cmsFreeFnPtrType       FreePtr;
+    _cmsReallocFnPtrType    ReallocPtr;
+    _cmsCallocFnPtrType     CallocPtr;
+    _cmsDupFnPtrType        DupPtr;
+
+} _cmsMemPluginChunkType;
+
+// Copy memory management function pointers from plug-in to chunk, taking care of missing routines
+void  _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr);
+
+// Internal structure for context
+struct _cmsContext_struct {
+    
+    struct _cmsContext_struct* Next;  // Points to next context in the new style
+    _cmsSubAllocator* MemPool;        // The memory pool that stores context data
+    
+    void* chunks[MemoryClientMax];    // array of pointers to client chunks. Memory itself is hold in the suballocator. 
+                                      // If NULL, then it reverts to global Context0
+
+    _cmsMemPluginChunkType DefaultMemoryManager;  // The allocators used for creating the context itself. Cannot be overriden
+};
+
+// Returns a pointer to a valid context structure, including the global one if id is zero. 
+// Verifies the magic number.
+struct _cmsContext_struct* _cmsGetContext(cmsContext ContextID);
+
+// Returns the block assigned to the specific zone. 
+void*     _cmsContextGetClientChunk(cmsContext id, _cmsMemoryClient mc);
+
+
+// Chunks of context memory by plug-in client -------------------------------------------------------
+
+// Those structures encapsulates all variables needed by the several context clients (mostly plug-ins)
+
+// Container for error logger -- not a plug-in
+typedef struct {
+
+    cmsLogErrorHandlerFunction LogErrorHandler;  // Set to NULL for Context0 fallback
+
+} _cmsLogErrorChunkType;
+
+// The global Context0 storage for error logger
+extern  _cmsLogErrorChunkType  _cmsLogErrorChunk;
+
+// Allocate and init error logger container. 
+void _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx, 
+                            const struct _cmsContext_struct* src);
+
+// Container for alarm codes -- not a plug-in
+typedef struct {
+   
+    cmsUInt16Number AlarmCodes[cmsMAXCHANNELS];
+
+} _cmsAlarmCodesChunkType;
+
+// The global Context0 storage for alarm codes
+extern  _cmsAlarmCodesChunkType _cmsAlarmCodesChunk;
+
+// Allocate and init alarm codes container. 
+void _cmsAllocAlarmCodesChunk(struct _cmsContext_struct* ctx, 
+                            const struct _cmsContext_struct* src);
+
+// Container for adaptation state -- not a plug-in
+typedef struct {
+    
+    cmsFloat64Number  AdaptationState;
+
+} _cmsAdaptationStateChunkType;
+
+// The global Context0 storage for adaptation state
+extern  _cmsAdaptationStateChunkType    _cmsAdaptationStateChunk;
+
+// Allocate and init adaptation state container.
+void _cmsAllocAdaptationStateChunk(struct _cmsContext_struct* ctx, 
+                                   const struct _cmsContext_struct* src);
+
+
+// The global Context0 storage for memory management
+extern  _cmsMemPluginChunkType _cmsMemPluginChunk;
+
+// Allocate and init memory management container.
+void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, 
+                             const struct _cmsContext_struct* src);
+
+// Container for interpolation plug-in
+typedef struct {
+
+    cmsInterpFnFactory Interpolators;
+
+} _cmsInterpPluginChunkType;
+
+// The global Context0 storage for interpolation plug-in
+extern  _cmsInterpPluginChunkType _cmsInterpPluginChunk;
+
+// Allocate and init interpolation container.
+void _cmsAllocInterpPluginChunk(struct _cmsContext_struct* ctx, 
+                                const struct _cmsContext_struct* src);
+
+// Container for parametric curves plug-in
+typedef struct {
+
+    struct _cmsParametricCurvesCollection_st* ParametricCurves;
+
+} _cmsCurvesPluginChunkType;
+
+// The global Context0 storage for tone curves plug-in
+extern  _cmsCurvesPluginChunkType _cmsCurvesPluginChunk;
+
+// Allocate and init parametric curves container.
+void _cmsAllocCurvesPluginChunk(struct _cmsContext_struct* ctx, 
+                                                      const struct _cmsContext_struct* src);
+
+// Container for formatters plug-in
+typedef struct {
+
+    struct _cms_formatters_factory_list* FactoryList;
+
+} _cmsFormattersPluginChunkType;
+
+// The global Context0 storage for formatters plug-in
+extern  _cmsFormattersPluginChunkType _cmsFormattersPluginChunk;
+
+// Allocate and init formatters container.
+void _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx, 
+                                                       const struct _cmsContext_struct* src);
+
+// This chunk type is shared by TagType plug-in and MPE Plug-in
+typedef struct {
+
+    struct _cmsTagTypeLinkedList_st* TagTypes;
+
+} _cmsTagTypePluginChunkType;
+
+
+// The global Context0 storage for tag types plug-in
+extern  _cmsTagTypePluginChunkType      _cmsTagTypePluginChunk;
+
+
+// The global Context0 storage for mult process elements plug-in
+extern  _cmsTagTypePluginChunkType      _cmsMPETypePluginChunk;
+
+// Allocate and init Tag types container.
+void _cmsAllocTagTypePluginChunk(struct _cmsContext_struct* ctx, 
+                                                        const struct _cmsContext_struct* src);
+// Allocate and init MPE container.
+void _cmsAllocMPETypePluginChunk(struct _cmsContext_struct* ctx, 
+                                                        const struct _cmsContext_struct* src);
+// Container for tag plug-in
+typedef struct {
+   
+    struct _cmsTagLinkedList_st* Tag;
+
+} _cmsTagPluginChunkType;
+
+
+// The global Context0 storage for tag plug-in
+extern  _cmsTagPluginChunkType _cmsTagPluginChunk;
+
+// Allocate and init Tag container.
+void _cmsAllocTagPluginChunk(struct _cmsContext_struct* ctx, 
+                                                      const struct _cmsContext_struct* src); 
+
+// Container for intents plug-in
+typedef struct {
+
+    struct _cms_intents_list* Intents;
+
+} _cmsIntentsPluginChunkType;
+
+
+// The global Context0 storage for intents plug-in
+extern  _cmsIntentsPluginChunkType _cmsIntentsPluginChunk;
+
+// Allocate and init intents container.
+void _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx, 
+                                                        const struct _cmsContext_struct* src); 
+
+// Container for optimization plug-in
+typedef struct {
+
+    struct _cmsOptimizationCollection_st* OptimizationCollection;
+
+} _cmsOptimizationPluginChunkType;
+
+
+// The global Context0 storage for optimizers plug-in
+extern  _cmsOptimizationPluginChunkType _cmsOptimizationPluginChunk;
+
+// Allocate and init optimizers container.
+void _cmsAllocOptimizationPluginChunk(struct _cmsContext_struct* ctx, 
+                                         const struct _cmsContext_struct* src);
+
+// Container for transform plug-in
+typedef struct {
+
+    struct _cmsTransformCollection_st* TransformCollection;
+
+} _cmsTransformPluginChunkType;
+
+// The global Context0 storage for full-transform replacement plug-in
+extern  _cmsTransformPluginChunkType _cmsTransformPluginChunk;
+
+// Allocate and init transform container.
+void _cmsAllocTransformPluginChunk(struct _cmsContext_struct* ctx, 
+                                        const struct _cmsContext_struct* src);
+
+// Container for mutex plug-in
+typedef struct {
+
+    _cmsCreateMutexFnPtrType  CreateMutexPtr;
+    _cmsDestroyMutexFnPtrType DestroyMutexPtr;
+    _cmsLockMutexFnPtrType    LockMutexPtr;
+    _cmsUnlockMutexFnPtrType  UnlockMutexPtr;
+
+} _cmsMutexPluginChunkType;
+
+// The global Context0 storage for mutex plug-in
+extern  _cmsMutexPluginChunkType _cmsMutexPluginChunk;
+
+// Allocate and init mutex container.
+void _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx, 
+                                        const struct _cmsContext_struct* src);
+
+// ----------------------------------------------------------------------------------
+// MLU internal representation
+typedef struct {
+
+    cmsUInt16Number Language;
+    cmsUInt16Number Country;
+
+    cmsUInt32Number StrW;       // Offset to current unicode string
+    cmsUInt32Number Len;        // Length in bytes
+
+} _cmsMLUentry;
+
+struct _cms_MLU_struct {
+
+    cmsContext ContextID;
+
+    // The directory
+    int AllocatedEntries;
+    int UsedEntries;
+    _cmsMLUentry* Entries;     // Array of pointers to strings allocated in MemPool
+
+    // The Pool
+    cmsUInt32Number PoolSize;  // The maximum allocated size
+    cmsUInt32Number PoolUsed;  // The used size
+    void*  MemPool;            // Pointer to begin of memory pool
+};
+
+// Named color list internal representation
+typedef struct {
+
+    char Name[cmsMAX_PATH];
+    cmsUInt16Number PCS[3];
+    cmsUInt16Number DeviceColorant[cmsMAXCHANNELS];
+
+} _cmsNAMEDCOLOR;
+
+struct _cms_NAMEDCOLORLIST_struct {
+
+    cmsUInt32Number nColors;
+    cmsUInt32Number Allocated;
+    cmsUInt32Number ColorantCount;
+
+    char Prefix[33];      // Prefix and suffix are defined to be 32 characters at most
+    char Suffix[33];
+
+    _cmsNAMEDCOLOR* List;
+
+    cmsContext ContextID;
+};
+
+
+// ----------------------------------------------------------------------------------
+
+// This is the internal struct holding profile details.
+
+// Maximum supported tags in a profile
+#define MAX_TABLE_TAG       100
+
+typedef struct _cms_iccprofile_struct {
+
+    // I/O handler
+    cmsIOHANDLER*            IOhandler;
+
+    // The thread ID
+    cmsContext               ContextID;
+
+    // Creation time
+    struct tm                Created;
+
+    // Only most important items found in ICC profiles
+    cmsUInt32Number          Version;
+    cmsProfileClassSignature DeviceClass;
+    cmsColorSpaceSignature   ColorSpace;
+    cmsColorSpaceSignature   PCS;
+    cmsUInt32Number          RenderingIntent;
+
+    cmsUInt32Number          flags;
+    cmsUInt32Number          manufacturer, model;
+    cmsUInt64Number          attributes;
+    cmsUInt32Number          creator;
+
+    cmsProfileID             ProfileID;
+
+    // Dictionary
+    cmsUInt32Number          TagCount;
+    cmsTagSignature          TagNames[MAX_TABLE_TAG];
+    cmsTagSignature          TagLinked[MAX_TABLE_TAG];           // The tag to wich is linked (0=none)
+    cmsUInt32Number          TagSizes[MAX_TABLE_TAG];            // Size on disk
+    cmsUInt32Number          TagOffsets[MAX_TABLE_TAG];
+    cmsBool                  TagSaveAsRaw[MAX_TABLE_TAG];        // True to write uncooked
+    void *                   TagPtrs[MAX_TABLE_TAG];
+    cmsTagTypeHandler*       TagTypeHandlers[MAX_TABLE_TAG];     // Same structure may be serialized on different types
+                                                                 // depending on profile version, so we keep track of the
+                                                                 // type handler for each tag in the list.
+    // Special
+    cmsBool                  IsWrite;
+
+    // Keep a mutex for cmsReadTag -- Note that this only works if the user includes a mutex plugin
+    void *                   UsrMutex;
+
+} _cmsICCPROFILE;
+
+// IO helpers for profiles
+cmsBool              _cmsReadHeader(_cmsICCPROFILE* Icc);
+cmsBool              _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace);
+int                  _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks);
+
+// Tag types
+cmsTagTypeHandler*   _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig);
+cmsTagTypeSignature  _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig);
+cmsTagDescriptor*    _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig);
+
+// Error logging ---------------------------------------------------------------------------------------------------------
+
+void                 _cmsTagSignature2String(char String[5], cmsTagSignature sig);
+
+// Interpolation ---------------------------------------------------------------------------------------------------------
+
+cmsInterpParams*     _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags);
+cmsInterpParams*     _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags);
+void                 _cmsFreeInterpParams(cmsInterpParams* p);
+cmsBool              _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p);
+
+// Curves ----------------------------------------------------------------------------------------------------------------
+
+// This struct holds information about a segment, plus a pointer to the function that implements the evaluation.
+// In the case of table-based, Eval pointer is set to NULL
+
+// The gamma function main structure
+struct _cms_curve_struct {
+
+    cmsInterpParams*  InterpParams;  // Private optimizations for interpolation
+
+    cmsUInt32Number   nSegments;     // Number of segments in the curve. Zero for a 16-bit based tables
+    cmsCurveSegment*  Segments;      // The segments
+    cmsInterpParams** SegInterp;     // Array of private optimizations for interpolation in table-based segments
+
+    cmsParametricCurveEvaluator* Evals;  // Evaluators (one per segment)
+
+    // 16 bit Table-based representation follows
+    cmsUInt32Number    nEntries;      // Number of table elements
+    cmsUInt16Number*   Table16;       // The table itself.
+};
+
+
+//  Pipelines & Stages ---------------------------------------------------------------------------------------------
+
+// A single stage
+struct _cmsStage_struct {
+
+    cmsContext          ContextID;
+
+    cmsStageSignature   Type;           // Identifies the stage
+    cmsStageSignature   Implements;     // Identifies the *function* of the stage (for optimizations)
+
+    cmsUInt32Number     InputChannels;  // Input channels -- for optimization purposes
+    cmsUInt32Number     OutputChannels; // Output channels -- for optimization purposes
+
+    _cmsStageEvalFn     EvalPtr;        // Points to fn that evaluates the stage (always in floating point)
+    _cmsStageDupElemFn  DupElemPtr;     // Points to a fn that duplicates the *data* of the stage
+    _cmsStageFreeElemFn FreePtr;        // Points to a fn that sets the *data* of the stage free
+
+    // A generic pointer to whatever memory needed by the stage
+    void*               Data;
+
+    // Maintains linked list (used internally)
+    struct _cmsStage_struct* Next;
+};
+
+
+// Special Stages (cannot be saved)
+cmsStage*        _cmsStageAllocLab2XYZ(cmsContext ContextID);
+cmsStage*        _cmsStageAllocXYZ2Lab(cmsContext ContextID);
+cmsStage*        _cmsStageAllocLabPrelin(cmsContext ContextID);
+cmsStage*        _cmsStageAllocLabV2ToV4(cmsContext ContextID);
+cmsStage*        _cmsStageAllocLabV2ToV4curves(cmsContext ContextID);
+cmsStage*        _cmsStageAllocLabV4ToV2(cmsContext ContextID);
+cmsStage*        _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS);
+cmsStage*        _cmsStageAllocIdentityCurves(cmsContext ContextID, int nChannels);
+cmsStage*        _cmsStageAllocIdentityCLut(cmsContext ContextID, int nChan);
+cmsStage*        _cmsStageNormalizeFromLabFloat(cmsContext ContextID);
+cmsStage*        _cmsStageNormalizeFromXyzFloat(cmsContext ContextID);
+cmsStage*        _cmsStageNormalizeToLabFloat(cmsContext ContextID);
+cmsStage*        _cmsStageNormalizeToXyzFloat(cmsContext ContextID);
+
+// For curve set only
+cmsToneCurve**     _cmsStageGetPtrToCurveSet(const cmsStage* mpe);
+
+
+// Pipeline Evaluator (in floating point)
+typedef void (* _cmsPipelineEvalFloatFn)(const cmsFloat32Number In[],
+                                         cmsFloat32Number Out[],
+                                         const void* Data);
+
+struct _cmsPipeline_struct {
+
+    cmsStage* Elements;                                // Points to elements chain
+    cmsUInt32Number InputChannels, OutputChannels;
+
+    // Data & evaluators
+    void *Data;
+
+   _cmsOPTeval16Fn         Eval16Fn;
+   _cmsPipelineEvalFloatFn EvalFloatFn;
+   _cmsFreeUserDataFn      FreeDataFn;
+   _cmsDupUserDataFn       DupDataFn;
+
+    cmsContext ContextID;            // Environment
+
+    cmsBool  SaveAs8Bits;            // Implementation-specific: save as 8 bits if possible
+};
+
+// LUT reading & creation -------------------------------------------------------------------------------------------
+
+// Read tags using low-level function, provide necessary glue code to adapt versions, etc. All those return a brand new copy
+// of the LUTS, since ownership of original is up to the profile. The user should free allocated resources.
+
+cmsPipeline*      _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent);
+cmsPipeline*      _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent);
+cmsPipeline*      _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent);
+
+// Special values
+cmsBool           _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile);
+cmsBool           _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile);
+
+// Profile linker --------------------------------------------------------------------------------------------------
+
+cmsPipeline* _cmsLinkProfiles(cmsContext         ContextID,
+                              cmsUInt32Number    nProfiles,
+                              cmsUInt32Number    TheIntents[],
+                              cmsHPROFILE        hProfiles[],
+                              cmsBool            BPC[],
+                              cmsFloat64Number   AdaptationStates[],
+                              cmsUInt32Number    dwFlags);
+
+// Sequence --------------------------------------------------------------------------------------------------------
+
+cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile);
+cmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq);
+cmsSEQ* _cmsCompileProfileSequence(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[]);
+
+
+// LUT optimization ------------------------------------------------------------------------------------------------
+
+cmsUInt16Number  _cmsQuantizeVal(cmsFloat64Number i, int MaxSamples);
+int              _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags);
+
+cmsBool          _cmsEndPointsBySpace(cmsColorSpaceSignature Space,
+                                      cmsUInt16Number **White,
+                                      cmsUInt16Number **Black,
+                                      cmsUInt32Number *nOutputs);
+
+cmsBool          _cmsOptimizePipeline(cmsContext ContextID,
+                                      cmsPipeline**    Lut,
+                                      int              Intent,
+                                      cmsUInt32Number* InputFormat,
+                                      cmsUInt32Number* OutputFormat,
+                                      cmsUInt32Number* dwFlags );
+
+
+// Hi level LUT building ----------------------------------------------------------------------------------------------
+
+cmsPipeline*     _cmsCreateGamutCheckPipeline(cmsContext ContextID,
+                                              cmsHPROFILE hProfiles[],
+                                              cmsBool  BPC[],
+                                              cmsUInt32Number Intents[],
+                                              cmsFloat64Number AdaptationStates[],
+                                              cmsUInt32Number nGamutPCSposition,
+                                              cmsHPROFILE hGamut);
+
+
+// Formatters ------------------------------------------------------------------------------------------------------------
+
+#define cmsFLAGS_CAN_CHANGE_FORMATTER     0x02000000   // Allow change buffer format
+
+cmsBool         _cmsFormatterIsFloat(cmsUInt32Number Type);
+cmsBool         _cmsFormatterIs8bit(cmsUInt32Number Type);
+
+cmsFormatter    _cmsGetFormatter(cmsContext ContextID,
+                                 cmsUInt32Number Type,          // Specific type, i.e. TYPE_RGB_8
+                                 cmsFormatterDirection Dir,
+                                 cmsUInt32Number dwFlags);
+
+
+#ifndef CMS_NO_HALF_SUPPORT 
+
+// Half float
+cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h);
+cmsUInt16Number  _cmsFloat2Half(cmsFloat32Number flt);
+
+#endif
+
+// Transform logic ------------------------------------------------------------------------------------------------------
+
+struct _cmstransform_struct;
+
+typedef struct {
+
+    // 1-pixel cache (16 bits only)
+    cmsUInt16Number CacheIn[cmsMAXCHANNELS];
+    cmsUInt16Number CacheOut[cmsMAXCHANNELS];
+
+} _cmsCACHE;
+
+
+
+// Transformation
+typedef struct _cmstransform_struct {
+
+    cmsUInt32Number InputFormat, OutputFormat; // Keep formats for further reference
+
+    // Points to transform code
+    _cmsTransformFn xform;
+
+    // Formatters, cannot be embedded into LUT because cache
+    cmsFormatter16 FromInput;
+    cmsFormatter16 ToOutput;
+
+    cmsFormatterFloat FromInputFloat;
+    cmsFormatterFloat ToOutputFloat;
+
+    // 1-pixel cache seed for zero as input (16 bits, read only)
+    _cmsCACHE Cache;
+
+    // A Pipeline holding the full (optimized) transform
+    cmsPipeline* Lut;
+
+    // A Pipeline holding the gamut check. It goes from the input space to bilevel
+    cmsPipeline* GamutCheck;
+
+    // Colorant tables
+    cmsNAMEDCOLORLIST* InputColorant;       // Input Colorant table
+    cmsNAMEDCOLORLIST* OutputColorant;      // Colorant table (for n chans > CMYK)
+
+    // Informational only
+    cmsColorSpaceSignature EntryColorSpace;
+    cmsColorSpaceSignature ExitColorSpace;
+
+    // White points (informative only)
+    cmsCIEXYZ EntryWhitePoint;
+    cmsCIEXYZ ExitWhitePoint;
+
+    // Profiles used to create the transform
+    cmsSEQ* Sequence;
+
+    cmsUInt32Number  dwOriginalFlags;
+    cmsFloat64Number AdaptationState;
+
+    // The intent of this transform. That is usually the last intent in the profilechain, but may differ
+    cmsUInt32Number RenderingIntent;
+
+    // An id that uniquely identifies the running context. May be null.
+    cmsContext ContextID;
+
+    // A user-defined pointer that can be used to store data for transform plug-ins
+    void* UserData;
+    _cmsFreeUserDataFn FreeUserData;
+
+} _cmsTRANSFORM;
+
+// --------------------------------------------------------------------------------------------------
+
+cmsHTRANSFORM _cmsChain2Lab(cmsContext             ContextID,
+                            cmsUInt32Number        nProfiles,
+                            cmsUInt32Number        InputFormat,
+                            cmsUInt32Number        OutputFormat,
+                            const cmsUInt32Number  Intents[],
+                            const cmsHPROFILE      hProfiles[],
+                            const cmsBool          BPC[],
+                            const cmsFloat64Number AdaptationStates[],
+                            cmsUInt32Number        dwFlags);
+
+
+cmsToneCurve* _cmsBuildKToneCurve(cmsContext       ContextID,
+                            cmsUInt32Number        nPoints,
+                            cmsUInt32Number        nProfiles,
+                            const cmsUInt32Number  Intents[],
+                            const cmsHPROFILE      hProfiles[],
+                            const cmsBool          BPC[],
+                            const cmsFloat64Number AdaptationStates[],
+                            cmsUInt32Number        dwFlags);
+
+cmsBool   _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll);
+
+cmsBool   _cmsBuildRGB2XYZtransferMatrix(cmsMAT3* r, const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries);
+
+
+#define _lcms_internal_H
+#endif
+//<<<+++OPENSOURCE_MUST_END
diff --git a/core/src/fxcodec/lcms2/src/fx_cmscam02.c b/core/src/fxcodec/lcms2/src/fx_cmscam02.c
new file mode 100644
index 0000000..05584aa
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmscam02.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmscam02.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmscgats.c b/core/src/fxcodec/lcms2/src/fx_cmscgats.c
new file mode 100644
index 0000000..80dcba7
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmscgats.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmscgats.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmscnvrt.c b/core/src/fxcodec/lcms2/src/fx_cmscnvrt.c
new file mode 100644
index 0000000..9b8a292
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmscnvrt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmscnvrt.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmserr.c b/core/src/fxcodec/lcms2/src/fx_cmserr.c
new file mode 100644
index 0000000..6929e7b
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmserr.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmserr.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsgamma.c b/core/src/fxcodec/lcms2/src/fx_cmsgamma.c
new file mode 100644
index 0000000..f5bb690
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsgamma.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsgamma.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsgmt.c b/core/src/fxcodec/lcms2/src/fx_cmsgmt.c
new file mode 100644
index 0000000..ea82b15
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsgmt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsgmt.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmshalf.c b/core/src/fxcodec/lcms2/src/fx_cmshalf.c
new file mode 100644
index 0000000..6ed6b2b
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmshalf.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmshalf.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsintrp.c b/core/src/fxcodec/lcms2/src/fx_cmsintrp.c
new file mode 100644
index 0000000..affca53
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsintrp.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsintrp.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsio0.c b/core/src/fxcodec/lcms2/src/fx_cmsio0.c
new file mode 100644
index 0000000..2b6bc68
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsio0.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsio0.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsio1.c b/core/src/fxcodec/lcms2/src/fx_cmsio1.c
new file mode 100644
index 0000000..192e879
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsio1.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsio1.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmslut.c b/core/src/fxcodec/lcms2/src/fx_cmslut.c
new file mode 100644
index 0000000..d9a319c
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmslut.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmslut.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsmd5.c b/core/src/fxcodec/lcms2/src/fx_cmsmd5.c
new file mode 100644
index 0000000..3a3a997
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsmd5.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsmd5.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsmtrx.c b/core/src/fxcodec/lcms2/src/fx_cmsmtrx.c
new file mode 100644
index 0000000..667ac1f
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsmtrx.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsmtrx.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsnamed.c b/core/src/fxcodec/lcms2/src/fx_cmsnamed.c
new file mode 100644
index 0000000..5e1b028
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsnamed.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsnamed.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsopt.c b/core/src/fxcodec/lcms2/src/fx_cmsopt.c
new file mode 100644
index 0000000..f12429c
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsopt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsopt.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmspack.c b/core/src/fxcodec/lcms2/src/fx_cmspack.c
new file mode 100644
index 0000000..6e06409
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmspack.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmspack.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmspcs.c b/core/src/fxcodec/lcms2/src/fx_cmspcs.c
new file mode 100644
index 0000000..48ce39d
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmspcs.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmspcs.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsplugin.c b/core/src/fxcodec/lcms2/src/fx_cmsplugin.c
new file mode 100644
index 0000000..39266c2
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsplugin.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsplugin.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsps2.c b/core/src/fxcodec/lcms2/src/fx_cmsps2.c
new file mode 100644
index 0000000..dcf5540
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsps2.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsps2.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmssamp.c b/core/src/fxcodec/lcms2/src/fx_cmssamp.c
new file mode 100644
index 0000000..f1468fe
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmssamp.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmssamp.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmssm.c b/core/src/fxcodec/lcms2/src/fx_cmssm.c
new file mode 100644
index 0000000..a53ad71
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmssm.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmssm.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmstypes.c b/core/src/fxcodec/lcms2/src/fx_cmstypes.c
new file mode 100644
index 0000000..19f9e70
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmstypes.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmstypes.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsvirt.c b/core/src/fxcodec/lcms2/src/fx_cmsvirt.c
new file mode 100644
index 0000000..3e5397f
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsvirt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsvirt.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmswtpnt.c b/core/src/fxcodec/lcms2/src/fx_cmswtpnt.c
new file mode 100644
index 0000000..c11afd6
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmswtpnt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmswtpnt.c"

diff --git a/core/src/fxcodec/lcms2/src/fx_cmsxform.c b/core/src/fxcodec/lcms2/src/fx_cmsxform.c
new file mode 100644
index 0000000..a4b6d85
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsxform.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../lcms2-2.6/src/cmsxform.c"

diff --git a/core/src/fxcodec/libjpeg/cderror.h b/core/src/fxcodec/libjpeg/cderror.h
new file mode 100644
index 0000000..c19d38f
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/cderror.h
@@ -0,0 +1,132 @@
+/*

+ * cderror.h

+ *

+ * Copyright (C) 1994-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file defines the error and message codes for the cjpeg/djpeg

+ * applications.  These strings are not needed as part of the JPEG library

+ * proper.

+ * Edit this file to add new codes, or to translate the message strings to

+ * some other language.

+ */

+

+/*

+ * To define the enum list of message codes, include this file without

+ * defining macro JMESSAGE.  To create a message string table, include it

+ * again with a suitable JMESSAGE definition (see jerror.c for an example).

+ */

+#ifndef JMESSAGE

+#ifndef CDERROR_H

+#define CDERROR_H

+/* First time through, define the enum list */

+#define JMAKE_ENUM_LIST

+#else

+/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */

+#define JMESSAGE(code,string)

+#endif /* CDERROR_H */

+#endif /* JMESSAGE */

+

+#ifdef JMAKE_ENUM_LIST

+

+typedef enum {

+

+#define JMESSAGE(code,string)	code ,

+

+#endif /* JMAKE_ENUM_LIST */

+

+JMESSAGE(JMSG_FIRSTADDONCODE=1000, NULL) /* Must be first entry! */

+

+#ifdef BMP_SUPPORTED

+JMESSAGE(JERR_BMP_BADCMAP, "Unsupported BMP colormap format")

+JMESSAGE(JERR_BMP_BADDEPTH, "Only 8- and 24-bit BMP files are supported")

+JMESSAGE(JERR_BMP_BADHEADER, "Invalid BMP file: bad header length")

+JMESSAGE(JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1")

+JMESSAGE(JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB")

+JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported")

+JMESSAGE(JERR_BMP_NOT, "Not a BMP file - does not start with BM")

+JMESSAGE(JTRC_BMP, "%ux%u 24-bit BMP image")

+JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image")

+JMESSAGE(JTRC_BMP_OS2, "%ux%u 24-bit OS2 BMP image")

+JMESSAGE(JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image")

+#endif /* BMP_SUPPORTED */

+

+#ifdef GIF_SUPPORTED

+JMESSAGE(JERR_GIF_BUG, "GIF output got confused")

+JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d")

+JMESSAGE(JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB")

+JMESSAGE(JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file")

+JMESSAGE(JERR_GIF_NOT, "Not a GIF file")

+JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image")

+JMESSAGE(JTRC_GIF_BADVERSION,

+	 "Warning: unexpected GIF version number '%c%c%c'")

+JMESSAGE(JTRC_GIF_EXTENSION, "Ignoring GIF extension block of type 0x%02x")

+JMESSAGE(JTRC_GIF_NONSQUARE, "Caution: nonsquare pixels in input")

+JMESSAGE(JWRN_GIF_BADDATA, "Corrupt data in GIF file")

+JMESSAGE(JWRN_GIF_CHAR, "Bogus char 0x%02x in GIF file, ignoring")

+JMESSAGE(JWRN_GIF_ENDCODE, "Premature end of GIF image")

+JMESSAGE(JWRN_GIF_NOMOREDATA, "Ran out of GIF bits")

+#endif /* GIF_SUPPORTED */

+

+#ifdef PPM_SUPPORTED

+JMESSAGE(JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB")

+JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file")

+JMESSAGE(JERR_PPM_NOT, "Not a PPM/PGM file")

+JMESSAGE(JTRC_PGM, "%ux%u PGM image")

+JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image")

+JMESSAGE(JTRC_PPM, "%ux%u PPM image")

+JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image")

+#endif /* PPM_SUPPORTED */

+

+#ifdef RLE_SUPPORTED

+JMESSAGE(JERR_RLE_BADERROR, "Bogus error code from RLE library")

+JMESSAGE(JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB")

+JMESSAGE(JERR_RLE_DIMENSIONS, "Image dimensions (%ux%u) too large for RLE")

+JMESSAGE(JERR_RLE_EMPTY, "Empty RLE file")

+JMESSAGE(JERR_RLE_EOF, "Premature EOF in RLE header")

+JMESSAGE(JERR_RLE_MEM, "Insufficient memory for RLE header")

+JMESSAGE(JERR_RLE_NOT, "Not an RLE file")

+JMESSAGE(JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE")

+JMESSAGE(JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup")

+JMESSAGE(JTRC_RLE, "%ux%u full-color RLE file")

+JMESSAGE(JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d")

+JMESSAGE(JTRC_RLE_GRAY, "%ux%u grayscale RLE file")

+JMESSAGE(JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE file with map of length %d")

+JMESSAGE(JTRC_RLE_MAPPED, "%ux%u colormapped RLE file with map of length %d")

+#endif /* RLE_SUPPORTED */

+

+#ifdef TARGA_SUPPORTED

+JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format")

+JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file")

+JMESSAGE(JERR_TGA_COLORSPACE, "Targa output must be grayscale or RGB")

+JMESSAGE(JTRC_TGA, "%ux%u RGB Targa image")

+JMESSAGE(JTRC_TGA_GRAY, "%ux%u grayscale Targa image")

+JMESSAGE(JTRC_TGA_MAPPED, "%ux%u colormapped Targa image")

+#else

+JMESSAGE(JERR_TGA_NOTCOMP, "Targa support was not compiled")

+#endif /* TARGA_SUPPORTED */

+

+JMESSAGE(JERR_BAD_CMAP_FILE,

+	 "Color map file is invalid or of unsupported format")

+JMESSAGE(JERR_TOO_MANY_COLORS,

+	 "Output file format cannot handle %d colormap entries")

+JMESSAGE(JERR_UNGETC_FAILED, "ungetc failed")

+#ifdef TARGA_SUPPORTED

+JMESSAGE(JERR_UNKNOWN_FORMAT,

+	 "Unrecognized input file format --- perhaps you need -targa")

+#else

+JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format")

+#endif

+JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format")

+

+#ifdef JMAKE_ENUM_LIST

+

+  JMSG_LASTADDONCODE

+} ADDON_MESSAGE_CODE;

+

+#undef JMAKE_ENUM_LIST

+#endif /* JMAKE_ENUM_LIST */

+

+/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */

+#undef JMESSAGE

diff --git a/core/src/fxcodec/libjpeg/cdjpeg.h b/core/src/fxcodec/libjpeg/cdjpeg.h
new file mode 100644
index 0000000..be12278
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/cdjpeg.h
@@ -0,0 +1,184 @@
+/*

+ * cdjpeg.h

+ *

+ * Copyright (C) 1994-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains common declarations for the sample applications

+ * cjpeg and djpeg.  It is NOT used by the core JPEG library.

+ */

+

+#define JPEG_CJPEG_DJPEG	/* define proper options in jconfig.h */

+#define JPEG_INTERNAL_OPTIONS	/* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jerror.h"		/* get library error codes too */

+#include "cderror.h"		/* get application-specific error codes */

+

+

+/*

+ * Object interface for cjpeg's source file decoding modules

+ */

+

+typedef struct cjpeg_source_struct * cjpeg_source_ptr;

+

+struct cjpeg_source_struct {

+  JMETHOD(void, start_input, (j_compress_ptr cinfo,

+			      cjpeg_source_ptr sinfo));

+  JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo,

+				       cjpeg_source_ptr sinfo));

+  JMETHOD(void, finish_input, (j_compress_ptr cinfo,

+			       cjpeg_source_ptr sinfo));

+

+  FXSYS_FILE *input_file;

+

+  JSAMPARRAY buffer;

+  JDIMENSION buffer_height;

+};

+

+

+/*

+ * Object interface for djpeg's output file encoding modules

+ */

+

+typedef struct djpeg_dest_struct * djpeg_dest_ptr;

+

+struct djpeg_dest_struct {

+  /* start_output is called after jpeg_start_decompress finishes.

+   * The color map will be ready at this time, if one is needed.

+   */

+  JMETHOD(void, start_output, (j_decompress_ptr cinfo,

+			       djpeg_dest_ptr dinfo));

+  /* Emit the specified number of pixel rows from the buffer. */

+  JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo,

+				 djpeg_dest_ptr dinfo,

+				 JDIMENSION rows_supplied));

+  /* Finish up at the end of the image. */

+  JMETHOD(void, finish_output, (j_decompress_ptr cinfo,

+				djpeg_dest_ptr dinfo));

+

+  /* Target file spec; filled in by djpeg.c after object is created. */

+  FXSYS_FILE * output_file;

+

+  /* Output pixel-row buffer.  Created by module init or start_output.

+   * Width is cinfo->output_width * cinfo->output_components;

+   * height is buffer_height.

+   */

+  JSAMPARRAY buffer;

+  JDIMENSION buffer_height;

+};

+

+

+/*

+ * cjpeg/djpeg may need to perform extra passes to convert to or from

+ * the source/destination file format.  The JPEG library does not know

+ * about these passes, but we'd like them to be counted by the progress

+ * monitor.  We use an expanded progress monitor object to hold the

+ * additional pass count.

+ */

+

+struct cdjpeg_progress_mgr {

+  struct jpeg_progress_mgr pub;	/* fields known to JPEG library */

+  int completed_extra_passes;	/* extra passes completed */

+  int total_extra_passes;	/* total extra */

+  /* last printed percentage stored here to avoid multiple printouts */

+  int percent_done;

+};

+

+typedef struct cdjpeg_progress_mgr * cd_progress_ptr;

+

+

+/* Short forms of external names for systems with brain-damaged linkers. */

+

+#ifdef NEED_SHORT_EXTERNAL_NAMES

+#define jinit_read_bmp		jIRdBMP

+#define jinit_write_bmp		jIWrBMP

+#define jinit_read_gif		jIRdGIF

+#define jinit_write_gif		jIWrGIF

+#define jinit_read_ppm		jIRdPPM

+#define jinit_write_ppm		jIWrPPM

+#define jinit_read_rle		jIRdRLE

+#define jinit_write_rle		jIWrRLE

+#define jinit_read_targa	jIRdTarga

+#define jinit_write_targa	jIWrTarga

+#define read_quant_tables	RdQTables

+#define read_scan_script	RdScnScript

+#define set_quant_slots		SetQSlots

+#define set_sample_factors	SetSFacts

+#define read_color_map		RdCMap

+#define enable_signal_catcher	EnSigCatcher

+#define start_progress_monitor	StProgMon

+#define end_progress_monitor	EnProgMon

+#define read_stdin		RdStdin

+#define write_stdout		WrStdout

+#endif /* NEED_SHORT_EXTERNAL_NAMES */

+

+/* Module selection routines for I/O modules. */

+

+EXTERN(cjpeg_source_ptr) jinit_read_bmp JPP((j_compress_ptr cinfo));

+EXTERN(djpeg_dest_ptr) jinit_write_bmp JPP((j_decompress_ptr cinfo,

+					    boolean is_os2));

+EXTERN(cjpeg_source_ptr) jinit_read_gif JPP((j_compress_ptr cinfo));

+EXTERN(djpeg_dest_ptr) jinit_write_gif JPP((j_decompress_ptr cinfo));

+EXTERN(cjpeg_source_ptr) jinit_read_ppm JPP((j_compress_ptr cinfo));

+EXTERN(djpeg_dest_ptr) jinit_write_ppm JPP((j_decompress_ptr cinfo));

+EXTERN(cjpeg_source_ptr) jinit_read_rle JPP((j_compress_ptr cinfo));

+EXTERN(djpeg_dest_ptr) jinit_write_rle JPP((j_decompress_ptr cinfo));

+EXTERN(cjpeg_source_ptr) jinit_read_targa JPP((j_compress_ptr cinfo));

+EXTERN(djpeg_dest_ptr) jinit_write_targa JPP((j_decompress_ptr cinfo));

+

+/* cjpeg support routines (in rdswitch.c) */

+

+EXTERN(boolean) read_quant_tables JPP((j_compress_ptr cinfo, char * filename,

+				    int scale_factor, boolean force_baseline));

+EXTERN(boolean) read_scan_script JPP((j_compress_ptr cinfo, char * filename));

+EXTERN(boolean) set_quant_slots JPP((j_compress_ptr cinfo, char *arg));

+EXTERN(boolean) set_sample_factors JPP((j_compress_ptr cinfo, char *arg));

+

+/* djpeg support routines (in rdcolmap.c) */

+

+EXTERN(void) read_color_map JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));

+

+/* common support routines (in cdjpeg.c) */

+

+EXTERN(void) enable_signal_catcher JPP((j_common_ptr cinfo));

+EXTERN(void) start_progress_monitor JPP((j_common_ptr cinfo,

+					 cd_progress_ptr progress));

+EXTERN(void) end_progress_monitor JPP((j_common_ptr cinfo));

+EXTERN(boolean) keymatch JPP((char * arg, const char * keyword, int minchars));

+EXTERN(FXSYS_FILE *) read_stdin JPP((void));

+EXTERN(FXSYS_FILE *) write_stdout JPP((void));

+

+/* miscellaneous useful macros */

+

+#ifdef DONT_USE_B_MODE		/* define mode parameters for fopen() */

+#define READ_BINARY	"r"

+#define WRITE_BINARY	"w"

+#else

+#ifdef VMS			/* VMS is very nonstandard */

+#define READ_BINARY	"rb", "ctx=stm"

+#define WRITE_BINARY	"wb", "ctx=stm"

+#else				/* standard ANSI-compliant case */

+#define READ_BINARY	"rb"

+#define WRITE_BINARY	"wb"

+#endif

+#endif

+

+#ifndef EXIT_FAILURE		/* define exit() codes if not provided */

+#define EXIT_FAILURE  1

+#endif

+#ifndef EXIT_SUCCESS

+#ifdef VMS

+#define EXIT_SUCCESS  1		/* VMS is very nonstandard */

+#else

+#define EXIT_SUCCESS  0

+#endif

+#endif

+#ifndef EXIT_WARNING

+#ifdef VMS

+#define EXIT_WARNING  1		/* VMS is very nonstandard */

+#else

+#define EXIT_WARNING  2

+#endif

+#endif

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c b/core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c
new file mode 100644
index 0000000..ec88cff
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c
@@ -0,0 +1,283 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jcapimin.c

+ *

+ * Copyright (C) 1994-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains application interface code for the compression half

+ * of the JPEG library.  These are the "minimum" API routines that may be

+ * needed in either the normal full-compression case or the transcoding-only

+ * case.

+ *

+ * Most of the routines intended to be called directly by an application

+ * are in this file or in jcapistd.c.  But also see jcparam.c for

+ * parameter-setup helper routines, jcomapi.c for routines shared by

+ * compression and decompression, and jctrans.c for the transcoding case.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/*

+ * Initialization of a JPEG compression object.

+ * The error manager must already be set up (in case memory manager fails).

+ */

+

+GLOBAL(void)

+jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)

+{

+  int i;

+

+  /* Guard against version mismatches between library and caller. */

+  cinfo->mem = NULL;		/* so jpeg_destroy knows mem mgr not called */

+  if (version != JPEG_LIB_VERSION)

+    ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);

+  if (structsize != SIZEOF(struct jpeg_compress_struct))

+    ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, 

+	     (int) SIZEOF(struct jpeg_compress_struct), (int) structsize);

+

+  /* For debugging purposes, we zero the whole master structure.

+   * But the application has already set the err pointer, and may have set

+   * client_data, so we have to save and restore those fields.

+   * Note: if application hasn't set client_data, tools like Purify may

+   * complain here.

+   */

+  {

+    struct jpeg_error_mgr * err = cinfo->err;

+    void * client_data = cinfo->client_data; /* ignore Purify complaint here */

+    MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct));

+    cinfo->err = err;

+    cinfo->client_data = client_data;

+  }

+  cinfo->is_decompressor = FALSE;

+

+  /* Initialize a memory manager instance for this object */

+  jinit_memory_mgr((j_common_ptr) cinfo);

+

+  /* Zero out pointers to permanent structures. */

+  cinfo->progress = NULL;

+  cinfo->dest = NULL;

+

+  cinfo->comp_info = NULL;

+

+  for (i = 0; i < NUM_QUANT_TBLS; i++)

+    cinfo->quant_tbl_ptrs[i] = NULL;

+

+  for (i = 0; i < NUM_HUFF_TBLS; i++) {

+    cinfo->dc_huff_tbl_ptrs[i] = NULL;

+    cinfo->ac_huff_tbl_ptrs[i] = NULL;

+  }

+

+  cinfo->script_space = NULL;

+

+  cinfo->input_gamma = 1.0;	/* in case application forgets */

+

+  /* OK, I'm ready */

+  cinfo->global_state = CSTATE_START;

+}

+

+

+/*

+ * Destruction of a JPEG compression object

+ */

+

+GLOBAL(void)

+jpeg_destroy_compress (j_compress_ptr cinfo)

+{

+  jpeg_destroy((j_common_ptr) cinfo); /* use common routine */

+}

+

+

+/*

+ * Abort processing of a JPEG compression operation,

+ * but don't destroy the object itself.

+ */

+

+GLOBAL(void)

+jpeg_abort_compress (j_compress_ptr cinfo)

+{

+  jpeg_abort((j_common_ptr) cinfo); /* use common routine */

+}

+

+

+/*

+ * Forcibly suppress or un-suppress all quantization and Huffman tables.

+ * Marks all currently defined tables as already written (if suppress)

+ * or not written (if !suppress).  This will control whether they get emitted

+ * by a subsequent jpeg_start_compress call.

+ *

+ * This routine is exported for use by applications that want to produce

+ * abbreviated JPEG datastreams.  It logically belongs in jcparam.c, but

+ * since it is called by jpeg_start_compress, we put it here --- otherwise

+ * jcparam.o would be linked whether the application used it or not.

+ */

+

+GLOBAL(void)

+jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress)

+{

+  int i;

+  JQUANT_TBL * qtbl;

+  JHUFF_TBL * htbl;

+

+  for (i = 0; i < NUM_QUANT_TBLS; i++) {

+    if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL)

+      qtbl->sent_table = suppress;

+  }

+

+  for (i = 0; i < NUM_HUFF_TBLS; i++) {

+    if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL)

+      htbl->sent_table = suppress;

+    if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL)

+      htbl->sent_table = suppress;

+  }

+}

+

+

+/*

+ * Finish JPEG compression.

+ *

+ * If a multipass operating mode was selected, this may do a great deal of

+ * work including most of the actual output.

+ */

+

+GLOBAL(void)

+jpeg_finish_compress (j_compress_ptr cinfo)

+{

+  JDIMENSION iMCU_row;

+

+  if (cinfo->global_state == CSTATE_SCANNING ||

+      cinfo->global_state == CSTATE_RAW_OK) {

+    /* Terminate first pass */

+    if (cinfo->next_scanline < cinfo->image_height)

+      ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);

+    (*cinfo->master->finish_pass) (cinfo);

+  } else if (cinfo->global_state != CSTATE_WRCOEFS)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  /* Perform any remaining passes */

+  while (! cinfo->master->is_last_pass) {

+    (*cinfo->master->prepare_for_pass) (cinfo);

+    for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) {

+      if (cinfo->progress != NULL) {

+	cinfo->progress->pass_counter = (long) iMCU_row;

+	cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows;

+	(*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);

+      }

+      /* We bypass the main controller and invoke coef controller directly;

+       * all work is being done from the coefficient buffer.

+       */

+      if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL))

+	ERREXIT(cinfo, JERR_CANT_SUSPEND);

+    }

+    (*cinfo->master->finish_pass) (cinfo);

+  }

+  /* Write EOI, do final cleanup */

+  (*cinfo->marker->write_file_trailer) (cinfo);

+  (*cinfo->dest->term_destination) (cinfo);

+  /* We can use jpeg_abort to release memory and reset global_state */

+  jpeg_abort((j_common_ptr) cinfo);

+}

+

+

+/*

+ * Write a special marker.

+ * This is only recommended for writing COM or APPn markers.

+ * Must be called after jpeg_start_compress() and before

+ * first call to jpeg_write_scanlines() or jpeg_write_raw_data().

+ */

+

+GLOBAL(void)

+jpeg_write_marker (j_compress_ptr cinfo, int marker,

+		   const JOCTET *dataptr, unsigned int datalen)

+{

+  JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val));

+

+  if (cinfo->next_scanline != 0 ||

+      (cinfo->global_state != CSTATE_SCANNING &&

+       cinfo->global_state != CSTATE_RAW_OK &&

+       cinfo->global_state != CSTATE_WRCOEFS))

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+

+  (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);

+  write_marker_byte = cinfo->marker->write_marker_byte;	/* copy for speed */

+  while (datalen--) {

+    (*write_marker_byte) (cinfo, *dataptr);

+    dataptr++;

+  }

+}

+

+/* Same, but piecemeal. */

+

+GLOBAL(void)

+jpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen)

+{

+  if (cinfo->next_scanline != 0 ||

+      (cinfo->global_state != CSTATE_SCANNING &&

+       cinfo->global_state != CSTATE_RAW_OK &&

+       cinfo->global_state != CSTATE_WRCOEFS))

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+

+  (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);

+}

+

+GLOBAL(void)

+jpeg_write_m_byte (j_compress_ptr cinfo, int val)

+{

+  (*cinfo->marker->write_marker_byte) (cinfo, val);

+}

+

+

+/*

+ * Alternate compression function: just write an abbreviated table file.

+ * Before calling this, all parameters and a data destination must be set up.

+ *

+ * To produce a pair of files containing abbreviated tables and abbreviated

+ * image data, one would proceed as follows:

+ *

+ *		initialize JPEG object

+ *		set JPEG parameters

+ *		set destination to table file

+ *		jpeg_write_tables(cinfo);

+ *		set destination to image file

+ *		jpeg_start_compress(cinfo, FALSE);

+ *		write data...

+ *		jpeg_finish_compress(cinfo);

+ *

+ * jpeg_write_tables has the side effect of marking all tables written

+ * (same as jpeg_suppress_tables(..., TRUE)).  Thus a subsequent start_compress

+ * will not re-emit the tables unless it is passed write_all_tables=TRUE.

+ */

+

+GLOBAL(void)

+jpeg_write_tables (j_compress_ptr cinfo)

+{

+  if (cinfo->global_state != CSTATE_START)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+

+  /* (Re)initialize error mgr and destination modules */

+  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);

+  (*cinfo->dest->init_destination) (cinfo);

+  /* Initialize the marker writer ... bit of a crock to do it here. */

+  jinit_marker_writer(cinfo);

+  /* Write them tables! */

+  (*cinfo->marker->write_tables_only) (cinfo);

+  /* And clean up. */

+  (*cinfo->dest->term_destination) (cinfo);

+  /*

+   * In library releases up through v6a, we called jpeg_abort() here to free

+   * any working memory allocated by the destination manager and marker

+   * writer.  Some applications had a problem with that: they allocated space

+   * of their own from the library memory manager, and didn't want it to go

+   * away during write_tables.  So now we do nothing.  This will cause a

+   * memory leak if an app calls write_tables repeatedly without doing a full

+   * compression cycle or otherwise resetting the JPEG object.  However, that

+   * seems less bad than unexpectedly freeing memory in the normal case.

+   * An app that prefers the old behavior can call jpeg_abort for itself after

+   * each call to jpeg_write_tables().

+   */

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c b/core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c
new file mode 100644
index 0000000..bf13542
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c
@@ -0,0 +1,164 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jcapistd.c

+ *

+ * Copyright (C) 1994-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains application interface code for the compression half

+ * of the JPEG library.  These are the "standard" API routines that are

+ * used in the normal full-compression case.  They are not used by a

+ * transcoding-only application.  Note that if an application links in

+ * jpeg_start_compress, it will end up linking in the entire compressor.

+ * We thus must separate this file from jcapimin.c to avoid linking the

+ * whole compression library into a transcoder.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/*

+ * Compression initialization.

+ * Before calling this, all parameters and a data destination must be set up.

+ *

+ * We require a write_all_tables parameter as a failsafe check when writing

+ * multiple datastreams from the same compression object.  Since prior runs

+ * will have left all the tables marked sent_table=TRUE, a subsequent run

+ * would emit an abbreviated stream (no tables) by default.  This may be what

+ * is wanted, but for safety's sake it should not be the default behavior:

+ * programmers should have to make a deliberate choice to emit abbreviated

+ * images.  Therefore the documentation and examples should encourage people

+ * to pass write_all_tables=TRUE; then it will take active thought to do the

+ * wrong thing.

+ */

+

+GLOBAL(void)

+jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables)

+{

+  if (cinfo->global_state != CSTATE_START)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+

+  if (write_all_tables)

+    jpeg_suppress_tables(cinfo, FALSE);	/* mark all tables to be written */

+

+  /* (Re)initialize error mgr and destination modules */

+  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);

+  (*cinfo->dest->init_destination) (cinfo);

+  /* Perform master selection of active modules */

+  jinit_compress_master(cinfo);

+  /* Set up for the first pass */

+  (*cinfo->master->prepare_for_pass) (cinfo);

+  /* Ready for application to drive first pass through jpeg_write_scanlines

+   * or jpeg_write_raw_data.

+   */

+  cinfo->next_scanline = 0;

+  cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING);

+}

+

+

+/*

+ * Write some scanlines of data to the JPEG compressor.

+ *

+ * The return value will be the number of lines actually written.

+ * This should be less than the supplied num_lines only in case that

+ * the data destination module has requested suspension of the compressor,

+ * or if more than image_height scanlines are passed in.

+ *

+ * Note: we warn about excess calls to jpeg_write_scanlines() since

+ * this likely signals an application programmer error.  However,

+ * excess scanlines passed in the last valid call are *silently* ignored,

+ * so that the application need not adjust num_lines for end-of-image

+ * when using a multiple-scanline buffer.

+ */

+

+GLOBAL(JDIMENSION)

+jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines,

+		      JDIMENSION num_lines)

+{

+  JDIMENSION row_ctr, rows_left;

+

+  if (cinfo->global_state != CSTATE_SCANNING)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  if (cinfo->next_scanline >= cinfo->image_height)

+    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);

+

+  /* Call progress monitor hook if present */

+  if (cinfo->progress != NULL) {

+    cinfo->progress->pass_counter = (long) cinfo->next_scanline;

+    cinfo->progress->pass_limit = (long) cinfo->image_height;

+    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);

+  }

+

+  /* Give master control module another chance if this is first call to

+   * jpeg_write_scanlines.  This lets output of the frame/scan headers be

+   * delayed so that application can write COM, etc, markers between

+   * jpeg_start_compress and jpeg_write_scanlines.

+   */

+  if (cinfo->master->call_pass_startup)

+    (*cinfo->master->pass_startup) (cinfo);

+

+  /* Ignore any extra scanlines at bottom of image. */

+  rows_left = cinfo->image_height - cinfo->next_scanline;

+  if (num_lines > rows_left)

+    num_lines = rows_left;

+

+  row_ctr = 0;

+  (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines);

+  cinfo->next_scanline += row_ctr;

+  return row_ctr;

+}

+

+

+/*

+ * Alternate entry point to write raw data.

+ * Processes exactly one iMCU row per call, unless suspended.

+ */

+

+GLOBAL(JDIMENSION)

+jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,

+		     JDIMENSION num_lines)

+{

+  JDIMENSION lines_per_iMCU_row;

+

+  if (cinfo->global_state != CSTATE_RAW_OK)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  if (cinfo->next_scanline >= cinfo->image_height) {

+    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);

+    return 0;

+  }

+

+  /* Call progress monitor hook if present */

+  if (cinfo->progress != NULL) {

+    cinfo->progress->pass_counter = (long) cinfo->next_scanline;

+    cinfo->progress->pass_limit = (long) cinfo->image_height;

+    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);

+  }

+

+  /* Give master control module another chance if this is first call to

+   * jpeg_write_raw_data.  This lets output of the frame/scan headers be

+   * delayed so that application can write COM, etc, markers between

+   * jpeg_start_compress and jpeg_write_raw_data.

+   */

+  if (cinfo->master->call_pass_startup)

+    (*cinfo->master->pass_startup) (cinfo);

+

+  /* Verify that at least one iMCU row has been passed. */

+  lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE;

+  if (num_lines < lines_per_iMCU_row)

+    ERREXIT(cinfo, JERR_BUFFER_SIZE);

+

+  /* Directly compress the row. */

+  if (! (*cinfo->coef->compress_data) (cinfo, data)) {

+    /* If compressor did not consume the whole row, suspend processing. */

+    return 0;

+  }

+

+  /* OK, we processed one iMCU row. */

+  cinfo->next_scanline += lines_per_iMCU_row;

+  return lines_per_iMCU_row;

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c b/core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c
new file mode 100644
index 0000000..ea2a4a6
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c
@@ -0,0 +1,452 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jccoefct.c

+ *

+ * Copyright (C) 1994-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains the coefficient buffer controller for compression.

+ * This controller is the top level of the JPEG compressor proper.

+ * The coefficient buffer lies between forward-DCT and entropy encoding steps.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* We use a full-image coefficient buffer when doing Huffman optimization,

+ * and also for writing multiple-scan JPEG files.  In all cases, the DCT

+ * step is run during the first pass, and subsequent passes need only read

+ * the buffered coefficients.

+ */

+#ifdef ENTROPY_OPT_SUPPORTED

+#define FULL_COEF_BUFFER_SUPPORTED

+#else

+#ifdef C_MULTISCAN_FILES_SUPPORTED

+#define FULL_COEF_BUFFER_SUPPORTED

+#endif

+#endif

+

+

+/* Private buffer controller object */

+

+typedef struct {

+  struct jpeg_c_coef_controller pub; /* public fields */

+

+  JDIMENSION iMCU_row_num;	/* iMCU row # within image */

+  JDIMENSION mcu_ctr;		/* counts MCUs processed in current row */

+  int MCU_vert_offset;		/* counts MCU rows within iMCU row */

+  int MCU_rows_per_iMCU_row;	/* number of such rows needed */

+

+  /* For single-pass compression, it's sufficient to buffer just one MCU

+   * (although this may prove a bit slow in practice).  We allocate a

+   * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each

+   * MCU constructed and sent.  (On 80x86, the workspace is FAR even though

+   * it's not really very big; this is to keep the module interfaces unchanged

+   * when a large coefficient buffer is necessary.)

+   * In multi-pass modes, this array points to the current MCU's blocks

+   * within the virtual arrays.

+   */

+  JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];

+

+  /* In multi-pass modes, we need a virtual block array for each component. */

+  jvirt_barray_ptr whole_image[MAX_COMPONENTS];

+} my_coef_controller;

+

+typedef my_coef_controller * my_coef_ptr;

+

+

+/* Forward declarations */

+METHODDEF(boolean) compress_data

+    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));

+#ifdef FULL_COEF_BUFFER_SUPPORTED

+METHODDEF(boolean) compress_first_pass

+    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));

+METHODDEF(boolean) compress_output

+    JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));

+#endif

+

+

+LOCAL(void)

+start_iMCU_row (j_compress_ptr cinfo)

+/* Reset within-iMCU-row counters for a new row */

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+

+  /* In an interleaved scan, an MCU row is the same as an iMCU row.

+   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.

+   * But at the bottom of the image, process only what's left.

+   */

+  if (cinfo->comps_in_scan > 1) {

+    coef->MCU_rows_per_iMCU_row = 1;

+  } else {

+    if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))

+      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;

+    else

+      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;

+  }

+

+  coef->mcu_ctr = 0;

+  coef->MCU_vert_offset = 0;

+}

+

+

+/*

+ * Initialize for a processing pass.

+ */

+

+METHODDEF(void)

+start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+

+  coef->iMCU_row_num = 0;

+  start_iMCU_row(cinfo);

+

+  switch (pass_mode) {

+  case JBUF_PASS_THRU:

+    if (coef->whole_image[0] != NULL)

+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+    coef->pub.compress_data = compress_data;

+    break;

+#ifdef FULL_COEF_BUFFER_SUPPORTED

+  case JBUF_SAVE_AND_PASS:

+    if (coef->whole_image[0] == NULL)

+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+    coef->pub.compress_data = compress_first_pass;

+    break;

+  case JBUF_CRANK_DEST:

+    if (coef->whole_image[0] == NULL)

+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+    coef->pub.compress_data = compress_output;

+    break;

+#endif

+  default:

+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+    break;

+  }

+}

+

+

+/*

+ * Process some data in the single-pass case.

+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)

+ * per call, ie, v_samp_factor block rows for each component in the image.

+ * Returns TRUE if the iMCU row is completed, FALSE if suspended.

+ *

+ * NB: input_buf contains a plane for each component in image,

+ * which we index according to the component's SOF position.

+ */

+

+METHODDEF(boolean)

+compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+  JDIMENSION MCU_col_num;	/* index of current MCU within row */

+  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;

+  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;

+  int blkn, bi, ci, yindex, yoffset, blockcnt;

+  JDIMENSION ypos, xpos;

+  jpeg_component_info *compptr;

+

+  /* Loop to write as much as one whole iMCU row */

+  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;

+       yoffset++) {

+    for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col;

+	 MCU_col_num++) {

+      /* Determine where data comes from in input_buf and do the DCT thing.

+       * Each call on forward_DCT processes a horizontal row of DCT blocks

+       * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks

+       * sequentially.  Dummy blocks at the right or bottom edge are filled in

+       * specially.  The data in them does not matter for image reconstruction,

+       * so we fill them with values that will encode to the smallest amount of

+       * data, viz: all zeroes in the AC entries, DC entries equal to previous

+       * block's DC value.  (Thanks to Thomas Kinsman for this idea.)

+       */

+      blkn = 0;

+      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+	compptr = cinfo->cur_comp_info[ci];

+	blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width

+						: compptr->last_col_width;

+	xpos = MCU_col_num * compptr->MCU_sample_width;

+	ypos = yoffset * DCTSIZE; /* ypos == (yoffset+yindex) * DCTSIZE */

+	for (yindex = 0; yindex < compptr->MCU_height; yindex++) {

+	  if (coef->iMCU_row_num < last_iMCU_row ||

+	      yoffset+yindex < compptr->last_row_height) {

+	    (*cinfo->fdct->forward_DCT) (cinfo, compptr,

+					 input_buf[compptr->component_index],

+					 coef->MCU_buffer[blkn],

+					 ypos, xpos, (JDIMENSION) blockcnt);

+	    if (blockcnt < compptr->MCU_width) {

+	      /* Create some dummy blocks at the right edge of the image. */

+	      jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt],

+			(compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));

+	      for (bi = blockcnt; bi < compptr->MCU_width; bi++) {

+		coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];

+	      }

+	    }

+	  } else {

+	    /* Create a row of dummy blocks at the bottom of the image. */

+	    jzero_far((void FAR *) coef->MCU_buffer[blkn],

+		      compptr->MCU_width * SIZEOF(JBLOCK));

+	    for (bi = 0; bi < compptr->MCU_width; bi++) {

+	      coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];

+	    }

+	  }

+	  blkn += compptr->MCU_width;

+	  ypos += DCTSIZE;

+	}

+      }

+      /* Try to write the MCU.  In event of a suspension failure, we will

+       * re-DCT the MCU on restart (a bit inefficient, could be fixed...)

+       */

+      if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {

+	/* Suspension forced; update state counters and exit */

+	coef->MCU_vert_offset = yoffset;

+	coef->mcu_ctr = MCU_col_num;

+	return FALSE;

+      }

+    }

+    /* Completed an MCU row, but perhaps not an iMCU row */

+    coef->mcu_ctr = 0;

+  }

+  /* Completed the iMCU row, advance counters for next one */

+  coef->iMCU_row_num++;

+  start_iMCU_row(cinfo);

+  return TRUE;

+}

+

+

+#ifdef FULL_COEF_BUFFER_SUPPORTED

+

+/*

+ * Process some data in the first pass of a multi-pass case.

+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)

+ * per call, ie, v_samp_factor block rows for each component in the image.

+ * This amount of data is read from the source buffer, DCT'd and quantized,

+ * and saved into the virtual arrays.  We also generate suitable dummy blocks

+ * as needed at the right and lower edges.  (The dummy blocks are constructed

+ * in the virtual arrays, which have been padded appropriately.)  This makes

+ * it possible for subsequent passes not to worry about real vs. dummy blocks.

+ *

+ * We must also emit the data to the entropy encoder.  This is conveniently

+ * done by calling compress_output() after we've loaded the current strip

+ * of the virtual arrays.

+ *

+ * NB: input_buf contains a plane for each component in image.  All

+ * components are DCT'd and loaded into the virtual arrays in this pass.

+ * However, it may be that only a subset of the components are emitted to

+ * the entropy encoder during this first pass; be careful about looking

+ * at the scan-dependent variables (MCU dimensions, etc).

+ */

+

+METHODDEF(boolean)

+compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;

+  JDIMENSION blocks_across, MCUs_across, MCUindex;

+  int bi, ci, h_samp_factor, block_row, block_rows, ndummy;

+  JCOEF lastDC;

+  jpeg_component_info *compptr;

+  JBLOCKARRAY buffer;

+  JBLOCKROW thisblockrow, lastblockrow;

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    /* Align the virtual buffer for this component. */

+    buffer = (*cinfo->mem->access_virt_barray)

+      ((j_common_ptr) cinfo, coef->whole_image[ci],

+       coef->iMCU_row_num * compptr->v_samp_factor,

+       (JDIMENSION) compptr->v_samp_factor, TRUE);

+    /* Count non-dummy DCT block rows in this iMCU row. */

+    if (coef->iMCU_row_num < last_iMCU_row)

+      block_rows = compptr->v_samp_factor;

+    else {

+      /* NB: can't use last_row_height here, since may not be set! */

+      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);

+      if (block_rows == 0) block_rows = compptr->v_samp_factor;

+    }

+    blocks_across = compptr->width_in_blocks;

+    h_samp_factor = compptr->h_samp_factor;

+    /* Count number of dummy blocks to be added at the right margin. */

+    ndummy = (int) (blocks_across % h_samp_factor);

+    if (ndummy > 0)

+      ndummy = h_samp_factor - ndummy;

+    /* Perform DCT for all non-dummy blocks in this iMCU row.  Each call

+     * on forward_DCT processes a complete horizontal row of DCT blocks.

+     */

+    for (block_row = 0; block_row < block_rows; block_row++) {

+      thisblockrow = buffer[block_row];

+      (*cinfo->fdct->forward_DCT) (cinfo, compptr,

+				   input_buf[ci], thisblockrow,

+				   (JDIMENSION) (block_row * DCTSIZE),

+				   (JDIMENSION) 0, blocks_across);

+      if (ndummy > 0) {

+	/* Create dummy blocks at the right edge of the image. */

+	thisblockrow += blocks_across; /* => first dummy block */

+	jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));

+	lastDC = thisblockrow[-1][0];

+	for (bi = 0; bi < ndummy; bi++) {

+	  thisblockrow[bi][0] = lastDC;

+	}

+      }

+    }

+    /* If at end of image, create dummy block rows as needed.

+     * The tricky part here is that within each MCU, we want the DC values

+     * of the dummy blocks to match the last real block's DC value.

+     * This squeezes a few more bytes out of the resulting file...

+     */

+    if (coef->iMCU_row_num == last_iMCU_row) {

+      blocks_across += ndummy;	/* include lower right corner */

+      MCUs_across = blocks_across / h_samp_factor;

+      for (block_row = block_rows; block_row < compptr->v_samp_factor;

+	   block_row++) {

+	thisblockrow = buffer[block_row];

+	lastblockrow = buffer[block_row-1];

+	jzero_far((void FAR *) thisblockrow,

+		  (size_t) (blocks_across * SIZEOF(JBLOCK)));

+	for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {

+	  lastDC = lastblockrow[h_samp_factor-1][0];

+	  for (bi = 0; bi < h_samp_factor; bi++) {

+	    thisblockrow[bi][0] = lastDC;

+	  }

+	  thisblockrow += h_samp_factor; /* advance to next MCU in row */

+	  lastblockrow += h_samp_factor;

+	}

+      }

+    }

+  }

+  /* NB: compress_output will increment iMCU_row_num if successful.

+   * A suspension return will result in redoing all the work above next time.

+   */

+

+  /* Emit data to the entropy encoder, sharing code with subsequent passes */

+  return compress_output(cinfo, input_buf);

+}

+

+

+/*

+ * Process some data in subsequent passes of a multi-pass case.

+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)

+ * per call, ie, v_samp_factor block rows for each component in the scan.

+ * The data is obtained from the virtual arrays and fed to the entropy coder.

+ * Returns TRUE if the iMCU row is completed, FALSE if suspended.

+ *

+ * NB: input_buf is ignored; it is likely to be a NULL pointer.

+ */

+

+METHODDEF(boolean)

+compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+  JDIMENSION MCU_col_num;	/* index of current MCU within row */

+  int blkn, ci, xindex, yindex, yoffset;

+  JDIMENSION start_col;

+  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];

+  JBLOCKROW buffer_ptr;

+  jpeg_component_info *compptr;

+

+  /* Align the virtual buffers for the components used in this scan.

+   * NB: during first pass, this is safe only because the buffers will

+   * already be aligned properly, so jmemmgr.c won't need to do any I/O.

+   */

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+    compptr = cinfo->cur_comp_info[ci];

+    buffer[ci] = (*cinfo->mem->access_virt_barray)

+      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],

+       coef->iMCU_row_num * compptr->v_samp_factor,

+       (JDIMENSION) compptr->v_samp_factor, FALSE);

+  }

+

+  /* Loop to process one whole iMCU row */

+  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;

+       yoffset++) {

+    for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;

+	 MCU_col_num++) {

+      /* Construct list of pointers to DCT blocks belonging to this MCU */

+      blkn = 0;			/* index of current DCT block within MCU */

+      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+	compptr = cinfo->cur_comp_info[ci];

+	start_col = MCU_col_num * compptr->MCU_width;

+	for (yindex = 0; yindex < compptr->MCU_height; yindex++) {

+	  buffer_ptr = buffer[ci][yindex+yoffset] + start_col;

+	  for (xindex = 0; xindex < compptr->MCU_width; xindex++) {

+	    coef->MCU_buffer[blkn++] = buffer_ptr++;

+	  }

+	}

+      }

+      /* Try to write the MCU. */

+      if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {

+	/* Suspension forced; update state counters and exit */

+	coef->MCU_vert_offset = yoffset;

+	coef->mcu_ctr = MCU_col_num;

+	return FALSE;

+      }

+    }

+    /* Completed an MCU row, but perhaps not an iMCU row */

+    coef->mcu_ctr = 0;

+  }

+  /* Completed the iMCU row, advance counters for next one */

+  coef->iMCU_row_num++;

+  start_iMCU_row(cinfo);

+  return TRUE;

+}

+

+#endif /* FULL_COEF_BUFFER_SUPPORTED */

+

+

+/*

+ * Initialize coefficient buffer controller.

+ */

+

+GLOBAL(void)

+jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)

+{

+  my_coef_ptr coef;

+

+  coef = (my_coef_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_coef_controller));

+  cinfo->coef = (struct jpeg_c_coef_controller *) coef;

+  coef->pub.start_pass = start_pass_coef;

+

+  /* Create the coefficient buffer. */

+  if (need_full_buffer) {

+#ifdef FULL_COEF_BUFFER_SUPPORTED

+    /* Allocate a full-image virtual array for each component, */

+    /* padded to a multiple of samp_factor DCT blocks in each direction. */

+    int ci;

+    jpeg_component_info *compptr;

+

+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+	 ci++, compptr++) {

+      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)

+	((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,

+	 (JDIMENSION) jround_up((long) compptr->width_in_blocks,

+				(long) compptr->h_samp_factor),

+	 (JDIMENSION) jround_up((long) compptr->height_in_blocks,

+				(long) compptr->v_samp_factor),

+	 (JDIMENSION) compptr->v_samp_factor);

+    }

+#else

+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+#endif

+  } else {

+    /* We only need a single-MCU buffer. */

+    JBLOCKROW buffer;

+    int i;

+

+    buffer = (JBLOCKROW)

+      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				  C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));

+    for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {

+      coef->MCU_buffer[i] = buffer + i;

+    }

+    coef->whole_image[0] = NULL; /* flag for no virtual arrays */

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jccolor.c b/core/src/fxcodec/libjpeg/fpdfapi_jccolor.c
new file mode 100644
index 0000000..8ff863a
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jccolor.c
@@ -0,0 +1,462 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jccolor.c

+ *

+ * Copyright (C) 1991-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains input colorspace conversion routines.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* Private subobject */

+

+typedef struct {

+  struct jpeg_color_converter pub; /* public fields */

+

+  /* Private state for RGB->YCC conversion */

+  INT32 * rgb_ycc_tab;		/* => table for RGB to YCbCr conversion */

+} my_color_converter;

+

+typedef my_color_converter * my_cconvert_ptr;

+

+

+/**************** RGB -> YCbCr conversion: most common case **************/

+

+/*

+ * YCbCr is defined per CCIR 601-1, except that Cb and Cr are

+ * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.

+ * The conversion equations to be implemented are therefore

+ *	Y  =  0.29900 * R + 0.58700 * G + 0.11400 * B

+ *	Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B  + CENTERJSAMPLE

+ *	Cr =  0.50000 * R - 0.41869 * G - 0.08131 * B  + CENTERJSAMPLE

+ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)

+ * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,

+ * rather than CENTERJSAMPLE, for Cb and Cr.  This gave equal positive and

+ * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)

+ * were not represented exactly.  Now we sacrifice exact representation of

+ * maximum red and maximum blue in order to get exact grayscales.

+ *

+ * To avoid floating-point arithmetic, we represent the fractional constants

+ * as integers scaled up by 2^16 (about 4 digits precision); we have to divide

+ * the products by 2^16, with appropriate rounding, to get the correct answer.

+ *

+ * For even more speed, we avoid doing any multiplications in the inner loop

+ * by precalculating the constants times R,G,B for all possible values.

+ * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);

+ * for 12-bit samples it is still acceptable.  It's not very reasonable for

+ * 16-bit samples, but if you want lossless storage you shouldn't be changing

+ * colorspace anyway.

+ * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included

+ * in the tables to save adding them separately in the inner loop.

+ */

+

+#define SCALEBITS	16	/* speediest right-shift on some machines */

+#define CBCR_OFFSET	((INT32) CENTERJSAMPLE << SCALEBITS)

+#define ONE_HALF	((INT32) 1 << (SCALEBITS-1))

+#define FIX(x)		((INT32) ((x) * (1L<<SCALEBITS) + 0.5))

+

+/* We allocate one big table and divide it up into eight parts, instead of

+ * doing eight alloc_small requests.  This lets us use a single table base

+ * address, which can be held in a register in the inner loops on many

+ * machines (more than can hold all eight addresses, anyway).

+ */

+

+#define R_Y_OFF		0			/* offset to R => Y section */

+#define G_Y_OFF		(1*(MAXJSAMPLE+1))	/* offset to G => Y section */

+#define B_Y_OFF		(2*(MAXJSAMPLE+1))	/* etc. */

+#define R_CB_OFF	(3*(MAXJSAMPLE+1))

+#define G_CB_OFF	(4*(MAXJSAMPLE+1))

+#define B_CB_OFF	(5*(MAXJSAMPLE+1))

+#define R_CR_OFF	B_CB_OFF		/* B=>Cb, R=>Cr are the same */

+#define G_CR_OFF	(6*(MAXJSAMPLE+1))

+#define B_CR_OFF	(7*(MAXJSAMPLE+1))

+#define TABLE_SIZE	(8*(MAXJSAMPLE+1))

+

+

+/*

+ * Initialize for RGB->YCC colorspace conversion.

+ */

+

+METHODDEF(void)

+rgb_ycc_start (j_compress_ptr cinfo)

+{

+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;

+  INT32 * rgb_ycc_tab;

+  INT32 i;

+

+  /* Allocate and fill in the conversion tables. */

+  cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				(TABLE_SIZE * SIZEOF(INT32)));

+

+  for (i = 0; i <= MAXJSAMPLE; i++) {

+    rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;

+    rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;

+    rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i     + ONE_HALF;

+    rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;

+    rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;

+    /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.

+     * This ensures that the maximum output will round to MAXJSAMPLE

+     * not MAXJSAMPLE+1, and thus that we don't have to range-limit.

+     */

+    rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i    + CBCR_OFFSET + ONE_HALF-1;

+/*  B=>Cb and R=>Cr tables are the same

+    rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i    + CBCR_OFFSET + ONE_HALF-1;

+*/

+    rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;

+    rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;

+  }

+}

+

+

+/*

+ * Convert some rows of samples to the JPEG colorspace.

+ *

+ * Note that we change from the application's interleaved-pixel format

+ * to our internal noninterleaved, one-plane-per-component format.

+ * The input buffer is therefore three times as wide as the output buffer.

+ *

+ * A starting row offset is provided only for the output buffer.  The caller

+ * can easily adjust the passed input_buf value to accommodate any row

+ * offset required on that side.

+ */

+

+METHODDEF(void)

+rgb_ycc_convert (j_compress_ptr cinfo,

+		 JSAMPARRAY input_buf, JSAMPIMAGE output_buf,

+		 JDIMENSION output_row, int num_rows)

+{

+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;

+  register int r, g, b;

+  register INT32 * ctab = cconvert->rgb_ycc_tab;

+  register JSAMPROW inptr;

+  register JSAMPROW outptr0, outptr1, outptr2;

+  register JDIMENSION col;

+  JDIMENSION num_cols = cinfo->image_width;

+

+  while (--num_rows >= 0) {

+    inptr = *input_buf++;

+    outptr0 = output_buf[0][output_row];

+    outptr1 = output_buf[1][output_row];

+    outptr2 = output_buf[2][output_row];

+    output_row++;

+    for (col = 0; col < num_cols; col++) {

+      r = GETJSAMPLE(inptr[RGB_RED]);

+      g = GETJSAMPLE(inptr[RGB_GREEN]);

+      b = GETJSAMPLE(inptr[RGB_BLUE]);

+      inptr += RGB_PIXELSIZE;

+      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations

+       * must be too; we do not need an explicit range-limiting operation.

+       * Hence the value being shifted is never negative, and we don't

+       * need the general RIGHT_SHIFT macro.

+       */

+      /* Y */

+      outptr0[col] = (JSAMPLE)

+		((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])

+		 >> SCALEBITS);

+      /* Cb */

+      outptr1[col] = (JSAMPLE)

+		((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])

+		 >> SCALEBITS);

+      /* Cr */

+      outptr2[col] = (JSAMPLE)

+		((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])

+		 >> SCALEBITS);

+    }

+  }

+}

+

+

+/**************** Cases other than RGB -> YCbCr **************/

+

+

+/*

+ * Convert some rows of samples to the JPEG colorspace.

+ * This version handles RGB->grayscale conversion, which is the same

+ * as the RGB->Y portion of RGB->YCbCr.

+ * We assume rgb_ycc_start has been called (we only use the Y tables).

+ */

+

+METHODDEF(void)

+rgb_gray_convert (j_compress_ptr cinfo,

+		  JSAMPARRAY input_buf, JSAMPIMAGE output_buf,

+		  JDIMENSION output_row, int num_rows)

+{

+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;

+  register int r, g, b;

+  register INT32 * ctab = cconvert->rgb_ycc_tab;

+  register JSAMPROW inptr;

+  register JSAMPROW outptr;

+  register JDIMENSION col;

+  JDIMENSION num_cols = cinfo->image_width;

+

+  while (--num_rows >= 0) {

+    inptr = *input_buf++;

+    outptr = output_buf[0][output_row];

+    output_row++;

+    for (col = 0; col < num_cols; col++) {

+      r = GETJSAMPLE(inptr[RGB_RED]);

+      g = GETJSAMPLE(inptr[RGB_GREEN]);

+      b = GETJSAMPLE(inptr[RGB_BLUE]);

+      inptr += RGB_PIXELSIZE;

+      /* Y */

+      outptr[col] = (JSAMPLE)

+		((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])

+		 >> SCALEBITS);

+    }

+  }

+}

+

+

+/*

+ * Convert some rows of samples to the JPEG colorspace.

+ * This version handles Adobe-style CMYK->YCCK conversion,

+ * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same

+ * conversion as above, while passing K (black) unchanged.

+ * We assume rgb_ycc_start has been called.

+ */

+

+METHODDEF(void)

+cmyk_ycck_convert (j_compress_ptr cinfo,

+		   JSAMPARRAY input_buf, JSAMPIMAGE output_buf,

+		   JDIMENSION output_row, int num_rows)

+{

+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;

+  register int r, g, b;

+  register INT32 * ctab = cconvert->rgb_ycc_tab;

+  register JSAMPROW inptr;

+  register JSAMPROW outptr0, outptr1, outptr2, outptr3;

+  register JDIMENSION col;

+  JDIMENSION num_cols = cinfo->image_width;

+

+  while (--num_rows >= 0) {

+    inptr = *input_buf++;

+    outptr0 = output_buf[0][output_row];

+    outptr1 = output_buf[1][output_row];

+    outptr2 = output_buf[2][output_row];

+    outptr3 = output_buf[3][output_row];

+    output_row++;

+    for (col = 0; col < num_cols; col++) {

+      r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);

+      g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);

+      b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);

+      /* K passes through as-is */

+      outptr3[col] = inptr[3];	/* don't need GETJSAMPLE here */

+      inptr += 4;

+      /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations

+       * must be too; we do not need an explicit range-limiting operation.

+       * Hence the value being shifted is never negative, and we don't

+       * need the general RIGHT_SHIFT macro.

+       */

+      /* Y */

+      outptr0[col] = (JSAMPLE)

+		((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])

+		 >> SCALEBITS);

+      /* Cb */

+      outptr1[col] = (JSAMPLE)

+		((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])

+		 >> SCALEBITS);

+      /* Cr */

+      outptr2[col] = (JSAMPLE)

+		((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])

+		 >> SCALEBITS);

+    }

+  }

+}

+

+

+/*

+ * Convert some rows of samples to the JPEG colorspace.

+ * This version handles grayscale output with no conversion.

+ * The source can be either plain grayscale or YCbCr (since Y == gray).

+ */

+

+METHODDEF(void)

+grayscale_convert (j_compress_ptr cinfo,

+		   JSAMPARRAY input_buf, JSAMPIMAGE output_buf,

+		   JDIMENSION output_row, int num_rows)

+{

+  register JSAMPROW inptr;

+  register JSAMPROW outptr;

+  register JDIMENSION col;

+  JDIMENSION num_cols = cinfo->image_width;

+  int instride = cinfo->input_components;

+

+  while (--num_rows >= 0) {

+    inptr = *input_buf++;

+    outptr = output_buf[0][output_row];

+    output_row++;

+    for (col = 0; col < num_cols; col++) {

+      outptr[col] = inptr[0];	/* don't need GETJSAMPLE() here */

+      inptr += instride;

+    }

+  }

+}

+

+

+/*

+ * Convert some rows of samples to the JPEG colorspace.

+ * This version handles multi-component colorspaces without conversion.

+ * We assume input_components == num_components.

+ */

+

+METHODDEF(void)

+null_convert (j_compress_ptr cinfo,

+	      JSAMPARRAY input_buf, JSAMPIMAGE output_buf,

+	      JDIMENSION output_row, int num_rows)

+{

+  register JSAMPROW inptr;

+  register JSAMPROW outptr;

+  register JDIMENSION col;

+  register int ci;

+  int nc = cinfo->num_components;

+  JDIMENSION num_cols = cinfo->image_width;

+

+  while (--num_rows >= 0) {

+    /* It seems fastest to make a separate pass for each component. */

+    for (ci = 0; ci < nc; ci++) {

+      inptr = *input_buf;

+      outptr = output_buf[ci][output_row];

+      for (col = 0; col < num_cols; col++) {

+	outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */

+	inptr += nc;

+      }

+    }

+    input_buf++;

+    output_row++;

+  }

+}

+

+

+/*

+ * Empty method for start_pass.

+ */

+

+METHODDEF(void)

+null_method (j_compress_ptr cinfo)

+{

+  /* no work needed */

+}

+

+

+/*

+ * Module initialization routine for input colorspace conversion.

+ */

+

+GLOBAL(void)

+jinit_color_converter (j_compress_ptr cinfo)

+{

+  my_cconvert_ptr cconvert;

+

+  cconvert = (my_cconvert_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_color_converter));

+  cinfo->cconvert = (struct jpeg_color_converter *) cconvert;

+  /* set start_pass to null method until we find out differently */

+  cconvert->pub.start_pass = null_method;

+

+  /* Make sure input_components agrees with in_color_space */

+  switch (cinfo->in_color_space) {

+  case JCS_GRAYSCALE:

+    if (cinfo->input_components != 1)

+      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);

+    break;

+

+  case JCS_RGB:

+#if RGB_PIXELSIZE != 3

+    if (cinfo->input_components != RGB_PIXELSIZE)

+      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);

+    break;

+#endif /* else share code with YCbCr */

+

+  case JCS_YCbCr:

+    if (cinfo->input_components != 3)

+      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);

+    break;

+

+  case JCS_CMYK:

+  case JCS_YCCK:

+    if (cinfo->input_components != 4)

+      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);

+    break;

+

+  default:			/* JCS_UNKNOWN can be anything */

+    if (cinfo->input_components < 1)

+      ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);

+    break;

+  }

+

+  /* Check num_components, set conversion method based on requested space */

+  switch (cinfo->jpeg_color_space) {

+  case JCS_GRAYSCALE:

+    if (cinfo->num_components != 1)

+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);

+    if (cinfo->in_color_space == JCS_GRAYSCALE)

+      cconvert->pub.color_convert = grayscale_convert;

+    else if (cinfo->in_color_space == JCS_RGB) {

+      cconvert->pub.start_pass = rgb_ycc_start;

+      cconvert->pub.color_convert = rgb_gray_convert;

+    } else if (cinfo->in_color_space == JCS_YCbCr)

+      cconvert->pub.color_convert = grayscale_convert;

+    else

+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);

+    break;

+

+  case JCS_RGB:

+    if (cinfo->num_components != 3)

+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);

+    if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3)

+      cconvert->pub.color_convert = null_convert;

+    else

+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);

+    break;

+

+  case JCS_YCbCr:

+    if (cinfo->num_components != 3)

+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);

+    if (cinfo->in_color_space == JCS_RGB) {

+      cconvert->pub.start_pass = rgb_ycc_start;

+      cconvert->pub.color_convert = rgb_ycc_convert;

+    } else if (cinfo->in_color_space == JCS_YCbCr)

+      cconvert->pub.color_convert = null_convert;

+    else

+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);

+    break;

+

+  case JCS_CMYK:

+    if (cinfo->num_components != 4)

+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);

+    if (cinfo->in_color_space == JCS_CMYK)

+      cconvert->pub.color_convert = null_convert;

+    else

+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);

+    break;

+

+  case JCS_YCCK:

+    if (cinfo->num_components != 4)

+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);

+    if (cinfo->in_color_space == JCS_CMYK) {

+      cconvert->pub.start_pass = rgb_ycc_start;

+      cconvert->pub.color_convert = cmyk_ycck_convert;

+    } else if (cinfo->in_color_space == JCS_YCCK)

+      cconvert->pub.color_convert = null_convert;

+    else

+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);

+    break;

+

+  default:			/* allow null conversion of JCS_UNKNOWN */

+    if (cinfo->jpeg_color_space != cinfo->in_color_space ||

+	cinfo->num_components != cinfo->input_components)

+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);

+    cconvert->pub.color_convert = null_convert;

+    break;

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c b/core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c
new file mode 100644
index 0000000..d408204
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c
@@ -0,0 +1,390 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jcdctmgr.c

+ *

+ * Copyright (C) 1994-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains the forward-DCT management logic.

+ * This code selects a particular DCT implementation to be used,

+ * and it performs related housekeeping chores including coefficient

+ * quantization.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jdct.h"		/* Private declarations for DCT subsystem */

+

+

+/* Private subobject for this module */

+

+typedef struct {

+  struct jpeg_forward_dct pub;	/* public fields */

+

+  /* Pointer to the DCT routine actually in use */

+  forward_DCT_method_ptr do_dct;

+

+  /* The actual post-DCT divisors --- not identical to the quant table

+   * entries, because of scaling (especially for an unnormalized DCT).

+   * Each table is given in normal array order.

+   */

+  DCTELEM * divisors[NUM_QUANT_TBLS];

+

+#ifdef DCT_FLOAT_SUPPORTED

+  /* Same as above for the floating-point case. */

+  float_DCT_method_ptr do_float_dct;

+  FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];

+#endif

+} my_fdct_controller;

+

+typedef my_fdct_controller * my_fdct_ptr;

+

+

+/*

+ * Initialize for a processing pass.

+ * Verify that all referenced Q-tables are present, and set up

+ * the divisor table for each one.

+ * In the current implementation, DCT of all components is done during

+ * the first pass, even if only some components will be output in the

+ * first scan.  Hence all components should be examined here.

+ */

+

+METHODDEF(void)

+start_pass_fdctmgr (j_compress_ptr cinfo)

+{

+  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;

+  int ci, qtblno, i;

+  jpeg_component_info *compptr;

+  JQUANT_TBL * qtbl;

+  DCTELEM * dtbl;

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    qtblno = compptr->quant_tbl_no;

+    /* Make sure specified quantization table is present */

+    if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||

+	cinfo->quant_tbl_ptrs[qtblno] == NULL)

+      ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);

+    qtbl = cinfo->quant_tbl_ptrs[qtblno];

+    /* Compute divisors for this quant table */

+    /* We may do this more than once for same table, but it's not a big deal */

+    switch (cinfo->dct_method) {

+#ifdef DCT_ISLOW_SUPPORTED

+    case JDCT_ISLOW:

+      /* For LL&M IDCT method, divisors are equal to raw quantization

+       * coefficients multiplied by 8 (to counteract scaling).

+       */

+      if (fdct->divisors[qtblno] == NULL) {

+	fdct->divisors[qtblno] = (DCTELEM *)

+	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				      DCTSIZE2 * SIZEOF(DCTELEM));

+      }

+      dtbl = fdct->divisors[qtblno];

+      for (i = 0; i < DCTSIZE2; i++) {

+	dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;

+      }

+      break;

+#endif

+#ifdef DCT_IFAST_SUPPORTED

+    case JDCT_IFAST:

+      {

+	/* For AA&N IDCT method, divisors are equal to quantization

+	 * coefficients scaled by scalefactor[row]*scalefactor[col], where

+	 *   scalefactor[0] = 1

+	 *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7

+	 * We apply a further scale factor of 8.

+	 */

+#define CONST_BITS 14

+	static const INT16 aanscales[DCTSIZE2] = {

+	  /* precomputed values scaled up by 14 bits */

+	  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,

+	  22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,

+	  21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,

+	  19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,

+	  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,

+	  12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,

+	   8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,

+	   4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247

+	};

+	SHIFT_TEMPS

+

+	if (fdct->divisors[qtblno] == NULL) {

+	  fdct->divisors[qtblno] = (DCTELEM *)

+	    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+					DCTSIZE2 * SIZEOF(DCTELEM));

+	}

+	dtbl = fdct->divisors[qtblno];

+	for (i = 0; i < DCTSIZE2; i++) {

+	  dtbl[i] = (DCTELEM)

+	    DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],

+				  (INT32) aanscales[i]),

+		    CONST_BITS-3);

+	}

+      }

+      break;

+#endif

+#ifdef DCT_FLOAT_SUPPORTED

+    case JDCT_FLOAT:

+      {

+	/* For float AA&N IDCT method, divisors are equal to quantization

+	 * coefficients scaled by scalefactor[row]*scalefactor[col], where

+	 *   scalefactor[0] = 1

+	 *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7

+	 * We apply a further scale factor of 8.

+	 * What's actually stored is 1/divisor so that the inner loop can

+	 * use a multiplication rather than a division.

+	 */

+	FAST_FLOAT * fdtbl;

+	int row, col;

+	static const double aanscalefactor[DCTSIZE] = {

+	  1.0, 1.387039845, 1.306562965, 1.175875602,

+	  1.0, 0.785694958, 0.541196100, 0.275899379

+	};

+

+	if (fdct->float_divisors[qtblno] == NULL) {

+	  fdct->float_divisors[qtblno] = (FAST_FLOAT *)

+	    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+					DCTSIZE2 * SIZEOF(FAST_FLOAT));

+	}

+	fdtbl = fdct->float_divisors[qtblno];

+	i = 0;

+	for (row = 0; row < DCTSIZE; row++) {

+	  for (col = 0; col < DCTSIZE; col++) {

+	    fdtbl[i] = (FAST_FLOAT)

+	      (1.0 / (((double) qtbl->quantval[i] *

+		       aanscalefactor[row] * aanscalefactor[col] * 8.0)));

+	    i++;

+	  }

+	}

+      }

+      break;

+#endif

+    default:

+      ERREXIT(cinfo, JERR_NOT_COMPILED);

+      break;

+    }

+  }

+}

+

+

+/*

+ * Perform forward DCT on one or more blocks of a component.

+ *

+ * The input samples are taken from the sample_data[] array starting at

+ * position start_row/start_col, and moving to the right for any additional

+ * blocks. The quantized coefficients are returned in coef_blocks[].

+ */

+

+METHODDEF(void)

+forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,

+	     JSAMPARRAY sample_data, JBLOCKROW coef_blocks,

+	     JDIMENSION start_row, JDIMENSION start_col,

+	     JDIMENSION num_blocks)

+/* This version is used for integer DCT implementations. */

+{

+  /* This routine is heavily used, so it's worth coding it tightly. */

+  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;

+  forward_DCT_method_ptr do_dct = fdct->do_dct;

+  DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];

+  DCTELEM workspace[DCTSIZE2];	/* work area for FDCT subroutine */

+  JDIMENSION bi;

+

+  sample_data += start_row;	/* fold in the vertical offset once */

+

+  for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {

+    /* Load data into workspace, applying unsigned->signed conversion */

+    { register DCTELEM *workspaceptr;

+      register JSAMPROW elemptr;

+      register int elemr;

+

+      workspaceptr = workspace;

+      for (elemr = 0; elemr < DCTSIZE; elemr++) {

+	elemptr = sample_data[elemr] + start_col;

+#if DCTSIZE == 8		/* unroll the inner loop */

+	*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;

+	*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;

+	*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;

+	*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;

+	*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;

+	*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;

+	*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;

+	*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;

+#else

+	{ register int elemc;

+	  for (elemc = DCTSIZE; elemc > 0; elemc--) {

+	    *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;

+	  }

+	}

+#endif

+      }

+    }

+

+    /* Perform the DCT */

+    (*do_dct) (workspace);

+

+    /* Quantize/descale the coefficients, and store into coef_blocks[] */

+    { register DCTELEM temp, qval;

+      register int i;

+      register JCOEFPTR output_ptr = coef_blocks[bi];

+

+      for (i = 0; i < DCTSIZE2; i++) {

+	qval = divisors[i];

+	temp = workspace[i];

+	/* Divide the coefficient value by qval, ensuring proper rounding.

+	 * Since C does not specify the direction of rounding for negative

+	 * quotients, we have to force the dividend positive for portability.

+	 *

+	 * In most files, at least half of the output values will be zero

+	 * (at default quantization settings, more like three-quarters...)

+	 * so we should ensure that this case is fast.  On many machines,

+	 * a comparison is enough cheaper than a divide to make a special test

+	 * a win.  Since both inputs will be nonnegative, we need only test

+	 * for a < b to discover whether a/b is 0.

+	 * If your machine's division is fast enough, define FAST_DIVIDE.

+	 */

+#ifdef FAST_DIVIDE

+#define DIVIDE_BY(a,b)	a /= b

+#else

+#define DIVIDE_BY(a,b)	if (a >= b) a /= b; else a = 0

+#endif

+	if (temp < 0) {

+	  temp = -temp;

+	  temp += qval>>1;	/* for rounding */

+	  DIVIDE_BY(temp, qval);

+	  temp = -temp;

+	} else {

+	  temp += qval>>1;	/* for rounding */

+	  DIVIDE_BY(temp, qval);

+	}

+	output_ptr[i] = (JCOEF) temp;

+      }

+    }

+  }

+}

+

+

+#ifdef DCT_FLOAT_SUPPORTED

+

+METHODDEF(void)

+forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,

+		   JSAMPARRAY sample_data, JBLOCKROW coef_blocks,

+		   JDIMENSION start_row, JDIMENSION start_col,

+		   JDIMENSION num_blocks)

+/* This version is used for floating-point DCT implementations. */

+{

+  /* This routine is heavily used, so it's worth coding it tightly. */

+  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;

+  float_DCT_method_ptr do_dct = fdct->do_float_dct;

+  FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];

+  FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */

+  JDIMENSION bi;

+

+  sample_data += start_row;	/* fold in the vertical offset once */

+

+  for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {

+    /* Load data into workspace, applying unsigned->signed conversion */

+    { register FAST_FLOAT *workspaceptr;

+      register JSAMPROW elemptr;

+      register int elemr;

+

+      workspaceptr = workspace;

+      for (elemr = 0; elemr < DCTSIZE; elemr++) {

+	elemptr = sample_data[elemr] + start_col;

+#if DCTSIZE == 8		/* unroll the inner loop */

+	*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);

+	*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);

+	*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);

+	*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);

+	*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);

+	*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);

+	*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);

+	*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);

+#else

+	{ register int elemc;

+	  for (elemc = DCTSIZE; elemc > 0; elemc--) {

+	    *workspaceptr++ = (FAST_FLOAT)

+	      (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);

+	  }

+	}

+#endif

+      }

+    }

+

+    /* Perform the DCT */

+    (*do_dct) (workspace);

+

+    /* Quantize/descale the coefficients, and store into coef_blocks[] */

+    { register FAST_FLOAT temp;

+      register int i;

+      register JCOEFPTR output_ptr = coef_blocks[bi];

+

+      for (i = 0; i < DCTSIZE2; i++) {

+	/* Apply the quantization and scaling factor */

+	temp = workspace[i] * divisors[i];

+	/* Round to nearest integer.

+	 * Since C does not specify the direction of rounding for negative

+	 * quotients, we have to force the dividend positive for portability.

+	 * The maximum coefficient size is +-16K (for 12-bit data), so this

+	 * code should work for either 16-bit or 32-bit ints.

+	 */

+	output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384);

+      }

+    }

+  }

+}

+

+#endif /* DCT_FLOAT_SUPPORTED */

+

+

+/*

+ * Initialize FDCT manager.

+ */

+

+GLOBAL(void)

+jinit_forward_dct (j_compress_ptr cinfo)

+{

+  my_fdct_ptr fdct;

+  int i;

+

+  fdct = (my_fdct_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_fdct_controller));

+  cinfo->fdct = (struct jpeg_forward_dct *) fdct;

+  fdct->pub.start_pass = start_pass_fdctmgr;

+

+  switch (cinfo->dct_method) {

+#ifdef DCT_ISLOW_SUPPORTED

+  case JDCT_ISLOW:

+    fdct->pub.forward_DCT = forward_DCT;

+    fdct->do_dct = jpeg_fdct_islow;

+    break;

+#endif

+#ifdef DCT_IFAST_SUPPORTED

+  case JDCT_IFAST:

+    fdct->pub.forward_DCT = forward_DCT;

+    fdct->do_dct = jpeg_fdct_ifast;

+    break;

+#endif

+#ifdef DCT_FLOAT_SUPPORTED

+  case JDCT_FLOAT:

+    fdct->pub.forward_DCT = forward_DCT_float;

+    fdct->do_float_dct = jpeg_fdct_float;

+    break;

+#endif

+  default:

+    ERREXIT(cinfo, JERR_NOT_COMPILED);

+    break;

+  }

+

+  /* Mark divisor tables unallocated */

+  for (i = 0; i < NUM_QUANT_TBLS; i++) {

+    fdct->divisors[i] = NULL;

+#ifdef DCT_FLOAT_SUPPORTED

+    fdct->float_divisors[i] = NULL;

+#endif

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jchuff.c b/core/src/fxcodec/libjpeg/fpdfapi_jchuff.c
new file mode 100644
index 0000000..9ed1fe6
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jchuff.c
@@ -0,0 +1,915 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jchuff.c

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains Huffman entropy encoding routines.

+ *

+ * Much of the complexity here has to do with supporting output suspension.

+ * If the data destination module demands suspension, we want to be able to

+ * back up to the start of the current MCU.  To do this, we copy state

+ * variables into local working storage, and update them back to the

+ * permanent JPEG objects only upon successful completion of an MCU.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jchuff.h"		/* Declarations shared with jcphuff.c */

+

+#ifdef _FX_MANAGED_CODE_

+#define savable_state	savable_state_c

+#endif

+

+/* Expanded entropy encoder object for Huffman encoding.

+ *

+ * The savable_state subrecord contains fields that change within an MCU,

+ * but must not be updated permanently until we complete the MCU.

+ */

+

+typedef struct {

+  INT32 put_buffer;		/* current bit-accumulation buffer */

+  int put_bits;			/* # of bits now in it */

+  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */

+} savable_state;

+

+/* This macro is to work around compilers with missing or broken

+ * structure assignment.  You'll need to fix this code if you have

+ * such a compiler and you change MAX_COMPS_IN_SCAN.

+ */

+

+#ifndef NO_STRUCT_ASSIGN

+#define ASSIGN_STATE(dest,src)  ((dest) = (src))

+#else

+#if MAX_COMPS_IN_SCAN == 4

+#define ASSIGN_STATE(dest,src)  \

+	((dest).put_buffer = (src).put_buffer, \

+	 (dest).put_bits = (src).put_bits, \

+	 (dest).last_dc_val[0] = (src).last_dc_val[0], \

+	 (dest).last_dc_val[1] = (src).last_dc_val[1], \

+	 (dest).last_dc_val[2] = (src).last_dc_val[2], \

+	 (dest).last_dc_val[3] = (src).last_dc_val[3])

+#endif

+#endif

+

+

+typedef struct {

+  struct jpeg_entropy_encoder pub; /* public fields */

+

+  savable_state saved;		/* Bit buffer & DC state at start of MCU */

+

+  /* These fields are NOT loaded into local working state. */

+  unsigned int restarts_to_go;	/* MCUs left in this restart interval */

+  int next_restart_num;		/* next restart number to write (0-7) */

+

+  /* Pointers to derived tables (these workspaces have image lifespan) */

+  c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];

+  c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];

+

+#ifdef ENTROPY_OPT_SUPPORTED	/* Statistics tables for optimization */

+  long * dc_count_ptrs[NUM_HUFF_TBLS];

+  long * ac_count_ptrs[NUM_HUFF_TBLS];

+#endif

+} huff_entropy_encoder;

+

+typedef huff_entropy_encoder * huff_entropy_ptr;

+

+/* Working state while writing an MCU.

+ * This struct contains all the fields that are needed by subroutines.

+ */

+

+typedef struct {

+  JOCTET * next_output_byte;	/* => next byte to write in buffer */

+  size_t free_in_buffer;	/* # of byte spaces remaining in buffer */

+  savable_state cur;		/* Current bit buffer & DC state */

+  j_compress_ptr cinfo;		/* dump_buffer needs access to this */

+} working_state;

+

+

+/* Forward declarations */

+METHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo,

+					JBLOCKROW *MCU_data));

+METHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo));

+#ifdef ENTROPY_OPT_SUPPORTED

+METHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo,

+					  JBLOCKROW *MCU_data));

+METHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo));

+#endif

+

+

+/*

+ * Initialize for a Huffman-compressed scan.

+ * If gather_statistics is TRUE, we do not output anything during the scan,

+ * just count the Huffman symbols used and generate Huffman code tables.

+ */

+

+METHODDEF(void)

+start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)

+{

+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;

+  int ci, dctbl, actbl;

+  jpeg_component_info * compptr;

+

+  if (gather_statistics) {

+#ifdef ENTROPY_OPT_SUPPORTED

+    entropy->pub.encode_mcu = encode_mcu_gather;

+    entropy->pub.finish_pass = finish_pass_gather;

+#else

+    ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif

+  } else {

+    entropy->pub.encode_mcu = encode_mcu_huff;

+    entropy->pub.finish_pass = finish_pass_huff;

+  }

+

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+    compptr = cinfo->cur_comp_info[ci];

+    dctbl = compptr->dc_tbl_no;

+    actbl = compptr->ac_tbl_no;

+    if (gather_statistics) {

+#ifdef ENTROPY_OPT_SUPPORTED

+      /* Check for invalid table indexes */

+      /* (make_c_derived_tbl does this in the other path) */

+      if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS)

+	ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl);

+      if (actbl < 0 || actbl >= NUM_HUFF_TBLS)

+	ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl);

+      /* Allocate and zero the statistics tables */

+      /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */

+      if (entropy->dc_count_ptrs[dctbl] == NULL)

+	entropy->dc_count_ptrs[dctbl] = (long *)

+	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				      257 * SIZEOF(long));

+      MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long));

+      if (entropy->ac_count_ptrs[actbl] == NULL)

+	entropy->ac_count_ptrs[actbl] = (long *)

+	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				      257 * SIZEOF(long));

+      MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long));

+#endif

+    } else {

+      /* Compute derived values for Huffman tables */

+      /* We may do this more than once for a table, but it's not expensive */

+      jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl,

+			      & entropy->dc_derived_tbls[dctbl]);

+      jpeg_make_c_derived_tbl(cinfo, FALSE, actbl,

+			      & entropy->ac_derived_tbls[actbl]);

+    }

+    /* Initialize DC predictions to 0 */

+    entropy->saved.last_dc_val[ci] = 0;

+  }

+

+  /* Initialize bit buffer to empty */

+  entropy->saved.put_buffer = 0;

+  entropy->saved.put_bits = 0;

+

+  /* Initialize restart stuff */

+  entropy->restarts_to_go = cinfo->restart_interval;

+  entropy->next_restart_num = 0;

+}

+

+

+/*

+ * Compute the derived values for a Huffman table.

+ * This routine also performs some validation checks on the table.

+ *

+ * Note this is also used by jcphuff.c.

+ */

+

+GLOBAL(void)

+jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,

+			 c_derived_tbl ** pdtbl)

+{

+  JHUFF_TBL *htbl;

+  c_derived_tbl *dtbl;

+  int p, i, l, lastp, _si, maxsymbol;

+  char huffsize[257];

+  unsigned int huffcode[257];

+  unsigned int code;

+

+  /* Note that huffsize[] and huffcode[] are filled in code-length order,

+   * paralleling the order of the symbols themselves in htbl->huffval[].

+   */

+

+  /* Find the input Huffman table */

+  if (tblno < 0 || tblno >= NUM_HUFF_TBLS)

+    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);

+  htbl =

+    isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];

+  if (htbl == NULL)

+    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);

+

+  /* Allocate a workspace if we haven't already done so. */

+  if (*pdtbl == NULL)

+    *pdtbl = (c_derived_tbl *)

+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				  SIZEOF(c_derived_tbl));

+  dtbl = *pdtbl;

+  

+  /* Figure C.1: make table of Huffman code length for each symbol */

+

+  p = 0;

+  for (l = 1; l <= 16; l++) {

+    i = (int) htbl->bits[l];

+    if (i < 0 || p + i > 256)	/* protect against table overrun */

+      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);

+    while (i--)

+      huffsize[p++] = (char) l;

+  }

+  huffsize[p] = 0;

+  lastp = p;

+  

+  /* Figure C.2: generate the codes themselves */

+  /* We also validate that the counts represent a legal Huffman code tree. */

+

+  code = 0;

+  _si = huffsize[0];

+  p = 0;

+  while (huffsize[p]) {

+    while (((int) huffsize[p]) == _si) {

+      huffcode[p++] = code;

+      code++;

+    }

+    /* code is now 1 more than the last code used for codelength si; but

+     * it must still fit in si bits, since no code is allowed to be all ones.

+     */

+    if (((INT32) code) >= (((INT32) 1) << _si))

+      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);

+    code <<= 1;

+    _si++;

+  }

+  

+  /* Figure C.3: generate encoding tables */

+  /* These are code and size indexed by symbol value */

+

+  /* Set all codeless symbols to have code length 0;

+   * this lets us detect duplicate VAL entries here, and later

+   * allows emit_bits to detect any attempt to emit such symbols.

+   */

+  MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi));

+

+  /* This is also a convenient place to check for out-of-range

+   * and duplicated VAL entries.  We allow 0..255 for AC symbols

+   * but only 0..15 for DC.  (We could constrain them further

+   * based on data depth and mode, but this seems enough.)

+   */

+  maxsymbol = isDC ? 15 : 255;

+

+  for (p = 0; p < lastp; p++) {

+    i = htbl->huffval[p];

+    if (i < 0 || i > maxsymbol || dtbl->ehufsi[i])

+      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);

+    dtbl->ehufco[i] = huffcode[p];

+    dtbl->ehufsi[i] = huffsize[p];

+  }

+}

+

+

+/* Outputting bytes to the file */

+

+/* Emit a byte, taking 'action' if must suspend. */

+#define emit_byte(state,val,action)  \

+	{ *(state)->next_output_byte++ = (JOCTET) (val);  \

+	  if (--(state)->free_in_buffer == 0)  \

+	    if (! dump_buffer(state))  \

+	      { action; } }

+

+

+LOCAL(boolean)

+dump_buffer (working_state * state)

+/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */

+{

+  struct jpeg_destination_mgr * dest = state->cinfo->dest;

+

+  if (! (*dest->empty_output_buffer) (state->cinfo))

+    return FALSE;

+  /* After a successful buffer dump, must reset buffer pointers */

+  state->next_output_byte = dest->next_output_byte;

+  state->free_in_buffer = dest->free_in_buffer;

+  return TRUE;

+}

+

+

+/* Outputting bits to the file */

+

+/* Only the right 24 bits of put_buffer are used; the valid bits are

+ * left-justified in this part.  At most 16 bits can be passed to emit_bits

+ * in one call, and we never retain more than 7 bits in put_buffer

+ * between calls, so 24 bits are sufficient.

+ */

+

+INLINE

+LOCAL(boolean)

+emit_bits (working_state * state, unsigned int code, int size)

+/* Emit some bits; return TRUE if successful, FALSE if must suspend */

+{

+  /* This routine is heavily used, so it's worth coding tightly. */

+  register INT32 put_buffer = (INT32) code;

+  register int put_bits = state->cur.put_bits;

+

+  /* if size is 0, caller used an invalid Huffman table entry */

+  if (size == 0)

+    ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);

+

+  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */

+  

+  put_bits += size;		/* new number of bits in buffer */

+  

+  put_buffer <<= 24 - put_bits; /* align incoming bits */

+

+  put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */

+  

+  while (put_bits >= 8) {

+    int c = (int) ((put_buffer >> 16) & 0xFF);

+    

+    emit_byte(state, c, return FALSE);

+    if (c == 0xFF) {		/* need to stuff a zero byte? */

+      emit_byte(state, 0, return FALSE);

+    }

+    put_buffer <<= 8;

+    put_bits -= 8;

+  }

+

+  state->cur.put_buffer = put_buffer; /* update state variables */

+  state->cur.put_bits = put_bits;

+

+  return TRUE;

+}

+

+

+LOCAL(boolean)

+flush_bits (working_state * state)

+{

+  if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */

+    return FALSE;

+  state->cur.put_buffer = 0;	/* and reset bit-buffer to empty */

+  state->cur.put_bits = 0;

+  return TRUE;

+}

+

+

+/* Encode a single block's worth of coefficients */

+

+LOCAL(boolean)

+encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,

+		  c_derived_tbl *dctbl, c_derived_tbl *actbl)

+{

+  register int temp, temp2;

+  register int nbits;

+  register int k, r, i;

+  

+  /* Encode the DC coefficient difference per section F.1.2.1 */

+  

+  temp = temp2 = block[0] - last_dc_val;

+

+  if (temp < 0) {

+    temp = -temp;		/* temp is abs value of input */

+    /* For a negative input, want temp2 = bitwise complement of abs(input) */

+    /* This code assumes we are on a two's complement machine */

+    temp2--;

+  }

+  

+  /* Find the number of bits needed for the magnitude of the coefficient */

+  nbits = 0;

+  while (temp) {

+    nbits++;

+    temp >>= 1;

+  }

+  /* Check for out-of-range coefficient values.

+   * Since we're encoding a difference, the range limit is twice as much.

+   */

+  if (nbits > MAX_COEF_BITS+1)

+    ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);

+  

+  /* Emit the Huffman-coded symbol for the number of bits */

+  if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits]))

+    return FALSE;

+

+  /* Emit that number of bits of the value, if positive, */

+  /* or the complement of its magnitude, if negative. */

+  if (nbits)			/* emit_bits rejects calls with size 0 */

+    if (! emit_bits(state, (unsigned int) temp2, nbits))

+      return FALSE;

+

+  /* Encode the AC coefficients per section F.1.2.2 */

+  

+  r = 0;			/* r = run length of zeros */

+  

+  for (k = 1; k < DCTSIZE2; k++) {

+    if ((temp = block[jpeg_natural_order[k]]) == 0) {

+      r++;

+    } else {

+      /* if run length > 15, must emit special run-length-16 codes (0xF0) */

+      while (r > 15) {

+	if (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0]))

+	  return FALSE;

+	r -= 16;

+      }

+

+      temp2 = temp;

+      if (temp < 0) {

+	temp = -temp;		/* temp is abs value of input */

+	/* This code assumes we are on a two's complement machine */

+	temp2--;

+      }

+      

+      /* Find the number of bits needed for the magnitude of the coefficient */

+      nbits = 1;		/* there must be at least one 1 bit */

+      while ((temp >>= 1))

+	nbits++;

+      /* Check for out-of-range coefficient values */

+      if (nbits > MAX_COEF_BITS)

+	ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);

+      

+      /* Emit Huffman symbol for run length / number of bits */

+      i = (r << 4) + nbits;

+      if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i]))

+	return FALSE;

+

+      /* Emit that number of bits of the value, if positive, */

+      /* or the complement of its magnitude, if negative. */

+      if (! emit_bits(state, (unsigned int) temp2, nbits))

+	return FALSE;

+      

+      r = 0;

+    }

+  }

+

+  /* If the last coef(s) were zero, emit an end-of-block code */

+  if (r > 0)

+    if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0]))

+      return FALSE;

+

+  return TRUE;

+}

+

+

+/*

+ * Emit a restart marker & resynchronize predictions.

+ */

+

+LOCAL(boolean)

+emit_restart (working_state * state, int restart_num)

+{

+  int ci;

+

+  if (! flush_bits(state))

+    return FALSE;

+

+  emit_byte(state, 0xFF, return FALSE);

+  emit_byte(state, JPEG_RST0 + restart_num, return FALSE);

+

+  /* Re-initialize DC predictions to 0 */

+  for (ci = 0; ci < state->cinfo->comps_in_scan; ci++)

+    state->cur.last_dc_val[ci] = 0;

+

+  /* The restart counter is not updated until we successfully write the MCU. */

+

+  return TRUE;

+}

+

+

+/*

+ * Encode and output one MCU's worth of Huffman-compressed coefficients.

+ */

+

+METHODDEF(boolean)

+encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)

+{

+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;

+  working_state state;

+  int blkn, ci;

+  jpeg_component_info * compptr;

+

+  /* Load up working state */

+  state.next_output_byte = cinfo->dest->next_output_byte;

+  state.free_in_buffer = cinfo->dest->free_in_buffer;

+  ASSIGN_STATE(state.cur, entropy->saved);

+  state.cinfo = cinfo;

+

+  /* Emit restart marker if needed */

+  if (cinfo->restart_interval) {

+    if (entropy->restarts_to_go == 0)

+      if (! emit_restart(&state, entropy->next_restart_num))

+	return FALSE;

+  }

+

+  /* Encode the MCU data blocks */

+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {

+    ci = cinfo->MCU_membership[blkn];

+    compptr = cinfo->cur_comp_info[ci];

+    if (! encode_one_block(&state,

+			   MCU_data[blkn][0], state.cur.last_dc_val[ci],

+			   entropy->dc_derived_tbls[compptr->dc_tbl_no],

+			   entropy->ac_derived_tbls[compptr->ac_tbl_no]))

+      return FALSE;

+    /* Update last_dc_val */

+    state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];

+  }

+

+  /* Completed MCU, so update state */

+  cinfo->dest->next_output_byte = state.next_output_byte;

+  cinfo->dest->free_in_buffer = state.free_in_buffer;

+  ASSIGN_STATE(entropy->saved, state.cur);

+

+  /* Update restart-interval state too */

+  if (cinfo->restart_interval) {

+    if (entropy->restarts_to_go == 0) {

+      entropy->restarts_to_go = cinfo->restart_interval;

+      entropy->next_restart_num++;

+      entropy->next_restart_num &= 7;

+    }

+    entropy->restarts_to_go--;

+  }

+

+  return TRUE;

+}

+

+

+/*

+ * Finish up at the end of a Huffman-compressed scan.

+ */

+

+METHODDEF(void)

+finish_pass_huff (j_compress_ptr cinfo)

+{

+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;

+  working_state state;

+

+  /* Load up working state ... flush_bits needs it */

+  state.next_output_byte = cinfo->dest->next_output_byte;

+  state.free_in_buffer = cinfo->dest->free_in_buffer;

+  ASSIGN_STATE(state.cur, entropy->saved);

+  state.cinfo = cinfo;

+

+  /* Flush out the last data */

+  if (! flush_bits(&state))

+    ERREXIT(cinfo, JERR_CANT_SUSPEND);

+

+  /* Update state */

+  cinfo->dest->next_output_byte = state.next_output_byte;

+  cinfo->dest->free_in_buffer = state.free_in_buffer;

+  ASSIGN_STATE(entropy->saved, state.cur);

+}

+

+

+/*

+ * Huffman coding optimization.

+ *

+ * We first scan the supplied data and count the number of uses of each symbol

+ * that is to be Huffman-coded. (This process MUST agree with the code above.)

+ * Then we build a Huffman coding tree for the observed counts.

+ * Symbols which are not needed at all for the particular image are not

+ * assigned any code, which saves space in the DHT marker as well as in

+ * the compressed data.

+ */

+

+#ifdef ENTROPY_OPT_SUPPORTED

+

+

+/* Process a single block's worth of coefficients */

+

+LOCAL(void)

+htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,

+		 long dc_counts[], long ac_counts[])

+{

+  register int temp;

+  register int nbits;

+  register int k, r;

+  

+  /* Encode the DC coefficient difference per section F.1.2.1 */

+  

+  temp = block[0] - last_dc_val;

+  if (temp < 0)

+    temp = -temp;

+  

+  /* Find the number of bits needed for the magnitude of the coefficient */

+  nbits = 0;

+  while (temp) {

+    nbits++;

+    temp >>= 1;

+  }

+  /* Check for out-of-range coefficient values.

+   * Since we're encoding a difference, the range limit is twice as much.

+   */

+  if (nbits > MAX_COEF_BITS+1)

+    ERREXIT(cinfo, JERR_BAD_DCT_COEF);

+

+  /* Count the Huffman symbol for the number of bits */

+  dc_counts[nbits]++;

+  

+  /* Encode the AC coefficients per section F.1.2.2 */

+  

+  r = 0;			/* r = run length of zeros */

+  

+  for (k = 1; k < DCTSIZE2; k++) {

+    if ((temp = block[jpeg_natural_order[k]]) == 0) {

+      r++;

+    } else {

+      /* if run length > 15, must emit special run-length-16 codes (0xF0) */

+      while (r > 15) {

+	ac_counts[0xF0]++;

+	r -= 16;

+      }

+      

+      /* Find the number of bits needed for the magnitude of the coefficient */

+      if (temp < 0)

+	temp = -temp;

+      

+      /* Find the number of bits needed for the magnitude of the coefficient */

+      nbits = 1;		/* there must be at least one 1 bit */

+      while ((temp >>= 1))

+	nbits++;

+      /* Check for out-of-range coefficient values */

+      if (nbits > MAX_COEF_BITS)

+	ERREXIT(cinfo, JERR_BAD_DCT_COEF);

+      

+      /* Count Huffman symbol for run length / number of bits */

+      ac_counts[(r << 4) + nbits]++;

+      

+      r = 0;

+    }

+  }

+

+  /* If the last coef(s) were zero, emit an end-of-block code */

+  if (r > 0)

+    ac_counts[0]++;

+}

+

+

+/*

+ * Trial-encode one MCU's worth of Huffman-compressed coefficients.

+ * No data is actually output, so no suspension return is possible.

+ */

+

+METHODDEF(boolean)

+encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data)

+{

+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;

+  int blkn, ci;

+  jpeg_component_info * compptr;

+

+  /* Take care of restart intervals if needed */

+  if (cinfo->restart_interval) {

+    if (entropy->restarts_to_go == 0) {

+      /* Re-initialize DC predictions to 0 */

+      for (ci = 0; ci < cinfo->comps_in_scan; ci++)

+	entropy->saved.last_dc_val[ci] = 0;

+      /* Update restart state */

+      entropy->restarts_to_go = cinfo->restart_interval;

+    }

+    entropy->restarts_to_go--;

+  }

+

+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {

+    ci = cinfo->MCU_membership[blkn];

+    compptr = cinfo->cur_comp_info[ci];

+    htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci],

+		    entropy->dc_count_ptrs[compptr->dc_tbl_no],

+		    entropy->ac_count_ptrs[compptr->ac_tbl_no]);

+    entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0];

+  }

+

+  return TRUE;

+}

+

+

+/*

+ * Generate the best Huffman code table for the given counts, fill htbl.

+ * Note this is also used by jcphuff.c.

+ *

+ * The JPEG standard requires that no symbol be assigned a codeword of all

+ * one bits (so that padding bits added at the end of a compressed segment

+ * can't look like a valid code).  Because of the canonical ordering of

+ * codewords, this just means that there must be an unused slot in the

+ * longest codeword length category.  Section K.2 of the JPEG spec suggests

+ * reserving such a slot by pretending that symbol 256 is a valid symbol

+ * with count 1.  In theory that's not optimal; giving it count zero but

+ * including it in the symbol set anyway should give a better Huffman code.

+ * But the theoretically better code actually seems to come out worse in

+ * practice, because it produces more all-ones bytes (which incur stuffed

+ * zero bytes in the final file).  In any case the difference is tiny.

+ *

+ * The JPEG standard requires Huffman codes to be no more than 16 bits long.

+ * If some symbols have a very small but nonzero probability, the Huffman tree

+ * must be adjusted to meet the code length restriction.  We currently use

+ * the adjustment method suggested in JPEG section K.2.  This method is *not*

+ * optimal; it may not choose the best possible limited-length code.  But

+ * typically only very-low-frequency symbols will be given less-than-optimal

+ * lengths, so the code is almost optimal.  Experimental comparisons against

+ * an optimal limited-length-code algorithm indicate that the difference is

+ * microscopic --- usually less than a hundredth of a percent of total size.

+ * So the extra complexity of an optimal algorithm doesn't seem worthwhile.

+ */

+

+GLOBAL(void)

+jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])

+{

+#define MAX_CLEN 32		/* assumed maximum initial code length */

+  UINT8 bits[MAX_CLEN+1];	/* bits[k] = # of symbols with code length k */

+  int codesize[257];		/* codesize[k] = code length of symbol k */

+  int others[257];		/* next symbol in current branch of tree */

+  int c1, c2;

+  int p, i, j;

+  long v;

+

+  /* This algorithm is explained in section K.2 of the JPEG standard */

+

+  MEMZERO(bits, SIZEOF(bits));

+  MEMZERO(codesize, SIZEOF(codesize));

+  for (i = 0; i < 257; i++)

+    others[i] = -1;		/* init links to empty */

+  

+  freq[256] = 1;		/* make sure 256 has a nonzero count */

+  /* Including the pseudo-symbol 256 in the Huffman procedure guarantees

+   * that no real symbol is given code-value of all ones, because 256

+   * will be placed last in the largest codeword category.

+   */

+

+  /* Huffman's basic algorithm to assign optimal code lengths to symbols */

+

+  for (;;) {

+    /* Find the smallest nonzero frequency, set c1 = its symbol */

+    /* In case of ties, take the larger symbol number */

+    c1 = -1;

+    v = 1000000000L;

+    for (i = 0; i <= 256; i++) {

+      if (freq[i] && freq[i] <= v) {

+	v = freq[i];

+	c1 = i;

+      }

+    }

+

+    /* Find the next smallest nonzero frequency, set c2 = its symbol */

+    /* In case of ties, take the larger symbol number */

+    c2 = -1;

+    v = 1000000000L;

+    for (i = 0; i <= 256; i++) {

+      if (freq[i] && freq[i] <= v && i != c1) {

+	v = freq[i];

+	c2 = i;

+      }

+    }

+

+    /* Done if we've merged everything into one frequency */

+    if (c2 < 0)

+      break;

+    

+    /* Else merge the two counts/trees */

+    freq[c1] += freq[c2];

+    freq[c2] = 0;

+

+    /* Increment the codesize of everything in c1's tree branch */

+    codesize[c1]++;

+    while (others[c1] >= 0) {

+      c1 = others[c1];

+      codesize[c1]++;

+    }

+    

+    others[c1] = c2;		/* chain c2 onto c1's tree branch */

+    

+    /* Increment the codesize of everything in c2's tree branch */

+    codesize[c2]++;

+    while (others[c2] >= 0) {

+      c2 = others[c2];

+      codesize[c2]++;

+    }

+  }

+

+  /* Now count the number of symbols of each code length */

+  for (i = 0; i <= 256; i++) {

+    if (codesize[i]) {

+      /* The JPEG standard seems to think that this can't happen, */

+      /* but I'm paranoid... */

+      if (codesize[i] > MAX_CLEN)

+	ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);

+

+      bits[codesize[i]]++;

+    }

+  }

+

+  /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure

+   * Huffman procedure assigned any such lengths, we must adjust the coding.

+   * Here is what the JPEG spec says about how this next bit works:

+   * Since symbols are paired for the longest Huffman code, the symbols are

+   * removed from this length category two at a time.  The prefix for the pair

+   * (which is one bit shorter) is allocated to one of the pair; then,

+   * skipping the BITS entry for that prefix length, a code word from the next

+   * shortest nonzero BITS entry is converted into a prefix for two code words

+   * one bit longer.

+   */

+  

+  for (i = MAX_CLEN; i > 16; i--) {

+    while (bits[i] > 0) {

+      j = i - 2;		/* find length of new prefix to be used */

+      while (bits[j] == 0)

+	j--;

+      

+      bits[i] -= 2;		/* remove two symbols */

+      bits[i-1]++;		/* one goes in this length */

+      bits[j+1] += 2;		/* two new symbols in this length */

+      bits[j]--;		/* symbol of this length is now a prefix */

+    }

+  }

+

+  /* Remove the count for the pseudo-symbol 256 from the largest codelength */

+  while (bits[i] == 0)		/* find largest codelength still in use */

+    i--;

+  bits[i]--;

+  

+  /* Return final symbol counts (only for lengths 0..16) */

+  MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));

+  

+  /* Return a list of the symbols sorted by code length */

+  /* It's not real clear to me why we don't need to consider the codelength

+   * changes made above, but the JPEG spec seems to think this works.

+   */

+  p = 0;

+  for (i = 1; i <= MAX_CLEN; i++) {

+    for (j = 0; j <= 255; j++) {

+      if (codesize[j] == i) {

+	htbl->huffval[p] = (UINT8) j;

+	p++;

+      }

+    }

+  }

+

+  /* Set sent_table FALSE so updated table will be written to JPEG file. */

+  htbl->sent_table = FALSE;

+}

+

+

+/*

+ * Finish up a statistics-gathering pass and create the new Huffman tables.

+ */

+

+METHODDEF(void)

+finish_pass_gather (j_compress_ptr cinfo)

+{

+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;

+  int ci, dctbl, actbl;

+  jpeg_component_info * compptr;

+  JHUFF_TBL **htblptr;

+  boolean did_dc[NUM_HUFF_TBLS];

+  boolean did_ac[NUM_HUFF_TBLS];

+

+  /* It's important not to apply jpeg_gen_optimal_table more than once

+   * per table, because it clobbers the input frequency counts!

+   */

+  MEMZERO(did_dc, SIZEOF(did_dc));

+  MEMZERO(did_ac, SIZEOF(did_ac));

+

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+    compptr = cinfo->cur_comp_info[ci];

+    dctbl = compptr->dc_tbl_no;

+    actbl = compptr->ac_tbl_no;

+    if (! did_dc[dctbl]) {

+      htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl];

+      if (*htblptr == NULL)

+	*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);

+      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]);

+      did_dc[dctbl] = TRUE;

+    }

+    if (! did_ac[actbl]) {

+      htblptr = & cinfo->ac_huff_tbl_ptrs[actbl];

+      if (*htblptr == NULL)

+	*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);

+      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]);

+      did_ac[actbl] = TRUE;

+    }

+  }

+}

+

+

+#endif /* ENTROPY_OPT_SUPPORTED */

+

+

+/*

+ * Module initialization routine for Huffman entropy encoding.

+ */

+

+GLOBAL(void)

+jinit_huff_encoder (j_compress_ptr cinfo)

+{

+  huff_entropy_ptr entropy;

+  int i;

+

+  entropy = (huff_entropy_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(huff_entropy_encoder));

+  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;

+  entropy->pub.start_pass = start_pass_huff;

+

+  /* Mark tables unallocated */

+  for (i = 0; i < NUM_HUFF_TBLS; i++) {

+    entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;

+#ifdef ENTROPY_OPT_SUPPORTED

+    entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;

+#endif

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcinit.c b/core/src/fxcodec/libjpeg/fpdfapi_jcinit.c
new file mode 100644
index 0000000..a0d8f81
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcinit.c
@@ -0,0 +1,75 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jcinit.c

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains initialization logic for the JPEG compressor.

+ * This routine is in charge of selecting the modules to be executed and

+ * making an initialization call to each one.

+ *

+ * Logically, this code belongs in jcmaster.c.  It's split out because

+ * linking this routine implies linking the entire compression library.

+ * For a transcoding-only application, we want to be able to use jcmaster.c

+ * without linking in the whole library.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/*

+ * Master selection of compression modules.

+ * This is done once at the start of processing an image.  We determine

+ * which modules will be used and give them appropriate initialization calls.

+ */

+

+GLOBAL(void)

+jinit_compress_master (j_compress_ptr cinfo)

+{

+  /* Initialize master control (includes parameter checking/processing) */

+  jinit_c_master_control(cinfo, FALSE /* full compression */);

+

+  /* Preprocessing */

+  if (! cinfo->raw_data_in) {

+    jinit_color_converter(cinfo);

+    jinit_downsampler(cinfo);

+    jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */);

+  }

+  /* Forward DCT */

+  jinit_forward_dct(cinfo);

+  /* Entropy encoding: either Huffman or arithmetic coding. */

+  if (cinfo->arith_code) {

+    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);

+  } else {

+    if (cinfo->progressive_mode) {

+#ifdef C_PROGRESSIVE_SUPPORTED

+      jinit_phuff_encoder(cinfo);

+#else

+      ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif

+    } else

+      jinit_huff_encoder(cinfo);

+  }

+

+  /* Need a full-image coefficient buffer in any multi-pass mode. */

+  jinit_c_coef_controller(cinfo,

+		(boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding));

+  jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */);

+

+  jinit_marker_writer(cinfo);

+

+  /* We can now tell the memory manager to allocate virtual arrays. */

+  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);

+

+  /* Write the datastream header (SOI) immediately.

+   * Frame and scan headers are postponed till later.

+   * This lets application insert special markers after the SOI.

+   */

+  (*cinfo->marker->write_file_header) (cinfo);

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c b/core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c
new file mode 100644
index 0000000..25d61f2
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c
@@ -0,0 +1,296 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jcmainct.c

+ *

+ * Copyright (C) 1994-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains the main buffer controller for compression.

+ * The main buffer lies between the pre-processor and the JPEG

+ * compressor proper; it holds downsampled data in the JPEG colorspace.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* Note: currently, there is no operating mode in which a full-image buffer

+ * is needed at this step.  If there were, that mode could not be used with

+ * "raw data" input, since this module is bypassed in that case.  However,

+ * we've left the code here for possible use in special applications.

+ */

+#undef FULL_MAIN_BUFFER_SUPPORTED

+

+

+/* Private buffer controller object */

+

+typedef struct {

+  struct jpeg_c_main_controller pub; /* public fields */

+

+  JDIMENSION cur_iMCU_row;	/* number of current iMCU row */

+  JDIMENSION rowgroup_ctr;	/* counts row groups received in iMCU row */

+  boolean suspended;		/* remember if we suspended output */

+  J_BUF_MODE pass_mode;		/* current operating mode */

+

+  /* If using just a strip buffer, this points to the entire set of buffers

+   * (we allocate one for each component).  In the full-image case, this

+   * points to the currently accessible strips of the virtual arrays.

+   */

+  JSAMPARRAY buffer[MAX_COMPONENTS];

+

+#ifdef FULL_MAIN_BUFFER_SUPPORTED

+  /* If using full-image storage, this array holds pointers to virtual-array

+   * control blocks for each component.  Unused if not full-image storage.

+   */

+  jvirt_sarray_ptr whole_image[MAX_COMPONENTS];

+#endif

+} my_main_controller;

+

+typedef my_main_controller * my_main_ptr;

+

+

+/* Forward declarations */

+METHODDEF(void) process_data_simple_main

+	JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,

+	     JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));

+#ifdef FULL_MAIN_BUFFER_SUPPORTED

+METHODDEF(void) process_data_buffer_main

+	JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,

+	     JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));

+#endif

+

+

+/*

+ * Initialize for a processing pass.

+ */

+

+METHODDEF(void)

+start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)

+{

+  my_main_ptr main = (my_main_ptr) cinfo->main;

+

+  /* Do nothing in raw-data mode. */

+  if (cinfo->raw_data_in)

+    return;

+

+  main->cur_iMCU_row = 0;	/* initialize counters */

+  main->rowgroup_ctr = 0;

+  main->suspended = FALSE;

+  main->pass_mode = pass_mode;	/* save mode for use by process_data */

+

+  switch (pass_mode) {

+  case JBUF_PASS_THRU:

+#ifdef FULL_MAIN_BUFFER_SUPPORTED

+    if (main->whole_image[0] != NULL)

+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+#endif

+    main->pub.process_data = process_data_simple_main;

+    break;

+#ifdef FULL_MAIN_BUFFER_SUPPORTED

+  case JBUF_SAVE_SOURCE:

+  case JBUF_CRANK_DEST:

+  case JBUF_SAVE_AND_PASS:

+    if (main->whole_image[0] == NULL)

+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+    main->pub.process_data = process_data_buffer_main;

+    break;

+#endif

+  default:

+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+    break;

+  }

+}

+

+

+/*

+ * Process some data.

+ * This routine handles the simple pass-through mode,

+ * where we have only a strip buffer.

+ */

+

+METHODDEF(void)

+process_data_simple_main (j_compress_ptr cinfo,

+			  JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,

+			  JDIMENSION in_rows_avail)

+{

+  my_main_ptr main = (my_main_ptr) cinfo->main;

+

+  while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {

+    /* Read input data if we haven't filled the main buffer yet */

+    if (main->rowgroup_ctr < DCTSIZE)

+      (*cinfo->prep->pre_process_data) (cinfo,

+					input_buf, in_row_ctr, in_rows_avail,

+					main->buffer, &main->rowgroup_ctr,

+					(JDIMENSION) DCTSIZE);

+

+    /* If we don't have a full iMCU row buffered, return to application for

+     * more data.  Note that preprocessor will always pad to fill the iMCU row

+     * at the bottom of the image.

+     */

+    if (main->rowgroup_ctr != DCTSIZE)

+      return;

+

+    /* Send the completed row to the compressor */

+    if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {

+      /* If compressor did not consume the whole row, then we must need to

+       * suspend processing and return to the application.  In this situation

+       * we pretend we didn't yet consume the last input row; otherwise, if

+       * it happened to be the last row of the image, the application would

+       * think we were done.

+       */

+      if (! main->suspended) {

+	(*in_row_ctr)--;

+	main->suspended = TRUE;

+      }

+      return;

+    }

+    /* We did finish the row.  Undo our little suspension hack if a previous

+     * call suspended; then mark the main buffer empty.

+     */

+    if (main->suspended) {

+      (*in_row_ctr)++;

+      main->suspended = FALSE;

+    }

+    main->rowgroup_ctr = 0;

+    main->cur_iMCU_row++;

+  }

+}

+

+

+#ifdef FULL_MAIN_BUFFER_SUPPORTED

+

+/*

+ * Process some data.

+ * This routine handles all of the modes that use a full-size buffer.

+ */

+

+METHODDEF(void)

+process_data_buffer_main (j_compress_ptr cinfo,

+			  JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,

+			  JDIMENSION in_rows_avail)

+{

+  my_main_ptr main = (my_main_ptr) cinfo->main;

+  int ci;

+  jpeg_component_info *compptr;

+  boolean writing = (main->pass_mode != JBUF_CRANK_DEST);

+

+  while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {

+    /* Realign the virtual buffers if at the start of an iMCU row. */

+    if (main->rowgroup_ctr == 0) {

+      for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+	   ci++, compptr++) {

+	main->buffer[ci] = (*cinfo->mem->access_virt_sarray)

+	  ((j_common_ptr) cinfo, main->whole_image[ci],

+	   main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE),

+	   (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing);

+      }

+      /* In a read pass, pretend we just read some source data. */

+      if (! writing) {

+	*in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE;

+	main->rowgroup_ctr = DCTSIZE;

+      }

+    }

+

+    /* If a write pass, read input data until the current iMCU row is full. */

+    /* Note: preprocessor will pad if necessary to fill the last iMCU row. */

+    if (writing) {

+      (*cinfo->prep->pre_process_data) (cinfo,

+					input_buf, in_row_ctr, in_rows_avail,

+					main->buffer, &main->rowgroup_ctr,

+					(JDIMENSION) DCTSIZE);

+      /* Return to application if we need more data to fill the iMCU row. */

+      if (main->rowgroup_ctr < DCTSIZE)

+	return;

+    }

+

+    /* Emit data, unless this is a sink-only pass. */

+    if (main->pass_mode != JBUF_SAVE_SOURCE) {

+      if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {

+	/* If compressor did not consume the whole row, then we must need to

+	 * suspend processing and return to the application.  In this situation

+	 * we pretend we didn't yet consume the last input row; otherwise, if

+	 * it happened to be the last row of the image, the application would

+	 * think we were done.

+	 */

+	if (! main->suspended) {

+	  (*in_row_ctr)--;

+	  main->suspended = TRUE;

+	}

+	return;

+      }

+      /* We did finish the row.  Undo our little suspension hack if a previous

+       * call suspended; then mark the main buffer empty.

+       */

+      if (main->suspended) {

+	(*in_row_ctr)++;

+	main->suspended = FALSE;

+      }

+    }

+

+    /* If get here, we are done with this iMCU row.  Mark buffer empty. */

+    main->rowgroup_ctr = 0;

+    main->cur_iMCU_row++;

+  }

+}

+

+#endif /* FULL_MAIN_BUFFER_SUPPORTED */

+

+

+/*

+ * Initialize main buffer controller.

+ */

+

+GLOBAL(void)

+jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)

+{

+  my_main_ptr main;

+  int ci;

+  jpeg_component_info *compptr;

+

+  main = (my_main_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_main_controller));

+  cinfo->main = (struct jpeg_c_main_controller *) main;

+  main->pub.start_pass = start_pass_main;

+

+  /* We don't need to create a buffer in raw-data mode. */

+  if (cinfo->raw_data_in)

+    return;

+

+  /* Create the buffer.  It holds downsampled data, so each component

+   * may be of a different size.

+   */

+  if (need_full_buffer) {

+#ifdef FULL_MAIN_BUFFER_SUPPORTED

+    /* Allocate a full-image virtual array for each component */

+    /* Note we pad the bottom to a multiple of the iMCU height */

+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+	 ci++, compptr++) {

+      main->whole_image[ci] = (*cinfo->mem->request_virt_sarray)

+	((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,

+	 compptr->width_in_blocks * DCTSIZE,

+	 (JDIMENSION) jround_up((long) compptr->height_in_blocks,

+				(long) compptr->v_samp_factor) * DCTSIZE,

+	 (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));

+    }

+#else

+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+#endif

+  } else {

+#ifdef FULL_MAIN_BUFFER_SUPPORTED

+    main->whole_image[0] = NULL; /* flag for no virtual arrays */

+#endif

+    /* Allocate a strip buffer for each component */

+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+	 ci++, compptr++) {

+      main->buffer[ci] = (*cinfo->mem->alloc_sarray)

+	((j_common_ptr) cinfo, JPOOL_IMAGE,

+	 compptr->width_in_blocks * DCTSIZE,

+	 (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));

+    }

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c b/core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c
new file mode 100644
index 0000000..d0a9e87
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c
@@ -0,0 +1,667 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jcmarker.c

+ *

+ * Copyright (C) 1991-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains routines to write JPEG datastream markers.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+typedef enum {			/* JPEG marker codes */

+  M_SOF0  = 0xc0,

+  M_SOF1  = 0xc1,

+  M_SOF2  = 0xc2,

+  M_SOF3  = 0xc3,

+  

+  M_SOF5  = 0xc5,

+  M_SOF6  = 0xc6,

+  M_SOF7  = 0xc7,

+  

+  M_JPG   = 0xc8,

+  M_SOF9  = 0xc9,

+  M_SOF10 = 0xca,

+  M_SOF11 = 0xcb,

+  

+  M_SOF13 = 0xcd,

+  M_SOF14 = 0xce,

+  M_SOF15 = 0xcf,

+  

+  M_DHT   = 0xc4,

+  

+  M_DAC   = 0xcc,

+  

+  M_RST0  = 0xd0,

+  M_RST1  = 0xd1,

+  M_RST2  = 0xd2,

+  M_RST3  = 0xd3,

+  M_RST4  = 0xd4,

+  M_RST5  = 0xd5,

+  M_RST6  = 0xd6,

+  M_RST7  = 0xd7,

+  

+  M_SOI   = 0xd8,

+  M_EOI   = 0xd9,

+  M_SOS   = 0xda,

+  M_DQT   = 0xdb,

+  M_DNL   = 0xdc,

+  M_DRI   = 0xdd,

+  M_DHP   = 0xde,

+  M_EXP   = 0xdf,

+  

+  M_APP0  = 0xe0,

+  M_APP1  = 0xe1,

+  M_APP2  = 0xe2,

+  M_APP3  = 0xe3,

+  M_APP4  = 0xe4,

+  M_APP5  = 0xe5,

+  M_APP6  = 0xe6,

+  M_APP7  = 0xe7,

+  M_APP8  = 0xe8,

+  M_APP9  = 0xe9,

+  M_APP10 = 0xea,

+  M_APP11 = 0xeb,

+  M_APP12 = 0xec,

+  M_APP13 = 0xed,

+  M_APP14 = 0xee,

+  M_APP15 = 0xef,

+  

+  M_JPG0  = 0xf0,

+  M_JPG13 = 0xfd,

+  M_COM   = 0xfe,

+  

+  M_TEM   = 0x01,

+  

+  M_ERROR = 0x100

+} JPEG_MARKER;

+

+

+/* Private state */

+

+typedef struct {

+  struct jpeg_marker_writer pub; /* public fields */

+

+  unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */

+} my_marker_writer;

+

+typedef my_marker_writer * my_marker_ptr;

+

+

+/*

+ * Basic output routines.

+ *

+ * Note that we do not support suspension while writing a marker.

+ * Therefore, an application using suspension must ensure that there is

+ * enough buffer space for the initial markers (typ. 600-700 bytes) before

+ * calling jpeg_start_compress, and enough space to write the trailing EOI

+ * (a few bytes) before calling jpeg_finish_compress.  Multipass compression

+ * modes are not supported at all with suspension, so those two are the only

+ * points where markers will be written.

+ */

+

+LOCAL(void)

+emit_byte (j_compress_ptr cinfo, int val)

+/* Emit a byte */

+{

+  struct jpeg_destination_mgr * dest = cinfo->dest;

+

+  *(dest->next_output_byte)++ = (JOCTET) val;

+  if (--dest->free_in_buffer == 0) {

+    if (! (*dest->empty_output_buffer) (cinfo))

+      ERREXIT(cinfo, JERR_CANT_SUSPEND);

+  }

+}

+

+

+LOCAL(void)

+emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark)

+/* Emit a marker code */

+{

+  emit_byte(cinfo, 0xFF);

+  emit_byte(cinfo, (int) mark);

+}

+

+

+LOCAL(void)

+emit_2bytes (j_compress_ptr cinfo, int value)

+/* Emit a 2-byte integer; these are always MSB first in JPEG files */

+{

+  emit_byte(cinfo, (value >> 8) & 0xFF);

+  emit_byte(cinfo, value & 0xFF);

+}

+

+

+/*

+ * Routines to write specific marker types.

+ */

+

+LOCAL(int)

+emit_dqt (j_compress_ptr cinfo, int index)

+/* Emit a DQT marker */

+/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */

+{

+  JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index];

+  int prec;

+  int i;

+

+  if (qtbl == NULL)

+    ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index);

+

+  prec = 0;

+  for (i = 0; i < DCTSIZE2; i++) {

+    if (qtbl->quantval[i] > 255)

+      prec = 1;

+  }

+

+  if (! qtbl->sent_table) {

+    emit_marker(cinfo, M_DQT);

+

+    emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2);

+

+    emit_byte(cinfo, index + (prec<<4));

+

+    for (i = 0; i < DCTSIZE2; i++) {

+      /* The table entries must be emitted in zigzag order. */

+      unsigned int qval = qtbl->quantval[jpeg_natural_order[i]];

+      if (prec)

+	emit_byte(cinfo, (int) (qval >> 8));

+      emit_byte(cinfo, (int) (qval & 0xFF));

+    }

+

+    qtbl->sent_table = TRUE;

+  }

+

+  return prec;

+}

+

+

+LOCAL(void)

+emit_dht (j_compress_ptr cinfo, int index, boolean is_ac)

+/* Emit a DHT marker */

+{

+  JHUFF_TBL * htbl;

+  int length, i;

+  

+  if (is_ac) {

+    htbl = cinfo->ac_huff_tbl_ptrs[index];

+    index += 0x10;		/* output index has AC bit set */

+  } else {

+    htbl = cinfo->dc_huff_tbl_ptrs[index];

+  }

+

+  if (htbl == NULL)

+    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index);

+  

+  if (! htbl->sent_table) {

+    emit_marker(cinfo, M_DHT);

+    

+    length = 0;

+    for (i = 1; i <= 16; i++)

+      length += htbl->bits[i];

+    

+    emit_2bytes(cinfo, length + 2 + 1 + 16);

+    emit_byte(cinfo, index);

+    

+    for (i = 1; i <= 16; i++)

+      emit_byte(cinfo, htbl->bits[i]);

+    

+    for (i = 0; i < length; i++)

+      emit_byte(cinfo, htbl->huffval[i]);

+    

+    htbl->sent_table = TRUE;

+  }

+}

+

+

+LOCAL(void)

+emit_dac (j_compress_ptr cinfo)

+/* Emit a DAC marker */

+/* Since the useful info is so small, we want to emit all the tables in */

+/* one DAC marker.  Therefore this routine does its own scan of the table. */

+{

+#ifdef C_ARITH_CODING_SUPPORTED

+  char dc_in_use[NUM_ARITH_TBLS];

+  char ac_in_use[NUM_ARITH_TBLS];

+  int length, i;

+  jpeg_component_info *compptr;

+  

+  for (i = 0; i < NUM_ARITH_TBLS; i++)

+    dc_in_use[i] = ac_in_use[i] = 0;

+  

+  for (i = 0; i < cinfo->comps_in_scan; i++) {

+    compptr = cinfo->cur_comp_info[i];

+    dc_in_use[compptr->dc_tbl_no] = 1;

+    ac_in_use[compptr->ac_tbl_no] = 1;

+  }

+  

+  length = 0;

+  for (i = 0; i < NUM_ARITH_TBLS; i++)

+    length += dc_in_use[i] + ac_in_use[i];

+  

+  emit_marker(cinfo, M_DAC);

+  

+  emit_2bytes(cinfo, length*2 + 2);

+  

+  for (i = 0; i < NUM_ARITH_TBLS; i++) {

+    if (dc_in_use[i]) {

+      emit_byte(cinfo, i);

+      emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4));

+    }

+    if (ac_in_use[i]) {

+      emit_byte(cinfo, i + 0x10);

+      emit_byte(cinfo, cinfo->arith_ac_K[i]);

+    }

+  }

+#endif /* C_ARITH_CODING_SUPPORTED */

+}

+

+

+LOCAL(void)

+emit_dri (j_compress_ptr cinfo)

+/* Emit a DRI marker */

+{

+  emit_marker(cinfo, M_DRI);

+  

+  emit_2bytes(cinfo, 4);	/* fixed length */

+

+  emit_2bytes(cinfo, (int) cinfo->restart_interval);

+}

+

+

+LOCAL(void)

+emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)

+/* Emit a SOF marker */

+{

+  int ci;

+  jpeg_component_info *compptr;

+  

+  emit_marker(cinfo, code);

+  

+  emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */

+

+  /* Make sure image isn't bigger than SOF field can handle */

+  if ((long) cinfo->image_height > 65535L ||

+      (long) cinfo->image_width > 65535L)

+    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535);

+

+  emit_byte(cinfo, cinfo->data_precision);

+  emit_2bytes(cinfo, (int) cinfo->image_height);

+  emit_2bytes(cinfo, (int) cinfo->image_width);

+

+  emit_byte(cinfo, cinfo->num_components);

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    emit_byte(cinfo, compptr->component_id);

+    emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor);

+    emit_byte(cinfo, compptr->quant_tbl_no);

+  }

+}

+

+

+LOCAL(void)

+emit_sos (j_compress_ptr cinfo)

+/* Emit a SOS marker */

+{

+  int i, td, ta;

+  jpeg_component_info *compptr;

+  

+  emit_marker(cinfo, M_SOS);

+  

+  emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */

+  

+  emit_byte(cinfo, cinfo->comps_in_scan);

+  

+  for (i = 0; i < cinfo->comps_in_scan; i++) {

+    compptr = cinfo->cur_comp_info[i];

+    emit_byte(cinfo, compptr->component_id);

+    td = compptr->dc_tbl_no;

+    ta = compptr->ac_tbl_no;

+    if (cinfo->progressive_mode) {

+      /* Progressive mode: only DC or only AC tables are used in one scan;

+       * furthermore, Huffman coding of DC refinement uses no table at all.

+       * We emit 0 for unused field(s); this is recommended by the P&M text

+       * but does not seem to be specified in the standard.

+       */

+      if (cinfo->Ss == 0) {

+	ta = 0;			/* DC scan */

+	if (cinfo->Ah != 0 && !cinfo->arith_code)

+	  td = 0;		/* no DC table either */

+      } else {

+	td = 0;			/* AC scan */

+      }

+    }

+    emit_byte(cinfo, (td << 4) + ta);

+  }

+

+  emit_byte(cinfo, cinfo->Ss);

+  emit_byte(cinfo, cinfo->Se);

+  emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al);

+}

+

+

+LOCAL(void)

+emit_jfif_app0 (j_compress_ptr cinfo)

+/* Emit a JFIF-compliant APP0 marker */

+{

+  /*

+   * Length of APP0 block	(2 bytes)

+   * Block ID			(4 bytes - ASCII "JFIF")

+   * Zero byte			(1 byte to terminate the ID string)

+   * Version Major, Minor	(2 bytes - major first)

+   * Units			(1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm)

+   * Xdpu			(2 bytes - dots per unit horizontal)

+   * Ydpu			(2 bytes - dots per unit vertical)

+   * Thumbnail X size		(1 byte)

+   * Thumbnail Y size		(1 byte)

+   */

+  

+  emit_marker(cinfo, M_APP0);

+  

+  emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */

+

+  emit_byte(cinfo, 0x4A);	/* Identifier: ASCII "JFIF" */

+  emit_byte(cinfo, 0x46);

+  emit_byte(cinfo, 0x49);

+  emit_byte(cinfo, 0x46);

+  emit_byte(cinfo, 0);

+  emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */

+  emit_byte(cinfo, cinfo->JFIF_minor_version);

+  emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */

+  emit_2bytes(cinfo, (int) cinfo->X_density);

+  emit_2bytes(cinfo, (int) cinfo->Y_density);

+  emit_byte(cinfo, 0);		/* No thumbnail image */

+  emit_byte(cinfo, 0);

+}

+

+

+LOCAL(void)

+emit_adobe_app14 (j_compress_ptr cinfo)

+/* Emit an Adobe APP14 marker */

+{

+  /*

+   * Length of APP14 block	(2 bytes)

+   * Block ID			(5 bytes - ASCII "Adobe")

+   * Version Number		(2 bytes - currently 100)

+   * Flags0			(2 bytes - currently 0)

+   * Flags1			(2 bytes - currently 0)

+   * Color transform		(1 byte)

+   *

+   * Although Adobe TN 5116 mentions Version = 101, all the Adobe files

+   * now in circulation seem to use Version = 100, so that's what we write.

+   *

+   * We write the color transform byte as 1 if the JPEG color space is

+   * YCbCr, 2 if it's YCCK, 0 otherwise.  Adobe's definition has to do with

+   * whether the encoder performed a transformation, which is pretty useless.

+   */

+  

+  emit_marker(cinfo, M_APP14);

+  

+  emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */

+

+  emit_byte(cinfo, 0x41);	/* Identifier: ASCII "Adobe" */

+  emit_byte(cinfo, 0x64);

+  emit_byte(cinfo, 0x6F);

+  emit_byte(cinfo, 0x62);

+  emit_byte(cinfo, 0x65);

+  emit_2bytes(cinfo, 100);	/* Version */

+  emit_2bytes(cinfo, 0);	/* Flags0 */

+  emit_2bytes(cinfo, 0);	/* Flags1 */

+  switch (cinfo->jpeg_color_space) {

+  case JCS_YCbCr:

+    emit_byte(cinfo, 1);	/* Color transform = 1 */

+    break;

+  case JCS_YCCK:

+    emit_byte(cinfo, 2);	/* Color transform = 2 */

+    break;

+  default:

+    emit_byte(cinfo, 0);	/* Color transform = 0 */

+    break;

+  }

+}

+

+

+/*

+ * These routines allow writing an arbitrary marker with parameters.

+ * The only intended use is to emit COM or APPn markers after calling

+ * write_file_header and before calling write_frame_header.

+ * Other uses are not guaranteed to produce desirable results.

+ * Counting the parameter bytes properly is the caller's responsibility.

+ */

+

+METHODDEF(void)

+write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen)

+/* Emit an arbitrary marker header */

+{

+  if (datalen > (unsigned int) 65533)		/* safety check */

+    ERREXIT(cinfo, JERR_BAD_LENGTH);

+

+  emit_marker(cinfo, (JPEG_MARKER) marker);

+

+  emit_2bytes(cinfo, (int) (datalen + 2));	/* total length */

+}

+

+METHODDEF(void)

+write_marker_byte (j_compress_ptr cinfo, int val)

+/* Emit one byte of marker parameters following write_marker_header */

+{

+  emit_byte(cinfo, val);

+}

+

+

+/*

+ * Write datastream header.

+ * This consists of an SOI and optional APPn markers.

+ * We recommend use of the JFIF marker, but not the Adobe marker,

+ * when using YCbCr or grayscale data.  The JFIF marker should NOT

+ * be used for any other JPEG colorspace.  The Adobe marker is helpful

+ * to distinguish RGB, CMYK, and YCCK colorspaces.

+ * Note that an application can write additional header markers after

+ * jpeg_start_compress returns.

+ */

+

+METHODDEF(void)

+write_file_header (j_compress_ptr cinfo)

+{

+  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;

+

+  emit_marker(cinfo, M_SOI);	/* first the SOI */

+

+  /* SOI is defined to reset restart interval to 0 */

+  marker->last_restart_interval = 0;

+

+  if (cinfo->write_JFIF_header)	/* next an optional JFIF APP0 */

+    emit_jfif_app0(cinfo);

+  if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */

+    emit_adobe_app14(cinfo);

+}

+

+

+/*

+ * Write frame header.

+ * This consists of DQT and SOFn markers.

+ * Note that we do not emit the SOF until we have emitted the DQT(s).

+ * This avoids compatibility problems with incorrect implementations that

+ * try to error-check the quant table numbers as soon as they see the SOF.

+ */

+

+METHODDEF(void)

+write_frame_header (j_compress_ptr cinfo)

+{

+  int ci, prec;

+  boolean is_baseline;

+  jpeg_component_info *compptr;

+  

+  /* Emit DQT for each quantization table.

+   * Note that emit_dqt() suppresses any duplicate tables.

+   */

+  prec = 0;

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    prec += emit_dqt(cinfo, compptr->quant_tbl_no);

+  }

+  /* now prec is nonzero iff there are any 16-bit quant tables. */

+

+  /* Check for a non-baseline specification.

+   * Note we assume that Huffman table numbers won't be changed later.

+   */

+  if (cinfo->arith_code || cinfo->progressive_mode ||

+      cinfo->data_precision != 8) {

+    is_baseline = FALSE;

+  } else {

+    is_baseline = TRUE;

+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+	 ci++, compptr++) {

+      if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1)

+	is_baseline = FALSE;

+    }

+    if (prec && is_baseline) {

+      is_baseline = FALSE;

+      /* If it's baseline except for quantizer size, warn the user */

+      TRACEMS(cinfo, 0, JTRC_16BIT_TABLES);

+    }

+  }

+

+  /* Emit the proper SOF marker */

+  if (cinfo->arith_code) {

+    emit_sof(cinfo, M_SOF9);	/* SOF code for arithmetic coding */

+  } else {

+    if (cinfo->progressive_mode)

+      emit_sof(cinfo, M_SOF2);	/* SOF code for progressive Huffman */

+    else if (is_baseline)

+      emit_sof(cinfo, M_SOF0);	/* SOF code for baseline implementation */

+    else

+      emit_sof(cinfo, M_SOF1);	/* SOF code for non-baseline Huffman file */

+  }

+}

+

+

+/*

+ * Write scan header.

+ * This consists of DHT or DAC markers, optional DRI, and SOS.

+ * Compressed data will be written following the SOS.

+ */

+

+METHODDEF(void)

+write_scan_header (j_compress_ptr cinfo)

+{

+  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;

+  int i;

+  jpeg_component_info *compptr;

+

+  if (cinfo->arith_code) {

+    /* Emit arith conditioning info.  We may have some duplication

+     * if the file has multiple scans, but it's so small it's hardly

+     * worth worrying about.

+     */

+    emit_dac(cinfo);

+  } else {

+    /* Emit Huffman tables.

+     * Note that emit_dht() suppresses any duplicate tables.

+     */

+    for (i = 0; i < cinfo->comps_in_scan; i++) {

+      compptr = cinfo->cur_comp_info[i];

+      if (cinfo->progressive_mode) {

+	/* Progressive mode: only DC or only AC tables are used in one scan */

+	if (cinfo->Ss == 0) {

+	  if (cinfo->Ah == 0)	/* DC needs no table for refinement scan */

+	    emit_dht(cinfo, compptr->dc_tbl_no, FALSE);

+	} else {

+	  emit_dht(cinfo, compptr->ac_tbl_no, TRUE);

+	}

+      } else {

+	/* Sequential mode: need both DC and AC tables */

+	emit_dht(cinfo, compptr->dc_tbl_no, FALSE);

+	emit_dht(cinfo, compptr->ac_tbl_no, TRUE);

+      }

+    }

+  }

+

+  /* Emit DRI if required --- note that DRI value could change for each scan.

+   * We avoid wasting space with unnecessary DRIs, however.

+   */

+  if (cinfo->restart_interval != marker->last_restart_interval) {

+    emit_dri(cinfo);

+    marker->last_restart_interval = cinfo->restart_interval;

+  }

+

+  emit_sos(cinfo);

+}

+

+

+/*

+ * Write datastream trailer.

+ */

+

+METHODDEF(void)

+write_file_trailer (j_compress_ptr cinfo)

+{

+  emit_marker(cinfo, M_EOI);

+}

+

+

+/*

+ * Write an abbreviated table-specification datastream.

+ * This consists of SOI, DQT and DHT tables, and EOI.

+ * Any table that is defined and not marked sent_table = TRUE will be

+ * emitted.  Note that all tables will be marked sent_table = TRUE at exit.

+ */

+

+METHODDEF(void)

+write_tables_only (j_compress_ptr cinfo)

+{

+  int i;

+

+  emit_marker(cinfo, M_SOI);

+

+  for (i = 0; i < NUM_QUANT_TBLS; i++) {

+    if (cinfo->quant_tbl_ptrs[i] != NULL)

+      (void) emit_dqt(cinfo, i);

+  }

+

+  if (! cinfo->arith_code) {

+    for (i = 0; i < NUM_HUFF_TBLS; i++) {

+      if (cinfo->dc_huff_tbl_ptrs[i] != NULL)

+	emit_dht(cinfo, i, FALSE);

+      if (cinfo->ac_huff_tbl_ptrs[i] != NULL)

+	emit_dht(cinfo, i, TRUE);

+    }

+  }

+

+  emit_marker(cinfo, M_EOI);

+}

+

+

+/*

+ * Initialize the marker writer module.

+ */

+

+GLOBAL(void)

+jinit_marker_writer (j_compress_ptr cinfo)

+{

+  my_marker_ptr marker;

+

+  /* Create the subobject */

+  marker = (my_marker_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_marker_writer));

+  cinfo->marker = (struct jpeg_marker_writer *) marker;

+  /* Initialize method pointers */

+  marker->pub.write_file_header = write_file_header;

+  marker->pub.write_frame_header = write_frame_header;

+  marker->pub.write_scan_header = write_scan_header;

+  marker->pub.write_file_trailer = write_file_trailer;

+  marker->pub.write_tables_only = write_tables_only;

+  marker->pub.write_marker_header = write_marker_header;

+  marker->pub.write_marker_byte = write_marker_byte;

+  /* Initialize private state */

+  marker->last_restart_interval = 0;

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c b/core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c
new file mode 100644
index 0000000..870f775
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c
@@ -0,0 +1,593 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jcmaster.c

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains master control logic for the JPEG compressor.

+ * These routines are concerned with parameter validation, initial setup,

+ * and inter-pass control (determining the number of passes and the work 

+ * to be done in each pass).

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* Private state */

+

+typedef enum {

+	main_pass,		/* input data, also do first output step */

+	huff_opt_pass,		/* Huffman code optimization pass */

+	output_pass		/* data output pass */

+} c_pass_type;

+

+typedef struct {

+  struct jpeg_comp_master pub;	/* public fields */

+

+  c_pass_type pass_type;	/* the type of the current pass */

+

+  int pass_number;		/* # of passes completed */

+  int total_passes;		/* total # of passes needed */

+

+  int scan_number;		/* current index in scan_info[] */

+} my_comp_master;

+

+typedef my_comp_master * my_master_ptr;

+

+

+/*

+ * Support routines that do various essential calculations.

+ */

+

+LOCAL(void)

+initial_setup (j_compress_ptr cinfo)

+/* Do computations that are needed before master selection phase */

+{

+  int ci;

+  jpeg_component_info *compptr;

+  long samplesperrow;

+  JDIMENSION jd_samplesperrow;

+

+  /* Sanity check on image dimensions */

+  if (cinfo->image_height <= 0 || cinfo->image_width <= 0

+      || cinfo->num_components <= 0 || cinfo->input_components <= 0)

+    ERREXIT(cinfo, JERR_EMPTY_IMAGE);

+

+  /* Make sure image isn't bigger than I can handle */

+  if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||

+      (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)

+    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);

+

+  /* Width of an input scanline must be representable as JDIMENSION. */

+  samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;

+  jd_samplesperrow = (JDIMENSION) samplesperrow;

+  if ((long) jd_samplesperrow != samplesperrow)

+    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);

+

+  /* For now, precision must match compiled-in value... */

+  if (cinfo->data_precision != BITS_IN_JSAMPLE)

+    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);

+

+  /* Check that number of components won't exceed internal array sizes */

+  if (cinfo->num_components > MAX_COMPONENTS)

+    ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,

+	     MAX_COMPONENTS);

+

+  /* Compute maximum sampling factors; check factor validity */

+  cinfo->max_h_samp_factor = 1;

+  cinfo->max_v_samp_factor = 1;

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||

+	compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)

+      ERREXIT(cinfo, JERR_BAD_SAMPLING);

+    cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,

+				   compptr->h_samp_factor);

+    cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,

+				   compptr->v_samp_factor);

+  }

+

+  /* Compute dimensions of components */

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    /* Fill in the correct component_index value; don't rely on application */

+    compptr->component_index = ci;

+    /* For compression, we never do DCT scaling. */

+    compptr->DCT_scaled_size = DCTSIZE;

+    /* Size in DCT blocks */

+    compptr->width_in_blocks = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,

+		    (long) (cinfo->max_h_samp_factor * DCTSIZE));

+    compptr->height_in_blocks = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,

+		    (long) (cinfo->max_v_samp_factor * DCTSIZE));

+    /* Size in samples */

+    compptr->downsampled_width = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,

+		    (long) cinfo->max_h_samp_factor);

+    compptr->downsampled_height = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,

+		    (long) cinfo->max_v_samp_factor);

+    /* Mark component needed (this flag isn't actually used for compression) */

+    compptr->component_needed = TRUE;

+  }

+

+  /* Compute number of fully interleaved MCU rows (number of times that

+   * main controller will call coefficient controller).

+   */

+  cinfo->total_iMCU_rows = (JDIMENSION)

+    jdiv_round_up((long) cinfo->image_height,

+		  (long) (cinfo->max_v_samp_factor*DCTSIZE));

+}

+

+

+#ifdef C_MULTISCAN_FILES_SUPPORTED

+

+LOCAL(void)

+validate_script (j_compress_ptr cinfo)

+/* Verify that the scan script in cinfo->scan_info[] is valid; also

+ * determine whether it uses progressive JPEG, and set cinfo->progressive_mode.

+ */

+{

+  const jpeg_scan_info * scanptr;

+  int scanno, ncomps, ci, coefi, thisi;

+  int Ss, Se, Ah, Al;

+  boolean component_sent[MAX_COMPONENTS];

+#ifdef C_PROGRESSIVE_SUPPORTED

+  int * last_bitpos_ptr;

+  int last_bitpos[MAX_COMPONENTS][DCTSIZE2];

+  /* -1 until that coefficient has been seen; then last Al for it */

+#endif

+

+  if (cinfo->num_scans <= 0)

+    ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0);

+

+  /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1;

+   * for progressive JPEG, no scan can have this.

+   */

+  scanptr = cinfo->scan_info;

+  if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) {

+#ifdef C_PROGRESSIVE_SUPPORTED

+    cinfo->progressive_mode = TRUE;

+    last_bitpos_ptr = & last_bitpos[0][0];

+    for (ci = 0; ci < cinfo->num_components; ci++) 

+      for (coefi = 0; coefi < DCTSIZE2; coefi++)

+	*last_bitpos_ptr++ = -1;

+#else

+    ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif

+  } else {

+    cinfo->progressive_mode = FALSE;

+    for (ci = 0; ci < cinfo->num_components; ci++) 

+      component_sent[ci] = FALSE;

+  }

+

+  for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) {

+    /* Validate component indexes */

+    ncomps = scanptr->comps_in_scan;

+    if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN)

+      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN);

+    for (ci = 0; ci < ncomps; ci++) {

+      thisi = scanptr->component_index[ci];

+      if (thisi < 0 || thisi >= cinfo->num_components)

+	ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);

+      /* Components must appear in SOF order within each scan */

+      if (ci > 0 && thisi <= scanptr->component_index[ci-1])

+	ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);

+    }

+    /* Validate progression parameters */

+    Ss = scanptr->Ss;

+    Se = scanptr->Se;

+    Ah = scanptr->Ah;

+    Al = scanptr->Al;

+    if (cinfo->progressive_mode) {

+#ifdef C_PROGRESSIVE_SUPPORTED

+      /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that

+       * seems wrong: the upper bound ought to depend on data precision.

+       * Perhaps they really meant 0..N+1 for N-bit precision.

+       * Here we allow 0..10 for 8-bit data; Al larger than 10 results in

+       * out-of-range reconstructed DC values during the first DC scan,

+       * which might cause problems for some decoders.

+       */

+#if BITS_IN_JSAMPLE == 8

+#define MAX_AH_AL 10

+#else

+#define MAX_AH_AL 13

+#endif

+      if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 ||

+	  Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL)

+	ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);

+      if (Ss == 0) {

+	if (Se != 0)		/* DC and AC together not OK */

+	  ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);

+      } else {

+	if (ncomps != 1)	/* AC scans must be for only one component */

+	  ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);

+      }

+      for (ci = 0; ci < ncomps; ci++) {

+	last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0];

+	if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */

+	  ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);

+	for (coefi = Ss; coefi <= Se; coefi++) {

+	  if (last_bitpos_ptr[coefi] < 0) {

+	    /* first scan of this coefficient */

+	    if (Ah != 0)

+	      ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);

+	  } else {

+	    /* not first scan */

+	    if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1)

+	      ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);

+	  }

+	  last_bitpos_ptr[coefi] = Al;

+	}

+      }

+#endif

+    } else {

+      /* For sequential JPEG, all progression parameters must be these: */

+      if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0)

+	ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);

+      /* Make sure components are not sent twice */

+      for (ci = 0; ci < ncomps; ci++) {

+	thisi = scanptr->component_index[ci];

+	if (component_sent[thisi])

+	  ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);

+	component_sent[thisi] = TRUE;

+      }

+    }

+  }

+

+  /* Now verify that everything got sent. */

+  if (cinfo->progressive_mode) {

+#ifdef C_PROGRESSIVE_SUPPORTED

+    /* For progressive mode, we only check that at least some DC data

+     * got sent for each component; the spec does not require that all bits

+     * of all coefficients be transmitted.  Would it be wiser to enforce

+     * transmission of all coefficient bits??

+     */

+    for (ci = 0; ci < cinfo->num_components; ci++) {

+      if (last_bitpos[ci][0] < 0)

+	ERREXIT(cinfo, JERR_MISSING_DATA);

+    }

+#endif

+  } else {

+    for (ci = 0; ci < cinfo->num_components; ci++) {

+      if (! component_sent[ci])

+	ERREXIT(cinfo, JERR_MISSING_DATA);

+    }

+  }

+}

+

+#endif /* C_MULTISCAN_FILES_SUPPORTED */

+

+

+LOCAL(void)

+select_scan_parameters (j_compress_ptr cinfo)

+/* Set up the scan parameters for the current scan */

+{

+  int ci;

+

+#ifdef C_MULTISCAN_FILES_SUPPORTED

+  if (cinfo->scan_info != NULL) {

+    /* Prepare for current scan --- the script is already validated */

+    my_master_ptr master = (my_master_ptr) cinfo->master;

+    const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number;

+

+    cinfo->comps_in_scan = scanptr->comps_in_scan;

+    for (ci = 0; ci < scanptr->comps_in_scan; ci++) {

+      cinfo->cur_comp_info[ci] =

+	&cinfo->comp_info[scanptr->component_index[ci]];

+    }

+    cinfo->Ss = scanptr->Ss;

+    cinfo->Se = scanptr->Se;

+    cinfo->Ah = scanptr->Ah;

+    cinfo->Al = scanptr->Al;

+  }

+  else

+#endif

+  {

+    /* Prepare for single sequential-JPEG scan containing all components */

+    if (cinfo->num_components > MAX_COMPS_IN_SCAN)

+      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,

+	       MAX_COMPS_IN_SCAN);

+    cinfo->comps_in_scan = cinfo->num_components;

+    for (ci = 0; ci < cinfo->num_components; ci++) {

+      cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci];

+    }

+    cinfo->Ss = 0;

+    cinfo->Se = DCTSIZE2-1;

+    cinfo->Ah = 0;

+    cinfo->Al = 0;

+  }

+}

+

+

+LOCAL(void)

+per_scan_setup (j_compress_ptr cinfo)

+/* Do computations that are needed before processing a JPEG scan */

+/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */

+{

+  int ci, mcublks, tmp;

+  jpeg_component_info *compptr;

+  

+  if (cinfo->comps_in_scan == 1) {

+    

+    /* Noninterleaved (single-component) scan */

+    compptr = cinfo->cur_comp_info[0];

+    

+    /* Overall image size in MCUs */

+    cinfo->MCUs_per_row = compptr->width_in_blocks;

+    cinfo->MCU_rows_in_scan = compptr->height_in_blocks;

+    

+    /* For noninterleaved scan, always one block per MCU */

+    compptr->MCU_width = 1;

+    compptr->MCU_height = 1;

+    compptr->MCU_blocks = 1;

+    compptr->MCU_sample_width = DCTSIZE;

+    compptr->last_col_width = 1;

+    /* For noninterleaved scans, it is convenient to define last_row_height

+     * as the number of block rows present in the last iMCU row.

+     */

+    tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);

+    if (tmp == 0) tmp = compptr->v_samp_factor;

+    compptr->last_row_height = tmp;

+    

+    /* Prepare array describing MCU composition */

+    cinfo->blocks_in_MCU = 1;

+    cinfo->MCU_membership[0] = 0;

+    

+  } else {

+    

+    /* Interleaved (multi-component) scan */

+    if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)

+      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,

+	       MAX_COMPS_IN_SCAN);

+    

+    /* Overall image size in MCUs */

+    cinfo->MCUs_per_row = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_width,

+		    (long) (cinfo->max_h_samp_factor*DCTSIZE));

+    cinfo->MCU_rows_in_scan = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_height,

+		    (long) (cinfo->max_v_samp_factor*DCTSIZE));

+    

+    cinfo->blocks_in_MCU = 0;

+    

+    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+      compptr = cinfo->cur_comp_info[ci];

+      /* Sampling factors give # of blocks of component in each MCU */

+      compptr->MCU_width = compptr->h_samp_factor;

+      compptr->MCU_height = compptr->v_samp_factor;

+      compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;

+      compptr->MCU_sample_width = compptr->MCU_width * DCTSIZE;

+      /* Figure number of non-dummy blocks in last MCU column & row */

+      tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);

+      if (tmp == 0) tmp = compptr->MCU_width;

+      compptr->last_col_width = tmp;

+      tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);

+      if (tmp == 0) tmp = compptr->MCU_height;

+      compptr->last_row_height = tmp;

+      /* Prepare array describing MCU composition */

+      mcublks = compptr->MCU_blocks;

+      if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU)

+	ERREXIT(cinfo, JERR_BAD_MCU_SIZE);

+      while (mcublks-- > 0) {

+	cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;

+      }

+    }

+    

+  }

+

+  /* Convert restart specified in rows to actual MCU count. */

+  /* Note that count must fit in 16 bits, so we provide limiting. */

+  if (cinfo->restart_in_rows > 0) {

+    long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row;

+    cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L);

+  }

+}

+

+

+/*

+ * Per-pass setup.

+ * This is called at the beginning of each pass.  We determine which modules

+ * will be active during this pass and give them appropriate start_pass calls.

+ * We also set is_last_pass to indicate whether any more passes will be

+ * required.

+ */

+

+METHODDEF(void)

+prepare_for_pass (j_compress_ptr cinfo)

+{

+  my_master_ptr master = (my_master_ptr) cinfo->master;

+

+  switch (master->pass_type) {

+  case main_pass:

+    /* Initial pass: will collect input data, and do either Huffman

+     * optimization or data output for the first scan.

+     */

+    select_scan_parameters(cinfo);

+    per_scan_setup(cinfo);

+    if (! cinfo->raw_data_in) {

+      (*cinfo->cconvert->start_pass) (cinfo);

+      (*cinfo->downsample->start_pass) (cinfo);

+      (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU);

+    }

+    (*cinfo->fdct->start_pass) (cinfo);

+    (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding);

+    (*cinfo->coef->start_pass) (cinfo,

+				(master->total_passes > 1 ?

+				 JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));

+    (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);

+    if (cinfo->optimize_coding) {

+      /* No immediate data output; postpone writing frame/scan headers */

+      master->pub.call_pass_startup = FALSE;

+    } else {

+      /* Will write frame/scan headers at first jpeg_write_scanlines call */

+      master->pub.call_pass_startup = TRUE;

+    }

+    break;

+#ifdef ENTROPY_OPT_SUPPORTED

+  case huff_opt_pass:

+    /* Do Huffman optimization for a scan after the first one. */

+    select_scan_parameters(cinfo);

+    per_scan_setup(cinfo);

+    if (cinfo->Ss != 0 || cinfo->Ah == 0 || cinfo->arith_code) {

+      (*cinfo->entropy->start_pass) (cinfo, TRUE);

+      (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);

+      master->pub.call_pass_startup = FALSE;

+      break;

+    }

+    /* Special case: Huffman DC refinement scans need no Huffman table

+     * and therefore we can skip the optimization pass for them.

+     */

+    master->pass_type = output_pass;

+    master->pass_number++;

+    /*FALLTHROUGH*/

+#endif

+  case output_pass:

+    /* Do a data-output pass. */

+    /* We need not repeat per-scan setup if prior optimization pass did it. */

+    if (! cinfo->optimize_coding) {

+      select_scan_parameters(cinfo);

+      per_scan_setup(cinfo);

+    }

+    (*cinfo->entropy->start_pass) (cinfo, FALSE);

+    (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);

+    /* We emit frame/scan headers now */

+    if (master->scan_number == 0)

+      (*cinfo->marker->write_frame_header) (cinfo);

+    (*cinfo->marker->write_scan_header) (cinfo);

+    master->pub.call_pass_startup = FALSE;

+    break;

+  default:

+    ERREXIT(cinfo, JERR_NOT_COMPILED);

+  }

+

+  master->pub.is_last_pass = (master->pass_number == master->total_passes-1);

+

+  /* Set up progress monitor's pass info if present */

+  if (cinfo->progress != NULL) {

+    cinfo->progress->completed_passes = master->pass_number;

+    cinfo->progress->total_passes = master->total_passes;

+  }

+}

+

+

+/*

+ * Special start-of-pass hook.

+ * This is called by jpeg_write_scanlines if call_pass_startup is TRUE.

+ * In single-pass processing, we need this hook because we don't want to

+ * write frame/scan headers during jpeg_start_compress; we want to let the

+ * application write COM markers etc. between jpeg_start_compress and the

+ * jpeg_write_scanlines loop.

+ * In multi-pass processing, this routine is not used.

+ */

+

+METHODDEF(void)

+pass_startup (j_compress_ptr cinfo)

+{

+  cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */

+

+  (*cinfo->marker->write_frame_header) (cinfo);

+  (*cinfo->marker->write_scan_header) (cinfo);

+}

+

+

+/*

+ * Finish up at end of pass.

+ */

+

+METHODDEF(void)

+finish_pass_master (j_compress_ptr cinfo)

+{

+  my_master_ptr master = (my_master_ptr) cinfo->master;

+

+  /* The entropy coder always needs an end-of-pass call,

+   * either to analyze statistics or to flush its output buffer.

+   */

+  (*cinfo->entropy->finish_pass) (cinfo);

+

+  /* Update state for next pass */

+  switch (master->pass_type) {

+  case main_pass:

+    /* next pass is either output of scan 0 (after optimization)

+     * or output of scan 1 (if no optimization).

+     */

+    master->pass_type = output_pass;

+    if (! cinfo->optimize_coding)

+      master->scan_number++;

+    break;

+  case huff_opt_pass:

+    /* next pass is always output of current scan */

+    master->pass_type = output_pass;

+    break;

+  case output_pass:

+    /* next pass is either optimization or output of next scan */

+    if (cinfo->optimize_coding)

+      master->pass_type = huff_opt_pass;

+    master->scan_number++;

+    break;

+  }

+

+  master->pass_number++;

+}

+

+

+/*

+ * Initialize master compression control.

+ */

+

+GLOBAL(void)

+jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)

+{

+  my_master_ptr master;

+

+  master = (my_master_ptr)

+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				  SIZEOF(my_comp_master));

+  cinfo->master = (struct jpeg_comp_master *) master;

+  master->pub.prepare_for_pass = prepare_for_pass;

+  master->pub.pass_startup = pass_startup;

+  master->pub.finish_pass = finish_pass_master;

+  master->pub.is_last_pass = FALSE;

+

+  /* Validate parameters, determine derived values */

+  initial_setup(cinfo);

+

+  if (cinfo->scan_info != NULL) {

+#ifdef C_MULTISCAN_FILES_SUPPORTED

+    validate_script(cinfo);

+#else

+    ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif

+  } else {

+    cinfo->progressive_mode = FALSE;

+    cinfo->num_scans = 1;

+  }

+

+  if (cinfo->progressive_mode)	/*  TEMPORARY HACK ??? */

+    cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */

+

+  /* Initialize my private state */

+  if (transcode_only) {

+    /* no main pass in transcoding */

+    if (cinfo->optimize_coding)

+      master->pass_type = huff_opt_pass;

+    else

+      master->pass_type = output_pass;

+  } else {

+    /* for normal compression, first pass is always this type: */

+    master->pass_type = main_pass;

+  }

+  master->scan_number = 0;

+  master->pass_number = 0;

+  if (cinfo->optimize_coding)

+    master->total_passes = cinfo->num_scans * 2;

+  else

+    master->total_passes = cinfo->num_scans;

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c b/core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c
new file mode 100644
index 0000000..964909a
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c
@@ -0,0 +1,109 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jcomapi.c

+ *

+ * Copyright (C) 1994-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains application interface routines that are used for both

+ * compression and decompression.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/*

+ * Abort processing of a JPEG compression or decompression operation,

+ * but don't destroy the object itself.

+ *

+ * For this, we merely clean up all the nonpermanent memory pools.

+ * Note that temp files (virtual arrays) are not allowed to belong to

+ * the permanent pool, so we will be able to close all temp files here.

+ * Closing a data source or destination, if necessary, is the application's

+ * responsibility.

+ */

+

+GLOBAL(void)

+jpeg_abort (j_common_ptr cinfo)

+{

+  int pool;

+

+  /* Do nothing if called on a not-initialized or destroyed JPEG object. */

+  if (cinfo->mem == NULL)

+    return;

+

+  /* Releasing pools in reverse order might help avoid fragmentation

+   * with some (brain-damaged) malloc libraries.

+   */

+  for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) {

+    (*cinfo->mem->free_pool) (cinfo, pool);

+  }

+

+  /* Reset overall state for possible reuse of object */

+  if (cinfo->is_decompressor) {

+    cinfo->global_state = DSTATE_START;

+    /* Try to keep application from accessing now-deleted marker list.

+     * A bit kludgy to do it here, but this is the most central place.

+     */

+    ((j_decompress_ptr) cinfo)->marker_list = NULL;

+  } else {

+    cinfo->global_state = CSTATE_START;

+  }

+}

+

+

+/*

+ * Destruction of a JPEG object.

+ *

+ * Everything gets deallocated except the master jpeg_compress_struct itself

+ * and the error manager struct.  Both of these are supplied by the application

+ * and must be freed, if necessary, by the application.  (Often they are on

+ * the stack and so don't need to be freed anyway.)

+ * Closing a data source or destination, if necessary, is the application's

+ * responsibility.

+ */

+

+GLOBAL(void)

+jpeg_destroy (j_common_ptr cinfo)

+{

+  /* We need only tell the memory manager to release everything. */

+  /* NB: mem pointer is NULL if memory mgr failed to initialize. */

+  if (cinfo->mem != NULL)

+    (*cinfo->mem->self_destruct) (cinfo);

+  cinfo->mem = NULL;		/* be safe if jpeg_destroy is called twice */

+  cinfo->global_state = 0;	/* mark it destroyed */

+}

+

+

+/*

+ * Convenience routines for allocating quantization and Huffman tables.

+ * (Would jutils.c be a more reasonable place to put these?)

+ */

+

+GLOBAL(JQUANT_TBL *)

+jpeg_alloc_quant_table (j_common_ptr cinfo)

+{

+  JQUANT_TBL *tbl;

+

+  tbl = (JQUANT_TBL *)

+    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL));

+  tbl->sent_table = FALSE;	/* make sure this is false in any new table */

+  return tbl;

+}

+

+

+GLOBAL(JHUFF_TBL *)

+jpeg_alloc_huff_table (j_common_ptr cinfo)

+{

+  JHUFF_TBL *tbl;

+

+  tbl = (JHUFF_TBL *)

+    (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL));

+  tbl->sent_table = FALSE;	/* make sure this is false in any new table */

+  return tbl;

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcparam.c b/core/src/fxcodec/libjpeg/fpdfapi_jcparam.c
new file mode 100644
index 0000000..8b1b9b9
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcparam.c
@@ -0,0 +1,613 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jcparam.c

+ *

+ * Copyright (C) 1991-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains optional default-setting code for the JPEG compressor.

+ * Applications do not have to use this file, but those that don't use it

+ * must know a lot more about the innards of the JPEG code.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/*

+ * Quantization table setup routines

+ */

+

+GLOBAL(void)

+jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl,

+		      const unsigned int *basic_table,

+		      int scale_factor, boolean force_baseline)

+/* Define a quantization table equal to the basic_table times

+ * a scale factor (given as a percentage).

+ * If force_baseline is TRUE, the computed quantization table entries

+ * are limited to 1..255 for JPEG baseline compatibility.

+ */

+{

+  JQUANT_TBL ** qtblptr;

+  int i;

+  long temp;

+

+  /* Safety check to ensure start_compress not called yet. */

+  if (cinfo->global_state != CSTATE_START)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+

+  if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS)

+    ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl);

+

+  qtblptr = & cinfo->quant_tbl_ptrs[which_tbl];

+

+  if (*qtblptr == NULL)

+    *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo);

+

+  for (i = 0; i < DCTSIZE2; i++) {

+    temp = ((long) basic_table[i] * scale_factor + 50L) / 100L;

+    /* limit the values to the valid range */

+    if (temp <= 0L) temp = 1L;

+    if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */

+    if (force_baseline && temp > 255L)

+      temp = 255L;		/* limit to baseline range if requested */

+    (*qtblptr)->quantval[i] = (UINT16) temp;

+  }

+

+  /* Initialize sent_table FALSE so table will be written to JPEG file. */

+  (*qtblptr)->sent_table = FALSE;

+}

+

+

+GLOBAL(void)

+jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor,

+			 boolean force_baseline)

+/* Set or change the 'quality' (quantization) setting, using default tables

+ * and a straight percentage-scaling quality scale.  In most cases it's better

+ * to use jpeg_set_quality (below); this entry point is provided for

+ * applications that insist on a linear percentage scaling.

+ */

+{

+  /* These are the sample quantization tables given in JPEG spec section K.1.

+   * The spec says that the values given produce "good" quality, and

+   * when divided by 2, "very good" quality.

+   */

+  static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {

+    16,  11,  10,  16,  24,  40,  51,  61,

+    12,  12,  14,  19,  26,  58,  60,  55,

+    14,  13,  16,  24,  40,  57,  69,  56,

+    14,  17,  22,  29,  51,  87,  80,  62,

+    18,  22,  37,  56,  68, 109, 103,  77,

+    24,  35,  55,  64,  81, 104, 113,  92,

+    49,  64,  78,  87, 103, 121, 120, 101,

+    72,  92,  95,  98, 112, 100, 103,  99

+  };

+  static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {

+    17,  18,  24,  47,  99,  99,  99,  99,

+    18,  21,  26,  66,  99,  99,  99,  99,

+    24,  26,  56,  99,  99,  99,  99,  99,

+    47,  66,  99,  99,  99,  99,  99,  99,

+    99,  99,  99,  99,  99,  99,  99,  99,

+    99,  99,  99,  99,  99,  99,  99,  99,

+    99,  99,  99,  99,  99,  99,  99,  99,

+    99,  99,  99,  99,  99,  99,  99,  99

+  };

+

+  /* Set up two quantization tables using the specified scaling */

+  jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,

+		       scale_factor, force_baseline);

+  jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,

+		       scale_factor, force_baseline);

+}

+

+

+GLOBAL(int)

+jpeg_quality_scaling (int quality)

+/* Convert a user-specified quality rating to a percentage scaling factor

+ * for an underlying quantization table, using our recommended scaling curve.

+ * The input 'quality' factor should be 0 (terrible) to 100 (very good).

+ */

+{

+  /* Safety limit on quality factor.  Convert 0 to 1 to avoid zero divide. */

+  if (quality <= 0) quality = 1;

+  if (quality > 100) quality = 100;

+

+  /* The basic table is used as-is (scaling 100) for a quality of 50.

+   * Qualities 50..100 are converted to scaling percentage 200 - 2*Q;

+   * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table

+   * to make all the table entries 1 (hence, minimum quantization loss).

+   * Qualities 1..50 are converted to scaling percentage 5000/Q.

+   */

+  if (quality < 50)

+    quality = 5000 / quality;

+  else

+    quality = 200 - quality*2;

+

+  return quality;

+}

+

+

+GLOBAL(void)

+jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)

+/* Set or change the 'quality' (quantization) setting, using default tables.

+ * This is the standard quality-adjusting entry point for typical user

+ * interfaces; only those who want detailed control over quantization tables

+ * would use the preceding three routines directly.

+ */

+{

+  /* Convert user 0-100 rating to percentage scaling */

+  quality = jpeg_quality_scaling(quality);

+

+  /* Set up standard quality tables */

+  jpeg_set_linear_quality(cinfo, quality, force_baseline);

+}

+

+

+/*

+ * Huffman table setup routines

+ */

+

+LOCAL(void)

+add_huff_table (j_compress_ptr cinfo,

+		JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)

+/* Define a Huffman table */

+{

+  int nsymbols, len;

+

+  if (*htblptr == NULL)

+    *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);

+

+  /* Copy the number-of-symbols-of-each-code-length counts */

+  MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));

+

+  /* Validate the counts.  We do this here mainly so we can copy the right

+   * number of symbols from the val[] array, without risking marching off

+   * the end of memory.  jchuff.c will do a more thorough test later.

+   */

+  nsymbols = 0;

+  for (len = 1; len <= 16; len++)

+    nsymbols += bits[len];

+  if (nsymbols < 1 || nsymbols > 256)

+    ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);

+

+  MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));

+

+  /* Initialize sent_table FALSE so table will be written to JPEG file. */

+  (*htblptr)->sent_table = FALSE;

+}

+

+

+LOCAL(void)

+std_huff_tables (j_compress_ptr cinfo)

+/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */

+/* IMPORTANT: these are only valid for 8-bit data precision! */

+{

+  static const UINT8 bits_dc_luminance[17] =

+    { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };

+  static const UINT8 val_dc_luminance[] =

+    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

+  

+  static const UINT8 bits_dc_chrominance[17] =

+    { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };

+  static const UINT8 val_dc_chrominance[] =

+    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

+  

+  static const UINT8 bits_ac_luminance[17] =

+    { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };

+  static const UINT8 val_ac_luminance[] =

+    { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,

+      0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,

+      0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,

+      0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,

+      0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,

+      0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,

+      0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,

+      0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,

+      0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,

+      0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,

+      0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,

+      0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,

+      0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,

+      0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,

+      0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,

+      0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,

+      0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,

+      0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,

+      0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,

+      0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,

+      0xf9, 0xfa };

+  

+  static const UINT8 bits_ac_chrominance[17] =

+    { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };

+  static const UINT8 val_ac_chrominance[] =

+    { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,

+      0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,

+      0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,

+      0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,

+      0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,

+      0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,

+      0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,

+      0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,

+      0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,

+      0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,

+      0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,

+      0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,

+      0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,

+      0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,

+      0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,

+      0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,

+      0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,

+      0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,

+      0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,

+      0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,

+      0xf9, 0xfa };

+  

+  add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],

+		 bits_dc_luminance, val_dc_luminance);

+  add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],

+		 bits_ac_luminance, val_ac_luminance);

+  add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],

+		 bits_dc_chrominance, val_dc_chrominance);

+  add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],

+		 bits_ac_chrominance, val_ac_chrominance);

+}

+

+

+/*

+ * Default parameter setup for compression.

+ *

+ * Applications that don't choose to use this routine must do their

+ * own setup of all these parameters.  Alternately, you can call this

+ * to establish defaults and then alter parameters selectively.  This

+ * is the recommended approach since, if we add any new parameters,

+ * your code will still work (they'll be set to reasonable defaults).

+ */

+

+GLOBAL(void)

+jpeg_set_defaults (j_compress_ptr cinfo)

+{

+  int i;

+

+  /* Safety check to ensure start_compress not called yet. */

+  if (cinfo->global_state != CSTATE_START)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+

+  /* Allocate comp_info array large enough for maximum component count.

+   * Array is made permanent in case application wants to compress

+   * multiple images at same param settings.

+   */

+  if (cinfo->comp_info == NULL)

+    cinfo->comp_info = (jpeg_component_info *)

+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,

+				  MAX_COMPONENTS * SIZEOF(jpeg_component_info));

+

+  /* Initialize everything not dependent on the color space */

+

+  cinfo->data_precision = BITS_IN_JSAMPLE;

+  /* Set up two quantization tables using default quality of 75 */

+  jpeg_set_quality(cinfo, 75, TRUE);

+  /* Set up two Huffman tables */

+  std_huff_tables(cinfo);

+

+  /* Initialize default arithmetic coding conditioning */

+  for (i = 0; i < NUM_ARITH_TBLS; i++) {

+    cinfo->arith_dc_L[i] = 0;

+    cinfo->arith_dc_U[i] = 1;

+    cinfo->arith_ac_K[i] = 5;

+  }

+

+  /* Default is no multiple-scan output */

+  cinfo->scan_info = NULL;

+  cinfo->num_scans = 0;

+

+  /* Expect normal source image, not raw downsampled data */

+  cinfo->raw_data_in = FALSE;

+

+  /* Use Huffman coding, not arithmetic coding, by default */

+  cinfo->arith_code = FALSE;

+

+  /* By default, don't do extra passes to optimize entropy coding */

+  cinfo->optimize_coding = FALSE;

+  /* The standard Huffman tables are only valid for 8-bit data precision.

+   * If the precision is higher, force optimization on so that usable

+   * tables will be computed.  This test can be removed if default tables

+   * are supplied that are valid for the desired precision.

+   */

+  if (cinfo->data_precision > 8)

+    cinfo->optimize_coding = TRUE;

+

+  /* By default, use the simpler non-cosited sampling alignment */

+  cinfo->CCIR601_sampling = FALSE;

+

+  /* No input smoothing */

+  cinfo->smoothing_factor = 0;

+

+  /* DCT algorithm preference */

+  cinfo->dct_method = JDCT_DEFAULT;

+

+  /* No restart markers */

+  cinfo->restart_interval = 0;

+  cinfo->restart_in_rows = 0;

+

+  /* Fill in default JFIF marker parameters.  Note that whether the marker

+   * will actually be written is determined by jpeg_set_colorspace.

+   *

+   * By default, the library emits JFIF version code 1.01.

+   * An application that wants to emit JFIF 1.02 extension markers should set

+   * JFIF_minor_version to 2.  We could probably get away with just defaulting

+   * to 1.02, but there may still be some decoders in use that will complain

+   * about that; saying 1.01 should minimize compatibility problems.

+   */

+  cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */

+  cinfo->JFIF_minor_version = 1;

+  cinfo->density_unit = 0;	/* Pixel size is unknown by default */

+  cinfo->X_density = 1;		/* Pixel aspect ratio is square by default */

+  cinfo->Y_density = 1;

+

+  /* Choose JPEG colorspace based on input space, set defaults accordingly */

+

+  jpeg_default_colorspace(cinfo);

+}

+

+

+/*

+ * Select an appropriate JPEG colorspace for in_color_space.

+ */

+

+GLOBAL(void)

+jpeg_default_colorspace (j_compress_ptr cinfo)

+{

+  switch (cinfo->in_color_space) {

+  case JCS_GRAYSCALE:

+    jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);

+    break;

+  case JCS_RGB:

+    jpeg_set_colorspace(cinfo, JCS_YCbCr);

+    break;

+  case JCS_YCbCr:

+    jpeg_set_colorspace(cinfo, JCS_YCbCr);

+    break;

+  case JCS_CMYK:

+    jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */

+    break;

+  case JCS_YCCK:

+    jpeg_set_colorspace(cinfo, JCS_YCCK);

+    break;

+  case JCS_UNKNOWN:

+    jpeg_set_colorspace(cinfo, JCS_UNKNOWN);

+    break;

+  default:

+    ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);

+  }

+}

+

+

+/*

+ * Set the JPEG colorspace, and choose colorspace-dependent default values.

+ */

+

+GLOBAL(void)

+jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)

+{

+  jpeg_component_info * compptr;

+  int ci;

+

+#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl)  \

+  (compptr = &cinfo->comp_info[index], \

+   compptr->component_id = (id), \

+   compptr->h_samp_factor = (hsamp), \

+   compptr->v_samp_factor = (vsamp), \

+   compptr->quant_tbl_no = (quant), \

+   compptr->dc_tbl_no = (dctbl), \

+   compptr->ac_tbl_no = (actbl) )

+

+  /* Safety check to ensure start_compress not called yet. */

+  if (cinfo->global_state != CSTATE_START)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+

+  /* For all colorspaces, we use Q and Huff tables 0 for luminance components,

+   * tables 1 for chrominance components.

+   */

+

+  cinfo->jpeg_color_space = colorspace;

+

+  cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */

+  cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */

+

+  switch (colorspace) {

+  case JCS_GRAYSCALE:

+    cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */

+    cinfo->num_components = 1;

+    /* JFIF specifies component ID 1 */

+    SET_COMP(0, 1, 1,1, 0, 0,0);

+    break;

+  case JCS_RGB:

+    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */

+    cinfo->num_components = 3;

+    SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0);

+    SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);

+    SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0);

+    break;

+  case JCS_YCbCr:

+    cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */

+    cinfo->num_components = 3;

+    /* JFIF specifies component IDs 1,2,3 */

+    /* We default to 2x2 subsamples of chrominance */

+    SET_COMP(0, 1, 2,2, 0, 0,0);

+    SET_COMP(1, 2, 1,1, 1, 1,1);

+    SET_COMP(2, 3, 1,1, 1, 1,1);

+    break;

+  case JCS_CMYK:

+    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */

+    cinfo->num_components = 4;

+    SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0);

+    SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0);

+    SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0);

+    SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0);

+    break;

+  case JCS_YCCK:

+    cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */

+    cinfo->num_components = 4;

+    SET_COMP(0, 1, 2,2, 0, 0,0);

+    SET_COMP(1, 2, 1,1, 1, 1,1);

+    SET_COMP(2, 3, 1,1, 1, 1,1);

+    SET_COMP(3, 4, 2,2, 0, 0,0);

+    break;

+  case JCS_UNKNOWN:

+    cinfo->num_components = cinfo->input_components;

+    if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)

+      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,

+	       MAX_COMPONENTS);

+    for (ci = 0; ci < cinfo->num_components; ci++) {

+      SET_COMP(ci, ci, 1,1, 0, 0,0);

+    }

+    break;

+  default:

+    ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);

+  }

+}

+

+

+#ifdef C_PROGRESSIVE_SUPPORTED

+

+LOCAL(jpeg_scan_info *)

+fill_a_scan (jpeg_scan_info * scanptr, int ci,

+	     int Ss, int Se, int Ah, int Al)

+/* Support routine: generate one scan for specified component */

+{

+  scanptr->comps_in_scan = 1;

+  scanptr->component_index[0] = ci;

+  scanptr->Ss = Ss;

+  scanptr->Se = Se;

+  scanptr->Ah = Ah;

+  scanptr->Al = Al;

+  scanptr++;

+  return scanptr;

+}

+

+LOCAL(jpeg_scan_info *)

+fill_scans (jpeg_scan_info * scanptr, int ncomps,

+	    int Ss, int Se, int Ah, int Al)

+/* Support routine: generate one scan for each component */

+{

+  int ci;

+

+  for (ci = 0; ci < ncomps; ci++) {

+    scanptr->comps_in_scan = 1;

+    scanptr->component_index[0] = ci;

+    scanptr->Ss = Ss;

+    scanptr->Se = Se;

+    scanptr->Ah = Ah;

+    scanptr->Al = Al;

+    scanptr++;

+  }

+  return scanptr;

+}

+

+LOCAL(jpeg_scan_info *)

+fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al)

+/* Support routine: generate interleaved DC scan if possible, else N scans */

+{

+  int ci;

+

+  if (ncomps <= MAX_COMPS_IN_SCAN) {

+    /* Single interleaved DC scan */

+    scanptr->comps_in_scan = ncomps;

+    for (ci = 0; ci < ncomps; ci++)

+      scanptr->component_index[ci] = ci;

+    scanptr->Ss = scanptr->Se = 0;

+    scanptr->Ah = Ah;

+    scanptr->Al = Al;

+    scanptr++;

+  } else {

+    /* Noninterleaved DC scan for each component */

+    scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al);

+  }

+  return scanptr;

+}

+

+

+/*

+ * Create a recommended progressive-JPEG script.

+ * cinfo->num_components and cinfo->jpeg_color_space must be correct.

+ */

+

+GLOBAL(void)

+jpeg_simple_progression (j_compress_ptr cinfo)

+{

+  int ncomps = cinfo->num_components;

+  int nscans;

+  jpeg_scan_info * scanptr;

+

+  /* Safety check to ensure start_compress not called yet. */

+  if (cinfo->global_state != CSTATE_START)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+

+  /* Figure space needed for script.  Calculation must match code below! */

+  if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {

+    /* Custom script for YCbCr color images. */

+    nscans = 10;

+  } else {

+    /* All-purpose script for other color spaces. */

+    if (ncomps > MAX_COMPS_IN_SCAN)

+      nscans = 6 * ncomps;	/* 2 DC + 4 AC scans per component */

+    else

+      nscans = 2 + 4 * ncomps;	/* 2 DC scans; 4 AC scans per component */

+  }

+

+  /* Allocate space for script.

+   * We need to put it in the permanent pool in case the application performs

+   * multiple compressions without changing the settings.  To avoid a memory

+   * leak if jpeg_simple_progression is called repeatedly for the same JPEG

+   * object, we try to re-use previously allocated space, and we allocate

+   * enough space to handle YCbCr even if initially asked for grayscale.

+   */

+  if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {

+    cinfo->script_space_size = MAX(nscans, 10);

+    cinfo->script_space = (jpeg_scan_info *)

+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,

+			cinfo->script_space_size * SIZEOF(jpeg_scan_info));

+  }

+  scanptr = cinfo->script_space;

+  cinfo->scan_info = scanptr;

+  cinfo->num_scans = nscans;

+

+  if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {

+    /* Custom script for YCbCr color images. */

+    /* Initial DC scan */

+    scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);

+    /* Initial AC scan: get some luma data out in a hurry */

+    scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2);

+    /* Chroma data is too small to be worth expending many scans on */

+    scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1);

+    scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1);

+    /* Complete spectral selection for luma AC */

+    scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2);

+    /* Refine next bit of luma AC */

+    scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1);

+    /* Finish DC successive approximation */

+    scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);

+    /* Finish AC successive approximation */

+    scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0);

+    scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0);

+    /* Luma bottom bit comes last since it's usually largest scan */

+    scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0);

+  } else {

+    /* All-purpose script for other color spaces. */

+    /* Successive approximation first pass */

+    scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);

+    scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2);

+    scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2);

+    /* Successive approximation second pass */

+    scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1);

+    /* Successive approximation final pass */

+    scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);

+    scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0);

+  }

+}

+

+#endif /* C_PROGRESSIVE_SUPPORTED */

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c b/core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c
new file mode 100644
index 0000000..c2655fb
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c
@@ -0,0 +1,836 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jcphuff.c

+ *

+ * Copyright (C) 1995-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains Huffman entropy encoding routines for progressive JPEG.

+ *

+ * We do not support output suspension in this module, since the library

+ * currently does not allow multiple-scan files to be written with output

+ * suspension.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jchuff.h"		/* Declarations shared with jchuff.c */

+

+#ifdef C_PROGRESSIVE_SUPPORTED

+

+/* Expanded entropy encoder object for progressive Huffman encoding. */

+

+typedef struct {

+  struct jpeg_entropy_encoder pub; /* public fields */

+

+  /* Mode flag: TRUE for optimization, FALSE for actual data output */

+  boolean gather_statistics;

+

+  /* Bit-level coding status.

+   * next_output_byte/free_in_buffer are local copies of cinfo->dest fields.

+   */

+  JOCTET * next_output_byte;	/* => next byte to write in buffer */

+  size_t free_in_buffer;	/* # of byte spaces remaining in buffer */

+  INT32 put_buffer;		/* current bit-accumulation buffer */

+  int put_bits;			/* # of bits now in it */

+  j_compress_ptr cinfo;		/* link to cinfo (needed for dump_buffer) */

+

+  /* Coding status for DC components */

+  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */

+

+  /* Coding status for AC components */

+  int ac_tbl_no;		/* the table number of the single component */

+  unsigned int EOBRUN;		/* run length of EOBs */

+  unsigned int BE;		/* # of buffered correction bits before MCU */

+  char * bit_buffer;		/* buffer for correction bits (1 per char) */

+  /* packing correction bits tightly would save some space but cost time... */

+

+  unsigned int restarts_to_go;	/* MCUs left in this restart interval */

+  int next_restart_num;		/* next restart number to write (0-7) */

+

+  /* Pointers to derived tables (these workspaces have image lifespan).

+   * Since any one scan codes only DC or only AC, we only need one set

+   * of tables, not one for DC and one for AC.

+   */

+  c_derived_tbl * derived_tbls[NUM_HUFF_TBLS];

+

+  /* Statistics tables for optimization; again, one set is enough */

+  long * count_ptrs[NUM_HUFF_TBLS];

+} phuff_entropy_encoder;

+

+typedef phuff_entropy_encoder * phuff_entropy_ptr;

+

+/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit

+ * buffer can hold.  Larger sizes may slightly improve compression, but

+ * 1000 is already well into the realm of overkill.

+ * The minimum safe size is 64 bits.

+ */

+

+#define MAX_CORR_BITS  1000	/* Max # of correction bits I can buffer */

+

+/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.

+ * We assume that int right shift is unsigned if INT32 right shift is,

+ * which should be safe.

+ */

+

+#ifdef RIGHT_SHIFT_IS_UNSIGNED

+#define ISHIFT_TEMPS	int ishift_temp;

+#define IRIGHT_SHIFT(x,shft)  \

+	((ishift_temp = (x)) < 0 ? \

+	 (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \

+	 (ishift_temp >> (shft)))

+#else

+#define ISHIFT_TEMPS

+#define IRIGHT_SHIFT(x,shft)	((x) >> (shft))

+#endif

+

+/* Forward declarations */

+METHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo,

+					    JBLOCKROW *MCU_data));

+METHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo,

+					    JBLOCKROW *MCU_data));

+METHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo,

+					     JBLOCKROW *MCU_data));

+METHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo,

+					     JBLOCKROW *MCU_data));

+METHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo));

+METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo));

+

+

+/*

+ * Initialize for a Huffman-compressed scan using progressive JPEG.

+ */

+

+METHODDEF(void)

+start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics)

+{  

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+  boolean is_DC_band;

+  int ci, tbl;

+  jpeg_component_info * compptr;

+

+  entropy->cinfo = cinfo;

+  entropy->gather_statistics = gather_statistics;

+

+  is_DC_band = (cinfo->Ss == 0);

+

+  /* We assume jcmaster.c already validated the scan parameters. */

+

+  /* Select execution routines */

+  if (cinfo->Ah == 0) {

+    if (is_DC_band)

+      entropy->pub.encode_mcu = encode_mcu_DC_first;

+    else

+      entropy->pub.encode_mcu = encode_mcu_AC_first;

+  } else {

+    if (is_DC_band)

+      entropy->pub.encode_mcu = encode_mcu_DC_refine;

+    else {

+      entropy->pub.encode_mcu = encode_mcu_AC_refine;

+      /* AC refinement needs a correction bit buffer */

+      if (entropy->bit_buffer == NULL)

+	entropy->bit_buffer = (char *)

+	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				      MAX_CORR_BITS * SIZEOF(char));

+    }

+  }

+  if (gather_statistics)

+    entropy->pub.finish_pass = finish_pass_gather_phuff;

+  else

+    entropy->pub.finish_pass = finish_pass_phuff;

+

+  /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1

+   * for AC coefficients.

+   */

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+    compptr = cinfo->cur_comp_info[ci];

+    /* Initialize DC predictions to 0 */

+    entropy->last_dc_val[ci] = 0;

+    /* Get table index */

+    if (is_DC_band) {

+      if (cinfo->Ah != 0)	/* DC refinement needs no table */

+	continue;

+      tbl = compptr->dc_tbl_no;

+    } else {

+      entropy->ac_tbl_no = tbl = compptr->ac_tbl_no;

+    }

+    if (gather_statistics) {

+      /* Check for invalid table index */

+      /* (make_c_derived_tbl does this in the other path) */

+      if (tbl < 0 || tbl >= NUM_HUFF_TBLS)

+        ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);

+      /* Allocate and zero the statistics tables */

+      /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */

+      if (entropy->count_ptrs[tbl] == NULL)

+	entropy->count_ptrs[tbl] = (long *)

+	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				      257 * SIZEOF(long));

+      MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long));

+    } else {

+      /* Compute derived values for Huffman table */

+      /* We may do this more than once for a table, but it's not expensive */

+      jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl,

+			      & entropy->derived_tbls[tbl]);

+    }

+  }

+

+  /* Initialize AC stuff */

+  entropy->EOBRUN = 0;

+  entropy->BE = 0;

+

+  /* Initialize bit buffer to empty */

+  entropy->put_buffer = 0;

+  entropy->put_bits = 0;

+

+  /* Initialize restart stuff */

+  entropy->restarts_to_go = cinfo->restart_interval;

+  entropy->next_restart_num = 0;

+}

+

+

+/* Outputting bytes to the file.

+ * NB: these must be called only when actually outputting,

+ * that is, entropy->gather_statistics == FALSE.

+ */

+

+/* Emit a byte */

+#define emit_byte(entropy,val)  \

+	{ *(entropy)->next_output_byte++ = (JOCTET) (val);  \

+	  if (--(entropy)->free_in_buffer == 0)  \

+	    dump_buffer(entropy); }

+

+

+LOCAL(void)

+dump_buffer (phuff_entropy_ptr entropy)

+/* Empty the output buffer; we do not support suspension in this module. */

+{

+  struct jpeg_destination_mgr * dest = entropy->cinfo->dest;

+

+  if (! (*dest->empty_output_buffer) (entropy->cinfo))

+    ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND);

+  /* After a successful buffer dump, must reset buffer pointers */

+  entropy->next_output_byte = dest->next_output_byte;

+  entropy->free_in_buffer = dest->free_in_buffer;

+}

+

+

+/* Outputting bits to the file */

+

+/* Only the right 24 bits of put_buffer are used; the valid bits are

+ * left-justified in this part.  At most 16 bits can be passed to emit_bits

+ * in one call, and we never retain more than 7 bits in put_buffer

+ * between calls, so 24 bits are sufficient.

+ */

+

+INLINE

+LOCAL(void)

+emit_bits (phuff_entropy_ptr entropy, unsigned int code, int size)

+/* Emit some bits, unless we are in gather mode */

+{

+  /* This routine is heavily used, so it's worth coding tightly. */

+  register INT32 put_buffer = (INT32) code;

+  register int put_bits = entropy->put_bits;

+

+  /* if size is 0, caller used an invalid Huffman table entry */

+  if (size == 0)

+    ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);

+

+  if (entropy->gather_statistics)

+    return;			/* do nothing if we're only getting stats */

+

+  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */

+  

+  put_bits += size;		/* new number of bits in buffer */

+  

+  put_buffer <<= 24 - put_bits; /* align incoming bits */

+

+  put_buffer |= entropy->put_buffer; /* and merge with old buffer contents */

+

+  while (put_bits >= 8) {

+    int c = (int) ((put_buffer >> 16) & 0xFF);

+    

+    emit_byte(entropy, c);

+    if (c == 0xFF) {		/* need to stuff a zero byte? */

+      emit_byte(entropy, 0);

+    }

+    put_buffer <<= 8;

+    put_bits -= 8;

+  }

+

+  entropy->put_buffer = put_buffer; /* update variables */

+  entropy->put_bits = put_bits;

+}

+

+

+LOCAL(void)

+flush_bits (phuff_entropy_ptr entropy)

+{

+  emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */

+  entropy->put_buffer = 0;     /* and reset bit-buffer to empty */

+  entropy->put_bits = 0;

+}

+

+

+/*

+ * Emit (or just count) a Huffman symbol.

+ */

+

+INLINE

+LOCAL(void)

+emit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol)

+{

+  if (entropy->gather_statistics)

+    entropy->count_ptrs[tbl_no][symbol]++;

+  else {

+    c_derived_tbl * tbl = entropy->derived_tbls[tbl_no];

+    emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);

+  }

+}

+

+

+/*

+ * Emit bits from a correction bit buffer.

+ */

+

+LOCAL(void)

+emit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart,

+		    unsigned int nbits)

+{

+  if (entropy->gather_statistics)

+    return;			/* no real work */

+

+  while (nbits > 0) {

+    emit_bits(entropy, (unsigned int) (*bufstart), 1);

+    bufstart++;

+    nbits--;

+  }

+}

+

+

+/*

+ * Emit any pending EOBRUN symbol.

+ */

+

+LOCAL(void)

+emit_eobrun (phuff_entropy_ptr entropy)

+{

+  register int temp, nbits;

+

+  if (entropy->EOBRUN > 0) {	/* if there is any pending EOBRUN */

+    temp = entropy->EOBRUN;

+    nbits = 0;

+    while ((temp >>= 1))

+      nbits++;

+    /* safety check: shouldn't happen given limited correction-bit buffer */

+    if (nbits > 14)

+      ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);

+

+    emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4);

+    if (nbits)

+      emit_bits(entropy, entropy->EOBRUN, nbits);

+

+    entropy->EOBRUN = 0;

+

+    /* Emit any buffered correction bits */

+    emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE);

+    entropy->BE = 0;

+  }

+}

+

+

+/*

+ * Emit a restart marker & resynchronize predictions.

+ */

+

+LOCAL(void)

+emit_restart (phuff_entropy_ptr entropy, int restart_num)

+{

+  int ci;

+

+  emit_eobrun(entropy);

+

+  if (! entropy->gather_statistics) {

+    flush_bits(entropy);

+    emit_byte(entropy, 0xFF);

+    emit_byte(entropy, JPEG_RST0 + restart_num);

+  }

+

+  if (entropy->cinfo->Ss == 0) {

+    /* Re-initialize DC predictions to 0 */

+    for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++)

+      entropy->last_dc_val[ci] = 0;

+  } else {

+    /* Re-initialize all AC-related fields to 0 */

+    entropy->EOBRUN = 0;

+    entropy->BE = 0;

+  }

+}

+

+

+/*

+ * MCU encoding for DC initial scan (either spectral selection,

+ * or first pass of successive approximation).

+ */

+

+METHODDEF(boolean)

+encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)

+{

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+  register int temp, temp2;

+  register int nbits;

+  int blkn, ci;

+  int Al = cinfo->Al;

+  JBLOCKROW block;

+  jpeg_component_info * compptr;

+  ISHIFT_TEMPS

+

+  entropy->next_output_byte = cinfo->dest->next_output_byte;

+  entropy->free_in_buffer = cinfo->dest->free_in_buffer;

+

+  /* Emit restart marker if needed */

+  if (cinfo->restart_interval)

+    if (entropy->restarts_to_go == 0)

+      emit_restart(entropy, entropy->next_restart_num);

+

+  /* Encode the MCU data blocks */

+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {

+    block = MCU_data[blkn];

+    ci = cinfo->MCU_membership[blkn];

+    compptr = cinfo->cur_comp_info[ci];

+

+    /* Compute the DC value after the required point transform by Al.

+     * This is simply an arithmetic right shift.

+     */

+    temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);

+

+    /* DC differences are figured on the point-transformed values. */

+    temp = temp2 - entropy->last_dc_val[ci];

+    entropy->last_dc_val[ci] = temp2;

+

+    /* Encode the DC coefficient difference per section G.1.2.1 */

+    temp2 = temp;

+    if (temp < 0) {

+      temp = -temp;		/* temp is abs value of input */

+      /* For a negative input, want temp2 = bitwise complement of abs(input) */

+      /* This code assumes we are on a two's complement machine */

+      temp2--;

+    }

+    

+    /* Find the number of bits needed for the magnitude of the coefficient */

+    nbits = 0;

+    while (temp) {

+      nbits++;

+      temp >>= 1;

+    }

+    /* Check for out-of-range coefficient values.

+     * Since we're encoding a difference, the range limit is twice as much.

+     */

+    if (nbits > MAX_COEF_BITS+1)

+      ERREXIT(cinfo, JERR_BAD_DCT_COEF);

+    

+    /* Count/emit the Huffman-coded symbol for the number of bits */

+    emit_symbol(entropy, compptr->dc_tbl_no, nbits);

+    

+    /* Emit that number of bits of the value, if positive, */

+    /* or the complement of its magnitude, if negative. */

+    if (nbits)			/* emit_bits rejects calls with size 0 */

+      emit_bits(entropy, (unsigned int) temp2, nbits);

+  }

+

+  cinfo->dest->next_output_byte = entropy->next_output_byte;

+  cinfo->dest->free_in_buffer = entropy->free_in_buffer;

+

+  /* Update restart-interval state too */

+  if (cinfo->restart_interval) {

+    if (entropy->restarts_to_go == 0) {

+      entropy->restarts_to_go = cinfo->restart_interval;

+      entropy->next_restart_num++;

+      entropy->next_restart_num &= 7;

+    }

+    entropy->restarts_to_go--;

+  }

+

+  return TRUE;

+}

+

+

+/*

+ * MCU encoding for AC initial scan (either spectral selection,

+ * or first pass of successive approximation).

+ */

+

+METHODDEF(boolean)

+encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)

+{

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+  register int temp, temp2;

+  register int nbits;

+  register int r, k;

+  int Se = cinfo->Se;

+  int Al = cinfo->Al;

+  JBLOCKROW block;

+

+  entropy->next_output_byte = cinfo->dest->next_output_byte;

+  entropy->free_in_buffer = cinfo->dest->free_in_buffer;

+

+  /* Emit restart marker if needed */

+  if (cinfo->restart_interval)

+    if (entropy->restarts_to_go == 0)

+      emit_restart(entropy, entropy->next_restart_num);

+

+  /* Encode the MCU data block */

+  block = MCU_data[0];

+

+  /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */

+  

+  r = 0;			/* r = run length of zeros */

+   

+  for (k = cinfo->Ss; k <= Se; k++) {

+    if ((temp = (*block)[jpeg_natural_order[k]]) == 0) {

+      r++;

+      continue;

+    }

+    /* We must apply the point transform by Al.  For AC coefficients this

+     * is an integer division with rounding towards 0.  To do this portably

+     * in C, we shift after obtaining the absolute value; so the code is

+     * interwoven with finding the abs value (temp) and output bits (temp2).

+     */

+    if (temp < 0) {

+      temp = -temp;		/* temp is abs value of input */

+      temp >>= Al;		/* apply the point transform */

+      /* For a negative coef, want temp2 = bitwise complement of abs(coef) */

+      temp2 = ~temp;

+    } else {

+      temp >>= Al;		/* apply the point transform */

+      temp2 = temp;

+    }

+    /* Watch out for case that nonzero coef is zero after point transform */

+    if (temp == 0) {

+      r++;

+      continue;

+    }

+

+    /* Emit any pending EOBRUN */

+    if (entropy->EOBRUN > 0)

+      emit_eobrun(entropy);

+    /* if run length > 15, must emit special run-length-16 codes (0xF0) */

+    while (r > 15) {

+      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);

+      r -= 16;

+    }

+

+    /* Find the number of bits needed for the magnitude of the coefficient */

+    nbits = 1;			/* there must be at least one 1 bit */

+    while ((temp >>= 1))

+      nbits++;

+    /* Check for out-of-range coefficient values */

+    if (nbits > MAX_COEF_BITS)

+      ERREXIT(cinfo, JERR_BAD_DCT_COEF);

+

+    /* Count/emit Huffman symbol for run length / number of bits */

+    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits);

+

+    /* Emit that number of bits of the value, if positive, */

+    /* or the complement of its magnitude, if negative. */

+    emit_bits(entropy, (unsigned int) temp2, nbits);

+

+    r = 0;			/* reset zero run length */

+  }

+

+  if (r > 0) {			/* If there are trailing zeroes, */

+    entropy->EOBRUN++;		/* count an EOB */

+    if (entropy->EOBRUN == 0x7FFF)

+      emit_eobrun(entropy);	/* force it out to avoid overflow */

+  }

+

+  cinfo->dest->next_output_byte = entropy->next_output_byte;

+  cinfo->dest->free_in_buffer = entropy->free_in_buffer;

+

+  /* Update restart-interval state too */

+  if (cinfo->restart_interval) {

+    if (entropy->restarts_to_go == 0) {

+      entropy->restarts_to_go = cinfo->restart_interval;

+      entropy->next_restart_num++;

+      entropy->next_restart_num &= 7;

+    }

+    entropy->restarts_to_go--;

+  }

+

+  return TRUE;

+}

+

+

+/*

+ * MCU encoding for DC successive approximation refinement scan.

+ * Note: we assume such scans can be multi-component, although the spec

+ * is not very clear on the point.

+ */

+

+METHODDEF(boolean)

+encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)

+{

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+  register int temp;

+  int blkn;

+  int Al = cinfo->Al;

+  JBLOCKROW block;

+

+  entropy->next_output_byte = cinfo->dest->next_output_byte;

+  entropy->free_in_buffer = cinfo->dest->free_in_buffer;

+

+  /* Emit restart marker if needed */

+  if (cinfo->restart_interval)

+    if (entropy->restarts_to_go == 0)

+      emit_restart(entropy, entropy->next_restart_num);

+

+  /* Encode the MCU data blocks */

+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {

+    block = MCU_data[blkn];

+

+    /* We simply emit the Al'th bit of the DC coefficient value. */

+    temp = (*block)[0];

+    emit_bits(entropy, (unsigned int) (temp >> Al), 1);

+  }

+

+  cinfo->dest->next_output_byte = entropy->next_output_byte;

+  cinfo->dest->free_in_buffer = entropy->free_in_buffer;

+

+  /* Update restart-interval state too */

+  if (cinfo->restart_interval) {

+    if (entropy->restarts_to_go == 0) {

+      entropy->restarts_to_go = cinfo->restart_interval;

+      entropy->next_restart_num++;

+      entropy->next_restart_num &= 7;

+    }

+    entropy->restarts_to_go--;

+  }

+

+  return TRUE;

+}

+

+

+/*

+ * MCU encoding for AC successive approximation refinement scan.

+ */

+

+METHODDEF(boolean)

+encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)

+{

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+  register int temp;

+  register int r, k;

+  int EOB;

+  char *BR_buffer;

+  unsigned int BR;

+  int Se = cinfo->Se;

+  int Al = cinfo->Al;

+  JBLOCKROW block;

+  int absvalues[DCTSIZE2];

+

+  entropy->next_output_byte = cinfo->dest->next_output_byte;

+  entropy->free_in_buffer = cinfo->dest->free_in_buffer;

+

+  /* Emit restart marker if needed */

+  if (cinfo->restart_interval)

+    if (entropy->restarts_to_go == 0)

+      emit_restart(entropy, entropy->next_restart_num);

+

+  /* Encode the MCU data block */

+  block = MCU_data[0];

+

+  /* It is convenient to make a pre-pass to determine the transformed

+   * coefficients' absolute values and the EOB position.

+   */

+  EOB = 0;

+  for (k = cinfo->Ss; k <= Se; k++) {

+    temp = (*block)[jpeg_natural_order[k]];

+    /* We must apply the point transform by Al.  For AC coefficients this

+     * is an integer division with rounding towards 0.  To do this portably

+     * in C, we shift after obtaining the absolute value.

+     */

+    if (temp < 0)

+      temp = -temp;		/* temp is abs value of input */

+    temp >>= Al;		/* apply the point transform */

+    absvalues[k] = temp;	/* save abs value for main pass */

+    if (temp == 1)

+      EOB = k;			/* EOB = index of last newly-nonzero coef */

+  }

+

+  /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */

+  

+  r = 0;			/* r = run length of zeros */

+  BR = 0;			/* BR = count of buffered bits added now */

+  BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */

+

+  for (k = cinfo->Ss; k <= Se; k++) {

+    if ((temp = absvalues[k]) == 0) {

+      r++;

+      continue;

+    }

+

+    /* Emit any required ZRLs, but not if they can be folded into EOB */

+    while (r > 15 && k <= EOB) {

+      /* emit any pending EOBRUN and the BE correction bits */

+      emit_eobrun(entropy);

+      /* Emit ZRL */

+      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);

+      r -= 16;

+      /* Emit buffered correction bits that must be associated with ZRL */

+      emit_buffered_bits(entropy, BR_buffer, BR);

+      BR_buffer = entropy->bit_buffer; /* BE bits are gone now */

+      BR = 0;

+    }

+

+    /* If the coef was previously nonzero, it only needs a correction bit.

+     * NOTE: a straight translation of the spec's figure G.7 would suggest

+     * that we also need to test r > 15.  But if r > 15, we can only get here

+     * if k > EOB, which implies that this coefficient is not 1.

+     */

+    if (temp > 1) {

+      /* The correction bit is the next bit of the absolute value. */

+      BR_buffer[BR++] = (char) (temp & 1);

+      continue;

+    }

+

+    /* Emit any pending EOBRUN and the BE correction bits */

+    emit_eobrun(entropy);

+

+    /* Count/emit Huffman symbol for run length / number of bits */

+    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1);

+

+    /* Emit output bit for newly-nonzero coef */

+    temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1;

+    emit_bits(entropy, (unsigned int) temp, 1);

+

+    /* Emit buffered correction bits that must be associated with this code */

+    emit_buffered_bits(entropy, BR_buffer, BR);

+    BR_buffer = entropy->bit_buffer; /* BE bits are gone now */

+    BR = 0;

+    r = 0;			/* reset zero run length */

+  }

+

+  if (r > 0 || BR > 0) {	/* If there are trailing zeroes, */

+    entropy->EOBRUN++;		/* count an EOB */

+    entropy->BE += BR;		/* concat my correction bits to older ones */

+    /* We force out the EOB if we risk either:

+     * 1. overflow of the EOB counter;

+     * 2. overflow of the correction bit buffer during the next MCU.

+     */

+    if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1))

+      emit_eobrun(entropy);

+  }

+

+  cinfo->dest->next_output_byte = entropy->next_output_byte;

+  cinfo->dest->free_in_buffer = entropy->free_in_buffer;

+

+  /* Update restart-interval state too */

+  if (cinfo->restart_interval) {

+    if (entropy->restarts_to_go == 0) {

+      entropy->restarts_to_go = cinfo->restart_interval;

+      entropy->next_restart_num++;

+      entropy->next_restart_num &= 7;

+    }

+    entropy->restarts_to_go--;

+  }

+

+  return TRUE;

+}

+

+

+/*

+ * Finish up at the end of a Huffman-compressed progressive scan.

+ */

+

+METHODDEF(void)

+finish_pass_phuff (j_compress_ptr cinfo)

+{   

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+

+  entropy->next_output_byte = cinfo->dest->next_output_byte;

+  entropy->free_in_buffer = cinfo->dest->free_in_buffer;

+

+  /* Flush out any buffered data */

+  emit_eobrun(entropy);

+  flush_bits(entropy);

+

+  cinfo->dest->next_output_byte = entropy->next_output_byte;

+  cinfo->dest->free_in_buffer = entropy->free_in_buffer;

+}

+

+

+/*

+ * Finish up a statistics-gathering pass and create the new Huffman tables.

+ */

+

+METHODDEF(void)

+finish_pass_gather_phuff (j_compress_ptr cinfo)

+{

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+  boolean is_DC_band;

+  int ci, tbl;

+  jpeg_component_info * compptr;

+  JHUFF_TBL **htblptr;

+  boolean did[NUM_HUFF_TBLS];

+

+  /* Flush out buffered data (all we care about is counting the EOB symbol) */

+  emit_eobrun(entropy);

+

+  is_DC_band = (cinfo->Ss == 0);

+

+  /* It's important not to apply jpeg_gen_optimal_table more than once

+   * per table, because it clobbers the input frequency counts!

+   */

+  MEMZERO(did, SIZEOF(did));

+

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+    compptr = cinfo->cur_comp_info[ci];

+    if (is_DC_band) {

+      if (cinfo->Ah != 0)	/* DC refinement needs no table */

+	continue;

+      tbl = compptr->dc_tbl_no;

+    } else {

+      tbl = compptr->ac_tbl_no;

+    }

+    if (! did[tbl]) {

+      if (is_DC_band)

+        htblptr = & cinfo->dc_huff_tbl_ptrs[tbl];

+      else

+        htblptr = & cinfo->ac_huff_tbl_ptrs[tbl];

+      if (*htblptr == NULL)

+        *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);

+      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]);

+      did[tbl] = TRUE;

+    }

+  }

+}

+

+

+/*

+ * Module initialization routine for progressive Huffman entropy encoding.

+ */

+

+GLOBAL(void)

+jinit_phuff_encoder (j_compress_ptr cinfo)

+{

+  phuff_entropy_ptr entropy;

+  int i;

+

+  entropy = (phuff_entropy_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(phuff_entropy_encoder));

+  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;

+  entropy->pub.start_pass = start_pass_phuff;

+

+  /* Mark tables unallocated */

+  for (i = 0; i < NUM_HUFF_TBLS; i++) {

+    entropy->derived_tbls[i] = NULL;

+    entropy->count_ptrs[i] = NULL;

+  }

+  entropy->bit_buffer = NULL;	/* needed only in AC refinement scan */

+}

+

+#endif /* C_PROGRESSIVE_SUPPORTED */

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c b/core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c
new file mode 100644
index 0000000..539d87b
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c
@@ -0,0 +1,357 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jcprepct.c

+ *

+ * Copyright (C) 1994-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains the compression preprocessing controller.

+ * This controller manages the color conversion, downsampling,

+ * and edge expansion steps.

+ *

+ * Most of the complexity here is associated with buffering input rows

+ * as required by the downsampler.  See the comments at the head of

+ * jcsample.c for the downsampler's needs.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* At present, jcsample.c can request context rows only for smoothing.

+ * In the future, we might also need context rows for CCIR601 sampling

+ * or other more-complex downsampling procedures.  The code to support

+ * context rows should be compiled only if needed.

+ */

+#ifdef INPUT_SMOOTHING_SUPPORTED

+#define CONTEXT_ROWS_SUPPORTED

+#endif

+

+

+/*

+ * For the simple (no-context-row) case, we just need to buffer one

+ * row group's worth of pixels for the downsampling step.  At the bottom of

+ * the image, we pad to a full row group by replicating the last pixel row.

+ * The downsampler's last output row is then replicated if needed to pad

+ * out to a full iMCU row.

+ *

+ * When providing context rows, we must buffer three row groups' worth of

+ * pixels.  Three row groups are physically allocated, but the row pointer

+ * arrays are made five row groups high, with the extra pointers above and

+ * below "wrapping around" to point to the last and first real row groups.

+ * This allows the downsampler to access the proper context rows.

+ * At the top and bottom of the image, we create dummy context rows by

+ * copying the first or last real pixel row.  This copying could be avoided

+ * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the

+ * trouble on the compression side.

+ */

+

+

+/* Private buffer controller object */

+

+typedef struct {

+  struct jpeg_c_prep_controller pub; /* public fields */

+

+  /* Downsampling input buffer.  This buffer holds color-converted data

+   * until we have enough to do a downsample step.

+   */

+  JSAMPARRAY color_buf[MAX_COMPONENTS];

+

+  JDIMENSION rows_to_go;	/* counts rows remaining in source image */

+  int next_buf_row;		/* index of next row to store in color_buf */

+

+#ifdef CONTEXT_ROWS_SUPPORTED	/* only needed for context case */

+  int this_row_group;		/* starting row index of group to process */

+  int next_buf_stop;		/* downsample when we reach this index */

+#endif

+} my_prep_controller;

+

+typedef my_prep_controller * my_prep_ptr;

+

+

+/*

+ * Initialize for a processing pass.

+ */

+

+METHODDEF(void)

+start_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode)

+{

+  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;

+

+  if (pass_mode != JBUF_PASS_THRU)

+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+

+  /* Initialize total-height counter for detecting bottom of image */

+  prep->rows_to_go = cinfo->image_height;

+  /* Mark the conversion buffer empty */

+  prep->next_buf_row = 0;

+#ifdef CONTEXT_ROWS_SUPPORTED

+  /* Preset additional state variables for context mode.

+   * These aren't used in non-context mode, so we needn't test which mode.

+   */

+  prep->this_row_group = 0;

+  /* Set next_buf_stop to stop after two row groups have been read in. */

+  prep->next_buf_stop = 2 * cinfo->max_v_samp_factor;

+#endif

+}

+

+

+/*

+ * Expand an image vertically from height input_rows to height output_rows,

+ * by duplicating the bottom row.

+ */

+

+LOCAL(void)

+expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols,

+		    int input_rows, int output_rows)

+{

+  register int row;

+

+  for (row = input_rows; row < output_rows; row++) {

+    jcopy_sample_rows(image_data, input_rows-1, image_data, row,

+		      1, num_cols);

+  }

+}

+

+

+/*

+ * Process some data in the simple no-context case.

+ *

+ * Preprocessor output data is counted in "row groups".  A row group

+ * is defined to be v_samp_factor sample rows of each component.

+ * Downsampling will produce this much data from each max_v_samp_factor

+ * input rows.

+ */

+

+METHODDEF(void)

+pre_process_data (j_compress_ptr cinfo,

+		  JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,

+		  JDIMENSION in_rows_avail,

+		  JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,

+		  JDIMENSION out_row_groups_avail)

+{

+  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;

+  int numrows, ci;

+  JDIMENSION inrows;

+  jpeg_component_info * compptr;

+

+  while (*in_row_ctr < in_rows_avail &&

+	 *out_row_group_ctr < out_row_groups_avail) {

+    /* Do color conversion to fill the conversion buffer. */

+    inrows = in_rows_avail - *in_row_ctr;

+    numrows = cinfo->max_v_samp_factor - prep->next_buf_row;

+    numrows = (int) MIN((JDIMENSION) numrows, inrows);

+    (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,

+				       prep->color_buf,

+				       (JDIMENSION) prep->next_buf_row,

+				       numrows);

+    *in_row_ctr += numrows;

+    prep->next_buf_row += numrows;

+    prep->rows_to_go -= numrows;

+    /* If at bottom of image, pad to fill the conversion buffer. */

+    if (prep->rows_to_go == 0 &&

+	prep->next_buf_row < cinfo->max_v_samp_factor) {

+      for (ci = 0; ci < cinfo->num_components; ci++) {

+	expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,

+			   prep->next_buf_row, cinfo->max_v_samp_factor);

+      }

+      prep->next_buf_row = cinfo->max_v_samp_factor;

+    }

+    /* If we've filled the conversion buffer, empty it. */

+    if (prep->next_buf_row == cinfo->max_v_samp_factor) {

+      (*cinfo->downsample->downsample) (cinfo,

+					prep->color_buf, (JDIMENSION) 0,

+					output_buf, *out_row_group_ctr);

+      prep->next_buf_row = 0;

+      (*out_row_group_ctr)++;

+    }

+    /* If at bottom of image, pad the output to a full iMCU height.

+     * Note we assume the caller is providing a one-iMCU-height output buffer!

+     */

+    if (prep->rows_to_go == 0 &&

+	*out_row_group_ctr < out_row_groups_avail) {

+      for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+	   ci++, compptr++) {

+	expand_bottom_edge(output_buf[ci],

+			   compptr->width_in_blocks * DCTSIZE,

+			   (int) (*out_row_group_ctr * compptr->v_samp_factor),

+			   (int) (out_row_groups_avail * compptr->v_samp_factor));

+      }

+      *out_row_group_ctr = out_row_groups_avail;

+      break;			/* can exit outer loop without test */

+    }

+  }

+}

+

+

+#ifdef CONTEXT_ROWS_SUPPORTED

+

+/*

+ * Process some data in the context case.

+ */

+

+METHODDEF(void)

+pre_process_context (j_compress_ptr cinfo,

+		     JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,

+		     JDIMENSION in_rows_avail,

+		     JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,

+		     JDIMENSION out_row_groups_avail)

+{

+  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;

+  int numrows, ci;

+  int buf_height = cinfo->max_v_samp_factor * 3;

+  JDIMENSION inrows;

+

+  while (*out_row_group_ctr < out_row_groups_avail) {

+    if (*in_row_ctr < in_rows_avail) {

+      /* Do color conversion to fill the conversion buffer. */

+      inrows = in_rows_avail - *in_row_ctr;

+      numrows = prep->next_buf_stop - prep->next_buf_row;

+      numrows = (int) MIN((JDIMENSION) numrows, inrows);

+      (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,

+					 prep->color_buf,

+					 (JDIMENSION) prep->next_buf_row,

+					 numrows);

+      /* Pad at top of image, if first time through */

+      if (prep->rows_to_go == cinfo->image_height) {

+	for (ci = 0; ci < cinfo->num_components; ci++) {

+	  int row;

+	  for (row = 1; row <= cinfo->max_v_samp_factor; row++) {

+	    jcopy_sample_rows(prep->color_buf[ci], 0,

+			      prep->color_buf[ci], -row,

+			      1, cinfo->image_width);

+	  }

+	}

+      }

+      *in_row_ctr += numrows;

+      prep->next_buf_row += numrows;

+      prep->rows_to_go -= numrows;

+    } else {

+      /* Return for more data, unless we are at the bottom of the image. */

+      if (prep->rows_to_go != 0)

+	break;

+      /* When at bottom of image, pad to fill the conversion buffer. */

+      if (prep->next_buf_row < prep->next_buf_stop) {

+	for (ci = 0; ci < cinfo->num_components; ci++) {

+	  expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,

+			     prep->next_buf_row, prep->next_buf_stop);

+	}

+	prep->next_buf_row = prep->next_buf_stop;

+      }

+    }

+    /* If we've gotten enough data, downsample a row group. */

+    if (prep->next_buf_row == prep->next_buf_stop) {

+      (*cinfo->downsample->downsample) (cinfo,

+					prep->color_buf,

+					(JDIMENSION) prep->this_row_group,

+					output_buf, *out_row_group_ctr);

+      (*out_row_group_ctr)++;

+      /* Advance pointers with wraparound as necessary. */

+      prep->this_row_group += cinfo->max_v_samp_factor;

+      if (prep->this_row_group >= buf_height)

+	prep->this_row_group = 0;

+      if (prep->next_buf_row >= buf_height)

+	prep->next_buf_row = 0;

+      prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor;

+    }

+  }

+}

+

+

+/*

+ * Create the wrapped-around downsampling input buffer needed for context mode.

+ */

+

+LOCAL(void)

+create_context_buffer (j_compress_ptr cinfo)

+{

+  my_prep_ptr prep = (my_prep_ptr) cinfo->prep;

+  int rgroup_height = cinfo->max_v_samp_factor;

+  int ci, i;

+  jpeg_component_info * compptr;

+  JSAMPARRAY true_buffer, fake_buffer;

+

+  /* Grab enough space for fake row pointers for all the components;

+   * we need five row groups' worth of pointers for each component.

+   */

+  fake_buffer = (JSAMPARRAY)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				(cinfo->num_components * 5 * rgroup_height) *

+				SIZEOF(JSAMPROW));

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    /* Allocate the actual buffer space (3 row groups) for this component.

+     * We make the buffer wide enough to allow the downsampler to edge-expand

+     * horizontally within the buffer, if it so chooses.

+     */

+    true_buffer = (*cinfo->mem->alloc_sarray)

+      ((j_common_ptr) cinfo, JPOOL_IMAGE,

+       (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *

+		      cinfo->max_h_samp_factor) / compptr->h_samp_factor),

+       (JDIMENSION) (3 * rgroup_height));

+    /* Copy true buffer row pointers into the middle of the fake row array */

+    MEMCOPY(fake_buffer + rgroup_height, true_buffer,

+	    3 * rgroup_height * SIZEOF(JSAMPROW));

+    /* Fill in the above and below wraparound pointers */

+    for (i = 0; i < rgroup_height; i++) {

+      fake_buffer[i] = true_buffer[2 * rgroup_height + i];

+      fake_buffer[4 * rgroup_height + i] = true_buffer[i];

+    }

+    prep->color_buf[ci] = fake_buffer + rgroup_height;

+    fake_buffer += 5 * rgroup_height; /* point to space for next component */

+  }

+}

+

+#endif /* CONTEXT_ROWS_SUPPORTED */

+

+

+/*

+ * Initialize preprocessing controller.

+ */

+

+GLOBAL(void)

+jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer)

+{

+  my_prep_ptr prep;

+  int ci;

+  jpeg_component_info * compptr;

+

+  if (need_full_buffer)		/* safety check */

+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+

+  prep = (my_prep_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_prep_controller));

+  cinfo->prep = (struct jpeg_c_prep_controller *) prep;

+  prep->pub.start_pass = start_pass_prep;

+

+  /* Allocate the color conversion buffer.

+   * We make the buffer wide enough to allow the downsampler to edge-expand

+   * horizontally within the buffer, if it so chooses.

+   */

+  if (cinfo->downsample->need_context_rows) {

+    /* Set up to provide context rows */

+#ifdef CONTEXT_ROWS_SUPPORTED

+    prep->pub.pre_process_data = pre_process_context;

+    create_context_buffer(cinfo);

+#else

+    ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif

+  } else {

+    /* No context, just make it tall enough for one row group */

+    prep->pub.pre_process_data = pre_process_data;

+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+	 ci++, compptr++) {

+      prep->color_buf[ci] = (*cinfo->mem->alloc_sarray)

+	((j_common_ptr) cinfo, JPOOL_IMAGE,

+	 (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *

+			cinfo->max_h_samp_factor) / compptr->h_samp_factor),

+	 (JDIMENSION) cinfo->max_v_samp_factor);

+    }

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcsample.c b/core/src/fxcodec/libjpeg/fpdfapi_jcsample.c
new file mode 100644
index 0000000..7256bd7
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcsample.c
@@ -0,0 +1,522 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jcsample.c

+ *

+ * Copyright (C) 1991-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains downsampling routines.

+ *

+ * Downsampling input data is counted in "row groups".  A row group

+ * is defined to be max_v_samp_factor pixel rows of each component,

+ * from which the downsampler produces v_samp_factor sample rows.

+ * A single row group is processed in each call to the downsampler module.

+ *

+ * The downsampler is responsible for edge-expansion of its output data

+ * to fill an integral number of DCT blocks horizontally.  The source buffer

+ * may be modified if it is helpful for this purpose (the source buffer is

+ * allocated wide enough to correspond to the desired output width).

+ * The caller (the prep controller) is responsible for vertical padding.

+ *

+ * The downsampler may request "context rows" by setting need_context_rows

+ * during startup.  In this case, the input arrays will contain at least

+ * one row group's worth of pixels above and below the passed-in data;

+ * the caller will create dummy rows at image top and bottom by replicating

+ * the first or last real pixel row.

+ *

+ * An excellent reference for image resampling is

+ *   Digital Image Warping, George Wolberg, 1990.

+ *   Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.

+ *

+ * The downsampling algorithm used here is a simple average of the source

+ * pixels covered by the output pixel.  The hi-falutin sampling literature

+ * refers to this as a "box filter".  In general the characteristics of a box

+ * filter are not very good, but for the specific cases we normally use (1:1

+ * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not

+ * nearly so bad.  If you intend to use other sampling ratios, you'd be well

+ * advised to improve this code.

+ *

+ * A simple input-smoothing capability is provided.  This is mainly intended

+ * for cleaning up color-dithered GIF input files (if you find it inadequate,

+ * we suggest using an external filtering program such as pnmconvol).  When

+ * enabled, each input pixel P is replaced by a weighted sum of itself and its

+ * eight neighbors.  P's weight is 1-8*SF and each neighbor's weight is SF,

+ * where SF = (smoothing_factor / 1024).

+ * Currently, smoothing is only supported for 2h2v sampling factors.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* Pointer to routine to downsample a single component */

+typedef JMETHOD(void, downsample1_ptr,

+		(j_compress_ptr cinfo, jpeg_component_info * compptr,

+		 JSAMPARRAY input_data, JSAMPARRAY output_data));

+

+/* Private subobject */

+

+typedef struct {

+  struct jpeg_downsampler pub;	/* public fields */

+

+  /* Downsampling method pointers, one per component */

+  downsample1_ptr methods[MAX_COMPONENTS];

+} my_downsampler;

+

+typedef my_downsampler * my_downsample_ptr;

+

+

+/*

+ * Initialize for a downsampling pass.

+ */

+

+METHODDEF(void)

+start_pass_downsample (j_compress_ptr cinfo)

+{

+  /* no work for now */

+}

+

+

+/*

+ * Expand a component horizontally from width input_cols to width output_cols,

+ * by duplicating the rightmost samples.

+ */

+

+LOCAL(void)

+expand_right_edge (JSAMPARRAY image_data, int num_rows,

+		   JDIMENSION input_cols, JDIMENSION output_cols)

+{

+  register JSAMPROW ptr;

+  register JSAMPLE pixval;

+  register int count;

+  int row;

+  int numcols = (int) (output_cols - input_cols);

+

+  if (numcols > 0) {

+    for (row = 0; row < num_rows; row++) {

+      ptr = image_data[row] + input_cols;

+      pixval = ptr[-1];		/* don't need GETJSAMPLE() here */

+      for (count = numcols; count > 0; count--)

+	*ptr++ = pixval;

+    }

+  }

+}

+

+

+/*

+ * Do downsampling for a whole row group (all components).

+ *

+ * In this version we simply downsample each component independently.

+ */

+

+METHODDEF(void)

+sep_downsample (j_compress_ptr cinfo,

+		JSAMPIMAGE input_buf, JDIMENSION in_row_index,

+		JSAMPIMAGE output_buf, JDIMENSION out_row_group_index)

+{

+  my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample;

+  int ci;

+  jpeg_component_info * compptr;

+  JSAMPARRAY in_ptr, out_ptr;

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    in_ptr = input_buf[ci] + in_row_index;

+    out_ptr = output_buf[ci] + (out_row_group_index * compptr->v_samp_factor);

+    (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr);

+  }

+}

+

+

+/*

+ * Downsample pixel values of a single component.

+ * One row group is processed per call.

+ * This version handles arbitrary integral sampling ratios, without smoothing.

+ * Note that this version is not actually used for customary sampling ratios.

+ */

+

+METHODDEF(void)

+int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,

+		JSAMPARRAY input_data, JSAMPARRAY output_data)

+{

+  int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v;

+  JDIMENSION outcol, outcol_h;	/* outcol_h == outcol*h_expand */

+  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;

+  JSAMPROW inptr, outptr;

+  INT32 outvalue;

+

+  h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor;

+  v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor;

+  numpix = h_expand * v_expand;

+  numpix2 = numpix/2;

+

+  /* Expand input data enough to let all the output samples be generated

+   * by the standard loop.  Special-casing padded output would be more

+   * efficient.

+   */

+  expand_right_edge(input_data, cinfo->max_v_samp_factor,

+		    cinfo->image_width, output_cols * h_expand);

+

+  inrow = 0;

+  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {

+    outptr = output_data[outrow];

+    for (outcol = 0, outcol_h = 0; outcol < output_cols;

+	 outcol++, outcol_h += h_expand) {

+      outvalue = 0;

+      for (v = 0; v < v_expand; v++) {

+	inptr = input_data[inrow+v] + outcol_h;

+	for (h = 0; h < h_expand; h++) {

+	  outvalue += (INT32) GETJSAMPLE(*inptr++);

+	}

+      }

+      *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix);

+    }

+    inrow += v_expand;

+  }

+}

+

+

+/*

+ * Downsample pixel values of a single component.

+ * This version handles the special case of a full-size component,

+ * without smoothing.

+ */

+

+METHODDEF(void)

+fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,

+		     JSAMPARRAY input_data, JSAMPARRAY output_data)

+{

+  /* Copy the data */

+  jcopy_sample_rows(input_data, 0, output_data, 0,

+		    cinfo->max_v_samp_factor, cinfo->image_width);

+  /* Edge-expand */

+  expand_right_edge(output_data, cinfo->max_v_samp_factor,

+		    cinfo->image_width, compptr->width_in_blocks * DCTSIZE);

+}

+

+

+/*

+ * Downsample pixel values of a single component.

+ * This version handles the common case of 2:1 horizontal and 1:1 vertical,

+ * without smoothing.

+ *

+ * A note about the "bias" calculations: when rounding fractional values to

+ * integer, we do not want to always round 0.5 up to the next integer.

+ * If we did that, we'd introduce a noticeable bias towards larger values.

+ * Instead, this code is arranged so that 0.5 will be rounded up or down at

+ * alternate pixel locations (a simple ordered dither pattern).

+ */

+

+METHODDEF(void)

+h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,

+		 JSAMPARRAY input_data, JSAMPARRAY output_data)

+{

+  int outrow;

+  JDIMENSION outcol;

+  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;

+  register JSAMPROW inptr, outptr;

+  register int bias;

+

+  /* Expand input data enough to let all the output samples be generated

+   * by the standard loop.  Special-casing padded output would be more

+   * efficient.

+   */

+  expand_right_edge(input_data, cinfo->max_v_samp_factor,

+		    cinfo->image_width, output_cols * 2);

+

+  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {

+    outptr = output_data[outrow];

+    inptr = input_data[outrow];

+    bias = 0;			/* bias = 0,1,0,1,... for successive samples */

+    for (outcol = 0; outcol < output_cols; outcol++) {

+      *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1])

+			      + bias) >> 1);

+      bias ^= 1;		/* 0=>1, 1=>0 */

+      inptr += 2;

+    }

+  }

+}

+

+

+/*

+ * Downsample pixel values of a single component.

+ * This version handles the standard case of 2:1 horizontal and 2:1 vertical,

+ * without smoothing.

+ */

+

+METHODDEF(void)

+h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,

+		 JSAMPARRAY input_data, JSAMPARRAY output_data)

+{

+  int inrow, outrow;

+  JDIMENSION outcol;

+  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;

+  register JSAMPROW inptr0, inptr1, outptr;

+  register int bias;

+

+  /* Expand input data enough to let all the output samples be generated

+   * by the standard loop.  Special-casing padded output would be more

+   * efficient.

+   */

+  expand_right_edge(input_data, cinfo->max_v_samp_factor,

+		    cinfo->image_width, output_cols * 2);

+

+  inrow = 0;

+  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {

+    outptr = output_data[outrow];

+    inptr0 = input_data[inrow];

+    inptr1 = input_data[inrow+1];

+    bias = 1;			/* bias = 1,2,1,2,... for successive samples */

+    for (outcol = 0; outcol < output_cols; outcol++) {

+      *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +

+			      GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1])

+			      + bias) >> 2);

+      bias ^= 3;		/* 1=>2, 2=>1 */

+      inptr0 += 2; inptr1 += 2;

+    }

+    inrow += 2;

+  }

+}

+

+

+#ifdef INPUT_SMOOTHING_SUPPORTED

+

+/*

+ * Downsample pixel values of a single component.

+ * This version handles the standard case of 2:1 horizontal and 2:1 vertical,

+ * with smoothing.  One row of context is required.

+ */

+

+METHODDEF(void)

+h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,

+			JSAMPARRAY input_data, JSAMPARRAY output_data)

+{

+  int inrow, outrow;

+  JDIMENSION colctr;

+  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;

+  register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr;

+  INT32 membersum, neighsum, memberscale, neighscale;

+

+  /* Expand input data enough to let all the output samples be generated

+   * by the standard loop.  Special-casing padded output would be more

+   * efficient.

+   */

+  expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,

+		    cinfo->image_width, output_cols * 2);

+

+  /* We don't bother to form the individual "smoothed" input pixel values;

+   * we can directly compute the output which is the average of the four

+   * smoothed values.  Each of the four member pixels contributes a fraction

+   * (1-8*SF) to its own smoothed image and a fraction SF to each of the three

+   * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final

+   * output.  The four corner-adjacent neighbor pixels contribute a fraction

+   * SF to just one smoothed pixel, or SF/4 to the final output; while the

+   * eight edge-adjacent neighbors contribute SF to each of two smoothed

+   * pixels, or SF/2 overall.  In order to use integer arithmetic, these

+   * factors are scaled by 2^16 = 65536.

+   * Also recall that SF = smoothing_factor / 1024.

+   */

+

+  memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */

+  neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */

+

+  inrow = 0;

+  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {

+    outptr = output_data[outrow];

+    inptr0 = input_data[inrow];

+    inptr1 = input_data[inrow+1];

+    above_ptr = input_data[inrow-1];

+    below_ptr = input_data[inrow+2];

+

+    /* Special case for first column: pretend column -1 is same as column 0 */

+    membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +

+		GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);

+    neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +

+	       GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +

+	       GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) +

+	       GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]);

+    neighsum += neighsum;

+    neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) +

+		GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]);

+    membersum = membersum * memberscale + neighsum * neighscale;

+    *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);

+    inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;

+

+    for (colctr = output_cols - 2; colctr > 0; colctr--) {

+      /* sum of pixels directly mapped to this output element */

+      membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +

+		  GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);

+      /* sum of edge-neighbor pixels */

+      neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +

+		 GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +

+		 GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) +

+		 GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]);

+      /* The edge-neighbors count twice as much as corner-neighbors */

+      neighsum += neighsum;

+      /* Add in the corner-neighbors */

+      neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) +

+		  GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]);

+      /* form final output scaled up by 2^16 */

+      membersum = membersum * memberscale + neighsum * neighscale;

+      /* round, descale and output it */

+      *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);

+      inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;

+    }

+

+    /* Special case for last column */

+    membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +

+		GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);

+    neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +

+	       GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +

+	       GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) +

+	       GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]);

+    neighsum += neighsum;

+    neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) +

+		GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]);

+    membersum = membersum * memberscale + neighsum * neighscale;

+    *outptr = (JSAMPLE) ((membersum + 32768) >> 16);

+

+    inrow += 2;

+  }

+}

+

+

+/*

+ * Downsample pixel values of a single component.

+ * This version handles the special case of a full-size component,

+ * with smoothing.  One row of context is required.

+ */

+

+METHODDEF(void)

+fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr,

+			    JSAMPARRAY input_data, JSAMPARRAY output_data)

+{

+  int outrow;

+  JDIMENSION colctr;

+  JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;

+  register JSAMPROW inptr, above_ptr, below_ptr, outptr;

+  INT32 membersum, neighsum, memberscale, neighscale;

+  int colsum, lastcolsum, nextcolsum;

+

+  /* Expand input data enough to let all the output samples be generated

+   * by the standard loop.  Special-casing padded output would be more

+   * efficient.

+   */

+  expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,

+		    cinfo->image_width, output_cols);

+

+  /* Each of the eight neighbor pixels contributes a fraction SF to the

+   * smoothed pixel, while the main pixel contributes (1-8*SF).  In order

+   * to use integer arithmetic, these factors are multiplied by 2^16 = 65536.

+   * Also recall that SF = smoothing_factor / 1024.

+   */

+

+  memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */

+  neighscale = cinfo->smoothing_factor * 64; /* scaled SF */

+

+  for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {

+    outptr = output_data[outrow];

+    inptr = input_data[outrow];

+    above_ptr = input_data[outrow-1];

+    below_ptr = input_data[outrow+1];

+

+    /* Special case for first column */

+    colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) +

+	     GETJSAMPLE(*inptr);

+    membersum = GETJSAMPLE(*inptr++);

+    nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +

+		 GETJSAMPLE(*inptr);

+    neighsum = colsum + (colsum - membersum) + nextcolsum;

+    membersum = membersum * memberscale + neighsum * neighscale;

+    *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);

+    lastcolsum = colsum; colsum = nextcolsum;

+

+    for (colctr = output_cols - 2; colctr > 0; colctr--) {

+      membersum = GETJSAMPLE(*inptr++);

+      above_ptr++; below_ptr++;

+      nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +

+		   GETJSAMPLE(*inptr);

+      neighsum = lastcolsum + (colsum - membersum) + nextcolsum;

+      membersum = membersum * memberscale + neighsum * neighscale;

+      *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);

+      lastcolsum = colsum; colsum = nextcolsum;

+    }

+

+    /* Special case for last column */

+    membersum = GETJSAMPLE(*inptr);

+    neighsum = lastcolsum + (colsum - membersum) + colsum;

+    membersum = membersum * memberscale + neighsum * neighscale;

+    *outptr = (JSAMPLE) ((membersum + 32768) >> 16);

+

+  }

+}

+

+#endif /* INPUT_SMOOTHING_SUPPORTED */

+

+

+/*

+ * Module initialization routine for downsampling.

+ * Note that we must select a routine for each component.

+ */

+

+GLOBAL(void)

+jinit_downsampler (j_compress_ptr cinfo)

+{

+  my_downsample_ptr downsample;

+  int ci;

+  jpeg_component_info * compptr;

+  boolean smoothok = TRUE;

+

+  downsample = (my_downsample_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_downsampler));

+  cinfo->downsample = (struct jpeg_downsampler *) downsample;

+  downsample->pub.start_pass = start_pass_downsample;

+  downsample->pub.downsample = sep_downsample;

+  downsample->pub.need_context_rows = FALSE;

+

+  if (cinfo->CCIR601_sampling)

+    ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);

+

+  /* Verify we can handle the sampling factors, and set up method pointers */

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    if (compptr->h_samp_factor == cinfo->max_h_samp_factor &&

+	compptr->v_samp_factor == cinfo->max_v_samp_factor) {

+#ifdef INPUT_SMOOTHING_SUPPORTED

+      if (cinfo->smoothing_factor) {

+	downsample->methods[ci] = fullsize_smooth_downsample;

+	downsample->pub.need_context_rows = TRUE;

+      } else

+#endif

+	downsample->methods[ci] = fullsize_downsample;

+    } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&

+	       compptr->v_samp_factor == cinfo->max_v_samp_factor) {

+      smoothok = FALSE;

+      downsample->methods[ci] = h2v1_downsample;

+    } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&

+	       compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) {

+#ifdef INPUT_SMOOTHING_SUPPORTED

+      if (cinfo->smoothing_factor) {

+	downsample->methods[ci] = h2v2_smooth_downsample;

+	downsample->pub.need_context_rows = TRUE;

+      } else

+#endif

+	downsample->methods[ci] = h2v2_downsample;

+    } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 &&

+	       (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) {

+      smoothok = FALSE;

+      downsample->methods[ci] = int_downsample;

+    } else

+      ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);

+  }

+

+#ifdef INPUT_SMOOTHING_SUPPORTED

+  if (cinfo->smoothing_factor && !smoothok)

+    TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL);

+#endif

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jctrans.c b/core/src/fxcodec/libjpeg/fpdfapi_jctrans.c
new file mode 100644
index 0000000..ed54115
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jctrans.c
@@ -0,0 +1,391 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jctrans.c

+ *

+ * Copyright (C) 1995-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains library routines for transcoding compression,

+ * that is, writing raw DCT coefficient arrays to an output JPEG file.

+ * The routines in jcapimin.c will also be needed by a transcoder.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* Forward declarations */

+LOCAL(void) transencode_master_selection

+	JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));

+LOCAL(void) transencode_coef_controller

+	JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));

+

+

+/*

+ * Compression initialization for writing raw-coefficient data.

+ * Before calling this, all parameters and a data destination must be set up.

+ * Call jpeg_finish_compress() to actually write the data.

+ *

+ * The number of passed virtual arrays must match cinfo->num_components.

+ * Note that the virtual arrays need not be filled or even realized at

+ * the time write_coefficients is called; indeed, if the virtual arrays

+ * were requested from this compression object's memory manager, they

+ * typically will be realized during this routine and filled afterwards.

+ */

+

+GLOBAL(void)

+jpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)

+{

+  if (cinfo->global_state != CSTATE_START)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  /* Mark all tables to be written */

+  jpeg_suppress_tables(cinfo, FALSE);

+  /* (Re)initialize error mgr and destination modules */

+  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);

+  (*cinfo->dest->init_destination) (cinfo);

+  /* Perform master selection of active modules */

+  transencode_master_selection(cinfo, coef_arrays);

+  /* Wait for jpeg_finish_compress() call */

+  cinfo->next_scanline = 0;	/* so jpeg_write_marker works */

+  cinfo->global_state = CSTATE_WRCOEFS;

+}

+

+

+/*

+ * Initialize the compression object with default parameters,

+ * then copy from the source object all parameters needed for lossless

+ * transcoding.  Parameters that can be varied without loss (such as

+ * scan script and Huffman optimization) are left in their default states.

+ */

+

+GLOBAL(void)

+jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,

+			       j_compress_ptr dstinfo)

+{

+  JQUANT_TBL ** qtblptr;

+  jpeg_component_info *incomp, *outcomp;

+  JQUANT_TBL *c_quant, *slot_quant;

+  int tblno, ci, coefi;

+

+  /* Safety check to ensure start_compress not called yet. */

+  if (dstinfo->global_state != CSTATE_START)

+    ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state);

+  /* Copy fundamental image dimensions */

+  dstinfo->image_width = srcinfo->image_width;

+  dstinfo->image_height = srcinfo->image_height;

+  dstinfo->input_components = srcinfo->num_components;

+  dstinfo->in_color_space = srcinfo->jpeg_color_space;

+  /* Initialize all parameters to default values */

+  jpeg_set_defaults(dstinfo);

+  /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.

+   * Fix it to get the right header markers for the image colorspace.

+   */

+  jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);

+  dstinfo->data_precision = srcinfo->data_precision;

+  dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;

+  /* Copy the source's quantization tables. */

+  for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) {

+    if (srcinfo->quant_tbl_ptrs[tblno] != NULL) {

+      qtblptr = & dstinfo->quant_tbl_ptrs[tblno];

+      if (*qtblptr == NULL)

+	*qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo);

+      MEMCOPY((*qtblptr)->quantval,

+	      srcinfo->quant_tbl_ptrs[tblno]->quantval,

+	      SIZEOF((*qtblptr)->quantval));

+      (*qtblptr)->sent_table = FALSE;

+    }

+  }

+  /* Copy the source's per-component info.

+   * Note we assume jpeg_set_defaults has allocated the dest comp_info array.

+   */

+  dstinfo->num_components = srcinfo->num_components;

+  if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS)

+    ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components,

+	     MAX_COMPONENTS);

+  for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info;

+       ci < dstinfo->num_components; ci++, incomp++, outcomp++) {

+    outcomp->component_id = incomp->component_id;

+    outcomp->h_samp_factor = incomp->h_samp_factor;

+    outcomp->v_samp_factor = incomp->v_samp_factor;

+    outcomp->quant_tbl_no = incomp->quant_tbl_no;

+    /* Make sure saved quantization table for component matches the qtable

+     * slot.  If not, the input file re-used this qtable slot.

+     * IJG encoder currently cannot duplicate this.

+     */

+    tblno = outcomp->quant_tbl_no;

+    if (tblno < 0 || tblno >= NUM_QUANT_TBLS ||

+	srcinfo->quant_tbl_ptrs[tblno] == NULL)

+      ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno);

+    slot_quant = srcinfo->quant_tbl_ptrs[tblno];

+    c_quant = incomp->quant_table;

+    if (c_quant != NULL) {

+      for (coefi = 0; coefi < DCTSIZE2; coefi++) {

+	if (c_quant->quantval[coefi] != slot_quant->quantval[coefi])

+	  ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);

+      }

+    }

+    /* Note: we do not copy the source's Huffman table assignments;

+     * instead we rely on jpeg_set_colorspace to have made a suitable choice.

+     */

+  }

+  /* Also copy JFIF version and resolution information, if available.

+   * Strictly speaking this isn't "critical" info, but it's nearly

+   * always appropriate to copy it if available.  In particular,

+   * if the application chooses to copy JFIF 1.02 extension markers from

+   * the source file, we need to copy the version to make sure we don't

+   * emit a file that has 1.02 extensions but a claimed version of 1.01.

+   * We will *not*, however, copy version info from mislabeled "2.01" files.

+   */

+  if (srcinfo->saw_JFIF_marker) {

+    if (srcinfo->JFIF_major_version == 1) {

+      dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;

+      dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;

+    }

+    dstinfo->density_unit = srcinfo->density_unit;

+    dstinfo->X_density = srcinfo->X_density;

+    dstinfo->Y_density = srcinfo->Y_density;

+  }

+}

+

+

+/*

+ * Master selection of compression modules for transcoding.

+ * This substitutes for jcinit.c's initialization of the full compressor.

+ */

+

+LOCAL(void)

+transencode_master_selection (j_compress_ptr cinfo,

+			      jvirt_barray_ptr * coef_arrays)

+{

+  /* Although we don't actually use input_components for transcoding,

+   * jcmaster.c's initial_setup will complain if input_components is 0.

+   */

+  cinfo->input_components = 1;

+  /* Initialize master control (includes parameter checking/processing) */

+  jinit_c_master_control(cinfo, TRUE /* transcode only */);

+

+  /* Entropy encoding: either Huffman or arithmetic coding. */

+  if (cinfo->arith_code) {

+    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);

+  } else {

+    if (cinfo->progressive_mode) {

+#ifdef C_PROGRESSIVE_SUPPORTED

+      jinit_phuff_encoder(cinfo);

+#else

+      ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif

+    } else

+      jinit_huff_encoder(cinfo);

+  }

+

+  /* We need a special coefficient buffer controller. */

+  transencode_coef_controller(cinfo, coef_arrays);

+

+  jinit_marker_writer(cinfo);

+

+  /* We can now tell the memory manager to allocate virtual arrays. */

+  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);

+

+  /* Write the datastream header (SOI, JFIF) immediately.

+   * Frame and scan headers are postponed till later.

+   * This lets application insert special markers after the SOI.

+   */

+  (*cinfo->marker->write_file_header) (cinfo);

+}

+

+

+/*

+ * The rest of this file is a special implementation of the coefficient

+ * buffer controller.  This is similar to jccoefct.c, but it handles only

+ * output from presupplied virtual arrays.  Furthermore, we generate any

+ * dummy padding blocks on-the-fly rather than expecting them to be present

+ * in the arrays.

+ */

+

+/* Private buffer controller object */

+

+typedef struct {

+  struct jpeg_c_coef_controller pub; /* public fields */

+

+  JDIMENSION iMCU_row_num;	/* iMCU row # within image */

+  JDIMENSION mcu_ctr;		/* counts MCUs processed in current row */

+  int MCU_vert_offset;		/* counts MCU rows within iMCU row */

+  int MCU_rows_per_iMCU_row;	/* number of such rows needed */

+

+  /* Virtual block array for each component. */

+  jvirt_barray_ptr * whole_image;

+

+  /* Workspace for constructing dummy blocks at right/bottom edges. */

+  JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU];

+} my_coef_controller;

+

+typedef my_coef_controller * my_coef_ptr;

+

+

+LOCAL(void)

+start_iMCU_row (j_compress_ptr cinfo)

+/* Reset within-iMCU-row counters for a new row */

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+

+  /* In an interleaved scan, an MCU row is the same as an iMCU row.

+   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.

+   * But at the bottom of the image, process only what's left.

+   */

+  if (cinfo->comps_in_scan > 1) {

+    coef->MCU_rows_per_iMCU_row = 1;

+  } else {

+    if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))

+      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;

+    else

+      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;

+  }

+

+  coef->mcu_ctr = 0;

+  coef->MCU_vert_offset = 0;

+}

+

+

+/*

+ * Initialize for a processing pass.

+ */

+

+METHODDEF(void)

+start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+

+  if (pass_mode != JBUF_CRANK_DEST)

+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+

+  coef->iMCU_row_num = 0;

+  start_iMCU_row(cinfo);

+}

+

+

+/*

+ * Process some data.

+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)

+ * per call, ie, v_samp_factor block rows for each component in the scan.

+ * The data is obtained from the virtual arrays and fed to the entropy coder.

+ * Returns TRUE if the iMCU row is completed, FALSE if suspended.

+ *

+ * NB: input_buf is ignored; it is likely to be a NULL pointer.

+ */

+

+METHODDEF(boolean)

+compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+  JDIMENSION MCU_col_num;	/* index of current MCU within row */

+  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;

+  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;

+  int blkn, ci, xindex, yindex, yoffset, blockcnt;

+  JDIMENSION start_col;

+  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];

+  JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];

+  JBLOCKROW buffer_ptr;

+  jpeg_component_info *compptr;

+

+  /* Align the virtual buffers for the components used in this scan. */

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+    compptr = cinfo->cur_comp_info[ci];

+    buffer[ci] = (*cinfo->mem->access_virt_barray)

+      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],

+       coef->iMCU_row_num * compptr->v_samp_factor,

+       (JDIMENSION) compptr->v_samp_factor, FALSE);

+  }

+

+  /* Loop to process one whole iMCU row */

+  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;

+       yoffset++) {

+    for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;

+	 MCU_col_num++) {

+      /* Construct list of pointers to DCT blocks belonging to this MCU */

+      blkn = 0;			/* index of current DCT block within MCU */

+      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+	compptr = cinfo->cur_comp_info[ci];

+	start_col = MCU_col_num * compptr->MCU_width;

+	blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width

+						: compptr->last_col_width;

+	for (yindex = 0; yindex < compptr->MCU_height; yindex++) {

+	  if (coef->iMCU_row_num < last_iMCU_row ||

+	      yindex+yoffset < compptr->last_row_height) {

+	    /* Fill in pointers to real blocks in this row */

+	    buffer_ptr = buffer[ci][yindex+yoffset] + start_col;

+	    for (xindex = 0; xindex < blockcnt; xindex++)

+	      MCU_buffer[blkn++] = buffer_ptr++;

+	  } else {

+	    /* At bottom of image, need a whole row of dummy blocks */

+	    xindex = 0;

+	  }

+	  /* Fill in any dummy blocks needed in this row.

+	   * Dummy blocks are filled in the same way as in jccoefct.c:

+	   * all zeroes in the AC entries, DC entries equal to previous

+	   * block's DC value.  The init routine has already zeroed the

+	   * AC entries, so we need only set the DC entries correctly.

+	   */

+	  for (; xindex < compptr->MCU_width; xindex++) {

+	    MCU_buffer[blkn] = coef->dummy_buffer[blkn];

+	    MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0];

+	    blkn++;

+	  }

+	}

+      }

+      /* Try to write the MCU. */

+      if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) {

+	/* Suspension forced; update state counters and exit */

+	coef->MCU_vert_offset = yoffset;

+	coef->mcu_ctr = MCU_col_num;

+	return FALSE;

+      }

+    }

+    /* Completed an MCU row, but perhaps not an iMCU row */

+    coef->mcu_ctr = 0;

+  }

+  /* Completed the iMCU row, advance counters for next one */

+  coef->iMCU_row_num++;

+  start_iMCU_row(cinfo);

+  return TRUE;

+}

+

+

+/*

+ * Initialize coefficient buffer controller.

+ *

+ * Each passed coefficient array must be the right size for that

+ * coefficient: width_in_blocks wide and height_in_blocks high,

+ * with unitheight at least v_samp_factor.

+ */

+

+LOCAL(void)

+transencode_coef_controller (j_compress_ptr cinfo,

+			     jvirt_barray_ptr * coef_arrays)

+{

+  my_coef_ptr coef;

+  JBLOCKROW buffer;

+  int i;

+

+  coef = (my_coef_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_coef_controller));

+  cinfo->coef = (struct jpeg_c_coef_controller *) coef;

+  coef->pub.start_pass = start_pass_coef;

+  coef->pub.compress_data = compress_output;

+

+  /* Save pointer to virtual arrays */

+  coef->whole_image = coef_arrays;

+

+  /* Allocate and pre-zero space for dummy DCT blocks. */

+  buffer = (JBLOCKROW)

+    (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));

+  jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));

+  for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {

+    coef->dummy_buffer[i] = buffer + i;

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c b/core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c
new file mode 100644
index 0000000..1b24b70
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c
@@ -0,0 +1,398 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdapimin.c

+ *

+ * Copyright (C) 1994-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains application interface code for the decompression half

+ * of the JPEG library.  These are the "minimum" API routines that may be

+ * needed in either the normal full-decompression case or the

+ * transcoding-only case.

+ *

+ * Most of the routines intended to be called directly by an application

+ * are in this file or in jdapistd.c.  But also see jcomapi.c for routines

+ * shared by compression and decompression, and jdtrans.c for the transcoding

+ * case.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/*

+ * Initialization of a JPEG decompression object.

+ * The error manager must already be set up (in case memory manager fails).

+ */

+

+GLOBAL(void)

+jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize)

+{

+  int i;

+

+  /* Guard against version mismatches between library and caller. */

+  cinfo->mem = NULL;		/* so jpeg_destroy knows mem mgr not called */

+  if (version != JPEG_LIB_VERSION)

+    ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);

+  if (structsize != SIZEOF(struct jpeg_decompress_struct))

+    ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, 

+	     (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize);

+

+  /* For debugging purposes, we zero the whole master structure.

+   * But the application has already set the err pointer, and may have set

+   * client_data, so we have to save and restore those fields.

+   * Note: if application hasn't set client_data, tools like Purify may

+   * complain here.

+   */

+  {

+    struct jpeg_error_mgr * err = cinfo->err;

+    void * client_data = cinfo->client_data; /* ignore Purify complaint here */

+    MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct));

+    cinfo->err = err;

+    cinfo->client_data = client_data;

+  }

+  cinfo->is_decompressor = TRUE;

+

+  /* Initialize a memory manager instance for this object */

+  jinit_memory_mgr((j_common_ptr) cinfo);

+

+  /* Zero out pointers to permanent structures. */

+  cinfo->progress = NULL;

+  cinfo->src = NULL;

+

+  for (i = 0; i < NUM_QUANT_TBLS; i++)

+    cinfo->quant_tbl_ptrs[i] = NULL;

+

+  for (i = 0; i < NUM_HUFF_TBLS; i++) {

+    cinfo->dc_huff_tbl_ptrs[i] = NULL;

+    cinfo->ac_huff_tbl_ptrs[i] = NULL;

+  }

+

+  /* Initialize marker processor so application can override methods

+   * for COM, APPn markers before calling jpeg_read_header.

+   */

+  cinfo->marker_list = NULL;

+  jinit_marker_reader(cinfo);

+

+  /* And initialize the overall input controller. */

+  jinit_input_controller(cinfo);

+

+  /* OK, I'm ready */

+  cinfo->global_state = DSTATE_START;

+}

+

+

+/*

+ * Destruction of a JPEG decompression object

+ */

+

+GLOBAL(void)

+jpeg_destroy_decompress (j_decompress_ptr cinfo)

+{

+  jpeg_destroy((j_common_ptr) cinfo); /* use common routine */

+}

+

+

+/*

+ * Abort processing of a JPEG decompression operation,

+ * but don't destroy the object itself.

+ */

+

+GLOBAL(void)

+jpeg_abort_decompress (j_decompress_ptr cinfo)

+{

+  jpeg_abort((j_common_ptr) cinfo); /* use common routine */

+}

+

+

+/*

+ * Set default decompression parameters.

+ */

+

+LOCAL(void)

+default_decompress_parms (j_decompress_ptr cinfo)

+{

+  /* Guess the input colorspace, and set output colorspace accordingly. */

+  /* (Wish JPEG committee had provided a real way to specify this...) */

+  /* Note application may override our guesses. */

+  switch (cinfo->num_components) {

+  case 1:

+    cinfo->jpeg_color_space = JCS_GRAYSCALE;

+    cinfo->out_color_space = JCS_GRAYSCALE;

+    break;

+    

+  case 3:

+    if (cinfo->saw_JFIF_marker) {

+      cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */

+    } else if (cinfo->saw_Adobe_marker) {

+      switch (cinfo->Adobe_transform) {

+      case 0:

+	cinfo->jpeg_color_space = JCS_RGB;

+	break;

+      case 1:

+	cinfo->jpeg_color_space = JCS_YCbCr;

+	break;

+      default:

+	WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);

+	cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */

+	break;

+      }

+    } else {

+      /* Saw no special markers, try to guess from the component IDs */

+      int cid0 = cinfo->comp_info[0].component_id;

+      int cid1 = cinfo->comp_info[1].component_id;

+      int cid2 = cinfo->comp_info[2].component_id;

+

+      if (cid0 == 1 && cid1 == 2 && cid2 == 3)

+	cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */

+      else if (cid0 == 82 && cid1 == 71 && cid2 == 66)

+	cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */

+      else {

+	TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);

+	cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */

+      }

+    }

+    /* Always guess RGB is proper output colorspace. */

+    cinfo->out_color_space = JCS_RGB;

+    break;

+    

+  case 4:

+    if (cinfo->saw_Adobe_marker) {

+      switch (cinfo->Adobe_transform) {

+      case 0:

+	cinfo->jpeg_color_space = JCS_CMYK;

+	break;

+      case 2:

+	cinfo->jpeg_color_space = JCS_YCCK;

+	break;

+      default:

+	WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);

+	cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */

+	break;

+      }

+    } else {

+      /* No special markers, assume straight CMYK. */

+      cinfo->jpeg_color_space = JCS_CMYK;

+    }

+    cinfo->out_color_space = JCS_CMYK;

+    break;

+    

+  default:

+    cinfo->jpeg_color_space = JCS_UNKNOWN;

+    cinfo->out_color_space = JCS_UNKNOWN;

+    break;

+  }

+

+  /* Set defaults for other decompression parameters. */

+  cinfo->scale_num = 1;		/* 1:1 scaling */

+  cinfo->scale_denom = 1;

+  cinfo->output_gamma = 1.0;

+  cinfo->buffered_image = FALSE;

+  cinfo->raw_data_out = FALSE;

+  cinfo->dct_method = JDCT_DEFAULT;

+  cinfo->do_fancy_upsampling = TRUE;

+  cinfo->do_block_smoothing = TRUE;

+  cinfo->quantize_colors = FALSE;

+  /* We set these in case application only sets quantize_colors. */

+  cinfo->dither_mode = JDITHER_FS;

+#ifdef QUANT_2PASS_SUPPORTED

+  cinfo->two_pass_quantize = TRUE;

+#else

+  cinfo->two_pass_quantize = FALSE;

+#endif

+  cinfo->desired_number_of_colors = 256;

+  cinfo->colormap = NULL;

+  /* Initialize for no mode change in buffered-image mode. */

+  cinfo->enable_1pass_quant = FALSE;

+  cinfo->enable_external_quant = FALSE;

+  cinfo->enable_2pass_quant = FALSE;

+}

+

+

+/*

+ * Decompression startup: read start of JPEG datastream to see what's there.

+ * Need only initialize JPEG object and supply a data source before calling.

+ *

+ * This routine will read as far as the first SOS marker (ie, actual start of

+ * compressed data), and will save all tables and parameters in the JPEG

+ * object.  It will also initialize the decompression parameters to default

+ * values, and finally return JPEG_HEADER_OK.  On return, the application may

+ * adjust the decompression parameters and then call jpeg_start_decompress.

+ * (Or, if the application only wanted to determine the image parameters,

+ * the data need not be decompressed.  In that case, call jpeg_abort or

+ * jpeg_destroy to release any temporary space.)

+ * If an abbreviated (tables only) datastream is presented, the routine will

+ * return JPEG_HEADER_TABLES_ONLY upon reaching EOI.  The application may then

+ * re-use the JPEG object to read the abbreviated image datastream(s).

+ * It is unnecessary (but OK) to call jpeg_abort in this case.

+ * The JPEG_SUSPENDED return code only occurs if the data source module

+ * requests suspension of the decompressor.  In this case the application

+ * should load more source data and then re-call jpeg_read_header to resume

+ * processing.

+ * If a non-suspending data source is used and require_image is TRUE, then the

+ * return code need not be inspected since only JPEG_HEADER_OK is possible.

+ *

+ * This routine is now just a front end to jpeg_consume_input, with some

+ * extra error checking.

+ */

+

+GLOBAL(int)

+jpeg_read_header (j_decompress_ptr cinfo, boolean require_image)

+{

+  int retcode;

+

+  if (cinfo->global_state != DSTATE_START &&

+      cinfo->global_state != DSTATE_INHEADER)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+

+  retcode = jpeg_consume_input(cinfo);

+

+  switch (retcode) {

+  case JPEG_REACHED_SOS:

+    retcode = JPEG_HEADER_OK;

+    break;

+  case JPEG_REACHED_EOI:

+    if (require_image)		/* Complain if application wanted an image */

+      ERREXIT(cinfo, JERR_NO_IMAGE);

+    /* Reset to start state; it would be safer to require the application to

+     * call jpeg_abort, but we can't change it now for compatibility reasons.

+     * A side effect is to free any temporary memory (there shouldn't be any).

+     */

+    jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */

+    retcode = JPEG_HEADER_TABLES_ONLY;

+    break;

+  case JPEG_SUSPENDED:

+    /* no work */

+    break;

+  }

+

+  return retcode;

+}

+

+

+/*

+ * Consume data in advance of what the decompressor requires.

+ * This can be called at any time once the decompressor object has

+ * been created and a data source has been set up.

+ *

+ * This routine is essentially a state machine that handles a couple

+ * of critical state-transition actions, namely initial setup and

+ * transition from header scanning to ready-for-start_decompress.

+ * All the actual input is done via the input controller's consume_input

+ * method.

+ */

+

+GLOBAL(int)

+jpeg_consume_input (j_decompress_ptr cinfo)

+{

+  int retcode = JPEG_SUSPENDED;

+

+  /* NB: every possible DSTATE value should be listed in this switch */

+  switch (cinfo->global_state) {

+  case DSTATE_START:

+    /* Start-of-datastream actions: reset appropriate modules */

+    (*cinfo->inputctl->reset_input_controller) (cinfo);

+    /* Initialize application's data source module */

+    (*cinfo->src->init_source) (cinfo);

+    cinfo->global_state = DSTATE_INHEADER;

+    /*FALLTHROUGH*/

+  case DSTATE_INHEADER:

+    retcode = (*cinfo->inputctl->consume_input) (cinfo);

+    if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */

+      /* Set up default parameters based on header data */

+      default_decompress_parms(cinfo);

+      /* Set global state: ready for start_decompress */

+      cinfo->global_state = DSTATE_READY;

+    }

+    break;

+  case DSTATE_READY:

+    /* Can't advance past first SOS until start_decompress is called */

+    retcode = JPEG_REACHED_SOS;

+    break;

+  case DSTATE_PRELOAD:

+  case DSTATE_PRESCAN:

+  case DSTATE_SCANNING:

+  case DSTATE_RAW_OK:

+  case DSTATE_BUFIMAGE:

+  case DSTATE_BUFPOST:

+  case DSTATE_STOPPING:

+    retcode = (*cinfo->inputctl->consume_input) (cinfo);

+    break;

+  default:

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  }

+  return retcode;

+}

+

+

+/*

+ * Have we finished reading the input file?

+ */

+

+GLOBAL(boolean)

+jpeg_input_complete (j_decompress_ptr cinfo)

+{

+  /* Check for valid jpeg object */

+  if (cinfo->global_state < DSTATE_START ||

+      cinfo->global_state > DSTATE_STOPPING)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  return cinfo->inputctl->eoi_reached;

+}

+

+

+/*

+ * Is there more than one scan?

+ */

+

+GLOBAL(boolean)

+jpeg_has_multiple_scans (j_decompress_ptr cinfo)

+{

+  /* Only valid after jpeg_read_header completes */

+  if (cinfo->global_state < DSTATE_READY ||

+      cinfo->global_state > DSTATE_STOPPING)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  return cinfo->inputctl->has_multiple_scans;

+}

+

+

+/*

+ * Finish JPEG decompression.

+ *

+ * This will normally just verify the file trailer and release temp storage.

+ *

+ * Returns FALSE if suspended.  The return value need be inspected only if

+ * a suspending data source is used.

+ */

+

+GLOBAL(boolean)

+jpeg_finish_decompress (j_decompress_ptr cinfo)

+{

+  if ((cinfo->global_state == DSTATE_SCANNING ||

+       cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) {

+    /* Terminate final pass of non-buffered mode */

+    if (cinfo->output_scanline < cinfo->output_height)

+      ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);

+    (*cinfo->master->finish_output_pass) (cinfo);

+    cinfo->global_state = DSTATE_STOPPING;

+  } else if (cinfo->global_state == DSTATE_BUFIMAGE) {

+    /* Finishing after a buffered-image operation */

+    cinfo->global_state = DSTATE_STOPPING;

+  } else if (cinfo->global_state != DSTATE_STOPPING) {

+    /* STOPPING = repeat call after a suspension, anything else is error */

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  }

+  /* Read until EOI */

+  while (! cinfo->inputctl->eoi_reached) {

+    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)

+      return FALSE;		/* Suspend, come back later */

+  }

+  /* Do final cleanup */

+  (*cinfo->src->term_source) (cinfo);

+  /* We can use jpeg_abort to release memory and reset global_state */

+  jpeg_abort((j_common_ptr) cinfo);

+  return TRUE;

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c b/core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c
new file mode 100644
index 0000000..8c969eb
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c
@@ -0,0 +1,279 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdapistd.c

+ *

+ * Copyright (C) 1994-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains application interface code for the decompression half

+ * of the JPEG library.  These are the "standard" API routines that are

+ * used in the normal full-decompression case.  They are not used by a

+ * transcoding-only application.  Note that if an application links in

+ * jpeg_start_decompress, it will end up linking in the entire decompressor.

+ * We thus must separate this file from jdapimin.c to avoid linking the

+ * whole decompression library into a transcoder.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* Forward declarations */

+LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo));

+

+

+/*

+ * Decompression initialization.

+ * jpeg_read_header must be completed before calling this.

+ *

+ * If a multipass operating mode was selected, this will do all but the

+ * last pass, and thus may take a great deal of time.

+ *

+ * Returns FALSE if suspended.  The return value need be inspected only if

+ * a suspending data source is used.

+ */

+

+GLOBAL(boolean)

+jpeg_start_decompress (j_decompress_ptr cinfo)

+{

+  if (cinfo->global_state == DSTATE_READY) {

+    /* First call: initialize master control, select active modules */

+    jinit_master_decompress(cinfo);

+    if (cinfo->buffered_image) {

+      /* No more work here; expecting jpeg_start_output next */

+      cinfo->global_state = DSTATE_BUFIMAGE;

+      return TRUE;

+    }

+    cinfo->global_state = DSTATE_PRELOAD;

+  }

+  if (cinfo->global_state == DSTATE_PRELOAD) {

+    /* If file has multiple scans, absorb them all into the coef buffer */

+    if (cinfo->inputctl->has_multiple_scans) {

+#ifdef D_MULTISCAN_FILES_SUPPORTED

+      for (;;) {

+	int retcode;

+	/* Call progress monitor hook if present */

+	if (cinfo->progress != NULL)

+	  (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);

+	/* Absorb some more input */

+	retcode = (*cinfo->inputctl->consume_input) (cinfo);

+	if (retcode == JPEG_SUSPENDED)

+	  return FALSE;

+	if (retcode == JPEG_REACHED_EOI)

+	  break;

+	/* Advance progress counter if appropriate */

+	if (cinfo->progress != NULL &&

+	    (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {

+	  if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {

+	    /* jdmaster underestimated number of scans; ratchet up one scan */

+	    cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;

+	  }

+	}

+      }

+#else

+      ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif /* D_MULTISCAN_FILES_SUPPORTED */

+    }

+    cinfo->output_scan_number = cinfo->input_scan_number;

+  } else if (cinfo->global_state != DSTATE_PRESCAN)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  /* Perform any dummy output passes, and set up for the final pass */

+  return output_pass_setup(cinfo);

+}

+

+

+/*

+ * Set up for an output pass, and perform any dummy pass(es) needed.

+ * Common subroutine for jpeg_start_decompress and jpeg_start_output.

+ * Entry: global_state = DSTATE_PRESCAN only if previously suspended.

+ * Exit: If done, returns TRUE and sets global_state for proper output mode.

+ *       If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN.

+ */

+

+LOCAL(boolean)

+output_pass_setup (j_decompress_ptr cinfo)

+{

+  if (cinfo->global_state != DSTATE_PRESCAN) {

+    /* First call: do pass setup */

+    (*cinfo->master->prepare_for_output_pass) (cinfo);

+    cinfo->output_scanline = 0;

+    cinfo->global_state = DSTATE_PRESCAN;

+  }

+  /* Loop over any required dummy passes */

+  while (cinfo->master->is_dummy_pass) {

+#ifdef QUANT_2PASS_SUPPORTED

+    /* Crank through the dummy pass */

+    while (cinfo->output_scanline < cinfo->output_height) {

+      JDIMENSION last_scanline;

+      /* Call progress monitor hook if present */

+      if (cinfo->progress != NULL) {

+	cinfo->progress->pass_counter = (long) cinfo->output_scanline;

+	cinfo->progress->pass_limit = (long) cinfo->output_height;

+	(*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);

+      }

+      /* Process some data */

+      last_scanline = cinfo->output_scanline;

+      (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,

+				    &cinfo->output_scanline, (JDIMENSION) 0);

+      if (cinfo->output_scanline == last_scanline)

+	return FALSE;		/* No progress made, must suspend */

+    }

+    /* Finish up dummy pass, and set up for another one */

+    (*cinfo->master->finish_output_pass) (cinfo);

+    (*cinfo->master->prepare_for_output_pass) (cinfo);

+    cinfo->output_scanline = 0;

+#else

+    ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif /* QUANT_2PASS_SUPPORTED */

+  }

+  /* Ready for application to drive output pass through

+   * jpeg_read_scanlines or jpeg_read_raw_data.

+   */

+  cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING;

+  return TRUE;

+}

+

+

+/*

+ * Read some scanlines of data from the JPEG decompressor.

+ *

+ * The return value will be the number of lines actually read.

+ * This may be less than the number requested in several cases,

+ * including bottom of image, data source suspension, and operating

+ * modes that emit multiple scanlines at a time.

+ *

+ * Note: we warn about excess calls to jpeg_read_scanlines() since

+ * this likely signals an application programmer error.  However,

+ * an oversize buffer (max_lines > scanlines remaining) is not an error.

+ */

+

+GLOBAL(JDIMENSION)

+jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,

+		     JDIMENSION max_lines)

+{

+  JDIMENSION row_ctr;

+

+  if (cinfo->global_state != DSTATE_SCANNING)

+	  return 0; /* XYQ 2010-6-27: don't throw exception here */

+/*    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); */

+  if (cinfo->output_scanline >= cinfo->output_height) {

+    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);

+    return 0;

+  }

+

+  /* Call progress monitor hook if present */

+  if (cinfo->progress != NULL) {

+    cinfo->progress->pass_counter = (long) cinfo->output_scanline;

+    cinfo->progress->pass_limit = (long) cinfo->output_height;

+    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);

+  }

+

+  /* Process some data */

+  row_ctr = 0;

+  (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);

+  cinfo->output_scanline += row_ctr;

+  return row_ctr;

+}

+

+

+/*

+ * Alternate entry point to read raw data.

+ * Processes exactly one iMCU row per call, unless suspended.

+ */

+

+GLOBAL(JDIMENSION)

+jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,

+		    JDIMENSION max_lines)

+{

+  JDIMENSION lines_per_iMCU_row;

+

+  if (cinfo->global_state != DSTATE_RAW_OK)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  if (cinfo->output_scanline >= cinfo->output_height) {

+    WARNMS(cinfo, JWRN_TOO_MUCH_DATA);

+    return 0;

+  }

+

+  /* Call progress monitor hook if present */

+  if (cinfo->progress != NULL) {

+    cinfo->progress->pass_counter = (long) cinfo->output_scanline;

+    cinfo->progress->pass_limit = (long) cinfo->output_height;

+    (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);

+  }

+

+  /* Verify that at least one iMCU row can be returned. */

+  lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size;

+  if (max_lines < lines_per_iMCU_row)

+    ERREXIT(cinfo, JERR_BUFFER_SIZE);

+

+  /* Decompress directly into user's buffer. */

+  if (! (*cinfo->coef->decompress_data) (cinfo, data))

+    return 0;			/* suspension forced, can do nothing more */

+

+  /* OK, we processed one iMCU row. */

+  cinfo->output_scanline += lines_per_iMCU_row;

+  return lines_per_iMCU_row;

+}

+

+

+/* Additional entry points for buffered-image mode. */

+

+#ifdef D_MULTISCAN_FILES_SUPPORTED

+

+/*

+ * Initialize for an output pass in buffered-image mode.

+ */

+

+GLOBAL(boolean)

+jpeg_start_output (j_decompress_ptr cinfo, int scan_number)

+{

+  if (cinfo->global_state != DSTATE_BUFIMAGE &&

+      cinfo->global_state != DSTATE_PRESCAN)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  /* Limit scan number to valid range */

+  if (scan_number <= 0)

+    scan_number = 1;

+  if (cinfo->inputctl->eoi_reached &&

+      scan_number > cinfo->input_scan_number)

+    scan_number = cinfo->input_scan_number;

+  cinfo->output_scan_number = scan_number;

+  /* Perform any dummy output passes, and set up for the real pass */

+  return output_pass_setup(cinfo);

+}

+

+

+/*

+ * Finish up after an output pass in buffered-image mode.

+ *

+ * Returns FALSE if suspended.  The return value need be inspected only if

+ * a suspending data source is used.

+ */

+

+GLOBAL(boolean)

+jpeg_finish_output (j_decompress_ptr cinfo)

+{

+  if ((cinfo->global_state == DSTATE_SCANNING ||

+       cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) {

+    /* Terminate this pass. */

+    /* We do not require the whole pass to have been completed. */

+    (*cinfo->master->finish_output_pass) (cinfo);

+    cinfo->global_state = DSTATE_BUFPOST;

+  } else if (cinfo->global_state != DSTATE_BUFPOST) {

+    /* BUFPOST = repeat call after a suspension, anything else is error */

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  }

+  /* Read markers looking for SOS or EOI */

+  while (cinfo->input_scan_number <= cinfo->output_scan_number &&

+	 ! cinfo->inputctl->eoi_reached) {

+    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)

+      return FALSE;		/* Suspend, come back later */

+  }

+  cinfo->global_state = DSTATE_BUFIMAGE;

+  return TRUE;

+}

+

+#endif /* D_MULTISCAN_FILES_SUPPORTED */

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c b/core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c
new file mode 100644
index 0000000..89041f3
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c
@@ -0,0 +1,739 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdcoefct.c

+ *

+ * Copyright (C) 1994-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains the coefficient buffer controller for decompression.

+ * This controller is the top level of the JPEG decompressor proper.

+ * The coefficient buffer lies between entropy decoding and inverse-DCT steps.

+ *

+ * In buffered-image mode, this controller is the interface between

+ * input-oriented processing and output-oriented processing.

+ * Also, the input side (only) is used when reading a file for transcoding.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+/* Block smoothing is only applicable for progressive JPEG, so: */

+#ifndef D_PROGRESSIVE_SUPPORTED

+#undef BLOCK_SMOOTHING_SUPPORTED

+#endif

+

+/* Private buffer controller object */

+

+typedef struct {

+  struct jpeg_d_coef_controller pub; /* public fields */

+

+  /* These variables keep track of the current location of the input side. */

+  /* cinfo->input_iMCU_row is also used for this. */

+  JDIMENSION MCU_ctr;		/* counts MCUs processed in current row */

+  int MCU_vert_offset;		/* counts MCU rows within iMCU row */

+  int MCU_rows_per_iMCU_row;	/* number of such rows needed */

+

+  /* The output side's location is represented by cinfo->output_iMCU_row. */

+

+  /* In single-pass modes, it's sufficient to buffer just one MCU.

+   * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks,

+   * and let the entropy decoder write into that workspace each time.

+   * (On 80x86, the workspace is FAR even though it's not really very big;

+   * this is to keep the module interfaces unchanged when a large coefficient

+   * buffer is necessary.)

+   * In multi-pass modes, this array points to the current MCU's blocks

+   * within the virtual arrays; it is used only by the input side.

+   */

+  JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU];

+

+#ifdef D_MULTISCAN_FILES_SUPPORTED

+  /* In multi-pass modes, we need a virtual block array for each component. */

+  jvirt_barray_ptr whole_image[MAX_COMPONENTS];

+#endif

+

+#ifdef BLOCK_SMOOTHING_SUPPORTED

+  /* When doing block smoothing, we latch coefficient Al values here */

+  int * coef_bits_latch;

+#define SAVED_COEFS  6		/* we save coef_bits[0..5] */

+#endif

+} my_coef_controller;

+

+typedef my_coef_controller * my_coef_ptr;

+

+/* Forward declarations */

+METHODDEF(int) decompress_onepass

+	JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));

+#ifdef D_MULTISCAN_FILES_SUPPORTED

+METHODDEF(int) decompress_data

+	JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));

+#endif

+#ifdef BLOCK_SMOOTHING_SUPPORTED

+LOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo));

+METHODDEF(int) decompress_smooth_data

+	JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));

+#endif

+

+

+LOCAL(void)

+start_iMCU_row (j_decompress_ptr cinfo)

+/* Reset within-iMCU-row counters for a new row (input side) */

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+

+  /* In an interleaved scan, an MCU row is the same as an iMCU row.

+   * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.

+   * But at the bottom of the image, process only what's left.

+   */

+  if (cinfo->comps_in_scan > 1) {

+    coef->MCU_rows_per_iMCU_row = 1;

+  } else {

+    if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1))

+      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;

+    else

+      coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;

+  }

+

+  coef->MCU_ctr = 0;

+  coef->MCU_vert_offset = 0;

+}

+

+

+/*

+ * Initialize for an input processing pass.

+ */

+

+METHODDEF(void)

+start_input_pass (j_decompress_ptr cinfo)

+{

+  cinfo->input_iMCU_row = 0;

+  start_iMCU_row(cinfo);

+}

+

+

+/*

+ * Initialize for an output processing pass.

+ */

+

+METHODDEF(void)

+start_output_pass (j_decompress_ptr cinfo)

+{

+#ifdef BLOCK_SMOOTHING_SUPPORTED

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+

+  /* If multipass, check to see whether to use block smoothing on this pass */

+  if (coef->pub.coef_arrays != NULL) {

+    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))

+      coef->pub.decompress_data = decompress_smooth_data;

+    else

+      coef->pub.decompress_data = decompress_data;

+  }

+#endif

+  cinfo->output_iMCU_row = 0;

+}

+

+

+/*

+ * Decompress and return some data in the single-pass case.

+ * Always attempts to emit one fully interleaved MCU row ("iMCU" row).

+ * Input and output must run in lockstep since we have only a one-MCU buffer.

+ * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.

+ *

+ * NB: output_buf contains a plane for each component in image,

+ * which we index according to the component's SOF position.

+ */

+

+METHODDEF(int)

+decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+  JDIMENSION MCU_col_num;	/* index of current MCU within row */

+  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;

+  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;

+  int blkn, ci, xindex, yindex, yoffset, useful_width;

+  JSAMPARRAY output_ptr;

+  JDIMENSION start_col, output_col;

+  jpeg_component_info *compptr;

+  inverse_DCT_method_ptr inverse_DCT;

+

+  /* Loop to process as much as one whole iMCU row */

+  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;

+       yoffset++) {

+    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;

+	 MCU_col_num++) {

+      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */

+      jzero_far((void FAR *) coef->MCU_buffer[0],

+		(size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));

+      if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {

+	/* Suspension forced; update state counters and exit */

+	coef->MCU_vert_offset = yoffset;

+	coef->MCU_ctr = MCU_col_num;

+	return JPEG_SUSPENDED;

+      }

+      /* Determine where data should go in output_buf and do the IDCT thing.

+       * We skip dummy blocks at the right and bottom edges (but blkn gets

+       * incremented past them!).  Note the inner loop relies on having

+       * allocated the MCU_buffer[] blocks sequentially.

+       */

+      blkn = 0;			/* index of current DCT block within MCU */

+      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+	compptr = cinfo->cur_comp_info[ci];

+	/* Don't bother to IDCT an uninteresting component. */

+	if (! compptr->component_needed) {

+	  blkn += compptr->MCU_blocks;

+	  continue;

+	}

+	inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];

+	useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width

+						    : compptr->last_col_width;

+	output_ptr = output_buf[compptr->component_index] +

+	  yoffset * compptr->DCT_scaled_size;

+	start_col = MCU_col_num * compptr->MCU_sample_width;

+	for (yindex = 0; yindex < compptr->MCU_height; yindex++) {

+	  if (cinfo->input_iMCU_row < last_iMCU_row ||

+	      yoffset+yindex < compptr->last_row_height) {

+	    output_col = start_col;

+	    for (xindex = 0; xindex < useful_width; xindex++) {

+	      (*inverse_DCT) (cinfo, compptr,

+			      (JCOEFPTR) coef->MCU_buffer[blkn+xindex],

+			      output_ptr, output_col);

+	      output_col += compptr->DCT_scaled_size;

+	    }

+	  }

+	  blkn += compptr->MCU_width;

+	  output_ptr += compptr->DCT_scaled_size;

+	}

+      }

+    }

+    /* Completed an MCU row, but perhaps not an iMCU row */

+    coef->MCU_ctr = 0;

+  }

+  /* Completed the iMCU row, advance counters for next one */

+  cinfo->output_iMCU_row++;

+  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {

+    start_iMCU_row(cinfo);

+    return JPEG_ROW_COMPLETED;

+  }

+  /* Completed the scan */

+  (*cinfo->inputctl->finish_input_pass) (cinfo);

+  return JPEG_SCAN_COMPLETED;

+}

+

+

+/*

+ * Dummy consume-input routine for single-pass operation.

+ */

+

+METHODDEF(int)

+dummy_consume_data (j_decompress_ptr cinfo)

+{

+  return JPEG_SUSPENDED;	/* Always indicate nothing was done */

+}

+

+

+#ifdef D_MULTISCAN_FILES_SUPPORTED

+

+/*

+ * Consume input data and store it in the full-image coefficient buffer.

+ * We read as much as one fully interleaved MCU row ("iMCU" row) per call,

+ * ie, v_samp_factor block rows for each component in the scan.

+ * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.

+ */

+

+METHODDEF(int)

+consume_data (j_decompress_ptr cinfo)

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+  JDIMENSION MCU_col_num;	/* index of current MCU within row */

+  int blkn, ci, xindex, yindex, yoffset;

+  JDIMENSION start_col;

+  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];

+  JBLOCKROW buffer_ptr;

+  jpeg_component_info *compptr;

+

+  /* Align the virtual buffers for the components used in this scan. */

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+    compptr = cinfo->cur_comp_info[ci];

+    buffer[ci] = (*cinfo->mem->access_virt_barray)

+      ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],

+       cinfo->input_iMCU_row * compptr->v_samp_factor,

+       (JDIMENSION) compptr->v_samp_factor, TRUE);

+    /* Note: entropy decoder expects buffer to be zeroed,

+     * but this is handled automatically by the memory manager

+     * because we requested a pre-zeroed array.

+     */

+  }

+

+  /* Loop to process one whole iMCU row */

+  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;

+       yoffset++) {

+    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;

+	 MCU_col_num++) {

+      /* Construct list of pointers to DCT blocks belonging to this MCU */

+      blkn = 0;			/* index of current DCT block within MCU */

+      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+	compptr = cinfo->cur_comp_info[ci];

+	start_col = MCU_col_num * compptr->MCU_width;

+	for (yindex = 0; yindex < compptr->MCU_height; yindex++) {

+	  buffer_ptr = buffer[ci][yindex+yoffset] + start_col;

+	  for (xindex = 0; xindex < compptr->MCU_width; xindex++) {

+	    coef->MCU_buffer[blkn++] = buffer_ptr++;

+	  }

+	}

+      }

+      /* Try to fetch the MCU. */

+      if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {

+	/* Suspension forced; update state counters and exit */

+	coef->MCU_vert_offset = yoffset;

+	coef->MCU_ctr = MCU_col_num;

+	return JPEG_SUSPENDED;

+      }

+    }

+    /* Completed an MCU row, but perhaps not an iMCU row */

+    coef->MCU_ctr = 0;

+  }

+  /* Completed the iMCU row, advance counters for next one */

+  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {

+    start_iMCU_row(cinfo);

+    return JPEG_ROW_COMPLETED;

+  }

+  /* Completed the scan */

+  (*cinfo->inputctl->finish_input_pass) (cinfo);

+  return JPEG_SCAN_COMPLETED;

+}

+

+

+/*

+ * Decompress and return some data in the multi-pass case.

+ * Always attempts to emit one fully interleaved MCU row ("iMCU" row).

+ * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.

+ *

+ * NB: output_buf contains a plane for each component in image.

+ */

+

+METHODDEF(int)

+decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;

+  JDIMENSION block_num;

+  int ci, block_row, block_rows;

+  JBLOCKARRAY buffer;

+  JBLOCKROW buffer_ptr;

+  JSAMPARRAY output_ptr;

+  JDIMENSION output_col;

+  jpeg_component_info *compptr;

+  inverse_DCT_method_ptr inverse_DCT;

+

+  /* Force some input to be done if we are getting ahead of the input. */

+  while (cinfo->input_scan_number < cinfo->output_scan_number ||

+	 (cinfo->input_scan_number == cinfo->output_scan_number &&

+	  cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {

+    if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)

+      return JPEG_SUSPENDED;

+  }

+

+  /* OK, output from the virtual arrays. */

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    /* Don't bother to IDCT an uninteresting component. */

+    if (! compptr->component_needed)

+      continue;

+    /* Align the virtual buffer for this component. */

+    buffer = (*cinfo->mem->access_virt_barray)

+      ((j_common_ptr) cinfo, coef->whole_image[ci],

+       cinfo->output_iMCU_row * compptr->v_samp_factor,

+       (JDIMENSION) compptr->v_samp_factor, FALSE);

+    /* Count non-dummy DCT block rows in this iMCU row. */

+    if (cinfo->output_iMCU_row < last_iMCU_row)

+      block_rows = compptr->v_samp_factor;

+    else {

+      /* NB: can't use last_row_height here; it is input-side-dependent! */

+      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);

+      if (block_rows == 0) block_rows = compptr->v_samp_factor;

+    }

+    inverse_DCT = cinfo->idct->inverse_DCT[ci];

+    output_ptr = output_buf[ci];

+    /* Loop over all DCT blocks to be processed. */

+    for (block_row = 0; block_row < block_rows; block_row++) {

+      buffer_ptr = buffer[block_row];

+      output_col = 0;

+      for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) {

+	(*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr,

+			output_ptr, output_col);

+	buffer_ptr++;

+	output_col += compptr->DCT_scaled_size;

+      }

+      output_ptr += compptr->DCT_scaled_size;

+    }

+  }

+

+  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)

+    return JPEG_ROW_COMPLETED;

+  return JPEG_SCAN_COMPLETED;

+}

+

+#endif /* D_MULTISCAN_FILES_SUPPORTED */

+

+

+#ifdef BLOCK_SMOOTHING_SUPPORTED

+

+/*

+ * This code applies interblock smoothing as described by section K.8

+ * of the JPEG standard: the first 5 AC coefficients are estimated from

+ * the DC values of a DCT block and its 8 neighboring blocks.

+ * We apply smoothing only for progressive JPEG decoding, and only if

+ * the coefficients it can estimate are not yet known to full precision.

+ */

+

+/* Natural-order array positions of the first 5 zigzag-order coefficients */

+#define Q01_POS  1

+#define Q10_POS  8

+#define Q20_POS  16

+#define Q11_POS  9

+#define Q02_POS  2

+

+/*

+ * Determine whether block smoothing is applicable and safe.

+ * We also latch the current states of the coef_bits[] entries for the

+ * AC coefficients; otherwise, if the input side of the decompressor

+ * advances into a new scan, we might think the coefficients are known

+ * more accurately than they really are.

+ */

+

+LOCAL(boolean)

+smoothing_ok (j_decompress_ptr cinfo)

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+  boolean smoothing_useful = FALSE;

+  int ci, coefi;

+  jpeg_component_info *compptr;

+  JQUANT_TBL * qtable;

+  int * coef_bits;

+  int * coef_bits_latch;

+

+  if (! cinfo->progressive_mode || cinfo->coef_bits == NULL)

+    return FALSE;

+

+  /* Allocate latch area if not already done */

+  if (coef->coef_bits_latch == NULL)

+    coef->coef_bits_latch = (int *)

+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				  cinfo->num_components *

+				  (SAVED_COEFS * SIZEOF(int)));

+  coef_bits_latch = coef->coef_bits_latch;

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    /* All components' quantization values must already be latched. */

+    if ((qtable = compptr->quant_table) == NULL)

+      return FALSE;

+    /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */

+    if (qtable->quantval[0] == 0 ||

+	qtable->quantval[Q01_POS] == 0 ||

+	qtable->quantval[Q10_POS] == 0 ||

+	qtable->quantval[Q20_POS] == 0 ||

+	qtable->quantval[Q11_POS] == 0 ||

+	qtable->quantval[Q02_POS] == 0)

+      return FALSE;

+    /* DC values must be at least partly known for all components. */

+    coef_bits = cinfo->coef_bits[ci];

+    if (coef_bits[0] < 0)

+      return FALSE;

+    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */

+    for (coefi = 1; coefi <= 5; coefi++) {

+      coef_bits_latch[coefi] = coef_bits[coefi];

+      if (coef_bits[coefi] != 0)

+	smoothing_useful = TRUE;

+    }

+    coef_bits_latch += SAVED_COEFS;

+  }

+

+  return smoothing_useful;

+}

+

+

+/*

+ * Variant of decompress_data for use when doing block smoothing.

+ */

+

+METHODDEF(int)

+decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)

+{

+  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;

+  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;

+  JDIMENSION block_num, last_block_column;

+  int ci, block_row, block_rows, access_rows;

+  JBLOCKARRAY buffer;

+  JBLOCKROW buffer_ptr, prev_block_row, next_block_row;

+  JSAMPARRAY output_ptr;

+  JDIMENSION output_col;

+  jpeg_component_info *compptr;

+  inverse_DCT_method_ptr inverse_DCT;

+  boolean first_row, last_row;

+  JBLOCK workspace;

+  int *coef_bits;

+  JQUANT_TBL *quanttbl;

+  INT32 Q00,Q01,Q02,Q10,Q11,Q20, num;

+  int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9;

+  int Al, pred;

+

+  /* Force some input to be done if we are getting ahead of the input. */

+  while (cinfo->input_scan_number <= cinfo->output_scan_number &&

+	 ! cinfo->inputctl->eoi_reached) {

+    if (cinfo->input_scan_number == cinfo->output_scan_number) {

+      /* If input is working on current scan, we ordinarily want it to

+       * have completed the current row.  But if input scan is DC,

+       * we want it to keep one row ahead so that next block row's DC

+       * values are up to date.

+       */

+      JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0;

+      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta)

+	break;

+    }

+    if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)

+      return JPEG_SUSPENDED;

+  }

+

+  /* OK, output from the virtual arrays. */

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    /* Don't bother to IDCT an uninteresting component. */

+    if (! compptr->component_needed)

+      continue;

+    /* Count non-dummy DCT block rows in this iMCU row. */

+    if (cinfo->output_iMCU_row < last_iMCU_row) {

+      block_rows = compptr->v_samp_factor;

+      access_rows = block_rows * 2; /* this and next iMCU row */

+      last_row = FALSE;

+    } else {

+      /* NB: can't use last_row_height here; it is input-side-dependent! */

+      block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);

+      if (block_rows == 0) block_rows = compptr->v_samp_factor;

+      access_rows = block_rows; /* this iMCU row only */

+      last_row = TRUE;

+    }

+    /* Align the virtual buffer for this component. */

+    if (cinfo->output_iMCU_row > 0) {

+      access_rows += compptr->v_samp_factor; /* prior iMCU row too */

+      buffer = (*cinfo->mem->access_virt_barray)

+	((j_common_ptr) cinfo, coef->whole_image[ci],

+	 (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,

+	 (JDIMENSION) access_rows, FALSE);

+      buffer += compptr->v_samp_factor;	/* point to current iMCU row */

+      first_row = FALSE;

+    } else {

+      buffer = (*cinfo->mem->access_virt_barray)

+	((j_common_ptr) cinfo, coef->whole_image[ci],

+	 (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE);

+      first_row = TRUE;

+    }

+    /* Fetch component-dependent info */

+    coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);

+    quanttbl = compptr->quant_table;

+    Q00 = quanttbl->quantval[0];

+    Q01 = quanttbl->quantval[Q01_POS];

+    Q10 = quanttbl->quantval[Q10_POS];

+    Q20 = quanttbl->quantval[Q20_POS];

+    Q11 = quanttbl->quantval[Q11_POS];

+    Q02 = quanttbl->quantval[Q02_POS];

+    inverse_DCT = cinfo->idct->inverse_DCT[ci];

+    output_ptr = output_buf[ci];

+    /* Loop over all DCT blocks to be processed. */

+    for (block_row = 0; block_row < block_rows; block_row++) {

+      buffer_ptr = buffer[block_row];

+      if (first_row && block_row == 0)

+	prev_block_row = buffer_ptr;

+      else

+	prev_block_row = buffer[block_row-1];

+      if (last_row && block_row == block_rows-1)

+	next_block_row = buffer_ptr;

+      else

+	next_block_row = buffer[block_row+1];

+      /* We fetch the surrounding DC values using a sliding-register approach.

+       * Initialize all nine here so as to do the right thing on narrow pics.

+       */

+      DC1 = DC2 = DC3 = (int) prev_block_row[0][0];

+      DC4 = DC5 = DC6 = (int) buffer_ptr[0][0];

+      DC7 = DC8 = DC9 = (int) next_block_row[0][0];

+      output_col = 0;

+      last_block_column = compptr->width_in_blocks - 1;

+      for (block_num = 0; block_num <= last_block_column; block_num++) {

+	/* Fetch current DCT block into workspace so we can modify it. */

+	jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1);

+	/* Update DC values */

+	if (block_num < last_block_column) {

+	  DC3 = (int) prev_block_row[1][0];

+	  DC6 = (int) buffer_ptr[1][0];

+	  DC9 = (int) next_block_row[1][0];

+	}

+	/* Compute coefficient estimates per K.8.

+	 * An estimate is applied only if coefficient is still zero,

+	 * and is not known to be fully accurate.

+	 */

+	/* AC01 */

+	if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) {

+	  num = 36 * Q00 * (DC4 - DC6);

+	  if (num >= 0) {

+	    pred = (int) (((Q01<<7) + num) / (Q01<<8));

+	    if (Al > 0 && pred >= (1<<Al))

+	      pred = (1<<Al)-1;

+	  } else {

+	    pred = (int) (((Q01<<7) - num) / (Q01<<8));

+	    if (Al > 0 && pred >= (1<<Al))

+	      pred = (1<<Al)-1;

+	    pred = -pred;

+	  }

+	  workspace[1] = (JCOEF) pred;

+	}

+	/* AC10 */

+	if ((Al=coef_bits[2]) != 0 && workspace[8] == 0) {

+	  num = 36 * Q00 * (DC2 - DC8);

+	  if (num >= 0) {

+	    pred = (int) (((Q10<<7) + num) / (Q10<<8));

+	    if (Al > 0 && pred >= (1<<Al))

+	      pred = (1<<Al)-1;

+	  } else {

+	    pred = (int) (((Q10<<7) - num) / (Q10<<8));

+	    if (Al > 0 && pred >= (1<<Al))

+	      pred = (1<<Al)-1;

+	    pred = -pred;

+	  }

+	  workspace[8] = (JCOEF) pred;

+	}

+	/* AC20 */

+	if ((Al=coef_bits[3]) != 0 && workspace[16] == 0) {

+	  num = 9 * Q00 * (DC2 + DC8 - 2*DC5);

+	  if (num >= 0) {

+	    pred = (int) (((Q20<<7) + num) / (Q20<<8));

+	    if (Al > 0 && pred >= (1<<Al))

+	      pred = (1<<Al)-1;

+	  } else {

+	    pred = (int) (((Q20<<7) - num) / (Q20<<8));

+	    if (Al > 0 && pred >= (1<<Al))

+	      pred = (1<<Al)-1;

+	    pred = -pred;

+	  }

+	  workspace[16] = (JCOEF) pred;

+	}

+	/* AC11 */

+	if ((Al=coef_bits[4]) != 0 && workspace[9] == 0) {

+	  num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9);

+	  if (num >= 0) {

+	    pred = (int) (((Q11<<7) + num) / (Q11<<8));

+	    if (Al > 0 && pred >= (1<<Al))

+	      pred = (1<<Al)-1;

+	  } else {

+	    pred = (int) (((Q11<<7) - num) / (Q11<<8));

+	    if (Al > 0 && pred >= (1<<Al))

+	      pred = (1<<Al)-1;

+	    pred = -pred;

+	  }

+	  workspace[9] = (JCOEF) pred;

+	}

+	/* AC02 */

+	if ((Al=coef_bits[5]) != 0 && workspace[2] == 0) {

+	  num = 9 * Q00 * (DC4 + DC6 - 2*DC5);

+	  if (num >= 0) {

+	    pred = (int) (((Q02<<7) + num) / (Q02<<8));

+	    if (Al > 0 && pred >= (1<<Al))

+	      pred = (1<<Al)-1;

+	  } else {

+	    pred = (int) (((Q02<<7) - num) / (Q02<<8));

+	    if (Al > 0 && pred >= (1<<Al))

+	      pred = (1<<Al)-1;

+	    pred = -pred;

+	  }

+	  workspace[2] = (JCOEF) pred;

+	}

+	/* OK, do the IDCT */

+	(*inverse_DCT) (cinfo, compptr, (JCOEFPTR) workspace,

+			output_ptr, output_col);

+	/* Advance for next column */

+	DC1 = DC2; DC2 = DC3;

+	DC4 = DC5; DC5 = DC6;

+	DC7 = DC8; DC8 = DC9;

+	buffer_ptr++, prev_block_row++, next_block_row++;

+	output_col += compptr->DCT_scaled_size;

+      }

+      output_ptr += compptr->DCT_scaled_size;

+    }

+  }

+

+  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)

+    return JPEG_ROW_COMPLETED;

+  return JPEG_SCAN_COMPLETED;

+}

+

+#endif /* BLOCK_SMOOTHING_SUPPORTED */

+

+

+/*

+ * Initialize coefficient buffer controller.

+ */

+

+GLOBAL(void)

+jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)

+{

+  my_coef_ptr coef;

+

+  coef = (my_coef_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_coef_controller));

+  cinfo->coef = (struct jpeg_d_coef_controller *) coef;

+  coef->pub.start_input_pass = start_input_pass;

+  coef->pub.start_output_pass = start_output_pass;

+#ifdef BLOCK_SMOOTHING_SUPPORTED

+  coef->coef_bits_latch = NULL;

+#endif

+

+  /* Create the coefficient buffer. */

+  if (need_full_buffer) {

+#ifdef D_MULTISCAN_FILES_SUPPORTED

+    /* Allocate a full-image virtual array for each component, */

+    /* padded to a multiple of samp_factor DCT blocks in each direction. */

+    /* Note we ask for a pre-zeroed array. */

+    int ci, access_rows;

+    jpeg_component_info *compptr;

+

+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+	 ci++, compptr++) {

+      access_rows = compptr->v_samp_factor;

+#ifdef BLOCK_SMOOTHING_SUPPORTED

+      /* If block smoothing could be used, need a bigger window */

+      if (cinfo->progressive_mode)

+	access_rows *= 3;

+#endif

+      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)

+	((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE,

+	 (JDIMENSION) jround_up((long) compptr->width_in_blocks,

+				(long) compptr->h_samp_factor),

+	 (JDIMENSION) jround_up((long) compptr->height_in_blocks,

+				(long) compptr->v_samp_factor),

+	 (JDIMENSION) access_rows);

+    }

+    coef->pub.consume_data = consume_data;

+    coef->pub.decompress_data = decompress_data;

+    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */

+#else

+    ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif

+  } else {

+    /* We only need a single-MCU buffer. */

+    JBLOCKROW buffer;

+    int i;

+

+    buffer = (JBLOCKROW)

+      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				  D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));

+    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {

+      coef->MCU_buffer[i] = buffer + i;

+    }

+    coef->pub.consume_data = dummy_consume_data;

+    coef->pub.decompress_data = decompress_onepass;

+    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c b/core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c
new file mode 100644
index 0000000..5cd35f5
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c
@@ -0,0 +1,399 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdcolor.c

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains output colorspace conversion routines.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* Private subobject */

+

+typedef struct {

+  struct jpeg_color_deconverter pub; /* public fields */

+

+  /* Private state for YCC->RGB conversion */

+  int * Cr_r_tab;		/* => table for Cr to R conversion */

+  int * Cb_b_tab;		/* => table for Cb to B conversion */

+  INT32 * Cr_g_tab;		/* => table for Cr to G conversion */

+  INT32 * Cb_g_tab;		/* => table for Cb to G conversion */

+} my_color_deconverter;

+

+typedef my_color_deconverter * my_cconvert_ptr;

+

+

+/**************** YCbCr -> RGB conversion: most common case **************/

+

+/*

+ * YCbCr is defined per CCIR 601-1, except that Cb and Cr are

+ * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.

+ * The conversion equations to be implemented are therefore

+ *	R = Y                + 1.40200 * Cr

+ *	G = Y - 0.34414 * Cb - 0.71414 * Cr

+ *	B = Y + 1.77200 * Cb

+ * where Cb and Cr represent the incoming values less CENTERJSAMPLE.

+ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)

+ *

+ * To avoid floating-point arithmetic, we represent the fractional constants

+ * as integers scaled up by 2^16 (about 4 digits precision); we have to divide

+ * the products by 2^16, with appropriate rounding, to get the correct answer.

+ * Notice that Y, being an integral input, does not contribute any fraction

+ * so it need not participate in the rounding.

+ *

+ * For even more speed, we avoid doing any multiplications in the inner loop

+ * by precalculating the constants times Cb and Cr for all possible values.

+ * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);

+ * for 12-bit samples it is still acceptable.  It's not very reasonable for

+ * 16-bit samples, but if you want lossless storage you shouldn't be changing

+ * colorspace anyway.

+ * The Cr=>R and Cb=>B values can be rounded to integers in advance; the

+ * values for the G calculation are left scaled up, since we must add them

+ * together before rounding.

+ */

+

+#define SCALEBITS	16	/* speediest right-shift on some machines */

+#define ONE_HALF	((INT32) 1 << (SCALEBITS-1))

+#define FIX(x)		((INT32) ((x) * (1L<<SCALEBITS) + 0.5))

+

+

+/*

+ * Initialize tables for YCC->RGB colorspace conversion.

+ */

+

+LOCAL(void)

+build_ycc_rgb_table (j_decompress_ptr cinfo)

+{

+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;

+  int i;

+  INT32 x;

+  SHIFT_TEMPS

+

+  cconvert->Cr_r_tab = (int *)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				(MAXJSAMPLE+1) * SIZEOF(int));

+  cconvert->Cb_b_tab = (int *)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				(MAXJSAMPLE+1) * SIZEOF(int));

+  cconvert->Cr_g_tab = (INT32 *)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				(MAXJSAMPLE+1) * SIZEOF(INT32));

+  cconvert->Cb_g_tab = (INT32 *)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				(MAXJSAMPLE+1) * SIZEOF(INT32));

+

+  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {

+    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */

+    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */

+    /* Cr=>R value is nearest int to 1.40200 * x */

+    cconvert->Cr_r_tab[i] = (int)

+		    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);

+    /* Cb=>B value is nearest int to 1.77200 * x */

+    cconvert->Cb_b_tab[i] = (int)

+		    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);

+    /* Cr=>G value is scaled-up -0.71414 * x */

+    cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x;

+    /* Cb=>G value is scaled-up -0.34414 * x */

+    /* We also add in ONE_HALF so that need not do it in inner loop */

+    cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;

+  }

+}

+

+

+/*

+ * Convert some rows of samples to the output colorspace.

+ *

+ * Note that we change from noninterleaved, one-plane-per-component format

+ * to interleaved-pixel format.  The output buffer is therefore three times

+ * as wide as the input buffer.

+ * A starting row offset is provided only for the input buffer.  The caller

+ * can easily adjust the passed output_buf value to accommodate any row

+ * offset required on that side.

+ */

+

+METHODDEF(void)

+ycc_rgb_convert (j_decompress_ptr cinfo,

+		 JSAMPIMAGE input_buf, JDIMENSION input_row,

+		 JSAMPARRAY output_buf, int num_rows)

+{

+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;

+  register int y, cb, cr;

+  register JSAMPROW outptr;

+  register JSAMPROW inptr0, inptr1, inptr2;

+  register JDIMENSION col;

+  JDIMENSION num_cols = cinfo->output_width;

+  /* copy these pointers into registers if possible */

+  register JSAMPLE * range_limit = cinfo->sample_range_limit;

+  register int * Crrtab = cconvert->Cr_r_tab;

+  register int * Cbbtab = cconvert->Cb_b_tab;

+  register INT32 * Crgtab = cconvert->Cr_g_tab;

+  register INT32 * Cbgtab = cconvert->Cb_g_tab;

+  SHIFT_TEMPS

+

+  while (--num_rows >= 0) {

+    inptr0 = input_buf[0][input_row];

+    inptr1 = input_buf[1][input_row];

+    inptr2 = input_buf[2][input_row];

+    input_row++;

+    outptr = *output_buf++;

+    for (col = 0; col < num_cols; col++) {

+      y  = GETJSAMPLE(inptr0[col]);

+      cb = GETJSAMPLE(inptr1[col]);

+      cr = GETJSAMPLE(inptr2[col]);

+      /* Range-limiting is essential due to noise introduced by DCT losses. */

+      outptr[RGB_RED] =   range_limit[y + Crrtab[cr]];

+      outptr[RGB_GREEN] = range_limit[y +

+			      ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],

+						 SCALEBITS))];

+      outptr[RGB_BLUE] =  range_limit[y + Cbbtab[cb]];

+      outptr += RGB_PIXELSIZE;

+    }

+  }

+}

+

+

+/**************** Cases other than YCbCr -> RGB **************/

+

+

+/*

+ * Color conversion for no colorspace change: just copy the data,

+ * converting from separate-planes to interleaved representation.

+ */

+

+METHODDEF(void)

+null_convert (j_decompress_ptr cinfo,

+	      JSAMPIMAGE input_buf, JDIMENSION input_row,

+	      JSAMPARRAY output_buf, int num_rows)

+{

+  register JSAMPROW inptr, outptr;

+  register JDIMENSION count;

+  register int num_components = cinfo->num_components;

+  JDIMENSION num_cols = cinfo->output_width;

+  int ci;

+

+  while (--num_rows >= 0) {

+    for (ci = 0; ci < num_components; ci++) {

+      inptr = input_buf[ci][input_row];

+      outptr = output_buf[0] + ci;

+      for (count = num_cols; count > 0; count--) {

+	*outptr = *inptr++;	/* needn't bother with GETJSAMPLE() here */

+	outptr += num_components;

+      }

+    }

+    input_row++;

+    output_buf++;

+  }

+}

+

+

+/*

+ * Color conversion for grayscale: just copy the data.

+ * This also works for YCbCr -> grayscale conversion, in which

+ * we just copy the Y (luminance) component and ignore chrominance.

+ */

+

+METHODDEF(void)

+grayscale_convert (j_decompress_ptr cinfo,

+		   JSAMPIMAGE input_buf, JDIMENSION input_row,

+		   JSAMPARRAY output_buf, int num_rows)

+{

+  jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0,

+		    num_rows, cinfo->output_width);

+}

+

+

+/*

+ * Convert grayscale to RGB: just duplicate the graylevel three times.

+ * This is provided to support applications that don't want to cope

+ * with grayscale as a separate case.

+ */

+

+METHODDEF(void)

+gray_rgb_convert (j_decompress_ptr cinfo,

+		  JSAMPIMAGE input_buf, JDIMENSION input_row,

+		  JSAMPARRAY output_buf, int num_rows)

+{

+  register JSAMPROW inptr, outptr;

+  register JDIMENSION col;

+  JDIMENSION num_cols = cinfo->output_width;

+

+  while (--num_rows >= 0) {

+    inptr = input_buf[0][input_row++];

+    outptr = *output_buf++;

+    for (col = 0; col < num_cols; col++) {

+      /* We can dispense with GETJSAMPLE() here */

+      outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];

+      outptr += RGB_PIXELSIZE;

+    }

+  }

+}

+

+

+/*

+ * Adobe-style YCCK->CMYK conversion.

+ * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same

+ * conversion as above, while passing K (black) unchanged.

+ * We assume build_ycc_rgb_table has been called.

+ */

+

+METHODDEF(void)

+ycck_cmyk_convert (j_decompress_ptr cinfo,

+		   JSAMPIMAGE input_buf, JDIMENSION input_row,

+		   JSAMPARRAY output_buf, int num_rows)

+{

+  my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;

+  register int y, cb, cr;

+  register JSAMPROW outptr;

+  register JSAMPROW inptr0, inptr1, inptr2, inptr3;

+  register JDIMENSION col;

+  JDIMENSION num_cols = cinfo->output_width;

+  /* copy these pointers into registers if possible */

+  register JSAMPLE * range_limit = cinfo->sample_range_limit;

+  register int * Crrtab = cconvert->Cr_r_tab;

+  register int * Cbbtab = cconvert->Cb_b_tab;

+  register INT32 * Crgtab = cconvert->Cr_g_tab;

+  register INT32 * Cbgtab = cconvert->Cb_g_tab;

+  SHIFT_TEMPS

+

+  while (--num_rows >= 0) {

+    inptr0 = input_buf[0][input_row];

+    inptr1 = input_buf[1][input_row];

+    inptr2 = input_buf[2][input_row];

+    inptr3 = input_buf[3][input_row];

+    input_row++;

+    outptr = *output_buf++;

+    for (col = 0; col < num_cols; col++) {

+      y  = GETJSAMPLE(inptr0[col]);

+      cb = GETJSAMPLE(inptr1[col]);

+      cr = GETJSAMPLE(inptr2[col]);

+      /* Range-limiting is essential due to noise introduced by DCT losses. */

+      outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])];	/* red */

+      outptr[1] = range_limit[MAXJSAMPLE - (y +			/* green */

+			      ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],

+						 SCALEBITS)))];

+      outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])];	/* blue */

+      /* K passes through unchanged */

+      outptr[3] = inptr3[col];	/* don't need GETJSAMPLE here */

+      outptr += 4;

+    }

+  }

+}

+

+

+/*

+ * Empty method for start_pass.

+ */

+

+METHODDEF(void)

+start_pass_dcolor (j_decompress_ptr cinfo)

+{

+  /* no work needed */

+}

+

+

+/*

+ * Module initialization routine for output colorspace conversion.

+ */

+

+GLOBAL(void)

+jinit_color_deconverter (j_decompress_ptr cinfo)

+{

+  my_cconvert_ptr cconvert;

+  int ci;

+

+  cconvert = (my_cconvert_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_color_deconverter));

+  cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert;

+  cconvert->pub.start_pass = start_pass_dcolor;

+

+  /* Make sure num_components agrees with jpeg_color_space */

+  switch (cinfo->jpeg_color_space) {

+  case JCS_GRAYSCALE:

+    if (cinfo->num_components != 1)

+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);

+    break;

+

+  case JCS_RGB:

+  case JCS_YCbCr:

+    if (cinfo->num_components != 3)

+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);

+    break;

+

+  case JCS_CMYK:

+  case JCS_YCCK:

+    if (cinfo->num_components != 4)

+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);

+    break;

+

+  default:			/* JCS_UNKNOWN can be anything */

+    if (cinfo->num_components < 1)

+      ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);

+    break;

+  }

+

+  /* Set out_color_components and conversion method based on requested space.

+   * Also clear the component_needed flags for any unused components,

+   * so that earlier pipeline stages can avoid useless computation.

+   */

+

+  switch (cinfo->out_color_space) {

+  case JCS_GRAYSCALE:

+    cinfo->out_color_components = 1;

+    if (cinfo->jpeg_color_space == JCS_GRAYSCALE ||

+	cinfo->jpeg_color_space == JCS_YCbCr) {

+      cconvert->pub.color_convert = grayscale_convert;

+      /* For color->grayscale conversion, only the Y (0) component is needed */

+      for (ci = 1; ci < cinfo->num_components; ci++)

+	cinfo->comp_info[ci].component_needed = FALSE;

+    } else

+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);

+    break;

+

+  case JCS_RGB:

+    cinfo->out_color_components = RGB_PIXELSIZE;

+    if (cinfo->jpeg_color_space == JCS_YCbCr) {

+      cconvert->pub.color_convert = ycc_rgb_convert;

+      build_ycc_rgb_table(cinfo);

+    } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {

+      cconvert->pub.color_convert = gray_rgb_convert;

+    } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) {

+      cconvert->pub.color_convert = null_convert;

+    } else

+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);

+    break;

+

+  case JCS_CMYK:

+    cinfo->out_color_components = 4;

+    if (cinfo->jpeg_color_space == JCS_YCCK) {

+      cconvert->pub.color_convert = ycck_cmyk_convert;

+      build_ycc_rgb_table(cinfo);

+    } else if (cinfo->jpeg_color_space == JCS_CMYK) {

+      cconvert->pub.color_convert = null_convert;

+    } else

+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);

+    break;

+

+  default:

+    /* Permit null conversion to same output space */

+    if (cinfo->out_color_space == cinfo->jpeg_color_space) {

+      cinfo->out_color_components = cinfo->num_components;

+      cconvert->pub.color_convert = null_convert;

+    } else			/* unsupported non-null conversion */

+      ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);

+    break;

+  }

+

+  if (cinfo->quantize_colors)

+    cinfo->output_components = 1; /* single colormapped output component */

+  else

+    cinfo->output_components = cinfo->out_color_components;

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c b/core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c
new file mode 100644
index 0000000..811d51d
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c
@@ -0,0 +1,272 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jddctmgr.c

+ *

+ * Copyright (C) 1994-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains the inverse-DCT management logic.

+ * This code selects a particular IDCT implementation to be used,

+ * and it performs related housekeeping chores.  No code in this file

+ * is executed per IDCT step, only during output pass setup.

+ *

+ * Note that the IDCT routines are responsible for performing coefficient

+ * dequantization as well as the IDCT proper.  This module sets up the

+ * dequantization multiplier table needed by the IDCT routine.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jdct.h"		/* Private declarations for DCT subsystem */

+

+

+/*

+ * The decompressor input side (jdinput.c) saves away the appropriate

+ * quantization table for each component at the start of the first scan

+ * involving that component.  (This is necessary in order to correctly

+ * decode files that reuse Q-table slots.)

+ * When we are ready to make an output pass, the saved Q-table is converted

+ * to a multiplier table that will actually be used by the IDCT routine.

+ * The multiplier table contents are IDCT-method-dependent.  To support

+ * application changes in IDCT method between scans, we can remake the

+ * multiplier tables if necessary.

+ * In buffered-image mode, the first output pass may occur before any data

+ * has been seen for some components, and thus before their Q-tables have

+ * been saved away.  To handle this case, multiplier tables are preset

+ * to zeroes; the result of the IDCT will be a neutral gray level.

+ */

+

+

+/* Private subobject for this module */

+

+typedef struct {

+  struct jpeg_inverse_dct pub;	/* public fields */

+

+  /* This array contains the IDCT method code that each multiplier table

+   * is currently set up for, or -1 if it's not yet set up.

+   * The actual multiplier tables are pointed to by dct_table in the

+   * per-component comp_info structures.

+   */

+  int cur_method[MAX_COMPONENTS];

+} my_idct_controller;

+

+typedef my_idct_controller * my_idct_ptr;

+

+

+/* Allocated multiplier tables: big enough for any supported variant */

+

+typedef union {

+  ISLOW_MULT_TYPE islow_array[DCTSIZE2];

+#ifdef DCT_IFAST_SUPPORTED

+  IFAST_MULT_TYPE ifast_array[DCTSIZE2];

+#endif

+#ifdef DCT_FLOAT_SUPPORTED

+  FLOAT_MULT_TYPE float_array[DCTSIZE2];

+#endif

+} multiplier_table;

+

+

+/* The current scaled-IDCT routines require ISLOW-style multiplier tables,

+ * so be sure to compile that code if either ISLOW or SCALING is requested.

+ */

+#ifdef DCT_ISLOW_SUPPORTED

+#define PROVIDE_ISLOW_TABLES

+#else

+#ifdef IDCT_SCALING_SUPPORTED

+#define PROVIDE_ISLOW_TABLES

+#endif

+#endif

+

+

+/*

+ * Prepare for an output pass.

+ * Here we select the proper IDCT routine for each component and build

+ * a matching multiplier table.

+ */

+

+METHODDEF(void)

+start_pass (j_decompress_ptr cinfo)

+{

+  my_idct_ptr idct = (my_idct_ptr) cinfo->idct;

+  int ci, i;

+  jpeg_component_info *compptr;

+  int method = 0;

+  inverse_DCT_method_ptr method_ptr = NULL;

+  JQUANT_TBL * qtbl;

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    /* Select the proper IDCT routine for this component's scaling */

+    switch (compptr->DCT_scaled_size) {

+#ifdef IDCT_SCALING_SUPPORTED

+    case 1:

+      method_ptr = jpeg_idct_1x1;

+      method = JDCT_ISLOW;	/* jidctred uses islow-style table */

+      break;

+    case 2:

+      method_ptr = jpeg_idct_2x2;

+      method = JDCT_ISLOW;	/* jidctred uses islow-style table */

+      break;

+    case 4:

+      method_ptr = jpeg_idct_4x4;

+      method = JDCT_ISLOW;	/* jidctred uses islow-style table */

+      break;

+#endif

+    case DCTSIZE:

+      switch (cinfo->dct_method) {

+#ifdef DCT_ISLOW_SUPPORTED

+      case JDCT_ISLOW:

+	method_ptr = jpeg_idct_islow;

+	method = JDCT_ISLOW;

+	break;

+#endif

+#ifdef DCT_IFAST_SUPPORTED

+      case JDCT_IFAST:

+	method_ptr = jpeg_idct_ifast;

+	method = JDCT_IFAST;

+	break;

+#endif

+#ifdef DCT_FLOAT_SUPPORTED

+      case JDCT_FLOAT:

+	method_ptr = jpeg_idct_float;

+	method = JDCT_FLOAT;

+	break;

+#endif

+      default:

+	ERREXIT(cinfo, JERR_NOT_COMPILED);

+	break;

+      }

+      break;

+    default:

+      ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size);

+      break;

+    }

+    idct->pub.inverse_DCT[ci] = method_ptr;

+    /* Create multiplier table from quant table.

+     * However, we can skip this if the component is uninteresting

+     * or if we already built the table.  Also, if no quant table

+     * has yet been saved for the component, we leave the

+     * multiplier table all-zero; we'll be reading zeroes from the

+     * coefficient controller's buffer anyway.

+     */

+    if (! compptr->component_needed || idct->cur_method[ci] == method)

+      continue;

+    qtbl = compptr->quant_table;

+    if (qtbl == NULL)		/* happens if no data yet for component */

+      continue;

+    idct->cur_method[ci] = method;

+    switch (method) {

+#ifdef PROVIDE_ISLOW_TABLES

+    case JDCT_ISLOW:

+      {

+	/* For LL&M IDCT method, multipliers are equal to raw quantization

+	 * coefficients, but are stored as ints to ensure access efficiency.

+	 */

+	ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;

+	for (i = 0; i < DCTSIZE2; i++) {

+	  ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];

+	}

+      }

+      break;

+#endif

+#ifdef DCT_IFAST_SUPPORTED

+    case JDCT_IFAST:

+      {

+	/* For AA&N IDCT method, multipliers are equal to quantization

+	 * coefficients scaled by scalefactor[row]*scalefactor[col], where

+	 *   scalefactor[0] = 1

+	 *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7

+	 * For integer operation, the multiplier table is to be scaled by

+	 * IFAST_SCALE_BITS.

+	 */

+	IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;

+#define CONST_BITS 14

+	static const INT16 aanscales[DCTSIZE2] = {

+	  /* precomputed values scaled up by 14 bits */

+	  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,

+	  22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,

+	  21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,

+	  19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,

+	  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,

+	  12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,

+	   8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,

+	   4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247

+	};

+	SHIFT_TEMPS

+

+	for (i = 0; i < DCTSIZE2; i++) {

+	  ifmtbl[i] = (IFAST_MULT_TYPE)

+	    DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],

+				  (INT32) aanscales[i]),

+		    CONST_BITS-IFAST_SCALE_BITS);

+	}

+      }

+      break;

+#endif

+#ifdef DCT_FLOAT_SUPPORTED

+    case JDCT_FLOAT:

+      {

+	/* For float AA&N IDCT method, multipliers are equal to quantization

+	 * coefficients scaled by scalefactor[row]*scalefactor[col], where

+	 *   scalefactor[0] = 1

+	 *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7

+	 */

+	FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;

+	int row, col;

+	static const double aanscalefactor[DCTSIZE] = {

+	  1.0, 1.387039845, 1.306562965, 1.175875602,

+	  1.0, 0.785694958, 0.541196100, 0.275899379

+	};

+

+	i = 0;

+	for (row = 0; row < DCTSIZE; row++) {

+	  for (col = 0; col < DCTSIZE; col++) {

+	    fmtbl[i] = (FLOAT_MULT_TYPE)

+	      ((double) qtbl->quantval[i] *

+	       aanscalefactor[row] * aanscalefactor[col]);

+	    i++;

+	  }

+	}

+      }

+      break;

+#endif

+    default:

+      ERREXIT(cinfo, JERR_NOT_COMPILED);

+      break;

+    }

+  }

+}

+

+

+/*

+ * Initialize IDCT manager.

+ */

+

+GLOBAL(void)

+jinit_inverse_dct (j_decompress_ptr cinfo)

+{

+  my_idct_ptr idct;

+  int ci;

+  jpeg_component_info *compptr;

+

+  idct = (my_idct_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_idct_controller));

+  cinfo->idct = (struct jpeg_inverse_dct *) idct;

+  idct->pub.start_pass = start_pass;

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    /* Allocate and pre-zero a multiplier table for each component */

+    compptr->dct_table =

+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				  SIZEOF(multiplier_table));

+    MEMZERO(compptr->dct_table, SIZEOF(multiplier_table));

+    /* Mark multiplier table not yet set up for any method */

+    idct->cur_method[ci] = -1;

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c b/core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c
new file mode 100644
index 0000000..b724d52
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c
@@ -0,0 +1,657 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdhuff.c

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains Huffman entropy decoding routines.

+ *

+ * Much of the complexity here has to do with supporting input suspension.

+ * If the data source module demands suspension, we want to be able to back

+ * up to the start of the current MCU.  To do this, we copy state variables

+ * into local working storage, and update them back to the permanent

+ * storage only upon successful completion of an MCU.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jdhuff.h"		/* Declarations shared with jdphuff.c */

+

+#ifdef _FX_MANAGED_CODE_

+#define savable_state	savable_state_d

+#endif

+

+/*

+ * Expanded entropy decoder object for Huffman decoding.

+ *

+ * The savable_state subrecord contains fields that change within an MCU,

+ * but must not be updated permanently until we complete the MCU.

+ */

+

+typedef struct {

+  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */

+} savable_state;

+

+/* This macro is to work around compilers with missing or broken

+ * structure assignment.  You'll need to fix this code if you have

+ * such a compiler and you change MAX_COMPS_IN_SCAN.

+ */

+

+#ifndef NO_STRUCT_ASSIGN

+#define ASSIGN_STATE(dest,src)  ((dest) = (src))

+#else

+#if MAX_COMPS_IN_SCAN == 4

+#define ASSIGN_STATE(dest,src)  \

+	((dest).last_dc_val[0] = (src).last_dc_val[0], \

+	 (dest).last_dc_val[1] = (src).last_dc_val[1], \

+	 (dest).last_dc_val[2] = (src).last_dc_val[2], \

+	 (dest).last_dc_val[3] = (src).last_dc_val[3])

+#endif

+#endif

+

+

+typedef struct {

+  struct jpeg_entropy_decoder pub; /* public fields */

+

+  /* These fields are loaded into local variables at start of each MCU.

+   * In case of suspension, we exit WITHOUT updating them.

+   */

+  bitread_perm_state bitstate;	/* Bit buffer at start of MCU */

+  savable_state saved;		/* Other state at start of MCU */

+

+  /* These fields are NOT loaded into local working state. */

+  unsigned int restarts_to_go;	/* MCUs left in this restart interval */

+

+  /* Pointers to derived tables (these workspaces have image lifespan) */

+  d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];

+  d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];

+

+  /* Precalculated info set up by start_pass for use in decode_mcu: */

+

+  /* Pointers to derived tables to be used for each block within an MCU */

+  d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU];

+  d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU];

+  /* Whether we care about the DC and AC coefficient values for each block */

+  boolean dc_needed[D_MAX_BLOCKS_IN_MCU];

+  boolean ac_needed[D_MAX_BLOCKS_IN_MCU];

+} huff_entropy_decoder;

+

+typedef huff_entropy_decoder * huff_entropy_ptr;

+

+

+/*

+ * Initialize for a Huffman-compressed scan.

+ */

+

+METHODDEF(void)

+start_pass_huff_decoder (j_decompress_ptr cinfo)

+{

+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;

+  int ci, blkn, dctbl, actbl;

+  jpeg_component_info * compptr;

+

+  /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.

+   * This ought to be an error condition, but we make it a warning because

+   * there are some baseline files out there with all zeroes in these bytes.

+   */

+  if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 ||

+      cinfo->Ah != 0 || cinfo->Al != 0)

+    WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);

+

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+    compptr = cinfo->cur_comp_info[ci];

+    dctbl = compptr->dc_tbl_no;

+    actbl = compptr->ac_tbl_no;

+    /* Compute derived values for Huffman tables */

+    /* We may do this more than once for a table, but it's not expensive */

+    jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl,

+			    & entropy->dc_derived_tbls[dctbl]);

+    jpeg_make_d_derived_tbl(cinfo, FALSE, actbl,

+			    & entropy->ac_derived_tbls[actbl]);

+    /* Initialize DC predictions to 0 */

+    entropy->saved.last_dc_val[ci] = 0;

+  }

+

+  /* Precalculate decoding info for each block in an MCU of this scan */

+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {

+    ci = cinfo->MCU_membership[blkn];

+    compptr = cinfo->cur_comp_info[ci];

+    /* Precalculate which table to use for each block */

+    entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];

+    entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no];

+    /* Decide whether we really care about the coefficient values */

+    if (compptr->component_needed) {

+      entropy->dc_needed[blkn] = TRUE;

+      /* we don't need the ACs if producing a 1/8th-size image */

+      entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1);

+    } else {

+      entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE;

+    }

+  }

+

+  /* Initialize bitread state variables */

+  entropy->bitstate.bits_left = 0;

+  entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */

+  entropy->pub.insufficient_data = FALSE;

+

+  /* Initialize restart counter */

+  entropy->restarts_to_go = cinfo->restart_interval;

+}

+

+

+/*

+ * Compute the derived values for a Huffman table.

+ * This routine also performs some validation checks on the table.

+ *

+ * Note this is also used by jdphuff.c.

+ */

+

+GLOBAL(void)

+jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno,

+			 d_derived_tbl ** pdtbl)

+{

+  JHUFF_TBL *htbl;

+  d_derived_tbl *dtbl;

+  int p, i, l, _si, numsymbols;

+  int lookbits, ctr;

+  char huffsize[257];

+  unsigned int huffcode[257];

+  unsigned int code;

+

+  /* Note that huffsize[] and huffcode[] are filled in code-length order,

+   * paralleling the order of the symbols themselves in htbl->huffval[].

+   */

+

+  /* Find the input Huffman table */

+  if (tblno < 0 || tblno >= NUM_HUFF_TBLS)

+    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);

+  htbl =

+    isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];

+  if (htbl == NULL)

+    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);

+

+  /* Allocate a workspace if we haven't already done so. */

+  if (*pdtbl == NULL)

+    *pdtbl = (d_derived_tbl *)

+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				  SIZEOF(d_derived_tbl));

+  dtbl = *pdtbl;

+  dtbl->pub = htbl;		/* fill in back link */

+  

+  /* Figure C.1: make table of Huffman code length for each symbol */

+

+  p = 0;

+  for (l = 1; l <= 16; l++) {

+    i = (int) htbl->bits[l];

+    if (i < 0 || p + i > 256)	/* protect against table overrun */

+      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);

+    while (i--)

+      huffsize[p++] = (char) l;

+  }

+  huffsize[p] = 0;

+  numsymbols = p;

+  

+  /* Figure C.2: generate the codes themselves */

+  /* We also validate that the counts represent a legal Huffman code tree. */

+  

+  code = 0;

+  _si = huffsize[0];

+  p = 0;

+  while (huffsize[p]) {

+    while (((int) huffsize[p]) == _si) {

+      huffcode[p++] = code;

+      code++;

+    }

+    /* code is now 1 more than the last code used for codelength si; but

+     * it must still fit in si bits, since no code is allowed to be all ones.

+     */

+    if (((INT32) code) >= (((INT32) 1) << _si))

+      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);

+    code <<= 1;

+    _si++;

+  }

+

+  /* Figure F.15: generate decoding tables for bit-sequential decoding */

+

+  p = 0;

+  for (l = 1; l <= 16; l++) {

+    if (htbl->bits[l]) {

+      /* valoffset[l] = huffval[] index of 1st symbol of code length l,

+       * minus the minimum code of length l

+       */

+      dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p];

+      p += htbl->bits[l];

+      dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */

+    } else {

+      dtbl->maxcode[l] = -1;	/* -1 if no codes of this length */

+    }

+  }

+  dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */

+

+  /* Compute lookahead tables to speed up decoding.

+   * First we set all the table entries to 0, indicating "too long";

+   * then we iterate through the Huffman codes that are short enough and

+   * fill in all the entries that correspond to bit sequences starting

+   * with that code.

+   */

+

+  MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits));

+

+  p = 0;

+  for (l = 1; l <= HUFF_LOOKAHEAD; l++) {

+    for (i = 1; i <= (int) htbl->bits[l]; i++, p++) {

+      /* l = current code's length, p = its index in huffcode[] & huffval[]. */

+      /* Generate left-justified code followed by all possible bit sequences */

+      lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);

+      for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) {

+	dtbl->look_nbits[lookbits] = l;

+	dtbl->look_sym[lookbits] = htbl->huffval[p];

+	lookbits++;

+      }

+    }

+  }

+

+  /* Validate symbols as being reasonable.

+   * For AC tables, we make no check, but accept all byte values 0..255.

+   * For DC tables, we require the symbols to be in range 0..15.

+   * (Tighter bounds could be applied depending on the data depth and mode,

+   * but this is sufficient to ensure safe decoding.)

+   */

+  if (isDC) {

+    for (i = 0; i < numsymbols; i++) {

+      int sym = htbl->huffval[i];

+      if (sym < 0 || sym > 15)

+	ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);

+    }

+  }

+}

+

+

+/*

+ * Out-of-line code for bit fetching (shared with jdphuff.c).

+ * See jdhuff.h for info about usage.

+ * Note: current values of get_buffer and bits_left are passed as parameters,

+ * but are returned in the corresponding fields of the state struct.

+ *

+ * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width

+ * of get_buffer to be used.  (On machines with wider words, an even larger

+ * buffer could be used.)  However, on some machines 32-bit shifts are

+ * quite slow and take time proportional to the number of places shifted.

+ * (This is true with most PC compilers, for instance.)  In this case it may

+ * be a win to set MIN_GET_BITS to the minimum value of 15.  This reduces the

+ * average shift distance at the cost of more calls to jpeg_fill_bit_buffer.

+ */

+

+#ifdef SLOW_SHIFT_32

+#define MIN_GET_BITS  15	/* minimum allowable value */

+#else

+#define MIN_GET_BITS  (BIT_BUF_SIZE-7)

+#endif

+

+

+GLOBAL(boolean)

+jpeg_fill_bit_buffer (bitread_working_state * state,

+		      register bit_buf_type get_buffer, register int bits_left,

+		      int nbits)

+/* Load up the bit buffer to a depth of at least nbits */

+{

+  /* Copy heavily used state fields into locals (hopefully registers) */

+  register const JOCTET * next_input_byte = state->next_input_byte;

+  register size_t bytes_in_buffer = state->bytes_in_buffer;

+  j_decompress_ptr cinfo = state->cinfo;

+

+  /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */

+  /* (It is assumed that no request will be for more than that many bits.) */

+  /* We fail to do so only if we hit a marker or are forced to suspend. */

+

+  if (cinfo->unread_marker == 0) {	/* cannot advance past a marker */

+    while (bits_left < MIN_GET_BITS) {

+      register int c;

+

+      /* Attempt to read a byte */

+      if (bytes_in_buffer == 0) {

+	if (! (*cinfo->src->fill_input_buffer) (cinfo))

+	  return FALSE;

+	next_input_byte = cinfo->src->next_input_byte;

+	bytes_in_buffer = cinfo->src->bytes_in_buffer;

+      }

+      bytes_in_buffer--;

+      c = GETJOCTET(*next_input_byte++);

+

+      /* If it's 0xFF, check and discard stuffed zero byte */

+      if (c == 0xFF) {

+	/* Loop here to discard any padding FF's on terminating marker,

+	 * so that we can save a valid unread_marker value.  NOTE: we will

+	 * accept multiple FF's followed by a 0 as meaning a single FF data

+	 * byte.  This data pattern is not valid according to the standard.

+	 */

+	do {

+	  if (bytes_in_buffer == 0) {

+	    if (! (*cinfo->src->fill_input_buffer) (cinfo))

+	      return FALSE;

+	    next_input_byte = cinfo->src->next_input_byte;

+	    bytes_in_buffer = cinfo->src->bytes_in_buffer;

+	  }

+	  bytes_in_buffer--;

+	  c = GETJOCTET(*next_input_byte++);

+	} while (c == 0xFF);

+

+	if (c == 0) {

+	  /* Found FF/00, which represents an FF data byte */

+	  c = 0xFF;

+	} else {

+	  /* Oops, it's actually a marker indicating end of compressed data.

+	   * Save the marker code for later use.

+	   * Fine point: it might appear that we should save the marker into

+	   * bitread working state, not straight into permanent state.  But

+	   * once we have hit a marker, we cannot need to suspend within the

+	   * current MCU, because we will read no more bytes from the data

+	   * source.  So it is OK to update permanent state right away.

+	   */

+	  cinfo->unread_marker = c;

+	  /* See if we need to insert some fake zero bits. */

+	  goto no_more_bytes;

+	}

+      }

+

+      /* OK, load c into get_buffer */

+      get_buffer = (get_buffer << 8) | c;

+      bits_left += 8;

+    } /* end while */

+  } else {

+  no_more_bytes:

+    /* We get here if we've read the marker that terminates the compressed

+     * data segment.  There should be enough bits in the buffer register

+     * to satisfy the request; if so, no problem.

+     */

+    if (nbits > bits_left) {

+      /* Uh-oh.  Report corrupted data to user and stuff zeroes into

+       * the data stream, so that we can produce some kind of image.

+       * We use a nonvolatile flag to ensure that only one warning message

+       * appears per data segment.

+       */

+      if (! cinfo->entropy->insufficient_data) {

+	WARNMS(cinfo, JWRN_HIT_MARKER);

+	cinfo->entropy->insufficient_data = TRUE;

+      }

+      /* Fill the buffer with zero bits */

+      get_buffer <<= MIN_GET_BITS - bits_left;

+      bits_left = MIN_GET_BITS;

+    }

+  }

+

+  /* Unload the local registers */

+  state->next_input_byte = next_input_byte;

+  state->bytes_in_buffer = bytes_in_buffer;

+  state->get_buffer = get_buffer;

+  state->bits_left = bits_left;

+

+  return TRUE;

+}

+

+

+/*

+ * Out-of-line code for Huffman code decoding.

+ * See jdhuff.h for info about usage.

+ */

+

+GLOBAL(int)

+jpeg_huff_decode (bitread_working_state * state,

+		  register bit_buf_type get_buffer, register int bits_left,

+		  d_derived_tbl * htbl, int min_bits)

+{

+  register int l = min_bits;

+  register INT32 code;

+

+  /* HUFF_DECODE has determined that the code is at least min_bits */

+  /* bits long, so fetch that many bits in one swoop. */

+

+  CHECK_BIT_BUFFER(*state, l, return -1);

+  code = GET_BITS(l);

+

+  /* Collect the rest of the Huffman code one bit at a time. */

+  /* This is per Figure F.16 in the JPEG spec. */

+

+  while (code > htbl->maxcode[l]) {

+    code <<= 1;

+    CHECK_BIT_BUFFER(*state, 1, return -1);

+    code |= GET_BITS(1);

+    l++;

+  }

+

+  /* Unload the local registers */

+  state->get_buffer = get_buffer;

+  state->bits_left = bits_left;

+

+  /* With garbage input we may reach the sentinel value l = 17. */

+

+  if (l > 16) {

+    WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE);

+    return 0;			/* fake a zero as the safest result */

+  }

+

+  return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ];

+}

+

+

+/*

+ * Figure F.12: extend sign bit.

+ * On some machines, a shift and add will be faster than a table lookup.

+ */

+

+#ifdef AVOID_TABLES

+

+#define HUFF_EXTEND(x,s)  ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))

+

+#else

+

+#define HUFF_EXTEND(x,s)  ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))

+

+static const int extend_test[16] =   /* entry n is 2**(n-1) */

+  { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,

+    0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };

+

+static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */

+  { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,

+    ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,

+    ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,

+    ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };

+

+#endif /* AVOID_TABLES */

+

+

+/*

+ * Check for a restart marker & resynchronize decoder.

+ * Returns FALSE if must suspend.

+ */

+

+LOCAL(boolean)

+process_restart (j_decompress_ptr cinfo)

+{

+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;

+  int ci;

+

+  /* Throw away any unused bits remaining in bit buffer; */

+  /* include any full bytes in next_marker's count of discarded bytes */

+  cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;

+  entropy->bitstate.bits_left = 0;

+

+  /* Advance past the RSTn marker */

+  if (! (*cinfo->marker->read_restart_marker) (cinfo))

+    return FALSE;

+

+  /* Re-initialize DC predictions to 0 */

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++)

+    entropy->saved.last_dc_val[ci] = 0;

+

+  /* Reset restart counter */

+  entropy->restarts_to_go = cinfo->restart_interval;

+

+  /* Reset out-of-data flag, unless read_restart_marker left us smack up

+   * against a marker.  In that case we will end up treating the next data

+   * segment as empty, and we can avoid producing bogus output pixels by

+   * leaving the flag set.

+   */

+  if (cinfo->unread_marker == 0)

+    entropy->pub.insufficient_data = FALSE;

+

+  return TRUE;

+}

+

+

+/*

+ * Decode and return one MCU's worth of Huffman-compressed coefficients.

+ * The coefficients are reordered from zigzag order into natural array order,

+ * but are not dequantized.

+ *

+ * The i'th block of the MCU is stored into the block pointed to by

+ * MCU_data[i].  WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER.

+ * (Wholesale zeroing is usually a little faster than retail...)

+ *

+ * Returns FALSE if data source requested suspension.  In that case no

+ * changes have been made to permanent state.  (Exception: some output

+ * coefficients may already have been assigned.  This is harmless for

+ * this module, since we'll just re-assign them on the next call.)

+ */

+

+METHODDEF(boolean)

+decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)

+{

+  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;

+  int blkn;

+  BITREAD_STATE_VARS;

+  savable_state state;

+

+  /* Process restart marker if needed; may have to suspend */

+  if (cinfo->restart_interval) {

+    if (entropy->restarts_to_go == 0)

+      if (! process_restart(cinfo))

+	return FALSE;

+  }

+

+  /* If we've run out of data, just leave the MCU set to zeroes.

+   * This way, we return uniform gray for the remainder of the segment.

+   */

+  if (! entropy->pub.insufficient_data) {

+

+    /* Load up working state */

+    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);

+    ASSIGN_STATE(state, entropy->saved);

+

+    /* Outer loop handles each block in the MCU */

+

+    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {

+      JBLOCKROW block = MCU_data[blkn];

+      d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn];

+      d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn];

+      register int s, k, r;

+

+      /* Decode a single block's worth of coefficients */

+

+      /* Section F.2.2.1: decode the DC coefficient difference */

+      HUFF_DECODE(s, br_state, dctbl, return FALSE, label1);

+      if (s) {

+	CHECK_BIT_BUFFER(br_state, s, return FALSE);

+	r = GET_BITS(s);

+	s = HUFF_EXTEND(r, s);

+      }

+

+      if (entropy->dc_needed[blkn]) {

+	/* Convert DC difference to actual value, update last_dc_val */

+	int ci = cinfo->MCU_membership[blkn];

+	s += state.last_dc_val[ci];

+	state.last_dc_val[ci] = s;

+	/* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */

+	(*block)[0] = (JCOEF) s;

+      }

+

+      if (entropy->ac_needed[blkn]) {

+

+	/* Section F.2.2.2: decode the AC coefficients */

+	/* Since zeroes are skipped, output area must be cleared beforehand */

+	for (k = 1; k < DCTSIZE2; k++) {

+	  HUFF_DECODE(s, br_state, actbl, return FALSE, label2);

+      

+	  r = s >> 4;

+	  s &= 15;

+      

+	  if (s) {

+	    k += r;

+	    CHECK_BIT_BUFFER(br_state, s, return FALSE);

+	    r = GET_BITS(s);

+	    s = HUFF_EXTEND(r, s);

+	    /* Output coefficient in natural (dezigzagged) order.

+	     * Note: the extra entries in jpeg_natural_order[] will save us

+	     * if k >= DCTSIZE2, which could happen if the data is corrupted.

+	     */

+	    (*block)[jpeg_natural_order[k]] = (JCOEF) s;

+	  } else {

+	    if (r != 15)

+	      break;

+	    k += 15;

+	  }

+	}

+

+      } else {

+

+	/* Section F.2.2.2: decode the AC coefficients */

+	/* In this path we just discard the values */

+	for (k = 1; k < DCTSIZE2; k++) {

+	  HUFF_DECODE(s, br_state, actbl, return FALSE, label3);

+      

+	  r = s >> 4;

+	  s &= 15;

+      

+	  if (s) {

+	    k += r;

+	    CHECK_BIT_BUFFER(br_state, s, return FALSE);

+	    DROP_BITS(s);

+	  } else {

+	    if (r != 15)

+	      break;

+	    k += 15;

+	  }

+	}

+

+      }

+    }

+

+    /* Completed MCU, so update state */

+    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);

+    ASSIGN_STATE(entropy->saved, state);

+  }

+

+  /* Account for restart interval (no-op if not using restarts) */

+  entropy->restarts_to_go--;

+

+  return TRUE;

+}

+

+

+/*

+ * Module initialization routine for Huffman entropy decoding.

+ */

+

+GLOBAL(void)

+jinit_huff_decoder (j_decompress_ptr cinfo)

+{

+  huff_entropy_ptr entropy;

+  int i;

+

+  entropy = (huff_entropy_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(huff_entropy_decoder));

+  cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;

+  entropy->pub.start_pass = start_pass_huff_decoder;

+  entropy->pub.decode_mcu = decode_mcu;

+

+  /* Mark tables unallocated */

+  for (i = 0; i < NUM_HUFF_TBLS; i++) {

+    entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdinput.c b/core/src/fxcodec/libjpeg/fpdfapi_jdinput.c
new file mode 100644
index 0000000..46a7efc
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdinput.c
@@ -0,0 +1,384 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdinput.c

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains input control logic for the JPEG decompressor.

+ * These routines are concerned with controlling the decompressor's input

+ * processing (marker reading and coefficient decoding).  The actual input

+ * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* Private state */

+

+typedef struct {

+  struct jpeg_input_controller pub; /* public fields */

+

+  boolean inheaders;		/* TRUE until first SOS is reached */

+} my_input_controller;

+

+typedef my_input_controller * my_inputctl_ptr;

+

+

+/* Forward declarations */

+METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo));

+

+

+/*

+ * Routines to calculate various quantities related to the size of the image.

+ */

+

+LOCAL(void)

+initial_setup (j_decompress_ptr cinfo)

+/* Called once, when first SOS marker is reached */

+{

+  int ci;

+  jpeg_component_info *compptr;

+

+  /* Make sure image isn't bigger than I can handle */

+  if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||

+      (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)

+    ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);

+

+  /* For now, precision must match compiled-in value... */

+  if (cinfo->data_precision != BITS_IN_JSAMPLE)

+    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);

+

+  /* Check that number of components won't exceed internal array sizes */

+  if (cinfo->num_components > MAX_COMPONENTS)

+    ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,

+	     MAX_COMPONENTS);

+

+  /* Compute maximum sampling factors; check factor validity */

+  cinfo->max_h_samp_factor = 1;

+  cinfo->max_v_samp_factor = 1;

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||

+	compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)

+      ERREXIT(cinfo, JERR_BAD_SAMPLING);

+    cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,

+				   compptr->h_samp_factor);

+    cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,

+				   compptr->v_samp_factor);

+  }

+

+  /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE.

+   * In the full decompressor, this will be overridden by jdmaster.c;

+   * but in the transcoder, jdmaster.c is not used, so we must do it here.

+   */

+  cinfo->min_DCT_scaled_size = DCTSIZE;

+

+  /* Compute dimensions of components */

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    compptr->DCT_scaled_size = DCTSIZE;

+    /* Size in DCT blocks */

+    compptr->width_in_blocks = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,

+		    (long) (cinfo->max_h_samp_factor * DCTSIZE));

+    compptr->height_in_blocks = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,

+		    (long) (cinfo->max_v_samp_factor * DCTSIZE));

+    /* downsampled_width and downsampled_height will also be overridden by

+     * jdmaster.c if we are doing full decompression.  The transcoder library

+     * doesn't use these values, but the calling application might.

+     */

+    /* Size in samples */

+    compptr->downsampled_width = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,

+		    (long) cinfo->max_h_samp_factor);

+    compptr->downsampled_height = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,

+		    (long) cinfo->max_v_samp_factor);

+    /* Mark component needed, until color conversion says otherwise */

+    compptr->component_needed = TRUE;

+    /* Mark no quantization table yet saved for component */

+    compptr->quant_table = NULL;

+  }

+

+  /* Compute number of fully interleaved MCU rows. */

+  cinfo->total_iMCU_rows = (JDIMENSION)

+    jdiv_round_up((long) cinfo->image_height,

+		  (long) (cinfo->max_v_samp_factor*DCTSIZE));

+

+  /* Decide whether file contains multiple scans */

+  if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode)

+    cinfo->inputctl->has_multiple_scans = TRUE;

+  else

+    cinfo->inputctl->has_multiple_scans = FALSE;

+}

+

+

+LOCAL(void)

+per_scan_setup (j_decompress_ptr cinfo)

+/* Do computations that are needed before processing a JPEG scan */

+/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */

+{

+  int ci, mcublks, tmp;

+  jpeg_component_info *compptr;

+  

+  if (cinfo->comps_in_scan == 1) {

+    

+    /* Noninterleaved (single-component) scan */

+    compptr = cinfo->cur_comp_info[0];

+    

+    /* Overall image size in MCUs */

+    cinfo->MCUs_per_row = compptr->width_in_blocks;

+    cinfo->MCU_rows_in_scan = compptr->height_in_blocks;

+    

+    /* For noninterleaved scan, always one block per MCU */

+    compptr->MCU_width = 1;

+    compptr->MCU_height = 1;

+    compptr->MCU_blocks = 1;

+    compptr->MCU_sample_width = compptr->DCT_scaled_size;

+    compptr->last_col_width = 1;

+    /* For noninterleaved scans, it is convenient to define last_row_height

+     * as the number of block rows present in the last iMCU row.

+     */

+    tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);

+    if (tmp == 0) tmp = compptr->v_samp_factor;

+    compptr->last_row_height = tmp;

+    

+    /* Prepare array describing MCU composition */

+    cinfo->blocks_in_MCU = 1;

+    cinfo->MCU_membership[0] = 0;

+    

+  } else {

+    

+    /* Interleaved (multi-component) scan */

+    if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)

+      ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,

+	       MAX_COMPS_IN_SCAN);

+    

+    /* Overall image size in MCUs */

+    cinfo->MCUs_per_row = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_width,

+		    (long) (cinfo->max_h_samp_factor*DCTSIZE));

+    cinfo->MCU_rows_in_scan = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_height,

+		    (long) (cinfo->max_v_samp_factor*DCTSIZE));

+    

+    cinfo->blocks_in_MCU = 0;

+    

+    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+      compptr = cinfo->cur_comp_info[ci];

+      /* Sampling factors give # of blocks of component in each MCU */

+      compptr->MCU_width = compptr->h_samp_factor;

+      compptr->MCU_height = compptr->v_samp_factor;

+      compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;

+      compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size;

+      /* Figure number of non-dummy blocks in last MCU column & row */

+      tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);

+      if (tmp == 0) tmp = compptr->MCU_width;

+      compptr->last_col_width = tmp;

+      tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);

+      if (tmp == 0) tmp = compptr->MCU_height;

+      compptr->last_row_height = tmp;

+      /* Prepare array describing MCU composition */

+      mcublks = compptr->MCU_blocks;

+      if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU)

+	ERREXIT(cinfo, JERR_BAD_MCU_SIZE);

+      while (mcublks-- > 0) {

+	cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;

+      }

+    }

+    

+  }

+}

+

+

+/*

+ * Save away a copy of the Q-table referenced by each component present

+ * in the current scan, unless already saved during a prior scan.

+ *

+ * In a multiple-scan JPEG file, the encoder could assign different components

+ * the same Q-table slot number, but change table definitions between scans

+ * so that each component uses a different Q-table.  (The IJG encoder is not

+ * currently capable of doing this, but other encoders might.)  Since we want

+ * to be able to dequantize all the components at the end of the file, this

+ * means that we have to save away the table actually used for each component.

+ * We do this by copying the table at the start of the first scan containing

+ * the component.

+ * The JPEG spec prohibits the encoder from changing the contents of a Q-table

+ * slot between scans of a component using that slot.  If the encoder does so

+ * anyway, this decoder will simply use the Q-table values that were current

+ * at the start of the first scan for the component.

+ *

+ * The decompressor output side looks only at the saved quant tables,

+ * not at the current Q-table slots.

+ */

+

+LOCAL(void)

+latch_quant_tables (j_decompress_ptr cinfo)

+{

+  int ci, qtblno;

+  jpeg_component_info *compptr;

+  JQUANT_TBL * qtbl;

+

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+    compptr = cinfo->cur_comp_info[ci];

+    /* No work if we already saved Q-table for this component */

+    if (compptr->quant_table != NULL)

+      continue;

+    /* Make sure specified quantization table is present */

+    qtblno = compptr->quant_tbl_no;

+    if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||

+	cinfo->quant_tbl_ptrs[qtblno] == NULL)

+      ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);

+    /* OK, save away the quantization table */

+    qtbl = (JQUANT_TBL *)

+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				  SIZEOF(JQUANT_TBL));

+    MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL));

+    compptr->quant_table = qtbl;

+  }

+}

+

+

+/*

+ * Initialize the input modules to read a scan of compressed data.

+ * The first call to this is done by jdmaster.c after initializing

+ * the entire decompressor (during jpeg_start_decompress).

+ * Subsequent calls come from consume_markers, below.

+ */

+

+METHODDEF(void)

+start_input_pass (j_decompress_ptr cinfo)

+{

+  per_scan_setup(cinfo);

+  latch_quant_tables(cinfo);

+  (*cinfo->entropy->start_pass) (cinfo);

+  (*cinfo->coef->start_input_pass) (cinfo);

+  cinfo->inputctl->consume_input = cinfo->coef->consume_data;

+}

+

+

+/*

+ * Finish up after inputting a compressed-data scan.

+ * This is called by the coefficient controller after it's read all

+ * the expected data of the scan.

+ */

+

+METHODDEF(void)

+finish_input_pass (j_decompress_ptr cinfo)

+{

+  cinfo->inputctl->consume_input = consume_markers;

+}

+

+

+/*

+ * Read JPEG markers before, between, or after compressed-data scans.

+ * Change state as necessary when a new scan is reached.

+ * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.

+ *

+ * The consume_input method pointer points either here or to the

+ * coefficient controller's consume_data routine, depending on whether

+ * we are reading a compressed data segment or inter-segment markers.

+ */

+

+METHODDEF(int)

+consume_markers (j_decompress_ptr cinfo)

+{

+  my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;

+  int val;

+

+  if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */

+    return JPEG_REACHED_EOI;

+

+  val = (*cinfo->marker->read_markers) (cinfo);

+

+  switch (val) {

+  case JPEG_REACHED_SOS:	/* Found SOS */

+    if (inputctl->inheaders) {	/* 1st SOS */

+      initial_setup(cinfo);

+      inputctl->inheaders = FALSE;

+      /* Note: start_input_pass must be called by jdmaster.c

+       * before any more input can be consumed.  jdapimin.c is

+       * responsible for enforcing this sequencing.

+       */

+    } else {			/* 2nd or later SOS marker */

+      if (! inputctl->pub.has_multiple_scans)

+	ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */

+      start_input_pass(cinfo);

+    }

+    break;

+  case JPEG_REACHED_EOI:	/* Found EOI */

+    inputctl->pub.eoi_reached = TRUE;

+    if (inputctl->inheaders) {	/* Tables-only datastream, apparently */

+      if (cinfo->marker->saw_SOF)

+	ERREXIT(cinfo, JERR_SOF_NO_SOS);

+    } else {

+      /* Prevent infinite loop in coef ctlr's decompress_data routine

+       * if user set output_scan_number larger than number of scans.

+       */

+      if (cinfo->output_scan_number > cinfo->input_scan_number)

+	cinfo->output_scan_number = cinfo->input_scan_number;

+    }

+    break;

+  case JPEG_SUSPENDED:

+    break;

+  }

+

+  return val;

+}

+

+

+/*

+ * Reset state to begin a fresh datastream.

+ */

+

+METHODDEF(void)

+reset_input_controller (j_decompress_ptr cinfo)

+{

+  my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;

+

+  inputctl->pub.consume_input = consume_markers;

+  inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */

+  inputctl->pub.eoi_reached = FALSE;

+  inputctl->inheaders = TRUE;

+  /* Reset other modules */

+  (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);

+  (*cinfo->marker->reset_marker_reader) (cinfo);

+  /* Reset progression state -- would be cleaner if entropy decoder did this */

+  cinfo->coef_bits = NULL;

+}

+

+

+/*

+ * Initialize the input controller module.

+ * This is called only once, when the decompression object is created.

+ */

+

+GLOBAL(void)

+jinit_input_controller (j_decompress_ptr cinfo)

+{

+  my_inputctl_ptr inputctl;

+

+  /* Create subobject in permanent pool */

+  inputctl = (my_inputctl_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,

+				SIZEOF(my_input_controller));

+  cinfo->inputctl = (struct jpeg_input_controller *) inputctl;

+  /* Initialize method pointers */

+  inputctl->pub.consume_input = consume_markers;

+  inputctl->pub.reset_input_controller = reset_input_controller;

+  inputctl->pub.start_input_pass = start_input_pass;

+  inputctl->pub.finish_input_pass = finish_input_pass;

+  /* Initialize state: can't use reset_input_controller since we don't

+   * want to try to reset other modules yet.

+   */

+  inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */

+  inputctl->pub.eoi_reached = FALSE;

+  inputctl->inheaders = TRUE;

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c b/core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c
new file mode 100644
index 0000000..0fc77c7
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c
@@ -0,0 +1,515 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdmainct.c

+ *

+ * Copyright (C) 1994-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains the main buffer controller for decompression.

+ * The main buffer lies between the JPEG decompressor proper and the

+ * post-processor; it holds downsampled data in the JPEG colorspace.

+ *

+ * Note that this code is bypassed in raw-data mode, since the application

+ * supplies the equivalent of the main buffer in that case.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/*

+ * In the current system design, the main buffer need never be a full-image

+ * buffer; any full-height buffers will be found inside the coefficient or

+ * postprocessing controllers.  Nonetheless, the main controller is not

+ * trivial.  Its responsibility is to provide context rows for upsampling/

+ * rescaling, and doing this in an efficient fashion is a bit tricky.

+ *

+ * Postprocessor input data is counted in "row groups".  A row group

+ * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)

+ * sample rows of each component.  (We require DCT_scaled_size values to be

+ * chosen such that these numbers are integers.  In practice DCT_scaled_size

+ * values will likely be powers of two, so we actually have the stronger

+ * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.)

+ * Upsampling will typically produce max_v_samp_factor pixel rows from each

+ * row group (times any additional scale factor that the upsampler is

+ * applying).

+ *

+ * The coefficient controller will deliver data to us one iMCU row at a time;

+ * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or

+ * exactly min_DCT_scaled_size row groups.  (This amount of data corresponds

+ * to one row of MCUs when the image is fully interleaved.)  Note that the

+ * number of sample rows varies across components, but the number of row

+ * groups does not.  Some garbage sample rows may be included in the last iMCU

+ * row at the bottom of the image.

+ *

+ * Depending on the vertical scaling algorithm used, the upsampler may need

+ * access to the sample row(s) above and below its current input row group.

+ * The upsampler is required to set need_context_rows TRUE at global selection

+ * time if so.  When need_context_rows is FALSE, this controller can simply

+ * obtain one iMCU row at a time from the coefficient controller and dole it

+ * out as row groups to the postprocessor.

+ *

+ * When need_context_rows is TRUE, this controller guarantees that the buffer

+ * passed to postprocessing contains at least one row group's worth of samples

+ * above and below the row group(s) being processed.  Note that the context

+ * rows "above" the first passed row group appear at negative row offsets in

+ * the passed buffer.  At the top and bottom of the image, the required

+ * context rows are manufactured by duplicating the first or last real sample

+ * row; this avoids having special cases in the upsampling inner loops.

+ *

+ * The amount of context is fixed at one row group just because that's a

+ * convenient number for this controller to work with.  The existing

+ * upsamplers really only need one sample row of context.  An upsampler

+ * supporting arbitrary output rescaling might wish for more than one row

+ * group of context when shrinking the image; tough, we don't handle that.

+ * (This is justified by the assumption that downsizing will be handled mostly

+ * by adjusting the DCT_scaled_size values, so that the actual scale factor at

+ * the upsample step needn't be much less than one.)

+ *

+ * To provide the desired context, we have to retain the last two row groups

+ * of one iMCU row while reading in the next iMCU row.  (The last row group

+ * can't be processed until we have another row group for its below-context,

+ * and so we have to save the next-to-last group too for its above-context.)

+ * We could do this most simply by copying data around in our buffer, but

+ * that'd be very slow.  We can avoid copying any data by creating a rather

+ * strange pointer structure.  Here's how it works.  We allocate a workspace

+ * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number

+ * of row groups per iMCU row).  We create two sets of redundant pointers to

+ * the workspace.  Labeling the physical row groups 0 to M+1, the synthesized

+ * pointer lists look like this:

+ *                   M+1                          M-1

+ * master pointer --> 0         master pointer --> 0

+ *                    1                            1

+ *                   ...                          ...

+ *                   M-3                          M-3

+ *                   M-2                           M

+ *                   M-1                          M+1

+ *                    M                           M-2

+ *                   M+1                          M-1

+ *                    0                            0

+ * We read alternate iMCU rows using each master pointer; thus the last two

+ * row groups of the previous iMCU row remain un-overwritten in the workspace.

+ * The pointer lists are set up so that the required context rows appear to

+ * be adjacent to the proper places when we pass the pointer lists to the

+ * upsampler.

+ *

+ * The above pictures describe the normal state of the pointer lists.

+ * At top and bottom of the image, we diddle the pointer lists to duplicate

+ * the first or last sample row as necessary (this is cheaper than copying

+ * sample rows around).

+ *

+ * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1.  In that

+ * situation each iMCU row provides only one row group so the buffering logic

+ * must be different (eg, we must read two iMCU rows before we can emit the

+ * first row group).  For now, we simply do not support providing context

+ * rows when min_DCT_scaled_size is 1.  That combination seems unlikely to

+ * be worth providing --- if someone wants a 1/8th-size preview, they probably

+ * want it quick and dirty, so a context-free upsampler is sufficient.

+ */

+

+

+/* Private buffer controller object */

+

+typedef struct {

+  struct jpeg_d_main_controller pub; /* public fields */

+

+  /* Pointer to allocated workspace (M or M+2 row groups). */

+  JSAMPARRAY buffer[MAX_COMPONENTS];

+

+  boolean buffer_full;		/* Have we gotten an iMCU row from decoder? */

+  JDIMENSION rowgroup_ctr;	/* counts row groups output to postprocessor */

+

+  /* Remaining fields are only used in the context case. */

+

+  /* These are the master pointers to the funny-order pointer lists. */

+  JSAMPIMAGE xbuffer[2];	/* pointers to weird pointer lists */

+

+  int whichptr;			/* indicates which pointer set is now in use */

+  int context_state;		/* process_data state machine status */

+  JDIMENSION rowgroups_avail;	/* row groups available to postprocessor */

+  JDIMENSION iMCU_row_ctr;	/* counts iMCU rows to detect image top/bot */

+} my_main_controller;

+

+typedef my_main_controller * my_main_ptr;

+

+/* context_state values: */

+#define CTX_PREPARE_FOR_IMCU	0	/* need to prepare for MCU row */

+#define CTX_PROCESS_IMCU	1	/* feeding iMCU to postprocessor */

+#define CTX_POSTPONED_ROW	2	/* feeding postponed row group */

+

+

+/* Forward declarations */

+METHODDEF(void) process_data_simple_main

+	JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,

+	     JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));

+METHODDEF(void) process_data_context_main

+	JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,

+	     JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));

+#ifdef QUANT_2PASS_SUPPORTED

+METHODDEF(void) process_data_crank_post

+	JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,

+	     JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));

+#endif

+

+

+LOCAL(void)

+alloc_funny_pointers (j_decompress_ptr cinfo)

+/* Allocate space for the funny pointer lists.

+ * This is done only once, not once per pass.

+ */

+{

+  my_main_ptr main = (my_main_ptr) cinfo->main;

+  int ci, rgroup;

+  int M = cinfo->min_DCT_scaled_size;

+  jpeg_component_info *compptr;

+  JSAMPARRAY xbuf;

+

+  /* Get top-level space for component array pointers.

+   * We alloc both arrays with one call to save a few cycles.

+   */

+  main->xbuffer[0] = (JSAMPIMAGE)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));

+  main->xbuffer[1] = main->xbuffer[0] + cinfo->num_components;

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /

+      cinfo->min_DCT_scaled_size; /* height of a row group of component */

+    /* Get space for pointer lists --- M+4 row groups in each list.

+     * We alloc both pointer lists with one call to save a few cycles.

+     */

+    xbuf = (JSAMPARRAY)

+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				  2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));

+    xbuf += rgroup;		/* want one row group at negative offsets */

+    main->xbuffer[0][ci] = xbuf;

+    xbuf += rgroup * (M + 4);

+    main->xbuffer[1][ci] = xbuf;

+  }

+}

+

+

+LOCAL(void)

+make_funny_pointers (j_decompress_ptr cinfo)

+/* Create the funny pointer lists discussed in the comments above.

+ * The actual workspace is already allocated (in main->buffer),

+ * and the space for the pointer lists is allocated too.

+ * This routine just fills in the curiously ordered lists.

+ * This will be repeated at the beginning of each pass.

+ */

+{

+  my_main_ptr main = (my_main_ptr) cinfo->main;

+  int ci, i, rgroup;

+  int M = cinfo->min_DCT_scaled_size;

+  jpeg_component_info *compptr;

+  JSAMPARRAY buf, xbuf0, xbuf1;

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /

+      cinfo->min_DCT_scaled_size; /* height of a row group of component */

+    xbuf0 = main->xbuffer[0][ci];

+    xbuf1 = main->xbuffer[1][ci];

+    /* First copy the workspace pointers as-is */

+    buf = main->buffer[ci];

+    for (i = 0; i < rgroup * (M + 2); i++) {

+      xbuf0[i] = xbuf1[i] = buf[i];

+    }

+    /* In the second list, put the last four row groups in swapped order */

+    for (i = 0; i < rgroup * 2; i++) {

+      xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i];

+      xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i];

+    }

+    /* The wraparound pointers at top and bottom will be filled later

+     * (see set_wraparound_pointers, below).  Initially we want the "above"

+     * pointers to duplicate the first actual data line.  This only needs

+     * to happen in xbuffer[0].

+     */

+    for (i = 0; i < rgroup; i++) {

+      xbuf0[i - rgroup] = xbuf0[0];

+    }

+  }

+}

+

+

+LOCAL(void)

+set_wraparound_pointers (j_decompress_ptr cinfo)

+/* Set up the "wraparound" pointers at top and bottom of the pointer lists.

+ * This changes the pointer list state from top-of-image to the normal state.

+ */

+{

+  my_main_ptr main = (my_main_ptr) cinfo->main;

+  int ci, i, rgroup;

+  int M = cinfo->min_DCT_scaled_size;

+  jpeg_component_info *compptr;

+  JSAMPARRAY xbuf0, xbuf1;

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /

+      cinfo->min_DCT_scaled_size; /* height of a row group of component */

+    xbuf0 = main->xbuffer[0][ci];

+    xbuf1 = main->xbuffer[1][ci];

+    for (i = 0; i < rgroup; i++) {

+      xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];

+      xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];

+      xbuf0[rgroup*(M+2) + i] = xbuf0[i];

+      xbuf1[rgroup*(M+2) + i] = xbuf1[i];

+    }

+  }

+}

+

+

+LOCAL(void)

+set_bottom_pointers (j_decompress_ptr cinfo)

+/* Change the pointer lists to duplicate the last sample row at the bottom

+ * of the image.  whichptr indicates which xbuffer holds the final iMCU row.

+ * Also sets rowgroups_avail to indicate number of nondummy row groups in row.

+ */

+{

+  my_main_ptr main = (my_main_ptr) cinfo->main;

+  int ci, i, rgroup, iMCUheight, rows_left;

+  jpeg_component_info *compptr;

+  JSAMPARRAY xbuf;

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    /* Count sample rows in one iMCU row and in one row group */

+    iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size;

+    rgroup = iMCUheight / cinfo->min_DCT_scaled_size;

+    /* Count nondummy sample rows remaining for this component */

+    rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight);

+    if (rows_left == 0) rows_left = iMCUheight;

+    /* Count nondummy row groups.  Should get same answer for each component,

+     * so we need only do it once.

+     */

+    if (ci == 0) {

+      main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);

+    }

+    /* Duplicate the last real sample row rgroup*2 times; this pads out the

+     * last partial rowgroup and ensures at least one full rowgroup of context.

+     */

+    xbuf = main->xbuffer[main->whichptr][ci];

+    for (i = 0; i < rgroup * 2; i++) {

+      xbuf[rows_left + i] = xbuf[rows_left-1];

+    }

+  }

+}

+

+

+/*

+ * Initialize for a processing pass.

+ */

+

+METHODDEF(void)

+start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)

+{

+  my_main_ptr main = (my_main_ptr) cinfo->main;

+

+  switch (pass_mode) {

+  case JBUF_PASS_THRU:

+    if (cinfo->upsample->need_context_rows) {

+      main->pub.process_data = process_data_context_main;

+      make_funny_pointers(cinfo); /* Create the xbuffer[] lists */

+      main->whichptr = 0;	/* Read first iMCU row into xbuffer[0] */

+      main->context_state = CTX_PREPARE_FOR_IMCU;

+      main->iMCU_row_ctr = 0;

+    } else {

+      /* Simple case with no context needed */

+      main->pub.process_data = process_data_simple_main;

+    }

+    main->buffer_full = FALSE;	/* Mark buffer empty */

+    main->rowgroup_ctr = 0;

+    break;

+#ifdef QUANT_2PASS_SUPPORTED

+  case JBUF_CRANK_DEST:

+    /* For last pass of 2-pass quantization, just crank the postprocessor */

+    main->pub.process_data = process_data_crank_post;

+    break;

+#endif

+  default:

+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+    break;

+  }

+}

+

+

+/*

+ * Process some data.

+ * This handles the simple case where no context is required.

+ */

+

+METHODDEF(void)

+process_data_simple_main (j_decompress_ptr cinfo,

+			  JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+			  JDIMENSION out_rows_avail)

+{

+  my_main_ptr main = (my_main_ptr) cinfo->main;

+  JDIMENSION rowgroups_avail;

+

+  /* Read input data if we haven't filled the main buffer yet */

+  if (! main->buffer_full) {

+    if (! (*cinfo->coef->decompress_data) (cinfo, main->buffer))

+      return;			/* suspension forced, can do nothing more */

+    main->buffer_full = TRUE;	/* OK, we have an iMCU row to work with */

+  }

+

+  /* There are always min_DCT_scaled_size row groups in an iMCU row. */

+  rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size;

+  /* Note: at the bottom of the image, we may pass extra garbage row groups

+   * to the postprocessor.  The postprocessor has to check for bottom

+   * of image anyway (at row resolution), so no point in us doing it too.

+   */

+

+  /* Feed the postprocessor */

+  (*cinfo->post->post_process_data) (cinfo, main->buffer,

+				     &main->rowgroup_ctr, rowgroups_avail,

+				     output_buf, out_row_ctr, out_rows_avail);

+

+  /* Has postprocessor consumed all the data yet? If so, mark buffer empty */

+  if (main->rowgroup_ctr >= rowgroups_avail) {

+    main->buffer_full = FALSE;

+    main->rowgroup_ctr = 0;

+  }

+}

+

+

+/*

+ * Process some data.

+ * This handles the case where context rows must be provided.

+ */

+

+METHODDEF(void)

+process_data_context_main (j_decompress_ptr cinfo,

+			   JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+			   JDIMENSION out_rows_avail)

+{

+  my_main_ptr main = (my_main_ptr) cinfo->main;

+

+  /* Read input data if we haven't filled the main buffer yet */

+  if (! main->buffer_full) {

+    if (! (*cinfo->coef->decompress_data) (cinfo,

+					   main->xbuffer[main->whichptr]))

+      return;			/* suspension forced, can do nothing more */

+    main->buffer_full = TRUE;	/* OK, we have an iMCU row to work with */

+    main->iMCU_row_ctr++;	/* count rows received */

+  }

+

+  /* Postprocessor typically will not swallow all the input data it is handed

+   * in one call (due to filling the output buffer first).  Must be prepared

+   * to exit and restart.  This switch lets us keep track of how far we got.

+   * Note that each case falls through to the next on successful completion.

+   */

+  switch (main->context_state) {

+  case CTX_POSTPONED_ROW:

+    /* Call postprocessor using previously set pointers for postponed row */

+    (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],

+			&main->rowgroup_ctr, main->rowgroups_avail,

+			output_buf, out_row_ctr, out_rows_avail);

+    if (main->rowgroup_ctr < main->rowgroups_avail)

+      return;			/* Need to suspend */

+    main->context_state = CTX_PREPARE_FOR_IMCU;

+    if (*out_row_ctr >= out_rows_avail)

+      return;			/* Postprocessor exactly filled output buf */

+    /*FALLTHROUGH*/

+  case CTX_PREPARE_FOR_IMCU:

+    /* Prepare to process first M-1 row groups of this iMCU row */

+    main->rowgroup_ctr = 0;

+    main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1);

+    /* Check for bottom of image: if so, tweak pointers to "duplicate"

+     * the last sample row, and adjust rowgroups_avail to ignore padding rows.

+     */

+    if (main->iMCU_row_ctr == cinfo->total_iMCU_rows)

+      set_bottom_pointers(cinfo);

+    main->context_state = CTX_PROCESS_IMCU;

+    /*FALLTHROUGH*/

+  case CTX_PROCESS_IMCU:

+    /* Call postprocessor using previously set pointers */

+    (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],

+			&main->rowgroup_ctr, main->rowgroups_avail,

+			output_buf, out_row_ctr, out_rows_avail);

+    if (main->rowgroup_ctr < main->rowgroups_avail)

+      return;			/* Need to suspend */

+    /* After the first iMCU, change wraparound pointers to normal state */

+    if (main->iMCU_row_ctr == 1)

+      set_wraparound_pointers(cinfo);

+    /* Prepare to load new iMCU row using other xbuffer list */

+    main->whichptr ^= 1;	/* 0=>1 or 1=>0 */

+    main->buffer_full = FALSE;

+    /* Still need to process last row group of this iMCU row, */

+    /* which is saved at index M+1 of the other xbuffer */

+    main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1);

+    main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2);

+    main->context_state = CTX_POSTPONED_ROW;

+  }

+}

+

+

+/*

+ * Process some data.

+ * Final pass of two-pass quantization: just call the postprocessor.

+ * Source data will be the postprocessor controller's internal buffer.

+ */

+

+#ifdef QUANT_2PASS_SUPPORTED

+

+METHODDEF(void)

+process_data_crank_post (j_decompress_ptr cinfo,

+			 JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+			 JDIMENSION out_rows_avail)

+{

+  (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,

+				     (JDIMENSION *) NULL, (JDIMENSION) 0,

+				     output_buf, out_row_ctr, out_rows_avail);

+}

+

+#endif /* QUANT_2PASS_SUPPORTED */

+

+

+/*

+ * Initialize main buffer controller.

+ */

+

+GLOBAL(void)

+jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)

+{

+  my_main_ptr main;

+  int ci, rgroup, ngroups;

+  jpeg_component_info *compptr;

+

+  main = (my_main_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_main_controller));

+  cinfo->main = (struct jpeg_d_main_controller *) main;

+  main->pub.start_pass = start_pass_main;

+

+  if (need_full_buffer)		/* shouldn't happen */

+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+

+  /* Allocate the workspace.

+   * ngroups is the number of row groups we need.

+   */

+  if (cinfo->upsample->need_context_rows) {

+    if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */

+      ERREXIT(cinfo, JERR_NOTIMPL);

+    alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */

+    ngroups = cinfo->min_DCT_scaled_size + 2;

+  } else {

+    ngroups = cinfo->min_DCT_scaled_size;

+  }

+

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /

+      cinfo->min_DCT_scaled_size; /* height of a row group of component */

+    main->buffer[ci] = (*cinfo->mem->alloc_sarray)

+			((j_common_ptr) cinfo, JPOOL_IMAGE,

+			 compptr->width_in_blocks * compptr->DCT_scaled_size,

+			 (JDIMENSION) (rgroup * ngroups));

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c b/core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c
new file mode 100644
index 0000000..60f2139
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c
@@ -0,0 +1,1396 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdmarker.c

+ *

+ * Copyright (C) 1991-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains routines to decode JPEG datastream markers.

+ * Most of the complexity arises from our desire to support input

+ * suspension: if not all of the data for a marker is available,

+ * we must exit back to the application.  On resumption, we reprocess

+ * the marker.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+typedef enum {			/* JPEG marker codes */

+  M_SOF0  = 0xc0,

+  M_SOF1  = 0xc1,

+  M_SOF2  = 0xc2,

+  M_SOF3  = 0xc3,

+  

+  M_SOF5  = 0xc5,

+  M_SOF6  = 0xc6,

+  M_SOF7  = 0xc7,

+  

+  M_JPG   = 0xc8,

+  M_SOF9  = 0xc9,

+  M_SOF10 = 0xca,

+  M_SOF11 = 0xcb,

+  

+  M_SOF13 = 0xcd,

+  M_SOF14 = 0xce,

+  M_SOF15 = 0xcf,

+  

+  M_DHT   = 0xc4,

+  

+  M_DAC   = 0xcc,

+  

+  M_RST0  = 0xd0,

+  M_RST1  = 0xd1,

+  M_RST2  = 0xd2,

+  M_RST3  = 0xd3,

+  M_RST4  = 0xd4,

+  M_RST5  = 0xd5,

+  M_RST6  = 0xd6,

+  M_RST7  = 0xd7,

+  

+  M_SOI   = 0xd8,

+  M_EOI   = 0xd9,

+  M_SOS   = 0xda,

+  M_DQT   = 0xdb,

+  M_DNL   = 0xdc,

+  M_DRI   = 0xdd,

+  M_DHP   = 0xde,

+  M_EXP   = 0xdf,

+  

+  M_APP0  = 0xe0,

+  M_APP1  = 0xe1,

+  M_APP2  = 0xe2,

+  M_APP3  = 0xe3,

+  M_APP4  = 0xe4,

+  M_APP5  = 0xe5,

+  M_APP6  = 0xe6,

+  M_APP7  = 0xe7,

+  M_APP8  = 0xe8,

+  M_APP9  = 0xe9,

+  M_APP10 = 0xea,

+  M_APP11 = 0xeb,

+  M_APP12 = 0xec,

+  M_APP13 = 0xed,

+  M_APP14 = 0xee,

+  M_APP15 = 0xef,

+  

+  M_JPG0  = 0xf0,

+  M_JPG13 = 0xfd,

+  M_COM   = 0xfe,

+  

+  M_TEM   = 0x01,

+  

+  M_ERROR = 0x100

+} JPEG_MARKER;

+

+

+/* Private state */

+

+typedef struct {

+  struct jpeg_marker_reader pub; /* public fields */

+

+  /* Application-overridable marker processing methods */

+  jpeg_marker_parser_method process_COM;

+  jpeg_marker_parser_method process_APPn[16];

+

+  /* Limit on marker data length to save for each marker type */

+  unsigned int length_limit_COM;

+  unsigned int length_limit_APPn[16];

+

+  /* Status of COM/APPn marker saving */

+  jpeg_saved_marker_ptr cur_marker;	/* NULL if not processing a marker */

+  unsigned int bytes_read;		/* data bytes read so far in marker */

+  /* Note: cur_marker is not linked into marker_list until it's all read. */

+} my_marker_reader;

+

+typedef my_marker_reader * my_marker_ptr;

+

+

+/*

+ * Macros for fetching data from the data source module.

+ *

+ * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect

+ * the current restart point; we update them only when we have reached a

+ * suitable place to restart if a suspension occurs.

+ */

+

+/* Declare and initialize local copies of input pointer/count */

+#define INPUT_VARS(cinfo)  \

+	struct jpeg_source_mgr * datasrc = (cinfo)->src;  \

+	const JOCTET * next_input_byte = datasrc->next_input_byte;  \

+	size_t bytes_in_buffer = datasrc->bytes_in_buffer

+

+/* Unload the local copies --- do this only at a restart boundary */

+#define INPUT_SYNC(cinfo)  \

+	( datasrc->next_input_byte = next_input_byte,  \

+	  datasrc->bytes_in_buffer = bytes_in_buffer )

+

+/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */

+#define INPUT_RELOAD(cinfo)  \

+	( next_input_byte = datasrc->next_input_byte,  \

+	  bytes_in_buffer = datasrc->bytes_in_buffer )

+

+/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available.

+ * Note we do *not* do INPUT_SYNC before calling fill_input_buffer,

+ * but we must reload the local copies after a successful fill.

+ */

+#define MAKE_BYTE_AVAIL(cinfo,action)  \

+	if (bytes_in_buffer == 0) {  \

+	  if (! (*datasrc->fill_input_buffer) (cinfo))  \

+	    { action; }  \

+	  INPUT_RELOAD(cinfo);  \

+	}

+

+/* Read a byte into variable V.

+ * If must suspend, take the specified action (typically "return FALSE").

+ */

+#define INPUT_BYTE(cinfo,V,action)  \

+	MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \

+		  bytes_in_buffer--; \

+		  V = GETJOCTET(*next_input_byte++); )

+

+/* As above, but read two bytes interpreted as an unsigned 16-bit integer.

+ * V should be declared unsigned int or perhaps INT32.

+ */

+#define INPUT_2BYTES(cinfo,V,action)  \

+	MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \

+		  bytes_in_buffer--; \

+		  V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \

+		  MAKE_BYTE_AVAIL(cinfo,action); \

+		  bytes_in_buffer--; \

+		  V += GETJOCTET(*next_input_byte++); )

+

+

+/*

+ * Routines to process JPEG markers.

+ *

+ * Entry condition: JPEG marker itself has been read and its code saved

+ *   in cinfo->unread_marker; input restart point is just after the marker.

+ *

+ * Exit: if return TRUE, have read and processed any parameters, and have

+ *   updated the restart point to point after the parameters.

+ *   If return FALSE, was forced to suspend before reaching end of

+ *   marker parameters; restart point has not been moved.  Same routine

+ *   will be called again after application supplies more input data.

+ *

+ * This approach to suspension assumes that all of a marker's parameters

+ * can fit into a single input bufferload.  This should hold for "normal"

+ * markers.  Some COM/APPn markers might have large parameter segments

+ * that might not fit.  If we are simply dropping such a marker, we use

+ * skip_input_data to get past it, and thereby put the problem on the

+ * source manager's shoulders.  If we are saving the marker's contents

+ * into memory, we use a slightly different convention: when forced to

+ * suspend, the marker processor updates the restart point to the end of

+ * what it's consumed (ie, the end of the buffer) before returning FALSE.

+ * On resumption, cinfo->unread_marker still contains the marker code,

+ * but the data source will point to the next chunk of marker data.

+ * The marker processor must retain internal state to deal with this.

+ *

+ * Note that we don't bother to avoid duplicate trace messages if a

+ * suspension occurs within marker parameters.  Other side effects

+ * require more care.

+ */

+

+

+LOCAL(boolean)

+get_soi (j_decompress_ptr cinfo)

+/* Process an SOI marker */

+{

+  int i;

+  

+  TRACEMS(cinfo, 1, JTRC_SOI);

+

+  if (cinfo->marker->saw_SOI)

+    ERREXIT(cinfo, JERR_SOI_DUPLICATE);

+

+  /* Reset all parameters that are defined to be reset by SOI */

+

+  for (i = 0; i < NUM_ARITH_TBLS; i++) {

+    cinfo->arith_dc_L[i] = 0;

+    cinfo->arith_dc_U[i] = 1;

+    cinfo->arith_ac_K[i] = 5;

+  }

+  cinfo->restart_interval = 0;

+

+  /* Set initial assumptions for colorspace etc */

+

+  cinfo->jpeg_color_space = JCS_UNKNOWN;

+  cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */

+

+  cinfo->saw_JFIF_marker = FALSE;

+  cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */

+  cinfo->JFIF_minor_version = 1;

+  cinfo->density_unit = 0;

+  cinfo->X_density = 1;

+  cinfo->Y_density = 1;

+  cinfo->saw_Adobe_marker = FALSE;

+  cinfo->Adobe_transform = 0;

+

+  cinfo->marker->saw_SOI = TRUE;

+

+  return TRUE;

+}

+

+

+LOCAL(boolean)

+get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith)

+/* Process a SOFn marker */

+{

+  INT32 length;

+  int c, ci;

+  jpeg_component_info * compptr;

+  /* LiuSunliang added 20111209 */

+  JDIMENSION image_width, image_height;

+  INPUT_VARS(cinfo);

+

+  cinfo->progressive_mode = is_prog;

+  cinfo->arith_code = is_arith;

+

+  INPUT_2BYTES(cinfo, length, return FALSE);

+

+  INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE);

+  INPUT_2BYTES(cinfo, image_height, return FALSE);

+  INPUT_2BYTES(cinfo, image_width, return FALSE);

+  INPUT_BYTE(cinfo, cinfo->num_components, return FALSE);

+

+  if (image_width <= JPEG_MAX_DIMENSION)

+	  cinfo->image_width = image_width;

+ 

+  if (image_height <= JPEG_MAX_DIMENSION)

+	  cinfo->image_height = image_height;

+

+  length -= 8;

+

+  TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker,

+	   (int) cinfo->image_width, (int) cinfo->image_height,

+	   cinfo->num_components);

+

+  if (cinfo->marker->saw_SOF)

+    ERREXIT(cinfo, JERR_SOF_DUPLICATE);

+

+  /* We don't support files in which the image height is initially specified */

+  /* as 0 and is later redefined by DNL.  As long as we have to check that,  */

+  /* might as well have a general sanity check. */

+  if (cinfo->image_height <= 0 || cinfo->image_width <= 0

+      || cinfo->num_components <= 0)

+    ERREXIT(cinfo, JERR_EMPTY_IMAGE);

+

+  if (length != (cinfo->num_components * 3))

+    ERREXIT(cinfo, JERR_BAD_LENGTH);

+

+  if (cinfo->comp_info == NULL)	/* do only once, even if suspend */

+    cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)

+			((j_common_ptr) cinfo, JPOOL_IMAGE,

+			 cinfo->num_components * SIZEOF(jpeg_component_info));

+  

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    compptr->component_index = ci;

+    INPUT_BYTE(cinfo, compptr->component_id, return FALSE);

+	/* XYQ 2008-03-25: Adobe CMYK JPEG has serious flaw: the K channel has same component id as C channel */

+	{

+		int i;

+		for (i = 0; i < ci; i ++)

+			if (compptr->component_id == cinfo->comp_info[i].component_id) break;

+		if (i < ci)

+			/* Found the error! We replace the id with something unlikely used elsewhere */

+			compptr->component_id += 0xf0;

+	}

+	/* end of modification */

+    INPUT_BYTE(cinfo, c, return FALSE);

+    compptr->h_samp_factor = (c >> 4) & 15;

+    compptr->v_samp_factor = (c     ) & 15;

+    INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE);

+

+    TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT,

+	     compptr->component_id, compptr->h_samp_factor,

+	     compptr->v_samp_factor, compptr->quant_tbl_no);

+  }

+

+  cinfo->marker->saw_SOF = TRUE;

+

+  INPUT_SYNC(cinfo);

+  return TRUE;

+}

+

+

+LOCAL(boolean)

+get_sos (j_decompress_ptr cinfo)

+/* Process a SOS marker */

+{

+  INT32 length;

+  int i, ci, n, c, cc;

+  jpeg_component_info * compptr;

+  INPUT_VARS(cinfo);

+

+  if (! cinfo->marker->saw_SOF)

+    ERREXIT(cinfo, JERR_SOS_NO_SOF);

+

+  INPUT_2BYTES(cinfo, length, return FALSE);

+

+  INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */

+

+  TRACEMS1(cinfo, 1, JTRC_SOS, n);

+

+  if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN)

+    ERREXIT(cinfo, JERR_BAD_LENGTH);

+

+  cinfo->comps_in_scan = n;

+

+  /* Collect the component-spec parameters */

+

+  for (i = 0; i < n; i++) {

+    INPUT_BYTE(cinfo, cc, return FALSE);

+    INPUT_BYTE(cinfo, c, return FALSE);

+    

+	/* XYQ 2008-03-25: Adobe CMYK JPEG has serious flaw: the K channel has same component id as C channel */

+	{

+		int j;

+		for (j = 0; j < i; j ++)

+			if (cc == cinfo->cur_comp_info[j]->component_id) break;

+		if (j < i)

+			/* found the error! */

+			cc += 0xf0;

+	}

+	/* end of modification */

+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+	 ci++, compptr++) {

+      if (cc == compptr->component_id)

+	goto id_found;

+    }

+

+    ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);

+

+  id_found:

+

+    cinfo->cur_comp_info[i] = compptr;

+    compptr->dc_tbl_no = (c >> 4) & 15;

+    compptr->ac_tbl_no = (c     ) & 15;

+    

+    TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,

+	     compptr->dc_tbl_no, compptr->ac_tbl_no);

+	/* This CSi (cc) should differ from the previous CSi */

+    for (ci = 0; ci < i; ci++) {

+      if (cinfo->cur_comp_info[ci] == compptr)

+        ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);

+    }

+  }

+

+  /* Collect the additional scan parameters Ss, Se, Ah/Al. */

+  INPUT_BYTE(cinfo, c, return FALSE);

+  cinfo->Ss = c;

+  INPUT_BYTE(cinfo, c, return FALSE);

+  cinfo->Se = c;

+  INPUT_BYTE(cinfo, c, return FALSE);

+  cinfo->Ah = (c >> 4) & 15;

+  cinfo->Al = (c     ) & 15;

+

+  TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se,

+	   cinfo->Ah, cinfo->Al);

+

+  /* Prepare to scan data & restart markers */

+  cinfo->marker->next_restart_num = 0;

+

+  /* Count another SOS marker */

+  cinfo->input_scan_number++;

+

+  INPUT_SYNC(cinfo);

+  return TRUE;

+}

+

+

+#ifdef D_ARITH_CODING_SUPPORTED

+

+LOCAL(boolean)

+get_dac (j_decompress_ptr cinfo)

+/* Process a DAC marker */

+{

+  INT32 length;

+  int index, val;

+  INPUT_VARS(cinfo);

+

+  INPUT_2BYTES(cinfo, length, return FALSE);

+  length -= 2;

+  

+  while (length > 0) {

+    INPUT_BYTE(cinfo, index, return FALSE);

+    INPUT_BYTE(cinfo, val, return FALSE);

+

+    length -= 2;

+

+    TRACEMS2(cinfo, 1, JTRC_DAC, index, val);

+

+    if (index < 0 || index >= (2*NUM_ARITH_TBLS))

+      ERREXIT1(cinfo, JERR_DAC_INDEX, index);

+

+    if (index >= NUM_ARITH_TBLS) { /* define AC table */

+      cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val;

+    } else {			/* define DC table */

+      cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F);

+      cinfo->arith_dc_U[index] = (UINT8) (val >> 4);

+      if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index])

+	ERREXIT1(cinfo, JERR_DAC_VALUE, val);

+    }

+  }

+

+  if (length != 0)

+    ERREXIT(cinfo, JERR_BAD_LENGTH);

+

+  INPUT_SYNC(cinfo);

+  return TRUE;

+}

+

+#else /* ! D_ARITH_CODING_SUPPORTED */

+

+#define get_dac(cinfo)  skip_variable(cinfo)

+

+#endif /* D_ARITH_CODING_SUPPORTED */

+

+

+LOCAL(boolean)

+get_dht (j_decompress_ptr cinfo)

+/* Process a DHT marker */

+{

+  INT32 length;

+  UINT8 bits[17];

+  UINT8 huffval[256];

+  int i, index, count;

+  JHUFF_TBL **htblptr;

+  INPUT_VARS(cinfo);

+

+  INPUT_2BYTES(cinfo, length, return FALSE);

+  length -= 2;

+  

+  while (length > 16) {

+    INPUT_BYTE(cinfo, index, return FALSE);

+

+    TRACEMS1(cinfo, 1, JTRC_DHT, index);

+      

+    bits[0] = 0;

+    count = 0;

+    for (i = 1; i <= 16; i++) {

+      INPUT_BYTE(cinfo, bits[i], return FALSE);

+      count += bits[i];

+    }

+

+    length -= 1 + 16;

+

+    TRACEMS8(cinfo, 2, JTRC_HUFFBITS,

+	     bits[1], bits[2], bits[3], bits[4],

+	     bits[5], bits[6], bits[7], bits[8]);

+    TRACEMS8(cinfo, 2, JTRC_HUFFBITS,

+	     bits[9], bits[10], bits[11], bits[12],

+	     bits[13], bits[14], bits[15], bits[16]);

+

+    /* Here we just do minimal validation of the counts to avoid walking

+     * off the end of our table space.  jdhuff.c will check more carefully.

+     */

+    if (count > 256 || ((INT32) count) > length)

+      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);

+

+    for (i = 0; i < count; i++)

+      INPUT_BYTE(cinfo, huffval[i], return FALSE);

+

+    length -= count;

+

+    if (index & 0x10) {		/* AC table definition */

+      index -= 0x10;

+      htblptr = &cinfo->ac_huff_tbl_ptrs[index];

+    } else {			/* DC table definition */

+      htblptr = &cinfo->dc_huff_tbl_ptrs[index];

+    }

+

+    if (index < 0 || index >= NUM_HUFF_TBLS)

+      ERREXIT1(cinfo, JERR_DHT_INDEX, index);

+

+    if (*htblptr == NULL)

+      *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);

+  

+    MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));

+    MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval));

+  }

+

+  if (length != 0)

+    ERREXIT(cinfo, JERR_BAD_LENGTH);

+

+  INPUT_SYNC(cinfo);

+  return TRUE;

+}

+

+

+LOCAL(boolean)

+get_dqt (j_decompress_ptr cinfo)

+/* Process a DQT marker */

+{

+  INT32 length;

+  int n, i, prec;

+  unsigned int tmp;

+  JQUANT_TBL *quant_ptr;

+  INPUT_VARS(cinfo);

+

+  INPUT_2BYTES(cinfo, length, return FALSE);

+  length -= 2;

+

+  while (length > 0) {

+    INPUT_BYTE(cinfo, n, return FALSE);

+    prec = n >> 4;

+    n &= 0x0F;

+

+    TRACEMS2(cinfo, 1, JTRC_DQT, n, prec);

+

+    if (n >= NUM_QUANT_TBLS)

+      ERREXIT1(cinfo, JERR_DQT_INDEX, n);

+      

+    if (cinfo->quant_tbl_ptrs[n] == NULL)

+      cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo);

+    quant_ptr = cinfo->quant_tbl_ptrs[n];

+

+    for (i = 0; i < DCTSIZE2; i++) {

+      if (prec)

+	INPUT_2BYTES(cinfo, tmp, return FALSE);

+      else

+	INPUT_BYTE(cinfo, tmp, return FALSE);

+      /* We convert the zigzag-order table to natural array order. */

+      quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp;

+    }

+

+    if (cinfo->err->trace_level >= 2) {

+      for (i = 0; i < DCTSIZE2; i += 8) {

+	TRACEMS8(cinfo, 2, JTRC_QUANTVALS,

+		 quant_ptr->quantval[i],   quant_ptr->quantval[i+1],

+		 quant_ptr->quantval[i+2], quant_ptr->quantval[i+3],

+		 quant_ptr->quantval[i+4], quant_ptr->quantval[i+5],

+		 quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]);

+      }

+    }

+

+    length -= DCTSIZE2+1;

+    if (prec) length -= DCTSIZE2;

+  }

+

+  if (length != 0)

+    ERREXIT(cinfo, JERR_BAD_LENGTH);

+

+  INPUT_SYNC(cinfo);

+  return TRUE;

+}

+

+

+LOCAL(boolean)

+get_dri (j_decompress_ptr cinfo)

+/* Process a DRI marker */

+{

+  INT32 length;

+  unsigned int tmp;

+  INPUT_VARS(cinfo);

+

+  INPUT_2BYTES(cinfo, length, return FALSE);

+  

+  if (length != 4)

+    ERREXIT(cinfo, JERR_BAD_LENGTH);

+

+  INPUT_2BYTES(cinfo, tmp, return FALSE);

+

+  TRACEMS1(cinfo, 1, JTRC_DRI, tmp);

+

+  cinfo->restart_interval = tmp;

+

+  INPUT_SYNC(cinfo);

+  return TRUE;

+}

+

+

+/*

+ * Routines for processing APPn and COM markers.

+ * These are either saved in memory or discarded, per application request.

+ * APP0 and APP14 are specially checked to see if they are

+ * JFIF and Adobe markers, respectively.

+ */

+

+#define APP0_DATA_LEN	14	/* Length of interesting data in APP0 */

+#define APP14_DATA_LEN	12	/* Length of interesting data in APP14 */

+#define APPN_DATA_LEN	14	/* Must be the largest of the above!! */

+

+

+LOCAL(void)

+examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,

+	      unsigned int datalen, INT32 remaining)

+/* Examine first few bytes from an APP0.

+ * Take appropriate action if it is a JFIF marker.

+ * datalen is # of bytes at data[], remaining is length of rest of marker data.

+ */

+{

+  INT32 totallen = (INT32) datalen + remaining;

+

+  if (datalen >= APP0_DATA_LEN &&

+      GETJOCTET(data[0]) == 0x4A &&

+      GETJOCTET(data[1]) == 0x46 &&

+      GETJOCTET(data[2]) == 0x49 &&

+      GETJOCTET(data[3]) == 0x46 &&

+      GETJOCTET(data[4]) == 0) {

+    /* Found JFIF APP0 marker: save info */

+    cinfo->saw_JFIF_marker = TRUE;

+    cinfo->JFIF_major_version = GETJOCTET(data[5]);

+    cinfo->JFIF_minor_version = GETJOCTET(data[6]);

+    cinfo->density_unit = GETJOCTET(data[7]);

+    cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);

+    cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);

+    /* Check version.

+     * Major version must be 1, anything else signals an incompatible change.

+     * (We used to treat this as an error, but now it's a nonfatal warning,

+     * because some bozo at Hijaak couldn't read the spec.)

+     * Minor version should be 0..2, but process anyway if newer.

+     */

+    if (cinfo->JFIF_major_version != 1)

+      WARNMS2(cinfo, JWRN_JFIF_MAJOR,

+	      cinfo->JFIF_major_version, cinfo->JFIF_minor_version);

+    /* Generate trace messages */

+    TRACEMS5(cinfo, 1, JTRC_JFIF,

+	     cinfo->JFIF_major_version, cinfo->JFIF_minor_version,

+	     cinfo->X_density, cinfo->Y_density, cinfo->density_unit);

+    /* Validate thumbnail dimensions and issue appropriate messages */

+    if (GETJOCTET(data[12]) | GETJOCTET(data[13]))

+      TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL,

+	       GETJOCTET(data[12]), GETJOCTET(data[13]));

+    totallen -= APP0_DATA_LEN;

+    if (totallen !=

+	((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3))

+      TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen);

+  } else if (datalen >= 6 &&

+      GETJOCTET(data[0]) == 0x4A &&

+      GETJOCTET(data[1]) == 0x46 &&

+      GETJOCTET(data[2]) == 0x58 &&

+      GETJOCTET(data[3]) == 0x58 &&

+      GETJOCTET(data[4]) == 0) {

+    /* Found JFIF "JFXX" extension APP0 marker */

+    /* The library doesn't actually do anything with these,

+     * but we try to produce a helpful trace message.

+     */

+    switch (GETJOCTET(data[5])) {

+    case 0x10:

+      TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen);

+      break;

+    case 0x11:

+      TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen);

+      break;

+    case 0x13:

+      TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen);

+      break;

+    default:

+      TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,

+	       GETJOCTET(data[5]), (int) totallen);

+      break;

+    }

+  } else {

+    /* Start of APP0 does not match "JFIF" or "JFXX", or too short */

+    TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen);

+  }

+}

+

+

+LOCAL(void)

+examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data,

+	       unsigned int datalen, INT32 remaining)

+/* Examine first few bytes from an APP14.

+ * Take appropriate action if it is an Adobe marker.

+ * datalen is # of bytes at data[], remaining is length of rest of marker data.

+ */

+{

+  unsigned int version, flags0, flags1, transform;

+

+  if (datalen >= APP14_DATA_LEN &&

+      GETJOCTET(data[0]) == 0x41 &&

+      GETJOCTET(data[1]) == 0x64 &&

+      GETJOCTET(data[2]) == 0x6F &&

+      GETJOCTET(data[3]) == 0x62 &&

+      GETJOCTET(data[4]) == 0x65) {

+    /* Found Adobe APP14 marker */

+    version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]);

+    flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]);

+    flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]);

+    transform = GETJOCTET(data[11]);

+    TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform);

+    cinfo->saw_Adobe_marker = TRUE;

+    cinfo->Adobe_transform = (UINT8) transform;

+  } else {

+    /* Start of APP14 does not match "Adobe", or too short */

+    TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining));

+  }

+}

+

+

+METHODDEF(boolean)

+get_interesting_appn (j_decompress_ptr cinfo)

+/* Process an APP0 or APP14 marker without saving it */

+{

+  INT32 length;

+  JOCTET b[APPN_DATA_LEN];

+  unsigned int i, numtoread;

+  INPUT_VARS(cinfo);

+

+  INPUT_2BYTES(cinfo, length, return FALSE);

+  length -= 2;

+

+  /* get the interesting part of the marker data */

+  if (length >= APPN_DATA_LEN)

+    numtoread = APPN_DATA_LEN;

+  else if (length > 0)

+    numtoread = (unsigned int) length;

+  else

+    numtoread = 0;

+  for (i = 0; i < numtoread; i++)

+    INPUT_BYTE(cinfo, b[i], return FALSE);

+  length -= numtoread;

+

+  /* process it */

+  switch (cinfo->unread_marker) {

+  case M_APP0:

+    examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length);

+    break;

+  case M_APP14:

+    examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length);

+    break;

+  default:

+    /* can't get here unless jpeg_save_markers chooses wrong processor */

+    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);

+    break;

+  }

+

+  /* skip any remaining data -- could be lots */

+  INPUT_SYNC(cinfo);

+  if (length > 0)

+    (*cinfo->src->skip_input_data) (cinfo, (long) length);

+

+  return TRUE;

+}

+

+

+#ifdef SAVE_MARKERS_SUPPORTED

+

+METHODDEF(boolean)

+save_marker (j_decompress_ptr cinfo)

+/* Save an APPn or COM marker into the marker list */

+{

+  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;

+  jpeg_saved_marker_ptr cur_marker = marker->cur_marker;

+  unsigned int bytes_read, data_length;

+  JOCTET FAR * data;

+  INT32 length = 0;

+  INPUT_VARS(cinfo);

+

+  if (cur_marker == NULL) {

+    /* begin reading a marker */

+    INPUT_2BYTES(cinfo, length, return FALSE);

+    length -= 2;

+    if (length >= 0) {		/* watch out for bogus length word */

+      /* figure out how much we want to save */

+      unsigned int limit;

+      if (cinfo->unread_marker == (int) M_COM)

+	limit = marker->length_limit_COM;

+      else

+	limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0];

+      if ((unsigned int) length < limit)

+	limit = (unsigned int) length;

+      /* allocate and initialize the marker item */

+      cur_marker = (jpeg_saved_marker_ptr)

+	(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				    SIZEOF(struct jpeg_marker_struct) + limit);

+      cur_marker->next = NULL;

+      cur_marker->marker = (UINT8) cinfo->unread_marker;

+      cur_marker->original_length = (unsigned int) length;

+      cur_marker->data_length = limit;

+      /* data area is just beyond the jpeg_marker_struct */

+      data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1);

+      marker->cur_marker = cur_marker;

+      marker->bytes_read = 0;

+      bytes_read = 0;

+      data_length = limit;

+    } else {

+      /* deal with bogus length word */

+      bytes_read = data_length = 0;

+      data = NULL;

+    }

+  } else {

+    /* resume reading a marker */

+    bytes_read = marker->bytes_read;

+    data_length = cur_marker->data_length;

+    data = cur_marker->data + bytes_read;

+  }

+

+  while (bytes_read < data_length) {

+    INPUT_SYNC(cinfo);		/* move the restart point to here */

+    marker->bytes_read = bytes_read;

+    /* If there's not at least one byte in buffer, suspend */

+    MAKE_BYTE_AVAIL(cinfo, return FALSE);

+    /* Copy bytes with reasonable rapidity */

+    while (bytes_read < data_length && bytes_in_buffer > 0) {

+      *data++ = *next_input_byte++;

+      bytes_in_buffer--;

+      bytes_read++;

+    }

+  }

+

+  /* Done reading what we want to read */

+  if (cur_marker != NULL) {	/* will be NULL if bogus length word */

+    /* Add new marker to end of list */

+    if (cinfo->marker_list == NULL) {

+      cinfo->marker_list = cur_marker;

+    } else {

+      jpeg_saved_marker_ptr prev = cinfo->marker_list;

+      while (prev->next != NULL)

+	prev = prev->next;

+      prev->next = cur_marker;

+    }

+    /* Reset pointer & calc remaining data length */

+    data = cur_marker->data;

+    length = cur_marker->original_length - data_length;

+  }

+  /* Reset to initial state for next marker */

+  marker->cur_marker = NULL;

+

+  /* Process the marker if interesting; else just make a generic trace msg */

+  switch (cinfo->unread_marker) {

+  case M_APP0:

+    examine_app0(cinfo, data, data_length, length);

+    break;

+  case M_APP14:

+    examine_app14(cinfo, data, data_length, length);

+    break;

+  default:

+    TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,

+	     (int) (data_length + length));

+    break;

+  }

+

+  /* skip any remaining data -- could be lots */

+  INPUT_SYNC(cinfo);		/* do before skip_input_data */

+  if (length > 0)

+    (*cinfo->src->skip_input_data) (cinfo, (long) length);

+

+  return TRUE;

+}

+

+#endif /* SAVE_MARKERS_SUPPORTED */

+

+

+METHODDEF(boolean)

+skip_variable (j_decompress_ptr cinfo)

+/* Skip over an unknown or uninteresting variable-length marker */

+{

+  INT32 length;

+  INPUT_VARS(cinfo);

+

+  INPUT_2BYTES(cinfo, length, return FALSE);

+  length -= 2;

+  

+  TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length);

+

+  INPUT_SYNC(cinfo);		/* do before skip_input_data */

+  if (length > 0)

+    (*cinfo->src->skip_input_data) (cinfo, (long) length);

+

+  return TRUE;

+}

+

+

+/*

+ * Find the next JPEG marker, save it in cinfo->unread_marker.

+ * Returns FALSE if had to suspend before reaching a marker;

+ * in that case cinfo->unread_marker is unchanged.

+ *

+ * Note that the result might not be a valid marker code,

+ * but it will never be 0 or FF.

+ */

+

+LOCAL(boolean)

+next_marker (j_decompress_ptr cinfo)

+{

+  int c;

+  INPUT_VARS(cinfo);

+

+  for (;;) {

+    INPUT_BYTE(cinfo, c, return FALSE);

+    /* Skip any non-FF bytes.

+     * This may look a bit inefficient, but it will not occur in a valid file.

+     * We sync after each discarded byte so that a suspending data source

+     * can discard the byte from its buffer.

+     */

+    while (c != 0xFF) {

+      cinfo->marker->discarded_bytes++;

+      INPUT_SYNC(cinfo);

+      INPUT_BYTE(cinfo, c, return FALSE);

+    }

+    /* This loop swallows any duplicate FF bytes.  Extra FFs are legal as

+     * pad bytes, so don't count them in discarded_bytes.  We assume there

+     * will not be so many consecutive FF bytes as to overflow a suspending

+     * data source's input buffer.

+     */

+    do {

+      INPUT_BYTE(cinfo, c, return FALSE);

+    } while (c == 0xFF);

+    if (c != 0)

+      break;			/* found a valid marker, exit loop */

+    /* Reach here if we found a stuffed-zero data sequence (FF/00).

+     * Discard it and loop back to try again.

+     */

+    cinfo->marker->discarded_bytes += 2;

+    INPUT_SYNC(cinfo);

+  }

+

+  if (cinfo->marker->discarded_bytes != 0) {

+    WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c);

+    cinfo->marker->discarded_bytes = 0;

+  }

+

+  cinfo->unread_marker = c;

+

+  INPUT_SYNC(cinfo);

+  return TRUE;

+}

+

+

+LOCAL(boolean)

+first_marker (j_decompress_ptr cinfo)

+/* Like next_marker, but used to obtain the initial SOI marker. */

+/* For this marker, we do not allow preceding garbage or fill; otherwise,

+ * we might well scan an entire input file before realizing it ain't JPEG.

+ * If an application wants to process non-JFIF files, it must seek to the

+ * SOI before calling the JPEG library.

+ */

+{

+  int c, c2;

+  INPUT_VARS(cinfo);

+

+  INPUT_BYTE(cinfo, c, return FALSE);

+  INPUT_BYTE(cinfo, c2, return FALSE);

+  if (c != 0xFF || c2 != (int) M_SOI)

+    ERREXIT2(cinfo, JERR_NO_SOI, c, c2);

+

+  cinfo->unread_marker = c2;

+

+  INPUT_SYNC(cinfo);

+  return TRUE;

+}

+

+

+/*

+ * Read markers until SOS or EOI.

+ *

+ * Returns same codes as are defined for jpeg_consume_input:

+ * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.

+ */

+

+METHODDEF(int)

+read_markers (j_decompress_ptr cinfo)

+{

+  /* Outer loop repeats once for each marker. */

+  for (;;) {

+    /* Collect the marker proper, unless we already did. */

+    /* NB: first_marker() enforces the requirement that SOI appear first. */

+    if (cinfo->unread_marker == 0) {

+      if (! cinfo->marker->saw_SOI) {

+	if (! first_marker(cinfo))

+	  return JPEG_SUSPENDED;

+      } else {

+	if (! next_marker(cinfo))

+	  return JPEG_SUSPENDED;

+      }

+    }

+    /* At this point cinfo->unread_marker contains the marker code and the

+     * input point is just past the marker proper, but before any parameters.

+     * A suspension will cause us to return with this state still true.

+     */

+    switch (cinfo->unread_marker) {

+    case M_SOI:

+      if (! get_soi(cinfo))

+	return JPEG_SUSPENDED;

+      break;

+

+    case M_SOF0:		/* Baseline */

+    case M_SOF1:		/* Extended sequential, Huffman */

+      if (! get_sof(cinfo, FALSE, FALSE))

+	return JPEG_SUSPENDED;

+      break;

+

+    case M_SOF2:		/* Progressive, Huffman */

+      if (! get_sof(cinfo, TRUE, FALSE))

+	return JPEG_SUSPENDED;

+      break;

+

+    case M_SOF9:		/* Extended sequential, arithmetic */

+      if (! get_sof(cinfo, FALSE, TRUE))

+	return JPEG_SUSPENDED;

+      break;

+

+    case M_SOF10:		/* Progressive, arithmetic */

+      if (! get_sof(cinfo, TRUE, TRUE))

+	return JPEG_SUSPENDED;

+      break;

+

+    /* Currently unsupported SOFn types */

+    case M_SOF3:		/* Lossless, Huffman */

+    case M_SOF5:		/* Differential sequential, Huffman */

+    case M_SOF6:		/* Differential progressive, Huffman */

+    case M_SOF7:		/* Differential lossless, Huffman */

+    case M_JPG:			/* Reserved for JPEG extensions */

+    case M_SOF11:		/* Lossless, arithmetic */

+    case M_SOF13:		/* Differential sequential, arithmetic */

+    case M_SOF14:		/* Differential progressive, arithmetic */

+    case M_SOF15:		/* Differential lossless, arithmetic */

+      ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker);

+      break;

+

+    case M_SOS:

+      if (! get_sos(cinfo))

+	return JPEG_SUSPENDED;

+      cinfo->unread_marker = 0;	/* processed the marker */

+      return JPEG_REACHED_SOS;

+    

+    case M_EOI:

+      TRACEMS(cinfo, 1, JTRC_EOI);

+      cinfo->unread_marker = 0;	/* processed the marker */

+      return JPEG_REACHED_EOI;

+      

+    case M_DAC:

+      if (! get_dac(cinfo))

+	return JPEG_SUSPENDED;

+      break;

+      

+    case M_DHT:

+      if (! get_dht(cinfo))

+	return JPEG_SUSPENDED;

+      break;

+      

+    case M_DQT:

+      if (! get_dqt(cinfo))

+	return JPEG_SUSPENDED;

+      break;

+      

+    case M_DRI:

+      if (! get_dri(cinfo))

+	return JPEG_SUSPENDED;

+      break;

+      

+    case M_APP0:

+    case M_APP1:

+    case M_APP2:

+    case M_APP3:

+    case M_APP4:

+    case M_APP5:

+    case M_APP6:

+    case M_APP7:

+    case M_APP8:

+    case M_APP9:

+    case M_APP10:

+    case M_APP11:

+    case M_APP12:

+    case M_APP13:

+    case M_APP14:

+    case M_APP15:

+      if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[

+		cinfo->unread_marker - (int) M_APP0]) (cinfo))

+	return JPEG_SUSPENDED;

+      break;

+      

+    case M_COM:

+      if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))

+	return JPEG_SUSPENDED;

+      break;

+

+    case M_RST0:		/* these are all parameterless */

+    case M_RST1:

+    case M_RST2:

+    case M_RST3:

+    case M_RST4:

+    case M_RST5:

+    case M_RST6:

+    case M_RST7:

+    case M_TEM:

+      TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);

+      break;

+

+    case M_DNL:			/* Ignore DNL ... perhaps the wrong thing */

+      if (! skip_variable(cinfo))

+	return JPEG_SUSPENDED;

+      break;

+

+    default:			/* must be DHP, EXP, JPGn, or RESn */

+      /* For now, we treat the reserved markers as fatal errors since they are

+       * likely to be used to signal incompatible JPEG Part 3 extensions.

+       * Once the JPEG 3 version-number marker is well defined, this code

+       * ought to change!

+       */

+      ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);

+      break;

+    }

+    /* Successfully processed marker, so reset state variable */

+    cinfo->unread_marker = 0;

+  } /* end loop */

+}

+

+

+/*

+ * Read a restart marker, which is expected to appear next in the datastream;

+ * if the marker is not there, take appropriate recovery action.

+ * Returns FALSE if suspension is required.

+ *

+ * This is called by the entropy decoder after it has read an appropriate

+ * number of MCUs.  cinfo->unread_marker may be nonzero if the entropy decoder

+ * has already read a marker from the data source.  Under normal conditions

+ * cinfo->unread_marker will be reset to 0 before returning; if not reset,

+ * it holds a marker which the decoder will be unable to read past.

+ */

+

+METHODDEF(boolean)

+read_restart_marker (j_decompress_ptr cinfo)

+{

+  /* Obtain a marker unless we already did. */

+  /* Note that next_marker will complain if it skips any data. */

+  if (cinfo->unread_marker == 0) {

+    if (! next_marker(cinfo))

+      return FALSE;

+  }

+

+  if (cinfo->unread_marker ==

+      ((int) M_RST0 + cinfo->marker->next_restart_num)) {

+    /* Normal case --- swallow the marker and let entropy decoder continue */

+    TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num);

+    cinfo->unread_marker = 0;

+  } else {

+    /* Uh-oh, the restart markers have been messed up. */

+    /* Let the data source manager determine how to resync. */

+    if (! (*cinfo->src->resync_to_restart) (cinfo,

+					    cinfo->marker->next_restart_num))

+      return FALSE;

+  }

+

+  /* Update next-restart state */

+  cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7;

+

+  return TRUE;

+}

+

+

+/*

+ * This is the default resync_to_restart method for data source managers

+ * to use if they don't have any better approach.  Some data source managers

+ * may be able to back up, or may have additional knowledge about the data

+ * which permits a more intelligent recovery strategy; such managers would

+ * presumably supply their own resync method.

+ *

+ * read_restart_marker calls resync_to_restart if it finds a marker other than

+ * the restart marker it was expecting.  (This code is *not* used unless

+ * a nonzero restart interval has been declared.)  cinfo->unread_marker is

+ * the marker code actually found (might be anything, except 0 or FF).

+ * The desired restart marker number (0..7) is passed as a parameter.

+ * This routine is supposed to apply whatever error recovery strategy seems

+ * appropriate in order to position the input stream to the next data segment.

+ * Note that cinfo->unread_marker is treated as a marker appearing before

+ * the current data-source input point; usually it should be reset to zero

+ * before returning.

+ * Returns FALSE if suspension is required.

+ *

+ * This implementation is substantially constrained by wanting to treat the

+ * input as a data stream; this means we can't back up.  Therefore, we have

+ * only the following actions to work with:

+ *   1. Simply discard the marker and let the entropy decoder resume at next

+ *      byte of file.

+ *   2. Read forward until we find another marker, discarding intervening

+ *      data.  (In theory we could look ahead within the current bufferload,

+ *      without having to discard data if we don't find the desired marker.

+ *      This idea is not implemented here, in part because it makes behavior

+ *      dependent on buffer size and chance buffer-boundary positions.)

+ *   3. Leave the marker unread (by failing to zero cinfo->unread_marker).

+ *      This will cause the entropy decoder to process an empty data segment,

+ *      inserting dummy zeroes, and then we will reprocess the marker.

+ *

+ * #2 is appropriate if we think the desired marker lies ahead, while #3 is

+ * appropriate if the found marker is a future restart marker (indicating

+ * that we have missed the desired restart marker, probably because it got

+ * corrupted).

+ * We apply #2 or #3 if the found marker is a restart marker no more than

+ * two counts behind or ahead of the expected one.  We also apply #2 if the

+ * found marker is not a legal JPEG marker code (it's certainly bogus data).

+ * If the found marker is a restart marker more than 2 counts away, we do #1

+ * (too much risk that the marker is erroneous; with luck we will be able to

+ * resync at some future point).

+ * For any valid non-restart JPEG marker, we apply #3.  This keeps us from

+ * overrunning the end of a scan.  An implementation limited to single-scan

+ * files might find it better to apply #2 for markers other than EOI, since

+ * any other marker would have to be bogus data in that case.

+ */

+

+GLOBAL(boolean)

+jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired)

+{

+  int marker = cinfo->unread_marker;

+  int action = 1;

+  

+  /* Always put up a warning. */

+  WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired);

+  

+  /* Outer loop handles repeated decision after scanning forward. */

+  for (;;) {

+    if (marker < (int) M_SOF0)

+      action = 2;		/* invalid marker */

+    else if (marker < (int) M_RST0 || marker > (int) M_RST7)

+      action = 3;		/* valid non-restart marker */

+    else {

+      if (marker == ((int) M_RST0 + ((desired+1) & 7)) ||

+	  marker == ((int) M_RST0 + ((desired+2) & 7)))

+	action = 3;		/* one of the next two expected restarts */

+      else if (marker == ((int) M_RST0 + ((desired-1) & 7)) ||

+	       marker == ((int) M_RST0 + ((desired-2) & 7)))

+	action = 2;		/* a prior restart, so advance */

+      else

+	action = 1;		/* desired restart or too far away */

+    }

+    TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action);

+    switch (action) {

+    case 1:

+      /* Discard marker and let entropy decoder resume processing. */

+      cinfo->unread_marker = 0;

+      return TRUE;

+    case 2:

+      /* Scan to the next marker, and repeat the decision loop. */

+      if (! next_marker(cinfo))

+	return FALSE;

+      marker = cinfo->unread_marker;

+      break;

+    case 3:

+      /* Return without advancing past this marker. */

+      /* Entropy decoder will be forced to process an empty segment. */

+      return TRUE;

+    }

+  } /* end loop */

+}

+

+

+/*

+ * Reset marker processing state to begin a fresh datastream.

+ */

+

+METHODDEF(void)

+reset_marker_reader (j_decompress_ptr cinfo)

+{

+  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;

+

+  cinfo->comp_info = NULL;		/* until allocated by get_sof */

+  cinfo->input_scan_number = 0;		/* no SOS seen yet */

+  cinfo->unread_marker = 0;		/* no pending marker */

+  marker->pub.saw_SOI = FALSE;		/* set internal state too */

+  marker->pub.saw_SOF = FALSE;

+  marker->pub.discarded_bytes = 0;

+  marker->cur_marker = NULL;

+}

+

+

+/*

+ * Initialize the marker reader module.

+ * This is called only once, when the decompression object is created.

+ */

+

+GLOBAL(void)

+jinit_marker_reader (j_decompress_ptr cinfo)

+{

+  my_marker_ptr marker;

+  int i;

+

+  /* Create subobject in permanent pool */

+  marker = (my_marker_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,

+				SIZEOF(my_marker_reader));

+  cinfo->marker = (struct jpeg_marker_reader *) marker;

+  /* Initialize public method pointers */

+  marker->pub.reset_marker_reader = reset_marker_reader;

+  marker->pub.read_markers = read_markers;

+  marker->pub.read_restart_marker = read_restart_marker;

+  /* Initialize COM/APPn processing.

+   * By default, we examine and then discard APP0 and APP14,

+   * but simply discard COM and all other APPn.

+   */

+  marker->process_COM = skip_variable;

+  marker->length_limit_COM = 0;

+  for (i = 0; i < 16; i++) {

+    marker->process_APPn[i] = skip_variable;

+    marker->length_limit_APPn[i] = 0;

+  }

+  marker->process_APPn[0] = get_interesting_appn;

+  marker->process_APPn[14] = get_interesting_appn;

+  /* Reset marker processing state */

+  reset_marker_reader(cinfo);

+}

+

+

+/*

+ * Control saving of COM and APPn markers into marker_list.

+ */

+

+#ifdef SAVE_MARKERS_SUPPORTED

+

+GLOBAL(void)

+jpeg_save_markers (j_decompress_ptr cinfo, int marker_code,

+		   unsigned int length_limit)

+{

+  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;

+  long maxlength;

+  jpeg_marker_parser_method processor;

+

+  /* Length limit mustn't be larger than what we can allocate

+   * (should only be a concern in a 16-bit environment).

+   */

+  maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct);

+  if (((long) length_limit) > maxlength)

+    length_limit = (unsigned int) maxlength;

+

+  /* Choose processor routine to use.

+   * APP0/APP14 have special requirements.

+   */

+  if (length_limit) {

+    processor = save_marker;

+    /* If saving APP0/APP14, save at least enough for our internal use. */

+    if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN)

+      length_limit = APP0_DATA_LEN;

+    else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN)

+      length_limit = APP14_DATA_LEN;

+  } else {

+    processor = skip_variable;

+    /* If discarding APP0/APP14, use our regular on-the-fly processor. */

+    if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14)

+      processor = get_interesting_appn;

+  }

+

+  if (marker_code == (int) M_COM) {

+    marker->process_COM = processor;

+    marker->length_limit_COM = length_limit;

+  } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) {

+    marker->process_APPn[marker_code - (int) M_APP0] = processor;

+    marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit;

+  } else

+    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);

+}

+

+#endif /* SAVE_MARKERS_SUPPORTED */

+

+

+/*

+ * Install a special processing method for COM or APPn markers.

+ */

+

+GLOBAL(void)

+jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code,

+			   jpeg_marker_parser_method routine)

+{

+  my_marker_ptr marker = (my_marker_ptr) cinfo->marker;

+

+  if (marker_code == (int) M_COM)

+    marker->process_COM = routine;

+  else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15)

+    marker->process_APPn[marker_code - (int) M_APP0] = routine;

+  else

+    ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c b/core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c
new file mode 100644
index 0000000..4adfd82
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c
@@ -0,0 +1,560 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdmaster.c

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains master control logic for the JPEG decompressor.

+ * These routines are concerned with selecting the modules to be executed

+ * and with determining the number of passes and the work to be done in each

+ * pass.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* Private state */

+

+typedef struct {

+  struct jpeg_decomp_master pub; /* public fields */

+

+  int pass_number;		/* # of passes completed */

+

+  boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */

+

+  /* Saved references to initialized quantizer modules,

+   * in case we need to switch modes.

+   */

+  struct jpeg_color_quantizer * quantizer_1pass;

+  struct jpeg_color_quantizer * quantizer_2pass;

+} my_decomp_master;

+

+typedef my_decomp_master * my_master_ptr;

+

+

+/*

+ * Determine whether merged upsample/color conversion should be used.

+ * CRUCIAL: this must match the actual capabilities of jdmerge.c!

+ */

+

+LOCAL(boolean)

+use_merged_upsample (j_decompress_ptr cinfo)

+{

+#ifdef UPSAMPLE_MERGING_SUPPORTED

+  /* Merging is the equivalent of plain box-filter upsampling */

+  if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)

+    return FALSE;

+  /* jdmerge.c only supports YCC=>RGB color conversion */

+  if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||

+      cinfo->out_color_space != JCS_RGB ||

+      cinfo->out_color_components != RGB_PIXELSIZE)

+    return FALSE;

+  /* and it only handles 2h1v or 2h2v sampling ratios */

+  if (cinfo->comp_info[0].h_samp_factor != 2 ||

+      cinfo->comp_info[1].h_samp_factor != 1 ||

+      cinfo->comp_info[2].h_samp_factor != 1 ||

+      cinfo->comp_info[0].v_samp_factor >  2 ||

+      cinfo->comp_info[1].v_samp_factor != 1 ||

+      cinfo->comp_info[2].v_samp_factor != 1)

+    return FALSE;

+  /* furthermore, it doesn't work if we've scaled the IDCTs differently */

+  if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size ||

+      cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size ||

+      cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size)

+    return FALSE;

+  /* ??? also need to test for upsample-time rescaling, when & if supported */

+  return TRUE;			/* by golly, it'll work... */

+#else

+  return FALSE;

+#endif

+}

+

+

+/*

+ * Compute output image dimensions and related values.

+ * NOTE: this is exported for possible use by application.

+ * Hence it mustn't do anything that can't be done twice.

+ * Also note that it may be called before the master module is initialized!

+ */

+

+GLOBAL(void)

+jpeg_calc_output_dimensions (j_decompress_ptr cinfo)

+/* Do computations that are needed before master selection phase */

+{

+#ifdef IDCT_SCALING_SUPPORTED

+  int ci;

+  jpeg_component_info *compptr;

+#endif

+

+  /* Prevent application from calling me at wrong times */

+  if (cinfo->global_state != DSTATE_READY)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+

+#ifdef IDCT_SCALING_SUPPORTED

+

+  /* Compute actual output image dimensions and DCT scaling choices. */

+  if (cinfo->scale_num * 8 <= cinfo->scale_denom) {

+    /* Provide 1/8 scaling */

+    cinfo->output_width = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_width, 8L);

+    cinfo->output_height = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_height, 8L);

+    cinfo->min_DCT_scaled_size = 1;

+  } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) {

+    /* Provide 1/4 scaling */

+    cinfo->output_width = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_width, 4L);

+    cinfo->output_height = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_height, 4L);

+    cinfo->min_DCT_scaled_size = 2;

+  } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) {

+    /* Provide 1/2 scaling */

+    cinfo->output_width = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_width, 2L);

+    cinfo->output_height = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_height, 2L);

+    cinfo->min_DCT_scaled_size = 4;

+  } else {

+    /* Provide 1/1 scaling */

+    cinfo->output_width = cinfo->image_width;

+    cinfo->output_height = cinfo->image_height;

+    cinfo->min_DCT_scaled_size = DCTSIZE;

+  }

+  /* In selecting the actual DCT scaling for each component, we try to

+   * scale up the chroma components via IDCT scaling rather than upsampling.

+   * This saves time if the upsampler gets to use 1:1 scaling.

+   * Note this code assumes that the supported DCT scalings are powers of 2.

+   */

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    int ssize = cinfo->min_DCT_scaled_size;

+    while (ssize < DCTSIZE &&

+	   (compptr->h_samp_factor * ssize * 2 <=

+	    cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) &&

+	   (compptr->v_samp_factor * ssize * 2 <=

+	    cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) {

+      ssize = ssize * 2;

+    }

+    compptr->DCT_scaled_size = ssize;

+  }

+

+  /* Recompute downsampled dimensions of components;

+   * application needs to know these if using raw downsampled data.

+   */

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    /* Size in samples, after IDCT scaling */

+    compptr->downsampled_width = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_width *

+		    (long) (compptr->h_samp_factor * compptr->DCT_scaled_size),

+		    (long) (cinfo->max_h_samp_factor * DCTSIZE));

+    compptr->downsampled_height = (JDIMENSION)

+      jdiv_round_up((long) cinfo->image_height *

+		    (long) (compptr->v_samp_factor * compptr->DCT_scaled_size),

+		    (long) (cinfo->max_v_samp_factor * DCTSIZE));

+  }

+

+#else /* !IDCT_SCALING_SUPPORTED */

+

+  /* Hardwire it to "no scaling" */

+  cinfo->output_width = cinfo->image_width;

+  cinfo->output_height = cinfo->image_height;

+  /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE,

+   * and has computed unscaled downsampled_width and downsampled_height.

+   */

+

+#endif /* IDCT_SCALING_SUPPORTED */

+

+  /* Report number of components in selected colorspace. */

+  /* Probably this should be in the color conversion module... */

+  switch (cinfo->out_color_space) {

+  case JCS_GRAYSCALE:

+    cinfo->out_color_components = 1;

+    break;

+  case JCS_RGB:

+#if RGB_PIXELSIZE != 3

+    cinfo->out_color_components = RGB_PIXELSIZE;

+    break;

+#endif /* else share code with YCbCr */

+  case JCS_YCbCr:

+    cinfo->out_color_components = 3;

+    break;

+  case JCS_CMYK:

+  case JCS_YCCK:

+    cinfo->out_color_components = 4;

+    break;

+  default:			/* else must be same colorspace as in file */

+    cinfo->out_color_components = cinfo->num_components;

+    break;

+  }

+  cinfo->output_components = (cinfo->quantize_colors ? 1 :

+			      cinfo->out_color_components);

+

+  /* See if upsampler will want to emit more than one row at a time */

+  if (use_merged_upsample(cinfo))

+    cinfo->rec_outbuf_height = cinfo->max_v_samp_factor;

+  else

+    cinfo->rec_outbuf_height = 1;

+}

+

+

+/*

+ * Several decompression processes need to range-limit values to the range

+ * 0..MAXJSAMPLE; the input value may fall somewhat outside this range

+ * due to noise introduced by quantization, roundoff error, etc.  These

+ * processes are inner loops and need to be as fast as possible.  On most

+ * machines, particularly CPUs with pipelines or instruction prefetch,

+ * a (subscript-check-less) C table lookup

+ *		x = sample_range_limit[x];

+ * is faster than explicit tests

+ *		if (x < 0)  x = 0;

+ *		else if (x > MAXJSAMPLE)  x = MAXJSAMPLE;

+ * These processes all use a common table prepared by the routine below.

+ *

+ * For most steps we can mathematically guarantee that the initial value

+ * of x is within MAXJSAMPLE+1 of the legal range, so a table running from

+ * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient.  But for the initial

+ * limiting step (just after the IDCT), a wildly out-of-range value is 

+ * possible if the input data is corrupt.  To avoid any chance of indexing

+ * off the end of memory and getting a bad-pointer trap, we perform the

+ * post-IDCT limiting thus:

+ *		x = range_limit[x & MASK];

+ * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit

+ * samples.  Under normal circumstances this is more than enough range and

+ * a correct output will be generated; with bogus input data the mask will

+ * cause wraparound, and we will safely generate a bogus-but-in-range output.

+ * For the post-IDCT step, we want to convert the data from signed to unsigned

+ * representation by adding CENTERJSAMPLE at the same time that we limit it.

+ * So the post-IDCT limiting table ends up looking like this:

+ *   CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,

+ *   MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),

+ *   0          (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),

+ *   0,1,...,CENTERJSAMPLE-1

+ * Negative inputs select values from the upper half of the table after

+ * masking.

+ *

+ * We can save some space by overlapping the start of the post-IDCT table

+ * with the simpler range limiting table.  The post-IDCT table begins at

+ * sample_range_limit + CENTERJSAMPLE.

+ *

+ * Note that the table is allocated in near data space on PCs; it's small

+ * enough and used often enough to justify this.

+ */

+

+LOCAL(void)

+prepare_range_limit_table (j_decompress_ptr cinfo)

+/* Allocate and fill in the sample_range_limit table */

+{

+  JSAMPLE * table;

+  int i;

+

+  table = (JSAMPLE *)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+		(5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE));

+  table += (MAXJSAMPLE+1);	/* allow negative subscripts of simple table */

+  cinfo->sample_range_limit = table;

+  /* First segment of "simple" table: limit[x] = 0 for x < 0 */

+  MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));

+  /* Main part of "simple" table: limit[x] = x */

+  for (i = 0; i <= MAXJSAMPLE; i++)

+    table[i] = (JSAMPLE) i;

+  table += CENTERJSAMPLE;	/* Point to where post-IDCT table starts */

+  /* End of simple table, rest of first half of post-IDCT table */

+  for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++)

+    table[i] = MAXJSAMPLE;

+  /* Second half of post-IDCT table */

+  MEMZERO(table + (2 * (MAXJSAMPLE+1)),

+	  (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE));

+  MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),

+	  cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE));

+}

+

+

+/*

+ * Master selection of decompression modules.

+ * This is done once at jpeg_start_decompress time.  We determine

+ * which modules will be used and give them appropriate initialization calls.

+ * We also initialize the decompressor input side to begin consuming data.

+ *

+ * Since jpeg_read_header has finished, we know what is in the SOF

+ * and (first) SOS markers.  We also have all the application parameter

+ * settings.

+ */

+

+LOCAL(void)

+master_selection (j_decompress_ptr cinfo)

+{

+  my_master_ptr master = (my_master_ptr) cinfo->master;

+  boolean use_c_buffer;

+  long samplesperrow;

+  JDIMENSION jd_samplesperrow;

+

+  /* Initialize dimensions and other stuff */

+  jpeg_calc_output_dimensions(cinfo);

+  prepare_range_limit_table(cinfo);

+

+  /* Width of an output scanline must be representable as JDIMENSION. */

+  samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;

+  jd_samplesperrow = (JDIMENSION) samplesperrow;

+  if ((long) jd_samplesperrow != samplesperrow)

+    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);

+

+  /* Initialize my private state */

+  master->pass_number = 0;

+  master->using_merged_upsample = use_merged_upsample(cinfo);

+

+  /* Color quantizer selection */

+  master->quantizer_1pass = NULL;

+  master->quantizer_2pass = NULL;

+  /* No mode changes if not using buffered-image mode. */

+  if (! cinfo->quantize_colors || ! cinfo->buffered_image) {

+    cinfo->enable_1pass_quant = FALSE;

+    cinfo->enable_external_quant = FALSE;

+    cinfo->enable_2pass_quant = FALSE;

+  }

+  if (cinfo->quantize_colors) {

+    if (cinfo->raw_data_out)

+      ERREXIT(cinfo, JERR_NOTIMPL);

+    /* 2-pass quantizer only works in 3-component color space. */

+    if (cinfo->out_color_components != 3) {

+      cinfo->enable_1pass_quant = TRUE;

+      cinfo->enable_external_quant = FALSE;

+      cinfo->enable_2pass_quant = FALSE;

+      cinfo->colormap = NULL;

+    } else if (cinfo->colormap != NULL) {

+      cinfo->enable_external_quant = TRUE;

+    } else if (cinfo->two_pass_quantize) {

+      cinfo->enable_2pass_quant = TRUE;

+    } else {

+      cinfo->enable_1pass_quant = TRUE;

+    }

+

+    if (cinfo->enable_1pass_quant) {

+#ifdef QUANT_1PASS_SUPPORTED

+      jinit_1pass_quantizer(cinfo);

+      master->quantizer_1pass = cinfo->cquantize;

+#else

+      ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif

+    }

+

+    /* We use the 2-pass code to map to external colormaps. */

+    if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) {

+#ifdef QUANT_2PASS_SUPPORTED

+      jinit_2pass_quantizer(cinfo);

+      master->quantizer_2pass = cinfo->cquantize;

+#else

+      ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif

+    }

+    /* If both quantizers are initialized, the 2-pass one is left active;

+     * this is necessary for starting with quantization to an external map.

+     */

+  }

+

+  /* Post-processing: in particular, color conversion first */

+  if (! cinfo->raw_data_out) {

+    if (master->using_merged_upsample) {

+#ifdef UPSAMPLE_MERGING_SUPPORTED

+      jinit_merged_upsampler(cinfo); /* does color conversion too */

+#else

+      ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif

+    } else {

+      jinit_color_deconverter(cinfo);

+      jinit_upsampler(cinfo);

+    }

+    jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant);

+  }

+  /* Inverse DCT */

+  jinit_inverse_dct(cinfo);

+  /* Entropy decoding: either Huffman or arithmetic coding. */

+  if (cinfo->arith_code) {

+    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);

+  } else {

+    if (cinfo->progressive_mode) {

+#ifdef D_PROGRESSIVE_SUPPORTED

+      jinit_phuff_decoder(cinfo);

+#else

+      ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif

+    } else

+      jinit_huff_decoder(cinfo);

+  }

+

+  /* Initialize principal buffer controllers. */

+  use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image;

+  jinit_d_coef_controller(cinfo, use_c_buffer);

+

+  if (! cinfo->raw_data_out)

+    jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */);

+

+  /* We can now tell the memory manager to allocate virtual arrays. */

+  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);

+

+  /* Initialize input side of decompressor to consume first scan. */

+  (*cinfo->inputctl->start_input_pass) (cinfo);

+

+#ifdef D_MULTISCAN_FILES_SUPPORTED

+  /* If jpeg_start_decompress will read the whole file, initialize

+   * progress monitoring appropriately.  The input step is counted

+   * as one pass.

+   */

+  if (cinfo->progress != NULL && ! cinfo->buffered_image &&

+      cinfo->inputctl->has_multiple_scans) {

+    int nscans;

+    /* Estimate number of scans to set pass_limit. */

+    if (cinfo->progressive_mode) {

+      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */

+      nscans = 2 + 3 * cinfo->num_components;

+    } else {

+      /* For a nonprogressive multiscan file, estimate 1 scan per component. */

+      nscans = cinfo->num_components;

+    }

+    cinfo->progress->pass_counter = 0L;

+    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;

+    cinfo->progress->completed_passes = 0;

+    cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2);

+    /* Count the input pass as done */

+    master->pass_number++;

+  }

+#endif /* D_MULTISCAN_FILES_SUPPORTED */

+}

+

+

+/*

+ * Per-pass setup.

+ * This is called at the beginning of each output pass.  We determine which

+ * modules will be active during this pass and give them appropriate

+ * start_pass calls.  We also set is_dummy_pass to indicate whether this

+ * is a "real" output pass or a dummy pass for color quantization.

+ * (In the latter case, jdapistd.c will crank the pass to completion.)

+ */

+

+METHODDEF(void)

+prepare_for_output_pass (j_decompress_ptr cinfo)

+{

+  my_master_ptr master = (my_master_ptr) cinfo->master;

+

+  if (master->pub.is_dummy_pass) {

+#ifdef QUANT_2PASS_SUPPORTED

+    /* Final pass of 2-pass quantization */

+    master->pub.is_dummy_pass = FALSE;

+    (*cinfo->cquantize->start_pass) (cinfo, FALSE);

+    (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST);

+    (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST);

+#else

+    ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif /* QUANT_2PASS_SUPPORTED */

+  } else {

+    if (cinfo->quantize_colors && cinfo->colormap == NULL) {

+      /* Select new quantization method */

+      if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) {

+	cinfo->cquantize = master->quantizer_2pass;

+	master->pub.is_dummy_pass = TRUE;

+      } else if (cinfo->enable_1pass_quant) {

+	cinfo->cquantize = master->quantizer_1pass;

+      } else {

+	ERREXIT(cinfo, JERR_MODE_CHANGE);

+      }

+    }

+    (*cinfo->idct->start_pass) (cinfo);

+    (*cinfo->coef->start_output_pass) (cinfo);

+    if (! cinfo->raw_data_out) {

+      if (! master->using_merged_upsample)

+	(*cinfo->cconvert->start_pass) (cinfo);

+      (*cinfo->upsample->start_pass) (cinfo);

+      if (cinfo->quantize_colors)

+	(*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass);

+      (*cinfo->post->start_pass) (cinfo,

+	    (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));

+      (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);

+    }

+  }

+

+  /* Set up progress monitor's pass info if present */

+  if (cinfo->progress != NULL) {

+    cinfo->progress->completed_passes = master->pass_number;

+    cinfo->progress->total_passes = master->pass_number +

+				    (master->pub.is_dummy_pass ? 2 : 1);

+    /* In buffered-image mode, we assume one more output pass if EOI not

+     * yet reached, but no more passes if EOI has been reached.

+     */

+    if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) {

+      cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1);

+    }

+  }

+}

+

+

+/*

+ * Finish up at end of an output pass.

+ */

+

+METHODDEF(void)

+finish_output_pass (j_decompress_ptr cinfo)

+{

+  my_master_ptr master = (my_master_ptr) cinfo->master;

+

+  if (cinfo->quantize_colors)

+    (*cinfo->cquantize->finish_pass) (cinfo);

+  master->pass_number++;

+}

+

+

+#ifdef D_MULTISCAN_FILES_SUPPORTED

+

+/*

+ * Switch to a new external colormap between output passes.

+ */

+

+GLOBAL(void)

+jpeg_new_colormap (j_decompress_ptr cinfo)

+{

+  my_master_ptr master = (my_master_ptr) cinfo->master;

+

+  /* Prevent application from calling me at wrong times */

+  if (cinfo->global_state != DSTATE_BUFIMAGE)

+    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+

+  if (cinfo->quantize_colors && cinfo->enable_external_quant &&

+      cinfo->colormap != NULL) {

+    /* Select 2-pass quantizer for external colormap use */

+    cinfo->cquantize = master->quantizer_2pass;

+    /* Notify quantizer of colormap change */

+    (*cinfo->cquantize->new_color_map) (cinfo);

+    master->pub.is_dummy_pass = FALSE; /* just in case */

+  } else

+    ERREXIT(cinfo, JERR_MODE_CHANGE);

+}

+

+#endif /* D_MULTISCAN_FILES_SUPPORTED */

+

+

+/*

+ * Initialize master decompression control and select active modules.

+ * This is performed at the start of jpeg_start_decompress.

+ */

+

+GLOBAL(void)

+jinit_master_decompress (j_decompress_ptr cinfo)

+{

+  my_master_ptr master;

+

+  master = (my_master_ptr)

+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				  SIZEOF(my_decomp_master));

+  cinfo->master = (struct jpeg_decomp_master *) master;

+  master->pub.prepare_for_output_pass = prepare_for_output_pass;

+  master->pub.finish_output_pass = finish_output_pass;

+

+  master->pub.is_dummy_pass = FALSE;

+

+  master_selection(cinfo);

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c b/core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c
new file mode 100644
index 0000000..29a996c
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c
@@ -0,0 +1,406 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdmerge.c

+ *

+ * Copyright (C) 1994-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains code for merged upsampling/color conversion.

+ *

+ * This file combines functions from jdsample.c and jdcolor.c;

+ * read those files first to understand what's going on.

+ *

+ * When the chroma components are to be upsampled by simple replication

+ * (ie, box filtering), we can save some work in color conversion by

+ * calculating all the output pixels corresponding to a pair of chroma

+ * samples at one time.  In the conversion equations

+ *	R = Y           + K1 * Cr

+ *	G = Y + K2 * Cb + K3 * Cr

+ *	B = Y + K4 * Cb

+ * only the Y term varies among the group of pixels corresponding to a pair

+ * of chroma samples, so the rest of the terms can be calculated just once.

+ * At typical sampling ratios, this eliminates half or three-quarters of the

+ * multiplications needed for color conversion.

+ *

+ * This file currently provides implementations for the following cases:

+ *	YCbCr => RGB color conversion only.

+ *	Sampling ratios of 2h1v or 2h2v.

+ *	No scaling needed at upsample time.

+ *	Corner-aligned (non-CCIR601) sampling alignment.

+ * Other special cases could be added, but in most applications these are

+ * the only common cases.  (For uncommon cases we fall back on the more

+ * general code in jdsample.c and jdcolor.c.)

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+#ifdef UPSAMPLE_MERGING_SUPPORTED

+

+#ifdef _FX_MANAGED_CODE_

+#define my_upsampler	my_upsampler_m

+#endif

+

+/* Private subobject */

+

+typedef struct {

+  struct jpeg_upsampler pub;	/* public fields */

+

+  /* Pointer to routine to do actual upsampling/conversion of one row group */

+  JMETHOD(void, upmethod, (j_decompress_ptr cinfo,

+			   JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,

+			   JSAMPARRAY output_buf));

+

+  /* Private state for YCC->RGB conversion */

+  int * Cr_r_tab;		/* => table for Cr to R conversion */

+  int * Cb_b_tab;		/* => table for Cb to B conversion */

+  INT32 * Cr_g_tab;		/* => table for Cr to G conversion */

+  INT32 * Cb_g_tab;		/* => table for Cb to G conversion */

+

+  /* For 2:1 vertical sampling, we produce two output rows at a time.

+   * We need a "spare" row buffer to hold the second output row if the

+   * application provides just a one-row buffer; we also use the spare

+   * to discard the dummy last row if the image height is odd.

+   */

+  JSAMPROW spare_row;

+  boolean spare_full;		/* T if spare buffer is occupied */

+

+  JDIMENSION out_row_width;	/* samples per output row */

+  JDIMENSION rows_to_go;	/* counts rows remaining in image */

+} my_upsampler;

+

+typedef my_upsampler * my_upsample_ptr;

+

+#define SCALEBITS	16	/* speediest right-shift on some machines */

+#define ONE_HALF	((INT32) 1 << (SCALEBITS-1))

+#define FIX(x)		((INT32) ((x) * (1L<<SCALEBITS) + 0.5))

+

+

+/*

+ * Initialize tables for YCC->RGB colorspace conversion.

+ * This is taken directly from jdcolor.c; see that file for more info.

+ */

+

+LOCAL(void)

+build_ycc_rgb_table (j_decompress_ptr cinfo)

+{

+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;

+  int i;

+  INT32 x;

+  SHIFT_TEMPS

+

+  upsample->Cr_r_tab = (int *)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				(MAXJSAMPLE+1) * SIZEOF(int));

+  upsample->Cb_b_tab = (int *)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				(MAXJSAMPLE+1) * SIZEOF(int));

+  upsample->Cr_g_tab = (INT32 *)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				(MAXJSAMPLE+1) * SIZEOF(INT32));

+  upsample->Cb_g_tab = (INT32 *)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				(MAXJSAMPLE+1) * SIZEOF(INT32));

+

+  for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {

+    /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */

+    /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */

+    /* Cr=>R value is nearest int to 1.40200 * x */

+    upsample->Cr_r_tab[i] = (int)

+		    RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);

+    /* Cb=>B value is nearest int to 1.77200 * x */

+    upsample->Cb_b_tab[i] = (int)

+		    RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);

+    /* Cr=>G value is scaled-up -0.71414 * x */

+    upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;

+    /* Cb=>G value is scaled-up -0.34414 * x */

+    /* We also add in ONE_HALF so that need not do it in inner loop */

+    upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;

+  }

+}

+

+

+/*

+ * Initialize for an upsampling pass.

+ */

+

+METHODDEF(void)

+start_pass_merged_upsample (j_decompress_ptr cinfo)

+{

+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;

+

+  /* Mark the spare buffer empty */

+  upsample->spare_full = FALSE;

+  /* Initialize total-height counter for detecting bottom of image */

+  upsample->rows_to_go = cinfo->output_height;

+}

+

+

+/*

+ * Control routine to do upsampling (and color conversion).

+ *

+ * The control routine just handles the row buffering considerations.

+ */

+

+METHODDEF(void)

+merged_2v_upsample (j_decompress_ptr cinfo,

+		    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,

+		    JDIMENSION in_row_groups_avail,

+		    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+		    JDIMENSION out_rows_avail)

+/* 2:1 vertical sampling case: may need a spare row. */

+{

+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;

+  JSAMPROW work_ptrs[2];

+  JDIMENSION num_rows;		/* number of rows returned to caller */

+

+  if (upsample->spare_full) {

+    /* If we have a spare row saved from a previous cycle, just return it. */

+    jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0,

+		      1, upsample->out_row_width);

+    num_rows = 1;

+    upsample->spare_full = FALSE;

+  } else {

+    /* Figure number of rows to return to caller. */

+    num_rows = 2;

+    /* Not more than the distance to the end of the image. */

+    if (num_rows > upsample->rows_to_go)

+      num_rows = upsample->rows_to_go;

+    /* And not more than what the client can accept: */

+    out_rows_avail -= *out_row_ctr;

+    if (num_rows > out_rows_avail)

+      num_rows = out_rows_avail;

+    /* Create output pointer array for upsampler. */

+    work_ptrs[0] = output_buf[*out_row_ctr];

+    if (num_rows > 1) {

+      work_ptrs[1] = output_buf[*out_row_ctr + 1];

+    } else {

+      work_ptrs[1] = upsample->spare_row;

+      upsample->spare_full = TRUE;

+    }

+    /* Now do the upsampling. */

+    (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs);

+  }

+

+  /* Adjust counts */

+  *out_row_ctr += num_rows;

+  upsample->rows_to_go -= num_rows;

+  /* When the buffer is emptied, declare this input row group consumed */

+  if (! upsample->spare_full)

+    (*in_row_group_ctr)++;

+}

+

+

+METHODDEF(void)

+merged_1v_upsample (j_decompress_ptr cinfo,

+		    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,

+		    JDIMENSION in_row_groups_avail,

+		    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+		    JDIMENSION out_rows_avail)

+/* 1:1 vertical sampling case: much easier, never need a spare row. */

+{

+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;

+

+  /* Just do the upsampling. */

+  (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr,

+			 output_buf + *out_row_ctr);

+  /* Adjust counts */

+  (*out_row_ctr)++;

+  (*in_row_group_ctr)++;

+}

+

+

+/*

+ * These are the routines invoked by the control routines to do

+ * the actual upsampling/conversion.  One row group is processed per call.

+ *

+ * Note: since we may be writing directly into application-supplied buffers,

+ * we have to be honest about the output width; we can't assume the buffer

+ * has been rounded up to an even width.

+ */

+

+

+/*

+ * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical.

+ */

+

+METHODDEF(void)

+h2v1_merged_upsample (j_decompress_ptr cinfo,

+		      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,

+		      JSAMPARRAY output_buf)

+{

+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;

+  register int y, cred, cgreen, cblue;

+  int cb, cr;

+  register JSAMPROW outptr;

+  JSAMPROW inptr0, inptr1, inptr2;

+  JDIMENSION col;

+  /* copy these pointers into registers if possible */

+  register JSAMPLE * range_limit = cinfo->sample_range_limit;

+  int * Crrtab = upsample->Cr_r_tab;

+  int * Cbbtab = upsample->Cb_b_tab;

+  INT32 * Crgtab = upsample->Cr_g_tab;

+  INT32 * Cbgtab = upsample->Cb_g_tab;

+  SHIFT_TEMPS

+

+  inptr0 = input_buf[0][in_row_group_ctr];

+  inptr1 = input_buf[1][in_row_group_ctr];

+  inptr2 = input_buf[2][in_row_group_ctr];

+  outptr = output_buf[0];

+  /* Loop for each pair of output pixels */

+  for (col = cinfo->output_width >> 1; col > 0; col--) {

+    /* Do the chroma part of the calculation */

+    cb = GETJSAMPLE(*inptr1++);

+    cr = GETJSAMPLE(*inptr2++);

+    cred = Crrtab[cr];

+    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);

+    cblue = Cbbtab[cb];

+    /* Fetch 2 Y values and emit 2 pixels */

+    y  = GETJSAMPLE(*inptr0++);

+    outptr[RGB_RED] =   range_limit[y + cred];

+    outptr[RGB_GREEN] = range_limit[y + cgreen];

+    outptr[RGB_BLUE] =  range_limit[y + cblue];

+    outptr += RGB_PIXELSIZE;

+    y  = GETJSAMPLE(*inptr0++);

+    outptr[RGB_RED] =   range_limit[y + cred];

+    outptr[RGB_GREEN] = range_limit[y + cgreen];

+    outptr[RGB_BLUE] =  range_limit[y + cblue];

+    outptr += RGB_PIXELSIZE;

+  }

+  /* If image width is odd, do the last output column separately */

+  if (cinfo->output_width & 1) {

+    cb = GETJSAMPLE(*inptr1);

+    cr = GETJSAMPLE(*inptr2);

+    cred = Crrtab[cr];

+    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);

+    cblue = Cbbtab[cb];

+    y  = GETJSAMPLE(*inptr0);

+    outptr[RGB_RED] =   range_limit[y + cred];

+    outptr[RGB_GREEN] = range_limit[y + cgreen];

+    outptr[RGB_BLUE] =  range_limit[y + cblue];

+  }

+}

+

+

+/*

+ * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical.

+ */

+

+METHODDEF(void)

+h2v2_merged_upsample (j_decompress_ptr cinfo,

+		      JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,

+		      JSAMPARRAY output_buf)

+{

+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;

+  register int y, cred, cgreen, cblue;

+  int cb, cr;

+  register JSAMPROW outptr0, outptr1;

+  JSAMPROW inptr00, inptr01, inptr1, inptr2;

+  JDIMENSION col;

+  /* copy these pointers into registers if possible */

+  register JSAMPLE * range_limit = cinfo->sample_range_limit;

+  int * Crrtab = upsample->Cr_r_tab;

+  int * Cbbtab = upsample->Cb_b_tab;

+  INT32 * Crgtab = upsample->Cr_g_tab;

+  INT32 * Cbgtab = upsample->Cb_g_tab;

+  SHIFT_TEMPS

+

+  inptr00 = input_buf[0][in_row_group_ctr*2];

+  inptr01 = input_buf[0][in_row_group_ctr*2 + 1];

+  inptr1 = input_buf[1][in_row_group_ctr];

+  inptr2 = input_buf[2][in_row_group_ctr];

+  outptr0 = output_buf[0];

+  outptr1 = output_buf[1];

+  /* Loop for each group of output pixels */

+  for (col = cinfo->output_width >> 1; col > 0; col--) {

+    /* Do the chroma part of the calculation */

+    cb = GETJSAMPLE(*inptr1++);

+    cr = GETJSAMPLE(*inptr2++);

+    cred = Crrtab[cr];

+    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);

+    cblue = Cbbtab[cb];

+    /* Fetch 4 Y values and emit 4 pixels */

+    y  = GETJSAMPLE(*inptr00++);

+    outptr0[RGB_RED] =   range_limit[y + cred];

+    outptr0[RGB_GREEN] = range_limit[y + cgreen];

+    outptr0[RGB_BLUE] =  range_limit[y + cblue];

+    outptr0 += RGB_PIXELSIZE;

+    y  = GETJSAMPLE(*inptr00++);

+    outptr0[RGB_RED] =   range_limit[y + cred];

+    outptr0[RGB_GREEN] = range_limit[y + cgreen];

+    outptr0[RGB_BLUE] =  range_limit[y + cblue];

+    outptr0 += RGB_PIXELSIZE;

+    y  = GETJSAMPLE(*inptr01++);

+    outptr1[RGB_RED] =   range_limit[y + cred];

+    outptr1[RGB_GREEN] = range_limit[y + cgreen];

+    outptr1[RGB_BLUE] =  range_limit[y + cblue];

+    outptr1 += RGB_PIXELSIZE;

+    y  = GETJSAMPLE(*inptr01++);

+    outptr1[RGB_RED] =   range_limit[y + cred];

+    outptr1[RGB_GREEN] = range_limit[y + cgreen];

+    outptr1[RGB_BLUE] =  range_limit[y + cblue];

+    outptr1 += RGB_PIXELSIZE;

+  }

+  /* If image width is odd, do the last output column separately */

+  if (cinfo->output_width & 1) {

+    cb = GETJSAMPLE(*inptr1);

+    cr = GETJSAMPLE(*inptr2);

+    cred = Crrtab[cr];

+    cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);

+    cblue = Cbbtab[cb];

+    y  = GETJSAMPLE(*inptr00);

+    outptr0[RGB_RED] =   range_limit[y + cred];

+    outptr0[RGB_GREEN] = range_limit[y + cgreen];

+    outptr0[RGB_BLUE] =  range_limit[y + cblue];

+    y  = GETJSAMPLE(*inptr01);

+    outptr1[RGB_RED] =   range_limit[y + cred];

+    outptr1[RGB_GREEN] = range_limit[y + cgreen];

+    outptr1[RGB_BLUE] =  range_limit[y + cblue];

+  }

+}

+

+

+/*

+ * Module initialization routine for merged upsampling/color conversion.

+ *

+ * NB: this is called under the conditions determined by use_merged_upsample()

+ * in jdmaster.c.  That routine MUST correspond to the actual capabilities

+ * of this module; no safety checks are made here.

+ */

+

+GLOBAL(void)

+jinit_merged_upsampler (j_decompress_ptr cinfo)

+{

+  my_upsample_ptr upsample;

+

+  upsample = (my_upsample_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_upsampler));

+  cinfo->upsample = (struct jpeg_upsampler *) upsample;

+  upsample->pub.start_pass = start_pass_merged_upsample;

+  upsample->pub.need_context_rows = FALSE;

+

+  upsample->out_row_width = cinfo->output_width * cinfo->out_color_components;

+

+  if (cinfo->max_v_samp_factor == 2) {

+    upsample->pub.upsample = merged_2v_upsample;

+    upsample->upmethod = h2v2_merged_upsample;

+    /* Allocate a spare row buffer */

+    upsample->spare_row = (JSAMPROW)

+      (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+		(size_t) (upsample->out_row_width * SIZEOF(JSAMPLE)));

+  } else {

+    upsample->pub.upsample = merged_1v_upsample;

+    upsample->upmethod = h2v1_merged_upsample;

+    /* No spare row needed */

+    upsample->spare_row = NULL;

+  }

+

+  build_ycc_rgb_table(cinfo);

+}

+

+#endif /* UPSAMPLE_MERGING_SUPPORTED */

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c b/core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c
new file mode 100644
index 0000000..3c19d0a
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c
@@ -0,0 +1,671 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdphuff.c

+ *

+ * Copyright (C) 1995-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains Huffman entropy decoding routines for progressive JPEG.

+ *

+ * Much of the complexity here has to do with supporting input suspension.

+ * If the data source module demands suspension, we want to be able to back

+ * up to the start of the current MCU.  To do this, we copy state variables

+ * into local working storage, and update them back to the permanent

+ * storage only upon successful completion of an MCU.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jdhuff.h"		/* Declarations shared with jdhuff.c */

+

+

+#ifdef D_PROGRESSIVE_SUPPORTED

+

+/*

+ * Expanded entropy decoder object for progressive Huffman decoding.

+ *

+ * The savable_state subrecord contains fields that change within an MCU,

+ * but must not be updated permanently until we complete the MCU.

+ */

+

+typedef struct {

+  unsigned int EOBRUN;			/* remaining EOBs in EOBRUN */

+  int last_dc_val[MAX_COMPS_IN_SCAN];	/* last DC coef for each component */

+} savable_state;

+

+/* This macro is to work around compilers with missing or broken

+ * structure assignment.  You'll need to fix this code if you have

+ * such a compiler and you change MAX_COMPS_IN_SCAN.

+ */

+

+#ifndef NO_STRUCT_ASSIGN

+#define ASSIGN_STATE(dest,src)  ((dest) = (src))

+#else

+#if MAX_COMPS_IN_SCAN == 4

+#define ASSIGN_STATE(dest,src)  \

+	((dest).EOBRUN = (src).EOBRUN, \

+	 (dest).last_dc_val[0] = (src).last_dc_val[0], \

+	 (dest).last_dc_val[1] = (src).last_dc_val[1], \

+	 (dest).last_dc_val[2] = (src).last_dc_val[2], \

+	 (dest).last_dc_val[3] = (src).last_dc_val[3])

+#endif

+#endif

+

+

+typedef struct {

+  struct jpeg_entropy_decoder pub; /* public fields */

+

+  /* These fields are loaded into local variables at start of each MCU.

+   * In case of suspension, we exit WITHOUT updating them.

+   */

+  bitread_perm_state bitstate;	/* Bit buffer at start of MCU */

+  savable_state saved;		/* Other state at start of MCU */

+

+  /* These fields are NOT loaded into local working state. */

+  unsigned int restarts_to_go;	/* MCUs left in this restart interval */

+

+  /* Pointers to derived tables (these workspaces have image lifespan) */

+  d_derived_tbl * derived_tbls[NUM_HUFF_TBLS];

+

+  d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */

+} phuff_entropy_decoder;

+

+typedef phuff_entropy_decoder * phuff_entropy_ptr;

+

+/* Forward declarations */

+METHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo,

+					    JBLOCKROW *MCU_data));

+METHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo,

+					    JBLOCKROW *MCU_data));

+METHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo,

+					     JBLOCKROW *MCU_data));

+METHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo,

+					     JBLOCKROW *MCU_data));

+

+

+/*

+ * Initialize for a Huffman-compressed scan.

+ */

+

+METHODDEF(void)

+start_pass_phuff_decoder (j_decompress_ptr cinfo)

+{

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+  boolean is_DC_band, bad;

+  int ci, coefi, tbl;

+  int *coef_bit_ptr;

+  jpeg_component_info * compptr;

+

+  is_DC_band = (cinfo->Ss == 0);

+

+  /* Validate scan parameters */

+  bad = FALSE;

+  if (is_DC_band) {

+    if (cinfo->Se != 0)

+      bad = TRUE;

+  } else {

+    /* need not check Ss/Se < 0 since they came from unsigned bytes */

+    if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2)

+      bad = TRUE;

+    /* AC scans may have only one component */

+    if (cinfo->comps_in_scan != 1)

+      bad = TRUE;

+  }

+  if (cinfo->Ah != 0) {

+    /* Successive approximation refinement scan: must have Al = Ah-1. */

+    if (cinfo->Al != cinfo->Ah-1)

+      bad = TRUE;

+  }

+  if (cinfo->Al > 13)		/* need not check for < 0 */

+    bad = TRUE;

+  /* Arguably the maximum Al value should be less than 13 for 8-bit precision,

+   * but the spec doesn't say so, and we try to be liberal about what we

+   * accept.  Note: large Al values could result in out-of-range DC

+   * coefficients during early scans, leading to bizarre displays due to

+   * overflows in the IDCT math.  But we won't crash.

+   */

+  if (bad)

+    ERREXIT4(cinfo, JERR_BAD_PROGRESSION,

+	     cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);

+  /* Update progression status, and verify that scan order is legal.

+   * Note that inter-scan inconsistencies are treated as warnings

+   * not fatal errors ... not clear if this is right way to behave.

+   */

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+    int cindex = cinfo->cur_comp_info[ci]->component_index;

+    coef_bit_ptr = & cinfo->coef_bits[cindex][0];

+    if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */

+      WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);

+    for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {

+      int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];

+      if (cinfo->Ah != expected)

+	WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);

+      coef_bit_ptr[coefi] = cinfo->Al;

+    }

+  }

+

+  /* Select MCU decoding routine */

+  if (cinfo->Ah == 0) {

+    if (is_DC_band)

+      entropy->pub.decode_mcu = decode_mcu_DC_first;

+    else

+      entropy->pub.decode_mcu = decode_mcu_AC_first;

+  } else {

+    if (is_DC_band)

+      entropy->pub.decode_mcu = decode_mcu_DC_refine;

+    else

+      entropy->pub.decode_mcu = decode_mcu_AC_refine;

+  }

+

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {

+    compptr = cinfo->cur_comp_info[ci];

+    /* Make sure requested tables are present, and compute derived tables.

+     * We may build same derived table more than once, but it's not expensive.

+     */

+    if (is_DC_band) {

+      if (cinfo->Ah == 0) {	/* DC refinement needs no table */

+	tbl = compptr->dc_tbl_no;

+	jpeg_make_d_derived_tbl(cinfo, TRUE, tbl,

+				& entropy->derived_tbls[tbl]);

+      }

+    } else {

+      tbl = compptr->ac_tbl_no;

+      jpeg_make_d_derived_tbl(cinfo, FALSE, tbl,

+			      & entropy->derived_tbls[tbl]);

+      /* remember the single active table */

+      entropy->ac_derived_tbl = entropy->derived_tbls[tbl];

+    }

+    /* Initialize DC predictions to 0 */

+    entropy->saved.last_dc_val[ci] = 0;

+  }

+

+  /* Initialize bitread state variables */

+  entropy->bitstate.bits_left = 0;

+  entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */

+  entropy->pub.insufficient_data = FALSE;

+

+  /* Initialize private state variables */

+  entropy->saved.EOBRUN = 0;

+

+  /* Initialize restart counter */

+  entropy->restarts_to_go = cinfo->restart_interval;

+}

+

+

+/*

+ * Figure F.12: extend sign bit.

+ * On some machines, a shift and add will be faster than a table lookup.

+ */

+

+#ifdef AVOID_TABLES

+

+#define HUFF_EXTEND(x,s)  ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))

+

+#else

+

+#define HUFF_EXTEND(x,s)  ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))

+

+static const int extend_test[16] =   /* entry n is 2**(n-1) */

+  { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,

+    0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };

+

+static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */

+  { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,

+    ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,

+    ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,

+    ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };

+

+#endif /* AVOID_TABLES */

+

+

+/*

+ * Check for a restart marker & resynchronize decoder.

+ * Returns FALSE if must suspend.

+ */

+

+LOCAL(boolean)

+process_restart (j_decompress_ptr cinfo)

+{

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+  int ci;

+

+  /* Throw away any unused bits remaining in bit buffer; */

+  /* include any full bytes in next_marker's count of discarded bytes */

+  cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;

+  entropy->bitstate.bits_left = 0;

+

+  /* Advance past the RSTn marker */

+  if (! (*cinfo->marker->read_restart_marker) (cinfo))

+    return FALSE;

+

+  /* Re-initialize DC predictions to 0 */

+  for (ci = 0; ci < cinfo->comps_in_scan; ci++)

+    entropy->saved.last_dc_val[ci] = 0;

+  /* Re-init EOB run count, too */

+  entropy->saved.EOBRUN = 0;

+

+  /* Reset restart counter */

+  entropy->restarts_to_go = cinfo->restart_interval;

+

+  /* Reset out-of-data flag, unless read_restart_marker left us smack up

+   * against a marker.  In that case we will end up treating the next data

+   * segment as empty, and we can avoid producing bogus output pixels by

+   * leaving the flag set.

+   */

+  if (cinfo->unread_marker == 0)

+    entropy->pub.insufficient_data = FALSE;

+

+  return TRUE;

+}

+

+

+/*

+ * Huffman MCU decoding.

+ * Each of these routines decodes and returns one MCU's worth of

+ * Huffman-compressed coefficients. 

+ * The coefficients are reordered from zigzag order into natural array order,

+ * but are not dequantized.

+ *

+ * The i'th block of the MCU is stored into the block pointed to by

+ * MCU_data[i].  WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.

+ *

+ * We return FALSE if data source requested suspension.  In that case no

+ * changes have been made to permanent state.  (Exception: some output

+ * coefficients may already have been assigned.  This is harmless for

+ * spectral selection, since we'll just re-assign them on the next call.

+ * Successive approximation AC refinement has to be more careful, however.)

+ */

+

+/*

+ * MCU decoding for DC initial scan (either spectral selection,

+ * or first pass of successive approximation).

+ */

+

+METHODDEF(boolean)

+decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)

+{   

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+  int Al = cinfo->Al;

+  register int s, r;

+  int blkn, ci;

+  JBLOCKROW block;

+  BITREAD_STATE_VARS;

+  savable_state state;

+  d_derived_tbl * tbl;

+  jpeg_component_info * compptr;

+

+  /* Process restart marker if needed; may have to suspend */

+  if (cinfo->restart_interval) {

+    if (entropy->restarts_to_go == 0)

+      if (! process_restart(cinfo))

+	return FALSE;

+  }

+

+  /* If we've run out of data, just leave the MCU set to zeroes.

+   * This way, we return uniform gray for the remainder of the segment.

+   */

+  if (! entropy->pub.insufficient_data) {

+

+    /* Load up working state */

+    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);

+    ASSIGN_STATE(state, entropy->saved);

+

+    /* Outer loop handles each block in the MCU */

+

+    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {

+      block = MCU_data[blkn];

+      ci = cinfo->MCU_membership[blkn];

+      compptr = cinfo->cur_comp_info[ci];

+      tbl = entropy->derived_tbls[compptr->dc_tbl_no];

+

+      /* Decode a single block's worth of coefficients */

+

+      /* Section F.2.2.1: decode the DC coefficient difference */

+      HUFF_DECODE(s, br_state, tbl, return FALSE, label1);

+      if (s) {

+	CHECK_BIT_BUFFER(br_state, s, return FALSE);

+	r = GET_BITS(s);

+	s = HUFF_EXTEND(r, s);

+      }

+

+      /* Convert DC difference to actual value, update last_dc_val */

+      s += state.last_dc_val[ci];

+      state.last_dc_val[ci] = s;

+      /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */

+      (*block)[0] = (JCOEF) (s << Al);

+    }

+

+    /* Completed MCU, so update state */

+    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);

+    ASSIGN_STATE(entropy->saved, state);

+  }

+

+  /* Account for restart interval (no-op if not using restarts) */

+  entropy->restarts_to_go--;

+

+  return TRUE;

+}

+

+

+/*

+ * MCU decoding for AC initial scan (either spectral selection,

+ * or first pass of successive approximation).

+ */

+

+METHODDEF(boolean)

+decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)

+{   

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+  int Se = cinfo->Se;

+  int Al = cinfo->Al;

+  register int s, k, r;

+  unsigned int EOBRUN;

+  JBLOCKROW block;

+  BITREAD_STATE_VARS;

+  d_derived_tbl * tbl;

+

+  /* Process restart marker if needed; may have to suspend */

+  if (cinfo->restart_interval) {

+    if (entropy->restarts_to_go == 0)

+      if (! process_restart(cinfo))

+	return FALSE;

+  }

+

+  /* If we've run out of data, just leave the MCU set to zeroes.

+   * This way, we return uniform gray for the remainder of the segment.

+   */

+  if (! entropy->pub.insufficient_data) {

+

+    /* Load up working state.

+     * We can avoid loading/saving bitread state if in an EOB run.

+     */

+    EOBRUN = entropy->saved.EOBRUN;	/* only part of saved state we need */

+

+    /* There is always only one block per MCU */

+

+    if (EOBRUN > 0)		/* if it's a band of zeroes... */

+      EOBRUN--;			/* ...process it now (we do nothing) */

+    else {

+      BITREAD_LOAD_STATE(cinfo,entropy->bitstate);

+      block = MCU_data[0];

+      tbl = entropy->ac_derived_tbl;

+

+      for (k = cinfo->Ss; k <= Se; k++) {

+	HUFF_DECODE(s, br_state, tbl, return FALSE, label2);

+	r = s >> 4;

+	s &= 15;

+	if (s) {

+	  k += r;

+	  CHECK_BIT_BUFFER(br_state, s, return FALSE);

+	  r = GET_BITS(s);

+	  s = HUFF_EXTEND(r, s);

+	  /* Scale and output coefficient in natural (dezigzagged) order */

+	  (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al);

+	} else {

+	  if (r == 15) {	/* ZRL */

+	    k += 15;		/* skip 15 zeroes in band */

+	  } else {		/* EOBr, run length is 2^r + appended bits */

+	    EOBRUN = 1 << r;

+	    if (r) {		/* EOBr, r > 0 */

+	      CHECK_BIT_BUFFER(br_state, r, return FALSE);

+	      r = GET_BITS(r);

+	      EOBRUN += r;

+	    }

+	    EOBRUN--;		/* this band is processed at this moment */

+	    break;		/* force end-of-band */

+	  }

+	}

+      }

+

+      BITREAD_SAVE_STATE(cinfo,entropy->bitstate);

+    }

+

+    /* Completed MCU, so update state */

+    entropy->saved.EOBRUN = EOBRUN;	/* only part of saved state we need */

+  }

+

+  /* Account for restart interval (no-op if not using restarts) */

+  entropy->restarts_to_go--;

+

+  return TRUE;

+}

+

+

+/*

+ * MCU decoding for DC successive approximation refinement scan.

+ * Note: we assume such scans can be multi-component, although the spec

+ * is not very clear on the point.

+ */

+

+METHODDEF(boolean)

+decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)

+{   

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+  int p1 = 1 << cinfo->Al;	/* 1 in the bit position being coded */

+  int blkn;

+  JBLOCKROW block;

+  BITREAD_STATE_VARS;

+

+  /* Process restart marker if needed; may have to suspend */

+  if (cinfo->restart_interval) {

+    if (entropy->restarts_to_go == 0)

+      if (! process_restart(cinfo))

+	return FALSE;

+  }

+

+  /* Not worth the cycles to check insufficient_data here,

+   * since we will not change the data anyway if we read zeroes.

+   */

+

+  /* Load up working state */

+  BITREAD_LOAD_STATE(cinfo,entropy->bitstate);

+

+  /* Outer loop handles each block in the MCU */

+

+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {

+    block = MCU_data[blkn];

+

+    /* Encoded data is simply the next bit of the two's-complement DC value */

+    CHECK_BIT_BUFFER(br_state, 1, return FALSE);

+    if (GET_BITS(1))

+      (*block)[0] |= p1;

+    /* Note: since we use |=, repeating the assignment later is safe */

+  }

+

+  /* Completed MCU, so update state */

+  BITREAD_SAVE_STATE(cinfo,entropy->bitstate);

+

+  /* Account for restart interval (no-op if not using restarts) */

+  entropy->restarts_to_go--;

+

+  return TRUE;

+}

+

+

+/*

+ * MCU decoding for AC successive approximation refinement scan.

+ */

+

+METHODDEF(boolean)

+decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)

+{   

+  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;

+  int Se = cinfo->Se;

+  int p1 = 1 << cinfo->Al;	/* 1 in the bit position being coded */

+  int m1 = (-1) << cinfo->Al;	/* -1 in the bit position being coded */

+  register int s, k, r;

+  unsigned int EOBRUN;

+  JBLOCKROW block;

+  JCOEFPTR thiscoef;

+  BITREAD_STATE_VARS;

+  d_derived_tbl * tbl;

+  int num_newnz;

+  int newnz_pos[DCTSIZE2];

+

+  /* Process restart marker if needed; may have to suspend */

+  if (cinfo->restart_interval) {

+    if (entropy->restarts_to_go == 0)

+      if (! process_restart(cinfo))

+	return FALSE;

+  }

+

+  /* If we've run out of data, don't modify the MCU.

+   */

+  if (! entropy->pub.insufficient_data) {

+

+    /* Load up working state */

+    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);

+    EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */

+

+    /* There is always only one block per MCU */

+    block = MCU_data[0];

+    tbl = entropy->ac_derived_tbl;

+

+    /* If we are forced to suspend, we must undo the assignments to any newly

+     * nonzero coefficients in the block, because otherwise we'd get confused

+     * next time about which coefficients were already nonzero.

+     * But we need not undo addition of bits to already-nonzero coefficients;

+     * instead, we can test the current bit to see if we already did it.

+     */

+    num_newnz = 0;

+

+    /* initialize coefficient loop counter to start of band */

+    k = cinfo->Ss;

+

+    if (EOBRUN == 0) {

+      for (; k <= Se; k++) {

+	HUFF_DECODE(s, br_state, tbl, goto undoit, label3);

+	r = s >> 4;

+	s &= 15;

+	if (s) {

+	  if (s != 1)		/* size of new coef should always be 1 */

+	    WARNMS(cinfo, JWRN_HUFF_BAD_CODE);

+	  CHECK_BIT_BUFFER(br_state, 1, goto undoit);

+	  if (GET_BITS(1))

+	    s = p1;		/* newly nonzero coef is positive */

+	  else

+	    s = m1;		/* newly nonzero coef is negative */

+	} else {

+	  if (r != 15) {

+	    EOBRUN = 1 << r;	/* EOBr, run length is 2^r + appended bits */

+	    if (r) {

+	      CHECK_BIT_BUFFER(br_state, r, goto undoit);

+	      r = GET_BITS(r);

+	      EOBRUN += r;

+	    }

+	    break;		/* rest of block is handled by EOB logic */

+	  }

+	  /* note s = 0 for processing ZRL */

+	}

+	/* Advance over already-nonzero coefs and r still-zero coefs,

+	 * appending correction bits to the nonzeroes.  A correction bit is 1

+	 * if the absolute value of the coefficient must be increased.

+	 */

+	do {

+	  thiscoef = *block + jpeg_natural_order[k];

+	  if (*thiscoef != 0) {

+	    CHECK_BIT_BUFFER(br_state, 1, goto undoit);

+	    if (GET_BITS(1)) {

+	      if ((*thiscoef & p1) == 0) { /* do nothing if already set it */

+		if (*thiscoef >= 0)

+		  *thiscoef += p1;

+		else

+		  *thiscoef += m1;

+	      }

+	    }

+	  } else {

+	    if (--r < 0)

+	      break;		/* reached target zero coefficient */

+	  }

+	  k++;

+	} while (k <= Se);

+	if (s) {

+	  int pos = jpeg_natural_order[k];

+	  /* Output newly nonzero coefficient */

+	  (*block)[pos] = (JCOEF) s;

+	  /* Remember its position in case we have to suspend */

+	  newnz_pos[num_newnz++] = pos;

+	}

+      }

+    }

+

+    if (EOBRUN > 0) {

+      /* Scan any remaining coefficient positions after the end-of-band

+       * (the last newly nonzero coefficient, if any).  Append a correction

+       * bit to each already-nonzero coefficient.  A correction bit is 1

+       * if the absolute value of the coefficient must be increased.

+       */

+      for (; k <= Se; k++) {

+	thiscoef = *block + jpeg_natural_order[k];

+	if (*thiscoef != 0) {

+	  CHECK_BIT_BUFFER(br_state, 1, goto undoit);

+	  if (GET_BITS(1)) {

+	    if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */

+	      if (*thiscoef >= 0)

+		*thiscoef += p1;

+	      else

+		*thiscoef += m1;

+	    }

+	  }

+	}

+      }

+      /* Count one block completed in EOB run */

+      EOBRUN--;

+    }

+

+    /* Completed MCU, so update state */

+    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);

+    entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */

+  }

+

+  /* Account for restart interval (no-op if not using restarts) */

+  entropy->restarts_to_go--;

+

+  return TRUE;

+

+undoit:

+  /* Re-zero any output coefficients that we made newly nonzero */

+  while (num_newnz > 0)

+    (*block)[newnz_pos[--num_newnz]] = 0;

+

+  return FALSE;

+}

+

+

+/*

+ * Module initialization routine for progressive Huffman entropy decoding.

+ */

+

+GLOBAL(void)

+jinit_phuff_decoder (j_decompress_ptr cinfo)

+{

+  phuff_entropy_ptr entropy;

+  int *coef_bit_ptr;

+  int ci, i;

+

+  entropy = (phuff_entropy_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(phuff_entropy_decoder));

+  cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;

+  entropy->pub.start_pass = start_pass_phuff_decoder;

+

+  /* Mark derived tables unallocated */

+  for (i = 0; i < NUM_HUFF_TBLS; i++) {

+    entropy->derived_tbls[i] = NULL;

+  }

+

+  /* Create progression status table */

+  cinfo->coef_bits = (int (*)[DCTSIZE2])

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				cinfo->num_components*DCTSIZE2*SIZEOF(int));

+  coef_bit_ptr = & cinfo->coef_bits[0][0];

+  for (ci = 0; ci < cinfo->num_components; ci++) 

+    for (i = 0; i < DCTSIZE2; i++)

+      *coef_bit_ptr++ = -1;

+}

+

+#endif /* D_PROGRESSIVE_SUPPORTED */

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c b/core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c
new file mode 100644
index 0000000..855be5c
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c
@@ -0,0 +1,293 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdpostct.c

+ *

+ * Copyright (C) 1994-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains the decompression postprocessing controller.

+ * This controller manages the upsampling, color conversion, and color

+ * quantization/reduction steps; specifically, it controls the buffering

+ * between upsample/color conversion and color quantization/reduction.

+ *

+ * If no color quantization/reduction is required, then this module has no

+ * work to do, and it just hands off to the upsample/color conversion code.

+ * An integrated upsample/convert/quantize process would replace this module

+ * entirely.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* Private buffer controller object */

+

+typedef struct {

+  struct jpeg_d_post_controller pub; /* public fields */

+

+  /* Color quantization source buffer: this holds output data from

+   * the upsample/color conversion step to be passed to the quantizer.

+   * For two-pass color quantization, we need a full-image buffer;

+   * for one-pass operation, a strip buffer is sufficient.

+   */

+  jvirt_sarray_ptr whole_image;	/* virtual array, or NULL if one-pass */

+  JSAMPARRAY buffer;		/* strip buffer, or current strip of virtual */

+  JDIMENSION strip_height;	/* buffer size in rows */

+  /* for two-pass mode only: */

+  JDIMENSION starting_row;	/* row # of first row in current strip */

+  JDIMENSION next_row;		/* index of next row to fill/empty in strip */

+} my_post_controller;

+

+typedef my_post_controller * my_post_ptr;

+

+

+/* Forward declarations */

+METHODDEF(void) post_process_1pass

+	JPP((j_decompress_ptr cinfo,

+	     JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,

+	     JDIMENSION in_row_groups_avail,

+	     JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+	     JDIMENSION out_rows_avail));

+#ifdef QUANT_2PASS_SUPPORTED

+METHODDEF(void) post_process_prepass

+	JPP((j_decompress_ptr cinfo,

+	     JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,

+	     JDIMENSION in_row_groups_avail,

+	     JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+	     JDIMENSION out_rows_avail));

+METHODDEF(void) post_process_2pass

+	JPP((j_decompress_ptr cinfo,

+	     JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,

+	     JDIMENSION in_row_groups_avail,

+	     JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+	     JDIMENSION out_rows_avail));

+#endif

+

+

+/*

+ * Initialize for a processing pass.

+ */

+

+METHODDEF(void)

+start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)

+{

+  my_post_ptr post = (my_post_ptr) cinfo->post;

+

+  switch (pass_mode) {

+  case JBUF_PASS_THRU:

+    if (cinfo->quantize_colors) {

+      /* Single-pass processing with color quantization. */

+      post->pub.post_process_data = post_process_1pass;

+      /* We could be doing buffered-image output before starting a 2-pass

+       * color quantization; in that case, jinit_d_post_controller did not

+       * allocate a strip buffer.  Use the virtual-array buffer as workspace.

+       */

+      if (post->buffer == NULL) {

+	post->buffer = (*cinfo->mem->access_virt_sarray)

+	  ((j_common_ptr) cinfo, post->whole_image,

+	   (JDIMENSION) 0, post->strip_height, TRUE);

+      }

+    } else {

+      /* For single-pass processing without color quantization,

+       * I have no work to do; just call the upsampler directly.

+       */

+      post->pub.post_process_data = cinfo->upsample->upsample;

+    }

+    break;

+#ifdef QUANT_2PASS_SUPPORTED

+  case JBUF_SAVE_AND_PASS:

+    /* First pass of 2-pass quantization */

+    if (post->whole_image == NULL)

+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+    post->pub.post_process_data = post_process_prepass;

+    break;

+  case JBUF_CRANK_DEST:

+    /* Second pass of 2-pass quantization */

+    if (post->whole_image == NULL)

+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+    post->pub.post_process_data = post_process_2pass;

+    break;

+#endif /* QUANT_2PASS_SUPPORTED */

+  default:

+    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+    break;

+  }

+  post->starting_row = post->next_row = 0;

+}

+

+

+/*

+ * Process some data in the one-pass (strip buffer) case.

+ * This is used for color precision reduction as well as one-pass quantization.

+ */

+

+METHODDEF(void)

+post_process_1pass (j_decompress_ptr cinfo,

+		    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,

+		    JDIMENSION in_row_groups_avail,

+		    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+		    JDIMENSION out_rows_avail)

+{

+  my_post_ptr post = (my_post_ptr) cinfo->post;

+  JDIMENSION num_rows, max_rows;

+

+  /* Fill the buffer, but not more than what we can dump out in one go. */

+  /* Note we rely on the upsampler to detect bottom of image. */

+  max_rows = out_rows_avail - *out_row_ctr;

+  if (max_rows > post->strip_height)

+    max_rows = post->strip_height;

+  num_rows = 0;

+  (*cinfo->upsample->upsample) (cinfo,

+		input_buf, in_row_group_ctr, in_row_groups_avail,

+		post->buffer, &num_rows, max_rows);

+  /* Quantize and emit data. */

+  (*cinfo->cquantize->color_quantize) (cinfo,

+		post->buffer, output_buf + *out_row_ctr, (int) num_rows);

+  *out_row_ctr += num_rows;

+}

+

+

+#ifdef QUANT_2PASS_SUPPORTED

+

+/*

+ * Process some data in the first pass of 2-pass quantization.

+ */

+

+METHODDEF(void)

+post_process_prepass (j_decompress_ptr cinfo,

+		      JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,

+		      JDIMENSION in_row_groups_avail,

+		      JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+		      JDIMENSION out_rows_avail)

+{

+  my_post_ptr post = (my_post_ptr) cinfo->post;

+  JDIMENSION old_next_row, num_rows;

+

+  /* Reposition virtual buffer if at start of strip. */

+  if (post->next_row == 0) {

+    post->buffer = (*cinfo->mem->access_virt_sarray)

+	((j_common_ptr) cinfo, post->whole_image,

+	 post->starting_row, post->strip_height, TRUE);

+  }

+

+  /* Upsample some data (up to a strip height's worth). */

+  old_next_row = post->next_row;

+  (*cinfo->upsample->upsample) (cinfo,

+		input_buf, in_row_group_ctr, in_row_groups_avail,

+		post->buffer, &post->next_row, post->strip_height);

+

+  /* Allow quantizer to scan new data.  No data is emitted, */

+  /* but we advance out_row_ctr so outer loop can tell when we're done. */

+  if (post->next_row > old_next_row) {

+    num_rows = post->next_row - old_next_row;

+    (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row,

+					 (JSAMPARRAY) NULL, (int) num_rows);

+    *out_row_ctr += num_rows;

+  }

+

+  /* Advance if we filled the strip. */

+  if (post->next_row >= post->strip_height) {

+    post->starting_row += post->strip_height;

+    post->next_row = 0;

+  }

+}

+

+

+/*

+ * Process some data in the second pass of 2-pass quantization.

+ */

+

+METHODDEF(void)

+post_process_2pass (j_decompress_ptr cinfo,

+		    JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,

+		    JDIMENSION in_row_groups_avail,

+		    JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+		    JDIMENSION out_rows_avail)

+{

+  my_post_ptr post = (my_post_ptr) cinfo->post;

+  JDIMENSION num_rows, max_rows;

+

+  /* Reposition virtual buffer if at start of strip. */

+  if (post->next_row == 0) {

+    post->buffer = (*cinfo->mem->access_virt_sarray)

+	((j_common_ptr) cinfo, post->whole_image,

+	 post->starting_row, post->strip_height, FALSE);

+  }

+

+  /* Determine number of rows to emit. */

+  num_rows = post->strip_height - post->next_row; /* available in strip */

+  max_rows = out_rows_avail - *out_row_ctr; /* available in output area */

+  if (num_rows > max_rows)

+    num_rows = max_rows;

+  /* We have to check bottom of image here, can't depend on upsampler. */

+  max_rows = cinfo->output_height - post->starting_row;

+  if (num_rows > max_rows)

+    num_rows = max_rows;

+

+  /* Quantize and emit data. */

+  (*cinfo->cquantize->color_quantize) (cinfo,

+		post->buffer + post->next_row, output_buf + *out_row_ctr,

+		(int) num_rows);

+  *out_row_ctr += num_rows;

+

+  /* Advance if we filled the strip. */

+  post->next_row += num_rows;

+  if (post->next_row >= post->strip_height) {

+    post->starting_row += post->strip_height;

+    post->next_row = 0;

+  }

+}

+

+#endif /* QUANT_2PASS_SUPPORTED */

+

+

+/*

+ * Initialize postprocessing controller.

+ */

+

+GLOBAL(void)

+jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer)

+{

+  my_post_ptr post;

+

+  post = (my_post_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_post_controller));

+  cinfo->post = (struct jpeg_d_post_controller *) post;

+  post->pub.start_pass = start_pass_dpost;

+  post->whole_image = NULL;	/* flag for no virtual arrays */

+  post->buffer = NULL;		/* flag for no strip buffer */

+

+  /* Create the quantization buffer, if needed */

+  if (cinfo->quantize_colors) {

+    /* The buffer strip height is max_v_samp_factor, which is typically

+     * an efficient number of rows for upsampling to return.

+     * (In the presence of output rescaling, we might want to be smarter?)

+     */

+    post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor;

+    if (need_full_buffer) {

+      /* Two-pass color quantization: need full-image storage. */

+      /* We round up the number of rows to a multiple of the strip height. */

+#ifdef QUANT_2PASS_SUPPORTED

+      post->whole_image = (*cinfo->mem->request_virt_sarray)

+	((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,

+	 cinfo->output_width * cinfo->out_color_components,

+	 (JDIMENSION) jround_up((long) cinfo->output_height,

+				(long) post->strip_height),

+	 post->strip_height);

+#else

+      ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);

+#endif /* QUANT_2PASS_SUPPORTED */

+    } else {

+      /* One-pass color quantization: just make a strip buffer. */

+      post->buffer = (*cinfo->mem->alloc_sarray)

+	((j_common_ptr) cinfo, JPOOL_IMAGE,

+	 cinfo->output_width * cinfo->out_color_components,

+	 post->strip_height);

+    }

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdsample.c b/core/src/fxcodec/libjpeg/fpdfapi_jdsample.c
new file mode 100644
index 0000000..a2eae95
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdsample.c
@@ -0,0 +1,481 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdsample.c

+ *

+ * Copyright (C) 1991-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains upsampling routines.

+ *

+ * Upsampling input data is counted in "row groups".  A row group

+ * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)

+ * sample rows of each component.  Upsampling will normally produce

+ * max_v_samp_factor pixel rows from each row group (but this could vary

+ * if the upsampler is applying a scale factor of its own).

+ *

+ * An excellent reference for image resampling is

+ *   Digital Image Warping, George Wolberg, 1990.

+ *   Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* Pointer to routine to upsample a single component */

+typedef JMETHOD(void, upsample1_ptr,

+		(j_decompress_ptr cinfo, jpeg_component_info * compptr,

+		 JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));

+

+/* Private subobject */

+

+typedef struct {

+  struct jpeg_upsampler pub;	/* public fields */

+

+  /* Color conversion buffer.  When using separate upsampling and color

+   * conversion steps, this buffer holds one upsampled row group until it

+   * has been color converted and output.

+   * Note: we do not allocate any storage for component(s) which are full-size,

+   * ie do not need rescaling.  The corresponding entry of color_buf[] is

+   * simply set to point to the input data array, thereby avoiding copying.

+   */

+  JSAMPARRAY color_buf[MAX_COMPONENTS];

+

+  /* Per-component upsampling method pointers */

+  upsample1_ptr methods[MAX_COMPONENTS];

+

+  int next_row_out;		/* counts rows emitted from color_buf */

+  JDIMENSION rows_to_go;	/* counts rows remaining in image */

+

+  /* Height of an input row group for each component. */

+  int rowgroup_height[MAX_COMPONENTS];

+

+  /* These arrays save pixel expansion factors so that int_expand need not

+   * recompute them each time.  They are unused for other upsampling methods.

+   */

+  UINT8 h_expand[MAX_COMPONENTS];

+  UINT8 v_expand[MAX_COMPONENTS];

+} my_upsampler;

+

+typedef my_upsampler * my_upsample_ptr;

+

+

+/*

+ * Initialize for an upsampling pass.

+ */

+

+METHODDEF(void)

+start_pass_upsample (j_decompress_ptr cinfo)

+{

+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;

+

+  /* Mark the conversion buffer empty */

+  upsample->next_row_out = cinfo->max_v_samp_factor;

+  /* Initialize total-height counter for detecting bottom of image */

+  upsample->rows_to_go = cinfo->output_height;

+}

+

+

+/*

+ * Control routine to do upsampling (and color conversion).

+ *

+ * In this version we upsample each component independently.

+ * We upsample one row group into the conversion buffer, then apply

+ * color conversion a row at a time.

+ */

+

+METHODDEF(void)

+sep_upsample (j_decompress_ptr cinfo,

+	      JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,

+	      JDIMENSION in_row_groups_avail,

+	      JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+	      JDIMENSION out_rows_avail)

+{

+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;

+  int ci;

+  jpeg_component_info * compptr;

+  JDIMENSION num_rows;

+

+  /* Fill the conversion buffer, if it's empty */

+  if (upsample->next_row_out >= cinfo->max_v_samp_factor) {

+    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+	 ci++, compptr++) {

+      /* Invoke per-component upsample method.  Notice we pass a POINTER

+       * to color_buf[ci], so that fullsize_upsample can change it.

+       */

+      (*upsample->methods[ci]) (cinfo, compptr,

+	input_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]),

+	upsample->color_buf + ci);

+    }

+    upsample->next_row_out = 0;

+  }

+

+  /* Color-convert and emit rows */

+

+  /* How many we have in the buffer: */

+  num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out);

+  /* Not more than the distance to the end of the image.  Need this test

+   * in case the image height is not a multiple of max_v_samp_factor:

+   */

+  if (num_rows > upsample->rows_to_go) 

+    num_rows = upsample->rows_to_go;

+  /* And not more than what the client can accept: */

+  out_rows_avail -= *out_row_ctr;

+  if (num_rows > out_rows_avail)

+    num_rows = out_rows_avail;

+

+  (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf,

+				     (JDIMENSION) upsample->next_row_out,

+				     output_buf + *out_row_ctr,

+				     (int) num_rows);

+

+  /* Adjust counts */

+  *out_row_ctr += num_rows;

+  upsample->rows_to_go -= num_rows;

+  upsample->next_row_out += num_rows;

+  /* When the buffer is emptied, declare this input row group consumed */

+  if (upsample->next_row_out >= cinfo->max_v_samp_factor)

+    (*in_row_group_ctr)++;

+}

+

+

+/*

+ * These are the routines invoked by sep_upsample to upsample pixel values

+ * of a single component.  One row group is processed per call.

+ */

+

+

+/*

+ * For full-size components, we just make color_buf[ci] point at the

+ * input buffer, and thus avoid copying any data.  Note that this is

+ * safe only because sep_upsample doesn't declare the input row group

+ * "consumed" until we are done color converting and emitting it.

+ */

+

+METHODDEF(void)

+fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,

+		   JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)

+{

+  *output_data_ptr = input_data;

+}

+

+

+/*

+ * This is a no-op version used for "uninteresting" components.

+ * These components will not be referenced by color conversion.

+ */

+

+METHODDEF(void)

+noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	       JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)

+{

+  *output_data_ptr = NULL;	/* safety check */

+}

+

+

+/*

+ * This version handles any integral sampling ratios.

+ * This is not used for typical JPEG files, so it need not be fast.

+ * Nor, for that matter, is it particularly accurate: the algorithm is

+ * simple replication of the input pixel onto the corresponding output

+ * pixels.  The hi-falutin sampling literature refers to this as a

+ * "box filter".  A box filter tends to introduce visible artifacts,

+ * so if you are actually going to use 3:1 or 4:1 sampling ratios

+ * you would be well advised to improve this code.

+ */

+

+METHODDEF(void)

+int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	      JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)

+{

+  my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;

+  JSAMPARRAY output_data = *output_data_ptr;

+  register JSAMPROW inptr, outptr;

+  register JSAMPLE invalue;

+  register int h;

+  JSAMPROW outend;

+  int h_expand, v_expand;

+  int inrow, outrow;

+

+  h_expand = upsample->h_expand[compptr->component_index];

+  v_expand = upsample->v_expand[compptr->component_index];

+

+  inrow = outrow = 0;

+  while (outrow < cinfo->max_v_samp_factor) {

+    /* Generate one output row with proper horizontal expansion */

+    inptr = input_data[inrow];

+    outptr = output_data[outrow];

+    outend = outptr + cinfo->output_width;

+    while (outptr < outend) {

+      invalue = *inptr++;	/* don't need GETJSAMPLE() here */

+      for (h = h_expand; h > 0; h--) {

+	*outptr++ = invalue;

+      }

+    }

+    /* Generate any additional output rows by duplicating the first one */

+    if (v_expand > 1) {

+      jcopy_sample_rows(output_data, outrow, output_data, outrow+1,

+			v_expand-1, cinfo->output_width);

+    }

+    inrow++;

+    outrow += v_expand;

+  }

+}

+

+

+/*

+ * Fast processing for the common case of 2:1 horizontal and 1:1 vertical.

+ * It's still a box filter.

+ */

+

+METHODDEF(void)

+h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	       JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)

+{

+  JSAMPARRAY output_data = *output_data_ptr;

+  register JSAMPROW inptr, outptr;

+  register JSAMPLE invalue;

+  JSAMPROW outend;

+  int inrow;

+

+  for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {

+    inptr = input_data[inrow];

+    outptr = output_data[inrow];

+    outend = outptr + cinfo->output_width;

+    while (outptr < outend) {

+      invalue = *inptr++;	/* don't need GETJSAMPLE() here */

+      *outptr++ = invalue;

+      *outptr++ = invalue;

+    }

+  }

+}

+

+

+/*

+ * Fast processing for the common case of 2:1 horizontal and 2:1 vertical.

+ * It's still a box filter.

+ */

+

+METHODDEF(void)

+h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	       JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)

+{

+  JSAMPARRAY output_data = *output_data_ptr;

+  register JSAMPROW inptr, outptr;

+  register JSAMPLE invalue;

+  JSAMPROW outend;

+  int inrow, outrow;

+

+  inrow = outrow = 0;

+  while (outrow < cinfo->max_v_samp_factor) {

+    inptr = input_data[inrow];

+    outptr = output_data[outrow];

+    outend = outptr + cinfo->output_width;

+    while (outptr < outend) {

+      invalue = *inptr++;	/* don't need GETJSAMPLE() here */

+      *outptr++ = invalue;

+      *outptr++ = invalue;

+    }

+    jcopy_sample_rows(output_data, outrow, output_data, outrow+1,

+		      1, cinfo->output_width);

+    inrow++;

+    outrow += 2;

+  }

+}

+

+

+/*

+ * Fancy processing for the common case of 2:1 horizontal and 1:1 vertical.

+ *

+ * The upsampling algorithm is linear interpolation between pixel centers,

+ * also known as a "triangle filter".  This is a good compromise between

+ * speed and visual quality.  The centers of the output pixels are 1/4 and 3/4

+ * of the way between input pixel centers.

+ *

+ * A note about the "bias" calculations: when rounding fractional values to

+ * integer, we do not want to always round 0.5 up to the next integer.

+ * If we did that, we'd introduce a noticeable bias towards larger values.

+ * Instead, this code is arranged so that 0.5 will be rounded up or down at

+ * alternate pixel locations (a simple ordered dither pattern).

+ */

+

+METHODDEF(void)

+h2v1_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,

+		     JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)

+{

+  JSAMPARRAY output_data = *output_data_ptr;

+  register JSAMPROW inptr, outptr;

+  register int invalue;

+  register JDIMENSION colctr;

+  int inrow;

+

+  for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {

+    inptr = input_data[inrow];

+    outptr = output_data[inrow];

+    /* Special case for first column */

+    invalue = GETJSAMPLE(*inptr++);

+    *outptr++ = (JSAMPLE) invalue;

+    *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2);

+

+    for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {

+      /* General case: 3/4 * nearer pixel + 1/4 * further pixel */

+      invalue = GETJSAMPLE(*inptr++) * 3;

+      *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2);

+      *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2);

+    }

+

+    /* Special case for last column */

+    invalue = GETJSAMPLE(*inptr);

+    *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2);

+    *outptr++ = (JSAMPLE) invalue;

+  }

+}

+

+

+/*

+ * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical.

+ * Again a triangle filter; see comments for h2v1 case, above.

+ *

+ * It is OK for us to reference the adjacent input rows because we demanded

+ * context from the main buffer controller (see initialization code).

+ */

+

+METHODDEF(void)

+h2v2_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,

+		     JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)

+{

+  JSAMPARRAY output_data = *output_data_ptr;

+  register JSAMPROW inptr0, inptr1, outptr;

+#if BITS_IN_JSAMPLE == 8

+  register int thiscolsum, lastcolsum, nextcolsum;

+#else

+  register INT32 thiscolsum, lastcolsum, nextcolsum;

+#endif

+  register JDIMENSION colctr;

+  int inrow, outrow, v;

+

+  inrow = outrow = 0;

+  while (outrow < cinfo->max_v_samp_factor) {

+    for (v = 0; v < 2; v++) {

+      /* inptr0 points to nearest input row, inptr1 points to next nearest */

+      inptr0 = input_data[inrow];

+      if (v == 0)		/* next nearest is row above */

+	inptr1 = input_data[inrow-1];

+      else			/* next nearest is row below */

+	inptr1 = input_data[inrow+1];

+      outptr = output_data[outrow++];

+

+      /* Special case for first column */

+      thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);

+      nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);

+      *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4);

+      *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);

+      lastcolsum = thiscolsum; thiscolsum = nextcolsum;

+

+      for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {

+	/* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */

+	/* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */

+	nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);

+	*outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);

+	*outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);

+	lastcolsum = thiscolsum; thiscolsum = nextcolsum;

+      }

+

+      /* Special case for last column */

+      *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);

+      *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 7) >> 4);

+    }

+    inrow++;

+  }

+}

+

+

+/*

+ * Module initialization routine for upsampling.

+ */

+

+GLOBAL(void)

+jinit_upsampler (j_decompress_ptr cinfo)

+{

+  my_upsample_ptr upsample;

+  int ci;

+  jpeg_component_info * compptr;

+  boolean need_buffer, do_fancy;

+  int h_in_group, v_in_group, h_out_group, v_out_group;

+

+  upsample = (my_upsample_ptr)

+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,

+				SIZEOF(my_upsampler));

+  cinfo->upsample = (struct jpeg_upsampler *) upsample;

+  upsample->pub.start_pass = start_pass_upsample;

+  upsample->pub.upsample = sep_upsample;

+  upsample->pub.need_context_rows = FALSE; /* until we find out differently */

+

+  if (cinfo->CCIR601_sampling)	/* this isn't supported */

+    ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);

+

+  /* jdmainct.c doesn't support context rows when min_DCT_scaled_size = 1,

+   * so don't ask for it.

+   */

+  do_fancy = cinfo->do_fancy_upsampling && cinfo->min_DCT_scaled_size > 1;

+

+  /* Verify we can handle the sampling factors, select per-component methods,

+   * and create storage as needed.

+   */

+  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;

+       ci++, compptr++) {

+    /* Compute size of an "input group" after IDCT scaling.  This many samples

+     * are to be converted to max_h_samp_factor * max_v_samp_factor pixels.

+     */

+    h_in_group = (compptr->h_samp_factor * compptr->DCT_scaled_size) /

+		 cinfo->min_DCT_scaled_size;

+    v_in_group = (compptr->v_samp_factor * compptr->DCT_scaled_size) /

+		 cinfo->min_DCT_scaled_size;

+    h_out_group = cinfo->max_h_samp_factor;

+    v_out_group = cinfo->max_v_samp_factor;

+    upsample->rowgroup_height[ci] = v_in_group; /* save for use later */

+    need_buffer = TRUE;

+    if (! compptr->component_needed) {

+      /* Don't bother to upsample an uninteresting component. */

+      upsample->methods[ci] = noop_upsample;

+      need_buffer = FALSE;

+    } else if (h_in_group == h_out_group && v_in_group == v_out_group) {

+      /* Fullsize components can be processed without any work. */

+      upsample->methods[ci] = fullsize_upsample;

+      need_buffer = FALSE;

+    } else if (h_in_group * 2 == h_out_group &&

+	       v_in_group == v_out_group) {

+      /* Special cases for 2h1v upsampling */

+      if (do_fancy && compptr->downsampled_width > 2)

+	upsample->methods[ci] = h2v1_fancy_upsample;

+      else

+	upsample->methods[ci] = h2v1_upsample;

+    } else if (h_in_group * 2 == h_out_group &&

+	       v_in_group * 2 == v_out_group) {

+      /* Special cases for 2h2v upsampling */

+      if (do_fancy && compptr->downsampled_width > 2) {

+	upsample->methods[ci] = h2v2_fancy_upsample;

+	upsample->pub.need_context_rows = TRUE;

+      } else

+	upsample->methods[ci] = h2v2_upsample;

+    } else if ((h_out_group % h_in_group) == 0 &&

+	       (v_out_group % v_in_group) == 0) {

+      /* Generic integral-factors upsampling method */

+      upsample->methods[ci] = int_upsample;

+      upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group);

+      upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group);

+    } else

+      ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);

+    if (need_buffer) {

+      upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray)

+	((j_common_ptr) cinfo, JPOOL_IMAGE,

+	 (JDIMENSION) jround_up((long) cinfo->output_width,

+				(long) cinfo->max_h_samp_factor),

+	 (JDIMENSION) cinfo->max_v_samp_factor);

+    }

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c b/core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c
new file mode 100644
index 0000000..c076a6c
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c
@@ -0,0 +1,146 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jdtrans.c

+ *

+ * Copyright (C) 1995-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains library routines for transcoding decompression,

+ * that is, reading raw DCT coefficient arrays from an input JPEG file.

+ * The routines in jdapimin.c will also be needed by a transcoder.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/* Forward declarations */

+LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo));

+

+

+/*

+ * Read the coefficient arrays from a JPEG file.

+ * jpeg_read_header must be completed before calling this.

+ *

+ * The entire image is read into a set of virtual coefficient-block arrays,

+ * one per component.  The return value is a pointer to the array of

+ * virtual-array descriptors.  These can be manipulated directly via the

+ * JPEG memory manager, or handed off to jpeg_write_coefficients().

+ * To release the memory occupied by the virtual arrays, call

+ * jpeg_finish_decompress() when done with the data.

+ *

+ * An alternative usage is to simply obtain access to the coefficient arrays

+ * during a buffered-image-mode decompression operation.  This is allowed

+ * after any jpeg_finish_output() call.  The arrays can be accessed until

+ * jpeg_finish_decompress() is called.  (Note that any call to the library

+ * may reposition the arrays, so don't rely on access_virt_barray() results

+ * to stay valid across library calls.)

+ *

+ * Returns NULL if suspended.  This case need be checked only if

+ * a suspending data source is used.

+ */

+

+GLOBAL(jvirt_barray_ptr *)

+jpeg_read_coefficients (j_decompress_ptr cinfo)

+{

+  if (cinfo->global_state == DSTATE_READY) {

+    /* First call: initialize active modules */

+    transdecode_master_selection(cinfo);

+    cinfo->global_state = DSTATE_RDCOEFS;

+  }

+  if (cinfo->global_state == DSTATE_RDCOEFS) {

+    /* Absorb whole file into the coef buffer */

+    for (;;) {

+      int retcode;

+      /* Call progress monitor hook if present */

+      if (cinfo->progress != NULL)

+	(*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);

+      /* Absorb some more input */

+      retcode = (*cinfo->inputctl->consume_input) (cinfo);

+      if (retcode == JPEG_SUSPENDED)

+	return NULL;

+      if (retcode == JPEG_REACHED_EOI)

+	break;

+      /* Advance progress counter if appropriate */

+      if (cinfo->progress != NULL &&

+	  (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {

+	if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {

+	  /* startup underestimated number of scans; ratchet up one scan */

+	  cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;

+	}

+      }

+    }

+    /* Set state so that jpeg_finish_decompress does the right thing */

+    cinfo->global_state = DSTATE_STOPPING;

+  }

+  /* At this point we should be in state DSTATE_STOPPING if being used

+   * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access

+   * to the coefficients during a full buffered-image-mode decompression.

+   */

+  if ((cinfo->global_state == DSTATE_STOPPING ||

+       cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {

+    return cinfo->coef->coef_arrays;

+  }

+  /* Oops, improper usage */

+  ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);

+  return NULL;			/* keep compiler happy */

+}

+

+

+/*

+ * Master selection of decompression modules for transcoding.

+ * This substitutes for jdmaster.c's initialization of the full decompressor.

+ */

+

+LOCAL(void)

+transdecode_master_selection (j_decompress_ptr cinfo)

+{

+  /* This is effectively a buffered-image operation. */

+  cinfo->buffered_image = TRUE;

+

+  /* Entropy decoding: either Huffman or arithmetic coding. */

+  if (cinfo->arith_code) {

+    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);

+  } else {

+    if (cinfo->progressive_mode) {

+#ifdef D_PROGRESSIVE_SUPPORTED

+      jinit_phuff_decoder(cinfo);

+#else

+      ERREXIT(cinfo, JERR_NOT_COMPILED);

+#endif

+    } else

+      jinit_huff_decoder(cinfo);

+  }

+

+  /* Always get a full-image coefficient buffer. */

+  jinit_d_coef_controller(cinfo, TRUE);

+

+  /* We can now tell the memory manager to allocate virtual arrays. */

+  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);

+

+  /* Initialize input side of decompressor to consume first scan. */

+  (*cinfo->inputctl->start_input_pass) (cinfo);

+

+  /* Initialize progress monitoring. */

+  if (cinfo->progress != NULL) {

+    int nscans;

+    /* Estimate number of scans to set pass_limit. */

+    if (cinfo->progressive_mode) {

+      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */

+      nscans = 2 + 3 * cinfo->num_components;

+    } else if (cinfo->inputctl->has_multiple_scans) {

+      /* For a nonprogressive multiscan file, estimate 1 scan per component. */

+      nscans = cinfo->num_components;

+    } else {

+      nscans = 1;

+    }

+    cinfo->progress->pass_counter = 0L;

+    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;

+    cinfo->progress->completed_passes = 0;

+    cinfo->progress->total_passes = 1;

+  }

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jerror.c b/core/src/fxcodec/libjpeg/fpdfapi_jerror.c
new file mode 100644
index 0000000..9d673ba
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jerror.c
@@ -0,0 +1,255 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jerror.c

+ *

+ * Copyright (C) 1991-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains simple error-reporting and trace-message routines.

+ * These are suitable for Unix-like systems and others where writing to

+ * stderr is the right thing to do.  Many applications will want to replace

+ * some or all of these routines.

+ *

+ * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile,

+ * you get a Windows-specific hack to display error messages in a dialog box.

+ * It ain't much, but it beats dropping error messages into the bit bucket,

+ * which is what happens to output to stderr under most Windows C compilers.

+ *

+ * These routines are used by both the compression and decompression code.

+ */

+

+/* this is not a core library module, so it doesn't define JPEG_INTERNALS */

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jversion.h"

+#include "jerror.h"

+

+#ifndef EXIT_FAILURE		/* define exit() codes if not provided */

+#define EXIT_FAILURE  1

+#endif

+

+

+/*

+ * Create the message string table.

+ * We do this from the master message list in jerror.h by re-reading

+ * jerror.h with a suitable definition for macro JMESSAGE.

+ * The message table is made an external symbol just in case any applications

+ * want to refer to it directly.

+ */

+

+#ifdef NEED_SHORT_EXTERNAL_NAMES

+#define jpeg_std_message_table	jMsgTable

+#endif

+

+#define JMESSAGE(code,string)	string ,

+

+const char * const jpeg_std_message_table[] = {

+#include "jerror.h"

+  NULL

+};

+

+

+/*

+ * Error exit handler: must not return to caller.

+ *

+ * Applications may override this if they want to get control back after

+ * an error.  Typically one would longjmp somewhere instead of exiting.

+ * The setjmp buffer can be made a private field within an expanded error

+ * handler object.  Note that the info needed to generate an error message

+ * is stored in the error object, so you can generate the message now or

+ * later, at your convenience.

+ * You should make sure that the JPEG object is cleaned up (with jpeg_abort

+ * or jpeg_destroy) at some point.

+ */

+

+METHODDEF(void)

+error_exit (j_common_ptr cinfo)

+{

+  /* Always display the message */

+  (*cinfo->err->output_message) (cinfo);

+

+  /* Let the memory manager delete any temp files before we die */

+  jpeg_destroy(cinfo);

+

+//  exit(EXIT_FAILURE);

+}

+

+

+/*

+ * Actual output of an error or trace message.

+ * Applications may override this method to send JPEG messages somewhere

+ * other than stderr.

+ *

+ * On Windows, printing to stderr is generally completely useless,

+ * so we provide optional code to produce an error-dialog popup.

+ * Most Windows applications will still prefer to override this routine,

+ * but if they don't, it'll do something at least marginally useful.

+ *

+ * NOTE: to use the library in an environment that doesn't support the

+ * C stdio library, you may have to delete the call to fprintf() entirely,

+ * not just not use this routine.

+ */

+

+METHODDEF(void)

+output_message (j_common_ptr cinfo)

+{

+  char buffer[JMSG_LENGTH_MAX];

+

+  /* Create the message */

+  (*cinfo->err->format_message) (cinfo, buffer);

+

+#ifdef USE_WINDOWS_MESSAGEBOX

+  /* Display it in a message dialog box */

+  MessageBox(GetActiveWindow(), buffer, "JPEG Library Error",

+	     MB_OK | MB_ICONERROR);

+#else

+  /* Send it to stderr, adding a newline */

+#ifndef _FPDFAPI_MINI_

+  FXSYS_fprintf(stderr, "%s\n", buffer);

+#endif

+#endif

+}

+

+

+/*

+ * Decide whether to emit a trace or warning message.

+ * msg_level is one of:

+ *   -1: recoverable corrupt-data warning, may want to abort.

+ *    0: important advisory messages (always display to user).

+ *    1: first level of tracing detail.

+ *    2,3,...: successively more detailed tracing messages.

+ * An application might override this method if it wanted to abort on warnings

+ * or change the policy about which messages to display.

+ */

+

+METHODDEF(void)

+emit_message (j_common_ptr cinfo, int msg_level)

+{

+  struct jpeg_error_mgr * err = cinfo->err;

+

+  if (msg_level < 0) {

+    /* It's a warning message.  Since corrupt files may generate many warnings,

+     * the policy implemented here is to show only the first warning,

+     * unless trace_level >= 3.

+     */

+    if (err->num_warnings == 0 || err->trace_level >= 3)

+      (*err->output_message) (cinfo);

+    /* Always count warnings in num_warnings. */

+    err->num_warnings++;

+  } else {

+    /* It's a trace message.  Show it if trace_level >= msg_level. */

+    if (err->trace_level >= msg_level)

+      (*err->output_message) (cinfo);

+  }

+}

+

+

+/*

+ * Format a message string for the most recent JPEG error or message.

+ * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX

+ * characters.  Note that no '\n' character is added to the string.

+ * Few applications should need to override this method.

+ */

+

+METHODDEF(void)

+format_message (j_common_ptr cinfo, char * buffer)

+{

+#if 0	/* XYQ */

+  struct jpeg_error_mgr * err = cinfo->err;

+  int msg_code = err->msg_code;

+  const char * msgtext = NULL;

+  const char * msgptr;

+  char ch;

+  boolean isstring;

+

+  /* Look up message string in proper table */

+  if (msg_code > 0 && msg_code <= err->last_jpeg_message) {

+    msgtext = err->jpeg_message_table[msg_code];

+  } else if (err->addon_message_table != NULL &&

+	     msg_code >= err->first_addon_message &&

+	     msg_code <= err->last_addon_message) {

+    msgtext = err->addon_message_table[msg_code - err->first_addon_message];

+  }

+

+  /* Defend against bogus message number */

+  if (msgtext == NULL) {

+    err->msg_parm.i[0] = msg_code;

+    msgtext = err->jpeg_message_table[0];

+  }

+

+  /* Check for string parameter, as indicated by %s in the message text */

+  isstring = FALSE;

+  msgptr = msgtext;

+  while ((ch = *msgptr++) != '\0') {

+    if (ch == '%') {

+      if (*msgptr == 's') isstring = TRUE;

+      break;

+    }

+  }

+

+  /* Format the message into the passed buffer */

+  if (isstring)

+    FXSYS_sprintf(buffer, msgtext, err->msg_parm.s);

+  else

+    FXSYS_sprintf(buffer, msgtext,

+	    err->msg_parm.i[0], err->msg_parm.i[1],

+	    err->msg_parm.i[2], err->msg_parm.i[3],

+	    err->msg_parm.i[4], err->msg_parm.i[5],

+	    err->msg_parm.i[6], err->msg_parm.i[7]);

+#endif

+}

+

+

+/*

+ * Reset error state variables at start of a new image.

+ * This is called during compression startup to reset trace/error

+ * processing to default state, without losing any application-specific

+ * method pointers.  An application might possibly want to override

+ * this method if it has additional error processing state.

+ */

+

+METHODDEF(void)

+reset_error_mgr (j_common_ptr cinfo)

+{

+  cinfo->err->num_warnings = 0;

+  /* trace_level is not reset since it is an application-supplied parameter */

+  cinfo->err->msg_code = 0;	/* may be useful as a flag for "no error" */

+}

+

+

+/*

+ * Fill in the standard error-handling methods in a jpeg_error_mgr object.

+ * Typical call is:

+ *	struct jpeg_compress_struct cinfo;

+ *	struct jpeg_error_mgr err;

+ *

+ *	cinfo.err = jpeg_std_error(&err);

+ * after which the application may override some of the methods.

+ */

+

+GLOBAL(struct jpeg_error_mgr *)

+jpeg_std_error (struct jpeg_error_mgr * err)

+{

+  err->error_exit = error_exit;

+  err->emit_message = emit_message;

+  err->output_message = output_message;

+  err->format_message = format_message;

+  err->reset_error_mgr = reset_error_mgr;

+

+  err->trace_level = 0;		/* default = no tracing */

+  err->num_warnings = 0;	/* no warnings emitted yet */

+  err->msg_code = 0;		/* may be useful as a flag for "no error" */

+

+  /* Initialize message table pointers */

+  err->jpeg_message_table = jpeg_std_message_table;

+  err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1;

+

+  err->addon_message_table = NULL;

+  err->first_addon_message = 0;	/* for safety */

+  err->last_addon_message = 0;

+

+  return err;

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c b/core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c
new file mode 100644
index 0000000..9cd3dd7
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c
@@ -0,0 +1,227 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jfdctfst.c

+ *

+ * Copyright (C) 1994-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains a fast, not so accurate integer implementation of the

+ * forward DCT (Discrete Cosine Transform).

+ *

+ * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT

+ * on each column.  Direct algorithms are also available, but they are

+ * much more complex and seem not to be any faster when reduced to code.

+ *

+ * This implementation is based on Arai, Agui, and Nakajima's algorithm for

+ * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in

+ * Japanese, but the algorithm is described in the Pennebaker & Mitchell

+ * JPEG textbook (see REFERENCES section in file README).  The following code

+ * is based directly on figure 4-8 in P&M.

+ * While an 8-point DCT cannot be done in less than 11 multiplies, it is

+ * possible to arrange the computation so that many of the multiplies are

+ * simple scalings of the final outputs.  These multiplies can then be

+ * folded into the multiplications or divisions by the JPEG quantization

+ * table entries.  The AA&N method leaves only 5 multiplies and 29 adds

+ * to be done in the DCT itself.

+ * The primary disadvantage of this method is that with fixed-point math,

+ * accuracy is lost due to imprecise representation of the scaled

+ * quantization values.  The smaller the quantization table entry, the less

+ * precise the scaled value, so this implementation does worse with high-

+ * quality-setting files than with low-quality ones.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jdct.h"		/* Private declarations for DCT subsystem */

+

+#ifdef DCT_IFAST_SUPPORTED

+

+

+/*

+ * This module is specialized to the case DCTSIZE = 8.

+ */

+

+#if DCTSIZE != 8

+  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */

+#endif

+

+

+/* Scaling decisions are generally the same as in the LL&M algorithm;

+ * see jfdctint.c for more details.  However, we choose to descale

+ * (right shift) multiplication products as soon as they are formed,

+ * rather than carrying additional fractional bits into subsequent additions.

+ * This compromises accuracy slightly, but it lets us save a few shifts.

+ * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)

+ * everywhere except in the multiplications proper; this saves a good deal

+ * of work on 16-bit-int machines.

+ *

+ * Again to save a few shifts, the intermediate results between pass 1 and

+ * pass 2 are not upscaled, but are represented only to integral precision.

+ *

+ * A final compromise is to represent the multiplicative constants to only

+ * 8 fractional bits, rather than 13.  This saves some shifting work on some

+ * machines, and may also reduce the cost of multiplication (since there

+ * are fewer one-bits in the constants).

+ */

+

+#define CONST_BITS  8

+

+

+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus

+ * causing a lot of useless floating-point operations at run time.

+ * To get around this we use the following pre-calculated constants.

+ * If you change CONST_BITS you may want to add appropriate values.

+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)

+ */

+

+#if CONST_BITS == 8

+#define FIX_0_382683433  ((INT32)   98)		/* FIX(0.382683433) */

+#define FIX_0_541196100  ((INT32)  139)		/* FIX(0.541196100) */

+#define FIX_0_707106781  ((INT32)  181)		/* FIX(0.707106781) */

+#define FIX_1_306562965  ((INT32)  334)		/* FIX(1.306562965) */

+#else

+#define FIX_0_382683433  FIX(0.382683433)

+#define FIX_0_541196100  FIX(0.541196100)

+#define FIX_0_707106781  FIX(0.707106781)

+#define FIX_1_306562965  FIX(1.306562965)

+#endif

+

+

+/* We can gain a little more speed, with a further compromise in accuracy,

+ * by omitting the addition in a descaling shift.  This yields an incorrectly

+ * rounded result half the time...

+ */

+

+#ifndef USE_ACCURATE_ROUNDING

+#undef DESCALE

+#define DESCALE(x,n)  RIGHT_SHIFT(x, n)

+#endif

+

+

+/* Multiply a DCTELEM variable by an INT32 constant, and immediately

+ * descale to yield a DCTELEM result.

+ */

+

+#define MULTIPLY(var,const)  ((DCTELEM) DESCALE((var) * (const), CONST_BITS))

+

+

+/*

+ * Perform the forward DCT on one block of samples.

+ */

+

+GLOBAL(void)

+jpeg_fdct_ifast (DCTELEM * data)

+{

+  DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;

+  DCTELEM tmp10, tmp11, tmp12, tmp13;

+  DCTELEM z1, z2, z3, z4, z5, z11, z13;

+  DCTELEM *dataptr;

+  int ctr;

+  SHIFT_TEMPS

+

+  /* Pass 1: process rows. */

+

+  dataptr = data;

+  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {

+    tmp0 = dataptr[0] + dataptr[7];

+    tmp7 = dataptr[0] - dataptr[7];

+    tmp1 = dataptr[1] + dataptr[6];

+    tmp6 = dataptr[1] - dataptr[6];

+    tmp2 = dataptr[2] + dataptr[5];

+    tmp5 = dataptr[2] - dataptr[5];

+    tmp3 = dataptr[3] + dataptr[4];

+    tmp4 = dataptr[3] - dataptr[4];

+    

+    /* Even part */

+    

+    tmp10 = tmp0 + tmp3;	/* phase 2 */

+    tmp13 = tmp0 - tmp3;

+    tmp11 = tmp1 + tmp2;

+    tmp12 = tmp1 - tmp2;

+    

+    dataptr[0] = tmp10 + tmp11; /* phase 3 */

+    dataptr[4] = tmp10 - tmp11;

+    

+    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */

+    dataptr[2] = tmp13 + z1;	/* phase 5 */

+    dataptr[6] = tmp13 - z1;

+    

+    /* Odd part */

+

+    tmp10 = tmp4 + tmp5;	/* phase 2 */

+    tmp11 = tmp5 + tmp6;

+    tmp12 = tmp6 + tmp7;

+

+    /* The rotator is modified from fig 4-8 to avoid extra negations. */

+    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */

+    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */

+    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */

+    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */

+

+    z11 = tmp7 + z3;		/* phase 5 */

+    z13 = tmp7 - z3;

+

+    dataptr[5] = z13 + z2;	/* phase 6 */

+    dataptr[3] = z13 - z2;

+    dataptr[1] = z11 + z4;

+    dataptr[7] = z11 - z4;

+

+    dataptr += DCTSIZE;		/* advance pointer to next row */

+  }

+

+  /* Pass 2: process columns. */

+

+  dataptr = data;

+  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {

+    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];

+    tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];

+    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];

+    tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];

+    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];

+    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];

+    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];

+    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];

+    

+    /* Even part */

+    

+    tmp10 = tmp0 + tmp3;	/* phase 2 */

+    tmp13 = tmp0 - tmp3;

+    tmp11 = tmp1 + tmp2;

+    tmp12 = tmp1 - tmp2;

+    

+    dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */

+    dataptr[DCTSIZE*4] = tmp10 - tmp11;

+    

+    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */

+    dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */

+    dataptr[DCTSIZE*6] = tmp13 - z1;

+    

+    /* Odd part */

+

+    tmp10 = tmp4 + tmp5;	/* phase 2 */

+    tmp11 = tmp5 + tmp6;

+    tmp12 = tmp6 + tmp7;

+

+    /* The rotator is modified from fig 4-8 to avoid extra negations. */

+    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */

+    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */

+    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */

+    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */

+

+    z11 = tmp7 + z3;		/* phase 5 */

+    z13 = tmp7 - z3;

+

+    dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */

+    dataptr[DCTSIZE*3] = z13 - z2;

+    dataptr[DCTSIZE*1] = z11 + z4;

+    dataptr[DCTSIZE*7] = z11 - z4;

+

+    dataptr++;			/* advance pointer to next column */

+  }

+}

+

+#endif /* DCT_IFAST_SUPPORTED */

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c b/core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c
new file mode 100644
index 0000000..88810a7
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c
@@ -0,0 +1,286 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jfdctint.c

+ *

+ * Copyright (C) 1991-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains a slow-but-accurate integer implementation of the

+ * forward DCT (Discrete Cosine Transform).

+ *

+ * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT

+ * on each column.  Direct algorithms are also available, but they are

+ * much more complex and seem not to be any faster when reduced to code.

+ *

+ * This implementation is based on an algorithm described in

+ *   C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT

+ *   Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,

+ *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.

+ * The primary algorithm described there uses 11 multiplies and 29 adds.

+ * We use their alternate method with 12 multiplies and 32 adds.

+ * The advantage of this method is that no data path contains more than one

+ * multiplication; this allows a very simple and accurate implementation in

+ * scaled fixed-point arithmetic, with a minimal number of shifts.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jdct.h"		/* Private declarations for DCT subsystem */

+

+#ifdef DCT_ISLOW_SUPPORTED

+

+

+/*

+ * This module is specialized to the case DCTSIZE = 8.

+ */

+

+#if DCTSIZE != 8

+  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */

+#endif

+

+

+/*

+ * The poop on this scaling stuff is as follows:

+ *

+ * Each 1-D DCT step produces outputs which are a factor of sqrt(N)

+ * larger than the true DCT outputs.  The final outputs are therefore

+ * a factor of N larger than desired; since N=8 this can be cured by

+ * a simple right shift at the end of the algorithm.  The advantage of

+ * this arrangement is that we save two multiplications per 1-D DCT,

+ * because the y0 and y4 outputs need not be divided by sqrt(N).

+ * In the IJG code, this factor of 8 is removed by the quantization step

+ * (in jcdctmgr.c), NOT in this module.

+ *

+ * We have to do addition and subtraction of the integer inputs, which

+ * is no problem, and multiplication by fractional constants, which is

+ * a problem to do in integer arithmetic.  We multiply all the constants

+ * by CONST_SCALE and convert them to integer constants (thus retaining

+ * CONST_BITS bits of precision in the constants).  After doing a

+ * multiplication we have to divide the product by CONST_SCALE, with proper

+ * rounding, to produce the correct output.  This division can be done

+ * cheaply as a right shift of CONST_BITS bits.  We postpone shifting

+ * as long as possible so that partial sums can be added together with

+ * full fractional precision.

+ *

+ * The outputs of the first pass are scaled up by PASS1_BITS bits so that

+ * they are represented to better-than-integral precision.  These outputs

+ * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word

+ * with the recommended scaling.  (For 12-bit sample data, the intermediate

+ * array is INT32 anyway.)

+ *

+ * To avoid overflow of the 32-bit intermediate results in pass 2, we must

+ * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis

+ * shows that the values given below are the most effective.

+ */

+

+#if BITS_IN_JSAMPLE == 8

+#define CONST_BITS  13

+#define PASS1_BITS  2

+#else

+#define CONST_BITS  13

+#define PASS1_BITS  1		/* lose a little precision to avoid overflow */

+#endif

+

+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus

+ * causing a lot of useless floating-point operations at run time.

+ * To get around this we use the following pre-calculated constants.

+ * If you change CONST_BITS you may want to add appropriate values.

+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)

+ */

+

+#if CONST_BITS == 13

+#define FIX_0_298631336  ((INT32)  2446)	/* FIX(0.298631336) */

+#define FIX_0_390180644  ((INT32)  3196)	/* FIX(0.390180644) */

+#define FIX_0_541196100  ((INT32)  4433)	/* FIX(0.541196100) */

+#define FIX_0_765366865  ((INT32)  6270)	/* FIX(0.765366865) */

+#define FIX_0_899976223  ((INT32)  7373)	/* FIX(0.899976223) */

+#define FIX_1_175875602  ((INT32)  9633)	/* FIX(1.175875602) */

+#define FIX_1_501321110  ((INT32)  12299)	/* FIX(1.501321110) */

+#define FIX_1_847759065  ((INT32)  15137)	/* FIX(1.847759065) */

+#define FIX_1_961570560  ((INT32)  16069)	/* FIX(1.961570560) */

+#define FIX_2_053119869  ((INT32)  16819)	/* FIX(2.053119869) */

+#define FIX_2_562915447  ((INT32)  20995)	/* FIX(2.562915447) */

+#define FIX_3_072711026  ((INT32)  25172)	/* FIX(3.072711026) */

+#else

+#define FIX_0_298631336  FIX(0.298631336)

+#define FIX_0_390180644  FIX(0.390180644)

+#define FIX_0_541196100  FIX(0.541196100)

+#define FIX_0_765366865  FIX(0.765366865)

+#define FIX_0_899976223  FIX(0.899976223)

+#define FIX_1_175875602  FIX(1.175875602)

+#define FIX_1_501321110  FIX(1.501321110)

+#define FIX_1_847759065  FIX(1.847759065)

+#define FIX_1_961570560  FIX(1.961570560)

+#define FIX_2_053119869  FIX(2.053119869)

+#define FIX_2_562915447  FIX(2.562915447)

+#define FIX_3_072711026  FIX(3.072711026)

+#endif

+

+

+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.

+ * For 8-bit samples with the recommended scaling, all the variable

+ * and constant values involved are no more than 16 bits wide, so a

+ * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.

+ * For 12-bit samples, a full 32-bit multiplication will be needed.

+ */

+

+#if BITS_IN_JSAMPLE == 8

+#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)

+#else

+#define MULTIPLY(var,const)  ((var) * (const))

+#endif

+

+

+/*

+ * Perform the forward DCT on one block of samples.

+ */

+

+GLOBAL(void)

+jpeg_fdct_islow (DCTELEM * data)

+{

+  INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;

+  INT32 tmp10, tmp11, tmp12, tmp13;

+  INT32 z1, z2, z3, z4, z5;

+  DCTELEM *dataptr;

+  int ctr;

+  SHIFT_TEMPS

+

+  /* Pass 1: process rows. */

+  /* Note results are scaled up by sqrt(8) compared to a true DCT; */

+  /* furthermore, we scale the results by 2**PASS1_BITS. */

+

+  dataptr = data;

+  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {

+    tmp0 = dataptr[0] + dataptr[7];

+    tmp7 = dataptr[0] - dataptr[7];

+    tmp1 = dataptr[1] + dataptr[6];

+    tmp6 = dataptr[1] - dataptr[6];

+    tmp2 = dataptr[2] + dataptr[5];

+    tmp5 = dataptr[2] - dataptr[5];

+    tmp3 = dataptr[3] + dataptr[4];

+    tmp4 = dataptr[3] - dataptr[4];

+    

+    /* Even part per LL&M figure 1 --- note that published figure is faulty;

+     * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".

+     */

+    

+    tmp10 = tmp0 + tmp3;

+    tmp13 = tmp0 - tmp3;

+    tmp11 = tmp1 + tmp2;

+    tmp12 = tmp1 - tmp2;

+    

+    dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);

+    dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);

+    

+    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);

+    dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),

+				   CONST_BITS-PASS1_BITS);

+    dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),

+				   CONST_BITS-PASS1_BITS);

+    

+    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).

+     * cK represents cos(K*pi/16).

+     * i0..i3 in the paper are tmp4..tmp7 here.

+     */

+    

+    z1 = tmp4 + tmp7;

+    z2 = tmp5 + tmp6;

+    z3 = tmp4 + tmp6;

+    z4 = tmp5 + tmp7;

+    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */

+    

+    tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */

+    tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */

+    tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */

+    tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */

+    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */

+    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */

+    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */

+    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */

+    

+    z3 += z5;

+    z4 += z5;

+    

+    dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);

+    dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);

+    dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);

+    dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);

+    

+    dataptr += DCTSIZE;		/* advance pointer to next row */

+  }

+

+  /* Pass 2: process columns.

+   * We remove the PASS1_BITS scaling, but leave the results scaled up

+   * by an overall factor of 8.

+   */

+

+  dataptr = data;

+  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {

+    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];

+    tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];

+    tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];

+    tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];

+    tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];

+    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];

+    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];

+    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];

+    

+    /* Even part per LL&M figure 1 --- note that published figure is faulty;

+     * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".

+     */

+    

+    tmp10 = tmp0 + tmp3;

+    tmp13 = tmp0 - tmp3;

+    tmp11 = tmp1 + tmp2;

+    tmp12 = tmp1 - tmp2;

+    

+    dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);

+    dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);

+    

+    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);

+    dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),

+					   CONST_BITS+PASS1_BITS);

+    dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),

+					   CONST_BITS+PASS1_BITS);

+    

+    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).

+     * cK represents cos(K*pi/16).

+     * i0..i3 in the paper are tmp4..tmp7 here.

+     */

+    

+    z1 = tmp4 + tmp7;

+    z2 = tmp5 + tmp6;

+    z3 = tmp4 + tmp6;

+    z4 = tmp5 + tmp7;

+    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */

+    

+    tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */

+    tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */

+    tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */

+    tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */

+    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */

+    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */

+    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */

+    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */

+    

+    z3 += z5;

+    z4 += z5;

+    

+    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3,

+					   CONST_BITS+PASS1_BITS);

+    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4,

+					   CONST_BITS+PASS1_BITS);

+    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3,

+					   CONST_BITS+PASS1_BITS);

+    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4,

+					   CONST_BITS+PASS1_BITS);

+    

+    dataptr++;			/* advance pointer to next column */

+  }

+}

+

+#endif /* DCT_ISLOW_SUPPORTED */

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c b/core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c
new file mode 100644
index 0000000..c0c504c
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c
@@ -0,0 +1,371 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jidctfst.c

+ *

+ * Copyright (C) 1994-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains a fast, not so accurate integer implementation of the

+ * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine

+ * must also perform dequantization of the input coefficients.

+ *

+ * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT

+ * on each row (or vice versa, but it's more convenient to emit a row at

+ * a time).  Direct algorithms are also available, but they are much more

+ * complex and seem not to be any faster when reduced to code.

+ *

+ * This implementation is based on Arai, Agui, and Nakajima's algorithm for

+ * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in

+ * Japanese, but the algorithm is described in the Pennebaker & Mitchell

+ * JPEG textbook (see REFERENCES section in file README).  The following code

+ * is based directly on figure 4-8 in P&M.

+ * While an 8-point DCT cannot be done in less than 11 multiplies, it is

+ * possible to arrange the computation so that many of the multiplies are

+ * simple scalings of the final outputs.  These multiplies can then be

+ * folded into the multiplications or divisions by the JPEG quantization

+ * table entries.  The AA&N method leaves only 5 multiplies and 29 adds

+ * to be done in the DCT itself.

+ * The primary disadvantage of this method is that with fixed-point math,

+ * accuracy is lost due to imprecise representation of the scaled

+ * quantization values.  The smaller the quantization table entry, the less

+ * precise the scaled value, so this implementation does worse with high-

+ * quality-setting files than with low-quality ones.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jdct.h"		/* Private declarations for DCT subsystem */

+

+#ifdef DCT_IFAST_SUPPORTED

+

+

+/*

+ * This module is specialized to the case DCTSIZE = 8.

+ */

+

+#if DCTSIZE != 8

+  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */

+#endif

+

+

+/* Scaling decisions are generally the same as in the LL&M algorithm;

+ * see jidctint.c for more details.  However, we choose to descale

+ * (right shift) multiplication products as soon as they are formed,

+ * rather than carrying additional fractional bits into subsequent additions.

+ * This compromises accuracy slightly, but it lets us save a few shifts.

+ * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)

+ * everywhere except in the multiplications proper; this saves a good deal

+ * of work on 16-bit-int machines.

+ *

+ * The dequantized coefficients are not integers because the AA&N scaling

+ * factors have been incorporated.  We represent them scaled up by PASS1_BITS,

+ * so that the first and second IDCT rounds have the same input scaling.

+ * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to

+ * avoid a descaling shift; this compromises accuracy rather drastically

+ * for small quantization table entries, but it saves a lot of shifts.

+ * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway,

+ * so we use a much larger scaling factor to preserve accuracy.

+ *

+ * A final compromise is to represent the multiplicative constants to only

+ * 8 fractional bits, rather than 13.  This saves some shifting work on some

+ * machines, and may also reduce the cost of multiplication (since there

+ * are fewer one-bits in the constants).

+ */

+

+#if BITS_IN_JSAMPLE == 8

+#define CONST_BITS  8

+#define PASS1_BITS  2

+#else

+#define CONST_BITS  8

+#define PASS1_BITS  1		/* lose a little precision to avoid overflow */

+#endif

+

+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus

+ * causing a lot of useless floating-point operations at run time.

+ * To get around this we use the following pre-calculated constants.

+ * If you change CONST_BITS you may want to add appropriate values.

+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)

+ */

+

+#if CONST_BITS == 8

+#define FIX_1_082392200  ((INT32)  277)		/* FIX(1.082392200) */

+#define FIX_1_414213562  ((INT32)  362)		/* FIX(1.414213562) */

+#define FIX_1_847759065  ((INT32)  473)		/* FIX(1.847759065) */

+#define FIX_2_613125930  ((INT32)  669)		/* FIX(2.613125930) */

+#else

+#define FIX_1_082392200  FIX(1.082392200)

+#define FIX_1_414213562  FIX(1.414213562)

+#define FIX_1_847759065  FIX(1.847759065)

+#define FIX_2_613125930  FIX(2.613125930)

+#endif

+

+

+/* We can gain a little more speed, with a further compromise in accuracy,

+ * by omitting the addition in a descaling shift.  This yields an incorrectly

+ * rounded result half the time...

+ */

+

+#ifndef USE_ACCURATE_ROUNDING

+#undef DESCALE

+#define DESCALE(x,n)  RIGHT_SHIFT(x, n)

+#endif

+

+

+/* Multiply a DCTELEM variable by an INT32 constant, and immediately

+ * descale to yield a DCTELEM result.

+ */

+

+#define MULTIPLY(var,const)  ((DCTELEM) DESCALE((var) * (const), CONST_BITS))

+

+

+/* Dequantize a coefficient by multiplying it by the multiplier-table

+ * entry; produce a DCTELEM result.  For 8-bit data a 16x16->16

+ * multiplication will do.  For 12-bit data, the multiplier table is

+ * declared INT32, so a 32-bit multiply will be used.

+ */

+

+#if BITS_IN_JSAMPLE == 8

+#define DEQUANTIZE(coef,quantval)  (((IFAST_MULT_TYPE) (coef)) * (quantval))

+#else

+#define DEQUANTIZE(coef,quantval)  \

+	DESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS)

+#endif

+

+

+/* Like DESCALE, but applies to a DCTELEM and produces an int.

+ * We assume that int right shift is unsigned if INT32 right shift is.

+ */

+

+#ifdef RIGHT_SHIFT_IS_UNSIGNED

+#define ISHIFT_TEMPS	DCTELEM ishift_temp;

+#if BITS_IN_JSAMPLE == 8

+#define DCTELEMBITS  16		/* DCTELEM may be 16 or 32 bits */

+#else

+#define DCTELEMBITS  32		/* DCTELEM must be 32 bits */

+#endif

+#define IRIGHT_SHIFT(x,shft)  \

+    ((ishift_temp = (x)) < 0 ? \

+     (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \

+     (ishift_temp >> (shft)))

+#else

+#define ISHIFT_TEMPS

+#define IRIGHT_SHIFT(x,shft)	((x) >> (shft))

+#endif

+

+#ifdef USE_ACCURATE_ROUNDING

+#define IDESCALE(x,n)  ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n))

+#else

+#define IDESCALE(x,n)  ((int) IRIGHT_SHIFT(x, n))

+#endif

+

+

+/*

+ * Perform dequantization and inverse DCT on one block of coefficients.

+ */

+

+GLOBAL(void)

+jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,

+		 JCOEFPTR coef_block,

+		 JSAMPARRAY output_buf, JDIMENSION output_col)

+{

+  DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;

+  DCTELEM tmp10, tmp11, tmp12, tmp13;

+  DCTELEM z5, z10, z11, z12, z13;

+  JCOEFPTR inptr;

+  IFAST_MULT_TYPE * quantptr;

+  int * wsptr;

+  JSAMPROW outptr;

+  JSAMPLE *range_limit = IDCT_range_limit(cinfo);

+  int ctr;

+  int workspace[DCTSIZE2];	/* buffers data between passes */

+  SHIFT_TEMPS			/* for DESCALE */

+  ISHIFT_TEMPS			/* for IDESCALE */

+

+  /* Pass 1: process columns from input, store into work array. */

+

+  inptr = coef_block;

+  quantptr = (IFAST_MULT_TYPE *) compptr->dct_table;

+  wsptr = workspace;

+  for (ctr = DCTSIZE; ctr > 0; ctr--) {

+    /* Due to quantization, we will usually find that many of the input

+     * coefficients are zero, especially the AC terms.  We can exploit this

+     * by short-circuiting the IDCT calculation for any column in which all

+     * the AC terms are zero.  In that case each output is equal to the

+     * DC coefficient (with scale factor as needed).

+     * With typical images and quantization tables, half or more of the

+     * column DCT calculations can be simplified this way.

+     */

+    

+    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&

+	inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&

+	inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&

+	inptr[DCTSIZE*7] == 0) {

+      /* AC terms all zero */

+      int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);

+

+      wsptr[DCTSIZE*0] = dcval;

+      wsptr[DCTSIZE*1] = dcval;

+      wsptr[DCTSIZE*2] = dcval;

+      wsptr[DCTSIZE*3] = dcval;

+      wsptr[DCTSIZE*4] = dcval;

+      wsptr[DCTSIZE*5] = dcval;

+      wsptr[DCTSIZE*6] = dcval;

+      wsptr[DCTSIZE*7] = dcval;

+      

+      inptr++;			/* advance pointers to next column */

+      quantptr++;

+      wsptr++;

+      continue;

+    }

+    

+    /* Even part */

+

+    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);

+    tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);

+    tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);

+    tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);

+

+    tmp10 = tmp0 + tmp2;	/* phase 3 */

+    tmp11 = tmp0 - tmp2;

+

+    tmp13 = tmp1 + tmp3;	/* phases 5-3 */

+    tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */

+

+    tmp0 = tmp10 + tmp13;	/* phase 2 */

+    tmp3 = tmp10 - tmp13;

+    tmp1 = tmp11 + tmp12;

+    tmp2 = tmp11 - tmp12;

+    

+    /* Odd part */

+

+    tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);

+    tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);

+    tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);

+    tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);

+

+    z13 = tmp6 + tmp5;		/* phase 6 */

+    z10 = tmp6 - tmp5;

+    z11 = tmp4 + tmp7;

+    z12 = tmp4 - tmp7;

+

+    tmp7 = z11 + z13;		/* phase 5 */

+    tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */

+

+    z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */

+    tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */

+    tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */

+

+    tmp6 = tmp12 - tmp7;	/* phase 2 */

+    tmp5 = tmp11 - tmp6;

+    tmp4 = tmp10 + tmp5;

+

+    wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7);

+    wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7);

+    wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6);

+    wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6);

+    wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5);

+    wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5);

+    wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4);

+    wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4);

+

+    inptr++;			/* advance pointers to next column */

+    quantptr++;

+    wsptr++;

+  }

+  

+  /* Pass 2: process rows from work array, store into output array. */

+  /* Note that we must descale the results by a factor of 8 == 2**3, */

+  /* and also undo the PASS1_BITS scaling. */

+

+  wsptr = workspace;

+  for (ctr = 0; ctr < DCTSIZE; ctr++) {

+    outptr = output_buf[ctr] + output_col;

+    /* Rows of zeroes can be exploited in the same way as we did with columns.

+     * However, the column calculation has created many nonzero AC terms, so

+     * the simplification applies less often (typically 5% to 10% of the time).

+     * On machines with very fast multiplication, it's possible that the

+     * test takes more time than it's worth.  In that case this section

+     * may be commented out.

+     */

+    

+#ifndef NO_ZERO_ROW_TEST

+    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&

+	wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {

+      /* AC terms all zero */

+      JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3)

+				  & RANGE_MASK];

+      

+      outptr[0] = dcval;

+      outptr[1] = dcval;

+      outptr[2] = dcval;

+      outptr[3] = dcval;

+      outptr[4] = dcval;

+      outptr[5] = dcval;

+      outptr[6] = dcval;

+      outptr[7] = dcval;

+

+      wsptr += DCTSIZE;		/* advance pointer to next row */

+      continue;

+    }

+#endif

+    

+    /* Even part */

+

+    tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]);

+    tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]);

+

+    tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]);

+    tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562)

+	    - tmp13;

+

+    tmp0 = tmp10 + tmp13;

+    tmp3 = tmp10 - tmp13;

+    tmp1 = tmp11 + tmp12;

+    tmp2 = tmp11 - tmp12;

+

+    /* Odd part */

+

+    z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3];

+    z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3];

+    z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7];

+    z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7];

+

+    tmp7 = z11 + z13;		/* phase 5 */

+    tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */

+

+    z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */

+    tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */

+    tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */

+

+    tmp6 = tmp12 - tmp7;	/* phase 2 */

+    tmp5 = tmp11 - tmp6;

+    tmp4 = tmp10 + tmp5;

+

+    /* Final output stage: scale down by a factor of 8 and range-limit */

+

+    outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3)

+			    & RANGE_MASK];

+

+    wsptr += DCTSIZE;		/* advance pointer to next row */

+  }

+}

+

+#endif /* DCT_IFAST_SUPPORTED */

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jidctint.c b/core/src/fxcodec/libjpeg/fpdfapi_jidctint.c
new file mode 100644
index 0000000..82f5cc7
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jidctint.c
@@ -0,0 +1,392 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jidctint.c

+ *

+ * Copyright (C) 1991-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains a slow-but-accurate integer implementation of the

+ * inverse DCT (Discrete Cosine Transform).  In the IJG code, this routine

+ * must also perform dequantization of the input coefficients.

+ *

+ * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT

+ * on each row (or vice versa, but it's more convenient to emit a row at

+ * a time).  Direct algorithms are also available, but they are much more

+ * complex and seem not to be any faster when reduced to code.

+ *

+ * This implementation is based on an algorithm described in

+ *   C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT

+ *   Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,

+ *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.

+ * The primary algorithm described there uses 11 multiplies and 29 adds.

+ * We use their alternate method with 12 multiplies and 32 adds.

+ * The advantage of this method is that no data path contains more than one

+ * multiplication; this allows a very simple and accurate implementation in

+ * scaled fixed-point arithmetic, with a minimal number of shifts.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jdct.h"		/* Private declarations for DCT subsystem */

+

+#ifdef DCT_ISLOW_SUPPORTED

+

+

+/*

+ * This module is specialized to the case DCTSIZE = 8.

+ */

+

+#if DCTSIZE != 8

+  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */

+#endif

+

+

+/*

+ * The poop on this scaling stuff is as follows:

+ *

+ * Each 1-D IDCT step produces outputs which are a factor of sqrt(N)

+ * larger than the true IDCT outputs.  The final outputs are therefore

+ * a factor of N larger than desired; since N=8 this can be cured by

+ * a simple right shift at the end of the algorithm.  The advantage of

+ * this arrangement is that we save two multiplications per 1-D IDCT,

+ * because the y0 and y4 inputs need not be divided by sqrt(N).

+ *

+ * We have to do addition and subtraction of the integer inputs, which

+ * is no problem, and multiplication by fractional constants, which is

+ * a problem to do in integer arithmetic.  We multiply all the constants

+ * by CONST_SCALE and convert them to integer constants (thus retaining

+ * CONST_BITS bits of precision in the constants).  After doing a

+ * multiplication we have to divide the product by CONST_SCALE, with proper

+ * rounding, to produce the correct output.  This division can be done

+ * cheaply as a right shift of CONST_BITS bits.  We postpone shifting

+ * as long as possible so that partial sums can be added together with

+ * full fractional precision.

+ *

+ * The outputs of the first pass are scaled up by PASS1_BITS bits so that

+ * they are represented to better-than-integral precision.  These outputs

+ * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word

+ * with the recommended scaling.  (To scale up 12-bit sample data further, an

+ * intermediate INT32 array would be needed.)

+ *

+ * To avoid overflow of the 32-bit intermediate results in pass 2, we must

+ * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis

+ * shows that the values given below are the most effective.

+ */

+

+#if BITS_IN_JSAMPLE == 8

+#define CONST_BITS  13

+#define PASS1_BITS  2

+#else

+#define CONST_BITS  13

+#define PASS1_BITS  1		/* lose a little precision to avoid overflow */

+#endif

+

+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus

+ * causing a lot of useless floating-point operations at run time.

+ * To get around this we use the following pre-calculated constants.

+ * If you change CONST_BITS you may want to add appropriate values.

+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)

+ */

+

+#if CONST_BITS == 13

+#define FIX_0_298631336  ((INT32)  2446)	/* FIX(0.298631336) */

+#define FIX_0_390180644  ((INT32)  3196)	/* FIX(0.390180644) */

+#define FIX_0_541196100  ((INT32)  4433)	/* FIX(0.541196100) */

+#define FIX_0_765366865  ((INT32)  6270)	/* FIX(0.765366865) */

+#define FIX_0_899976223  ((INT32)  7373)	/* FIX(0.899976223) */

+#define FIX_1_175875602  ((INT32)  9633)	/* FIX(1.175875602) */

+#define FIX_1_501321110  ((INT32)  12299)	/* FIX(1.501321110) */

+#define FIX_1_847759065  ((INT32)  15137)	/* FIX(1.847759065) */

+#define FIX_1_961570560  ((INT32)  16069)	/* FIX(1.961570560) */

+#define FIX_2_053119869  ((INT32)  16819)	/* FIX(2.053119869) */

+#define FIX_2_562915447  ((INT32)  20995)	/* FIX(2.562915447) */

+#define FIX_3_072711026  ((INT32)  25172)	/* FIX(3.072711026) */

+#else

+#define FIX_0_298631336  FIX(0.298631336)

+#define FIX_0_390180644  FIX(0.390180644)

+#define FIX_0_541196100  FIX(0.541196100)

+#define FIX_0_765366865  FIX(0.765366865)

+#define FIX_0_899976223  FIX(0.899976223)

+#define FIX_1_175875602  FIX(1.175875602)

+#define FIX_1_501321110  FIX(1.501321110)

+#define FIX_1_847759065  FIX(1.847759065)

+#define FIX_1_961570560  FIX(1.961570560)

+#define FIX_2_053119869  FIX(2.053119869)

+#define FIX_2_562915447  FIX(2.562915447)

+#define FIX_3_072711026  FIX(3.072711026)

+#endif

+

+

+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.

+ * For 8-bit samples with the recommended scaling, all the variable

+ * and constant values involved are no more than 16 bits wide, so a

+ * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.

+ * For 12-bit samples, a full 32-bit multiplication will be needed.

+ */

+

+#if BITS_IN_JSAMPLE == 8

+#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)

+#else

+#define MULTIPLY(var,const)  ((var) * (const))

+#endif

+

+

+/* Dequantize a coefficient by multiplying it by the multiplier-table

+ * entry; produce an int result.  In this module, both inputs and result

+ * are 16 bits or less, so either int or short multiply will work.

+ */

+

+#define DEQUANTIZE(coef,quantval)  (((ISLOW_MULT_TYPE) (coef)) * (quantval))

+

+

+/*

+ * Perform dequantization and inverse DCT on one block of coefficients.

+ */

+

+GLOBAL(void)

+jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,

+		 JCOEFPTR coef_block,

+		 JSAMPARRAY output_buf, JDIMENSION output_col)

+{

+  INT32 tmp0, tmp1, tmp2, tmp3;

+  INT32 tmp10, tmp11, tmp12, tmp13;

+  INT32 z1, z2, z3, z4, z5;

+  JCOEFPTR inptr;

+  ISLOW_MULT_TYPE * quantptr;

+  int * wsptr;

+  JSAMPROW outptr;

+  JSAMPLE *range_limit = IDCT_range_limit(cinfo);

+  int ctr;

+  int workspace[DCTSIZE2];	/* buffers data between passes */

+  SHIFT_TEMPS

+

+  /* Pass 1: process columns from input, store into work array. */

+  /* Note results are scaled up by sqrt(8) compared to a true IDCT; */

+  /* furthermore, we scale the results by 2**PASS1_BITS. */

+

+  inptr = coef_block;

+  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;

+  wsptr = workspace;

+  for (ctr = DCTSIZE; ctr > 0; ctr--) {

+    /* Due to quantization, we will usually find that many of the input

+     * coefficients are zero, especially the AC terms.  We can exploit this

+     * by short-circuiting the IDCT calculation for any column in which all

+     * the AC terms are zero.  In that case each output is equal to the

+     * DC coefficient (with scale factor as needed).

+     * With typical images and quantization tables, half or more of the

+     * column DCT calculations can be simplified this way.

+     */

+    

+    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&

+	inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&

+	inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&

+	inptr[DCTSIZE*7] == 0) {

+      /* AC terms all zero */

+      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;

+      

+      wsptr[DCTSIZE*0] = dcval;

+      wsptr[DCTSIZE*1] = dcval;

+      wsptr[DCTSIZE*2] = dcval;

+      wsptr[DCTSIZE*3] = dcval;

+      wsptr[DCTSIZE*4] = dcval;

+      wsptr[DCTSIZE*5] = dcval;

+      wsptr[DCTSIZE*6] = dcval;

+      wsptr[DCTSIZE*7] = dcval;

+      

+      inptr++;			/* advance pointers to next column */

+      quantptr++;

+      wsptr++;

+      continue;

+    }

+    

+    /* Even part: reverse the even part of the forward DCT. */

+    /* The rotator is sqrt(2)*c(-6). */

+    

+    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);

+    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);

+    

+    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);

+    tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);

+    tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);

+    

+    z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);

+    z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);

+

+    tmp0 = (z2 + z3) << CONST_BITS;

+    tmp1 = (z2 - z3) << CONST_BITS;

+    

+    tmp10 = tmp0 + tmp3;

+    tmp13 = tmp0 - tmp3;

+    tmp11 = tmp1 + tmp2;

+    tmp12 = tmp1 - tmp2;

+    

+    /* Odd part per figure 8; the matrix is unitary and hence its

+     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.

+     */

+    

+    tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);

+    tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);

+    tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);

+    tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);

+    

+    z1 = tmp0 + tmp3;

+    z2 = tmp1 + tmp2;

+    z3 = tmp0 + tmp2;

+    z4 = tmp1 + tmp3;

+    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */

+    

+    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */

+    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */

+    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */

+    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */

+    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */

+    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */

+    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */

+    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */

+    

+    z3 += z5;

+    z4 += z5;

+    

+    tmp0 += z1 + z3;

+    tmp1 += z2 + z4;

+    tmp2 += z2 + z3;

+    tmp3 += z1 + z4;

+    

+    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */

+    

+    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);

+    wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);

+    wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);

+    wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);

+    wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);

+    wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);

+    wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);

+    wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);

+    

+    inptr++;			/* advance pointers to next column */

+    quantptr++;

+    wsptr++;

+  }

+  

+  /* Pass 2: process rows from work array, store into output array. */

+  /* Note that we must descale the results by a factor of 8 == 2**3, */

+  /* and also undo the PASS1_BITS scaling. */

+

+  wsptr = workspace;

+  for (ctr = 0; ctr < DCTSIZE; ctr++) {

+    outptr = output_buf[ctr] + output_col;

+    /* Rows of zeroes can be exploited in the same way as we did with columns.

+     * However, the column calculation has created many nonzero AC terms, so

+     * the simplification applies less often (typically 5% to 10% of the time).

+     * On machines with very fast multiplication, it's possible that the

+     * test takes more time than it's worth.  In that case this section

+     * may be commented out.

+     */

+    

+#ifndef NO_ZERO_ROW_TEST

+    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&

+	wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {

+      /* AC terms all zero */

+      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)

+				  & RANGE_MASK];

+      

+      outptr[0] = dcval;

+      outptr[1] = dcval;

+      outptr[2] = dcval;

+      outptr[3] = dcval;

+      outptr[4] = dcval;

+      outptr[5] = dcval;

+      outptr[6] = dcval;

+      outptr[7] = dcval;

+

+      wsptr += DCTSIZE;		/* advance pointer to next row */

+      continue;

+    }

+#endif

+    

+    /* Even part: reverse the even part of the forward DCT. */

+    /* The rotator is sqrt(2)*c(-6). */

+    

+    z2 = (INT32) wsptr[2];

+    z3 = (INT32) wsptr[6];

+    

+    z1 = MULTIPLY(z2 + z3, FIX_0_541196100);

+    tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);

+    tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);

+    

+    tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS;

+    tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS;

+    

+    tmp10 = tmp0 + tmp3;

+    tmp13 = tmp0 - tmp3;

+    tmp11 = tmp1 + tmp2;

+    tmp12 = tmp1 - tmp2;

+    

+    /* Odd part per figure 8; the matrix is unitary and hence its

+     * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.

+     */

+    

+    tmp0 = (INT32) wsptr[7];

+    tmp1 = (INT32) wsptr[5];

+    tmp2 = (INT32) wsptr[3];

+    tmp3 = (INT32) wsptr[1];

+    

+    z1 = tmp0 + tmp3;

+    z2 = tmp1 + tmp2;

+    z3 = tmp0 + tmp2;

+    z4 = tmp1 + tmp3;

+    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */

+    

+    tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */

+    tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */

+    tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */

+    tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */

+    z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */

+    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */

+    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */

+    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */

+    

+    z3 += z5;

+    z4 += z5;

+    

+    tmp0 += z1 + z3;

+    tmp1 += z2 + z4;

+    tmp2 += z2 + z3;

+    tmp3 += z1 + z4;

+    

+    /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */

+    

+    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3,

+					  CONST_BITS+PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3,

+					  CONST_BITS+PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2,

+					  CONST_BITS+PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2,

+					  CONST_BITS+PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1,

+					  CONST_BITS+PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1,

+					  CONST_BITS+PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0,

+					  CONST_BITS+PASS1_BITS+3)

+			    & RANGE_MASK];

+    outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0,

+					  CONST_BITS+PASS1_BITS+3)

+			    & RANGE_MASK];

+    

+    wsptr += DCTSIZE;		/* advance pointer to next row */

+  }

+}

+

+#endif /* DCT_ISLOW_SUPPORTED */

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jidctred.c b/core/src/fxcodec/libjpeg/fpdfapi_jidctred.c
new file mode 100644
index 0000000..7eb1d74
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jidctred.c
@@ -0,0 +1,401 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jidctred.c

+ *

+ * Copyright (C) 1994-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains inverse-DCT routines that produce reduced-size output:

+ * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block.

+ *

+ * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M)

+ * algorithm used in jidctint.c.  We simply replace each 8-to-8 1-D IDCT step

+ * with an 8-to-4 step that produces the four averages of two adjacent outputs

+ * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output).

+ * These steps were derived by computing the corresponding values at the end

+ * of the normal LL&M code, then simplifying as much as possible.

+ *

+ * 1x1 is trivial: just take the DC coefficient divided by 8.

+ *

+ * See jidctint.c for additional comments.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jdct.h"		/* Private declarations for DCT subsystem */

+

+#ifdef IDCT_SCALING_SUPPORTED

+

+

+/*

+ * This module is specialized to the case DCTSIZE = 8.

+ */

+

+#if DCTSIZE != 8

+  Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */

+#endif

+

+

+/* Scaling is the same as in jidctint.c. */

+

+#if BITS_IN_JSAMPLE == 8

+#define CONST_BITS  13

+#define PASS1_BITS  2

+#else

+#define CONST_BITS  13

+#define PASS1_BITS  1		/* lose a little precision to avoid overflow */

+#endif

+

+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus

+ * causing a lot of useless floating-point operations at run time.

+ * To get around this we use the following pre-calculated constants.

+ * If you change CONST_BITS you may want to add appropriate values.

+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)

+ */

+

+#if CONST_BITS == 13

+#define FIX_0_211164243  ((INT32)  1730)	/* FIX(0.211164243) */

+#define FIX_0_509795579  ((INT32)  4176)	/* FIX(0.509795579) */

+#define FIX_0_601344887  ((INT32)  4926)	/* FIX(0.601344887) */

+#define FIX_0_720959822  ((INT32)  5906)	/* FIX(0.720959822) */

+#define FIX_0_765366865  ((INT32)  6270)	/* FIX(0.765366865) */

+#define FIX_0_850430095  ((INT32)  6967)	/* FIX(0.850430095) */

+#define FIX_0_899976223  ((INT32)  7373)	/* FIX(0.899976223) */

+#define FIX_1_061594337  ((INT32)  8697)	/* FIX(1.061594337) */

+#define FIX_1_272758580  ((INT32)  10426)	/* FIX(1.272758580) */

+#define FIX_1_451774981  ((INT32)  11893)	/* FIX(1.451774981) */

+#define FIX_1_847759065  ((INT32)  15137)	/* FIX(1.847759065) */

+#define FIX_2_172734803  ((INT32)  17799)	/* FIX(2.172734803) */

+#define FIX_2_562915447  ((INT32)  20995)	/* FIX(2.562915447) */

+#define FIX_3_624509785  ((INT32)  29692)	/* FIX(3.624509785) */

+#else

+#define FIX_0_211164243  FIX(0.211164243)

+#define FIX_0_509795579  FIX(0.509795579)

+#define FIX_0_601344887  FIX(0.601344887)

+#define FIX_0_720959822  FIX(0.720959822)

+#define FIX_0_765366865  FIX(0.765366865)

+#define FIX_0_850430095  FIX(0.850430095)

+#define FIX_0_899976223  FIX(0.899976223)

+#define FIX_1_061594337  FIX(1.061594337)

+#define FIX_1_272758580  FIX(1.272758580)

+#define FIX_1_451774981  FIX(1.451774981)

+#define FIX_1_847759065  FIX(1.847759065)

+#define FIX_2_172734803  FIX(2.172734803)

+#define FIX_2_562915447  FIX(2.562915447)

+#define FIX_3_624509785  FIX(3.624509785)

+#endif

+

+

+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.

+ * For 8-bit samples with the recommended scaling, all the variable

+ * and constant values involved are no more than 16 bits wide, so a

+ * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.

+ * For 12-bit samples, a full 32-bit multiplication will be needed.

+ */

+

+#if BITS_IN_JSAMPLE == 8

+#define MULTIPLY(var,const)  MULTIPLY16C16(var,const)

+#else

+#define MULTIPLY(var,const)  ((var) * (const))

+#endif

+

+

+/* Dequantize a coefficient by multiplying it by the multiplier-table

+ * entry; produce an int result.  In this module, both inputs and result

+ * are 16 bits or less, so either int or short multiply will work.

+ */

+

+#define DEQUANTIZE(coef,quantval)  (((ISLOW_MULT_TYPE) (coef)) * (quantval))

+

+

+/*

+ * Perform dequantization and inverse DCT on one block of coefficients,

+ * producing a reduced-size 4x4 output block.

+ */

+

+GLOBAL(void)

+jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	       JCOEFPTR coef_block,

+	       JSAMPARRAY output_buf, JDIMENSION output_col)

+{

+  INT32 tmp0, tmp2, tmp10, tmp12;

+  INT32 z1, z2, z3, z4;

+  JCOEFPTR inptr;

+  ISLOW_MULT_TYPE * quantptr;

+  int * wsptr;

+  JSAMPROW outptr;

+  JSAMPLE *range_limit = IDCT_range_limit(cinfo);

+  int ctr;

+  int workspace[DCTSIZE*4];	/* buffers data between passes */

+  SHIFT_TEMPS

+

+  /* Pass 1: process columns from input, store into work array. */

+

+  inptr = coef_block;

+  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;

+  wsptr = workspace;

+  for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {

+    /* Don't bother to process column 4, because second pass won't use it */

+    if (ctr == DCTSIZE-4)

+      continue;

+    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&

+	inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 &&

+	inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) {

+      /* AC terms all zero; we need not examine term 4 for 4x4 output */

+      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;

+      

+      wsptr[DCTSIZE*0] = dcval;

+      wsptr[DCTSIZE*1] = dcval;

+      wsptr[DCTSIZE*2] = dcval;

+      wsptr[DCTSIZE*3] = dcval;

+      

+      continue;

+    }

+    

+    /* Even part */

+    

+    tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);

+    tmp0 <<= (CONST_BITS+1);

+    

+    z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);

+    z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);

+

+    tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865);

+    

+    tmp10 = tmp0 + tmp2;

+    tmp12 = tmp0 - tmp2;

+    

+    /* Odd part */

+    

+    z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);

+    z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);

+    z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);

+    z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);

+    

+    tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */

+	 + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */

+	 + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */

+	 + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */

+    

+    tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */

+	 + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */

+	 + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */

+	 + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */

+

+    /* Final output stage */

+    

+    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1);

+    wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1);

+    wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1);

+    wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1);

+  }

+  

+  /* Pass 2: process 4 rows from work array, store into output array. */

+

+  wsptr = workspace;

+  for (ctr = 0; ctr < 4; ctr++) {

+    outptr = output_buf[ctr] + output_col;

+    /* It's not clear whether a zero row test is worthwhile here ... */

+

+#ifndef NO_ZERO_ROW_TEST

+    if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 &&

+	wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {

+      /* AC terms all zero */

+      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)

+				  & RANGE_MASK];

+      

+      outptr[0] = dcval;

+      outptr[1] = dcval;

+      outptr[2] = dcval;

+      outptr[3] = dcval;

+      

+      wsptr += DCTSIZE;		/* advance pointer to next row */

+      continue;

+    }

+#endif

+    

+    /* Even part */

+    

+    tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1);

+    

+    tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065)

+	 + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865);

+    

+    tmp10 = tmp0 + tmp2;

+    tmp12 = tmp0 - tmp2;

+    

+    /* Odd part */

+    

+    z1 = (INT32) wsptr[7];

+    z2 = (INT32) wsptr[5];

+    z3 = (INT32) wsptr[3];

+    z4 = (INT32) wsptr[1];

+    

+    tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */

+	 + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */

+	 + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */

+	 + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */

+    

+    tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */

+	 + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */

+	 + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */

+	 + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */

+

+    /* Final output stage */

+    

+    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2,

+					  CONST_BITS+PASS1_BITS+3+1)

+			    & RANGE_MASK];

+    outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2,

+					  CONST_BITS+PASS1_BITS+3+1)

+			    & RANGE_MASK];

+    outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0,

+					  CONST_BITS+PASS1_BITS+3+1)

+			    & RANGE_MASK];

+    outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0,

+					  CONST_BITS+PASS1_BITS+3+1)

+			    & RANGE_MASK];

+    

+    wsptr += DCTSIZE;		/* advance pointer to next row */

+  }

+}

+

+

+/*

+ * Perform dequantization and inverse DCT on one block of coefficients,

+ * producing a reduced-size 2x2 output block.

+ */

+

+GLOBAL(void)

+jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	       JCOEFPTR coef_block,

+	       JSAMPARRAY output_buf, JDIMENSION output_col)

+{

+  INT32 tmp0, tmp10, z1;

+  JCOEFPTR inptr;

+  ISLOW_MULT_TYPE * quantptr;

+  int * wsptr;

+  JSAMPROW outptr;

+  JSAMPLE *range_limit = IDCT_range_limit(cinfo);

+  int ctr;

+  int workspace[DCTSIZE*2];	/* buffers data between passes */

+  SHIFT_TEMPS

+

+  /* Pass 1: process columns from input, store into work array. */

+

+  inptr = coef_block;

+  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;

+  wsptr = workspace;

+  for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {

+    /* Don't bother to process columns 2,4,6 */

+    if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6)

+      continue;

+    if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 &&

+	inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) {

+      /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */

+      int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;

+      

+      wsptr[DCTSIZE*0] = dcval;

+      wsptr[DCTSIZE*1] = dcval;

+      

+      continue;

+    }

+    

+    /* Even part */

+    

+    z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);

+    tmp10 = z1 << (CONST_BITS+2);

+    

+    /* Odd part */

+

+    z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);

+    tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */

+    z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);

+    tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */

+    z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);

+    tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */

+    z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);

+    tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */

+

+    /* Final output stage */

+    

+    wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2);

+    wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2);

+  }

+  

+  /* Pass 2: process 2 rows from work array, store into output array. */

+

+  wsptr = workspace;

+  for (ctr = 0; ctr < 2; ctr++) {

+    outptr = output_buf[ctr] + output_col;

+    /* It's not clear whether a zero row test is worthwhile here ... */

+

+#ifndef NO_ZERO_ROW_TEST

+    if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) {

+      /* AC terms all zero */

+      JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)

+				  & RANGE_MASK];

+      

+      outptr[0] = dcval;

+      outptr[1] = dcval;

+      

+      wsptr += DCTSIZE;		/* advance pointer to next row */

+      continue;

+    }

+#endif

+    

+    /* Even part */

+    

+    tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2);

+    

+    /* Odd part */

+

+    tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */

+	 + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */

+	 + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */

+	 + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */

+

+    /* Final output stage */

+    

+    outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0,

+					  CONST_BITS+PASS1_BITS+3+2)

+			    & RANGE_MASK];

+    outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0,

+					  CONST_BITS+PASS1_BITS+3+2)

+			    & RANGE_MASK];

+    

+    wsptr += DCTSIZE;		/* advance pointer to next row */

+  }

+}

+

+

+/*

+ * Perform dequantization and inverse DCT on one block of coefficients,

+ * producing a reduced-size 1x1 output block.

+ */

+

+GLOBAL(void)

+jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	       JCOEFPTR coef_block,

+	       JSAMPARRAY output_buf, JDIMENSION output_col)

+{

+  int dcval;

+  ISLOW_MULT_TYPE * quantptr;

+  JSAMPLE *range_limit = IDCT_range_limit(cinfo);

+  SHIFT_TEMPS

+

+  /* We hardly need an inverse DCT routine for this: just take the

+   * average pixel value, which is one-eighth of the DC coefficient.

+   */

+  quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;

+  dcval = DEQUANTIZE(coef_block[0], quantptr[0]);

+  dcval = (int) DESCALE((INT32) dcval, 3);

+

+  output_buf[0][output_col] = range_limit[dcval & RANGE_MASK];

+}

+

+#endif /* IDCT_SCALING_SUPPORTED */

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c b/core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c
new file mode 100644
index 0000000..19ee665
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c
@@ -0,0 +1,1123 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jmemmgr.c

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains the JPEG system-independent memory management

+ * routines.  This code is usable across a wide variety of machines; most

+ * of the system dependencies have been isolated in a separate file.

+ * The major functions provided here are:

+ *   * pool-based allocation and freeing of memory;

+ *   * policy decisions about how to divide available memory among the

+ *     virtual arrays;

+ *   * control logic for swapping virtual arrays between main memory and

+ *     backing storage.

+ * The separate system-dependent file provides the actual backing-storage

+ * access code, and it contains the policy decision about how much total

+ * main memory to use.

+ * This file is system-dependent in the sense that some of its functions

+ * are unnecessary in some systems.  For example, if there is enough virtual

+ * memory so that backing storage will never be used, much of the virtual

+ * array control logic could be removed.  (Of course, if you have that much

+ * memory then you shouldn't care about a little bit of unused code...)

+ */

+

+#define JPEG_INTERNALS

+#define AM_MEMORY_MANAGER	/* we define jvirt_Xarray_control structs */

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jmemsys.h"		/* import the system-dependent declarations */

+

+#define NO_GETENV	/* XYQ: 2007-5-22 Don't use it */

+

+#ifndef NO_GETENV

+#ifndef HAVE_STDLIB_H		/* <stdlib.h> should declare getenv() */

+extern char * getenv JPP((const char * name));

+#endif

+#endif

+

+

+/*

+ * Some important notes:

+ *   The allocation routines provided here must never return NULL.

+ *   They should exit to error_exit if unsuccessful.

+ *

+ *   It's not a good idea to try to merge the sarray and barray routines,

+ *   even though they are textually almost the same, because samples are

+ *   usually stored as bytes while coefficients are shorts or ints.  Thus,

+ *   in machines where byte pointers have a different representation from

+ *   word pointers, the resulting machine code could not be the same.

+ */

+

+

+/*

+ * Many machines require storage alignment: longs must start on 4-byte

+ * boundaries, doubles on 8-byte boundaries, etc.  On such machines, malloc()

+ * always returns pointers that are multiples of the worst-case alignment

+ * requirement, and we had better do so too.

+ * There isn't any really portable way to determine the worst-case alignment

+ * requirement.  This module assumes that the alignment requirement is

+ * multiples of sizeof(ALIGN_TYPE).

+ * By default, we define ALIGN_TYPE as double.  This is necessary on some

+ * workstations (where doubles really do need 8-byte alignment) and will work

+ * fine on nearly everything.  If your machine has lesser alignment needs,

+ * you can save a few bytes by making ALIGN_TYPE smaller.

+ * The only place I know of where this will NOT work is certain Macintosh

+ * 680x0 compilers that define double as a 10-byte IEEE extended float.

+ * Doing 10-byte alignment is counterproductive because longwords won't be

+ * aligned well.  Put "#define ALIGN_TYPE long" in jconfig.h if you have

+ * such a compiler.

+ */

+

+#ifndef ALIGN_TYPE		/* so can override from jconfig.h */

+#define ALIGN_TYPE  double

+#endif

+

+

+/*

+ * We allocate objects from "pools", where each pool is gotten with a single

+ * request to jpeg_get_small() or jpeg_get_large().  There is no per-object

+ * overhead within a pool, except for alignment padding.  Each pool has a

+ * header with a link to the next pool of the same class.

+ * Small and large pool headers are identical except that the latter's

+ * link pointer must be FAR on 80x86 machines.

+ * Notice that the "real" header fields are union'ed with a dummy ALIGN_TYPE

+ * field.  This forces the compiler to make SIZEOF(small_pool_hdr) a multiple

+ * of the alignment requirement of ALIGN_TYPE.

+ */

+

+typedef union small_pool_struct * small_pool_ptr;

+

+typedef union small_pool_struct {

+  struct {

+    small_pool_ptr next;	/* next in list of pools */

+    size_t bytes_used;		/* how many bytes already used within pool */

+    size_t bytes_left;		/* bytes still available in this pool */

+  } hdr;

+  ALIGN_TYPE dummy;		/* included in union to ensure alignment */

+} small_pool_hdr;

+

+typedef union large_pool_struct FAR * large_pool_ptr;

+

+typedef union large_pool_struct {

+  struct {

+    large_pool_ptr next;	/* next in list of pools */

+    size_t bytes_used;		/* how many bytes already used within pool */

+    size_t bytes_left;		/* bytes still available in this pool */

+  } hdr;

+  ALIGN_TYPE dummy;		/* included in union to ensure alignment */

+} large_pool_hdr;

+

+

+/*

+ * Here is the full definition of a memory manager object.

+ */

+

+typedef struct {

+  struct jpeg_memory_mgr pub;	/* public fields */

+

+  /* Each pool identifier (lifetime class) names a linked list of pools. */

+  small_pool_ptr small_list[JPOOL_NUMPOOLS];

+  large_pool_ptr large_list[JPOOL_NUMPOOLS];

+

+  /* Since we only have one lifetime class of virtual arrays, only one

+   * linked list is necessary (for each datatype).  Note that the virtual

+   * array control blocks being linked together are actually stored somewhere

+   * in the small-pool list.

+   */

+  jvirt_sarray_ptr virt_sarray_list;

+  jvirt_barray_ptr virt_barray_list;

+

+  /* This counts total space obtained from jpeg_get_small/large */

+  long total_space_allocated;

+

+  /* alloc_sarray and alloc_barray set this value for use by virtual

+   * array routines.

+   */

+  JDIMENSION last_rowsperchunk;	/* from most recent alloc_sarray/barray */

+} my_memory_mgr;

+

+typedef my_memory_mgr * my_mem_ptr;

+

+

+/*

+ * The control blocks for virtual arrays.

+ * Note that these blocks are allocated in the "small" pool area.

+ * System-dependent info for the associated backing store (if any) is hidden

+ * inside the backing_store_info struct.

+ */

+

+struct jvirt_sarray_control {

+  JSAMPARRAY mem_buffer;	/* => the in-memory buffer */

+  JDIMENSION rows_in_array;	/* total virtual array height */

+  JDIMENSION samplesperrow;	/* width of array (and of memory buffer) */

+  JDIMENSION maxaccess;		/* max rows accessed by access_virt_sarray */

+  JDIMENSION rows_in_mem;	/* height of memory buffer */

+  JDIMENSION rowsperchunk;	/* allocation chunk size in mem_buffer */

+  JDIMENSION cur_start_row;	/* first logical row # in the buffer */

+  JDIMENSION first_undef_row;	/* row # of first uninitialized row */

+  boolean pre_zero;		/* pre-zero mode requested? */

+  boolean dirty;		/* do current buffer contents need written? */

+  boolean b_s_open;		/* is backing-store data valid? */

+  jvirt_sarray_ptr next;	/* link to next virtual sarray control block */

+  backing_store_info b_s_info;	/* System-dependent control info */

+};

+

+struct jvirt_barray_control {

+  JBLOCKARRAY mem_buffer;	/* => the in-memory buffer */

+  JDIMENSION rows_in_array;	/* total virtual array height */

+  JDIMENSION blocksperrow;	/* width of array (and of memory buffer) */

+  JDIMENSION maxaccess;		/* max rows accessed by access_virt_barray */

+  JDIMENSION rows_in_mem;	/* height of memory buffer */

+  JDIMENSION rowsperchunk;	/* allocation chunk size in mem_buffer */

+  JDIMENSION cur_start_row;	/* first logical row # in the buffer */

+  JDIMENSION first_undef_row;	/* row # of first uninitialized row */

+  boolean pre_zero;		/* pre-zero mode requested? */

+  boolean dirty;		/* do current buffer contents need written? */

+  boolean b_s_open;		/* is backing-store data valid? */

+  jvirt_barray_ptr next;	/* link to next virtual barray control block */

+  backing_store_info b_s_info;	/* System-dependent control info */

+};

+

+

+#ifdef MEM_STATS		/* optional extra stuff for statistics */

+

+LOCAL(void)

+print_mem_stats (j_common_ptr cinfo, int pool_id)

+{

+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;

+  small_pool_ptr shdr_ptr;

+  large_pool_ptr lhdr_ptr;

+

+  /* Since this is only a debugging stub, we can cheat a little by using

+   * fprintf directly rather than going through the trace message code.

+   * This is helpful because message parm array can't handle longs.

+   */

+  FXSYS_fprintf(stderr, "Freeing pool %d, total space = %ld\n",

+	  pool_id, mem->total_space_allocated);

+

+  for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL;

+       lhdr_ptr = lhdr_ptr->hdr.next) {

+    FXSYS_fprintf(stderr, "  Large chunk used %ld\n",

+	    (long) lhdr_ptr->hdr.bytes_used);

+  }

+

+  for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL;

+       shdr_ptr = shdr_ptr->hdr.next) {

+    FXSYS_fprintf(stderr, "  Small chunk used %ld free %ld\n",

+	    (long) shdr_ptr->hdr.bytes_used,

+	    (long) shdr_ptr->hdr.bytes_left);

+  }

+}

+

+#endif /* MEM_STATS */

+

+

+LOCAL(void)

+out_of_memory (j_common_ptr cinfo, int which)

+/* Report an out-of-memory error and stop execution */

+/* If we compiled MEM_STATS support, report alloc requests before dying */

+{

+#ifdef MEM_STATS

+  cinfo->err->trace_level = 2;	/* force self_destruct to report stats */

+#endif

+  ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which);

+}

+

+

+/*

+ * Allocation of "small" objects.

+ *

+ * For these, we use pooled storage.  When a new pool must be created,

+ * we try to get enough space for the current request plus a "slop" factor,

+ * where the slop will be the amount of leftover space in the new pool.

+ * The speed vs. space tradeoff is largely determined by the slop values.

+ * A different slop value is provided for each pool class (lifetime),

+ * and we also distinguish the first pool of a class from later ones.

+ * NOTE: the values given work fairly well on both 16- and 32-bit-int

+ * machines, but may be too small if longs are 64 bits or more.

+ */

+

+static const size_t first_pool_slop[JPOOL_NUMPOOLS] = 

+{

+	1600,			/* first PERMANENT pool */

+	16000			/* first IMAGE pool */

+};

+

+static const size_t extra_pool_slop[JPOOL_NUMPOOLS] = 

+{

+	0,			/* additional PERMANENT pools */

+	5000			/* additional IMAGE pools */

+};

+

+#define MIN_SLOP  50		/* greater than 0 to avoid futile looping */

+

+

+METHODDEF(void *)

+alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)

+/* Allocate a "small" object */

+{

+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;

+  small_pool_ptr hdr_ptr, prev_hdr_ptr;

+  char * data_ptr;

+  size_t odd_bytes, min_request, slop;

+

+  /* Check for unsatisfiable request (do now to ensure no overflow below) */

+  if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr)))

+    out_of_memory(cinfo, 1);	/* request exceeds malloc's ability */

+

+  /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */

+  odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);

+  if (odd_bytes > 0)

+    sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;

+

+  /* See if space is available in any existing pool */

+  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)

+    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);	/* safety check */

+  prev_hdr_ptr = NULL;

+  hdr_ptr = mem->small_list[pool_id];

+  while (hdr_ptr != NULL) {

+    if (hdr_ptr->hdr.bytes_left >= sizeofobject)

+      break;			/* found pool with enough space */

+    prev_hdr_ptr = hdr_ptr;

+    hdr_ptr = hdr_ptr->hdr.next;

+  }

+

+  /* Time to make a new pool? */

+  if (hdr_ptr == NULL) {

+    /* min_request is what we need now, slop is what will be leftover */

+    min_request = sizeofobject + SIZEOF(small_pool_hdr);

+    if (prev_hdr_ptr == NULL)	/* first pool in class? */

+      slop = first_pool_slop[pool_id];

+    else

+      slop = extra_pool_slop[pool_id];

+    /* Don't ask for more than MAX_ALLOC_CHUNK */

+    if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request))

+      slop = (size_t) (MAX_ALLOC_CHUNK-min_request);

+    /* Try to get space, if fail reduce slop and try again */

+    for (;;) {

+      hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);

+      if (hdr_ptr != NULL)

+	break;

+      slop /= 2;

+      if (slop < MIN_SLOP)	/* give up when it gets real small */

+	out_of_memory(cinfo, 2); /* jpeg_get_small failed */

+    }

+    mem->total_space_allocated += min_request + slop;

+    /* Success, initialize the new pool header and add to end of list */

+    hdr_ptr->hdr.next = NULL;

+    hdr_ptr->hdr.bytes_used = 0;

+    hdr_ptr->hdr.bytes_left = sizeofobject + slop;

+    if (prev_hdr_ptr == NULL)	/* first pool in class? */

+      mem->small_list[pool_id] = hdr_ptr;

+    else

+      prev_hdr_ptr->hdr.next = hdr_ptr;

+  }

+

+  /* OK, allocate the object from the current pool */

+  data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */

+  data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */

+  hdr_ptr->hdr.bytes_used += sizeofobject;

+  hdr_ptr->hdr.bytes_left -= sizeofobject;

+

+  return (void *) data_ptr;

+}

+

+

+/*

+ * Allocation of "large" objects.

+ *

+ * The external semantics of these are the same as "small" objects,

+ * except that FAR pointers are used on 80x86.  However the pool

+ * management heuristics are quite different.  We assume that each

+ * request is large enough that it may as well be passed directly to

+ * jpeg_get_large; the pool management just links everything together

+ * so that we can free it all on demand.

+ * Note: the major use of "large" objects is in JSAMPARRAY and JBLOCKARRAY

+ * structures.  The routines that create these structures (see below)

+ * deliberately bunch rows together to ensure a large request size.

+ */

+

+METHODDEF(void FAR *)

+alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject)

+/* Allocate a "large" object */

+{

+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;

+  large_pool_ptr hdr_ptr;

+  size_t odd_bytes;

+

+  /* Check for unsatisfiable request (do now to ensure no overflow below) */

+  if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)))

+    out_of_memory(cinfo, 3);	/* request exceeds malloc's ability */

+

+  /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */

+  odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);

+  if (odd_bytes > 0)

+    sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;

+

+  /* Always make a new pool */

+  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)

+    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);	/* safety check */

+

+  hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject +

+					    SIZEOF(large_pool_hdr));

+  if (hdr_ptr == NULL)

+    out_of_memory(cinfo, 4);	/* jpeg_get_large failed */

+  mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr);

+

+  /* Success, initialize the new pool header and add to list */

+  hdr_ptr->hdr.next = mem->large_list[pool_id];

+  /* We maintain space counts in each pool header for statistical purposes,

+   * even though they are not needed for allocation.

+   */

+  hdr_ptr->hdr.bytes_used = sizeofobject;

+  hdr_ptr->hdr.bytes_left = 0;

+  mem->large_list[pool_id] = hdr_ptr;

+

+  return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */

+}

+

+

+/*

+ * Creation of 2-D sample arrays.

+ * The pointers are in near heap, the samples themselves in FAR heap.

+ *

+ * To minimize allocation overhead and to allow I/O of large contiguous

+ * blocks, we allocate the sample rows in groups of as many rows as possible

+ * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request.

+ * NB: the virtual array control routines, later in this file, know about

+ * this chunking of rows.  The rowsperchunk value is left in the mem manager

+ * object so that it can be saved away if this sarray is the workspace for

+ * a virtual array.

+ */

+

+METHODDEF(JSAMPARRAY)

+alloc_sarray (j_common_ptr cinfo, int pool_id,

+	      JDIMENSION samplesperrow, JDIMENSION numrows)

+/* Allocate a 2-D sample array */

+{

+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;

+  JSAMPARRAY result;

+  JSAMPROW workspace;

+  JDIMENSION rowsperchunk, currow, i;

+  long ltemp;

+

+  /* Calculate max # of rows allowed in one allocation chunk */

+  ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /

+	  ((long) samplesperrow * SIZEOF(JSAMPLE));

+  if (ltemp <= 0)

+    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);

+  if (ltemp < (long) numrows)

+    rowsperchunk = (JDIMENSION) ltemp;

+  else

+    rowsperchunk = numrows;

+  mem->last_rowsperchunk = rowsperchunk;

+

+  /* Get space for row pointers (small object) */

+  result = (JSAMPARRAY) alloc_small(cinfo, pool_id,

+				    (size_t) (numrows * SIZEOF(JSAMPROW)));

+

+  /* Get the rows themselves (large objects) */

+  currow = 0;

+  while (currow < numrows) {

+    rowsperchunk = MIN(rowsperchunk, numrows - currow);

+    workspace = (JSAMPROW) alloc_large(cinfo, pool_id,

+	(size_t) ((size_t) rowsperchunk * (size_t) samplesperrow

+		  * SIZEOF(JSAMPLE)));

+    for (i = rowsperchunk; i > 0; i--) {

+      result[currow++] = workspace;

+      workspace += samplesperrow;

+    }

+  }

+

+  return result;

+}

+

+

+/*

+ * Creation of 2-D coefficient-block arrays.

+ * This is essentially the same as the code for sample arrays, above.

+ */

+

+METHODDEF(JBLOCKARRAY)

+alloc_barray (j_common_ptr cinfo, int pool_id,

+	      JDIMENSION blocksperrow, JDIMENSION numrows)

+/* Allocate a 2-D coefficient-block array */

+{

+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;

+  JBLOCKARRAY result;

+  JBLOCKROW workspace;

+  JDIMENSION rowsperchunk, currow, i;

+  long ltemp;

+

+  /* Calculate max # of rows allowed in one allocation chunk */

+  ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /

+	  ((long) blocksperrow * SIZEOF(JBLOCK));

+  if (ltemp <= 0)

+    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);

+  if (ltemp < (long) numrows)

+    rowsperchunk = (JDIMENSION) ltemp;

+  else

+    rowsperchunk = numrows;

+  mem->last_rowsperchunk = rowsperchunk;

+

+  /* Get space for row pointers (small object) */

+  result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,

+				     (size_t) (numrows * SIZEOF(JBLOCKROW)));

+

+  /* Get the rows themselves (large objects) */

+  currow = 0;

+  while (currow < numrows) {

+    rowsperchunk = MIN(rowsperchunk, numrows - currow);

+    workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,

+	(size_t) ((size_t) rowsperchunk * (size_t) blocksperrow

+		  * SIZEOF(JBLOCK)));

+    for (i = rowsperchunk; i > 0; i--) {

+      result[currow++] = workspace;

+      workspace += blocksperrow;

+    }

+  }

+

+  return result;

+}

+

+

+/*

+ * About virtual array management:

+ *

+ * The above "normal" array routines are only used to allocate strip buffers

+ * (as wide as the image, but just a few rows high).  Full-image-sized buffers

+ * are handled as "virtual" arrays.  The array is still accessed a strip at a

+ * time, but the memory manager must save the whole array for repeated

+ * accesses.  The intended implementation is that there is a strip buffer in

+ * memory (as high as is possible given the desired memory limit), plus a

+ * backing file that holds the rest of the array.

+ *

+ * The request_virt_array routines are told the total size of the image and

+ * the maximum number of rows that will be accessed at once.  The in-memory

+ * buffer must be at least as large as the maxaccess value.

+ *

+ * The request routines create control blocks but not the in-memory buffers.

+ * That is postponed until realize_virt_arrays is called.  At that time the

+ * total amount of space needed is known (approximately, anyway), so free

+ * memory can be divided up fairly.

+ *

+ * The access_virt_array routines are responsible for making a specific strip

+ * area accessible (after reading or writing the backing file, if necessary).

+ * Note that the access routines are told whether the caller intends to modify

+ * the accessed strip; during a read-only pass this saves having to rewrite

+ * data to disk.  The access routines are also responsible for pre-zeroing

+ * any newly accessed rows, if pre-zeroing was requested.

+ *

+ * In current usage, the access requests are usually for nonoverlapping

+ * strips; that is, successive access start_row numbers differ by exactly

+ * num_rows = maxaccess.  This means we can get good performance with simple

+ * buffer dump/reload logic, by making the in-memory buffer be a multiple

+ * of the access height; then there will never be accesses across bufferload

+ * boundaries.  The code will still work with overlapping access requests,

+ * but it doesn't handle bufferload overlaps very efficiently.

+ */

+

+

+METHODDEF(jvirt_sarray_ptr)

+request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero,

+		     JDIMENSION samplesperrow, JDIMENSION numrows,

+		     JDIMENSION maxaccess)

+/* Request a virtual 2-D sample array */

+{

+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;

+  jvirt_sarray_ptr result;

+

+  /* Only IMAGE-lifetime virtual arrays are currently supported */

+  if (pool_id != JPOOL_IMAGE)

+    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);	/* safety check */

+

+  /* get control block */

+  result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id,

+					  SIZEOF(struct jvirt_sarray_control));

+

+  result->mem_buffer = NULL;	/* marks array not yet realized */

+  result->rows_in_array = numrows;

+  result->samplesperrow = samplesperrow;

+  result->maxaccess = maxaccess;

+  result->pre_zero = pre_zero;

+  result->b_s_open = FALSE;	/* no associated backing-store object */

+  result->next = mem->virt_sarray_list; /* add to list of virtual arrays */

+  mem->virt_sarray_list = result;

+

+  return result;

+}

+

+

+METHODDEF(jvirt_barray_ptr)

+request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero,

+		     JDIMENSION blocksperrow, JDIMENSION numrows,

+		     JDIMENSION maxaccess)

+/* Request a virtual 2-D coefficient-block array */

+{

+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;

+  jvirt_barray_ptr result;

+

+  /* Only IMAGE-lifetime virtual arrays are currently supported */

+  if (pool_id != JPOOL_IMAGE)

+    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);	/* safety check */

+

+  /* get control block */

+  result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id,

+					  SIZEOF(struct jvirt_barray_control));

+

+  result->mem_buffer = NULL;	/* marks array not yet realized */

+  result->rows_in_array = numrows;

+  result->blocksperrow = blocksperrow;

+  result->maxaccess = maxaccess;

+  result->pre_zero = pre_zero;

+  result->b_s_open = FALSE;	/* no associated backing-store object */

+  result->next = mem->virt_barray_list; /* add to list of virtual arrays */

+  mem->virt_barray_list = result;

+

+  return result;

+}

+

+

+METHODDEF(void)

+realize_virt_arrays (j_common_ptr cinfo)

+/* Allocate the in-memory buffers for any unrealized virtual arrays */

+{

+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;

+  long space_per_minheight, maximum_space, avail_mem;

+  long minheights, max_minheights;

+  jvirt_sarray_ptr sptr;

+  jvirt_barray_ptr bptr;

+

+  /* Compute the minimum space needed (maxaccess rows in each buffer)

+   * and the maximum space needed (full image height in each buffer).

+   * These may be of use to the system-dependent jpeg_mem_available routine.

+   */

+  space_per_minheight = 0;

+  maximum_space = 0;

+  for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {

+    if (sptr->mem_buffer == NULL) { /* if not realized yet */

+      space_per_minheight += (long) sptr->maxaccess *

+			     (long) sptr->samplesperrow * SIZEOF(JSAMPLE);

+      maximum_space += (long) sptr->rows_in_array *

+		       (long) sptr->samplesperrow * SIZEOF(JSAMPLE);

+    }

+  }

+  for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {

+    if (bptr->mem_buffer == NULL) { /* if not realized yet */

+      space_per_minheight += (long) bptr->maxaccess *

+			     (long) bptr->blocksperrow * SIZEOF(JBLOCK);

+      maximum_space += (long) bptr->rows_in_array *

+		       (long) bptr->blocksperrow * SIZEOF(JBLOCK);

+    }

+  }

+

+  if (space_per_minheight <= 0)

+    return;			/* no unrealized arrays, no work */

+

+  /* Determine amount of memory to actually use; this is system-dependent. */

+  avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,

+				 mem->total_space_allocated);

+

+  /* If the maximum space needed is available, make all the buffers full

+   * height; otherwise parcel it out with the same number of minheights

+   * in each buffer.

+   */

+  if (avail_mem >= maximum_space)

+    max_minheights = 1000000000L;

+  else {

+    max_minheights = avail_mem / space_per_minheight;

+    /* If there doesn't seem to be enough space, try to get the minimum

+     * anyway.  This allows a "stub" implementation of jpeg_mem_available().

+     */

+    if (max_minheights <= 0)

+      max_minheights = 1;

+  }

+

+  /* Allocate the in-memory buffers and initialize backing store as needed. */

+

+  for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {

+    if (sptr->mem_buffer == NULL) { /* if not realized yet */

+      minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L;

+      if (minheights <= max_minheights) {

+	/* This buffer fits in memory */

+	sptr->rows_in_mem = sptr->rows_in_array;

+      } else {

+	/* It doesn't fit in memory, create backing store. */

+	sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess);

+	jpeg_open_backing_store(cinfo, & sptr->b_s_info,

+				(long) sptr->rows_in_array *

+				(long) sptr->samplesperrow *

+				(long) SIZEOF(JSAMPLE));

+	sptr->b_s_open = TRUE;

+      }

+      sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE,

+				      sptr->samplesperrow, sptr->rows_in_mem);

+      sptr->rowsperchunk = mem->last_rowsperchunk;

+      sptr->cur_start_row = 0;

+      sptr->first_undef_row = 0;

+      sptr->dirty = FALSE;

+    }

+  }

+

+  for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {

+    if (bptr->mem_buffer == NULL) { /* if not realized yet */

+      minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L;

+      if (minheights <= max_minheights) {

+	/* This buffer fits in memory */

+	bptr->rows_in_mem = bptr->rows_in_array;

+      } else {

+	/* It doesn't fit in memory, create backing store. */

+	bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess);

+	jpeg_open_backing_store(cinfo, & bptr->b_s_info,

+				(long) bptr->rows_in_array *

+				(long) bptr->blocksperrow *

+				(long) SIZEOF(JBLOCK));

+	bptr->b_s_open = TRUE;

+      }

+      bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE,

+				      bptr->blocksperrow, bptr->rows_in_mem);

+      bptr->rowsperchunk = mem->last_rowsperchunk;

+      bptr->cur_start_row = 0;

+      bptr->first_undef_row = 0;

+      bptr->dirty = FALSE;

+    }

+  }

+}

+

+

+LOCAL(void)

+do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing)

+/* Do backing store read or write of a virtual sample array */

+{

+  long bytesperrow, file_offset, byte_count, rows, thisrow, i;

+

+  bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);

+  file_offset = ptr->cur_start_row * bytesperrow;

+  /* Loop to read or write each allocation chunk in mem_buffer */

+  for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {

+    /* One chunk, but check for short chunk at end of buffer */

+    rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);

+    /* Transfer no more than is currently defined */

+    thisrow = (long) ptr->cur_start_row + i;

+    rows = MIN(rows, (long) ptr->first_undef_row - thisrow);

+    /* Transfer no more than fits in file */

+    rows = MIN(rows, (long) ptr->rows_in_array - thisrow);

+    if (rows <= 0)		/* this chunk might be past end of file! */

+      break;

+    byte_count = rows * bytesperrow;

+    if (writing)

+      (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,

+					    (void FAR *) ptr->mem_buffer[i],

+					    file_offset, byte_count);

+    else

+      (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,

+					   (void FAR *) ptr->mem_buffer[i],

+					   file_offset, byte_count);

+    file_offset += byte_count;

+  }

+}

+

+

+LOCAL(void)

+do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing)

+/* Do backing store read or write of a virtual coefficient-block array */

+{

+  long bytesperrow, file_offset, byte_count, rows, thisrow, i;

+

+  bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);

+  file_offset = ptr->cur_start_row * bytesperrow;

+  /* Loop to read or write each allocation chunk in mem_buffer */

+  for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {

+    /* One chunk, but check for short chunk at end of buffer */

+    rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);

+    /* Transfer no more than is currently defined */

+    thisrow = (long) ptr->cur_start_row + i;

+    rows = MIN(rows, (long) ptr->first_undef_row - thisrow);

+    /* Transfer no more than fits in file */

+    rows = MIN(rows, (long) ptr->rows_in_array - thisrow);

+    if (rows <= 0)		/* this chunk might be past end of file! */

+      break;

+    byte_count = rows * bytesperrow;

+    if (writing)

+      (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,

+					    (void FAR *) ptr->mem_buffer[i],

+					    file_offset, byte_count);

+    else

+      (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,

+					   (void FAR *) ptr->mem_buffer[i],

+					   file_offset, byte_count);

+    file_offset += byte_count;

+  }

+}

+

+

+METHODDEF(JSAMPARRAY)

+access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,

+		    JDIMENSION start_row, JDIMENSION num_rows,

+		    boolean writable)

+/* Access the part of a virtual sample array starting at start_row */

+/* and extending for num_rows rows.  writable is true if  */

+/* caller intends to modify the accessed area. */

+{

+  JDIMENSION end_row = start_row + num_rows;

+  JDIMENSION undef_row;

+

+  /* debugging check */

+  if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||

+      ptr->mem_buffer == NULL)

+    ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);

+

+  /* Make the desired part of the virtual array accessible */

+  if (start_row < ptr->cur_start_row ||

+      end_row > ptr->cur_start_row+ptr->rows_in_mem) {

+    if (! ptr->b_s_open)

+      ERREXIT(cinfo, JERR_VIRTUAL_BUG);

+    /* Flush old buffer contents if necessary */

+    if (ptr->dirty) {

+      do_sarray_io(cinfo, ptr, TRUE);

+      ptr->dirty = FALSE;

+    }

+    /* Decide what part of virtual array to access.

+     * Algorithm: if target address > current window, assume forward scan,

+     * load starting at target address.  If target address < current window,

+     * assume backward scan, load so that target area is top of window.

+     * Note that when switching from forward write to forward read, will have

+     * start_row = 0, so the limiting case applies and we load from 0 anyway.

+     */

+    if (start_row > ptr->cur_start_row) {

+      ptr->cur_start_row = start_row;

+    } else {

+      /* use long arithmetic here to avoid overflow & unsigned problems */

+      long ltemp;

+

+      ltemp = (long) end_row - (long) ptr->rows_in_mem;

+      if (ltemp < 0)

+	ltemp = 0;		/* don't fall off front end of file */

+      ptr->cur_start_row = (JDIMENSION) ltemp;

+    }

+    /* Read in the selected part of the array.

+     * During the initial write pass, we will do no actual read

+     * because the selected part is all undefined.

+     */

+    do_sarray_io(cinfo, ptr, FALSE);

+  }

+  /* Ensure the accessed part of the array is defined; prezero if needed.

+   * To improve locality of access, we only prezero the part of the array

+   * that the caller is about to access, not the entire in-memory array.

+   */

+  if (ptr->first_undef_row < end_row) {

+    if (ptr->first_undef_row < start_row) {

+      if (writable)		/* writer skipped over a section of array */

+	ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);

+      undef_row = start_row;	/* but reader is allowed to read ahead */

+    } else {

+      undef_row = ptr->first_undef_row;

+    }

+    if (writable)

+      ptr->first_undef_row = end_row;

+    if (ptr->pre_zero) {

+      size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE);

+      undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */

+      end_row -= ptr->cur_start_row;

+      while (undef_row < end_row) {

+	jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);

+	undef_row++;

+      }

+    } else {

+      if (! writable)		/* reader looking at undefined data */

+	ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);

+    }

+  }

+  /* Flag the buffer dirty if caller will write in it */

+  if (writable)

+    ptr->dirty = TRUE;

+  /* Return address of proper part of the buffer */

+  return ptr->mem_buffer + (start_row - ptr->cur_start_row);

+}

+

+

+METHODDEF(JBLOCKARRAY)

+access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,

+		    JDIMENSION start_row, JDIMENSION num_rows,

+		    boolean writable)

+/* Access the part of a virtual block array starting at start_row */

+/* and extending for num_rows rows.  writable is true if  */

+/* caller intends to modify the accessed area. */

+{

+  JDIMENSION end_row = start_row + num_rows;

+  JDIMENSION undef_row;

+

+  /* debugging check */

+  if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||

+      ptr->mem_buffer == NULL)

+    ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);

+

+  /* Make the desired part of the virtual array accessible */

+  if (start_row < ptr->cur_start_row ||

+      end_row > ptr->cur_start_row+ptr->rows_in_mem) {

+    if (! ptr->b_s_open)

+      ERREXIT(cinfo, JERR_VIRTUAL_BUG);

+    /* Flush old buffer contents if necessary */

+    if (ptr->dirty) {

+      do_barray_io(cinfo, ptr, TRUE);

+      ptr->dirty = FALSE;

+    }

+    /* Decide what part of virtual array to access.

+     * Algorithm: if target address > current window, assume forward scan,

+     * load starting at target address.  If target address < current window,

+     * assume backward scan, load so that target area is top of window.

+     * Note that when switching from forward write to forward read, will have

+     * start_row = 0, so the limiting case applies and we load from 0 anyway.

+     */

+    if (start_row > ptr->cur_start_row) {

+      ptr->cur_start_row = start_row;

+    } else {

+      /* use long arithmetic here to avoid overflow & unsigned problems */

+      long ltemp;

+

+      ltemp = (long) end_row - (long) ptr->rows_in_mem;

+      if (ltemp < 0)

+	ltemp = 0;		/* don't fall off front end of file */

+      ptr->cur_start_row = (JDIMENSION) ltemp;

+    }

+    /* Read in the selected part of the array.

+     * During the initial write pass, we will do no actual read

+     * because the selected part is all undefined.

+     */

+    do_barray_io(cinfo, ptr, FALSE);

+  }

+  /* Ensure the accessed part of the array is defined; prezero if needed.

+   * To improve locality of access, we only prezero the part of the array

+   * that the caller is about to access, not the entire in-memory array.

+   */

+  if (ptr->first_undef_row < end_row) {

+    if (ptr->first_undef_row < start_row) {

+      if (writable)		/* writer skipped over a section of array */

+	ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);

+      undef_row = start_row;	/* but reader is allowed to read ahead */

+    } else {

+      undef_row = ptr->first_undef_row;

+    }

+    if (writable)

+      ptr->first_undef_row = end_row;

+    if (ptr->pre_zero) {

+      size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK);

+      undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */

+      end_row -= ptr->cur_start_row;

+      while (undef_row < end_row) {

+	jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);

+	undef_row++;

+      }

+    } else {

+      if (! writable)		/* reader looking at undefined data */

+	ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);

+    }

+  }

+  /* Flag the buffer dirty if caller will write in it */

+  if (writable)

+    ptr->dirty = TRUE;

+  /* Return address of proper part of the buffer */

+  return ptr->mem_buffer + (start_row - ptr->cur_start_row);

+}

+

+

+/*

+ * Release all objects belonging to a specified pool.

+ */

+

+METHODDEF(void)

+free_pool (j_common_ptr cinfo, int pool_id)

+{

+  my_mem_ptr mem = (my_mem_ptr) cinfo->mem;

+  small_pool_ptr shdr_ptr;

+  large_pool_ptr lhdr_ptr;

+  size_t space_freed;

+

+  if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)

+    ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id);	/* safety check */

+

+#ifdef MEM_STATS

+  if (cinfo->err->trace_level > 1)

+    print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */

+#endif

+

+  /* If freeing IMAGE pool, close any virtual arrays first */

+  if (pool_id == JPOOL_IMAGE) {

+    jvirt_sarray_ptr sptr;

+    jvirt_barray_ptr bptr;

+

+    for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {

+      if (sptr->b_s_open) {	/* there may be no backing store */

+	sptr->b_s_open = FALSE;	/* prevent recursive close if error */

+	(*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info);

+      }

+    }

+    mem->virt_sarray_list = NULL;

+    for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {

+      if (bptr->b_s_open) {	/* there may be no backing store */

+	bptr->b_s_open = FALSE;	/* prevent recursive close if error */

+	(*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info);

+      }

+    }

+    mem->virt_barray_list = NULL;

+  }

+

+  /* Release large objects */

+  lhdr_ptr = mem->large_list[pool_id];

+  mem->large_list[pool_id] = NULL;

+

+  while (lhdr_ptr != NULL) {

+    large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next;

+    space_freed = lhdr_ptr->hdr.bytes_used +

+		  lhdr_ptr->hdr.bytes_left +

+		  SIZEOF(large_pool_hdr);

+    jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed);

+    mem->total_space_allocated -= space_freed;

+    lhdr_ptr = next_lhdr_ptr;

+  }

+

+  /* Release small objects */

+  shdr_ptr = mem->small_list[pool_id];

+  mem->small_list[pool_id] = NULL;

+

+  while (shdr_ptr != NULL) {

+    small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next;

+    space_freed = shdr_ptr->hdr.bytes_used +

+		  shdr_ptr->hdr.bytes_left +

+		  SIZEOF(small_pool_hdr);

+    jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed);

+    mem->total_space_allocated -= space_freed;

+    shdr_ptr = next_shdr_ptr;

+  }

+}

+

+

+/*

+ * Close up shop entirely.

+ * Note that this cannot be called unless cinfo->mem is non-NULL.

+ */

+

+METHODDEF(void)

+self_destruct (j_common_ptr cinfo)

+{

+  int pool;

+

+  /* Close all backing store, release all memory.

+   * Releasing pools in reverse order might help avoid fragmentation

+   * with some (brain-damaged) malloc libraries.

+   */

+  for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {

+    free_pool(cinfo, pool);

+  }

+

+  /* Release the memory manager control block too. */

+  jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr));

+  cinfo->mem = NULL;		/* ensures I will be called only once */

+

+  jpeg_mem_term(cinfo);		/* system-dependent cleanup */

+}

+

+

+/*

+ * Memory manager initialization.

+ * When this is called, only the error manager pointer is valid in cinfo!

+ */

+

+GLOBAL(void)

+jinit_memory_mgr (j_common_ptr cinfo)

+{

+  my_mem_ptr mem;

+  long max_to_use;

+  int pool;

+  size_t test_mac;

+

+  cinfo->mem = NULL;		/* for safety if init fails */

+

+  /* Check for configuration errors.

+   * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably

+   * doesn't reflect any real hardware alignment requirement.

+   * The test is a little tricky: for X>0, X and X-1 have no one-bits

+   * in common if and only if X is a power of 2, ie has only one one-bit.

+   * Some compilers may give an "unreachable code" warning here; ignore it.

+   */

+  if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0)

+    ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE);

+  /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be

+   * a multiple of SIZEOF(ALIGN_TYPE).

+   * Again, an "unreachable code" warning may be ignored here.

+   * But a "constant too large" warning means you need to fix MAX_ALLOC_CHUNK.

+   */

+  test_mac = (size_t) MAX_ALLOC_CHUNK;

+  if ((long) test_mac != MAX_ALLOC_CHUNK ||

+      (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0)

+    ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK);

+

+  max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */

+

+  /* Attempt to allocate memory manager's control block */

+  mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr));

+

+  if (mem == NULL) {

+    jpeg_mem_term(cinfo);	/* system-dependent cleanup */

+    ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0);

+  }

+

+  /* OK, fill in the method pointers */

+  mem->pub.alloc_small = alloc_small;

+  mem->pub.alloc_large = alloc_large;

+  mem->pub.alloc_sarray = alloc_sarray;

+  mem->pub.alloc_barray = alloc_barray;

+  mem->pub.request_virt_sarray = request_virt_sarray;

+  mem->pub.request_virt_barray = request_virt_barray;

+  mem->pub.realize_virt_arrays = realize_virt_arrays;

+  mem->pub.access_virt_sarray = access_virt_sarray;

+  mem->pub.access_virt_barray = access_virt_barray;

+  mem->pub.free_pool = free_pool;

+  mem->pub.self_destruct = self_destruct;

+

+  /* Make MAX_ALLOC_CHUNK accessible to other modules */

+  mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK;

+

+  /* Initialize working state */

+  mem->pub.max_memory_to_use = max_to_use;

+

+  for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {

+    mem->small_list[pool] = NULL;

+    mem->large_list[pool] = NULL;

+  }

+  mem->virt_sarray_list = NULL;

+  mem->virt_barray_list = NULL;

+

+  mem->total_space_allocated = SIZEOF(my_memory_mgr);

+

+  /* Declare ourselves open for business */

+  cinfo->mem = & mem->pub;

+

+  /* Check for an environment variable JPEGMEM; if found, override the

+   * default max_memory setting from jpeg_mem_init.  Note that the

+   * surrounding application may again override this value.

+   * If your system doesn't support getenv(), define NO_GETENV to disable

+   * this feature.

+   */

+#ifndef NO_GETENV

+  { char * memenv;

+

+    if ((memenv = getenv("JPEGMEM")) != NULL) {

+      char ch = 'x';

+

+      if (sscanf(memenv, "%ld%c", &max_to_use, &ch) > 0) {

+	if (ch == 'm' || ch == 'M')

+	  max_to_use *= 1000L;

+	mem->pub.max_memory_to_use = max_to_use * 1000L;

+      }

+    }

+  }

+#endif

+

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c b/core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c
new file mode 100644
index 0000000..98aed72
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c
@@ -0,0 +1,126 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jmemnobs.c

+ *

+ * Copyright (C) 1992-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file provides a really simple implementation of the system-

+ * dependent portion of the JPEG memory manager.  This implementation

+ * assumes that no backing-store files are needed: all required space

+ * can be obtained from malloc().

+ * This is very portable in the sense that it'll compile on almost anything,

+ * but you'd better have lots of main memory (or virtual memory) if you want

+ * to process big images.

+ * Note that the max_memory_to_use option is ignored by this implementation.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+#include "jmemsys.h"		/* import the system-dependent declarations */

+

+#ifndef HAVE_STDLIB_H		/* <stdlib.h> should declare malloc(),free() */

+extern void * malloc JPP((size_t size));

+extern void free JPP((void *ptr));

+#endif

+

+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)

+extern "C" {

+#endif

+

+void*	FXMEM_DefaultAlloc(int byte_size, int);

+void	FXMEM_DefaultFree(void* pointer, int);

+

+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)

+}

+#endif

+

+/*

+ * Memory allocation and freeing are controlled by the regular library

+ * routines malloc() and free().

+ */

+

+GLOBAL(void *)

+jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)

+{

+//  return (void *) malloc(sizeofobject);

+	return FXMEM_DefaultAlloc(sizeofobject, 0);

+}

+

+GLOBAL(void)

+jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)

+{

+//  free(object);

+	FXMEM_DefaultFree(object, 0);

+}

+

+

+/*

+ * "Large" objects are treated the same as "small" ones.

+ * NB: although we include FAR keywords in the routine declarations,

+ * this file won't actually work in 80x86 small/medium model; at least,

+ * you probably won't be able to process useful-size images in only 64KB.

+ */

+

+GLOBAL(void FAR *)

+jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)

+{

+//  return (void FAR *) malloc(sizeofobject);

+	return FXMEM_DefaultAlloc(sizeofobject, 0);

+}

+

+GLOBAL(void)

+jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)

+{

+//  free(object);

+	FXMEM_DefaultFree(object, 0);

+}

+

+

+/*

+ * This routine computes the total memory space available for allocation.

+ * Here we always say, "we got all you want bud!"

+ */

+

+GLOBAL(long)

+jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,

+		    long max_bytes_needed, long already_allocated)

+{

+  return max_bytes_needed;

+}

+

+

+/*

+ * Backing store (temporary file) management.

+ * Since jpeg_mem_available always promised the moon,

+ * this should never be called and we can just error out.

+ */

+

+GLOBAL(void)

+jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,

+			 long total_bytes_needed)

+{

+  ERREXIT(cinfo, JERR_NO_BACKING_STORE);

+}

+

+

+/*

+ * These routines take care of any system-dependent initialization and

+ * cleanup required.  Here, there isn't any.

+ */

+

+GLOBAL(long)

+jpeg_mem_init (j_common_ptr cinfo)

+{

+  return 0;			/* just set max_memory_to_use to 0 */

+}

+

+GLOBAL(void)

+jpeg_mem_term (j_common_ptr cinfo)

+{

+  /* no work */

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jutils.c b/core/src/fxcodec/libjpeg/fpdfapi_jutils.c
new file mode 100644
index 0000000..251fd50
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jutils.c
@@ -0,0 +1,182 @@
+#if !defined(_FX_JPEG_TURBO_)

+/*

+ * jutils.c

+ *

+ * Copyright (C) 1991-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains tables and miscellaneous utility routines needed

+ * for both compression and decompression.

+ * Note we prefix all global names with "j" to minimize conflicts with

+ * a surrounding application.

+ */

+

+#define JPEG_INTERNALS

+#include "jinclude.h"

+#include "jpeglib.h"

+

+

+/*

+ * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element

+ * of a DCT block read in natural order (left to right, top to bottom).

+ */

+

+#if 0				/* This table is not actually needed in v6a */

+

+const int jpeg_zigzag_order[DCTSIZE2] = {

+   0,  1,  5,  6, 14, 15, 27, 28,

+   2,  4,  7, 13, 16, 26, 29, 42,

+   3,  8, 12, 17, 25, 30, 41, 43,

+   9, 11, 18, 24, 31, 40, 44, 53,

+  10, 19, 23, 32, 39, 45, 52, 54,

+  20, 22, 33, 38, 46, 51, 55, 60,

+  21, 34, 37, 47, 50, 56, 59, 61,

+  35, 36, 48, 49, 57, 58, 62, 63

+};

+

+#endif

+

+/*

+ * jpeg_natural_order[i] is the natural-order position of the i'th element

+ * of zigzag order.

+ *

+ * When reading corrupted data, the Huffman decoders could attempt

+ * to reference an entry beyond the end of this array (if the decoded

+ * zero run length reaches past the end of the block).  To prevent

+ * wild stores without adding an inner-loop test, we put some extra

+ * "63"s after the real entries.  This will cause the extra coefficient

+ * to be stored in location 63 of the block, not somewhere random.

+ * The worst case would be a run-length of 15, which means we need 16

+ * fake entries.

+ */

+

+const int jpeg_natural_order[DCTSIZE2+16] = {

+  0,  1,  8, 16,  9,  2,  3, 10,

+ 17, 24, 32, 25, 18, 11,  4,  5,

+ 12, 19, 26, 33, 40, 48, 41, 34,

+ 27, 20, 13,  6,  7, 14, 21, 28,

+ 35, 42, 49, 56, 57, 50, 43, 36,

+ 29, 22, 15, 23, 30, 37, 44, 51,

+ 58, 59, 52, 45, 38, 31, 39, 46,

+ 53, 60, 61, 54, 47, 55, 62, 63,

+ 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */

+ 63, 63, 63, 63, 63, 63, 63, 63

+};

+

+

+/*

+ * Arithmetic utilities

+ */

+

+GLOBAL(long)

+jdiv_round_up (long a, long b)

+/* Compute a/b rounded up to next integer, ie, ceil(a/b) */

+/* Assumes a >= 0, b > 0 */

+{

+  return (a + b - 1L) / b;

+}

+

+

+GLOBAL(long)

+jround_up (long a, long b)

+/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */

+/* Assumes a >= 0, b > 0 */

+{

+  a += b - 1L;

+  return a - (a % b);

+}

+

+

+/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays

+ * and coefficient-block arrays.  This won't work on 80x86 because the arrays

+ * are FAR and we're assuming a small-pointer memory model.  However, some

+ * DOS compilers provide far-pointer versions of memcpy() and memset() even

+ * in the small-model libraries.  These will be used if USE_FMEM is defined.

+ * Otherwise, the routines below do it the hard way.  (The performance cost

+ * is not all that great, because these routines aren't very heavily used.)

+ */

+

+#ifndef NEED_FAR_POINTERS	/* normal case, same as regular macros */

+#define FMEMCOPY(dest,src,size)	MEMCOPY(dest,src,size)

+#define FMEMZERO(target,size)	MEMZERO(target,size)

+#else				/* 80x86 case, define if we can */

+#ifdef USE_FMEM

+#define FMEMCOPY(dest,src,size)	_fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))

+#define FMEMZERO(target,size)	_fmemset((void FAR *)(target), 0, (size_t)(size))

+#endif

+#endif

+

+

+GLOBAL(void)

+jcopy_sample_rows (JSAMPARRAY input_array, int source_row,

+		   JSAMPARRAY output_array, int dest_row,

+		   int num_rows, JDIMENSION num_cols)

+/* Copy some rows of samples from one place to another.

+ * num_rows rows are copied from input_array[source_row++]

+ * to output_array[dest_row++]; these areas may overlap for duplication.

+ * The source and destination arrays must be at least as wide as num_cols.

+ */

+{

+  register JSAMPROW inptr, outptr;

+#ifdef FMEMCOPY

+  register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE));

+#else

+  register JDIMENSION count;

+#endif

+  register int row;

+

+  input_array += source_row;

+  output_array += dest_row;

+

+  for (row = num_rows; row > 0; row--) {

+    inptr = *input_array++;

+    outptr = *output_array++;

+#ifdef FMEMCOPY

+    FMEMCOPY(outptr, inptr, count);

+#else

+    for (count = num_cols; count > 0; count--)

+      *outptr++ = *inptr++;	/* needn't bother with GETJSAMPLE() here */

+#endif

+  }

+}

+

+

+GLOBAL(void)

+jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,

+		 JDIMENSION num_blocks)

+/* Copy a row of coefficient blocks from one place to another. */

+{

+#ifdef FMEMCOPY

+  FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));

+#else

+  register JCOEFPTR inptr, outptr;

+  register long count;

+

+  inptr = (JCOEFPTR) input_row;

+  outptr = (JCOEFPTR) output_row;

+  for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) {

+    *outptr++ = *inptr++;

+  }

+#endif

+}

+

+

+GLOBAL(void)

+jzero_far (void FAR * target, size_t bytestozero)

+/* Zero out a chunk of FAR memory. */

+/* This might be sample-array data, block-array data, or alloc_large data. */

+{

+#ifdef FMEMZERO

+  FMEMZERO(target, bytestozero);

+#else

+  register char FAR * ptr = (char FAR *) target;

+  register size_t count;

+

+  for (count = bytestozero; count > 0; count--) {

+    *ptr++ = 0;

+  }

+#endif

+}

+

+#endif //_FX_JPEG_TURBO_

diff --git a/core/src/fxcodec/libjpeg/jchuff.h b/core/src/fxcodec/libjpeg/jchuff.h
new file mode 100644
index 0000000..8c02c09
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jchuff.h
@@ -0,0 +1,47 @@
+/*

+ * jchuff.h

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains declarations for Huffman entropy encoding routines

+ * that are shared between the sequential encoder (jchuff.c) and the

+ * progressive encoder (jcphuff.c).  No other modules need to see these.

+ */

+

+/* The legal range of a DCT coefficient is

+ *  -1024 .. +1023  for 8-bit data;

+ * -16384 .. +16383 for 12-bit data.

+ * Hence the magnitude should always fit in 10 or 14 bits respectively.

+ */

+

+#if BITS_IN_JSAMPLE == 8

+#define MAX_COEF_BITS 10

+#else

+#define MAX_COEF_BITS 14

+#endif

+

+/* Derived data constructed for each Huffman table */

+

+typedef struct {

+  unsigned int ehufco[256];	/* code for each symbol */

+  char ehufsi[256];		/* length of code for each symbol */

+  /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */

+} c_derived_tbl;

+

+/* Short forms of external names for systems with brain-damaged linkers. */

+

+#ifdef NEED_SHORT_EXTERNAL_NAMES

+#define jpeg_make_c_derived_tbl	jMkCDerived

+#define jpeg_gen_optimal_table	jGenOptTbl

+#endif /* NEED_SHORT_EXTERNAL_NAMES */

+

+/* Expand a Huffman table definition into the derived format */

+EXTERN(void) jpeg_make_c_derived_tbl

+	JPP((j_compress_ptr cinfo, boolean isDC, int tblno,

+	     c_derived_tbl ** pdtbl));

+

+/* Generate an optimal table definition given the specified counts */

+EXTERN(void) jpeg_gen_optimal_table

+	JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]));

diff --git a/core/src/fxcodec/libjpeg/jconfig.h b/core/src/fxcodec/libjpeg/jconfig.h
new file mode 100644
index 0000000..2f4da14
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jconfig.h
@@ -0,0 +1,45 @@
+/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */

+/* see jconfig.doc for explanations */

+

+#define HAVE_PROTOTYPES

+#define HAVE_UNSIGNED_CHAR

+#define HAVE_UNSIGNED_SHORT

+/* #define void char */

+/* #define const */

+#undef CHAR_IS_UNSIGNED

+#define HAVE_STDDEF_H

+#define HAVE_STDLIB_H

+#undef NEED_BSD_STRINGS

+#undef NEED_SYS_TYPES_H

+#undef NEED_FAR_POINTERS	/* we presume a 32-bit flat memory model */

+#undef NEED_SHORT_EXTERNAL_NAMES

+#undef INCOMPLETE_TYPES_BROKEN

+

+/* Define "boolean" as unsigned char, not int, per Windows custom */

+#ifndef __RPCNDR_H__		/* don't conflict if rpcndr.h already read */

+typedef unsigned char boolean;

+#endif

+#define HAVE_BOOLEAN		/* prevent jmorecfg.h from redefining it */

+

+

+#ifdef JPEG_INTERNALS

+

+#undef RIGHT_SHIFT_IS_UNSIGNED

+

+#endif /* JPEG_INTERNALS */

+

+#ifdef JPEG_CJPEG_DJPEG

+

+#define BMP_SUPPORTED		/* BMP image file format */

+#define GIF_SUPPORTED		/* GIF image file format */

+#define PPM_SUPPORTED		/* PBMPLUS PPM/PGM image file format */

+#undef RLE_SUPPORTED		/* Utah RLE image file format */

+#define TARGA_SUPPORTED		/* Targa image file format */

+

+#define TWO_FILE_COMMANDLINE	/* optional */

+#define USE_SETMODE		/* Microsoft has setmode() */

+#undef NEED_SIGNAL_CATCHER

+#undef DONT_USE_B_MODE

+#undef PROGRESS_REPORT		/* optional */

+

+#endif /* JPEG_CJPEG_DJPEG */

diff --git a/core/src/fxcodec/libjpeg/jdct.h b/core/src/fxcodec/libjpeg/jdct.h
new file mode 100644
index 0000000..b664cab
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jdct.h
@@ -0,0 +1,176 @@
+/*

+ * jdct.h

+ *

+ * Copyright (C) 1994-1996, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This include file contains common declarations for the forward and

+ * inverse DCT modules.  These declarations are private to the DCT managers

+ * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms.

+ * The individual DCT algorithms are kept in separate files to ease 

+ * machine-dependent tuning (e.g., assembly coding).

+ */

+

+

+/*

+ * A forward DCT routine is given a pointer to a work area of type DCTELEM[];

+ * the DCT is to be performed in-place in that buffer.  Type DCTELEM is int

+ * for 8-bit samples, INT32 for 12-bit samples.  (NOTE: Floating-point DCT

+ * implementations use an array of type FAST_FLOAT, instead.)

+ * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE).

+ * The DCT outputs are returned scaled up by a factor of 8; they therefore

+ * have a range of +-8K for 8-bit data, +-128K for 12-bit data.  This

+ * convention improves accuracy in integer implementations and saves some

+ * work in floating-point ones.

+ * Quantization of the output coefficients is done by jcdctmgr.c.

+ */

+

+#if BITS_IN_JSAMPLE == 8

+typedef int DCTELEM;		/* 16 or 32 bits is fine */

+#else

+typedef INT32 DCTELEM;		/* must have 32 bits */

+#endif

+

+typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data));

+typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data));

+

+

+/*

+ * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer

+ * to an output sample array.  The routine must dequantize the input data as

+ * well as perform the IDCT; for dequantization, it uses the multiplier table

+ * pointed to by compptr->dct_table.  The output data is to be placed into the

+ * sample array starting at a specified column.  (Any row offset needed will

+ * be applied to the array pointer before it is passed to the IDCT code.)

+ * Note that the number of samples emitted by the IDCT routine is

+ * DCT_scaled_size * DCT_scaled_size.

+ */

+

+/* typedef inverse_DCT_method_ptr is declared in jpegint.h */

+

+/*

+ * Each IDCT routine has its own ideas about the best dct_table element type.

+ */

+

+typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */

+#if BITS_IN_JSAMPLE == 8

+typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */

+#define IFAST_SCALE_BITS  2	/* fractional bits in scale factors */

+#else

+typedef INT32 IFAST_MULT_TYPE;	/* need 32 bits for scaled quantizers */

+#define IFAST_SCALE_BITS  13	/* fractional bits in scale factors */

+#endif

+typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */

+

+

+/*

+ * Each IDCT routine is responsible for range-limiting its results and

+ * converting them to unsigned form (0..MAXJSAMPLE).  The raw outputs could

+ * be quite far out of range if the input data is corrupt, so a bulletproof

+ * range-limiting step is required.  We use a mask-and-table-lookup method

+ * to do the combined operations quickly.  See the comments with

+ * prepare_range_limit_table (in jdmaster.c) for more info.

+ */

+

+#define IDCT_range_limit(cinfo)  ((cinfo)->sample_range_limit + CENTERJSAMPLE)

+

+#define RANGE_MASK  (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */

+

+

+/* Short forms of external names for systems with brain-damaged linkers. */

+

+#ifdef NEED_SHORT_EXTERNAL_NAMES

+#define jpeg_fdct_islow		jFDislow

+#define jpeg_fdct_ifast		jFDifast

+#define jpeg_fdct_float		jFDfloat

+#define jpeg_idct_islow		jRDislow

+#define jpeg_idct_ifast		jRDifast

+#define jpeg_idct_float		jRDfloat

+#define jpeg_idct_4x4		jRD4x4

+#define jpeg_idct_2x2		jRD2x2

+#define jpeg_idct_1x1		jRD1x1

+#endif /* NEED_SHORT_EXTERNAL_NAMES */

+

+/* Extern declarations for the forward and inverse DCT routines. */

+

+EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data));

+EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data));

+EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data));

+

+EXTERN(void) jpeg_idct_islow

+    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	 JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));

+EXTERN(void) jpeg_idct_ifast

+    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	 JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));

+EXTERN(void) jpeg_idct_float

+    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	 JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));

+EXTERN(void) jpeg_idct_4x4

+    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	 JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));

+EXTERN(void) jpeg_idct_2x2

+    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	 JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));

+EXTERN(void) jpeg_idct_1x1

+    JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,

+	 JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));

+

+

+/*

+ * Macros for handling fixed-point arithmetic; these are used by many

+ * but not all of the DCT/IDCT modules.

+ *

+ * All values are expected to be of type INT32.

+ * Fractional constants are scaled left by CONST_BITS bits.

+ * CONST_BITS is defined within each module using these macros,

+ * and may differ from one module to the next.

+ */

+

+#define ONE	((INT32) 1)

+#define CONST_SCALE (ONE << CONST_BITS)

+

+/* Convert a positive real constant to an integer scaled by CONST_SCALE.

+ * Caution: some C compilers fail to reduce "FIX(constant)" at compile time,

+ * thus causing a lot of useless floating-point operations at run time.

+ */

+

+#define FIX(x)	((INT32) ((x) * CONST_SCALE + 0.5))

+

+/* Descale and correctly round an INT32 value that's scaled by N bits.

+ * We assume RIGHT_SHIFT rounds towards minus infinity, so adding

+ * the fudge factor is correct for either sign of X.

+ */

+

+#define DESCALE(x,n)  RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)

+

+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.

+ * This macro is used only when the two inputs will actually be no more than

+ * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a

+ * full 32x32 multiply.  This provides a useful speedup on many machines.

+ * Unfortunately there is no way to specify a 16x16->32 multiply portably

+ * in C, but some C compilers will do the right thing if you provide the

+ * correct combination of casts.

+ */

+

+#ifdef SHORTxSHORT_32		/* may work if 'int' is 32 bits */

+#define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT16) (const)))

+#endif

+#ifdef SHORTxLCONST_32		/* known to work with Microsoft C 6.0 */

+#define MULTIPLY16C16(var,const)  (((INT16) (var)) * ((INT32) (const)))

+#endif

+

+#ifndef MULTIPLY16C16		/* default definition */

+#define MULTIPLY16C16(var,const)  ((var) * (const))

+#endif

+

+/* Same except both inputs are variables. */

+

+#ifdef SHORTxSHORT_32		/* may work if 'int' is 32 bits */

+#define MULTIPLY16V16(var1,var2)  (((INT16) (var1)) * ((INT16) (var2)))

+#endif

+

+#ifndef MULTIPLY16V16		/* default definition */

+#define MULTIPLY16V16(var1,var2)  ((var1) * (var2))

+#endif

diff --git a/core/src/fxcodec/libjpeg/jdhuff.h b/core/src/fxcodec/libjpeg/jdhuff.h
new file mode 100644
index 0000000..12c0747
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jdhuff.h
@@ -0,0 +1,201 @@
+/*

+ * jdhuff.h

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains declarations for Huffman entropy decoding routines

+ * that are shared between the sequential decoder (jdhuff.c) and the

+ * progressive decoder (jdphuff.c).  No other modules need to see these.

+ */

+

+/* Short forms of external names for systems with brain-damaged linkers. */

+

+#ifdef NEED_SHORT_EXTERNAL_NAMES

+#define jpeg_make_d_derived_tbl	jMkDDerived

+#define jpeg_fill_bit_buffer	jFilBitBuf

+#define jpeg_huff_decode	jHufDecode

+#endif /* NEED_SHORT_EXTERNAL_NAMES */

+

+

+/* Derived data constructed for each Huffman table */

+

+#define HUFF_LOOKAHEAD	8	/* # of bits of lookahead */

+

+typedef struct {

+  /* Basic tables: (element [0] of each array is unused) */

+  INT32 maxcode[18];		/* largest code of length k (-1 if none) */

+  /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */

+  INT32 valoffset[17];		/* huffval[] offset for codes of length k */

+  /* valoffset[k] = huffval[] index of 1st symbol of code length k, less

+   * the smallest code of length k; so given a code of length k, the

+   * corresponding symbol is huffval[code + valoffset[k]]

+   */

+

+  /* Link to public Huffman table (needed only in jpeg_huff_decode) */

+  JHUFF_TBL *pub;

+

+  /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of

+   * the input data stream.  If the next Huffman code is no more

+   * than HUFF_LOOKAHEAD bits long, we can obtain its length and

+   * the corresponding symbol directly from these tables.

+   */

+  int look_nbits[1<<HUFF_LOOKAHEAD]; /* # bits, or 0 if too long */

+  UINT8 look_sym[1<<HUFF_LOOKAHEAD]; /* symbol, or unused */

+} d_derived_tbl;

+

+/* Expand a Huffman table definition into the derived format */

+EXTERN(void) jpeg_make_d_derived_tbl

+	JPP((j_decompress_ptr cinfo, boolean isDC, int tblno,

+	     d_derived_tbl ** pdtbl));

+

+

+/*

+ * Fetching the next N bits from the input stream is a time-critical operation

+ * for the Huffman decoders.  We implement it with a combination of inline

+ * macros and out-of-line subroutines.  Note that N (the number of bits

+ * demanded at one time) never exceeds 15 for JPEG use.

+ *

+ * We read source bytes into get_buffer and dole out bits as needed.

+ * If get_buffer already contains enough bits, they are fetched in-line

+ * by the macros CHECK_BIT_BUFFER and GET_BITS.  When there aren't enough

+ * bits, jpeg_fill_bit_buffer is called; it will attempt to fill get_buffer

+ * as full as possible (not just to the number of bits needed; this

+ * prefetching reduces the overhead cost of calling jpeg_fill_bit_buffer).

+ * Note that jpeg_fill_bit_buffer may return FALSE to indicate suspension.

+ * On TRUE return, jpeg_fill_bit_buffer guarantees that get_buffer contains

+ * at least the requested number of bits --- dummy zeroes are inserted if

+ * necessary.

+ */

+

+typedef INT32 bit_buf_type;	/* type of bit-extraction buffer */

+#define BIT_BUF_SIZE  32	/* size of buffer in bits */

+

+/* If long is > 32 bits on your machine, and shifting/masking longs is

+ * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE

+ * appropriately should be a win.  Unfortunately we can't define the size

+ * with something like  #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8)

+ * because not all machines measure sizeof in 8-bit bytes.

+ */

+

+typedef struct {		/* Bitreading state saved across MCUs */

+  bit_buf_type get_buffer;	/* current bit-extraction buffer */

+  int bits_left;		/* # of unused bits in it */

+} bitread_perm_state;

+

+typedef struct {		/* Bitreading working state within an MCU */

+  /* Current data source location */

+  /* We need a copy, rather than munging the original, in case of suspension */

+  const JOCTET * next_input_byte; /* => next byte to read from source */

+  size_t bytes_in_buffer;	/* # of bytes remaining in source buffer */

+  /* Bit input buffer --- note these values are kept in register variables,

+   * not in this struct, inside the inner loops.

+   */

+  bit_buf_type get_buffer;	/* current bit-extraction buffer */

+  int bits_left;		/* # of unused bits in it */

+  /* Pointer needed by jpeg_fill_bit_buffer. */

+  j_decompress_ptr cinfo;	/* back link to decompress master record */

+} bitread_working_state;

+

+/* Macros to declare and load/save bitread local variables. */

+#define BITREAD_STATE_VARS  \

+	register bit_buf_type get_buffer;  \

+	register int bits_left;  \

+	bitread_working_state br_state

+

+#define BITREAD_LOAD_STATE(cinfop,permstate)  \

+	br_state.cinfo = cinfop; \

+	br_state.next_input_byte = cinfop->src->next_input_byte; \

+	br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \

+	get_buffer = permstate.get_buffer; \

+	bits_left = permstate.bits_left;

+

+#define BITREAD_SAVE_STATE(cinfop,permstate)  \

+	cinfop->src->next_input_byte = br_state.next_input_byte; \

+	cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \

+	permstate.get_buffer = get_buffer; \

+	permstate.bits_left = bits_left

+

+/*

+ * These macros provide the in-line portion of bit fetching.

+ * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer

+ * before using GET_BITS, PEEK_BITS, or DROP_BITS.

+ * The variables get_buffer and bits_left are assumed to be locals,

+ * but the state struct might not be (jpeg_huff_decode needs this).

+ *	CHECK_BIT_BUFFER(state,n,action);

+ *		Ensure there are N bits in get_buffer; if suspend, take action.

+ *      val = GET_BITS(n);

+ *		Fetch next N bits.

+ *      val = PEEK_BITS(n);

+ *		Fetch next N bits without removing them from the buffer.

+ *	DROP_BITS(n);

+ *		Discard next N bits.

+ * The value N should be a simple variable, not an expression, because it

+ * is evaluated multiple times.

+ */

+

+#define CHECK_BIT_BUFFER(state,nbits,action) \

+	{ if (bits_left < (nbits)) {  \

+	    if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits))  \

+	      { action; }  \

+	    get_buffer = (state).get_buffer; bits_left = (state).bits_left; } }

+

+#define GET_BITS(nbits) \

+	(((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1))

+

+#define PEEK_BITS(nbits) \

+	(((int) (get_buffer >> (bits_left -  (nbits)))) & ((1<<(nbits))-1))

+

+#define DROP_BITS(nbits) \

+	(bits_left -= (nbits))

+

+/* Load up the bit buffer to a depth of at least nbits */

+EXTERN(boolean) jpeg_fill_bit_buffer

+	JPP((bitread_working_state * state, register bit_buf_type get_buffer,

+	     register int bits_left, int nbits));

+

+

+/*

+ * Code for extracting next Huffman-coded symbol from input bit stream.

+ * Again, this is time-critical and we make the main paths be macros.

+ *

+ * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits

+ * without looping.  Usually, more than 95% of the Huffman codes will be 8

+ * or fewer bits long.  The few overlength codes are handled with a loop,

+ * which need not be inline code.

+ *

+ * Notes about the HUFF_DECODE macro:

+ * 1. Near the end of the data segment, we may fail to get enough bits

+ *    for a lookahead.  In that case, we do it the hard way.

+ * 2. If the lookahead table contains no entry, the next code must be

+ *    more than HUFF_LOOKAHEAD bits long.

+ * 3. jpeg_huff_decode returns -1 if forced to suspend.

+ */

+

+#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \

+{ register int nb, look; \

+  if (bits_left < HUFF_LOOKAHEAD) { \

+    if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \

+    get_buffer = state.get_buffer; bits_left = state.bits_left; \

+    if (bits_left < HUFF_LOOKAHEAD) { \

+      nb = 1; goto slowlabel; \

+    } \

+  } \

+  look = PEEK_BITS(HUFF_LOOKAHEAD); \

+  if ((nb = htbl->look_nbits[look]) != 0) { \

+    DROP_BITS(nb); \

+    result = htbl->look_sym[look]; \

+  } else { \

+    nb = HUFF_LOOKAHEAD+1; \

+slowlabel: \

+    if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \

+	{ failaction; } \

+    get_buffer = state.get_buffer; bits_left = state.bits_left; \

+  } \

+}

+

+/* Out-of-line case for Huffman code fetching */

+EXTERN(int) jpeg_huff_decode

+	JPP((bitread_working_state * state, register bit_buf_type get_buffer,

+	     register int bits_left, d_derived_tbl * htbl, int min_bits));

diff --git a/core/src/fxcodec/libjpeg/jerror.h b/core/src/fxcodec/libjpeg/jerror.h
new file mode 100644
index 0000000..a2b8f96
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jerror.h
@@ -0,0 +1,291 @@
+/*

+ * jerror.h

+ *

+ * Copyright (C) 1994-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file defines the error and message codes for the JPEG library.

+ * Edit this file to add new codes, or to translate the message strings to

+ * some other language.

+ * A set of error-reporting macros are defined too.  Some applications using

+ * the JPEG library may wish to include this file to get the error codes

+ * and/or the macros.

+ */

+

+/*

+ * To define the enum list of message codes, include this file without

+ * defining macro JMESSAGE.  To create a message string table, include it

+ * again with a suitable JMESSAGE definition (see jerror.c for an example).

+ */

+#ifndef JMESSAGE

+#ifndef JERROR_H

+/* First time through, define the enum list */

+#define JMAKE_ENUM_LIST

+#else

+/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */

+#define JMESSAGE(code,string)

+#endif /* JERROR_H */

+#endif /* JMESSAGE */

+

+#ifdef JMAKE_ENUM_LIST

+

+typedef enum {

+

+#define JMESSAGE(code,string)	code ,

+

+#endif /* JMAKE_ENUM_LIST */

+

+JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */

+

+/* For maintenance convenience, list is alphabetical by message code name */

+JMESSAGE(JERR_ARITH_NOTIMPL,

+	 "Sorry, there are legal restrictions on arithmetic coding")

+JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix")

+JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")

+JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode")

+JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS")

+JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range")

+JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported")

+JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition")

+JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace")

+JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace")

+JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length")

+JMESSAGE(JERR_BAD_LIB_VERSION,

+	 "Wrong JPEG library version: library is %d, caller expects %d")

+JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan")

+JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d")

+JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d")

+JMESSAGE(JERR_BAD_PROGRESSION,

+	 "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d")

+JMESSAGE(JERR_BAD_PROG_SCRIPT,

+	 "Invalid progressive parameters at scan script entry %d")

+JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors")

+JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d")

+JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d")

+JMESSAGE(JERR_BAD_STRUCT_SIZE,

+	 "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u")

+JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access")

+JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small")

+JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here")

+JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet")

+JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d")

+JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request")

+JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d")

+JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x")

+JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d")

+JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d")

+JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)")

+JMESSAGE(JERR_EMS_READ, "Read from EMS failed")

+JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed")

+JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan")

+JMESSAGE(JERR_FILE_READ, "Input file read error")

+JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")

+JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")

+JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow")

+JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")

+JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")

+JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")

+JMESSAGE(JERR_INPUT_EOF, "Premature end of input file")

+JMESSAGE(JERR_MISMATCHED_QUANT_TABLE,

+	 "Cannot transcode due to multiple use of quantization table %d")

+JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")

+JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")

+JMESSAGE(JERR_NOTIMPL, "Not implemented yet")

+JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")

+JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")

+JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")

+JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")

+JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined")

+JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x")

+JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)")

+JMESSAGE(JERR_QUANT_COMPONENTS,

+	 "Cannot quantize more than %d color components")

+JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")

+JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")

+JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")

+JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")

+JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")

+JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")

+JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF")

+JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")

+JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")

+JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")

+JMESSAGE(JERR_TFILE_WRITE,

+	 "Write failed on temporary file --- out of disk space?")

+JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines")

+JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x")

+JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up")

+JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation")

+JMESSAGE(JERR_XMS_READ, "Read from XMS failed")

+JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed")

+JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT)

+JMESSAGE(JMSG_VERSION, JVERSION)

+JMESSAGE(JTRC_16BIT_TABLES,

+	 "Caution: quantization tables are too coarse for baseline JPEG")

+JMESSAGE(JTRC_ADOBE,

+	 "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d")

+JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u")

+JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u")

+JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x")

+JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x")

+JMESSAGE(JTRC_DQT, "Define Quantization Table %d  precision %d")

+JMESSAGE(JTRC_DRI, "Define Restart Interval %u")

+JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u")

+JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u")

+JMESSAGE(JTRC_EOI, "End Of Image")

+JMESSAGE(JTRC_HUFFBITS, "        %3d %3d %3d %3d %3d %3d %3d %3d")

+JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d  %d")

+JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE,

+	 "Warning: thumbnail image size does not match data length %u")

+JMESSAGE(JTRC_JFIF_EXTENSION,

+	 "JFIF extension marker: type 0x%02x, length %u")

+JMESSAGE(JTRC_JFIF_THUMBNAIL, "    with %d x %d thumbnail image")

+JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u")

+JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x")

+JMESSAGE(JTRC_QUANTVALS, "        %4u %4u %4u %4u %4u %4u %4u %4u")

+JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors")

+JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors")

+JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization")

+JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d")

+JMESSAGE(JTRC_RST, "RST%d")

+JMESSAGE(JTRC_SMOOTH_NOTIMPL,

+	 "Smoothing not supported with nonstandard sampling ratios")

+JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d")

+JMESSAGE(JTRC_SOF_COMPONENT, "    Component %d: %dhx%dv q=%d")

+JMESSAGE(JTRC_SOI, "Start of Image")

+JMESSAGE(JTRC_SOS, "Start Of Scan: %d components")

+JMESSAGE(JTRC_SOS_COMPONENT, "    Component %d: dc=%d ac=%d")

+JMESSAGE(JTRC_SOS_PARAMS, "  Ss=%d, Se=%d, Ah=%d, Al=%d")

+JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s")

+JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s")

+JMESSAGE(JTRC_THUMB_JPEG,

+	 "JFIF extension marker: JPEG-compressed thumbnail image, length %u")

+JMESSAGE(JTRC_THUMB_PALETTE,

+	 "JFIF extension marker: palette thumbnail image, length %u")

+JMESSAGE(JTRC_THUMB_RGB,

+	 "JFIF extension marker: RGB thumbnail image, length %u")

+JMESSAGE(JTRC_UNKNOWN_IDS,

+	 "Unrecognized component IDs %d %d %d, assuming YCbCr")

+JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")

+JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")

+JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d")

+JMESSAGE(JWRN_BOGUS_PROGRESSION,

+	 "Inconsistent progression sequence for component %d coefficient %d")

+JMESSAGE(JWRN_EXTRANEOUS_DATA,

+	 "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x")

+JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment")

+JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code")

+JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d")

+JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file")

+JMESSAGE(JWRN_MUST_RESYNC,

+	 "Corrupt JPEG data: found marker 0x%02x instead of RST%d")

+JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG")

+JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines")

+

+#ifdef JMAKE_ENUM_LIST

+

+  JMSG_LASTMSGCODE

+} J_MESSAGE_CODE;

+

+#undef JMAKE_ENUM_LIST

+#endif /* JMAKE_ENUM_LIST */

+

+/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */

+#undef JMESSAGE

+

+

+#ifndef JERROR_H

+#define JERROR_H

+

+/* Macros to simplify using the error and trace message stuff */

+/* The first parameter is either type of cinfo pointer */

+

+/* Fatal errors (print message and exit) */

+#define ERREXIT(cinfo,code)  \

+  ((cinfo)->err->msg_code = (code), \

+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

+#define ERREXIT1(cinfo,code,p1)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

+#define ERREXIT2(cinfo,code,p1,p2)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (cinfo)->err->msg_parm.i[1] = (p2), \

+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

+#define ERREXIT3(cinfo,code,p1,p2,p3)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (cinfo)->err->msg_parm.i[1] = (p2), \

+   (cinfo)->err->msg_parm.i[2] = (p3), \

+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

+#define ERREXIT4(cinfo,code,p1,p2,p3,p4)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (cinfo)->err->msg_parm.i[1] = (p2), \

+   (cinfo)->err->msg_parm.i[2] = (p3), \

+   (cinfo)->err->msg_parm.i[3] = (p4), \

+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

+#define ERREXITS(cinfo,code,str)  \

+  ((cinfo)->err->msg_code = (code), \

+   FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \

+   (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))

+

+#define MAKESTMT(stuff)		do { stuff } while (0)

+

+/* Nonfatal errors (we can keep going, but the data is probably corrupt) */

+#define WARNMS(cinfo,code)  \

+  ((cinfo)->err->msg_code = (code), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))

+#define WARNMS1(cinfo,code,p1)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))

+#define WARNMS2(cinfo,code,p1,p2)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (cinfo)->err->msg_parm.i[1] = (p2), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))

+

+/* Informational/debugging messages */

+#define TRACEMS(cinfo,lvl,code)  \

+  ((cinfo)->err->msg_code = (code), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))

+#define TRACEMS1(cinfo,lvl,code,p1)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))

+#define TRACEMS2(cinfo,lvl,code,p1,p2)  \

+  ((cinfo)->err->msg_code = (code), \

+   (cinfo)->err->msg_parm.i[0] = (p1), \

+   (cinfo)->err->msg_parm.i[1] = (p2), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))

+#define TRACEMS3(cinfo,lvl,code,p1,p2,p3)  \

+  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \

+	   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \

+	   (cinfo)->err->msg_code = (code); \

+	   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )

+#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4)  \

+  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \

+	   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \

+	   (cinfo)->err->msg_code = (code); \

+	   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )

+#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5)  \

+  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \

+	   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \

+	   _mp[4] = (p5); \

+	   (cinfo)->err->msg_code = (code); \

+	   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )

+#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8)  \

+  MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \

+	   _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \

+	   _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \

+	   (cinfo)->err->msg_code = (code); \

+	   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )

+#define TRACEMSS(cinfo,lvl,code,str)  \

+  ((cinfo)->err->msg_code = (code), \

+   FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \

+   (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))

+

+#endif /* JERROR_H */

diff --git a/core/src/fxcodec/libjpeg/jinclude.h b/core/src/fxcodec/libjpeg/jinclude.h
new file mode 100644
index 0000000..070188a
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jinclude.h
@@ -0,0 +1,102 @@
+/*

+ * jinclude.h

+ *

+ * Copyright (C) 1991-1994, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file exists to provide a single place to fix any problems with

+ * including the wrong system include files.  (Common problems are taken

+ * care of by the standard jconfig symbols, but on really weird systems

+ * you may have to edit this file.)

+ *

+ * NOTE: this file is NOT intended to be included by applications using the

+ * JPEG library.  Most applications need only include jpeglib.h.

+ */

+

+

+/* Include auto-config file to find out which system include files we need. */

+

+#include "jconfig.h"		/* auto configuration options */

+#define JCONFIG_INCLUDED	/* so that jpeglib.h doesn't do it again */

+

+#include "../../../include/fxcrt/fx_system.h"

+/*

+ * We need the NULL macro and size_t typedef.

+ * On an ANSI-conforming system it is sufficient to include <stddef.h>.

+ * Otherwise, we get them from <stdlib.h> or <stdio.h>; we may have to

+ * pull in <sys/types.h> as well.

+ * Note that the core JPEG library does not require <stdio.h>;

+ * only the default error handler and data source/destination modules do.

+ * But we must pull it in because of the references to FILE in jpeglib.h.

+ * You can remove those references if you want to compile without <stdio.h>.

+ */

+

+#ifdef _DEBUG

+#define CRTDBG_MAP_ALLOC

+//#include <stdlib.h>

+//#include <crtdbg.h>

+#endif

+

+#ifdef HAVE_STDDEF_H

+#include <stddef.h>

+#endif

+

+#ifdef HAVE_STDLIB_H

+//#include <stdlib.h>

+#endif

+

+#ifdef NEED_SYS_TYPES_H

+#include <sys/types.h>

+#endif

+

+#ifndef FAR

+#define FAR

+#endif

+

+//#include <stdio.h>

+

+/*

+ * We need memory copying and zeroing functions, plus strncpy().

+ * ANSI and System V implementations declare these in <string.h>.

+ * BSD doesn't have the mem() functions, but it does have bcopy()/bzero().

+ * Some systems may declare memset and memcpy in <memory.h>.

+ *

+ * NOTE: we assume the size parameters to these functions are of type size_t.

+ * Change the casts in these macros if not!

+ */

+

+#ifdef NEED_BSD_STRINGS

+

+//#include <strings.h>

+#define MEMZERO(target,size)	bzero((void *)(target), (size_t)(size))

+#define MEMCOPY(dest,src,size)	bcopy((const void *)(src), (void *)(dest), (size_t)(size))

+

+#else /* not BSD, assume ANSI/SysV string lib */

+

+//#include <string.h>

+#define MEMZERO(target,size)	FXSYS_memset32((void *)(target), 0, (size_t)(size))

+#define MEMCOPY(dest,src,size)	FXSYS_memcpy32((void *)(dest), (const void *)(src), (size_t)(size))

+

+#endif

+

+/*

+ * In ANSI C, and indeed any rational implementation, size_t is also the

+ * type returned by sizeof().  However, it seems there are some irrational

+ * implementations out there, in which sizeof() returns an int even though

+ * size_t is defined as long or unsigned long.  To ensure consistent results

+ * we always use this SIZEOF() macro in place of using sizeof() directly.

+ */

+

+#define SIZEOF(object)	((size_t) sizeof(object))

+

+/*

+ * The modules that use fread() and fwrite() always invoke them through

+ * these macros.  On some systems you may need to twiddle the argument casts.

+ * CAUTION: argument order is different from underlying functions!

+ */

+

+#define JFREAD(file,buf,sizeofbuf)  \

+  ((size_t) FXSYS_fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))

+#define JFWRITE(file,buf,sizeofbuf)  \

+  ((size_t) FXSYS_fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))

diff --git a/core/src/fxcodec/libjpeg/jmemsys.h b/core/src/fxcodec/libjpeg/jmemsys.h
new file mode 100644
index 0000000..baa7b7f
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jmemsys.h
@@ -0,0 +1,200 @@
+/*

+ * jmemsys.h

+ *

+ * Copyright (C) 1992-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This include file defines the interface between the system-independent

+ * and system-dependent portions of the JPEG memory manager.  No other

+ * modules need include it.  (The system-independent portion is jmemmgr.c;

+ * there are several different versions of the system-dependent portion.)

+ *

+ * This file works as-is for the system-dependent memory managers supplied

+ * in the IJG distribution.  You may need to modify it if you write a

+ * custom memory manager.  If system-dependent changes are needed in

+ * this file, the best method is to #ifdef them based on a configuration

+ * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR

+ * and USE_MAC_MEMMGR.

+ */

+

+

+/* Short forms of external names for systems with brain-damaged linkers. */

+

+#ifdef NEED_SHORT_EXTERNAL_NAMES

+#define jpeg_get_small		jGetSmall

+#define jpeg_free_small		jFreeSmall

+#define jpeg_get_large		jGetLarge

+#define jpeg_free_large		jFreeLarge

+#define jpeg_mem_available	jMemAvail

+#define jpeg_open_backing_store	jOpenBackStore

+#define jpeg_mem_init		jMemInit

+#define jpeg_mem_term		jMemTerm

+#endif /* NEED_SHORT_EXTERNAL_NAMES */

+

+

+/*

+ * These two functions are used to allocate and release small chunks of

+ * memory.  (Typically the total amount requested through jpeg_get_small is

+ * no more than 20K or so; this will be requested in chunks of a few K each.)

+ * Behavior should be the same as for the standard library functions malloc

+ * and free; in particular, jpeg_get_small must return NULL on failure.

+ * On most systems, these ARE malloc and free.  jpeg_free_small is passed the

+ * size of the object being freed, just in case it's needed.

+ * On an 80x86 machine using small-data memory model, these manage near heap.

+ */

+

+EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject));

+EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object,

+				  size_t sizeofobject));

+

+/*

+ * These two functions are used to allocate and release large chunks of

+ * memory (up to the total free space designated by jpeg_mem_available).

+ * The interface is the same as above, except that on an 80x86 machine,

+ * far pointers are used.  On most other machines these are identical to

+ * the jpeg_get/free_small routines; but we keep them separate anyway,

+ * in case a different allocation strategy is desirable for large chunks.

+ */

+

+EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo,

+				       size_t sizeofobject));

+EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object,

+				  size_t sizeofobject));

+

+/*

+ * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may

+ * be requested in a single call to jpeg_get_large (and jpeg_get_small for that

+ * matter, but that case should never come into play).  This macro is needed

+ * to model the 64Kb-segment-size limit of far addressing on 80x86 machines.

+ * On those machines, we expect that jconfig.h will provide a proper value.

+ * On machines with 32-bit flat address spaces, any large constant may be used.

+ *

+ * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type

+ * size_t and will be a multiple of sizeof(align_type).

+ */

+

+#ifndef MAX_ALLOC_CHUNK		/* may be overridden in jconfig.h */

+#define MAX_ALLOC_CHUNK  1000000000L

+#endif

+

+/*

+ * This routine computes the total space still available for allocation by

+ * jpeg_get_large.  If more space than this is needed, backing store will be

+ * used.  NOTE: any memory already allocated must not be counted.

+ *

+ * There is a minimum space requirement, corresponding to the minimum

+ * feasible buffer sizes; jmemmgr.c will request that much space even if

+ * jpeg_mem_available returns zero.  The maximum space needed, enough to hold

+ * all working storage in memory, is also passed in case it is useful.

+ * Finally, the total space already allocated is passed.  If no better

+ * method is available, cinfo->mem->max_memory_to_use - already_allocated

+ * is often a suitable calculation.

+ *

+ * It is OK for jpeg_mem_available to underestimate the space available

+ * (that'll just lead to more backing-store access than is really necessary).

+ * However, an overestimate will lead to failure.  Hence it's wise to subtract

+ * a slop factor from the true available space.  5% should be enough.

+ *

+ * On machines with lots of virtual memory, any large constant may be returned.

+ * Conversely, zero may be returned to always use the minimum amount of memory.

+ */

+

+EXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo,

+				     long min_bytes_needed,

+				     long max_bytes_needed,

+				     long already_allocated));

+

+

+/*

+ * This structure holds whatever state is needed to access a single

+ * backing-store object.  The read/write/close method pointers are called

+ * by jmemmgr.c to manipulate the backing-store object; all other fields

+ * are private to the system-dependent backing store routines.

+ */

+

+#define TEMP_NAME_LENGTH   64	/* max length of a temporary file's name */

+

+

+#ifdef USE_MSDOS_MEMMGR		/* DOS-specific junk */

+

+typedef unsigned short XMSH;	/* type of extended-memory handles */

+typedef unsigned short EMSH;	/* type of expanded-memory handles */

+

+typedef union {

+  short file_handle;		/* DOS file handle if it's a temp file */

+  XMSH xms_handle;		/* handle if it's a chunk of XMS */

+  EMSH ems_handle;		/* handle if it's a chunk of EMS */

+} handle_union;

+

+#endif /* USE_MSDOS_MEMMGR */

+

+#ifdef USE_MAC_MEMMGR		/* Mac-specific junk */

+#include <Files.h>

+#endif /* USE_MAC_MEMMGR */

+

+

+typedef struct backing_store_struct * backing_store_ptr;

+

+typedef struct backing_store_struct {

+  /* Methods for reading/writing/closing this backing-store object */

+  JMETHOD(void, read_backing_store, (j_common_ptr cinfo,

+				     backing_store_ptr info,

+				     void FAR * buffer_address,

+				     long file_offset, long byte_count));

+  JMETHOD(void, write_backing_store, (j_common_ptr cinfo,

+				      backing_store_ptr info,

+				      void FAR * buffer_address,

+				      long file_offset, long byte_count));

+  JMETHOD(void, close_backing_store, (j_common_ptr cinfo,

+				      backing_store_ptr info));

+

+  /* Private fields for system-dependent backing-store management */

+#ifdef USE_MSDOS_MEMMGR

+  /* For the MS-DOS manager (jmemdos.c), we need: */

+  handle_union handle;		/* reference to backing-store storage object */

+  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */

+#else

+#ifdef USE_MAC_MEMMGR

+  /* For the Mac manager (jmemmac.c), we need: */

+  short temp_file;		/* file reference number to temp file */

+  FSSpec tempSpec;		/* the FSSpec for the temp file */

+  char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */

+#else

+  /* For a typical implementation with temp files, we need: */

+#ifndef _FPDFAPI_MINI_

+  FXSYS_FILE * temp_file;		/* stdio reference to temp file */

+  char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */

+#endif

+#endif

+#endif

+} backing_store_info;

+

+

+/*

+ * Initial opening of a backing-store object.  This must fill in the

+ * read/write/close pointers in the object.  The read/write routines

+ * may take an error exit if the specified maximum file size is exceeded.

+ * (If jpeg_mem_available always returns a large value, this routine can

+ * just take an error exit.)

+ */

+

+EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo,

+					  backing_store_ptr info,

+					  long total_bytes_needed));

+

+

+/*

+ * These routines take care of any system-dependent initialization and

+ * cleanup required.  jpeg_mem_init will be called before anything is

+ * allocated (and, therefore, nothing in cinfo is of use except the error

+ * manager pointer).  It should return a suitable default value for

+ * max_memory_to_use; this may subsequently be overridden by the surrounding

+ * application.  (Note that max_memory_to_use is only important if

+ * jpeg_mem_available chooses to consult it ... no one else will.)

+ * jpeg_mem_term may assume that all requested memory has been freed and that

+ * all opened backing-store objects have been closed.

+ */

+

+EXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo));

+EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo));

diff --git a/core/src/fxcodec/libjpeg/jmorecfg.h b/core/src/fxcodec/libjpeg/jmorecfg.h
new file mode 100644
index 0000000..3602114
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jmorecfg.h
@@ -0,0 +1,376 @@
+/*

+ * jmorecfg.h

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains additional configuration options that customize the

+ * JPEG software for special applications or support machine-dependent

+ * optimizations.  Most users will not need to touch this file.

+ */

+

+#ifdef _MSC_VER

+#pragma warning (disable : 4142)

+#endif

+

+/*

+ * Define BITS_IN_JSAMPLE as either

+ *   8   for 8-bit sample values (the usual setting)

+ *   12  for 12-bit sample values

+ * Only 8 and 12 are legal data precisions for lossy JPEG according to the

+ * JPEG standard, and the IJG code does not support anything else!

+ * We do not support run-time selection of data precision, sorry.

+ */

+

+#define BITS_IN_JSAMPLE  8	/* use 8 or 12 */

+

+

+/*

+ * Maximum number of components (color channels) allowed in JPEG image.

+ * To meet the letter of the JPEG spec, set this to 255.  However, darn

+ * few applications need more than 4 channels (maybe 5 for CMYK + alpha

+ * mask).  We recommend 10 as a reasonable compromise; use 4 if you are

+ * really short on memory.  (Each allowed component costs a hundred or so

+ * bytes of storage, whether actually used in an image or not.)

+ */

+

+#define MAX_COMPONENTS  10	/* maximum number of image components */

+

+

+/*

+ * Basic data types.

+ * You may need to change these if you have a machine with unusual data

+ * type sizes; for example, "char" not 8 bits, "short" not 16 bits,

+ * or "long" not 32 bits.  We don't care whether "int" is 16 or 32 bits,

+ * but it had better be at least 16.

+ */

+

+/* Representation of a single sample (pixel element value).

+ * We frequently allocate large arrays of these, so it's important to keep

+ * them small.  But if you have memory to burn and access to char or short

+ * arrays is very slow on your hardware, you might want to change these.

+ */

+

+#if BITS_IN_JSAMPLE == 8

+/* JSAMPLE should be the smallest type that will hold the values 0..255.

+ * You can use a signed char by having GETJSAMPLE mask it with 0xFF.

+ */

+

+#ifdef HAVE_UNSIGNED_CHAR

+

+typedef unsigned char JSAMPLE;

+#define GETJSAMPLE(value)  ((int) (value))

+

+#else /* not HAVE_UNSIGNED_CHAR */

+

+typedef char JSAMPLE;

+#ifdef CHAR_IS_UNSIGNED

+#define GETJSAMPLE(value)  ((int) (value))

+#else

+#define GETJSAMPLE(value)  ((int) (value) & 0xFF)

+#endif /* CHAR_IS_UNSIGNED */

+

+#endif /* HAVE_UNSIGNED_CHAR */

+

+#define MAXJSAMPLE	255

+#define CENTERJSAMPLE	128

+

+#endif /* BITS_IN_JSAMPLE == 8 */

+

+

+#if BITS_IN_JSAMPLE == 12

+/* JSAMPLE should be the smallest type that will hold the values 0..4095.

+ * On nearly all machines "short" will do nicely.

+ */

+

+typedef short JSAMPLE;

+#define GETJSAMPLE(value)  ((int) (value))

+

+#define MAXJSAMPLE	4095

+#define CENTERJSAMPLE	2048

+

+#endif /* BITS_IN_JSAMPLE == 12 */

+

+

+/* Representation of a DCT frequency coefficient.

+ * This should be a signed value of at least 16 bits; "short" is usually OK.

+ * Again, we allocate large arrays of these, but you can change to int

+ * if you have memory to burn and "short" is really slow.

+ */

+

+typedef short JCOEF;

+

+

+/* Compressed datastreams are represented as arrays of JOCTET.

+ * These must be EXACTLY 8 bits wide, at least once they are written to

+ * external storage.  Note that when using the stdio data source/destination

+ * managers, this is also the data type passed to fread/fwrite.

+ */

+

+#ifdef HAVE_UNSIGNED_CHAR

+

+typedef unsigned char JOCTET;

+#define GETJOCTET(value)  (value)

+

+#else /* not HAVE_UNSIGNED_CHAR */

+

+typedef char JOCTET;

+#ifdef CHAR_IS_UNSIGNED

+#define GETJOCTET(value)  (value)

+#else

+#define GETJOCTET(value)  ((value) & 0xFF)

+#endif /* CHAR_IS_UNSIGNED */

+

+#endif /* HAVE_UNSIGNED_CHAR */

+

+

+/* These typedefs are used for various table entries and so forth.

+ * They must be at least as wide as specified; but making them too big

+ * won't cost a huge amount of memory, so we don't provide special

+ * extraction code like we did for JSAMPLE.  (In other words, these

+ * typedefs live at a different point on the speed/space tradeoff curve.)

+ */

+

+#if _FX_OS_ != _FX_VXWORKS_

+

+/* UINT8 must hold at least the values 0..255. */

+

+#ifdef HAVE_UNSIGNED_CHAR

+typedef unsigned char UINT8;

+#else /* not HAVE_UNSIGNED_CHAR */

+#ifdef CHAR_IS_UNSIGNED

+typedef char UINT8;

+#else /* not CHAR_IS_UNSIGNED */

+typedef short UINT8;

+#endif /* CHAR_IS_UNSIGNED */

+#endif /* HAVE_UNSIGNED_CHAR */

+

+

+/* UINT16 must hold at least the values 0..65535. */

+

+#ifdef HAVE_UNSIGNED_SHORT

+typedef unsigned short UINT16;

+#else /* not HAVE_UNSIGNED_SHORT */

+typedef unsigned int UINT16;

+#endif /* HAVE_UNSIGNED_SHORT */

+

+/* INT16 must hold at least the values -32768..32767. */

+

+#ifndef XMD_H			/* X11/xmd.h correctly defines INT16 */

+typedef short INT16;

+#endif

+

+/* INT32 must hold at least signed 32-bit values. */

+

+#ifndef XMD_H			/* X11/xmd.h correctly defines INT32 */

+typedef int INT32;

+#endif

+

+#endif 

+

+/* Datatype used for image dimensions.  The JPEG standard only supports

+ * images up to 64K*64K due to 16-bit fields in SOF markers.  Therefore

+ * "unsigned int" is sufficient on all machines.  However, if you need to

+ * handle larger images and you don't mind deviating from the spec, you

+ * can change this datatype.

+ */

+

+typedef unsigned int JDIMENSION;

+

+#define JPEG_MAX_DIMENSION  65500L  /* a tad under 64K to prevent overflows */

+

+

+/* These macros are used in all function definitions and extern declarations.

+ * You could modify them if you need to change function linkage conventions;

+ * in particular, you'll need to do that to make the library a Windows DLL.

+ * Another application is to make all functions global for use with debuggers

+ * or code profilers that require it.

+ */

+

+/* a function called through method pointers: */

+#define METHODDEF(type)		static type

+/* a function used only in its module: */

+#define LOCAL(type)		static type

+/* a function referenced thru EXTERNs: */

+#define GLOBAL(type)		type

+

+#ifdef _FX_MANAGED_CODE_

+#define EXTERN(type)		extern "C" type

+#else

+/* a reference to a GLOBAL function: */

+#define EXTERN(type)		extern type

+#endif

+

+

+/* This macro is used to declare a "method", that is, a function pointer.

+ * We want to supply prototype parameters if the compiler can cope.

+ * Note that the arglist parameter must be parenthesized!

+ * Again, you can customize this if you need special linkage keywords.

+ */

+

+#ifdef HAVE_PROTOTYPES

+#define JMETHOD(type,methodname,arglist)  type (*methodname) arglist

+#else

+#define JMETHOD(type,methodname,arglist)  type (*methodname) ()

+#endif

+

+

+/* Here is the pseudo-keyword for declaring pointers that must be "far"

+ * on 80x86 machines.  Most of the specialized coding for 80x86 is handled

+ * by just saying "FAR *" where such a pointer is needed.  In a few places

+ * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.

+ */

+

+#ifdef NEED_FAR_POINTERS

+#define FAR  far

+#else

+//#define FAR

+#endif

+

+

+/*

+ * On a few systems, type boolean and/or its values FALSE, TRUE may appear

+ * in standard header files.  Or you may have conflicts with application-

+ * specific header files that you want to include together with these files.

+ * Defining HAVE_BOOLEAN before including jpeglib.h should make it work.

+ */

+

+#ifndef HAVE_BOOLEAN

+typedef int boolean;

+#endif

+#ifndef FALSE			/* in case these macros already exist */

+#define FALSE	0		/* values of boolean */

+#endif

+#ifndef TRUE

+#define TRUE	1

+#endif

+

+

+/*

+ * The remaining options affect code selection within the JPEG library,

+ * but they don't need to be visible to most applications using the library.

+ * To minimize application namespace pollution, the symbols won't be

+ * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.

+ */

+

+#ifdef JPEG_INTERNALS

+#define JPEG_INTERNAL_OPTIONS

+#endif

+

+#ifdef JPEG_INTERNAL_OPTIONS

+

+

+/*

+ * These defines indicate whether to include various optional functions.

+ * Undefining some of these symbols will produce a smaller but less capable

+ * library.  Note that you can leave certain source files out of the

+ * compilation/linking process if you've #undef'd the corresponding symbols.

+ * (You may HAVE to do that if your compiler doesn't like null source files.)

+ */

+

+/* Arithmetic coding is unsupported for legal reasons.  Complaints to IBM. */

+

+/* Capability options common to encoder and decoder: */

+

+#define DCT_ISLOW_SUPPORTED	/* slow but accurate integer algorithm */

+#define DCT_IFAST_SUPPORTED	/* faster, less accurate integer method */

+#undef DCT_FLOAT_SUPPORTED	/* floating-point: accurate, fast on fast HW */

+

+/* Encoder capability options: */

+

+#undef  C_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */

+#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */

+#define C_PROGRESSIVE_SUPPORTED	    /* Progressive JPEG? (Requires MULTISCAN)*/

+#define ENTROPY_OPT_SUPPORTED	    /* Optimization of entropy coding parms? */

+/* Note: if you selected 12-bit data precision, it is dangerous to turn off

+ * ENTROPY_OPT_SUPPORTED.  The standard Huffman tables are only good for 8-bit

+ * precision, so jchuff.c normally uses entropy optimization to compute

+ * usable tables for higher precision.  If you don't want to do optimization,

+ * you'll have to supply different default Huffman tables.

+ * The exact same statements apply for progressive JPEG: the default tables

+ * don't work for progressive mode.  (This may get fixed, however.)

+ */

+#define INPUT_SMOOTHING_SUPPORTED   /* Input image smoothing option? */

+

+/* Decoder capability options: */

+

+#undef  D_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */

+#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */

+#define D_PROGRESSIVE_SUPPORTED	    /* Progressive JPEG? (Requires MULTISCAN)*/

+#define SAVE_MARKERS_SUPPORTED	    /* jpeg_save_markers() needed? */

+#define BLOCK_SMOOTHING_SUPPORTED   /* Block smoothing? (Progressive only) */

+#define IDCT_SCALING_SUPPORTED	    /* Output rescaling via IDCT? */

+#undef UPSAMPLE_SCALING_SUPPORTED  /* Output rescaling at upsample stage? */

+#define UPSAMPLE_MERGING_SUPPORTED  /* Fast path for sloppy upsampling? */

+#undef QUANT_1PASS_SUPPORTED	    /* 1-pass color quantization? */

+#undef QUANT_2PASS_SUPPORTED	    /* 2-pass color quantization? */

+

+/* more capability options later, no doubt */

+

+

+/*

+ * Ordering of RGB data in scanlines passed to or from the application.

+ * If your application wants to deal with data in the order B,G,R, just

+ * change these macros.  You can also deal with formats such as R,G,B,X

+ * (one extra byte per pixel) by changing RGB_PIXELSIZE.  Note that changing

+ * the offsets will also change the order in which colormap data is organized.

+ * RESTRICTIONS:

+ * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.

+ * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not

+ *    useful if you are using JPEG color spaces other than YCbCr or grayscale.

+ * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE

+ *    is not 3 (they don't understand about dummy color components!).  So you

+ *    can't use color quantization if you change that value.

+ */

+

+#define RGB_RED		0	/* Offset of Red in an RGB scanline element */

+#define RGB_GREEN	1	/* Offset of Green */

+#define RGB_BLUE	2	/* Offset of Blue */

+#define RGB_PIXELSIZE	3	/* JSAMPLEs per RGB scanline element */

+

+

+/* Definitions for speed-related optimizations. */

+

+

+/* If your compiler supports inline functions, define INLINE

+ * as the inline keyword; otherwise define it as empty.

+ */

+

+#ifndef INLINE

+#ifdef __GNUC__			/* for instance, GNU C knows about inline */

+#define INLINE __inline__

+#endif

+#ifndef INLINE

+#define INLINE			/* default is to define it as empty */

+#endif

+#endif

+

+

+/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying

+ * two 16-bit shorts is faster than multiplying two ints.  Define MULTIPLIER

+ * as short on such a machine.  MULTIPLIER must be at least 16 bits wide.

+ */

+

+#ifndef MULTIPLIER

+#define MULTIPLIER  int		/* type for fastest integer multiply */

+#endif

+

+

+/* FAST_FLOAT should be either float or double, whichever is done faster

+ * by your compiler.  (Note that this type is only used in the floating point

+ * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)

+ * Typically, float is faster in ANSI C compilers, while double is faster in

+ * pre-ANSI compilers (because they insist on converting to double anyway).

+ * The code below therefore chooses float if we have ANSI-style prototypes.

+ */

+

+#ifndef FAST_FLOAT

+#ifdef HAVE_PROTOTYPES

+#define FAST_FLOAT  float

+#else

+#define FAST_FLOAT  double

+#endif

+#endif

+

+#endif /* JPEG_INTERNAL_OPTIONS */

diff --git a/core/src/fxcodec/libjpeg/jpegint.h b/core/src/fxcodec/libjpeg/jpegint.h
new file mode 100644
index 0000000..685a361
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jpegint.h
@@ -0,0 +1,392 @@
+/*

+ * jpegint.h

+ *

+ * Copyright (C) 1991-1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file provides common declarations for the various JPEG modules.

+ * These declarations are considered internal to the JPEG library; most

+ * applications using the library shouldn't need to include this file.

+ */

+

+

+/* Declarations for both compression & decompression */

+

+typedef enum {			/* Operating modes for buffer controllers */

+	JBUF_PASS_THRU,		/* Plain stripwise operation */

+	/* Remaining modes require a full-image buffer to have been created */

+	JBUF_SAVE_SOURCE,	/* Run source subobject only, save output */

+	JBUF_CRANK_DEST,	/* Run dest subobject only, using saved data */

+	JBUF_SAVE_AND_PASS	/* Run both subobjects, save output */

+} J_BUF_MODE;

+

+/* Values of global_state field (jdapi.c has some dependencies on ordering!) */

+#define CSTATE_START	100	/* after create_compress */

+#define CSTATE_SCANNING	101	/* start_compress done, write_scanlines OK */

+#define CSTATE_RAW_OK	102	/* start_compress done, write_raw_data OK */

+#define CSTATE_WRCOEFS	103	/* jpeg_write_coefficients done */

+#define DSTATE_START	200	/* after create_decompress */

+#define DSTATE_INHEADER	201	/* reading header markers, no SOS yet */

+#define DSTATE_READY	202	/* found SOS, ready for start_decompress */

+#define DSTATE_PRELOAD	203	/* reading multiscan file in start_decompress*/

+#define DSTATE_PRESCAN	204	/* performing dummy pass for 2-pass quant */

+#define DSTATE_SCANNING	205	/* start_decompress done, read_scanlines OK */

+#define DSTATE_RAW_OK	206	/* start_decompress done, read_raw_data OK */

+#define DSTATE_BUFIMAGE	207	/* expecting jpeg_start_output */

+#define DSTATE_BUFPOST	208	/* looking for SOS/EOI in jpeg_finish_output */

+#define DSTATE_RDCOEFS	209	/* reading file in jpeg_read_coefficients */

+#define DSTATE_STOPPING	210	/* looking for EOI in jpeg_finish_decompress */

+

+

+/* Declarations for compression modules */

+

+/* Master control module */

+struct jpeg_comp_master {

+  JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));

+  JMETHOD(void, pass_startup, (j_compress_ptr cinfo));

+  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));

+

+  /* State variables made visible to other modules */

+  boolean call_pass_startup;	/* True if pass_startup must be called */

+  boolean is_last_pass;		/* True during last pass */

+};

+

+/* Main buffer control (downsampled-data buffer) */

+struct jpeg_c_main_controller {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));

+  JMETHOD(void, process_data, (j_compress_ptr cinfo,

+			       JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,

+			       JDIMENSION in_rows_avail));

+};

+

+/* Compression preprocessing (downsampling input buffer control) */

+struct jpeg_c_prep_controller {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));

+  JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,

+				   JSAMPARRAY input_buf,

+				   JDIMENSION *in_row_ctr,

+				   JDIMENSION in_rows_avail,

+				   JSAMPIMAGE output_buf,

+				   JDIMENSION *out_row_group_ctr,

+				   JDIMENSION out_row_groups_avail));

+};

+

+/* Coefficient buffer control */

+struct jpeg_c_coef_controller {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));

+  JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,

+				   JSAMPIMAGE input_buf));

+};

+

+/* Colorspace conversion */

+struct jpeg_color_converter {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo));

+  JMETHOD(void, color_convert, (j_compress_ptr cinfo,

+				JSAMPARRAY input_buf, JSAMPIMAGE output_buf,

+				JDIMENSION output_row, int num_rows));

+};

+

+/* Downsampling */

+struct jpeg_downsampler {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo));

+  JMETHOD(void, downsample, (j_compress_ptr cinfo,

+			     JSAMPIMAGE input_buf, JDIMENSION in_row_index,

+			     JSAMPIMAGE output_buf,

+			     JDIMENSION out_row_group_index));

+

+  boolean need_context_rows;	/* TRUE if need rows above & below */

+};

+

+/* Forward DCT (also controls coefficient quantization) */

+struct jpeg_forward_dct {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo));

+  /* perhaps this should be an array??? */

+  JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,

+			      jpeg_component_info * compptr,

+			      JSAMPARRAY sample_data, JBLOCKROW coef_blocks,

+			      JDIMENSION start_row, JDIMENSION start_col,

+			      JDIMENSION num_blocks));

+};

+

+/* Entropy encoding */

+struct jpeg_entropy_encoder {

+  JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));

+  JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));

+  JMETHOD(void, finish_pass, (j_compress_ptr cinfo));

+};

+

+/* Marker writing */

+struct jpeg_marker_writer {

+  JMETHOD(void, write_file_header, (j_compress_ptr cinfo));

+  JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));

+  JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));

+  JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));

+  JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));

+  /* These routines are exported to allow insertion of extra markers */

+  /* Probably only COM and APPn markers should be written this way */

+  JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,

+				      unsigned int datalen));

+  JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));

+};

+

+

+/* Declarations for decompression modules */

+

+/* Master control module */

+struct jpeg_decomp_master {

+  JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));

+  JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));

+

+  /* State variables made visible to other modules */

+  boolean is_dummy_pass;	/* True during 1st pass for 2-pass quant */

+};

+

+/* Input control module */

+struct jpeg_input_controller {

+  JMETHOD(int, consume_input, (j_decompress_ptr cinfo));

+  JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));

+  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));

+  JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));

+

+  /* State variables made visible to other modules */

+  boolean has_multiple_scans;	/* True if file has multiple scans */

+  boolean eoi_reached;		/* True when EOI has been consumed */

+};

+

+/* Main buffer control (downsampled-data buffer) */

+struct jpeg_d_main_controller {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));

+  JMETHOD(void, process_data, (j_decompress_ptr cinfo,

+			       JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,

+			       JDIMENSION out_rows_avail));

+};

+

+/* Coefficient buffer control */

+struct jpeg_d_coef_controller {

+  JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));

+  JMETHOD(int, consume_data, (j_decompress_ptr cinfo));

+  JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));

+  JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,

+				 JSAMPIMAGE output_buf));

+  /* Pointer to array of coefficient virtual arrays, or NULL if none */

+  jvirt_barray_ptr *coef_arrays;

+};

+

+/* Decompression postprocessing (color quantization buffer control) */

+struct jpeg_d_post_controller {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));

+  JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,

+				    JSAMPIMAGE input_buf,

+				    JDIMENSION *in_row_group_ctr,

+				    JDIMENSION in_row_groups_avail,

+				    JSAMPARRAY output_buf,

+				    JDIMENSION *out_row_ctr,

+				    JDIMENSION out_rows_avail));

+};

+

+/* Marker reading & parsing */

+struct jpeg_marker_reader {

+  JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));

+  /* Read markers until SOS or EOI.

+   * Returns same codes as are defined for jpeg_consume_input:

+   * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.

+   */

+  JMETHOD(int, read_markers, (j_decompress_ptr cinfo));

+  /* Read a restart marker --- exported for use by entropy decoder only */

+  jpeg_marker_parser_method read_restart_marker;

+

+  /* State of marker reader --- nominally internal, but applications

+   * supplying COM or APPn handlers might like to know the state.

+   */

+  boolean saw_SOI;		/* found SOI? */

+  boolean saw_SOF;		/* found SOF? */

+  int next_restart_num;		/* next restart number expected (0-7) */

+  unsigned int discarded_bytes;	/* # of bytes skipped looking for a marker */

+};

+

+/* Entropy decoding */

+struct jpeg_entropy_decoder {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));

+  JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,

+				JBLOCKROW *MCU_data));

+

+  /* This is here to share code between baseline and progressive decoders; */

+  /* other modules probably should not use it */

+  boolean insufficient_data;	/* set TRUE after emitting warning */

+};

+

+/* Inverse DCT (also performs dequantization) */

+typedef JMETHOD(void, inverse_DCT_method_ptr,

+		(j_decompress_ptr cinfo, jpeg_component_info * compptr,

+		 JCOEFPTR coef_block,

+		 JSAMPARRAY output_buf, JDIMENSION output_col));

+

+struct jpeg_inverse_dct {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));

+  /* It is useful to allow each component to have a separate IDCT method. */

+  inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];

+};

+

+/* Upsampling (note that upsampler must also call color converter) */

+struct jpeg_upsampler {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));

+  JMETHOD(void, upsample, (j_decompress_ptr cinfo,

+			   JSAMPIMAGE input_buf,

+			   JDIMENSION *in_row_group_ctr,

+			   JDIMENSION in_row_groups_avail,

+			   JSAMPARRAY output_buf,

+			   JDIMENSION *out_row_ctr,

+			   JDIMENSION out_rows_avail));

+

+  boolean need_context_rows;	/* TRUE if need rows above & below */

+};

+

+/* Colorspace conversion */

+struct jpeg_color_deconverter {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo));

+  JMETHOD(void, color_convert, (j_decompress_ptr cinfo,

+				JSAMPIMAGE input_buf, JDIMENSION input_row,

+				JSAMPARRAY output_buf, int num_rows));

+};

+

+/* Color quantization or color precision reduction */

+struct jpeg_color_quantizer {

+  JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));

+  JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,

+				 JSAMPARRAY input_buf, JSAMPARRAY output_buf,

+				 int num_rows));

+  JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));

+  JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));

+};

+

+

+/* Miscellaneous useful macros */

+

+#undef MAX

+#define MAX(a,b)	((a) > (b) ? (a) : (b))

+#undef MIN

+#define MIN(a,b)	((a) < (b) ? (a) : (b))

+

+

+/* We assume that right shift corresponds to signed division by 2 with

+ * rounding towards minus infinity.  This is correct for typical "arithmetic

+ * shift" instructions that shift in copies of the sign bit.  But some

+ * C compilers implement >> with an unsigned shift.  For these machines you

+ * must define RIGHT_SHIFT_IS_UNSIGNED.

+ * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.

+ * It is only applied with constant shift counts.  SHIFT_TEMPS must be

+ * included in the variables of any routine using RIGHT_SHIFT.

+ */

+

+#ifdef RIGHT_SHIFT_IS_UNSIGNED

+#define SHIFT_TEMPS	INT32 shift_temp;

+#define RIGHT_SHIFT(x,shft)  \

+	((shift_temp = (x)) < 0 ? \

+	 (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \

+	 (shift_temp >> (shft)))

+#else

+#define SHIFT_TEMPS

+#define RIGHT_SHIFT(x,shft)	((x) >> (shft))

+#endif

+

+

+/* Short forms of external names for systems with brain-damaged linkers. */

+

+#ifdef NEED_SHORT_EXTERNAL_NAMES

+#define jinit_compress_master	jICompress

+#define jinit_c_master_control	jICMaster

+#define jinit_c_main_controller	jICMainC

+#define jinit_c_prep_controller	jICPrepC

+#define jinit_c_coef_controller	jICCoefC

+#define jinit_color_converter	jICColor

+#define jinit_downsampler	jIDownsampler

+#define jinit_forward_dct	jIFDCT

+#define jinit_huff_encoder	jIHEncoder

+#define jinit_phuff_encoder	jIPHEncoder

+#define jinit_marker_writer	jIMWriter

+#define jinit_master_decompress	jIDMaster

+#define jinit_d_main_controller	jIDMainC

+#define jinit_d_coef_controller	jIDCoefC

+#define jinit_d_post_controller	jIDPostC

+#define jinit_input_controller	jIInCtlr

+#define jinit_marker_reader	jIMReader

+#define jinit_huff_decoder	jIHDecoder

+#define jinit_phuff_decoder	jIPHDecoder

+#define jinit_inverse_dct	jIIDCT

+#define jinit_upsampler		jIUpsampler

+#define jinit_color_deconverter	jIDColor

+#define jinit_1pass_quantizer	jI1Quant

+#define jinit_2pass_quantizer	jI2Quant

+#define jinit_merged_upsampler	jIMUpsampler

+#define jinit_memory_mgr	jIMemMgr

+#define jdiv_round_up		jDivRound

+#define jround_up		jRound

+#define jcopy_sample_rows	jCopySamples

+#define jcopy_block_row		jCopyBlocks

+#define jzero_far		jZeroFar

+#define jpeg_zigzag_order	jZIGTable

+#define jpeg_natural_order	jZAGTable

+#endif /* NEED_SHORT_EXTERNAL_NAMES */

+

+

+/* Compression module initialization routines */

+EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));

+EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,

+					 boolean transcode_only));

+EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,

+					  boolean need_full_buffer));

+EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,

+					  boolean need_full_buffer));

+EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,

+					  boolean need_full_buffer));

+EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));

+EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));

+EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));

+EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));

+EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));

+EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));

+/* Decompression module initialization routines */

+EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,

+					  boolean need_full_buffer));

+EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,

+					  boolean need_full_buffer));

+EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,

+					  boolean need_full_buffer));

+EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));

+EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));

+/* Memory manager initialization */

+EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));

+

+/* Utility routines in jutils.c */

+EXTERN(long) jdiv_round_up JPP((long a, long b));

+EXTERN(long) jround_up JPP((long a, long b));

+EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,

+				    JSAMPARRAY output_array, int dest_row,

+				    int num_rows, JDIMENSION num_cols));

+EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,

+				  JDIMENSION num_blocks));

+EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));

+/* Constant tables in jutils.c */

+#if 0				/* This table is not actually needed in v6a */

+extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */

+#endif

+extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */

+

+/* Suppress undefined-structure complaints if necessary. */

+

+#ifdef INCOMPLETE_TYPES_BROKEN

+#ifndef AM_MEMORY_MANAGER	/* only jmemmgr.c defines these */

+struct jvirt_sarray_control { long dummy; };

+struct jvirt_barray_control { long dummy; };

+#endif

+#endif /* INCOMPLETE_TYPES_BROKEN */

diff --git a/core/src/fxcodec/libjpeg/jpeglib.h b/core/src/fxcodec/libjpeg/jpeglib.h
new file mode 100644
index 0000000..ac2aff9
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jpeglib.h
@@ -0,0 +1,1165 @@
+/*

+ * jpeglib.h

+ *

+ * Copyright (C) 1991-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file defines the application interface for the JPEG library.

+ * Most applications using the library need only include this file,

+ * and perhaps jerror.h if they want to know the exact error codes.

+ */

+

+#ifndef JPEGLIB_H

+#define JPEGLIB_H

+

+#define FOXIT_PREFIX(origName)  FPDFAPIJPEG_##origName

+

+#define jcopy_block_row FOXIT_PREFIX(jcopy_block_row)

+#define jcopy_sample_rows FOXIT_PREFIX(jcopy_sample_rows)

+#define jdiv_round_up FOXIT_PREFIX(jdiv_round_up)

+#define jinit_1pass_quantizer FOXIT_PREFIX(jinit_1pass_quantizer)

+#define jinit_2pass_quantizer FOXIT_PREFIX(jinit_2pass_quantizer)

+#define jinit_color_deconverter FOXIT_PREFIX(jinit_color_deconverter)

+#define jinit_d_coef_controller FOXIT_PREFIX(jinit_d_coef_controller)

+#define jinit_d_main_controller FOXIT_PREFIX(jinit_d_main_controller)

+#define jinit_d_post_controller FOXIT_PREFIX(jinit_d_post_controller)

+#define jinit_huff_decoder FOXIT_PREFIX(jinit_huff_decoder)

+#define jinit_input_controller FOXIT_PREFIX(jinit_input_controller)

+#define jinit_inverse_dct FOXIT_PREFIX(jinit_inverse_dct)

+#define jinit_marker_reader FOXIT_PREFIX(jinit_marker_reader)

+#define jinit_master_decompress FOXIT_PREFIX(jinit_master_decompress)

+#define jinit_memory_mgr FOXIT_PREFIX(jinit_memory_mgr)

+#define jinit_merged_upsampler FOXIT_PREFIX(jinit_merged_upsampler)

+#define jinit_phuff_decoder FOXIT_PREFIX(jinit_phuff_decoder)

+#define jinit_upsampler FOXIT_PREFIX(jinit_upsampler)

+#define jpeg_CreateDecompress FOXIT_PREFIX(jpeg_CreateDecompress)

+#define jpeg_abort FOXIT_PREFIX(jpeg_abort)

+#define jpeg_abort_decompress FOXIT_PREFIX(jpeg_abort_decompress)

+#define jpeg_alloc_huff_table FOXIT_PREFIX(jpeg_alloc_huff_table)

+#define jpeg_alloc_quant_table FOXIT_PREFIX(jpeg_alloc_quant_table)

+#define jpeg_calc_output_dimensions FOXIT_PREFIX(jpeg_calc_output_dimensions)

+#define jpeg_consume_input FOXIT_PREFIX(jpeg_consume_input)

+#define jpeg_destroy FOXIT_PREFIX(jpeg_destroy)

+#define jpeg_destroy_decompress FOXIT_PREFIX(jpeg_destroy_decompress)

+#define jpeg_fill_bit_buffer FOXIT_PREFIX(jpeg_fill_bit_buffer)

+#define jpeg_finish_decompress FOXIT_PREFIX(jpeg_finish_decompress)

+#define jpeg_finish_output FOXIT_PREFIX(jpeg_finish_output)

+#define jpeg_free_large FOXIT_PREFIX(jpeg_free_large)

+#define jpeg_free_small FOXIT_PREFIX(jpeg_free_small)

+#define jpeg_get_large FOXIT_PREFIX(jpeg_get_large)

+#define jpeg_get_small FOXIT_PREFIX(jpeg_get_small)

+#define jpeg_has_multiple_scans FOXIT_PREFIX(jpeg_has_multiple_scans)

+#define jpeg_huff_decode FOXIT_PREFIX(jpeg_huff_decode)

+#define jpeg_idct_1x1 FOXIT_PREFIX(jpeg_idct_1x1)

+#define jpeg_idct_2x2 FOXIT_PREFIX(jpeg_idct_2x2)

+#define jpeg_idct_4x4 FOXIT_PREFIX(jpeg_idct_4x4)

+#define jpeg_idct_float FOXIT_PREFIX(jpeg_idct_float)

+#define jpeg_idct_ifast FOXIT_PREFIX(jpeg_idct_ifast)

+#define jpeg_idct_islow FOXIT_PREFIX(jpeg_idct_islow)

+#define jpeg_input_complete FOXIT_PREFIX(jpeg_input_complete)

+#define jpeg_make_d_derived_tbl FOXIT_PREFIX(jpeg_make_d_derived_tbl)

+#define jpeg_mem_available FOXIT_PREFIX(jpeg_mem_available)

+#define jpeg_mem_init FOXIT_PREFIX(jpeg_mem_init)

+#define jpeg_mem_term FOXIT_PREFIX(jpeg_mem_term)

+#define jpeg_natural_order FOXIT_PREFIX(jpeg_natural_order)

+#define jpeg_new_colormap FOXIT_PREFIX(jpeg_new_colormap)

+#define jpeg_open_backing_store FOXIT_PREFIX(jpeg_open_backing_store)

+#define jpeg_read_coefficients FOXIT_PREFIX(jpeg_read_coefficients)

+#define jpeg_read_header FOXIT_PREFIX(jpeg_read_header)

+#define jpeg_read_raw_data FOXIT_PREFIX(jpeg_read_raw_data)

+#define jpeg_read_scanlines FOXIT_PREFIX(jpeg_read_scanlines)

+#define jpeg_resync_to_restart FOXIT_PREFIX(jpeg_resync_to_restart)

+#define jpeg_save_markers FOXIT_PREFIX(jpeg_save_markers)

+#define jpeg_set_marker_processor FOXIT_PREFIX(jpeg_set_marker_processor)

+#define jpeg_start_decompress FOXIT_PREFIX(jpeg_start_decompress)

+#define jpeg_start_output FOXIT_PREFIX(jpeg_start_output)

+#define jpeg_std_error FOXIT_PREFIX(jpeg_std_error)

+#define jpeg_std_message_table FOXIT_PREFIX(jpeg_std_message_table)

+#define jpeg_stdio_src FOXIT_PREFIX(jpeg_stdio_src)

+#define jround_up FOXIT_PREFIX(jround_up)

+#define jzero_far FOXIT_PREFIX(jzero_far)

+

+ /*

+ * First we include the configuration files that record how this

+ * installation of the JPEG library is set up.  jconfig.h can be

+ * generated automatically for many systems.  jmorecfg.h contains

+ * manual configuration options that most people need not worry about.

+ */

+

+#ifndef JCONFIG_INCLUDED	/* in case jinclude.h already did */

+#include "jconfig.h"		/* widely used configuration options */

+#endif

+#include "jmorecfg.h"		/* seldom changed options */

+

+

+/* Version ID for the JPEG library.

+ * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60".

+ */

+

+#define JPEG_LIB_VERSION  62	/* Version 6b */

+

+

+/* Various constants determining the sizes of things.

+ * All of these are specified by the JPEG standard, so don't change them

+ * if you want to be compatible.

+ */

+

+#define DCTSIZE		    8	/* The basic DCT block is 8x8 samples */

+#define DCTSIZE2	    64	/* DCTSIZE squared; # of elements in a block */

+#define NUM_QUANT_TBLS      4	/* Quantization tables are numbered 0..3 */

+#define NUM_HUFF_TBLS       4	/* Huffman tables are numbered 0..3 */

+#define NUM_ARITH_TBLS      16	/* Arith-coding tables are numbered 0..15 */

+#define MAX_COMPS_IN_SCAN   4	/* JPEG limit on # of components in one scan */

+#define MAX_SAMP_FACTOR     4	/* JPEG limit on sampling factors */

+/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard;

+ * the PostScript DCT filter can emit files with many more than 10 blocks/MCU.

+ * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU

+ * to handle it.  We even let you do this from the jconfig.h file.  However,

+ * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe

+ * sometimes emits noncompliant files doesn't mean you should too.

+ */

+#define C_MAX_BLOCKS_IN_MCU   10 /* compressor's limit on blocks per MCU */

+#ifndef D_MAX_BLOCKS_IN_MCU

+#define D_MAX_BLOCKS_IN_MCU   10 /* decompressor's limit on blocks per MCU */

+#endif

+

+

+/* Data structures for images (arrays of samples and of DCT coefficients).

+ * On 80x86 machines, the image arrays are too big for near pointers,

+ * but the pointer arrays can fit in near memory.

+ */

+

+typedef JSAMPLE  *JSAMPROW;	/* ptr to one image row of pixel samples. */

+typedef JSAMPROW *JSAMPARRAY;	/* ptr to some rows (a 2-D sample array) */

+typedef JSAMPARRAY *JSAMPIMAGE;	/* a 3-D sample array: top index is color */

+

+typedef JCOEF JBLOCK[DCTSIZE2];	/* one block of coefficients */

+typedef JBLOCK  *JBLOCKROW;	/* pointer to one row of coefficient blocks */

+typedef JBLOCKROW *JBLOCKARRAY;		/* a 2-D array of coefficient blocks */

+typedef JBLOCKARRAY *JBLOCKIMAGE;	/* a 3-D array of coefficient blocks */

+

+typedef JCOEF  *JCOEFPTR;	/* useful in a couple of places */

+

+

+/* Types for JPEG compression parameters and working tables. */

+

+

+/* DCT coefficient quantization tables. */

+

+typedef struct {

+  /* This array gives the coefficient quantizers in natural array order

+   * (not the zigzag order in which they are stored in a JPEG DQT marker).

+   * CAUTION: IJG versions prior to v6a kept this array in zigzag order.

+   */

+  UINT16 quantval[DCTSIZE2];	/* quantization step for each coefficient */

+  /* This field is used only during compression.  It's initialized FALSE when

+   * the table is created, and set TRUE when it's been output to the file.

+   * You could suppress output of a table by setting this to TRUE.

+   * (See jpeg_suppress_tables for an example.)

+   */

+  boolean sent_table;		/* TRUE when table has been output */

+} JQUANT_TBL;

+

+

+/* Huffman coding tables. */

+

+typedef struct {

+  /* These two fields directly represent the contents of a JPEG DHT marker */

+  UINT8 bits[17];		/* bits[k] = # of symbols with codes of */

+				/* length k bits; bits[0] is unused */

+  UINT8 huffval[256];		/* The symbols, in order of incr code length */

+  /* This field is used only during compression.  It's initialized FALSE when

+   * the table is created, and set TRUE when it's been output to the file.

+   * You could suppress output of a table by setting this to TRUE.

+   * (See jpeg_suppress_tables for an example.)

+   */

+  boolean sent_table;		/* TRUE when table has been output */

+} JHUFF_TBL;

+

+

+/* Basic info about one component (color channel). */

+

+typedef struct {

+  /* These values are fixed over the whole image. */

+  /* For compression, they must be supplied by parameter setup; */

+  /* for decompression, they are read from the SOF marker. */

+  int component_id;		/* identifier for this component (0..255) */

+  int component_index;		/* its index in SOF or cinfo->comp_info[] */

+  int h_samp_factor;		/* horizontal sampling factor (1..4) */

+  int v_samp_factor;		/* vertical sampling factor (1..4) */

+  int quant_tbl_no;		/* quantization table selector (0..3) */

+  /* These values may vary between scans. */

+  /* For compression, they must be supplied by parameter setup; */

+  /* for decompression, they are read from the SOS marker. */

+  /* The decompressor output side may not use these variables. */

+  int dc_tbl_no;		/* DC entropy table selector (0..3) */

+  int ac_tbl_no;		/* AC entropy table selector (0..3) */

+  

+  /* Remaining fields should be treated as private by applications. */

+  

+  /* These values are computed during compression or decompression startup: */

+  /* Component's size in DCT blocks.

+   * Any dummy blocks added to complete an MCU are not counted; therefore

+   * these values do not depend on whether a scan is interleaved or not.

+   */

+  JDIMENSION width_in_blocks;

+  JDIMENSION height_in_blocks;

+  /* Size of a DCT block in samples.  Always DCTSIZE for compression.

+   * For decompression this is the size of the output from one DCT block,

+   * reflecting any scaling we choose to apply during the IDCT step.

+   * Values of 1,2,4,8 are likely to be supported.  Note that different

+   * components may receive different IDCT scalings.

+   */

+  int DCT_scaled_size;

+  /* The downsampled dimensions are the component's actual, unpadded number

+   * of samples at the main buffer (preprocessing/compression interface), thus

+   * downsampled_width = ceil(image_width * Hi/Hmax)

+   * and similarly for height.  For decompression, IDCT scaling is included, so

+   * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE)

+   */

+  JDIMENSION downsampled_width;	 /* actual width in samples */

+  JDIMENSION downsampled_height; /* actual height in samples */

+  /* This flag is used only for decompression.  In cases where some of the

+   * components will be ignored (eg grayscale output from YCbCr image),

+   * we can skip most computations for the unused components.

+   */

+  boolean component_needed;	/* do we need the value of this component? */

+

+  /* These values are computed before starting a scan of the component. */

+  /* The decompressor output side may not use these variables. */

+  int MCU_width;		/* number of blocks per MCU, horizontally */

+  int MCU_height;		/* number of blocks per MCU, vertically */

+  int MCU_blocks;		/* MCU_width * MCU_height */

+  int MCU_sample_width;		/* MCU width in samples, MCU_width*DCT_scaled_size */

+  int last_col_width;		/* # of non-dummy blocks across in last MCU */

+  int last_row_height;		/* # of non-dummy blocks down in last MCU */

+

+  /* Saved quantization table for component; NULL if none yet saved.

+   * See jdinput.c comments about the need for this information.

+   * This field is currently used only for decompression.

+   */

+  JQUANT_TBL * quant_table;

+

+  /* Private per-component storage for DCT or IDCT subsystem. */

+  void * dct_table;

+} jpeg_component_info;

+

+

+/* The script for encoding a multiple-scan file is an array of these: */

+

+typedef struct {

+  int comps_in_scan;		/* number of components encoded in this scan */

+  int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */

+  int Ss, Se;			/* progressive JPEG spectral selection parms */

+  int Ah, Al;			/* progressive JPEG successive approx. parms */

+} jpeg_scan_info;

+

+/* The decompressor can save APPn and COM markers in a list of these: */

+

+typedef struct jpeg_marker_struct  * jpeg_saved_marker_ptr;

+

+struct jpeg_marker_struct {

+  jpeg_saved_marker_ptr next;	/* next in list, or NULL */

+  UINT8 marker;			/* marker code: JPEG_COM, or JPEG_APP0+n */

+  unsigned int original_length;	/* # bytes of data in the file */

+  unsigned int data_length;	/* # bytes of data saved at data[] */

+  JOCTET  * data;		/* the data contained in the marker */

+  /* the marker length word is not counted in data_length or original_length */

+};

+

+/* Known color spaces. */

+

+typedef enum {

+	JCS_UNKNOWN,		/* error/unspecified */

+	JCS_GRAYSCALE,		/* monochrome */

+	JCS_RGB,		/* red/green/blue */

+	JCS_YCbCr,		/* Y/Cb/Cr (also known as YUV) */

+	JCS_CMYK,		/* C/M/Y/K */

+	JCS_YCCK		/* Y/Cb/Cr/K */

+} J_COLOR_SPACE;

+

+/* DCT/IDCT algorithm options. */

+

+typedef enum {

+	JDCT_ISLOW,		/* slow but accurate integer algorithm */

+	JDCT_IFAST,		/* faster, less accurate integer method */

+	JDCT_FLOAT		/* floating-point: accurate, fast on fast HW */

+} J_DCT_METHOD;

+

+#ifndef JDCT_DEFAULT		/* may be overridden in jconfig.h */

+#define JDCT_DEFAULT  JDCT_ISLOW

+#endif

+#ifndef JDCT_FASTEST		/* may be overridden in jconfig.h */

+#define JDCT_FASTEST  JDCT_IFAST

+#endif

+

+/* Dithering options for decompression. */

+

+typedef enum {

+	JDITHER_NONE,		/* no dithering */

+	JDITHER_ORDERED,	/* simple ordered dither */

+	JDITHER_FS		/* Floyd-Steinberg error diffusion dither */

+} J_DITHER_MODE;

+

+

+/* Common fields between JPEG compression and decompression master structs. */

+

+#define jpeg_common_fields \

+  struct jpeg_error_mgr * err;	/* Error handler module */\

+  struct jpeg_memory_mgr * mem;	/* Memory manager module */\

+  struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\

+  void * client_data;		/* Available for use by application */\

+  boolean is_decompressor;	/* So common code can tell which is which */\

+  int global_state		/* For checking call sequence validity */

+

+/* Routines that are to be used by both halves of the library are declared

+ * to receive a pointer to this structure.  There are no actual instances of

+ * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct.

+ */

+struct jpeg_common_struct {

+  jpeg_common_fields;		/* Fields common to both master struct types */

+  /* Additional fields follow in an actual jpeg_compress_struct or

+   * jpeg_decompress_struct.  All three structs must agree on these

+   * initial fields!  (This would be a lot cleaner in C++.)

+   */

+};

+

+typedef struct jpeg_common_struct * j_common_ptr;

+typedef struct jpeg_compress_struct * j_compress_ptr;

+typedef struct jpeg_decompress_struct * j_decompress_ptr;

+

+

+/* Master record for a compression instance */

+

+struct jpeg_compress_struct {

+  jpeg_common_fields;		/* Fields shared with jpeg_decompress_struct */

+

+  /* Destination for compressed data */

+  struct jpeg_destination_mgr * dest;

+

+  /* Description of source image --- these fields must be filled in by

+   * outer application before starting compression.  in_color_space must

+   * be correct before you can even call jpeg_set_defaults().

+   */

+

+  JDIMENSION image_width;	/* input image width */

+  JDIMENSION image_height;	/* input image height */

+  int input_components;		/* # of color components in input image */

+  J_COLOR_SPACE in_color_space;	/* colorspace of input image */

+

+  double input_gamma;		/* image gamma of input image */

+

+  /* Compression parameters --- these fields must be set before calling

+   * jpeg_start_compress().  We recommend calling jpeg_set_defaults() to

+   * initialize everything to reasonable defaults, then changing anything

+   * the application specifically wants to change.  That way you won't get

+   * burnt when new parameters are added.  Also note that there are several

+   * helper routines to simplify changing parameters.

+   */

+

+  int data_precision;		/* bits of precision in image data */

+

+  int num_components;		/* # of color components in JPEG image */

+  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */

+

+  jpeg_component_info * comp_info;

+  /* comp_info[i] describes component that appears i'th in SOF */

+  

+  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];

+  /* ptrs to coefficient quantization tables, or NULL if not defined */

+  

+  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];

+  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];

+  /* ptrs to Huffman coding tables, or NULL if not defined */

+  

+  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */

+  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */

+  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */

+

+  int num_scans;		/* # of entries in scan_info array */

+  const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */

+  /* The default value of scan_info is NULL, which causes a single-scan

+   * sequential JPEG file to be emitted.  To create a multi-scan file,

+   * set num_scans and scan_info to point to an array of scan definitions.

+   */

+

+  boolean raw_data_in;		/* TRUE=caller supplies downsampled data */

+  boolean arith_code;		/* TRUE=arithmetic coding, FALSE=Huffman */

+  boolean optimize_coding;	/* TRUE=optimize entropy encoding parms */

+  boolean CCIR601_sampling;	/* TRUE=first samples are cosited */

+  int smoothing_factor;		/* 1..100, or 0 for no input smoothing */

+  J_DCT_METHOD dct_method;	/* DCT algorithm selector */

+

+  /* The restart interval can be specified in absolute MCUs by setting

+   * restart_interval, or in MCU rows by setting restart_in_rows

+   * (in which case the correct restart_interval will be figured

+   * for each scan).

+   */

+  unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */

+  int restart_in_rows;		/* if > 0, MCU rows per restart interval */

+

+  /* Parameters controlling emission of special markers. */

+

+  boolean write_JFIF_header;	/* should a JFIF marker be written? */

+  UINT8 JFIF_major_version;	/* What to write for the JFIF version number */

+  UINT8 JFIF_minor_version;

+  /* These three values are not used by the JPEG code, merely copied */

+  /* into the JFIF APP0 marker.  density_unit can be 0 for unknown, */

+  /* 1 for dots/inch, or 2 for dots/cm.  Note that the pixel aspect */

+  /* ratio is defined by X_density/Y_density even when density_unit=0. */

+  UINT8 density_unit;		/* JFIF code for pixel size units */

+  UINT16 X_density;		/* Horizontal pixel density */

+  UINT16 Y_density;		/* Vertical pixel density */

+  boolean write_Adobe_marker;	/* should an Adobe marker be written? */

+  

+  /* State variable: index of next scanline to be written to

+   * jpeg_write_scanlines().  Application may use this to control its

+   * processing loop, e.g., "while (next_scanline < image_height)".

+   */

+

+  JDIMENSION next_scanline;	/* 0 .. image_height-1  */

+

+  /* Remaining fields are known throughout compressor, but generally

+   * should not be touched by a surrounding application.

+   */

+

+  /*

+   * These fields are computed during compression startup

+   */

+  boolean progressive_mode;	/* TRUE if scan script uses progressive mode */

+  int max_h_samp_factor;	/* largest h_samp_factor */

+  int max_v_samp_factor;	/* largest v_samp_factor */

+

+  JDIMENSION total_iMCU_rows;	/* # of iMCU rows to be input to coef ctlr */

+  /* The coefficient controller receives data in units of MCU rows as defined

+   * for fully interleaved scans (whether the JPEG file is interleaved or not).

+   * There are v_samp_factor * DCTSIZE sample rows of each component in an

+   * "iMCU" (interleaved MCU) row.

+   */

+  

+  /*

+   * These fields are valid during any one scan.

+   * They describe the components and MCUs actually appearing in the scan.

+   */

+  int comps_in_scan;		/* # of JPEG components in this scan */

+  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];

+  /* *cur_comp_info[i] describes component that appears i'th in SOS */

+  

+  JDIMENSION MCUs_per_row;	/* # of MCUs across the image */

+  JDIMENSION MCU_rows_in_scan;	/* # of MCU rows in the image */

+  

+  int blocks_in_MCU;		/* # of DCT blocks per MCU */

+  int MCU_membership[C_MAX_BLOCKS_IN_MCU];

+  /* MCU_membership[i] is index in cur_comp_info of component owning */

+  /* i'th block in an MCU */

+

+  int Ss, Se, Ah, Al;		/* progressive JPEG parameters for scan */

+

+  /*

+   * Links to compression subobjects (methods and private variables of modules)

+   */

+  struct jpeg_comp_master * master;

+  struct jpeg_c_main_controller * main;

+  struct jpeg_c_prep_controller * prep;

+  struct jpeg_c_coef_controller * coef;

+  struct jpeg_marker_writer * marker;

+  struct jpeg_color_converter * cconvert;

+  struct jpeg_downsampler * downsample;

+  struct jpeg_forward_dct * fdct;

+  struct jpeg_entropy_encoder * entropy;

+  jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */

+  int script_space_size;

+};

+

+

+/* Master record for a decompression instance */

+

+struct jpeg_decompress_struct {

+  jpeg_common_fields;		/* Fields shared with jpeg_compress_struct */

+

+  /* Source of compressed data */

+  struct jpeg_source_mgr * src;

+

+  /* Basic description of image --- filled in by jpeg_read_header(). */

+  /* Application may inspect these values to decide how to process image. */

+

+  JDIMENSION image_width;	/* nominal image width (from SOF marker) */

+  JDIMENSION image_height;	/* nominal image height */

+  int num_components;		/* # of color components in JPEG image */

+  J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */

+

+  /* Decompression processing parameters --- these fields must be set before

+   * calling jpeg_start_decompress().  Note that jpeg_read_header() initializes

+   * them to default values.

+   */

+

+  J_COLOR_SPACE out_color_space; /* colorspace for output */

+

+  unsigned int scale_num, scale_denom; /* fraction by which to scale image */

+

+  double output_gamma;		/* image gamma wanted in output */

+

+  boolean buffered_image;	/* TRUE=multiple output passes */

+  boolean raw_data_out;		/* TRUE=downsampled data wanted */

+

+  J_DCT_METHOD dct_method;	/* IDCT algorithm selector */

+  boolean do_fancy_upsampling;	/* TRUE=apply fancy upsampling */

+  boolean do_block_smoothing;	/* TRUE=apply interblock smoothing */

+

+  boolean quantize_colors;	/* TRUE=colormapped output wanted */

+  /* the following are ignored if not quantize_colors: */

+  J_DITHER_MODE dither_mode;	/* type of color dithering to use */

+  boolean two_pass_quantize;	/* TRUE=use two-pass color quantization */

+  int desired_number_of_colors;	/* max # colors to use in created colormap */

+  /* these are significant only in buffered-image mode: */

+  boolean enable_1pass_quant;	/* enable future use of 1-pass quantizer */

+  boolean enable_external_quant;/* enable future use of external colormap */

+  boolean enable_2pass_quant;	/* enable future use of 2-pass quantizer */

+

+  /* Description of actual output image that will be returned to application.

+   * These fields are computed by jpeg_start_decompress().

+   * You can also use jpeg_calc_output_dimensions() to determine these values

+   * in advance of calling jpeg_start_decompress().

+   */

+

+  JDIMENSION output_width;	/* scaled image width */

+  JDIMENSION output_height;	/* scaled image height */

+  int out_color_components;	/* # of color components in out_color_space */

+  int output_components;	/* # of color components returned */

+  /* output_components is 1 (a colormap index) when quantizing colors;

+   * otherwise it equals out_color_components.

+   */

+  int rec_outbuf_height;	/* min recommended height of scanline buffer */

+  /* If the buffer passed to jpeg_read_scanlines() is less than this many rows

+   * high, space and time will be wasted due to unnecessary data copying.

+   * Usually rec_outbuf_height will be 1 or 2, at most 4.

+   */

+

+  /* When quantizing colors, the output colormap is described by these fields.

+   * The application can supply a colormap by setting colormap non-NULL before

+   * calling jpeg_start_decompress; otherwise a colormap is created during

+   * jpeg_start_decompress or jpeg_start_output.

+   * The map has out_color_components rows and actual_number_of_colors columns.

+   */

+  int actual_number_of_colors;	/* number of entries in use */

+  JSAMPARRAY colormap;		/* The color map as a 2-D pixel array */

+

+  /* State variables: these variables indicate the progress of decompression.

+   * The application may examine these but must not modify them.

+   */

+

+  /* Row index of next scanline to be read from jpeg_read_scanlines().

+   * Application may use this to control its processing loop, e.g.,

+   * "while (output_scanline < output_height)".

+   */

+  JDIMENSION output_scanline;	/* 0 .. output_height-1  */

+

+  /* Current input scan number and number of iMCU rows completed in scan.

+   * These indicate the progress of the decompressor input side.

+   */

+  int input_scan_number;	/* Number of SOS markers seen so far */

+  JDIMENSION input_iMCU_row;	/* Number of iMCU rows completed */

+

+  /* The "output scan number" is the notional scan being displayed by the

+   * output side.  The decompressor will not allow output scan/row number

+   * to get ahead of input scan/row, but it can fall arbitrarily far behind.

+   */

+  int output_scan_number;	/* Nominal scan number being displayed */

+  JDIMENSION output_iMCU_row;	/* Number of iMCU rows read */

+

+  /* Current progression status.  coef_bits[c][i] indicates the precision

+   * with which component c's DCT coefficient i (in zigzag order) is known.

+   * It is -1 when no data has yet been received, otherwise it is the point

+   * transform (shift) value for the most recent scan of the coefficient

+   * (thus, 0 at completion of the progression).

+   * This pointer is NULL when reading a non-progressive file.

+   */

+  int (*coef_bits)[DCTSIZE2];	/* -1 or current Al value for each coef */

+

+  /* Internal JPEG parameters --- the application usually need not look at

+   * these fields.  Note that the decompressor output side may not use

+   * any parameters that can change between scans.

+   */

+

+  /* Quantization and Huffman tables are carried forward across input

+   * datastreams when processing abbreviated JPEG datastreams.

+   */

+

+  JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];

+  /* ptrs to coefficient quantization tables, or NULL if not defined */

+

+  JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];

+  JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];

+  /* ptrs to Huffman coding tables, or NULL if not defined */

+

+  /* These parameters are never carried across datastreams, since they

+   * are given in SOF/SOS markers or defined to be reset by SOI.

+   */

+

+  int data_precision;		/* bits of precision in image data */

+

+  jpeg_component_info * comp_info;

+  /* comp_info[i] describes component that appears i'th in SOF */

+

+  boolean progressive_mode;	/* TRUE if SOFn specifies progressive mode */

+  boolean arith_code;		/* TRUE=arithmetic coding, FALSE=Huffman */

+

+  UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */

+  UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */

+  UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */

+

+  unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */

+

+  /* These fields record data obtained from optional markers recognized by

+   * the JPEG library.

+   */

+  boolean saw_JFIF_marker;	/* TRUE iff a JFIF APP0 marker was found */

+  /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */

+  UINT8 JFIF_major_version;	/* JFIF version number */

+  UINT8 JFIF_minor_version;

+  UINT8 density_unit;		/* JFIF code for pixel size units */

+  UINT16 X_density;		/* Horizontal pixel density */

+  UINT16 Y_density;		/* Vertical pixel density */

+  boolean saw_Adobe_marker;	/* TRUE iff an Adobe APP14 marker was found */

+  UINT8 Adobe_transform;	/* Color transform code from Adobe marker */

+

+  boolean CCIR601_sampling;	/* TRUE=first samples are cosited */

+

+  /* Aside from the specific data retained from APPn markers known to the

+   * library, the uninterpreted contents of any or all APPn and COM markers

+   * can be saved in a list for examination by the application.

+   */

+  jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */

+

+  /* Remaining fields are known throughout decompressor, but generally

+   * should not be touched by a surrounding application.

+   */

+

+  /*

+   * These fields are computed during decompression startup

+   */

+  int max_h_samp_factor;	/* largest h_samp_factor */

+  int max_v_samp_factor;	/* largest v_samp_factor */

+

+  int min_DCT_scaled_size;	/* smallest DCT_scaled_size of any component */

+

+  JDIMENSION total_iMCU_rows;	/* # of iMCU rows in image */

+  /* The coefficient controller's input and output progress is measured in

+   * units of "iMCU" (interleaved MCU) rows.  These are the same as MCU rows

+   * in fully interleaved JPEG scans, but are used whether the scan is

+   * interleaved or not.  We define an iMCU row as v_samp_factor DCT block

+   * rows of each component.  Therefore, the IDCT output contains

+   * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row.

+   */

+

+  JSAMPLE * sample_range_limit; /* table for fast range-limiting */

+

+  /*

+   * These fields are valid during any one scan.

+   * They describe the components and MCUs actually appearing in the scan.

+   * Note that the decompressor output side must not use these fields.

+   */

+  int comps_in_scan;		/* # of JPEG components in this scan */

+  jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];

+  /* *cur_comp_info[i] describes component that appears i'th in SOS */

+

+  JDIMENSION MCUs_per_row;	/* # of MCUs across the image */

+  JDIMENSION MCU_rows_in_scan;	/* # of MCU rows in the image */

+

+  int blocks_in_MCU;		/* # of DCT blocks per MCU */

+  int MCU_membership[D_MAX_BLOCKS_IN_MCU];

+  /* MCU_membership[i] is index in cur_comp_info of component owning */

+  /* i'th block in an MCU */

+

+  int Ss, Se, Ah, Al;		/* progressive JPEG parameters for scan */

+

+  /* This field is shared between entropy decoder and marker parser.

+   * It is either zero or the code of a JPEG marker that has been

+   * read from the data source, but has not yet been processed.

+   */

+  int unread_marker;

+

+  /*

+   * Links to decompression subobjects (methods, private variables of modules)

+   */

+  struct jpeg_decomp_master * master;

+  struct jpeg_d_main_controller * main;

+  struct jpeg_d_coef_controller * coef;

+  struct jpeg_d_post_controller * post;

+  struct jpeg_input_controller * inputctl;

+  struct jpeg_marker_reader * marker;

+  struct jpeg_entropy_decoder * entropy;

+  struct jpeg_inverse_dct * idct;

+  struct jpeg_upsampler * upsample;

+  struct jpeg_color_deconverter * cconvert;

+  struct jpeg_color_quantizer * cquantize;

+};

+

+

+/* "Object" declarations for JPEG modules that may be supplied or called

+ * directly by the surrounding application.

+ * As with all objects in the JPEG library, these structs only define the

+ * publicly visible methods and state variables of a module.  Additional

+ * private fields may exist after the public ones.

+ */

+

+

+/* Error handler object */

+

+struct jpeg_error_mgr {

+  /* Error exit handler: does not return to caller */

+  JMETHOD(void, error_exit, (j_common_ptr cinfo));

+  /* Conditionally emit a trace or warning message */

+  JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));

+  /* Routine that actually outputs a trace or error message */

+  JMETHOD(void, output_message, (j_common_ptr cinfo));

+  /* Format a message string for the most recent JPEG error or message */

+  JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));

+#define JMSG_LENGTH_MAX  200	/* recommended size of format_message buffer */

+  /* Reset error state variables at start of a new image */

+  JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));

+  

+  /* The message ID code and any parameters are saved here.

+   * A message can have one string parameter or up to 8 int parameters.

+   */

+  int msg_code;

+#define JMSG_STR_PARM_MAX  80

+  union {

+    int i[8];

+    char s[JMSG_STR_PARM_MAX];

+  } msg_parm;

+  

+  /* Standard state variables for error facility */

+  

+  int trace_level;		/* max msg_level that will be displayed */

+  

+  /* For recoverable corrupt-data errors, we emit a warning message,

+   * but keep going unless emit_message chooses to abort.  emit_message

+   * should count warnings in num_warnings.  The surrounding application

+   * can check for bad data by seeing if num_warnings is nonzero at the

+   * end of processing.

+   */

+  long num_warnings;		/* number of corrupt-data warnings */

+

+  /* These fields point to the table(s) of error message strings.

+   * An application can change the table pointer to switch to a different

+   * message list (typically, to change the language in which errors are

+   * reported).  Some applications may wish to add additional error codes

+   * that will be handled by the JPEG library error mechanism; the second

+   * table pointer is used for this purpose.

+   *

+   * First table includes all errors generated by JPEG library itself.

+   * Error code 0 is reserved for a "no such error string" message.

+   */

+  const char * const * jpeg_message_table; /* Library errors */

+  int last_jpeg_message;    /* Table contains strings 0..last_jpeg_message */

+  /* Second table can be added by application (see cjpeg/djpeg for example).

+   * It contains strings numbered first_addon_message..last_addon_message.

+   */

+  const char * const * addon_message_table; /* Non-library errors */

+  int first_addon_message;	/* code for first string in addon table */

+  int last_addon_message;	/* code for last string in addon table */

+};

+

+

+/* Progress monitor object */

+

+struct jpeg_progress_mgr {

+  JMETHOD(void, progress_monitor, (j_common_ptr cinfo));

+

+  long pass_counter;		/* work units completed in this pass */

+  long pass_limit;		/* total number of work units in this pass */

+  int completed_passes;		/* passes completed so far */

+  int total_passes;		/* total number of passes expected */

+};

+

+

+/* Data destination object for compression */

+

+struct jpeg_destination_mgr {

+  JOCTET * next_output_byte;	/* => next byte to write in buffer */

+  size_t free_in_buffer;	/* # of byte spaces remaining in buffer */

+

+  JMETHOD(void, init_destination, (j_compress_ptr cinfo));

+  JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo));

+  JMETHOD(void, term_destination, (j_compress_ptr cinfo));

+};

+

+

+/* Data source object for decompression */

+

+struct jpeg_source_mgr {

+  const JOCTET * next_input_byte; /* => next byte to read from buffer */

+  size_t bytes_in_buffer;	/* # of bytes remaining in buffer */

+

+  JMETHOD(void, init_source, (j_decompress_ptr cinfo));

+  JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));

+  JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));

+  JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));

+  JMETHOD(void, term_source, (j_decompress_ptr cinfo));

+};

+

+

+/* Memory manager object.

+ * Allocates "small" objects (a few K total), "large" objects (tens of K),

+ * and "really big" objects (virtual arrays with backing store if needed).

+ * The memory manager does not allow individual objects to be freed; rather,

+ * each created object is assigned to a pool, and whole pools can be freed

+ * at once.  This is faster and more convenient than remembering exactly what

+ * to free, especially where malloc()/free() are not too speedy.

+ * NB: alloc routines never return NULL.  They exit to error_exit if not

+ * successful.

+ */

+

+#define JPOOL_PERMANENT	0	/* lasts until master record is destroyed */

+#define JPOOL_IMAGE	1	/* lasts until done with image/datastream */

+#define JPOOL_NUMPOOLS	2

+

+typedef struct jvirt_sarray_control * jvirt_sarray_ptr;

+typedef struct jvirt_barray_control * jvirt_barray_ptr;

+

+

+struct jpeg_memory_mgr {

+  /* Method pointers */

+  JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id,

+				size_t sizeofobject));

+  JMETHOD(void  *, alloc_large, (j_common_ptr cinfo, int pool_id,

+				     size_t sizeofobject));

+  JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id,

+				     JDIMENSION samplesperrow,

+				     JDIMENSION numrows));

+  JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id,

+				      JDIMENSION blocksperrow,

+				      JDIMENSION numrows));

+  JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo,

+						  int pool_id,

+						  boolean pre_zero,

+						  JDIMENSION samplesperrow,

+						  JDIMENSION numrows,

+						  JDIMENSION maxaccess));

+  JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo,

+						  int pool_id,

+						  boolean pre_zero,

+						  JDIMENSION blocksperrow,

+						  JDIMENSION numrows,

+						  JDIMENSION maxaccess));

+  JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo));

+  JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo,

+					   jvirt_sarray_ptr ptr,

+					   JDIMENSION start_row,

+					   JDIMENSION num_rows,

+					   boolean writable));

+  JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo,

+					    jvirt_barray_ptr ptr,

+					    JDIMENSION start_row,

+					    JDIMENSION num_rows,

+					    boolean writable));

+  JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id));

+  JMETHOD(void, self_destruct, (j_common_ptr cinfo));

+

+  /* Limit on memory allocation for this JPEG object.  (Note that this is

+   * merely advisory, not a guaranteed maximum; it only affects the space

+   * used for virtual-array buffers.)  May be changed by outer application

+   * after creating the JPEG object.

+   */

+  long max_memory_to_use;

+

+  /* Maximum allocation request accepted by alloc_large. */

+  long max_alloc_chunk;

+};

+

+

+/* Routine signature for application-supplied marker processing methods.

+ * Need not pass marker code since it is stored in cinfo->unread_marker.

+ */

+typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));

+

+

+/* Declarations for routines called by application.

+ * The JPP macro hides prototype parameters from compilers that can't cope.

+ * Note JPP requires double parentheses.

+ */

+

+#ifdef HAVE_PROTOTYPES

+#define JPP(arglist)	arglist

+#else

+#define JPP(arglist)	()

+#endif

+

+

+/* Short forms of external names for systems with brain-damaged linkers.

+ * We shorten external names to be unique in the first six letters, which

+ * is good enough for all known systems.

+ * (If your compiler itself needs names to be unique in less than 15 

+ * characters, you are out of luck.  Get a better compiler.)

+ */

+

+#ifdef NEED_SHORT_EXTERNAL_NAMES

+#define jpeg_std_error		jStdError

+#define jpeg_CreateCompress	jCreaCompress

+#define jpeg_CreateDecompress	jCreaDecompress

+#define jpeg_destroy_compress	jDestCompress

+#define jpeg_destroy_decompress	jDestDecompress

+#define jpeg_stdio_dest		jStdDest

+#define jpeg_stdio_src		jStdSrc

+#define jpeg_set_defaults	jSetDefaults

+#define jpeg_set_colorspace	jSetColorspace

+#define jpeg_default_colorspace	jDefColorspace

+#define jpeg_set_quality	jSetQuality

+#define jpeg_set_linear_quality	jSetLQuality

+#define jpeg_add_quant_table	jAddQuantTable

+#define jpeg_quality_scaling	jQualityScaling

+#define jpeg_simple_progression	jSimProgress

+#define jpeg_suppress_tables	jSuppressTables

+#define jpeg_alloc_quant_table	jAlcQTable

+#define jpeg_alloc_huff_table	jAlcHTable

+#define jpeg_start_compress	jStrtCompress

+#define jpeg_write_scanlines	jWrtScanlines

+#define jpeg_finish_compress	jFinCompress

+#define jpeg_write_raw_data	jWrtRawData

+#define jpeg_write_marker	jWrtMarker

+#define jpeg_write_m_header	jWrtMHeader

+#define jpeg_write_m_byte	jWrtMByte

+#define jpeg_write_tables	jWrtTables

+#define jpeg_read_header	jReadHeader

+#define jpeg_start_decompress	jStrtDecompress

+#define jpeg_read_scanlines	jReadScanlines

+#define jpeg_finish_decompress	jFinDecompress

+#define jpeg_read_raw_data	jReadRawData

+#define jpeg_has_multiple_scans	jHasMultScn

+#define jpeg_start_output	jStrtOutput

+#define jpeg_finish_output	jFinOutput

+#define jpeg_input_complete	jInComplete

+#define jpeg_new_colormap	jNewCMap

+#define jpeg_consume_input	jConsumeInput

+#define jpeg_calc_output_dimensions	jCalcDimensions

+#define jpeg_save_markers	jSaveMarkers

+#define jpeg_set_marker_processor	jSetMarker

+#define jpeg_read_coefficients	jReadCoefs

+#define jpeg_write_coefficients	jWrtCoefs

+#define jpeg_copy_critical_parameters	jCopyCrit

+#define jpeg_abort_compress	jAbrtCompress

+#define jpeg_abort_decompress	jAbrtDecompress

+#define jpeg_abort		jAbort

+#define jpeg_destroy		jDestroy

+#define jpeg_resync_to_restart	jResyncRestart

+#endif /* NEED_SHORT_EXTERNAL_NAMES */

+

+

+/* Default error-management setup */

+EXTERN(struct jpeg_error_mgr *) jpeg_std_error

+	JPP((struct jpeg_error_mgr * err));

+

+/* Initialization of JPEG compression objects.

+ * jpeg_create_compress() and jpeg_create_decompress() are the exported

+ * names that applications should call.  These expand to calls on

+ * jpeg_CreateCompress and jpeg_CreateDecompress with additional information

+ * passed for version mismatch checking.

+ * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx.

+ */

+#define jpeg_create_compress(cinfo) \

+    jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \

+			(size_t) sizeof(struct jpeg_compress_struct))

+#define jpeg_create_decompress(cinfo) \

+    jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \

+			  (size_t) sizeof(struct jpeg_decompress_struct))

+EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo,

+				      int version, size_t structsize));

+EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo,

+					int version, size_t structsize));

+/* Destruction of JPEG compression objects */

+EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo));

+EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));

+

+#if 0

+/* Standard data source and destination managers: stdio streams. */

+/* Caller is responsible for opening the file before and closing after. */

+EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FXSYS_FILE * outfile));

+EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));

+#endif

+

+/* Default parameter setup for compression */

+EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));

+/* Compression parameter setup aids */

+EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo,

+				      J_COLOR_SPACE colorspace));

+EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo));

+EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality,

+				   boolean force_baseline));

+EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo,

+					  int scale_factor,

+					  boolean force_baseline));

+EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl,

+				       const unsigned int *basic_table,

+				       int scale_factor,

+				       boolean force_baseline));

+EXTERN(int) jpeg_quality_scaling JPP((int quality));

+EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo));

+EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,

+				       boolean suppress));

+EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));

+EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));

+

+/* Main entry points for compression */

+EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,

+				      boolean write_all_tables));

+EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo,

+					     JSAMPARRAY scanlines,

+					     JDIMENSION num_lines));

+EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo));

+

+/* Replaces jpeg_write_scanlines when writing raw downsampled data. */

+EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo,

+					    JSAMPIMAGE data,

+					    JDIMENSION num_lines));

+

+/* Write a special marker.  See libjpeg.doc concerning safe usage. */

+EXTERN(void) jpeg_write_marker

+	JPP((j_compress_ptr cinfo, int marker,

+	     const JOCTET * dataptr, unsigned int datalen));

+/* Same, but piecemeal. */

+EXTERN(void) jpeg_write_m_header

+	JPP((j_compress_ptr cinfo, int marker, unsigned int datalen));

+EXTERN(void) jpeg_write_m_byte

+	JPP((j_compress_ptr cinfo, int val));

+

+/* Alternate compression function: just write an abbreviated table file */

+EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo));

+

+/* Decompression startup: read start of JPEG datastream to see what's there */

+EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,

+				  boolean require_image));

+/* Return value is one of: */

+#define JPEG_SUSPENDED		0 /* Suspended due to lack of input data */

+#define JPEG_HEADER_OK		1 /* Found valid image datastream */

+#define JPEG_HEADER_TABLES_ONLY	2 /* Found valid table-specs-only datastream */

+/* If you pass require_image = TRUE (normal case), you need not check for

+ * a TABLES_ONLY return code; an abbreviated file will cause an error exit.

+ * JPEG_SUSPENDED is only possible if you use a data source module that can

+ * give a suspension return (the stdio source module doesn't).

+ */

+

+/* Main entry points for decompression */

+EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo));

+EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo,

+					    JSAMPARRAY scanlines,

+					    JDIMENSION max_lines));

+EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo));

+

+/* Replaces jpeg_read_scanlines when reading raw downsampled data. */

+EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo,

+					   JSAMPIMAGE data,

+					   JDIMENSION max_lines));

+

+/* Additional entry points for buffered-image mode. */

+EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo));

+EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo,

+				       int scan_number));

+EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo));

+EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo));

+EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo));

+EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));

+/* Return value is one of: */

+/* #define JPEG_SUSPENDED	0    Suspended due to lack of input data */

+#define JPEG_REACHED_SOS	1 /* Reached start of new scan */

+#define JPEG_REACHED_EOI	2 /* Reached end of image */

+#define JPEG_ROW_COMPLETED	3 /* Completed one iMCU row */

+#define JPEG_SCAN_COMPLETED	4 /* Completed last iMCU row of a scan */

+

+/* Precalculate output dimensions for current decompression parameters. */

+EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));

+

+/* Control saving of COM and APPn markers into marker_list. */

+EXTERN(void) jpeg_save_markers

+	JPP((j_decompress_ptr cinfo, int marker_code,

+	     unsigned int length_limit));

+

+/* Install a special processing method for COM or APPn markers. */

+EXTERN(void) jpeg_set_marker_processor

+	JPP((j_decompress_ptr cinfo, int marker_code,

+	     jpeg_marker_parser_method routine));

+

+/* Read or write raw DCT coefficients --- useful for lossless transcoding. */

+EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo));

+EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo,

+					  jvirt_barray_ptr * coef_arrays));

+EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo,

+						j_compress_ptr dstinfo));

+

+/* If you choose to abort compression or decompression before completing

+ * jpeg_finish_(de)compress, then you need to clean up to release memory,

+ * temporary files, etc.  You can just call jpeg_destroy_(de)compress

+ * if you're done with the JPEG object, but if you want to clean it up and

+ * reuse it, call this:

+ */

+EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo));

+EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo));

+

+/* Generic versions of jpeg_abort and jpeg_destroy that work on either

+ * flavor of JPEG object.  These may be more convenient in some places.

+ */

+EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo));

+EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo));

+

+/* Default restart-marker-resync procedure for use by data source modules */

+EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo,

+					    int desired));

+

+

+/* These marker codes are exported since applications and data source modules

+ * are likely to want to use them.

+ */

+

+#define JPEG_RST0	0xD0	/* RST0 marker code */

+#define JPEG_EOI	0xD9	/* EOI marker code */

+#define JPEG_APP0	0xE0	/* APP0 marker code */

+#define JPEG_COM	0xFE	/* COM marker code */

+

+

+/* If we have a brain-damaged compiler that emits warnings (or worse, errors)

+ * for structure definitions that are never filled in, keep it quiet by

+ * supplying dummy definitions for the various substructures.

+ */

+

+#ifdef INCOMPLETE_TYPES_BROKEN

+#ifndef JPEG_INTERNALS		/* will be defined in jpegint.h */

+struct jvirt_sarray_control { long dummy; };

+struct jvirt_barray_control { long dummy; };

+struct jpeg_comp_master { long dummy; };

+struct jpeg_c_main_controller { long dummy; };

+struct jpeg_c_prep_controller { long dummy; };

+struct jpeg_c_coef_controller { long dummy; };

+struct jpeg_marker_writer { long dummy; };

+struct jpeg_color_converter { long dummy; };

+struct jpeg_downsampler { long dummy; };

+struct jpeg_forward_dct { long dummy; };

+struct jpeg_entropy_encoder { long dummy; };

+struct jpeg_decomp_master { long dummy; };

+struct jpeg_d_main_controller { long dummy; };

+struct jpeg_d_coef_controller { long dummy; };

+struct jpeg_d_post_controller { long dummy; };

+struct jpeg_input_controller { long dummy; };

+struct jpeg_marker_reader { long dummy; };

+struct jpeg_entropy_decoder { long dummy; };

+struct jpeg_inverse_dct { long dummy; };

+struct jpeg_upsampler { long dummy; };

+struct jpeg_color_deconverter { long dummy; };

+struct jpeg_color_quantizer { long dummy; };

+#endif /* JPEG_INTERNALS */

+#endif /* INCOMPLETE_TYPES_BROKEN */

+

+

+/*

+ * The JPEG library modules define JPEG_INTERNALS before including this file.

+ * The internal structure declarations are read only when that is true.

+ * Applications using the library should not include jpegint.h, but may wish

+ * to include jerror.h.

+ */

+

+#ifdef JPEG_INTERNALS

+#include "jpegint.h"		/* fetch private declarations */

+#include "jerror.h"		/* fetch error codes too */

+#endif

+

+#endif /* JPEGLIB_H */

diff --git a/core/src/fxcodec/libjpeg/jversion.h b/core/src/fxcodec/libjpeg/jversion.h
new file mode 100644
index 0000000..dadd453
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jversion.h
@@ -0,0 +1,14 @@
+/*

+ * jversion.h

+ *

+ * Copyright (C) 1991-1998, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains software version identification.

+ */

+

+

+#define JVERSION	"6b  27-Mar-1998"

+

+#define JCOPYRIGHT	"Copyright (C) 1998, Thomas G. Lane"

diff --git a/core/src/fxcodec/libjpeg/makefile b/core/src/fxcodec/libjpeg/makefile
new file mode 100644
index 0000000..777d83b
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/makefile
@@ -0,0 +1,8 @@
+sources = fpdfapi_jcapimin.c fpdfapi_jcapistd.c fpdfapi_jccoefct.c fpdfapi_jccolor.c fpdfapi_jcdctmgr.c fpdfapi_jchuff.c fpdfapi_jcinit.c fpdfapi_jcmainct.c fpdfapi_jcmarker.c fpdfapi_jcmaster.c \
+	fpdfapi_jcomapi.c fpdfapi_jcparam.c fpdfapi_jcphuff.c fpdfapi_jcprepct.c fpdfapi_jcsample.c fpdfapi_jctrans.c fpdfapi_jdapimin.c fpdfapi_jdapistd.c fpdfapi_jdcoefct.c \
+	 fpdfapi_jdcolor.c fpdfapi_jddctmgr.c fpdfapi_jdhuff.c fpdfapi_jdinput.c fpdfapi_jdmainct.c fpdfapi_jdmarker.c fpdfapi_jdmaster.c fpdfapi_jdmerge.c fpdfapi_jdphuff.c fpdfapi_jdpostct.c fpdfapi_jdsample.c \
+	 fpdfapi_jdtrans.c fpdfapi_jerror.c fpdfapi_jfdctfst.c fpdfapi_jfdctint.c fpdfapi_jcapimin.c fpdfapi_jidctfst.c fpdfapi_jidctint.c fpdfapi_jidctred.c fpdfapi_jmemmgr.c \
+	 fpdfapi_jmemnobs.c fpdfapi_jutils.c
+armsources=$(sources)
+armsourcesc=$(sources)
+include ../../src/makefile
diff --git a/core/src/fxcodec/libjpeg/transupp.h b/core/src/fxcodec/libjpeg/transupp.h
new file mode 100644
index 0000000..eb0b055
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/transupp.h
@@ -0,0 +1,135 @@
+/*

+ * transupp.h

+ *

+ * Copyright (C) 1997, Thomas G. Lane.

+ * This file is part of the Independent JPEG Group's software.

+ * For conditions of distribution and use, see the accompanying README file.

+ *

+ * This file contains declarations for image transformation routines and

+ * other utility code used by the jpegtran sample application.  These are

+ * NOT part of the core JPEG library.  But we keep these routines separate

+ * from jpegtran.c to ease the task of maintaining jpegtran-like programs

+ * that have other user interfaces.

+ *

+ * NOTE: all the routines declared here have very specific requirements

+ * about when they are to be executed during the reading and writing of the

+ * source and destination files.  See the comments in transupp.c, or see

+ * jpegtran.c for an example of correct usage.

+ */

+

+/* If you happen not to want the image transform support, disable it here */

+#ifndef TRANSFORMS_SUPPORTED

+#define TRANSFORMS_SUPPORTED 1		/* 0 disables transform code */

+#endif

+

+/* Short forms of external names for systems with brain-damaged linkers. */

+

+#ifdef NEED_SHORT_EXTERNAL_NAMES

+#define jtransform_request_workspace		jTrRequest

+#define jtransform_adjust_parameters		jTrAdjust

+#define jtransform_execute_transformation	jTrExec

+#define jcopy_markers_setup			jCMrkSetup

+#define jcopy_markers_execute			jCMrkExec

+#endif /* NEED_SHORT_EXTERNAL_NAMES */

+

+

+/*

+ * Codes for supported types of image transformations.

+ */

+

+typedef enum {

+	JXFORM_NONE,		/* no transformation */

+	JXFORM_FLIP_H,		/* horizontal flip */

+	JXFORM_FLIP_V,		/* vertical flip */

+	JXFORM_TRANSPOSE,	/* transpose across UL-to-LR axis */

+	JXFORM_TRANSVERSE,	/* transpose across UR-to-LL axis */

+	JXFORM_ROT_90,		/* 90-degree clockwise rotation */

+	JXFORM_ROT_180,		/* 180-degree rotation */

+	JXFORM_ROT_270		/* 270-degree clockwise (or 90 ccw) */

+} JXFORM_CODE;

+

+/*

+ * Although rotating and flipping data expressed as DCT coefficients is not

+ * hard, there is an asymmetry in the JPEG format specification for images

+ * whose dimensions aren't multiples of the iMCU size.  The right and bottom

+ * image edges are padded out to the next iMCU boundary with junk data; but

+ * no padding is possible at the top and left edges.  If we were to flip

+ * the whole image including the pad data, then pad garbage would become

+ * visible at the top and/or left, and real pixels would disappear into the

+ * pad margins --- perhaps permanently, since encoders & decoders may not

+ * bother to preserve DCT blocks that appear to be completely outside the

+ * nominal image area.  So, we have to exclude any partial iMCUs from the

+ * basic transformation.

+ *

+ * Transpose is the only transformation that can handle partial iMCUs at the

+ * right and bottom edges completely cleanly.  flip_h can flip partial iMCUs

+ * at the bottom, but leaves any partial iMCUs at the right edge untouched.

+ * Similarly flip_v leaves any partial iMCUs at the bottom edge untouched.

+ * The other transforms are defined as combinations of these basic transforms

+ * and process edge blocks in a way that preserves the equivalence.

+ *

+ * The "trim" option causes untransformable partial iMCUs to be dropped;

+ * this is not strictly lossless, but it usually gives the best-looking

+ * result for odd-size images.  Note that when this option is active,

+ * the expected mathematical equivalences between the transforms may not hold.

+ * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim

+ * followed by -rot 180 -trim trims both edges.)

+ *

+ * We also offer a "force to grayscale" option, which simply discards the

+ * chrominance channels of a YCbCr image.  This is lossless in the sense that

+ * the luminance channel is preserved exactly.  It's not the same kind of

+ * thing as the rotate/flip transformations, but it's convenient to handle it

+ * as part of this package, mainly because the transformation routines have to

+ * be aware of the option to know how many components to work on.

+ */

+

+typedef struct {

+  /* Options: set by caller */

+  JXFORM_CODE transform;	/* image transform operator */

+  boolean trim;			/* if TRUE, trim partial MCUs as needed */

+  boolean force_grayscale;	/* if TRUE, convert color image to grayscale */

+

+  /* Internal workspace: caller should not touch these */

+  int num_components;		/* # of components in workspace */

+  jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */

+} jpeg_transform_info;

+

+

+#if TRANSFORMS_SUPPORTED

+

+/* Request any required workspace */

+EXTERN(void) jtransform_request_workspace

+	JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));

+/* Adjust output image parameters */

+EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters

+	JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,

+	     jvirt_barray_ptr *src_coef_arrays,

+	     jpeg_transform_info *info));

+/* Execute the actual transformation, if any */

+EXTERN(void) jtransform_execute_transformation

+	JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,

+	     jvirt_barray_ptr *src_coef_arrays,

+	     jpeg_transform_info *info));

+

+#endif /* TRANSFORMS_SUPPORTED */

+

+

+/*

+ * Support for copying optional markers from source to destination file.

+ */

+

+typedef enum {

+	JCOPYOPT_NONE,		/* copy no optional markers */

+	JCOPYOPT_COMMENTS,	/* copy only comment (COM) markers */

+	JCOPYOPT_ALL		/* copy all optional markers */

+} JCOPY_OPTION;

+

+#define JCOPYOPT_DEFAULT  JCOPYOPT_COMMENTS	/* recommended default */

+

+/* Setup decompression object to save desired markers in memory */

+EXTERN(void) jcopy_markers_setup

+	JPP((j_decompress_ptr srcinfo, JCOPY_OPTION option));

+/* Copy markers saved in the given source object to the destination object */

+EXTERN(void) jcopy_markers_execute

+	JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,

+	     JCOPY_OPTION option));

diff --git a/core/src/fxcrt/extension.h b/core/src/fxcrt/extension.h
new file mode 100644
index 0000000..bf5c5ec
--- /dev/null
+++ b/core/src/fxcrt/extension.h
@@ -0,0 +1,413 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FXCRT_EXTENSION_IMP_

+#define _FXCRT_EXTENSION_IMP_

+class IFXCRT_FileAccess

+{

+public:

+    virtual ~IFXCRT_FileAccess() {}

+    virtual FX_BOOL		Open(FX_BSTR fileName, FX_DWORD dwMode) = 0;

+    virtual FX_BOOL		Open(FX_WSTR fileName, FX_DWORD dwMode) = 0;

+    virtual void		Close() = 0;

+    virtual void		Release(IFX_Allocator* pAllocator = NULL) = 0;

+    virtual FX_FILESIZE	GetSize() const = 0;

+    virtual FX_FILESIZE	GetPosition() const = 0;

+    virtual FX_FILESIZE	SetPosition(FX_FILESIZE pos) = 0;

+    virtual size_t		Read(void* pBuffer, size_t szBuffer) = 0;

+    virtual size_t		Write(const void* pBuffer, size_t szBuffer) = 0;

+    virtual size_t		ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0;

+    virtual size_t		WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0;

+    virtual FX_BOOL		Flush() = 0;

+    virtual FX_BOOL		Truncate(FX_FILESIZE szFile) = 0;

+};

+IFXCRT_FileAccess*	FXCRT_FileAccess_Create(IFX_Allocator* pAllocator = NULL);

+class CFX_CRTFileStream : public IFX_FileStream, public CFX_Object

+{

+public:

+    CFX_CRTFileStream(IFXCRT_FileAccess* pFA, IFX_Allocator* pAllocator) : m_pAllocator(pAllocator), m_pFile(pFA), m_dwCount(1), m_bUseRange(FALSE), m_nOffset(0), m_nSize(0) {}

+    ~CFX_CRTFileStream()

+    {

+        if (m_pFile) {

+            m_pFile->Release(m_pAllocator);

+        }

+    }

+    virtual IFX_FileStream*		Retain()

+    {

+        m_dwCount ++;

+        return this;

+    }

+    virtual void				Release()

+    {

+        FX_DWORD nCount = -- m_dwCount;

+        if (!nCount) {

+            if (m_pAllocator) {

+                FX_DeleteAtAllocator(this, m_pAllocator, CFX_CRTFileStream);

+            } else {

+                delete this;

+            }

+        }

+    }

+    virtual FX_FILESIZE			GetSize()

+    {

+        return m_bUseRange ? m_nSize : m_pFile->GetSize();

+    }

+    virtual FX_BOOL				IsEOF()

+    {

+        return GetPosition() >= GetSize();

+    }

+    virtual FX_FILESIZE			GetPosition()

+    {

+        FX_FILESIZE pos = m_pFile->GetPosition();

+        if (m_bUseRange) {

+            pos -= m_nOffset;

+        }

+        return pos;

+    }

+    virtual FX_BOOL				SetRange(FX_FILESIZE offset, FX_FILESIZE size)

+    {

+        if (offset < 0 || offset + size > m_pFile->GetSize()) {

+            return FALSE;

+        }

+        m_nOffset = offset, m_nSize = size;

+        m_bUseRange = TRUE;

+        m_pFile->SetPosition(m_nOffset);

+        return TRUE;

+    }

+    virtual void				ClearRange()

+    {

+        m_bUseRange = FALSE;

+    }

+    virtual FX_BOOL				ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)

+    {

+        if (m_bUseRange) {

+            if (offset + size > (size_t)GetSize()) {

+                return FALSE;

+            }

+            offset += m_nOffset;

+        }

+        return (FX_BOOL)m_pFile->ReadPos(buffer, size, offset);

+    }

+    virtual size_t				ReadBlock(void* buffer, size_t size)

+    {

+        if (m_bUseRange) {

+            FX_FILESIZE availSize = m_nOffset + m_nSize - m_pFile->GetPosition();

+            if ((size_t)availSize < size) {

+                size -= size - (size_t)availSize;

+            }

+        }

+        return m_pFile->Read(buffer, size);

+    }

+    virtual	FX_BOOL				WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size)

+    {

+        if (m_bUseRange) {

+            offset += m_nOffset;

+        }

+        return (FX_BOOL)m_pFile->WritePos(buffer, size, offset);

+    }

+    virtual FX_BOOL				Flush()

+    {

+        return m_pFile->Flush();

+    }

+    IFX_Allocator*		m_pAllocator;

+    IFXCRT_FileAccess*	m_pFile;

+    FX_DWORD			m_dwCount;

+    FX_BOOL				m_bUseRange;

+    FX_FILESIZE			m_nOffset;

+    FX_FILESIZE			m_nSize;

+};

+#define FX_MEMSTREAM_BlockSize		(64 * 1024)

+#define FX_MEMSTREAM_Consecutive	0x01

+#define FX_MEMSTREAM_TakeOver		0x02

+class CFX_MemoryStream : public IFX_MemoryStream, public CFX_Object

+{

+public:

+    CFX_MemoryStream(FX_BOOL bConsecutive, IFX_Allocator* pAllocator)

+        : m_Blocks(pAllocator)

+        , m_dwCount(1)

+        , m_nTotalSize(0)

+        , m_nCurSize(0)

+        , m_nCurPos(0)

+        , m_nGrowSize(FX_MEMSTREAM_BlockSize)

+        , m_bUseRange(FALSE)

+    {

+        m_dwFlags = FX_MEMSTREAM_TakeOver | (bConsecutive ? FX_MEMSTREAM_Consecutive : 0);

+    }

+    CFX_MemoryStream(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver, IFX_Allocator* pAllocator)

+        : m_Blocks(pAllocator)

+        , m_dwCount(1)

+        , m_nTotalSize(nSize)

+        , m_nCurSize(nSize)

+        , m_nCurPos(0)

+        , m_nGrowSize(FX_MEMSTREAM_BlockSize)

+        , m_bUseRange(FALSE)

+    {

+        m_Blocks.Add(pBuffer);

+        m_dwFlags = FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);

+    }

+    ~CFX_MemoryStream()

+    {

+        IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;

+        if (m_dwFlags & FX_MEMSTREAM_TakeOver) {

+            for (FX_INT32 i = 0; i < m_Blocks.GetSize(); i ++) {

+                FX_Allocator_Free(pAllocator, (FX_LPBYTE)m_Blocks[i]);

+            }

+        }

+        m_Blocks.RemoveAll();

+    }

+    virtual IFX_FileStream*		Retain()

+    {

+        m_dwCount ++;

+        return this;

+    }

+    virtual void				Release()

+    {

+        FX_DWORD nCount = -- m_dwCount;

+        if (nCount) {

+            return;

+        }

+        IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;

+        if (pAllocator) {

+            FX_DeleteAtAllocator(this, pAllocator, CFX_MemoryStream);

+        } else {

+            delete this;

+        }

+    }

+    virtual FX_FILESIZE			GetSize()

+    {

+        return m_bUseRange ? (FX_FILESIZE) m_nSize : (FX_FILESIZE)m_nCurSize;

+    }

+    virtual FX_BOOL				IsEOF()

+    {

+        return m_nCurPos >= (size_t)GetSize();

+    }

+    virtual FX_FILESIZE			GetPosition()

+    {

+        FX_FILESIZE pos = (FX_FILESIZE)m_nCurPos;

+        if (m_bUseRange) {

+            pos -= (FX_FILESIZE)m_nOffset;

+        }

+        return pos;

+    }

+    virtual FX_BOOL				SetRange(FX_FILESIZE offset, FX_FILESIZE size)

+    {

+        if (offset < 0 || (size_t)(offset + size) > m_nCurSize) {

+            return FALSE;

+        }

+        m_nOffset = (size_t)offset, m_nSize = (size_t)size;

+        m_bUseRange = TRUE;

+        m_nCurPos = m_nOffset;

+        return TRUE;

+    }

+    virtual void				ClearRange()

+    {

+        m_bUseRange = FALSE;

+    }

+    virtual FX_BOOL				ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)

+    {

+        if (!buffer || !size) {

+            return FALSE;

+        }

+        if (m_bUseRange) {

+            offset += (FX_FILESIZE)m_nOffset;

+        }

+        if ((size_t)offset + size > m_nCurSize) {

+            return FALSE;

+        }

+        m_nCurPos = (size_t)offset + size;

+        if (m_dwFlags & FX_MEMSTREAM_Consecutive) {

+            FXSYS_memcpy32(buffer, (FX_LPBYTE)m_Blocks[0] + (size_t)offset, size);

+            return TRUE;

+        }

+        size_t nStartBlock = (size_t)offset / m_nGrowSize;

+        offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);

+        while (size) {

+            size_t nRead = m_nGrowSize - (size_t)offset;

+            if (nRead > size) {

+                nRead = size;

+            }

+            FXSYS_memcpy32(buffer, (FX_LPBYTE)m_Blocks[(int)nStartBlock] + (size_t)offset, nRead);

+            buffer = ((FX_LPBYTE)buffer) + nRead;

+            size -= nRead;

+            nStartBlock ++;

+            offset = 0;

+        }

+        return TRUE;

+    }

+    virtual size_t				ReadBlock(void* buffer, size_t size)

+    {

+        if (m_nCurPos >= m_nCurSize) {

+            return 0;

+        }

+        if (m_bUseRange) {

+            size_t availSize = m_nOffset + m_nSize - m_nCurPos;

+            if (availSize < size) {

+                size -= size - (size_t)availSize;

+            }

+        }

+        size_t nRead = FX_MIN(size, m_nCurSize - m_nCurPos);

+        if (!ReadBlock(buffer, (FX_INT32)m_nCurPos, nRead)) {

+            return 0;

+        }

+        return nRead;

+    }

+    virtual	FX_BOOL				WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size)

+    {

+        if (!buffer || !size) {

+            return FALSE;

+        }

+        if (m_bUseRange) {

+            offset += (FX_FILESIZE)m_nOffset;

+        }

+        if (m_dwFlags & FX_MEMSTREAM_Consecutive) {

+            m_nCurPos = (size_t)offset + size;

+            if (m_nCurPos > m_nTotalSize) {

+                IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;

+                m_nTotalSize = (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize;

+                if (m_Blocks.GetSize() < 1) {

+                    void* block = FX_Allocator_Alloc(pAllocator, FX_BYTE, m_nTotalSize);

+                    m_Blocks.Add(block);

+                } else {

+                    m_Blocks[0] = FX_Allocator_Realloc(pAllocator, FX_BYTE, m_Blocks[0], m_nTotalSize);

+                }

+                if (!m_Blocks[0]) {

+                    m_Blocks.RemoveAll();

+                    return FALSE;

+                }

+            }

+            FXSYS_memcpy32((FX_LPBYTE)m_Blocks[0] + (size_t)offset, buffer, size);

+            if (m_nCurSize < m_nCurPos) {

+                m_nCurSize = m_nCurPos;

+            }

+            return TRUE;

+        }

+        if (!ExpandBlocks((size_t)offset + size)) {

+            return FALSE;

+        }

+        m_nCurPos = (size_t)offset + size;

+        size_t nStartBlock = (size_t)offset / m_nGrowSize;

+        offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);

+        while (size) {

+            size_t nWrite = m_nGrowSize - (size_t)offset;

+            if (nWrite > size) {

+                nWrite = size;

+            }

+            FXSYS_memcpy32((FX_LPBYTE)m_Blocks[(int)nStartBlock] + (size_t)offset, buffer, nWrite);

+            buffer = ((FX_LPBYTE)buffer) + nWrite;

+            size -= nWrite;

+            nStartBlock ++;

+            offset = 0;

+        }

+        return TRUE;

+    }

+    virtual FX_BOOL				Flush()

+    {

+        return TRUE;

+    }

+    virtual FX_BOOL				IsConsecutive() const

+    {

+        return m_dwFlags & FX_MEMSTREAM_Consecutive;

+    }

+    virtual void				EstimateSize(size_t nInitSize, size_t nGrowSize)

+    {

+        if (m_dwFlags & FX_MEMSTREAM_Consecutive) {

+            if (m_Blocks.GetSize() < 1) {

+                FX_LPBYTE pBlock = FX_Allocator_Alloc(m_Blocks.m_pAllocator, FX_BYTE, FX_MAX(nInitSize, 4096));

+                if (pBlock) {

+                    m_Blocks.Add(pBlock);

+                }

+            }

+            m_nGrowSize = FX_MAX(nGrowSize, 4096);

+        } else if (m_Blocks.GetSize() < 1) {

+            m_nGrowSize = FX_MAX(nGrowSize, 4096);

+        }

+    }

+    virtual FX_LPBYTE			GetBuffer() const

+    {

+        return m_Blocks.GetSize() ? (FX_LPBYTE)m_Blocks[0] : NULL;

+    }

+    virtual void				AttachBuffer(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE)

+    {

+        if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {

+            return;

+        }

+        m_Blocks.RemoveAll();

+        m_Blocks.Add(pBuffer);

+        m_nTotalSize = m_nCurSize = nSize;

+        m_nCurPos = 0;

+        m_dwFlags = FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);

+        ClearRange();

+    }

+    virtual void				DetachBuffer()

+    {

+        if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {

+            return;

+        }

+        m_Blocks.RemoveAll();

+        m_nTotalSize = m_nCurSize = m_nCurPos = 0;

+        m_dwFlags = FX_MEMSTREAM_TakeOver;

+        ClearRange();

+    }

+protected:

+    CFX_PtrArray	m_Blocks;

+    FX_DWORD		m_dwCount;

+    size_t			m_nTotalSize;

+    size_t			m_nCurSize;

+    size_t			m_nCurPos;

+    size_t			m_nGrowSize;

+    FX_DWORD		m_dwFlags;

+    FX_BOOL			m_bUseRange;

+    size_t			m_nOffset;

+    size_t			m_nSize;

+    FX_BOOL	ExpandBlocks(size_t size)

+    {

+        if (m_nCurSize < size) {

+            m_nCurSize = size;

+        }

+        if (size <= m_nTotalSize) {

+            return TRUE;

+        }

+        FX_INT32 iCount = m_Blocks.GetSize();

+        size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize;

+        m_Blocks.SetSize(m_Blocks.GetSize() + (FX_INT32)size, -1);

+        IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;

+        while (size --) {

+            FX_LPBYTE pBlock = FX_Allocator_Alloc(pAllocator, FX_BYTE, m_nGrowSize);

+            if (!pBlock) {

+                return FALSE;

+            }

+            m_Blocks.SetAt(iCount ++, pBlock);

+            m_nTotalSize += m_nGrowSize;

+        }

+        return TRUE;

+    }

+};

+#ifdef __cplusplus

+extern "C" {

+#endif

+#define MT_N			848

+#define MT_M			456

+#define MT_Matrix_A		0x9908b0df

+#define MT_Upper_Mask	0x80000000

+#define MT_Lower_Mask	0x7fffffff

+typedef struct _FX_MTRANDOMCONTEXT {

+    _FX_MTRANDOMCONTEXT()

+    {

+        mti = MT_N + 1;

+        bHaveSeed = FALSE;

+    }

+    FX_DWORD mti;

+    FX_BOOL	 bHaveSeed;

+    FX_DWORD mt[MT_N];

+} FX_MTRANDOMCONTEXT, * FX_LPMTRANDOMCONTEXT;

+typedef FX_MTRANDOMCONTEXT const * FX_LPCMTRANDOMCONTEXT;

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+FX_BOOL FX_GenerateCryptoRandom(FX_LPDWORD pBuffer, FX_INT32 iCount);

+#endif

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/core/src/fxcrt/fx_arabic.cpp b/core/src/fxcrt/fx_arabic.cpp
new file mode 100644
index 0000000..583ce81
--- /dev/null
+++ b/core/src/fxcrt/fx_arabic.cpp
@@ -0,0 +1,86 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "fx_arabic.h"
+extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536];
+IFX_BidiChar* IFX_BidiChar::Create()
+{
+    return FX_NEW CFX_BidiChar;
+}
+CFX_BidiChar::CFX_BidiChar()
+    : m_bSeparateNeutral(TRUE)
+    , m_iCurStart(0)
+    , m_iCurCount(0)
+    , m_iCurBidi(0)
+    , m_iLastBidi(0)
+    , m_iLastStart(0)
+    , m_iLastCount(0)
+{
+}
+FX_BOOL CFX_BidiChar::AppendChar(FX_WCHAR wch)
+{
+    FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
+    FX_INT32 iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
+    FX_INT32 iContext = 0;
+    switch (iBidiCls) {
+        case FX_BIDICLASS_L:
+        case FX_BIDICLASS_AN:
+        case FX_BIDICLASS_EN:
+            iContext = 1;
+            break;
+        case FX_BIDICLASS_R:
+        case FX_BIDICLASS_AL:
+            iContext = 2;
+            break;
+    }
+    FX_BOOL bRet = FALSE;
+    if (iContext != m_iCurBidi) {
+        if (m_bSeparateNeutral) {
+            bRet = TRUE;
+        } else {
+            if (m_iCurBidi == 0) {
+                bRet = (m_iCurCount > 0);
+            } else {
+                bRet = (iContext != 0);
+            }
+        }
+        if (bRet) {
+            m_iLastBidi = m_iCurBidi;
+            m_iLastStart = m_iCurStart;
+            m_iCurStart = m_iCurCount;
+            m_iLastCount = m_iCurCount - m_iLastStart;
+        }
+        if (m_bSeparateNeutral || iContext != 0) {
+            m_iCurBidi = iContext;
+        }
+    }
+    m_iCurCount ++;
+    return bRet;
+}
+FX_BOOL CFX_BidiChar::EndChar()
+{
+    m_iLastBidi = m_iCurBidi;
+    m_iLastStart = m_iCurStart;
+    m_iCurStart = m_iCurCount;
+    m_iLastCount = m_iCurCount - m_iLastStart;
+    return m_iLastCount > 0;
+}
+FX_INT32 CFX_BidiChar::GetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount)
+{
+    iStart = m_iLastStart;
+    iCount = m_iLastCount;
+    return m_iLastBidi;
+}
+void CFX_BidiChar::Reset()
+{
+    m_iCurStart = 0;
+    m_iCurCount = 0;
+    m_iCurBidi = 0;
+    m_iLastBidi = 0;
+    m_iLastStart = 0;
+    m_iLastCount = 0;
+}
diff --git a/core/src/fxcrt/fx_arabic.h b/core/src/fxcrt/fx_arabic.h
new file mode 100644
index 0000000..503ec01
--- /dev/null
+++ b/core/src/fxcrt/fx_arabic.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_ARABIC_IMP
+#define _FX_ARABIC_IMP
+class CFX_BidiChar : public IFX_BidiChar, public CFX_Object
+{
+public:
+    CFX_BidiChar();
+    virtual void		Release()
+    {
+        delete this;
+    }
+    virtual void		SetPolicy(FX_BOOL bSeparateNeutral = TRUE)
+    {
+        m_bSeparateNeutral = bSeparateNeutral;
+    }
+    virtual FX_BOOL		AppendChar(FX_WCHAR wch);
+    virtual FX_BOOL		EndChar();
+    virtual FX_INT32	GetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount);
+    virtual void		Reset();
+protected:
+    FX_BOOL		m_bSeparateNeutral;
+    FX_INT32	m_iCurStart;
+    FX_INT32	m_iCurCount;
+    FX_INT32	m_iCurBidi;
+    FX_INT32	m_iLastBidi;
+    FX_INT32	m_iLastStart;
+    FX_INT32	m_iLastCount;
+};
+#endif
diff --git a/core/src/fxcrt/fx_basic_array.cpp b/core/src/fxcrt/fx_basic_array.cpp
new file mode 100644
index 0000000..36857ce
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_array.cpp
@@ -0,0 +1,365 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_basic.h"

+CFX_BasicArray::CFX_BasicArray(int unit_size, IFX_Allocator* pAllocator)

+    : m_pAllocator(pAllocator)

+    , m_pData(NULL)

+    , m_nSize(0)

+    , m_nMaxSize(0)

+    , m_nGrowBy(0)

+{

+    if (unit_size < 0 || unit_size > (1 << 28)) {

+        m_nUnitSize = 4;

+    } else {

+        m_nUnitSize = unit_size;

+    }

+}

+CFX_BasicArray::~CFX_BasicArray()

+{

+    FX_Allocator_Free(m_pAllocator, m_pData);

+}

+FX_BOOL CFX_BasicArray::SetSize(int nNewSize, int nGrowBy)

+{

+    if (nNewSize < 0 || nNewSize > (1 << 28) / m_nUnitSize) {

+        m_pData = NULL;

+        m_nSize = m_nMaxSize = 0;

+        return FALSE;

+    }

+    if (nGrowBy >= 0) {

+        m_nGrowBy = nGrowBy;

+    }

+    if (nNewSize == 0) {

+        if (m_pData != NULL) {

+            FX_Allocator_Free(m_pAllocator, m_pData);

+            m_pData = NULL;

+        }

+        m_nSize = m_nMaxSize = 0;

+    } else if (m_pData == NULL) {

+        m_pData = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, nNewSize * m_nUnitSize);

+        if (!m_pData) {

+            m_nSize = m_nMaxSize = 0;

+            return FALSE;

+        }

+        FXSYS_memset32(m_pData, 0, nNewSize * m_nUnitSize);

+        m_nSize = m_nMaxSize = nNewSize;

+    } else if (nNewSize <= m_nMaxSize) {

+        if (nNewSize > m_nSize) {

+            FXSYS_memset32(m_pData + m_nSize * m_nUnitSize, 0, (nNewSize - m_nSize) * m_nUnitSize);

+        }

+        m_nSize = nNewSize;

+    } else {

+        int nGrowBy = m_nGrowBy;

+        if (nGrowBy == 0) {

+            nGrowBy = m_nSize / 8;

+            nGrowBy = (nGrowBy < 4) ? 4 : ((nGrowBy > 1024) ? 1024 : nGrowBy);

+        }

+        int nNewMax;

+        if (nNewSize < m_nMaxSize + nGrowBy) {

+            nNewMax = m_nMaxSize + nGrowBy;

+        } else {

+            nNewMax = nNewSize;

+        }

+        FX_LPBYTE pNewData = FX_Allocator_Realloc(m_pAllocator, FX_BYTE, m_pData, nNewMax * m_nUnitSize);

+        if (pNewData == NULL) {

+            return FALSE;

+        }

+        FXSYS_memset32(pNewData + m_nSize * m_nUnitSize, 0, (nNewMax - m_nSize) * m_nUnitSize);

+        m_pData = pNewData;

+        m_nSize = nNewSize;

+        m_nMaxSize = nNewMax;

+    }

+    return TRUE;

+}

+FX_BOOL CFX_BasicArray::Append(const CFX_BasicArray& src)

+{

+    int nOldSize = m_nSize;

+    if (!SetSize(m_nSize + src.m_nSize, -1)) {

+        return FALSE;

+    }

+    FXSYS_memcpy32(m_pData + nOldSize * m_nUnitSize, src.m_pData, src.m_nSize * m_nUnitSize);

+    return TRUE;

+}

+FX_BOOL CFX_BasicArray::Copy(const CFX_BasicArray& src)

+{

+    if (!SetSize(src.m_nSize, -1)) {

+        return FALSE;

+    }

+    FXSYS_memcpy32(m_pData, src.m_pData, src.m_nSize * m_nUnitSize);

+    return TRUE;

+}

+FX_LPBYTE CFX_BasicArray::InsertSpaceAt(int nIndex, int nCount)

+{

+    if (nIndex < 0 || nCount <= 0) {

+        return NULL;

+    }

+    if (nIndex >= m_nSize) {

+        if (!SetSize(nIndex + nCount, -1)) {

+            return NULL;

+        }

+    } else {

+        int nOldSize = m_nSize;

+        if (!SetSize(m_nSize + nCount, -1)) {

+            return NULL;

+        }

+        FXSYS_memmove32(m_pData + (nIndex + nCount)*m_nUnitSize, m_pData + nIndex * m_nUnitSize,

+                        (nOldSize - nIndex) * m_nUnitSize);

+        FXSYS_memset32(m_pData + nIndex * m_nUnitSize, 0, nCount * m_nUnitSize);

+    }

+    return m_pData + nIndex * m_nUnitSize;

+}

+FX_BOOL CFX_BasicArray::RemoveAt(int nIndex, int nCount)

+{

+    if (nIndex < 0 || nCount <= 0 || m_nSize < nIndex + nCount) {

+        return FALSE;

+    }

+    int nMoveCount = m_nSize - (nIndex + nCount);

+    if (nMoveCount) {

+        FXSYS_memmove32(m_pData + nIndex * m_nUnitSize, m_pData + (nIndex + nCount) * m_nUnitSize, nMoveCount * m_nUnitSize);

+    }

+    m_nSize -= nCount;

+    return TRUE;

+}

+FX_BOOL CFX_BasicArray::InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray)

+{

+    if (pNewArray == NULL) {

+        return FALSE;

+    }

+    if (pNewArray->m_nSize == 0) {

+        return TRUE;

+    }

+    if (!InsertSpaceAt(nStartIndex, pNewArray->m_nSize)) {

+        return FALSE;

+    }

+    FXSYS_memcpy32(m_pData + nStartIndex * m_nUnitSize, pNewArray->m_pData, pNewArray->m_nSize * m_nUnitSize);

+    return TRUE;

+}

+const void* CFX_BasicArray::GetDataPtr(int index) const

+{

+    if (index < 0 || index >= m_nSize || m_pData == NULL) {

+        return NULL;

+    }

+    return m_pData + index * m_nUnitSize;

+}

+CFX_BaseSegmentedArray::CFX_BaseSegmentedArray(int unit_size, int segment_units, int index_size, IFX_Allocator* pAllocator)

+    : m_pAllocator(pAllocator)

+    , m_UnitSize(unit_size)

+    , m_SegmentSize(segment_units)

+    , m_IndexSize(index_size)

+    , m_IndexDepth(0)

+    , m_DataSize(0)

+    , m_pIndex(NULL)

+{

+}

+void CFX_BaseSegmentedArray::SetUnitSize(int unit_size, int segment_units, int index_size)

+{

+    ASSERT(m_DataSize == 0);

+    m_UnitSize = unit_size;

+    m_SegmentSize = segment_units;

+    m_IndexSize = index_size;

+}

+CFX_BaseSegmentedArray::~CFX_BaseSegmentedArray()

+{

+    RemoveAll();

+}

+static void _ClearIndex(IFX_Allocator* pAllcator, int level, int size, void** pIndex)

+{

+    if (level == 0) {

+        FX_Allocator_Free(pAllcator, pIndex);

+        return;

+    }

+    for (int i = 0; i < size; i ++) {

+        if (pIndex[i] == NULL) {

+            continue;

+        }

+        _ClearIndex(pAllcator, level - 1, size, (void**)pIndex[i]);

+    }

+    FX_Allocator_Free(pAllcator, pIndex);

+}

+void CFX_BaseSegmentedArray::RemoveAll()

+{

+    if (m_pIndex == NULL) {

+        return;

+    }

+    _ClearIndex(m_pAllocator, m_IndexDepth, m_IndexSize, (void**)m_pIndex);

+    m_pIndex = NULL;

+    m_IndexDepth = 0;

+    m_DataSize = 0;

+}

+void* CFX_BaseSegmentedArray::Add()

+{

+    if (m_DataSize % m_SegmentSize) {

+        return GetAt(m_DataSize ++);

+    }

+    void* pSegment = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_UnitSize * m_SegmentSize);

+    if (!pSegment) {

+        return NULL;

+    }

+    if (m_pIndex == NULL) {

+        m_pIndex = pSegment;

+        m_DataSize ++;

+        return pSegment;

+    }

+    if (m_IndexDepth == 0) {

+        void** pIndex = (void**)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);

+        if (pIndex == NULL) {

+            FX_Allocator_Free(m_pAllocator, pSegment);

+            return NULL;

+        }

+        FXSYS_memset32(pIndex, 0, sizeof(void*) * m_IndexSize);

+        pIndex[0] = m_pIndex;

+        pIndex[1] = pSegment;

+        m_pIndex = pIndex;

+        m_DataSize ++;

+        m_IndexDepth ++;

+        return pSegment;

+    }

+    int seg_index = m_DataSize / m_SegmentSize;

+    if (seg_index % m_IndexSize) {

+        void** pIndex = GetIndex(seg_index);

+        pIndex[seg_index % m_IndexSize] = pSegment;

+        m_DataSize ++;

+        return pSegment;

+    }

+    int tree_size = 1;

+    int i;

+    for (i = 0; i < m_IndexDepth; i ++) {

+        tree_size *= m_IndexSize;

+    }

+    if (m_DataSize == tree_size * m_SegmentSize) {

+        void** pIndex = (void**)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);

+        if (pIndex == NULL) {

+            FX_Allocator_Free(m_pAllocator, pSegment);

+            return NULL;

+        }

+        FXSYS_memset32(pIndex, 0, sizeof(void*) * m_IndexSize);

+        pIndex[0] = m_pIndex;

+        m_pIndex = pIndex;

+        m_IndexDepth ++;

+    } else {

+        tree_size /= m_IndexSize;

+    }

+    void** pSpot = (void**)m_pIndex;

+    for (i = 1; i < m_IndexDepth; i ++) {

+        if (pSpot[seg_index / tree_size] == NULL) {

+            pSpot[seg_index / tree_size] = (void*)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);

+            if (pSpot[seg_index / tree_size] == NULL) {

+                break;

+            }

+            FXSYS_memset32(pSpot[seg_index / tree_size], 0, sizeof(void*) * m_IndexSize);

+        }

+        pSpot = (void**)pSpot[seg_index / tree_size];

+        seg_index = seg_index % tree_size;

+        tree_size /= m_IndexSize;

+    }

+    if (i < m_IndexDepth) {

+        FX_Allocator_Free(m_pAllocator, pSegment);

+        RemoveAll();

+        return NULL;

+    }

+    pSpot[seg_index % m_IndexSize] = pSegment;

+    m_DataSize ++;

+    return pSegment;

+}

+void** CFX_BaseSegmentedArray::GetIndex(int seg_index) const

+{

+    ASSERT(m_IndexDepth != 0);

+    if (m_IndexDepth == 1) {

+        return (void**)m_pIndex;

+    } else if (m_IndexDepth == 2) {

+        return (void**)((void**)m_pIndex)[seg_index / m_IndexSize];

+    }

+    int tree_size = 1;

+    int i;

+    for (i = 1; i < m_IndexDepth; i ++) {

+        tree_size *= m_IndexSize;

+    }

+    void** pSpot = (void**)m_pIndex;

+    for (i = 1; i < m_IndexDepth; i ++) {

+        pSpot = (void**)pSpot[seg_index / tree_size];

+        seg_index = seg_index % tree_size;

+        tree_size /= m_IndexSize;

+    }

+    return pSpot;

+}

+void* CFX_BaseSegmentedArray::IterateSegment(FX_LPCBYTE pSegment, int count, FX_BOOL (*callback)(void* param, void* pData), void* param) const

+{

+    for (int i = 0; i < count; i ++) {

+        if (!callback(param, (void*)(pSegment + i * m_UnitSize))) {

+            return (void*)(pSegment + i * m_UnitSize);

+        }

+    }

+    return NULL;

+}

+void* CFX_BaseSegmentedArray::IterateIndex(int level, int& start, void** pIndex, FX_BOOL (*callback)(void* param, void* pData), void* param) const

+{

+    if (level == 0) {

+        int count = m_DataSize - start;

+        if (count > m_SegmentSize) {

+            count = m_SegmentSize;

+        }

+        start += count;

+        return IterateSegment((FX_LPCBYTE)pIndex, count, callback, param);

+    }

+    for (int i = 0; i < m_IndexSize; i ++) {

+        if (pIndex[i] == NULL) {

+            continue;

+        }

+        void* p = IterateIndex(level - 1, start, (void**)pIndex[i], callback, param);

+        if (p) {

+            return p;

+        }

+    }

+    return NULL;

+}

+void* CFX_BaseSegmentedArray::Iterate(FX_BOOL (*callback)(void* param, void* pData), void* param) const

+{

+    if (m_pIndex == NULL) {

+        return NULL;

+    }

+    int start = 0;

+    return IterateIndex(m_IndexDepth, start, (void**)m_pIndex, callback, param);

+}

+void* CFX_BaseSegmentedArray::GetAt(int index) const

+{

+    if (index < 0 || index >= m_DataSize) {

+        return NULL;

+    }

+    if (m_IndexDepth == 0) {

+        return (FX_LPBYTE)m_pIndex + m_UnitSize * index;

+    }

+    int seg_index = index / m_SegmentSize;

+    return (FX_LPBYTE)GetIndex(seg_index)[seg_index % m_IndexSize] + (index % m_SegmentSize) * m_UnitSize;

+}

+void CFX_BaseSegmentedArray::Delete(int index, int count)

+{

+    if(index < 0 || count < 1 || index + count > m_DataSize) {

+        return;

+    }

+    int i;

+    for (i = index; i < m_DataSize - count; i ++) {

+        FX_BYTE* pSrc = (FX_BYTE*)GetAt(i + count);

+        FX_BYTE* pDest = (FX_BYTE*)GetAt(i);

+        for (int j = 0; j < m_UnitSize; j ++) {

+            pDest[j] = pSrc[j];

+        }

+    }

+    int new_segs = (m_DataSize - count + m_SegmentSize - 1) / m_SegmentSize;

+    int old_segs = (m_DataSize + m_SegmentSize - 1) / m_SegmentSize;

+    if (new_segs < old_segs) {

+        if(m_IndexDepth) {

+            for (i = new_segs; i < old_segs; i ++) {

+                void** pIndex = GetIndex(i);

+                FX_Allocator_Free(m_pAllocator, pIndex[i % m_IndexSize]);

+                pIndex[i % m_IndexSize] = NULL;

+            }

+        } else {

+            FX_Allocator_Free(m_pAllocator, m_pIndex);

+            m_pIndex = NULL;

+        }

+    }

+    m_DataSize -= count;

+}

diff --git a/core/src/fxcrt/fx_basic_bstring.cpp b/core/src/fxcrt/fx_basic_bstring.cpp
new file mode 100644
index 0000000..f28b069
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_bstring.cpp
@@ -0,0 +1,1204 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_basic.h"

+static int _Buffer_itoa(char* buf, int i, FX_DWORD flags)

+{

+    if (i == 0) {

+        buf[0] = '0';

+        return 1;

+    }

+    char buf1[32];

+    int buf_pos = 31;

+    FX_DWORD u = i;

+    if ((flags & FXFORMAT_SIGNED) && i < 0) {

+        u = -i;

+    }

+    int base = 10;

+    FX_LPCSTR string = "0123456789abcdef";

+    if (flags & FXFORMAT_HEX) {

+        base = 16;

+        if (flags & FXFORMAT_CAPITAL) {

+            string = "0123456789ABCDEF";

+        }

+    }

+    while (u != 0) {

+        buf1[buf_pos--] = string[u % base];

+        u = u / base;

+    }

+    if ((flags & FXFORMAT_SIGNED) && i < 0) {

+        buf1[buf_pos--] = '-';

+    }

+    int len = 31 - buf_pos;

+    for (int ii = 0; ii < len; ii ++) {

+        buf[ii] = buf1[ii + buf_pos + 1];

+    }

+    return len;

+}

+CFX_ByteString CFX_ByteString::FormatInteger(int i, FX_DWORD flags)

+{

+    char buf[32];

+    return CFX_ByteStringC(buf, _Buffer_itoa(buf, i, flags));

+}

+static CFX_StringData* FX_AllocString(int nLen)

+{

+    if (nLen == 0) {

+        return NULL;

+    }

+    CFX_StringData* pData = (CFX_StringData*)FX_Alloc(FX_BYTE, sizeof(long) * 3 + (nLen + 1) * sizeof(char));

+    if (!pData) {

+        return NULL;

+    }

+    pData->m_nAllocLength = nLen;

+    pData->m_nDataLength = nLen;

+    pData->m_nRefs = 1;

+    pData->m_String[nLen] = 0;

+    return pData;

+}

+static void FX_ReleaseString(CFX_StringData* pData)

+{

+    if (pData == NULL) {

+        return;

+    }

+    pData->m_nRefs --;

+    if (pData->m_nRefs <= 0) {

+        FX_Free(pData);

+    }

+}

+CFX_ByteString::~CFX_ByteString()

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    m_pData->m_nRefs --;

+    if (m_pData->m_nRefs < 1) {

+        FX_Free(m_pData);

+    }

+}

+CFX_ByteString::CFX_ByteString(FX_LPCSTR lpsz, FX_STRSIZE nLen)

+{

+    if (nLen < 0) {

+        nLen = lpsz ? (FX_STRSIZE)FXSYS_strlen(lpsz) : 0;

+    }

+    if (nLen) {

+        m_pData = FX_AllocString(nLen);

+        if (m_pData) {

+            FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(char));

+        }

+    } else {

+        m_pData = NULL;

+    }

+}

+CFX_ByteString::CFX_ByteString(FX_LPCBYTE lpsz, FX_STRSIZE nLen)

+{

+    if (nLen > 0) {

+        m_pData = FX_AllocString(nLen);

+        if (m_pData) {

+            FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(char));

+        }

+    } else {

+        m_pData = NULL;

+    }

+}

+CFX_ByteString::CFX_ByteString(char ch)

+{

+    m_pData = FX_AllocString(1);

+    if (m_pData) {

+        m_pData->m_String[0] = ch;

+    }

+}

+CFX_ByteString::CFX_ByteString(const CFX_ByteString& stringSrc)

+{

+    if (stringSrc.m_pData == NULL) {

+        m_pData = NULL;

+        return;

+    }

+    if (stringSrc.m_pData->m_nRefs >= 0) {

+        m_pData = stringSrc.m_pData;

+        m_pData->m_nRefs ++;

+    } else {

+        m_pData = NULL;

+        *this = stringSrc;

+    }

+}

+CFX_ByteString::CFX_ByteString(FX_BSTR stringSrc)

+{

+    if (stringSrc.IsEmpty()) {

+        m_pData = NULL;

+        return;

+    } else {

+        m_pData = NULL;

+        *this = stringSrc;

+    }

+}

+CFX_ByteString::CFX_ByteString(FX_BSTR str1, FX_BSTR str2)

+{

+    m_pData = NULL;

+    int nNewLen = str1.GetLength() + str2.GetLength();

+    if (nNewLen == 0) {

+        return;

+    }

+    m_pData = FX_AllocString(nNewLen);

+    if (m_pData) {

+        FXSYS_memcpy32(m_pData->m_String, str1.GetCStr(), str1.GetLength());

+        FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetCStr(), str2.GetLength());

+    }

+}

+const CFX_ByteString& CFX_ByteString::operator=(FX_LPCSTR lpsz)

+{

+    if (lpsz == NULL || lpsz[0] == 0) {

+        Empty();

+    } else {

+        AssignCopy((FX_STRSIZE)FXSYS_strlen(lpsz), lpsz);

+    }

+    return *this;

+}

+const CFX_ByteString& CFX_ByteString::operator=(FX_BSTR str)

+{

+    if (str.IsEmpty()) {

+        Empty();

+    } else {

+        AssignCopy(str.GetLength(), str.GetCStr());

+    }

+    return *this;

+}

+const CFX_ByteString& CFX_ByteString::operator=(const CFX_ByteString& stringSrc)

+{

+    if (m_pData == stringSrc.m_pData) {

+        return *this;

+    }

+    if (stringSrc.IsEmpty()) {

+        Empty();

+    } else if ((m_pData && m_pData->m_nRefs < 0) ||

+               (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) {

+        AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String);

+    } else {

+        Empty();

+        m_pData = stringSrc.m_pData;

+        if (m_pData) {

+            m_pData->m_nRefs ++;

+        }

+    }

+    return *this;

+}

+const CFX_ByteString& CFX_ByteString::operator=(const CFX_BinaryBuf& buf)

+{

+    Load(buf.GetBuffer(), buf.GetSize());

+    return *this;

+}

+void CFX_ByteString::Load(FX_LPCBYTE buf, FX_STRSIZE len)

+{

+    Empty();

+    if (len) {

+        m_pData = FX_AllocString(len);

+        if (m_pData) {

+            FXSYS_memcpy32(m_pData->m_String, buf, len * sizeof(char));

+        }

+    } else {

+        m_pData = NULL;

+    }

+}

+const CFX_ByteString& CFX_ByteString::operator+=(FX_LPCSTR lpsz)

+{

+    if (lpsz) {

+        ConcatInPlace((FX_STRSIZE)FXSYS_strlen(lpsz), lpsz);

+    }

+    return *this;

+}

+const CFX_ByteString& CFX_ByteString::operator+=(char ch)

+{

+    ConcatInPlace(1, &ch);

+    return *this;

+}

+const CFX_ByteString& CFX_ByteString::operator+=(const CFX_ByteString& string)

+{

+    if (string.m_pData == NULL) {

+        return *this;

+    }

+    ConcatInPlace(string.m_pData->m_nDataLength, string.m_pData->m_String);

+    return *this;

+}

+const CFX_ByteString& CFX_ByteString::operator+=(FX_BSTR string)

+{

+    if (string.IsEmpty()) {

+        return *this;

+    }

+    ConcatInPlace(string.GetLength(), string.GetCStr());

+    return *this;

+}

+bool CFX_ByteString::Equal(FX_BSTR str) const

+{

+    if (m_pData == NULL) {

+        return str.IsEmpty();

+    }

+    return m_pData->m_nDataLength == str.GetLength() &&

+           FXSYS_memcmp32(m_pData->m_String, str.GetCStr(), str.GetLength()) == 0;

+}

+bool CFX_ByteString::operator ==(const CFX_ByteString& s2) const

+{

+    if (m_pData == NULL) {

+        return s2.IsEmpty();

+    }

+    if (s2.m_pData == NULL) {

+        return false;

+    }

+    return m_pData->m_nDataLength == s2.m_pData->m_nDataLength &&

+           FXSYS_memcmp32(m_pData->m_String, s2.m_pData->m_String, m_pData->m_nDataLength) == 0;

+}

+void CFX_ByteString::Empty()

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    if (m_pData->m_nRefs > 1) {

+        m_pData->m_nRefs --;

+    } else {

+        FX_Free(m_pData);

+    }

+    m_pData = NULL;

+}

+bool CFX_ByteString::EqualNoCase(FX_BSTR str) const

+{

+    if (m_pData == NULL) {

+        return str.IsEmpty();

+    }

+    FX_STRSIZE len = str.GetLength();

+    if (m_pData->m_nDataLength != len) {

+        return false;

+    }

+    FX_LPCBYTE pThis = (FX_LPCBYTE)m_pData->m_String;

+    FX_LPCBYTE pThat = (FX_LPCBYTE)str;

+    for (FX_STRSIZE i = 0; i < len; i ++) {

+        if ((*pThis) != (*pThat)) {

+            FX_BYTE bThis = *pThis;

+            if (bThis >= 'A' && bThis <= 'Z') {

+                bThis += 'a' - 'A';

+            }

+            FX_BYTE bThat = *pThat;

+            if (bThat >= 'A' && bThat <= 'Z') {

+                bThat += 'a' - 'A';

+            }

+            if (bThis != bThat) {

+                return false;

+            }

+        }

+        pThis ++;

+        pThat ++;

+    }

+    return true;

+}

+void CFX_ByteString::AssignCopy(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData)

+{

+    AllocBeforeWrite(nSrcLen);

+    FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(char));

+    m_pData->m_nDataLength = nSrcLen;

+    m_pData->m_String[nSrcLen] = 0;

+}

+void CFX_ByteString::CopyBeforeWrite()

+{

+    if (m_pData == NULL || m_pData->m_nRefs <= 1) {

+        return;

+    }

+    CFX_StringData* pData = m_pData;

+    m_pData->m_nRefs --;

+    FX_STRSIZE nDataLength = pData->m_nDataLength;

+    m_pData = FX_AllocString(nDataLength);

+    if (m_pData != NULL) {

+        FXSYS_memcpy32(m_pData->m_String, pData->m_String, (nDataLength + 1) * sizeof(char));

+    }

+}

+void CFX_ByteString::AllocBeforeWrite(FX_STRSIZE nLen)

+{

+    if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) {

+        return;

+    }

+    Empty();

+    m_pData = FX_AllocString(nLen);

+}

+void CFX_ByteString::ReleaseBuffer(FX_STRSIZE nNewLength)

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    CopyBeforeWrite();

+    if (nNewLength == -1) {

+        nNewLength = (FX_STRSIZE)FXSYS_strlen((FX_LPCSTR)m_pData->m_String);

+    }

+    if (nNewLength == 0) {

+        Empty();

+        return;

+    }

+    FXSYS_assert(nNewLength <= m_pData->m_nAllocLength);

+    m_pData->m_nDataLength = nNewLength;

+    m_pData->m_String[nNewLength] = 0;

+}

+FX_LPSTR CFX_ByteString::LockBuffer()

+{

+    if (m_pData == NULL) {

+        return NULL;

+    }

+    FX_LPSTR lpsz = GetBuffer(0);

+    m_pData->m_nRefs = -1;

+    return lpsz;

+}

+void CFX_ByteString::Reserve(FX_STRSIZE len)

+{

+    GetBuffer(len);

+    ReleaseBuffer(GetLength());

+}

+FX_LPSTR CFX_ByteString::GetBuffer(FX_STRSIZE nMinBufLength)

+{

+    if (m_pData == NULL && nMinBufLength == 0) {

+        return NULL;

+    }

+    if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLength) {

+        return m_pData->m_String;

+    }

+    if (m_pData == NULL) {

+        m_pData = FX_AllocString(nMinBufLength);

+        if (!m_pData) {

+            return NULL;

+        }

+        m_pData->m_nDataLength = 0;

+        m_pData->m_String[0] = 0;

+        return m_pData->m_String;

+    }

+    CFX_StringData* pOldData = m_pData;

+    FX_STRSIZE nOldLen = pOldData->m_nDataLength;

+    if (nMinBufLength < nOldLen) {

+        nMinBufLength = nOldLen;

+    }

+    m_pData = FX_AllocString(nMinBufLength);

+    if (!m_pData) {

+        return NULL;

+    }

+    FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1)*sizeof(char));

+    m_pData->m_nDataLength = nOldLen;

+    pOldData->m_nRefs --;

+    if (pOldData->m_nRefs <= 0) {

+        FX_Free(pOldData);

+    }

+    return m_pData->m_String;

+}

+FX_STRSIZE CFX_ByteString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount)

+{

+    if (m_pData == NULL) {

+        return 0;

+    }

+    if (nIndex < 0) {

+        nIndex = 0;

+    }

+    FX_STRSIZE nOldLength = m_pData->m_nDataLength;

+    if (nCount > 0 && nIndex < nOldLength) {

+        FX_STRSIZE mLength = nIndex + nCount;

+        if (mLength >= nOldLength) {

+            m_pData->m_nDataLength = nIndex;

+            return m_pData->m_nDataLength;

+        }

+        CopyBeforeWrite();

+        int nBytesToCopy = nOldLength - mLength + 1;

+        FXSYS_memmove32(m_pData->m_String + nIndex,

+                        m_pData->m_String + mLength, nBytesToCopy * sizeof(char));

+        m_pData->m_nDataLength = nOldLength - nCount;

+    }

+    return m_pData->m_nDataLength;

+}

+void CFX_ByteString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData)

+{

+    if (nSrcLen == 0 || lpszSrcData == NULL) {

+        return;

+    }

+    if (m_pData == NULL) {

+        m_pData = FX_AllocString(nSrcLen);

+        if (!m_pData) {

+            return;

+        }

+        FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(char));

+        return;

+    }

+    if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nAllocLength) {

+        CFX_StringData* pOldData = m_pData;

+        ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcData);

+        FX_ReleaseString(pOldData);

+    } else {

+        FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData, nSrcLen * sizeof(char));

+        m_pData->m_nDataLength += nSrcLen;

+        m_pData->m_String[m_pData->m_nDataLength] = 0;

+    }

+}

+void CFX_ByteString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data,

+                                FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data)

+{

+    int nNewLen = nSrc1Len + nSrc2Len;

+    if (nNewLen == 0) {

+        return;

+    }

+    m_pData = FX_AllocString(nNewLen);

+    if (m_pData) {

+        FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len * sizeof(char));

+        FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len * sizeof(char));

+    }

+}

+CFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst) const

+{

+    if (m_pData == NULL) {

+        return CFX_ByteString();

+    }

+    return Mid(nFirst, m_pData->m_nDataLength - nFirst);

+}

+CFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const

+{

+    if (nFirst < 0) {

+        nFirst = 0;

+    }

+    if (nCount < 0) {

+        nCount = 0;

+    }

+    if (nFirst + nCount > m_pData->m_nDataLength) {

+        nCount = m_pData->m_nDataLength - nFirst;

+    }

+    if (nFirst > m_pData->m_nDataLength) {

+        nCount = 0;

+    }

+    if (nFirst == 0 && nFirst + nCount == m_pData->m_nDataLength) {

+        return *this;

+    }

+    CFX_ByteString dest;

+    AllocCopy(dest, nCount, nFirst, 0);

+    return dest;

+}

+void CFX_ByteString::AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex,

+                               FX_STRSIZE nExtraLen) const

+{

+    FX_STRSIZE nNewLen = nCopyLen + nExtraLen;

+    if (nNewLen == 0) {

+        return;

+    }

+    ASSERT(dest.m_pData == NULL);

+    dest.m_pData = FX_AllocString(nNewLen);

+    if (dest.m_pData) {

+        FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, nCopyLen * sizeof(char));

+    }

+}

+#define FORCE_ANSI      0x10000

+#define FORCE_UNICODE   0x20000

+#define FORCE_INT64     0x40000

+void CFX_ByteString::FormatV(FX_LPCSTR lpszFormat, va_list argList)

+{

+    va_list argListSave;

+#if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__)

+    va_copy(argListSave, argList);

+#else

+    argListSave = argList;

+#endif

+    int nMaxLen = 0;

+    for (FX_LPCSTR lpsz = lpszFormat; *lpsz != 0; lpsz ++) {

+        if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') {

+            nMaxLen += (FX_STRSIZE)FXSYS_strlen(lpsz);

+            continue;

+        }

+        int nItemLen = 0;

+        int nWidth = 0;

+        for (; *lpsz != 0; lpsz ++) {

+            if (*lpsz == '#') {

+                nMaxLen += 2;

+            } else if (*lpsz == '*') {

+                nWidth = va_arg(argList, int);

+            } else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' ||

+                       *lpsz == ' ')

+                ;

+            else {

+                break;

+            }

+        }

+        if (nWidth == 0) {

+            nWidth = FXSYS_atoi(lpsz);

+            for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)

+                ;

+        }

+        if (nWidth < 0 || nWidth > 128 * 1024) {

+            lpszFormat = "Bad width";

+            nMaxLen = 10;

+            break;

+        }

+        int nPrecision = 0;

+        if (*lpsz == '.') {

+            lpsz ++;

+            if (*lpsz == '*') {

+                nPrecision = va_arg(argList, int);

+                lpsz ++;

+            } else {

+                nPrecision = FXSYS_atoi(lpsz);

+                for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)

+                    ;

+            }

+        }

+        if (nPrecision < 0 || nPrecision > 128 * 1024) {

+            lpszFormat = "Bad precision";

+            nMaxLen = 14;

+            break;

+        }

+        int nModifier = 0;

+        if (FXSYS_strncmp(lpsz, "I64", 3) == 0) {

+            lpsz += 3;

+            nModifier = FORCE_INT64;

+        } else {

+            switch (*lpsz) {

+                case 'h':

+                    nModifier = FORCE_ANSI;

+                    lpsz ++;

+                    break;

+                case 'l':

+                    nModifier = FORCE_UNICODE;

+                    lpsz ++;

+                    break;

+                case 'F':

+                case 'N':

+                case 'L':

+                    lpsz ++;

+                    break;

+            }

+        }

+        switch (*lpsz | nModifier) {

+            case 'c':

+            case 'C':

+                nItemLen = 2;

+                va_arg(argList, int);

+                break;

+            case 'c'|FORCE_ANSI:

+            case 'C'|FORCE_ANSI:

+                nItemLen = 2;

+                va_arg(argList, int);

+                break;

+            case 'c'|FORCE_UNICODE:

+            case 'C'|FORCE_UNICODE:

+                nItemLen = 2;

+                va_arg(argList, int);

+                break;

+            case 's': {

+                    FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);

+                    if (pstrNextArg == NULL) {

+                        nItemLen = 6;

+                    } else {

+                        nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);

+                        if (nItemLen < 1) {

+                            nItemLen = 1;

+                        }

+                    }

+                }

+                break;

+            case 'S': {

+                    FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);

+                    if (pstrNextArg == NULL) {

+                        nItemLen = 6;

+                    } else {

+                        nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);

+                        if (nItemLen < 1) {

+                            nItemLen = 1;

+                        }

+                    }

+                }

+                break;

+            case 's'|FORCE_ANSI:

+            case 'S'|FORCE_ANSI: {

+                    FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);

+                    if (pstrNextArg == NULL) {

+                        nItemLen = 6;

+                    } else {

+                        nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);

+                        if (nItemLen < 1) {

+                            nItemLen = 1;

+                        }

+                    }

+                }

+                break;

+            case 's'|FORCE_UNICODE:

+            case 'S'|FORCE_UNICODE: {

+                    FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);

+                    if (pstrNextArg == NULL) {

+                        nItemLen = 6;

+                    } else {

+                        nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);

+                        if (nItemLen < 1) {

+                            nItemLen = 1;

+                        }

+                    }

+                }

+                break;

+        }

+        if (nItemLen != 0) {

+            if (nPrecision != 0 && nItemLen > nPrecision) {

+                nItemLen = nPrecision;

+            }

+            if (nItemLen < nWidth) {

+                nItemLen = nWidth;

+            }

+        } else {

+            switch (*lpsz) {

+                case 'd':

+                case 'i':

+                case 'u':

+                case 'x':

+                case 'X':

+                case 'o':

+                    if (nModifier & FORCE_INT64) {

+                        va_arg(argList, FX_INT64);

+                    } else {

+                        va_arg(argList, int);

+                    }

+                    nItemLen = 32;

+                    if (nItemLen < nWidth + nPrecision) {

+                        nItemLen = nWidth + nPrecision;

+                    }

+                    break;

+                case 'a':

+                case 'A':

+                case 'e':

+                case 'E':

+                case 'g':

+                case 'G':

+                    va_arg(argList, double);

+                    nItemLen = 128;

+                    if (nItemLen < nWidth + nPrecision) {

+                        nItemLen = nWidth + nPrecision;

+                    }

+                    break;

+                case 'f':

+                    if (nWidth + nPrecision > 100) {

+                        nItemLen = nPrecision + nWidth + 128;

+                    } else {

+                        double f;

+                        char pszTemp[256];

+                        f = va_arg(argList, double);

+                        FXSYS_sprintf(pszTemp, "%*.*f", nWidth, nPrecision + 6, f );

+                        nItemLen = (FX_STRSIZE)FXSYS_strlen(pszTemp);

+                    }

+                    break;

+                case 'p':

+                    va_arg(argList, void*);

+                    nItemLen = 32;

+                    if (nItemLen < nWidth + nPrecision) {

+                        nItemLen = nWidth + nPrecision;

+                    }

+                    break;

+                case 'n':

+                    va_arg(argList, int*);

+                    break;

+            }

+        }

+        nMaxLen += nItemLen;

+    }

+    GetBuffer(nMaxLen);

+    if (m_pData) {

+        FXSYS_vsprintf(m_pData->m_String, lpszFormat, argListSave);

+        ReleaseBuffer();

+    }

+    va_end(argListSave);

+}

+void CFX_ByteString::Format(FX_LPCSTR lpszFormat, ...)

+{

+    va_list argList;

+    va_start(argList, lpszFormat);

+    FormatV(lpszFormat, argList);

+    va_end(argList);

+}

+FX_STRSIZE CFX_ByteString::Insert(FX_STRSIZE nIndex, FX_CHAR ch)

+{

+    CopyBeforeWrite();

+    if (nIndex < 0) {

+        nIndex = 0;

+    }

+    FX_STRSIZE nNewLength = m_pData ? m_pData->m_nDataLength : 0;

+    if (nIndex > nNewLength) {

+        nIndex = nNewLength;

+    }

+    nNewLength++;

+    if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) {

+        CFX_StringData* pOldData = m_pData;

+        FX_LPCSTR pstr = m_pData->m_String;

+        m_pData = FX_AllocString(nNewLength);

+        if (!m_pData) {

+            return 0;

+        }

+        if(pOldData != NULL) {

+            FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength + 1)*sizeof(char));

+            FX_ReleaseString(pOldData);

+        } else {

+            m_pData->m_String[0] = 0;

+        }

+    }

+    FXSYS_memmove32(m_pData->m_String + nIndex + 1,

+                    m_pData->m_String + nIndex, (nNewLength - nIndex)*sizeof(char));

+    m_pData->m_String[nIndex] = ch;

+    m_pData->m_nDataLength = nNewLength;

+    return nNewLength;

+}

+CFX_ByteString CFX_ByteString::Right(FX_STRSIZE nCount) const

+{

+    if (m_pData == NULL) {

+        return CFX_ByteString();

+    }

+    if (nCount < 0) {

+        nCount = 0;

+    }

+    if (nCount >= m_pData->m_nDataLength) {

+        return *this;

+    }

+    CFX_ByteString dest;

+    AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount, 0);

+    return dest;

+}

+CFX_ByteString CFX_ByteString::Left(FX_STRSIZE nCount) const

+{

+    if (m_pData == NULL) {

+        return CFX_ByteString();

+    }

+    if (nCount < 0) {

+        nCount = 0;

+    }

+    if (nCount >= m_pData->m_nDataLength) {

+        return *this;

+    }

+    CFX_ByteString dest;

+    AllocCopy(dest, nCount, 0, 0);

+    return dest;

+}

+FX_STRSIZE CFX_ByteString::Find(FX_CHAR ch, FX_STRSIZE nStart) const

+{

+    if (m_pData == NULL) {

+        return -1;

+    }

+    FX_STRSIZE nLength = m_pData->m_nDataLength;

+    if (nStart >= nLength) {

+        return -1;

+    }

+    FX_LPCSTR lpsz = FXSYS_strchr(m_pData->m_String + nStart, ch);

+    return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);

+}

+FX_STRSIZE CFX_ByteString::ReverseFind(FX_CHAR ch) const

+{

+    if (m_pData == NULL) {

+        return -1;

+    }

+    FX_STRSIZE nLength = m_pData->m_nDataLength;

+    while (nLength) {

+        if (m_pData->m_String[nLength - 1] == ch) {

+            return nLength - 1;

+        }

+        nLength --;

+    }

+    return -1;

+}

+FX_LPCSTR FX_strstr(FX_LPCSTR str1, int len1, FX_LPCSTR str2, int len2)

+{

+    if (len2 > len1 || len2 == 0) {

+        return NULL;

+    }

+    FX_LPCSTR end_ptr = str1 + len1 - len2;

+    while (str1 <= end_ptr) {

+        int i = 0;

+        while (1) {

+            if (str1[i] != str2[i]) {

+                break;

+            }

+            i ++;

+            if (i == len2) {

+                return str1;

+            }

+        }

+        str1 ++;

+    }

+    return NULL;

+}

+FX_STRSIZE CFX_ByteString::Find(FX_BSTR lpszSub, FX_STRSIZE nStart) const

+{

+    if (m_pData == NULL) {

+        return -1;

+    }

+    FX_STRSIZE nLength = m_pData->m_nDataLength;

+    if (nStart > nLength) {

+        return -1;

+    }

+    FX_LPCSTR lpsz = FX_strstr(m_pData->m_String + nStart, m_pData->m_nDataLength - nStart,

+                               lpszSub.GetCStr(), lpszSub.GetLength());

+    return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);

+}

+void CFX_ByteString::MakeLower()

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    CopyBeforeWrite();

+    if (GetLength() < 1) {

+        return;

+    }

+    FXSYS_strlwr(m_pData->m_String);

+}

+void CFX_ByteString::MakeUpper()

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    CopyBeforeWrite();

+    if (GetLength() < 1) {

+        return;

+    }

+    FXSYS_strupr(m_pData->m_String);

+}

+FX_STRSIZE CFX_ByteString::Remove(FX_CHAR chRemove)

+{

+    if (m_pData == NULL) {

+        return 0;

+    }

+    CopyBeforeWrite();

+    if (GetLength() < 1) {

+        return 0;

+    }

+    FX_LPSTR pstrSource = m_pData->m_String;

+    FX_LPSTR pstrDest = m_pData->m_String;

+    FX_LPSTR pstrEnd = m_pData->m_String + m_pData->m_nDataLength;

+    while (pstrSource < pstrEnd) {

+        if (*pstrSource != chRemove) {

+            *pstrDest = *pstrSource;

+            pstrDest ++;

+        }

+        pstrSource ++;

+    }

+    *pstrDest = 0;

+    FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest);

+    m_pData->m_nDataLength -= nCount;

+    return nCount;

+}

+FX_STRSIZE CFX_ByteString::Replace(FX_BSTR lpszOld, FX_BSTR lpszNew)

+{

+    if (m_pData == NULL) {

+        return 0;

+    }

+    if (lpszOld.IsEmpty()) {

+        return 0;

+    }

+    FX_STRSIZE nSourceLen = lpszOld.GetLength();

+    FX_STRSIZE nReplacementLen = lpszNew.GetLength();

+    FX_STRSIZE nCount = 0;

+    FX_LPCSTR pStart = m_pData->m_String;

+    FX_LPSTR pEnd = m_pData->m_String + m_pData->m_nDataLength;

+    while (1) {

+        FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszOld.GetCStr(), nSourceLen);

+        if (pTarget == NULL) {

+            break;

+        }

+        nCount++;

+        pStart = pTarget + nSourceLen;

+    }

+    if (nCount == 0) {

+        return 0;

+    }

+    FX_STRSIZE nNewLength =  m_pData->m_nDataLength + (nReplacementLen - nSourceLen) * nCount;

+    if (nNewLength == 0) {

+        Empty();

+        return nCount;

+    }

+    CFX_StringData* pNewData = FX_AllocString(nNewLength);

+    if (!pNewData) {

+        return 0;

+    }

+    pStart = m_pData->m_String;

+    FX_LPSTR pDest = pNewData->m_String;

+    for (FX_STRSIZE i = 0; i < nCount; i ++) {

+        FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszOld.GetCStr(), nSourceLen);

+        FXSYS_memcpy32(pDest, pStart, pTarget - pStart);

+        pDest += pTarget - pStart;

+        FXSYS_memcpy32(pDest, lpszNew.GetCStr(), lpszNew.GetLength());

+        pDest += lpszNew.GetLength();

+        pStart = pTarget + nSourceLen;

+    }

+    FXSYS_memcpy32(pDest, pStart, pEnd - pStart);

+    FX_ReleaseString(m_pData);

+    m_pData = pNewData;

+    return nCount;

+}

+void CFX_ByteString::SetAt(FX_STRSIZE nIndex, FX_CHAR ch)

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    FXSYS_assert(nIndex >= 0);

+    FXSYS_assert(nIndex < m_pData->m_nDataLength);

+    CopyBeforeWrite();

+    m_pData->m_String[nIndex] = ch;

+}

+CFX_ByteString CFX_ByteString::LoadFromFile(FX_BSTR filename)

+{

+    FXSYS_FILE* file = FXSYS_fopen(CFX_ByteString(filename), "rb");

+    if (file == NULL) {

+        return CFX_ByteString();

+    }

+    FXSYS_fseek(file, 0, FXSYS_SEEK_END);

+    int len = FXSYS_ftell(file);

+    FXSYS_fseek(file, 0, FXSYS_SEEK_SET);

+    CFX_ByteString str;

+    FX_LPSTR buf = str.GetBuffer(len);

+    size_t readCnt = FXSYS_fread(buf, 1, len, file);

+    str.ReleaseBuffer(len);

+    FXSYS_fclose(file);

+    return str;

+}

+CFX_WideString CFX_ByteString::UTF8Decode() const

+{

+    CFX_UTF8Decoder decoder;

+    for (FX_STRSIZE i = 0; i < GetLength(); i ++) {

+        decoder.Input((FX_BYTE)m_pData->m_String[i]);

+    }

+    return decoder.GetResult();

+}

+CFX_ByteString CFX_ByteString::FromUnicode(FX_LPCWSTR str, FX_STRSIZE len)

+{

+    if (len < 0) {

+        len = (FX_STRSIZE)FXSYS_wcslen(str);

+    }

+    CFX_ByteString bstr;

+    bstr.ConvertFrom(CFX_WideString(str, len));

+    return bstr;

+}

+CFX_ByteString CFX_ByteString::FromUnicode(const CFX_WideString& str)

+{

+    return FromUnicode((FX_LPCWSTR)str, str.GetLength());

+}

+void CFX_ByteString::ConvertFrom(const CFX_WideString& str, CFX_CharMap* pCharMap)

+{

+    if (pCharMap == NULL) {

+        pCharMap = CFX_CharMap::GetDefaultMapper();

+    }

+    *this = (*pCharMap->m_GetByteString)(pCharMap, str);

+}

+int CFX_ByteString::Compare(FX_BSTR str) const

+{

+    if (m_pData == NULL) {

+        return str.IsEmpty() ? 0 : -1;

+    }

+    int this_len = m_pData->m_nDataLength;

+    int that_len = str.GetLength();

+    int min_len = this_len < that_len ? this_len : that_len;

+    for (int i = 0; i < min_len; i ++) {

+        if ((FX_BYTE)m_pData->m_String[i] < str.GetAt(i)) {

+            return -1;

+        } else if ((FX_BYTE)m_pData->m_String[i] > str.GetAt(i)) {

+            return 1;

+        }

+    }

+    if (this_len < that_len) {

+        return -1;

+    } else if (this_len > that_len) {

+        return 1;

+    }

+    return 0;

+}

+void CFX_ByteString::TrimRight(FX_BSTR lpszTargets)

+{

+    if (m_pData == NULL || lpszTargets.IsEmpty()) {

+        return;

+    }

+    CopyBeforeWrite();

+    FX_STRSIZE pos = GetLength();

+    if (pos < 1) {

+        return;

+    }

+    while (pos) {

+        FX_STRSIZE i = 0;

+        while (i < lpszTargets.GetLength() && lpszTargets[i] != m_pData->m_String[pos - 1]) {

+            i ++;

+        }

+        if (i == lpszTargets.GetLength()) {

+            break;

+        }

+        pos --;

+    }

+    if (pos < m_pData->m_nDataLength) {

+        m_pData->m_String[pos] = 0;

+        m_pData->m_nDataLength = pos;

+    }

+}

+void CFX_ByteString::TrimRight(FX_CHAR chTarget)

+{

+    TrimRight(CFX_ByteStringC(chTarget));

+}

+void CFX_ByteString::TrimRight()

+{

+    TrimRight(FX_BSTRC("\x09\x0a\x0b\x0c\x0d\x20"));

+}

+void CFX_ByteString::TrimLeft(FX_BSTR lpszTargets)

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    if (lpszTargets.IsEmpty()) {

+        return;

+    }

+    CopyBeforeWrite();

+    FX_STRSIZE len = GetLength();

+    if (len < 1) {

+        return;

+    }

+    FX_STRSIZE pos = 0;

+    while (pos < len) {

+        FX_STRSIZE i = 0;

+        while (i < lpszTargets.GetLength() && lpszTargets[i] != m_pData->m_String[pos]) {

+            i ++;

+        }

+        if (i == lpszTargets.GetLength()) {

+            break;

+        }

+        pos ++;

+    }

+    if (pos) {

+        FX_STRSIZE nDataLength = len - pos;

+        FXSYS_memmove32(m_pData->m_String, m_pData->m_String + pos, (nDataLength + 1)*sizeof(FX_CHAR));

+        m_pData->m_nDataLength = nDataLength;

+    }

+}

+void CFX_ByteString::TrimLeft(FX_CHAR chTarget)

+{

+    TrimLeft(CFX_ByteStringC(chTarget));

+}

+void CFX_ByteString::TrimLeft()

+{

+    TrimLeft(FX_BSTRC("\x09\x0a\x0b\x0c\x0d\x20"));

+}

+FX_DWORD CFX_ByteString::GetID(FX_STRSIZE start_pos) const

+{

+    return CFX_ByteStringC(*this).GetID(start_pos);

+}

+FX_DWORD CFX_ByteStringC::GetID(FX_STRSIZE start_pos) const

+{

+    if (m_Length == 0) {

+        return 0;

+    }

+    if (start_pos >= m_Length) {

+        return 0;

+    }

+    FX_DWORD strid = 0;

+    if (start_pos + 4 > m_Length) {

+        for (FX_STRSIZE i = 0; i < m_Length - start_pos; i ++) {

+            strid = strid * 256 + m_Ptr[start_pos + i];

+        }

+        strid = strid << ((4 - m_Length + start_pos) * 8);

+    } else {

+        for (int i = 0; i < 4; i ++) {

+            strid = strid * 256 + m_Ptr[start_pos + i];

+        }

+    }

+    return strid;

+}

+FX_STRSIZE FX_ftoa(FX_FLOAT d, FX_LPSTR buf)

+{

+    buf[0] = '0';

+    buf[1] = '\0';

+    if (d == 0.0f) {

+        return 1;

+    }

+    FX_BOOL bNegative = FALSE;

+    if (d < 0) {

+        bNegative = TRUE;

+        d = -d;

+    }

+    int scale = 1;

+    int scaled = FXSYS_round(d);

+    while (scaled < 100000) {

+        if (scale == 1000000) {

+            break;

+        }

+        scale *= 10;

+        scaled = FXSYS_round(d * scale);

+    }

+    if (scaled == 0) {

+        return 1;

+    }

+    char buf2[32];

+    int buf_size = 0;

+    if (bNegative) {

+        buf[buf_size++] = '-';

+    }

+    int i = scaled / scale;

+    FXSYS_itoa(i, buf2, 10);

+    FX_STRSIZE len = (FX_STRSIZE)FXSYS_strlen(buf2);

+    FXSYS_memcpy32(buf + buf_size, buf2, len);

+    buf_size += len;

+    int fraction = scaled % scale;

+    if (fraction == 0) {

+        return buf_size;

+    }

+    buf[buf_size++] = '.';

+    scale /= 10;

+    while (fraction) {

+        buf[buf_size++] = '0' + fraction / scale;

+        fraction %= scale;

+        scale /= 10;

+    }

+    return buf_size;

+}

+CFX_ByteString CFX_ByteString::FormatFloat(FX_FLOAT d, int precision)

+{

+    FX_CHAR buf[32];

+    FX_STRSIZE len = FX_ftoa(d, buf);

+    return CFX_ByteString(buf, len);

+}

+void CFX_StringBufBase::Copy(FX_BSTR str)

+{

+    m_Size = str.GetLength();

+    if (m_Size > m_Limit) {

+        m_Size = m_Limit;

+    }

+    FX_CHAR* pBuffer = (FX_CHAR*)(this + 1);

+    FXSYS_memcpy32(pBuffer, str.GetPtr(), m_Size);

+}

+void CFX_StringBufBase::Append(FX_BSTR str)

+{

+    int len = str.GetLength();

+    if (len > m_Limit - m_Size) {

+        len = m_Limit - m_Size;

+    }

+    FX_CHAR* pBuffer = (FX_CHAR*)(this + 1);

+    FXSYS_memcpy32(pBuffer + m_Size, str.GetPtr(), len);

+    m_Size += len;

+}

+void CFX_StringBufBase::Append(int i, FX_DWORD flags)

+{

+    char buf[32];

+    int len = _Buffer_itoa(buf, i, flags);

+    Append(CFX_ByteStringC(buf, len));

+}

+void CFX_ByteStringL::Empty(IFX_Allocator* pAllocator)

+{

+    if (m_Ptr) {

+        FX_Allocator_Free(pAllocator, (FX_LPVOID)m_Ptr);

+    }

+    m_Ptr = NULL, m_Length = 0;

+}

+FX_LPSTR CFX_ByteStringL::AllocBuffer(FX_STRSIZE length, IFX_Allocator* pAllocator)

+{

+    Empty(pAllocator);

+    FX_LPSTR str = FX_Allocator_Alloc(pAllocator, FX_CHAR, length + 1);

+    if (!str) {

+        return NULL;

+    }

+    *(FX_LPSTR*)(&m_Ptr) = str;

+    m_Length = length;

+    return str;

+}

+void CFX_ByteStringL::Set(FX_BSTR src, IFX_Allocator* pAllocator)

+{

+    Empty(pAllocator);

+    if (src.GetCStr() != NULL && src.GetLength() > 0) {

+        FX_LPSTR str = FX_Allocator_Alloc(pAllocator, FX_CHAR, src.GetLength() + 1);

+        if (!str) {

+            return;

+        }

+        FXSYS_memcpy32(str, src, src.GetLength());

+        str[src.GetLength()] = '\0';

+        *(FX_LPSTR*)(&m_Ptr) = str;

+        m_Length = src.GetLength();

+    }

+}

diff --git a/core/src/fxcrt/fx_basic_buffer.cpp b/core/src/fxcrt/fx_basic_buffer.cpp
new file mode 100644
index 0000000..ef3cd21
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_buffer.cpp
@@ -0,0 +1,574 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_basic.h"

+FX_STRSIZE FX_ftoa(FX_FLOAT f, FX_LPSTR buf);

+CFX_BinaryBuf::CFX_BinaryBuf(IFX_Allocator* pAllocator)

+    : m_pAllocator(pAllocator)

+    , m_AllocStep(0)

+    , m_pBuffer(NULL)

+    , m_DataSize(0)

+    , m_AllocSize(0)

+{

+}

+CFX_BinaryBuf::CFX_BinaryBuf(FX_STRSIZE size, IFX_Allocator* pAllocator)

+    : m_pAllocator(pAllocator)

+    , m_AllocStep(0)

+    , m_DataSize(size)

+    , m_AllocSize(size)

+{

+    m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, size);

+}

+CFX_BinaryBuf::~CFX_BinaryBuf()

+{

+    if (m_pBuffer) {

+        FX_Allocator_Free(m_pAllocator, m_pBuffer);

+    }

+}

+void CFX_BinaryBuf::Delete(int start_index, int count)

+{

+    if (!m_pBuffer || start_index < 0 || start_index + count > m_DataSize) {

+        return;

+    }

+    FXSYS_memmove32(m_pBuffer + start_index, m_pBuffer + start_index + count, m_DataSize - start_index - count);

+    m_DataSize -= count;

+}

+void CFX_BinaryBuf::Clear()

+{

+    m_DataSize = 0;

+}

+void CFX_BinaryBuf::DetachBuffer()

+{

+    m_DataSize = 0;

+    m_pBuffer = NULL;

+    m_AllocSize = 0;

+}

+void CFX_BinaryBuf::AttachData(void* buffer, FX_STRSIZE size)

+{

+    if (m_pBuffer) {

+        FX_Allocator_Free(m_pAllocator, m_pBuffer);

+    }

+    m_DataSize = size;

+    m_pBuffer = (FX_LPBYTE)buffer;

+    m_AllocSize = size;

+}

+void CFX_BinaryBuf::TakeOver(CFX_BinaryBuf& other)

+{

+    AttachData(other.GetBuffer(), other.GetSize());

+    other.DetachBuffer();

+}

+void CFX_BinaryBuf::EstimateSize(FX_STRSIZE size, FX_STRSIZE step)

+{

+    m_AllocStep = step;

+    if (m_AllocSize >= size) {

+        return;

+    }

+    ExpandBuf(size - m_DataSize);

+}

+void CFX_BinaryBuf::ExpandBuf(FX_STRSIZE add_size)

+{

+    FX_STRSIZE new_size = add_size + m_DataSize;

+    if (m_AllocSize >= new_size) {

+        return;

+    }

+    int alloc_step;

+    if (m_AllocStep == 0) {

+        alloc_step = m_AllocSize / 4;

+        if (alloc_step < 128 ) {

+            alloc_step = 128;

+        }

+    } else {

+        alloc_step = m_AllocStep;

+    }

+    new_size = (new_size + alloc_step - 1) / alloc_step * alloc_step;

+    FX_LPBYTE pNewBuffer = m_pBuffer;

+    if (pNewBuffer) {

+        pNewBuffer = FX_Allocator_Realloc(m_pAllocator, FX_BYTE, m_pBuffer, new_size);

+    } else {

+        pNewBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, new_size);

+    }

+    if (pNewBuffer) {

+        m_pBuffer = pNewBuffer;

+        m_AllocSize = new_size;

+    }

+}

+void CFX_BinaryBuf::CopyData(const void* pStr, FX_STRSIZE size)

+{

+    if (size == 0) {

+        m_DataSize = 0;

+        return;

+    }

+    if (m_AllocSize < size) {

+        ExpandBuf(size - m_DataSize);

+    }

+    if (!m_pBuffer) {

+        return;

+    }

+    FXSYS_memcpy32(m_pBuffer, pStr, size);

+    m_DataSize = size;

+}

+void CFX_BinaryBuf::AppendBlock(const void* pBuf, FX_STRSIZE size)

+{

+    ExpandBuf(size);

+    if (pBuf && m_pBuffer) {

+        FXSYS_memcpy32(m_pBuffer + m_DataSize, pBuf, size);

+    }

+    m_DataSize += size;

+}

+void CFX_BinaryBuf::InsertBlock(FX_STRSIZE pos, const void* pBuf, FX_STRSIZE size)

+{

+    ExpandBuf(size);

+    if (!m_pBuffer) {

+        return;

+    }

+    FXSYS_memmove32(m_pBuffer + pos + size, m_pBuffer + pos, m_DataSize - pos);

+    if (pBuf) {

+        FXSYS_memcpy32(m_pBuffer + pos, pBuf, size);

+    }

+    m_DataSize += size;

+}

+void CFX_BinaryBuf::AppendFill(FX_BYTE byte, FX_STRSIZE count)

+{

+    ExpandBuf(count);

+    if (!m_pBuffer) {

+        return;

+    }

+    FXSYS_memset8(m_pBuffer + m_DataSize, byte, count);

+    m_DataSize += count;

+}

+CFX_ByteStringC CFX_BinaryBuf::GetByteString() const

+{

+    return CFX_ByteStringC(m_pBuffer, m_DataSize);

+}

+void CFX_BinaryBuf::GetByteStringL(CFX_ByteStringL &str) const

+{

+    str.Set(CFX_ByteStringC(m_pBuffer, m_DataSize), m_pAllocator);

+}

+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (FX_BSTR lpsz)

+{

+    AppendBlock((FX_LPCBYTE)lpsz, lpsz.GetLength());

+    return *this;

+}

+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (int i)

+{

+    char buf[32];

+    FXSYS_itoa(i, buf, 10);

+    AppendBlock(buf, (FX_STRSIZE)FXSYS_strlen(buf));

+    return *this;

+}

+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (FX_DWORD i)

+{

+    char buf[32];

+    FXSYS_itoa(i, buf, 10);

+    AppendBlock(buf, (FX_STRSIZE)FXSYS_strlen(buf));

+    return *this;

+}

+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (double f)

+{

+    char buf[32];

+    FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf);

+    AppendBlock(buf, len);

+    return *this;

+}

+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (const CFX_ByteTextBuf& buf)

+{

+    AppendBlock(buf.m_pBuffer, buf.m_DataSize);

+    return *this;

+}

+void CFX_ByteTextBuf::operator =(const CFX_ByteStringC& str)

+{

+    CopyData((FX_LPCBYTE)str, str.GetLength());

+}

+void CFX_WideTextBuf::AppendChar(FX_WCHAR ch)

+{

+    if (m_AllocSize < m_DataSize + (FX_STRSIZE)sizeof(FX_WCHAR)) {

+        ExpandBuf(sizeof(FX_WCHAR));

+    }

+    ASSERT(m_pBuffer != NULL);

+    *(FX_WCHAR*)(m_pBuffer + m_DataSize) = ch;

+    m_DataSize += sizeof(FX_WCHAR);

+}

+CFX_WideTextBuf& CFX_WideTextBuf::operator << (FX_WSTR str)

+{

+    AppendBlock(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR));

+    return *this;

+}

+CFX_WideTextBuf& CFX_WideTextBuf::operator << (const CFX_WideString &str)

+{

+    AppendBlock((FX_LPCWSTR)str, str.GetLength() * sizeof(FX_WCHAR));

+    return *this;

+}

+CFX_WideTextBuf& CFX_WideTextBuf::operator << (int i)

+{

+    char buf[32];

+    FXSYS_itoa(i, buf, 10);

+    FX_STRSIZE len = (FX_STRSIZE)FXSYS_strlen(buf);

+    if (m_AllocSize < m_DataSize + (FX_STRSIZE)(len * sizeof(FX_WCHAR))) {

+        ExpandBuf(len * sizeof(FX_WCHAR));

+    }

+    ASSERT(m_pBuffer != NULL);

+    FX_LPWSTR str = (FX_WCHAR*)(m_pBuffer + m_DataSize);

+    for (FX_STRSIZE j = 0; j < len; j ++) {

+        *str ++ = buf[j];

+    }

+    m_DataSize += len * sizeof(FX_WCHAR);

+    return *this;

+}

+CFX_WideTextBuf& CFX_WideTextBuf::operator << (double f)

+{

+    char buf[32];

+    FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf);

+    if (m_AllocSize < m_DataSize + (FX_STRSIZE)(len * sizeof(FX_WCHAR))) {

+        ExpandBuf(len * sizeof(FX_WCHAR));

+    }

+    ASSERT(m_pBuffer != NULL);

+    FX_LPWSTR str = (FX_WCHAR*)(m_pBuffer + m_DataSize);

+    for (FX_STRSIZE i = 0; i < len; i ++) {

+        *str ++ = buf[i];

+    }

+    m_DataSize += len * sizeof(FX_WCHAR);

+    return *this;

+}

+CFX_WideTextBuf& CFX_WideTextBuf::operator << (FX_LPCWSTR lpsz)

+{

+    AppendBlock(lpsz, (FX_STRSIZE)FXSYS_wcslen(lpsz)*sizeof(FX_WCHAR));

+    return *this;

+}

+CFX_WideTextBuf& CFX_WideTextBuf::operator << (const CFX_WideTextBuf& buf)

+{

+    AppendBlock(buf.m_pBuffer, buf.m_DataSize);

+    return *this;

+}

+void CFX_WideTextBuf::operator =(FX_WSTR str)

+{

+    CopyData(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR));

+}

+CFX_WideStringC CFX_WideTextBuf::GetWideString() const

+{

+    return CFX_WideStringC((FX_LPCWSTR)m_pBuffer, m_DataSize / sizeof(FX_WCHAR));

+}

+void CFX_WideTextBuf::GetWideStringL(CFX_WideStringL& wideText) const

+{

+    wideText.Set(CFX_WideStringC((FX_LPCWSTR)m_pBuffer, m_DataSize / sizeof(FX_WCHAR)), m_pAllocator);

+}

+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_BYTE i)

+{

+    if (m_pStream) {

+        m_pStream->WriteBlock(&i, 1);

+    } else {

+        m_SavingBuf.AppendByte(i);

+    }

+    return *this;

+}

+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (int i)

+{

+    if (m_pStream) {

+        m_pStream->WriteBlock(&i, sizeof(int));

+    } else {

+        m_SavingBuf.AppendBlock(&i, sizeof(int));

+    }

+    return *this;

+}

+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_DWORD i)

+{

+    if (m_pStream) {

+        m_pStream->WriteBlock(&i, sizeof(FX_DWORD));

+    } else {

+        m_SavingBuf.AppendBlock(&i, sizeof(FX_DWORD));

+    }

+    return *this;

+}

+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_FLOAT f)

+{

+    if (m_pStream) {

+        m_pStream->WriteBlock(&f, sizeof(FX_FLOAT));

+    } else {

+        m_SavingBuf.AppendBlock(&f, sizeof(FX_FLOAT));

+    }

+    return *this;

+}

+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_BSTR bstr)

+{

+    int len = bstr.GetLength();

+    if (m_pStream) {

+        m_pStream->WriteBlock(&len, sizeof(int));

+        m_pStream->WriteBlock(bstr, len);

+    } else {

+        m_SavingBuf.AppendBlock(&len, sizeof(int));

+        m_SavingBuf.AppendBlock(bstr, len);

+    }

+    return *this;

+}

+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_LPCWSTR wstr)

+{

+    FX_STRSIZE len = (FX_STRSIZE)FXSYS_wcslen(wstr);

+    if (m_pStream) {

+        m_pStream->WriteBlock(&len, sizeof(int));

+        m_pStream->WriteBlock(wstr, len);

+    } else {

+        m_SavingBuf.AppendBlock(&len, sizeof(int));

+        m_SavingBuf.AppendBlock(wstr, len);

+    }

+    return *this;

+}

+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (const CFX_WideString& wstr)

+{

+    CFX_ByteString encoded = wstr.UTF16LE_Encode();

+    return operator << (encoded);

+}

+void CFX_ArchiveSaver::Write(const void* pData, FX_STRSIZE dwSize)

+{

+    if (m_pStream) {

+        m_pStream->WriteBlock(pData, dwSize);

+    } else {

+        m_SavingBuf.AppendBlock(pData, dwSize);

+    }

+}

+CFX_ArchiveLoader::CFX_ArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize)

+{

+    m_pLoadingBuf = pData;

+    m_LoadingPos = 0;

+    m_LoadingSize = dwSize;

+}

+FX_BOOL CFX_ArchiveLoader::IsEOF()

+{

+    return m_LoadingPos >= m_LoadingSize;

+}

+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_BYTE& i)

+{

+    if (m_LoadingPos >= m_LoadingSize) {

+        return *this;

+    }

+    i = m_pLoadingBuf[m_LoadingPos++];

+    return *this;

+}

+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (int& i)

+{

+    Read(&i, sizeof(int));

+    return *this;

+}

+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_DWORD& i)

+{

+    Read(&i, sizeof(FX_DWORD));

+    return *this;

+}

+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_FLOAT& i)

+{

+    Read(&i, sizeof(FX_FLOAT));

+    return *this;

+}

+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (CFX_ByteString& str)

+{

+    if (m_LoadingPos + 4 > m_LoadingSize) {

+        return *this;

+    }

+    int len;

+    operator >> (len);

+    str.Empty();

+    if (len <= 0 || m_LoadingPos + len > m_LoadingSize) {

+        return *this;

+    }

+    FX_LPSTR buffer = str.GetBuffer(len);

+    FXSYS_memcpy32(buffer, m_pLoadingBuf + m_LoadingPos, len);

+    str.ReleaseBuffer(len);

+    m_LoadingPos += len;

+    return *this;

+}

+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (CFX_WideString& str)

+{

+    CFX_ByteString encoded;

+    operator >> (encoded);

+    str = CFX_WideString::FromUTF16LE((const unsigned short*)(FX_LPCSTR)encoded, encoded.GetLength());

+    return *this;

+}

+FX_BOOL CFX_ArchiveLoader::Read(void* pBuf, FX_DWORD dwSize)

+{

+    if (m_LoadingPos + dwSize > m_LoadingSize) {

+        return FALSE;

+    }

+    FXSYS_memcpy32(pBuf, m_pLoadingBuf + m_LoadingPos, dwSize);

+    m_LoadingPos += dwSize;

+    return TRUE;

+}

+void CFX_BitStream::Init(FX_LPCBYTE pData, FX_DWORD dwSize)

+{

+    m_pData = pData;

+    m_BitSize = dwSize * 8;

+    m_BitPos = 0;

+}

+void CFX_BitStream::ByteAlign()

+{

+    int mod = m_BitPos % 8;

+    if (mod == 0) {

+        return;

+    }

+    m_BitPos += 8 - mod;

+}

+FX_DWORD CFX_BitStream::GetBits(FX_DWORD nBits)

+{

+    if (nBits > m_BitSize || m_BitPos + nBits > m_BitSize) {

+        return 0;

+    }

+    if (nBits == 1) {

+        int bit = (m_pData[m_BitPos / 8] & (1 << (7 - m_BitPos % 8))) ? 1 : 0;

+        m_BitPos ++;

+        return bit;

+    }

+    FX_DWORD byte_pos = m_BitPos / 8;

+    FX_DWORD bit_pos = m_BitPos % 8, bit_left = nBits;

+    FX_DWORD result = 0;

+    if (bit_pos) {

+        if (8 - bit_pos >= bit_left) {

+            result = (m_pData[byte_pos] & (0xff >> bit_pos)) >> (8 - bit_pos - bit_left);

+            m_BitPos += bit_left;

+            return result;

+        }

+        bit_left -= 8 - bit_pos;

+        result = (m_pData[byte_pos++] & ((1 << (8 - bit_pos)) - 1)) << bit_left;

+    }

+    while (bit_left >= 8) {

+        bit_left -= 8;

+        result |= m_pData[byte_pos++] << bit_left;

+    }

+    if (bit_left) {

+        result |= m_pData[byte_pos] >> (8 - bit_left);

+    }

+    m_BitPos += nBits;

+    return result;

+}

+IFX_BufferArchive::IFX_BufferArchive(FX_STRSIZE size, IFX_Allocator* pAllocator)

+    : m_pAllocator(pAllocator)

+    , m_BufSize(size)

+    , m_pBuffer(NULL)

+    , m_Length(0)

+{

+}

+void IFX_BufferArchive::Clear()

+{

+    m_Length = 0;

+    if (m_pBuffer) {

+        FX_Allocator_Free(m_pAllocator, m_pBuffer);

+        m_pBuffer = NULL;

+    }

+}

+FX_BOOL IFX_BufferArchive::Flush()

+{

+    FX_BOOL bRet = DoWork(m_pBuffer, m_Length);

+    m_Length = 0;

+    return bRet;

+}

+FX_INT32 IFX_BufferArchive::AppendBlock(const void* pBuf, size_t size)

+{

+    if (!pBuf || size < 1) {

+        return 0;

+    }

+    if (!m_pBuffer) {

+        m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_BufSize);

+        if (!m_pBuffer) {

+            return -1;

+        }

+    }

+    FX_LPBYTE buffer = (FX_LPBYTE)pBuf;

+    FX_STRSIZE temp_size = (FX_STRSIZE)size;

+    while (temp_size > 0) {

+        FX_STRSIZE buf_size = FX_MIN(m_BufSize - m_Length, (FX_STRSIZE)temp_size);

+        FXSYS_memcpy32(m_pBuffer + m_Length, buffer, buf_size);

+        m_Length += buf_size;

+        if (m_Length == m_BufSize) {

+            if (!Flush()) {

+                return -1;

+            }

+        }

+        temp_size -= buf_size;

+        buffer += buf_size;

+    }

+    return (FX_INT32)size;

+}

+FX_INT32 IFX_BufferArchive::AppendByte(FX_BYTE byte)

+{

+    return AppendBlock(&byte, 1);

+}

+FX_INT32 IFX_BufferArchive::AppendDWord(FX_DWORD i)

+{

+    char buf[32];

+    FXSYS_itoa(i, buf, 10);

+    return AppendBlock(buf, (size_t)FXSYS_strlen(buf));

+}

+FX_INT32 IFX_BufferArchive::AppendString(FX_BSTR lpsz)

+{

+    return AppendBlock((FX_LPCBYTE)lpsz, lpsz.GetLength());

+}

+CFX_FileBufferArchive::CFX_FileBufferArchive(FX_STRSIZE size, IFX_Allocator* pAllocator)

+    : IFX_BufferArchive(size, pAllocator)

+    , m_pFile(NULL)

+    , m_bTakeover(FALSE)

+{

+}

+CFX_FileBufferArchive::~CFX_FileBufferArchive()

+{

+    Clear();

+}

+void CFX_FileBufferArchive::Clear()

+{

+    if (m_pFile && m_bTakeover) {

+        m_pFile->Release();

+    }

+    m_pFile = NULL;

+    m_bTakeover = FALSE;

+    IFX_BufferArchive::Clear();

+}

+FX_BOOL CFX_FileBufferArchive::AttachFile(IFX_StreamWrite *pFile, FX_BOOL bTakeover )

+{

+    if (!pFile) {

+        return FALSE;

+    }

+    if (m_pFile && m_bTakeover) {

+        m_pFile->Release();

+    }

+    m_pFile = pFile;

+    m_bTakeover = bTakeover;

+    return TRUE;

+}

+FX_BOOL CFX_FileBufferArchive::AttachFile(FX_LPCWSTR filename)

+{

+    if (!filename) {

+        return FALSE;

+    }

+    if (m_pFile && m_bTakeover) {

+        m_pFile->Release();

+    }

+    m_pFile = FX_CreateFileWrite(filename);

+    if (!m_pFile) {

+        return FALSE;

+    }

+    m_bTakeover = TRUE;

+    return TRUE;

+}

+FX_BOOL CFX_FileBufferArchive::AttachFile(FX_LPCSTR filename)

+{

+    if (!filename) {

+        return FALSE;

+    }

+    if (m_pFile && m_bTakeover) {

+        m_pFile->Release();

+    }

+    m_pFile = FX_CreateFileWrite(filename);

+    if (!m_pFile) {

+        return FALSE;

+    }

+    m_bTakeover = TRUE;

+    return TRUE;

+}

+FX_BOOL CFX_FileBufferArchive::DoWork(const void* pBuf, size_t size)

+{

+    if (!m_pFile) {

+        return FALSE;

+    }

+    if (!pBuf || size < 1) {

+        return TRUE;

+    }

+    return m_pFile->WriteBlock(pBuf, size);

+}

diff --git a/core/src/fxcrt/fx_basic_coords.cpp b/core/src/fxcrt/fx_basic_coords.cpp
new file mode 100644
index 0000000..47204e0
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_coords.cpp
@@ -0,0 +1,556 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_ext.h"

+void FX_RECT::Normalize()

+{

+    if (left > right) {

+        int temp = left;

+        left = right;

+        right = temp;

+    }

+    if (top > bottom) {

+        int temp = top;

+        top = bottom;

+        bottom = temp;

+    }

+}

+void FX_RECT::Intersect(const FX_RECT& src)

+{

+    FX_RECT src_n = src;

+    src_n.Normalize();

+    Normalize();

+    left = left > src_n.left ? left : src_n.left;

+    top = top > src_n.top ? top : src_n.top;

+    right = right < src_n.right ? right : src_n.right;

+    bottom = bottom < src_n.bottom ? bottom : src_n.bottom;

+    if (left > right || top > bottom) {

+        left = top = right = bottom = 0;

+    }

+}

+void FX_RECT::Union(const FX_RECT& other_rect)

+{

+    Normalize();

+    FX_RECT other = other_rect;

+    other.Normalize();

+    left = left < other.left ? left : other.left;

+    right = right > other.right ? right : other.right;

+    bottom = bottom > other.bottom ? bottom : other.bottom;

+    top = top < other.top ? top : other.top;

+}

+FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,

+                        FX_FLOAT& interlow, FX_FLOAT& interhigh)

+{

+    if (low1 >= high2 || low2 >= high1) {

+        return FALSE;

+    }

+    interlow = low1 > low2 ? low1 : low2;

+    interhigh = high1 > high2 ? high2 : high1;

+    return TRUE;

+}

+extern "C" int FXSYS_round(FX_FLOAT d)

+{

+    int iRet = 0;

+    if (d >= 0.0f) {

+        iRet = (int)(d + 0.5f);

+        if (iRet >= 0) {

+            return iRet;

+        }

+        return -iRet;

+    }

+    return (int)(d - 0.5f);

+}

+CFX_FloatRect::CFX_FloatRect(const FX_RECT& rect)

+{

+    left = (FX_FLOAT)(rect.left);

+    right = (FX_FLOAT)(rect.right);

+    bottom = (FX_FLOAT)(rect.top);

+    top = (FX_FLOAT)(rect.bottom);

+}

+void CFX_FloatRect::Normalize()

+{

+    FX_FLOAT temp;

+    if (left > right) {

+        temp = left;

+        left = right;

+        right = temp;

+    }

+    if (bottom > top) {

+        temp = top;

+        top = bottom;

+        bottom = temp;

+    }

+}

+void CFX_FloatRect::Intersect(const CFX_FloatRect& other_rect)

+{

+    Normalize();

+    CFX_FloatRect other = other_rect;

+    other.Normalize();

+    left = left > other.left ? left : other.left;

+    right = right < other.right ? right : other.right;

+    bottom = bottom > other.bottom ? bottom : other.bottom;

+    top = top < other.top ? top : other.top;

+    if (left > right || bottom > top) {

+        left = right = bottom = top = 0;

+    }

+}

+void CFX_FloatRect::Union(const CFX_FloatRect& other_rect)

+{

+    Normalize();

+    CFX_FloatRect other = other_rect;

+    other.Normalize();

+    left = left < other.left ? left : other.left;

+    right = right > other.right ? right : other.right;

+    bottom = bottom < other.bottom ? bottom : other.bottom;

+    top = top > other.top ? top : other.top;

+}

+void CFX_FloatRect::Transform(const CFX_Matrix* pMatrix)

+{

+    pMatrix->TransformRect(left, right, top, bottom);

+}

+int CFX_FloatRect::Substract4(CFX_FloatRect& s, CFX_FloatRect* pRects)

+{

+    Normalize();

+    s.Normalize();

+    int nRects = 0;

+    CFX_FloatRect rects[4];

+    if (left < s.left) {

+        rects[nRects].left = left;

+        rects[nRects].right = s.left;

+        rects[nRects].bottom = bottom;

+        rects[nRects].top = top;

+        nRects ++;

+    }

+    if (s.left < right && s.top < top) {

+        rects[nRects].left = s.left;

+        rects[nRects].right = right;

+        rects[nRects].bottom = s.top;

+        rects[nRects].top = top;

+        nRects ++;

+    }

+    if (s.top > bottom && s.right < right) {

+        rects[nRects].left = s.right;

+        rects[nRects].right = right;

+        rects[nRects].bottom = bottom;

+        rects[nRects].top = s.top;

+        nRects ++;

+    }

+    if (s.bottom > bottom) {

+        rects[nRects].left = s.left;

+        rects[nRects].right = s.right;

+        rects[nRects].bottom = bottom;

+        rects[nRects].top = s.bottom;

+        nRects ++;

+    }

+    if (nRects == 0) {

+        return 0;

+    }

+    for (int i = 0; i < nRects; i ++) {

+        pRects[i] = rects[i];

+        pRects[i].Intersect(*this);

+    }

+    return nRects;

+}

+FX_RECT CFX_FloatRect::GetOutterRect() const

+{

+    CFX_FloatRect rect1 = *this;

+    FX_RECT rect;

+    rect.left = (int)FXSYS_floor(rect1.left);

+    rect.right = (int)FXSYS_ceil(rect1.right);

+    rect.top = (int)FXSYS_floor(rect1.bottom);

+    rect.bottom = (int)FXSYS_ceil(rect1.top);

+    rect.Normalize();

+    return rect;

+}

+FX_RECT CFX_FloatRect::GetInnerRect() const

+{

+    CFX_FloatRect rect1 = *this;

+    FX_RECT rect;

+    rect.left = (int)FXSYS_ceil(rect1.left);

+    rect.right = (int)FXSYS_floor(rect1.right);

+    rect.top = (int)FXSYS_ceil(rect1.bottom);

+    rect.bottom = (int)FXSYS_floor(rect1.top);

+    rect.Normalize();

+    return rect;

+}

+static void _MatchFloatRange(FX_FLOAT f1, FX_FLOAT f2, int& i1, int& i2)

+{

+    int length = (int)FXSYS_ceil(f2 - f1);

+    int i1_1 = (int)FXSYS_floor(f1);

+    int i1_2 = (int)FXSYS_ceil(f1);

+    FX_FLOAT error1 = f1 - i1_1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_1 - length);

+    FX_FLOAT error2 = i1_2 - f1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_2 - length);

+    i1 = (error1 > error2) ? i1_2 : i1_1;

+    i2 = i1 + length;

+}

+FX_RECT CFX_FloatRect::GetClosestRect() const

+{

+    CFX_FloatRect rect1 = *this;

+    FX_RECT rect;

+    _MatchFloatRange(rect1.left, rect1.right, rect.left, rect.right);

+    _MatchFloatRange(rect1.bottom, rect1.top, rect.top, rect.bottom);

+    rect.Normalize();

+    return rect;

+}

+FX_BOOL CFX_FloatRect::Contains(const CFX_FloatRect& other_rect) const

+{

+    CFX_FloatRect n1 = *this;

+    n1.Normalize();

+    CFX_FloatRect n2 = other_rect;

+    n2.Normalize();

+    if (n2.left >= n1.left && n2.right <= n1.right && n2.bottom >= n1.bottom && n2.top <= n1.top) {

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL CFX_FloatRect::Contains(FX_FLOAT x, FX_FLOAT y) const

+{

+    CFX_FloatRect n1 = *this;

+    n1.Normalize();

+    return x <= n1.right && x >= n1.left && y <= n1.top && y >= n1.bottom;

+}

+void CFX_FloatRect::UpdateRect(FX_FLOAT x, FX_FLOAT y)

+{

+    if (left > x) {

+        left = x;

+    }

+    if (right < x) {

+        right = x;

+    }

+    if (bottom > y) {

+        bottom = y;

+    }

+    if (top < y) {

+        top = y;

+    }

+}

+CFX_FloatRect CFX_FloatRect::GetBBox(const CFX_FloatPoint* pPoints, int nPoints)

+{

+    if (nPoints == 0) {

+        return CFX_FloatRect();

+    }

+    FX_FLOAT min_x = pPoints->x, max_x = pPoints->x, min_y = pPoints->y, max_y = pPoints->y;

+    for (int i = 1; i < nPoints; i ++) {

+        if (min_x > pPoints[i].x) {

+            min_x = pPoints[i].x;

+        }

+        if (max_x < pPoints[i].x) {

+            max_x = pPoints[i].x;

+        }

+        if (min_y > pPoints[i].y) {

+            min_y = pPoints[i].y;

+        }

+        if (max_y < pPoints[i].y) {

+            max_y = pPoints[i].y;

+        }

+    }

+    return CFX_FloatRect(min_x, min_y, max_x, max_y);

+}

+void CFX_Matrix::Set(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f)

+{

+    this->a = a;

+    this->b = b;

+    this->c = c;

+    this->d = d;

+    this->e = e;

+    this->f = f;

+}

+void CFX_Matrix::Set(const FX_FLOAT n[6])

+{

+    FXSYS_memcpy32((void*)this, &n, sizeof(CFX_Matrix));

+}

+void CFX_Matrix::SetReverse(const CFX_Matrix &m)

+{

+    FX_FLOAT i = m.a * m.d - m.b * m.c;

+    if (FXSYS_fabs(i) == 0) {

+        return;

+    }

+    FX_FLOAT j = -i;

+    a = m.d / i;

+    b = m.b / j;

+    c = m.c / j;

+    d = m.a / i;

+    e = (m.c * m.f - m.d * m.e) / i;

+    f = (m.a * m.f - m.b * m.e) / j;

+}

+static void FXCRT_Matrix_Concat(CFX_Matrix &m, const CFX_Matrix &m1, const CFX_Matrix &m2)

+{

+    FX_FLOAT aa = m1.a * m2.a + m1.b * m2.c;

+    FX_FLOAT bb = m1.a * m2.b + m1.b * m2.d;

+    FX_FLOAT cc = m1.c * m2.a + m1.d * m2.c;

+    FX_FLOAT dd = m1.c * m2.b + m1.d * m2.d;

+    FX_FLOAT ee = m1.e * m2.a + m1.f * m2.c + m2.e;

+    FX_FLOAT ff = m1.e * m2.b + m1.f * m2.d + m2.f;

+    m.a = aa, m.b = bb, m.c = cc, m.d = dd, m.e = ee, m.f = ff;

+}

+void CFX_Matrix::Concat(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, FX_BOOL bPrepended)

+{

+    CFX_Matrix m;

+    m.Set(a, b, c, d, e, f);

+    Concat(m, bPrepended);

+}

+void CFX_Matrix::Concat(const CFX_Matrix &m, FX_BOOL bPrepended)

+{

+    if (bPrepended) {

+        FXCRT_Matrix_Concat(*this, m, *this);

+    } else {

+        FXCRT_Matrix_Concat(*this, *this, m);

+    }

+}

+void CFX_Matrix::ConcatInverse(const CFX_Matrix& src, FX_BOOL bPrepended)

+{

+    CFX_Matrix m;

+    m.SetReverse(src);

+    Concat(m, bPrepended);

+}

+FX_BOOL CFX_Matrix::IsInvertible() const

+{

+    return FXSYS_fabs(a * d - b * c) >= 0.0001f;

+}

+FX_BOOL CFX_Matrix::Is90Rotated() const

+{

+    return FXSYS_fabs(a * 1000) < FXSYS_fabs(b) && FXSYS_fabs(d * 1000) < FXSYS_fabs(c);

+}

+FX_BOOL CFX_Matrix::IsScaled() const

+{

+    return FXSYS_fabs(b * 1000) < FXSYS_fabs(a) && FXSYS_fabs(c * 1000) < FXSYS_fabs(d);

+}

+void CFX_Matrix::Translate(FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended)

+{

+    if (bPrepended) {

+        e += x * a + y * c;

+        f += y * d + x * b;

+    } else {

+        e += x, f += y;

+    }

+}

+void CFX_Matrix::Scale(FX_FLOAT sx, FX_FLOAT sy, FX_BOOL bPrepended)

+{

+    a *= sx, d *= sy;

+    if (bPrepended) {

+        b *= sx;

+        c *= sy;

+    } else {

+        b *= sy;

+        c *= sx;

+        e *= sx;

+        f *= sy;

+    }

+}

+void CFX_Matrix::Rotate(FX_FLOAT fRadian, FX_BOOL bPrepended)

+{

+    FX_FLOAT cosValue = FXSYS_cos(fRadian);

+    FX_FLOAT sinValue = FXSYS_sin(fRadian);

+    CFX_Matrix m;

+    m.Set(cosValue, sinValue, -sinValue, cosValue, 0, 0);

+    if (bPrepended) {

+        FXCRT_Matrix_Concat(*this, m, *this);

+    } else {

+        FXCRT_Matrix_Concat(*this, *this, m);

+    }

+}

+void CFX_Matrix::RotateAt(FX_FLOAT fRadian, FX_FLOAT dx, FX_FLOAT dy, FX_BOOL bPrepended)

+{

+    Translate(dx, dy, bPrepended);

+    Rotate(fRadian, bPrepended);

+    Translate(-dx, -dy, bPrepended);

+}

+void CFX_Matrix::Shear(FX_FLOAT fAlphaRadian, FX_FLOAT fBetaRadian, FX_BOOL bPrepended)

+{

+    CFX_Matrix m;

+    m.Set(1, FXSYS_tan(fAlphaRadian), FXSYS_tan(fBetaRadian), 1, 0, 0);

+    if (bPrepended) {

+        FXCRT_Matrix_Concat(*this, m, *this);

+    } else {

+        FXCRT_Matrix_Concat(*this, *this, m);

+    }

+}

+void CFX_Matrix::MatchRect(const CFX_FloatRect& dest, const CFX_FloatRect& src)

+{

+    FX_FLOAT fDiff = src.left - src.right;

+    a = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.left - dest.right) / fDiff;

+    fDiff = src.bottom - src.top;

+    d = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.bottom - dest.top) / fDiff;

+    e = dest.left - src.left * a;

+    f = dest.bottom - src.bottom * d;

+    b = 0;

+    c = 0;

+}

+FX_FLOAT CFX_Matrix::GetXUnit() const

+{

+    if (b == 0) {

+        return (a > 0 ? a : -a);

+    }

+    if (a == 0) {

+        return (b > 0 ? b : -b);

+    }

+    return FXSYS_sqrt(a * a + b * b);

+}

+FX_FLOAT CFX_Matrix::GetYUnit() const

+{

+    if (c == 0) {

+        return (d > 0 ? d : -d);

+    }

+    if (d == 0) {

+        return (c > 0 ? c : -c);

+    }

+    return FXSYS_sqrt(c * c + d * d);

+}

+void CFX_Matrix::GetUnitRect(CFX_RectF &rect) const

+{

+    rect.left = rect.top = 0;

+    rect.width = rect.height = 1;

+    TransformRect(rect);

+}

+CFX_FloatRect CFX_Matrix::GetUnitRect() const

+{

+    CFX_FloatRect rect(0, 0, 1, 1);

+    rect.Transform((const CFX_Matrix*)this);

+    return rect;

+}

+FX_FLOAT CFX_Matrix::GetUnitArea() const

+{

+    FX_FLOAT A = FXSYS_sqrt(a * a + b * b);

+    FX_FLOAT B = FXSYS_sqrt(c * c + d * d);

+    FX_FLOAT ac = a + c, bd = b + d;

+    FX_FLOAT C = FXSYS_sqrt(ac * ac + bd * bd);

+    FX_FLOAT P = (A + B + C ) / 2;

+    return FXSYS_sqrt(P * (P - A) * (P - B) * (P - C)) * 2;

+}

+FX_FLOAT CFX_Matrix::TransformXDistance(FX_FLOAT dx) const

+{

+    FX_FLOAT fx = a * dx, fy = b * dx;

+    return FXSYS_sqrt(fx * fx + fy * fy);

+}

+FX_INT32 CFX_Matrix::TransformXDistance(FX_INT32 dx) const

+{

+    FX_FLOAT fx = a * dx, fy = b * dx;

+    return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));

+}

+FX_FLOAT CFX_Matrix::TransformYDistance(FX_FLOAT dy) const

+{

+    FX_FLOAT fx = c * dy, fy = d * dy;

+    return FXSYS_sqrt(fx * fx + fy * fy);

+}

+FX_INT32 CFX_Matrix::TransformYDistance(FX_INT32 dy) const

+{

+    FX_FLOAT fx = c * dy, fy = d * dy;

+    return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));

+}

+FX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const

+{

+    FX_FLOAT fx = a * dx + c * dy, fy = b * dx + d * dy;

+    return FXSYS_sqrt(fx * fx + fy * fy);

+}

+FX_INT32 CFX_Matrix::TransformDistance(FX_INT32 dx, FX_INT32 dy) const

+{

+    FX_FLOAT fx = a * dx + c * dy, fy = b * dx + d * dy;

+    return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));

+}

+FX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT distance) const

+{

+    return distance * (GetXUnit() + GetYUnit()) / 2;

+}

+void CFX_Matrix::TransformVector(CFX_VectorF &v) const

+{

+    FX_FLOAT fx = a * v.x + c * v.y;

+    FX_FLOAT fy = b * v.x + d * v.y;

+    v.x = fx, v.y = fy;

+}

+void CFX_Matrix::TransformVector(CFX_Vector &v) const

+{

+    FX_FLOAT fx = a * v.x + c * v.y;

+    FX_FLOAT fy = b * v.x + d * v.y;

+    v.x = FXSYS_round(fx);

+    v.y = FXSYS_round(fy);

+}

+void CFX_Matrix::TransformPoints(CFX_Point *points, FX_INT32 iCount) const

+{

+    FXSYS_assert(iCount > 0);

+    FX_FLOAT fx, fy;

+    for (FX_INT32 i = 0; i < iCount; i ++) {

+        fx = a * points->x + c * points->y + e;

+        fy = b * points->x + d * points->y + f;

+        points->x = FXSYS_round(fx);

+        points->y = FXSYS_round(fy);

+        points ++;

+    }

+}

+void CFX_Matrix::TransformPoints(CFX_PointF *points, FX_INT32 iCount) const

+{

+    FXSYS_assert(iCount > 0);

+    FX_FLOAT fx, fy;

+    for (FX_INT32 i = 0; i < iCount; i ++) {

+        fx = a * points->x + c * points->y + e;

+        fy = b * points->x + d * points->y + f;

+        points->x = fx, points->y = fy;

+        points ++;

+    }

+}

+void CFX_Matrix::TransformPoint(FX_FLOAT &x, FX_FLOAT &y) const

+{

+    FX_FLOAT fx = a * x + c * y + e;

+    FX_FLOAT fy = b * x + d * y + f;

+    x = fx, y = fy;

+}

+void CFX_Matrix::TransformPoint(FX_INT32 &x, FX_INT32 &y) const

+{

+    FX_FLOAT fx = a * x + c * y + e;

+    FX_FLOAT fy = b * x + d * y + f;

+    x = FXSYS_round(fx);

+    y = FXSYS_round(fy);

+}

+void CFX_Matrix::TransformRect(CFX_RectF &rect) const

+{

+    FX_FLOAT right = rect.right(), bottom = rect.bottom();

+    TransformRect(rect.left, right, bottom, rect.top);

+    rect.width = right - rect.left;

+    rect.height = bottom - rect.top;

+}

+void CFX_Matrix::TransformRect(CFX_Rect &rect) const

+{

+    FX_FLOAT left = (FX_FLOAT)rect.left;

+    FX_FLOAT top = (FX_FLOAT)rect.bottom();

+    FX_FLOAT right = (FX_FLOAT)rect.right();

+    FX_FLOAT bottom = (FX_FLOAT)rect.top;

+    TransformRect(left, right, top, bottom);

+    rect.left = FXSYS_round(left);

+    rect.top = FXSYS_round(bottom);

+    rect.width = FXSYS_round(right - left);

+    rect.height = FXSYS_round(top - bottom);

+}

+void CFX_Matrix::TransformRect(FX_FLOAT& left, FX_FLOAT& right, FX_FLOAT& top, FX_FLOAT& bottom) const

+{

+    FX_FLOAT x[4], y[4];

+    x[0] = left;

+    y[0] = top;

+    x[1] = left;

+    y[1] = bottom;

+    x[2] = right;

+    y[2] = top;

+    x[3] = right;

+    y[3] = bottom;

+    int i;

+    for (i = 0; i < 4; i ++) {

+        Transform(x[i], y[i], x[i], y[i]);

+    }

+    right = left = x[0];

+    top = bottom = y[0];

+    for (i = 1; i < 4; i ++) {

+        if (right < x[i]) {

+            right = x[i];

+        }

+        if (left > x[i]) {

+            left = x[i];

+        }

+        if (top < y[i]) {

+            top = y[i];

+        }

+        if (bottom > y[i]) {

+            bottom = y[i];

+        }

+    }

+}

diff --git a/core/src/fxcrt/fx_basic_gcc.cpp b/core/src/fxcrt/fx_basic_gcc.cpp
new file mode 100644
index 0000000..20a1e58
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_gcc.cpp
@@ -0,0 +1,232 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_ext.h"

+template <class T, class STR_T>

+T FXSYS_StrToInt(STR_T str)

+{

+    FX_BOOL neg = FALSE;

+    if (str == NULL) {

+        return 0;

+    }

+    if (*str == '-') {

+        neg = TRUE;

+        str ++;

+    }

+    T num = 0;

+    while (*str) {

+        if ((*str) < '0' || (*str) > '9') {

+            break;

+        }

+        num = num * 10 + (*str) - '0';

+        str ++;

+    }

+    return neg ? -num : num;

+}

+template <typename T, typename STR_T>

+STR_T FXSYS_IntToStr(T value, STR_T string, int radix)

+{

+    int i = 0;

+    if (value < 0) {

+        string[i++] = '-';

+        value = -value;

+    } else if (value == 0) {

+        string[0] = '0';

+        string[1] = 0;

+        return string;

+    }

+    int digits = 1;

+    T order = value / 10;

+    while(order > 0) {

+        digits++;

+        order = order / 10;

+    }

+    for (int d = digits - 1; d > -1; d--) {

+        string[d + i] = "0123456789abcdef"[value % 10];

+        value /= 10;

+    }

+    string[digits + i] = 0;

+    return string;

+}

+#ifdef __cplusplus

+extern "C" {

+#endif

+FX_INT32 FXSYS_atoi(FX_LPCSTR str)

+{

+    return FXSYS_StrToInt<FX_INT32, FX_LPCSTR>(str);

+}

+FX_INT32 FXSYS_wtoi(FX_LPCWSTR str)

+{

+    return FXSYS_StrToInt<FX_INT32, FX_LPCWSTR>(str);

+}

+FX_INT64 FXSYS_atoi64(FX_LPCSTR str)

+{

+    return FXSYS_StrToInt<FX_INT64, FX_LPCSTR>(str);

+}

+FX_INT64 FXSYS_wtoi64(FX_LPCWSTR str)

+{

+    return FXSYS_StrToInt<FX_INT64, FX_LPCWSTR>(str);

+}

+FX_LPCSTR FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix)

+{

+    return FXSYS_IntToStr<FX_INT64, FX_LPSTR>(value, str, radix);

+}

+FX_LPCWSTR FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix)

+{

+    return FXSYS_IntToStr<FX_INT64, FX_LPWSTR>(value, str, radix);

+}

+#ifdef __cplusplus

+}

+#endif

+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_

+#ifdef __cplusplus

+extern "C" {

+#endif

+int FXSYS_GetACP()

+{

+    return 0;

+}

+FX_DWORD FXSYS_GetFullPathName(FX_LPCSTR filename, FX_DWORD buflen, FX_LPSTR buf, FX_LPSTR* filepart)

+{

+    int srclen = FXSYS_strlen(filename);

+    if (buf == NULL || (int)buflen < srclen + 1) {

+        return srclen + 1;

+    }

+    FXSYS_strcpy(buf, filename);

+    return srclen;

+}

+FX_DWORD FXSYS_GetModuleFileName(FX_LPVOID hModule, char* buf, FX_DWORD bufsize)

+{

+    return (FX_DWORD) - 1;

+}

+#ifdef __cplusplus

+}

+#endif

+#endif

+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_

+#ifdef __cplusplus

+extern "C" {

+#endif

+FXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode)

+{

+    return FXSYS_fopen(CFX_ByteString::FromUnicode(filename), CFX_ByteString::FromUnicode(mode));

+}

+char* FXSYS_strlwr(char* str)

+{

+    if (str == NULL) {

+        return NULL;

+    }

+    char* s = str;

+    while (*str) {

+        *str = FXSYS_tolower(*str);

+        str ++;

+    }

+    return s;

+}

+char* FXSYS_strupr(char* str)

+{

+    if (str == NULL) {

+        return NULL;

+    }

+    char* s = str;

+    while (*str) {

+        *str = FXSYS_toupper(*str);

+        str ++;

+    }

+    return s;

+}

+FX_WCHAR* FXSYS_wcslwr(FX_WCHAR* str)

+{

+    if (str == NULL) {

+        return NULL;

+    }

+    FX_WCHAR* s = str;

+    while (*str) {

+        *str = FXSYS_tolower(*str);

+        str ++;

+    }

+    return s;

+}

+FX_WCHAR* FXSYS_wcsupr(FX_WCHAR* str)

+{

+    if (str == NULL) {

+        return NULL;

+    }

+    FX_WCHAR* s = str;

+    while (*str) {

+        *str = FXSYS_toupper(*str);

+        str ++;

+    }

+    return s;

+}

+int FXSYS_stricmp(const char*dst, const char*src)

+{

+    int f, l;

+    do {

+        if ( ((f = (unsigned char)(*(dst++))) >= 'A') && (f <= 'Z') ) {

+            f -= ('A' - 'a');

+        }

+        if ( ((l = (unsigned char)(*(src++))) >= 'A') && (l <= 'Z') ) {

+            l -= ('A' - 'a');

+        }

+    } while ( f && (f == l) );

+    return(f - l);

+}

+int FXSYS_wcsicmp(const FX_WCHAR *dst, const FX_WCHAR *src)

+{

+    FX_WCHAR f, l;

+    do {

+        if ( ((f = (FX_WCHAR)(*(dst++))) >= 'A') && (f <= 'Z') ) {

+            f -= ('A' - 'a');

+        }

+        if ( ((l = (FX_WCHAR)(*(src++))) >= 'A') && (l <= 'Z') ) {

+            l -= ('A' - 'a');

+        }

+    } while ( f && (f == l) );

+    return(f - l);

+}

+char* FXSYS_itoa(int value, char* string, int radix)

+{

+    return FXSYS_IntToStr<FX_INT32, FX_LPSTR>(value, string, radix);

+}

+#ifdef __cplusplus

+}

+#endif

+#endif

+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_

+#ifdef __cplusplus

+extern "C" {

+#endif

+int FXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, FX_LPCWSTR wstr, int wlen,

+                              FX_LPSTR buf, int buflen, FX_LPCSTR default_str, FX_BOOL* pUseDefault)

+{

+    int len = 0;

+    for (int i = 0; i < wlen; i ++) {

+        if (wstr[i] < 0x100) {

+            if (buf && len < buflen) {

+                buf[len] = (FX_CHAR)wstr[i];

+            }

+            len ++;

+        }

+    }

+    return len;

+}

+int FXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, FX_LPCSTR bstr, int blen,

+                              FX_LPWSTR buf, int buflen)

+{

+    int wlen = 0;

+    for (int i = 0; i < blen; i ++) {

+        if (buf && wlen < buflen) {

+            buf[wlen] = bstr[i];

+        }

+        wlen ++;

+    }

+    return wlen;

+}

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/core/src/fxcrt/fx_basic_list.cpp b/core/src/fxcrt/fx_basic_list.cpp
new file mode 100644
index 0000000..92b3d2c
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_list.cpp
@@ -0,0 +1,141 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_basic.h"

+#include "plex.h"

+CFX_PtrList::CFX_PtrList(int nBlockSize, IFX_Allocator* pAllocator)

+    : m_pAllocator(pAllocator)

+    , m_pNodeHead(NULL)

+    , m_pNodeTail(NULL)

+    , m_nCount(0)

+    , m_pNodeFree(NULL)

+    , m_pBlocks(NULL)

+    , m_nBlockSize(nBlockSize)

+{

+}

+FX_POSITION CFX_PtrList::AddTail(void* newElement)

+{

+    CNode* pNewNode = NewNode(m_pNodeTail, NULL);

+    pNewNode->data = newElement;

+    if (m_pNodeTail != NULL) {

+        m_pNodeTail->pNext = pNewNode;

+    } else {

+        m_pNodeHead = pNewNode;

+    }

+    m_pNodeTail = pNewNode;

+    return (FX_POSITION) pNewNode;

+}

+FX_POSITION CFX_PtrList::AddHead(void* newElement)

+{

+    CNode* pNewNode = NewNode(NULL, m_pNodeHead);

+    pNewNode->data = newElement;

+    if (m_pNodeHead != NULL) {

+        m_pNodeHead->pPrev = pNewNode;

+    } else {

+        m_pNodeTail = pNewNode;

+    }

+    m_pNodeHead = pNewNode;

+    return (FX_POSITION) pNewNode;

+}

+FX_POSITION CFX_PtrList::InsertAfter(FX_POSITION position, void* newElement)

+{

+    if (position == NULL) {

+        return AddTail(newElement);

+    }

+    CNode* pOldNode = (CNode*) position;

+    CNode* pNewNode = NewNode(pOldNode, pOldNode->pNext);

+    pNewNode->data = newElement;

+    if (pOldNode->pNext != NULL) {

+        pOldNode->pNext->pPrev = pNewNode;

+    } else {

+        m_pNodeTail = pNewNode;

+    }

+    pOldNode->pNext = pNewNode;

+    return (FX_POSITION) pNewNode;

+}

+void CFX_PtrList::RemoveAt(FX_POSITION position)

+{

+    CNode* pOldNode = (CNode*) position;

+    if (pOldNode == m_pNodeHead) {

+        m_pNodeHead = pOldNode->pNext;

+    } else {

+        pOldNode->pPrev->pNext = pOldNode->pNext;

+    }

+    if (pOldNode == m_pNodeTail) {

+        m_pNodeTail = pOldNode->pPrev;

+    } else {

+        pOldNode->pNext->pPrev = pOldNode->pPrev;

+    }

+    FreeNode(pOldNode);

+}

+void CFX_PtrList::FreeNode(CFX_PtrList::CNode* pNode)

+{

+    pNode->pNext = m_pNodeFree;

+    m_pNodeFree = pNode;

+    m_nCount--;

+    if (m_nCount == 0) {

+        RemoveAll();

+    }

+}

+void CFX_PtrList::RemoveAll()

+{

+    m_nCount = 0;

+    m_pNodeHead = m_pNodeTail = m_pNodeFree = NULL;

+    m_pBlocks->FreeDataChain(m_pAllocator);

+    m_pBlocks = NULL;

+}

+CFX_PtrList::CNode*

+CFX_PtrList::NewNode(CFX_PtrList::CNode* pPrev, CFX_PtrList::CNode* pNext)

+{

+    if (m_pNodeFree == NULL) {

+        CFX_Plex* pNewBlock = CFX_Plex::Create(m_pAllocator, m_pBlocks, m_nBlockSize, sizeof(CNode));

+        CNode* pNode = (CNode*)pNewBlock->data();

+        pNode += m_nBlockSize - 1;

+        for (int i = m_nBlockSize - 1; i >= 0; i--, pNode--) {

+            pNode->pNext = m_pNodeFree;

+            m_pNodeFree = pNode;

+        }

+    }

+    ASSERT(m_pNodeFree != NULL);

+    CFX_PtrList::CNode* pNode = m_pNodeFree;

+    m_pNodeFree = m_pNodeFree->pNext;

+    pNode->pPrev = pPrev;

+    pNode->pNext = pNext;

+    m_nCount++;

+    ASSERT(m_nCount > 0);

+    pNode->data = 0;

+    return pNode;

+}

+CFX_PtrList::~CFX_PtrList()

+{

+    RemoveAll();

+    ASSERT(m_nCount == 0);

+}

+FX_POSITION CFX_PtrList::FindIndex(int nIndex) const

+{

+    if (nIndex >= m_nCount || nIndex < 0) {

+        return NULL;

+    }

+    CNode* pNode = m_pNodeHead;

+    while (nIndex--) {

+        pNode = pNode->pNext;

+    }

+    return (FX_POSITION) pNode;

+}

+FX_POSITION CFX_PtrList::Find(void* searchValue, FX_POSITION startAfter) const

+{

+    CNode* pNode = (CNode*) startAfter;

+    if (pNode == NULL) {

+        pNode = m_pNodeHead;

+    } else {

+        pNode = pNode->pNext;

+    }

+    for (; pNode != NULL; pNode = pNode->pNext)

+        if (pNode->data == searchValue) {

+            return (FX_POSITION) pNode;

+        }

+    return NULL;

+}

diff --git a/core/src/fxcrt/fx_basic_maps.cpp b/core/src/fxcrt/fx_basic_maps.cpp
new file mode 100644
index 0000000..cb397ee
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_maps.cpp
@@ -0,0 +1,654 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_ext.h"

+#include "plex.h"

+static void ConstructElement(CFX_ByteString* pNewData)

+{

+    new (pNewData) CFX_ByteString();

+}

+static void DestructElement(CFX_ByteString* pOldData)

+{

+    pOldData->~CFX_ByteString();

+}

+CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize, IFX_Allocator* pAllocator)

+    : m_pAllocator(pAllocator)

+    , m_pHashTable(NULL)

+    , m_nHashTableSize(17)

+    , m_nCount(0)

+    , m_pFreeList(NULL)

+    , m_pBlocks(NULL)

+    , m_nBlockSize(nBlockSize)

+{

+    ASSERT(m_nBlockSize > 0);

+}

+void CFX_MapPtrToPtr::RemoveAll()

+{

+    if (m_pHashTable) {

+        FX_Allocator_Free(m_pAllocator, m_pHashTable);

+        m_pHashTable = NULL;

+    }

+    m_nCount = 0;

+    m_pFreeList = NULL;

+    m_pBlocks->FreeDataChain(m_pAllocator);

+    m_pBlocks = NULL;

+}

+CFX_MapPtrToPtr::~CFX_MapPtrToPtr()

+{

+    RemoveAll();

+    ASSERT(m_nCount == 0);

+}

+FX_DWORD CFX_MapPtrToPtr::HashKey(void* key) const

+{

+    return ((FX_DWORD)(FX_UINTPTR)key) >> 4;

+}

+void CFX_MapPtrToPtr::GetNextAssoc(FX_POSITION& rNextPosition, void*& rKey, void*& rValue) const

+{

+    ASSERT(m_pHashTable != NULL);

+    CAssoc* pAssocRet = (CAssoc*)rNextPosition;

+    ASSERT(pAssocRet != NULL);

+    if (pAssocRet == (CAssoc*) - 1) {

+        for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)

+            if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {

+                break;

+            }

+        ASSERT(pAssocRet != NULL);

+    }

+    CAssoc* pAssocNext;

+    if ((pAssocNext = pAssocRet->pNext) == NULL) {

+        for (FX_DWORD nBucket = (HashKey(pAssocRet->key) % m_nHashTableSize) + 1; nBucket < m_nHashTableSize; nBucket ++) {

+            if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {

+                break;

+            }

+        }

+    }

+    rNextPosition = (FX_POSITION) pAssocNext;

+    rKey = pAssocRet->key;

+    rValue = pAssocRet->value;

+}

+FX_BOOL CFX_MapPtrToPtr::Lookup(void* key, void*& rValue) const

+{

+    FX_DWORD nHash;

+    CAssoc* pAssoc = GetAssocAt(key, nHash);

+    if (pAssoc == NULL) {

+        return FALSE;

+    }

+    rValue = pAssoc->value;

+    return TRUE;

+}

+void* CFX_MapPtrToPtr::GetValueAt(void* key) const

+{

+    FX_DWORD nHash;

+    CAssoc* pAssoc = GetAssocAt(key, nHash);

+    if (pAssoc == NULL) {

+        return NULL;

+    }

+    return pAssoc->value;

+}

+void*& CFX_MapPtrToPtr::operator[](void* key)

+{

+    FX_DWORD nHash;

+    CAssoc* pAssoc;

+    if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {

+        if (m_pHashTable == NULL) {

+            InitHashTable(m_nHashTableSize);

+        }

+        pAssoc = NewAssoc();

+        pAssoc->key = key;

+        pAssoc->pNext = m_pHashTable[nHash];

+        m_pHashTable[nHash] = pAssoc;

+    }

+    return pAssoc->value;

+}

+CFX_MapPtrToPtr::CAssoc*

+CFX_MapPtrToPtr::GetAssocAt(void* key, FX_DWORD& nHash) const

+{

+    nHash = HashKey(key) % m_nHashTableSize;

+    if (m_pHashTable == NULL) {

+        return NULL;

+    }

+    CAssoc* pAssoc;

+    for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) {

+        if (pAssoc->key == key) {

+            return pAssoc;

+        }

+    }

+    return NULL;

+}

+CFX_MapPtrToPtr::CAssoc*

+CFX_MapPtrToPtr::NewAssoc()

+{

+    if (m_pFreeList == NULL) {

+        CFX_Plex* newBlock = CFX_Plex::Create(m_pAllocator, m_pBlocks, m_nBlockSize, sizeof(CFX_MapPtrToPtr::CAssoc));

+        CFX_MapPtrToPtr::CAssoc* pAssoc = (CFX_MapPtrToPtr::CAssoc*)newBlock->data();

+        pAssoc += m_nBlockSize - 1;

+        for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) {

+            pAssoc->pNext = m_pFreeList;

+            m_pFreeList = pAssoc;

+        }

+    }

+    ASSERT(m_pFreeList != NULL);

+    CFX_MapPtrToPtr::CAssoc* pAssoc = m_pFreeList;

+    m_pFreeList = m_pFreeList->pNext;

+    m_nCount++;

+    ASSERT(m_nCount > 0);

+    pAssoc->key = 0;

+    pAssoc->value = 0;

+    return pAssoc;

+}

+void CFX_MapPtrToPtr::InitHashTable(

+    FX_DWORD nHashSize, FX_BOOL bAllocNow)

+{

+    ASSERT(m_nCount == 0);

+    ASSERT(nHashSize > 0);

+    if (m_pHashTable != NULL) {

+        FX_Allocator_Free(m_pAllocator, m_pHashTable);

+        m_pHashTable = NULL;

+    }

+    if (bAllocNow) {

+        m_pHashTable = FX_Allocator_Alloc(m_pAllocator, CAssoc*, nHashSize);

+        if (m_pHashTable) {

+            FXSYS_memset32(m_pHashTable, 0, sizeof(CAssoc*) * nHashSize);

+        }

+    }

+    m_nHashTableSize = nHashSize;

+}

+FX_BOOL CFX_MapPtrToPtr::RemoveKey(void* key)

+{

+    if (m_pHashTable == NULL) {

+        return FALSE;

+    }

+    CAssoc** ppAssocPrev;

+    ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize];

+    CAssoc* pAssoc;

+    for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) {

+        if (pAssoc->key == key) {

+            *ppAssocPrev = pAssoc->pNext;

+            FreeAssoc(pAssoc);

+            return TRUE;

+        }

+        ppAssocPrev = &pAssoc->pNext;

+    }

+    return FALSE;

+}

+void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc)

+{

+    pAssoc->pNext = m_pFreeList;

+    m_pFreeList = pAssoc;

+    m_nCount--;

+    ASSERT(m_nCount >= 0);

+    if (m_nCount == 0) {

+        RemoveAll();

+    }

+}

+CFX_MapByteStringToPtr::CFX_MapByteStringToPtr(int nBlockSize, IFX_Allocator* pAllocator)

+    : m_pAllocator(pAllocator)

+    , m_pHashTable(NULL)

+    , m_nHashTableSize(17)

+    , m_nCount(0)

+    , m_pFreeList(NULL)

+    , m_pBlocks(NULL)

+    , m_nBlockSize(nBlockSize)

+{

+    ASSERT(m_nBlockSize > 0);

+}

+void CFX_MapByteStringToPtr::RemoveAll()

+{

+    if (m_pHashTable != NULL) {

+        for (FX_DWORD nHash = 0; nHash < m_nHashTableSize; nHash++) {

+            CAssoc* pAssoc;

+            for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL;

+                    pAssoc = pAssoc->pNext) {

+                DestructElement(&pAssoc->key);

+            }

+        }

+        FX_Allocator_Free(m_pAllocator, m_pHashTable);

+        m_pHashTable = NULL;

+    }

+    m_nCount = 0;

+    m_pFreeList = NULL;

+    m_pBlocks->FreeDataChain(m_pAllocator);

+    m_pBlocks = NULL;

+}

+CFX_MapByteStringToPtr::~CFX_MapByteStringToPtr()

+{

+    RemoveAll();

+    ASSERT(m_nCount == 0);

+}

+void CFX_MapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition,

+        CFX_ByteString& rKey, void*& rValue) const

+{

+    ASSERT(m_pHashTable != NULL);

+    CAssoc* pAssocRet = (CAssoc*)rNextPosition;

+    ASSERT(pAssocRet != NULL);

+    if (pAssocRet == (CAssoc*) - 1) {

+        for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)

+            if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {

+                break;

+            }

+        ASSERT(pAssocRet != NULL);

+    }

+    CAssoc* pAssocNext;

+    if ((pAssocNext = pAssocRet->pNext) == NULL) {

+        for (FX_DWORD nBucket = pAssocRet->nHashValue + 1;

+                nBucket < m_nHashTableSize; nBucket++)

+            if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {

+                break;

+            }

+    }

+    rNextPosition = (FX_POSITION) pAssocNext;

+    rKey = pAssocRet->key;

+    rValue = pAssocRet->value;

+}

+FX_LPVOID CFX_MapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const

+{

+    ASSERT(m_pHashTable != NULL);

+    CAssoc* pAssocRet = (CAssoc*)rNextPosition;

+    ASSERT(pAssocRet != NULL);

+    if (pAssocRet == (CAssoc*) - 1) {

+        for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)

+            if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {

+                break;

+            }

+        ASSERT(pAssocRet != NULL);

+    }

+    CAssoc* pAssocNext;

+    if ((pAssocNext = pAssocRet->pNext) == NULL) {

+        for (FX_DWORD nBucket = pAssocRet->nHashValue + 1;

+                nBucket < m_nHashTableSize; nBucket++)

+            if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {

+                break;

+            }

+    }

+    rNextPosition = (FX_POSITION) pAssocNext;

+    return pAssocRet->value;

+}

+void*& CFX_MapByteStringToPtr::operator[](FX_BSTR key)

+{

+    FX_DWORD nHash;

+    CAssoc* pAssoc;

+    if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {

+        if (m_pHashTable == NULL) {

+            InitHashTable(m_nHashTableSize);

+        }

+        pAssoc = NewAssoc();

+        pAssoc->nHashValue = nHash;

+        pAssoc->key = key;

+        pAssoc->pNext = m_pHashTable[nHash];

+        m_pHashTable[nHash] = pAssoc;

+    }

+    return pAssoc->value;

+}

+CFX_MapByteStringToPtr::CAssoc*

+CFX_MapByteStringToPtr::NewAssoc()

+{

+    if (m_pFreeList == NULL) {

+        CFX_Plex* newBlock = CFX_Plex::Create(m_pAllocator, m_pBlocks, m_nBlockSize, sizeof(CFX_MapByteStringToPtr::CAssoc));

+        CFX_MapByteStringToPtr::CAssoc* pAssoc = (CFX_MapByteStringToPtr::CAssoc*)newBlock->data();

+        pAssoc += m_nBlockSize - 1;

+        for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) {

+            pAssoc->pNext = m_pFreeList;

+            m_pFreeList = pAssoc;

+        }

+    }

+    ASSERT(m_pFreeList != NULL);

+    CFX_MapByteStringToPtr::CAssoc* pAssoc = m_pFreeList;

+    m_pFreeList = m_pFreeList->pNext;

+    m_nCount++;

+    ASSERT(m_nCount > 0);

+    ConstructElement(&pAssoc->key);

+    pAssoc->value = 0;

+    return pAssoc;

+}

+void CFX_MapByteStringToPtr::FreeAssoc(CFX_MapByteStringToPtr::CAssoc* pAssoc)

+{

+    DestructElement(&pAssoc->key);

+    pAssoc->pNext = m_pFreeList;

+    m_pFreeList = pAssoc;

+    m_nCount--;

+    ASSERT(m_nCount >= 0);

+    if (m_nCount == 0) {

+        RemoveAll();

+    }

+}

+CFX_MapByteStringToPtr::CAssoc*

+CFX_MapByteStringToPtr::GetAssocAt(FX_BSTR key, FX_DWORD& nHash) const

+{

+    nHash = HashKey(key) % m_nHashTableSize;

+    if (m_pHashTable == NULL) {

+        return NULL;

+    }

+    CAssoc* pAssoc;

+    for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) {

+        if (pAssoc->key == key) {

+            return pAssoc;

+        }

+    }

+    return NULL;

+}

+FX_BOOL CFX_MapByteStringToPtr::Lookup(FX_BSTR key, void*& rValue) const

+{

+    FX_DWORD nHash;

+    CAssoc* pAssoc = GetAssocAt(key, nHash);

+    if (pAssoc == NULL) {

+        return FALSE;

+    }

+    rValue = pAssoc->value;

+    return TRUE;

+}

+void CFX_MapByteStringToPtr::InitHashTable(

+    FX_DWORD nHashSize, FX_BOOL bAllocNow)

+{

+    ASSERT(m_nCount == 0);

+    ASSERT(nHashSize > 0);

+    if (m_pHashTable != NULL) {

+        FX_Allocator_Free(m_pAllocator, m_pHashTable);

+        m_pHashTable = NULL;

+    }

+    if (bAllocNow) {

+        m_pHashTable = FX_Allocator_Alloc(m_pAllocator, CAssoc*, nHashSize);

+        if (m_pHashTable) {

+            FXSYS_memset32(m_pHashTable, 0, sizeof(CAssoc*) * nHashSize);

+        }

+    }

+    m_nHashTableSize = nHashSize;

+}

+inline FX_DWORD CFX_MapByteStringToPtr::HashKey(FX_BSTR key) const

+{

+    FX_DWORD nHash = 0;

+    int len = key.GetLength();

+    FX_LPCBYTE buf = key;

+    for (int i = 0; i < len; i ++) {

+        nHash = (nHash << 5) + nHash + buf[i];

+    }

+    return nHash;

+}

+FX_BOOL CFX_MapByteStringToPtr::RemoveKey(FX_BSTR key)

+{

+    if (m_pHashTable == NULL) {

+        return FALSE;

+    }

+    CAssoc** ppAssocPrev;

+    ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize];

+    CAssoc* pAssoc;

+    for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) {

+        if (pAssoc->key == key) {

+            *ppAssocPrev = pAssoc->pNext;

+            FreeAssoc(pAssoc);

+            return TRUE;

+        }

+        ppAssocPrev = &pAssoc->pNext;

+    }

+    return FALSE;

+}

+struct _CompactString {

+    FX_BYTE		m_CompactLen;

+    FX_BYTE		m_LenHigh;

+    FX_BYTE		m_LenLow;

+    FX_BYTE		m_Unused;

+    FX_LPBYTE	m_pBuffer;

+};

+static void _CompactStringRelease(IFX_Allocator* pAllocator, _CompactString* pCompact)

+{

+    if (pCompact->m_CompactLen == 0xff) {

+        FX_Allocator_Free(pAllocator, pCompact->m_pBuffer);

+    }

+}

+static FX_BOOL _CompactStringSame(_CompactString* pCompact, FX_LPCBYTE pStr, int len)

+{

+    if (len < sizeof(_CompactString)) {

+        if (pCompact->m_CompactLen != len) {

+            return FALSE;

+        }

+        return FXSYS_memcmp32(&pCompact->m_LenHigh, pStr, len) == 0;

+    }

+    if (pCompact->m_CompactLen != 0xff || pCompact->m_LenHigh * 256 + pCompact->m_LenLow != len) {

+        return FALSE;

+    }

+    return FXSYS_memcmp32(pCompact->m_pBuffer, pStr, len) == 0;

+}

+static void _CompactStringStore(IFX_Allocator* pAllocator, _CompactString* pCompact, FX_LPCBYTE pStr, int len)

+{

+    if (len < (int)sizeof(_CompactString)) {

+        pCompact->m_CompactLen = (FX_BYTE)len;

+        FXSYS_memcpy32(&pCompact->m_LenHigh, pStr, len);

+        return;

+    }

+    pCompact->m_CompactLen = 0xff;

+    pCompact->m_LenHigh = len / 256;

+    pCompact->m_LenLow = len % 256;

+    pCompact->m_pBuffer = FX_Allocator_Alloc(pAllocator, FX_BYTE, len);

+    if (pCompact->m_pBuffer) {

+        FXSYS_memcpy32(pCompact->m_pBuffer, pStr, len);

+    }

+}

+static CFX_ByteStringC _CompactStringGet(_CompactString* pCompact)

+{

+    if (pCompact->m_CompactLen == 0xff) {

+        return CFX_ByteStringC(pCompact->m_pBuffer, pCompact->m_LenHigh * 256 + pCompact->m_LenLow);

+    }

+    if (pCompact->m_CompactLen == 0xfe) {

+        return CFX_ByteStringC();

+    }

+    return CFX_ByteStringC(&pCompact->m_LenHigh, pCompact->m_CompactLen);

+}

+#define CMAP_ALLOC_STEP		8

+#define CMAP_INDEX_SIZE		8

+CFX_CMapByteStringToPtr::CFX_CMapByteStringToPtr(IFX_Allocator* pAllocator)

+    : m_Buffer(sizeof(_CompactString) + sizeof(void*), CMAP_ALLOC_STEP, CMAP_INDEX_SIZE, pAllocator)

+{

+}

+CFX_CMapByteStringToPtr::~CFX_CMapByteStringToPtr()

+{

+    RemoveAll();

+}

+void CFX_CMapByteStringToPtr::RemoveAll()

+{

+    IFX_Allocator* pAllocator = m_Buffer.m_pAllocator;

+    int size = m_Buffer.GetSize();

+    for (int i = 0; i < size; i ++) {

+        _CompactStringRelease(pAllocator, (_CompactString*)m_Buffer.GetAt(i));

+    }

+    m_Buffer.RemoveAll();

+}

+FX_POSITION CFX_CMapByteStringToPtr::GetStartPosition() const

+{

+    int size = m_Buffer.GetSize();

+    for (int i = 0; i < size; i ++) {

+        _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);

+        if (pKey->m_CompactLen != 0xfe) {

+            return (FX_POSITION)(FX_UINTPTR)(i + 1);

+        }

+    }

+    return NULL;

+}

+void CFX_CMapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const

+{

+    if (rNextPosition == NULL) {

+        return;

+    }

+    int index = (int)(FX_UINTPTR)rNextPosition - 1;

+    _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);

+    rKey = _CompactStringGet(pKey);

+    rValue = *(void**)(pKey + 1);

+    index ++;

+    int size = m_Buffer.GetSize();

+    while (index < size) {

+        pKey = (_CompactString*)m_Buffer.GetAt(index);

+        if (pKey->m_CompactLen != 0xfe) {

+            rNextPosition = (FX_POSITION)(FX_UINTPTR)(index + 1);

+            return;

+        }

+        index ++;

+    }

+    rNextPosition = NULL;

+}

+FX_LPVOID CFX_CMapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const

+{

+    if (rNextPosition == NULL) {

+        return NULL;

+    }

+    int index = (int)(FX_UINTPTR)rNextPosition - 1;

+    _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);

+    FX_LPVOID rValue = *(void**)(pKey + 1);

+    index ++;

+    int size = m_Buffer.GetSize();

+    while (index < size) {

+        pKey = (_CompactString*)m_Buffer.GetAt(index);

+        if (pKey->m_CompactLen != 0xfe) {

+            rNextPosition = (FX_POSITION)(FX_UINTPTR)(index + 1);

+            return rValue;

+        }

+        index ++;

+    }

+    rNextPosition = NULL;

+    return rValue;

+}

+FX_BOOL _CMapLookupCallback(void* param, void* pData)

+{

+    return !_CompactStringSame((_CompactString*)pData, ((CFX_ByteStringC*)param)->GetPtr(), ((CFX_ByteStringC*)param)->GetLength());

+}

+FX_BOOL CFX_CMapByteStringToPtr::Lookup(FX_BSTR key, void*& rValue) const

+{

+    void* p = m_Buffer.Iterate(_CMapLookupCallback, (void*)&key);

+    if (!p) {

+        return FALSE;

+    }

+    rValue = *(void**)((_CompactString*)p + 1);

+    return TRUE;

+}

+void CFX_CMapByteStringToPtr::SetAt(FX_BSTR key, void* value)

+{

+    ASSERT(value != NULL);

+    int index, key_len = key.GetLength();

+    int size = m_Buffer.GetSize();

+    for (index = 0; index < size; index ++) {

+        _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);

+        if (!_CompactStringSame(pKey, (FX_LPCBYTE)key, key_len)) {

+            continue;

+        }

+        *(void**)(pKey + 1) = value;

+        return;

+    }

+    IFX_Allocator* pAllocator = m_Buffer.m_pAllocator;

+    for (index = 0; index < size; index ++) {

+        _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);

+        if (pKey->m_CompactLen) {

+            continue;

+        }

+        _CompactStringStore(pAllocator, pKey, (FX_LPCBYTE)key, key_len);

+        *(void**)(pKey + 1) = value;

+        return;

+    }

+    _CompactString* pKey = (_CompactString*)m_Buffer.Add();

+    _CompactStringStore(pAllocator, pKey, (FX_LPCBYTE)key, key_len);

+    *(void**)(pKey + 1) = value;

+}

+void CFX_CMapByteStringToPtr::AddValue(FX_BSTR key, void* value)

+{

+    ASSERT(value != NULL);

+    _CompactString* pKey = (_CompactString*)m_Buffer.Add();

+    _CompactStringStore(m_Buffer.m_pAllocator, pKey, (FX_LPCBYTE)key, key.GetLength());

+    *(void**)(pKey + 1) = value;

+}

+void CFX_CMapByteStringToPtr::RemoveKey(FX_BSTR key)

+{

+    int key_len = key.GetLength();

+    IFX_Allocator* pAllocator = m_Buffer.m_pAllocator;

+    int size = m_Buffer.GetSize();

+    for (int index = 0; index < size; index ++) {

+        _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);

+        if (!_CompactStringSame(pKey, (FX_LPCBYTE)key, key_len)) {

+            continue;

+        }

+        _CompactStringRelease(pAllocator, pKey);

+        pKey->m_CompactLen = 0xfe;

+        return;

+    }

+}

+int CFX_CMapByteStringToPtr::GetCount() const

+{

+    int count = 0;

+    int size = m_Buffer.GetSize();

+    for (int i = 0; i < size; i ++) {

+        _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);

+        if (pKey->m_CompactLen != 0xfe) {

+            count ++;

+        }

+    }

+    return count;

+}

+extern "C" {

+    static int _CompareDWord(const void* p1, const void* p2)

+    {

+        return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);

+    }

+};

+struct _DWordPair {

+    FX_DWORD key;

+    FX_DWORD value;

+};

+FX_BOOL CFX_CMapDWordToDWord::Lookup(FX_DWORD key, FX_DWORD& value) const

+{

+    FX_LPVOID pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(), m_Buffer.GetSize() / sizeof(_DWordPair),

+                                      sizeof(_DWordPair), _CompareDWord);

+    if (pResult == NULL) {

+        return FALSE;

+    }

+    value = ((FX_DWORD*)pResult)[1];

+    return TRUE;

+}

+FX_POSITION CFX_CMapDWordToDWord::GetStartPosition() const

+{

+    FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);

+    if (count == 0) {

+        return NULL;

+    }

+    return (FX_POSITION)1;

+}

+void CFX_CMapDWordToDWord::GetNextAssoc(FX_POSITION& pos, FX_DWORD& key, FX_DWORD& value) const

+{

+    if (pos == 0) {

+        return;

+    }

+    FX_DWORD index = ((FX_DWORD)(FX_UINTPTR)pos) - 1;

+    FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);

+    _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();

+    key = buf[index].key;

+    value = buf[index].value;

+    if (index == count - 1) {

+        pos = 0;

+    } else {

+        pos = (FX_POSITION)((FX_UINTPTR)pos + 1);

+    }

+}

+void CFX_CMapDWordToDWord::SetAt(FX_DWORD key, FX_DWORD value)

+{

+    FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);

+    _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();

+    _DWordPair pair = {key, value};

+    if (count == 0 || key > buf[count - 1].key) {

+        m_Buffer.AppendBlock(&pair, sizeof(_DWordPair));

+        return;

+    }

+    int low = 0, high = count - 1;

+    while (low <= high) {

+        int mid = (low + high) / 2;

+        if (buf[mid].key < key) {

+            low = mid + 1;

+        } else if (buf[mid].key > key) {

+            high = mid - 1;

+        } else {

+            buf[mid].value = value;

+            return;

+        }

+    }

+    m_Buffer.InsertBlock(low * sizeof(_DWordPair), &pair, sizeof(_DWordPair));

+}

+void CFX_CMapDWordToDWord::EstimateSize(FX_DWORD size, FX_DWORD grow_by)

+{

+    m_Buffer.EstimateSize(size, grow_by);

+}

diff --git a/core/src/fxcrt/fx_basic_memmgr.cpp b/core/src/fxcrt/fx_basic_memmgr.cpp
new file mode 100644
index 0000000..34df829
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_memmgr.cpp
@@ -0,0 +1,306 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_basic.h"

+#include "mem_int.h"

+void FXMEM_DestroyFoxitMgr(FXMEM_FoxitMgr* pFoxitMgr)

+{

+    if (pFoxitMgr == NULL) {

+        return;

+    }

+    CFX_MemoryMgr* p = (CFX_MemoryMgr*)pFoxitMgr;

+    if (p->m_pSystemMgr->CollectAll) {

+        p->m_pSystemMgr->CollectAll(p->m_pSystemMgr);

+    }

+    if (p->m_bReleaseMgr) {

+        p->m_pSystemMgr->Free(p->m_pSystemMgr, p, 0);

+    }

+    if (p->m_pExternalMemory) {

+        free(p->m_pExternalMemory);

+    }

+}

+#ifdef __cplusplus

+extern "C" {

+#endif

+static void* _DefAllocDebug(IFX_Allocator* pAllocator, size_t size, FX_LPCSTR filename, int line)

+{

+    return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->AllocDebug(size, 0, filename, line);

+}

+static void* _DefAlloc(IFX_Allocator* pAllocator, size_t size)

+{

+    return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Alloc(size, 0);

+}

+static void* _DefReallocDebug(IFX_Allocator* pAllocator, void* p, size_t size, FX_LPCSTR filename, int line)

+{

+    return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->ReallocDebug(p, size, 0, filename, line);

+}

+static void* _DefRealloc(IFX_Allocator* pAllocator, void* p, size_t size)

+{

+    return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Realloc(p, size, 0);

+}

+static void _DefFree(IFX_Allocator* pAllocator, void* p)

+{

+    ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Free(p, 0);

+}

+#ifdef __cplusplus

+}

+#endif

+void CFX_MemoryMgr::Init(FXMEM_SystemMgr* pSystemMgr)

+{

+    m_pSystemMgr = pSystemMgr;

+    IFX_Allocator &ac = m_DefAllocator.m_Allocator;

+    ac.m_Alloc = _DefAlloc;

+    ac.m_AllocDebug = _DefAllocDebug;

+    ac.m_Realloc = _DefRealloc;

+    ac.m_ReallocDebug = _DefReallocDebug;

+    ac.m_Free = _DefFree;

+    m_DefAllocator.m_pFoxitMgr = this;

+    m_pExternalMemory = NULL;

+    m_bReleaseMgr = TRUE;

+}

+void CFX_MemoryMgr::PurgeMgr()

+{

+    if (m_pSystemMgr->Purge) {

+        m_pSystemMgr->Purge(m_pSystemMgr);

+    }

+}

+void* CFX_MemoryMgr::Alloc(size_t size, int flags)

+{

+    void* p = m_pSystemMgr->Alloc(m_pSystemMgr, size, flags);

+    if (p == NULL) {

+        return NULL;

+    }

+    return p;

+}

+void* CFX_MemoryMgr::AllocDebug(size_t size, int flags, FX_LPCSTR file, int line)

+{

+    void* p = m_pSystemMgr->AllocDebug(m_pSystemMgr, size, flags, file, line);

+    if (p == NULL) {

+        return NULL;

+    }

+    return p;

+}

+void* CFX_MemoryMgr::Realloc(void* p, size_t size, int flags)

+{

+    void* p1 = m_pSystemMgr->Realloc(m_pSystemMgr, p, size, flags);

+    if (p1 == NULL) {

+        return NULL;

+    }

+    return p1;

+}

+void* CFX_MemoryMgr::ReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file, int line)

+{

+    void* p1 = m_pSystemMgr->ReallocDebug(m_pSystemMgr, p, size, flags, file, line);

+    if (p1 == NULL) {

+        return NULL;

+    }

+    return p1;

+}

+void CFX_MemoryMgr::Free(void* p, int flags)

+{

+    if (p == NULL) {

+        return;

+    }

+    m_pSystemMgr->Free(m_pSystemMgr, p, flags);

+}

+CFX_MemoryMgr* g_pDefFoxitMgr = NULL;

+void* FXMEM_DefaultAlloc(size_t size, int flags)

+{

+    return g_pDefFoxitMgr->Alloc(size, flags);

+}

+void* FXMEM_DefaultAlloc2(size_t size, size_t unit, int flags)

+{

+    return g_pDefFoxitMgr->Alloc(size * unit, flags);

+}

+void* FXMEM_DefaultRealloc(void* p, size_t size, int flags)

+{

+    if (p == NULL) {

+        return FXMEM_DefaultAlloc(size, flags);

+    }

+    return g_pDefFoxitMgr->Realloc(p, size, flags);

+}

+void* FXMEM_DefaultRealloc2(void* p, size_t size, size_t unit, int flags)

+{

+    if (p == NULL) {

+        return FXMEM_DefaultAlloc2(size, unit, flags);

+    }

+    return g_pDefFoxitMgr->Realloc(p, size * unit, flags);

+}

+void* FXMEM_DefaultAllocDebug(size_t size, int flags, FX_LPCSTR file, int line)

+{

+    return g_pDefFoxitMgr->AllocDebug(size, flags, file, line);

+}

+void* FXMEM_DefaultAllocDebug2(size_t size, size_t unit, int flags, FX_LPCSTR file, int line)

+{

+    return g_pDefFoxitMgr->AllocDebug(size * unit, flags, file, line);

+}

+void* FXMEM_DefaultReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file, int line)

+{

+    if (p == NULL) {

+        return FXMEM_DefaultAllocDebug(size, flags, file, line);

+    }

+    return g_pDefFoxitMgr->ReallocDebug(p, size, flags, file, line);

+}

+void* FXMEM_DefaultReallocDebug2(void* p, size_t size, size_t unit, int flags, FX_LPCSTR file, int line)

+{

+    if (p == NULL) {

+        return FXMEM_DefaultAllocDebug2(size, unit, flags, file, line);

+    }

+    return g_pDefFoxitMgr->ReallocDebug(p, size * unit, flags, file, line);

+}

+void FXMEM_DefaultFree(void* p, int flags)

+{

+    g_pDefFoxitMgr->Free(p, flags);

+}

+IFX_Allocator* FXMEM_GetDefAllocator()

+{

+    return &g_pDefFoxitMgr->m_DefAllocator.m_Allocator;

+}

+void* CFX_Object::operator new(size_t size)

+{

+    return g_pDefFoxitMgr->Alloc(size, 0);

+}

+void* CFX_Object::operator new[](size_t size)

+{

+    return g_pDefFoxitMgr->Alloc(size, 0);

+}

+void* CFX_Object::operator new[](size_t size, FX_LPCSTR file, int line)

+{

+    return g_pDefFoxitMgr->AllocDebug(size, 0, file, line);

+}

+void* CFX_Object::operator new(size_t size, FX_LPCSTR file, int line)

+{

+    return g_pDefFoxitMgr->AllocDebug(size, 0, file, line);

+}

+void CFX_Object::operator delete(void* p)

+{

+    g_pDefFoxitMgr->Free(p, 0);

+}

+void CFX_Object::operator delete[](void* p)

+{

+    g_pDefFoxitMgr->Free(p, 0);

+}

+void CFX_Object::operator delete(void* p, FX_LPCSTR file, int line)

+{

+    g_pDefFoxitMgr->Free(p, 0);

+}

+void CFX_Object::operator delete[](void* p, FX_LPCSTR file, int line)

+{

+    g_pDefFoxitMgr->Free(p, 0);

+}

+void* CFX_AllocObject::operator new(size_t size, IFX_Allocator* pAllocator, FX_LPCSTR filename, int line)

+{

+    void* p = pAllocator ? pAllocator->m_AllocDebug(pAllocator, size, filename, line) :

+              g_pDefFoxitMgr->AllocDebug(size, 0, filename, line);

+    ((CFX_AllocObject*)p)->m_pAllocator = pAllocator;

+    return p;

+}

+void CFX_AllocObject::operator delete (void* p, IFX_Allocator* pAllocator, FX_LPCSTR filename, int line)

+{

+    if (pAllocator) {

+        pAllocator->m_Free(pAllocator, p);

+    } else {

+        g_pDefFoxitMgr->Free(p, 0);

+    }

+}

+void* CFX_AllocObject::operator new(size_t size, IFX_Allocator* pAllocator)

+{

+    void* p = pAllocator ? pAllocator->m_Alloc(pAllocator, size) : g_pDefFoxitMgr->Alloc(size, 0);

+    ((CFX_AllocObject*)p)->m_pAllocator = pAllocator;

+    return p;

+}

+void CFX_AllocObject::operator delete(void* p)

+{

+    if (((CFX_AllocObject*)p)->m_pAllocator) {

+        (((CFX_AllocObject*)p)->m_pAllocator)->m_Free(((CFX_AllocObject*)p)->m_pAllocator, p);

+    } else {

+        g_pDefFoxitMgr->Free(p, 0);

+    }

+}

+void CFX_AllocObject::operator delete(void* p, IFX_Allocator* pAllocator)

+{

+    if (pAllocator) {

+        pAllocator->m_Free(pAllocator, p);

+    } else {

+        g_pDefFoxitMgr->Free(p, 0);

+    }

+}

+extern "C" {

+    static void* _GOPAllocDebug(IFX_Allocator* pAllocator, size_t size, FX_LPCSTR file, int line)

+    {

+        return ((CFX_GrowOnlyPool*)pAllocator)->Alloc(size);

+    }

+    static void* _GOPAlloc(IFX_Allocator* pAllocator, size_t size)

+    {

+        return ((CFX_GrowOnlyPool*)pAllocator)->Alloc(size);

+    }

+    static void* _GOPReallocDebug(IFX_Allocator* pAllocator, void* p, size_t new_size, FX_LPCSTR file, int line)

+    {

+        return ((CFX_GrowOnlyPool*)pAllocator)->Realloc(p, new_size);

+    }

+    static void* _GOPRealloc(IFX_Allocator* pAllocator, void* p, size_t new_size)

+    {

+        return ((CFX_GrowOnlyPool*)pAllocator)->Realloc(p, new_size);

+    }

+    static void _GOPFree(IFX_Allocator* pAllocator, void* p)

+    {

+    }

+};

+CFX_GrowOnlyPool::CFX_GrowOnlyPool(IFX_Allocator* pAllocator, size_t trunk_size)

+{

+    m_TrunkSize = trunk_size;

+    m_pFirstTrunk = NULL;

+    m_pAllocator = pAllocator ? pAllocator : &g_pDefFoxitMgr->m_DefAllocator.m_Allocator;

+    m_AllocDebug = _GOPAllocDebug;

+    m_Alloc = _GOPAlloc;

+    m_ReallocDebug = _GOPReallocDebug;

+    m_Realloc = _GOPRealloc;

+    m_Free = _GOPFree;

+}

+CFX_GrowOnlyPool::~CFX_GrowOnlyPool()

+{

+    FreeAll();

+}

+void CFX_GrowOnlyPool::SetAllocator(IFX_Allocator* pAllocator)

+{

+    ASSERT(m_pFirstTrunk == NULL);

+    m_pAllocator = pAllocator ? pAllocator : &g_pDefFoxitMgr->m_DefAllocator.m_Allocator;

+}

+struct _FX_GrowOnlyTrunk {

+    size_t	m_Size;

+    size_t	m_Allocated;

+    _FX_GrowOnlyTrunk*	m_pNext;

+};

+void CFX_GrowOnlyPool::FreeAll()

+{

+    _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;

+    while (pTrunk) {

+        _FX_GrowOnlyTrunk* pNext = pTrunk->m_pNext;

+        m_pAllocator->m_Free(m_pAllocator, pTrunk);

+        pTrunk = pNext;

+    }

+    m_pFirstTrunk = NULL;

+}

+void* CFX_GrowOnlyPool::Alloc(size_t size)

+{

+    size = (size + 3) / 4 * 4;

+    _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;

+    while (pTrunk) {

+        if (pTrunk->m_Size - pTrunk->m_Allocated >= size) {

+            void* p = (FX_LPBYTE)(pTrunk + 1) + pTrunk->m_Allocated;

+            pTrunk->m_Allocated += size;

+            return p;

+        }

+        pTrunk = pTrunk->m_pNext;

+    }

+    size_t alloc_size = size > m_TrunkSize ? size : m_TrunkSize;

+    pTrunk = (_FX_GrowOnlyTrunk*)m_pAllocator->m_Alloc(m_pAllocator, sizeof(_FX_GrowOnlyTrunk) + alloc_size);

+    pTrunk->m_Size = alloc_size;

+    pTrunk->m_Allocated = size;

+    pTrunk->m_pNext = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;

+    m_pFirstTrunk = pTrunk;

+    return pTrunk + 1;

+}

diff --git a/core/src/fxcrt/fx_basic_memmgr_mini.cpp b/core/src/fxcrt/fx_basic_memmgr_mini.cpp
new file mode 100644
index 0000000..f8385e2
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_memmgr_mini.cpp
@@ -0,0 +1,822 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_ext.h"

+#include "mem_int.h"

+#ifdef _FPDFAPI_MINI_

+static FX_MEMCONFIG g_MemConfig = {

+    1,

+    5,

+    8,

+    4,

+    12,

+    8,

+    2,

+    4,

+    32,

+    64,

+};

+#else

+static FX_MEMCONFIG g_MemConfig = {

+    1,

+    8,

+    24,

+    8,

+    32,

+    16,

+    4,

+    8,

+    128,

+    64,

+};

+#endif

+void FXMEM_SetConfig(const FX_MEMCONFIG* memConfig)

+{

+    g_MemConfig = *memConfig;

+}

+#ifdef __cplusplus

+extern "C" {

+#endif

+static void* FixedAlloc(FXMEM_SystemMgr* pMgr, size_t size, int flags)

+{

+    return ((CFXMEM_FixedMgr*)pMgr->user)->Alloc(size);

+}

+static void* FixedAllocDebug(FXMEM_SystemMgr* pMgr, size_t size, int flags, FX_LPCSTR file, int line)

+{

+    return ((CFXMEM_FixedMgr*)pMgr->user)->Alloc(size);

+}

+static void* FixedRealloc(FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags)

+{

+    return ((CFXMEM_FixedMgr*)pMgr->user)->Realloc(pointer, size);

+}

+static void* FixedReallocDebug(FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags, FX_LPCSTR file, int line)

+{

+    return ((CFXMEM_FixedMgr*)pMgr->user)->Realloc(pointer, size);

+}

+static void  FixedFree(FXMEM_SystemMgr* pMgr, void* pointer, int flags)

+{

+    ((CFXMEM_FixedMgr*)pMgr->user)->Free(pointer);

+}

+static void  FixedPurge(FXMEM_SystemMgr* pMgr)

+{

+    ((CFXMEM_FixedMgr*)pMgr->user)->Purge();

+}

+static void FixedCollectAll(FXMEM_SystemMgr* pMgr)

+{

+    ((CFXMEM_FixedMgr*)pMgr->user)->FreeAll();

+}

+#define FIXEDMEM_MINIMUMSIZE	(1024 * 1024 * 8)

+FXMEM_FoxitMgr* FXMEM_CreateMemoryMgr(size_t size, FX_BOOL extensible)

+{

+    if (size < FIXEDMEM_MINIMUMSIZE) {

+        size = FIXEDMEM_MINIMUMSIZE;

+    }

+    FX_LPVOID pMemory = malloc(size);

+    if (!pMemory) {

+        return NULL;

+    }

+    CFixedMgr_Proxy* pProxy = (CFixedMgr_Proxy*)pMemory;

+    size_t offsetSize = (sizeof(CFixedMgr_Proxy) + 15) / 16 * 16;

+    FXMEM_FoxitMgr* pFoxitMgr = pProxy->Initialize((FX_LPBYTE)pProxy + offsetSize, size - offsetSize, extensible);

+    if (!pFoxitMgr) {

+        free(pMemory);

+        return NULL;

+    }

+    g_pDefFoxitMgr = (CFX_MemoryMgr*)pFoxitMgr;

+    g_pDefFoxitMgr->m_pExternalMemory = pMemory;

+    return pFoxitMgr;

+}

+FXMEM_FoxitMgr* FXMEM_CreateFixedMgr(void* pMemory, size_t size, FXMEM_SystemMgr2* pSystemMgr)

+{

+    if (pMemory == NULL || size < FX_FIXEDMEM_PAGESIZE) {

+        return NULL;

+    }

+    if (!pSystemMgr && size >= FIXEDMEM_PROXYSIZE_1) {

+        CFixedMgr_Proxy* pProxy = (CFixedMgr_Proxy*)pMemory;

+        size_t offsetSize = (sizeof(CFixedMgr_Proxy) + 15) / 16 * 16;

+        return pProxy->Initialize((FX_LPBYTE)pProxy + offsetSize, size - offsetSize, FALSE);

+    }

+    CFXMEM_FixedMgr* pHeader = (CFXMEM_FixedMgr*)pMemory;

+    pHeader->Initialize(size);

+    pHeader->m_pExtender = pSystemMgr;

+    CFX_MemoryMgr* p = (CFX_MemoryMgr*)pHeader->Alloc(sizeof(CFX_MemoryMgr));

+    if (p == NULL) {

+        return NULL;

+    }

+    p->Init(&pHeader->m_SystemMgr);

+    return (FXMEM_FoxitMgr*)p;

+}

+size_t FXMEM_GetBlockSizeInFixedMgr(FXMEM_FoxitMgr* pFoxitMgr, void* ptr)

+{

+    return pFoxitMgr ? ((CFXMEM_FixedMgr*)((CFX_MemoryMgr*)pFoxitMgr)->m_pSystemMgr->user)->GetSize(ptr) : 0;

+}

+#ifdef __cplusplus

+}

+#endif

+const FX_MEMCONFIG g_ProxyMgr_MemConfigs[6] = {

+    {1,      2,      4,      0,      2,      2,   2,       0,       0,     0},

+    {1,      4,      8,      0,      2,      2,   2,       0,       0,     0},

+    {1,      4,      16,     4,      8,      8,   2,       1,       16,    16},

+    {1,      8,      24,     4,      12,     12,  4,       2,       32,    16},

+    {1,      8,      24,     8,      16,     16,  4,       2,       64,    32},

+    {1,      8,      24,     8,      24,     32,  4,       2,       128,   64},

+};

+const FX_MEMCONFIG*	FixedMgr_GetConfig(size_t nSize)

+{

+    int index = 5;

+    if (nSize <= FIXEDMEM_PROXYSIZE_0) {

+        index = 0;

+    } else if (nSize <= FIXEDMEM_PROXYSIZE_1) {

+        index = 1;

+    } else if (nSize <= FIXEDMEM_PROXYSIZE_2) {

+        index = 2;

+    } else if (nSize <= FIXEDMEM_PROXYSIZE_3) {

+        index = 3;

+    } else if (nSize <= FIXEDMEM_PROXYSIZE_4) {

+        index = 4;

+    }

+    return &g_ProxyMgr_MemConfigs[index];

+}

+FXMEM_FoxitMgr* CFixedMgr_Proxy::Initialize(FX_LPVOID pBuffer, size_t nSize, FX_BOOL bExtensible)

+{

+    FXSYS_assert(pBuffer != NULL && nSize >= FIXEDMEM_PROXYSIZE_1 - sizeof(CFixedMgr_Proxy));

+    FXMEM_SetConfig(FixedMgr_GetConfig(nSize));

+    m_SystemMgr.More = &CFixedMgr_Proxy::Common_More;

+    m_SystemMgr.Free = &CFixedMgr_Proxy::Common_Free;

+    m_pFixedPage = (CFXMEM_Page*)((FX_LPBYTE)pBuffer + FIXEDMEM_PROXYSIZE_0);

+    m_pFixedPage->Initialize(nSize - FIXEDMEM_PROXYSIZE_0);

+    m_pBuffer = pBuffer;

+    m_nSize = nSize;

+    m_bExtensible = bExtensible;

+    return FXMEM_CreateFixedMgr(pBuffer, FIXEDMEM_PROXYSIZE_0, &m_SystemMgr);

+}

+FX_BOOL CFixedMgr_Proxy::Common_More(FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size)

+{

+    CFixedMgr_Proxy* pProxyMgr = (CFixedMgr_Proxy*)pMgr;

+    FXSYS_assert(pProxyMgr != NULL && pProxyMgr->m_pFixedPage != NULL);

+    *new_size = alloc_size;

+    *new_memory = pProxyMgr->m_pFixedPage->Alloc(alloc_size);

+    if (*new_memory == NULL && pProxyMgr->m_bExtensible) {

+        *new_memory = malloc(alloc_size);

+    }

+    return *new_memory != NULL;

+}

+void CFixedMgr_Proxy::Common_Free(FXMEM_SystemMgr2* pMgr, void* memory)

+{

+    CFixedMgr_Proxy* pProxyMgr = (CFixedMgr_Proxy*)pMgr;

+    FXSYS_assert(pProxyMgr != NULL && pProxyMgr->m_pFixedPage != NULL);

+    if (memory > pProxyMgr->m_pBuffer && memory < (FX_LPBYTE)pProxyMgr->m_pBuffer + pProxyMgr->m_nSize) {

+        pProxyMgr->m_pFixedPage->Free(memory);

+    } else if (pProxyMgr->m_bExtensible) {

+        free(memory);

+    }

+}

+void CFXMEM_Page::Initialize(size_t size)

+{

+    CFXMEM_Block *pFirstBlock = (CFXMEM_Block*)(this + 1);

+    m_nAvailSize = size - sizeof(CFXMEM_Page) - sizeof(CFXMEM_Block);

+    pFirstBlock->m_nBlockSize = m_nAvailSize;

+    pFirstBlock->m_pNextBlock = NULL;

+    m_AvailHead.m_nBlockSize = m_nAvailSize;

+    m_AvailHead.m_pNextBlock = pFirstBlock;

+    m_pLimitPos = (CFXMEM_Block*)((FX_LPBYTE)this + size);

+}

+FX_LPVOID CFXMEM_Page::Alloc(CFXMEM_Block* pPrevBlock, CFXMEM_Block* pNextBlock, size_t size, size_t oldsize)

+{

+    size_t gap = pNextBlock->m_nBlockSize - size;

+    if (gap <= 64 + sizeof(CFXMEM_Block)) {

+        pPrevBlock->m_pNextBlock = pNextBlock->m_pNextBlock;

+        m_nAvailSize -= pNextBlock->m_nBlockSize;

+    } else {

+        m_nAvailSize -= size + sizeof(CFXMEM_Block);

+        pNextBlock->m_nBlockSize = size;

+        CFXMEM_Block *pNewBlock = (CFXMEM_Block*)((FX_LPBYTE)(pNextBlock + 1) + size);

+        pNewBlock->m_nBlockSize = gap - sizeof(CFXMEM_Block);

+        pNewBlock->m_pNextBlock = pNextBlock->m_pNextBlock;

+        pPrevBlock->m_pNextBlock = pNewBlock;

+    }

+    return (FX_LPVOID)(pNextBlock + 1);

+}

+FX_LPVOID CFXMEM_Page::Alloc(size_t size)

+{

+    size_t oldsize = size;

+#if _FX_WORDSIZE_ == _FX_W64_

+    size = (size + 31) / 32 * 32;

+#else

+    size = (size + 7) / 8 * 8;

+#endif

+    if (m_nAvailSize < size) {

+        return NULL;

+    }

+    CFXMEM_Block *pNextBlock;

+    CFXMEM_Block *pPrevBlock = &m_AvailHead;

+    while (TRUE) {

+        pNextBlock = pPrevBlock->m_pNextBlock;

+        if (!pNextBlock) {

+            return NULL;

+        }

+        if (pNextBlock->m_nBlockSize >= size) {

+            break;

+        }

+        pPrevBlock = pNextBlock;

+    }

+    return Alloc(pPrevBlock, pNextBlock, size, oldsize);

+}

+FX_LPVOID CFXMEM_Page::Realloc(FX_LPVOID p, size_t oldSize, size_t newSize)

+{

+    FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);

+    size_t oldnewSize = newSize;

+#if _FX_WORDSIZE_ == _FX_W64_

+    newSize = (newSize + 31) / 32 * 32;

+#else

+    newSize = (newSize + 7) / 8 * 8;

+#endif

+    CFXMEM_Block *pPrevBlock = &m_AvailHead;

+    CFXMEM_Block *pNextBlock, *pPrevPrev;

+    CFXMEM_Block *pBlock = (CFXMEM_Block*)p - 1;

+    pPrevPrev = NULL;

+    while (TRUE) {

+        pNextBlock = pPrevBlock->m_pNextBlock;

+        if (pNextBlock == NULL || pNextBlock > pBlock) {

+            break;

+        }

+        if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pNextBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {

+            m_nAvailSize += sizeof(CFXMEM_Block);

+            pPrevBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);

+            pPrevBlock->m_pNextBlock = pNextBlock->m_pNextBlock;

+        } else {

+            pPrevPrev = pPrevBlock;

+            pPrevBlock = pNextBlock;

+        }

+    }

+    if (pNextBlock) {

+        CFXMEM_Block* pCurBlock = pNextBlock->m_pNextBlock;

+        while ((FX_LPBYTE)pCurBlock == (FX_LPBYTE)(pNextBlock + 1) + pNextBlock->m_nBlockSize) {

+            m_nAvailSize += sizeof(CFXMEM_Block);

+            pNextBlock->m_nBlockSize += pCurBlock->m_nBlockSize + sizeof(CFXMEM_Block);

+            pCurBlock = pCurBlock->m_pNextBlock;

+            pNextBlock->m_pNextBlock = pCurBlock;

+        }

+    }

+    size_t size = 0;

+    FX_DWORD dwFlags = 0;

+    if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {

+        size += pPrevBlock->m_nBlockSize + oldSize + sizeof(CFXMEM_Block);

+        dwFlags |= 0x10;

+    }

+    if (pNextBlock && (FX_LPBYTE)pNextBlock == (FX_LPBYTE)p + oldSize) {

+        size += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);

+        dwFlags |= 0x01;

+    }

+    if (size >= newSize) {

+        m_nAvailSize += pBlock->m_nBlockSize;

+        CFXMEM_Block* pCurBlock = pBlock;

+        if (dwFlags & 0x10) {

+            pCurBlock = pPrevBlock;

+            m_nAvailSize += sizeof(CFXMEM_Block);

+            pCurBlock->m_nBlockSize += pBlock->m_nBlockSize + sizeof(CFXMEM_Block);

+            pPrevBlock = pPrevPrev;

+        }

+        if (dwFlags & 0x01) {

+            m_nAvailSize += sizeof(CFXMEM_Block);

+            pCurBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);

+            pCurBlock->m_pNextBlock = pNextBlock->m_pNextBlock;

+        }

+        if (pCurBlock != pBlock) {

+            FXSYS_memmove32((FX_LPVOID)(pCurBlock + 1), p, oldSize);

+        }

+        return Alloc(pPrevBlock, pCurBlock, newSize, oldnewSize);

+    }

+    return NULL;

+}

+void CFXMEM_Page::Free(FX_LPVOID p)

+{

+    FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);

+    CFXMEM_Block *pPrevBlock = &m_AvailHead;

+    CFXMEM_Block *pNextBlock;

+    CFXMEM_Block *pBlock = (CFXMEM_Block*)p - 1;

+    m_nAvailSize += pBlock->m_nBlockSize;

+    while (TRUE) {

+        pNextBlock = pPrevBlock->m_pNextBlock;

+        if (pNextBlock == NULL || pNextBlock > pBlock) {

+            break;

+        }

+        if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pNextBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {

+            m_nAvailSize += sizeof(CFXMEM_Block);

+            pPrevBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);

+            pPrevBlock->m_pNextBlock = pNextBlock->m_pNextBlock;

+        } else {

+            pPrevBlock = pNextBlock;

+        }

+    }

+    while ((FX_LPBYTE)pNextBlock == (FX_LPBYTE)(pBlock + 1) + pBlock->m_nBlockSize) {

+        m_nAvailSize += sizeof(CFXMEM_Block);

+        pBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);

+        pNextBlock = pNextBlock->m_pNextBlock;

+    }

+    pBlock->m_pNextBlock = pNextBlock;

+    if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {

+        m_nAvailSize += sizeof(CFXMEM_Block);

+        pPrevBlock->m_nBlockSize += pBlock->m_nBlockSize + sizeof(CFXMEM_Block);

+        pPrevBlock->m_pNextBlock = pBlock->m_pNextBlock;

+    } else {

+        FXSYS_assert(pPrevBlock != pBlock);

+        pPrevBlock->m_pNextBlock = pBlock;

+    }

+}

+void CFXMEM_Pages::Initialize(FX_LPBYTE pStart, size_t pageSize, size_t pages)

+{

+    m_pStartPage = m_pCurPage = (CFXMEM_Page*)pStart;

+    m_nPageSize = pageSize;

+    for (size_t n = 0; n < pages; n++) {

+        ((CFXMEM_Page*)pStart)->Initialize(pageSize);

+        pStart += pageSize;

+    }

+    m_pLimitPos = (CFXMEM_Page*)pStart;

+}

+FX_BOOL CFXMEM_Pages::IsEmpty() const

+{

+    if (m_pStartPage >= m_pLimitPos) {

+        return TRUE;

+    }

+    FX_LPBYTE pPage = (FX_LPBYTE)m_pStartPage;

+    while (pPage < (FX_LPBYTE)m_pLimitPos) {

+        if (!((CFXMEM_Page*)pPage)->IsEmpty()) {

+            return FALSE;

+        }

+        pPage += m_nPageSize;

+    }

+    return TRUE;

+}

+FX_LPVOID CFXMEM_Pages::Alloc(size_t size)

+{

+    CFXMEM_Page *pCurPage = m_pCurPage;

+    do {

+        FX_LPVOID p = m_pCurPage->Alloc(size);

+        if (p) {

+            return p;

+        }

+        m_pCurPage = (CFXMEM_Page*)((FX_LPBYTE)m_pCurPage + m_nPageSize);

+        if (m_pCurPage == m_pLimitPos) {

+            m_pCurPage = m_pStartPage;

+        }

+    } while (m_pCurPage != pCurPage);

+    return NULL;

+}

+FX_LPVOID CFXMEM_Pages::Realloc(FX_LPVOID p, size_t oldSize, size_t newSize)

+{

+    FXSYS_assert (p > (FX_LPVOID)m_pStartPage && p < (FX_LPVOID)m_pLimitPos);

+    CFXMEM_Page* pPage = (CFXMEM_Page*)((FX_LPBYTE)m_pStartPage + ((FX_LPBYTE)p - (FX_LPBYTE)m_pStartPage) / m_nPageSize * m_nPageSize);

+    return pPage->Realloc(p, oldSize, newSize);

+}

+void CFXMEM_Pages::Free(FX_LPVOID p)

+{

+    FXSYS_assert (p > (FX_LPVOID)m_pStartPage && p < (FX_LPVOID)m_pLimitPos);

+    CFXMEM_Page* pPage = (CFXMEM_Page*)((FX_LPBYTE)m_pStartPage + ((FX_LPBYTE)p - (FX_LPBYTE)m_pStartPage) / m_nPageSize * m_nPageSize);

+    pPage->Free(p);

+}

+void CFXMEM_Pool::Initialize(const FX_MEMCONFIG* pMemConfig, size_t size, size_t pageNum8Bytes, size_t pageNum16Bytes, size_t pageNum32Bytes, size_t pageNumMid)

+{

+    m_pPrevPool = NULL;

+    m_pNextPool = NULL;

+    m_bAlone = FALSE;

+    FX_LPBYTE pPage = (FX_LPBYTE)this + sizeof(CFXMEM_Pool);

+    size -= sizeof(CFXMEM_Pool);

+    m_8BytesPages.Initialize(pPage, pageNum8Bytes);

+    pPage += pageNum8Bytes * FX_FIXEDMEM_PAGESIZE;

+    size -= pageNum8Bytes * FX_FIXEDMEM_PAGESIZE;

+    m_16BytesPages.Initialize(pPage, pageNum16Bytes);

+    pPage += pageNum16Bytes * FX_FIXEDMEM_PAGESIZE;

+    size -= pageNum16Bytes * FX_FIXEDMEM_PAGESIZE;

+    m_32BytesPages.Initialize(pPage, pageNum32Bytes);

+    pPage += pageNum32Bytes * FX_FIXEDMEM_PAGESIZE;

+    size -= pageNum32Bytes * FX_FIXEDMEM_PAGESIZE;

+    m_MidPages.Initialize(pPage, pMemConfig->nPageSize_Mid * FX_FIXEDMEM_PAGESIZE, pageNumMid);

+    pPage += pageNumMid * pMemConfig->nPageSize_Mid * FX_FIXEDMEM_PAGESIZE;

+    size -= pageNumMid * pMemConfig->nPageSize_Mid * FX_FIXEDMEM_PAGESIZE;

+    if (size < FX_FIXEDMEM_MIDBLOCKSIZE) {

+        m_pLargePage = NULL;

+    } else {

+        m_pLargePage = (CFXMEM_Page*)pPage;

+        m_pLargePage->Initialize(size);

+    }

+    m_pLimitPos = pPage + size;

+}

+FX_BOOL CFXMEM_Pool::IsEmpty() const

+{

+    if (!m_8BytesPages.IsEmpty()) {

+        return FALSE;

+    }

+    if (!m_16BytesPages.IsEmpty()) {

+        return FALSE;

+    }

+    if (!m_32BytesPages.IsEmpty()) {

+        return FALSE;

+    }

+    if (!m_MidPages.IsEmpty()) {

+        return FALSE;

+    }

+    return !m_pLargePage || m_pLargePage->IsEmpty();

+}

+size_t CFXMEM_Pool::GetSize(FX_LPVOID p) const

+{

+    FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);

+    if (p < (FX_LPVOID)m_8BytesPages.m_pLimitPos) {

+        return 8;

+    }

+    if (p < (FX_LPVOID)m_16BytesPages.m_pLimitPos) {

+        return 16;

+    }

+    if (p < (FX_LPVOID)m_32BytesPages.m_pLimitPos) {

+        return 32;

+    }

+    return ((CFXMEM_Block*)p - 1)->m_nBlockSize;

+}

+FX_LPVOID CFXMEM_Pool::Realloc(FX_LPVOID p, size_t oldSize, size_t newSize)

+{

+    FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);

+    if (p > (FX_LPVOID)m_32BytesPages.m_pLimitPos) {

+        if (p < (FX_LPVOID)m_MidPages.m_pLimitPos) {

+            return m_MidPages.Realloc(p, oldSize, newSize);

+        } else if (m_pLargePage) {

+            return m_pLargePage->Realloc(p, oldSize, newSize);

+        }

+    }

+    return NULL;

+}

+void CFXMEM_Pool::Free(FX_LPVOID p)

+{

+    FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);

+    if (p < (FX_LPVOID)m_32BytesPages.m_pLimitPos) {

+        if (p < (FX_LPVOID)m_8BytesPages.m_pLimitPos) {

+            m_8BytesPages.Free(p);

+        } else if (p < (FX_LPVOID)m_16BytesPages.m_pLimitPos) {

+            m_16BytesPages.Free(p);

+        } else {

+            m_32BytesPages.Free(p);

+        }

+        return;

+    } else if (p < (FX_LPVOID)m_MidPages.m_pLimitPos) {

+        m_MidPages.Free(p);

+    } else {

+        m_pLargePage->Free(p);

+    }

+}

+void CFXMEM_FixedMgr::Initialize(size_t size)

+{

+    m_MemConfig = g_MemConfig;

+    FXSYS_memset32(&m_SystemMgr, 0, sizeof m_SystemMgr);

+    m_SystemMgr.Alloc = FixedAlloc;

+    m_SystemMgr.AllocDebug = FixedAllocDebug;

+    m_SystemMgr.Free = FixedFree;

+    m_SystemMgr.Realloc = FixedRealloc;

+    m_SystemMgr.ReallocDebug = FixedReallocDebug;

+    m_SystemMgr.CollectAll = FixedCollectAll;

+    m_SystemMgr.Purge = FixedPurge;

+    m_SystemMgr.user = this;

+    size -= sizeof(CFXMEM_FixedMgr);

+    size_t nMidPages = 0;

+    if (m_MemConfig.nPageSize_Mid) {

+        nMidPages = (size - (m_MemConfig.nPageNum_Init8 + m_MemConfig.nPageNum_Init16 + m_MemConfig.nPageNum_Init32) * FX_FIXEDMEM_PAGESIZE) / (m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE);

+        if (nMidPages > m_MemConfig.nPageNum_InitMid) {

+            nMidPages = m_MemConfig.nPageNum_InitMid;

+        }

+    }

+    m_FirstPool.Initialize(&m_MemConfig, size, m_MemConfig.nPageNum_Init8, m_MemConfig.nPageNum_Init16, m_MemConfig.nPageNum_Init32, nMidPages);

+}

+FX_LPVOID CFXMEM_FixedMgr::Alloc16(CFXMEM_Pool **pp32Pool, size_t size)

+{

+    CFXMEM_Pool *pPool = &m_FirstPool;

+    do {

+        CFXMEM_16BytesPages &pages = pPool->m_16BytesPages;

+        if (pages.HasFreeBlock()) {

+            return pages.Alloc(size);

+        }

+        if (pp32Pool && pPool->m_32BytesPages.HasFreeBlock()) {

+            *pp32Pool = pPool;

+        }

+        pPool = pPool->m_pNextPool;

+    } while(pPool);

+    return NULL;

+}

+FX_LPVOID CFXMEM_FixedMgr::Alloc32(size_t size)

+{

+    if (size <= 8) {

+        CFXMEM_8BytesPages &pages = m_FirstPool.m_8BytesPages;

+        if (pages.HasFreeBlock()) {

+            return pages.Alloc(size);

+        }

+    }

+    CFXMEM_Pool *p32BytesPool;

+    if (size <= 16) {

+        p32BytesPool = NULL;

+        FX_LPVOID p = Alloc16(&p32BytesPool, size);

+        if (p) {

+            return p;

+        }

+    } else {

+        p32BytesPool = &m_FirstPool;

+    }

+    while (p32BytesPool) {

+        CFXMEM_32BytesPages &pages = p32BytesPool->m_32BytesPages;

+        if (pages.HasFreeBlock()) {

+            return pages.Alloc(size);

+        }

+        p32BytesPool = p32BytesPool->m_pNextPool;

+    }

+    return NULL;

+}

+FX_LPVOID CFXMEM_FixedMgr::AllocSmall(size_t size)

+{

+    FX_LPVOID p = Alloc32(size);

+    if (p) {

+        return p;

+    }

+    if (!m_pExtender) {

+        return NULL;

+    }

+    size_t requiredSize = (m_MemConfig.nPageNum_More16 + m_MemConfig.nPageNum_More32) * FX_FIXEDMEM_PAGESIZE;

+    if (!requiredSize) {

+        return NULL;

+    }

+    CFXMEM_Pool *pNewPool = NULL;

+    requiredSize += sizeof(CFXMEM_Pool);

+    size_t newSize = requiredSize;

+    if (!m_pExtender->More(m_pExtender, newSize, (void**)&pNewPool, &newSize)) {

+        return NULL;

+    }

+    size_t nMidPages = 0;

+    if (m_MemConfig.nPageSize_Mid) {

+        nMidPages = (newSize - requiredSize) / (m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE);

+        if (nMidPages > m_MemConfig.nPageNum_MoreMid) {

+            nMidPages = m_MemConfig.nPageNum_MoreMid;

+        }

+    }

+    pNewPool->Initialize(&m_MemConfig, newSize, 0, m_MemConfig.nPageNum_More16, m_MemConfig.nPageNum_More32, nMidPages);

+    pNewPool->m_pPrevPool = &m_FirstPool;

+    CFXMEM_Pool *pPool = m_FirstPool.m_pNextPool;

+    pNewPool->m_pNextPool = pPool;

+    if (pPool) {

+        pPool->m_pPrevPool = pNewPool;

+    }

+    m_FirstPool.m_pNextPool = pNewPool;

+    return Alloc32(size);

+}

+FX_LPVOID CFXMEM_FixedMgr::AllocMid(size_t size)

+{

+    CFXMEM_Pool *pPool = &m_FirstPool;

+    do {

+        CFXMEM_Pages &pages = pPool->m_MidPages;

+        if (pages.m_pLimitPos > pages.m_pStartPage) {

+            FX_LPVOID p = pages.Alloc(size);

+            if (p) {

+                return p;

+            }

+        }

+        pPool = pPool->m_pNextPool;

+    } while(pPool);

+    if (!m_pExtender) {

+        return NULL;

+    }

+    size_t newSize = m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE * m_MemConfig.nPageNum_MoreMid;

+    if (!newSize) {

+        return NULL;

+    }

+    CFXMEM_Pool *pNewPool = NULL;

+    newSize += sizeof(CFXMEM_Pool);

+    if (!m_pExtender->More(m_pExtender, newSize, (void**)&pNewPool, &newSize)) {

+        return NULL;

+    }

+    size_t nMidPages = (newSize - sizeof(CFXMEM_Pool)) / (m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE);

+    if (nMidPages > m_MemConfig.nPageNum_MoreMid) {

+        nMidPages = m_MemConfig.nPageNum_MoreMid;

+    }

+    pNewPool->Initialize(&m_MemConfig, newSize, 0, 0, 0, nMidPages);

+    pNewPool->m_pPrevPool = &m_FirstPool;

+    pPool = m_FirstPool.m_pNextPool;

+    pNewPool->m_pNextPool = pPool;

+    if (pPool) {

+        pPool->m_pPrevPool = pNewPool;

+    }

+    m_FirstPool.m_pNextPool = pNewPool;

+    return pNewPool->m_MidPages.Alloc(size);

+}

+FX_LPVOID CFXMEM_FixedMgr::AllocLarge(size_t size)

+{

+    CFXMEM_Pool *pPool = &m_FirstPool;

+    do {

+        if (!pPool->m_bAlone && pPool->m_pLargePage) {

+            FX_LPVOID p = pPool->m_pLargePage->Alloc(size);

+            if (p) {

+                return p;

+            }

+        }

+        pPool = pPool->m_pNextPool;

+    } while(pPool);

+    if (!m_pExtender || !m_MemConfig.nPageSize_Large) {

+        return NULL;

+    }

+    CFXMEM_Pool *pNewPool = NULL;

+#if _FX_WORDSIZE_ == _FX_W64_

+    size_t newSize = ((size + 31) / 32 * 32 + sizeof(CFXMEM_Pool) + sizeof(CFXMEM_Page) + sizeof(CFXMEM_Block) + 4095) / 4096 * 4096;

+#else

+    size_t newSize = (size + 7) / 8 * 8 + sizeof(CFXMEM_Pool) + sizeof(CFXMEM_Page) + sizeof(CFXMEM_Block);

+#endif

+    if (newSize < m_MemConfig.nPageSize_Large * FX_FIXEDMEM_PAGESIZE) {

+        newSize = m_MemConfig.nPageSize_Large * FX_FIXEDMEM_PAGESIZE;

+    }

+    if (!m_pExtender->More(m_pExtender, newSize, (void**)&pNewPool, &newSize)) {

+        return NULL;

+    }

+    pNewPool->Initialize(&m_MemConfig, newSize, 0, 0, 0, 0);

+    pNewPool->m_bAlone = size >= m_MemConfig.nPageSize_Alone * FX_FIXEDMEM_PAGESIZE;

+    pNewPool->m_pPrevPool = &m_FirstPool;

+    pPool = m_FirstPool.m_pNextPool;

+    pNewPool->m_pNextPool = pPool;

+    if (pPool) {

+        pPool->m_pPrevPool = pNewPool;

+    }

+    m_FirstPool.m_pNextPool = pNewPool;

+    return pNewPool->m_pLargePage->Alloc(size);

+}

+size_t CFXMEM_FixedMgr::GetSize(FX_LPVOID p) const

+{

+    const CFXMEM_Pool *pFind = &m_FirstPool;

+    do {

+        if (p > (FX_LPVOID)pFind && p < pFind->m_pLimitPos) {

+            return pFind->GetSize(p);

+        }

+        pFind = pFind->m_pNextPool;

+    } while (pFind);

+    return 0;

+}

+FX_LPVOID CFXMEM_FixedMgr::Alloc(size_t size)

+{

+    FX_LPVOID p;

+    if (size <= 32) {

+        p = AllocSmall(size);

+        if (p) {

+            return p;

+        }

+    }

+    if (size <= FX_FIXEDMEM_MIDBLOCKSIZE) {

+        p = AllocMid(size);

+        if (p) {

+            return p;

+        }

+    }

+    p = AllocLarge(size);

+    return p;

+}

+FX_LPVOID CFXMEM_FixedMgr::ReallocSmall(CFXMEM_Pool* pPool, FX_LPVOID p, size_t oldSize, size_t newSize)

+{

+    FX_LPVOID np = AllocSmall(newSize);

+    if (!np) {

+        return NULL;

+    }

+    FXSYS_memcpy32(np, p, oldSize);

+    pPool->Free(p);

+    return np;

+}

+FX_LPVOID CFXMEM_FixedMgr::Realloc(FX_LPVOID p, size_t newSize)

+{

+    if (!p) {

+        return Alloc(newSize);

+    }

+    size_t oldSize = 0;

+    CFXMEM_Pool *pFind = &m_FirstPool;

+    do {

+        if (p > (FX_LPVOID)pFind && p < pFind->m_pLimitPos) {

+            oldSize = pFind->GetSize(p);

+            if (oldSize >= newSize) {

+                return p;

+            }

+            break;

+        }

+        pFind = pFind->m_pNextPool;

+    } while (pFind);

+    if (!oldSize || !pFind) {

+        return Alloc(newSize);

+    }

+    FX_LPVOID np = NULL;

+    if (newSize <= 32) {

+        np = ReallocSmall(pFind, p, oldSize, newSize);

+        if (np) {

+            return np;

+        }

+    }

+    if (newSize <= FX_FIXEDMEM_MIDBLOCKSIZE) {

+        np = pFind->Realloc(p, oldSize, newSize);

+        if (np) {

+            return np;

+        }

+    }

+    np = Alloc(newSize);

+    if (np) {

+        FXSYS_memcpy32(np, p, oldSize);

+        pFind->Free(p);

+    }

+    if (pFind->m_bAlone && pFind->IsEmpty()) {

+        FreePool(pFind);

+    }

+    return np;

+}

+void CFXMEM_FixedMgr::Free(FX_LPVOID p)

+{

+    CFXMEM_Pool *pFind = &m_FirstPool;

+    do {

+        if (p > (FX_LPVOID)pFind && p < pFind->m_pLimitPos) {

+            pFind->Free(p);

+            if (pFind->m_bAlone && pFind->IsEmpty()) {

+                FreePool(pFind);

+            }

+            return;

+        }

+        pFind = pFind->m_pNextPool;

+    } while (pFind);

+}

+void CFXMEM_FixedMgr::FreePool(CFXMEM_Pool* pPool)

+{

+    FXSYS_assert(pPool->m_bAlone && pPool->IsEmpty());

+    FXSYS_assert(m_pExtender != NULL);

+    CFXMEM_Pool* pPrevPool = pPool->m_pPrevPool;

+    CFXMEM_Pool* pNextPool = pPool->m_pNextPool;

+    if (pPrevPool) {

+        pPrevPool->m_pNextPool = pNextPool;

+    }

+    if (pNextPool) {

+        pNextPool->m_pPrevPool = pPrevPool;

+    }

+    m_pExtender->Free(m_pExtender, pPool);

+}

+void CFXMEM_FixedMgr::FreeAll()

+{

+    if (!m_pExtender) {

+        return;

+    }

+    CFXMEM_Pool* pPool = m_FirstPool.m_pNextPool;

+    while (pPool) {

+        CFXMEM_Pool* pPrevPool = pPool;

+        pPool = pPool->m_pNextPool;

+        m_pExtender->Free(m_pExtender, pPrevPool);

+    }

+    m_FirstPool.m_pNextPool = NULL;

+}

+void CFXMEM_FixedMgr::Purge()

+{

+    if (!m_pExtender) {

+        return;

+    }

+    CFXMEM_Pool* pPool = m_FirstPool.m_pNextPool;

+    while (pPool) {

+        CFXMEM_Pool* pNextPool = pPool->m_pNextPool;

+        if (pPool->IsEmpty()) {

+            CFXMEM_Pool* pPrevPool = pPool->m_pPrevPool;

+            pPrevPool->m_pNextPool = pNextPool;

+            if (pNextPool) {

+                pNextPool->m_pPrevPool = pPrevPool;

+            }

+            m_pExtender->Free(m_pExtender, pPool);

+        }

+        pPool = pNextPool;

+    }

+}

+extern const FX_BYTE OneLeadPos[256] = {

+    8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,

+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,

+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,

+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,

+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+};

+extern const FX_BYTE ZeroLeadPos[256] = {

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,

+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,

+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,

+    4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8,

+};

diff --git a/core/src/fxcrt/fx_basic_plex.cpp b/core/src/fxcrt/fx_basic_plex.cpp
new file mode 100644
index 0000000..dd3a8ba
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_plex.cpp
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_basic.h"

+#include "plex.h"

+CFX_Plex* CFX_Plex::Create(IFX_Allocator* pAllocator, CFX_Plex*& pHead, FX_DWORD nMax, FX_DWORD cbElement)

+{

+    CFX_Plex* p = (CFX_Plex*)FX_Allocator_Alloc(pAllocator, FX_BYTE, sizeof(CFX_Plex) + nMax * cbElement);

+    if (!p) {

+        return NULL;

+    }

+    p->pNext = pHead;

+    pHead = p;

+    return p;

+}

+void CFX_Plex::FreeDataChain(IFX_Allocator* pAllocator)

+{

+    CFX_Plex* p = this;

+    while (p != NULL) {

+        FX_BYTE* bytes = (FX_BYTE*) p;

+        CFX_Plex* pNext = p->pNext;

+        FX_Allocator_Free(pAllocator, bytes);

+        p = pNext;

+    }

+}

diff --git a/core/src/fxcrt/fx_basic_utf.cpp b/core/src/fxcrt/fx_basic_utf.cpp
new file mode 100644
index 0000000..b94e08d
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_utf.cpp
@@ -0,0 +1,102 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_basic.h"

+void CFX_UTF8Decoder::Clear()

+{

+    m_Buffer.Clear();

+    m_PendingBytes = 0;

+}

+void CFX_UTF8Decoder::AppendChar(FX_DWORD ch)

+{

+    m_Buffer.AppendChar((FX_WCHAR)ch);

+}

+void CFX_UTF8Decoder::Input(FX_BYTE byte)

+{

+    if (byte < 0x80) {

+        m_PendingBytes = 0;

+        m_Buffer.AppendChar(byte);

+    } else if (byte < 0xc0) {

+        if (m_PendingBytes == 0) {

+            return;

+        }

+        m_PendingBytes --;

+        m_PendingChar |= (byte & 0x3f) << (m_PendingBytes * 6);

+        if (m_PendingBytes == 0) {

+            AppendChar(m_PendingChar);

+        }

+    } else if (byte < 0xe0) {

+        m_PendingBytes = 1;

+        m_PendingChar = (byte & 0x1f) << 6;

+    } else if (byte < 0xf0) {

+        m_PendingBytes = 2;

+        m_PendingChar = (byte & 0x0f) << 12;

+    } else if (byte < 0xf8) {

+        m_PendingBytes = 3;

+        m_PendingChar = (byte & 0x07) << 18;

+    } else if (byte < 0xfc) {

+        m_PendingBytes = 4;

+        m_PendingChar = (byte & 0x03) << 24;

+    } else if (byte < 0xfe) {

+        m_PendingBytes = 5;

+        m_PendingChar = (byte & 0x01) << 30;

+    }

+}

+void CFX_UTF8Encoder::Input(FX_WCHAR unicode)

+{

+    if ((FX_DWORD)unicode < 0x80) {

+        m_Buffer.AppendChar(unicode);

+    } else {

+        if ((FX_DWORD)unicode >= 0x80000000) {

+            return;

+        }

+        int nbytes = 0;

+        if ((FX_DWORD)unicode < 0x800) {

+            nbytes = 2;

+        } else if ((FX_DWORD)unicode < 0x10000) {

+            nbytes = 3;

+        } else if ((FX_DWORD)unicode < 0x200000) {

+            nbytes = 4;

+        } else if ((FX_DWORD)unicode < 0x4000000) {

+            nbytes = 5;

+        } else {

+            nbytes = 6;

+        }

+        static FX_BYTE prefix[] = {0xc0, 0xe0, 0xf0, 0xf8, 0xfc};

+        int order = 1 << ((nbytes - 1) * 6);

+        int code = unicode;

+        m_Buffer.AppendChar(prefix[nbytes - 2] | (code / order));

+        for (int i = 0; i < nbytes - 1; i ++) {

+            code = code % order;

+            order >>= 6;

+            m_Buffer.AppendChar(0x80 | (code / order));

+        }

+    }

+}

+CFX_ByteString FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len)

+{

+    FXSYS_assert(pwsStr != NULL);

+    if (len < 0) {

+        len = (FX_STRSIZE)FXSYS_wcslen(pwsStr);

+    }

+    CFX_UTF8Encoder encoder;

+    while (len -- > 0) {

+        encoder.Input(*pwsStr ++);

+    }

+    return encoder.GetResult();

+}

+void FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len, CFX_ByteStringL &utf8Str, IFX_Allocator* pAllocator)

+{

+    FXSYS_assert(pwsStr != NULL);

+    if (len < 0) {

+        len = (FX_STRSIZE)FXSYS_wcslen(pwsStr);

+    }

+    CFX_UTF8Encoder encoder(pAllocator);

+    while (len -- > 0) {

+        encoder.Input(*pwsStr ++);

+    }

+    encoder.GetResult(utf8Str);

+}

diff --git a/core/src/fxcrt/fx_basic_util.cpp b/core/src/fxcrt/fx_basic_util.cpp
new file mode 100644
index 0000000..af4d42c
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_util.cpp
@@ -0,0 +1,444 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_basic.h"

+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_

+#include <sys/types.h>

+#include <dirent.h>

+#else

+#include <direct.h>

+#endif

+CFX_PrivateData::~CFX_PrivateData()

+{

+    ClearAll();

+}

+void FX_PRIVATEDATA::FreeData()

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    if (m_bSelfDestruct) {

+        delete (CFX_DestructObject*)m_pData;

+    } else if (m_pCallback) {

+        m_pCallback(m_pData);

+    }

+}

+void CFX_PrivateData::AddData(FX_LPVOID pModuleId, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback, FX_BOOL bSelfDestruct)

+{

+    if (pModuleId == NULL) {

+        return;

+    }

+    FX_PRIVATEDATA* pList = m_DataList.GetData();

+    int count = m_DataList.GetSize();

+    for (int i = 0; i < count; i ++) {

+        if (pList[i].m_pModuleId == pModuleId) {

+            pList[i].FreeData();

+            pList[i].m_pData = pData;

+            pList[i].m_pCallback = callback;

+            return;

+        }

+    }

+    FX_PRIVATEDATA data = {pModuleId, pData, callback, bSelfDestruct};

+    m_DataList.Add(data);

+}

+void CFX_PrivateData::SetPrivateData(FX_LPVOID pModuleId, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)

+{

+    AddData(pModuleId, pData, callback, FALSE);

+}

+void CFX_PrivateData::SetPrivateObj(FX_LPVOID pModuleId, CFX_DestructObject* pObj)

+{

+    AddData(pModuleId, pObj, NULL, TRUE);

+}

+FX_BOOL CFX_PrivateData::RemovePrivateData(FX_LPVOID pModuleId)

+{

+    if (pModuleId == NULL) {

+        return FALSE;

+    }

+    FX_PRIVATEDATA* pList = m_DataList.GetData();

+    int count = m_DataList.GetSize();

+    for (int i = 0; i < count; i ++) {

+        if (pList[i].m_pModuleId == pModuleId) {

+            m_DataList.RemoveAt(i);

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+FX_LPVOID CFX_PrivateData::GetPrivateData(FX_LPVOID pModuleId)

+{

+    if (pModuleId == NULL) {

+        return NULL;

+    }

+    FX_PRIVATEDATA* pList = m_DataList.GetData();

+    int count = m_DataList.GetSize();

+    for (int i = 0; i < count; i ++) {

+        if (pList[i].m_pModuleId == pModuleId) {

+            return pList[i].m_pData;

+        }

+    }

+    return NULL;

+}

+void CFX_PrivateData::ClearAll()

+{

+    FX_PRIVATEDATA* pList = m_DataList.GetData();

+    int count = m_DataList.GetSize();

+    for (int i = 0; i < count; i ++) {

+        pList[i].FreeData();

+    }

+    m_DataList.RemoveAll();

+}

+void FX_atonum(FX_BSTR strc, FX_BOOL& bInteger, void* pData)

+{

+    if (FXSYS_memchr(strc.GetPtr(), '.', strc.GetLength()) == NULL) {

+        bInteger = TRUE;

+        int cc = 0, integer = 0;

+        FX_LPCSTR str = strc.GetCStr();

+        int len = strc.GetLength();

+        FX_BOOL bNegative = FALSE;

+        if (str[0] == '+') {

+            cc++;

+        } else if (str[0] == '-') {

+            bNegative = TRUE;

+            cc++;

+        }

+        while (cc < len) {

+            if (str[cc] < '0' || str[cc] > '9') {

+                break;

+            }

+            integer = integer * 10 + str[cc] - '0';

+            if (integer < 0) {

+                break;

+            }

+            cc ++;

+        }

+        if (bNegative) {

+            integer = -integer;

+        }

+        *(int*)pData = integer;

+    } else {

+        bInteger = FALSE;

+        *(FX_FLOAT*)pData = FX_atof(strc);

+    }

+}

+FX_FLOAT FX_atof(FX_BSTR strc)

+{

+    if (strc.GetLength() == 0) {

+        return 0.0;

+    }

+    int cc = 0;

+    FX_BOOL bNegative = FALSE;

+    FX_LPCSTR str = strc.GetCStr();

+    int len = strc.GetLength();

+    if (str[0] == '+') {

+        cc++;

+    } else if (str[0] == '-') {

+        bNegative = TRUE;

+        cc++;

+    }

+    while (cc < len) {

+        if (str[cc] != '+' && str[cc] != '-') {

+            break;

+        }

+        cc ++;

+    }

+    FX_FLOAT value = 0;

+    while (cc < len) {

+        if (str[cc] == '.') {

+            break;

+        }

+        value = value * 10 + str[cc] - '0';

+        cc ++;

+    }

+    static const FX_FLOAT fraction_scales[] = {0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f,

+                                               0.0000001f, 0.00000001f, 0.000000001f, 0.0000000001f, 0.00000000001f

+                                              };

+    int scale = 0;

+    if (cc < len && str[cc] == '.') {

+        cc ++;

+        while (cc < len) {

+            value += fraction_scales[scale] * (str[cc] - '0');

+            scale ++;

+            if (scale == sizeof fraction_scales / sizeof(FX_FLOAT)) {

+                break;

+            }

+            cc ++;

+        }

+    }

+    return bNegative ? -value : value;

+}

+static FX_BOOL FX_IsDigit(FX_BYTE ch)

+{

+    return (ch >= '0' && ch <= '9') ? TRUE : FALSE;

+}

+static FX_BOOL FX_IsXDigit(FX_BYTE ch)

+{

+    return (FX_IsDigit(ch) || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) ? TRUE : FALSE;

+}

+static FX_BYTE FX_MakeUpper(FX_BYTE ch)

+{

+    if (ch < 'a' || ch > 'z') {

+        return ch;

+    }

+    return ch - 32;

+}

+static int FX_HexToI(FX_BYTE ch)

+{

+    ch = FX_MakeUpper(ch);

+    return FX_IsDigit(ch) ? (ch - '0') : (ch - 55);

+}

+static const unsigned char url_encodeTable[128] = {

+    1,  1,  1,  1,		1,  1,  1,  1,

+    1,  1,  1,  1,		1,  1,  1,  1,

+    1,  1,  1,  1,		1,  1,  1,  1,

+    1,  1,  1,  1,		1,  1,  1,  1,

+    1,  0,  1,  1,		0,  1,  0,  0,

+    0,  0,  0,  0,		0,  0,  0,  0,

+    0,  0,  0,  0,		0,  0,  0,  0,

+    0,  0,  0,  0,		1,  0,  1,  0,

+    0,  0,  0,  0,		0,  0,  0,  0,

+    0,  0,  0,  0,		0,  0,  0,  0,

+    0,  0,  0,  0,		0,  0,  0,  0,

+    0,  0,  0,  1,		1,  1,  1,  0,

+    1,  0,  0,  0,		0,  0,  0,  0,

+    0,  0,  0,  0,		0,  0,  0,  0,

+    0,  0,  0,  0,		0,  0,  0,  0,

+    0,  0,  0,  1,		1,  1,  1,  1,

+};

+CFX_ByteString FX_UrlEncode(const CFX_WideString& wsUrl)

+{

+    const char arDigits[] = "0123456789ABCDEF";

+    CFX_ByteString rUrl;

+    int nLength = wsUrl.GetLength();

+    for (int i = 0; i < nLength; i++) {

+        FX_DWORD word = wsUrl.GetAt(i);

+        if (word > 0x7F || url_encodeTable[word] == 1) {

+            CFX_ByteString bsUri = CFX_ByteString::FromUnicode((FX_WORD)word);

+            int nByte = bsUri.GetLength();

+            for (int j = 0; j < nByte; j++) {

+                rUrl += '%';

+                FX_BYTE code = bsUri.GetAt(j);

+                rUrl += arDigits[code >> 4];

+                rUrl += arDigits[code & 0x0F];

+            }

+        } else {

+            rUrl += CFX_ByteString::FromUnicode((FX_WORD)word);

+        }

+    }

+    return rUrl;

+}

+CFX_WideString FX_UrlDecode(const CFX_ByteString& bsUrl)

+{

+    CFX_ByteString rUrl;

+    int nLength = bsUrl.GetLength();

+    for (int i = 0; i < nLength; i++) {

+        if (i < nLength - 2 && bsUrl[i] == '%' && FX_IsXDigit(bsUrl[i + 1]) && FX_IsXDigit(bsUrl[i + 2])) {

+            rUrl += (FX_HexToI(bsUrl[i + 1]) << 4 | FX_HexToI(bsUrl[i + 2]));

+            i += 2;

+        } else {

+            rUrl += bsUrl[i];

+        }

+    }

+    return CFX_WideString::FromLocal(rUrl);

+}

+CFX_ByteString FX_EncodeURI(const CFX_WideString& wsURI)

+{

+    const char arDigits[] = "0123456789ABCDEF";

+    CFX_ByteString rURI;

+    CFX_ByteString bsUri = wsURI.UTF8Encode();

+    int nLength = bsUri.GetLength();

+    for (int i = 0; i < nLength; i++) {

+        FX_BYTE code = bsUri.GetAt(i);

+        if (code > 0x7F || url_encodeTable[code] == 1) {

+            rURI += '%';

+            rURI += arDigits[code >> 4];

+            rURI += arDigits[code & 0x0F];

+        } else {

+            rURI += code;

+        }

+    }

+    return rURI;

+}

+CFX_WideString FX_DecodeURI(const CFX_ByteString& bsURI)

+{

+    CFX_ByteString rURI;

+    int nLength = bsURI.GetLength();

+    for (int i = 0; i < nLength; i++) {

+        if (i < nLength - 2 && bsURI[i] == '%' && FX_IsXDigit(bsURI[i + 1]) && FX_IsXDigit(bsURI[i + 2])) {

+            rURI += (FX_HexToI(bsURI[i + 1]) << 4 | FX_HexToI(bsURI[i + 2]));

+            i += 2;

+        } else {

+            rURI += bsURI[i];

+        }

+    }

+    return CFX_WideString::FromUTF8(rURI);

+}

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+class CFindFileData : public CFX_Object

+{

+public:

+    virtual ~CFindFileData() {}

+    HANDLE				m_Handle;

+    FX_BOOL				m_bEnd;

+};

+class CFindFileDataA : public CFindFileData

+{

+public:

+    virtual ~CFindFileDataA() {}

+    WIN32_FIND_DATAA	m_FindData;

+};

+class CFindFileDataW : public CFindFileData

+{

+public:

+    virtual ~CFindFileDataW() {}

+    WIN32_FIND_DATAW	m_FindData;

+};

+#endif

+void* FX_OpenFolder(FX_LPCSTR path)

+{

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+#ifndef _WIN32_WCE

+    CFindFileDataA* pData = FX_NEW CFindFileDataA;

+    if (!pData) {

+        return NULL;

+    }

+#ifdef _FX_WINAPI_PARTITION_DESKTOP_

+    pData->m_Handle = FindFirstFileA(CFX_ByteString(path) + "/*.*", &pData->m_FindData);

+#else

+    pData->m_Handle = FindFirstFileExA(CFX_ByteString(path) + "/*.*", FindExInfoStandard, &pData->m_FindData, FindExSearchNameMatch, NULL, 0);

+#endif

+#else

+    CFindFileDataW* pData = FX_NEW CFindFileDataW;

+    if (!pData) {

+        return NULL;

+    }

+    pData->m_Handle = FindFirstFileW(CFX_WideString::FromLocal(path) + L"/*.*", &pData->m_FindData);

+#endif

+    if (pData->m_Handle == INVALID_HANDLE_VALUE) {

+        delete pData;

+        return NULL;

+    }

+    pData->m_bEnd = FALSE;

+    return pData;

+#else

+    DIR* dir = opendir(path);

+    return dir;

+#endif

+}

+void* FX_OpenFolder(FX_LPCWSTR path)

+{

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    CFindFileDataW* pData = FX_NEW CFindFileDataW;

+    if (!pData) {

+        return NULL;

+    }

+#ifdef _FX_WINAPI_PARTITION_DESKTOP_

+    pData->m_Handle = FindFirstFileW(CFX_WideString(path) + L"/*.*", &pData->m_FindData);

+#else

+    pData->m_Handle = FindFirstFileExW(CFX_WideString(path) + L"/*.*", FindExInfoStandard, &pData->m_FindData, FindExSearchNameMatch, NULL, 0);

+#endif

+    if (pData->m_Handle == INVALID_HANDLE_VALUE) {

+        delete pData;

+        return NULL;

+    }

+    pData->m_bEnd = FALSE;

+    return pData;

+#else

+    DIR* dir = opendir(CFX_ByteString::FromUnicode(path));

+    return dir;

+#endif

+}

+FX_BOOL FX_GetNextFile(void* handle, CFX_ByteString& filename, FX_BOOL& bFolder)

+{

+    if (handle == NULL) {

+        return FALSE;

+    }

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+#ifndef _WIN32_WCE

+    CFindFileDataA* pData = (CFindFileDataA*)handle;

+    if (pData->m_bEnd) {

+        return FALSE;

+    }

+    filename = pData->m_FindData.cFileName;

+    bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;

+    if (!FindNextFileA(pData->m_Handle, &pData->m_FindData)) {

+        pData->m_bEnd = TRUE;

+    }

+    return TRUE;

+#else

+    CFindFileDataW* pData = (CFindFileDataW*)handle;

+    if (pData->m_bEnd) {

+        return FALSE;

+    }

+    filename = CFX_ByteString::FromUnicode(pData->m_FindData.cFileName);

+    bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;

+    if (!FindNextFileW(pData->m_Handle, &pData->m_FindData)) {

+        pData->m_bEnd = TRUE;

+    }

+    return TRUE;

+#endif

+#elif defined(__native_client__)

+    abort();

+    return FALSE;

+#else

+    struct dirent *de = readdir((DIR*)handle);

+    if (de == NULL) {

+        return FALSE;

+    }

+    filename = de->d_name;

+    bFolder = de->d_type == DT_DIR;

+    return TRUE;

+#endif

+}

+FX_BOOL FX_GetNextFile(void* handle, CFX_WideString& filename, FX_BOOL& bFolder)

+{

+    if (handle == NULL) {

+        return FALSE;

+    }

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    CFindFileDataW* pData = (CFindFileDataW*)handle;

+    if (pData->m_bEnd) {

+        return FALSE;

+    }

+    filename = pData->m_FindData.cFileName;

+    bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;

+    if (!FindNextFileW(pData->m_Handle, &pData->m_FindData)) {

+        pData->m_bEnd = TRUE;

+    }

+    return TRUE;

+#elif defined(__native_client__)

+    abort();

+    return FALSE;

+#else

+    struct dirent *de = readdir((DIR*)handle);

+    if (de == NULL) {

+        return FALSE;

+    }

+    filename = CFX_WideString::FromLocal(de->d_name);

+    bFolder = de->d_type == DT_DIR;

+    return TRUE;

+#endif

+}

+void FX_CloseFolder(void* handle)

+{

+    if (handle == NULL) {

+        return;

+    }

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    CFindFileData* pData = (CFindFileData*)handle;

+    FindClose(pData->m_Handle);

+    delete pData;

+#else

+    closedir((DIR*)handle);

+#endif

+}

+FX_WCHAR FX_GetFolderSeparator()

+{

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    return '\\';

+#else

+    return '/';

+#endif

+}

diff --git a/core/src/fxcrt/fx_basic_wstring.cpp b/core/src/fxcrt/fx_basic_wstring.cpp
new file mode 100644
index 0000000..900f058
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_wstring.cpp
@@ -0,0 +1,1168 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_basic.h"

+static CFX_StringDataW* FX_AllocStringW(int nLen)

+{

+    if (nLen == 0) {

+        return NULL;

+    }

+    CFX_StringDataW* pData = (CFX_StringDataW*)FX_Alloc(FX_BYTE, sizeof(long) * 3 + (nLen + 1) * sizeof(FX_WCHAR));

+    if (!pData) {

+        return NULL;

+    }

+    pData->m_nAllocLength = nLen;

+    pData->m_nDataLength = nLen;

+    pData->m_nRefs = 1;

+    pData->m_String[nLen] = 0;

+    return pData;

+}

+static void FX_ReleaseStringW(CFX_StringDataW* pData)

+{

+    if (pData == NULL) {

+        return;

+    }

+    pData->m_nRefs --;

+    if (pData->m_nRefs <= 0) {

+        FX_Free(pData);

+    }

+}

+CFX_WideString::~CFX_WideString()

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    m_pData->m_nRefs --;

+    if (m_pData->m_nRefs < 1) {

+        FX_Free(m_pData);

+    }

+}

+void CFX_WideString::InitStr(FX_LPCWSTR lpsz, FX_STRSIZE nLen)

+{

+    if (nLen < 0) {

+        nLen = lpsz ? (FX_STRSIZE)FXSYS_wcslen(lpsz) : 0;

+    }

+    if (nLen) {

+        m_pData = FX_AllocStringW(nLen);

+        if (!m_pData) {

+            return;

+        }

+        FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(FX_WCHAR));

+    } else {

+        m_pData = NULL;

+    }

+}

+CFX_WideString::CFX_WideString(const CFX_WideString& stringSrc)

+{

+    if (stringSrc.m_pData == NULL) {

+        m_pData = NULL;

+        return;

+    }

+    if (stringSrc.m_pData->m_nRefs >= 0) {

+        m_pData = stringSrc.m_pData;

+        m_pData->m_nRefs ++;

+    } else {

+        m_pData = NULL;

+        *this = stringSrc;

+    }

+}

+CFX_WideString::CFX_WideString(FX_WCHAR ch)

+{

+    m_pData = FX_AllocStringW(1);

+    if (m_pData) {

+        m_pData->m_String[0] = ch;

+    }

+}

+CFX_WideString::CFX_WideString(const CFX_WideStringC& str)

+{

+    if (str.IsEmpty()) {

+        m_pData = NULL;

+        return;

+    }

+    m_pData = FX_AllocStringW(str.GetLength());

+    if (m_pData) {

+        FXSYS_memcpy32(m_pData->m_String, str.GetPtr(), str.GetLength()*sizeof(FX_WCHAR));

+    }

+}

+CFX_WideString::CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2)

+{

+    m_pData = NULL;

+    int nNewLen = str1.GetLength() + str2.GetLength();

+    if (nNewLen == 0) {

+        return;

+    }

+    m_pData = FX_AllocStringW(nNewLen);

+    if (m_pData) {

+        FXSYS_memcpy32(m_pData->m_String, str1.GetPtr(), str1.GetLength()*sizeof(FX_WCHAR));

+        FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetPtr(), str2.GetLength()*sizeof(FX_WCHAR));

+    }

+}

+void CFX_WideString::ReleaseBuffer(FX_STRSIZE nNewLength)

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    CopyBeforeWrite();

+    if (nNewLength == -1) {

+        nNewLength = m_pData ? (FX_STRSIZE)FXSYS_wcslen(m_pData->m_String) : 0;

+    }

+    if (nNewLength == 0) {

+        Empty();

+        return;

+    }

+    FXSYS_assert(nNewLength <= m_pData->m_nAllocLength);

+    m_pData->m_nDataLength = nNewLength;

+    m_pData->m_String[nNewLength] = 0;

+}

+const CFX_WideString& CFX_WideString::operator=(FX_LPCWSTR lpsz)

+{

+    if (lpsz == NULL || lpsz[0] == 0) {

+        Empty();

+    } else {

+        AssignCopy((FX_STRSIZE)FXSYS_wcslen(lpsz), lpsz);

+    }

+    return *this;

+}

+const CFX_WideString& CFX_WideString::operator=(const CFX_WideStringC& stringSrc)

+{

+    if (stringSrc.IsEmpty()) {

+        Empty();

+    } else {

+        AssignCopy(stringSrc.GetLength(), stringSrc.GetPtr());

+    }

+    return *this;

+}

+const CFX_WideString& CFX_WideString::operator=(const CFX_WideString& stringSrc)

+{

+    if (m_pData == stringSrc.m_pData) {

+        return *this;

+    }

+    if (stringSrc.IsEmpty()) {

+        Empty();

+    } else if ((m_pData && m_pData->m_nRefs < 0) ||

+               (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) {

+        AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String);

+    } else {

+        Empty();

+        m_pData = stringSrc.m_pData;

+        if (m_pData) {

+            m_pData->m_nRefs ++;

+        }

+    }

+    return *this;

+}

+const CFX_WideString& CFX_WideString::operator+=(FX_WCHAR ch)

+{

+    ConcatInPlace(1, &ch);

+    return *this;

+}

+const CFX_WideString& CFX_WideString::operator+=(FX_LPCWSTR lpsz)

+{

+    if (lpsz) {

+        ConcatInPlace((FX_STRSIZE)FXSYS_wcslen(lpsz), lpsz);

+    }

+    return *this;

+}

+const CFX_WideString& CFX_WideString::operator+=(const CFX_WideString& string)

+{

+    if (string.m_pData == NULL) {

+        return *this;

+    }

+    ConcatInPlace(string.m_pData->m_nDataLength, string.m_pData->m_String);

+    return *this;

+}

+const CFX_WideString& CFX_WideString::operator+=(const CFX_WideStringC& string)

+{

+    if (string.IsEmpty()) {

+        return *this;

+    }

+    ConcatInPlace(string.GetLength(), string.GetPtr());

+    return *this;

+}

+bool operator==(const CFX_WideString& s1, FX_LPCWSTR s2)

+{

+    return s1.Equal(s2);

+}

+bool operator==(FX_LPCWSTR s1, const CFX_WideString& s2)

+{

+    return s2.Equal(s1);

+}

+bool operator==(const CFX_WideString& s1, const CFX_WideString& s2)

+{

+    return s1.Equal(s2);

+}

+bool operator==(const CFX_WideString& s1, const CFX_WideStringC& s2)

+{

+    return s1.Equal(s2);

+}

+bool operator==(const CFX_WideStringC& s1, const CFX_WideString& s2)

+{

+    return s2.Equal(s1);

+}

+bool operator != (const CFX_WideString& s1, FX_LPCWSTR s2)

+{

+    return !s1.Equal(s2);

+}

+bool operator!=(const CFX_WideString& s1, const CFX_WideString& s2)

+{

+    return !s1.Equal(s2);

+}

+bool operator!=(const CFX_WideString& s1, const CFX_WideStringC& s2)

+{

+    return !s1.Equal(s2);

+}

+bool operator!=(const CFX_WideStringC& s1, const CFX_WideString& s2)

+{

+    return !s2.Equal(s1);

+}

+bool CFX_WideString::Equal(const CFX_WideStringC& str) const

+{

+    if (m_pData == NULL) {

+        return str.IsEmpty();

+    }

+    return str.GetLength() == m_pData->m_nDataLength &&

+           FXSYS_memcmp32(str.GetPtr(), m_pData->m_String, m_pData->m_nDataLength * sizeof(FX_WCHAR)) == 0;

+}

+void CFX_WideString::Empty()

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    if (m_pData->m_nRefs > 1) {

+        m_pData->m_nRefs --;

+    } else {

+        FX_Free(m_pData);

+    }

+    m_pData = NULL;

+}

+void CFX_WideString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData)

+{

+    if (nSrcLen == 0 || lpszSrcData == NULL) {

+        return;

+    }

+    if (m_pData == NULL) {

+        m_pData = FX_AllocStringW(nSrcLen);

+        if (m_pData) {

+            FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));

+        }

+        return;

+    }

+    if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nAllocLength) {

+        CFX_StringDataW* pOldData = m_pData;

+        ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcData);

+        FX_ReleaseStringW(pOldData);

+    } else {

+        FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));

+        m_pData->m_nDataLength += nSrcLen;

+        m_pData->m_String[m_pData->m_nDataLength] = 0;

+    }

+}

+void CFX_WideString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data,

+                                FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data)

+{

+    FX_STRSIZE nNewLen = nSrc1Len + nSrc2Len;

+    if (nNewLen == 0) {

+        return;

+    }

+    m_pData = FX_AllocStringW(nNewLen);

+    if (m_pData) {

+        FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len * sizeof(FX_WCHAR));

+        FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len * sizeof(FX_WCHAR));

+    }

+}

+void CFX_WideString::CopyBeforeWrite()

+{

+    if (m_pData == NULL || m_pData->m_nRefs <= 1) {

+        return;

+    }

+    CFX_StringDataW* pData = m_pData;

+    m_pData->m_nRefs --;

+    FX_STRSIZE nDataLength = pData->m_nDataLength;

+    m_pData = FX_AllocStringW(nDataLength);

+    if (m_pData != NULL) {

+        FXSYS_memcpy32(m_pData->m_String, pData->m_String, (nDataLength + 1) * sizeof(FX_WCHAR));

+    }

+}

+void CFX_WideString::AllocBeforeWrite(FX_STRSIZE nLen)

+{

+    if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) {

+        return;

+    }

+    Empty();

+    m_pData = FX_AllocStringW(nLen);

+}

+void CFX_WideString::AssignCopy(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData)

+{

+    AllocBeforeWrite(nSrcLen);

+    FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));

+    m_pData->m_nDataLength = nSrcLen;

+    m_pData->m_String[nSrcLen] = 0;

+}

+int CFX_WideString::Compare(FX_LPCWSTR lpsz) const

+{

+    if (m_pData == NULL) {

+        return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1;

+    }

+    return FXSYS_wcscmp(m_pData->m_String, lpsz);

+}

+CFX_ByteString CFX_WideString::UTF8Encode() const

+{

+    return FX_UTF8Encode(*this);

+}

+CFX_ByteString CFX_WideString::UTF16LE_Encode(FX_BOOL bTerminate) const

+{

+    if (m_pData == NULL) {

+        return bTerminate ? CFX_ByteString(FX_BSTRC("\0\0")) : CFX_ByteString();

+    }

+    int len = m_pData->m_nDataLength;

+    CFX_ByteString result;

+    FX_LPSTR buffer = result.GetBuffer(len * 2 + (bTerminate ? 2 : 0));

+    for (int i = 0; i < len; i ++) {

+        buffer[i * 2] = m_pData->m_String[i] & 0xff;

+        buffer[i * 2 + 1] = m_pData->m_String[i] >> 8;

+    }

+    if (bTerminate) {

+        buffer[len * 2] = 0;

+        buffer[len * 2 + 1] = 0;

+        result.ReleaseBuffer(len * 2 + 2);

+    } else {

+        result.ReleaseBuffer(len * 2);

+    }

+    return result;

+}

+void CFX_WideString::ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap)

+{

+    if (pCharMap == NULL) {

+        pCharMap = CFX_CharMap::GetDefaultMapper();

+    }

+    *this = pCharMap->m_GetWideString(pCharMap, str);

+}

+void CFX_WideString::Reserve(FX_STRSIZE len)

+{

+    GetBuffer(len);

+    ReleaseBuffer(GetLength());

+}

+FX_LPWSTR CFX_WideString::GetBuffer(FX_STRSIZE nMinBufLength)

+{

+    if (m_pData == NULL && nMinBufLength == 0) {

+        return NULL;

+    }

+    if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLength) {

+        return m_pData->m_String;

+    }

+    if (m_pData == NULL) {

+        m_pData = FX_AllocStringW(nMinBufLength);

+        if (!m_pData) {

+            return NULL;

+        }

+        m_pData->m_nDataLength = 0;

+        m_pData->m_String[0] = 0;

+        return m_pData->m_String;

+    }

+    CFX_StringDataW* pOldData = m_pData;

+    FX_STRSIZE nOldLen = pOldData->m_nDataLength;

+    if (nMinBufLength < nOldLen) {

+        nMinBufLength = nOldLen;

+    }

+    m_pData = FX_AllocStringW(nMinBufLength);

+    if (!m_pData) {

+        return NULL;

+    }

+    FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1)*sizeof(FX_WCHAR));

+    m_pData->m_nDataLength = nOldLen;

+    pOldData->m_nRefs --;

+    if (pOldData->m_nRefs <= 0) {

+        FX_Free(pOldData);

+    }

+    return m_pData->m_String;

+}

+CFX_WideString CFX_WideString::FromLocal(const char* str, FX_STRSIZE len)

+{

+    CFX_WideString result;

+    result.ConvertFrom(CFX_ByteString(str, len));

+    return result;

+}

+CFX_WideString CFX_WideString::FromUTF8(const char* str, FX_STRSIZE len)

+{

+    if (!str) {

+        return CFX_WideString();

+    }

+    if (len < 0) {

+        len = 0;

+        while (str[len]) {

+            len ++;

+        }

+    }

+    CFX_UTF8Decoder decoder;

+    for (FX_STRSIZE i = 0; i < len; i ++) {

+        decoder.Input(str[i]);

+    }

+    return decoder.GetResult();

+}

+CFX_WideString CFX_WideString::FromUTF16LE(const unsigned short* wstr, FX_STRSIZE wlen)

+{

+    if (!wstr || !wlen) {

+        return CFX_WideString();

+    }

+    if (wlen < 0) {

+        wlen = 0;

+        while (wstr[wlen]) {

+            wlen ++;

+        }

+    }

+    CFX_WideString result;

+    FX_WCHAR* buf = result.GetBuffer(wlen);

+    for (int i = 0; i < wlen; i ++) {

+        buf[i] = wstr[i];

+    }

+    result.ReleaseBuffer(wlen);

+    return result;

+}

+void CFX_WideString::AllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex,

+                               FX_STRSIZE nExtraLen) const

+{

+    FX_STRSIZE nNewLen = nCopyLen + nExtraLen;

+    if (nNewLen == 0) {

+        return;

+    }

+    ASSERT(dest.m_pData == NULL);

+    dest.m_pData = FX_AllocStringW(nNewLen);

+    if (dest.m_pData) {

+        FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, nCopyLen * sizeof(FX_WCHAR));

+    }

+}

+CFX_WideString CFX_WideString::Left(FX_STRSIZE nCount) const

+{

+    if (m_pData == NULL) {

+        return CFX_WideString();

+    }

+    if (nCount < 0) {

+        nCount = 0;

+    }

+    if (nCount >= m_pData->m_nDataLength) {

+        return *this;

+    }

+    CFX_WideString dest;

+    AllocCopy(dest, nCount, 0, 0);

+    return dest;

+}

+CFX_WideString CFX_WideString::Mid(FX_STRSIZE nFirst) const

+{

+    return Mid(nFirst, m_pData->m_nDataLength - nFirst);

+}

+CFX_WideString CFX_WideString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const

+{

+    if (m_pData == NULL) {

+        return CFX_WideString();

+    }

+    if (nFirst < 0) {

+        nFirst = 0;

+    }

+    if (nCount < 0) {

+        nCount = 0;

+    }

+    if (nFirst + nCount > m_pData->m_nDataLength) {

+        nCount = m_pData->m_nDataLength - nFirst;

+    }

+    if (nFirst > m_pData->m_nDataLength) {

+        nCount = 0;

+    }

+    if (nFirst == 0 && nFirst + nCount == m_pData->m_nDataLength) {

+        return *this;

+    }

+    CFX_WideString dest;

+    AllocCopy(dest, nCount, nFirst, 0);

+    return dest;

+}

+CFX_WideString CFX_WideString::Right(FX_STRSIZE nCount) const

+{

+    if (m_pData == NULL) {

+        return CFX_WideString();

+    }

+    if (nCount < 0) {

+        nCount = 0;

+    }

+    if (nCount >= m_pData->m_nDataLength) {

+        return *this;

+    }

+    CFX_WideString dest;

+    AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount, 0);

+    return dest;

+}

+int CFX_WideString::CompareNoCase(FX_LPCWSTR lpsz) const

+{

+    if (m_pData == NULL) {

+        return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1;

+    }

+    return FXSYS_wcsicmp(m_pData->m_String, lpsz);

+}

+int CFX_WideString::Compare(const CFX_WideString& str) const

+{

+    if (m_pData == NULL) {

+        if (str.m_pData == NULL) {

+            return 0;

+        }

+        return -1;

+    } else if (str.m_pData == NULL) {

+        return 1;

+    }

+    int this_len = m_pData->m_nDataLength;

+    int that_len = str.m_pData->m_nDataLength;

+    int min_len = this_len < that_len ? this_len : that_len;

+    for (int i = 0; i < min_len; i ++) {

+        if (m_pData->m_String[i] < str.m_pData->m_String[i]) {

+            return -1;

+        } else if (m_pData->m_String[i] > str.m_pData->m_String[i]) {

+            return 1;

+        }

+    }

+    if (this_len < that_len) {

+        return -1;

+    } else if (this_len > that_len) {

+        return 1;

+    }

+    return 0;

+}

+FX_LPWSTR CFX_WideString::LockBuffer()

+{

+    if (m_pData == NULL) {

+        return NULL;

+    }

+    FX_LPWSTR lpsz = GetBuffer(0);

+    m_pData->m_nRefs = -1;

+    return lpsz;

+}

+void CFX_WideString::SetAt(FX_STRSIZE nIndex, FX_WCHAR ch)

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    ASSERT(nIndex >= 0);

+    ASSERT(nIndex < m_pData->m_nDataLength);

+    CopyBeforeWrite();

+    m_pData->m_String[nIndex] = ch;

+}

+void CFX_WideString::MakeLower()

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    CopyBeforeWrite();

+    if (GetLength() < 1) {

+        return;

+    }

+    FXSYS_wcslwr(m_pData->m_String);

+}

+void CFX_WideString::MakeUpper()

+{

+    if (m_pData == NULL) {

+        return;

+    }

+    CopyBeforeWrite();

+    if (GetLength() < 1) {

+        return;

+    }

+    FXSYS_wcsupr(m_pData->m_String);

+}

+FX_STRSIZE CFX_WideString::Find(FX_LPCWSTR lpszSub, FX_STRSIZE nStart) const

+{

+    FX_STRSIZE nLength = GetLength();

+    if (nLength < 1 || nStart > nLength) {

+        return -1;

+    }

+    FX_LPCWSTR lpsz = (FX_LPCWSTR)FXSYS_wcsstr(m_pData->m_String + nStart, lpszSub);

+    return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);

+}

+FX_STRSIZE CFX_WideString::Find(FX_WCHAR ch, FX_STRSIZE nStart) const

+{

+    if (m_pData == NULL) {

+        return -1;

+    }

+    FX_STRSIZE nLength = m_pData->m_nDataLength;

+    if (nStart >= nLength) {

+        return -1;

+    }

+    FX_LPCWSTR lpsz = (FX_LPCWSTR)FXSYS_wcschr(m_pData->m_String + nStart, ch);

+    return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);

+}

+void CFX_WideString::TrimRight(FX_LPCWSTR lpszTargetList)

+{

+    FXSYS_assert(lpszTargetList != NULL);

+    if (m_pData == NULL || *lpszTargetList == 0) {

+        return;

+    }

+    CopyBeforeWrite();

+    FX_STRSIZE len = GetLength();

+    if (len < 1) {

+        return;

+    }

+    FX_STRSIZE pos = len;

+    while (pos) {

+        if (FXSYS_wcschr(lpszTargetList, m_pData->m_String[pos - 1]) == NULL) {

+            break;

+        }

+        pos --;

+    }

+    if (pos < len) {

+        m_pData->m_String[pos] = 0;

+        m_pData->m_nDataLength = pos;

+    }

+}

+void CFX_WideString::TrimRight(FX_WCHAR chTarget)

+{

+    FX_WCHAR str[2] = {chTarget, 0};

+    TrimRight(str);

+}

+void CFX_WideString::TrimRight()

+{

+    TrimRight(L"\x09\x0a\x0b\x0c\x0d\x20");

+}

+void CFX_WideString::TrimLeft(FX_LPCWSTR lpszTargets)

+{

+    FXSYS_assert(lpszTargets != NULL);

+    if (m_pData == NULL || *lpszTargets == 0) {

+        return;

+    }

+    CopyBeforeWrite();

+    if (GetLength() < 1) {

+        return;

+    }

+    FX_LPCWSTR lpsz = m_pData->m_String;

+    while (*lpsz != 0) {

+        if (FXSYS_wcschr(lpszTargets, *lpsz) == NULL) {

+            break;

+        }

+        lpsz ++;

+    }

+    if (lpsz != m_pData->m_String) {

+        int nDataLength = m_pData->m_nDataLength - (FX_STRSIZE)(lpsz - m_pData->m_String);

+        FXSYS_memmove32(m_pData->m_String, lpsz, (nDataLength + 1)*sizeof(FX_WCHAR));

+        m_pData->m_nDataLength = nDataLength;

+    }

+}

+void CFX_WideString::TrimLeft(FX_WCHAR chTarget)

+{

+    FX_WCHAR str[2] = {chTarget, 0};

+    TrimLeft(str);

+}

+void CFX_WideString::TrimLeft()

+{

+    TrimLeft(L"\x09\x0a\x0b\x0c\x0d\x20");

+}

+FX_STRSIZE CFX_WideString::Replace(FX_LPCWSTR lpszOld, FX_LPCWSTR lpszNew)

+{

+    if (GetLength() < 1) {

+        return 0;

+    }

+    if (lpszOld == NULL) {

+        return 0;

+    }

+    FX_STRSIZE nSourceLen = (FX_STRSIZE)FXSYS_wcslen(lpszOld);

+    if (nSourceLen == 0) {

+        return 0;

+    }

+    FX_STRSIZE nReplacementLen = lpszNew ? (FX_STRSIZE)FXSYS_wcslen(lpszNew) : 0;

+    FX_STRSIZE nCount = 0;

+    FX_LPWSTR lpszStart = m_pData->m_String;

+    FX_LPWSTR lpszEnd = m_pData->m_String + m_pData->m_nDataLength;

+    FX_LPWSTR lpszTarget;

+    {

+        while ((lpszTarget = (FX_LPWSTR)FXSYS_wcsstr(lpszStart, lpszOld)) != NULL && lpszStart < lpszEnd) {

+            nCount++;

+            lpszStart = lpszTarget + nSourceLen;

+        }

+    }

+    if (nCount > 0) {

+        CopyBeforeWrite();

+        FX_STRSIZE nOldLength = m_pData->m_nDataLength;

+        FX_STRSIZE nNewLength =  nOldLength + (nReplacementLen - nSourceLen) * nCount;

+        if (m_pData->m_nAllocLength < nNewLength || m_pData->m_nRefs > 1) {

+            CFX_StringDataW* pOldData = m_pData;

+            FX_LPCWSTR pstr = m_pData->m_String;

+            m_pData = FX_AllocStringW(nNewLength);

+            if (!m_pData) {

+                return 0;

+            }

+            FXSYS_memcpy32(m_pData->m_String, pstr, pOldData->m_nDataLength * sizeof(FX_WCHAR));

+            FX_ReleaseStringW(pOldData);

+        }

+        lpszStart = m_pData->m_String;

+        lpszEnd = m_pData->m_String + FX_MAX(m_pData->m_nDataLength, nNewLength);

+        {

+            while ((lpszTarget = (FX_LPWSTR)FXSYS_wcsstr(lpszStart, lpszOld)) != NULL && lpszStart < lpszEnd) {

+                FX_STRSIZE nBalance = nOldLength - (FX_STRSIZE)(lpszTarget - m_pData->m_String + nSourceLen);

+                FXSYS_memmove32(lpszTarget + nReplacementLen, lpszTarget + nSourceLen, nBalance * sizeof(FX_WCHAR));

+                FXSYS_memcpy32(lpszTarget, lpszNew, nReplacementLen * sizeof(FX_WCHAR));

+                lpszStart = lpszTarget + nReplacementLen;

+                lpszStart[nBalance] = 0;

+                nOldLength += (nReplacementLen - nSourceLen);

+            }

+        }

+        ASSERT(m_pData->m_String[nNewLength] == 0);

+        m_pData->m_nDataLength = nNewLength;

+    }

+    return nCount;

+}

+FX_STRSIZE CFX_WideString::Insert(FX_STRSIZE nIndex, FX_WCHAR ch)

+{

+    CopyBeforeWrite();

+    if (nIndex < 0) {

+        nIndex = 0;

+    }

+    FX_STRSIZE nNewLength = GetLength();

+    if (nIndex > nNewLength) {

+        nIndex = nNewLength;

+    }

+    nNewLength++;

+    if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) {

+        CFX_StringDataW* pOldData = m_pData;

+        FX_LPCWSTR pstr = m_pData->m_String;

+        m_pData = FX_AllocStringW(nNewLength);

+        if (!m_pData) {

+            return 0;

+        }

+        if(pOldData != NULL) {

+            FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength + 1)*sizeof(FX_WCHAR));

+            FX_ReleaseStringW(pOldData);

+        } else {

+            m_pData->m_String[0] = 0;

+        }

+    }

+    FXSYS_memmove32(m_pData->m_String + nIndex + 1,

+                    m_pData->m_String + nIndex, (nNewLength - nIndex)*sizeof(FX_WCHAR));

+    m_pData->m_String[nIndex] = ch;

+    m_pData->m_nDataLength = nNewLength;

+    return nNewLength;

+}

+FX_STRSIZE CFX_WideString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount)

+{

+    if (GetLength() < 1) {

+        return 0;

+    }

+    if (nIndex < 0) {

+        nIndex = 0;

+    }

+    FX_STRSIZE nOldLength = m_pData->m_nDataLength;

+    if (nCount > 0 && nIndex < nOldLength) {

+        CopyBeforeWrite();

+        int nBytesToCopy = nOldLength - (nIndex + nCount) + 1;

+        FXSYS_memmove32(m_pData->m_String + nIndex,

+                        m_pData->m_String + nIndex + nCount, nBytesToCopy * sizeof(FX_WCHAR));

+        m_pData->m_nDataLength = nOldLength - nCount;

+    }

+    return m_pData->m_nDataLength;

+}

+FX_STRSIZE CFX_WideString::Remove(FX_WCHAR chRemove)

+{

+    if (m_pData == NULL) {

+        return 0;

+    }

+    CopyBeforeWrite();

+    if (GetLength() < 1) {

+        return 0;

+    }

+    FX_LPWSTR pstrSource = m_pData->m_String;

+    FX_LPWSTR pstrDest = m_pData->m_String;

+    FX_LPWSTR pstrEnd = m_pData->m_String + m_pData->m_nDataLength;

+    while (pstrSource < pstrEnd) {

+        if (*pstrSource != chRemove) {

+            *pstrDest = *pstrSource;

+            pstrDest ++;

+        }

+        pstrSource ++;

+    }

+    *pstrDest = 0;

+    FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest);

+    m_pData->m_nDataLength -= nCount;

+    return nCount;

+}

+#define FORCE_ANSI      0x10000

+#define FORCE_UNICODE   0x20000

+#define FORCE_INT64     0x40000

+void CFX_WideString::FormatV(FX_LPCWSTR lpszFormat, va_list argList)

+{

+    va_list argListSave;

+#if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__)

+    va_copy(argListSave, argList);

+#else

+    argListSave = argList;

+#endif

+    int nMaxLen = 0;

+    for (FX_LPCWSTR lpsz = lpszFormat; *lpsz != 0; lpsz ++) {

+        if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') {

+            nMaxLen += (FX_STRSIZE)FXSYS_wcslen(lpsz);

+            continue;

+        }

+        int nItemLen = 0;

+        int nWidth = 0;

+        for (; *lpsz != 0; lpsz ++) {

+            if (*lpsz == '#') {

+                nMaxLen += 2;

+            } else if (*lpsz == '*') {

+                nWidth = va_arg(argList, int);

+            } else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' ||

+                       *lpsz == ' ')

+                ;

+            else {

+                break;

+            }

+        }

+        if (nWidth == 0) {

+            nWidth = FXSYS_wtoi(lpsz);

+            for (; *lpsz != 0 && (*lpsz) <= '9' && (*lpsz) >= '0'; lpsz ++)

+                ;

+        }

+        if (nWidth < 0 || nWidth > 128 * 1024) {

+            lpszFormat = (FX_LPCWSTR)L"Bad width";

+            nMaxLen = 10;

+            break;

+        }

+        int nPrecision = 0;

+        if (*lpsz == '.') {

+            lpsz ++;

+            if (*lpsz == '*') {

+                nPrecision = va_arg(argList, int);

+                lpsz ++;

+            } else {

+                nPrecision = FXSYS_wtoi(lpsz);

+                for (; *lpsz != 0 && (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)

+                    ;

+            }

+        }

+        if (nPrecision < 0 || nPrecision > 128 * 1024) {

+            lpszFormat = (FX_LPCWSTR)L"Bad precision";

+            nMaxLen = 14;

+            break;

+        }

+        int nModifier = 0;

+        if (*lpsz == L'I' && *(lpsz + 1) == L'6' && *(lpsz + 2) == L'4') {

+            lpsz += 3;

+            nModifier = FORCE_INT64;

+        } else {

+            switch (*lpsz) {

+                case 'h':

+                    nModifier = FORCE_ANSI;

+                    lpsz ++;

+                    break;

+                case 'l':

+                    nModifier = FORCE_UNICODE;

+                    lpsz ++;

+                    break;

+                case 'F':

+                case 'N':

+                case 'L':

+                    lpsz ++;

+                    break;

+            }

+        }

+        switch (*lpsz | nModifier) {

+            case 'c':

+            case 'C':

+                nItemLen = 2;

+                va_arg(argList, int);

+                break;

+            case 'c'|FORCE_ANSI:

+            case 'C'|FORCE_ANSI:

+                nItemLen = 2;

+                va_arg(argList, int);

+                break;

+            case 'c'|FORCE_UNICODE:

+            case 'C'|FORCE_UNICODE:

+                nItemLen = 2;

+                va_arg(argList, int);

+                break;

+            case 's': {

+                    FX_LPCWSTR pstrNextArg = va_arg(argList, FX_LPCWSTR);

+                    if (pstrNextArg == NULL) {

+                        nItemLen = 6;

+                    } else {

+                        nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);

+                        if (nItemLen < 1) {

+                            nItemLen = 1;

+                        }

+                    }

+                }

+                break;

+            case 'S': {

+                    FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);

+                    if (pstrNextArg == NULL) {

+                        nItemLen = 6;

+                    } else {

+                        nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);

+                        if (nItemLen < 1) {

+                            nItemLen = 1;

+                        }

+                    }

+                }

+                break;

+            case 's'|FORCE_ANSI:

+            case 'S'|FORCE_ANSI: {

+                    FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);

+                    if (pstrNextArg == NULL) {

+                        nItemLen = 6;

+                    } else {

+                        nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);

+                        if (nItemLen < 1) {

+                            nItemLen = 1;

+                        }

+                    }

+                }

+                break;

+            case 's'|FORCE_UNICODE:

+            case 'S'|FORCE_UNICODE: {

+                    FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);

+                    if (pstrNextArg == NULL) {

+                        nItemLen = 6;

+                    } else {

+                        nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);

+                        if (nItemLen < 1) {

+                            nItemLen = 1;

+                        }

+                    }

+                }

+                break;

+        }

+        if (nItemLen != 0) {

+            if (nPrecision != 0 && nItemLen > nPrecision) {

+                nItemLen = nPrecision;

+            }

+            if (nItemLen < nWidth) {

+                nItemLen = nWidth;

+            }

+        } else {

+            switch (*lpsz) {

+                case 'd':

+                case 'i':

+                case 'u':

+                case 'x':

+                case 'X':

+                case 'o':

+                    if (nModifier & FORCE_INT64) {

+                        va_arg(argList, FX_INT64);

+                    } else {

+                        va_arg(argList, int);

+                    }

+                    nItemLen = 32;

+                    if (nItemLen < nWidth + nPrecision) {

+                        nItemLen = nWidth + nPrecision;

+                    }

+                    break;

+                case 'a':

+                case 'A':

+                case 'e':

+                case 'E':

+                case 'g':

+                case 'G':

+                    va_arg(argList, double);

+                    nItemLen = 128;

+                    if (nItemLen < nWidth + nPrecision) {

+                        nItemLen = nWidth + nPrecision;

+                    }

+                    break;

+                case 'f':

+                    if (nWidth + nPrecision > 100) {

+                        nItemLen = nPrecision + nWidth + 128;

+                    } else {

+                        double f;

+                        char pszTemp[256];

+                        f = va_arg(argList, double);

+                        FXSYS_snprintf(pszTemp, sizeof(pszTemp), "%*.*f", nWidth, nPrecision + 6, f );

+                        nItemLen = (FX_STRSIZE)FXSYS_strlen(pszTemp);

+                    }

+                    break;

+                case 'p':

+                    va_arg(argList, void*);

+                    nItemLen = 32;

+                    if (nItemLen < nWidth + nPrecision) {

+                        nItemLen = nWidth + nPrecision;

+                    }

+                    break;

+                case 'n':

+                    va_arg(argList, int*);

+                    break;

+            }

+        }

+        nMaxLen += nItemLen;

+    }

+    GetBuffer(nMaxLen);

+    if (m_pData) {

+        FXSYS_vswprintf((wchar_t*)m_pData->m_String, nMaxLen + 1, (const wchar_t*)lpszFormat, argListSave);

+        ReleaseBuffer();

+    }

+    va_end(argListSave);

+}

+void CFX_WideString::Format(FX_LPCWSTR lpszFormat, ...)

+{

+    va_list argList;

+    va_start(argList, lpszFormat);

+    FormatV(lpszFormat, argList);

+    va_end(argList);

+}

+FX_FLOAT FX_wtof(FX_LPCWSTR str, int len)

+{

+    if (len == 0) {

+        return 0.0;

+    }

+    int cc = 0;

+    FX_BOOL bNegative = FALSE;

+    if (str[0] == '+') {

+        cc++;

+    } else if (str[0] == '-') {

+        bNegative = TRUE;

+        cc++;

+    }

+    int integer = 0;

+    while (cc < len) {

+        if (str[cc] == '.') {

+            break;

+        }

+        integer = integer * 10 + str[cc] - '0';

+        cc ++;

+    }

+    FX_FLOAT fraction = 0;

+    if (str[cc] == '.') {

+        cc ++;

+        FX_FLOAT scale = 0.1f;

+        while (cc < len) {

+            fraction += scale * (str[cc] - '0');

+            scale *= 0.1f;

+            cc ++;

+        }

+    }

+    fraction += (FX_FLOAT)integer;

+    return bNegative ? -fraction : fraction;

+}

+int CFX_WideString::GetInteger() const

+{

+    if (m_pData == NULL) {

+        return 0;

+    }

+    return FXSYS_wtoi(m_pData->m_String);

+}

+FX_FLOAT CFX_WideString::GetFloat() const

+{

+    if (m_pData == NULL) {

+        return 0.0;

+    }

+    return FX_wtof(m_pData->m_String, m_pData->m_nDataLength);

+}

+void CFX_WideStringL::Empty(IFX_Allocator* pAllocator)

+{

+    if (m_Ptr) {

+        FX_Allocator_Free(pAllocator, (FX_LPVOID)m_Ptr);

+    }

+    m_Ptr = NULL, m_Length = 0;

+}

+void CFX_WideStringL::Set(FX_WSTR src, IFX_Allocator* pAllocator)

+{

+    Empty(pAllocator);

+    if (src.GetPtr() != NULL && src.GetLength() > 0) {

+        FX_LPWSTR str = FX_Allocator_Alloc(pAllocator, FX_WCHAR, src.GetLength() + 1);

+        if (!str) {

+            return;

+        }

+        FXSYS_memcpy32(str, src.GetPtr(), src.GetLength()*sizeof(FX_WCHAR));

+        str[src.GetLength()] = '\0';

+        *(FX_LPWSTR*)(&m_Ptr) = str;

+        m_Length = src.GetLength();

+    }

+}

+int CFX_WideStringL::GetInteger() const

+{

+    if (!m_Ptr) {

+        return 0;

+    }

+    return FXSYS_wtoi(m_Ptr);

+}

+FX_FLOAT CFX_WideStringL::GetFloat() const

+{

+    if (!m_Ptr) {

+        return 0.0f;

+    }

+    return FX_wtof(m_Ptr, m_Length);

+}

+void CFX_WideStringL::TrimRight(FX_LPCWSTR lpszTargets)

+{

+    if (!lpszTargets || *lpszTargets == 0 || !m_Ptr || m_Length < 1) {

+        return;

+    }

+    FX_STRSIZE pos = m_Length;

+    while (pos) {

+        if (FXSYS_wcschr(lpszTargets, m_Ptr[pos - 1]) == NULL) {

+            break;

+        }

+        pos --;

+    }

+    if (pos < m_Length) {

+        (*(FX_LPWSTR*)(&m_Ptr))[pos] = 0;

+        m_Length = pos;

+    }

+}

+static CFX_ByteString _DefMap_GetByteString(CFX_CharMap* pCharMap, const CFX_WideString& widestr)

+{

+    int src_len = widestr.GetLength();

+    int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0;

+    int dest_len = FXSYS_WideCharToMultiByte(codepage, 0, widestr, src_len, NULL, 0, NULL, NULL);

+    if (dest_len == 0) {

+        return CFX_ByteString();

+    }

+    CFX_ByteString bytestr;

+    FX_LPSTR dest_buf = bytestr.GetBuffer(dest_len);

+    FXSYS_WideCharToMultiByte(codepage, 0, widestr, src_len, dest_buf, dest_len, NULL, NULL);

+    bytestr.ReleaseBuffer(dest_len);

+    return bytestr;

+}

+static CFX_WideString _DefMap_GetWideString(CFX_CharMap* pCharMap, const CFX_ByteString& bytestr)

+{

+    int src_len = bytestr.GetLength();

+    int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0;

+    int dest_len = FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, NULL, 0);

+    if (dest_len == 0) {

+        return CFX_WideString();

+    }

+    CFX_WideString widestr;

+    FX_LPWSTR dest_buf = widestr.GetBuffer(dest_len);

+    FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, dest_buf, dest_len);

+    widestr.ReleaseBuffer(dest_len);

+    return widestr;

+}

+static int _DefMap_GetGBKCodePage()

+{

+    return 936;

+}

+static int _DefMap_GetUHCCodePage()

+{

+    return 949;

+}

+static int _DefMap_GetJISCodePage()

+{

+    return 932;

+}

+static int _DefMap_GetBig5CodePage()

+{

+    return 950;

+}

+static const CFX_CharMap g_DefaultMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, NULL};

+static const CFX_CharMap g_DefaultGBKMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetGBKCodePage};

+static const CFX_CharMap g_DefaultJISMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetJISCodePage};

+static const CFX_CharMap g_DefaultUHCMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetUHCCodePage};

+static const CFX_CharMap g_DefaultBig5Mapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetBig5CodePage};

+CFX_CharMap* CFX_CharMap::GetDefaultMapper(FX_INT32 codepage)

+{

+    switch (codepage) {

+        case 0:

+            return (CFX_CharMap*)&g_DefaultMapper;

+        case 932:

+            return (CFX_CharMap*)&g_DefaultJISMapper;

+        case 936:

+            return (CFX_CharMap*)&g_DefaultGBKMapper;

+        case 949:

+            return (CFX_CharMap*)&g_DefaultUHCMapper;

+        case 950:

+            return (CFX_CharMap*)&g_DefaultBig5Mapper;

+    }

+    return NULL;

+}

diff --git a/core/src/fxcrt/fx_extension.cpp b/core/src/fxcrt/fx_extension.cpp
new file mode 100644
index 0000000..79d3006
--- /dev/null
+++ b/core/src/fxcrt/fx_extension.cpp
@@ -0,0 +1,401 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_ext.h"

+#include "extension.h"

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+#include <wincrypt.h>

+#else

+#include <ctime>

+#endif

+FX_HFILE FX_File_Open(FX_BSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator)

+{

+    IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);

+    if (pFA && !pFA->Open(fileName, dwMode)) {

+        pFA->Release(pAllocator);

+        return NULL;

+    }

+    return (FX_HFILE)pFA;

+}

+FX_HFILE FX_File_Open(FX_WSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator)

+{

+    IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);

+    if (pFA && !pFA->Open(fileName, dwMode)) {

+        pFA->Release(pAllocator);

+        return NULL;

+    }

+    return (FX_HFILE)pFA;

+}

+void FX_File_Close(FX_HFILE hFile, IFX_Allocator* pAllocator)

+{

+    FXSYS_assert(hFile != NULL);

+    ((IFXCRT_FileAccess*)hFile)->Close();

+    ((IFXCRT_FileAccess*)hFile)->Release(pAllocator);

+}

+FX_FILESIZE FX_File_GetSize(FX_HFILE hFile)

+{

+    FXSYS_assert(hFile != NULL);

+    return ((IFXCRT_FileAccess*)hFile)->GetSize();

+}

+FX_FILESIZE FX_File_GetPosition(FX_HFILE hFile)

+{

+    FXSYS_assert(hFile != NULL);

+    return ((IFXCRT_FileAccess*)hFile)->GetPosition();

+}

+FX_FILESIZE FX_File_SetPosition(FX_HFILE hFile, FX_FILESIZE pos)

+{

+    FXSYS_assert(hFile != NULL);

+    return ((IFXCRT_FileAccess*)hFile)->SetPosition(pos);

+}

+size_t FX_File_Read(FX_HFILE hFile, void* pBuffer, size_t szBuffer)

+{

+    FXSYS_assert(hFile != NULL);

+    return ((IFXCRT_FileAccess*)hFile)->Read(pBuffer, szBuffer);

+}

+size_t FX_File_ReadPos(FX_HFILE hFile, void* pBuffer, size_t szBuffer, FX_FILESIZE pos)

+{

+    FXSYS_assert(hFile != NULL);

+    return ((IFXCRT_FileAccess*)hFile)->ReadPos(pBuffer, szBuffer, pos);

+}

+size_t FX_File_Write(FX_HFILE hFile, const void* pBuffer, size_t szBuffer)

+{

+    FXSYS_assert(hFile != NULL);

+    return ((IFXCRT_FileAccess*)hFile)->Write(pBuffer, szBuffer);

+}

+size_t FX_File_WritePos(FX_HFILE hFile, const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)

+{

+    FXSYS_assert(hFile != NULL);

+    return ((IFXCRT_FileAccess*)hFile)->WritePos(pBuffer, szBuffer, pos);

+}

+FX_BOOL FX_File_Flush(FX_HFILE hFile)

+{

+    FXSYS_assert(hFile != NULL);

+    return ((IFXCRT_FileAccess*)hFile)->Flush();

+}

+FX_BOOL FX_File_Truncate(FX_HFILE hFile, FX_FILESIZE szFile)

+{

+    FXSYS_assert(hFile != NULL);

+    return ((IFXCRT_FileAccess*)hFile)->Truncate(szFile);

+}

+IFX_FileStream* FX_CreateFileStream(FX_LPCSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator)

+{

+    IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);

+    if (!pFA) {

+        return NULL;

+    }

+    if (!pFA->Open(filename, dwModes)) {

+        pFA->Release(pAllocator);

+        return NULL;

+    }

+    if (pAllocator) {

+        return FX_NewAtAllocator(pAllocator) CFX_CRTFileStream(pFA, pAllocator);

+    } else {

+        return FX_NEW CFX_CRTFileStream(pFA, pAllocator);

+    }

+}

+IFX_FileStream* FX_CreateFileStream(FX_LPCWSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator)

+{

+    IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);

+    if (!pFA) {

+        return NULL;

+    }

+    if (!pFA->Open(filename, dwModes)) {

+        pFA->Release(pAllocator);

+        return NULL;

+    }

+    if (pAllocator) {

+        return FX_NewAtAllocator(pAllocator) CFX_CRTFileStream(pFA, pAllocator);

+    } else {

+        return FX_NEW CFX_CRTFileStream(pFA, pAllocator);

+    }

+}

+IFX_FileWrite* FX_CreateFileWrite(FX_LPCSTR filename, IFX_Allocator* pAllocator)

+{

+    return FX_CreateFileStream(filename, FX_FILEMODE_Truncate, pAllocator);

+}

+IFX_FileWrite* FX_CreateFileWrite(FX_LPCWSTR filename, IFX_Allocator* pAllocator)

+{

+    return FX_CreateFileStream(filename, FX_FILEMODE_Truncate, pAllocator);

+}

+IFX_FileRead* FX_CreateFileRead(FX_LPCSTR filename, IFX_Allocator* pAllocator)

+{

+    return FX_CreateFileStream(filename, FX_FILEMODE_ReadOnly, pAllocator);

+}

+IFX_FileRead* FX_CreateFileRead(FX_LPCWSTR filename, IFX_Allocator* pAllocator)

+{

+    return FX_CreateFileStream(filename, FX_FILEMODE_ReadOnly, pAllocator);

+}

+IFX_MemoryStream* FX_CreateMemoryStream(FX_LPBYTE pBuffer, size_t dwSize, FX_BOOL bTakeOver, IFX_Allocator* pAllocator)

+{

+    if (pAllocator) {

+        return FX_NewAtAllocator(pAllocator)CFX_MemoryStream(pBuffer, dwSize, bTakeOver, pAllocator);

+    } else {

+        return FX_NEW CFX_MemoryStream(pBuffer, dwSize, bTakeOver, NULL);

+    }

+}

+IFX_MemoryStream* FX_CreateMemoryStream(FX_BOOL bConsecutive, IFX_Allocator* pAllocator)

+{

+    if (pAllocator) {

+        return FX_NewAtAllocator(pAllocator)CFX_MemoryStream(bConsecutive, pAllocator);

+    } else {

+        return FX_NEW CFX_MemoryStream(bConsecutive, NULL);

+    }

+}

+#ifdef __cplusplus

+extern "C" {

+#endif

+FX_FLOAT FXSYS_tan(FX_FLOAT a)

+{

+    return (FX_FLOAT)tan(a);

+}

+FX_FLOAT FXSYS_logb(FX_FLOAT b, FX_FLOAT x)

+{

+    return FXSYS_log(x) / FXSYS_log(b);

+}

+FX_FLOAT FXSYS_strtof(FX_LPCSTR pcsStr, FX_INT32 iLength, FX_INT32 *pUsedLen)

+{

+    FXSYS_assert(pcsStr != NULL);

+    if (iLength < 0) {

+        iLength = (FX_INT32)FXSYS_strlen(pcsStr);

+    }

+    CFX_WideString ws = CFX_WideString::FromLocal(pcsStr, iLength);

+    return FXSYS_wcstof((FX_LPCWSTR)ws, iLength, pUsedLen);

+}

+FX_FLOAT FXSYS_wcstof(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_INT32 *pUsedLen)

+{

+    FXSYS_assert(pwsStr != NULL);

+    if (iLength < 0) {

+        iLength = (FX_INT32)FXSYS_wcslen(pwsStr);

+    }

+    if (iLength == 0) {

+        return 0.0f;

+    }

+    FX_INT32 iUsedLen = 0;

+    FX_BOOL bNegtive = FALSE;

+    switch (pwsStr[iUsedLen]) {

+        case '-':

+            bNegtive = TRUE;

+        case '+':

+            iUsedLen++;

+            break;

+    }

+    FX_FLOAT fValue = 0.0f;

+    while (iUsedLen < iLength) {

+        FX_WCHAR wch = pwsStr[iUsedLen];

+        if (wch >= L'0' && wch <= L'9') {

+            fValue = fValue * 10.0f + (wch - L'0');

+        } else {

+            break;

+        }

+        iUsedLen++;

+    }

+    if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') {

+        FX_FLOAT fPrecise = 0.1f;

+        while (++iUsedLen < iLength) {

+            FX_WCHAR wch = pwsStr[iUsedLen];

+            if (wch >= L'0' && wch <= L'9') {

+                fValue += (wch - L'0') * fPrecise;

+                fPrecise *= 0.1f;

+            } else {

+                break;

+            }

+        }

+    }

+    if (pUsedLen) {

+        *pUsedLen = iUsedLen;

+    }

+    return bNegtive ? -fValue : fValue;

+}

+FX_LPWSTR FXSYS_wcsncpy(FX_LPWSTR dstStr, FX_LPCWSTR srcStr, size_t count)

+{

+    FXSYS_assert(dstStr != NULL && srcStr != NULL && count > 0);

+    for (size_t i = 0; i < count; ++i)

+        if ((dstStr[i] = srcStr[i]) == L'\0') {

+            break;

+        }

+    return dstStr;

+}

+FX_INT32 FXSYS_wcsnicmp(FX_LPCWSTR s1, FX_LPCWSTR s2, size_t count)

+{

+    FXSYS_assert(s1 != NULL && s2 != NULL && count > 0);

+    FX_WCHAR wch1 = 0, wch2 = 0;

+    while (count-- > 0) {

+        wch1 = (FX_WCHAR)FXSYS_tolower(*s1++);

+        wch2 = (FX_WCHAR)FXSYS_tolower(*s2++);

+        if (wch1 != wch2) {

+            break;

+        }

+    }

+    return wch1 - wch2;

+}

+FX_INT32 FXSYS_strnicmp(FX_LPCSTR s1, FX_LPCSTR s2, size_t count)

+{

+    FXSYS_assert(s1 != NULL && s2 != NULL && count > 0);

+    FX_CHAR ch1 = 0, ch2 = 0;

+    while (count-- > 0) {

+        ch1 = (FX_CHAR)FXSYS_tolower(*s1++);

+        ch2 = (FX_CHAR)FXSYS_tolower(*s2++);

+        if (ch1 != ch2) {

+            break;

+        }

+    }

+    return ch1 - ch2;

+}

+FX_DWORD FX_HashCode_String_GetA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase)

+{

+    FXSYS_assert(pStr != NULL);

+    if (iLength < 0) {

+        iLength = (FX_INT32)FXSYS_strlen(pStr);

+    }

+    FX_LPCSTR pStrEnd = pStr + iLength;

+    FX_DWORD dwHashCode = 0;

+    if (bIgnoreCase) {

+        while (pStr < pStrEnd) {

+            dwHashCode = 31 * dwHashCode + FXSYS_tolower(*pStr++);

+        }

+    } else {

+        while (pStr < pStrEnd) {

+            dwHashCode = 31 * dwHashCode + *pStr ++;

+        }

+    }

+    return dwHashCode;

+}

+FX_DWORD FX_HashCode_String_GetW(FX_LPCWSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase)

+{

+    FXSYS_assert(pStr != NULL);

+    if (iLength < 0) {

+        iLength = (FX_INT32)FXSYS_wcslen(pStr);

+    }

+    FX_LPCWSTR pStrEnd = pStr + iLength;

+    FX_DWORD dwHashCode = 0;

+    if (bIgnoreCase) {

+        while (pStr < pStrEnd) {

+            dwHashCode = 1313 * dwHashCode + FXSYS_tolower(*pStr++);

+        }

+    } else {

+        while (pStr < pStrEnd) {

+            dwHashCode = 1313 * dwHashCode + *pStr ++;

+        }

+    }

+    return dwHashCode;

+}

+#ifdef __cplusplus

+}

+#endif

+#ifdef __cplusplus

+extern "C" {

+#endif

+FX_LPVOID FX_Random_MT_Start(FX_DWORD dwSeed)

+{

+    FX_LPMTRANDOMCONTEXT pContext = FX_Alloc(FX_MTRANDOMCONTEXT, 1);

+    if (!pContext) {

+        return NULL;

+    }

+    pContext->mt[0] = dwSeed;

+    FX_DWORD &i = pContext->mti;

+    FX_LPDWORD pBuf = pContext->mt;

+    for (i = 1; i < MT_N; i ++) {

+        pBuf[i] = (1812433253UL * (pBuf[i - 1] ^ (pBuf[i - 1] >> 30)) + i);

+    }

+    pContext->bHaveSeed = TRUE;

+    return pContext;

+}

+FX_DWORD FX_Random_MT_Generate(FX_LPVOID pContext)

+{

+    FXSYS_assert(pContext != NULL);

+    FX_LPMTRANDOMCONTEXT pMTC = (FX_LPMTRANDOMCONTEXT)pContext;

+    FX_DWORD v;

+    static FX_DWORD mag[2] = {0, MT_Matrix_A};

+    FX_DWORD &mti = pMTC->mti;

+    FX_LPDWORD pBuf = pMTC->mt;

+    if ((int)mti < 0 || mti >= MT_N) {

+        if (mti > MT_N && !pMTC->bHaveSeed) {

+            return 0;

+        }

+        FX_DWORD kk;

+        for (kk = 0; kk < MT_N - MT_M; kk ++) {

+            v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask);

+            pBuf[kk] = pBuf[kk + MT_M] ^ (v >> 1) ^ mag[v & 1];

+        }

+        for (; kk < MT_N - 1; kk ++) {

+            v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask);

+            pBuf[kk] = pBuf[kk + (MT_M - MT_N)] ^ (v >> 1) ^ mag[v & 1];

+        }

+        v = (pBuf[MT_N - 1] & MT_Upper_Mask) | (pBuf[0] & MT_Lower_Mask);

+        pBuf[MT_N - 1] = pBuf[MT_M - 1] ^ (v >> 1) ^ mag[v & 1];

+        mti = 0;

+    }

+    v = pBuf[mti ++];

+    v ^= (v >> 11);

+    v ^= (v << 7) & 0x9d2c5680UL;

+    v ^= (v << 15) & 0xefc60000UL;

+    v ^= (v >> 18);

+    return v;

+}

+void FX_Random_MT_Close(FX_LPVOID pContext)

+{

+    FXSYS_assert(pContext != NULL);

+    FX_Free(pContext);

+}

+void FX_Random_GenerateMT(FX_LPDWORD pBuffer, FX_INT32 iCount)

+{

+    FX_DWORD dwSeed;

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    if (!FX_GenerateCryptoRandom(&dwSeed, 1)) {

+        FX_Random_GenerateBase(&dwSeed, 1);

+    }

+#else

+    FX_Random_GenerateBase(&dwSeed, 1);

+#endif

+    FX_LPVOID pContext = FX_Random_MT_Start(dwSeed);

+    while (iCount -- > 0) {

+        *pBuffer ++ = FX_Random_MT_Generate(pContext);

+    }

+    FX_Random_MT_Close(pContext);

+}

+void FX_Random_GenerateBase(FX_LPDWORD pBuffer, FX_INT32 iCount)

+{

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    SYSTEMTIME st1, st2;

+    ::GetSystemTime(&st1);

+    do {

+        ::GetSystemTime(&st2);

+    } while (FXSYS_memcmp32(&st1, &st2, sizeof(SYSTEMTIME)) == 0);

+    FX_DWORD dwHash1 = FX_HashCode_String_GetA((FX_LPCSTR)&st1, sizeof(st1), TRUE);

+    FX_DWORD dwHash2 = FX_HashCode_String_GetA((FX_LPCSTR)&st2, sizeof(st2), TRUE);

+    ::srand((dwHash1 << 16) | (FX_DWORD)dwHash2);

+#else

+    time_t tmLast = time(NULL), tmCur;

+    while ((tmCur = time(NULL)) == tmLast);

+    ::srand((tmCur << 16) | (tmLast & 0xFFFF));

+#endif

+    while (iCount -- > 0) {

+        *pBuffer ++ = (FX_DWORD)((::rand() << 16) | (::rand() & 0xFFFF));

+    }

+}

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+FX_BOOL FX_GenerateCryptoRandom(FX_LPDWORD pBuffer, FX_INT32 iCount)

+{

+    HCRYPTPROV hCP = NULL;

+    if (!::CryptAcquireContext(&hCP, NULL, NULL, PROV_RSA_FULL, 0) || hCP == NULL) {

+        return FALSE;

+    }

+    ::CryptGenRandom(hCP, iCount * sizeof(FX_DWORD), (FX_LPBYTE)pBuffer);

+    ::CryptReleaseContext(hCP, 0);

+    return TRUE;

+}

+#endif

+void FX_Random_GenerateCrypto(FX_LPDWORD pBuffer, FX_INT32 iCount)

+{

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+    FX_GenerateCryptoRandom(pBuffer, iCount);

+#else

+    FX_Random_GenerateBase(pBuffer, iCount);

+#endif

+}

+#ifdef __cplusplus

+}

+#endif

diff --git a/core/src/fxcrt/fx_ucddata.cpp b/core/src/fxcrt/fx_ucddata.cpp
new file mode 100644
index 0000000..8ea343f
--- /dev/null
+++ b/core/src/fxcrt/fx_ucddata.cpp
@@ -0,0 +1,4145 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536] = {
+    0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe8ae5, 0xfffe9b5c, 0xfffe9ada, 0xfffe9b1a, 0xfffe9b5b, 0xfffe9a93, 0xfffe9a93,
+    0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9b53, 0xfffe9b53, 0xfffe9b53, 0xfffe9ad3,
+    0xfffe9323, 0xfffeb005, 0xfffeb002, 0xfffeb24b, 0xfffeb248, 0xfffeb249, 0xfffeb00b, 0xfffeb002, 0x007eb000, 0x00feb001, 0xfffeb00b, 0xfffeb208, 0xfffeb1c7, 0xfffeb20e, 0xfffeb1c7, 0xfffeb1c6,
+    0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffeb1c7, 0xfffeb007, 0x017eb000, 0xfffeb00b, 0x01feb001, 0xfffeb005,
+    0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0x027eb000, 0xfffeb008, 0x02feb001, 0xfffeb00b, 0xff80b00b,
+    0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0x037eb000, 0xfffeb00f, 0x03feb001, 0xfffeb00b, 0xfffeb293,
+    0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb35d, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293,
+    0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293,
+    0xfffe91c3, 0xfffeb000, 0xfffeb249, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb062, 0x047eb000, 0xfffeb00b, 0xfffeb28f, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb249, 0xfffeb248, 0xfffeb122, 0xfffeb122, 0xfffeb010, 0xfffeb04b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb122, 0xfffeb062, 0x04feb001, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb000,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb022, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb022, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb010, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb010, 0xfffeb022, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb062, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb010,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea183,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea183, 0xfffea183, 0xfffea183, 0xfffea183,
+    0xfffea183, 0xfffea183, 0xfffea183, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb007, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb193, 0xfffeb193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb047, 0xfffeb00f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe80a4, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08f, 0xfffea193,
+    0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffeb085, 0xfffea193, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,
+    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffed0cb, 0xfffed0cb, 0xfffed0cb, 0xfffed0cb, 0xfffed164, 0xfffed164, 0xfffed00b, 0xfffed00b, 0xfffed14b, 0xfffed249, 0xfffed249, 0xfffed149, 0xfffed1c7, 0xfffed147, 0xfffed00b, 0xfffed00b,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed145, 0xfffed164, 0xfffed164, 0xfffed145, 0xfffed145,
+    0xfffed164, 0xfffed14b, 0xfffeb94b, 0xfffeb94b, 0xfffec14b, 0xfffeb94b, 0xfffec94b, 0xfffeb94b, 0xfffec94b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec14b,
+    0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,
+    0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed164,
+    0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed249, 0xfffed0ca, 0xfffed0ca, 0xfffed14b, 0xfffed14b, 0xfffed14b,
+    0xfffea193, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffea14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b,
+    0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b,
+    0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b,
+    0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b,
+    0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffed14b, 0xfffed14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b,
+    0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec14b, 0xfffec94b, 0xfffec14b,
+    0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec14b, 0xfffec945, 0xfffec14b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed0cb, 0xfffed193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed14b, 0xfffed14b, 0xfffea193, 0xfffea193, 0xfffed00b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffec14b, 0xfffec14b,
+    0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,
+    0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffe8164, 0xfffeb28b,
+    0xfffeb14b, 0xfffea193, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,
+    0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8164, 0xfffe8164, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,
+    0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,
+    0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,
+    0xfffed14b, 0xfffec14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,
+    0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,
+    0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,
+    0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffeb14b, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164,
+    0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,
+    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,
+    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffeb08b, 0xfffeb00b, 0xfffeb00b, 0xfffeb007, 0xfffeb005, 0xfffeb08b, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,
+    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe80a4, 0xfffe80a4,
+    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4,
+    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffeb053,
+    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffe8024,
+    0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffeb04f, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffe8024, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffeb053,
+    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb04b, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb249, 0xfffeb249, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb049, 0xfffeb04b, 0xfffeb248, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffeb053, 0xfffeb053,
+    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+    0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffeb053,
+    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+    0xfffe8024, 0xfffeb248, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffea193,
+    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+    0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053,
+    0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb248, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b,
+    0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffea053,
+    0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffea053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+    0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb053, 0xfffeb053,
+    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb049, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053,
+    0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb248,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb04b,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04f, 0xfffeb04f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffe8024, 0xfffe8024,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffe8024,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb050, 0xfffeb050, 0xfffeb050, 0xfffeb050, 0xfffeb04b, 0xfffeb050, 0xfffeb050, 0xfffeb043, 0xfffeb050, 0xfffeb050, 0xfffeb04f, 0xfffeb043, 0xfffeb045, 0xfffeb045, 0xfffeb045,
+    0xfffeb045, 0xfffeb045, 0xfffeb043, 0xfffeb04b, 0xfffeb045, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffea193, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffea193, 0x057eb000, 0x05feb001, 0x067eb000, 0x06feb001, 0xfffeb053, 0xfffeb053,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04f,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffeb04f, 0xfffeb04f,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb050, 0xfffeb050, 0xfffeb04f, 0xfffeb050, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e,
+    0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e,
+    0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,
+    0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,
+    0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,
+    0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,
+    0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,
+    0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,
+    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,
+    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,
+    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,
+    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,
+    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193,
+    0xfffeb04b, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb00f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb30f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0x077eb000, 0x07feb001, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffeb04f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e,
+    0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb04f, 0xfffeb04f, 0xfffeb044, 0xfffeb05e, 0xfffeb04f, 0xfffeb04b, 0xfffeb04f, 0xfffeb248, 0xfffeb05e, 0xfffea19e, 0xfffe8024, 0xfffe8024,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb005, 0xfffeb005, 0xfffeb00f, 0xfffeb00f, 0xfffeb010, 0xfffeb00b, 0xfffeb005, 0xfffeb005, 0xfffeb00b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb303, 0xfffe8024,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb005, 0xfffeb005, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb01e, 0xfffeb01e,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024,
+    0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffe8024, 0xfffea193,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053,
+    0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f,
+    0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb010, 0xfffeb00b, 0xfffe8024,
+    0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb303, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb292, 0xfffe9a93, 0xfffe9a93, 0xfffe9853, 0xfffe9893,
+    0xfffeb00f, 0xfffeb003, 0xfffeb00f, 0xff82b00f, 0xff84b011, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0x0806b000, 0x0888b002, 0xfffeb000, 0xfffeb002, 0x090ab000, 0x098cb001, 0xfffeb000, 0xfffeb002,
+    0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00d, 0xfffeb00d, 0xfffeb00d, 0xfffeb00f, 0xfffe9b1a, 0xfffe9b5a, 0xfffe9c53, 0xfffe9bd3, 0xfffe9c93, 0xfffe9c13, 0xfffe9b93, 0xfffeb1c3,
+    0xfffeb249, 0xfffeb249, 0xfffeb249, 0xfffeb249, 0xfffeb249, 0xfffeb009, 0xfffeb009, 0xfffeb009, 0xfffeb00b, 0x0a7eb000, 0x0afeb001, 0xfffeb022, 0xfffeb004, 0xfffeb004, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb1c7, 0x0b7eb000, 0x0bfeb001, 0xfffeb004, 0xfffeb004, 0xfffeb004, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00f, 0xfffeb00b, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00b, 0xfffeb00f, 0xfffeb00f, 0xfffeb30f,
+    0xfffeb294, 0xfffeb28b, 0xfffeb28b, 0xfffeb28b, 0xfffeb28b, 0xfffe82a4, 0xfffe82a4, 0xfffe82a4, 0xfffe82a4, 0xfffe82a4, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93,
+    0xfffeb10b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb122, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb20b, 0xfffeb20b, 0xfffeb00b, 0x0c7eb000, 0x0cfeb001, 0xfffeb062,
+    0xfffeb10b, 0xfffeb122, 0xfffeb122, 0xfffeb122, 0xfffeb122, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb20b, 0xfffeb20b, 0xfffeb00b, 0x0d7eb000, 0x0dfeb001, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb249, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248,
+    0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb249, 0xfffeb248, 0xfffeb248, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb193, 0xfffeb193, 0xfffeb193,
+    0xfffeb193, 0xfffea193, 0xfffeb193, 0xfffeb193, 0xfffeb193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb009, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb009, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb062, 0xfffeb00b, 0xfffeb04b, 0xfffeb008, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb062, 0xfffeb04b, 0xfffeb04b, 0xfffeb24b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b,
+    0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb022, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0x0e7eb022, 0x0efeb00b, 0x0f7eb00b, 0x0ffeb022, 0x107eb00b, 0x10feb00b, 0xfffeb00b, 0xfffeb022,
+    0xfffeb00b, 0xfffeb022, 0xfffeb208, 0xfffeb248, 0xfffeb00b, 0x117eb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022,
+    0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x11feb022, 0x127eb022, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x12feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0x137eb022, 0x13feb00b, 0x147eb00b, 0x14feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0x157eb022, 0x15feb022, 0x167eb022, 0x16feb022, 0x177eb00b, 0x17feb00b, 0x187eb022, 0x18feb022, 0xfffeb00b, 0xfffeb00b, 0x197eb022, 0x19feb022,
+    0x1a7eb00b, 0x1afeb00b, 0x1b7eb00b, 0x1bfeb00b, 0x1c7eb00b, 0x1cfeb00b, 0x1d7eb00b, 0x1dfeb00b, 0x1e7eb00b, 0x1efeb00b, 0x1f7eb00b, 0x1ffeb00b, 0x207eb00b, 0x20feb00b, 0x217eb00b, 0x21feb00b,
+    0x227eb00b, 0x22feb00b, 0x237eb022, 0x23feb022, 0x247eb00b, 0x24feb00b, 0x257eb022, 0x25feb022, 0x267eb00b, 0x26feb00b, 0x277eb00b, 0x27feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x287eb00b,
+    0x28feb00b, 0x297eb00b, 0x29feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0x2a7eb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0x2afeb00b, 0x2b7eb00b, 0xfffeb00b, 0xfffeb022, 0x2bfeb00b, 0xfffeb00b, 0x2c7eb00b, 0x2cfeb00b, 0xfffeb00b, 0x2d7eb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0x2dfeb00b, 0x2e7eb00b, 0x2efeb00b, 0x2f7eb00b, 0x2ffeb00b, 0x307eb00b, 0x30feb00b, 0x317eb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x31feb00b, 0x327eb00b, 0x32feb00b, 0x337eb00b, 0x33feb00b, 0xfffeb00b, 0xfffeb00b,
+    0x347eb00b, 0x34feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x357eb00b, 0x35feb00b, 0x367eb00b, 0x36feb00b, 0x377eb00b, 0x37feb00b, 0x387eb00b, 0x38feb00b, 0x397eb00b, 0x39feb00b,
+    0x3a7eb00b, 0x3afeb00b, 0x3b7eb00b, 0x3bfeb00b, 0x3c7eb00b, 0x3cfeb00b, 0x3d7eb00b, 0x3dfeb00b, 0x3e7eb00b, 0x3efeb00b, 0x3f7eb00b, 0x3ffeb00b, 0x407eb00b, 0x40feb00b, 0xfffeb00b, 0xfffeb00b,
+    0x417eb00b, 0x41feb00b, 0x427eb00b, 0x42feb00b, 0x437eb00b, 0xfffeb00b, 0x43feb00b, 0x447eb00b, 0xfffeb00b, 0xfffeb00b, 0x44feb00b, 0x457eb00b, 0x45feb00b, 0x467eb00b, 0x46feb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x477eb00b, 0x47feb00b, 0x487eb00b, 0x48feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x497eb000, 0x49feb001, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122,
+    0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,
+    0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,
+    0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,
+    0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,
+    0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,
+    0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b,
+    0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe304b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe0024, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe0024, 0xfffe3022, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe0024, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3002, 0xfffe3002, 0xfffe3002, 0xfffe3002, 0xfffe0024,
+    0xfffe0024, 0xfffe300b, 0xfffe3005, 0xfffe3005, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x4a7e3000, 0x4afe3001, 0x4b7e3000, 0x4bfe3001, 0x4c7e3000, 0x4cfe3001, 0x4d7e3000, 0x4dfe3001,
+    0x4e7e3000, 0x4efe3001, 0x4f7e3000, 0x4ffe3001, 0x507e3000, 0x50fe3001, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+    0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0x517e300b, 0x51fe300b, 0x527e3000, 0x52fe3001, 0xfffe300b, 0x537e300b, 0x53fe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x547e300b, 0x54fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x557e300b, 0x55fe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0x567e300b, 0x56fe300b, 0x577e300b, 0x57fe300b, 0x587e3000, 0x58fe3001, 0x597e3000, 0x59fe3001, 0x5a7e3000, 0x5afe3001, 0x5b7e3000, 0x5bfe3001, 0x5c7e3000, 0x5cfe3001,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0x5d7e3000, 0x5dfe3001, 0x5e7e3000, 0x5efe3001, 0x5f7e3000, 0x5ffe3001, 0x607e3000, 0x60fe3001, 0x617e3000, 0x61fe3001, 0x627e3000, 0x62fe3001, 0x637e3000,
+    0x63fe3001, 0x647e3000, 0x64fe3001, 0x657e3000, 0x65fe3001, 0x667e3000, 0x66fe3001, 0x677e3000, 0x67fe3001, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x687e300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0x68fe300b, 0x697e300b, 0xfffe300b, 0xfffe300b, 0x69fe300b, 0x6a7e300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x6afe300b,
+    0x6b7e300b, 0x6bfe300b, 0x6c7e300b, 0xfffe300b, 0x6cfe300b, 0x6d7e300b, 0xfffe300b, 0xfffe300b, 0x6dfe3000, 0x6e7e3001, 0x6efe3000, 0x6f7e3001, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x6ffe300b, 0xfffe300b, 0xfffe300b, 0x707e300b, 0x70fe300b, 0xfffe300b, 0xfffe300b, 0x717e3000, 0x71fe3001, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x727e300b, 0x72fe300b, 0x737e300b, 0x73fe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x747e300b, 0x74fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x757e300b, 0x75fe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x767e300b, 0x76fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x777e300b, 0x77fe300b, 0xfffe300b, 0xfffe300b, 0x787e300b, 0x78fe300b, 0x797e300b,
+    0x79fe300b, 0x7a7e300b, 0x7afe300b, 0x7b7e300b, 0x7bfe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x7c7e300b, 0x7cfe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0x7d7e300b, 0x7dfe300b, 0x7e7e300b, 0x7efe300b, 0x7f7e300b, 0x7ffe300b, 0x807e300b, 0x80fe300b, 0x817e300b, 0x81fe300b, 0x827e300b, 0x82fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0x837e300b, 0x83fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x847e300b, 0x84fe300b, 0x857e300b, 0x85fe300b, 0x867e300b, 0x86fe300b, 0x877e300b, 0x87fe300b, 0xfffe300b, 0x887e300b,
+    0x88fe300b, 0xfffe300b, 0xfffe300b, 0x897e300b, 0x89fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x8a7e300b, 0x8afe300b, 0x8b7e300b, 0x8bfe300b, 0x8c7e300b,
+    0x8cfe300b, 0x8d7e300b, 0x8dfe300b, 0x8e7e300b, 0x8efe300b, 0x8f7e300b, 0x8ffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x907e300b, 0x90fe300b, 0x917e300b,
+    0x91fe300b, 0x927e300b, 0x92fe300b, 0x937e300b, 0x93fe300b, 0x947e300b, 0x94fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x957e300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0x95fe300b, 0x967e300b, 0x96fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x977e300b, 0x97fe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x987e300b, 0x98fe300b, 0x997e300b, 0x99fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb005, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00b, 0xfffeb005, 0xfffeb00f,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffeb001, 0xfffeb001, 0x9a7eb000, 0x9afeb001, 0x9b7eb000, 0x9bfeb001, 0xfffeb002, 0xfffeb002, 0xfffeb002, 0x9c7eb000, 0x9cfeb001, 0xfffeb002, 0x9d7eb000, 0x9dfeb001, 0xfffeb00f, 0xfffeb00f,
+    0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00b, 0xfffeb00f, 0xfffeb000, 0xfffeb00f, 0xfffeb00b, 0xfffeb00b, 0x9e7eb000, 0x9efeb001, 0xfffeb00b, 0xfffeb00b,
+    0x9f7eb000, 0x9ffeb001, 0xa07eb000, 0xa0feb001, 0xa17eb000, 0xa1feb001, 0xa27eb000, 0xa2feb001, 0xa37eb000, 0xa3feb001, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb005, 0xfffeb00b,
+    0xfffeb00f, 0xfffeb00f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe330c, 0xffff3001, 0xffff3001, 0xfffe300c, 0xfffe300c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xa40eb000, 0xa490b001, 0xa512b000, 0xa594b001, 0xa616b000, 0xa698b001, 0xa71ab000, 0xa79cb001,
+    0xa81eb000, 0xa8a0b001, 0xfffe300c, 0xfffe300c, 0xa922b000, 0xa9a4b001, 0xaa7eb000, 0xaafeb001, 0xab7eb000, 0xabfeb001, 0xac7eb000, 0xacfeb001, 0xfffe3004, 0xfffe3000, 0xfffe3001, 0xfffe3001,
+    0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe2193, 0xfffe2193, 0xfffe2193, 0xfffe2193, 0xfffe2193, 0xfffe2193,
+    0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe3044, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe0024, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe3044, 0xfffe0024, 0xfffe0024, 0xfffe2193, 0xfffe2193, 0xfffe3004, 0xfffe3004, 0xfffe3044, 0xfffe3044, 0xfffe304c,
+    0xfffe3004, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3004, 0xfffeb044, 0xfffe3044, 0xfffe3044, 0xfffe304c,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffeb04c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe0024,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0064, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0064, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304f, 0xfffe304f,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe300f, 0xfffe3005, 0xfffe300f,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193,
+    0xfffeb193, 0xfffeb193, 0xfffeb193, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+    0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb249, 0xfffeb24b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb010, 0xfffeb010, 0xfffeb005, 0xfffeb005, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053,
+    0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04f, 0xfffeb04f,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffeb04f,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b,
+    0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057,
+    0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053,
+    0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053,
+    0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffe8024,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e,
+    0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb04f, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,
+    0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+    0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+    0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,
+    0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+    0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe0024,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe0024,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+    0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe0024,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+    0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe0064,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe0024,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe0024,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024,
+    0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb08b, 0xfffea193, 0xfffeb08b,
+    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb20b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,
+    0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffe80a4,
+    0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964,
+    0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964,
+    0xfffed964, 0xfffed964, 0xfffed964, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed800, 0xfffed801,
+    0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed964, 0xfffed964, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964,
+    0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4,
+    0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed949, 0xfffed80b, 0xfffed964, 0xfffed964,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+    0xfffe3007, 0xfffe3001, 0xfffe3001, 0xfffe3007, 0xfffe3007, 0xfffe3005, 0xfffe3005, 0xfffe3000, 0xfffe3001, 0xfffe300d, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+    0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000,
+    0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe300c, 0xfffe300c, 0xfffe3000, 0xfffe3001, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xffa6300c,
+    0xfffe31c1, 0xfffe300c, 0xfffe31c1, 0xfffe0024, 0xfffe3004, 0xfffe31c4, 0xfffe3005, 0xfffe3005, 0xfffe300c, 0xad7e3000, 0xadfe3001, 0xae7e3000, 0xaefe3001, 0xaf7e3000, 0xaffe3001, 0xfffe324c,
+    0xfffe300c, 0xfffe300c, 0xfffe320c, 0xfffe320c, 0xb07e300c, 0xb0fe300c, 0xfffe300c, 0xfffe0024, 0xfffe300c, 0xfffe3248, 0xfffe3249, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+    0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed964, 0xfffe9a94,
+    0xfffe0024, 0xffff3005, 0xfffe300c, 0xfffe324c, 0xfffe3248, 0xfffe3249, 0xfffe300c, 0xfffe300c, 0xb1283000, 0xb1aa3001, 0xfffe300c, 0xfffe320c, 0xffff31c1, 0xfffeb20c, 0xffff31c1, 0xfffe31cc,
+    0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xffff31c4, 0xffff3004, 0xb27e300c, 0xfffe300c, 0xb2fe300c, 0xffff3005,
+    0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xb37eb000, 0xfffe300c, 0xb3feb001, 0xfffe300c, 0xfffeb00c,
+    0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+    0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xb42c3000, 0xfffe300c, 0xb4ae3001, 0xfffeb00c, 0xb57e3000,
+    0xb5fe3001, 0xfffeb001, 0xb67eb000, 0xb6feb001, 0xfffeb001, 0xfffe3004, 0xfffe304b, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044,
+    0xfffe3044, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe3044, 0xfffe3044,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024,
+    0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+    0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+    0xfffe3249, 0xfffe3248, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe3248, 0xfffe3248, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024,
+    0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe3013, 0xfffe3013, 0xfffe3013, 0xfffe3011, 0xfffe3022, 0xfffe1aa4, 0xfffe1aa4,
+};
+extern const FX_WCHAR gs_FX_TextLayout_VerticalMirror[64] = {
+    0xFE33, 0xFE32, 0xFE31, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xFE3B,
+    0xFE3C, 0xFE39, 0xFE3A, 0xFE34, 0xFE35, 0xFE36, 0xFE37, 0xFE38, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+};
+extern const FX_WCHAR gs_FX_TextLayout_BidiMirror[512] = {
+    0x0029, 0x0028, 0x003E, 0x003C, 0x005D, 0x005B, 0x007D, 0x007B, 0x00BB, 0x00AB, 0x0F3B, 0x0F3A, 0x0F3D, 0x0F3C, 0x169C, 0x169B,
+    0x2019, 0x2018, 0x201D, 0x201C, 0x203A, 0x2039, 0x2046, 0x2045, 0x207E, 0x207D, 0x208E, 0x208D, 0x220B, 0x220C, 0x220D, 0x2208,
+    0x2209, 0x220A, 0x29F5, 0x223D, 0x223C, 0x22CD, 0x2253, 0x2252, 0x2255, 0x2254, 0x2265, 0x2264, 0x2267, 0x2266, 0x2269, 0x2268,
+    0x226B, 0x226A, 0x226F, 0x226E, 0x2271, 0x2270, 0x2273, 0x2272, 0x2275, 0x2274, 0x2277, 0x2276, 0x2279, 0x2278, 0x227B, 0x227A,
+    0x227D, 0x227C, 0x227F, 0x227E, 0x2281, 0x2280, 0x2283, 0x2282, 0x2285, 0x2284, 0x2287, 0x2286, 0x2289, 0x2288, 0x228B, 0x228A,
+    0x2290, 0x228F, 0x2292, 0x2291, 0x29B8, 0x22A3, 0x22A2, 0x2ADE, 0x2AE4, 0x2AE3, 0x2AE5, 0x22B1, 0x22B0, 0x22B3, 0x22B2, 0x22B5,
+    0x22B4, 0x22B7, 0x22B6, 0x22CA, 0x22C9, 0x22CC, 0x22CB, 0x2243, 0x22D1, 0x22D0, 0x22D7, 0x22D6, 0x22D9, 0x22D8, 0x22DB, 0x22DA,
+    0x22DD, 0x22DC, 0x22DF, 0x22DE, 0x22E1, 0x22E0, 0x22E3, 0x22E2, 0x22E5, 0x22E4, 0x22E7, 0x22E6, 0x22E9, 0x22E8, 0x22EB, 0x22EA,
+    0x22ED, 0x22EC, 0x22F1, 0x22F0, 0x22FA, 0x22FB, 0x22FC, 0x22FD, 0x22FE, 0x22F2, 0x22F3, 0x22F4, 0x22F6, 0x22F7, 0x2309, 0x2308,
+    0x230B, 0x230A, 0x232A, 0x2329, 0x2769, 0x2768, 0x276B, 0x276A, 0x276D, 0x276C, 0x276F, 0x276E, 0x2771, 0x2770, 0x2773, 0x2772,
+    0x2775, 0x2774, 0x27C4, 0x27C3, 0x27C6, 0x27C5, 0x27C9, 0x27C8, 0x27D6, 0x27D5, 0x27DE, 0x27DD, 0x27E3, 0x27E2, 0x27E5, 0x27E4,
+    0x27E7, 0x27E6, 0x27E9, 0x27E8, 0x27EB, 0x27EA, 0x27ED, 0x27EC, 0x27EF, 0x27EE, 0x2984, 0x2983, 0x2986, 0x2985, 0x2988, 0x2987,
+    0x298A, 0x2989, 0x298C, 0x298B, 0x2990, 0x298F, 0x298E, 0x298D, 0x2992, 0x2991, 0x2994, 0x2993, 0x2996, 0x2995, 0x2998, 0x2997,
+    0x2298, 0x29C1, 0x29C0, 0x29C5, 0x29C4, 0x29D0, 0x29CF, 0x29D2, 0x29D1, 0x29D5, 0x29D4, 0x29D9, 0x29D8, 0x29DB, 0x29DA, 0x2215,
+    0x29F9, 0x29F8, 0x29FD, 0x29FC, 0x2A2C, 0x2A2B, 0x2A2E, 0x2A2D, 0x2A35, 0x2A34, 0x2A3D, 0x2A3C, 0x2A65, 0x2A64, 0x2A7A, 0x2A79,
+    0x2A7E, 0x2A7D, 0x2A80, 0x2A7F, 0x2A82, 0x2A81, 0x2A84, 0x2A83, 0x2A8C, 0x2A8B, 0x2A92, 0x2A91, 0x2A94, 0x2A93, 0x2A96, 0x2A95,
+    0x2A98, 0x2A97, 0x2A9A, 0x2A99, 0x2A9C, 0x2A9B, 0x2AA2, 0x2AA1, 0x2AA7, 0x2AA6, 0x2AA9, 0x2AA8, 0x2AAB, 0x2AAA, 0x2AAD, 0x2AAC,
+    0x2AB0, 0x2AAF, 0x2AB4, 0x2AB3, 0x2ABC, 0x2ABB, 0x2ABE, 0x2ABD, 0x2AC0, 0x2ABF, 0x2AC2, 0x2AC1, 0x2AC4, 0x2AC3, 0x2AC6, 0x2AC5,
+    0x2ACE, 0x2ACD, 0x2AD0, 0x2ACF, 0x2AD2, 0x2AD1, 0x2AD4, 0x2AD3, 0x2AD6, 0x2AD5, 0x22A6, 0x22A9, 0x22A8, 0x22AB, 0x2AED, 0x2AEC,
+    0x2AF8, 0x2AF7, 0x2AFA, 0x2AF9, 0x2E03, 0x2E02, 0x2E05, 0x2E04, 0x2E0A, 0x2E09, 0x2E0D, 0x2E0C, 0x2E1D, 0x2E1C, 0x2E21, 0x2E20,
+    0x2E23, 0x2E22, 0x2E25, 0x2E24, 0x2E27, 0x2E26, 0x2E29, 0x2E28, 0x3009, 0x3008, 0x300B, 0x300A, 0x300D, 0x300C, 0x300F, 0x300E,
+    0x3011, 0x3010, 0x3015, 0x3014, 0x3017, 0x3016, 0x3019, 0x3018, 0x301B, 0x301A, 0xFE5A, 0xFE59, 0xFE5C, 0xFE5B, 0xFE5E, 0xFE5D,
+    0xFE65, 0xFE64, 0xFF09, 0xFF08, 0xFF1E, 0xFF1C, 0xFF3D, 0xFF3B, 0xFF5D, 0xFF5B, 0xFF60, 0xFF5F, 0xFF63, 0xFF62, 0xFFFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+};
diff --git a/core/src/fxcrt/fx_unicode.cpp b/core/src/fxcrt/fx_unicode.cpp
new file mode 100644
index 0000000..aac6142
--- /dev/null
+++ b/core/src/fxcrt/fx_unicode.cpp
@@ -0,0 +1,65 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536];
+extern const FX_WCHAR gs_FX_TextLayout_VerticalMirror[64];
+extern const FX_WCHAR gs_FX_TextLayout_BidiMirror[512];
+FX_DWORD FX_GetUnicodeProperties(FX_WCHAR wch)
+{
+    return gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
+}
+FX_BOOL FX_IsCtrlCode(FX_WCHAR ch)
+{
+    FX_DWORD dwRet = (gs_FX_TextLayout_CodeProperties[(FX_WORD)ch] & FX_CHARTYPEBITSMASK);
+    return dwRet == FX_CHARTYPE_Tab || dwRet == FX_CHARTYPE_Control;
+}
+FX_BOOL FX_IsRotationCode(FX_WCHAR ch)
+{
+    return (gs_FX_TextLayout_CodeProperties[(FX_WORD)ch] & 0x8000) != 0;
+}
+FX_BOOL FX_IsCombinationChar(FX_WCHAR wch)
+{
+    FX_DWORD dwProps = (gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & FX_CHARTYPEBITSMASK);
+    return dwProps == FX_CHARTYPE_Combination;
+}
+FX_BOOL	FX_IsBidiChar(FX_WCHAR wch)
+{
+    FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
+    FX_INT32 iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
+    return (FX_BIDICLASS_R == iBidiCls || FX_BIDICLASS_AL == iBidiCls);
+}
+FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_BOOL bRTL, FX_BOOL bVertical)
+{
+    FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
+    FX_DWORD dwTemp = (dwProps & 0xFF800000);
+    if (bRTL && dwTemp < 0xFF800000) {
+        wch = gs_FX_TextLayout_BidiMirror[dwTemp >> 23];
+        dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
+    }
+    if (bVertical) {
+        dwTemp = (dwProps & 0x007E0000);
+        if (dwTemp < 0x007E0000) {
+            wch = gs_FX_TextLayout_VerticalMirror[dwTemp >> 17];
+        }
+    }
+    return wch;
+}
+FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_DWORD dwProps, FX_BOOL bRTL, FX_BOOL bVertical)
+{
+    FX_DWORD dwTemp = (dwProps & 0xFF800000);
+    if (bRTL && dwTemp < 0xFF800000) {
+        wch = gs_FX_TextLayout_BidiMirror[dwTemp >> 23];
+        dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
+    }
+    if (bVertical) {
+        dwTemp = (dwProps & 0x007E0000);
+        if (dwTemp < 0x007E0000) {
+            wch = gs_FX_TextLayout_VerticalMirror[dwTemp >> 17];
+        }
+    }
+    return wch;
+}
diff --git a/core/src/fxcrt/fx_xml_composer.cpp b/core/src/fxcrt/fx_xml_composer.cpp
new file mode 100644
index 0000000..d68dd1f
--- /dev/null
+++ b/core/src/fxcrt/fx_xml_composer.cpp
@@ -0,0 +1,42 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_xml.h"

+#include "xml_int.h"

+void FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName)

+{

+    if (bsFullName.IsEmpty()) {

+        return;

+    }

+    FX_INT32 iStart = 0;

+    for (; iStart < bsFullName.GetLength(); iStart ++) {

+        if (bsFullName.GetAt(iStart) == ':') {

+            break;

+        }

+    }

+    if (iStart >= bsFullName.GetLength()) {

+        bsName = bsFullName;

+    } else {

+        bsSpace = CFX_ByteStringC(bsFullName.GetCStr(), iStart);

+        iStart ++;

+        bsName = CFX_ByteStringC(bsFullName.GetCStr() + iStart, bsFullName.GetLength() - iStart);

+    }

+}

+void CXML_Element::SetTag(FX_BSTR qSpace, FX_BSTR tagname)

+{

+    IFX_Allocator* pAllocator = m_Children.m_pAllocator;

+    m_QSpaceName.Set(qSpace, pAllocator);

+    m_TagName.Set(tagname, pAllocator);

+}

+void CXML_Element::SetTag(FX_BSTR qTagName)

+{

+    ASSERT(!qTagName.IsEmpty());

+    IFX_Allocator* pAllocator = m_Children.m_pAllocator;

+    CFX_ByteStringC bsSpace, bsName;

+    FX_XML_SplitQualifiedName(qTagName, bsSpace, bsName);

+    m_QSpaceName.Set(bsSpace, pAllocator);

+    m_TagName.Set(bsName, pAllocator);

+}

diff --git a/core/src/fxcrt/fx_xml_parser.cpp b/core/src/fxcrt/fx_xml_parser.cpp
new file mode 100644
index 0000000..85e9544
--- /dev/null
+++ b/core/src/fxcrt/fx_xml_parser.cpp
@@ -0,0 +1,1017 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_xml.h"

+#include "xml_int.h"

+CXML_Parser::~CXML_Parser()

+{

+    if (m_bOwnedStream) {

+        m_pDataAcc->Release();

+    }

+}

+FX_BOOL CXML_Parser::Init(FX_LPBYTE pBuffer, size_t size)

+{

+    if (m_pAllocator) {

+        m_pDataAcc = FX_NewAtAllocator(m_pAllocator)CXML_DataBufAcc(pBuffer, size, m_pAllocator);

+    } else {

+        m_pDataAcc = FX_NEW CXML_DataBufAcc(pBuffer, size, NULL);

+    }

+    if (!m_pDataAcc) {

+        return FALSE;

+    }

+    return Init(TRUE);

+}

+FX_BOOL CXML_Parser::Init(IFX_FileRead *pFileRead)

+{

+    if (m_pAllocator) {

+        m_pDataAcc = FX_NewAtAllocator(m_pAllocator)CXML_DataStmAcc(pFileRead, m_pAllocator);

+    } else {

+        m_pDataAcc = FX_NEW CXML_DataStmAcc(pFileRead, NULL);

+    }

+    if (!m_pDataAcc) {

+        return FALSE;

+    }

+    return Init(TRUE);

+}

+FX_BOOL CXML_Parser::Init(IFX_BufferRead *pBuffer)

+{

+    if (!pBuffer) {

+        return FALSE;

+    }

+    m_pDataAcc = pBuffer;

+    return Init(FALSE);

+}

+FX_BOOL CXML_Parser::Init(FX_BOOL bOwndedStream)

+{

+    m_bOwnedStream = bOwndedStream;

+    m_nOffset = 0;

+    return ReadNextBlock();

+}

+FX_BOOL CXML_Parser::ReadNextBlock()

+{

+    if (!m_pDataAcc->ReadNextBlock()) {

+        return FALSE;

+    }

+    m_pBuffer = m_pDataAcc->GetBlockBuffer();

+    m_dwBufferSize = m_pDataAcc->GetBlockSize();

+    m_nBufferOffset = m_pDataAcc->GetBlockOffset();

+    m_dwIndex = 0;

+    return m_dwBufferSize > 0;

+}

+FX_BOOL CXML_Parser::IsEOF()

+{

+    if (!m_pDataAcc->IsEOF()) {

+        return FALSE;

+    }

+    return m_dwIndex >= m_dwBufferSize;

+}

+#define FXCRTM_XML_CHARTYPE_Normal			0x00

+#define FXCRTM_XML_CHARTYPE_SpaceChar		0x01

+#define FXCRTM_XML_CHARTYPE_Letter			0x02

+#define FXCRTM_XML_CHARTYPE_Digital			0x04

+#define FXCRTM_XML_CHARTYPE_NameIntro		0x08

+#define FXCRTM_XML_CHARTYPE_NameChar		0x10

+#define FXCRTM_XML_CHARTYPE_HexDigital		0x20

+#define FXCRTM_XML_CHARTYPE_HexLowerLetter	0x40

+#define FXCRTM_XML_CHARTYPE_HexUpperLetter	0x60

+#define FXCRTM_XML_CHARTYPE_HexChar			0x60

+FX_BYTE g_FXCRT_XML_ByteTypes[256] = {

+    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,

+    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,

+    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,

+    0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,

+    0x00, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,

+    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x18,

+    0x00, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,

+    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00,

+    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,

+    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,

+    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,

+    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,

+    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,

+    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,

+    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,

+    0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x01, 0x01,

+};

+FX_BOOL g_FXCRT_XML_IsWhiteSpace(FX_BYTE ch)

+{

+    return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_SpaceChar) != 0;

+}

+FX_BOOL g_FXCRT_XML_IsLetter(FX_BYTE ch)

+{

+    return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Letter) != 0;

+}

+FX_BOOL g_FXCRT_XML_IsDigital(FX_BYTE ch)

+{

+    return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Digital) != 0;

+}

+FX_BOOL g_FXCRT_XML_IsNameIntro(FX_BYTE ch)

+{

+    return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameIntro) != 0;

+}

+FX_BOOL g_FXCRT_XML_IsNameChar(FX_BYTE ch)

+{

+    return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameChar) != 0;

+}

+FX_BOOL g_FXCRT_XML_IsHexChar(FX_BYTE ch)

+{

+    return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar) != 0;

+}

+void CXML_Parser::SkipWhiteSpaces()

+{

+    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+    if (IsEOF()) {

+        return;

+    }

+    do {

+        while (m_dwIndex < m_dwBufferSize && g_FXCRT_XML_IsWhiteSpace(m_pBuffer[m_dwIndex])) {

+            m_dwIndex ++;

+        }

+        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+        if (m_dwIndex < m_dwBufferSize || IsEOF()) {

+            break;

+        }

+    } while (ReadNextBlock());

+}

+void CXML_Parser::GetName(CFX_ByteStringL &space, CFX_ByteStringL &name)

+{

+    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+    if (IsEOF()) {

+        return;

+    }

+    CFX_ByteTextBuf buf(m_pAllocator);

+    FX_BYTE ch;

+    do {

+        while (m_dwIndex < m_dwBufferSize) {

+            ch = m_pBuffer[m_dwIndex];

+            if (ch == ':') {

+                buf.GetByteStringL(space);

+                buf.Clear();

+            } else if (g_FXCRT_XML_IsNameChar(ch)) {

+                buf.AppendChar(ch);

+            } else {

+                break;

+            }

+            m_dwIndex ++;

+        }

+        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+        if (m_dwIndex < m_dwBufferSize || IsEOF()) {

+            break;

+        }

+    } while (ReadNextBlock());

+    buf.GetByteStringL(name);

+}

+void CXML_Parser::SkipLiterals(FX_BSTR str)

+{

+    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+    if (IsEOF()) {

+        return;

+    }

+    FX_INT32 i = 0, iLen = str.GetLength();

+    do {

+        while (m_dwIndex < m_dwBufferSize) {

+            if (str.GetAt(i) != m_pBuffer[m_dwIndex ++]) {

+                i = 0;

+            } else {

+                i ++;

+                if (i == iLen) {

+                    break;

+                }

+            }

+        }

+        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+        if (i == iLen) {

+            return;

+        }

+        if (m_dwIndex < m_dwBufferSize || IsEOF()) {

+            break;

+        }

+    } while (ReadNextBlock());

+    while (!m_pDataAcc->IsEOF()) {

+        ReadNextBlock();

+        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwBufferSize;

+    }

+    m_dwIndex = m_dwBufferSize;

+}

+FX_DWORD CXML_Parser::GetCharRef()

+{

+    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+    if (IsEOF()) {

+        return 0;

+    }

+    FX_BYTE ch;

+    FX_INT32 iState = 0;

+    CFX_ByteTextBuf buf(m_pAllocator);

+    FX_DWORD code = 0;

+    do {

+        while (m_dwIndex < m_dwBufferSize) {

+            ch = m_pBuffer[m_dwIndex];

+            switch (iState) {

+                case 0:

+                    if (ch == '#') {

+                        m_dwIndex ++;

+                        iState = 2;

+                        break;

+                    }

+                    iState = 1;

+                case 1:

+                    m_dwIndex ++;

+                    if (ch == ';') {

+                        CFX_ByteStringC ref = buf.GetByteString();

+                        if (ref == FX_BSTRC("gt")) {

+                            code = '>';

+                        } else if (ref == FX_BSTRC("lt")) {

+                            code = '<';

+                        } else if (ref == FX_BSTRC("amp")) {

+                            code = '&';

+                        } else if (ref == FX_BSTRC("apos")) {

+                            code = '\'';

+                        } else if (ref == FX_BSTRC("quot")) {

+                            code = '"';

+                        }

+                        iState = 10;

+                        break;

+                    }

+                    buf.AppendByte(ch);

+                    break;

+                case 2:

+                    if (ch == 'x') {

+                        m_dwIndex ++;

+                        iState = 4;

+                        break;

+                    }

+                    iState = 3;

+                case 3:

+                    m_dwIndex ++;

+                    if (ch == ';') {

+                        iState = 10;

+                        break;

+                    }

+                    if (g_FXCRT_XML_IsDigital(ch)) {

+                        code = code * 10 + ch - '0';

+                    }

+                    break;

+                case 4:

+                    m_dwIndex ++;

+                    if (ch == ';') {

+                        iState = 10;

+                        break;

+                    }

+                    FX_BYTE nHex = g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar;

+                    if (nHex) {

+                        if (nHex == FXCRTM_XML_CHARTYPE_HexDigital) {

+                            code = (code << 4) + ch - '0';

+                        } else if (nHex == FXCRTM_XML_CHARTYPE_HexLowerLetter) {

+                            code = (code << 4) + ch - 87;

+                        } else {

+                            code = (code << 4) + ch - 55;

+                        }

+                    }

+                    break;

+            }

+            if (iState == 10) {

+                break;

+            }

+        }

+        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+        if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {

+            break;

+        }

+    } while (ReadNextBlock());

+    return code;

+}

+void CXML_Parser::GetAttrValue(CFX_WideStringL &value)

+{

+    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+    if (IsEOF()) {

+        return;

+    }

+    CFX_UTF8Decoder decoder(m_pAllocator);

+    FX_BYTE mark = 0, ch;

+    do {

+        while (m_dwIndex < m_dwBufferSize) {

+            ch = m_pBuffer[m_dwIndex];

+            if (mark == 0) {

+                if (ch != '\'' && ch != '"') {

+                    return;

+                }

+                mark = ch;

+                m_dwIndex ++;

+                ch = 0;

+                continue;

+            }

+            m_dwIndex ++;

+            if (ch == mark) {

+                break;

+            }

+            if (ch == '&') {

+                decoder.AppendChar(GetCharRef());

+                if (IsEOF()) {

+                    decoder.GetResult(value);

+                    return;

+                }

+            } else {

+                decoder.Input(ch);

+            }

+        }

+        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+        if (ch == mark || m_dwIndex < m_dwBufferSize || IsEOF()) {

+            break;

+        }

+    } while (ReadNextBlock());

+    decoder.GetResult(value);

+}

+void CXML_Parser::GetTagName(CFX_ByteStringL &space, CFX_ByteStringL &name, FX_BOOL &bEndTag, FX_BOOL bStartTag)

+{

+    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+    if (IsEOF()) {

+        return;

+    }

+    bEndTag = FALSE;

+    FX_BYTE ch;

+    FX_INT32 iState = bStartTag ? 1 : 0;

+    do {

+        while (m_dwIndex < m_dwBufferSize) {

+            ch = m_pBuffer[m_dwIndex];

+            switch (iState) {

+                case 0:

+                    m_dwIndex ++;

+                    if (ch != '<') {

+                        break;

+                    }

+                    iState = 1;

+                    break;

+                case 1:

+                    if (ch == '?') {

+                        m_dwIndex ++;

+                        SkipLiterals(FX_BSTRC("?>"));

+                        iState = 0;

+                        break;

+                    } else if (ch == '!') {

+                        m_dwIndex ++;

+                        SkipLiterals(FX_BSTRC("-->"));

+                        iState = 0;

+                        break;

+                    }

+                    if (ch == '/') {

+                        m_dwIndex ++;

+                        GetName(space, name);

+                        bEndTag = TRUE;

+                    } else {

+                        GetName(space, name);

+                        bEndTag = FALSE;

+                    }

+                    return;

+            }

+        }

+        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+        if (m_dwIndex < m_dwBufferSize || IsEOF()) {

+            break;

+        }

+    } while (ReadNextBlock());

+}

+CXML_Element* CXML_Parser::ParseElement(CXML_Element* pParent, FX_BOOL bStartTag)

+{

+    m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+    if (IsEOF()) {

+        return NULL;

+    }

+    CFX_ByteStringL tag_name, tag_space;

+    FX_BOOL bEndTag;

+    GetTagName(tag_space, tag_name, bEndTag, bStartTag);

+    if (tag_name.IsEmpty() || bEndTag) {

+        tag_space.Empty(m_pAllocator);

+        return NULL;

+    }

+    CXML_Element* pElement;

+    if (m_pAllocator) {

+        pElement = FX_NewAtAllocator(m_pAllocator)CXML_Element(m_pAllocator);

+    } else {

+        pElement = FX_NEW CXML_Element;

+    }

+    if (pElement) {

+        pElement->m_pParent = pParent;

+        pElement->SetTag(tag_space, tag_name);

+    }

+    tag_space.Empty(m_pAllocator);

+    tag_name.Empty(m_pAllocator);

+    if (!pElement) {

+        return NULL;

+    }

+    do {

+        CFX_ByteStringL attr_space, attr_name;

+        while (m_dwIndex < m_dwBufferSize) {

+            SkipWhiteSpaces();

+            if (IsEOF()) {

+                break;

+            }

+            if (!g_FXCRT_XML_IsNameIntro(m_pBuffer[m_dwIndex])) {

+                break;

+            }

+            attr_space.Empty(m_pAllocator);

+            attr_name.Empty(m_pAllocator);

+            GetName(attr_space, attr_name);

+            SkipWhiteSpaces();

+            if (IsEOF()) {

+                break;

+            }

+            if (m_pBuffer[m_dwIndex] != '=') {

+                break;

+            }

+            m_dwIndex ++;

+            SkipWhiteSpaces();

+            if (IsEOF()) {

+                break;

+            }

+            CFX_WideStringL attr_value;

+            GetAttrValue(attr_value);

+            pElement->m_AttrMap.SetAt(attr_space, attr_name, attr_value, m_pAllocator);

+            attr_value.Empty(m_pAllocator);

+        }

+        attr_space.Empty(m_pAllocator);

+        attr_name.Empty(m_pAllocator);

+        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+        if (m_dwIndex < m_dwBufferSize || IsEOF()) {

+            break;

+        }

+    } while (ReadNextBlock());

+    SkipWhiteSpaces();

+    if (IsEOF()) {

+        return pElement;

+    }

+    FX_BYTE ch = m_pBuffer[m_dwIndex ++];

+    if (ch == '/') {

+        m_dwIndex ++;

+        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+        return pElement;

+    }

+    if (ch != '>') {

+        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+        if (m_pAllocator) {

+            FX_DeleteAtAllocator(pElement, m_pAllocator, CXML_Element);

+        } else {

+            delete pElement;

+        }

+        return NULL;

+    }

+    SkipWhiteSpaces();

+    if (IsEOF()) {

+        return pElement;

+    }

+    CFX_UTF8Decoder decoder(m_pAllocator);

+    CFX_WideTextBuf content(m_pAllocator);

+    FX_BOOL bCDATA = FALSE;

+    FX_INT32 iState = 0;

+    do {

+        while (m_dwIndex < m_dwBufferSize) {

+            ch = m_pBuffer[m_dwIndex ++];

+            switch (iState) {

+                case 0:

+                    if (ch == '<') {

+                        iState = 1;

+                    } else if (ch == '&') {

+                        decoder.ClearStatus();

+                        decoder.AppendChar(GetCharRef());

+                    } else {

+                        decoder.Input(ch);

+                    }

+                    break;

+                case 1:

+                    if (ch == '!') {

+                        iState = 2;

+                    } else if (ch == '?') {

+                        SkipLiterals(FX_BSTRC("?>"));

+                        SkipWhiteSpaces();

+                        iState = 0;

+                    } else if (ch == '/') {

+                        CFX_ByteStringL space, name;

+                        GetName(space, name);

+                        space.Empty(m_pAllocator);

+                        name.Empty(m_pAllocator);

+                        SkipWhiteSpaces();

+                        m_dwIndex ++;

+                        iState = 10;

+                    } else {

+                        content << decoder.GetResult();

+                        CFX_WideStringL dataStr;

+                        content.GetWideStringL(dataStr);

+                        if (!bCDATA && !m_bSaveSpaceChars) {

+                            dataStr.TrimRight((FX_LPCWSTR)L" \t\r\n");

+                        }

+                        InsertContentSegment(bCDATA, dataStr, pElement);

+                        dataStr.Empty(m_pAllocator);

+                        content.Clear();

+                        decoder.Clear();

+                        bCDATA = FALSE;

+                        iState = 0;

+                        m_dwIndex --;

+                        CXML_Element* pSubElement = ParseElement(pElement, TRUE);

+                        if (pSubElement == NULL) {

+                            break;

+                        }

+                        pSubElement->m_pParent = pElement;

+                        pElement->m_Children.Add((FX_LPVOID)CXML_Element::Element);

+                        pElement->m_Children.Add(pSubElement);

+                        SkipWhiteSpaces();

+                    }

+                    break;

+                case 2:

+                    if (ch == '[') {

+                        SkipLiterals(FX_BSTRC("]]>"));

+                    } else if (ch == '-') {

+                        m_dwIndex ++;

+                        SkipLiterals(FX_BSTRC("-->"));

+                    } else {

+                        SkipLiterals(FX_BSTRC(">"));

+                    }

+                    decoder.Clear();

+                    SkipWhiteSpaces();

+                    iState = 0;

+                    break;

+            }

+            if (iState == 10) {

+                break;

+            }

+        }

+        m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;

+        if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {

+            break;

+        }

+    } while (ReadNextBlock());

+    content << decoder.GetResult();

+    CFX_WideStringL dataStr;

+    content.GetWideStringL(dataStr);

+    if (!m_bSaveSpaceChars) {

+        dataStr.TrimRight((FX_LPCWSTR)L" \t\r\n");

+    }

+    InsertContentSegment(bCDATA, dataStr, pElement);

+    dataStr.Empty(m_pAllocator);

+    content.Clear();

+    decoder.Clear();

+    bCDATA = FALSE;

+    return pElement;

+}

+void CXML_Parser::InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Element* pElement)

+{

+    if (content.IsEmpty()) {

+        return;

+    }

+    CXML_Content* pContent;

+    if (m_pAllocator) {

+        pContent = FX_NewAtAllocator(m_pAllocator)CXML_Content;

+    } else {

+        pContent = FX_NEW CXML_Content;

+    }

+    if (!pContent) {

+        return;

+    }

+    pContent->Set(bCDATA, content, m_pAllocator);

+    pElement->m_Children.Add((FX_LPVOID)CXML_Element::Content);

+    pElement->m_Children.Add(pContent);

+}

+static CXML_Element* XML_ContinueParse(CXML_Parser &parser, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize)

+{

+    parser.m_bSaveSpaceChars = bSaveSpaceChars;

+    CXML_Element* pElement = parser.ParseElement(NULL, FALSE);

+    if (pParsedSize) {

+        *pParsedSize = parser.m_nOffset;

+    }

+    return pElement;

+}

+CXML_Element* CXML_Element::Parse(const void* pBuffer, size_t size, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator)

+{

+    CXML_Parser parser(pAllocator);

+    if (!parser.Init((FX_LPBYTE)pBuffer, size)) {

+        return NULL;

+    }

+    return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);

+}

+CXML_Element* CXML_Element::Parse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator)

+{

+    CXML_Parser parser(pAllocator);

+    if (!parser.Init(pFile)) {

+        return NULL;

+    }

+    return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);

+}

+CXML_Element* CXML_Element::Parse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator)

+{

+    CXML_Parser parser(pAllocator);

+    if (!parser.Init(pBuffer)) {

+        return NULL;

+    }

+    return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);

+}

+CXML_Element::CXML_Element(IFX_Allocator* pAllocator)

+    : m_pParent(NULL)

+    , m_QSpaceName()

+    , m_TagName()

+    , m_AttrMap()

+    , m_Children(pAllocator)

+{

+}

+CXML_Element::CXML_Element(FX_BSTR qSpace, FX_BSTR tagName, IFX_Allocator* pAllocator)

+    : m_pParent(NULL)

+    , m_QSpaceName()

+    , m_TagName()

+    , m_AttrMap()

+    , m_Children(pAllocator)

+{

+    m_QSpaceName.Set(qSpace, pAllocator);

+    m_TagName.Set(tagName, pAllocator);

+}

+CXML_Element::CXML_Element(FX_BSTR qTagName, IFX_Allocator* pAllocator)

+    : m_pParent(NULL)

+    , m_QSpaceName()

+    , m_TagName()

+    , m_AttrMap()

+    , m_Children(pAllocator)

+{

+    SetTag(qTagName);

+}

+CXML_Element::~CXML_Element()

+{

+    Empty();

+}

+void CXML_Element::Empty()

+{

+    IFX_Allocator* pAllocator = m_Children.m_pAllocator;

+    m_QSpaceName.Empty(pAllocator);

+    m_TagName.Empty(pAllocator);

+    m_AttrMap.RemoveAll(pAllocator);

+    RemoveChildren();

+}

+void CXML_Element::RemoveChildren()

+{

+    IFX_Allocator* pAllocator = m_Children.m_pAllocator;

+    for (int i = 0; i < m_Children.GetSize(); i += 2) {

+        ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);

+        if (type == Content) {

+            CXML_Content* content = (CXML_Content*)m_Children.GetAt(i + 1);

+            if (pAllocator) {

+                FX_DeleteAtAllocator(content, pAllocator, CXML_Content);

+            } else {

+                delete content;

+            }

+        } else if (type == Element) {

+            CXML_Element* child = (CXML_Element*)m_Children.GetAt(i + 1);

+            child->RemoveChildren();

+            if (pAllocator) {

+                FX_DeleteAtAllocator(child, pAllocator, CXML_Element);

+            } else {

+                delete child;

+            }

+        }

+    }

+    m_Children.RemoveAll();

+}

+CFX_ByteString CXML_Element::GetTagName(FX_BOOL bQualified) const

+{

+    if (!bQualified || m_QSpaceName.IsEmpty()) {

+        return m_TagName;

+    }

+    CFX_ByteString bsTag = m_QSpaceName;

+    bsTag += ":";

+    bsTag += m_TagName;

+    return bsTag;

+}

+void CXML_Element::GetTagName(CFX_ByteStringL &tagName, FX_BOOL bQualified) const

+{

+    IFX_Allocator* pAllocator = m_Children.m_pAllocator;

+    if (!bQualified || m_QSpaceName.IsEmpty()) {

+        tagName.Set(m_TagName, pAllocator);

+        return;

+    }

+    FX_LPSTR str = tagName.AllocBuffer(m_QSpaceName.GetLength() + m_TagName.GetLength() + 2, pAllocator);

+    if (!str) {

+        return;

+    }

+    FXSYS_memcpy32(str, m_QSpaceName.GetCStr(), m_QSpaceName.GetLength());

+    str += m_QSpaceName.GetLength();

+    *str = ':';

+    str ++;

+    FXSYS_memcpy32(str, m_TagName.GetCStr(), m_TagName.GetLength());

+    str += m_TagName.GetLength();

+    *str = '\0';

+}

+CFX_ByteString CXML_Element::GetNamespace(FX_BOOL bQualified) const

+{

+    if (bQualified) {

+        return m_QSpaceName;

+    }

+    return GetNamespaceURI(m_QSpaceName);

+}

+void CXML_Element::GetNamespace(CFX_ByteStringL &nameSpace, FX_BOOL bQualified) const

+{

+    IFX_Allocator* pAllocator = m_Children.m_pAllocator;

+    if (bQualified) {

+        nameSpace.Set(m_QSpaceName, pAllocator);

+        return;

+    }

+    GetNamespaceURI(m_QSpaceName, nameSpace);

+}

+CFX_ByteString CXML_Element::GetNamespaceURI(FX_BSTR qName) const

+{

+    const CFX_WideStringL* pwsSpace;

+    const CXML_Element *pElement = this;

+    do {

+        if (qName.IsEmpty()) {

+            pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"));

+        } else {

+            pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName);

+        }

+        if (pwsSpace) {

+            break;

+        }

+        pElement = pElement->GetParent();

+    } while(pElement);

+    return pwsSpace ? FX_UTF8Encode(*pwsSpace) : CFX_ByteString();

+}

+void CXML_Element::GetNamespaceURI(FX_BSTR qName, CFX_ByteStringL &uri) const

+{

+    IFX_Allocator* pAllocator = m_Children.m_pAllocator;

+    const CFX_WideStringL* pwsSpace;

+    const CXML_Element *pElement = this;

+    do {

+        if (qName.IsEmpty()) {

+            pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"));

+        } else {

+            pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName);

+        }

+        if (pwsSpace) {

+            break;

+        }

+        pElement = pElement->GetParent();

+    } while(pElement);

+    if (pwsSpace) {

+        FX_UTF8Encode(pwsSpace->GetPtr(), pwsSpace->GetLength(), uri, pAllocator);

+    }

+}

+void CXML_Element::GetAttrByIndex(int index, CFX_ByteString& space, CFX_ByteString& name, CFX_WideString& value) const

+{

+    if (index < 0 || index >= m_AttrMap.GetSize()) {

+        return;

+    }

+    CXML_AttrItem& item = m_AttrMap.GetAt(index);

+    space = item.m_QSpaceName;

+    name = item.m_AttrName;

+    value = item.m_Value;

+}

+void CXML_Element::GetAttrByIndex(int index, CFX_ByteStringL &space, CFX_ByteStringL &name, CFX_WideStringL &value) const

+{

+    if (index < 0 || index >= m_AttrMap.GetSize()) {

+        return;

+    }

+    IFX_Allocator* pAllocator = m_Children.m_pAllocator;

+    CXML_AttrItem& item = m_AttrMap.GetAt(index);

+    space.Set(item.m_QSpaceName, pAllocator);

+    name.Set(item.m_AttrName, pAllocator);

+    value.Set(item.m_Value, pAllocator);

+}

+FX_BOOL CXML_Element::HasAttr(FX_BSTR name) const

+{

+    CFX_ByteStringC bsSpace, bsName;

+    FX_XML_SplitQualifiedName(name, bsSpace, bsName);

+    return m_AttrMap.Lookup(bsSpace, bsName) != NULL;

+}

+FX_BOOL CXML_Element::GetAttrValue(FX_BSTR name, CFX_WideString& attribute) const

+{

+    CFX_ByteStringC bsSpace, bsName;

+    FX_XML_SplitQualifiedName(name, bsSpace, bsName);

+    const CFX_WideStringL* pValue = m_AttrMap.Lookup(bsSpace, bsName);

+    if (pValue) {

+        attribute = CFX_WideString(pValue->GetPtr(), pValue->GetLength());

+        return TRUE;

+    }

+    return FALSE;

+}

+const CFX_WideStringL* CXML_Element::GetAttrValuePtr(FX_BSTR name) const

+{

+    CFX_ByteStringC bsSpace, bsName;

+    FX_XML_SplitQualifiedName(name, bsSpace, bsName);

+    return m_AttrMap.Lookup(bsSpace, bsName);

+}

+FX_BOOL CXML_Element::GetAttrValue(FX_BSTR space, FX_BSTR name, CFX_WideString& attribute) const

+{

+    const CFX_WideStringL* pValue = m_AttrMap.Lookup(space, name);

+    if (pValue) {

+        attribute = CFX_WideString(pValue->GetPtr(), pValue->GetLength());

+        return TRUE;

+    }

+    return FALSE;

+}

+const CFX_WideStringL* CXML_Element::GetAttrValuePtr(FX_BSTR space, FX_BSTR name) const

+{

+    return m_AttrMap.Lookup(space, name);

+}

+FX_BOOL CXML_Element::GetAttrInteger(FX_BSTR name, int& attribute) const

+{

+    CFX_ByteStringC bsSpace, bsName;

+    FX_XML_SplitQualifiedName(name, bsSpace, bsName);

+    const CFX_WideStringL* pwsValue = m_AttrMap.Lookup(bsSpace, bsName);

+    if (pwsValue) {

+        attribute = pwsValue->GetInteger();

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL	CXML_Element::GetAttrInteger(FX_BSTR space, FX_BSTR name, int& attribute) const

+{

+    const CFX_WideStringL* pwsValue = m_AttrMap.Lookup(space, name);

+    if (pwsValue) {

+        attribute = pwsValue->GetInteger();

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL CXML_Element::GetAttrFloat(FX_BSTR name, FX_FLOAT& attribute) const

+{

+    CFX_ByteStringC bsSpace, bsName;

+    FX_XML_SplitQualifiedName(name, bsSpace, bsName);

+    return GetAttrFloat(bsSpace, bsName, attribute);

+}

+FX_BOOL CXML_Element::GetAttrFloat(FX_BSTR space, FX_BSTR name, FX_FLOAT& attribute) const

+{

+    CFX_WideString value;

+    const CFX_WideStringL* pValue = m_AttrMap.Lookup(space, name);

+    if (pValue) {

+        attribute = pValue->GetFloat();

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_DWORD CXML_Element::CountChildren() const

+{

+    return m_Children.GetSize() / 2;

+}

+CXML_Element::ChildType CXML_Element::GetChildType(FX_DWORD index) const

+{

+    index <<= 1;

+    if (index >= (FX_DWORD)m_Children.GetSize()) {

+        return Invalid;

+    }

+    return (ChildType)(FX_UINTPTR)m_Children.GetAt(index);

+}

+CFX_WideString CXML_Element::GetContent(FX_DWORD index) const

+{

+    index <<= 1;

+    if (index >= (FX_DWORD)m_Children.GetSize() ||

+            (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Content) {

+        return CFX_WideString();

+    }

+    CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1);

+    if (pContent) {

+        return pContent->m_Content;

+    }

+    return CFX_WideString();

+}

+const CFX_WideStringL* CXML_Element::GetContentPtr(FX_DWORD index) const

+{

+    index <<= 1;

+    if (index >= (FX_DWORD)m_Children.GetSize() ||

+            (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Content) {

+        return NULL;

+    }

+    CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1);

+    if (pContent) {

+        return &pContent->m_Content;

+    }

+    return NULL;

+}

+CXML_Element* CXML_Element::GetElement(FX_DWORD index) const

+{

+    index <<= 1;

+    if (index >= (FX_DWORD)m_Children.GetSize() ||

+            (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Element) {

+        return NULL;

+    }

+    return (CXML_Element*)m_Children.GetAt(index + 1);

+}

+FX_DWORD CXML_Element::CountElements(FX_BSTR space, FX_BSTR tag) const

+{

+    int count = 0;

+    for (int i = 0; i < m_Children.GetSize(); i += 2) {

+        ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);

+        if (type != Element) {

+            continue;

+        }

+        CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);

+        if ((space.IsEmpty() || pKid->m_QSpaceName == space) && pKid->m_TagName == tag) {

+            count ++;

+        }

+    }

+    return count;

+}

+CXML_Element* CXML_Element::GetElement(FX_BSTR space, FX_BSTR tag, int index) const

+{

+    if (index < 0) {

+        return NULL;

+    }

+    for (int i = 0; i < m_Children.GetSize(); i += 2) {

+        ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);

+        if (type != Element) {

+            continue;

+        }

+        CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);

+        if ((!space.IsEmpty() && pKid->m_QSpaceName != space) || pKid->m_TagName != tag) {

+            continue;

+        }

+        if (index -- == 0) {

+            return pKid;

+        }

+    }

+    return NULL;

+}

+FX_DWORD CXML_Element::FindElement(CXML_Element *pChild) const

+{

+    for (int i = 0; i < m_Children.GetSize(); i += 2) {

+        if ((ChildType)(FX_UINTPTR)m_Children.GetAt(i) == Element &&

+                (CXML_Element*)m_Children.GetAt(i + 1) == pChild) {

+            return (FX_DWORD)(i >> 1);

+        }

+    }

+    return (FX_DWORD) - 1;

+}

+const CFX_WideStringL* CXML_AttrMap::Lookup(FX_BSTR space, FX_BSTR name) const

+{

+    if (m_pMap == NULL) {

+        return NULL;

+    }

+    for (int i = 0; i < m_pMap->GetSize(); i ++) {

+        CXML_AttrItem& item = GetAt(i);

+        if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {

+            return &item.m_Value;

+        }

+    }

+    return NULL;

+}

+void CXML_AttrMap::SetAt(FX_BSTR space, FX_BSTR name, FX_WSTR value, IFX_Allocator* pAllocator)

+{

+    for (int i = 0; i < GetSize(); i ++) {

+        CXML_AttrItem& item = GetAt(i);

+        if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {

+            item.m_Value.Set(value, pAllocator);

+            return;

+        }

+    }

+    if (!m_pMap) {

+        if (pAllocator) {

+            m_pMap = FX_NewAtAllocator(pAllocator)CFX_ObjectArray<CXML_AttrItem>(pAllocator);

+        } else {

+            m_pMap = FX_NEW CFX_ObjectArray<CXML_AttrItem>;

+        }

+    }

+    if (!m_pMap) {

+        return;

+    }

+    CXML_AttrItem* pItem = (CXML_AttrItem*)m_pMap->AddSpace();

+    if (!pItem) {

+        return;

+    }

+    pItem->m_QSpaceName.Set(space, pAllocator);

+    pItem->m_AttrName.Set(name, pAllocator);

+    pItem->m_Value.Set(value, pAllocator);

+}

+void CXML_AttrMap::RemoveAt(FX_BSTR space, FX_BSTR name, IFX_Allocator* pAllocator)

+{

+    if (m_pMap == NULL) {

+        return;

+    }

+    for (int i = 0; i < m_pMap->GetSize(); i ++) {

+        CXML_AttrItem& item = GetAt(i);

+        if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {

+            item.Empty(pAllocator);

+            m_pMap->RemoveAt(i);

+            return;

+        }

+    }

+}

+int CXML_AttrMap::GetSize() const

+{

+    return m_pMap == NULL ? 0 : m_pMap->GetSize();

+}

+CXML_AttrItem& CXML_AttrMap::GetAt(int index) const

+{

+    ASSERT(m_pMap != NULL);

+    return (*m_pMap)[index];

+}

+void CXML_AttrMap::RemoveAll(IFX_Allocator* pAllocator)

+{

+    if (!m_pMap) {

+        return;

+    }

+    for (int i = 0; i < m_pMap->GetSize(); i ++) {

+        CXML_AttrItem& item = (*m_pMap)[i];

+        item.Empty(pAllocator);

+    }

+    m_pMap->RemoveAll();

+    if (pAllocator) {

+        FX_DeleteAtAllocator(m_pMap, pAllocator, CFX_ObjectArray<CXML_AttrItem>);

+    } else {

+        delete m_pMap;

+    }

+    m_pMap = NULL;

+}

diff --git a/core/src/fxcrt/fxcrt_platforms.cpp b/core/src/fxcrt/fxcrt_platforms.cpp
new file mode 100644
index 0000000..1479b7b
--- /dev/null
+++ b/core/src/fxcrt/fxcrt_platforms.cpp
@@ -0,0 +1,203 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_ext.h"

+#include "fxcrt_platforms.h"

+#if (_FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ && _FXM_PLATFORM_ != _FXM_PLATFORM_LINUX_ && _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ && _FXM_PLATFORM_ != _FXM_PLATFORM_ANDROID_)

+IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)

+{

+    if (pAllocator) {

+        return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_CRT;

+    } else {

+        return FX_NEW CFXCRT_FileAccess_CRT;

+    }

+}

+void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString &bsMode)

+{

+    if (dwModes & FX_FILEMODE_ReadOnly) {

+        bsMode = FX_BSTRC("rb");

+    } else if (dwModes & FX_FILEMODE_Truncate) {

+        bsMode = FX_BSTRC("w+b");

+    } else {

+        bsMode = FX_BSTRC("a+b");

+    }

+}

+void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString &wsMode)

+{

+    if (dwModes & FX_FILEMODE_ReadOnly) {

+        wsMode = FX_WSTRC(L"rb");

+    } else if (dwModes & FX_FILEMODE_Truncate) {

+        wsMode = FX_WSTRC(L"w+b");

+    } else {

+        wsMode = FX_WSTRC(L"a+b");

+    }

+}

+CFXCRT_FileAccess_CRT::CFXCRT_FileAccess_CRT()

+    : m_hFile(NULL)

+{

+}

+CFXCRT_FileAccess_CRT::~CFXCRT_FileAccess_CRT()

+{

+    Close();

+}

+FX_BOOL CFXCRT_FileAccess_CRT::Open(FX_BSTR fileName, FX_DWORD dwMode)

+{

+    if (m_hFile) {

+        return FALSE;

+    }

+    CFX_ByteString strMode;

+    FXCRT_GetFileModeString(dwMode, strMode);

+    m_hFile = FXSYS_fopen(fileName.GetCStr(), (FX_LPCSTR)strMode);

+    return m_hFile != NULL;

+}

+FX_BOOL CFXCRT_FileAccess_CRT::Open(FX_WSTR fileName, FX_DWORD dwMode)

+{

+    if (m_hFile) {

+        return FALSE;

+    }

+    CFX_WideString strMode;

+    FXCRT_GetFileModeString(dwMode, strMode);

+    m_hFile = FXSYS_wfopen(fileName.GetPtr(), (FX_LPCWSTR)strMode);

+    return m_hFile != NULL;

+}

+void CFXCRT_FileAccess_CRT::Close()

+{

+    if (!m_hFile) {

+        return;

+    }

+    FXSYS_fclose(m_hFile);

+    m_hFile = NULL;

+}

+void CFXCRT_FileAccess_CRT::Release(IFX_Allocator* pAllocator)

+{

+    if (pAllocator) {

+        FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_CRT);

+    } else {

+        delete this;

+    }

+}

+FX_FILESIZE CFXCRT_FileAccess_CRT::GetSize() const

+{

+    if (!m_hFile) {

+        return 0;

+    }

+    FX_FILESIZE pos = (FX_FILESIZE)FXSYS_ftell(m_hFile);

+    FXSYS_fseek(m_hFile, 0, FXSYS_SEEK_END);

+    FX_FILESIZE size = (FX_FILESIZE)FXSYS_ftell(m_hFile);

+    FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);

+    return size;

+}

+FX_FILESIZE CFXCRT_FileAccess_CRT::GetPosition() const

+{

+    if (!m_hFile) {

+        return (FX_FILESIZE) - 1;

+    }

+    return (FX_FILESIZE)FXSYS_ftell(m_hFile);

+}

+FX_FILESIZE CFXCRT_FileAccess_CRT::SetPosition(FX_FILESIZE pos)

+{

+    if (!m_hFile) {

+        return (FX_FILESIZE) - 1;

+    }

+    FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);

+    return (FX_FILESIZE)FXSYS_ftell(m_hFile);

+}

+size_t CFXCRT_FileAccess_CRT::Read(void* pBuffer, size_t szBuffer)

+{

+    if (!m_hFile) {

+        return 0;

+    }

+    return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);

+}

+size_t CFXCRT_FileAccess_CRT::Write(const void* pBuffer, size_t szBuffer)

+{

+    if (!m_hFile) {

+        return 0;

+    }

+    return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);

+}

+size_t CFXCRT_FileAccess_CRT::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)

+{

+    if (!m_hFile) {

+        return (FX_FILESIZE) - 1;

+    }

+    FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);

+    return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);

+}

+size_t CFXCRT_FileAccess_CRT::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)

+{

+    if (!m_hFile) {

+        return (FX_FILESIZE) - 1;

+    }

+    FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);

+    return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);

+}

+FX_BOOL CFXCRT_FileAccess_CRT::Flush()

+{

+    if (!m_hFile) {

+        return FALSE;

+    }

+    return !FXSYS_fflush(m_hFile);

+}

+FX_BOOL CFXCRT_FileAccess_CRT::Truncate(FX_FILESIZE szFile)

+{

+    return FALSE;

+}

+FX_BOOL FX_File_Exist(FX_BSTR fileName)

+{

+    return access(fileName.GetCStr(), F_OK) > -1;

+}

+FX_BOOL FX_File_Exist(FX_WSTR fileName)

+{

+    return FX_File_Exist(FX_UTF8Encode(fileName));

+}

+FX_BOOL FX_File_Delete(FX_BSTR fileName)

+{

+    return remove(fileName.GetCStr()) > -1;

+}

+FX_BOOL FX_File_Delete(FX_WSTR fileName)

+{

+    return FX_File_Delete(FX_UTF8Encode(fileName));

+}

+FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)

+{

+    CFXCRT_FileAccess_CRT src, dst;

+    if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {

+        return FALSE;

+    }

+    FX_FILESIZE size = src.GetSize();

+    if (!size) {

+        return FALSE;

+    }

+    if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {

+        return FALSE;

+    }

+    FX_FILESIZE num = 0;

+    FX_LPBYTE pBuffer = FX_Alloc(FX_BYTE, 32768);

+    if (!pBuffer) {

+        return FALSE;

+    }

+    while (num = src.Read(pBuffer, 32768)) {

+        if (dst.Write(pBuffer, num) != num) {

+            break;

+        }

+    }

+    FX_Free(pBuffer);

+    return TRUE;

+}

+FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)

+{

+    return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));

+}

+FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)

+{

+    return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());

+}

+FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)

+{

+    return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));

+}

+#endif

diff --git a/core/src/fxcrt/fxcrt_platforms.h b/core/src/fxcrt/fxcrt_platforms.h
new file mode 100644
index 0000000..633b888
--- /dev/null
+++ b/core/src/fxcrt/fxcrt_platforms.h
@@ -0,0 +1,35 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FXCRT_PLATFORMS_

+#define _FXCRT_PLATFORMS_

+#include "extension.h"

+#if _FX_OS_ == _FX_ANDROID_

+void	FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString &bsMode);

+void	FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString &wsMode);

+class CFXCRT_FileAccess_CRT : public IFXCRT_FileAccess, public CFX_Object

+{

+public:

+    CFXCRT_FileAccess_CRT();

+    virtual ~CFXCRT_FileAccess_CRT();

+    virtual FX_BOOL		Open(FX_BSTR fileName, FX_DWORD dwMode);

+    virtual FX_BOOL		Open(FX_WSTR fileName, FX_DWORD dwMode);

+    virtual void		Close();

+    virtual void		Release(IFX_Allocator* pAllocator = NULL);

+    virtual FX_FILESIZE	GetSize() const;

+    virtual FX_FILESIZE	GetPosition() const;

+    virtual FX_FILESIZE	SetPosition(FX_FILESIZE pos);

+    virtual size_t		Read(void* pBuffer, size_t szBuffer);

+    virtual size_t		Write(const void* pBuffer, size_t szBuffer);

+    virtual size_t		ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);

+    virtual size_t		WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);

+    virtual FX_BOOL		Flush();

+    virtual FX_BOOL		Truncate(FX_FILESIZE szFile);

+protected:

+    FXSYS_FILE*	m_hFile;

+};

+#endif

+#endif

diff --git a/core/src/fxcrt/fxcrt_posix.cpp b/core/src/fxcrt/fxcrt_posix.cpp
new file mode 100644
index 0000000..6752e0a
--- /dev/null
+++ b/core/src/fxcrt/fxcrt_posix.cpp
@@ -0,0 +1,201 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_ext.h"

+#include "fxcrt_posix.h"

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_

+IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)

+{

+    if (pAllocator) {

+        return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_Posix();

+    } else {

+        return FX_NEW CFXCRT_FileAccess_Posix;

+    }

+}

+void FXCRT_Posix_GetFileMode(FX_DWORD dwModes, FX_INT32 &nFlags, FX_INT32 &nMasks)

+{

+    nFlags = O_BINARY | O_LARGEFILE;

+    if (dwModes & FX_FILEMODE_ReadOnly) {

+        nFlags |= O_RDONLY;

+        nMasks = 0;

+    } else {

+        nFlags |= O_RDWR | O_CREAT;

+        if (dwModes & FX_FILEMODE_Truncate) {

+            nFlags |= O_TRUNC;

+        }

+        nMasks = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;

+    }

+}

+CFXCRT_FileAccess_Posix::CFXCRT_FileAccess_Posix()

+    : m_nFD(-1)

+{

+}

+CFXCRT_FileAccess_Posix::~CFXCRT_FileAccess_Posix()

+{

+    Close();

+}

+FX_BOOL CFXCRT_FileAccess_Posix::Open(FX_BSTR fileName, FX_DWORD dwMode)

+{

+    if (m_nFD > -1) {

+        return FALSE;

+    }

+    FX_INT32 nFlags, nMasks;

+    FXCRT_Posix_GetFileMode(dwMode, nFlags, nMasks);

+    m_nFD = open(fileName.GetCStr(), nFlags, nMasks);

+    return m_nFD > -1;

+}

+FX_BOOL CFXCRT_FileAccess_Posix::Open(FX_WSTR fileName, FX_DWORD dwMode)

+{

+    return Open(FX_UTF8Encode(fileName), dwMode);

+}

+void CFXCRT_FileAccess_Posix::Close()

+{

+    if (m_nFD < 0) {

+        return;

+    }

+    close(m_nFD);

+    m_nFD = -1;

+}

+void CFXCRT_FileAccess_Posix::Release(IFX_Allocator* pAllocator)

+{

+    if (pAllocator) {

+        FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_Posix);

+    } else {

+        delete this;

+    }

+}

+FX_FILESIZE CFXCRT_FileAccess_Posix::GetSize() const

+{

+    if (m_nFD < 0) {

+        return 0;

+    }

+    struct stat s;

+    FXSYS_memset32(&s, 0, sizeof(s));

+    fstat(m_nFD, &s);

+    return s.st_size;

+}

+FX_FILESIZE CFXCRT_FileAccess_Posix::GetPosition() const

+{

+    if (m_nFD < 0) {

+        return (FX_FILESIZE) - 1;

+    }

+    return lseek(m_nFD, 0, SEEK_CUR);

+}

+FX_FILESIZE CFXCRT_FileAccess_Posix::SetPosition(FX_FILESIZE pos)

+{

+    if (m_nFD < 0) {

+        return (FX_FILESIZE) - 1;

+    }

+    return lseek(m_nFD, pos, SEEK_SET);

+}

+size_t CFXCRT_FileAccess_Posix::Read(void* pBuffer, size_t szBuffer)

+{

+    if (m_nFD < 0) {

+        return 0;

+    }

+    return read(m_nFD, pBuffer, szBuffer);

+}

+size_t CFXCRT_FileAccess_Posix::Write(const void* pBuffer, size_t szBuffer)

+{

+    if (m_nFD < 0) {

+        return 0;

+    }

+    return write(m_nFD, pBuffer, szBuffer);

+}

+size_t CFXCRT_FileAccess_Posix::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)

+{

+    if (m_nFD < 0) {

+        return 0;

+    }

+    if (pos >= GetSize()) {

+        return 0;

+    }

+    if (SetPosition(pos) == (FX_FILESIZE) - 1) {

+        return 0;

+    }

+    return Read(pBuffer, szBuffer);

+}

+size_t CFXCRT_FileAccess_Posix::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)

+{

+    if (m_nFD < 0) {

+        return 0;

+    }

+    if (SetPosition(pos) == (FX_FILESIZE) - 1) {

+        return 0;

+    }

+    return Write(pBuffer, szBuffer);

+}

+FX_BOOL CFXCRT_FileAccess_Posix::Flush()

+{

+    if (m_nFD < 0) {

+        return FALSE;

+    }

+    return fsync(m_nFD) > -1;

+}

+FX_BOOL CFXCRT_FileAccess_Posix::Truncate(FX_FILESIZE szFile)

+{

+    if (m_nFD < 0) {

+        return FALSE;

+    }

+    return !ftruncate(m_nFD, szFile);

+}

+FX_BOOL FX_File_Exist(FX_BSTR fileName)

+{

+    return access(fileName.GetCStr(), F_OK) > -1;

+}

+FX_BOOL FX_File_Exist(FX_WSTR fileName)

+{

+    return FX_File_Exist(FX_UTF8Encode(fileName));

+}

+FX_BOOL FX_File_Delete(FX_BSTR fileName)

+{

+    return remove(fileName.GetCStr()) > -1;

+}

+FX_BOOL FX_File_Delete(FX_WSTR fileName)

+{

+    return FX_File_Delete(FX_UTF8Encode(fileName));

+}

+FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)

+{

+    CFXCRT_FileAccess_Posix src, dst;

+    if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {

+        return FALSE;

+    }

+    FX_FILESIZE size = src.GetSize();

+    if (!size) {

+        return FALSE;

+    }

+    if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {

+        return FALSE;

+    }

+    size_t num = 0;

+    FX_LPBYTE pBuffer = FX_Alloc(FX_BYTE, 32768);

+    if (!pBuffer) {

+        return FALSE;

+    }

+    num = src.Read(pBuffer, 32768);

+    while (num) {

+        if (dst.Write(pBuffer, num) != num) {

+            break;

+        }

+        num = src.Read(pBuffer, 32768);

+    }

+    FX_Free(pBuffer);

+    return TRUE;

+}

+FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)

+{

+    return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));

+}

+FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)

+{

+    return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());

+}

+FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)

+{

+    return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));

+}

+#endif

diff --git a/core/src/fxcrt/fxcrt_posix.h b/core/src/fxcrt/fxcrt_posix.h
new file mode 100644
index 0000000..29c84ad
--- /dev/null
+++ b/core/src/fxcrt/fxcrt_posix.h
@@ -0,0 +1,33 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FXCRT_LINUX_

+#define _FXCRT_LINUX_

+#include "extension.h"

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_

+class CFXCRT_FileAccess_Posix : public IFXCRT_FileAccess, public CFX_Object

+{

+public:

+    CFXCRT_FileAccess_Posix();

+    virtual ~CFXCRT_FileAccess_Posix();

+    virtual FX_BOOL		Open(FX_BSTR fileName, FX_DWORD dwMode);

+    virtual FX_BOOL		Open(FX_WSTR fileName, FX_DWORD dwMode);

+    virtual void		Close();

+    virtual void		Release(IFX_Allocator* pAllocator = NULL);

+    virtual FX_FILESIZE	GetSize() const;

+    virtual FX_FILESIZE	GetPosition() const;

+    virtual FX_FILESIZE	SetPosition(FX_FILESIZE pos);

+    virtual size_t		Read(void* pBuffer, size_t szBuffer);

+    virtual size_t		Write(const void* pBuffer, size_t szBuffer);

+    virtual size_t		ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);

+    virtual size_t		WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);

+    virtual FX_BOOL		Flush();

+    virtual FX_BOOL		Truncate(FX_FILESIZE szFile);

+protected:

+    FX_INT32	m_nFD;

+};

+#endif

+#endif

diff --git a/core/src/fxcrt/fxcrt_windows.cpp b/core/src/fxcrt/fxcrt_windows.cpp
new file mode 100644
index 0000000..e03bfda
--- /dev/null
+++ b/core/src/fxcrt/fxcrt_windows.cpp
@@ -0,0 +1,222 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../include/fxcrt/fx_ext.h"

+#include "fxcrt_windows.h"

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+FX_BOOL FX_File_Exist(FX_BSTR fileName)

+{

+    FX_DWORD dwAttri = ::GetFileAttributesA(fileName.GetCStr());

+    if (dwAttri == -1) {

+        return FALSE;

+    }

+    return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;

+}

+FX_BOOL FX_File_Exist(FX_WSTR fileName)

+{

+    FX_DWORD dwAttri = ::GetFileAttributesW((LPCWSTR)fileName.GetPtr());

+    if (dwAttri == -1) {

+        return FALSE;

+    }

+    return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;

+}

+IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)

+{

+    if (pAllocator) {

+        return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_Win64;

+    } else {

+        return FX_NEW CFXCRT_FileAccess_Win64;

+    }

+}

+void FXCRT_Windows_GetFileMode(FX_DWORD dwMode, FX_DWORD &dwAccess, FX_DWORD &dwShare, FX_DWORD &dwCreation)

+{

+    dwAccess = GENERIC_READ;

+    dwShare = FILE_SHARE_READ | FILE_SHARE_WRITE;

+    if (!(dwMode & FX_FILEMODE_ReadOnly)) {

+        dwAccess |= GENERIC_WRITE;

+        dwCreation = (dwMode & FX_FILEMODE_Truncate) ? CREATE_ALWAYS : OPEN_ALWAYS;

+    } else {

+        dwCreation = OPEN_EXISTING;

+    }

+}

+#ifdef __cplusplus

+extern "C" {

+#endif

+WINBASEAPI BOOL WINAPI GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize);

+WINBASEAPI BOOL WINAPI SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod);

+#ifdef __cplusplus

+}

+#endif

+CFXCRT_FileAccess_Win64::CFXCRT_FileAccess_Win64()

+    : m_hFile(NULL)

+{

+}

+CFXCRT_FileAccess_Win64::~CFXCRT_FileAccess_Win64()

+{

+    Close();

+}

+FX_BOOL CFXCRT_FileAccess_Win64::Open(FX_BSTR fileName, FX_DWORD dwMode)

+{

+    if (m_hFile) {

+        return FALSE;

+    }

+    FX_DWORD dwAccess, dwShare, dwCreation;

+    FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);

+    m_hFile = ::CreateFileA(fileName.GetCStr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);

+    if (m_hFile == INVALID_HANDLE_VALUE) {

+        m_hFile = NULL;

+    }

+    return m_hFile != NULL;

+}

+FX_BOOL CFXCRT_FileAccess_Win64::Open(FX_WSTR fileName, FX_DWORD dwMode)

+{

+    if (m_hFile) {

+        return FALSE;

+    }

+    FX_DWORD dwAccess, dwShare, dwCreation;

+    FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);

+    m_hFile = ::CreateFileW((LPCWSTR)fileName.GetPtr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);

+    if (m_hFile == INVALID_HANDLE_VALUE) {

+        m_hFile = NULL;

+    }

+    return m_hFile != NULL;

+}

+void CFXCRT_FileAccess_Win64::Close()

+{

+    if (!m_hFile) {

+        return;

+    }

+    ::CloseHandle(m_hFile);

+    m_hFile = NULL;

+}

+void CFXCRT_FileAccess_Win64::Release(IFX_Allocator* pAllocator)

+{

+    if (pAllocator) {

+        FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_Win64);

+    } else {

+        delete this;

+    }

+}

+FX_FILESIZE CFXCRT_FileAccess_Win64::GetSize() const

+{

+    if (!m_hFile) {

+        return 0;

+    }

+    LARGE_INTEGER size = {0, 0};

+    if (!::GetFileSizeEx(m_hFile, &size)) {

+        return 0;

+    }

+    return (FX_FILESIZE)size.QuadPart;

+}

+FX_FILESIZE CFXCRT_FileAccess_Win64::GetPosition() const

+{

+    if (!m_hFile) {

+        return (FX_FILESIZE) - 1;

+    }

+    LARGE_INTEGER dist = {0, 0};

+    LARGE_INTEGER newPos = {0, 0};

+    if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_CURRENT)) {

+        return (FX_FILESIZE) - 1;

+    }

+    return (FX_FILESIZE)newPos.QuadPart;

+}

+FX_FILESIZE CFXCRT_FileAccess_Win64::SetPosition(FX_FILESIZE pos)

+{

+    if (!m_hFile) {

+        return (FX_FILESIZE) - 1;

+    }

+    LARGE_INTEGER dist;

+    dist.QuadPart = pos;

+    LARGE_INTEGER newPos = {0, 0};

+    if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_BEGIN)) {

+        return (FX_FILESIZE) - 1;

+    }

+    return (FX_FILESIZE)newPos.QuadPart;

+}

+size_t CFXCRT_FileAccess_Win64::Read(void* pBuffer, size_t szBuffer)

+{

+    if (!m_hFile) {

+        return 0;

+    }

+    size_t szRead = 0;

+    if (!::ReadFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szRead, NULL)) {

+        return 0;

+    }

+    return szRead;

+}

+size_t CFXCRT_FileAccess_Win64::Write(const void* pBuffer, size_t szBuffer)

+{

+    if (!m_hFile) {

+        return 0;

+    }

+    size_t szWrite = 0;

+    if (!::WriteFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szWrite, NULL)) {

+        return 0;

+    }

+    return szWrite;

+}

+size_t CFXCRT_FileAccess_Win64::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)

+{

+    if (!m_hFile) {

+        return 0;

+    }

+    if (pos >= GetSize()) {

+        return 0;

+    }

+    if (SetPosition(pos) == (FX_FILESIZE) - 1) {

+        return 0;

+    }

+    return Read(pBuffer, szBuffer);

+}

+size_t CFXCRT_FileAccess_Win64::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)

+{

+    if (!m_hFile) {

+        return 0;

+    }

+    if (SetPosition(pos) == (FX_FILESIZE) - 1) {

+        return 0;

+    }

+    return Write(pBuffer, szBuffer);

+}

+FX_BOOL CFXCRT_FileAccess_Win64::Flush()

+{

+    if (!m_hFile) {

+        return FALSE;

+    }

+    return ::FlushFileBuffers(m_hFile);

+}

+FX_BOOL CFXCRT_FileAccess_Win64::Truncate(FX_FILESIZE szFile)

+{

+    if (SetPosition(szFile) == (FX_FILESIZE) - 1) {

+        return FALSE;

+    }

+    return ::SetEndOfFile(m_hFile);

+}

+FX_BOOL FX_File_Delete(FX_BSTR fileName)

+{

+    return ::DeleteFileA(fileName.GetCStr());

+}

+FX_BOOL FX_File_Delete(FX_WSTR fileName)

+{

+    return ::DeleteFileW((LPCWSTR)fileName.GetPtr());

+}

+FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)

+{

+    return ::CopyFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr(), FALSE);

+}

+FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)

+{

+    return ::CopyFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr(), FALSE);

+}

+FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)

+{

+    return ::MoveFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr());

+}

+FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)

+{

+    return ::MoveFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr());

+}

+#endif

diff --git a/core/src/fxcrt/fxcrt_windows.h b/core/src/fxcrt/fxcrt_windows.h
new file mode 100644
index 0000000..beb684d
--- /dev/null
+++ b/core/src/fxcrt/fxcrt_windows.h
@@ -0,0 +1,33 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FXCRT_WINDOWS_

+#define _FXCRT_WINDOWS_

+#include "extension.h"

+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_

+class CFXCRT_FileAccess_Win64 : public IFXCRT_FileAccess, public CFX_Object

+{

+public:

+    CFXCRT_FileAccess_Win64();

+    virtual ~CFXCRT_FileAccess_Win64();

+    virtual FX_BOOL		Open(FX_BSTR fileName, FX_DWORD dwMode);

+    virtual FX_BOOL		Open(FX_WSTR fileName, FX_DWORD dwMode);

+    virtual void		Close();

+    virtual void		Release(IFX_Allocator* pAllocator = NULL);

+    virtual FX_FILESIZE	GetSize() const;

+    virtual FX_FILESIZE	GetPosition() const;

+    virtual FX_FILESIZE	SetPosition(FX_FILESIZE pos);

+    virtual size_t		Read(void* pBuffer, size_t szBuffer);

+    virtual size_t		Write(const void* pBuffer, size_t szBuffer);

+    virtual size_t		ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);

+    virtual size_t		WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);

+    virtual FX_BOOL		Flush();

+    virtual FX_BOOL		Truncate(FX_FILESIZE szFile);

+protected:

+    FX_LPVOID	m_hFile;

+};

+#endif

+#endif

diff --git a/core/src/fxcrt/mem_int.h b/core/src/fxcrt/mem_int.h
new file mode 100644
index 0000000..da43023
--- /dev/null
+++ b/core/src/fxcrt/mem_int.h
@@ -0,0 +1,232 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FXM_MEM_INT_H_

+#define _FXM_MEM_INT_H_

+struct FX_DefAllocator {

+    IFX_Allocator			m_Allocator;

+    struct CFX_MemoryMgr*	m_pFoxitMgr;

+};

+struct CFX_MemoryMgr {

+public:

+    FXMEM_SystemMgr*	m_pSystemMgr;

+    FX_DefAllocator		m_DefAllocator;

+    FX_LPVOID			m_pExternalMemory;

+    FX_BOOL				m_bReleaseMgr;

+    void			Init(FXMEM_SystemMgr* pSystemMgr);

+    void*			Alloc(size_t size, int flags);

+    void*			AllocDebug(size_t size, int flags, FX_LPCSTR file, int line);

+    void*			Realloc(void* p, size_t size, int flags);

+    void*			ReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file, int line);

+    void			Free(void* p, int flags);

+    void			PurgeMgr();

+};

+extern CFX_MemoryMgr* g_pDefFoxitMgr;

+#define FIXEDMEM_PAGE_EXTRASPACE		sizeof(size_t)

+#define FIXEDMEM_BLOCKNUM(bs)			(8 * (FX_FIXEDMEM_PAGESIZE - FIXEDMEM_PAGE_EXTRASPACE) / (8 * bs + 1))

+#define FIXEDMEM_8BYTES_BLOCKNUM		FIXEDMEM_BLOCKNUM(8)

+#define FIXEDMEM_16BYTES_BLOCKNUM		FIXEDMEM_BLOCKNUM(16)

+#define FIXEDMEM_32BYTES_BLOCKNUM		FIXEDMEM_BLOCKNUM(32)

+extern const FX_BYTE ZeroLeadPos[256];

+extern const FX_BYTE OneLeadPos[256];

+template <size_t blockNum, size_t blockSize>

+class CFXMEM_FixedPage

+{

+public:

+    void		Initialize()

+    {

+        m_nAvailCount = blockNum;

+        FXSYS_memset32(m_BusyMap, 0, (blockNum + 7) / 8);

+    }

+    FX_BOOL		HasFreeBlock() const

+    {

+        return (FX_BOOL)m_nAvailCount;

+    }

+    FX_LPVOID	Alloc(size_t size)

+    {

+        FXSYS_assert(m_nAvailCount);

+        FX_LPDWORD pFind = (FX_LPDWORD)m_BusyMap;

+        size_t i = 0;

+        while (i < (blockNum + 7) / 8 / 4 && pFind[i] == 0xFFFFFFFF) {

+            i ++;

+        }

+        i *= 4;

+        while (m_BusyMap[i] == 0xFF) {

+            i ++;

+        }

+        size_t pos = ZeroLeadPos[m_BusyMap[i]];

+        m_BusyMap[i] |= 1 << (7 - pos);

+        m_nAvailCount --;

+        return (FX_LPBYTE)(this + 1) + (i * 8 + pos) * blockSize;

+    }

+    void		Free(FX_LPVOID p)

+    {

+        FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)((FX_LPBYTE)this + FX_FIXEDMEM_PAGESIZE));

+        size_t pos = ((FX_LPBYTE)p - (FX_LPBYTE)(this + 1)) / blockSize;

+        m_BusyMap[pos / 8] &= ~(1 << (7 - (pos % 8)));

+        m_nAvailCount ++;

+    }

+    volatile size_t	m_nAvailCount;

+    FX_BYTE			m_BusyMap[(blockNum + 7) / 8];

+};

+typedef CFXMEM_FixedPage<FIXEDMEM_8BYTES_BLOCKNUM, 8>	CFXMEM_8BytesPage;

+typedef CFXMEM_FixedPage<FIXEDMEM_16BYTES_BLOCKNUM, 16>	CFXMEM_16BytesPage;

+typedef CFXMEM_FixedPage<FIXEDMEM_32BYTES_BLOCKNUM, 32>	CFXMEM_32BytesPage;

+template <size_t blockNum, size_t blockSize>

+class CFXMEM_FixedPages

+{

+public:

+    typedef CFXMEM_FixedPage<blockNum, blockSize> T;

+    FX_LPBYTE		m_pStartPage;

+    FX_LPBYTE		m_pLimitPos;

+    FX_LPBYTE		m_pCurPage;

+    volatile size_t	m_nAvailBlocks;

+    void		Initialize(FX_LPBYTE pStart, size_t pages)

+    {

+        m_pStartPage = m_pCurPage = pStart;

+        m_nAvailBlocks = pages * blockNum;

+        for (size_t n = 0; n < pages; n ++) {

+            ((T*)pStart)->Initialize();

+            pStart += FX_FIXEDMEM_PAGESIZE;

+        }

+        m_pLimitPos = pStart;

+    }

+    FX_BOOL		IsEmpty() const

+    {

+        return m_nAvailBlocks == (m_pLimitPos - m_pStartPage) / FX_FIXEDMEM_PAGESIZE * blockNum;

+    }

+    FX_BOOL		HasFreeBlock() const

+    {

+        return (FX_BOOL)m_nAvailBlocks;

+    }

+    FX_LPVOID	Alloc(size_t size)

+    {

+        FXSYS_assert(m_nAvailBlocks);

+        do {

+            if (((T*)m_pCurPage)->HasFreeBlock()) {

+                m_nAvailBlocks --;

+                return ((T*)m_pCurPage)->Alloc(size);

+            }

+            m_pCurPage += FX_FIXEDMEM_PAGESIZE;

+            if (m_pCurPage == m_pLimitPos) {

+                m_pCurPage = m_pStartPage;

+            }

+        } while (TRUE);

+        return NULL;

+    }

+    void		Free(FX_LPVOID p)

+    {

+        FXSYS_assert(p > (FX_LPVOID)m_pStartPage && p < (FX_LPVOID)m_pLimitPos);

+        ((T*)(m_pStartPage + ((FX_LPBYTE)p - m_pStartPage) / FX_FIXEDMEM_PAGESIZE * FX_FIXEDMEM_PAGESIZE))->Free(p);

+        m_nAvailBlocks ++;

+    }

+};

+typedef CFXMEM_FixedPages<FIXEDMEM_8BYTES_BLOCKNUM, 8>		CFXMEM_8BytesPages;

+typedef CFXMEM_FixedPages<FIXEDMEM_16BYTES_BLOCKNUM, 16>	CFXMEM_16BytesPages;

+typedef CFXMEM_FixedPages<FIXEDMEM_32BYTES_BLOCKNUM, 32>	CFXMEM_32BytesPages;

+class CFXMEM_Block

+{

+public:

+    size_t			m_nBlockSize;

+    CFXMEM_Block*	m_pNextBlock;

+};

+class CFXMEM_Page

+{

+public:

+    size_t			m_nAvailSize;

+    CFXMEM_Block*	m_pLimitPos;

+    CFXMEM_Block	m_AvailHead;

+    void		Initialize(size_t size);

+    FX_BOOL		IsEmpty() const

+    {

+        return m_AvailHead.m_pNextBlock && m_AvailHead.m_nBlockSize == m_AvailHead.m_pNextBlock->m_nBlockSize;

+    }

+    FX_LPVOID	Alloc(size_t size);

+    FX_LPVOID	Realloc(FX_LPVOID p, size_t oldSize, size_t newSize);

+    void		Free(FX_LPVOID p);

+protected:

+    FX_LPVOID	Alloc(CFXMEM_Block* pPrevBlock, CFXMEM_Block* pNextBlock, size_t size, size_t oldsize);

+};

+class CFXMEM_Pages

+{

+public:

+    CFXMEM_Page*	m_pStartPage;

+    CFXMEM_Page*	m_pLimitPos;

+    CFXMEM_Page*	m_pCurPage;

+    size_t			m_nPageSize;

+    void		Initialize(FX_LPBYTE pStart, size_t pageSize, size_t pages);

+    FX_BOOL		IsEmpty() const;

+    FX_LPVOID	Alloc(size_t size);

+    FX_LPVOID	Realloc(FX_LPVOID p, size_t oldSize, size_t newSize);

+    void		Free(FX_LPVOID p);

+};

+class CFXMEM_Pool

+{

+public:

+    CFXMEM_Pool*			m_pPrevPool;

+    CFXMEM_Pool*			m_pNextPool;

+    CFXMEM_8BytesPages		m_8BytesPages;

+    CFXMEM_16BytesPages		m_16BytesPages;

+    CFXMEM_32BytesPages		m_32BytesPages;

+    CFXMEM_Pages			m_MidPages;

+    FX_BOOL					m_bAlone;

+    FX_DWORD				m_dwReserved[3];

+    FX_LPVOID				m_pLimitPos;

+    CFXMEM_Page*			m_pLargePage;

+    void		Initialize(const FX_MEMCONFIG* pMemConfig, size_t size, size_t pageNum8Bytes, size_t pageNum16Bytes, size_t pageNum32Bytes, size_t pageNumMid);

+    FX_BOOL		IsEmpty() const;

+    size_t		GetSize(FX_LPVOID p) const;

+    FX_LPVOID	Realloc(FX_LPVOID p, size_t oldSize, size_t newSize);

+    void		Free(FX_LPVOID p);

+};

+class CFXMEM_FixedMgr

+{

+public:

+    void			Initialize(size_t size);

+    FX_LPVOID		Alloc(size_t size);

+    FX_LPVOID		Realloc(FX_LPVOID p, size_t newSize);

+    void			Free(FX_LPVOID p);

+    void			FreeAll();

+    void			Purge();

+    CFXMEM_Pool*	GetFirstPool()

+    {

+        return &m_FirstPool;

+    }

+    size_t			GetSize(FX_LPVOID p) const;

+    FXMEM_SystemMgr		m_SystemMgr;

+    FXMEM_SystemMgr2*	m_pExtender;

+    FX_LPVOID			m_pReserved;

+    FX_MEMCONFIG		m_MemConfig;

+protected:

+    FX_LPVOID		Alloc16(CFXMEM_Pool **pp32Pool = NULL, size_t size = 0);

+    FX_LPVOID		Alloc32(size_t size);

+    FX_LPVOID		AllocSmall(size_t size);

+    FX_LPVOID		AllocMid(size_t size);

+    FX_LPVOID		AllocLarge(size_t size);

+    FX_LPVOID		ReallocSmall(CFXMEM_Pool* pPool, FX_LPVOID p, size_t oldSize, size_t newSize);

+    void			FreePool(CFXMEM_Pool* pPool);

+    CFXMEM_Pool		m_FirstPool;

+};

+#define FIXEDMEM_PROXYSIZE_0	(1024 * 1024 * 8)

+#define FIXEDMEM_PROXYSIZE_1	(1024 * 1024 * 16)

+#define FIXEDMEM_PROXYSIZE_2	(1024 * 1024 * 32)

+#define FIXEDMEM_PROXYSIZE_3	(1024 * 1024 * 64)

+#define FIXEDMEM_PROXYSIZE_4	(1024 * 1024 * 128)

+#define FIXEDMEM_PROXYSIZE_5	(1024 * 1024 * 256)

+const FX_MEMCONFIG*	FixedMgr_GetConfig(size_t nSize);

+class CFixedMgr_Proxy

+{

+public:

+    FXMEM_FoxitMgr*	Initialize(FX_LPVOID pBuffer, size_t nSize, FX_BOOL bExtensible);

+    static FX_BOOL	Common_More(FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size);

+    static void		Common_Free(FXMEM_SystemMgr2* pMgr, void* memory);

+    FXMEM_SystemMgr2	m_SystemMgr;

+    CFXMEM_Page*		m_pFixedPage;

+    FX_LPVOID			m_pBuffer;

+    size_t				m_nSize;

+    FX_BOOL				m_bExtensible;

+};

+#endif

diff --git a/core/src/fxcrt/plex.h b/core/src/fxcrt/plex.h
new file mode 100644
index 0000000..32a27cb
--- /dev/null
+++ b/core/src/fxcrt/plex.h
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+struct CFX_Plex {

+    CFX_Plex* pNext;

+    void* data()

+    {

+        return this + 1;

+    }

+    static CFX_Plex* Create(IFX_Allocator* pAllocator, CFX_Plex*& head, FX_DWORD nMax, FX_DWORD cbElement);

+    void FreeDataChain(IFX_Allocator* pAllocator);

+};

diff --git a/core/src/fxcrt/xml_int.h b/core/src/fxcrt/xml_int.h
new file mode 100644
index 0000000..8ad8ef4
--- /dev/null
+++ b/core/src/fxcrt/xml_int.h
@@ -0,0 +1,178 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FXCRT_XML_INT_

+#define _FXCRT_XML_INT_

+class CXML_DataBufAcc : public IFX_BufferRead, public CFX_Object

+{

+public:

+    CXML_DataBufAcc(FX_LPCBYTE pBuffer, size_t size, IFX_Allocator* pAllocator = NULL)

+        : m_pAllocator(pAllocator)

+        , m_pBuffer(pBuffer)

+        , m_dwSize(size)

+        , m_dwCurPos(0)

+    {

+    }

+    virtual ~CXML_DataBufAcc() {}

+    virtual void			Release()

+    {

+        if (m_pAllocator) {

+            FX_DeleteAtAllocator(this, m_pAllocator, CXML_DataBufAcc);

+        } else {

+            delete this;

+        }

+    }

+    virtual FX_BOOL			IsEOF()

+    {

+        return m_dwCurPos >= m_dwSize;

+    }

+    virtual FX_FILESIZE		GetPosition()

+    {

+        return (FX_FILESIZE)m_dwCurPos;

+    }

+    virtual size_t			ReadBlock(void* buffer, size_t size)

+    {

+        return 0;

+    }

+    virtual FX_BOOL			ReadNextBlock(FX_BOOL bRestart = FALSE)

+    {

+        if (bRestart) {

+            m_dwCurPos = 0;

+        }

+        if (m_dwCurPos < m_dwSize) {

+            m_dwCurPos = m_dwSize;

+            return TRUE;

+        }

+        return FALSE;

+    }

+    virtual FX_LPCBYTE		GetBlockBuffer()

+    {

+        return m_pBuffer;

+    }

+    virtual size_t			GetBlockSize()

+    {

+        return m_dwSize;

+    }

+    virtual FX_FILESIZE		GetBlockOffset()

+    {

+        return 0;

+    }

+protected:

+    IFX_Allocator*	m_pAllocator;

+    FX_LPCBYTE		m_pBuffer;

+    size_t			m_dwSize;

+    size_t			m_dwCurPos;

+};

+#define FX_XMLDATASTREAM_BufferSize		(32 * 1024)

+class CXML_DataStmAcc : public IFX_BufferRead, public CFX_Object

+{

+public:

+    CXML_DataStmAcc(IFX_FileRead *pFileRead, IFX_Allocator* pAllocator = NULL)

+        : m_pAllocator(pAllocator)

+        , m_pFileRead(pFileRead)

+        , m_pBuffer(NULL)

+        , m_nStart(0)

+        , m_dwSize(0)

+    {

+        FXSYS_assert(m_pFileRead != NULL);

+    }

+    virtual ~CXML_DataStmAcc()

+    {

+        if (m_pBuffer) {

+            FX_Allocator_Free(m_pAllocator, m_pBuffer);

+        }

+    }

+    virtual void			Release()

+    {

+        if (m_pAllocator) {

+            FX_DeleteAtAllocator(this, m_pAllocator, CXML_DataStmAcc);

+        } else {

+            delete this;

+        }

+    }

+    virtual FX_BOOL			IsEOF()

+    {

+        return m_nStart + (FX_FILESIZE)m_dwSize >= m_pFileRead->GetSize();

+    }

+    virtual FX_FILESIZE		GetPosition()

+    {

+        return m_nStart + (FX_FILESIZE)m_dwSize;

+    }

+    virtual size_t			ReadBlock(void* buffer, size_t size)

+    {

+        return 0;

+    }

+    virtual FX_BOOL			ReadNextBlock(FX_BOOL bRestart = FALSE)

+    {

+        if (bRestart) {

+            m_nStart = 0;

+        }

+        FX_FILESIZE nLength = m_pFileRead->GetSize();

+        m_nStart += (FX_FILESIZE)m_dwSize;

+        if (m_nStart >= nLength) {

+            return FALSE;

+        }

+        m_dwSize = (size_t)FX_MIN(FX_XMLDATASTREAM_BufferSize, nLength - m_nStart);

+        if (!m_pBuffer) {

+            m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_dwSize);

+            if (!m_pBuffer) {

+                return FALSE;

+            }

+        }

+        return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize);

+    }

+    virtual FX_LPCBYTE		GetBlockBuffer()

+    {

+        return (FX_LPCBYTE)m_pBuffer;

+    }

+    virtual size_t			GetBlockSize()

+    {

+        return m_dwSize;

+    }

+    virtual FX_FILESIZE		GetBlockOffset()

+    {

+        return m_nStart;

+    }

+protected:

+    IFX_Allocator*	m_pAllocator;

+    IFX_FileRead	*m_pFileRead;

+    FX_LPBYTE		m_pBuffer;

+    FX_FILESIZE		m_nStart;

+    size_t			m_dwSize;

+};

+class CXML_Parser

+{

+public:

+    CXML_Parser(IFX_Allocator* pAllocator = NULL) : m_pAllocator(pAllocator) {}

+    ~CXML_Parser();

+    IFX_Allocator*	m_pAllocator;

+    IFX_BufferRead*	m_pDataAcc;

+    FX_BOOL			m_bOwnedStream;

+    FX_FILESIZE		m_nOffset;

+    FX_BOOL			m_bSaveSpaceChars;

+    FX_LPCBYTE		m_pBuffer;

+    size_t			m_dwBufferSize;

+    FX_FILESIZE		m_nBufferOffset;

+    size_t			m_dwIndex;

+    FX_BOOL			Init(FX_LPBYTE pBuffer, size_t size);

+    FX_BOOL			Init(IFX_FileRead *pFileRead);

+    FX_BOOL			Init(IFX_BufferRead *pBuffer);

+    FX_BOOL			Init(FX_BOOL bOwndedStream);

+    FX_BOOL			ReadNextBlock();

+    FX_BOOL			IsEOF();

+    FX_BOOL			HaveAvailData();

+    void			SkipWhiteSpaces();

+    void			GetName(CFX_ByteStringL &space, CFX_ByteStringL &name);

+    void			GetAttrValue(CFX_WideStringL &value);

+    FX_DWORD		GetCharRef();

+    void			GetTagName(CFX_ByteStringL &space, CFX_ByteStringL &name, FX_BOOL &bEndTag, FX_BOOL bStartTag = FALSE);

+    void			SkipLiterals(FX_BSTR str);

+    CXML_Element*	ParseElement(CXML_Element* pParent, FX_BOOL bStartTag = FALSE);

+    void			InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Element* pElement);

+    void			InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement);

+};

+void FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName);

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/DWrite.h b/core/src/fxge/Microsoft SDK/include/DWrite.h
new file mode 100644
index 0000000..70f998a
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/DWrite.h
@@ -0,0 +1,5006 @@
+//+--------------------------------------------------------------------------

+//

+//  Copyright (c) Microsoft Corporation.  All rights reserved.

+//

+//  Abstract:

+//     DirectX Typography Services public API definitions.

+//

+//----------------------------------------------------------------------------

+

+#ifndef DWRITE_H_INCLUDED

+#define DWRITE_H_INCLUDED

+

+#if _MSC_VER > 1000

+#pragma once

+#endif

+

+#ifndef DWRITE_NO_WINDOWS_H

+

+#include "specstrings.h"

+#include "unknwn.h"

+

+#endif // DWRITE_NO_WINDOWS_H

+

+#include "dcommon.h"

+

+#if _FX_COMPILER_ == _FX_VC6_

+typedef signed char         INT8, *PINT8;

+typedef signed short        INT16, *PINT16;

+typedef signed int          INT32, *PINT32;

+typedef signed __int64      INT64, *PINT64;

+typedef unsigned char       UINT8, *PUINT8;

+typedef unsigned short      UINT16, *PUINT16;

+typedef unsigned int        UINT32, *PUINT32;

+typedef unsigned __int64    UINT64, *PUINT64;

+#endif

+

+#ifndef DWRITE_DECLARE_INTERFACE

+#define DWRITE_DECLARE_INTERFACE(iid) DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE

+#endif

+

+#ifndef DWRITE_EXPORT

+#define DWRITE_EXPORT __declspec(dllimport) WINAPI

+#endif

+

+/// <summary>

+/// The type of a font represented by a single font file.

+/// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have

+/// separate enum values for each of the file type.

+/// </summary>

+enum DWRITE_FONT_FILE_TYPE

+{

+    /// <summary>

+    /// Font type is not recognized by the DirectWrite font system.

+    /// </summary>

+    DWRITE_FONT_FILE_TYPE_UNKNOWN,

+

+    /// <summary>

+    /// OpenType font with CFF outlines.

+    /// </summary>

+    DWRITE_FONT_FILE_TYPE_CFF,

+

+    /// <summary>

+    /// OpenType font with TrueType outlines.

+    /// </summary>

+    DWRITE_FONT_FILE_TYPE_TRUETYPE,

+

+    /// <summary>

+    /// OpenType font that contains a TrueType collection.

+    /// </summary>

+    DWRITE_FONT_FILE_TYPE_TRUETYPE_COLLECTION,

+

+    /// <summary>

+    /// Type 1 PFM font.

+    /// </summary>

+    DWRITE_FONT_FILE_TYPE_TYPE1_PFM,

+

+    /// <summary>

+    /// Type 1 PFB font.

+    /// </summary>

+    DWRITE_FONT_FILE_TYPE_TYPE1_PFB,

+

+    /// <summary>

+    /// Vector .FON font.

+    /// </summary>

+    DWRITE_FONT_FILE_TYPE_VECTOR,

+

+    /// <summary>

+    /// Bitmap .FON font.

+    /// </summary>

+    DWRITE_FONT_FILE_TYPE_BITMAP

+};

+

+/// <summary>

+/// The file format of a complete font face.

+/// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have

+/// a single enum entry.

+/// </summary>

+enum DWRITE_FONT_FACE_TYPE

+{

+    /// <summary>

+    /// OpenType font face with CFF outlines.

+    /// </summary>

+    DWRITE_FONT_FACE_TYPE_CFF,

+

+    /// <summary>

+    /// OpenType font face with TrueType outlines.

+    /// </summary>

+    DWRITE_FONT_FACE_TYPE_TRUETYPE,

+

+    /// <summary>

+    /// OpenType font face that is a part of a TrueType collection.

+    /// </summary>

+    DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION,

+

+    /// <summary>

+    /// A Type 1 font face.

+    /// </summary>

+    DWRITE_FONT_FACE_TYPE_TYPE1,

+

+    /// <summary>

+    /// A vector .FON format font face.

+    /// </summary>

+    DWRITE_FONT_FACE_TYPE_VECTOR,

+

+    /// <summary>

+    /// A bitmap .FON format font face.

+    /// </summary>

+    DWRITE_FONT_FACE_TYPE_BITMAP,

+

+    /// <summary>

+    /// Font face type is not recognized by the DirectWrite font system.

+    /// </summary>

+    DWRITE_FONT_FACE_TYPE_UNKNOWN

+};

+

+/// <summary>

+/// Specifies algorithmic style simulations to be applied to the font face.

+/// Bold and oblique simulations can be combined via bitwise OR operation.

+/// </summary>

+enum DWRITE_FONT_SIMULATIONS

+{

+    /// <summary>

+    /// No simulations are performed.

+    /// </summary>

+    DWRITE_FONT_SIMULATIONS_NONE    = 0x0000,

+

+    /// <summary>

+    /// Algorithmic emboldening is performed.

+    /// </summary>

+    DWRITE_FONT_SIMULATIONS_BOLD    = 0x0001,

+

+    /// <summary>

+    /// Algorithmic italicization is performed.

+    /// </summary>

+    DWRITE_FONT_SIMULATIONS_OBLIQUE = 0x0002

+};

+

+#ifdef DEFINE_ENUM_FLAG_OPERATORS

+DEFINE_ENUM_FLAG_OPERATORS(DWRITE_FONT_SIMULATIONS);

+#endif

+

+/// <summary>

+/// The font weight enumeration describes common values for degree of blackness or thickness of strokes of characters in a font.

+/// Font weight values less than 1 or greater than 999 are considered to be invalid, and they are rejected by font API functions.

+/// </summary>

+enum DWRITE_FONT_WEIGHT

+{

+    /// <summary>

+    /// Predefined font weight : Thin (100).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_THIN = 100,

+

+    /// <summary>

+    /// Predefined font weight : Extra-light (200).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_EXTRA_LIGHT = 200,

+

+    /// <summary>

+    /// Predefined font weight : Ultra-light (200).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_ULTRA_LIGHT = 200,

+

+    /// <summary>

+    /// Predefined font weight : Light (300).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_LIGHT = 300,

+

+    /// <summary>

+    /// Predefined font weight : Normal (400).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_NORMAL = 400,

+

+    /// <summary>

+    /// Predefined font weight : Regular (400).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_REGULAR = 400,

+

+    /// <summary>

+    /// Predefined font weight : Medium (500).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_MEDIUM = 500,

+

+    /// <summary>

+    /// Predefined font weight : Demi-bold (600).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_DEMI_BOLD = 600,

+

+    /// <summary>

+    /// Predefined font weight : Semi-bold (600).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_SEMI_BOLD = 600,

+

+    /// <summary>

+    /// Predefined font weight : Bold (700).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_BOLD = 700,

+

+    /// <summary>

+    /// Predefined font weight : Extra-bold (800).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_EXTRA_BOLD = 800,

+

+    /// <summary>

+    /// Predefined font weight : Ultra-bold (800).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_ULTRA_BOLD = 800,

+

+    /// <summary>

+    /// Predefined font weight : Black (900).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_BLACK = 900,

+

+    /// <summary>

+    /// Predefined font weight : Heavy (900).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_HEAVY = 900,

+

+    /// <summary>

+    /// Predefined font weight : Extra-black (950).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_EXTRA_BLACK = 950,

+

+    /// <summary>

+    /// Predefined font weight : Ultra-black (950).

+    /// </summary>

+    DWRITE_FONT_WEIGHT_ULTRA_BLACK = 950

+};

+

+/// <summary>

+/// The font stretch enumeration describes relative change from the normal aspect ratio

+/// as specified by a font designer for the glyphs in a font.

+/// Values less than 1 or greater than 9 are considered to be invalid, and they are rejected by font API functions.

+/// </summary>

+enum DWRITE_FONT_STRETCH

+{

+    /// <summary>

+    /// Predefined font stretch : Not known (0).

+    /// </summary>

+    DWRITE_FONT_STRETCH_UNDEFINED = 0,

+

+    /// <summary>

+    /// Predefined font stretch : Ultra-condensed (1).

+    /// </summary>

+    DWRITE_FONT_STRETCH_ULTRA_CONDENSED = 1,

+

+    /// <summary>

+    /// Predefined font stretch : Extra-condensed (2).

+    /// </summary>

+    DWRITE_FONT_STRETCH_EXTRA_CONDENSED = 2,

+

+    /// <summary>

+    /// Predefined font stretch : Condensed (3).

+    /// </summary>

+    DWRITE_FONT_STRETCH_CONDENSED = 3,

+

+    /// <summary>

+    /// Predefined font stretch : Semi-condensed (4).

+    /// </summary>

+    DWRITE_FONT_STRETCH_SEMI_CONDENSED = 4,

+

+    /// <summary>

+    /// Predefined font stretch : Normal (5).

+    /// </summary>

+    DWRITE_FONT_STRETCH_NORMAL = 5,

+

+    /// <summary>

+    /// Predefined font stretch : Medium (5).

+    /// </summary>

+    DWRITE_FONT_STRETCH_MEDIUM = 5,

+

+    /// <summary>

+    /// Predefined font stretch : Semi-expanded (6).

+    /// </summary>

+    DWRITE_FONT_STRETCH_SEMI_EXPANDED = 6,

+

+    /// <summary>

+    /// Predefined font stretch : Expanded (7).

+    /// </summary>

+    DWRITE_FONT_STRETCH_EXPANDED = 7,

+

+    /// <summary>

+    /// Predefined font stretch : Extra-expanded (8).

+    /// </summary>

+    DWRITE_FONT_STRETCH_EXTRA_EXPANDED = 8,

+

+    /// <summary>

+    /// Predefined font stretch : Ultra-expanded (9).

+    /// </summary>

+    DWRITE_FONT_STRETCH_ULTRA_EXPANDED = 9

+};

+

+/// <summary>

+/// The font style enumeration describes the slope style of a font face, such as Normal, Italic or Oblique.

+/// Values other than the ones defined in the enumeration are considered to be invalid, and they are rejected by font API functions.

+/// </summary>

+enum DWRITE_FONT_STYLE

+{

+    /// <summary>

+    /// Font slope style : Normal.

+    /// </summary>

+    DWRITE_FONT_STYLE_NORMAL,

+

+    /// <summary>

+    /// Font slope style : Oblique.

+    /// </summary>

+    DWRITE_FONT_STYLE_OBLIQUE,

+

+    /// <summary>

+    /// Font slope style : Italic.

+    /// </summary>

+    DWRITE_FONT_STYLE_ITALIC

+

+};

+

+/// <summary>

+/// The informational string enumeration identifies a string in a font.

+/// </summary>

+enum DWRITE_INFORMATIONAL_STRING_ID

+{

+    /// <summary>

+    /// Unspecified name ID.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_NONE,

+

+    /// <summary>

+    /// Copyright notice provided by the font.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_COPYRIGHT_NOTICE,

+

+    /// <summary>

+    /// String containing a version number.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_VERSION_STRINGS,

+

+    /// <summary>

+    /// Trademark information provided by the font.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_TRADEMARK,

+

+    /// <summary>

+    /// Name of the font manufacturer.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_MANUFACTURER,

+

+    /// <summary>

+    /// Name of the font designer.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_DESIGNER,

+

+    /// <summary>

+    /// URL of font designer (with protocol, e.g., http://, ftp://).

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_DESIGNER_URL,

+

+    /// <summary>

+    /// Description of the font. Can contain revision information, usage recommendations, history, features, etc.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_DESCRIPTION,

+

+    /// <summary>

+    /// URL of font vendor (with protocol, e.g., http://, ftp://). If a unique serial number is embedded in the URL, it can be used to register the font.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_FONT_VENDOR_URL,

+

+    /// <summary>

+    /// Description of how the font may be legally used, or different example scenarios for licensed use. This field should be written in plain language, not legalese.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_LICENSE_DESCRIPTION,

+

+    /// <summary>

+    /// URL where additional licensing information can be found.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_LICENSE_INFO_URL,

+

+    /// <summary>

+    /// GDI-compatible family name. Because GDI allows a maximum of four fonts per family, fonts in the same family may have different GDI-compatible family names

+    /// (e.g., "Arial", "Arial Narrow", "Arial Black").

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES,

+

+    /// <summary>

+    /// GDI-compatible subfamily name.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_WIN32_SUBFAMILY_NAMES,

+

+    /// <summary>

+    /// Family name preferred by the designer. This enables font designers to group more than four fonts in a single family without losing compatibility with

+    /// GDI. This name is typically only present if it differs from the GDI-compatible family name.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_PREFERRED_FAMILY_NAMES,

+

+    /// <summary>

+    /// Subfamily name preferred by the designer. This name is typically only present if it differs from the GDI-compatible subfamily name. 

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES,

+

+    /// <summary>

+    /// Sample text. This can be the font name or any other text that the designer thinks is the best example to display the font in.

+    /// </summary>

+    DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT

+};

+

+

+/// <summary>

+/// The DWRITE_FONT_METRICS structure specifies the metrics of a font face that

+/// are applicable to all glyphs within the font face.

+/// </summary>

+struct DWRITE_FONT_METRICS

+{

+    /// <summary>

+    /// The number of font design units per em unit.

+    /// Font files use their own coordinate system of font design units.

+    /// A font design unit is the smallest measurable unit in the em square,

+    /// an imaginary square that is used to size and align glyphs.

+    /// The concept of em square is used as a reference scale factor when defining font size and device transformation semantics.

+    /// The size of one em square is also commonly used to compute the paragraph identation value.

+    /// </summary>

+    UINT16 designUnitsPerEm;

+

+    /// <summary>

+    /// Ascent value of the font face in font design units.

+    /// Ascent is the distance from the top of font character alignment box to English baseline.

+    /// </summary>

+    UINT16 ascent;

+

+    /// <summary>

+    /// Descent value of the font face in font design units.

+    /// Descent is the distance from the bottom of font character alignment box to English baseline.

+    /// </summary>

+    UINT16 descent;

+

+    /// <summary>

+    /// Line gap in font design units.

+    /// Recommended additional white space to add between lines to improve legibility. The recommended line spacing 

+    /// (baseline-to-baseline distance) is thus the sum of ascent, descent, and lineGap. The line gap is usually 

+    /// positive or zero but can be negative, in which case the recommended line spacing is less than the height

+    /// of the character alignment box.

+    /// </summary>

+    INT16 lineGap;

+

+    /// <summary>

+    /// Cap height value of the font face in font design units.

+    /// Cap height is the distance from English baseline to the top of a typical English capital.

+    /// Capital "H" is often used as a reference character for the purpose of calculating the cap height value.

+    /// </summary>

+    UINT16 capHeight;

+

+    /// <summary>

+    /// x-height value of the font face in font design units.

+    /// x-height is the distance from English baseline to the top of lowercase letter "x", or a similar lowercase character.

+    /// </summary>

+    UINT16 xHeight;

+

+    /// <summary>

+    /// The underline position value of the font face in font design units.

+    /// Underline position is the position of underline relative to the English baseline.

+    /// The value is usually made negative in order to place the underline below the baseline.

+    /// </summary>

+    INT16 underlinePosition;

+

+    /// <summary>

+    /// The suggested underline thickness value of the font face in font design units.

+    /// </summary>

+    UINT16 underlineThickness;

+

+    /// <summary>

+    /// The strikethrough position value of the font face in font design units.

+    /// Strikethrough position is the position of strikethrough relative to the English baseline.

+    /// The value is usually made positive in order to place the strikethrough above the baseline.

+    /// </summary>

+    INT16 strikethroughPosition;

+

+    /// <summary>

+    /// The suggested strikethrough thickness value of the font face in font design units.

+    /// </summary>

+    UINT16 strikethroughThickness;

+};

+

+/// <summary>

+/// The DWRITE_GLYPH_METRICS structure specifies the metrics of an individual glyph.

+/// The units depend on how the metrics are obtained.

+/// </summary>

+struct DWRITE_GLYPH_METRICS

+{

+    /// <summary>

+    /// Specifies the X offset from the glyph origin to the left edge of the black box.

+    /// The glyph origin is the current horizontal writing position.

+    /// A negative value means the black box extends to the left of the origin (often true for lowercase italic 'f').

+    /// </summary>

+    INT32 leftSideBearing;

+

+    /// <summary>

+    /// Specifies the X offset from the origin of the current glyph to the origin of the next glyph when writing horizontally.

+    /// </summary>

+    UINT32 advanceWidth;

+

+    /// <summary>

+    /// Specifies the X offset from the right edge of the black box to the origin of the next glyph when writing horizontally.

+    /// The value is negative when the right edge of the black box overhangs the layout box.

+    /// </summary>

+    INT32 rightSideBearing;

+

+    /// <summary>

+    /// Specifies the vertical offset from the vertical origin to the top of the black box.

+    /// Thus, a positive value adds whitespace whereas a negative value means the glyph overhangs the top of the layout box.

+    /// </summary>

+    INT32 topSideBearing;

+

+    /// <summary>

+    /// Specifies the Y offset from the vertical origin of the current glyph to the vertical origin of the next glyph when writing vertically.

+    /// (Note that the term "origin" by itself denotes the horizontal origin. The vertical origin is different.

+    /// Its Y coordinate is specified by verticalOriginY value,

+    /// and its X coordinate is half the advanceWidth to the right of the horizontal origin).

+    /// </summary>

+    UINT32 advanceHeight;

+

+    /// <summary>

+    /// Specifies the vertical distance from the black box's bottom edge to the advance height.

+    /// Positive when the bottom edge of the black box is within the layout box.

+    /// Negative when the bottom edge of black box overhangs the layout box.

+    /// </summary>

+    INT32 bottomSideBearing;

+

+    /// <summary>

+    /// Specifies the Y coordinate of a glyph's vertical origin, in the font's design coordinate system.

+    /// The y coordinate of a glyph's vertical origin is the sum of the glyph's top side bearing

+    /// and the top (i.e. yMax) of the glyph's bounding box.

+    /// </summary>

+    INT32 verticalOriginY;

+};

+

+/// <summary>

+/// Optional adjustment to a glyph's position. An glyph offset changes the position of a glyph without affecting

+/// the pen position. Offsets are in logical, pre-transform units.

+/// </summary>

+struct DWRITE_GLYPH_OFFSET

+{

+    /// <summary>

+    /// Offset in the advance direction of the run. A positive advance offset moves the glyph to the right

+    /// (in pre-transform coordinates) if the run is left-to-right or to the left if the run is right-to-left.

+    /// </summary>

+    FLOAT advanceOffset;

+

+    /// <summary>

+    /// Offset in the ascent direction, i.e., the direction ascenders point. A positive ascender offset moves

+    /// the glyph up (in pre-transform coordinates).

+    /// </summary>

+    FLOAT ascenderOffset;

+};

+

+/// <summary>

+/// Specifies the type of DirectWrite factory object.

+/// DirectWrite factory contains internal state such as font loader registration and cached font data.

+/// In most cases it is recommended to use the shared factory object, because it allows multiple components

+/// that use DirectWrite to share internal DirectWrite state and reduce memory usage.

+/// However, there are cases when it is desirable to reduce the impact of a component,

+/// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it

+/// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed

+/// component.

+/// </summary>

+enum DWRITE_FACTORY_TYPE

+{

+    /// <summary>

+    /// Shared factory allow for re-use of cached font data across multiple in process components.

+    /// Such factories also take advantage of cross process font caching components for better performance.

+    /// </summary>

+    DWRITE_FACTORY_TYPE_SHARED,

+

+    /// <summary>

+    /// Objects created from the isolated factory do not interact with internal DirectWrite state from other components.

+    /// </summary>

+    DWRITE_FACTORY_TYPE_ISOLATED

+};

+

+// Creates an OpenType tag as a 32bit integer such that

+// the first character in the tag is the lowest byte,

+// (least significant on little endian architectures)

+// which can be used to compare with tags in the font file.

+// This macro is compatible with DWRITE_FONT_FEATURE_TAG.

+//

+// Example: DWRITE_MAKE_OPENTYPE_TAG('c','c','m','p')

+// Dword:   0x706D6363

+//

+#define DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d) ( \

+    (static_cast<UINT32>(static_cast<UINT8>(d)) << 24) | \

+    (static_cast<UINT32>(static_cast<UINT8>(c)) << 16) | \

+    (static_cast<UINT32>(static_cast<UINT8>(b)) << 8)  | \

+     static_cast<UINT32>(static_cast<UINT8>(a)))

+

+interface IDWriteFontFileStream;

+

+/// <summary>

+/// Font file loader interface handles loading font file resources of a particular type from a key.

+/// The font file loader interface is recommended to be implemented by a singleton object.

+/// IMPORTANT: font file loader implementations must not register themselves with DirectWrite factory

+/// inside their constructors and must not unregister themselves in their destructors, because

+/// registration and unregistraton operations increment and decrement the object reference count respectively.

+/// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed

+/// outside of the font file loader implementation as a separate step.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("727cad4e-d6af-4c9e-8a08-d695b11caa49") IDWriteFontFileLoader : public IUnknown

+{

+    /// <summary>

+    /// Creates a font file stream object that encapsulates an open file resource.

+    /// The resource is closed when the last reference to fontFileStream is released.

+    /// </summary>

+    /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource

+    /// within the scope of the font loader being used.</param>

+    /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>

+    /// <param name="fontFileStream">Pointer to the newly created font file stream.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateStreamFromKey)(

+        __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,

+        UINT32 fontFileReferenceKeySize,

+        __out IDWriteFontFileStream** fontFileStream

+        ) PURE;

+};

+

+/// <summary>

+/// A built-in implementation of IDWriteFontFileLoader interface that operates on local font files

+/// and exposes local font file information from the font file reference key.

+/// Font file references created using CreateFontFileReference use this font file loader.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("b2d9f3ec-c9fe-4a11-a2ec-d86208f7c0a2") IDWriteLocalFontFileLoader : public IDWriteFontFileLoader

+{

+    /// <summary>

+    /// Obtains the length of the absolute file path from the font file reference key.

+    /// </summary>

+    /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file

+    /// within the scope of the font loader being used.</param>

+    /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>

+    /// <param name="filePathLength">Length of the file path string not including the terminated NULL character.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFilePathLengthFromKey)(

+        __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,

+        UINT32 fontFileReferenceKeySize,

+        __out UINT32* filePathLength

+        ) PURE;

+

+    /// <summary>

+    /// Obtains the absolute font file path from the font file reference key.

+    /// </summary>

+    /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file

+    /// within the scope of the font loader being used.</param>

+    /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>

+    /// <param name="filePath">Character array that receives the local file path.</param>

+    /// <param name="filePathSize">Size of the filePath array in character count including the terminated NULL character.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFilePathFromKey)(

+        __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,

+        UINT32 fontFileReferenceKeySize,

+        __out_ecount_z(filePathSize) WCHAR* filePath,

+        UINT32 filePathSize

+        ) PURE;

+

+    /// <summary>

+    /// Obtains the last write time of the file from the font file reference key.

+    /// </summary>

+    /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file

+    /// within the scope of the font loader being used.</param>

+    /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>

+    /// <param name="lastWriteTime">Last modified time of the font file.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetLastWriteTimeFromKey)(

+        __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,

+        UINT32 fontFileReferenceKeySize,

+        __out FILETIME* lastWriteTime

+        ) PURE;

+};

+

+/// <summary>

+/// The interface for loading font file data.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("6d4865fe-0ab8-4d91-8f62-5dd6be34a3e0") IDWriteFontFileStream : public IUnknown

+{

+    /// <summary>

+    /// Reads a fragment from a file.

+    /// </summary>

+    /// <param name="fragmentStart">Receives the pointer to the start of the font file fragment.</param>

+    /// <param name="fileOffset">Offset of the fragment from the beginning of the font file.</param>

+    /// <param name="fragmentSize">Size of the fragment in bytes.</param>

+    /// <param name="fragmentContext">The client defined context to be passed to the ReleaseFileFragment.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// IMPORTANT: ReadFileFragment() implementations must check whether the requested file fragment

+    /// is within the file bounds. Otherwise, an error should be returned from ReadFileFragment.

+    /// </remarks>

+    STDMETHOD(ReadFileFragment)(

+        __deref_out_bcount(fragmentSize) void const** fragmentStart,

+        UINT64 fileOffset,

+        UINT64 fragmentSize,

+        __out void** fragmentContext

+        ) PURE;

+

+    /// <summary>

+    /// Releases a fragment from a file.

+    /// </summary>

+    /// <param name="fragmentContext">The client defined context of a font fragment returned from ReadFileFragment.</param>

+    STDMETHOD_(void, ReleaseFileFragment)(

+        void* fragmentContext

+        ) PURE;

+

+    /// <summary>

+    /// Obtains the total size of a file.

+    /// </summary>

+    /// <param name="fileSize">Receives the total size of the file.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// Implementing GetFileSize() for asynchronously loaded font files may require

+    /// downloading the complete file contents, therefore this method should only be used for operations that

+    /// either require complete font file to be loaded (e.g., copying a font file) or need to make

+    /// decisions based on the value of the file size (e.g., validation against a persisted file size).

+    /// </remarks>

+    STDMETHOD(GetFileSize)(

+        __out UINT64* fileSize

+        ) PURE;

+

+    /// <summary>

+    /// Obtains the last modified time of the file. The last modified time is used by DirectWrite font selection algorithms

+    /// to determine whether one font resource is more up to date than another one.

+    /// </summary>

+    /// <param name="lastWriteTime">Receives the last modifed time of the file in the format that represents

+    /// the number of 100-nanosecond intervals since January 1, 1601 (UTC).</param>

+    /// <returns>

+    /// Standard HRESULT error code. For resources that don't have a concept of the last modified time, the implementation of

+    /// GetLastWriteTime should return E_NOTIMPL.

+    /// </returns>

+    STDMETHOD(GetLastWriteTime)(

+        __out UINT64* lastWriteTime

+        ) PURE;

+};

+

+/// <summary>

+/// The interface that represents a reference to a font file.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("739d886a-cef5-47dc-8769-1a8b41bebbb0") IDWriteFontFile : public IUnknown

+{

+    /// <summary>

+    /// This method obtains the pointer to the reference key of a font file. The pointer is only valid until the object that refers to it is released.

+    /// </summary>

+    /// <param name="fontFileReferenceKey">Pointer to the font file reference key.

+    /// IMPORTANT: The pointer value is valid until the font file reference object it is obtained from is released.</param>

+    /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetReferenceKey)(

+        __deref_out_bcount(*fontFileReferenceKeySize) void const** fontFileReferenceKey,

+        __out UINT32* fontFileReferenceKeySize

+        ) PURE;

+

+    /// <summary>

+    /// Obtains the file loader associated with a font file object.

+    /// </summary>

+    /// <param name="fontFileLoader">The font file loader associated with the font file object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetLoader)(

+        __out IDWriteFontFileLoader** fontFileLoader

+        ) PURE;

+

+    /// <summary>

+    /// Analyzes a file and returns whether it represents a font, and whether the font type is supported by the font system.

+    /// </summary>

+    /// <param name="isSupportedFontType">TRUE if the font type is supported by the font system, FALSE otherwise.</param>

+    /// <param name="fontFileType">The type of the font file. Note that even if isSupportedFontType is FALSE,

+    /// the fontFileType value may be different from DWRITE_FONT_FILE_TYPE_UNKNOWN.</param>

+    /// <param name="fontFaceType">The type of the font face that can be constructed from the font file.

+    /// Note that even if isSupportedFontType is FALSE, the fontFaceType value may be different from

+    /// DWRITE_FONT_FACE_TYPE_UNKNOWN.</param>

+    /// <param name="numberOfFaces">Number of font faces contained in the font file.</param>

+    /// <returns>

+    /// Standard HRESULT error code if there was a processing error during analysis.

+    /// </returns>

+    /// <remarks>

+    /// IMPORTANT: certain font file types are recognized, but not supported by the font system.

+    /// For example, the font system will recognize a file as a Type 1 font file,

+    /// but will not be able to construct a font face object from it. In such situations, Analyze will set

+    /// isSupportedFontType output parameter to FALSE.

+    /// </remarks>

+    STDMETHOD(Analyze)(

+        __out BOOL* isSupportedFontType,

+        __out DWRITE_FONT_FILE_TYPE* fontFileType,

+        __out_opt DWRITE_FONT_FACE_TYPE* fontFaceType,

+        __out UINT32* numberOfFaces

+        ) PURE;

+};

+

+/// <summary>

+/// Represents the internal structure of a device pixel (i.e., the physical arrangement of red,

+/// green, and blue color components) that is assumed for purposes of rendering text.

+/// </summary>

+#ifndef DWRITE_PIXEL_GEOMETRY_DEFINED

+enum DWRITE_PIXEL_GEOMETRY

+{

+    /// <summary>

+    /// The red, green, and blue color components of each pixel are assumed to occupy the same point.

+    /// </summary>

+    DWRITE_PIXEL_GEOMETRY_FLAT,

+

+    /// <summary>

+    /// Each pixel comprises three vertical stripes, with red on the left, green in the center, and 

+    /// blue on the right. This is the most common pixel geometry for LCD monitors.

+    /// </summary>

+    DWRITE_PIXEL_GEOMETRY_RGB,

+

+    /// <summary>

+    /// Each pixel comprises three vertical stripes, with blue on the left, green in the center, and 

+    /// red on the right.

+    /// </summary>

+    DWRITE_PIXEL_GEOMETRY_BGR

+};

+#define DWRITE_PIXEL_GEOMETRY_DEFINED

+#endif

+

+/// <summary>

+/// Represents a method of rendering glyphs.

+/// </summary>

+enum DWRITE_RENDERING_MODE

+{

+    /// <summary>

+    /// Specifies that the rendering mode is determined automatically based on the font and size.

+    /// </summary>

+    DWRITE_RENDERING_MODE_DEFAULT,

+

+    /// <summary>

+    /// Specifies that no anti-aliasing is performed. Each pixel is either set to the foreground 

+    /// color of the text or retains the color of the background.

+    /// </summary>

+    DWRITE_RENDERING_MODE_ALIASED,

+

+    /// <summary>

+    /// Specifies ClearType rendering with the same metrics as aliased text. Glyphs can only

+    /// be positioned on whole-pixel boundaries.

+    /// </summary>

+    DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC,

+

+    /// <summary>

+    /// Specifies ClearType rendering with the same metrics as text rendering using GDI using a font

+    /// created with CLEARTYPE_NATURAL_QUALITY. Glyph metrics are closer to their ideal values than 

+    /// with aliased text, but glyphs are still positioned on whole-pixel boundaries.

+    /// </summary>

+    DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL,

+

+    /// <summary>

+    /// Specifies ClearType rendering with anti-aliasing in the horizontal dimension only. This is 

+    /// typically used with small to medium font sizes (up to 16 ppem).

+    /// </summary>

+    DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL,

+

+    /// <summary>

+    /// Specifies ClearType rendering with anti-aliasing in both horizontal and vertical dimensions. 

+    /// This is typically used at larger sizes to makes curves and diagonal lines look smoother, at 

+    /// the expense of some softness.

+    /// </summary>

+    DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC,

+

+    /// <summary>

+    /// Specifies that rendering should bypass the rasterizer and use the outlines directly. This is 

+    /// typically used at very large sizes.

+    /// </summary>

+    DWRITE_RENDERING_MODE_OUTLINE

+};

+

+/// <summary>

+/// The DWRITE_MATRIX structure specifies the graphics transform to be applied

+/// to rendered glyphs.

+/// </summary>

+struct DWRITE_MATRIX

+{

+    /// <summary>

+    /// Horizontal scaling / cosine of rotation

+    /// </summary>

+    FLOAT m11;

+

+    /// <summary>

+    /// Vertical shear / sine of rotation

+    /// </summary>

+    FLOAT m12;

+

+    /// <summary>

+    /// Horizontal shear / negative sine of rotation

+    /// </summary>

+    FLOAT m21;

+

+    /// <summary>

+    /// Vertical scaling / cosine of rotation

+    /// </summary>

+    FLOAT m22;

+

+    /// <summary>

+    /// Horizontal shift (always orthogonal regardless of rotation)

+    /// </summary>

+    FLOAT dx;

+

+    /// <summary>

+    /// Vertical shift (always orthogonal regardless of rotation)

+    /// </summary>

+    FLOAT dy;

+};

+

+/// <summary>

+/// The interface that represents text rendering settings for glyph rasterization and filtering.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("2f0da53a-2add-47cd-82ee-d9ec34688e75") IDWriteRenderingParams : public IUnknown

+{

+    /// <summary>

+    /// Gets the gamma value used for gamma correction. Valid values must be

+    /// greater than zero and cannot exceed 256.

+    /// </summary>

+    STDMETHOD_(FLOAT, GetGamma)() PURE;

+

+    /// <summary>

+    /// Gets the amount of contrast enhancement. Valid values are greater than

+    /// or equal to zero.

+    /// </summary>

+    STDMETHOD_(FLOAT, GetEnhancedContrast)() PURE;

+

+    /// <summary>

+    /// Gets the ClearType level. Valid values range from 0.0f (no ClearType) 

+    /// to 1.0f (full ClearType).

+    /// </summary>

+    STDMETHOD_(FLOAT, GetClearTypeLevel)() PURE;

+

+    /// <summary>

+    /// Gets the pixel geometry.

+    /// </summary>

+    STDMETHOD_(DWRITE_PIXEL_GEOMETRY, GetPixelGeometry)() PURE;

+

+    /// <summary>

+    /// Gets the rendering mode.

+    /// </summary>

+    STDMETHOD_(DWRITE_RENDERING_MODE, GetRenderingMode)() PURE;

+};

+

+// Forward declarations of D2D types

+interface ID2D1SimplifiedGeometrySink;

+

+typedef ID2D1SimplifiedGeometrySink IDWriteGeometrySink;

+

+/// <summary>

+/// The interface that represents an absolute reference to a font face.

+/// It contains font face type, appropriate file references and face identification data.

+/// Various font data such as metrics, names and glyph outlines is obtained from IDWriteFontFace.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("5f49804d-7024-4d43-bfa9-d25984f53849") IDWriteFontFace : public IUnknown

+{

+    /// <summary>

+    /// Obtains the file format type of a font face.

+    /// </summary>

+    STDMETHOD_(DWRITE_FONT_FACE_TYPE, GetType)() PURE;

+

+    /// <summary>

+    /// Obtains the font files representing a font face.

+    /// </summary>

+    /// <param name="numberOfFiles">The number of files representing the font face.</param>

+    /// <param name="fontFiles">User provided array that stores pointers to font files representing the font face.

+    /// This parameter can be NULL if the user is only interested in the number of files representing the font face.

+    /// This API increments reference count of the font file pointers returned according to COM conventions, and the client

+    /// should release them when finished.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFiles)(

+        __inout UINT32* numberOfFiles,

+        __out_ecount_opt(*numberOfFiles) IDWriteFontFile** fontFiles

+        ) PURE;

+

+    /// <summary>

+    /// Obtains the zero-based index of the font face in its font file or files. If the font files contain a single face,

+    /// the return value is zero.

+    /// </summary>

+    STDMETHOD_(UINT32, GetIndex)() PURE;

+

+    /// <summary>

+    /// Obtains the algorithmic style simulation flags of a font face.

+    /// </summary>

+    STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)() PURE;

+

+    /// <summary>

+    /// Determines whether the font is a symbol font.

+    /// </summary>

+    STDMETHOD_(BOOL, IsSymbolFont)() PURE;

+

+    /// <summary>

+    /// Obtains design units and common metrics for the font face.

+    /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.

+    /// </summary>

+    /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.

+    /// The metrics returned by this function are in font design units.</param>

+    STDMETHOD_(void, GetMetrics)(

+        __out DWRITE_FONT_METRICS* fontFaceMetrics

+        ) PURE;

+

+    /// <summary>

+    /// Obtains the number of glyphs in the font face.

+    /// </summary>

+    STDMETHOD_(UINT16, GetGlyphCount)() PURE;

+

+    /// <summary>

+    /// Obtains ideal glyph metrics in font design units. Design glyphs metrics are used for glyph positioning.

+    /// </summary>

+    /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>

+    /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>

+    /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.

+    /// The metrics returned by this function are in font design units.</param>

+    /// <param name="isSideways">Indicates whether the font is being used in a sideways run.

+    /// This can affect the glyph metrics if the font has oblique simulation

+    /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>

+    /// <returns>

+    /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range

+    /// for the current font face, E_INVALIDARG will be returned.

+    /// </returns>

+    STDMETHOD(GetDesignGlyphMetrics)(

+        __in_ecount(glyphCount) UINT16 const* glyphIndices,

+        UINT32 glyphCount,

+        __out_ecount(glyphCount) DWRITE_GLYPH_METRICS* glyphMetrics,

+        BOOL isSideways = FALSE

+        ) PURE;

+

+    /// <summary>

+    /// Returns the nominal mapping of UCS4 Unicode code points to glyph indices as defined by the font 'CMAP' table.

+    /// Note that this mapping is primarily provided for line layout engines built on top of the physical font API.

+    /// Because of OpenType glyph substitution and line layout character substitution, the nominal conversion does not always correspond

+    /// to how a Unicode string will map to glyph indices when rendering using a particular font face.

+    /// Also, note that Unicode Variant Selectors provide for alternate mappings for character to glyph.

+    /// This call will always return the default variant.

+    /// </summary>

+    /// <param name="codePoints">An array of USC4 code points to obtain nominal glyph indices from.</param>

+    /// <param name="codePointCount">The number of elements in the codePoints array.</param>

+    /// <param name="glyphIndices">Array of nominal glyph indices filled by this function.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetGlyphIndices)(

+        __in_ecount(codePointCount) UINT32 const* codePoints,

+        UINT32 codePointCount,

+        __out_ecount(codePointCount) UINT16* glyphIndices

+        ) PURE;

+ 

+    /// <summary>

+    /// Finds the specified OpenType font table if it exists and returns a pointer to it.

+    /// The function accesses the underling font data via the IDWriteFontStream interface

+    /// implemented by the font file loader.

+    /// </summary>

+    /// <param name="openTypeTableTag">Four character tag of table to find.

+    ///     Use the DWRITE_MAKE_OPENTYPE_TAG() macro to create it.

+    ///     Unlike GDI, it does not support the special TTCF and null tags to access the whole font.</param>

+    /// <param name="tableData">

+    ///     Pointer to base of table in memory.

+    ///     The pointer is only valid so long as the FontFace used to get the font table still exists

+    ///     (not any other FontFace, even if it actually refers to the same physical font).

+    /// </param>

+    /// <param name="tableSize">Byte size of table.</param>

+    /// <param name="tableContext">

+    ///     Opaque context which must be freed by calling ReleaseFontTable.

+    ///     The context actually comes from the lower level IDWriteFontFileStream,

+    ///     which may be implemented by the application or DWrite itself.

+    ///     It is possible for a NULL tableContext to be returned, especially if

+    ///     the implementation directly memory maps the whole file.

+    ///     Nevertheless, always release it later, and do not use it as a test for function success.

+    ///     The same table can be queried multiple times,

+    ///     but each returned context can be different, so release each separately.

+    /// </param>

+    /// <param name="exists">True if table exists.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// If a table can not be found, the function will not return an error, but the size will be 0, table NULL, and exists = FALSE.

+    /// The context does not need to be freed if the table was not found.

+    /// </returns>

+    /// <remarks>

+    /// The context for the same tag may be different for each call,

+    /// so each one must be held and released separately.

+    /// </remarks>

+    STDMETHOD(TryGetFontTable)(

+        __in UINT32 openTypeTableTag,

+        __deref_out_bcount(*tableSize) const void** tableData,

+        __out UINT32* tableSize,

+        __out void** tableContext,

+        __out BOOL* exists

+        ) PURE;

+

+    /// <summary>

+    /// Releases the table obtained earlier from TryGetFontTable.

+    /// </summary>

+    /// <param name="tableContext">Opaque context from TryGetFontTable.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD_(void, ReleaseFontTable)(

+        __in void* tableContext

+        ) PURE;

+

+    /// <summary>

+    /// Computes the outline of a run of glyphs by calling back to the outline sink interface.

+    /// </summary>

+    /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>

+    /// <param name="glyphIndices">Array of glyph indices.</param>

+    /// <param name="glyphAdvances">Optional array of glyph advances in DIPs.</param>

+    /// <param name="glyphOffsets">Optional array of glyph offsets.</param>

+    /// <param name="glyphCount">Number of glyphs.</param>

+    /// <param name="isSideways">If true, specifies that glyphs are rotated 90 degrees to the left and vertical metrics are used.

+    /// A client can render a vertical run by specifying isSideways = true and rotating the resulting geometry 90 degrees to the

+    /// right using a transform. The isSideways and isRightToLeft parameters cannot both be true.</param>

+    /// <param name="isRightToLeft">If true, specifies that the advance direction is right to left. By default, the advance direction

+    /// is left to right.</param>

+    /// <param name="geometrySink">Interface the function calls back to draw each element of the geometry.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetGlyphRunOutline)(

+        FLOAT emSize,

+        __in_ecount(glyphCount) UINT16 const* glyphIndices,

+        __in_ecount_opt(glyphCount) FLOAT const* glyphAdvances,

+        __in_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets,

+        UINT32 glyphCount,

+        BOOL isSideways,

+        BOOL isRightToLeft,

+        IDWriteGeometrySink* geometrySink

+        ) PURE;

+

+    /// <summary>

+    /// Determines the recommended rendering mode for the font given the specified size and rendering parameters.

+    /// </summary>

+    /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>

+    /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this 

+    /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>

+    /// <param name="measuringMode">Specifies measuring method that will be used for glyphs in the font.

+    /// Renderer implementations may choose different rendering modes for given measuring methods, but

+    /// best results are seen when the corresponding modes match:

+    /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL

+    /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC

+    /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL

+    /// </param>

+    /// <param name="renderingParams">Rendering parameters object. This parameter is necessary in case the rendering parameters 

+    /// object overrides the rendering mode.</param>

+    /// <param name="renderingMode">Receives the recommended rendering mode to use.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetRecommendedRenderingMode)(

+        FLOAT emSize,

+        FLOAT pixelsPerDip,

+        DWRITE_MEASURING_MODE measuringMode,

+        IDWriteRenderingParams* renderingParams,

+        __out DWRITE_RENDERING_MODE* renderingMode

+        ) PURE;

+

+    /// <summary>

+    /// Obtains design units and common metrics for the font face.

+    /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.

+    /// </summary>

+    /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>

+    /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this 

+    /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>

+    /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the

+    /// scaling specified by the font size and pixelsPerDip.</param>

+    /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.

+    /// The metrics returned by this function are in font design units.</param>

+    STDMETHOD(GetGdiCompatibleMetrics)(

+        FLOAT emSize,

+        FLOAT pixelsPerDip,

+        __in_opt DWRITE_MATRIX const* transform,

+        __out DWRITE_FONT_METRICS* fontFaceMetrics

+        ) PURE;

+

+

+    /// <summary>

+    /// Obtains glyph metrics in font design units with the return values compatible with what GDI would produce.

+    /// Glyphs metrics are used for positioning of individual glyphs.

+    /// </summary>

+    /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>

+    /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this 

+    /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>

+    /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the

+    /// scaling specified by the font size and pixelsPerDip.</param>

+    /// <param name="useGdiNatural">

+    /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.

+    /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font

+    /// created with CLEARTYPE_NATURAL_QUALITY.

+    /// </param>

+    /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>

+    /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>

+    /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.

+    /// The metrics returned by this function are in font design units.</param>

+    /// <param name="isSideways">Indicates whether the font is being used in a sideways run.

+    /// This can affect the glyph metrics if the font has oblique simulation

+    /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>

+    /// <returns>

+    /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range

+    /// for the current font face, E_INVALIDARG will be returned.

+    /// </returns>

+    STDMETHOD(GetGdiCompatibleGlyphMetrics)(

+        FLOAT emSize,

+        FLOAT pixelsPerDip,

+        __in_opt DWRITE_MATRIX const* transform,

+        BOOL useGdiNatural,

+        __in_ecount(glyphCount) UINT16 const* glyphIndices,

+        UINT32 glyphCount,

+        __out_ecount(glyphCount) DWRITE_GLYPH_METRICS* glyphMetrics,

+        BOOL isSideways = FALSE

+        ) PURE;

+};

+

+interface IDWriteFactory;

+interface IDWriteFontFileEnumerator;

+

+/// <summary>

+/// The font collection loader interface is used to construct a collection of fonts given a particular type of key.

+/// The font collection loader interface is recommended to be implemented by a singleton object.

+/// IMPORTANT: font collection loader implementations must not register themselves with a DirectWrite factory

+/// inside their constructors and must not unregister themselves in their destructors, because

+/// registration and unregistraton operations increment and decrement the object reference count respectively.

+/// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed

+/// outside of the font file loader implementation as a separate step.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("cca920e4-52f0-492b-bfa8-29c72ee0a468") IDWriteFontCollectionLoader : public IUnknown

+{

+    /// <summary>

+    /// Creates a font file enumerator object that encapsulates a collection of font files.

+    /// The font system calls back to this interface to create a font collection.

+    /// </summary>

+    /// <param name="factory">Factory associated with the loader.</param>

+    /// <param name="collectionKey">Font collection key that uniquely identifies the collection of font files within

+    /// the scope of the font collection loader being used.</param>

+    /// <param name="collectionKeySize">Size of the font collection key in bytes.</param>

+    /// <param name="fontFileEnumerator">Pointer to the newly created font file enumerator.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateEnumeratorFromKey)(

+        IDWriteFactory* factory,

+        __in_bcount(collectionKeySize) void const* collectionKey,

+        UINT32 collectionKeySize,

+        __out IDWriteFontFileEnumerator** fontFileEnumerator

+        ) PURE;

+};

+

+/// <summary>

+/// The font file enumerator interface encapsulates a collection of font files. The font system uses this interface

+/// to enumerate font files when building a font collection.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("72755049-5ff7-435d-8348-4be97cfa6c7c") IDWriteFontFileEnumerator : public IUnknown

+{

+    /// <summary>

+    /// Advances to the next font file in the collection. When it is first created, the enumerator is positioned

+    /// before the first element of the collection and the first call to MoveNext advances to the first file.

+    /// </summary>

+    /// <param name="hasCurrentFile">Receives the value TRUE if the enumerator advances to a file, or FALSE if

+    /// the enumerator advanced past the last file in the collection.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(MoveNext)(

+        __out BOOL* hasCurrentFile

+        ) PURE;

+

+    /// <summary>

+    /// Gets a reference to the current font file.

+    /// </summary>

+    /// <param name="fontFile">Pointer to the newly created font file object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetCurrentFontFile)(

+        __out IDWriteFontFile** fontFile

+        ) PURE;

+};

+

+/// <summary>

+/// Represents a collection of strings indexed by locale name.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("08256209-099a-4b34-b86d-c22b110e7771") IDWriteLocalizedStrings : public IUnknown

+{

+    /// <summary>

+    /// Gets the number of language/string pairs.

+    /// </summary>

+    STDMETHOD_(UINT32, GetCount)() PURE;

+

+    /// <summary>

+    /// Gets the index of the item with the specified locale name.

+    /// </summary>

+    /// <param name="localeName">Locale name to look for.</param>

+    /// <param name="index">Receives the zero-based index of the locale name/string pair.</param>

+    /// <param name="exists">Receives TRUE if the locale name exists or FALSE if not.</param>

+    /// <returns>

+    /// Standard HRESULT error code. If the specified locale name does not exist, the return value is S_OK, 

+    /// but *index is UINT_MAX and *exists is FALSE.

+    /// </returns>

+    STDMETHOD(FindLocaleName)(

+        __in_z WCHAR const* localeName, 

+        __out UINT32* index,

+        __out BOOL* exists

+        ) PURE;

+

+    /// <summary>

+    /// Gets the length in characters (not including the null terminator) of the locale name with the specified index.

+    /// </summary>

+    /// <param name="index">Zero-based index of the locale name.</param>

+    /// <param name="length">Receives the length in characters, not including the null terminator.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetLocaleNameLength)(

+        UINT32 index,

+        __out UINT32* length

+        ) PURE;

+

+    /// <summary>

+    /// Copies the locale name with the specified index to the specified array.

+    /// </summary>

+    /// <param name="index">Zero-based index of the locale name.</param>

+    /// <param name="localeName">Character array that receives the locale name.</param>

+    /// <param name="size">Size of the array in characters. The size must include space for the terminating

+    /// null character.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetLocaleName)(

+        UINT32 index,

+        __out_ecount_z(size) WCHAR* localeName,

+        UINT32 size

+        ) PURE;

+

+    /// <summary>

+    /// Gets the length in characters (not including the null terminator) of the string with the specified index.

+    /// </summary>

+    /// <param name="index">Zero-based index of the string.</param>

+    /// <param name="length">Receives the length in characters, not including the null terminator.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetStringLength)(

+        UINT32 index,

+        __out UINT32* length

+        ) PURE;

+

+    /// <summary>

+    /// Copies the string with the specified index to the specified array.

+    /// </summary>

+    /// <param name="index">Zero-based index of the string.</param>

+    /// <param name="stringBuffer">Character array that receives the string.</param>

+    /// <param name="size">Size of the array in characters. The size must include space for the terminating

+    /// null character.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetString)(

+        UINT32 index,

+        __out_ecount_z(size) WCHAR* stringBuffer,

+        UINT32 size

+        ) PURE;

+};

+

+interface IDWriteFontFamily;

+interface IDWriteFont;

+

+/// <summary>

+/// The IDWriteFontCollection encapsulates a collection of fonts.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("a84cee02-3eea-4eee-a827-87c1a02a0fcc") IDWriteFontCollection : public IUnknown

+{

+    /// <summary>

+    /// Gets the number of font families in the collection.

+    /// </summary>

+    STDMETHOD_(UINT32, GetFontFamilyCount)() PURE;

+

+    /// <summary>

+    /// Creates a font family object given a zero-based font family index.

+    /// </summary>

+    /// <param name="index">Zero-based index of the font family.</param>

+    /// <param name="fontFamily">Receives a pointer the newly created font family object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontFamily)(

+        UINT32 index,

+        __out IDWriteFontFamily** fontFamily

+        ) PURE;

+

+    /// <summary>

+    /// Finds the font family with the specified family name.

+    /// </summary>

+    /// <param name="familyName">Name of the font family. The name is not case-sensitive but must otherwise exactly match a family name in the collection.</param>

+    /// <param name="index">Receives the zero-based index of the matching font family if the family name was found or UINT_MAX otherwise.</param>

+    /// <param name="exists">Receives TRUE if the family name exists or FALSE otherwise.</param>

+    /// <returns>

+    /// Standard HRESULT error code. If the specified family name does not exist, the return value is S_OK, but *index is UINT_MAX and *exists is FALSE.

+    /// </returns>

+    STDMETHOD(FindFamilyName)(

+        __in_z WCHAR const* familyName,

+        __out UINT32* index,

+        __out BOOL* exists

+        ) PURE;

+

+    /// <summary>

+    /// Gets the font object that corresponds to the same physical font as the specified font face object. The specified physical font must belong 

+    /// to the font collection.

+    /// </summary>

+    /// <param name="fontFace">Font face object that specifies the physical font.</param>

+    /// <param name="font">Receives a pointer to the newly created font object if successful or NULL otherwise.</param>

+    /// <returns>

+    /// Standard HRESULT error code. If the specified physical font is not part of the font collection the return value is DWRITE_E_NOFONT.

+    /// </returns>

+    STDMETHOD(GetFontFromFontFace)(

+        IDWriteFontFace* fontFace,

+        __out IDWriteFont** font

+        ) PURE;

+};

+

+/// <summary>

+/// The IDWriteFontList interface represents a list of fonts.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("1a0d8438-1d97-4ec1-aef9-a2fb86ed6acb") IDWriteFontList : public IUnknown

+{

+    /// <summary>

+    /// Gets the font collection that contains the fonts.

+    /// </summary>

+    /// <param name="fontCollection">Receives a pointer to the font collection object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontCollection)(

+        __out IDWriteFontCollection** fontCollection

+        ) PURE;

+

+    /// <summary>

+    /// Gets the number of fonts in the font list.

+    /// </summary>

+    STDMETHOD_(UINT32, GetFontCount)() PURE;

+

+    /// <summary>

+    /// Gets a font given its zero-based index.

+    /// </summary>

+    /// <param name="index">Zero-based index of the font in the font list.</param>

+    /// <param name="font">Receives a pointer to the newly created font object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFont)(

+        UINT32 index, 

+        __out IDWriteFont** font

+        ) PURE;

+};

+

+/// <summary>

+/// The IDWriteFontFamily interface represents a set of fonts that share the same design but are differentiated

+/// by weight, stretch, and style.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("da20d8ef-812a-4c43-9802-62ec4abd7add") IDWriteFontFamily : public IDWriteFontList

+{

+    /// <summary>

+    /// Creates an localized strings object that contains the family names for the font family, indexed by locale name.

+    /// </summary>

+    /// <param name="names">Receives a pointer to the newly created localized strings object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFamilyNames)(

+        __out IDWriteLocalizedStrings** names

+        ) PURE;

+

+    /// <summary>

+    /// Gets the font that best matches the specified properties.

+    /// </summary>

+    /// <param name="weight">Requested font weight.</param>

+    /// <param name="stretch">Requested font stretch.</param>

+    /// <param name="style">Requested font style.</param>

+    /// <param name="matchingFont">Receives a pointer to the newly created font object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFirstMatchingFont)(

+        DWRITE_FONT_WEIGHT  weight,

+        DWRITE_FONT_STRETCH stretch,

+        DWRITE_FONT_STYLE   style,

+        __out IDWriteFont** matchingFont

+        ) PURE;

+

+    /// <summary>

+    /// Gets a list of fonts in the font family ranked in order of how well they match the specified properties.

+    /// </summary>

+    /// <param name="weight">Requested font weight.</param>

+    /// <param name="stretch">Requested font stretch.</param>

+    /// <param name="style">Requested font style.</param>

+    /// <param name="matchingFonts">Receives a pointer to the newly created font list object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetMatchingFonts)(

+        DWRITE_FONT_WEIGHT      weight,

+        DWRITE_FONT_STRETCH     stretch,

+        DWRITE_FONT_STYLE       style,

+        __out IDWriteFontList** matchingFonts

+        ) PURE;

+};

+

+/// <summary>

+/// The IDWriteFont interface represents a physical font in a font collection.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("acd16696-8c14-4f5d-877e-fe3fc1d32737") IDWriteFont : public IUnknown

+{

+    /// <summary>

+    /// Gets the font family to which the specified font belongs.

+    /// </summary>

+    /// <param name="fontFamily">Receives a pointer to the font family object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontFamily)(

+        __out IDWriteFontFamily** fontFamily

+        ) PURE;

+

+    /// <summary>

+    /// Gets the weight of the specified font.

+    /// </summary>

+    STDMETHOD_(DWRITE_FONT_WEIGHT, GetWeight)() PURE;

+

+    /// <summary>

+    /// Gets the stretch (aka. width) of the specified font.

+    /// </summary>

+    STDMETHOD_(DWRITE_FONT_STRETCH, GetStretch)() PURE;

+

+    /// <summary>

+    /// Gets the style (aka. slope) of the specified font.

+    /// </summary>

+    STDMETHOD_(DWRITE_FONT_STYLE, GetStyle)() PURE;

+

+    /// <summary>

+    /// Returns TRUE if the font is a symbol font or FALSE if not.

+    /// </summary>

+    STDMETHOD_(BOOL, IsSymbolFont)() PURE;

+

+    /// <summary>

+    /// Gets a localized strings collection containing the face names for the font (e.g., Regular or Bold), indexed by locale name.

+    /// </summary>

+    /// <param name="names">Receives a pointer to the newly created localized strings object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFaceNames)(

+        __out IDWriteLocalizedStrings** names

+        ) PURE;

+

+    /// <summary>

+    /// Gets a localized strings collection containing the specified informational strings, indexed by locale name.

+    /// </summary>

+    /// <param name="informationalStringID">Identifies the string to get.</param>

+    /// <param name="informationalStrings">Receives a pointer to the newly created localized strings object.</param>

+    /// <param name="exists">Receives the value TRUE if the font contains the specified string ID or FALSE if not.</param>

+    /// <returns>

+    /// Standard HRESULT error code. If the font does not contain the specified string, the return value is S_OK but 

+    /// informationalStrings receives a NULL pointer and exists receives the value FALSE.

+    /// </returns>

+    STDMETHOD(GetInformationalStrings)(

+        DWRITE_INFORMATIONAL_STRING_ID informationalStringID,

+        __out IDWriteLocalizedStrings** informationalStrings,

+        __out BOOL* exists

+        ) PURE;

+

+    /// <summary>

+    /// Gets a value that indicates what simulation are applied to the specified font.

+    /// </summary>

+    STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)() PURE;

+

+    /// <summary>

+    /// Gets the metrics for the font.

+    /// </summary>

+    /// <param name="fontMetrics">Receives the font metrics.</param>

+    STDMETHOD_(void, GetMetrics)(

+        __out DWRITE_FONT_METRICS* fontMetrics

+        ) PURE;

+

+    /// <summary>

+    /// Determines whether the font supports the specified character.

+    /// </summary>

+    /// <param name="unicodeValue">Unicode (UCS-4) character value.</param>

+    /// <param name="exists">Receives the value TRUE if the font supports the specified character or FALSE if not.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(HasCharacter)(

+        UINT32 unicodeValue,

+        __out BOOL* exists

+        ) PURE;

+

+    /// <summary>

+    /// Creates a font face object for the font.

+    /// </summary>

+    /// <param name="fontFace">Receives a pointer to the newly created font face object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateFontFace)(

+        __out IDWriteFontFace** fontFace

+        ) PURE;

+};

+

+/// <summary>

+/// Direction for how reading progresses.

+/// </summary>

+enum DWRITE_READING_DIRECTION

+{

+    /// <summary>

+    /// Reading progresses from left to right.

+    /// </summary>

+    DWRITE_READING_DIRECTION_LEFT_TO_RIGHT,

+

+    /// <summary>

+    /// Reading progresses from right to left.

+    /// </summary>

+    DWRITE_READING_DIRECTION_RIGHT_TO_LEFT

+};

+

+/// <summary>

+/// Direction for how lines of text are placed relative to one another.

+/// </summary>

+enum DWRITE_FLOW_DIRECTION

+{

+    /// <summary>

+    /// Text lines are placed from top to bottom.

+    /// </summary>

+    DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM

+};

+

+/// <summary>

+/// Alignment of paragraph text along the reading direction axis relative to 

+/// the leading and trailing edge of the layout box.

+/// </summary>

+enum DWRITE_TEXT_ALIGNMENT

+{

+    /// <summary>

+    /// The leading edge of the paragraph text is aligned to the layout box's leading edge.

+    /// </summary>

+    DWRITE_TEXT_ALIGNMENT_LEADING,

+

+    /// <summary>

+    /// The trailing edge of the paragraph text is aligned to the layout box's trailing edge.

+    /// </summary>

+    DWRITE_TEXT_ALIGNMENT_TRAILING,

+

+    /// <summary>

+    /// The center of the paragraph text is aligned to the center of the layout box.

+    /// </summary>

+    DWRITE_TEXT_ALIGNMENT_CENTER

+};

+

+/// <summary>

+/// Alignment of paragraph text along the flow direction axis relative to the

+/// flow's beginning and ending edge of the layout box.

+/// </summary>

+enum DWRITE_PARAGRAPH_ALIGNMENT

+{

+    /// <summary>

+    /// The first line of paragraph is aligned to the flow's beginning edge of the layout box.

+    /// </summary>

+    DWRITE_PARAGRAPH_ALIGNMENT_NEAR,

+

+    /// <summary>

+    /// The last line of paragraph is aligned to the flow's ending edge of the layout box.

+    /// </summary>

+    DWRITE_PARAGRAPH_ALIGNMENT_FAR,

+

+    /// <summary>

+    /// The center of the paragraph is aligned to the center of the flow of the layout box.

+    /// </summary>

+    DWRITE_PARAGRAPH_ALIGNMENT_CENTER

+};

+

+/// <summary>

+/// Word wrapping in multiline paragraph.

+/// </summary>

+enum DWRITE_WORD_WRAPPING

+{

+    /// <summary>

+    /// Words are broken across lines to avoid text overflowing the layout box.

+    /// </summary>

+    DWRITE_WORD_WRAPPING_WRAP,

+

+    /// <summary>

+    /// Words are kept within the same line even when it overflows the layout box.

+    /// This option is often used with scrolling to reveal overflow text. 

+    /// </summary>

+    DWRITE_WORD_WRAPPING_NO_WRAP

+};

+

+/// <summary>

+/// The method used for line spacing in layout.

+/// </summary>

+enum DWRITE_LINE_SPACING_METHOD

+{

+    /// <summary>

+    /// Line spacing depends solely on the content, growing to accomodate the size of fonts and inline objects.

+    /// </summary>

+    DWRITE_LINE_SPACING_METHOD_DEFAULT,

+

+    /// <summary>

+    /// Lines are explicitly set to uniform spacing, regardless of contained font sizes.

+    /// This can be useful to avoid the uneven appearance that can occur from font fallback.

+    /// </summary>

+    DWRITE_LINE_SPACING_METHOD_UNIFORM

+};

+

+/// <summary>

+/// Text granularity used to trim text overflowing the layout box.

+/// </summary>

+enum DWRITE_TRIMMING_GRANULARITY

+{

+    /// <summary>

+    /// No trimming occurs. Text flows beyond the layout width.

+    /// </summary>

+    DWRITE_TRIMMING_GRANULARITY_NONE,

+

+    /// <summary>

+    /// Trimming occurs at character cluster boundary.

+    /// </summary>

+    DWRITE_TRIMMING_GRANULARITY_CHARACTER,

+    

+    /// <summary>

+    /// Trimming occurs at word boundary.

+    /// </summary>

+    DWRITE_TRIMMING_GRANULARITY_WORD	

+};

+

+/// <summary>

+/// Typographic feature of text supplied by the font.

+/// </summary>

+enum DWRITE_FONT_FEATURE_TAG

+{

+    DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS               = 0x63726661, // 'afrc'

+    DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS       = 0x63703263, // 'c2pc'

+    DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS        = 0x63733263, // 'c2sc'

+    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES               = 0x746c6163, // 'calt'

+    DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS                = 0x65736163, // 'case'

+    DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION     = 0x706d6363, // 'ccmp'

+    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES                = 0x67696c63, // 'clig'

+    DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING                     = 0x70737063, // 'cpsp'

+    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH                    = 0x68777363, // 'cswh'

+    DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING                 = 0x73727563, // 'curs'

+    DWRITE_FONT_FEATURE_TAG_DEFAULT                             = 0x746c6664, // 'dflt'

+    DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES             = 0x67696c64, // 'dlig'

+    DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS                        = 0x74707865, // 'expt'

+    DWRITE_FONT_FEATURE_TAG_FRACTIONS                           = 0x63617266, // 'frac'

+    DWRITE_FONT_FEATURE_TAG_FULL_WIDTH                          = 0x64697766, // 'fwid'

+    DWRITE_FONT_FEATURE_TAG_HALF_FORMS                          = 0x666c6168, // 'half'

+    DWRITE_FONT_FEATURE_TAG_HALANT_FORMS                        = 0x6e6c6168, // 'haln'

+    DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH                = 0x746c6168, // 'halt'

+    DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS                    = 0x74736968, // 'hist'

+    DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES          = 0x616e6b68, // 'hkna'

+    DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES                = 0x67696c68, // 'hlig'

+    DWRITE_FONT_FEATURE_TAG_HALF_WIDTH                          = 0x64697768, // 'hwid'

+    DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS                    = 0x6f6a6f68, // 'hojo'

+    DWRITE_FONT_FEATURE_TAG_JIS04_FORMS                         = 0x3430706a, // 'jp04'

+    DWRITE_FONT_FEATURE_TAG_JIS78_FORMS                         = 0x3837706a, // 'jp78'

+    DWRITE_FONT_FEATURE_TAG_JIS83_FORMS                         = 0x3338706a, // 'jp83'

+    DWRITE_FONT_FEATURE_TAG_JIS90_FORMS                         = 0x3039706a, // 'jp90'

+    DWRITE_FONT_FEATURE_TAG_KERNING                             = 0x6e72656b, // 'kern'

+    DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES                  = 0x6167696c, // 'liga'

+    DWRITE_FONT_FEATURE_TAG_LINING_FIGURES                      = 0x6d756e6c, // 'lnum'

+    DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS                     = 0x6c636f6c, // 'locl'

+    DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING                    = 0x6b72616d, // 'mark'

+    DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK                  = 0x6b72676d, // 'mgrk'

+    DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING            = 0x6b6d6b6d, // 'mkmk'

+    DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS          = 0x746c616e, // 'nalt'

+    DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS                     = 0x6b636c6e, // 'nlck'

+    DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES                   = 0x6d756e6f, // 'onum'

+    DWRITE_FONT_FEATURE_TAG_ORDINALS                            = 0x6e64726f, // 'ordn'

+    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH        = 0x746c6170, // 'palt'

+    DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS                     = 0x70616370, // 'pcap'

+    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES                = 0x6d756e70, // 'pnum'

+    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS                 = 0x64697770, // 'pwid'

+    DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS                      = 0x64697771, // 'qwid'

+    DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES                  = 0x67696c72, // 'rlig'

+    DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS                 = 0x79627572, // 'ruby'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES                = 0x746c6173, // 'salt'

+    DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS                = 0x666e6973, // 'sinf'

+    DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS                      = 0x70636d73, // 'smcp'

+    DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS                    = 0x6c706d73, // 'smpl'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1                     = 0x31307373, // 'ss01'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2                     = 0x32307373, // 'ss02'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3                     = 0x33307373, // 'ss03'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4                     = 0x34307373, // 'ss04'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5                     = 0x35307373, // 'ss05'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6                     = 0x36307373, // 'ss06'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7                     = 0x37307373, // 'ss07'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8                     = 0x38307373, // 'ss08'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9                     = 0x39307373, // 'ss09'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10                    = 0x30317373, // 'ss10'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11                    = 0x31317373, // 'ss11'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12                    = 0x32317373, // 'ss12'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13                    = 0x33317373, // 'ss13'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14                    = 0x34317373, // 'ss14'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15                    = 0x35317373, // 'ss15'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16                    = 0x36317373, // 'ss16'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17                    = 0x37317373, // 'ss17'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18                    = 0x38317373, // 'ss18'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19                    = 0x39317373, // 'ss19'

+    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20                    = 0x30327373, // 'ss20'

+    DWRITE_FONT_FEATURE_TAG_SUBSCRIPT                           = 0x73627573, // 'subs'

+    DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT                         = 0x73707573, // 'sups'

+    DWRITE_FONT_FEATURE_TAG_SWASH                               = 0x68737773, // 'swsh'

+    DWRITE_FONT_FEATURE_TAG_TITLING                             = 0x6c746974, // 'titl'

+    DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS              = 0x6d616e74, // 'tnam'

+    DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES                     = 0x6d756e74, // 'tnum'

+    DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS                   = 0x64617274, // 'trad'

+    DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS                        = 0x64697774, // 'twid'

+    DWRITE_FONT_FEATURE_TAG_UNICASE                             = 0x63696e75, // 'unic'

+    DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO                        = 0x6f72657a, // 'zero'

+};

+

+/// <summary>

+/// The DWRITE_TEXT_RANGE structure specifies a range of text positions where format is applied.

+/// </summary>

+struct DWRITE_TEXT_RANGE

+{

+    /// <summary>

+    /// The start text position of the range.

+    /// </summary>

+    UINT32 startPosition;

+

+    /// <summary>

+    /// The number of text positions in the range.

+    /// </summary>

+    UINT32 length;

+};

+

+/// <summary>

+/// The DWRITE_FONT_FEATURE structure specifies properties used to identify and execute typographic feature in the font.

+/// </summary>

+struct DWRITE_FONT_FEATURE

+{

+    /// <summary>

+    /// The feature OpenType name identifier.

+    /// </summary>

+    DWRITE_FONT_FEATURE_TAG nameTag;

+

+    /// <summary>

+    /// Execution parameter of the feature.

+    /// </summary>

+    /// <remarks>

+    /// The parameter should be non-zero to enable the feature.  Once enabled, a feature can't be disabled again within

+    /// the same range.  Features requiring a selector use this value to indicate the selector index. 

+    /// </remarks>

+    UINT32 parameter;

+};

+

+/// <summary>

+/// Defines a set of typographic features to be applied during shaping.

+/// Notice the character range which this feature list spans is specified

+/// as a separate parameter to GetGlyphs.

+/// </summary>

+struct DWRITE_TYPOGRAPHIC_FEATURES

+{

+    /// <summary>

+    /// Array of font features.

+    /// </summary>

+    __field_ecount(featureCount) DWRITE_FONT_FEATURE* features;

+

+    /// <summary>

+    /// The number of features.

+    /// </summary>

+    UINT32 featureCount;

+};

+

+/// <summary>

+/// The DWRITE_TRIMMING structure specifies the trimming option for text overflowing the layout box.

+/// </summary>

+struct DWRITE_TRIMMING

+{

+    /// <summary>

+    /// Text granularity of which trimming applies.

+    /// </summary>

+    DWRITE_TRIMMING_GRANULARITY granularity;

+

+    /// <summary>

+    /// Character code used as the delimiter signaling the beginning of the portion of text to be preserved,

+    /// most useful for path ellipsis, where the delimeter would be a slash.

+    /// </summary>

+    UINT32 delimiter;

+

+    /// <summary>

+    /// How many occurences of the delimiter to step back.

+    /// </summary>

+    UINT32 delimiterCount;

+};

+

+

+interface IDWriteTypography;

+interface IDWriteInlineObject;

+

+/// <summary>

+/// The format of text used for text layout purpose.

+/// </summary>

+/// <remarks>

+/// This object may not be thread-safe and it may carry the state of text format change.

+/// </remarks>

+interface DWRITE_DECLARE_INTERFACE("9c906818-31d7-4fd3-a151-7c5e225db55a") IDWriteTextFormat : public IUnknown

+{

+    /// <summary>

+    /// Set alignment option of text relative to layout box's leading and trailing edge.

+    /// </summary>

+    /// <param name="textAlignment">Text alignment option</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetTextAlignment)(

+        DWRITE_TEXT_ALIGNMENT textAlignment

+        ) PURE;

+

+    /// <summary>

+    /// Set alignment option of paragraph relative to layout box's top and bottom edge.

+    /// </summary>

+    /// <param name="paragraphAlignment">Paragraph alignment option</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetParagraphAlignment)(

+        DWRITE_PARAGRAPH_ALIGNMENT paragraphAlignment

+        ) PURE;

+

+    /// <summary>

+    /// Set word wrapping option.

+    /// </summary>

+    /// <param name="wordWrapping">Word wrapping option</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetWordWrapping)(

+        DWRITE_WORD_WRAPPING wordWrapping

+        ) PURE;

+

+    /// <summary>

+    /// Set paragraph reading direction.

+    /// </summary>

+    /// <param name="readingDirection">Text reading direction</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetReadingDirection)(

+        DWRITE_READING_DIRECTION readingDirection

+        ) PURE;

+

+    /// <summary>

+    /// Set paragraph flow direction.

+    /// </summary>

+    /// <param name="flowDirection">Paragraph flow direction</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetFlowDirection)(

+        DWRITE_FLOW_DIRECTION flowDirection

+        ) PURE;

+

+    /// <summary>

+    /// Set incremental tab stop position.

+    /// </summary>

+    /// <param name="incrementalTabStop">The incremental tab stop value</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetIncrementalTabStop)(

+        FLOAT incrementalTabStop

+        ) PURE;

+

+    /// <summary>

+    /// Set trimming options for any trailing text exceeding the layout width

+    /// or for any far text exceeding the layout height.

+    /// </summary>

+    /// <param name="trimmingOptions">Text trimming options.</param>

+    /// <param name="trimmingSign">Application-defined omission sign. This parameter may be NULL if no trimming sign is desired.</param>

+    /// <remarks>

+    /// Any inline object can be used for the trimming sign, but CreateEllipsisTrimmingSign

+    /// provides a typical ellipsis symbol. Trimming is also useful vertically for hiding

+    /// partial lines.

+    /// </remarks>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetTrimming)(

+        __in DWRITE_TRIMMING const* trimmingOptions,

+        IDWriteInlineObject* trimmingSign

+        ) PURE;

+

+    /// <summary>

+    /// Set line spacing.

+    /// </summary>

+    /// <param name="lineSpacingMethod">How to determine line height.</param>

+    /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>

+    /// <param name="baseline">Distance from top of line to baseline. A reasonable ratio to lineSpacing is 80%.</param>

+    /// <remarks>

+    /// For the default method, spacing depends solely on the content.

+    /// For uniform spacing, the given line height will override the content.

+    /// </remarks>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetLineSpacing)(

+        DWRITE_LINE_SPACING_METHOD lineSpacingMethod,

+        FLOAT lineSpacing,

+        FLOAT baseline

+        ) PURE;

+

+    /// <summary>

+    /// Get alignment option of text relative to layout box's leading and trailing edge.

+    /// </summary>

+    STDMETHOD_(DWRITE_TEXT_ALIGNMENT, GetTextAlignment)() PURE;

+

+    /// <summary>

+    /// Get alignment option of paragraph relative to layout box's top and bottom edge.

+    /// </summary>

+    STDMETHOD_(DWRITE_PARAGRAPH_ALIGNMENT, GetParagraphAlignment)() PURE;

+

+    /// <summary>

+    /// Get word wrapping option.

+    /// </summary>

+    STDMETHOD_(DWRITE_WORD_WRAPPING, GetWordWrapping)() PURE;

+

+    /// <summary>

+    /// Get paragraph reading direction.

+    /// </summary>

+    STDMETHOD_(DWRITE_READING_DIRECTION, GetReadingDirection)() PURE;

+

+    /// <summary>

+    /// Get paragraph flow direction.

+    /// </summary>

+    STDMETHOD_(DWRITE_FLOW_DIRECTION, GetFlowDirection)() PURE;

+

+    /// <summary>

+    /// Get incremental tab stop position.

+    /// </summary>

+    STDMETHOD_(FLOAT, GetIncrementalTabStop)() PURE;

+

+    /// <summary>

+    /// Get trimming options for text overflowing the layout width.

+    /// </summary>

+    /// <param name="trimmingOptions">Text trimming options.</param>

+    /// <param name="trimmingSign">Trimming omission sign. This parameter may be NULL.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetTrimming)(

+        __out DWRITE_TRIMMING* trimmingOptions,

+        __out IDWriteInlineObject** trimmingSign

+        ) PURE;

+

+    /// <summary>

+    /// Get line spacing.

+    /// </summary>

+    /// <param name="lineSpacingMethod">How line height is determined.</param>

+    /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>

+    /// <param name="baseline">Distance from top of line to baseline.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetLineSpacing)(

+        __out DWRITE_LINE_SPACING_METHOD* lineSpacingMethod,

+        __out FLOAT* lineSpacing,

+        __out FLOAT* baseline

+        ) PURE;

+

+    /// <summary>

+    /// Get the font collection.

+    /// </summary>

+    /// <param name="fontCollection">The current font collection.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontCollection)(

+        __out IDWriteFontCollection** fontCollection

+        ) PURE;

+

+    /// <summary>

+    /// Get the length of the font family name, in characters, not including the terminating NULL character.

+    /// </summary>

+    STDMETHOD_(UINT32, GetFontFamilyNameLength)() PURE;

+

+    /// <summary>

+    /// Get a copy of the font family name.

+    /// </summary>

+    /// <param name="fontFamilyName">Character array that receives the current font family name</param>

+    /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontFamilyName)(

+        __out_ecount_z(nameSize) WCHAR* fontFamilyName,

+        UINT32 nameSize

+        ) PURE;

+

+    /// <summary>

+    /// Get the font weight.

+    /// </summary>

+    STDMETHOD_(DWRITE_FONT_WEIGHT, GetFontWeight)() PURE;

+

+    /// <summary>

+    /// Get the font style.

+    /// </summary>

+    STDMETHOD_(DWRITE_FONT_STYLE, GetFontStyle)() PURE;

+

+    /// <summary>

+    /// Get the font stretch.

+    /// </summary>

+    STDMETHOD_(DWRITE_FONT_STRETCH, GetFontStretch)() PURE;

+

+    /// <summary>

+    /// Get the font em height.

+    /// </summary>

+    STDMETHOD_(FLOAT, GetFontSize)() PURE;

+

+    /// <summary>

+    /// Get the length of the locale name, in characters, not including the terminating NULL character.

+    /// </summary>

+    STDMETHOD_(UINT32, GetLocaleNameLength)() PURE;

+

+    /// <summary>

+    /// Get a copy of the locale name.

+    /// </summary>

+    /// <param name="localeName">Character array that receives the current locale name</param>

+    /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetLocaleName)(

+        __out_ecount_z(nameSize) WCHAR* localeName,

+        UINT32 nameSize

+        ) PURE;

+};

+

+

+/// <summary>

+/// Font typography setting.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("55f1112b-1dc2-4b3c-9541-f46894ed85b6") IDWriteTypography : public IUnknown

+{

+    /// <summary>

+    /// Add font feature.

+    /// </summary>

+    /// <param name="fontFeature">The font feature to add.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(AddFontFeature)(

+        DWRITE_FONT_FEATURE fontFeature

+        ) PURE;

+

+    /// <summary>

+    /// Get the number of font features.

+    /// </summary>

+    STDMETHOD_(UINT32, GetFontFeatureCount)() PURE;

+

+    /// <summary>

+    /// Get the font feature at the specified index.

+    /// </summary>

+    /// <param name="fontFeatureIndex">The zero-based index of the font feature to get.</param>

+    /// <param name="fontFeature">The font feature.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontFeature)(

+        UINT32 fontFeatureIndex,

+        __out DWRITE_FONT_FEATURE* fontFeature

+        ) PURE;

+};

+

+enum DWRITE_SCRIPT_SHAPES

+{

+    /// <summary>

+    /// No additional shaping requirement. Text is shaped with the writing system default behavior.

+    /// </summary>

+    DWRITE_SCRIPT_SHAPES_DEFAULT = 0,

+

+    /// <summary>

+    /// Text should leave no visual on display i.e. control or format control characters.

+    /// </summary>

+    DWRITE_SCRIPT_SHAPES_NO_VISUAL = 1

+};

+

+#ifdef DEFINE_ENUM_FLAG_OPERATORS

+DEFINE_ENUM_FLAG_OPERATORS(DWRITE_SCRIPT_SHAPES);

+#endif

+

+/// <summary>

+/// Association of text and its writing system script as well as some display attributes.

+/// </summary>

+struct DWRITE_SCRIPT_ANALYSIS

+{

+    /// <summary>

+    /// Zero-based index representation of writing system script.

+    /// </summary>

+    UINT16 script;

+

+    /// <summary>

+    /// Additional shaping requirement of text.

+    /// </summary>

+    DWRITE_SCRIPT_SHAPES shapes;

+};

+

+/// <summary>

+/// Condition at the edges of inline object or text used to determine

+/// line-breaking behavior.

+/// </summary>

+enum DWRITE_BREAK_CONDITION

+{

+    /// <summary>

+    /// Whether a break is allowed is determined by the condition of the

+    /// neighboring text span or inline object.

+    /// </summary>

+    DWRITE_BREAK_CONDITION_NEUTRAL,

+

+    /// <summary>

+    /// A break is allowed, unless overruled by the condition of the

+    /// neighboring text span or inline object, either prohibited by a

+    /// May Not or forced by a Must.

+    /// </summary>

+    DWRITE_BREAK_CONDITION_CAN_BREAK,

+

+    /// <summary>

+    /// There should be no break, unless overruled by a Must condition from

+    /// the neighboring text span or inline object.

+    /// </summary>

+    DWRITE_BREAK_CONDITION_MAY_NOT_BREAK,

+

+    /// <summary>

+    /// The break must happen, regardless of the condition of the adjacent

+    /// text span or inline object.

+    /// </summary>

+    DWRITE_BREAK_CONDITION_MUST_BREAK

+};

+

+/// <summary>

+/// Line breakpoint characteristics of a character.

+/// </summary>

+struct DWRITE_LINE_BREAKPOINT

+{

+    /// <summary>

+    /// Breaking condition before the character.

+    /// </summary>

+    UINT8 breakConditionBefore  : 2;

+

+    /// <summary>

+    /// Breaking condition after the character.

+    /// </summary>

+    UINT8 breakConditionAfter   : 2;

+

+    /// <summary>

+    /// The character is some form of whitespace, which may be meaningful

+    /// for justification.

+    /// </summary>

+    UINT8 isWhitespace          : 1;

+

+    /// <summary>

+    /// The character is a soft hyphen, often used to indicate hyphenation

+    /// points inside words.

+    /// </summary>

+    UINT8 isSoftHyphen          : 1;

+

+    UINT8 padding               : 2;

+};

+

+/// <summary>

+/// How to apply number substitution on digits and related punctuation.

+/// </summary>

+enum DWRITE_NUMBER_SUBSTITUTION_METHOD

+{

+    /// <summary>

+    /// Specifies that the substitution method should be determined based

+    /// on LOCALE_IDIGITSUBSTITUTION value of the specified text culture.

+    /// </summary>

+    DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE,

+

+    /// <summary>

+    /// If the culture is Arabic or Farsi, specifies that the number shape

+    /// depend on the context. Either traditional or nominal number shape

+    /// are used depending on the nearest preceding strong character or (if

+    /// there is none) the reading direction of the paragraph.

+    /// </summary>

+    DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL,

+

+    /// <summary>

+    /// Specifies that code points 0x30-0x39 are always rendered as nominal numeral 

+    /// shapes (ones of the European number), i.e., no substitution is performed.

+    /// </summary>

+    DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE,

+

+    /// <summary>

+    /// Specifies that number are rendered using the national number shape 

+    /// as specified by the LOCALE_SNATIVEDIGITS value of the specified text culture.

+    /// </summary>

+    DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL,

+

+    /// <summary>

+    /// Specifies that number are rendered using the traditional shape

+    /// for the specified culture. For most cultures, this is the same as

+    /// NativeNational. However, NativeNational results in Latin number

+    /// for some Arabic cultures, whereas this value results in Arabic

+    /// number for all Arabic cultures.

+    /// </summary>

+    DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL

+};

+

+/// <summary>

+/// Holds the appropriate digits and numeric punctuation for a given locale.

+/// </summary>

+interface DECLSPEC_UUID("14885CC9-BAB0-4f90-B6ED-5C366A2CD03D") DECLSPEC_NOVTABLE IDWriteNumberSubstitution : public IUnknown

+{

+};

+

+/// <summary>

+/// Shaping output properties per input character.

+/// </summary>

+struct DWRITE_SHAPING_TEXT_PROPERTIES

+{

+    /// <summary>

+    /// This character can be shaped independently from the others

+    /// (usually set for the space character).

+    /// </summary>

+    UINT16  isShapedAlone       : 1;

+

+    /// <summary>

+    /// Reserved for use by shaping engine.

+    /// </summary>

+    UINT16  reserved            : 15;

+};

+

+/// <summary>

+/// Shaping output properties per output glyph.

+/// </summary>

+struct DWRITE_SHAPING_GLYPH_PROPERTIES

+{

+    /// <summary>

+    /// Justification class, whether to use spacing, kashidas, or

+    /// another method. This exists for backwards compatibility

+    /// with Uniscribe's SCRIPT_JUSTIFY enum.

+    /// </summary>

+    UINT16  justification       : 4;

+

+    /// <summary>

+    /// Indicates glyph is the first of a cluster.

+    /// </summary>

+    UINT16  isClusterStart      : 1;

+

+    /// <summary>

+    /// Glyph is a diacritic.

+    /// </summary>

+    UINT16  isDiacritic         : 1;

+

+    /// <summary>

+    /// Glyph has no width, blank, ZWJ, ZWNJ etc.

+    /// </summary>

+    UINT16  isZeroWidthSpace    : 1;

+

+    /// <summary>

+    /// Reserved for use by shaping engine.

+    /// </summary>

+    UINT16  reserved            : 9;

+};

+

+/// <summary>

+/// The interface implemented by the text analyzer's client to provide text to

+/// the analyzer. It allows the separation between the logical view of text as

+/// a continuous stream of characters identifiable by unique text positions,

+/// and the actual memory layout of potentially discrete blocks of text in the

+/// client's backing store.

+///

+/// If any of these callbacks returns an error, the analysis functions will

+/// stop prematurely and return a callback error. Rather than return E_NOTIMPL,

+/// an application should stub the method and return a constant/null and S_OK.

+/// </summary>

+interface DECLSPEC_UUID("688e1a58-5094-47c8-adc8-fbcea60ae92b") DECLSPEC_NOVTABLE IDWriteTextAnalysisSource : public IUnknown

+{

+    /// <summary>

+    /// Get a block of text starting at the specified text position.

+    /// Returning NULL indicates the end of text - the position is after

+    /// the last character. This function is called iteratively for

+    /// each consecutive block, tying together several fragmented blocks

+    /// in the backing store into a virtual contiguous string.

+    /// </summary>

+    /// <param name="textPosition">First position of the piece to obtain. All

+    ///     positions are in UTF16 code-units, not whole characters, which

+    ///     matters when supplementary characters are used.</param>

+    /// <param name="textString">Address that receives a pointer to the text block

+    ///     at the specified position.</param>

+    /// <param name="textLength">Number of UTF16 units of the retrieved chunk.

+    ///     The returned length is not the length of the block, but the length

+    ///     remaining in the block, from the given position until its end.

+    ///     So querying for a position that is 75 positions into a 100

+    ///     postition block would return 25.</param>

+    /// <returns>Pointer to the first character at the given text position.

+    /// NULL indicates no chunk available at the specified position, either

+    /// because textPosition >= the entire text content length or because the

+    /// queried position is not mapped into the app's backing store.</returns>

+    /// <remarks>

+    /// Although apps can implement sparse textual content that only maps part of

+    /// the backing store, the app must map any text that is in the range passed

+    /// to any analysis functions.

+    /// </remarks>

+    STDMETHOD(GetTextAtPosition)(

+        UINT32 textPosition,

+        __out WCHAR const** textString,

+        __out UINT32* textLength

+        ) PURE;

+

+    /// <summary>

+    /// Get a block of text immediately preceding the specified position.

+    /// </summary>

+    /// <param name="textPosition">Position immediately after the last position of the chunk to obtain.</param>

+    /// <param name="textString">Address that receives a pointer to the text block

+    ///     at the specified position.</param>

+    /// <param name="textLength">Number of UTF16 units of the retrieved block.

+    ///     The length returned is from the given position to the front of

+    ///     the block.</param>

+    /// <returns>Pointer to the first character at (textPosition - textLength).

+    /// NULL indicates no chunk available at the specified position, either

+    /// because textPosition == 0,the textPosition > the entire text content

+    /// length, or the queried position is not mapped into the app's backing

+    /// store.</returns>

+    /// <remarks>

+    /// Although apps can implement sparse textual content that only maps part of

+    /// the backing store, the app must map any text that is in the range passed

+    /// to any analysis functions.

+    /// </remarks>

+    STDMETHOD(GetTextBeforePosition)(

+        UINT32 textPosition,

+        __out WCHAR const** textString,

+        __out UINT32* textLength

+        ) PURE;

+

+    /// <summary>

+    /// Get paragraph reading direction.

+    /// </summary>

+    STDMETHOD_(DWRITE_READING_DIRECTION, GetParagraphReadingDirection)() PURE;

+

+    /// <summary>

+    /// Get locale name on the range affected by it.

+    /// </summary>

+    /// <param name="textPosition">Position to get the locale name of.</param>

+    /// <param name="textLength">Receives the length from the given position up to the

+    ///     next differing locale.</param>

+    /// <param name="localeName">Address that receives a pointer to the locale

+    ///     at the specified position.</param>

+    /// <remarks>

+    /// The localeName pointer must remain valid until the next call or until

+    /// the analysis returns.

+    /// </remarks>

+    STDMETHOD(GetLocaleName)(

+        UINT32 textPosition,

+        __out UINT32* textLength,

+        __out_z WCHAR const** localeName

+        ) PURE;

+

+    /// <summary>

+    /// Get number substitution on the range affected by it.

+    /// </summary>

+    /// <param name="textPosition">Position to get the number substitution of.</param>

+    /// <param name="textLength">Receives the length from the given position up to the

+    ///     next differing number substitution.</param>

+    /// <param name="numberSubstitution">Address that receives a pointer to the number substitution

+    ///     at the specified position.</param>

+    /// <remarks>

+    /// Any implementation should return the number substitution with an

+    /// incremented ref count, and the analysis will release when finished

+    /// with it (either before the next call or before it returns). However,

+    /// the sink callback may hold onto it after that.

+    /// </remarks>

+    STDMETHOD(GetNumberSubstitution)(

+        UINT32 textPosition,

+        __out UINT32* textLength,

+        __out IDWriteNumberSubstitution** numberSubstitution

+        ) PURE;

+};

+

+/// <summary>

+/// The interface implemented by the text analyzer's client to receive the

+/// output of a given text analysis. The Text analyzer disregards any current

+/// state of the analysis sink, therefore a Set method call on a range

+/// overwrites the previously set analysis result of the same range. 

+/// </summary>

+interface DECLSPEC_UUID("5810cd44-0ca0-4701-b3fa-bec5182ae4f6") DECLSPEC_NOVTABLE IDWriteTextAnalysisSink : public IUnknown

+{

+    /// <summary>

+    /// Report script analysis for the text range.

+    /// </summary>

+    /// <param name="textPosition">Starting position to report from.</param>

+    /// <param name="textLength">Number of UTF16 units of the reported range.</param>

+    /// <param name="scriptAnalysis">Script analysis of characters in range.</param>

+    /// <returns>

+    /// A successful code or error code to abort analysis.

+    /// </returns>

+    STDMETHOD(SetScriptAnalysis)(

+        UINT32 textPosition,

+        UINT32 textLength,

+        __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis

+        ) PURE;

+

+    /// <summary>

+    /// Repport line-break opportunities for each character, starting from

+    /// the specified position.

+    /// </summary>

+    /// <param name="textPosition">Starting position to report from.</param>

+    /// <param name="textLength">Number of UTF16 units of the reported range.</param>

+    /// <param name="lineBreakpoints">Breaking conditions for each character.</param>

+    /// <returns>

+    /// A successful code or error code to abort analysis.

+    /// </returns>

+    STDMETHOD(SetLineBreakpoints)(

+        UINT32 textPosition,

+        UINT32 textLength,

+        __in_ecount(textLength) DWRITE_LINE_BREAKPOINT const* lineBreakpoints

+        ) PURE;

+

+    /// <summary>

+    /// Set bidirectional level on the range, called once per each

+    /// level run change (either explicit or resolved implicit).

+    /// </summary>

+    /// <param name="textPosition">Starting position to report from.</param>

+    /// <param name="textLength">Number of UTF16 units of the reported range.</param>

+    /// <param name="explicitLevel">Explicit level from embedded control codes

+    ///     RLE/RLO/LRE/LRO/PDF, determined before any additional rules.</param>

+    /// <param name="resolvedLevel">Final implicit level considering the

+    ///     explicit level and characters' natural directionality, after all

+    ///     Bidi rules have been applied.</param>

+    /// <returns>

+    /// A successful code or error code to abort analysis.

+    /// </returns>

+    STDMETHOD(SetBidiLevel)(

+        UINT32 textPosition,

+        UINT32 textLength,

+        UINT8 explicitLevel,

+        UINT8 resolvedLevel

+        ) PURE;

+

+    /// <summary>

+    /// Set number substitution on the range.

+    /// </summary>

+    /// <param name="textPosition">Starting position to report from.</param>

+    /// <param name="textLength">Number of UTF16 units of the reported range.</param>

+    /// <param name="numberSubstitution">The number substitution applicable to

+    ///     the returned range of text. The sink callback may hold onto it by

+    ///     incrementing its ref count.</param>

+    /// <returns>

+    /// A successful code or error code to abort analysis.

+    /// </returns>

+    /// <remark>

+    /// Unlike script and bidi analysis, where every character passed to the

+    /// analyzer has a result, this will only be called for those ranges where

+    /// substitution is applicable. For any other range, you will simply not

+    /// be called.

+    /// </remark>

+    STDMETHOD(SetNumberSubstitution)(

+        UINT32 textPosition,

+        UINT32 textLength,

+        __notnull IDWriteNumberSubstitution* numberSubstitution

+        ) PURE;

+};

+

+/// <summary>

+/// Analyzes various text properties for complex script processing.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("b7e6163e-7f46-43b4-84b3-e4e6249c365d") IDWriteTextAnalyzer : public IUnknown

+{

+    /// <summary>

+    /// Analyzes a text range for script boundaries, reading text attributes

+    /// from the source and reporting the Unicode script ID to the sink 

+    /// callback SetScript.

+    /// </summary>

+    /// <param name="analysisSource">Source object to analyze.</param>

+    /// <param name="textPosition">Starting position within the source object.</param>

+    /// <param name="textLength">Length to analyze.</param>

+    /// <param name="analysisSink">Callback object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(AnalyzeScript)(

+        IDWriteTextAnalysisSource* analysisSource,

+        UINT32 textPosition,

+        UINT32 textLength,

+        IDWriteTextAnalysisSink* analysisSink

+        ) PURE;

+

+    /// <summary>

+    /// Analyzes a text range for script directionality, reading attributes

+    /// from the source and reporting levels to the sink callback SetBidiLevel.

+    /// </summary>

+    /// <param name="analysisSource">Source object to analyze.</param>

+    /// <param name="textPosition">Starting position within the source object.</param>

+    /// <param name="textLength">Length to analyze.</param>

+    /// <param name="analysisSink">Callback object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// While the function can handle multiple paragraphs, the text range

+    /// should not arbitrarily split the middle of paragraphs. Otherwise the

+    /// returned levels may be wrong, since the Bidi algorithm is meant to

+    /// apply to the paragraph as a whole.

+    /// </remarks>

+    /// <remarks>

+    /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.

+    /// </remarks>

+    STDMETHOD(AnalyzeBidi)(

+        IDWriteTextAnalysisSource* analysisSource,

+        UINT32 textPosition,

+        UINT32 textLength,

+        IDWriteTextAnalysisSink* analysisSink

+        ) PURE;

+

+    /// <summary>

+    /// Analyzes a text range for spans where number substitution is applicable,

+    /// reading attributes from the source and reporting substitutable ranges

+    /// to the sink callback SetNumberSubstitution.

+    /// </summary>

+    /// <param name="analysisSource">Source object to analyze.</param>

+    /// <param name="textPosition">Starting position within the source object.</param>

+    /// <param name="textLength">Length to analyze.</param>

+    /// <param name="analysisSink">Callback object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// While the function can handle multiple ranges of differing number

+    /// substitutions, the text ranges should not arbitrarily split the

+    /// middle of numbers. Otherwise it will treat the numbers separately

+    /// and will not translate any intervening punctuation.

+    /// </remarks>

+    /// <remarks>

+    /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.

+    /// </remarks>

+    STDMETHOD(AnalyzeNumberSubstitution)(

+        IDWriteTextAnalysisSource* analysisSource,

+        UINT32 textPosition,

+        UINT32 textLength,

+        IDWriteTextAnalysisSink* analysisSink

+        ) PURE;

+

+    /// <summary>

+    /// Analyzes a text range for potential breakpoint opportunities, reading

+    /// attributes from the source and reporting breakpoint opportunities to

+    /// the sink callback SetLineBreakpoints.

+    /// </summary>

+    /// <param name="analysisSource">Source object to analyze.</param>

+    /// <param name="textPosition">Starting position within the source object.</param>

+    /// <param name="textLength">Length to analyze.</param>

+    /// <param name="analysisSink">Callback object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// While the function can handle multiple paragraphs, the text range

+    /// should not arbitrarily split the middle of paragraphs, unless the

+    /// given text span is considered a whole unit. Otherwise the

+    /// returned properties for the first and last characters will

+    /// inappropriately allow breaks.

+    /// </remarks>

+    /// <remarks>

+    /// Special cases include the first, last, and surrogate characters. Any

+    /// text span is treated as if adjacent to inline objects on either side.

+    /// So the rules with contingent-break opportunities are used, where the 

+    /// edge between text and inline objects is always treated as a potential

+    /// break opportunity, dependent on any overriding rules of the adjacent

+    /// objects to prohibit or force the break (see Unicode TR #14).

+    /// Surrogate pairs never break between.

+    /// </remarks>

+    STDMETHOD(AnalyzeLineBreakpoints)(

+        IDWriteTextAnalysisSource* analysisSource,

+        UINT32 textPosition,

+        UINT32 textLength,

+        IDWriteTextAnalysisSink* analysisSink

+        ) PURE;

+

+    /// <summary>

+    /// Parses the input text string and maps it to the set of glyphs and associated glyph data

+    /// according to the font and the writing system's rendering rules.

+    /// </summary>

+    /// <param name="textString">The string to convert to glyphs.</param>

+    /// <param name="textLength">The length of textString.</param>

+    /// <param name="fontFace">The font face to get glyphs from.</param>

+    /// <param name="isSideways">Set to true if the text is intended to be

+    /// drawn vertically.</param>

+    /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>

+    /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>

+    /// <param name="localeName">The locale to use when selecting glyphs.

+    /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.

+    /// If this is NULL then the default mapping based on the script is used.</param>

+    /// <param name="numberSubstitution">Optional number substitution which

+    /// selects the appropriate glyphs for digits and related numeric characters,

+    /// depending on the results obtained from AnalyzeNumberSubstitution. Passing

+    /// null indicates that no substitution is needed and that the digits should

+    /// receive nominal glyphs.</param>

+    /// <param name="features">An array of pointers to the sets of typographic 

+    /// features to use in each feature range.</param>

+    /// <param name="featureRangeLengths">The length of each feature range, in characters.  

+    /// The sum of all lengths should be equal to textLength.</param>

+    /// <param name="featureRanges">The number of feature ranges.</param>

+    /// <param name="maxGlyphCount">The maximum number of glyphs that can be

+    /// returned.</param>

+    /// <param name="clusterMap">The mapping from character ranges to glyph 

+    /// ranges.</param>

+    /// <param name="textProps">Per-character output properties.</param>

+    /// <param name="glyphIndices">Output glyph indices.</param>

+    /// <param name="glyphProps">Per-glyph output properties.</param>

+    /// <param name="actualGlyphCount">The actual number of glyphs returned if

+    /// the call succeeds.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// Note that the mapping from characters to glyphs is, in general, many-

+    /// to-many.  The recommended estimate for the per-glyph output buffers is

+    /// (3 * textLength / 2 + 16).  This is not guaranteed to be sufficient.

+    ///

+    /// The value of the actualGlyphCount parameter is only valid if the call

+    /// succeeds.  In the event that maxGlyphCount is not big enough

+    /// E_NOT_SUFFICIENT_BUFFER, which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),

+    /// will be returned.  The application should allocate a larger buffer and try again.

+    /// </remarks>

+    STDMETHOD(GetGlyphs)(

+        __in_ecount(textLength) WCHAR const* textString,

+        UINT32 textLength,

+        IDWriteFontFace* fontFace,

+        BOOL isSideways,

+        BOOL isRightToLeft,

+        __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,

+        __in_z_opt WCHAR const* localeName,

+        __maybenull IDWriteNumberSubstitution* numberSubstitution,

+        __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,

+        __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,

+        UINT32 featureRanges,

+        UINT32 maxGlyphCount,

+        __out_ecount(textLength) UINT16* clusterMap,

+        __out_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,

+        __out_ecount(maxGlyphCount) UINT16* glyphIndices,

+        __out_ecount(maxGlyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProps,

+        __out UINT32* actualGlyphCount

+        ) PURE;

+

+    /// <summary>

+    /// Place glyphs output from the GetGlyphs method according to the font 

+    /// and the writing system's rendering rules.

+    /// </summary>

+    /// <param name="textString">The original string the glyphs came from.</param>

+    /// <param name="clusterMap">The mapping from character ranges to glyph 

+    /// ranges. Returned by GetGlyphs.</param>

+    /// <param name="textProps">Per-character properties. Returned by 

+    /// GetGlyphs.</param>

+    /// <param name="textLength">The length of textString.</param>

+    /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>

+    /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>

+    /// <param name="glyphCount">The number of glyphs.</param>

+    /// <param name="fontFace">The font face the glyphs came from.</param>

+    /// <param name="fontEmSize">Logical font size in DIP's.</param>

+    /// <param name="isSideways">Set to true if the text is intended to be

+    /// drawn vertically.</param>

+    /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>

+    /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>

+    /// <param name="localeName">The locale to use when selecting glyphs.

+    /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.

+    /// If this is NULL then the default mapping based on the script is used.</param>

+    /// <param name="features">An array of pointers to the sets of typographic 

+    /// features to use in each feature range.</param>

+    /// <param name="featureRangeLengths">The length of each feature range, in characters.  

+    /// The sum of all lengths should be equal to textLength.</param>

+    /// <param name="featureRanges">The number of feature ranges.</param>

+    /// <param name="glyphAdvances">The advance width of each glyph.</param>

+    /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetGlyphPlacements)(

+        __in_ecount(textLength) WCHAR const* textString,

+        __in_ecount(textLength) UINT16 const* clusterMap,

+        __in_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,

+        UINT32 textLength,

+        __in_ecount(glyphCount) UINT16 const* glyphIndices,

+        __in_ecount(glyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,

+        UINT32 glyphCount,

+        IDWriteFontFace * fontFace,

+        FLOAT fontEmSize,

+        BOOL isSideways,

+        BOOL isRightToLeft,

+        __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,

+        __in_z_opt WCHAR const* localeName,

+        __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,

+        __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,

+        UINT32 featureRanges,

+        __out_ecount(glyphCount) FLOAT* glyphAdvances,

+        __out_ecount(glyphCount) DWRITE_GLYPH_OFFSET* glyphOffsets

+        ) PURE;

+

+    /// <summary>

+    /// Place glyphs output from the GetGlyphs method according to the font 

+    /// and the writing system's rendering rules.

+    /// </summary>

+    /// <param name="textString">The original string the glyphs came from.</param>

+    /// <param name="clusterMap">The mapping from character ranges to glyph 

+    /// ranges. Returned by GetGlyphs.</param>

+    /// <param name="textProps">Per-character properties. Returned by 

+    /// GetGlyphs.</param>

+    /// <param name="textLength">The length of textString.</param>

+    /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>

+    /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>

+    /// <param name="glyphCount">The number of glyphs.</param>

+    /// <param name="fontFace">The font face the glyphs came from.</param>

+    /// <param name="fontEmSize">Logical font size in DIP's.</param>

+    /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this 

+    /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>

+    /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the

+    /// scaling specified by the font size and pixelsPerDip.</param>

+    /// <param name="useGdiNatural">

+    /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.

+    /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font

+    /// created with CLEARTYPE_NATURAL_QUALITY.

+    /// </param>

+    /// <param name="isSideways">Set to true if the text is intended to be

+    /// drawn vertically.</param>

+    /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>

+    /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>

+    /// <param name="localeName">The locale to use when selecting glyphs.

+    /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.

+    /// If this is NULL then the default mapping based on the script is used.</param>

+    /// <param name="features">An array of pointers to the sets of typographic 

+    /// features to use in each feature range.</param>

+    /// <param name="featureRangeLengths">The length of each feature range, in characters.  

+    /// The sum of all lengths should be equal to textLength.</param>

+    /// <param name="featureRanges">The number of feature ranges.</param>

+    /// <param name="glyphAdvances">The advance width of each glyph.</param>

+    /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetGdiCompatibleGlyphPlacements)(

+        __in_ecount(textLength) WCHAR const* textString,

+        __in_ecount(textLength) UINT16 const* clusterMap,

+        __in_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,

+        UINT32 textLength,

+        __in_ecount(glyphCount) UINT16 const* glyphIndices,

+        __in_ecount(glyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,

+        UINT32 glyphCount,

+        IDWriteFontFace * fontFace,

+        FLOAT fontEmSize,

+        FLOAT pixelsPerDip,

+        __in_opt DWRITE_MATRIX const* transform,

+        BOOL useGdiNatural,

+        BOOL isSideways,

+        BOOL isRightToLeft,

+        __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,

+        __in_z_opt WCHAR const* localeName,

+        __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,

+        __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,

+        UINT32 featureRanges,

+        __out_ecount(glyphCount) FLOAT* glyphAdvances,

+        __out_ecount(glyphCount) DWRITE_GLYPH_OFFSET* glyphOffsets

+        ) PURE;

+};

+

+/// <summary>

+/// The DWRITE_GLYPH_RUN structure contains the information needed by renderers

+/// to draw glyph runs. All coordinates are in device independent pixels (DIPs).

+/// </summary>

+struct DWRITE_GLYPH_RUN

+{

+    /// <summary>

+    /// The physical font face to draw with.

+    /// </summary>

+    __notnull IDWriteFontFace* fontFace;

+

+    /// <summary>

+    /// Logical size of the font in DIPs, not points (equals 1/96 inch).

+    /// </summary>

+    FLOAT fontEmSize;

+

+    /// <summary>

+    /// The number of glyphs.

+    /// </summary>

+    UINT32 glyphCount;

+

+    /// <summary>

+    /// The indices to render.

+    /// </summary>    

+    __field_ecount(glyphCount) UINT16 const* glyphIndices;

+

+    /// <summary>

+    /// Glyph advance widths.

+    /// </summary>

+    __field_ecount_opt(glyphCount) FLOAT const* glyphAdvances;

+

+    /// <summary>

+    /// Glyph offsets.

+    /// </summary>

+    __field_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets;

+

+    /// <summary>

+    /// If true, specifies that glyphs are rotated 90 degrees to the left and

+    /// vertical metrics are used. Vertical writing is achieved by specifying

+    /// isSideways = true and rotating the entire run 90 degrees to the right

+    /// via a rotate transform.

+    /// </summary>

+    BOOL isSideways;

+

+    /// <summary>

+    /// The implicit resolved bidi level of the run. Odd levels indicate

+    /// right-to-left languages like Hebrew and Arabic, while even levels

+    /// indicate left-to-right languages like English and Japanese (when

+    /// written horizontally). For right-to-left languages, the text origin

+    /// is on the right, and text should be drawn to the left.

+    /// </summary>

+    UINT32 bidiLevel;

+};

+

+/// <summary>

+/// The DWRITE_GLYPH_RUN_DESCRIPTION structure contains additional properties

+/// related to those in DWRITE_GLYPH_RUN.

+/// </summary>

+struct DWRITE_GLYPH_RUN_DESCRIPTION

+{

+    /// <summary>

+    /// The locale name associated with this run.

+    /// </summary>

+    __nullterminated WCHAR const* localeName;

+

+    /// <summary>

+    /// The text associated with the glyphs.

+    /// </summary>

+    __field_ecount(stringLength) WCHAR const* string;

+

+    /// <summary>

+    /// The number of characters (UTF16 code-units).

+    /// Note that this may be different than the number of glyphs.

+    /// </summary>

+    UINT32 stringLength;

+

+    /// <summary>

+    /// An array of indices to the glyph indices array, of the first glyphs of

+    /// all the glyph clusters of the glyphs to render. 

+    /// </summary>

+    __field_ecount(stringLength) UINT16 const* clusterMap;

+

+    /// <summary>

+    /// Corresponding text position in the original string

+    /// this glyph run came from.

+    /// </summary>

+    UINT32 textPosition;

+};

+

+/// <summary>

+/// The DWRITE_UNDERLINE structure contains about the size and placement of 

+/// underlines. All coordinates are in device independent pixels (DIPs).

+/// </summary>

+struct DWRITE_UNDERLINE

+{

+    /// <summary>

+    /// Width of the underline, measured parallel to the baseline.

+    /// </summary>

+    FLOAT width;

+

+    /// <summary>

+    /// Thickness of the underline, measured perpendicular to the

+    /// baseline.

+    /// </summary>

+    FLOAT thickness;

+

+    /// <summary>

+    /// Offset of the underline from the baseline.

+    /// A positive offset represents a position below the baseline and

+    /// a negative offset is above.

+    /// </summary>

+    FLOAT offset;

+

+    /// <summary>

+    /// Height of the tallest run where the underline applies.

+    /// </summary>

+    FLOAT runHeight;

+

+    /// <summary>

+    /// Reading direction of the text associated with the underline.  This 

+    /// value is used to interpret whether the width value runs horizontally 

+    /// or vertically.

+    /// </summary>

+    DWRITE_READING_DIRECTION readingDirection;

+

+    /// <summary>

+    /// Flow direction of the text associated with the underline.  This value

+    /// is used to interpret whether the thickness value advances top to 

+    /// bottom, left to right, or right to left.

+    /// </summary>

+    DWRITE_FLOW_DIRECTION flowDirection;

+

+    /// <summary>

+    /// Locale of the text the underline is being drawn under. Can be

+    /// pertinent where the locale affects how the underline is drawn.

+    /// For example, in vertical text, the underline belongs on the

+    /// left for Chinese but on the right for Japanese.

+    /// This choice is completely left up to higher levels.

+    /// </summary>

+    __nullterminated WCHAR const* localeName;

+

+    /// <summary>

+    /// The measuring mode can be useful to the renderer to determine how

+    /// underlines are rendered, e.g. rounding the thickness to a whole pixel

+    /// in GDI-compatible modes.

+    /// </summary>

+    DWRITE_MEASURING_MODE measuringMode;

+};

+

+/// <summary>

+/// The DWRITE_STRIKETHROUGH structure contains about the size and placement of 

+/// strickthroughs. All coordinates are in device independent pixels (DIPs).

+/// </summary>

+struct DWRITE_STRIKETHROUGH

+{

+    /// <summary>

+    /// Width of the strikethrough, measured parallel to the baseline.

+    /// </summary>

+    FLOAT width;

+

+    /// <summary>

+    /// Thickness of the strikethrough, measured perpendicular to the

+    /// baseline.

+    /// </summary>

+    FLOAT thickness;

+

+    /// <summary>

+    /// Offset of the stikethrough from the baseline.

+    /// A positive offset represents a position below the baseline and

+    /// a negative offset is above.

+    /// </summary>

+    FLOAT offset;

+

+    /// <summary>

+    /// Reading direction of the text associated with the strikethrough.  This

+    /// value is used to interpret whether the width value runs horizontally 

+    /// or vertically.

+    /// </summary>

+    DWRITE_READING_DIRECTION readingDirection;

+

+    /// <summary>

+    /// Flow direction of the text associated with the strikethrough.  This 

+    /// value is used to interpret whether the thickness value advances top to

+    /// bottom, left to right, or right to left.

+    /// </summary>

+    DWRITE_FLOW_DIRECTION flowDirection;

+

+    /// <summary>

+    /// Locale of the range. Can be pertinent where the locale affects the style.

+    /// </summary>

+    __nullterminated WCHAR const* localeName;

+

+    /// <summary>

+    /// The measuring mode can be useful to the renderer to determine how

+    /// underlines are rendered, e.g. rounding the thickness to a whole pixel

+    /// in GDI-compatible modes.

+    /// </summary>

+    DWRITE_MEASURING_MODE measuringMode;

+};

+

+/// <summary>

+/// The DWRITE_LINE_METRICS structure contains information about a formatted

+/// line of text.

+/// </summary>

+struct DWRITE_LINE_METRICS

+{

+    /// <summary>

+    /// The number of total text positions in the line.

+    /// This includes any trailing whitespace and newline characters.

+    /// </summary>

+    UINT32 length;

+

+    /// <summary>

+    /// The number of whitespace positions at the end of the line.  Newline

+    /// sequences are considered whitespace.

+    /// </summary>

+    UINT32 trailingWhitespaceLength;

+

+    /// <summary>

+    /// The number of characters in the newline sequence at the end of the line.

+    /// If the count is zero, then the line was either wrapped or it is the

+    /// end of the text.

+    /// </summary>

+    UINT32 newlineLength;

+

+    /// <summary>

+    /// Height of the line as measured from top to bottom.

+    /// </summary>

+    FLOAT height;

+

+    /// <summary>

+    /// Distance from the top of the line to its baseline.

+    /// </summary>

+    FLOAT baseline;

+

+    /// <summary>

+    /// The line is trimmed.

+    /// </summary>

+    BOOL isTrimmed;

+};

+

+

+/// <summary>

+/// The DWRITE_CLUSTER_METRICS structure contains information about a glyph cluster.

+/// </summary>

+struct DWRITE_CLUSTER_METRICS

+{

+    /// <summary>

+    /// The total advance width of all glyphs in the cluster.

+    /// </summary>

+    FLOAT width;

+

+    /// <summary>

+    /// The number of text positions in the cluster.

+    /// </summary>

+    UINT16 length;

+

+    /// <summary>

+    /// Indicate whether line can be broken right after the cluster.

+    /// </summary>

+    UINT16 canWrapLineAfter : 1;

+

+    /// <summary>

+    /// Indicate whether the cluster corresponds to whitespace character.

+    /// </summary>

+    UINT16 isWhitespace : 1;

+

+    /// <summary>

+    /// Indicate whether the cluster corresponds to a newline character.

+    /// </summary>

+    UINT16 isNewline : 1;

+

+    /// <summary>

+    /// Indicate whether the cluster corresponds to soft hyphen character.

+    /// </summary>

+    UINT16 isSoftHyphen : 1;

+

+    /// <summary>

+    /// Indicate whether the cluster is read from right to left.

+    /// </summary>

+    UINT16 isRightToLeft : 1;

+

+    UINT16 padding : 11;

+};

+

+

+/// <summary>

+/// Overall metrics associated with text after layout.

+/// All coordinates are in device independent pixels (DIPs).

+/// </summary>

+struct DWRITE_TEXT_METRICS

+{

+    /// <summary>

+    /// Left-most point of formatted text relative to layout box

+    /// (excluding any glyph overhang).

+    /// </summary>

+    FLOAT left;

+

+    /// <summary>

+    /// Top-most point of formatted text relative to layout box

+    /// (excluding any glyph overhang).

+    /// </summary>

+    FLOAT top;

+

+    /// <summary>

+    /// The width of the formatted text ignoring trailing whitespace

+    /// at the end of each line.

+    /// </summary>

+    FLOAT width;

+

+    /// <summary>

+    /// The width of the formatted text taking into account the

+    /// trailing whitespace at the end of each line.

+    /// </summary>

+    FLOAT widthIncludingTrailingWhitespace;

+

+    /// <summary>

+    /// The height of the formatted text. The height of an empty string

+    /// is determined by the size of the default font's line height.

+    /// </summary>

+    FLOAT height;

+

+    /// <summary>

+    /// Initial width given to the layout. Depending on whether the text

+    /// was wrapped or not, it can be either larger or smaller than the

+    /// text content width.

+    /// </summary>

+    FLOAT layoutWidth;

+

+    /// <summary>

+    /// Initial height given to the layout. Depending on the length of the

+    /// text, it may be larger or smaller than the text content height.

+    /// </summary>

+    FLOAT layoutHeight;

+

+    /// <summary>

+    /// The maximum reordering count of any line of text, used

+    /// to calculate the most number of hit-testing boxes needed.

+    /// If the layout has no bidirectional text or no text at all,

+    /// the minimum level is 1.

+    /// </summary>

+    UINT32 maxBidiReorderingDepth;

+

+    /// <summary>

+    /// Total number of lines.

+    /// </summary>

+    UINT32 lineCount;

+};

+

+

+/// <summary>

+/// Properties describing the geometric measurement of an

+/// application-defined inline object.

+/// </summary>

+struct DWRITE_INLINE_OBJECT_METRICS

+{

+    /// <summary>

+    /// Width of the inline object.

+    /// </summary>

+    FLOAT width;

+

+    /// <summary>

+    /// Height of the inline object as measured from top to bottom.

+    /// </summary>

+    FLOAT height;

+

+    /// <summary>

+    /// Distance from the top of the object to the baseline where it is lined up with the adjacent text.

+    /// If the baseline is at the bottom, baseline simply equals height.

+    /// </summary>

+    FLOAT baseline;

+

+    /// <summary>

+    /// Flag indicating whether the object is to be placed upright or alongside the text baseline

+    /// for vertical text.

+    /// </summary>

+    BOOL  supportsSideways;

+};

+

+

+/// <summary>

+/// The DWRITE_OVERHANG_METRICS structure holds how much any visible pixels

+/// (in DIPs) overshoot each side of the layout or inline objects.

+/// </summary>

+/// <remarks>

+/// Positive overhangs indicate that the visible area extends outside the layout

+/// box or inline object, while negative values mean there is whitespace inside.

+/// The returned values are unaffected by rendering transforms or pixel snapping.

+/// Additionally, they may not exactly match final target's pixel bounds after

+/// applying grid fitting and hinting.

+/// </remarks>

+struct DWRITE_OVERHANG_METRICS

+{

+    /// <summary>

+    /// The distance from the left-most visible DIP to its left alignment edge.

+    /// </summary>

+    FLOAT left;

+

+    /// <summary>

+    /// The distance from the top-most visible DIP to its top alignment edge.

+    /// </summary>

+    FLOAT top;

+

+    /// <summary>

+    /// The distance from the right-most visible DIP to its right alignment edge.

+    /// </summary>

+    FLOAT right;

+

+    /// <summary>

+    /// The distance from the bottom-most visible DIP to its bottom alignment edge.

+    /// </summary>

+    FLOAT bottom;

+};

+

+

+/// <summary>

+/// Geometry enclosing of text positions.

+/// </summary>

+struct DWRITE_HIT_TEST_METRICS

+{

+    /// <summary>

+    /// First text position within the geometry.

+    /// </summary>

+    UINT32 textPosition;

+

+    /// <summary>

+    /// Number of text positions within the geometry.

+    /// </summary>

+    UINT32 length;

+

+    /// <summary>

+    /// Left position of the top-left coordinate of the geometry.

+    /// </summary>

+    FLOAT left;

+

+    /// <summary>

+    /// Top position of the top-left coordinate of the geometry.

+    /// </summary>

+    FLOAT top;

+

+    /// <summary>

+    /// Geometry's width.

+    /// </summary>

+    FLOAT width;

+

+    /// <summary>

+    /// Geometry's height.

+    /// </summary>

+    FLOAT height;

+

+    /// <summary>

+    /// Bidi level of text positions enclosed within the geometry.

+    /// </summary>

+    UINT32 bidiLevel;

+

+    /// <summary>

+    /// Geometry encloses text?

+    /// </summary>

+    BOOL isText;

+

+    /// <summary>

+    /// Range is trimmed.

+    /// </summary>

+    BOOL isTrimmed;

+};

+

+

+interface IDWriteTextRenderer;

+

+

+/// <summary>

+/// The IDWriteInlineObject interface wraps an application defined inline graphic,

+/// allowing DWrite to query metrics as if it was a glyph inline with the text.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("8339FDE3-106F-47ab-8373-1C6295EB10B3") IDWriteInlineObject : public IUnknown

+{

+    /// <summary>

+    /// The application implemented rendering callback (IDWriteTextRenderer::DrawInlineObject)

+    /// can use this to draw the inline object without needing to cast or query the object

+    /// type. The text layout does not call this method directly.

+    /// </summary>

+    /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>

+    /// <param name="renderer">The renderer passed to IDWriteTextLayout::Draw as the object's containing parent.</param>

+    /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>

+    /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>

+    /// <param name="isSideways">The object should be drawn on its side.</param>

+    /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>

+    /// <param name="clientDrawingEffect">The drawing effect set in IDWriteTextLayout::SetDrawingEffect.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(Draw)(

+        __maybenull void* clientDrawingContext,

+        IDWriteTextRenderer* renderer,

+        FLOAT originX,

+        FLOAT originY,

+        BOOL isSideways,

+        BOOL isRightToLeft,

+        __maybenull IUnknown* clientDrawingEffect

+        ) PURE;

+

+    /// <summary>

+    /// TextLayout calls this callback function to get the measurement of the inline object.

+    /// </summary>

+    /// <param name="metrics">Returned metrics</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetMetrics)(

+        __out DWRITE_INLINE_OBJECT_METRICS* metrics

+        ) PURE;

+

+    /// <summary>

+    /// TextLayout calls this callback function to get the visible extents (in DIPs) of the inline object.

+    /// In the case of a simple bitmap, with no padding and no overhang, all the overhangs will

+    /// simply be zeroes.

+    /// </summary>

+    /// <param name="overhangs">Overshoot of visible extents (in DIPs) outside the object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// The overhangs should be returned relative to the reported size of the object

+    /// (DWRITE_INLINE_OBJECT_METRICS::width/height), and should not be baseline

+    /// adjusted. If you have an image that is actually 100x100 DIPs, but you want it

+    /// slightly inset (perhaps it has a glow) by 20 DIPs on each side, you would

+    /// return a width/height of 60x60 and four overhangs of 20 DIPs.

+    /// </remarks>

+    STDMETHOD(GetOverhangMetrics)(

+        __out DWRITE_OVERHANG_METRICS* overhangs

+        ) PURE;

+

+    /// <summary>

+    /// Layout uses this to determine the line breaking behavior of the inline object

+    /// amidst the text.

+    /// </summary>

+    /// <param name="breakConditionBefore">Line-breaking condition between the object and the content immediately preceding it.</param>

+    /// <param name="breakConditionAfter" >Line-breaking condition between the object and the content immediately following it.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetBreakConditions)(

+        __out DWRITE_BREAK_CONDITION* breakConditionBefore,

+        __out DWRITE_BREAK_CONDITION* breakConditionAfter

+        ) PURE;

+};

+

+/// <summary>

+/// The IDWritePixelSnapping interface defines the pixel snapping properties of a text renderer.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("eaf3a2da-ecf4-4d24-b644-b34f6842024b") IDWritePixelSnapping : public IUnknown

+{

+    /// <summary>

+    /// Determines whether pixel snapping is disabled. The recommended default is FALSE,

+    /// unless doing animation that requires subpixel vertical placement.

+    /// </summary>

+    /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>

+    /// <param name="isDisabled">Receives TRUE if pixel snapping is disabled or FALSE if it not.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(IsPixelSnappingDisabled)(

+        __maybenull void* clientDrawingContext,

+        __out BOOL* isDisabled

+        ) PURE;

+

+    /// <summary>

+    /// Gets the current transform that maps abstract coordinates to DIPs,

+    /// which may disable pixel snapping upon any rotation or shear.

+    /// </summary>

+    /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>

+    /// <param name="transform">Receives the transform.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetCurrentTransform)(

+        __maybenull void* clientDrawingContext,

+        __out DWRITE_MATRIX* transform

+        ) PURE;

+

+    /// <summary>

+    /// Gets the number of physical pixels per DIP. A DIP (device-independent pixel) is 1/96 inch,

+    /// so the pixelsPerDip value is the number of logical pixels per inch divided by 96 (yielding

+    /// a value of 1 for 96 DPI and 1.25 for 120).

+    /// </summary>

+    /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>

+    /// <param name="pixelsPerDip">Receives the number of physical pixels per DIP.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetPixelsPerDip)(

+        __maybenull void* clientDrawingContext,

+        __out FLOAT* pixelsPerDip

+        ) PURE;

+};

+

+/// <summary>

+/// The IDWriteTextLayout interface represents a set of application-defined

+/// callbacks that perform rendering of text, inline objects, and decorations

+/// such as underlines.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("ef8a8135-5cc6-45fe-8825-c5a0724eb819") IDWriteTextRenderer : public IDWritePixelSnapping

+{

+    /// <summary>

+    /// IDWriteTextLayout::Draw calls this function to instruct the client to

+    /// render a run of glyphs.

+    /// </summary>

+    /// <param name="clientDrawingContext">The context passed to 

+    /// IDWriteTextLayout::Draw.</param>

+    /// <param name="baselineOriginX">X-coordinate of the baseline.</param>

+    /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>

+    /// <param name="measuringMode">Specifies measuring method for glyphs in the run.

+    /// Renderer implementations may choose different rendering modes for given measuring methods,

+    /// but best results are seen when the rendering mode matches the corresponding measuring mode:

+    /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL

+    /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC

+    /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL

+    /// </param>

+    /// <param name="glyphRun">The glyph run to draw.</param>

+    /// <param name="glyphRunDescription">Properties of the characters 

+    /// associated with this run.</param>

+    /// <param name="clientDrawingEffect">The drawing effect set in

+    /// IDWriteTextLayout::SetDrawingEffect.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(DrawGlyphRun)(

+        __maybenull void* clientDrawingContext,

+        FLOAT baselineOriginX,

+        FLOAT baselineOriginY,

+        DWRITE_MEASURING_MODE measuringMode,

+        __in DWRITE_GLYPH_RUN const* glyphRun,

+        __in DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,

+        __maybenull IUnknown* clientDrawingEffect

+        ) PURE;

+

+    /// <summary>

+    /// IDWriteTextLayout::Draw calls this function to instruct the client to draw

+    /// an underline.

+    /// </summary>

+    /// <param name="clientDrawingContext">The context passed to 

+    /// IDWriteTextLayout::Draw.</param>

+    /// <param name="baselineOriginX">X-coordinate of the baseline.</param>

+    /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>

+    /// <param name="underline">Underline logical information.</param>

+    /// <param name="clientDrawingEffect">The drawing effect set in

+    /// IDWriteTextLayout::SetDrawingEffect.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// A single underline can be broken into multiple calls, depending on

+    /// how the formatting changes attributes. If font sizes/styles change

+    /// within an underline, the thickness and offset will be averaged

+    /// weighted according to characters.

+    /// To get the correct top coordinate of the underline rect, add underline::offset

+    /// to the baseline's Y. Otherwise the underline will be immediately under the text.

+    /// The x coordinate will always be passed as the left side, regardless

+    /// of text directionality. This simplifies drawing and reduces the

+    /// problem of round-off that could potentially cause gaps or a double

+    /// stamped alpha blend. To avoid alpha overlap, round the end points

+    /// to the nearest device pixel.

+    /// </remarks>

+    STDMETHOD(DrawUnderline)(

+        __maybenull void* clientDrawingContext,

+        FLOAT baselineOriginX,

+        FLOAT baselineOriginY,

+        __in DWRITE_UNDERLINE const* underline,

+        __maybenull IUnknown* clientDrawingEffect

+        ) PURE;

+

+    /// <summary>

+    /// IDWriteTextLayout::Draw calls this function to instruct the client to draw

+    /// a strikethrough.

+    /// </summary>

+    /// <param name="clientDrawingContext">The context passed to 

+    /// IDWriteTextLayout::Draw.</param>

+    /// <param name="baselineOriginX">X-coordinate of the baseline.</param>

+    /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>

+    /// <param name="strikethrough">Strikethrough logical information.</param>

+    /// <param name="clientDrawingEffect">The drawing effect set in

+    /// IDWriteTextLayout::SetDrawingEffect.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// A single strikethrough can be broken into multiple calls, depending on

+    /// how the formatting changes attributes. Strikethrough is not averaged

+    /// across font sizes/styles changes.

+    /// To get the correct top coordinate of the strikethrough rect,

+    /// add strikethrough::offset to the baseline's Y.

+    /// Like underlines, the x coordinate will always be passed as the left side,

+    /// regardless of text directionality.

+    /// </remarks>

+    STDMETHOD(DrawStrikethrough)(

+        __maybenull void* clientDrawingContext,

+        FLOAT baselineOriginX,

+        FLOAT baselineOriginY,

+        __in DWRITE_STRIKETHROUGH const* strikethrough,

+        __maybenull IUnknown* clientDrawingEffect

+        ) PURE;

+

+    /// <summary>

+    /// IDWriteTextLayout::Draw calls this application callback when it needs to

+    /// draw an inline object.

+    /// </summary>

+    /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>

+    /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>

+    /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>

+    /// <param name="inlineObject">The object set using IDWriteTextLayout::SetInlineObject.</param>

+    /// <param name="isSideways">The object should be drawn on its side.</param>

+    /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>

+    /// <param name="clientDrawingEffect">The drawing effect set in

+    /// IDWriteTextLayout::SetDrawingEffect.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// The right-to-left flag is a hint for those cases where it would look

+    /// strange for the image to be shown normally (like an arrow pointing to

+    /// right to indicate a submenu).

+    /// </remarks>

+    STDMETHOD(DrawInlineObject)(

+        __maybenull void* clientDrawingContext,

+        FLOAT originX,

+        FLOAT originY,

+        IDWriteInlineObject* inlineObject,

+        BOOL isSideways,

+        BOOL isRightToLeft,

+        __maybenull IUnknown* clientDrawingEffect

+        ) PURE;

+};

+

+/// <summary>

+/// The IDWriteTextLayout interface represents a block of text after it has

+/// been fully analyzed and formatted.

+///

+/// All coordinates are in device independent pixels (DIPs).

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("53737037-6d14-410b-9bfe-0b182bb70961") IDWriteTextLayout : public IDWriteTextFormat

+{

+    /// <summary>

+    /// Set layout maximum width

+    /// </summary>

+    /// <param name="maxWidth">Layout maximum width</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetMaxWidth)(

+        FLOAT maxWidth

+        ) PURE;

+

+    /// <summary>

+    /// Set layout maximum height

+    /// </summary>

+    /// <param name="maxHeight">Layout maximum height</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetMaxHeight)(

+        FLOAT maxHeight

+        ) PURE;

+

+    /// <summary>

+    /// Set the font collection.

+    /// </summary>

+    /// <param name="fontCollection">The font collection to set</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetFontCollection)(

+        IDWriteFontCollection* fontCollection,

+        DWRITE_TEXT_RANGE textRange

+        ) PURE;

+

+    /// <summary>

+    /// Set null-terminated font family name.

+    /// </summary>

+    /// <param name="fontFamilyName">Font family name</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetFontFamilyName)(

+        __in_z WCHAR const* fontFamilyName,

+        DWRITE_TEXT_RANGE textRange

+        ) PURE;

+

+    /// <summary>

+    /// Set font weight.

+    /// </summary>

+    /// <param name="fontWeight">Font weight</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetFontWeight)(

+        DWRITE_FONT_WEIGHT fontWeight,

+        DWRITE_TEXT_RANGE textRange

+        ) PURE;

+

+    /// <summary>

+    /// Set font style.

+    /// </summary>

+    /// <param name="fontStyle">Font style</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetFontStyle)(

+        DWRITE_FONT_STYLE fontStyle,

+        DWRITE_TEXT_RANGE textRange

+        ) PURE;

+

+    /// <summary>

+    /// Set font stretch.

+    /// </summary>

+    /// <param name="fontStretch">font stretch</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetFontStretch)(

+        DWRITE_FONT_STRETCH fontStretch,

+        DWRITE_TEXT_RANGE textRange

+        ) PURE;

+

+    /// <summary>

+    /// Set font em height.

+    /// </summary>

+    /// <param name="fontSize">Font em height</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetFontSize)(

+        FLOAT fontSize,

+        DWRITE_TEXT_RANGE textRange

+        ) PURE;

+

+    /// <summary>

+    /// Set underline.

+    /// </summary>

+    /// <param name="hasUnderline">The Boolean flag indicates whether underline takes place</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetUnderline)(

+        BOOL hasUnderline,

+        DWRITE_TEXT_RANGE textRange

+        ) PURE;

+

+    /// <summary>

+    /// Set strikethrough.

+    /// </summary>

+    /// <param name="hasStrikethrough">The Boolean flag indicates whether strikethrough takes place</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetStrikethrough)(

+        BOOL hasStrikethrough,

+        DWRITE_TEXT_RANGE textRange

+        ) PURE;

+

+    /// <summary>

+    /// Set application-defined drawing effect.

+    /// </summary>

+    /// <param name="drawingEffect">Pointer to an application-defined drawing effect.</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// This drawing effect is associated with the specified range and will be passed back

+    /// to the application via the callback when the range is drawn at drawing time.

+    /// </remarks>

+    STDMETHOD(SetDrawingEffect)(

+        IUnknown* drawingEffect,

+        DWRITE_TEXT_RANGE textRange

+        ) PURE;

+

+    /// <summary>

+    /// Set inline object.

+    /// </summary>

+    /// <param name="inlineObject">Pointer to an application-implemented inline object.</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// This inline object applies to the specified range and will be passed back

+    /// to the application via the DrawInlineObject callback when the range is drawn.

+    /// Any text in that range will be suppressed.

+    /// </remarks>

+    STDMETHOD(SetInlineObject)(

+        IDWriteInlineObject* inlineObject,

+        DWRITE_TEXT_RANGE textRange

+        ) PURE;

+

+    /// <summary>

+    /// Set font typography features.

+    /// </summary>

+    /// <param name="typography">Pointer to font typography setting.</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetTypography)(

+        IDWriteTypography* typography,

+        DWRITE_TEXT_RANGE textRange

+        ) PURE;

+

+    /// <summary>

+    /// Set locale name.

+    /// </summary>

+    /// <param name="localeName">Locale name</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetLocaleName)(

+        __in_z WCHAR const* localeName,

+        DWRITE_TEXT_RANGE textRange

+        ) PURE;

+

+    /// <summary>

+    /// Get layout maximum width

+    /// </summary>

+    STDMETHOD_(FLOAT, GetMaxWidth)() PURE;

+

+    /// <summary>

+    /// Get layout maximum height

+    /// </summary>

+    STDMETHOD_(FLOAT, GetMaxHeight)() PURE;

+

+    /// <summary>

+    /// Get the font collection where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="fontCollection">The current font collection</param>

+    /// <param name="textRange">Text range to which this change applies.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontCollection)(

+        UINT32 currentPosition,

+        __out IDWriteFontCollection** fontCollection,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Get the length of the font family name where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontFamilyNameLength)(

+        UINT32 currentPosition,

+        __out UINT32* nameLength,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Copy the font family name where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="fontFamilyName">Character array that receives the current font family name</param>

+    /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontFamilyName)(

+        UINT32 currentPosition,

+        __out_ecount_z(nameSize) WCHAR* fontFamilyName,

+        UINT32 nameSize,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Get the font weight where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="fontWeight">The current font weight</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontWeight)(

+        UINT32 currentPosition,

+        __out DWRITE_FONT_WEIGHT* fontWeight,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Get the font style where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="fontStyle">The current font style</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontStyle)(

+        UINT32 currentPosition,

+        __out DWRITE_FONT_STYLE* fontStyle,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Get the font stretch where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="fontStretch">The current font stretch</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontStretch)(

+        UINT32 currentPosition,

+        __out DWRITE_FONT_STRETCH* fontStretch,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Get the font em height where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="fontSize">The current font em height</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetFontSize)(

+        UINT32 currentPosition,

+        __out FLOAT* fontSize,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Get the underline presence where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="hasUnderline">The Boolean flag indicates whether text is underlined.</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetUnderline)(

+        UINT32 currentPosition,

+        __out BOOL* hasUnderline,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Get the strikethrough presence where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="hasStrikethrough">The Boolean flag indicates whether text has strikethrough.</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetStrikethrough)(

+        UINT32 currentPosition,

+        __out BOOL* hasStrikethrough,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Get the application-defined drawing effect where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="drawingEffect">The current application-defined drawing effect.</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetDrawingEffect)(

+        UINT32 currentPosition,

+        __out IUnknown** drawingEffect,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Get the inline object at the given position.

+    /// </summary>

+    /// <param name="currentPosition">The given text position.</param>

+    /// <param name="inlineObject">The inline object.</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetInlineObject)(

+        UINT32 currentPosition,

+        __out IDWriteInlineObject** inlineObject,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Get the typography setting where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="typography">The current typography setting.</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetTypography)(

+        UINT32 currentPosition,

+        __out IDWriteTypography** typography,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Get the length of the locale name where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetLocaleNameLength)(

+        UINT32 currentPosition,

+        __out UINT32* nameLength,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Get the locale name where the current position is at.

+    /// </summary>

+    /// <param name="currentPosition">The current text position.</param>

+    /// <param name="localeName">Character array that receives the current locale name</param>

+    /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>

+    /// <param name="textRange">The position range of the current format.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetLocaleName)(

+        UINT32 currentPosition,

+        __out_ecount_z(nameSize) WCHAR* localeName,

+        UINT32 nameSize,

+        __out_opt DWRITE_TEXT_RANGE* textRange = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Initiate drawing of the text.

+    /// </summary>

+    /// <param name="clientDrawingContext">An application defined value

+    /// included in rendering callbacks.</param>

+    /// <param name="renderer">The set of application-defined callbacks that do

+    /// the actual rendering.</param>

+    /// <param name="originX">X-coordinate of the layout's left side.</param>

+    /// <param name="originY">Y-coordinate of the layout's top side.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(Draw)(

+        __maybenull void* clientDrawingContext,

+        IDWriteTextRenderer* renderer,

+        FLOAT originX,

+        FLOAT originY

+        ) PURE;

+

+    /// <summary>

+    /// GetLineMetrics returns properties of each line.

+    /// </summary>

+    /// <param name="lineMetrics">The array to fill with line information.</param>

+    /// <param name="maxLineCount">The maximum size of the lineMetrics array.</param>

+    /// <param name="actualLineCount">The actual size of the lineMetrics

+    /// array that is needed.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// If maxLineCount is not large enough E_NOT_SUFFICIENT_BUFFER, 

+    /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),

+    /// is returned and *actualLineCount is set to the number of lines

+    /// needed.

+    /// </remarks>

+    STDMETHOD(GetLineMetrics)(

+        __out_ecount_opt(maxLineCount) DWRITE_LINE_METRICS* lineMetrics,

+        UINT32 maxLineCount,

+        __out UINT32* actualLineCount

+        ) PURE;

+

+    /// <summary>

+    /// GetMetrics retrieves overall metrics for the formatted string.

+    /// </summary>

+    /// <param name="textMetrics">The returned metrics.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// Drawing effects like underline and strikethrough do not contribute

+    /// to the text size, which is essentially the sum of advance widths and

+    /// line heights. Additionally, visible swashes and other graphic

+    /// adornments may extend outside the returned width and height.

+    /// </remarks>

+    STDMETHOD(GetMetrics)(

+        __out DWRITE_TEXT_METRICS* textMetrics

+        ) PURE;

+

+    /// <summary>

+    /// GetOverhangMetrics returns the overhangs (in DIPs) of the layout and all

+    /// objects contained in it, including text glyphs and inline objects.

+    /// </summary>

+    /// <param name="overhangs">Overshoots of visible extents (in DIPs) outside the layout.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// Any underline and strikethrough do not contribute to the black box

+    /// determination, since these are actually drawn by the renderer, which

+    /// is allowed to draw them in any variety of styles.

+    /// </remarks>

+    STDMETHOD(GetOverhangMetrics)(

+        __out DWRITE_OVERHANG_METRICS* overhangs

+        ) PURE;

+

+    /// <summary>

+    /// Retrieve logical properties and measurement of each cluster.

+    /// </summary>

+    /// <param name="clusterMetrics">The array to fill with cluster information.</param>

+    /// <param name="maxClusterCount">The maximum size of the clusterMetrics array.</param>

+    /// <param name="actualClusterCount">The actual size of the clusterMetrics array that is needed.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// If maxClusterCount is not large enough E_NOT_SUFFICIENT_BUFFER, 

+    /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), 

+    /// is returned and *actualClusterCount is set to the number of clusters

+    /// needed.

+    /// </remarks>

+    STDMETHOD(GetClusterMetrics)(

+        __out_ecount_opt(maxClusterCount) DWRITE_CLUSTER_METRICS* clusterMetrics,

+        UINT32 maxClusterCount,

+        __out UINT32* actualClusterCount

+        ) PURE;

+

+    /// <summary>

+    /// Determines the minimum possible width the layout can be set to without

+    /// emergency breaking between the characters of whole words.

+    /// </summary>

+    /// <param name="minWidth">Minimum width.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(DetermineMinWidth)(

+        __out FLOAT* minWidth

+        ) PURE;

+

+    /// <summary>

+    /// Given a coordinate (in DIPs) relative to the top-left of the layout box,

+    /// this returns the corresponding hit-test metrics of the text string where

+    /// the hit-test has occurred. This is useful for mapping mouse clicks to caret

+    /// positions. When the given coordinate is outside the text string, the function

+    /// sets the output value *isInside to false but returns the nearest character

+    /// position.

+    /// </summary>

+    /// <param name="pointX">X coordinate to hit-test, relative to the top-left location of the layout box.</param>

+    /// <param name="pointY">Y coordinate to hit-test, relative to the top-left location of the layout box.</param>

+    /// <param name="isTrailingHit">Output flag indicating whether the hit-test location is at the leading or the trailing

+    ///     side of the character. When the output *isInside value is set to false, this value is set according to the output

+    ///     *position value to represent the edge closest to the hit-test location. </param>

+    /// <param name="isInside">Output flag indicating whether the hit-test location is inside the text string.

+    ///     When false, the position nearest the text's edge is returned.</param>

+    /// <param name="hitTestMetrics">Output geometry fully enclosing the hit-test location. When the output *isInside value

+    ///     is set to false, this structure represents the geometry enclosing the edge closest to the hit-test location.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(HitTestPoint)(

+        FLOAT pointX,

+        FLOAT pointY,

+        __out BOOL* isTrailingHit,

+        __out BOOL* isInside,

+        __out DWRITE_HIT_TEST_METRICS* hitTestMetrics

+        ) PURE;

+

+    /// <summary>

+    /// Given a text position and whether the caret is on the leading or trailing

+    /// edge of that position, this returns the corresponding coordinate (in DIPs)

+    /// relative to the top-left of the layout box. This is most useful for drawing

+    /// the caret's current position, but it could also be used to anchor an IME to the

+    /// typed text or attach a floating menu near the point of interest. It may also be

+    /// used to programmatically obtain the geometry of a particular text position

+    /// for UI automation.

+    /// </summary>

+    /// <param name="textPosition">Text position to get the coordinate of.</param>

+    /// <param name="isTrailingHit">Flag indicating whether the location is of the leading or the trailing side of the specified text position. </param>

+    /// <param name="pointX">Output caret X, relative to the top-left of the layout box.</param>

+    /// <param name="pointY">Output caret Y, relative to the top-left of the layout box.</param>

+    /// <param name="hitTestMetrics">Output geometry fully enclosing the specified text position.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// When drawing a caret at the returned X,Y, it should should be centered on X

+    /// and drawn from the Y coordinate down. The height will be the size of the

+    /// hit-tested text (which can vary in size within a line).

+    /// Reading direction also affects which side of the character the caret is drawn.

+    /// However, the returned X coordinate will be correct for either case.

+    /// You can get a text length back that is larger than a single character.

+    /// This happens for complex scripts when multiple characters form a single cluster,

+    /// when diacritics join their base character, or when you test a surrogate pair.

+    /// </remarks>

+    STDMETHOD(HitTestTextPosition)(

+        UINT32 textPosition,

+        BOOL isTrailingHit,

+        __out FLOAT* pointX,

+        __out FLOAT* pointY,

+        __out DWRITE_HIT_TEST_METRICS* hitTestMetrics

+        ) PURE;

+

+    /// <summary>

+    /// The application calls this function to get a set of hit-test metrics

+    /// corresponding to a range of text positions. The main usage for this

+    /// is to draw highlighted selection of the text string.

+    ///

+    /// The function returns E_NOT_SUFFICIENT_BUFFER, which is equivalent to 

+    /// HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), when the buffer size of

+    /// hitTestMetrics is too small to hold all the regions calculated by the

+    /// function. In such situation, the function sets the output value

+    /// *actualHitTestMetricsCount to the number of geometries calculated.

+    /// The application is responsible to allocate a new buffer of greater

+    /// size and call the function again.

+    ///

+    /// A good value to use as an initial value for maxHitTestMetricsCount may

+    /// be calculated from the following equation:

+    ///     maxHitTestMetricsCount = lineCount * maxBidiReorderingDepth

+    ///

+    /// where lineCount is obtained from the value of the output argument

+    /// *actualLineCount from the function IDWriteTextLayout::GetLineMetrics,

+    /// and the maxBidiReorderingDepth value from the DWRITE_TEXT_METRICS

+    /// structure of the output argument *textMetrics from the function

+    /// IDWriteFactory::CreateTextLayout.

+    /// </summary>

+    /// <param name="textPosition">First text position of the specified range.</param>

+    /// <param name="textLength">Number of positions of the specified range.</param>

+    /// <param name="originX">Offset of the X origin (left of the layout box) which is added to each of the hit-test metrics returned.</param>

+    /// <param name="originY">Offset of the Y origin (top of the layout box) which is added to each of the hit-test metrics returned.</param>

+    /// <param name="hitTestMetrics">Pointer to a buffer of the output geometry fully enclosing the specified position range.</param>

+    /// <param name="maxHitTestMetricsCount">Maximum number of distinct metrics it could hold in its buffer memory.</param>

+    /// <param name="actualHitTestMetricsCount">Actual number of metrics returned or needed.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// There are no gaps in the returned metrics. While there could be visual gaps,

+    /// depending on bidi ordering, each range is contiguous and reports all the text,

+    /// including any hidden characters and trimmed text.

+    /// The height of each returned range will be the same within each line, regardless

+    /// of how the font sizes vary.

+    /// </remarks>

+    STDMETHOD(HitTestTextRange)(

+        UINT32 textPosition,

+        UINT32 textLength,

+        FLOAT originX,

+        FLOAT originY,

+        __out_ecount_opt(maxHitTestMetricsCount) DWRITE_HIT_TEST_METRICS* hitTestMetrics,

+        UINT32 maxHitTestMetricsCount,

+        __out UINT32* actualHitTestMetricsCount

+        ) PURE;

+};

+

+/// <summary>

+/// Encapsulates a 32-bit device independent bitmap and device context, which can be used for rendering glyphs.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("5e5a32a3-8dff-4773-9ff6-0696eab77267") IDWriteBitmapRenderTarget : public IUnknown

+{

+    /// <summary>

+    /// Draws a run of glyphs to the bitmap.

+    /// </summary>

+    /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>

+    /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>

+    /// <param name="measuringMode">Specifies measuring method for glyphs in the run.

+    /// Renderer implementations may choose different rendering modes for different measuring methods, for example

+    /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL,

+    /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC, and

+    /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL.

+    /// </param>

+    /// <param name="glyphRun">Structure containing the properties of the glyph run.</param>

+    /// <param name="renderingParams">Object that controls rendering behavior.</param>

+    /// <param name="textColor">Specifies the foreground color of the text.</param>

+    /// <param name="blackBoxRect">Optional rectangle that receives the bounding box (in pixels not DIPs) of all the pixels affected by 

+    /// drawing the glyph run. The black box rectangle may extend beyond the dimensions of the bitmap.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(DrawGlyphRun)(

+        FLOAT baselineOriginX,

+        FLOAT baselineOriginY,

+        DWRITE_MEASURING_MODE measuringMode,

+        __in DWRITE_GLYPH_RUN const* glyphRun,

+        IDWriteRenderingParams* renderingParams,

+        COLORREF textColor,

+        __out_opt RECT* blackBoxRect = NULL

+        ) PURE;

+

+    /// <summary>

+    /// Gets a handle to the memory device context.

+    /// </summary>

+    /// <returns>

+    /// Returns the device context handle.

+    /// </returns>

+    /// <remarks>

+    /// An application can use the device context to draw using GDI functions. An application can obtain the bitmap handle

+    /// (HBITMAP) by calling GetCurrentObject. An application that wants information about the underlying bitmap, including

+    /// a pointer to the pixel data, can call GetObject to fill in a DIBSECTION structure. The bitmap is always a 32-bit 

+    /// top-down DIB.

+    /// </remarks>

+    STDMETHOD_(HDC, GetMemoryDC)() PURE;

+

+    /// <summary>

+    /// Gets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number

+    /// if pixels per inch divided by 96.

+    /// </summary>

+    /// <returns>

+    /// Returns the number of bitmap pixels per DIP.

+    /// </returns>

+    STDMETHOD_(FLOAT, GetPixelsPerDip)() PURE;

+

+    /// <summary>

+    /// Sets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number

+    /// if pixels per inch divided by 96.

+    /// </summary>

+    /// <param name="pixelsPerDip">Specifies the number of pixels per DIP.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetPixelsPerDip)(

+        FLOAT pixelsPerDip

+        ) PURE;

+

+    /// <summary>

+    /// Gets the transform that maps abstract coordinate to DIPs. By default this is the identity 

+    /// transform. Note that this is unrelated to the world transform of the underlying device

+    /// context.

+    /// </summary>

+    /// <param name="transform">Receives the transform.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetCurrentTransform)(

+        __out DWRITE_MATRIX* transform

+        ) PURE;

+

+    /// <summary>

+    /// Sets the transform that maps abstract coordinate to DIPs. This does not affect the world

+    /// transform of the underlying device context.

+    /// </summary>

+    /// <param name="transform">Specifies the new transform. This parameter can be NULL, in which

+    /// case the identity transform is implied.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(SetCurrentTransform)(

+        __in_opt DWRITE_MATRIX const* transform

+        ) PURE;

+

+    /// <summary>

+    /// Gets the dimensions of the bitmap.

+    /// </summary>

+    /// <param name="size">Receives the size of the bitmap in pixels.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetSize)(

+        __out SIZE* size

+        ) PURE;

+

+    /// <summary>

+    /// Resizes the bitmap.

+    /// </summary>

+    /// <param name="width">New bitmap width, in pixels.</param>

+    /// <param name="height">New bitmap height, in pixels.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(Resize)(

+        UINT32 width,

+        UINT32 height

+        ) PURE;

+};

+

+/// <summary>

+/// The GDI interop interface provides interoperability with GDI.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("1edd9491-9853-4299-898f-6432983b6f3a") IDWriteGdiInterop : public IUnknown

+{

+    /// <summary>

+    /// Creates a font object that matches the properties specified by the LOGFONT structure.

+    /// </summary>

+    /// <param name="logFont">Structure containing a GDI-compatible font description.</param>

+    /// <param name="font">Receives a newly created font object if successful, or NULL in case of error.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateFontFromLOGFONT)(

+        __in LOGFONTW const* logFont,

+        __out IDWriteFont** font

+        ) PURE;

+

+    /// <summary>

+    /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.

+    /// </summary>

+    /// <param name="font">Specifies a font in the system font collection.</param>

+    /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>

+    /// <param name="isSystemFont">Contains TRUE if the specified font object is part of the system font collection

+    /// or FALSE otherwise.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(ConvertFontToLOGFONT)(

+        IDWriteFont* font,

+        __out LOGFONTW* logFont,

+        __out BOOL* isSystemFont

+        ) PURE;

+

+    /// <summary>

+    /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.

+    /// </summary>

+    /// <param name="font">Specifies a font face.</param>

+    /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(ConvertFontFaceToLOGFONT)(

+        IDWriteFontFace* font,

+        __out LOGFONTW* logFont

+        ) PURE;

+

+    /// <summary>

+    /// Creates a font face object that corresponds to the currently selected HFONT.

+    /// </summary>

+    /// <param name="hdc">Handle to a device context into which a font has been selected. It is assumed that the client

+    /// has already performed font mapping and that the font selected into the DC is the actual font that would be used 

+    /// for rendering glyphs.</param>

+    /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateFontFaceFromHdc)(

+        HDC hdc,

+        __out IDWriteFontFace** fontFace

+        ) PURE;

+

+    /// <summary>

+    /// Creates an object that encapsulates a bitmap and memory DC which can be used for rendering glyphs.

+    /// </summary>

+    /// <param name="hdc">Optional device context used to create a compatible memory DC.</param>

+    /// <param name="width">Width of the bitmap.</param>

+    /// <param name="height">Height of the bitmap.</param>

+    /// <param name="renderTarget">Receives a pointer to the newly created render target.</param>

+    STDMETHOD(CreateBitmapRenderTarget)(

+        __in_opt HDC hdc,

+        UINT32 width,

+        UINT32 height,

+        __out IDWriteBitmapRenderTarget** renderTarget

+        ) PURE;

+};

+

+/// <summary>

+/// The DWRITE_TEXTURE_TYPE enumeration identifies a type of alpha texture. An alpha texture is a bitmap of alpha values, each

+/// representing the darkness (i.e., opacity) of a pixel or subpixel.

+/// </summary>

+enum DWRITE_TEXTURE_TYPE

+{

+    /// <summary>

+    /// Specifies an alpha texture for aliased text rendering (i.e., bi-level, where each pixel is either fully opaque or fully transparent),

+    /// with one byte per pixel.

+    /// </summary>

+    DWRITE_TEXTURE_ALIASED_1x1,

+

+    /// <summary>

+    /// Specifies an alpha texture for ClearType text rendering, with three bytes per pixel in the horizontal dimension and 

+    /// one byte per pixel in the vertical dimension.

+    /// </summary>

+    DWRITE_TEXTURE_CLEARTYPE_3x1

+};

+

+/// <summary>

+/// Maximum alpha value in a texture returned by IDWriteGlyphRunAnalysis::CreateAlphaTexture.

+/// </summary>

+#define DWRITE_ALPHA_MAX 255

+

+/// <summary>

+/// Interface that encapsulates information used to render a glyph run.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("7d97dbf7-e085-42d4-81e3-6a883bded118") IDWriteGlyphRunAnalysis : public IUnknown

+{

+    /// <summary>

+    /// Gets the bounding rectangle of the physical pixels affected by the glyph run.

+    /// </summary>

+    /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the

+    /// bounding rectangle includes only bi-level glyphs. Otherwise, the bounding rectangle includes only anti-aliased

+    /// glyphs.</param>

+    /// <param name="textureBounds">Receives the bounding rectangle, or an empty rectangle if there are no glyphs

+    /// if the specified type.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetAlphaTextureBounds)(

+        DWRITE_TEXTURE_TYPE textureType,

+        __out RECT* textureBounds

+        ) PURE;

+

+    /// <summary>

+    /// Creates an alpha texture of the specified type.

+    /// </summary>

+    /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the

+    /// texture contains only bi-level glyphs. Otherwise, the texture contains only anti-aliased glyphs.</param>

+    /// <param name="textureBounds">Specifies the bounding rectangle of the texture, which can be different than

+    /// the bounding rectangle returned by GetAlphaTextureBounds.</param>

+    /// <param name="alphaValues">Receives the array of alpha values.</param>

+    /// <param name="bufferSize">Size of the alphaValues array. The minimum size depends on the dimensions of the

+    /// rectangle and the type of texture requested.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateAlphaTexture)(

+        DWRITE_TEXTURE_TYPE textureType,

+        __in RECT const* textureBounds,

+        __out_bcount(bufferSize) BYTE* alphaValues,

+        UINT32 bufferSize

+        ) PURE;

+

+    /// <summary>

+    /// Gets properties required for ClearType blending.

+    /// </summary>

+    /// <param name="renderingParams">Rendering parameters object. In most cases, the values returned in the output

+    /// parameters are based on the properties of this object. The exception is if a GDI-compatible rendering mode

+    /// is specified.</param>

+    /// <param name="blendGamma">Receives the gamma value to use for gamma correction.</param>

+    /// <param name="blendEnhancedContrast">Receives the enhanced contrast value.</param>

+    /// <param name="blendClearTypeLevel">Receives the ClearType level.</param>

+    STDMETHOD(GetAlphaBlendParams)(

+        IDWriteRenderingParams* renderingParams,

+        __out FLOAT* blendGamma,

+        __out FLOAT* blendEnhancedContrast,

+        __out FLOAT* blendClearTypeLevel

+        ) PURE;

+};

+

+/// <summary>

+/// The root factory interface for all DWrite objects.

+/// </summary>

+interface DWRITE_DECLARE_INTERFACE("b859ee5a-d838-4b5b-a2e8-1adc7d93db48") IDWriteFactory : public IUnknown

+{

+    /// <summary>

+    /// Gets a font collection representing the set of installed fonts.

+    /// </summary>

+    /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>

+    /// <param name="checkForUpdates">If this parameter is nonzero, the function performs an immediate check for changes to the set of

+    /// installed fonts. If this parameter is FALSE, the function will still detect changes if the font cache service is running, but

+    /// there may be some latency. For example, an application might specify TRUE if it has itself just installed a font and wants to 

+    /// be sure the font collection contains that font.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetSystemFontCollection)(

+        __out IDWriteFontCollection** fontCollection,

+        BOOL checkForUpdates = FALSE

+        ) PURE;

+

+    /// <summary>

+    /// Creates a font collection using a custom font collection loader.

+    /// </summary>

+    /// <param name="collectionLoader">Application-defined font collection loader, which must have been previously

+    /// registered using RegisterFontCollectionLoader.</param>

+    /// <param name="collectionKey">Key used by the loader to identify a collection of font files.</param>

+    /// <param name="collectionKeySize">Size in bytes of the collection key.</param>

+    /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateCustomFontCollection)(

+        IDWriteFontCollectionLoader* collectionLoader,

+        __in_bcount(collectionKeySize) void const* collectionKey,

+        UINT32 collectionKeySize,

+        __out IDWriteFontCollection** fontCollection

+        ) PURE;

+

+    /// <summary>

+    /// Registers a custom font collection loader with the factory object.

+    /// </summary>

+    /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(RegisterFontCollectionLoader)(

+        IDWriteFontCollectionLoader* fontCollectionLoader

+        ) PURE;

+

+    /// <summary>

+    /// Unregisters a custom font collection loader that was previously registered using RegisterFontCollectionLoader.

+    /// </summary>

+    /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(UnregisterFontCollectionLoader)(

+        IDWriteFontCollectionLoader* fontCollectionLoader

+        ) PURE;

+

+    /// <summary>

+    /// CreateFontFileReference creates a font file reference object from a local font file.

+    /// </summary>

+    /// <param name="filePath">Absolute file path. Subsequent operations on the constructed object may fail

+    /// if the user provided filePath doesn't correspond to a valid file on the disk.</param>

+    /// <param name="lastWriteTime">Last modified time of the input file path. If the parameter is omitted,

+    /// the function will access the font file to obtain its last write time, so the clients are encouraged to specify this value

+    /// to avoid extra disk access. Subsequent operations on the constructed object may fail

+    /// if the user provided lastWriteTime doesn't match the file on the disk.</param>

+    /// <param name="fontFile">Contains newly created font file reference object, or NULL in case of failure.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateFontFileReference)(

+        __in_z WCHAR const* filePath,

+        __in_opt FILETIME const* lastWriteTime,

+        __out IDWriteFontFile** fontFile

+        ) PURE;

+

+    /// <summary>

+    /// CreateCustomFontFileReference creates a reference to an application specific font file resource.

+    /// This function enables an application or a document to use a font without having to install it on the system.

+    /// The fontFileReferenceKey has to be unique only in the scope of the fontFileLoader used in this call.

+    /// </summary>

+    /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource

+    /// during the lifetime of fontFileLoader.</param>

+    /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>

+    /// <param name="fontFileLoader">Font file loader that will be used by the font system to load data from the file identified by

+    /// fontFileReferenceKey.</param>

+    /// <param name="fontFile">Contains the newly created font file object, or NULL in case of failure.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// This function is provided for cases when an application or a document needs to use a font

+    /// without having to install it on the system. fontFileReferenceKey has to be unique only in the scope

+    /// of the fontFileLoader used in this call.

+    /// </remarks>

+    STDMETHOD(CreateCustomFontFileReference)(

+        __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,

+        UINT32 fontFileReferenceKeySize,

+        IDWriteFontFileLoader* fontFileLoader,

+        __out IDWriteFontFile** fontFile

+        ) PURE;

+

+    /// <summary>

+    /// Creates a font face object.

+    /// </summary>

+    /// <param name="fontFaceType">The file format of the font face.</param>

+    /// <param name="numberOfFiles">The number of font files require to represent the font face.</param>

+    /// <param name="fontFiles">Font files representing the font face. Since IDWriteFontFace maintains its own references

+    /// to the input font file objects, it's OK to release them after this call.</param>

+    /// <param name="faceIndex">The zero based index of a font face in cases when the font files contain a collection of font faces.

+    /// If the font files contain a single face, this value should be zero.</param>

+    /// <param name="fontFaceSimulationFlags">Font face simulation flags for algorithmic emboldening and italicization.</param>

+    /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateFontFace)(

+        DWRITE_FONT_FACE_TYPE fontFaceType,

+        UINT32 numberOfFiles,

+        __in_ecount(numberOfFiles) IDWriteFontFile* const* fontFiles,

+        UINT32 faceIndex,

+        DWRITE_FONT_SIMULATIONS fontFaceSimulationFlags,

+        __out IDWriteFontFace** fontFace

+        ) PURE;

+

+    /// <summary>

+    /// Creates a rendering parameters object with default settings for the primary monitor.

+    /// </summary>

+    /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateRenderingParams)(

+        __out IDWriteRenderingParams** renderingParams

+        ) PURE;

+

+    /// <summary>

+    /// Creates a rendering parameters object with default settings for the specified monitor.

+    /// </summary>

+    /// <param name="monitor">The monitor to read the default values from.</param>

+    /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateMonitorRenderingParams)(

+        HMONITOR monitor,

+        __out IDWriteRenderingParams** renderingParams

+        ) PURE;

+

+    /// <summary>

+    /// Creates a rendering parameters object with the specified properties.

+    /// </summary>

+    /// <param name="gamma">The gamma value used for gamma correction, which must be greater than zero and cannot exceed 256.</param>

+    /// <param name="enhancedContrast">The amount of contrast enhancement, zero or greater.</param>

+    /// <param name="clearTypeLevel">The degree of ClearType level, from 0.0f (no ClearType) to 1.0f (full ClearType).</param>

+    /// <param name="pixelGeometry">The geometry of a device pixel.</param>

+    /// <param name="renderingMode">Method of rendering glyphs. In most cases, this should be DWRITE_RENDERING_MODE_DEFAULT to automatically use an appropriate mode.</param>

+    /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateCustomRenderingParams)(

+        FLOAT gamma,

+        FLOAT enhancedContrast,

+        FLOAT clearTypeLevel,

+        DWRITE_PIXEL_GEOMETRY pixelGeometry,

+        DWRITE_RENDERING_MODE renderingMode,

+        __out IDWriteRenderingParams** renderingParams

+        ) PURE;

+

+    /// <summary>

+    /// Registers a font file loader with DirectWrite.

+    /// </summary>

+    /// <param name="fontFileLoader">Pointer to the implementation of the IDWriteFontFileLoader for a particular file resource type.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    /// <remarks>

+    /// This function registers a font file loader with DirectWrite.

+    /// Font file loader interface handles loading font file resources of a particular type from a key.

+    /// The font file loader interface is recommended to be implemented by a singleton object.

+    /// A given instance can only be registered once.

+    /// Succeeding attempts will return an error that it has already been registered.

+    /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite

+    /// inside their constructors and must not unregister themselves in their destructors, because

+    /// registration and unregistraton operations increment and decrement the object reference count respectively.

+    /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed

+    /// outside of the font file loader implementation as a separate step.

+    /// </remarks>

+    STDMETHOD(RegisterFontFileLoader)(

+        IDWriteFontFileLoader* fontFileLoader

+        ) PURE;

+

+    /// <summary>

+    /// Unregisters a font file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.

+    /// </summary>

+    /// <param name="fontFileLoader">Pointer to the file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.</param>

+    /// <returns>

+    /// This function will succeed if the user loader is requested to be removed.

+    /// It will fail if the pointer to the file loader identifies a standard DirectWrite loader,

+    /// or a loader that is never registered or has already been unregistered.

+    /// </returns>

+    /// <remarks>

+    /// This function unregisters font file loader callbacks with the DirectWrite font system.

+    /// The font file loader interface is recommended to be implemented by a singleton object.

+    /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite

+    /// inside their constructors and must not unregister themselves in their destructors, because

+    /// registration and unregistraton operations increment and decrement the object reference count respectively.

+    /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed

+    /// outside of the font file loader implementation as a separate step.

+    /// </remarks>

+    STDMETHOD(UnregisterFontFileLoader)(

+        IDWriteFontFileLoader* fontFileLoader

+        ) PURE;

+

+    /// <summary>

+    /// Create a text format object used for text layout.

+    /// </summary>

+    /// <param name="fontFamilyName">Name of the font family</param>

+    /// <param name="fontCollection">Font collection. NULL indicates the system font collection.</param>

+    /// <param name="fontWeight">Font weight</param>

+    /// <param name="fontStyle">Font style</param>

+    /// <param name="fontStretch">Font stretch</param>

+    /// <param name="fontSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>

+    /// <param name="localeName">Locale name</param>

+    /// <param name="textFormat">Contains newly created text format object, or NULL in case of failure.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateTextFormat)(

+        __in_z WCHAR const* fontFamilyName,

+        __maybenull IDWriteFontCollection* fontCollection,

+        DWRITE_FONT_WEIGHT fontWeight,

+        DWRITE_FONT_STYLE fontStyle,

+        DWRITE_FONT_STRETCH fontStretch,

+        FLOAT fontSize,

+        __in_z WCHAR const* localeName,

+        __out IDWriteTextFormat** textFormat

+        ) PURE;

+

+    /// <summary>

+    /// Create a typography object used in conjunction with text format for text layout.

+    /// </summary>

+    /// <param name="typography">Contains newly created typography object, or NULL in case of failure.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateTypography)(

+        __out IDWriteTypography** typography

+        ) PURE;

+

+    /// <summary>

+    /// Create an object used for interoperability with GDI.

+    /// </summary>

+    /// <param name="gdiInterop">Receives the GDI interop object if successful, or NULL in case of failure.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(GetGdiInterop)(

+        __out IDWriteGdiInterop** gdiInterop

+        ) PURE;

+

+    /// <summary>

+    /// CreateTextLayout takes a string, format, and associated constraints

+    /// and produces and object representing the fully analyzed

+    /// and formatted result.

+    /// </summary>

+    /// <param name="string">The string to layout.</param>

+    /// <param name="stringLength">The length of the string.</param>

+    /// <param name="textFormat">The format to apply to the string.</param>

+    /// <param name="maxWidth">Width of the layout box.</param>

+    /// <param name="maxHeight">Height of the layout box.</param>

+    /// <param name="textLayout">The resultant object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateTextLayout)(

+        __in_ecount(stringLength) WCHAR const* string,

+        UINT32 stringLength,

+        IDWriteTextFormat* textFormat,

+        FLOAT maxWidth,

+        FLOAT maxHeight,

+        __out IDWriteTextLayout** textLayout

+        ) PURE;

+

+    /// <summary>

+    /// CreateGdiCompatibleTextLayout takes a string, format, and associated constraints

+    /// and produces and object representing the result formatted for a particular display resolution

+    /// and measuring method. The resulting text layout should only be used for the intended resolution,

+    /// and for cases where text scalability is desired, CreateTextLayout should be used instead.

+    /// </summary>

+    /// <param name="string">The string to layout.</param>

+    /// <param name="stringLength">The length of the string.</param>

+    /// <param name="textFormat">The format to apply to the string.</param>

+    /// <param name="layoutWidth">Width of the layout box.</param>

+    /// <param name="layoutHeight">Height of the layout box.</param>

+    /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI device then pixelsPerDip

+    /// is 1. If rendering onto a 120 DPI device then pixelsPerDip is 120/96.</param>

+    /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the

+    /// scaling specified the font size and pixelsPerDip.</param>

+    /// <param name="useGdiNatural">

+    /// When set to FALSE, instructs the text layout to use the same metrics as GDI aliased text.

+    /// When set to TRUE, instructs the text layout to use the same metrics as text measured by GDI using a font

+    /// created with CLEARTYPE_NATURAL_QUALITY.

+    /// </param>

+    /// <param name="textLayout">The resultant object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateGdiCompatibleTextLayout)(

+        __in_ecount(stringLength) WCHAR const* string,

+        UINT32 stringLength,

+        IDWriteTextFormat* textFormat,

+        FLOAT layoutWidth,

+        FLOAT layoutHeight,

+        FLOAT pixelsPerDip,

+        __in_opt DWRITE_MATRIX const* transform,

+        BOOL useGdiNatural,

+        __out IDWriteTextLayout** textLayout

+        ) PURE;

+

+    /// <summary>

+    /// The application may call this function to create an inline object for trimming, using an ellipsis as the omission sign.

+    /// The ellipsis will be created using the current settings of the format, including base font, style, and any effects.

+    /// Alternate omission signs can be created by the application by implementing IDWriteInlineObject.

+    /// </summary>

+    /// <param name="textFormat">Text format used as a template for the omission sign.</param>

+    /// <param name="trimmingSign">Created omission sign.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateEllipsisTrimmingSign)(

+        IDWriteTextFormat* textFormat,

+        __out IDWriteInlineObject** trimmingSign

+        ) PURE;

+

+    /// <summary>

+    /// Return an interface to perform text analysis with.

+    /// </summary>

+    /// <param name="textAnalyzer">The resultant object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateTextAnalyzer)(

+        __out IDWriteTextAnalyzer** textAnalyzer

+        ) PURE;

+

+    /// <summary>

+    /// Creates a number substitution object using a locale name,

+    /// substitution method, and whether to ignore user overrides (uses NLS

+    /// defaults for the given culture instead).

+    /// </summary>

+    /// <param name="substitutionMethod">Method of number substitution to use.</param>

+    /// <param name="localeName">Which locale to obtain the digits from.</param>

+    /// <param name="ignoreUserOverride">Ignore the user's settings and use the locale defaults</param>

+    /// <param name="numberSubstitution">Receives a pointer to the newly created object.</param>

+    STDMETHOD(CreateNumberSubstitution)(

+        __in DWRITE_NUMBER_SUBSTITUTION_METHOD substitutionMethod,

+        __in_z WCHAR const* localeName,

+        __in BOOL ignoreUserOverride,

+        __out IDWriteNumberSubstitution** numberSubstitution

+        ) PURE;

+

+    /// <summary>

+    /// Creates a glyph run analysis object, which encapsulates information

+    /// used to render a glyph run.

+    /// </summary>

+    /// <param name="glyphRun">Structure specifying the properties of the glyph run.</param>

+    /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI bitmap then pixelsPerDip

+    /// is 1. If rendering onto a 120 DPI bitmap then pixelsPerDip is 120/96.</param>

+    /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the

+    /// scaling specified the emSize and pixelsPerDip.</param>

+    /// <param name="renderingMode">Specifies the rendering mode, which must be one of the raster rendering modes (i.e., not default

+    /// and not outline).</param>

+    /// <param name="measuringMode">Specifies the method to measure glyphs.</param>

+    /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs.</param>

+    /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs.</param>

+    /// <param name="glyphRunAnalysis">Receives a pointer to the newly created object.</param>

+    /// <returns>

+    /// Standard HRESULT error code.

+    /// </returns>

+    STDMETHOD(CreateGlyphRunAnalysis)(

+        __in DWRITE_GLYPH_RUN const* glyphRun,

+        FLOAT pixelsPerDip,

+        __in_opt DWRITE_MATRIX const* transform,

+        DWRITE_RENDERING_MODE renderingMode,

+        DWRITE_MEASURING_MODE measuringMode,

+        FLOAT baselineOriginX,

+        FLOAT baselineOriginY,

+        __out IDWriteGlyphRunAnalysis** glyphRunAnalysis

+        ) PURE;

+

+}; // interface IDWriteFactory

+

+/// <summary>

+/// Creates a DirectWrite factory object that is used for subsequent creation of individual DirectWrite objects.

+/// </summary>

+/// <param name="factoryType">Identifies whether the factory object will be shared or isolated.</param>

+/// <param name="iid">Identifies the DirectWrite factory interface, such as __uuidof(IDWriteFactory).</param>

+/// <param name="factory">Receives the DirectWrite factory object.</param>

+/// <returns>

+/// Standard HRESULT error code.

+/// </returns>

+/// <remarks>

+/// Obtains DirectWrite factory object that is used for subsequent creation of individual DirectWrite classes.

+/// DirectWrite factory contains internal state such as font loader registration and cached font data.

+/// In most cases it is recommended to use the shared factory object, because it allows multiple components

+/// that use DirectWrite to share internal DirectWrite state and reduce memory usage.

+/// However, there are cases when it is desirable to reduce the impact of a component,

+/// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it

+/// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed

+/// component.

+/// </remarks>

+EXTERN_C HRESULT DWRITE_EXPORT DWriteCreateFactory(

+    __in DWRITE_FACTORY_TYPE factoryType,

+    __in REFIID iid,

+    __out IUnknown **factory

+    );

+

+// Macros used to define DirectWrite error codes.

+#define FACILITY_DWRITE 0x898

+#define DWRITE_ERR_BASE 0x5000

+#define MAKE_DWRITE_HR(severity, code) MAKE_HRESULT(severity, FACILITY_DWRITE, (DWRITE_ERR_BASE + code))

+#define MAKE_DWRITE_HR_ERR(code) MAKE_DWRITE_HR(SEVERITY_ERROR, code)

+

+/// <summary>

+/// Indicates an error in an input file such as a font file.

+/// </summary>

+#define DWRITE_E_FILEFORMAT             MAKE_DWRITE_HR_ERR(0x000)

+

+/// <summary>

+/// Indicates an error originating in DirectWrite code, which is not expected to occur but is safe to recover from.

+/// </summary>

+#define DWRITE_E_UNEXPECTED             MAKE_DWRITE_HR_ERR(0x001)

+

+/// <summary>

+/// Indicates the specified font does not exist.

+/// </summary>

+#define DWRITE_E_NOFONT                 MAKE_DWRITE_HR_ERR(0x002)

+

+/// <summary>

+/// A font file could not be opened because the file, directory, network location, drive, or other storage

+/// location does not exist or is unavailable.

+/// </summary>

+#define DWRITE_E_FILENOTFOUND           MAKE_DWRITE_HR_ERR(0x003)

+

+/// <summary>

+/// A font file exists but could not be opened due to access denied, sharing violation, or similar error.

+/// </summary>

+#define DWRITE_E_FILEACCESS             MAKE_DWRITE_HR_ERR(0x004)

+

+/// <summary>

+/// A font collection is obsolete due to changes in the system.

+/// </summary>

+#define DWRITE_E_FONTCOLLECTIONOBSOLETE MAKE_DWRITE_HR_ERR(0x005)

+

+/// <summary>

+/// The given interface is already registered.

+/// </summary>

+#define DWRITE_E_ALREADYREGISTERED      MAKE_DWRITE_HR_ERR(0x006)

+

+#endif /* DWRITE_H_INCLUDED */

diff --git a/core/src/fxge/Microsoft SDK/include/Dcommon.h b/core/src/fxge/Microsoft SDK/include/Dcommon.h
new file mode 100644
index 0000000..a6c901a
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/Dcommon.h
@@ -0,0 +1,65 @@
+//+--------------------------------------------------------------------------

+//

+//  Copyright (c) Microsoft Corporation.  All rights reserved.

+//

+//  Abstract:

+//     Public API definitions for DWrite and D2D

+//

+//----------------------------------------------------------------------------

+

+#ifndef DCOMMON_H_INCLUDED

+#define DCOMMON_H_INCLUDED

+

+//

+//These macros are defined in the Windows 7 SDK, however to enable development using the technical preview,

+//they are included here temporarily.

+//

+#ifndef DEFINE_ENUM_FLAG_OPERATORS 

+#define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) \

+extern "C++" { \

+inline ENUMTYPE operator | (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) | ((int)b)); } \

+inline ENUMTYPE &operator |= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) |= ((int)b)); } \

+inline ENUMTYPE operator & (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) & ((int)b)); } \

+inline ENUMTYPE &operator &= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) &= ((int)b)); } \

+inline ENUMTYPE operator ~ (ENUMTYPE a) { return ENUMTYPE(~((int)a)); } \

+inline ENUMTYPE operator ^ (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) ^ ((int)b)); } \

+inline ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) ^= ((int)b)); } \

+}

+#endif

+

+#ifndef __field_ecount_opt

+#define __field_ecount_opt(x)

+#endif

+

+#ifndef __range

+#define __range(x,y) 

+#endif

+

+#ifndef __field_ecount

+#define __field_ecount(x)

+#endif

+

+/// <summary>

+/// The measuring method used for text layout.

+/// </summary>

+typedef enum DWRITE_MEASURING_MODE

+{

+    /// <summary>

+    /// Text is measured using glyph ideal metrics whose values are independent to the current display resolution.

+    /// </summary>

+    DWRITE_MEASURING_MODE_NATURAL,

+

+    /// <summary>

+    /// Text is measured using glyph display compatible metrics whose values tuned for the current display resolution.

+    /// </summary>

+    DWRITE_MEASURING_MODE_GDI_CLASSIC,

+

+    /// <summary>

+    /// Text is measured using the same glyph display metrics as text measured by GDI using a font

+    /// created with CLEARTYPE_NATURAL_QUALITY.

+    /// </summary>

+    DWRITE_MEASURING_MODE_GDI_NATURAL

+

+} DWRITE_MEASURING_MODE;

+

+#endif /* DCOMMON_H_INCLUDED */

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlus.h b/core/src/fxge/Microsoft SDK/include/GdiPlus.h
new file mode 100644
index 0000000..82393e7
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlus.h
@@ -0,0 +1,156 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   Gdiplus.h

+*

+* Abstract:

+*

+*   GDI+ Native C++ public header file

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUS_H

+#define _GDIPLUS_H

+

+struct IDirectDrawSurface7;

+

+typedef signed   short   INT16;

+typedef unsigned short  UINT16;

+

+#ifndef DCR_REMOVE_INTERNAL

+

+#ifndef DCR_USE_NEW_105760

+ #define DCR_USE_NEW_105760

+#endif

+#ifndef DCR_USE_NEW_127084

+ #define DCR_USE_NEW_127084

+#endif

+#ifndef DCR_USE_NEW_135429

+ #define DCR_USE_NEW_135429

+#endif

+#ifndef DCR_USE_NEW_140782

+ #define DCR_USE_NEW_140782

+#endif

+#ifndef DCR_USE_NEW_140855

+ #define DCR_USE_NEW_140855

+#endif

+#ifndef DCR_USE_NEW_140857

+ #define DCR_USE_NEW_140857

+#endif

+#ifndef DCR_USE_NEW_140861

+ #define DCR_USE_NEW_140861

+#endif

+#ifndef DCR_USE_NEW_145135

+ #define DCR_USE_NEW_145135

+#endif

+#ifndef DCR_USE_NEW_145138

+ #define DCR_USE_NEW_145138

+#endif

+#ifndef DCR_USE_NEW_145139

+ #define DCR_USE_NEW_145139

+#endif

+#ifndef DCR_USE_NEW_145804

+ #define DCR_USE_NEW_145804

+#endif

+#ifndef DCR_USE_NEW_146933

+ #define DCR_USE_NEW_146933

+#endif

+#ifndef DCR_USE_NEW_152154

+ #define DCR_USE_NEW_152154

+#endif

+#ifndef DCR_USE_NEW_175866

+ #define DCR_USE_NEW_175866

+#endif

+

+#ifndef DCR_USE_NEW_188922

+ #define DCR_USE_NEW_188922

+#endif

+#ifndef DCR_USE_NEW_137252

+ #define DCR_USE_NEW_137252

+#endif

+#ifndef DCR_USE_NEW_202903

+ #define DCR_USE_NEW_202903

+#endif

+#ifndef DCR_USE_NEW_197819

+ #define DCR_USE_NEW_197819

+#endif

+#ifndef DCR_USE_NEW_186091

+ #define DCR_USE_NEW_186091

+#endif

+#ifndef DCR_USE_NEW_125467

+ #define DCR_USE_NEW_125467

+#endif

+#ifndef DCR_USE_NEW_168772

+ #define DCR_USE_NEW_168772

+#endif

+#ifndef DCR_USE_NEW_186764 

+ #define DCR_USE_NEW_186764 

+#endif

+#ifndef DCR_USE_NEW_174340

+ #define DCR_USE_NEW_174340

+#endif

+#ifndef DCR_USE_NEW_186151

+ #define DCR_USE_NEW_186151

+#endif

+

+#ifndef DCR_USE_NEW_235072

+ #define DCR_USE_NEW_235072

+#endif

+

+#endif // DCR_REMOVE_INTERNAL

+

+namespace Gdiplus

+{

+    namespace DllExports

+    {

+        #include "GdiplusMem.h"

+    };

+

+    #include "GdiplusBase.h"

+

+    // The following headers are used internally as well

+    #include "GdiplusEnums.h"

+    #include "GdiplusTypes.h"

+    #include "GdiplusInit.h"

+    #include "GdiplusPixelFormats.h"

+    #include "GdiplusColor.h"

+    #include "GdiplusMetaHeader.h"

+    #include "GdiplusImaging.h"

+    #include "GdiplusColorMatrix.h"

+

+    // The rest of these are used only by the application

+

+    #include "GdiplusGpStubs.h"

+    #include "GdiplusHeaders.h"

+

+    namespace DllExports

+    {

+        #include "GdiplusFlat.h"

+    };

+

+

+    #include "GdiplusImageAttributes.h"

+    #include "GdiplusMatrix.h"

+    #include "GdiplusBrush.h"

+    #include "GdiplusPen.h"

+    #include "GdiplusStringFormat.h"

+    #include "GdiplusPath.h"

+    #include "GdiplusLineCaps.h"

+    #include "GdiplusMetafile.h"

+    #include "GdiplusGraphics.h"

+    #include "GdiplusCachedBitmap.h"

+    #include "GdiplusRegion.h"

+    #include "GdiplusFontCollection.h"

+    #include "GdiplusFontFamily.h"

+    #include "GdiplusFont.h"

+    #include "GdiplusBitmap.h"

+    #include "GdiplusImageCodec.h"

+

+}; // namespace Gdiplus

+

+

+

+#endif // !_GDIPLUS_HPP

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h b/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h
new file mode 100644
index 0000000..40a977d
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h
@@ -0,0 +1,40 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusBase.h

+*

+* Abstract:

+*

+*   Represents the base class for GDIPlus memory allocation. 

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSBASE_H

+#define _GDIPLUSBASE_H

+

+class GdiplusBase

+{

+public:

+    void (operator delete)(void* in_pVoid)

+    {

+       DllExports::GdipFree(in_pVoid);

+    }

+    void* (operator new)(size_t in_size)

+    {

+       return DllExports::GdipAlloc(in_size);

+    }

+    void (operator delete[])(void* in_pVoid)

+    {

+       DllExports::GdipFree(in_pVoid);

+    }

+    void* (operator new[])(size_t in_size)

+    {

+       return DllExports::GdipAlloc(in_size);

+    }

+};

+

+#endif 

+

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h b/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h
new file mode 100644
index 0000000..fbe0061
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h
@@ -0,0 +1,1004 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusBitmap.h

+*

+* Abstract:

+*

+*   Bitmap related declarations

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSBITMAP_H

+#define _GDIPLUSBITMAP_H

+

+// NOTE:

+//  Our current choice for the public API is to use constructors

+//  instead of static load functions to create image objects.

+//

+//  I've kept the static load functions here for now so that

+//  existing test programs are not broken. But they should

+//  eventually be taken out.

+

+#ifndef DCR_USE_NEW_140782

+

+inline 

+Image::Image(

+    IN const WCHAR* filename

+    )

+{

+    nativeImage = NULL;

+    lastResult = DllExports::GdipLoadImageFromFile(filename, &nativeImage);

+}

+

+inline 

+Image::Image(

+    IN IStream* stream

+    )

+{

+    nativeImage = NULL;

+    lastResult = DllExports::GdipLoadImageFromStream(stream, &nativeImage);

+}

+

+inline Image* 

+Image::FromFile(

+    IN const WCHAR* filename

+    )

+{

+    return new Image(filename);

+}

+

+inline Image*

+Image::FromStream(

+    IN IStream* stream

+    )

+{

+    return new Image(stream);

+}

+

+#else

+

+inline 

+Image::Image(

+    IN const WCHAR* filename,

+    IN BOOL useEmbeddedColorManagement

+    )

+{

+    nativeImage = NULL;

+    if(useEmbeddedColorManagement)

+    {

+        lastResult = DllExports::GdipLoadImageFromFileICM(

+            filename, 

+            &nativeImage

+        );

+    }

+    else

+    {      

+        lastResult = DllExports::GdipLoadImageFromFile(

+            filename, 

+            &nativeImage

+        );

+    }

+}

+

+inline 

+Image::Image(

+    IN IStream* stream,

+    IN BOOL useEmbeddedColorManagement

+    )

+{

+    nativeImage = NULL;

+    if(useEmbeddedColorManagement)

+    {

+        lastResult = DllExports::GdipLoadImageFromStreamICM(

+            stream, 

+            &nativeImage

+        );

+    }

+    else

+    {

+        lastResult = DllExports::GdipLoadImageFromStream(

+            stream, 

+            &nativeImage

+        );

+    }

+}

+

+inline Image* 

+Image::FromFile(

+    IN const WCHAR* filename,

+    IN BOOL useEmbeddedColorManagement

+    )

+{

+    return new Image(

+        filename, 

+        useEmbeddedColorManagement

+    );

+}

+

+inline Image*

+Image::FromStream(

+    IN IStream* stream,

+    IN BOOL useEmbeddedColorManagement

+    )

+{

+    return new Image(

+        stream,

+        useEmbeddedColorManagement

+    );

+}

+

+#endif

+

+inline 

+Image::~Image()

+{

+    DllExports::GdipDisposeImage(nativeImage);

+}

+

+inline Image* 

+Image::Clone() 

+{

+    GpImage *cloneimage = NULL;

+

+    SetStatus(DllExports::GdipCloneImage(nativeImage, &cloneimage));

+

+    return new Image(cloneimage, lastResult);

+}

+

+// Encorder Parameter

+

+inline UINT

+Image::GetEncoderParameterListSize(

+    IN const CLSID* clsidEncoder

+    ) 

+{

+    UINT size = 0;

+

+    SetStatus(DllExports::GdipGetEncoderParameterListSize(nativeImage,

+                                                          clsidEncoder,

+                                                          &size));

+    return size;

+}

+

+inline Status

+Image::GetEncoderParameterList(

+    IN const CLSID* clsidEncoder,

+    IN UINT size,

+    OUT EncoderParameters* buffer

+    )

+{

+    return SetStatus(DllExports::GdipGetEncoderParameterList(nativeImage,

+                                                             clsidEncoder,

+                                                             size,

+                                                             buffer));

+}

+

+// Save images

+

+inline Status

+Image::Save(

+    IN const WCHAR* filename,

+    IN const CLSID* clsidEncoder,

+    IN const EncoderParameters *encoderParams

+    )

+{

+    return SetStatus(DllExports::GdipSaveImageToFile(nativeImage,

+                                                     filename,

+                                                     clsidEncoder,

+                                                     encoderParams));

+}

+

+inline Status

+Image::Save(

+    IN IStream* stream,

+    IN const CLSID* clsidEncoder,

+    IN const EncoderParameters *encoderParams

+    )

+{

+    return SetStatus(DllExports::GdipSaveImageToStream(nativeImage,

+                                                       stream,

+                                                       clsidEncoder,

+                                                       encoderParams));

+}

+

+inline Status

+Image::SaveAdd(

+    IN const EncoderParameters *encoderParams

+    )

+{

+    return SetStatus(DllExports::GdipSaveAdd(nativeImage,

+                                             encoderParams));

+}

+

+inline Status

+Image::SaveAdd(

+    IN Image* newImage,

+    IN const EncoderParameters *encoderParams

+    )

+{

+    if ( newImage == NULL )

+    {

+        return SetStatus(InvalidParameter);

+    }

+

+    return SetStatus(DllExports::GdipSaveAddImage(nativeImage,

+                                                  newImage->nativeImage,

+                                                  encoderParams));

+}

+

+// Get size and type information

+inline ImageType 

+Image::GetType() const

+{

+    ImageType type = ImageTypeUnknown;

+

+    SetStatus(DllExports::GdipGetImageType(nativeImage, &type));

+

+    return type;

+}

+

+inline Status 

+Image::GetPhysicalDimension(

+    OUT SizeF* size

+    ) 

+{

+    if (size == NULL) 

+    {

+        return SetStatus(InvalidParameter);

+    }

+    

+    REAL width, height;

+    Status status;

+

+    status = SetStatus(DllExports::GdipGetImageDimension(nativeImage,

+                                                         &width, &height));

+

+    size->Width  = width;

+    size->Height = height;

+

+    return status;

+}

+

+inline Status 

+Image::GetBounds(

+    OUT RectF *srcRect, 

+    OUT Unit *srcUnit

+    )

+{

+    return SetStatus(DllExports::GdipGetImageBounds(nativeImage,

+                                                    srcRect, srcUnit));

+}

+

+inline UINT 

+Image::GetWidth()

+{

+    UINT width = 0;

+

+    SetStatus(DllExports::GdipGetImageWidth(nativeImage, &width));

+

+    return width;

+}

+

+inline UINT 

+Image::GetHeight()

+{

+    UINT height = 0;

+

+    SetStatus(DllExports::GdipGetImageHeight(nativeImage, &height));

+

+    return height;

+}

+

+inline REAL 

+Image::GetHorizontalResolution()

+{

+    REAL resolution = 0.0f;

+

+    SetStatus(DllExports::GdipGetImageHorizontalResolution(nativeImage, &resolution));

+

+    return resolution;

+}

+

+inline REAL 

+Image::GetVerticalResolution()

+{

+    REAL resolution = 0.0f;

+

+    SetStatus(DllExports::GdipGetImageVerticalResolution(nativeImage, &resolution));

+

+    return resolution;

+}

+

+inline UINT 

+Image::GetFlags()

+{

+    UINT flags = 0;

+

+    SetStatus(DllExports::GdipGetImageFlags(nativeImage, &flags));

+

+    return flags;

+}

+

+inline Status 

+Image::GetRawFormat(OUT GUID *format)

+{

+    return SetStatus(DllExports::GdipGetImageRawFormat(nativeImage, format));

+}

+

+inline PixelFormat 

+Image::GetPixelFormat()

+{

+    PixelFormat format;

+

+    SetStatus(DllExports::GdipGetImagePixelFormat(nativeImage, &format));

+

+    return format;

+}

+

+inline INT 

+Image::GetPaletteSize()

+{

+    INT size = 0;

+    

+    SetStatus(DllExports::GdipGetImagePaletteSize(nativeImage, &size));

+    

+    return size;

+}

+

+inline Status 

+Image::GetPalette(

+    OUT ColorPalette *palette,

+    IN INT size

+)

+{

+    return SetStatus(DllExports::GdipGetImagePalette(nativeImage, palette, size));

+}

+

+inline Status 

+Image::SetPalette(

+    IN const ColorPalette *palette

+    )

+{

+    return SetStatus(DllExports::GdipSetImagePalette(nativeImage, palette));

+}

+

+// Thumbnail support

+

+inline Image* 

+Image::GetThumbnailImage(

+    IN UINT thumbWidth,

+    IN UINT thumbHeight,

+    IN GetThumbnailImageAbort callback,

+    IN VOID* callbackData

+    )

+{

+    GpImage *thumbimage = NULL;

+

+    SetStatus(DllExports::GdipGetImageThumbnail(nativeImage,

+                                                thumbWidth, thumbHeight,

+                                                &thumbimage,

+                                                callback, callbackData));

+

+    Image *newImage = new Image(thumbimage, lastResult);

+

+    if (newImage == NULL) 

+    {

+        DllExports::GdipDisposeImage(thumbimage);

+    }

+

+    return newImage;

+}

+

+// Multi-frame support

+inline UINT 

+Image::GetFrameDimensionsCount()

+{

+    UINT count = 0;

+

+    SetStatus(DllExports::GdipImageGetFrameDimensionsCount(nativeImage,

+                                                                  &count));

+

+    return count;

+}

+

+inline Status 

+Image::GetFrameDimensionsList(

+    OUT GUID* dimensionIDs, 

+    IN UINT count

+    )

+{

+    return SetStatus(DllExports::GdipImageGetFrameDimensionsList(nativeImage,

+                                                                 dimensionIDs,

+                                                                 count));

+}

+

+inline UINT 

+Image::GetFrameCount(

+    IN const GUID* dimensionID

+    )

+{

+    UINT count = 0;

+

+    SetStatus(DllExports::GdipImageGetFrameCount(nativeImage,

+                                                        dimensionID,

+                                                        &count));

+    return count;

+}

+

+inline Status 

+Image::SelectActiveFrame(

+    IN const GUID *dimensionID, 

+    IN UINT frameIndex

+    )

+{

+    return SetStatus(DllExports::GdipImageSelectActiveFrame(nativeImage,

+                                                            dimensionID,

+                                                            frameIndex));

+}

+

+inline Status

+Image::RotateFlip(

+    IN RotateFlipType rotateFlipType

+    )

+{

+    return SetStatus(DllExports::GdipImageRotateFlip(nativeImage,

+                                                     rotateFlipType));

+}

+

+// Image property related functions

+

+inline UINT 

+Image::GetPropertyCount()

+{

+    UINT numProperty = 0;

+

+    SetStatus(DllExports::GdipGetPropertyCount(nativeImage,

+                                               &numProperty));

+

+    return numProperty;

+}

+

+inline Status 

+Image::GetPropertyIdList(

+    IN UINT numOfProperty, 

+    OUT PROPID* list

+    )

+{

+    return SetStatus(DllExports::GdipGetPropertyIdList(nativeImage,

+                                                       numOfProperty, list));

+}

+    

+inline UINT 

+Image::GetPropertyItemSize(

+    IN PROPID propId

+    )

+{

+    UINT size = 0;

+

+    SetStatus(DllExports::GdipGetPropertyItemSize(nativeImage,

+                                                  propId,

+                                                  &size));

+

+    return size;

+}

+

+inline Status 

+Image::GetPropertyItem(

+    IN PROPID propId, 

+    IN UINT propSize,

+    OUT PropertyItem* buffer

+    )

+{

+    return SetStatus(DllExports::GdipGetPropertyItem(nativeImage,

+                                                     propId, propSize, buffer));

+}

+

+inline Status 

+Image::GetPropertySize(

+    OUT UINT* totalBufferSize, 

+    OUT UINT* numProperties

+    )

+{

+    return SetStatus(DllExports::GdipGetPropertySize(nativeImage,

+                                                     totalBufferSize,

+                                                     numProperties));

+}

+

+inline Status 

+Image::GetAllPropertyItems(

+    IN UINT totalBufferSize,

+    IN UINT numProperties,

+    OUT PropertyItem* allItems

+    )

+{

+    if (allItems == NULL) 

+    {

+        return SetStatus(InvalidParameter);

+    }

+    return SetStatus(DllExports::GdipGetAllPropertyItems(nativeImage,

+                                                         totalBufferSize,

+                                                         numProperties,

+                                                         allItems));

+}

+

+inline Status 

+Image::RemovePropertyItem(

+    IN PROPID propId

+    )

+{

+    return SetStatus(DllExports::GdipRemovePropertyItem(nativeImage, propId));

+}

+

+inline Status 

+Image::SetPropertyItem(

+    IN const PropertyItem* item

+    )

+{

+    return SetStatus(DllExports::GdipSetPropertyItem(nativeImage, item));

+}

+

+// Get/SetLayout

+// Support for Middle East localization (right-to-left mirroring)

+

+inline ImageLayout

+Image::GetLayout() const

+{

+    ImageLayout layout;

+

+    SetStatus(DllExports::GdipGetImageLayout(nativeImage, &layout));

+

+    return layout;

+}

+

+inline Status

+Image::SetLayout(IN const ImageLayout layout)

+{

+    return SetStatus(

+        DllExports::GdipSetImageLayout(nativeImage, layout)

+    );

+}

+

+inline Status

+Image::GetLastStatus() const

+{

+    Status lastStatus = lastResult;

+    lastResult = Ok;

+

+    return lastStatus;

+}

+

+inline 

+Image::Image(GpImage *nativeImage, Status status)

+{

+    SetNativeImage(nativeImage);

+    lastResult = status;

+}

+

+inline VOID 

+Image::SetNativeImage(GpImage *nativeImage)

+{

+    this->nativeImage = nativeImage;

+}

+

+inline 

+Bitmap::Bitmap(

+    IN const WCHAR *filename, 

+    IN BOOL useEmbeddedColorManagement

+    )

+{

+    GpBitmap *bitmap = NULL;

+

+    if(useEmbeddedColorManagement) 

+    {

+        lastResult = DllExports::GdipCreateBitmapFromFileICM(filename, &bitmap);

+    }

+    else

+    {

+        lastResult = DllExports::GdipCreateBitmapFromFile(filename, &bitmap);

+    }

+

+    SetNativeImage(bitmap);

+}

+

+inline 

+Bitmap::Bitmap(

+    IN IStream *stream, 

+    IN BOOL useEmbeddedColorManagement

+    )

+{

+    GpBitmap *bitmap = NULL;

+

+    if(useEmbeddedColorManagement)

+    {

+        lastResult = DllExports::GdipCreateBitmapFromStreamICM(stream, &bitmap);

+    }

+    else

+    {

+        lastResult = DllExports::GdipCreateBitmapFromStream(stream, &bitmap);

+    }

+

+    SetNativeImage(bitmap);

+}

+

+inline

+Bitmap::Bitmap(

+    IN INT width,

+    IN INT height,

+    IN INT stride,

+    IN PixelFormat format,

+    IN BYTE *scan0

+    )

+{

+    GpBitmap *bitmap = NULL;

+

+    lastResult = DllExports::GdipCreateBitmapFromScan0(width,

+                                                       height,

+                                                       stride,

+                                                       format,

+                                                       scan0,

+                                                       &bitmap);

+

+    SetNativeImage(bitmap);

+}

+

+inline 

+Bitmap::Bitmap(

+    IN INT width,

+    IN INT height,

+    IN PixelFormat format

+    )

+{

+    GpBitmap *bitmap = NULL;

+

+    lastResult = DllExports::GdipCreateBitmapFromScan0(width,

+                                                       height,

+                                                       0,

+                                                       format,

+                                                       NULL,

+                                                       &bitmap);

+

+    SetNativeImage(bitmap);

+}

+

+inline

+Bitmap::Bitmap(

+    IN INT width, 

+    IN INT height, 

+    IN Graphics* target)

+{

+    GpBitmap *bitmap = NULL;

+

+    lastResult = DllExports::GdipCreateBitmapFromGraphics(width,

+                                                          height,

+                                                          target->nativeGraphics,

+                                                          &bitmap);

+

+    SetNativeImage(bitmap);

+}

+

+inline 

+Bitmap::Bitmap(

+    IN IDirectDrawSurface7 * surface

+    )

+{

+    GpBitmap *bitmap = NULL;

+

+    lastResult = DllExports::GdipCreateBitmapFromDirectDrawSurface(surface,

+                                                       &bitmap);

+

+    SetNativeImage(bitmap);

+}

+

+inline 

+Bitmap::Bitmap(

+    IN const BITMAPINFO* gdiBitmapInfo, 

+    IN VOID* gdiBitmapData

+    )

+{

+    GpBitmap *bitmap = NULL;

+

+    lastResult = DllExports::GdipCreateBitmapFromGdiDib(gdiBitmapInfo,

+                                                        gdiBitmapData,

+                                                        &bitmap);

+

+    SetNativeImage(bitmap);

+}

+

+inline 

+Bitmap::Bitmap(

+    IN HBITMAP hbm, 

+    IN HPALETTE hpal

+    )

+{

+    GpBitmap *bitmap = NULL;

+

+    lastResult = DllExports::GdipCreateBitmapFromHBITMAP(hbm, hpal, &bitmap);

+

+    SetNativeImage(bitmap);

+}

+

+inline 

+Bitmap::Bitmap(

+    IN HICON hicon

+    )

+{

+    GpBitmap *bitmap = NULL;

+

+    lastResult = DllExports::GdipCreateBitmapFromHICON(hicon, &bitmap);

+

+    SetNativeImage(bitmap);

+}

+

+inline 

+Bitmap::Bitmap(

+    IN HINSTANCE hInstance, 

+    IN const WCHAR *bitmapName

+    )

+{

+    GpBitmap *bitmap = NULL;

+

+    lastResult = DllExports::GdipCreateBitmapFromResource(hInstance,

+                                                          bitmapName,

+                                                          &bitmap);

+

+    SetNativeImage(bitmap);

+}

+

+

+inline Bitmap* 

+Bitmap::FromFile(

+    IN const WCHAR *filename,

+    IN BOOL useEmbeddedColorManagement

+    )

+{

+    return new Bitmap(

+        filename, 

+        useEmbeddedColorManagement

+    );

+}

+

+inline Bitmap* 

+Bitmap::FromStream(

+    IN IStream *stream,

+    IN BOOL useEmbeddedColorManagement

+    )

+{

+    return new Bitmap(

+        stream, 

+        useEmbeddedColorManagement

+    );

+}

+

+inline Bitmap* 

+Bitmap::FromDirectDrawSurface7(

+    IN IDirectDrawSurface7* surface

+    )

+{

+    return new Bitmap(surface);

+}

+

+inline Bitmap* 

+Bitmap::FromBITMAPINFO(

+    IN const BITMAPINFO* gdiBitmapInfo, 

+    IN VOID* gdiBitmapData)

+{

+    return new Bitmap(gdiBitmapInfo, gdiBitmapData);

+}

+

+inline Bitmap* 

+Bitmap::FromHBITMAP(

+    IN HBITMAP hbm, 

+    IN HPALETTE hpal

+    )

+{

+    return new Bitmap(hbm, hpal);

+}

+

+inline Bitmap* 

+Bitmap::FromHICON(

+    IN HICON hicon

+    )

+{

+    return new Bitmap(hicon);

+}

+

+inline Bitmap* 

+Bitmap::FromResource(

+    IN HINSTANCE hInstance, 

+    IN const WCHAR *bitmapName)

+{

+    return new Bitmap(hInstance, bitmapName);

+}

+

+inline Status 

+Bitmap::GetHBITMAP(

+    IN const Color& colorBackground,

+    OUT HBITMAP* hbmReturn

+    )

+{

+    return SetStatus(DllExports::GdipCreateHBITMAPFromBitmap(

+                                        static_cast<GpBitmap*>(nativeImage),

+                                        hbmReturn,

+                                        colorBackground.GetValue()));

+}

+

+inline Status 

+Bitmap::GetHICON(

+    OUT HICON* hiconReturn

+    )

+{

+    return SetStatus(DllExports::GdipCreateHICONFromBitmap(

+                                        static_cast<GpBitmap*>(nativeImage),

+                                        hiconReturn));

+}

+

+inline Bitmap* 

+Bitmap::Clone(

+    IN const Rect& rect,

+    IN PixelFormat format

+    )

+{

+    return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);

+}

+

+inline Bitmap* 

+Bitmap::Clone(

+    IN INT x,

+    IN INT y,

+    IN INT width,

+    IN INT height,

+    IN PixelFormat format

+    )

+{

+   GpBitmap* gpdstBitmap = NULL;

+   Bitmap* bitmap;

+

+   lastResult = DllExports::GdipCloneBitmapAreaI(

+                               x,

+                               y,

+                               width,

+                               height,

+                               format,

+                               (GpBitmap *)nativeImage,

+                               &gpdstBitmap);

+

+   if (lastResult == Ok)

+   {

+       bitmap = new Bitmap(gpdstBitmap);

+

+       if (bitmap == NULL) 

+       {

+           DllExports::GdipDisposeImage(gpdstBitmap);

+       }

+

+       return bitmap;

+   }

+   else

+       return NULL;

+}

+

+inline Bitmap* 

+Bitmap::Clone(

+    IN const RectF& rect,

+    IN PixelFormat format

+    )

+{

+    return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);

+}

+

+inline Bitmap*

+Bitmap::Clone(

+    IN REAL x,

+    IN REAL y,

+    IN REAL width,

+    IN REAL height,

+    IN PixelFormat format

+    )

+{

+   GpBitmap* gpdstBitmap = NULL;

+   Bitmap* bitmap;

+

+   SetStatus(DllExports::GdipCloneBitmapArea(

+                               x,

+                               y,

+                               width,

+                               height,

+                               format,

+                               (GpBitmap *)nativeImage,

+                               &gpdstBitmap));

+

+   if (lastResult == Ok)

+   {

+       bitmap = new Bitmap(gpdstBitmap);

+

+       if (bitmap == NULL) 

+       {

+           DllExports::GdipDisposeImage(gpdstBitmap);

+       }

+

+       return bitmap;

+   }

+   else

+       return NULL;

+}

+

+inline Bitmap::Bitmap(GpBitmap *nativeBitmap)

+{

+    lastResult = Ok;

+

+    SetNativeImage(nativeBitmap);

+}

+

+inline Status

+Bitmap::LockBits(

+    IN const Rect& rect,

+    IN UINT flags,

+    IN PixelFormat format,

+    OUT BitmapData* lockedBitmapData

+)

+{

+    return SetStatus(DllExports::GdipBitmapLockBits(

+                                    static_cast<GpBitmap*>(nativeImage),

+                                    &rect,

+                                    flags,

+                                    format,

+                                    lockedBitmapData));

+}

+

+inline Status 

+Bitmap::UnlockBits(

+    IN BitmapData* lockedBitmapData

+    )

+{

+    return SetStatus(DllExports::GdipBitmapUnlockBits(

+                                    static_cast<GpBitmap*>(nativeImage),

+                                    lockedBitmapData));

+}

+

+inline Status 

+Bitmap::GetPixel(

+    IN INT x, 

+    IN INT y, 

+    OUT Color *color) 

+{

+    ARGB argb;

+

+    Status status = SetStatus(DllExports::GdipBitmapGetPixel(

+        static_cast<GpBitmap *>(nativeImage),

+        x, y,        

+        &argb));

+

+    if (status == Ok) 

+    {

+        color->SetValue(argb);

+    }

+

+    return  status;

+}

+

+inline Status 

+Bitmap::SetPixel(

+    IN INT x, 

+    IN INT y, 

+    IN const Color& color) 

+{

+    return SetStatus(DllExports::GdipBitmapSetPixel(

+        static_cast<GpBitmap *>(nativeImage),

+        x, y,

+        color.GetValue()));

+}

+

+inline Status 

+Bitmap::SetResolution(

+    IN REAL xdpi, 

+    IN REAL ydpi)

+{

+    return SetStatus(DllExports::GdipBitmapSetResolution(

+        static_cast<GpBitmap *>(nativeImage),

+        xdpi, ydpi));

+}

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h b/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h
new file mode 100644
index 0000000..a506f87
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h
@@ -0,0 +1,951 @@
+/**************************************************************************\

+* 

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusBrush.h

+*

+* Abstract:

+*

+*   Brush API related declarations

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSBRUSH_H

+#define _GDIPLUSBRUSH_H

+

+//--------------------------------------------------------------------------

+// Abstract base class for various brush types

+//--------------------------------------------------------------------------

+

+class GraphicsPath;

+

+class Brush : public GdiplusBase

+{

+public:

+    friend class Pen;

+    friend class Graphics;

+

+    virtual ~Brush()

+    {

+        DllExports::GdipDeleteBrush(nativeBrush);

+    }

+

+    virtual Brush* Clone() const

+    {

+        GpBrush *brush = NULL;

+

+        SetStatus(DllExports::GdipCloneBrush(nativeBrush, &brush));

+

+        Brush *newBrush = new Brush(brush, lastResult);

+        

+        if (newBrush == NULL) 

+        {

+            DllExports::GdipDeleteBrush(brush);

+        }

+

+        return newBrush;

+    }

+

+    BrushType GetType() const

+    {

+        BrushType type = static_cast<BrushType>(-1);

+

+        SetStatus(DllExports::GdipGetBrushType(nativeBrush, &type));

+

+        return type;

+    }

+

+    Status GetLastStatus() const

+    {

+        Status lastStatus = lastResult;

+        lastResult = Ok;

+

+        return lastStatus;

+    }

+

+protected:

+

+    Brush()

+    {

+        SetStatus(NotImplemented);

+    }

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    Brush(const Brush& brush);

+    Brush& operator=(const Brush& brush);

+protected:

+

+#else

+

+    Brush(const Brush& brush)

+    {

+        brush;

+        SetStatus(NotImplemented);

+    }

+

+    Brush& operator=(const Brush& brush)

+    {

+        brush;

+        SetStatus(NotImplemented);

+        return *this;

+    }

+

+#endif

+

+    Brush(GpBrush* nativeBrush, Status status)

+    {

+        lastResult = status;

+        SetNativeBrush(nativeBrush);

+    }

+

+    VOID SetNativeBrush(GpBrush* nativeBrush)

+    {

+        this->nativeBrush = nativeBrush;

+    }

+

+    Status SetStatus(Status status) const

+    {

+        if (status != Ok)

+            return (lastResult = status);

+        else

+            return status;

+    }

+

+    GpBrush* nativeBrush;

+    mutable Status lastResult;

+};

+

+//--------------------------------------------------------------------------

+// Represent solid fill brush object

+//--------------------------------------------------------------------------

+

+class SolidBrush : public Brush

+{

+public:

+    friend class Pen;

+

+    SolidBrush(IN const Color& color)

+    {

+        GpSolidFill *brush = NULL;

+

+        lastResult = DllExports::GdipCreateSolidFill(color.GetValue(), &brush);

+

+        SetNativeBrush(brush);

+    }

+

+    Status GetColor(OUT Color* color) const

+    {

+        ARGB argb;

+

+        if (color == NULL) 

+        {

+            return SetStatus(InvalidParameter);

+        }

+

+        SetStatus(DllExports::GdipGetSolidFillColor((GpSolidFill*)nativeBrush,

+                                                    &argb));

+

+        *color = Color(argb);

+

+        return lastResult;

+    }

+

+    Status SetColor(IN const Color& color)

+    {

+        return SetStatus(DllExports::GdipSetSolidFillColor((GpSolidFill*)nativeBrush, 

+                                                           color.GetValue()));

+    }

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    SolidBrush(const SolidBrush &);

+    SolidBrush& operator=(const SolidBrush &);

+

+#endif

+

+protected:

+

+    SolidBrush()

+    {

+    }

+};

+

+class TextureBrush : public Brush

+{

+public:

+    friend class Pen;

+

+    TextureBrush(IN Image* image, 

+                 IN WrapMode wrapMode = WrapModeTile)

+    {

+        GpTexture *texture = NULL;

+

+        lastResult = DllExports::GdipCreateTexture(

+                                                  image->nativeImage,

+                                                  wrapMode, &texture);

+

+        SetNativeBrush(texture);

+    }

+

+    // When creating a texture brush from a metafile image, the dstRect

+    // is used to specify the size that the metafile image should be

+    // rendered at in the device units of the destination graphics.

+    // It is NOT used to crop the metafile image, so only the width 

+    // and height values matter for metafiles.

+    TextureBrush(IN Image* image, 

+                 IN WrapMode wrapMode,

+                 IN const RectF &dstRect)

+    {

+        GpTexture *texture = NULL;

+

+        lastResult = DllExports::GdipCreateTexture2(

+                                                   image->nativeImage,

+                                                   wrapMode, 

+                                                   dstRect.X, 

+                                                   dstRect.Y, 

+                                                   dstRect.Width, 

+                                                   dstRect.Height,

+                                                   &texture);

+

+        SetNativeBrush(texture);

+    }

+    

+    // When creating a texture brush from a metafile image, the dstRect

+    // is used to specify the size that the metafile image should be

+    // rendered at in the device units of the destination graphics.

+    // It is NOT used to crop the metafile image, so only the width 

+    // and height values matter for metafiles.

+

+    TextureBrush(IN Image *image, 

+                 IN const RectF &dstRect,

+                 IN const ImageAttributes *imageAttributes = NULL)

+    {

+        GpTexture *texture = NULL;

+

+        lastResult = DllExports::GdipCreateTextureIA(

+            image->nativeImage,

+            (imageAttributes)?imageAttributes->nativeImageAttr:NULL,

+            dstRect.X, 

+            dstRect.Y, 

+            dstRect.Width, 

+            dstRect.Height,

+            &texture

+        );

+

+        SetNativeBrush(texture);

+    }

+    

+    #ifdef DCR_USE_NEW_145138

+    TextureBrush(IN Image *image, 

+                 IN const Rect &dstRect,

+                 IN const ImageAttributes *imageAttributes = NULL)

+    {

+        GpTexture *texture = NULL;

+

+        lastResult = DllExports::GdipCreateTextureIAI(

+            image->nativeImage,

+            (imageAttributes)?imageAttributes->nativeImageAttr:NULL,

+            dstRect.X, 

+            dstRect.Y, 

+            dstRect.Width, 

+            dstRect.Height,

+            &texture

+        );

+

+        SetNativeBrush(texture);

+    }

+    #endif

+

+    // When creating a texture brush from a metafile image, the dstRect

+    // is used to specify the size that the metafile image should be

+    // rendered at in the device units of the destination graphics.

+    // It is NOT used to crop the metafile image, so only the width 

+    // and height values matter for metafiles.

+

+    TextureBrush(

+        IN Image* image,

+        IN WrapMode wrapMode,

+        

+        #ifdef DCR_USE_NEW_145138       

+        const IN Rect &dstRect

+        #else

+        IN Rect &dstRect

+        #endif

+    )

+    {

+        GpTexture *texture = NULL;

+

+        lastResult = DllExports::GdipCreateTexture2I(

+                                                    image->nativeImage,

+                                                    wrapMode, 

+                                                    dstRect.X, 

+                                                    dstRect.Y, 

+                                                    dstRect.Width, 

+                                                    dstRect.Height,

+                                                    &texture);

+

+        SetNativeBrush(texture);

+    }

+

+    // When creating a texture brush from a metafile image, the dstRect

+    // is used to specify the size that the metafile image should be

+    // rendered at in the device units of the destination graphics.

+    // It is NOT used to crop the metafile image, so only the width 

+    // and height values matter for metafiles.

+    TextureBrush(IN Image* image, 

+                 IN WrapMode wrapMode, 

+                 IN REAL dstX, 

+                 IN REAL dstY, 

+                 IN REAL dstWidth, 

+                 IN REAL dstHeight)

+    {

+        GpTexture *texture = NULL;

+

+        lastResult = DllExports::GdipCreateTexture2(

+                                                   image->nativeImage,

+                                                   wrapMode, 

+                                                   dstX, 

+                                                   dstY, 

+                                                   dstWidth, 

+                                                   dstHeight,

+                                                   &texture);

+

+        SetNativeBrush(texture);

+    }

+

+    // When creating a texture brush from a metafile image, the dstRect

+    // is used to specify the size that the metafile image should be

+    // rendered at in the device units of the destination graphics.

+    // It is NOT used to crop the metafile image, so only the width 

+    // and height values matter for metafiles.

+    TextureBrush(IN Image* image, 

+                 IN WrapMode wrapMode, 

+                 IN INT dstX, 

+                 IN INT dstY, 

+                 IN INT dstWidth, 

+                 IN INT dstHeight)

+    {

+        GpTexture *texture = NULL;

+

+        lastResult = DllExports::GdipCreateTexture2I(

+                                                    image->nativeImage,

+                                                    wrapMode, 

+                                                    dstX, 

+                                                    dstY, 

+                                                    dstWidth, 

+                                                    dstHeight,

+                                                    &texture);

+

+        SetNativeBrush(texture);

+    }

+

+    /**

+     * Set/get brush transform

+     */

+    Status SetTransform(IN const Matrix* matrix)

+    {

+        return SetStatus(DllExports::GdipSetTextureTransform((GpTexture*)nativeBrush, 

+                                                             matrix->nativeMatrix));

+    }

+

+    Status GetTransform(OUT Matrix* matrix) const

+    {

+        return SetStatus(DllExports::GdipGetTextureTransform((GpTexture*)nativeBrush, 

+                                                             matrix->nativeMatrix));

+    }

+

+    Status ResetTransform()

+    {

+        return SetStatus(DllExports::GdipResetTextureTransform((GpTexture*)nativeBrush));

+    }

+

+    Status MultiplyTransform(IN const Matrix* matrix,

+                             IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipMultiplyTextureTransform((GpTexture*)nativeBrush,

+                                                                matrix->nativeMatrix,

+                                                                order));

+    }

+

+    Status TranslateTransform(IN REAL dx,

+                              IN REAL dy,

+                              IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipTranslateTextureTransform((GpTexture*)nativeBrush,

+                                                               dx, dy, order));

+    }

+

+    Status ScaleTransform(IN REAL sx, 

+                          IN REAL sy,

+                          IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipScaleTextureTransform((GpTexture*)nativeBrush,

+                                                             sx, sy, order));

+    }

+

+    Status RotateTransform(IN REAL angle, 

+                           IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipRotateTextureTransform((GpTexture*)nativeBrush,

+                                                              angle, order));

+    }

+

+    /**

+     * Set/get brush wrapping mode

+     */

+    Status SetWrapMode(IN WrapMode wrapMode)

+    {

+        return SetStatus(DllExports::GdipSetTextureWrapMode((GpTexture*)nativeBrush, 

+                                                            wrapMode));

+    }

+

+    WrapMode GetWrapMode() const

+    {

+        WrapMode wrapMode;

+

+        SetStatus(DllExports::GdipGetTextureWrapMode((GpTexture*)nativeBrush, 

+                                                     &wrapMode));

+        return wrapMode;

+    }

+

+    // Get texture brush attributes

+

+    Image *GetImage() const

+    {

+        GpImage *image;

+

+        SetStatus(DllExports::GdipGetTextureImage((GpTexture *)nativeBrush,

+                                                  &image));

+

+        Image *retimage = new Image(image, lastResult);

+

+        if (retimage == NULL) 

+        {

+            DllExports::GdipDisposeImage(image);

+        }

+

+        return retimage;

+    }

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    TextureBrush(const TextureBrush &);

+    TextureBrush& operator=(const TextureBrush &);

+

+#endif

+

+protected:

+

+    TextureBrush()

+    {

+    }

+};

+

+//--------------------------------------------------------------------------

+// Represent line gradient brush object

+//--------------------------------------------------------------------------

+

+class LinearGradientBrush : public Brush

+{

+public:

+    friend class Pen;

+

+    LinearGradientBrush(IN const PointF& point1,

+                        IN const PointF& point2,

+                        IN const Color& color1,

+                        IN const Color& color2)

+    {

+        GpLineGradient *brush = NULL;

+

+        lastResult = DllExports::GdipCreateLineBrush(&point1,

+                                                     &point2,

+                                                     color1.GetValue(),

+                                                     color2.GetValue(),

+                                                     WrapModeTile,

+                                                     &brush);

+

+        SetNativeBrush(brush);

+    }

+

+    LinearGradientBrush(IN const Point& point1,

+                        IN const Point& point2,

+                        IN const Color& color1,

+                        IN const Color& color2)

+    {

+        GpLineGradient *brush = NULL;

+

+        lastResult = DllExports::GdipCreateLineBrushI(&point1,

+                                                      &point2,

+                                                      color1.GetValue(),

+                                                      color2.GetValue(),

+                                                      WrapModeTile,

+                                                      &brush);

+

+        SetNativeBrush(brush);

+    }

+

+    LinearGradientBrush(IN const RectF& rect,

+                        IN const Color& color1,

+                        IN const Color& color2,

+                        IN LinearGradientMode mode)

+    {

+        GpLineGradient *brush = NULL;

+

+        lastResult = DllExports::GdipCreateLineBrushFromRect(&rect,

+                                                             color1.GetValue(),

+                                                             color2.GetValue(),

+                                                             mode,

+                                                             WrapModeTile,

+                                                             &brush);

+

+        SetNativeBrush(brush);

+    }

+

+    LinearGradientBrush(IN const Rect& rect,

+                        IN const Color& color1,

+                        IN const Color& color2,

+                        IN LinearGradientMode mode)

+    {

+        GpLineGradient *brush = NULL;

+

+        lastResult = DllExports::GdipCreateLineBrushFromRectI(&rect,

+                                                              color1.GetValue(),

+                                                              color2.GetValue(),

+                                                              mode,

+                                                              WrapModeTile,

+                                                              &brush);

+

+        SetNativeBrush(brush);

+    }

+

+    LinearGradientBrush(IN const RectF& rect,

+                        IN const Color& color1,

+                        IN const Color& color2,

+                        IN REAL angle,

+                        IN BOOL isAngleScalable = FALSE)

+    {

+        GpLineGradient *brush = NULL;

+

+        lastResult = DllExports::GdipCreateLineBrushFromRectWithAngle(&rect,

+                                                                      color1.GetValue(),

+                                                                      color2.GetValue(),

+                                                                      angle,

+                                                                      isAngleScalable,

+                                                                      WrapModeTile,

+                                                                      &brush);

+

+        SetNativeBrush(brush);

+    }

+

+    LinearGradientBrush(IN const Rect& rect,

+                        IN const Color& color1,

+                        IN const Color& color2,

+                        IN REAL angle,

+                        IN BOOL isAngleScalable = FALSE)

+    {

+        GpLineGradient *brush = NULL;

+

+        lastResult = DllExports::GdipCreateLineBrushFromRectWithAngleI(&rect,

+                                                                       color1.GetValue(),

+                                                                       color2.GetValue(),

+                                                                       angle,

+                                                                       isAngleScalable,

+                                                                       WrapModeTile,

+                                                                       &brush);

+

+        SetNativeBrush(brush);

+    }

+

+    // Get/set point attributes

+

+    Status SetLinearPoints(IN const PointF& point1, 

+                           IN const PointF& point2)

+    {

+        return SetStatus(DllExports::GdipSetLinePoints((GpLineGradient*)nativeBrush,

+                                                       &point1, &point2));

+    }

+

+    Status GetLinearPoints(OUT PointF* points) const 

+    {

+        return SetStatus(DllExports::GdipGetLinePoints((GpLineGradient*) nativeBrush,

+                                                       points));

+    }

+

+    Status SetLinearPoints(IN const Point& point1, 

+                           IN const Point& point2)

+    {

+        return SetStatus(DllExports::GdipSetLinePointsI((GpLineGradient*)nativeBrush,

+                                                        &point1, &point2));

+    }

+

+    Status GetLinearPoints(OUT Point* points) const

+    {

+        return SetStatus(DllExports::GdipGetLinePointsI((GpLineGradient*) nativeBrush,

+                                                        points));

+    }

+    // Get/set color attributes

+

+    Status SetLinearColors(IN const Color& color1, 

+                           IN const Color& color2)

+    {

+        return SetStatus(DllExports::GdipSetLineColors((GpLineGradient*)nativeBrush,

+                                                       color1.GetValue(),

+                                                       color2.GetValue()));

+    }

+

+    Status GetLinearColors(OUT Color* colors) const

+    {

+        ARGB argb[2];

+

+        if (colors == NULL) 

+        {

+            return SetStatus(InvalidParameter);

+        }

+        

+        SetStatus(DllExports::GdipGetLineColors((GpLineGradient*) nativeBrush, argb));

+

+        if (lastResult == Ok)

+        {

+            // use bitwise copy operator for Color copy

+            colors[0] = Color(argb[0]);

+            colors[1] = Color(argb[1]);

+        }

+

+        return lastResult;

+    }

+

+    Status GetRectangle(OUT RectF* rect) const

+    {

+        return SetStatus(DllExports::GdipGetLineRect((GpLineGradient*)nativeBrush, rect));

+    }

+

+    // integer version

+    Status GetRectangle(OUT Rect* rect) const

+    {

+        return SetStatus(DllExports::GdipGetLineRectI((GpLineGradient*)nativeBrush, rect));

+    }

+

+    // Gamma correction in interporlation.

+

+    Status SetGammaCorrection(IN BOOL useGammaCorrection)

+    {

+        return SetStatus(DllExports::GdipSetLineGammaCorrection((GpLineGradient*)nativeBrush,

+                    useGammaCorrection));

+    }

+    

+    BOOL GetGammaCorrection() const

+    {

+        BOOL useGammaCorrection;

+

+        SetStatus(DllExports::GdipGetLineGammaCorrection((GpLineGradient*)nativeBrush,

+                    &useGammaCorrection));

+

+        return useGammaCorrection;

+    }

+

+    INT GetBlendCount() const

+    {

+        INT count = 0;

+

+        SetStatus(DllExports::GdipGetLineBlendCount((GpLineGradient*)

+                                                    nativeBrush,

+                                                    &count));

+

+        return count;

+    }

+

+    Status SetBlend(IN const REAL* blendFactors, 

+                    IN const REAL* blendPositions,

+                    IN INT count)

+    {

+        return SetStatus(DllExports::GdipSetLineBlend((GpLineGradient*)

+                                                      nativeBrush,

+                                                      blendFactors,

+                                                      blendPositions,

+                                                      count));

+    }

+

+    Status GetBlend(OUT REAL* blendFactors, 

+                    OUT REAL* blendPositions, 

+                    IN INT count) const 

+    {

+        return SetStatus(DllExports::GdipGetLineBlend((GpLineGradient*)nativeBrush,

+                                                      blendFactors,

+                                                      blendPositions,

+                                                      count));

+    }

+

+    INT GetInterpolationColorCount() const

+    {

+        INT count = 0;

+

+        SetStatus(DllExports::GdipGetLinePresetBlendCount((GpLineGradient*)

+                                                          nativeBrush,

+                                                          &count));

+

+        return count;

+    }

+

+    Status SetInterpolationColors(IN const Color* presetColors,

+                                  IN const REAL* blendPositions, 

+                                  IN INT count)

+    {

+        if ((count <= 0) || !presetColors)

+            return SetStatus(InvalidParameter);

+         

+        ARGB *argbs = (ARGB*) new BYTE[count*sizeof(ARGB)];

+        

+        if (argbs)

+        {

+            for (INT i = 0; i < count; i++)

+            {

+                argbs[i] = presetColors[i].GetValue();

+            }

+

+            Status status = SetStatus(DllExports::GdipSetLinePresetBlend(

+                                                                        (GpLineGradient*) nativeBrush,

+                                                                        argbs,

+                                                                        blendPositions,

+                                                                        count));

+            delete [] argbs;

+            return status;

+        }

+        else

+        {

+            return SetStatus(OutOfMemory);

+        }

+    }

+

+    Status GetInterpolationColors(OUT Color* presetColors, 

+                                  OUT REAL* blendPositions, 

+                                  IN INT count) const 

+    {

+        if ((count <= 0) || !presetColors)

+            return SetStatus(InvalidParameter);

+

+        ARGB* argbs = (ARGB*) new BYTE[count*sizeof(ARGB)];

+        

+        if (!argbs)

+        {

+            return SetStatus(OutOfMemory);

+        }

+

+        Status status = SetStatus(DllExports::GdipGetLinePresetBlend((GpLineGradient*)nativeBrush,

+                                                                     argbs,

+                                                                     blendPositions,

+                                                                     count));

+        if (status == Ok) 

+        {

+            for (INT i = 0; i < count; i++)

+            { 

+                presetColors[i] = Color(argbs[i]);

+            }

+        }

+        

+        delete [] argbs;

+        

+        return status;

+    }

+

+    Status SetBlendBellShape(IN REAL focus, 

+                             IN REAL scale = 1.0)

+    {

+        return SetStatus(DllExports::GdipSetLineSigmaBlend((GpLineGradient*)nativeBrush, focus, scale));

+    }

+

+    #ifdef DCR_USE_NEW_145135

+    Status SetBlendTriangularShape(

+        IN REAL focus,

+        IN REAL scale = 1.0

+    )

+    #else

+    Status SetBlendTrianglarShape(IN REAL focus,

+                                  IN REAL scale = 1.0)

+    #endif                              

+    {

+        return SetStatus(DllExports::GdipSetLineLinearBlend((GpLineGradient*)nativeBrush, focus, scale));

+    }

+

+    /**

+     * Set/get brush transform

+     */

+    Status SetTransform(IN const Matrix* matrix)

+    {

+        return SetStatus(DllExports::GdipSetLineTransform((GpLineGradient*)nativeBrush, 

+                                                          matrix->nativeMatrix));

+    }

+

+    Status GetTransform(OUT Matrix *matrix) const

+    {

+        return SetStatus(DllExports::GdipGetLineTransform((GpLineGradient*)nativeBrush, 

+                                                          matrix->nativeMatrix));

+    }

+

+    Status ResetTransform()

+    {

+        return SetStatus(DllExports::GdipResetLineTransform((GpLineGradient*)nativeBrush));

+    }

+

+    Status MultiplyTransform(IN const Matrix* matrix,

+                             IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipMultiplyLineTransform((GpLineGradient*)nativeBrush,

+                                                                matrix->nativeMatrix,

+                                                                order));

+    }

+

+    Status TranslateTransform(IN REAL dx, 

+                              IN REAL dy,

+                              IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipTranslateLineTransform((GpLineGradient*)nativeBrush,

+                                                               dx, dy, order));

+    }

+

+    Status ScaleTransform(IN REAL sx, 

+                          IN REAL sy,

+                          IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipScaleLineTransform((GpLineGradient*)nativeBrush,

+                                                             sx, sy, order));

+    }

+

+    Status RotateTransform(IN REAL angle, 

+                           IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipRotateLineTransform((GpLineGradient*)nativeBrush,

+                                                              angle, order));

+    }

+

+    /**

+     * Set/get brush wrapping mode

+     */

+    Status SetWrapMode(IN WrapMode wrapMode)

+    {

+        return SetStatus(DllExports::GdipSetLineWrapMode((GpLineGradient*)nativeBrush, 

+                                                         wrapMode));

+    }

+

+    WrapMode GetWrapMode() const

+    {

+        WrapMode wrapMode;

+

+        SetStatus(DllExports::GdipGetLineWrapMode((GpLineGradient*)

+                                                  nativeBrush, 

+                                                  &wrapMode));

+

+        return wrapMode;

+    }

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    LinearGradientBrush(const LinearGradientBrush &);

+    LinearGradientBrush& operator=(const LinearGradientBrush &);

+

+#endif

+

+protected:

+

+    LinearGradientBrush()

+    {

+    }

+};

+

+//--------------------------------------------------------------------------

+// PathGradientBrush object is defined

+// in gdipluspath.h.

+//--------------------------------------------------------------------------

+

+//--------------------------------------------------------------------------

+// Represent hatch brush object

+//--------------------------------------------------------------------------

+

+class HatchBrush : public Brush

+{

+public:

+    friend class Pen;

+

+    // Constructors

+

+    HatchBrush(IN HatchStyle hatchStyle, 

+               IN const Color& foreColor,

+               IN const Color& backColor = Color())

+    {

+        GpHatch *brush = NULL;

+

+        lastResult = DllExports::GdipCreateHatchBrush(hatchStyle, 

+                                                      foreColor.GetValue(), 

+                                                      backColor.GetValue(),

+                                                      &brush);

+        SetNativeBrush(brush);

+    }

+

+    HatchStyle GetHatchStyle() const

+    {

+        HatchStyle hatchStyle;

+

+        SetStatus(DllExports::GdipGetHatchStyle((GpHatch*)nativeBrush, 

+                                                &hatchStyle));

+

+        return hatchStyle;

+    }

+    

+    Status GetForegroundColor(OUT Color* color) const

+    {

+        ARGB argb;

+

+        if (color == NULL) 

+        {

+            return SetStatus(InvalidParameter);

+        }

+        

+        Status status = SetStatus(DllExports::GdipGetHatchForegroundColor(

+                                                        (GpHatch*)nativeBrush, 

+                                                        &argb));

+

+        color->SetValue(argb);

+

+        return status;

+    }

+

+    Status GetBackgroundColor(OUT Color *color) const

+    {

+        ARGB argb;

+        

+        if (color == NULL) 

+        {

+            return SetStatus(InvalidParameter);

+        }

+

+        Status status = SetStatus(DllExports::GdipGetHatchBackgroundColor(

+                                                        (GpHatch*)nativeBrush,

+                                                        &argb));

+

+        color->SetValue(argb);

+        

+        return status;

+    }

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    HatchBrush(const HatchBrush &);

+    HatchBrush& operator=(const HatchBrush &);

+

+#endif

+

+protected:

+

+    HatchBrush()

+    {

+    }

+};

+

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h b/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h
new file mode 100644
index 0000000..28fd8ca
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h
@@ -0,0 +1,71 @@
+/**************************************************************************

+*

+* Copyright (c) 2000 Microsoft Corporation

+*

+* Module Name:

+*

+*   CachedBitmap class definition

+*

+* Abstract:

+*

+*   CachedBitmap is a representation of an accelerated drawing

+*   that has restrictions on what operations are allowed in order

+*   to accelerate the drawing to the destination.

+*

+**************************************************************************/

+

+#ifndef _GDIPLUSCACHEDBITMAP_H

+#define _GDIPLUSCACHEDBITMAP_H

+

+/**************************************************************************

+*

+* Class Name:

+*

+*   CachedBitmap

+*

+* Abstract:

+*

+*   An object to store a bitmap prepared for rendering on a particular

+*   Graphics object. The memory storage for the CachedBitmap is opaque

+*   to the other Engine code, so the only operations supported are

+*   initializing the data (with a bitmap) and using the graphics to

+*   draw it on the screen with an integer offset.

+*

+*   Look for the class definition in GdiplusHeaders.h

+*

+* Created:

+*

+*   04/23/2000 asecchia

+*      Created it.

+*

+**************************************************************************/

+inline 

+CachedBitmap::CachedBitmap(

+    IN Bitmap *bitmap, 

+    IN Graphics *graphics)

+{

+    nativeCachedBitmap = NULL;    

+

+    lastResult = DllExports::GdipCreateCachedBitmap(

+        (GpBitmap *)bitmap->nativeImage,

+        graphics->nativeGraphics,

+        &nativeCachedBitmap

+    );

+}

+

+inline 

+CachedBitmap::~CachedBitmap()

+{

+    DllExports::GdipDeleteCachedBitmap(nativeCachedBitmap);

+}

+

+inline Status 

+CachedBitmap::GetLastStatus() const 

+{

+    Status lastStatus = lastResult;

+    lastResult = Ok;    

+    return (lastStatus);

+}

+

+#endif

+

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h b/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h
new file mode 100644
index 0000000..72c21c2
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h
@@ -0,0 +1,209 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusColor.h

+*

+* Abstract:

+*

+*   Represents a GDI+ color.

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSCOLOR_H

+#define _GDIPLUSCOLOR_H

+

+//----------------------------------------------------------------------------

+// Color mode

+//----------------------------------------------------------------------------

+

+enum ColorMode

+{

+    ColorModeARGB32 = 0,

+    ColorModeARGB64 = 1

+};

+

+//----------------------------------------------------------------------------

+// Color Channel flags

+//----------------------------------------------------------------------------

+

+enum ColorChannelFlags

+{

+    ColorChannelFlagsC = 0,

+    ColorChannelFlagsM,

+    ColorChannelFlagsY,

+    ColorChannelFlagsK,

+    ColorChannelFlagsLast

+};

+

+//----------------------------------------------------------------------------

+// Color

+//----------------------------------------------------------------------------

+

+class Color

+{

+public:

+

+    Color()

+    {

+        Argb = (ARGB)Color::Black;

+    }

+

+    // Construct an opaque Color object with

+    // the specified R, G, B values.

+

+    Color(IN BYTE r,

+          IN BYTE g,

+          IN BYTE b)

+    {

+        Argb = MakeARGB(255, r, g, b);

+    }

+

+    // Construct a Color object with

+    // the specified A, R, G, B values.

+    //

+    // NOTE: R, G, B color values are not premultiplied.

+

+    Color(IN BYTE a,

+          IN BYTE r,

+          IN BYTE g,

+          IN BYTE b)

+    {

+        Argb = MakeARGB(a, r, g, b);

+    }

+

+    // Construct a Color object with

+    // the specified ARGB values.

+    //

+    // NOTE: R, G, B color components are not premultiplied.

+

+    Color(IN ARGB argb)

+    {

+        Argb = argb;

+    }

+

+    // Extract A, R, G, B components

+

+    BYTE GetAlpha() const

+    {

+        return (BYTE) (Argb >> AlphaShift);

+    }

+

+    BYTE GetA() const

+    {

+        return GetAlpha();

+    }

+

+    BYTE GetRed() const

+    {

+        return (BYTE) (Argb >> RedShift);

+    }

+

+    BYTE GetR() const

+    {

+        return GetRed();

+    }

+

+    BYTE GetGreen() const

+    {

+        return (BYTE) (Argb >> GreenShift);

+    }

+

+    BYTE GetG() const

+    {

+        return GetGreen();

+    }

+

+    BYTE GetBlue() const

+    {

+        return (BYTE) (Argb >> BlueShift);

+    }

+

+    BYTE GetB() const

+    {

+        return GetBlue();

+    }

+

+    // Retrieve ARGB values

+

+    ARGB GetValue() const

+    {

+        return Argb;

+    }

+

+    VOID SetValue(IN ARGB argb)

+    {

+        Argb = argb;

+    }

+

+    VOID SetFromCOLORREF(IN COLORREF rgb)

+    {

+        Argb = MakeARGB(255, GetRValue(rgb), GetGValue(rgb), GetBValue(rgb));

+    }

+

+    COLORREF ToCOLORREF() const

+    {

+        return RGB(GetRed(), GetGreen(), GetBlue());

+    }

+

+public:

+

+    // Standard color constants

+    enum

+    {

+       Black = 0xff000000,

+       Silver = 0xffc0c0c0,

+       Gray = 0xff808080,

+       White = 0xffffffff,

+       Maroon = 0xff800000,

+       Red = 0xffff0000,

+       Purple = 0xff800080,

+       Fuchsia = 0xffff00ff,

+       Green = 0xff008000,

+       Lime = 0xff00ff00,

+       Olive = 0xff808000,

+       Yellow = 0xffffff00,

+       Navy = 0xff000080,

+       Blue = 0xff0000ff,

+       Teal = 0xff008080,

+       Aqua = 0xff00ffff

+    };

+

+    // Shift count and bit mask for A, R, G, B components

+    enum

+    {

+        AlphaShift  = 24,

+        RedShift    = 16,

+        GreenShift  = 8,

+        BlueShift   = 0

+    };

+

+    enum

+    {

+        AlphaMask   = 0xff000000,

+        RedMask     = 0x00ff0000,

+        GreenMask   = 0x0000ff00,

+        BlueMask    = 0x000000ff

+    };

+

+    // Assemble A, R, G, B values into a 32-bit integer

+    static ARGB MakeARGB(IN BYTE a,

+                         IN BYTE r,

+                         IN BYTE g,

+                         IN BYTE b)

+    {

+        return (((ARGB) (b) <<  BlueShift) |

+                ((ARGB) (g) << GreenShift) |

+                ((ARGB) (r) <<   RedShift) |

+                ((ARGB) (a) << AlphaShift));

+    }

+

+protected:

+

+    ARGB Argb;

+};

+

+#endif

+

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h b/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h
new file mode 100644
index 0000000..d1d9ebc
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h
@@ -0,0 +1,63 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusColorMatrix.h

+*

+* Abstract:

+*

+*   Class for color adjustment object passed to Graphics.DrawImage

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSCOLORMATRIX_H

+#define _GDIPLUSCOLORMATRIX_H

+

+//----------------------------------------------------------------------------

+// Color matrix

+//----------------------------------------------------------------------------

+

+struct ColorMatrix

+{

+    REAL m[5][5];

+};

+

+//----------------------------------------------------------------------------

+// Color Matrix flags

+//----------------------------------------------------------------------------

+

+enum ColorMatrixFlags

+{

+    ColorMatrixFlagsDefault   = 0,

+    ColorMatrixFlagsSkipGrays = 1,

+    ColorMatrixFlagsAltGray   = 2

+};

+

+//----------------------------------------------------------------------------

+// Color Adjust Type

+//----------------------------------------------------------------------------

+

+enum ColorAdjustType

+{

+    ColorAdjustTypeDefault,

+    ColorAdjustTypeBitmap,

+    ColorAdjustTypeBrush,

+    ColorAdjustTypePen,

+    ColorAdjustTypeText,

+    ColorAdjustTypeCount,   // must be immediately after all the individual ones

+    ColorAdjustTypeAny      // internal use: for querying if any type has recoloring

+};

+

+//----------------------------------------------------------------------------

+// Color Map

+//----------------------------------------------------------------------------

+

+struct ColorMap

+{

+    Color oldColor;

+    Color newColor;

+};

+

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h b/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h
new file mode 100644
index 0000000..92a29c7
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h
@@ -0,0 +1,1252 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusEnums.h

+*

+* Abstract:

+*

+*   Various enumeration types

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSENUMS_H

+#define _GDIPLUSENUMS_H

+

+

+//--------------------------------------------------------------------------

+// Default bezier flattening tolerance in device pixels.

+//--------------------------------------------------------------------------

+

+const float FlatnessDefault = 1.0f/4.0f;

+

+//--------------------------------------------------------------------------

+// Graphics and Container State cookies

+//--------------------------------------------------------------------------

+

+typedef UINT     GraphicsState;

+typedef UINT     GraphicsContainer;

+

+//--------------------------------------------------------------------------

+// Fill mode constants

+//--------------------------------------------------------------------------

+

+enum FillMode

+{

+    FillModeAlternate,        // 0

+    FillModeWinding           // 1

+};

+

+//--------------------------------------------------------------------------

+// Quality mode constants

+//--------------------------------------------------------------------------

+

+enum QualityMode

+{

+    QualityModeInvalid   = -1,

+    QualityModeDefault   = 0,

+    QualityModeLow       = 1, // for apps that need the best performance

+    QualityModeHigh      = 2  // for apps that need the best rendering quality

+};

+

+//--------------------------------------------------------------------------

+// Alpha compositing mode constants

+//--------------------------------------------------------------------------

+

+enum CompositingMode

+{

+    CompositingModeSourceOver,    // 0

+    CompositingModeSourceCopy     // 1

+};

+

+//--------------------------------------------------------------------------

+// Alpha compositing quality constants

+//--------------------------------------------------------------------------

+

+enum CompositingQuality

+{

+    CompositingQualityInvalid          = QualityModeInvalid,

+    CompositingQualityDefault          = QualityModeDefault,

+    CompositingQualityHighSpeed        = QualityModeLow,

+    CompositingQualityHighQuality      = QualityModeHigh,

+    CompositingQualityGammaCorrected,

+    CompositingQualityAssumeLinear

+};

+

+//--------------------------------------------------------------------------

+// Unit constants

+//--------------------------------------------------------------------------

+

+enum Unit

+{

+    UnitWorld,      // 0 -- World coordinate (non-physical unit)

+    UnitDisplay,    // 1 -- Variable -- for PageTransform only

+    UnitPixel,      // 2 -- Each unit is one device pixel.

+    UnitPoint,      // 3 -- Each unit is a printer's point, or 1/72 inch.

+    UnitInch,       // 4 -- Each unit is 1 inch.

+    UnitDocument,   // 5 -- Each unit is 1/300 inch.

+    UnitMillimeter  // 6 -- Each unit is 1 millimeter.

+};

+

+//--------------------------------------------------------------------------

+// MetafileFrameUnit

+//

+// The frameRect for creating a metafile can be specified in any of these

+// units.  There is an extra frame unit value (MetafileFrameUnitGdi) so

+// that units can be supplied in the same units that GDI expects for

+// frame rects -- these units are in .01 (1/100ths) millimeter units

+// as defined by GDI.

+//--------------------------------------------------------------------------

+enum MetafileFrameUnit

+{

+    MetafileFrameUnitPixel      = UnitPixel,

+    MetafileFrameUnitPoint      = UnitPoint,

+    MetafileFrameUnitInch       = UnitInch,

+    MetafileFrameUnitDocument   = UnitDocument,

+    MetafileFrameUnitMillimeter = UnitMillimeter,

+    MetafileFrameUnitGdi                        // GDI compatible .01 MM units

+};

+

+//--------------------------------------------------------------------------

+// Coordinate space identifiers

+//--------------------------------------------------------------------------

+

+enum CoordinateSpace

+{

+    CoordinateSpaceWorld,     // 0

+    CoordinateSpacePage,      // 1

+    CoordinateSpaceDevice     // 2

+};

+

+//--------------------------------------------------------------------------

+// Various wrap modes for brushes

+//--------------------------------------------------------------------------

+

+enum WrapMode

+{

+    WrapModeTile,        // 0

+    WrapModeTileFlipX,   // 1

+    WrapModeTileFlipY,   // 2

+    WrapModeTileFlipXY,  // 3

+    WrapModeClamp        // 4

+};

+

+//--------------------------------------------------------------------------

+// Various hatch styles

+//--------------------------------------------------------------------------

+

+enum HatchStyle

+{

+    HatchStyleHorizontal,                   // 0

+    HatchStyleVertical,                     // 1

+    HatchStyleForwardDiagonal,              // 2

+    HatchStyleBackwardDiagonal,             // 3

+    HatchStyleCross,                        // 4

+    HatchStyleDiagonalCross,                // 5

+    HatchStyle05Percent,                    // 6

+    HatchStyle10Percent,                    // 7

+    HatchStyle20Percent,                    // 8

+    HatchStyle25Percent,                    // 9

+    HatchStyle30Percent,                    // 10

+    HatchStyle40Percent,                    // 11

+    HatchStyle50Percent,                    // 12

+    HatchStyle60Percent,                    // 13

+    HatchStyle70Percent,                    // 14

+    HatchStyle75Percent,                    // 15

+    HatchStyle80Percent,                    // 16

+    HatchStyle90Percent,                    // 17

+    HatchStyleLightDownwardDiagonal,        // 18

+    HatchStyleLightUpwardDiagonal,          // 19

+    HatchStyleDarkDownwardDiagonal,         // 20

+    HatchStyleDarkUpwardDiagonal,           // 21

+    HatchStyleWideDownwardDiagonal,         // 22

+    HatchStyleWideUpwardDiagonal,           // 23

+    HatchStyleLightVertical,                // 24

+    HatchStyleLightHorizontal,              // 25

+    HatchStyleNarrowVertical,               // 26

+    HatchStyleNarrowHorizontal,             // 27

+    HatchStyleDarkVertical,                 // 28

+    HatchStyleDarkHorizontal,               // 29

+    HatchStyleDashedDownwardDiagonal,       // 30

+    HatchStyleDashedUpwardDiagonal,         // 31

+    HatchStyleDashedHorizontal,             // 32

+    HatchStyleDashedVertical,               // 33

+    HatchStyleSmallConfetti,                // 34

+    HatchStyleLargeConfetti,                // 35

+    HatchStyleZigZag,                       // 36

+    HatchStyleWave,                         // 37

+    HatchStyleDiagonalBrick,                // 38

+    HatchStyleHorizontalBrick,              // 39

+    HatchStyleWeave,                        // 40

+    HatchStylePlaid,                        // 41

+    HatchStyleDivot,                        // 42

+    HatchStyleDottedGrid,                   // 43

+    HatchStyleDottedDiamond,                // 44

+    HatchStyleShingle,                      // 45

+    HatchStyleTrellis,                      // 46

+    HatchStyleSphere,                       // 47

+    HatchStyleSmallGrid,                    // 48

+    HatchStyleSmallCheckerBoard,            // 49

+    HatchStyleLargeCheckerBoard,            // 50

+    HatchStyleOutlinedDiamond,              // 51

+    HatchStyleSolidDiamond,                 // 52

+

+    HatchStyleTotal,    // must be after all unique hatch styles

+

+    HatchStyleLargeGrid = HatchStyleCross,  // 4  an alias for the cross style

+

+    HatchStyleMin       = HatchStyleHorizontal,

+    HatchStyleMax       = HatchStyleTotal - 1,

+};

+

+//--------------------------------------------------------------------------

+// Dash style constants

+//--------------------------------------------------------------------------

+

+enum DashStyle

+{

+    DashStyleSolid,          // 0

+    DashStyleDash,           // 1

+    DashStyleDot,            // 2

+    DashStyleDashDot,        // 3

+    DashStyleDashDotDot,     // 4

+    DashStyleCustom          // 5

+};

+

+//--------------------------------------------------------------------------

+// Dash cap constants

+//--------------------------------------------------------------------------

+

+enum DashCap

+{

+    DashCapFlat             = 0,

+    DashCapRound            = 2,

+    DashCapTriangle         = 3

+};

+

+//--------------------------------------------------------------------------

+// Line cap constants (only the lowest 8 bits are used).

+//--------------------------------------------------------------------------

+

+enum LineCap

+{

+    LineCapFlat             = 0,

+    LineCapSquare           = 1,

+    LineCapRound            = 2,

+    LineCapTriangle         = 3,

+

+    LineCapNoAnchor         = 0x10, // corresponds to flat cap

+    LineCapSquareAnchor     = 0x11, // corresponds to square cap

+    LineCapRoundAnchor      = 0x12, // corresponds to round cap

+    LineCapDiamondAnchor    = 0x13, // corresponds to triangle cap

+    LineCapArrowAnchor      = 0x14, // no correspondence

+

+    LineCapCustom           = 0xff, // custom cap

+

+    LineCapAnchorMask       = 0xf0  // mask to check for anchor or not.

+};

+

+//--------------------------------------------------------------------------

+// Custom Line cap type constants

+//--------------------------------------------------------------------------

+

+enum CustomLineCapType

+{

+    CustomLineCapTypeDefault         = 0,

+    CustomLineCapTypeAdjustableArrow = 1

+};

+

+//--------------------------------------------------------------------------

+// Line join constants

+//--------------------------------------------------------------------------

+

+enum LineJoin

+{

+    LineJoinMiter        = 0,

+    LineJoinBevel        = 1,

+    LineJoinRound        = 2,

+    LineJoinMiterClipped = 3

+};

+

+//--------------------------------------------------------------------------

+// Path point types (only the lowest 8 bits are used.)

+//  The lowest 3 bits are interpreted as point type

+//  The higher 5 bits are reserved for flags.

+//--------------------------------------------------------------------------

+

+enum PathPointType

+{

+    PathPointTypeStart           = 0,    // move

+    PathPointTypeLine            = 1,    // line

+    PathPointTypeBezier          = 3,    // default Beizer (= cubic Bezier)

+    PathPointTypePathTypeMask    = 0x07, // type mask (lowest 3 bits).

+    PathPointTypeDashMode        = 0x10, // currently in dash mode.

+    PathPointTypePathMarker      = 0x20, // a marker for the path.

+    PathPointTypeCloseSubpath    = 0x80, // closed flag

+

+    // Path types used for advanced path.

+

+    PathPointTypeBezier2    = 2,    // quadratic Beizer

+    PathPointTypeBezier3    = 3,    // cubic Bezier

+    PathPointTypeBezier4    = 4,    // quartic (4th order) Beizer

+    PathPointTypeBezier5    = 5,    // quintic (5th order) Bezier

+    PathPointTypeBezier6    = 6     // hexaic (6th order) Bezier

+};

+

+

+//--------------------------------------------------------------------------

+// WarpMode constants

+//--------------------------------------------------------------------------

+

+enum WarpMode

+{

+    WarpModePerspective,    // 0

+    WarpModeBilinear        // 1

+};

+

+//--------------------------------------------------------------------------

+// LineGradient Mode

+//--------------------------------------------------------------------------

+

+enum LinearGradientMode

+{

+    LinearGradientModeHorizontal,         // 0

+    LinearGradientModeVertical,           // 1

+    LinearGradientModeForwardDiagonal,    // 2

+    LinearGradientModeBackwardDiagonal    // 3

+};

+

+//--------------------------------------------------------------------------

+// Region Comine Modes

+//--------------------------------------------------------------------------

+

+enum CombineMode

+{

+    CombineModeReplace,     // 0

+    CombineModeIntersect,   // 1

+    CombineModeUnion,       // 2

+    CombineModeXor,         // 3

+    CombineModeExclude,     // 4

+    CombineModeComplement   // 5 (does exclude from)

+};

+

+//--------------------------------------------------------------------------

+ // Image types

+//--------------------------------------------------------------------------

+

+enum ImageType

+{

+    ImageTypeUnknown,   // 0

+    ImageTypeBitmap,    // 1

+    ImageTypeMetafile   // 2

+};

+

+//--------------------------------------------------------------------------

+// Interpolation modes

+//--------------------------------------------------------------------------

+

+enum InterpolationMode

+{

+    InterpolationModeInvalid          = QualityModeInvalid,

+    InterpolationModeDefault          = QualityModeDefault,

+    InterpolationModeLowQuality       = QualityModeLow,

+    InterpolationModeHighQuality      = QualityModeHigh,

+    InterpolationModeBilinear,

+    InterpolationModeBicubic,

+    InterpolationModeNearestNeighbor,

+    InterpolationModeHighQualityBilinear,

+    InterpolationModeHighQualityBicubic

+};

+

+//--------------------------------------------------------------------------

+// Pen types

+//--------------------------------------------------------------------------

+enum PenAlignment

+{

+    PenAlignmentCenter       = 0,

+    PenAlignmentInset        = 1,

+    PenAlignmentOutset       = 2,

+    PenAlignmentLeft         = 3,

+    PenAlignmentRight        = 4

+};

+

+//--------------------------------------------------------------------------

+// Brush types

+//--------------------------------------------------------------------------

+

+enum BrushType

+{

+   BrushTypeSolidColor       = 0,

+   BrushTypeHatchFill        = 1,

+   BrushTypeTextureFill      = 2,

+   BrushTypePathGradient     = 3,

+   BrushTypeLinearGradient   = 4

+};

+

+//--------------------------------------------------------------------------

+// Pen's Fill types

+//--------------------------------------------------------------------------

+

+enum PenType

+{

+   PenTypeSolidColor       = BrushTypeSolidColor,

+   PenTypeHatchFill        = BrushTypeHatchFill,

+   PenTypeTextureFill      = BrushTypeTextureFill,

+   PenTypePathGradient     = BrushTypePathGradient,

+   PenTypeLinearGradient   = BrushTypeLinearGradient,

+   PenTypeUnknown          = -1

+};

+

+//--------------------------------------------------------------------------

+// Matrix Order

+//--------------------------------------------------------------------------

+

+enum MatrixOrder

+{

+    MatrixOrderPrepend    = 0,

+    MatrixOrderAppend     = 1

+};

+

+//--------------------------------------------------------------------------

+// Generic font families

+//--------------------------------------------------------------------------

+

+enum GenericFontFamily

+{

+    GenericFontFamilySerif,

+    GenericFontFamilySansSerif,

+    GenericFontFamilyMonospace

+

+};

+

+//--------------------------------------------------------------------------

+// FontStyle: face types and common styles

+//--------------------------------------------------------------------------

+

+//  These should probably be flags

+

+//  Must have:

+//      Regular = 0

+//      Bold = 1

+//      Italic = 2

+//      BoldItalic = 3

+

+enum FontStyle

+{

+    FontStyleRegular    = 0,

+    FontStyleBold       = 1,

+    FontStyleItalic     = 2,

+    FontStyleBoldItalic = 3,

+    FontStyleUnderline  = 4,

+    FontStyleStrikeout  = 8

+};

+

+//---------------------------------------------------------------------------

+// Smoothing Mode

+//---------------------------------------------------------------------------

+

+enum SmoothingMode

+{

+    SmoothingModeInvalid     = QualityModeInvalid,

+    SmoothingModeDefault     = QualityModeDefault,

+    SmoothingModeHighSpeed   = QualityModeLow,

+    SmoothingModeHighQuality = QualityModeHigh,

+    SmoothingModeNone,

+    SmoothingModeAntiAlias

+};

+

+//---------------------------------------------------------------------------

+// Pixel Format Mode

+//---------------------------------------------------------------------------

+

+enum PixelOffsetMode

+{

+    PixelOffsetModeInvalid     = QualityModeInvalid,

+    PixelOffsetModeDefault     = QualityModeDefault,

+    PixelOffsetModeHighSpeed   = QualityModeLow,

+    PixelOffsetModeHighQuality = QualityModeHigh,

+    PixelOffsetModeNone,    // no pixel offset

+    PixelOffsetModeHalf     // offset by -0.5, -0.5 for fast anti-alias perf

+};

+

+//---------------------------------------------------------------------------

+// Text Rendering Hint

+//---------------------------------------------------------------------------

+

+enum TextRenderingHint

+{

+#ifdef DCR_USE_NEW_186764

+    TextRenderingHintSystemDefault = 0,            // Glyph with system default rendering hint

+    TextRenderingHintSingleBitPerPixelGridFit,     // Glyph bitmap with hinting

+#else

+    TextRenderingHintSingleBitPerPixelGridFit = 0, // Glyph bitmap with hinting

+#endif // DCR_USE_NEW_186764

+    TextRenderingHintSingleBitPerPixel,            // Glyph bitmap without hinting

+    TextRenderingHintAntiAliasGridFit,             // Glyph anti-alias bitmap with hinting

+    TextRenderingHintAntiAlias,                    // Glyph anti-alias bitmap without hinting

+    TextRenderingHintClearTypeGridFit              // Glyph CT bitmap with hinting

+};

+

+//---------------------------------------------------------------------------

+// Metafile Types

+//---------------------------------------------------------------------------

+enum MetafileType

+{

+    MetafileTypeInvalid,            // Invalid metafile

+    MetafileTypeWmf,                // Standard WMF

+    MetafileTypeWmfAldus,           // Aldus Placeable Metafile format

+    MetafileTypeEmf,                // EMF (not EMF+)

+    MetafileTypeEmfPlusOnly,        // EMF+ without dual, down-level records

+    MetafileTypeEmfPlusDual         // EMF+ with dual, down-level records

+};

+

+// Specifies the type of EMF to record

+enum EmfType

+{

+    EmfTypeEmfOnly     = MetafileTypeEmf,          // no EMF+, only EMF

+    EmfTypeEmfPlusOnly = MetafileTypeEmfPlusOnly,  // no EMF, only EMF+

+    EmfTypeEmfPlusDual = MetafileTypeEmfPlusDual   // both EMF+ and EMF

+};

+

+// All persistent objects must have a type listed here

+enum ObjectType

+{

+    ObjectTypeInvalid,

+    ObjectTypeBrush,

+    ObjectTypePen,

+    ObjectTypePath,

+    ObjectTypeRegion,

+    ObjectTypeImage,

+    ObjectTypeFont,

+    ObjectTypeStringFormat,

+    ObjectTypeImageAttributes,

+    ObjectTypeCustomLineCap,

+

+    ObjectTypeMax = ObjectTypeCustomLineCap,

+    ObjectTypeMin = ObjectTypeBrush

+};

+

+inline BOOL

+ObjectTypeIsValid(

+    ObjectType      type

+    )

+{

+    return ((type >= ObjectTypeMin) && (type <= ObjectTypeMax));

+}

+

+//---------------------------------------------------------------------------

+// EMF+ Records

+//---------------------------------------------------------------------------

+

+// We have to change the WMF record numbers so that they don't conflict with

+// the EMF and EMF+ record numbers.

+enum EmfPlusRecordType;

+#define GDIP_EMFPLUS_RECORD_BASE        0x00004000

+#define GDIP_WMF_RECORD_BASE            0x00010000

+#define GDIP_WMF_RECORD_TO_EMFPLUS(n)   ((EmfPlusRecordType)((n) | GDIP_WMF_RECORD_BASE))

+#define GDIP_EMFPLUS_RECORD_TO_WMF(n)   ((n) & (~GDIP_WMF_RECORD_BASE))

+#define GDIP_IS_WMF_RECORDTYPE(n)       (((n) & GDIP_WMF_RECORD_BASE) != 0)

+

+enum EmfPlusRecordType

+{

+   // Since we have to enumerate GDI records right along with GDI+ records,

+   // we list all the GDI records here so that they can be part of the

+   // same enumeration type which is used in the enumeration callback.

+

+    WmfRecordTypeSetBkColor              = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETBKCOLOR),

+    WmfRecordTypeSetBkMode               = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETBKMODE),

+    WmfRecordTypeSetMapMode              = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETMAPMODE),

+    WmfRecordTypeSetROP2                 = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETROP2),

+    WmfRecordTypeSetRelAbs               = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETRELABS),

+    WmfRecordTypeSetPolyFillMode         = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPOLYFILLMODE),

+    WmfRecordTypeSetStretchBltMode       = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETSTRETCHBLTMODE),

+    WmfRecordTypeSetTextCharExtra        = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTCHAREXTRA),

+    WmfRecordTypeSetTextColor            = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTCOLOR),

+    WmfRecordTypeSetTextJustification    = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTJUSTIFICATION),

+    WmfRecordTypeSetWindowOrg            = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETWINDOWORG),

+    WmfRecordTypeSetWindowExt            = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETWINDOWEXT),

+    WmfRecordTypeSetViewportOrg          = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETVIEWPORTORG),

+    WmfRecordTypeSetViewportExt          = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETVIEWPORTEXT),

+    WmfRecordTypeOffsetWindowOrg         = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETWINDOWORG),

+    WmfRecordTypeScaleWindowExt          = GDIP_WMF_RECORD_TO_EMFPLUS(META_SCALEWINDOWEXT),

+    WmfRecordTypeOffsetViewportOrg       = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETVIEWPORTORG),

+    WmfRecordTypeScaleViewportExt        = GDIP_WMF_RECORD_TO_EMFPLUS(META_SCALEVIEWPORTEXT),

+    WmfRecordTypeLineTo                  = GDIP_WMF_RECORD_TO_EMFPLUS(META_LINETO),

+    WmfRecordTypeMoveTo                  = GDIP_WMF_RECORD_TO_EMFPLUS(META_MOVETO),

+    WmfRecordTypeExcludeClipRect         = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXCLUDECLIPRECT),

+    WmfRecordTypeIntersectClipRect       = GDIP_WMF_RECORD_TO_EMFPLUS(META_INTERSECTCLIPRECT),

+    WmfRecordTypeArc                     = GDIP_WMF_RECORD_TO_EMFPLUS(META_ARC),

+    WmfRecordTypeEllipse                 = GDIP_WMF_RECORD_TO_EMFPLUS(META_ELLIPSE),

+    WmfRecordTypeFloodFill               = GDIP_WMF_RECORD_TO_EMFPLUS(META_FLOODFILL),

+    WmfRecordTypePie                     = GDIP_WMF_RECORD_TO_EMFPLUS(META_PIE),

+    WmfRecordTypeRectangle               = GDIP_WMF_RECORD_TO_EMFPLUS(META_RECTANGLE),

+    WmfRecordTypeRoundRect               = GDIP_WMF_RECORD_TO_EMFPLUS(META_ROUNDRECT),

+    WmfRecordTypePatBlt                  = GDIP_WMF_RECORD_TO_EMFPLUS(META_PATBLT),

+    WmfRecordTypeSaveDC                  = GDIP_WMF_RECORD_TO_EMFPLUS(META_SAVEDC),

+    WmfRecordTypeSetPixel                = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPIXEL),

+    WmfRecordTypeOffsetClipRgn           = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETCLIPRGN),

+    WmfRecordTypeTextOut                 = GDIP_WMF_RECORD_TO_EMFPLUS(META_TEXTOUT),

+    WmfRecordTypeBitBlt                  = GDIP_WMF_RECORD_TO_EMFPLUS(META_BITBLT),

+    WmfRecordTypeStretchBlt              = GDIP_WMF_RECORD_TO_EMFPLUS(META_STRETCHBLT),

+    WmfRecordTypePolygon                 = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYGON),

+    WmfRecordTypePolyline                = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYLINE),

+    WmfRecordTypeEscape                  = GDIP_WMF_RECORD_TO_EMFPLUS(META_ESCAPE),

+    WmfRecordTypeRestoreDC               = GDIP_WMF_RECORD_TO_EMFPLUS(META_RESTOREDC),

+    WmfRecordTypeFillRegion              = GDIP_WMF_RECORD_TO_EMFPLUS(META_FILLREGION),

+    WmfRecordTypeFrameRegion             = GDIP_WMF_RECORD_TO_EMFPLUS(META_FRAMEREGION),

+    WmfRecordTypeInvertRegion            = GDIP_WMF_RECORD_TO_EMFPLUS(META_INVERTREGION),

+    WmfRecordTypePaintRegion             = GDIP_WMF_RECORD_TO_EMFPLUS(META_PAINTREGION),

+    WmfRecordTypeSelectClipRegion        = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTCLIPREGION),

+    WmfRecordTypeSelectObject            = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTOBJECT),

+    WmfRecordTypeSetTextAlign            = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTALIGN),

+    WmfRecordTypeDrawText                = GDIP_WMF_RECORD_TO_EMFPLUS(0x062F),  // META_DRAWTEXT

+    WmfRecordTypeChord                   = GDIP_WMF_RECORD_TO_EMFPLUS(META_CHORD),

+    WmfRecordTypeSetMapperFlags          = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETMAPPERFLAGS),

+    WmfRecordTypeExtTextOut              = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXTTEXTOUT),

+    WmfRecordTypeSetDIBToDev             = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETDIBTODEV),

+    WmfRecordTypeSelectPalette           = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTPALETTE),

+    WmfRecordTypeRealizePalette          = GDIP_WMF_RECORD_TO_EMFPLUS(META_REALIZEPALETTE),

+    WmfRecordTypeAnimatePalette          = GDIP_WMF_RECORD_TO_EMFPLUS(META_ANIMATEPALETTE),

+    WmfRecordTypeSetPalEntries           = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPALENTRIES),

+    WmfRecordTypePolyPolygon             = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYPOLYGON),

+    WmfRecordTypeResizePalette           = GDIP_WMF_RECORD_TO_EMFPLUS(META_RESIZEPALETTE),

+    WmfRecordTypeDIBBitBlt               = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBBITBLT),

+    WmfRecordTypeDIBStretchBlt           = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBSTRETCHBLT),

+    WmfRecordTypeDIBCreatePatternBrush   = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBCREATEPATTERNBRUSH),

+    WmfRecordTypeStretchDIB              = GDIP_WMF_RECORD_TO_EMFPLUS(META_STRETCHDIB),

+    WmfRecordTypeExtFloodFill            = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXTFLOODFILL),

+    WmfRecordTypeSetLayout               = GDIP_WMF_RECORD_TO_EMFPLUS(0x0149),  // META_SETLAYOUT

+    WmfRecordTypeResetDC                 = GDIP_WMF_RECORD_TO_EMFPLUS(0x014C),  // META_RESETDC

+    WmfRecordTypeStartDoc                = GDIP_WMF_RECORD_TO_EMFPLUS(0x014D),  // META_STARTDOC

+    WmfRecordTypeStartPage               = GDIP_WMF_RECORD_TO_EMFPLUS(0x004F),  // META_STARTPAGE

+    WmfRecordTypeEndPage                 = GDIP_WMF_RECORD_TO_EMFPLUS(0x0050),  // META_ENDPAGE

+    WmfRecordTypeAbortDoc                = GDIP_WMF_RECORD_TO_EMFPLUS(0x0052),  // META_ABORTDOC

+    WmfRecordTypeEndDoc                  = GDIP_WMF_RECORD_TO_EMFPLUS(0x005E),  // META_ENDDOC

+    WmfRecordTypeDeleteObject            = GDIP_WMF_RECORD_TO_EMFPLUS(META_DELETEOBJECT),

+    WmfRecordTypeCreatePalette           = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPALETTE),

+    WmfRecordTypeCreateBrush             = GDIP_WMF_RECORD_TO_EMFPLUS(0x00F8),  // META_CREATEBRUSH

+    WmfRecordTypeCreatePatternBrush      = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPATTERNBRUSH),

+    WmfRecordTypeCreatePenIndirect       = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPENINDIRECT),

+    WmfRecordTypeCreateFontIndirect      = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEFONTINDIRECT),

+    WmfRecordTypeCreateBrushIndirect     = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEBRUSHINDIRECT),

+    WmfRecordTypeCreateBitmapIndirect    = GDIP_WMF_RECORD_TO_EMFPLUS(0x02FD),  // META_CREATEBITMAPINDIRECT

+    WmfRecordTypeCreateBitmap            = GDIP_WMF_RECORD_TO_EMFPLUS(0x06FE),  // META_CREATEBITMAP

+    WmfRecordTypeCreateRegion            = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEREGION),

+

+    EmfRecordTypeHeader                  = EMR_HEADER,

+    EmfRecordTypePolyBezier              = EMR_POLYBEZIER,

+    EmfRecordTypePolygon                 = EMR_POLYGON,

+    EmfRecordTypePolyline                = EMR_POLYLINE,

+    EmfRecordTypePolyBezierTo            = EMR_POLYBEZIERTO,

+    EmfRecordTypePolyLineTo              = EMR_POLYLINETO,

+    EmfRecordTypePolyPolyline            = EMR_POLYPOLYLINE,

+    EmfRecordTypePolyPolygon             = EMR_POLYPOLYGON,

+    EmfRecordTypeSetWindowExtEx          = EMR_SETWINDOWEXTEX,

+    EmfRecordTypeSetWindowOrgEx          = EMR_SETWINDOWORGEX,

+    EmfRecordTypeSetViewportExtEx        = EMR_SETVIEWPORTEXTEX,

+    EmfRecordTypeSetViewportOrgEx        = EMR_SETVIEWPORTORGEX,

+    EmfRecordTypeSetBrushOrgEx           = EMR_SETBRUSHORGEX,

+    EmfRecordTypeEOF                     = EMR_EOF,

+    EmfRecordTypeSetPixelV               = EMR_SETPIXELV,

+    EmfRecordTypeSetMapperFlags          = EMR_SETMAPPERFLAGS,

+    EmfRecordTypeSetMapMode              = EMR_SETMAPMODE,

+    EmfRecordTypeSetBkMode               = EMR_SETBKMODE,

+    EmfRecordTypeSetPolyFillMode         = EMR_SETPOLYFILLMODE,

+    EmfRecordTypeSetROP2                 = EMR_SETROP2,

+    EmfRecordTypeSetStretchBltMode       = EMR_SETSTRETCHBLTMODE,

+    EmfRecordTypeSetTextAlign            = EMR_SETTEXTALIGN,

+    EmfRecordTypeSetColorAdjustment      = EMR_SETCOLORADJUSTMENT,

+    EmfRecordTypeSetTextColor            = EMR_SETTEXTCOLOR,

+    EmfRecordTypeSetBkColor              = EMR_SETBKCOLOR,

+    EmfRecordTypeOffsetClipRgn           = EMR_OFFSETCLIPRGN,

+    EmfRecordTypeMoveToEx                = EMR_MOVETOEX,

+    EmfRecordTypeSetMetaRgn              = EMR_SETMETARGN,

+    EmfRecordTypeExcludeClipRect         = EMR_EXCLUDECLIPRECT,

+    EmfRecordTypeIntersectClipRect       = EMR_INTERSECTCLIPRECT,

+    EmfRecordTypeScaleViewportExtEx      = EMR_SCALEVIEWPORTEXTEX,

+    EmfRecordTypeScaleWindowExtEx        = EMR_SCALEWINDOWEXTEX,

+    EmfRecordTypeSaveDC                  = EMR_SAVEDC,

+    EmfRecordTypeRestoreDC               = EMR_RESTOREDC,

+    EmfRecordTypeSetWorldTransform       = EMR_SETWORLDTRANSFORM,

+    EmfRecordTypeModifyWorldTransform    = EMR_MODIFYWORLDTRANSFORM,

+    EmfRecordTypeSelectObject            = EMR_SELECTOBJECT,

+    EmfRecordTypeCreatePen               = EMR_CREATEPEN,

+    EmfRecordTypeCreateBrushIndirect     = EMR_CREATEBRUSHINDIRECT,

+    EmfRecordTypeDeleteObject            = EMR_DELETEOBJECT,

+    EmfRecordTypeAngleArc                = EMR_ANGLEARC,

+    EmfRecordTypeEllipse                 = EMR_ELLIPSE,

+    EmfRecordTypeRectangle               = EMR_RECTANGLE,

+    EmfRecordTypeRoundRect               = EMR_ROUNDRECT,

+    EmfRecordTypeArc                     = EMR_ARC,

+    EmfRecordTypeChord                   = EMR_CHORD,

+    EmfRecordTypePie                     = EMR_PIE,

+    EmfRecordTypeSelectPalette           = EMR_SELECTPALETTE,

+    EmfRecordTypeCreatePalette           = EMR_CREATEPALETTE,

+    EmfRecordTypeSetPaletteEntries       = EMR_SETPALETTEENTRIES,

+    EmfRecordTypeResizePalette           = EMR_RESIZEPALETTE,

+    EmfRecordTypeRealizePalette          = EMR_REALIZEPALETTE,

+    EmfRecordTypeExtFloodFill            = EMR_EXTFLOODFILL,

+    EmfRecordTypeLineTo                  = EMR_LINETO,

+    EmfRecordTypeArcTo                   = EMR_ARCTO,

+    EmfRecordTypePolyDraw                = EMR_POLYDRAW,

+    EmfRecordTypeSetArcDirection         = EMR_SETARCDIRECTION,

+    EmfRecordTypeSetMiterLimit           = EMR_SETMITERLIMIT,

+    EmfRecordTypeBeginPath               = EMR_BEGINPATH,

+    EmfRecordTypeEndPath                 = EMR_ENDPATH,

+    EmfRecordTypeCloseFigure             = EMR_CLOSEFIGURE,

+    EmfRecordTypeFillPath                = EMR_FILLPATH,

+    EmfRecordTypeStrokeAndFillPath       = EMR_STROKEANDFILLPATH,

+    EmfRecordTypeStrokePath              = EMR_STROKEPATH,

+    EmfRecordTypeFlattenPath             = EMR_FLATTENPATH,

+    EmfRecordTypeWidenPath               = EMR_WIDENPATH,

+    EmfRecordTypeSelectClipPath          = EMR_SELECTCLIPPATH,

+    EmfRecordTypeAbortPath               = EMR_ABORTPATH,

+    EmfRecordTypeReserved_069            = 69,  // Not Used

+    EmfRecordTypeGdiComment              = EMR_GDICOMMENT,

+    EmfRecordTypeFillRgn                 = EMR_FILLRGN,

+    EmfRecordTypeFrameRgn                = EMR_FRAMERGN,

+    EmfRecordTypeInvertRgn               = EMR_INVERTRGN,

+    EmfRecordTypePaintRgn                = EMR_PAINTRGN,

+    EmfRecordTypeExtSelectClipRgn        = EMR_EXTSELECTCLIPRGN,

+    EmfRecordTypeBitBlt                  = EMR_BITBLT,

+    EmfRecordTypeStretchBlt              = EMR_STRETCHBLT,

+    EmfRecordTypeMaskBlt                 = EMR_MASKBLT,

+    EmfRecordTypePlgBlt                  = EMR_PLGBLT,

+    EmfRecordTypeSetDIBitsToDevice       = EMR_SETDIBITSTODEVICE,

+    EmfRecordTypeStretchDIBits           = EMR_STRETCHDIBITS,

+    EmfRecordTypeExtCreateFontIndirect   = EMR_EXTCREATEFONTINDIRECTW,

+    EmfRecordTypeExtTextOutA             = EMR_EXTTEXTOUTA,

+    EmfRecordTypeExtTextOutW             = EMR_EXTTEXTOUTW,

+    EmfRecordTypePolyBezier16            = EMR_POLYBEZIER16,

+    EmfRecordTypePolygon16               = EMR_POLYGON16,

+    EmfRecordTypePolyline16              = EMR_POLYLINE16,

+    EmfRecordTypePolyBezierTo16          = EMR_POLYBEZIERTO16,

+    EmfRecordTypePolylineTo16            = EMR_POLYLINETO16,

+    EmfRecordTypePolyPolyline16          = EMR_POLYPOLYLINE16,

+    EmfRecordTypePolyPolygon16           = EMR_POLYPOLYGON16,

+    EmfRecordTypePolyDraw16              = EMR_POLYDRAW16,

+    EmfRecordTypeCreateMonoBrush         = EMR_CREATEMONOBRUSH,

+    EmfRecordTypeCreateDIBPatternBrushPt = EMR_CREATEDIBPATTERNBRUSHPT,

+    EmfRecordTypeExtCreatePen            = EMR_EXTCREATEPEN,

+    EmfRecordTypePolyTextOutA            = EMR_POLYTEXTOUTA,

+    EmfRecordTypePolyTextOutW            = EMR_POLYTEXTOUTW,

+    EmfRecordTypeSetICMMode              = 98,  // EMR_SETICMMODE,

+    EmfRecordTypeCreateColorSpace        = 99,  // EMR_CREATECOLORSPACE,

+    EmfRecordTypeSetColorSpace           = 100, // EMR_SETCOLORSPACE,

+    EmfRecordTypeDeleteColorSpace        = 101, // EMR_DELETECOLORSPACE,

+    EmfRecordTypeGLSRecord               = 102, // EMR_GLSRECORD,

+    EmfRecordTypeGLSBoundedRecord        = 103, // EMR_GLSBOUNDEDRECORD,

+    EmfRecordTypePixelFormat             = 104, // EMR_PIXELFORMAT,

+    EmfRecordTypeDrawEscape              = 105, // EMR_RESERVED_105,

+    EmfRecordTypeExtEscape               = 106, // EMR_RESERVED_106,

+    EmfRecordTypeStartDoc                = 107, // EMR_RESERVED_107,

+    EmfRecordTypeSmallTextOut            = 108, // EMR_RESERVED_108,

+    EmfRecordTypeForceUFIMapping         = 109, // EMR_RESERVED_109,

+    EmfRecordTypeNamedEscape             = 110, // EMR_RESERVED_110,

+    EmfRecordTypeColorCorrectPalette     = 111, // EMR_COLORCORRECTPALETTE,

+    EmfRecordTypeSetICMProfileA          = 112, // EMR_SETICMPROFILEA,

+    EmfRecordTypeSetICMProfileW          = 113, // EMR_SETICMPROFILEW,

+    EmfRecordTypeAlphaBlend              = 114, // EMR_ALPHABLEND,

+    EmfRecordTypeSetLayout               = 115, // EMR_SETLAYOUT,

+    EmfRecordTypeTransparentBlt          = 116, // EMR_TRANSPARENTBLT,

+    EmfRecordTypeReserved_117            = 117, // Not Used

+    EmfRecordTypeGradientFill            = 118, // EMR_GRADIENTFILL,

+    EmfRecordTypeSetLinkedUFIs           = 119, // EMR_RESERVED_119,

+    EmfRecordTypeSetTextJustification    = 120, // EMR_RESERVED_120,

+    EmfRecordTypeColorMatchToTargetW     = 121, // EMR_COLORMATCHTOTARGETW,

+    EmfRecordTypeCreateColorSpaceW       = 122, // EMR_CREATECOLORSPACEW,

+    EmfRecordTypeMax                     = 122,

+    EmfRecordTypeMin                     = 1,

+

+    // That is the END of the GDI EMF records.

+

+    // Now we start the list of EMF+ records.  We leave quite

+    // a bit of room here for the addition of any new GDI

+    // records that may be added later.

+

+    EmfPlusRecordTypeInvalid = GDIP_EMFPLUS_RECORD_BASE,

+    EmfPlusRecordTypeHeader,

+    EmfPlusRecordTypeEndOfFile,

+

+    EmfPlusRecordTypeComment,

+

+    EmfPlusRecordTypeGetDC,    // the application grabbed the metafile dc

+

+    EmfPlusRecordTypeMultiFormatStart,

+    EmfPlusRecordTypeMultiFormatSection,

+    EmfPlusRecordTypeMultiFormatEnd,

+

+    // For all persistent objects

+    EmfPlusRecordTypeObject, // brush,pen,path,region,image,font,string-format

+

+    // Drawing Records

+    EmfPlusRecordTypeClear,

+    EmfPlusRecordTypeFillRects,

+    EmfPlusRecordTypeDrawRects,

+    EmfPlusRecordTypeFillPolygon,

+    EmfPlusRecordTypeDrawLines,

+    EmfPlusRecordTypeFillEllipse,

+    EmfPlusRecordTypeDrawEllipse,

+    EmfPlusRecordTypeFillPie,

+    EmfPlusRecordTypeDrawPie,

+    EmfPlusRecordTypeDrawArc,

+    EmfPlusRecordTypeFillRegion,

+    EmfPlusRecordTypeFillPath,

+    EmfPlusRecordTypeDrawPath,

+    EmfPlusRecordTypeFillClosedCurve,

+    EmfPlusRecordTypeDrawClosedCurve,

+    EmfPlusRecordTypeDrawCurve,

+    EmfPlusRecordTypeDrawBeziers,

+    EmfPlusRecordTypeDrawImage,

+    EmfPlusRecordTypeDrawImagePoints,

+    EmfPlusRecordTypeDrawString,

+

+    // Graphics State Records

+    EmfPlusRecordTypeSetRenderingOrigin,

+    EmfPlusRecordTypeSetAntiAliasMode,

+    EmfPlusRecordTypeSetTextRenderingHint,

+#ifdef DCR_USE_NEW_188922

+   EmfPlusRecordTypeSetTextContrast,

+#else

+   EmfPlusRecordTypeSetGammaValue,

+#endif // DCR_USE_NEW_188922

+    EmfPlusRecordTypeSetInterpolationMode,

+    EmfPlusRecordTypeSetPixelOffsetMode,

+    EmfPlusRecordTypeSetCompositingMode,

+    EmfPlusRecordTypeSetCompositingQuality,

+    EmfPlusRecordTypeSave,

+    EmfPlusRecordTypeRestore,

+    EmfPlusRecordTypeBeginContainer,

+    EmfPlusRecordTypeBeginContainerNoParams,

+    EmfPlusRecordTypeEndContainer,

+    EmfPlusRecordTypeSetWorldTransform,

+    EmfPlusRecordTypeResetWorldTransform,

+    EmfPlusRecordTypeMultiplyWorldTransform,

+    EmfPlusRecordTypeTranslateWorldTransform,

+    EmfPlusRecordTypeScaleWorldTransform,

+    EmfPlusRecordTypeRotateWorldTransform,

+    EmfPlusRecordTypeSetPageTransform,

+    EmfPlusRecordTypeResetClip,

+    EmfPlusRecordTypeSetClipRect,

+    EmfPlusRecordTypeSetClipPath,

+    EmfPlusRecordTypeSetClipRegion,

+    EmfPlusRecordTypeOffsetClip,

+

+    // New record types must be added here (at the end) -- do not add above,

+    // since that will invalidate previous metafiles!

+    EmfPlusRecordTypeDrawDriverString,

+

+    // Have this here so you don't need to keep changing the value of

+    // EmfPlusRecordTypeMax every time you add a new record.

+

+    EmfPlusRecordTotal,

+

+    EmfPlusRecordTypeMax = EmfPlusRecordTotal-1,

+    EmfPlusRecordTypeMin = EmfPlusRecordTypeHeader,

+};

+

+//---------------------------------------------------------------------------

+// StringFormatFlags

+//---------------------------------------------------------------------------

+

+//---------------------------------------------------------------------------

+// String format flags

+//

+//  DirectionRightToLeft          - For horizontal text, the reading order is

+//                                  right to left. This value is called

+//                                  the base embedding level by the Unicode

+//                                  bidirectional engine.

+//                                  For vertical text, columns are read from

+//                                  right to left.

+//                                  By default, horizontal or vertical text is

+//                                  read from left to right.

+//

+//  DirectionVertical             - Individual lines of text are vertical. In

+//                                  each line, characters progress from top to

+//                                  bottom.

+//                                  By default, lines of text are horizontal,

+//                                  each new line below the previous line.

+//

+//  NoFitBlackBox                 - Allows parts of glyphs to overhang the

+//                                  bounding rectangle.

+//                                  By default glyphs are first aligned

+//                                  inside the margines, then any glyphs which

+//                                  still overhang the bounding box are

+//                                  repositioned to avoid any overhang.

+//                                  For example when an italic

+//                                  lower case letter f in a font such as

+//                                  Garamond is aligned at the far left of a

+//                                  rectangle, the lower part of the f will

+//                                  reach slightly further left than the left

+//                                  edge of the rectangle. Setting this flag

+//                                  will ensure the character aligns visually

+//                                  with the lines above and below, but may

+//                                  cause some pixels outside the formatting

+//                                  rectangle to be clipped or painted.

+//

+#ifndef DCR_USE_NEW_137252

+//  NumberContextArabic           - Causes any initial numeric in the string to

+//                                  be analysed for bidirection layout as if

+//                                  it was preceeded by Arabic text.

+//

+//  DisableKashidaJustification   - Arabic text will not be justified by the

+//                                  insertion of kashidas (i.e. extending the

+//                                  joining line between characters). Instead

+//                                  Arabic script will be justified by the

+//                                  widening of the whitespace between words.

+//

+#endif

+//  DisplayFormatControl          - Causes control characters such as the

+//                                  left-to-right mark to be shown in the

+//                                  output with a representative glyph.

+//

+#ifndef DCR_USE_NEW_137252

+//  DisableKerning                - Disables Truetype and OpenType kerning.

+//

+//  DisableLigatures              - Disables Truetype and OpenType ligatures.

+//

+//  LayoutLegacyBidi              - Causes the bidirection algorithm to use

+//                                  slightly different classifications for

+//                                  '+', '-' and '/' that make their layout

+//                                  much closer to that expected by files

+//                                  generated in Windows or by Windows

+//                                  applications.

+//

+//  NoChanges                     - A text imager created with this flag set

+//                                  does not support those APIs that change

+//                                  it's contents or formatting, but for most

+//                                  simple text will be significantly faster in

+//                                  performing measurement and drawing

+//                                  functions.

+//

+#endif

+//  NoFontFallback                - Disables fallback to alternate fonts for

+//                                  characters not supported in the requested

+//                                  font. Any missing characters will be

+//                                  be displayed with the fonts missing glyph,

+//                                  usually an open square.

+//

+//  NoWrap                        - Disables wrapping of text between lines

+//                                  when formatting within a rectangle.

+//                                  NoWrap is implied when a point is passed

+//                                  instead of a rectangle, or when the

+//                                  specified rectangle has a zero line length.

+//

+//  NoClip                        - By default text is clipped to the

+//                                  formatting rectangle. Setting NoClip

+//                                  allows overhanging pixels to affect the

+//                                  device outside the formatting rectangle.

+//                                  Pixels at the end of the line may be

+//                                  affected if the glyphs overhang their

+//                                  cells, and either the NoFitBlackBox flag

+//                                  has been set, or the glyph extends to far

+//                                  to be fitted.

+//                                  Pixels above/before the first line or

+//                                  below/after the last line may be affected

+//                                  if the glyphs extend beyond their cell

+//                                  ascent / descent. This can occur rarely

+//                                  with unusual diacritic mark combinations.

+

+//---------------------------------------------------------------------------

+

+enum StringFormatFlags

+{

+    StringFormatFlagsDirectionRightToLeft        = 0x00000001,

+    StringFormatFlagsDirectionVertical           = 0x00000002,

+    StringFormatFlagsNoFitBlackBox               = 0x00000004,

+#ifndef DCR_USE_NEW_137252

+    StringFormatFlagsNumberContextArabic         = 0x00000008,

+    StringFormatFlagsDisableKashidaJustification = 0x00000010,

+#endif

+    StringFormatFlagsDisplayFormatControl        = 0x00000020,

+#ifndef DCR_USE_NEW_137252

+    StringFormatFlagsDisableKerning              = 0x00000040,

+    StringFormatFlagsDisableLigatures            = 0x00000080,

+    StringFormatFlagsLayoutLegacyBidi            = 0x00000100,

+    StringFormatFlagsNoChanges                   = 0x00000200,

+#endif

+    StringFormatFlagsNoFontFallback              = 0x00000400,

+    StringFormatFlagsMeasureTrailingSpaces       = 0x00000800,

+    StringFormatFlagsNoWrap                      = 0x00001000,

+    StringFormatFlagsLineLimit                   = 0x00002000,

+

+    StringFormatFlagsNoClip                      = 0x00004000

+};

+

+//---------------------------------------------------------------------------

+// StringTrimming

+//---------------------------------------------------------------------------

+

+enum StringTrimming {

+    StringTrimmingNone              = 0,

+    StringTrimmingCharacter         = 1,

+    StringTrimmingWord              = 2,

+    StringTrimmingEllipsisCharacter = 3,

+    StringTrimmingEllipsisWord      = 4,

+    StringTrimmingEllipsisPath      = 5

+};

+

+#ifndef DCR_USE_NEW_137252

+//---------------------------------------------------------------------------

+// String units

+//

+// String units are like length units in CSS, they may be absolute, or

+// they may be relative to a font size.

+//

+//---------------------------------------------------------------------------

+

+enum StringUnit {

+    StringUnitWorld        = UnitWorld,

+    StringUnitDisplay      = UnitDisplay,

+    StringUnitPixel        = UnitPixel,

+    StringUnitPoint        = UnitPoint,

+    StringUnitInch         = UnitInch,

+    StringUnitDocument     = UnitDocument,

+    StringUnitMillimeter   = UnitMillimeter,

+    StringUnitEm           = 32

+};

+#endif

+

+#ifndef DCR_USE_NEW_152154

+//---------------------------------------------------------------------------

+// Line spacing flags

+//---------------------------------------------------------------------------

+

+enum LineSpacing {

+    LineSpacingWorld                = UnitWorld,

+    LineSpacingDisplay              = UnitDisplay,

+    LineSpacingPixel                = UnitPixel,

+    LineSpacingPoint                = UnitPoint,

+    LineSpacingInch                 = UnitInch,

+    LineSpacingDocument             = UnitDocument,

+    LineSpacingMillimeter           = UnitMillimeter,

+

+    LineSpacingRecommended          = 32,

+    LineSpacingAtLeast              = 33,

+    LineSpacingAtLeastMultiple      = 34,

+    LineSpacingCell                 = 35,

+    LineSpacingCellAtLeast          = 36,

+    LineSpacingCellAtLeastMultiple  = 37

+};

+

+/// The following methods of linespacing are relative to the font size

+//

+// =========== Method ===========  =============== Relative to ===============

+//

+// LineSpacingRecommended          recommended line spacing specified by font

+// LineSpacingAtLeast              max(recommended, tallest glyph cell)

+// LineSpacingAtLeastMultiple      smallest multiple of recommended big enough

+//                                 for all glyph cells on the line

+// LineSpacingCell                 cell height

+// LineSpacingCellAtLeast          max(font cell height, tallest glyph cell)

+// LineSpacingCellAtLeastMultiple  smallest multiple of cell height big enough

+//                                 for all glyph cells on the line

+#endif

+

+

+//---------------------------------------------------------------------------

+// National language digit substitution

+//---------------------------------------------------------------------------

+

+enum StringDigitSubstitute

+{

+    StringDigitSubstituteUser        = 0,  // As NLS setting

+    StringDigitSubstituteNone        = 1,

+    StringDigitSubstituteNational    = 2,

+    StringDigitSubstituteTraditional = 3

+};

+

+//---------------------------------------------------------------------------

+// Hotkey prefix interpretation

+//---------------------------------------------------------------------------

+

+enum HotkeyPrefix

+{

+    HotkeyPrefixNone        = 0,

+    HotkeyPrefixShow        = 1,

+    HotkeyPrefixHide        = 2

+};

+

+//---------------------------------------------------------------------------

+// Text alignment flags

+//---------------------------------------------------------------------------

+

+enum StringAlignment

+{

+    // Left edge for left-to-right text,

+    // right for right-to-left text,

+    // and top for vertical

+    StringAlignmentNear   = 0,

+    StringAlignmentCenter = 1,

+    StringAlignmentFar    = 2

+};

+

+//---------------------------------------------------------------------------

+// DriverStringOptions

+//---------------------------------------------------------------------------

+

+enum DriverStringOptions

+{

+    DriverStringOptionsCmapLookup             = 1,

+    DriverStringOptionsVertical               = 2,

+    DriverStringOptionsRealizedAdvance        = 4,

+#ifndef DCR_USE_NEW_137252

+    DriverStringOptionsCompensateResolution   = 8

+#endif

+};

+

+//---------------------------------------------------------------------------

+// Flush Intention flags

+//---------------------------------------------------------------------------

+

+enum FlushIntention

+{

+    FlushIntentionFlush = 0,        // Flush all batched rendering operations

+    FlushIntentionSync = 1          // Flush all batched rendering operations

+                                    // and wait for them to complete

+};

+

+#ifndef DCR_USE_NEW_175866

+

+//---------------------------------------------------------------------------

+// Window Change Notification types

+//---------------------------------------------------------------------------

+

+enum WindowNotifyEnum

+{

+   WindowNotifyEnumEnable = 0,

+   WindowNotifyEnumDisable,

+   WindowNotifyEnumPalette,

+   WindowNotifyEnumDisplay,

+   WindowNotifyEnumSysColor

+};

+

+#endif

+

+//---------------------------------------------------------------------------

+// Image encoder parameter related types

+//---------------------------------------------------------------------------

+

+#ifdef DCR_USE_NEW_145804

+enum EncoderParameterValueType

+{

+    EncoderParameterValueTypeByte           = 1,    // 8-bit unsigned int

+    EncoderParameterValueTypeASCII          = 2,    // 8-bit byte containing one 7-bit ASCII

+                                                    // code. NULL terminated.

+    EncoderParameterValueTypeShort          = 3,    // 16-bit unsigned int

+    EncoderParameterValueTypeLong           = 4,    // 32-bit unsigned int

+    EncoderParameterValueTypeRational       = 5,    // Two Longs. The first Long is the

+                                                    // numerator, the second Long expresses the

+                                                    // denomintor.

+    EncoderParameterValueTypeLongRange      = 6,    // Two longs which specify a range of

+                                                    // integer values. The first Long specifies

+                                                    // the lower end and the second one

+                                                    // specifies the higher end. All values

+                                                    // are inclusive at both ends

+    EncoderParameterValueTypeUndefined      = 7,    // 8-bit byte that can take any value

+                                                    // depending on field definition

+    EncoderParameterValueTypeRationalRange  = 8     // Two Rationals. The first Rational

+                                                    // specifies the lower end and the second

+                                                    // specifies the higher end. All values

+                                                    // are inclusive at both ends

+};

+#else

+enum ValueType

+{

+    ValueTypeByte           = 1,    // 8-bit unsigned int

+    ValueTypeASCII          = 2,    // 8-bit byte containing one 7-bit ASCII

+                                    // code. NULL terminated.

+    ValueTypeShort          = 3,    // 16-bit unsigned int

+    ValueTypeLong           = 4,    // 32-bit unsigned int

+    ValueTypeRational       = 5,    // Two Longs. The first Long is the

+                                    // numerator, the second Long expresses the

+                                    // denomintor.

+    ValueTypeLongRange      = 6,    // Two longs which specify a range of

+                                    // integer values. The first Long specifies

+                                    // the lower end and the second one

+                                    // specifies the higher end. All values

+                                    // are inclusive at both ends

+    ValueTypeUndefined      = 7,    // 8-bit byte that can take any value

+                                    // depending on field definition

+    ValueTypeRationalRange  = 8     // Two Rationals. The first Rational

+                                    // specifies the lower end and the second

+                                    // specifies the higher end. All values

+                                    // are inclusive at both ends

+};

+#endif

+

+//---------------------------------------------------------------------------

+// Image encoder value types

+//---------------------------------------------------------------------------

+

+enum EncoderValue

+{

+    EncoderValueColorTypeCMYK,

+    EncoderValueColorTypeYCCK,

+    EncoderValueCompressionLZW,

+    EncoderValueCompressionCCITT3,

+    EncoderValueCompressionCCITT4,

+    EncoderValueCompressionRle,

+    EncoderValueCompressionNone,

+    EncoderValueScanMethodInterlaced,

+    EncoderValueScanMethodNonInterlaced,

+    EncoderValueVersionGif87,

+    EncoderValueVersionGif89,

+    EncoderValueRenderProgressive,

+    EncoderValueRenderNonProgressive,

+    EncoderValueTransformRotate90,

+    EncoderValueTransformRotate180,

+    EncoderValueTransformRotate270,

+    EncoderValueTransformFlipHorizontal,

+    EncoderValueTransformFlipVertical,

+    #ifdef DCR_USE_NEW_140861

+    EncoderValueMultiFrame,

+    #else

+    EncodeValueMultiFrame,

+    #endif

+    EncoderValueLastFrame,

+    EncoderValueFlush,

+    #ifdef DCR_USE_NEW_140861

+    EncoderValueFrameDimensionTime,

+    EncoderValueFrameDimensionResolution,

+    EncoderValueFrameDimensionPage

+    #else

+    EncodeValueFrameDimensionTime,

+    EncodeValueFrameDimensionResolution,

+    EncodeValueFrameDimensionPage

+    #endif

+};

+

+//---------------------------------------------------------------------------

+// Graphics layout values (support for Middle East localization)

+//---------------------------------------------------------------------------

+

+enum GraphicsLayout

+{

+    GraphicsLayoutNormal,

+    GraphicsLayoutMirrored,

+    GraphicsLayoutMirroredIgnoreImages,

+    GraphicsLayoutMirroredForceImages

+};

+

+//---------------------------------------------------------------------------

+// Image layout values (support for Middle East localization)

+//---------------------------------------------------------------------------

+

+enum ImageLayout

+{

+    ImageLayoutNormal,

+    ImageLayoutIgnoreMirrored

+};

+

+enum EmfToWmfBitsFlags

+{

+    EmfToWmfBitsFlagsDefault    = 0x00000000,

+    EmfToWmfBitsFlagsEmbedEmf   = 0x00000001,

+    EmfToWmfBitsFlagsIncludeAPM = 0x00000002,

+    EmfToWmfBitsFlagsNoXORClip  = 0x00000004

+};

+

+#endif // !_GDIPLUSENUMS_H

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h
new file mode 100644
index 0000000..8b5369e
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h
@@ -0,0 +1,2740 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusFlat.h

+*

+* Abstract:

+*

+*   Flat GDI+ API wrappers - header file

+*

+\**************************************************************************/

+

+// TODO: this file style needs to be made internally consistent with the way

+//       it handles breaking the long argument lists across multiple lines

+

+#ifndef _FLATAPI_H

+#define _FLATAPI_H

+

+#define WINGDIPAPI __stdcall

+

+// currently, only C++ wrapper API's force const.

+

+#define GDIPCONST const

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#ifndef DCR_USE_NEW_175866

+

+VOID

+WINGDIPAPI

+GdipDisplayPaletteWindowNotify(WindowNotifyEnum notify);

+

+#endif

+

+//----------------------------------------------------------------------------

+// GraphicsPath methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreatePath(GpFillMode brushMode, GpPath **path);

+

+GpStatus WINGDIPAPI

+GdipCreatePath2(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode,

+                                    GpPath **path);

+

+GpStatus WINGDIPAPI

+GdipCreatePath2I(GDIPCONST GpPoint*, GDIPCONST BYTE*, INT, GpFillMode,

+                                     GpPath **path);

+

+GpStatus WINGDIPAPI

+GdipClonePath(GpPath* path, GpPath **clonePath);

+

+GpStatus WINGDIPAPI

+GdipDeletePath(GpPath* path);

+

+GpStatus WINGDIPAPI

+GdipResetPath(GpPath* path);

+

+GpStatus WINGDIPAPI

+GdipGetPointCount(GpPath* path, INT* count);

+

+GpStatus WINGDIPAPI

+GdipGetPathTypes(GpPath* path, BYTE* types, INT count);

+

+GpStatus WINGDIPAPI

+GdipGetPathPoints(GpPath*, GpPointF* points, INT count);

+

+GpStatus WINGDIPAPI

+GdipGetPathPointsI(GpPath*, GpPoint* points, INT count);

+

+GpStatus WINGDIPAPI

+GdipGetPathFillMode(GpPath *path, GpFillMode *fillmode);

+

+GpStatus WINGDIPAPI

+GdipSetPathFillMode(GpPath *path, GpFillMode fillmode);

+

+GpStatus WINGDIPAPI

+GdipGetPathData(GpPath *path, GpPathData* pathData);

+

+GpStatus WINGDIPAPI

+GdipStartPathFigure(GpPath *path);

+

+GpStatus WINGDIPAPI

+GdipClosePathFigure(GpPath *path);

+

+GpStatus WINGDIPAPI

+GdipClosePathFigures(GpPath *path);

+

+GpStatus WINGDIPAPI

+GdipSetPathMarker(GpPath* path);

+

+GpStatus WINGDIPAPI

+GdipClearPathMarkers(GpPath* path);

+

+GpStatus WINGDIPAPI

+GdipReversePath(GpPath* path);

+

+GpStatus WINGDIPAPI

+GdipGetPathLastPoint(GpPath* path, GpPointF* lastPoint);

+

+GpStatus WINGDIPAPI

+GdipAddPathLine(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2);

+

+GpStatus WINGDIPAPI

+GdipAddPathLine2(GpPath *path, GDIPCONST GpPointF *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipAddPathArc(GpPath *path, REAL x, REAL y, REAL width, REAL height,

+                        REAL startAngle, REAL sweepAngle);

+

+GpStatus WINGDIPAPI

+GdipAddPathBezier(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2,

+                           REAL x3, REAL y3, REAL x4, REAL y4);

+

+GpStatus WINGDIPAPI

+GdipAddPathBeziers(GpPath *path, GDIPCONST GpPointF *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipAddPathCurve(GpPath *path, GDIPCONST GpPointF *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipAddPathCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count,

+                           REAL tension);

+

+GpStatus WINGDIPAPI

+GdipAddPathCurve3(GpPath *path, GDIPCONST GpPointF *points, INT count,

+                           INT offset, INT numberOfSegments, REAL tension);

+

+GpStatus WINGDIPAPI

+GdipAddPathClosedCurve(GpPath *path, GDIPCONST GpPointF *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipAddPathClosedCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count,

+                                 REAL tension);

+

+GpStatus WINGDIPAPI

+GdipAddPathRectangle(GpPath *path, REAL x, REAL y, REAL width, REAL height);

+

+GpStatus WINGDIPAPI

+GdipAddPathRectangles(GpPath *path, GDIPCONST GpRectF *rects, INT count);

+

+GpStatus WINGDIPAPI

+GdipAddPathEllipse(GpPath *path, REAL x, REAL y, REAL width,

+                            REAL height);

+

+GpStatus WINGDIPAPI

+GdipAddPathPie(GpPath *path, REAL x, REAL y, REAL width, REAL height,

+                        REAL startAngle, REAL sweepAngle);

+

+GpStatus WINGDIPAPI

+GdipAddPathPolygon(GpPath *path, GDIPCONST GpPointF *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipAddPathPath(GpPath *path, GDIPCONST GpPath* addingPath, BOOL connect);

+

+GpStatus WINGDIPAPI

+GdipAddPathString(GpPath *path, GDIPCONST WCHAR *string,

+                        INT length, GDIPCONST GpFontFamily *family, INT style,

+                        REAL emSize, GDIPCONST RectF *layoutRect,

+                        GDIPCONST GpStringFormat *format);

+

+GpStatus WINGDIPAPI

+GdipAddPathStringI(GpPath *path, GDIPCONST WCHAR *string,

+                        INT length, GDIPCONST GpFontFamily *family, INT style,

+                        REAL emSize, GDIPCONST Rect *layoutRect,

+                        GDIPCONST GpStringFormat *format);

+

+GpStatus WINGDIPAPI

+GdipAddPathLineI(GpPath *path, INT x1, INT y1, INT x2, INT y2);

+

+GpStatus WINGDIPAPI

+GdipAddPathLine2I(GpPath *path, GDIPCONST GpPoint *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipAddPathArcI(GpPath *path, INT x, INT y, INT width, INT height,

+                        REAL startAngle, REAL sweepAngle);

+

+GpStatus WINGDIPAPI

+GdipAddPathBezierI(GpPath *path, INT x1, INT y1, INT x2, INT y2,

+                           INT x3, INT y3, INT x4, INT y4);

+

+GpStatus WINGDIPAPI

+GdipAddPathBeziersI(GpPath *path, GDIPCONST GpPoint *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipAddPathCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipAddPathCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT count,

+                           REAL tension);

+

+GpStatus WINGDIPAPI

+GdipAddPathCurve3I(GpPath *path, GDIPCONST GpPoint *points, INT count,

+                           INT offset, INT numberOfSegments, REAL tension);

+

+GpStatus WINGDIPAPI

+GdipAddPathClosedCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipAddPathClosedCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT count,

+                                 REAL tension);

+

+GpStatus WINGDIPAPI

+GdipAddPathRectangleI(GpPath *path, INT x, INT y, INT width, INT height);

+

+GpStatus WINGDIPAPI

+GdipAddPathRectanglesI(GpPath *path, GDIPCONST GpRect *rects, INT count);

+

+GpStatus WINGDIPAPI

+GdipAddPathEllipseI(GpPath *path, INT x, INT y, INT width, INT height);

+

+GpStatus WINGDIPAPI

+GdipAddPathPieI(GpPath *path, INT x, INT y, INT width, INT height,

+                        REAL startAngle, REAL sweepAngle);

+

+GpStatus WINGDIPAPI

+GdipAddPathPolygonI(GpPath *path, GDIPCONST GpPoint *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipFlattenPath(GpPath *path, GpMatrix* matrix, REAL flatness);

+

+GpStatus WINGDIPAPI

+GdipWindingModeOutline(

+    GpPath *path,

+    GpMatrix *matrix,

+    REAL flatness

+);

+

+

+#ifdef DCR_USE_NEW_202903

+

+GpStatus WINGDIPAPI

+GdipWidenPath(

+    GpPath *nativePath,

+    GpPen *pen,

+    GpMatrix *matrix,

+    REAL flatness

+);

+

+#else

+

+GpStatus WINGDIPAPI

+GdipWidenPathWithMinimumResolutions(GpPath *path, GpPen *pen, REAL minXres,

+            REAL minYres, GpMatrix *matrix, BOOL removeSelftIntersects);

+

+#endif

+

+GpStatus WINGDIPAPI

+GdipWarpPath(GpPath *path, GpMatrix* matrix,

+            GDIPCONST GpPointF *points, INT count,

+            REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight,

+            WarpMode warpMode, REAL flatness);

+

+GpStatus WINGDIPAPI

+GdipTransformPath(GpPath* path, GpMatrix* matrix);

+

+GpStatus WINGDIPAPI

+GdipGetPathWorldBounds(GpPath* path, GpRectF* bounds, GDIPCONST GpMatrix *matrix,

+                  GDIPCONST GpPen *pen);

+

+GpStatus WINGDIPAPI

+GdipGetPathWorldBoundsI(GpPath* path, GpRect* bounds, GDIPCONST GpMatrix *matrix,

+                   GDIPCONST GpPen *pen);

+

+GpStatus WINGDIPAPI

+GdipIsVisiblePathPoint(GpPath* path, REAL x, REAL y,

+                       GpGraphics *graphics, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsVisiblePathPointI(GpPath* path, INT x, INT y,

+                        GpGraphics *graphics, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsOutlineVisiblePathPoint(GpPath* path, REAL x, REAL y, GpPen *pen,

+                              GpGraphics *graphics, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsOutlineVisiblePathPointI(GpPath* path, INT x, INT y, GpPen *pen,

+                               GpGraphics *graphics, BOOL *result);

+

+

+//----------------------------------------------------------------------------

+// Path Enumeration methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreatePathIter(GpPathIterator **iterator, GpPath* path);

+

+GpStatus WINGDIPAPI

+GdipDeletePathIter(GpPathIterator *iterator);

+

+GpStatus WINGDIPAPI

+GdipPathIterNextSubpath(GpPathIterator* iterator, INT *resultCount,

+        INT* startIndex, INT* endIndex, BOOL* isClosed);

+

+GpStatus WINGDIPAPI

+GdipPathIterNextSubpathPath(GpPathIterator* iterator, INT* resultCount,

+        GpPath* path, BOOL* isClosed);

+

+GpStatus WINGDIPAPI

+GdipPathIterNextPathType(GpPathIterator* iterator, INT* resultCount,

+        BYTE* pathType, INT* startIndex, INT* endIndex);

+

+GpStatus WINGDIPAPI

+GdipPathIterNextMarker(GpPathIterator* iterator, INT *resultCount,

+        INT* startIndex, INT* endIndex);

+

+GpStatus WINGDIPAPI

+GdipPathIterNextMarkerPath(GpPathIterator* iterator, INT* resultCount,

+        GpPath* path);

+

+GpStatus WINGDIPAPI

+GdipPathIterGetCount(GpPathIterator* iterator, INT* count);

+

+GpStatus WINGDIPAPI

+GdipPathIterGetSubpathCount(GpPathIterator* iterator, INT* count);

+

+GpStatus WINGDIPAPI

+GdipPathIterIsValid(GpPathIterator* iterator, BOOL* valid);

+

+GpStatus WINGDIPAPI

+GdipPathIterHasCurve(GpPathIterator* iterator, BOOL* hasCurve);

+

+GpStatus WINGDIPAPI

+GdipPathIterRewind(GpPathIterator* iterator);

+

+GpStatus WINGDIPAPI

+GdipPathIterEnumerate(GpPathIterator* iterator, INT* resultCount,

+    GpPointF *points, BYTE *types, INT count);

+

+GpStatus WINGDIPAPI

+GdipPathIterCopyData(GpPathIterator* iterator, INT* resultCount,

+    GpPointF* points, BYTE* types, INT startIndex, INT endIndex);

+

+//----------------------------------------------------------------------------

+// Matrix methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateMatrix(GpMatrix **matrix);

+

+GpStatus WINGDIPAPI

+GdipCreateMatrix2(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx,

+                                      REAL dy, GpMatrix **matrix);

+

+GpStatus WINGDIPAPI

+GdipCreateMatrix3(GDIPCONST GpRectF *rect, GDIPCONST GpPointF *dstplg,

+                                      GpMatrix **matrix);

+

+GpStatus WINGDIPAPI

+GdipCreateMatrix3I(GDIPCONST GpRect *rect, GDIPCONST GpPoint *dstplg,

+                                       GpMatrix **matrix);

+

+GpStatus WINGDIPAPI

+GdipCloneMatrix(GpMatrix *matrix, GpMatrix **cloneMatrix);

+

+GpStatus WINGDIPAPI

+GdipDeleteMatrix(GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipSetMatrixElements(GpMatrix *matrix, REAL m11, REAL m12, REAL m21, REAL m22,

+                      REAL dx, REAL dy);

+

+GpStatus WINGDIPAPI

+GdipMultiplyMatrix(GpMatrix *matrix, GpMatrix* matrix2,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipTranslateMatrix(GpMatrix *matrix, REAL offsetX, REAL offsetY,

+                    GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipScaleMatrix(GpMatrix *matrix, REAL scaleX, REAL scaleY,

+                GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipRotateMatrix(GpMatrix *matrix, REAL angle, GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipShearMatrix(GpMatrix *matrix, REAL shearX, REAL shearY,

+                GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipInvertMatrix(GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts, INT count);

+

+GpStatus WINGDIPAPI

+GdipTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts, INT count);

+

+GpStatus WINGDIPAPI

+GdipVectorTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts,

+                                         INT count);

+

+GpStatus WINGDIPAPI

+GdipVectorTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts,

+                                         INT count);

+

+GpStatus WINGDIPAPI

+GdipGetMatrixElements(GDIPCONST GpMatrix *matrix, REAL *matrixOut);

+

+GpStatus WINGDIPAPI

+GdipIsMatrixInvertible(GDIPCONST GpMatrix *matrix, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsMatrixIdentity(GDIPCONST GpMatrix *matrix, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsMatrixEqual(GDIPCONST GpMatrix *matrix, GDIPCONST GpMatrix *matrix2, BOOL *result);

+

+//----------------------------------------------------------------------------

+// Region methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateRegion(GpRegion **region);

+

+GpStatus WINGDIPAPI

+GdipCreateRegionRect(GDIPCONST GpRectF *rect, GpRegion **region);

+

+GpStatus WINGDIPAPI

+GdipCreateRegionRectI(GDIPCONST GpRect *rect, GpRegion **region);

+

+GpStatus WINGDIPAPI

+GdipCreateRegionPath(GpPath *path, GpRegion **region);

+

+GpStatus WINGDIPAPI

+GdipCreateRegionRgnData(GDIPCONST BYTE *regionData, INT size, GpRegion **region);

+

+GpStatus WINGDIPAPI

+GdipCreateRegionHrgn(HRGN hRgn, GpRegion **region);

+

+GpStatus WINGDIPAPI

+GdipCloneRegion(GpRegion *region, GpRegion **cloneRegion);

+

+GpStatus WINGDIPAPI

+GdipDeleteRegion(GpRegion *region);

+

+GpStatus WINGDIPAPI

+GdipSetInfinite(GpRegion *region);

+

+GpStatus WINGDIPAPI

+GdipSetEmpty(GpRegion *region);

+

+GpStatus WINGDIPAPI

+GdipCombineRegionRect(GpRegion *region, GDIPCONST GpRectF *rect,

+                      CombineMode combineMode);

+

+GpStatus WINGDIPAPI

+GdipCombineRegionRectI(GpRegion *region, GDIPCONST GpRect *rect,

+                       CombineMode combineMode);

+

+GpStatus WINGDIPAPI

+GdipCombineRegionPath(GpRegion *region, GpPath *path, CombineMode combineMode);

+

+GpStatus WINGDIPAPI

+GdipCombineRegionRegion(GpRegion *region,  GpRegion *region2,

+                        CombineMode combineMode);

+

+GpStatus WINGDIPAPI

+GdipTranslateRegion(GpRegion *region, REAL dx, REAL dy);

+

+GpStatus WINGDIPAPI

+GdipTranslateRegionI(GpRegion *region, INT dx, INT dy);

+

+GpStatus WINGDIPAPI

+GdipTransformRegion(GpRegion *region, GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics,

+                             GpRectF *rect);

+

+GpStatus WINGDIPAPI

+GdipGetRegionBoundsI(GpRegion *region, GpGraphics *graphics,

+                             GpRect *rect);

+

+GpStatus WINGDIPAPI

+GdipGetRegionHRgn(GpRegion *region, GpGraphics *graphics, HRGN *hRgn);

+

+GpStatus WINGDIPAPI

+GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics,

+                           BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsInfiniteRegion(GpRegion *region, GpGraphics *graphics,

+                              BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsEqualRegion(GpRegion *region, GpRegion *region2,

+                           GpGraphics *graphics, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipGetRegionDataSize(GpRegion *region, UINT * bufferSize);

+

+GpStatus WINGDIPAPI

+GdipGetRegionData(GpRegion *region, BYTE * buffer, UINT bufferSize, UINT * sizeFilled);

+

+GpStatus WINGDIPAPI

+GdipIsVisibleRegionPoint(GpRegion *region, REAL x, REAL y,

+                                  GpGraphics *graphics, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsVisibleRegionPointI(GpRegion *region, INT x, INT y,

+                                  GpGraphics *graphics, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsVisibleRegionRect(GpRegion *region, REAL x, REAL y, REAL width,

+                        REAL height, GpGraphics *graphics, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsVisibleRegionRectI(GpRegion *region, INT x, INT y, INT width,

+                         INT height, GpGraphics *graphics, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipGetRegionScansCount(GpRegion *region, UINT* count, GpMatrix* matrix);

+

+GpStatus WINGDIPAPI

+GdipGetRegionScans(GpRegion *region, GpRectF* rects, INT* count, GpMatrix* matrix);

+

+GpStatus WINGDIPAPI

+GdipGetRegionScansI(GpRegion *region, GpRect* rects, INT* count, GpMatrix* matrix);

+

+//----------------------------------------------------------------------------

+// Brush methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCloneBrush(GpBrush *brush, GpBrush **cloneBrush);

+

+GpStatus WINGDIPAPI

+GdipDeleteBrush(GpBrush *brush);

+

+GpStatus WINGDIPAPI

+GdipGetBrushType(GpBrush *brush, GpBrushType *type);

+

+//----------------------------------------------------------------------------

+// Hatch Brush methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateHatchBrush(GpHatchStyle hatchstyle, ARGB forecol,

+                              ARGB backcol, GpHatch **brush);

+

+GpStatus WINGDIPAPI

+GdipGetHatchStyle(GpHatch *brush, GpHatchStyle *hatchstyle);

+

+GpStatus WINGDIPAPI

+GdipGetHatchForegroundColor(GpHatch *brush, ARGB* forecol);

+

+GpStatus WINGDIPAPI

+GdipGetHatchBackgroundColor(GpHatch *brush, ARGB* backcol);

+

+//----------------------------------------------------------------------------

+// Texture Brush methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateTexture(GpImage *image, GpWrapMode wrapmode,

+                           GpTexture **texture);

+

+GpStatus WINGDIPAPI

+GdipCreateTexture2(GpImage *image, GpWrapMode wrapmode, REAL x,

+                   REAL y, REAL width, REAL height, GpTexture **texture);

+

+GpStatus WINGDIPAPI

+GdipCreateTextureIA(GpImage *image, GDIPCONST GpImageAttributes *imageAttributes,

+                    REAL x, REAL y, REAL width, REAL height,

+                    GpTexture **texture);

+

+GpStatus WINGDIPAPI

+GdipCreateTexture2I(GpImage *image, GpWrapMode wrapmode, INT x,

+                    INT y, INT width, INT height, GpTexture **texture);

+

+GpStatus WINGDIPAPI

+GdipCreateTextureIAI(GpImage *image, GDIPCONST GpImageAttributes *imageAttributes,

+                     INT x, INT y, INT width, INT height,

+                     GpTexture **texture);

+

+

+GpStatus WINGDIPAPI

+GdipGetTextureTransform(GpTexture *brush, GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipSetTextureTransform(GpTexture *brush, GDIPCONST GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipResetTextureTransform(GpTexture* brush);

+

+GpStatus WINGDIPAPI

+GdipMultiplyTextureTransform(GpTexture* brush, GDIPCONST GpMatrix *matrix,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipTranslateTextureTransform(GpTexture* brush, REAL dx, REAL dy,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipScaleTextureTransform(GpTexture* brush, REAL sx, REAL sy,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipRotateTextureTransform(GpTexture* brush, REAL angle, GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipSetTextureWrapMode(GpTexture *brush, GpWrapMode wrapmode);

+

+GpStatus WINGDIPAPI

+GdipGetTextureWrapMode(GpTexture *brush, GpWrapMode *wrapmode);

+

+GpStatus WINGDIPAPI

+GdipGetTextureImage(GpTexture *brush, GpImage **image);

+

+//----------------------------------------------------------------------------

+// Solid Brush methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateSolidFill(ARGB color, GpSolidFill **brush);

+

+GpStatus WINGDIPAPI

+GdipSetSolidFillColor(GpSolidFill *brush, ARGB color);

+

+GpStatus WINGDIPAPI

+GdipGetSolidFillColor(GpSolidFill *brush, ARGB *color);

+

+//----------------------------------------------------------------------------

+// LineBrush methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateLineBrush(GDIPCONST GpPointF* point1,

+                    GDIPCONST GpPointF* point2,

+                    ARGB color1, ARGB color2,

+                    GpWrapMode wrapMode,

+                    GpLineGradient **lineGradient);

+

+GpStatus WINGDIPAPI

+GdipCreateLineBrushI(GDIPCONST GpPoint* point1,

+                     GDIPCONST GpPoint* point2,

+                     ARGB color1, ARGB color2,

+                     GpWrapMode wrapMode,

+                     GpLineGradient **lineGradient);

+

+GpStatus WINGDIPAPI

+GdipCreateLineBrushFromRect(GDIPCONST GpRectF* rect,

+                            ARGB color1, ARGB color2,

+                            LinearGradientMode mode,

+                            GpWrapMode wrapMode,

+                            GpLineGradient **lineGradient);

+

+GpStatus WINGDIPAPI

+GdipCreateLineBrushFromRectI(GDIPCONST GpRect* rect,

+                             ARGB color1, ARGB color2,

+                             LinearGradientMode mode,

+                             GpWrapMode wrapMode,

+                             GpLineGradient **lineGradient);

+

+GpStatus WINGDIPAPI

+GdipCreateLineBrushFromRectWithAngle(GDIPCONST GpRectF* rect,

+                                     ARGB color1, ARGB color2,

+                                     REAL angle,

+                                     BOOL isAngleScalable,

+                                     GpWrapMode wrapMode,

+                                     GpLineGradient **lineGradient);

+

+GpStatus WINGDIPAPI

+GdipCreateLineBrushFromRectWithAngleI(GDIPCONST GpRect* rect,

+                                     ARGB color1, ARGB color2,

+                                     REAL angle,

+                                     BOOL isAngleScalable,

+                                     GpWrapMode wrapMode,

+                                     GpLineGradient **lineGradient);

+

+GpStatus WINGDIPAPI

+GdipSetLinePoints(GpLineGradient *brush,

+                  GDIPCONST GpPointF* point1,

+                  GDIPCONST GpPointF* point2);

+

+GpStatus WINGDIPAPI

+GdipSetLinePointsI(GpLineGradient *brush,

+                   GDIPCONST GpPoint* point1,

+                   GDIPCONST GpPoint* point2);

+

+GpStatus WINGDIPAPI

+GdipGetLinePoints(GpLineGradient *brush, GpPointF* points);

+

+GpStatus WINGDIPAPI

+GdipGetLinePointsI(GpLineGradient *brush, GpPoint* points);

+

+GpStatus WINGDIPAPI

+GdipSetLineColors(GpLineGradient *brush, ARGB color1, ARGB color2);

+

+GpStatus WINGDIPAPI

+GdipGetLineColors(GpLineGradient *brush, ARGB* colors);

+

+GpStatus WINGDIPAPI

+GdipGetLineRect(GpLineGradient *brush, GpRectF *rect);

+

+GpStatus WINGDIPAPI

+GdipGetLineRectI(GpLineGradient *brush, GpRect *rect);

+

+GpStatus WINGDIPAPI

+GdipSetLineGammaCorrection(GpLineGradient *brush, BOOL useGammaCorrection);

+

+GpStatus WINGDIPAPI

+GdipGetLineGammaCorrection(GpLineGradient *brush, BOOL *useGammaCorrection);

+

+GpStatus WINGDIPAPI

+GdipGetLineBlendCount(GpLineGradient *brush, INT *count);

+

+GpStatus WINGDIPAPI

+GdipGetLineBlend(GpLineGradient *brush, REAL *blend, REAL* positions,

+                 INT count);

+

+GpStatus WINGDIPAPI

+GdipSetLineBlend(GpLineGradient *brush, GDIPCONST REAL *blend,

+                 GDIPCONST REAL* positions, INT count);

+

+GpStatus WINGDIPAPI

+GdipGetLinePresetBlendCount(GpLineGradient *brush, INT *count);

+

+GpStatus WINGDIPAPI

+GdipGetLinePresetBlend(GpLineGradient *brush, ARGB *blend,

+                                           REAL* positions, INT count);

+

+GpStatus WINGDIPAPI

+GdipSetLinePresetBlend(GpLineGradient *brush, GDIPCONST ARGB *blend,

+                       GDIPCONST REAL* positions, INT count);

+

+GpStatus WINGDIPAPI

+GdipSetLineSigmaBlend(GpLineGradient *brush, REAL focus, REAL scale);

+

+GpStatus WINGDIPAPI

+GdipSetLineLinearBlend(GpLineGradient *brush, REAL focus, REAL scale);

+

+GpStatus WINGDIPAPI

+GdipSetLineWrapMode(GpLineGradient *brush, GpWrapMode wrapmode);

+

+GpStatus WINGDIPAPI

+GdipGetLineWrapMode(GpLineGradient *brush, GpWrapMode *wrapmode);

+

+GpStatus WINGDIPAPI

+GdipGetLineTransform(GpLineGradient *brush, GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipSetLineTransform(GpLineGradient *brush, GDIPCONST GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipResetLineTransform(GpLineGradient* brush);

+

+GpStatus WINGDIPAPI

+GdipMultiplyLineTransform(GpLineGradient* brush, GDIPCONST GpMatrix *matrix,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipTranslateLineTransform(GpLineGradient* brush, REAL dx, REAL dy,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipScaleLineTransform(GpLineGradient* brush, REAL sx, REAL sy,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipRotateLineTransform(GpLineGradient* brush, REAL angle, GpMatrixOrder order);

+

+//----------------------------------------------------------------------------

+// PathGradient Brush

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreatePathGradient(GDIPCONST GpPointF* points,

+                                    INT count,

+                                    GpWrapMode wrapMode,

+                                    GpPathGradient **polyGradient);

+

+GpStatus WINGDIPAPI

+GdipCreatePathGradientI(GDIPCONST GpPoint* points,

+                                    INT count,

+                                    GpWrapMode wrapMode,

+                                    GpPathGradient **polyGradient);

+

+GpStatus WINGDIPAPI

+GdipCreatePathGradientFromPath(GDIPCONST GpPath* path,

+                                    GpPathGradient **polyGradient);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientCenterColor(

+                        GpPathGradient *brush, ARGB* colors);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientCenterColor(

+                        GpPathGradient *brush, ARGB colors);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientSurroundColorsWithCount(

+                        GpPathGradient *brush, ARGB* color, INT* count);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientSurroundColorsWithCount(

+                        GpPathGradient *brush,

+                        GDIPCONST ARGB* color, INT* count);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientPath(GpPathGradient *brush, GpPath *path);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientPath(GpPathGradient *brush, GDIPCONST GpPath *path);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientCenterPoint(

+                        GpPathGradient *brush, GpPointF* points);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientCenterPointI(

+                        GpPathGradient *brush, GpPoint* points);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientCenterPoint(

+                        GpPathGradient *brush, GDIPCONST GpPointF* points);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientCenterPointI(

+                        GpPathGradient *brush, GDIPCONST GpPoint* points);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientRect(GpPathGradient *brush, GpRectF *rect);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientRectI(GpPathGradient *brush, GpRect *rect);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientPointCount(GpPathGradient *brush, INT* count);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientSurroundColorCount(GpPathGradient *brush, INT* count);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientGammaCorrection(GpPathGradient *brush, BOOL useGammaCorrection);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientGammaCorrection(GpPathGradient *brush, BOOL *useGammaCorrection);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientBlendCount(GpPathGradient *brush,

+                                             INT *count);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientBlend(GpPathGradient *brush,

+                                    REAL *blend, REAL *positions, INT count);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientBlend(GpPathGradient *brush,

+                GDIPCONST REAL *blend, GDIPCONST REAL *positions, INT count);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientPresetBlendCount(GpPathGradient *brush, INT *count);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientPresetBlend(GpPathGradient *brush, ARGB *blend,

+                                                REAL* positions, INT count);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientPresetBlend(GpPathGradient *brush, GDIPCONST ARGB *blend,

+                                        GDIPCONST REAL* positions, INT count);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientSigmaBlend(GpPathGradient *brush, REAL focus, REAL scale);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientLinearBlend(GpPathGradient *brush, REAL focus, REAL scale);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientWrapMode(GpPathGradient *brush,

+                                         GpWrapMode *wrapmode);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientWrapMode(GpPathGradient *brush,

+                                         GpWrapMode wrapmode);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientTransform(GpPathGradient *brush,

+                                          GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientTransform(GpPathGradient *brush,

+                                          GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipResetPathGradientTransform(GpPathGradient* brush);

+

+GpStatus WINGDIPAPI

+GdipMultiplyPathGradientTransform(GpPathGradient* brush, GDIPCONST GpMatrix *matrix,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipTranslatePathGradientTransform(GpPathGradient* brush, REAL dx, REAL dy,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipScalePathGradientTransform(GpPathGradient* brush, REAL sx, REAL sy,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipRotatePathGradientTransform(GpPathGradient* brush, REAL angle,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipGetPathGradientFocusScales(GpPathGradient *brush, REAL* xScale, REAL* yScale);

+

+GpStatus WINGDIPAPI

+GdipSetPathGradientFocusScales(GpPathGradient *brush, REAL xScale, REAL yScale);

+

+//----------------------------------------------------------------------------

+// Pen methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreatePen1(ARGB color, REAL width, GpUnit unit, GpPen **pen);

+

+GpStatus WINGDIPAPI

+GdipCreatePen2(GpBrush *brush, REAL width, GpUnit unit,

+                        GpPen **pen);

+

+GpStatus WINGDIPAPI

+GdipClonePen(GpPen *pen, GpPen **clonepen);

+

+GpStatus WINGDIPAPI

+GdipDeletePen(GpPen *pen);

+

+GpStatus WINGDIPAPI

+GdipSetPenWidth(GpPen *pen, REAL width);

+

+GpStatus WINGDIPAPI

+GdipGetPenWidth(GpPen *pen, REAL *width);

+

+GpStatus WINGDIPAPI

+GdipSetPenUnit(GpPen *pen, GpUnit unit);

+

+GpStatus WINGDIPAPI

+GdipGetPenUnit(GpPen *pen, GpUnit *unit);

+

+#ifdef DCR_USE_NEW_197819

+GpStatus WINGDIPAPI

+GdipSetPenLineCap197819(GpPen *pen, GpLineCap startCap, GpLineCap endCap,

+                  GpDashCap dashCap);

+#else

+GpStatus WINGDIPAPI

+GdipSetPenLineCap(GpPen *pen, GpLineCap startCap, GpLineCap endCap,

+                  GpLineCap dashCap);

+#endif // DCR_USE_NEW_197819

+

+

+GpStatus WINGDIPAPI

+GdipSetPenStartCap(GpPen *pen, GpLineCap startCap);

+

+GpStatus WINGDIPAPI

+GdipSetPenEndCap(GpPen *pen, GpLineCap endCap);

+

+#ifdef DCR_USE_NEW_197819

+GpStatus WINGDIPAPI

+GdipSetPenDashCap197819(GpPen *pen, GpDashCap dashCap);

+#else

+GpStatus WINGDIPAPI

+GdipSetPenDashCap(GpPen *pen, GpLineCap dashCap);

+#endif // DCR_USE_NEW_197819

+

+GpStatus WINGDIPAPI

+GdipGetPenStartCap(GpPen *pen, GpLineCap *startCap);

+

+GpStatus WINGDIPAPI

+GdipGetPenEndCap(GpPen *pen, GpLineCap *endCap);

+

+#ifdef DCR_USE_NEW_197819

+GpStatus WINGDIPAPI

+GdipGetPenDashCap197819(GpPen *pen, GpDashCap *dashCap);

+#else

+GpStatus WINGDIPAPI

+GdipGetPenDashCap(GpPen *pen, GpLineCap *dashCap);

+#endif // DCR_USE_NEW_197819

+

+GpStatus WINGDIPAPI

+GdipSetPenLineJoin(GpPen *pen, GpLineJoin lineJoin);

+

+GpStatus WINGDIPAPI

+GdipGetPenLineJoin(GpPen *pen, GpLineJoin *lineJoin);

+

+GpStatus WINGDIPAPI

+GdipSetPenCustomStartCap(GpPen *pen, GpCustomLineCap* customCap);

+

+GpStatus WINGDIPAPI

+GdipGetPenCustomStartCap(GpPen *pen, GpCustomLineCap** customCap);

+

+GpStatus WINGDIPAPI

+GdipSetPenCustomEndCap(GpPen *pen, GpCustomLineCap* customCap);

+

+GpStatus WINGDIPAPI

+GdipGetPenCustomEndCap(GpPen *pen, GpCustomLineCap** customCap);

+

+GpStatus WINGDIPAPI

+GdipSetPenMiterLimit(GpPen *pen, REAL miterLimit);

+

+GpStatus WINGDIPAPI

+GdipGetPenMiterLimit(GpPen *pen, REAL *miterLimit);

+

+GpStatus WINGDIPAPI

+GdipSetPenMode(GpPen *pen, GpPenAlignment penMode);

+

+GpStatus WINGDIPAPI

+GdipGetPenMode(GpPen *pen, GpPenAlignment *penMode);

+

+GpStatus WINGDIPAPI

+GdipSetPenTransform(GpPen *pen, GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipGetPenTransform(GpPen *pen, GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipResetPenTransform(GpPen *pen);

+

+GpStatus WINGDIPAPI

+GdipMultiplyPenTransform(GpPen *pen, GDIPCONST GpMatrix *matrix,

+                           GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipTranslatePenTransform(GpPen *pen, REAL dx, REAL dy,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipScalePenTransform(GpPen *pen, REAL sx, REAL sy,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipRotatePenTransform(GpPen *pen, REAL angle, GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipSetPenColor(GpPen *pen, ARGB argb);

+

+GpStatus WINGDIPAPI

+GdipGetPenColor(GpPen *pen, ARGB *argb);

+

+GpStatus WINGDIPAPI

+GdipSetPenBrushFill(GpPen *pen, GpBrush *brush);

+

+GpStatus WINGDIPAPI

+GdipGetPenBrushFill(GpPen *pen, GpBrush **brush);

+

+GpStatus WINGDIPAPI

+GdipGetPenFillType(GpPen *pen, GpPenType* type);

+

+GpStatus WINGDIPAPI

+GdipGetPenDashStyle(GpPen *pen, GpDashStyle *dashstyle);

+

+GpStatus WINGDIPAPI

+GdipSetPenDashStyle(GpPen *pen, GpDashStyle dashstyle);

+

+GpStatus WINGDIPAPI

+GdipGetPenDashOffset(GpPen *pen, REAL *offset);

+

+GpStatus WINGDIPAPI

+GdipSetPenDashOffset(GpPen *pen, REAL offset);

+

+GpStatus WINGDIPAPI

+GdipGetPenDashCount(GpPen *pen, INT *count);

+

+GpStatus WINGDIPAPI

+GdipSetPenDashArray(GpPen *pen, GDIPCONST REAL *dash, INT count);

+

+GpStatus WINGDIPAPI

+GdipGetPenDashArray(GpPen *pen, REAL *dash, INT count);

+

+GpStatus WINGDIPAPI

+GdipGetPenCompoundCount(GpPen *pen, INT *count);

+

+GpStatus WINGDIPAPI

+GdipSetPenCompoundArray(GpPen *pen, GDIPCONST REAL *dash, INT count);

+

+GpStatus WINGDIPAPI

+GdipGetPenCompoundArray(GpPen *pen, REAL *dash, INT count);

+

+//----------------------------------------------------------------------------

+// CustomLineCap methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateCustomLineCap(GpPath* fillPath, GpPath* strokePath,

+   GpLineCap baseCap, REAL baseInset, GpCustomLineCap **customCap);

+

+GpStatus WINGDIPAPI

+GdipDeleteCustomLineCap(GpCustomLineCap* customCap);

+

+GpStatus WINGDIPAPI

+GdipCloneCustomLineCap(GpCustomLineCap* customCap,

+                       GpCustomLineCap** clonedCap);

+

+GpStatus WINGDIPAPI

+GdipGetCustomLineCapType(GpCustomLineCap* customCap,

+                       CustomLineCapType* capType);

+

+GpStatus WINGDIPAPI

+GdipSetCustomLineCapStrokeCaps(GpCustomLineCap* customCap,

+                               GpLineCap startCap, GpLineCap endCap);

+

+GpStatus WINGDIPAPI

+GdipGetCustomLineCapStrokeCaps(GpCustomLineCap* customCap,

+                               GpLineCap* startCap, GpLineCap* endCap);

+

+GpStatus WINGDIPAPI

+GdipSetCustomLineCapStrokeJoin(GpCustomLineCap* customCap, GpLineJoin lineJoin);

+

+GpStatus WINGDIPAPI

+GdipGetCustomLineCapStrokeJoin(GpCustomLineCap* customCap, GpLineJoin* lineJoin);

+

+GpStatus WINGDIPAPI

+GdipSetCustomLineCapBaseCap(GpCustomLineCap* customCap, GpLineCap baseCap);

+

+GpStatus WINGDIPAPI

+GdipGetCustomLineCapBaseCap(GpCustomLineCap* customCap, GpLineCap* baseCap);

+

+GpStatus WINGDIPAPI

+GdipSetCustomLineCapBaseInset(GpCustomLineCap* customCap, REAL inset);

+

+GpStatus WINGDIPAPI

+GdipGetCustomLineCapBaseInset(GpCustomLineCap* customCap, REAL* inset);

+

+GpStatus WINGDIPAPI

+GdipSetCustomLineCapWidthScale(GpCustomLineCap* customCap, REAL widthScale);

+

+GpStatus WINGDIPAPI

+GdipGetCustomLineCapWidthScale(GpCustomLineCap* customCap, REAL* widthScale);

+

+//----------------------------------------------------------------------------

+// AdjustableArrowCap methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateAdjustableArrowCap(REAL height, REAL width, BOOL isFilled,

+                             GpAdjustableArrowCap **cap);

+

+GpStatus WINGDIPAPI

+GdipSetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, REAL height);

+

+GpStatus WINGDIPAPI

+GdipGetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, REAL* height);

+

+GpStatus WINGDIPAPI

+GdipSetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, REAL width);

+

+GpStatus WINGDIPAPI

+GdipGetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, REAL* width);

+

+GpStatus WINGDIPAPI

+GdipSetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* cap, REAL middleInset);

+

+GpStatus WINGDIPAPI

+GdipGetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* cap, REAL* middleInset);

+

+GpStatus WINGDIPAPI

+GdipSetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap, BOOL fillState);

+

+GpStatus WINGDIPAPI

+GdipGetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap, BOOL* fillState);

+

+//----------------------------------------------------------------------------

+// Image methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipLoadImageFromStream(IStream* stream, GpImage **image);

+

+GpStatus WINGDIPAPI

+GdipLoadImageFromFile(GDIPCONST WCHAR* filename, GpImage **image);

+

+GpStatus WINGDIPAPI

+GdipLoadImageFromStreamICM(IStream* stream, GpImage **image);

+

+GpStatus WINGDIPAPI

+GdipLoadImageFromFileICM(GDIPCONST WCHAR* filename, GpImage **image);

+

+GpStatus WINGDIPAPI

+GdipCloneImage(GpImage *image, GpImage **cloneImage);

+

+GpStatus WINGDIPAPI

+GdipDisposeImage(GpImage *image);

+

+GpStatus WINGDIPAPI

+GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR* filename,

+                    GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams);

+

+GpStatus WINGDIPAPI

+GdipSaveImageToStream(GpImage *image, IStream* stream,

+                      GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams);

+

+GpStatus WINGDIPAPI

+GdipSaveAdd(GpImage *image, GDIPCONST EncoderParameters* encoderParams);

+

+GpStatus WINGDIPAPI

+GdipSaveAddImage(GpImage *image, GpImage* newImage,

+                 GDIPCONST EncoderParameters* encoderParams);

+

+GpStatus WINGDIPAPI

+GdipGetImageGraphicsContext(GpImage *image, GpGraphics **graphics);

+

+GpStatus WINGDIPAPI

+GdipGetImageBounds(GpImage *image, GpRectF *srcRect, GpUnit *srcUnit);

+

+GpStatus WINGDIPAPI

+GdipGetImageDimension(GpImage *image, REAL *width, REAL *height);

+

+GpStatus WINGDIPAPI

+GdipGetImageType(GpImage *image, ImageType *type);

+

+GpStatus WINGDIPAPI

+GdipGetImageWidth(GpImage *image, UINT *width);

+

+GpStatus WINGDIPAPI

+GdipGetImageHeight(GpImage *image, UINT *height);

+

+GpStatus WINGDIPAPI

+GdipGetImageHorizontalResolution(GpImage *image, REAL *resolution);

+

+GpStatus WINGDIPAPI

+GdipGetImageVerticalResolution(GpImage *image, REAL *resolution);

+

+GpStatus WINGDIPAPI

+GdipGetImageFlags(GpImage *image, UINT *flags);

+

+GpStatus WINGDIPAPI

+GdipGetImageRawFormat(GpImage *image, GUID *format);

+

+GpStatus WINGDIPAPI

+GdipGetImagePixelFormat(GpImage *image, PixelFormat *format);

+

+GpStatus WINGDIPAPI

+GdipGetImageThumbnail(GpImage *image, UINT thumbWidth, UINT thumbHeight,

+                      GpImage **thumbImage,

+                      GetThumbnailImageAbort callback, VOID * callbackData);

+

+GpStatus WINGDIPAPI

+GdipGetEncoderParameterListSize(GpImage *image, GDIPCONST CLSID* clsidEncoder,

+                                UINT* size);

+

+GpStatus WINGDIPAPI

+GdipGetEncoderParameterList(GpImage *image, GDIPCONST CLSID* clsidEncoder,

+                            UINT size, EncoderParameters* buffer);

+

+GpStatus WINGDIPAPI

+GdipImageGetFrameDimensionsCount(GpImage* image, UINT* count);

+

+GpStatus WINGDIPAPI

+GdipImageGetFrameDimensionsList(GpImage* image, GUID* dimensionIDs, UINT count);

+

+GpStatus WINGDIPAPI

+GdipImageGetFrameCount(GpImage *image, GDIPCONST GUID* dimensionID, UINT* count);

+

+GpStatus WINGDIPAPI

+GdipImageSelectActiveFrame(GpImage *image, GDIPCONST GUID* dimensionID,

+                           UINT frameIndex);

+

+GpStatus WINGDIPAPI

+GdipImageRotateFlip(GpImage *image, RotateFlipType rfType);

+

+GpStatus WINGDIPAPI

+GdipGetImagePalette(GpImage *image, ColorPalette *palette, INT size);

+

+GpStatus WINGDIPAPI

+GdipSetImagePalette(GpImage *image, GDIPCONST ColorPalette *palette);

+

+GpStatus WINGDIPAPI

+GdipGetImagePaletteSize(GpImage *image, INT *size);

+

+GpStatus WINGDIPAPI

+GdipGetPropertyCount(GpImage *image, UINT* numOfProperty);

+

+GpStatus WINGDIPAPI

+GdipGetPropertyIdList(GpImage *image, UINT numOfProperty, PROPID* list);

+

+GpStatus WINGDIPAPI

+GdipGetPropertyItemSize(GpImage *image, PROPID propId, UINT* size);

+

+GpStatus WINGDIPAPI

+GdipGetPropertyItem(GpImage *image, PROPID propId,UINT propSize,

+                    PropertyItem* buffer);

+

+GpStatus WINGDIPAPI

+GdipGetPropertySize(GpImage *image, UINT* totalBufferSize, UINT* numProperties);

+

+GpStatus WINGDIPAPI

+GdipGetAllPropertyItems(GpImage *image, UINT totalBufferSize,

+                        UINT numProperties, PropertyItem* allItems);

+

+GpStatus WINGDIPAPI

+GdipRemovePropertyItem(GpImage *image, PROPID propId);

+

+GpStatus WINGDIPAPI

+GdipSetPropertyItem(GpImage *image, GDIPCONST PropertyItem* item);

+

+GpStatus WINGDIPAPI

+GdipImageForceValidation(GpImage *image);

+

+GpStatus WINGDIPAPI

+GdipGetImageLayout(GpImage *image, ImageLayout* layout);

+

+GpStatus WINGDIPAPI

+GdipSetImageLayout(GpImage *image, GDIPCONST ImageLayout layout);

+

+//----------------------------------------------------------------------------

+// Bitmap methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateBitmapFromStream(IStream* stream, GpBitmap **bitmap);

+

+GpStatus WINGDIPAPI

+GdipCreateBitmapFromFile(GDIPCONST WCHAR* filename, GpBitmap **bitmap);

+

+GpStatus WINGDIPAPI

+GdipCreateBitmapFromStreamICM(IStream* stream, GpBitmap **bitmap);

+

+GpStatus WINGDIPAPI

+GdipCreateBitmapFromFileICM(GDIPCONST WCHAR* filename, GpBitmap **bitmap);

+

+GpStatus WINGDIPAPI

+GdipCreateBitmapFromScan0(INT width,

+                          INT height,

+                          INT stride,

+                          PixelFormat format,

+                          BYTE* scan0,

+                          GpBitmap** bitmap);

+

+GpStatus WINGDIPAPI

+GdipCreateBitmapFromGraphics(INT width,

+                             INT height,

+                             GpGraphics* target,

+                             GpBitmap** bitmap);

+

+GpStatus WINGDIPAPI

+GdipCreateBitmapFromDirectDrawSurface(IDirectDrawSurface7* surface,

+                                      GpBitmap** bitmap);

+

+GpStatus WINGDIPAPI

+GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO* gdiBitmapInfo,

+                           VOID* gdiBitmapData,

+                           GpBitmap** bitmap);

+

+GpStatus WINGDIPAPI

+GdipCreateBitmapFromHBITMAP(HBITMAP hbm,

+                            HPALETTE hpal,

+                            GpBitmap** bitmap);

+

+GpStatus WINGDIPAPI

+GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap,

+                            HBITMAP* hbmReturn,

+                            ARGB background);

+

+GpStatus WINGDIPAPI

+GdipCreateBitmapFromHICON(HICON hicon,

+                          GpBitmap** bitmap);

+

+GpStatus WINGDIPAPI

+GdipCreateHICONFromBitmap(GpBitmap* bitmap,

+                          HICON* hbmReturn);

+

+GpStatus WINGDIPAPI

+GdipCreateBitmapFromResource(HINSTANCE hInstance,

+                             GDIPCONST WCHAR* lpBitmapName,

+                             GpBitmap** bitmap);

+

+GpStatus WINGDIPAPI

+GdipCloneBitmapArea(REAL x, REAL y, REAL width, REAL height,

+                            PixelFormat format,

+                            GpBitmap *srcBitmap,

+                            GpBitmap **dstBitmap);

+

+GpStatus WINGDIPAPI

+GdipCloneBitmapAreaI(INT x,

+                     INT y,

+                     INT width,

+                     INT height,

+                     PixelFormat format,

+                     GpBitmap *srcBitmap,

+                     GpBitmap **dstBitmap);

+

+GpStatus WINGDIPAPI

+GdipBitmapLockBits(GpBitmap* bitmap,

+                   GDIPCONST GpRect* rect,

+                   UINT flags,

+                   PixelFormat format,

+                   BitmapData* lockedBitmapData);

+

+GpStatus WINGDIPAPI

+GdipBitmapUnlockBits(GpBitmap* bitmap,

+                     BitmapData* lockedBitmapData);

+

+GpStatus WINGDIPAPI

+GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y, ARGB *color);

+

+GpStatus WINGDIPAPI

+GdipBitmapSetPixel(GpBitmap* bitmap, INT x, INT y, ARGB color);

+

+GpStatus WINGDIPAPI

+GdipBitmapSetResolution(GpBitmap* bitmap, REAL xdpi, REAL ydpi);

+

+//----------------------------------------------------------------------------

+// ImageAttributes methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateImageAttributes(GpImageAttributes **imageattr);

+

+GpStatus WINGDIPAPI

+GdipCloneImageAttributes(GDIPCONST GpImageAttributes *imageattr,

+                         GpImageAttributes **cloneImageattr);

+

+GpStatus WINGDIPAPI

+GdipDisposeImageAttributes(GpImageAttributes *imageattr);

+

+GpStatus WINGDIPAPI

+GdipSetImageAttributesToIdentity(GpImageAttributes *imageattr,

+                                 ColorAdjustType type);

+GpStatus WINGDIPAPI

+GdipResetImageAttributes(GpImageAttributes *imageattr,

+                         ColorAdjustType type);

+

+GpStatus WINGDIPAPI

+GdipSetImageAttributesColorMatrix(GpImageAttributes *imageattr,

+                               ColorAdjustType type,

+                               BOOL enableFlag,

+                               GDIPCONST ColorMatrix* colorMatrix,

+                               GDIPCONST ColorMatrix* grayMatrix,

+                               ColorMatrixFlags flags);

+

+GpStatus WINGDIPAPI

+GdipSetImageAttributesThreshold(GpImageAttributes *imageattr,

+                                ColorAdjustType type,

+                                BOOL enableFlag,

+                                REAL threshold);

+

+GpStatus WINGDIPAPI

+GdipSetImageAttributesGamma(GpImageAttributes *imageattr,

+                            ColorAdjustType type,

+                            BOOL enableFlag,

+                            REAL gamma);

+

+GpStatus WINGDIPAPI

+GdipSetImageAttributesNoOp(GpImageAttributes *imageattr,

+                           ColorAdjustType type,

+                           BOOL enableFlag);

+

+GpStatus WINGDIPAPI

+GdipSetImageAttributesColorKeys(GpImageAttributes *imageattr,

+                                ColorAdjustType type,

+                                BOOL enableFlag,

+                                ARGB colorLow,

+                                ARGB colorHigh);

+

+GpStatus WINGDIPAPI

+GdipSetImageAttributesOutputChannel(GpImageAttributes *imageattr,

+                                    ColorAdjustType type,

+                                    BOOL enableFlag,

+                                    ColorChannelFlags channelFlags);

+

+GpStatus WINGDIPAPI

+GdipSetImageAttributesOutputChannelColorProfile(GpImageAttributes *imageattr,

+                                                ColorAdjustType type,

+                                                BOOL enableFlag,

+                                                GDIPCONST WCHAR *colorProfileFilename);

+

+GpStatus WINGDIPAPI

+GdipSetImageAttributesRemapTable(GpImageAttributes *imageattr,

+                                 ColorAdjustType type,

+                                 BOOL enableFlag,

+                                 UINT mapSize,

+                                 GDIPCONST ColorMap *map);

+GpStatus WINGDIPAPI

+GdipSetImageAttributesWrapMode(

+    GpImageAttributes *imageAttr,

+    WrapMode wrap,

+    ARGB argb,

+    BOOL clamp

+);

+

+GpStatus WINGDIPAPI

+GdipSetImageAttributesICMMode(

+    GpImageAttributes *imageAttr,

+    BOOL on

+);

+

+GpStatus WINGDIPAPI

+GdipGetImageAttributesAdjustedPalette(

+    GpImageAttributes *imageAttr,

+    ColorPalette * colorPalette,

+    ColorAdjustType colorAdjustType

+);

+

+//----------------------------------------------------------------------------

+// Graphics methods

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipFlush(GpGraphics *graphics, GpFlushIntention intention);

+

+GpStatus WINGDIPAPI

+GdipCreateFromHDC(HDC hdc, GpGraphics **graphics);

+

+GpStatus WINGDIPAPI

+GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **graphics);

+

+GpStatus WINGDIPAPI

+GdipCreateFromHWND(HWND hwnd, GpGraphics **graphics);

+

+GpStatus WINGDIPAPI

+GdipCreateFromHWNDICM(HWND hwnd, GpGraphics **graphics);

+

+GpStatus WINGDIPAPI

+GdipDeleteGraphics(GpGraphics *graphics);

+

+GpStatus WINGDIPAPI

+GdipGetDC(GpGraphics* graphics, HDC * hdc);

+

+GpStatus WINGDIPAPI

+GdipReleaseDC(GpGraphics* graphics, HDC hdc);

+

+GpStatus WINGDIPAPI

+GdipSetCompositingMode(GpGraphics *graphics, CompositingMode compositingMode);

+

+GpStatus WINGDIPAPI

+GdipGetCompositingMode(GpGraphics *graphics, CompositingMode *compositingMode);

+

+GpStatus WINGDIPAPI

+GdipSetRenderingOrigin(GpGraphics *graphics, INT x, INT y);

+

+GpStatus WINGDIPAPI

+GdipGetRenderingOrigin(GpGraphics *graphics, INT *x, INT *y);

+

+GpStatus WINGDIPAPI

+GdipSetCompositingQuality(GpGraphics *graphics, CompositingQuality compositingQuality);

+

+GpStatus WINGDIPAPI

+GdipGetCompositingQuality(GpGraphics *graphics, CompositingQuality *compositingQuality);

+

+GpStatus WINGDIPAPI

+GdipSetSmoothingMode(GpGraphics *graphics, SmoothingMode smoothingMode);

+

+GpStatus WINGDIPAPI

+GdipGetSmoothingMode(GpGraphics *graphics, SmoothingMode *smoothingMode);

+

+GpStatus WINGDIPAPI

+GdipSetPixelOffsetMode(GpGraphics* graphics, PixelOffsetMode pixelOffsetMode);

+

+GpStatus WINGDIPAPI

+GdipGetPixelOffsetMode(GpGraphics *graphics, PixelOffsetMode *pixelOffsetMode);

+

+GpStatus WINGDIPAPI

+GdipSetTextRenderingHint(GpGraphics *graphics, TextRenderingHint mode);

+

+GpStatus WINGDIPAPI

+GdipGetTextRenderingHint(GpGraphics *graphics, TextRenderingHint *mode);

+

+#ifdef DCR_USE_NEW_188922

+GpStatus  WINGDIPAPI

+GdipSetTextContrast(GpGraphics *graphics, UINT contrast);

+

+GpStatus  WINGDIPAPI

+GdipGetTextContrast(GpGraphics *graphics, UINT * contrast);

+#else

+GpStatus  WINGDIPAPI

+GdipSetTextGammaValue(GpGraphics *graphics, UINT gammaValue);

+

+GpStatus  WINGDIPAPI

+GdipGetTextGammaValue(GpGraphics *graphics, UINT * gammaValue);

+#endif // DCR_USE_NEW_188922

+

+

+GpStatus WINGDIPAPI

+GdipSetInterpolationMode(GpGraphics *graphics, InterpolationMode interpolationMode);

+

+GpStatus WINGDIPAPI

+GdipGetInterpolationMode(GpGraphics *graphics, InterpolationMode *interpolationMode);

+

+GpStatus WINGDIPAPI

+GdipSetWorldTransform(GpGraphics *graphics, GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipResetWorldTransform(GpGraphics *graphics);

+

+GpStatus WINGDIPAPI

+GdipMultiplyWorldTransform(GpGraphics *graphics, GDIPCONST GpMatrix *matrix,

+                           GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipTranslateWorldTransform(GpGraphics *graphics, REAL dx, REAL dy,

+                            GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipScaleWorldTransform(GpGraphics *graphics, REAL sx, REAL sy,

+                        GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipRotateWorldTransform(GpGraphics *graphics, REAL angle, GpMatrixOrder order);

+

+GpStatus WINGDIPAPI

+GdipGetWorldTransform(GpGraphics *graphics, GpMatrix *matrix);

+

+GpStatus WINGDIPAPI

+GdipResetPageTransform(GpGraphics *graphics);

+

+GpStatus WINGDIPAPI

+GdipGetPageUnit(GpGraphics *graphics, GpUnit *unit);

+

+GpStatus WINGDIPAPI

+GdipGetPageScale(GpGraphics *graphics, REAL *scale);

+

+GpStatus WINGDIPAPI

+GdipSetPageUnit(GpGraphics *graphics, GpUnit unit);

+

+GpStatus WINGDIPAPI

+GdipSetPageScale(GpGraphics *graphics, REAL scale);

+

+GpStatus WINGDIPAPI

+GdipGetDpiX(GpGraphics *graphics, REAL* dpi);

+

+GpStatus WINGDIPAPI

+GdipGetDpiY(GpGraphics *graphics, REAL* dpi);

+

+GpStatus WINGDIPAPI

+GdipTransformPoints(GpGraphics *graphics, GpCoordinateSpace destSpace,

+                             GpCoordinateSpace srcSpace, GpPointF *points,

+                             INT count);

+

+GpStatus WINGDIPAPI

+GdipTransformPointsI(GpGraphics *graphics, GpCoordinateSpace destSpace,

+                             GpCoordinateSpace srcSpace, GpPoint *points,

+                             INT count);

+

+GpStatus WINGDIPAPI

+GdipGetNearestColor(GpGraphics *graphics, ARGB* argb);

+

+// Create the Win9x Halftone Palette (even on NT) with correct Desktop colors

+HPALETTE WINGDIPAPI

+GdipCreateHalftonePalette();

+

+GpStatus WINGDIPAPI

+GdipDrawLine(GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1,

+                      REAL x2, REAL y2);

+

+GpStatus WINGDIPAPI

+GdipDrawLineI(GpGraphics *graphics, GpPen *pen, INT x1, INT y1,

+                      INT x2, INT y2);

+

+GpStatus WINGDIPAPI

+GdipDrawLines(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,

+                       INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawLinesI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,

+                       INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawArc(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,

+            REAL width, REAL height, REAL startAngle, REAL sweepAngle);

+

+GpStatus WINGDIPAPI

+GdipDrawArcI(GpGraphics *graphics, GpPen *pen, INT x, INT y,

+                     INT width, INT height, REAL startAngle, REAL sweepAngle);

+

+GpStatus WINGDIPAPI

+GdipDrawBezier(GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1,

+                        REAL x2, REAL y2, REAL x3, REAL y3, REAL x4, REAL y4);

+

+GpStatus WINGDIPAPI

+GdipDrawBezierI(GpGraphics *graphics, GpPen *pen, INT x1, INT y1,

+                        INT x2, INT y2, INT x3, INT y3, INT x4, INT y4);

+

+GpStatus WINGDIPAPI

+GdipDrawBeziers(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,

+                         INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawBeziersI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,

+                         INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawRectangle(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,

+                      REAL width, REAL height);

+

+GpStatus WINGDIPAPI

+GdipDrawRectangleI(GpGraphics *graphics, GpPen *pen, INT x, INT y,

+                      INT width, INT height);

+

+GpStatus WINGDIPAPI

+GdipDrawRectangles(GpGraphics *graphics, GpPen *pen, GDIPCONST GpRectF *rects,

+                       INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawRectanglesI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpRect *rects,

+                       INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawEllipse(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,

+                         REAL width, REAL height);

+

+GpStatus WINGDIPAPI

+GdipDrawEllipseI(GpGraphics *graphics, GpPen *pen, INT x, INT y,

+                         INT width, INT height);

+

+GpStatus WINGDIPAPI

+GdipDrawPie(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,

+                     REAL width, REAL height, REAL startAngle, REAL sweepAngle);

+

+GpStatus WINGDIPAPI

+GdipDrawPieI(GpGraphics *graphics, GpPen *pen, INT x, INT y,

+                     INT width, INT height, REAL startAngle, REAL sweepAngle);

+

+GpStatus WINGDIPAPI

+GdipDrawPolygon(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,

+                         INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawPolygonI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,

+                         INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path);

+

+GpStatus WINGDIPAPI

+GdipDrawCurve(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,

+                       INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawCurveI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,

+                       INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawCurve2(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,

+                       INT count, REAL tension);

+

+GpStatus WINGDIPAPI

+GdipDrawCurve2I(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,

+                       INT count, REAL tension);

+

+GpStatus WINGDIPAPI

+GdipDrawCurve3(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,

+               INT count, INT offset, INT numberOfSegments, REAL tension);

+

+GpStatus WINGDIPAPI

+GdipDrawCurve3I(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,

+                INT count, INT offset, INT numberOfSegments, REAL tension);

+

+GpStatus WINGDIPAPI

+GdipDrawClosedCurve(GpGraphics *graphics, GpPen *pen,

+                    GDIPCONST GpPointF *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawClosedCurveI(GpGraphics *graphics, GpPen *pen,

+                     GDIPCONST GpPoint *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawClosedCurve2(GpGraphics *graphics, GpPen *pen,

+                     GDIPCONST GpPointF *points, INT count, REAL tension);

+

+GpStatus WINGDIPAPI

+GdipDrawClosedCurve2I(GpGraphics *graphics, GpPen *pen,

+                      GDIPCONST GpPoint *points, INT count, REAL tension);

+

+GpStatus WINGDIPAPI

+GdipGraphicsClear(GpGraphics *graphics, ARGB color);

+

+GpStatus WINGDIPAPI

+GdipFillRectangle(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,

+                  REAL width, REAL height);

+

+GpStatus WINGDIPAPI

+GdipFillRectangleI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,

+                   INT width, INT height);

+

+GpStatus WINGDIPAPI

+GdipFillRectangles(GpGraphics *graphics, GpBrush *brush,

+                   GDIPCONST GpRectF *rects, INT count);

+

+GpStatus WINGDIPAPI

+GdipFillRectanglesI(GpGraphics *graphics, GpBrush *brush,

+                    GDIPCONST GpRect *rects, INT count);

+

+GpStatus WINGDIPAPI

+GdipFillPolygon(GpGraphics *graphics, GpBrush *brush,

+                GDIPCONST GpPointF *points, INT count, GpFillMode fillMode);

+

+GpStatus WINGDIPAPI

+GdipFillPolygonI(GpGraphics *graphics, GpBrush *brush,

+                 GDIPCONST GpPoint *points, INT count, GpFillMode fillMode);

+

+GpStatus WINGDIPAPI

+GdipFillPolygon2(GpGraphics *graphics, GpBrush *brush,

+                 GDIPCONST GpPointF *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipFillPolygon2I(GpGraphics *graphics, GpBrush *brush,

+                  GDIPCONST GpPoint *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,

+                REAL width, REAL height);

+

+GpStatus WINGDIPAPI

+GdipFillEllipseI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,

+                 INT width, INT height);

+

+GpStatus WINGDIPAPI

+GdipFillPie(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,

+            REAL width, REAL height, REAL startAngle, REAL sweepAngle);

+

+GpStatus WINGDIPAPI

+GdipFillPieI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,

+             INT width, INT height, REAL startAngle, REAL sweepAngle);

+

+GpStatus WINGDIPAPI

+GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath *path);

+

+GpStatus WINGDIPAPI

+GdipFillClosedCurve(GpGraphics *graphics, GpBrush *brush,

+                              GDIPCONST GpPointF *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipFillClosedCurveI(GpGraphics *graphics, GpBrush *brush,

+                              GDIPCONST GpPoint *points, INT count);

+

+GpStatus WINGDIPAPI

+GdipFillClosedCurve2(GpGraphics *graphics, GpBrush *brush,

+                              GDIPCONST GpPointF *points, INT count,

+                              REAL tension, GpFillMode fillMode);

+

+GpStatus WINGDIPAPI

+GdipFillClosedCurve2I(GpGraphics *graphics, GpBrush *brush,

+                              GDIPCONST GpPoint *points, INT count,

+                              REAL tension, GpFillMode fillMode);

+

+GpStatus WINGDIPAPI

+GdipFillRegion(GpGraphics *graphics, GpBrush *brush,

+                        GpRegion *region);

+

+GpStatus WINGDIPAPI

+GdipDrawImage(GpGraphics *graphics, GpImage *image, REAL x, REAL y);

+

+GpStatus WINGDIPAPI

+GdipDrawImageI(GpGraphics *graphics, GpImage *image, INT x, INT y);

+

+GpStatus WINGDIPAPI

+GdipDrawImageRect(GpGraphics *graphics, GpImage *image, REAL x, REAL y,

+                           REAL width, REAL height);

+

+GpStatus WINGDIPAPI

+GdipDrawImageRectI(GpGraphics *graphics, GpImage *image, INT x, INT y,

+                           INT width, INT height);

+

+GpStatus WINGDIPAPI

+GdipDrawImagePoints(GpGraphics *graphics, GpImage *image,

+                             GDIPCONST GpPointF *dstpoints, INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawImagePointsI(GpGraphics *graphics, GpImage *image,

+                             GDIPCONST GpPoint *dstpoints, INT count);

+

+GpStatus WINGDIPAPI

+GdipDrawImagePointRect(GpGraphics *graphics, GpImage *image, REAL x,

+                                REAL y, REAL srcx, REAL srcy, REAL srcwidth,

+                                REAL srcheight, GpUnit srcUnit);

+

+GpStatus WINGDIPAPI

+GdipDrawImagePointRectI(GpGraphics *graphics, GpImage *image, INT x,

+                                INT y, INT srcx, INT srcy, INT srcwidth,

+                                INT srcheight, GpUnit srcUnit);

+

+GpStatus WINGDIPAPI

+GdipDrawImageRectRect(GpGraphics *graphics, GpImage *image, REAL dstx,

+                      REAL dsty, REAL dstwidth, REAL dstheight,

+                      REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight,

+                      GpUnit srcUnit,

+                      GDIPCONST GpImageAttributes* imageAttributes,

+                      DrawImageAbort callback, VOID * callbackData);

+

+GpStatus WINGDIPAPI

+GdipDrawImageRectRectI(GpGraphics *graphics, GpImage *image, INT dstx,

+                       INT dsty, INT dstwidth, INT dstheight,

+                       INT srcx, INT srcy, INT srcwidth, INT srcheight,

+                       GpUnit srcUnit,

+                       GDIPCONST GpImageAttributes* imageAttributes,

+                       DrawImageAbort callback, VOID * callbackData);

+

+GpStatus WINGDIPAPI

+GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image,

+                        GDIPCONST GpPointF *points, INT count, REAL srcx,

+                        REAL srcy, REAL srcwidth, REAL srcheight,

+                        GpUnit srcUnit,

+                        GDIPCONST GpImageAttributes* imageAttributes,

+                        DrawImageAbort callback, VOID * callbackData);

+

+GpStatus WINGDIPAPI

+GdipDrawImagePointsRectI(GpGraphics *graphics, GpImage *image,

+                         GDIPCONST GpPoint *points, INT count, INT srcx,

+                         INT srcy, INT srcwidth, INT srcheight,

+                         GpUnit srcUnit,

+                         GDIPCONST GpImageAttributes* imageAttributes,

+                         DrawImageAbort callback, VOID * callbackData);

+

+GpStatus WINGDIPAPI

+GdipEnumerateMetafileDestPoint(

+    GpGraphics *            graphics,

+    GDIPCONST GpMetafile *  metafile,

+    GDIPCONST PointF &      destPoint,

+    EnumerateMetafileProc   callback,

+    VOID *                  callbackData,

+    GDIPCONST GpImageAttributes *     imageAttributes

+    );

+

+GpStatus WINGDIPAPI

+GdipEnumerateMetafileDestPointI(

+    GpGraphics *            graphics,

+    GDIPCONST GpMetafile *  metafile,

+    GDIPCONST Point &       destPoint,

+    EnumerateMetafileProc   callback,

+    VOID *                  callbackData,

+    GDIPCONST GpImageAttributes *     imageAttributes

+    );

+

+GpStatus WINGDIPAPI

+GdipEnumerateMetafileDestRect(

+    GpGraphics *            graphics,

+    GDIPCONST GpMetafile *  metafile,

+    GDIPCONST RectF &       destRect,

+    EnumerateMetafileProc   callback,

+    VOID *                  callbackData,

+    GDIPCONST GpImageAttributes *     imageAttributes

+    );

+

+GpStatus WINGDIPAPI

+GdipEnumerateMetafileDestRectI(

+    GpGraphics *            graphics,

+    GDIPCONST GpMetafile *  metafile,

+    GDIPCONST Rect &        destRect,

+    EnumerateMetafileProc   callback,

+    VOID *                  callbackData,

+    GDIPCONST GpImageAttributes *     imageAttributes

+    );

+

+GpStatus WINGDIPAPI

+GdipEnumerateMetafileDestPoints(

+    GpGraphics *            graphics,

+    GDIPCONST GpMetafile *  metafile,

+    GDIPCONST PointF *      destPoints,

+    INT                     count,

+    EnumerateMetafileProc   callback,

+    VOID *                  callbackData,

+    GDIPCONST GpImageAttributes *     imageAttributes

+    );

+

+GpStatus WINGDIPAPI

+GdipEnumerateMetafileDestPointsI(

+    GpGraphics *            graphics,

+    GDIPCONST GpMetafile *  metafile,

+    GDIPCONST Point *       destPoints,

+    INT                     count,

+    EnumerateMetafileProc   callback,

+    VOID *                  callbackData,

+    GDIPCONST GpImageAttributes *     imageAttributes

+    );

+

+GpStatus WINGDIPAPI

+GdipEnumerateMetafileSrcRectDestPoint(

+    GpGraphics *            graphics,

+    GDIPCONST GpMetafile *  metafile,

+    GDIPCONST PointF &      destPoint,

+    GDIPCONST RectF &       srcRect,

+    Unit                    srcUnit,

+    EnumerateMetafileProc   callback,

+    VOID *                  callbackData,

+    GDIPCONST GpImageAttributes *     imageAttributes

+    );

+

+GpStatus WINGDIPAPI

+GdipEnumerateMetafileSrcRectDestPointI(

+    GpGraphics *            graphics,

+    GDIPCONST GpMetafile *  metafile,

+    GDIPCONST Point &       destPoint,

+    GDIPCONST Rect &        srcRect,

+    Unit                    srcUnit,

+    EnumerateMetafileProc   callback,

+    VOID *                  callbackData,

+    GDIPCONST GpImageAttributes *     imageAttributes

+    );

+

+GpStatus WINGDIPAPI

+GdipEnumerateMetafileSrcRectDestRect(

+    GpGraphics *            graphics,

+    GDIPCONST GpMetafile *  metafile,

+    GDIPCONST RectF &       destRect,

+    GDIPCONST RectF &       srcRect,

+    Unit                    srcUnit,

+    EnumerateMetafileProc   callback,

+    VOID *                  callbackData,

+    GDIPCONST GpImageAttributes *     imageAttributes

+    );

+

+GpStatus WINGDIPAPI

+GdipEnumerateMetafileSrcRectDestRectI(

+    GpGraphics *            graphics,

+    GDIPCONST GpMetafile *  metafile,

+    GDIPCONST Rect &        destRect,

+    GDIPCONST Rect &        srcRect,

+    Unit                    srcUnit,

+    EnumerateMetafileProc   callback,

+    VOID *                  callbackData,

+    GDIPCONST GpImageAttributes *     imageAttributes

+    );

+

+GpStatus WINGDIPAPI

+GdipEnumerateMetafileSrcRectDestPoints(

+    GpGraphics *            graphics,

+    GDIPCONST GpMetafile *  metafile,

+    GDIPCONST PointF *      destPoints,

+    INT                     count,

+    GDIPCONST RectF &       srcRect,

+    Unit                    srcUnit,

+    EnumerateMetafileProc   callback,

+    VOID *                  callbackData,

+    GDIPCONST GpImageAttributes *     imageAttributes

+    );

+

+GpStatus WINGDIPAPI

+GdipEnumerateMetafileSrcRectDestPointsI(

+    GpGraphics *            graphics,

+    GDIPCONST GpMetafile *  metafile,

+    GDIPCONST Point *       destPoints,

+    INT                     count,

+    GDIPCONST Rect &        srcRect,

+    Unit                    srcUnit,

+    EnumerateMetafileProc   callback,

+    VOID *                  callbackData,

+    GDIPCONST GpImageAttributes *     imageAttributes

+    );

+

+GpStatus WINGDIPAPI

+GdipPlayMetafileRecord(

+    GDIPCONST GpMetafile *  metafile,

+    EmfPlusRecordType       recordType,

+    UINT                    flags,

+    UINT                    dataSize,

+    GDIPCONST BYTE *        data

+    );

+

+GpStatus WINGDIPAPI

+GdipSetClipGraphics(GpGraphics *graphics, GpGraphics *srcgraphics,

+                    CombineMode combineMode);

+

+GpStatus WINGDIPAPI

+GdipSetClipRect(GpGraphics *graphics, REAL x, REAL y,

+                         REAL width, REAL height, CombineMode combineMode);

+

+GpStatus WINGDIPAPI

+GdipSetClipRectI(GpGraphics *graphics, INT x, INT y,

+                         INT width, INT height, CombineMode combineMode);

+

+GpStatus WINGDIPAPI

+GdipSetClipPath(GpGraphics *graphics, GpPath *path, CombineMode combineMode);

+

+GpStatus WINGDIPAPI

+GdipSetClipRegion(GpGraphics *graphics, GpRegion *region,

+                  CombineMode combineMode);

+

+GpStatus WINGDIPAPI

+GdipSetClipHrgn(GpGraphics *graphics, HRGN hRgn, CombineMode combineMode);

+

+GpStatus WINGDIPAPI

+GdipResetClip(GpGraphics *graphics);

+

+GpStatus WINGDIPAPI

+GdipTranslateClip(GpGraphics *graphics, REAL dx, REAL dy);

+

+GpStatus WINGDIPAPI

+GdipTranslateClipI(GpGraphics *graphics, INT dx, INT dy);

+

+GpStatus WINGDIPAPI

+GdipGetClip(GpGraphics *graphics, GpRegion *region);

+

+GpStatus WINGDIPAPI

+GdipGetClipBounds(GpGraphics *graphics, GpRectF *rect);

+

+GpStatus WINGDIPAPI

+GdipGetClipBoundsI(GpGraphics *graphics, GpRect *rect);

+

+GpStatus WINGDIPAPI

+GdipIsClipEmpty(GpGraphics *graphics, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipGetVisibleClipBounds(GpGraphics *graphics, GpRectF *rect);

+

+GpStatus WINGDIPAPI

+GdipGetVisibleClipBoundsI(GpGraphics *graphics, GpRect *rect);

+

+GpStatus WINGDIPAPI

+GdipIsVisibleClipEmpty(GpGraphics *graphics, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsVisiblePoint(GpGraphics *graphics, REAL x, REAL y,

+                           BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsVisiblePointI(GpGraphics *graphics, INT x, INT y,

+                           BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsVisibleRect(GpGraphics *graphics, REAL x, REAL y,

+                           REAL width, REAL height, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipIsVisibleRectI(GpGraphics *graphics, INT x, INT y,

+                           INT width, INT height, BOOL *result);

+

+GpStatus WINGDIPAPI

+GdipSaveGraphics(GpGraphics *graphics, GraphicsState *state);

+

+GpStatus WINGDIPAPI

+GdipRestoreGraphics(GpGraphics *graphics, GraphicsState state);

+

+GpStatus WINGDIPAPI

+GdipBeginContainer(GpGraphics *graphics, GDIPCONST GpRectF* dstrect,

+                   GDIPCONST GpRectF *srcrect, GpUnit unit, GraphicsContainer *state);

+

+GpStatus WINGDIPAPI

+GdipBeginContainerI(GpGraphics *graphics, GDIPCONST GpRect* dstrect,

+                    GDIPCONST GpRect *srcrect, GpUnit unit, GraphicsContainer *state);

+

+GpStatus WINGDIPAPI

+GdipBeginContainer2(GpGraphics *graphics, GraphicsContainer* state);

+

+GpStatus WINGDIPAPI

+GdipEndContainer(GpGraphics *graphics, GraphicsContainer state);

+

+GpStatus

+GdipGetMetafileHeaderFromWmf(

+    HMETAFILE           hWmf,

+    GDIPCONST APMFileHeader *     apmFileHeader,

+    MetafileHeader *    header

+    );

+

+GpStatus

+WINGDIPAPI

+GdipGetMetafileHeaderFromEmf(

+    HENHMETAFILE        hEmf,

+    MetafileHeader *    header

+    );

+

+GpStatus

+WINGDIPAPI

+GdipGetMetafileHeaderFromFile(

+    GDIPCONST WCHAR*        filename,

+    MetafileHeader *    header

+    );

+

+GpStatus

+WINGDIPAPI

+GdipGetMetafileHeaderFromStream(

+    IStream *           stream,

+    MetafileHeader *    header

+    );

+

+GpStatus

+WINGDIPAPI

+GdipGetMetafileHeaderFromMetafile(

+    GpMetafile *        metafile,

+    MetafileHeader *    header

+    );

+

+GpStatus

+WINGDIPAPI

+GdipGetHemfFromMetafile(

+    GpMetafile *        metafile,

+    HENHMETAFILE *      hEmf

+    );

+

+GpStatus WINGDIPAPI

+GdipCreateStreamOnFile(GDIPCONST WCHAR * filename, UINT access, IStream **stream);

+

+GpStatus WINGDIPAPI

+GdipCreateMetafileFromWmf(HMETAFILE hWmf, BOOL deleteWmf,

+                          GDIPCONST APMFileHeader * apmFileHeader, GpMetafile **metafile);

+

+GpStatus WINGDIPAPI

+GdipCreateMetafileFromEmf(HENHMETAFILE hEmf, BOOL deleteEmf,

+                          GpMetafile **metafile);

+

+GpStatus WINGDIPAPI

+GdipCreateMetafileFromFile(GDIPCONST WCHAR* file, GpMetafile **metafile);

+

+GpStatus WINGDIPAPI

+GdipCreateMetafileFromWmfFile(GDIPCONST WCHAR* file, GDIPCONST APMFileHeader * apmFileHeader, GpMetafile **metafile);

+

+GpStatus WINGDIPAPI

+GdipCreateMetafileFromStream(IStream * stream, GpMetafile **metafile);

+

+GpStatus WINGDIPAPI

+GdipRecordMetafile(

+    HDC                 referenceHdc,

+    EmfType             type,

+    GDIPCONST GpRectF * frameRect,

+    MetafileFrameUnit   frameUnit,

+    GDIPCONST WCHAR *   description,

+    GpMetafile **       metafile

+    );

+

+GpStatus WINGDIPAPI

+GdipRecordMetafileI(

+    HDC                 referenceHdc,

+    EmfType             type,

+    GDIPCONST GpRect *  frameRect,

+    MetafileFrameUnit   frameUnit,

+    GDIPCONST WCHAR *   description,

+    GpMetafile **       metafile

+    );

+

+GpStatus WINGDIPAPI

+GdipRecordMetafileFileName(

+    GDIPCONST WCHAR*    fileName,

+    HDC                 referenceHdc,

+    EmfType             type,

+    GDIPCONST GpRectF * frameRect,

+    MetafileFrameUnit   frameUnit,

+    GDIPCONST WCHAR *   description,

+    GpMetafile **       metafile

+    );

+

+GpStatus WINGDIPAPI

+GdipRecordMetafileFileNameI(

+    GDIPCONST WCHAR*    fileName,

+    HDC                 referenceHdc,

+    EmfType             type,

+    GDIPCONST GpRect *  frameRect,

+    MetafileFrameUnit   frameUnit,

+    GDIPCONST WCHAR *   description,

+    GpMetafile **       metafile

+    );

+

+GpStatus WINGDIPAPI

+GdipRecordMetafileStream(

+    IStream *           stream,

+    HDC                 referenceHdc,

+    EmfType             type,

+    GDIPCONST GpRectF * frameRect,

+    MetafileFrameUnit   frameUnit,

+    GDIPCONST WCHAR *   description,

+    GpMetafile **       metafile

+    );

+

+GpStatus WINGDIPAPI

+GdipRecordMetafileStreamI(

+    IStream *           stream,

+    HDC                 referenceHdc,

+    EmfType             type,

+    GDIPCONST GpRect *  frameRect,

+    MetafileFrameUnit   frameUnit,

+    GDIPCONST WCHAR *   description,

+    GpMetafile **       metafile

+    );

+

+GpStatus WINGDIPAPI

+GdipSetMetafileDownLevelRasterizationLimit(

+    GpMetafile *            metafile,

+    UINT                    metafileRasterizationLimitDpi

+    );

+

+GpStatus WINGDIPAPI

+GdipGetMetafileDownLevelRasterizationLimit(

+    GDIPCONST GpMetafile *  metafile,

+    UINT *                  metafileRasterizationLimitDpi

+    );

+

+GpStatus WINGDIPAPI

+GdipGetImageDecodersSize(UINT *numDecoders, UINT *size);

+

+GpStatus WINGDIPAPI

+GdipGetImageDecoders(UINT numDecoders,

+                     UINT size,

+                     ImageCodecInfo *decoders);

+

+GpStatus WINGDIPAPI

+GdipGetImageEncodersSize(UINT *numEncoders, UINT *size);

+

+GpStatus WINGDIPAPI

+GdipGetImageEncoders(UINT numEncoders,

+                     UINT size,

+                     ImageCodecInfo *encoders);

+

+GpStatus WINGDIPAPI

+GdipAddImageCodec(GDIPCONST ImageCodecInfo *codec);

+

+GpStatus WINGDIPAPI

+GdipRemoveImageCodec(GDIPCONST ImageCodecInfo *codec);

+

+#ifndef DCR_USE_NEW_186091

+GpStatus WINGDIPAPI

+GdipGetGraphicsPixel(GpGraphics* graphics, REAL x, REAL y, ARGB* argb);

+#endif

+

+GpStatus WINGDIPAPI

+GdipComment(GpGraphics* graphics, UINT sizeData, GDIPCONST BYTE * data);

+

+GpStatus WINGDIPAPI

+GdipGetGraphicsLayout(GpGraphics* graphics, GraphicsLayout* layout);

+

+GpStatus WINGDIPAPI

+GdipSetGraphicsLayout(GpGraphics* graphics, GDIPCONST GraphicsLayout layout);

+

+//----------------------------------------------------------------------------

+// FontFamily

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name,

+                             GpFontCollection *fontCollection,

+                             GpFontFamily **FontFamily);

+

+GpStatus WINGDIPAPI

+GdipDeleteFontFamily(GpFontFamily *FontFamily);

+

+GpStatus WINGDIPAPI

+GdipCloneFontFamily(GpFontFamily *FontFamily, GpFontFamily **clonedFontFamily);

+

+GpStatus WINGDIPAPI

+GdipGetGenericFontFamilySansSerif(GpFontFamily **nativeFamily);

+

+GpStatus WINGDIPAPI

+GdipGetGenericFontFamilySerif(GpFontFamily **nativeFamily);

+

+GpStatus WINGDIPAPI

+GdipGetGenericFontFamilyMonospace(GpFontFamily **nativeFamily);

+

+

+GpStatus WINGDIPAPI

+GdipGetFamilyName(

+    GDIPCONST GpFontFamily  *family,

+    WCHAR                name[LF_FACESIZE],

+    LANGID               language

+);

+

+GpStatus   WINGDIPAPI

+GdipIsStyleAvailable(GDIPCONST GpFontFamily *family, INT style, BOOL * IsStyleAvailable);

+

+GpStatus WINGDIPAPI

+GdipFontCollectionEnumerable(

+    GpFontCollection* fontCollection,

+    GpGraphics* graphics,

+    INT *       numFound

+);

+

+GpStatus WINGDIPAPI GdipFontCollectionEnumerate(

+    GpFontCollection* fontCollection,

+    INT             numSought,

+    GpFontFamily*   gpfamilies[],

+    INT*            numFound,

+    GpGraphics*     graphics

+);

+

+//-----------------------------------

+// New API

+//-----------------------------------

+

+GpStatus WINGDIPAPI

+GdipGetEmHeight(GDIPCONST GpFontFamily *family, INT style, UINT16 * EmHeight);

+

+GpStatus WINGDIPAPI

+GdipGetCellAscent(GDIPCONST GpFontFamily *family, INT style, UINT16 * CellAscent);

+

+GpStatus WINGDIPAPI

+GdipGetCellDescent(GDIPCONST GpFontFamily *family, INT style, UINT16 * CellDescent);

+

+GpStatus WINGDIPAPI

+GdipGetLineSpacing(GDIPCONST GpFontFamily *family, INT style, UINT16 * LineSpacing);

+

+

+//----------------------------------------------------------------------------

+// Font

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateFontFromDC(

+    HDC        hdc,

+    GpFont   **font

+);

+

+GpStatus WINGDIPAPI

+GdipCreateFontFromLogfontA(

+    HDC        hdc,

+    GDIPCONST LOGFONTA  *logfont,

+    GpFont   **font

+);

+

+GpStatus WINGDIPAPI

+GdipCreateFontFromLogfontW(

+    HDC        hdc,

+    GDIPCONST LOGFONTW  *logfont,

+    GpFont   **font

+);

+

+GpStatus WINGDIPAPI

+GdipCreateFont(

+    GDIPCONST GpFontFamily  *fontFamily,

+    REAL                 emSize,

+    INT                  style,

+    Unit                 unit,

+    GpFont             **font

+);

+

+GpStatus WINGDIPAPI

+GdipCloneFont(GpFont* font, GpFont** cloneFont);

+

+GpStatus WINGDIPAPI

+GdipDeleteFont(GpFont* font);

+

+GpStatus WINGDIPAPI

+GdipGetFamily(GpFont *font, GpFontFamily **family);

+

+GpStatus WINGDIPAPI

+GdipGetFontStyle(GpFont *font, INT *style);

+

+GpStatus WINGDIPAPI

+GdipGetFontSize(GpFont *font, REAL *size);

+

+GpStatus WINGDIPAPI

+GdipGetFontUnit(GpFont *font, Unit *unit);

+

+GpStatus WINGDIPAPI

+GdipGetFontHeight(GDIPCONST GpFont *font, GDIPCONST GpGraphics *graphics, REAL *height);

+

+#ifdef DCR_USE_NEW_125467

+GpStatus WINGDIPAPI

+GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, REAL *height);

+#endif

+

+GpStatus WINGDIPAPI

+GdipGetLogFontA(GpFont * font, GpGraphics *graphics, LOGFONTA * logfontA);

+

+GpStatus WINGDIPAPI

+GdipGetLogFontW(GpFont * font, GpGraphics *graphics, LOGFONTW * logfontW);

+

+// FontCollection

+

+GpStatus WINGDIPAPI

+GdipNewInstalledFontCollection(GpFontCollection** fontCollection);

+

+GpStatus WINGDIPAPI

+GdipNewPrivateFontCollection(GpFontCollection** fontCollection);

+

+GpStatus WINGDIPAPI

+GdipDeletePrivateFontCollection(GpFontCollection** fontCollection);

+

+GpStatus WINGDIPAPI

+GdipGetFontCollectionFamilyCount(

+    GpFontCollection* fontCollection,

+    INT *       numFound

+);

+

+GpStatus WINGDIPAPI

+GdipGetFontCollectionFamilyList(

+    GpFontCollection* fontCollection,

+    INT             numSought,

+    GpFontFamily*   gpfamilies[],

+    INT*            numFound

+);

+

+#ifndef DCR_USE_NEW_235072

+GpStatus WINGDIPAPI

+GdipInstallFontFile(

+    GpFontCollection* fontCollection,

+    GDIPCONST WCHAR* filename

+);

+

+GpStatus WINGDIPAPI

+GdipUninstallFontFile(

+    GpFontCollection* fontCollection,

+    GDIPCONST WCHAR* filename

+);

+#endif

+

+GpStatus WINGDIPAPI

+GdipPrivateAddFontFile(

+    GpFontCollection* fontCollection,

+    GDIPCONST WCHAR* filename

+);

+

+GpStatus WINGDIPAPI

+GdipPrivateAddMemoryFont(

+    GpFontCollection* fontCollection,

+    GDIPCONST void* memory,

+    INT length

+);

+

+//----------------------------------------------------------------------------

+// Text

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipDrawString(

+    GpGraphics               *graphics,

+    GDIPCONST WCHAR          *string,

+    INT                       length,

+    GDIPCONST GpFont         *font,

+    GDIPCONST RectF          *layoutRect,

+    GDIPCONST GpStringFormat *stringFormat,

+    GDIPCONST GpBrush        *brush

+);

+

+GpStatus WINGDIPAPI

+GdipMeasureString(

+    GpGraphics               *graphics,

+    GDIPCONST WCHAR          *string,

+    INT                       length,

+    GDIPCONST GpFont         *font,

+    GDIPCONST RectF          *layoutRect,

+    GDIPCONST GpStringFormat *stringFormat,

+    RectF                    *boundingBox,

+    INT                      *codepointsFitted,

+    INT                      *linesFilled

+);

+

+#ifndef DCR_USE_NEW_174340

+GpStatus WINGDIPAPI

+GdipMeasureStringRegion(

+    GpGraphics               *graphics,

+    GDIPCONST WCHAR          *string,

+    INT                       length,

+    GDIPCONST GpFont         *font,

+    GDIPCONST RectF          &layoutRect,

+    GDIPCONST GpStringFormat *stringFormat,

+    INT                       firstCharacterIndex,

+    INT                       characterCount,

+    GpRegion                 *region

+);

+#endif

+

+#ifdef DCR_USE_NEW_174340

+GpStatus

+WINGDIPAPI

+GdipMeasureCharacterRanges(

+    GpGraphics               *graphics,

+    GDIPCONST WCHAR          *string,

+    INT                       length,

+    GDIPCONST GpFont         *font,

+    GDIPCONST RectF          &layoutRect,

+    GDIPCONST GpStringFormat *stringFormat,

+    INT                       regionCount,

+    GpRegion                **regions

+);

+#endif

+

+GpStatus WINGDIPAPI

+GdipDrawDriverString(

+    GpGraphics *graphics,

+    GDIPCONST UINT16 *text,

+    INT length,

+    GDIPCONST GpFont *font,

+    GDIPCONST GpBrush *brush,

+    GDIPCONST PointF *positions,

+    INT flags,

+    GDIPCONST GpMatrix *matrix

+);

+

+GpStatus WINGDIPAPI

+GdipMeasureDriverString(

+    GpGraphics *graphics,

+    GDIPCONST UINT16 *text,

+    INT length,

+    GDIPCONST GpFont *font,

+    GDIPCONST PointF *positions,

+    INT flags,

+    GDIPCONST GpMatrix *matrix,

+    RectF *boundingBox

+);

+

+#ifndef DCR_USE_NEW_168772

+GpStatus WINGDIPAPI

+GdipDriverStringPointToCodepoint(

+    GpGraphics *graphics,

+    GDIPCONST UINT16 *text,

+    INT length,

+    GDIPCONST GpFont *font,

+    GDIPCONST PointF *positions,

+    INT flags,

+    GpMatrix *matrix,

+    GDIPCONST PointF *hit,

+    INT *index,

+    BOOL *rightEdge,

+    REAL *distance

+);

+#endif

+

+//----------------------------------------------------------------------------

+// String format APIs

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateStringFormat(

+    INT               formatAttributes,

+    LANGID            language,

+    GpStringFormat  **format

+);

+

+GpStatus WINGDIPAPI

+GdipStringFormatGetGenericDefault(GpStringFormat **format);

+

+GpStatus WINGDIPAPI

+GdipStringFormatGetGenericTypographic(GpStringFormat **format);

+

+GpStatus WINGDIPAPI

+GdipDeleteStringFormat(GpStringFormat *format);

+

+GpStatus WINGDIPAPI

+GdipCloneStringFormat(GDIPCONST GpStringFormat *format, GpStringFormat **newFormat);

+

+GpStatus WINGDIPAPI

+GdipSetStringFormatFlags(GpStringFormat *format, INT flags);

+

+GpStatus WINGDIPAPI GdipGetStringFormatFlags(GDIPCONST GpStringFormat *format, INT *flags);

+

+#ifndef DCR_USE_NEW_152154

+GpStatus WINGDIPAPI

+GdipSetStringFormatLineSpacing(GpStringFormat *format, REAL amount,

+                               LineSpacing method);

+

+GpStatus WINGDIPAPI

+GdipGetStringFormatLineSpacingAmount(GDIPCONST GpStringFormat *format, REAL *amount);

+GpStatus WINGDIPAPI

+GdipGetStringFormatLineSpacingMethod(GDIPCONST GpStringFormat *format, LineSpacing *method);

+#endif

+

+GpStatus WINGDIPAPI

+GdipSetStringFormatAlign(GpStringFormat *format, StringAlignment align);

+

+GpStatus WINGDIPAPI

+GdipGetStringFormatAlign(GDIPCONST GpStringFormat *format, StringAlignment *align);

+

+GpStatus WINGDIPAPI

+GdipSetStringFormatLineAlign(GpStringFormat *format,

+                             StringAlignment align);

+

+GpStatus WINGDIPAPI

+GdipGetStringFormatLineAlign(GDIPCONST GpStringFormat *format,

+                             StringAlignment *align);

+

+GpStatus WINGDIPAPI

+GdipSetStringFormatTrimming(

+    GpStringFormat  *format,

+    StringTrimming   trimming

+);

+

+GpStatus WINGDIPAPI

+GdipGetStringFormatTrimming(

+    GDIPCONST GpStringFormat *format,

+    StringTrimming       *trimming

+);

+

+GpStatus WINGDIPAPI

+GdipSetStringFormatHotkeyPrefix(GpStringFormat *format, INT hotkeyPrefix);

+

+GpStatus WINGDIPAPI

+GdipGetStringFormatHotkeyPrefix(GDIPCONST GpStringFormat *format, INT *hotkeyPrefix);

+

+GpStatus WINGDIPAPI

+GdipSetStringFormatTabStops(GpStringFormat *format, REAL firstTabOffset, INT count, GDIPCONST REAL *tabStops);

+

+GpStatus WINGDIPAPI

+GdipGetStringFormatTabStops(GDIPCONST GpStringFormat *format, INT count, REAL *firstTabOffset, REAL *tabStops);

+

+GpStatus WINGDIPAPI

+GdipGetStringFormatTabStopCount(GDIPCONST GpStringFormat *format, INT * count);

+

+#ifdef DCR_USE_NEW_146933

+GpStatus WINGDIPAPI

+GdipSetStringFormatDigitSubstitution(GpStringFormat *format, LANGID language,

+                                     StringDigitSubstitute substitute);

+

+GpStatus WINGDIPAPI

+GdipGetStringFormatDigitSubstitution(GDIPCONST GpStringFormat *format, LANGID *language,

+                                     StringDigitSubstitute *substitute);

+#endif // DCR_USE_NEW_146933

+

+#ifdef DCR_USE_NEW_174340

+GpStatus WINGDIPAPI

+GdipGetStringFormatMeasurableCharacterRangeCount(

+    GDIPCONST GpStringFormat    *format,

+    INT                         *count

+);

+

+GpStatus WINGDIPAPI

+GdipSetStringFormatMeasurableCharacterRanges(

+    GpStringFormat              *format,

+    INT                         rangeCount,

+    GDIPCONST CharacterRange    *ranges

+);

+#endif

+

+//----------------------------------------------------------------------------

+// Cached Bitmap APIs

+//----------------------------------------------------------------------------

+

+GpStatus WINGDIPAPI

+GdipCreateCachedBitmap(

+    GpBitmap *bitmap,

+    GpGraphics *graphics,

+    GpCachedBitmap **cachedBitmap

+);

+

+GpStatus WINGDIPAPI

+GdipDeleteCachedBitmap(GpCachedBitmap *cachedBitmap);

+

+GpStatus WINGDIPAPI

+GdipDrawCachedBitmap(

+    GpGraphics *graphics,

+    GpCachedBitmap *cachedBitmap,

+    INT x,

+    INT y

+);

+

+UINT WINGDIPAPI

+GdipEmfToWmfBits(

+    HENHMETAFILE hemf,

+    UINT         cbData16,

+    LPBYTE       pData16,

+    INT          iMapMode,

+    INT          eFlags

+);

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif // !_FLATAPI_H

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h
new file mode 100644
index 0000000..c9ff050
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h
@@ -0,0 +1,299 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusFont.h

+*

+* Abstract:

+*

+*   Font related declarations

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSFONT_H

+#define _GDIPLUSFONT_H

+

+inline

+Font::Font(IN HDC hdc)

+{

+    GpFont *font = NULL;

+    lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);

+

+#ifndef DCR_USE_NEW_135429

+    if ((INT) lastResult >= 10)

+        lastResult = NotFound;

+#endif

+

+    SetNativeFont(font);

+}

+

+#ifdef DCR_USE_NEW_127084

+inline

+Font::Font(IN HDC hdc,

+           IN const HFONT hfont)

+{

+    GpFont *font = NULL;

+

+    if (hfont)

+    {

+        LOGFONTA lf;

+

+        if(GetObjectA(hfont, sizeof(LOGFONTA), &lf))

+            lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, &lf, &font);

+        else

+            lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);

+    }

+    else

+    {

+        lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);

+    }

+

+#ifndef DCR_USE_NEW_135429

+    if ((INT) lastResult >= 10)

+        lastResult = NotFound;

+#endif

+

+    SetNativeFont(font);

+}

+#endif

+

+inline

+Font::Font(IN HDC hdc,

+           IN const LOGFONTW* logfont)

+{

+    GpFont *font = NULL;

+    if (logfont)

+    {

+        lastResult = DllExports::GdipCreateFontFromLogfontW(hdc, logfont, &font);

+    }

+    else

+    {

+        lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);

+    }

+

+#ifndef DCR_USE_NEW_135429

+    if ((INT) lastResult >= 10)

+        lastResult = NotFound;

+#endif

+

+    SetNativeFont(font);

+}

+

+inline

+Font::Font(IN HDC hdc,

+           IN const LOGFONTA* logfont)

+{

+    GpFont *font = NULL;

+

+    if (logfont)

+    {

+        lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, logfont, &font);

+    }

+    else

+    {

+        lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);

+    }

+

+#ifndef DCR_USE_NEW_135429

+    if ((INT) lastResult >= 10)

+        lastResult = NotFound;

+#endif

+

+    SetNativeFont(font);

+}

+

+inline

+Font::Font(

+     IN const FontFamily * family,

+     IN REAL         emSize,

+     IN INT          style,

+     IN Unit         unit

+)

+{

+    GpFont *font = NULL;

+

+    lastResult = DllExports::GdipCreateFont(family ? family->nativeFamily : NULL,

+                    emSize,

+                    style,

+                    unit,

+                    &font);

+

+#ifndef DCR_USE_NEW_135429

+    if ((INT) lastResult >= 10)

+        lastResult = NotFound;

+#endif

+

+    SetNativeFont(font);

+}

+

+inline

+Font::Font(

+     IN const WCHAR *          familyName,

+     IN REAL                   emSize,

+     IN INT                    style,

+     IN Unit                   unit,

+     IN const FontCollection * fontCollection

+)

+{

+    FontFamily family(familyName, fontCollection);

+

+    GpFont * font = NULL;

+

+    lastResult = family.GetLastStatus();

+

+    if (lastResult == Ok)

+    {

+        lastResult = DllExports::GdipCreateFont(family.nativeFamily,

+                                emSize,

+                                style,

+                                unit,

+                                &font);

+    }

+

+#ifndef DCR_USE_NEW_135429

+    if ((INT) lastResult >= 10)

+        lastResult = NotFound;

+#endif

+

+    SetNativeFont(font);

+}

+

+inline Status

+Font::GetLogFontA(IN const Graphics *g,

+                  OUT LOGFONTA *logfontA) const

+{

+    return SetStatus(DllExports::GdipGetLogFontA(nativeFont, g ? g->nativeGraphics : NULL, logfontA));

+

+}

+

+inline Status

+Font::GetLogFontW(IN const Graphics *g,

+                  OUT LOGFONTW *logfontW) const

+{

+    return SetStatus(DllExports::GdipGetLogFontW(nativeFont, g ? g->nativeGraphics : NULL, logfontW));

+}

+

+

+inline Font*

+Font::Clone() const

+{

+    GpFont *cloneFont = NULL;

+

+    SetStatus(DllExports::GdipCloneFont(nativeFont, &cloneFont));

+

+    return new Font(cloneFont, lastResult);

+}

+

+inline

+Font::~Font()

+{

+    DllExports::GdipDeleteFont(nativeFont);

+}

+

+// Operations

+

+inline BOOL

+Font::IsAvailable() const

+{

+    return (nativeFont ? TRUE : FALSE);

+}

+

+inline Status

+Font::GetFamily(OUT FontFamily *family) const

+{

+    if (family == NULL)

+    {

+        return SetStatus(InvalidParameter);

+    }

+

+    Status status = DllExports::GdipGetFamily(nativeFont, &(family->nativeFamily));

+    family->SetStatus(status);

+

+    return SetStatus(status);

+}

+

+inline INT

+Font::GetStyle() const

+{

+    INT style;

+

+    SetStatus(DllExports::GdipGetFontStyle(nativeFont, &style));

+

+    return style;

+}

+

+inline REAL

+Font::GetSize() const

+{

+    REAL size;

+    SetStatus(DllExports::GdipGetFontSize(nativeFont, &size));

+    return size;

+}

+

+inline Unit

+Font::GetUnit() const

+{

+    Unit unit;

+    SetStatus(DllExports::GdipGetFontUnit(nativeFont, &unit));

+    return unit;

+}

+

+inline REAL

+Font::GetHeight(IN const Graphics *graphics) const

+{

+    REAL height;

+    SetStatus(DllExports::GdipGetFontHeight(

+        nativeFont,

+        graphics ? graphics->nativeGraphics : NULL,

+        &height

+    ));

+    return height;

+}

+

+

+#ifdef DCR_USE_NEW_125467

+inline REAL

+Font::GetHeight(IN REAL dpi = 0) const

+{

+    REAL height;

+    SetStatus(DllExports::GdipGetFontHeightGivenDPI(nativeFont, dpi, &height));

+    return height;

+}

+#endif

+

+

+// protected method

+inline

+Font::Font(IN GpFont* font,

+           IN Status status)

+{

+    lastResult = status;

+    SetNativeFont(font);

+}

+

+// protected method

+inline VOID

+Font::SetNativeFont(GpFont *Font)

+{

+    nativeFont = Font;

+}

+

+inline Status

+Font::GetLastStatus(void) const

+{

+    return lastResult;

+}

+

+// protected method

+inline Status

+Font::SetStatus(IN Status status) const

+{

+    if (status != Ok)

+        return (lastResult = status);

+    else

+        return status;

+}

+

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h
new file mode 100644
index 0000000..d2257ba
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h
@@ -0,0 +1,149 @@
+/**************************************************************************\

+*

+* Copyright (c) 2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+* 

+*   GdiplusFontCollection.h

+*

+* Abstract:

+*

+*   Font collections (Installed and Private)

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSFONTCOLL_H

+#define _GDIPLUSFONTCOLL_H

+

+inline

+FontCollection::FontCollection()

+{

+    nativeFontCollection = NULL;

+}

+

+inline

+FontCollection::~FontCollection()

+{

+}

+

+inline INT

+FontCollection::GetFamilyCount() const

+{

+    INT numFound = 0;

+

+    lastResult = DllExports::GdipGetFontCollectionFamilyCount(

+                             nativeFontCollection, &numFound);

+

+

+

+    return numFound;

+}

+

+inline Status

+FontCollection::GetFamilies(

+    IN INT           numSought,

+    OUT FontFamily * gpfamilies,

+    OUT INT *        numFound

+) const

+{

+    if (numSought <= 0 || gpfamilies == NULL || numFound == NULL)

+    {

+        return SetStatus(InvalidParameter);

+    }

+    *numFound = 0;

+    GpFontFamily **nativeFamilyList = new GpFontFamily*[numSought];

+

+    if (nativeFamilyList == NULL)

+    {

+        return SetStatus(OutOfMemory);

+    }

+

+    Status status = SetStatus(DllExports::GdipGetFontCollectionFamilyList(

+        nativeFontCollection,

+        numSought,

+        nativeFamilyList,

+        numFound

+    ));

+    if (status == Ok)

+    {

+        for (INT i = 0; i < *numFound; i++)

+        {

+            DllExports::GdipCloneFontFamily(nativeFamilyList[i],

+                                            &gpfamilies[i].nativeFamily);

+        }

+    }

+

+    delete [] nativeFamilyList;

+

+    return status;

+}

+

+inline Status FontCollection::GetLastStatus () const

+{

+    return lastResult;

+}

+

+// protected method

+inline Status

+FontCollection::SetStatus(IN Status status) const

+{

+    lastResult = status;

+    return lastResult;

+}

+

+inline

+InstalledFontCollection::InstalledFontCollection()

+{

+    nativeFontCollection = NULL;

+    lastResult = DllExports::GdipNewInstalledFontCollection(&nativeFontCollection);

+}

+

+inline

+InstalledFontCollection::~InstalledFontCollection()

+{

+}

+

+#ifndef DCR_USE_NEW_235072

+inline Status

+InstalledFontCollection::InstallFontFile(IN const WCHAR* filename)

+{

+    return SetStatus(DllExports::GdipInstallFontFile(nativeFontCollection, filename));

+}

+

+inline Status

+InstalledFontCollection::UninstallFontFile(IN const WCHAR* filename)

+{

+    return SetStatus(DllExports::GdipUninstallFontFile(nativeFontCollection, filename));

+}

+#endif

+

+inline

+PrivateFontCollection::PrivateFontCollection()

+{

+    nativeFontCollection = NULL;

+    lastResult = DllExports::GdipNewPrivateFontCollection(&nativeFontCollection);

+}

+

+inline

+PrivateFontCollection::~PrivateFontCollection()

+{

+    DllExports::GdipDeletePrivateFontCollection(&nativeFontCollection);

+}

+

+inline Status

+PrivateFontCollection::AddFontFile(IN const WCHAR* filename)

+{

+    return SetStatus(DllExports::GdipPrivateAddFontFile(nativeFontCollection, filename));

+}

+

+inline Status

+PrivateFontCollection::AddMemoryFont(IN const void* memory,

+                                     IN INT length)

+{

+    return SetStatus(DllExports::GdipPrivateAddMemoryFont(

+        nativeFontCollection,

+        memory,

+        length));

+}

+

+#endif // _GDIPLUSFONTCOLL_H

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h
new file mode 100644
index 0000000..ef2f3dd
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h
@@ -0,0 +1,271 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusFontFamily.h

+*

+* Abstract:

+*

+*   Font family API related declarations

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUS_FONT_FAMILY_H

+#define _GDIPLUS_FONT_FAMILY_H

+

+inline 

+FontFamily::FontFamily() :

+    nativeFamily (NULL),

+    lastResult    (Ok)

+{

+}

+

+inline 

+FontFamily::FontFamily(

+    IN const WCHAR*          name,

+    IN const FontCollection* fontCollection

+)

+{

+    nativeFamily = NULL;

+    lastResult = DllExports::GdipCreateFontFamilyFromName(

+        name,

+        fontCollection ? fontCollection->nativeFontCollection : NULL,

+        &nativeFamily

+    );

+    

+#ifndef DCR_USE_NEW_135429

+    if ((INT) lastResult >= 10)

+        lastResult = NotFound;

+#endif

+}

+

+// private method

+inline

+FontFamily::FontFamily(

+    IN GpFontFamily *nativeOrig,

+    IN Status status

+)

+{

+    lastResult    = status;

+    nativeFamily = nativeOrig;

+}

+

+// Generic font family access

+

+inline const FontFamily *

+FontFamily::GenericSansSerif() 

+{

+    if (GenericSansSerifFontFamily != NULL)

+    {

+        return GenericSansSerifFontFamily;

+    }

+

+    GenericSansSerifFontFamily =

+        (FontFamily*) GenericSansSerifFontFamilyBuffer;

+

+    GenericSansSerifFontFamily->lastResult =

+        DllExports::GdipGetGenericFontFamilySansSerif(

+            &(GenericSansSerifFontFamily->nativeFamily)

+        );

+

+#ifndef DCR_USE_NEW_135429

+    if ((INT) GenericSansSerifFontFamily->lastResult >= 10)

+        GenericSansSerifFontFamily->lastResult = NotFound;

+#endif

+

+    return GenericSansSerifFontFamily;

+}

+

+inline const FontFamily *

+FontFamily::GenericSerif() 

+{

+    if (GenericSerifFontFamily != NULL)

+    {

+        return GenericSerifFontFamily;

+    }

+

+    GenericSerifFontFamily =

+        (FontFamily*) GenericSerifFontFamilyBuffer;

+

+    GenericSerifFontFamily->lastResult =

+        DllExports::GdipGetGenericFontFamilySerif(

+            &(GenericSerifFontFamily->nativeFamily)

+        );

+

+#ifndef DCR_USE_NEW_135429

+    if ((INT) GenericSerifFontFamily->lastResult >= 10)

+        GenericSerifFontFamily->lastResult = NotFound;

+#endif

+

+    return GenericSerifFontFamily;

+}

+

+inline const FontFamily *

+FontFamily::GenericMonospace()

+{

+    if (GenericMonospaceFontFamily != NULL)

+    {

+        return GenericMonospaceFontFamily;

+    }

+

+    GenericMonospaceFontFamily =

+        (FontFamily*) GenericMonospaceFontFamilyBuffer;

+

+    GenericMonospaceFontFamily->lastResult =

+        DllExports::GdipGetGenericFontFamilyMonospace(

+            &(GenericMonospaceFontFamily->nativeFamily)

+        );

+

+#ifndef DCR_USE_NEW_135429

+    if ((INT) GenericMonospaceFontFamily->lastResult >= 10)

+        GenericMonospaceFontFamily->lastResult = NotFound;

+#endif

+

+    return GenericMonospaceFontFamily;

+}

+

+inline FontFamily::~FontFamily()

+{

+    DllExports::GdipDeleteFontFamily (nativeFamily);

+}

+

+inline FontFamily *

+FontFamily::Clone() const

+{

+    GpFontFamily * clonedFamily = NULL;

+

+    SetStatus(DllExports::GdipCloneFontFamily (nativeFamily, &clonedFamily));

+

+    return new FontFamily(clonedFamily, lastResult);

+}

+

+inline Status 

+FontFamily::GetFamilyName(

+    IN WCHAR name[LF_FACESIZE],

+    IN LANGID language

+) const

+{

+    return SetStatus(DllExports::GdipGetFamilyName(nativeFamily, 

+                                                   name, 

+                                                   language));

+}

+

+inline BOOL 

+FontFamily::IsStyleAvailable(IN INT style) const

+{

+    BOOL    StyleAvailable;

+    Status  status;

+

+    status = SetStatus(DllExports::GdipIsStyleAvailable(nativeFamily, style, &StyleAvailable));

+

+    if (status != Ok)

+        StyleAvailable = FALSE;

+

+    return StyleAvailable;

+}

+

+

+inline UINT16 

+FontFamily::GetEmHeight(IN INT style) const

+{

+    UINT16  EmHeight;

+

+    SetStatus(DllExports::GdipGetEmHeight(nativeFamily, style, &EmHeight));

+

+    return EmHeight;

+}

+

+inline UINT16 

+FontFamily::GetCellAscent(IN INT style) const

+{

+    UINT16  CellAscent;

+

+    SetStatus(DllExports::GdipGetCellAscent(nativeFamily, style, &CellAscent));

+

+    return CellAscent;

+}

+

+inline UINT16 

+FontFamily::GetCellDescent(IN INT style) const

+{

+    UINT16  CellDescent;

+

+    SetStatus(DllExports::GdipGetCellDescent(nativeFamily, style, &CellDescent));

+

+    return CellDescent;

+}

+

+

+inline UINT16 

+FontFamily::GetLineSpacing(IN INT style) const

+{

+    UINT16  LineSpacing;

+

+    SetStatus(DllExports::GdipGetLineSpacing(nativeFamily, style, &LineSpacing));

+

+    return LineSpacing;

+

+}

+

+#ifdef TEXTV2

+

+// The following APIs return data from the font OS/2 table

+

+inline INT16 

+FontFamily::GetTypographicAscent(IN INT style) const

+{

+    INT16  TypographicAscent;

+

+    SetStatus(DllExports::GdipGetTypographicAscent(nativeFamily, style, &TypographicAscent));

+

+    return TypographicAscent;

+}

+

+inline INT16 

+FontFamily::GetTypographicDescent(IN INT style) const

+{

+    INT16   TypographicDescent;

+

+    SetStatus(DllExports::GdipGetTypographicDescent(nativeFamily, style, &TypographicDescent));

+

+    return TypographicDescent;

+}

+

+inline INT16 

+FontFamily::GetTypographicLineGap(IN INT style) const

+{

+    INT16   TypographicLineGap;

+

+    SetStatus(DllExports::GdipGetTypographicLineGap(nativeFamily, style, &TypographicLineGap));

+

+    return TypographicLineGap;

+}

+

+#endif

+

+///////////////////////////////////////////////////////////

+

+// GetLastStatus - return last error code and clear error code

+

+inline Status 

+FontFamily::GetLastStatus() const

+{

+    Status lastStatus = lastResult;

+    lastResult = Ok;

+

+    return lastStatus;

+}

+

+// protected method

+inline Status

+FontFamily::SetStatus(Status status) const 

+{

+    if (status != Ok)

+        return (lastResult = status);

+    else

+        return status;

+}

+

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h b/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h
new file mode 100644
index 0000000..121288d
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h
@@ -0,0 +1,107 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusGpStubs.h

+*

+* Abstract:

+*

+*   GDI+ Native C++ public header file

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSGPSTUBS_H

+#define _GDIPLUSGPSTUBS_H

+

+//---------------------------------------------------------------------------

+// GDI+ classes for forward reference

+//---------------------------------------------------------------------------

+

+class Graphics;

+class Pen;

+class Brush;

+class Matrix;

+class Bitmap;

+class Metafile;

+class GraphicsPath;

+class PathIterator;

+class Region;

+class Image;

+class TextureBrush;

+class HatchBrush;

+class SolidBrush;

+class LinearGradientBrush;

+class PathGradientBrush;

+class Font;

+class FontFamily;

+class FontCollection;

+class InstalledFontCollection;

+class PrivateFontCollection;

+class ImageAttributes;

+class CachedBitmap;

+

+//---------------------------------------------------------------------------

+// Internal GDI+ classes for internal type checking

+//---------------------------------------------------------------------------

+class GpGraphics {};

+

+class GpBrush {};

+class GpTexture : public GpBrush {};

+class GpSolidFill : public GpBrush {};

+class GpLineGradient : public GpBrush {};

+class GpPathGradient : public GpBrush {};

+class GpHatch : public GpBrush {};

+

+class GpPen {};

+class GpCustomLineCap {};

+class GpAdjustableArrowCap : public GpCustomLineCap {};

+

+class GpImage {};

+class GpBitmap : public GpImage {};

+class GpMetafile : public GpImage {};

+class GpImageAttributes {};

+

+class GpPath {};

+class GpRegion {};

+class GpPathIterator {};

+

+class GpFontFamily {};

+class GpFont {};

+class GpStringFormat {};

+class GpFontCollection {};

+class GpInstalledFontCollection : public GpFontCollection {};

+class GpPrivateFontCollection : public GpFontCollection {};

+

+class GpCachedBitmap;

+

+typedef Status GpStatus;

+typedef FillMode GpFillMode;

+typedef WrapMode GpWrapMode;

+typedef Unit GpUnit;

+typedef CoordinateSpace GpCoordinateSpace;

+typedef PointF GpPointF;

+typedef Point GpPoint;

+typedef RectF GpRectF;

+typedef Rect GpRect;

+typedef SizeF GpSizeF;

+typedef HatchStyle GpHatchStyle;

+typedef DashStyle GpDashStyle;

+typedef LineCap GpLineCap;

+typedef DashCap GpDashCap;

+

+

+typedef PenAlignment GpPenAlignment;

+

+typedef LineJoin GpLineJoin;

+typedef PenType GpPenType;

+

+typedef Matrix GpMatrix;

+typedef BrushType GpBrushType;

+typedef MatrixOrder GpMatrixOrder;

+typedef FlushIntention GpFlushIntention;

+typedef PathData GpPathData;

+

+#endif  // !_GDIPLUSGPSTUBS.HPP

+

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h b/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h
new file mode 100644
index 0000000..7b39a6e
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h
@@ -0,0 +1,2726 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusGraphics.h

+*

+* Abstract:

+*

+*   Declarations for Graphics class

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSGRAPHICS_H

+#define _GDIPLUSGRAPHICS_H

+

+/**

+ * Represent a graphics context

+ */

+class Graphics : public GdiplusBase

+{

+public:

+    friend class Region;

+    friend class GraphicsPath;

+    friend class Image;

+    friend class Bitmap;

+    friend class Metafile;

+    friend class Font;

+    friend class FontFamily;

+    friend class FontCollection;

+    friend class CachedBitmap;

+

+    // Get a graphics context from an existing Win32 HDC or HWND

+    static Graphics* FromHDC(IN HDC hdc)

+    {

+        return new Graphics(hdc);

+    }

+

+    static Graphics* FromHDC(IN HDC hdc,

+                             IN HANDLE hdevice)

+    {

+        return new Graphics(hdc, hdevice);

+    }

+

+    static Graphics* FromHWND(IN HWND hwnd,

+                              IN BOOL icm = FALSE)

+    {

+        return new Graphics(hwnd, icm);

+    }

+

+    static Graphics* FromImage(IN Image *image)

+    {

+        return new Graphics(image);

+    }

+

+    Graphics(IN HDC hdc)

+    {

+        GpGraphics *graphics = NULL;

+

+        lastResult = DllExports::GdipCreateFromHDC(hdc, &graphics);

+

+        SetNativeGraphics(graphics);

+    }

+

+    Graphics(IN HDC hdc,

+             IN HANDLE hdevice)

+    {

+        GpGraphics *graphics = NULL;

+

+        lastResult = DllExports::GdipCreateFromHDC2(hdc, hdevice, &graphics);

+

+        SetNativeGraphics(graphics);

+    }

+

+    Graphics(IN HWND hwnd,

+             IN BOOL icm = FALSE)

+    {

+        GpGraphics *graphics = NULL;

+

+        if (icm)

+        {

+            lastResult = DllExports::GdipCreateFromHWNDICM(hwnd, &graphics);

+        }

+        else

+        {

+            lastResult = DllExports::GdipCreateFromHWND(hwnd, &graphics);

+        }

+

+        SetNativeGraphics(graphics);

+    }

+

+    Graphics(IN Image* image)

+    {

+        GpGraphics *graphics = NULL;

+

+        if (image != NULL)

+        {

+            lastResult = DllExports::GdipGetImageGraphicsContext(

+                                                                image->nativeImage, &graphics);

+        }

+        SetNativeGraphics(graphics);

+    }

+

+    ~Graphics()

+    {

+        DllExports::GdipDeleteGraphics(nativeGraphics);

+    }

+

+    VOID Flush(IN FlushIntention intention = FlushIntentionFlush)

+    {

+        DllExports::GdipFlush(nativeGraphics, intention);

+    }

+

+    //------------------------------------------------------------------------

+    // Interop methods

+    //------------------------------------------------------------------------

+

+    // Locks the graphics until ReleaseDC is called

+    HDC GetHDC()

+    {

+        HDC     hdc = NULL;

+

+        SetStatus(DllExports::GdipGetDC(nativeGraphics, &hdc));

+

+        return hdc;

+    }

+

+    VOID ReleaseHDC(IN HDC hdc)

+    {

+        SetStatus(DllExports::GdipReleaseDC(nativeGraphics, hdc));

+    }

+

+    //------------------------------------------------------------------------

+    // Rendering modes

+    //------------------------------------------------------------------------

+

+    Status SetRenderingOrigin(IN INT x, IN INT y)

+    {

+        return SetStatus(

+            DllExports::GdipSetRenderingOrigin(

+                nativeGraphics, x, y

+            )

+        );

+    }

+

+    Status GetRenderingOrigin(OUT INT *x, OUT INT *y) const

+    {

+        return SetStatus(

+            DllExports::GdipGetRenderingOrigin(

+                nativeGraphics, x, y

+            )

+        );

+    }

+

+    Status SetCompositingMode(IN CompositingMode compositingMode)

+    {

+        return SetStatus(DllExports::GdipSetCompositingMode(nativeGraphics,

+                                                            compositingMode));

+    }

+

+    CompositingMode GetCompositingMode() const

+    {

+        CompositingMode mode;

+

+        SetStatus(DllExports::GdipGetCompositingMode(nativeGraphics,

+                                                     &mode));

+

+        return mode;

+    }

+

+    Status SetCompositingQuality(IN CompositingQuality compositingQuality)

+    {

+        return SetStatus(DllExports::GdipSetCompositingQuality(

+            nativeGraphics,

+            compositingQuality));

+    }

+

+    CompositingQuality GetCompositingQuality() const

+    {

+        CompositingQuality quality;

+

+        SetStatus(DllExports::GdipGetCompositingQuality(

+            nativeGraphics,

+            &quality));

+

+        return quality;

+    }

+

+    Status SetTextRenderingHint(IN TextRenderingHint newMode)

+    {

+#ifndef DCR_USE_NEW_186764

+		/* temporarly set the high bit to warn that we are using the new definition for the flag */

+		newMode = (TextRenderingHint) (newMode | 0x0f000);

+#endif // DCR_USE_NEW_186764

+        return SetStatus(DllExports::GdipSetTextRenderingHint(nativeGraphics,

+                                                          newMode));

+    }

+

+    TextRenderingHint GetTextRenderingHint() const

+    {

+        TextRenderingHint hint;

+

+        SetStatus(DllExports::GdipGetTextRenderingHint(nativeGraphics,

+                                                   &hint));

+

+        return hint;

+    }

+

+#ifdef DCR_USE_NEW_188922

+    Status SetTextContrast(IN UINT contrast)

+    {

+        return SetStatus(DllExports::GdipSetTextContrast(nativeGraphics,

+                                                          contrast));

+    }

+

+    UINT GetTextContrast() const

+    {

+        UINT contrast;

+

+        SetStatus(DllExports::GdipGetTextContrast(nativeGraphics,

+                                                    &contrast));

+

+        return contrast;

+    }

+#else

+    Status SetTextGammaValue(IN UINT gammaValue)

+    {

+        return SetStatus(DllExports::GdipSetTextGammaValue(nativeGraphics,

+                                                          gammaValue));

+    }

+

+    UINT GetTextGammaValue() const

+    {

+        UINT gammaValue;

+

+        SetStatus(DllExports::GdipGetTextGammaValue(nativeGraphics,

+                                                    &gammaValue));

+

+        return gammaValue;

+    }

+

+#endif // DCR_USE_NEW_188922

+

+

+    InterpolationMode GetInterpolationMode() const

+    {

+        InterpolationMode mode = InterpolationModeInvalid;

+

+        SetStatus(DllExports::GdipGetInterpolationMode(nativeGraphics,

+                                                           &mode));

+

+        return mode;

+    }

+

+    Status SetInterpolationMode(IN InterpolationMode interpolationMode)

+    {

+        return SetStatus(DllExports::GdipSetInterpolationMode(nativeGraphics,

+                                                           interpolationMode));

+    }

+

+    SmoothingMode GetSmoothingMode() const

+    {

+        SmoothingMode smoothingMode = SmoothingModeInvalid;

+

+        SetStatus(DllExports::GdipGetSmoothingMode(nativeGraphics,

+                                                   &smoothingMode));

+

+        return smoothingMode;

+    }

+

+    Status SetSmoothingMode(IN SmoothingMode smoothingMode)

+    {

+        return SetStatus(DllExports::GdipSetSmoothingMode(nativeGraphics,

+                                                          smoothingMode));

+    }

+

+    PixelOffsetMode GetPixelOffsetMode() const

+    {

+        PixelOffsetMode pixelOffsetMode = PixelOffsetModeInvalid;

+

+        SetStatus(DllExports::GdipGetPixelOffsetMode(nativeGraphics,

+                                                     &pixelOffsetMode));

+

+        return pixelOffsetMode;

+    }

+

+    Status SetPixelOffsetMode(IN PixelOffsetMode pixelOffsetMode)

+    {

+        return SetStatus(DllExports::GdipSetPixelOffsetMode(nativeGraphics,

+                                                            pixelOffsetMode));

+    }

+

+    //------------------------------------------------------------------------

+    // Manipulate the current world transform

+    //------------------------------------------------------------------------

+

+    Status SetTransform(IN const Matrix* matrix)

+    {

+        return SetStatus(DllExports::GdipSetWorldTransform(nativeGraphics,

+                                                        matrix->nativeMatrix));

+    }

+    Status ResetTransform()

+    {

+        return SetStatus(DllExports::GdipResetWorldTransform(nativeGraphics));

+    }

+

+    Status MultiplyTransform(IN const Matrix* matrix,

+                             IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipMultiplyWorldTransform(nativeGraphics,

+                                                                matrix->nativeMatrix,

+                                                                order));

+    }

+

+    Status TranslateTransform(IN REAL dx,

+                              IN REAL dy,

+                              IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipTranslateWorldTransform(nativeGraphics,

+                                                               dx, dy, order));

+    }

+

+    Status ScaleTransform(IN REAL sx,

+                          IN REAL sy,

+                          IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipScaleWorldTransform(nativeGraphics,

+                                                             sx, sy, order));

+    }

+

+    Status RotateTransform(IN REAL angle,

+                           IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipRotateWorldTransform(nativeGraphics,

+                                                              angle, order));

+    }

+

+    /**

+     * Return the current world transform

+     */

+

+    Status GetTransform(OUT Matrix* matrix) const

+    {

+        return SetStatus(DllExports::GdipGetWorldTransform(nativeGraphics,

+                                                           matrix->nativeMatrix));

+    }

+

+    /**

+     * Manipulate the current page transform

+     */

+

+    Status SetPageUnit(IN Unit unit)

+    {

+        return SetStatus(DllExports::GdipSetPageUnit(nativeGraphics,

+                                                     unit));

+    }

+

+    Status SetPageScale(IN REAL scale)

+    {

+        return SetStatus(DllExports::GdipSetPageScale(nativeGraphics,

+                                                      scale));

+    }

+

+    /**

+     * Retrieve the current page transform information

+     * notes @ these are atomic

+     */

+    Unit GetPageUnit() const

+    {

+        Unit unit;

+

+        SetStatus(DllExports::GdipGetPageUnit(nativeGraphics, &unit));

+

+        return unit;

+    }

+

+    REAL GetPageScale() const

+    {

+        REAL scale;

+

+        SetStatus(DllExports::GdipGetPageScale(nativeGraphics, &scale));

+

+        return scale;

+    }

+

+    REAL GetDpiX() const

+    {

+        REAL dpi;

+

+        SetStatus(DllExports::GdipGetDpiX(nativeGraphics, &dpi));

+

+        return dpi;

+    }

+

+    REAL GetDpiY() const

+    {

+        REAL dpi;

+

+        SetStatus(DllExports::GdipGetDpiY(nativeGraphics, &dpi));

+

+        return dpi;

+    }

+

+    /**

+     * Transform points in the current graphics context

+     */

+    // float version

+    Status TransformPoints(IN CoordinateSpace destSpace,

+                           IN CoordinateSpace srcSpace,

+                           IN OUT PointF* pts,

+                           IN INT count) const

+    {

+        return SetStatus(DllExports::GdipTransformPoints(nativeGraphics,

+                                                         destSpace,

+                                                         srcSpace,

+                                                         pts,

+                                                         count));

+    }

+

+    // integer version

+    Status TransformPoints(IN CoordinateSpace destSpace,

+                           IN CoordinateSpace srcSpace,

+                           IN OUT Point* pts,

+                           IN INT count) const

+    {

+

+        return SetStatus(DllExports::GdipTransformPointsI(nativeGraphics,

+                                                          destSpace,

+                                                          srcSpace,

+                                                          pts,

+                                                          count));

+    }

+

+    //------------------------------------------------------------------------

+    // GetNearestColor (for <= 8bpp surfaces)

+    // Note: alpha is ignored

+    //------------------------------------------------------------------------

+    Status GetNearestColor(IN OUT Color* color) const

+    {

+        if (color == NULL)

+        {

+            return SetStatus(InvalidParameter);

+        }

+

+        ARGB argb = color->GetValue();

+

+        Status status = SetStatus(DllExports::GdipGetNearestColor(nativeGraphics, &argb));

+

+        color->SetValue(argb);

+

+        return status;

+    }

+

+    /**

+     * Vector drawing methods

+     *

+     * @notes Do we need a set of methods that take

+     *  integer coordinate parameters?

+     */

+

+    // float version

+    Status DrawLine(IN const Pen* pen,

+                    IN REAL x1,

+                    IN REAL y1,

+                    IN REAL x2,

+                    IN REAL y2)

+    {

+        return SetStatus(DllExports::GdipDrawLine(nativeGraphics,

+                                                  pen->nativePen, x1, y1, x2,

+                                                  y2));

+    }

+

+    Status DrawLine(IN const Pen* pen,

+                    IN const PointF& pt1,

+                    IN const PointF& pt2)

+    {

+        return DrawLine(pen, pt1.X, pt1.Y, pt2.X, pt2.Y);

+    }

+

+    Status DrawLines(IN const Pen* pen,

+                     IN const PointF* points,

+                     IN INT count)

+    {

+        return SetStatus(DllExports::GdipDrawLines(nativeGraphics,

+                                                   pen->nativePen,

+                                                   points, count));

+    }

+

+    // int version

+    Status DrawLine(IN const Pen* pen,

+                    IN INT x1,

+                    IN INT y1,

+                    IN INT x2,

+                    IN INT y2)

+    {

+        return SetStatus(DllExports::GdipDrawLineI(nativeGraphics,

+                                                   pen->nativePen,

+                                                   x1,

+                                                   y1,

+                                                   x2,

+                                                   y2));

+    }

+

+    Status DrawLine(IN const Pen* pen,

+                    IN const Point& pt1,

+                    IN const Point& pt2)

+    {

+        return DrawLine(pen,

+                        pt1.X,

+                        pt1.Y,

+                        pt2.X,

+                        pt2.Y);

+    }

+

+    Status DrawLines(IN const Pen* pen,

+                     IN const Point* points,

+                     IN INT count)

+    {

+        return SetStatus(DllExports::GdipDrawLinesI(nativeGraphics,

+                                                    pen->nativePen,

+                                                    points,

+                                                    count));

+    }

+

+    // float version

+    Status DrawArc(IN const Pen* pen,

+                   IN REAL x,

+                   IN REAL y,

+                   IN REAL width,

+                   IN REAL height,

+                   IN REAL startAngle,

+                   IN REAL sweepAngle)

+    {

+        return SetStatus(DllExports::GdipDrawArc(nativeGraphics,

+                                                 pen->nativePen,

+                                                 x,

+                                                 y,

+                                                 width,

+                                                 height,

+                                                 startAngle,

+                                                 sweepAngle));

+    }

+

+    Status DrawArc(IN const Pen* pen,

+                   IN const RectF& rect,

+                   IN REAL startAngle,

+                   IN REAL sweepAngle)

+    {

+        return DrawArc(pen, rect.X, rect.Y, rect.Width, rect.Height,

+                       startAngle, sweepAngle);

+    }

+

+    // int version

+    Status DrawArc(IN const Pen* pen,

+                   IN INT x,

+                   IN INT y,

+                   IN INT width,

+                   IN INT height,

+                   IN REAL startAngle,

+                   IN REAL sweepAngle)

+    {

+        return SetStatus(DllExports::GdipDrawArcI(nativeGraphics,

+                                                  pen->nativePen,

+                                                  x,

+                                                  y,

+                                                  width,

+                                                  height,

+                                                  startAngle,

+                                                  sweepAngle));

+    }

+

+

+    Status DrawArc(IN const Pen* pen,

+                   IN const Rect& rect,

+                   IN REAL startAngle,

+                   IN REAL sweepAngle)

+    {

+        return DrawArc(pen,

+                       rect.X,

+                       rect.Y,

+                       rect.Width,

+                       rect.Height,

+                       startAngle,

+                       sweepAngle);

+    }

+

+    // float version

+    Status DrawBezier(IN const Pen* pen,

+                      IN REAL x1,

+                      IN REAL y1,

+                      IN REAL x2,

+                      IN REAL y2,

+                      IN REAL x3,

+                      IN REAL y3,

+                      IN REAL x4,

+                      IN REAL y4)

+    {

+        return SetStatus(DllExports::GdipDrawBezier(nativeGraphics,

+                                                    pen->nativePen, x1, y1,

+                                                    x2, y2, x3, y3, x4, y4));

+    }

+

+    Status DrawBezier(IN const Pen* pen,

+                      IN const PointF& pt1,

+                      IN const PointF& pt2,

+                      IN const PointF& pt3,

+                      IN const PointF& pt4)

+    {

+        return DrawBezier(pen,

+                          pt1.X,

+                          pt1.Y,

+                          pt2.X,

+                          pt2.Y,

+                          pt3.X,

+                          pt3.Y,

+                          pt4.X,

+                          pt4.Y);

+    }

+

+    Status DrawBeziers(IN const Pen* pen,

+                       IN const PointF* points,

+                       IN INT count)

+    {

+        return SetStatus(DllExports::GdipDrawBeziers(nativeGraphics,

+                                                     pen->nativePen,

+                                                     points,

+                                                     count));

+    }

+

+    // int version

+    Status DrawBezier(IN const Pen* pen,

+                      IN INT x1,

+                      IN INT y1,

+                      IN INT x2,

+                      IN INT y2,

+                      IN INT x3,

+                      IN INT y3,

+                      IN INT x4,

+                      IN INT y4)

+    {

+        return SetStatus(DllExports::GdipDrawBezierI(nativeGraphics,

+                                                     pen->nativePen,

+                                                     x1,

+                                                     y1,

+                                                     x2,

+                                                     y2,

+                                                     x3,

+                                                     y3,

+                                                     x4,

+                                                     y4));

+    }

+

+    Status DrawBezier(IN const Pen* pen,

+                      IN const Point& pt1,

+                      IN const Point& pt2,

+                      IN const Point& pt3,

+                      IN const Point& pt4)

+    {

+        return DrawBezier(pen,

+                          pt1.X,

+                          pt1.Y,

+                          pt2.X,

+                          pt2.Y,

+                          pt3.X,

+                          pt3.Y,

+                          pt4.X,

+                          pt4.Y);

+    }

+

+    Status DrawBeziers(IN const Pen* pen,

+                       IN const Point* points,

+                       IN INT count)

+    {

+        return SetStatus(DllExports::GdipDrawBeziersI(nativeGraphics,

+                                                      pen->nativePen,

+                                                      points,

+                                                      count));

+    }

+

+    // float version

+    Status DrawRectangle(IN const Pen* pen,

+                         IN const RectF& rect)

+    {

+        return DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height);

+    }

+

+    Status DrawRectangle(IN const Pen* pen,

+                         IN REAL x,

+                         IN REAL y,

+                         IN REAL width,

+                         IN REAL height)

+    {

+        return SetStatus(DllExports::GdipDrawRectangle(nativeGraphics,

+                                                       pen->nativePen, x, y,

+                                                       width, height));

+    }

+

+    Status DrawRectangles(IN const Pen* pen,

+                          IN const RectF* rects,

+                          IN INT count)

+    {

+        return SetStatus(DllExports::GdipDrawRectangles(nativeGraphics,

+                                                        pen->nativePen,

+                                                        rects, count));

+    }

+

+    // integer version

+    Status DrawRectangle(IN const Pen* pen,

+                         IN const Rect& rect)

+    {

+        return DrawRectangle(pen,

+                             rect.X,

+                             rect.Y,

+                             rect.Width,

+                             rect.Height);

+    }

+

+    Status DrawRectangle(IN const Pen* pen,

+                         IN INT x,

+                         IN INT y,

+                         IN INT width,

+                         IN INT height)

+    {

+        return SetStatus(DllExports::GdipDrawRectangleI(nativeGraphics,

+                                                        pen->nativePen,

+                                                        x,

+                                                        y,

+                                                        width,

+                                                        height));

+    }

+

+    Status DrawRectangles(IN const Pen* pen,

+                          IN const Rect* rects,

+                          IN INT count)

+    {

+        return SetStatus(DllExports::GdipDrawRectanglesI(nativeGraphics,

+                                                         pen->nativePen,

+                                                         rects,

+                                                         count));

+    }

+

+    // float version

+    Status DrawEllipse(IN const Pen* pen,

+                       IN const RectF& rect)

+    {

+        return DrawEllipse(pen, rect.X, rect.Y, rect.Width, rect.Height);

+    }

+

+    Status DrawEllipse(IN const Pen* pen,

+                       IN REAL x,

+                       IN REAL y,

+                       IN REAL width,

+                       IN REAL height)

+    {

+        return SetStatus(DllExports::GdipDrawEllipse(nativeGraphics,

+                                                     pen->nativePen,

+                                                     x,

+                                                     y,

+                                                     width,

+                                                     height));

+    }

+

+    // integer version

+    Status DrawEllipse(IN const Pen* pen,

+                       IN const Rect& rect)

+    {

+        return DrawEllipse(pen,

+                           rect.X,

+                           rect.Y,

+                           rect.Width,

+                           rect.Height);

+    }

+

+    Status DrawEllipse(IN const Pen* pen,

+                       IN INT x,

+                       IN INT y,

+                       IN INT width,

+                       IN INT height)

+    {

+        return SetStatus(DllExports::GdipDrawEllipseI(nativeGraphics,

+                                                      pen->nativePen,

+                                                      x,

+                                                      y,

+                                                      width,

+                                                      height));

+    }

+

+    // floating point version

+    Status DrawPie(IN const Pen* pen,

+                   IN const RectF& rect,

+                   IN REAL startAngle,

+                   IN REAL sweepAngle)

+    {

+        return DrawPie(pen,

+                       rect.X,

+                       rect.Y,

+                       rect.Width,

+                       rect.Height,

+                       startAngle,

+                       sweepAngle);

+    }

+

+    Status DrawPie(IN const Pen* pen,

+                   IN REAL x,

+                   IN REAL y,

+                   IN REAL width,

+                   IN REAL height,

+                   IN REAL startAngle,

+                   IN REAL sweepAngle)

+    {

+        return SetStatus(DllExports::GdipDrawPie(nativeGraphics,

+                                                 pen->nativePen,

+                                                 x,

+                                                 y,

+                                                 width,

+                                                 height,

+                                                 startAngle,

+                                                 sweepAngle));

+    }

+

+    // integer point version

+    Status DrawPie(IN const Pen* pen,

+                   IN const Rect& rect,

+                   IN REAL startAngle,

+                   IN REAL sweepAngle)

+    {

+        return DrawPie(pen,

+                       rect.X,

+                       rect.Y,

+                       rect.Width,

+                       rect.Height,

+                       startAngle,

+                       sweepAngle);

+    }

+

+    Status DrawPie(IN const Pen* pen,

+                   IN INT x,

+                   IN INT y,

+                   IN INT width,

+                   IN INT height,

+                   IN REAL startAngle,

+                   IN REAL sweepAngle)

+    {

+        return SetStatus(DllExports::GdipDrawPieI(nativeGraphics,

+                                                  pen->nativePen,

+                                                  x,

+                                                  y,

+                                                  width,

+                                                  height,

+                                                  startAngle,

+                                                  sweepAngle));

+    }

+

+    // float version

+    Status DrawPolygon(IN const Pen* pen,

+                       IN const PointF* points,

+                       IN INT count)

+    {

+        return SetStatus(DllExports::GdipDrawPolygon(nativeGraphics,

+                                                     pen->nativePen,

+                                                     points,

+                                                     count));

+    }

+

+    // integer version

+    Status DrawPolygon(IN const Pen* pen,

+                       IN const Point* points,

+                       IN INT count)

+    {

+        return SetStatus(DllExports::GdipDrawPolygonI(nativeGraphics,

+                                                      pen->nativePen,

+                                                      points,

+                                                      count));

+    }

+

+    // float version

+    Status DrawPath(IN const Pen* pen,

+                    IN const GraphicsPath* path)

+    {

+        return SetStatus(DllExports::GdipDrawPath(nativeGraphics,

+                                                  pen ? pen->nativePen : NULL,

+                                                  path ? path->nativePath : NULL));

+    }

+

+    // float version

+    Status DrawCurve(IN const Pen* pen,

+                     IN const PointF* points,

+                     IN INT count)

+    {

+        return SetStatus(DllExports::GdipDrawCurve(nativeGraphics,

+                                                   pen->nativePen, points,

+                                                   count));

+    }

+

+    Status DrawCurve(IN const Pen* pen,

+                     IN const PointF* points,

+                     IN INT count,

+                     IN REAL tension)

+    {

+        return SetStatus(DllExports::GdipDrawCurve2(nativeGraphics,

+                                                    pen->nativePen, points,

+                                                    count, tension));

+    }

+

+    Status DrawCurve(IN const Pen* pen,

+                     IN const PointF* points,

+                     IN INT count,

+                     IN INT offset,

+                     IN INT numberOfSegments,

+                     IN REAL tension = 0.5f)

+    {

+        return SetStatus(DllExports::GdipDrawCurve3(nativeGraphics,

+                                                    pen->nativePen, points,

+                                                    count, offset,

+                                                    numberOfSegments, tension));

+    }

+

+    // integer version

+    Status DrawCurve(IN const Pen* pen,

+                     IN const Point* points,

+                     IN INT count)

+    {

+        return SetStatus(DllExports::GdipDrawCurveI(nativeGraphics,

+                                                    pen->nativePen,

+                                                    points,

+                                                    count));

+    }

+

+    Status DrawCurve(IN const Pen* pen,

+                     IN const Point* points,

+                     IN INT count,

+                     IN REAL tension)

+    {

+        return SetStatus(DllExports::GdipDrawCurve2I(nativeGraphics,

+                                                     pen->nativePen,

+                                                     points,

+                                                     count,

+                                                     tension));

+    }

+

+    Status DrawCurve(IN const Pen* pen,

+                     IN const Point* points,

+                     IN INT count,

+                     IN INT offset,

+                     IN INT numberOfSegments,

+                     IN REAL tension = 0.5f)

+    {

+        return SetStatus(DllExports::GdipDrawCurve3I(nativeGraphics,

+                                                     pen->nativePen,

+                                                     points,

+                                                     count,

+                                                     offset,

+                                                     numberOfSegments,

+                                                     tension));

+    }

+

+    // float version

+    Status DrawClosedCurve(IN const Pen* pen,

+                           IN const PointF* points,

+                           IN INT count)

+    {

+        return SetStatus(DllExports::GdipDrawClosedCurve(nativeGraphics,

+                                                         pen->nativePen,

+                                                         points, count));

+    }

+

+    Status DrawClosedCurve(IN const Pen *pen,

+                           IN const PointF* points,

+                           IN INT count,

+                           IN REAL tension)

+    {

+        return SetStatus(DllExports::GdipDrawClosedCurve2(nativeGraphics,

+                                                          pen->nativePen,

+                                                          points, count,

+                                                          tension));

+    }

+

+    // integer version

+    Status DrawClosedCurve(IN const Pen* pen,

+                           IN const Point* points,

+                           IN INT count)

+    {

+        return SetStatus(DllExports::GdipDrawClosedCurveI(nativeGraphics,

+                                                          pen->nativePen,

+                                                          points,

+                                                          count));

+    }

+

+    Status DrawClosedCurve(IN const Pen *pen,

+                           IN const Point* points,

+                           IN INT count,

+                           IN REAL tension)

+    {

+        return SetStatus(DllExports::GdipDrawClosedCurve2I(nativeGraphics,

+                                                           pen->nativePen,

+                                                           points,

+                                                           count,

+                                                           tension));

+    }

+

+    Status Clear(IN const Color &color)

+    {

+        return SetStatus(DllExports::GdipGraphicsClear(

+            nativeGraphics,

+            color.GetValue()));

+    }

+

+    // float version

+    Status FillRectangle(IN const Brush* brush,

+                         IN const RectF& rect)

+    {

+        return FillRectangle(brush, rect.X, rect.Y, rect.Width, rect.Height);

+    }

+

+    Status FillRectangle(IN const Brush* brush,

+                         IN REAL x,

+                         IN REAL y,

+                         IN REAL width,

+                         IN REAL height)

+    {

+        return SetStatus(DllExports::GdipFillRectangle(nativeGraphics,

+                                                       brush->nativeBrush, x, y,

+                                                       width, height));

+    }

+

+    Status FillRectangles(IN const Brush* brush,

+                          IN const RectF* rects,

+                          IN INT count)

+    {

+        return SetStatus(DllExports::GdipFillRectangles(nativeGraphics,

+                                                        brush->nativeBrush,

+                                                        rects, count));

+    }

+

+    // integer version

+    Status FillRectangle(IN const Brush* brush,

+                         IN const Rect& rect)

+    {

+        return FillRectangle(brush,

+                             rect.X,

+                             rect.Y,

+                             rect.Width,

+                             rect.Height);

+    }

+

+    Status FillRectangle(IN const Brush* brush,

+                         IN INT x,

+                         IN INT y,

+                         IN INT width,

+                         IN INT height)

+    {

+        return SetStatus(DllExports::GdipFillRectangleI(nativeGraphics,

+                                                        brush->nativeBrush,

+                                                        x,

+                                                        y,

+                                                        width,

+                                                        height));

+    }

+

+    Status FillRectangles(IN const Brush* brush,

+                          IN const Rect* rects,

+                          IN INT count)

+    {

+        return SetStatus(DllExports::GdipFillRectanglesI(nativeGraphics,

+                                                         brush->nativeBrush,

+                                                         rects,

+                                                         count));

+    }

+

+    // float version

+    Status FillPolygon(IN const Brush* brush,

+                       IN const PointF* points,

+                       IN INT count)

+    {

+        return FillPolygon(brush, points, count, FillModeAlternate);

+    }

+

+    Status FillPolygon(IN const Brush* brush,

+                       IN const PointF* points,

+                       IN INT count,

+                       IN FillMode fillMode)

+    {

+        return SetStatus(DllExports::GdipFillPolygon(nativeGraphics,

+                                                     brush->nativeBrush,

+                                                     points, count, fillMode));

+    }

+

+    // integer version

+    Status FillPolygon(IN const Brush* brush,

+                       IN const Point* points,

+                       IN INT count)

+    {

+        return FillPolygon(brush, points, count, FillModeAlternate);

+    }

+

+    Status FillPolygon(IN const Brush* brush,

+                       IN const Point* points,

+                       IN INT count,

+                       IN FillMode fillMode)

+    {

+        return SetStatus(DllExports::GdipFillPolygonI(nativeGraphics,

+                                                      brush->nativeBrush,

+                                                      points, count,

+                                                      fillMode));

+    }

+

+    // float version

+    Status FillEllipse(IN const Brush* brush,

+                       IN const RectF& rect)

+    {

+        return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);

+    }

+

+    Status FillEllipse(IN const Brush* brush,

+                       IN REAL x,

+                       IN REAL y,

+                       IN REAL width,

+                       IN REAL height)

+    {

+        return SetStatus(DllExports::GdipFillEllipse(nativeGraphics,

+                                                     brush->nativeBrush, x, y,

+                                                     width, height));

+    }

+

+    // integer version

+    Status FillEllipse(IN const Brush* brush,

+                       IN const Rect& rect)

+    {

+        return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);

+    }

+

+    Status FillEllipse(IN const Brush* brush,

+                       IN INT x,

+                       IN INT y,

+                       IN INT width,

+                       IN INT height)

+    {

+        return SetStatus(DllExports::GdipFillEllipseI(nativeGraphics,

+                                                      brush->nativeBrush,

+                                                      x,

+                                                      y,

+                                                      width,

+                                                      height));

+    }

+

+    // float version

+    Status FillPie(IN const Brush* brush,

+                   IN const RectF& rect,

+                   IN REAL startAngle,

+                   IN REAL sweepAngle)

+    {

+        return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,

+                       startAngle, sweepAngle);

+    }

+

+    Status FillPie(IN const Brush* brush,

+                   IN REAL x,

+                   IN REAL y,

+                   IN REAL width,

+                   IN REAL height,

+                   IN REAL startAngle,

+                   IN REAL sweepAngle)

+    {

+        return SetStatus(DllExports::GdipFillPie(nativeGraphics,

+                                                 brush->nativeBrush, x, y,

+                                                 width, height, startAngle,

+                                                 sweepAngle));

+    }

+

+    // integer version

+    Status FillPie(IN const Brush* brush,

+                   IN const Rect& rect,

+                   IN REAL startAngle,

+                   IN REAL sweepAngle)

+    {

+        return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,

+                       startAngle, sweepAngle);

+    }

+

+    Status FillPie(IN const Brush* brush,

+                   IN INT x,

+                   IN INT y,

+                   IN INT width,

+                   IN INT height,

+                   IN REAL startAngle,

+                   IN REAL sweepAngle)

+    {

+        return SetStatus(DllExports::GdipFillPieI(nativeGraphics,

+                                                  brush->nativeBrush,

+                                                  x,

+                                                  y,

+                                                  width,

+                                                  height,

+                                                  startAngle,

+                                                  sweepAngle));

+    }

+

+    Status FillPath(IN const Brush* brush,

+                    IN const GraphicsPath* path)

+    {

+        return SetStatus(DllExports::GdipFillPath(nativeGraphics,

+                                                  brush->nativeBrush,

+                                                  path->nativePath));

+    }

+

+    // float version

+    Status FillClosedCurve(IN const Brush* brush,

+                           IN const PointF* points,

+                           IN INT count)

+    {

+        return SetStatus(DllExports::GdipFillClosedCurve(nativeGraphics,

+                                                         brush->nativeBrush,

+                                                         points, count));

+

+    }

+

+    Status FillClosedCurve(IN const Brush* brush,

+                           IN const PointF* points,

+                           IN INT count,

+                           IN FillMode fillMode,

+                           IN REAL tension = 0.5f)

+    {

+        return SetStatus(DllExports::GdipFillClosedCurve2(nativeGraphics,

+                                                          brush->nativeBrush,

+                                                          points, count,

+                                                          tension, fillMode));

+    }

+

+    // integer version

+    Status FillClosedCurve(IN const Brush* brush,

+                           IN const Point* points,

+                           IN INT count)

+    {

+        return SetStatus(DllExports::GdipFillClosedCurveI(nativeGraphics,

+                                                          brush->nativeBrush,

+                                                          points,

+                                                          count));

+    }

+

+    Status FillClosedCurve(IN const Brush* brush,

+                           IN const Point* points,

+                           IN INT count,

+                           IN FillMode fillMode,

+                           IN REAL tension = 0.5f)

+    {

+        return SetStatus(DllExports::GdipFillClosedCurve2I(nativeGraphics,

+                                                           brush->nativeBrush,

+                                                           points, count,

+                                                           tension, fillMode));

+    }

+

+    // float version

+    Status FillRegion(IN const Brush* brush,

+                      IN const Region* region)

+    {

+        return SetStatus(DllExports::GdipFillRegion(nativeGraphics,

+                                                    brush->nativeBrush,

+                                                    region->nativeRegion));

+    }

+

+    // DrawString and MeasureString

+    Status

+    DrawString(

+        IN const WCHAR        *string,

+        IN INT                 length,

+        IN const Font         *font,

+        IN const RectF        &layoutRect,

+        IN const StringFormat *stringFormat,

+        IN const Brush        *brush

+    )

+    {

+        return SetStatus(DllExports::GdipDrawString(

+            nativeGraphics,

+            string,

+            length,

+            font ? font->nativeFont : NULL,

+            &layoutRect,

+            stringFormat ? stringFormat->nativeFormat : NULL,

+            brush ? brush->nativeBrush : NULL

+        ));

+    }

+

+    Status

+    DrawString(

+        const WCHAR        *string,

+        INT                 length,

+        const Font         *font,

+        const PointF       &origin,

+        const Brush        *brush

+    )

+    {

+        RectF rect(origin.X, origin.Y, 0.0f, 0.0f);

+

+        return SetStatus(DllExports::GdipDrawString(

+            nativeGraphics,

+            string,

+            length,

+            font ? font->nativeFont : NULL,

+            &rect,

+            NULL,

+            brush ? brush->nativeBrush : NULL

+        ));

+    }

+

+    Status

+    DrawString(

+        const WCHAR        *string,

+        INT                 length,

+        const Font         *font,

+        const PointF       &origin,

+        const StringFormat *stringFormat,

+        const Brush        *brush

+    )

+    {

+        RectF rect(origin.X, origin.Y, 0.0f, 0.0f);

+

+        return SetStatus(DllExports::GdipDrawString(

+            nativeGraphics,

+            string,

+            length,

+            font ? font->nativeFont : NULL,

+            &rect,

+            stringFormat ? stringFormat->nativeFormat : NULL,

+            brush ? brush->nativeBrush : NULL

+        ));

+    }

+

+    Status

+    MeasureString(

+        IN const WCHAR        *string,

+        IN INT                 length,

+        IN const Font         *font,

+        IN const RectF        &layoutRect,

+        IN const StringFormat *stringFormat,

+        OUT RectF             *boundingBox,

+        OUT INT               *codepointsFitted = 0,

+        OUT INT               *linesFilled      = 0

+    ) const

+    {

+        return SetStatus(DllExports::GdipMeasureString(

+            nativeGraphics,

+            string,

+            length,

+            font ? font->nativeFont : NULL,

+            &layoutRect,

+            stringFormat ? stringFormat->nativeFormat : NULL,

+            boundingBox,

+            codepointsFitted,

+            linesFilled

+        ));

+    }

+

+    Status

+    MeasureString(

+        IN const WCHAR        *string,

+        IN INT                 length,

+        IN const Font         *font,

+        IN const SizeF        &layoutRectSize,

+        IN const StringFormat *stringFormat,

+        OUT SizeF             *size,

+        OUT INT               *codepointsFitted = 0,

+        OUT INT               *linesFilled      = 0

+    ) const

+    {

+        RectF   layoutRect(0, 0, layoutRectSize.Width, layoutRectSize.Height);

+        RectF   boundingBox;

+        Status  status;

+

+        if (size == NULL)

+        {

+            return SetStatus(InvalidParameter);

+        }

+

+        status = SetStatus(DllExports::GdipMeasureString(

+            nativeGraphics,

+            string,

+            length,

+            font ? font->nativeFont : NULL,

+            &layoutRect,

+            stringFormat ? stringFormat->nativeFormat : NULL,

+            size ? &boundingBox : NULL,

+            codepointsFitted,

+            linesFilled

+        ));

+

+        if (size && status == Ok)

+        {

+            size->Width  = boundingBox.Width;

+            size->Height = boundingBox.Height;

+        }

+

+        return status;

+    }

+

+    Status

+    MeasureString(

+        IN const WCHAR        *string,

+        IN INT                 length,

+        IN const Font         *font,

+        IN const PointF       &origin,

+        IN const StringFormat *stringFormat,

+        OUT RectF             *boundingBox

+    ) const

+    {

+        RectF rect(origin.X, origin.Y, 0.0f, 0.0f);

+

+        return SetStatus(DllExports::GdipMeasureString(

+            nativeGraphics,

+            string,

+            length,

+            font ? font->nativeFont : NULL,

+            &rect,

+            stringFormat ? stringFormat->nativeFormat : NULL,

+            boundingBox,

+            NULL,

+            NULL

+        ));

+    }

+

+

+    Status

+    MeasureString(

+        IN const WCHAR  *string,

+        IN INT           length,

+        IN const Font   *font,

+        IN const RectF  &layoutRect,

+        OUT RectF       *boundingBox

+    ) const

+    {

+        return SetStatus(DllExports::GdipMeasureString(

+            nativeGraphics,

+            string,

+            length,

+            font ? font->nativeFont : NULL,

+            &layoutRect,

+            NULL,

+            boundingBox,

+            NULL,

+            NULL

+        ));

+    }

+

+    Status

+    MeasureString(

+        IN const WCHAR  *string,

+        IN INT           length,

+        IN const Font   *font,

+        IN const PointF &origin,

+        OUT RectF       *boundingBox

+    ) const

+    {

+        RectF rect(origin.X, origin.Y, 0.0f, 0.0f);

+

+        return SetStatus(DllExports::GdipMeasureString(

+            nativeGraphics,

+            string,

+            length,

+            font ? font->nativeFont : NULL,

+            &rect,

+            NULL,

+            boundingBox,

+            NULL,

+            NULL

+        ));

+    }

+

+

+#ifdef DCR_USE_NEW_174340

+    Status

+    MeasureCharacterRanges(

+        IN const WCHAR        *string,

+        IN INT                 length,

+        IN const Font         *font,

+        IN const RectF        &layoutRect,

+        IN const StringFormat *stringFormat,

+        IN INT                 regionCount,

+        OUT Region            *regions

+    ) const

+    {

+        if (!regions || regionCount <= 0)

+        {

+            return InvalidParameter;

+        }

+

+        GpRegion **nativeRegions = new GpRegion* [regionCount];

+

+        if (!nativeRegions)

+        {

+            return OutOfMemory;

+        }

+

+        for (INT i = 0; i < regionCount; i++)

+        {

+            nativeRegions[i] = regions[i].nativeRegion;

+        }

+

+        Status status = SetStatus(DllExports::GdipMeasureCharacterRanges(

+            nativeGraphics,

+            string,

+            length,

+            font ? font->nativeFont : NULL,

+            layoutRect,

+            stringFormat ? stringFormat->nativeFormat : NULL,

+            regionCount,

+            nativeRegions

+        ));

+

+        delete [] nativeRegions;

+

+        return status;

+    }

+#endif

+

+

+#ifndef DCR_USE_NEW_174340

+    Status

+    MeasureStringRegion(

+        IN const WCHAR        *string,

+        IN INT                 length,

+        IN const Font         *font,

+        IN const RectF        &layoutRect,

+        IN const StringFormat *stringFormat,

+        IN INT                 firstCharacterIndex,

+        IN INT                 characterCount,

+        OUT Region            *region

+    ) const

+    {

+        if (region == NULL)

+        {

+            return SetStatus(InvalidParameter);

+        }

+

+        return (SetStatus(DllExports::GdipMeasureStringRegion(

+            nativeGraphics,

+            string,

+            length,

+            font ? font->nativeFont : NULL,

+            layoutRect,

+            stringFormat ? stringFormat->nativeFormat : NULL,

+            firstCharacterIndex,

+            characterCount,

+            region->nativeRegion)));

+    }

+#endif

+

+    Status DrawDriverString(

+        IN const UINT16  *text,

+        IN INT            length,

+        IN const Font    *font,

+        IN const Brush   *brush,

+        IN const PointF  *positions,

+        IN INT            flags,

+        IN const Matrix        *matrix

+    )

+    {

+        return SetStatus(DllExports::GdipDrawDriverString(

+            nativeGraphics,

+            text,

+            length,

+            font ? font->nativeFont : NULL,

+            brush ? brush->nativeBrush : NULL,

+            positions,

+            flags,

+            matrix ? matrix->nativeMatrix : NULL

+        ));

+    }

+

+    Status MeasureDriverString(

+        IN const UINT16  *text,

+        IN INT            length,

+        IN const Font    *font,

+        IN const PointF  *positions,

+        IN INT            flags,

+        IN const Matrix        *matrix,

+        OUT RectF        *boundingBox

+    ) const

+    {

+        return SetStatus(DllExports::GdipMeasureDriverString(

+            nativeGraphics,

+            text,

+            length,

+            font ? font->nativeFont : NULL,

+            positions,

+            flags,

+            matrix ? matrix->nativeMatrix : NULL,

+            boundingBox

+        ));

+    }

+

+#ifndef DCR_USE_NEW_168772

+    Status DriverStringPointToCodepoint(

+        IN const UINT16  *text,

+        IN INT            length,

+        IN const Font    *font,

+        IN const PointF  *positions,

+        IN INT            flags,

+        IN const Matrix  *matrix,

+        IN const PointF  &hit,

+        OUT INT          *index,

+        OUT BOOL         *rightEdge,

+        OUT REAL         *distance

+    )

+    {

+        return SetStatus(DllExports::GdipDriverStringPointToCodepoint(

+            nativeGraphics,

+            text,

+            length,

+            font ? font->nativeFont : NULL,

+            positions,

+            flags,

+            matrix ? matrix->nativeMatrix : NULL,

+            &hit,

+            index,

+            rightEdge,

+            distance

+        ));

+    }

+#endif

+

+    // Draw a cached bitmap on this graphics destination offset by

+    // x, y. Note this will fail with WrongState if the CachedBitmap

+    // native format differs from this Graphics.

+

+    Status DrawCachedBitmap(IN CachedBitmap *cb,

+                            IN INT x,

+                            IN INT y)

+    {

+        return SetStatus(DllExports::GdipDrawCachedBitmap(

+            nativeGraphics,

+            cb->nativeCachedBitmap,

+            x, y

+        ));

+    }

+

+    /**

+     * Draw images (both bitmap and vector)

+     */

+    // float version

+    Status DrawImage(IN Image* image,

+                     IN const PointF& point)

+    {

+        return DrawImage(image, point.X, point.Y);

+    }

+

+    Status DrawImage(IN Image* image,

+                     IN REAL x,

+                     IN REAL y)

+    {

+        return SetStatus(DllExports::GdipDrawImage(nativeGraphics,

+                                                   image ? image->nativeImage

+                                                         : NULL,

+                                                   x,

+                                                   y));

+    }

+

+    Status DrawImage(IN Image* image, 

+                     IN const RectF& rect)

+    {

+        return DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);

+    }

+

+    Status DrawImage(IN Image* image,

+                     IN REAL x,

+                     IN REAL y,

+                     IN REAL width,

+                     IN REAL height)

+    {

+        return SetStatus(DllExports::GdipDrawImageRect(nativeGraphics,

+                                                       image ? image->nativeImage

+                                                             : NULL,

+                                                       x,

+                                                       y,

+                                                       width,

+                                                       height));

+    }

+

+    // integer version

+    Status DrawImage(IN Image* image,

+                     IN const Point& point)

+    {

+        return DrawImage(image, point.X, point.Y);

+    }

+

+    Status DrawImage(IN Image* image,

+                     IN INT x,

+                     IN INT y)

+    {

+        return SetStatus(DllExports::GdipDrawImageI(nativeGraphics,

+                                                    image ? image->nativeImage

+                                                          : NULL,

+                                                    x,

+                                                    y));

+    }

+

+    Status DrawImage(IN Image* image,

+                     IN const Rect& rect)

+    {

+        return DrawImage(image,

+                         rect.X,

+                         rect.Y,

+                         rect.Width,

+                         rect.Height);

+    }

+

+    Status DrawImage(IN Image* image,

+                     IN INT x,

+                     IN INT y,

+                     IN INT width,

+                     IN INT height) {

+        return SetStatus(DllExports::GdipDrawImageRectI(nativeGraphics,

+                                                        image ? image->nativeImage

+                                                              : NULL,

+                                                        x,

+                                                        y,

+                                                        width,

+                                                        height));

+    }

+

+    /**

+     * Affine or perspective blt

+     *  destPoints.length = 3: rect => parallelogram

+     *      destPoints[0] <=> top-left corner of the source rectangle

+     *      destPoints[1] <=> top-right corner

+     *      destPoints[2] <=> bottom-left corner

+     *  destPoints.length = 4: rect => quad

+     *      destPoints[3] <=> bottom-right corner

+     *

+     *  @notes Perspective blt only works for bitmap images.

+     */

+    Status DrawImage(IN Image* image,

+                     IN const PointF* destPoints,

+                     IN INT count)

+    {

+        if (count != 3 && count != 4)

+            return SetStatus(InvalidParameter);

+

+        return SetStatus(DllExports::GdipDrawImagePoints(nativeGraphics,

+                                                         image ? image->nativeImage

+                                                               : NULL,

+                                                         destPoints, count));

+    }

+

+    Status DrawImage(IN Image* image,

+                     IN const Point* destPoints,

+                     IN INT count)

+    {

+        if (count != 3 && count != 4)

+            return SetStatus(InvalidParameter);

+

+        return SetStatus(DllExports::GdipDrawImagePointsI(nativeGraphics,

+                                                          image ? image->nativeImage

+                                                                : NULL,

+                                                          destPoints,

+                                                          count));

+    }

+

+    /**

+     * We need another set of methods similar to the ones above

+     * that take an additional Rect parameter to specify the

+     * portion of the source image to be drawn.

+     */

+    // float version

+    Status DrawImage(IN Image* image,

+                     IN REAL x,

+                     IN REAL y,

+                     IN REAL srcx,

+                     IN REAL srcy,

+                     IN REAL srcwidth,

+                     IN REAL srcheight,

+                     IN Unit srcUnit)

+    {

+        return SetStatus(DllExports::GdipDrawImagePointRect(nativeGraphics,

+                                                            image ? image->nativeImage

+                                                                  : NULL,

+                                                            x, y,

+                                                            srcx, srcy,

+                                                            srcwidth, srcheight, srcUnit));

+    }

+

+    Status DrawImage(IN Image* image,

+                     IN const RectF& destRect,

+                     IN REAL srcx,

+                     IN REAL srcy,

+                     IN REAL srcwidth,

+                     IN REAL srcheight,

+                     IN Unit srcUnit,

+                     IN const ImageAttributes* imageAttributes = NULL,

+                     IN DrawImageAbort callback = NULL,

+                     IN VOID* callbackData = NULL)

+    {

+        return SetStatus(DllExports::GdipDrawImageRectRect(nativeGraphics,

+                                                           image ? image->nativeImage

+                                                                 : NULL,

+                                                           destRect.X,

+                                                           destRect.Y,

+                                                           destRect.Width,

+                                                           destRect.Height,

+                                                           srcx, srcy,

+                                                           srcwidth, srcheight,

+                                                           srcUnit,

+                                                           imageAttributes

+                                                            ? imageAttributes->nativeImageAttr

+                                                            : NULL,

+                                                           callback,

+                                                           callbackData));

+    }

+

+    Status DrawImage(IN Image* image,

+                     IN const PointF* destPoints,

+                     IN INT count,

+                     IN REAL srcx,

+                     IN REAL srcy,

+                     IN REAL srcwidth,

+                     IN REAL srcheight,

+                     IN Unit srcUnit,

+                     IN const ImageAttributes* imageAttributes = NULL,

+                     IN DrawImageAbort callback = NULL,

+                     IN VOID* callbackData = NULL)

+    {

+        return SetStatus(DllExports::GdipDrawImagePointsRect(nativeGraphics,

+                                                             image ? image->nativeImage

+                                                                   : NULL,

+                                                             destPoints, count,

+                                                             srcx, srcy,

+                                                             srcwidth,

+                                                             srcheight,

+                                                             srcUnit,

+                                                             imageAttributes

+                                                              ? imageAttributes->nativeImageAttr

+                                                              : NULL,

+                                                             callback,

+                                                             callbackData));

+    }

+

+    // integer version

+    Status DrawImage(IN Image* image,

+                     IN INT x,

+                     IN INT y,

+                     IN INT srcx,

+                     IN INT srcy,

+                     IN INT srcwidth,

+                     IN INT srcheight,

+                     IN Unit srcUnit)

+    {

+        return SetStatus(DllExports::GdipDrawImagePointRectI(nativeGraphics,

+                                                             image ? image->nativeImage

+                                                                   : NULL,

+                                                             x,

+                                                             y,

+                                                             srcx,

+                                                             srcy,

+                                                             srcwidth,

+                                                             srcheight,

+                                                             srcUnit));

+    }

+

+    Status DrawImage(IN Image* image,

+                     IN const Rect& destRect,

+                     IN INT srcx,

+                     IN INT srcy,

+                     IN INT srcwidth,

+                     IN INT srcheight,

+                     IN Unit srcUnit,

+                     IN const ImageAttributes* imageAttributes = NULL,

+                     IN DrawImageAbort callback = NULL,

+                     IN VOID* callbackData = NULL)

+    {

+        return SetStatus(DllExports::GdipDrawImageRectRectI(nativeGraphics,

+                                                            image ? image->nativeImage

+                                                                  : NULL,

+                                                            destRect.X,

+                                                            destRect.Y,

+                                                            destRect.Width,

+                                                            destRect.Height,

+                                                            srcx,

+                                                            srcy,

+                                                            srcwidth,

+                                                            srcheight,

+                                                            srcUnit,

+                                                            imageAttributes

+                                                            ? imageAttributes->nativeImageAttr

+                                                            : NULL,

+                                                            callback,

+                                                            callbackData));

+    }

+

+    Status DrawImage(IN Image* image,

+                     IN const Point* destPoints,

+                     IN INT count,

+                     IN INT srcx,

+                     IN INT srcy,

+                     IN INT srcwidth,

+                     IN INT srcheight,

+                     IN Unit srcUnit,

+                     IN const ImageAttributes* imageAttributes = NULL,

+                     IN DrawImageAbort callback = NULL,

+                     IN VOID* callbackData = NULL)

+    {

+        return SetStatus(DllExports::GdipDrawImagePointsRectI(nativeGraphics,

+                                                              image ? image->nativeImage

+                                                                    : NULL,

+                                                              destPoints,

+                                                              count,

+                                                              srcx,

+                                                              srcy,

+                                                              srcwidth,

+                                                              srcheight,

+                                                              srcUnit,

+                                                              imageAttributes

+                                                               ? imageAttributes->nativeImageAttr

+                                                               : NULL,

+                                                              callback,

+                                                              callbackData));

+    }

+

+    // The following methods are for playing an EMF+ to a graphics

+    // via the enumeration interface.  Each record of the EMF+ is

+    // sent to the callback (along with the callbackData).  Then

+    // the callback can invoke the Metafile::PlayRecord method

+    // to play the particular record.

+

+    Status

+    EnumerateMetafile(

+        IN const Metafile *        metafile,

+        IN const PointF &          destPoint,

+        IN EnumerateMetafileProc   callback,

+        IN VOID *                  callbackData    = NULL,

+        IN const ImageAttributes *       imageAttributes = NULL

+        )

+    {

+        return SetStatus(DllExports::GdipEnumerateMetafileDestPoint(

+                    nativeGraphics,

+                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),

+                    destPoint,

+                    callback,

+                    callbackData,

+                    imageAttributes ? imageAttributes->nativeImageAttr : NULL));

+    }

+

+    Status

+    EnumerateMetafile(

+        IN const Metafile *        metafile,

+        IN const Point &           destPoint,

+        IN EnumerateMetafileProc   callback,

+        IN VOID *                  callbackData    = NULL,

+        IN const ImageAttributes *       imageAttributes = NULL

+        )

+    {

+        return SetStatus(DllExports::GdipEnumerateMetafileDestPointI(

+                    nativeGraphics,

+                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),

+                    destPoint,

+                    callback,

+                    callbackData,

+                    imageAttributes ? imageAttributes->nativeImageAttr : NULL));

+    }

+

+    Status

+    EnumerateMetafile(

+        IN const Metafile *        metafile,

+        IN const RectF &           destRect,

+        IN EnumerateMetafileProc   callback,

+        IN VOID *                  callbackData    = NULL,

+        IN const ImageAttributes *       imageAttributes = NULL

+        )

+    {

+        return SetStatus(DllExports::GdipEnumerateMetafileDestRect(

+                    nativeGraphics,

+                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),

+                    destRect,

+                    callback,

+                    callbackData,

+                    imageAttributes ? imageAttributes->nativeImageAttr : NULL));

+    }

+

+    Status

+    EnumerateMetafile(

+        IN const Metafile *        metafile,

+        IN const Rect &            destRect,

+        IN EnumerateMetafileProc   callback,

+        IN VOID *                  callbackData    = NULL,

+        IN const ImageAttributes *       imageAttributes = NULL

+        )

+    {

+        return SetStatus(DllExports::GdipEnumerateMetafileDestRectI(

+                    nativeGraphics,

+                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),

+                    destRect,

+                    callback,

+                    callbackData,

+                    imageAttributes ? imageAttributes->nativeImageAttr : NULL));

+    }

+

+    Status

+    EnumerateMetafile(

+        IN const Metafile *        metafile,

+        IN const PointF *          destPoints,

+        IN INT                     count,

+        IN EnumerateMetafileProc   callback,

+        IN VOID *                  callbackData    = NULL,

+        IN const ImageAttributes *       imageAttributes = NULL

+        )

+    {

+        return SetStatus(DllExports::GdipEnumerateMetafileDestPoints(

+                    nativeGraphics,

+                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),

+                    destPoints,

+                    count,

+                    callback,

+                    callbackData,

+                    imageAttributes ? imageAttributes->nativeImageAttr : NULL));

+    }

+

+    Status

+    EnumerateMetafile(

+        IN const Metafile *        metafile,

+        IN const Point *           destPoints,

+        IN INT                     count,

+        IN EnumerateMetafileProc   callback,

+        IN VOID *                  callbackData    = NULL,

+        IN const ImageAttributes *       imageAttributes = NULL

+        )

+    {

+        return SetStatus(DllExports::GdipEnumerateMetafileDestPointsI(

+                    nativeGraphics,

+                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),

+                    destPoints,

+                    count,

+                    callback,

+                    callbackData,

+                    imageAttributes ? imageAttributes->nativeImageAttr : NULL));

+    }

+

+    Status

+    EnumerateMetafile(

+        IN const Metafile *        metafile,

+        IN const PointF &          destPoint,

+        IN const RectF &           srcRect,

+        IN Unit                    srcUnit,

+        IN EnumerateMetafileProc   callback,

+        IN VOID *                  callbackData    = NULL,

+        IN const ImageAttributes *       imageAttributes = NULL

+        )

+    {

+        return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoint(

+                    nativeGraphics,

+                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),

+                    destPoint,

+                    srcRect,

+                    srcUnit,

+                    callback,

+                    callbackData,

+                    imageAttributes ? imageAttributes->nativeImageAttr : NULL));

+    }

+

+    Status

+    EnumerateMetafile(

+        IN const Metafile *        metafile,

+        IN const Point &           destPoint,

+        IN const Rect &            srcRect,

+        IN Unit                    srcUnit,

+        IN EnumerateMetafileProc   callback,

+        IN VOID *                  callbackData    = NULL,

+        IN const ImageAttributes *       imageAttributes = NULL

+        )

+    {

+        return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointI(

+                    nativeGraphics,

+                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),

+                    destPoint,

+                    srcRect,

+                    srcUnit,

+                    callback,

+                    callbackData,

+                    imageAttributes ? imageAttributes->nativeImageAttr : NULL));

+    }

+

+    Status

+    EnumerateMetafile(

+        IN const Metafile *        metafile,

+        IN const RectF &           destRect,

+        IN const RectF &           srcRect,

+        IN Unit                    srcUnit,

+        IN EnumerateMetafileProc   callback,

+        IN VOID *                  callbackData    = NULL,

+        IN const ImageAttributes *       imageAttributes = NULL

+        )

+    {

+        return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRect(

+                    nativeGraphics,

+                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),

+                    destRect,

+                    srcRect,

+                    srcUnit,

+                    callback,

+                    callbackData,

+                    imageAttributes ? imageAttributes->nativeImageAttr : NULL));

+    }

+

+    Status

+    EnumerateMetafile(

+        IN const Metafile *        metafile,

+        IN const Rect &            destRect,

+        IN const Rect &            srcRect,

+        IN Unit                    srcUnit,

+        IN EnumerateMetafileProc   callback,

+        IN VOID *                  callbackData    = NULL,

+        IN const ImageAttributes *       imageAttributes = NULL

+        )

+    {

+        return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRectI(

+                    nativeGraphics,

+                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),

+                    destRect,

+                    srcRect,

+                    srcUnit,

+                    callback,

+                    callbackData,

+                    imageAttributes ? imageAttributes->nativeImageAttr : NULL));

+    }

+

+    Status

+    EnumerateMetafile(

+        IN const Metafile *        metafile,

+        IN const PointF *          destPoints,

+        IN INT                     count,

+        IN const RectF &           srcRect,

+        IN Unit                    srcUnit,

+        IN EnumerateMetafileProc   callback,

+        IN VOID *                  callbackData    = NULL,

+        IN const ImageAttributes *       imageAttributes = NULL

+        )

+    {

+        return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoints(

+                    nativeGraphics,

+                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),

+                    destPoints,

+                    count,

+                    srcRect,

+                    srcUnit,

+                    callback,

+                    callbackData,

+                    imageAttributes ? imageAttributes->nativeImageAttr : NULL));

+    }

+

+    Status

+    EnumerateMetafile(

+        IN const Metafile *        metafile,

+        IN const Point *           destPoints,

+        IN INT                     count,

+        IN const Rect &            srcRect,

+        IN Unit                    srcUnit,

+        IN EnumerateMetafileProc   callback,

+        IN VOID *                  callbackData    = NULL,

+        IN const ImageAttributes *       imageAttributes = NULL

+        )

+    {

+        return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointsI(

+                    nativeGraphics,

+                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),

+                    destPoints,

+                    count,

+                    srcRect,

+                    srcUnit,

+                    callback,

+                    callbackData,

+                    imageAttributes ? imageAttributes->nativeImageAttr : NULL));

+    }

+

+    /**

+      * Clipping region operations

+      *

+      * @notes Simply incredible redundancy here.

+      */

+    Status SetClip(IN const Graphics* g,

+                   IN CombineMode combineMode = CombineModeReplace)

+    {

+        return SetStatus(DllExports::GdipSetClipGraphics(nativeGraphics,

+                                                         g->nativeGraphics,

+                                                         combineMode));

+    }

+

+    Status SetClip(IN const RectF& rect,

+                   IN CombineMode combineMode = CombineModeReplace)

+    {

+        return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,

+                                                     rect.X, rect.Y,

+                                                     rect.Width, rect.Height,

+                                                     combineMode));

+    }

+

+    Status SetClip(IN const Rect& rect,

+                   IN CombineMode combineMode = CombineModeReplace)

+    {

+        return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,

+                                                      rect.X, rect.Y,

+                                                      rect.Width, rect.Height,

+                                                      combineMode));

+    }

+

+    Status SetClip(IN const GraphicsPath* path,

+                   IN CombineMode combineMode = CombineModeReplace)

+    {

+        return SetStatus(DllExports::GdipSetClipPath(nativeGraphics,

+                                                     path->nativePath,

+                                                     combineMode));

+    }

+

+    Status SetClip(IN const Region* region,

+                   IN CombineMode combineMode = CombineModeReplace)

+    {

+        return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,

+                                                       region->nativeRegion,

+                                                       combineMode));

+    }

+

+    // This is different than the other SetClip methods because it assumes

+    // that the HRGN is already in device units, so it doesn't transform

+    // the coordinates in the HRGN.

+    Status SetClip(IN HRGN hRgn,

+                   IN CombineMode combineMode = CombineModeReplace)

+    {

+        return SetStatus(DllExports::GdipSetClipHrgn(nativeGraphics, hRgn,

+                                                     combineMode));

+    }

+

+    Status IntersectClip(IN const RectF& rect)

+    {

+        return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,

+                                                     rect.X, rect.Y,

+                                                     rect.Width, rect.Height,

+                                                     CombineModeIntersect));

+    }

+

+    Status IntersectClip(IN const Rect& rect)

+    {

+        return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,

+                                                      rect.X, rect.Y,

+                                                      rect.Width, rect.Height,

+                                                      CombineModeIntersect));

+    }

+

+    Status IntersectClip(IN const Region* region)

+    {

+        return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,

+                                                       region->nativeRegion,

+                                                       CombineModeIntersect));

+    }

+

+    Status ExcludeClip(IN const RectF& rect)

+    {

+        return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,

+                                                     rect.X, rect.Y,

+                                                     rect.Width, rect.Height,

+                                                     CombineModeExclude));

+    }

+

+    Status ExcludeClip(IN const Rect& rect)

+    {

+        return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,

+                                                      rect.X, rect.Y,

+                                                      rect.Width, rect.Height,

+                                                      CombineModeExclude));

+    }

+

+    Status ExcludeClip(IN const Region* region)

+    {

+        return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,

+                                                       region->nativeRegion,

+                                                       CombineModeExclude));

+    }

+

+    Status ResetClip()

+    {

+        return SetStatus(DllExports::GdipResetClip(nativeGraphics));

+    }

+

+    Status TranslateClip(IN REAL dx,

+                         IN REAL dy)

+    {

+        return SetStatus(DllExports::GdipTranslateClip(nativeGraphics, dx, dy));

+    }

+

+    Status TranslateClip(IN INT dx,

+                         IN INT dy)

+    {

+        return SetStatus(DllExports::GdipTranslateClipI(nativeGraphics,

+                                                        dx, dy));

+    }

+

+    /**

+     *  GetClip region from graphics context

+     */

+    Status GetClip(OUT Region* region) const

+    {

+        return SetStatus(DllExports::GdipGetClip(nativeGraphics,

+                                                 region->nativeRegion));

+    }

+

+    /**

+     * Hit testing operations

+     */

+    Status GetClipBounds(OUT RectF* rect) const

+    {

+        return SetStatus(DllExports::GdipGetClipBounds(nativeGraphics, rect));

+    }

+

+    Status GetClipBounds(OUT Rect* rect) const

+    {

+        return SetStatus(DllExports::GdipGetClipBoundsI(nativeGraphics, rect));

+    }

+

+    BOOL IsClipEmpty() const

+    {

+        BOOL booln = FALSE;

+

+        SetStatus(DllExports::GdipIsClipEmpty(nativeGraphics, &booln));

+

+        return booln;

+    }

+

+    Status GetVisibleClipBounds(OUT RectF *rect) const

+    {

+

+        return SetStatus(DllExports::GdipGetVisibleClipBounds(nativeGraphics,

+                                                              rect));

+    }

+

+    Status GetVisibleClipBounds(OUT Rect *rect) const

+    {

+       return SetStatus(DllExports::GdipGetVisibleClipBoundsI(nativeGraphics,

+                                                              rect));

+    }

+

+    BOOL IsVisibleClipEmpty() const

+    {

+        BOOL booln = FALSE;

+

+        SetStatus(DllExports::GdipIsVisibleClipEmpty(nativeGraphics, &booln));

+

+        return booln;

+    }

+

+    BOOL IsVisible(IN INT x,

+                   IN INT y) const

+    {

+        return IsVisible(Point(x,y));

+    }

+

+    BOOL IsVisible(IN const Point& point) const

+    {

+        BOOL booln = FALSE;

+

+        SetStatus(DllExports::GdipIsVisiblePointI(nativeGraphics,

+                                                  point.X,

+                                                  point.Y,

+                                                  &booln));

+

+        return booln;

+    }

+

+    BOOL IsVisible(IN INT x,

+                   IN INT y,

+                   IN INT width,

+                   IN INT height) const

+    {

+        return IsVisible(Rect(x, y, width, height));

+    }

+

+    BOOL IsVisible(IN const Rect& rect) const

+    {

+

+        BOOL booln = TRUE;

+

+        SetStatus(DllExports::GdipIsVisibleRectI(nativeGraphics,

+                                                 rect.X,

+                                                 rect.Y,

+                                                 rect.Width,

+                                                 rect.Height,

+                                                 &booln));

+        return booln;

+    }

+

+    BOOL IsVisible(IN REAL x,

+                   IN REAL y) const

+    {

+        return IsVisible(PointF(x, y));

+    }

+

+    BOOL IsVisible(IN const PointF& point) const

+    {

+        BOOL booln = FALSE;

+

+        SetStatus(DllExports::GdipIsVisiblePoint(nativeGraphics,

+                                                 point.X,

+                                                 point.Y,

+                                                 &booln));

+

+        return booln;

+    }

+

+    BOOL IsVisible(IN REAL x,

+                   IN REAL y,

+                   IN REAL width,

+                   IN REAL height) const

+    {

+        return IsVisible(RectF(x, y, width, height));

+    }

+

+    BOOL IsVisible(IN const RectF& rect) const

+    {

+        BOOL booln = TRUE;

+

+        SetStatus(DllExports::GdipIsVisibleRect(nativeGraphics,

+                                                rect.X,

+                                                rect.Y,

+                                                rect.Width,

+                                                rect.Height,

+                                                &booln));

+        return booln;

+    }

+

+    /**

+     * Save/restore graphics state

+     */

+    GraphicsState Save() const

+    {

+        GraphicsState gstate;

+

+        SetStatus(DllExports::GdipSaveGraphics(nativeGraphics, &gstate));

+

+        return gstate;

+    }

+

+    Status Restore(IN GraphicsState gstate)

+    {

+        return SetStatus(DllExports::GdipRestoreGraphics(nativeGraphics,

+                                                         gstate));

+    }

+

+    /**

+     * Begin and end container drawing

+     */

+    GraphicsContainer BeginContainer(IN const RectF &dstrect,

+                                     IN const RectF &srcrect,

+                                     IN Unit         unit)

+    {

+        GraphicsContainer state;

+

+        SetStatus(DllExports::GdipBeginContainer(nativeGraphics, &dstrect,

+                                                 &srcrect, unit, &state));

+

+        return state;

+    }

+

+    /**

+     * Begin and end container drawing

+     */

+    GraphicsContainer BeginContainer(IN const Rect    &dstrect,

+                                     IN const Rect    &srcrect,

+                                     IN Unit           unit)

+    {

+        GraphicsContainer state;

+

+        SetStatus(DllExports::GdipBeginContainerI(nativeGraphics, &dstrect,

+                                                  &srcrect, unit, &state));

+

+        return state;

+    }

+

+    GraphicsContainer BeginContainer()

+    {

+        GraphicsContainer state;

+

+        SetStatus(DllExports::GdipBeginContainer2(nativeGraphics, &state));

+

+        return state;

+    }

+

+    Status EndContainer(IN GraphicsContainer state)

+    {

+        return SetStatus(DllExports::GdipEndContainer(nativeGraphics, state));

+    }

+

+    // only valid when recording metafiles

+    Status AddMetafileComment(IN const BYTE * data,

+                              IN UINT sizeData)

+    {

+        return SetStatus(DllExports::GdipComment(nativeGraphics, sizeData, data));

+    }

+

+    /**

+     * Get/SetLayout

+     * Support for Middle East localization (right-to-left mirroring)

+     */

+    GraphicsLayout GetLayout() const

+    {

+        GraphicsLayout layout;

+

+        SetStatus(DllExports::GdipGetGraphicsLayout(nativeGraphics, &layout));

+

+        return layout;

+    }

+

+    Status SetLayout(IN const GraphicsLayout layout)

+    {

+        return SetStatus(

+            DllExports::GdipSetGraphicsLayout(nativeGraphics, layout)

+        );

+    }

+

+    static HPALETTE GetHalftonePalette()

+    {

+        return DllExports::GdipCreateHalftonePalette();

+    }

+

+    Status GetLastStatus() const

+    {

+        Status lastStatus = lastResult;

+        lastResult = Ok;

+

+        return lastStatus;

+    }

+

+protected:

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    Graphics(const Graphics &);

+    Graphics& operator=(const Graphics &);

+protected:

+

+#else

+

+    Graphics(const Graphics& graphics)

+    {

+        graphics;

+        SetStatus(NotImplemented);

+    }

+

+    Graphics& operator=(const Graphics& graphics)

+    {

+        graphics;

+        SetStatus(NotImplemented);

+        return *this;

+    }

+

+#endif

+

+    Graphics(GpGraphics* graphics)

+    {

+        lastResult = Ok;

+        SetNativeGraphics(graphics);

+    }

+

+    VOID SetNativeGraphics(GpGraphics *graphics)

+    {

+        this->nativeGraphics = graphics;

+    }

+

+    Status SetStatus(Status status) const

+    {

+        if (status != Ok)

+            return (lastResult = status);

+        else

+            return status;

+    }

+

+    // Methods necessary to subclass Graphics for extension test.

+

+    GpGraphics* GetNativeGraphics() const

+    {

+        return this->nativeGraphics;

+    }

+

+    GpPen* GetNativePen(const Pen* pen)

+    {

+        return pen->nativePen;

+    }

+

+protected:

+    GpGraphics* nativeGraphics;

+    mutable Status lastResult;

+

+};

+

+//----------------------------------------------------------------------------

+// Extra implementation of GraphicsPath methods that use Graphics

+//----------------------------------------------------------------------------

+

+/**

+ * Get the bounds of the path object with the given transform.

+ * This is not always the tightest bounds.

+ */

+

+inline Status

+GraphicsPath::GetBounds(

+    OUT RectF* bounds,

+    IN const Matrix* matrix,

+    IN const Pen* pen) const

+{

+    GpMatrix* nativeMatrix = NULL;

+    GpPen* nativePen = NULL;

+

+    if (matrix)

+        nativeMatrix = matrix->nativeMatrix;

+

+    if (pen)

+        nativePen = pen->nativePen;

+

+    return SetStatus(DllExports::GdipGetPathWorldBounds(nativePath, bounds,

+                                                   nativeMatrix, nativePen));

+}

+

+// integer version

+inline Status

+GraphicsPath::GetBounds(

+    OUT Rect* bounds,

+    IN const Matrix* matrix,

+    IN const Pen* pen

+) const

+{

+    GpMatrix* nativeMatrix = NULL;

+    GpPen* nativePen = NULL;

+

+    if (matrix)

+        nativeMatrix = matrix->nativeMatrix;

+

+    if (pen)

+        nativePen = pen->nativePen;

+

+    return SetStatus(DllExports::GdipGetPathWorldBoundsI(nativePath, bounds,

+                                                    nativeMatrix, nativePen));

+}

+

+//----------------------------------------------------------------------------

+// Hit testing operations

+//----------------------------------------------------------------------------

+

+inline BOOL

+GraphicsPath::IsVisible(

+    IN REAL x,

+    IN REAL y,

+    IN const Graphics* g) const

+{

+   BOOL booln = FALSE;

+

+   GpGraphics* nativeGraphics = NULL;

+

+   if (g)

+       nativeGraphics = g->nativeGraphics;

+

+   SetStatus(DllExports::GdipIsVisiblePathPoint(nativePath,

+                                                x, y, nativeGraphics,

+                                                &booln));

+   return booln;

+}

+

+inline BOOL

+GraphicsPath::IsVisible(

+    IN INT x,

+    IN INT y,

+    IN const Graphics* g) const

+{

+   BOOL booln = FALSE;

+

+   GpGraphics* nativeGraphics = NULL;

+

+   if (g)

+       nativeGraphics = g->nativeGraphics;

+

+   SetStatus(DllExports::GdipIsVisiblePathPointI(nativePath,

+                                                 x, y, nativeGraphics,

+                                                 &booln));

+   return booln;

+}

+

+inline BOOL

+GraphicsPath::IsOutlineVisible(

+    IN REAL x,

+    IN REAL y,

+    IN const Pen* pen,

+    IN const Graphics* g) const

+{

+    BOOL booln = FALSE;

+

+    GpGraphics* nativeGraphics = NULL;

+    GpPen* nativePen = NULL;

+

+    if(g)

+        nativeGraphics = g->nativeGraphics;

+    if(pen)

+        nativePen = pen->nativePen;

+

+    SetStatus(DllExports::GdipIsOutlineVisiblePathPoint(nativePath,

+                                                        x, y, nativePen, nativeGraphics,

+                                                        &booln));

+    return booln;

+}

+

+inline BOOL

+GraphicsPath::IsOutlineVisible(

+    IN INT x,

+    IN INT y,

+    IN const Pen* pen,

+    IN const Graphics* g) const

+{

+    BOOL booln = FALSE;

+

+    GpGraphics* nativeGraphics = NULL;

+    GpPen* nativePen = NULL;

+

+    if(g)

+        nativeGraphics = g->nativeGraphics;

+    if(pen)

+        nativePen = pen->nativePen;

+

+    SetStatus(DllExports::GdipIsOutlineVisiblePathPointI(nativePath,

+                                                         x, y, nativePen, nativeGraphics,

+                                                         &booln));

+    return booln;

+}

+

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h b/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h
new file mode 100644
index 0000000..215c4d0
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h
@@ -0,0 +1,793 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusHeaders.h

+*

+* Abstract:

+*

+*   GDI+ Native C++ public header file

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSHEADERS_H

+#define _GDIPLUSHEADERS_H

+

+//--------------------------------------------------------------------------

+// Abstract base class for regions

+//--------------------------------------------------------------------------

+

+//  Include the class declarations here and have inline class implementation

+//  in separate file to avoid circular references.

+

+class Region : public GdiplusBase

+{

+public:

+    friend class Graphics;

+

+    Region();

+    Region(IN const RectF& rect);

+    Region(IN const Rect& rect);

+    Region(IN const GraphicsPath* path);

+    Region(IN const BYTE* regionData, IN INT size);

+    Region(IN HRGN hRgn);

+    static Region* FromHRGN(IN HRGN hRgn);

+

+    ~Region();

+    Region* Clone() const;

+

+    Status MakeInfinite();

+    Status MakeEmpty();

+

+    // Get the size of the buffer needed for the GetData method

+    UINT GetDataSize() const;

+

+    // buffer     - where to put the data

+    // bufferSize - how big the buffer is (should be at least as big as GetDataSize())

+    // sizeFilled - if not NULL, this is an OUT param that says how many bytes

+    //              of data were written to the buffer.

+    Status GetData(OUT BYTE* buffer,

+                   IN UINT bufferSize,

+                   OUT UINT* sizeFilled = NULL) const;

+

+    Status Intersect(IN const Rect& rect);

+    Status Intersect(IN const RectF& rect);

+    Status Intersect(IN const GraphicsPath* path);

+    Status Intersect(IN const Region* region);

+    Status Union(IN const Rect& rect);

+    Status Union(IN const RectF& rect);

+    Status Union(IN const GraphicsPath* path);

+    Status Union(IN const Region* region);

+    Status Xor(IN const Rect& rect);

+    Status Xor(IN const RectF& rect);

+    Status Xor(IN const GraphicsPath* path);

+    Status Xor(IN const Region* region);

+    Status Exclude(IN const Rect& rect);

+    Status Exclude(IN const RectF& rect);

+    Status Exclude(IN const GraphicsPath* path);

+    Status Exclude(IN const Region* region);

+    Status Complement(IN const Rect& rect);

+    Status Complement(IN const RectF& rect);

+    Status Complement(IN const GraphicsPath* path);

+    Status Complement(IN const Region* region);

+    Status Translate(IN REAL dx,

+                     IN REAL dy);

+    Status Translate(IN INT dx,

+                     IN INT dy);

+    Status Transform(IN const Matrix* matrix);

+

+    Status GetBounds(OUT Rect* rect,

+                     IN const Graphics* g) const;

+

+    Status GetBounds(OUT RectF* rect,

+                     IN const Graphics* g) const;

+

+    HRGN   GetHRGN  (IN const Graphics * g) const;

+

+    BOOL IsEmpty(IN const Graphics *g) const;

+    BOOL IsInfinite(IN const Graphics *g) const;

+

+    BOOL IsVisible(IN INT x,

+                   IN INT y,

+                   IN const Graphics* g = NULL) const

+    {

+        return IsVisible(Point(x, y), g);

+    }

+

+    BOOL IsVisible(IN const Point& point,

+                   IN const Graphics* g = NULL) const;

+

+    BOOL IsVisible(IN REAL x,

+                   IN REAL y,

+                   IN const Graphics* g = NULL) const

+    {

+        return IsVisible(PointF(x, y), g);

+    }

+

+    BOOL IsVisible(IN const PointF& point,

+                   IN const Graphics* g = NULL) const;

+

+    BOOL IsVisible(IN INT x,

+                   IN INT y,

+                   IN INT width,

+                   IN INT height,

+                   IN const Graphics* g) const

+    {

+        return IsVisible(Rect(x, y, width, height), g);

+    }

+

+    BOOL IsVisible(IN const Rect& rect,

+                   IN const Graphics* g = NULL) const;

+

+    BOOL IsVisible(IN REAL x,

+                   IN REAL y,

+                   IN REAL width,

+                   IN REAL height,

+                   IN const Graphics* g = NULL) const

+    {

+        return IsVisible(RectF(x, y, width, height), g);

+    }

+

+    BOOL IsVisible(IN const RectF& rect,

+                   IN const Graphics* g = NULL) const;

+

+    BOOL Equals(IN const Region* region,

+                IN const Graphics* g) const;

+

+    UINT GetRegionScansCount(IN const Matrix* matrix) const;

+    Status GetRegionScans(IN const Matrix* matrix,

+                          OUT RectF* rects,

+                          OUT INT* count) const;

+    Status GetRegionScans(IN const Matrix* matrix,

+                          OUT Rect*  rects,

+                          OUT INT* count) const;

+    Status GetLastStatus() const;

+

+protected:

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    Region(const Region &region);

+    Region& operator=(const Region &region);

+protected:

+

+#else

+    Region(const Region &region)

+    {

+        region; // reference parameter

+        SetStatus(NotImplemented);

+    }

+

+    Region& operator=(const Region &region)

+    {

+       region;  // reference parameter

+       SetStatus(NotImplemented);

+       return *this;

+    }

+#endif

+

+    Status SetStatus(Status status) const

+    {

+        if (status != Ok)

+            return (lastResult = status);

+        else

+            return status;

+    }

+

+    Region(GpRegion* nativeRegion);

+

+    VOID SetNativeRegion(GpRegion* nativeRegion);

+

+protected:

+    GpRegion* nativeRegion;

+    mutable Status lastResult;

+};

+

+

+//--------------------------------------------------------------------------

+// Abstract base class for FontFamily

+//--------------------------------------------------------------------------

+

+class FontFamily : public GdiplusBase

+{

+public:

+    friend class Font;

+    friend class Graphics;

+    friend class GraphicsPath;

+    friend class FontCollection;

+

+    FontFamily();

+

+    FontFamily(

+        IN const WCHAR          *name,

+        IN const FontCollection *fontCollection = NULL

+    );

+

+    ~FontFamily();

+

+    static const FontFamily *GenericSansSerif();

+    static const FontFamily *GenericSerif();

+    static const FontFamily *GenericMonospace();

+

+    Status GetFamilyName(

+        OUT WCHAR        name[LF_FACESIZE],

+        IN LANGID        language = 0

+    ) const;

+

+//  Copy operator

+    FontFamily * Clone() const;

+

+    BOOL    IsAvailable() const

+    {

+        return (nativeFamily != NULL);

+    };

+

+    BOOL    IsStyleAvailable(IN INT style) const;

+

+    UINT16  GetEmHeight     (IN INT style) const;

+    UINT16  GetCellAscent   (IN INT style) const;

+    UINT16  GetCellDescent  (IN INT style) const;

+    UINT16  GetLineSpacing  (IN INT style) const;

+

+    ///////////////////////////////////////////////////////////

+

+    Status GetLastStatus() const;

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    FontFamily(const FontFamily &);

+    FontFamily& operator=(const FontFamily &);

+

+#endif

+

+protected:

+    Status SetStatus(Status status) const;

+

+    // private constructor for copy

+    FontFamily(GpFontFamily * nativeFamily, Status status);

+

+///////////////////////////////////////

+//  Data members

+protected:

+

+    GpFontFamily    *nativeFamily;

+    mutable Status   lastResult;

+};

+

+static FontFamily *GenericSansSerifFontFamily = NULL;

+static FontFamily *GenericSerifFontFamily     = NULL;

+static FontFamily *GenericMonospaceFontFamily = NULL;

+

+static BYTE GenericSansSerifFontFamilyBuffer[sizeof(FontFamily)] = {0};

+static BYTE GenericSerifFontFamilyBuffer    [sizeof(FontFamily)] = {0};

+static BYTE GenericMonospaceFontFamilyBuffer[sizeof(FontFamily)] = {0};

+

+

+//--------------------------------------------------------------------------

+// Abstract base class for fonts

+//--------------------------------------------------------------------------

+

+class Font : public GdiplusBase

+{

+public:

+    friend class Graphics;

+

+    Font(IN HDC hdc);

+    Font(IN HDC hdc,

+         IN const LOGFONTA* logfont);

+    Font(IN HDC hdc,

+         IN const LOGFONTW* logfont);

+#ifdef DCR_USE_NEW_127084

+    Font(IN HDC hdc,

+         IN const HFONT hfont);

+#endif

+    Font(

+        IN const FontFamily * family,

+        IN REAL         emSize,

+        IN INT          style   = FontStyleRegular,

+        IN Unit         unit    = UnitPoint

+    );

+

+    Font(

+        IN const WCHAR *           familyName,

+        IN REAL                    emSize,

+        IN INT                     style   = FontStyleRegular,

+        IN Unit                    unit    = UnitPoint,

+        IN const FontCollection *  fontCollection = NULL

+    );

+

+    Status GetLogFontA(IN const Graphics* g,

+                       OUT  LOGFONTA * logfontA) const;

+    Status GetLogFontW(IN const Graphics* g,

+                       OUT LOGFONTW * logfontW) const;

+

+    Font* Clone() const;

+    ~Font();

+    BOOL        IsAvailable()   const;

+    INT         GetStyle()      const;

+    REAL        GetSize()       const;

+    Unit        GetUnit()       const;

+    Status      GetLastStatus() const;

+    REAL        GetHeight(IN const Graphics *graphics = NULL) const;

+#ifdef DCR_USE_NEW_125467

+    REAL        GetHeight(IN REAL dpi) const;

+#endif

+

+    Status GetFamily(OUT FontFamily *family) const;

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    Font(const Font &);

+    Font& operator=(const Font &);

+

+#endif

+

+protected:

+    Font(GpFont* font, Status status);

+    VOID SetNativeFont(GpFont *Font);

+    Status SetStatus(Status status) const;

+

+protected:

+    /*

+     * handle to native line texture object

+     */

+

+    GpFont* nativeFont;

+    mutable Status lastResult;

+};

+

+//--------------------------------------------------------------------------

+// Abstract base classes for font collections

+//--------------------------------------------------------------------------

+

+class FontCollection : public GdiplusBase

+{

+public:

+    friend class FontFamily;

+

+    FontCollection();

+    virtual ~FontCollection();

+

+    INT GetFamilyCount() const;     // number of enumerable families in the collection

+

+    Status GetFamilies(             // enumerate the fonts in a collection

+        IN INT           numSought,

+        OUT FontFamily * gpfamilies,

+        OUT INT        * numFound

+    ) const;

+

+    Status GetLastStatus() const;

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    FontCollection(const FontCollection &);

+    FontCollection& operator=(const FontCollection &);

+

+#endif

+

+protected:

+    Status SetStatus(Status status) const ;

+

+    GpFontCollection *nativeFontCollection;

+    mutable Status    lastResult;

+};

+

+

+class InstalledFontCollection : public FontCollection

+{

+public:

+    InstalledFontCollection();

+    ~InstalledFontCollection();

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    InstalledFontCollection(const InstalledFontCollection &);

+    InstalledFontCollection& operator=(const InstalledFontCollection &);

+

+#endif

+

+protected:

+#ifndef DCR_USE_NEW_235072

+    Status InstallFontFile(IN const WCHAR* filename);

+    Status UninstallFontFile(IN const WCHAR* filename);

+#endif

+    Status SetStatus(Status status) const ;

+};

+

+

+class PrivateFontCollection : public FontCollection

+{

+public:

+    PrivateFontCollection();

+    ~PrivateFontCollection();

+

+    Status AddFontFile(IN const WCHAR* filename);

+    Status AddMemoryFont(IN const VOID* memory,

+                         IN INT length);

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    PrivateFontCollection(const PrivateFontCollection &);

+    PrivateFontCollection& operator=(const PrivateFontCollection &);

+

+#endif

+};

+

+

+//--------------------------------------------------------------------------

+// Abstract base class for bitmap image and metafile

+//--------------------------------------------------------------------------

+

+// !!! Note:

+//  Include the class declarations here and have the inline class

+//  implementation in a separate file.  This is done to resolve a

+//  circular dependency since one of the Bitmap methods needs to

+//  access the private member nativeGraphics of the Graphics object.

+

+class Image : public GdiplusBase

+{

+public:

+    friend class Brush;

+    friend class TextureBrush;

+    friend class Graphics;

+

+#ifndef DCR_USE_NEW_140782

+    Image(

+        IN const WCHAR* filename

+    );

+

+    Image(

+        IN IStream* stream

+    );

+

+    static Image* FromFile(

+        IN const WCHAR* filename

+    );

+

+    static Image* FromStream(

+        IN IStream* stream

+    );

+#else

+    Image(

+        IN const WCHAR* filename,

+        IN BOOL useEmbeddedColorManagement = FALSE

+    );

+

+    Image(

+        IN IStream* stream,

+        IN BOOL useEmbeddedColorManagement = FALSE

+    );

+

+    static Image* FromFile(

+        IN const WCHAR* filename,

+        IN BOOL useEmbeddedColorManagement = FALSE

+    );

+

+    static Image* FromStream(

+        IN IStream* stream,

+        IN BOOL useEmbeddedColorManagement = FALSE

+    );

+#endif

+

+    virtual ~Image();

+    virtual Image* Clone();

+

+    Status Save(IN const WCHAR* filename,

+                IN const CLSID* clsidEncoder,

+                IN const EncoderParameters *encoderParams = NULL);

+    Status Save(IN IStream* stream,

+                IN const CLSID* clsidEncoder,

+                IN const EncoderParameters *encoderParams = NULL);

+    Status SaveAdd(IN const EncoderParameters* encoderParams);

+    Status SaveAdd(IN Image* newImage,

+                   IN const EncoderParameters* encoderParams);

+

+    ImageType GetType() const;

+    Status GetPhysicalDimension(OUT SizeF* size);

+    Status GetBounds(OUT RectF* srcRect,

+                     OUT Unit* srcUnit);

+

+    UINT GetWidth();

+    UINT GetHeight();

+    REAL GetHorizontalResolution();

+    REAL GetVerticalResolution();

+    UINT GetFlags();

+    Status GetRawFormat(OUT GUID *format);

+    PixelFormat GetPixelFormat();

+

+    INT GetPaletteSize();

+    Status GetPalette(OUT ColorPalette* palette,

+                      IN INT size);

+    Status SetPalette(IN const ColorPalette* palette);

+

+    Image* GetThumbnailImage(IN UINT thumbWidth,

+                             IN UINT thumbHeight,

+                             IN GetThumbnailImageAbort callback = NULL,

+                             IN VOID* callbackData = NULL);

+    UINT GetFrameDimensionsCount();

+    Status GetFrameDimensionsList(OUT GUID* dimensionIDs,

+                                  IN UINT count);

+    UINT GetFrameCount(IN const GUID* dimensionID);

+    Status SelectActiveFrame(IN const GUID* dimensionID,

+                             IN UINT frameIndex);

+    Status RotateFlip(IN RotateFlipType rotateFlipType);

+    UINT GetPropertyCount();

+    Status GetPropertyIdList(IN UINT numOfProperty,

+                             OUT PROPID* list);

+    UINT GetPropertyItemSize(IN PROPID propId);

+    Status GetPropertyItem(IN PROPID propId,

+                           IN UINT propSize,

+                           OUT PropertyItem* buffer);

+    Status GetPropertySize(OUT UINT* totalBufferSize,

+                           OUT UINT* numProperties);

+    Status GetAllPropertyItems(IN UINT totalBufferSize,

+                               IN UINT numProperties,

+                               OUT PropertyItem* allItems);

+    Status RemovePropertyItem(IN PROPID propId);

+    Status SetPropertyItem(IN const PropertyItem* item);

+

+    UINT  GetEncoderParameterListSize(IN const CLSID* clsidEncoder);

+    Status GetEncoderParameterList(IN const CLSID* clsidEncoder,

+                                   IN UINT size,

+                                   OUT EncoderParameters* buffer);

+

+    // Support for Middle East localization (right-to-left mirroring)

+    ImageLayout GetLayout() const;

+    Status SetLayout(IN const ImageLayout layout);

+

+    Status GetLastStatus() const;

+

+protected:

+

+    Image() {}

+

+    Image(GpImage *nativeImage, Status status);

+

+    VOID SetNativeImage(GpImage* nativeImage);

+

+    Status SetStatus(Status status) const

+    {

+        if (status != Ok)

+            return (lastResult = status);

+        else

+            return status;

+    }

+

+    GpImage* nativeImage;

+    mutable Status lastResult;

+    mutable Status loadStatus;

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+

+#else

+

+protected:

+

+#endif

+

+    // Disable copy constructor and assignment operator

+

+    Image(IN const Image& C);

+    Image& operator=(IN const Image& C);

+};

+

+class Bitmap : public Image

+{

+public:

+    friend class Image;

+    friend class CachedBitmap;

+

+    Bitmap(

+        IN const WCHAR *filename,

+        IN BOOL useEmbeddedColorManagement = FALSE

+    );

+

+    Bitmap(

+        IN IStream *stream,

+        IN BOOL useEmbeddedColorManagement = FALSE

+    );

+

+    static Bitmap* FromFile(

+        IN const WCHAR *filename,

+        IN BOOL useEmbeddedColorManagement = FALSE

+    );

+

+    static Bitmap* FromStream(

+        IN IStream *stream,

+        IN BOOL useEmbeddedColorManagement = FALSE

+    );

+

+    Bitmap(IN INT width,

+           IN INT height,

+           IN INT stride, PixelFormat format,

+           IN BYTE* scan0);

+    Bitmap(IN INT width,

+           IN INT height,

+           IN PixelFormat format = PixelFormat32bppARGB);

+    Bitmap(IN INT width,

+           IN INT height,

+           IN  Graphics* target);

+

+    Bitmap* Clone(IN const Rect& rect,

+                  IN PixelFormat format);

+    Bitmap* Clone(IN INT x,

+                  IN INT y,

+                  IN INT width,

+                  IN INT height,

+                  IN PixelFormat format);

+    Bitmap* Clone(IN const RectF& rect,

+                  IN PixelFormat format);

+    Bitmap* Clone(IN REAL x,

+                  IN REAL y,

+                  IN REAL width,

+                  IN REAL height,

+                  IN PixelFormat format);

+

+    Status LockBits(IN const Rect& rect,

+                    IN UINT flags,

+                    IN PixelFormat format,

+                    OUT BitmapData* lockedBitmapData);

+    Status UnlockBits(IN BitmapData* lockedBitmapData);

+    Status GetPixel(IN INT x,

+                    IN INT y,

+                    OUT Color *color);

+    Status SetPixel(IN INT x,

+                    IN INT y,

+                    IN const Color &color);

+    Status SetResolution(IN REAL xdpi,

+                         IN REAL ydpi);

+

+    // GDI interop:

+

+    Bitmap(IN IDirectDrawSurface7* surface);

+    Bitmap(IN const BITMAPINFO* gdiBitmapInfo,

+           IN VOID* gdiBitmapData);

+    Bitmap(IN HBITMAP hbm,

+           IN HPALETTE hpal);

+    Bitmap(IN HICON hicon);

+    Bitmap(IN HINSTANCE hInstance,

+           IN const WCHAR * bitmapName);

+    static Bitmap* FromDirectDrawSurface7(IN IDirectDrawSurface7* surface);

+    static Bitmap* FromBITMAPINFO(IN const BITMAPINFO* gdiBitmapInfo,

+                                  IN VOID* gdiBitmapData);

+    static Bitmap* FromHBITMAP(IN HBITMAP hbm,

+                               IN HPALETTE hpal);

+    static Bitmap* FromHICON(IN HICON hicon);

+    static Bitmap* FromResource(IN HINSTANCE hInstance,

+                                IN const WCHAR * bitmapName);

+

+    Status GetHBITMAP(IN const Color& colorBackground,

+                      OUT HBITMAP *hbmReturn);

+    Status GetHICON(HICON *hicon);

+

+#ifdef DCR_USE_NEW_250932

+private:

+    Bitmap(const Bitmap &);

+    Bitmap& operator=(const Bitmap &);

+#endif

+

+protected:

+    Bitmap(GpBitmap *nativeBitmap);

+};

+

+class CustomLineCap : public GdiplusBase

+{

+public:

+    friend class Pen;

+

+    CustomLineCap(

+        IN const GraphicsPath* fillPath,

+        IN const GraphicsPath* strokePath,

+        IN LineCap baseCap = LineCapFlat,

+        IN REAL baseInset = 0

+        );

+    virtual ~CustomLineCap();

+

+    CustomLineCap* Clone() const;

+

+    Status SetStrokeCap(IN LineCap strokeCap)

+    {

+        // This changes both start and and caps.

+

+        return SetStrokeCaps(strokeCap, strokeCap);

+    }

+

+    Status SetStrokeCaps(IN LineCap startCap,

+                         IN LineCap endCap);

+    Status GetStrokeCaps(OUT LineCap* startCap,

+                         OUT LineCap* endCap) const;

+    Status SetStrokeJoin(IN LineJoin lineJoin);

+    LineJoin GetStrokeJoin() const;

+    Status SetBaseCap(IN LineCap baseCap);

+    LineCap GetBaseCap() const;

+    Status SetBaseInset(IN REAL inset);

+    REAL GetBaseInset() const;

+    Status SetWidthScale(IN REAL widthScale);

+    REAL GetWidthScale() const;

+

+protected:

+    CustomLineCap();

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    CustomLineCap(const CustomLineCap &);

+    CustomLineCap& operator=(const CustomLineCap &);

+protected:

+

+#else

+

+    CustomLineCap(const CustomLineCap& customLineCap)

+    {

+        customLineCap;

+        SetStatus(NotImplemented);

+    }

+

+    CustomLineCap& operator=(const CustomLineCap& customLineCap)

+    {

+        customLineCap;

+        SetStatus(NotImplemented);

+        return *this;

+    }

+

+#endif

+

+    CustomLineCap(GpCustomLineCap* nativeCap, Status status)

+    {

+        lastResult = status;

+        SetNativeCap(nativeCap);

+    }

+

+    VOID SetNativeCap(GpCustomLineCap* nativeCap)

+    {

+        this->nativeCap = nativeCap;

+    }

+

+    Status SetStatus(Status status) const

+    {

+        if (status != Ok)

+            return (lastResult = status);

+        else

+            return status;

+    }

+

+protected:

+    GpCustomLineCap* nativeCap;

+    mutable Status lastResult;

+};

+

+class CachedBitmap : public GdiplusBase

+{

+    friend Graphics;

+

+public:

+    CachedBitmap(IN Bitmap *bitmap,

+                 IN Graphics *graphics);

+    virtual ~CachedBitmap();

+

+    Status GetLastStatus() const;

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    CachedBitmap(const CachedBitmap &);

+    CachedBitmap& operator=(const CachedBitmap &);

+

+#endif

+

+protected:

+    GpCachedBitmap *nativeCachedBitmap;

+    mutable Status lastResult;

+};

+

+#endif  // !_GDIPLUSHEADERS.HPP

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h b/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h
new file mode 100644
index 0000000..e9c02de
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h
@@ -0,0 +1,73 @@
+/**************************************************************************\

+*

+* Copyright (c) 2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusImageCodec.h

+*

+* Abstract:

+*

+*   APIs for imaging codecs.

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSIMAGECODEC_H

+#define _GDIPLUSIMAGECODEC_H

+

+//--------------------------------------------------------------------------

+// Codec Management APIs

+//--------------------------------------------------------------------------

+

+inline Status 

+GetImageDecodersSize(

+    OUT UINT *numDecoders,

+    OUT UINT *size)

+{

+    return DllExports::GdipGetImageDecodersSize(numDecoders, size);

+}

+

+

+inline Status 

+GetImageDecoders(

+    IN UINT numDecoders,

+    IN UINT size,

+    OUT ImageCodecInfo *decoders)

+{

+    return DllExports::GdipGetImageDecoders(numDecoders, size, decoders);

+}

+

+

+inline Status 

+GetImageEncodersSize(

+    OUT UINT *numEncoders, 

+    OUT UINT *size)

+{

+    return DllExports::GdipGetImageEncodersSize(numEncoders, size);

+}

+

+

+inline Status 

+GetImageEncoders(

+    IN UINT numEncoders,

+    IN UINT size,

+    OUT ImageCodecInfo *encoders)

+{

+    return DllExports::GdipGetImageEncoders(numEncoders, size, encoders);

+}

+

+inline Status 

+AddImageCodec(

+    IN const ImageCodecInfo* codec)

+{

+    return DllExports::GdipAddImageCodec(codec);

+}

+

+inline Status 

+RemoveImageCodec(

+    IN const ImageCodecInfo* codec)

+{

+    return DllExports::GdipRemoveImageCodec(codec);

+}

+

+#endif  // _GDIPLUSIMAGECODEC_H

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h b/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h
new file mode 100644
index 0000000..35dd4d0
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h
@@ -0,0 +1,540 @@
+/**************************************************************************\

+* 

+* Copyright (c) 1999-2000  Microsoft Corporation

+*

+* Module Name:

+*

+*   GdiplusImaging.h

+*

+* Abstract:

+*

+*   GUIDs defined and used by the imaging library

+*

+\**************************************************************************/

+#ifndef _GDIPLUSIMAGING_H

+#define _GDIPLUSIMAGING_H

+

+//---------------------------------------------------------------------------

+// Image file format identifiers

+//---------------------------------------------------------------------------

+

+DEFINE_GUID(ImageFormatUndefined, 0xb96b3ca9,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+DEFINE_GUID(ImageFormatMemoryBMP, 0xb96b3caa,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+DEFINE_GUID(ImageFormatBMP, 0xb96b3cab,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+DEFINE_GUID(ImageFormatEMF, 0xb96b3cac,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+DEFINE_GUID(ImageFormatWMF, 0xb96b3cad,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+DEFINE_GUID(ImageFormatJPEG, 0xb96b3cae,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+DEFINE_GUID(ImageFormatPNG, 0xb96b3caf,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+DEFINE_GUID(ImageFormatGIF, 0xb96b3cb0,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+DEFINE_GUID(ImageFormatTIFF, 0xb96b3cb1,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+DEFINE_GUID(ImageFormatEXIF, 0xb96b3cb2,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+#ifndef DCR_USE_NEW_140855

+DEFINE_GUID(ImageFormatPhotoCD, 0xb96b3cb3,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+DEFINE_GUID(ImageFormatFlashPIX, 0xb96b3cb4,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+#endif

+DEFINE_GUID(ImageFormatIcon, 0xb96b3cb5,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);

+

+//---------------------------------------------------------------------------

+// Predefined multi-frame dimension IDs

+//---------------------------------------------------------------------------

+

+DEFINE_GUID(FrameDimensionTime, 0x6aedbd6d,0x3fb5,0x418a,0x83,0xa6,0x7f,0x45,0x22,0x9d,0xc8,0x72);

+DEFINE_GUID(FrameDimensionResolution, 0x84236f7b,0x3bd3,0x428f,0x8d,0xab,0x4e,0xa1,0x43,0x9c,0xa3,0x15);

+DEFINE_GUID(FrameDimensionPage, 0x7462dc86,0x6180,0x4c7e,0x8e,0x3f,0xee,0x73,0x33,0xa7,0xa4,0x83);

+

+//---------------------------------------------------------------------------

+// Property sets

+//---------------------------------------------------------------------------

+

+DEFINE_GUID(FormatIDImageInformation, 0xe5836cbe,0x5eef,0x4f1d,0xac,0xde,0xae,0x4c,0x43,0xb6,0x08,0xce);

+DEFINE_GUID(FormatIDJpegAppHeaders, 0x1c4afdcd,0x6177,0x43cf,0xab,0xc7,0x5f,0x51,0xaf,0x39,0xee,0x85);

+

+#ifndef DCR_USE_NEW_140855

+//---------------------------------------------------------------------------

+// Decoder parameter sets

+//---------------------------------------------------------------------------

+DEFINE_GUID(DecoderTransColor, 0xb7a98c8f,0xdce7,0x457d,0xbf,0xa5,0xce,0xa7,0x1b,0xd1,0x4d,0xd6);

+DEFINE_GUID(DecoderTransRange, 0xabeed189,0xd988,0x4d03,0xb4,0x25,0x57,0x10,0x55,0xc7,0x6a,0xd1);

+DEFINE_GUID(DecoderOutputChannel, 0x2ff8f51e,0x724d,0x45fe,0x86,0xce,0x17,0x77,0xa0,0x56,0xda,0x60);

+DEFINE_GUID(DecoderIconRes, 0x5c656eec,0xe94f,0x45ba,0xa6,0xf6,0x10,0x62,0xe8,0x5f,0x4a,0x7f);

+#endif

+

+//---------------------------------------------------------------------------

+// Encoder parameter sets

+//---------------------------------------------------------------------------

+

+DEFINE_GUID(EncoderCompression, 0xe09d739d,0xccd4,0x44ee,0x8e,0xba,0x3f,0xbf,0x8b,0xe4,0xfc,0x58);

+DEFINE_GUID(EncoderColorDepth, 0x66087055,0xad66,0x4c7c,0x9a,0x18,0x38,0xa2,0x31,0x0b,0x83,0x37);

+DEFINE_GUID(EncoderScanMethod, 0x3a4e2661,0x3109,0x4e56,0x85,0x36,0x42,0xc1,0x56,0xe7,0xdc,0xfa);

+DEFINE_GUID(EncoderVersion, 0x24d18c76,0x814a,0x41a4,0xbf,0x53,0x1c,0x21,0x9c,0xcc,0xf7,0x97);

+DEFINE_GUID(EncoderRenderMethod, 0x6d42c53a,0x229a,0x4825,0x8b,0xb7,0x5c,0x99,0xe2,0xb9,0xa8,0xb8);

+DEFINE_GUID(EncoderQuality, 0x1d5be4b5,0xfa4a,0x452d,0x9c,0xdd,0x5d,0xb3,0x51,0x05,0xe7,0xeb);

+DEFINE_GUID(EncoderTransformation,0x8d0eb2d1,0xa58e,0x4ea8,0xaa,0x14,0x10,0x80,0x74,0xb7,0xb6,0xf9);

+DEFINE_GUID(EncoderLuminanceTable,0xedb33bce,0x0266,0x4a77,0xb9,0x04,0x27,0x21,0x60,0x99,0xe7,0x17);

+DEFINE_GUID(EncoderChrominanceTable,0xf2e455dc,0x09b3,0x4316,0x82,0x60,0x67,0x6a,0xda,0x32,0x48,0x1c);

+DEFINE_GUID(EncoderSaveFlag,0x292266fc,0xac40,0x47bf,0x8c, 0xfc, 0xa8, 0x5b, 0x89, 0xa6, 0x55, 0xde);

+

+DEFINE_GUID(CodecIImageBytes,0x025d1823,0x6c7d,0x447b,0xbb, 0xdb, 0xa3, 0xcb, 0xc3, 0xdf, 0xa2, 0xfc);

+

+MIDL_INTERFACE("025D1823-6C7D-447B-BBDB-A3CBC3DFA2FC")

+IImageBytes : public IUnknown

+{

+public:

+    // Return total number of bytes in the IStream

+

+    STDMETHOD(CountBytes)(

+        OUT UINT *pcb

+        ) = 0;

+    

+    // Locks "cb" bytes, starting from "ulOffset" in the stream, and returns the

+    // pointer to the beginning of the locked memory chunk in "ppvBytes"

+

+    STDMETHOD(LockBytes)(

+        IN UINT cb,

+        IN ULONG ulOffset,

+        OUT const VOID ** ppvBytes

+        ) = 0;

+

+    // Unlocks "cb" bytes, pointed by "pvBytes", starting from "ulOffset" in the

+    // stream

+

+    STDMETHOD(UnlockBytes)(

+        IN const VOID *pvBytes,

+        IN UINT cb,

+        IN ULONG ulOffset

+        ) = 0;

+};

+

+//--------------------------------------------------------------------------

+// ImageCodecInfo structure

+//--------------------------------------------------------------------------

+

+class ImageCodecInfo

+{

+public:          

+    CLSID Clsid;

+    GUID  FormatID;

+    const WCHAR* CodecName;

+    const WCHAR* DllName;

+    const WCHAR* FormatDescription;

+    const WCHAR* FilenameExtension;

+    const WCHAR* MimeType;

+    DWORD Flags;

+    DWORD Version;

+    DWORD SigCount;

+    DWORD SigSize;

+    const BYTE* SigPattern;

+    const BYTE* SigMask;

+};

+

+//--------------------------------------------------------------------------

+// Information flags about image codecs

+//--------------------------------------------------------------------------

+

+enum ImageCodecFlags

+{

+    ImageCodecFlagsEncoder            = 0x00000001,

+    ImageCodecFlagsDecoder            = 0x00000002,

+    ImageCodecFlagsSupportBitmap      = 0x00000004,

+    ImageCodecFlagsSupportVector      = 0x00000008,

+    ImageCodecFlagsSeekableEncode     = 0x00000010,

+    ImageCodecFlagsBlockingDecode     = 0x00000020,

+

+    ImageCodecFlagsBuiltin            = 0x00010000,

+    ImageCodecFlagsSystem             = 0x00020000,

+    ImageCodecFlagsUser               = 0x00040000

+};

+

+//---------------------------------------------------------------------------

+// Access modes used when calling Image::LockBits

+//---------------------------------------------------------------------------

+

+enum ImageLockMode

+{

+    ImageLockModeRead        = 0x0001,

+    ImageLockModeWrite       = 0x0002,

+    ImageLockModeUserInputBuf= 0x0004

+};

+

+//---------------------------------------------------------------------------

+// Information about image pixel data

+//---------------------------------------------------------------------------

+

+class BitmapData

+{

+public:

+    UINT Width;

+    UINT Height;

+    INT Stride;

+    PixelFormat PixelFormat;

+    VOID* Scan0;

+    UINT_PTR Reserved;

+};

+

+//---------------------------------------------------------------------------

+// Image flags

+//---------------------------------------------------------------------------

+

+enum ImageFlags

+{

+    ImageFlagsNone                = 0,

+

+    // Low-word: shared with SINKFLAG_x

+

+    ImageFlagsScalable            = 0x0001,

+    ImageFlagsHasAlpha            = 0x0002,

+    ImageFlagsHasTranslucent      = 0x0004,

+    ImageFlagsPartiallyScalable   = 0x0008,

+

+    // Low-word: color space definition

+

+    ImageFlagsColorSpaceRGB       = 0x0010,

+    ImageFlagsColorSpaceCMYK      = 0x0020,

+    ImageFlagsColorSpaceGRAY      = 0x0040,

+    ImageFlagsColorSpaceYCBCR     = 0x0080,

+    ImageFlagsColorSpaceYCCK      = 0x0100,

+ 

+    // Low-word: image size info

+

+    ImageFlagsHasRealDPI          = 0x1000,

+    ImageFlagsHasRealPixelSize    = 0x2000,

+

+    // High-word

+

+    ImageFlagsReadOnly            = 0x00010000,

+    ImageFlagsCaching             = 0x00020000

+};

+

+enum RotateFlipType

+{

+    RotateNoneFlipNone = 0,

+    Rotate90FlipNone   = 1,

+    Rotate180FlipNone  = 2,

+    Rotate270FlipNone  = 3,

+

+    RotateNoneFlipX    = 4,

+    Rotate90FlipX      = 5,

+    Rotate180FlipX     = 6,

+    Rotate270FlipX     = 7,

+

+    RotateNoneFlipY    = Rotate180FlipX,

+    Rotate90FlipY      = Rotate270FlipX,

+    Rotate180FlipY     = RotateNoneFlipX,

+    Rotate270FlipY     = Rotate90FlipX,

+

+    RotateNoneFlipXY   = Rotate180FlipNone,

+    Rotate90FlipXY     = Rotate270FlipNone,

+    Rotate180FlipXY    = RotateNoneFlipNone,

+    Rotate270FlipXY    = Rotate90FlipNone

+};

+

+//---------------------------------------------------------------------------

+// Encoder Parameter structure

+//---------------------------------------------------------------------------

+class EncoderParameter

+{

+public:

+    GUID    Guid;               // GUID of the parameter

+    ULONG   NumberOfValues;     // Number of the parameter values

+    ULONG   Type;               // Value type, like ValueTypeLONG  etc.

+    VOID*   Value;              // A pointer to the parameter values

+};

+

+//---------------------------------------------------------------------------

+// Encoder Parameters structure

+//---------------------------------------------------------------------------

+class EncoderParameters

+{

+public:

+    UINT Count;                      // Number of parameters in this structure

+    EncoderParameter Parameter[1];   // Parameter values

+};

+

+//---------------------------------------------------------------------------

+// Property Item

+//---------------------------------------------------------------------------

+class PropertyItem

+{

+public:

+    PROPID  id;                 // ID of this property

+    ULONG   length;             // Length of the property value, in bytes

+    WORD    type;               // Type of the value, as one of TAG_TYPE_XXX

+                                // defined above

+    VOID*   value;              // property value

+};

+

+#ifdef DCR_USE_NEW_140857

+//---------------------------------------------------------------------------

+// Image property types 

+//---------------------------------------------------------------------------

+#define PropertyTagTypeByte        1

+#define PropertyTagTypeASCII       2

+#define PropertyTagTypeShort       3

+#define PropertyTagTypeLong        4

+#define PropertyTagTypeRational    5

+#define PropertyTagTypeUndefined   7

+#define PropertyTagTypeSLONG       9

+#define PropertyTagTypeSRational  10

+#endif

+

+//---------------------------------------------------------------------------

+// Image property ID tags

+//---------------------------------------------------------------------------

+

+#define PropertyTagExifIFD             0x8769

+#define PropertyTagGpsIFD              0x8825

+

+#define PropertyTagNewSubfileType      0x00FE

+#define PropertyTagSubfileType         0x00FF

+#define PropertyTagImageWidth          0x0100

+#define PropertyTagImageHeight         0x0101

+#define PropertyTagBitsPerSample       0x0102

+#define PropertyTagCompression         0x0103

+#define PropertyTagPhotometricInterp   0x0106

+#define PropertyTagThreshHolding       0x0107

+#define PropertyTagCellWidth           0x0108

+#define PropertyTagCellHeight          0x0109

+#define PropertyTagFillOrder           0x010A

+#define PropertyTagDocumentName        0x010D

+#define PropertyTagImageDescription    0x010E

+#define PropertyTagEquipMake           0x010F

+#define PropertyTagEquipModel          0x0110

+#define PropertyTagStripOffsets        0x0111

+#define PropertyTagOrientation         0x0112

+#define PropertyTagSamplesPerPixel     0x0115

+#define PropertyTagRowsPerStrip        0x0116

+#define PropertyTagStripBytesCount     0x0117

+#define PropertyTagMinSampleValue      0x0118

+#define PropertyTagMaxSampleValue      0x0119

+#define PropertyTagXResolution         0x011A   // Image resolution in width direction

+#define PropertyTagYResolution         0x011B   // Image resolution in height direction

+#define PropertyTagPlanarConfig        0x011C   // Image data arrangement

+#define PropertyTagPageName            0x011D

+#define PropertyTagXPosition           0x011E

+#define PropertyTagYPosition           0x011F

+#define PropertyTagFreeOffset          0x0120

+#define PropertyTagFreeByteCounts      0x0121

+#define PropertyTagGrayResponseUnit    0x0122

+#define PropertyTagGrayResponseCurve   0x0123

+#define PropertyTagT4Option            0x0124

+#define PropertyTagT6Option            0x0125

+#define PropertyTagResolutionUnit      0x0128   // Unit of X and Y resolution

+#define PropertyTagPageNumber          0x0129

+#define PropertyTagTransferFuncition   0x012D

+#define PropertyTagSoftwareUsed        0x0131

+#define PropertyTagDateTime            0x0132

+#define PropertyTagArtist              0x013B

+#define PropertyTagHostComputer        0x013C

+#define PropertyTagPredictor           0x013D

+#define PropertyTagWhitePoint          0x013E

+#define PropertyTagPrimaryChromaticities 0x013F

+#define PropertyTagColorMap            0x0140

+#define PropertyTagHalftoneHints       0x0141

+#define PropertyTagTileWidth           0x0142

+#define PropertyTagTileLength          0x0143

+#define PropertyTagTileOffset          0x0144

+#define PropertyTagTileByteCounts      0x0145

+#define PropertyTagInkSet              0x014C

+#define PropertyTagInkNames            0x014D

+#define PropertyTagNumberOfInks        0x014E

+#define PropertyTagDotRange            0x0150

+#define PropertyTagTargetPrinter       0x0151

+#define PropertyTagExtraSamples        0x0152

+#define PropertyTagSampleFormat        0x0153

+#define PropertyTagSMinSampleValue     0x0154

+#define PropertyTagSMaxSampleValue     0x0155

+#define PropertyTagTransferRange       0x0156

+

+#define PropertyTagJPEGProc            0x0200

+#define PropertyTagJPEGInterFormat     0x0201

+#define PropertyTagJPEGInterLength     0x0202

+#define PropertyTagJPEGRestartInterval 0x0203

+#define PropertyTagJPEGLosslessPredictors  0x0205

+#define PropertyTagJPEGPointTransforms     0x0206

+#define PropertyTagJPEGQTables         0x0207

+#define PropertyTagJPEGDCTables        0x0208

+#define PropertyTagJPEGACTables        0x0209

+

+#define PropertyTagYCbCrCoefficients   0x0211

+#define PropertyTagYCbCrSubsampling    0x0212

+#define PropertyTagYCbCrPositioning    0x0213

+#define PropertyTagREFBlackWhite       0x0214

+

+#define PropertyTagICCProfile          0x8773   // This TAG is defined by ICC

+                                                // for embedded ICC in TIFF

+#define PropertyTagGamma               0x0301

+#define PropertyTagICCProfileDescriptor 0x0302

+#define PropertyTagSRGBRenderingIntent 0x0303

+

+#define PropertyTagImageTitle          0x0320

+#define PropertyTagCopyright           0x8298

+

+// Extra TAGs (Like Adobe Image Information tags etc.)

+

+#define PropertyTagResolutionXUnit           0x5001

+#define PropertyTagResolutionYUnit           0x5002

+#define PropertyTagResolutionXLengthUnit     0x5003

+#define PropertyTagResolutionYLengthUnit     0x5004

+#define PropertyTagPrintFlags                0x5005

+#define PropertyTagPrintFlagsVersion         0x5006

+#define PropertyTagPrintFlagsCrop            0x5007

+#define PropertyTagPrintFlagsBleedWidth      0x5008

+#define PropertyTagPrintFlagsBleedWidthScale 0x5009

+#define PropertyTagHalftoneLPI               0x500A

+#define PropertyTagHalftoneLPIUnit           0x500B

+#define PropertyTagHalftoneDegree            0x500C

+#define PropertyTagHalftoneShape             0x500D

+#define PropertyTagHalftoneMisc              0x500E

+#define PropertyTagHalftoneScreen            0x500F

+#define PropertyTagJPEGQuality               0x5010

+#define PropertyTagGridSize                  0x5011

+#define PropertyTagThumbnailFormat           0x5012  // 1 = JPEG, 0 = RAW RGB

+#define PropertyTagThumbnailWidth            0x5013

+#define PropertyTagThumbnailHeight           0x5014

+#define PropertyTagThumbnailColorDepth       0x5015

+#define PropertyTagThumbnailPlanes           0x5016

+#define PropertyTagThumbnailRawBytes         0x5017

+#define PropertyTagThumbnailSize             0x5018

+#define PropertyTagThumbnailCompressedSize   0x5019

+#define PropertyTagColorTransferFunction     0x501A

+#define PropertyTagThumbnailData             0x501B// RAW thumbnail bits in

+                                                   // JPEG format or RGB format

+                                                   // depends on

+                                                   // PropertyTagThumbnailFormat

+

+// Thumbnail related TAGs

+                                                

+#define PropertyTagThumbnailImageWidth       0x5020  // Thumbnail width

+#define PropertyTagThumbnailImageHeight      0x5021  // Thumbnail height

+#define PropertyTagThumbnailBitsPerSample    0x5022  // Number of bits per

+                                                     // component

+#define PropertyTagThumbnailCompression      0x5023  // Compression Scheme

+#define PropertyTagThumbnailPhotometricInterp 0x5024 // Pixel composition

+#define PropertyTagThumbnailImageDescription 0x5025  // Image Tile

+#define PropertyTagThumbnailEquipMake        0x5026  // Manufacturer of Image

+                                                     // Input equipment

+#define PropertyTagThumbnailEquipModel       0x5027  // Model of Image input

+                                                     // equipment

+#define PropertyTagThumbnailStripOffsets     0x5028  // Image data location

+#define PropertyTagThumbnailOrientation      0x5029  // Orientation of image

+#define PropertyTagThumbnailSamplesPerPixel  0x502A  // Number of components

+#define PropertyTagThumbnailRowsPerStrip     0x502B  // Number of rows per strip

+#define PropertyTagThumbnailStripBytesCount  0x502C  // Bytes per compressed

+                                                     // strip

+#define PropertyTagThumbnailResolutionX      0x502D  // Resolution in width

+                                                     // direction

+#define PropertyTagThumbnailResolutionY      0x502E  // Resolution in height

+                                                     // direction

+#define PropertyTagThumbnailPlanarConfig     0x502F  // Image data arrangement

+#define PropertyTagThumbnailResolutionUnit   0x5030  // Unit of X and Y

+                                                     // Resolution

+#define PropertyTagThumbnailTransferFunction 0x5031  // Transfer function

+#define PropertyTagThumbnailSoftwareUsed     0x5032  // Software used

+#define PropertyTagThumbnailDateTime         0x5033  // File change date and

+                                                     // time

+#define PropertyTagThumbnailArtist           0x5034  // Person who created the

+                                                     // image

+#define PropertyTagThumbnailWhitePoint       0x5035  // White point chromaticity

+#define PropertyTagThumbnailPrimaryChromaticities 0x5036 

+                                                     // Chromaticities of

+                                                     // primaries

+#define PropertyTagThumbnailYCbCrCoefficients 0x5037 // Color space transforma-

+                                                     // tion coefficients

+#define PropertyTagThumbnailYCbCrSubsampling 0x5038  // Subsampling ratio of Y

+                                                     // to C

+#define PropertyTagThumbnailYCbCrPositioning 0x5039  // Y and C position

+#define PropertyTagThumbnailRefBlackWhite    0x503A  // Pair of black and white

+                                                     // reference values

+#define PropertyTagThumbnailCopyRight        0x503B  // CopyRight holder

+

+#define PropertyTagLuminanceTable            0x5090

+#define PropertyTagChrominanceTable          0x5091

+

+#define PropertyTagFrameDelay                0x5100

+#define PropertyTagLoopCount                 0x5101

+

+#define PropertyTagPixelUnit         0x5110  // Unit specifier for pixel/unit

+#define PropertyTagPixelPerUnitX     0x5111  // Pixels per unit in X

+#define PropertyTagPixelPerUnitY     0x5112  // Pixels per unit in Y

+#define PropertyTagPaletteHistogram  0x5113  // Palette histogram

+

+// EXIF specific tag

+

+#define PropertyTagExifExposureTime  0x829A

+#define PropertyTagExifFNumber       0x829D

+

+#define PropertyTagExifExposureProg  0x8822

+#define PropertyTagExifSpectralSense 0x8824

+#define PropertyTagExifISOSpeed      0x8827

+#define PropertyTagExifOECF          0x8828

+

+#define PropertyTagExifVer            0x9000

+#define PropertyTagExifDTOrig         0x9003 // Date & time of original

+#define PropertyTagExifDTDigitized    0x9004 // Date & time of digital data generation

+

+#define PropertyTagExifCompConfig     0x9101

+#define PropertyTagExifCompBPP        0x9102

+

+#define PropertyTagExifShutterSpeed   0x9201

+#define PropertyTagExifAperture       0x9202

+#define PropertyTagExifBrightness     0x9203

+#define PropertyTagExifExposureBias   0x9204

+#define PropertyTagExifMaxAperture    0x9205

+#define PropertyTagExifSubjectDist    0x9206

+#define PropertyTagExifMeteringMode   0x9207

+#define PropertyTagExifLightSource    0x9208

+#define PropertyTagExifFlash          0x9209

+#define PropertyTagExifFocalLength    0x920A

+#define PropertyTagExifMakerNote      0x927C

+#define PropertyTagExifUserComment    0x9286

+#define PropertyTagExifDTSubsec       0x9290  // Date & Time subseconds

+#define PropertyTagExifDTOrigSS       0x9291  // Date & Time original subseconds

+#define PropertyTagExifDTDigSS        0x9292  // Date & TIme digitized subseconds

+

+#define PropertyTagExifFPXVer         0xA000

+#define PropertyTagExifColorSpace     0xA001

+#define PropertyTagExifPixXDim        0xA002

+#define PropertyTagExifPixYDim        0xA003

+#define PropertyTagExifRelatedWav     0xA004  // related sound file

+#define PropertyTagExifInterop        0xA005

+#define PropertyTagExifFlashEnergy    0xA20B

+#define PropertyTagExifSpatialFR      0xA20C  // Spatial Frequency Response

+#define PropertyTagExifFocalXRes      0xA20E  // Focal Plane X Resolution

+#define PropertyTagExifFocalYRes      0xA20F  // Focal Plane Y Resolution

+#define PropertyTagExifFocalResUnit   0xA210  // Focal Plane Resolution Unit

+#define PropertyTagExifSubjectLoc     0xA214

+#define PropertyTagExifExposureIndex  0xA215

+#define PropertyTagExifSensingMethod  0xA217

+#define PropertyTagExifFileSource     0xA300

+#define PropertyTagExifSceneType      0xA301

+#define PropertyTagExifCfaPattern     0xA302

+

+#define PropertyTagGpsVer             0x0000

+#define PropertyTagGpsLatitudeRef     0x0001

+#define PropertyTagGpsLatitude        0x0002

+#define PropertyTagGpsLongitudeRef    0x0003

+#define PropertyTagGpsLongitude       0x0004

+#define PropertyTagGpsAltitudeRef     0x0005

+#define PropertyTagGpsAltitude        0x0006

+#define PropertyTagGpsGpsTime         0x0007

+#define PropertyTagGpsGpsSatellites   0x0008

+#define PropertyTagGpsGpsStatus       0x0009

+#define PropertyTagGpsGpsMeasureMode  0x00A

+#define PropertyTagGpsGpsDop          0x000B  // Measurement precision

+#define PropertyTagGpsSpeedRef        0x000C

+#define PropertyTagGpsSpeed           0x000D

+#define PropertyTagGpsTrackRef        0x000E

+#define PropertyTagGpsTrack           0x000F

+#define PropertyTagGpsImgDirRef       0x0010

+#define PropertyTagGpsImgDir          0x0011

+#define PropertyTagGpsMapDatum        0x0012

+#define PropertyTagGpsDestLatRef      0x0013

+#define PropertyTagGpsDestLat         0x0014

+#define PropertyTagGpsDestLongRef     0x0015

+#define PropertyTagGpsDestLong        0x0016

+#define PropertyTagGpsDestBearRef     0x0017

+#define PropertyTagGpsDestBear        0x0018

+#define PropertyTagGpsDestDistRef     0x0019

+#define PropertyTagGpsDestDist        0x001A

+

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h b/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h
new file mode 100644
index 0000000..e8a2951
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h
@@ -0,0 +1,253 @@
+/**************************************************************************\

+* 

+* Copyright (c) 2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+* 

+*    GdiplusLineCaps.h

+*

+* Abstract:

+*

+*   APIs for Custom Line Caps

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSLINECAPS_H

+#define _GDIPLUSLINECAPS_H

+

+inline 

+CustomLineCap::CustomLineCap(

+    IN const GraphicsPath* fillPath,

+    IN const GraphicsPath* strokePath,

+    IN LineCap baseCap,

+    IN REAL baseInset

+    )

+{

+    nativeCap = NULL;

+    GpPath* nativeFillPath = NULL;

+    GpPath* nativeStrokePath = NULL;

+

+    if(fillPath)

+        nativeFillPath = fillPath->nativePath;

+    if(strokePath)

+        nativeStrokePath = strokePath->nativePath;

+

+    lastResult = DllExports::GdipCreateCustomLineCap(

+                    nativeFillPath, nativeStrokePath,

+                    baseCap, baseInset, &nativeCap);

+}

+

+inline 

+CustomLineCap::CustomLineCap()

+{

+    // This is used for default constructor for subclasses.

+    // So don't create a nativeCap.

+

+    nativeCap = NULL;

+    lastResult = Ok;

+}

+

+inline 

+CustomLineCap::~CustomLineCap()

+{

+    DllExports::GdipDeleteCustomLineCap(nativeCap);

+}

+

+inline Status 

+CustomLineCap::SetStrokeCaps(

+    IN LineCap startCap, 

+    IN LineCap endCap)

+{

+    return SetStatus(DllExports::GdipSetCustomLineCapStrokeCaps(nativeCap,

+                startCap, endCap));

+}

+

+inline Status 

+CustomLineCap::GetStrokeCaps(

+    OUT LineCap* startCap, 

+    OUT LineCap* endCap) const

+{

+    return SetStatus(DllExports::GdipGetCustomLineCapStrokeCaps(nativeCap,

+                 startCap, endCap));

+}

+

+inline Status 

+CustomLineCap::SetStrokeJoin(

+    IN LineJoin lineJoin)

+{

+    return SetStatus(DllExports::GdipSetCustomLineCapStrokeJoin(nativeCap, lineJoin));

+}

+

+inline LineJoin 

+CustomLineCap::GetStrokeJoin() const

+{

+    LineJoin lineJoin;

+

+    SetStatus(DllExports::GdipGetCustomLineCapStrokeJoin(nativeCap, &lineJoin));

+

+    return lineJoin;

+}

+

+inline Status 

+CustomLineCap::SetBaseCap(IN LineCap baseCap)

+{

+    return SetStatus(DllExports::GdipSetCustomLineCapBaseCap(nativeCap, baseCap));

+}

+

+inline LineCap 

+CustomLineCap::GetBaseCap() const

+{

+    LineCap baseCap;

+    SetStatus(DllExports::GdipGetCustomLineCapBaseCap(nativeCap, &baseCap));

+

+    return baseCap;

+}

+

+inline Status 

+CustomLineCap::SetBaseInset(IN REAL inset)

+{

+    return SetStatus(DllExports::GdipSetCustomLineCapBaseInset(nativeCap, inset));

+}

+

+inline REAL 

+CustomLineCap::GetBaseInset() const

+{

+    REAL inset;

+    SetStatus(DllExports::GdipGetCustomLineCapBaseInset(nativeCap, &inset));

+

+    return inset;

+}

+

+

+inline Status 

+CustomLineCap::SetWidthScale(IN REAL widthScale)

+{

+    return SetStatus(DllExports::GdipSetCustomLineCapWidthScale(nativeCap, widthScale));

+}

+

+inline REAL 

+CustomLineCap::GetWidthScale() const

+{

+    REAL widthScale;

+    SetStatus(DllExports::GdipGetCustomLineCapWidthScale(nativeCap, &widthScale));

+

+    return widthScale;

+}

+

+inline CustomLineCap* 

+CustomLineCap::Clone() const

+{

+    GpCustomLineCap *newNativeLineCap = NULL;

+    

+    SetStatus(DllExports::GdipCloneCustomLineCap(nativeCap, &newNativeLineCap));

+

+    if (lastResult == Ok) 

+    {

+        CustomLineCap *newLineCap = new CustomLineCap(newNativeLineCap, lastResult);

+        if (newLineCap == NULL) 

+        {

+            SetStatus(DllExports::GdipDeleteCustomLineCap(newNativeLineCap));

+        }

+

+        return newLineCap;

+    }

+

+    return NULL;

+}

+

+class AdjustableArrowCap : public CustomLineCap

+{

+public:

+

+    AdjustableArrowCap(

+        IN REAL height,

+        IN REAL width,

+        IN BOOL isFilled = TRUE

+        )

+    {

+        GpAdjustableArrowCap* cap = NULL;

+

+        lastResult = DllExports::GdipCreateAdjustableArrowCap(

+                        height, width, isFilled, &cap);

+        SetNativeCap(cap);

+    }

+

+    Status SetHeight(IN REAL height)

+    {

+        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;

+        return SetStatus(DllExports::GdipSetAdjustableArrowCapHeight(

+                            cap, height));

+    }

+

+    REAL GetHeight() const

+    {

+        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;

+        REAL height;

+        SetStatus(DllExports::GdipGetAdjustableArrowCapHeight(

+                            cap, &height));

+

+        return height;

+    }

+

+    Status SetWidth(IN REAL width)

+    {

+        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;

+        return SetStatus(DllExports::GdipSetAdjustableArrowCapWidth(

+                            cap, width));

+    }

+

+    REAL GetWidth() const

+    {

+        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;

+        REAL width;

+        SetStatus(DllExports::GdipGetAdjustableArrowCapWidth(

+                            cap, &width));

+

+        return width;

+    }

+

+    Status SetMiddleInset(IN REAL middleInset)

+    {

+        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;

+        return SetStatus(DllExports::GdipSetAdjustableArrowCapMiddleInset(

+                            cap, middleInset));

+    }

+

+    REAL GetMiddleInset() const

+    {

+        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;

+        REAL middleInset;

+        SetStatus(DllExports::GdipGetAdjustableArrowCapMiddleInset(

+                            cap, &middleInset));

+

+        return middleInset;

+    }

+

+    Status SetFillState(IN BOOL isFilled)

+    {

+        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;

+        return SetStatus(DllExports::GdipSetAdjustableArrowCapFillState(

+                            cap, isFilled));

+    }

+

+    BOOL IsFilled() const

+    {

+        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;

+        BOOL isFilled;

+        SetStatus(DllExports::GdipGetAdjustableArrowCapFillState(

+                            cap, &isFilled));

+

+        return isFilled;

+    }

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    AdjustableArrowCap(const AdjustableArrowCap &);

+    AdjustableArrowCap& operator=(const AdjustableArrowCap &);

+

+#endif

+

+};

+

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h
new file mode 100644
index 0000000..7fa3df8
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h
@@ -0,0 +1,309 @@
+/**************************************************************************\

+* 

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusMatrix.h

+*

+* Abstract:

+*

+*   GDI+ Matrix class

+*

+\**************************************************************************/

+

+class Matrix : public GdiplusBase

+{

+public:

+    friend class Graphics;

+    friend class GraphicsPath;

+    friend class TextureBrush;

+    friend class LinearGradientBrush;

+    friend class PathGradientBrush;

+    friend class Pen;

+    friend class Region;

+    

+    // Default constructor - set to identity matrix

+

+    Matrix()

+    {

+        GpMatrix *matrix = NULL;

+

+        lastResult = DllExports::GdipCreateMatrix(&matrix);

+    

+        SetNativeMatrix(matrix);

+    }

+

+    Matrix(IN REAL m11, 

+           IN REAL m12,

+           IN REAL m21, 

+           IN REAL m22,

+           IN REAL dx, 

+           IN REAL dy)

+    {

+        GpMatrix *matrix = NULL;

+

+        lastResult = DllExports::GdipCreateMatrix2(m11, m12, m21, m22, 

+                                                      dx, dy, &matrix);

+    

+        SetNativeMatrix(matrix);

+    }

+    

+    Matrix(IN const RectF& rect, 

+           IN const PointF* dstplg)

+    {

+        GpMatrix *matrix = NULL;

+

+        lastResult = DllExports::GdipCreateMatrix3(&rect, 

+                                                   dstplg,

+                                                   &matrix);

+

+        SetNativeMatrix(matrix);

+    }

+

+    Matrix(IN const Rect& rect, 

+           IN const Point* dstplg)

+    {

+        GpMatrix *matrix = NULL;

+

+        lastResult = DllExports::GdipCreateMatrix3I(&rect, 

+                                                    dstplg,

+                                                    &matrix);

+

+        SetNativeMatrix(matrix);

+    }

+

+    ~Matrix()

+    {

+        DllExports::GdipDeleteMatrix(nativeMatrix);

+    }

+

+    Matrix *Clone() const

+    {

+        GpMatrix *cloneMatrix = NULL;

+

+        SetStatus(DllExports::GdipCloneMatrix(nativeMatrix,

+                                                  &cloneMatrix));

+

+        if (lastResult != Ok)

+            return NULL;

+

+        return new Matrix(cloneMatrix);

+    }

+

+    Status GetElements(OUT REAL *m) const 

+    {

+        return SetStatus(DllExports::GdipGetMatrixElements(nativeMatrix, m));

+    }

+    

+    Status SetElements(IN REAL m11, 

+                       IN REAL m12, 

+                       IN REAL m21, 

+                       IN REAL m22, 

+                       IN REAL dx, 

+                       IN REAL dy)

+    {

+        return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix,

+                            m11, m12, m21, m22, dx, dy));

+    }

+

+    REAL OffsetX() const

+    {

+        REAL elements[6];

+

+        if (GetElements(&elements[0]) == Ok)

+            return elements[4];

+        else 

+            return 0.0f;

+    }

+

+    REAL OffsetY() const

+    {

+       REAL elements[6];

+

+       if (GetElements(&elements[0]) == Ok)

+           return elements[5];

+       else 

+           return 0.0f;

+    }

+

+    Status Reset()

+    {

+        // set identity matrix elements 

+        return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix,

+                                             1.0, 0.0, 0.0, 1.0, 0.0, 0.0));

+    }

+

+    Status Multiply(IN const Matrix *matrix, 

+                    IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipMultiplyMatrix(nativeMatrix, 

+                                          matrix->nativeMatrix,

+                                          order));

+    }

+

+    Status Translate(IN REAL offsetX, 

+                     IN REAL offsetY, 

+                     IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, offsetX, offsetY, order));

+    }

+

+    Status Scale(IN REAL scaleX, 

+                 IN REAL scaleY, 

+                 IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipScaleMatrix(nativeMatrix, scaleX, scaleY, order));

+    }

+

+    Status Rotate(IN REAL angle, 

+                  IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));

+    }

+    

+    Status RotateAt(IN REAL angle, 

+                    IN const PointF& center, 

+                    IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        if(order == MatrixOrderPrepend)

+        {

+            SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, center.Y, order));

+            SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));

+            return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, - center.X, - center.Y, order));

+        }

+        else

+        {

+            SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, - center.X, - center.Y, order));

+            SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));

+            return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, center.Y, order));

+        }

+    }

+

+    Status Shear(IN REAL shearX, 

+                 IN REAL shearY,

+                 IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipShearMatrix(nativeMatrix, shearX, shearY, order));

+    }

+

+    Status Invert()

+    {

+        return SetStatus(DllExports::GdipInvertMatrix(nativeMatrix));

+    }

+

+    // float version

+    Status TransformPoints(IN OUT PointF* pts, 

+                           IN INT count = 1) const

+    {

+        return SetStatus(DllExports::GdipTransformMatrixPoints(nativeMatrix, pts, count));

+    }

+    

+    Status TransformPoints(IN OUT Point* pts, 

+                           IN INT count = 1) const

+    {

+        return SetStatus(DllExports::GdipTransformMatrixPointsI(nativeMatrix, 

+                                                                pts, 

+                                                                count));

+    }

+

+    Status TransformVectors(IN OUT PointF* pts, 

+                            IN INT count = 1) const

+    { 

+        return SetStatus(DllExports::GdipVectorTransformMatrixPoints(nativeMatrix, pts, count));

+    }

+

+    Status TransformVectors(IN OUT Point* pts, 

+                            IN INT count = 1) const

+    { 

+       return SetStatus(DllExports::GdipVectorTransformMatrixPointsI(nativeMatrix, 

+                                                                    pts, 

+                                                                    count));

+    }

+    

+    BOOL IsInvertible() const

+    {

+        BOOL result = FALSE;

+

+        SetStatus(DllExports::GdipIsMatrixInvertible(nativeMatrix, &result));

+    

+        return result;

+    }

+

+    BOOL IsIdentity() const

+    {

+       BOOL result = FALSE;

+

+       SetStatus(DllExports::GdipIsMatrixIdentity(nativeMatrix, &result));

+    

+       return result;

+    }

+

+    BOOL Equals(IN const Matrix *matrix) const

+    {

+       BOOL result = FALSE;

+

+       SetStatus(DllExports::GdipIsMatrixEqual(nativeMatrix,

+                                                 matrix->nativeMatrix, &result));

+   

+       return result;

+    }

+    

+    Status GetLastStatus() const

+    {

+        Status lastStatus = lastResult;

+        lastResult = Ok;

+ 

+        return lastStatus;

+    }

+

+protected:

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    Matrix(const Matrix &);

+    Matrix& operator=(const Matrix &);

+protected:

+

+#else

+

+    Matrix(const Matrix& matrix)

+    {

+        matrix;

+        SetStatus(NotImplemented);

+        SetNativeMatrix(NULL);

+    }

+

+    Matrix& operator=(const Matrix& matrix)

+    {

+        matrix;

+        SetStatus(NotImplemented);

+        return *this;

+    }

+

+#endif

+

+    Matrix(GpMatrix *nativeMatrix)

+    {

+        lastResult = Ok;

+        SetNativeMatrix(nativeMatrix);

+    }

+    

+    VOID SetNativeMatrix(GpMatrix *nativeMatrix)

+    {

+        this->nativeMatrix = nativeMatrix;

+    }

+

+    Status SetStatus(Status status) const

+    {

+        if (status != Ok)

+            return (lastResult = status);

+        else

+            return status;

+    }

+

+protected:

+    GpMatrix *nativeMatrix;

+    mutable Status lastResult;

+};

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h
new file mode 100644
index 0000000..5f92c1e
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h
@@ -0,0 +1,49 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusMem.h

+*

+* Abstract:

+*

+*   Flat GDI+ Memory Allocators - header file

+*

+\**************************************************************************/

+

+// TODO: this file style needs to be made internally consistent with the way

+//       it handles breaking the long argument lists across multiple lines

+

+#ifndef _GDIPLUSMEM_H

+#define _GDIPLUSMEM_H

+

+#define WINGDIPAPI __stdcall

+

+// currently, only C++ wrapper API's force const.

+

+#ifdef _GDIPLUS_H

+#define GDIPCONST const

+#else

+#define GDIPCONST

+#endif

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+//----------------------------------------------------------------------------

+// Memory Allocation APIs

+//----------------------------------------------------------------------------

+

+void* WINGDIPAPI

+GdipAlloc(size_t size);

+

+void WINGDIPAPI

+GdipFree(void* ptr);

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif // !_GDIPLUSMEM_H

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h
new file mode 100644
index 0000000..3d07dd6
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h
@@ -0,0 +1,374 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusMetafile.h

+*

+* Abstract:

+*

+*   Metafile related declarations

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSMETAFILE_H

+#define _GDIPLUSMETAFILE_H

+

+class Metafile : public Image

+{

+public:

+    friend class Image;

+

+    // Read a metafile

+    Metafile()

+    {

+        SetNativeImage(NULL);

+        lastResult = Ok;

+    }

+

+    // Playback a metafile from a HMETAFILE

+    // If deleteWmf is TRUE, then when the metafile is deleted,

+    // the hWmf will also be deleted.  Otherwise, it won't be.

+    Metafile(IN HMETAFILE hWmf,

+             IN const APMFileHeader * apmFileHeader,

+             IN BOOL deleteWmf = FALSE)

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipCreateMetafileFromWmf(hWmf, deleteWmf, apmFileHeader, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Playback a metafile from a HENHMETAFILE

+    // If deleteEmf is TRUE, then when the metafile is deleted,

+    // the hEmf will also be deleted.  Otherwise, it won't be.

+    Metafile(IN HENHMETAFILE hEmf,

+             IN BOOL deleteEmf = FALSE)

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipCreateMetafileFromEmf(hEmf, deleteEmf, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Playback a metafile from a file

+    Metafile(IN const WCHAR* filename)

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipCreateMetafileFromFile(filename, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Playback a WMF metafile from a file

+    Metafile(IN const WCHAR* filename,

+             IN const APMFileHeader * apmFileHeader

+            )

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipCreateMetafileFromWmfFile(filename, apmFileHeader, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Playback a metafile from a stream

+    Metafile(IN IStream* stream)

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipCreateMetafileFromStream(stream, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Record a metafile to memory

+    Metafile(

+        IN HDC                 referenceHdc,

+        IN EmfType             type        = EmfTypeEmfPlusDual,

+        IN const WCHAR *       description = NULL

+        )

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipRecordMetafile(

+                        referenceHdc, type, NULL, MetafileFrameUnitGdi,

+                        description, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Record a metafile to memory

+    Metafile(

+        IN HDC                 referenceHdc,

+        IN const RectF &       frameRect,

+        IN MetafileFrameUnit   frameUnit   = MetafileFrameUnitGdi,

+        IN EmfType             type        = EmfTypeEmfPlusDual,

+        IN const WCHAR *       description = NULL

+        )

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipRecordMetafile(

+                        referenceHdc, type, &frameRect, frameUnit,

+                        description, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Record a metafile to memory

+    Metafile(

+        IN HDC                 referenceHdc,

+        IN const Rect &        frameRect,

+        IN MetafileFrameUnit   frameUnit   = MetafileFrameUnitGdi,

+        IN EmfType             type        = EmfTypeEmfPlusDual,

+        IN const WCHAR *       description = NULL

+        )

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipRecordMetafileI(

+                        referenceHdc, type, &frameRect, frameUnit,

+                        description, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Record a metafile to a file

+    Metafile(

+        IN const WCHAR*        fileName,

+        IN HDC                 referenceHdc,

+        IN EmfType             type        = EmfTypeEmfPlusDual,

+        IN const WCHAR *       description = NULL

+        )

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipRecordMetafileFileName(fileName,

+                        referenceHdc, type, NULL, MetafileFrameUnitGdi,

+                        description, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Record a metafile to a file

+    Metafile(

+        IN const WCHAR*        fileName,

+        IN HDC                 referenceHdc,

+        IN const RectF &       frameRect,

+        IN MetafileFrameUnit   frameUnit   = MetafileFrameUnitGdi,

+        IN EmfType             type        = EmfTypeEmfPlusDual,

+        IN const WCHAR *       description = NULL

+        )

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipRecordMetafileFileName(fileName,

+                        referenceHdc, type, &frameRect, frameUnit,

+                        description, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Record a metafile to a file

+    Metafile(

+        IN const WCHAR*        fileName,

+        IN HDC                 referenceHdc,

+        IN const Rect &        frameRect,

+        IN MetafileFrameUnit   frameUnit   = MetafileFrameUnitGdi,

+        IN EmfType             type        = EmfTypeEmfPlusDual,

+        IN const WCHAR *       description = NULL

+        )

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipRecordMetafileFileNameI(fileName,

+                        referenceHdc, type, &frameRect, frameUnit,

+                        description, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Record a metafile to a stream

+    Metafile(

+        IN IStream *           stream,

+        IN HDC                 referenceHdc,

+        IN EmfType             type        = EmfTypeEmfPlusDual,

+        IN const WCHAR *       description = NULL

+        )

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipRecordMetafileStream(stream,

+                        referenceHdc, type, NULL, MetafileFrameUnitGdi,

+                        description, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Record a metafile to a stream

+    Metafile(

+        IN IStream *           stream,

+        IN HDC                 referenceHdc,

+        IN const RectF &       frameRect,

+        IN MetafileFrameUnit   frameUnit   = MetafileFrameUnitGdi,

+        IN EmfType             type        = EmfTypeEmfPlusDual,

+        IN const WCHAR *       description = NULL

+        )

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipRecordMetafileStream(stream,

+                        referenceHdc, type, &frameRect, frameUnit,

+                        description, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    // Write a metafile to a stream with down-level GDI records

+    Metafile(

+        IN IStream *           stream,

+        IN HDC                 referenceHdc,

+        IN const Rect &        frameRect,

+        IN MetafileFrameUnit   frameUnit   = MetafileFrameUnitGdi,

+        IN EmfType             type        = EmfTypeEmfPlusDual,

+        IN const WCHAR *       description = NULL

+        )

+    {

+        GpMetafile *    metafile = NULL;

+

+        lastResult = DllExports::GdipRecordMetafileStreamI(stream,

+                        referenceHdc, type, &frameRect, frameUnit,

+                        description, &metafile);

+

+        SetNativeImage(metafile);

+    }

+

+    static Status GetMetafileHeader(

+        IN HMETAFILE           hWmf,

+        IN const APMFileHeader *     apmFileHeader,

+        OUT MetafileHeader *   header

+        )

+    {

+        return DllExports::GdipGetMetafileHeaderFromWmf(hWmf, apmFileHeader, header);

+    }

+

+    static Status GetMetafileHeader(

+        IN HENHMETAFILE        hEmf,

+        OUT MetafileHeader *   header

+        )

+    {

+        return DllExports::GdipGetMetafileHeaderFromEmf(hEmf, header);

+    }

+

+    static Status GetMetafileHeader(

+        IN const WCHAR*        filename,

+        OUT MetafileHeader *   header

+        )

+    {

+        return DllExports::GdipGetMetafileHeaderFromFile(filename, header);

+    }

+

+    static Status GetMetafileHeader(

+        IN IStream *           stream,

+        OUT MetafileHeader *   header

+        )

+    {

+        return DllExports::GdipGetMetafileHeaderFromStream(stream, header);

+    }

+

+    Status GetMetafileHeader(

+        OUT MetafileHeader *    header

+        ) const

+    {

+        return SetStatus(DllExports::GdipGetMetafileHeaderFromMetafile(

+                                              (GpMetafile *)nativeImage,

+                                              header));

+    }

+

+    // Once this method is called, the Metafile object is in an invalid state

+    // and can no longer be used.  It is the responsiblity of the caller to

+    // invoke DeleteEnhMetaFile to delete this hEmf.

+

+    HENHMETAFILE GetHENHMETAFILE()

+    {

+        HENHMETAFILE hEmf;

+

+        SetStatus(DllExports::GdipGetHemfFromMetafile((GpMetafile *)nativeImage, &hEmf));

+

+        return hEmf;

+    }

+

+    // Used in conjuction with Graphics::EnumerateMetafile to play an EMF+

+    // The data must be DWORD aligned if it's an EMF or EMF+.  It must be

+    // WORD aligned if it's a WMF.

+    Status

+    PlayRecord(

+        IN EmfPlusRecordType   recordType,

+        IN UINT                flags,

+        IN UINT                dataSize,

+        IN const BYTE *        data

+        ) const

+    {

+        return SetStatus(DllExports::GdipPlayMetafileRecord(

+                                (GpMetafile *)nativeImage,

+                                recordType,

+                                flags,

+                                dataSize,

+                                data));

+    }

+

+    // If you're using a printer HDC for the metafile, but you want the

+    // metafile rasterized at screen resolution, then use this API to set

+    // the rasterization dpi of the metafile to the screen resolution,

+    // e.g. 96 dpi or 120 dpi.

+    Status SetDownLevelRasterizationLimit(

+        IN UINT     metafileRasterizationLimitDpi

+        )

+    {

+        return SetStatus(DllExports::GdipSetMetafileDownLevelRasterizationLimit(

+                                (GpMetafile *)nativeImage,

+                                metafileRasterizationLimitDpi));

+    }

+

+    UINT GetDownLevelRasterizationLimit() const

+    {

+        UINT    metafileRasterizationLimitDpi = 0;

+

+        SetStatus(DllExports::GdipGetMetafileDownLevelRasterizationLimit(

+                                (GpMetafile *)nativeImage,

+                                &metafileRasterizationLimitDpi));

+

+        return metafileRasterizationLimitDpi;

+    }

+

+    static UINT Metafile::EmfToWmfBits(

+        IN HENHMETAFILE       hemf,

+        IN UINT               cbData16,

+        IN LPBYTE             pData16,

+        IN INT                iMapMode = MM_ANISOTROPIC,

+        IN EmfToWmfBitsFlags  eFlags = EmfToWmfBitsFlagsDefault

+    )

+    {

+        return DllExports::GdipEmfToWmfBits(

+            hemf,

+            cbData16,

+            pData16,

+            iMapMode,

+            eFlags);

+    }

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    Metafile(const Metafile &);

+    Metafile& operator=(const Metafile &);

+

+#endif

+};

+

+#endif // !_METAFILE_H

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h
new file mode 100644
index 0000000..79b5bc9
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h
@@ -0,0 +1,213 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   Metafile headers

+*

+* Abstract:

+*

+*   Declarations for various metafile header structures.

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSMETAHEADER_H

+#define _GDIPLUSMETAHEADER_H

+

+typedef struct

+{

+    DWORD   iType;              // Record type EMR_HEADER

+    DWORD   nSize;              // Record size in bytes.  This may be greater

+                                // than the sizeof(ENHMETAHEADER).

+    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units

+    RECTL   rclFrame;           // Inclusive-inclusive Picture Frame of metafile in .01 mm units

+    DWORD   dSignature;         // Signature.  Must be ENHMETA_SIGNATURE.

+    DWORD   nVersion;           // Version number

+    DWORD   nBytes;             // Size of the metafile in bytes

+    DWORD   nRecords;           // Number of records in the metafile

+    WORD    nHandles;           // Number of handles in the handle table

+                                // Handle index zero is reserved.

+    WORD    sReserved;          // Reserved.  Must be zero.

+    DWORD   nDescription;       // Number of chars in the unicode description string

+                                // This is 0 if there is no description string

+    DWORD   offDescription;     // Offset to the metafile description record.

+                                // This is 0 if there is no description string

+    DWORD   nPalEntries;        // Number of entries in the metafile palette.

+    SIZEL   szlDevice;          // Size of the reference device in pels

+    SIZEL   szlMillimeters;     // Size of the reference device in millimeters

+} ENHMETAHEADER3;

+

+// Aldus Placeable Metafiles

+

+// Placeable Metafiles were created by Aldus Corporation as a non-standard

+// way of specifying how a metafile is mapped and scaled on an output device.

+// Placeable metafiles are quite wide-spread, but not directly supported by

+// the Windows API. To playback a placeable metafile using the Windows API,

+// you will first need to strip the placeable metafile header from the file.

+// This is typically performed by copying the metafile to a temporary file

+// starting at file offset 22 (0x16). The contents of the temporary file may

+// then be used as input to the Windows GetMetaFile(), PlayMetaFile(),

+// CopyMetaFile(), etc. GDI functions.

+

+// Each placeable metafile begins with a 22-byte header,

+//  followed by a standard metafile:

+

+#include <pshpack2.h>   // set structure packing to 2

+

+typedef struct

+{

+    INT16           Left;

+    INT16           Top;

+    INT16           Right;

+    INT16           Bottom;

+} APMRect16;

+

+typedef struct

+{

+    UINT32          Key;            // GDIP_WMF_ALDUSKEY

+    INT16           Hmf;            // Metafile HANDLE number (always 0)

+    APMRect16       BoundingBox;    // Coordinates in metafile units

+    INT16           Inch;           // Number of metafile units per inch

+    UINT32          Reserved;       // Reserved (always 0)

+    INT16           Checksum;       // Checksum value for previous 10 WORDs

+} APMFileHeader;

+

+#include <poppack.h>

+

+// Key contains a special identification value that indicates the presence

+// of a placeable metafile header and is always 0x9AC6CDD7.

+

+// Handle is used to stored the handle of the metafile in memory. When written

+// to disk, this field is not used and will always contains the value 0.

+

+// Left, Top, Right, and Bottom contain the coordinates of the upper-left

+// and lower-right corners of the image on the output device. These are

+// measured in twips.

+

+// A twip (meaning "twentieth of a point") is the logical unit of measurement

+// used in Windows Metafiles. A twip is equal to 1/1440 of an inch. Thus 720

+// twips equal 1/2 inch, while 32,768 twips is 22.75 inches.

+

+// Inch contains the number of twips per inch used to represent the image.

+// Normally, there are 1440 twips per inch; however, this number may be

+// changed to scale the image. A value of 720 indicates that the image is

+// double its normal size, or scaled to a factor of 2:1. A value of 360

+// indicates a scale of 4:1, while a value of 2880 indicates that the image

+// is scaled down in size by a factor of two. A value of 1440 indicates

+// a 1:1 scale ratio.

+

+// Reserved is not used and is always set to 0.

+

+// Checksum contains a checksum value for the previous 10 WORDs in the header.

+// This value can be used in an attempt to detect if the metafile has become

+// corrupted. The checksum is calculated by XORing each WORD value to an

+// initial value of 0.

+

+// If the metafile was recorded with a reference Hdc that was a display.

+#define GDIP_EMFPLUSFLAGS_DISPLAY       0x00000001

+

+class MetafileHeader

+{

+public:

+    MetafileType        Type;

+    UINT                Size;               // Size of the metafile (in bytes)

+    UINT                Version;            // EMF+, EMF, or WMF version

+    UINT                EmfPlusFlags;

+    REAL                DpiX;

+    REAL                DpiY;

+    INT                 X;                  // Bounds in device units

+    INT                 Y;

+    INT                 Width;

+    INT                 Height;

+    union

+    {

+        METAHEADER      WmfHeader;

+        ENHMETAHEADER3  EmfHeader;

+    };

+    INT                 EmfPlusHeaderSize;  // size of the EMF+ header in file

+    INT                 LogicalDpiX;        // Logical Dpi of reference Hdc

+    INT                 LogicalDpiY;        // usually valid only for EMF+ files

+

+public:

+    // Get the metafile type

+    MetafileType GetType() const { return Type; }

+

+    // Get the size of the metafile in BYTEs

+    UINT GetMetafileSize() const { return Size; }

+

+    // If IsEmfPlus, this is the EMF+ version; else it is the WMF or EMF version

+    UINT GetVersion() const { return Version; }

+

+    // Get the EMF+ flags associated with the metafile

+    UINT GetEmfPlusFlags() const { return EmfPlusFlags; }

+

+    // Get the X Dpi of the metafile

+    REAL GetDpiX() const { return DpiX; }

+

+    // Get the Y Dpi of the metafile

+    REAL GetDpiY() const { return DpiY; }

+

+    // Get the bounds of the metafile in device units

+    VOID GetBounds (OUT Rect *rect) const

+    {

+        rect->X = X;

+        rect->Y = Y;

+        rect->Width = Width;

+        rect->Height = Height;

+    }

+    

+    // Is it any type of WMF (standard or Aldus Placeable Metafile)?

+    BOOL IsWmf() const

+    {

+       return ((Type == MetafileTypeWmf) || (Type == MetafileTypeWmfAldus));

+    }

+

+    // Is this an Aldus Placeable Metafile?

+    BOOL IsWmfAldus() const { return (Type == MetafileTypeWmf); }

+

+    // Is this an EMF (not an EMF+)?

+    BOOL IsEmf() const { return (Type == MetafileTypeEmf); }

+

+    // Is this an EMF or EMF+ file?

+    BOOL IsEmfOrEmfPlus() const { return (Type >= MetafileTypeEmf); }

+

+    // Is this an EMF+ file?

+    BOOL IsEmfPlus() const { return (Type >= MetafileTypeEmfPlusOnly); }

+

+    // Is this an EMF+ dual (has dual, down-level records) file?

+    BOOL IsEmfPlusDual() const { return (Type == MetafileTypeEmfPlusDual); }

+

+    // Is this an EMF+ only (no dual records) file?

+    BOOL IsEmfPlusOnly() const { return (Type == MetafileTypeEmfPlusOnly); }

+

+    // If it's an EMF+ file, was it recorded against a display Hdc?

+    BOOL IsDisplay() const

+    {

+        return (IsEmfPlus() &&

+                ((EmfPlusFlags & GDIP_EMFPLUSFLAGS_DISPLAY) != 0));

+    }

+

+    // Get the WMF header of the metafile (if it is a WMF)

+    const METAHEADER * GetWmfHeader() const

+    {

+        if (IsWmf())

+        {

+            return &WmfHeader;

+        }

+        return NULL;

+    }

+

+    // Get the EMF header of the metafile (if it is an EMF)

+    const ENHMETAHEADER3 * GetEmfHeader() const

+    {

+        if (IsEmfOrEmfPlus())

+        {

+            return &EmfHeader;

+        }

+        return NULL;

+    }

+};

+

+#endif

+

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h b/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h
new file mode 100644
index 0000000..cff0e1d
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h
@@ -0,0 +1,1686 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusPath.h

+*

+* Abstract:

+*

+*   Path related declarations

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSPATH_H

+#define _GDIPLUSPATH_H

+

+class GraphicsPath : public GdiplusBase

+{

+public:

+    friend class Graphics;

+    friend class Region;

+    friend class PathGradientBrush;

+    friend class GraphicsPathIterator;

+    friend class CustomLineCap;

+

+    // Path constructors

+

+    GraphicsPath(IN FillMode fillMode = FillModeAlternate)

+    {

+        nativePath = NULL;

+        lastResult = DllExports::GdipCreatePath(fillMode, &nativePath);

+    }

+

+    GraphicsPath(IN const PointF* points,

+                 IN const BYTE* types,

+                 IN INT count,

+                 IN FillMode fillMode = FillModeAlternate)

+    {

+        nativePath = NULL;

+        lastResult = DllExports::GdipCreatePath2(points,

+                                                 types,

+                                                 count,

+                                                 fillMode,

+                                                 &nativePath);

+    }

+

+    GraphicsPath(IN const Point* points,

+                 IN const BYTE* types,

+                 IN INT count,

+                 IN FillMode fillMode = FillModeAlternate)

+    {

+        nativePath = NULL;

+        lastResult = DllExports::GdipCreatePath2I(points,

+                                                  types,

+                                                  count,

+                                                  fillMode,

+                                                  &nativePath);

+    }

+

+    ~GraphicsPath()

+    {

+        DllExports::GdipDeletePath(nativePath);

+    }

+

+    /**

+     * Make a copy of the current path object

+     */

+    GraphicsPath* Clone() const

+    {

+        GpPath *clonepath = NULL;

+

+        SetStatus(DllExports::GdipClonePath(nativePath, &clonepath));

+

+        return new GraphicsPath(clonepath);

+    }

+

+    /**

+     * Reset the path object to empty (and fill mode to FillModeAlternate)

+     */

+    Status Reset()

+    {

+        return SetStatus(DllExports::GdipResetPath(nativePath));

+    }

+

+    /**

+     * Get path fill mode information

+     */

+    FillMode GetFillMode() const

+    {

+        FillMode fillmode = FillModeAlternate;

+

+        SetStatus(DllExports::GdipGetPathFillMode(nativePath, &fillmode));

+

+        return fillmode;

+    }

+

+    /**

+     * Set path fill mode information

+     */

+    Status SetFillMode(IN FillMode fillmode)

+    {

+        return SetStatus(DllExports::GdipSetPathFillMode(nativePath, fillmode));

+    }

+

+    /**

+     * Set/get path data

+     */

+    Status GetPathData(OUT PathData* pathData) const

+    {

+        if (pathData == NULL) 

+        {

+            return SetStatus(InvalidParameter);

+        }

+        

+        INT count = GetPointCount();

+        

+        if ((count <= 0) || (pathData->Count>0 && pathData->Count<count))

+        {

+            pathData->Count = 0;

+            if (pathData->Points)

+            {

+                delete pathData->Points;

+                pathData->Points = NULL;

+            }

+

+            if (pathData->Types) 

+            {

+                delete pathData->Types;

+                pathData->Types = NULL;

+            }

+

+            if (count <= 0)

+            {

+                return lastResult;

+            }

+        }

+

+        if (pathData->Count == 0) 

+        {

+            pathData->Points = new PointF[count];

+            if (pathData->Points == NULL) 

+            {

+                return SetStatus(OutOfMemory);

+            

+            }

+            pathData->Types = new byte[count];

+            if (pathData->Types == NULL) 

+            {

+                delete pathData->Points;

+                pathData->Points = NULL;

+

+                return SetStatus(OutOfMemory);

+            }

+            pathData->Count = count;

+        }

+

+        return SetStatus(DllExports::GdipGetPathData(nativePath, pathData));

+    }

+

+    /**

+     * Start/end a subpath

+     */

+    Status StartFigure()

+    {

+        return SetStatus(DllExports::GdipStartPathFigure(nativePath));

+    }

+

+    Status CloseFigure()

+    {

+        return SetStatus(DllExports::GdipClosePathFigure(nativePath));

+    }

+

+    Status CloseAllFigures()

+    {

+        return SetStatus(DllExports::GdipClosePathFigures(nativePath));

+    }

+

+    Status SetMarker()

+    {

+        return SetStatus(DllExports::GdipSetPathMarker(nativePath));

+    }

+

+    Status ClearMarkers()

+    {

+        return SetStatus(DllExports::GdipClearPathMarkers(nativePath));

+    }

+

+    Status Reverse()

+    {

+        return SetStatus(DllExports::GdipReversePath(nativePath));

+    }

+

+    Status GetLastPoint(OUT PointF* lastPoint) const

+    {

+        return SetStatus(DllExports::GdipGetPathLastPoint(nativePath, lastPoint));

+    }

+

+    /**

+     * Add lines to the path object

+     */

+    // float version

+    Status AddLine(IN const PointF& pt1, 

+                   IN const PointF& pt2)

+    {

+        return AddLine(pt1.X, pt1.Y, pt2.X, pt2.Y);

+    }

+

+    Status AddLine(IN REAL x1,

+                   IN REAL y1, 

+                   IN REAL x2, 

+                   IN REAL y2)

+    {

+        return SetStatus(DllExports::GdipAddPathLine(nativePath, x1, y1, x2, y2));

+    }

+

+    Status AddLines(IN const PointF* points, 

+                    IN INT count)

+    {

+        return SetStatus(DllExports::GdipAddPathLine2(nativePath, points, count));

+    }

+

+    // integer version

+    Status AddLine(IN const Point& pt1, 

+                   IN const Point& pt2)

+    {

+        return AddLine(pt1.X,

+                       pt1.Y,

+                       pt2.X,

+                       pt2.Y);

+    }

+

+    Status AddLine(IN INT x1, 

+                   IN INT y1, 

+                   IN INT x2, 

+                   IN INT y2)

+    {

+        return SetStatus(DllExports::GdipAddPathLineI(nativePath,

+                                                     x1,

+                                                     y1,

+                                                     x2,

+                                                     y2));

+    }

+

+    Status AddLines(IN const Point* points, 

+                    IN INT count)

+    {

+        return SetStatus(DllExports::GdipAddPathLine2I(nativePath,

+                                                       points,

+                                                       count));

+    }

+

+    /**

+     * Add an arc to the path object

+     */

+    // float version

+    Status AddArc(IN const RectF& rect, 

+                  IN REAL startAngle, 

+                  IN REAL sweepAngle)

+    {

+        return AddArc(rect.X, rect.Y, rect.Width, rect.Height,

+                      startAngle, sweepAngle);

+    }

+

+    Status AddArc(IN REAL x, 

+                  IN REAL y, 

+                  IN REAL width, 

+                  IN REAL height,

+                  IN REAL startAngle, 

+                  IN REAL sweepAngle)

+    {

+        return SetStatus(DllExports::GdipAddPathArc(nativePath, x, y, width, height,

+                                      startAngle, sweepAngle));

+    }

+

+    // integer version

+    Status AddArc(IN const Rect& rect, 

+                  IN REAL startAngle, 

+                  IN REAL sweepAngle)

+    {

+        return AddArc(rect.X, rect.Y, rect.Width, rect.Height,

+                      startAngle, sweepAngle);

+    }

+

+    Status AddArc(IN INT x, 

+                  IN INT y, 

+                  IN INT width, 

+                  IN INT height,

+                  IN REAL startAngle, 

+                  IN REAL sweepAngle)

+    {

+        return SetStatus(DllExports::GdipAddPathArcI(nativePath,

+                                                    x,

+                                                    y,

+                                                    width,

+                                                    height,

+                                                    startAngle,

+                                                    sweepAngle));

+    }

+

+    /**

+     * Add Bezier curves to the path object

+     */

+    // float version

+    Status AddBezier(IN const PointF& pt1, 

+                     IN const PointF& pt2,

+                     IN const PointF& pt3, 

+                     IN const PointF& pt4)

+    {

+        return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X,

+                         pt4.Y);

+    }

+

+    Status AddBezier(IN REAL x1, 

+                     IN REAL y1, 

+                     IN REAL x2, 

+                     IN REAL y2,

+                     IN REAL x3, 

+                     IN REAL y3, 

+                     IN REAL x4, 

+                     IN REAL y4)

+    {

+        return SetStatus(DllExports::GdipAddPathBezier(nativePath, x1, y1, x2, y2,

+                                     x3, y3, x4, y4));

+    }

+

+    Status AddBeziers(IN const PointF* points, 

+                      IN INT count)

+    {

+        return SetStatus(DllExports::GdipAddPathBeziers(nativePath, points, count));

+    }

+

+    // integer version

+    Status AddBezier(IN const Point& pt1, 

+                     IN const Point& pt2,

+                     IN const Point& pt3, 

+                     IN const Point& pt4)

+    {

+       return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X,

+                        pt4.Y);

+    }

+

+    Status AddBezier(IN INT x1, 

+                     IN INT y1, 

+                     IN INT x2, 

+                     IN INT y2,

+                     IN INT x3,

+                     IN INT y3, 

+                     IN INT x4, 

+                     IN INT y4)

+    {

+       return SetStatus(DllExports::GdipAddPathBezierI(nativePath,

+                                                      x1,

+                                                      y1,

+                                                      x2,

+                                                      y2,

+                                                      x3,

+                                                      y3,

+                                                      x4,

+                                                      y4));

+    }

+

+    Status AddBeziers(IN const Point* points,

+                      IN INT count)

+    {

+       return SetStatus(DllExports::GdipAddPathBeziersI(nativePath,

+                                                        points,

+                                                        count));

+    }

+

+    // float version

+    Status AddCurve(IN const PointF* points, 

+                    IN INT count)

+    {

+        return SetStatus(DllExports::GdipAddPathCurve(nativePath,

+                                                      points,

+                                                      count));

+    }

+

+    Status AddCurve(IN const PointF* points, 

+                    IN INT count,

+                    IN REAL tension)

+    {

+        return SetStatus(DllExports::GdipAddPathCurve2(nativePath,

+                                                       points,

+                                                       count,

+                                                       tension));

+    }

+

+    Status AddCurve(IN const PointF* points, 

+                    IN INT count, 

+                    IN INT offset,

+                    IN INT numberOfSegments, 

+                    IN REAL tension)

+    {

+        return SetStatus(DllExports::GdipAddPathCurve3(nativePath,

+                                                       points,

+                                                       count,

+                                                       offset,

+                                                       numberOfSegments,

+                                                       tension));

+    }

+

+    // integer version

+    Status AddCurve(IN const Point* points, 

+                    IN INT count)

+    {

+       return SetStatus(DllExports::GdipAddPathCurveI(nativePath,

+                                                     points,

+                                                     count));

+    }

+

+    Status AddCurve(IN const Point* points, 

+                    IN INT count, 

+                    IN REAL tension)

+    {

+       return SetStatus(DllExports::GdipAddPathCurve2I(nativePath,

+                                                      points,

+                                                      count,

+                                                      tension));

+    }

+

+    Status AddCurve(IN const Point* points, 

+                    IN INT count, 

+                    IN INT offset,

+                    IN INT numberOfSegments, 

+                    IN REAL tension)

+    {

+       return SetStatus(DllExports::GdipAddPathCurve3I(nativePath,

+                                                      points,

+                                                      count,

+                                                      offset,

+                                                      numberOfSegments,

+                                                      tension));

+    }

+

+    // float version

+    Status AddClosedCurve(IN const PointF* points, 

+                          IN INT count)

+    {

+        return SetStatus(DllExports::GdipAddPathClosedCurve(nativePath,

+                                                            points,

+                                                            count));

+    }

+

+    Status AddClosedCurve(IN const PointF* points, 

+                          IN INT count, 

+                          IN REAL tension)

+    {

+        return SetStatus(DllExports::GdipAddPathClosedCurve2(nativePath,

+                                                             points,

+                                                             count,

+                                                             tension));

+    }

+

+    // integer version

+    Status AddClosedCurve(IN const Point* points, 

+                          IN INT count)

+    {

+       return SetStatus(DllExports::GdipAddPathClosedCurveI(nativePath,

+                                                            points,

+                                                            count));

+    }

+

+

+    Status AddClosedCurve(IN const Point* points, 

+                          IN INT count,

+                          IN REAL tension)

+    {

+       return SetStatus(DllExports::GdipAddPathClosedCurve2I(nativePath,

+                                                             points,

+                                                             count,

+                                                             tension));

+    }

+

+

+    /**

+     * Add closed shapes to the path object

+     */

+

+    // float version

+    Status AddRectangle(IN const RectF& rect)

+    {

+        return SetStatus(DllExports::GdipAddPathRectangle(nativePath,

+                                                          rect.X,

+                                                          rect.Y,

+                                                          rect.Width,

+                                                          rect.Height));

+    }

+

+    Status AddRectangles(IN const RectF* rects, 

+                         IN INT count)

+    {

+        return SetStatus(DllExports::GdipAddPathRectangles(nativePath,

+                                                           rects,

+                                                           count));

+    }

+

+    // integer version

+    Status AddRectangle(IN const Rect& rect)

+    {

+        return SetStatus(DllExports::GdipAddPathRectangleI(nativePath,

+                                                          rect.X,

+                                                          rect.Y,

+                                                          rect.Width,

+                                                          rect.Height));

+    }

+

+    Status AddRectangles(IN const Rect* rects, INT count)

+    {

+        return SetStatus(DllExports::GdipAddPathRectanglesI(nativePath,

+                                                           rects,

+                                                           count));

+    }

+

+    // float version

+    Status AddEllipse(IN const RectF& rect)

+    {

+        return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height);

+    }

+

+    Status AddEllipse(IN REAL x, 

+                      IN REAL y, 

+                      IN REAL width, 

+                      IN REAL height)

+    {

+        return SetStatus(DllExports::GdipAddPathEllipse(nativePath,

+                                                        x,

+                                                        y,

+                                                        width,

+                                                        height));

+    }

+

+    // integer version

+    Status AddEllipse(IN const Rect& rect)

+    {

+        return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height);

+    }

+

+    Status AddEllipse(IN INT x, 

+                      IN INT y, 

+                      IN INT width, 

+                      IN INT height)

+    {

+        return SetStatus(DllExports::GdipAddPathEllipseI(nativePath,

+                                                        x,

+                                                        y,

+                                                        width,

+                                                        height));

+    }

+

+    // float version

+    Status AddPie(IN const RectF& rect, 

+                  IN REAL startAngle, 

+                  IN REAL sweepAngle)

+    {

+        return AddPie(rect.X, rect.Y, rect.Width, rect.Height, startAngle,

+                      sweepAngle);

+    }

+

+    Status AddPie(IN REAL x, 

+                  IN REAL y, 

+                  IN REAL width, 

+                  IN REAL height, 

+                  IN REAL startAngle,

+                  IN REAL sweepAngle)

+    {

+        return SetStatus(DllExports::GdipAddPathPie(nativePath, x, y, width, height,

+                                      startAngle, sweepAngle));

+    }

+

+    // integer version

+    Status AddPie(IN const Rect& rect, 

+                  IN REAL startAngle, 

+                  IN REAL sweepAngle)

+    {

+        return AddPie(rect.X,

+                      rect.Y,

+                      rect.Width,

+                      rect.Height,

+                      startAngle,

+                      sweepAngle);

+    }

+

+    Status AddPie(IN INT x, 

+                  IN INT y, 

+                  IN INT width, 

+                  IN INT height, 

+                  IN REAL startAngle,

+                  IN REAL sweepAngle)

+    {

+        return SetStatus(DllExports::GdipAddPathPieI(nativePath,

+                                                    x,

+                                                    y,

+                                                    width,

+                                                    height,

+                                                    startAngle,

+                                                    sweepAngle));

+    }

+

+    // float version

+    Status AddPolygon(IN const PointF* points, 

+                      IN INT count)

+    {

+        return SetStatus(DllExports::GdipAddPathPolygon(nativePath, points, count));

+    }

+

+    // integer version

+    Status AddPolygon(IN const Point* points, 

+                      IN INT count)

+    {

+       return SetStatus(DllExports::GdipAddPathPolygonI(nativePath, points, count));

+    }

+

+    Status AddPath(IN const GraphicsPath* addingPath, 

+                   IN BOOL connect)

+    {

+        GpPath* nativePath2 = NULL;

+        if(addingPath)

+            nativePath2 = addingPath->nativePath;

+

+        return SetStatus(DllExports::GdipAddPathPath(nativePath, nativePath2, connect));

+    }

+

+    // AddString point version

+

+    Status AddString(

+        IN const WCHAR         *string,

+        IN INT                  length,

+        IN const FontFamily    *family,

+        IN INT                  style,

+        IN REAL                 emSize,  // In world units

+        IN const PointF        &origin,

+        IN const StringFormat  *format

+    )

+    {

+        RectF rect(origin.X, origin.Y, 0.0f, 0.0f);

+

+        return SetStatus(DllExports::GdipAddPathString(

+            nativePath,

+            string,

+            length,

+            family ? family->nativeFamily : NULL,

+            style,

+            emSize,

+            &rect,

+            format ? format->nativeFormat : NULL

+        ));

+    }

+

+    // AddString rectangle version

+

+    Status AddString(

+        IN const WCHAR         *string,

+        IN INT                  length,

+        IN const FontFamily    *family,

+        IN INT                  style,

+        IN REAL                 emSize,  // In world units

+        IN const RectF         &layoutRect,

+        IN const StringFormat  *format

+    )

+    {

+        return SetStatus(DllExports::GdipAddPathString(

+            nativePath,

+            string,

+            length,

+            family ? family->nativeFamily : NULL,

+            style,

+            emSize,

+            &layoutRect,

+            format ? format->nativeFormat : NULL

+        ));

+    }

+

+    Status AddString(

+        IN const WCHAR         *string,

+        IN INT                  length,

+        IN const FontFamily    *family,

+        IN INT                  style,

+        IN REAL                 emSize,  // In world units

+        IN const Point         &origin,

+        IN const StringFormat  *format

+    )

+    {

+        Rect rect(origin.X, origin.Y, 0, 0);

+

+        return SetStatus(DllExports::GdipAddPathStringI(

+            nativePath,

+            string,

+            length,

+            family ? family->nativeFamily : NULL,

+            style,

+            emSize,

+            &rect,

+            format ? format->nativeFormat : NULL

+        ));

+    }

+

+    // AddString rectangle version

+

+    Status AddString(

+        IN const WCHAR         *string,

+        IN INT                  length,

+        IN const FontFamily    *family,

+        IN INT                  style,

+        IN REAL                 emSize,  // In world units

+        IN const Rect          &layoutRect,

+        IN const StringFormat  *format

+    )

+    {

+        return SetStatus(DllExports::GdipAddPathStringI(

+            nativePath,

+            string,

+            length,

+            family ? family->nativeFamily : NULL,

+            style,

+            emSize,

+            &layoutRect,

+            format ? format->nativeFormat : NULL

+        ));

+    }

+    

+    /**

+     * Transforms the path object

+     */

+    Status Transform(IN const Matrix* matrix)

+    {

+        if(matrix)

+            return SetStatus(DllExports::GdipTransformPath(nativePath, matrix->nativeMatrix));

+        else

+            return Ok;  // No need to transform.

+    }

+

+    /**

+     * Get the bounds of the path object with the given transform.

+     * This is not always the tightest bounds.

+     *

+     * Defined in GdiplusGraphics.h.

+     */

+    Status GetBounds(OUT RectF* bounds, 

+                     IN const Matrix* matrix = NULL, 

+                     IN const Pen* pen = NULL) const;

+

+    // integer version (defined in GdiplusGraphics.h)

+    Status GetBounds(OUT Rect* bounds,

+                     IN const Matrix* matrix = NULL, 

+                     IN const Pen* pen = NULL) const;

+

+    /**

+     * Flatten the path object

+     * Once this is called, the resultant path is made of line segments and

+     * the original path information is lost.

+     * When matrix = NULL, the identity matrix is assumed.

+     */

+    Status Flatten(IN const Matrix* matrix = NULL, 

+                   IN REAL flatness = FlatnessDefault)

+    {

+        GpMatrix* nativeMatrix = NULL;

+        if(matrix)

+        {

+            nativeMatrix = matrix->nativeMatrix;

+        }

+

+        return SetStatus(DllExports::GdipFlattenPath(

+            nativePath, 

+            nativeMatrix, 

+            flatness

+        ));

+    }

+

+#ifdef DCR_USE_NEW_202903

+    

+    Status Widen(

+        IN const Pen* pen, 

+        IN const Matrix* matrix = NULL,

+        IN REAL flatness = FlatnessDefault

+    )

+    {

+        GpMatrix* nativeMatrix = NULL;

+        if(matrix)

+            nativeMatrix = matrix->nativeMatrix;

+

+        return SetStatus(DllExports::GdipWidenPath(

+            nativePath, 

+            pen->nativePen,

+            nativeMatrix, 

+            flatness

+        ));

+    }

+

+#else

+

+    /**

+     * Widen the path object

+     * When removeSelfIntersects is TRUE, this returns the widened path

+     * without self intersections.

+     * When it is FALSE, it returns the widened path with selfintersections.

+     * The latter is faster and is usually safficient for filling.

+     */

+    Status Widen(IN const Pen* pen, 

+                 IN const Matrix* matrix = NULL,

+                 IN BOOL removeSelfIntersects = TRUE)

+    {

+        GpMatrix* nativeMatrix = NULL;

+        if(matrix)

+            nativeMatrix = matrix->nativeMatrix;

+

+        return SetStatus(DllExports::GdipWidenPathWithMinimumResolutions(nativePath, pen->nativePen,

+            0, 0, nativeMatrix, removeSelfIntersects));

+    }

+

+    /**

+     * Widen the path object

+     * This is equivalent to Widen() method except that

+     * The widths of the widened path are larger than the given

+     * minimum resolutions in x and y coordinates after the transform.

+     * This is usefull when widening a path with the limited device resolutions.

+     */

+

+    Status Widen(IN const Pen* pen, 

+                 IN REAL minXres, 

+                 IN REAL minYres, 

+                 IN const Matrix* matrix = NULL,

+                 IN BOOL removeSelfIntersects = TRUE)

+    {

+        GpMatrix* nativeMatrix = NULL;

+        if(matrix)

+            nativeMatrix = matrix->nativeMatrix;

+

+        return SetStatus(DllExports::GdipWidenPathWithMinimumResolutions(nativePath, pen->nativePen,

+            minXres, minYres, nativeMatrix, removeSelfIntersects));

+    }

+

+#endif // DCR_USE_NEW_202903

+

+    Status Outline(

+        IN const Matrix *matrix = NULL,

+        IN REAL flatness = FlatnessDefault

+    )

+    {

+        GpMatrix* nativeMatrix = NULL;

+        if(matrix)

+        {

+            nativeMatrix = matrix->nativeMatrix;

+        }

+

+        return SetStatus(DllExports::GdipWindingModeOutline(

+            nativePath, nativeMatrix, flatness

+        ));

+    }

+    

+    /**

+     * Warp the path object

+     * Once this is called, the resultant path is made of line segments and

+     * the original path information is lost.

+     * When matrix = NULL, the identity matrix is assumed.

+     */

+    Status Warp(IN const PointF* destPoints, 

+                IN INT count,

+                IN const RectF& srcRect, 

+                IN const Matrix* matrix = NULL,

+                IN WarpMode warpMode = WarpModePerspective,

+                IN REAL flatness = FlatnessDefault)

+    {

+        GpMatrix* nativeMatrix = NULL;

+        if(matrix)

+            nativeMatrix = matrix->nativeMatrix;

+

+        return SetStatus(DllExports::GdipWarpPath(

+                                        nativePath,

+                                        nativeMatrix,

+                                        destPoints,

+                                        count,

+                                        srcRect.X,

+                                        srcRect.Y,

+                                        srcRect.Width,

+                                        srcRect.Height,

+                                        warpMode,

+                                        flatness));

+    }

+

+    /**

+     * Return the number of points in the current path

+     */

+    INT GetPointCount() const

+    {

+        INT count = 0;

+

+        SetStatus(DllExports::GdipGetPointCount(nativePath, &count));

+

+        return count;

+    }

+

+    /**

+     * Return the path point type information

+     */

+    Status GetPathTypes(OUT BYTE* types, 

+                        IN INT count) const

+    {

+        return SetStatus(DllExports::GdipGetPathTypes(nativePath, types, count));

+    }

+

+    /**

+     * Return the path point coordinate information

+     * @notes Should there be PathData that contains types[] and points[]

+     *        for get & set purposes.

+     */

+    Status GetPathPoints(OUT PointF* points, 

+                         IN INT count) const

+    {

+        return SetStatus(DllExports::GdipGetPathPoints(nativePath, points, count));

+    }

+

+    // integer version

+    Status GetPathPoints(OUT Point* points, 

+                         IN INT count) const

+    {

+        return SetStatus(DllExports::GdipGetPathPointsI(nativePath, points, count));

+    }

+

+    Status GetLastStatus() const

+    {

+        Status lastStatus = lastResult;

+        lastResult = Ok;

+

+        return lastStatus;

+    }

+

+    /**

+     * Hit testing operations

+     *

+     * inline implementation is in gdiplusgraphics.h.

+     */

+

+    BOOL IsVisible(IN const PointF& point, 

+                   IN const Graphics* g = NULL) const

+    {

+        return IsVisible(point.X, point.Y, g);

+    }

+    

+    BOOL IsVisible(IN REAL x, 

+                   IN REAL y, 

+                   IN const Graphics* g = NULL) const;

+

+    BOOL IsVisible(IN const Point& point,

+                   IN const Graphics* g = NULL) const

+    {

+        return IsVisible(point.X, point.Y, g);

+    }

+

+    BOOL IsVisible(IN INT x, 

+                   IN INT y, 

+                   IN const Graphics* g = NULL) const;

+    

+    BOOL IsOutlineVisible(IN const PointF& point,

+                          IN const Pen* pen, 

+                          IN const Graphics* g = NULL) const

+    {

+        return IsOutlineVisible(point.X, point.Y, pen, g);

+    }

+

+    BOOL IsOutlineVisible(IN REAL x, 

+                          IN REAL y, 

+                          IN const Pen* pen, 

+                          IN const Graphics* g = NULL) const;

+

+    BOOL IsOutlineVisible(IN const Point& point,

+                          IN const Pen* pen, 

+                          IN const Graphics* g = NULL) const

+    {

+        return IsOutlineVisible(point.X, point.Y, pen, g);

+    }

+    

+    BOOL IsOutlineVisible(IN INT x, 

+                          IN INT y, 

+                          IN const Pen* pen, 

+                          IN const Graphics* g = NULL) const;

+

+protected:

+

+    GraphicsPath(const GraphicsPath& path)

+    {

+        GpPath *clonepath = NULL;

+        SetStatus(DllExports::GdipClonePath(path.nativePath, &clonepath));

+        SetNativePath(clonepath);

+    }

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    GraphicsPath& operator=(const GraphicsPath &);

+protected:

+

+#else

+

+    GraphicsPath& operator=(const GraphicsPath& path)

+    {

+        path;

+        SetStatus(NotImplemented);

+        return *this;

+    }

+

+#endif

+

+    GraphicsPath(GpPath* nativePath)

+    {

+        lastResult = Ok;

+        SetNativePath(nativePath);

+    }

+

+    VOID SetNativePath(GpPath *nativePath)

+    {

+        this->nativePath = nativePath;

+    }

+

+    Status SetStatus(Status status) const

+    {

+        if (status != Ok)

+            return (lastResult = status);

+        else

+            return status;

+    }

+

+protected:

+    GpPath* nativePath;

+    mutable Status lastResult;

+};

+

+

+//--------------------------------------------------------------------------

+// GraphisPathIterator class

+//--------------------------------------------------------------------------

+

+class GraphicsPathIterator : public GdiplusBase

+{

+public:

+

+    GraphicsPathIterator(IN const GraphicsPath* path)

+    {

+        GpPath* nativePath = NULL;

+        if(path)

+            nativePath = path->nativePath;

+

+        GpPathIterator *iter = NULL;

+        lastResult = DllExports::GdipCreatePathIter(&iter, nativePath);

+        SetNativeIterator(iter);

+    }

+

+    ~GraphicsPathIterator()

+    {

+        DllExports::GdipDeletePathIter(nativeIterator);

+    }

+

+

+    INT NextSubpath(OUT INT* startIndex,

+                    OUT INT* endIndex,

+                    OUT BOOL* isClosed)

+    {

+        INT resultCount;

+

+        SetStatus(DllExports::GdipPathIterNextSubpath(nativeIterator,

+            &resultCount, startIndex, endIndex, isClosed));

+

+        return resultCount;

+    }

+

+

+    INT NextSubpath(IN const GraphicsPath* path, 

+                    OUT BOOL* isClosed)

+    {

+        GpPath* nativePath = NULL;

+

+        INT resultCount;

+

+        if(path)

+            nativePath= path->nativePath;

+

+        SetStatus(DllExports::GdipPathIterNextSubpathPath(nativeIterator,

+            &resultCount, nativePath, isClosed));

+

+        return resultCount;

+    }

+

+    INT NextPathType(OUT BYTE* pathType, 

+                     OUT INT* startIndex, 

+                     OUT INT* endIndex)

+    {

+        INT resultCount;

+

+        SetStatus(DllExports::GdipPathIterNextPathType(nativeIterator,

+            &resultCount, pathType, startIndex, endIndex));

+

+        return resultCount;

+    }

+

+    INT NextMarker(OUT INT* startIndex, 

+                   OUT INT* endIndex)

+    {

+        INT resultCount;

+

+        SetStatus(DllExports::GdipPathIterNextMarker(nativeIterator,

+            &resultCount, startIndex, endIndex));

+

+        return resultCount;

+    }

+

+

+    INT NextMarker(IN const GraphicsPath* path)

+    {

+        GpPath* nativePath = NULL;

+

+        INT resultCount;

+

+        if(path)

+            nativePath= path->nativePath;

+

+        SetStatus(DllExports::GdipPathIterNextMarkerPath(nativeIterator,

+            &resultCount, nativePath));

+

+        return resultCount;

+    }

+

+    INT GetCount() const

+    {

+        INT resultCount;

+

+        SetStatus(DllExports::GdipPathIterGetCount(nativeIterator, &resultCount));

+

+        return resultCount;

+    }

+

+    INT GetSubpathCount() const

+    {

+        INT resultCount;

+

+        SetStatus(DllExports::GdipPathIterGetSubpathCount(nativeIterator, &resultCount));

+

+        return resultCount;

+    }

+

+    BOOL HasCurve() const

+    {

+        BOOL hasCurve;

+

+        SetStatus(DllExports::GdipPathIterHasCurve(nativeIterator, &hasCurve));

+

+        return hasCurve;

+    }

+

+    VOID Rewind()

+    {

+        SetStatus(DllExports::GdipPathIterRewind(nativeIterator));

+    }

+

+    INT Enumerate(OUT PointF *points,

+                  OUT BYTE *types, 

+                  IN INT count)

+    {

+        INT resultCount;

+

+        SetStatus(DllExports::GdipPathIterEnumerate(nativeIterator,

+            &resultCount, points, types, count));

+

+        return resultCount;

+    }

+

+    INT CopyData(OUT PointF* points, 

+                 OUT BYTE* types,

+                 IN INT startIndex, 

+                 IN INT endIndex)

+    {

+        INT resultCount;

+

+        SetStatus(DllExports::GdipPathIterCopyData(nativeIterator,

+            &resultCount, points, types, startIndex, endIndex));

+

+        return resultCount;

+    }

+

+    Status GetLastStatus() const

+    {

+        Status lastStatus = lastResult;

+        lastResult = Ok;

+

+        return lastStatus;

+    }

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    GraphicsPathIterator(const GraphicsPathIterator &);

+    GraphicsPathIterator& operator=(const GraphicsPathIterator &);

+

+#endif

+

+protected:

+    VOID SetNativeIterator(GpPathIterator *nativeIterator)

+    {

+        this->nativeIterator = nativeIterator;

+    }

+

+    Status SetStatus(Status status) const

+    {

+        if (status != Ok)

+            return (lastResult = status);

+        else

+            return status;

+    }

+

+protected:

+    GpPathIterator* nativeIterator;

+    mutable Status lastResult;

+};

+

+

+//--------------------------------------------------------------------------

+// Represent polygon gradient brush object

+//--------------------------------------------------------------------------

+

+class PathGradientBrush : public Brush

+{

+public:

+    friend class Pen;

+

+    PathGradientBrush(

+        IN const PointF* points,

+        IN INT count,

+        IN WrapMode wrapMode = WrapModeClamp)

+    {

+        GpPathGradient *brush = NULL;

+

+        lastResult = DllExports::GdipCreatePathGradient(

+                                        points, count,

+                                        wrapMode, &brush);

+        SetNativeBrush(brush);

+    }

+

+    PathGradientBrush(

+        IN const Point* points,

+        IN INT count,

+        IN WrapMode wrapMode = WrapModeClamp)

+    {

+        GpPathGradient *brush = NULL;

+

+        lastResult = DllExports::GdipCreatePathGradientI(

+                                        points, count,

+                                        wrapMode, &brush);

+

+        SetNativeBrush(brush);

+    }

+

+    PathGradientBrush(

+        IN const GraphicsPath* path

+        )

+    {

+        GpPathGradient *brush = NULL;

+

+        lastResult = DllExports::GdipCreatePathGradientFromPath(

+                                        path->nativePath, &brush);

+        SetNativeBrush(brush);

+    }

+

+    // Get/set colors

+

+    Status GetCenterColor(OUT Color* color) const

+    {

+        ARGB argb;

+        

+        if (color == NULL) 

+        {

+            return SetStatus(InvalidParameter);

+        }

+

+        SetStatus(DllExports::GdipGetPathGradientCenterColor(

+                       (GpPathGradient*) nativeBrush, &argb));

+

+        color->SetValue(argb);

+

+        return lastResult;

+    }

+

+    Status SetCenterColor(IN const Color& color)

+    {

+        SetStatus(DllExports::GdipSetPathGradientCenterColor(

+                       (GpPathGradient*) nativeBrush,

+                       color.GetValue()));

+

+        return lastResult;

+    }

+

+    INT GetPointCount() const

+    {

+        INT count;

+

+        SetStatus(DllExports::GdipGetPathGradientPointCount(

+                       (GpPathGradient*) nativeBrush, &count));

+

+        return count;

+    }

+

+    INT GetSurroundColorCount() const

+    {

+        INT count;

+

+        SetStatus(DllExports::GdipGetPathGradientSurroundColorCount(

+                       (GpPathGradient*) nativeBrush, &count));

+

+        return count;

+    }

+

+    Status GetSurroundColors(OUT Color* colors, 

+                             IN OUT INT* count) const

+    {

+        if(colors == NULL || count == NULL)

+        {

+            return SetStatus(InvalidParameter);

+        }

+

+        INT count1;

+        

+        SetStatus(DllExports::GdipGetPathGradientSurroundColorCount(

+                        (GpPathGradient*) nativeBrush, &count1));

+

+        if(lastResult != Ok)

+            return lastResult;

+

+        if((*count < count1) || (count1 <= 0))

+            return SetStatus(InsufficientBuffer);

+

+        ARGB* argbs = (ARGB*) new ARGB[count1];

+        if(argbs == NULL)

+            return SetStatus(OutOfMemory);

+

+        SetStatus(DllExports::GdipGetPathGradientSurroundColorsWithCount(

+                    (GpPathGradient*)nativeBrush, argbs, &count1));

+

+        if(lastResult == Ok)

+        {

+            for(INT i = 0; i < count1; i++)

+            {

+                colors[i].SetValue(argbs[i]);

+            }        

+            *count = count1;

+        }

+

+        delete [] argbs;

+        return lastResult;

+    }

+

+    Status SetSurroundColors(IN const Color* colors, 

+                             IN OUT INT* count)

+    {

+        if(colors == NULL || count == NULL)

+        {

+            return SetStatus(InvalidParameter);

+        }

+

+        INT count1 = GetPointCount();

+

+        if((*count > count1) || (count1 <= 0))

+            return SetStatus(InvalidParameter);

+

+        count1 = *count;

+

+        ARGB* argbs = (ARGB*) new ARGB[count1];

+        if(argbs == NULL)

+            return SetStatus(OutOfMemory);

+

+        for(INT i = 0; i < count1; i++)

+        {

+            argbs[i] = colors[i].GetValue();

+        }

+

+        SetStatus(DllExports::GdipSetPathGradientSurroundColorsWithCount(

+                    (GpPathGradient*)nativeBrush, argbs, &count1));

+

+        if(lastResult == Ok)

+            *count = count1;

+

+        delete [] argbs;

+

+        return lastResult;

+    }

+

+    Status GetGraphicsPath(OUT GraphicsPath* path) const

+    {

+        if(path == NULL)

+            return SetStatus(InvalidParameter);

+

+        return SetStatus(DllExports::GdipGetPathGradientPath(

+                    (GpPathGradient*)nativeBrush, path->nativePath));

+    }

+

+    Status SetGraphicsPath(IN const GraphicsPath* path)

+    {

+        if(path == NULL)

+            return SetStatus(InvalidParameter);

+

+        return SetStatus(DllExports::GdipSetPathGradientPath(

+                    (GpPathGradient*)nativeBrush, path->nativePath));

+    }

+

+    Status GetCenterPoint(OUT PointF* point) const

+    {

+        return SetStatus(DllExports::GdipGetPathGradientCenterPoint(

+                                (GpPathGradient*)nativeBrush,

+                                point));

+    }

+

+

+    Status GetCenterPoint(OUT Point* point) const

+    {

+        return SetStatus(DllExports::GdipGetPathGradientCenterPointI(

+                                (GpPathGradient*)nativeBrush,

+                                point));

+    }

+

+    Status SetCenterPoint(IN const PointF& point)

+    {

+        return SetStatus(DllExports::GdipSetPathGradientCenterPoint(

+                                (GpPathGradient*)nativeBrush,

+                                &point));

+    }

+

+    Status SetCenterPoint(IN const Point& point)

+    {

+        return SetStatus(DllExports::GdipSetPathGradientCenterPointI(

+                                (GpPathGradient*)nativeBrush,

+                                &point));

+    }

+

+    Status GetRectangle(OUT RectF* rect) const

+    {

+        return SetStatus(DllExports::GdipGetPathGradientRect(

+                            (GpPathGradient*)nativeBrush, rect));

+    }

+

+    Status GetRectangle(OUT Rect* rect) const

+    {

+        return SetStatus(DllExports::GdipGetPathGradientRectI(

+                            (GpPathGradient*)nativeBrush, rect));

+    }

+

+    // Gamma correction.

+

+    Status SetGammaCorrection(IN BOOL useGammaCorrection)

+    {

+        return SetStatus(DllExports::GdipSetPathGradientGammaCorrection(

+            (GpPathGradient*)nativeBrush, useGammaCorrection));

+    }

+

+    BOOL GetGammaCorrection() const

+    {

+        BOOL useGammaCorrection;

+

+        SetStatus(DllExports::GdipGetPathGradientGammaCorrection(

+            (GpPathGradient*)nativeBrush, &useGammaCorrection));

+

+        return useGammaCorrection;

+    }

+

+    INT GetBlendCount() const

+    {

+       INT count = 0;

+

+       SetStatus(DllExports::GdipGetPathGradientBlendCount(

+                           (GpPathGradient*) nativeBrush, &count));

+

+       return count;

+    }

+

+    Status GetBlend(OUT REAL* blendFactors,

+                    OUT REAL* blendPositions,

+                    IN INT count) const

+    {

+        return SetStatus(DllExports::GdipGetPathGradientBlend(

+                            (GpPathGradient*)nativeBrush,

+                            blendFactors, blendPositions, count));

+    }

+

+    Status SetBlend(IN const REAL* blendFactors, 

+                    IN const REAL* blendPositions, 

+                    IN INT count)

+    {

+        return SetStatus(DllExports::GdipSetPathGradientBlend(

+                            (GpPathGradient*)nativeBrush,

+                            blendFactors, blendPositions, count));

+    }

+

+    INT GetInterpolationColorCount() const

+    {

+       INT count = 0;

+

+       SetStatus(DllExports::GdipGetPathGradientPresetBlendCount(

+                        (GpPathGradient*) nativeBrush, &count));

+

+       return count;

+    }

+

+    Status SetInterpolationColors(IN const Color* presetColors,

+                                  IN const REAL* blendPositions, 

+                                  IN INT count)

+    {

+        if ((count <= 0) || !presetColors) 

+        {

+            return SetStatus(InvalidParameter);

+        }

+

+        ARGB* argbs = (ARGB*) new ARGB[count];

+        if(argbs)

+        {

+            for(INT i = 0; i < count; i++)

+            {

+                argbs[i] = presetColors[i].GetValue();

+            }

+

+            Status status = SetStatus(DllExports::GdipSetPathGradientPresetBlend(

+                                    (GpPathGradient*) nativeBrush,

+                                    argbs,

+                                    blendPositions,

+                                    count));

+            delete[] argbs;

+            return status;

+        }

+        else

+        {

+            return SetStatus(OutOfMemory);

+        }

+    }

+

+    Status GetInterpolationColors(OUT Color* presetColors,

+                                  OUT REAL* blendPositions, 

+                                  IN INT count) const

+    {

+        if ((count <= 0) || !presetColors) 

+        {

+            return SetStatus(InvalidParameter);

+        }

+

+        ARGB* argbs = (ARGB*) new ARGB[count];

+        

+        if (!argbs)

+        {

+            return SetStatus(OutOfMemory);

+        }

+

+        GpStatus status = SetStatus(DllExports::GdipGetPathGradientPresetBlend(

+                                (GpPathGradient*)nativeBrush,

+                                argbs,

+                                blendPositions,

+                                count));

+        

+        for(INT i = 0; i < count; i++)

+        {

+            presetColors[i] = Color(argbs[i]);

+        }

+        delete [] argbs;

+        

+        return status;

+    }

+

+    Status SetBlendBellShape(IN REAL focus, 

+                             IN REAL scale = 1.0)

+    {

+        return SetStatus(DllExports::GdipSetPathGradientSigmaBlend(

+                            (GpPathGradient*)nativeBrush, focus, scale));

+    }

+

+    #ifdef DCR_USE_NEW_145135

+    Status SetBlendTriangularShape(

+        IN REAL focus,

+        IN REAL scale = 1.0

+    )

+    #else

+    Status SetBlendTrianglarShape(IN REAL focus,

+                                  IN REAL scale = 1.0)

+    #endif                              

+    {

+        return SetStatus(DllExports::GdipSetPathGradientLinearBlend(

+                            (GpPathGradient*)nativeBrush, focus, scale));

+    }

+

+    /**

+     * Get/set brush transform

+     */

+    Status GetTransform(OUT Matrix *matrix) const

+    {

+        return SetStatus(DllExports::GdipGetPathGradientTransform(

+                            (GpPathGradient*) nativeBrush, matrix->nativeMatrix));

+    }

+

+    Status SetTransform(IN const Matrix* matrix)

+    {

+        return SetStatus(DllExports::GdipSetPathGradientTransform(

+                            (GpPathGradient*) nativeBrush, matrix->nativeMatrix));

+    }

+

+    Status ResetTransform()

+    {

+        return SetStatus(DllExports::GdipResetPathGradientTransform((GpPathGradient*)nativeBrush));

+    }

+

+    Status MultiplyTransform(IN const Matrix* matrix,

+                             IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipMultiplyPathGradientTransform((GpPathGradient*)nativeBrush,

+                                                                matrix->nativeMatrix,

+                                                                order));

+    }

+

+    Status TranslateTransform(IN REAL dx, 

+                              IN REAL dy,

+                              IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipTranslatePathGradientTransform((GpPathGradient*)nativeBrush,

+                                                               dx, dy, order));

+    }

+

+    Status ScaleTransform(IN REAL sx, 

+                          IN REAL sy,

+                          IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipScalePathGradientTransform((GpPathGradient*)nativeBrush,

+                                                             sx, sy, order));

+    }

+

+    Status RotateTransform(IN REAL angle, 

+                           IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipRotatePathGradientTransform((GpPathGradient*)nativeBrush,

+                                                              angle, order));

+    }

+

+    /**

+     * Get/set brush focus scales

+     */

+    Status GetFocusScales(OUT REAL* xScale, 

+                          OUT REAL* yScale) const

+    {

+        return SetStatus(DllExports::GdipGetPathGradientFocusScales(

+                            (GpPathGradient*) nativeBrush, xScale, yScale));

+    }

+

+    Status SetFocusScales(IN REAL xScale,

+                          IN REAL yScale)

+    {

+        return SetStatus(DllExports::GdipSetPathGradientFocusScales(

+                            (GpPathGradient*) nativeBrush, xScale, yScale));

+    }

+

+    /**

+     * Get/set brush wrapping mode

+     */

+    WrapMode GetWrapMode() const

+    {

+        WrapMode wrapMode;

+

+        SetStatus(DllExports::GdipGetPathGradientWrapMode(

+                     (GpPathGradient*) nativeBrush, &wrapMode));

+

+        return wrapMode;

+    }

+

+    Status SetWrapMode(IN WrapMode wrapMode)

+    {

+        return SetStatus(DllExports::GdipSetPathGradientWrapMode(

+                            (GpPathGradient*) nativeBrush, wrapMode));

+    }

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    PathGradientBrush(const PathGradientBrush &);

+    PathGradientBrush& operator=(const PathGradientBrush &);

+

+#endif

+

+protected:

+

+    PathGradientBrush()

+    {

+    }

+};

+

+

+#endif // !_GRAPHICSPATH_HPP

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h b/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h
new file mode 100644
index 0000000..20653db
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h
@@ -0,0 +1,519 @@
+/**************************************************************************\

+* 

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusPen.h

+*

+* Abstract:

+*

+*   Pen API related declarations

+*

+\**************************************************************************/

+#ifndef _GDIPLUSPEN_H

+#define _GDIPLUSPEN_H

+

+//--------------------------------------------------------------------------

+// class for various pen types

+//--------------------------------------------------------------------------

+

+class Pen : public GdiplusBase

+{

+public:

+    friend class GraphicsPath;

+    friend class Graphics;

+

+    // abstract Clone() can't be implemented here because it can't

+    // new an object with pure virtual functions

+

+    // Constructors

+

+    Pen(IN const Color& color, 

+        IN REAL width = 1.0f)

+    {

+        Unit unit = UnitWorld;

+        nativePen = NULL;

+        lastResult = DllExports::GdipCreatePen1(color.GetValue(),

+                                    width, unit, &nativePen);

+    }

+

+    Pen(IN const Brush* brush, 

+        IN REAL width = 1.0f)

+    {

+        Unit unit = UnitWorld;

+        nativePen = NULL;

+        lastResult = DllExports::GdipCreatePen2(brush->nativeBrush,

+                                    width, unit, &nativePen);

+    }

+

+    ~Pen()

+    {

+        DllExports::GdipDeletePen(nativePen);

+    }

+

+    Pen* Clone() const

+    {

+        GpPen *clonePen = NULL;

+

+        lastResult = DllExports::GdipClonePen(nativePen, &clonePen);

+   

+        return new Pen(clonePen, lastResult);

+    }

+

+    Status SetWidth(IN REAL width)

+    {

+        return SetStatus(DllExports::GdipSetPenWidth(nativePen, width));

+    }

+

+    REAL GetWidth() const

+    {

+        REAL width;

+

+        SetStatus(DllExports::GdipGetPenWidth(nativePen, &width));

+        

+        return width;

+    }

+    

+    // Set/get line caps: start, end, and dash

+

+    // Line cap and join APIs by using LineCap and LineJoin enums.

+

+    #ifdef DCR_USE_NEW_197819

+    Status SetLineCap(IN LineCap startCap, 

+                      IN LineCap endCap, 

+                      IN DashCap dashCap)

+    {

+        return SetStatus(DllExports::GdipSetPenLineCap197819(nativePen, 

+                                   startCap, endCap, dashCap));

+    }

+    #else

+    Status SetLineCap(IN LineCap startCap, 

+                      IN LineCap endCap, 

+                      IN LineCap dashCap)

+    {

+        return SetStatus(DllExports::GdipSetPenLineCap(nativePen, 

+                                   startCap, endCap, dashCap));

+    }

+    #endif // DCR_USE_NEW_197819

+

+    Status SetStartCap(IN LineCap startCap)

+    {

+        return SetStatus(DllExports::GdipSetPenStartCap(nativePen, startCap));

+    }

+

+    Status SetEndCap(IN LineCap endCap)

+    {

+        return SetStatus(DllExports::GdipSetPenEndCap(nativePen, endCap));

+    }

+

+    #ifdef DCR_USE_NEW_197819

+    Status SetDashCap(IN DashCap dashCap)

+    {

+        return SetStatus(DllExports::GdipSetPenDashCap197819(nativePen,

+                                   dashCap));

+    }

+    #else

+    Status SetDashCap(IN LineCap dashCap)

+    {

+        return SetStatus(DllExports::GdipSetPenDashCap(nativePen, dashCap));

+    }

+    #endif // DCR_USE_NEW_197819

+

+    LineCap GetStartCap() const

+    {

+        LineCap startCap;

+

+        SetStatus(DllExports::GdipGetPenStartCap(nativePen, &startCap));

+        

+        return startCap;

+    }

+

+    LineCap GetEndCap() const

+    {

+        LineCap endCap;

+

+        SetStatus(DllExports::GdipGetPenEndCap(nativePen, &endCap));

+

+        return endCap;

+    }

+

+    #ifdef DCR_USE_NEW_197819

+    DashCap GetDashCap() const

+    {

+        DashCap dashCap;

+

+        SetStatus(DllExports::GdipGetPenDashCap197819(nativePen,

+                            &dashCap));

+

+        return dashCap;

+    }

+    #else

+    LineCap GetDashCap() const

+    {

+        LineCap dashCap;

+

+        SetStatus(DllExports::GdipGetPenDashCap(nativePen, &dashCap));

+

+        return dashCap;

+    }

+    #endif // DCR_USE_NEW_197819

+

+

+    // Set/get line join

+

+    Status SetLineJoin(IN LineJoin lineJoin)

+    {

+        return SetStatus(DllExports::GdipSetPenLineJoin(nativePen, lineJoin));

+    }

+

+    LineJoin GetLineJoin() const

+    {

+        LineJoin lineJoin;

+        

+        SetStatus(DllExports::GdipGetPenLineJoin(nativePen, &lineJoin));

+        

+        return lineJoin;

+    }

+

+    Status SetCustomStartCap(IN const CustomLineCap* customCap)

+    {

+        GpCustomLineCap* nativeCap = NULL;

+        if(customCap)

+            nativeCap = customCap->nativeCap;

+

+        return SetStatus(DllExports::GdipSetPenCustomStartCap(nativePen, nativeCap));

+    }

+

+    Status GetCustomStartCap(OUT CustomLineCap* customCap) const

+    {

+        if(!customCap)

+            return SetStatus(InvalidParameter);

+

+        return SetStatus(DllExports::GdipGetPenCustomStartCap(nativePen, &(customCap->nativeCap)));

+    }

+

+    Status SetCustomEndCap(IN const CustomLineCap* customCap)

+    {

+        GpCustomLineCap* nativeCap = NULL;

+        if(customCap)

+            nativeCap = customCap->nativeCap;

+

+        return SetStatus(DllExports::GdipSetPenCustomEndCap(nativePen, nativeCap));

+    }

+

+    Status GetCustomEndCap(OUT CustomLineCap* customCap) const

+    {

+        if(!customCap)

+            return SetStatus(InvalidParameter);

+

+        return SetStatus(DllExports::GdipGetPenCustomEndCap(nativePen, &(customCap->nativeCap)));

+    }

+

+    Status SetMiterLimit(IN REAL miterLimit)

+    {

+        return SetStatus(DllExports::GdipSetPenMiterLimit(nativePen, miterLimit));

+    }

+

+    REAL GetMiterLimit() const

+    {

+        REAL miterLimit;

+

+        SetStatus(DllExports::GdipGetPenMiterLimit(nativePen, &miterLimit));

+

+        return miterLimit;

+    }

+

+    // Set/get pen mode

+    Status SetAlignment(IN PenAlignment penAlignment)

+    {

+        return SetStatus(DllExports::GdipSetPenMode(nativePen, penAlignment));

+    }

+

+    PenAlignment GetAlignment() const

+    {

+        PenAlignment penAlignment;

+        

+        SetStatus(DllExports::GdipGetPenMode(nativePen, &penAlignment));

+        

+        return penAlignment;

+    }

+    

+    // Set/get pen transform

+    Status SetTransform(IN const Matrix* matrix)

+    {

+        return SetStatus(DllExports::GdipSetPenTransform(nativePen, 

+                                                         matrix->nativeMatrix));

+    }

+

+    Status GetTransform(OUT Matrix* matrix) const

+    {

+        return SetStatus(DllExports::GdipGetPenTransform(nativePen, matrix->nativeMatrix));

+    }

+

+    Status ResetTransform()

+    {

+        return SetStatus(DllExports::GdipResetPenTransform(nativePen));

+    }

+

+    Status MultiplyTransform(IN const Matrix* matrix,

+                             IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipMultiplyPenTransform(nativePen,

+                                                              matrix->nativeMatrix,

+                                                              order));

+    }

+

+    Status TranslateTransform(IN REAL dx, 

+                              IN REAL dy,

+                              IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipTranslatePenTransform(nativePen,

+                                                               dx, dy, order));

+    }

+

+    Status ScaleTransform(IN REAL sx, 

+                          IN REAL sy,

+                          IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipScalePenTransform(nativePen,

+                                                             sx, sy, order));

+    }

+

+    Status RotateTransform(IN REAL angle, 

+                           IN MatrixOrder order = MatrixOrderPrepend)

+    {

+        return SetStatus(DllExports::GdipRotatePenTransform(nativePen,

+                                                              angle, order));

+    }

+

+    PenType GetPenType() const

+    {

+       PenType type;

+       SetStatus(DllExports::GdipGetPenFillType(nativePen, &type));

+

+       return type;

+    }

+

+    Status SetColor(IN const Color& color)

+    {

+        return SetStatus(DllExports::GdipSetPenColor(nativePen,

+                                                     color.GetValue()));

+    }

+

+    Status SetBrush(IN const Brush* brush)

+    {

+        return SetStatus(DllExports::GdipSetPenBrushFill(nativePen, 

+                                       brush->nativeBrush));

+    }

+

+    Status GetColor(OUT Color* color) const

+    {

+        if (color == NULL) 

+        {

+            return SetStatus(InvalidParameter);

+        }

+        

+        PenType type = GetPenType();

+

+        if (type != PenTypeSolidColor) 

+        {

+            return WrongState;

+        }

+        

+        ARGB argb;

+        

+        SetStatus(DllExports::GdipGetPenColor(nativePen,

+                                              &argb));

+        if (lastResult == Ok)

+        {

+            color->SetValue(argb);

+        }

+        

+        return lastResult;

+    }

+

+    Brush* GetBrush() const

+    {

+       PenType type = GetPenType();

+

+       Brush* brush = NULL;

+

+       switch(type)

+       {

+       case PenTypeSolidColor:

+           brush = new SolidBrush();

+           break;

+

+       case PenTypeHatchFill:

+           brush = new HatchBrush();

+           break;

+

+       case PenTypeTextureFill:

+           brush = new TextureBrush();

+           break;

+

+       case PenTypePathGradient:

+           brush = new Brush();

+           break;

+

+       case PenTypeLinearGradient:

+           brush = new LinearGradientBrush();

+           break;

+

+       default:

+           break;

+       }

+

+       if(brush)

+       {

+           GpBrush* nativeBrush;

+

+           SetStatus(DllExports::GdipGetPenBrushFill(nativePen, &nativeBrush));

+           brush->SetNativeBrush(nativeBrush);

+       }

+

+       return brush;

+    }

+

+    DashStyle GetDashStyle() const

+    {

+        DashStyle dashStyle;

+

+        SetStatus(DllExports::GdipGetPenDashStyle(nativePen, &dashStyle));

+

+        return dashStyle;

+    }

+

+    Status SetDashStyle(IN DashStyle dashStyle)

+    {

+        return SetStatus(DllExports::GdipSetPenDashStyle(nativePen, dashStyle));

+    }

+

+    REAL GetDashOffset() const

+    {

+        REAL dashOffset;

+

+        SetStatus(DllExports::GdipGetPenDashOffset(nativePen, &dashOffset));

+

+        return dashOffset;

+    }

+

+    Status SetDashOffset(IN REAL dashOffset)

+    {

+        return SetStatus(DllExports::GdipSetPenDashOffset(nativePen, dashOffset));

+    }

+    

+    Status SetDashPattern(IN const REAL* dashArray, IN INT count)

+    {

+        return SetStatus(DllExports::GdipSetPenDashArray(nativePen, dashArray, 

+                                                    count));

+    }

+    

+    INT GetDashPatternCount() const

+    {

+        INT count = 0;

+        

+        SetStatus(DllExports::GdipGetPenDashCount(nativePen, &count));

+        

+        return count;

+    }

+

+    Status GetDashPattern(OUT REAL* dashArray, 

+                          IN INT count) const

+    {

+        if (dashArray == NULL || count <= 0)

+            return SetStatus(InvalidParameter); 

+        

+        return SetStatus(DllExports::GdipGetPenDashArray(nativePen, 

+                                                         dashArray, 

+                                                         count));

+    }

+

+    Status SetCompoundArray(IN const REAL* compoundArray,

+                            IN INT count)

+    {

+        return SetStatus(DllExports::GdipSetPenCompoundArray(nativePen, compoundArray, 

+                                                    count));

+    }

+

+    INT GetCompoundArrayCount() const

+    {

+        INT count = 0;

+        

+        SetStatus(DllExports::GdipGetPenCompoundCount(nativePen, &count));

+        

+        return count;

+    }

+

+    Status GetCompoundArray(OUT REAL* compoundArray, 

+                            IN INT count) const

+    {

+        if (compoundArray == NULL || count <= 0)

+            return SetStatus(InvalidParameter); 

+        

+        return SetStatus(DllExports::GdipGetPenCompoundArray(nativePen, 

+                                                             compoundArray, 

+                                                             count));

+    }

+

+    Status GetLastStatus() const

+    {

+        Status lastStatus = lastResult;

+        lastResult = Ok;

+

+        return lastStatus;

+    }

+

+protected:

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    Pen(const Pen &);

+    Pen& operator=(const Pen &);

+protected:

+

+#else

+

+    Pen(const Pen& pen)

+    {

+        pen;

+        SetStatus(NotImplemented);

+        SetNativePen(NULL);

+    }

+

+    Pen& operator=(const Pen& pen)

+    {

+        pen;

+        SetStatus(NotImplemented);

+        return *this;

+    }

+

+#endif

+

+    Pen(GpPen* nativePen, Status status)

+    {

+        lastResult = status;

+        SetNativePen(nativePen);

+    }

+

+    VOID SetNativePen(GpPen* nativePen)

+    {

+        this->nativePen = nativePen;

+    }

+    

+    Status SetStatus(Status status) const

+    {

+        if (status != Ok)

+            return (lastResult = status);

+        else 

+            return status;

+    }

+

+protected:

+    GpPen* nativePen;

+    mutable Status lastResult;

+};

+

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h b/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h
new file mode 100644
index 0000000..f9dc599
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h
@@ -0,0 +1,201 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   Gdiplus pixel formats

+*

+* Abstract:

+*

+*   Definitions for color types, palettes, pixel format IDs.

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSPIXELFORMATS_H

+#define _GDIPLUSPIXELFORMATS_H

+

+/*

+ * 32-bit and 64-bit ARGB pixel value

+ */

+

+typedef DWORD ARGB;

+typedef DWORDLONG ARGB64;

+

+#define ALPHA_SHIFT 24

+#define RED_SHIFT   16

+#define GREEN_SHIFT 8

+#define BLUE_SHIFT  0

+#define ALPHA_MASK  ((ARGB) 0xff << ALPHA_SHIFT)

+

+/*

+ * In-memory pixel data formats:

+ * bits 0-7 = format index

+ * bits 8-15 = pixel size (in bits)

+ * bits 16-23 = flags

+ * bits 24-31 = reserved

+ */

+

+#ifndef DCR_USE_NEW_105760

+

+enum PixelFormat

+{

+    PixelFormatIndexed      = 0x00010000, // Indexes into a palette

+    PixelFormatGDI          = 0x00020000, // Is a GDI-supported format

+    PixelFormatAlpha        = 0x00040000, // Has an alpha component

+    PixelFormatPAlpha       = 0x00080000, // Uses pre-multiplied alpha

+    PixelFormatExtended     = 0x00100000, // Uses extended color (16 bits per channel)

+    PixelFormatCanonical    = 0x00200000, // ?

+

+    PixelFormatUndefined       =  0,

+    PixelFormatDontCare       =  0,

+

+    PixelFormat1bppIndexed     =  1 | ( 1 << 8) | PixelFormatIndexed

+                                                | PixelFormatGDI,

+    PixelFormat4bppIndexed     =  2 | ( 4 << 8) | PixelFormatIndexed

+                                                | PixelFormatGDI,

+    PixelFormat8bppIndexed     =  3 | ( 8 << 8) | PixelFormatIndexed

+                                                | PixelFormatGDI,

+    PixelFormat16bppGrayScale  =  4 | (16 << 8) | PixelFormatExtended,

+    PixelFormat16bppRGB555     =  5 | (16 << 8) | PixelFormatGDI,

+    PixelFormat16bppRGB565     =  6 | (16 << 8) | PixelFormatGDI,

+    PixelFormat16bppARGB1555   =  7 | (16 << 8) | PixelFormatAlpha

+                                                | PixelFormatGDI,

+    PixelFormat24bppRGB        =  8 | (24 << 8) | PixelFormatGDI,

+    PixelFormat32bppRGB        =  9 | (32 << 8) | PixelFormatGDI,

+    PixelFormat32bppARGB       = 10 | (32 << 8) | PixelFormatAlpha

+                                                | PixelFormatGDI

+                                                | PixelFormatCanonical,

+    PixelFormat32bppPARGB      = 11 | (32 << 8) | PixelFormatAlpha

+                                                | PixelFormatPAlpha

+                                                | PixelFormatGDI,

+    PixelFormat48bppRGB        = 12 | (48 << 8) | PixelFormatExtended,

+    PixelFormat64bppARGB       = 13 | (64 << 8) | PixelFormatAlpha

+                                                | PixelFormatCanonical

+                                                | PixelFormatExtended,

+    PixelFormat64bppPARGB      = 14 | (64 << 8) | PixelFormatAlpha

+                                                | PixelFormatPAlpha

+                                                | PixelFormatExtended,

+    PixelFormat24bppBGR        = 15 | (24 << 8) | PixelFormatGDI, 

+    PixelFormatMax             = 16

+};

+

+#else

+

+typedef INT PixelFormat;

+

+#define    PixelFormatIndexed      0x00010000 // Indexes into a palette

+#define    PixelFormatGDI          0x00020000 // Is a GDI-supported format

+#define    PixelFormatAlpha        0x00040000 // Has an alpha component

+#define    PixelFormatPAlpha       0x00080000 // Uses pre-multiplied alpha

+#define    PixelFormatExtended     0x00100000 // Uses extended color (16 bits per channel)

+#define    PixelFormatCanonical    0x00200000 // ?

+

+#define    PixelFormatUndefined       0

+#define    PixelFormatDontCare        0

+

+#define    PixelFormat1bppIndexed     (1 | ( 1 << 8) | PixelFormatIndexed | PixelFormatGDI)

+#define    PixelFormat4bppIndexed     (2 | ( 4 << 8) | PixelFormatIndexed | PixelFormatGDI)

+#define    PixelFormat8bppIndexed     (3 | ( 8 << 8) | PixelFormatIndexed | PixelFormatGDI)

+#define    PixelFormat16bppGrayScale  (4 | (16 << 8) | PixelFormatExtended)

+#define    PixelFormat16bppRGB555     (5 | (16 << 8) | PixelFormatGDI)

+#define    PixelFormat16bppRGB565     (6 | (16 << 8) | PixelFormatGDI)

+#define    PixelFormat16bppARGB1555   (7 | (16 << 8) | PixelFormatAlpha | PixelFormatGDI)

+#define    PixelFormat24bppRGB        (8 | (24 << 8) | PixelFormatGDI)

+#define    PixelFormat32bppRGB        (9 | (32 << 8) | PixelFormatGDI)

+#define    PixelFormat32bppARGB       (10 | (32 << 8) | PixelFormatAlpha | PixelFormatGDI | PixelFormatCanonical)

+#define    PixelFormat32bppPARGB      (11 | (32 << 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatGDI)

+#define    PixelFormat48bppRGB        (12 | (48 << 8) | PixelFormatExtended)

+#define    PixelFormat64bppARGB       (13 | (64 << 8) | PixelFormatAlpha  | PixelFormatCanonical | PixelFormatExtended)

+#define    PixelFormat64bppPARGB      (14 | (64 << 8) | PixelFormatAlpha  | PixelFormatPAlpha | PixelFormatExtended)

+#define    PixelFormatMax             15

+

+#endif

+

+

+/*

+ * Return the pixel size for the specified format (in bits)

+ */

+

+inline UINT

+GetPixelFormatSize(

+                   PixelFormat pixfmt

+    )

+{

+    return (pixfmt >> 8) & 0xff;

+}

+

+/*

+ * Determine if the specified pixel format is an indexed color format

+ */

+

+inline BOOL

+IsIndexedPixelFormat(

+                     PixelFormat pixfmt

+    )

+{

+    return (pixfmt & PixelFormatIndexed) != 0;

+}

+

+/*

+ * Determine if the pixel format can have alpha channel

+ */

+

+inline BOOL

+IsAlphaPixelFormat(

+                     PixelFormat pixfmt

+)

+{

+   return (pixfmt & PixelFormatAlpha) != 0;

+}

+

+/*

+ * Determine if the pixel format is an extended format,

+ * i.e. supports 16-bit per channel

+ */

+

+inline BOOL

+IsExtendedPixelFormat(

+                     PixelFormat pixfmt

+    )

+{

+   return (pixfmt & PixelFormatExtended) != 0;

+}

+

+/*

+ * Determine if the pixel format is canonical format:

+ *   PixelFormat32bppARGB

+ *   PixelFormat32bppPARGB

+ *   PixelFormat64bppARGB

+ *   PixelFormat64bppPARGB

+ */

+

+inline BOOL

+IsCanonicalPixelFormat(

+                     PixelFormat pixfmt

+    )

+{

+   return (pixfmt & PixelFormatCanonical) != 0;

+}

+

+/*

+ * Color palette

+ * palette entries are limited to 32bpp ARGB pixel format

+ */ 

+

+enum PaletteFlags

+{

+    PaletteFlagsHasAlpha    = 0x0001,

+    PaletteFlagsGrayScale   = 0x0002,

+    PaletteFlagsHalftone    = 0x0004

+};

+

+struct ColorPalette

+{

+public:

+    UINT Flags;             // palette flags

+    UINT Count;             // number of color entries

+    ARGB Entries[1];        // palette color entries

+};

+

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h b/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h
new file mode 100644
index 0000000..dd1d20e
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h
@@ -0,0 +1,498 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusRegion.h

+*

+* Abstract:

+*

+*   Region API related declarations

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSREGION_H

+#define _GDIPLUSREGION_H

+

+/**

+ * Construct a new region object

+ */

+

+inline 

+Region::Region()

+{

+    GpRegion *region = NULL;

+

+    lastResult = DllExports::GdipCreateRegion(&region);

+

+    SetNativeRegion(region);

+}

+

+inline 

+Region::Region(IN const RectF& rect)

+{

+    GpRegion *region = NULL;

+

+    lastResult = DllExports::GdipCreateRegionRect(&rect, &region);

+

+    SetNativeRegion(region);

+}

+

+inline 

+Region::Region(IN const Rect& rect)

+{

+    GpRegion *region = NULL;

+

+    lastResult = DllExports::GdipCreateRegionRectI(&rect, &region);

+

+    SetNativeRegion(region);

+}

+

+inline 

+Region::Region(IN const GraphicsPath* path)

+{

+    GpRegion *region = NULL;

+

+    lastResult = DllExports::GdipCreateRegionPath(path->nativePath, &region);

+

+    SetNativeRegion(region);

+}

+

+inline 

+Region::Region(IN const BYTE* regionData, IN INT size)

+{

+    GpRegion *region = NULL;

+

+    lastResult = DllExports::GdipCreateRegionRgnData(regionData, size, &region);

+

+    SetNativeRegion(region);

+}

+

+inline 

+Region::Region(IN HRGN hRgn)

+{

+    GpRegion *region = NULL;

+

+    lastResult = DllExports::GdipCreateRegionHrgn(hRgn, &region);

+

+    SetNativeRegion(region);

+}

+

+inline 

+Region* Region::FromHRGN(IN HRGN hRgn)

+{

+    GpRegion *region = NULL;

+

+    if (DllExports::GdipCreateRegionHrgn(hRgn, &region) == Ok)

+    {

+        Region* newRegion = new Region(region);

+

+        if (newRegion == NULL) 

+        {

+            DllExports::GdipDeleteRegion(region);

+        }

+

+        return newRegion;

+    }

+    else

+        return NULL;

+}

+

+inline 

+Region::~Region()

+{

+    DllExports::GdipDeleteRegion(nativeRegion);

+}

+

+/**

+ * Make a copy of the region object

+ */

+inline Region* 

+Region::Clone() const

+{

+    GpRegion *region = NULL;

+

+    SetStatus(DllExports::GdipCloneRegion(nativeRegion, &region));

+

+    return new Region(region);

+}

+

+inline Status 

+Region::MakeInfinite()

+{

+    return SetStatus(DllExports::GdipSetInfinite(nativeRegion));

+}

+

+inline Status 

+Region::MakeEmpty()

+{

+    return SetStatus(DllExports::GdipSetEmpty(nativeRegion));

+}

+

+/**

+ * Region operations

+ */

+inline Status 

+Region::Intersect(IN const RectF& rect)

+{

+    return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeIntersect));

+}

+

+inline Status 

+Region::Intersect(IN const Rect& rect)

+{

+    return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeIntersect));

+}

+

+inline Status 

+Region::Intersect(IN const GraphicsPath* path)

+{

+    return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeIntersect));

+}

+

+inline Status 

+Region::Intersect(IN const Region* region)

+{

+    return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeIntersect));

+}

+

+inline Status 

+Region::Union(IN const RectF& rect)

+{

+    return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeUnion));

+}

+

+inline Status 

+Region::Union(IN const Rect& rect)

+{

+    return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeUnion));

+}

+

+inline Status 

+Region::Union(IN const GraphicsPath* path)

+{

+    return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeUnion));

+}

+

+inline Status 

+Region::Union(IN const Region* region)

+{

+    return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeUnion));

+}

+

+inline Status 

+Region::Xor(IN const RectF& rect)

+{

+    return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeXor));

+}

+

+inline Status 

+Region::Xor(IN const Rect& rect)

+{

+    return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeXor));

+}

+

+inline Status 

+Region::Xor(IN const GraphicsPath* path)

+{

+    return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeXor));

+}

+

+inline Status 

+Region::Xor(IN const Region* region)

+{

+    return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeXor));

+}

+

+inline Status 

+Region::Exclude(IN const RectF& rect)

+{

+    return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeExclude));

+}

+

+inline Status 

+Region::Exclude(IN const Rect& rect)

+{

+     return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeExclude));

+}

+

+inline Status 

+Region::Exclude(IN const GraphicsPath* path)

+{

+    return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeExclude));

+}

+

+inline Status

+Region::Exclude(IN const Region* region)

+{

+    return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion,

+                                               region->nativeRegion, CombineModeExclude));

+}

+

+inline Status 

+Region::Complement(IN const RectF& rect)

+{

+    return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeComplement));

+}

+

+inline Status 

+Region::Complement(IN const Rect& rect)

+{

+    return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeComplement));

+}

+

+inline Status 

+Region::Complement(IN const GraphicsPath* path)

+{

+    return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion,

+                                                path->nativePath, CombineModeComplement));

+}

+

+inline Status 

+Region::Complement(IN const Region* region)

+{

+    return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion,

+                                                  region->nativeRegion, CombineModeComplement));

+}

+

+/**

+ * Transform operations

+ */

+inline Status 

+Region::Translate(IN REAL dx, 

+                  IN REAL dy)

+{

+    return SetStatus(DllExports::GdipTranslateRegion(nativeRegion, dx, dy));

+}

+

+inline Status 

+Region::Translate(IN INT dx, 

+                  IN INT dy)

+{

+    return SetStatus(DllExports::GdipTranslateRegionI(nativeRegion, dx, dy));

+}

+

+inline Status 

+Region::Transform(IN const Matrix* matrix)

+{

+    return SetStatus(DllExports::GdipTransformRegion(nativeRegion, matrix->nativeMatrix));

+}

+

+/**

+ * Get region attributes

+ */

+inline Status 

+Region::GetBounds(OUT RectF* rect,

+                  IN const Graphics* g) const

+{

+    return SetStatus(DllExports::GdipGetRegionBounds(nativeRegion,

+                                                g->nativeGraphics,

+                                                rect));

+}

+

+inline Status 

+Region::GetBounds(OUT Rect* rect,

+                  IN const Graphics* g) const

+{

+    return SetStatus(DllExports::GdipGetRegionBoundsI(nativeRegion,

+                                                g->nativeGraphics,

+                                                rect));

+}

+

+inline HRGN

+Region::GetHRGN(IN const Graphics* g) const

+{

+    HRGN hrgn;

+

+    SetStatus(DllExports::GdipGetRegionHRgn(nativeRegion,

+                                            g->nativeGraphics,

+                                            &hrgn));

+

+    return hrgn;

+}

+

+inline BOOL 

+Region::IsEmpty(IN const Graphics *g) const

+{

+    BOOL booln = FALSE;

+   

+    SetStatus(DllExports::GdipIsEmptyRegion(nativeRegion,

+                                            g->nativeGraphics,

+                                            &booln));

+

+    return booln;

+}

+

+inline BOOL 

+Region::IsInfinite(IN const Graphics *g) const

+{

+    BOOL booln = FALSE;

+

+    SetStatus(DllExports::GdipIsInfiniteRegion(nativeRegion,

+                                                 g->nativeGraphics,

+                                                 &booln));

+

+    return booln;

+}

+

+inline BOOL 

+Region::Equals(IN const Region* region, 

+               IN const Graphics* g) const

+{

+    BOOL booln = FALSE;

+

+    SetStatus(DllExports::GdipIsEqualRegion(nativeRegion,

+                                              region->nativeRegion,

+                                              g->nativeGraphics,

+                                              &booln));

+    return booln;

+}

+

+// Get the size of the buffer needed for the GetData method

+inline UINT 

+Region::GetDataSize() const

+{

+    UINT     bufferSize = 0;

+    

+    SetStatus(DllExports::GdipGetRegionDataSize(nativeRegion, &bufferSize));

+    

+    return bufferSize;

+}

+

+// buffer     - where to put the data

+// bufferSize - how big the buffer is (should be at least as big as GetDataSize())

+// sizeFilled - if not NULL, this is an OUT param that says how many bytes

+//              of data were written to the buffer.

+inline Status 

+Region::GetData(OUT BYTE* buffer, 

+                IN UINT bufferSize, 

+                OUT UINT* sizeFilled) const

+{

+    return SetStatus(DllExports::GdipGetRegionData(nativeRegion, buffer, bufferSize, sizeFilled));

+}

+

+/**

+ * Hit testing operations

+ */

+inline BOOL 

+Region::IsVisible(IN const PointF& point, 

+                  IN const Graphics* g) const

+{

+    BOOL booln = FALSE;

+

+    SetStatus(DllExports::GdipIsVisibleRegionPoint(nativeRegion,

+                                     point.X, point.Y, 

+                                     (g == NULL) ? NULL : g->nativeGraphics,

+                                     &booln));

+    return booln;

+}

+

+inline BOOL 

+Region::IsVisible(IN const RectF& rect, 

+                  IN const Graphics* g) const

+{

+    BOOL booln = FALSE;

+

+    SetStatus(DllExports::GdipIsVisibleRegionRect(nativeRegion, rect.X,

+                                                    rect.Y, rect.Width,

+                                                    rect.Height,

+                                                    (g == NULL) ? NULL : g->nativeGraphics,

+                                                    &booln));

+    return booln;

+}

+

+inline BOOL 

+Region::IsVisible(IN const Point& point, 

+                  IN const Graphics* g) const

+{

+    BOOL booln = FALSE;

+

+

+    SetStatus(DllExports::GdipIsVisibleRegionPointI(nativeRegion,

+                                                   point.X,

+                                                   point.Y,

+                                                   (g == NULL) ? NULL : g->nativeGraphics,

+                                                   &booln));

+    return booln;

+}

+

+inline BOOL 

+Region::IsVisible(IN const Rect& rect, 

+                  IN const Graphics* g) const

+{

+    BOOL booln = FALSE;

+

+    SetStatus(DllExports::GdipIsVisibleRegionRectI(nativeRegion,

+                                                  rect.X,

+                                                  rect.Y,

+                                                  rect.Width,

+                                                  rect.Height,

+                                                  (g == NULL) ? NULL : g->nativeGraphics,

+                                                  &booln));

+    return booln;

+}

+

+inline UINT 

+Region::GetRegionScansCount(IN const Matrix* matrix) const

+{

+    UINT count = 0;

+

+    SetStatus(DllExports::GdipGetRegionScansCount(nativeRegion,

+                                                  &count,

+                                                  matrix->nativeMatrix));

+    return count;

+}

+

+inline Status 

+Region::GetRegionScans(

+    IN const Matrix* matrix,

+    OUT RectF* rects,

+    IN OUT INT* count) const

+{

+    return SetStatus(DllExports::GdipGetRegionScans(nativeRegion,

+                                          rects,

+                                          count,

+                                          matrix->nativeMatrix));

+}

+

+// If rects is NULL, return the count of rects in the region.

+// Otherwise, assume rects is big enough to hold all the region rects

+// and fill them in and return the number of rects filled in.

+// The rects are returned in the units specified by the matrix

+// (which is typically a world-to-device transform).

+// Note that the number of rects returned can vary, depending on the

+// matrix that is used.

+inline Status 

+Region::GetRegionScans(

+    IN const Matrix* matrix,

+    OUT Rect* rects,       // NULL to just get the count

+    IN OUT INT* count) const

+{

+    return SetStatus(DllExports::GdipGetRegionScansI(nativeRegion,

+                                          rects,

+                                          count,

+                                          matrix->nativeMatrix));

+}

+

+// protected method

+inline Region::Region(GpRegion* nativeRegion)

+{

+    SetNativeRegion(nativeRegion);

+}

+

+// protected method

+inline VOID Region::SetNativeRegion(GpRegion* nativeRegion)

+{

+    this->nativeRegion = nativeRegion;

+}

+

+inline Status Region::GetLastStatus() const

+{

+    Status lastStatus = lastResult;

+    lastResult = Ok;

+

+    return lastStatus;

+}

+

+#endif // !_GDIPLUSREGION_H

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h b/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h
new file mode 100644
index 0000000..1c9ddb5
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h
@@ -0,0 +1,381 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusStringFormat.h

+*

+* Abstract:

+*

+*   String format specification for DrawString and text APIs

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSSTRINGFORMAT_H

+#define _GDIPLUSSTRINGFORMAT_H

+

+

+class StringFormat : public GdiplusBase

+{

+public:

+    friend class Graphics;

+    friend class GraphicsPath;

+

+

+    StringFormat(

+        IN INT     formatFlags = 0,

+        IN LANGID  language = LANG_NEUTRAL

+    )

+    {

+        nativeFormat = NULL;

+        lastError = DllExports::GdipCreateStringFormat(

+            formatFlags,

+            language,

+            &nativeFormat

+        );

+    }

+

+    static const StringFormat *GenericDefault();

+    static const StringFormat *GenericTypographic();

+

+    // Constructor based on existing string format

+

+    StringFormat(

+        IN const StringFormat *format

+    )

+    {

+        nativeFormat = NULL;

+        lastError = DllExports::GdipCloneStringFormat(

+            format ? format->nativeFormat : NULL,

+            &nativeFormat

+        );

+    }

+

+    StringFormat *Clone() const

+    {

+        GpStringFormat *clonedStringFormat = NULL;

+

+        lastError = DllExports::GdipCloneStringFormat(

+            nativeFormat,

+            &clonedStringFormat

+        );

+

+        if (lastError == Ok)

+            return new StringFormat(clonedStringFormat, lastError);

+        else

+            return NULL;

+    }

+

+    ~StringFormat()

+    {

+        DllExports::GdipDeleteStringFormat(nativeFormat);

+    }

+

+    Status SetFormatFlags(IN INT flags)

+    {

+        return SetStatus(DllExports::GdipSetStringFormatFlags(

+            nativeFormat,

+            flags

+        ));

+    }

+

+    INT GetFormatFlags() const

+    {

+        INT flags;

+        SetStatus(DllExports::GdipGetStringFormatFlags(nativeFormat, &flags));

+        return flags;

+    }

+

+#ifndef DCR_USE_NEW_152154

+    Status SetLineSpacing(

+        IN REAL        amount = 1.0f,

+        IN LineSpacing method = LineSpacingRecommended

+    )

+    {

+        return SetStatus(DllExports::GdipSetStringFormatLineSpacing(

+            nativeFormat,

+            amount,

+            method

+        ));

+    }

+#endif

+

+    Status SetAlignment(IN StringAlignment align)

+    {

+        return SetStatus(DllExports::GdipSetStringFormatAlign(

+            nativeFormat,

+            align

+        ));

+    }

+

+    StringAlignment GetAlignment() const

+    {

+        StringAlignment alignment;

+        SetStatus(DllExports::GdipGetStringFormatAlign(

+            nativeFormat,

+            &alignment

+        ));

+        return alignment;

+    }

+

+    Status SetLineAlignment(IN StringAlignment align)

+    {

+        return SetStatus(DllExports::GdipSetStringFormatLineAlign(

+            nativeFormat,

+            align

+        ));

+    }

+

+    StringAlignment GetLineAlignment() const

+    {

+        StringAlignment alignment;

+        SetStatus(DllExports::GdipGetStringFormatLineAlign(

+            nativeFormat,

+            &alignment

+        ));

+        return alignment;

+    }

+

+    Status SetHotkeyPrefix(IN HotkeyPrefix hotkeyPrefix)

+    {

+        return SetStatus(DllExports::GdipSetStringFormatHotkeyPrefix(

+            nativeFormat,

+            (INT)hotkeyPrefix

+        ));

+    }

+

+    HotkeyPrefix GetHotkeyPrefix() const

+    {

+        HotkeyPrefix hotkeyPrefix;

+        SetStatus(DllExports::GdipGetStringFormatHotkeyPrefix(

+            nativeFormat,

+            (INT*)&hotkeyPrefix

+        ));

+        return hotkeyPrefix;

+    }

+

+    Status SetTabStops(

+        IN REAL    firstTabOffset,

+        IN INT     count,

+        IN const REAL    *tabStops

+    )

+    {

+        return SetStatus(DllExports::GdipSetStringFormatTabStops(

+            nativeFormat,

+            firstTabOffset,

+            count,

+            tabStops

+        ));

+    }

+

+    INT GetTabStopCount() const

+    {

+        INT count;

+        SetStatus(DllExports::GdipGetStringFormatTabStopCount(nativeFormat, &count));

+        return count;

+    }

+

+    Status GetTabStops(

+        IN INT     count,

+        OUT REAL   *firstTabOffset,

+        OUT REAL   *tabStops

+    ) const

+    {

+        return SetStatus(DllExports::GdipGetStringFormatTabStops(

+            nativeFormat,

+            count,

+            firstTabOffset,

+            tabStops

+        ));

+    }

+

+#ifdef DCR_USE_NEW_146933

+    Status SetDigitSubstitution(

+        IN LANGID                language,

+        IN StringDigitSubstitute substitute

+    )

+    {

+        return SetStatus(DllExports::GdipSetStringFormatDigitSubstitution(

+            nativeFormat,

+            language,

+            substitute

+        ));

+    }

+

+    LANGID GetDigitSubstitutionLanguage(

+    ) const

+    {

+        LANGID language;

+        SetStatus(DllExports::GdipGetStringFormatDigitSubstitution(

+            nativeFormat,

+            &language,

+            NULL

+        ));

+        return language;

+    }

+

+    StringDigitSubstitute GetDigitSubstitutionMethod(

+    ) const

+    {

+        StringDigitSubstitute substitute;

+        SetStatus(DllExports::GdipGetStringFormatDigitSubstitution(

+            nativeFormat,

+            NULL,

+            &substitute

+        ));

+        return substitute;

+    }

+#endif // DCR_USE_NEW_146933

+

+    // String trimming. How to handle more text than can be displayed

+    // in the limits available.

+

+    Status SetTrimming(IN StringTrimming trimming)

+    {

+        return SetStatus(DllExports::GdipSetStringFormatTrimming(

+            nativeFormat,

+            trimming

+        ));

+    }

+

+    StringTrimming StringFormat::GetTrimming() const

+    {

+        StringTrimming trimming;

+        SetStatus(DllExports::GdipGetStringFormatTrimming(

+            nativeFormat,

+            &trimming

+        ));

+        return trimming;

+    }

+

+#ifdef DCR_USE_NEW_174340

+    Status SetMeasurableCharacterRanges(

+        IN INT                  rangeCount,

+        IN const CharacterRange *ranges

+    )

+    {

+        return SetStatus(DllExports::GdipSetStringFormatMeasurableCharacterRanges(

+            nativeFormat,

+            rangeCount,

+            ranges

+        ));

+    }

+

+    INT GetMeasurableCharacterRangeCount()

+    {

+        INT count;

+        SetStatus(DllExports::GdipGetStringFormatMeasurableCharacterRangeCount(

+            nativeFormat,

+            &count

+        ));

+        return count;

+    }

+#endif

+

+    // GetLastStatus - return last error code and clear error code

+

+    Status GetLastStatus() const

+    {

+        Status lastStatus = lastError;

+        lastError = Ok;

+

+        return lastStatus;

+    }

+

+protected:

+

+    Status SetStatus(GpStatus newStatus) const

+    {

+        if (newStatus == Ok)

+        {

+            return Ok;

+        }

+        else

+        {

+            return lastError = newStatus;

+        }

+    }

+

+

+// Not allowed and move to private

+    StringFormat(const StringFormat &source)

+    {

+        nativeFormat = NULL;

+        lastError = DllExports::GdipCloneStringFormat(

+            source.nativeFormat,

+            &nativeFormat

+        );

+    }

+

+    StringFormat& operator=(const StringFormat &source)

+    {

+        DllExports::GdipDeleteStringFormat(nativeFormat);

+        lastError = DllExports::GdipCloneStringFormat(

+            source.nativeFormat,

+            &nativeFormat

+        );

+        return *this;

+    }

+

+

+    // private constructor for copy

+    StringFormat(GpStringFormat * clonedStringFormat, Status status)

+    {

+        lastError = status;

+        nativeFormat = clonedStringFormat;

+

+    }

+

+    GpStringFormat *nativeFormat;

+    mutable Status  lastError;

+};

+

+// Generic constant string formats.

+

+static BYTE GenericTypographicStringFormatBuffer[sizeof(StringFormat)] = {0};

+static BYTE GenericDefaultStringFormatBuffer[sizeof(StringFormat)] = {0};

+

+static StringFormat *GenericTypographicStringFormat = NULL;

+static StringFormat *GenericDefaultStringFormat     = NULL;

+

+// Define the generic string formats

+

+

+inline const StringFormat *StringFormat::GenericDefault()

+{

+    if (GenericDefaultStringFormat != NULL)

+    {

+        return GenericDefaultStringFormat;

+    }

+

+    GenericDefaultStringFormat =

+        (StringFormat*)GenericDefaultStringFormatBuffer;

+

+    GenericDefaultStringFormat->lastError =

+        DllExports::GdipStringFormatGetGenericDefault(

+            &(GenericDefaultStringFormat->nativeFormat)

+        );

+

+    return GenericDefaultStringFormat;

+}

+

+inline const StringFormat *StringFormat::GenericTypographic()

+{

+    if (GenericTypographicStringFormat != NULL)

+    {

+        return GenericTypographicStringFormat;

+    }

+

+    GenericTypographicStringFormat =

+        (StringFormat*)GenericTypographicStringFormatBuffer;

+

+    GenericTypographicStringFormat->lastError =

+        DllExports::GdipStringFormatGetGenericTypographic(

+            &GenericTypographicStringFormat->nativeFormat

+        );

+

+    return GenericTypographicStringFormat;

+}

+

+#endif // !_GDIPLUSSTRINGFORMAT_H

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h b/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h
new file mode 100644
index 0000000..58c584d
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h
@@ -0,0 +1,826 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   GdiplusTypes.h

+*

+* Abstract:

+*

+*   Basic types used by GDI+

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSTYPES_H

+#define _GDIPLUSTYPES_H

+

+#ifndef DCR_USE_NEW_175866

+

+//--------------------------------------------------------------------------

+// LIB version initialization functions

+//--------------------------------------------------------------------------

+

+typedef VOID (__cdecl *DEBUGEVENTFUNCTION)(INT level, CHAR *message);

+

+extern "C" BOOL __stdcall InitializeGdiplus(DEBUGEVENTFUNCTION);

+extern "C" VOID __stdcall UninitializeGdiplus();

+

+#endif

+

+//--------------------------------------------------------------------------

+// Callback functions

+//--------------------------------------------------------------------------

+

+extern "C" {

+typedef BOOL (CALLBACK * ImageAbort)(VOID *);

+typedef ImageAbort DrawImageAbort;

+typedef ImageAbort GetThumbnailImageAbort;

+}

+

+// Callback for EnumerateMetafile methods.  The parameters are:

+

+//      recordType      WMF, EMF, or EMF+ record type

+//      flags           (always 0 for WMF/EMF records)

+//      dataSize        size of the record data (in bytes), or 0 if no data

+//      data            pointer to the record data, or NULL if no data

+//      callbackData    pointer to callbackData, if any

+

+// This method can then call Metafile::PlayRecord to play the

+// record that was just enumerated.  If this method  returns

+// FALSE, the enumeration process is aborted.  Otherwise, it continues.

+

+extern "C" {

+typedef BOOL (CALLBACK * EnumerateMetafileProc)(EmfPlusRecordType,UINT,UINT,const BYTE*,VOID*);

+}

+

+//--------------------------------------------------------------------------

+// Primitive data types

+//

+// NOTE:

+//  Types already defined in standard header files:

+//      INT8

+//      UINT8

+//      INT16

+//      UINT16

+//      INT32

+//      UINT32

+//      INT64

+//      UINT64

+//

+//  Avoid using the following types:

+//      LONG - use INT

+//      ULONG - use UINT

+//      DWORD - use UINT32

+//--------------------------------------------------------------------------

+

+typedef float REAL;

+

+#define REAL_MAX            FLT_MAX

+#define REAL_MIN            FLT_MIN

+#define REAL_TOLERANCE     (FLT_MIN * 100)

+#define REAL_EPSILON        1.192092896e-07F        /* FLT_EPSILON */

+

+//--------------------------------------------------------------------------

+// Forward declarations of various internal classes

+//--------------------------------------------------------------------------

+

+class Size;

+class SizeF;

+class Point;

+class PointF;

+class Rect;

+class RectF;

+class CharacterRange;

+

+//--------------------------------------------------------------------------

+// Return values from any GDI+ API

+//--------------------------------------------------------------------------

+

+enum Status

+{

+    Ok = 0,

+    GenericError = 1,

+    InvalidParameter = 2,

+    OutOfMemory = 3,

+    ObjectBusy = 4,

+    InsufficientBuffer = 5,

+    NotImplemented = 6,

+    Win32Error = 7,

+    WrongState = 8,

+    Aborted = 9,

+#ifdef DCR_USE_NEW_135429

+    FileNotFound = 10,

+    ValueOverflow = 11,

+    AccessDenied = 12,

+    UnknownImageFormat = 13,

+    FontFamilyNotFound = 14,

+    FontStyleNotFound = 15,

+    NotTrueTypeFont = 16,

+#else

+    NotFound = 10,

+    ValueOverflow = 11,

+#endif

+    UnsupportedGdiplusVersion = 17,

+    GdiplusNotInitialized

+

+};

+

+//--------------------------------------------------------------------------

+// Represents a dimension in a 2D coordinate system

+//  (floating-point coordinates)

+//--------------------------------------------------------------------------

+

+class SizeF

+{

+public:

+

+   // Default constructor

+    SizeF()

+    {

+        Width = Height = 0.0f;

+    }

+

+    SizeF(IN const SizeF& size)

+    {

+        Width = size.Width;

+        Height = size.Height;

+    }

+

+    SizeF(IN REAL width,

+          IN REAL height)

+    {

+        Width = width;

+        Height = height;

+    }

+

+    SizeF operator+(IN const SizeF& sz) const

+    {

+        return SizeF(Width + sz.Width,

+                     Height + sz.Height);

+    }

+

+    SizeF operator-(IN const SizeF& sz) const

+    {

+        return SizeF(Width - sz.Width,

+                     Height - sz.Height);

+    }

+

+    BOOL Equals(IN const SizeF& sz) const

+    {

+        return (Width == sz.Width) && (Height == sz.Height);

+    }

+

+    BOOL Empty() const

+    {

+        return (Width == 0.0f && Height == 0.0f);

+    }

+

+public:

+

+    REAL Width;

+    REAL Height;

+};

+

+//--------------------------------------------------------------------------

+// Represents a dimension in a 2D coordinate system

+//  (integer coordinates)

+//--------------------------------------------------------------------------

+

+class Size

+{

+public:

+

+   // Default constructor

+    Size()

+    {

+        Width = Height = 0;

+    }

+

+    Size(IN const Size& size)

+    {

+        Width = size.Width;

+        Height = size.Height;

+    }

+

+    Size(IN INT width,

+         IN INT height)

+    {

+        Width = width;

+        Height = height;

+    }

+

+    Size operator+(IN const Size& sz) const

+    {

+        return Size(Width + sz.Width,

+                    Height + sz.Height);

+    }

+

+    Size operator-(IN const Size& sz) const

+    {

+        return Size(Width - sz.Width,

+                    Height - sz.Height);

+    }

+

+    BOOL Equals(IN const Size& sz) const

+    {

+        return (Width == sz.Width) && (Height == sz.Height);

+    }

+

+    BOOL Empty() const

+    {

+        return (Width == 0 && Height == 0);

+    }

+

+public:

+

+    INT Width;

+    INT Height;

+};

+

+//--------------------------------------------------------------------------

+// Represents a location in a 2D coordinate system

+//  (floating-point coordinates)

+//--------------------------------------------------------------------------

+

+class PointF

+{

+public:

+   PointF()

+   {

+       X = Y = 0.0f;

+   }

+

+   PointF(IN const PointF &point)

+   {

+       X = point.X;

+       Y = point.Y;

+   }

+

+   PointF(IN const SizeF &size)

+   {

+       X = size.Width;

+       Y = size.Height;

+   }

+

+   PointF(IN REAL x,

+          IN REAL y)

+   {

+       X = x;

+       Y = y;

+   }

+

+   PointF operator+(IN const PointF& point) const

+   {

+       return PointF(X + point.X,

+                     Y + point.Y);

+   }

+

+   PointF operator-(IN const PointF& point) const

+   {

+       return PointF(X - point.X,

+                     Y - point.Y);

+   }

+

+   BOOL Equals(IN const PointF& point)

+   {

+       return (X == point.X) && (Y == point.Y);

+   }

+

+public:

+

+    REAL X;

+    REAL Y;

+};

+

+//--------------------------------------------------------------------------

+// Represents a location in a 2D coordinate system

+//  (integer coordinates)

+//--------------------------------------------------------------------------

+

+class Point

+{

+public:

+   Point()

+   {

+       X = Y = 0;

+   }

+

+   Point(IN const Point &point)

+   {

+       X = point.X;

+       Y = point.Y;

+   }

+

+   Point(IN const Size &size)

+   {

+       X = size.Width;

+       Y = size.Height;

+   }

+

+   Point(IN INT x,

+         IN INT y)

+   {

+       X = x;

+       Y = y;

+   }

+

+   Point operator+(IN const Point& point) const

+   {

+       return Point(X + point.X,

+                    Y + point.Y);

+   }

+

+   Point operator-(IN const Point& point) const

+   {

+       return Point(X - point.X,

+                    Y - point.Y);

+   }

+

+   BOOL Equals(IN const Point& point)

+   {

+       return (X == point.X) && (Y == point.Y);

+   }

+

+public:

+

+    INT X;

+    INT Y;

+};

+

+//--------------------------------------------------------------------------

+// Represents a rectangle in a 2D coordinate system

+//  (floating-point coordinates)

+//--------------------------------------------------------------------------

+

+class RectF

+{

+public:

+

+    // Default constructor

+

+    RectF()

+    {

+        X = Y = Width = Height = 0.0f;

+    }

+

+    RectF(IN REAL x,

+          IN REAL y,

+          IN REAL width,

+          IN REAL height)

+    {

+        X = x;

+        Y = y;

+        Width = width;

+        Height = height;

+    }

+

+    RectF(IN const PointF& location,

+          IN const SizeF& size)

+    {

+        X = location.X;

+        Y = location.Y;

+        Width = size.Width;

+        Height = size.Height;

+    }

+

+    RectF* Clone() const

+    {

+        return new RectF(X, Y, Width, Height);

+    }

+

+    VOID GetLocation(OUT PointF* point) const

+    {

+        point->X = X;

+        point->Y = Y;

+    }

+

+    VOID GetSize(OUT SizeF* size) const

+    {

+        size->Width = Width;

+        size->Height = Height;

+    }

+

+    VOID GetBounds(OUT RectF* rect) const

+    {

+        rect->X = X;

+        rect->Y = Y;

+        rect->Width = Width;

+        rect->Height = Height;

+    }

+

+    // Return the left, top, right, and bottom

+    // coordinates of the rectangle

+

+    REAL GetLeft() const

+    {

+        return X;

+    }

+

+    REAL GetTop() const

+    {

+        return Y;

+    }

+

+    REAL GetRight() const

+    {

+        return X+Width;

+    }

+

+    REAL GetBottom() const

+    {

+        return Y+Height;

+    }

+

+    // Determine if the rectangle is empty

+    BOOL IsEmptyArea() const

+    {

+        return (Width <= REAL_EPSILON) || (Height <= REAL_EPSILON);

+    }

+

+    BOOL Equals(IN const RectF & rect) const

+    {

+        return X == rect.X &&

+               Y == rect.Y &&

+               Width == rect.Width &&

+               Height == rect.Height;

+    }

+

+    BOOL Contains(IN REAL x,

+                  IN REAL y) const

+    {

+        return x >= X && x < X+Width &&

+               y >= Y && y < Y+Height;

+    }

+

+    BOOL Contains(IN const PointF& pt) const

+    {

+        return Contains(pt.X, pt.Y);

+    }

+

+    BOOL Contains(IN const RectF& rect) const

+    {

+        return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&

+               (Y <= rect.Y) && (rect.GetBottom() <= GetBottom());

+    }

+

+    VOID Inflate(IN REAL dx,

+                 IN REAL dy)

+    {

+        X -= dx;

+        Y -= dy;

+        Width += 2*dx;

+        Height += 2*dy;

+    }

+

+    VOID Inflate(IN const PointF& point)

+    {

+        Inflate(point.X, point.Y);

+    }

+

+    // Intersect the current rect with the specified object

+

+    BOOL Intersect(IN const RectF& rect)

+    {

+        return Intersect(*this, *this, rect);

+    }

+

+    // Intersect rect a and b and save the result into c

+    // Notice that c may be the same object as a or b.

+

+    static BOOL Intersect(OUT RectF& c,

+                          IN const RectF& a,

+                          IN const RectF& b)

+    {

+        REAL right = min(a.GetRight(), b.GetRight());

+        REAL bottom = min(a.GetBottom(), b.GetBottom());

+        REAL left = max(a.GetLeft(), b.GetLeft());

+        REAL top = max(a.GetTop(), b.GetTop());

+

+        c.X = left;

+        c.Y = top;

+        c.Width = right - left;

+        c.Height = bottom - top;

+        return !c.IsEmptyArea();

+    }

+

+    // Determine if the specified rect intersects with the

+    // current rect object.

+

+    BOOL IntersectsWith(IN const RectF& rect) const

+    {

+        return (GetLeft() < rect.GetRight() &&

+                GetTop() < rect.GetTop() &&

+                GetRight() > rect.GetLeft() &&

+                GetBottom() > rect.GetTop());

+    }

+

+    static BOOL Union(OUT RectF& c,

+                      IN const RectF& a,

+                      IN const RectF& b)

+    {

+        REAL right = max(a.GetRight(), b.GetRight());

+        REAL bottom = max(a.GetBottom(), b.GetBottom());

+        REAL left = min(a.GetLeft(), b.GetLeft());

+        REAL top = min(a.GetTop(), b.GetTop());

+

+        c.X = left;

+        c.Y = top;

+        c.Width = right - left;

+        c.Height = bottom - top;

+        return !c.IsEmptyArea();

+    }

+

+    VOID Offset(IN const PointF& point)

+    {

+        Offset(point.X, point.Y);

+    }

+

+    VOID Offset(IN REAL dx,

+                IN REAL dy)

+    {

+        X += dx;

+        Y += dy;

+    }

+

+public:

+

+    REAL X;

+    REAL Y;

+    REAL Width;

+    REAL Height;

+};

+

+//--------------------------------------------------------------------------

+// Represents a rectangle in a 2D coordinate system

+//  (integer coordinates)

+//--------------------------------------------------------------------------

+

+class Rect

+{

+public:

+

+    // Default constructor

+

+    Rect()

+    {

+        X = Y = Width = Height = 0;

+    }

+

+    Rect(IN INT x,

+         IN INT y,

+         IN INT width,

+         IN INT height)

+    {

+        X = x;

+        Y = y;

+        Width = width;

+        Height = height;

+    }

+

+    Rect(IN const Point& location,

+         IN const Size& size)

+    {

+        X = location.X;

+        Y = location.Y;

+        Width = size.Width;

+        Height = size.Height;

+    }

+

+    Rect* Clone() const

+    {

+        return new Rect(X, Y, Width, Height);

+    }

+

+    VOID GetLocation(OUT Point* point) const

+    {

+        point->X = X;

+        point->Y = Y;

+    }

+

+    VOID GetSize(OUT Size* size) const

+    {

+        size->Width = Width;

+        size->Height = Height;

+    }

+

+    VOID GetBounds(OUT Rect* rect) const

+    {

+        rect->X = X;

+        rect->Y = Y;

+        rect->Width = Width;

+        rect->Height = Height;

+    }

+

+    // Return the left, top, right, and bottom

+    // coordinates of the rectangle

+

+    INT GetLeft() const

+    {

+        return X;

+    }

+

+    INT GetTop() const

+    {

+        return Y;

+    }

+

+    INT GetRight() const

+    {

+        return X+Width;

+    }

+

+    INT GetBottom() const

+    {

+        return Y+Height;

+    }

+

+    // Determine if the rectangle is empty

+    BOOL IsEmptyArea() const

+    {

+        return (Width <= 0) || (Height <= 0);

+    }

+

+    BOOL Equals(IN const Rect & rect) const

+    {

+        return X == rect.X &&

+               Y == rect.Y &&

+               Width == rect.Width &&

+               Height == rect.Height;

+    }

+

+    BOOL Contains(IN INT x,

+                  IN INT y) const

+    {

+        return x >= X && x < X+Width &&

+               y >= Y && y < Y+Height;

+    }

+

+    BOOL Contains(IN const Point& pt) const

+    {

+        return Contains(pt.X, pt.Y);

+    }

+

+    BOOL Contains(IN Rect& rect) const

+    {

+        return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&

+               (Y <= rect.Y) && (rect.GetBottom() <= GetBottom());

+    }

+

+    VOID Inflate(IN INT dx,

+                 IN INT dy)

+    {

+        X -= dx;

+        Y -= dy;

+        Width += 2*dx;

+        Height += 2*dy;

+    }

+

+    VOID Inflate(IN const Point& point)

+    {

+        Inflate(point.X, point.Y);

+    }

+

+    // Intersect the current rect with the specified object

+

+    BOOL Intersect(IN const Rect& rect)

+    {

+        return Intersect(*this, *this, rect);

+    }

+

+    // Intersect rect a and b and save the result into c

+    // Notice that c may be the same object as a or b.

+

+    static BOOL Intersect(OUT Rect& c,

+                          IN const Rect& a,

+                          IN const Rect& b)

+    {

+        INT right = min(a.GetRight(), b.GetRight());

+        INT bottom = min(a.GetBottom(), b.GetBottom());

+        INT left = max(a.GetLeft(), b.GetLeft());

+        INT top = max(a.GetTop(), b.GetTop());

+

+        c.X = left;

+        c.Y = top;

+        c.Width = right - left;

+        c.Height = bottom - top;

+        return !c.IsEmptyArea();

+    }

+

+    // Determine if the specified rect intersects with the

+    // current rect object.

+

+    BOOL IntersectsWith(IN const Rect& rect) const

+    {

+        return (GetLeft() < rect.GetRight() &&

+                GetTop() < rect.GetTop() &&

+                GetRight() > rect.GetLeft() &&

+                GetBottom() > rect.GetTop());

+    }

+

+    static BOOL Union(OUT Rect& c,

+                      IN const Rect& a,

+                      IN const Rect& b)

+    {

+        INT right = max(a.GetRight(), b.GetRight());

+        INT bottom = max(a.GetBottom(), b.GetBottom());

+        INT left = min(a.GetLeft(), b.GetLeft());

+        INT top = min(a.GetTop(), b.GetTop());

+

+        c.X = left;

+        c.Y = top;

+        c.Width = right - left;

+        c.Height = bottom - top;

+        return !c.IsEmptyArea();

+    }

+

+    VOID Offset(IN const Point& point)

+    {

+        Offset(point.X, point.Y);

+    }

+

+    VOID Offset(IN INT dx,

+                IN INT dy)

+    {

+        X += dx;

+        Y += dy;

+    }

+

+public:

+

+    INT X;

+    INT Y;

+    INT Width;

+    INT Height;

+};

+

+// A user must mange memory for PathData.

+

+class PathData

+{

+public:

+    PathData()

+    {

+        Count = 0;

+        Points = NULL;

+        Types = NULL;

+    }

+

+    ~PathData()

+    {

+        if (Points != NULL)

+        {

+            delete Points;

+        }

+

+        if (Types != NULL)

+        {

+            delete Types;

+        }

+    }

+

+#ifdef DCR_USE_NEW_250932

+

+private:

+    PathData(const PathData &);

+    PathData& operator=(const PathData &);

+

+#endif

+

+public:

+    INT Count;

+    PointF* Points;

+    BYTE* Types;

+};

+

+

+//-----------------------------

+// text character range

+//-----------------------------

+

+class CharacterRange

+{

+public:

+    CharacterRange(

+        INT first,

+        INT length

+    ) :

+        First   (first),

+        Length  (length)

+    {}

+

+    CharacterRange() : First(0), Length(0)

+    {}

+

+    CharacterRange & operator = (const CharacterRange &rhs)

+    {

+        First  = rhs.First;

+        Length = rhs.Length;

+        return *this;

+    }

+

+    INT First;

+    INT Length;

+};

+

+#endif // !_GDIPLUSTYPES_HPP

diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h b/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h
new file mode 100644
index 0000000..0a51477
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h
@@ -0,0 +1,397 @@
+/**************************************************************************\

+*

+* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.

+*

+* Module Name:

+*

+*   Image Attributes

+*

+* Abstract:

+*

+*   Class for color adjustment object passed to Graphics.DrawImage

+*

+\**************************************************************************/

+

+#ifndef _GDIPLUSIMAGEATTRIBUTES_H

+#define _GDIPLUSIMAGEATTRIBUTES_H

+

+class GpImageAttributes;

+

+// There are 5 possible sets of color adjustments:

+//          ColorAdjustDefault,

+//          ColorAdjustBitmap,

+//          ColorAdjustBrush,

+//          ColorAdjustPen,

+//          ColorAdjustText,

+

+// Bitmaps, Brushes, Pens, and Text will all use any color adjustments

+// that have been set into the default ImageAttributes until their own

+// color adjustments have been set.  So as soon as any "Set" method is

+// called for Bitmaps, Brushes, Pens, or Text, then they start from

+// scratch with only the color adjustments that have been set for them.

+// Calling Reset removes any individual color adjustments for a type

+// and makes it revert back to using all the default color adjustments

+// (if any).  The SetToIdentity method is a way to force a type to

+// have no color adjustments at all, regardless of what previous adjustments

+// have been set for the defaults or for that type.

+

+class ImageAttributes : public GdiplusBase

+{

+    friend class Graphics;

+    friend class TextureBrush;

+

+public:

+

+    ImageAttributes()

+    {

+        nativeImageAttr = NULL;

+        lastResult = DllExports::GdipCreateImageAttributes(&nativeImageAttr);

+    }

+

+    ~ImageAttributes()

+    {

+        DllExports::GdipDisposeImageAttributes(nativeImageAttr);

+    }

+

+    ImageAttributes* Clone() const

+    {

+        GpImageAttributes* clone;

+

+        SetStatus(DllExports::GdipCloneImageAttributes(

+                                            nativeImageAttr,

+                                            &clone));

+

+        return new ImageAttributes(clone, lastResult);

+    }

+

+    // Set to identity, regardless of what the default color adjustment is.

+    Status

+    SetToIdentity(

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesToIdentity(

+                                            nativeImageAttr,

+                                            type));

+    }

+

+    // Remove any individual color adjustments, and go back to using the default

+    Status

+    Reset(

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipResetImageAttributes(

+                                            nativeImageAttr,

+                                            type));

+    }

+

+    Status

+    SetColorMatrix(

+        IN const ColorMatrix *colorMatrix,

+        IN ColorMatrixFlags mode = ColorMatrixFlagsDefault,

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(

+                                            nativeImageAttr,

+                                            type,

+                                            TRUE,

+                                            colorMatrix,

+                                            NULL,

+                                            mode));

+    }

+

+    Status ClearColorMatrix(

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(

+                                            nativeImageAttr,

+                                            type,

+                                            FALSE,

+                                            NULL,

+                                            NULL,

+                                            ColorMatrixFlagsDefault));

+    }

+

+    Status

+    SetColorMatrices(

+        IN const ColorMatrix *colorMatrix,

+        IN const ColorMatrix *grayMatrix,

+        IN ColorMatrixFlags mode = ColorMatrixFlagsDefault,

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(

+                                            nativeImageAttr,

+                                            type,

+                                            TRUE,

+                                            colorMatrix,

+                                            grayMatrix,

+                                            mode));

+    }

+

+    Status ClearColorMatrices(

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(

+                                            nativeImageAttr,

+                                            type,

+                                            FALSE,

+                                            NULL,

+                                            NULL,

+                                            ColorMatrixFlagsDefault));

+    }

+

+    Status SetThreshold(

+        IN REAL threshold,

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesThreshold(

+                                            nativeImageAttr,

+                                            type,

+                                            TRUE,

+                                            threshold));

+    }

+

+    Status ClearThreshold(

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesThreshold(

+                                            nativeImageAttr,

+                                            type,

+                                            FALSE,

+                                            0.0));

+    }

+

+    Status SetGamma(

+        IN REAL gamma,

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesGamma(

+                                            nativeImageAttr,

+                                            type,

+                                            TRUE,

+                                            gamma));

+    }

+

+    Status ClearGamma(

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesGamma(

+                                            nativeImageAttr,

+                                            type,

+                                            FALSE,

+                                            0.0));

+    }

+

+    Status SetNoOp(

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesNoOp(

+                                            nativeImageAttr,

+                                            type,

+                                            TRUE));

+    }

+

+    Status ClearNoOp(

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesNoOp(

+                                            nativeImageAttr,

+                                            type,

+                                            FALSE));

+    }

+

+    Status SetColorKey(

+        IN const Color& colorLow, 

+        IN const Color& colorHigh,

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesColorKeys(

+                                            nativeImageAttr,

+                                            type,

+                                            TRUE,

+                                            colorLow.GetValue(),

+                                            colorHigh.GetValue()));

+    }

+

+    Status ClearColorKey(

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesColorKeys(

+                                            nativeImageAttr,

+                                            type,

+                                            FALSE,

+                                            NULL,

+                                            NULL));

+    }

+

+    Status SetOutputChannel(

+        IN ColorChannelFlags channelFlags,

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesOutputChannel(

+                                            nativeImageAttr,

+                                            type,

+                                            TRUE,

+                                            channelFlags));

+    }

+    

+    Status ClearOutputChannel(

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesOutputChannel(

+                                            nativeImageAttr,

+                                            type,

+                                            FALSE,

+                                            ColorChannelFlagsLast));

+    }

+

+    Status SetOutputChannelColorProfile(

+        IN const WCHAR *colorProfileFilename,

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(

+                                            nativeImageAttr,

+                                            type,

+                                            TRUE,

+                                            colorProfileFilename));

+    }

+    

+    Status ClearOutputChannelColorProfile(

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(

+                                            nativeImageAttr,

+                                            type,

+                                            FALSE,

+                                            NULL));

+    }

+    

+    Status SetRemapTable(

+        IN UINT mapSize, 

+        IN const ColorMap *map,

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesRemapTable(

+                                            nativeImageAttr,

+                                            type,

+                                            TRUE,

+                                            mapSize,

+                                            map));

+    }

+

+    Status ClearRemapTable(

+        IN ColorAdjustType type = ColorAdjustTypeDefault

+        )

+    {

+        return SetStatus(DllExports::GdipSetImageAttributesRemapTable(

+                                            nativeImageAttr,

+                                            type,

+                                            FALSE,

+                                            0,

+                                            NULL));

+    }

+

+    Status SetBrushRemapTable(IN UINT mapSize, 

+                              IN const ColorMap *map)

+    {

+        return this->SetRemapTable(mapSize, map, ColorAdjustTypeBrush);

+    }

+

+    Status ClearBrushRemapTable()

+    {

+        return this->ClearRemapTable(ColorAdjustTypeBrush);

+    }

+

+    Status SetWrapMode(IN WrapMode wrap, 

+                       IN const Color& color = Color(), 

+                       IN BOOL clamp = FALSE) 

+    {

+        ARGB argb = color.GetValue();

+

+        return SetStatus(DllExports::GdipSetImageAttributesWrapMode(

+                           nativeImageAttr, wrap, argb, clamp));

+    }

+

+    #ifndef DCR_USE_NEW_145139

+    Status SetICMMode(IN BOOL on)

+    {

+        on;

+        // This is not implemented.

+        // The supported method for doing ICM conversion from the embedded 

+        // ICC profile is to use the Bitmap constructor from a file or stream

+        // and specify TRUE for the useIcm parameter. This will cause the 

+        // image to be ICM converted when it's loaded from the file/stream

+        // if the profile exists.

+        return SetStatus(NotImplemented);

+//          DllExports::GdipSetImageAttributesICMMode(nativeImageAttr, on)

+    }

+    #endif

+

+    // The flags of the palette are ignored.

+    Status GetAdjustedPalette(IN OUT ColorPalette* colorPalette,

+                              IN ColorAdjustType colorAdjustType) const 

+    {

+        return SetStatus(DllExports::GdipGetImageAttributesAdjustedPalette(

+                           nativeImageAttr, colorPalette, colorAdjustType));

+    }

+

+    Status GetLastStatus() const

+    {

+        Status lastStatus = lastResult;

+        lastResult = Ok;

+    

+        return lastStatus;

+    }

+    

+#ifdef DCR_USE_NEW_250932

+

+private:

+    ImageAttributes(const ImageAttributes &);

+    ImageAttributes& operator=(const ImageAttributes &);

+

+#endif

+

+protected:

+    ImageAttributes(GpImageAttributes* imageAttr, Status status)

+    {

+        SetNativeImageAttr(imageAttr);

+        lastResult = status;

+    }

+

+    VOID SetNativeImageAttr(GpImageAttributes* nativeImageAttr)

+    {

+        this->nativeImageAttr = nativeImageAttr;

+    }

+    

+    Status SetStatus(Status status) const

+    {

+        if (status != Ok)

+            return (lastResult = status);

+        else 

+            return status;

+    }

+

+protected:

+    GpImageAttributes* nativeImageAttr;

+    mutable Status lastResult;

+};

+

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/GdiplusInit.h b/core/src/fxge/Microsoft SDK/include/GdiplusInit.h
new file mode 100644
index 0000000..3320fa4
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiplusInit.h
@@ -0,0 +1,104 @@
+/**************************************************************************

+*

+* Copyright (c) 2000 Microsoft Corporation

+*

+* Module Name:

+*

+*   Gdiplus init

+*

+* Abstract:

+*

+*   GDI+ startup/shutdown API's

+*

+* Created:

+*

+*   09/02/2000 agodfrey

+*      Created it.

+*

+**************************************************************************/

+

+#ifndef _GDIPLUSINIT_H

+#define _GDIPLUSINIT_H

+//************************************************************************

+#if _FX_COMPILER_ == _FX_VC6_

+typedef unsigned long ULONG_PTR, *PULONG_PTR;    //johnson add here.

+#endif

+//************************************************************************

+

+// Used for debug event notification (debug builds only)

+

+enum DebugEventLevel

+{

+    DebugEventLevelFatal,

+    DebugEventLevelWarning

+};

+

+// Callback function that GDI+ can call, on debug builds, for assertions

+// and warnings.

+

+typedef VOID (WINAPI *DebugEventProc)(DebugEventLevel level, CHAR *message);

+

+// Notification functions which the user must call appropriately if

+// "SuppressBackgroundThread" (below) is set.

+

+typedef Status (WINAPI *NotificationHookProc)(OUT ULONG_PTR *token);

+typedef VOID (WINAPI *NotificationUnhookProc)(ULONG_PTR token);

+

+// Input structure for GdiplusStartup()

+

+struct GdiplusStartupInput

+{

+    UINT32 GdiplusVersion;             // Must be 1

+    DebugEventProc DebugEventCallback; // Ignored on free builds

+    BOOL SuppressBackgroundThread;     // FALSE unless you're prepared to call 

+                                       // the hook/unhook functions properly

+    BOOL SuppressExternalCodecs;       // FALSE unless you want GDI+ only to use

+                                       // its internal image codecs.

+    

+    GdiplusStartupInput(

+        DebugEventProc debugEventCallback = NULL,

+        BOOL suppressBackgroundThread = FALSE,

+        BOOL suppressExternalCodecs = FALSE)

+    {

+        GdiplusVersion = 1;

+        DebugEventCallback = debugEventCallback;

+        SuppressBackgroundThread = suppressBackgroundThread;

+        SuppressExternalCodecs = suppressExternalCodecs;

+    }

+};

+

+// Output structure for GdiplusStartup()

+

+struct GdiplusStartupOutput

+{

+    // The following 2 fields are NULL if SuppressBackgroundThread is FALSE.

+    // Otherwise, they are functions which must be called appropriately to

+    // replace the background thread.

+    //

+    // These should be called on the application's main message loop - i.e.

+    // a message loop which is active for the lifetime of GDI+.

+    // "NotificationHook" should be called before starting the loop,

+    // and "NotificationUnhook" should be called after the loop ends.

+    

+    NotificationHookProc NotificationHook;

+    NotificationUnhookProc NotificationUnhook;

+};

+

+// GDI+ initialization. Must be called before GDI+ API's are used.

+//

+// token  - may not be NULL - accepts a token to be passed in the corresponding

+//          GdiplusShutdown call.

+// input  - may not be NULL

+// output - may be NULL only if input->SuppressBackgroundThread is FALSE.

+

+extern "C" Status WINAPI GdiplusStartup(

+    OUT ULONG_PTR *token,

+    const GdiplusStartupInput *input,

+    OUT GdiplusStartupOutput *output);

+

+// GDI+ termination. Must be called before GDI+ is unloaded. GDI+ API's may not

+// be called after this.

+

+extern "C" VOID WINAPI GdiplusShutdown(ULONG_PTR token);

+

+#endif

diff --git a/core/src/fxge/Microsoft SDK/include/sal.h b/core/src/fxge/Microsoft SDK/include/sal.h
new file mode 100644
index 0000000..1369969
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/sal.h
@@ -0,0 +1,729 @@
+/***

+*sal.h - markers for documenting the semantics of APIs

+*

+*       Copyright (c) Microsoft Corporation. All rights reserved.

+*

+*Purpose:

+*       sal.h provides a set of annotations to describe how a function uses its

+*       parameters - the assumptions it makes about them, and the guarantees it makes

+*       upon finishing.

+*

+*       [Public]

+*

+****/

+

+/* 

+ -------------------------------------------------------------------------------

+ Introduction

+

+ sal.h provides a set of annotations to describe how a function uses its

+ parameters - the assumptions it makes about them, and the guarantees it makes

+ upon finishing.

+

+ Annotations may be placed before either a function parameter's type or its return

+ type, and describe the function's behavior regarding the parameter or return value.

+ There are two classes of annotations: buffer annotations and advanced annotations.

+ Buffer annotations describe how functions use their pointer parameters, and

+ advanced annotations either describe complex/unusual buffer behavior, or provide

+ additional information about a parameter that is not otherwise expressible.

+

+ -------------------------------------------------------------------------------

+ Buffer Annotations

+

+ The most important annotations in sal.h provide a consistent way to annotate

+ buffer parameters or return values for a function. Each of these annotations describes

+ a single buffer (which could be a string, a fixed-length or variable-length array,

+ or just a pointer) that the function interacts with: where it is, how large it is,

+ how much is initialized, and what the function does with it.

+

+ The appropriate macro for a given buffer can be constructed using the table below.

+ Just pick the appropriate values from each category, and combine them together

+ with a leading underscore. Some combinations of values do not make sense as buffer

+ annotations. Only meaningful annotations can be added to your code; for a list of

+ these, see the buffer annotation definitions section.

+

+ Only a single buffer annotation should be used for each parameter.

+

+ |------------|------------|---------|--------|----------|----------|---------------|

+ |   Level    |   Usage    |  Size   | Output | NullTerm | Optional |  Parameters   |

+ |------------|------------|---------|--------|----------|----------|---------------|

+ | <>         | <>         | <>      | <>     | _z       | <>       | <>            |

+ | _deref     | _in        | _ecount | _full  | _nz      | _opt     | (size)        |

+ | _deref_opt | _out       | _bcount | _part  |          |          | (size,length) |

+ |            | _inout     |         |        |          |          |               |

+ |            |            |         |        |          |          |               |

+ |------------|------------|---------|--------|----------|----------|---------------|

+

+ Level: Describes the buffer pointer's level of indirection from the parameter or

+          return value 'p'.

+

+ <>         : p is the buffer pointer.

+ _deref     : *p is the buffer pointer. p must not be NULL.

+ _deref_opt : *p may be the buffer pointer. p may be NULL, in which case the rest of

+                the annotation is ignored.

+

+ Usage: Describes how the function uses the buffer.

+

+ <>     : The buffer is not accessed. If used on the return value or with _deref, the

+            function will provide the buffer, and it will be uninitialized at exit.

+            Otherwise, the caller must provide the buffer. This should only be used

+            for alloc and free functions.

+ _in    : The function will only read from the buffer. The caller must provide the

+            buffer and initialize it. Cannot be used with _deref.

+ _out   : The function will only write to the buffer. If used on the return value or

+            with _deref, the function will provide the buffer and initialize it.

+            Otherwise, the caller must provide the buffer, and the function will

+            initialize it.

+ _inout : The function may freely read from and write to the buffer. The caller must

+            provide the buffer and initialize it. If used with _deref, the buffer may

+            be reallocated by the function.

+

+ Size: Describes the total size of the buffer. This may be less than the space actually

+         allocated for the buffer, in which case it describes the accessible amount.

+

+ <>      : No buffer size is given. If the type specifies the buffer size (such as

+             with LPSTR and LPWSTR), that amount is used. Otherwise, the buffer is one

+             element long. Must be used with _in, _out, or _inout.

+ _ecount : The buffer size is an explicit element count.

+ _bcount : The buffer size is an explicit byte count.

+

+ Output: Describes how much of the buffer will be initialized by the function. For

+           _inout buffers, this also describes how much is initialized at entry. Omit this

+           category for _in buffers; they must be fully initialized by the caller.

+

+ <>    : The type specifies how much is initialized. For instance, a function initializing

+           an LPWSTR must NULL-terminate the string.

+ _full : The function initializes the entire buffer.

+ _part : The function initializes part of the buffer, and explicitly indicates how much.

+

+ NullTerm: States if the present of a '\0' marks the end of valid elements in the buffer.

+ _z    : A '\0' indicated the end of the buffer

+ _nz	 : The buffer may not be null terminated and a '\0' does not indicate the end of the

+          buffer.

+ Optional: Describes if the buffer itself is optional.

+

+ <>   : The pointer to the buffer must not be NULL.

+ _opt : The pointer to the buffer might be NULL. It will be checked before being dereferenced.

+

+ Parameters: Gives explicit counts for the size and length of the buffer.

+

+ <>            : There is no explicit count. Use when neither _ecount nor _bcount is used.

+ (size)        : Only the buffer's total size is given. Use with _ecount or _bcount but not _part.

+ (size,length) : The buffer's total size and initialized length are given. Use with _ecount_part

+                   and _bcount_part.

+

+ -------------------------------------------------------------------------------

+ Buffer Annotation Examples

+

+ LWSTDAPI_(BOOL) StrToIntExA(

+     LPCSTR pszString,                    -- No annotation required, const implies __in.

+     DWORD dwFlags,

+     __out int *piRet                     -- A pointer whose dereference will be filled in.

+ );

+

+ void MyPaintingFunction(

+     __in HWND hwndControl,               -- An initialized read-only parameter.

+     __in_opt HDC hdcOptional,            -- An initialized read-only parameter that might be NULL.

+     __inout IPropertyStore *ppsStore     -- An initialized parameter that may be freely used

+                                          --   and modified.

+ );

+

+ LWSTDAPI_(BOOL) PathCompactPathExA(

+     __out_ecount(cchMax) LPSTR pszOut,   -- A string buffer with cch elements that will

+                                          --   be NULL terminated on exit.

+     LPCSTR pszSrc,                       -- No annotation required, const implies __in.

+     UINT cchMax,

+     DWORD dwFlags

+ );

+

+ HRESULT SHLocalAllocBytes(

+     size_t cb,

+     __deref_bcount(cb) T **ppv           -- A pointer whose dereference will be set to an

+                                          --   uninitialized buffer with cb bytes.

+ );

+

+ __inout_bcount_full(cb) : A buffer with cb elements that is fully initialized at

+     entry and exit, and may be written to by this function.

+

+ __out_ecount_part(count, *countOut) : A buffer with count elements that will be

+     partially initialized by this function. The function indicates how much it

+     initialized by setting *countOut.

+

+ -------------------------------------------------------------------------------

+ Advanced Annotations

+

+ Advanced annotations describe behavior that is not expressible with the regular

+ buffer macros. These may be used either to annotate buffer parameters that involve

+ complex or conditional behavior, or to enrich existing annotations with additional

+ information.

+

+ __success(expr) f :

+     <expr> indicates whether function f succeeded or not. If <expr> is true at exit,

+     all the function's guarantees (as given by other annotations) must hold. If <expr>

+     is false at exit, the caller should not expect any of the function's guarantees

+     to hold. If not used, the function must always satisfy its guarantees. Added

+     automatically to functions that indicate success in standard ways, such as by

+     returning an HRESULT.

+

+ __nullterminated p :

+     Pointer p is a buffer that may be read or written up to and including the first

+     NULL character or pointer. May be used on typedefs, which marks valid (properly

+     initialized) instances of that type as being NULL-terminated.

+

+ __nullnullterminated p :

+     Pointer p is a buffer that may be read or written up to and including the first

+     sequence of two NULL characters or pointers. May be used on typedefs, which marks

+     valid instances of that type as being double-NULL terminated.

+

+ __reserved v :

+     Value v must be 0/NULL, reserved for future use.

+

+ __checkReturn v :

+     Return value v must not be ignored by callers of this function.

+

+ __typefix(ctype) v :

+     Value v should be treated as an instance of ctype, rather than its declared type.

+

+ __override f :

+     Specify C#-style 'override' behaviour for overriding virtual methods.

+

+ __callback f :

+     Function f can be used as a function pointer.

+

+ __format_string p :

+     Pointer p is a string that contains % markers in the style of printf.

+

+ __blocksOn(resource) f :

+     Function f blocks on the resource 'resource'.

+

+ __fallthrough :

+     Annotates switch statement labels where fall-through is desired, to distinguish

+     from forgotten break statements.

+

+ -------------------------------------------------------------------------------

+ Advanced Annotation Examples

+

+ __success(return == TRUE) LWSTDAPI_(BOOL) 

+ PathCanonicalizeA(__out_ecount(MAX_PATH) LPSTR pszBuf, LPCSTR pszPath) :

+     pszBuf is only guaranteed to be NULL-terminated when TRUE is returned.

+

+ typedef __nullterminated WCHAR* LPWSTR : Initialized LPWSTRs are NULL-terminated strings.

+

+ __out_ecount(cch) __typefix(LPWSTR) void *psz : psz is a buffer parameter which will be

+     a NULL-terminated WCHAR string at exit, and which initially contains cch WCHARs.

+

+ -------------------------------------------------------------------------------

+*/

+

+#pragma once

+

+#define __specstrings

+

+#ifdef  __cplusplus

+#ifndef __nothrow

+# define __nothrow __declspec(nothrow)

+#endif

+extern "C" {

+#else

+#ifndef __nothrow

+# define __nothrow

+#endif

+#endif  /* #ifdef __cplusplus */

+

+/*

+ -------------------------------------------------------------------------------

+ Helper Macro Definitions

+

+ These express behavior common to many of the high-level annotations.

+ DO NOT USE THESE IN YOUR CODE.

+ -------------------------------------------------------------------------------

+*/

+

+/*

+The helper annotations are only understood by the compiler version used by various

+defect detection tools. When the regular compiler is running, they are defined into

+nothing, and do not affect the compiled code.

+*/

+

+#if !defined(__midl) && defined(_PREFAST_) 

+

+    /*

+     In the primitive __declspec("SAL_*") annotations "SAL" stands for Standard

+     Annotation Language.  These __declspec("SAL_*") annotations are the

+     primitives the compiler understands and all high-level SpecString MACROs

+     will decompose into these primivates.

+    */

+

+    #define SPECSTRINGIZE( x ) #x

+

+    /*

+     __null p

+     __notnull p

+     __maybenull p

+    

+     Annotates a pointer p. States that pointer p is null. Commonly used

+     in the negated form __notnull or the possibly null form __maybenull.

+    */

+

+    #define __null                  __declspec("SAL_null")

+    #define __notnull               __declspec("SAL_notnull")

+    #define __maybenull             __declspec("SAL_maybenull")

+

+    /*

+     __readonly l

+     __notreadonly l

+     __mabyereadonly l

+    

+     Annotates a location l. States that location l is not modified after

+     this point.  If the annotation is placed on the precondition state of

+     a function, the restriction only applies until the postcondition state

+     of the function.  __maybereadonly states that the annotated location

+     may be modified, whereas __notreadonly states that a location must be

+     modified.

+    */

+

+    #define __readonly              __declspec("SAL_readonly")

+    #define __notreadonly           __declspec("SAL_notreadonly")

+    #define __maybereadonly         __declspec("SAL_maybereadonly")

+

+    /*

+     __valid v

+     __notvalid v

+     __maybevalid v

+    

+     Annotates any value v. States that the value satisfies all properties of

+     valid values of its type. For example, for a string buffer, valid means

+     that the buffer pointer is either NULL or points to a NULL-terminated string.

+    */

+

+    #define __valid                 __declspec("SAL_valid")

+    #define __notvalid              __declspec("SAL_notvalid")

+    #define __maybevalid            __declspec("SAL_maybevalid")

+

+    /*

+     __readableTo(extent) p

+    

+     Annotates a buffer pointer p.  If the buffer can be read, extent describes

+     how much of the buffer is readable. For a reader of the buffer, this is

+     an explicit permission to read up to that amount, rather than a restriction to

+     read only up to it.

+    */

+

+    #define __readableTo(extent)    __declspec("SAL_readableTo("SPECSTRINGIZE(extent)")")

+

+    /*

+    

+     __elem_readableTo(size)

+    

+     Annotates a buffer pointer p as being readable to size elements.

+    */

+

+    #define __elem_readableTo(size)   __declspec("SAL_readableTo(elementCount("SPECSTRINGIZE(size)"))")

+    

+    /*

+     __byte_readableTo(size)

+    

+     Annotates a buffer pointer p as being readable to size bytes.

+    */

+    #define __byte_readableTo(size)   __declspec("SAL_readableTo(byteCount("SPECSTRINGIZE(size)"))")

+    

+    /*

+     __writableTo(extent) p

+    

+     Annotates a buffer pointer p. If the buffer can be modified, extent

+     describes how much of the buffer is writable (usually the allocation

+     size). For a writer of the buffer, this is an explicit permission to

+     write up to that amount, rather than a restriction to write only up to it.

+    */

+    #define __writableTo(size)   __declspec("SAL_writableTo("SPECSTRINGIZE(size)")")

+

+    /*

+     __elem_writableTo(size)

+    

+     Annotates a buffer pointer p as being writable to size elements.

+    */

+    #define __elem_writableTo(size)   __declspec("SAL_writableTo(elementCount("SPECSTRINGIZE(size)"))")

+    

+    /*

+     __byte_writableTo(size)

+    

+     Annotates a buffer pointer p as being writable to size bytes.

+    */

+    #define __byte_writableTo(size)   __declspec("SAL_writableTo(byteCount("SPECSTRINGIZE(size)"))")

+

+    /*

+     __deref p

+    

+     Annotates a pointer p. The next annotation applies one dereference down

+     in the type. If readableTo(p, size) then the next annotation applies to

+     all elements *(p+i) for which i satisfies the size. If p is a pointer

+     to a struct, the next annotation applies to all fields of the struct.

+    */

+    #define __deref                 __declspec("SAL_deref")

+    

+    /*

+     __pre __next_annotation

+    

+     The next annotation applies in the precondition state

+    */

+    #define __pre                   __declspec("SAL_pre")

+    

+    /*

+     __post __next_annotation

+    

+     The next annotation applies in the postcondition state

+    */

+    #define __post                  __declspec("SAL_post")

+    

+    /*

+     __precond(<expr>)

+    

+     When <expr> is true, the next annotation applies in the precondition state

+     (currently not enabled)

+    */

+    #define __precond(expr)         __pre

+

+    /*

+     __postcond(<expr>)

+    

+     When <expr> is true, the next annotation applies in the postcondition state

+     (currently not enabled)

+    */

+    #define __postcond(expr)        __post

+

+    /*

+     __exceptthat

+    

+     Given a set of annotations Q containing __exceptthat maybeP, the effect of

+     the except clause is to erase any P or notP annotations (explicit or

+     implied) within Q at the same level of dereferencing that the except

+     clause appears, and to replace it with maybeP.

+    

+      Example 1: __valid __exceptthat __maybenull on a pointer p means that the

+                 pointer may be null, and is otherwise valid, thus overriding

+                 the implicit notnull annotation implied by __valid on

+                 pointers.

+    

+      Example 2: __valid __deref __exceptthat __maybenull on an int **p means

+                 that p is not null (implied by valid), but the elements

+                 pointed to by p could be null, and are otherwise valid. 

+    */

+    #define __exceptthat                __declspec("SAL_except")

+    #define __execeptthat               __exceptthat

+ 

+    /*

+     _refparam

+    

+     Added to all out parameter macros to indicate that they are all reference

+     parameters.

+    */

+    #define __refparam                  __deref __notreadonly

+

+    /*

+     __inner_*

+    

+     Helper macros that directly correspond to certain high-level annotations.

+    

+    */

+

+    /*

+     Macros to classify the entrypoints and indicate their category.

+    

+     Pre-defined control point categories include: RPC, LPC, DeviceDriver, UserToKernel, ISAPI, COM.

+    

+    */

+    #define __inner_control_entrypoint(category) __declspec("SAL_entrypoint(controlEntry, "SPECSTRINGIZE(category)")")

+

+    /*

+     Pre-defined data entry point categories include: Registry, File, Network.

+    */

+    #define __inner_data_entrypoint(category)    __declspec("SAL_entrypoint(dataEntry, "SPECSTRINGIZE(category)")")

+

+    #define __inner_success(expr)               __declspec("SAL_success("SPECSTRINGIZE(expr)")")

+    #define __inner_checkReturn                 __declspec("SAL_checkReturn")

+    #define __inner_typefix(ctype)              __declspec("SAL_typefix("SPECSTRINGIZE(ctype)")")

+    #define __inner_override                    __declspec("__override")

+    #define __inner_callback                    __declspec("__callback")

+    #define __inner_blocksOn(resource)          __declspec("SAL_blocksOn("SPECSTRINGIZE(resource)")")

+    #define __inner_fallthrough_dec             __inline __nothrow void __FallThrough() {}

+    #define __inner_fallthrough                 __FallThrough();

+

+#else

+    #define __null

+    #define __notnull

+    #define __maybenull

+    #define __readonly

+    #define __notreadonly

+    #define __maybereadonly

+    #define __valid

+    #define __notvalid

+    #define __maybevalid

+    #define __readableTo(extent)

+    #define __elem_readableTo(size)

+    #define __byte_readableTo(size)

+    #define __writableTo(size)

+    #define __elem_writableTo(size)

+    #define __byte_writableTo(size)

+    #define __deref

+    #define __pre

+    #define __post

+    #define __precond(expr)

+    #define __postcond(expr)

+    #define __exceptthat

+    #define __execeptthat

+    #define __inner_success(expr)

+    #define __inner_checkReturn

+    #define __inner_typefix(ctype)

+    #define __inner_override

+    #define __inner_callback

+    #define __inner_blocksOn(resource)

+    #define __inner_fallthrough_dec

+    #define __inner_fallthrough

+    #define __refparam

+    #define __inner_control_entrypoint(category)

+    #define __inner_data_entrypoint(category)

+#endif /* #if !defined(__midl) && defined(_PREFAST_) */

+

+/* 

+-------------------------------------------------------------------------------

+Buffer Annotation Definitions

+

+Any of these may be used to directly annotate functions, but only one should

+be used for each parameter. To determine which annotation to use for a given

+buffer, use the table in the buffer annotations section.

+-------------------------------------------------------------------------------

+*/

+

+#define __ecount(size)                                          __notnull __elem_writableTo(size)

+#define __bcount(size)                                          __notnull __byte_writableTo(size)

+#define __in                                                    __pre __valid __pre __deref __readonly

+#define __in_ecount(size)                                       __in __pre __elem_readableTo(size)

+#define __in_bcount(size)                                       __in __pre __byte_readableTo(size)

+#define __in_z                                                  __in __pre __nullterminated

+#define __in_ecount_z(size)                                     __in_ecount(size) __pre __nullterminated

+#define __in_bcount_z(size)                                     __in_bcount(size) __pre __nullterminated

+#define __in_nz                                                 __in

+#define __in_ecount_nz(size)                                    __in_ecount(size)

+#define __in_bcount_nz(size)                                    __in_bcount(size)

+#define __out                                                   __ecount(1) __post __valid __refparam

+#define __out_ecount(size)                                      __ecount(size) __post __valid __refparam

+#define __out_bcount(size)                                      __bcount(size) __post __valid __refparam

+#define __out_ecount_part(size,length)                          __out_ecount(size) __post __elem_readableTo(length)

+#define __out_bcount_part(size,length)                          __out_bcount(size) __post __byte_readableTo(length)

+#define __out_ecount_full(size)                                 __out_ecount_part(size,size)

+#define __out_bcount_full(size)                                 __out_bcount_part(size,size)

+#define __out_z                                                 __post __valid __refparam __post __nullterminated

+#define __out_z_opt                                             __post __valid __refparam __post __nullterminated __exceptthat __maybenull

+#define __out_ecount_z(size)                                    __ecount(size) __post __valid __refparam __post __nullterminated

+#define __out_bcount_z(size)                                    __bcount(size) __post __valid __refparam __post __nullterminated

+#define __out_ecount_part_z(size,length)                        __out_ecount_part(size,length) __post __nullterminated

+#define __out_bcount_part_z(size,length)                        __out_bcount_part(size,length) __post __nullterminated

+#define __out_ecount_full_z(size)                               __out_ecount_full(size) __post __nullterminated

+#define __out_bcount_full_z(size)                               __out_bcount_full(size) __post __nullterminated

+#define __out_nz                                                __post __valid __refparam __post

+#define __out_nz_opt                                            __post __valid __refparam __post __exceptthat __maybenull

+#define __out_ecount_nz(size)                                   __ecount(size) __post __valid __refparam

+#define __out_bcount_nz(size)                                   __bcount(size) __post __valid __refparam

+#define __inout                                                 __pre __valid __post __valid __refparam

+#define __inout_ecount(size)                                    __out_ecount(size) __pre __valid

+#define __inout_bcount(size)                                    __out_bcount(size) __pre __valid

+#define __inout_ecount_part(size,length)                        __out_ecount_part(size,length) __pre __valid __pre __elem_readableTo(length)

+#define __inout_bcount_part(size,length)                        __out_bcount_part(size,length) __pre __valid __pre __byte_readableTo(length)

+#define __inout_ecount_full(size)                               __inout_ecount_part(size,size)

+#define __inout_bcount_full(size)                               __inout_bcount_part(size,size)

+#define __inout_z                                               __inout __pre __nullterminated __post __nullterminated

+#define __inout_ecount_z(size)                                  __inout_ecount(size) __pre __nullterminated __post __nullterminated

+#define __inout_bcount_z(size)                                  __inout_bcount(size) __pre __nullterminated __post __nullterminated

+#define __inout_nz                                              __inout

+#define __inout_ecount_nz(size)                                 __inout_ecount(size) 

+#define __inout_bcount_nz(size)                                 __inout_bcount(size) 

+#define __ecount_opt(size)                                      __ecount(size)                              __exceptthat __maybenull

+#define __bcount_opt(size)                                      __bcount(size)                              __exceptthat __maybenull

+#define __in_opt                                                __in                                        __exceptthat __maybenull

+#define __in_ecount_opt(size)                                   __in_ecount(size)                           __exceptthat __maybenull

+#define __in_bcount_opt(size)                                   __in_bcount(size)                           __exceptthat __maybenull

+#define __in_z_opt                                              __in_opt __pre __nullterminated 

+#define __in_ecount_z_opt(size)                                 __in_ecount_opt(size) __pre __nullterminated 

+#define __in_bcount_z_opt(size)                                 __in_bcount_opt(size) __pre __nullterminated

+#define __in_nz_opt                                             __in_opt                                     

+#define __in_ecount_nz_opt(size)                                __in_ecount_opt(size)                         

+#define __in_bcount_nz_opt(size)                                __in_bcount_opt(size)                         

+#define __out_opt                                               __out                                       __exceptthat __maybenull

+#define __out_ecount_opt(size)                                  __out_ecount(size)                          __exceptthat __maybenull

+#define __out_bcount_opt(size)                                  __out_bcount(size)                          __exceptthat __maybenull

+#define __out_ecount_part_opt(size,length)                      __out_ecount_part(size,length)              __exceptthat __maybenull

+#define __out_bcount_part_opt(size,length)                      __out_bcount_part(size,length)              __exceptthat __maybenull

+#define __out_ecount_full_opt(size)                             __out_ecount_full(size)                     __exceptthat __maybenull

+#define __out_bcount_full_opt(size)                             __out_bcount_full(size)                     __exceptthat __maybenull

+#define __out_ecount_z_opt(size)                                __out_ecount_opt(size) __post __nullterminated

+#define __out_bcount_z_opt(size)                                __out_bcount_opt(size) __post __nullterminated

+#define __out_ecount_part_z_opt(size,length)                    __out_ecount_part_opt(size,length) __post __nullterminated

+#define __out_bcount_part_z_opt(size,length)                    __out_bcount_part_opt(size,length) __post __nullterminated

+#define __out_ecount_full_z_opt(size)                           __out_ecount_full_opt(size) __post __nullterminated

+#define __out_bcount_full_z_opt(size)                           __out_bcount_full_opt(size) __post __nullterminated

+#define __out_ecount_nz_opt(size)                               __out_ecount_opt(size) __post __nullterminated                       

+#define __out_bcount_nz_opt(size)                               __out_bcount_opt(size) __post __nullterminated                        

+#define __inout_opt                                             __inout                                     __exceptthat __maybenull

+#define __inout_ecount_opt(size)                                __inout_ecount(size)                        __exceptthat __maybenull

+#define __inout_bcount_opt(size)                                __inout_bcount(size)                        __exceptthat __maybenull

+#define __inout_ecount_part_opt(size,length)                    __inout_ecount_part(size,length)            __exceptthat __maybenull

+#define __inout_bcount_part_opt(size,length)                    __inout_bcount_part(size,length)            __exceptthat __maybenull

+#define __inout_ecount_full_opt(size)                           __inout_ecount_full(size)                   __exceptthat __maybenull

+#define __inout_bcount_full_opt(size)                           __inout_bcount_full(size)                   __exceptthat __maybenull

+#define __inout_z_opt                                           __inout_opt __pre __nullterminated __post __nullterminated

+#define __inout_ecount_z_opt(size)                              __inout_ecount_opt(size) __pre __nullterminated __post __nullterminated

+#define __inout_ecount_z_opt(size)                              __inout_ecount_opt(size) __pre __nullterminated __post __nullterminated

+#define __inout_bcount_z_opt(size)                              __inout_bcount_opt(size) 

+#define __inout_nz_opt                                          __inout_opt

+#define __inout_ecount_nz_opt(size)                             __inout_ecount_opt(size)

+#define __inout_bcount_nz_opt(size)                             __inout_bcount_opt(size)

+#define __deref_ecount(size)                                    __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __elem_writableTo(size)

+#define __deref_bcount(size)                                    __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __byte_writableTo(size)

+#define __deref_out                                             __deref_ecount(1) __post __deref __valid __refparam

+#define __deref_out_ecount(size)                                __deref_ecount(size) __post __deref __valid __refparam

+#define __deref_out_bcount(size)                                __deref_bcount(size) __post __deref __valid __refparam

+#define __deref_out_ecount_part(size,length)                    __deref_out_ecount(size) __post __deref __elem_readableTo(length)

+#define __deref_out_bcount_part(size,length)                    __deref_out_bcount(size) __post __deref __byte_readableTo(length)

+#define __deref_out_ecount_full(size)                           __deref_out_ecount_part(size,size)

+#define __deref_out_bcount_full(size)                           __deref_out_bcount_part(size,size)

+#define __deref_out_z                                           __post __deref __valid __refparam __post __deref __nullterminated

+#define __deref_out_ecount_z(size)                              __deref_out_ecount(size) __post __deref __nullterminated  

+#define __deref_out_bcount_z(size)                              __deref_out_ecount(size) __post __deref __nullterminated  

+#define __deref_out_nz                                          __deref_out

+#define __deref_out_ecount_nz(size)                             __deref_out_ecount(size)   

+#define __deref_out_bcount_nz(size)                             __deref_out_ecount(size)   

+#define __deref_inout                                           __notnull __elem_readableTo(1) __pre __deref __valid __post __deref __valid __refparam

+#define __deref_inout_z                                         __deref_inout __pre __deref __nullterminated __post __deref __nullterminated

+#define __deref_inout_ecount(size)                              __deref_inout __pre __deref __elem_writableTo(size) __post __deref __elem_writableTo(size)

+#define __deref_inout_bcount(size)                              __deref_inout __pre __deref __byte_writableTo(size) __post __deref __byte_writableTo(size)

+#define __deref_inout_ecount_part(size,length)                  __deref_inout_ecount(size) __pre __deref __elem_readableTo(length) __post __deref __elem_readableTo(length)

+#define __deref_inout_bcount_part(size,length)                  __deref_inout_bcount(size) __pre __deref __byte_readableTo(length) __post __deref __byte_readableTo(length)

+#define __deref_inout_ecount_full(size)                         __deref_inout_ecount_part(size,size)

+#define __deref_inout_bcount_full(size)                         __deref_inout_bcount_part(size,size)

+#define __deref_inout_z                                         __deref_inout __pre __deref __nullterminated __post __deref __nullterminated

+#define __deref_inout_ecount_z(size)                            __deref_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated   

+#define __deref_inout_bcount_z(size)                            __deref_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated  

+#define __deref_inout_nz                                        __deref_inout

+#define __deref_inout_ecount_nz(size)                           __deref_inout_ecount(size)   

+#define __deref_inout_bcount_nz(size)                           __deref_inout_ecount(size)   

+#define __deref_ecount_opt(size)                                __deref_ecount(size)                        __post __deref __exceptthat __maybenull

+#define __deref_bcount_opt(size)                                __deref_bcount(size)                        __post __deref __exceptthat __maybenull

+#define __deref_out_opt                                         __deref_out                                 __post __deref __exceptthat __maybenull

+#define __deref_out_ecount_opt(size)                            __deref_out_ecount(size)                    __post __deref __exceptthat __maybenull

+#define __deref_out_bcount_opt(size)                            __deref_out_bcount(size)                    __post __deref __exceptthat __maybenull

+#define __deref_out_ecount_part_opt(size,length)                __deref_out_ecount_part(size,length)        __post __deref __exceptthat __maybenull

+#define __deref_out_bcount_part_opt(size,length)                __deref_out_bcount_part(size,length)        __post __deref __exceptthat __maybenull

+#define __deref_out_ecount_full_opt(size)                       __deref_out_ecount_full(size)               __post __deref __exceptthat __maybenull

+#define __deref_out_bcount_full_opt(size)                       __deref_out_bcount_full(size)               __post __deref __exceptthat __maybenull

+#define __deref_out_z_opt                                       __post __deref __valid __refparam __execeptthat __maybenull __post __deref __nullterminated

+#define __deref_out_ecount_z_opt(size)                          __deref_out_ecount_opt(size) __post __deref __nullterminated

+#define __deref_out_bcount_z_opt(size)                          __deref_out_bcount_opt(size) __post __deref __nullterminated

+#define __deref_out_nz_opt                                      __deref_out_opt

+#define __deref_out_ecount_nz_opt(size)                         __deref_out_ecount_opt(size)

+#define __deref_out_bcount_nz_opt(size)                         __deref_out_bcount_opt(size)

+#define __deref_inout_opt                                       __deref_inout                               __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#define __deref_inout_ecount_opt(size)                          __deref_inout_ecount(size)                  __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#define __deref_inout_bcount_opt(size)                          __deref_inout_bcount(size)                  __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#define __deref_inout_ecount_part_opt(size,length)              __deref_inout_ecount_part(size,length)      __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#define __deref_inout_bcount_part_opt(size,length)              __deref_inout_bcount_part(size,length)      __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#define __deref_inout_ecount_full_opt(size)                     __deref_inout_ecount_full(size)             __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#define __deref_inout_bcount_full_opt(size)                     __deref_inout_bcount_full(size)             __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#define __deref_inout_z_opt                                     __deref_inout_opt __pre __deref __nullterminated __post __deref __nullterminated

+#define __deref_inout_ecount_z_opt(size)                        __deref_inout_ecount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated

+#define __deref_inout_bcount_z_opt(size)                        __deref_inout_bcount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated

+#define __deref_inout_nz_opt                                    __deref_inout_opt 

+#define __deref_inout_ecount_nz_opt(size)                       __deref_inout_ecount_opt(size)

+#define __deref_inout_bcount_nz_opt(size)                       __deref_inout_bcount_opt(size)

+#define __deref_opt_ecount(size)                                __deref_ecount(size)                        __exceptthat __maybenull

+#define __deref_opt_bcount(size)                                __deref_bcount(size)                        __exceptthat __maybenull

+#define __deref_opt_out                                         __deref_out                                 __exceptthat __maybenull

+#define __deref_opt_out_z                                       __deref_opt_out __post __deref __nullterminated

+#define __deref_opt_out_ecount(size)                            __deref_out_ecount(size)                    __exceptthat __maybenull

+#define __deref_opt_out_bcount(size)                            __deref_out_bcount(size)                    __exceptthat __maybenull

+#define __deref_opt_out_ecount_part(size,length)                __deref_out_ecount_part(size,length)        __exceptthat __maybenull

+#define __deref_opt_out_bcount_part(size,length)                __deref_out_bcount_part(size,length)        __exceptthat __maybenull

+#define __deref_opt_out_ecount_full(size)                       __deref_out_ecount_full(size)               __exceptthat __maybenull

+#define __deref_opt_out_bcount_full(size)                       __deref_out_bcount_full(size)               __exceptthat __maybenull

+#define __deref_opt_inout                                       __deref_inout                               __exceptthat __maybenull

+#define __deref_opt_inout_ecount(size)                          __deref_inout_ecount(size)                  __exceptthat __maybenull

+#define __deref_opt_inout_bcount(size)                          __deref_inout_bcount(size)                  __exceptthat __maybenull

+#define __deref_opt_inout_ecount_part(size,length)              __deref_inout_ecount_part(size,length)      __exceptthat __maybenull

+#define __deref_opt_inout_bcount_part(size,length)              __deref_inout_bcount_part(size,length)      __exceptthat __maybenull

+#define __deref_opt_inout_ecount_full(size)                     __deref_inout_ecount_full(size)             __exceptthat __maybenull

+#define __deref_opt_inout_bcount_full(size)                     __deref_inout_bcount_full(size)             __exceptthat __maybenull

+#define __deref_opt_inout_z                                     __deref_opt_inout __pre __deref __nullterminated __post __deref __nullterminated

+#define __deref_opt_inout_ecount_z(size)                        __deref_opt_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated

+#define __deref_opt_inout_bcount_z(size)                        __deref_opt_inout_bcount(size) __pre __deref __nullterminated __post __deref __nullterminated

+#define __deref_opt_inout_nz                                    __deref_opt_inout

+#define __deref_opt_inout_ecount_nz(size)                       __deref_opt_inout_ecount(size)

+#define __deref_opt_inout_bcount_nz(size)                       __deref_opt_inout_bcount(size)

+#define __deref_opt_ecount_opt(size)                            __deref_ecount_opt(size)                    __exceptthat __maybenull

+#define __deref_opt_bcount_opt(size)                            __deref_bcount_opt(size)                    __exceptthat __maybenull

+#define __deref_opt_out_opt                                     __deref_out_opt                             __exceptthat __maybenull

+#define __deref_opt_out_ecount_opt(size)                        __deref_out_ecount_opt(size)                __exceptthat __maybenull

+#define __deref_opt_out_bcount_opt(size)                        __deref_out_bcount_opt(size)                __exceptthat __maybenull

+#define __deref_opt_out_ecount_part_opt(size,length)            __deref_out_ecount_part_opt(size,length)    __exceptthat __maybenull

+#define __deref_opt_out_bcount_part_opt(size,length)            __deref_out_bcount_part_opt(size,length)    __exceptthat __maybenull

+#define __deref_opt_out_ecount_full_opt(size)                   __deref_out_ecount_full_opt(size)           __exceptthat __maybenull

+#define __deref_opt_out_bcount_full_opt(size)                   __deref_out_bcount_full_opt(size)           __exceptthat __maybenull

+#define __deref_opt_out_z_opt                                   __post __deref __valid __refparam __exceptthat __maybenull __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull __post __deref __nullterminated

+#define __deref_opt_out_ecount_z_opt(size)                      __deref_opt_out_ecount_opt(size) __post __deref __nullterminated

+#define __deref_opt_out_bcount_z_opt(size)                      __deref_opt_out_bcount_opt(size) __post __deref __nullterminated

+#define __deref_opt_out_nz_opt                                  __deref_opt_out_opt

+#define __deref_opt_out_ecount_nz_opt(size)                     __deref_opt_out_ecount_opt(size)    

+#define __deref_opt_out_bcount_nz_opt(size)                     __deref_opt_out_bcount_opt(size)    

+#define __deref_opt_inout_opt                                   __deref_inout_opt                           __exceptthat __maybenull

+#define __deref_opt_inout_ecount_opt(size)                      __deref_inout_ecount_opt(size)              __exceptthat __maybenull

+#define __deref_opt_inout_bcount_opt(size)                      __deref_inout_bcount_opt(size)              __exceptthat __maybenull

+#define __deref_opt_inout_ecount_part_opt(size,length)          __deref_inout_ecount_part_opt(size,length)  __exceptthat __maybenull

+#define __deref_opt_inout_bcount_part_opt(size,length)          __deref_inout_bcount_part_opt(size,length)  __exceptthat __maybenull

+#define __deref_opt_inout_ecount_full_opt(size)                 __deref_inout_ecount_full_opt(size)         __exceptthat __maybenull

+#define __deref_opt_inout_bcount_full_opt(size)                 __deref_inout_bcount_full_opt(size)         __exceptthat __maybenull

+#define __deref_opt_inout_z_opt                                 __deref_opt_inout_opt  __pre __deref __nullterminated __post __deref __nullterminated             

+#define __deref_opt_inout_ecount_z_opt(size)                    __deref_opt_inout_ecount_opt(size)  __pre __deref __nullterminated __post __deref __nullterminated

+#define __deref_opt_inout_bcount_z_opt(size)                    __deref_opt_inout_bcount_opt(size)  __pre __deref __nullterminated __post __deref __nullterminated

+#define __deref_opt_inout_nz_opt                                __deref_opt_inout_opt               

+#define __deref_opt_inout_ecount_nz_opt(size)                   __deref_opt_inout_ecount_opt(size)  

+#define __deref_opt_inout_bcount_nz_opt(size)                   __deref_opt_inout_bcount_opt(size)  

+

+/*

+-------------------------------------------------------------------------------

+Advanced Annotation Definitions

+

+Any of these may be used to directly annotate functions, and may be used in

+combination with each other or with regular buffer macros. For an explanation

+of each annotation, see the advanced annotations section.

+-------------------------------------------------------------------------------

+*/

+

+#define __success(expr)                     __inner_success(expr)

+#define __nullterminated                    __readableTo(sentinel(0))

+#define __nullnullterminated

+#define __reserved                          __pre __null

+#define __checkReturn                       __inner_checkReturn

+#define __typefix(ctype)                    __inner_typefix(ctype)

+#define __override                          __inner_override

+#define __callback                          __inner_callback

+#define __format_string

+#define __blocksOn(resource)                __inner_blocksOn(resource)

+#define __control_entrypoint(category)      __inner_control_entrypoint(category)

+#define __data_entrypoint(category)         __inner_data_entrypoint(category)

+

+#ifndef __fallthrough

+    __inner_fallthrough_dec

+    #define __fallthrough __inner_fallthrough

+#endif

+

+#ifndef __analysis_assume

+#ifdef _PREFAST_

+#define __analysis_assume(expr) __assume(expr)

+#else

+#define __analysis_assume(expr) 

+#endif

+#endif

+

+#ifdef  __cplusplus

+}

+#endif

+

+

diff --git a/core/src/fxge/Microsoft SDK/include/specstrings.h b/core/src/fxge/Microsoft SDK/include/specstrings.h
new file mode 100644
index 0000000..00cdd33
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/specstrings.h
@@ -0,0 +1,978 @@
+/***************************************************************\

+*                                                               *

+* SpecStrings.h - markers for documenting the semantics of APIs *

+*                                                               *

+* Version 1.0                                                   *

+*                                                               *

+* Copyright (c) Microsoft Corporation. All rights reserved.     *

+*                                                               *

+\***************************************************************/

+

+// @@BEGIN_DDKSPLIT

+

+// -------------------------------------------------------------------------------

+// Introduction

+//

+// SpecStrings.h provides a set of annotations to describe how a function uses its

+// parameters - the assumptions it makes about them, and the guarantees it makes

+// upon finishing.

+//

+// Annotations may be placed before either a function parameter's type or its return

+// type, and describe the function's behavior regarding the parameter or return value.

+// There are two classes of annotations: buffer annotations and advanced annotations.

+// Buffer annotations describe how functions use their pointer parameters, and

+// advanced annotations either describe complex/unusual buffer behavior, or provide

+// additional information about a parameter that is not otherwise expressible.

+//

+// -------------------------------------------------------------------------------

+// Buffer Annotations

+//

+// The most important annotations in SpecStrings.h provide a consistent way to annotate

+// buffer parameters or return values for a function. Each of these annotations describes

+// a single buffer (which could be a string, a fixed-length or variable-length array,

+// or just a pointer) that the function interacts with: where it is, how large it is,

+// how much is initialized, and what the function does with it.

+//

+// The appropriate macro for a given buffer can be constructed using the table below.

+// Just pick the appropriate values from each category, and combine them together

+// with a leading underscore. Some combinations of values do not make sense as buffer

+// annotations. Only meaningful annotations can be added to your code; for a list of

+// these, see the buffer annotation definitions section.

+//

+// Only a single buffer annotation should be used for each parameter.

+//

+// |------------|------------|---------|--------|----------|---------------|

+// |   Level    |   Usage    |  Size   | Output | Optional |  Parameters   |

+// |------------|------------|---------|--------|----------|---------------|

+// | <>         | <>         | <>      | <>     | <>       | <>            |

+// | _deref     | _in        | _ecount | _full  | _opt     | (size)        |

+// | _deref_opt | _out       | _bcount | _part  |          | (size,length) |

+// |            | _inout     |         |        |          |               |

+// |            |            |         |        |          |               |

+// |------------|------------|---------|--------|----------|---------------|

+//

+// Level: Describes the buffer pointer's level of indirection from the parameter or

+//          return value 'p'.

+//

+// <>         : p is the buffer pointer.

+// _deref     : *p is the buffer pointer. p must not be NULL.

+// _deref_opt : *p may be the buffer pointer. p may be NULL, in which case the rest of

+//                the annotation is ignored.

+//

+// Usage: Describes how the function uses the buffer.

+//

+// <>     : The buffer is not accessed. If used on the return value or with _deref, the

+//            function will provide the buffer, and it will be uninitialized at exit.

+//            Otherwise, the caller must provide the buffer. This should only be used

+//            for alloc and free functions.

+// _in    : The function will only read from the buffer. The caller must provide the

+//            buffer and initialize it.

+// _out   : The function will only write to the buffer. If used on the return value or

+//            with _deref, the function will provide the buffer and initialize it.

+//            Otherwise, the caller must provide the buffer, and the function will

+//            initialize it.

+// _inout : The function may freely read from and write to the buffer. The caller must

+//            provide the buffer and initialize it. If used with _deref, the buffer may

+//            be reallocated by the function.

+//

+// Size: Describes the total size of the buffer. This may be less than the space actually

+//         allocated for the buffer, in which case it describes the accessible amount.

+//

+// <>      : No buffer size is given. If the type specifies the buffer size (such as

+//             with LPSTR and LPWSTR), that amount is used. Otherwise, the buffer is one

+//             element long. Must be used with _in, _out, or _inout.

+// _ecount : The buffer size is an explicit element count.

+// _bcount : The buffer size is an explicit byte count.

+//

+// Output: Describes how much of the buffer will be initialized by the function. For

+//           _inout buffers, this also describes how much is initialized at entry. Omit this

+//           category for _in buffers; they must be fully initialized by the caller.

+//

+// <>    : The type specifies how much is initialized. For instance, a function initializing

+//           an LPWSTR must NULL-terminate the string.

+// _full : The function initializes the entire buffer.

+// _part : The function initializes part of the buffer, and explicitly indicates how much.

+//

+// Optional: Describes if the buffer itself is optional.

+//

+// <>   : The pointer to the buffer must not be NULL.

+// _opt : The pointer to the buffer might be NULL. It will be checked before being dereferenced.

+//

+// Parameters: Gives explicit counts for the size and length of the buffer.

+//

+// <>            : There is no explicit count. Use when neither _ecount nor _bcount is used.

+// (size)        : Only the buffer's total size is given. Use with _ecount or _bcount but not _part.

+// (size,length) : The buffer's total size and initialized length are given. Use with _ecount_part

+//                   and _bcount_part.

+//

+// -------------------------------------------------------------------------------

+// Buffer Annotation Examples

+//

+// LWSTDAPI_(BOOL) StrToIntExA(

+//     LPCSTR pszString,                    // No annotation required, const implies __in.

+//     DWORD dwFlags,

+//     __out int *piRet                     // A pointer whose dereference will be filled in.

+// );

+//

+// void MyPaintingFunction(

+//     __in HWND hwndControl,               // An initialized read-only parameter.

+//     __in_opt HDC hdcOptional,            // An initialized read-only parameter that might be NULL.

+//     __inout IPropertyStore *ppsStore     // An initialized parameter that may be freely used

+//                                          //   and modified.

+// );

+//

+// LWSTDAPI_(BOOL) PathCompactPathExA(

+//     __out_ecount(cchMax) LPSTR pszOut,   // A string buffer with cch elements that will

+//                                          //   be NULL terminated on exit.

+//     LPCSTR pszSrc,                       // No annotation required, const implies __in.

+//     UINT cchMax,

+//     DWORD dwFlags

+// );

+//

+// HRESULT SHLocalAllocBytes(

+//     size_t cb,

+//     __deref_bcount(cb) T **ppv           // A pointer whose dereference will be set to an

+//                                          //   uninitialized buffer with cb bytes.

+// );

+//

+// __inout_bcount_full(cb) : A buffer with cb elements that is fully initialized at

+//     entry and exit, and may be written to by this function.

+//

+// __out_ecount_part(count, *countOut) : A buffer with count elements that will be

+//     partially initialized by this function. The function indicates how much it

+//     initialized by setting *countOut.

+//

+// -------------------------------------------------------------------------------

+// Advanced Annotations

+//

+// Advanced annotations describe behavior that is not expressible with the regular

+// buffer macros. These may be used either to annotate buffer parameters that involve

+// complex or conditional behavior, or to enrich existing annotations with additional

+// information.

+//

+// __success(expr) f :

+//     <expr> indicates whether function f succeeded or not. If <expr> is true at exit,

+//     all the function's guarantees (as given by other annotations) must hold. If <expr>

+//     is false at exit, the caller should not expect any of the function's guarantees

+//     to hold. If not used, the function must always satisfy its guarantees. Added

+//     automatically to functions that indicate success in standard ways, such as by

+//     returning an HRESULT.

+//

+// __out_awcount(expr, size) p :

+//     Pointer p is a buffer whose size may be given in either bytes or elements. If

+//     <expr> is true, this acts like __out_bcount. If <expr> is false, this acts

+//     like __out_ecount. This should only be used to annotate old APIs.

+//

+// __in_awcount(expr, size) p :

+//     Pointer p is a buffer whose size may be given in either bytes or elements. If

+//     <expr> is true, this acts like __in_bcount. If <expr> is false, this acts

+//     like __in_ecount. This should only be used to annotate old APIs.

+//

+// __nullterminated p :

+//     Pointer p is a buffer that may be read or written up to and including the first

+//     NULL character or pointer. May be used on typedefs, which marks valid (properly

+//     initialized) instances of that type as being NULL-terminated.

+//

+// __nullnullterminated p :

+//     Pointer p is a buffer that may be read or written up to and including the first

+//     sequence of two NULL characters or pointers. May be used on typedefs, which marks

+//     valid instances of that type as being double-NULL terminated.

+//

+// __reserved v :

+//     Value v must be 0/NULL, reserved for future use.

+//

+// __checkReturn v :

+//     Return value v must not be ignored by callers of this function.

+//

+// __typefix(ctype) v :

+//     Value v should be treated as an instance of ctype, rather than its declared type.

+//

+// __override f :

+//     Specify C#-style 'override' behaviour for overriding virtual methods.

+//

+// __callback f :

+//     Function f can be used as a function pointer.

+//

+// __format_string p :

+//     Pointer p is a string that contains % markers in the style of printf.

+//

+// __blocksOn(resource) f :

+//     Function f blocks on the resource 'resource'.

+//

+// __fallthrough :

+//     Annotates switch statement labels where fall-through is desired, to distinguish

+//     from forgotten break statements.

+//

+// -------------------------------------------------------------------------------

+// Advanced Annotation Examples

+//

+// __success(return == TRUE) LWSTDAPI_(BOOL) 

+// PathCanonicalizeA(__out_ecount(MAX_PATH) LPSTR pszBuf, LPCSTR pszPath) :

+//     pszBuf is only guaranteed to be NULL-terminated when TRUE is returned.

+//

+// typedef __nullterminated WCHAR* LPWSTR : Initialized LPWSTRs are NULL-terminated strings.

+//

+// __out_ecount(cch) __typefix(LPWSTR) void *psz : psz is a buffer parameter which will be

+//     a NULL-terminated WCHAR string at exit, and which initially contains cch WCHARs.

+//

+// -------------------------------------------------------------------------------

+

+// @@END_DDKSPLIT

+

+#if _MSC_VER > 1000

+#pragma once

+#endif  // #if _MSC_VER > 1000

+

+#define __specstrings

+

+#ifdef  __cplusplus

+#ifndef __nothrow

+# define __nothrow __declspec(nothrow)

+#endif

+extern "C" {

+#else

+#ifndef __nothrow

+# define __nothrow

+#endif

+#endif  // #ifdef __cplusplus

+

+// @@BEGIN_DDKSPLIT

+

+// -------------------------------------------------------------------------------

+// Helper Macro Definitions

+//

+// These express behavior common to many of the high-level annotations.

+// DO NOT USE THESE IN YOUR CODE.

+// -------------------------------------------------------------------------------

+

+// The helper annotations are only understood by the compiler version used by various

+// defect detection tools. When the regular compiler is running, they are defined into

+// nothing, and do not affect the compiled code.

+#if (_MSC_VER >= 1000) && !defined(MIDL_PASS) && defined(_PREFAST_)

+

+    // In the primitive __declspec("SAL_*") annotations "SAL" stands for Standard

+    // Annotation Language.  These __declspec("SAL_*") annotations are the

+    // primitives the compiler understands and all high-level SpecString MACROs

+    // will decompose into these primivates.

+

+    #define SPECSTRINGIZE( x ) #x

+

+    //

+    // __null p

+    // __notnull p

+    // __maybenull p

+    //

+    // Annotates a pointer p. States that pointer p is null. Commonly used

+    // in the negated form __notnull or the possibly null form __maybenull.

+    //

+    #define __null                  __declspec("SAL_null")

+    #define __notnull               __declspec("SAL_notnull")

+    #define __maybenull             __declspec("SAL_maybenull")

+

+    //

+    // __readonly l

+    // __notreadonly l

+    // __mabyereadonly l

+    //

+    // Annotates a location l. States that location l is not modified after

+    // this point.  If the annotation is placed on the precondition state of

+    // a function, the restriction only applies until the postcondition state

+    // of the function.  __maybereadonly states that the annotated location

+    // may be modified, whereas __notreadonly states that a location must be

+    // modified.

+    //

+    #define __readonly              __declspec("SAL_readonly")

+    #define __notreadonly           __declspec("SAL_notreadonly")

+    #define __maybereadonly         __declspec("SAL_maybereadonly")

+

+    //

+    // __valid v

+    // __notvalid v

+    // __maybevalid v

+    //

+    // Annotates any value v. States that the value satisfies all properties of

+    // valid values of its type. For example, for a string buffer, valid means

+    // that the buffer pointer is either NULL or points to a NULL-terminated string.

+    //

+    #define __valid                 __declspec("SAL_valid")

+    #define __notvalid              __declspec("SAL_notvalid")

+    #define __maybevalid            __declspec("SAL_maybevalid")

+

+    //

+    // __readableTo(extent) p

+    //

+    // Annotates a buffer pointer p.  If the buffer can be read, extent describes

+    // how much of the buffer is readable. For a reader of the buffer, this is

+    // an explicit permission to read up to that amount, rather than a restriction to

+    // read only up to it.

+    //

+    #define __readableTo(extent)    __declspec("SAL_readableTo("SPECSTRINGIZE(extent)")")

+

+    //

+    // __elem_readableTo(size)

+    //

+    // Annotates a buffer pointer p as being readable to size elements.

+    //

+    #define __elem_readableTo(size)   __declspec("SAL_readableTo(elementCount("SPECSTRINGIZE(size)"))")

+    

+    //

+    // __byte_readableTo(size)

+    //

+    // Annotates a buffer pointer p as being readable to size bytes.

+    //

+    #define __byte_readableTo(size)   __declspec("SAL_readableTo(byteCount("SPECSTRINGIZE(size)"))")

+    

+    //

+    // __writableTo(extent) p

+    //

+    // Annotates a buffer pointer p. If the buffer can be modified, extent

+    // describes how much of the buffer is writable (usually the allocation

+    // size). For a writer of the buffer, this is an explicit permission to

+    // write up to that amount, rather than a restriction to write only up to it.

+    //

+    #define __writableTo(size)   __declspec("SAL_writableTo("SPECSTRINGIZE(size)")")

+

+    //

+    // __elem_writableTo(size)

+    //

+    // Annotates a buffer pointer p as being writable to size elements.

+    //

+    #define __elem_writableTo(size)   __declspec("SAL_writableTo(elementCount("SPECSTRINGIZE(size)"))")

+    

+    //

+    // __byte_writableTo(size)

+    //

+    // Annotates a buffer pointer p as being writable to size bytes.

+    //

+    #define __byte_writableTo(size)   __declspec("SAL_writableTo(byteCount("SPECSTRINGIZE(size)"))")

+

+    //

+    // __deref p

+    //

+    // Annotates a pointer p. The next annotation applies one dereference down

+    // in the type. If readableTo(p, size) then the next annotation applies to

+    // all elements *(p+i) for which i satisfies the size. If p is a pointer

+    // to a struct, the next annotation applies to all fields of the struct.

+    //

+    #define __deref                 __declspec("SAL_deref")

+    

+    //

+    // __pre __next_annotation

+    //

+    // The next annotation applies in the precondition state

+    //

+    #define __pre                   __declspec("SAL_pre")

+    

+    //

+    // __post __next_annotation

+    //

+    // The next annotation applies in the postcondition state

+    //

+    #define __post                  __declspec("SAL_post")

+    

+    //

+    // __precond(<expr>)

+    //

+    // When <expr> is true, the next annotation applies in the precondition state

+    // (currently not enabled)

+    //

+    #define __precond(expr)         __pre

+

+    //

+    // __postcond(<expr>)

+    //

+    // When <expr> is true, the next annotation applies in the postcondition state

+    // (currently not enabled)

+    //

+    #define __postcond(expr)        __post

+

+    //

+    // __exceptthat

+    //

+    // Given a set of annotations Q containing __exceptthat maybeP, the effect of

+    // the except clause is to erase any P or notP annotations (explicit or

+    // implied) within Q at the same level of dereferencing that the except

+    // clause appears, and to replace it with maybeP.

+    //

+    //  Example 1: __valid __exceptthat __maybenull on a pointer p means that the

+    //             pointer may be null, and is otherwise valid, thus overriding

+    //             the implicit notnull annotation implied by __valid on

+    //             pointers.

+    //

+    //  Example 2: __valid __deref __exceptthat __maybenull on an int **p means

+    //             that p is not null (implied by valid), but the elements

+    //             pointed to by p could be null, and are otherwise valid. 

+    //

+    #define __exceptthat                __declspec("SAL_except")

+

+    //

+    // _refparam

+    //

+    // Added to all out parameter macros to indicate that they are all reference

+    // parameters.

+    //

+    #define __refparam                  __deref __notreadonly

+

+    //

+    // __inner_*

+    //

+    // Helper macros that directly correspond to certain high-level annotations.

+    //

+    //

+

+    // Macros to classify the entrypoints and indicate their category.

+    //

+    //

+    // Pre-defined control point categories include: RPC, LPC, DeviceDriver, UserToKernel, ISAPI, COM.

+    //

+    #define __inner_control_entrypoint(category) __declspec("SAL_entrypoint(controlEntry, "SPECSTRINGIZE(category)")")

+

+    //

+    // Pre-defined data entry point categories include: Registry, File, Network.

+    //

+    #define __inner_data_entrypoint(category)    __declspec("SAL_entrypoint(dataEntry, "SPECSTRINGIZE(category)")")

+

+    #define __inner_success(expr)               __declspec("SAL_success("SPECSTRINGIZE(expr)")")

+    #define __inner_checkReturn                 __declspec("SAL_checkReturn")

+    #define __inner_typefix(ctype)              __declspec("SAL_typefix("SPECSTRINGIZE(ctype)")")

+    #define __inner_override                    __declspec("__override")

+    #define __inner_callback                    __declspec("__callback")

+    #define __inner_blocksOn(resource)          __declspec("SAL_blocksOn("SPECSTRINGIZE(resource)")")

+    #define __inner_fallthrough_dec             __inline __nothrow void __FallThrough() {}

+    #define __inner_fallthrough                 __FallThrough();

+

+#else

+

+// @@END_DDKSPLIT

+

+#ifndef __null

+    #define __null

+#endif

+#ifndef __notnull

+    #define __notnull

+#endif

+#ifndef __maybenull

+    #define __maybenull

+#endif

+#ifndef __readonly

+    #define __readonly

+#endif

+#ifndef __notreadonly

+    #define __notreadonly

+#endif

+#ifndef __maybereadonly

+    #define __maybereadonly

+#endif

+#ifndef __valid

+    #define __valid

+#endif

+#ifndef __notvalid

+    #define __notvalid

+#endif

+#ifndef __maybevalid

+    #define __maybevalid

+#endif

+#ifndef __readableTo

+    #define __readableTo(extent)

+#endif

+#ifndef __elem_readableTo

+    #define __elem_readableTo(size)

+#endif

+#ifndef __byte_readableTo

+    #define __byte_readableTo(size)

+#endif

+#ifndef __writableTo

+    #define __writableTo(size)

+#endif

+#ifndef __elem_writableTo

+    #define __elem_writableTo(size)

+#endif

+#ifndef __byte_writableTo

+    #define __byte_writableTo(size)

+#endif

+#ifndef __deref

+    #define __deref

+#endif

+#ifndef __pre

+    #define __pre

+#endif

+#ifndef __post

+    #define __post

+#endif

+#ifndef __precond

+    #define __precond(expr)

+#endif

+#ifndef __postcond

+    #define __postcond(expr)

+#endif

+#ifndef __exceptthat

+    #define __exceptthat

+#endif

+#ifndef __inner_success

+    #define __inner_success(expr)

+#endif

+#ifndef __inner_checkReturn

+    #define __inner_checkReturn

+#endif

+#ifndef __inner_typefix

+    #define __inner_typefix(ctype)

+#endif

+#ifndef __inner_override

+    #define __inner_override

+#endif

+#ifndef __inner_callback

+    #define __inner_callback

+#endif

+#ifndef __inner_blocksOn

+    #define __inner_blocksOn(resource)

+#endif

+#ifndef __inner_fallthrough_dec

+    #define __inner_fallthrough_dec

+#endif

+#ifndef __inner_fallthrough

+    #define __inner_fallthrough

+#endif

+#ifndef __refparam

+    #define __refparam

+#endif

+#ifndef __inner_control_entrypoint

+    #define __inner_control_entrypoint(category)

+#endif

+#ifndef __inner_data_entrypoint

+    #define __inner_data_entrypoint(category)

+#endif

+// @@BEGIN_DDKSPLIT

+#endif // #if (_MSC_VER >= 1000) && !defined(MIDL_PASS) && defined(_PREFAST_)

+// -------------------------------------------------------------------------------

+// Buffer Annotation Definitions

+//

+// Any of these may be used to directly annotate functions, but only one should

+// be used for each parameter. To determine which annotation to use for a given

+// buffer, use the table in the buffer annotations section.

+// -------------------------------------------------------------------------------

+// @@END_DDKSPLIT

+

+#ifndef __ecount

+#define __ecount(size)                                          __notnull __elem_writableTo(size)

+#endif

+#ifndef __bcount

+#define __bcount(size)                                          __notnull __byte_writableTo(size)

+#endif

+#ifndef __in

+#define __in                                                    __pre __valid __pre __deref __readonly

+#endif

+#ifndef __in_ecount

+#define __in_ecount(size)                                       __in __pre __elem_readableTo(size)

+#endif

+#ifndef __in_bcount

+#define __in_bcount(size)                                       __in __pre __byte_readableTo(size)

+#endif

+#ifndef __out

+#define __out                                                   __ecount(1) __post __valid __refparam

+#endif

+#ifndef __out_ecount

+#define __out_ecount(size)                                      __ecount(size) __post __valid __refparam

+#endif

+#ifndef __out_bcount

+#define __out_bcount(size)                                      __bcount(size) __post __valid __refparam

+#endif

+#ifndef __out_ecount_part

+#define __out_ecount_part(size,length)                          __out_ecount(size) __post __elem_readableTo(length)

+#endif

+#ifndef __out_bcount_part

+#define __out_bcount_part(size,length)                          __out_bcount(size) __post __byte_readableTo(length)

+#endif

+#ifndef __out_ecount_full

+#define __out_ecount_full(size)                                 __out_ecount_part(size,size)

+#endif

+#ifndef __out_bcount_full

+#define __out_bcount_full(size)                                 __out_bcount_part(size,size)

+#endif

+#ifndef __inout

+#define __inout                                                 __pre __valid __post __valid __refparam

+#endif

+#ifndef __inout_ecount

+#define __inout_ecount(size)                                    __out_ecount(size) __pre __valid

+#endif

+#ifndef __inout_bcount

+#define __inout_bcount(size)                                    __out_bcount(size) __pre __valid

+#endif

+#ifndef __inout_ecount_part

+#define __inout_ecount_part(size,length)                        __out_ecount_part(size,length) __pre __valid __pre __elem_readableTo(length)

+#endif

+#ifndef __inout_bcount_part

+#define __inout_bcount_part(size,length)                        __out_bcount_part(size,length) __pre __valid __pre __byte_readableTo(length)

+#endif

+#ifndef __inout_ecount_full

+#define __inout_ecount_full(size)                               __inout_ecount_part(size,size)

+#endif

+#ifndef __inout_bcount_full

+#define __inout_bcount_full(size)                               __inout_bcount_part(size,size)

+#endif

+

+#ifndef __ecount_opt

+#define __ecount_opt(size)                                      __ecount(size)                              __exceptthat __maybenull

+#endif

+#ifndef __bcount_opt

+#define __bcount_opt(size)                                      __bcount(size)                              __exceptthat __maybenull

+#endif

+#ifndef __in_opt

+#define __in_opt                                                __in                                        __exceptthat __maybenull

+#endif

+#ifndef __in_ecount_opt

+#define __in_ecount_opt(size)                                   __in_ecount(size)                           __exceptthat __maybenull

+#endif

+#ifndef __in_bcount_opt

+#define __in_bcount_opt(size)                                   __in_bcount(size)                           __exceptthat __maybenull

+#endif

+#ifndef __out_opt

+#define __out_opt                                               __out                                       __exceptthat __maybenull

+#endif

+#ifndef __out_ecount_opt

+#define __out_ecount_opt(size)                                  __out_ecount(size)                          __exceptthat __maybenull

+#endif

+#ifndef __out_bcount_opt

+#define __out_bcount_opt(size)                                  __out_bcount(size)                          __exceptthat __maybenull

+#endif

+#ifndef __out_ecount_part_opt

+#define __out_ecount_part_opt(size,length)                      __out_ecount_part(size,length)              __exceptthat __maybenull

+#endif

+#ifndef __out_bcount_part_opt

+#define __out_bcount_part_opt(size,length)                      __out_bcount_part(size,length)              __exceptthat __maybenull

+#endif

+#ifndef __out_ecount_full_opt

+#define __out_ecount_full_opt(size)                             __out_ecount_full(size)                     __exceptthat __maybenull

+#endif

+#ifndef __out_bcount_full_opt

+#define __out_bcount_full_opt(size)                             __out_bcount_full(size)                     __exceptthat __maybenull

+#endif

+#ifndef __inout_opt

+#define __inout_opt                                             __inout                                     __exceptthat __maybenull

+#endif

+#ifndef __inout_ecount_opt

+#define __inout_ecount_opt(size)                                __inout_ecount(size)                        __exceptthat __maybenull

+#endif

+#ifndef __inout_bcount_opt

+#define __inout_bcount_opt(size)                                __inout_bcount(size)                        __exceptthat __maybenull

+#endif

+#ifndef __inout_ecount_part_opt

+#define __inout_ecount_part_opt(size,length)                    __inout_ecount_part(size,length)            __exceptthat __maybenull

+#endif

+#ifndef __inout_bcount_part_opt

+#define __inout_bcount_part_opt(size,length)                    __inout_bcount_part(size,length)            __exceptthat __maybenull

+#endif

+#ifndef __inout_ecount_full_opt

+#define __inout_ecount_full_opt(size)                           __inout_ecount_full(size)                   __exceptthat __maybenull

+#endif

+#ifndef __inout_bcount_full_opt

+#define __inout_bcount_full_opt(size)                           __inout_bcount_full(size)                   __exceptthat __maybenull

+#endif

+

+#ifndef __deref_ecount

+#define __deref_ecount(size)                                    __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __elem_writableTo(size)

+#endif

+#ifndef __deref_bcount

+#define __deref_bcount(size)                                    __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __byte_writableTo(size)

+#endif

+#ifndef __deref_in

+#define __deref_in                                              __in __pre __deref __deref __readonly

+#endif

+#ifndef __deref_in_ecount

+#define __deref_in_ecount(size)                                 __deref_in __pre __deref __elem_readableTo(size)

+#endif

+#ifndef __deref_in_bcount

+#define __deref_in_bcount(size)                                 __deref_in __pre __deref __byte_readableTo(size)

+#endif

+#ifndef __deref_out

+#define __deref_out                                             __deref_ecount(1) __post __deref __valid __refparam

+#endif

+#ifndef __deref_out_ecount

+#define __deref_out_ecount(size)                                __deref_ecount(size) __post __deref __valid __refparam

+#endif

+#ifndef __deref_out_bcount

+#define __deref_out_bcount(size)                                __deref_bcount(size) __post __deref __valid __refparam

+#endif

+#ifndef __deref_out_ecount_part

+#define __deref_out_ecount_part(size,length)                    __deref_out_ecount(size) __post __deref __elem_readableTo(length)

+#endif

+#ifndef __deref_out_bcount_part

+#define __deref_out_bcount_part(size,length)                    __deref_out_bcount(size) __post __deref __byte_readableTo(length)

+#endif

+#ifndef __deref_out_ecount_full

+#define __deref_out_ecount_full(size)                           __deref_out_ecount_part(size,size)

+#endif

+#ifndef __deref_out_bcount_full

+#define __deref_out_bcount_full(size)                           __deref_out_bcount_part(size,size)

+#endif

+#ifndef __deref_inout

+#define __deref_inout                                           __notnull __elem_readableTo(1) __pre __deref __valid __post __deref __valid __refparam

+#endif

+#ifndef __deref_inout_ecount

+#define __deref_inout_ecount(size)                              __deref_inout __pre __deref __elem_writableTo(size) __post __deref __elem_writableTo(size)

+#endif

+#ifndef __deref_inout_bcount

+#define __deref_inout_bcount(size)                              __deref_inout __pre __deref __byte_writableTo(size) __post __deref __byte_writableTo(size)

+#endif

+#ifndef __deref_inout_ecount_part

+#define __deref_inout_ecount_part(size,length)                  __deref_inout_ecount(size) __pre __deref __elem_readableTo(length) __post __deref __elem_readableTo(length)

+#endif

+#ifndef __deref_inout_bcount_part

+#define __deref_inout_bcount_part(size,length)                  __deref_inout_bcount(size) __pre __deref __byte_readableTo(length) __post __deref __byte_readableTo(length)

+#endif

+#ifndef __deref_inout_ecount_full

+#define __deref_inout_ecount_full(size)                         __deref_inout_ecount_part(size,size)

+#endif

+#ifndef __deref_inout_bcount_full

+#define __deref_inout_bcount_full(size)                         __deref_inout_bcount_part(size,size)

+#endif

+

+#ifndef __deref_ecount_opt

+#define __deref_ecount_opt(size)                                __deref_ecount(size)                        __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_bcount_opt

+#define __deref_bcount_opt(size)                                __deref_bcount(size)                        __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_in_opt

+#define __deref_in_opt                                          __deref_in                                  __pre __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_in_ecount_opt

+#define __deref_in_ecount_opt(size)                             __deref_in_ecount(size)                     __pre __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_in_bcount_opt

+#define __deref_in_bcount_opt(size)                             __deref_in_bcount(size)                     __pre __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_out_opt

+#define __deref_out_opt                                         __deref_out                                 __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_out_ecount_opt

+#define __deref_out_ecount_opt(size)                            __deref_out_ecount(size)                    __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_out_bcount_opt

+#define __deref_out_bcount_opt(size)                            __deref_out_bcount(size)                    __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_out_ecount_part_opt

+#define __deref_out_ecount_part_opt(size,length)                __deref_out_ecount_part(size,length)        __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_out_bcount_part_opt

+#define __deref_out_bcount_part_opt(size,length)                __deref_out_bcount_part(size,length)        __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_out_ecount_full_opt

+#define __deref_out_ecount_full_opt(size)                       __deref_out_ecount_full(size)               __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_out_bcount_full_opt

+#define __deref_out_bcount_full_opt(size)                       __deref_out_bcount_full(size)               __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_inout_opt

+#define __deref_inout_opt                                       __deref_inout                               __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_inout_ecount_opt

+#define __deref_inout_ecount_opt(size)                          __deref_inout_ecount(size)                  __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_inout_bcount_opt

+#define __deref_inout_bcount_opt(size)                          __deref_inout_bcount(size)                  __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_inout_ecount_part_opt

+#define __deref_inout_ecount_part_opt(size,length)              __deref_inout_ecount_part(size,length)      __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_inout_bcount_part_opt

+#define __deref_inout_bcount_part_opt(size,length)              __deref_inout_bcount_part(size,length)      __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_inout_ecount_full_opt

+#define __deref_inout_ecount_full_opt(size)                     __deref_inout_ecount_full(size)             __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#endif

+#ifndef __deref_inout_bcount_full_opt

+#define __deref_inout_bcount_full_opt(size)                     __deref_inout_bcount_full(size)             __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull

+#endif

+

+#ifndef __deref_opt_ecount

+#define __deref_opt_ecount(size)                                __deref_ecount(size)                        __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_bcount

+#define __deref_opt_bcount(size)                                __deref_bcount(size)                        __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_in

+#define __deref_opt_in                                          __deref_in                                  __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_in_ecount

+#define __deref_opt_in_ecount(size)                             __deref_in_ecount(size)                     __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_in_bcount

+#define __deref_opt_in_bcount(size)                             __deref_in_bcount(size)                     __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out

+#define __deref_opt_out                                         __deref_out                                 __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_ecount

+#define __deref_opt_out_ecount(size)                            __deref_out_ecount(size)                    __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_bcount

+#define __deref_opt_out_bcount(size)                            __deref_out_bcount(size)                    __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_ecount_part

+#define __deref_opt_out_ecount_part(size,length)                __deref_out_ecount_part(size,length)        __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_bcount_part

+#define __deref_opt_out_bcount_part(size,length)                __deref_out_bcount_part(size,length)        __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_ecount_full

+#define __deref_opt_out_ecount_full(size)                       __deref_out_ecount_full(size)               __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_bcount_full

+#define __deref_opt_out_bcount_full(size)                       __deref_out_bcount_full(size)               __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout

+#define __deref_opt_inout                                       __deref_inout                               __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_ecount

+#define __deref_opt_inout_ecount(size)                          __deref_inout_ecount(size)                  __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_bcount

+#define __deref_opt_inout_bcount(size)                          __deref_inout_bcount(size)                  __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_ecount_part

+#define __deref_opt_inout_ecount_part(size,length)              __deref_inout_ecount_part(size,length)      __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_bcount_part

+#define __deref_opt_inout_bcount_part(size,length)              __deref_inout_bcount_part(size,length)      __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_ecount_full

+#define __deref_opt_inout_ecount_full(size)                     __deref_inout_ecount_full(size)             __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_bcount_full

+#define __deref_opt_inout_bcount_full(size)                     __deref_inout_bcount_full(size)             __exceptthat __maybenull

+#endif

+

+#ifndef __deref_opt_ecount_opt

+#define __deref_opt_ecount_opt(size)                            __deref_ecount_opt(size)                    __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_bcount_opt

+#define __deref_opt_bcount_opt(size)                            __deref_bcount_opt(size)                    __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_in_opt

+#define __deref_opt_in_opt                                      __deref_in_opt                              __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_in_ecount_opt

+#define __deref_opt_in_ecount_opt(size)                         __deref_in_ecount_opt(size)                 __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_in_bcount_opt

+#define __deref_opt_in_bcount_opt(size)                         __deref_in_bcount_opt(size)                 __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_opt

+#define __deref_opt_out_opt                                     __deref_out_opt                             __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_ecount_opt

+#define __deref_opt_out_ecount_opt(size)                        __deref_out_ecount_opt(size)                __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_bcount_opt

+#define __deref_opt_out_bcount_opt(size)                        __deref_out_bcount_opt(size)                __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_ecount_part_opt

+#define __deref_opt_out_ecount_part_opt(size,length)            __deref_out_ecount_part_opt(size,length)    __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_bcount_part_opt

+#define __deref_opt_out_bcount_part_opt(size,length)            __deref_out_bcount_part_opt(size,length)    __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_ecount_full_opt

+#define __deref_opt_out_ecount_full_opt(size)                   __deref_out_ecount_full_opt(size)           __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_out_bcount_full_opt

+#define __deref_opt_out_bcount_full_opt(size)                   __deref_out_bcount_full_opt(size)           __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_opt

+#define __deref_opt_inout_opt                                   __deref_inout_opt                           __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_ecount_opt

+#define __deref_opt_inout_ecount_opt(size)                      __deref_inout_ecount_opt(size)              __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_bcount_opt

+#define __deref_opt_inout_bcount_opt(size)                      __deref_inout_bcount_opt(size)              __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_ecount_part_opt

+#define __deref_opt_inout_ecount_part_opt(size,length)          __deref_inout_ecount_part_opt(size,length)  __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_bcount_part_opt

+#define __deref_opt_inout_bcount_part_opt(size,length)          __deref_inout_bcount_part_opt(size,length)  __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_ecount_full_opt

+#define __deref_opt_inout_ecount_full_opt(size)                 __deref_inout_ecount_full_opt(size)         __exceptthat __maybenull

+#endif

+#ifndef __deref_opt_inout_bcount_full_opt

+#define __deref_opt_inout_bcount_full_opt(size)                 __deref_inout_bcount_full_opt(size)         __exceptthat __maybenull

+#endif

+

+// @@BEGIN_DDKSPLIT

+// -------------------------------------------------------------------------------

+// Advanced Annotation Definitions

+//

+// Any of these may be used to directly annotate functions, and may be used in

+// combination with each other or with regular buffer macros. For an explanation

+// of each annotation, see the advanced annotations section.

+// -------------------------------------------------------------------------------

+// @@END_DDKSPLIT

+

+#ifndef __out_awcount

+#define __out_awcount(expr,size)            __pre __notnull \

+                                            __precond(expr) __byte_writableTo(size) \

+                                            __precond(!(expr)) __byte_writableTo((size)*2) \

+                                            __post __valid __refparam

+#endif

+#ifndef __in_awcount

+#define __in_awcount(expr,size)             __pre __valid \

+                                            __pre __deref __readonly \

+                                            __precond(expr) __byte_readableTo(size) \

+                                            __precond(!(expr)) __elem_readableTo(size)

+#endif

+#ifndef __success

+#define __success(expr)                     __inner_success(expr)

+#endif

+#ifndef __nullterminated

+#define __nullterminated                    __readableTo(sentinel(0))

+#endif

+#ifndef __nullnullterminated

+#define __nullnullterminated

+#endif

+#ifndef __reserved

+#define __reserved                          __pre __null

+#endif

+#ifndef __checkReturn

+#define __checkReturn                       __inner_checkReturn

+#endif

+#ifndef __typefix

+#define __typefix(ctype)                    __inner_typefix(ctype)

+#endif

+#ifndef __override

+#define __override                          __inner_override

+#endif

+#ifndef __callback

+#define __callback                          __inner_callback

+#endif

+#ifndef __format_string

+#define __format_string

+#endif

+#ifndef __blocksOn

+#define __blocksOn(resource)                __inner_blocksOn(resource)

+#endif

+#ifndef __control_entrypoint

+#define __control_entrypoint(category)      __inner_control_entrypoint(category)

+#endif

+#ifndef __data_entrypoint

+#define __data_entrypoint(category)         __inner_data_entrypoint(category)

+#endif

+

+#ifndef __fallthrough

+    __inner_fallthrough_dec

+    #define __fallthrough __inner_fallthrough

+#endif

+

+// -------------------------------------------------------------------------------

+// Deprecated Annotation Definitions

+//

+// These should be removed from existing code.

+// -------------------------------------------------------------------------------

+

+// #define __opt                               __exceptthat __maybenull

+

+#ifdef  __cplusplus

+}

+#endif

+

diff --git a/core/src/fxge/agg/agg23/agg_array.h b/core/src/fxge/agg/agg23/agg_array.h
new file mode 100644
index 0000000..f5680d9
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_array.h
@@ -0,0 +1,510 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_ARRAY_INCLUDED
+#define AGG_ARRAY_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+template<class T> class pod_array : public CFX_Object
+{
+public:
+    typedef T value_type;
+    ~pod_array()
+    {
+        FX_Free(m_array);
+    }
+    pod_array() : m_size(0), m_capacity(0), m_array(0) {}
+    pod_array(unsigned cap, unsigned extra_tail = 0);
+    pod_array(const pod_array<T>&);
+    const pod_array<T>& operator = (const pod_array<T>&);
+    void capacity(unsigned cap, unsigned extra_tail = 0);
+    unsigned capacity() const
+    {
+        return m_capacity;
+    }
+    void allocate(unsigned size, unsigned extra_tail = 0);
+    void resize(unsigned new_size);
+    void zero()
+    {
+        FXSYS_memset(m_array, 0, sizeof(T) * m_size);
+    }
+    void add(const T& v)
+    {
+        m_array[m_size++] = v;
+    }
+    void inc_size(unsigned size)
+    {
+        m_size += size;
+    }
+    unsigned size()      const
+    {
+        return m_size;
+    }
+    unsigned byte_size() const
+    {
+        return m_size * sizeof(T);
+    }
+    const T& operator [] (unsigned i) const
+    {
+        return m_array[i];
+    }
+    T& operator [] (unsigned i)
+    {
+        return m_array[i];
+    }
+    const T& at(unsigned i) const
+    {
+        return m_array[i];
+    }
+    T& at(unsigned i)
+    {
+        return m_array[i];
+    }
+    T  value_at(unsigned i) const
+    {
+        return m_array[i];
+    }
+    const T* data() const
+    {
+        return m_array;
+    }
+    T* data()
+    {
+        return m_array;
+    }
+    void remove_all()
+    {
+        m_size = 0;
+    }
+    void cut_at(unsigned num)
+    {
+        if(num < m_size) {
+            m_size = num;
+        }
+    }
+private:
+    unsigned m_size;
+    unsigned m_capacity;
+    T*       m_array;
+};
+template<class T>
+void pod_array<T>::capacity(unsigned cap, unsigned extra_tail)
+{
+    m_size = 0;
+    unsigned full_cap = cap + extra_tail;
+    if(full_cap < cap) {
+        FX_Free(m_array);
+        m_array = 0;
+        m_capacity = 0;
+    } else if(full_cap > m_capacity) {
+        FX_Free(m_array);
+        m_array = 0;
+        m_capacity = 0;
+        m_array = FX_Alloc(T, full_cap);
+        if (m_array) {
+            m_capacity = full_cap;
+        }
+    }
+}
+template<class T>
+void pod_array<T>::allocate(unsigned size, unsigned extra_tail)
+{
+    capacity(size, extra_tail);
+    m_size = size;
+}
+template<class T>
+void pod_array<T>::resize(unsigned new_size)
+{
+    if(new_size > m_size) {
+        if(new_size > m_capacity) {
+            T* data = FX_Alloc(T, new_size);
+            FXSYS_memcpy(data, m_array, m_size * sizeof(T));
+            FX_Free(m_array);
+            m_array = data;
+        }
+    } else {
+        m_size = new_size;
+    }
+}
+template<class T> pod_array<T>::pod_array(unsigned cap, unsigned extra_tail) :
+    m_size(0), m_capacity(cap + extra_tail), m_array(FX_Alloc(T, m_capacity)) {}
+template<class T> pod_array<T>::pod_array(const pod_array<T>& v) :
+    m_size(v.m_size),
+    m_capacity(v.m_capacity),
+    m_array(v.m_capacity ? FX_Alloc(T, v.m_capacity) : 0)
+{
+    FXSYS_memcpy(m_array, v.m_array, sizeof(T) * v.m_size);
+}
+template<class T> const pod_array<T>&
+pod_array<T>::operator = (const pod_array<T>&v)
+{
+    allocate(v.m_size);
+    if(v.m_size) {
+        FXSYS_memcpy(m_array, v.m_array, sizeof(T) * v.m_size);
+    }
+    return *this;
+}
+template<class T, unsigned S = 6> class pod_deque : public CFX_Object
+{
+public:
+    enum block_scale_e {
+        block_shift = S,
+        block_size  = 1 << block_shift,
+        block_mask  = block_size - 1
+    };
+    typedef T value_type;
+    ~pod_deque();
+    pod_deque();
+    pod_deque(unsigned block_ptr_inc);
+    pod_deque(const pod_deque<T, S>& v);
+    const pod_deque<T, S>& operator = (const pod_deque<T, S>& v);
+    void remove_all()
+    {
+        m_size = 0;
+    }
+    void free_all()
+    {
+        free_tail(0);
+    }
+    void free_tail(unsigned size);
+    void add(const T& val);
+    void modify_last(const T& val);
+    void remove_last();
+    int allocate_continuous_block(unsigned num_elements);
+    void add_array(const T* ptr, unsigned num_elem)
+    {
+        while(num_elem--) {
+            add(*ptr++);
+        }
+    }
+    template<class DataAccessor> void add_data(DataAccessor& data)
+    {
+        while(data.size()) {
+            add(*data);
+            ++data;
+        }
+    }
+    void cut_at(unsigned size)
+    {
+        if(size < m_size) {
+            m_size = size;
+        }
+    }
+    unsigned size() const
+    {
+        return m_size;
+    }
+    const T& operator [] (unsigned i) const
+    {
+        return m_blocks[i >> block_shift][i & block_mask];
+    }
+    T& operator [] (unsigned i)
+    {
+        return m_blocks[i >> block_shift][i & block_mask];
+    }
+    const T& at(unsigned i) const
+    {
+        return m_blocks[i >> block_shift][i & block_mask];
+    }
+    T& at(unsigned i)
+    {
+        return m_blocks[i >> block_shift][i & block_mask];
+    }
+    T value_at(unsigned i) const
+    {
+        return m_blocks[i >> block_shift][i & block_mask];
+    }
+    const T& curr(unsigned idx) const
+    {
+        return (*this)[idx];
+    }
+    T& curr(unsigned idx)
+    {
+        return (*this)[idx];
+    }
+    const T& prev(unsigned idx) const
+    {
+        return (*this)[(idx + m_size - 1) % m_size];
+    }
+    T& prev(unsigned idx)
+    {
+        return (*this)[(idx + m_size - 1) % m_size];
+    }
+    const T& next(unsigned idx) const
+    {
+        return (*this)[(idx + 1) % m_size];
+    }
+    T& next(unsigned idx)
+    {
+        return (*this)[(idx + 1) % m_size];
+    }
+    const T& last() const
+    {
+        return (*this)[m_size - 1];
+    }
+    T& last()
+    {
+        return (*this)[m_size - 1];
+    }
+    unsigned byte_size() const;
+    const T* block(unsigned nb) const
+    {
+        return m_blocks[nb];
+    }
+public:
+    void allocate_block(unsigned nb);
+    T*   data_ptr();
+    unsigned        m_size;
+    unsigned        m_num_blocks;
+    unsigned        m_max_blocks;
+    T**             m_blocks;
+    unsigned        m_block_ptr_inc;
+};
+template<class T, unsigned S> pod_deque<T, S>::~pod_deque()
+{
+    if(m_num_blocks) {
+        T** blk = m_blocks + m_num_blocks - 1;
+        while(m_num_blocks--) {
+            FX_Free(*blk);
+            --blk;
+        }
+        FX_Free(m_blocks);
+    }
+}
+template<class T, unsigned S>
+void pod_deque<T, S>::free_tail(unsigned size)
+{
+    if(size < m_size) {
+        unsigned nb = (size + block_mask) >> block_shift;
+        while(m_num_blocks > nb) {
+            FX_Free(m_blocks[--m_num_blocks]);
+        }
+        m_size = size;
+    }
+}
+template<class T, unsigned S> pod_deque<T, S>::pod_deque() :
+    m_size(0),
+    m_num_blocks(0),
+    m_max_blocks(0),
+    m_blocks(0),
+    m_block_ptr_inc(block_size)
+{
+}
+template<class T, unsigned S>
+pod_deque<T, S>::pod_deque(unsigned block_ptr_inc) :
+    m_size(0),
+    m_num_blocks(0),
+    m_max_blocks(0),
+    m_blocks(0),
+    m_block_ptr_inc(block_ptr_inc)
+{
+}
+template<class T, unsigned S>
+pod_deque<T, S>::pod_deque(const pod_deque<T, S>& v) :
+    m_size(v.m_size),
+    m_num_blocks(v.m_num_blocks),
+    m_max_blocks(v.m_max_blocks),
+    m_blocks(v.m_max_blocks ? FX_Alloc(T*, v.m_max_blocks) : 0),
+    m_block_ptr_inc(v.m_block_ptr_inc)
+{
+    unsigned i;
+    for(i = 0; i < v.m_num_blocks; ++i) {
+        m_blocks[i] = FX_Alloc(T, block_size);
+        FXSYS_memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T));
+    }
+}
+template<class T, unsigned S>
+const pod_deque<T, S>& pod_deque<T, S>::operator = (const pod_deque<T, S>& v)
+{
+    unsigned i;
+    for(i = m_num_blocks; i < v.m_num_blocks; ++i) {
+        allocate_block(i);
+    }
+    for(i = 0; i < v.m_num_blocks; ++i) {
+        FXSYS_memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T));
+    }
+    m_size = v.m_size;
+    return *this;
+}
+template<class T, unsigned S>
+void pod_deque<T, S>::allocate_block(unsigned nb)
+{
+    if(nb >= m_max_blocks) {
+        T** new_blocks = FX_Alloc(T*, m_max_blocks + m_block_ptr_inc);
+        if(m_blocks) {
+            FXSYS_memcpy(new_blocks,
+                         m_blocks,
+                         m_num_blocks * sizeof(T*));
+            FX_Free(m_blocks);
+        }
+        m_blocks = new_blocks;
+        m_max_blocks += m_block_ptr_inc;
+    }
+    m_blocks[nb] = FX_Alloc(T, block_size);
+    m_num_blocks++;
+}
+template<class T, unsigned S>
+inline T* pod_deque<T, S>::data_ptr()
+{
+    unsigned nb = m_size >> block_shift;
+    if(nb >= m_num_blocks) {
+        allocate_block(nb);
+    }
+    return m_blocks[nb] + (m_size & block_mask);
+}
+template<class T, unsigned S>
+inline void pod_deque<T, S>::add(const T& val)
+{
+    *data_ptr() = val;
+    ++m_size;
+}
+template<class T, unsigned S>
+inline void pod_deque<T, S>::remove_last()
+{
+    if(m_size) {
+        --m_size;
+    }
+}
+template<class T, unsigned S>
+void pod_deque<T, S>::modify_last(const T& val)
+{
+    remove_last();
+    add(val);
+}
+template<class T, unsigned S>
+int pod_deque<T, S>::allocate_continuous_block(unsigned num_elements)
+{
+    if(num_elements < block_size) {
+        data_ptr();
+        unsigned rest = block_size - (m_size & block_mask);
+        unsigned index;
+        if(num_elements <= rest) {
+            index = m_size;
+            m_size += num_elements;
+            return index;
+        }
+        m_size += rest;
+        data_ptr();
+        index = m_size;
+        m_size += num_elements;
+        return index;
+    }
+    return -1;
+}
+template<class T, unsigned S>
+unsigned pod_deque<T, S>::byte_size() const
+{
+    return m_size * sizeof(T);
+}
+class pod_allocator : public CFX_Object
+{
+public:
+    void remove_all()
+    {
+        if(m_num_blocks) {
+            int8u** blk = m_blocks + m_num_blocks - 1;
+            while(m_num_blocks--) {
+                FX_Free(*blk);
+                --blk;
+            }
+            FX_Free(m_blocks);
+        }
+        m_num_blocks = 0;
+        m_max_blocks = 0;
+        m_blocks = 0;
+        m_buf_ptr = 0;
+        m_rest = 0;
+    }
+    ~pod_allocator()
+    {
+        remove_all();
+    }
+    pod_allocator(unsigned block_size, unsigned block_ptr_inc = 256 - 8) :
+        m_block_size(block_size),
+        m_block_ptr_inc(block_ptr_inc),
+        m_num_blocks(0),
+        m_max_blocks(0),
+        m_blocks(0),
+        m_buf_ptr(0),
+        m_rest(0)
+    {
+    }
+    int8u* allocate(unsigned size, unsigned alignment = 1)
+    {
+        if(size == 0) {
+            return 0;
+        }
+        if(size <= m_rest) {
+            int8u* ptr = m_buf_ptr;
+            if(alignment > 1) {
+                unsigned align = (alignment - unsigned((size_t)ptr) % alignment) % alignment;
+                size += align;
+                ptr += align;
+                if(size <= m_rest) {
+                    m_rest -= size;
+                    m_buf_ptr += size;
+                    return ptr;
+                }
+                allocate_block(size);
+                return allocate(size - align, alignment);
+            }
+            m_rest -= size;
+            m_buf_ptr += size;
+            return ptr;
+        }
+        allocate_block(size + alignment - 1);
+        return allocate(size, alignment);
+    }
+private:
+    void allocate_block(unsigned size)
+    {
+        if(size < m_block_size) {
+            size = m_block_size;
+        }
+        if(m_num_blocks >= m_max_blocks) {
+            int8u** new_blocks = FX_Alloc(int8u*, m_max_blocks + m_block_ptr_inc);
+            if(m_blocks) {
+                FXSYS_memcpy(new_blocks,
+                             m_blocks,
+                             m_num_blocks * sizeof(int8u*));
+                FX_Free(m_blocks);
+            }
+            m_blocks = new_blocks;
+            m_max_blocks += m_block_ptr_inc;
+        }
+        m_blocks[m_num_blocks] = m_buf_ptr = FX_Alloc(int8u, size);
+        m_num_blocks++;
+        m_rest = size;
+    }
+    unsigned m_block_size;
+    unsigned m_block_ptr_inc;
+    unsigned m_num_blocks;
+    unsigned m_max_blocks;
+    int8u**  m_blocks;
+    int8u*   m_buf_ptr;
+    unsigned m_rest;
+};
+enum quick_sort_threshold_e {
+    quick_sort_threshold = 9
+};
+template<class T> inline void swap_elements(T& a, T& b)
+{
+    T temp = a;
+    a = b;
+    b = temp;
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_basics.h b/core/src/fxge/agg/agg23/agg_basics.h
new file mode 100644
index 0000000..a78fed8
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_basics.h
@@ -0,0 +1,282 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_BASICS_INCLUDED
+#define AGG_BASICS_INCLUDED
+#ifndef AGG_INT8
+#define AGG_INT8 signed char
+#endif
+#ifndef AGG_INT8U
+#define AGG_INT8U unsigned char
+#endif
+#ifndef AGG_INT16
+#define AGG_INT16 short
+#endif
+#ifndef AGG_INT16U
+#define AGG_INT16U unsigned short
+#endif
+#ifndef AGG_INT32
+#define AGG_INT32 int
+#endif
+#ifndef AGG_INT32U
+#define AGG_INT32U unsigned
+#endif
+#ifndef AGG_INT64
+#define AGG_INT64 signed long long
+#endif
+#ifndef AGG_INT64U
+#define AGG_INT64U unsigned long long
+#endif
+#define AGG_INLINE inline
+namespace agg
+{
+typedef AGG_INT8   int8;
+typedef AGG_INT8U  int8u;
+typedef AGG_INT16  int16;
+typedef AGG_INT16U int16u;
+typedef AGG_INT32  int32;
+typedef AGG_INT32U int32u;
+typedef AGG_INT64  int64;
+typedef AGG_INT64U int64u;
+typedef unsigned char cover_type;
+enum cover_scale_e {
+    cover_shift = 8,
+    cover_size  = 1 << cover_shift,
+    cover_mask  = cover_size - 1,
+    cover_none  = 0,
+    cover_full  = cover_mask
+};
+template<class T> struct rect_base : public CFX_Object {
+    typedef rect_base<T> self_type;
+    T x1;
+    T y1;
+    T x2;
+    T y2;
+    rect_base() {}
+    rect_base(T x1_, T y1_, T x2_, T y2_) :
+        x1(x1_), y1(y1_), x2(x2_), y2(y2_) {}
+    const self_type& normalize()
+    {
+        T t;
+        if(x1 > x2) {
+            t = x1;
+            x1 = x2;
+            x2 = t;
+        }
+        if(y1 > y2) {
+            t = y1;
+            y1 = y2;
+            y2 = t;
+        }
+        return *this;
+    }
+    bool clip(const self_type& r)
+    {
+        if(x2 > r.x2) {
+            x2 = r.x2;
+        }
+        if(y2 > r.y2) {
+            y2 = r.y2;
+        }
+        if(x1 < r.x1) {
+            x1 = r.x1;
+        }
+        if(y1 < r.y1) {
+            y1 = r.y1;
+        }
+        return x1 <= x2 && y1 <= y2;
+    }
+    bool is_valid() const
+    {
+        return x1 <= x2 && y1 <= y2;
+    }
+};
+template<class Rect>
+inline Rect intersect_rectangles(const Rect& r1, const Rect& r2)
+{
+    Rect r = r1;
+    if(r.x2 > r2.x2) {
+        r.x2 = r2.x2;
+    }
+    if(r.y2 > r2.y2) {
+        r.y2 = r2.y2;
+    }
+    if(r.x1 < r2.x1) {
+        r.x1 = r2.x1;
+    }
+    if(r.y1 < r2.y1) {
+        r.y1 = r2.y1;
+    }
+    return r;
+}
+template<class Rect>
+inline Rect unite_rectangles(const Rect& r1, const Rect& r2)
+{
+    Rect r = r1;
+    if(r.x2 < r2.x2) {
+        r.x2 = r2.x2;
+    }
+    if(r.y2 < r2.y2) {
+        r.y2 = r2.y2;
+    }
+    if(r.x1 > r2.x1) {
+        r.x1 = r2.x1;
+    }
+    if(r.y1 > r2.y1) {
+        r.y1 = r2.y1;
+    }
+    return r;
+}
+typedef rect_base<int>    rect;
+typedef rect_base<FX_FLOAT> rect_d;
+enum path_commands_e {
+    path_cmd_stop     = 0,
+    path_cmd_move_to  = 1,
+    path_cmd_line_to  = 2,
+    path_cmd_curve3   = 3,
+    path_cmd_curve4   = 4,
+    path_cmd_curveN   = 5,
+    path_cmd_catrom   = 6,
+    path_cmd_ubspline = 7,
+    path_cmd_end_poly = 0x0F,
+    path_cmd_mask     = 0x0F
+};
+enum path_flags_e {
+    path_flags_none  = 0,
+    path_flags_ccw   = 0x10,
+    path_flags_cw    = 0x20,
+    path_flags_close = 0x40,
+    path_flags_jr	 = 0x80,
+    path_flags_mask  = 0xF0
+};
+inline bool is_vertex(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return c >= path_cmd_move_to && c < path_cmd_end_poly;
+}
+inline bool is_drawing(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return c >= path_cmd_line_to && c < path_cmd_end_poly;
+}
+inline bool is_stop(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return c == path_cmd_stop;
+}
+inline bool is_move_to(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return c == path_cmd_move_to;
+}
+inline bool is_line_to(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return c == path_cmd_line_to;
+}
+inline bool is_curve(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return c == path_cmd_curve3 || c == path_cmd_curve4;
+}
+inline bool is_curve3(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return c == path_cmd_curve3;
+}
+inline bool is_curve4(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return c == path_cmd_curve4;
+}
+inline bool is_end_poly(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return (c & path_cmd_mask) == path_cmd_end_poly;
+}
+inline bool is_close(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return (c & ~(path_flags_cw | path_flags_ccw)) ==
+           (path_cmd_end_poly | path_flags_close);
+}
+inline bool is_next_poly(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return is_stop(c) || is_move_to(c) || is_end_poly(c);
+}
+inline bool is_cw(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return (c & path_flags_cw) != 0;
+}
+inline bool is_ccw(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return (c & path_flags_ccw) != 0;
+}
+inline bool is_oriented(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return (c & (path_flags_cw | path_flags_ccw)) != 0;
+}
+inline bool is_closed(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return (c & path_flags_close) != 0;
+}
+inline unsigned get_close_flag(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return c & path_flags_close;
+}
+inline unsigned clear_orientation(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return c & ~(path_flags_cw | path_flags_ccw);
+}
+inline unsigned get_orientation(unsigned c)
+{
+    c &= ~path_flags_jr;
+    return c & (path_flags_cw | path_flags_ccw);
+}
+inline unsigned set_orientation(unsigned c, unsigned o)
+{
+    c &= ~path_flags_jr;
+    return clear_orientation(c) | o;
+}
+struct point_type : public CFX_Object {
+    FX_FLOAT x, y;
+    unsigned flag;
+    point_type() {}
+    point_type(FX_FLOAT x_, FX_FLOAT y_, unsigned flag_ = 0) : x(x_), y(y_), flag(flag_) {}
+};
+struct point_type_flag : public point_type {
+    unsigned flag;
+    point_type_flag()
+    {
+        flag = 0;
+    }
+    point_type_flag(FX_FLOAT x_, FX_FLOAT y_, unsigned flag_ = 0) : point_type(x_, y_), flag(flag_) {}
+};
+struct vertex_type : public CFX_Object {
+    FX_FLOAT   x, y;
+    unsigned cmd;
+    vertex_type() {}
+    vertex_type(FX_FLOAT x_, FX_FLOAT y_, unsigned cmd_) :
+        x(x_), y(y_), cmd(cmd_) {}
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_clip_liang_barsky.h b/core/src/fxge/agg/agg23/agg_clip_liang_barsky.h
new file mode 100644
index 0000000..cfc4c91
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_clip_liang_barsky.h
@@ -0,0 +1,125 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Liang-Barsky clipping
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_CLIP_LIANG_BARSKY_INCLUDED
+#define AGG_CLIP_LIANG_BARSKY_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+template<class T>
+inline unsigned clipping_flags(T x, T y, const rect_base<T>& clip_box)
+{
+    return  (x > clip_box.x2) |
+            ((y > clip_box.y2) << 1) |
+            ((x < clip_box.x1) << 2) |
+            ((y < clip_box.y1) << 3);
+}
+template<class T>
+inline unsigned clip_liang_barsky(T x1, T y1, T x2, T y2,
+                                  const rect_base<T>& clip_box,
+                                  T* x, T* y)
+{
+    const FX_FLOAT nearzero = 1e-30f;
+    FX_FLOAT deltax = (FX_FLOAT)(x2 - x1);
+    FX_FLOAT deltay = (FX_FLOAT)(y2 - y1);
+    unsigned np = 0;
+    if(deltax == 0) {
+        deltax = (x1 > clip_box.x1) ? -nearzero : nearzero;
+    }
+    FX_FLOAT xin, xout;
+    if(deltax > 0) {
+        xin  = (FX_FLOAT)clip_box.x1;
+        xout = (FX_FLOAT)clip_box.x2;
+    } else {
+        xin  = (FX_FLOAT)clip_box.x2;
+        xout = (FX_FLOAT)clip_box.x1;
+    }
+    FX_FLOAT tinx = FXSYS_Div(xin - x1, deltax);
+    if(deltay == 0) {
+        deltay = (y1 > clip_box.y1) ? -nearzero : nearzero;
+    }
+    FX_FLOAT yin, yout;
+    if(deltay > 0) {
+        yin  = (FX_FLOAT)clip_box.y1;
+        yout = (FX_FLOAT)clip_box.y2;
+    } else {
+        yin  = (FX_FLOAT)clip_box.y2;
+        yout = (FX_FLOAT)clip_box.y1;
+    }
+    FX_FLOAT tiny = FXSYS_Div(yin - y1, deltay);
+    FX_FLOAT tin1, tin2;
+    if (tinx < tiny) {
+        tin1 = tinx;
+        tin2 = tiny;
+    } else {
+        tin1 = tiny;
+        tin2 = tinx;
+    }
+    if(tin1 <= 1.0f) {
+        if(0 < tin1) {
+            *x++ = (T)xin;
+            *y++ = (T)yin;
+            ++np;
+        }
+        if(tin2 <= 1.0f) {
+            FX_FLOAT toutx = FXSYS_Div(xout - x1, deltax);
+            FX_FLOAT touty = FXSYS_Div(yout - y1, deltay);
+            FX_FLOAT tout1 = (toutx < touty) ? toutx : touty;
+            if(tin2 > 0 || tout1 > 0) {
+                if(tin2 <= tout1) {
+                    if(tin2 > 0) {
+                        if(tinx > tiny) {
+                            *x++ = (T)xin;
+                            *y++ = (T)(y1 + FXSYS_Mul(deltay, tinx));
+                        } else {
+                            *x++ = (T)(x1 + FXSYS_Mul(deltax, tiny));
+                            *y++ = (T)yin;
+                        }
+                        ++np;
+                    }
+                    if(tout1 < 1.0f) {
+                        if(toutx < touty) {
+                            *x++ = (T)xout;
+                            *y++ = (T)(y1 + FXSYS_Mul(deltay, toutx));
+                        } else {
+                            *x++ = (T)(x1 + FXSYS_Mul(deltax, touty));
+                            *y++ = (T)yout;
+                        }
+                    } else {
+                        *x++ = x2;
+                        *y++ = y2;
+                    }
+                    ++np;
+                } else {
+                    if(tinx > tiny) {
+                        *x++ = (T)xin;
+                        *y++ = (T)yout;
+                    } else {
+                        *x++ = (T)xout;
+                        *y++ = (T)yin;
+                    }
+                    ++np;
+                }
+            }
+        }
+    }
+    return np;
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_color_gray.h b/core/src/fxge/agg/agg23/agg_color_gray.h
new file mode 100644
index 0000000..5db7bca
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_color_gray.h
@@ -0,0 +1,50 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for high precision colors has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+//
+// color types gray8, gray16
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_COLOR_GRAY_INCLUDED
+#define AGG_COLOR_GRAY_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+struct gray8 {
+    typedef int8u  value_type;
+    typedef int32u calc_type;
+    typedef int32  long_type;
+    enum base_scale_e {
+        base_shift = 8,
+        base_size  = 1 << base_shift,
+        base_mask  = base_size - 1
+    };
+    typedef gray8 self_type;
+    value_type v;
+    value_type a;
+    gray8() {}
+    gray8(unsigned v_, unsigned a_ = base_mask) :
+        v(int8u(v_)), a(int8u(a_)) {}
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_conv_adaptor_vcgen.h b/core/src/fxge/agg/agg23/agg_conv_adaptor_vcgen.h
new file mode 100644
index 0000000..1cf817a
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_conv_adaptor_vcgen.h
@@ -0,0 +1,138 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_CONV_ADAPTOR_VCGEN_INCLUDED
+#define AGG_CONV_ADAPTOR_VCGEN_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+struct null_markers : public CFX_Object {
+    void remove_all() {}
+    void add_vertex(FX_FLOAT, FX_FLOAT, unsigned) {}
+    void prepare_src() {}
+    void rewind(unsigned) {}
+    unsigned vertex(FX_FLOAT*, FX_FLOAT*)
+    {
+        return path_cmd_stop;
+    }
+};
+template<class VertexSource,
+         class Generator,
+         class Markers = null_markers> class conv_adaptor_vcgen : public CFX_Object
+{
+    enum status {
+        initial,
+        accumulate,
+        generate
+    };
+public:
+    conv_adaptor_vcgen(VertexSource& source) :
+        m_source(&source),
+        m_status(initial)
+    {}
+    void set_source(VertexSource& source)
+    {
+        m_source = &source;
+    }
+    Generator& generator()
+    {
+        return m_generator;
+    }
+    const Generator& generator() const
+    {
+        return m_generator;
+    }
+    Markers& markers()
+    {
+        return m_markers;
+    }
+    const Markers& markers() const
+    {
+        return m_markers;
+    }
+    void rewind(unsigned path_id)
+    {
+        m_source->rewind(path_id);
+        m_status = initial;
+    }
+    unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);
+private:
+    conv_adaptor_vcgen(const conv_adaptor_vcgen<VertexSource, Generator, Markers>&);
+    const conv_adaptor_vcgen<VertexSource, Generator, Markers>&
+    operator = (const conv_adaptor_vcgen<VertexSource, Generator, Markers>&);
+    VertexSource* m_source;
+    Generator     m_generator;
+    Markers       m_markers;
+    status        m_status;
+    unsigned      m_last_cmd;
+    FX_FLOAT        m_start_x;
+    FX_FLOAT        m_start_y;
+};
+template<class VertexSource, class Generator, class Markers>
+unsigned conv_adaptor_vcgen<VertexSource, Generator, Markers>::vertex(FX_FLOAT* x, FX_FLOAT* y)
+{
+    unsigned cmd = path_cmd_stop;
+    bool done = false;
+    while(!done) {
+        switch(m_status) {
+            case initial:
+                m_markers.remove_all();
+                m_last_cmd = m_source->vertex(&m_start_x, &m_start_y);
+                m_status = accumulate;
+            case accumulate:
+                if(is_stop(m_last_cmd)) {
+                    return path_cmd_stop;
+                }
+                m_generator.remove_all();
+                m_generator.add_vertex(m_start_x, m_start_y, path_cmd_move_to);
+                m_markers.add_vertex(m_start_x, m_start_y, path_cmd_move_to);
+                for(;;) {
+                    cmd = m_source->vertex(x, y);
+                    if(is_vertex(cmd)) {
+                        m_last_cmd = cmd;
+                        if(is_move_to(cmd)) {
+                            m_start_x = *x;
+                            m_start_y = *y;
+                            break;
+                        }
+                        m_generator.add_vertex(*x, *y, cmd);
+                        m_markers.add_vertex(*x, *y, path_cmd_line_to);
+                    } else {
+                        if(is_stop(cmd)) {
+                            m_last_cmd = path_cmd_stop;
+                            break;
+                        }
+                        if(is_end_poly(cmd)) {
+                            m_generator.add_vertex(*x, *y, cmd);
+                            break;
+                        }
+                    }
+                }
+                m_generator.rewind(0);
+                m_status = generate;
+            case generate:
+                cmd = m_generator.vertex(x, y);
+                if(is_stop(cmd)) {
+                    m_status = accumulate;
+                    break;
+                }
+                done = true;
+                break;
+        }
+    }
+    return cmd;
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_conv_dash.h b/core/src/fxge/agg/agg23/agg_conv_dash.h
new file mode 100644
index 0000000..63b2019
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_conv_dash.h
@@ -0,0 +1,61 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// conv_dash
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_CONV_DASH_INCLUDED
+#define AGG_CONV_DASH_INCLUDED
+#include "agg_basics.h"
+#include "agg_vcgen_dash.h"
+#include "agg_conv_adaptor_vcgen.h"
+namespace agg
+{
+template<class VertexSource, class Markers = null_markers>
+struct conv_dash : public conv_adaptor_vcgen<VertexSource, vcgen_dash, Markers> {
+    typedef Markers marker_type;
+    typedef conv_adaptor_vcgen<VertexSource, vcgen_dash, Markers> base_type;
+    conv_dash(VertexSource& vs) :
+        conv_adaptor_vcgen<VertexSource, vcgen_dash, Markers>(vs)
+    {
+    }
+    void remove_all_dashes()
+    {
+        base_type::generator().remove_all_dashes();
+    }
+    void add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len)
+    {
+        base_type::generator().add_dash(dash_len, gap_len);
+    }
+    void dash_start(FX_FLOAT ds)
+    {
+        base_type::generator().dash_start(ds);
+    }
+    void shorten(FX_FLOAT s)
+    {
+        base_type::generator().shorten(s);
+    }
+    double shorten() const
+    {
+        return base_type::generator().shorten();
+    }
+private:
+    conv_dash(const conv_dash<VertexSource, Markers>&);
+    const conv_dash<VertexSource, Markers>&
+    operator = (const conv_dash<VertexSource, Markers>&);
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_conv_stroke.h b/core/src/fxge/agg/agg23/agg_conv_stroke.h
new file mode 100644
index 0000000..5a36bd7
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_conv_stroke.h
@@ -0,0 +1,110 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// conv_stroke
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_CONV_STROKE_INCLUDED
+#define AGG_CONV_STROKE_INCLUDED
+#include "agg_basics.h"
+#include "agg_vcgen_stroke.h"
+#include "agg_conv_adaptor_vcgen.h"
+namespace agg
+{
+template<class VertexSource, class Markers = null_markers>
+struct conv_stroke :
+        public conv_adaptor_vcgen<VertexSource, vcgen_stroke, Markers> {
+    typedef Markers marker_type;
+    typedef conv_adaptor_vcgen<VertexSource, vcgen_stroke, Markers> base_type;
+    conv_stroke(VertexSource& vs) :
+        conv_adaptor_vcgen<VertexSource, vcgen_stroke, Markers>(vs)
+    {
+    }
+    void line_cap(line_cap_e lc)
+    {
+        base_type::generator().line_cap(lc);
+    }
+    void line_join(line_join_e lj)
+    {
+        base_type::generator().line_join(lj);
+    }
+    void inner_join(inner_join_e ij)
+    {
+        base_type::generator().inner_join(ij);
+    }
+    line_cap_e   line_cap()   const
+    {
+        return base_type::generator().line_cap();
+    }
+    line_join_e  line_join()  const
+    {
+        return base_type::generator().line_join();
+    }
+    inner_join_e inner_join() const
+    {
+        return base_type::generator().inner_join();
+    }
+    void width(FX_FLOAT w)
+    {
+        base_type::generator().width(w);
+    }
+    void miter_limit(FX_FLOAT ml)
+    {
+        base_type::generator().miter_limit(ml);
+    }
+    void miter_limit_theta(FX_FLOAT t)
+    {
+        base_type::generator().miter_limit_theta(t);
+    }
+    void inner_miter_limit(FX_FLOAT ml)
+    {
+        base_type::generator().inner_miter_limit(ml);
+    }
+    void approximation_scale(FX_FLOAT as)
+    {
+        base_type::generator().approximation_scale(as);
+    }
+    FX_FLOAT width() const
+    {
+        return base_type::generator().width();
+    }
+    FX_FLOAT miter_limit() const
+    {
+        return base_type::generator().miter_limit();
+    }
+    FX_FLOAT inner_miter_limit() const
+    {
+        return base_type::generator().inner_miter_limit();
+    }
+    FX_FLOAT approximation_scale() const
+    {
+        return base_type::generator().approximation_scale();
+    }
+    void shorten(FX_FLOAT s)
+    {
+        base_type::generator().shorten(s);
+    }
+    FX_FLOAT shorten() const
+    {
+        return base_type::generator().shorten();
+    }
+private:
+    conv_stroke(const conv_stroke<VertexSource, Markers>&);
+    const conv_stroke<VertexSource, Markers>&
+    operator = (const conv_stroke<VertexSource, Markers>&);
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_curves.h b/core/src/fxge/agg/agg23/agg_curves.h
new file mode 100644
index 0000000..5719cbf
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_curves.h
@@ -0,0 +1,191 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+// Copyright (C) 2005 Tony Juricic (tonygeek@yahoo.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_CURVES_INCLUDED
+#define AGG_CURVES_INCLUDED
+#include "agg_array.h"
+namespace agg
+{
+struct curve4_points : public CFX_Object {
+    FX_FLOAT cp[8];
+    curve4_points() {}
+    curve4_points(FX_FLOAT x1, FX_FLOAT y1,
+                  FX_FLOAT x2, FX_FLOAT y2,
+                  FX_FLOAT x3, FX_FLOAT y3,
+                  FX_FLOAT x4, FX_FLOAT y4)
+    {
+        cp[0] = x1;
+        cp[1] = y1;
+        cp[2] = x2;
+        cp[3] = y2;
+        cp[4] = x3;
+        cp[5] = y3;
+        cp[6] = x4;
+        cp[7] = y4;
+    }
+    void init(FX_FLOAT x1, FX_FLOAT y1,
+              FX_FLOAT x2, FX_FLOAT y2,
+              FX_FLOAT x3, FX_FLOAT y3,
+              FX_FLOAT x4, FX_FLOAT y4)
+    {
+        cp[0] = x1;
+        cp[1] = y1;
+        cp[2] = x2;
+        cp[3] = y2;
+        cp[4] = x3;
+        cp[5] = y3;
+        cp[6] = x4;
+        cp[7] = y4;
+    }
+    FX_FLOAT  operator [] (unsigned i) const
+    {
+        return cp[i];
+    }
+    FX_FLOAT& operator [] (unsigned i)
+    {
+        return cp[i];
+    }
+};
+class curve4_div : public CFX_Object
+{
+public:
+    curve4_div() :
+        m_cusp_limit(0),
+        m_count(0)
+    {}
+    curve4_div(FX_FLOAT x1, FX_FLOAT y1,
+               FX_FLOAT x2, FX_FLOAT y2,
+               FX_FLOAT x3, FX_FLOAT y3,
+               FX_FLOAT x4, FX_FLOAT y4) :
+        m_cusp_limit(0),
+        m_count(0)
+    {
+        init(x1, y1, x2, y2, x3, y3, x4, y4);
+    }
+    curve4_div(const curve4_points& cp) :
+        m_count(0)
+    {
+        init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
+    }
+    void reset()
+    {
+        m_points.remove_all();
+        m_count = 0;
+    }
+    void init(FX_FLOAT x1, FX_FLOAT y1,
+              FX_FLOAT x2, FX_FLOAT y2,
+              FX_FLOAT x3, FX_FLOAT y3,
+              FX_FLOAT x4, FX_FLOAT y4);
+    void init(const curve4_points& cp)
+    {
+        init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
+    }
+    void rewind(unsigned)
+    {
+        m_count = 0;
+    }
+    unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)
+    {
+        if(m_count >= m_points.size()) {
+            return path_cmd_stop;
+        }
+        const point_type& p = m_points[m_count++];
+        *x = p.x;
+        *y = p.y;
+        return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to;
+    }
+    unsigned vertex_flag(FX_FLOAT* x, FX_FLOAT* y, int& flag)
+    {
+        if(m_count >= m_points.size()) {
+            return path_cmd_stop;
+        }
+        const point_type& p = m_points[m_count++];
+        *x = p.x;
+        *y = p.y;
+        flag = p.flag;
+        return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to;
+    }
+    int count()
+    {
+        return m_points.size();
+    }
+private:
+    void bezier(FX_FLOAT x1, FX_FLOAT y1,
+                FX_FLOAT x2, FX_FLOAT y2,
+                FX_FLOAT x3, FX_FLOAT y3,
+                FX_FLOAT x4, FX_FLOAT y4);
+    void recursive_bezier(FX_FLOAT x1, FX_FLOAT y1,
+                          FX_FLOAT x2, FX_FLOAT y2,
+                          FX_FLOAT x3, FX_FLOAT y3,
+                          FX_FLOAT x4, FX_FLOAT y4,
+                          unsigned level);
+    FX_FLOAT    m_distance_tolerance_square;
+    FX_FLOAT    m_distance_tolerance_manhattan;
+    FX_FLOAT    m_cusp_limit;
+    unsigned              m_count;
+    pod_deque<point_type> m_points;
+};
+class curve4 : public CFX_Object
+{
+public:
+    curve4() {}
+    curve4(FX_FLOAT x1, FX_FLOAT y1,
+           FX_FLOAT x2, FX_FLOAT y2,
+           FX_FLOAT x3, FX_FLOAT y3,
+           FX_FLOAT x4, FX_FLOAT y4)
+    {
+        init(x1, y1, x2, y2, x3, y3, x4, y4);
+    }
+    curve4(const curve4_points& cp)
+    {
+        init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
+    }
+    void reset()
+    {
+        m_curve_div.reset();
+    }
+    void init(FX_FLOAT x1, FX_FLOAT y1,
+              FX_FLOAT x2, FX_FLOAT y2,
+              FX_FLOAT x3, FX_FLOAT y3,
+              FX_FLOAT x4, FX_FLOAT y4)
+    {
+        m_curve_div.init(x1, y1, x2, y2, x3, y3, x4, y4);
+    }
+    void init(const curve4_points& cp)
+    {
+        init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
+    }
+    void rewind(unsigned path_id)
+    {
+        m_curve_div.rewind(path_id);
+    }
+    unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)
+    {
+        return m_curve_div.vertex(x, y);
+    }
+    unsigned vertex_curve_flag(FX_FLOAT* x, FX_FLOAT* y, int& flag)
+    {
+        return m_curve_div.vertex_flag(x, y, flag);
+    }
+    int count()
+    {
+        return m_curve_div.count();
+    }
+private:
+    curve4_div m_curve_div;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_math.h b/core/src/fxge/agg/agg23/agg_math.h
new file mode 100644
index 0000000..31e0daf
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_math.h
@@ -0,0 +1,63 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+// Bessel function (besj) was adapted for use in AGG library by Andy Wilk
+// Contact: castor.vulgaris@gmail.com
+//----------------------------------------------------------------------------
+#ifndef AGG_MATH_INCLUDED
+#define AGG_MATH_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+const FX_FLOAT intersection_epsilon = 1.0e-30f;
+AGG_INLINE FX_FLOAT calc_point_location(FX_FLOAT x1, FX_FLOAT y1,
+                                        FX_FLOAT x2, FX_FLOAT y2,
+                                        FX_FLOAT x,  FX_FLOAT y)
+{
+    return FXSYS_Mul(x - x2, y2 - y1) - FXSYS_Mul(y - y2, x2 - x1);
+}
+AGG_INLINE FX_FLOAT calc_distance(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)
+{
+    FX_FLOAT dx = x2 - x1;
+    FX_FLOAT dy = y2 - y1;
+    return FXSYS_sqrt2(dx, dy);
+}
+AGG_INLINE FX_FLOAT calc_line_point_distance(FX_FLOAT x1, FX_FLOAT y1,
+        FX_FLOAT x2, FX_FLOAT y2,
+        FX_FLOAT x,  FX_FLOAT y)
+{
+    FX_FLOAT dx = x2 - x1;
+    FX_FLOAT dy = y2 - y1;
+    FX_FLOAT d = FXSYS_sqrt2(dx, dy);
+    if(d < intersection_epsilon) {
+        return calc_distance(x1, y1, x, y);
+    }
+    return FXSYS_MulDiv(x - x2, dy, d) - FXSYS_MulDiv(y - y2, dx, d);
+}
+AGG_INLINE bool calc_intersection(FX_FLOAT ax, FX_FLOAT ay, FX_FLOAT bx, FX_FLOAT by,
+                                  FX_FLOAT cx, FX_FLOAT cy, FX_FLOAT dx, FX_FLOAT dy,
+                                  FX_FLOAT* x, FX_FLOAT* y)
+{
+    FX_FLOAT num = FXSYS_Mul(ay - cy, dx - cx) - FXSYS_Mul(ax - cx, dy - cy);
+    FX_FLOAT den = FXSYS_Mul(bx - ax, dy - cy) - FXSYS_Mul(by - ay, dx - cx);
+    if (FXSYS_fabs(den) < intersection_epsilon) {
+        return false;
+    }
+    *x = ax + FXSYS_MulDiv(bx - ax, num, den);
+    *y = ay + FXSYS_MulDiv(by - ay, num, den);
+    return true;
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_math_stroke.h b/core/src/fxge/agg/agg23/agg_math_stroke.h
new file mode 100644
index 0000000..620d675
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_math_stroke.h
@@ -0,0 +1,272 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Stroke math
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_STROKE_MATH_INCLUDED
+#define AGG_STROKE_MATH_INCLUDED
+#include "agg_math.h"
+#include "agg_vertex_sequence.h"
+namespace agg
+{
+enum line_cap_e {
+    butt_cap,
+    square_cap,
+    round_cap
+};
+enum line_join_e {
+    miter_join         = 0,
+    miter_join_revert  = 1,
+    miter_join_round   = 4,
+    round_join         = 2,
+    bevel_join         = 3
+};
+enum inner_join_e {
+    inner_bevel,
+    inner_miter,
+    inner_jag,
+    inner_round
+};
+const FX_FLOAT stroke_theta = 1.0f / 1000.0f;
+template<class VertexConsumer>
+void stroke_calc_arc(VertexConsumer& out_vertices,
+                     FX_FLOAT x,   FX_FLOAT y,
+                     FX_FLOAT dx1, FX_FLOAT dy1,
+                     FX_FLOAT dx2, FX_FLOAT dy2,
+                     FX_FLOAT width,
+                     FX_FLOAT approximation_scale)
+{
+    typedef typename VertexConsumer::value_type coord_type;
+    FX_FLOAT a1 = FXSYS_atan2(dy1, dx1);
+    FX_FLOAT a2 = FXSYS_atan2(dy2, dx2);
+    FX_FLOAT da = a1 - a2;
+    bool ccw = da > 0 && da < FX_PI;
+    if(width < 0) {
+        width = -width;
+    }
+    da = FXSYS_acos(FXSYS_Div(width, width + FXSYS_Div(1.0f / 8, approximation_scale))) * 2;
+    out_vertices.add(coord_type(x + dx1, y + dy1));
+    if(!ccw) {
+        if(a1 > a2) {
+            a2 += 2 * FX_PI;
+        }
+        a2 -= da / 4;
+        a1 += da;
+        while(a1 < a2) {
+            out_vertices.add(coord_type(x + FXSYS_Mul(width, FXSYS_cos(a1)),
+                                        y + FXSYS_Mul(width, FXSYS_sin(a1))));
+            a1 += da;
+        }
+    } else {
+        if(a1 < a2) {
+            a2 -= 2 * FX_PI;
+        }
+        a2 += da / 4;
+        a1 -= da;
+        while(a1 > a2) {
+            out_vertices.add(coord_type(x + FXSYS_Mul(width, FXSYS_cos(a1)),
+                                        y + FXSYS_Mul(width, FXSYS_sin(a1))));
+            a1 -= da;
+        }
+    }
+    out_vertices.add(coord_type(x + dx2, y + dy2));
+}
+template<class VertexConsumer>
+void stroke_calc_miter(VertexConsumer& out_vertices,
+                       const vertex_dist& v0,
+                       const vertex_dist& v1,
+                       const vertex_dist& v2,
+                       FX_FLOAT dx1, FX_FLOAT dy1,
+                       FX_FLOAT dx2, FX_FLOAT dy2,
+                       FX_FLOAT width,
+                       line_join_e line_join,
+                       FX_FLOAT miter_limit,
+                       FX_FLOAT approximation_scale)
+{
+    typedef typename VertexConsumer::value_type coord_type;
+    FX_FLOAT xi = v1.x;
+    FX_FLOAT yi = v1.y;
+    bool miter_limit_exceeded = true;
+    if(calc_intersection(v0.x + dx1, v0.y - dy1,
+                         v1.x + dx1, v1.y - dy1,
+                         v1.x + dx2, v1.y - dy2,
+                         v2.x + dx2, v2.y - dy2,
+                         &xi, &yi)) {
+        FX_FLOAT d1 = calc_distance(v1.x, v1.y, xi, yi);
+        FX_FLOAT lim = FXSYS_Mul(width, miter_limit);
+        if(d1 <= lim) {
+            out_vertices.add(coord_type(xi, yi));
+            miter_limit_exceeded = false;
+        }
+    } else {
+        FX_FLOAT x2 = v1.x + dx1;
+        FX_FLOAT y2 = v1.y - dy1;
+        if((FXSYS_Mul(x2 - v0.x, dy1) - FXSYS_Mul(v0.y - y2, dx1) < 0) !=
+                (FXSYS_Mul(x2 - v2.x, dy1) - FXSYS_Mul(v2.y - y2, dx1) < 0)) {
+            out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+            miter_limit_exceeded = false;
+        }
+    }
+    if(miter_limit_exceeded) {
+        switch(line_join) {
+            case miter_join_revert:
+                out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+                out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+                break;
+            case miter_join_round:
+                stroke_calc_arc(out_vertices,
+                                v1.x, v1.y, dx1, -dy1, dx2, -dy2,
+                                width, approximation_scale);
+                break;
+            default:
+                out_vertices.add(coord_type(v1.x + dx1 + FXSYS_Mul(dy1, miter_limit),
+                                            v1.y - dy1 + FXSYS_Mul(dx1, miter_limit)));
+                out_vertices.add(coord_type(v1.x + dx2 - FXSYS_Mul(dy2, miter_limit),
+                                            v1.y - dy2 - FXSYS_Mul(dx2, miter_limit)));
+                break;
+        }
+    }
+}
+template<class VertexConsumer>
+void stroke_calc_cap(VertexConsumer& out_vertices,
+                     const vertex_dist& v0,
+                     const vertex_dist& v1,
+                     FX_FLOAT len,
+                     line_cap_e line_cap,
+                     FX_FLOAT width,
+                     FX_FLOAT approximation_scale)
+{
+    typedef typename VertexConsumer::value_type coord_type;
+    out_vertices.remove_all();
+    FX_FLOAT dx1 = FXSYS_Div(v1.y - v0.y, len);
+    FX_FLOAT dy1 = FXSYS_Div(v1.x - v0.x, len);
+    FX_FLOAT dx2 = 0;
+    FX_FLOAT dy2 = 0;
+    dx1 = FXSYS_Mul(dx1, width);
+    dy1 = FXSYS_Mul(dy1, width);
+    if(line_cap != round_cap) {
+        if(line_cap == square_cap) {
+            dx2 = dy1;
+            dy2 = dx1;
+        }
+        out_vertices.add(coord_type(v0.x - dx1 - dx2, v0.y + dy1 - dy2));
+        out_vertices.add(coord_type(v0.x + dx1 - dx2, v0.y - dy1 - dy2));
+    } else {
+        FX_FLOAT a1 = FXSYS_atan2(dy1, -dx1);
+        FX_FLOAT a2 = a1 + FX_PI;
+        FX_FLOAT da = FXSYS_acos(FXSYS_Div(width, width +
+                                           FXSYS_Div(1.0f / 8, approximation_scale))) * 2;
+        out_vertices.add(coord_type(v0.x - dx1, v0.y + dy1));
+        a1 += da;
+        a2 -= da / 4;
+        while(a1 < a2) {
+            out_vertices.add(coord_type(v0.x + FXSYS_Mul(width, FXSYS_cos(a1)),
+                                        v0.y + FXSYS_Mul(width, FXSYS_sin(a1))));
+            a1 += da;
+        }
+        out_vertices.add(coord_type(v0.x + dx1, v0.y - dy1));
+    }
+}
+template<class VertexConsumer>
+void stroke_calc_join(VertexConsumer& out_vertices,
+                      const vertex_dist& v0,
+                      const vertex_dist& v1,
+                      const vertex_dist& v2,
+                      FX_FLOAT len1,
+                      FX_FLOAT len2,
+                      FX_FLOAT width,
+                      line_join_e line_join,
+                      inner_join_e inner_join,
+                      FX_FLOAT miter_limit,
+                      FX_FLOAT inner_miter_limit,
+                      FX_FLOAT approximation_scale)
+{
+    typedef typename VertexConsumer::value_type coord_type;
+    FX_FLOAT dx1, dy1, dx2, dy2;
+    dx1 = FXSYS_MulDiv(width, v1.y - v0.y, len1);
+    dy1 = FXSYS_MulDiv(width, v1.x - v0.x, len1);
+    dx2 = FXSYS_MulDiv(width, v2.y - v1.y, len2);
+    dy2 = FXSYS_MulDiv(width, v2.x - v1.x, len2);
+    out_vertices.remove_all();
+    if(calc_point_location(v0.x, v0.y, v1.x, v1.y, v2.x, v2.y) > 0) {
+        switch(inner_join) {
+            default:
+                out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+                out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+                break;
+            case inner_miter:
+                stroke_calc_miter(out_vertices,
+                                  v0, v1, v2, dx1, dy1, dx2, dy2,
+                                  width,
+                                  miter_join_revert,
+                                  inner_miter_limit,
+                                  1.0f);
+                break;
+            case inner_jag:
+            case inner_round: {
+                    FX_FLOAT d = (dx1 - dx2) * (dx1 - dx2) + (dy1 - dy2) * (dy1 - dy2);
+                    if(d < len1 * len1 && d < len2 * len2) {
+                        stroke_calc_miter(out_vertices,
+                                          v0, v1, v2, dx1, dy1, dx2, dy2,
+                                          width,
+                                          miter_join_revert,
+                                          inner_miter_limit,
+                                          1.0f);
+                    } else {
+                        if(inner_join == inner_jag) {
+                            out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+                            out_vertices.add(coord_type(v1.x,       v1.y      ));
+                            out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+                        } else {
+                            out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+                            out_vertices.add(coord_type(v1.x,       v1.y      ));
+                            stroke_calc_arc(out_vertices,
+                                            v1.x, v1.y, dx2, -dy2, dx1, -dy1,
+                                            width, approximation_scale);
+                            out_vertices.add(coord_type(v1.x,       v1.y      ));
+                            out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+                        }
+                    }
+                }
+                break;
+        }
+    } else {
+        switch(line_join) {
+            case miter_join:
+            case miter_join_revert:
+            case miter_join_round:
+                stroke_calc_miter(out_vertices,
+                                  v0, v1, v2, dx1, dy1, dx2, dy2,
+                                  width,
+                                  line_join,
+                                  miter_limit,
+                                  approximation_scale);
+                break;
+            case round_join:
+                stroke_calc_arc(out_vertices,
+                                v1.x, v1.y, dx1, -dy1, dx2, -dy2,
+                                width, approximation_scale);
+                break;
+            default:
+                out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+                out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+                break;
+        }
+    }
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_path_storage.h b/core/src/fxge/agg/agg23/agg_path_storage.h
new file mode 100644
index 0000000..64ea0b4
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_path_storage.h
@@ -0,0 +1,172 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_PATH_STORAGE_INCLUDED
+#define AGG_PATH_STORAGE_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+class path_storage : public CFX_Object
+{
+    enum block_scale_e {
+        block_shift = 8,
+        block_size  = 1 << block_shift,
+        block_mask  = block_size - 1,
+        block_pool  = 256
+    };
+public:
+    class vertex_source : public CFX_Object
+    {
+    public:
+        vertex_source() {}
+        vertex_source(const path_storage& p) : m_path(&p), m_vertex_idx(0) {}
+        void rewind(unsigned path_id)
+        {
+            m_vertex_idx = path_id;
+        }
+        unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)
+        {
+            return (m_vertex_idx < m_path->total_vertices()) ?
+                   m_path->vertex(m_vertex_idx++, x, y) :
+                   path_cmd_stop;
+        }
+    private:
+        const path_storage* m_path;
+        unsigned            m_vertex_idx;
+    };
+    ~path_storage();
+    path_storage();
+    unsigned last_vertex(FX_FLOAT* x, FX_FLOAT* y) const;
+    unsigned prev_vertex(FX_FLOAT* x, FX_FLOAT* y) const;
+    void move_to(FX_FLOAT x, FX_FLOAT y);
+    void line_to(FX_FLOAT x, FX_FLOAT y);
+    void curve4(FX_FLOAT x_ctrl1, FX_FLOAT y_ctrl1,
+                FX_FLOAT x_ctrl2, FX_FLOAT y_ctrl2,
+                FX_FLOAT x_to,    FX_FLOAT y_to);
+    template<class VertexSource>
+    void add_path(VertexSource& vs,
+                  unsigned path_id = 0,
+                  bool solid_path = true)
+    {
+        FX_FLOAT x, y;
+        unsigned cmd;
+        vs.rewind(path_id);
+        while(!is_stop(cmd = vs.vertex(&x, &y))) {
+            if(is_move_to(cmd) && solid_path && m_total_vertices) {
+                cmd = path_cmd_line_to;
+            }
+            add_vertex(x, y, cmd);
+        }
+    }
+    template<class VertexSource>
+    void add_path_curve(VertexSource& vs,
+                        unsigned path_id = 0,
+                        bool solid_path = true)
+    {
+        FX_FLOAT x, y;
+        unsigned cmd;
+        int flag;
+        vs.rewind(path_id);
+        while(!is_stop(cmd = vs.vertex_curve_flag(&x, &y, flag))) {
+            if(is_move_to(cmd) && solid_path && m_total_vertices) {
+                cmd = path_cmd_line_to | flag;
+            }
+            add_vertex(x, y, cmd | flag);
+        }
+    }
+    unsigned total_vertices() const
+    {
+        return m_total_vertices;
+    }
+    unsigned vertex(unsigned idx, FX_FLOAT* x, FX_FLOAT* y) const
+    {
+        unsigned nb = idx >> block_shift;
+        const FX_FLOAT* pv = m_coord_blocks[nb] + ((idx & block_mask) << 1);
+        *x = *pv++;
+        *y = *pv;
+        return m_cmd_blocks[nb][idx & block_mask];
+    }
+    unsigned command(unsigned idx) const
+    {
+        return m_cmd_blocks[idx >> block_shift][idx & block_mask];
+    }
+    unsigned getflag(unsigned idx) const
+    {
+        return m_cmd_blocks[idx >> block_shift][idx & block_mask] & path_flags_jr;
+    }
+    void     rewind(unsigned path_id);
+    unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);
+    void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd);
+    void end_poly();
+private:
+    void allocate_block(unsigned nb);
+    unsigned char* storage_ptrs(FX_FLOAT** xy_ptr);
+private:
+    unsigned        m_total_vertices;
+    unsigned        m_total_blocks;
+    unsigned        m_max_blocks;
+    FX_FLOAT**   m_coord_blocks;
+    unsigned char** m_cmd_blocks;
+    unsigned        m_iterator;
+};
+inline unsigned path_storage::vertex(FX_FLOAT* x, FX_FLOAT* y)
+{
+    if(m_iterator >= m_total_vertices) {
+        return path_cmd_stop;
+    }
+    return vertex(m_iterator++, x, y);
+}
+inline unsigned path_storage::prev_vertex(FX_FLOAT* x, FX_FLOAT* y) const
+{
+    if(m_total_vertices > 1) {
+        return vertex(m_total_vertices - 2, x, y);
+    }
+    return path_cmd_stop;
+}
+inline unsigned path_storage::last_vertex(FX_FLOAT* x, FX_FLOAT* y) const
+{
+    if(m_total_vertices) {
+        return vertex(m_total_vertices - 1, x, y);
+    }
+    return path_cmd_stop;
+}
+inline unsigned char* path_storage::storage_ptrs(FX_FLOAT** xy_ptr)
+{
+    unsigned nb = m_total_vertices >> block_shift;
+    if(nb >= m_total_blocks) {
+        allocate_block(nb);
+    }
+    *xy_ptr = m_coord_blocks[nb] + ((m_total_vertices & block_mask) << 1);
+    return m_cmd_blocks[nb] + (m_total_vertices & block_mask);
+}
+inline void path_storage::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)
+{
+    FX_FLOAT* coord_ptr = 0;
+    unsigned char* cmd_ptr = storage_ptrs(&coord_ptr);
+    *cmd_ptr = (unsigned char)cmd;
+    *coord_ptr++ = x;
+    *coord_ptr   = y;
+    m_total_vertices++;
+}
+inline void path_storage::move_to(FX_FLOAT x, FX_FLOAT y)
+{
+    add_vertex(x, y, path_cmd_move_to);
+}
+inline void path_storage::line_to(FX_FLOAT x, FX_FLOAT y)
+{
+    add_vertex(x, y, path_cmd_line_to);
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_pixfmt_gray.h b/core/src/fxge/agg/agg23/agg_pixfmt_gray.h
new file mode 100644
index 0000000..052a2e3
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_pixfmt_gray.h
@@ -0,0 +1,177 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for high precision colors has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_PIXFMT_GRAY_INCLUDED
+#define AGG_PIXFMT_GRAY_INCLUDED
+#include "agg_basics.h"
+#include "agg_color_gray.h"
+#include "agg_rendering_buffer.h"
+namespace agg
+{
+template<class ColorT> struct blender_gray : public CFX_Object {
+    typedef ColorT color_type;
+    typedef typename color_type::value_type value_type;
+    typedef typename color_type::calc_type calc_type;
+    enum base_scale_e { base_shift = color_type::base_shift };
+    static AGG_INLINE void blend_pix(value_type* p, unsigned cv,
+                                     unsigned alpha, unsigned cover = 0)
+    {
+        *p = (value_type)((((cv - calc_type(*p)) * alpha) + (calc_type(*p) << base_shift)) >> base_shift);
+    }
+};
+template<class Blender, unsigned Step = 1, unsigned Offset = 0>
+class pixel_formats_gray : public CFX_Object
+{
+public:
+    typedef rendering_buffer::row_data row_data;
+    typedef rendering_buffer::span_data span_data;
+    typedef typename Blender::color_type color_type;
+    typedef typename color_type::value_type value_type;
+    typedef typename color_type::calc_type calc_type;
+    enum base_scale_e {
+        base_shift = color_type::base_shift,
+        base_size  = color_type::base_size,
+        base_mask  = color_type::base_mask
+    };
+private:
+    static AGG_INLINE void copy_or_blend_pix(value_type* p,
+            const color_type& c,
+            unsigned cover)
+    {
+        if (c.a) {
+            calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
+            if(alpha == base_mask) {
+                *p = c.v;
+            } else {
+                Blender::blend_pix(p, c.v, alpha, cover);
+            }
+        }
+    }
+    static AGG_INLINE void copy_or_blend_pix(value_type* p,
+            const color_type& c)
+    {
+        if (c.a) {
+            if(c.a == base_mask) {
+                *p = c.v;
+            } else {
+                Blender::blend_pix(p, c.v, c.a);
+            }
+        }
+    }
+public:
+    pixel_formats_gray(rendering_buffer& rb) :
+        m_rbuf(&rb)
+    {}
+    AGG_INLINE unsigned width()  const
+    {
+        return m_rbuf->width();
+    }
+    AGG_INLINE unsigned height() const
+    {
+        return m_rbuf->height();
+    }
+    AGG_INLINE color_type pixel(int x, int y) const
+    {
+        value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
+        return color_type(*p);
+    }
+    row_data row(int x, int y) const
+    {
+        return row_data(x,
+                        width() - 1,
+                        m_rbuf->row(y) +
+                        x * Step * sizeof(value_type) +
+                        Offset * sizeof(value_type));
+    }
+    span_data span(int x, int y, unsigned len)
+    {
+        return span_data(x, len,
+                         m_rbuf->row(y) +
+                         x * Step * sizeof(value_type) +
+                         Offset * sizeof(value_type));
+    }
+    AGG_INLINE void copy_pixel(int x, int y, const color_type& c)
+    {
+        *((value_type*)m_rbuf->row(y) + x * Step + Offset) = c.v;
+    }
+    AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover)
+    {
+        copy_or_blend_pix((value_type*)m_rbuf->row(y) + x * Step + Offset, c, cover);
+    }
+    AGG_INLINE void copy_hline(int x, int y,
+                               unsigned len,
+                               const color_type& c)
+    {
+        value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
+        do {
+            *p = c.v;
+            p += Step;
+        } while(--len);
+    }
+    void blend_hline(int x, int y,
+                     unsigned len,
+                     const color_type& c,
+                     int8u cover)
+    {
+        if (c.a) {
+            value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
+            calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
+            if(alpha == base_mask) {
+                do {
+                    *p = c.v;
+                    p += Step;
+                } while(--len);
+            } else {
+                do {
+                    Blender::blend_pix(p, c.v, alpha, cover);
+                    p += Step;
+                } while(--len);
+            }
+        }
+    }
+    void blend_solid_hspan(int x, int y,
+                           unsigned len,
+                           const color_type& c,
+                           const int8u* covers)
+    {
+        if (c.a) {
+            value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
+            do {
+                calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8;
+                if(alpha == base_mask) {
+                    *p = c.v;
+                } else {
+                    Blender::blend_pix(p, c.v, alpha, *covers);
+                }
+                p += Step;
+                ++covers;
+            } while(--len);
+        }
+    }
+private:
+    rendering_buffer* m_rbuf;
+};
+typedef blender_gray<gray8>      blender_gray8;
+typedef pixel_formats_gray<blender_gray8, 1, 0> pixfmt_gray8;
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_rasterizer_scanline_aa.h b/core/src/fxge/agg/agg23/agg_rasterizer_scanline_aa.h
new file mode 100644
index 0000000..e9f0def
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_rasterizer_scanline_aa.h
@@ -0,0 +1,472 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+//
+// The author gratefully acknowleges the support of David Turner,
+// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType
+// libray - in producing this work. See http://www.freetype.org for details.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for 32-bit screen coordinates has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_RASTERIZER_SCANLINE_AA_INCLUDED
+#define AGG_RASTERIZER_SCANLINE_AA_INCLUDED
+#include "../../../../include/fxge/fx_ge.h"
+#include "agg_basics.h"
+#include "agg_math.h"
+#include "agg_array.h"
+#include "agg_clip_liang_barsky.h"
+#include "agg_render_scanlines.h"
+namespace agg
+{
+enum poly_base_scale_e {
+    poly_base_shift = 8,
+    poly_base_size  = 1 << poly_base_shift,
+    poly_base_mask  = poly_base_size - 1
+};
+inline int poly_coord(FX_FLOAT c)
+{
+    return int(c * poly_base_size);
+}
+struct cell_aa : public CFX_Object {
+    int x;
+    int y;
+    int cover;
+    int area;
+    void set(int x, int y, int c, int a);
+    void set_coord(int x, int y);
+    void set_cover(int c, int a);
+    void add_cover(int c, int a);
+};
+class outline_aa : public CFX_Object
+{
+    enum cell_block_scale_e {
+        cell_block_shift = 12,
+        cell_block_size  = 1 << cell_block_shift,
+        cell_block_mask  = cell_block_size - 1,
+        cell_block_pool  = 256,
+        cell_block_limit = 1024
+    };
+    struct sorted_y : public CFX_Object {
+        unsigned start;
+        unsigned num;
+    };
+public:
+    ~outline_aa();
+    outline_aa();
+    void reset();
+    void move_to(int x, int y);
+    void line_to(int x, int y);
+    int min_x() const
+    {
+        return m_min_x;
+    }
+    int min_y() const
+    {
+        return m_min_y;
+    }
+    int max_x() const
+    {
+        return m_max_x;
+    }
+    int max_y() const
+    {
+        return m_max_y;
+    }
+    void sort_cells();
+    unsigned total_cells() const
+    {
+        return m_num_cells;
+    }
+    unsigned scanline_num_cells(unsigned y) const
+    {
+        return m_sorted_y[y - m_min_y].num;
+    }
+    const cell_aa* const* scanline_cells(unsigned y) const
+    {
+        return m_sorted_cells.data() + m_sorted_y[y - m_min_y].start;
+    }
+    bool sorted() const
+    {
+        return m_sorted;
+    }
+private:
+    outline_aa(const outline_aa&);
+    const outline_aa& operator = (const outline_aa&);
+    void set_cur_cell(int x, int y);
+    void add_cur_cell();
+    void render_hline(int ey, int x1, int y1, int x2, int y2);
+    void render_line(int x1, int y1, int x2, int y2);
+    void allocate_block();
+private:
+    unsigned  m_num_blocks;
+    unsigned  m_max_blocks;
+    unsigned  m_cur_block;
+    unsigned  m_num_cells;
+    cell_aa** m_cells;
+    cell_aa*  m_cur_cell_ptr;
+    pod_array<cell_aa*> m_sorted_cells;
+    pod_array<sorted_y> m_sorted_y;
+    cell_aa   m_cur_cell;
+    int       m_cur_x;
+    int       m_cur_y;
+    int       m_min_x;
+    int       m_min_y;
+    int       m_max_x;
+    int       m_max_y;
+    bool      m_sorted;
+};
+class scanline_hit_test : public CFX_Object
+{
+public:
+    scanline_hit_test(int x) : m_x(x), m_hit(false) {}
+    void reset_spans() {}
+    void finalize(int) {}
+    void add_cell(int x, int)
+    {
+        if(m_x == x) {
+            m_hit = true;
+        }
+    }
+    void add_span(int x, int len, int)
+    {
+        if(m_x >= x && m_x < x + len) {
+            m_hit = true;
+        }
+    }
+    unsigned num_spans() const
+    {
+        return 1;
+    }
+    bool hit() const
+    {
+        return m_hit;
+    }
+private:
+    int  m_x;
+    bool m_hit;
+};
+enum filling_rule_e {
+    fill_non_zero,
+    fill_even_odd
+};
+class rasterizer_scanline_aa : public CFX_Object
+{
+    enum status {
+        status_initial,
+        status_line_to,
+        status_closed
+    };
+public:
+    enum aa_scale_e {
+        aa_num   = 1 << 8,
+        aa_mask  = aa_num - 1,
+        aa_2num  = aa_num * 2,
+        aa_2mask = aa_2num - 1
+    };
+    rasterizer_scanline_aa() :
+        m_filling_rule(fill_non_zero),
+        m_clipped_start_x(0),
+        m_clipped_start_y(0),
+        m_status(status_initial),
+        m_clipping(false)
+    {
+    }
+    ~rasterizer_scanline_aa() {}
+    void filling_rule(filling_rule_e filling_rule)
+    {
+        m_filling_rule = filling_rule;
+    }
+    int min_x() const
+    {
+        return m_outline.min_x();
+    }
+    int min_y() const
+    {
+        return m_outline.min_y();
+    }
+    int max_x() const
+    {
+        return m_outline.max_x();
+    }
+    int max_y() const
+    {
+        return m_outline.max_y();
+    }
+    void reset()
+    {
+        m_outline.reset();
+        m_status = status_initial;
+    }
+    void clip_box(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)
+    {
+        m_clip_box = rect(poly_coord(x1), poly_coord(y1),
+                          poly_coord(x2), poly_coord(y2));
+        m_clip_box.normalize();
+        m_clipping = true;
+    }
+    void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)
+    {
+        if(is_close(cmd)) {
+            close_polygon();
+        } else {
+            if(is_move_to(cmd)) {
+                move_to(poly_coord(x), poly_coord(y));
+            } else {
+                if(is_vertex(cmd)) {
+                    line_to(poly_coord(x), poly_coord(y));
+                }
+            }
+        }
+    }
+    void move_to(int x, int y)
+    {
+        if(m_clipping) {
+            if(m_outline.sorted()) {
+                reset();
+            }
+            if(m_status == status_line_to) {
+                close_polygon();
+            }
+            m_prev_x = m_start_x = x;
+            m_prev_y = m_start_y = y;
+            m_status = status_initial;
+            m_prev_flags = clipping_flags(x, y, m_clip_box);
+            if(m_prev_flags == 0) {
+                move_to_no_clip(x, y);
+            }
+        } else {
+            move_to_no_clip(x, y);
+        }
+    }
+    void line_to(int x, int y)
+    {
+        if(m_clipping) {
+            clip_segment(x, y);
+        } else {
+            line_to_no_clip(x, y);
+        }
+    }
+    void close_polygon()
+    {
+        if (m_status != status_line_to) {
+            return;
+        }
+        if(m_clipping) {
+            clip_segment(m_start_x, m_start_y);
+        }
+        close_polygon_no_clip();
+    }
+    AGG_INLINE unsigned calculate_alpha(int area, bool no_smooth) const
+    {
+        int cover = area >> (poly_base_shift * 2 + 1 - 8);
+        if(cover < 0) {
+            cover = -cover;
+        }
+        if(m_filling_rule == fill_even_odd) {
+            cover &= aa_2mask;
+            if(cover > aa_num) {
+                cover = aa_2num - cover;
+            }
+        }
+        if (no_smooth) {
+            cover = cover > aa_mask / 2 ? aa_mask : 0;
+        }
+        if(cover > aa_mask) {
+            cover = aa_mask;
+        }
+        return cover;
+    }
+    AGG_INLINE void sort()
+    {
+        m_outline.sort_cells();
+    }
+    AGG_INLINE bool rewind_scanlines()
+    {
+        close_polygon();
+        m_outline.sort_cells();
+        if(m_outline.total_cells() == 0) {
+            return false;
+        }
+        m_cur_y = m_outline.min_y();
+        return true;
+    }
+    AGG_INLINE bool navigate_scanline(int y)
+    {
+        close_polygon();
+        m_outline.sort_cells();
+        if(m_outline.total_cells() == 0 ||
+                y < m_outline.min_y() ||
+                y > m_outline.max_y()) {
+            return false;
+        }
+        m_cur_y = y;
+        return true;
+    }
+    template<class Scanline> bool sweep_scanline(Scanline& sl, bool no_smooth)
+    {
+        for(;;) {
+            if(m_cur_y > m_outline.max_y()) {
+                return false;
+            }
+            sl.reset_spans();
+            unsigned num_cells = m_outline.scanline_num_cells(m_cur_y);
+            const cell_aa* const* cells = m_outline.scanline_cells(m_cur_y);
+            int cover = 0;
+            while(num_cells) {
+                const cell_aa* cur_cell = *cells;
+                int x    = cur_cell->x;
+                int area = cur_cell->area;
+                unsigned alpha;
+                cover += cur_cell->cover;
+                while(--num_cells) {
+                    cur_cell = *++cells;
+                    if(cur_cell->x != x) {
+                        break;
+                    }
+                    area  += cur_cell->area;
+                    cover += cur_cell->cover;
+                }
+                if(area) {
+                    alpha = calculate_alpha((cover << (poly_base_shift + 1)) - area, no_smooth);
+                    if(alpha) {
+                        sl.add_cell(x, alpha);
+                    }
+                    x++;
+                }
+                if(num_cells && cur_cell->x > x) {
+                    alpha = calculate_alpha(cover << (poly_base_shift + 1), no_smooth);
+                    if(alpha) {
+                        sl.add_span(x, cur_cell->x - x, alpha);
+                    }
+                }
+            }
+            if(sl.num_spans()) {
+                break;
+            }
+            ++m_cur_y;
+        }
+        sl.finalize(m_cur_y);
+        ++m_cur_y;
+        return true;
+    }
+    template<class VertexSource>
+    void add_path(VertexSource& vs, unsigned path_id = 0)
+    {
+        FX_FLOAT x;
+        FX_FLOAT y;
+        unsigned cmd;
+        vs.rewind(path_id);
+        while(!is_stop(cmd = vs.vertex(&x, &y))) {
+            add_vertex(x, y, cmd);
+        }
+    }
+    template<class VertexSource>
+    void add_path_transformed(VertexSource& vs, const CFX_AffineMatrix* pMatrix, unsigned path_id = 0)
+    {
+        FX_FLOAT x;
+        FX_FLOAT y;
+        unsigned cmd;
+        vs.rewind(path_id);
+        while(!is_stop(cmd = vs.vertex(&x, &y))) {
+            if (pMatrix) {
+                pMatrix->Transform(x, y);
+            }
+            add_vertex(x, y, cmd);
+        }
+    }
+private:
+    rasterizer_scanline_aa(const rasterizer_scanline_aa&);
+    const rasterizer_scanline_aa&
+    operator = (const rasterizer_scanline_aa&);
+    void move_to_no_clip(int x, int y)
+    {
+        if(m_status == status_line_to) {
+            close_polygon_no_clip();
+        }
+        m_outline.move_to(x * 1, y);
+        m_clipped_start_x = x;
+        m_clipped_start_y = y;
+        m_status = status_line_to;
+    }
+    void line_to_no_clip(int x, int y)
+    {
+        if(m_status != status_initial) {
+            m_outline.line_to(x * 1, y);
+            m_status = status_line_to;
+        }
+    }
+    void close_polygon_no_clip()
+    {
+        if(m_status == status_line_to) {
+            m_outline.line_to(m_clipped_start_x * 1, m_clipped_start_y);
+            m_status = status_closed;
+        }
+    }
+    void clip_segment(int x, int y)
+    {
+        unsigned flags = clipping_flags(x, y, m_clip_box);
+        if(m_prev_flags == flags) {
+            if(flags == 0) {
+                if(m_status == status_initial) {
+                    move_to_no_clip(x, y);
+                } else {
+                    line_to_no_clip(x, y);
+                }
+            }
+        } else {
+            int cx[4];
+            int cy[4];
+            unsigned n = clip_liang_barsky(m_prev_x, m_prev_y,
+                                           x, y,
+                                           m_clip_box,
+                                           cx, cy);
+            const int* px = cx;
+            const int* py = cy;
+            while(n--) {
+                if(m_status == status_initial) {
+                    move_to_no_clip(*px++, *py++);
+                } else {
+                    line_to_no_clip(*px++, *py++);
+                }
+            }
+        }
+        m_prev_flags = flags;
+        m_prev_x = x;
+        m_prev_y = y;
+    }
+private:
+    outline_aa     m_outline;
+    filling_rule_e m_filling_rule;
+    int            m_clipped_start_x;
+    int            m_clipped_start_y;
+    int            m_start_x;
+    int            m_start_y;
+    int            m_prev_x;
+    int            m_prev_y;
+    unsigned       m_prev_flags;
+    unsigned       m_status;
+    rect           m_clip_box;
+    bool           m_clipping;
+    int            m_cur_y;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_render_scanlines.h b/core/src/fxge/agg/agg23/agg_render_scanlines.h
new file mode 100644
index 0000000..0dfd6d2
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_render_scanlines.h
@@ -0,0 +1,50 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_RENDER_SCANLINES_INCLUDED
+#define AGG_RENDER_SCANLINES_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+template<class Rasterizer, class Scanline, class Renderer>
+void render_scanlines(Rasterizer& ras, Scanline& sl, Renderer& ren, bool no_smooth)
+{
+    if(ras.rewind_scanlines()) {
+        sl.reset(ras.min_x(), ras.max_x());
+        ren.prepare(unsigned(ras.max_x() - ras.min_x() + 2));
+        while(ras.sweep_scanline(sl, no_smooth)) {
+            ren.render(sl);
+        }
+    }
+}
+template<class Rasterizer, class Scanline, class Renderer,
+         class VertexSource, class ColorStorage, class PathId>
+void render_all_paths(Rasterizer& ras,
+                      Scanline& sl,
+                      Renderer& r,
+                      VertexSource& vs,
+                      const ColorStorage& as,
+                      const PathId& path_id,
+                      unsigned num_paths)
+{
+    for(unsigned i = 0; i < num_paths; i++) {
+        ras.reset();
+        ras.add_path(vs, path_id[i]);
+        r.color(as[i]);
+        render_scanlines(ras, sl, r);
+    }
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_renderer_base.h b/core/src/fxge/agg/agg23/agg_renderer_base.h
new file mode 100644
index 0000000..3e20a6d
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_renderer_base.h
@@ -0,0 +1,163 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// class renderer_base
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_RENDERER_BASE_INCLUDED
+#define AGG_RENDERER_BASE_INCLUDED
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+namespace agg
+{
+template<class PixelFormat> class renderer_base : public CFX_Object
+{
+public:
+    typedef PixelFormat pixfmt_type;
+    typedef typename pixfmt_type::color_type color_type;
+    typedef typename pixfmt_type::row_data row_data;
+    typedef typename pixfmt_type::span_data span_data;
+    renderer_base() : m_ren(0), m_clip_box(1, 1, 0, 0) {}
+    renderer_base(pixfmt_type& ren) :
+        m_ren(&ren),
+        m_clip_box(0, 0, ren.width() - 1, ren.height() - 1)
+    {}
+    void attach(pixfmt_type& ren)
+    {
+        m_ren = &ren;
+        m_clip_box = rect(0, 0, ren.width() - 1, ren.height() - 1);
+    }
+    const pixfmt_type& ren() const
+    {
+        return *m_ren;
+    }
+    pixfmt_type& ren()
+    {
+        return *m_ren;
+    }
+    unsigned width()  const
+    {
+        return m_ren->width();
+    }
+    unsigned height() const
+    {
+        return m_ren->height();
+    }
+    void first_clip_box() {}
+    bool next_clip_box()
+    {
+        return false;
+    }
+    const rect& clip_box() const
+    {
+        return m_clip_box;
+    }
+    int         xmin()     const
+    {
+        return m_clip_box.x1;
+    }
+    int         ymin()     const
+    {
+        return m_clip_box.y1;
+    }
+    int         xmax()     const
+    {
+        return m_clip_box.x2;
+    }
+    int         ymax()     const
+    {
+        return m_clip_box.y2;
+    }
+    const rect& bounding_clip_box() const
+    {
+        return m_clip_box;
+    }
+    int         bounding_xmin()     const
+    {
+        return m_clip_box.x1;
+    }
+    int         bounding_ymin()     const
+    {
+        return m_clip_box.y1;
+    }
+    int         bounding_xmax()     const
+    {
+        return m_clip_box.x2;
+    }
+    int         bounding_ymax()     const
+    {
+        return m_clip_box.y2;
+    }
+    void blend_hline(int x1, int y, int x2,
+                     const color_type& c, cover_type cover)
+    {
+        if(x1 > x2) {
+            int t = x2;
+            x2 = x1;
+            x1 = t;
+        }
+        if(y  > ymax()) {
+            return;
+        }
+        if(y  < ymin()) {
+            return;
+        }
+        if(x1 > xmax()) {
+            return;
+        }
+        if(x2 < xmin()) {
+            return;
+        }
+        if(x1 < xmin()) {
+            x1 = xmin();
+        }
+        if(x2 > xmax()) {
+            x2 = xmax();
+        }
+        m_ren->blend_hline(x1, y, x2 - x1 + 1, c, cover);
+    }
+    void blend_solid_hspan(int x, int y, int len,
+                           const color_type& c,
+                           const cover_type* covers)
+    {
+        if(y > ymax()) {
+            return;
+        }
+        if(y < ymin()) {
+            return;
+        }
+        if(x < xmin()) {
+            len -= xmin() - x;
+            if(len <= 0) {
+                return;
+            }
+            covers += xmin() - x;
+            x = xmin();
+        }
+        if(x + len > xmax()) {
+            len = xmax() - x + 1;
+            if(len <= 0) {
+                return;
+            }
+        }
+        m_ren->blend_solid_hspan(x, y, len, c, covers);
+    }
+private:
+    pixfmt_type* m_ren;
+    rect         m_clip_box;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_renderer_scanline.h b/core/src/fxge/agg/agg23/agg_renderer_scanline.h
new file mode 100644
index 0000000..b02b6b5
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_renderer_scanline.h
@@ -0,0 +1,93 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_RENDERER_SCANLINE_INCLUDED
+#define AGG_RENDERER_SCANLINE_INCLUDED
+#include "agg_basics.h"
+#include "agg_renderer_base.h"
+#include "agg_render_scanlines.h"
+namespace agg
+{
+template<class BaseRenderer, class SpanGenerator> class renderer_scanline_aa : public CFX_Object
+{
+public:
+    typedef BaseRenderer  base_ren_type;
+    typedef SpanGenerator span_gen_type;
+    renderer_scanline_aa() : m_ren(0), m_span_gen(0) {}
+    renderer_scanline_aa(base_ren_type& ren, span_gen_type& span_gen) :
+        m_ren(&ren),
+        m_span_gen(&span_gen)
+    {}
+    void attach(base_ren_type& ren, span_gen_type& span_gen)
+    {
+        m_ren = &ren;
+        m_span_gen = &span_gen;
+    }
+    void prepare(unsigned max_span_len)
+    {
+        m_span_gen->prepare(max_span_len);
+    }
+    template<class Scanline> void render(const Scanline& sl)
+    {
+        int y = sl.y();
+        m_ren->first_clip_box();
+        do {
+            int xmin = m_ren->xmin();
+            int xmax = m_ren->xmax();
+            if(y >= m_ren->ymin() && y <= m_ren->ymax()) {
+                unsigned num_spans = sl.num_spans();
+                typename Scanline::const_iterator span = sl.begin();
+                for(;;) {
+                    int x = span->x;
+                    int len = span->len;
+                    bool solid = false;
+                    const typename Scanline::cover_type* covers = span->covers;
+                    if(len < 0) {
+                        solid = true;
+                        len = -len;
+                    }
+                    if(x < xmin) {
+                        len -= xmin - x;
+                        if(!solid) {
+                            covers += xmin - x;
+                        }
+                        x = xmin;
+                    }
+                    if(len > 0) {
+                        if(x + len > xmax) {
+                            len = xmax - x + 1;
+                        }
+                        if(len > 0) {
+                            m_ren->blend_color_hspan_no_clip(
+                                x, y, len,
+                                m_span_gen->generate(x, y, len),
+                                solid ? 0 : covers,
+                                *covers);
+                        }
+                    }
+                    if(--num_spans == 0) {
+                        break;
+                    }
+                    ++span;
+                }
+            }
+        } while(m_ren->next_clip_box());
+    }
+private:
+    base_ren_type* m_ren;
+    SpanGenerator* m_span_gen;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_rendering_buffer.h b/core/src/fxge/agg/agg23/agg_rendering_buffer.h
new file mode 100644
index 0000000..5a8681b
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_rendering_buffer.h
@@ -0,0 +1,145 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// class rendering_buffer
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_RENDERING_BUFFER_INCLUDED
+#define AGG_RENDERING_BUFFER_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+class rendering_buffer : public CFX_Object
+{
+public:
+    struct row_data : public CFX_Object {
+        int x1, x2;
+        const int8u* ptr;
+        row_data() {}
+        row_data(int x1_, int x2_, const int8u* ptr_) :
+            x1(x1_), x2(x2_), ptr(ptr_) {}
+    };
+    struct span_data : public CFX_Object {
+        int x;
+        unsigned len;
+        int8u* ptr;
+        span_data() {}
+        span_data(int) : x(0), len(0), ptr(0) {}
+        span_data(int x_, unsigned len_, int8u* ptr_) :
+            x(x_), len(len_), ptr(ptr_) {}
+    };
+    ~rendering_buffer()
+    {
+        FX_Free(m_rows);
+    }
+    rendering_buffer() :
+        m_buf(0),
+        m_rows(0),
+        m_width(0),
+        m_height(0),
+        m_stride(0),
+        m_max_height(0)
+    {
+    }
+    rendering_buffer(int8u* buf, unsigned width, unsigned height, int stride) :
+        m_buf(0),
+        m_rows(0),
+        m_width(0),
+        m_height(0),
+        m_stride(0),
+        m_max_height(0)
+    {
+        attach(buf, width, height, stride);
+    }
+    void attach(int8u* buf, unsigned width, unsigned height, int stride)
+    {
+        m_buf = buf;
+        m_width = width;
+        m_height = height;
+        m_stride = stride;
+        if(height > m_max_height) {
+            FX_Free(m_rows);
+            m_rows = FX_Alloc(int8u*, m_max_height = height);
+        }
+        int8u* row_ptr = m_buf;
+        if(stride < 0) {
+            row_ptr = m_buf - int(height - 1) * stride;
+        }
+        int8u** rows = m_rows;
+        while(height--) {
+            *rows++ = row_ptr;
+            row_ptr += stride;
+        }
+    }
+    int8u* buf()
+    {
+        return m_buf;
+    }
+    const int8u* buf()    const
+    {
+        return m_buf;
+    }
+    unsigned width()  const
+    {
+        return m_width;
+    }
+    unsigned height() const
+    {
+        return m_height;
+    }
+    int      stride() const
+    {
+        return m_stride;
+    }
+    unsigned stride_abs() const
+    {
+        return (m_stride < 0) ?
+               unsigned(-m_stride) :
+               unsigned(m_stride);
+    }
+    int8u* row(unsigned y)
+    {
+        return m_rows[y];
+    }
+    const int8u* row(unsigned y) const
+    {
+        return m_rows[y];
+    }
+    int8u* next_row(void* p)
+    {
+        return (int8u*)p + m_stride;
+    }
+    const int8u* next_row(const void* p) const
+    {
+        return (int8u*)p + m_stride;
+    }
+    int8u const* const* rows() const
+    {
+        return m_rows;
+    }
+private:
+    rendering_buffer(const rendering_buffer&);
+    const rendering_buffer& operator = (const rendering_buffer&);
+private:
+    int8u*       m_buf;
+    int8u**      m_rows;
+    unsigned m_width;
+    unsigned m_height;
+    int      m_stride;
+    unsigned m_max_height;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_scanline_u.h b/core/src/fxge/agg/agg23/agg_scanline_u.h
new file mode 100644
index 0000000..f99feef
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_scanline_u.h
@@ -0,0 +1,150 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_SCANLINE_U_INCLUDED
+#define AGG_SCANLINE_U_INCLUDED
+#include "agg_array.h"
+namespace agg
+{
+template<class CoverT> class scanline_u : public CFX_Object
+{
+public:
+    typedef scanline_u<CoverT> self_type;
+    typedef CoverT cover_type;
+    typedef int16  coord_type;
+    struct span : public CFX_Object {
+        coord_type  x;
+        coord_type  len;
+        cover_type* covers;
+    };
+    typedef span* iterator;
+    typedef const span* const_iterator;
+    ~scanline_u()
+    {
+        FX_Free(m_spans);
+        FX_Free(m_covers);
+    }
+    scanline_u() :
+        m_min_x(0),
+        m_max_len(0),
+        m_last_x(0x7FFFFFF0),
+        m_covers(0),
+        m_spans(0),
+        m_cur_span(0)
+    {}
+    void reset(int min_x, int max_x)
+    {
+        unsigned max_len = max_x - min_x + 2;
+        if(max_len > m_max_len) {
+            FX_Free(m_spans);
+            FX_Free(m_covers);
+            m_covers  = FX_Alloc( cover_type , max_len);
+            m_spans   = FX_Alloc( span       , max_len);
+            m_max_len = max_len;
+        }
+        m_last_x        = 0x7FFFFFF0;
+        m_min_x         = min_x;
+        m_cur_span      = m_spans;
+    }
+    void add_cell(int x, unsigned cover)
+    {
+        x -= m_min_x;
+        m_covers[x] = (cover_type)cover;
+        if(x == m_last_x + 1) {
+            m_cur_span->len++;
+        } else {
+            m_cur_span++;
+            m_cur_span->x      = (coord_type)(x + m_min_x);
+            m_cur_span->len    = 1;
+            m_cur_span->covers = m_covers + x;
+        }
+        m_last_x = x;
+    }
+    void add_cells(int x, unsigned len, const CoverT* covers)
+    {
+        x -= m_min_x;
+        FXSYS_memcpy(m_covers + x, covers, len * sizeof(CoverT));
+        if(x == m_last_x + 1) {
+            m_cur_span->len += (coord_type)len;
+        } else {
+            m_cur_span++;
+            m_cur_span->x      = (coord_type)(x + m_min_x);
+            m_cur_span->len    = (coord_type)len;
+            m_cur_span->covers = m_covers + x;
+        }
+        m_last_x = x + len - 1;
+    }
+    void add_span(int x, unsigned len, unsigned cover)
+    {
+        x -= m_min_x;
+        FXSYS_memset8(m_covers + x, cover, len);
+        if(x == m_last_x + 1) {
+            m_cur_span->len += (coord_type)len;
+        } else {
+            m_cur_span++;
+            m_cur_span->x      = (coord_type)(x + m_min_x);
+            m_cur_span->len    = (coord_type)len;
+            m_cur_span->covers = m_covers + x;
+        }
+        m_last_x = x + len - 1;
+    }
+    void finalize(int y)
+    {
+        m_y = y;
+    }
+    void reset_spans()
+    {
+        m_last_x    = 0x7FFFFFF0;
+        m_cur_span  = m_spans;
+    }
+    int      y()           const
+    {
+        return m_y;
+    }
+    unsigned num_spans()   const
+    {
+        return unsigned(m_cur_span - m_spans);
+    }
+    const_iterator begin() const
+    {
+        return m_spans + 1;
+    }
+    iterator       begin()
+    {
+        return m_spans + 1;
+    }
+private:
+    scanline_u(const self_type&);
+    const self_type& operator = (const self_type&);
+private:
+    int           m_min_x;
+    unsigned      m_max_len;
+    int           m_last_x;
+    int           m_y;
+    cover_type*   m_covers;
+    span*         m_spans;
+    span*         m_cur_span;
+};
+typedef scanline_u<int8u> scanline_u8;
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_shorten_path.h b/core/src/fxge/agg/agg23/agg_shorten_path.h
new file mode 100644
index 0000000..d7eb4be
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_shorten_path.h
@@ -0,0 +1,57 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_SHORTEN_PATH_INCLUDED
+#define AGG_SHORTEN_PATH_INCLUDED
+#include "agg_basics.h"
+#include "agg_vertex_sequence.h"
+namespace agg
+{
+template<class VertexSequence>
+void shorten_path(VertexSequence& vs, FX_FLOAT s, unsigned closed = 0)
+{
+    typedef typename VertexSequence::value_type vertex_type;
+    if(s > 0 && vs.size() > 1) {
+        FX_FLOAT d;
+        int n = int(vs.size() - 2);
+        while(n) {
+            d = vs[n].dist;
+            if(d > s) {
+                break;
+            }
+            vs.remove_last();
+            s -= d;
+            --n;
+        }
+        if(vs.size() < 2) {
+            vs.remove_all();
+        } else {
+            n = vs.size() - 1;
+            vertex_type& prev = vs[n - 1];
+            vertex_type& last = vs[n];
+            d = (prev.dist - s) / prev.dist;
+            FX_FLOAT x = prev.x + (last.x - prev.x) * d;
+            FX_FLOAT y = prev.y + (last.y - prev.y) * d;
+            last.x = x;
+            last.y = y;
+            if(!prev(last)) {
+                vs.remove_last();
+            }
+            vs.close(closed != 0);
+        }
+    }
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_vcgen_dash.h b/core/src/fxge/agg/agg23/agg_vcgen_dash.h
new file mode 100644
index 0000000..961da2d
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_vcgen_dash.h
@@ -0,0 +1,75 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Line dash generator
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_VCGEN_DASH_INCLUDED
+#define AGG_VCGEN_DASH_INCLUDED
+#include "agg_basics.h"
+#include "agg_vertex_sequence.h"
+namespace agg
+{
+class vcgen_dash : public CFX_Object
+{
+    enum max_dashes_e {
+        max_dashes = 32
+    };
+    enum status_e {
+        initial,
+        ready,
+        polyline,
+        stop
+    };
+public:
+    typedef vertex_sequence<vertex_dist, 6> vertex_storage;
+    vcgen_dash();
+    void remove_all_dashes();
+    void add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len);
+    void dash_start(FX_FLOAT ds);
+    void shorten(FX_FLOAT s)
+    {
+        m_shorten = s;
+    }
+    double shorten() const
+    {
+        return m_shorten;
+    }
+    void remove_all();
+    void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd);
+    void     rewind(unsigned path_id);
+    unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);
+private:
+    vcgen_dash(const vcgen_dash&);
+    const vcgen_dash& operator = (const vcgen_dash&);
+    void calc_dash_start(FX_FLOAT ds);
+    FX_FLOAT     m_dashes[max_dashes];
+    FX_FLOAT		m_total_dash_len;
+    unsigned        m_num_dashes;
+    FX_FLOAT     m_dash_start;
+    FX_FLOAT     m_shorten;
+    FX_FLOAT     m_curr_dash_start;
+    unsigned        m_curr_dash;
+    FX_FLOAT     m_curr_rest;
+    const vertex_dist* m_v1;
+    const vertex_dist* m_v2;
+    vertex_storage m_src_vertices;
+    unsigned       m_closed;
+    status_e       m_status;
+    unsigned       m_src_vertex;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_vcgen_stroke.h b/core/src/fxge/agg/agg23/agg_vcgen_stroke.h
new file mode 100644
index 0000000..38fe1fc
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_vcgen_stroke.h
@@ -0,0 +1,120 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_VCGEN_STROKE_INCLUDED
+#define AGG_VCGEN_STROKE_INCLUDED
+#include "agg_math_stroke.h"
+namespace agg
+{
+class vcgen_stroke : public CFX_Object
+{
+    enum status_e {
+        initial,
+        ready,
+        cap1,
+        cap2,
+        outline1,
+        close_first,
+        outline2,
+        out_vertices,
+        end_poly1,
+        end_poly2,
+        stop
+    };
+public:
+    typedef vertex_sequence<vertex_dist_cmd, 6> vertex_storage;
+    typedef pod_deque<point_type, 6>        coord_storage;
+    vcgen_stroke();
+    void line_cap(line_cap_e lc)
+    {
+        m_line_cap = lc;
+    }
+    void line_join(line_join_e lj)
+    {
+        m_line_join = lj;
+    }
+    void inner_join(inner_join_e ij)
+    {
+        m_inner_join = ij;
+    }
+    line_cap_e   line_cap()   const
+    {
+        return m_line_cap;
+    }
+    line_join_e  line_join()  const
+    {
+        return m_line_join;
+    }
+    inner_join_e inner_join() const
+    {
+        return m_inner_join;
+    }
+    void width(FX_FLOAT w)
+    {
+        m_width = w / 2;
+    }
+    void miter_limit(FX_FLOAT ml)
+    {
+        m_miter_limit = ml;
+    }
+    void miter_limit_theta(FX_FLOAT t);
+    void inner_miter_limit(FX_FLOAT ml)
+    {
+        m_inner_miter_limit = ml;
+    }
+    void approximation_scale(FX_FLOAT as)
+    {
+        m_approx_scale = as;
+    }
+    FX_FLOAT width() const
+    {
+        return m_width * 2;
+    }
+    FX_FLOAT miter_limit() const
+    {
+        return m_miter_limit;
+    }
+    FX_FLOAT inner_miter_limit() const
+    {
+        return m_inner_miter_limit;
+    }
+    FX_FLOAT approximation_scale() const
+    {
+        return m_approx_scale;
+    }
+    void remove_all();
+    void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd);
+    void     rewind(unsigned path_id);
+    unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);
+private:
+    vcgen_stroke(const vcgen_stroke&);
+    const vcgen_stroke& operator = (const vcgen_stroke&);
+    vertex_storage m_src_vertices;
+    coord_storage  m_out_vertices;
+    FX_FLOAT         m_width;
+    FX_FLOAT         m_miter_limit;
+    FX_FLOAT         m_inner_miter_limit;
+    FX_FLOAT         m_approx_scale;
+    line_cap_e     m_line_cap;
+    line_join_e    m_line_join;
+    inner_join_e   m_inner_join;
+    unsigned       m_closed;
+    status_e       m_status;
+    status_e       m_prev_status;
+    unsigned       m_src_vertex;
+    unsigned       m_out_vertex;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_vertex_sequence.h b/core/src/fxge/agg/agg23/agg_vertex_sequence.h
new file mode 100644
index 0000000..29486d4
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_vertex_sequence.h
@@ -0,0 +1,100 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// vertex_sequence container and vertex_dist struct
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_VERTEX_SEQUENCE_INCLUDED
+#define AGG_VERTEX_SEQUENCE_INCLUDED
+#include "agg_basics.h"
+#include "agg_array.h"
+#include "agg_math.h"
+namespace agg
+{
+template<class T, unsigned S = 6>
+class vertex_sequence : public pod_deque<T, S>
+{
+public:
+    typedef pod_deque<T, S> base_type;
+    void add(const T& val);
+    void modify_last(const T& val);
+    void close(bool remove_flag);
+};
+template<class T, unsigned S>
+void vertex_sequence<T, S>::add(const T& val)
+{
+    if(base_type::size() > 1) {
+        if(!(*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) {
+            base_type::remove_last();
+        }
+    }
+    base_type::add(val);
+}
+template<class T, unsigned S>
+void vertex_sequence<T, S>::modify_last(const T& val)
+{
+    base_type::remove_last();
+    add(val);
+}
+template<class T, unsigned S>
+void vertex_sequence<T, S>::close(bool closed)
+{
+    while(base_type::size() > 1) {
+        if((*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) {
+            break;
+        }
+        T t = (*this)[base_type::size() - 1];
+        base_type::remove_last();
+        modify_last(t);
+    }
+    if(closed) {
+        while(base_type::size() > 1) {
+            if((*this)[base_type::size() - 1]((*this)[0])) {
+                break;
+            }
+            base_type::remove_last();
+        }
+    }
+}
+const FX_FLOAT vertex_dist_epsilon = 1e-14f;
+struct vertex_dist : public CFX_Object {
+    FX_FLOAT   x;
+    FX_FLOAT   y;
+    FX_FLOAT   dist;
+    vertex_dist() {}
+    vertex_dist(FX_FLOAT x_, FX_FLOAT y_) :
+        x(x_),
+        y(y_),
+        dist(0)
+    {
+    }
+    bool operator () (const vertex_dist& val)
+    {
+        bool ret = (dist = calc_distance(x, y, val.x, val.y)) > vertex_dist_epsilon;
+        return ret;
+    }
+};
+struct vertex_dist_cmd : public vertex_dist {
+    unsigned cmd;
+    vertex_dist_cmd() {}
+    vertex_dist_cmd(FX_FLOAT x_, FX_FLOAT y_, unsigned cmd_) :
+        vertex_dist(x_, y_),
+        cmd(cmd_)
+    {
+    }
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/fx_agg_curves.cpp b/core/src/fxge/agg/agg23/fx_agg_curves.cpp
new file mode 100644
index 0000000..861320e
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_curves.cpp
@@ -0,0 +1,109 @@
+
+//----------------------------------------------------------------------------
+// XYQ: 2006-01-22 Copied from AGG project.
+// TODO: This file uses intensive floating point operations, so it's NOT suitable
+// for platforms like Symbian OS. We need to change to FIX format.
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_basic.h"
+#include "agg_curves.h"
+#include "agg_math.h"
+namespace agg
+{
+const FX_FLOAT curve_collinearity_epsilon              = 1e-30f;
+enum curve_recursion_limit_e { curve_recursion_limit = 16 };
+void curve4_div::init(FX_FLOAT x1, FX_FLOAT y1,
+                      FX_FLOAT x2, FX_FLOAT y2,
+                      FX_FLOAT x3, FX_FLOAT y3,
+                      FX_FLOAT x4, FX_FLOAT y4)
+{
+    m_points.remove_all();
+    m_distance_tolerance_square = 1.0f / 4;
+    m_distance_tolerance_manhattan = 1.0f * 4;
+    bezier(x1, y1, x2, y2, x3, y3, x4, y4);
+    m_count = 0;
+}
+void curve4_div::recursive_bezier(FX_FLOAT x1, FX_FLOAT y1,
+                                  FX_FLOAT x2, FX_FLOAT y2,
+                                  FX_FLOAT x3, FX_FLOAT y3,
+                                  FX_FLOAT x4, FX_FLOAT y4,
+                                  unsigned level)
+{
+    if(level > curve_recursion_limit) {
+        return;
+    }
+    FX_FLOAT x12   = (x1 + x2) / 2;
+    FX_FLOAT y12   = (y1 + y2) / 2;
+    FX_FLOAT x23   = (x2 + x3) / 2;
+    FX_FLOAT y23   = (y2 + y3) / 2;
+    FX_FLOAT x34   = (x3 + x4) / 2;
+    FX_FLOAT y34   = (y3 + y4) / 2;
+    FX_FLOAT x123  = (x12 + x23) / 2;
+    FX_FLOAT y123  = (y12 + y23) / 2;
+    FX_FLOAT x234  = (x23 + x34) / 2;
+    FX_FLOAT y234  = (y23 + y34) / 2;
+    FX_FLOAT x1234 = (x123 + x234) / 2;
+    FX_FLOAT y1234 = (y123 + y234) / 2;
+    FX_FLOAT dx = x4 - x1;
+    FX_FLOAT dy = y4 - y1;
+    FX_FLOAT d2 = FXSYS_fabs(FXSYS_Mul(x2 - x4, dy) - FXSYS_Mul(y2 - y4, dx));
+    FX_FLOAT d3 = FXSYS_fabs(FXSYS_Mul(x3 - x4, dy) - FXSYS_Mul(y3 - y4, dx));
+    switch((int(d2 > curve_collinearity_epsilon) << 1) +
+            int(d3 > curve_collinearity_epsilon)) {
+        case 0:
+            if(FXSYS_fabs(x1 + x3 - x2 - x2) +
+                    FXSYS_fabs(y1 + y3 - y2 - y2) +
+                    FXSYS_fabs(x2 + x4 - x3 - x3) +
+                    FXSYS_fabs(y2 + y4 - y3 - y3) <= m_distance_tolerance_manhattan) {
+                m_points.add(point_type(x1234, y1234, path_flags_jr));
+                return;
+            }
+            break;
+        case 1:
+            if(FXSYS_Mul(d3, d3) <= FXSYS_Mul(m_distance_tolerance_square,
+                                              FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy))) {
+                m_points.add(point_type(x23, y23, path_flags_jr));
+                return;
+            }
+            break;
+        case 2:
+            if(FXSYS_Mul(d2, d2) <= FXSYS_Mul(m_distance_tolerance_square,
+                                              FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy))) {
+                m_points.add(point_type(x23, y23, path_flags_jr));
+                return;
+            }
+            break;
+        case 3:
+            if(FXSYS_Mul(d2 + d3, d2 + d3) <= FXSYS_Mul(m_distance_tolerance_square,
+                    FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy))) {
+                m_points.add(point_type(x23, y23, path_flags_jr));
+                return;
+            }
+            break;
+    }
+    recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1);
+    recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1);
+}
+void curve4_div::bezier(FX_FLOAT x1, FX_FLOAT y1,
+                        FX_FLOAT x2, FX_FLOAT y2,
+                        FX_FLOAT x3, FX_FLOAT y3,
+                        FX_FLOAT x4, FX_FLOAT y4)
+{
+    m_points.add(point_type(x1, y1));
+    recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0);
+    m_points.add(point_type(x4, y4));
+}
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_driver.cpp b/core/src/fxge/agg/agg23/fx_agg_driver.cpp
new file mode 100644
index 0000000..557f134
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_driver.cpp
@@ -0,0 +1,1636 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../../include/fxge/fx_ge.h"
+#include "../../dib/dib_int.h"
+#include "../../ge/text_int.h"
+#include "../../../../include/fxcodec/fx_codec.h"
+#include "agg_pixfmt_gray.h"
+#include "agg_path_storage.h"
+#include "agg_scanline_u.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_renderer_scanline.h"
+#include "agg_curves.h"
+#include "agg_conv_stroke.h"
+#include "agg_conv_dash.h"
+using namespace agg;
+#include "../include/fx_agg_driver.h"
+void _HardClip(FX_FLOAT& x, FX_FLOAT& y)
+{
+    if (x > 50000) {
+        x = 50000;
+    }
+    if (x < -50000) {
+        x = -50000;
+    }
+    if (y > 50000) {
+        y = 50000;
+    }
+    if (y < -50000) {
+        y = -50000;
+    }
+}
+void CAgg_PathData::BuildPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device)
+{
+    int nPoints = pPathData->GetPointCount();
+    FX_PATHPOINT* pPoints = pPathData->GetPoints();
+    for (int i = 0; i < nPoints; i ++) {
+        FX_FLOAT x = pPoints[i].m_PointX, y = pPoints[i].m_PointY;
+        if (pObject2Device) {
+            pObject2Device->Transform(x, y);
+        }
+        _HardClip(x, y);
+        int point_type = pPoints[i].m_Flag & FXPT_TYPE;
+        if (point_type == FXPT_MOVETO) {
+            m_PathData.move_to(x, y);
+        } else if (point_type == FXPT_LINETO) {
+            if (pPoints[i - 1].m_Flag == FXPT_MOVETO && (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) &&
+                    pPoints[i].m_PointX == pPoints[i - 1].m_PointX && pPoints[i].m_PointY == pPoints[i - 1].m_PointY) {
+                x += 1;
+            }
+            m_PathData.line_to(x, y);
+        } else if (point_type == FXPT_BEZIERTO) {
+            FX_FLOAT x0 = pPoints[i - 1].m_PointX, y0 = pPoints[i - 1].m_PointY;
+            FX_FLOAT x2 = pPoints[i + 1].m_PointX, y2 = pPoints[i + 1].m_PointY;
+            FX_FLOAT x3 = pPoints[i + 2].m_PointX, y3 = pPoints[i + 2].m_PointY;
+            if (pObject2Device) {
+                pObject2Device->Transform(x0, y0);
+                pObject2Device->Transform(x2, y2);
+                pObject2Device->Transform(x3, y3);
+            }
+            curve4 curve(x0, y0, x, y, x2, y2, x3, y3);
+            i += 2;
+            m_PathData.add_path_curve(curve);
+        }
+        if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) {
+            m_PathData.end_poly();
+        }
+    }
+}
+namespace agg
+{
+template<class BaseRenderer> class renderer_scanline_aa_offset
+{
+public:
+    typedef BaseRenderer base_ren_type;
+    typedef typename base_ren_type::color_type color_type;
+    renderer_scanline_aa_offset(base_ren_type& ren, unsigned left, unsigned top) :
+        m_ren(&ren), m_left(left), m_top(top)
+    {}
+    void color(const color_type& c)
+    {
+        m_color = c;
+    }
+    const color_type& color() const
+    {
+        return m_color;
+    }
+    void prepare(unsigned) {}
+    template<class Scanline> void render(const Scanline& sl)
+    {
+        int y = sl.y();
+        unsigned num_spans = sl.num_spans();
+        typename Scanline::const_iterator span = sl.begin();
+        for(;;) {
+            int x = span->x;
+            if(span->len > 0) {
+                m_ren->blend_solid_hspan(x - m_left, y - m_top, (unsigned)span->len,
+                                         m_color,
+                                         span->covers);
+            } else {
+                m_ren->blend_hline(x - m_left, y - m_top, (unsigned)(x - span->len - 1),
+                                   m_color,
+                                   *(span->covers));
+            }
+            if(--num_spans == 0) {
+                break;
+            }
+            ++span;
+        }
+    }
+private:
+    base_ren_type* m_ren;
+    color_type m_color;
+    unsigned m_left, m_top;
+};
+}
+static void RasterizeStroke(rasterizer_scanline_aa& rasterizer, path_storage& path_data,
+                            const CFX_AffineMatrix* pObject2Device,
+                            const CFX_GraphStateData* pGraphState, FX_FLOAT scale = 1.0f,
+                            FX_BOOL bStrokeAdjust = FALSE, FX_BOOL bTextMode = FALSE)
+{
+    line_cap_e cap;
+    switch (pGraphState->m_LineCap) {
+        case CFX_GraphStateData::LineCapRound:
+            cap = round_cap;
+            break;
+        case CFX_GraphStateData::LineCapSquare:
+            cap = square_cap;
+            break;
+        default:
+            cap = butt_cap;
+            break;
+    }
+    line_join_e join;
+    switch (pGraphState->m_LineJoin) {
+        case CFX_GraphStateData::LineJoinRound:
+            join = round_join;
+            break;
+        case CFX_GraphStateData::LineJoinBevel:
+            join = bevel_join;
+            break;
+        default:
+            join = miter_join_revert;
+            break;
+    }
+    FX_FLOAT width = pGraphState->m_LineWidth * scale;
+    FX_FLOAT unit = 1.f;
+    if (pObject2Device) {
+        unit = FXSYS_Div(1.0f, (pObject2Device->GetXUnit() + pObject2Device->GetYUnit()) / 2);
+    }
+    if (width < unit) {
+        width = unit;
+    }
+    if (pGraphState->m_DashArray == NULL) {
+        conv_stroke<path_storage> stroke(path_data);
+        stroke.line_join(join);
+        stroke.line_cap(cap);
+        stroke.miter_limit(pGraphState->m_MiterLimit);
+        stroke.width(width);
+        rasterizer.add_path_transformed(stroke, pObject2Device);
+    } else {
+        typedef conv_dash<path_storage> dash_converter;
+        dash_converter dash(path_data);
+        for (int i = 0; i < (pGraphState->m_DashCount + 1) / 2; i ++) {
+            FX_FLOAT on = pGraphState->m_DashArray[i * 2];
+            if (on <= 0.000001f) {
+                on = 1.0f / 10;
+            }
+            FX_FLOAT off = i * 2 + 1 == pGraphState->m_DashCount ? on :
+                           pGraphState->m_DashArray[i * 2 + 1];
+            if (off < 0) {
+                off = 0;
+            }
+            dash.add_dash(on * scale, off * scale);
+        }
+        dash.dash_start(pGraphState->m_DashPhase * scale);
+        typedef conv_stroke<dash_converter> dash_stroke;
+        dash_stroke stroke(dash);
+        stroke.line_join(join);
+        stroke.line_cap(cap);
+        stroke.miter_limit(pGraphState->m_MiterLimit);
+        stroke.width(width);
+        rasterizer.add_path_transformed(stroke, pObject2Device);
+    }
+}
+IFX_RenderDeviceDriver* IFX_RenderDeviceDriver::CreateFxgeDriver(CFX_DIBitmap* pBitmap, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)
+{
+    return FX_NEW CFX_AggDeviceDriver(pBitmap, 0, bRgbByteOrder, pOriDevice, bGroupKnockout);
+}
+CFX_AggDeviceDriver::CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)
+{
+    m_pBitmap = pBitmap;
+    m_DitherBits = dither_bits;
+    m_pClipRgn = NULL;
+    m_pPlatformBitmap = NULL;
+    m_pPlatformGraphics = NULL;
+    m_pDwRenderTartget = NULL;
+    m_bRgbByteOrder = bRgbByteOrder;
+    m_pOriDevice = pOriDevice;
+    m_bGroupKnockout = bGroupKnockout;
+    m_FillFlags = 0;
+    InitPlatform();
+}
+CFX_AggDeviceDriver::~CFX_AggDeviceDriver()
+{
+    if (m_pClipRgn) {
+        delete m_pClipRgn;
+    }
+    for (int i = 0; i < m_StateStack.GetSize(); i ++)
+        if (m_StateStack[i]) {
+            delete (CFX_ClipRgn*)m_StateStack[i];
+        }
+    DestroyPlatform();
+}
+#if ((_FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+void CFX_AggDeviceDriver::InitPlatform()
+{
+}
+void CFX_AggDeviceDriver::DestroyPlatform()
+{
+}
+FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+        CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+        int alpha_flag, void* pIccTransform)
+{
+    return FALSE;
+}
+#endif
+int CFX_AggDeviceDriver::GetDeviceCaps(int caps_id)
+{
+    switch (caps_id) {
+        case FXDC_DEVICE_CLASS:
+            return FXDC_DISPLAY;
+        case FXDC_PIXEL_WIDTH:
+            return m_pBitmap->GetWidth();
+        case FXDC_PIXEL_HEIGHT:
+            return m_pBitmap->GetHeight();
+        case FXDC_BITS_PIXEL:
+            return m_pBitmap->GetBPP();
+        case FXDC_HORZ_SIZE:
+        case FXDC_VERT_SIZE:
+            return 0;
+        case FXDC_RENDER_CAPS: {
+                int flags = FXRC_GET_BITS | FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE | FXRC_BLEND_MODE | FXRC_SOFT_CLIP;
+                if (m_pBitmap->HasAlpha()) {
+                    flags |= FXRC_ALPHA_OUTPUT;
+                } else if (m_pBitmap->IsAlphaMask()) {
+                    if (m_pBitmap->GetBPP() == 1) {
+                        flags |= FXRC_BITMASK_OUTPUT;
+                    } else {
+                        flags |= FXRC_BYTEMASK_OUTPUT;
+                    }
+                }
+                if (m_pBitmap->IsCmykImage()) {
+                    flags |= FXRC_CMYK_OUTPUT;
+                }
+                return flags;
+            }
+        case FXDC_DITHER_BITS:
+            return m_DitherBits;
+    }
+    return 0;
+}
+void CFX_AggDeviceDriver::SaveState()
+{
+    void* pClip = NULL;
+    if (m_pClipRgn) {
+        pClip = FX_NEW CFX_ClipRgn(*m_pClipRgn);
+        if (!pClip) {
+            return;
+        }
+    }
+    m_StateStack.Add(pClip);
+}
+void CFX_AggDeviceDriver::RestoreState(FX_BOOL bKeepSaved)
+{
+    if (m_StateStack.GetSize() == 0) {
+        if (m_pClipRgn) {
+            delete m_pClipRgn;
+            m_pClipRgn = NULL;
+        }
+        return;
+    }
+    CFX_ClipRgn* pSavedClip = (CFX_ClipRgn*)m_StateStack[m_StateStack.GetSize() - 1];
+    if (m_pClipRgn) {
+        delete m_pClipRgn;
+        m_pClipRgn = NULL;
+    }
+    if (bKeepSaved) {
+        if (pSavedClip) {
+            m_pClipRgn = FX_NEW CFX_ClipRgn(*pSavedClip);
+        }
+    } else {
+        m_StateStack.RemoveAt(m_StateStack.GetSize() - 1);
+        m_pClipRgn = pSavedClip;
+    }
+}
+void CFX_AggDeviceDriver::SetClipMask(rasterizer_scanline_aa& rasterizer)
+{
+    FX_RECT path_rect(rasterizer.min_x(), rasterizer.min_y(),
+                      rasterizer.max_x() + 1, rasterizer.max_y() + 1);
+    path_rect.Intersect(m_pClipRgn->GetBox());
+    CFX_DIBitmapRef mask;
+    CFX_DIBitmap* pThisLayer = mask.New();
+    if (!pThisLayer) {
+        return;
+    }
+    pThisLayer->Create(path_rect.Width(), path_rect.Height(), FXDIB_8bppMask);
+    pThisLayer->Clear(0);
+    rendering_buffer raw_buf(pThisLayer->GetBuffer(), pThisLayer->GetWidth(), pThisLayer->GetHeight(), pThisLayer->GetPitch());
+    pixfmt_gray8 pixel_buf(raw_buf);
+    renderer_base<pixfmt_gray8> base_buf(pixel_buf);
+    renderer_scanline_aa_offset<renderer_base<pixfmt_gray8> > final_render(base_buf, path_rect.left, path_rect.top);
+    final_render.color(gray8(255));
+    scanline_u8 scanline;
+    render_scanlines(rasterizer, scanline, final_render, (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0);
+    m_pClipRgn->IntersectMaskF(path_rect.left, path_rect.top, mask);
+}
+FX_BOOL CFX_AggDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData,
+        const CFX_AffineMatrix* pObject2Device,
+        int fill_mode
+                                             )
+{
+    m_FillFlags = fill_mode;
+    if (m_pClipRgn == NULL) {
+        m_pClipRgn = FX_NEW CFX_ClipRgn(GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));
+        if (!m_pClipRgn) {
+            return FALSE;
+        }
+    }
+    if (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) {
+        CFX_FloatRect rectf;
+        if (pPathData->IsRect(pObject2Device, &rectf)) {
+            rectf.Intersect(CFX_FloatRect(0, 0, (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+            FX_RECT rect = rectf.GetOutterRect();
+            m_pClipRgn->IntersectRect(rect);
+            return TRUE;
+        }
+    }
+    CAgg_PathData path_data;
+    path_data.BuildPath(pPathData, pObject2Device);
+    path_data.m_PathData.end_poly();
+    rasterizer_scanline_aa rasterizer;
+    rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+    rasterizer.add_path(path_data.m_PathData);
+    rasterizer.filling_rule((fill_mode & 3) == FXFILL_WINDING ? fill_non_zero : fill_even_odd);
+    SetClipMask(rasterizer);
+    return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::SetClip_PathStroke(const CFX_PathData* pPathData,
+        const CFX_AffineMatrix* pObject2Device,
+        const CFX_GraphStateData* pGraphState
+                                               )
+{
+    if (m_pClipRgn == NULL) {
+        m_pClipRgn = FX_NEW CFX_ClipRgn(GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));
+        if (!m_pClipRgn) {
+            return FALSE;
+        }
+    }
+    CAgg_PathData path_data;
+    path_data.BuildPath(pPathData, NULL);
+    rasterizer_scanline_aa rasterizer;
+    rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+    RasterizeStroke(rasterizer, path_data.m_PathData, pObject2Device, pGraphState);
+    rasterizer.filling_rule(fill_non_zero);
+    SetClipMask(rasterizer);
+    return TRUE;
+}
+class CFX_Renderer : public CFX_Object
+{
+private:
+    int			m_Alpha,
+                m_Red,
+                m_Green,
+                m_Blue,
+                m_Gray;
+    FX_DWORD	m_Color;
+    FX_BOOL		m_bFullCover;
+    FX_BOOL     m_bRgbByteOrder;
+    CFX_DIBitmap* m_pOriDevice;
+    FX_RECT		m_ClipBox;
+    const CFX_DIBitmap*	m_pClipMask;
+    CFX_DIBitmap*	m_pDevice;
+    const CFX_ClipRgn* m_pClipRgn;
+    void (CFX_Renderer::*composite_span)(FX_LPBYTE, int, int, int, FX_LPBYTE, int, int, FX_LPBYTE, FX_LPBYTE);
+public:
+    void prepare(unsigned) {}
+    void CompositeSpan(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan, int Bpp, FX_BOOL bDestAlpha,
+                       int span_left, int span_len, FX_LPBYTE cover_scan,
+                       int clip_left, int clip_right, FX_LPBYTE clip_scan)
+    {
+        ASSERT(!m_pDevice->IsCmykImage());
+        int col_start = span_left < clip_left ? clip_left - span_left : 0;
+        int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+        if (Bpp) {
+            dest_scan += col_start * Bpp;
+            ori_scan += col_start * Bpp;
+        } else {
+            dest_scan += col_start / 8;
+            ori_scan += col_start / 8;
+        }
+        if (m_bRgbByteOrder) {
+            if (Bpp == 4 && bDestAlpha) {
+                for (int col = col_start; col < col_end; col ++) {
+                    int src_alpha;
+                    if (clip_scan) {
+                        src_alpha = m_Alpha * clip_scan[col] / 255;
+                    } else {
+                        src_alpha = m_Alpha;
+                    }
+                    FX_BYTE dest_alpha = ori_scan[3] + src_alpha - ori_scan[3] * src_alpha / 255;
+                    dest_scan[3] = dest_alpha;
+                    int alpha_ratio = src_alpha * 255 / dest_alpha;
+                    if (m_bFullCover) {
+                        *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, alpha_ratio);
+                        *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, alpha_ratio);
+                        *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, alpha_ratio);
+                        dest_scan++;
+                        ori_scan++;
+                    } else {
+                        int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, alpha_ratio);
+                        int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, alpha_ratio);
+                        int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, alpha_ratio);
+                        ori_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, r, cover_scan[col]);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]);
+                        dest_scan += 2;
+                    }
+                }
+                return;
+            } else if (Bpp == 3 || Bpp == 4) {
+                for (int col = col_start; col < col_end; col ++) {
+                    int src_alpha;
+                    if (clip_scan) {
+                        src_alpha = m_Alpha * clip_scan[col] / 255 ;
+                    } else {
+                        src_alpha = m_Alpha;
+                    }
+                    int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha);
+                    int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);
+                    int b = FXDIB_ALPHA_MERGE(*ori_scan, m_Blue, src_alpha);
+                    ori_scan += Bpp - 2;
+                    *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, r, cover_scan[col]);
+                    dest_scan ++;
+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]);
+                    dest_scan ++;
+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]);
+                    dest_scan += Bpp - 2;
+                }
+            }
+            return;
+        }
+        if (Bpp == 4 && bDestAlpha) {
+            for (int col = col_start; col < col_end; col ++) {
+                int src_alpha;
+                if (clip_scan) {
+                    src_alpha = m_Alpha * clip_scan[col] / 255;
+                } else {
+                    src_alpha = m_Alpha;
+                }
+                int src_alpha_covered = src_alpha * cover_scan[col] / 255;
+                if (src_alpha_covered == 0) {
+                    dest_scan += 4;
+                    continue;
+                }
+                if (cover_scan[col] == 255) {
+                    dest_scan[3] = src_alpha_covered;
+                    *dest_scan ++ = m_Blue;
+                    *dest_scan ++ = m_Green;
+                    *dest_scan = m_Red;
+                    dest_scan += 2;
+                    continue;
+                } else {
+                    if (dest_scan[3] == 0) {
+                        dest_scan[3] = src_alpha_covered;
+                        *dest_scan ++ = m_Blue;
+                        *dest_scan ++ = m_Green;
+                        *dest_scan = m_Red;
+                        dest_scan += 2;
+                        continue;
+                    }
+                    FX_BYTE cover = cover_scan[col];
+                    dest_scan[3] = FXDIB_ALPHA_MERGE(dest_scan[3], src_alpha, cover);
+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, cover);
+                    dest_scan ++;
+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, cover);
+                    dest_scan ++;
+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, cover);
+                    dest_scan += 2;
+                }
+            }
+            return;
+        } else if (Bpp == 3 || Bpp == 4) {
+            for (int col = col_start; col < col_end; col ++) {
+                int src_alpha;
+                if (clip_scan) {
+                    src_alpha = m_Alpha * clip_scan[col] / 255;
+                } else {
+                    src_alpha = m_Alpha;
+                }
+                if (m_bFullCover) {
+                    *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);
+                    *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);
+                    *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);
+                    dest_scan += Bpp - 2;
+                    ori_scan += Bpp - 2;
+                    continue;
+                }
+                int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);
+                int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);
+                int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);
+                ori_scan += Bpp - 2;
+                *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_scan[col]);
+                dest_scan ++;
+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]);
+                dest_scan ++;
+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan[col]);
+                dest_scan += Bpp - 2;
+                continue;
+            }
+            return;
+        } else if (Bpp == 1) {
+            for (int col = col_start; col < col_end; col ++) {
+                int src_alpha;
+                if (clip_scan) {
+                    src_alpha = m_Alpha * clip_scan[col] / 255;
+                } else {
+                    src_alpha = m_Alpha;
+                }
+                if (m_bFullCover) {
+                    *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);
+                } else {
+                    int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);
+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan[col]);
+                    dest_scan++;
+                }
+            }
+        } else {
+            int index = 0;
+            if (m_pDevice->GetPalette() == NULL) {
+                index = ((FX_BYTE)m_Color == 0xff) ? 1 : 0;
+            } else {
+                for (int i = 0; i < 2; i ++)
+                    if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) {
+                        index = i;
+                    }
+            }
+            FX_LPBYTE dest_scan1 = dest_scan;
+            for (int col = col_start; col < col_end; col ++) {
+                int src_alpha;
+                if (clip_scan) {
+                    src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+                } else {
+                    src_alpha = m_Alpha * cover_scan[col] / 255;
+                }
+                if (src_alpha) {
+                    if (!index) {
+                        *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8));
+                    } else {
+                        *dest_scan1 |= 1 << (7 - (col + span_left) % 8);
+                    }
+                }
+                dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8;
+            }
+        }
+    }
+    void CompositeSpan1bpp(FX_LPBYTE dest_scan, int Bpp,
+                           int span_left, int span_len, FX_LPBYTE cover_scan,
+                           int clip_left, int clip_right, FX_LPBYTE clip_scan,
+                           FX_LPBYTE dest_extra_alpha_scan)
+    {
+        ASSERT(!m_bRgbByteOrder);
+        ASSERT(!m_pDevice->IsCmykImage());
+        int col_start = span_left < clip_left ? clip_left - span_left : 0;
+        int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+        dest_scan += col_start / 8;
+        int index = 0;
+        if (m_pDevice->GetPalette() == NULL) {
+            index = ((FX_BYTE)m_Color == 0xff) ? 1 : 0;
+        } else {
+            for (int i = 0; i < 2; i ++)
+                if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) {
+                    index = i;
+                }
+        }
+        FX_LPBYTE dest_scan1 = dest_scan;
+        for (int col = col_start; col < col_end; col ++) {
+            int src_alpha;
+            if (clip_scan) {
+                src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+            } else {
+                src_alpha = m_Alpha * cover_scan[col] / 255;
+            }
+            if (src_alpha) {
+                if (!index) {
+                    *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8));
+                } else {
+                    *dest_scan1 |= 1 << (7 - (col + span_left) % 8);
+                }
+            }
+            dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8;
+        }
+    }
+    void CompositeSpanGray(FX_LPBYTE dest_scan, int Bpp,
+                           int span_left, int span_len, FX_LPBYTE cover_scan,
+                           int clip_left, int clip_right, FX_LPBYTE clip_scan,
+                           FX_LPBYTE dest_extra_alpha_scan)
+    {
+        ASSERT(!m_bRgbByteOrder);
+        int col_start = span_left < clip_left ? clip_left - span_left : 0;
+        int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+        dest_scan += col_start;
+        Bpp;
+        if (dest_extra_alpha_scan) {
+            for (int col = col_start; col < col_end; col ++) {
+                int src_alpha;
+                if (m_bFullCover) {
+                    if (clip_scan) {
+                        src_alpha = m_Alpha * clip_scan[col] / 255;
+                    } else {
+                        src_alpha = m_Alpha;
+                    }
+                } else {
+                    if (clip_scan) {
+                        src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+                    } else {
+                        src_alpha = m_Alpha * cover_scan[col] / 255;
+                    }
+                }
+                if (src_alpha) {
+                    if (src_alpha == 255) {
+                        *dest_scan = m_Gray;
+                        *dest_extra_alpha_scan = m_Alpha;
+                    } else {
+                        FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha -
+                                             (*dest_extra_alpha_scan) * src_alpha / 255;
+                        *dest_extra_alpha_scan++ = dest_alpha;
+                        int alpha_ratio = src_alpha * 255 / dest_alpha;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio);
+                        dest_scan ++;
+                        continue;
+                    }
+                }
+                dest_extra_alpha_scan ++;
+                dest_scan ++;
+            }
+        } else {
+            for (int col = col_start; col < col_end; col ++) {
+                int src_alpha;
+                if (clip_scan) {
+                    src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+                } else {
+                    src_alpha = m_Alpha * cover_scan[col] / 255;
+                }
+                if (src_alpha) {
+                    if (src_alpha == 255) {
+                        *dest_scan = m_Gray;
+                    } else {
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha);
+                    }
+                }
+                dest_scan ++;
+            }
+        }
+    }
+    void CompositeSpanARGB(FX_LPBYTE dest_scan, int Bpp,
+                           int span_left, int span_len, FX_LPBYTE cover_scan,
+                           int clip_left, int clip_right, FX_LPBYTE clip_scan,
+                           FX_LPBYTE dest_extra_alpha_scan)
+    {
+        int col_start = span_left < clip_left ? clip_left - span_left : 0;
+        int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+        dest_scan += col_start * Bpp;
+        if (m_bRgbByteOrder) {
+            for (int col = col_start; col < col_end; col ++) {
+                int src_alpha;
+                if (m_bFullCover) {
+                    if (clip_scan) {
+                        src_alpha = m_Alpha * clip_scan[col] / 255;
+                    } else {
+                        src_alpha = m_Alpha;
+                    }
+                } else {
+                    if (clip_scan) {
+                        src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+                    } else {
+                        src_alpha = m_Alpha * cover_scan[col] / 255;
+                    }
+                }
+                if (src_alpha) {
+                    if (src_alpha == 255) {
+                        *(FX_DWORD*)dest_scan = m_Color;
+                    } else {
+                        FX_BYTE dest_alpha = dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255;
+                        dest_scan[3] = dest_alpha;
+                        int alpha_ratio = src_alpha * 255 / dest_alpha;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);
+                        dest_scan += 2;
+                        continue;
+                    }
+                }
+                dest_scan += 4;
+            }
+            return;
+        }
+        for (int col = col_start; col < col_end; col ++) {
+            int src_alpha;
+            if (m_bFullCover) {
+                if (clip_scan) {
+                    src_alpha = m_Alpha * clip_scan[col] / 255;
+                } else {
+                    src_alpha = m_Alpha;
+                }
+            } else {
+                if (clip_scan) {
+                    src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+                } else {
+                    src_alpha = m_Alpha * cover_scan[col] / 255;
+                }
+            }
+            if (src_alpha) {
+                if (src_alpha == 255) {
+                    *(FX_DWORD*)dest_scan = m_Color;
+                } else {
+                    if (dest_scan[3] == 0) {
+                        dest_scan[3] = src_alpha;
+                        *dest_scan++ = m_Blue;
+                        *dest_scan++ = m_Green;
+                        *dest_scan = m_Red;
+                        dest_scan += 2;
+                        continue;
+                    }
+                    FX_BYTE dest_alpha = dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255;
+                    dest_scan[3] = dest_alpha;
+                    int alpha_ratio = src_alpha * 255 / dest_alpha;
+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);
+                    dest_scan ++;
+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);
+                    dest_scan ++;
+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);
+                    dest_scan += 2;
+                    continue;
+                }
+            }
+            dest_scan += Bpp;
+        }
+    }
+    void CompositeSpanRGB(FX_LPBYTE dest_scan, int Bpp,
+                          int span_left, int span_len, FX_LPBYTE cover_scan,
+                          int clip_left, int clip_right, FX_LPBYTE clip_scan,
+                          FX_LPBYTE dest_extra_alpha_scan)
+    {
+        int col_start = span_left < clip_left ? clip_left - span_left : 0;
+        int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+        dest_scan += col_start * Bpp;
+        if (m_bRgbByteOrder) {
+            for (int col = col_start; col < col_end; col ++) {
+                int src_alpha;
+                if (clip_scan) {
+                    src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+                } else {
+                    src_alpha = m_Alpha * cover_scan[col] / 255;
+                }
+                if (src_alpha) {
+                    if (src_alpha == 255) {
+                        if (Bpp == 4) {
+                            *(FX_DWORD*)dest_scan = m_Color;
+                        } else if (Bpp == 3) {
+                            *dest_scan++ = m_Red;
+                            *dest_scan++ = m_Green;
+                            *dest_scan++ = m_Blue;
+                            continue;
+                        }
+                    } else {
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);
+                        dest_scan++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);
+                        dest_scan++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);
+                        dest_scan += Bpp - 2;
+                        continue;
+                    }
+                }
+                dest_scan += Bpp;
+            }
+            return;
+        }
+        if (Bpp == 3 && dest_extra_alpha_scan) {
+            for (int col = col_start; col < col_end; col ++) {
+                int src_alpha;
+                if (m_bFullCover) {
+                    if (clip_scan) {
+                        src_alpha = m_Alpha * clip_scan[col] / 255;
+                    } else {
+                        src_alpha = m_Alpha;
+                    }
+                } else {
+                    if (clip_scan) {
+                        src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+                    } else {
+                        src_alpha = m_Alpha * cover_scan[col] / 255;
+                    }
+                }
+                if (src_alpha) {
+                    if (src_alpha == 255) {
+                        *dest_scan++ = (FX_BYTE)m_Blue;
+                        *dest_scan++ = (FX_BYTE)m_Green;
+                        *dest_scan++ = (FX_BYTE)m_Red;
+                        *dest_extra_alpha_scan++ = (FX_BYTE)m_Alpha;
+                        continue;
+                    } else {
+                        FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha -
+                                             (*dest_extra_alpha_scan) * src_alpha / 255;
+                        *dest_extra_alpha_scan++ = dest_alpha;
+                        int alpha_ratio = src_alpha * 255 / dest_alpha;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);
+                        dest_scan ++;
+                        continue;
+                    }
+                }
+                dest_extra_alpha_scan++;
+                dest_scan += Bpp;
+            }
+        } else {
+            for (int col = col_start; col < col_end; col ++) {
+                int src_alpha;
+                if (m_bFullCover) {
+                    if (clip_scan) {
+                        src_alpha = m_Alpha * clip_scan[col] / 255;
+                    } else {
+                        src_alpha = m_Alpha;
+                    }
+                } else {
+                    if (clip_scan) {
+                        src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+                    } else {
+                        src_alpha = m_Alpha * cover_scan[col] / 255;
+                    }
+                }
+                if (src_alpha) {
+                    if (src_alpha == 255) {
+                        if (Bpp == 4) {
+                            *(FX_DWORD*)dest_scan = m_Color;
+                        } else if (Bpp == 3) {
+                            *dest_scan++ = m_Blue;
+                            *dest_scan++ = m_Green;
+                            *dest_scan++ = m_Red;
+                            continue;
+                        }
+                    } else {
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);
+                        dest_scan += Bpp - 2;
+                        continue;
+                    }
+                }
+                dest_scan += Bpp;
+            }
+        }
+    }
+    void CompositeSpanCMYK(FX_LPBYTE dest_scan, int Bpp,
+                           int span_left, int span_len, FX_LPBYTE cover_scan,
+                           int clip_left, int clip_right, FX_LPBYTE clip_scan,
+                           FX_LPBYTE dest_extra_alpha_scan)
+    {
+        ASSERT(!m_bRgbByteOrder);
+        int col_start = span_left < clip_left ? clip_left - span_left : 0;
+        int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+        dest_scan += col_start * 4;
+        Bpp;
+        if (dest_extra_alpha_scan) {
+            for (int col = col_start; col < col_end; col ++) {
+                int src_alpha;
+                if (m_bFullCover) {
+                    if (clip_scan) {
+                        src_alpha = m_Alpha * clip_scan[col] / 255;
+                    } else {
+                        src_alpha = m_Alpha;
+                    }
+                } else {
+                    if (clip_scan) {
+                        src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+                    } else {
+                        src_alpha = m_Alpha * cover_scan[col] / 255;
+                    }
+                }
+                if (src_alpha) {
+                    if (src_alpha == 255) {
+                        *(FX_CMYK*)dest_scan = m_Color;
+                        *dest_extra_alpha_scan = (FX_BYTE)m_Alpha;
+                    } else {
+                        FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha -
+                                             (*dest_extra_alpha_scan) * src_alpha / 255;
+                        *dest_extra_alpha_scan++ = dest_alpha;
+                        int alpha_ratio = src_alpha * 255 / dest_alpha;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio);
+                        dest_scan ++;
+                        continue;
+                    }
+                }
+                dest_extra_alpha_scan++;
+                dest_scan += 4;
+            }
+        } else {
+            for (int col = col_start; col < col_end; col ++) {
+                int src_alpha;
+                if (clip_scan) {
+                    src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+                } else {
+                    src_alpha = m_Alpha * cover_scan[col] / 255;
+                }
+                if (src_alpha) {
+                    if (src_alpha == 255) {
+                        *(FX_CMYK*)dest_scan = m_Color;
+                    } else {
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);
+                        dest_scan ++;
+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha);
+                        dest_scan ++;
+                        continue;
+                    }
+                }
+                dest_scan += 4;
+            }
+        }
+    }
+    template<class Scanline> void render(const Scanline& sl)
+    {
+        if (m_pOriDevice == NULL && composite_span == NULL) {
+            return;
+        }
+        int y = sl.y();
+        if (y < m_ClipBox.top || y >= m_ClipBox.bottom) {
+            return;
+        }
+        FX_LPBYTE dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPitch() * y;
+        FX_LPBYTE dest_scan_extra_alpha = NULL;
+        CFX_DIBitmap* pAlphaMask = m_pDevice->m_pAlphaMask;
+        if (pAlphaMask) {
+            dest_scan_extra_alpha = pAlphaMask->GetBuffer() + pAlphaMask->GetPitch() * y;
+        }
+        FX_LPBYTE ori_scan = NULL;
+        if (m_pOriDevice) {
+            ori_scan = m_pOriDevice->GetBuffer() + m_pOriDevice->GetPitch() * y;
+        }
+        int Bpp = m_pDevice->GetBPP() / 8;
+        FX_BOOL bDestAlpha = m_pDevice->HasAlpha() || m_pDevice->IsAlphaMask();
+        unsigned num_spans = sl.num_spans();
+        typename Scanline::const_iterator span = sl.begin();
+        while (1) {
+            int x = span->x;
+            ASSERT(span->len > 0);
+            FX_LPBYTE dest_pos = NULL;
+            FX_LPBYTE dest_extra_alpha_pos = NULL;
+            FX_LPBYTE ori_pos = NULL;
+            if (Bpp) {
+                ori_pos = ori_scan ? ori_scan + x * Bpp : NULL;
+                dest_pos = dest_scan + x * Bpp;
+                dest_extra_alpha_pos = dest_scan_extra_alpha ? dest_scan_extra_alpha + x : NULL;
+            } else {
+                dest_pos = dest_scan + x / 8;
+                ori_pos = ori_scan ? ori_scan + x / 8 : NULL;
+            }
+            FX_LPBYTE clip_pos = NULL;
+            if (m_pClipMask) {
+                clip_pos = m_pClipMask->GetBuffer() + (y - m_ClipBox.top) * m_pClipMask->GetPitch() + x - m_ClipBox.left;
+            }
+            if (ori_pos) {
+                CompositeSpan(dest_pos, ori_pos, Bpp, bDestAlpha, x, span->len, span->covers, m_ClipBox.left, m_ClipBox.right, clip_pos);
+            } else {
+                (this->*composite_span)(dest_pos, Bpp, x, span->len, span->covers, m_ClipBox.left, m_ClipBox.right, clip_pos, dest_extra_alpha_pos);
+            }
+            if(--num_spans == 0) {
+                break;
+            }
+            ++span;
+        }
+    }
+
+    FX_BOOL Init(CFX_DIBitmap* pDevice, CFX_DIBitmap* pOriDevice, const CFX_ClipRgn* pClipRgn, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bRgbByteOrder,
+                 int alpha_flag = 0, void* pIccTransform = NULL)
+    {
+        m_pDevice = pDevice;
+        m_pClipRgn = pClipRgn;
+        composite_span = NULL;
+        m_bRgbByteOrder = bRgbByteOrder;
+        m_pOriDevice = pOriDevice;
+        if (m_pClipRgn) {
+            m_ClipBox = m_pClipRgn->GetBox();
+        } else {
+            m_ClipBox.left = m_ClipBox.top = 0;
+            m_ClipBox.right = m_pDevice->GetWidth();
+            m_ClipBox.bottom = m_pDevice->GetHeight();
+        }
+        m_pClipMask = NULL;
+        if (m_pClipRgn && m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) {
+            m_pClipMask = m_pClipRgn->GetMask();
+        }
+        m_bFullCover = bFullCover;
+        FX_BOOL bObjectCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
+        FX_BOOL bDeviceCMYK = pDevice->IsCmykImage();
+        m_Alpha = bObjectCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+        ICodec_IccModule* pIccModule = NULL;
+        if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+            pIccTransform = NULL;
+        } else {
+            pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+        }
+        if (m_pDevice->GetBPP() == 8) {
+            ASSERT(!m_bRgbByteOrder);
+            composite_span = &CFX_Renderer::CompositeSpanGray;
+            if (m_pDevice->IsAlphaMask()) {
+                m_Gray = 255;
+            } else {
+                if (pIccTransform) {
+                    FX_BYTE gray;
+                    color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+                    pIccModule->TranslateScanline(pIccTransform, &gray, (FX_LPCBYTE)&color, 1);
+                    m_Gray = gray;
+                } else {
+                    if (bObjectCMYK) {
+                        FX_BYTE r, g, b;
+                        AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+                                           r, g, b);
+                        m_Gray = FXRGB2GRAY(r, g, b);
+                    } else {
+                        m_Gray = FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color));
+                    }
+                }
+            }
+            return TRUE;
+        }
+        if (bDeviceCMYK) {
+            ASSERT(!m_bRgbByteOrder);
+            composite_span = &CFX_Renderer::CompositeSpanCMYK;
+            if (bObjectCMYK) {
+                m_Color = FXCMYK_TODIB(color);
+                if (pIccTransform) {
+                    pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&m_Color, 1);
+                }
+            } else {
+                if (!pIccTransform) {
+                    return FALSE;
+                }
+                color = FXARGB_TODIB(color);
+                pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1);
+            }
+            m_Red = ((FX_LPBYTE)&m_Color)[0];
+            m_Green = ((FX_LPBYTE)&m_Color)[1];
+            m_Blue = ((FX_LPBYTE)&m_Color)[2];
+            m_Gray = ((FX_LPBYTE)&m_Color)[3];
+        } else {
+            composite_span = (pDevice->GetFormat() == FXDIB_Argb) ? &CFX_Renderer::CompositeSpanARGB : &CFX_Renderer::CompositeSpanRGB;
+            if (pIccTransform) {
+                color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+                pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1);
+                ((FX_LPBYTE)&m_Color)[3] = m_Alpha;
+                m_Red = ((FX_LPBYTE)&m_Color)[2];
+                m_Green = ((FX_LPBYTE)&m_Color)[1];
+                m_Blue = ((FX_LPBYTE)&m_Color)[0];
+                if (m_bRgbByteOrder) {
+                    m_Color = FXARGB_TODIB(m_Color);
+                    m_Color = FXARGB_TOBGRORDERDIB(m_Color);
+                }
+            } else {
+                if (bObjectCMYK) {
+                    FX_BYTE r, g, b;
+                    AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+                                       r, g, b);
+                    m_Color = FXARGB_MAKE(m_Alpha, r, g, b);
+                    if (m_bRgbByteOrder) {
+                        m_Color = FXARGB_TOBGRORDERDIB(m_Color);
+                    } else {
+                        m_Color = FXARGB_TODIB(m_Color);
+                    }
+                    m_Red = r;
+                    m_Green = g;
+                    m_Blue = b;
+                } else {
+                    if (m_bRgbByteOrder) {
+                        m_Color = FXARGB_TOBGRORDERDIB(color);
+                    } else {
+                        m_Color = FXARGB_TODIB(color);
+                    }
+                    ArgbDecode(color, m_Alpha, m_Red, m_Green, m_Blue);
+                }
+            }
+        }
+        if (m_pDevice->GetBPP() == 1) {
+            composite_span = &CFX_Renderer::CompositeSpan1bpp;
+        }
+        return TRUE;
+    }
+};
+FX_BOOL CFX_AggDeviceDriver::RenderRasterizer(rasterizer_scanline_aa& rasterizer, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bGroupKnockout,
+        int alpha_flag, void* pIccTransform)
+{
+    CFX_DIBitmap* pt = bGroupKnockout ? m_pOriDevice : NULL;
+    CFX_Renderer render;
+    if (!render.Init(m_pBitmap, pt, m_pClipRgn, color, bFullCover, m_bRgbByteOrder, alpha_flag, pIccTransform)) {
+        return FALSE;
+    }
+    scanline_u8 scanline;
+    render_scanlines(rasterizer, scanline, render, (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0);
+    return TRUE;
+}
+FX_BOOL	CFX_AggDeviceDriver::DrawPath(const CFX_PathData* pPathData,
+                                      const CFX_AffineMatrix* pObject2Device,
+                                      const CFX_GraphStateData* pGraphState,
+                                      FX_DWORD fill_color,
+                                      FX_DWORD stroke_color,
+                                      int fill_mode,
+                                      int alpha_flag,
+                                      void* pIccTransform,
+                                      int blend_type
+                                     )
+{
+    if (blend_type != FXDIB_BLEND_NORMAL) {
+        return FALSE;
+    }
+    if (GetBuffer() == NULL) {
+        return TRUE;
+    }
+    m_FillFlags = fill_mode;
+    if ((fill_mode & 3) && fill_color) {
+        CAgg_PathData path_data;
+        path_data.BuildPath(pPathData, pObject2Device);
+        rasterizer_scanline_aa rasterizer;
+        rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+        rasterizer.add_path(path_data.m_PathData);
+        rasterizer.filling_rule((fill_mode & 3) == FXFILL_WINDING ? fill_non_zero : fill_even_odd);
+        if (!RenderRasterizer(rasterizer, fill_color, fill_mode & FXFILL_FULLCOVER, FALSE, alpha_flag, pIccTransform)) {
+            return FALSE;
+        }
+    }
+    int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_STROKE(alpha_flag) : FXARGB_A(stroke_color);
+    if (pGraphState && stroke_alpha) {
+        if (fill_mode & FX_ZEROAREA_FILL) {
+            CAgg_PathData path_data;
+            path_data.BuildPath(pPathData, pObject2Device);
+            rasterizer_scanline_aa rasterizer;
+            rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+            RasterizeStroke(rasterizer, path_data.m_PathData, NULL, pGraphState, 1, FALSE, fill_mode & FX_STROKE_TEXT_MODE);
+            int fill_flag = FXGETFLAG_COLORTYPE(alpha_flag) << 8 | FXGETFLAG_ALPHA_STROKE(alpha_flag);
+            if (!RenderRasterizer(rasterizer, stroke_color, fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, fill_flag, pIccTransform)) {
+                return FALSE;
+            }
+            return TRUE;
+        }
+        CFX_AffineMatrix matrix1, matrix2;
+        if (pObject2Device) {
+            matrix1.a = FX_MAX(FXSYS_fabs(pObject2Device->a), FXSYS_fabs(pObject2Device->b));
+            matrix1.d = matrix1.a;
+            matrix2.Set(pObject2Device->a / matrix1.a, pObject2Device->b / matrix1.a,
+                        pObject2Device->c / matrix1.d, pObject2Device->d / matrix1.d,
+                        0, 0);
+            CFX_AffineMatrix mtRervese;
+            mtRervese.SetReverse(matrix2);
+            matrix1 = *pObject2Device;
+            matrix1.Concat(mtRervese);
+        }
+        CAgg_PathData path_data;
+        path_data.BuildPath(pPathData, &matrix1);
+        rasterizer_scanline_aa rasterizer;
+        rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+        RasterizeStroke(rasterizer, path_data.m_PathData, &matrix2, pGraphState, matrix1.a, FALSE, fill_mode & FX_STROKE_TEXT_MODE);
+        int fill_flag = FXGETFLAG_COLORTYPE(alpha_flag) << 8 | FXGETFLAG_ALPHA_STROKE(alpha_flag);
+        if (!RenderRasterizer(rasterizer, stroke_color, fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, fill_flag, pIccTransform)) {
+            return FALSE;
+        }
+    }
+    return TRUE;
+}
+void RgbByteOrderSetPixel(CFX_DIBitmap* pBitmap, int x, int y, FX_DWORD argb)
+{
+    if (x < 0 || x >= pBitmap->GetWidth() || y < 0 || y >= pBitmap->GetHeight()) {
+        return;
+    }
+    FX_LPBYTE pos = (FX_BYTE*)pBitmap->GetBuffer() + y * pBitmap->GetPitch() + x * pBitmap->GetBPP() / 8;
+    if (pBitmap->GetFormat() == FXDIB_Argb) {
+        FXARGB_SETRGBORDERDIB(pos, ArgbGamma(argb));
+    } else {
+        int alpha = FXARGB_A(argb);
+        pos[0] = (FXARGB_R(argb) * alpha + pos[0] * (255 - alpha)) / 255;
+        pos[1] = (FXARGB_G(argb) * alpha + pos[1] * (255 - alpha)) / 255;
+        pos[2] = (FXARGB_B(argb) * alpha + pos[2] * (255 - alpha)) / 255;
+    }
+}
+void RgbByteOrderCompositeRect(CFX_DIBitmap* pBitmap, int left, int top, int width, int height, FX_ARGB argb)
+{
+    int src_alpha = FXARGB_A(argb);
+    if (src_alpha == 0) {
+        return;
+    }
+    FX_RECT rect(left, top, left + width, top + height);
+    rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
+    width = rect.Width();
+    int src_r = FXARGB_R(argb), src_g = FXARGB_G(argb), src_b = FXARGB_B(argb);
+    int Bpp = pBitmap->GetBPP() / 8;
+    FX_BOOL bAlpha = pBitmap->HasAlpha();
+    int dib_argb = FXARGB_TOBGRORDERDIB(argb);
+    FX_BYTE* pBuffer = pBitmap->GetBuffer();
+    if (src_alpha == 255) {
+        for (int row = rect.top; row < rect.bottom; row ++) {
+            FX_LPBYTE dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp;
+            if (Bpp == 4) {
+                FX_DWORD* scan = (FX_DWORD*)dest_scan;
+                for (int col = 0; col < width; col ++) {
+                    *scan ++ = dib_argb;
+                }
+            } else {
+                for (int col = 0; col < width; col ++) {
+                    *dest_scan ++ = src_r;
+                    *dest_scan ++ = src_g;
+                    *dest_scan ++ = src_b;
+                }
+            }
+        }
+        return;
+    }
+    src_r = FX_GAMMA(src_r);
+    src_g = FX_GAMMA(src_g);
+    src_b = FX_GAMMA(src_b);
+    for (int row = rect.top; row < rect.bottom; row ++) {
+        FX_LPBYTE dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp;
+        if (bAlpha) {
+            for (int col = 0; col < width; col ++) {
+                FX_BYTE back_alpha = dest_scan[3];
+                if (back_alpha == 0) {
+                    FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+                    dest_scan += 4;
+                    continue;
+                }
+                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+                dest_scan[3] = dest_alpha;
+                int alpha_ratio = src_alpha * 255 / dest_alpha;
+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+                dest_scan++;
+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+                dest_scan++;
+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+                dest_scan += 2;
+            }
+        } else {
+            for (int col = 0; col < width; col ++) {
+                *dest_scan = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_r, src_alpha));
+                dest_scan++;
+                *dest_scan = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_g, src_alpha));
+                dest_scan++;
+                *dest_scan = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_b, src_alpha));
+                dest_scan++;
+                if (Bpp == 4) {
+                    dest_scan++;
+                }
+            }
+        }
+    }
+}
+void RgbByteOrderTransferBitmap(CFX_DIBitmap* pBitmap, int dest_left, int dest_top, int width, int height,
+                                const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+    if (pBitmap == NULL) {
+        return;
+    }
+    pBitmap->GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), src_left, src_top, NULL);
+    if (width == 0 || height == 0) {
+        return;
+    }
+    int Bpp = pBitmap->GetBPP() / 8;
+    FXDIB_Format dest_format = pBitmap->GetFormat();
+    FXDIB_Format src_format = pSrcBitmap->GetFormat();
+    int pitch = pBitmap->GetPitch();
+    FX_BYTE* buffer = pBitmap->GetBuffer();
+    if (dest_format == src_format) {
+        for (int row = 0; row < height; row ++) {
+            FX_LPBYTE dest_scan = buffer + (dest_top + row) * pitch + dest_left * Bpp;
+            FX_LPBYTE src_scan = (FX_LPBYTE)pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
+            if (Bpp == 4) {
+                for (int col = 0; col < width; col ++) {
+                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_scan[3], src_scan[0], src_scan[1], src_scan[2]));
+                    dest_scan += 4;
+                    src_scan += 4;
+                }
+            } else {
+                for (int col = 0; col < width; col ++) {
+                    *dest_scan++ = src_scan[2];
+                    *dest_scan++ = src_scan[1];
+                    *dest_scan++ = src_scan[0];
+                    src_scan += 3;
+                }
+            }
+        }
+        return;
+    }
+    int src_pitch = pSrcBitmap->GetPitch();
+    FX_ARGB* src_pal = pSrcBitmap->GetPalette();
+    FX_LPBYTE dest_buf = buffer + dest_top * pitch + dest_left * Bpp;
+    if (dest_format == FXDIB_Rgb) {
+        if (src_format == FXDIB_Rgb32) {
+            for (int row = 0; row < height; row ++) {
+                FX_LPBYTE dest_scan = dest_buf + row * pitch;
+                FX_LPBYTE src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+                for (int col = 0; col < width; col ++) {
+                    *dest_scan++ = src_scan[2];
+                    *dest_scan++ = src_scan[1];
+                    *dest_scan++ = src_scan[0];
+                    src_scan += 4;
+                }
+            }
+        } else {
+            ASSERT(FALSE);
+        }
+    } else if (dest_format == FXDIB_Argb || dest_format == FXDIB_Rgb32) {
+        if (src_format == FXDIB_Rgb) {
+            for (int row = 0; row < height; row ++) {
+                FX_BYTE* dest_scan = (FX_BYTE*)(dest_buf + row * pitch);
+                FX_LPBYTE src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
+                if (src_format == FXDIB_Argb) {
+                    for (int col = 0; col < width; col ++) {
+                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, FX_GAMMA(src_scan[0]), FX_GAMMA(src_scan[1]), FX_GAMMA(src_scan[2])));
+                        dest_scan += 4;
+                        src_scan += 3;
+                    }
+                } else {
+                    for (int col = 0; col < width; col ++) {
+                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], src_scan[2]));
+                        dest_scan += 4;
+                        src_scan += 3;
+                    }
+                }
+            }
+        } else if (src_format == FXDIB_Rgb32) {
+            ASSERT(dest_format == FXDIB_Argb);
+            for (int row = 0; row < height; row ++) {
+                FX_LPBYTE dest_scan = dest_buf + row * pitch;
+                FX_LPBYTE src_scan = (FX_LPBYTE)(pSrcBitmap->GetScanline(src_top + row) + src_left * 4);
+                for (int col = 0; col < width; col++) {
+                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], src_scan[2]));
+                    src_scan  += 4;
+                    dest_scan += 4;
+                }
+            }
+        }
+    } else {
+        ASSERT(FALSE);
+    }
+}
+FX_ARGB _DefaultCMYK2ARGB(FX_CMYK cmyk, FX_BYTE alpha)
+{
+    FX_BYTE r, g, b;
+    AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
+                       r, g, b);
+    return ArgbEncode(alpha, r, g, b);
+}
+FX_BOOL _DibSetPixel(CFX_DIBitmap* pDevice, int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+    FX_BOOL bObjCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
+    int alpha = bObjCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+    if (pIccTransform) {
+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+        color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+        pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&color, (FX_LPBYTE)&color, 1);
+        color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+        if (!pDevice->IsCmykImage()) {
+            color = (color & 0xffffff) | (alpha << 24);
+        }
+    } else {
+        if (pDevice->IsCmykImage()) {
+            if (!bObjCMYK) {
+                return FALSE;
+            }
+        } else {
+            if (bObjCMYK) {
+                color = _DefaultCMYK2ARGB(color, alpha);
+            }
+        }
+    }
+    pDevice->SetPixel(x, y, color);
+    if (pDevice->m_pAlphaMask) {
+        pDevice->m_pAlphaMask->SetPixel(x, y, alpha << 24);
+    }
+    return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::SetPixel(int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+    if (m_pBitmap->GetBuffer() == NULL) {
+        return TRUE;
+    }
+    if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+        pIccTransform = NULL;
+    }
+    if (m_pClipRgn == NULL) {
+        if (m_bRgbByteOrder) {
+            RgbByteOrderSetPixel(m_pBitmap, x, y, color);
+        } else {
+            return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform);
+        }
+    } else if (m_pClipRgn->GetBox().Contains(x, y)) {
+        if (m_pClipRgn->GetType() == CFX_ClipRgn::RectI) {
+            if (m_bRgbByteOrder) {
+                RgbByteOrderSetPixel(m_pBitmap, x, y, color);
+            } else {
+                return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform);
+            }
+        } else if (m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) {
+            const CFX_DIBitmap* pMask = m_pClipRgn->GetMask();
+            FX_BOOL bCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
+            int new_alpha = bCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+            new_alpha = new_alpha * pMask->GetScanline(y)[x] / 255;
+            if (m_bRgbByteOrder) {
+                RgbByteOrderSetPixel(m_pBitmap, x, y, (color & 0xffffff) | (new_alpha << 24));
+                return TRUE;
+            }
+            if (bCMYK) {
+                FXSETFLAG_ALPHA_FILL(alpha_flag, new_alpha);
+            } else {
+                color = (color & 0xffffff) | (new_alpha << 24);
+            }
+            return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform);
+        }
+    }
+    return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)
+{
+    if (blend_type != FXDIB_BLEND_NORMAL) {
+        return FALSE;
+    }
+    if (m_pBitmap->GetBuffer() == NULL) {
+        return TRUE;
+    }
+    FX_RECT clip_rect;
+    GetClipBox(&clip_rect);
+    FX_RECT draw_rect = clip_rect;
+    if (pRect) {
+        draw_rect.Intersect(*pRect);
+    }
+    if (draw_rect.IsEmpty()) {
+        return TRUE;
+    }
+    if (m_pClipRgn == NULL || m_pClipRgn->GetType() == CFX_ClipRgn::RectI) {
+        if (m_bRgbByteOrder) {
+            RgbByteOrderCompositeRect(m_pBitmap, draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), fill_color);
+        } else {
+            m_pBitmap->CompositeRect(draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), fill_color, alpha_flag, pIccTransform);
+        }
+        return TRUE;
+    }
+    m_pBitmap->CompositeMask(draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), (const CFX_DIBitmap*)m_pClipRgn->GetMask(),
+                             fill_color, draw_rect.left - clip_rect.left, draw_rect.top - clip_rect.top, FXDIB_BLEND_NORMAL, NULL, m_bRgbByteOrder, alpha_flag, pIccTransform);
+    return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::GetClipBox(FX_RECT* pRect)
+{
+    if (m_pClipRgn == NULL) {
+        pRect->left = pRect->top = 0;
+        pRect->right = GetDeviceCaps(FXDC_PIXEL_WIDTH);
+        pRect->bottom = GetDeviceCaps(FXDC_PIXEL_HEIGHT);
+        return TRUE;
+    }
+    *pRect = m_pClipRgn->GetBox();
+    return TRUE;
+}
+FX_BOOL	CFX_AggDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform, FX_BOOL bDEdge)
+{
+    if (m_pBitmap->GetBuffer() == NULL) {
+        return TRUE;
+    }
+    if (bDEdge) {
+        if (m_bRgbByteOrder) {
+            RgbByteOrderTransferBitmap(pBitmap, 0, 0, pBitmap->GetWidth(), pBitmap->GetHeight(), m_pBitmap, left, top);
+        } else {
+            return pBitmap->TransferBitmap(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight(), m_pBitmap, left, top, pIccTransform);
+        }
+        return TRUE;
+    }
+    FX_RECT rect(left, top, left + pBitmap->GetWidth(), top + pBitmap->GetHeight());
+    CFX_DIBitmap *pBack = NULL;
+    if (m_pOriDevice) {
+        pBack = m_pOriDevice->Clone(&rect);
+        if (!pBack) {
+            return TRUE;
+        }
+        pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(), m_pBitmap, 0, 0);
+    } else {
+        pBack = m_pBitmap->Clone(&rect);
+    }
+    if (!pBack) {
+        return TRUE;
+    }
+    FX_BOOL bRet = TRUE;
+    left = left >= 0 ? 0 : left;
+    top = top >= 0 ? 0 : top;
+    if (m_bRgbByteOrder) {
+        RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(), pBack, left, top);
+    } else {
+        bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), pBack, left, top, pIccTransform);
+    }
+    delete pBack;
+    return bRet;
+}
+FX_BOOL	CFX_AggDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD argb, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+                                       int alpha_flag, void* pIccTransform)
+{
+    if (m_pBitmap->GetBuffer() == NULL) {
+        return TRUE;
+    }
+    if (pBitmap->IsAlphaMask())
+        return m_pBitmap->CompositeMask(left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, argb,
+                                        pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn, m_bRgbByteOrder, alpha_flag, pIccTransform);
+    return m_pBitmap->CompositeBitmap(left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap,
+                                      pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn, m_bRgbByteOrder, pIccTransform);
+}
+FX_BOOL	CFX_AggDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD argb, int dest_left, int dest_top,
+        int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+        int alpha_flag, void* pIccTransform, int blend_type)
+{
+    if (m_pBitmap->GetBuffer() == NULL) {
+        return TRUE;
+    }
+    if (dest_width == pSource->GetWidth() && dest_height == pSource->GetHeight()) {
+        FX_RECT rect(0, 0, dest_width, dest_height);
+        return SetDIBits(pSource, argb, &rect, dest_left, dest_top, blend_type, alpha_flag, pIccTransform);
+    }
+    FX_RECT dest_rect(dest_left, dest_top, dest_left + dest_width, dest_top + dest_height);
+    dest_rect.Normalize();
+    FX_RECT dest_clip = dest_rect;
+    dest_clip.Intersect(*pClipRect);
+    CFX_BitmapComposer composer;
+    composer.Compose(m_pBitmap, m_pClipRgn, 255, argb, dest_clip, FALSE, FALSE, FALSE, m_bRgbByteOrder, alpha_flag, pIccTransform, blend_type);
+    dest_clip.Offset(-dest_rect.left, -dest_rect.top);
+    CFX_ImageStretcher stretcher;
+    if (stretcher.Start(&composer, pSource, dest_width, dest_height, dest_clip, flags)) {
+        stretcher.Continue(NULL);
+    }
+    return TRUE;
+}
+FX_BOOL	CFX_AggDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, int bitmap_alpha, FX_DWORD argb,
+        const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+        int alpha_flag, void* pIccTransform, int blend_type)
+{
+    if (m_pBitmap->GetBuffer() == NULL) {
+        return TRUE;
+    }
+    CFX_ImageRenderer* pRenderer = FX_NEW CFX_ImageRenderer;
+    if (!pRenderer) {
+        return FALSE;
+    }
+    pRenderer->Start(m_pBitmap, m_pClipRgn, pSource, bitmap_alpha, argb, pMatrix, render_flags, m_bRgbByteOrder, alpha_flag, pIccTransform);
+    handle = pRenderer;
+    return TRUE;
+}
+FX_BOOL	CFX_AggDeviceDriver::ContinueDIBits(FX_LPVOID pHandle, IFX_Pause* pPause)
+{
+    if (m_pBitmap->GetBuffer() == NULL) {
+        return TRUE;
+    }
+    return ((CFX_ImageRenderer*)pHandle)->Continue(pPause);
+}
+void CFX_AggDeviceDriver::CancelDIBits(FX_LPVOID pHandle)
+{
+    if (m_pBitmap->GetBuffer() == NULL) {
+        return;
+    }
+    delete (CFX_ImageRenderer*)pHandle;
+}
+CFX_FxgeDevice::CFX_FxgeDevice()
+{
+    m_bOwnedBitmap = FALSE;
+}
+FX_BOOL CFX_FxgeDevice::Attach(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)
+{
+    if (pBitmap == NULL) {
+        return FALSE;
+    }
+    SetBitmap(pBitmap);
+    IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_AggDeviceDriver(pBitmap, dither_bits, bRgbByteOrder, pOriDevice, bGroupKnockout);
+    if (!pDriver) {
+        return FALSE;
+    }
+    SetDeviceDriver(pDriver);
+    return TRUE;
+}
+FX_BOOL CFX_FxgeDevice::Create(int width, int height, FXDIB_Format format, int dither_bits, CFX_DIBitmap* pOriDevice)
+{
+    m_bOwnedBitmap = TRUE;
+    CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+    if (!pBitmap) {
+        return FALSE;
+    }
+    if (!pBitmap->Create(width, height, format)) {
+        delete pBitmap;
+        return FALSE;
+    }
+    SetBitmap(pBitmap);
+    IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_AggDeviceDriver(pBitmap, dither_bits, FALSE, pOriDevice, FALSE);
+    if (!pDriver) {
+        return FALSE;
+    }
+    SetDeviceDriver(pDriver);
+    return TRUE;
+}
+CFX_FxgeDevice::~CFX_FxgeDevice()
+{
+    if (m_bOwnedBitmap && GetBitmap()) {
+        delete GetBitmap();
+    }
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_path_storage.cpp b/core/src/fxge/agg/agg23/fx_agg_path_storage.cpp
new file mode 100644
index 0000000..8c4b701
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_path_storage.cpp
@@ -0,0 +1,104 @@
+
+//----------------------------------------------------------------------------
+// XYQ: 2006-01-22 Copied from AGG project.
+// TODO: This file uses intensive floating point operations, so it's NOT suitable
+// for platforms like Symbian OS. We need to change to FIX format.
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Class path_storage
+//
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_basic.h"
+#include "agg_path_storage.h"
+#include "agg_math.h"
+namespace agg
+{
+path_storage::~path_storage()
+{
+    if(m_total_blocks) {
+        FX_FLOAT** coord_blk = m_coord_blocks + m_total_blocks - 1;
+        while(m_total_blocks--) {
+            FX_Free(*coord_blk);
+            --coord_blk;
+        }
+        FX_Free(m_coord_blocks);
+    }
+}
+path_storage::path_storage() :
+    m_total_vertices(0),
+    m_total_blocks(0),
+    m_max_blocks(0),
+    m_coord_blocks(0),
+    m_cmd_blocks(0),
+    m_iterator(0)
+{
+}
+void path_storage::allocate_block(unsigned nb)
+{
+    if(nb >= m_max_blocks) {
+        FX_FLOAT** new_coords =
+            FX_Alloc( FX_FLOAT*, (m_max_blocks + block_pool) * 2);
+        if (!new_coords) {
+            return;
+        }
+        unsigned char** new_cmds =
+            (unsigned char**)(new_coords + m_max_blocks + block_pool);
+        if(m_coord_blocks) {
+            FXSYS_memcpy32(new_coords,
+                           m_coord_blocks,
+                           m_max_blocks * sizeof(FX_FLOAT*));
+            FXSYS_memcpy32(new_cmds,
+                           m_cmd_blocks,
+                           m_max_blocks * sizeof(unsigned char*));
+            FX_Free(m_coord_blocks);
+        }
+        m_coord_blocks = new_coords;
+        m_cmd_blocks = new_cmds;
+        m_max_blocks += block_pool;
+    }
+    m_coord_blocks[nb] =
+        FX_Alloc( FX_FLOAT, block_size * 2 +
+                  block_size /
+                  (sizeof(FX_FLOAT) / sizeof(unsigned char)));
+    if (!m_coord_blocks[nb]) {
+        return;
+    }
+    m_cmd_blocks[nb]  =
+        (unsigned char*)(m_coord_blocks[nb] + block_size * 2);
+    m_total_blocks++;
+}
+void path_storage::rewind(unsigned path_id)
+{
+    m_iterator = path_id;
+}
+void path_storage::curve4(FX_FLOAT x_ctrl1, FX_FLOAT y_ctrl1,
+                          FX_FLOAT x_ctrl2, FX_FLOAT y_ctrl2,
+                          FX_FLOAT x_to,    FX_FLOAT y_to)
+{
+    add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4);
+    add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4);
+    add_vertex(x_to,    y_to,    path_cmd_curve4);
+}
+void path_storage::end_poly()
+{
+    if(m_total_vertices) {
+        if(is_vertex(command(m_total_vertices - 1))) {
+            add_vertex(0, 0, path_cmd_end_poly | path_flags_close);
+        }
+    }
+}
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_rasterizer_scanline_aa.cpp b/core/src/fxge/agg/agg23/fx_agg_rasterizer_scanline_aa.cpp
new file mode 100644
index 0000000..634d10a
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_rasterizer_scanline_aa.cpp
@@ -0,0 +1,495 @@
+
+//----------------------------------------------------------------------------
+// XYQ: 2006-01-22 Copied from AGG project.
+// This file uses only integer data, so it's suitable for all platforms.
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+//
+// The author gratefully acknowleges the support of David Turner,
+// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType
+// libray - in producing this work. See http://www.freetype.org for details.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for 32-bit screen coordinates has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+//
+// Class outline_aa - implementation.
+//
+// Initially the rendering algorithm was designed by David Turner and the
+// other authors of the FreeType library - see the above notice. I nearly
+// created a similar renderer, but still I was far from David's work.
+// I completely redesigned the original code and adapted it for Anti-Grain
+// ideas. Two functions - render_line and render_hline are the core of
+// the algorithm - they calculate the exact coverage of each pixel cell
+// of the polygon. I left these functions almost as is, because there's
+// no way to improve the perfection - hats off to David and his group!
+//
+// All other code is very different from the original.
+//
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_ext.h"
+#include <limits.h>
+#include "agg_rasterizer_scanline_aa.h"
+namespace agg
+{
+AGG_INLINE void cell_aa::set_cover(int c, int a)
+{
+    cover = c;
+    area = a;
+}
+AGG_INLINE void cell_aa::add_cover(int c, int a)
+{
+    cover += c;
+    area += a;
+}
+AGG_INLINE void cell_aa::set_coord(int cx, int cy)
+{
+    x = cx;
+    y = cy;
+}
+AGG_INLINE void cell_aa::set(int cx, int cy, int c, int a)
+{
+    x = cx;
+    y = cy;
+    cover = c;
+    area = a;
+}
+outline_aa::~outline_aa()
+{
+    if(m_num_blocks) {
+        cell_aa** ptr = m_cells + m_num_blocks - 1;
+        while(m_num_blocks--) {
+            FX_Free(*ptr);
+            ptr--;
+        }
+        FX_Free(m_cells);
+    }
+}
+outline_aa::outline_aa() :
+    m_num_blocks(0),
+    m_max_blocks(0),
+    m_cur_block(0),
+    m_num_cells(0),
+    m_cells(0),
+    m_cur_cell_ptr(0),
+    m_cur_x(0),
+    m_cur_y(0),
+    m_min_x(0x7FFFFFFF),
+    m_min_y(0x7FFFFFFF),
+    m_max_x(-0x7FFFFFFF),
+    m_max_y(-0x7FFFFFFF),
+    m_sorted(false)
+{
+    m_cur_cell.set(0x7FFF, 0x7FFF, 0, 0);
+}
+void outline_aa::reset()
+{
+    m_num_cells = 0;
+    m_cur_block = 0;
+    m_cur_cell.set(0x7FFF, 0x7FFF, 0, 0);
+    m_sorted = false;
+    m_min_x =  0x7FFFFFFF;
+    m_min_y =  0x7FFFFFFF;
+    m_max_x = -0x7FFFFFFF;
+    m_max_y = -0x7FFFFFFF;
+}
+void outline_aa::allocate_block()
+{
+    if(m_cur_block >= m_num_blocks) {
+        if(m_num_blocks >= m_max_blocks) {
+            cell_aa** new_cells = FX_Alloc( cell_aa*, m_max_blocks + cell_block_pool);
+            if (!new_cells) {
+                return;
+            }
+            if(m_cells) {
+                FXSYS_memcpy32(new_cells, m_cells, m_max_blocks * sizeof(cell_aa*));
+                FX_Free(m_cells);
+            }
+            m_cells = new_cells;
+            m_max_blocks += cell_block_pool;
+        }
+        m_cells[m_num_blocks++] = FX_Alloc(cell_aa, cell_block_size);
+        if (!m_cells[m_num_blocks - 1]) {
+            return;
+        }
+    }
+    m_cur_cell_ptr = m_cells[m_cur_block++];
+}
+AGG_INLINE void outline_aa::add_cur_cell()
+{
+    if(m_cur_cell.area | m_cur_cell.cover) {
+        if((m_num_cells & cell_block_mask) == 0) {
+            if(m_num_blocks >= cell_block_limit) {
+                return;
+            }
+            allocate_block();
+        }
+        *m_cur_cell_ptr++ = m_cur_cell;
+        ++m_num_cells;
+    }
+}
+AGG_INLINE void outline_aa::set_cur_cell(int x, int y)
+{
+    if(m_cur_cell.x != x || m_cur_cell.y != y) {
+        add_cur_cell();
+        m_cur_cell.set(x, y, 0, 0);
+        if(x < m_min_x) {
+            m_min_x = x;
+        }
+        if(x > m_max_x) {
+            m_max_x = x;
+        }
+        if(y < m_min_y) {
+            m_min_y = y;
+        }
+        if(y > m_max_y) {
+            m_max_y = y;
+        }
+    }
+}
+AGG_INLINE void outline_aa::render_hline(int ey, int x1, int y1, int x2, int y2)
+{
+    int ex1 = x1 >> poly_base_shift;
+    int ex2 = x2 >> poly_base_shift;
+    int fx1 = x1 & poly_base_mask;
+    int fx2 = x2 & poly_base_mask;
+    int delta, p, first, dx;
+    int incr, lift, mod, rem;
+    if(y1 == y2) {
+        set_cur_cell(ex2, ey);
+        return;
+    }
+    if(ex1 == ex2) {
+        delta = y2 - y1;
+        m_cur_cell.add_cover(delta, (fx1 + fx2) * delta);
+        return;
+    }
+    p     = (poly_base_size - fx1) * (y2 - y1);
+    first = poly_base_size;
+    incr  = 1;
+    dx = x2 - x1;
+    if(dx < 0) {
+        p     = fx1 * (y2 - y1);
+        first = 0;
+        incr  = -1;
+        dx    = -dx;
+    }
+    delta = p / dx;
+    mod   = p % dx;
+    if(mod < 0) {
+        delta--;
+        mod += dx;
+    }
+    m_cur_cell.add_cover(delta, (fx1 + first) * delta);
+    ex1 += incr;
+    set_cur_cell(ex1, ey);
+    y1  += delta;
+    if(ex1 != ex2) {
+        p     = poly_base_size * (y2 - y1 + delta);
+        lift  = p / dx;
+        rem   = p % dx;
+        if (rem < 0) {
+            lift--;
+            rem += dx;
+        }
+        mod -= dx;
+        while (ex1 != ex2) {
+            delta = lift;
+            mod  += rem;
+            if(mod >= 0) {
+                mod -= dx;
+                delta++;
+            }
+            m_cur_cell.add_cover(delta, (poly_base_size) * delta);
+            y1  += delta;
+            ex1 += incr;
+            set_cur_cell(ex1, ey);
+        }
+    }
+    delta = y2 - y1;
+    m_cur_cell.add_cover(delta, (fx2 + poly_base_size - first) * delta);
+}
+void outline_aa::render_line(int x1, int y1, int x2, int y2)
+{
+    enum dx_limit_e { dx_limit = 16384 << poly_base_shift };
+    int dx = x2 - x1;
+    if(dx >= dx_limit || dx <= -dx_limit) {
+        int cx = (x1 + x2) >> 1;
+        int cy = (y1 + y2) >> 1;
+        render_line(x1, y1, cx, cy);
+        render_line(cx, cy, x2, y2);
+    }
+    int dy = y2 - y1;
+    int ey1 = y1 >> poly_base_shift;
+    int ey2 = y2 >> poly_base_shift;
+    int fy1 = y1 & poly_base_mask;
+    int fy2 = y2 & poly_base_mask;
+    int x_from, x_to;
+    int p, rem, mod, lift, delta, first, incr;
+    if(ey1 == ey2) {
+        render_hline(ey1, x1, fy1, x2, fy2);
+        return;
+    }
+    incr  = 1;
+    if(dx == 0) {
+        int ex = x1 >> poly_base_shift;
+        int two_fx = (x1 - (ex << poly_base_shift)) << 1;
+        int area;
+        first = poly_base_size;
+        if(dy < 0) {
+            first = 0;
+            incr  = -1;
+        }
+        x_from = x1;
+        delta = first - fy1;
+        m_cur_cell.add_cover(delta, two_fx * delta);
+        ey1 += incr;
+        set_cur_cell(ex, ey1);
+        delta = first + first - poly_base_size;
+        area = two_fx * delta;
+        while(ey1 != ey2) {
+            m_cur_cell.set_cover(delta, area);
+            ey1 += incr;
+            set_cur_cell(ex, ey1);
+        }
+        delta = fy2 - poly_base_size + first;
+        m_cur_cell.add_cover(delta, two_fx * delta);
+        return;
+    }
+    p     = (poly_base_size - fy1) * dx;
+    first = poly_base_size;
+    if(dy < 0) {
+        p     = fy1 * dx;
+        first = 0;
+        incr  = -1;
+        dy    = -dy;
+    }
+    delta = p / dy;
+    mod   = p % dy;
+    if(mod < 0) {
+        delta--;
+        mod += dy;
+    }
+    x_from = x1 + delta;
+    render_hline(ey1, x1, fy1, x_from, first);
+    ey1 += incr;
+    set_cur_cell(x_from >> poly_base_shift, ey1);
+    if(ey1 != ey2) {
+        p     = poly_base_size * dx;
+        lift  = p / dy;
+        rem   = p % dy;
+        if(rem < 0) {
+            lift--;
+            rem += dy;
+        }
+        mod -= dy;
+        while(ey1 != ey2) {
+            delta = lift;
+            mod  += rem;
+            if (mod >= 0) {
+                mod -= dy;
+                delta++;
+            }
+            x_to = x_from + delta;
+            render_hline(ey1, x_from, poly_base_size - first, x_to, first);
+            x_from = x_to;
+            ey1 += incr;
+            set_cur_cell(x_from >> poly_base_shift, ey1);
+        }
+    }
+    render_hline(ey1, x_from, poly_base_size - first, x2, fy2);
+}
+void outline_aa::move_to(int x, int y)
+{
+    if(m_sorted) {
+        reset();
+    }
+    set_cur_cell(x >> poly_base_shift, y >> poly_base_shift);
+    m_cur_x = x;
+    m_cur_y = y;
+}
+void outline_aa::line_to(int x, int y)
+{
+    render_line(m_cur_x, m_cur_y, x, y);
+    m_cur_x = x;
+    m_cur_y = y;
+    m_sorted = false;
+}
+template <class T> static AGG_INLINE void swap_cells(T* a, T* b)
+{
+    T temp = *a;
+    *a = *b;
+    *b = temp;
+}
+enum {
+    qsort_threshold = 9
+};
+static void qsort_cells(cell_aa** start, unsigned num)
+{
+    cell_aa**  stack[80];
+    cell_aa*** top;
+    cell_aa**  limit;
+    cell_aa**  base;
+    limit = start + num;
+    base  = start;
+    top   = stack;
+    for (;;) {
+        int len = int(limit - base);
+        cell_aa** i;
+        cell_aa** j;
+        cell_aa** pivot;
+        if(len > qsort_threshold) {
+            pivot = base + len / 2;
+            swap_cells(base, pivot);
+            i = base + 1;
+            j = limit - 1;
+            if((*j)->x < (*i)->x) {
+                swap_cells(i, j);
+            }
+            if((*base)->x < (*i)->x) {
+                swap_cells(base, i);
+            }
+            if((*j)->x < (*base)->x) {
+                swap_cells(base, j);
+            }
+            for(;;) {
+                int x = (*base)->x;
+                do {
+                    i++;
+                } while( (*i)->x < x );
+                do {
+                    j--;
+                } while( x < (*j)->x );
+                if(i > j) {
+                    break;
+                }
+                swap_cells(i, j);
+            }
+            swap_cells(base, j);
+            if(j - base > limit - i) {
+                top[0] = base;
+                top[1] = j;
+                base   = i;
+            } else {
+                top[0] = i;
+                top[1] = limit;
+                limit  = j;
+            }
+            top += 2;
+        } else {
+            j = base;
+            i = j + 1;
+            for(; i < limit; j = i, i++) {
+                for(; j[1]->x < (*j)->x; j--) {
+                    swap_cells(j + 1, j);
+                    if (j == base) {
+                        break;
+                    }
+                }
+            }
+            if(top > stack) {
+                top  -= 2;
+                base  = top[0];
+                limit = top[1];
+            } else {
+                break;
+            }
+        }
+    }
+}
+void outline_aa::sort_cells()
+{
+    if(m_sorted) {
+        return;
+    }
+    add_cur_cell();
+    if(m_num_cells == 0) {
+        return;
+    }
+    m_sorted_cells.allocate(m_num_cells, 16);
+    if (m_max_y > 0 && m_min_y < 0 && -m_min_y > INT_MAX - m_max_y) {
+        return;
+    }
+    unsigned size = m_max_y - m_min_y;
+    if (size + 1 < size) {
+        return;
+    }
+    size++;
+    m_sorted_y.allocate(size, 16);
+    m_sorted_y.zero();
+    cell_aa** block_ptr = m_cells;
+    cell_aa*  cell_ptr = NULL;
+    unsigned nb = m_num_cells >> cell_block_shift;
+    unsigned i;
+    while(nb--) {
+        cell_ptr = *block_ptr++;
+        i = cell_block_size;
+        while(i--) {
+            m_sorted_y[cell_ptr->y - m_min_y].start++;
+            ++cell_ptr;
+        }
+    }
+    i = m_num_cells & cell_block_mask;
+    if (i) {
+        cell_ptr = *block_ptr++;
+    }
+    while(i--) {
+        m_sorted_y[cell_ptr->y - m_min_y].start++;
+        ++cell_ptr;
+    }
+    unsigned start = 0;
+    for(i = 0; i < m_sorted_y.size(); i++) {
+        unsigned v = m_sorted_y[i].start;
+        m_sorted_y[i].start = start;
+        start += v;
+    }
+    block_ptr = m_cells;
+    nb = m_num_cells >> cell_block_shift;
+    while(nb--) {
+        cell_ptr = *block_ptr++;
+        i = cell_block_size;
+        while(i--) {
+            sorted_y& cur_y = m_sorted_y[cell_ptr->y - m_min_y];
+            m_sorted_cells[cur_y.start + cur_y.num] = cell_ptr;
+            ++cur_y.num;
+            ++cell_ptr;
+        }
+    }
+    i = m_num_cells & cell_block_mask;
+    if (i) {
+        cell_ptr = *block_ptr++;
+    }
+    while(i--) {
+        sorted_y& cur_y = m_sorted_y[cell_ptr->y - m_min_y];
+        m_sorted_cells[cur_y.start + cur_y.num] = cell_ptr;
+        ++cur_y.num;
+        ++cell_ptr;
+    }
+    for(i = 0; i < m_sorted_y.size(); i++) {
+        const sorted_y& cur_y = m_sorted_y[i];
+        if(cur_y.num) {
+            qsort_cells(m_sorted_cells.data() + cur_y.start, cur_y.num);
+        }
+    }
+    m_sorted = true;
+}
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_vcgen_dash.cpp b/core/src/fxge/agg/agg23/fx_agg_vcgen_dash.cpp
new file mode 100644
index 0000000..0b6c290
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_vcgen_dash.cpp
@@ -0,0 +1,176 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Line dash generator
+//
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_basic.h"
+#include "agg_vcgen_dash.h"
+#include "agg_shorten_path.h"
+namespace agg
+{
+vcgen_dash::vcgen_dash() :
+    m_total_dash_len(0),
+    m_num_dashes(0),
+    m_dash_start(0),
+    m_shorten(0),
+    m_curr_dash_start(0),
+    m_curr_dash(0),
+    m_src_vertices(),
+    m_closed(0),
+    m_status(initial),
+    m_src_vertex(0)
+{
+}
+void vcgen_dash::remove_all_dashes()
+{
+    m_total_dash_len = 0;
+    m_num_dashes = 0;
+    m_curr_dash_start = 0;
+    m_curr_dash = 0;
+}
+void vcgen_dash::add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len)
+{
+    if(m_num_dashes < max_dashes) {
+        m_total_dash_len += dash_len + gap_len;
+        m_dashes[m_num_dashes++] = dash_len;
+        m_dashes[m_num_dashes++] = gap_len;
+    }
+}
+void vcgen_dash::dash_start(FX_FLOAT ds)
+{
+    m_dash_start = ds;
+    calc_dash_start(FXSYS_fabs(ds));
+}
+void vcgen_dash::calc_dash_start(FX_FLOAT ds)
+{
+    m_curr_dash = 0;
+    m_curr_dash_start = 0;
+    while(ds > 0) {
+        if(ds > m_dashes[m_curr_dash]) {
+            ds -= m_dashes[m_curr_dash];
+            ++m_curr_dash;
+            m_curr_dash_start = 0;
+            if(m_curr_dash >= m_num_dashes) {
+                m_curr_dash = 0;
+            }
+        } else {
+            m_curr_dash_start = ds;
+            ds = 0;
+        }
+    }
+}
+void vcgen_dash::remove_all()
+{
+    m_status = initial;
+    m_src_vertices.remove_all();
+    m_closed = 0;
+}
+void vcgen_dash::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)
+{
+    m_status = initial;
+    if(is_move_to(cmd)) {
+        m_src_vertices.modify_last(vertex_dist(x, y));
+    } else {
+        if(is_vertex(cmd)) {
+            m_src_vertices.add(vertex_dist(x, y));
+        } else {
+            m_closed = get_close_flag(cmd);
+        }
+    }
+}
+void vcgen_dash::rewind(unsigned)
+{
+    if(m_status == initial) {
+        m_src_vertices.close(m_closed != 0);
+        shorten_path(m_src_vertices, m_shorten, m_closed);
+    }
+    m_status = ready;
+    m_src_vertex = 0;
+}
+unsigned vcgen_dash::vertex(FX_FLOAT* x, FX_FLOAT* y)
+{
+    unsigned cmd = path_cmd_move_to;
+    while(!is_stop(cmd)) {
+        switch(m_status) {
+            case initial:
+                rewind(0);
+            case ready:
+                if(m_num_dashes < 2 || m_src_vertices.size() < 2) {
+                    cmd = path_cmd_stop;
+                    break;
+                }
+                m_status = polyline;
+                m_src_vertex = 1;
+                m_v1 = &m_src_vertices[0];
+                m_v2 = &m_src_vertices[1];
+                m_curr_rest = m_v1->dist;
+                *x = m_v1->x;
+                *y = m_v1->y;
+                if(m_dash_start >= 0) {
+                    calc_dash_start(m_dash_start);
+                }
+                return path_cmd_move_to;
+            case polyline: {
+                    FX_FLOAT dash_rest = m_dashes[m_curr_dash] - m_curr_dash_start;
+                    unsigned cmd = (m_curr_dash & 1) ?
+                                   path_cmd_move_to :
+                                   path_cmd_line_to;
+                    if(m_curr_rest > dash_rest) {
+                        m_curr_rest -= dash_rest;
+                        ++m_curr_dash;
+                        if(m_curr_dash >= m_num_dashes) {
+                            m_curr_dash = 0;
+                        }
+                        m_curr_dash_start = 0;
+                        *x = m_v2->x - (m_v2->x - m_v1->x) * m_curr_rest / m_v1->dist;
+                        *y = m_v2->y - (m_v2->y - m_v1->y) * m_curr_rest / m_v1->dist;
+                    } else {
+                        m_curr_dash_start += m_curr_rest;
+                        *x = m_v2->x;
+                        *y = m_v2->y;
+                        ++m_src_vertex;
+                        m_v1 = m_v2;
+                        m_curr_rest = m_v1->dist;
+                        if(m_closed) {
+                            if(m_src_vertex > m_src_vertices.size()) {
+                                m_status = stop;
+                            } else {
+                                m_v2 = &m_src_vertices
+                                       [
+                                           (m_src_vertex >= m_src_vertices.size()) ? 0 :
+                                           m_src_vertex
+                                       ];
+                            }
+                        } else {
+                            if(m_src_vertex >= m_src_vertices.size()) {
+                                m_status = stop;
+                            } else {
+                                m_v2 = &m_src_vertices[m_src_vertex];
+                            }
+                        }
+                    }
+                    return cmd;
+                }
+                break;
+            case stop:
+                cmd = path_cmd_stop;
+                break;
+        }
+    }
+    return path_cmd_stop;
+}
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_vcgen_stroke.cpp b/core/src/fxge/agg/agg23/fx_agg_vcgen_stroke.cpp
new file mode 100644
index 0000000..425ac45
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_vcgen_stroke.cpp
@@ -0,0 +1,214 @@
+
+//----------------------------------------------------------------------------
+// XYQ: 2006-01-22 Copied from AGG project.
+// TODO: This file uses intensive floating point operations, so it's NOT suitable
+// for platforms like Symbian OS. We need to change to FIX format.
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+//          mcseemagg@yahoo.com
+//          http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Stroke generator
+//
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_basic.h"
+#include "agg_vcgen_stroke.h"
+namespace agg
+{
+
+vcgen_stroke::vcgen_stroke() :
+    m_src_vertices(),
+    m_out_vertices(),
+    m_width(0.5f),
+    m_miter_limit(4 * 1.0f),
+    m_inner_miter_limit(1.0f + 1.0f / 100),
+    m_approx_scale(1.0f),
+    m_line_cap(butt_cap),
+    m_line_join(miter_join),
+    m_inner_join(inner_miter),
+    m_closed(0),
+    m_status(initial),
+    m_src_vertex(0),
+    m_out_vertex(0)
+{
+}
+void vcgen_stroke::remove_all()
+{
+    m_src_vertices.remove_all();
+    m_closed = 0;
+    m_status = initial;
+}
+void vcgen_stroke::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)
+{
+    m_status = initial;
+    if(is_move_to(cmd)) {
+        m_src_vertices.modify_last(vertex_dist_cmd(x, y, cmd));
+    } else {
+        if(is_vertex(cmd)) {
+            m_src_vertices.add(vertex_dist_cmd(x, y, cmd));
+        } else {
+            m_closed = get_close_flag(cmd);
+        }
+    }
+}
+static inline void calc_butt_cap(FX_FLOAT* cap,
+                                 const vertex_dist& v0,
+                                 const vertex_dist& v1,
+                                 FX_FLOAT len,
+                                 FX_FLOAT width)
+{
+    FX_FLOAT dx = FXSYS_MulDiv(v1.y - v0.y, width, len);
+    FX_FLOAT dy = FXSYS_MulDiv(v1.x - v0.x, width, len);
+    cap[0] = v0.x - dx;
+    cap[1] = v0.y + dy;
+    cap[2] = v0.x + dx;
+    cap[3] = v0.y - dy;
+}
+void vcgen_stroke::rewind(unsigned)
+{
+    if(m_status == initial) {
+        m_src_vertices.close(m_closed != 0);
+        if(m_src_vertices.size() < 3) {
+            m_closed = 0;
+        }
+    }
+    m_status = ready;
+    m_src_vertex = 0;
+    m_out_vertex = 0;
+}
+unsigned vcgen_stroke::vertex(FX_FLOAT* x, FX_FLOAT* y)
+{
+    unsigned cmd = path_cmd_line_to;
+    line_join_e curj;
+    while(!is_stop(cmd)) {
+        switch(m_status) {
+            case initial:
+                rewind(0);
+            case ready:
+                if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) {
+                    cmd = path_cmd_stop;
+                    break;
+                }
+                m_status = m_closed ? outline1 : cap1;
+                cmd = path_cmd_move_to;
+                m_src_vertex = 0;
+                m_out_vertex = 0;
+                break;
+            case cap1:
+                stroke_calc_cap(m_out_vertices,
+                                m_src_vertices[0],
+                                m_src_vertices[1],
+                                m_src_vertices[0].dist,
+                                m_line_cap,
+                                m_width,
+                                m_approx_scale);
+                m_src_vertex = 1;
+                m_prev_status = outline1;
+                m_status = out_vertices;
+                m_out_vertex = 0;
+                break;
+            case cap2:
+                stroke_calc_cap(m_out_vertices,
+                                m_src_vertices[m_src_vertices.size() - 1],
+                                m_src_vertices[m_src_vertices.size() - 2],
+                                m_src_vertices[m_src_vertices.size() - 2].dist,
+                                m_line_cap,
+                                m_width,
+                                m_approx_scale);
+                m_prev_status = outline2;
+                m_status = out_vertices;
+                m_out_vertex = 0;
+                break;
+            case outline1:
+                if(m_closed) {
+                    if(m_src_vertex >= m_src_vertices.size()) {
+                        m_prev_status = close_first;
+                        m_status = end_poly1;
+                        break;
+                    }
+                } else {
+                    if(m_src_vertex >= m_src_vertices.size() - 1) {
+                        m_status = cap2;
+                        break;
+                    }
+                }
+                curj = m_src_vertices[m_src_vertex].cmd & path_flags_jr ? miter_join_round : m_line_join;
+                stroke_calc_join(m_out_vertices,
+                                 m_src_vertices.prev(m_src_vertex),
+                                 m_src_vertices.curr(m_src_vertex),
+                                 m_src_vertices.next(m_src_vertex),
+                                 m_src_vertices.prev(m_src_vertex).dist,
+                                 m_src_vertices.curr(m_src_vertex).dist,
+                                 m_width,
+                                 curj,
+                                 m_inner_join,
+                                 m_miter_limit,
+                                 m_inner_miter_limit,
+                                 m_approx_scale);
+                ++m_src_vertex;
+                m_prev_status = m_status;
+                m_status = out_vertices;
+                m_out_vertex = 0;
+                break;
+            case close_first:
+                m_status = outline2;
+                cmd = path_cmd_move_to;
+            case outline2:
+                if(m_src_vertex <= unsigned(m_closed == 0)) {
+                    m_status = end_poly2;
+                    m_prev_status = stop;
+                    break;
+                }
+                --m_src_vertex;
+                curj = m_src_vertices[m_src_vertex].cmd & path_flags_jr ? miter_join_round : m_line_join;
+                stroke_calc_join(m_out_vertices,
+                                 m_src_vertices.next(m_src_vertex),
+                                 m_src_vertices.curr(m_src_vertex),
+                                 m_src_vertices.prev(m_src_vertex),
+                                 m_src_vertices.curr(m_src_vertex).dist,
+                                 m_src_vertices.prev(m_src_vertex).dist,
+                                 m_width,
+                                 curj,
+                                 m_inner_join,
+                                 m_miter_limit,
+                                 m_inner_miter_limit,
+                                 m_approx_scale);
+                m_prev_status = m_status;
+                m_status = out_vertices;
+                m_out_vertex = 0;
+                break;
+            case out_vertices:
+                if(m_out_vertex >= m_out_vertices.size()) {
+                    m_status = m_prev_status;
+                } else {
+                    const point_type& c = m_out_vertices[m_out_vertex++];
+                    *x = c.x;
+                    *y = c.y;
+                    return cmd;
+                }
+                break;
+            case end_poly1:
+                m_status = m_prev_status;
+                return path_cmd_end_poly | path_flags_close | path_flags_ccw;
+            case end_poly2:
+                m_status = m_prev_status;
+                return path_cmd_end_poly | path_flags_close | path_flags_cw;
+            case stop:
+                cmd = path_cmd_stop;
+                break;
+        }
+    }
+    return cmd;
+}
+}
diff --git a/core/src/fxge/agg/include/fx_agg_driver.h b/core/src/fxge/agg/include/fx_agg_driver.h
new file mode 100644
index 0000000..c341190
--- /dev/null
+++ b/core/src/fxge/agg/include/fx_agg_driver.h
@@ -0,0 +1,121 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_AGG_DEVICE_DRIVER_
+#define _FX_AGG_DEVICE_DRIVER_
+#include "fxfx_agg_path_storage.h"
+#include "fxfx_agg_rasterizer_scanline_aa.h"
+class CAgg_PathData : public CFX_Object
+{
+public:
+    CAgg_PathData() {}
+    ~CAgg_PathData() {}
+    FX_NAMESPACE_DECLARE(agg, path_storage)	m_PathData;
+    void			BuildPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device);
+};
+class CFX_AggDeviceDriver : public IFX_RenderDeviceDriver
+{
+public:
+    CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout);
+    virtual ~CFX_AggDeviceDriver();
+    void				InitPlatform();
+    void				DestroyPlatform();
+
+
+    virtual int			GetDeviceCaps(int caps_id);
+
+
+    virtual void		SaveState();
+    virtual void		RestoreState(FX_BOOL bKeepSaved);
+
+
+    virtual FX_BOOL		SetClip_PathFill(const CFX_PathData* pPathData,
+                                         const CFX_AffineMatrix* pObject2Device,
+                                         int fill_mode
+                                     );
+
+
+    virtual FX_BOOL		SetClip_PathStroke(const CFX_PathData* pPathData,
+                                           const CFX_AffineMatrix* pObject2Device,
+                                           const CFX_GraphStateData* pGraphState
+                                       );
+
+
+    virtual FX_BOOL		DrawPath(const CFX_PathData* pPathData,
+                                 const CFX_AffineMatrix* pObject2Device,
+                                 const CFX_GraphStateData* pGraphState,
+                                 FX_DWORD fill_color,
+                                 FX_DWORD stroke_color,
+                                 int fill_mode,
+                                 int alpha_flag,
+                                 void* pIccTransform,
+                                 int blend_type
+                             );
+
+    virtual FX_BOOL		SetPixel(int x, int y, FX_DWORD color,
+                                 int alpha_flag, void* pIccTransform);
+
+    virtual FX_BOOL		FillRect(const FX_RECT* pRect,
+                                 FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type);
+
+
+    virtual FX_BOOL		DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+                                         int alpha_flag, void* pIccTransform, int blend_type)
+    {
+        return FALSE;
+    }
+
+    virtual FX_BOOL		GetClipBox(FX_RECT* pRect);
+
+
+    virtual FX_BOOL		GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
+    virtual CFX_DIBitmap*   GetBackDrop()
+    {
+        return m_pOriDevice;
+    }
+
+    virtual FX_BOOL		SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+                                  int alpha_flag, void* pIccTransform);
+    virtual FX_BOOL		StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+                                      int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+                                      int alpha_flag, void* pIccTransform, int blend_type);
+
+    virtual FX_BOOL		StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+                                    const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
+                                    int alpha_flag, void* pIccTransform, int blend_type);
+    virtual FX_BOOL		ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause);
+    virtual void		CancelDIBits(FX_LPVOID handle);
+
+    virtual FX_BOOL     DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+                                       CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+                                       int alpha_flag, void* pIccTransform);
+    virtual FX_BOOL		RenderRasterizer(FX_NAMESPACE_DECLARE(agg, rasterizer_scanline_aa)& rasterizer, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bGroupKnockout,
+                                         int alpha_flag, void* pIccTransform);
+
+    void				SetClipMask(FX_NAMESPACE_DECLARE(agg, rasterizer_scanline_aa)& rasterizer);
+
+    virtual	FX_LPBYTE	GetBuffer() const
+    {
+        return m_pBitmap->GetBuffer();
+    }
+    virtual int			GetDriverType()
+    {
+        return 1;
+    }
+
+    CFX_DIBitmap*		m_pBitmap;
+    CFX_ClipRgn*		m_pClipRgn;
+    CFX_PtrArray		m_StateStack;
+    void*				m_pPlatformGraphics;
+    void*				m_pPlatformBitmap;
+    void*				m_pDwRenderTartget;
+    int					m_FillFlags;
+    int					m_DitherBits;
+    FX_BOOL				m_bRgbByteOrder;
+    CFX_DIBitmap*       m_pOriDevice;
+    FX_BOOL             m_bGroupKnockout;
+};
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_basics.h b/core/src/fxge/agg/include/fxfx_agg_basics.h
new file mode 100644
index 0000000..57fbd2e
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_basics.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_BASICS_H_
+#define _FXFX_AGG_BASICS_H_
+#include "../agg23/agg_basics.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h b/core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h
new file mode 100644
index 0000000..948b619
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_CLIP_LIANG_BARSKY_H_
+#define _FXFX_AGG_CLIP_LIANG_BARSKY_H_
+#include "../agg23/agg_clip_liang_barsky.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_conv_dash.h b/core/src/fxge/agg/include/fxfx_agg_conv_dash.h
new file mode 100644
index 0000000..5f80a06
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_conv_dash.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_CONV_DASH_H_
+#define _FXFX_AGG_CONV_DASH_H_
+#include "../agg23/agg_conv_dash.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_conv_stroke.h b/core/src/fxge/agg/include/fxfx_agg_conv_stroke.h
new file mode 100644
index 0000000..de38386
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_conv_stroke.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_CONV_STROKE_H_
+#define _FXFX_AGG_CONV_STROKE_H_
+#include "../agg23/agg_conv_stroke.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_curves.h b/core/src/fxge/agg/include/fxfx_agg_curves.h
new file mode 100644
index 0000000..54efaa2
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_curves.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_CURVERS_H_
+#define _FXFX_AGG_CURVERS_H_
+#include "../agg23/agg_curves.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_path_storage.h b/core/src/fxge/agg/include/fxfx_agg_path_storage.h
new file mode 100644
index 0000000..9168eb2
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_path_storage.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_PATH_STORAGE_H_
+#define _FXFX_AGG_PATH_STORAGE_H_
+#include "../agg23/agg_path_storage.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h b/core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h
new file mode 100644
index 0000000..3f61cec
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_RASTERIZER_SCANLINE_AA_H_
+#define _FXFX_AGG_RASTERIZER_SCANLINE_AA_H_
+#include "../agg23/agg_rasterizer_scanline_aa.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h b/core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h
new file mode 100644
index 0000000..11d8cbb
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_RENDER_SCANLINE_H_
+#define _FXFX_AGG_RENDER_SCANLINE_H_
+#include "../agg23/agg_renderer_scanline.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h b/core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h
new file mode 100644
index 0000000..eb6886e
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_RENDERING_BUFFER_H_
+#define _FXFX_AGG_RENDERING_BUFFER_H_
+#include "../agg23/agg_rendering_buffer.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_scanline_u.h b/core/src/fxge/agg/include/fxfx_agg_scanline_u.h
new file mode 100644
index 0000000..cc7d2e7
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_scanline_u.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_SCANLINE_U_H_
+#define _FXFX_AGG_SCANLINE_U_H_
+#include "../agg23/agg_scanline_u.h"
+#endif
diff --git a/core/src/fxge/agg/src/fxfx_agg_curves.cpp b/core/src/fxge/agg/src/fxfx_agg_curves.cpp
new file mode 100644
index 0000000..83817f7
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_curves.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_curves.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_driver.cpp b/core/src/fxge/agg/src/fxfx_agg_driver.cpp
new file mode 100644
index 0000000..a4e6a30
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_driver.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_driver.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_path_storage.cpp b/core/src/fxge/agg/src/fxfx_agg_path_storage.cpp
new file mode 100644
index 0000000..fabc526
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_path_storage.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_path_storage.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp b/core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp
new file mode 100644
index 0000000..229e3ba
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_rasterizer_scanline_aa.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp b/core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp
new file mode 100644
index 0000000..4a259c0
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_vcgen_dash.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp b/core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp
new file mode 100644
index 0000000..2311e1a
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_vcgen_stroke.cpp"
diff --git a/core/src/fxge/android/fpf_skiafont.cpp b/core/src/fxge/android/fpf_skiafont.cpp
new file mode 100644
index 0000000..97eeb2f
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiafont.cpp
@@ -0,0 +1,203 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+#include "fpf_skiafont.h"
+#include "fpf_skiafontmgr.h"
+#define FPF_EM_ADJUST(em, a) (em == 0 ? (a) : (a) * 1000 / em)
+CFPF_SkiaFont::CFPF_SkiaFont()
+    : m_pFontMgr(NULL)
+    , m_pFontDes(NULL)
+    , m_Face(NULL)
+    , m_dwStyle(0)
+    , m_uCharset(0)
+    , m_dwRefCount(0)
+{
+}
+CFPF_SkiaFont::~CFPF_SkiaFont()
+{
+    if (m_Face) {
+        FXFT_Done_Face(m_Face);
+    }
+}
+void CFPF_SkiaFont::Release()
+{
+    if (--m_dwRefCount == 0) {
+        delete this;
+    }
+}
+IFPF_Font* CFPF_SkiaFont::Retain()
+{
+    m_dwRefCount++;
+    return (IFPF_Font*)this;
+}
+FPF_HFONT CFPF_SkiaFont::GetHandle()
+{
+    return NULL;
+}
+CFX_ByteString CFPF_SkiaFont::GetFamilyName()
+{
+    if (!m_Face) {
+        return CFX_ByteString();
+    }
+    return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face));
+}
+CFX_WideString CFPF_SkiaFont::GetPsName()
+{
+    if (!m_Face) {
+        return CFX_WideString();
+    }
+    return CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(m_Face));
+}
+FX_INT32 CFPF_SkiaFont::GetGlyphIndex(FX_WCHAR wUnicode)
+{
+    if (!m_Face) {
+        return wUnicode;
+    }
+    if (FXFT_Select_Charmap(m_Face, FXFT_ENCODING_UNICODE)) {
+        return 0;
+    }
+    return FXFT_Get_Char_Index(m_Face, wUnicode);
+}
+FX_INT32 CFPF_SkiaFont::GetGlyphWidth(FX_INT32 iGlyphIndex)
+{
+    if (!m_Face) {
+        return 0;
+    }
+    if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
+        return 0;
+    }
+    return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriAdvance(m_Face));
+}
+FX_INT32 CFPF_SkiaFont::GetAscent() const
+{
+    if (!m_Face) {
+        return 0;
+    }
+    return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Ascender(m_Face));
+}
+FX_INT32 CFPF_SkiaFont::GetDescent() const
+{
+    if (!m_Face) {
+        return 0;
+    }
+    return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Descender(m_Face));
+}
+FX_BOOL CFPF_SkiaFont::GetGlyphBBox(FX_INT32 iGlyphIndex, FX_RECT &rtBBox)
+{
+    if (!m_Face) {
+        return FALSE;
+    }
+    if (FXFT_Is_Face_Tricky(m_Face)) {
+        if (FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72)) {
+            return FALSE;
+        }
+        if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
+            FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
+            return FALSE;
+        }
+        FXFT_Glyph glyph;
+        if (FXFT_Get_Glyph(m_Face->glyph, &glyph)) {
+            FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
+            return FALSE;
+        }
+        FXFT_BBox cbox;
+        FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
+        FX_INT32 x_ppem = m_Face->size->metrics.x_ppem;
+        FX_INT32 y_ppem = m_Face->size->metrics.y_ppem;
+        rtBBox.left = FPF_EM_ADJUST(x_ppem, cbox.xMin);
+        rtBBox.right = FPF_EM_ADJUST(x_ppem, cbox.xMax);
+        rtBBox.top = FPF_EM_ADJUST(y_ppem, cbox.yMax);
+        rtBBox.bottom = FPF_EM_ADJUST(y_ppem, cbox.yMin);
+        rtBBox.top = FX_MIN(rtBBox.top, GetAscent());
+        rtBBox.bottom = FX_MAX(rtBBox.bottom, GetDescent());
+        FXFT_Done_Glyph(glyph);
+        return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0;
+    }
+    if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
+        return FALSE;
+    }
+    rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingX(m_Face));
+    rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingY(m_Face));
+    rtBBox.right = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face));
+    rtBBox.top = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face));
+    return TRUE;
+}
+FX_BOOL CFPF_SkiaFont::GetBBox(FX_RECT &rtBBox)
+{
+    if (!m_Face) {
+        return FALSE;
+    }
+    rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_xMin(m_Face));
+    rtBBox.top = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_yMin(m_Face));
+    rtBBox.right = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_xMax(m_Face));
+    rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_yMax(m_Face));
+    return TRUE;
+}
+FX_INT32 CFPF_SkiaFont::GetHeight() const
+{
+    if (!m_Face) {
+        return 0;
+    }
+    return	FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face));
+}
+FX_INT32 CFPF_SkiaFont::GetItalicAngle() const
+{
+    if (!m_Face) {
+        return 0;
+    }
+    TT_Postscript *ttInfo = (TT_Postscript*)FT_Get_Sfnt_Table(m_Face, ft_sfnt_post);
+    if (ttInfo) {
+        return ttInfo->italicAngle;
+    }
+    return 0;
+}
+FX_DWORD CFPF_SkiaFont::GetFontData(FX_DWORD dwTable, FX_LPBYTE pBuffer, FX_DWORD dwSize)
+{
+    if (!m_Face) {
+        return FALSE;
+    }
+    if (FXFT_Load_Sfnt_Table(m_Face, dwTable, 0, pBuffer, (unsigned long*)&dwSize)) {
+        return 0;
+    }
+    return dwSize;
+}
+FX_BOOL CFPF_SkiaFont::InitFont(CFPF_SkiaFontMgr *pFontMgr, CFPF_SkiaFontDescriptor *pFontDes, FX_BSTR bsFamily, FX_DWORD dwStyle, FX_BYTE uCharset)
+{
+    if (!pFontMgr || !pFontDes) {
+        return FALSE;
+    }
+    switch (pFontDes->GetType()) {
+        case FPF_SKIAFONTTYPE_Path: {
+                CFPF_SkiaPathFont *pFont = (CFPF_SkiaPathFont*)pFontDes;
+                m_Face = pFontMgr->GetFontFace(pFont->m_pPath, pFont->m_iFaceIndex);
+            }
+            break;
+        case FPF_SKIAFONTTYPE_File: {
+                CFPF_SkiaFileFont *pFont = (CFPF_SkiaFileFont*)pFontDes;
+                m_Face = pFontMgr->GetFontFace(pFont->m_pFile, pFont->m_iFaceIndex);
+            }
+            break;
+        case FPF_SKIAFONTTYPE_Buffer: {
+                CFPF_SkiaBufferFont *pFont = (CFPF_SkiaBufferFont*)pFontDes;
+                m_Face = pFontMgr->GetFontFace((FX_LPCBYTE)pFont->m_pBuffer, pFont->m_szBuffer, pFont->m_iFaceIndex);
+            }
+            break;
+        default:
+            return FALSE;
+    }
+    if (!m_Face) {
+        return FALSE;
+    }
+    m_dwStyle = dwStyle;
+    m_uCharset = uCharset;
+    m_pFontMgr = pFontMgr;
+    m_pFontDes = pFontDes;
+    m_dwRefCount = 1;
+    return TRUE;
+}
+#endif
diff --git a/core/src/fxge/android/fpf_skiafont.h b/core/src/fxge/android/fpf_skiafont.h
new file mode 100644
index 0000000..1d1073c
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiafont.h
@@ -0,0 +1,57 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPF_SKIA_FONT_H_
+#define _FPF_SKIA_FONT_H_
+#if _FX_OS_ == _FX_ANDROID_
+class CFPF_SkiaFontDescriptor;
+class CFPF_SkiaFontMgr;
+class SkTypeface;
+class CFPF_SkiaFont : public IFPF_Font, public CFX_Object
+{
+public:
+    CFPF_SkiaFont();
+    virtual ~CFPF_SkiaFont();
+    virtual void			Release();
+    virtual IFPF_Font*		Retain();
+
+    virtual FPF_HFONT		GetHandle();
+
+    virtual CFX_ByteString	GetFamilyName();
+    virtual CFX_WideString	GetPsName();
+
+    virtual FX_DWORD		GetFontStyle() const
+    {
+        return m_dwStyle;
+    }
+    virtual FX_BYTE			GetCharset() const
+    {
+        return m_uCharset;
+    }
+
+    virtual FX_INT32		GetGlyphIndex(FX_WCHAR wUnicode);
+    virtual FX_INT32		GetGlyphWidth(FX_INT32 iGlyphIndex);
+
+    virtual FX_INT32		GetAscent() const;
+    virtual FX_INT32		GetDescent() const;
+
+    virtual FX_BOOL			GetGlyphBBox(FX_INT32 iGlyphIndex, FX_RECT &rtBBox);
+    virtual FX_BOOL			GetBBox(FX_RECT &rtBBox);
+
+    virtual FX_INT32		GetHeight() const;
+    virtual FX_INT32		GetItalicAngle() const;
+    virtual FX_DWORD		GetFontData(FX_DWORD dwTable, FX_LPBYTE pBuffer, FX_DWORD dwSize);
+    FX_BOOL					InitFont(CFPF_SkiaFontMgr *pFontMgr, CFPF_SkiaFontDescriptor *pFontDes, FX_BSTR bsFamily, FX_DWORD dwStyle, FX_BYTE uCharset);
+protected:
+    CFPF_SkiaFontMgr		*m_pFontMgr;
+    CFPF_SkiaFontDescriptor	*m_pFontDes;
+    FXFT_Face				m_Face;
+    FX_DWORD				m_dwStyle;
+    FX_BYTE					m_uCharset;
+    FX_DWORD				m_dwRefCount;
+};
+#endif
+#endif
diff --git a/core/src/fxge/android/fpf_skiafontmgr.cpp b/core/src/fxge/android/fpf_skiafontmgr.cpp
new file mode 100644
index 0000000..cf93e5b
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiafontmgr.cpp
@@ -0,0 +1,561 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+#define FPF_SKIAMATCHWEIGHT_NAME1	62
+#define FPF_SKIAMATCHWEIGHT_NAME2	60
+#define FPF_SKIAMATCHWEIGHT_1		16
+#define FPF_SKIAMATCHWEIGHT_2		8
+#include "fpf_skiafontmgr.h"
+#include "fpf_skiafont.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+static unsigned long FPF_SkiaStream_Read(FXFT_Stream stream, unsigned long offset, unsigned char* buffer, unsigned long count)
+{
+    IFX_FileRead *pFileRead = (IFX_FileRead*)stream->descriptor.pointer;
+    if (!pFileRead) {
+        return 0;
+    }
+    if (count > 0) {
+        if (pFileRead->ReadBlock(buffer, (FX_FILESIZE)offset, (size_t)count) != count) {
+            return 0;
+        }
+    }
+    return count;
+}
+static void FPF_SkiaStream_Close(FXFT_Stream stream)
+{
+}
+#ifdef __cplusplus
+};
+#endif
+typedef struct _FPF_SKIAFONTMAP {
+    FX_DWORD	dwFamily;
+    FX_DWORD	dwSubSt;
+} FPF_SKIAFONTMAP, *FPF_LPSKIAFONTMAP;
+typedef FPF_SKIAFONTMAP const * FPF_LPCSKIAFONTMAP;
+static const FPF_SKIAFONTMAP g_SkiaFontmap[] = {
+    {0x58c5083,		0xc8d2e345},
+    {0x5dfade2,		0xe1633081},
+    {0x684317d,		0xe1633081},
+    {0x14ee2d13,	0xc8d2e345},
+    {0x3918fe2d,	0xbbeeec72},
+    {0x3b98b31c,	0xe1633081},
+    {0x3d49f40e,	0xe1633081},
+    {0x432c41c5,	0xe1633081},
+    {0x491b6ad0,	0xe1633081},
+    {0x5612cab1,	0x59b9f8f1},
+    {0x779ce19d,	0xc8d2e345},
+    {0x7cc9510b,	0x59b9f8f1},
+    {0x83746053,	0xbbeeec72},
+    {0xaaa60c03,	0xbbeeec72},
+    {0xbf85ff26,	0xe1633081},
+    {0xc04fe601,	0xbbeeec72},
+    {0xca3812d5,	0x59b9f8f1},
+    {0xca383e15,	0x59b9f8f1},
+    {0xcad5eaf6,	0x59b9f8f1},
+    {0xcb7a04c8,	0xc8d2e345},
+    {0xfb4ce0de,	0xe1633081},
+};
+FX_DWORD FPF_SkiaGetSubstFont(FX_DWORD dwHash)
+{
+    FX_INT32 iStart = 0;
+    FX_INT32 iEnd = sizeof(g_SkiaFontmap) / sizeof(FPF_SKIAFONTMAP);
+    while (iStart <= iEnd) {
+        FX_INT32 iMid = (iStart + iEnd) / 2;
+        FPF_LPCSKIAFONTMAP pItem = &g_SkiaFontmap[iMid];
+        if (dwHash < pItem->dwFamily) {
+            iEnd = iMid - 1;
+        } else if (dwHash > pItem->dwFamily) {
+            iStart = iMid + 1;
+        } else {
+            return pItem->dwSubSt;
+        }
+    }
+    return NULL;
+}
+static const FPF_SKIAFONTMAP g_SkiaSansFontMap[] = {
+    {0x58c5083,		0xd5b8d10f},
+    {0x14ee2d13,	0xd5b8d10f},
+    {0x779ce19d,	0xd5b8d10f},
+    {0xcb7a04c8,	0xd5b8d10f},
+    {0xfb4ce0de,	0xd5b8d10f},
+};
+FX_DWORD FPF_SkiaGetSansFont(FX_DWORD dwHash)
+{
+    FX_INT32 iStart = 0;
+    FX_INT32 iEnd = sizeof(g_SkiaSansFontMap) / sizeof(FPF_SKIAFONTMAP);
+    while (iStart <= iEnd) {
+        FX_INT32 iMid = (iStart + iEnd) / 2;
+        FPF_LPCSKIAFONTMAP pItem = &g_SkiaSansFontMap[iMid];
+        if (dwHash < pItem->dwFamily) {
+            iEnd = iMid - 1;
+        } else if (dwHash > pItem->dwFamily) {
+            iStart = iMid + 1;
+        } else {
+            return pItem->dwSubSt;
+        }
+    }
+    return 0;
+}
+static FX_UINT32 FPF_GetHashCode_StringA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase = FALSE)
+{
+    if (!pStr) {
+        return 0;
+    }
+    if (iLength < 0) {
+        iLength = FXSYS_strlen(pStr);
+    }
+    FX_LPCSTR pStrEnd = pStr + iLength;
+    FX_UINT32 uHashCode = 0;
+    if (bIgnoreCase) {
+        while (pStr < pStrEnd) {
+            uHashCode = 31 * uHashCode + FXSYS_tolower(*pStr++);
+        }
+    } else {
+        while (pStr < pStrEnd) {
+            uHashCode = 31 * uHashCode + *pStr ++;
+        }
+    }
+    return uHashCode;
+}
+enum FPF_SKIACHARSET {
+    FPF_SKIACHARSET_Ansi			= 1 << 0,
+    FPF_SKIACHARSET_Default			= 1 << 1,
+    FPF_SKIACHARSET_Symbol			= 1 << 2,
+    FPF_SKIACHARSET_ShiftJIS		= 1 << 3,
+    FPF_SKIACHARSET_Korean			= 1 << 4,
+    FPF_SKIACHARSET_Johab			= 1 << 5,
+    FPF_SKIACHARSET_GB2312			= 1 << 6,
+    FPF_SKIACHARSET_BIG5			= 1 << 7,
+    FPF_SKIACHARSET_Greek			= 1 << 8,
+    FPF_SKIACHARSET_Turkish			= 1 << 9,
+    FPF_SKIACHARSET_Vietnamese		= 1 << 10,
+    FPF_SKIACHARSET_Hebrew			= 1 << 11,
+    FPF_SKIACHARSET_Arabic			= 1 << 12,
+    FPF_SKIACHARSET_Baltic			= 1 << 13,
+    FPF_SKIACHARSET_Cyrillic		= 1 << 14,
+    FPF_SKIACHARSET_Thai			= 1 << 15,
+    FPF_SKIACHARSET_EeasternEuropean = 1 << 16,
+    FPF_SKIACHARSET_PC				= 1 << 17,
+    FPF_SKIACHARSET_OEM				= 1 << 18,
+};
+static FX_DWORD FPF_SkiaGetCharset(FX_BYTE uCharset)
+{
+    switch (uCharset) {
+        case FXFONT_ANSI_CHARSET:
+            return FPF_SKIACHARSET_Ansi;
+        case FXFONT_DEFAULT_CHARSET:
+            return FPF_SKIACHARSET_Default;
+        case FXFONT_SYMBOL_CHARSET:
+            return FPF_SKIACHARSET_Symbol;
+        case FXFONT_SHIFTJIS_CHARSET:
+            return FPF_SKIACHARSET_ShiftJIS;
+        case FXFONT_HANGEUL_CHARSET:
+            return FPF_SKIACHARSET_Korean;
+        case FXFONT_GB2312_CHARSET:
+            return FPF_SKIACHARSET_GB2312;
+        case FXFONT_CHINESEBIG5_CHARSET:
+            return FPF_SKIACHARSET_BIG5;
+        case FXFONT_GREEK_CHARSET:
+            return FPF_SKIACHARSET_Greek;
+        case FXFONT_TURKISH_CHARSET:
+            return FPF_SKIACHARSET_Turkish;
+        case FXFONT_HEBREW_CHARSET:
+            return FPF_SKIACHARSET_Hebrew;
+        case FXFONT_ARABIC_CHARSET:
+            return FPF_SKIACHARSET_Arabic;
+        case FXFONT_BALTIC_CHARSET:
+            return FPF_SKIACHARSET_Baltic;
+        case FXFONT_RUSSIAN_CHARSET:
+            return FPF_SKIACHARSET_Cyrillic;
+        case FXFONT_THAI_CHARSET:
+            return FPF_SKIACHARSET_Thai;
+        case FXFONT_EASTEUROPE_CHARSET:
+            return FPF_SKIACHARSET_EeasternEuropean;
+    }
+    return FPF_SKIACHARSET_Default;
+}
+static FX_DWORD FPF_SKIANormalizeFontName(FX_BSTR bsfamily)
+{
+    FX_DWORD dwHash = 0;
+    FX_INT32 iLength = bsfamily.GetLength();
+    FX_LPCSTR pBuffer = bsfamily.GetCStr();
+    for (FX_INT32 i = 0; i < iLength; i++) {
+        FX_CHAR ch = pBuffer[i];
+        if (ch == ' ' || ch == '-' || ch == ',') {
+            continue;
+        }
+        dwHash = 31 * dwHash + FXSYS_tolower(ch);
+    }
+    return dwHash;
+}
+static FX_DWORD	FPF_SKIAGetFamilyHash(FX_BSTR bsFamily, FX_DWORD dwStyle, FX_BYTE uCharset)
+{
+    CFX_ByteString bsFont(bsFamily);
+    if (dwStyle & FXFONT_BOLD) {
+        bsFont += "Bold";
+    }
+    if (dwStyle & FXFONT_ITALIC) {
+        bsFont += "Italic";
+    }
+    if (dwStyle & FXFONT_SERIF)	{
+        bsFont += "Serif";
+    }
+    bsFont += uCharset;
+    return FPF_GetHashCode_StringA((FX_LPCSTR)bsFont, bsFont.GetLength(), TRUE);
+}
+static FX_BOOL FPF_SkiaIsCJK(FX_BYTE uCharset)
+{
+    return (uCharset == FXFONT_GB2312_CHARSET) || (uCharset == FXFONT_CHINESEBIG5_CHARSET)
+           || (uCharset == FXFONT_HANGEUL_CHARSET) || (uCharset == FXFONT_SHIFTJIS_CHARSET);
+}
+static FX_BOOL FPF_SkiaMaybeSymbol(FX_BSTR bsFacename)
+{
+    CFX_ByteString bsName = bsFacename;
+    bsName.MakeLower();
+    return bsName.Find("symbol") > -1;
+}
+static FX_BOOL FPF_SkiaMaybeArabic(FX_BSTR bsFacename)
+{
+    CFX_ByteString bsName = bsFacename;
+    bsName.MakeLower();
+    return bsName.Find("arabic") > -1;
+}
+CFPF_SkiaFontMgr::CFPF_SkiaFontMgr()
+    : m_bLoaded(FALSE), m_FTLibrary(NULL)
+{
+}
+CFPF_SkiaFontMgr::~CFPF_SkiaFontMgr()
+{
+    void *pkey = NULL;
+    CFPF_SkiaFont *pValue = NULL;
+    FX_POSITION pos = m_FamilyFonts.GetStartPosition();
+    while (pos) {
+        m_FamilyFonts.GetNextAssoc(pos, pkey, (void*&)pValue);
+        if (pValue) {
+            pValue->Release();
+        }
+    }
+    m_FamilyFonts.RemoveAll();
+    for (FX_INT32 i = m_FontFaces.GetUpperBound(); i >= 0; i--) {
+        CFPF_SkiaFontDescriptor *pFont = (CFPF_SkiaFontDescriptor*)m_FontFaces.ElementAt(i);
+        if (pFont) {
+            delete pFont;
+        }
+    }
+    m_FontFaces.RemoveAll();
+    if (m_FTLibrary) {
+        FXFT_Done_FreeType(m_FTLibrary);
+    }
+}
+FX_BOOL CFPF_SkiaFontMgr::InitFTLibrary()
+{
+    if (m_FTLibrary == NULL) {
+        FXFT_Init_FreeType(&m_FTLibrary);
+    }
+    return m_FTLibrary != NULL;
+}
+void CFPF_SkiaFontMgr::LoadSystemFonts()
+{
+    if (m_bLoaded) {
+        return;
+    }
+    ScanPath(FX_BSTRC("/system/fonts"));
+    OutputSystemFonts();
+    m_bLoaded = TRUE;
+}
+void CFPF_SkiaFontMgr::LoadPrivateFont(IFX_FileRead* pFontFile)
+{
+}
+void CFPF_SkiaFontMgr::LoadPrivateFont(FX_BSTR bsFileName)
+{
+}
+void CFPF_SkiaFontMgr::LoadPrivateFont(FX_LPVOID pBuffer, size_t szBuffer)
+{
+}
+IFPF_Font* CFPF_SkiaFontMgr::CreateFont(FX_BSTR bsFamilyname, FX_BYTE uCharset, FX_DWORD dwStyle, FX_DWORD dwMatch)
+{
+    FX_DWORD dwHash = FPF_SKIAGetFamilyHash(bsFamilyname, dwStyle, uCharset);
+    IFPF_Font *pFont = NULL;
+    if (m_FamilyFonts.Lookup((void*)dwHash, (void*&)pFont)) {
+        if (pFont) {
+            return pFont->Retain();
+        }
+    }
+    FX_DWORD dwFaceName = FPF_SKIANormalizeFontName(bsFamilyname);
+    FX_DWORD dwSubst = FPF_SkiaGetSubstFont(dwFaceName);
+    FX_DWORD dwSubstSans = FPF_SkiaGetSansFont(dwFaceName);
+    FX_BOOL bMaybeSymbol = FPF_SkiaMaybeSymbol(bsFamilyname);
+    if (uCharset != FXFONT_ARABIC_CHARSET && FPF_SkiaMaybeArabic(bsFamilyname)) {
+        uCharset = FXFONT_ARABIC_CHARSET;
+    } else if (uCharset == FXFONT_ANSI_CHARSET && (dwMatch & FPF_MATCHFONT_REPLACEANSI)) {
+        uCharset = FXFONT_DEFAULT_CHARSET;
+    }
+    FX_INT32 nExpectVal = FPF_SKIAMATCHWEIGHT_NAME1 + FPF_SKIAMATCHWEIGHT_1 * 3 + FPF_SKIAMATCHWEIGHT_2 * 2;
+    FX_INT32 nItem = -1;
+    FX_INT32 nMax = -1;
+    FX_INT32 nGlyphNum = 0;
+    for (FX_INT32 i = m_FontFaces.GetUpperBound(); i >= 0; i--) {
+        CFPF_SkiaPathFont *pFontDes = (CFPF_SkiaPathFont*)m_FontFaces.ElementAt(i);
+        if(!(pFontDes->m_dwCharsets & FPF_SkiaGetCharset(uCharset))) {
+            continue;
+        }
+        FX_INT32 nFind = 0;
+        FX_DWORD dwSysFontName = FPF_SKIANormalizeFontName(pFontDes->m_pFamily);
+        if (dwFaceName == dwSysFontName) {
+            nFind += FPF_SKIAMATCHWEIGHT_NAME1;
+        }
+        FX_BOOL bMatchedName = (nFind == FPF_SKIAMATCHWEIGHT_NAME1);
+        if ((dwStyle & FXFONT_BOLD) == (pFontDes->m_dwStyle & FXFONT_BOLD)) {
+            nFind += FPF_SKIAMATCHWEIGHT_1;
+        }
+        if ((dwStyle & FXFONT_ITALIC) == (pFontDes->m_dwStyle & FXFONT_ITALIC)) {
+            nFind += FPF_SKIAMATCHWEIGHT_1;
+        }
+        if ((dwStyle & FXFONT_FIXED_PITCH) == (pFontDes->m_dwStyle & FXFONT_FIXED_PITCH)) {
+            nFind += FPF_SKIAMATCHWEIGHT_2;
+        }
+        if ((dwStyle & FXFONT_SERIF) == (pFontDes->m_dwStyle & FXFONT_SERIF)) {
+            nFind += FPF_SKIAMATCHWEIGHT_1;
+        }
+        if ((dwStyle & FXFONT_SCRIPT) == (pFontDes->m_dwStyle & FXFONT_SCRIPT)) {
+            nFind += FPF_SKIAMATCHWEIGHT_2;
+        }
+        if (dwSubst == dwSysFontName || dwSubstSans == dwSysFontName) {
+            nFind += FPF_SKIAMATCHWEIGHT_NAME2;
+            bMatchedName = TRUE;
+        }
+        if (uCharset == FXFONT_DEFAULT_CHARSET || bMaybeSymbol) {
+            if (nFind > nMax && bMatchedName) {
+                nMax = nFind;
+                nItem = i;
+            }
+        } else if (FPF_SkiaIsCJK(uCharset)) {
+            if (bMatchedName || pFontDes->m_iGlyphNum > nGlyphNum) {
+                nItem = i;
+                nGlyphNum = pFontDes->m_iGlyphNum;
+            }
+        } else if (nFind > nMax) {
+            nMax = nFind;
+            nItem = i;
+        }
+        if (nExpectVal <= nFind) {
+            nItem = i;
+            break;
+        }
+    }
+    if (nItem > -1) {
+        CFPF_SkiaFontDescriptor *pFontDes = (CFPF_SkiaFontDescriptor*)m_FontFaces.ElementAt(nItem);
+        CFPF_SkiaFont *pFont = FX_NEW CFPF_SkiaFont;
+        if (pFont) {
+            if (pFont->InitFont(this, pFontDes, bsFamilyname, dwStyle, uCharset)) {
+                m_FamilyFonts.SetAt((void*)dwHash, (void*)pFont);
+                return pFont->Retain();
+            }
+            pFont->Release();
+            pFont = NULL;
+        }
+        return pFont;
+    }
+    return NULL;
+}
+FXFT_Face CFPF_SkiaFontMgr::GetFontFace(IFX_FileRead *pFileRead, FX_INT32 iFaceIndex)
+{
+    if (!pFileRead) {
+        return NULL;
+    }
+    if (pFileRead->GetSize() == 0) {
+        return NULL;
+    }
+    if (iFaceIndex < 0) {
+        return NULL;
+    }
+    FXFT_StreamRec streamRec;
+    FXSYS_memset32(&streamRec, 0, sizeof(FXFT_StreamRec));
+    streamRec.size = pFileRead->GetSize();
+    streamRec.descriptor.pointer = pFileRead;
+    streamRec.read = FPF_SkiaStream_Read;
+    streamRec.close = FPF_SkiaStream_Close;
+    FXFT_Open_Args args;
+    args.flags = FT_OPEN_STREAM;
+    args.stream = &streamRec;
+    FXFT_Face face;
+    if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {
+        return NULL;
+    }
+    FXFT_Set_Pixel_Sizes(face, 0, 64);
+    return face;
+}
+FXFT_Face CFPF_SkiaFontMgr::GetFontFace(FX_BSTR bsFile, FX_INT32 iFaceIndex )
+{
+    if (bsFile.IsEmpty()) {
+        return NULL;
+    }
+    if (iFaceIndex < 0) {
+        return NULL;
+    }
+    FXFT_Open_Args args;
+    args.flags = FT_OPEN_PATHNAME;
+    args.pathname = (FT_String*)bsFile.GetCStr();
+    FXFT_Face face;
+    if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {
+        return FALSE;
+    }
+    FXFT_Set_Pixel_Sizes(face, 0, 64);
+    return face;
+}
+FXFT_Face CFPF_SkiaFontMgr::GetFontFace(FX_LPCBYTE pBuffer, size_t szBuffer, FX_INT32 iFaceIndex )
+{
+    if (!pBuffer || szBuffer < 1) {
+        return NULL;
+    }
+    if (iFaceIndex < 0) {
+        return NULL;
+    }
+    FXFT_Open_Args args;
+    args.flags = FT_OPEN_MEMORY;
+    args.memory_base = pBuffer;
+    args.memory_size = szBuffer;
+    FXFT_Face face;
+    if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {
+        return FALSE;
+    }
+    FXFT_Set_Pixel_Sizes(face, 0, 64);
+    return face;
+}
+void CFPF_SkiaFontMgr::ScanPath(FX_BSTR path)
+{
+    void *handle = FX_OpenFolder(path.GetCStr());
+    if (!handle) {
+        return;
+    }
+    CFX_ByteString filename;
+    FX_BOOL	bFolder = FALSE;
+    while (FX_GetNextFile(handle, filename, bFolder)) {
+        if (bFolder) {
+            if (filename == FX_BSTRC(".") || filename == FX_BSTRC("..")) {
+                continue;
+            }
+        } else {
+            CFX_ByteString ext = filename.Right(4);
+            ext.MakeLower();
+            if (ext != FX_BSTRC(".ttf") && ext != FX_BSTRC(".ttc")) {
+                continue;
+            }
+        }
+        CFX_ByteString fullpath = path;
+        fullpath += "/";
+        fullpath += filename;
+        if (bFolder) {
+            ScanPath(fullpath);
+        } else {
+            ScanFile(fullpath);
+        }
+    }
+    FX_CloseFolder(handle);
+}
+void CFPF_SkiaFontMgr::ScanFile(FX_BSTR file)
+{
+    FXFT_Face face = GetFontFace(file);
+    if (face) {
+        CFPF_SkiaPathFont *pFontDesc = FX_NEW CFPF_SkiaPathFont;
+        if (!pFontDesc) {
+            return;
+        }
+        pFontDesc->SetPath(file.GetCStr());
+        ReportFace(face, pFontDesc);
+        m_FontFaces.Add(pFontDesc);
+        FXFT_Done_Face(face);
+    }
+}
+static const FX_DWORD g_FPFSkiaFontCharsets [] = {
+    FPF_SKIACHARSET_Ansi,
+    FPF_SKIACHARSET_EeasternEuropean,
+    FPF_SKIACHARSET_Cyrillic,
+    FPF_SKIACHARSET_Greek,
+    FPF_SKIACHARSET_Turkish,
+    FPF_SKIACHARSET_Hebrew,
+    FPF_SKIACHARSET_Arabic,
+    FPF_SKIACHARSET_Baltic,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    FPF_SKIACHARSET_Thai,
+    FPF_SKIACHARSET_ShiftJIS,
+    FPF_SKIACHARSET_GB2312,
+    FPF_SKIACHARSET_Korean,
+    FPF_SKIACHARSET_BIG5,
+    FPF_SKIACHARSET_Johab,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    FPF_SKIACHARSET_OEM,
+    FPF_SKIACHARSET_Symbol,
+};
+static FX_DWORD FPF_SkiaGetFaceCharset(TT_OS2 *pOS2)
+{
+    FX_DWORD dwCharset = 0;
+    if (pOS2) {
+        for (FX_INT32 i = 0; i < 32; i++) {
+            if (pOS2->ulCodePageRange1 & (1 << i)) {
+                dwCharset |= g_FPFSkiaFontCharsets[i];
+            }
+        }
+    }
+    dwCharset |= FPF_SKIACHARSET_Default;
+    return dwCharset;
+}
+void CFPF_SkiaFontMgr::ReportFace(FXFT_Face face, CFPF_SkiaFontDescriptor *pFontDesc)
+{
+    if (!face || !pFontDesc) {
+        return;
+    }
+    pFontDesc->SetFamily(FXFT_Get_Face_Family_Name(face));
+    if (FXFT_Is_Face_Bold(face))	{
+        pFontDesc->m_dwStyle |= FXFONT_BOLD;
+    }
+    if (FXFT_Is_Face_Italic(face))	{
+        pFontDesc->m_dwStyle |= FXFONT_ITALIC;
+    }
+    if (FT_IS_FIXED_WIDTH(face))	{
+        pFontDesc->m_dwStyle |= FXFONT_FIXED_PITCH;
+    }
+    TT_OS2 *pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(face, ft_sfnt_os2);
+    if (pOS2) {
+        if (pOS2->ulCodePageRange1 & (1 << 31)) {
+            pFontDesc->m_dwStyle |= FXFONT_SYMBOLIC;
+        }
+        if (pOS2->panose[0] == 2) {
+            FX_BYTE uSerif = pOS2->panose[1];
+            if ((uSerif > 1 && uSerif < 10) || uSerif > 13) {
+                pFontDesc->m_dwStyle |= FXFONT_SERIF;
+            }
+        }
+    }
+    if (pOS2 && (pOS2->ulCodePageRange1 & (1 << 31))) {
+        pFontDesc->m_dwStyle |= FXFONT_SYMBOLIC;
+    }
+    pFontDesc->m_dwCharsets = FPF_SkiaGetFaceCharset(pOS2);
+    pFontDesc->m_iFaceIndex = face->face_index;
+    pFontDesc->m_iGlyphNum = face->num_glyphs;
+}
+void CFPF_SkiaFontMgr::OutputSystemFonts()
+{
+}
+#endif
diff --git a/core/src/fxge/android/fpf_skiafontmgr.h b/core/src/fxge/android/fpf_skiafontmgr.h
new file mode 100644
index 0000000..472fbbd
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiafontmgr.h
@@ -0,0 +1,117 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPF_SKIA_FONTMGR_H_
+#define _FPF_SKIA_FONTMGR_H_
+#if _FX_OS_ == _FX_ANDROID_
+#define FPF_SKIAFONTTYPE_Unknown	0
+#define	FPF_SKIAFONTTYPE_Path		1
+#define FPF_SKIAFONTTYPE_File		2
+#define FPF_SKIAFONTTYPE_Buffer		3
+class CFPF_SkiaFontDescriptor : public CFX_Object
+{
+public:
+    CFPF_SkiaFontDescriptor() : m_pFamily(NULL), m_dwStyle(0), m_iFaceIndex(0), m_dwCharsets(0), m_iGlyphNum(0) {}
+    virtual ~CFPF_SkiaFontDescriptor()
+    {
+        if (m_pFamily) {
+            FX_Free(m_pFamily);
+        }
+    }
+    virtual	FX_INT32	GetType() const
+    {
+        return FPF_SKIAFONTTYPE_Unknown;
+    }
+    void				SetFamily(FX_LPCSTR pFamily)
+    {
+        if (m_pFamily) {
+            FX_Free(m_pFamily);
+        }
+        FX_INT32 iSize = FXSYS_strlen(pFamily);
+        m_pFamily = FX_Alloc(FX_CHAR, iSize + 1);
+        FXSYS_memcpy32(m_pFamily, pFamily, iSize * sizeof(FX_CHAR));
+        m_pFamily[iSize] = 0;
+    }
+    FX_LPSTR		m_pFamily;
+    FX_DWORD		m_dwStyle;
+    FX_INT32		m_iFaceIndex;
+    FX_DWORD		m_dwCharsets;
+    FX_INT32		m_iGlyphNum;
+};
+class CFPF_SkiaPathFont : public CFPF_SkiaFontDescriptor
+{
+public:
+    CFPF_SkiaPathFont() : m_pPath(NULL) {}
+    virtual ~CFPF_SkiaPathFont()
+    {
+        if (m_pPath) {
+            FX_Free(m_pPath);
+        }
+    }
+    virtual	FX_INT32	GetType() const
+    {
+        return FPF_SKIAFONTTYPE_Path;
+    }
+    void				SetPath(FX_LPCSTR pPath)
+    {
+        if (m_pPath) {
+            FX_Free(m_pPath);
+        }
+        FX_INT32 iSize = FXSYS_strlen(pPath);
+        m_pPath = FX_Alloc(FX_CHAR, iSize + 1);
+        FXSYS_memcpy32(m_pPath, pPath, iSize * sizeof(FX_CHAR));
+        m_pPath[iSize] = 0;
+    }
+    FX_LPSTR		m_pPath;
+};
+class CFPF_SkiaFileFont : public CFPF_SkiaFontDescriptor
+{
+public:
+    CFPF_SkiaFileFont() : m_pFile(NULL) {}
+    virtual FX_INT32	GetType() const
+    {
+        return FPF_SKIAFONTTYPE_File;
+    }
+    IFX_FileRead		*m_pFile;
+};
+class CFPF_SkiaBufferFont : public CFPF_SkiaFontDescriptor
+{
+public:
+    CFPF_SkiaBufferFont() : m_pBuffer(NULL), m_szBuffer(0) {}
+    virtual FX_INT32	GetType() const
+    {
+        return FPF_SKIAFONTTYPE_Buffer;
+    }
+    FX_LPVOID			m_pBuffer;
+    size_t				m_szBuffer;
+};
+class CFPF_SkiaFontMgr : public IFPF_FontMgr, public CFX_Object
+{
+public:
+    CFPF_SkiaFontMgr();
+    virtual ~CFPF_SkiaFontMgr();
+    FX_BOOL					InitFTLibrary();
+    virtual void			LoadSystemFonts();
+    virtual void			LoadPrivateFont(IFX_FileRead* pFontFile);
+    virtual void			LoadPrivateFont(FX_BSTR bsFileName);
+    virtual void			LoadPrivateFont(FX_LPVOID pBuffer, size_t szBuffer);
+
+    virtual IFPF_Font*		CreateFont(FX_BSTR bsFamilyname, FX_BYTE uCharset, FX_DWORD dwStyle, FX_DWORD dwMatch = 0);
+    FXFT_Face				GetFontFace(IFX_FileRead *pFileRead, FX_INT32 iFaceIndex = 0);
+    FXFT_Face				GetFontFace(FX_BSTR bsFile, FX_INT32 iFaceIndex = 0);
+    FXFT_Face				GetFontFace(FX_LPCBYTE pBuffer, size_t szBuffer, FX_INT32 iFaceIndex = 0);
+protected:
+    void				ScanPath(FX_BSTR path);
+    void				ScanFile(FX_BSTR file);
+    void				ReportFace(FXFT_Face face, CFPF_SkiaFontDescriptor *pFontDesc);
+    void				OutputSystemFonts();
+    FX_BOOL				m_bLoaded;
+    CFX_PtrArray		m_FontFaces;
+    FXFT_Library		m_FTLibrary;
+    CFX_MapPtrToPtr		m_FamilyFonts;
+};
+#endif
+#endif
diff --git a/core/src/fxge/android/fpf_skiamodule.cpp b/core/src/fxge/android/fpf_skiamodule.cpp
new file mode 100644
index 0000000..94e6888
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiamodule.cpp
@@ -0,0 +1,46 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+#include "fpf_skiamodule.h"
+#include "fpf_skiafontmgr.h"
+static IFPF_DeviceModule *gs_pPFModule = NULL;
+IFPF_DeviceModule* FPF_GetDeviceModule()
+{
+    if (!gs_pPFModule) {
+        gs_pPFModule = FX_NEW CFPF_SkiaDeviceModule;
+    }
+    return gs_pPFModule;
+}
+CFPF_SkiaDeviceModule::~CFPF_SkiaDeviceModule()
+{
+    if (m_pFontMgr) {
+        delete m_pFontMgr;
+    }
+}
+void CFPF_SkiaDeviceModule::Destroy()
+{
+    if (gs_pPFModule) {
+        delete (CFPF_SkiaDeviceModule*)gs_pPFModule;
+        gs_pPFModule = NULL;
+    }
+}
+IFPF_FontMgr* CFPF_SkiaDeviceModule::GetFontMgr()
+{
+    if (!m_pFontMgr) {
+        m_pFontMgr = FX_NEW CFPF_SkiaFontMgr;
+        if (!m_pFontMgr) {
+            return NULL;
+        }
+        if (!m_pFontMgr->InitFTLibrary()) {
+            delete m_pFontMgr;
+            return NULL;
+        }
+    }
+    return (IFPF_FontMgr*)m_pFontMgr;
+}
+#endif
diff --git a/core/src/fxge/android/fpf_skiamodule.h b/core/src/fxge/android/fpf_skiamodule.h
new file mode 100644
index 0000000..c3a78bf
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiamodule.h
@@ -0,0 +1,22 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPF_MODULE_H_
+#define _FPF_MODULE_H_
+#if _FX_OS_ == _FX_ANDROID_
+class CFPF_SkiaFontMgr;
+class CFPF_SkiaDeviceModule : public IFPF_DeviceModule, public CFX_Object
+{
+public:
+    CFPF_SkiaDeviceModule() : m_pFontMgr(NULL) {}
+    virtual ~CFPF_SkiaDeviceModule();
+    virtual void				Destroy();
+    virtual IFPF_FontMgr*		GetFontMgr();
+protected:
+    CFPF_SkiaFontMgr	*m_pFontMgr;
+};
+#endif
+#endif
diff --git a/core/src/fxge/android/fx_android_font.cpp b/core/src/fxge/android/fx_android_font.cpp
new file mode 100644
index 0000000..5f8aafc
--- /dev/null
+++ b/core/src/fxge/android/fx_android_font.cpp
@@ -0,0 +1,87 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+CFX_AndroidFontInfo::CFX_AndroidFontInfo()
+    : m_pFontMgr(NULL)
+{
+}
+FX_BOOL CFX_AndroidFontInfo::Init(IFPF_FontMgr *pFontMgr)
+{
+    if (!pFontMgr) {
+        return FALSE;
+    }
+    pFontMgr->LoadSystemFonts();
+    m_pFontMgr = pFontMgr;
+    return TRUE;
+}
+FX_BOOL CFX_AndroidFontInfo::EnumFontList(CFX_FontMapper* pMapper)
+{
+    return FALSE;
+}
+void* CFX_AndroidFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact)
+{
+    if (!m_pFontMgr) {
+        return NULL;
+    }
+    FX_DWORD dwStyle = 0;
+    if (weight >= 700) {
+        dwStyle |= FXFONT_BOLD;
+    }
+    if (bItalic) {
+        dwStyle |= FXFONT_ITALIC;
+    }
+    if (pitch_family & FXFONT_FF_FIXEDPITCH) {
+        dwStyle |= FXFONT_FIXED_PITCH;
+    }
+    if (pitch_family & FXFONT_FF_SCRIPT) {
+        dwStyle |= FXFONT_SCRIPT;
+    }
+    if (pitch_family & FXFONT_FF_ROMAN) {
+        dwStyle |= FXFONT_SERIF;
+    }
+    return m_pFontMgr->CreateFont(face, charset, dwStyle, FPF_MATCHFONT_REPLACEANSI);
+}
+void* CFX_AndroidFontInfo::GetFont(FX_LPCSTR face)
+{
+    return NULL;
+}
+FX_DWORD CFX_AndroidFontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)
+{
+    if (!hFont) {
+        return 0;
+    }
+    return ((IFPF_Font*)hFont)->GetFontData(table, buffer, size);
+}
+FX_BOOL CFX_AndroidFontInfo::GetFaceName(void* hFont, CFX_ByteString& name)
+{
+    if (!hFont) {
+        return FALSE;
+    }
+    name = ((IFPF_Font*)hFont)->GetFamilyName();
+    return TRUE;
+}
+FX_BOOL CFX_AndroidFontInfo::GetFontCharset(void* hFont, int& charset)
+{
+    if (!hFont) {
+        return FALSE;
+    }
+    charset = ((IFPF_Font*)hFont)->GetCharset();
+    return FALSE;
+}
+void CFX_AndroidFontInfo::DeleteFont(void* hFont)
+{
+    if (!hFont) {
+        return;
+    }
+    ((IFPF_Font*)hFont)->Release();
+}
+void* CFX_AndroidFontInfo::RetainFont(void* hFont)
+{
+    return NULL;
+}
+#endif
diff --git a/core/src/fxge/android/fx_android_font.h b/core/src/fxge/android/fx_android_font.h
new file mode 100644
index 0000000..b6bfdf9
--- /dev/null
+++ b/core/src/fxge/android/fx_android_font.h
@@ -0,0 +1,36 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_ANDROID_FONT_H_
+#define _FX_ANDROID_FONT_H_
+#if _FX_OS_ == _FX_ANDROID_
+class IFPF_FontMgr;
+class CFX_AndroidFontInfo : public IFX_SystemFontInfo
+{
+public:
+    CFX_AndroidFontInfo();
+    virtual void		Release()
+    {
+        delete this;
+    }
+
+    virtual	FX_BOOL		EnumFontList(CFX_FontMapper* pMapper);
+
+    virtual void*		MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);
+
+    virtual void*		GetFont(FX_LPCSTR face);
+    virtual FX_DWORD	GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);
+    virtual FX_BOOL		GetFaceName(void* hFont, CFX_ByteString& name);
+    virtual FX_BOOL		GetFontCharset(void* hFont, int& charset);
+
+    virtual void		DeleteFont(void* hFont);
+    virtual void*       RetainFont(void* hFont);
+    FX_BOOL				Init(IFPF_FontMgr *pFontMgr);
+protected:
+    IFPF_FontMgr		*m_pFontMgr;
+};
+#endif
+#endif
diff --git a/core/src/fxge/android/fx_android_imp.cpp b/core/src/fxge/android/fx_android_imp.cpp
new file mode 100644
index 0000000..528877e
--- /dev/null
+++ b/core/src/fxge/android/fx_android_imp.cpp
@@ -0,0 +1,32 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+void CFX_GEModule::InitPlatform()
+{
+    IFPF_DeviceModule *pDeviceModule = FPF_GetDeviceModule();
+    if (!pDeviceModule) {
+        return;
+    }
+    IFPF_FontMgr *pFontMgr = pDeviceModule->GetFontMgr();
+    if (pFontMgr) {
+        CFX_AndroidFontInfo *pFontInfo = FX_NEW CFX_AndroidFontInfo;
+        if (!pFontInfo) {
+            return;
+        }
+        pFontInfo->Init(pFontMgr);
+        m_pFontMgr->SetSystemFontInfo(pFontInfo);
+    }
+    m_pPlatformData = pDeviceModule;
+}
+void CFX_GEModule::DestroyPlatform()
+{
+    if (m_pPlatformData) {
+        ((IFPF_DeviceModule*)m_pPlatformData)->Destroy();
+    }
+}
+#endif
diff --git a/core/src/fxge/android/fx_fpf.h b/core/src/fxge/android/fx_fpf.h
new file mode 100644
index 0000000..1108fff
--- /dev/null
+++ b/core/src/fxge/android/fx_fpf.h
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_FPF_H_
+#define _FX_FPF_H_
+#include "../../../include/fxcrt/fx_ext.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "../../../include/fxge/fpf.h"
+#include "fx_android_font.h"
+#endif
diff --git a/core/src/fxge/apple/apple_int.h b/core/src/fxge/apple/apple_int.h
new file mode 100644
index 0000000..5c42f1b
--- /dev/null
+++ b/core/src/fxge/apple/apple_int.h
@@ -0,0 +1,246 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _APPLE_INT_H_

+#define _APPLE_INT_H_

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+#if _FX_OS_ == _FX_MACOSX_

+#include <Carbon/Carbon.h>

+#endif

+typedef enum eFXIOSFONTCHARSET {

+    eFXFontCharsetDEFAULT       =   0,

+    eFXFontCharsetANSI          =   1,

+    eFXFontCharsetSYMBOL        =   1 << 1,

+    eFXFontCharsetSHIFTJIS      =   1 << 2,

+    eFXFontCharsetHANGEUL       =   1 << 3,

+    eFXFontCharsetGB2312        =   1 << 4,

+    eFXFontCharsetCHINESEBIG5   =   1 << 5,

+    eFXFontCharsetTHAI          =   1 << 6,

+    eFXFontCharsetEASTEUROPE    =   1 << 7,

+    eFXFontCharsetRUSSIAN       =   1 << 8,

+    eFXFontCharsetGREEK         =   1 << 9,

+    eFXFontCharsetTURKISH       =   1 << 10,

+    eFXFontCharsetHEBREW        =   1 << 11,

+    eFXFontCharsetARABIC        =   1 << 12,

+    eFXFontCharsetBALTIC        =   1 << 13,

+} FX_IOSCHARSET;

+FX_IOSCHARSET FX_GetiOSCharset(int charset);

+typedef enum eFXIOSFONTFLAG {

+    eFXFontFlagBold         =  1,

+    eFXFontFlagItalic       =  1 << 1,

+    eFXFontFlagFixedPitch   =  1 << 2,

+    eFXFontFlagSerif        =  1 << 3,

+    eFXFontFlagScript       =  1 << 4,

+} FX_IOSFONTFLAG;

+typedef struct _IOS_FONTDATA {

+    FX_DWORD        nHashCode;

+    const char*       psName;

+    FX_DWORD        charsets;

+    FX_DWORD        styles;

+} IOS_FONTDATA;

+class CQuartz2D

+{

+public:

+    void*	createGraphics(CFX_DIBitmap* bitmap);

+    void	destroyGraphics(void* graphics);

+

+    void*	CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize);

+    void	DestroyFont(void* pFont);

+    void	setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix);

+    FX_BOOL	drawGraphicsString(void*                graphics,

+                               void*                font,

+                               FX_FLOAT             fontSize,

+                               FX_WORD*             glyphIndices,

+                               CGPoint*          glyphPositions,

+                               FX_INT32             chars,

+                               FX_ARGB              argb,

+                               CFX_AffineMatrix*    matrix = NULL);

+    void saveGraphicsState(void* graphics);

+    void restoreGraphicsState(void* graphics);

+};

+class CApplePlatform : public CFX_Object

+{

+public:

+    CApplePlatform()

+    {

+        m_pFontMapper = NULL;

+    }

+    ~CApplePlatform()

+    {

+        if (m_pFontMapper) {

+            delete m_pFontMapper;

+        }

+    }

+    CQuartz2D	_quartz2d;

+    IFX_FontMapper* m_pFontMapper;

+};

+class CFX_QuartzDeviceDriver : public IFX_RenderDeviceDriver

+{

+public:

+    CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass);

+    virtual ~CFX_QuartzDeviceDriver();

+

+    virtual int		GetDeviceCaps(int caps_id);

+    virtual CFX_Matrix	GetCTM() const;

+    virtual CFX_DIBitmap*   GetBackDrop()

+    {

+        return NULL;

+    }

+    virtual void*	GetPlatformSurface()

+    {

+        return NULL;

+    }

+    virtual FX_BOOL IsPSPrintDriver()

+    {

+        return FALSE;

+    }

+    virtual FX_BOOL	StartRendering()

+    {

+        return TRUE;

+    }

+    virtual void	EndRendering() {}

+    virtual void	SaveState();

+    virtual void	RestoreState(FX_BOOL bKeepSaved);

+    virtual FX_BOOL	SetClip_PathFill(const CFX_PathData* pPathData,

+                                     const CFX_AffineMatrix* pObject2Device,

+                                     int fill_mode

+                                    );

+    virtual FX_BOOL	SetClip_PathStroke(const CFX_PathData* pPathData,

+                                       const CFX_AffineMatrix* pObject2Device,

+                                       const CFX_GraphStateData* pGraphState

+                                      );

+    virtual FX_BOOL	DrawPath(const CFX_PathData* pPathData,

+                             const CFX_AffineMatrix* pObject2Device,

+                             const CFX_GraphStateData* pGraphState,

+                             FX_DWORD fill_color,

+                             FX_DWORD stroke_color,

+                             int fill_mode,

+                             int alpha_flag = 0,

+                             void* pIccTransform = NULL,

+                             int blend_type = FXDIB_BLEND_NORMAL

+                            );

+    virtual FX_BOOL	SetPixel(int x, int y, FX_DWORD color,

+                             int alpha_flag = 0, void* pIccTransform = NULL)

+    {

+        return FALSE;

+    }

+    virtual FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color,

+                             int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);

+    virtual FX_BOOL	DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,

+                                     int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);

+    virtual FX_BOOL GetClipBox(FX_RECT* pRect);

+    virtual FX_BOOL	GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);

+    virtual FX_BOOL	SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect,

+                              int dest_left, int dest_top, int blend_type,

+                              int alpha_flag = 0, void* pIccTransform = NULL);

+    virtual FX_BOOL	StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,

+                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,

+                                  int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);

+    virtual FX_BOOL	StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,

+                                const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,

+                                int alpha_flag = 0, void* pIccTransform = NULL,

+                                int blend_type = FXDIB_BLEND_NORMAL)

+    {

+        return FALSE;

+    }

+    virtual FX_BOOL	ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)

+    {

+        return FALSE;

+    }

+    virtual void	CancelDIBits(FX_LPVOID handle) {}

+    virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,

+                                   CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,

+                                   int alpha_flag = 0, void* pIccTransform = NULL);

+    virtual void    ClearDriver();

+protected:

+    void setStrokeInfo(const CFX_GraphStateData * graphState, FX_ARGB argb, FX_FLOAT lineWidth);

+    void setFillInfo(FX_ARGB argb);

+    void setPathToContext(const CFX_PathData * pathData);

+    FX_FLOAT getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm);

+    FX_BOOL CG_DrawGlypRun(int                        nChars,

+                           const FXTEXT_CHARPOS*      pCharPos,

+                           CFX_Font*                  pFont,

+                           CFX_FontCache*             pCache,

+                           const CFX_AffineMatrix*    pGlyphMatrix,

+                           const CFX_AffineMatrix*    pObject2Device,

+                           FX_FLOAT                   font_size,

+                           FX_DWORD                   argb,

+                           int                        alpha_flag,

+                           void*                      pIccTransform);

+    void    CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height, CGRect* rect = NULL);

+protected:

+    CGContextRef	_context;

+    CGAffineTransform _foxitDevice2User;

+    CGAffineTransform _user2FoxitDevice;

+    FX_INT32        m_saveCount;

+

+    FX_INT32		_width;

+    FX_INT32		_height;

+    FX_INT32		_bitsPerPixel;

+    FX_INT32		_deviceClass;

+    FX_INT32		_renderCaps;

+    FX_INT32	_horzSize;

+    FX_INT32	_vertSize;

+};

+class CFX_FontProvider : public IFX_FileRead

+{

+public:

+    virtual void			Release()

+    {

+        delete this;

+    }

+    virtual FX_FILESIZE		GetSize()

+    {

+        return (FX_FILESIZE)_totalSize;

+    }

+    virtual FX_BOOL			ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);

+

+    virtual FX_BOOL			IsEOF()

+    {

+        return _offSet == _totalSize;

+    }

+    virtual FX_FILESIZE		GetPosition()

+    {

+        return (FX_FILESIZE)_offSet;

+    }

+    virtual size_t			ReadBlock(void* buffer, size_t size);

+public:

+    CFX_FontProvider(CGFontRef cgFont);

+    ~CFX_FontProvider();

+    void            InitTableOffset();

+    unsigned long   Read(unsigned long offset, unsigned char *buffer, unsigned long count);

+protected:

+    uint32_t CalcTableCheckSum(const uint32_t *table, uint32_t numberOfBytesInTable);

+    uint32_t CalcTableDataRefCheckSum(CFDataRef dataRef);

+private:

+    CGFontRef   m_cgFont;

+    UInt32      m_iTableSize;

+    size_t      _offSet;

+    typedef struct FontHeader {

+        int32_t fVersion;

+        uint16_t fNumTables;

+        uint16_t fSearchRange;

+        uint16_t fEntrySelector;

+        uint16_t fRangeShift;

+    } FontHeader;

+    typedef struct TableEntry {

+        uint32_t fTag;

+        uint32_t fCheckSum;

+        uint32_t fOffset;

+        uint32_t fLength;

+    } TableEntry;

+    FontHeader _fontHeader;

+    unsigned char * _tableEntries;

+    size_t * _tableOffsets;

+    int _tableCount;

+    int _totalSize;

+};

+FX_UINT32 FX_GetHashCode( FX_LPCSTR pStr);

+FX_DWORD  FX_IOSGetMatchFamilyNameHashcode(FX_LPCSTR pFontName);

+FX_UINT32 FX_IOSGetFamilyNamesCount();

+FX_LPCSTR FX_IOSGetFamilyName( FX_UINT32 uIndex);

+#endif

+#endif

diff --git a/core/src/fxge/apple/fx_apple_platform.cpp b/core/src/fxge/apple/fx_apple_platform.cpp
new file mode 100644
index 0000000..229d178
--- /dev/null
+++ b/core/src/fxge/apple/fx_apple_platform.cpp
@@ -0,0 +1,173 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxcrt/fx_ext.h"

+#include "../../../include/fxge/fx_ge.h"

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+#include "apple_int.h"

+#include "../../../include/fxge/fx_ge_apple.h"

+#include "../agg/include/fxfx_agg_clip_liang_barsky.h"

+#include "../ge/text_int.h"

+#include "../dib/dib_int.h"

+#include "../agg/include/fx_agg_driver.h"

+#include "../../../include/fxge/fx_freetype.h"

+#if (_FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))

+void CFX_AggDeviceDriver::InitPlatform()

+{

+    CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;

+    m_pPlatformGraphics = quartz2d.createGraphics(m_pBitmap);

+}

+void CFX_AggDeviceDriver::DestroyPlatform()

+{

+    CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;

+    if (m_pPlatformGraphics) {

+        quartz2d.destroyGraphics(m_pPlatformGraphics);

+        m_pPlatformGraphics = NULL;

+    }

+}

+void CFX_FaceCache::InitPlatform() {}

+void CFX_FaceCache::DestroyPlatform() {}

+CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font *				pFont,

+        FX_DWORD					glyph_index,

+        const CFX_AffineMatrix *	pMatrix,

+        int						dest_width,

+        int						anti_alias)

+{

+    return NULL;

+}

+static FX_BOOL _CGDrawGlyphRun(CGContextRef               pContext,

+                               int                        nChars,

+                               const FXTEXT_CHARPOS*      pCharPos,

+                               CFX_Font*                  pFont,

+                               CFX_FontCache*             pCache,

+                               const CFX_AffineMatrix*    pObject2Device,

+                               FX_FLOAT                   font_size,

+                               FX_DWORD                   argb,

+                               int                        alpha_flag,

+                               void*                      pIccTransform)

+{

+    if (nChars == 0) {

+        return TRUE;

+    }

+    CFX_AffineMatrix new_matrix;

+    FX_BOOL bNegSize = font_size < 0;

+    if (bNegSize) {

+        font_size = -font_size;

+    }

+    FX_FLOAT ori_x = pCharPos[0].m_OriginX, ori_y = pCharPos[0].m_OriginY;

+    new_matrix.Transform(ori_x, ori_y);

+    if (pObject2Device) {

+        new_matrix.Concat(*pObject2Device);

+    }

+    CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;

+    if (!pFont->m_pPlatformFont) {

+        if (pFont->GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {

+            return FALSE;

+        }

+        pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);

+        if (NULL == pFont->m_pPlatformFont) {

+            return FALSE;

+        }

+    }

+    CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);

+    CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);

+    for (int i = 0; i < nChars; i++ ) {

+        glyph_indices[i] = pCharPos[i].m_ExtGID;

+        if (bNegSize) {

+            glyph_positions[i].x = -pCharPos[i].m_OriginX;

+        } else {

+            glyph_positions[i].x = pCharPos[i].m_OriginX;

+        }

+        glyph_positions[i].y = pCharPos[i].m_OriginY;

+    }

+    if (bNegSize) {

+        new_matrix.a = -new_matrix.a;

+    } else {

+        new_matrix.b = -new_matrix.b;

+        new_matrix.d = -new_matrix.d;

+    }

+    quartz2d.setGraphicsTextMatrix(pContext, &new_matrix);

+    return quartz2d.drawGraphicsString(pContext,

+                                       pFont->m_pPlatformFont,

+                                       font_size,

+                                       glyph_indices,

+                                       glyph_positions,

+                                       nChars,

+                                       argb,

+                                       NULL);

+}

+static void _DoNothing(void *info, const void *data, size_t size) {}

+FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int						 nChars,

+        const FXTEXT_CHARPOS *	 pCharPos,

+        CFX_Font *				 pFont,

+        CFX_FontCache *			 pCache,

+        const CFX_AffineMatrix * pObject2Device,

+        FX_FLOAT				 font_size,

+        FX_DWORD				 argb,

+        int alpha_flag, void* pIccTransform)

+{

+    if (!pFont) {

+        return FALSE;

+    }

+    FX_BOOL bBold = pFont->IsBold();

+    if (!bBold && pFont->GetSubstFont() &&

+            pFont->GetSubstFont()->m_Weight >= 500 &&

+            pFont->GetSubstFont()->m_Weight <= 600) {

+        return FALSE;

+    }

+    for (int i = 0; i < nChars; i ++) {

+        if (pCharPos[i].m_bGlyphAdjust) {

+            return FALSE;

+        }

+    }

+    CGContextRef ctx = CGContextRef(m_pPlatformGraphics);

+    if (NULL == ctx) {

+        return FALSE;

+    }

+    CGContextSaveGState(ctx);

+    CGContextSetTextDrawingMode(ctx, kCGTextFillClip);

+    CGRect rect_cg;

+    CGImageRef pImageCG = NULL;

+    if (m_pClipRgn) {

+        rect_cg = CGRectMake(m_pClipRgn->GetBox().left, m_pClipRgn->GetBox().top, m_pClipRgn->GetBox().Width(), m_pClipRgn->GetBox().Height());

+        const CFX_DIBitmap*	pClipMask = m_pClipRgn->GetMask();

+        if (pClipMask) {

+            CGDataProviderRef pClipMaskDataProvider = CGDataProviderCreateWithData(NULL,

+                    pClipMask->GetBuffer(),

+                    pClipMask->GetPitch() * pClipMask->GetHeight(),

+                    _DoNothing);

+            CGFloat decode_f[2] = {255.f, 0.f};

+            pImageCG = CGImageMaskCreate(pClipMask->GetWidth(), pClipMask->GetHeight(),

+                                         8, 8, pClipMask->GetPitch(), pClipMaskDataProvider,

+                                         decode_f, FALSE);

+            CGDataProviderRelease(pClipMaskDataProvider);

+        }

+    } else {

+        rect_cg = CGRectMake(0, 0, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());

+    }

+    rect_cg = CGContextConvertRectToDeviceSpace(ctx, rect_cg);

+    if (pImageCG) {

+        CGContextClipToMask(ctx, rect_cg, pImageCG);

+    } else {

+        CGContextClipToRect(ctx, rect_cg);

+    }

+    FX_BOOL ret = _CGDrawGlyphRun(ctx, nChars, pCharPos, pFont, pCache, pObject2Device, font_size, argb, alpha_flag, pIccTransform);

+    if (pImageCG) {

+        CGImageRelease(pImageCG);

+    }

+    CGContextRestoreGState(ctx);

+    return ret;

+}

+void CFX_Font::ReleasePlatformResource()

+{

+    if (m_pPlatformFont) {

+        CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;

+        quartz2d.DestroyFont(m_pPlatformFont);

+        m_pPlatformFont = NULL;

+    }

+}

+#endif

+#endif

diff --git a/core/src/fxge/apple/fx_mac_imp.cpp b/core/src/fxge/apple/fx_mac_imp.cpp
new file mode 100644
index 0000000..9a1218b
--- /dev/null
+++ b/core/src/fxge/apple/fx_mac_imp.cpp
@@ -0,0 +1,117 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#include "apple_int.h"

+#if _FX_OS_ == _FX_MACOSX_

+static const struct {

+    FX_LPCSTR	m_pName;

+    FX_LPCSTR	m_pSubstName;

+}

+Base14Substs[] = {

+    {"Courier", "Courier New"},

+    {"Courier-Bold", "Courier New Bold"},

+    {"Courier-BoldOblique", "Courier New Bold Italic"},

+    {"Courier-Oblique", "Courier New Italic"},

+    {"Helvetica", "Arial"},

+    {"Helvetica-Bold", "Arial Bold"},

+    {"Helvetica-BoldOblique", "Arial Bold Italic"},

+    {"Helvetica-Oblique", "Arial Italic"},

+    {"Times-Roman", "Times New Roman"},

+    {"Times-Bold", "Times New Roman Bold"},

+    {"Times-BoldItalic", "Times New Roman Bold Italic"},

+    {"Times-Italic", "Times New Roman Italic"},

+};

+#if !defined(_FPDFAPI_MINI_)

+class CFX_MacFontInfo : public CFX_FolderFontInfo

+{

+public:

+    virtual void*		MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);

+};

+#define JAPAN_GOTHIC "Hiragino Kaku Gothic Pro W6"

+#define JAPAN_MINCHO "Hiragino Mincho Pro W6"

+static void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)

+{

+    if (face.Find("Gothic") >= 0) {

+        face = JAPAN_GOTHIC;

+        return;

+    }

+    if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {

+        face = JAPAN_GOTHIC;

+    } else {

+        face = JAPAN_MINCHO;

+    }

+}

+void* CFX_MacFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)

+{

+    CFX_ByteString face = cstr_face;

+    int iBaseFont;

+    for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)

+        if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {

+            face = Base14Substs[iBaseFont].m_pSubstName;

+            bExact = TRUE;

+            break;

+        }

+    if (iBaseFont < 12) {

+        return GetFont(face);

+    }

+    FX_LPVOID p;

+    if (m_FontList.Lookup(face, p)) {

+        return p;

+    }

+    if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {

+        return GetFont("Courier New");

+    }

+    if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_SYMBOL_CHARSET) {

+        return NULL;

+    }

+    switch (charset) {

+        case FXFONT_SHIFTJIS_CHARSET:

+            GetJapanesePreference(face, weight, pitch_family);

+            break;

+        case FXFONT_GB2312_CHARSET:

+            face = "STSong";

+            break;

+        case FXFONT_HANGEUL_CHARSET:

+            face = "AppleMyungjo";

+            break;

+        case FXFONT_CHINESEBIG5_CHARSET:

+            face = "LiSong Pro Light";

+    }

+    if (m_FontList.Lookup(face, p)) {

+        return p;

+    }

+    return NULL;

+}

+#endif

+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()

+{

+#if !defined(_FPDFAPI_MINI_)

+    CFX_MacFontInfo* pInfo = FX_NEW CFX_MacFontInfo;

+    if (!pInfo) {

+        return NULL;

+    }

+    pInfo->AddPath("~/Library/Fonts");

+    pInfo->AddPath("/Library/Fonts");

+    pInfo->AddPath("/System/Library/Fonts");

+    return pInfo;

+#else

+    return NULL;

+#endif

+}

+void CFX_GEModule::InitPlatform()

+{

+    m_pPlatformData = FX_NEW CApplePlatform;

+    m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());

+}

+void CFX_GEModule::DestroyPlatform()

+{

+    if (m_pPlatformData) {

+        delete (CApplePlatform *) m_pPlatformData;

+    }

+    m_pPlatformData = NULL;

+}

+#endif

diff --git a/core/src/fxge/apple/fx_quartz_device.cpp b/core/src/fxge/apple/fx_quartz_device.cpp
new file mode 100644
index 0000000..bef4516
--- /dev/null
+++ b/core/src/fxge/apple/fx_quartz_device.cpp
@@ -0,0 +1,1138 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxcrt/fx_ext.h"

+#include "../../../include/fxge/fx_ge.h"

+#include "../agg/include/fxfx_agg_clip_liang_barsky.h"

+#include "../ge/text_int.h"

+#include "../dib/dib_int.h"

+#include "../agg/include/fx_agg_driver.h"

+#include "../../../include/fxge/fx_freetype.h"

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+#include "apple_int.h"

+#include "../../../include/fxge/fx_ge_apple.h"

+#ifndef CGFLOAT_IS_DOUBLE

+#error Expected CGFLOAT_IS_DOUBLE to be defined by CoreGraphics headers

+#endif

+void* CQuartz2D::createGraphics(CFX_DIBitmap* pBitmap)

+{

+    if (!pBitmap) {

+        return NULL;

+    }

+    CGBitmapInfo bmpInfo = kCGBitmapByteOrder32Little;

+    switch (pBitmap->GetFormat()) {

+        case FXDIB_Rgb32:

+            bmpInfo |= kCGImageAlphaNoneSkipFirst;

+            break;

+        case FXDIB_Argb:

+        default:

+            return NULL;

+    }

+    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

+    CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),

+                           pBitmap->GetWidth(),

+                           pBitmap->GetHeight(),

+                           8,

+                           pBitmap->GetPitch(),

+                           colorSpace,

+                           bmpInfo);

+    CGColorSpaceRelease(colorSpace);

+    return context;

+}

+void CQuartz2D::destroyGraphics(void* graphics)

+{

+    if (graphics) {

+        CGContextRelease((CGContextRef) graphics);

+    }

+}

+void* CQuartz2D::CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize)

+{

+    CGDataProviderRef pDataProvider = CGDataProviderCreateWithData(NULL, pFontData, (size_t)dwFontSize, NULL);

+    if (NULL == pDataProvider) {

+        return NULL;

+    }

+    CGFontRef pCGFont = CGFontCreateWithDataProvider(pDataProvider);

+    CGDataProviderRelease(pDataProvider);

+    return pCGFont;

+}

+void CQuartz2D::DestroyFont(void* pFont)

+{

+    CGFontRelease((CGFontRef)pFont);

+}

+void CQuartz2D::setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix)

+{

+    if (!graphics || !matrix) {

+        return;

+    }

+    CGContextRef context = (CGContextRef) graphics;

+    CGFloat ty = CGBitmapContextGetHeight(context) - matrix->f;

+    CGContextSetTextMatrix(context, CGAffineTransformMake(matrix->a,

+                           matrix->b,

+                           matrix->c,

+                           matrix->d,

+                           matrix->e,

+                           ty));

+}

+FX_BOOL CQuartz2D::drawGraphicsString(void*                 graphics,

+                                      void*                 font,

+                                      FX_FLOAT              fontSize,

+                                      FX_WORD*              glyphIndices,

+                                      CGPoint*           glyphPositions,

+                                      FX_INT32              charsCount,

+                                      FX_ARGB               argb,

+                                      CFX_AffineMatrix*     matrix )

+{

+    if (!graphics) {

+        return FALSE;

+    }

+    CGContextRef context = (CGContextRef) graphics;

+    CGContextSetFont(context, (CGFontRef)font);

+    CGContextSetFontSize(context, fontSize);

+    if (matrix) {

+        CGAffineTransform m = CGContextGetTextMatrix(context);

+        m = CGAffineTransformConcat(m,

+                                    CGAffineTransformMake(matrix->a,

+                                            matrix->b,

+                                            matrix->c,

+                                            matrix->d,

+                                            matrix->e,

+                                            matrix->f));

+        CGContextSetTextMatrix(context, m);

+    }

+    FX_INT32 a, r, g, b;

+    ArgbDecode(argb, a, r, g, b);

+    CGContextSetRGBFillColor(context,

+                             r / 255.f,

+                             g / 255.f,

+                             b / 255.f,

+                             a / 255.f);

+    CGContextSaveGState(context);

+#if CGFLOAT_IS_DOUBLE

+    CGPoint* glyphPositionsCG = new CGPoint[charsCount];

+    if (!glyphPositionsCG) {

+        return FALSE;

+    }

+    for (int index = 0; index < charsCount; ++index) {

+        glyphPositionsCG[index].x = glyphPositions[index].x;

+        glyphPositionsCG[index].y = glyphPositions[index].y;

+    }

+#else

+    CGPoint* glyphPositionsCG = (CGPoint*)glyphPositions;

+#endif

+    CGContextShowGlyphsAtPositions(context,

+                                   (CGGlyph *) glyphIndices,

+                                   glyphPositionsCG,

+                                   charsCount);

+#if CGFLOAT_IS_DOUBLE

+    delete[] glyphPositionsCG;

+#endif

+    CGContextRestoreGState(context);

+    return TRUE;

+}

+void CQuartz2D::saveGraphicsState(void * graphics)

+{

+    if (graphics) {

+        CGContextSaveGState((CGContextRef) graphics);

+    }

+}

+void CQuartz2D::restoreGraphicsState(void * graphics)

+{

+    if (graphics) {

+        CGContextRestoreGState((CGContextRef) graphics);

+    }

+}

+static CGContextRef createContextWithBitmap(CFX_DIBitmap* pBitmap)

+{

+    if (!pBitmap || pBitmap->IsCmykImage() || pBitmap->GetBPP() < 32) {

+        return NULL;

+    }

+    CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little;

+    if (pBitmap->HasAlpha()) {

+        bitmapInfo |= kCGImageAlphaPremultipliedFirst;

+    } else {

+        bitmapInfo |= kCGImageAlphaNoneSkipFirst;

+    }

+    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

+    CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),

+                           pBitmap->GetWidth(),

+                           pBitmap->GetHeight(),

+                           8,

+                           pBitmap->GetPitch(),

+                           colorSpace,

+                           bitmapInfo);

+    CGColorSpaceRelease(colorSpace);

+    return context;

+}

+CFX_QuartzDeviceDriver::CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass)

+{

+    m_saveCount = 0;

+    _context		= context;

+    _deviceClass	= deviceClass;

+    CGContextRetain(_context);

+    CGRect r = CGContextGetClipBoundingBox(context);

+    _width	= FXSYS_round(r.size.width);

+    _height	= FXSYS_round(r.size.height);

+    _renderCaps = FXRC_SOFT_CLIP | FXRC_BLEND_MODE |

+                  FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE |

+                  FXRC_BIT_MASK | FXRC_ALPHA_MASK;

+    if (_deviceClass != FXDC_DISPLAY) {

+    } else {

+        CGImageRef image = CGBitmapContextCreateImage(_context);

+        if (image) {

+            _renderCaps |= FXRC_GET_BITS;

+            _width = CGImageGetWidth(image);

+            _height = CGImageGetHeight(image);

+            CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(image);

+            if (kCGImageAlphaPremultipliedFirst == alphaInfo ||

+                    kCGImageAlphaPremultipliedLast == alphaInfo ||

+                    kCGImageAlphaOnly == alphaInfo) {

+                _renderCaps |= FXRC_ALPHA_OUTPUT;

+            }

+        }

+        CGImageRelease(image);

+    }

+    CGAffineTransform ctm = CGContextGetCTM(_context);

+    CGContextSaveGState(_context);

+    m_saveCount++;

+    if (ctm.d >= 0) {

+        CGFloat offset_x, offset_y;

+        offset_x = ctm.tx;

+        offset_y = ctm.ty;

+        CGContextTranslateCTM(_context, -offset_x, -offset_y);

+        CGContextConcatCTM(_context, CGAffineTransformMake(1, 0, 0, -1, offset_x, _height + offset_y));

+    }

+    _foxitDevice2User = CGAffineTransformIdentity;

+    _user2FoxitDevice = CGAffineTransformInvert(_foxitDevice2User);

+}

+CFX_QuartzDeviceDriver::~CFX_QuartzDeviceDriver()

+{

+    CGContextRestoreGState(_context);

+    m_saveCount--;

+    for (int i = 0; i < m_saveCount; ++i) {

+        CGContextRestoreGState(_context);

+    }

+    if (_context) {

+        CGContextRelease(_context);

+    }

+}

+int CFX_QuartzDeviceDriver::GetDeviceCaps(int capsID)

+{

+    switch (capsID) {

+        case FXDC_DEVICE_CLASS: {

+                return _deviceClass;

+            }

+        case FXDC_PIXEL_WIDTH: {

+                return _width;

+            }

+        case FXDC_PIXEL_HEIGHT: {

+                return _height;

+            }

+        case FXDC_BITS_PIXEL: {

+                return 32;

+            }

+        case FXDC_RENDER_CAPS: {

+                return _renderCaps;

+            }

+        default: {

+                return 0;

+            }

+    }

+}

+CFX_Matrix CFX_QuartzDeviceDriver::GetCTM() const

+{

+    CGAffineTransform ctm = CGContextGetCTM(_context);

+    return CFX_Matrix(ctm.a, ctm.b, ctm.c, ctm.d, ctm.tx, ctm.ty);

+}

+void CFX_QuartzDeviceDriver::SaveState()

+{

+    CGContextSaveGState(_context);

+    m_saveCount++;

+}

+void CFX_QuartzDeviceDriver::RestoreState(FX_BOOL isKeepSaved )

+{

+    CGContextRestoreGState(_context);

+    if (isKeepSaved) {

+        CGContextSaveGState(_context);

+    } else {

+        m_saveCount--;

+    }

+}

+FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathFill(const CFX_PathData*    pathData,

+        const CFX_AffineMatrix*   matrix,

+        int                       fillMode )

+{

+    SaveState();

+    CGAffineTransform m = CGAffineTransformIdentity;

+    if (matrix) {

+        m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());

+    }

+    m = CGAffineTransformConcat(m, _foxitDevice2User);

+    CGContextConcatCTM(_context, m);

+    setPathToContext(pathData);

+    RestoreState(FALSE);

+    if ((fillMode & 3) == FXFILL_WINDING) {

+        CGContextClip(_context);

+    } else {

+        CGContextEOClip(_context);

+    }

+    return TRUE;

+}

+FX_FLOAT CFX_QuartzDeviceDriver::getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm)

+{

+    FX_FLOAT lineWidth = graphState->m_LineWidth;

+    if (graphState->m_LineWidth <= 0.f) {

+        CGSize size;

+        size.width = 1;

+        size.height = 1;

+        CGSize temp = CGSizeApplyAffineTransform(size, ctm);

+        CGFloat x = 1 / temp.width;

+        CGFloat y = 1 / temp.height;

+        lineWidth = x > y ? x : y;

+    }

+    return lineWidth;

+}

+FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathStroke(const CFX_PathData*      pathData,

+        const CFX_AffineMatrix*     matrix,

+        const CFX_GraphStateData*   graphState )

+{

+    SaveState();

+    CGAffineTransform m = CGAffineTransformIdentity;

+    if (matrix) {

+        m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());

+    }

+    m = CGAffineTransformConcat(m, _foxitDevice2User);

+    CGContextConcatCTM(_context, m);

+    FX_FLOAT lineWidth = getLineWidth(graphState, m);

+    setStrokeInfo(graphState, 0xFF000000, lineWidth);

+    setPathToContext(pathData);

+    CGContextReplacePathWithStrokedPath(_context);

+    RestoreState(FALSE);

+    CGContextClip(_context);

+    return TRUE;

+}

+static CGBlendMode GetCGBlendMode(int blend_type)

+{

+    CGBlendMode mode = kCGBlendModeNormal;

+    switch (blend_type) {

+        case FXDIB_BLEND_NORMAL:

+            mode = kCGBlendModeNormal;

+            break;

+        case FXDIB_BLEND_MULTIPLY:

+            mode = kCGBlendModeMultiply;

+            break;

+        case FXDIB_BLEND_SCREEN:

+            mode = kCGBlendModeScreen;

+            break;

+        case FXDIB_BLEND_OVERLAY:

+            mode = kCGBlendModeOverlay;

+            break;

+        case FXDIB_BLEND_DARKEN:

+            mode = kCGBlendModeDarken;

+            break;

+        case FXDIB_BLEND_LIGHTEN:

+            mode = kCGBlendModeLighten;

+            break;

+        case FXDIB_BLEND_COLORDODGE:

+            mode = kCGBlendModeColorDodge;

+            break;

+        case FXDIB_BLEND_COLORBURN:

+            mode = kCGBlendModeColorBurn;

+            break;

+        case FXDIB_BLEND_HARDLIGHT:

+            mode = kCGBlendModeHardLight;

+            break;

+        case FXDIB_BLEND_SOFTLIGHT:

+            mode = kCGBlendModeSoftLight;

+            break;

+        case FXDIB_BLEND_DIFFERENCE:

+            mode = kCGBlendModeDifference;

+            break;

+        case FXDIB_BLEND_EXCLUSION:

+            mode = kCGBlendModeExclusion;

+            break;

+        case FXDIB_BLEND_HUE:

+            mode = kCGBlendModeHue;

+            break;

+        case FXDIB_BLEND_SATURATION:

+            mode = kCGBlendModeSaturation;

+            break;

+        case FXDIB_BLEND_COLOR:

+            mode = kCGBlendModeColor;

+            break;

+        case FXDIB_BLEND_LUMINOSITY:

+            mode = kCGBlendModeLuminosity;

+            break;

+        default:

+            mode = kCGBlendModeNormal;

+            break;

+    }

+    return mode;

+}

+FX_BOOL CFX_QuartzDeviceDriver::DrawPath(const CFX_PathData*        pathData,

+        const CFX_AffineMatrix*       matrix,

+        const CFX_GraphStateData*     graphState,

+        FX_DWORD                      fillArgb,

+        FX_DWORD                      strokeArgb,

+        int                           fillMode,

+        int                           alpha_flag,

+        void*                         pIccTransform,

+        int							blend_type

+                                        )

+{

+    SaveState();

+    CGBlendMode mode = GetCGBlendMode(blend_type);

+    if (mode != kCGBlendModeNormal) {

+        CGContextSetBlendMode(_context, mode);

+    }

+    CGAffineTransform m = CGAffineTransformIdentity;

+    if (matrix) {

+        m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());

+    }

+    m = CGAffineTransformConcat(m, _foxitDevice2User);

+    CGContextConcatCTM(_context, m);

+    int pathMode = 0;

+    if (graphState && strokeArgb) {

+        CGContextSetMiterLimit(_context, graphState->m_MiterLimit);

+        FX_FLOAT lineWidth = getLineWidth(graphState, m);

+        setStrokeInfo(graphState, strokeArgb, lineWidth);

+        pathMode |= 4;

+    }

+    if (fillMode && fillArgb) {

+        setFillInfo(fillArgb);

+        if ((fillMode & 3) == FXFILL_WINDING) {

+            pathMode |= 1;

+        } else if ((fillMode & 3) == FXFILL_ALTERNATE) {

+            pathMode |= 2;

+        }

+    }

+    setPathToContext(pathData);

+    if (fillMode & FXFILL_FULLCOVER) {

+        CGContextSetShouldAntialias(_context, false);

+    }

+    if (pathMode == 4) {

+        CGContextStrokePath(_context);

+    } else if (pathMode == 1) {

+        CGContextFillPath(_context);

+    } else if (pathMode == 2) {

+        CGContextEOFillPath(_context);

+    } else if (pathMode == 5) {

+        CGContextDrawPath(_context, kCGPathFillStroke);

+    } else if (pathMode == 6) {

+        CGContextDrawPath(_context, kCGPathEOFillStroke);

+    }

+    RestoreState(FALSE);

+    return TRUE;

+}

+FX_BOOL CFX_QuartzDeviceDriver::FillRect(const FX_RECT*         rect,

+        FX_ARGB                   fillArgb,

+        int                       alphaFlag	   ,

+        void*                     iccTransform ,

+        int						blend_type )

+{

+    CGBlendMode mode = GetCGBlendMode(blend_type);

+    if (mode != kCGBlendModeNormal) {

+        CGContextSetBlendMode(_context, mode);

+    }

+    CGRect rect_fx = CGRectMake(rect->left, rect->top, rect->Width(), rect->Height());

+    CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);

+    FX_INT32 a, r, g, b;

+    ArgbDecode(fillArgb, a, r, g, b);

+    CGContextSetRGBFillColor(_context,

+                             r / 255.f,

+                             g / 255.f,

+                             b / 255.f,

+                             a / 255.f);

+    CGContextFillRect(_context, rect_usr);

+    if (mode != kCGBlendModeNormal) {

+        CGContextSetBlendMode(_context, kCGBlendModeNormal);

+    }

+    return TRUE;

+}

+FX_BOOL CFX_QuartzDeviceDriver::DrawCosmeticLine(FX_FLOAT           x1,

+        FX_FLOAT              y1,

+        FX_FLOAT              x2,

+        FX_FLOAT              y2,

+        FX_DWORD              argb,

+        int                   alphaFlag       ,

+        void*                 iccTransform    ,

+        int					blend_type )

+{

+    CGBlendMode mode = GetCGBlendMode(blend_type);

+    if (mode != kCGBlendModeNormal) {

+        CGContextSetBlendMode(_context, mode);

+    }

+    CGPoint pt = CGPointApplyAffineTransform(CGPointMake(x1, y1), _foxitDevice2User);

+    x1 = pt.x;

+    y1 = pt.y;

+    pt = CGPointApplyAffineTransform(CGPointMake(x2, y2), _foxitDevice2User);

+    x2 = pt.x;

+    y2 = pt.y;

+    FX_INT32 a, r, g, b;

+    ArgbDecode(argb, a, r, g, b);

+    CGContextSetRGBStrokeColor(_context,

+                               r / 255.f,

+                               g / 255.f,

+                               b / 255.f,

+                               a / 255.f);

+    CGContextMoveToPoint(_context, x1, y1);

+    CGContextAddLineToPoint(_context, x2, y2);

+    CGContextStrokePath(_context);

+    if (mode != kCGBlendModeNormal) {

+        CGContextSetBlendMode(_context, kCGBlendModeNormal);

+    }

+    return TRUE;

+}

+FX_BOOL CFX_QuartzDeviceDriver::GetClipBox(FX_RECT* rect)

+{

+    CGRect r = CGContextGetClipBoundingBox(_context);

+    r = CGRectApplyAffineTransform(r, _user2FoxitDevice);

+    rect->left		= FXSYS_floor(r.origin.x);

+    rect->top		= FXSYS_floor(r.origin.y);

+    rect->right		= FXSYS_ceil(r.origin.x + r.size.width);

+    rect->bottom	= FXSYS_ceil(r.origin.y + r.size.height);

+    return TRUE;

+}

+FX_BOOL CFX_QuartzDeviceDriver::GetDIBits(CFX_DIBitmap*     bitmap,

+        FX_INT32            left,

+        FX_INT32            top,

+        void* pIccTransform,

+        FX_BOOL bDEdge)

+{

+    if (FXDC_PRINTER == _deviceClass) {

+        return FALSE;

+    }

+    if (bitmap->GetBPP() < 32) {

+        return FALSE;

+    }

+    if (!(_renderCaps | FXRC_GET_BITS)) {

+        return FALSE;

+    }

+    CGPoint pt = CGPointMake(left, top);

+    pt = CGPointApplyAffineTransform(pt, _foxitDevice2User);

+    CGAffineTransform ctm = CGContextGetCTM(_context);

+    pt.x *= FXSYS_fabs(ctm.a);

+    pt.y *= FXSYS_fabs(ctm.d);

+    CGImageRef image = CGBitmapContextCreateImage(_context);

+    if (NULL == image) {

+        return FALSE;

+    }

+    CGFloat width	= (CGFloat) bitmap->GetWidth();

+    CGFloat height	= (CGFloat) bitmap->GetHeight();

+    if (width + pt.x > _width) {

+        width -= (width + pt.x - _width);

+    }

+    if (height + pt.y > _height) {

+        height -= (height + pt.y - _height);

+    }

+    CGImageRef subImage = CGImageCreateWithImageInRect(image,

+                          CGRectMake(pt.x,

+                                     pt.y,

+                                     width,

+                                     height));

+    CGContextRef context = createContextWithBitmap(bitmap);

+    CGRect rect = CGContextGetClipBoundingBox(context);

+    CGContextClearRect(context, rect);

+    CGContextDrawImage(context, rect, subImage);

+    CGContextRelease(context);

+    CGImageRelease(subImage);

+    CGImageRelease(image);

+    if (bitmap->HasAlpha()) {

+        for (int row = 0; row < bitmap->GetHeight(); row ++) {

+            FX_LPBYTE pScanline = (FX_LPBYTE)bitmap->GetScanline(row);

+            for (int col = 0; col < bitmap->GetWidth(); col ++) {

+                if (pScanline[3] > 0) {

+                    pScanline[0] = (pScanline[0] * 255.f / pScanline[3] + .5f);

+                    pScanline[1] = (pScanline[1] * 255.f / pScanline[3] + .5f);

+                    pScanline[2] = (pScanline[2] * 255.f / pScanline[3] + .5f);

+                }

+                pScanline += 4;

+            }

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CFX_QuartzDeviceDriver::SetDIBits(const CFX_DIBSource*      pBitmap,

+        FX_ARGB                     argb,

+        const FX_RECT*              srcRect,

+        int                         dest_left,

+        int                         dest_top,

+        int                         blendType,

+        int                         alphaFlag       ,

+        void*                       iccTransform    )

+{

+    SaveState();

+    CGFloat src_left, src_top, src_width, src_height;

+    if (srcRect) {

+        src_left = srcRect->left;

+        src_top = srcRect->top;

+        src_width = srcRect->Width();

+        src_height = srcRect->Height();

+    } else {

+        src_left = src_top = 0;

+        src_width = pBitmap->GetWidth();

+        src_height = pBitmap->GetHeight();

+    }

+    CGAffineTransform ctm = CGContextGetCTM(_context);

+    CGFloat scale_x = FXSYS_fabs(ctm.a);

+    CGFloat scale_y = FXSYS_fabs(ctm.d);

+    src_left /= scale_x;

+    src_top /= scale_y;

+    src_width /= scale_x;

+    src_height /= scale_y;

+    CGRect rect_fx = CGRectMake(dest_left, dest_top, src_width, src_height);

+    CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);

+    CGContextBeginPath(_context);

+    CGContextAddRect(_context, rect_usr);

+    CGContextClip(_context);

+    rect_usr.size = CGSizeMake(pBitmap->GetWidth() / scale_x, pBitmap->GetHeight() / scale_y);

+    rect_usr = CGRectOffset(rect_usr, -src_left, -src_top);

+    CG_SetImageTransform(dest_left, dest_top, src_width, src_height, &rect_usr);

+    CFX_DIBitmap* pBitmap1 = NULL;

+    if (pBitmap->IsAlphaMask()) {

+        if (pBitmap->GetBuffer()) {

+            pBitmap1 = (CFX_DIBitmap*)pBitmap;

+        } else {

+            pBitmap1 = pBitmap->Clone();

+        }

+        if (NULL == pBitmap1) {

+            RestoreState(FALSE);

+            return FALSE;

+        }

+        CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,

+                                            pBitmap1->GetBuffer(),

+                                            pBitmap1->GetPitch() * pBitmap1->GetHeight(),

+                                            NULL);

+        CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();

+        CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;

+        CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),

+                                          pBitmap1->GetHeight(),

+                                          pBitmap1->GetBPP(),

+                                          pBitmap1->GetBPP(),

+                                          pBitmap1->GetPitch(),

+                                          pColorSpace,

+                                          bitmapInfo,

+                                          pBitmapProvider, NULL, true,

+                                          kCGRenderingIntentDefault);

+        CGContextClipToMask(_context, rect_usr, pImage);

+        CGContextSetRGBFillColor(_context,

+                                 FXARGB_R(argb) / 255.f,

+                                 FXARGB_G(argb) / 255.f,

+                                 FXARGB_B(argb) / 255.f,

+                                 FXARGB_A(argb) / 255.f);

+        CGContextFillRect(_context, rect_usr);

+        CGImageRelease(pImage);

+        CGColorSpaceRelease(pColorSpace);

+        CGDataProviderRelease(pBitmapProvider);

+        if (pBitmap1 != pBitmap) {

+            delete pBitmap1;

+        }

+        RestoreState(FALSE);

+        return TRUE;

+    }

+    if (pBitmap->GetBPP() < 32) {

+        pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);

+    } else {

+        if (pBitmap->GetBuffer()) {

+            pBitmap1 = (CFX_DIBitmap*)pBitmap;

+        } else {

+            pBitmap1 = pBitmap->Clone();

+        }

+    }

+    if (NULL == pBitmap1) {

+        RestoreState(FALSE);

+        return FALSE;

+    }

+    if (pBitmap1->HasAlpha()) {

+        if (pBitmap1 == pBitmap) {

+            pBitmap1 = pBitmap->Clone();

+            if (!pBitmap1) {

+                RestoreState(FALSE);

+                return FALSE;

+            }

+        }

+        for (int row = 0; row < pBitmap1->GetHeight(); row ++) {

+            FX_LPBYTE pScanline = (FX_LPBYTE)pBitmap1->GetScanline(row);

+            for (int col = 0; col < pBitmap1->GetWidth(); col ++) {

+                pScanline[0] = (FX_BYTE)(pScanline[0] * pScanline[3] / 255.f + .5f);

+                pScanline[1] = (FX_BYTE)(pScanline[1] * pScanline[3] / 255.f + .5f);

+                pScanline[2] = (FX_BYTE)(pScanline[2] * pScanline[3] / 255.f + .5f);

+                pScanline += 4;

+            }

+        }

+    }

+    CGContextRef ctx = createContextWithBitmap(pBitmap1);

+    CGImageRef image = CGBitmapContextCreateImage(ctx);

+    int blend_mode = blendType;

+    if (FXDIB_BLEND_HARDLIGHT == blendType) {

+        blend_mode = kCGBlendModeSoftLight;

+    } else if (FXDIB_BLEND_SOFTLIGHT == blendType) {

+        blend_mode = kCGBlendModeHardLight;

+    } else if (blendType >= FXDIB_BLEND_NONSEPARABLE && blendType <= FXDIB_BLEND_LUMINOSITY) {

+        blend_mode = blendType - 9;

+    } else if (blendType > FXDIB_BLEND_LUMINOSITY || blendType < 0) {

+        blend_mode = kCGBlendModeNormal;

+    }

+    CGContextSetBlendMode(_context, (CGBlendMode)blend_mode);

+    CGContextDrawImage(_context, rect_usr, image);

+    CGImageRelease(image);

+    CGContextRelease(ctx);

+    if (pBitmap1 != pBitmap) {

+        delete pBitmap1;

+    }

+    RestoreState(FALSE);

+    return TRUE;

+}

+FX_BOOL CFX_QuartzDeviceDriver::StretchDIBits(const CFX_DIBSource*      pBitmap,

+        FX_ARGB                     argb,

+        int                         dest_left,

+        int                         dest_top,

+        int                         dest_width,

+        int                         dest_height,

+        const FX_RECT*              clipRect,

+        FX_DWORD                    flags,

+        int                         alphaFlag	   ,

+        void*                       iccTransform ,

+        int							blend_type)

+{

+    SaveState();

+    if (clipRect) {

+        CGContextBeginPath(_context);

+        CGRect rect_clip = CGRectMake(clipRect->left, clipRect->top, clipRect->Width(), clipRect->Height());

+        rect_clip = CGRectApplyAffineTransform(rect_clip, _foxitDevice2User);

+        CGContextAddRect(_context, rect_clip);

+        CGContextClip(_context);

+    }

+    CGRect rect = CGRectMake(dest_left, dest_top, dest_width, dest_height);

+    rect = CGRectApplyAffineTransform(rect, _foxitDevice2User);

+    if (FXDIB_BICUBIC_INTERPOL == flags) {

+        CGContextSetInterpolationQuality(_context, kCGInterpolationHigh);

+    } else if (FXDIB_DOWNSAMPLE == flags) {

+        CGContextSetInterpolationQuality(_context, kCGInterpolationNone);

+    } else {

+        CGContextSetInterpolationQuality(_context, kCGInterpolationMedium);

+    }

+    CG_SetImageTransform(dest_left, dest_top, dest_width, dest_height);

+    CFX_DIBitmap* pBitmap1 = NULL;

+    if (pBitmap->IsAlphaMask()) {

+        if (pBitmap->GetBuffer()) {

+            pBitmap1 = (CFX_DIBitmap*)pBitmap;

+        } else {

+            pBitmap1 = pBitmap->Clone();

+        }

+        if (NULL == pBitmap1) {

+            RestoreState(FALSE);

+            return FALSE;

+        }

+        CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,

+                                            pBitmap1->GetBuffer(),

+                                            pBitmap1->GetPitch() * pBitmap1->GetHeight(),

+                                            NULL);

+        CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();

+        CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;

+        CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),

+                                          pBitmap1->GetHeight(),

+                                          pBitmap1->GetBPP(),

+                                          pBitmap1->GetBPP(),

+                                          pBitmap1->GetPitch(),

+                                          pColorSpace,

+                                          bitmapInfo,

+                                          pBitmapProvider, NULL, true,

+                                          kCGRenderingIntentDefault);

+        CGContextClipToMask(_context, rect, pImage);

+        CGContextSetRGBFillColor(_context,

+                                 FXARGB_R(argb) / 255.f,

+                                 FXARGB_G(argb) / 255.f,

+                                 FXARGB_B(argb) / 255.f,

+                                 FXARGB_A(argb) / 255.f);

+        CGContextFillRect(_context, rect);

+        CGImageRelease(pImage);

+        CGColorSpaceRelease(pColorSpace);

+        CGDataProviderRelease(pBitmapProvider);

+        if (pBitmap1 != pBitmap) {

+            delete pBitmap1;

+        }

+        RestoreState(FALSE);

+        return TRUE;

+    }

+    if (pBitmap->GetBPP() < 32) {

+        pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);

+    } else {

+        if (pBitmap->GetBuffer()) {

+            pBitmap1 = (CFX_DIBitmap*)pBitmap;

+        } else {

+            pBitmap1 = pBitmap->Clone();

+        }

+    }

+    if (NULL == pBitmap1) {

+        RestoreState(FALSE);

+        return FALSE;

+    }

+    if (pBitmap1->HasAlpha()) {

+        if (pBitmap1 == pBitmap) {

+            pBitmap1 = pBitmap->Clone();

+            if (!pBitmap1) {

+                RestoreState(FALSE);

+                return FALSE;

+            }

+        }

+        for (int row = 0; row < pBitmap1->GetHeight(); row ++) {

+            FX_LPBYTE pScanline = (FX_LPBYTE)pBitmap1->GetScanline(row);

+            for (int col = 0; col < pBitmap1->GetWidth(); col ++) {

+                pScanline[0] = (FX_BYTE)(pScanline[0] * pScanline[3] / 255.f + .5f);

+                pScanline[1] = (FX_BYTE)(pScanline[1] * pScanline[3] / 255.f + .5f);

+                pScanline[2] = (FX_BYTE)(pScanline[2] * pScanline[3] / 255.f + .5f);

+                pScanline += 4;

+            }

+        }

+    }

+    CGContextRef ctx = createContextWithBitmap(pBitmap1);

+    CGImageRef image = CGBitmapContextCreateImage(ctx);

+    CGContextDrawImage(_context, rect, image);

+    CGImageRelease(image);

+    CGContextRelease(ctx);

+    if (pBitmap1 != pBitmap) {

+        delete pBitmap1;

+    }

+    RestoreState(FALSE);

+    return TRUE;

+}

+FX_BOOL CFX_QuartzDeviceDriver::CG_DrawGlypRun(int                        nChars,

+        const FXTEXT_CHARPOS*      pCharPos,

+        CFX_Font*                  pFont,

+        CFX_FontCache*             pCache,

+        const CFX_AffineMatrix*    pGlyphMatrix,

+        const CFX_AffineMatrix*    pObject2Device,

+        FX_FLOAT                   font_size,

+        FX_DWORD                   argb,

+        int                        alpha_flag,

+        void*                      pIccTransform)

+{

+    if (nChars == 0) {

+        return TRUE;

+    }

+    CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;

+    if (!pFont->m_pPlatformFont) {

+        if (pFont->GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {

+            return FALSE;

+        }

+        pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);

+        if (NULL == pFont->m_pPlatformFont) {

+            return FALSE;

+        }

+    }

+    CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);

+    CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);

+    for (int i = 0; i < nChars; i++ ) {

+        glyph_indices[i] = pCharPos[i].m_ExtGID;

+        glyph_positions[i].x = pCharPos[i].m_OriginX;

+        glyph_positions[i].y = pCharPos[i].m_OriginY;

+    }

+    CFX_AffineMatrix text_matrix;

+    if (pObject2Device) {

+        text_matrix.Concat(*pObject2Device);

+    }

+    CGAffineTransform matrix_cg = CGAffineTransformMake(text_matrix.a,

+                                  text_matrix.b,

+                                  text_matrix.c,

+                                  text_matrix.d,

+                                  text_matrix.e,

+                                  text_matrix.f);

+    matrix_cg = CGAffineTransformConcat(matrix_cg, _foxitDevice2User);

+    CGContextSetTextMatrix(_context, matrix_cg);

+    CGContextSetFont(_context, (CGFontRef)pFont->m_pPlatformFont);

+    CGContextSetFontSize(_context, FXSYS_fabs(font_size));

+    FX_INT32 a, r, g, b;

+    ArgbDecode(argb, a, r, g, b);

+    CGContextSetRGBFillColor(_context,

+                             r / 255.f,

+                             g / 255.f,

+                             b / 255.f,

+                             a / 255.f);

+    SaveState();

+    if (pGlyphMatrix) {

+        CGAffineTransform ctm = CGContextGetCTM(_context);

+        CGPoint origin = CGPointMake( glyph_positions[0].x,  glyph_positions[0].y);

+        origin = CGPointApplyAffineTransform(origin, matrix_cg);

+        CGContextTranslateCTM(_context, origin.x, origin.y);

+        CGAffineTransform glyph_matrix = CGAffineTransformMake(pGlyphMatrix->a,

+                                         pGlyphMatrix->b,

+                                         pGlyphMatrix->c,

+                                         pGlyphMatrix->d,

+                                         pGlyphMatrix->e,

+                                         pGlyphMatrix->f);

+        if (_foxitDevice2User.d < 0) {

+            glyph_matrix = CGAffineTransformInvert(glyph_matrix);

+        }

+        CGContextConcatCTM(_context, glyph_matrix);

+        CGContextTranslateCTM(_context, -origin.x, -origin.y);

+    }

+    CGContextShowGlyphsAtPositions(_context,

+                                   (CGGlyph*)glyph_indices,

+                                   glyph_positions,

+                                   nChars);

+    RestoreState(FALSE);

+    return TRUE;

+}

+FX_BOOL CFX_QuartzDeviceDriver::DrawDeviceText(int                      nChars,

+        const FXTEXT_CHARPOS*    pCharPos,

+        CFX_Font*                pFont,

+        CFX_FontCache*           pCache,

+        const CFX_AffineMatrix*  pObject2Device,

+        FX_FLOAT                 font_size,

+        FX_DWORD                 color,

+        int                      alpha_flag       ,

+        void*                    pIccTransform)

+{

+    if (NULL == pFont || NULL == _context) {

+        return FALSE;

+    }

+    FX_BOOL bBold = pFont->IsBold();

+    if (!bBold && pFont->GetSubstFont() &&

+            pFont->GetSubstFont()->m_Weight >= 500 &&

+            pFont->GetSubstFont()->m_Weight <= 600) {

+        return FALSE;

+    }

+    SaveState();

+    CGContextSetTextDrawingMode(_context, kCGTextFillClip);

+    FX_BOOL ret = FALSE;

+    FX_INT32 i = 0;

+    while (i < nChars) {

+        if (pCharPos[i].m_bGlyphAdjust || font_size < 0) {

+            if (i > 0) {

+                ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);

+                if (!ret) {

+                    RestoreState(FALSE);

+                    return ret;

+                }

+            }

+            const FXTEXT_CHARPOS* char_pos = pCharPos + i;

+            CFX_AffineMatrix glphy_matrix;

+            if (font_size < 0) {

+                glphy_matrix.Concat(-1, 0, 0, -1, 0, 0);

+            }

+            if (char_pos->m_bGlyphAdjust) {

+                glphy_matrix.Concat(char_pos->m_AdjustMatrix[0],

+                                    char_pos->m_AdjustMatrix[1],

+                                    char_pos->m_AdjustMatrix[2],

+                                    char_pos->m_AdjustMatrix[3], 0, 0);

+            }

+            ret = CG_DrawGlypRun(1, char_pos, pFont, pCache, &glphy_matrix, pObject2Device, font_size, color, alpha_flag, pIccTransform);

+            if (!ret) {

+                RestoreState(FALSE);

+                return ret;

+            }

+            i ++;

+            pCharPos += i;

+            nChars -= i;

+            i = 0;

+        } else {

+            i ++;

+        }

+    }

+    if (i > 0) {

+        ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);

+    }

+    RestoreState(FALSE);

+    return ret;

+}

+void CFX_QuartzDeviceDriver::setStrokeInfo(const CFX_GraphStateData* graphState, FX_ARGB argb, FX_FLOAT lineWidth)

+{

+    if (NULL == graphState) {

+        return;

+    }

+    CGContextSetLineWidth(_context, lineWidth);

+    CGLineCap cap;

+    switch (graphState->m_LineCap) {

+        case CFX_GraphStateData::LineCapRound: {

+                cap = kCGLineCapRound;

+                break;

+            }

+        case CFX_GraphStateData::LineCapSquare: {

+                cap = kCGLineCapSquare;

+                break;

+            }

+        case CFX_GraphStateData::LineCapButt:

+        default: {

+                cap = kCGLineCapButt;

+            }

+    }

+    CGContextSetLineCap(_context, cap);

+    CGLineJoin join;

+    switch (graphState->m_LineJoin) {

+        case CFX_GraphStateData::LineJoinRound: {

+                join = kCGLineJoinRound;

+                break;

+            }

+        case CFX_GraphStateData::LineJoinBevel: {

+                join = kCGLineJoinBevel;

+                break;

+            }

+        case CFX_GraphStateData::LineJoinMiter:

+        default: {

+                join = kCGLineJoinMiter;

+            }

+    }

+    CGContextSetLineJoin(_context, join);

+    if (graphState->m_DashCount) {

+#if CGFLOAT_IS_DOUBLE

+        CGFloat* dashArray = new CGFloat[graphState->m_DashCount];

+        if (!dashArray) {

+            return;

+        }

+        for (int index = 0; index < graphState->m_DashCount; ++index) {

+            dashArray[index] = graphState->m_DashArray[index];

+        }

+#else

+        CGFloat* dashArray = (CGFloat*)graphState->m_DashArray;

+#endif

+        CGContextSetLineDash(_context, graphState->m_DashPhase, dashArray, graphState->m_DashCount);

+#if CGFLOAT_IS_DOUBLE

+        delete[] dashArray;

+#endif

+    }

+    FX_INT32 a, r, g, b;

+    ArgbDecode(argb, a, r, g, b);

+    CGContextSetRGBStrokeColor(_context,

+                               r / 255.f,

+                               g / 255.f,

+                               b / 255.f,

+                               a / 255.f);

+}

+void CFX_QuartzDeviceDriver::setFillInfo(FX_ARGB argb)

+{

+    FX_INT32 a, r, g, b;

+    ArgbDecode(argb, a, r, g, b);

+    CGContextSetRGBFillColor(_context,

+                             r / 255.f,

+                             g / 255.f,

+                             b / 255.f,

+                             a / 255.f);

+}

+void CFX_QuartzDeviceDriver::setPathToContext(const CFX_PathData* pathData)

+{

+    FX_INT32 count = pathData->GetPointCount();

+    FX_PATHPOINT* points = pathData->GetPoints();

+    CGContextBeginPath(_context);

+    for (FX_INT32 i = 0; i < count; i ++) {

+        switch (points[i].m_Flag & FXPT_TYPE) {

+            case FXPT_MOVETO:

+                CGContextMoveToPoint(_context, points[i].m_PointX, points[i].m_PointY);

+                break;

+            case FXPT_LINETO:

+                CGContextAddLineToPoint(_context, points[i].m_PointX, points[i].m_PointY);

+                break;

+            case FXPT_BEZIERTO: {

+                    CGContextAddCurveToPoint(_context,

+                                             points[i].m_PointX, points[i].m_PointY,

+                                             points[i + 1].m_PointX, points[i + 1].m_PointY,

+                                             points[i + 2].m_PointX, points[i + 2].m_PointY);

+                    i += 2;

+                }

+        }

+        if (points[i].m_Flag & FXPT_CLOSEFIGURE) {

+            CGContextClosePath(_context);

+        }

+    }

+}

+void CFX_QuartzDeviceDriver::CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height,

+        CGRect* rect )

+{

+    int flip_y = _foxitDevice2User.d * dest_height < 0 ? 1 : -1;

+    int flip_x = _foxitDevice2User.a * dest_width > 0 ? 1 : -1;

+    if (flip_y < 0 || flip_x < 0) {

+        if (dest_height < 0) {

+            dest_height = -dest_height;

+            dest_top -= dest_height;

+        }

+        CGRect rt = CGRectApplyAffineTransform(CGRectMake(dest_left, dest_top, dest_width, dest_height), _foxitDevice2User);

+        CGFloat offset_x = (rt.origin.x) + rt.size.width / 2.f,

+                offset_y = (rt.origin.y) + rt.size.height / 2.f;

+        CGAffineTransform transform = CGAffineTransformIdentity;

+        transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, -offset_x, -offset_y));

+        transform = CGAffineTransformConcat(transform, CGAffineTransformMake(flip_x, 0, 0, flip_y, 0, 0));

+        transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, offset_x, offset_y));

+        CGContextConcatCTM(_context, transform);

+        if (rect) {

+            *rect = CGRectApplyAffineTransform(*rect, transform);

+        }

+    }

+}

+void CFX_QuartzDeviceDriver::ClearDriver()

+{

+    if (NULL == _context) {

+        return;

+    }

+    for (int i = 0; i < m_saveCount; ++i) {

+        CGContextRestoreGState(_context);

+    }

+    m_saveCount = 0;

+    if (_context) {

+        CGContextRelease(_context);

+    }

+}

+CFX_QuartzDevice::CFX_QuartzDevice()

+{

+    m_bOwnedBitmap = FALSE;

+    m_pContext = NULL;

+}

+CFX_QuartzDevice::~CFX_QuartzDevice()

+{

+    if (m_pContext) {

+        CGContextRelease(m_pContext);

+    }

+    if (GetBitmap() && m_bOwnedBitmap) {

+        delete GetBitmap();

+    }

+}

+CGContextRef CFX_QuartzDevice::GetContext()

+{

+    return m_pContext;

+}

+FX_BOOL CFX_QuartzDevice::Attach(CGContextRef context, FX_INT32 nDeviceClass)

+{

+    if (m_pContext) {

+        CGContextRelease(m_pContext);

+    }

+    m_pContext = context;

+    CGContextRetain(m_pContext);

+    IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_QuartzDeviceDriver(m_pContext, nDeviceClass);

+    if (!pDriver) {

+        return FALSE;

+    }

+    SetDeviceDriver(pDriver);

+    return TRUE;

+}

+FX_BOOL CFX_QuartzDevice::Attach(CFX_DIBitmap* pBitmap)

+{

+    SetBitmap(pBitmap);

+    m_pContext = createContextWithBitmap(pBitmap);

+    if (NULL == m_pContext) {

+        return FALSE;

+    }

+    IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_QuartzDeviceDriver(m_pContext, FXDC_DISPLAY);

+    if (!pDriver) {

+        return FALSE;

+    }

+    SetDeviceDriver(pDriver);

+    return TRUE;

+}

+FX_BOOL CFX_QuartzDevice::Create(FX_INT32 width, FX_INT32 height, FXDIB_Format format)

+{

+    if ((FX_BYTE)format < 32) {

+        return FALSE;

+    }

+    CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;

+    if (!pBitmap) {

+        return FALSE;

+    }

+    if (!pBitmap->Create(width, height, format)) {

+        delete pBitmap;

+        return FALSE;

+    }

+    m_bOwnedBitmap = TRUE;

+    return Attach(pBitmap);

+}

+#endif

diff --git a/core/src/fxge/dib/dib_int.h b/core/src/fxge/dib/dib_int.h
new file mode 100644
index 0000000..a9d0b02
--- /dev/null
+++ b/core/src/fxge/dib/dib_int.h
@@ -0,0 +1,88 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+class CPDF_FixedMatrix : public CFX_Object

+{

+public:

+    CPDF_FixedMatrix(const CFX_AffineMatrix& src, int bits)

+    {

+        base = 1 << bits;

+        a = FXSYS_round(src.a * base);

+        b = FXSYS_round(src.b * base);

+        c = FXSYS_round(src.c * base);

+        d = FXSYS_round(src.d * base);

+        e = FXSYS_round(src.e * base);

+        f = FXSYS_round(src.f * base);

+    }

+    inline void	Transform(int x, int y, int& x1, int& y1)

+    {

+        x1 = (a * x + c * y + e + base / 2) / base;

+        y1 = (b * x + d * y + f + base / 2) / base;

+    }

+    int		a, b, c, d, e, f;

+    int		base;

+};

+#define FPDF_HUGE_IMAGE_SIZE	60000000

+struct PixelWeight {

+    int		m_SrcStart;

+    int		m_SrcEnd;

+    int		m_Weights[1];

+};

+class CWeightTable : public CFX_Object

+{

+public:

+    CWeightTable()

+    {

+        m_pWeightTables = NULL;

+    }

+    ~CWeightTable()

+    {

+        if(m_pWeightTables) {

+            FX_Free(m_pWeightTables);

+        }

+        m_pWeightTables = NULL;

+    }

+    void			Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags);

+    PixelWeight*	GetPixelWeight(int pixel)

+    {

+        return (PixelWeight*)(m_pWeightTables + (pixel - m_DestMin) * m_ItemSize);

+    }

+    int				m_DestMin, m_ItemSize;

+    FX_LPBYTE		m_pWeightTables;

+};

+class CStretchEngine : public CFX_Object

+{

+public:

+    CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,

+                   int dest_width, int dest_height, const FX_RECT& clip_rect,

+                   const CFX_DIBSource* pSrcBitmap, int flags);

+    ~CStretchEngine();

+    FX_BOOL		Continue(IFX_Pause* pPause);

+public:

+    FXDIB_Format m_DestFormat;

+    int		m_DestBpp, m_SrcBpp, m_bHasAlpha;

+    IFX_ScanlineComposer*	m_pDestBitmap;

+    int		m_DestWidth, m_DestHeight;

+    FX_RECT	m_DestClip;

+    FX_LPBYTE	m_pDestScanline;

+    FX_LPBYTE   m_pDestMaskScanline;

+    FX_RECT	m_SrcClip;

+    const CFX_DIBSource*	m_pSource;

+    FX_DWORD*	m_pSrcPalette;

+    int		m_SrcWidth, m_SrcHeight;

+    int		m_SrcPitch, m_InterPitch;

+    int m_ExtraMaskPitch;

+    unsigned char*	m_pInterBuf;

+    unsigned char*	m_pExtraAlphaBuf;

+    int		m_TransMethod;

+    int 	m_Flags;

+    CWeightTable	m_WeightTable;

+    int		m_CurRow;

+    FX_BOOL	StartStretchHorz();

+    FX_BOOL	ContinueStretchHorz(IFX_Pause* pPause);

+    void	StretchVert();

+    int		m_State;

+};

diff --git a/core/src/fxge/dib/fx_dib_composite.cpp b/core/src/fxge/dib/fx_dib_composite.cpp
new file mode 100644
index 0000000..8e9b491
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_composite.cpp
@@ -0,0 +1,4602 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "dib_int.h"

+const FX_BYTE g_GammaRamp[256] = {

+    0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,

+    1,   1,   2,   2,   2,   2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   3,

+    4,   4,   4,   4,   4,   5,   5,   5,   5,   6,   6,   6,   6,   7,   7,   7,

+    8,   8,   8,   8,   9,   9,   9,  10,  10,  10,  11,  11,  12,  12,  12,  13,

+    13,  13,  14,  14,  15,  15,  16,  16,  17,  17,  17,  18,  18,  19,  19,  20,

+    20,  21,  22,  22,  23,  23,  24,  24,  25,  25,  26,  27,  27,  28,  29,  29,

+    30,  30,  31,  32,  32,  33,  34,  35,  35,  36,  37,  37,  38,  39,  40,  41,

+    41,  42,  43,  44,  45,  45,  46,  47,  48,  49,  50,  51,  51,  52,  53,  54,

+    55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,

+    71,  72,  73,  74,  76,  77,  78,  79,  80,  81,  82,  84,  85,  86,  87,  88,

+    90,  91,  92,  93,  95,  96,  97,  99, 100, 101, 103, 104, 105, 107, 108, 109,

+    111, 112, 114, 115, 116, 118, 119, 121, 122, 124, 125, 127, 128, 130, 131, 133,

+    134, 136, 138, 139, 141, 142, 144, 146, 147, 149, 151, 152, 154, 156, 157, 159,

+    161, 163, 164, 166, 168, 170, 171, 173, 175, 177, 179, 181, 183, 184, 186, 188,

+    190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220,

+    222, 224, 226, 229, 231, 233, 235, 237, 239, 242, 244, 246, 248, 250, 253, 255,

+};

+const FX_BYTE g_GammaInverse[256] = {

+    0,  13,  22,  28,  34,  38,  42,  46,  50,  53,  56,  59,  61,  64,  66,  69,

+    71,  73,  75,  77,  79,  81,  83,  85,  86,  88,  90,  92,  93,  95,  96,  98,

+    99, 101, 102, 104, 105, 106, 108, 109, 110, 112, 113, 114, 115, 117, 118, 119,

+    120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,

+    137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,

+    152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,

+    165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,

+    177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,

+    188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,

+    198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,

+    208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,

+    216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,

+    225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,

+    233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,

+    241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,

+    248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,

+};

+const FX_BYTE _color_sqrt[256] = {

+    0x00, 0x03, 0x07, 0x0B, 0x0F, 0x12, 0x16, 0x19, 0x1D, 0x20, 0x23, 0x26, 0x29, 0x2C, 0x2F, 0x32,

+    0x35, 0x37, 0x3A, 0x3C, 0x3F, 0x41, 0x43, 0x46, 0x48, 0x4A, 0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56,

+    0x57, 0x59, 0x5B, 0x5C, 0x5E, 0x60, 0x61, 0x63, 0x64, 0x65, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D,

+    0x6E, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E,

+    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,

+    0x8F, 0x90, 0x91, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C,

+    0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA4, 0xA5, 0xA6, 0xA7, 0xA7, 0xA8,

+    0xA9, 0xAA, 0xAA, 0xAB, 0xAC, 0xAD, 0xAD, 0xAE, 0xAF, 0xB0, 0xB0, 0xB1, 0xB2, 0xB3, 0xB3, 0xB4,

+    0xB5, 0xB5, 0xB6, 0xB7, 0xB7, 0xB8, 0xB9, 0xBA, 0xBA, 0xBB, 0xBC, 0xBC, 0xBD, 0xBE, 0xBE, 0xBF,

+    0xC0, 0xC0, 0xC1, 0xC2, 0xC2, 0xC3, 0xC4, 0xC4, 0xC5, 0xC6, 0xC6, 0xC7, 0xC7, 0xC8, 0xC9, 0xC9,

+    0xCA, 0xCB, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCE, 0xCF, 0xD0, 0xD0, 0xD1, 0xD1, 0xD2, 0xD3, 0xD3,

+    0xD4, 0xD4, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD8, 0xD9, 0xD9, 0xDA, 0xDA, 0xDB, 0xDC, 0xDC, 0xDD,

+    0xDD, 0xDE, 0xDE, 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE2, 0xE3, 0xE4, 0xE4, 0xE5, 0xE5, 0xE6,

+    0xE6, 0xE7, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEB, 0xEB, 0xEC, 0xEC, 0xED, 0xED, 0xEE, 0xEE,

+    0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 0xF2, 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF7,

+    0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFF

+};

+int _BLEND(int blend_mode, int back_color, int src_color)

+{

+    switch (blend_mode) {

+        case FXDIB_BLEND_NORMAL:

+            return src_color;

+        case FXDIB_BLEND_MULTIPLY:

+            return src_color * back_color / 255;

+        case FXDIB_BLEND_SCREEN:

+            return src_color + back_color - src_color * back_color / 255;

+        case FXDIB_BLEND_OVERLAY:

+            return _BLEND(FXDIB_BLEND_HARDLIGHT, src_color, back_color);

+        case FXDIB_BLEND_DARKEN:

+            return src_color < back_color ? src_color : back_color;

+        case FXDIB_BLEND_LIGHTEN:

+            return src_color > back_color ? src_color : back_color;

+        case FXDIB_BLEND_COLORDODGE: {

+                if (src_color == 255) {

+                    return src_color;

+                }

+                int result = back_color * 255 / (255 - src_color);

+                if (result > 255) {

+                    return 255;

+                }

+                return result;

+            }

+        case FXDIB_BLEND_COLORBURN: {

+                if (src_color == 0) {

+                    return src_color;

+                }

+                int result = (255 - back_color) * 255 / src_color;

+                if (result > 255) {

+                    result = 255;

+                }

+                return 255 - result;

+            }

+        case FXDIB_BLEND_HARDLIGHT:

+            if (src_color < 128) {

+                return (src_color * back_color * 2) / 255;

+            }

+            return _BLEND(FXDIB_BLEND_SCREEN, back_color, 2 * src_color - 255);

+        case FXDIB_BLEND_SOFTLIGHT: {

+                if (src_color < 128) {

+                    return back_color - (255 - 2 * src_color) * back_color * (255 - back_color) / 255 / 255;

+                }

+                return back_color + (2 * src_color - 255) * (_color_sqrt[back_color] - back_color) / 255;

+            }

+        case FXDIB_BLEND_DIFFERENCE:

+            return back_color < src_color ? src_color - back_color : back_color - src_color;

+        case FXDIB_BLEND_EXCLUSION:

+            return back_color + src_color - 2 * back_color * src_color / 255;

+    }

+    return src_color;

+}

+struct _RGB {

+    int red;

+    int green;

+    int blue;

+};

+static inline int _Lum(_RGB color)

+{

+    return (color.red * 30 + color.green * 59 + color.blue * 11) / 100;

+}

+static _RGB _ClipColor(_RGB color)

+{

+    int l = _Lum(color);

+    int n = color.red;

+    if (color.green < n) {

+        n = color.green;

+    }

+    if (color.blue < n) {

+        n = color.blue;

+    }

+    int x = color.red;

+    if (color.green > x) {

+        x = color.green;

+    }

+    if (color.blue > x) {

+        x = color.blue;

+    }

+    if (n < 0) {

+        color.red = l + ((color.red - l) * l / (l - n));

+        color.green = l + ((color.green - l) * l / (l - n));

+        color.blue = l + ((color.blue - l) * l / (l - n));

+    }

+    if (x > 255) {

+        color.red = l + ((color.red - l) * (255 - l) / (x - l));

+        color.green = l + ((color.green - l) * (255 - l) / (x - l));

+        color.blue = l + ((color.blue - l) * (255 - l) / (x - l));

+    }

+    return color;

+}

+static _RGB _SetLum(_RGB color, int l)

+{

+    int d = l - _Lum(color);

+    color.red += d;

+    color.green += d;

+    color.blue += d;

+    return _ClipColor(color);

+}

+static int _Sat(_RGB color)

+{

+    int n = color.red;

+    if (color.green < n) {

+        n = color.green;

+    }

+    if (color.blue < n) {

+        n = color.blue;

+    }

+    int x = color.red;

+    if (color.green > x) {

+        x = color.green;

+    }

+    if (color.blue > x) {

+        x = color.blue;

+    }

+    return x - n;

+}

+static _RGB _SetSat(_RGB color, int s)

+{

+    int* max = &color.red;

+    int* mid = &color.red;

+    int* min = &color.red;

+    if (color.green > *max) {

+        max = &color.green;

+    }

+    if (color.blue > *max) {

+        max = &color.blue;

+    }

+    if (color.green < *min) {

+        min = &color.green;

+    }

+    if (color.blue < *min) {

+        min = &color.blue;

+    }

+    if (*max == *min) {

+        color.red = 0;

+        color.green = 0;

+        color.blue = 0;

+        return color;

+    }

+    if (max == &color.red) {

+        if (min == &color.green) {

+            mid = &color.blue;

+        } else {

+            mid = &color.green;

+        }

+    } else if (max == &color.green) {

+        if (min == &color.red) {

+            mid = &color.blue;

+        } else {

+            mid = &color.red;

+        }

+    } else {

+        if (min == &color.green) {

+            mid = &color.red;

+        } else {

+            mid = &color.green;

+        }

+    }

+    if (*max > *min) {

+        *mid = (*mid - *min) * s / (*max - *min);

+        *max = s;

+        *min = 0;

+    }

+    return color;

+}

+void _RGB_Blend(int blend_mode, FX_LPCBYTE src_scan, FX_BYTE* dest_scan, int results[3])

+{

+    _RGB src, back, result;

+    src.red = src_scan[2];

+    src.green = src_scan[1];

+    src.blue = src_scan[0];

+    back.red = dest_scan[2];

+    back.green = dest_scan[1];

+    back.blue = dest_scan[0];

+    switch (blend_mode) {

+        case FXDIB_BLEND_HUE:

+            result = _SetLum(_SetSat(src, _Sat(back)), _Lum(back));

+            break;

+        case FXDIB_BLEND_SATURATION:

+            result = _SetLum(_SetSat(back, _Sat(src)), _Lum(back));

+            break;

+        case FXDIB_BLEND_COLOR:

+            result = _SetLum(src, _Lum(back));

+            break;

+        case FXDIB_BLEND_LUMINOSITY:

+            result = _SetLum(back, _Lum(src));

+            break;

+    }

+    results[0] = result.blue;

+    results[1] = result.green;

+    results[2] = result.red;

+}

+inline void _CompositeRow_Argb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, FX_LPCBYTE clip_scan)

+{

+    src_scan += 3;

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_alpha = *src_scan;

+        if (clip_scan) {

+            src_alpha = clip_scan[col] * src_alpha / 255;

+        }

+        FX_BYTE back_alpha = *dest_scan;

+        if (!back_alpha) {

+            *dest_scan = src_alpha;

+        } else if (src_alpha) {

+            *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        }

+        dest_scan ++;

+        src_scan += 4;

+    }

+}

+void _CompositeRow_Rgba2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_alpha_scan, int pixel_count, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_alpha = *src_alpha_scan++;

+        if (clip_scan) {

+            src_alpha = clip_scan[col] * src_alpha / 255;

+        }

+        FX_BYTE back_alpha = *dest_scan;

+        if (!back_alpha) {

+            *dest_scan = src_alpha;

+        } else if (src_alpha) {

+            *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        }

+        dest_scan ++;

+    }

+}

+void _CompositeRow_Rgb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan)

+{

+    if (clip_scan) {

+        for (int i = 0; i < width; i ++) {

+            *dest_scan = FXDIB_ALPHA_UNION(*dest_scan, *clip_scan);

+            dest_scan ++;

+            clip_scan ++;

+        }

+    } else {

+        FXSYS_memset8(dest_scan, 0xff, width);

+    }

+}

+void _CompositeRow_Argb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,

+                              FX_LPCBYTE src_alpha_scan, FX_LPBYTE dst_alpha_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = NULL;

+    if (pIccTransform) {

+        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    }

+    if (blend_type) {

+        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+        int blended_color;

+        if (src_alpha_scan) {

+            for (int col = 0; col < pixel_count; col ++) {

+                FX_BYTE back_alpha = *dst_alpha_scan;

+                if (back_alpha == 0) {

+                    int src_alpha = *src_alpha_scan++;

+                    if (clip_scan) {

+                        src_alpha = clip_scan[col] * src_alpha / 255;

+                    }

+                    if (src_alpha) {

+                        if (pIccTransform) {

+                            pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);

+                        } else {

+                            *dest_scan =  FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+                        }

+                        *dst_alpha_scan = src_alpha;

+                    }

+                    dest_scan ++;

+                    dst_alpha_scan ++;

+                    src_scan += 3;

+                    continue;

+                }

+                FX_BYTE src_alpha = *src_alpha_scan++;

+                if (clip_scan) {

+                    src_alpha = clip_scan[col] * src_alpha / 255;

+                }

+                if (src_alpha == 0) {

+                    dest_scan ++;

+                    dst_alpha_scan ++;

+                    src_scan += 3;

+                    continue;

+                }

+                *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);

+                int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);

+                FX_BYTE gray;

+                if (pIccTransform) {

+                    pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);

+                } else {

+                    gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+                }

+                if (bNonseparableBlend) {

+                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;

+                }

+                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);

+                dest_scan ++;

+                dst_alpha_scan++;

+                src_scan += 3;

+            }

+        } else

+            for (int col = 0; col < pixel_count; col ++) {

+                FX_BYTE back_alpha = *dst_alpha_scan;

+                if (back_alpha == 0) {

+                    int src_alpha = src_scan[3];

+                    if (clip_scan) {

+                        src_alpha = clip_scan[col] * src_alpha / 255;

+                    }

+                    if (src_alpha) {

+                        if (pIccTransform) {

+                            pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);

+                        } else {

+                            *dest_scan =  FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+                        }

+                        *dst_alpha_scan = src_alpha;

+                    }

+                    dest_scan ++;

+                    dst_alpha_scan ++;

+                    src_scan += 4;

+                    continue;

+                }

+                FX_BYTE src_alpha = src_scan[3];

+                if (clip_scan) {

+                    src_alpha = clip_scan[col] * src_alpha / 255;

+                }

+                if (src_alpha == 0) {

+                    dest_scan ++;

+                    dst_alpha_scan ++;

+                    src_scan += 4;

+                    continue;

+                }

+                *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);

+                int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);

+                FX_BYTE gray;

+                if (pIccTransform) {

+                    pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);

+                } else {

+                    gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+                }

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);

+                dest_scan ++;

+                dst_alpha_scan++;

+                src_scan += 4;

+            }

+        return;

+    }

+    if (src_alpha_scan) {

+        for (int col = 0; col < pixel_count; col ++) {

+            FX_BYTE back_alpha = *dst_alpha_scan;

+            if (back_alpha == 0) {

+                int src_alpha = *src_alpha_scan++;

+                if (clip_scan) {

+                    src_alpha = clip_scan[col] * src_alpha / 255;

+                }

+                if (src_alpha) {

+                    if (pIccTransform) {

+                        pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);

+                    } else {

+                        *dest_scan =  FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+                    }

+                    *dst_alpha_scan = src_alpha;

+                }

+                dest_scan ++;

+                dst_alpha_scan ++;

+                src_scan += 3;

+                continue;

+            }

+            FX_BYTE src_alpha = *src_alpha_scan++;

+            if (clip_scan) {

+                src_alpha = clip_scan[col] * src_alpha / 255;

+            }

+            if (src_alpha == 0) {

+                dest_scan ++;

+                dst_alpha_scan ++;

+                src_scan += 3;

+                continue;

+            }

+            *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);

+            int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);

+            FX_BYTE gray;

+            if (pIccTransform) {

+                pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);

+            } else {

+                gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+            }

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);

+            dest_scan ++;

+            dst_alpha_scan++;

+            src_scan += 3;

+        }

+    } else

+        for (int col = 0; col < pixel_count; col ++) {

+            FX_BYTE back_alpha = *dst_alpha_scan;

+            if (back_alpha == 0) {

+                int src_alpha = src_scan[3];

+                if (clip_scan) {

+                    src_alpha = clip_scan[col] * src_alpha / 255;

+                }

+                if (src_alpha) {

+                    if (pIccTransform) {

+                        pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);

+                    } else {

+                        *dest_scan =  FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+                    }

+                    *dst_alpha_scan = src_alpha;

+                }

+                dest_scan ++;

+                dst_alpha_scan ++;

+                src_scan += 4;

+                continue;

+            }

+            FX_BYTE src_alpha = src_scan[3];

+            if (clip_scan) {

+                src_alpha = clip_scan[col] * src_alpha / 255;

+            }

+            if (src_alpha == 0) {

+                dest_scan ++;

+                dst_alpha_scan ++;

+                src_scan += 4;

+                continue;

+            }

+            *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);

+            int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);

+            FX_BYTE gray;

+            if (pIccTransform) {

+                pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);

+            } else {

+                gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+            }

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);

+            dest_scan ++;

+            dst_alpha_scan++;

+            src_scan += 4;

+        }

+}

+inline void _CompositeRow_Argb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count,

+                                    int blend_type, FX_LPCBYTE clip_scan,

+                                    FX_LPCBYTE src_alpha_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = NULL;

+    FX_BYTE gray;

+    if (pIccTransform) {

+        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    }

+    if (blend_type) {

+        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+        int blended_color;

+        if (src_alpha_scan) {

+            for (int col = 0; col < pixel_count; col ++) {

+                int src_alpha = *src_alpha_scan++;

+                if (clip_scan) {

+                    src_alpha = clip_scan[col] * src_alpha / 255;

+                }

+                if (src_alpha) {

+                    if (pIccTransform) {

+                        pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);

+                    } else {

+                        gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+                    }

+                    if (bNonseparableBlend) {

+                        blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;

+                    }

+                    gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);

+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);

+                }

+                dest_scan ++;

+                src_scan += 3;

+            }

+        } else

+            for (int col = 0; col < pixel_count; col ++) {

+                int src_alpha = src_scan[3];

+                if (clip_scan) {

+                    src_alpha = clip_scan[col] * src_alpha / 255;

+                }

+                if (src_alpha) {

+                    if (pIccTransform) {

+                        pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);

+                    } else {

+                        gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+                    }

+                    if (bNonseparableBlend) {

+                        blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;

+                    }

+                    gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);

+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);

+                }

+                dest_scan ++;

+                src_scan += 4;

+            }

+        return;

+    }

+    if (src_alpha_scan) {

+        for (int col = 0; col < pixel_count; col ++) {

+            int src_alpha = *src_alpha_scan++;

+            if (clip_scan) {

+                src_alpha = clip_scan[col] * src_alpha / 255;

+            }

+            if (src_alpha) {

+                if (pIccTransform) {

+                    pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);

+                } else {

+                    gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+                }

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);

+            }

+            dest_scan ++;

+            src_scan += 3;

+        }

+    } else

+        for (int col = 0; col < pixel_count; col ++) {

+            int src_alpha = src_scan[3];

+            if (clip_scan) {

+                src_alpha = clip_scan[col] * src_alpha / 255;

+            }

+            if (src_alpha) {

+                if (pIccTransform) {

+                    pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);

+                } else {

+                    gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+                }

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);

+            }

+            dest_scan ++;

+            src_scan += 4;

+        }

+}

+inline void _CompositeRow_Rgb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,

+                                   int blend_type, FX_LPCBYTE clip_scan,

+                                   void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = NULL;

+    FX_BYTE gray;

+    if (pIccTransform) {

+        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    }

+    if (blend_type) {

+        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+        int blended_color;

+        for (int col = 0; col < pixel_count; col ++) {

+            if (pIccTransform) {

+                pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);

+            } else {

+                gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+            }

+            if (bNonseparableBlend) {

+                blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;

+            }

+            gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);

+            if (clip_scan && clip_scan[col] < 255) {

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);

+            } else {

+                *dest_scan = gray;

+            }

+            dest_scan ++;

+            src_scan += src_Bpp;

+        }

+        return;

+    }

+    for (int col = 0; col < pixel_count; col ++) {

+        if (pIccTransform) {

+            pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);

+        } else {

+            gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+        }

+        if (clip_scan && clip_scan[col] < 255) {

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);

+        } else {

+            *dest_scan = gray;

+        }

+        dest_scan ++;

+        src_scan += src_Bpp;

+    }

+}

+void _CompositeRow_Rgb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,

+                             int blend_type, FX_LPCBYTE clip_scan,

+                             FX_LPBYTE dest_alpha_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = NULL;

+    if (pIccTransform) {

+        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    }

+    if (blend_type) {

+        int blended_color;

+        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+        for (int col = 0; col < pixel_count; col ++) {

+            int back_alpha = *dest_alpha_scan;

+            if (back_alpha == 0) {

+                if (pIccTransform) {

+                    pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);

+                } else {

+                    *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+                }

+                dest_scan ++;

+                dest_alpha_scan++;

+                src_scan += src_Bpp;

+                continue;

+            }

+            int src_alpha = 255;

+            if (clip_scan) {

+                src_alpha = clip_scan[col];

+            }

+            if (src_alpha == 0) {

+                dest_scan ++;

+                dest_alpha_scan ++;

+                src_scan += src_Bpp;

+                continue;

+            }

+            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+            *dest_alpha_scan++ = dest_alpha;

+            int alpha_ratio = src_alpha * 255 / dest_alpha;

+            FX_BYTE gray;

+            if (pIccTransform) {

+                pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);

+            } else {

+                gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+            }

+            if (bNonseparableBlend) {

+                blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;

+            }

+            gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);

+            dest_scan ++;

+            src_scan += src_Bpp;

+        }

+        return;

+    }

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_alpha = 255;

+        if (clip_scan) {

+            src_alpha = clip_scan[col];

+        }

+        if (src_alpha == 255) {

+            if (pIccTransform) {

+                pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);

+            } else {

+                *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+            }

+            dest_scan ++;

+            *dest_alpha_scan++ = 255;

+            src_scan += src_Bpp;

+            continue;

+        }

+        if (src_alpha == 0) {

+            dest_scan ++;

+            dest_alpha_scan ++;

+            src_scan += src_Bpp;

+            continue;

+        }

+        int back_alpha = *dest_alpha_scan;

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        *dest_alpha_scan++ = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        FX_BYTE gray;

+        if (pIccTransform) {

+            pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);

+        } else {

+            gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);

+        }

+        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);

+        dest_scan ++;

+        src_scan += src_Bpp;

+    }

+}

+void _CompositeRow_Argb2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,

+                             FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)

+{

+    int blended_colors[3];

+    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+    if (dest_alpha_scan == NULL) {

+        if (src_alpha_scan == NULL) {

+            FX_BYTE back_alpha = 0;

+            for (int col = 0; col < pixel_count; col ++) {

+                back_alpha = dest_scan[3];

+                if (back_alpha == 0) {

+                    if (clip_scan) {

+                        int src_alpha = clip_scan[col] * src_scan[3] / 255;

+                        FXARGB_SETDIB(dest_scan, (FXARGB_GETDIB(src_scan) & 0xffffff) | (src_alpha << 24));

+                    } else {

+                        FXARGB_COPY(dest_scan, src_scan);

+                    }

+                    dest_scan += 4;

+                    src_scan += 4;

+                    continue;

+                }

+                FX_BYTE src_alpha;

+                if (clip_scan == NULL) {

+                    src_alpha = src_scan[3];

+                } else {

+                    src_alpha = clip_scan[col] * src_scan[3] / 255;

+                }

+                if (src_alpha == 0) {

+                    dest_scan += 4;

+                    src_scan += 4;

+                    continue;

+                }

+                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+                dest_scan[3] = dest_alpha;

+                int alpha_ratio = src_alpha * 255 / dest_alpha;

+                if (bNonseparableBlend) {

+                    _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+                }

+                for (int color = 0; color < 3; color ++) {

+                    if (blend_type) {

+                        int blended = bNonseparableBlend ? blended_colors[color] :

+                                      _BLEND(blend_type, *dest_scan, *src_scan);

+                        blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);

+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+                    } else {

+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);

+                    }

+                    dest_scan ++;

+                    src_scan ++;

+                }

+                dest_scan ++;

+                src_scan ++;

+            }

+        } else {

+            for (int col = 0; col < pixel_count; col ++) {

+                FX_BYTE back_alpha = dest_scan[3];

+                if (back_alpha == 0) {

+                    if (clip_scan) {

+                        int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;

+                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE((src_alpha << 24), src_scan[2], src_scan[1], *src_scan));

+                    } else {

+                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE((*src_alpha_scan << 24), src_scan[2], src_scan[1], *src_scan));

+                    }

+                    dest_scan += 4;

+                    src_scan += 3;

+                    src_alpha_scan ++;

+                    continue;

+                }

+                FX_BYTE src_alpha;

+                if (clip_scan == NULL) {

+                    src_alpha = *src_alpha_scan ++;

+                } else {

+                    src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;

+                }

+                if (src_alpha == 0) {

+                    dest_scan += 4;

+                    src_scan += 3;

+                    continue;

+                }

+                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+                dest_scan[3] = dest_alpha;

+                int alpha_ratio = src_alpha * 255 / dest_alpha;

+                if (bNonseparableBlend) {

+                    _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+                }

+                for (int color = 0; color < 3; color ++) {

+                    if (blend_type) {

+                        int blended = bNonseparableBlend ? blended_colors[color] :

+                                      _BLEND(blend_type, *dest_scan, *src_scan);

+                        blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);

+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+                    } else {

+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);

+                    }

+                    dest_scan ++;

+                    src_scan ++;

+                }

+                dest_scan ++;

+            }

+        }

+    } else {

+        if (src_alpha_scan) {

+            for (int col = 0; col < pixel_count; col ++) {

+                FX_BYTE back_alpha = *dest_alpha_scan;

+                if (back_alpha == 0) {

+                    if (clip_scan) {

+                        int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;

+                        *dest_alpha_scan = src_alpha;

+                        *dest_scan++ = *src_scan++;

+                        *dest_scan++ = *src_scan++;

+                        *dest_scan++ = *src_scan++;

+                    } else {

+                        *dest_alpha_scan = *src_alpha_scan;

+                        *dest_scan++ = *src_scan++;

+                        *dest_scan++ = *src_scan++;

+                        *dest_scan++ = *src_scan++;

+                    }

+                    dest_alpha_scan ++;

+                    src_alpha_scan ++;

+                    continue;

+                }

+                FX_BYTE src_alpha;

+                if (clip_scan == NULL) {

+                    src_alpha = *src_alpha_scan ++;

+                } else {

+                    src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;

+                }

+                if (src_alpha == 0) {

+                    dest_scan += 3;

+                    src_scan += 3;

+                    dest_alpha_scan ++;

+                    continue;

+                }

+                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+                *dest_alpha_scan ++ = dest_alpha;

+                int alpha_ratio = src_alpha * 255 / dest_alpha;

+                if (bNonseparableBlend) {

+                    _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+                }

+                for (int color = 0; color < 3; color ++) {

+                    if (blend_type) {

+                        int blended = bNonseparableBlend ? blended_colors[color] :

+                                      _BLEND(blend_type, *dest_scan, *src_scan);

+                        blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);

+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+                    } else {

+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);

+                    }

+                    dest_scan ++;

+                    src_scan ++;

+                }

+            }

+        } else {

+            for (int col = 0; col < pixel_count; col ++) {

+                FX_BYTE back_alpha = *dest_alpha_scan;

+                if (back_alpha == 0) {

+                    if (clip_scan) {

+                        int src_alpha = clip_scan[col] * src_scan[3] / 255;

+                        *dest_alpha_scan = src_alpha;

+                        *dest_scan++ = *src_scan++;

+                        *dest_scan++ = *src_scan++;

+                        *dest_scan++ = *src_scan++;

+                    } else {

+                        *dest_alpha_scan = src_scan[3];

+                        *dest_scan++ = *src_scan++;

+                        *dest_scan++ = *src_scan++;

+                        *dest_scan++ = *src_scan++;

+                    }

+                    dest_alpha_scan ++;

+                    src_scan ++;

+                    continue;

+                }

+                FX_BYTE src_alpha;

+                if (clip_scan == NULL) {

+                    src_alpha = src_scan[3];

+                } else {

+                    src_alpha = clip_scan[col] * src_scan[3] / 255;

+                }

+                if (src_alpha == 0) {

+                    dest_scan += 3;

+                    src_scan += 4;

+                    dest_alpha_scan ++;

+                    continue;

+                }

+                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+                *dest_alpha_scan++ = dest_alpha;

+                int alpha_ratio = src_alpha * 255 / dest_alpha;

+                if (bNonseparableBlend) {

+                    _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+                }

+                for (int color = 0; color < 3; color ++) {

+                    if (blend_type) {

+                        int blended = bNonseparableBlend ? blended_colors[color] :

+                                      _BLEND(blend_type, *dest_scan, *src_scan);

+                        blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);

+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+                    } else {

+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);

+                    }

+                    dest_scan ++;

+                    src_scan ++;

+                }

+                src_scan ++;

+            }

+        }

+    }

+}

+void _CompositeRow_Rgb2Argb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,

+        FX_LPBYTE dest_alpha_scan)

+{

+    int blended_colors[3];

+    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+    int src_gap = src_Bpp - 3;

+    if (dest_alpha_scan == NULL) {

+        for (int col = 0; col < width; col ++) {

+            FX_BYTE back_alpha = dest_scan[3];

+            if (back_alpha == 0) {

+                if (src_Bpp == 4) {

+                    FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));

+                } else {

+                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));

+                }

+                dest_scan += 4;

+                src_scan += src_Bpp;

+                continue;

+            }

+            dest_scan[3] = 0xff;

+            if (bNonseparableBlend) {

+                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+            }

+            for (int color = 0; color < 3; color ++) {

+                int src_color = *src_scan;

+                int blended = bNonseparableBlend ? blended_colors[color] :

+                              _BLEND(blend_type, *dest_scan, src_color);

+                *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);

+                dest_scan ++;

+                src_scan ++;

+            }

+            dest_scan ++;

+            src_scan += src_gap;

+        }

+    } else {

+        for (int col = 0; col < width; col ++) {

+            FX_BYTE back_alpha = *dest_alpha_scan;

+            if (back_alpha == 0) {

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                *dest_alpha_scan++ = 0xff;

+                src_scan += src_gap;

+                continue;

+            }

+            *dest_alpha_scan++ = 0xff;

+            if (bNonseparableBlend) {

+                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+            }

+            for (int color = 0; color < 3; color ++) {

+                int src_color = *src_scan;

+                int blended = bNonseparableBlend ? blended_colors[color] :

+                              _BLEND(blend_type, *dest_scan, src_color);

+                *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);

+                dest_scan ++;

+                src_scan ++;

+            }

+            src_scan += src_gap;

+        }

+    }

+}

+inline void _CompositeRow_Rgb2Argb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,

+        FX_LPBYTE dest_alpha_scan)

+{

+    int blended_colors[3];

+    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+    int src_gap = src_Bpp - 3;

+    if (dest_alpha_scan == NULL) {

+        for (int col = 0; col < width; col ++) {

+            int src_alpha = *clip_scan ++;

+            FX_BYTE back_alpha = dest_scan[3];

+            if (back_alpha == 0) {

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                src_scan += src_gap;

+                dest_scan ++;

+                continue;

+            }

+            if (src_alpha == 0) {

+                dest_scan += 4;

+                src_scan += src_Bpp;

+                continue;

+            }

+            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+            dest_scan[3] = dest_alpha;

+            int alpha_ratio = src_alpha * 255 / dest_alpha;

+            if (bNonseparableBlend) {

+                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+            }

+            for (int color = 0; color < 3; color ++) {

+                int src_color = *src_scan;

+                int blended = bNonseparableBlend ? blended_colors[color] :

+                              _BLEND(blend_type, *dest_scan, src_color);

+                blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+                dest_scan ++;

+                src_scan ++;

+            }

+            dest_scan ++;

+            src_scan += src_gap;

+        }

+    } else {

+        for (int col = 0; col < width; col ++) {

+            int src_alpha = *clip_scan ++;

+            FX_BYTE back_alpha = *dest_alpha_scan;

+            if (back_alpha == 0) {

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                src_scan += src_gap;

+                dest_alpha_scan++;

+                continue;

+            }

+            if (src_alpha == 0) {

+                dest_scan += 3;

+                dest_alpha_scan++;

+                src_scan += src_Bpp;

+                continue;

+            }

+            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+            *dest_alpha_scan++ = dest_alpha;

+            int alpha_ratio = src_alpha * 255 / dest_alpha;

+            if (bNonseparableBlend) {

+                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+            }

+            for (int color = 0; color < 3; color ++) {

+                int src_color = *src_scan;

+                int blended = bNonseparableBlend ? blended_colors[color] :

+                              _BLEND(blend_type, *dest_scan, src_color);

+                blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+                dest_scan ++;

+                src_scan ++;

+            }

+            src_scan += src_gap;

+        }

+    }

+}

+inline void _CompositeRow_Rgb2Argb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,

+        FX_LPBYTE dest_alpha_scan)

+{

+    int src_gap = src_Bpp - 3;

+    if (dest_alpha_scan == NULL) {

+        for (int col = 0; col < width; col ++) {

+            int src_alpha = clip_scan[col];

+            if (src_alpha == 255) {

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = 255;

+                src_scan += src_gap;

+                continue;

+            }

+            if (src_alpha == 0) {

+                dest_scan += 4;

+                src_scan += src_Bpp;

+                continue;

+            }

+            int back_alpha = dest_scan[3];

+            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+            dest_scan[3] = dest_alpha;

+            int alpha_ratio = src_alpha * 255 / dest_alpha;

+            for (int color = 0; color < 3; color ++) {

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);

+                dest_scan ++;

+                src_scan ++;

+            }

+            dest_scan ++;

+            src_scan += src_gap;

+        }

+    } else {

+        for (int col = 0; col < width; col ++) {

+            int src_alpha = clip_scan[col];

+            if (src_alpha == 255) {

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                *dest_alpha_scan++ = 255;

+                src_scan += src_gap;

+                continue;

+            }

+            if (src_alpha == 0) {

+                dest_scan += 3;

+                dest_alpha_scan ++;

+                src_scan += src_Bpp;

+                continue;

+            }

+            int back_alpha = *dest_alpha_scan;

+            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+            *dest_alpha_scan ++ = dest_alpha;

+            int alpha_ratio = src_alpha * 255 / dest_alpha;

+            for (int color = 0; color < 3; color ++) {

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);

+                dest_scan ++;

+                src_scan ++;

+            }

+            src_scan += src_gap;

+        }

+    }

+}

+inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,

+        FX_LPBYTE dest_alpha_scan)

+{

+    if (dest_alpha_scan == NULL) {

+        for (int col = 0; col < width; col ++) {

+            if (src_Bpp == 4) {

+                FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));

+            } else {

+                FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));

+            }

+            dest_scan += 4;

+            src_scan += src_Bpp;

+        }

+    } else {

+        int src_gap = src_Bpp - 3;

+        for (int col = 0; col < width; col ++) {

+            *dest_scan++ = *src_scan++;

+            *dest_scan++ = *src_scan++;

+            *dest_scan++ = *src_scan++;

+            *dest_alpha_scan++ = 0xff;

+            src_scan += src_gap;

+        }

+    }

+}

+inline void _CompositeRow_Argb2Rgb_Blend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,

+        FX_LPCBYTE src_alpha_scan)

+{

+    int blended_colors[3];

+    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+    int dest_gap = dest_Bpp - 3;

+    if (src_alpha_scan == NULL) {

+        for (int col = 0; col < width; col ++) {

+            FX_BYTE src_alpha;

+            if (clip_scan) {

+                src_alpha = src_scan[3] * (*clip_scan++) / 255;

+            } else {

+                src_alpha = src_scan[3];

+            }

+            if (src_alpha == 0) {

+                dest_scan += dest_Bpp;

+                src_scan += 4;

+                continue;

+            }

+            if (bNonseparableBlend) {

+                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+            }

+            for (int color = 0; color < 3; color ++) {

+                int back_color = *dest_scan;

+                int blended = bNonseparableBlend ? blended_colors[color] :

+                              _BLEND(blend_type, back_color, *src_scan);

+                *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);

+                dest_scan ++;

+                src_scan ++;

+            }

+            dest_scan += dest_gap;

+            src_scan ++;

+        }

+    } else {

+        for (int col = 0; col < width; col ++) {

+            FX_BYTE src_alpha;

+            if (clip_scan) {

+                src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;

+            } else {

+                src_alpha = *src_alpha_scan++;

+            }

+            if (src_alpha == 0) {

+                dest_scan += dest_Bpp;

+                src_scan += 3;

+                continue;

+            }

+            if (bNonseparableBlend) {

+                _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+            }

+            for (int color = 0; color < 3; color ++) {

+                int back_color = *dest_scan;

+                int blended = bNonseparableBlend ? blended_colors[color] :

+                              _BLEND(blend_type, back_color, *src_scan);

+                *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);

+                dest_scan ++;

+                src_scan ++;

+            }

+            dest_scan += dest_gap;

+        }

+    }

+}

+inline void _CompositeRow_Argb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,

+        FX_LPCBYTE src_alpha_scan)

+{

+    int dest_gap = dest_Bpp - 3;

+    if (src_alpha_scan == NULL) {

+        for (int col = 0; col < width; col ++) {

+            FX_BYTE src_alpha;

+            if (clip_scan) {

+                src_alpha = src_scan[3] * (*clip_scan++) / 255;

+            } else {

+                src_alpha = src_scan[3];

+            }

+            if (src_alpha == 255) {

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                dest_scan += dest_gap;

+                src_scan ++;

+                continue;

+            }

+            if (src_alpha == 0) {

+                dest_scan += dest_Bpp;

+                src_scan += 4;

+                continue;

+            }

+            for (int color = 0; color < 3; color ++) {

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);

+                dest_scan ++;

+                src_scan ++;

+            }

+            dest_scan += dest_gap;

+            src_scan ++;

+        }

+    } else {

+        for (int col = 0; col < width; col ++) {

+            FX_BYTE src_alpha;

+            if (clip_scan) {

+                src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;

+            } else {

+                src_alpha = *src_alpha_scan++;

+            }

+            if (src_alpha == 255) {

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                dest_scan += dest_gap;

+                continue;

+            }

+            if (src_alpha == 0) {

+                dest_scan += dest_Bpp;

+                src_scan += 3;

+                continue;

+            }

+            for (int color = 0; color < 3; color ++) {

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);

+                dest_scan ++;

+                src_scan ++;

+            }

+            dest_scan += dest_gap;

+        }

+    }

+}

+inline void _CompositeRow_Rgb2Rgb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)

+{

+    int blended_colors[3];

+    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+    int dest_gap = dest_Bpp - 3;

+    int src_gap = src_Bpp - 3;

+    for (int col = 0; col < width; col ++) {

+        if (bNonseparableBlend) {

+            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+        }

+        for (int color = 0; color < 3; color ++) {

+            int back_color = *dest_scan;

+            int src_color = *src_scan;

+            int blended = bNonseparableBlend ? blended_colors[color] :

+                          _BLEND(blend_type, back_color, src_color);

+            *dest_scan = blended;

+            dest_scan ++;

+            src_scan ++;

+        }

+        dest_scan += dest_gap;

+        src_scan += src_gap;

+    }

+}

+inline void _CompositeRow_Rgb2Rgb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)

+{

+    int blended_colors[3];

+    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+    int dest_gap = dest_Bpp - 3;

+    int src_gap = src_Bpp - 3;

+    for (int col = 0; col < width; col ++) {

+        FX_BYTE src_alpha = *clip_scan ++;

+        if (src_alpha == 0) {

+            dest_scan += dest_Bpp;

+            src_scan += src_Bpp;

+            continue;

+        }

+        if (bNonseparableBlend) {

+            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+        }

+        for (int color = 0; color < 3; color ++) {

+            int src_color = *src_scan;

+            int back_color = *dest_scan;

+            int blended = bNonseparableBlend ? blended_colors[color] :

+                          _BLEND(blend_type, back_color, src_color);

+            *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);

+            dest_scan ++;

+            src_scan ++;

+        }

+        dest_scan += dest_gap;

+        src_scan += src_gap;

+    }

+}

+inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)

+{

+    if (dest_Bpp == src_Bpp) {

+        FXSYS_memcpy32(dest_scan, src_scan, width * dest_Bpp);

+        return;

+    }

+    for (int col = 0; col < width; col ++) {

+        dest_scan[0] = src_scan[0];

+        dest_scan[1] = src_scan[1];

+        dest_scan[2] = src_scan[2];

+        dest_scan += dest_Bpp;

+        src_scan += src_Bpp;

+    }

+}

+inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < width; col ++) {

+        int src_alpha = clip_scan[col];

+        if (src_alpha == 255) {

+            dest_scan[0] = src_scan[0];

+            dest_scan[1] = src_scan[1];

+            dest_scan[2] = src_scan[2];

+        } else if (src_alpha) {

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);

+            dest_scan ++;

+            src_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);

+            dest_scan ++;

+            src_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);

+            dest_scan += dest_Bpp - 2;

+            src_scan += src_Bpp - 2;

+            continue;

+        }

+        dest_scan += dest_Bpp;

+        src_scan += src_Bpp;

+    }

+}

+void _CompositeRow_Argb2Argb_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,

+                                       FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)

+{

+    FX_LPBYTE dp = src_cache_scan;

+    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    if (src_alpha_scan) {

+        if (dest_alpha_scan == NULL) {

+            for (int col = 0; col < pixel_count; col ++) {

+                pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);

+                dp[3] = *src_alpha_scan++;

+                src_scan += 3;

+                dp += 4;

+            }

+            src_alpha_scan = NULL;

+        } else {

+            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, pixel_count);

+        }

+    } else {

+        if (dest_alpha_scan == NULL) {

+            for (int col = 0; col < pixel_count; col ++) {

+                pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);

+                dp[3] = src_scan[3];

+                src_scan += 4;

+                dp += 4;

+            }

+        } else {

+            int blended_colors[3];

+            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+            for (int col = 0; col < pixel_count; col ++) {

+                pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);

+                FX_BYTE back_alpha = *dest_alpha_scan;

+                if (back_alpha == 0) {

+                    if (clip_scan) {

+                        int src_alpha = clip_scan[col] * src_scan[3] / 255;

+                        *dest_alpha_scan = src_alpha;

+                        *dest_scan++ = *src_cache_scan++;

+                        *dest_scan++ = *src_cache_scan++;

+                        *dest_scan++ = *src_cache_scan++;

+                    } else {

+                        *dest_alpha_scan = src_scan[3];

+                        *dest_scan++ = *src_cache_scan++;

+                        *dest_scan++ = *src_cache_scan++;

+                        *dest_scan++ = *src_cache_scan++;

+                    }

+                    dest_alpha_scan ++;

+                    src_scan += 4;

+                    continue;

+                }

+                FX_BYTE src_alpha;

+                if (clip_scan == NULL) {

+                    src_alpha = src_scan[3];

+                } else {

+                    src_alpha = clip_scan[col] * src_scan[3] / 255;

+                }

+                src_scan += 4;

+                if (src_alpha == 0) {

+                    dest_scan += 3;

+                    src_cache_scan += 3;

+                    dest_alpha_scan ++;

+                    continue;

+                }

+                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+                *dest_alpha_scan ++ = dest_alpha;

+                int alpha_ratio = src_alpha * 255 / dest_alpha;

+                if (bNonseparableBlend) {

+                    _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);

+                }

+                for (int color = 0; color < 3; color ++) {

+                    if (blend_type) {

+                        int blended = bNonseparableBlend ? blended_colors[color] :

+                                      _BLEND(blend_type, *dest_scan, *src_cache_scan);

+                        blended = FXDIB_ALPHA_MERGE(*src_cache_scan, blended, back_alpha);

+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+                    } else {

+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, alpha_ratio);

+                    }

+                    dest_scan ++;

+                    src_cache_scan ++;

+                }

+            }

+            return;

+        }

+    }

+    _CompositeRow_Argb2Argb(dest_scan, src_cache_scan, pixel_count, blend_type, clip_scan, dest_alpha_scan, src_alpha_scan);

+}

+void _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,

+        FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    if (src_Bpp == 3) {

+        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);

+    } else {

+        FX_LPBYTE dp = src_cache_scan;

+        for (int col = 0; col < width; col ++) {

+            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);

+            src_scan += 4;

+            dp += 3;

+        }

+    }

+    _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, 3, dest_alpha_scan);

+}

+inline void _CompositeRow_Rgb2Argb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,

+        FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    if (src_Bpp == 3) {

+        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);

+    } else {

+        FX_LPBYTE dp = src_cache_scan;

+        for (int col = 0; col < width; col ++) {

+            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);

+            src_scan += 4;

+            dp += 3;

+        }

+    }

+    _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, 3, clip_scan, dest_alpha_scan);

+}

+inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,

+        FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    if (src_Bpp == 3) {

+        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);

+    } else {

+        FX_LPBYTE dp = src_cache_scan;

+        for (int col = 0; col < width; col ++) {

+            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);

+            src_scan += 4;

+            dp += 3;

+        }

+    }

+    _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_cache_scan, width, 3, clip_scan, dest_alpha_scan);

+}

+inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,

+        FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    if (src_Bpp == 3) {

+        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);

+    } else {

+        FX_LPBYTE dp = src_cache_scan;

+        for (int col = 0; col < width; col ++) {

+            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);

+            src_scan += 4;

+            dp += 3;

+        }

+    }

+    _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_cache_scan, width, 3, dest_alpha_scan);

+}

+inline void _CompositeRow_Argb2Rgb_Blend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,

+        FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    if (src_alpha_scan) {

+        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);

+    } else {

+        int blended_colors[3];

+        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+        int dest_gap = dest_Bpp - 3;

+        for (int col = 0; col < width; col ++) {

+            pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);

+            FX_BYTE src_alpha;

+            if (clip_scan) {

+                src_alpha = src_scan[3] * (*clip_scan++) / 255;

+            } else {

+                src_alpha = src_scan[3];

+            }

+            src_scan += 4;

+            if (src_alpha == 0) {

+                dest_scan += dest_Bpp;

+                src_cache_scan += 3;

+                continue;

+            }

+            if (bNonseparableBlend) {

+                _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);

+            }

+            for (int color = 0; color < 3; color ++) {

+                int back_color = *dest_scan;

+                int blended = bNonseparableBlend ? blended_colors[color] :

+                              _BLEND(blend_type, back_color, *src_cache_scan);

+                *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);

+                dest_scan ++;

+                src_cache_scan ++;

+            }

+            dest_scan += dest_gap;

+        }

+        return;

+    }

+    _CompositeRow_Argb2Rgb_Blend(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, clip_scan, src_alpha_scan);

+}

+inline void _CompositeRow_Argb2Rgb_NoBlend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,

+        FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    if (src_alpha_scan) {

+        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);

+    } else {

+        int dest_gap = dest_Bpp - 3;

+        for (int col = 0; col < width; col ++) {

+            pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);

+            FX_BYTE src_alpha;

+            if (clip_scan) {

+                src_alpha = src_scan[3] * (*clip_scan++) / 255;

+            } else {

+                src_alpha = src_scan[3];

+            }

+            src_scan += 4;

+            if (src_alpha == 255) {

+                *dest_scan++ = *src_cache_scan++;

+                *dest_scan++ = *src_cache_scan++;

+                *dest_scan++ = *src_cache_scan++;

+                dest_scan += dest_gap;

+                continue;

+            }

+            if (src_alpha == 0) {

+                dest_scan += dest_Bpp;

+                src_cache_scan += 3;

+                continue;

+            }

+            for (int color = 0; color < 3; color ++) {

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, src_alpha);

+                dest_scan ++;

+                src_cache_scan ++;

+            }

+            dest_scan += dest_gap;

+        }

+        return;

+    }

+    _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_cache_scan, width, dest_Bpp, clip_scan, src_alpha_scan);

+}

+inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp,

+        FX_LPBYTE src_cache_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    if (src_Bpp == 3) {

+        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);

+    } else {

+        FX_LPBYTE dp = src_cache_scan;

+        for (int col = 0; col < width; col ++) {

+            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);

+            src_scan += 4;

+            dp += 3;

+        }

+    }

+    _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3);

+}

+inline void _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,

+        FX_LPBYTE src_cache_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    if (src_Bpp == 3) {

+        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);

+    } else {

+        FX_LPBYTE dp = src_cache_scan;

+        for (int col = 0; col < width; col ++) {

+            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);

+            src_scan += 4;

+            dp += 3;

+        }

+    }

+    _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3, clip_scan);

+}

+inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp,

+        FX_LPBYTE src_cache_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    if (src_Bpp == 3) {

+        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);

+    } else {

+        FX_LPBYTE dp = src_cache_scan;

+        for (int col = 0; col < width; col ++) {

+            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);

+            src_scan += 4;

+            dp += 3;

+        }

+    }

+    _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_cache_scan, width, dest_Bpp, 3);

+}

+inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,

+        FX_LPBYTE src_cache_scan, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    if (src_Bpp == 3) {

+        pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);

+    } else {

+        FX_LPBYTE dp = src_cache_scan;

+        for (int col = 0; col < width; col ++) {

+            pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);

+            src_scan += 4;

+            dp += 3;

+        }

+    }

+    _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_cache_scan, width, dest_Bpp, 3, clip_scan);

+}

+inline void _CompositeRow_8bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,

+                                       int blend_type, FX_LPCBYTE clip_scan,

+                                       FX_LPCBYTE src_alpha_scan)

+{

+    if (src_alpha_scan) {

+        if (blend_type) {

+            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+            int blended_color;

+            for (int col = 0; col < pixel_count; col ++) {

+                FX_BYTE gray = pPalette[*src_scan];

+                int src_alpha = *src_alpha_scan++;

+                if (clip_scan) {

+                    src_alpha = clip_scan[col] * src_alpha / 255;

+                }

+                if (bNonseparableBlend) {

+                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;

+                }

+                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);

+                if (src_alpha) {

+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);

+                } else {

+                    *dest_scan = gray;

+                }

+                dest_scan ++;

+                src_scan ++;

+            }

+            return;

+        }

+        for (int col = 0; col < pixel_count; col ++) {

+            FX_BYTE gray = pPalette[*src_scan];

+            int src_alpha = *src_alpha_scan++;

+            if (clip_scan) {

+                src_alpha = clip_scan[col] * src_alpha / 255;

+            }

+            if (src_alpha) {

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);

+            } else {

+                *dest_scan = gray;

+            }

+            dest_scan ++;

+            src_scan ++;

+        }

+    } else {

+        if (blend_type) {

+            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+            int blended_color;

+            for (int col = 0; col < pixel_count; col ++) {

+                FX_BYTE gray = pPalette[*src_scan];

+                if (bNonseparableBlend) {

+                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;

+                }

+                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);

+                if (clip_scan && clip_scan[col] < 255) {

+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);

+                } else {

+                    *dest_scan = gray;

+                }

+                dest_scan ++;

+                src_scan ++;

+            }

+            return;

+        }

+        for (int col = 0; col < pixel_count; col ++) {

+            FX_BYTE gray = pPalette[*src_scan];

+            if (clip_scan && clip_scan[col] < 255) {

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);

+            } else {

+                *dest_scan = gray;

+            }

+            dest_scan ++;

+            src_scan ++;

+        }

+    }

+}

+inline void _CompositeRow_8bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,

+                                        int blend_type, FX_LPCBYTE clip_scan,

+                                        FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)

+{

+    if (src_alpha_scan) {

+        if (blend_type) {

+            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+            int blended_color;

+            for (int col = 0; col < pixel_count; col ++) {

+                FX_BYTE gray = pPalette[*src_scan];

+                src_scan ++;

+                FX_BYTE back_alpha = *dest_alpha_scan;

+                if (back_alpha == 0) {

+                    int src_alpha = *src_alpha_scan ++;

+                    if (clip_scan) {

+                        src_alpha = clip_scan[col] * src_alpha / 255;

+                    }

+                    if (src_alpha) {

+                        *dest_scan = gray;

+                        *dest_alpha_scan = src_alpha;

+                    }

+                    dest_scan ++;

+                    dest_alpha_scan ++;

+                    continue;

+                }

+                FX_BYTE src_alpha = *src_alpha_scan++;

+                if (clip_scan) {

+                    src_alpha = clip_scan[col] * src_alpha / 255;

+                }

+                if (src_alpha == 0) {

+                    dest_scan ++;

+                    dest_alpha_scan ++;

+                    continue;

+                }

+                *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+                int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);

+                if (bNonseparableBlend) {

+                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;

+                }

+                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);

+                dest_alpha_scan ++;

+                dest_scan ++;

+            }

+            return;

+        }

+        for (int col = 0; col < pixel_count; col ++) {

+            FX_BYTE gray = pPalette[*src_scan];

+            src_scan ++;

+            FX_BYTE back_alpha = *dest_alpha_scan;

+            if (back_alpha == 0) {

+                int src_alpha = *src_alpha_scan ++;

+                if (clip_scan) {

+                    src_alpha = clip_scan[col] * src_alpha / 255;

+                }

+                if (src_alpha) {

+                    *dest_scan = gray;

+                    *dest_alpha_scan = src_alpha;

+                }

+                dest_scan ++;

+                dest_alpha_scan ++;

+                continue;

+            }

+            FX_BYTE src_alpha = *src_alpha_scan++;

+            if (clip_scan) {

+                src_alpha = clip_scan[col] * src_alpha / 255;

+            }

+            if (src_alpha == 0) {

+                dest_scan ++;

+                dest_alpha_scan ++;

+                continue;

+            }

+            *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+            int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);

+            dest_alpha_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);

+            dest_scan ++;

+        }

+    } else {

+        if (blend_type) {

+            FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+            int blended_color;

+            for (int col = 0; col < pixel_count; col ++) {

+                FX_BYTE gray = pPalette[*src_scan];

+                src_scan ++;

+                if (clip_scan == NULL || clip_scan[col] == 255) {

+                    *dest_scan++ = gray;

+                    *dest_alpha_scan++ = 255;

+                    continue;

+                }

+                int src_alpha = clip_scan[col];

+                if (src_alpha == 0) {

+                    dest_scan ++;

+                    dest_alpha_scan ++;

+                    continue;

+                }

+                int back_alpha = *dest_alpha_scan;

+                FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+                *dest_alpha_scan ++ = dest_alpha;

+                int alpha_ratio = src_alpha * 255 / dest_alpha;

+                if (bNonseparableBlend) {

+                    blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;

+                }

+                gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);

+                dest_scan ++;

+            }

+            return;

+        }

+        for (int col = 0; col < pixel_count; col ++) {

+            FX_BYTE gray = pPalette[*src_scan];

+            src_scan ++;

+            if (clip_scan == NULL || clip_scan[col] == 255) {

+                *dest_scan++ = gray;

+                *dest_alpha_scan++ = 255;

+                continue;

+            }

+            int src_alpha = clip_scan[col];

+            if (src_alpha == 0) {

+                dest_scan ++;

+                dest_alpha_scan ++;

+                continue;

+            }

+            int back_alpha = *dest_alpha_scan;

+            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+            *dest_alpha_scan ++ = dest_alpha;

+            int alpha_ratio = src_alpha * 255 / dest_alpha;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);

+            dest_scan ++;

+        }

+    }

+}

+inline void _CompositeRow_1bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,

+                                       FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)

+{

+    int reset_gray = pPalette[0];

+    int set_gray = pPalette[1];

+    if (blend_type) {

+        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+        int blended_color;

+        for (int col = 0; col < pixel_count; col ++) {

+            FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;

+            if (bNonseparableBlend) {

+                blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;

+            }

+            gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);

+            if (clip_scan && clip_scan[col] < 255) {

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);

+            } else {

+                *dest_scan = gray;

+            }

+            dest_scan ++;

+        }

+        return;

+    }

+    for (int col = 0; col < pixel_count; col ++) {

+        FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;

+        if (clip_scan && clip_scan[col] < 255) {

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);

+        } else {

+            *dest_scan = gray;

+        }

+        dest_scan ++;

+    }

+}

+inline void _CompositeRow_1bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,

+                                        FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,

+                                        FX_LPBYTE dest_alpha_scan)

+{

+    int reset_gray = pPalette[0];

+    int set_gray = pPalette[1];

+    if (blend_type) {

+        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+        int blended_color;

+        for (int col = 0; col < pixel_count; col ++) {

+            FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;

+            if (clip_scan == NULL || clip_scan[col] == 255) {

+                *dest_scan++ = gray;

+                *dest_alpha_scan ++ = 255;

+                continue;

+            }

+            int src_alpha = clip_scan[col];

+            if (src_alpha == 0) {

+                dest_scan ++;

+                dest_alpha_scan ++;

+                continue;

+            }

+            int back_alpha = *dest_alpha_scan;

+            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+            *dest_alpha_scan ++ = dest_alpha;

+            int alpha_ratio = src_alpha * 255 / dest_alpha;

+            if (bNonseparableBlend) {

+                blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;

+            }

+            gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);

+            dest_scan ++;

+        }

+        return;

+    }

+    for (int col = 0; col < pixel_count; col ++) {

+        FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;

+        if (clip_scan == NULL || clip_scan[col] == 255) {

+            *dest_scan++ = gray;

+            *dest_alpha_scan ++ = 255;

+            continue;

+        }

+        int src_alpha = clip_scan[col];

+        if (src_alpha == 0) {

+            dest_scan ++;

+            dest_alpha_scan ++;

+            continue;

+        }

+        int back_alpha = *dest_alpha_scan;

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        *dest_alpha_scan ++ = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);

+        dest_scan ++;

+    }

+}

+inline void _CompositeRow_8bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_DWORD* pPalette, int pixel_count,

+        int DestBpp, FX_LPCBYTE clip_scan,

+        FX_LPCBYTE src_alpha_scan)

+{

+    if (src_alpha_scan) {

+        int dest_gap = DestBpp - 3;

+        FX_ARGB argb = 0;

+        for (int col = 0; col < pixel_count; col ++) {

+            argb = pPalette[*src_scan];

+            int src_r = FXARGB_R(argb);

+            int src_g = FXARGB_G(argb);

+            int src_b = FXARGB_B(argb);

+            src_scan ++;

+            FX_BYTE src_alpha = 0;

+            if (clip_scan) {

+                src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;

+            } else {

+                src_alpha = *src_alpha_scan++;

+            }

+            if (src_alpha == 255) {

+                *dest_scan++ = src_b;

+                *dest_scan++ = src_g;

+                *dest_scan++ = src_r;

+                dest_scan += dest_gap;

+                continue;

+            }

+            if (src_alpha == 0) {

+                dest_scan += DestBpp;

+                continue;

+            }

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);

+            dest_scan ++;

+            dest_scan += dest_gap;

+        }

+    } else {

+        FX_ARGB argb = 0;

+        for (int col = 0; col < pixel_count; col ++) {

+            argb = pPalette[*src_scan];

+            int src_r = FXARGB_R(argb);

+            int src_g = FXARGB_G(argb);

+            int src_b = FXARGB_B(argb);

+            if (clip_scan && clip_scan[col] < 255) {

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);

+                dest_scan ++;

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);

+                dest_scan ++;

+                *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);

+                dest_scan ++;

+            } else {

+                *dest_scan++ = src_b;

+                *dest_scan++ = src_g;

+                *dest_scan++ = src_r;

+            }

+            if (DestBpp == 4) {

+                dest_scan++;

+            }

+            src_scan ++;

+        }

+    }

+}

+inline void _CompositeRow_1bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,

+        FX_DWORD* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)

+{

+    int reset_r, reset_g, reset_b;

+    int set_r, set_g, set_b;

+    reset_r = FXARGB_R(pPalette[0]);

+    reset_g = FXARGB_G(pPalette[0]);

+    reset_b = FXARGB_B(pPalette[0]);

+    set_r = FXARGB_R(pPalette[1]);

+    set_g = FXARGB_G(pPalette[1]);

+    set_b = FXARGB_B(pPalette[1]);

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_r, src_g, src_b;

+        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {

+            src_r = set_r;

+            src_g = set_g;

+            src_b = set_b;

+        } else {

+            src_r = reset_r;

+            src_g = reset_g;

+            src_b = reset_b;

+        }

+        if (clip_scan && clip_scan[col] < 255) {

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);

+            dest_scan ++;

+        } else {

+            *dest_scan++ = src_b;

+            *dest_scan++ = src_g;

+            *dest_scan++ = src_r;

+        }

+        if (DestBpp == 4) {

+            dest_scan++;

+        }

+    }

+}

+inline void _CompositeRow_8bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,

+        FX_DWORD* pPalette, FX_LPCBYTE clip_scan,

+        FX_LPCBYTE src_alpha_scan)

+{

+    if (src_alpha_scan) {

+        for (int col = 0; col < width; col ++) {

+            FX_ARGB argb = pPalette[*src_scan];

+            src_scan ++;

+            int src_r = FXARGB_R(argb);

+            int src_g = FXARGB_G(argb);

+            int src_b = FXARGB_B(argb);

+            FX_BYTE back_alpha = dest_scan[3];

+            if (back_alpha == 0) {

+                if (clip_scan) {

+                    int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;

+                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));

+                } else {

+                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(*src_alpha_scan, src_r, src_g, src_b));

+                }

+                dest_scan += 4;

+                src_alpha_scan ++;

+                continue;

+            }

+            FX_BYTE src_alpha;

+            if (clip_scan == NULL) {

+                src_alpha = *src_alpha_scan ++;

+            } else {

+                src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;

+            }

+            if (src_alpha == 0) {

+                dest_scan += 4;

+                continue;

+            }

+            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+            dest_scan[3] = dest_alpha;

+            int alpha_ratio = src_alpha * 255 / dest_alpha;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);

+            dest_scan ++;

+            dest_scan ++;

+        }

+    } else

+        for (int col = 0; col < width; col ++) {

+            FX_ARGB argb = pPalette[*src_scan];

+            int src_r = FXARGB_R(argb);

+            int src_g = FXARGB_G(argb);

+            int src_b = FXARGB_B(argb);

+            if (clip_scan == NULL || clip_scan[col] == 255) {

+                *dest_scan++ = src_b;

+                *dest_scan++ = src_g;

+                *dest_scan++ = src_r;

+                *dest_scan++ = 255;

+                src_scan ++;

+                continue;

+            }

+            int src_alpha = clip_scan[col];

+            if (src_alpha == 0) {

+                dest_scan += 4;

+                src_scan ++;

+                continue;

+            }

+            int back_alpha = dest_scan[3];

+            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+            dest_scan[3] = dest_alpha;

+            int alpha_ratio = src_alpha * 255 / dest_alpha;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);

+            dest_scan ++;

+            dest_scan ++;

+            src_scan ++;

+        }

+}

+void _CompositeRow_8bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,

+                                        FX_DWORD* pPalette, FX_LPCBYTE clip_scan,

+                                        FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)

+{

+    if (src_alpha_scan) {

+        for (int col = 0; col < width; col ++) {

+            FX_ARGB argb = pPalette[*src_scan];

+            src_scan ++;

+            int src_r = FXARGB_R(argb);

+            int src_g = FXARGB_G(argb);

+            int src_b = FXARGB_B(argb);

+            FX_BYTE back_alpha = *dest_alpha_scan;

+            if (back_alpha == 0) {

+                if (clip_scan) {

+                    int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;

+                    *dest_alpha_scan ++ = src_alpha;

+                } else {

+                    *dest_alpha_scan ++ = *src_alpha_scan;

+                }

+                *dest_scan ++ = src_b;

+                *dest_scan ++ = src_g;

+                *dest_scan ++ = src_r;

+                src_alpha_scan ++;

+                continue;

+            }

+            FX_BYTE src_alpha;

+            if (clip_scan == NULL) {

+                src_alpha = *src_alpha_scan++;

+            } else {

+                src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;

+            }

+            if (src_alpha == 0) {

+                dest_scan += 3;

+                dest_alpha_scan ++;

+                continue;

+            }

+            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+            *dest_alpha_scan ++ = dest_alpha;

+            int alpha_ratio = src_alpha * 255 / dest_alpha;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);

+            dest_scan ++;

+        }

+    } else

+        for (int col = 0; col < width; col ++) {

+            FX_ARGB argb = pPalette[*src_scan];

+            int src_r = FXARGB_R(argb);

+            int src_g = FXARGB_G(argb);

+            int src_b = FXARGB_B(argb);

+            if (clip_scan == NULL || clip_scan[col] == 255) {

+                *dest_scan++ = src_b;

+                *dest_scan++ = src_g;

+                *dest_scan++ = src_r;

+                *dest_alpha_scan++ = 255;

+                src_scan ++;

+                continue;

+            }

+            int src_alpha = clip_scan[col];

+            if (src_alpha == 0) {

+                dest_scan += 3;

+                dest_alpha_scan ++;

+                src_scan ++;

+                continue;

+            }

+            int back_alpha = *dest_alpha_scan;

+            FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+            *dest_alpha_scan ++ = dest_alpha;

+            int alpha_ratio = src_alpha * 255 / dest_alpha;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);

+            dest_scan ++;

+            src_scan ++;

+        }

+}

+inline void _CompositeRow_1bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,

+        FX_DWORD* pPalette, FX_LPCBYTE clip_scan)

+{

+    int reset_r, reset_g, reset_b;

+    int set_r, set_g, set_b;

+    reset_r = FXARGB_R(pPalette[0]);

+    reset_g = FXARGB_G(pPalette[0]);

+    reset_b = FXARGB_B(pPalette[0]);

+    set_r = FXARGB_R(pPalette[1]);

+    set_g = FXARGB_G(pPalette[1]);

+    set_b = FXARGB_B(pPalette[1]);

+    for (int col = 0; col < width; col ++) {

+        int src_r, src_g, src_b;

+        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {

+            src_r = set_r;

+            src_g = set_g;

+            src_b = set_b;

+        } else {

+            src_r = reset_r;

+            src_g = reset_g;

+            src_b = reset_b;

+        }

+        if (clip_scan == NULL || clip_scan[col] == 255) {

+            *dest_scan++ = src_b;

+            *dest_scan++ = src_g;

+            *dest_scan++ = src_r;

+            *dest_scan++ = 255;

+            continue;

+        }

+        int src_alpha = clip_scan[col];

+        if (src_alpha == 0) {

+            dest_scan += 4;

+            continue;

+        }

+        int back_alpha = dest_scan[3];

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        dest_scan[3] = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);

+        dest_scan ++;

+        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);

+        dest_scan ++;

+        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);

+        dest_scan ++;

+        dest_scan ++;

+    }

+}

+void _CompositeRow_1bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,

+                                        FX_DWORD* pPalette, FX_LPCBYTE clip_scan,

+                                        FX_LPBYTE dest_alpha_scan)

+{

+    int reset_r, reset_g, reset_b;

+    int set_r, set_g, set_b;

+    reset_r = FXARGB_R(pPalette[0]);

+    reset_g = FXARGB_G(pPalette[0]);

+    reset_b = FXARGB_B(pPalette[0]);

+    set_r = FXARGB_R(pPalette[1]);

+    set_g = FXARGB_G(pPalette[1]);

+    set_b = FXARGB_B(pPalette[1]);

+    for (int col = 0; col < width; col ++) {

+        int src_r, src_g, src_b;

+        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {

+            src_r = set_r;

+            src_g = set_g;

+            src_b = set_b;

+        } else {

+            src_r = reset_r;

+            src_g = reset_g;

+            src_b = reset_b;

+        }

+        if (clip_scan == NULL || clip_scan[col] == 255) {

+            *dest_scan++ = src_b;

+            *dest_scan++ = src_g;

+            *dest_scan++ = src_r;

+            *dest_alpha_scan++ = 255;

+            continue;

+        }

+        int src_alpha = clip_scan[col];

+        if (src_alpha == 0) {

+            dest_scan += 3;

+            dest_alpha_scan ++;

+            continue;

+        }

+        int back_alpha = *dest_alpha_scan;

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        *dest_alpha_scan ++ = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);

+        dest_scan ++;

+        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);

+        dest_scan ++;

+        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);

+        dest_scan ++;

+    }

+}

+void _CompositeRow_ByteMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,

+                                 int blend_type, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;

+        } else {

+            src_alpha = mask_alpha * src_scan[col] / 255;

+        }

+        FX_BYTE back_alpha = dest_scan[3];

+        if (back_alpha == 0) {

+            FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));

+            dest_scan += 4;

+            continue;

+        }

+        if (src_alpha == 0) {

+            dest_scan += 4;

+            continue;

+        }

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        dest_scan[3] = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {

+            int blended_colors[3];

+            FX_BYTE src_scan[3];

+            src_scan[0] = src_b;

+            src_scan[1] = src_g;

+            src_scan[2] = src_r;

+            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);

+        } else if (blend_type) {

+            int blended = _BLEND(blend_type, *dest_scan, src_b);

+            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+            dest_scan ++;

+            blended = _BLEND(blend_type, *dest_scan, src_g);

+            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+            dest_scan ++;

+            blended = _BLEND(blend_type, *dest_scan, src_r);

+            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+        } else {

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);

+        }

+        dest_scan += 2;

+    }

+}

+void _CompositeRow_ByteMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,

+                                 int blend_type, FX_LPCBYTE clip_scan,

+                                 FX_LPBYTE dest_alpha_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;

+        } else {

+            src_alpha = mask_alpha * src_scan[col] / 255;

+        }

+        FX_BYTE back_alpha = *dest_alpha_scan;

+        if (back_alpha == 0) {

+            *dest_scan ++ = src_b;

+            *dest_scan ++ = src_g;

+            *dest_scan ++ = src_r;

+            *dest_alpha_scan ++ = src_alpha;

+            continue;

+        }

+        if (src_alpha == 0) {

+            dest_scan += 3;

+            dest_alpha_scan ++;

+            continue;

+        }

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        *dest_alpha_scan ++ = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {

+            int blended_colors[3];

+            FX_BYTE src_scan[3];

+            src_scan[0] = src_b;

+            src_scan[1] = src_g;

+            src_scan[2] = src_r;

+            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);

+            dest_scan ++;

+        } else if (blend_type) {

+            int blended = _BLEND(blend_type, *dest_scan, src_b);

+            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+            dest_scan ++;

+            blended = _BLEND(blend_type, *dest_scan, src_g);

+            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+            dest_scan ++;

+            blended = _BLEND(blend_type, *dest_scan, src_r);

+            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+            dest_scan ++;

+        } else {

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);

+            dest_scan ++;

+        }

+    }

+}

+void _CompositeRow_ByteMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,

+                                int blend_type, int Bpp, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;

+        } else {

+            src_alpha = mask_alpha * src_scan[col] / 255;

+        }

+        if (src_alpha == 0) {

+            dest_scan += Bpp;

+            continue;

+        }

+        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {

+            int blended_colors[3];

+            FX_BYTE src_scan[3];

+            src_scan[0] = src_b;

+            src_scan[1] = src_g;

+            src_scan[2] = src_r;

+            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);

+        } else if (blend_type) {

+            int blended = _BLEND(blend_type, *dest_scan, src_b);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);

+            dest_scan ++;

+            blended = _BLEND(blend_type, *dest_scan, src_g);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);

+            dest_scan ++;

+            blended = _BLEND(blend_type, *dest_scan, src_r);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);

+        } else {

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);

+        }

+        dest_scan += Bpp - 2;

+    }

+}

+void _CompositeRow_ByteMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int pixel_count,

+                                 FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;

+        } else {

+            src_alpha = mask_alpha * src_scan[col] / 255;

+        }

+        FX_BYTE back_alpha = *dest_scan;

+        if (!back_alpha) {

+            *dest_scan = src_alpha;

+        } else if (src_alpha) {

+            *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        }

+        dest_scan ++;

+    }

+}

+void _CompositeRow_ByteMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,

+                                 int pixel_count, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;

+        } else {

+            src_alpha = mask_alpha * src_scan[col] / 255;

+        }

+        if (src_alpha) {

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);

+        }

+        dest_scan ++;

+    }

+}

+void _CompositeRow_ByteMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,

+                                  int pixel_count, FX_LPCBYTE clip_scan,

+                                  FX_LPBYTE dest_alpha_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;

+        } else {

+            src_alpha = mask_alpha * src_scan[col] / 255;

+        }

+        FX_BYTE back_alpha = *dest_alpha_scan;

+        if (back_alpha == 0) {

+            *dest_scan ++ = src_gray;

+            *dest_alpha_scan ++ = src_alpha;

+            continue;

+        }

+        if (src_alpha == 0) {

+            dest_scan ++;

+            dest_alpha_scan ++;

+            continue;

+        }

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        *dest_alpha_scan++ = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);

+        dest_scan ++;

+    }

+}

+void _CompositeRow_BitMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,

+                                int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)

+{

+    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {

+        FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);

+        for (int col = 0; col < pixel_count; col ++) {

+            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {

+                FXARGB_SETDIB(dest_scan, argb);

+            }

+            dest_scan += 4;

+        }

+        return;

+    }

+    for (int col = 0; col < pixel_count; col ++) {

+        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {

+            dest_scan += 4;

+            continue;

+        }

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] / 255;

+        } else {

+            src_alpha = mask_alpha;

+        }

+        FX_BYTE back_alpha = dest_scan[3];

+        if (back_alpha == 0) {

+            FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));

+            dest_scan += 4;

+            continue;

+        }

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        dest_scan[3] = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {

+            int blended_colors[3];

+            FX_BYTE src_scan[3];

+            src_scan[0] = src_b;

+            src_scan[1] = src_g;

+            src_scan[2] = src_r;

+            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);

+        } else if (blend_type) {

+            int blended = _BLEND(blend_type, *dest_scan, src_b);

+            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+            dest_scan ++;

+            blended = _BLEND(blend_type, *dest_scan, src_g);

+            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+            dest_scan ++;

+            blended = _BLEND(blend_type, *dest_scan, src_r);

+            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+        } else {

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);

+        }

+        dest_scan += 2;

+    }

+}

+void _CompositeRow_BitMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,

+                                int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,

+                                FX_LPBYTE dest_alpha_scan)

+{

+    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {

+        for (int col = 0; col < pixel_count; col ++) {

+            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {

+                dest_scan[0] = src_b;

+                dest_scan[1] = src_g;

+                dest_scan[2] = src_r;

+                *dest_alpha_scan = mask_alpha;

+            }

+            dest_scan += 3;

+            dest_alpha_scan ++;

+        }

+        return;

+    }

+    for (int col = 0; col < pixel_count; col ++) {

+        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {

+            dest_scan += 3;

+            dest_alpha_scan ++;

+            continue;

+        }

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] / 255;

+        } else {

+            src_alpha = mask_alpha;

+        }

+        FX_BYTE back_alpha = dest_scan[3];

+        if (back_alpha == 0) {

+            *dest_scan ++ = src_b;

+            *dest_scan ++ = src_g;

+            *dest_scan ++ = src_r;

+            *dest_alpha_scan ++ = mask_alpha;

+            continue;

+        }

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        *dest_alpha_scan ++ = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {

+            int blended_colors[3];

+            FX_BYTE src_scan[3];

+            src_scan[0] = src_b;

+            src_scan[1] = src_g;

+            src_scan[2] = src_r;

+            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);

+            dest_scan ++;

+        } else if (blend_type) {

+            int blended = _BLEND(blend_type, *dest_scan, src_b);

+            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+            dest_scan ++;

+            blended = _BLEND(blend_type, *dest_scan, src_g);

+            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+            dest_scan ++;

+            blended = _BLEND(blend_type, *dest_scan, src_r);

+            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);

+            dest_scan ++;

+        } else {

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);

+            dest_scan ++;

+        }

+    }

+}

+void _CompositeRow_BitMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,

+                               int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)

+{

+    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {

+        for (int col = 0; col < pixel_count; col ++) {

+            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {

+                dest_scan[2] = src_r;

+                dest_scan[1] = src_g;

+                dest_scan[0] = src_b;

+            }

+            dest_scan += Bpp;

+        }

+        return;

+    }

+    for (int col = 0; col < pixel_count; col ++) {

+        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {

+            dest_scan += Bpp;

+            continue;

+        }

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] / 255;

+        } else {

+            src_alpha = mask_alpha;

+        }

+        if (src_alpha == 0) {

+            dest_scan += Bpp;

+            continue;

+        }

+        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {

+            int blended_colors[3];

+            FX_BYTE src_scan[3];

+            src_scan[0] = src_b;

+            src_scan[1] = src_g;

+            src_scan[2] = src_r;

+            _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);

+        } else if (blend_type) {

+            int blended = _BLEND(blend_type, *dest_scan, src_b);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);

+            dest_scan++;

+            blended = _BLEND(blend_type, *dest_scan, src_g);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);

+            dest_scan++;

+            blended = _BLEND(blend_type, *dest_scan, src_r);

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);

+        } else {

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);

+            dest_scan ++;

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);

+        }

+        dest_scan += Bpp - 2;

+    }

+}

+void _CompositeRow_BitMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_left,

+                                int pixel_count, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {

+            dest_scan ++;

+            continue;

+        }

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] / 255;

+        } else {

+            src_alpha = mask_alpha;

+        }

+        FX_BYTE back_alpha = *dest_scan;

+        if (!back_alpha) {

+            *dest_scan = src_alpha;

+        } else if (src_alpha) {

+            *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        }

+        dest_scan ++;

+    }

+}

+void _CompositeRow_BitMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,

+                                int src_left, int pixel_count, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {

+            dest_scan ++;

+            continue;

+        }

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] / 255;

+        } else {

+            src_alpha = mask_alpha;

+        }

+        if (src_alpha) {

+            *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);

+        }

+        dest_scan ++;

+    }

+}

+void _CompositeRow_BitMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,

+                                 int src_left, int pixel_count, FX_LPCBYTE clip_scan,

+                                 FX_LPBYTE dest_alpha_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {

+            dest_scan ++;

+            dest_alpha_scan ++;

+            continue;

+        }

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] / 255;

+        } else {

+            src_alpha = mask_alpha;

+        }

+        FX_BYTE back_alpha = *dest_alpha_scan;

+        if (back_alpha == 0) {

+            *dest_scan ++ = src_gray;

+            *dest_alpha_scan ++ = src_alpha;

+            continue;

+        }

+        if (src_alpha == 0) {

+            dest_scan ++;

+            dest_alpha_scan ++;

+            continue;

+        }

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        *dest_alpha_scan++ = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);

+        dest_scan ++;

+    }

+}

+void _CompositeRow_Argb2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)

+{

+    int blended_colors[3];

+    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+    for (int col = 0; col < pixel_count; col ++) {

+        FX_BYTE back_alpha = dest_scan[3];

+        if (back_alpha == 0) {

+            if (clip_scan) {

+                int src_alpha = clip_scan[col] * src_scan[3] / 255;

+                dest_scan[3] = src_alpha;

+                dest_scan[0] = src_scan[2];

+                dest_scan[1] = src_scan[1];

+                dest_scan[2] = src_scan[0];

+            } else {

+                FXARGB_RGBORDERCOPY(dest_scan, src_scan);

+            }

+            dest_scan += 4;

+            src_scan += 4;

+            continue;

+        }

+        FX_BYTE src_alpha;

+        if (clip_scan == NULL) {

+            src_alpha = src_scan[3];

+        } else {

+            src_alpha = clip_scan[col] * src_scan[3] / 255;

+        }

+        if (src_alpha == 0) {

+            dest_scan += 4;

+            src_scan += 4;

+            continue;

+        }

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        dest_scan[3] = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        if (bNonseparableBlend) {

+            FX_BYTE dest_scan_o[3];

+            dest_scan_o[0] = dest_scan[2];

+            dest_scan_o[1] = dest_scan[1];

+            dest_scan_o[2] = dest_scan[0];

+            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);

+        }

+        for (int color = 0; color < 3; color ++) {

+            int index = 2 - color;

+            if (blend_type) {

+                int blended = bNonseparableBlend ? blended_colors[color] :

+                              _BLEND(blend_type, dest_scan[index], *src_scan);

+                blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);

+                dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);

+            } else {

+                dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], *src_scan, alpha_ratio);

+            }

+            src_scan ++;

+        }

+        dest_scan += 4;

+        src_scan++;

+    }

+}

+void _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp)

+{

+    int blended_colors[3];

+    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+    int src_gap = src_Bpp - 3;

+    for (int col = 0; col < width; col ++) {

+        FX_BYTE back_alpha = dest_scan[3];

+        if (back_alpha == 0) {

+            if (src_Bpp == 4) {

+                FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));

+            } else {

+                FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));

+            }

+            dest_scan += 4;

+            src_scan += src_Bpp;

+            continue;

+        }

+        dest_scan[3] = 0xff;

+        if (bNonseparableBlend)	{

+            FX_BYTE dest_scan_o[3];

+            dest_scan_o[0] = dest_scan[2];

+            dest_scan_o[1] = dest_scan[1];

+            dest_scan_o[2] = dest_scan[0];

+            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);

+        }

+        for (int color = 0; color < 3; color ++) {

+            int index = 2 - color;

+            int src_color = FX_GAMMA(*src_scan);

+            int blended = bNonseparableBlend ? blended_colors[color] :

+                          _BLEND(blend_type, dest_scan[index], src_color);

+            dest_scan[index] = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);

+            src_scan ++;

+        }

+        dest_scan += 4;

+        src_scan += src_gap;

+    }

+}

+inline void _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan)

+{

+    int blended_colors[3];

+    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+    for (int col = 0; col < width; col ++) {

+        FX_BYTE src_alpha;

+        if (clip_scan) {

+            src_alpha = src_scan[3] * (*clip_scan++) / 255;

+        } else {

+            src_alpha = src_scan[3];

+        }

+        if (src_alpha == 0) {

+            dest_scan += dest_Bpp;

+            src_scan += 4;

+            continue;

+        }

+        if (bNonseparableBlend) {

+            FX_BYTE dest_scan_o[3];

+            dest_scan_o[0] = dest_scan[2];

+            dest_scan_o[1] = dest_scan[1];

+            dest_scan_o[2] = dest_scan[0];

+            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);

+        }

+        for (int color = 0; color < 3; color ++) {

+            int index = 2 - color;

+            int back_color = FX_GAMMA(dest_scan[index]);

+            int blended = bNonseparableBlend ? blended_colors[color] :

+                          _BLEND(blend_type, back_color, *src_scan);

+            dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));

+            src_scan ++;

+        }

+        dest_scan += dest_Bpp;

+        src_scan ++;

+    }

+}

+inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp)

+{

+    int src_gap = src_Bpp - 3;

+    for (int col = 0; col < width; col ++) {

+        if (src_Bpp == 4) {

+            FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));

+        } else {

+            FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));

+        }

+        dest_scan += 4;

+        src_scan += src_Bpp;

+    }

+}

+inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)

+{

+    int blended_colors[3];

+    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+    int src_gap = src_Bpp - 3;

+    for (int col = 0; col < width; col ++) {

+        if (bNonseparableBlend) {

+            FX_BYTE dest_scan_o[3];

+            dest_scan_o[0] = dest_scan[2];

+            dest_scan_o[1] = dest_scan[1];

+            dest_scan_o[2] = dest_scan[0];

+            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);

+        }

+        for (int color = 0; color < 3; color ++) {

+            int index = 2 - color;

+            int back_color = FX_GAMMA(dest_scan[index]);

+            int src_color = FX_GAMMA(*src_scan);

+            int blended = bNonseparableBlend ? blended_colors[color] :

+                          _BLEND(blend_type, back_color, src_color);

+            dest_scan[index] = FX_GAMMA_INVERSE(blended);

+            src_scan ++;

+        }

+        dest_scan += dest_Bpp;

+        src_scan += src_gap;

+    }

+}

+inline void _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < width; col ++) {

+        FX_BYTE src_alpha;

+        if (clip_scan) {

+            src_alpha = src_scan[3] * (*clip_scan++) / 255;

+        } else {

+            src_alpha = src_scan[3];

+        }

+        if (src_alpha == 255) {

+            dest_scan[2] = FX_GAMMA_INVERSE(*src_scan++);

+            dest_scan[1] = FX_GAMMA_INVERSE(*src_scan++);

+            dest_scan[0] = FX_GAMMA_INVERSE(*src_scan++);

+            dest_scan += dest_Bpp;

+            src_scan ++;

+            continue;

+        }

+        if (src_alpha == 0) {

+            dest_scan += dest_Bpp;

+            src_scan += 4;

+            continue;

+        }

+        for (int color = 0; color < 3; color ++) {

+            int index = 2 - color;

+            dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[index]), *src_scan, src_alpha));

+            src_scan ++;

+        }

+        dest_scan += dest_Bpp;

+        src_scan ++;

+    }

+}

+inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)

+{

+    for (int col = 0; col < width; col ++) {

+        dest_scan[2] = src_scan[0];

+        dest_scan[1] = src_scan[1];

+        dest_scan[0] = src_scan[2];

+        dest_scan += dest_Bpp;

+        src_scan += src_Bpp;

+    }

+}

+inline void _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan)

+{

+    int blended_colors[3];

+    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+    int src_gap = src_Bpp - 3;

+    for (int col = 0; col < width; col ++) {

+        int src_alpha = *clip_scan ++;

+        FX_BYTE back_alpha = dest_scan[3];

+        if (back_alpha == 0) {

+            dest_scan[2] = FX_GAMMA(*src_scan++);

+            dest_scan[1] = FX_GAMMA(*src_scan++);

+            dest_scan[0] = FX_GAMMA(*src_scan++);

+            src_scan += src_gap;

+            dest_scan += 4;

+            continue;

+        }

+        if (src_alpha == 0) {

+            dest_scan += 4;

+            src_scan += src_Bpp;

+            continue;

+        }

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        dest_scan[3] = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        if (bNonseparableBlend) {

+            FX_BYTE dest_scan_o[3];

+            dest_scan_o[0] = dest_scan[2];

+            dest_scan_o[1] = dest_scan[1];

+            dest_scan_o[2] = dest_scan[0];

+            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);

+        }

+        for (int color = 0; color < 3; color ++) {

+            int index = 2 - color;

+            int src_color = FX_GAMMA(*src_scan);

+            int blended = bNonseparableBlend ? blended_colors[color] :

+                          _BLEND(blend_type, dest_scan[index], src_color);

+            blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);

+            dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);

+            src_scan ++;

+        }

+        dest_scan += 4;

+        src_scan += src_gap;

+    }

+}

+inline void _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)

+{

+    int blended_colors[3];

+    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;

+    int src_gap = src_Bpp - 3;

+    for (int col = 0; col < width; col ++) {

+        FX_BYTE src_alpha = *clip_scan ++;

+        if (src_alpha == 0) {

+            dest_scan += dest_Bpp;

+            src_scan += src_Bpp;

+            continue;

+        }

+        if (bNonseparableBlend) {

+            FX_BYTE dest_scan_o[3];

+            dest_scan_o[0] = dest_scan[2];

+            dest_scan_o[1] = dest_scan[1];

+            dest_scan_o[2] = dest_scan[0];

+            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);

+        }

+        for (int color = 0; color < 3; color ++) {

+            int index = 2 - color;

+            int src_color = FX_GAMMA(*src_scan);

+            int back_color = FX_GAMMA(dest_scan[index]);

+            int blended = bNonseparableBlend ? blended_colors[color] :

+                          _BLEND(blend_type, back_color, src_color);

+            dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));

+            src_scan ++;

+        }

+        dest_scan += dest_Bpp;

+        src_scan += src_gap;

+    }

+}

+inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan)

+{

+    int src_gap = src_Bpp - 3;

+    for (int col = 0; col < width; col ++) {

+        int src_alpha = clip_scan[col];

+        if (src_alpha == 255) {

+            dest_scan[2] = FX_GAMMA(*src_scan++);

+            dest_scan[1] = FX_GAMMA(*src_scan++);

+            dest_scan[0] = FX_GAMMA(*src_scan++);

+            dest_scan[3] = 255;

+            dest_scan += 4;

+            src_scan  += src_gap;

+            continue;

+        }

+        if (src_alpha == 0) {

+            dest_scan += 4;

+            src_scan += src_Bpp;

+            continue;

+        }

+        int back_alpha = dest_scan[3];

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        dest_scan[3] = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        for (int color = 0; color < 3; color ++) {

+            int index = 2 - color;

+            dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], FX_GAMMA(*src_scan), alpha_ratio);

+            src_scan ++;

+        }

+        dest_scan += 4;

+        src_scan += src_gap;

+    }

+}

+inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < width; col ++) {

+        int src_alpha = clip_scan[col];

+        if (src_alpha == 255) {

+            dest_scan[2] = src_scan[0];

+            dest_scan[1] = src_scan[1];

+            dest_scan[0] = src_scan[2];

+        } else if (src_alpha) {

+            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), FX_GAMMA(*src_scan), src_alpha));

+            src_scan ++;

+            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), FX_GAMMA(*src_scan), src_alpha));

+            src_scan ++;

+            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), FX_GAMMA(*src_scan), src_alpha));

+            dest_scan += dest_Bpp;

+            src_scan += src_Bpp - 2;

+            continue;

+        }

+        dest_scan += dest_Bpp;

+        src_scan += src_Bpp;

+    }

+}

+inline void _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_ARGB* pPalette, int pixel_count,

+        int DestBpp, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        FX_ARGB argb = pPalette ? pPalette[*src_scan] : (*src_scan) * 0x010101;

+        int src_r = FXARGB_R(argb);

+        int src_g = FXARGB_G(argb);

+        int src_b = FXARGB_B(argb);

+        if (clip_scan && clip_scan[col] < 255) {

+            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);

+            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);

+            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);

+        } else {

+            dest_scan[2] = src_b;

+            dest_scan[1] = src_g;

+            dest_scan[0] = src_r;

+        }

+        dest_scan += DestBpp;

+        src_scan ++;

+    }

+}

+inline void _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,

+        FX_ARGB* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)

+{

+    int reset_r, reset_g, reset_b;

+    int set_r, set_g, set_b;

+    if (pPalette) {

+        reset_r = FXARGB_R(pPalette[0]);

+        reset_g = FXARGB_G(pPalette[0]);

+        reset_b = FXARGB_B(pPalette[0]);

+        set_r = FXARGB_R(pPalette[1]);

+        set_g = FXARGB_G(pPalette[1]);

+        set_b = FXARGB_B(pPalette[1]);

+    } else {

+        reset_r = reset_g = reset_b = 0;

+        set_r = set_g = set_b = 255;

+    }

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_r, src_g, src_b;

+        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {

+            src_r = set_r;

+            src_g = set_g;

+            src_b = set_b;

+        } else {

+            src_r = reset_r;

+            src_g = reset_g;

+            src_b = reset_b;

+        }

+        if (clip_scan && clip_scan[col] < 255) {

+            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);

+            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);

+            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);

+        } else {

+            dest_scan[2] = src_b;

+            dest_scan[1] = src_g;

+            dest_scan[0] = src_r;

+        }

+        dest_scan += DestBpp;

+    }

+}

+inline void _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,

+        FX_ARGB* pPalette, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < width; col ++) {

+        int src_r, src_g, src_b;

+        if (pPalette) {

+            FX_ARGB argb = pPalette[*src_scan];

+            src_r = FXARGB_R(argb);

+            src_g = FXARGB_G(argb);

+            src_b = FXARGB_B(argb);

+        } else {

+            src_r = src_g = src_b = *src_scan;

+        }

+        if (clip_scan == NULL || clip_scan[col] == 255) {

+            dest_scan[2] = FX_GAMMA(src_b);

+            dest_scan[1] = FX_GAMMA(src_g);

+            dest_scan[0] = FX_GAMMA(src_r);

+            dest_scan[3] = 255;

+            src_scan ++;

+            dest_scan += 4;

+            continue;

+        }

+        int src_alpha = clip_scan[col];

+        if (src_alpha == 0) {

+            dest_scan += 4;

+            src_scan ++;

+            continue;

+        }

+        int back_alpha = dest_scan[3];

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        dest_scan[3] = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);

+        dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);

+        dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);

+        dest_scan += 4;

+        src_scan ++;

+    }

+}

+inline void _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,

+        FX_ARGB* pPalette, FX_LPCBYTE clip_scan)

+{

+    int reset_r, reset_g, reset_b;

+    int set_r, set_g, set_b;

+    if (pPalette) {

+        reset_r = FXARGB_R(pPalette[0]);

+        reset_g = FXARGB_G(pPalette[0]);

+        reset_b = FXARGB_B(pPalette[0]);

+        set_r = FXARGB_R(pPalette[1]);

+        set_g = FXARGB_G(pPalette[1]);

+        set_b = FXARGB_B(pPalette[1]);

+    } else {

+        reset_r = reset_g = reset_b = 0;

+        set_r = set_g = set_b = 255;

+    }

+    for (int col = 0; col < width; col ++) {

+        int src_r, src_g, src_b;

+        if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {

+            src_r = set_r;

+            src_g = set_g;

+            src_b = set_b;

+        } else {

+            src_r = reset_r;

+            src_g = reset_g;

+            src_b = reset_b;

+        }

+        if (clip_scan == NULL || clip_scan[col] == 255) {

+            dest_scan[2] = FX_GAMMA(src_b);

+            dest_scan[1] = FX_GAMMA(src_g);

+            dest_scan[0] = FX_GAMMA(src_r);

+            dest_scan[3] = 255;

+            dest_scan += 4;

+            continue;

+        }

+        int src_alpha = clip_scan[col];

+        if (src_alpha == 0) {

+            dest_scan += 4;

+            continue;

+        }

+        int back_alpha = dest_scan[3];

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        dest_scan[3] = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);

+        dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);

+        dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);

+        dest_scan += 4;

+    }

+}

+void _CompositeRow_ByteMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,

+        int blend_type, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;

+        } else {

+            src_alpha = mask_alpha * src_scan[col] / 255;

+        }

+        FX_BYTE back_alpha = dest_scan[3];

+        if (back_alpha == 0) {

+            FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));

+            dest_scan += 4;

+            continue;

+        }

+        if (src_alpha == 0) {

+            dest_scan += 4;

+            continue;

+        }

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        dest_scan[3] = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {

+            int blended_colors[3];

+            FX_BYTE src_scan[3];

+            FX_BYTE dest_scan_o[3];

+            src_scan[0] = src_b;

+            src_scan[1] = src_g;

+            src_scan[2] = src_r;

+            dest_scan_o[0] = dest_scan[2];

+            dest_scan_o[1] = dest_scan[1];

+            dest_scan_o[2] = dest_scan[0];

+            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);

+            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);

+            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);

+            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);

+        } else if (blend_type) {

+            int blended = _BLEND(blend_type, dest_scan[2], src_b);

+            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);

+            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);

+            blended = _BLEND(blend_type, dest_scan[1], src_g);

+            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);

+            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);

+            blended = _BLEND(blend_type, dest_scan[0], src_r);

+            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);

+            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);

+        } else {

+            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);

+            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);

+            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);

+        }

+        dest_scan += 4;

+    }

+}

+void _CompositeRow_ByteMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,

+        int blend_type, int Bpp, FX_LPCBYTE clip_scan)

+{

+    for (int col = 0; col < pixel_count; col ++) {

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;

+        } else {

+            src_alpha = mask_alpha * src_scan[col] / 255;

+        }

+        if (src_alpha == 0) {

+            dest_scan += Bpp;

+            continue;

+        }

+        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {

+            int blended_colors[3];

+            FX_BYTE src_scan[3];

+            FX_BYTE dest_scan_o[3];

+            src_scan[0] = src_b;

+            src_scan[1] = src_g;

+            src_scan[2] = src_r;

+            dest_scan_o[0] = dest_scan[2];

+            dest_scan_o[1] = dest_scan[1];

+            dest_scan_o[2] = dest_scan[0];

+            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);

+            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);

+            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);

+            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);

+        } else if (blend_type) {

+            int blended = _BLEND(blend_type, dest_scan[2], src_b);

+            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, src_alpha);

+            blended = _BLEND(blend_type, dest_scan[1], src_g);

+            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, src_alpha);

+            blended = _BLEND(blend_type, dest_scan[0], src_r);

+            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, src_alpha);

+        } else {

+            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, src_alpha);

+            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, src_alpha);

+            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, src_alpha);

+        }

+        dest_scan += Bpp;

+    }

+}

+void _CompositeRow_BitMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,

+        int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)

+{

+    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {

+        FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);

+        for (int col = 0; col < pixel_count; col ++) {

+            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {

+                FXARGB_SETRGBORDERDIB(dest_scan, argb);

+            }

+            dest_scan += 4;

+        }

+        return;

+    }

+    for (int col = 0; col < pixel_count; col ++) {

+        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {

+            dest_scan += 4;

+            continue;

+        }

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] / 255;

+        } else {

+            src_alpha = mask_alpha;

+        }

+        FX_BYTE back_alpha = dest_scan[3];

+        if (back_alpha == 0) {

+            FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));

+            dest_scan += 4;

+            continue;

+        }

+        FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+        dest_scan[3] = dest_alpha;

+        int alpha_ratio = src_alpha * 255 / dest_alpha;

+        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {

+            int blended_colors[3];

+            FX_BYTE src_scan[3];

+            FX_BYTE dest_scan_o[3];

+            src_scan[0] = src_b;

+            src_scan[1] = src_g;

+            src_scan[2] = src_r;

+            dest_scan_o[0] = dest_scan[2];

+            dest_scan_o[1] = dest_scan[1];

+            dest_scan_o[2] = dest_scan[0];

+            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);

+            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);

+            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);

+            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);

+        } else if (blend_type) {

+            int blended = _BLEND(blend_type, dest_scan[2], src_b);

+            blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);

+            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);

+            blended = _BLEND(blend_type, dest_scan[1], src_g);

+            blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);

+            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);

+            blended = _BLEND(blend_type, dest_scan[0], src_r);

+            blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);

+            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);

+        } else {

+            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);

+            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);

+            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);

+        }

+        dest_scan += 4;

+    }

+}

+void _CompositeRow_BitMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,

+        int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)

+{

+    if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {

+        for (int col = 0; col < pixel_count; col ++) {

+            if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {

+                dest_scan[2] = src_b;

+                dest_scan[1] = src_g;

+                dest_scan[0] = src_r;

+            }

+            dest_scan += Bpp;

+        }

+        return;

+    }

+    for (int col = 0; col < pixel_count; col ++) {

+        if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {

+            dest_scan += Bpp;

+            continue;

+        }

+        int src_alpha;

+        if (clip_scan) {

+            src_alpha = mask_alpha * clip_scan[col] / 255;

+        } else {

+            src_alpha = mask_alpha;

+        }

+        if (src_alpha == 0) {

+            dest_scan += Bpp;

+            continue;

+        }

+        if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {

+            int blended_colors[3];

+            FX_BYTE src_scan[3];

+            FX_BYTE dest_scan_o[3];

+            src_scan[0] = src_b;

+            src_scan[1] = src_g;

+            src_scan[2] = src_r;

+            dest_scan_o[0] = dest_scan[2];

+            dest_scan_o[1] = dest_scan[1];

+            dest_scan_o[2] = dest_scan[0];

+            _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);

+            dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);

+            dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);

+            dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);

+        } else if (blend_type) {

+            int back_color = FX_GAMMA(dest_scan[2]);

+            int blended = _BLEND(blend_type, back_color, src_b);

+            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));

+            back_color = FX_GAMMA(dest_scan[1]);

+            blended = _BLEND(blend_type, back_color, src_g);

+            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));

+            back_color = FX_GAMMA(dest_scan[0]);

+            blended = _BLEND(blend_type, back_color, src_r);

+            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));

+        } else {

+            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), src_b, src_alpha));

+            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), src_g, src_alpha));

+            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), src_r, src_alpha));

+        }

+        dest_scan += Bpp;

+    }

+}

+inline FX_BOOL _ScanlineCompositor_InitSourceMask(FXDIB_Format dest_format, int alpha_flag, FX_DWORD mask_color, int& mask_alpha,

+        int& mask_red, int& mask_green, int& mask_blue, int& mask_black,

+        void* icc_module, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;

+    if (alpha_flag >> 8) {

+        mask_alpha = alpha_flag & 0xff;

+        mask_red = FXSYS_GetCValue(mask_color);

+        mask_green = FXSYS_GetMValue(mask_color);

+        mask_blue = FXSYS_GetYValue(mask_color);

+        mask_black = FXSYS_GetKValue(mask_color);

+    } else {

+        mask_alpha = FXARGB_A(mask_color);

+        mask_red = FXARGB_R(mask_color);

+        mask_green = FXARGB_G(mask_color);

+        mask_blue = FXARGB_B(mask_color);

+    }

+    if (dest_format == FXDIB_8bppMask) {

+        return TRUE;

+    }

+    if ((dest_format & 0xff) == 8) {

+        if (pIccTransform) {

+            mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);

+            FX_LPBYTE gray_p = (FX_LPBYTE)&mask_color;

+            pIccModule->TranslateScanline(pIccTransform, gray_p, gray_p, 1);

+            mask_red = dest_format & 0x0400 ? FX_CCOLOR(gray_p[0]) : gray_p[0];

+        } else {

+            if (alpha_flag >> 8) {

+                FX_BYTE r, g, b;

+                AdobeCMYK_to_sRGB1(mask_red, mask_green, mask_blue, mask_black,

+                                   r, g, b);

+                mask_red = FXRGB2GRAY(r, g, b);

+            } else {

+                mask_red = FXRGB2GRAY(mask_red, mask_green, mask_blue);

+            }

+            if (dest_format & 0x0400) {

+                mask_red = FX_CCOLOR(mask_red);

+            }

+        }

+    } else {

+        FX_LPBYTE mask_color_p = (FX_LPBYTE)&mask_color;

+        mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);

+        if (pIccTransform) {

+            pIccModule->TranslateScanline(pIccTransform, mask_color_p, mask_color_p, 1);

+            mask_red = mask_color_p[2];

+            mask_green = mask_color_p[1];

+            mask_blue = mask_color_p[0];

+        } else if (alpha_flag >> 8) {

+            AdobeCMYK_to_sRGB1(mask_color_p[0], mask_color_p[1], mask_color_p[2], mask_color_p[3],

+                               mask_color_p[2], mask_color_p[1], mask_color_p[0]);

+            mask_red = mask_color_p[2];

+            mask_green = mask_color_p[1];

+            mask_blue = mask_color_p[0];

+        }

+    }

+    return TRUE;

+}

+inline void _ScanlineCompositor_InitSourcePalette(FXDIB_Format src_format, FXDIB_Format dest_format,

+        FX_DWORD*& pDestPalette, FX_DWORD* pSrcPalette,

+        void* icc_module, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;

+    FX_BOOL isSrcCmyk = src_format & 0x0400 ? TRUE : FALSE;

+    FX_BOOL isDstCmyk = dest_format & 0x0400 ? TRUE : FALSE;

+    pDestPalette = NULL;

+    if (pIccTransform) {

+        if (pSrcPalette) {

+            if ((dest_format & 0xff) == 8) {

+                int pal_count = 1 << (src_format & 0xff);

+                FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);

+                if (!gray_pal) {

+                    return;

+                }

+                pDestPalette = (FX_DWORD*)gray_pal;

+                for (int i = 0; i < pal_count; i ++) {

+                    FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);

+                    pIccModule->TranslateScanline(pIccTransform, gray_pal, (FX_LPCBYTE)&color, 1);

+                    gray_pal ++;

+                }

+            } else {

+                int palsize = 1 << (src_format & 0xff);

+                pDestPalette = FX_Alloc(FX_DWORD, palsize);

+                if (!pDestPalette) {

+                    return;

+                }

+                for (int i = 0; i < palsize; i ++) {

+                    FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);

+                    pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&color, (FX_LPCBYTE)&color, 1);

+                    pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);

+                }

+            }

+        } else {

+            int pal_count = 1 << (src_format & 0xff);

+            FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);

+            if (!gray_pal) {

+                return;

+            }

+            if (pal_count == 2) {

+                gray_pal[0] = 0;

+                gray_pal[1] = 255;

+            } else {

+                for (int i = 0; i < pal_count; i++) {

+                    gray_pal[i] = i;

+                }

+            }

+            if ((dest_format & 0xff) == 8) {

+                pIccModule->TranslateScanline(pIccTransform, gray_pal, gray_pal, pal_count);

+                pDestPalette = (FX_DWORD*)gray_pal;

+            } else {

+                pDestPalette = FX_Alloc(FX_DWORD, pal_count);

+                if (!pDestPalette) {

+                    FX_Free(gray_pal);

+                    return;

+                }

+                for (int i = 0; i < pal_count; i ++) {

+                    pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&pDestPalette[i], &gray_pal[i], 1);

+                    pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(pDestPalette[i]) : FXARGB_TODIB(pDestPalette[i]);

+                }

+                FX_Free(gray_pal);

+            }

+        }

+    } else {

+        if (pSrcPalette) {

+            if ((dest_format & 0xff) == 8) {

+                int pal_count = 1 << (src_format & 0xff);

+                FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);

+                if (!gray_pal) {

+                    return;

+                }

+                pDestPalette = (FX_DWORD*)gray_pal;

+                if (isSrcCmyk) {

+                    for (int i = 0; i < pal_count; i ++) {

+                        FX_CMYK cmyk = pSrcPalette[i];

+                        FX_BYTE r, g, b;

+                        AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),

+                                           r, g, b);

+                        *gray_pal ++ = FXRGB2GRAY(r, g, b);

+                    }

+                } else

+                    for (int i = 0; i < pal_count; i ++) {

+                        FX_ARGB argb = pSrcPalette[i];

+                        *gray_pal ++ = FXRGB2GRAY(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));

+                    }

+            } else {

+                int palsize = 1 << (src_format & 0xff);

+                pDestPalette = FX_Alloc(FX_DWORD, palsize);

+                if (!pDestPalette) {

+                    return;

+                }

+                if (isDstCmyk == isSrcCmyk) {

+                    FXSYS_memcpy32(pDestPalette, pSrcPalette, palsize * sizeof(FX_DWORD));

+                } else {

+                    for (int i = 0; i < palsize; i ++) {

+                        FX_CMYK cmyk = pSrcPalette[i];

+                        FX_BYTE r, g, b;

+                        AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),

+                                           r, g, b);

+                        pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);

+                    }

+                }

+            }

+        } else {

+            if ((dest_format & 0xff) == 8) {

+                int pal_count = 1 << (src_format & 0xff);

+                FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);

+                if (!gray_pal) {

+                    return;

+                }

+                if (pal_count == 2) {

+                    gray_pal[0] = 0;

+                    gray_pal[1] = 255;

+                } else {

+                    for (int i = 0; i < pal_count; i++) {

+                        gray_pal[i] = i;

+                    }

+                }

+                pDestPalette = (FX_DWORD*)gray_pal;

+            } else {

+                int palsize = 1 << (src_format & 0xff);

+                pDestPalette = FX_Alloc(FX_DWORD, palsize);

+                if (!pDestPalette) {

+                    return;

+                }

+                if (palsize == 2) {

+                    pDestPalette[0] = isSrcCmyk ? 255 : 0xff000000;

+                    pDestPalette[1] = isSrcCmyk ? 0 : 0xffffffff;

+                } else {

+                    for (int i = 0; i < palsize; i++) {

+                        pDestPalette[i] = isSrcCmyk ? FX_CCOLOR(i) : (i * 0x10101);

+                    }

+                }

+                if (isSrcCmyk != isDstCmyk) {

+                    for (int i = 0; i < palsize; i ++) {

+                        FX_CMYK cmyk = pDestPalette[i];

+                        FX_BYTE r, g, b;

+                        AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),

+                                           r, g, b);

+                        pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);

+                    }

+                }

+            }

+        }

+    }

+}

+CFX_ScanlineCompositor::CFX_ScanlineCompositor()

+{

+    m_pSrcPalette = NULL;

+    m_pCacheScanline = NULL;

+    m_CacheSize = 0;

+    m_bRgbByteOrder = FALSE;

+    m_BlendType = FXDIB_BLEND_NORMAL;

+}

+CFX_ScanlineCompositor::~CFX_ScanlineCompositor()

+{

+    if (m_pSrcPalette) {

+        FX_Free(m_pSrcPalette);

+    }

+    if (m_pCacheScanline) {

+        FX_Free(m_pCacheScanline);

+    }

+}

+FX_BOOL CFX_ScanlineCompositor::Init(FXDIB_Format dest_format, FXDIB_Format src_format, FX_INT32 width, FX_DWORD* pSrcPalette,

+                                     FX_DWORD mask_color, int blend_type, FX_BOOL bClip, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)

+{

+    m_SrcFormat = src_format;

+    m_DestFormat = dest_format;

+    m_BlendType = blend_type;

+    m_bRgbByteOrder = bRgbByteOrder;

+    ICodec_IccModule* pIccModule = NULL;

+    if (CFX_GEModule::Get()->GetCodecModule()) {

+        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    }

+    if (pIccModule == NULL) {

+        pIccTransform = NULL;

+    }

+    m_pIccTransform = pIccTransform;

+    if ((dest_format & 0xff) == 1) {

+        return FALSE;

+    }

+    if (m_SrcFormat == FXDIB_1bppMask || m_SrcFormat == FXDIB_8bppMask) {

+        return _ScanlineCompositor_InitSourceMask(dest_format, alpha_flag, mask_color,

+                m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, m_MaskBlack,

+                pIccModule, pIccTransform);

+    }

+    if (pIccTransform == NULL && (~src_format & 0x0400) && (dest_format & 0x0400)) {

+        return FALSE;

+    }

+    if ((m_SrcFormat & 0xff) <= 8) {

+        if (dest_format == FXDIB_8bppMask) {

+            return TRUE;

+        }

+        _ScanlineCompositor_InitSourcePalette(src_format, dest_format, m_pSrcPalette, pSrcPalette,

+                                              pIccModule, pIccTransform);

+        m_Transparency = (dest_format == FXDIB_Argb ? 1 : 0)

+                         + (dest_format & 0x0200 ? 2 : 0)

+                         + (dest_format & 0x0400 ? 4 : 0)

+                         + ((src_format & 0xff) == 1 ? 8 : 0);

+        return TRUE;

+    }

+    m_Transparency = (src_format & 0x0200 ? 0 : 1)

+                     + (dest_format & 0x0200 ? 0 : 2)

+                     + (blend_type == FXDIB_BLEND_NORMAL ? 4 : 0)

+                     + (bClip ? 8 : 0)

+                     + (src_format & 0x0400 ? 16 : 0)

+                     + (dest_format & 0x0400 ? 32 : 0)

+                     + (pIccTransform ? 64 : 0);

+    return TRUE;

+}

+void CFX_ScanlineCompositor::CompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,

+        FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)

+{

+    int src_Bpp = (m_SrcFormat & 0xff) >> 3;

+    int dest_Bpp = (m_DestFormat & 0xff) >> 3;

+    int dest_Size = width * dest_Bpp + 4;

+    if (m_bRgbByteOrder) {

+        switch (m_Transparency) {

+            case 0:

+            case 4:

+            case 8:

+            case 12:

+                _CompositeRow_Argb2Argb_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, clip_scan);

+                break;

+            case 1:

+                _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp);

+                break;

+            case 2:

+            case 10:

+                _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan);

+                break;

+            case 3:

+                _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);

+                break;

+            case 5:

+                _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp);

+                break;

+            case 6:

+            case 14:

+                _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, clip_scan);

+                break;

+            case 7:

+                _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp);

+                break;

+            case 9:

+                _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan);

+                break;

+            case 11:

+                _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);

+                break;

+            case 13:

+                _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp, clip_scan);

+                break;

+            case 15:

+                _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);

+                break;

+        }

+        return;

+    }

+    if (m_DestFormat == FXDIB_8bppMask) {

+        if (m_SrcFormat & 0x0200) {

+            if (m_SrcFormat == FXDIB_Argb) {

+                _CompositeRow_Argb2Mask(dest_scan, src_scan, width, clip_scan);

+            } else {

+                _CompositeRow_Rgba2Mask(dest_scan, src_extra_alpha, width, clip_scan);

+            }

+        } else {

+            _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);

+        }

+    } else if ((m_DestFormat & 0xff) == 8) {

+        if (m_DestFormat & 0x0400) {

+            for (int i = 0; i < width; i ++) {

+                *dest_scan = ~*dest_scan;

+                dest_scan++;

+            }

+        }

+        if (m_SrcFormat & 0x0200) {

+            if (m_DestFormat & 0x0200) {

+                _CompositeRow_Argb2Graya(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, dst_extra_alpha, m_pIccTransform);

+            } else {

+                _CompositeRow_Argb2Gray(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, m_pIccTransform);

+            }

+        } else {

+            if (m_DestFormat & 0x0200) {

+                _CompositeRow_Rgb2Graya(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, dst_extra_alpha, m_pIccTransform);

+            } else {

+                _CompositeRow_Rgb2Gray(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, m_pIccTransform);

+            }

+        }

+        if (m_DestFormat & 0x0400) {

+            for (int i = 0; i < width; i ++) {

+                *dest_scan = ~*dest_scan;

+                dest_scan++;

+            }

+        }

+    } else {

+        if (dest_Size > m_CacheSize) {

+            m_pCacheScanline = FX_Realloc(FX_BYTE, m_pCacheScanline, dest_Size);

+            if (!m_pCacheScanline) {

+                return;

+            }

+            m_CacheSize = dest_Size;

+        }

+        switch (m_Transparency) {

+            case 0:

+            case 4:

+            case 8:

+            case 4+8: {

+                    _CompositeRow_Argb2Argb(dest_scan, src_scan, width, m_BlendType, clip_scan,

+                                            dst_extra_alpha, src_extra_alpha);

+                }

+                break;

+            case 64:

+            case 4+64:

+            case 8+64:

+            case 4+8+64: {

+                    _CompositeRow_Argb2Argb_Transform(dest_scan, src_scan, width, m_BlendType, clip_scan,

+                                                      dst_extra_alpha, src_extra_alpha, m_pCacheScanline, m_pIccTransform);

+                }

+                break;

+            case 1:

+                _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, src_Bpp,

+                                                    dst_extra_alpha);

+                break;

+            case 1+64:

+                _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp,

+                        dst_extra_alpha, m_pCacheScanline, m_pIccTransform);

+                break;

+            case 1+8:

+                _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,

+                                                  dst_extra_alpha);

+                break;

+            case 1+8+64:

+                _CompositeRow_Rgb2Argb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,

+                        dst_extra_alpha, m_pCacheScanline, m_pIccTransform);

+                break;

+            case 1+4:

+                _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_scan, width, src_Bpp,

+                                                      dst_extra_alpha);

+                break;

+            case 1+4+64:

+                _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, src_Bpp,

+                        dst_extra_alpha, m_pCacheScanline, m_pIccTransform);

+                break;

+            case 1+4+8:

+                _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_scan, width, src_Bpp, clip_scan,

+                                                    dst_extra_alpha);

+                break;

+            case 1+4+8+64:

+                _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(dest_scan, src_scan, width, src_Bpp, clip_scan,

+                        dst_extra_alpha, m_pCacheScanline, m_pIccTransform);

+                break;

+            case 2:

+            case 2+8:

+                _CompositeRow_Argb2Rgb_Blend(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,

+                                             src_extra_alpha);

+                break;

+            case 2+64:

+            case 2+8+64:

+                _CompositeRow_Argb2Rgb_Blend_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,

+                                                       src_extra_alpha, m_pCacheScanline, m_pIccTransform);

+                break;

+            case 2+4:

+            case 2+4+8:

+                _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_scan, width, dest_Bpp, clip_scan,

+                                               src_extra_alpha);

+                break;

+            case 2+4+64:

+            case 2+4+8+64:

+                _CompositeRow_Argb2Rgb_NoBlend_Transform(dest_scan, src_scan, width, dest_Bpp, clip_scan,

+                        src_extra_alpha, m_pCacheScanline, m_pIccTransform);

+                break;

+            case 1+2:

+                _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);

+                break;

+            case 1+2+64:

+                _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp,

+                        m_pCacheScanline, m_pIccTransform);

+                break;

+            case 1+2+8:

+                _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);

+                break;

+            case 1+2+8+64:

+                _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan,

+                        m_pCacheScanline, m_pIccTransform);

+                break;

+            case 1+2+4:

+                _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_scan, width, dest_Bpp, src_Bpp);

+                break;

+            case 1+2+4+64:

+                _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp,

+                        m_pCacheScanline, m_pIccTransform);

+                break;

+            case 1+2+4+8:

+                _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);

+                break;

+            case 1+2+4+8+64:

+                _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan,

+                        m_pCacheScanline, m_pIccTransform);

+                break;

+        }

+    }

+}

+void CFX_ScanlineCompositor::CompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,

+        FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)

+{

+    if (m_bRgbByteOrder) {

+        if (m_SrcFormat == FXDIB_1bppRgb) {

+            if (m_DestFormat == FXDIB_8bppRgb) {

+                return;

+            } else if(m_DestFormat == FXDIB_Argb) {

+                _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);

+            } else {

+                _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);

+            }

+        } else {

+            if (m_DestFormat == FXDIB_8bppRgb) {

+                return;

+            } else if (m_DestFormat == FXDIB_Argb) {

+                _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, m_pSrcPalette, clip_scan);

+            } else {

+                _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);

+            }

+        }

+        return;

+    }

+    if (m_DestFormat == FXDIB_8bppMask) {

+        _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);

+        return;

+    } else if ((m_DestFormat & 0xff) == 8) {

+        if (m_Transparency & 8) {

+            if (m_DestFormat & 0x0200) {

+                _CompositeRow_1bppPal2Graya(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan, dst_extra_alpha);

+            } else {

+                _CompositeRow_1bppPal2Gray(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan);

+            }

+        } else {

+            if (m_DestFormat & 0x0200)

+                _CompositeRow_8bppPal2Graya(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,

+                                            dst_extra_alpha, src_extra_alpha);

+            else

+                _CompositeRow_8bppPal2Gray(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,

+                                           src_extra_alpha);

+        }

+    } else {

+        switch (m_Transparency) {

+            case 1+2:

+                _CompositeRow_8bppRgb2Argb_NoBlend(dest_scan, src_scan, width, m_pSrcPalette, clip_scan,

+                                                   src_extra_alpha);

+                break;

+            case 1+2+8:

+                _CompositeRow_1bppRgb2Argb_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);

+                break;

+            case 0:

+                _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,

+                                                  src_extra_alpha);

+                break;

+            case 0+8:

+                _CompositeRow_1bppRgb2Rgb_NoBlend(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);

+                break;

+            case 0+2:

+                _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,

+                                                  src_extra_alpha);

+                break;

+            case 0+2+8:

+                _CompositeRow_1bppRgb2Rgba_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan,

+                                                   dst_extra_alpha);

+                break;

+                break;

+        }

+    }

+}

+void CFX_ScanlineCompositor::CompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,

+        FX_LPBYTE dst_extra_alpha)

+{

+    if (m_DestFormat == FXDIB_8bppMask) {

+        _CompositeRow_ByteMask2Mask(dest_scan, src_scan, m_MaskAlpha, width, clip_scan);

+    } else if ((m_DestFormat & 0xff) == 8) {

+        if (m_DestFormat & 0x0200) {

+            _CompositeRow_ByteMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan, dst_extra_alpha);

+        } else {

+            _CompositeRow_ByteMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan);

+        }

+    } else if (m_bRgbByteOrder) {

+        if (m_DestFormat == FXDIB_Argb)

+            _CompositeRow_ByteMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,

+                    width, m_BlendType, clip_scan);

+        else

+            _CompositeRow_ByteMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,

+                                                    width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);

+        return;

+    } else if (m_DestFormat == FXDIB_Argb)

+        _CompositeRow_ByteMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,

+                                    width, m_BlendType, clip_scan);

+    else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)

+        _CompositeRow_ByteMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,

+                                   width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);

+    else if (m_DestFormat == FXDIB_Rgba)

+        _CompositeRow_ByteMask2Rgba(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,

+                                    width, m_BlendType, clip_scan, dst_extra_alpha);

+}

+void CFX_ScanlineCompositor::CompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,

+        FX_LPBYTE dst_extra_alpha)

+{

+    if (m_DestFormat == FXDIB_8bppMask) {

+        _CompositeRow_BitMask2Mask(dest_scan, src_scan, m_MaskAlpha, src_left, width, clip_scan);

+    } else if ((m_DestFormat & 0xff) == 8) {

+        if (m_DestFormat & 0x0200)

+            _CompositeRow_BitMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan,

+                                        dst_extra_alpha);

+        else {

+            _CompositeRow_BitMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan);

+        }

+    } else if (m_bRgbByteOrder) {

+        if (m_DestFormat == FXDIB_Argb)

+            _CompositeRow_BitMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,

+                                                    src_left, width, m_BlendType, clip_scan);

+        else

+            _CompositeRow_BitMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,

+                                                   src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);

+        return;

+    } else if (m_DestFormat == FXDIB_Argb)

+        _CompositeRow_BitMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,

+                                   src_left, width, m_BlendType, clip_scan);

+    else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)

+        _CompositeRow_BitMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,

+                                  src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);

+}

+FX_BOOL CFX_DIBitmap::CompositeBitmap(int dest_left, int dest_top, int width, int height,

+                                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top,

+                                      int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, void* pIccTransform)

+{

+    if (m_pBuffer == NULL) {

+        return FALSE;

+    }

+    ASSERT(!pSrcBitmap->IsAlphaMask());

+    ASSERT(m_bpp >= 8);

+    if (pSrcBitmap->IsAlphaMask() || m_bpp < 8) {

+        return FALSE;

+    }

+    GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(),

+                   src_left, src_top, pClipRgn);

+    if (width == 0 || height == 0) {

+        return TRUE;

+    }

+    const CFX_DIBitmap* pClipMask = NULL;

+    FX_RECT clip_box;

+    if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {

+        ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);

+        pClipMask = pClipRgn->GetMask();

+        clip_box = pClipRgn->GetBox();

+    }

+    CFX_ScanlineCompositor compositor;

+    if (!compositor.Init(GetFormat(), pSrcBitmap->GetFormat(), width, pSrcBitmap->GetPalette(), 0, blend_type,

+                         pClipMask != NULL, bRgbByteOrder, 0, pIccTransform)) {

+        return FALSE;

+    }

+    int dest_Bpp = m_bpp / 8;

+    int src_Bpp = pSrcBitmap->GetBPP() / 8;

+    FX_BOOL bRgb = FALSE;

+    FX_BOOL bCmyk = FALSE;

+    if (src_Bpp > 1) {

+        if (pSrcBitmap->IsCmykImage()) {

+            bCmyk = TRUE;

+        } else {

+            bRgb = TRUE;

+        }

+    }

+    CFX_DIBitmap* pSrcAlphaMask = pSrcBitmap->m_pAlphaMask;

+    for (int row = 0; row < height; row ++) {

+        FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * dest_Bpp;

+        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * src_Bpp;

+        FX_LPCBYTE src_scan_extra_alpha = pSrcAlphaMask ? pSrcAlphaMask->GetScanline(src_top + row) + src_left : NULL;

+        FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;

+        FX_LPCBYTE clip_scan = NULL;

+        if (pClipMask) {

+            clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);

+        }

+        if (bRgb) {

+            compositor.CompositeRgbBitmapLine(dest_scan, src_scan, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);

+        } else {

+            compositor.CompositePalBitmapLine(dest_scan, src_scan, src_left, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CFX_DIBitmap::CompositeMask(int dest_left, int dest_top, int width, int height,

+                                    const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top,

+                                    int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)

+{

+    if (m_pBuffer == NULL) {

+        return FALSE;

+    }

+    ASSERT(pMask->IsAlphaMask());

+    ASSERT(m_bpp >= 8);

+    if (!pMask->IsAlphaMask() || m_bpp < 8) {

+        return FALSE;

+    }

+    GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, pClipRgn);

+    if (width == 0 || height == 0) {

+        return TRUE;

+    }

+    int src_alpha = (FX_BYTE)(alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);

+    if (src_alpha == 0) {

+        return TRUE;

+    }

+    const CFX_DIBitmap* pClipMask = NULL;

+    FX_RECT clip_box;

+    if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {

+        ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);

+        pClipMask = pClipRgn->GetMask();

+        clip_box = pClipRgn->GetBox();

+    }

+    int src_bpp = pMask->GetBPP();

+    int Bpp = GetBPP() / 8;

+    CFX_ScanlineCompositor compositor;

+    if (!compositor.Init(GetFormat(), pMask->GetFormat(), width, NULL, color, blend_type, pClipMask != NULL, bRgbByteOrder, alpha_flag, pIccTransform)) {

+        return FALSE;

+    }

+    for (int row = 0; row < height; row ++) {

+        FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;

+        FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);

+        FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;

+        FX_LPCBYTE clip_scan = NULL;

+        if (pClipMask) {

+            clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);

+        }

+        if (src_bpp == 1) {

+            compositor.CompositeBitMaskLine(dest_scan, src_scan, src_left, width, clip_scan, dst_scan_extra_alpha);

+        } else {

+            compositor.CompositeByteMaskLine(dest_scan, src_scan + src_left, width, clip_scan, dst_scan_extra_alpha);

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CFX_DIBitmap::CompositeRect(int left, int top, int width, int height, FX_DWORD color, int alpha_flag, void* pIccTransform)

+{

+    if (m_pBuffer == NULL) {

+        return FALSE;

+    }

+    int src_alpha = (alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);

+    if (src_alpha == 0) {

+        return TRUE;

+    }

+    FX_RECT rect(left, top, left + width, top + height);

+    rect.Intersect(0, 0, m_Width, m_Height);

+    if (rect.IsEmpty()) {

+        return TRUE;

+    }

+    width = rect.Width();

+    FX_DWORD dst_color;

+    if (alpha_flag >> 8) {

+        dst_color = FXCMYK_TODIB(color);

+    } else {

+        dst_color = FXARGB_TODIB(color);

+    }

+    FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;

+    if (m_bpp == 8) {

+        FX_BYTE gray = 255;

+        if (!IsAlphaMask()) {

+            if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {

+                ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+                pIccModule->TranslateScanline(pIccTransform, &gray, color_p, 1);

+            } else {

+                if (alpha_flag >> 8) {

+                    FX_BYTE r, g, b;

+                    AdobeCMYK_to_sRGB1(color_p[0], color_p[1], color_p[2], color_p[3],

+                                       r, g, b);

+                    gray = FXRGB2GRAY(r, g, b);

+                } else {

+                    gray = (FX_BYTE)FXRGB2GRAY((int)color_p[2], color_p[1], color_p[0]);

+                }

+            }

+            if (IsCmykImage()) {

+                gray = ~gray;

+            }

+        }

+        for (int row = rect.top; row < rect.bottom; row ++) {

+            FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left;

+            if (src_alpha == 255) {

+                FXSYS_memset8(dest_scan, gray, width);

+            } else

+                for (int col = 0; col < width; col ++) {

+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);

+                    dest_scan ++;

+                }

+        }

+        return TRUE;

+    } else if (m_bpp == 1) {

+        ASSERT(!IsCmykImage() && (FX_BYTE)(alpha_flag >> 8) == 0);

+        int left_shift = rect.left % 8;

+        int right_shift = rect.right % 8;

+        int width = rect.right / 8 - rect.left / 8;

+        int index = 0;

+        if (m_pPalette == NULL) {

+            index = ((FX_BYTE)color == 0xff) ? 1 : 0;

+        } else {

+            for (int i = 0; i < 2; i ++)

+                if (m_pPalette[i] == color) {

+                    index = i;

+                }

+        }

+        for (int row = rect.top; row < rect.bottom; row ++) {

+            FX_BYTE* dest_scan_top = (FX_BYTE*)GetScanline(row) + rect.left / 8;

+            FX_BYTE* dest_scan_top_r = (FX_BYTE*)GetScanline(row) + rect.right / 8;

+            FX_BYTE left_flag =  *dest_scan_top & (255 << (8 - left_shift));

+            FX_BYTE right_flag = *dest_scan_top_r & (255 >> right_shift);

+            if (width) {

+                FXSYS_memset8(dest_scan_top + 1, index ? 255 : 0, width - 1);

+                if (!index) {

+                    *dest_scan_top &= left_flag;

+                    *dest_scan_top_r &= right_flag;

+                } else {

+                    *dest_scan_top |= ~left_flag;

+                    *dest_scan_top_r |= ~right_flag;

+                }

+            } else {

+                if (!index) {

+                    *dest_scan_top &= left_flag | right_flag;

+                } else {

+                    *dest_scan_top |= ~(left_flag | right_flag);

+                }

+            }

+        }

+        return TRUE;

+    }

+    ASSERT(m_bpp >= 24);

+    if (m_bpp < 24) {

+        return FALSE;

+    }

+    if (pIccTransform && CFX_GEModule::Get()->GetCodecModule()) {

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);

+    } else {

+        if (alpha_flag >> 8 && !IsCmykImage())

+            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),

+                               color_p[2], color_p[1], color_p[0]);

+        else if (!(alpha_flag >> 8) && IsCmykImage()) {

+            return FALSE;

+        }

+    }

+    if(!IsCmykImage()) {

+        color_p[3] = (FX_BYTE)src_alpha;

+    }

+    int Bpp = m_bpp / 8;

+    FX_BOOL bAlpha = HasAlpha();

+    FX_BOOL bArgb = GetFormat() == FXDIB_Argb ? TRUE : FALSE;

+    if (src_alpha == 255) {

+        for (int row = rect.top; row < rect.bottom; row ++) {

+            FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;

+            FX_LPBYTE dest_scan_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left : NULL;

+            if (dest_scan_alpha) {

+                FXSYS_memset8(dest_scan_alpha, 0xff, width);

+            }

+            if (Bpp == 4) {

+                FX_DWORD* scan = (FX_DWORD*)dest_scan;

+                for (int col = 0; col < width; col ++) {

+                    *scan ++ = dst_color;

+                }

+            } else {

+                for (int col = 0; col < width; col ++) {

+                    *dest_scan ++ = color_p[0];

+                    *dest_scan ++ = color_p[1];

+                    *dest_scan ++ = color_p[2];

+                }

+            }

+        }

+        return TRUE;

+    }

+    for (int row = rect.top; row < rect.bottom; row ++) {

+        FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;

+        if (bAlpha) {

+            if (bArgb) {

+                for (int col = 0; col < width; col ++) {

+                    FX_BYTE back_alpha = dest_scan[3];

+                    if (back_alpha == 0) {

+                        FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, color_p[2], color_p[1], color_p[0]));

+                        dest_scan += 4;

+                        continue;

+                    }

+                    FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+                    int alpha_ratio = src_alpha * 255 / dest_alpha;

+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[0], alpha_ratio);

+                    dest_scan ++;

+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[1], alpha_ratio);

+                    dest_scan ++;

+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[2], alpha_ratio);

+                    dest_scan ++;

+                    *dest_scan++ = dest_alpha;

+                }

+            } else {

+                FX_LPBYTE dest_scan_alpha = (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left;

+                for (int col = 0; col < width; col ++) {

+                    FX_BYTE back_alpha = *dest_scan_alpha;

+                    if (back_alpha == 0) {

+                        *dest_scan_alpha++ = src_alpha;

+                        FXSYS_memcpy32(dest_scan, color_p, Bpp);

+                        dest_scan += Bpp;

+                        continue;

+                    }

+                    FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;

+                    *dest_scan_alpha ++ = dest_alpha;

+                    int alpha_ratio = src_alpha * 255 / dest_alpha;

+                    for(int comps = 0; comps < Bpp; comps ++) {

+                        *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], alpha_ratio);

+                        dest_scan ++;

+                    }

+                }

+            }

+        } else {

+            for (int col = 0; col < width; col ++) {

+                for(int comps = 0; comps < Bpp; comps ++) {

+                    if (comps == 3) {

+                        *dest_scan ++ = 255;

+                        continue;

+                    }

+                    *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], src_alpha);

+                    dest_scan ++;

+                }

+            }

+        }

+    }

+    return TRUE;

+}

+CFX_BitmapComposer::CFX_BitmapComposer()

+{

+    m_pScanlineV = NULL;

+    m_pScanlineAlphaV = NULL;

+    m_pClipScanV = NULL;

+    m_pAddClipScan = NULL;

+    m_bRgbByteOrder = FALSE;

+    m_BlendType = FXDIB_BLEND_NORMAL;

+}

+CFX_BitmapComposer::~CFX_BitmapComposer()

+{

+    if (m_pScanlineV) {

+        FX_Free(m_pScanlineV);

+    }

+    if (m_pScanlineAlphaV) {

+        FX_Free(m_pScanlineAlphaV);

+    }

+    if (m_pClipScanV) {

+        FX_Free(m_pClipScanV);

+    }

+    if (m_pAddClipScan) {

+        FX_Free(m_pAddClipScan);

+    }

+}

+void CFX_BitmapComposer::Compose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRgn, int bitmap_alpha,

+                                 FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOOL bVertical,

+                                 FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByteOrder,

+                                 int alpha_flag, void* pIccTransform, int blend_type)

+{

+    m_pBitmap = pDest;

+    m_pClipRgn = pClipRgn;

+    m_DestLeft = dest_rect.left;

+    m_DestTop = dest_rect.top;

+    m_DestWidth = dest_rect.Width();

+    m_DestHeight = dest_rect.Height();

+    m_BitmapAlpha = bitmap_alpha;

+    m_MaskColor = mask_color;

+    m_pClipMask = NULL;

+    if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {

+        m_pClipMask = pClipRgn->GetMask();

+    }

+    m_bVertical = bVertical;

+    m_bFlipX = bFlipX;

+    m_bFlipY = bFlipY;

+    m_AlphaFlag = alpha_flag;

+    m_pIccTransform = pIccTransform;

+    m_bRgbByteOrder = bRgbByteOrder;

+    m_BlendType = blend_type;

+}

+FX_BOOL CFX_BitmapComposer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)

+{

+    m_SrcFormat = src_format;

+    if (!m_Compositor.Init(m_pBitmap->GetFormat(), src_format, width, pSrcPalette, m_MaskColor, FXDIB_BLEND_NORMAL,

+                           m_pClipMask != NULL || (m_BitmapAlpha < 255), m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform)) {

+        return FALSE;

+    }

+    if (m_bVertical) {

+        m_pScanlineV = FX_Alloc(FX_BYTE, m_pBitmap->GetBPP() / 8 * width + 4);

+        if (!m_pScanlineV) {

+            return FALSE;

+        }

+        m_pClipScanV = FX_Alloc(FX_BYTE, m_pBitmap->GetHeight());

+        if (!m_pClipScanV) {

+            return FALSE;

+        }

+        if (m_pBitmap->m_pAlphaMask) {

+            m_pScanlineAlphaV = FX_Alloc(FX_BYTE, width + 4);

+            if (!m_pScanlineAlphaV) {

+                return FALSE;

+            }

+        }

+    }

+    if (m_BitmapAlpha < 255) {

+        m_pAddClipScan = FX_Alloc(FX_BYTE, m_bVertical ? m_pBitmap->GetHeight() : m_pBitmap->GetWidth());

+        if (!m_pAddClipScan) {

+            return FALSE;

+        }

+    }

+    return TRUE;

+}

+void CFX_BitmapComposer::DoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,

+                                   FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)

+{

+    if (m_BitmapAlpha < 255) {

+        if (clip_scan) {

+            for (int i = 0; i < dest_width; i ++) {

+                m_pAddClipScan[i] = clip_scan[i] * m_BitmapAlpha / 255;

+            }

+        } else {

+            FXSYS_memset8(m_pAddClipScan, m_BitmapAlpha, dest_width);

+        }

+        clip_scan = m_pAddClipScan;

+    }

+    if (m_SrcFormat == FXDIB_8bppMask) {

+        m_Compositor.CompositeByteMaskLine(dest_scan, src_scan, dest_width, clip_scan, dst_extra_alpha);

+    } else if ((m_SrcFormat & 0xff) == 8) {

+        m_Compositor.CompositePalBitmapLine(dest_scan, src_scan, 0, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);

+    } else {

+        m_Compositor.CompositeRgbBitmapLine(dest_scan, src_scan, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);

+    }

+}

+void CFX_BitmapComposer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)

+{

+    if (m_bVertical) {

+        ComposeScanlineV(line, scanline, scan_extra_alpha);

+        return;

+    }

+    FX_LPCBYTE clip_scan = NULL;

+    if (m_pClipMask)

+        clip_scan = m_pClipMask->GetBuffer() + (m_DestTop + line - m_pClipRgn->GetBox().top) *

+                    m_pClipMask->GetPitch() + (m_DestLeft - m_pClipRgn->GetBox().left);

+    FX_LPBYTE dest_scan = (FX_LPBYTE)m_pBitmap->GetScanline(line + m_DestTop) +

+                          m_DestLeft * m_pBitmap->GetBPP() / 8;

+    FX_LPBYTE dest_alpha_scan = m_pBitmap->m_pAlphaMask ?

+                                (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line + m_DestTop) + m_DestLeft : NULL;

+    DoCompose(dest_scan, scanline, m_DestWidth, clip_scan, scan_extra_alpha, dest_alpha_scan);

+}

+void CFX_BitmapComposer::ComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)

+{

+    int i;

+    int Bpp = m_pBitmap->GetBPP() / 8;

+    int dest_pitch = m_pBitmap->GetPitch();

+    int dest_alpha_pitch = m_pBitmap->m_pAlphaMask ? m_pBitmap->m_pAlphaMask->GetPitch() : 0;

+    int dest_x = m_DestLeft + (m_bFlipX ? (m_DestWidth - line - 1) : line);

+    FX_LPBYTE dest_buf = m_pBitmap->GetBuffer() + dest_x * Bpp + m_DestTop * dest_pitch;

+    FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?

+                               m_pBitmap->m_pAlphaMask->GetBuffer() + dest_x + m_DestTop * dest_alpha_pitch : NULL;

+    if (m_bFlipY) {

+        dest_buf += dest_pitch * (m_DestHeight - 1);

+        dest_alpha_buf += dest_alpha_pitch * (m_DestHeight - 1);

+    }

+    int y_step = dest_pitch;

+    int y_alpha_step = dest_alpha_pitch;

+    if (m_bFlipY) {

+        y_step = -y_step;

+        y_alpha_step = -y_alpha_step;

+    }

+    FX_LPBYTE src_scan = m_pScanlineV;

+    FX_LPBYTE dest_scan = dest_buf;

+    for (i = 0; i < m_DestHeight; i ++) {

+        for (int j = 0; j < Bpp; j ++) {

+            *src_scan++ = dest_scan[j];

+        }

+        dest_scan += y_step;

+    }

+    FX_LPBYTE src_alpha_scan = m_pScanlineAlphaV;

+    FX_LPBYTE dest_alpha_scan = dest_alpha_buf;

+    if (dest_alpha_scan) {

+        for (i = 0; i < m_DestHeight; i ++) {

+            *src_alpha_scan++ = *dest_alpha_scan;

+            dest_alpha_scan += y_alpha_step;

+        }

+    }

+    FX_LPBYTE clip_scan = NULL;

+    if (m_pClipMask) {

+        clip_scan = m_pClipScanV;

+        int clip_pitch = m_pClipMask->GetPitch();

+        FX_LPCBYTE src_clip = m_pClipMask->GetBuffer() + (m_DestTop - m_pClipRgn->GetBox().top) *

+                              clip_pitch + (dest_x - m_pClipRgn->GetBox().left);

+        if (m_bFlipY) {

+            src_clip += clip_pitch * (m_DestHeight - 1);

+            clip_pitch = -clip_pitch;

+        }

+        for (i = 0; i < m_DestHeight; i ++) {

+            clip_scan[i] = *src_clip;

+            src_clip += clip_pitch;

+        }

+    }

+    DoCompose(m_pScanlineV, scanline, m_DestHeight, clip_scan, scan_extra_alpha, m_pScanlineAlphaV);

+    src_scan = m_pScanlineV;

+    dest_scan = dest_buf;

+    for (i = 0; i < m_DestHeight; i ++) {

+        for (int j = 0; j < Bpp; j ++) {

+            dest_scan[j] = *src_scan++;

+        }

+        dest_scan += y_step;

+    }

+    src_alpha_scan = m_pScanlineAlphaV;

+    dest_alpha_scan = dest_alpha_buf;

+    if (dest_alpha_scan) {

+        for (i = 0; i < m_DestHeight; i ++) {

+            *dest_alpha_scan = *src_alpha_scan++;

+            dest_alpha_scan += y_alpha_step;

+        }

+    }

+}

diff --git a/core/src/fxge/dib/fx_dib_convert.cpp b/core/src/fxge/dib/fx_dib_convert.cpp
new file mode 100644
index 0000000..fe4a7bf
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_convert.cpp
@@ -0,0 +1,1090 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_dib.h"

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fxcodec/fx_codec.h"

+const FX_DWORD g_dwWinPalette[256] = {

+    0xff000000, 0xff800000, 0xff008000, 0xff808000, 0xff000080, 0xff800080,

+    0xff008080, 0xff808080, 0xffC0DCC0, 0xffA6CAF0, 0xff2A3FAA, 0xff2A3FFF,

+    0xff2A5F00, 0xff2A5F55, 0xff2A5FAA, 0xff2A5FFF, 0xff2A7F00, 0xff2A7F55,

+    0xff2A7FAA, 0xff2A7FFF, 0xff2A9F00, 0xff2A9F55, 0xff2A9FAA, 0xff2A9FFF,

+    0xff2ABF00, 0xff2ABF55, 0xff2ABFAA, 0xff2ABFFF, 0xff2ADF00, 0xff2ADF55,

+    0xff2ADFAA, 0xff2ADFFF, 0xff2AFF00, 0xff2AFF55, 0xff2AFFAA, 0xff2AFFFF,

+    0xff550000, 0xff550055, 0xff5500AA, 0xff5500FF, 0xff551F00, 0xff551F55,

+    0xff551FAA, 0xff551FFF, 0xff553F00, 0xff553F55, 0xff553FAA, 0xff553FFF,

+    0xff555F00, 0xff555F55, 0xff555FAA, 0xff555FFF, 0xff557F00, 0xff557F55,

+    0xff557FAA, 0xff557FFF, 0xff559F00, 0xff559F55, 0xff559FAA, 0xff559FFF,

+    0xff55BF00, 0xff55BF55, 0xff55BFAA, 0xff55BFFF, 0xff55DF00, 0xff55DF55,

+    0xff55DFAA, 0xff55DFFF, 0xff55FF00, 0xff55FF55, 0xff55FFAA, 0xff55FFFF,

+    0xff7F0000, 0xff7F0055, 0xff7F00AA, 0xff7F00FF, 0xff7F1F00, 0xff7F1F55,

+    0xff7F1FAA, 0xff7F1FFF, 0xff7F3F00, 0xff7F3F55, 0xff7F3FAA, 0xff7F3FFF,

+    0xff7F5F00, 0xff7F5F55, 0xff7F5FAA, 0xff7F5FFF, 0xff7F7F00, 0xff7F7F55,

+    0xff7F7FAA, 0xff7F7FFF, 0xff7F9F00, 0xff7F9F55, 0xff7F9FAA, 0xff7F9FFF,

+    0xff7FBF00, 0xff7FBF55, 0xff7FBFAA, 0xff7FBFFF, 0xff7FDF00, 0xff7FDF55,

+    0xff7FDFAA, 0xff7FDFFF, 0xff00FF7F, 0xff7FFF55, 0xff7FFFAA, 0xff7FFFFF,

+    0xffAA0000, 0xffAA0055, 0xffAA00AA, 0xffAA00FF, 0xffAA1F00, 0xffAA1F55,

+    0xffAA1FAA, 0xffAA1FFF, 0xffAA3F00, 0xffAA3F55, 0xffAA3FAA, 0xffAA3FFF,

+    0xffAA5F00, 0xffAA5F55, 0xffAA5FAA, 0xffAA5FFF, 0xffAA7F00, 0xffAA7F55,

+    0xffAA7FAA, 0xffAA7FFF, 0xffAA9F00, 0xffAA9F55, 0xffAA9FAA, 0xffAA9FFF,

+    0xffAABF00, 0xffAABF55, 0xffAABFAA, 0xffAABFFF, 0xffAADF00, 0xffAADF55,

+    0xffAADFAA, 0xffAADFFF, 0xffAAFF00, 0xffAAFF55, 0xffAAFFAA, 0xffAAFFFF,

+    0xffD40000, 0xffD40055, 0xffD400AA, 0xffD400FF, 0xffD41F00, 0xffD41F55,

+    0xffD41FAA, 0xffD41FFF, 0xffD43F00, 0xffD43F55, 0xffD43FAA, 0xffD43FFF,

+    0xffD45F00, 0xffD45F55, 0xffD45FAA, 0xffD45FFF, 0xffD47F00, 0xffD47F55,

+    0xffD47FAA, 0xffD4F7FF, 0xffD49F00, 0xffD49F55, 0xffD49FAA, 0xffD49FFF,

+    0xffD4BF00, 0xffD4BF55, 0xffD4BFAA, 0xffD4BFFF, 0xffD4DF00, 0xffD4DF55,

+    0xffD4DFAA, 0xffD4DFFF, 0xffD4FF00, 0xffD4FF55, 0xffD4FFAA, 0xffD4FFFF,

+    0xffFF0055, 0xffFF00AA, 0xffFF1F00, 0xffFF1F55, 0xffFF1FAA, 0xffFF1FFF,

+    0xffFF3F00, 0xffFF3F55, 0xffFF3FAA, 0xffFF3FFF, 0xffFF5F00, 0xffFF5F55,

+    0xffFF5FAA, 0xffFF5FFF, 0xffFF7F00, 0xffFF7F55, 0xffFF7FAA, 0xffFF7FFF,

+    0xffFF9F00, 0xffFF9F55, 0xffFF9FAA, 0xffFF9FFF, 0xffFFBF00, 0xffFFBF55,

+    0xffFFBFAA, 0xffFFBFFF, 0xffFFDF00, 0xffFFDF55, 0xffFFDFAA, 0xffFFDFFF,

+    0xffFFFF55, 0xffFFFFAA, 0xffCCCCFF, 0xffFFCCFF, 0xff33FFFF, 0xff66FFFF,

+    0xff99FFFF, 0xffCCFFFF, 0xff007F00, 0xff007F55, 0xff007FAA, 0xff007FFF,

+    0xff009F00, 0xff009F55, 0xff009FAA, 0xff009FFF, 0xff00BF00, 0xff00BF55,

+    0xff00BFAA, 0xff00BFFF, 0xff00DF00, 0xff00DF55, 0xff00DFAA, 0xff00DFFF,

+    0xff00FF55, 0xff00FFAA, 0xff2A0000, 0xff2A0055, 0xff2A00AA, 0xff2A00FF,

+    0xff2A1F00, 0xff2A1F55, 0xff2A1FAA, 0xff2A1FFF, 0xff2A3F00, 0xff2A3F55,

+    0xffFFFBF0, 0xffA0A0A4, 0xff808080, 0xffFF0000, 0xff00FF00, 0xffFF0000,

+    0xff0000FF, 0xffFF00FF, 0xff00FFFF, 0xffFFFFFF

+};

+const FX_DWORD g_dwMacPalette[256] = {

+    0xffFFFFFF, 0xffFFFFCC, 0xffFFFF99, 0xffFFFF66, 0xffFFFF33, 0xffFFFF00,

+    0xffFFCCFF, 0xffFFCCCC, 0xffFFCC99, 0xffFFCC66, 0xffFFCC33, 0xffFFCC00,

+    0xffFF99FF, 0xffFF99CC, 0xffFF9999, 0xffFF9966, 0xffFF9933, 0xffFF9900,

+    0xffFF66FF, 0xffFF66CC, 0xffFF6699, 0xffFF6666, 0xffFF6633, 0xffFF6600,

+    0xffFF33FF, 0xffFF33CC, 0xffFF3399, 0xffFF3366, 0xffFF3333, 0xffFF3300,

+    0xffFF00FF, 0xffFF00CC, 0xffFF0099, 0xffFF0066, 0xffFF0033, 0xffFF0000,

+    0xffCCFFFF, 0xffCCFFCC, 0xffCCFF99, 0xffCCFF66, 0xffCCFF33, 0xffCCFF00,

+    0xffCCCCFF, 0xffCCCCCC, 0xffCCCC99, 0xffCCCC66, 0xffCCCC33, 0xffCCCC00,

+    0xffCC99FF, 0xffCC99CC, 0xffCC9999, 0xffCC9966, 0xffCC9933, 0xffCC9900,

+    0xffCC66FF, 0xffCC66CC, 0xffCC6699, 0xffCC6666, 0xffCC6633, 0xffCC6600,

+    0xffCC33FF, 0xffCC33CC, 0xffCC3399, 0xffCC3366, 0xffCC3333, 0xffCC3300,

+    0xffCC00FF, 0xffCC00CC, 0xffCC0099, 0xffCC0066, 0xffCC0033, 0xffCC0000,

+    0xff99FFFF, 0xff99FFCC, 0xff99FF99, 0xff99FF66, 0xff99FF33, 0xff99FF00,

+    0xff99CCFF, 0xff99CCCC, 0xff99CC99, 0xff99CC66, 0xff99CC33, 0xff99CC00,

+    0xff9999FF, 0xff9999CC, 0xff999999, 0xff999966, 0xff999933, 0xff999900,

+    0xff9966FF, 0xff9966CC, 0xff996699, 0xff996666, 0xff996633, 0xff996600,

+    0xff9933FF, 0xff9933CC, 0xff993399, 0xff993366, 0xff993333, 0xff993300,

+    0xff9900FF, 0xff9900CC, 0xff990099, 0xff990066, 0xff990033, 0xff990000,

+    0xff66FFFF, 0xff66FFCC, 0xff66FF99, 0xff66FF66, 0xff66FF33, 0xff66FF00,

+    0xff66CCFF, 0xff66CCCC, 0xff66CC99, 0xff66CC66, 0xff66CC33, 0xff66CC00,

+    0xff6699FF, 0xff6699CC, 0xff669999, 0xff669966, 0xff669933, 0xff669900,

+    0xff6666FF, 0xff6666CC, 0xff666699, 0xff666666, 0xff666633, 0xff666600,

+    0xff6633FF, 0xff6633CC, 0xff663399, 0xff663366, 0xff663333, 0xff663300,

+    0xff6600FF, 0xff6600CC, 0xff660099, 0xff660066, 0xff660033, 0xff660000,

+    0xff33FFFF, 0xff33FFCC, 0xff33FF99, 0xff33FF66, 0xff33FF33, 0xff33FF00,

+    0xff33CCFF, 0xff33CCCC, 0xff33CC99, 0xff33CC66, 0xff33CC33, 0xff33CC00,

+    0xff3399FF, 0xff3399CC, 0xff339999, 0xff339966, 0xff339933, 0xff339900,

+    0xff3366FF, 0xff3366CC, 0xff336699, 0xff336666, 0xff336633, 0xff336600,

+    0xff3333FF, 0xff3333CC, 0xff333399, 0xff333366, 0xff333333, 0xff333300,

+    0xff3300FF, 0xff3300CC, 0xff330099, 0xff330066, 0xff330033, 0xff330000,

+    0xff00FFFF, 0xff00FFCC, 0xff00FF99, 0xff00FF66, 0xff00FF33, 0xff00FF00,

+    0xff00CCFF, 0xff00CCCC, 0xff00CC99, 0xff00CC66, 0xff00CC33, 0xff00CC00,

+    0xff0099FF, 0xff0099CC, 0xff009999, 0xff009966, 0xff009933, 0xff009900,

+    0xff0066FF, 0xff0066CC, 0xff006699, 0xff006666, 0xff006633, 0xff006600,

+    0xff0033FF, 0xff0033CC, 0xff003399, 0xff003366, 0xff003333, 0xff003300,

+    0xff0000FF, 0xff0000CC, 0xff000099, 0xff000066, 0xff000033,

+    0xffEE0000, 0xffDD0000, 0xffBB0000, 0xffAA0000, 0xff880000, 0xff770000,

+    0xff550000, 0xff440000, 0xff220000, 0xff110000, 0xff00EE00, 0xff00DD00,

+    0xff00BB00, 0xff00AA00, 0xff008800, 0xff007700, 0xff005500, 0xff004400,

+    0xff002200, 0xff001100, 0xff0000EE, 0xff0000DD, 0xff0000BB, 0xff0000AA,

+    0xff000088, 0xff000077, 0xff000055, 0xff000044, 0xff000022, 0xff000011,

+    0xffEEEEEE, 0xffDDDDDD, 0xffBBBBBB, 0xffAAAAAA, 0xff888888, 0xff777777,

+    0xff555555, 0xff444444, 0xff222222, 0xff111111, 0xff000000

+};

+class CFX_Palette : public CFX_Object

+{

+public:

+    CFX_Palette();

+    ~CFX_Palette();

+public:

+    FX_BOOL      BuildPalette(const CFX_DIBSource* pBitmap, int dwPaletteType);

+    FX_DWORD*    GetPalette() const

+    {

+        return m_pPalette;

+    }

+

+    FX_DWORD*    GetColorLut()const

+    {

+        return m_cLut;

+    }

+    FX_DWORD*    GetAmountLut()const

+    {

+        return m_aLut;

+    }

+    FX_INT32     Getlut()const

+    {

+        return m_lut;

+    }

+protected:

+    FX_DWORD*    m_pPalette;

+    FX_DWORD*    m_cLut;

+    FX_DWORD*    m_aLut;

+    int          m_lut;

+};

+int _Partition(FX_DWORD* alut, FX_DWORD* clut, int l, int r)

+{

+    FX_DWORD p_a = alut[l];

+    FX_DWORD p_c = clut[l];

+    while(l < r) {

+        while(l < r && alut[r] >= p_a) {

+            r--;

+        }

+        if (l < r) {

+            alut[l] = alut[r];

+            clut[l++] = clut[r];

+        }

+        while(l < r && alut[l] <= p_a) {

+            l++;

+        }

+        if (l < r) {

+            alut[r] = alut[l];

+            clut[r--] = clut[l];

+        }

+    }

+    alut[l] = p_a;

+    clut[l] = p_c;

+    return l;

+}

+void _Qsort(FX_DWORD* alut, FX_DWORD* clut, int l, int r)

+{

+    if(l < r) {

+        int pI = _Partition(alut, clut, l, r);

+        _Qsort(alut, clut, l, pI - 1);

+        _Qsort(alut, clut, pI + 1, r);

+    }

+}

+void _ColorDecode(FX_DWORD pal_v, FX_BYTE& r, FX_BYTE& g, FX_BYTE& b)

+{

+    r = (FX_BYTE)((pal_v & 0xf00) >> 4);

+    g = (FX_BYTE)(pal_v & 0x0f0);

+    b = (FX_BYTE)((pal_v & 0x00f) << 4);

+}

+void _Obtain_Pal(FX_DWORD* aLut, FX_DWORD*cLut, FX_DWORD* dest_pal, int pal_type, FX_DWORD* win_mac_pal, FX_DWORD lut)

+{

+    int row, col;

+    FX_DWORD lut_1 = lut - 1;

+    if (pal_type == FXDIB_PALETTE_LOC) {

+        for (row = 0; row < 256; row++) {

+            int lut_offset = lut_1 - row;

+            if (lut_offset < 0) {

+                lut_offset += 256;

+            }

+            FX_DWORD color = cLut[lut_offset];

+            FX_BYTE r, g, b;

+            _ColorDecode(color, r, g, b);

+            dest_pal[row] = ((FX_DWORD)r << 16) | ((FX_DWORD)g << 8) | b | 0xff000000;

+            aLut[lut_offset] = row;

+        }

+    } else {

+        for (row = 0; row < 256; row++) {

+            int lut_offset = lut_1 - row;

+            if (lut_offset < 0) {

+                lut_offset += 256;

+            }

+            FX_BYTE r, g, b;

+            _ColorDecode(cLut[lut_offset], r, g, b);

+            int error, min_error = 1000000;

+            int c_index = 0;

+            for (col = 0; col < 256; col++) {

+                FX_DWORD p_color = win_mac_pal[col];

+                int d_r = r - (FX_BYTE)(p_color >> 16);

+                int d_g = g - (FX_BYTE)(p_color >> 8);

+                int d_b = b - (FX_BYTE)p_color;

+                error = d_r * d_r + d_g * d_g + d_b * d_b;

+                if (error < min_error) {

+                    min_error = error;

+                    c_index = col;

+                }

+            }

+            dest_pal[row] =  win_mac_pal[c_index];

+            aLut[lut_offset] = row;

+        }

+    }

+}

+CFX_Palette::CFX_Palette()

+{

+    m_pPalette = NULL;

+    m_cLut = NULL;

+    m_aLut = NULL;

+    m_lut = 0;

+}

+CFX_Palette::~CFX_Palette()

+{

+    if (m_pPalette) {

+        FX_Free(m_pPalette);

+    }

+    if (m_cLut) {

+        FX_Free(m_cLut);

+    }

+    if (m_aLut) {

+        FX_Free(m_aLut);

+    }

+    m_lut = 0;

+}

+FX_BOOL CFX_Palette::BuildPalette(const CFX_DIBSource* pBitmap, int pal_type)

+{

+    if (pBitmap == NULL) {

+        return FALSE;

+    }

+    if (m_pPalette != NULL) {

+        FX_Free(m_pPalette);

+    }

+    m_pPalette = FX_Alloc(FX_DWORD, 256);

+    if (!m_pPalette) {

+        return FALSE;

+    }

+    FXSYS_memset32(m_pPalette, 0, sizeof(FX_DWORD) * 256);

+    int bpp    = pBitmap->GetBPP() / 8;

+    int width  = pBitmap->GetWidth();

+    int height = pBitmap->GetHeight();

+    if (m_cLut) {

+        FX_Free(m_cLut);

+        m_cLut = NULL;

+    }

+    if (m_aLut) {

+        FX_Free(m_aLut);

+        m_aLut = NULL;

+    }

+    m_cLut = FX_Alloc(FX_DWORD, 4096);

+    if (!m_cLut) {

+        return FALSE;

+    }

+    m_aLut = FX_Alloc(FX_DWORD, 4096);

+    if (!m_aLut) {

+        return FALSE;

+    }

+    FXSYS_memset32(m_aLut, 0, sizeof(FX_DWORD) * 4096);

+    FXSYS_memset32(m_cLut, 0, sizeof(FX_DWORD) * 4096);

+    int row, col;

+    m_lut = 0;

+    for (row = 0; row < height; row++) {

+        FX_BYTE* scan_line = (FX_BYTE*)pBitmap->GetScanline(row);

+        for (col = 0; col < width; col++) {

+            FX_BYTE* src_port = scan_line + col * bpp;

+            FX_DWORD b = src_port[0] & 0xf0;

+            FX_DWORD g = src_port[1] & 0xf0;

+            FX_DWORD r = src_port[2] & 0xf0;

+            FX_DWORD index = (r << 4) + g + (b >> 4);

+            m_aLut[index]++;

+        }

+    }

+    for (row = 0; row < 4096; row++) {

+        if (m_aLut[row] != 0) {

+            m_aLut[m_lut] = m_aLut[row];

+            m_cLut[m_lut] = row;

+            m_lut++;

+        }

+    }

+    _Qsort(m_aLut, m_cLut, 0, m_lut - 1);

+    FX_DWORD* win_mac_pal = NULL;

+    if (pal_type == FXDIB_PALETTE_WIN) {

+        win_mac_pal = (FX_DWORD*)g_dwWinPalette;

+    } else if (pal_type == FXDIB_PALETTE_MAC) {

+        win_mac_pal = (FX_DWORD*)g_dwMacPalette;

+    }

+    _Obtain_Pal(m_aLut, m_cLut, m_pPalette, pal_type, win_mac_pal, m_lut);

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_1bppMask2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                     const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)

+{

+    FX_BYTE set_gray, reset_gray;

+    set_gray = 0xff;

+    reset_gray = 0x00;

+    for (int row = 0; row < height; row ++) {

+        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+        FXSYS_memset8(dest_scan, reset_gray, width);

+        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);

+        for (int col = src_left; col < src_left + width; col ++) {

+            if (src_scan[col / 8] & (1 << (7 - col % 8))) {

+                *dest_scan = set_gray;

+            }

+            dest_scan ++;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_8bppMask2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                     const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)

+{

+    for (int row = 0; row < height; row ++) {

+        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;

+        FXSYS_memcpy32(dest_scan, src_scan, width);

+    }

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_1bppPlt2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)

+{

+    FX_DWORD* src_plt = pSrcBitmap->GetPalette();

+    FX_BYTE gray[2];

+    if (pIccTransform) {

+        FX_DWORD plt[2];

+        if (pSrcBitmap->IsCmykImage()) {

+            plt[0] = FXCMYK_TODIB(src_plt[0]);

+            plt[1] = FXCMYK_TODIB(src_plt[1]);

+        } else {

+            FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;

+            bgr_ptr[0] = FXARGB_B(src_plt[0]);

+            bgr_ptr[1] = FXARGB_G(src_plt[0]);

+            bgr_ptr[2] = FXARGB_R(src_plt[0]);

+            bgr_ptr[3] = FXARGB_B(src_plt[1]);

+            bgr_ptr[4] = FXARGB_G(src_plt[1]);

+            bgr_ptr[5] = FXARGB_R(src_plt[1]);

+        }

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        pIccModule->TranslateScanline(pIccTransform, gray, (FX_LPCBYTE)plt, 2);

+    } else {

+        FX_BYTE reset_r, reset_g, reset_b,

+                set_r, set_g, set_b;

+        if (pSrcBitmap->IsCmykImage()) {

+            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),

+                               reset_r, reset_g, reset_b);

+            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),

+                               set_r, set_g, set_b);

+        } else {

+            reset_r = FXARGB_R(src_plt[0]);

+            reset_g = FXARGB_G(src_plt[0]);

+            reset_b = FXARGB_B(src_plt[0]);

+            set_r = FXARGB_R(src_plt[1]);

+            set_g = FXARGB_G(src_plt[1]);

+            set_b = FXARGB_B(src_plt[1]);

+        }

+        gray[0] = FXRGB2GRAY(reset_r, reset_g, reset_b);

+        gray[1] = FXRGB2GRAY(set_r, set_g, set_b);

+    }

+    for (int row = 0; row < height; row ++) {

+        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+        FXSYS_memset8(dest_scan, gray[0], width);

+        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);

+        for (int col = src_left; col < src_left + width; col ++) {

+            if (src_scan[col / 8] & (1 << (7 - col % 8))) {

+                *dest_scan = gray[1];

+            }

+            dest_scan ++;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_8bppPlt2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)

+{

+    FX_DWORD* src_plt = pSrcBitmap->GetPalette();

+    FX_BYTE gray[256];

+    if (pIccTransform) {

+        FX_DWORD plt[256];

+        if (pSrcBitmap->IsCmykImage()) {

+            for (int i = 0; i < 256; i ++) {

+                plt[i] = FXCMYK_TODIB(src_plt[i]);

+            }

+        } else {

+            FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;

+            for (int i = 0; i < 256; i ++) {

+                *bgr_ptr++ = FXARGB_B(src_plt[i]);

+                *bgr_ptr++ = FXARGB_G(src_plt[i]);

+                *bgr_ptr++ = FXARGB_R(src_plt[i]);

+            }

+        }

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        pIccModule->TranslateScanline(pIccTransform, gray, (FX_LPCBYTE)plt, 256);

+    } else {

+        if (pSrcBitmap->IsCmykImage()) {

+            FX_BYTE r, g, b;

+            for (int i = 0; i < 256; i ++) {

+                AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),

+                                   r, g, b);

+                gray[i] = FXRGB2GRAY(r, g, b);

+            }

+        } else

+            for (int i = 0; i < 256; i ++) {

+                gray[i] = FXRGB2GRAY(FXARGB_R(src_plt[i]), FXARGB_G(src_plt[i]), FXARGB_B(src_plt[i]));

+            }

+    }

+    for (int row = 0; row < height; row ++) {

+        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;

+        for (int col = 0; col < width; col ++) {

+            *dest_scan++ = gray[*src_scan++];

+        }

+    }

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_RgbOrCmyk2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)

+{

+    int Bpp = pSrcBitmap->GetBPP() / 8;

+    if (pIccTransform) {

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        if (Bpp == 3 || pSrcBitmap->IsCmykImage()) {

+            for (int row = 0; row < height; row ++) {

+                FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+                FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;

+                pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);

+            }

+        } else {

+            for (int row = 0; row < height; row ++) {

+                FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+                FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;

+                for (int col = 0; col < width; col ++) {

+                    pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);

+                    dest_scan++;

+                    src_scan += 4;

+                }

+            }

+        }

+    } else {

+        if (pSrcBitmap->IsCmykImage()) {

+            for (int row = 0; row < height; row ++) {

+                FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+                FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;

+                for (int col = 0; col < width; col ++) {

+                    FX_BYTE r, g, b;

+                    AdobeCMYK_to_sRGB1(FXSYS_GetCValue((FX_DWORD)src_scan[0]), FXSYS_GetMValue((FX_DWORD)src_scan[1]), FXSYS_GetYValue((FX_DWORD)src_scan[2]), FXSYS_GetKValue((FX_DWORD)src_scan[3]),

+                                       r, g, b);

+                    *dest_scan++ = FXRGB2GRAY(r, g, b);

+                    src_scan += 4;

+                }

+            }

+        } else

+            for (int row = 0; row < height; row ++) {

+                FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+                FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;

+                for (int col = 0; col < width; col ++) {

+                    *dest_scan++ = FXRGB2GRAY(src_scan[2], src_scan[1], src_scan[0]);

+                    src_scan += Bpp;

+                }

+            }

+    }

+    return TRUE;

+}

+inline void _ConvertBuffer_IndexCopy(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                     const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)

+{

+    if (pSrcBitmap->GetBPP() == 1) {

+        for (int row = 0; row < height; row ++) {

+            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+            FXSYS_memset32(dest_scan, 0, width);

+            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);

+            for (int col = src_left; col < src_left + width; col ++) {

+                if (src_scan[col / 8] & (1 << (7 - col % 8))) {

+                    *dest_scan = 1;

+                }

+                dest_scan ++;

+            }

+        }

+    } else {

+        for (int row = 0; row < height; row ++) {

+            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;

+            FXSYS_memcpy32(dest_scan, src_scan, width);

+        }

+    }

+}

+FX_BOOL _ConvertBuffer_Plt2PltRgb8(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)

+{

+    _ConvertBuffer_IndexCopy(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);

+    FX_DWORD* src_plt = pSrcBitmap->GetPalette();

+    int plt_size = pSrcBitmap->GetPaletteSize();

+    if (pIccTransform) {

+        FX_DWORD plt[256];

+        FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;

+        if (pSrcBitmap->IsCmykImage()) {

+            for (int i = 0; i < plt_size; i ++) {

+                plt[i] = FXCMYK_TODIB(src_plt[i]);

+            }

+        } else {

+            for (int i = 0; i < plt_size; i ++) {

+                *bgr_ptr++ = FXARGB_B(src_plt[i]);

+                *bgr_ptr++ = FXARGB_G(src_plt[i]);

+                *bgr_ptr++ = FXARGB_R(src_plt[i]);

+            }

+            bgr_ptr = (FX_LPBYTE)plt;

+        }

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, plt_size);

+        for (int i = 0; i < plt_size; i ++) {

+            dst_plt[i] = FXARGB_MAKE(0xff, bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);

+            bgr_ptr += 3;

+        }

+    } else {

+        if (pSrcBitmap->IsCmykImage()) {

+            for (int i = 0; i < plt_size; i ++) {

+                FX_BYTE r, g, b;

+                AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),

+                                   r, g, b);

+                dst_plt[i] = FXARGB_MAKE(0xff, r, g, b);

+            }

+        } else {

+            FXSYS_memcpy32(dst_plt, src_plt, plt_size * 4);

+        }

+    }

+    return TRUE;

+}

+inline FX_BOOL _ConvertBuffer_Rgb2PltRgb8_NoTransform(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+        const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt)

+{

+    int bpp = pSrcBitmap->GetBPP() / 8;

+    int row, col;

+    CFX_Palette palette;

+    palette.BuildPalette(pSrcBitmap, FXDIB_PALETTE_LOC);

+    FX_DWORD* cLut = palette.GetColorLut();

+    FX_DWORD* aLut = palette.GetAmountLut();

+    if (cLut == NULL || aLut == NULL) {

+        return FALSE;

+    }

+    int lut = palette.Getlut();

+    FX_DWORD* pPalette = palette.GetPalette();

+    if (lut > 256) {

+        int err, min_err;

+        int lut_256 = lut - 256;

+        for (row = 0; row < lut_256; row++) {

+            min_err = 1000000;

+            FX_BYTE r, g, b;

+            _ColorDecode(cLut[row], r, g, b);

+            int clrindex = 0;

+            for (int col = 0; col < 256; col++) {

+                FX_DWORD p_color = *(pPalette + col);

+                int d_r = r - (FX_BYTE)(p_color >> 16);

+                int d_g = g - (FX_BYTE)(p_color >> 8);

+                int d_b = b - (FX_BYTE)(p_color);

+                err = d_r * d_r + d_g * d_g + d_b * d_b;

+                if (err < min_err) {

+                    min_err = err;

+                    clrindex = col;

+                }

+            }

+            aLut[row] = clrindex;

+        }

+    }

+    FX_INT32 lut_1 = lut - 1;

+    for (row = 0; row < height; row ++) {

+        FX_BYTE* src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left;

+        FX_BYTE* dest_scan = dest_buf + row * dest_pitch;

+        for (col = 0; col < width; col++) {

+            FX_BYTE* src_port = src_scan + col * bpp;

+            int r = src_port[2] & 0xf0;

+            int g = src_port[1] & 0xf0;

+            int b = src_port[0] & 0xf0;

+            FX_DWORD clrindex = (r << 4) + g + (b >> 4);

+            for (int i = lut_1; i >= 0; i--)

+                if (clrindex == cLut[i]) {

+                    *(dest_scan + col) = (FX_BYTE)(aLut[i]);

+                    break;

+                }

+        }

+    }

+    FXSYS_memcpy32(dst_plt, pPalette, sizeof(FX_DWORD) * 256);

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_Rgb2PltRgb8(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)

+{

+    ICodec_IccModule* pIccModule = NULL;

+    if (pIccTransform) {

+        pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+    }

+    FX_BOOL ret = _ConvertBuffer_Rgb2PltRgb8_NoTransform(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, dst_plt);

+    if (ret && pIccTransform) {

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        for (int i = 0; i < 256; i++) {

+            FX_ARGB* plt = dst_plt + i;

+            FX_ARGB plt_entry = FXARGB_TODIB(*plt);

+            pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&plt_entry, (FX_LPCBYTE)&plt_entry, 1);

+            *plt = FXARGB_TODIB(plt_entry);

+        }

+    }

+    return ret;

+}

+FX_BOOL _ConvertBuffer_1bppMask2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)

+{

+    int comps = (dst_format & 0xff) / 8;

+    FX_BYTE set_gray, reset_gray;

+    set_gray = 0xff;

+    reset_gray = 0x00;

+    for (int row = 0; row < height; row ++) {

+        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);

+        for (int col = src_left; col < src_left + width; col ++) {

+            if (src_scan[col / 8] & (1 << (7 - col % 8))) {

+                dest_scan[0] = set_gray;

+                dest_scan[1] = set_gray;

+                dest_scan[2] = set_gray;

+            } else {

+                dest_scan[0] = reset_gray;

+                dest_scan[1] = reset_gray;

+                dest_scan[2] = reset_gray;

+            }

+            dest_scan += comps;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_8bppMask2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                    const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)

+{

+    int comps = (dst_format & 0xff) / 8;

+    for (int row = 0; row < height; row ++) {

+        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;

+        FX_BYTE src_pixel;

+        for (int col = 0; col < width; col ++) {

+            src_pixel = *src_scan++;

+            *dest_scan++ = src_pixel;

+            *dest_scan++ = src_pixel;

+            *dest_scan   = src_pixel;

+            dest_scan += comps - 2;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_1bppPlt2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)

+{

+    int comps = (dst_format & 0xff) / 8;

+    FX_DWORD* src_plt = pSrcBitmap->GetPalette();

+    FX_DWORD plt[2];

+    FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;

+    if (pSrcBitmap->IsCmykImage()) {

+        plt[0] = FXCMYK_TODIB(src_plt[0]);

+        plt[1] = FXCMYK_TODIB(src_plt[1]);

+    } else {

+        bgr_ptr[0] = FXARGB_B(src_plt[0]);

+        bgr_ptr[1] = FXARGB_G(src_plt[0]);

+        bgr_ptr[2] = FXARGB_R(src_plt[0]);

+        bgr_ptr[3] = FXARGB_B(src_plt[1]);

+        bgr_ptr[4] = FXARGB_G(src_plt[1]);

+        bgr_ptr[5] = FXARGB_R(src_plt[1]);

+    }

+    if (pIccTransform) {

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, 2);

+    } else {

+        if (pSrcBitmap->IsCmykImage()) {

+            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),

+                               bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);

+            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),

+                               bgr_ptr[5], bgr_ptr[4], bgr_ptr[3]);

+        }

+    }

+    for (int row = 0; row < height; row ++) {

+        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);

+        for (int col = src_left; col < src_left + width; col ++) {

+            if (src_scan[col / 8] & (1 << (7 - col % 8))) {

+                *dest_scan++ = bgr_ptr[3];

+                *dest_scan++ = bgr_ptr[4];

+                *dest_scan   = bgr_ptr[5];

+            } else {

+                *dest_scan++ = bgr_ptr[0];

+                *dest_scan++ = bgr_ptr[1];

+                *dest_scan   = bgr_ptr[2];

+            }

+            dest_scan += comps - 2;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_8bppPlt2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                   const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)

+{

+    int comps = (dst_format & 0xff) / 8;

+    FX_DWORD* src_plt = pSrcBitmap->GetPalette();

+    FX_DWORD plt[256];

+    FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;

+    if (!pSrcBitmap->IsCmykImage()) {

+        for (int i = 0; i < 256; i++) {

+            *bgr_ptr++ = FXARGB_B(src_plt[i]);

+            *bgr_ptr++ = FXARGB_G(src_plt[i]);

+            *bgr_ptr++ = FXARGB_R(src_plt[i]);

+        }

+        bgr_ptr = (FX_LPBYTE)plt;

+    }

+    if (pIccTransform) {

+        if (pSrcBitmap->IsCmykImage()) {

+            for (int i = 0; i < 256; i++) {

+                plt[i] = FXCMYK_TODIB(src_plt[i]);

+            }

+        }

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, 256);

+    } else {

+        if (pSrcBitmap->IsCmykImage()) {

+            for (int i = 0; i < 256; i++) {

+                AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),

+                                   bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);

+                bgr_ptr += 3;

+            }

+            bgr_ptr = (FX_LPBYTE)plt;

+        }

+    }

+    for (int row = 0; row < height; row ++) {

+        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;

+        for (int col = 0; col < width; col ++) {

+            FX_LPBYTE src_pixel = bgr_ptr + 3 * (*src_scan++);

+            *dest_scan++ = *src_pixel++;

+            *dest_scan++ = *src_pixel++;

+            *dest_scan   = *src_pixel++;

+            dest_scan += comps - 2;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_24bppRgb2Rgb24(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)

+{

+    if (pIccTransform) {

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        for (int row = 0; row < height; row ++) {

+            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;

+            pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);

+        }

+    } else {

+        for (int row = 0; row < height; row ++) {

+            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;

+            FXSYS_memcpy32(dest_scan, src_scan, width * 3);

+        }

+    }

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_32bppRgb2Rgb24(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)

+{

+    for (int row = 0; row < height; row ++) {

+        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+        FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;

+        for (int col = 0; col < width; col ++) {

+            *dest_scan++ = *src_scan++;

+            *dest_scan++ = *src_scan++;

+            *dest_scan++ = *src_scan++;

+            src_scan++;

+        }

+    }

+    if (pIccTransform) {

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        for (int row = 0; row < height; row ++) {

+            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+            pIccModule->TranslateScanline(pIccTransform, dest_scan, dest_scan, width);

+        }

+    }

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_Rgb2Rgb32(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                 const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)

+{

+    int comps = pSrcBitmap->GetBPP() / 8;

+    if (pIccTransform) {

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        for (int row = 0; row < height; row ++) {

+            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;

+            for (int col = 0; col < width; col ++) {

+                pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);

+                dest_scan += 4;

+                src_scan += comps;

+            }

+        }

+    } else {

+        for (int row = 0; row < height; row ++) {

+            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;

+            for (int col = 0; col < width; col ++) {

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                *dest_scan++ = *src_scan++;

+                dest_scan++;

+                src_scan += comps - 3;

+            }

+        }

+    }

+    return TRUE;

+}

+FX_BOOL _ConvertBuffer_32bppCmyk2Rgb32(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                                       const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)

+{

+    if (pIccTransform) {

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        for (int row = 0; row < height; row ++) {

+            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;

+            for (int col = 0; col < width; col ++) {

+                pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);

+                dest_scan += 4;

+                src_scan += 4;

+            }

+        }

+    } else {

+        for (int row = 0; row < height; row ++) {

+            FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+            FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;

+            for (int col = 0; col < width; col ++) {

+                AdobeCMYK_to_sRGB1(src_scan[0], src_scan[1], src_scan[2], src_scan[3],

+                                   dest_scan[2], dest_scan[1], dest_scan[0]);

+                dest_scan += 4;

+                src_scan += 4;

+            }

+        }

+    }

+    return TRUE;

+}

+FX_BOOL ConvertBuffer(FXDIB_Format dest_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& d_pal, void* pIccTransform)

+{

+    FXDIB_Format src_format = pSrcBitmap->GetFormat();

+    if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {

+        pIccTransform = NULL;

+    }

+    switch (dest_format) {

+        case FXDIB_Invalid:

+        case FXDIB_1bppCmyk:

+        case FXDIB_1bppMask:

+        case FXDIB_1bppRgb:

+            ASSERT(FALSE);

+            return FALSE;

+        case FXDIB_8bppMask: {

+                if ((src_format & 0xff) == 1) {

+                    if (pSrcBitmap->GetPalette()) {

+                        return _ConvertBuffer_1bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);

+                    }

+                    return _ConvertBuffer_1bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);

+                } else if ((src_format & 0xff) == 8) {

+                    if (pSrcBitmap->GetPalette()) {

+                        return _ConvertBuffer_8bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);

+                    }

+                    return _ConvertBuffer_8bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);

+                } else if ((src_format & 0xff) >= 24) {

+                    return _ConvertBuffer_RgbOrCmyk2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);

+                }

+                return FALSE;

+            }

+        case FXDIB_8bppRgb:

+        case FXDIB_8bppRgba: {

+                if ((src_format & 0xff) == 8 && pSrcBitmap->GetPalette() == NULL) {

+                    return ConvertBuffer(FXDIB_8bppMask, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);

+                }

+                d_pal = FX_Alloc(FX_DWORD, 256);

+                if (!d_pal) {

+                    return FALSE;

+                }

+                FXSYS_memset32(d_pal, 0, sizeof(FX_DWORD) * 256);

+                if (((src_format & 0xff) == 1 || (src_format & 0xff) == 8) && pSrcBitmap->GetPalette()) {

+                    return _ConvertBuffer_Plt2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);

+                } else if ((src_format & 0xff) >= 24) {

+                    return _ConvertBuffer_Rgb2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);

+                }

+                return FALSE;

+            }

+        case FXDIB_Rgb:

+        case FXDIB_Rgba: {

+                if ((src_format & 0xff) == 1) {

+                    if (pSrcBitmap->GetPalette()) {

+                        return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);

+                    }

+                    return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);

+                } else if ((src_format & 0xff) == 8) {

+                    if (pSrcBitmap->GetPalette()) {

+                        return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);

+                    }

+                    return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);

+                } else if ((src_format & 0xff) == 24) {

+                    return _ConvertBuffer_24bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);

+                } else if ((src_format & 0xff) == 32) {

+                    return _ConvertBuffer_32bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);

+                }

+                return FALSE;

+            }

+        case FXDIB_Argb:

+        case FXDIB_Rgb32: {

+                if ((src_format & 0xff) == 1) {

+                    if (pSrcBitmap->GetPalette()) {

+                        return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);

+                    }

+                    return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);

+                } else if ((src_format & 0xff) == 8) {

+                    if (pSrcBitmap->GetPalette()) {

+                        return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);

+                    }

+                    return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);

+                } else if ((src_format & 0xff) >= 24) {

+                    if (src_format & 0x0400) {

+                        return _ConvertBuffer_32bppCmyk2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);

+                    }

+                    return _ConvertBuffer_Rgb2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);

+                }

+                return FALSE;

+            }

+        default:

+            return FALSE;

+    }

+    return FALSE;

+}

+CFX_DIBitmap* CFX_DIBSource::CloneConvert(FXDIB_Format dest_format, const FX_RECT* pClip, void* pIccTransform) const

+{

+    if(dest_format == GetFormat() && pIccTransform == NULL) {

+        return Clone(pClip);

+    }

+    if (pClip) {

+        CFX_DIBitmap* pClone = Clone(pClip);

+        if (pClone == NULL) {

+            return NULL;

+        }

+        if(!pClone->ConvertFormat(dest_format, pIccTransform)) {

+            delete pClone;

+            return NULL;

+        }

+        return pClone;

+    }

+    CFX_DIBitmap* pClone = FX_NEW CFX_DIBitmap;

+    if (!pClone) {

+        return NULL;

+    }

+    if(!pClone->Create(m_Width, m_Height, dest_format)) {

+        delete pClone;

+        return NULL;

+    }

+    FX_BOOL ret = TRUE;

+    CFX_DIBitmap* pSrcAlpha = NULL;

+    if (m_AlphaFlag & 2) {

+        pSrcAlpha = (GetFormat() == FXDIB_Argb) ? GetAlphaMask() : m_pAlphaMask;

+        if (pSrcAlpha == NULL) {

+            delete pClone;

+            return NULL;

+        }

+    }

+    if (dest_format & 0x0200) {

+        if (dest_format == FXDIB_Argb)

+            ret = pSrcAlpha ?

+                  pClone->LoadChannel(FXDIB_Alpha, pSrcAlpha, FXDIB_Alpha) :

+                  pClone->LoadChannel(FXDIB_Alpha, 0xff);

+        else {

+            ret = pClone->CopyAlphaMask(pSrcAlpha);

+        }

+    }

+    if (pSrcAlpha && pSrcAlpha != m_pAlphaMask) {

+        delete pSrcAlpha;

+        pSrcAlpha = NULL;

+    }

+    if (!ret) {

+        delete pClone;

+        return NULL;

+    }

+    FX_DWORD* pal_8bpp = NULL;

+    ret = ConvertBuffer(dest_format, pClone->GetBuffer(), pClone->GetPitch(), m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);

+    if (!ret) {

+        if (pal_8bpp) {

+            FX_Free(pal_8bpp);

+        }

+        delete pClone;

+        return NULL;

+    }

+    if (pal_8bpp) {

+        pClone->CopyPalette(pal_8bpp);

+        FX_Free(pal_8bpp);

+        pal_8bpp = NULL;

+    }

+    return pClone;

+}

+FX_BOOL CFX_DIBitmap::ConvertFormat(FXDIB_Format dest_format, void* pIccTransform)

+{

+    FXDIB_Format src_format = GetFormat();

+    if (dest_format == src_format && pIccTransform == NULL) {

+        return TRUE;

+    }

+    if (dest_format == FXDIB_8bppMask && src_format == FXDIB_8bppRgb && m_pPalette == NULL) {

+        m_AlphaFlag = 1;

+        return TRUE;

+    }

+    if (dest_format == FXDIB_Argb && src_format == FXDIB_Rgb32 && pIccTransform == NULL) {

+        m_AlphaFlag = 2;

+        for (int row = 0; row < m_Height; row ++) {

+            FX_LPBYTE scanline = m_pBuffer + row * m_Pitch + 3;

+            for (int col = 0; col < m_Width; col ++) {

+                *scanline = 0xff;

+                scanline += 4;

+            }

+        }

+        return TRUE;

+    }

+    int dest_bpp = dest_format & 0xff;

+    int dest_pitch = (dest_bpp * m_Width + 31) / 32 * 4;

+    FX_LPBYTE dest_buf = FX_AllocNL(FX_BYTE, dest_pitch * m_Height + 4);

+    if (dest_buf == NULL) {

+        return FALSE;

+    }

+    CFX_DIBitmap* pAlphaMask = NULL;

+    if (dest_format == FXDIB_Argb) {

+        FXSYS_memset8(dest_buf, 0xff, dest_pitch * m_Height + 4);

+        if (m_pAlphaMask) {

+            for (int row = 0; row < m_Height; row ++) {

+                FX_LPBYTE pDstScanline = dest_buf + row * dest_pitch + 3;

+                FX_LPCBYTE pSrcScanline = m_pAlphaMask->GetScanline(row);

+                for (int col = 0; col < m_Width; col ++) {

+                    *pDstScanline = *pSrcScanline++;

+                    pDstScanline += 4;

+                }

+            }

+        }

+    } else if (dest_format & 0x0200) {

+        if (src_format == FXDIB_Argb) {

+            pAlphaMask = GetAlphaMask();

+            if (pAlphaMask == NULL) {

+                FX_Free(dest_buf);

+                return FALSE;

+            }

+        } else {

+            if (m_pAlphaMask == NULL) {

+                if (!BuildAlphaMask()) {

+                    FX_Free(dest_buf);

+                    return FALSE;

+                }

+                pAlphaMask = m_pAlphaMask;

+                m_pAlphaMask = NULL;

+            } else {

+                pAlphaMask = m_pAlphaMask;

+            }

+        }

+    }

+    FX_BOOL ret = FALSE;

+    FX_DWORD* pal_8bpp = NULL;

+    ret = ConvertBuffer(dest_format, dest_buf, dest_pitch, m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);

+    if (!ret) {

+        if (pal_8bpp) {

+            FX_Free(pal_8bpp);

+        }

+        if (pAlphaMask != m_pAlphaMask) {

+            delete pAlphaMask;

+        }

+        if (dest_buf) {

+            FX_Free(dest_buf);

+        }

+        return FALSE;

+    }

+    if (m_pAlphaMask && pAlphaMask != m_pAlphaMask) {

+        delete m_pAlphaMask;

+    }

+    m_pAlphaMask = pAlphaMask;

+    if (m_pPalette) {

+        FX_Free(m_pPalette);

+    }

+    m_pPalette = pal_8bpp;

+    if (!m_bExtBuf) {

+        FX_Free(m_pBuffer);

+    }

+    m_bExtBuf = FALSE;

+    m_pBuffer = dest_buf;

+    m_bpp = (FX_BYTE)dest_format;

+    m_AlphaFlag = (FX_BYTE)(dest_format >> 8);

+    m_Pitch = dest_pitch;

+    return TRUE;

+}

diff --git a/core/src/fxge/dib/fx_dib_engine.cpp b/core/src/fxge/dib/fx_dib_engine.cpp
new file mode 100644
index 0000000..3ddbff6
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_engine.cpp
@@ -0,0 +1,867 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_dib.h"

+#include "../../../include/fxge/fx_ge.h"

+#include "dib_int.h"

+#include <limits.h>

+extern int SDP_Table[513];

+void CWeightTable::Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags)

+{

+    if (m_pWeightTables) {

+        FX_Free(m_pWeightTables);

+        m_pWeightTables = NULL;

+    }

+    double scale, base;

+    scale = FXSYS_Div((FX_FLOAT)(src_len), (FX_FLOAT)(dest_len));

+    if (dest_len < 0) {

+        base = (FX_FLOAT)(src_len);

+    } else {

+        base = 0;

+    }

+    int ext_size = flags & FXDIB_BICUBIC_INTERPOL ? 3 : 1;

+    m_ItemSize = sizeof(int) * 2 + (int)(sizeof(int) * (FXSYS_ceil(FXSYS_fabs((FX_FLOAT)scale)) + ext_size));

+    m_DestMin = dest_min;

+    if ((dest_max - dest_min) > (int)((1U << 30) - 4) / m_ItemSize) {

+        return;

+    }

+    m_pWeightTables = FX_AllocNL(FX_BYTE, (dest_max - dest_min) * m_ItemSize + 4);

+    if (m_pWeightTables == NULL) {

+        return;

+    }

+    FXSYS_memset32(m_pWeightTables, 0, sizeof(FX_BYTE) * ((dest_max - dest_min)*m_ItemSize + 4));

+    if ((flags & FXDIB_NOSMOOTH) != 0 || FXSYS_fabs((FX_FLOAT)scale) < 1.0f) {

+        for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel ++) {

+            PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);

+            double src_pos = dest_pixel * scale + scale / 2 + base;

+            if (flags & FXDIB_INTERPOL) {

+                pixel_weights.m_SrcStart = (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);

+                pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2);

+                if (pixel_weights.m_SrcStart < src_min) {

+                    pixel_weights.m_SrcStart = src_min;

+                }

+                if (pixel_weights.m_SrcEnd >= src_max) {

+                    pixel_weights.m_SrcEnd = src_max - 1;

+                }

+                if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {

+                    pixel_weights.m_Weights[0] = 65536;

+                } else {

+                    pixel_weights.m_Weights[1] = FXSYS_round((FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 65536);

+                    pixel_weights.m_Weights[0] = 65536 - pixel_weights.m_Weights[1];

+                }

+            } else if (flags & FXDIB_BICUBIC_INTERPOL) {

+                pixel_weights.m_SrcStart = (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);

+                pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2);

+                int start = pixel_weights.m_SrcStart - 1;

+                int end = pixel_weights.m_SrcEnd + 1;

+                if (start < src_min) {

+                    start = src_min;

+                }

+                if (end >= src_max) {

+                    end = src_max - 1;

+                }

+                if (pixel_weights.m_SrcStart < src_min) {

+                    src_pos += src_min - pixel_weights.m_SrcStart;

+                    pixel_weights.m_SrcStart = src_min;

+                }

+                if (pixel_weights.m_SrcEnd >= src_max) {

+                    pixel_weights.m_SrcEnd = src_max - 1;

+                }

+                int weight;

+                weight = FXSYS_round((FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 256);

+                if (start == end) {

+                    pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;

+                } else if ((start == pixel_weights.m_SrcStart && (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd ||

+                            end == pixel_weights.m_SrcEnd) && start < end) || (start < pixel_weights.m_SrcStart && pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd && end == pixel_weights.m_SrcEnd)) {

+                    if (start < pixel_weights.m_SrcStart) {

+                        pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;

+                        pixel_weights.m_Weights[1] = (SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;

+                    } else {

+                        if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {

+                            pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight]) << 8;

+                            pixel_weights.m_Weights[1] = SDP_Table[512 - weight] << 8;

+                        } else {

+                            pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;

+                            pixel_weights.m_Weights[1] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;

+                        }

+                    }

+                    if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {

+                        pixel_weights.m_SrcEnd = end;

+                    }

+                    if (start < pixel_weights.m_SrcStart) {

+                        pixel_weights.m_SrcStart = start;

+                    }

+                } else if (start == pixel_weights.m_SrcStart &&

+                           start < pixel_weights.m_SrcEnd &&

+                           pixel_weights.m_SrcEnd < end) {

+                    pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;

+                    pixel_weights.m_Weights[1] = SDP_Table[256 - weight] << 8;

+                    pixel_weights.m_Weights[2] = SDP_Table[512 - weight] << 8;

+                    pixel_weights.m_SrcEnd = end;

+                } else if (start < pixel_weights.m_SrcStart &&

+                           pixel_weights.m_SrcStart < pixel_weights.m_SrcEnd &&

+                           pixel_weights.m_SrcEnd == end) {

+                    pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;

+                    pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;

+                    pixel_weights.m_Weights[2] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;

+                    pixel_weights.m_SrcStart = start;

+                } else {

+                    pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;

+                    pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;

+                    pixel_weights.m_Weights[2] = SDP_Table[256 - weight] << 8;

+                    pixel_weights.m_Weights[3] = SDP_Table[512 - weight] << 8;

+                    pixel_weights.m_SrcStart = start;

+                    pixel_weights.m_SrcEnd = end;

+                }

+            } else {

+                pixel_weights.m_SrcStart = pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos);

+                if (pixel_weights.m_SrcStart < src_min) {

+                    pixel_weights.m_SrcStart = src_min;

+                }

+                if (pixel_weights.m_SrcEnd >= src_max) {

+                    pixel_weights.m_SrcEnd = src_max - 1;

+                }

+                pixel_weights.m_Weights[0] = 65536;

+            }

+        }

+        return;

+    }

+    for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel ++) {

+        PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);

+        double src_start = dest_pixel * scale + base;

+        double src_end = src_start + scale;

+        int start_i, end_i;

+        if (src_start < src_end) {

+            start_i = (int)FXSYS_floor((FX_FLOAT)src_start);

+            end_i = (int)FXSYS_ceil((FX_FLOAT)src_end);

+        } else {

+            start_i = (int)FXSYS_floor((FX_FLOAT)src_end);

+            end_i = (int)FXSYS_ceil((FX_FLOAT)src_start);

+        }

+        if (start_i < src_min) {

+            start_i = src_min;

+        }

+        if (end_i >= src_max) {

+            end_i = src_max - 1;

+        }

+        if (start_i > end_i) {

+            if (start_i >= src_max) {

+                start_i = src_max - 1;

+            }

+            pixel_weights.m_SrcStart = start_i;

+            pixel_weights.m_SrcEnd = start_i;

+            continue;

+        }

+        pixel_weights.m_SrcStart = start_i;

+        pixel_weights.m_SrcEnd = end_i;

+        for (int j = start_i; j <= end_i; j ++) {

+            double dest_start = FXSYS_Div((FX_FLOAT)(j) - base, scale);

+            double dest_end = FXSYS_Div((FX_FLOAT)(j + 1) - base, scale);

+            if (dest_start > dest_end) {

+                double temp = dest_start;

+                dest_start = dest_end;

+                dest_end = temp;

+            }

+            double area_start = dest_start > (FX_FLOAT)(dest_pixel) ? dest_start : (FX_FLOAT)(dest_pixel);

+            double area_end = dest_end > (FX_FLOAT)(dest_pixel + 1) ? (FX_FLOAT)(dest_pixel + 1) : dest_end;

+            double weight = area_start >= area_end ? 0.0f : area_end - area_start;

+            if (weight == 0 && j == end_i) {

+                pixel_weights.m_SrcEnd --;

+                break;

+            }

+            pixel_weights.m_Weights[j - start_i] = FXSYS_round((FX_FLOAT)(weight * 65536));

+        }

+    }

+}

+CStretchEngine::CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,

+                               int dest_width, int dest_height, const FX_RECT& clip_rect,

+                               const CFX_DIBSource* pSrcBitmap, int flags)

+{

+    m_State = 0;

+    m_DestFormat = dest_format;

+    m_DestBpp = dest_format & 0xff;

+    m_SrcBpp = pSrcBitmap->GetFormat() & 0xff;

+    m_bHasAlpha = pSrcBitmap->GetFormat() & 0x200;

+    m_pSrcPalette = pSrcBitmap->GetPalette();

+    m_pDestBitmap = pDestBitmap;

+    m_DestWidth = dest_width;

+    m_DestHeight = dest_height;

+    m_pInterBuf = NULL;

+    m_pExtraAlphaBuf = NULL;

+    m_pDestMaskScanline = NULL;

+    m_DestClip = clip_rect;

+    FX_DWORD size = clip_rect.Width();

+    if (size && m_DestBpp > (int)(INT_MAX / size)) {

+        return;

+    }

+    size *= m_DestBpp;

+    if (size > INT_MAX - 31) {

+        return;

+    }

+    size += 31;

+    size = size / 32 * 4;

+    m_pDestScanline = FX_AllocNL(FX_BYTE, size);

+    if (m_pDestScanline == NULL) {

+        return;

+    }

+    FXSYS_memset32(m_pDestScanline, 0, sizeof(FX_BYTE) * size);

+    if (dest_format == FXDIB_Rgb32) {

+        FXSYS_memset8(m_pDestScanline, 255, size);

+    }

+    m_InterPitch = (m_DestClip.Width() * m_DestBpp + 31) / 32 * 4;

+    m_ExtraMaskPitch = (m_DestClip.Width() * 8 + 31) / 32 * 4;

+    m_pInterBuf = NULL;

+    m_pSource = pSrcBitmap;

+    m_SrcWidth = pSrcBitmap->GetWidth();

+    m_SrcHeight = pSrcBitmap->GetHeight();

+    m_SrcPitch = (m_SrcWidth * m_SrcBpp + 31) / 32 * 4;

+    if ((flags & FXDIB_NOSMOOTH) == 0) {

+        FX_BOOL bInterpol = flags & FXDIB_INTERPOL || flags & FXDIB_BICUBIC_INTERPOL;

+        if (!bInterpol && FXSYS_abs(dest_width) != 0 && FXSYS_abs(dest_height) < m_SrcWidth * m_SrcHeight * 8 / FXSYS_abs(dest_width)) {

+            flags = FXDIB_INTERPOL;

+        }

+        m_Flags = flags;

+    } else {

+        m_Flags = FXDIB_NOSMOOTH;

+        if (flags & FXDIB_DOWNSAMPLE) {

+            m_Flags |= FXDIB_DOWNSAMPLE;

+        }

+    }

+    double scale_x = FXSYS_Div((FX_FLOAT)(m_SrcWidth), (FX_FLOAT)(m_DestWidth));

+    double scale_y = FXSYS_Div((FX_FLOAT)(m_SrcHeight), (FX_FLOAT)(m_DestHeight));

+    double base_x = m_DestWidth > 0 ? 0.0f : (FX_FLOAT)(m_DestWidth);

+    double base_y = m_DestHeight > 0 ? 0.0f : (FX_FLOAT)(m_DestHeight);

+    double src_left = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.left) + base_x);

+    double src_right = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.right) + base_x);

+    double src_top = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.top) + base_y);

+    double src_bottom = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.bottom) + base_y);

+    if (src_left > src_right) {

+        double temp = src_left;

+        src_left = src_right;

+        src_right = temp;

+    }

+    if (src_top > src_bottom) {

+        double temp = src_top;

+        src_top = src_bottom;

+        src_bottom = temp;

+    }

+    m_SrcClip.left = (int)FXSYS_floor((FX_FLOAT)src_left);

+    m_SrcClip.right = (int)FXSYS_ceil((FX_FLOAT)src_right);

+    m_SrcClip.top = (int)FXSYS_floor((FX_FLOAT)src_top);

+    m_SrcClip.bottom = (int)FXSYS_ceil((FX_FLOAT)src_bottom);

+    FX_RECT src_rect(0, 0, m_SrcWidth, m_SrcHeight);

+    m_SrcClip.Intersect(src_rect);

+    if (m_SrcBpp == 1) {

+        if (m_DestBpp == 8) {

+            m_TransMethod = 1;

+        } else {

+            m_TransMethod = 2;

+        }

+    } else if (m_SrcBpp == 8) {

+        if (m_DestBpp == 8) {

+            if (!m_bHasAlpha) {

+                m_TransMethod = 3;

+            } else {

+                m_TransMethod = 4;

+            }

+        } else {

+            if (!m_bHasAlpha) {

+                m_TransMethod = 5;

+            } else {

+                m_TransMethod = 6;

+            }

+        }

+    } else {

+        if (!m_bHasAlpha) {

+            m_TransMethod = 7;

+        } else {

+            m_TransMethod = 8;

+        }

+    }

+}

+FX_BOOL CStretchEngine::Continue(IFX_Pause* pPause)

+{

+    while (m_State == 1) {

+        if (ContinueStretchHorz(pPause)) {

+            return TRUE;

+        }

+        m_State = 2;

+        StretchVert();

+    }

+    return FALSE;

+}

+CStretchEngine::~CStretchEngine()

+{

+    if (m_pDestScanline) {

+        FX_Free(m_pDestScanline);

+    }

+    if (m_pInterBuf) {

+        FX_Free(m_pInterBuf);

+    }

+    if (m_pExtraAlphaBuf) {

+        FX_Free(m_pExtraAlphaBuf);

+    }

+    if (m_pDestMaskScanline) {

+        FX_Free(m_pDestMaskScanline);

+    }

+}

+FX_BOOL CStretchEngine::StartStretchHorz()

+{

+    if (m_DestWidth == 0 || m_pDestScanline == NULL || m_SrcClip.Height() > (int)((1U << 29) / m_InterPitch) || m_SrcClip.Height() == 0) {

+        return FALSE;

+    }

+#ifndef _FPDFAPI_MINI_

+    m_pInterBuf = FX_AllocNL(unsigned char, m_SrcClip.Height() * m_InterPitch);

+#else

+    m_pInterBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_InterPitch);

+#endif

+    if (m_pInterBuf == NULL) {

+        return FALSE;

+    }

+    if (m_pSource && m_bHasAlpha && m_pSource->m_pAlphaMask) {

+        m_pExtraAlphaBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_ExtraMaskPitch);

+        if (!m_pExtraAlphaBuf) {

+            return FALSE;

+        }

+        FX_DWORD size = (m_DestClip.Width() * 8 + 31) / 32 * 4;

+        m_pDestMaskScanline = FX_AllocNL(unsigned char, size);

+        if (!m_pDestMaskScanline) {

+            return FALSE;

+        }

+    }

+    m_WeightTable.Calc(m_DestWidth, m_DestClip.left, m_DestClip.right, m_SrcWidth, m_SrcClip.left, m_SrcClip.right, m_Flags);

+    if (m_WeightTable.m_pWeightTables == NULL) {

+        return FALSE;

+    }

+    m_CurRow = m_SrcClip.top;

+    m_State = 1;

+    return TRUE;

+}

+#define FX_STRECH_PAUSE_ROWS	10

+FX_BOOL CStretchEngine::ContinueStretchHorz(IFX_Pause* pPause)

+{

+    if (!m_DestWidth) {

+        return 0;

+    }

+    if (m_pSource->SkipToScanline(m_CurRow, pPause)) {

+        return TRUE;

+    }

+    int Bpp = m_DestBpp / 8;

+    int rows_to_go = FX_STRECH_PAUSE_ROWS;

+    for (; m_CurRow < m_SrcClip.bottom; m_CurRow ++) {

+        if (rows_to_go == 0) {

+            if (pPause && pPause->NeedToPauseNow()) {

+                return TRUE;

+            } else {

+                rows_to_go = FX_STRECH_PAUSE_ROWS;

+            }

+        }

+        FX_LPCBYTE src_scan = m_pSource->GetScanline(m_CurRow);

+        FX_LPBYTE dest_scan = m_pInterBuf + (m_CurRow - m_SrcClip.top) * m_InterPitch;

+        FX_LPCBYTE src_scan_mask = NULL;

+        FX_LPBYTE dest_scan_mask = NULL;

+        if (m_pExtraAlphaBuf) {

+            src_scan_mask = m_pSource->m_pAlphaMask->GetScanline(m_CurRow);

+            dest_scan_mask = m_pExtraAlphaBuf + (m_CurRow - m_SrcClip.top) * m_ExtraMaskPitch;

+        }

+        switch (m_TransMethod) {

+            case 1:

+            case 2: {

+                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {

+                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);

+                        int dest_a = 0;

+                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {

+                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];

+                            if (src_scan[j / 8] & (1 << (7 - j % 8))) {

+                                dest_a += pixel_weight * 255;

+                            }

+                        }

+                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;

+                        }

+                        *dest_scan++ = (FX_BYTE)(dest_a >> 16);

+                    }

+                    break;

+                }

+            case 3: {

+                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {

+                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);

+                        int dest_a = 0;

+                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {

+                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];

+                            dest_a += pixel_weight * src_scan[j];

+                        }

+                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;

+                        }

+                        *dest_scan++ = (FX_BYTE)(dest_a >> 16);

+                    }

+                    break;

+                }

+            case 4: {

+                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {

+                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);

+                        int dest_a = 0, dest_r = 0;

+                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {

+                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];

+                            pixel_weight = pixel_weight * src_scan_mask[j] / 255;

+                            dest_r += pixel_weight * src_scan[j];

+                            dest_a += pixel_weight;

+                        }

+                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                            dest_r = dest_r < 0 ? 0 : dest_r > 16711680 ? 16711680 : dest_r;

+                            dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;

+                        }

+                        *dest_scan++ = (FX_BYTE)(dest_r >> 16);

+                        *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);

+                    }

+                    break;

+                }

+            case 5: {

+                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {

+                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);

+                        int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;

+                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {

+                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];

+                            unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];

+                            if (m_DestFormat == FXDIB_Rgb) {

+                                dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);

+                                dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);

+                                dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;

+                            } else {

+                                dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);

+                                dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);

+                                dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);

+                            }

+                        }

+                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                            dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;

+                            dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;

+                            dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;

+                        }

+                        *dest_scan++ = (FX_BYTE)(dest_b_c >> 16);

+                        *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);

+                        *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);

+                    }

+                    break;

+                }

+            case 6: {

+                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {

+                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);

+                        int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;

+                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {

+                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];

+                            pixel_weight = pixel_weight * src_scan_mask[j] / 255;

+                            unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];

+                            if (m_DestFormat == FXDIB_Rgba) {

+                                dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);

+                                dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);

+                                dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;

+                            } else {

+                                dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);

+                                dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);

+                                dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);

+                            }

+                            dest_a += pixel_weight;

+                        }

+                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                            dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;

+                            dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;

+                            dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;

+                            dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;

+                            dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;

+                        }

+                        *dest_scan++ = (FX_BYTE)(dest_b_c >> 16);

+                        *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);

+                        *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);

+                        *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);

+                    }

+                    break;

+                }

+            case 7: {

+                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {

+                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);

+                        int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;

+                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {

+                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];

+                            FX_LPCBYTE src_pixel = src_scan + j * Bpp;

+                            dest_b_c += pixel_weight * (*src_pixel++);

+                            dest_g_m += pixel_weight * (*src_pixel++);

+                            dest_r_y += pixel_weight * (*src_pixel);

+                        }

+                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                            dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;

+                            dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;

+                            dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;

+                        }

+                        *dest_scan++ = (FX_BYTE)((dest_b_c) >> 16);

+                        *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);

+                        *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);

+                        dest_scan += Bpp - 3;

+                    }

+                    break;

+                }

+            case 8: {

+                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {

+                        PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);

+                        int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;

+                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {

+                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];

+                            FX_LPCBYTE src_pixel = src_scan + j * Bpp;

+                            if (m_DestFormat == FXDIB_Argb) {

+                                pixel_weight = pixel_weight * src_pixel[3] / 255;

+                            } else {

+                                pixel_weight = pixel_weight * src_scan_mask[j] / 255;

+                            }

+                            dest_b_c += pixel_weight * (*src_pixel++);

+                            dest_g_m += pixel_weight * (*src_pixel++);

+                            dest_r_y += pixel_weight * (*src_pixel);

+                            dest_a += pixel_weight;

+                        }

+                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                            dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;

+                            dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;

+                            dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;

+                            dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;

+                        }

+                        *dest_scan++ = (FX_BYTE)((dest_b_c) >> 16);

+                        *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);

+                        *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);

+                        if (m_DestFormat == FXDIB_Argb) {

+                            *dest_scan = (FX_BYTE)((dest_a * 255) >> 16);

+                        }

+                        if (dest_scan_mask) {

+                            *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);

+                        }

+                        dest_scan += Bpp - 3;

+                    }

+                    break;

+                }

+        }

+        rows_to_go --;

+    }

+    return FALSE;

+}

+void CStretchEngine::StretchVert()

+{

+    if (m_DestHeight == 0) {

+        return;

+    }

+    CWeightTable table;

+    table.Calc(m_DestHeight, m_DestClip.top, m_DestClip.bottom, m_SrcHeight, m_SrcClip.top, m_SrcClip.bottom, m_Flags);

+    if (table.m_pWeightTables == NULL) {

+        return;

+    }

+    int DestBpp = m_DestBpp / 8;

+    for (int row = m_DestClip.top; row < m_DestClip.bottom; row ++) {

+        unsigned char* dest_scan = m_pDestScanline;

+        unsigned char* dest_sacn_mask = m_pDestMaskScanline;

+        PixelWeight* pPixelWeights = table.GetPixelWeight(row);

+        switch(m_TransMethod) {

+            case 1:

+            case 2:

+            case 3: {

+                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {

+                        unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;

+                        int dest_a = 0;

+                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {

+                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];

+                            dest_a += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];

+                        }

+                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;

+                        }

+                        *dest_scan = (FX_BYTE)(dest_a >> 16);

+                        dest_scan += DestBpp;

+                    }

+                    break;

+                }

+            case 4: {

+                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {

+                        unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;

+                        unsigned char* src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);

+                        int dest_a = 0, dest_k = 0;

+                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {

+                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];

+                            dest_k += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];

+                            dest_a += pixel_weight * src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];

+                        }

+                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                            dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;

+                            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;

+                        }

+                        *dest_scan = (FX_BYTE)(dest_k >> 16);

+                        dest_scan += DestBpp;

+                        *dest_sacn_mask++ = (FX_BYTE)(dest_a >> 16);

+                    }

+                    break;

+                }

+            case 5:

+            case 7: {

+                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {

+                        unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;

+                        int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;

+                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {

+                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];

+                            FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;

+                            dest_b_c += pixel_weight * (*src_pixel++);

+                            dest_g_m += pixel_weight * (*src_pixel++);

+                            dest_r_y += pixel_weight * (*src_pixel);

+                        }

+                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                            dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;

+                            dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;

+                            dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;

+                        }

+                        dest_scan[0] = (FX_BYTE)((dest_b_c) >> 16);

+                        dest_scan[1] = (FX_BYTE)((dest_g_m) >> 16);

+                        dest_scan[2] = (FX_BYTE)((dest_r_y) >> 16);

+                        dest_scan += DestBpp;

+                    }

+                    break;

+                }

+            case 6:

+            case 8: {

+                    for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {

+                        unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;

+                        unsigned char* src_scan_mask = NULL;

+                        if (m_DestFormat != FXDIB_Argb) {

+                            src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);

+                        }

+                        int dest_a = 0, dest_k = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;

+                        for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {

+                            int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];

+                            FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;

+                            int mask_v = 255;

+                            if (src_scan_mask) {

+                                mask_v = src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];

+                            }

+                            dest_b_c += pixel_weight * (*src_pixel++);

+                            dest_g_m += pixel_weight * (*src_pixel++);

+                            dest_r_y += pixel_weight * (*src_pixel);

+                            if (m_DestFormat == FXDIB_Argb) {

+                                dest_a += pixel_weight * (*(src_pixel + 1));

+                            } else {

+                                dest_a += pixel_weight * mask_v;

+                            }

+                        }

+                        if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                            dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;

+                            dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;

+                            dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;

+                            dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;

+                        }

+                        if (dest_a) {

+                            int r = ((FX_DWORD)dest_r_y) * 255 / dest_a;

+                            int g = ((FX_DWORD)dest_g_m) * 255 / dest_a;

+                            int b = ((FX_DWORD)dest_b_c) * 255 / dest_a;

+                            dest_scan[0] = b > 255 ? 255 : b < 0 ? 0 : b;

+                            dest_scan[1] = g > 255 ? 255 : g < 0 ? 0 : g;

+                            dest_scan[2] = r > 255 ? 255 : r < 0 ? 0 : r;

+                        }

+                        if (m_DestFormat == FXDIB_Argb) {

+                            dest_scan[3] = (FX_BYTE)((dest_a) >> 16);

+                        } else {

+                            *dest_sacn_mask = (FX_BYTE)((dest_a) >> 16);

+                        }

+                        dest_scan += DestBpp;

+                        if (dest_sacn_mask) {

+                            dest_sacn_mask++;

+                        }

+                    }

+                    break;

+                }

+        }

+        m_pDestBitmap->ComposeScanline(row - m_DestClip.top, m_pDestScanline, m_pDestMaskScanline);

+    }

+}

+CFX_ImageStretcher::CFX_ImageStretcher()

+{

+    m_pScanline = NULL;

+    m_pStretchEngine = NULL;

+    m_pMaskScanline = NULL;

+}

+CFX_ImageStretcher::~CFX_ImageStretcher()

+{

+    if (m_pScanline) {

+        FX_Free(m_pScanline);

+    }

+    if (m_pStretchEngine) {

+        delete m_pStretchEngine;

+    }

+    if (m_pMaskScanline) {

+        FX_Free(m_pMaskScanline);

+    }

+}

+FXDIB_Format _GetStretchedFormat(const CFX_DIBSource* pSrc)

+{

+    FXDIB_Format format = pSrc->GetFormat();

+    if (format == FXDIB_1bppMask) {

+        format = FXDIB_8bppMask;

+    } else if (format == FXDIB_1bppRgb) {

+        format = FXDIB_8bppRgb;

+    } else if (format == FXDIB_8bppRgb) {

+        if (pSrc->GetPalette()) {

+            format = FXDIB_Rgb;

+        }

+    }

+    return format;

+}

+FX_BOOL CFX_ImageStretcher::Start(IFX_ScanlineComposer* pDest,

+                                  const CFX_DIBSource* pSource, int dest_width, int dest_height,

+                                  const FX_RECT& rect, FX_DWORD flags)

+{

+    m_DestFormat = _GetStretchedFormat(pSource);

+    m_DestBPP = m_DestFormat & 0xff;

+    m_pDest = pDest;

+    m_pSource = pSource;

+    m_DestWidth = dest_width;

+    m_DestHeight = dest_height;

+    m_ClipRect = rect;

+    m_Flags = flags;

+    if (pSource->GetFormat() == FXDIB_1bppRgb && pSource->GetPalette()) {

+        FX_ARGB pal[256];

+        int a0, r0, g0, b0, a1, r1, g1, b1;

+        ArgbDecode(pSource->GetPaletteEntry(0), a0, r0, g0, b0);

+        ArgbDecode(pSource->GetPaletteEntry(1), a1, r1, g1, b1);

+        for (int i = 0; i < 256; i ++) {

+            int a = a0 + (a1 - a0) * i / 255;

+            int r = r0 + (r1 - r0) * i / 255;

+            int g = g0 + (g1 - g0) * i / 255;

+            int b = b0 + (b1 - b0) * i / 255;

+            pal[i] = ArgbEncode(a, r, g, b);

+        }

+        if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {

+            return FALSE;

+        }

+    } else if (pSource->GetFormat() == FXDIB_1bppCmyk && pSource->GetPalette()) {

+        FX_CMYK pal[256];

+        int c0, m0, y0, k0, c1, m1, y1, k1;

+        CmykDecode(pSource->GetPaletteEntry(0), c0, m0, y0, k0);

+        CmykDecode(pSource->GetPaletteEntry(1), c1, m1, y1, k1);

+        for (int i = 0; i < 256; i ++) {

+            int c = c0 + (c1 - c0) * i / 255;

+            int m = m0 + (m1 - m0) * i / 255;

+            int y = y0 + (y1 - y0) * i / 255;

+            int k = k0 + (k1 - k0) * i / 255;

+            pal[i] = CmykEncode(c, m, y, k);

+        }

+        if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {

+            return FALSE;

+        }

+    } else if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, NULL)) {

+        return FALSE;

+    }

+    if (flags & FXDIB_DOWNSAMPLE) {

+        return StartQuickStretch();

+    } else {

+        return StartStretch();

+    }

+}

+FX_BOOL CFX_ImageStretcher::Continue(IFX_Pause* pPause)

+{

+    if (m_Flags & FXDIB_DOWNSAMPLE) {

+        return ContinueQuickStretch(pPause);

+    } else {

+        return ContinueStretch(pPause);

+    }

+}

+#ifndef _FPDFAPI_MINI_

+#define MAX_PROGRESSIVE_STRETCH_PIXELS	1000000

+#else

+#define MAX_PROGRESSIVE_STRETCH_PIXELS	100000

+#endif

+FX_BOOL CFX_ImageStretcher::StartStretch()

+{

+    m_pStretchEngine = FX_NEW CStretchEngine(m_pDest, m_DestFormat, m_DestWidth, m_DestHeight, m_ClipRect, m_pSource, m_Flags);

+    if (!m_pStretchEngine) {

+        return FALSE;

+    }

+    m_pStretchEngine->StartStretchHorz();

+    if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {

+        m_pStretchEngine->Continue(NULL);

+        return FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL CFX_ImageStretcher::ContinueStretch(IFX_Pause* pPause)

+{

+    if (m_pStretchEngine == NULL) {

+        return FALSE;

+    }

+    return m_pStretchEngine->Continue(pPause);

+}

+FX_BOOL CFX_ImageStretcher::StartQuickStretch()

+{

+#ifdef _FPDFAPI_MINI_

+    m_pSource->SetDownSampleSize(m_DestWidth, m_DestHeight);

+#endif

+    m_bFlipX = FALSE;

+    m_bFlipY = FALSE;

+    if (m_DestWidth < 0) {

+        m_bFlipX = TRUE;

+        m_DestWidth = -m_DestWidth;

+    }

+    if (m_DestHeight < 0) {

+        m_bFlipY = TRUE;

+        m_DestHeight = -m_DestHeight;

+    }

+    m_LineIndex = 0;

+    FX_DWORD size = m_ClipRect.Width();

+    if (size && m_DestBPP > (int)(INT_MAX / size)) {

+        return FALSE;

+    }

+    size *= m_DestBPP;

+    m_pScanline = FX_Alloc(FX_BYTE, (size / 8 + 3) / 4 * 4);

+    if (!m_pScanline) {

+        return FALSE;

+    }

+    if (m_pSource->m_pAlphaMask) {

+        m_pMaskScanline = FX_Alloc(FX_BYTE, (m_ClipRect.Width() + 3) / 4 * 4);

+        if (!m_pMaskScanline) {

+            return FALSE;

+        }

+    }

+    if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {

+        ContinueQuickStretch(NULL);

+        return FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL CFX_ImageStretcher::ContinueQuickStretch(IFX_Pause* pPause)

+{

+    if (m_pScanline == NULL) {

+        return FALSE;

+    }

+    int result_width = m_ClipRect.Width(), result_height = m_ClipRect.Height();

+    int src_width = m_pSource->GetWidth(), src_height = m_pSource->GetHeight();

+    for (; m_LineIndex < result_height; m_LineIndex ++) {

+        int dest_y, src_y;

+        if (m_bFlipY) {

+            dest_y = result_height - m_LineIndex - 1;

+            src_y = (m_DestHeight - (dest_y + m_ClipRect.top) - 1) * src_height / m_DestHeight;

+        } else {

+            dest_y = m_LineIndex;

+            src_y = (dest_y + m_ClipRect.top) * src_height / m_DestHeight;

+        }

+        if (src_y >= src_height) {

+            src_y = src_height - 1;

+        }

+        if (src_y < 0) {

+            src_y = 0;

+        }

+        if (m_pSource->SkipToScanline(src_y, pPause)) {

+            return TRUE;

+        }

+        m_pSource->DownSampleScanline(src_y, m_pScanline, m_DestBPP, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);

+        FX_LPBYTE scan_extra_alpha = NULL;

+        if (m_pMaskScanline) {

+            m_pSource->m_pAlphaMask->DownSampleScanline(src_y, m_pMaskScanline, 1, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);

+        }

+        m_pDest->ComposeScanline(dest_y, m_pScanline, m_pMaskScanline);

+    }

+    return FALSE;

+}

diff --git a/core/src/fxge/dib/fx_dib_main.cpp b/core/src/fxge/dib/fx_dib_main.cpp
new file mode 100644
index 0000000..0953f2d
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_main.cpp
@@ -0,0 +1,1734 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_dib.h"

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "dib_int.h"

+#include <limits.h>

+FX_BOOL ConvertBuffer(FXDIB_Format dest_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,

+                      const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& pal, void* pIccTransform);

+void CmykDecode(FX_DWORD cmyk, int& c, int& m, int& y, int& k)

+{

+    c = FXSYS_GetCValue(cmyk);

+    m = FXSYS_GetMValue(cmyk);

+    y = FXSYS_GetYValue(cmyk);

+    k = FXSYS_GetKValue(cmyk);

+}

+void ArgbDecode(FX_DWORD argb, int& a, int& r, int& g, int& b)

+{

+    a = FXARGB_A(argb);

+    r = FXARGB_R(argb);

+    g = FXARGB_G(argb);

+    b = FXARGB_B(argb);

+}

+void ArgbDecode(FX_DWORD argb, int& a, FX_COLORREF& rgb)

+{

+    a = FXARGB_A(argb);

+    rgb = FXSYS_RGB(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));

+}

+FX_DWORD ArgbEncode(int a, FX_COLORREF rgb)

+{

+    return FXARGB_MAKE(a, FXSYS_GetRValue(rgb), FXSYS_GetGValue(rgb), FXSYS_GetBValue(rgb));

+}

+CFX_DIBSource::CFX_DIBSource()

+{

+    m_bpp = 0;

+    m_AlphaFlag = 0;

+    m_Width = m_Height = 0;

+    m_Pitch = 0;

+    m_pPalette = NULL;

+    m_pAlphaMask = NULL;

+}

+CFX_DIBSource::~CFX_DIBSource()

+{

+    if (m_pPalette) {

+        FX_Free(m_pPalette);

+    }

+    if (m_pAlphaMask) {

+        delete m_pAlphaMask;

+    }

+}

+CFX_DIBitmap::CFX_DIBitmap()

+{

+    m_bExtBuf = FALSE;

+    m_pBuffer = NULL;

+    m_pPalette = NULL;

+}

+#define _MAX_OOM_LIMIT_	12000000

+FX_BOOL CFX_DIBitmap::Create(int width, int height, FXDIB_Format format, FX_LPBYTE pBuffer, int pitch)

+{

+    m_pBuffer = NULL;

+    m_bpp = (FX_BYTE)format;

+    m_AlphaFlag = (FX_BYTE)(format >> 8);

+    m_Width = m_Height = m_Pitch = 0;

+    if (width <= 0 || height <= 0 || pitch < 0) {

+        return FALSE;

+    }

+    if ((INT_MAX - 31) / width < (format & 0xff)) {

+        return FALSE;

+    }

+    if (!pitch) {

+        pitch = (width * (format & 0xff) + 31) / 32 * 4;

+    }

+    if ((1 << 30) / pitch < height) {

+        return FALSE;

+    }

+    if (pBuffer) {

+        m_pBuffer = pBuffer;

+        m_bExtBuf = TRUE;

+    } else {

+        int size = pitch * height + 4;

+        int oomlimit = _MAX_OOM_LIMIT_;

+        if (oomlimit >= 0 && size >= oomlimit) {

+            m_pBuffer = FX_AllocNL(FX_BYTE, size);

+        } else {

+            m_pBuffer = FX_Alloc(FX_BYTE, size);

+        }

+        if (m_pBuffer == NULL) {

+            return FALSE;

+        }

+        FXSYS_memset32(m_pBuffer, 0, sizeof (FX_BYTE) * size);

+    }

+    m_Width = width;

+    m_Height = height;

+    m_Pitch = pitch;

+    if (HasAlpha() && format != FXDIB_Argb) {

+        FX_BOOL ret = TRUE;

+        ret = BuildAlphaMask();

+        if (!ret) {

+            if (!m_bExtBuf && m_pBuffer) {

+                FX_Free(m_pBuffer);

+                m_pBuffer = NULL;

+                m_Width = m_Height = m_Pitch = 0;

+                return FALSE;

+            }

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CFX_DIBitmap::Copy(const CFX_DIBSource* pSrc)

+{

+    if (m_pBuffer) {

+        return FALSE;

+    }

+    if (!Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat())) {

+        return FALSE;

+    }

+    CopyPalette(pSrc->GetPalette());

+    CopyAlphaMask(pSrc->m_pAlphaMask);

+    for (int row = 0; row < pSrc->GetHeight(); row ++) {

+        FXSYS_memcpy32(m_pBuffer + row * m_Pitch, pSrc->GetScanline(row), m_Pitch);

+    }

+    return TRUE;

+}

+CFX_DIBitmap::~CFX_DIBitmap()

+{

+    if (m_pBuffer && !m_bExtBuf) {

+        FX_Free(m_pBuffer);

+    }

+    m_pBuffer = NULL;

+}

+void CFX_DIBitmap::TakeOver(CFX_DIBitmap* pSrcBitmap)

+{

+    if (m_pBuffer && !m_bExtBuf) {

+        FX_Free(m_pBuffer);

+    }

+    if (m_pPalette) {

+        FX_Free(m_pPalette);

+    }

+    if (m_pAlphaMask) {

+        delete m_pAlphaMask;

+    }

+    m_pBuffer = pSrcBitmap->m_pBuffer;

+    m_pPalette = pSrcBitmap->m_pPalette;

+    m_pAlphaMask = pSrcBitmap->m_pAlphaMask;

+    pSrcBitmap->m_pBuffer = NULL;

+    pSrcBitmap->m_pPalette = NULL;

+    pSrcBitmap->m_pAlphaMask = NULL;

+    m_bpp = pSrcBitmap->m_bpp;

+    m_bExtBuf = pSrcBitmap->m_bExtBuf;

+    m_AlphaFlag = pSrcBitmap->m_AlphaFlag;

+    m_Width = pSrcBitmap->m_Width;

+    m_Height = pSrcBitmap->m_Height;

+    m_Pitch = pSrcBitmap->m_Pitch;

+}

+CFX_DIBitmap* CFX_DIBSource::Clone(const FX_RECT* pClip) const

+{

+    FX_RECT rect(0, 0, m_Width, m_Height);

+    if (pClip) {

+        rect.Intersect(*pClip);

+        if (rect.IsEmpty()) {

+            return NULL;

+        }

+    }

+    CFX_DIBitmap* pNewBitmap = FX_NEW CFX_DIBitmap;

+    if (!pNewBitmap) {

+        return NULL;

+    }

+    if (!pNewBitmap->Create(rect.Width(), rect.Height(), GetFormat())) {

+        delete pNewBitmap;

+        return NULL;

+    }

+    pNewBitmap->CopyPalette(m_pPalette);

+    pNewBitmap->CopyAlphaMask(m_pAlphaMask, pClip);

+    if (GetBPP() == 1 && rect.left % 8 != 0) {

+        int left_shift = rect.left % 32;

+        int right_shift = 32 - left_shift;

+        int dword_count = pNewBitmap->m_Pitch / 4;

+        for (int row = rect.top; row < rect.bottom; row ++) {

+            FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + rect.left / 32;

+            FX_DWORD* dest_scan = (FX_DWORD*)pNewBitmap->GetScanline(row - rect.top);

+            for (int i = 0; i < dword_count; i ++) {

+                dest_scan[i] = (src_scan[i] << left_shift) | (src_scan[i + 1] >> right_shift);

+            }

+        }

+    } else {

+        int copy_len = (pNewBitmap->GetWidth() * pNewBitmap->GetBPP() + 7) / 8;

+        if (m_Pitch < (FX_DWORD)copy_len) {

+            copy_len = m_Pitch;

+        }

+        for (int row = rect.top; row < rect.bottom; row ++) {

+            FX_LPCBYTE src_scan = GetScanline(row) + rect.left * m_bpp / 8;

+            FX_LPBYTE dest_scan = (FX_LPBYTE)pNewBitmap->GetScanline(row - rect.top);

+            FXSYS_memcpy32(dest_scan, src_scan, copy_len);

+        }

+    }

+    return pNewBitmap;

+}

+void CFX_DIBSource::BuildPalette()

+{

+    if (m_pPalette) {

+        return;

+    }

+    if (GetBPP() == 1) {

+        m_pPalette = FX_Alloc(FX_DWORD, 2);

+        if (!m_pPalette) {

+            return;

+        }

+        if(IsCmykImage()) {

+            m_pPalette[0] = 0xff;

+            m_pPalette[1] = 0;

+        } else {

+            m_pPalette[0] = 0xff000000;

+            m_pPalette[1] = 0xffffffff;

+        }

+    } else if (GetBPP() == 8) {

+        m_pPalette = FX_Alloc(FX_DWORD, 256);

+        if (!m_pPalette) {

+            return;

+        }

+        if(IsCmykImage()) {

+            for (int i = 0; i < 256; i ++) {

+                m_pPalette[i] = 0xff - i;

+            }

+        } else {

+            for (int i = 0; i < 256; i ++) {

+                m_pPalette[i] = 0xff000000 | (i * 0x10101);

+            }

+        }

+    }

+}

+FX_BOOL CFX_DIBSource::BuildAlphaMask()

+{

+    if (m_pAlphaMask) {

+        return TRUE;

+    }

+    m_pAlphaMask = FX_NEW CFX_DIBitmap;

+    if (!m_pAlphaMask) {

+        return FALSE;

+    }

+    if (!m_pAlphaMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {

+        delete m_pAlphaMask;

+        m_pAlphaMask = NULL;

+        return FALSE;

+    }

+    FXSYS_memset8(m_pAlphaMask->GetBuffer(), 0xff, m_pAlphaMask->GetHeight()*m_pAlphaMask->GetPitch());

+    return TRUE;

+}

+FX_DWORD CFX_DIBSource::GetPaletteEntry(int index) const

+{

+    ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());

+    if (m_pPalette) {

+        return m_pPalette[index];

+    }

+    if (IsCmykImage()) {

+        if (GetBPP() == 1) {

+            return index ? 0 : 0xff;

+        }

+        return 0xff - index;

+    }

+    if (GetBPP() == 1) {

+        return index ? 0xffffffff : 0xff000000;

+    }

+    return index * 0x10101 | 0xff000000;

+}

+void CFX_DIBSource::SetPaletteEntry(int index, FX_DWORD color)

+{

+    ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());

+    if (m_pPalette == NULL) {

+        BuildPalette();

+    }

+    m_pPalette[index] = color;

+}

+int CFX_DIBSource::FindPalette(FX_DWORD color) const

+{

+    ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());

+    if (m_pPalette == NULL) {

+        if (IsCmykImage()) {

+            if (GetBPP() == 1) {

+                return ((FX_BYTE)color == 0xff) ? 0 : 1;

+            }

+            return 0xff - (FX_BYTE)color;

+        }

+        if (GetBPP() == 1) {

+            return ((FX_BYTE)color == 0xff) ? 1 : 0;

+        }

+        return (FX_BYTE)color;

+    }

+    int palsize = (1 << GetBPP());

+    for (int i = 0; i < palsize; i ++)

+        if (m_pPalette[i] == color) {

+            return i;

+        }

+    return -1;

+}

+void CFX_DIBitmap::Clear(FX_DWORD color)

+{

+    if (m_pBuffer == NULL) {

+        return;

+    }

+    switch (GetFormat()) {

+        case FXDIB_1bppMask:

+            FXSYS_memset8(m_pBuffer, (color & 0xff000000) ? 0xff : 0, m_Pitch * m_Height);

+            break;

+        case FXDIB_1bppRgb: {

+                int index = FindPalette(color);

+                FXSYS_memset8(m_pBuffer, index ? 0xff : 0, m_Pitch * m_Height);

+                break;

+            }

+        case FXDIB_8bppMask:

+            FXSYS_memset8(m_pBuffer, color >> 24, m_Pitch * m_Height);

+            break;

+        case FXDIB_8bppRgb: {

+                int index = FindPalette(color);

+                FXSYS_memset8(m_pBuffer, index, m_Pitch * m_Height);

+                break;

+            }

+        case FXDIB_Rgb:

+        case FXDIB_Rgba: {

+                int a, r, g, b;

+                ArgbDecode(color, a, r, g, b);

+                if (r == g && g == b) {

+                    FXSYS_memset8(m_pBuffer, r, m_Pitch * m_Height);

+                } else {

+                    int byte_pos = 0;

+                    for (int col = 0; col < m_Width; col ++) {

+                        m_pBuffer[byte_pos++] = b;

+                        m_pBuffer[byte_pos++] = g;

+                        m_pBuffer[byte_pos++] = r;

+                    }

+                    for (int row = 1; row < m_Height; row ++) {

+                        FXSYS_memcpy32(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch);

+                    }

+                }

+                break;

+            }

+        case FXDIB_Rgb32:

+        case FXDIB_Argb: {

+                color = IsCmykImage() ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);

+                for (int i = 0; i < m_Width; i ++) {

+                    ((FX_DWORD*)m_pBuffer)[i] = color;

+                }

+                for (int row = 1; row < m_Height; row ++) {

+                    FXSYS_memcpy32(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch);

+                }

+                break;

+            }

+        default:

+            break;

+    }

+}

+void CFX_DIBSource::GetOverlapRect(int& dest_left, int& dest_top, int& width, int& height,

+                                   int src_width, int src_height, int& src_left, int& src_top,

+                                   const CFX_ClipRgn* pClipRgn)

+{

+    if (width == 0 || height == 0) {

+        return;

+    }

+    ASSERT(width > 0 && height > 0);

+    if (dest_left > m_Width || dest_top > m_Height) {

+        width = 0;

+        height = 0;

+        return;

+    }

+    int x_offset = dest_left - src_left;

+    int y_offset = dest_top - src_top;

+    FX_RECT src_rect(src_left, src_top, src_left + width, src_top + height);

+    FX_RECT src_bound(0, 0, src_width, src_height);

+    src_rect.Intersect(src_bound);

+    FX_RECT dest_rect(src_rect.left + x_offset, src_rect.top + y_offset,

+                      src_rect.right + x_offset, src_rect.bottom + y_offset);

+    FX_RECT dest_bound(0, 0, m_Width, m_Height);

+    dest_rect.Intersect(dest_bound);

+    if (pClipRgn) {

+        dest_rect.Intersect(pClipRgn->GetBox());

+    }

+    dest_left = dest_rect.left;

+    dest_top = dest_rect.top;

+    src_left = dest_left - x_offset;

+    src_top = dest_top - y_offset;

+    width = dest_rect.right - dest_rect.left;

+    height = dest_rect.bottom - dest_rect.top;

+}

+FX_BOOL CFX_DIBitmap::TransferBitmap(int dest_left, int dest_top, int width, int height,

+                                     const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)

+{

+    if (m_pBuffer == NULL) {

+        return FALSE;

+    }

+    GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), src_left, src_top, NULL);

+    if (width == 0 || height == 0) {

+        return TRUE;

+    }

+    FXDIB_Format dest_format = GetFormat();

+    FXDIB_Format src_format = pSrcBitmap->GetFormat();

+    if (dest_format == src_format && pIccTransform == NULL) {

+        if (GetBPP() == 1) {

+            for (int row = 0; row < height; row ++) {

+                FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch;

+                FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);

+                for (int col = 0; col < width; col ++) {

+                    if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {

+                        dest_scan[(dest_left + col) / 8] |= 1 << (7 - (dest_left + col) % 8);

+                    } else {

+                        dest_scan[(dest_left + col) / 8] &= ~(1 << (7 - (dest_left + col) % 8));

+                    }

+                }

+            }

+        } else {

+            int Bpp = GetBPP() / 8;

+            for (int row = 0; row < height; row ++) {

+                FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;

+                FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;

+                FXSYS_memcpy32(dest_scan, src_scan, width * Bpp);

+            }

+        }

+    } else {

+        if (m_pPalette) {

+            return FALSE;

+        }

+        if (m_bpp == 8) {

+            dest_format = FXDIB_8bppMask;

+        }

+        FX_LPBYTE dest_buf = m_pBuffer + dest_top * m_Pitch + dest_left * GetBPP() / 8;

+        FX_DWORD* d_plt = NULL;

+        if(!ConvertBuffer(dest_format, dest_buf, m_Pitch, width, height, pSrcBitmap, src_left, src_top, d_plt, pIccTransform)) {

+            return FALSE;

+        }

+    }

+    return TRUE;

+}

+#ifndef _FPDFAPI_MINI_

+FX_BOOL CFX_DIBitmap::TransferMask(int dest_left, int dest_top, int width, int height,

+                                   const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, int alpha_flag, void* pIccTransform)

+{

+    if (m_pBuffer == NULL) {

+        return FALSE;

+    }

+    ASSERT(HasAlpha() && (m_bpp >= 24));

+    ASSERT(pMask->IsAlphaMask());

+    if (!HasAlpha() || !pMask->IsAlphaMask() || m_bpp < 24) {

+        return FALSE;

+    }

+    GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, NULL);

+    if (width == 0 || height == 0) {

+        return TRUE;

+    }

+    int src_pitch = pMask->GetPitch();

+    int src_bpp = pMask->GetBPP();

+    int alpha;

+    FX_DWORD dst_color;

+    if (alpha_flag >> 8) {

+        alpha = alpha_flag & 0xff;

+        dst_color = FXCMYK_TODIB(color);

+    } else {

+        alpha = FXARGB_A(color);

+        dst_color = FXARGB_TODIB(color);

+    }

+    FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;

+    if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);

+    } else {

+        if (alpha_flag >> 8 && !IsCmykImage())

+            AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),

+                               color_p[2], color_p[1], color_p[0]);

+        else if (!(alpha_flag >> 8) && IsCmykImage()) {

+            return FALSE;

+        }

+    }

+    if(!IsCmykImage()) {

+        color_p[3] = (FX_BYTE)alpha;

+    }

+    if (GetFormat() == FXDIB_Argb) {

+        for (int row = 0; row < height; row ++) {

+            FX_DWORD* dest_pos = (FX_DWORD*)(m_pBuffer + (dest_top + row) * m_Pitch + dest_left * 4);

+            FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);

+            if (src_bpp == 1) {

+                for (int col = 0; col < width; col ++) {

+                    int src_bitpos = src_left + col;

+                    if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) {

+                        *dest_pos = dst_color;

+                    } else {

+                        *dest_pos = 0;

+                    }

+                    dest_pos ++;

+                }

+            } else {

+                src_scan += src_left;

+                dst_color = FXARGB_TODIB(dst_color);

+                dst_color &= 0xffffff;

+                for (int col = 0; col < width; col ++) {

+                    FXARGB_SETDIB(dest_pos++, dst_color | ((alpha * (*src_scan++) / 255) << 24));

+                }

+            }

+        }

+    } else {

+        int comps = m_bpp / 8;

+        for (int row = 0; row < height; row ++) {

+            FX_LPBYTE dest_color_pos = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * comps;

+            FX_LPBYTE dest_alpha_pos = (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left;

+            FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);

+            if (src_bpp == 1) {

+                for (int col = 0; col < width; col ++) {

+                    int src_bitpos = src_left + col;

+                    if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) {

+                        FXSYS_memcpy32(dest_color_pos, color_p, comps);

+                        *dest_alpha_pos = 0xff;

+                    } else {

+                        FXSYS_memset32(dest_color_pos, 0, comps);

+                        *dest_alpha_pos = 0;

+                    }

+                    dest_color_pos += comps;

+                    dest_alpha_pos ++;

+                }

+            } else {

+                src_scan += src_left;

+                for (int col = 0; col < width; col ++) {

+                    FXSYS_memcpy32(dest_color_pos, color_p, comps);

+                    dest_color_pos += comps;

+                    *dest_alpha_pos++ = (alpha * (*src_scan++) / 255);

+                }

+            }

+        }

+    }

+    return TRUE;

+}

+#endif

+void CFX_DIBSource::CopyPalette(const FX_DWORD* pSrc, FX_DWORD size)

+{

+    if (pSrc == NULL || GetBPP() > 8) {

+        if (m_pPalette) {

+            FX_Free(m_pPalette);

+        }

+        m_pPalette = NULL;

+    } else {

+        FX_DWORD pal_size = 1 << GetBPP();

+        if (m_pPalette == NULL) {

+            m_pPalette = FX_Alloc(FX_DWORD, pal_size);

+        }

+        if (!m_pPalette) {

+            return;

+        }

+        if (pal_size > size) {

+            pal_size = size;

+        }

+        FXSYS_memcpy32(m_pPalette, pSrc, pal_size * sizeof(FX_DWORD));

+    }

+}

+void CFX_DIBSource::GetPalette(FX_DWORD* pal, int alpha) const

+{

+    ASSERT(GetBPP() <= 8 && !IsCmykImage());

+    if (GetBPP() == 1) {

+        pal[0] = ((m_pPalette ? m_pPalette[0] : 0xff000000) & 0xffffff) | (alpha << 24);

+        pal[1] = ((m_pPalette ? m_pPalette[1] : 0xffffffff) & 0xffffff) | (alpha << 24);

+        return;

+    }

+    if (m_pPalette) {

+        for (int i = 0; i < 256; i ++) {

+            pal[i] = (m_pPalette[i] & 0x00ffffff) | (alpha << 24);

+        }

+    } else {

+        for (int i = 0; i < 256; i ++) {

+            pal[i] = (i * 0x10101) | (alpha << 24);

+        }

+    }

+}

+CFX_DIBitmap* CFX_DIBSource::GetAlphaMask(const FX_RECT* pClip) const

+{

+    ASSERT(GetFormat() == FXDIB_Argb);

+    FX_RECT rect(0, 0, m_Width, m_Height);

+    if (pClip) {

+        rect.Intersect(*pClip);

+        if (rect.IsEmpty()) {

+            return NULL;

+        }

+    }

+    CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;

+    if (!pMask) {

+        return NULL;

+    }

+    if (!pMask->Create(rect.Width(), rect.Height(), FXDIB_8bppMask)) {

+        delete pMask;

+        return NULL;

+    }

+    for (int row = rect.top; row < rect.bottom; row ++) {

+        FX_LPCBYTE src_scan = GetScanline(row) + rect.left * 4 + 3;

+        FX_LPBYTE dest_scan = (FX_LPBYTE)pMask->GetScanline(row - rect.top);

+        for (int col = rect.left; col < rect.right; col ++) {

+            *dest_scan ++ = *src_scan;

+            src_scan += 4;

+        }

+    }

+    return pMask;

+}

+FX_BOOL CFX_DIBSource::CopyAlphaMask(const CFX_DIBSource* pAlphaMask, const FX_RECT* pClip)

+{

+    if (!HasAlpha() || GetFormat() == FXDIB_Argb) {

+        return FALSE;

+    }

+    if (pAlphaMask) {

+        FX_RECT rect(0, 0, pAlphaMask->m_Width, pAlphaMask->m_Height);

+        if (pClip) {

+            rect.Intersect(*pClip);

+            if (rect.IsEmpty() || rect.Width() != m_Width || rect.Height() != m_Height) {

+                return FALSE;

+            }

+        } else {

+            if (pAlphaMask->m_Width != m_Width || pAlphaMask->m_Height != m_Height) {

+                return FALSE;

+            }

+        }

+        for (int row = 0; row < m_Height; row ++)

+            FXSYS_memcpy32((void*)m_pAlphaMask->GetScanline(row),

+                           pAlphaMask->GetScanline(row + rect.top) + rect.left, m_pAlphaMask->m_Pitch);

+    } else {

+        m_pAlphaMask->Clear(0xff000000);

+    }

+    return TRUE;

+}

+const int g_ChannelOffset[] = {0, 2, 1, 0, 0, 1, 2, 3, 3};

+FX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, const CFX_DIBSource* pSrcBitmap, FXDIB_Channel srcChannel)

+{

+    if (m_pBuffer == NULL) {

+        return FALSE;

+    }

+    CFX_DIBSource* pSrcClone = (CFX_DIBSource*)pSrcBitmap;

+    CFX_DIBitmap* pDst = this;

+    int destOffset, srcOffset;

+    if (srcChannel == FXDIB_Alpha) {

+        if (!pSrcBitmap->HasAlpha() && !pSrcBitmap->IsAlphaMask()) {

+            return FALSE;

+        }

+        if (pSrcBitmap->GetBPP() == 1) {

+            pSrcClone = pSrcBitmap->CloneConvert(FXDIB_8bppMask);

+            if (pSrcClone == NULL) {

+                return FALSE;

+            }

+        }

+        if(pSrcBitmap->GetFormat() == FXDIB_Argb) {

+            srcOffset = 3;

+        } else {

+            srcOffset = 0;

+        }

+    } else {

+        if (pSrcBitmap->IsAlphaMask()) {

+            return FALSE;

+        }

+        if (pSrcBitmap->GetBPP() < 24) {

+            if (pSrcBitmap->IsCmykImage()) {

+                pSrcClone = pSrcBitmap->CloneConvert((FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x20));

+            } else {

+                pSrcClone = pSrcBitmap->CloneConvert((FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x18));

+            }

+            if (pSrcClone == NULL) {

+                return FALSE;

+            }

+        }

+        srcOffset = g_ChannelOffset[srcChannel];

+    }

+    if (destChannel == FXDIB_Alpha) {

+        if (IsAlphaMask()) {

+            if(!ConvertFormat(FXDIB_8bppMask)) {

+                if (pSrcClone != pSrcBitmap) {

+                    delete pSrcClone;

+                }

+                return FALSE;

+            }

+            destOffset = 0;

+        } else {

+            destOffset = 0;

+            if(!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {

+                if (pSrcClone != pSrcBitmap) {

+                    delete pSrcClone;

+                }

+                return FALSE;

+            }

+            if (GetFormat() == FXDIB_Argb) {

+                destOffset = 3;

+            }

+        }

+    } else {

+        if (IsAlphaMask()) {

+            if (pSrcClone != pSrcBitmap) {

+                delete pSrcClone;

+            }

+            return FALSE;

+        }

+        if (GetBPP() < 24) {

+            if (HasAlpha()) {

+                if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {

+                    if (pSrcClone != pSrcBitmap) {

+                        delete pSrcClone;

+                    }

+                    return FALSE;

+                }

+            } else

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+                if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) {

+#else

+                if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) {

+#endif

+                    if (pSrcClone != pSrcBitmap) {

+                        delete pSrcClone;

+                    }

+                    return FALSE;

+                }

+        }

+        destOffset = g_ChannelOffset[destChannel];

+    }

+    if (srcChannel == FXDIB_Alpha && pSrcClone->m_pAlphaMask) {

+        CFX_DIBitmap* pAlphaMask = pSrcClone->m_pAlphaMask;

+        if (pSrcClone->GetWidth() != m_Width || pSrcClone->GetHeight() != m_Height) {

+            if (pAlphaMask) {

+                pAlphaMask = pAlphaMask->StretchTo(m_Width, m_Height);

+                if (pAlphaMask == NULL) {

+                    if (pSrcClone != pSrcBitmap) {

+                        delete pSrcClone;

+                    }

+                    return FALSE;

+                }

+            }

+        }

+        if (pSrcClone != pSrcBitmap) {

+            pSrcClone->m_pAlphaMask = NULL;

+            delete pSrcClone;

+        }

+        pSrcClone = pAlphaMask;

+        srcOffset = 0;

+    } else if (pSrcClone->GetWidth() != m_Width || pSrcClone->GetHeight() != m_Height) {

+        CFX_DIBitmap* pSrcMatched = pSrcClone->StretchTo(m_Width, m_Height);

+        if (pSrcClone != pSrcBitmap) {

+            delete pSrcClone;

+        }

+        if (pSrcMatched == NULL) {

+            return FALSE;

+        }

+        pSrcClone = pSrcMatched;

+    }

+    if (destChannel == FXDIB_Alpha && m_pAlphaMask) {

+        pDst = m_pAlphaMask;

+        destOffset = 0;

+    }

+    int srcBytes = pSrcClone->GetBPP() / 8;

+    int destBytes = pDst->GetBPP() / 8;

+    for (int row = 0; row < m_Height; row ++) {

+        FX_LPBYTE dest_pos = (FX_LPBYTE)pDst->GetScanline(row) + destOffset;

+        FX_LPCBYTE src_pos = pSrcClone->GetScanline(row) + srcOffset;

+        for (int col = 0; col < m_Width; col ++) {

+            *dest_pos = *src_pos;

+            dest_pos += destBytes;

+            src_pos += srcBytes;

+        }

+    }

+    if (pSrcClone != pSrcBitmap && pSrcClone != pSrcBitmap->m_pAlphaMask) {

+        delete pSrcClone;

+    }

+    return TRUE;

+}

+FX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, int value)

+{

+    if (m_pBuffer == NULL) {

+        return FALSE;

+    }

+    int destOffset;

+    if (destChannel == FXDIB_Alpha) {

+        if (IsAlphaMask()) {

+            if(!ConvertFormat(FXDIB_8bppMask)) {

+                return FALSE;

+            }

+            destOffset = 0;

+        } else {

+            destOffset = 0;

+            if(!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {

+                return FALSE;

+            }

+            if (GetFormat() == FXDIB_Argb) {

+                destOffset = 3;

+            }

+        }

+    } else {

+        if (IsAlphaMask()) {

+            return FALSE;

+        }

+        if (GetBPP() < 24) {

+            if (HasAlpha()) {

+                if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {

+                    return FALSE;

+                }

+            } else

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+                if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) {

+                    return FALSE;

+                }

+#else

+                if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) {

+                    return FALSE;

+                }

+#endif

+        }

+        destOffset = g_ChannelOffset[destChannel];

+    }

+    int Bpp = GetBPP() / 8;

+    if (Bpp == 1) {

+        FXSYS_memset8(m_pBuffer, value, m_Height * m_Pitch);

+        return TRUE;

+    }

+    if (destChannel == FXDIB_Alpha && m_pAlphaMask) {

+        FXSYS_memset8(m_pAlphaMask->GetBuffer(), value, m_pAlphaMask->GetHeight()*m_pAlphaMask->GetPitch());

+        return TRUE;

+    }

+    for (int row = 0; row < m_Height; row ++) {

+        FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch + destOffset;

+        for (int col = 0; col < m_Width; col ++) {

+            *scan_line = value;

+            scan_line += Bpp;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CFX_DIBitmap::MultiplyAlpha(const CFX_DIBSource* pSrcBitmap)

+{

+    if (m_pBuffer == NULL) {

+        return FALSE;

+    }

+    ASSERT(pSrcBitmap->IsAlphaMask());

+    if (!pSrcBitmap->IsAlphaMask()) {

+        return FALSE;

+    }

+    if (!IsAlphaMask() && !HasAlpha()) {

+        return LoadChannel(FXDIB_Alpha, pSrcBitmap, FXDIB_Alpha);

+    }

+    CFX_DIBitmap* pSrcClone = (CFX_DIBitmap*)pSrcBitmap;

+    if (pSrcBitmap->GetWidth() != m_Width || pSrcBitmap->GetHeight() != m_Height) {

+        pSrcClone = pSrcBitmap->StretchTo(m_Width, m_Height);

+        ASSERT(pSrcClone != NULL);

+        if (pSrcClone == NULL) {

+            return FALSE;

+        }

+    }

+    if (IsAlphaMask()) {

+        if(!ConvertFormat(FXDIB_8bppMask)) {

+            if (pSrcClone != pSrcBitmap) {

+                delete pSrcClone;

+            }

+            return FALSE;

+        }

+        for (int row = 0; row < m_Height; row ++) {

+            FX_LPBYTE dest_scan = m_pBuffer + m_Pitch * row;

+            FX_LPBYTE src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row;

+            if (pSrcClone->GetBPP() == 1) {

+                for (int col = 0; col < m_Width; col ++) {

+                    if (!((1 << (7 - col % 8)) & src_scan[col / 8])) {

+                        dest_scan[col] = 0;

+                    }

+                }

+            } else {

+                for (int col = 0; col < m_Width; col ++) {

+                    *dest_scan = (*dest_scan) * src_scan[col] / 255;

+                    dest_scan ++;

+                }

+            }

+        }

+    } else {

+        if(GetFormat() == FXDIB_Argb) {

+            if (pSrcClone->GetBPP() == 1) {

+                if (pSrcClone != pSrcBitmap) {

+                    delete pSrcClone;

+                }

+                return FALSE;

+            }

+            for (int row = 0; row < m_Height; row ++) {

+                FX_LPBYTE dest_scan = m_pBuffer + m_Pitch * row + 3;

+                FX_LPBYTE src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row;

+                for (int col = 0; col < m_Width; col ++) {

+                    *dest_scan = (*dest_scan) * src_scan[col] / 255;

+                    dest_scan += 4;

+                }

+            }

+        } else {

+            m_pAlphaMask->MultiplyAlpha(pSrcClone);

+        }

+    }

+    if (pSrcClone != pSrcBitmap) {

+        delete pSrcClone;

+    }

+    return TRUE;

+}

+FX_BOOL CFX_DIBitmap::GetGrayData(void* pIccTransform)

+{

+    if (m_pBuffer == NULL) {

+        return FALSE;

+    }

+    switch (GetFormat()) {

+        case FXDIB_1bppRgb: {

+                if (m_pPalette == NULL) {

+                    return FALSE;

+                }

+                FX_BYTE gray[2];

+                for (int i = 0; i < 2; i ++) {

+                    int r = (FX_BYTE)(m_pPalette[i] >> 16);

+                    int g = (FX_BYTE)(m_pPalette[i] >> 8);

+                    int b = (FX_BYTE)m_pPalette[i];

+                    gray[i] = (FX_BYTE)FXRGB2GRAY(r, g, b);

+                }

+                CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;

+                if (!pMask) {

+                    return FALSE;

+                }

+                if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {

+                    delete pMask;

+                    return FALSE;

+                }

+                FXSYS_memset8(pMask->GetBuffer(), gray[0], pMask->GetPitch() * m_Height);

+                for (int row = 0; row < m_Height; row ++) {

+                    FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;

+                    FX_LPBYTE dest_pos = (FX_LPBYTE)pMask->GetScanline(row);

+                    for (int col = 0; col < m_Width; col ++) {

+                        if (src_pos[col / 8] & (1 << (7 - col % 8))) {

+                            *dest_pos = gray[1];

+                        }

+                        dest_pos ++;

+                    }

+                }

+                TakeOver(pMask);

+                delete pMask;

+                break;

+            }

+        case FXDIB_8bppRgb: {

+                if (m_pPalette == NULL) {

+                    return FALSE;

+                }

+                FX_BYTE gray[256];

+                for (int i = 0; i < 256; i ++) {

+                    int r = (FX_BYTE)(m_pPalette[i] >> 16);

+                    int g = (FX_BYTE)(m_pPalette[i] >> 8);

+                    int b = (FX_BYTE)m_pPalette[i];

+                    gray[i] = (FX_BYTE)FXRGB2GRAY(r, g, b);

+                }

+                CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;

+                if (!pMask) {

+                    return FALSE;

+                }

+                if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {

+                    delete pMask;

+                    return FALSE;

+                }

+                for (int row = 0; row < m_Height; row ++) {

+                    FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();

+                    FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;

+                    for (int col = 0; col < m_Width; col ++) {

+                        *dest_pos ++ = gray[*src_pos ++];

+                    }

+                }

+                TakeOver(pMask);

+                delete pMask;

+                break;

+            }

+        case FXDIB_Rgb: {

+                CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;

+                if (!pMask) {

+                    return FALSE;

+                }

+                if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {

+                    delete pMask;

+                    return FALSE;

+                }

+                for (int row = 0; row < m_Height; row ++) {

+                    FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;

+                    FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();

+                    for (int col = 0; col < m_Width; col ++) {

+                        *dest_pos ++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos);

+                        src_pos += 3;

+                    }

+                }

+                TakeOver(pMask);

+                delete pMask;

+                break;

+            }

+        case FXDIB_Rgb32: {

+                CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;

+                if (!pMask) {

+                    return FALSE;

+                }

+                if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {

+                    delete pMask;

+                    return FALSE;

+                }

+                for (int row = 0; row < m_Height; row ++) {

+                    FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;

+                    FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();

+                    for (int col = 0; col < m_Width; col ++) {

+                        *dest_pos ++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos);

+                        src_pos += 4;

+                    }

+                }

+                TakeOver(pMask);

+                delete pMask;

+                break;

+            }

+        default:

+            return FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL CFX_DIBitmap::MultiplyAlpha(int alpha)

+{

+    if (m_pBuffer == NULL) {

+        return FALSE;

+    }

+    switch (GetFormat()) {

+        case FXDIB_1bppMask:

+            if (!ConvertFormat(FXDIB_8bppMask)) {

+                return FALSE;

+            }

+            MultiplyAlpha(alpha);

+            break;

+        case FXDIB_8bppMask: {

+                for (int row = 0; row < m_Height; row ++) {

+                    FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch;

+                    for (int col = 0; col < m_Width; col ++) {

+                        scan_line[col] = scan_line[col] * alpha / 255;

+                    }

+                }

+                break;

+            }

+        case FXDIB_Argb: {

+                for (int row = 0; row < m_Height; row ++) {

+                    FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch + 3;

+                    for (int col = 0; col < m_Width; col ++) {

+                        *scan_line = (*scan_line) * alpha / 255;

+                        scan_line += 4;

+                    }

+                }

+                break;

+            }

+        default:

+            if (HasAlpha()) {

+                m_pAlphaMask->MultiplyAlpha(alpha);

+            } else if (IsCmykImage()) {

+                if (!ConvertFormat((FXDIB_Format)(GetFormat() | 0x0200))) {

+                    return FALSE;

+                }

+                m_pAlphaMask->MultiplyAlpha(alpha);

+            } else {

+                if (!ConvertFormat(FXDIB_Argb)) {

+                    return FALSE;

+                }

+                MultiplyAlpha(alpha);

+            }

+            break;

+    }

+    return TRUE;

+}

+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)

+FX_DWORD CFX_DIBitmap::GetPixel(int x, int y) const

+{

+    if (m_pBuffer == NULL) {

+        return 0;

+    }

+    FX_LPBYTE pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8;

+    switch (GetFormat()) {

+        case FXDIB_1bppMask: {

+                if ((*pos) & (1 << (7 - x % 8))) {

+                    return 0xff000000;

+                }

+                return 0;

+            }

+        case FXDIB_1bppRgb: {

+                if ((*pos) & (1 << (7 - x % 8))) {

+                    return m_pPalette ? m_pPalette[1] : 0xffffffff;

+                } else {

+                    return m_pPalette ? m_pPalette[0] : 0xff000000;

+                }

+                break;

+            }

+        case FXDIB_8bppMask:

+            return (*pos) << 24;

+        case FXDIB_8bppRgb:

+            return m_pPalette ? m_pPalette[*pos] : (0xff000000 | ((*pos) * 0x10101));

+        case FXDIB_Rgb:

+        case FXDIB_Rgba:

+        case FXDIB_Rgb32:

+            return FXARGB_GETDIB(pos) | 0xff000000;

+        case FXDIB_Argb:

+            return FXARGB_GETDIB(pos);

+        default:

+            break;

+    }

+    return 0;

+}

+#endif

+void CFX_DIBitmap::SetPixel(int x, int y, FX_DWORD color)

+{

+    if (m_pBuffer == NULL) {

+        return;

+    }

+    if (x < 0 || x >= m_Width || y < 0 || y >= m_Height) {

+        return;

+    }

+    FX_LPBYTE pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8;

+    switch (GetFormat()) {

+        case FXDIB_1bppMask:

+            if (color >> 24) {

+                *pos |= 1 << (7 - x % 8);

+            } else {

+                *pos &= ~(1 << (7 - x % 8));

+            }

+            break;

+        case FXDIB_1bppRgb:

+            if (m_pPalette) {

+                if (color == m_pPalette[1]) {

+                    *pos |= 1 << (7 - x % 8);

+                } else {

+                    *pos &= ~(1 << (7 - x % 8));

+                }

+            } else {

+                if (color == 0xffffffff) {

+                    *pos |= 1 << (7 - x % 8);

+                } else {

+                    *pos &= ~(1 << (7 - x % 8));

+                }

+            }

+            break;

+        case FXDIB_8bppMask:

+            *pos = (FX_BYTE)(color >> 24);

+            break;

+        case FXDIB_8bppRgb: {

+                if (m_pPalette) {

+                    for (int i = 0; i < 256; i ++) {

+                        if (m_pPalette[i] == color) {

+                            *pos = (FX_BYTE)i;

+                            return;

+                        }

+                    }

+                    *pos = 0;

+                } else {

+                    *pos = FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color));

+                }

+                break;

+            }

+        case FXDIB_Rgb:

+        case FXDIB_Rgb32: {

+                int alpha = FXARGB_A(color);

+                pos[0] = (FXARGB_B(color) * alpha + pos[0] * (255 - alpha)) / 255;

+                pos[1] = (FXARGB_G(color) * alpha + pos[1] * (255 - alpha)) / 255;

+                pos[2] = (FXARGB_R(color) * alpha + pos[2] * (255 - alpha)) / 255;

+                break;

+            }

+        case FXDIB_Rgba: {

+                pos[0] = FXARGB_B(color);

+                pos[1] = FXARGB_G(color);

+                pos[2] = FXARGB_R(color);

+                break;

+            }

+        case FXDIB_Argb:

+            FXARGB_SETDIB(pos, color);

+            break;

+        default:

+            break;

+    }

+}

+void CFX_DIBitmap::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,

+                                      int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const

+{

+    if (m_pBuffer == NULL) {

+        return;

+    }

+    int src_Bpp = m_bpp / 8;

+    FX_LPBYTE scanline = m_pBuffer + line * m_Pitch;

+    if (src_Bpp == 0) {

+        for (int i = 0; i < clip_width; i ++) {

+            FX_DWORD dest_x = clip_left + i;

+            FX_DWORD src_x = dest_x * m_Width / dest_width;

+            if (bFlipX) {

+                src_x = m_Width - src_x - 1;

+            }

+#ifdef FOXIT_CHROME_BUILD

+            src_x %= m_Width;

+#endif

+            dest_scan[i] = (scanline[src_x / 8] & (1 << (7 - src_x % 8))) ? 255 : 0;

+        }

+    } else if (src_Bpp == 1) {

+        for (int i = 0; i < clip_width; i ++) {

+            FX_DWORD dest_x = clip_left + i;

+            FX_DWORD src_x = dest_x * m_Width / dest_width;

+            if (bFlipX) {

+                src_x = m_Width - src_x - 1;

+            }

+#ifdef FOXIT_CHROME_BUILD

+            src_x %= m_Width;

+#endif

+            int dest_pos = i;

+            if (m_pPalette) {

+                if (!IsCmykImage()) {

+                    dest_pos *= 3;

+                    FX_ARGB argb = m_pPalette[scanline[src_x]];

+                    dest_scan[dest_pos] = FXARGB_B(argb);

+                    dest_scan[dest_pos + 1] = FXARGB_G(argb);

+                    dest_scan[dest_pos + 2] = FXARGB_R(argb);

+                } else {

+                    dest_pos *= 4;

+                    FX_CMYK cmyk = m_pPalette[scanline[src_x]];

+                    dest_scan[dest_pos] = FXSYS_GetCValue(cmyk);

+                    dest_scan[dest_pos + 1] = FXSYS_GetMValue(cmyk);

+                    dest_scan[dest_pos + 2] = FXSYS_GetYValue(cmyk);

+                    dest_scan[dest_pos + 3] = FXSYS_GetKValue(cmyk);

+                }

+            } else {

+                dest_scan[dest_pos] = scanline[src_x];

+            }

+        }

+    } else {

+        for (int i = 0; i < clip_width; i ++) {

+            FX_DWORD dest_x = clip_left + i;

+            FX_DWORD src_x = bFlipX ? (m_Width - dest_x * m_Width / dest_width - 1) * src_Bpp : (dest_x * m_Width / dest_width) * src_Bpp;

+#ifdef FOXIT_CHROME_BUILD

+            src_x %= m_Width * src_Bpp;

+#endif

+            int dest_pos = i * src_Bpp;

+            for (int b = 0; b < src_Bpp; b ++) {

+                dest_scan[dest_pos + b] = scanline[src_x + b];

+            }

+        }

+    }

+}

+FX_BOOL CFX_DIBitmap::ConvertColorScale(FX_DWORD forecolor, FX_DWORD backcolor)

+{

+    ASSERT(!IsAlphaMask());

+    if (m_pBuffer == NULL || IsAlphaMask()) {

+        return FALSE;

+    }

+    int fc, fm, fy, fk, bc, bm, by, bk;

+    int fr, fg, fb, br, bg, bb;

+    FX_BOOL isCmykImage = IsCmykImage();

+    if (isCmykImage) {

+        fc = FXSYS_GetCValue(forecolor);

+        fm = FXSYS_GetMValue(forecolor);

+        fy = FXSYS_GetYValue(forecolor);

+        fk = FXSYS_GetKValue(forecolor);

+        bc = FXSYS_GetCValue(backcolor);

+        bm = FXSYS_GetMValue(backcolor);

+        by = FXSYS_GetYValue(backcolor);

+        bk = FXSYS_GetKValue(backcolor);

+    } else {

+        fr = FXSYS_GetRValue(forecolor);

+        fg = FXSYS_GetGValue(forecolor);

+        fb = FXSYS_GetBValue(forecolor);

+        br = FXSYS_GetRValue(backcolor);

+        bg = FXSYS_GetGValue(backcolor);

+        bb = FXSYS_GetBValue(backcolor);

+    }

+    if (m_bpp <= 8) {

+        if (isCmykImage) {

+            if (forecolor == 0xff && backcolor == 0 && m_pPalette == NULL) {

+                return TRUE;

+            }

+        } else if (forecolor == 0 && backcolor == 0xffffff && m_pPalette == NULL) {

+            return TRUE;

+        }

+        if (m_pPalette == NULL) {

+            BuildPalette();

+        }

+        int size = 1 << m_bpp;

+        if (isCmykImage) {

+            for (int i = 0; i < size; i ++) {

+                FX_BYTE b, g, r;

+                AdobeCMYK_to_sRGB1(FXSYS_GetCValue(m_pPalette[i]), FXSYS_GetMValue(m_pPalette[i]), FXSYS_GetYValue(m_pPalette[i]), FXSYS_GetKValue(m_pPalette[i]),

+                                   r, g, b);

+                int gray = 255 - FXRGB2GRAY(r, g, b);

+                m_pPalette[i] = CmykEncode(bc + (fc - bc) * gray / 255, bm + (fm - bm) * gray / 255,

+                                           by + (fy - by) * gray / 255, bk + (fk - bk) * gray / 255);

+            }

+        } else

+            for (int i = 0; i < size; i ++) {

+                int gray = FXRGB2GRAY(FXARGB_R(m_pPalette[i]), FXARGB_G(m_pPalette[i]), FXARGB_B(m_pPalette[i]));

+                m_pPalette[i] = FXARGB_MAKE(0xff, br + (fr - br) * gray / 255, bg + (fg - bg) * gray / 255,

+                                            bb + (fb - bb) * gray / 255);

+            }

+        return TRUE;

+    }

+    if (isCmykImage) {

+        if (forecolor == 0xff && backcolor == 0x00) {

+            for (int row = 0; row < m_Height; row ++) {

+                FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;

+                for (int col = 0; col < m_Width; col ++) {

+                    FX_BYTE b, g, r;

+                    AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3],

+                                       r, g, b);

+                    *scanline ++ = 0;

+                    *scanline ++ = 0;

+                    *scanline ++ = 0;

+                    *scanline ++ = 255 - FXRGB2GRAY(r, g, b);

+                }

+            }

+            return TRUE;

+        }

+    } else if (forecolor == 0 && backcolor == 0xffffff) {

+        for (int row = 0; row < m_Height; row ++) {

+            FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;

+            int gap = m_bpp / 8 - 2;

+            for (int col = 0; col < m_Width; col ++) {

+                int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);

+                *scanline ++ = gray;

+                *scanline ++ = gray;

+                *scanline    = gray;

+                scanline += gap;

+            }

+        }

+        return TRUE;

+    }

+    if (isCmykImage) {

+        for (int row = 0; row < m_Height; row ++) {

+            FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;

+            for (int col = 0; col < m_Width; col ++) {

+                FX_BYTE b, g, r;

+                AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3],

+                                   r, g, b);

+                int gray = 255 - FXRGB2GRAY(r, g, b);

+                *scanline ++ = bc + (fc - bc) * gray / 255;

+                *scanline ++ = bm + (fm - bm) * gray / 255;

+                *scanline ++ = by + (fy - by) * gray / 255;

+                *scanline ++ = bk + (fk - bk) * gray / 255;

+            }

+        }

+    } else

+        for (int row = 0; row < m_Height; row ++) {

+            FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;

+            int gap = m_bpp / 8 - 2;

+            for (int col = 0; col < m_Width; col ++) {

+                int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);

+                *scanline ++ = bb + (fb - bb) * gray / 255;

+                *scanline ++ = bg + (fg - bg) * gray / 255;

+                *scanline    = br + (fr - br) * gray / 255;

+                scanline += gap;

+            }

+        }

+    return TRUE;

+}

+FX_BOOL CFX_DIBitmap::DitherFS(const FX_DWORD* pPalette, int pal_size, const FX_RECT* pRect)

+{

+    if (m_pBuffer == NULL) {

+        return FALSE;

+    }

+    if (m_bpp != 8 && m_pPalette != NULL && m_AlphaFlag != 0) {

+        return FALSE;

+    }

+    if (m_Width < 4 && m_Height < 4) {

+        return FALSE;

+    }

+    FX_RECT rect(0, 0, m_Width, m_Height);

+    if (pRect) {

+        rect.Intersect(*pRect);

+    }

+    FX_BYTE translate[256];

+    for (int i = 0; i < 256; i ++) {

+        int err2 = 65536;

+        for (int j = 0; j < pal_size; j ++) {

+            FX_BYTE entry = (FX_BYTE)pPalette[j];

+            int err = (int)entry - i;

+            if (err * err < err2) {

+                err2 = err * err;

+                translate[i] = entry;

+            }

+        }

+    }

+    for (int row = rect.top; row < rect.bottom; row ++) {

+        FX_LPBYTE scan = m_pBuffer + row * m_Pitch;

+        FX_LPBYTE next_scan = m_pBuffer + (row + 1) * m_Pitch;

+        for (int col = rect.left; col < rect.right; col ++) {

+            int src_pixel = scan[col];

+            int dest_pixel = translate[src_pixel];

+            scan[col] = (FX_BYTE)dest_pixel;

+            int error = -dest_pixel + src_pixel;

+            if (col < rect.right - 1) {

+                int src = scan[col + 1];

+                src += error * 7 / 16;

+                if (src > 255) {

+                    scan[col + 1] = 255;

+                } else if (src < 0) {

+                    scan[col + 1] = 0;

+                } else {

+                    scan[col + 1] = src;

+                }

+            }

+            if (col < rect.right - 1 && row < rect.bottom - 1) {

+                int src = next_scan[col + 1];

+                src += error * 1 / 16;

+                if (src > 255) {

+                    next_scan[col + 1] = 255;

+                } else if (src < 0) {

+                    next_scan[col + 1] = 0;

+                } else {

+                    next_scan[col + 1] = src;

+                }

+            }

+            if (row < rect.bottom - 1) {

+                int src = next_scan[col];

+                src += error * 5 / 16;

+                if (src > 255) {

+                    next_scan[col] = 255;

+                } else if (src < 0) {

+                    next_scan[col] = 0;

+                } else {

+                    next_scan[col] = src;

+                }

+            }

+            if (col > rect.left && row < rect.bottom - 1) {

+                int src = next_scan[col - 1];

+                src += error * 3 / 16;

+                if (src > 255) {

+                    next_scan[col - 1] = 255;

+                } else if (src < 0) {

+                    next_scan[col - 1] = 0;

+                } else {

+                    next_scan[col - 1] = src;

+                }

+            }

+        }

+    }

+    return TRUE;

+}

+CFX_DIBitmap* CFX_DIBSource::FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const

+{

+    CFX_DIBitmap* pFlipped = FX_NEW CFX_DIBitmap;

+    if (!pFlipped) {

+        return NULL;

+    }

+    if (!pFlipped->Create(m_Width, m_Height, GetFormat())) {

+        delete pFlipped;

+        return NULL;

+    }

+    pFlipped->CopyPalette(m_pPalette);

+    FX_LPBYTE pDestBuffer = pFlipped->GetBuffer();

+    int Bpp = m_bpp / 8;

+    for (int row = 0; row < m_Height; row ++) {

+        FX_LPCBYTE src_scan = GetScanline(row);

+        FX_LPBYTE dest_scan = pDestBuffer + m_Pitch * (bYFlip ? (m_Height - row - 1) : row);

+        if (!bXFlip) {

+            FXSYS_memcpy32(dest_scan, src_scan, m_Pitch);

+            continue;

+        }

+        if (m_bpp == 1) {

+            FXSYS_memset32(dest_scan, 0, m_Pitch);

+            for (int col = 0; col < m_Width; col ++)

+                if (src_scan[col / 8] & (1 << (7 - col % 8))) {

+                    int dest_col = m_Width - col - 1;

+                    dest_scan[dest_col / 8] |= (1 << (7 - dest_col % 8));

+                }

+        } else {

+            dest_scan += (m_Width - 1) * Bpp;

+            if (Bpp == 1) {

+                for (int col = 0; col < m_Width; col ++) {

+                    *dest_scan = *src_scan;

+                    dest_scan --;

+                    src_scan ++;

+                }

+            } else if (Bpp == 3) {

+                for (int col = 0; col < m_Width; col ++) {

+                    dest_scan[0] = src_scan[0];

+                    dest_scan[1] = src_scan[1];

+                    dest_scan[2] = src_scan[2];

+                    dest_scan -= 3;

+                    src_scan += 3;

+                }

+            } else {

+                ASSERT(Bpp == 4);

+                for (int col = 0; col < m_Width; col ++) {

+                    *(FX_DWORD*)dest_scan = *(FX_DWORD*)src_scan;

+                    dest_scan -= 4;

+                    src_scan += 4;

+                }

+            }

+        }

+    }

+    if (m_pAlphaMask) {

+        pDestBuffer = pFlipped->m_pAlphaMask->GetBuffer();

+        FX_DWORD dest_pitch = pFlipped->m_pAlphaMask->GetPitch();

+        for (int row = 0; row < m_Height; row ++) {

+            FX_LPCBYTE src_scan = m_pAlphaMask->GetScanline(row);

+            FX_LPBYTE dest_scan = pDestBuffer + dest_pitch * (bYFlip ? (m_Height - row - 1) : row);

+            if (!bXFlip) {

+                FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);

+                continue;

+            }

+            dest_scan += (m_Width - 1);

+            for (int col = 0; col < m_Width; col ++) {

+                *dest_scan = *src_scan;

+                dest_scan --;

+                src_scan ++;

+            }

+        }

+    }

+    return pFlipped;

+}

+CFX_DIBExtractor::CFX_DIBExtractor(const CFX_DIBSource* pSrc)

+{

+    m_pBitmap = NULL;

+    if (pSrc->GetBuffer() == NULL) {

+        m_pBitmap = pSrc->Clone();

+    } else {

+        m_pBitmap = FX_NEW CFX_DIBitmap;

+        if (!m_pBitmap) {

+            return;

+        }

+        if (!m_pBitmap->Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat(), pSrc->GetBuffer())) {

+            delete m_pBitmap;

+            m_pBitmap = NULL;

+            return;

+        }

+        m_pBitmap->CopyPalette(pSrc->GetPalette());

+        m_pBitmap->CopyAlphaMask(pSrc->m_pAlphaMask);

+    }

+}

+CFX_DIBExtractor::~CFX_DIBExtractor()

+{

+    if (m_pBitmap) {

+        delete m_pBitmap;

+    }

+}

+CFX_FilteredDIB::CFX_FilteredDIB()

+{

+    m_pScanline = NULL;

+    m_pSrc = NULL;

+}

+CFX_FilteredDIB::~CFX_FilteredDIB()

+{

+    if (m_pSrc && m_bAutoDropSrc) {

+        delete m_pSrc;

+    }

+    if (m_pScanline) {

+        FX_Free(m_pScanline);

+    }

+}

+void CFX_FilteredDIB::LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc)

+{

+    m_pSrc = pSrc;

+    m_bAutoDropSrc = bAutoDropSrc;

+    m_Width = pSrc->GetWidth();

+    m_Height = pSrc->GetHeight();

+    FXDIB_Format format = GetDestFormat();

+    m_bpp = (FX_BYTE)format;

+    m_AlphaFlag = (FX_BYTE)(format >> 8);

+    m_Pitch = (m_Width * (format & 0xff) + 31) / 32 * 4;

+    m_pPalette = GetDestPalette();

+    m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);

+}

+FX_LPCBYTE CFX_FilteredDIB::GetScanline(int line) const

+{

+    TranslateScanline(m_pScanline, m_pSrc->GetScanline(line));

+    return m_pScanline;

+}

+void CFX_FilteredDIB::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,

+        int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const

+{

+    m_pSrc->DownSampleScanline(line, dest_scan, dest_bpp, dest_width, bFlipX, clip_left, clip_width);

+    TranslateDownSamples(dest_scan, dest_scan, clip_width, dest_bpp);

+}

+CFX_ImageRenderer::CFX_ImageRenderer()

+{

+    m_Status = 0;

+    m_pTransformer = NULL;

+    m_bRgbByteOrder = FALSE;

+    m_BlendType = FXDIB_BLEND_NORMAL;

+}

+CFX_ImageRenderer::~CFX_ImageRenderer()

+{

+    if (m_pTransformer) {

+        delete m_pTransformer;

+    }

+}

+extern FX_RECT _FXDIB_SwapClipBox(FX_RECT& clip, int width, int height, FX_BOOL bFlipX, FX_BOOL bFlipY);

+FX_BOOL CFX_ImageRenderer::Start(CFX_DIBitmap* pDevice, const CFX_ClipRgn* pClipRgn,

+                                 const CFX_DIBSource* pSource, int bitmap_alpha,

+                                 FX_DWORD mask_color, const CFX_AffineMatrix* pMatrix,

+                                 FX_DWORD dib_flags, FX_BOOL bRgbByteOrder,

+                                 int alpha_flag, void* pIccTransform, int blend_type)

+{

+    m_Matrix = *pMatrix;

+    CFX_FloatRect image_rect_f = m_Matrix.GetUnitRect();

+    FX_RECT image_rect = image_rect_f.GetOutterRect();

+    m_ClipBox = pClipRgn ? pClipRgn->GetBox() : FX_RECT(0, 0, pDevice->GetWidth(), pDevice->GetHeight());

+    m_ClipBox.Intersect(image_rect);

+    if (m_ClipBox.IsEmpty()) {

+        return FALSE;

+    }

+    m_pDevice = pDevice;

+    m_pClipRgn = pClipRgn;

+    m_MaskColor = mask_color;

+    m_BitmapAlpha = bitmap_alpha;

+    m_Matrix = *pMatrix;

+    m_Flags = dib_flags;

+    m_AlphaFlag = alpha_flag;

+    m_pIccTransform = pIccTransform;

+    m_bRgbByteOrder = bRgbByteOrder;

+    m_BlendType = blend_type;

+    FX_BOOL ret = TRUE;

+    if ((FXSYS_fabs(m_Matrix.b) >= 0.5f || m_Matrix.a == 0) ||

+            (FXSYS_fabs(m_Matrix.c) >= 0.5f || m_Matrix.d == 0) ) {

+        if (FXSYS_fabs(m_Matrix.a) < FXSYS_fabs(m_Matrix.b) / 20 && FXSYS_fabs(m_Matrix.d) < FXSYS_fabs(m_Matrix.c) / 20 &&

+                FXSYS_fabs(m_Matrix.a) < 0.5f && FXSYS_fabs(m_Matrix.d) < 0.5f) {

+            int dest_width = image_rect.Width();

+            int dest_height = image_rect.Height();

+            FX_RECT bitmap_clip = m_ClipBox;

+            bitmap_clip.Offset(-image_rect.left, -image_rect.top);

+            bitmap_clip = _FXDIB_SwapClipBox(bitmap_clip, dest_width, dest_height, m_Matrix.c > 0, m_Matrix.b < 0);

+            m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color, m_ClipBox, TRUE,

+                               m_Matrix.c > 0, m_Matrix.b < 0, m_bRgbByteOrder, alpha_flag, pIccTransform, m_BlendType);

+            if (!m_Stretcher.Start(&m_Composer, pSource, dest_height, dest_width, bitmap_clip, dib_flags)) {

+                return FALSE;

+            }

+            m_Status = 1;

+            return TRUE;

+        }

+        m_Status = 2;

+        m_pTransformer = FX_NEW CFX_ImageTransformer;

+        if (!m_pTransformer) {

+            return FALSE;

+        }

+        m_pTransformer->Start(pSource, &m_Matrix, dib_flags, &m_ClipBox);

+        return TRUE;

+    }

+    int dest_width = image_rect.Width();

+    if (m_Matrix.a < 0) {

+        dest_width = -dest_width;

+    }

+    int dest_height = image_rect.Height();

+    if (m_Matrix.d > 0) {

+        dest_height = -dest_height;

+    }

+    if (dest_width == 0 || dest_height == 0) {

+        return FALSE;

+    }

+    FX_RECT bitmap_clip = m_ClipBox;

+    bitmap_clip.Offset(-image_rect.left, -image_rect.top);

+    m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color,

+                       m_ClipBox, FALSE, FALSE, FALSE, m_bRgbByteOrder, alpha_flag, pIccTransform, m_BlendType);

+    m_Status = 1;

+    ret = m_Stretcher.Start(&m_Composer, pSource, dest_width, dest_height, bitmap_clip, dib_flags);

+    return ret;

+}

+FX_BOOL CFX_ImageRenderer::Continue(IFX_Pause* pPause)

+{

+    if (m_Status == 1) {

+        return m_Stretcher.Continue(pPause);

+    } else if (m_Status == 2) {

+        if (m_pTransformer->Continue(pPause)) {

+            return TRUE;

+        }

+        CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();

+        if (pBitmap == NULL) {

+            return FALSE;

+        }

+        if (pBitmap->GetBuffer() == NULL) {

+            delete pBitmap;

+            return FALSE;

+        }

+        if (pBitmap->IsAlphaMask()) {

+            if (m_BitmapAlpha != 255) {

+                if (m_AlphaFlag >> 8) {

+                    m_AlphaFlag = (((FX_BYTE)((m_AlphaFlag & 0xff) * m_BitmapAlpha / 255)) | ((m_AlphaFlag >> 8) << 8));

+                } else {

+                    m_MaskColor = FXARGB_MUL_ALPHA(m_MaskColor, m_BitmapAlpha);

+                }

+            }

+            m_pDevice->CompositeMask(m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,

+                                     pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, m_MaskColor,

+                                     0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform);

+        } else {

+            if (m_BitmapAlpha != 255) {

+                pBitmap->MultiplyAlpha(m_BitmapAlpha);

+            }

+            m_pDevice->CompositeBitmap(m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,

+                                       pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, 0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_pIccTransform);

+        }

+        delete pBitmap;

+        return FALSE;

+    }

+    return FALSE;

+}

+CFX_BitmapStorer::CFX_BitmapStorer()

+{

+    m_pBitmap = NULL;

+}

+CFX_BitmapStorer::~CFX_BitmapStorer()

+{

+    if (m_pBitmap) {

+        delete m_pBitmap;

+    }

+}

+CFX_DIBitmap* CFX_BitmapStorer::Detach()

+{

+    CFX_DIBitmap* pBitmap = m_pBitmap;

+    m_pBitmap = NULL;

+    return pBitmap;

+}

+void CFX_BitmapStorer::Replace(CFX_DIBitmap* pBitmap)

+{

+    if (m_pBitmap) {

+        delete m_pBitmap;

+    }

+    m_pBitmap = pBitmap;

+}

+void CFX_BitmapStorer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)

+{

+    FX_LPBYTE dest_buf = (FX_LPBYTE)m_pBitmap->GetScanline(line);

+    FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?

+                               (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line) : NULL;

+    if (dest_buf) {

+        FXSYS_memcpy32(dest_buf, scanline, m_pBitmap->GetPitch());

+    }

+    if (dest_alpha_buf) {

+        FXSYS_memcpy32(dest_alpha_buf, scan_extra_alpha, m_pBitmap->m_pAlphaMask->GetPitch());

+    }

+}

+FX_BOOL CFX_BitmapStorer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)

+{

+    m_pBitmap = FX_NEW CFX_DIBitmap;

+    if (!m_pBitmap) {

+        return FALSE;

+    }

+    if (!m_pBitmap->Create(width, height, src_format)) {

+        delete m_pBitmap;

+        m_pBitmap = NULL;

+        return FALSE;

+    }

+    if (pSrcPalette) {

+        m_pBitmap->CopyPalette(pSrcPalette);

+    }

+    return TRUE;

+}

diff --git a/core/src/fxge/dib/fx_dib_transform.cpp b/core/src/fxge/dib/fx_dib_transform.cpp
new file mode 100644
index 0000000..4d83005
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_transform.cpp
@@ -0,0 +1,797 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_dib.h"

+#include "dib_int.h"

+int SDP_Table[513] = {

+    256, 256, 256, 256, 256, 256, 256, 256, 256, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254,

+    253, 253, 253, 252, 252, 252, 251, 251, 251, 250, 250, 249, 249, 249, 248, 248, 247, 247, 246,

+    246, 245, 244, 244, 243, 243, 242, 242, 241, 240, 240, 239, 238, 238, 237, 236, 236, 235, 234,

+    233, 233, 232, 231, 230, 230, 229, 228, 227, 226, 226, 225, 224, 223, 222, 221, 220, 219, 218,

+    218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200,

+    199, 198, 196, 195, 194, 193, 192, 191, 190, 189, 188, 186, 185, 184, 183, 182, 181, 179, 178,

+    177, 176, 175, 173, 172, 171, 170, 169, 167, 166, 165, 164, 162, 161, 160, 159, 157, 156, 155,

+    154, 152, 151, 150, 149, 147, 146, 145, 143, 142, 141, 140, 138, 137, 136, 134, 133, 132, 130,

+    129, 128, 126, 125, 124, 122, 121, 120, 119, 117, 116, 115, 113, 112, 111, 109, 108, 107, 105,

+    104, 103, 101, 100, 99, 97, 96, 95, 93, 92, 91, 89, 88, 87, 85, 84, 83, 81, 80, 79, 77, 76, 75,

+    73, 72, 71, 69, 68, 67, 66, 64, 63, 62, 60, 59, 58, 57, 55, 54, 53, 52, 50, 49, 48, 47, 45, 44,

+    43, 42, 40, 39, 38, 37, 36, 34, 33, 32, 31, 30, 28, 27, 26, 25, 24, 23, 21, 20, 19, 18, 17, 16,

+    15, 14, 13, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, -1, -2, -3, -4, -5, -6, -7, -7, -8, -9, -10,

+    -11, -12, -12, -13, -14, -15, -15, -16, -17, -17, -18, -19, -19, -20, -21, -21, -22, -22, -23, -24,

+    -24, -25, -25, -26, -26, -27, -27, -27, -28, -28, -29, -29, -30, -30, -30, -31, -31, -31, -32, -32,

+    -32, -33, -33, -33, -33, -34, -34, -34, -34, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36,

+    -36, -36, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37,

+    -37, -37, -37, -37, -36, -36, -36, -36, -36, -36, -36, -36, -36, -35, -35, -35, -35, -35, -35, -34,

+    -34, -34, -34, -34, -33, -33, -33, -33, -33, -32, -32, -32, -32, -31, -31, -31, -31, -30, -30, -30,

+    -30, -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -27, -26, -26, -26, -25, -25, -25, -24, -24,

+    -24, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18,

+    -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11,

+    -11, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5, -4,

+    -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+};

+class CFX_BilinearMatrix : public CPDF_FixedMatrix

+{

+public:

+    CFX_BilinearMatrix(const CFX_AffineMatrix& src, int bits): CPDF_FixedMatrix(src, bits)

+    {}

+    inline void	Transform(int x, int y, int& x1, int& y1, int&res_x, int&res_y)

+    {

+        x1 = a * x + c * y + e + base / 2;

+        y1 = b * x + d * y + f + base / 2;

+        res_x = x1 % base;

+        res_y = y1 % base;

+        if (res_x < 0 && res_x > -base) {

+            res_x = base + res_x;

+        }

+        if (res_y < 0 && res_x > -base) {

+            res_y = base + res_y;

+        }

+        x1 /= base;

+        y1 /= base;

+    }

+};

+CFX_DIBitmap* CFX_DIBSource::SwapXY(FX_BOOL bXFlip, FX_BOOL bYFlip, const FX_RECT* pDestClip) const

+{

+    FX_RECT dest_clip(0, 0, m_Height, m_Width);

+    if (pDestClip) {

+        dest_clip.Intersect(*pDestClip);

+    }

+    if (dest_clip.IsEmpty()) {

+        return NULL;

+    }

+    CFX_DIBitmap* pTransBitmap = FX_NEW CFX_DIBitmap;

+    if (!pTransBitmap) {

+        return NULL;

+    }

+    int result_height = dest_clip.Height(), result_width = dest_clip.Width();

+    if (!pTransBitmap->Create(result_width, result_height, GetFormat())) {

+        delete pTransBitmap;

+        return NULL;

+    }

+    pTransBitmap->CopyPalette(m_pPalette);

+    int src_pitch = m_Pitch;

+    int dest_pitch = pTransBitmap->GetPitch();

+    FX_LPBYTE dest_buf = pTransBitmap->GetBuffer();

+    int row_start = bXFlip ? m_Height - dest_clip.right : dest_clip.left;

+    int row_end = bXFlip ? m_Height - dest_clip.left : dest_clip.right;

+    int col_start = bYFlip ? m_Width - dest_clip.bottom : dest_clip.top;

+    int col_end = bYFlip ? m_Width - dest_clip.top : dest_clip.bottom;

+    if (GetBPP() == 1) {

+        FXSYS_memset8(dest_buf, 0xff, dest_pitch * result_height);

+        for (int row = row_start; row < row_end; row ++) {

+            FX_LPCBYTE src_scan = GetScanline(row);

+            int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;

+            FX_LPBYTE dest_scan = dest_buf;

+            if (bYFlip) {

+                dest_scan += (result_height - 1) * dest_pitch;

+            }

+            int dest_step = bYFlip ? -dest_pitch : dest_pitch;

+            for (int col = col_start; col < col_end; col ++) {

+                if (!(src_scan[col / 8] & (1 << (7 - col % 8)))) {

+                    dest_scan[dest_col / 8] &= ~(1 << (7 - dest_col % 8));

+                }

+                dest_scan += dest_step;

+            }

+        }

+    } else {

+        int nBytes = GetBPP() / 8;

+        int dest_step = bYFlip ? -dest_pitch : dest_pitch;

+        if (nBytes == 3) {

+            dest_step -= 2;

+        }

+        for (int row = row_start; row < row_end; row ++) {

+            int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;

+            FX_LPBYTE dest_scan = dest_buf + dest_col * nBytes;

+            if (bYFlip) {

+                dest_scan += (result_height - 1) * dest_pitch;

+            }

+            if (nBytes == 4) {

+                FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + col_start;

+                for (int col = col_start; col < col_end; col ++) {

+                    *(FX_DWORD*)dest_scan = *src_scan++;

+                    dest_scan += dest_step;

+                }

+            } else {

+                FX_LPCBYTE src_scan = GetScanline(row) + col_start * nBytes;

+                if (nBytes == 1)

+                    for (int col = col_start; col < col_end; col ++) {

+                        *dest_scan = *src_scan++;

+                        dest_scan += dest_step;

+                    }

+                else

+                    for (int col = col_start; col < col_end; col ++) {

+                        *dest_scan++ = *src_scan++;

+                        *dest_scan++ = *src_scan++;

+                        *dest_scan = *src_scan++;

+                        dest_scan += dest_step;

+                    }

+            }

+        }

+    }

+    if (m_pAlphaMask) {

+        src_pitch = m_pAlphaMask->m_Pitch;

+        dest_pitch = pTransBitmap->m_pAlphaMask->GetPitch();

+        dest_buf = pTransBitmap->m_pAlphaMask->GetBuffer();

+        int dest_step = bYFlip ? -dest_pitch : dest_pitch;

+        for (int row = row_start; row < row_end; row ++) {

+            int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;

+            FX_LPBYTE dest_scan = dest_buf + dest_col;

+            if (bYFlip) {

+                dest_scan += (result_height - 1) * dest_pitch;

+            }

+            FX_LPCBYTE src_scan = m_pAlphaMask->GetScanline(row) + col_start;

+            for (int col = col_start; col < col_end; col ++) {

+                *dest_scan = *src_scan++;

+                dest_scan += dest_step;

+            }

+        }

+    }

+    return pTransBitmap;

+}

+#define FIX16_005 0.05f

+FX_RECT _FXDIB_SwapClipBox(FX_RECT& clip, int width, int height, FX_BOOL bFlipX, FX_BOOL bFlipY)

+{

+    FX_RECT rect;

+    if (bFlipY) {

+        rect.left = height - clip.top;

+        rect.right = height - clip.bottom;

+    } else {

+        rect.left = clip.top;

+        rect.right = clip.bottom;

+    }

+    if (bFlipX) {

+        rect.top = width - clip.left;

+        rect.bottom = width - clip.right;

+    } else {

+        rect.top = clip.left;

+        rect.bottom = clip.right;

+    }

+    rect.Normalize();

+    return rect;

+}

+CFX_DIBitmap* CFX_DIBSource::TransformTo(const CFX_AffineMatrix* pDestMatrix, int& result_left, int& result_top,

+        FX_DWORD flags, const FX_RECT* pDestClip) const

+{

+    CFX_ImageTransformer transformer;

+    transformer.Start(this, pDestMatrix, flags, pDestClip);

+    transformer.Continue(NULL);

+    result_left = transformer.m_ResultLeft;

+    result_top = transformer.m_ResultTop;

+    CFX_DIBitmap* pTransformed = transformer.m_Storer.Detach();

+    return pTransformed;

+}

+CFX_DIBitmap* CFX_DIBSource::StretchTo(int dest_width, int dest_height, FX_DWORD flags, const FX_RECT* pClip) const

+{

+    FX_RECT clip_rect(0, 0, FXSYS_abs(dest_width), FXSYS_abs(dest_height));

+    if (pClip) {

+        clip_rect.Intersect(*pClip);

+    }

+    if (clip_rect.IsEmpty()) {

+        return NULL;

+    }

+    if (dest_width == m_Width && dest_height == m_Height) {

+        return Clone(&clip_rect);

+    }

+    CFX_ImageStretcher stretcher;

+    CFX_BitmapStorer storer;

+    if (stretcher.Start(&storer, this, dest_width, dest_height, clip_rect, flags)) {

+        stretcher.Continue(NULL);

+    }

+    return storer.Detach();

+}

+CFX_ImageTransformer::CFX_ImageTransformer()

+{

+    m_Status = 0;

+    m_pMatrix = NULL;

+}

+CFX_ImageTransformer::~CFX_ImageTransformer()

+{

+}

+FX_BOOL CFX_ImageTransformer::Start(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix, int flags, const FX_RECT* pDestClip)

+{

+    m_pMatrix = (CFX_AffineMatrix*)pDestMatrix;

+    CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();

+    FX_RECT result_rect = unit_rect.GetClosestRect();

+    FX_RECT result_clip = result_rect;

+    if (pDestClip) {

+        result_clip.Intersect(*pDestClip);

+    }

+    if (result_clip.IsEmpty()) {

+        return FALSE;

+    }

+    m_ResultLeft = result_clip.left;

+    m_ResultTop = result_clip.top;

+    m_ResultWidth = result_clip.Width();

+    m_ResultHeight = result_clip.Height();

+    m_Flags = flags;

+    if (FXSYS_fabs(pDestMatrix->a) < FXSYS_fabs(pDestMatrix->b) / 20 &&

+            FXSYS_fabs(pDestMatrix->d) < FXSYS_fabs(pDestMatrix->c) / 20 &&

+            FXSYS_fabs(pDestMatrix->a) < 0.5f && FXSYS_fabs(pDestMatrix->d) < 0.5f) {

+        int dest_width = result_rect.Width();

+        int dest_height = result_rect.Height();

+        result_clip.Offset(-result_rect.left, -result_rect.top);

+        result_clip = _FXDIB_SwapClipBox(result_clip, dest_width, dest_height, pDestMatrix->c > 0, pDestMatrix->b < 0);

+        m_Stretcher.Start(&m_Storer, pSrc, dest_height, dest_width, result_clip, flags);

+        m_Status = 1;

+        return TRUE;

+    }

+    if (FXSYS_fabs(pDestMatrix->b) < FIX16_005 && FXSYS_fabs(pDestMatrix->c) < FIX16_005) {

+        int dest_width = pDestMatrix->a > 0 ? (int)FXSYS_ceil(pDestMatrix->a) : (int)FXSYS_floor(pDestMatrix->a);

+        int dest_height = pDestMatrix->d > 0 ? (int) - FXSYS_ceil(pDestMatrix->d) : (int) - FXSYS_floor(pDestMatrix->d);

+        result_clip.Offset(-result_rect.left, -result_rect.top);

+        m_Stretcher.Start(&m_Storer, pSrc, dest_width, dest_height, result_clip, flags);

+        m_Status = 2;

+        return TRUE;

+    }

+    int stretch_width = (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->a, pDestMatrix->b));

+    int stretch_height = (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->c, pDestMatrix->d));

+    CFX_AffineMatrix stretch2dest(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, (FX_FLOAT)(stretch_height));

+    stretch2dest.Concat(pDestMatrix->a / stretch_width, pDestMatrix->b / stretch_width,

+                        pDestMatrix->c / stretch_height, pDestMatrix->d / stretch_height, pDestMatrix->e, pDestMatrix->f);

+    m_dest2stretch.SetReverse(stretch2dest);

+    CFX_FloatRect clip_rect_f(result_clip);

+    clip_rect_f.Transform(&m_dest2stretch);

+    m_StretchClip = clip_rect_f.GetOutterRect();

+    m_StretchClip.Intersect(0, 0, stretch_width, stretch_height);

+    m_Stretcher.Start(&m_Storer, pSrc, stretch_width, stretch_height, m_StretchClip, flags);

+    m_Status = 3;

+    return TRUE;

+}

+FX_BYTE _bilinear_interpol(FX_LPCBYTE buf, int row_offset_l, int row_offset_r,

+                           int src_col_l, int src_col_r, int res_x, int res_y,

+                           int bpp, int c_offset)

+{

+    int i_resx = 255 - res_x;

+    int col_bpp_l = src_col_l * bpp;

+    int col_bpp_r = src_col_r * bpp;

+    FX_LPCBYTE buf_u = buf + row_offset_l + c_offset;

+    FX_LPCBYTE buf_d = buf + row_offset_r + c_offset;

+    FX_LPCBYTE src_pos0 = buf_u + col_bpp_l;

+    FX_LPCBYTE src_pos1 = buf_u + col_bpp_r;

+    FX_LPCBYTE src_pos2 = buf_d + col_bpp_l;

+    FX_LPCBYTE src_pos3 = buf_d + col_bpp_r;

+    FX_BYTE r_pos_0 = (*src_pos0 * i_resx + *src_pos1 * res_x) >> 8;

+    FX_BYTE r_pos_1 = (*src_pos2 * i_resx + *src_pos3 * res_x) >> 8;

+    return (r_pos_0 * (255 - res_y) + r_pos_1 * res_y) >> 8;

+}

+FX_BYTE _bicubic_interpol(FX_LPCBYTE buf, int pitch, int pos_pixel[], int u_w[], int v_w[], int res_x, int res_y,

+                          int bpp, int c_offset)

+{

+    int s_result = 0;

+    for (int i = 0; i < 4; i ++) {

+        int a_result = 0;

+        for (int j = 0; j < 4; j ++) {

+            a_result += u_w[j] * (*(FX_BYTE*)(buf + pos_pixel[i + 4] * pitch + pos_pixel[j] * bpp + c_offset));

+        }

+        s_result += a_result * v_w[i];

+    }

+    s_result >>= 16;

+    return (FX_BYTE)(s_result < 0 ? 0 : s_result > 255 ? 255 : s_result);

+}

+void _bicubic_get_pos_weight(int pos_pixel[], int u_w[], int v_w[], int src_col_l, int src_row_l,

+                             int res_x, int res_y, int stretch_width, int stretch_height)

+{

+    pos_pixel[0] = src_col_l - 1;

+    pos_pixel[1] = src_col_l;

+    pos_pixel[2] = src_col_l + 1;

+    pos_pixel[3] = src_col_l + 2;

+    pos_pixel[4] = src_row_l - 1;

+    pos_pixel[5] = src_row_l;

+    pos_pixel[6] = src_row_l + 1;

+    pos_pixel[7] = src_row_l + 2;

+    for (int i = 0 ; i < 4; i ++) {

+        if (pos_pixel[i] < 0) {

+            pos_pixel[i] = 0;

+        }

+        if (pos_pixel[i] >= stretch_width) {

+            pos_pixel[i] = stretch_width - 1;

+        }

+        if (pos_pixel[i + 4] < 0) {

+            pos_pixel[i + 4] = 0;

+        }

+        if (pos_pixel[i + 4] >= stretch_height) {

+            pos_pixel[i + 4] = stretch_height - 1;

+        }

+    }

+    u_w[0] = SDP_Table[256 + res_x];

+    u_w[1] = SDP_Table[res_x];

+    u_w[2] = SDP_Table[256 - res_x];

+    u_w[3] = SDP_Table[512 - res_x];

+    v_w[0] = SDP_Table[256 + res_y];

+    v_w[1] = SDP_Table[res_y];

+    v_w[2] = SDP_Table[256 - res_y];

+    v_w[3] = SDP_Table[512 - res_y];

+}

+FXDIB_Format _GetTransformedFormat(const CFX_DIBSource* pDrc)

+{

+    FXDIB_Format format = pDrc->GetFormat();

+    if (pDrc->IsAlphaMask()) {

+        format = FXDIB_8bppMask;

+    } else if (format >= 1025) {

+        format = FXDIB_Cmyka;

+    } else if (format <= 32 || format == FXDIB_Argb) {

+        format = FXDIB_Argb;

+    } else {

+        format = FXDIB_Rgba;

+    }

+    return format;

+}

+FX_BOOL CFX_ImageTransformer::Continue(IFX_Pause* pPause)

+{

+    if (m_Status == 1) {

+        if (m_Stretcher.Continue(pPause)) {

+            return TRUE;

+        }

+        if (m_Storer.GetBitmap()) {

+            m_Storer.Replace(m_Storer.GetBitmap()->SwapXY(m_pMatrix->c > 0, m_pMatrix->b < 0));

+        }

+        return FALSE;

+    } else if (m_Status == 2) {

+        return m_Stretcher.Continue(pPause);

+    } else if (m_Status != 3) {

+        return FALSE;

+    }

+    if (m_Stretcher.Continue(pPause)) {

+        return TRUE;

+    }

+    int stretch_width = m_StretchClip.Width();

+    int stretch_height = m_StretchClip.Height();

+    if (m_Storer.GetBitmap() == NULL) {

+        return FALSE;

+    }

+    FX_LPCBYTE stretch_buf = m_Storer.GetBitmap()->GetBuffer();

+    FX_LPCBYTE stretch_buf_mask = NULL;

+    if (m_Storer.GetBitmap()->m_pAlphaMask) {

+        stretch_buf_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetBuffer();

+    }

+    int stretch_pitch = m_Storer.GetBitmap()->GetPitch();

+    CFX_DIBitmap* pTransformed = FX_NEW CFX_DIBitmap;

+    if (!pTransformed) {

+        return FALSE;

+    }

+    FXDIB_Format transformF = _GetTransformedFormat(m_Stretcher.m_pSource);

+    if (!pTransformed->Create(m_ResultWidth, m_ResultHeight, transformF)) {

+        delete pTransformed;

+        return FALSE;

+    }

+    pTransformed->Clear(0);

+    if (pTransformed->m_pAlphaMask) {

+        pTransformed->m_pAlphaMask->Clear(0);

+    }

+    CFX_AffineMatrix result2stretch(1.0f, 0.0f, 0.0f, 1.0f, (FX_FLOAT)(m_ResultLeft), (FX_FLOAT)(m_ResultTop));

+    result2stretch.Concat(m_dest2stretch);

+    result2stretch.TranslateI(-m_StretchClip.left, -m_StretchClip.top);

+    if (stretch_buf_mask == NULL && pTransformed->m_pAlphaMask) {

+        pTransformed->m_pAlphaMask->Clear(0xff000000);

+    } else if (pTransformed->m_pAlphaMask) {

+        int stretch_pitch_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetPitch();

+        if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {

+            CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);

+            for (int row = 0; row < m_ResultHeight; row ++) {

+                FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);

+                for (int col = 0; col < m_ResultWidth; col ++) {

+                    int src_col_l, src_row_l, res_x, res_y;

+                    result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);

+                    if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {

+                        if (src_col_l == stretch_width) {

+                            src_col_l--;

+                        }

+                        if (src_row_l == stretch_height) {

+                            src_row_l--;

+                        }

+                        int src_col_r = src_col_l + 1;

+                        int src_row_r = src_row_l + 1;

+                        if (src_col_r == stretch_width) {

+                            src_col_r--;

+                        }

+                        if (src_row_r == stretch_height) {

+                            src_row_r--;

+                        }

+                        int row_offset_l = src_row_l * stretch_pitch_mask;

+                        int row_offset_r = src_row_r * stretch_pitch_mask;

+                        *dest_pos_mask = _bilinear_interpol(stretch_buf_mask, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0);

+                    }

+                    dest_pos_mask++;

+                }

+            }

+        } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+            CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);

+            int pos_pixel[8];

+            for (int row = 0; row < m_ResultHeight; row ++) {

+                FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);

+                for (int col = 0; col < m_ResultWidth; col ++) {

+                    int src_col_l, src_row_l, res_x, res_y;

+                    result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);

+                    if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {

+                        int u_w[4], v_w[4];

+                        if (src_col_l == stretch_width) {

+                            src_col_l--;

+                        }

+                        if (src_row_l == stretch_height) {

+                            src_row_l--;

+                        }

+                        _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);

+                        *dest_pos_mask = _bicubic_interpol(stretch_buf_mask, stretch_pitch_mask, pos_pixel, u_w, v_w, res_x, res_y, 1, 0);

+                    }

+                    dest_pos_mask++;

+                }

+            }

+        } else {

+            CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);

+            for (int row = 0; row < m_ResultHeight; row ++) {

+                FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);

+                for (int col = 0; col < m_ResultWidth; col ++) {

+                    int src_col, src_row;

+                    result2stretch_fix.Transform(col, row, src_col, src_row);

+                    if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {

+                        if (src_col == stretch_width) {

+                            src_col --;

+                        }

+                        if (src_row == stretch_height) {

+                            src_row --;

+                        }

+                        *dest_pos_mask = stretch_buf_mask[src_row * stretch_pitch_mask + src_col];

+                    }

+                    dest_pos_mask++;

+                }

+            }

+        }

+    }

+    if (m_Storer.GetBitmap()->IsAlphaMask()) {

+        if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {

+            CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);

+            for (int row = 0; row < m_ResultHeight; row ++) {

+                FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);

+                for (int col = 0; col < m_ResultWidth; col ++) {

+                    int src_col_l, src_row_l, res_x, res_y;

+                    result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);

+                    if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {

+                        if (src_col_l == stretch_width) {

+                            src_col_l--;

+                        }

+                        if (src_row_l == stretch_height) {

+                            src_row_l--;

+                        }

+                        int src_col_r = src_col_l + 1;

+                        int src_row_r = src_row_l + 1;

+                        if (src_col_r == stretch_width) {

+                            src_col_r--;

+                        }

+                        if (src_row_r == stretch_height) {

+                            src_row_r--;

+                        }

+                        int row_offset_l = src_row_l * stretch_pitch;

+                        int row_offset_r = src_row_r * stretch_pitch;

+                        *dest_scan = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0);

+                    }

+                    dest_scan ++;

+                }

+            }

+        } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+            CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);

+            int pos_pixel[8];

+            for (int row = 0; row < m_ResultHeight; row ++) {

+                FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);

+                for (int col = 0; col < m_ResultWidth; col ++) {

+                    int src_col_l, src_row_l, res_x, res_y;

+                    result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);

+                    if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {

+                        int u_w[4], v_w[4];

+                        if (src_col_l == stretch_width) {

+                            src_col_l--;

+                        }

+                        if (src_row_l == stretch_height) {

+                            src_row_l--;

+                        }

+                        _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);

+                        *dest_scan = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0);

+                    }

+                    dest_scan ++;

+                }

+            }

+        } else {

+            CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);

+            for (int row = 0; row < m_ResultHeight; row ++) {

+                FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);

+                for (int col = 0; col < m_ResultWidth; col ++) {

+                    int src_col, src_row;

+                    result2stretch_fix.Transform(col, row, src_col, src_row);

+                    if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {

+                        if (src_col == stretch_width) {

+                            src_col --;

+                        }

+                        if (src_row == stretch_height) {

+                            src_row --;

+                        }

+                        FX_LPCBYTE src_pixel = stretch_buf + stretch_pitch * src_row + src_col;

+                        *dest_scan = *src_pixel;

+                    }

+                    dest_scan ++;

+                }

+            }

+        }

+    } else {

+        int Bpp = m_Storer.GetBitmap()->GetBPP() / 8;

+        int destBpp = pTransformed->GetBPP() / 8;

+        if (Bpp == 1) {

+            FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha();

+            FX_DWORD argb[256];

+            FX_ARGB* pPal = m_Storer.GetBitmap()->GetPalette();

+            if (pPal) {

+                for (int i = 0; i < 256; i ++) {

+                    argb[i] = pPal[i];

+                }

+            } else {

+                if (m_Storer.GetBitmap()->IsCmykImage())

+                    for (int i = 0; i < 256; i ++) {

+                        argb[i] = 255 - i;

+                    }

+                else

+                    for (int i = 0; i < 256; i ++) {

+                        argb[i] = 0xff000000 | (i * 0x010101);

+                    }

+            }

+            if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {

+                CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);

+                for (int row = 0; row < m_ResultHeight; row ++) {

+                    FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);

+                    for (int col = 0; col < m_ResultWidth; col ++) {

+                        int src_col_l, src_row_l, res_x, res_y;

+                        result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);

+                        if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {

+                            if (src_col_l == stretch_width) {

+                                src_col_l--;

+                            }

+                            if (src_row_l == stretch_height) {

+                                src_row_l--;

+                            }

+                            int src_col_r = src_col_l + 1;

+                            int src_row_r = src_row_l + 1;

+                            if (src_col_r == stretch_width) {

+                                src_col_r--;

+                            }

+                            if (src_row_r == stretch_height) {

+                                src_row_r--;

+                            }

+                            int row_offset_l = src_row_l * stretch_pitch;

+                            int row_offset_r = src_row_r * stretch_pitch;

+                            FX_DWORD r_bgra_cmyk = argb[_bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0)];

+                            if (transformF == FXDIB_Rgba) {

+                                dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);

+                                dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);

+                                dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);

+                            } else {

+                                *(FX_DWORD*)dest_pos = r_bgra_cmyk;

+                            }

+                        }

+                        dest_pos += destBpp;

+                    }

+                }

+            } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);

+                int pos_pixel[8];

+                for (int row = 0; row < m_ResultHeight; row ++) {

+                    FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);

+                    for (int col = 0; col < m_ResultWidth; col ++) {

+                        int src_col_l, src_row_l, res_x, res_y;

+                        result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);

+                        if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {

+                            int u_w[4], v_w[4];

+                            if (src_col_l == stretch_width) {

+                                src_col_l--;

+                            }

+                            if (src_row_l == stretch_height) {

+                                src_row_l--;

+                            }

+                            _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);

+                            FX_DWORD r_bgra_cmyk = argb[_bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0)];

+                            if (transformF == FXDIB_Rgba) {

+                                dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);

+                                dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);

+                                dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);

+                            } else {

+                                *(FX_DWORD*)dest_pos = r_bgra_cmyk;

+                            }

+                        }

+                        dest_pos += destBpp;

+                    }

+                }

+            } else {

+                CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);

+                for (int row = 0; row < m_ResultHeight; row ++) {

+                    FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);

+                    for (int col = 0; col < m_ResultWidth; col ++) {

+                        int src_col, src_row;

+                        result2stretch_fix.Transform(col, row, src_col, src_row);

+                        if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {

+                            if (src_col == stretch_width) {

+                                src_col --;

+                            }

+                            if (src_row == stretch_height) {

+                                src_row --;

+                            }

+                            FX_DWORD r_bgra_cmyk = argb[stretch_buf[src_row * stretch_pitch + src_col]];

+                            if (transformF == FXDIB_Rgba) {

+                                dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);

+                                dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);

+                                dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);

+                            } else {

+                                *(FX_DWORD*)dest_pos = r_bgra_cmyk;

+                            }

+                        }

+                        dest_pos += destBpp;

+                    }

+                }

+            }

+        } else {

+            FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha();

+            int destBpp = pTransformed->GetBPP() / 8;

+            if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {

+                CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);

+                for (int row = 0; row < m_ResultHeight; row ++) {

+                    FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);

+                    for (int col = 0; col < m_ResultWidth; col ++) {

+                        int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;

+                        result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);

+                        if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {

+                            if (src_col_l == stretch_width) {

+                                src_col_l--;

+                            }

+                            if (src_row_l == stretch_height) {

+                                src_row_l--;

+                            }

+                            int src_col_r = src_col_l + 1;

+                            int src_row_r = src_row_l + 1;

+                            if (src_col_r == stretch_width) {

+                                src_col_r--;

+                            }

+                            if (src_row_r == stretch_height) {

+                                src_row_r--;

+                            }

+                            int row_offset_l = src_row_l * stretch_pitch;

+                            int row_offset_r = src_row_r * stretch_pitch;

+                            FX_BYTE r_pos_red_y_r   = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 2);

+                            FX_BYTE r_pos_green_m_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 1);

+                            FX_BYTE r_pos_blue_c_r  = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 0);

+                            if (bHasAlpha) {

+                                if (transformF != FXDIB_Argb) {

+                                    if (transformF == FXDIB_Rgba) {

+                                        dest_pos[0] = r_pos_blue_c_r;

+                                        dest_pos[1] = r_pos_green_m_r;

+                                        dest_pos[2] = r_pos_red_y_r;

+                                    } else {

+                                        r_pos_k_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);

+                                        *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));

+                                    }

+                                } else {

+                                    FX_BYTE r_pos_a_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);

+                                    *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));

+                                }

+                            } else {

+                                r_pos_k_r = 0xff;

+                                if (transformF == FXDIB_Cmyka) {

+                                    r_pos_k_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);

+                                    *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));

+                                } else {

+                                    *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));

+                                }

+                            }

+                        }

+                        dest_pos += destBpp;

+                    }

+                }

+            } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {

+                CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);

+                int pos_pixel[8];

+                for (int row = 0; row < m_ResultHeight; row ++) {

+                    FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);

+                    for (int col = 0; col < m_ResultWidth; col ++) {

+                        int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;

+                        result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);

+                        if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {

+                            int u_w[4], v_w[4];

+                            if (src_col_l == stretch_width) {

+                                src_col_l--;

+                            }

+                            if (src_row_l == stretch_height) {

+                                src_row_l--;

+                            }

+                            _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);

+                            FX_BYTE r_pos_red_y_r   = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 2);

+                            FX_BYTE r_pos_green_m_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 1);

+                            FX_BYTE r_pos_blue_c_r  = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 0);

+                            if (bHasAlpha) {

+                                if (transformF != FXDIB_Argb) {

+                                    if (transformF == FXDIB_Rgba) {

+                                        dest_pos[0] = r_pos_blue_c_r;

+                                        dest_pos[1] = r_pos_green_m_r;

+                                        dest_pos[2] = r_pos_red_y_r;

+                                    } else {

+                                        r_pos_k_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);

+                                        *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));

+                                    }

+                                } else {

+                                    FX_BYTE r_pos_a_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);

+                                    *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));

+                                }

+                            } else {

+                                r_pos_k_r = 0xff;

+                                if (transformF == FXDIB_Cmyka) {

+                                    r_pos_k_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);

+                                    *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));

+                                } else {

+                                    *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));

+                                }

+                            }

+                        }

+                        dest_pos += destBpp;

+                    }

+                }

+            } else {

+                CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);

+                for (int row = 0; row < m_ResultHeight; row ++) {

+                    FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);

+                    for (int col = 0; col < m_ResultWidth; col ++) {

+                        int src_col, src_row;

+                        result2stretch_fix.Transform(col, row, src_col, src_row);

+                        if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {

+                            if (src_col == stretch_width) {

+                                src_col --;

+                            }

+                            if (src_row == stretch_height) {

+                                src_row --;

+                            }

+                            FX_LPCBYTE src_pos = stretch_buf + src_row * stretch_pitch + src_col * Bpp;

+                            if (bHasAlpha) {

+                                if (transformF != FXDIB_Argb) {

+                                    if (transformF == FXDIB_Rgba) {

+                                        dest_pos[0] = src_pos[0];

+                                        dest_pos[1] = src_pos[1];

+                                        dest_pos[2] = src_pos[2];

+                                    } else {

+                                        *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(src_pos[0], src_pos[1], src_pos[2], src_pos[3]));

+                                    }

+                                } else {

+                                    *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(src_pos[3], src_pos[2], src_pos[1], src_pos[0]));

+                                }

+                            } else {

+                                if (transformF == FXDIB_Cmyka) {

+                                    *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(src_pos[0], src_pos[1], src_pos[2], src_pos[3]));

+                                } else {

+                                    *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(0xff, src_pos[2], src_pos[1], src_pos[0]));

+                                }

+                            }

+                        }

+                        dest_pos += destBpp;

+                    }

+                }

+            }

+        }

+    }

+    m_Storer.Replace(pTransformed);

+    return FALSE;

+}

diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c b/core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c
new file mode 100644
index 0000000..b4c2ac1
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c
@@ -0,0 +1,3697 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitDingbatsFontData [29513] = {0x1,
+                                                       0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x11,
+                                                       0x43, 0x68, 0x72, 0x6f, 0x6d, 0x44, 0x69, 0x6e,
+                                                       0x67, 0x62, 0x61, 0x74, 0x73, 0x4f, 0x54, 0x46,
+                                                       0x0, 0x1, 0x1, 0x1, 0x25, 0xf8, 0x10, 0x0,
+                                                       0xf8, 0xe4, 0x1, 0xf8, 0xe5, 0x2, 0xf8, 0xe5,
+                                                       0x3, 0xf8, 0xe6, 0x4, 0x8a, 0xfb, 0x38, 0xfa,
+                                                       0x69, 0xf9, 0xce, 0x5, 0x1c, 0x4, 0xdc, 0xf,
+                                                       0x1c, 0x4, 0xe3, 0x11, 0xa7, 0x1c, 0x6e, 0x3f,
+                                                       0x12, 0x0, 0xcc, 0x2, 0x0, 0x1, 0x0, 0x3,
+                                                       0x0, 0x6, 0x0, 0xa, 0x0, 0xe, 0x0, 0x12,
+                                                       0x0, 0x16, 0x0, 0x1a, 0x0, 0x1e, 0x0, 0x22,
+                                                       0x0, 0x26, 0x0, 0x2a, 0x0, 0x2e, 0x0, 0x31,
+                                                       0x0, 0x35, 0x0, 0x39, 0x0, 0x3d, 0x0, 0x41,
+                                                       0x0, 0x45, 0x0, 0x49, 0x0, 0x4c, 0x0, 0x50,
+                                                       0x0, 0x54, 0x0, 0x58, 0x0, 0x5c, 0x0, 0x60,
+                                                       0x0, 0x64, 0x0, 0x68, 0x0, 0x6c, 0x0, 0x70,
+                                                       0x0, 0x74, 0x0, 0x77, 0x0, 0x7b, 0x0, 0x7f,
+                                                       0x0, 0x83, 0x0, 0x87, 0x0, 0x8b, 0x0, 0x8f,
+                                                       0x0, 0x93, 0x0, 0x97, 0x0, 0x9b, 0x0, 0x9f,
+                                                       0x0, 0xa2, 0x0, 0xa6, 0x0, 0xaa, 0x0, 0xae,
+                                                       0x0, 0xb2, 0x0, 0xb6, 0x0, 0xba, 0x0, 0xbe,
+                                                       0x0, 0xc2, 0x0, 0xc6, 0x0, 0xca, 0x0, 0xcd,
+                                                       0x0, 0xd1, 0x0, 0xd5, 0x0, 0xd9, 0x0, 0xdd,
+                                                       0x0, 0xe1, 0x0, 0xe5, 0x0, 0xe9, 0x0, 0xed,
+                                                       0x0, 0xf1, 0x0, 0xf5, 0x0, 0xf8, 0x0, 0xfc,
+                                                       0x1, 0x0, 0x1, 0x4, 0x1, 0x8, 0x1, 0xc,
+                                                       0x1, 0x10, 0x1, 0x14, 0x1, 0x18, 0x1, 0x1c,
+                                                       0x1, 0x20, 0x1, 0x23, 0x1, 0x27, 0x1, 0x2b,
+                                                       0x1, 0x2f, 0x1, 0x33, 0x1, 0x37, 0x1, 0x3b,
+                                                       0x1, 0x3f, 0x1, 0x43, 0x1, 0x47, 0x1, 0x4b,
+                                                       0x1, 0x4e, 0x1, 0x52, 0x1, 0x56, 0x1, 0x5a,
+                                                       0x1, 0x5e, 0x1, 0x62, 0x1, 0x66, 0x1, 0x6a,
+                                                       0x1, 0x6e, 0x1, 0x72, 0x1, 0x76, 0x1, 0x79,
+                                                       0x1, 0x7d, 0x1, 0x81, 0x1, 0x85, 0x1, 0x89,
+                                                       0x1, 0x8d, 0x1, 0x91, 0x1, 0x95, 0x1, 0x99,
+                                                       0x1, 0x9d, 0x1, 0xa1, 0x1, 0xa3, 0x1, 0xa6,
+                                                       0x1, 0xaa, 0x1, 0xae, 0x1, 0xb2, 0x1, 0xb6,
+                                                       0x1, 0xba, 0x1, 0xbe, 0x1, 0xc2, 0x1, 0xc5,
+                                                       0x1, 0xc8, 0x1, 0xcb, 0x1, 0xce, 0x1, 0xd1,
+                                                       0x1, 0xd4, 0x1, 0xd7, 0x1, 0xda, 0x1, 0xdd,
+                                                       0x1, 0xdf, 0x1, 0xe2, 0x1, 0xe5, 0x1, 0xe8,
+                                                       0x1, 0xeb, 0x1, 0xee, 0x1, 0xf1, 0x1, 0xf4,
+                                                       0x1, 0xf7, 0x1, 0xfa, 0x1, 0xfd, 0x1, 0xff,
+                                                       0x2, 0x2, 0x2, 0x5, 0x2, 0x8, 0x2, 0xb,
+                                                       0x2, 0xe, 0x2, 0x11, 0x2, 0x14, 0x2, 0x17,
+                                                       0x2, 0x1a, 0x2, 0x1d, 0x2, 0x1f, 0x2, 0x22,
+                                                       0x2, 0x25, 0x2, 0x28, 0x2, 0x2b, 0x2, 0x2e,
+                                                       0x2, 0x31, 0x2, 0x34, 0x2, 0x37, 0x2, 0x3a,
+                                                       0x2, 0x3d, 0x2, 0x3f, 0x2, 0x42, 0x2, 0x45,
+                                                       0x2, 0x48, 0x2, 0x4b, 0x2, 0x4e, 0x2, 0x51,
+                                                       0x2, 0x54, 0x2, 0x57, 0x2, 0x5a, 0x2, 0x5d,
+                                                       0x2, 0x5f, 0x2, 0x62, 0x2, 0x65, 0x2, 0x68,
+                                                       0x2, 0x6b, 0x2, 0x6e, 0x2, 0x71, 0x2, 0x74,
+                                                       0x2, 0x77, 0x2, 0x7a, 0x2, 0x7d, 0x2, 0x7f,
+                                                       0x2, 0x82, 0x2, 0x85, 0x2, 0x88, 0x2, 0x8b,
+                                                       0x2, 0x8e, 0x2, 0x91, 0x2, 0x94, 0x2, 0x97,
+                                                       0x2, 0x9a, 0x2, 0x9c, 0x2, 0x9f, 0x2, 0xa2,
+                                                       0x2, 0xa5, 0x2, 0xa8, 0x2, 0xab, 0x2, 0xae,
+                                                       0x2, 0xb1, 0x2, 0xb4, 0x2, 0xb7, 0x2, 0xba,
+                                                       0x2, 0xe4, 0x2, 0xf6, 0x2, 0xfc, 0x61, 0x31,
+                                                       0x61, 0x31, 0x30, 0x61, 0x31, 0x30, 0x30, 0x61,
+                                                       0x31, 0x30, 0x31, 0x61, 0x31, 0x30, 0x32, 0x61,
+                                                       0x31, 0x30, 0x33, 0x61, 0x31, 0x30, 0x34, 0x61,
+                                                       0x31, 0x30, 0x35, 0x61, 0x31, 0x30, 0x36, 0x61,
+                                                       0x31, 0x30, 0x37, 0x61, 0x31, 0x30, 0x38, 0x61,
+                                                       0x31, 0x30, 0x39, 0x61, 0x31, 0x31, 0x61, 0x31,
+                                                       0x31, 0x30, 0x61, 0x31, 0x31, 0x31, 0x61, 0x31,
+                                                       0x31, 0x32, 0x61, 0x31, 0x31, 0x37, 0x61, 0x31,
+                                                       0x31, 0x38, 0x61, 0x31, 0x31, 0x39, 0x61, 0x31,
+                                                       0x32, 0x61, 0x31, 0x32, 0x30, 0x61, 0x31, 0x32,
+                                                       0x31, 0x61, 0x31, 0x32, 0x32, 0x61, 0x31, 0x32,
+                                                       0x33, 0x61, 0x31, 0x32, 0x34, 0x61, 0x31, 0x32,
+                                                       0x35, 0x61, 0x31, 0x32, 0x36, 0x61, 0x31, 0x32,
+                                                       0x37, 0x61, 0x31, 0x32, 0x38, 0x61, 0x31, 0x32,
+                                                       0x39, 0x61, 0x31, 0x33, 0x61, 0x31, 0x33, 0x30,
+                                                       0x61, 0x31, 0x33, 0x31, 0x61, 0x31, 0x33, 0x32,
+                                                       0x61, 0x31, 0x33, 0x33, 0x61, 0x31, 0x33, 0x34,
+                                                       0x61, 0x31, 0x33, 0x35, 0x61, 0x31, 0x33, 0x36,
+                                                       0x61, 0x31, 0x33, 0x37, 0x61, 0x31, 0x33, 0x38,
+                                                       0x61, 0x31, 0x33, 0x39, 0x61, 0x31, 0x34, 0x61,
+                                                       0x31, 0x34, 0x30, 0x61, 0x31, 0x34, 0x31, 0x61,
+                                                       0x31, 0x34, 0x32, 0x61, 0x31, 0x34, 0x33, 0x61,
+                                                       0x31, 0x34, 0x34, 0x61, 0x31, 0x34, 0x35, 0x61,
+                                                       0x31, 0x34, 0x36, 0x61, 0x31, 0x34, 0x37, 0x61,
+                                                       0x31, 0x34, 0x38, 0x61, 0x31, 0x34, 0x39, 0x61,
+                                                       0x31, 0x35, 0x61, 0x31, 0x35, 0x30, 0x61, 0x31,
+                                                       0x35, 0x31, 0x61, 0x31, 0x35, 0x32, 0x61, 0x31,
+                                                       0x35, 0x33, 0x61, 0x31, 0x35, 0x34, 0x61, 0x31,
+                                                       0x35, 0x35, 0x61, 0x31, 0x35, 0x36, 0x61, 0x31,
+                                                       0x35, 0x37, 0x61, 0x31, 0x35, 0x38, 0x61, 0x31,
+                                                       0x35, 0x39, 0x61, 0x31, 0x36, 0x61, 0x31, 0x36,
+                                                       0x30, 0x61, 0x31, 0x36, 0x31, 0x61, 0x31, 0x36,
+                                                       0x32, 0x61, 0x31, 0x36, 0x33, 0x61, 0x31, 0x36,
+                                                       0x34, 0x61, 0x31, 0x36, 0x35, 0x61, 0x31, 0x36,
+                                                       0x36, 0x61, 0x31, 0x36, 0x37, 0x61, 0x31, 0x36,
+                                                       0x38, 0x61, 0x31, 0x36, 0x39, 0x61, 0x31, 0x37,
+                                                       0x61, 0x31, 0x37, 0x30, 0x61, 0x31, 0x37, 0x31,
+                                                       0x61, 0x31, 0x37, 0x32, 0x61, 0x31, 0x37, 0x33,
+                                                       0x61, 0x31, 0x37, 0x34, 0x61, 0x31, 0x37, 0x35,
+                                                       0x61, 0x31, 0x37, 0x36, 0x61, 0x31, 0x37, 0x37,
+                                                       0x61, 0x31, 0x37, 0x38, 0x61, 0x31, 0x37, 0x39,
+                                                       0x61, 0x31, 0x38, 0x61, 0x31, 0x38, 0x30, 0x61,
+                                                       0x31, 0x38, 0x31, 0x61, 0x31, 0x38, 0x32, 0x61,
+                                                       0x31, 0x38, 0x33, 0x61, 0x31, 0x38, 0x34, 0x61,
+                                                       0x31, 0x38, 0x35, 0x61, 0x31, 0x38, 0x36, 0x61,
+                                                       0x31, 0x38, 0x37, 0x61, 0x31, 0x38, 0x38, 0x61,
+                                                       0x31, 0x38, 0x39, 0x61, 0x31, 0x39, 0x61, 0x31,
+                                                       0x39, 0x30, 0x61, 0x31, 0x39, 0x31, 0x61, 0x31,
+                                                       0x39, 0x32, 0x61, 0x31, 0x39, 0x33, 0x61, 0x31,
+                                                       0x39, 0x34, 0x61, 0x31, 0x39, 0x35, 0x61, 0x31,
+                                                       0x39, 0x36, 0x61, 0x31, 0x39, 0x37, 0x61, 0x31,
+                                                       0x39, 0x38, 0x61, 0x31, 0x39, 0x39, 0x61, 0x32,
+                                                       0x61, 0x32, 0x30, 0x61, 0x32, 0x30, 0x30, 0x61,
+                                                       0x32, 0x30, 0x31, 0x61, 0x32, 0x30, 0x32, 0x61,
+                                                       0x32, 0x30, 0x33, 0x61, 0x32, 0x30, 0x34, 0x61,
+                                                       0x32, 0x30, 0x35, 0x61, 0x32, 0x30, 0x36, 0x61,
+                                                       0x32, 0x31, 0x61, 0x32, 0x32, 0x61, 0x32, 0x33,
+                                                       0x61, 0x32, 0x34, 0x61, 0x32, 0x35, 0x61, 0x32,
+                                                       0x36, 0x61, 0x32, 0x37, 0x61, 0x32, 0x38, 0x61,
+                                                       0x32, 0x39, 0x61, 0x33, 0x61, 0x33, 0x30, 0x61,
+                                                       0x33, 0x31, 0x61, 0x33, 0x32, 0x61, 0x33, 0x33,
+                                                       0x61, 0x33, 0x34, 0x61, 0x33, 0x35, 0x61, 0x33,
+                                                       0x36, 0x61, 0x33, 0x37, 0x61, 0x33, 0x38, 0x61,
+                                                       0x33, 0x39, 0x61, 0x34, 0x61, 0x34, 0x30, 0x61,
+                                                       0x34, 0x31, 0x61, 0x34, 0x32, 0x61, 0x34, 0x33,
+                                                       0x61, 0x34, 0x34, 0x61, 0x34, 0x35, 0x61, 0x34,
+                                                       0x36, 0x61, 0x34, 0x37, 0x61, 0x34, 0x38, 0x61,
+                                                       0x34, 0x39, 0x61, 0x35, 0x61, 0x35, 0x30, 0x61,
+                                                       0x35, 0x31, 0x61, 0x35, 0x32, 0x61, 0x35, 0x33,
+                                                       0x61, 0x35, 0x34, 0x61, 0x35, 0x35, 0x61, 0x35,
+                                                       0x36, 0x61, 0x35, 0x37, 0x61, 0x35, 0x38, 0x61,
+                                                       0x35, 0x39, 0x61, 0x36, 0x61, 0x36, 0x30, 0x61,
+                                                       0x36, 0x31, 0x61, 0x36, 0x32, 0x61, 0x36, 0x33,
+                                                       0x61, 0x36, 0x34, 0x61, 0x36, 0x35, 0x61, 0x36,
+                                                       0x36, 0x61, 0x36, 0x37, 0x61, 0x36, 0x38, 0x61,
+                                                       0x36, 0x39, 0x61, 0x37, 0x61, 0x37, 0x30, 0x61,
+                                                       0x37, 0x31, 0x61, 0x37, 0x32, 0x61, 0x37, 0x33,
+                                                       0x61, 0x37, 0x34, 0x61, 0x37, 0x35, 0x61, 0x37,
+                                                       0x36, 0x61, 0x37, 0x37, 0x61, 0x37, 0x38, 0x61,
+                                                       0x37, 0x39, 0x61, 0x38, 0x61, 0x38, 0x31, 0x61,
+                                                       0x38, 0x32, 0x61, 0x38, 0x33, 0x61, 0x38, 0x34,
+                                                       0x61, 0x38, 0x35, 0x61, 0x38, 0x36, 0x61, 0x38,
+                                                       0x37, 0x61, 0x38, 0x38, 0x61, 0x38, 0x39, 0x61,
+                                                       0x39, 0x61, 0x39, 0x30, 0x61, 0x39, 0x31, 0x61,
+                                                       0x39, 0x32, 0x61, 0x39, 0x33, 0x61, 0x39, 0x34,
+                                                       0x61, 0x39, 0x35, 0x61, 0x39, 0x36, 0x61, 0x39,
+                                                       0x37, 0x61, 0x39, 0x38, 0x61, 0x39, 0x39, 0x20,
+                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                       0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x44,
+                                                       0x69, 0x6e, 0x67, 0x62, 0x61, 0x74, 0x73, 0x20,
+                                                       0x4f, 0x54, 0x46, 0x4e, 0x6f, 0x72, 0x6d, 0x61,
+                                                       0x6c, 0x0, 0x0, 0x1, 0x1, 0x87, 0xc8, 0x0,
+                                                       0x1, 0x0, 0x0, 0xcb, 0x2, 0x0, 0x1, 0x0,
+                                                       0x4, 0x1, 0x3, 0x1, 0x8d, 0x1, 0xfa, 0x2,
+                                                       0x4a, 0x2, 0x95, 0x2, 0xe3, 0x3, 0x25, 0x3,
+                                                       0x71, 0x3, 0xc9, 0x4, 0xe0, 0x6, 0x2f, 0x6,
+                                                       0x9f, 0x7, 0xcc, 0x8, 0x9, 0x8, 0x4e, 0x8,
+                                                       0xce, 0x9, 0x5d, 0xb, 0x1d, 0xc, 0xf8, 0xe,
+                                                       0x27, 0xe, 0x74, 0xe, 0xe7, 0xf, 0x55, 0xf,
+                                                       0xa7, 0x10, 0x36, 0x10, 0x90, 0x10, 0xde, 0x11,
+                                                       0x71, 0x12, 0x22, 0x12, 0xaa, 0x14, 0x21, 0x14,
+                                                       0x5e, 0x14, 0xca, 0x15, 0x6f, 0x15, 0xce, 0x16,
+                                                       0x5e, 0x16, 0xe9, 0x17, 0x2d, 0x17, 0xa2, 0x18,
+                                                       0x1c, 0x18, 0xaa, 0x1a, 0x1f, 0x1a, 0x45, 0x1a,
+                                                       0x95, 0x1a, 0xfe, 0x1b, 0x34, 0x1b, 0x91, 0x1c,
+                                                       0xa, 0x1c, 0x3e, 0x1c, 0xbf, 0x1d, 0x35, 0x1d,
+                                                       0x97, 0x1d, 0xe3, 0x1e, 0x1, 0x1e, 0x56, 0x1e,
+                                                       0xbc, 0x1e, 0xfa, 0x1f, 0x45, 0x1f, 0xa3, 0x1f,
+                                                       0xcd, 0x20, 0x42, 0x20, 0xa9, 0x21, 0x14, 0x21,
+                                                       0x57, 0x21, 0x87, 0x21, 0xb7, 0x21, 0xcc, 0x22,
+                                                       0x15, 0x22, 0x5f, 0x22, 0x8f, 0x23, 0x15, 0x23,
+                                                       0x69, 0x23, 0x8f, 0x23, 0xb6, 0x24, 0x5f, 0x24,
+                                                       0xa1, 0x24, 0xf7, 0x25, 0x18, 0x25, 0x2b, 0x25,
+                                                       0x40, 0x25, 0x72, 0x25, 0xa2, 0x25, 0xc4, 0x25,
+                                                       0xf4, 0x26, 0x38, 0x26, 0xa7, 0x26, 0xfc, 0x27,
+                                                       0x3c, 0x27, 0x82, 0x27, 0xc8, 0x28, 0x22, 0x28,
+                                                       0x67, 0x28, 0xca, 0x29, 0x3f, 0x29, 0xa5, 0x29,
+                                                       0xcb, 0x2a, 0x28, 0x2a, 0x4d, 0x2a, 0x81, 0x2a,
+                                                       0xb0, 0x2a, 0xf3, 0x2b, 0x4e, 0x2b, 0xbc, 0x2b,
+                                                       0xec, 0x2c, 0x47, 0x2c, 0xb5, 0x2d, 0xc, 0x2d,
+                                                       0xcd, 0x2e, 0x37, 0x2e, 0x78, 0x2e, 0xbf, 0x2f,
+                                                       0x84, 0x2f, 0xb8, 0x2f, 0xdf, 0x30, 0x10, 0x30,
+                                                       0x2d, 0x30, 0xaf, 0x31, 0x34, 0x31, 0xf2, 0x32,
+                                                       0xcd, 0x33, 0x1a, 0x33, 0x46, 0x33, 0x7e, 0x33,
+                                                       0xb6, 0x36, 0x8, 0x36, 0xf2, 0x38, 0x52, 0x39,
+                                                       0x3f, 0x3b, 0x97, 0x3c, 0x1a, 0x3c, 0x82, 0x3c,
+                                                       0xb1, 0x3d, 0x6, 0x3d, 0x60, 0x3d, 0xb0, 0x3d,
+                                                       0xdd, 0x40, 0x4b, 0x40, 0x76, 0x40, 0xb1, 0x41,
+                                                       0x1b, 0x41, 0x81, 0x41, 0xbf, 0x42, 0x1b, 0x42,
+                                                       0xa2, 0x43, 0x2, 0x45, 0xaf, 0x45, 0xe5, 0x47,
+                                                       0xc, 0x47, 0xb8, 0x47, 0xfc, 0x48, 0x55, 0x49,
+                                                       0x91, 0x4a, 0xda, 0x4b, 0xee, 0x4c, 0xb1, 0x4e,
+                                                       0x67, 0x4f, 0x36, 0x51, 0x49, 0x51, 0x6f, 0x54,
+                                                       0xde, 0x55, 0x5e, 0x58, 0xd9, 0x59, 0xc7, 0x5a,
+                                                       0xb9, 0x5b, 0xa5, 0x5c, 0xb1, 0x5d, 0xb9, 0x5e,
+                                                       0x95, 0x60, 0xef, 0x61, 0x45, 0x62, 0xd, 0x62,
+                                                       0x38, 0x62, 0x8b, 0x62, 0x9a, 0x62, 0xcb, 0x62,
+                                                       0xf5, 0x63, 0x9, 0x63, 0x20, 0x63, 0x36, 0x63,
+                                                       0x8e, 0x63, 0xf7, 0x64, 0x17, 0x64, 0x24, 0x64,
+                                                       0x32, 0x64, 0x42, 0x64, 0x72, 0x64, 0x8c, 0x64,
+                                                       0xaa, 0x64, 0xca, 0x65, 0x2, 0x65, 0x74, 0x65,
+                                                       0xad, 0x65, 0xc5, 0x65, 0xdb, 0x66, 0xb, 0x66,
+                                                       0x3b, 0x66, 0x8f, 0x66, 0xe5, 0x67, 0x29, 0x67,
+                                                       0x6c, 0x67, 0xbf, 0x67, 0xc2, 0xfc, 0xc5, 0xe,
+                                                       0xf7, 0x1b, 0xf7, 0x18, 0x9f, 0x9d, 0xae, 0xbf,
+                                                       0xb9, 0x88, 0xa6, 0x71, 0xa6, 0xf7, 0x6a, 0xb3,
+                                                       0x64, 0xb3, 0x12, 0xf8, 0xfa, 0xac, 0xa2, 0xb1,
+                                                       0x65, 0xf7, 0x15, 0xfb, 0x13, 0xf7, 0x12, 0x9f,
+                                                       0xb5, 0x62, 0xb5, 0xbe, 0xbb, 0x5c, 0xbb, 0x13,
+                                                       0xe5, 0x34, 0xf9, 0x33, 0xf7, 0x95, 0x15, 0xbb,
+                                                       0x89, 0x9c, 0x83, 0xae, 0x6a, 0x8, 0x73, 0xa4,
+                                                       0xac, 0x77, 0xaf, 0x1b, 0x13, 0xe5, 0x32, 0xb9,
+                                                       0xbd, 0xb1, 0xbc, 0x1f, 0x13, 0xcd, 0x34, 0xba,
+                                                       0x63, 0xa3, 0x60, 0x56, 0x52, 0x78, 0x87, 0x54,
+                                                       0x1e, 0x64, 0x88, 0x5, 0x13, 0xe5, 0x34, 0xfc,
+                                                       0x64, 0xfb, 0x3e, 0x15, 0xf8, 0x42, 0x9f, 0xfb,
+                                                       0x38, 0x6, 0xf7, 0x3d, 0xf5, 0x8f, 0xc2, 0xb5,
+                                                       0xb2, 0xb2, 0xaf, 0xbc, 0xa1, 0xb5, 0xab, 0x19,
+                                                       0x13, 0xe5, 0x2c, 0xa1, 0x9c, 0x9d, 0xa3, 0xa8,
+                                                       0x1a, 0x13, 0xe3, 0x34, 0xb6, 0x65, 0xa7, 0x62,
+                                                       0x1e, 0x13, 0xe5, 0x94, 0x45, 0x67, 0x4f, 0x4d,
+                                                       0x85, 0x1f, 0x85, 0x50, 0x6f, 0x71, 0x60, 0x67,
+                                                       0xfb, 0x76, 0xfb, 0x50, 0x18, 0xfb, 0x31, 0x6,
+                                                       0xfb, 0x60, 0xcb, 0x15, 0xf8, 0x45, 0x9d, 0xf3,
+                                                       0xe2, 0x5, 0x8c, 0x7, 0xfc, 0xb0, 0x2c, 0x5,
+                                                       0xf9, 0x55, 0xf7, 0x95, 0x15, 0x13, 0xe3, 0x34,
+                                                       0xaa, 0xb0, 0xa7, 0xa8, 0x1e, 0x13, 0xe5, 0x2c,
+                                                       0xa4, 0x9f, 0x76, 0x72, 0x6c, 0x68, 0x71, 0x6e,
+                                                       0x1f, 0x13, 0xe5, 0x94, 0x73, 0x74, 0x9e, 0xa4,
+                                                       0x1f, 0x13, 0xcd, 0x54, 0xe6, 0xfb, 0x80, 0x15,
+                                                       0xac, 0xac, 0x9f, 0xa9, 0x1e, 0x13, 0xe5, 0x32,
+                                                       0xa6, 0xa3, 0x7a, 0x6e, 0x6a, 0x6c, 0x7a, 0x6d,
+                                                       0x1f, 0x13, 0xd5, 0x54, 0x71, 0x70, 0x98, 0xa9,
+                                                       0x1f, 0xfb, 0x6d, 0xaf, 0x15, 0x93, 0x90, 0x93,
+                                                       0x94, 0x94, 0x94, 0x84, 0x82, 0x83, 0x82, 0x84,
+                                                       0x83, 0x82, 0x85, 0x91, 0x94, 0x1e, 0xe, 0xfb,
+                                                       0x27, 0x92, 0x76, 0xf7, 0x4b, 0xae, 0xf7, 0xb0,
+                                                       0xaf, 0xf7, 0x49, 0x54, 0xa, 0xf7, 0x3d, 0x15,
+                                                       0xf7, 0x61, 0x6, 0xf5, 0xfb, 0x4b, 0xf5, 0xf7,
+                                                       0x4b, 0x5, 0xf7, 0x61, 0x6, 0x25, 0xf7, 0x45,
+                                                       0xf1, 0xf7, 0x46, 0x5, 0xfb, 0x61, 0x6, 0x21,
+                                                       0xf7, 0x49, 0x21, 0xfb, 0x49, 0x5, 0xfb, 0x61,
+                                                       0x6, 0xf0, 0xfb, 0x46, 0x5, 0xf8, 0x23, 0xb2,
+                                                       0x15, 0x4c, 0xf2, 0x5, 0xf7, 0xe, 0x6, 0xfb,
+                                                       0xc, 0xfb, 0xb0, 0x15, 0xc8, 0xf3, 0xc5, 0x23,
+                                                       0x5, 0xfc, 0x86, 0x16, 0xca, 0xf3, 0xc9, 0x23,
+                                                       0x5, 0x4d, 0xf7, 0x49, 0x15, 0x4f, 0xf2, 0x5,
+                                                       0xf7, 0xd, 0x6, 0xb6, 0xfb, 0xb0, 0x15, 0x39,
+                                                       0xf7, 0x22, 0xdd, 0xf7, 0x22, 0x5, 0xf7, 0x3d,
+                                                       0x6, 0xdd, 0xfb, 0x22, 0x39, 0xfb, 0x22, 0x5,
+                                                       0xfb, 0x29, 0xf7, 0xd4, 0x15, 0xcb, 0xf7, 0x3,
+                                                       0xca, 0xfb, 0x3, 0x5, 0xfb, 0xd, 0xfb, 0xf7,
+                                                       0x15, 0xf7, 0x10, 0x6, 0x49, 0xfb, 0x0, 0x5,
+                                                       0xe, 0xfb, 0x3f, 0x73, 0xa, 0xf8, 0xee, 0xfc,
+                                                       0x24, 0xeb, 0xf7, 0x65, 0xea, 0x13, 0xb0, 0xdb,
+                                                       0xf7, 0x78, 0x15, 0xf7, 0xc, 0x68, 0xa, 0x1e,
+                                                       0x13, 0xc0, 0x31, 0x54, 0x42, 0x44, 0x53, 0xa4,
+                                                       0x6a, 0x9f, 0x7f, 0x1f, 0x96, 0x85, 0x9a, 0x87,
+                                                       0x9c, 0x90, 0x8, 0x90, 0x9c, 0x95, 0x90, 0xa4,
+                                                       0x1b, 0x13, 0xb0, 0xb1, 0xa3, 0x76, 0x61, 0x59,
+                                                       0x6a, 0x4a, 0xfb, 0x16, 0x6b, 0x1f, 0x8f, 0x76,
+                                                       0x5, 0xf7, 0xc5, 0x16, 0xf7, 0xb, 0x68, 0xa,
+                                                       0x31, 0x54, 0x42, 0x44, 0x53, 0xa4, 0x6a, 0xa0,
+                                                       0x7f, 0x1e, 0x96, 0x85, 0x99, 0x87, 0x9c, 0x90,
+                                                       0x8, 0x90, 0x9d, 0x94, 0x90, 0xa5, 0x1b, 0xb0,
+                                                       0xa4, 0x76, 0x61, 0x59, 0x69, 0x4a, 0xfb, 0x16,
+                                                       0x6b, 0x1f, 0x90, 0x76, 0x5, 0xe, 0x20, 0xfb,
+                                                       0x38, 0xd6, 0xf9, 0xaa, 0x77, 0xf7, 0x25, 0x77,
+                                                       0x1, 0xf8, 0x8c, 0xa7, 0x3, 0xf7, 0x94, 0x2f,
+                                                       0x15, 0x65, 0x9d, 0xab, 0x69, 0xb6, 0x1b, 0xd5,
+                                                       0xf7, 0x1, 0xbb, 0xf7, 0x8d, 0x1f, 0xf8, 0xcc,
+                                                       0x7, 0xb7, 0xf7, 0x11, 0x40, 0x7d, 0x86, 0xfb,
+                                                       0x3, 0x5, 0x72, 0x6, 0xfb, 0x41, 0xfb, 0x22,
+                                                       0x33, 0xfb, 0x42, 0xfb, 0x4d, 0xf7, 0x3a, 0x3d,
+                                                       0xf7, 0x15, 0x91, 0x95, 0x8e, 0x99, 0xb0, 0x1f,
+                                                       0x5f, 0x7, 0xfb, 0x58, 0x34, 0x61, 0x32, 0x7b,
+                                                       0x6b, 0x90, 0x91, 0x7d, 0x1e, 0xe, 0xfb, 0xbb,
+                                                       0x92, 0x76, 0xf9, 0x64, 0x77, 0x1, 0xf7, 0xa4,
+                                                       0xf7, 0xa4, 0x15, 0x9f, 0xd2, 0xaa, 0x96, 0xcc,
+                                                       0xa8, 0x8, 0xd3, 0xa9, 0xa7, 0xc5, 0xdc, 0x1a,
+                                                       0xf7, 0x27, 0xfb, 0x1, 0x92, 0xfb, 0x5, 0x25,
+                                                       0xfb, 0x0, 0x78, 0xfb, 0x15, 0x37, 0xa4, 0x51,
+                                                       0xd6, 0x6a, 0x1e, 0xcd, 0x6e, 0xa9, 0x80, 0x9f,
+                                                       0x44, 0x8, 0xfb, 0x10, 0xfb, 0x35, 0x15, 0x47,
+                                                       0xc4, 0x52, 0xcf, 0xd1, 0xc2, 0xc4, 0xcf, 0xd1,
+                                                       0x54, 0xc2, 0x45, 0x47, 0x52, 0x54, 0x45, 0x1e,
+                                                       0xe, 0xfb, 0xbb, 0x3a, 0xa, 0xf7, 0xa3, 0xf7,
+                                                       0xa8, 0x15, 0xa4, 0xcd, 0xbe, 0xa8, 0xc8, 0xa5,
+                                                       0x8, 0xcd, 0xa8, 0xad, 0xd8, 0xd6, 0x1a, 0xd1,
+                                                       0x62, 0xc4, 0x3f, 0x4a, 0x63, 0x55, 0x52, 0x7c,
+                                                       0x1e, 0xc4, 0x7f, 0x5f, 0xc1, 0x4c, 0x1b, 0x3a,
+                                                       0x66, 0x4e, 0x42, 0x45, 0xb4, 0x3d, 0xc7, 0x71,
+                                                       0x1f, 0xc8, 0x70, 0xbe, 0x6f, 0xa3, 0x49, 0x8,
+                                                       0xfb, 0x12, 0xfb, 0x38, 0x15, 0x46, 0xc3, 0x52,
+                                                       0xd1, 0xd1, 0xc3, 0xc4, 0xd0, 0xd2, 0x53, 0xc2,
+                                                       0x45, 0x46, 0x52, 0x54, 0x44, 0x1e, 0xe, 0xd2,
+                                                       0xc8, 0x76, 0xf8, 0xf7, 0x77, 0x1, 0xf8, 0x5b,
+                                                       0xb3, 0x15, 0xb0, 0xe2, 0xe3, 0xbe, 0xe0, 0xab,
+                                                       0x8, 0xf7, 0x2d, 0xc3, 0xc4, 0xdc, 0xec, 0x1a,
+                                                       0xf7, 0xb, 0x39, 0xe3, 0xfb, 0xd, 0xfb, 0x3,
+                                                       0x40, 0x2c, 0x25, 0x6c, 0x1e, 0xf1, 0x6f, 0x3a,
+                                                       0xea, 0xfb, 0x1, 0x1b, 0xfb, 0xd, 0x3a, 0x32,
+                                                       0xfb, 0xb, 0x2e, 0xc6, 0x35, 0xe2, 0x6c, 0x1f,
+                                                       0xf7, 0x29, 0x54, 0xe3, 0x59, 0xb0, 0x33, 0x8,
+                                                       0xe, 0xd3, 0x61, 0x76, 0xcc, 0x76, 0xf8, 0xb4,
+                                                       0x77, 0xe6, 0x77, 0x1, 0xf8, 0xde, 0x96, 0x3,
+                                                       0xf7, 0x23, 0xc0, 0x15, 0xa0, 0x75, 0xf8, 0x3a,
+                                                       0xf8, 0x39, 0x8c, 0x6f, 0xfc, 0x2c, 0xfc, 0x2c,
+                                                       0x96, 0x81, 0xf8, 0x2a, 0xf8, 0x2a, 0xaf, 0x7d,
+                                                       0xfc, 0x35, 0xfc, 0x35, 0xbb, 0x5a, 0xf8, 0x43,
+                                                       0xf8, 0x43, 0xf2, 0xf7, 0x72, 0x80, 0x96, 0xfb,
+                                                       0x74, 0xfb, 0x10, 0x5, 0xb0, 0x5c, 0x15, 0x88,
+                                                       0xab, 0xf7, 0x17, 0xd8, 0x95, 0x82, 0x34, 0xfb,
+                                                       0x1d, 0x80, 0xa0, 0x5, 0xe, 0xfb, 0x40, 0x92,
+                                                       0x76, 0xf7, 0xea, 0xaf, 0xf7, 0xe9, 0x54, 0xa,
+                                                       0xf8, 0xea, 0x3, 0xf7, 0x59, 0xf7, 0xe6, 0x15,
+                                                       0x36, 0x7b, 0x3e, 0x44, 0x32, 0x1a, 0x2b, 0xd8,
+                                                       0x3b, 0xec, 0xb3, 0xaf, 0x96, 0xa3, 0xab, 0x1e,
+                                                       0xda, 0xc6, 0x88, 0xf7, 0x4, 0xd2, 0xcf, 0x8,
+                                                       0xac, 0xae, 0xbc, 0xae, 0xbc, 0x1b, 0xaf, 0x89,
+                                                       0x5, 0xb3, 0x7, 0x67, 0x89, 0x63, 0x8e, 0x61,
+                                                       0xa5, 0x69, 0xa4, 0x19, 0x3a, 0xc6, 0x8c, 0xf7,
+                                                       0x1, 0x4a, 0xcf, 0x8, 0xab, 0x6b, 0x60, 0x9e,
+                                                       0x5e, 0x1b, 0x28, 0x39, 0x40, 0x27, 0x33, 0xd8,
+                                                       0x42, 0xe0, 0x7c, 0x1f, 0xe, 0x3c, 0x81, 0xab,
+                                                       0xee, 0xa4, 0x90, 0xde, 0xf7, 0x4a, 0x94, 0x82,
+                                                       0xf7, 0x4, 0xf7, 0x0, 0xa2, 0x12, 0x9d, 0xb9,
+                                                       0xf7, 0x2b, 0xf7, 0x10, 0x60, 0x9d, 0xf7, 0x16,
+                                                       0xaf, 0x7e, 0xf7, 0x36, 0xd2, 0xb5, 0x13, 0xef,
+                                                       0x50, 0xf7, 0xce, 0xf7, 0x34, 0x15, 0x8d, 0x6,
+                                                       0x84, 0x92, 0x94, 0x89, 0x98, 0x1b, 0x9c, 0xe0,
+                                                       0x95, 0xc6, 0xd7, 0x1f, 0xc2, 0xb6, 0xbe, 0xc6,
+                                                       0xd9, 0x1a, 0xb2, 0x72, 0xb7, 0x56, 0x60, 0x6b,
+                                                       0x71, 0x6b, 0x71, 0x1e, 0x87, 0x8d, 0x5, 0x9f,
+                                                       0xaf, 0x99, 0xa5, 0xb5, 0x1a, 0xb8, 0x71, 0xde,
+                                                       0xfb, 0x9, 0xfb, 0x50, 0xfb, 0x17, 0xfb, 0x50,
+                                                       0xfb, 0x44, 0xfb, 0x2d, 0xe2, 0xfb, 0x2c, 0xf7,
+                                                       0x6b, 0xf7, 0x71, 0xf7, 0x5d, 0xf7, 0x5e, 0xf7,
+                                                       0x70, 0xf7, 0xa, 0x48, 0xd7, 0x59, 0x7f, 0x7f,
+                                                       0x84, 0x7e, 0x84, 0x1e, 0x90, 0x88, 0x97, 0x87,
+                                                       0x96, 0x84, 0x8, 0xb7, 0x6c, 0xad, 0x49, 0x33,
+                                                       0x1a, 0xfb, 0x5f, 0xfb, 0x27, 0xfb, 0x36, 0xfb,
+                                                       0x62, 0xfb, 0x45, 0x21, 0xf7, 0x1d, 0xf7, 0x3c,
+                                                       0x1e, 0x13, 0xf6, 0xb0, 0xf7, 0x22, 0xe3, 0xf7,
+                                                       0x3b, 0xf7, 0x31, 0xf3, 0xaa, 0x38, 0x5b, 0x1e,
+                                                       0x8c, 0x75, 0x87, 0x72, 0x85, 0x7a, 0x8, 0x89,
+                                                       0x6, 0xb0, 0x82, 0x76, 0xbd, 0x4a, 0x1b, 0x40,
+                                                       0x5b, 0x42, 0x45, 0x64, 0x95, 0x78, 0xa3, 0x6a,
+                                                       0x1f, 0xb1, 0x57, 0x97, 0x79, 0x88, 0x66, 0x8,
+                                                       0x69, 0x88, 0x6d, 0x84, 0x84, 0x1b, 0x67, 0x74,
+                                                       0xb6, 0xa3, 0x8d, 0x1f, 0x8c, 0x96, 0x87, 0x8e,
+                                                       0x83, 0x81, 0x8, 0x81, 0x7f, 0x87, 0x7f, 0x7c,
+                                                       0x1a, 0x69, 0xa4, 0x74, 0xaf, 0xb4, 0xa4, 0x9b,
+                                                       0xa2, 0x98, 0x1e, 0x13, 0xf7, 0x50, 0xa4, 0xf7,
+                                                       0x23, 0x15, 0xc1, 0xa9, 0xc1, 0xc6, 0x90, 0x1e,
+                                                       0x96, 0x8c, 0x8b, 0x89, 0x90, 0x85, 0x8, 0x13,
+                                                       0xf7, 0x30, 0x98, 0x7c, 0x95, 0x74, 0x6f, 0x1a,
+                                                       0x59, 0x67, 0x5b, 0x59, 0x80, 0x1e, 0x7f, 0x88,
+                                                       0x8a, 0x8c, 0x84, 0x93, 0x8, 0x7f, 0x99, 0x81,
+                                                       0xa0, 0xa7, 0x1a, 0xe, 0x3c, 0xcf, 0xf7, 0x37,
+                                                       0xfb, 0x37, 0xf7, 0x38, 0x4b, 0xca, 0xf7, 0xa,
+                                                       0xf7, 0x44, 0xca, 0x77, 0x12, 0x96, 0xe0, 0x74,
+                                                       0xcf, 0xc7, 0xa0, 0x8b, 0xdf, 0x9e, 0xac, 0xf7,
+                                                       0xed, 0xb3, 0x13, 0x9b, 0xe0, 0xf7, 0xcb, 0xf7,
+                                                       0xb5, 0x15, 0x85, 0x86, 0x75, 0x7c, 0x80, 0x7b,
+                                                       0x8, 0x7d, 0x78, 0x86, 0x77, 0x7b, 0x1a, 0x7b,
+                                                       0x92, 0x65, 0xb3, 0x67, 0x1e, 0x6a, 0xb0, 0xb5,
+                                                       0x84, 0xa1, 0x1b, 0xba, 0xbf, 0xa6, 0xb1, 0xaa,
+                                                       0x1f, 0xbb, 0xc5, 0x9a, 0x94, 0xb8, 0x96, 0xad,
+                                                       0x93, 0xa8, 0x9d, 0x9d, 0x99, 0x8, 0x9a, 0x98,
+                                                       0x93, 0xa0, 0x98, 0x1a, 0xa2, 0x7f, 0x9c, 0x78,
+                                                       0x7a, 0x81, 0x7c, 0x83, 0x87, 0x1e, 0x88, 0x84,
+                                                       0x8e, 0x85, 0x8f, 0x8a, 0x8, 0x93, 0x88, 0x95,
+                                                       0x84, 0x7f, 0x1a, 0x79, 0x7d, 0x7e, 0x77, 0x79,
+                                                       0x6a, 0x8e, 0xf2, 0x64, 0x1e, 0x85, 0x9b, 0x85,
+                                                       0x9b, 0x85, 0x99, 0x8, 0xd5, 0x6d, 0x6d, 0xbe,
+                                                       0x3b, 0x1b, 0x6f, 0x6a, 0x7e, 0x73, 0x75, 0x1f,
+                                                       0x77, 0x75, 0x7f, 0x6d, 0x6d, 0x1a, 0x6e, 0x9a,
+                                                       0x6c, 0x8f, 0x85, 0x1e, 0x8e, 0x85, 0x8b, 0x88,
+                                                       0x87, 0x88, 0x85, 0x8a, 0x84, 0x8c, 0x85, 0x8c,
+                                                       0x7e, 0x8c, 0x6a, 0x95, 0x6b, 0xa1, 0x8, 0x9a,
+                                                       0x82, 0x9c, 0x83, 0x97, 0x1e, 0x83, 0x96, 0x85,
+                                                       0x8f, 0x73, 0x85, 0x8, 0x78, 0x99, 0x7f, 0x9d,
+                                                       0xaa, 0x1a, 0xaa, 0x91, 0x99, 0x91, 0x9a, 0x1e,
+                                                       0x90, 0x95, 0x8e, 0x90, 0x82, 0x96, 0x8, 0x99,
+                                                       0x81, 0x7e, 0x95, 0x82, 0x1b, 0x70, 0x77, 0x59,
+                                                       0x75, 0x82, 0x8f, 0x78, 0xab, 0x60, 0x1f, 0xa7,
+                                                       0x67, 0xad, 0x6b, 0xa9, 0x74, 0x8d, 0x73, 0x85,
+                                                       0x68, 0x7a, 0x6d, 0x8, 0x74, 0x7e, 0x77, 0x80,
+                                                       0x78, 0x1b, 0x13, 0x3d, 0xe0, 0x72, 0x84, 0x9f,
+                                                       0x99, 0x94, 0x8b, 0x89, 0x89, 0x8e, 0x1f, 0x90,
+                                                       0x84, 0x81, 0x91, 0x7e, 0x1b, 0x6f, 0x72, 0x72,
+                                                       0x6b, 0x68, 0xab, 0x71, 0xb0, 0xa0, 0xa0, 0x90,
+                                                       0x9d, 0xa4, 0x1f, 0xb7, 0xab, 0xab, 0xcb, 0x8a,
+                                                       0xbe, 0x9d, 0x81, 0xbb, 0x77, 0x95, 0x88, 0x98,
+                                                       0x86, 0x87, 0x84, 0x8f, 0x87, 0x8, 0xbd, 0x8e,
+                                                       0x15, 0x87, 0x96, 0x8b, 0x8d, 0x91, 0x92, 0x8,
+                                                       0x9e, 0x9b, 0x9f, 0x9d, 0xb4, 0x1b, 0xbc, 0xaa,
+                                                       0x61, 0x67, 0x97, 0x1f, 0x8e, 0x83, 0x8a, 0x88,
+                                                       0x85, 0x87, 0x8, 0x13, 0x5d, 0xe0, 0x7d, 0x7a,
+                                                       0x6d, 0x81, 0x6b, 0x1b, 0x58, 0x6e, 0xb0, 0xa2,
+                                                       0x83, 0x1f, 0xe, 0xfb, 0x69, 0xa0, 0x76, 0xf9,
+                                                       0x7a, 0x77, 0x1, 0xf7, 0xba, 0xb1, 0x3, 0xf7,
+                                                       0x6e, 0x16, 0xea, 0x6, 0xea, 0x96, 0x6, 0x5f,
+                                                       0xcc, 0x70, 0xf5, 0x86, 0xf7, 0x20, 0x8, 0x93,
+                                                       0x6, 0x8f, 0x75, 0x5, 0x4b, 0x97, 0xbd, 0x64,
+                                                       0xbb, 0x1b, 0xbb, 0xcd, 0xa8, 0xe7, 0xb4, 0x74,
+                                                       0xae, 0x6f, 0xa7, 0x1f, 0x6d, 0xa9, 0x68, 0xa2,
+                                                       0x79, 0xa0, 0x61, 0xba, 0x57, 0xd8, 0x79, 0xf7,
+                                                       0xc, 0x82, 0x8d, 0x18, 0x82, 0x89, 0x79, 0xfb,
+                                                       0xc, 0x57, 0x3e, 0x61, 0x5c, 0x19, 0x78, 0x76,
+                                                       0x65, 0x72, 0x6d, 0x6b, 0x8, 0x71, 0x6f, 0x76,
+                                                       0x6b, 0x63, 0x1a, 0x2f, 0xcd, 0x6e, 0xbb, 0xbb,
+                                                       0xbd, 0xb2, 0xcb, 0x97, 0x1e, 0x8f, 0xa1, 0x5,
+                                                       0x93, 0x6, 0x86, 0xfb, 0x20, 0x70, 0x21, 0x5f,
+                                                       0x4a, 0x8, 0xe, 0xf7, 0xd, 0xf7, 0x2e, 0x76,
+                                                       0xf7, 0xb7, 0xda, 0x43, 0xd3, 0xa9, 0x77, 0x12,
+                                                       0x13, 0xd0, 0xf8, 0x25, 0xf7, 0xd7, 0x15, 0xf7,
+                                                       0x6e, 0x42, 0xb5, 0x91, 0xb0, 0xc1, 0x5, 0xad,
+                                                       0x7, 0x52, 0xd4, 0xb9, 0x8d, 0xb9, 0x8d, 0xb9,
+                                                       0x8e, 0x19, 0x13, 0xb0, 0xaf, 0x8d, 0xaf, 0x8e,
+                                                       0xaf, 0x8d, 0x8, 0xa2, 0x8d, 0x9e, 0x95, 0xa4,
+                                                       0x1a, 0xa5, 0x76, 0x95, 0x73, 0x1e, 0xfc, 0x3,
+                                                       0x8a, 0xd2, 0x3f, 0x5, 0x8e, 0x88, 0x8d, 0x7b,
+                                                       0x87, 0x1a, 0x83, 0x89, 0x81, 0x85, 0x85, 0x1e,
+                                                       0xc2, 0x6f, 0x89, 0x81, 0x3b, 0x93, 0x7b, 0x8d,
+                                                       0x82, 0x8a, 0x7c, 0x8e, 0x19, 0x74, 0x8f, 0x65,
+                                                       0x98, 0x73, 0x91, 0x8, 0x74, 0x88, 0x81, 0x79,
+                                                       0x76, 0x1a, 0x87, 0x8b, 0x87, 0x8c, 0x87, 0x1e,
+                                                       0x8e, 0x33, 0x15, 0xf7, 0x22, 0x55, 0x9d, 0x8e,
+                                                       0xaa, 0xc5, 0xfb, 0x5c, 0xce, 0x5, 0x81, 0x86,
+                                                       0x85, 0x82, 0x80, 0x1a, 0x7a, 0x99, 0x78, 0x96,
+                                                       0x7e, 0x1e, 0xfb, 0xf4, 0x67, 0x15, 0xf7, 0x22,
+                                                       0x98, 0x9e, 0x82, 0xd6, 0x67, 0x9a, 0x87, 0x19,
+                                                       0x91, 0x89, 0xd6, 0x84, 0x96, 0x8a, 0x8, 0x7f,
+                                                       0x97, 0x7c, 0x9d, 0x9d, 0x1a, 0x98, 0x93, 0x95,
+                                                       0x96, 0x91, 0x1e, 0x7f, 0x9b, 0x7f, 0x9f, 0xa0,
+                                                       0x1a, 0x92, 0x8d, 0x92, 0x8e, 0x91, 0x1e, 0x7d,
+                                                       0x6f, 0x6c, 0x84, 0x6c, 0x1b, 0x7b, 0x7c, 0x8d,
+                                                       0x8e, 0x7c, 0x1f, 0x8e, 0x9b, 0x5, 0x88, 0x9a,
+                                                       0x9a, 0x8a, 0x9b, 0x1b, 0xb1, 0xad, 0x95, 0xa0,
+                                                       0xaa, 0x1f, 0xab, 0x9f, 0xa2, 0xab, 0x8f, 0x1e,
+                                                       0xdb, 0x75, 0x34, 0xc8, 0x4e, 0x79, 0x87, 0x9a,
+                                                       0xc4, 0x9c, 0x95, 0xb5, 0x9b, 0x86, 0x81, 0x66,
+                                                       0xe3, 0x4d, 0x5, 0x89, 0x8d, 0x9a, 0x8a, 0x8f,
+                                                       0x1b, 0x9d, 0x97, 0x8e, 0x9e, 0x1f, 0x90, 0x8a,
+                                                       0x90, 0x90, 0x1a, 0x20, 0xf7, 0x1, 0xfb, 0x33,
+                                                       0x91, 0xfb, 0x17, 0xfb, 0xf, 0xfb, 0x17, 0x8f,
+                                                       0x5, 0x78, 0x6e, 0x82, 0x68, 0x68, 0x1a, 0x62,
+                                                       0x97, 0x63, 0xa0, 0x68, 0x1e, 0xf8, 0x4, 0x58,
+                                                       0x15, 0xbd, 0x7c, 0xa9, 0x9b, 0xa0, 0xa3, 0xfb,
+                                                       0xe, 0xba, 0x5, 0x83, 0x88, 0x86, 0x84, 0x82,
+                                                       0x1a, 0x78, 0x9f, 0x75, 0x99, 0x7f, 0x1e, 0xe,
+                                                       0xfb, 0x25, 0x92, 0x76, 0xf9, 0x4d, 0x77, 0x1,
+                                                       0xf7, 0xef, 0x7d, 0x15, 0xa8, 0xf3, 0xf2, 0xf7,
+                                                       0x25, 0xd8, 0xec, 0x8, 0xc2, 0xd0, 0xbb, 0xcb,
+                                                       0xe8, 0x1a, 0xe0, 0x49, 0xc9, 0x36, 0x3a, 0x4c,
+                                                       0x3d, 0x3f, 0x7a, 0x1e, 0xda, 0x76, 0x52, 0xd6,
+                                                       0x33, 0x1b, 0x3a, 0x4a, 0x49, 0x39, 0x33, 0xc4,
+                                                       0x42, 0xc0, 0x4a, 0x1f, 0xe0, 0x23, 0xe8, 0xfb,
+                                                       0x1d, 0xa3, 0x23, 0x8, 0xe, 0xfb, 0x88, 0x94,
+                                                       0x76, 0xf9, 0x86, 0x77, 0x1, 0xcb, 0xf8, 0x66,
+                                                       0x3, 0xf7, 0xb4, 0x81, 0x15, 0x94, 0x89, 0x94,
+                                                       0x8d, 0xa5, 0xf7, 0x39, 0xf1, 0xf7, 0x22, 0xe9,
+                                                       0xc6, 0x19, 0x8d, 0x94, 0x89, 0x94, 0x2d, 0xc6,
+                                                       0x25, 0xf7, 0x22, 0x71, 0xf7, 0x39, 0x19, 0x82,
+                                                       0x8d, 0x82, 0x89, 0x71, 0xfb, 0x39, 0x25, 0xfb,
+                                                       0x22, 0x2d, 0x50, 0x19, 0x89, 0x82, 0x8d, 0x82,
+                                                       0xe9, 0x50, 0xf1, 0xfb, 0x22, 0xa5, 0xfb, 0x39,
+                                                       0x19, 0xe, 0x4c, 0xa0, 0x76, 0xf7, 0xd0, 0xad,
+                                                       0xf7, 0xf2, 0x77, 0x12, 0xf8, 0x5, 0xb1, 0x66,
+                                                       0xaf, 0x13, 0xf0, 0xf7, 0xb9, 0x16, 0xea, 0x6,
+                                                       0xea, 0x96, 0x6, 0x5f, 0xcb, 0x71, 0xf3, 0x85,
+                                                       0xf7, 0x1d, 0x8, 0x9a, 0x6, 0x48, 0x93, 0xc4,
+                                                       0x58, 0xd0, 0x1b, 0xd6, 0xc7, 0xc7, 0xd6, 0xd6,
+                                                       0x4f, 0xc7, 0x40, 0x46, 0x52, 0x58, 0x48, 0x83,
+                                                       0x1f, 0x13, 0xe8, 0x7b, 0x6, 0x94, 0x8b, 0x94,
+                                                       0x94, 0x1a, 0xc1, 0x7, 0xcd, 0x94, 0xbe, 0xc4,
+                                                       0xcf, 0x1a, 0xd6, 0x4f, 0xc7, 0x40, 0x40, 0x4f,
+                                                       0x4f, 0x40, 0x47, 0xbe, 0x52, 0xcd, 0x82, 0x1e,
+                                                       0x55, 0x7, 0x82, 0x8b, 0x82, 0x82, 0x1a, 0x7b,
+                                                       0x6, 0xce, 0x83, 0x52, 0xbe, 0x46, 0x1b, 0x40,
+                                                       0x4f, 0x4f, 0x40, 0x40, 0xc7, 0x4f, 0xd6, 0xd0,
+                                                       0xc4, 0xbe, 0xce, 0x93, 0x1f, 0x13, 0xf0, 0x9a,
+                                                       0x6, 0x85, 0xfb, 0x1d, 0x71, 0x23, 0x5f, 0x4b,
+                                                       0x8, 0xe, 0xfb, 0x29, 0xf7, 0x33, 0x76, 0xb3,
+                                                       0xf7, 0xe4, 0xfb, 0x8f, 0xf7, 0x39, 0xf7, 0x11,
+                                                       0x77, 0x12, 0xc1, 0xf8, 0xa, 0xfb, 0x37, 0xf8,
+                                                       0x1a, 0xfb, 0xcc, 0xf7, 0xcc, 0x13, 0xb2, 0xae,
+                                                       0xf7, 0x1e, 0x15, 0xf9, 0x0, 0xf8, 0x33, 0xfd,
+                                                       0x0, 0x6, 0x13, 0xd8, 0xf8, 0x1d, 0xfb, 0x6e,
+                                                       0x15, 0xa2, 0x7, 0xf7, 0x64, 0xf7, 0x30, 0x5,
+                                                       0xfb, 0xe4, 0x7, 0xfc, 0xda, 0x76, 0x15, 0x13,
+                                                       0xb4, 0xf7, 0x67, 0xf7, 0x34, 0x5, 0x68, 0x99,
+                                                       0xa9, 0x78, 0xb1, 0x1b, 0xaf, 0xa7, 0xa1, 0xab,
+                                                       0x98, 0x1f, 0xf7, 0x66, 0xfb, 0x34, 0x5, 0x13,
+                                                       0xb8, 0x13, 0xb4, 0xfc, 0x5, 0xf7, 0x6e, 0x15,
+                                                       0x13, 0xb8, 0xfb, 0x67, 0xf7, 0x36, 0x5, 0xf8,
+                                                       0xda, 0x6, 0xfb, 0x69, 0xfb, 0x36, 0x5, 0x13,
+                                                       0xb2, 0xad, 0x7e, 0x6d, 0x9e, 0x66, 0x1b, 0x13,
+                                                       0xd4, 0x6a, 0x69, 0x75, 0x6c, 0x80, 0x1f, 0x13,
+                                                       0xd8, 0xfb, 0x67, 0xfb, 0x59, 0x15, 0xf7, 0xe4,
+                                                       0x7, 0xf7, 0x63, 0xfb, 0x30, 0x5, 0x74, 0x7,
+                                                       0xe, 0x5b, 0xf7, 0x23, 0x9f, 0xc3, 0x9f, 0x84,
+                                                       0x99, 0x8a, 0x9f, 0xa7, 0x9f, 0x95, 0x9f, 0x8f,
+                                                       0x9f, 0xed, 0xa3, 0xf3, 0x77, 0x12, 0xf7, 0x1f,
+                                                       0x9f, 0x80, 0x9f, 0xf7, 0x5f, 0x99, 0xab, 0x9f,
+                                                       0x96, 0xa9, 0xda, 0x9f, 0x93, 0xa5, 0x13, 0xdf,
+                                                       0xdf, 0x8d, 0xf8, 0x12, 0x15, 0xce, 0x72, 0x5,
+                                                       0x7b, 0x8c, 0x95, 0x79, 0xa1, 0x1b, 0x99, 0x95,
+                                                       0x90, 0x91, 0x92, 0x1f, 0x91, 0x8a, 0x5, 0x73,
+                                                       0x9a, 0x7b, 0xa2, 0x96, 0x94, 0x8e, 0x90, 0x94,
+                                                       0x1e, 0x8c, 0x8a, 0x77, 0x7d, 0x7f, 0x7a, 0x85,
+                                                       0x75, 0x19, 0x13, 0xdf, 0xbf, 0x81, 0x7e, 0x80,
+                                                       0x7b, 0x76, 0x1a, 0x67, 0xa6, 0x79, 0xa4, 0xad,
+                                                       0xb0, 0x9e, 0xa5, 0xab, 0x1e, 0xd8, 0xcb, 0xb0,
+                                                       0x92, 0x5, 0x75, 0x8e, 0x9a, 0x79, 0xa7, 0x1b,
+                                                       0x13, 0xaf, 0xdf, 0xa0, 0x9d, 0x99, 0x98, 0x98,
+                                                       0x1f, 0xa9, 0xaa, 0x97, 0x8d, 0x5, 0x13, 0xdf,
+                                                       0xbf, 0x76, 0x8f, 0x9e, 0x7e, 0x9e, 0x1b, 0xa7,
+                                                       0xa6, 0xaa, 0x9f, 0x9d, 0x1f, 0xaf, 0x91, 0xdd,
+                                                       0xc2, 0x5, 0x99, 0x7, 0xfb, 0x79, 0x84, 0x34,
+                                                       0x90, 0x94, 0x9a, 0x94, 0x99, 0x92, 0x9b, 0x19,
+                                                       0xcf, 0xa6, 0xbc, 0xbc, 0x8a, 0x8f, 0x29, 0x82,
+                                                       0xab, 0xf5, 0x87, 0x8d, 0x3d, 0x60, 0x66, 0x48,
+                                                       0x5d, 0x94, 0x59, 0x74, 0x5, 0x88, 0x7, 0xcd,
+                                                       0x69, 0x78, 0x74, 0x6e, 0x7c, 0x72, 0x7b, 0x19,
+                                                       0xfb, 0xa1, 0xbe, 0x53, 0x6b, 0x5, 0x86, 0x8b,
+                                                       0x86, 0x86, 0x1a, 0xf8, 0xd3, 0x31, 0x15, 0x93,
+                                                       0x8c, 0x5, 0x7f, 0x8f, 0x85, 0x94, 0x93, 0x90,
+                                                       0x95, 0x97, 0x1e, 0xb3, 0x90, 0x5, 0x7b, 0x7c,
+                                                       0x76, 0x76, 0x7b, 0x1b, 0x7a, 0x84, 0x97, 0x9a,
+                                                       0x8d, 0x1f, 0xfb, 0x54, 0x78, 0x15, 0x86, 0xa5,
+                                                       0xa9, 0xa2, 0xb2, 0xa7, 0xf7, 0x4, 0x85, 0x18,
+                                                       0xf7, 0x4b, 0x91, 0x5c, 0x6d, 0xfb, 0x9a, 0x67,
+                                                       0x7e, 0x89, 0x77, 0x86, 0x7a, 0x87, 0x19, 0xad,
+                                                       0xf7, 0x40, 0x15, 0x61, 0xa1, 0x94, 0x8f, 0xb6,
+                                                       0x83, 0x5, 0x93, 0xfb, 0x52, 0x15, 0x96, 0x8c,
+                                                       0x5, 0x7f, 0x89, 0x8f, 0x80, 0x96, 0x1b, 0x97,
+                                                       0x91, 0x96, 0x9b, 0x8a, 0x1f, 0xbb, 0x92, 0x72,
+                                                       0x72, 0x5, 0x81, 0x81, 0x7e, 0x80, 0x7c, 0x1b,
+                                                       0x74, 0x86, 0x9d, 0x9b, 0x8d, 0x1f, 0xfb, 0x8c,
+                                                       0x6b, 0x15, 0x86, 0x92, 0x96, 0x87, 0x9d, 0x1b,
+                                                       0xa1, 0x84, 0x94, 0xa4, 0x6d, 0x81, 0x71, 0x95,
+                                                       0x83, 0x8e, 0x19, 0x97, 0xa8, 0xa6, 0x97, 0xa6,
+                                                       0x9c, 0xeb, 0xc7, 0x18, 0x9d, 0x96, 0x9c, 0x97,
+                                                       0x9a, 0x99, 0xa0, 0xa0, 0x95, 0xa3, 0x9a, 0xa5,
+                                                       0xab, 0xc3, 0x18, 0xae, 0x9e, 0x6f, 0x2f, 0xd9,
+                                                       0x92, 0x80, 0x80, 0x43, 0x6f, 0x80, 0x70, 0x7b,
+                                                       0x73, 0x7b, 0x73, 0x19, 0x63, 0x70, 0x66, 0x6d,
+                                                       0x92, 0x6e, 0x3b, 0x49, 0x18, 0x78, 0x74, 0x68,
+                                                       0x76, 0x6a, 0x1b, 0x13, 0xaf, 0xdf, 0x7a, 0x7c,
+                                                       0x98, 0xa0, 0x9e, 0x96, 0x99, 0x95, 0x96, 0x1f,
+                                                       0xc5, 0xd6, 0x15, 0xfb, 0x6a, 0xd7, 0xa7, 0x9b,
+                                                       0xf7, 0x93, 0x5b, 0x5, 0xfb, 0x31, 0x73, 0x15,
+                                                       0xb5, 0x7c, 0x5, 0x86, 0x84, 0x83, 0x88, 0x82,
+                                                       0x1b, 0x7d, 0x85, 0x96, 0x97, 0x8d, 0x1f, 0x45,
+                                                       0xa3, 0x15, 0xaa, 0x80, 0x5, 0x87, 0x86, 0x86,
+                                                       0x89, 0x83, 0x1b, 0x81, 0x88, 0x93, 0x94, 0x1f,
+                                                       0xe, 0x5a, 0xaf, 0x9f, 0xbd, 0xc5, 0xc0, 0xf5,
+                                                       0x29, 0xf7, 0x3, 0x61, 0xe7, 0x9d, 0xea, 0x9d,
+                                                       0x9f, 0x93, 0xcd, 0x84, 0xca, 0x12, 0xc9, 0xa3,
+                                                       0x80, 0xb6, 0x76, 0xa0, 0xf8, 0xd1, 0x9f, 0x13,
+                                                       0xe6, 0xd8, 0xcc, 0xf8, 0xa1, 0x15, 0xaf, 0x97,
+                                                       0xb8, 0xb6, 0xeb, 0x1b, 0xc1, 0xcd, 0x7c, 0x7d,
+                                                       0xcc, 0x1f, 0x13, 0xe7, 0x58, 0x7c, 0xce, 0xce,
+                                                       0x7c, 0xbc, 0x1b, 0xc8, 0xbe, 0xa4, 0xa1, 0xa9,
+                                                       0x1f, 0x78, 0xd3, 0x5, 0x71, 0x6d, 0x61, 0x70,
+                                                       0x57, 0x1b, 0x54, 0x4f, 0x98, 0x99, 0x4e, 0x1f,
+                                                       0x13, 0xe6, 0xd8, 0x99, 0x4c, 0x4b, 0x9a, 0x4e,
+                                                       0x1b, 0xfb, 0x7, 0x5c, 0x50, 0x53, 0x82, 0x8f,
+                                                       0x82, 0x8d, 0x82, 0x1f, 0xb6, 0xfb, 0x83, 0x15,
+                                                       0x85, 0x7b, 0x86, 0x80, 0x70, 0x1a, 0x2f, 0xf7,
+                                                       0x3, 0x23, 0xf7, 0x58, 0xf7, 0x3f, 0xf7, 0x1c,
+                                                       0xde, 0xf7, 0x9, 0xa2, 0x86, 0x96, 0x85, 0x9b,
+                                                       0x1e, 0x8b, 0x96, 0xaa, 0xa2, 0x1a, 0xf7, 0x1,
+                                                       0xfb, 0x18, 0xe3, 0xfb, 0x44, 0x22, 0x3a, 0x6b,
+                                                       0x66, 0x5c, 0x1e, 0x69, 0x95, 0x62, 0xa2, 0x82,
+                                                       0xad, 0x8, 0x13, 0xe7, 0x28, 0x85, 0x86, 0x86,
+                                                       0x7f, 0x80, 0x1a, 0x5e, 0x9e, 0x73, 0xa8, 0x7a,
+                                                       0x1e, 0x13, 0xe7, 0x58, 0x7a, 0x71, 0x82, 0x78,
+                                                       0x67, 0x1a, 0x72, 0x8e, 0x7f, 0x93, 0x7a, 0x1e,
+                                                       0x95, 0xc1, 0x15, 0xed, 0xf7, 0x13, 0xda, 0xf7,
+                                                       0x32, 0xf7, 0x32, 0xf7, 0x16, 0x3c, 0x29, 0x2a,
+                                                       0xfb, 0x16, 0x3c, 0xfb, 0x32, 0xfb, 0x32, 0xfb,
+                                                       0x13, 0xda, 0xec, 0x1e, 0x93, 0x48, 0x15, 0x97,
+                                                       0x77, 0xa4, 0x71, 0x9e, 0x7e, 0x8, 0x79, 0x87,
+                                                       0x7f, 0x8a, 0x83, 0x1a, 0x6e, 0xd1, 0x4c, 0xa6,
+                                                       0x94, 0x94, 0x92, 0x96, 0x96, 0x1e, 0x83, 0xa7,
+                                                       0xc5, 0x7e, 0xc2, 0x1b, 0xc0, 0xc1, 0x9d, 0x97,
+                                                       0x9f, 0x1f, 0x92, 0x85, 0x9e, 0x77, 0x99, 0x94,
+                                                       0x9d, 0x96, 0x9c, 0x99, 0x9a, 0x9f, 0x8, 0x99,
+                                                       0x9e, 0x93, 0x9c, 0x98, 0x1a, 0x90, 0x85, 0x91,
+                                                       0x83, 0x90, 0x1e, 0x98, 0x95, 0x9c, 0x9f, 0x93,
+                                                       0x99, 0x8, 0x90, 0x83, 0x8e, 0x7d, 0x78, 0x1a,
+                                                       0x2b, 0xfb, 0x13, 0x3b, 0xfb, 0x35, 0xfb, 0x33,
+                                                       0xfb, 0x11, 0xdc, 0xe8, 0x9e, 0x8f, 0x9b, 0x8f,
+                                                       0x93, 0x1e, 0xf7, 0x82, 0xf7, 0x1c, 0x15, 0x8e,
+                                                       0x86, 0x94, 0x8a, 0x91, 0x8d, 0x96, 0x8d, 0xa6,
+                                                       0x8c, 0x9b, 0x87, 0x97, 0x88, 0x8f, 0x8e, 0x8f,
+                                                       0x90, 0xbf, 0xcf, 0x18, 0x90, 0x92, 0x85, 0x8d,
+                                                       0x81, 0x8d, 0x55, 0x97, 0x66, 0x8f, 0x44, 0x80,
+                                                       0x82, 0x8a, 0x85, 0x85, 0x8e, 0x87, 0x8, 0xf7,
+                                                       0x37, 0xfb, 0x5a, 0x15, 0xdc, 0x54, 0x94, 0x85,
+                                                       0x91, 0x8d, 0x92, 0x90, 0x19, 0xb1, 0xa5, 0x9e,
+                                                       0x9f, 0x98, 0xb7, 0x8, 0x91, 0x8d, 0x86, 0x90,
+                                                       0x82, 0x1b, 0x13, 0xd7, 0x58, 0xfb, 0x10, 0x90,
+                                                       0x5, 0x81, 0x87, 0x87, 0x87, 0x1f, 0x8a, 0x83,
+                                                       0x82, 0x7d, 0x7e, 0x82, 0x82, 0x86, 0x8e, 0x87,
+                                                       0x91, 0x87, 0x8, 0xfb, 0x31, 0xc3, 0x15, 0x13,
+                                                       0xcf, 0x58, 0x72, 0xad, 0x76, 0xb4, 0xb4, 0xad,
+                                                       0xa0, 0xa4, 0xa4, 0x69, 0xa0, 0x62, 0x62, 0x69,
+                                                       0x76, 0x72, 0x1e, 0x2f, 0xfb, 0xc, 0x15, 0x93,
+                                                       0x87, 0x95, 0x8b, 0x8f, 0x8f, 0xd6, 0xc8, 0x18,
+                                                       0x91, 0x90, 0x87, 0x8f, 0x85, 0x8e, 0x82, 0x90,
+                                                       0x7b, 0x98, 0x87, 0x95, 0x88, 0x93, 0x85, 0x8c,
+                                                       0x82, 0x8a, 0xfb, 0xc, 0x7f, 0x18, 0x7e, 0x8a,
+                                                       0xe0, 0x31, 0x8d, 0x85, 0x9a, 0x69, 0x46, 0xcb,
+                                                       0xc1, 0x6d, 0x8, 0xe, 0xef, 0xf7, 0x2c, 0x76,
+                                                       0xd1, 0xa5, 0xf7, 0x3d, 0xa5, 0x78, 0xa4, 0xbd,
+                                                       0xa3, 0x90, 0xa4, 0x8f, 0x77, 0x12, 0x9f, 0xa4,
+                                                       0x13, 0xed, 0xc2, 0xf7, 0x57, 0x15, 0xf7, 0x1f,
+                                                       0x98, 0xf1, 0x5c, 0xde, 0x84, 0xda, 0x74, 0xad,
+                                                       0x9b, 0x9e, 0xa4, 0xb6, 0x96, 0xab, 0xc5, 0xc8,
+                                                       0x93, 0xb2, 0xc6, 0x5, 0xb3, 0x7, 0x5d, 0xc0,
+                                                       0xf7, 0x7, 0x8f, 0xf7, 0x5, 0x91, 0x5, 0xa4,
+                                                       0x8c, 0x9f, 0x9f, 0xa2, 0x1a, 0xa3, 0x74, 0x9e,
+                                                       0x6a, 0x8c, 0x1e, 0xfb, 0xf7, 0x91, 0x73, 0xa3,
+                                                       0x5, 0x13, 0xeb, 0xfb, 0x46, 0x92, 0xfb, 0xe,
+                                                       0xfb, 0xa, 0xfb, 0x13, 0x90, 0x5, 0x75, 0x69,
+                                                       0x82, 0x66, 0x65, 0x1a, 0x8c, 0x62, 0x97, 0x61,
+                                                       0xa1, 0x67, 0x8, 0xf7, 0xe5, 0xf7, 0x16, 0x15,
+                                                       0x87, 0xa1, 0x90, 0xa3, 0xa8, 0x90, 0xdb, 0x75,
+                                                       0x18, 0xf7, 0x5, 0x7f, 0x8d, 0x95, 0x57, 0xa6,
+                                                       0x95, 0x95, 0x89, 0xa2, 0x86, 0x95, 0x19, 0x56,
+                                                       0xc5, 0xf7, 0xe5, 0x88, 0x5, 0xa2, 0x97, 0x81,
+                                                       0x7e, 0x7f, 0x83, 0x81, 0x75, 0x8a, 0x1f, 0x25,
+                                                       0x86, 0xfb, 0x32, 0x84, 0xcb, 0x3b, 0x5, 0x74,
+                                                       0x7, 0x6e, 0x5f, 0x4f, 0x83, 0x5, 0xfb, 0x46,
+                                                       0x74, 0x15, 0x78, 0xa2, 0x78, 0xab, 0xa9, 0x9a,
+                                                       0xf7, 0x45, 0x51, 0x18, 0x72, 0x5a, 0x6e, 0x85,
+                                                       0x5, 0xfc, 0x4c, 0xa3, 0x15, 0x7b, 0xa8, 0x83,
+                                                       0xab, 0xaa, 0x1a, 0xaa, 0x91, 0xa9, 0x98, 0xa3,
+                                                       0x1e, 0xf7, 0x10, 0x85, 0xf7, 0xe, 0xf7, 0xa,
+                                                       0xf7, 0x35, 0x83, 0xdf, 0x32, 0x90, 0x83, 0x89,
+                                                       0x7b, 0x87, 0x89, 0x19, 0x7f, 0x81, 0x7d, 0x8b,
+                                                       0x78, 0x8f, 0x37, 0xc5, 0x18, 0x95, 0xaf, 0x7c,
+                                                       0x8f, 0x82, 0x63, 0x55, 0x7c, 0x8f, 0x7c, 0x5,
+                                                       0x13, 0xdd, 0xc4, 0x9d, 0xdd, 0x50, 0x3f, 0xa0,
+                                                       0x6d, 0x88, 0x77, 0x73, 0x8c, 0x6f, 0x19, 0x60,
+                                                       0x6e, 0x5e, 0x84, 0x57, 0x95, 0x89, 0x7c, 0x18,
+                                                       0xb7, 0x83, 0xb7, 0x8e, 0xb3, 0x9f, 0x81, 0x78,
+                                                       0x92, 0x6f, 0xa0, 0x72, 0x72, 0x7b, 0x90, 0x75,
+                                                       0x98, 0x78, 0x46, 0x91, 0x18, 0x23, 0xba, 0x5,
+                                                       0xf7, 0x59, 0x51, 0x15, 0x7d, 0x99, 0x7a, 0xa7,
+                                                       0xa4, 0x96, 0xf1, 0x63, 0x18, 0x7a, 0x77, 0x78,
+                                                       0x81, 0x5, 0xe, 0x7d, 0xae, 0xe5, 0xab, 0xf7,
+                                                       0xe3, 0x9c, 0xf7, 0x43, 0x4c, 0xa, 0xf7, 0xb2,
+                                                       0xe7, 0xf7, 0xa3, 0xae, 0x17, 0xae, 0xf7, 0xee,
+                                                       0x37, 0xa, 0x13, 0x6c, 0x33, 0xa, 0x1f, 0xf7,
+                                                       0x5e, 0x6b, 0xa, 0xf7, 0x9c, 0xa9, 0x6, 0x57,
+                                                       0x8f, 0x5, 0x65, 0x8e, 0x8d, 0x97, 0xa7, 0x1a,
+                                                       0xf8, 0x1d, 0x56, 0x7, 0x67, 0x5a, 0x64, 0x6f,
+                                                       0x4d, 0x82, 0x8, 0x7a, 0xc5, 0x7, 0xb5, 0x89,
+                                                       0x89, 0x61, 0x1f, 0xfb, 0x8a, 0x7, 0x74, 0x81,
+                                                       0x79, 0x72, 0x89, 0x1e, 0x5a, 0x87, 0x5, 0xe,
+                                                       0x7d, 0xae, 0x68, 0xf7, 0x11, 0xf8, 0x70, 0xf7,
+                                                       0xa, 0x68, 0x4c, 0xa, 0x68, 0xf7, 0x53, 0xf7,
+                                                       0xdc, 0xf7, 0x5c, 0xfb, 0x51, 0xf7, 0x51, 0x68,
+                                                       0xae, 0x13, 0x98, 0x80, 0x22, 0xa, 0x13, 0x66,
+                                                       0x0, 0xf7, 0x30, 0x6b, 0xa, 0xa2, 0x7, 0xd4,
+                                                       0xbd, 0xc1, 0xc2, 0xb4, 0x1e, 0xc1, 0xb3, 0xcb,
+                                                       0xbb, 0xd6, 0x1a, 0xb3, 0x7c, 0xb8, 0x5c, 0x7b,
+                                                       0x6a, 0x7b, 0x78, 0x1e, 0x7f, 0x91, 0x81, 0x7f,
+                                                       0x1a, 0x71, 0x76, 0x77, 0x71, 0x6c, 0x78, 0xa3,
+                                                       0xa9, 0xa7, 0x99, 0xa1, 0xa0, 0x9c, 0x1e, 0xa4,
+                                                       0xaa, 0xb2, 0x91, 0xb1, 0x1b, 0xd8, 0xe2, 0x68,
+                                                       0x31, 0xfb, 0x2e, 0xfb, 0x6d, 0x9a, 0x58, 0xfb,
+                                                       0xf, 0x1f, 0xf7, 0x60, 0x6, 0xba, 0x8e, 0xb1,
+                                                       0xc1, 0x96, 0x1f, 0x13, 0x65, 0x0, 0x99, 0xfb,
+                                                       0x49, 0x6, 0xe, 0x7d, 0xae, 0xf9, 0x1a, 0x77,
+                                                       0x1, 0x22, 0xa, 0xf7, 0x8f, 0x91, 0x15, 0x8c,
+                                                       0xab, 0x8b, 0x9c, 0xc7, 0xae, 0x68, 0x4f, 0x54,
+                                                       0x66, 0x46, 0x4f, 0x78, 0x6d, 0x9d, 0xa3, 0x1e,
+                                                       0x96, 0x91, 0x96, 0x96, 0x1a, 0xa7, 0x79, 0xa1,
+                                                       0x6c, 0x68, 0x77, 0x77, 0x68, 0x68, 0xa5, 0x71,
+                                                       0xa7, 0x7b, 0x1e, 0x7a, 0xaa, 0xb0, 0x84, 0xad,
+                                                       0x1b, 0xe6, 0xf3, 0xb9, 0xf4, 0xf7, 0x2, 0xfb,
+                                                       0x19, 0x92, 0x88, 0x91, 0x1f, 0x89, 0x8f, 0xf4,
+                                                       0xb1, 0xcd, 0x1a, 0xdc, 0x3c, 0xa0, 0x48, 0x55,
+                                                       0x2a, 0x79, 0x45, 0x6f, 0x9f, 0x79, 0xa6, 0xa5,
+                                                       0x9f, 0xa3, 0xa3, 0x92, 0x8a, 0x92, 0x87, 0x91,
+                                                       0x1e, 0xa2, 0xa8, 0x9d, 0x9d, 0xbb, 0xa0, 0x5d,
+                                                       0x60, 0x50, 0x5b, 0x6a, 0x54, 0x1e, 0x75, 0x6,
+                                                       0xe, 0x7d, 0xae, 0xe5, 0xf7, 0x3d, 0x5a, 0xbc,
+                                                       0xf8, 0x1a, 0x4c, 0xa, 0xf7, 0xc2, 0xe4, 0xf7,
+                                                       0x96, 0xae, 0x13, 0xbe, 0x22, 0xa, 0xf7, 0x1,
+                                                       0xfb, 0x7, 0x15, 0xf7, 0x55, 0x78, 0x6, 0x48,
+                                                       0x7b, 0x8b, 0x6e, 0x88, 0x1e, 0x77, 0x89, 0x5,
+                                                       0x13, 0xde, 0x6e, 0xf7, 0x71, 0xa8, 0x7, 0x79,
+                                                       0x8e, 0x5, 0x54, 0x94, 0x91, 0x89, 0xc9, 0x1a,
+                                                       0x13, 0xbe, 0x9e, 0xee, 0xbc, 0x28, 0xf7, 0xc1,
+                                                       0x33, 0x7, 0xfb, 0x56, 0xfb, 0xd4, 0x5, 0xce,
+                                                       0x9e, 0x15, 0xf7, 0x12, 0xf7, 0x63, 0x5, 0xfb,
+                                                       0x63, 0x7, 0xe, 0x7e, 0xae, 0xdd, 0xaf, 0xf7,
+                                                       0x6c, 0xb5, 0xdf, 0xe1, 0xf1, 0x4c, 0xa, 0xf7,
+                                                       0x43, 0xb4, 0xf7, 0x33, 0xf7, 0x6, 0xf7, 0x34,
+                                                       0xae, 0x17, 0x23, 0xa, 0xae, 0x16, 0x40, 0xa,
+                                                       0x41, 0xa, 0x1e, 0x13, 0xf3, 0x80, 0x28, 0xa,
+                                                       0xfb, 0x24, 0xfb, 0x48, 0x1f, 0x13, 0x77, 0x0,
+                                                       0xfb, 0x47, 0xfb, 0x25, 0xf7, 0x24, 0xf7, 0x48,
+                                                       0x1f, 0xf7, 0x43, 0x76, 0x15, 0xb4, 0x7a, 0x5,
+                                                       0xa4, 0x9d, 0xa7, 0xa2, 0xab, 0x1b, 0xc3, 0xa4,
+                                                       0x56, 0x5a, 0x57, 0x6a, 0x4d, 0x50, 0x79, 0x6b,
+                                                       0x93, 0xa2, 0x1f, 0x98, 0x95, 0x94, 0x9b, 0x1a,
+                                                       0xaa, 0x71, 0x9a, 0x6f, 0x6b, 0x79, 0x72, 0x6d,
+                                                       0x43, 0xef, 0x73, 0xc4, 0xe8, 0xef, 0xc4, 0xf1,
+                                                       0xe3, 0x3b, 0xba, 0x3b, 0x66, 0x5d, 0x81, 0x72,
+                                                       0x6d, 0x1e, 0xf7, 0xd, 0x7, 0xe9, 0x88, 0x5,
+                                                       0xb1, 0xca, 0x86, 0xa4, 0xab, 0x1f, 0x9d, 0x99,
+                                                       0x9c, 0xb7, 0x90, 0xa3, 0x8, 0x7f, 0x65, 0x63,
+                                                       0x88, 0x64, 0x1b, 0x51, 0x44, 0x92, 0x98, 0x4d,
+                                                       0x1f, 0xe, 0x7d, 0xae, 0xf9, 0x1d, 0xae, 0x1,
+                                                       0x22, 0xa, 0xf7, 0x75, 0x78, 0x15, 0xb7, 0xa8,
+                                                       0xc5, 0xa9, 0xc0, 0x1b, 0xda, 0xc7, 0x56, 0x39,
+                                                       0x28, 0x38, 0x4c, 0x2c, 0xfb, 0x1d, 0x4e, 0xf7,
+                                                       0x1, 0xf7, 0x11, 0xf7, 0x11, 0xce, 0xf7, 0x11,
+                                                       0xf7, 0x1c, 0xc1, 0xe6, 0x74, 0x47, 0x6e, 0x7b,
+                                                       0x71, 0x6c, 0x71, 0x77, 0x9e, 0xa5, 0x1f, 0x96,
+                                                       0x90, 0x98, 0x95, 0x1a, 0xa3, 0x65, 0x96, 0x78,
+                                                       0x2c, 0x80, 0xfb, 0x9, 0x41, 0x1e, 0x91, 0xfb,
+                                                       0xe, 0x15, 0x55, 0xb1, 0x58, 0xc6, 0xc6, 0xa4,
+                                                       0xc4, 0xbf, 0xba, 0x76, 0xc7, 0x52, 0x4c, 0x63,
+                                                       0x57, 0x50, 0x1e, 0xe, 0x7d, 0xae, 0xf8, 0x6b,
+                                                       0xe4, 0xe4, 0x4c, 0xa, 0xf7, 0x72, 0xf7, 0x4,
+                                                       0xfb, 0x4, 0xf7, 0xc, 0xf7, 0xc7, 0xae, 0x13,
+                                                       0xf6, 0x22, 0xa, 0xf7, 0x27, 0xcd, 0x15, 0x9f,
+                                                       0x6, 0xb8, 0x9f, 0x8d, 0xae, 0xb2, 0x1b, 0xf7,
+                                                       0x50, 0x6, 0x20, 0xfb, 0x24, 0x5, 0x67, 0x5c,
+                                                       0x58, 0x46, 0x4d, 0x1a, 0x65, 0xa1, 0x6f, 0xb3,
+                                                       0xae, 0xa2, 0xa2, 0xaf, 0x1e, 0x13, 0xfa, 0xa2,
+                                                       0x83, 0xa2, 0xa2, 0x1a, 0xce, 0xbb, 0xd0, 0xab,
+                                                       0xc2, 0x1e, 0xe7, 0xf7, 0x32, 0x5, 0xfb, 0xf6,
+                                                       0x6, 0xe, 0x7d, 0xae, 0xde, 0xb1, 0xf8, 0x30,
+                                                       0xad, 0xdd, 0x4c, 0xa, 0xf7, 0x2e, 0xc5, 0x71,
+                                                       0xd9, 0xf7, 0x1d, 0xbd, 0x60, 0xe3, 0xf7, 0x2d,
+                                                       0xae, 0x13, 0xfc, 0xc0, 0xf7, 0xd7, 0xf7, 0xfe,
+                                                       0x15, 0x55, 0x6c, 0x5e, 0x6a, 0x46, 0x1a, 0x2f,
+                                                       0xde, 0x6a, 0xd9, 0xe3, 0xe8, 0xc0, 0xeb, 0xd5,
+                                                       0x5c, 0xaf, 0x4e, 0xa9, 0x1e, 0x13, 0xbb, 0x40,
+                                                       0xb1, 0xa4, 0xa4, 0xa4, 0xbd, 0x1a, 0xd1, 0x49,
+                                                       0xa4, 0x51, 0x1e, 0x42, 0x47, 0x5d, 0x3c, 0x5a,
+                                                       0xa8, 0x6e, 0xb1, 0x74, 0x1f, 0xf0, 0xbb, 0x15,
+                                                       0x5b, 0xa4, 0x61, 0x9d, 0xb4, 0x1a, 0xae, 0xa8,
+                                                       0xa4, 0xad, 0x1e, 0x13, 0x99, 0x40, 0xb4, 0xac,
+                                                       0x74, 0x60, 0x69, 0x79, 0x6f, 0x6e, 0x7b, 0x1f,
+                                                       0x48, 0x48, 0x15, 0x13, 0xdc, 0xc0, 0xa0, 0x7f,
+                                                       0x9e, 0x81, 0x9a, 0x81, 0x8, 0xb8, 0x6f, 0xa0,
+                                                       0x76, 0x6a, 0x1a, 0x54, 0x62, 0x6b, 0x57, 0x53,
+                                                       0x5c, 0xb6, 0xc2, 0xb4, 0xb2, 0xb5, 0xaf, 0x9f,
+                                                       0x1e, 0xfb, 0xd6, 0x8e, 0x37, 0xa, 0x13, 0x8,
+                                                       0x0, 0x33, 0xa, 0x1f, 0xe, 0x7d, 0xae, 0xde,
+                                                       0xac, 0x6a, 0xf7, 0x26, 0xb4, 0xba, 0x98, 0x77,
+                                                       0xf7, 0x72, 0xae, 0xdd, 0x4c, 0xa, 0xf7, 0x2d,
+                                                       0xdc, 0x4c, 0xe8, 0xf7, 0x24, 0xf7, 0x1, 0x23,
+                                                       0xf3, 0x25, 0xf1, 0xf7, 0x18, 0xae, 0x13, 0xcf,
+                                                       0x94, 0x2e, 0xa, 0xf7, 0x5b, 0xf7, 0x5a, 0x25,
+                                                       0xa, 0xfb, 0x5a, 0xfb, 0x5b, 0x2a, 0xa, 0xae,
+                                                       0x16, 0x40, 0xa, 0xf7, 0x25, 0xf7, 0x48, 0xf7,
+                                                       0x47, 0x2f, 0xa, 0xfb, 0x47, 0xfb, 0x48, 0x36,
+                                                       0xa, 0x1e, 0xf8, 0x31, 0x90, 0x15, 0x13, 0xcf,
+                                                       0x4c, 0x8d, 0x6, 0x22, 0x8e, 0x7a, 0xfb, 0x1,
+                                                       0x32, 0x1b, 0x77, 0x69, 0x95, 0xa3, 0x1f, 0x94,
+                                                       0x91, 0x96, 0x98, 0x1a, 0x13, 0xb7, 0x54, 0xa4,
+                                                       0x78, 0xa0, 0x72, 0x6d, 0x78, 0x72, 0x6e, 0x48,
+                                                       0xe2, 0x72, 0xc1, 0xcd, 0xbd, 0x9b, 0xc4, 0xb2,
+                                                       0x1e, 0xae, 0xbf, 0x9a, 0xce, 0xc9, 0x1a, 0xf7,
+                                                       0xa, 0x49, 0xf7, 0x4, 0xfb, 0x16, 0x1e, 0x13,
+                                                       0xd7, 0xa4, 0x2a, 0x44, 0x4f, 0x23, 0x39, 0xbc,
+                                                       0x58, 0xdb, 0x1f, 0x13, 0xcf, 0x94, 0xbf, 0xbc,
+                                                       0x9c, 0xb6, 0xa9, 0x1f, 0xfb, 0x47, 0xe6, 0x15,
+                                                       0xc2, 0xa3, 0xc3, 0xca, 0x1e, 0x13, 0xd7, 0xa4,
+                                                       0xc1, 0xac, 0x57, 0x5a, 0x53, 0x70, 0x51, 0x4c,
+                                                       0x50, 0x72, 0xc0, 0xbe, 0x1f, 0xe, 0x7d, 0xae,
+                                                       0xe4, 0xaf, 0xf7, 0xee, 0x9b, 0xb0, 0xad, 0xe6,
+                                                       0x4c, 0xa, 0xf7, 0x42, 0xdf, 0xba, 0xeb, 0xf2,
+                                                       0xeb, 0xbc, 0xae, 0x17, 0xf8, 0xb, 0xf7, 0xea,
+                                                       0x15, 0x13, 0xff, 0xc0, 0x22, 0x9d, 0xfb, 0x13,
+                                                       0xf7, 0x15, 0xf7, 0x16, 0x9d, 0xf7, 0x10, 0xf7,
+                                                       0x0, 0xe9, 0x7a, 0xf7, 0x23, 0xfb, 0x11, 0xfb,
+                                                       0x1b, 0x79, 0xfb, 0x16, 0x20, 0x1e, 0xeb, 0x16,
+                                                       0xb3, 0x8a, 0xf7, 0x37, 0xc0, 0xc1, 0x88, 0xfb,
+                                                       0x38, 0x64, 0x66, 0x8c, 0xfb, 0x33, 0x57, 0x55,
+                                                       0x8d, 0xf7, 0x32, 0xb1, 0x1e, 0xfc, 0x48, 0x8f,
+                                                       0x21, 0xa, 0xf7, 0x8, 0x6b, 0xa, 0xf7, 0x5c,
+                                                       0xad, 0x6, 0x80, 0x8c, 0x5, 0x5a, 0x8f, 0x8d,
+                                                       0x91, 0x9d, 0x1a, 0xf8, 0x2b, 0x54, 0x7, 0x6f,
+                                                       0x5b, 0x69, 0x75, 0x58, 0x88, 0x8, 0x7b, 0xa5,
+                                                       0x7, 0x13, 0x2, 0x0, 0xab, 0xa5, 0x8f, 0x64,
+                                                       0x1f, 0xfb, 0xaf, 0x7, 0x76, 0x83, 0x86, 0x78,
+                                                       0x8a, 0x1e, 0x6c, 0x89, 0x5, 0xe, 0xfb, 0xb6,
+                                                       0x58, 0xa3, 0xb8, 0x76, 0xf7, 0x7c, 0x9a, 0x92,
+                                                       0x9a, 0xf7, 0xa, 0x9a, 0xb6, 0xa3, 0xf7, 0x57,
+                                                       0xa4, 0x86, 0xa3, 0x12, 0xf7, 0x1e, 0xa4, 0xc2,
+                                                       0x99, 0xae, 0x9a, 0x8b, 0x9b, 0xa1, 0x9b, 0xa9,
+                                                       0xa4, 0xac, 0xa4, 0x80, 0xa3, 0x13, 0xfd, 0xfe,
+                                                       0xea, 0x88, 0x15, 0x6a, 0xa4, 0xae, 0x7c, 0xaf,
+                                                       0x1b, 0xab, 0xab, 0x95, 0x9e, 0xa6, 0x1f, 0xbc,
+                                                       0xf7, 0x1e, 0xb1, 0xb1, 0xb7, 0xd4, 0xbb, 0xa6,
+                                                       0x90, 0xb2, 0x75, 0xb6, 0x8f, 0xb3, 0x90, 0xc4,
+                                                       0x6e, 0xaa, 0x6c, 0x8f, 0x74, 0x7f, 0xa1, 0xf7,
+                                                       0x5b, 0x5, 0xab, 0x8f, 0x76, 0x9d, 0x74, 0x1b,
+                                                       0x77, 0x76, 0x7f, 0x70, 0x84, 0x1f, 0x5b, 0xfb,
+                                                       0x56, 0x71, 0xe6, 0x79, 0xdb, 0x5, 0x13, 0xfe,
+                                                       0xfd, 0xa4, 0x85, 0x82, 0x9d, 0x6d, 0x1b, 0x6b,
+                                                       0x87, 0x6a, 0x7a, 0x8c, 0x1f, 0x98, 0xfb, 0x8b,
+                                                       0x74, 0x88, 0x72, 0x74, 0x78, 0xfb, 0x21, 0xba,
+                                                       0xfb, 0x7, 0x5, 0xf7, 0x68, 0xf7, 0x29, 0x15,
+                                                       0xba, 0xaa, 0x75, 0x7d, 0xa9, 0x9e, 0xa4, 0x95,
+                                                       0x18, 0x94, 0x9a, 0x9a, 0x6e, 0x88, 0x78, 0x81,
+                                                       0x86, 0x65, 0x7e, 0x5b, 0x76, 0x86, 0xa5, 0x19,
+                                                       0xfb, 0x6b, 0xfb, 0x92, 0x15, 0xa9, 0xf6, 0x5a,
+                                                       0xf7, 0x8, 0x9c, 0xf7, 0x12, 0x99, 0x97, 0xf7,
+                                                       0x1a, 0xa0, 0x98, 0x89, 0x93, 0x7d, 0x81, 0x7d,
+                                                       0x19, 0x79, 0x72, 0x61, 0x7b, 0x6e, 0x80, 0x60,
+                                                       0xa2, 0x18, 0x85, 0x7d, 0xb3, 0x77, 0xa2, 0x72,
+                                                       0x94, 0x6c, 0x91, 0x61, 0x19, 0x99, 0x8e, 0x85,
+                                                       0xb3, 0x85, 0xa8, 0x77, 0xa5, 0x19, 0xaa, 0x96,
+                                                       0xb3, 0x9b, 0x9e, 0xa5, 0x8, 0x91, 0x93, 0x8d,
+                                                       0x95, 0x93, 0x1a, 0x9a, 0x80, 0x98, 0x77, 0x8c,
+                                                       0x1e, 0x29, 0x7c, 0x7e, 0xf7, 0x92, 0x5, 0x9d,
+                                                       0x8a, 0x91, 0x90, 0x90, 0x1b, 0x97, 0x8f, 0x88,
+                                                       0x77, 0x8f, 0x1f, 0x9d, 0x3b, 0xb1, 0xfb, 0x19,
+                                                       0x5, 0xa6, 0x6, 0xc6, 0xf7, 0x80, 0x5, 0x13,
+                                                       0xfd, 0xfe, 0x98, 0x8e, 0x94, 0x92, 0x94, 0x1b,
+                                                       0x95, 0x94, 0x83, 0x7c, 0x89, 0x1f, 0x70, 0xfb,
+                                                       0x8a, 0xc5, 0xaa, 0x99, 0x89, 0x9b, 0x79, 0x86,
+                                                       0x5d, 0x86, 0x61, 0x7e, 0x76, 0xfb, 0x0, 0x5b,
+                                                       0x85, 0x8c, 0x85, 0x8e, 0x89, 0x91, 0x19, 0x85,
+                                                       0x9d, 0xb5, 0xa2, 0x9c, 0x98, 0xb0, 0xcb, 0x18,
+                                                       0x7f, 0x91, 0x56, 0x5c, 0x9b, 0x7c, 0x5, 0x81,
+                                                       0x84, 0x5c, 0x71, 0x72, 0x1a, 0x88, 0x8b, 0x88,
+                                                       0x8c, 0x88, 0x1e, 0x80, 0x8f, 0x99, 0x82, 0x98,
+                                                       0x1b, 0xa1, 0x93, 0x5, 0x76, 0x8c, 0x98, 0x82,
+                                                       0x9d, 0x1b, 0x95, 0x97, 0x8d, 0x8f, 0x98, 0x1f,
+                                                       0x64, 0x49, 0x63, 0x65, 0x5c, 0xfb, 0x1e, 0x5,
+                                                       0x7f, 0x78, 0x71, 0x83, 0x72, 0x1b, 0x70, 0x71,
+                                                       0x94, 0x9f, 0x7a, 0x1f, 0xe, 0x7d, 0xef, 0xf8,
+                                                       0x9c, 0xee, 0x1, 0xf7, 0xf4, 0xf0, 0x26, 0xa,
+                                                       0xf7, 0x74, 0xfb, 0x98, 0x15, 0xac, 0x7, 0xc1,
+                                                       0x8e, 0xad, 0x8d, 0x91, 0xad, 0x8a, 0xa6, 0x19,
+                                                       0xf7, 0x98, 0x7, 0xb7, 0x8c, 0x8e, 0x5e, 0x1e,
+                                                       0x4a, 0x9f, 0x6, 0xd0, 0x95, 0xa4, 0xa8, 0xb2,
+                                                       0xc2, 0x8, 0xd8, 0xfc, 0x39, 0x6, 0x4a, 0x9b,
+                                                       0x90, 0xc9, 0x86, 0x1e, 0x9f, 0x8a, 0x5, 0x6a,
+                                                       0x7, 0xe, 0x7d, 0xef, 0xf8, 0xa3, 0xe7, 0x12,
+                                                       0xae, 0xf7, 0x43, 0xfb, 0x43, 0xf7, 0x58, 0xf7,
+                                                       0xe8, 0xf7, 0x4b, 0xfb, 0x3f, 0xf7, 0x3f, 0x13,
+                                                       0xe8, 0x23, 0xa, 0xf7, 0x43, 0xfb, 0x98, 0x15,
+                                                       0x89, 0xf6, 0xc2, 0xc6, 0xc8, 0xb8, 0x8, 0xc7,
+                                                       0xb8, 0xd1, 0xc0, 0xde, 0x1a, 0xb7, 0x7c, 0xbd,
+                                                       0x56, 0x7b, 0x65, 0x79, 0x77, 0x1e, 0x7e, 0x92,
+                                                       0x80, 0x7d, 0x1a, 0x6e, 0x73, 0x74, 0x6e, 0x1e,
+                                                       0x13, 0xd8, 0x69, 0x76, 0xa6, 0xac, 0xd9, 0xe3,
+                                                       0xaa, 0xcc, 0xe2, 0xef, 0x67, 0x25, 0x2f, 0x43,
+                                                       0x63, 0x42, 0x68, 0x1f, 0x54, 0x72, 0x42, 0x63,
+                                                       0x74, 0x51, 0x8, 0xf7, 0x75, 0x6, 0x9b, 0x8a,
+                                                       0x9c, 0x8b, 0x92, 0x9c, 0xa4, 0xe0, 0x18, 0x13,
+                                                       0xe4, 0x9d, 0xfb, 0x5c, 0x6, 0xe, 0x7d, 0xe6,
+                                                       0xf7, 0xa9, 0x77, 0xba, 0xde, 0x38, 0xf7, 0x55,
+                                                       0xb2, 0xe7, 0x12, 0xae, 0xf7, 0x3c, 0xfb, 0x3c,
+                                                       0xf7, 0x53, 0xe7, 0xf7, 0x2e, 0xfb, 0x24, 0xf7,
+                                                       0xf, 0xf2, 0xf7, 0x5c, 0xfb, 0x37, 0xf7, 0x37,
+                                                       0x13, 0xdc, 0xc0, 0x23, 0xa, 0xf7, 0xaa, 0x94,
+                                                       0x15, 0xa5, 0xa3, 0x7, 0xc9, 0xbf, 0xb4, 0xcc,
+                                                       0xbb, 0x74, 0xb2, 0x55, 0x69, 0x7a, 0x76, 0x82,
+                                                       0x1f, 0x83, 0x90, 0x8a, 0x78, 0x1a, 0x13, 0xea,
+                                                       0xc0, 0x70, 0x74, 0x72, 0x70, 0x6c, 0x76, 0xa0,
+                                                       0xa9, 0xd8, 0xf6, 0xa0, 0xc6, 0xd5, 0xe3, 0x74,
+                                                       0x31, 0x4a, 0x61, 0x6d, 0x53, 0x7a, 0x1e, 0x88,
+                                                       0x8a, 0x7e, 0x89, 0x87, 0x1a, 0x85, 0x93, 0x8a,
+                                                       0x8f, 0x99, 0xb5, 0x7e, 0x85, 0x97, 0x1e, 0x13,
+                                                       0xdd, 0x20, 0xb8, 0x76, 0xa5, 0x62, 0x5a, 0x1a,
+                                                       0xfb, 0x5, 0xfb, 0x5, 0x55, 0x28, 0x65, 0x64,
+                                                       0x91, 0x9c, 0x69, 0x1e, 0x6a, 0x9c, 0x6b, 0xaa,
+                                                       0xb4, 0x1a, 0xb1, 0xa0, 0xa1, 0xb3, 0xac, 0xa0,
+                                                       0x74, 0x6b, 0x1e, 0x7e, 0x84, 0x80, 0x7e, 0x1a,
+                                                       0x71, 0xac, 0x82, 0xa0, 0xcd, 0xb4, 0xcd, 0xc8,
+                                                       0xcd, 0x65, 0xb2, 0x48, 0x79, 0x79, 0x90, 0x87,
+                                                       0x79, 0x1e, 0xe, 0x7d, 0xef, 0x8b, 0xd3, 0xf8,
+                                                       0x54, 0xee, 0x12, 0xae, 0xf8, 0xb3, 0xfb, 0x2,
+                                                       0xf7, 0xb2, 0x13, 0xf0, 0x29, 0xa, 0x1e, 0x13,
+                                                       0xe8, 0x24, 0xa, 0x1f, 0x13, 0xf0, 0x27, 0xa,
+                                                       0x1f, 0xf7, 0xd, 0xfb, 0x13, 0x15, 0xac, 0x7,
+                                                       0xf7, 0x6d, 0xf7, 0xf6, 0x5, 0x13, 0xe8, 0xea,
+                                                       0xfb, 0xe1, 0x6, 0x13, 0xf0, 0xf7, 0x2, 0x55,
+                                                       0x6, 0x13, 0xe8, 0xfb, 0x2, 0x4c, 0x6, 0x78,
+                                                       0x93, 0x84, 0x9b, 0x88, 0x1e, 0xbe, 0x82, 0x5,
+                                                       0x6b, 0xfb, 0xa0, 0xab, 0x7, 0xd2, 0x94, 0x5,
+                                                       0xa0, 0x8e, 0x8e, 0xa0, 0x92, 0x1a, 0xc8, 0x7,
+                                                       0xfb, 0x2b, 0xc1, 0x15, 0xf7, 0x2b, 0xf7, 0x97,
+                                                       0x6, 0xe, 0x7b, 0xe7, 0x31, 0xe7, 0xf7, 0xab,
+                                                       0x77, 0xce, 0xe8, 0xe9, 0xf7, 0x6, 0x12, 0xae,
+                                                       0xf7, 0x2e, 0xfb, 0x2e, 0xf7, 0x57, 0xd5, 0xf7,
+                                                       0x26, 0xf7, 0x12, 0xf7, 0x46, 0x13, 0xbd, 0x80,
+                                                       0x3b, 0xa, 0x13, 0x7d, 0x80, 0x2c, 0xa, 0x13,
+                                                       0xbb, 0x80, 0xf7, 0x57, 0x74, 0x15, 0x8c, 0xf7,
+                                                       0xb7, 0x5, 0x7d, 0xcc, 0xda, 0x82, 0xc8, 0x1b,
+                                                       0xb8, 0xb9, 0x8e, 0x99, 0xb6, 0x1f, 0x85, 0x72,
+                                                       0x79, 0x58, 0x78, 0x7d, 0x8, 0x6f, 0x66, 0x47,
+                                                       0x90, 0x5f, 0x1b, 0x23, 0x8f, 0x5, 0xfb, 0x1a,
+                                                       0x7, 0xa7, 0xac, 0xbf, 0x96, 0xb4, 0x1b, 0xb4,
+                                                       0xb4, 0x82, 0x72, 0xac, 0x1f, 0xb0, 0x71, 0xa3,
+                                                       0x61, 0x5d, 0x1a, 0x13, 0x7d, 0x80, 0xfb, 0x7,
+                                                       0xfb, 0x2, 0x4c, 0x23, 0x4d, 0xfb, 0x3, 0xa6,
+                                                       0xdb, 0xac, 0x9f, 0xa7, 0xaf, 0xaa, 0xa7, 0x7a,
+                                                       0x69, 0x1e, 0x78, 0x81, 0x81, 0x7e, 0x1a, 0x71,
+                                                       0xae, 0x82, 0x9f, 0xcc, 0xaf, 0xd0, 0xc4, 0xc1,
+                                                       0x70, 0xc6, 0x4d, 0x67, 0x6d, 0x71, 0x70, 0x76,
+                                                       0x1e, 0xe, 0x7d, 0xe7, 0xf7, 0xa9, 0x77, 0xd3,
+                                                       0xb9, 0x5d, 0xf7, 0x3f, 0xae, 0xe7, 0x12, 0xae,
+                                                       0xf7, 0x29, 0xf7, 0x7, 0xf7, 0x55, 0x6a, 0xf2,
+                                                       0x8b, 0xf7, 0x54, 0xfb, 0x3a, 0xf7, 0x3a, 0x13,
+                                                       0xee, 0x40, 0x23, 0xa, 0xf7, 0x97, 0x76, 0x15,
+                                                       0xbc, 0xaa, 0xc3, 0xac, 0xc5, 0x1b, 0xe3, 0xc8,
+                                                       0x49, 0x31, 0xfb, 0x3, 0x34, 0x4d, 0x22, 0x49,
+                                                       0x52, 0xa0, 0xc0, 0x63, 0x1f, 0x65, 0xbe, 0x80,
+                                                       0xcc, 0xca, 0x1a, 0xcb, 0x93, 0xcf, 0xad, 0xc2,
+                                                       0x1e, 0xcf, 0xb5, 0xc4, 0xa6, 0xda, 0x1b, 0x13,
+                                                       0xed, 0x80, 0xc7, 0xed, 0x72, 0x40, 0x6b, 0x7a,
+                                                       0x6f, 0x68, 0x6e, 0x75, 0x9f, 0xa8, 0x1f, 0x98,
+                                                       0x91, 0x99, 0x96, 0x1a, 0x13, 0xde, 0x40, 0xa5,
+                                                       0x63, 0x97, 0x76, 0x56, 0x7c, 0x6d, 0x5e, 0x78,
+                                                       0x1e, 0x7c, 0x5a, 0x8b, 0x45, 0x83, 0x50, 0x8,
+                                                       0x90, 0x33, 0x15, 0x4e, 0xa6, 0x4f, 0xd1, 0xcd,
+                                                       0xa9, 0xcb, 0xc5, 0xbf, 0x72, 0xcc, 0x4e, 0x48,
+                                                       0x63, 0x55, 0x4b, 0x1e, 0xe, 0x7d, 0xe8, 0xf8,
+                                                       0xa4, 0xed, 0x1, 0xae, 0xf7, 0x38, 0x26, 0xa,
+                                                       0xf7, 0x38, 0xd5, 0x15, 0x8c, 0xf7, 0x4f, 0x5,
+                                                       0xf8, 0x1e, 0x6, 0x25, 0xfb, 0x44, 0x5, 0x68,
+                                                       0x4e, 0x56, 0x3f, 0x42, 0x71, 0x94, 0x6c, 0x77,
+                                                       0x1a, 0x64, 0x72, 0x71, 0x64, 0x5f, 0x73, 0xaa,
+                                                       0xb5, 0xcf, 0xc2, 0xd7, 0xb4, 0xbf, 0x1e, 0xf7,
+                                                       0xa, 0xf7, 0x34, 0x5, 0xfb, 0x6b, 0x6, 0x76,
+                                                       0x80, 0x84, 0x71, 0x84, 0x1f, 0x79, 0x54, 0x5,
+                                                       0xe, 0x7d, 0xe7, 0xf8, 0xab, 0xe7, 0x12, 0xae,
+                                                       0xf7, 0x3f, 0xd7, 0xf7, 0x61, 0xfb, 0x34, 0xf7,
+                                                       0x2c, 0xf4, 0xf7, 0x3e, 0x13, 0xec, 0x23, 0xa,
+                                                       0xf7, 0xad, 0x9d, 0x15, 0x60, 0xa5, 0x75, 0xab,
+                                                       0xc2, 0x1a, 0xe1, 0xcd, 0xbd, 0xdb, 0xcb, 0xd5,
+                                                       0x6c, 0x3e, 0x53, 0x6f, 0x73, 0x61, 0x70, 0x1e,
+                                                       0xce, 0x6a, 0xbf, 0x63, 0x3a, 0x1a, 0x20, 0x29,
+                                                       0x50, 0x2a, 0x35, 0x2a, 0xb0, 0xf1, 0xd7, 0xbc,
+                                                       0xb0, 0xc8, 0xad, 0x1e, 0xf7, 0x4, 0xbf, 0x15,
+                                                       0xaa, 0x9e, 0x9f, 0xaa, 0xb0, 0x1a, 0xbb, 0x66,
+                                                       0xa5, 0x5e, 0x66, 0x6a, 0x66, 0x65, 0x5f, 0xb7,
+                                                       0x7f, 0xac, 0x7a, 0x1e, 0x58, 0x34, 0x15, 0x13,
+                                                       0xf4, 0x61, 0x75, 0x6e, 0x5d, 0x5b, 0x1a, 0x50,
+                                                       0xb5, 0x5c, 0xc7, 0xc4, 0xb9, 0xaf, 0xc7, 0xbc,
+                                                       0x60, 0xa5, 0x66, 0xa0, 0x1e, 0xe, 0x7d, 0xe7,
+                                                       0xb0, 0xf7, 0x3e, 0x5e, 0xb8, 0xf7, 0xdc, 0xe7,
+                                                       0x12, 0xae, 0xf7, 0x36, 0xfb, 0x36, 0xf7, 0x51,
+                                                       0xd1, 0xf7, 0x55, 0xf7, 0x6, 0xf7, 0x2d, 0x13,
+                                                       0xbb, 0x23, 0xa, 0xf8, 0x5e, 0x90, 0x15, 0x5e,
+                                                       0x6a, 0x54, 0x76, 0x54, 0x1b, 0x30, 0x4d, 0xd3,
+                                                       0xe9, 0xf7, 0x0, 0xe4, 0xc1, 0xf3, 0xf7, 0x27,
+                                                       0xcb, 0xfb, 0xf, 0xfb, 0x1c, 0x47, 0x82, 0x4a,
+                                                       0x65, 0x52, 0x1f, 0x49, 0x61, 0x51, 0x77, 0x3f,
+                                                       0x1b, 0x13, 0xb7, 0x4f, 0x2d, 0xa7, 0xd5, 0xab,
+                                                       0xa0, 0xa7, 0xad, 0xa6, 0xa0, 0x73, 0x70, 0x1f,
+                                                       0x7d, 0x85, 0x7f, 0x81, 0x1a, 0x13, 0xdb, 0x70,
+                                                       0xab, 0x80, 0xa0, 0xee, 0x9f, 0xf7, 0x1b, 0xd7,
+                                                       0x1e, 0xfb, 0x5b, 0xf7, 0x13, 0x15, 0x52, 0xa7,
+                                                       0x50, 0xcb, 0xd1, 0xaa, 0xcb, 0xc8, 0xc2, 0x66,
+                                                       0xc5, 0x4f, 0x45, 0x71, 0x4e, 0x4e, 0x1e, 0xe,
+                                                       0x7d, 0xe7, 0x2f, 0xef, 0xf8, 0x4c, 0xf7, 0x47,
+                                                       0x28, 0xee, 0x2f, 0xe7, 0x12, 0xae, 0xf7, 0x55,
+                                                       0xe8, 0xc4, 0xf1, 0xf7, 0x5, 0xeb, 0xcc, 0x13,
+                                                       0x67, 0x80, 0x23, 0xa, 0xf7, 0x15, 0xfb, 0x98,
+                                                       0x15, 0xb0, 0x7, 0xad, 0x8e, 0x5, 0xb0, 0x8d,
+                                                       0x84, 0xa1, 0xa9, 0x1a, 0xf7, 0xb5, 0x7, 0xb5,
+                                                       0x72, 0x87, 0x67, 0x1e, 0x6b, 0x9e, 0x6, 0x13,
+                                                       0x57, 0x80, 0xc4, 0x8e, 0x9b, 0xa3, 0xaa, 0xc0,
+                                                       0x8, 0xdd, 0xfc, 0x3e, 0x6, 0x56, 0x88, 0x8e,
+                                                       0xc2, 0x86, 0x1e, 0x98, 0x89, 0x5, 0x66, 0x7,
+                                                       0x83, 0xf7, 0x93, 0x15, 0x13, 0x8f, 0x80, 0xf7,
+                                                       0xa, 0x93, 0xf7, 0x2e, 0xf7, 0x2a, 0xf7, 0x1e,
+                                                       0x9a, 0xfb, 0x3c, 0x23, 0xfb, 0x0, 0x7e, 0xfb,
+                                                       0x2f, 0xfb, 0x1f, 0xfb, 0x29, 0x81, 0xf7, 0x22,
+                                                       0xf7, 0xd, 0x1e, 0xf1, 0x16, 0x60, 0x89, 0xfb,
+                                                       0x48, 0xc6, 0xc4, 0x8a, 0xf7, 0x4b, 0xb3, 0x1e,
+                                                       0xf7, 0x45, 0x80, 0x81, 0xc4, 0x67, 0x1b, 0x54,
+                                                       0x8a, 0xfb, 0x57, 0x64, 0x1f, 0xe, 0x9b, 0xae,
+                                                       0x76, 0xc3, 0xa4, 0x86, 0xa5, 0xab, 0x9a, 0x97,
+                                                       0xa3, 0x96, 0x9d, 0xf7, 0x6, 0xf7, 0x3d, 0x67,
+                                                       0xa5, 0x79, 0xa8, 0x70, 0xf7, 0x32, 0x12, 0x9e,
+                                                       0xa4, 0xf8, 0x3b, 0x9a, 0xf7, 0x7b, 0x9b, 0xb3,
+                                                       0xa4, 0x13, 0xbc, 0xbc, 0xcf, 0xb5, 0x15, 0xf7,
+                                                       0x1f, 0xc2, 0x5, 0x13, 0xdc, 0xbc, 0x80, 0xaa,
+                                                       0xb3, 0x7b, 0xac, 0x1b, 0xb5, 0xb5, 0x9d, 0xa2,
+                                                       0xb4, 0x1f, 0xd0, 0x70, 0xc9, 0xad, 0xc4, 0x97,
+                                                       0xa6, 0x67, 0xae, 0x78, 0xb6, 0xa9, 0x19, 0x8c,
+                                                       0x8e, 0x8e, 0x86, 0xdc, 0x32, 0x94, 0x91, 0x68,
+                                                       0xf7, 0x5, 0x73, 0xb5, 0x9a, 0x8e, 0x98, 0x94,
+                                                       0x90, 0x9c, 0x19, 0x86, 0xf7, 0x24, 0xfb, 0xc,
+                                                       0xf7, 0x18, 0x54, 0x9f, 0x61, 0x8e, 0x5, 0x13,
+                                                       0xbc, 0x7c, 0x3a, 0xf7, 0x20, 0x5, 0x40, 0x6,
+                                                       0xda, 0xfb, 0x1b, 0x25, 0x91, 0x58, 0x7a, 0xfb,
+                                                       0x87, 0xfb, 0x34, 0x58, 0x80, 0x5, 0x73, 0x66,
+                                                       0x83, 0x53, 0x5f, 0x1a, 0x5c, 0x9f, 0x4b, 0xa8,
+                                                       0x67, 0x1e, 0x13, 0xbe, 0x3c, 0xf8, 0xec, 0xf7,
+                                                       0xc0, 0x15, 0x3d, 0xf7, 0x1b, 0xa0, 0x8a, 0xba,
+                                                       0x79, 0xf7, 0x2, 0xfb, 0xc, 0x8e, 0xfb, 0x16,
+                                                       0x86, 0x82, 0x83, 0x8a, 0x83, 0x8c, 0x19, 0x69,
+                                                       0xc5, 0x5, 0x94, 0x95, 0x8f, 0x98, 0x97, 0x1a,
+                                                       0xa2, 0x78, 0x9f, 0x73, 0x8f, 0x1e, 0x59, 0xfb,
+                                                       0x4b, 0x15, 0x78, 0xd3, 0xb2, 0x93, 0xc3, 0x29,
+                                                       0x86, 0x7a, 0x6b, 0x79, 0x74, 0xaa, 0x7b, 0xa1,
+                                                       0x19, 0xfb, 0x20, 0x8c, 0x15, 0x81, 0x93, 0x87,
+                                                       0x93, 0x92, 0x1a, 0x99, 0x96, 0x97, 0x9e, 0x94,
+                                                       0x1e, 0x8b, 0xc7, 0x91, 0xa9, 0x90, 0x1e, 0x9e,
+                                                       0x44, 0x54, 0x7f, 0x5, 0xfc, 0x7a, 0x44, 0x15,
+                                                       0x75, 0xaf, 0x7d, 0xb0, 0xb7, 0x1a, 0xb8, 0x8e,
+                                                       0xaf, 0x9e, 0xac, 0x1e, 0xb9, 0x95, 0x5, 0x13,
+                                                       0xbd, 0x3c, 0xf7, 0x87, 0xf7, 0x36, 0xb8, 0x98,
+                                                       0xf7, 0x5, 0x85, 0xd5, 0xfb, 0x14, 0x5a, 0x93,
+                                                       0x39, 0xad, 0x92, 0xac, 0x79, 0x8e, 0x7b, 0x44,
+                                                       0xfb, 0x24, 0x7d, 0x8c, 0x7c, 0xf7, 0x6a, 0x9f,
+                                                       0xf7, 0x4c, 0x70, 0x5, 0x9e, 0x88, 0x95, 0x7b,
+                                                       0x7b, 0x1a, 0x81, 0x88, 0x81, 0x82, 0x84, 0x1e,
+                                                       0x77, 0x42, 0x2a, 0x7d, 0x4f, 0x1b, 0x6d, 0x98,
+                                                       0x65, 0x59, 0x43, 0x69, 0x4a, 0x89, 0x3e, 0x9d,
+                                                       0x19, 0x88, 0x7c, 0xd7, 0x79, 0xca, 0x8d, 0xd1,
+                                                       0xa8, 0x19, 0xa6, 0x63, 0x5, 0x13, 0xdc, 0xbc,
+                                                       0x79, 0x6a, 0x63, 0x78, 0x65, 0x1b, 0x6c, 0x5f,
+                                                       0x9d, 0x95, 0x6e, 0x1f, 0xf7, 0x7b, 0x99, 0x15,
+                                                       0x6f, 0xb4, 0x8e, 0x8d, 0xa0, 0xa6, 0xbe, 0x92,
+                                                       0x5, 0x82, 0x83, 0x82, 0x81, 0x7b, 0x1a, 0x7b,
+                                                       0x95, 0x7f, 0x98, 0x82, 0x1e, 0xbf, 0x81, 0x64,
+                                                       0x76, 0x5, 0xe, 0x7d, 0xae, 0xf8, 0x52, 0xa0,
+                                                       0xf7, 0x4a, 0x74, 0xa, 0xf7, 0xbe, 0xc9, 0xf7,
+                                                       0xb5, 0xae, 0x3, 0x22, 0xa, 0xf7, 0xbe, 0x6b,
+                                                       0xa, 0xc9, 0xf8, 0x6a, 0x51, 0x6, 0x7e, 0x4a,
+                                                       0x71, 0x70, 0x4d, 0x8a, 0x8, 0x76, 0xec, 0x7,
+                                                       0xe, 0x7d, 0xae, 0xe5, 0xbe, 0xf8, 0xb, 0xbd,
+                                                       0xde, 0x74, 0xa, 0xf7, 0x3f, 0xc7, 0xf7, 0x47,
+                                                       0xcc, 0xf7, 0x42, 0xae, 0x3, 0x22, 0xa, 0xf7,
+                                                       0x46, 0x6b, 0xa, 0xf7, 0xbe, 0xbe, 0xfb, 0x7e,
+                                                       0x6, 0x9a, 0xae, 0xae, 0xa0, 0xa9, 0x9f, 0x8,
+                                                       0xd7, 0xbe, 0xd8, 0xbb, 0xf2, 0x1a, 0xe4, 0x44,
+                                                       0xc5, 0x35, 0x38, 0x4a, 0x4d, 0xfb, 0x1, 0x8c,
+                                                       0x1e, 0xc7, 0x86, 0x5, 0xd5, 0xa3, 0xbf, 0xc9,
+                                                       0xc6, 0xad, 0x5e, 0x52, 0x3d, 0x50, 0x66, 0x51,
+                                                       0x65, 0x1e, 0x54, 0x68, 0x4e, 0x58, 0x45, 0x1a,
+                                                       0xe, 0x7d, 0xae, 0xde, 0xbf, 0xf8, 0x15, 0xba,
+                                                       0xdd, 0x4c, 0xa, 0xf8, 0x25, 0xc9, 0x5b, 0xc8,
+                                                       0xf7, 0x41, 0xae, 0x13, 0xfb, 0x22, 0xa, 0xf7,
+                                                       0x4b, 0x30, 0x15, 0xfb, 0x3, 0x8a, 0xcf, 0x63,
+                                                       0xd3, 0x1b, 0xdb, 0xd5, 0xc0, 0xdf, 0xc2, 0x71,
+                                                       0xb9, 0x54, 0x99, 0x1f, 0x8d, 0x7, 0x13, 0xfd,
+                                                       0xba, 0x9d, 0xa0, 0xa8, 0xbe, 0x1a, 0xdb, 0x47,
+                                                       0xbf, 0x40, 0x40, 0x50, 0x5c, 0x3f, 0x8d, 0x1e,
+                                                       0xc1, 0x85, 0x5, 0xbc, 0x89, 0xa5, 0xac, 0xc0,
+                                                       0x1b, 0xc1, 0xa7, 0x6b, 0x56, 0x53, 0x5e, 0x71,
+                                                       0x58, 0x1f, 0x72, 0x8c, 0x5, 0x63, 0x7, 0x13,
+                                                       0xfb, 0xc8, 0x92, 0xd5, 0x6f, 0x42, 0x1a, 0x52,
+                                                       0x66, 0x6f, 0x53, 0x56, 0x64, 0xb7, 0xc2, 0x92,
+                                                       0x1e, 0xe, 0x7d, 0xae, 0xf7, 0x64, 0xc0, 0xf8,
+                                                       0x18, 0x74, 0xa, 0xf7, 0xe6, 0xc2, 0xf7, 0x94,
+                                                       0xae, 0x3, 0x22, 0xa, 0xf7, 0x16, 0xfb, 0x9,
+                                                       0x15, 0xf7, 0x64, 0xfb, 0xa, 0xc2, 0xf7, 0xa,
+                                                       0xda, 0xc0, 0x3c, 0xf7, 0xc5, 0x6, 0x58, 0x8c,
+                                                       0xfb, 0x68, 0xfb, 0xc6, 0x5, 0xc3, 0x16, 0xf7,
+                                                       0x2c, 0xf7, 0x75, 0x5, 0xfb, 0x75, 0x7, 0xe,
+                                                       0x7d, 0xae, 0xde, 0xbd, 0xf7, 0x70, 0xc2, 0xee,
+                                                       0xc0, 0xe4, 0x4c, 0xa, 0xf7, 0x54, 0xbf, 0x5e,
+                                                       0xbe, 0xf7, 0x41, 0xca, 0xf7, 0x37, 0xae, 0x13,
+                                                       0xfe, 0xc0, 0x22, 0xa, 0xf7, 0x54, 0xfb, 0xe,
+                                                       0x15, 0x42, 0x8f, 0xc5, 0x5c, 0xd3, 0x1b, 0xf2,
+                                                       0xc4, 0xd4, 0xec, 0xdc, 0x55, 0xd5, 0x35, 0x1f,
+                                                       0x13, 0xfd, 0xc0, 0x66, 0x63, 0x82, 0x69, 0x78,
+                                                       0x1f, 0xf7, 0x22, 0xf7, 0x76, 0xc0, 0xfb, 0xa9,
+                                                       0xfb, 0xab, 0x7, 0x13, 0xfe, 0xc0, 0xb8, 0x6,
+                                                       0xb9, 0x93, 0xa9, 0xa5, 0xbd, 0x1b, 0xc9, 0xa8,
+                                                       0x60, 0x54, 0x48, 0x77, 0x54, 0x3d, 0x5f, 0x64,
+                                                       0xb0, 0xb8, 0x8d, 0x1f, 0xe, 0x7d, 0xae, 0xde,
+                                                       0xb9, 0xf7, 0x67, 0xbf, 0xf7, 0x10, 0xbe, 0xdd,
+                                                       0x4c, 0xa, 0xf7, 0x37, 0xc3, 0x53, 0xcd, 0xf7,
+                                                       0x45, 0xc3, 0xf7, 0x4f, 0xae, 0x13, 0xfe, 0xc0,
+                                                       0x22, 0xa, 0xf7, 0x6f, 0x8a, 0x15, 0xe6, 0x9f,
+                                                       0xf0, 0xe1, 0xbc, 0x9b, 0x70, 0x61, 0x94, 0x1e,
+                                                       0xbd, 0x98, 0x5, 0xcf, 0x81, 0x5f, 0xb2, 0x46,
+                                                       0x1b, 0x53, 0x53, 0x65, 0x58, 0x73, 0x1f, 0x75,
+                                                       0x5b, 0x86, 0x54, 0x57, 0x1a, 0x59, 0x8f, 0x4c,
+                                                       0xa1, 0x5e, 0x1e, 0x58, 0xa3, 0xbd, 0x6c, 0xc4,
+                                                       0x1b, 0xe4, 0xc0, 0xda, 0xde, 0xd9, 0x5a, 0xd0,
+                                                       0x38, 0x73, 0x74, 0x86, 0x7f, 0x78, 0x1f, 0x77,
+                                                       0x80, 0x7c, 0x7a, 0x81, 0x74, 0x8, 0x13, 0xfd,
+                                                       0xc0, 0x95, 0x3b, 0x15, 0xbf, 0xac, 0xb7, 0xc2,
+                                                       0xcb, 0xa4, 0x5d, 0x53, 0x56, 0x76, 0x53, 0x4d,
+                                                       0x4b, 0x6d, 0xc3, 0xc6, 0x1e, 0xe, 0x7d, 0xae,
+                                                       0xf8, 0x8e, 0xc1, 0xe4, 0x74, 0xa, 0xf7, 0x3b,
+                                                       0xf7, 0xcc, 0xf7, 0x3e, 0xae, 0x3, 0x22, 0xa,
+                                                       0xf7, 0x72, 0x6b, 0xa, 0xce, 0x6, 0xa4, 0xf7,
+                                                       0x2e, 0xd7, 0xf7, 0x1f, 0xe4, 0xf7, 0x13, 0x8,
+                                                       0xbd, 0xfb, 0xcc, 0x55, 0xf7, 0x89, 0x7, 0x29,
+                                                       0xfb, 0xb, 0x48, 0xfb, 0x23, 0x72, 0xfb, 0x2e,
+                                                       0x8, 0xe, 0x7d, 0xae, 0xe8, 0xbf, 0xf7, 0x37,
+                                                       0xc1, 0xf7, 0x32, 0xba, 0xdd, 0x4c, 0xa, 0xf7,
+                                                       0x44, 0xc3, 0x64, 0xc3, 0xf7, 0x35, 0xbf, 0x5e,
+                                                       0xc3, 0xf7, 0x44, 0xae, 0x13, 0xfe, 0x60, 0xf7,
+                                                       0xe3, 0xf7, 0xfb, 0x15, 0x55, 0x7c, 0x68, 0x64,
+                                                       0x50, 0x1a, 0x39, 0xc9, 0x59, 0xdc, 0xdc, 0xd4,
+                                                       0xb6, 0xe1, 0xc4, 0x6d, 0xb6, 0x54, 0x9b, 0x1e,
+                                                       0x8d, 0x7, 0x13, 0xfd, 0xa0, 0xbc, 0x9a, 0xa4,
+                                                       0xae, 0xc0, 0x1a, 0xd5, 0x50, 0xbd, 0x43, 0x43,
+                                                       0x49, 0x5b, 0x3e, 0x5c, 0xa7, 0x63, 0xb7, 0x7c,
+                                                       0x1e, 0x7b, 0xf2, 0x15, 0xba, 0xab, 0xa9, 0xba,
+                                                       0xbd, 0xab, 0x6f, 0x5a, 0x58, 0x6b, 0x6d, 0x58,
+                                                       0x56, 0x72, 0xaa, 0xbd, 0x1e, 0x13, 0xfe, 0x60,
+                                                       0x7a, 0xfb, 0x74, 0x15, 0xbe, 0xad, 0xb1, 0xc0,
+                                                       0xc4, 0xb4, 0x74, 0x4f, 0x52, 0x69, 0x74, 0x51,
+                                                       0x56, 0x63, 0xa0, 0xc0, 0x1e, 0xfb, 0x9f, 0xf5,
+                                                       0x21, 0xa, 0xe, 0x7d, 0xae, 0xde, 0xbd, 0xf7,
+                                                       0x13, 0xbf, 0xf7, 0x67, 0xb7, 0xdd, 0x4c, 0xa,
+                                                       0xf7, 0x42, 0xc3, 0x67, 0xbc, 0xf7, 0x39, 0xcd,
+                                                       0x53, 0xc3, 0xf7, 0x43, 0xae, 0x13, 0xfd, 0x60,
+                                                       0x22, 0xa, 0xf7, 0x56, 0xfb, 0x20, 0x15, 0x4a,
+                                                       0x93, 0xb6, 0x66, 0xce, 0x1b, 0xc9, 0xc1, 0xb5,
+                                                       0xc2, 0xa2, 0x1f, 0x9c, 0xb3, 0x91, 0xd1, 0xb7,
+                                                       0x1a, 0xf1, 0x71, 0xf7, 0x17, 0xfb, 0x14, 0x1e,
+                                                       0x13, 0xfe, 0x60, 0x32, 0x52, 0x41, 0x36, 0x3b,
+                                                       0xba, 0x47, 0xe0, 0xbd, 0xb6, 0xa1, 0xb9, 0x9e,
+                                                       0x1f, 0x43, 0x83, 0xfb, 0xf, 0x29, 0x1e, 0x13,
+                                                       0xfd, 0xa0, 0x67, 0x70, 0xa7, 0xad, 0x85, 0x1f,
+                                                       0xd7, 0xf7, 0x9, 0x15, 0x13, 0xfe, 0xa0, 0x4e,
+                                                       0x6f, 0xb3, 0xc3, 0xc8, 0xa0, 0xc1, 0xd1, 0xc4,
+                                                       0xa9, 0x53, 0x58, 0x52, 0x70, 0x5c, 0x4d, 0x1f,
+                                                       0xe, 0x7d, 0xae, 0xdd, 0xb8, 0xf8, 0x1e, 0xb8,
+                                                       0xde, 0x74, 0xa, 0xf7, 0x3a, 0xc8, 0xbc, 0xc3,
+                                                       0xf7, 0x44, 0xc3, 0xe0, 0xae, 0x3, 0xf8, 0x26,
+                                                       0x4d, 0xa, 0xc4, 0x93, 0xf7, 0x1f, 0xdd, 0xe2,
+                                                       0x8a, 0xfb, 0x1b, 0x4e, 0x53, 0x85, 0xfb, 0x22,
+                                                       0x3b, 0x35, 0x87, 0xf7, 0x1d, 0xc8, 0x1e, 0x53,
+                                                       0x16, 0x34, 0xab, 0xfb, 0x30, 0xf7, 0x6, 0xf7,
+                                                       0x17, 0x96, 0xf7, 0x23, 0xef, 0xeb, 0x79, 0xf7,
+                                                       0x25, 0xfb, 0x10, 0xfb, 0x18, 0x7d, 0xfb, 0x21,
+                                                       0x27, 0x1e, 0xfb, 0xcb, 0x16, 0x20, 0xa, 0xf7,
+                                                       0x3a, 0x6b, 0xa, 0xc8, 0xf8, 0x6a, 0x58, 0x6,
+                                                       0x85, 0x56, 0x65, 0x69, 0x5b, 0x8c, 0x8, 0x6d,
+                                                       0xdd, 0x7, 0xe, 0xd3, 0xa0, 0x76, 0xf7, 0x5a,
+                                                       0x96, 0xf8, 0x51, 0x77, 0x1, 0xf3, 0xf9, 0x2c,
+                                                       0x3, 0xf8, 0xaa, 0xf2, 0x15, 0xf7, 0x73, 0x24,
+                                                       0x96, 0x96, 0xfb, 0x10, 0xf7, 0x74, 0xfc, 0x37,
+                                                       0xf8, 0x37, 0x75, 0x75, 0xf8, 0x39, 0xfc, 0x39,
+                                                       0x6f, 0x89, 0xfc, 0x2c, 0xf8, 0x2c, 0x80, 0x81,
+                                                       0xf8, 0x2b, 0xfc, 0x2b, 0x7d, 0x68, 0xfc, 0x36,
+                                                       0xf8, 0x35, 0x5b, 0x5a, 0x5, 0xf8, 0x5c, 0xfc,
+                                                       0x17, 0x15, 0xa0, 0x97, 0x9a, 0xb2, 0xac, 0x8e,
+                                                       0xd8, 0xfb, 0x17, 0x82, 0x82, 0x5, 0xe, 0x7d,
+                                                       0x72, 0xa, 0x1, 0xf7, 0xf6, 0xe5, 0x26, 0xa,
+                                                       0xf7, 0xd3, 0x6b, 0xa, 0xf7, 0xf8, 0x2a, 0xae,
+                                                       0x7, 0xd2, 0x8c, 0xa8, 0xa1, 0x97, 0xd1, 0x8,
+                                                       0xd6, 0xfc, 0x78, 0x6, 0xe, 0x7d, 0xf7, 0x11,
+                                                       0xf8, 0x7e, 0xf3, 0x12, 0xae, 0xf7, 0x54, 0xfb,
+                                                       0x54, 0xf7, 0x5c, 0xdb, 0xf7, 0x2c, 0xe7, 0xf7,
+                                                       0x57, 0x13, 0xec, 0x23, 0xa, 0x13, 0xdc, 0xf7,
+                                                       0x5c, 0x6b, 0xa, 0x89, 0xec, 0xce, 0xbf, 0xc5,
+                                                       0xb0, 0x8, 0xc2, 0xae, 0xc1, 0xaf, 0xd4, 0x1a,
+                                                       0xbd, 0x72, 0xb1, 0x54, 0x54, 0x79, 0x5e, 0x46,
+                                                       0x8c, 0x1e, 0x13, 0xec, 0x33, 0x93, 0x5, 0xf7,
+                                                       0x8, 0xd5, 0xc9, 0xe3, 0xe6, 0xda, 0x4a, 0x2c,
+                                                       0x22, 0x37, 0x5c, 0x3d, 0x57, 0x1e, 0x74, 0x7c,
+                                                       0x6a, 0x77, 0x80, 0x71, 0x8, 0xf7, 0x7a, 0x4a,
+                                                       0x6, 0xe, 0x7d, 0xf7, 0xa, 0xcd, 0xf7, 0x36,
+                                                       0xc3, 0xf7, 0x25, 0xd0, 0xf2, 0x1, 0xf7, 0xd4,
+                                                       0xf7, 0x2b, 0xe3, 0xf7, 0x57, 0x26, 0xa, 0xf7,
+                                                       0x60, 0x40, 0x15, 0xdc, 0x8c, 0x5, 0x4e, 0x8f,
+                                                       0x61, 0xcf, 0x8c, 0x1e, 0xbf, 0x8c, 0xa6, 0xab,
+                                                       0xbd, 0x1a, 0xc3, 0x66, 0xa2, 0x58, 0x1e, 0x5c,
+                                                       0x88, 0x5, 0xc9, 0x7, 0xb2, 0x88, 0x5, 0xbd,
+                                                       0xac, 0xa4, 0xbf, 0xb3, 0x79, 0xa7, 0x5f, 0x50,
+                                                       0x7e, 0x6b, 0x59, 0x8d, 0x1f, 0x39, 0x94, 0x5,
+                                                       0xe8, 0x89, 0xce, 0xbc, 0xe3, 0x1b, 0xd7, 0xd5,
+                                                       0x56, 0x3a, 0x5c, 0x79, 0x68, 0x60, 0x75, 0x1f,
+                                                       0xbc, 0x71, 0xa3, 0x6e, 0x4f, 0x1a, 0x30, 0x3e,
+                                                       0x55, 0x36, 0x3f, 0x39, 0xb4, 0xe1, 0x1e, 0xe,
+                                                       0x7d, 0xf7, 0x11, 0xf8, 0x80, 0xf1, 0x12, 0xf7,
+                                                       0x4e, 0xf7, 0xb7, 0xfb, 0x5e, 0xf7, 0xb, 0x13,
+                                                       0xd0, 0x23, 0xa, 0x13, 0xe0, 0xf7, 0x2b, 0xfb,
+                                                       0x9, 0x15, 0xc7, 0x7, 0xf7, 0x5f, 0xf7, 0xce,
+                                                       0x5, 0xe3, 0xfb, 0xc7, 0xdf, 0x48, 0x37, 0xfb,
+                                                       0xa, 0x6, 0x13, 0xd0, 0x38, 0xf7, 0xa, 0x6,
+                                                       0x13, 0xe0, 0x13, 0xd0, 0xfb, 0xb, 0xce, 0x15,
+                                                       0xf7, 0xb, 0xf7, 0x56, 0x6, 0xe, 0x7d, 0xf7,
+                                                       0xa, 0xf7, 0xf1, 0xd6, 0xce, 0xf7, 0x2, 0x1,
+                                                       0xf8, 0xce, 0xf7, 0x4c, 0x26, 0xa, 0xf7, 0x69,
+                                                       0xfb, 0x2, 0x15, 0xda, 0x9d, 0x5, 0x61, 0x87,
+                                                       0xa5, 0x66, 0xb9, 0x1b, 0xd0, 0x9b, 0xc8, 0xc5,
+                                                       0xbb, 0x74, 0xb4, 0x54, 0x5a, 0x77, 0x6e, 0x61,
+                                                       0x84, 0x1f, 0x44, 0xf7, 0xaf, 0xf7, 0xbf, 0x48,
+                                                       0xfb, 0x70, 0x2d, 0x6, 0x97, 0xa4, 0xa2, 0x92,
+                                                       0xa7, 0x1b, 0xef, 0xc7, 0x44, 0x2a, 0x27, 0x42,
+                                                       0x3a, 0x26, 0x3c, 0x49, 0xbd, 0xdd, 0x88, 0x1f,
+                                                       0xe, 0x7d, 0xf7, 0xa, 0xd1, 0xf7, 0x4e, 0xce,
+                                                       0xf5, 0xd0, 0xf2, 0x1, 0xae, 0xf7, 0x4c, 0xe5,
+                                                       0xf7, 0x2e, 0x26, 0xa, 0xf7, 0xa0, 0xb9, 0x15,
+                                                       0xa4, 0xa9, 0xa7, 0x95, 0xb2, 0x1b, 0xe4, 0xc4,
+                                                       0x47, 0x34, 0x31, 0x4d, 0x3d, 0x2d, 0xfb, 0x20,
+                                                       0x6c, 0xf7, 0x1a, 0xf7, 0x5, 0xf7, 0x4, 0xb2,
+                                                       0xf7, 0x1f, 0xf7, 0x1e, 0xd7, 0xbf, 0x61, 0x40,
+                                                       0x95, 0x1f, 0x3f, 0x76, 0x5, 0xb0, 0x81, 0x86,
+                                                       0xab, 0x5a, 0x1b, 0x45, 0x78, 0x36, 0x53, 0x89,
+                                                       0x1f, 0x91, 0xfb, 0xc, 0x15, 0x58, 0xa5, 0x5c,
+                                                       0xc5, 0xc2, 0x9a, 0xb9, 0xb8, 0xbb, 0x79, 0xba,
+                                                       0x51, 0x59, 0x6f, 0x5f, 0x5f, 0x1e, 0xe, 0x7d,
+                                                       0x72, 0xa, 0x1, 0xf7, 0x73, 0xf7, 0xe8, 0x26,
+                                                       0xa, 0xf7, 0x9a, 0x6b, 0xa, 0xa2, 0xf7, 0x2c,
+                                                       0xc1, 0xf7, 0x21, 0xed, 0xf7, 0xf, 0x8, 0xfb,
+                                                       0x8d, 0xcf, 0xf7, 0xe8, 0x4d, 0x6, 0x32, 0xfb,
+                                                       0x17, 0x3d, 0xfb, 0x18, 0x73, 0xfb, 0x33, 0x8,
+                                                       0xe, 0x7d, 0xf7, 0xa, 0xd0, 0xf7, 0x2a, 0xda,
+                                                       0xf7, 0x16, 0xd0, 0xf3, 0x12, 0xae, 0xf7, 0x59,
+                                                       0xde, 0xf7, 0x33, 0xfb, 0x24, 0xf7, 0x1c, 0xe6,
+                                                       0xf7, 0x59, 0x13, 0xfb, 0x23, 0xa, 0xf7, 0xab,
+                                                       0xa0, 0x15, 0x64, 0x9c, 0x72, 0xb5, 0xb4, 0x1a,
+                                                       0xdf, 0xd4, 0xbd, 0xd9, 0xd7, 0xd0, 0x56, 0x3a,
+                                                       0x5b, 0x76, 0x6a, 0x5e, 0x78, 0x1e, 0xbe, 0x6f,
+                                                       0xa5, 0x6d, 0x4d, 0x1a, 0x34, 0x3d, 0x53, 0x38,
+                                                       0x33, 0x3f, 0xbc, 0xe9, 0xc1, 0xaa, 0xbb, 0xbe,
+                                                       0x9d, 0x1e, 0x9b, 0xef, 0x15, 0x62, 0xa2, 0x73,
+                                                       0xb7, 0xb9, 0xa2, 0xa1, 0xb6, 0xb5, 0x75, 0xa2,
+                                                       0x5e, 0x5b, 0x76, 0x75, 0x60, 0x1e, 0x13, 0xfd,
+                                                       0x7c, 0xfb, 0x70, 0x15, 0x5c, 0xaa, 0x70, 0xbc,
+                                                       0xc0, 0xa5, 0xa4, 0xbc, 0xbb, 0x6f, 0xa7, 0x5a,
+                                                       0x56, 0x6e, 0x72, 0x58, 0x1e, 0xe, 0x7d, 0xf7,
+                                                       0xa, 0xd1, 0xf6, 0xcf, 0xf7, 0x4d, 0xce, 0xf3,
+                                                       0x1, 0xae, 0xf7, 0x57, 0xdf, 0xf7, 0x32, 0xe0,
+                                                       0xf7, 0x59, 0x26, 0xa, 0xf7, 0x6a, 0xfb, 0x14,
+                                                       0x15, 0xd7, 0x99, 0x5, 0x6c, 0x90, 0x9b, 0x70,
+                                                       0xaf, 0x1b, 0xd4, 0x99, 0xe0, 0xc2, 0x8e, 0x1f,
+                                                       0x73, 0x72, 0x67, 0x82, 0x68, 0x1b, 0x30, 0x54,
+                                                       0xce, 0xe3, 0xe7, 0xcc, 0xd4, 0xea, 0xf7, 0x18,
+                                                       0xae, 0xfb, 0xe, 0xfb, 0x3, 0x58, 0x86, 0x3b,
+                                                       0x72, 0x5e, 0x1f, 0x52, 0x6c, 0x54, 0x6c, 0x4b,
+                                                       0x1b, 0x45, 0x57, 0xb7, 0xd1, 0x85, 0x1f, 0xcc,
+                                                       0xf7, 0x68, 0x15, 0x5c, 0xa3, 0x69, 0xbe, 0xc3,
+                                                       0xa1, 0xb4, 0xbc, 0xbc, 0x71, 0xb9, 0x53, 0x4e,
+                                                       0x81, 0x51, 0x5d, 0x1e, 0xe, 0x7d, 0xf7, 0x9,
+                                                       0xfb, 0x9, 0x72, 0xa, 0x23, 0xf3, 0x12, 0xae,
+                                                       0xf7, 0x4f, 0xf7, 0x53, 0xf7, 0x29, 0xdf, 0xf7,
+                                                       0x0, 0x13, 0x6e, 0xf7, 0x72, 0xf7, 0x3, 0x15,
+                                                       0xf7, 0xf6, 0x39, 0xad, 0x7, 0xc1, 0x8a, 0xad,
+                                                       0xb0, 0x90, 0xc7, 0x8, 0xd9, 0xfc, 0x78, 0x6,
+                                                       0xfb, 0xa8, 0xf7, 0x7f, 0x15, 0x2c, 0xa, 0xf7,
+                                                       0xbb, 0x97, 0x15, 0x13, 0x9e, 0xf7, 0x2, 0x9d,
+                                                       0xf7, 0x19, 0xf7, 0x21, 0xf7, 0x1a, 0xa2, 0xfb,
+                                                       0x1d, 0x21, 0xfb, 0x2, 0x7a, 0xfb, 0x25, 0xfb,
+                                                       0x20, 0xfb, 0xe, 0x66, 0xf7, 0x33, 0xeb, 0x1e,
+                                                       0xde, 0x16, 0x59, 0x8e, 0xfb, 0x26, 0xd4, 0xce,
+                                                       0x91, 0xf7, 0x2a, 0xb9, 0xbf, 0x8c, 0xf7, 0x1c,
+                                                       0x41, 0x46, 0x84, 0xfb, 0x1f, 0x5a, 0x1e, 0xe,
+                                                       0xe9, 0xf7, 0x89, 0xd0, 0x49, 0xf7, 0xb, 0x6c,
+                                                       0xce, 0x7c, 0xaa, 0x1, 0xa2, 0xf7, 0x8c, 0x15,
+                                                       0xf8, 0xf5, 0x6, 0xf7, 0x7a, 0xe0, 0x5, 0x9a,
+                                                       0x7, 0xfb, 0x8a, 0xd2, 0x5, 0xfc, 0xe5, 0x6c,
+                                                       0xf8, 0xe8, 0x6, 0x78, 0x76, 0x5, 0xfc, 0xd5,
+                                                       0x7c, 0xf8, 0xd3, 0x6, 0x9a, 0x68, 0x5, 0xfc,
+                                                       0xe2, 0x6, 0xf8, 0xe8, 0x77, 0x15, 0x92, 0xa2,
+                                                       0x7a, 0xb2, 0xa0, 0xa4, 0xf7, 0x27, 0x65, 0x5,
+                                                       0x7e, 0x7, 0xe, 0xc2, 0xa3, 0x76, 0xf7, 0xb9,
+                                                       0xe2, 0xf7, 0xba, 0x77, 0x1, 0xc1, 0xf9, 0xb9,
+                                                       0x3, 0xc1, 0xf7, 0xb5, 0x15, 0xf7, 0xc4, 0x9a,
+                                                       0x5, 0xfb, 0xc0, 0x7, 0x8d, 0x8a, 0xf8, 0x87,
+                                                       0xf7, 0xe4, 0x75, 0xa, 0xfc, 0x87, 0xf7, 0xe4,
+                                                       0x89, 0x8a, 0x5, 0xfb, 0xc0, 0x7, 0xfb, 0xc4,
+                                                       0x9a, 0x5, 0xe, 0x8a, 0xf7, 0x41, 0x76, 0xf7,
+                                                       0x4b, 0xa2, 0xf7, 0x4a, 0x54, 0xa, 0xf7, 0xe3,
+                                                       0x15, 0xf8, 0xbe, 0x6, 0x61, 0x57, 0x65, 0x4d,
+                                                       0x8e, 0x46, 0xca, 0xe2, 0xf7, 0x12, 0xd1, 0xf1,
+                                                       0xb0, 0x25, 0xb0, 0xfb, 0x10, 0xd1, 0x4a, 0xe2,
+                                                       0x8a, 0x4c, 0xab, 0x3e, 0xb9, 0x61, 0x8, 0xfc,
+                                                       0xbe, 0x6, 0xe, 0x49, 0xa, 0xf7, 0xba, 0xfb,
+                                                       0x8c, 0x5, 0xfb, 0x4b, 0xfb, 0x44, 0x15, 0xf7,
+                                                       0x78, 0xf7, 0x44, 0x5, 0xf8, 0x39, 0x6, 0xe,
+                                                       0xf7, 0x45, 0xf7, 0x41, 0x76, 0xf7, 0x4b, 0xa2,
+                                                       0xf7, 0x4a, 0x77, 0x1, 0xad, 0x4d, 0xa, 0xf2,
+                                                       0x65, 0xed, 0x45, 0xcc, 0x35, 0x8c, 0xca, 0x6b,
+                                                       0xd6, 0x5d, 0xb8, 0x8, 0xf8, 0xce, 0x6, 0x61,
+                                                       0x57, 0x64, 0x4d, 0x8f, 0x46, 0xca, 0xe2, 0xf0,
+                                                       0xd1, 0xf0, 0xb0, 0x25, 0xaf, 0x29, 0xd2, 0x4a,
+                                                       0xe2, 0x8a, 0x4c, 0xaa, 0x3d, 0xba, 0x62, 0x8,
+                                                       0xfc, 0xce, 0x6, 0xb5, 0xbd, 0xb1, 0xc9, 0x88,
+                                                       0xd1, 0x4c, 0x33, 0x26, 0x45, 0x25, 0x67, 0x8,
+                                                       0xe, 0xfc, 0x11, 0x23, 0x76, 0xfa, 0x45, 0x77,
+                                                       0x1, 0xf7, 0x6d, 0xa2, 0x3, 0xae, 0xf7, 0x1e,
+                                                       0x15, 0xe2, 0x4c, 0xd1, 0x28, 0xb0, 0x26, 0xaf,
+                                                       0xf1, 0xd2, 0xeb, 0xe1, 0xcc, 0x4d, 0x8c, 0x3d,
+                                                       0x6c, 0x61, 0x5c, 0x8, 0xf8, 0xce, 0x7, 0xbe,
+                                                       0x61, 0xc9, 0x65, 0xd0, 0x8e, 0x34, 0xca, 0x45,
+                                                       0xf0, 0x67, 0xf1, 0x65, 0x24, 0x45, 0x29, 0x35,
+                                                       0x4a, 0xca, 0x8a, 0xd6, 0xab, 0xb7, 0xb9, 0x8,
+                                                       0xfc, 0xce, 0x7, 0x58, 0xb5, 0x4d, 0xb2, 0x46,
+                                                       0x87, 0x8, 0xe, 0xe0, 0xcb, 0x76, 0xf7, 0x97,
+                                                       0xd5, 0xf7, 0x98, 0x77, 0x1, 0xc3, 0xf9, 0xcc,
+                                                       0x3, 0xc3, 0xf7, 0xbc, 0x15, 0xf8, 0x12, 0x98,
+                                                       0x5, 0xfb, 0x9d, 0x7, 0x8c, 0x8a, 0xf8, 0x4d,
+                                                       0xf7, 0xbc, 0x75, 0xa, 0xfc, 0x4d, 0xf7, 0xbb,
+                                                       0x8a, 0x8a, 0x5, 0xfb, 0x9d, 0x7, 0xfc, 0x12,
+                                                       0x98, 0x5, 0xe, 0xda, 0xf7, 0xdb, 0xa5, 0x71,
+                                                       0xa6, 0x7f, 0x94, 0x12, 0x9f, 0xfa, 0x3, 0x13,
+                                                       0x90, 0xc3, 0xf7, 0xd9, 0x15, 0xf9, 0x1c, 0x8f,
+                                                       0x3c, 0x7a, 0xfb, 0x0, 0x57, 0x75, 0x58, 0x19,
+                                                       0x7d, 0x85, 0x8c, 0x82, 0x8f, 0x1b, 0x8d, 0x8f,
+                                                       0x8e, 0x8e, 0x8d, 0x1f, 0xca, 0xe0, 0xf7, 0x5a,
+                                                       0xb4, 0xf3, 0x9a, 0x8, 0x8d, 0x8c, 0x8c, 0x8d,
+                                                       0x8c, 0x1f, 0x13, 0x30, 0x8e, 0x8d, 0x8e, 0x8e,
+                                                       0x95, 0x1b, 0x92, 0x8c, 0x94, 0x8e, 0x8e, 0x1a,
+                                                       0x8c, 0x88, 0x8c, 0x88, 0x1e, 0xfb, 0x19, 0x95,
+                                                       0xfb, 0x2f, 0xb1, 0x46, 0xe6, 0x8, 0x8d, 0x89,
+                                                       0x89, 0x8e, 0x8a, 0x1b, 0x89, 0x8d, 0x81, 0x80,
+                                                       0x8f, 0x1f, 0xa2, 0x53, 0xdd, 0x67, 0xd7, 0x6d,
+                                                       0x8, 0x13, 0x50, 0xfc, 0xf7, 0x8d, 0x5, 0x70,
+                                                       0x66, 0x94, 0x8d, 0x78, 0x1f, 0x88, 0x8c, 0x87,
+                                                       0x89, 0x88, 0x1a, 0x88, 0x8e, 0x88, 0x90, 0x86,
+                                                       0x1e, 0x90, 0x86, 0x95, 0x7e, 0x9a, 0x84, 0x8,
+                                                       0xe, 0xe3, 0xc0, 0x76, 0xf7, 0x7c, 0xf7, 0x38,
+                                                       0xf7, 0x7c, 0x77, 0x12, 0xae, 0xf9, 0xed, 0x17,
+                                                       0xf8, 0xda, 0xf7, 0x9c, 0x15, 0x4d, 0x4d, 0x5,
+                                                       0x76, 0x74, 0x7d, 0x74, 0x6a, 0x1a, 0x57, 0xb3,
+                                                       0x64, 0xbe, 0xaf, 0xa4, 0xa3, 0xa4, 0xa0, 0x1e,
+                                                       0x13, 0x30, 0xf7, 0x7e, 0xf7, 0x9d, 0xfb, 0x81,
+                                                       0xf7, 0xa1, 0x5, 0xa3, 0x77, 0x72, 0xa0, 0x6a,
+                                                       0x1b, 0x13, 0x50, 0x56, 0x64, 0x61, 0x56, 0x6f,
+                                                       0xa1, 0x70, 0x9e, 0x78, 0x1f, 0xc3, 0x4c, 0x5,
+                                                       0xfc, 0x48, 0x6, 0x51, 0x56, 0x7a, 0x4a, 0x47,
+                                                       0xbf, 0x7d, 0xc6, 0x1f, 0xe, 0xe4, 0xf7, 0x2a,
+                                                       0x76, 0xf7, 0x5c, 0xac, 0xf7, 0x5c, 0x54, 0xa,
+                                                       0xf9, 0xec, 0x3, 0xae, 0xf7, 0xdd, 0x15, 0xf8,
+                                                       0xff, 0xfb, 0x5c, 0x6, 0xf7, 0x81, 0xf7, 0x6d,
+                                                       0xfb, 0x81, 0xf7, 0x6c, 0x5, 0xfb, 0x5c, 0xfc,
+                                                       0xff, 0x7, 0xe, 0xe4, 0xf7, 0x29, 0x76, 0xf7,
+                                                       0x34, 0xf7, 0x8, 0xf7, 0x33, 0x54, 0xa, 0xf9,
+                                                       0xee, 0x3, 0xae, 0xf7, 0xb4, 0x15, 0xf8, 0xff,
+                                                       0xfb, 0x34, 0x6, 0xf7, 0x83, 0xf7, 0x6e, 0xfb,
+                                                       0x83, 0xf7, 0x6d, 0x5, 0xfb, 0x33, 0xfc, 0xff,
+                                                       0x7, 0xe, 0xf5, 0x43, 0x76, 0xf9, 0xd6, 0x77,
+                                                       0x1, 0x34, 0xa, 0xfc, 0x7d, 0xfc, 0xc3, 0x15,
+                                                       0xb5, 0x64, 0xf7, 0xc, 0xd6, 0xf7, 0x25, 0xaf,
+                                                       0xf7, 0x1f, 0x99, 0x19, 0xbc, 0xf7, 0x58, 0xcb,
+                                                       0xd9, 0xf7, 0x11, 0xf7, 0x2e, 0x8, 0x8e, 0x94,
+                                                       0x8d, 0x93, 0x94, 0x1a, 0xb6, 0x61, 0xb8, 0x5d,
+                                                       0x7b, 0x7b, 0x86, 0x7e, 0x7b, 0x1e, 0xfb, 0x19,
+                                                       0xfb, 0x1e, 0x21, 0x36, 0xfb, 0x32, 0xfb, 0x0,
+                                                       0x6a, 0x31, 0x4d, 0xfb, 0x7, 0x4e, 0x41, 0x8,
+                                                       0xb1, 0x95, 0x15, 0xa3, 0xa9, 0xa7, 0xb3, 0x9b,
+                                                       0xa8, 0xa7, 0xbd, 0xa4, 0xbe, 0x9e, 0xbf, 0xe0,
+                                                       0xc5, 0xde, 0xc8, 0xd8, 0xce, 0xbe, 0xb7, 0xba,
+                                                       0xba, 0xba, 0xbb, 0x8, 0x95, 0x95, 0x8f, 0x90,
+                                                       0x9b, 0x1b, 0xa9, 0xad, 0x6d, 0x6d, 0x81, 0x87,
+                                                       0x85, 0x86, 0x84, 0x1f, 0x72, 0x6b, 0x70, 0x6b,
+                                                       0x73, 0x6a, 0x3d, 0x24, 0x61, 0x38, 0x6a, 0xfb,
+                                                       0x11, 0xfb, 0x0, 0x7f, 0xfb, 0xa, 0x6e, 0x26,
+                                                       0x5b, 0x7b, 0x84, 0x78, 0x80, 0x81, 0x84, 0x8a,
+                                                       0x8c, 0x18, 0xf7, 0x21, 0xf7, 0x2a, 0x5, 0xa8,
+                                                       0xab, 0xae, 0xa7, 0x92, 0x84, 0x93, 0x83, 0x6e,
+                                                       0x65, 0x68, 0x6d, 0x90, 0x1f, 0xfb, 0x1d, 0xfb,
+                                                       0x2c, 0x5, 0xe, 0x86, 0xf7, 0x44, 0x76, 0xf2,
+                                                       0xf7, 0x44, 0xf2, 0x54, 0xa, 0xa4, 0xcb, 0xba,
+                                                       0xaf, 0xd9, 0x3, 0xf7, 0xca, 0xf7, 0x96, 0x15,
+                                                       0xf7, 0x99, 0x24, 0x6, 0xf7, 0x78, 0xf7, 0x53,
+                                                       0xfb, 0x78, 0xf7, 0x53, 0x5, 0x24, 0xfb, 0x99,
+                                                       0x7, 0x24, 0xfb, 0x44, 0x15, 0xd9, 0xf7, 0x44,
+                                                       0x3d, 0x6, 0x38, 0xfb, 0x44, 0x15, 0xba, 0xf7,
+                                                       0x44, 0x5c, 0x6, 0x32, 0xfb, 0x44, 0x15, 0xa4,
+                                                       0xf7, 0x44, 0x72, 0x6, 0xe, 0xad, 0xf7, 0x6,
+                                                       0x76, 0xf8, 0x8e, 0x54, 0xa, 0xa2, 0xd3, 0xab,
+                                                       0xc6, 0xbe, 0xb1, 0xd5, 0x3, 0xf8, 0x2c, 0xf7,
+                                                       0x5b, 0x15, 0xf7, 0x3a, 0x21, 0x92, 0x6, 0xb7,
+                                                       0xf7, 0xb, 0xf4, 0xe3, 0xf7, 0x0, 0xb9, 0xfb,
+                                                       0x2, 0xba, 0xfb, 0x0, 0xe6, 0x64, 0xf7, 0x7,
+                                                       0x8, 0x84, 0x21, 0xfb, 0x3a, 0x6, 0x29, 0xfb,
+                                                       0xba, 0x15, 0xd5, 0xf7, 0xba, 0x41, 0x6, 0x32,
+                                                       0xfb, 0xba, 0x15, 0xbe, 0xf7, 0xba, 0x58, 0x6,
+                                                       0x30, 0xfb, 0xba, 0x15, 0xab, 0xf7, 0xba, 0x6b,
+                                                       0x6, 0x2c, 0xfb, 0xba, 0x15, 0xa2, 0xf7, 0xba,
+                                                       0x74, 0x6, 0xe, 0x80, 0xf7, 0x11, 0x76, 0xf8,
+                                                       0x78, 0x54, 0xa, 0xf9, 0x88, 0x3, 0xae, 0xf7,
+                                                       0x5d, 0x15, 0xf8, 0x8b, 0x2a, 0x6, 0xf7, 0x91,
+                                                       0xf7, 0x86, 0xfb, 0x91, 0xf7, 0x86, 0x5, 0x2a,
+                                                       0xfc, 0x8b, 0x7, 0xe, 0x49, 0xa, 0xf7, 0xbc,
+                                                       0xfb, 0x8c, 0x5, 0xb8, 0x16, 0xfb, 0x70, 0xf7,
+                                                       0x44, 0xf9, 0x13, 0xfb, 0x44, 0x5, 0xe, 0xd9,
+                                                       0x3d, 0xa, 0xf9, 0xe3, 0x7a, 0xa, 0xf9, 0xe3,
+                                                       0xf7, 0xee, 0xfd, 0xe3, 0xf7, 0xee, 0xf7, 0x67,
+                                                       0xfb, 0xee, 0x5, 0xe, 0xe6, 0xf4, 0x76, 0xf7,
+                                                       0xaf, 0xd8, 0xf7, 0x38, 0x54, 0xa, 0xb3, 0x3,
+                                                       0xf8, 0xb5, 0xdf, 0x15, 0x76, 0xa, 0x23, 0xfb,
+                                                       0xcb, 0x7, 0x25, 0x8a, 0x52, 0xa8, 0xf7, 0x1c,
+                                                       0x1a, 0x63, 0xfb, 0x85, 0x6, 0x8c, 0x4e, 0x8b,
+                                                       0x6f, 0xb8, 0x5c, 0x8, 0x62, 0xb1, 0xb9, 0x87,
+                                                       0xc0, 0x1b, 0xf7, 0xdb, 0x6, 0xe, 0xe7, 0xf4,
+                                                       0x76, 0xf7, 0x37, 0xf7, 0x97, 0xf1, 0x54, 0xa,
+                                                       0xb3, 0x3, 0xae, 0xdf, 0x15, 0xb3, 0x6, 0xf7,
+                                                       0x1c, 0xc5, 0xa7, 0xf1, 0x8a, 0x1e, 0xf7, 0xca,
+                                                       0x24, 0x6, 0x76, 0xa, 0x25, 0xfb, 0xdb, 0x7,
+                                                       0x56, 0x5e, 0x86, 0x62, 0x64, 0x1f, 0x5f, 0x5d,
+                                                       0x8a, 0x6e, 0x8a, 0x4f, 0x8, 0xe, 0xfc, 0xc,
+                                                       0x3d, 0x76, 0xfa, 0xe, 0x54, 0xa, 0xf8, 0x1e,
+                                                       0x3, 0xae, 0xc2, 0x15, 0xf7, 0x14, 0xfb, 0x2e,
+                                                       0x6, 0xf7, 0x9e, 0xf8, 0x51, 0xfb, 0x9e, 0xf8,
+                                                       0x51, 0x5, 0xfb, 0x2e, 0xfb, 0x14, 0x7, 0xe,
+                                                       0xb7, 0xe7, 0x76, 0xf8, 0xbc, 0x77, 0x1, 0xf8,
+                                                       0x42, 0x96, 0x3, 0xae, 0xf7, 0x38, 0x15, 0xf8,
+                                                       0x1f, 0x2e, 0x96, 0x6, 0xae, 0xd2, 0xf7, 0x7e,
+                                                       0xf7, 0x71, 0xf7, 0x1e, 0x77, 0x8, 0x94, 0x7,
+                                                       0xfb, 0x3d, 0x9f, 0xfb, 0x29, 0xf6, 0x32, 0xf7,
+                                                       0x24, 0x8, 0x80, 0x2d, 0xfc, 0x1f, 0x6, 0xe,
+                                                       0x88, 0xb7, 0xa0, 0x76, 0x6c, 0xa, 0x76, 0xa0,
+                                                       0x12, 0xae, 0xa5, 0xf7, 0xe4, 0xa5, 0x13, 0xb7,
+                                                       0xae, 0xf7, 0x5d, 0x15, 0xf7, 0xfe, 0x6, 0x13,
+                                                       0x4b, 0xfb, 0x31, 0xf7, 0x28, 0x7, 0xf7, 0x95,
+                                                       0xf7, 0xc2, 0xfb, 0x95, 0xf7, 0xc2, 0x5, 0xfb,
+                                                       0x28, 0x6, 0x13, 0xb7, 0xfb, 0x31, 0xfb, 0xfe,
+                                                       0x7, 0xa5, 0xfb, 0x9d, 0x15, 0xf7, 0x84, 0xf7,
+                                                       0xfe, 0xf7, 0x35, 0x7, 0xf7, 0x8e, 0xfb, 0xad,
+                                                       0xfb, 0x8e, 0x7d, 0xa, 0xf7, 0x1b, 0x50, 0x76,
+                                                       0xf8, 0x57, 0xf7, 0x47, 0x8b, 0xb3, 0x8b, 0xa0,
+                                                       0xf7, 0x16, 0x77, 0x1, 0xc6, 0xf9, 0xde, 0x3,
+                                                       0x34, 0xa, 0xfc, 0x6f, 0xfc, 0xc1, 0x15, 0x96,
+                                                       0x83, 0xf7, 0x2b, 0xf7, 0x3b, 0x5, 0xa9, 0x86,
+                                                       0xb1, 0xae, 0xa8, 0x1b, 0x93, 0x92, 0x83, 0x84,
+                                                       0x6f, 0x6b, 0x68, 0x6e, 0x1f, 0xfb, 0x30, 0xfb,
+                                                       0x3a, 0x93, 0x83, 0xf7, 0x6, 0xd2, 0xf7, 0x2b,
+                                                       0xb0, 0xf7, 0x15, 0x99, 0x19, 0xb8, 0xf7, 0x4a,
+                                                       0xca, 0xdd, 0xf7, 0x9, 0xf7, 0x24, 0x8, 0x89,
+                                                       0x6, 0xbd, 0x91, 0x6f, 0xbd, 0x52, 0x1b, 0x83,
+                                                       0x83, 0x89, 0x8a, 0x83, 0x1f, 0x6b, 0x69, 0xfb,
+                                                       0x1, 0xfb, 0x5, 0xfb, 0x10, 0x2e, 0xfb, 0x15,
+                                                       0x33, 0x19, 0x6f, 0x3e, 0x4c, 0xfb, 0xf, 0x50,
+                                                       0x44, 0x8, 0xe, 0xa7, 0x90, 0xf9, 0x4e, 0x1,
+                                                       0xc5, 0xf9, 0x73, 0x3, 0xf3, 0xf7, 0xbe, 0x15,
+                                                       0xbc, 0xf7, 0x44, 0xf7, 0x8f, 0x64, 0x5, 0x8b,
+                                                       0xc8, 0xf7, 0x51, 0x88, 0x1a, 0x88, 0x8a, 0xf7,
+                                                       0xa7, 0xfb, 0x86, 0x8b, 0x1a, 0x88, 0x7, 0x8e,
+                                                       0xfc, 0x28, 0xfb, 0x75, 0x8b, 0x1e, 0x8a, 0xb9,
+                                                       0xf7, 0x48, 0x8b, 0x1e, 0xfb, 0xd5, 0xfb, 0x16,
+                                                       0x15, 0xf7, 0x92, 0xb4, 0x6b, 0xfb, 0x16, 0x88,
+                                                       0xfb, 0x0, 0xf8, 0x98, 0xf7, 0xad, 0x5, 0xf5,
+                                                       0x7, 0xfb, 0xee, 0xf7, 0xcb, 0x44, 0xfb, 0x6e,
+                                                       0xfb, 0x91, 0xb2, 0x4d, 0xfb, 0x76, 0x5, 0xe,
+                                                       0xfb, 0x23, 0xcc, 0x76, 0xe4, 0xe4, 0xf7, 0xb8,
+                                                       0xa8, 0xf4, 0x54, 0xa, 0xa7, 0xf7, 0x78, 0xa5,
+                                                       0x3, 0xf7, 0xd, 0xf7, 0x19, 0x15, 0xf7, 0x3e,
+                                                       0x71, 0x6, 0xd7, 0x4c, 0xf7, 0xba, 0xf7, 0xb0,
+                                                       0xfc, 0x6, 0xf7, 0xd4, 0x5, 0x22, 0xfb, 0x94,
+                                                       0xfb, 0xe6, 0x7, 0xa7, 0x9c, 0x15, 0xf7, 0xb8,
+                                                       0xf7, 0x92, 0xd6, 0x7, 0xf7, 0x96, 0xfb, 0x72,
+                                                       0xfb, 0x96, 0xfb, 0x88, 0x5, 0xee, 0x7, 0xe,
+                                                       0xae, 0xed, 0x76, 0xeb, 0xcf, 0xf7, 0x99, 0xa5,
+                                                       0xe6, 0x77, 0x1, 0xf8, 0xb6, 0xa3, 0x3, 0xf3,
+                                                       0xf7, 0x41, 0x15, 0xf8, 0x4e, 0x66, 0x6, 0xc9,
+                                                       0x50, 0xf7, 0x7c, 0xf7, 0x8a, 0xfb, 0xba, 0xf7,
+                                                       0xbc, 0x5, 0x30, 0xfc, 0x91, 0x7, 0xd8, 0xfb,
+                                                       0x31, 0x3c, 0xfb, 0x16, 0x5, 0xa7, 0x16, 0xd9,
+                                                       0xf7, 0x16, 0x4b, 0xf7, 0x17, 0x5, 0xf8, 0x81,
+                                                       0xc7, 0x6, 0xf7, 0x4e, 0xfb, 0x53, 0xfb, 0x4e,
+                                                       0xfb, 0x4b, 0x5, 0xc0, 0x7, 0xe, 0x3c, 0x9c,
+                                                       0x76, 0xf9, 0x43, 0x77, 0x1, 0xb6, 0xf7, 0x3c,
+                                                       0x3, 0xb6, 0xf7, 0xe8, 0x15, 0xfb, 0x52, 0xf7,
+                                                       0x2b, 0xfb, 0x2e, 0xf7, 0x4e, 0xf7, 0x4e, 0xf7,
+                                                       0x2b, 0xf7, 0x2e, 0xf7, 0x52, 0xf7, 0x52, 0xfb,
+                                                       0x2b, 0xf7, 0x2d, 0xfb, 0x4e, 0xfb, 0x4e, 0xfb,
+                                                       0x2b, 0xfb, 0x2d, 0xfb, 0x52, 0x1e, 0xf7, 0x3c,
+                                                       0xfb, 0xb4, 0x15, 0xf8, 0xd4, 0x7, 0x8c, 0x8c,
+                                                       0xf8, 0x87, 0xfb, 0xb4, 0x80, 0xa, 0xfc, 0x87,
+                                                       0xfb, 0xb4, 0x5, 0xe, 0xf6, 0xf7, 0xb, 0x76,
+                                                       0xf7, 0xd, 0xad, 0xd2, 0xab, 0xd2, 0xad, 0xf7,
+                                                       0xd, 0x77, 0x1, 0xf9, 0x3a, 0xac, 0x3, 0xb2,
+                                                       0xf7, 0x6f, 0x15, 0xf7, 0xed, 0x6, 0xec, 0xf4,
+                                                       0x5, 0xf7, 0x59, 0xfb, 0x76, 0x6, 0xf7, 0x7d,
+                                                       0xf7, 0x86, 0xfb, 0x7d, 0xf7, 0x86, 0x5, 0xfb,
+                                                       0x76, 0xfb, 0x59, 0x7, 0x2a, 0xf4, 0x5, 0xfb,
+                                                       0xed, 0x6, 0xf7, 0x6, 0xfb, 0xd, 0x5, 0xf8,
+                                                       0xc2, 0xfb, 0x3b, 0x15, 0xf7, 0xe2, 0x7, 0xf7,
+                                                       0x32, 0xfb, 0x3b, 0x5, 0xfd, 0x8b, 0x34, 0x15,
+                                                       0xdf, 0xe2, 0x37, 0xe2, 0x5, 0xf7, 0x9f, 0x6,
+                                                       0xda, 0x34, 0x3c, 0x34, 0x5, 0xe, 0xa5, 0xf8,
+                                                       0x87, 0xf7, 0xda, 0x15, 0xf7, 0x2d, 0x6, 0x71,
+                                                       0x69, 0x8b, 0x5c, 0xaa, 0x6a, 0xb3, 0xc7, 0xce,
+                                                       0xb4, 0xcd, 0xb2, 0x48, 0xa6, 0x49, 0xb3, 0x63,
+                                                       0xc8, 0x69, 0x6e, 0x8e, 0x54, 0xa5, 0x6d, 0x8,
+                                                       0xfb, 0x2d, 0x6, 0xfc, 0x64, 0xfb, 0x33, 0x15,
+                                                       0xf7, 0xe8, 0x6, 0xf7, 0xb, 0xf7, 0xb, 0x5,
+                                                       0xfb, 0xe6, 0x6, 0xb3, 0x4, 0xf7, 0xe6, 0x6,
+                                                       0x90, 0xfb, 0x11, 0xf7, 0x7, 0x8b, 0x1f, 0xfb,
+                                                       0xe7, 0x6, 0xe, 0xf7, 0x14, 0xf7, 0x25, 0x76,
+                                                       0xf7, 0x61, 0xad, 0xf7, 0x61, 0x77, 0x1, 0xf7,
+                                                       0x4a, 0xf8, 0x73, 0x3, 0xae, 0xf7, 0x23, 0x15,
+                                                       0xf7, 0xe6, 0x6, 0x91, 0xc0, 0xa0, 0xd2, 0xb6,
+                                                       0xaa, 0x8, 0xa9, 0xb5, 0xd8, 0x8c, 0xbd, 0x1b,
+                                                       0xe7, 0x6, 0x56, 0x53, 0x88, 0x31, 0x98, 0x50,
+                                                       0xd5, 0xe6, 0xe2, 0xe2, 0xf7, 0x2, 0xb7, 0xfb,
+                                                       0x2, 0xb9, 0x30, 0xdd, 0x45, 0xe9, 0x7e, 0x64,
+                                                       0x90, 0xfb, 0x7, 0xbe, 0x58, 0x8, 0x2f, 0x6,
+                                                       0x4f, 0x4e, 0x8b, 0xb5, 0x5b, 0x1f, 0x65, 0xab,
+                                                       0x70, 0xc8, 0x86, 0xbe, 0x8, 0xfb, 0xe6, 0x6,
+                                                       0x97, 0x30, 0xbb, 0x3d, 0xe2, 0x69, 0x35, 0x6c,
+                                                       0x56, 0x37, 0x83, 0x33, 0x8, 0xe, 0x83, 0xf7,
+                                                       0xb, 0x76, 0xf7, 0x64, 0xd3, 0x5b, 0xa1, 0xf7,
+                                                       0x7c, 0x77, 0x12, 0xa3, 0xf9, 0xa3, 0x13, 0xb8,
+                                                       0xf9, 0x7e, 0xf7, 0xde, 0x15, 0x60, 0x71, 0xfb,
+                                                       0x6, 0x45, 0x45, 0x62, 0x8, 0x63, 0x74, 0x83,
+                                                       0x7b, 0x75, 0x1a, 0x72, 0xa3, 0x82, 0x95, 0x9e,
+                                                       0x93, 0x94, 0xa7, 0xa5, 0x1e, 0xcd, 0xd1, 0xf4,
+                                                       0xe9, 0xd9, 0xb6, 0x8, 0x89, 0x7, 0x8d, 0x7,
+                                                       0x3b, 0xb6, 0x23, 0xe6, 0x49, 0xd2, 0x8, 0xa7,
+                                                       0x71, 0x82, 0x94, 0x78, 0x1b, 0x81, 0x75, 0x82,
+                                                       0x72, 0x75, 0x94, 0x7b, 0xb3, 0x74, 0x1f, 0xd1,
+                                                       0x63, 0xf7, 0x7, 0x44, 0xb4, 0x71, 0x8, 0x13,
+                                                       0xd8, 0xfb, 0xaf, 0xfb, 0xb5, 0xa5, 0x2f, 0x1b,
+                                                       0x64, 0x78, 0x7d, 0x74, 0x72, 0xa0, 0x81, 0xb1,
+                                                       0x1f, 0x13, 0xb8, 0xea, 0xf7, 0xbc, 0xa3, 0xf7,
+                                                       0xa4, 0x1b, 0xe, 0xad, 0xdc, 0x76, 0xf7, 0x9f,
+                                                       0xa3, 0xf7, 0xa5, 0x77, 0x1, 0xf9, 0xab, 0xf7,
+                                                       0xdb, 0x15, 0x5e, 0x71, 0xfb, 0x7, 0x55, 0x35,
+                                                       0x71, 0x8, 0x4d, 0x78, 0x8e, 0x58, 0x66, 0x1a,
+                                                       0x62, 0xc1, 0x7e, 0xb4, 0x9c, 0xa9, 0xa1, 0x9d,
+                                                       0x98, 0x1e, 0xc9, 0xe0, 0xc6, 0xf7, 0x3, 0xdd,
+                                                       0xb7, 0x38, 0xb8, 0x42, 0xf7, 0xf, 0x4c, 0xe1,
+                                                       0x8, 0x9c, 0x7f, 0x6f, 0x98, 0x7a, 0x1b, 0x5c,
+                                                       0x5f, 0x70, 0x62, 0x63, 0xa4, 0x61, 0xb6, 0x7a,
+                                                       0x1f, 0xde, 0x6c, 0xf7, 0xa, 0x5a, 0xb7, 0x71,
+                                                       0x8, 0xfb, 0xbb, 0xfb, 0x96, 0xe7, 0x2b, 0x1b,
+                                                       0x54, 0x52, 0x41, 0x6d, 0x64, 0xc3, 0x4b, 0xc4,
+                                                       0x1f, 0xee, 0xf7, 0x9f, 0xe6, 0xf7, 0xaf, 0x1b,
+                                                       0xe, 0xe3, 0xf7, 0x5f, 0xf7, 0xa6, 0x1, 0xa9,
+                                                       0xf9, 0xf8, 0x3, 0xa9, 0xf7, 0x5f, 0x15, 0xf9,
+                                                       0x19, 0x6, 0xf7, 0x73, 0xf7, 0x1c, 0x75, 0xa,
+                                                       0xfb, 0x73, 0xf7, 0x1c, 0x5, 0xfd, 0x19, 0x6,
+                                                       0xf7, 0x18, 0xfb, 0x1c, 0x80, 0xa, 0xe, 0x37,
+                                                       0x93, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xad, 0xf9,
+                                                       0x43, 0x3, 0xf8, 0x66, 0xf8, 0xb6, 0x15, 0xfb,
+                                                       0xf2, 0xfb, 0x7f, 0x7b, 0x74, 0x81, 0x1b, 0x80,
+                                                       0x82, 0xa7, 0x93, 0x88, 0x1f, 0xca, 0x71, 0x89,
+                                                       0x9c, 0x77, 0x1b, 0x71, 0x6d, 0x7a, 0x7c, 0x76,
+                                                       0x1f, 0x7e, 0x82, 0x81, 0x83, 0x7a, 0x1a, 0x59,
+                                                       0xb2, 0x27, 0xa1, 0x5d, 0x1e, 0x92, 0x7d, 0x90,
+                                                       0x7d, 0x95, 0x84, 0x8, 0x86, 0x92, 0x9a, 0x8b,
+                                                       0xab, 0x1b, 0x99, 0xa7, 0x8c, 0x90, 0x92, 0x1f,
+                                                       0x94, 0x91, 0xf7, 0xf3, 0xf8, 0xd0, 0xf7, 0xb,
+                                                       0xf7, 0x5, 0xa1, 0xa0, 0x18, 0x55, 0x33, 0x77,
+                                                       0x63, 0x67, 0x1f, 0xe, 0xf7, 0x17, 0xd4, 0xf8,
+                                                       0xaa, 0x1, 0xa9, 0xf9, 0xf8, 0x3, 0xa9, 0xd4,
+                                                       0x15, 0xf9, 0x19, 0x6, 0xf7, 0x73, 0xf7, 0x9e,
+                                                       0x75, 0xa, 0xfb, 0x73, 0xf7, 0x9e, 0x5, 0xfd,
+                                                       0x19, 0x6, 0xf7, 0x18, 0xfb, 0x9e, 0x80, 0xa,
+                                                       0xe, 0xda, 0x91, 0xf9, 0x30, 0x1, 0xe4, 0xf9,
+                                                       0xa2, 0x3, 0xe4, 0x91, 0x15, 0xf9, 0xa2, 0xf7,
+                                                       0xe1, 0x75, 0xa, 0xfd, 0xa2, 0xf7, 0xe1, 0x5,
+                                                       0x38, 0x7, 0xf8, 0xe7, 0xfb, 0x8e, 0x80, 0xa,
+                                                       0xfc, 0xe7, 0xfb, 0x8e, 0x5, 0x95, 0xf7, 0x16,
+                                                       0x15, 0xf7, 0xe1, 0xf7, 0xc, 0x75, 0xa, 0xfb,
+                                                       0xe1, 0xf7, 0xc, 0x5, 0xe, 0x30, 0xbb, 0x76,
+                                                       0xf8, 0x87, 0x77, 0x1, 0xd4, 0xf8, 0xef, 0x3,
+                                                       0xf7, 0x12, 0xdd, 0x15, 0xf7, 0x63, 0xf7, 0x38,
+                                                       0xf7, 0x2f, 0xfb, 0x6e, 0x8c, 0x8a, 0xf7, 0x4f,
+                                                       0xf8, 0x87, 0x5, 0x8a, 0x6, 0xfc, 0xa9, 0x81,
+                                                       0x8c, 0x8a, 0xf7, 0x2d, 0xfb, 0x6e, 0xfb, 0x73,
+                                                       0xfb, 0x1f, 0x5, 0xe, 0x88, 0xb7, 0x6c, 0xa,
+                                                       0x12, 0xae, 0xf7, 0x4, 0xf7, 0x81, 0xf7, 0xb,
+                                                       0x13, 0x6c, 0xae, 0xf7, 0x5d, 0x15, 0xf7, 0xf1,
+                                                       0x6, 0x13, 0x9c, 0xfb, 0x31, 0xf7, 0x1a, 0x7,
+                                                       0xf7, 0xb0, 0xf7, 0xc2, 0xfb, 0xb0, 0xf7, 0xc2,
+                                                       0x5, 0xfb, 0x1a, 0x6, 0x13, 0xac, 0xfb, 0x31,
+                                                       0xfb, 0xf1, 0x7, 0xf7, 0x4, 0xfb, 0x9d, 0x15,
+                                                       0xf7, 0x84, 0xf7, 0xf8, 0xf7, 0x35, 0x7, 0xf7,
+                                                       0x9c, 0xfb, 0xad, 0xfb, 0x9c, 0x7d, 0xa, 0x47,
+                                                       0xc5, 0x76, 0xf8, 0x91, 0xea, 0x99, 0x77, 0x12,
+                                                       0xf8, 0xee, 0xe0, 0x13, 0xb0, 0xf8, 0x7e, 0xf8,
+                                                       0x3d, 0x15, 0xf7, 0x4, 0xe7, 0x8f, 0x63, 0xb4,
+                                                       0x6d, 0xb3, 0x80, 0x19, 0x88, 0xe5, 0xaa, 0xcf,
+                                                       0xa0, 0xc8, 0x8, 0x13, 0xd0, 0x45, 0x77, 0x3b,
+                                                       0x7c, 0x44, 0xa0, 0x8c, 0x66, 0xa7, 0x56, 0xad,
+                                                       0x86, 0xfb, 0x4, 0x2f, 0x18, 0xfc, 0x44, 0xfb,
+                                                       0x63, 0x15, 0xf7, 0x3d, 0x7e, 0xf7, 0x97, 0xf7,
+                                                       0x6e, 0xfb, 0x3b, 0x99, 0x5, 0x36, 0xfc, 0x41,
+                                                       0x15, 0xf7, 0x98, 0xf7, 0x6e, 0x5, 0xcd, 0x92,
+                                                       0xbf, 0x94, 0xbc, 0x1e, 0xfb, 0x98, 0xfb, 0x6e,
+                                                       0x5, 0xe, 0xbc, 0x8d, 0x76, 0xf7, 0xf1, 0xf7,
+                                                       0x39, 0xf7, 0x6d, 0x77, 0x12, 0xf9, 0x46, 0xec,
+                                                       0x13, 0xb0, 0xad, 0xf7, 0xb8, 0x15, 0x5e, 0xba,
+                                                       0xc7, 0x6e, 0xcd, 0x1b, 0xa3, 0xa3, 0x8f, 0x94,
+                                                       0xa2, 0x1f, 0x78, 0x68, 0x83, 0x68, 0x64, 0x1a,
+                                                       0x5a, 0x9d, 0x59, 0xa5, 0x61, 0x1e, 0xf7, 0x97,
+                                                       0xf7, 0x6d, 0x5, 0x13, 0xd0, 0x72, 0xb2, 0x7d,
+                                                       0xba, 0xb9, 0x1a, 0xd7, 0xc0, 0xb7, 0xbf, 0xb8,
+                                                       0x1e, 0xd1, 0xc4, 0x8a, 0x3a, 0xbc, 0x49, 0xbc,
+                                                       0x66, 0x19, 0xf7, 0x28, 0x9b, 0xee, 0xbd, 0xec,
+                                                       0x1e, 0xfb, 0x6, 0x68, 0xfb, 0xd, 0x95, 0xfb,
+                                                       0x8, 0xa0, 0xaa, 0x4f, 0xc4, 0x4e, 0xd9, 0x82,
+                                                       0x43, 0x51, 0x18, 0x68, 0x62, 0x57, 0x63, 0x53,
+                                                       0x1b, 0x58, 0x4a, 0xa8, 0xae, 0x65, 0x1f, 0xe,
+                                                       0x30, 0xed, 0x76, 0xf8, 0x4d, 0x77, 0xd9, 0x77,
+                                                       0x1, 0xce, 0xf8, 0xf1, 0x3, 0xf7, 0x20, 0xde,
+                                                       0x15, 0xf8, 0xa8, 0x85, 0x75, 0xa, 0xfb, 0x54,
+                                                       0xf8, 0x85, 0x80, 0xa, 0xfb, 0x2c, 0xfb, 0x6e,
+                                                       0xfb, 0x64, 0xf7, 0x36, 0x56, 0x40, 0xf7, 0x75,
+                                                       0xfb, 0x1f, 0xfb, 0x2c, 0xfb, 0x70, 0x5, 0xe,
+                                                       0x47, 0xc5, 0x76, 0xa3, 0xdc, 0xf8, 0x95, 0x77,
+                                                       0x1, 0xf8, 0xe9, 0xe5, 0x3, 0xf8, 0x66, 0xf7,
+                                                       0x82, 0x15, 0xf6, 0x2b, 0x69, 0x86, 0x74, 0x5a,
+                                                       0x8a, 0x66, 0x19, 0x93, 0xa4, 0xa7, 0x8d, 0xa6,
+                                                       0x1b, 0xbb, 0xbd, 0x80, 0x7e, 0xb6, 0x1f, 0x76,
+                                                       0xc8, 0x6c, 0xcf, 0x8e, 0xe5, 0x63, 0x80, 0x5d,
+                                                       0x69, 0x87, 0x63, 0x20, 0xeb, 0x18, 0xfb, 0x57,
+                                                       0x62, 0x15, 0xf7, 0x3b, 0x99, 0xfb, 0x97, 0xf7,
+                                                       0x6e, 0xfb, 0x3d, 0x7e, 0x5, 0xf7, 0x54, 0xb6,
+                                                       0x15, 0xf7, 0x98, 0xfb, 0x6e, 0x5, 0x8f, 0x88,
+                                                       0x77, 0xf7, 0x3e, 0x8b, 0x1a, 0xfb, 0x98, 0xf7,
+                                                       0x6e, 0x5, 0xe, 0xbc, 0x8d, 0x76, 0xa2, 0xf7,
+                                                       0x7, 0xf8, 0xe5, 0x77, 0x1, 0xf9, 0x3f, 0xf3,
+                                                       0x3, 0xf7, 0xb9, 0xf7, 0x4c, 0x15, 0xae, 0xb1,
+                                                       0xcc, 0xa8, 0xbe, 0x1b, 0xc3, 0xbf, 0x63, 0x68,
+                                                       0xb4, 0x1f, 0xcc, 0x55, 0x3d, 0x82, 0x57, 0x48,
+                                                       0x6e, 0x51, 0x19, 0x96, 0xc6, 0xc9, 0x93, 0xc7,
+                                                       0x1b, 0xc5, 0xc3, 0x85, 0x7a, 0xc3, 0x1f, 0x59,
+                                                       0xec, 0x7b, 0xee, 0xf7, 0x28, 0x1a, 0x5f, 0x70,
+                                                       0x4e, 0x43, 0x8c, 0x3a, 0x4c, 0xc0, 0x18, 0x57,
+                                                       0xb8, 0x56, 0xb7, 0xd7, 0x1a, 0xb9, 0x99, 0xba,
+                                                       0xa4, 0xb2, 0x1e, 0xfb, 0x97, 0xf7, 0x6d, 0x5,
+                                                       0x71, 0x61, 0x79, 0x59, 0x5a, 0x1a, 0x64, 0x93,
+                                                       0x68, 0x9e, 0x68, 0x1e, 0x94, 0x74, 0x73, 0x8f,
+                                                       0x73, 0x1b, 0x49, 0x4f, 0x6e, 0x5e, 0x5c, 0x1f,
+                                                       0xe, 0xa7, 0xa4, 0x76, 0xf8, 0x89, 0x77, 0xf7,
+                                                       0x6d, 0x77, 0x1, 0xbb, 0xf9, 0x9b, 0x3, 0xf7,
+                                                       0x18, 0xf7, 0x7d, 0x15, 0x63, 0xf7, 0x44, 0xf7,
+                                                       0xad, 0x69, 0x5, 0x8b, 0x5d, 0xf7, 0x48, 0x8a,
+                                                       0x8b, 0xf8, 0x1d, 0xfb, 0x75, 0x8e, 0x1a, 0x88,
+                                                       0x7, 0x8b, 0xfb, 0xaa, 0xfb, 0x86, 0x8e, 0x8a,
+                                                       0x1e, 0x88, 0x5f, 0xf7, 0x51, 0x8b, 0x1e, 0xfb,
+                                                       0xc2, 0x32, 0x15, 0xf7, 0xa4, 0xb2, 0xc0, 0xfb,
+                                                       0x6e, 0xf7, 0xf4, 0xf7, 0xcb, 0xba, 0xec, 0xfc,
+                                                       0x7a, 0xf7, 0xb6, 0x4d, 0xfb, 0x0, 0xaf, 0xfb,
+                                                       0x16, 0xfb, 0x5d, 0xb4, 0x4d, 0x2b, 0x5, 0xe,
+                                                       0xf7, 0xe, 0xee, 0xb3, 0xf0, 0xf7, 0x50, 0x44,
+                                                       0x77, 0xf7, 0x55, 0xb3, 0x12, 0xf9, 0x96, 0xf7,
+                                                       0xa, 0x8b, 0xbb, 0x13, 0xdc, 0xf9, 0x39, 0xf7,
+                                                       0xed, 0x15, 0xb7, 0x9e, 0xbc, 0xa0, 0xc1, 0x93,
+                                                       0xbd, 0x9f, 0x19, 0xac, 0x98, 0xa8, 0xa4, 0xb2,
+                                                       0x1a, 0xbc, 0x5d, 0xaa, 0x5d, 0x51, 0x68, 0x5e,
+                                                       0x59, 0x78, 0x1e, 0x7a, 0x5d, 0x80, 0x7b, 0x5f,
+                                                       0x73, 0x8, 0xfd, 0x1e, 0xf7, 0x1d, 0x15, 0xf8,
+                                                       0xf0, 0xfb, 0x85, 0xc1, 0x75, 0xb1, 0x7a, 0xa3,
+                                                       0x52, 0x19, 0x58, 0xa1, 0xb1, 0x64, 0xc5, 0x1b,
+                                                       0xb9, 0xb7, 0xaa, 0xbc, 0xb2, 0x6c, 0xa6, 0x69,
+                                                       0x97, 0x1f, 0x57, 0x9e, 0x54, 0x92, 0x59, 0xa1,
+                                                       0x55, 0xa3, 0x18, 0x75, 0xc1, 0xfd, 0x8, 0xf7,
+                                                       0x31, 0x5, 0x93, 0xfc, 0x34, 0x15, 0xf8, 0xb7,
+                                                       0xf7, 0x31, 0x5, 0x8c, 0x7, 0xfb, 0x6, 0xb8,
+                                                       0xfc, 0x47, 0xfb, 0x54, 0x5, 0xf9, 0x84, 0xf7,
+                                                       0xe8, 0x15, 0xab, 0xae, 0xa2, 0xa9, 0xa5, 0xa6,
+                                                       0x7a, 0x6e, 0x6a, 0x6a, 0x74, 0x6c, 0x70, 0x70,
+                                                       0x9d, 0xa8, 0x1e, 0x8d, 0xfb, 0xaf, 0x15, 0xa9,
+                                                       0xa4, 0x9d, 0xa7, 0xa9, 0xaf, 0x78, 0x6a, 0x6e,
+                                                       0x76, 0x77, 0x6e, 0x6e, 0x63, 0x9f, 0xac, 0x1e,
+                                                       0xfb, 0x50, 0xf7, 0x28, 0x15, 0x13, 0xbc, 0x94,
+                                                       0x93, 0x93, 0x94, 0x94, 0x93, 0x83, 0x82, 0x82,
+                                                       0x83, 0x83, 0x82, 0x82, 0x83, 0x93, 0x94, 0x1e,
+                                                       0xe, 0x92, 0x3a, 0xa, 0xaf, 0xf9, 0x9b, 0x3,
+                                                       0xc2, 0xf3, 0x15, 0x87, 0x69, 0xa9, 0x74, 0xa2,
+                                                       0x78, 0x8, 0x81, 0x98, 0xb4, 0x6b, 0xb0, 0x1b,
+                                                       0xa5, 0xea, 0xe3, 0xa2, 0xa4, 0x1f, 0xf8, 0x4f,
+                                                       0xf8, 0x5d, 0x5, 0xa1, 0xa1, 0x90, 0x8b, 0xa8,
+                                                       0x1a, 0xcc, 0x7, 0xa8, 0x8b, 0x91, 0x6b, 0x79,
+                                                       0x83, 0x87, 0x81, 0x7e, 0x1e, 0xfb, 0x71, 0xfb,
+                                                       0x5f, 0x5, 0xfb, 0x71, 0xfb, 0x76, 0x83, 0x83,
+                                                       0x83, 0x1b, 0x6b, 0x87, 0xac, 0xa3, 0x87, 0x1f,
+                                                       0x82, 0xc1, 0x5, 0x88, 0x9f, 0x84, 0xad, 0x9f,
+                                                       0x1a, 0xbe, 0x4d, 0x85, 0x69, 0x7f, 0x1e, 0x76,
+                                                       0x84, 0x78, 0x72, 0x7e, 0x7b, 0x8, 0x6a, 0x64,
+                                                       0x8b, 0x92, 0x57, 0x1a, 0x5f, 0x8b, 0x6a, 0x90,
+                                                       0x60, 0x1e, 0xe, 0xfb, 0x23, 0xcc, 0x76, 0xf4,
+                                                       0xa8, 0xf7, 0xb8, 0xe4, 0xe4, 0x54, 0xa, 0xa7,
+                                                       0xf7, 0x78, 0xa5, 0x3, 0xae, 0xf7, 0x29, 0x15,
+                                                       0xf7, 0x94, 0x22, 0x6, 0xf8, 0x6, 0xf7, 0xd9,
+                                                       0xfb, 0xb9, 0xf7, 0xab, 0x3e, 0x4c, 0x5, 0x71,
+                                                       0xfb, 0x3e, 0x7, 0x35, 0x43, 0x5, 0xa7, 0xfb,
+                                                       0xc9, 0x15, 0xf7, 0xb8, 0xf7, 0x92, 0xee, 0x7,
+                                                       0xf7, 0x96, 0xfb, 0x88, 0xfb, 0x96, 0xfb, 0x72,
+                                                       0x5, 0xd6, 0x7, 0xe, 0xae, 0xe9, 0x76, 0xe6,
+                                                       0xa5, 0xf7, 0x99, 0xcf, 0xeb, 0x77, 0x1, 0xf8,
+                                                       0xb8, 0xa3, 0x3, 0xb0, 0xf7, 0x38, 0x15, 0xf8,
+                                                       0x93, 0x30, 0x6, 0xf7, 0xb8, 0xf7, 0xba, 0xfb,
+                                                       0x7c, 0xf7, 0x8c, 0x4f, 0x56, 0x5, 0x60, 0xfc,
+                                                       0x50, 0x7, 0x46, 0x47, 0xd0, 0xfb, 0x16, 0x5,
+                                                       0x70, 0xfb, 0x17, 0x15, 0xc1, 0xf7, 0x17, 0x47,
+                                                       0xf7, 0x16, 0x5, 0xf8, 0x91, 0xc0, 0x6, 0xf7,
+                                                       0x4e, 0xfb, 0x4b, 0xfb, 0x4e, 0xfb, 0x53, 0x5,
+                                                       0xc7, 0x7, 0xe, 0xf7, 0x1b, 0xec, 0xb3, 0xf7,
+                                                       0x6b, 0xa6, 0xeb, 0xae, 0xb1, 0x77, 0x12, 0xf9,
+                                                       0x32, 0xb1, 0x65, 0xf7, 0x15, 0x9f, 0xb5, 0xbf,
+                                                       0xbb, 0x13, 0xf7, 0xf9, 0x36, 0xf8, 0xe, 0x15,
+                                                       0xb2, 0x88, 0x5, 0x87, 0xc2, 0xc4, 0x78, 0xc0,
+                                                       0x1b, 0xb6, 0xb3, 0xa3, 0xba, 0xbc, 0x59, 0xb1,
+                                                       0x5d, 0x67, 0x6a, 0x77, 0x73, 0x72, 0x1f, 0x68,
+                                                       0x6a, 0x7a, 0x83, 0x5b, 0x89, 0x8, 0xfc, 0x61,
+                                                       0xf4, 0x15, 0xf7, 0x31, 0x6, 0xf7, 0x76, 0xfb,
+                                                       0x50, 0xb6, 0x67, 0xa7, 0x71, 0x91, 0x50, 0x19,
+                                                       0x4d, 0x91, 0xaf, 0x4f, 0xd1, 0x1b, 0xb4, 0xb1,
+                                                       0xa7, 0xb6, 0xa8, 0x79, 0xa3, 0x75, 0x9c, 0x1f,
+                                                       0x61, 0xab, 0x5a, 0xa1, 0x64, 0xaf, 0x61, 0xb2,
+                                                       0x18, 0x87, 0xc2, 0xfb, 0x3d, 0xf5, 0x5, 0xf7,
+                                                       0x38, 0x9f, 0xfc, 0x42, 0x6, 0xfb, 0x63, 0x2c,
+                                                       0x15, 0xf8, 0xb0, 0x2c, 0x5, 0x8c, 0x7, 0x23,
+                                                       0xe2, 0xfc, 0x45, 0x9d, 0x5, 0xf9, 0xad, 0x6b,
+                                                       0x15, 0xa9, 0xa6, 0x98, 0xa5, 0xa9, 0xaa, 0x7a,
+                                                       0x6a, 0x6e, 0x73, 0x7a, 0x70, 0x6d, 0x6a, 0x9f,
+                                                       0xac, 0x1e, 0xfb, 0x6e, 0x67, 0x15, 0x94, 0x92,
+                                                       0x91, 0x94, 0x93, 0x94, 0x84, 0x83, 0x82, 0x82,
+                                                       0x84, 0x82, 0x82, 0x85, 0x93, 0x93, 0x1e, 0x13,
+                                                       0xfb, 0xf7, 0x13, 0xfb, 0x5c, 0x15, 0xa4, 0xa2,
+                                                       0x9e, 0xa3, 0xa8, 0xae, 0x71, 0x6c, 0x72, 0x77,
+                                                       0x76, 0x72, 0x6e, 0x66, 0xa7, 0xaa, 0x1e, 0xe,
+                                                       0x3e, 0x8b, 0xa9, 0xf8, 0xab, 0xa7, 0x6f, 0xf7,
+                                                       0x13, 0x12, 0xae, 0xa8, 0xf8, 0xa9, 0xa7, 0x6f,
+                                                       0xf7, 0x16, 0x13, 0xd8, 0xae, 0x16, 0xf8, 0xe2,
+                                                       0xf5, 0x6, 0x13, 0xb4, 0xf1, 0xf8, 0xde, 0xfc,
+                                                       0xdb, 0x6, 0x13, 0xd8, 0x28, 0xfb, 0x1, 0x7,
+                                                       0xa8, 0xfc, 0xc7, 0x15, 0xf8, 0xab, 0xf8, 0xa9,
+                                                       0xfc, 0xab, 0x7, 0xe, 0x3b, 0x8b, 0xab, 0xf8,
+                                                       0xad, 0xf7, 0xf, 0x1, 0xae, 0xaa, 0xf8, 0xa8,
+                                                       0xf7, 0x13, 0x7a, 0xa, 0xf8, 0xcd, 0x6, 0xf7,
+                                                       0xd, 0xf7, 0xb, 0x5, 0xf8, 0xd1, 0xfc, 0xc6,
+                                                       0x7, 0xfb, 0x14, 0xfb, 0x7, 0x5, 0xaa, 0xfc,
+                                                       0xb5, 0x6d, 0xa, 0x66, 0xa, 0xaf, 0xf7, 0xe9,
+                                                       0x15, 0xe6, 0x54, 0xf7, 0x3f, 0xfb, 0x1f, 0xf7,
+                                                       0x34, 0xfb, 0x5b, 0x9a, 0x96, 0x18, 0x5f, 0xf7,
+                                                       0xb, 0x33, 0xf7, 0x3d, 0x47, 0xe9, 0xca, 0xdf,
+                                                       0xe8, 0xf7, 0x65, 0xad, 0xde, 0x80, 0x98, 0x18,
+                                                       0xfb, 0x38, 0xfb, 0x56, 0xfb, 0x42, 0xfb, 0x27,
+                                                       0x3d, 0x5b, 0x8, 0xe, 0xfc, 0x41, 0x38, 0xa,
+                                                       0xf7, 0x1b, 0x8b, 0x3, 0xf7, 0x1b, 0x16, 0xf7,
+                                                       0x84, 0x6, 0x27, 0xf7, 0xee, 0xef, 0xf7, 0xee,
+                                                       0x5, 0xfb, 0x84, 0x6, 0x27, 0xfb, 0xee, 0x5,
+                                                       0xe, 0x3e, 0x8f, 0xf9, 0x3f, 0x1, 0xab, 0xf9,
+                                                       0x4e, 0x3, 0xb1, 0x93, 0x15, 0xa4, 0x90, 0xd6,
+                                                       0xa0, 0x9d, 0x95, 0xa3, 0x97, 0xd4, 0xd0, 0xed,
+                                                       0xf5, 0x91, 0x91, 0x9d, 0x89, 0x90, 0x85, 0xce,
+                                                       0x41, 0xda, 0x40, 0xa3, 0x73, 0x8, 0x64, 0xb3,
+                                                       0xab, 0x7e, 0xa3, 0x1b, 0x94, 0xcb, 0x95, 0x91,
+                                                       0x93, 0x1f, 0x8e, 0x97, 0x69, 0xa5, 0xfb, 0x42,
+                                                       0xf7, 0x45, 0x40, 0xe7, 0x19, 0xf7, 0x3c, 0xf7,
+                                                       0x4c, 0xd8, 0xf7, 0x3, 0x9f, 0xb1, 0x84, 0x99,
+                                                       0x18, 0x5b, 0x85, 0x38, 0x7d, 0x87, 0x83, 0x63,
+                                                       0x4e, 0x3f, 0x26, 0x3c, 0x39, 0x59, 0xb3, 0xfb,
+                                                       0x2f, 0xf7, 0x50, 0x6f, 0xc4, 0x8, 0x80, 0x6,
+                                                       0x7f, 0x82, 0x68, 0x5e, 0x81, 0x78, 0x84, 0x78,
+                                                       0x8b, 0x83, 0xa0, 0x65, 0x9d, 0x6c, 0xd9, 0x34,
+                                                       0xee, 0xfb, 0x2, 0x90, 0x84, 0x8b, 0x80, 0x86,
+                                                       0x84, 0x67, 0x5e, 0xfb, 0x4d, 0xfb, 0x5c, 0x6d,
+                                                       0x70, 0x8, 0xe, 0x3d, 0xa5, 0x76, 0xf9, 0x21,
+                                                       0x99, 0xa5, 0x77, 0x1, 0xa8, 0xf9, 0x53, 0x3,
+                                                       0xae, 0x94, 0x15, 0xa7, 0x8e, 0xea, 0x9a, 0xaf,
+                                                       0xa2, 0x9f, 0x97, 0xb2, 0xa6, 0xe0, 0xf6, 0x90,
+                                                       0x92, 0x9c, 0x89, 0x94, 0x82, 0xba, 0x58, 0xc1,
+                                                       0x4e, 0xa4, 0x74, 0x8, 0x64, 0xb6, 0xa9, 0x7e,
+                                                       0xa3, 0x1b, 0x97, 0xf7, 0x8, 0x94, 0x90, 0x95,
+                                                       0x1f, 0x8d, 0x9a, 0x66, 0xad, 0xfb, 0x32, 0xf7,
+                                                       0x4f, 0x49, 0xe5, 0x19, 0xe0, 0xe2, 0xf7, 0x31,
+                                                       0xf7, 0x4d, 0x9b, 0xb4, 0x82, 0x99, 0x18, 0x63,
+                                                       0x88, 0xfb, 0x13, 0x7a, 0x87, 0x84, 0x6c, 0x5a,
+                                                       0x42, 0x2a, 0x55, 0x55, 0x46, 0xd0, 0x2e, 0xf7,
+                                                       0x14, 0x6e, 0xc3, 0x8, 0x7d, 0x6, 0x73, 0x80,
+                                                       0x3b, 0x38, 0x83, 0x79, 0x84, 0x79, 0x8d, 0x7a,
+                                                       0xa0, 0x66, 0x9d, 0x6b, 0xc3, 0x47, 0xe6, 0x24,
+                                                       0x90, 0x85, 0x89, 0x7c, 0x86, 0x86, 0x67, 0x5d,
+                                                       0xfb, 0x32, 0xfb, 0x50, 0x6d, 0x70, 0x8, 0xe,
+                                                       0xfb, 0xa0, 0x5c, 0x76, 0xf9, 0x6d, 0x77, 0x1,
+                                                       0xf7, 0x50, 0xf7, 0x98, 0x3, 0xf7, 0xb4, 0xf7,
+                                                       0x96, 0x15, 0xfb, 0x34, 0xee, 0x9f, 0x67, 0x98,
+                                                       0x1b, 0x97, 0x9e, 0x98, 0x97, 0x8d, 0x1f, 0x89,
+                                                       0x8f, 0x88, 0x91, 0x8f, 0x1a, 0x91, 0x9b, 0x91,
+                                                       0x8f, 0x8f, 0x1e, 0x93, 0x7, 0x92, 0x8e, 0x8f,
+                                                       0x8f, 0x8e, 0x92, 0xfb, 0x1, 0xf7, 0x79, 0x18,
+                                                       0xe3, 0xf7, 0x13, 0xe3, 0xf3, 0x96, 0x95, 0x8,
+                                                       0x8f, 0x8f, 0x92, 0x91, 0x91, 0x1a, 0x92, 0x7b,
+                                                       0x96, 0x87, 0x95, 0x1e, 0x8d, 0x8a, 0x89, 0x91,
+                                                       0x88, 0x1b, 0x88, 0x85, 0x84, 0x88, 0x89, 0x1f,
+                                                       0x80, 0x81, 0x5, 0x90, 0x85, 0x67, 0x86, 0x85,
+                                                       0x1b, 0xfb, 0x31, 0xfb, 0x41, 0x3f, 0xf7, 0x2a,
+                                                       0x5, 0x93, 0x87, 0x88, 0x95, 0x80, 0x1b, 0x80,
+                                                       0x83, 0x7b, 0x81, 0x82, 0x89, 0x8, 0x8f, 0x86,
+                                                       0x87, 0x90, 0x84, 0x1b, 0x79, 0x7d, 0x82, 0x82,
+                                                       0x84, 0x1a, 0x82, 0x93, 0x7a, 0x8e, 0x83, 0x1e,
+                                                       0xd7, 0xfb, 0x54, 0x49, 0x3c, 0x3d, 0x25, 0x62,
+                                                       0x43, 0x19, 0x6c, 0x56, 0x7a, 0x73, 0x7e, 0x1a,
+                                                       0x88, 0x8e, 0x89, 0x8d, 0x89, 0x1e, 0x92, 0x85,
+                                                       0x87, 0x85, 0x89, 0x83, 0x8, 0x89, 0x85, 0x8a,
+                                                       0x87, 0x85, 0x1a, 0x80, 0x94, 0x80, 0x91, 0x82,
+                                                       0x1e, 0x81, 0x91, 0x8d, 0x81, 0x98, 0x1b, 0x99,
+                                                       0xa5, 0x8e, 0x94, 0x97, 0x1f, 0xe, 0xfb, 0x36,
+                                                       0x93, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xf7, 0x5f,
+                                                       0xf7, 0x64, 0x3, 0xf3, 0x93, 0x15, 0x9e, 0x76,
+                                                       0x5, 0x98, 0x6, 0x92, 0x94, 0xf7, 0x26, 0xf7,
+                                                       0x58, 0xb1, 0x5a, 0xa9, 0x53, 0xb7, 0x5e, 0x19,
+                                                       0x8e, 0x8e, 0x89, 0x8d, 0x9b, 0xa0, 0xad, 0x90,
+                                                       0x1b, 0x8e, 0x93, 0x83, 0x8a, 0x8d, 0x1f, 0x88,
+                                                       0x8f, 0x91, 0x85, 0x90, 0x1b, 0x90, 0x93, 0x94,
+                                                       0x8e, 0x8e, 0x1f, 0x92, 0x91, 0x94, 0x8e, 0x87,
+                                                       0x95, 0x8, 0x91, 0x89, 0x96, 0x99, 0x8d, 0x1b,
+                                                       0x93, 0x6, 0x94, 0x97, 0xa4, 0x91, 0x8e, 0x1f,
+                                                       0x92, 0x97, 0x8b, 0x8a, 0x8d, 0x98, 0xfb, 0x28,
+                                                       0xf7, 0x4b, 0x18, 0xf7, 0x4b, 0xf7, 0x70, 0xbb,
+                                                       0x89, 0xb5, 0x1a, 0x7c, 0xae, 0x86, 0x92, 0x8b,
+                                                       0x8c, 0x84, 0x89, 0x19, 0x7f, 0x88, 0x87, 0xab,
+                                                       0x90, 0x1a, 0x8e, 0x8d, 0x8d, 0x8d, 0x8d, 0x1e,
+                                                       0x96, 0x92, 0x59, 0x92, 0x89, 0x1b, 0x7f, 0xfb,
+                                                       0x5b, 0xfb, 0x65, 0x70, 0x74, 0x1f, 0xfb, 0xa,
+                                                       0xf7, 0x45, 0x5, 0x92, 0x87, 0x83, 0x96, 0x82,
+                                                       0x1b, 0x7e, 0x7d, 0x80, 0x7e, 0x8c, 0x1f, 0x82,
+                                                       0x88, 0x81, 0x80, 0x88, 0x7d, 0x9d, 0x8c, 0x86,
+                                                       0x1e, 0x7d, 0x7e, 0x7e, 0x7d, 0x82, 0x7a, 0xa6,
+                                                       0x2f, 0xb7, 0x35, 0xb8, 0x37, 0xfb, 0x3b, 0xfb,
+                                                       0x5b, 0x18, 0x7e, 0x9b, 0x7b, 0x81, 0x7e, 0x7f,
+                                                       0x85, 0x84, 0x1a, 0x87, 0x93, 0x82, 0x8d, 0x88,
+                                                       0x1e, 0x92, 0x7f, 0x93, 0x7a, 0x98, 0x85, 0x8,
+                                                       0x8e, 0x93, 0x92, 0x90, 0x94, 0x1b, 0x8d, 0x8e,
+                                                       0x89, 0x88, 0x1f, 0x87, 0x88, 0x85, 0x87, 0x1a,
+                                                       0xe, 0x3f, 0x86, 0xb0, 0xf7, 0x7a, 0xaf, 0xdc,
+                                                       0xb0, 0xf7, 0x77, 0xb0, 0x1, 0xbc, 0xb0, 0xf7,
+                                                       0x6c, 0xae, 0xe3, 0xb0, 0xf7, 0x6b, 0xb0, 0x3,
+                                                       0xbc, 0xf7, 0x9a, 0x15, 0xf7, 0x91, 0xfb, 0x9f,
+                                                       0xf7, 0x34, 0xf7, 0x9f, 0xf7, 0x90, 0xf7, 0x2e,
+                                                       0xfb, 0x91, 0x6, 0x8c, 0xf7, 0x9c, 0x5, 0xfb,
+                                                       0x35, 0xfb, 0x9c, 0xfb, 0x90, 0x6, 0xb0, 0xfb,
+                                                       0xa, 0x15, 0xdc, 0xf7, 0x90, 0xf7, 0x9c, 0xe2,
+                                                       0xfb, 0x9c, 0xf7, 0x90, 0x3a, 0xfb, 0x90, 0xfb,
+                                                       0x9e, 0x33, 0xf7, 0x9e, 0x7, 0xe, 0x3c, 0xa0,
+                                                       0x76, 0xf7, 0x7c, 0xf7, 0x7a, 0xf7, 0x7a, 0x77,
+                                                       0x1, 0xf7, 0x9b, 0xf7, 0x7c, 0x3, 0xae, 0xf7,
+                                                       0x7c, 0x15, 0xf7, 0x78, 0xfb, 0x7c, 0xf7, 0x7c,
+                                                       0xf7, 0x7c, 0xf7, 0x7b, 0xf7, 0x7a, 0xfb, 0x7b,
+                                                       0xf7, 0x7a, 0xfb, 0x7c, 0xfb, 0x7a, 0xfb, 0x78,
+                                                       0x6, 0xe, 0x3b, 0xa0, 0x76, 0xf7, 0xb2, 0xf7,
+                                                       0xc, 0xf7, 0xb2, 0x77, 0x1, 0xf7, 0xd5, 0xf7,
+                                                       0x9, 0x3, 0xae, 0xf7, 0xa8, 0x15, 0xf7, 0xa8,
+                                                       0xfb, 0xa8, 0xf7, 0x1d, 0xf7, 0xa8, 0xf7, 0xa9,
+                                                       0xf7, 0x20, 0xfb, 0xa9, 0xf7, 0xa8, 0xfb, 0x1d,
+                                                       0xfb, 0xa8, 0xfb, 0xa8, 0x6, 0xf7, 0xa8, 0xfb,
+                                                       0x20, 0x15, 0xf7, 0x20, 0xf7, 0x1d, 0xfb, 0x20,
+                                                       0x7, 0xe, 0x36, 0xa0, 0x76, 0xf7, 0x7f, 0xf7,
+                                                       0x6d, 0xf7, 0x84, 0x77, 0x1, 0xf7, 0x9e, 0xf7,
+                                                       0x70, 0x3, 0xae, 0xf7, 0x7f, 0x15, 0xf7, 0x7b,
+                                                       0xfb, 0x7f, 0xf7, 0x71, 0xf7, 0x7f, 0xf7, 0x7d,
+                                                       0xf7, 0x6d, 0xfb, 0x7d, 0xf7, 0x84, 0xfb, 0x71,
+                                                       0xfb, 0x84, 0xfb, 0x7b, 0x6, 0xf7, 0x7b, 0xfb,
+                                                       0x6d, 0x15, 0xf7, 0x6d, 0xf7, 0x70, 0xfb, 0x6d,
+                                                       0x7, 0xe, 0x56, 0x7b, 0x76, 0xf7, 0xb9, 0xac,
+                                                       0x6a, 0xad, 0xaf, 0xa9, 0xaf, 0xae, 0xf7, 0xb6,
+                                                       0x77, 0x12, 0xf7, 0xcb, 0xad, 0xa2, 0xa9, 0xb8,
+                                                       0xaf, 0x69, 0xad, 0x13, 0xdf, 0x80, 0xf8, 0xe,
+                                                       0xf7, 0xc3, 0x15, 0x86, 0x53, 0x7b, 0x63, 0x7b,
+                                                       0x69, 0x8, 0x7a, 0x65, 0x7a, 0x6c, 0x64, 0x1a,
+                                                       0x6c, 0x98, 0x78, 0xa5, 0x79, 0x1e, 0x98, 0x83,
+                                                       0x9d, 0x81, 0x91, 0x85, 0x8, 0x89, 0x8d, 0x8f,
+                                                       0x83, 0x8f, 0x1b, 0x8f, 0x8f, 0x93, 0x8d, 0x8d,
+                                                       0x1f, 0x91, 0x91, 0x9d, 0x95, 0x98, 0x93, 0x8,
+                                                       0xa5, 0x9d, 0x98, 0x9e, 0xaa, 0x1a, 0xb7, 0x79,
+                                                       0xab, 0x79, 0xb2, 0x1e, 0x7c, 0xac, 0x7c, 0xb1,
+                                                       0x86, 0xbf, 0x95, 0x90, 0x93, 0x93, 0x90, 0x96,
+                                                       0xbe, 0x86, 0xb1, 0x7d, 0xab, 0x7c, 0x8, 0x78,
+                                                       0xb5, 0xab, 0x77, 0xb5, 0x1b, 0xaa, 0x9e, 0x98,
+                                                       0xa5, 0x9d, 0x1f, 0x93, 0x98, 0x95, 0x9d, 0x91,
+                                                       0x91, 0x8, 0x8d, 0x8d, 0x93, 0x8f, 0x8f, 0x1a,
+                                                       0x8f, 0x83, 0x8f, 0x89, 0x8d, 0x1e, 0x85, 0x91,
+                                                       0x81, 0x9d, 0x83, 0x98, 0x8, 0xa5, 0x79, 0x75,
+                                                       0x99, 0x6c, 0x1b, 0x5a, 0x6a, 0x74, 0x77, 0x5d,
+                                                       0x1f, 0x6e, 0x7e, 0x69, 0x80, 0x5e, 0x87, 0x87,
+                                                       0x94, 0x83, 0x93, 0x82, 0x8e, 0x8f, 0xbd, 0x98,
+                                                       0xb0, 0x99, 0xaa, 0x8, 0x9e, 0xb7, 0xa0, 0xac,
+                                                       0xb7, 0x1a, 0xaa, 0x7e, 0x9e, 0x71, 0x9d, 0x1e,
+                                                       0x7e, 0x93, 0x79, 0x95, 0x85, 0x91, 0x8, 0x8d,
+                                                       0x89, 0x87, 0x93, 0x87, 0x1b, 0x87, 0x87, 0x83,
+                                                       0x89, 0x89, 0x1f, 0x85, 0x85, 0x79, 0x81, 0x7e,
+                                                       0x83, 0x8, 0x71, 0x79, 0x7e, 0x78, 0x6c, 0x1a,
+                                                       0x5e, 0x9e, 0x6a, 0x9e, 0x62, 0x1e, 0x99, 0x6b,
+                                                       0x9a, 0x66, 0x8f, 0x58, 0x81, 0x87, 0x84, 0x84,
+                                                       0x87, 0x82, 0x53, 0x90, 0x64, 0x9b, 0x69, 0x9a,
+                                                       0x8, 0x9d, 0x64, 0x6c, 0x9c, 0x63, 0x1b, 0x6c,
+                                                       0x78, 0x7d, 0x71, 0x79, 0x1f, 0x83, 0x7e, 0x81,
+                                                       0x79, 0x85, 0x85, 0x8, 0x89, 0x89, 0x83, 0x87,
+                                                       0x87, 0x1a, 0x87, 0x93, 0x87, 0x8d, 0x89, 0x1e,
+                                                       0x91, 0x85, 0x95, 0x79, 0x93, 0x7e, 0x8, 0x71,
+                                                       0x9d, 0x9f, 0x80, 0xa9, 0x1b, 0xb5, 0xab, 0x9b,
+                                                       0x9c, 0xb0, 0x1f, 0xad, 0x9a, 0xb1, 0x9c, 0xc2,
+                                                       0x90, 0x8f, 0x81, 0x93, 0x83, 0x95, 0x86, 0x8,
+                                                       0x96, 0xf7, 0x7f, 0x15, 0x89, 0xa0, 0x7f, 0x96,
+                                                       0x80, 0x94, 0x8, 0x7f, 0x95, 0x80, 0x93, 0x9b,
+                                                       0x1a, 0x9c, 0x94, 0x96, 0x9b, 0x96, 0x1e, 0x92,
+                                                       0x8f, 0x96, 0x92, 0x8f, 0x8f, 0x8, 0x8b, 0x8f,
+                                                       0x93, 0x8c, 0x1e, 0x8d, 0x89, 0x8f, 0x87, 0x8c,
+                                                       0x8a, 0x8e, 0x87, 0x96, 0x84, 0x91, 0x86, 0x8,
+                                                       0x9b, 0x80, 0x92, 0x82, 0x7a, 0x1a, 0x77, 0x7b,
+                                                       0x83, 0x7d, 0x7d, 0x1e, 0x82, 0x82, 0x83, 0x81,
+                                                       0x89, 0x7a, 0x8, 0xf7, 0x59, 0xfb, 0x59, 0x15,
+                                                       0x8a, 0x8f, 0x9e, 0x8e, 0x96, 0x94, 0x94, 0x95,
+                                                       0x19, 0x98, 0x97, 0x93, 0x98, 0x9c, 0x1b, 0x9c,
+                                                       0x97, 0x83, 0x7b, 0x96, 0x1f, 0x8e, 0x84, 0x93,
+                                                       0x81, 0x8f, 0x87, 0x8c, 0x8a, 0x8f, 0x87, 0x8d,
+                                                       0x89, 0x8, 0x8a, 0x85, 0x88, 0x89, 0x8a, 0x1e,
+                                                       0x87, 0x87, 0x85, 0x7f, 0x86, 0x85, 0x8, 0x13,
+                                                       0xbf, 0x40, 0x7b, 0x80, 0x83, 0x84, 0x79, 0x1b,
+                                                       0x79, 0x83, 0x99, 0x98, 0x80, 0x1f, 0x82, 0x96,
+                                                       0x80, 0x95, 0x77, 0x8d, 0x8, 0xfc, 0x1f, 0x87,
+                                                       0x15, 0x79, 0x88, 0x81, 0x83, 0x82, 0x82, 0x8,
+                                                       0x7e, 0x7f, 0x83, 0x7d, 0x79, 0x1b, 0x78, 0x81,
+                                                       0x93, 0x9b, 0x80, 0x1f, 0x87, 0x92, 0x84, 0x96,
+                                                       0x87, 0x8f, 0x8, 0x8b, 0x85, 0x8e, 0x8c, 0x8d,
+                                                       0x1e, 0x8a, 0x8d, 0x91, 0x8e, 0x8b, 0x1a, 0x8f,
+                                                       0x90, 0x92, 0x95, 0x8f, 0x92, 0x8, 0x13, 0xdf,
+                                                       0x40, 0x9b, 0x96, 0x94, 0x92, 0x9c, 0x1b, 0x9c,
+                                                       0x93, 0x7e, 0x7f, 0x96, 0x1f, 0x95, 0x80, 0x97,
+                                                       0x80, 0xa0, 0x88, 0x8, 0xf7, 0x59, 0xfb, 0x59,
+                                                       0x15, 0x8f, 0x8d, 0x8e, 0x79, 0x93, 0x80, 0x94,
+                                                       0x82, 0x19, 0x98, 0x7e, 0x9a, 0x82, 0x8a, 0x79,
+                                                       0x8, 0x79, 0x83, 0x81, 0x7b, 0x80, 0x1e, 0x84,
+                                                       0x88, 0x80, 0x82, 0x88, 0x88, 0x8, 0x89, 0x89,
+                                                       0x88, 0x87, 0x8a, 0x1b, 0x8a, 0x86, 0x91, 0x8b,
+                                                       0x1f, 0x86, 0x8f, 0x82, 0x93, 0x83, 0x90, 0x8,
+                                                       0x7c, 0x95, 0x83, 0x93, 0x9c, 0x1a, 0x9d, 0x99,
+                                                       0x93, 0x98, 0x97, 0x1e, 0x96, 0x94, 0x95, 0x97,
+                                                       0x8e, 0x9e, 0x8, 0xe, 0xf7, 0x21, 0xee, 0xb3,
+                                                       0xef, 0xf7, 0x52, 0x42, 0x77, 0xf7, 0x58, 0xb2,
+                                                       0x12, 0xf9, 0x9b, 0xf7, 0xa, 0x8b, 0xbc, 0x13,
+                                                       0xdc, 0xf9, 0x3c, 0xf7, 0xef, 0x15, 0xb7, 0x9e,
+                                                       0xbd, 0xa1, 0xc2, 0x90, 0xbd, 0xa0, 0x19, 0xac,
+                                                       0x99, 0xa9, 0xa5, 0xb2, 0x1a, 0xbc, 0x5c, 0xa8,
+                                                       0x5e, 0x51, 0x67, 0x5f, 0x59, 0x78, 0x1e, 0x79,
+                                                       0x5d, 0x7f, 0x7a, 0x5f, 0x74, 0x8, 0xfd, 0x1c,
+                                                       0xf7, 0x20, 0x15, 0xf8, 0xf1, 0xfb, 0x8b, 0xc1,
+                                                       0x75, 0xaf, 0x7a, 0xa4, 0x52, 0x19, 0x58, 0xa1,
+                                                       0xb0, 0x65, 0xc6, 0x1b, 0xb9, 0xb8, 0xaa, 0xbc,
+                                                       0xb1, 0x6a, 0xa6, 0x6a, 0x97, 0x1f, 0x57, 0x9d,
+                                                       0x54, 0x93, 0x59, 0xa1, 0x55, 0xa3, 0x18, 0x76,
+                                                       0xc1, 0xfd, 0x8, 0xf7, 0x36, 0x5, 0x92, 0xfc,
+                                                       0x3a, 0x15, 0xf8, 0xb8, 0xf7, 0x33, 0x8a, 0x8c,
+                                                       0xfb, 0x2, 0xb7, 0xfc, 0x4b, 0xfb, 0x55, 0x5,
+                                                       0xf9, 0x84, 0xf7, 0xeb, 0x15, 0xab, 0xae, 0xa3,
+                                                       0xa9, 0xa5, 0xa6, 0x7a, 0x6e, 0x69, 0x6c, 0x74,
+                                                       0x6a, 0x71, 0x6f, 0x9d, 0xa8, 0x1e, 0x8e, 0xfb,
+                                                       0xb1, 0x15, 0xa9, 0xa4, 0x9d, 0xa7, 0xa9, 0xae,
+                                                       0x78, 0x6a, 0x6e, 0x77, 0x78, 0x6e, 0x6e, 0x63,
+                                                       0x9d, 0xad, 0x1e, 0xfc, 0xf2, 0xf7, 0xbc, 0x15,
+                                                       0xf8, 0x5a, 0xfb, 0x10, 0x9d, 0x5b, 0xc1, 0x74,
+                                                       0x7a, 0x7f, 0x7a, 0x95, 0x79, 0x93, 0x79, 0x92,
+                                                       0x19, 0xfc, 0x5d, 0xf7, 0x49, 0x5, 0x90, 0xfb,
+                                                       0xc2, 0x15, 0xf7, 0xb3, 0xf7, 0xe, 0xbd, 0x75,
+                                                       0xfb, 0xe4, 0x26, 0x5, 0xf8, 0x31, 0xf7, 0x31,
+                                                       0x15, 0x82, 0x92, 0x84, 0x94, 0x94, 0x92, 0x92,
+                                                       0x94, 0x1e, 0x13, 0xbc, 0x94, 0x84, 0x92, 0x82,
+                                                       0x82, 0x84, 0x84, 0x82, 0x1e, 0xe, 0x9e, 0xc2,
+                                                       0xea, 0xc2, 0x58, 0xf7, 0xa, 0xec, 0xf7, 0x2,
+                                                       0x5a, 0xc2, 0x54, 0xc3, 0xe9, 0xc2, 0x12, 0xd6,
+                                                       0xc2, 0x56, 0xc0, 0xeb, 0xc2, 0x58, 0xf7, 0x6,
+                                                       0xea, 0xf7, 0x8, 0x5a, 0xc3, 0x54, 0xc2, 0xe9,
+                                                       0xc2, 0x13, 0xd3, 0x52, 0xf7, 0x7e, 0xf7, 0x64,
+                                                       0x15, 0x95, 0x7a, 0x78, 0x91, 0x77, 0x1b, 0x52,
+                                                       0x5d, 0x5d, 0x52, 0x52, 0xb9, 0x5e, 0xc4, 0xc4,
+                                                       0xb9, 0xb9, 0xc4, 0x9f, 0x86, 0x9e, 0x80, 0x9b,
+                                                       0x1f, 0xd9, 0xd8, 0x94, 0x86, 0x94, 0x87, 0x95,
+                                                       0x89, 0x19, 0x13, 0xb2, 0xca, 0x98, 0x45, 0x5,
+                                                       0x9d, 0x6, 0x98, 0xd1, 0x96, 0x8d, 0x95, 0x8f,
+                                                       0x94, 0x91, 0x19, 0xd9, 0x3d, 0x5, 0x80, 0x7a,
+                                                       0x85, 0x78, 0x77, 0x1a, 0x53, 0xb8, 0x5d, 0xc4,
+                                                       0xc4, 0xb9, 0xb9, 0xc4, 0x1e, 0x13, 0xca, 0xd2,
+                                                       0xc3, 0x5d, 0xb9, 0x53, 0x78, 0x78, 0x85, 0x81,
+                                                       0x7b, 0x1e, 0x3d, 0xd9, 0x91, 0x94, 0x8e, 0x95,
+                                                       0x8e, 0x95, 0x19, 0xcd, 0x97, 0x5, 0x9d, 0x7,
+                                                       0x4b, 0x97, 0x89, 0x96, 0x87, 0x96, 0x85, 0x95,
+                                                       0x19, 0xd6, 0xd7, 0x5, 0x81, 0x9c, 0x9e, 0x85,
+                                                       0x9f, 0x1b, 0xc4, 0xb9, 0xb9, 0xc4, 0xc4, 0x5d,
+                                                       0xb8, 0x52, 0x1f, 0x13, 0xd2, 0xc6, 0x53, 0x5c,
+                                                       0x5e, 0x52, 0x78, 0x91, 0x78, 0x95, 0x7a, 0x1f,
+                                                       0x3e, 0x40, 0x81, 0x92, 0x81, 0x90, 0x7f, 0x8d,
+                                                       0x19, 0x7f, 0xc9, 0x5, 0x79, 0x6, 0x7f, 0x4c,
+                                                       0x80, 0x88, 0x81, 0x87, 0x81, 0x85, 0x19, 0x41,
+                                                       0xd6, 0x5, 0x95, 0x9b, 0x90, 0x9e, 0x9e, 0x1a,
+                                                       0xc4, 0x5d, 0xb9, 0x52, 0x52, 0x5e, 0x5e, 0x52,
+                                                       0x1e, 0x13, 0xc6, 0xa6, 0x52, 0xb8, 0x5d, 0xc4,
+                                                       0x9e, 0x9f, 0x91, 0x95, 0x9b, 0x1e, 0xd6, 0x3f,
+                                                       0x85, 0x81, 0x87, 0x80, 0x89, 0x80, 0x19, 0x48,
+                                                       0x7f, 0x5, 0x79, 0x7, 0xd0, 0x7e, 0x8e, 0x81,
+                                                       0x8e, 0x82, 0x91, 0x82, 0x19, 0xf7, 0x8f, 0xf7,
+                                                       0x9e, 0x15, 0xa6, 0x9f, 0x9f, 0xa6, 0xa6, 0x9f,
+                                                       0x77, 0x70, 0x70, 0x77, 0x77, 0x70, 0x70, 0x77,
+                                                       0x9f, 0xa6, 0x1e, 0xfb, 0x6e, 0xfb, 0x68, 0x15,
+                                                       0x13, 0xb2, 0xb2, 0xa5, 0xa0, 0xa1, 0xa5, 0xa5,
+                                                       0xa1, 0x75, 0x71, 0x71, 0x75, 0x74, 0x71, 0x71,
+                                                       0x76, 0xa3, 0xa4, 0x1e, 0xf7, 0x6d, 0xfb, 0x6f,
+                                                       0x15, 0x13, 0xca, 0xd2, 0xa5, 0xa1, 0xa1, 0xa5,
+                                                       0xa5, 0xa0, 0x75, 0x71, 0x71, 0x76, 0x76, 0x71,
+                                                       0x71, 0x75, 0xa0, 0xa5, 0x1e, 0xfc, 0x43, 0xf8,
+                                                       0x43, 0x15, 0xa5, 0xa1, 0xa0, 0x69, 0xa, 0xa1,
+                                                       0xa5, 0x1e, 0xfc, 0x43, 0x4, 0xa5, 0xa1, 0xa1,
+                                                       0x69, 0xa, 0xa0, 0xa5, 0x1e, 0xe, 0x9f, 0xf7,
+                                                       0x18, 0xfb, 0x4, 0x76, 0xf7, 0x77, 0xc8, 0x6c,
+                                                       0xf7, 0x15, 0x69, 0xd0, 0x48, 0xce, 0xea, 0xf7,
+                                                       0x10, 0xfb, 0x10, 0xf7, 0x11, 0x12, 0xd5, 0xf7,
+                                                       0x13, 0xfb, 0x12, 0xf7, 0x12, 0xea, 0xcd, 0x49,
+                                                       0xce, 0x6a, 0xf7, 0x14, 0x6b, 0xcb, 0x4d, 0xc9,
+                                                       0xea, 0xf7, 0x15, 0xfb, 0x15, 0xf7, 0x16, 0x13,
+                                                       0xa5, 0xa2, 0x80, 0xf7, 0xc4, 0xf7, 0xaa, 0x15,
+                                                       0x9e, 0x72, 0x6d, 0x95, 0x6c, 0x1b, 0x3c, 0x4a,
+                                                       0x4b, 0x3c, 0x3c, 0xcc, 0x4a, 0xda, 0xda, 0xcc,
+                                                       0xc9, 0xdb, 0xaa, 0x80, 0xaa, 0x79, 0xa4, 0x1f,
+                                                       0x13, 0x51, 0x55, 0x0, 0x9f, 0x9a, 0xa1, 0x92,
+                                                       0xa3, 0x1b, 0xa6, 0x9c, 0x83, 0x78, 0x9d, 0x1f,
+                                                       0x78, 0x72, 0x80, 0x6c, 0x6c, 0x1a, 0x3c, 0xce,
+                                                       0x4b, 0xd9, 0xda, 0xcb, 0xcb, 0xda, 0xda, 0x4a,
+                                                       0xcc, 0x3c, 0x6d, 0x6d, 0x81, 0x79, 0x73, 0x1e,
+                                                       0x13, 0xaa, 0x48, 0x80, 0x76, 0x9e, 0x84, 0x99,
+                                                       0xa8, 0x1a, 0xa4, 0x94, 0x9d, 0x9d, 0x9d, 0x1e,
+                                                       0x78, 0xa4, 0xaa, 0x80, 0xaa, 0x1b, 0xda, 0xcb,
+                                                       0xce, 0xd9, 0xda, 0x4b, 0xcb, 0x3c, 0x1f, 0x13,
+                                                       0x91, 0x52, 0x80, 0x3c, 0x4a, 0x49, 0x3c, 0x6d,
+                                                       0x95, 0x6d, 0x9d, 0x73, 0x1f, 0x78, 0x79, 0x7a,
+                                                       0x85, 0x71, 0x1b, 0x73, 0x77, 0x91, 0x9e, 0x7a,
+                                                       0x1f, 0x9d, 0xa4, 0x96, 0xa9, 0xaa, 0x1a, 0xda,
+                                                       0x4a, 0xcc, 0x3c, 0x3c, 0x4a, 0x4b, 0x3c, 0x1e,
+                                                       0x13, 0xa5, 0x48, 0x80, 0x3c, 0xcd, 0x4a, 0xda,
+                                                       0xa9, 0xa9, 0x95, 0x9d, 0xa3, 0x1e, 0x9d, 0x79,
+                                                       0x93, 0x7b, 0x71, 0x1a, 0x6f, 0x85, 0x7c, 0x77,
+                                                       0x77, 0x1e, 0x13, 0xa5, 0x52, 0x80, 0xf7, 0x4e,
+                                                       0xf7, 0x65, 0x42, 0xa, 0xfb, 0xb5, 0xf7, 0xb4,
+                                                       0x42, 0xa, 0xe, 0x5a, 0x8b, 0xf7, 0xc, 0x6d,
+                                                       0xf6, 0x22, 0xa7, 0xbf, 0x93, 0x83, 0x95, 0xb2,
+                                                       0xe8, 0x30, 0xe9, 0x66, 0xf7, 0xb, 0x39, 0xbd,
+                                                       0x63, 0xa4, 0x72, 0xf7, 0x17, 0x2f, 0xac, 0x6c,
+                                                       0xe5, 0xa3, 0xa7, 0x6f, 0xf6, 0x31, 0x96, 0xc0,
+                                                       0xa3, 0xe7, 0x77, 0x12, 0xf7, 0x24, 0xab, 0x6e,
+                                                       0xf4, 0x71, 0x95, 0xb4, 0xe8, 0x30, 0xf7, 0x20,
+                                                       0x38, 0xae, 0x68, 0xf7, 0xb, 0x35, 0xbd, 0x59,
+                                                       0xf7, 0x26, 0xfb, 0x18, 0xa4, 0x97, 0xe7, 0xa5,
+                                                       0xf5, 0x2f, 0x98, 0xbe, 0xa9, 0x7e, 0xa, 0xf8,
+                                                       0x4d, 0xf8, 0x14, 0x79, 0xa, 0x93, 0x9c, 0x86,
+                                                       0x90, 0x86, 0x92, 0x78, 0x81, 0x7c, 0x7b, 0x7b,
+                                                       0x7a, 0x83, 0x7a, 0x90, 0x86, 0x8, 0x9e, 0xfb,
+                                                       0x14, 0x78, 0xa, 0x83, 0x9c, 0x7b, 0x9c, 0x7c,
+                                                       0x9b, 0x78, 0x94, 0x86, 0x86, 0x86, 0x85, 0x93,
+                                                       0x7a, 0x9b, 0x7b, 0x8, 0xfb, 0x28, 0xf7, 0x28,
+                                                       0x78, 0xa, 0x82, 0x9c, 0x7b, 0x9c, 0x7c, 0x9b,
+                                                       0x78, 0x95, 0x86, 0x84, 0x86, 0x86, 0x94, 0x7a,
+                                                       0x9b, 0x7b, 0x8, 0xd2, 0xfb, 0x74, 0x15, 0x13,
+                                                       0x44, 0x54, 0xea, 0xb, 0x94, 0x7f, 0x78, 0x93,
+                                                       0x7d, 0x1b, 0x6a, 0x71, 0x74, 0x6c, 0x70, 0x9f,
+                                                       0x71, 0xab, 0x1f, 0x13, 0x34, 0x54, 0xe8, 0x83,
+                                                       0x90, 0x91, 0x8c, 0x8c, 0x90, 0x1f, 0x8c, 0x8d,
+                                                       0x8b, 0x8c, 0x1b, 0x87, 0x85, 0x80, 0x80, 0x77,
+                                                       0x1a, 0x13, 0x94, 0x54, 0xe8, 0x83, 0x6d, 0xa6,
+                                                       0x72, 0xab, 0xac, 0xa6, 0xa4, 0xa9, 0xa0, 0x83,
+                                                       0x92, 0x87, 0x93, 0x1e, 0x93, 0x89, 0x5, 0x89,
+                                                       0x93, 0x92, 0x8b, 0x92, 0x1b, 0x13, 0x44, 0x54,
+                                                       0xe8, 0x23, 0xa7, 0x99, 0xa7, 0xa8, 0x1f, 0x13,
+                                                       0x44, 0x54, 0xe8, 0x83, 0xaa, 0x70, 0xa1, 0x6a,
+                                                       0x1e, 0x13, 0x8a, 0x24, 0xec, 0x1c, 0x7d, 0x74,
+                                                       0x85, 0x82, 0x81, 0x1f, 0x8c, 0xb5, 0x89, 0xc7,
+                                                       0xa1, 0xa1, 0xa4, 0xa4, 0xc4, 0x8b, 0xb7, 0x87,
+                                                       0x8, 0x81, 0x81, 0x84, 0x76, 0x7d, 0x1a, 0x6a,
+                                                       0xa3, 0x71, 0xaa, 0xa4, 0xa5, 0xa0, 0xa8, 0x91,
+                                                       0x8a, 0x91, 0x8a, 0x91, 0x1e, 0x8c, 0x8b, 0x8e,
+                                                       0x8c, 0x1a, 0x13, 0x91, 0x4, 0xec, 0x1b, 0x87,
+                                                       0x93, 0x95, 0x7f, 0x9d, 0x1b, 0xaa, 0xa4, 0xa7,
+                                                       0xab, 0xac, 0x72, 0xa5, 0x6c, 0x77, 0x86, 0x83,
+                                                       0x87, 0x83, 0x1f, 0x8c, 0x94, 0x5, 0x8c, 0x90,
+                                                       0x8b, 0x90, 0x90, 0x1a, 0x13, 0x94, 0x24, 0xec,
+                                                       0x1c, 0xac, 0x73, 0x99, 0x6a, 0x6d, 0x75, 0x72,
+                                                       0x6a, 0x1e, 0x13, 0x94, 0x51, 0xec, 0x1b, 0x7b,
+                                                       0x90, 0x77, 0x94, 0x7f, 0x1e, 0x54, 0x8a, 0x5e,
+                                                       0x8b, 0x74, 0xa2, 0x71, 0xa5, 0x91, 0xc8, 0x8a,
+                                                       0xb1, 0x8, 0x13, 0x94, 0x52, 0x6c, 0x1b, 0x82,
+                                                       0x95, 0xa0, 0x83, 0x98, 0x1b, 0xac, 0xa6, 0xa2,
+                                                       0xaa, 0xa6, 0x76, 0xa5, 0x6c, 0x1f, 0x13, 0x94,
+                                                       0x54, 0xe9, 0x1b, 0x86, 0x86, 0x8a, 0x8a, 0x85,
+                                                       0x1f, 0x88, 0x8a, 0x8b, 0x8a, 0x1b, 0x8f, 0x92,
+                                                       0x96, 0x96, 0x9e, 0x1a, 0xa9, 0x71, 0xa4, 0x6a,
+                                                       0x6b, 0x70, 0x72, 0x6d, 0x76, 0x92, 0x84, 0x8f,
+                                                       0x83, 0x1e, 0x83, 0x8d, 0x5, 0x8d, 0x84, 0x85,
+                                                       0x8b, 0x86, 0x1b, 0x7e, 0xa, 0x6d, 0x7d, 0x70,
+                                                       0x6d, 0x6c, 0xa4, 0x75, 0xac, 0x9b, 0x9f, 0x91,
+                                                       0x94, 0x97, 0x1f, 0x8a, 0x69, 0x92, 0x4e, 0x6f,
+                                                       0x6f, 0x7a, 0x7a, 0x45, 0x85, 0x65, 0x8c, 0x8,
+                                                       0x13, 0x91, 0x4, 0xd4, 0x1b, 0x94, 0x97, 0x92,
+                                                       0x9e, 0x99, 0x1a, 0xac, 0x74, 0xa5, 0x6d, 0x72,
+                                                       0x70, 0x79, 0x6f, 0x84, 0x8a, 0x84, 0x8d, 0x83,
+                                                       0x1e, 0x8a, 0x8b, 0x8a, 0x88, 0x1a, 0x8f, 0x83,
+                                                       0x83, 0x97, 0x77, 0x1b, 0x6c, 0x72, 0x70, 0x6a,
+                                                       0x6a, 0xa4, 0x71, 0xaa, 0xa0, 0x91, 0x93, 0x8f,
+                                                       0x91, 0x1f, 0x7e, 0xa, 0x8a, 0x82, 0x5, 0x8a,
+                                                       0x86, 0x8b, 0x87, 0x87, 0x1a, 0x69, 0xa2, 0x7c,
+                                                       0xad, 0x1e, 0x13, 0x92, 0x54, 0xd4, 0x1b, 0xaa,
+                                                       0xa0, 0xa4, 0xac, 0x9b, 0x86, 0x9f, 0x82, 0x97,
+                                                       0x1f, 0xb3, 0x8e, 0xc4, 0x8d, 0xa5, 0x71, 0x8,
+                                                       0xa4, 0x72, 0x88, 0x49, 0x68, 0x1a, 0x30, 0xc3,
+                                                       0x79, 0xa, 0x94, 0x9c, 0x86, 0x91, 0x86, 0x90,
+                                                       0x78, 0x82, 0x7c, 0x7b, 0x7b, 0x7a, 0x82, 0x7a,
+                                                       0x90, 0x86, 0x8, 0xf7, 0xa5, 0xf5, 0x50, 0xa,
+                                                       0x1e, 0x13, 0x94, 0x8c, 0xe8, 0x4b, 0x51, 0xa,
+                                                       0xfb, 0x58, 0xf7, 0x56, 0x44, 0xa, 0xfb, 0x56,
+                                                       0xfb, 0x58, 0x44, 0xa, 0xf7, 0x59, 0xfb, 0x56,
+                                                       0x44, 0xa, 0xe, 0x5d, 0x9b, 0x76, 0xf7, 0xd1,
+                                                       0xc3, 0xf7, 0xd1, 0x77, 0x1, 0xf8, 0x6, 0xbf,
+                                                       0x3, 0xf7, 0x94, 0xf7, 0x57, 0x15, 0xf7, 0x20,
+                                                       0xfb, 0x5c, 0xf7, 0x20, 0xf7, 0x5c, 0xf7, 0x6f,
+                                                       0xf7, 0x25, 0xfb, 0x6f, 0xf7, 0x25, 0xfb, 0x20,
+                                                       0xf7, 0x5c, 0xfb, 0x20, 0xfb, 0x5c, 0xfb, 0x6f,
+                                                       0xfb, 0x25, 0x5, 0xf8, 0x15, 0xad, 0x15, 0xa3,
+                                                       0xc2, 0xc8, 0xa4, 0x90, 0x8f, 0x88, 0x86, 0x72,
+                                                       0x4f, 0x51, 0x73, 0x87, 0x8a, 0x8d, 0x8f, 0x1e,
+                                                       0x52, 0x85, 0x15, 0x73, 0x4f, 0xc5, 0xa4, 0x90,
+                                                       0x8f, 0x8e, 0x90, 0xa4, 0xc2, 0x4e, 0x73, 0x87,
+                                                       0x8a, 0x89, 0x87, 0x1f, 0xc4, 0x4d, 0x15, 0x8f,
+                                                       0x8c, 0x8d, 0x8f, 0xa3, 0xc7, 0x51, 0x72, 0x86,
+                                                       0x87, 0x88, 0x86, 0x72, 0x54, 0xc8, 0xa3, 0x1e,
+                                                       0xfb, 0x21, 0x3e, 0x15, 0xa4, 0xc7, 0xc5, 0xa3,
+                                                       0x8f, 0x8c, 0x89, 0x87, 0x73, 0x54, 0x4e, 0x72,
+                                                       0x86, 0x87, 0x8e, 0x90, 0x1e, 0xe, 0x5e, 0x78,
+                                                       0xf9, 0x54, 0x1, 0xb1, 0xf9, 0x62, 0x3, 0xf7,
+                                                       0x99, 0xf7, 0x58, 0x15, 0xf7, 0x1c, 0xfb, 0x6b,
+                                                       0xf7, 0x27, 0xf7, 0x73, 0xf7, 0x68, 0xf7, 0x1c,
+                                                       0xfb, 0x6e, 0xf7, 0x22, 0xfb, 0x21, 0xf7, 0x5f,
+                                                       0xfb, 0x1e, 0xfb, 0x5f, 0xfb, 0x71, 0xfb, 0x22,
+                                                       0x5, 0xf7, 0x7e, 0xfb, 0x1a, 0x15, 0x9e, 0xca,
+                                                       0xfb, 0x36, 0xbc, 0x92, 0x9d, 0x83, 0x9d, 0xf7,
+                                                       0x33, 0xc7, 0x79, 0xc6, 0xc4, 0x78, 0xbc, 0xf7,
+                                                       0x37, 0xa1, 0x7e, 0xa0, 0x99, 0xbf, 0xfb, 0x33,
+                                                       0xc8, 0x9a, 0x79, 0x52, 0xf7, 0x35, 0x55, 0x84,
+                                                       0x78, 0x95, 0x7a, 0xfb, 0x33, 0x55, 0x9e, 0x4d,
+                                                       0x4f, 0xa1, 0x4f, 0xfb, 0x37, 0x77, 0x93, 0x79,
+                                                       0x82, 0x5c, 0xf7, 0x32, 0x5, 0xe, 0x74, 0x3a,
+                                                       0xa, 0xf7, 0xd6, 0xf7, 0x78, 0x3, 0xf7, 0x45,
+                                                       0x7d, 0x15, 0xf7, 0x7b, 0xf7, 0x3d, 0xf7, 0x7c,
+                                                       0xfb, 0x3d, 0x31, 0xf7, 0xa9, 0xf7, 0x7c, 0xf7,
+                                                       0x41, 0x5, 0xfb, 0xb5, 0x6, 0x36, 0xf7, 0xa1,
+                                                       0x35, 0xfb, 0xa1, 0x5, 0xfb, 0xb3, 0x6, 0xf7,
+                                                       0x7e, 0xfb, 0x41, 0x5, 0xe, 0x7b, 0x92, 0x76,
+                                                       0xf8, 0x4c, 0xa6, 0xf7, 0x90, 0x54, 0xa, 0xf9,
+                                                       0x84, 0x3, 0xf7, 0x46, 0x7d, 0x15, 0xf7, 0x7d,
+                                                       0xf7, 0x2d, 0xf7, 0x7d, 0xfb, 0x2d, 0x45, 0xf7,
+                                                       0xa3, 0xf7, 0x69, 0xf7, 0x4f, 0xfb, 0xa8, 0x9e,
+                                                       0x27, 0xf7, 0x86, 0x27, 0xfb, 0x86, 0xfb, 0xa8,
+                                                       0x78, 0xf7, 0x60, 0xfb, 0x4f, 0x5, 0x63, 0xfb,
+                                                       0x86, 0x15, 0xe6, 0xf7, 0x8e, 0xfb, 0x71, 0xf7,
+                                                       0x3b, 0xf7, 0xa1, 0x80, 0xd4, 0xf7, 0x90, 0xd4,
+                                                       0xfb, 0x90, 0xf7, 0xa1, 0x96, 0xfb, 0x78, 0xfb,
+                                                       0x3b, 0xec, 0xfb, 0x8e, 0xfb, 0x67, 0xf7, 0x44,
+                                                       0x5, 0xe, 0x59, 0x92, 0x76, 0xf9, 0x45, 0xa9,
+                                                       0x8b, 0x54, 0xa, 0xb9, 0xf9, 0xd, 0xb3, 0x3,
+                                                       0xae, 0xf7, 0xec, 0x15, 0xfb, 0x5b, 0xf7, 0x37,
+                                                       0xfb, 0x33, 0xf7, 0x59, 0xf7, 0x5b, 0xf7, 0x34,
+                                                       0xf7, 0x36, 0xf7, 0x5a, 0xf7, 0x5a, 0xfb, 0x34,
+                                                       0xf7, 0x35, 0xfb, 0x5a, 0xfb, 0x5d, 0xfb, 0x34,
+                                                       0xfb, 0x35, 0xfb, 0x5c, 0x1e, 0xf7, 0x32, 0xfb,
+                                                       0xa3, 0x15, 0xda, 0xf7, 0x7e, 0xfb, 0x53, 0xf7,
+                                                       0x24, 0x5, 0xf7, 0x84, 0x6, 0xd6, 0xf7, 0x74,
+                                                       0xd7, 0xfb, 0x74, 0x5, 0xf7, 0x86, 0x6, 0xfb,
+                                                       0x59, 0xfb, 0x24, 0xd4, 0xfb, 0x7e, 0xfb, 0x56,
+                                                       0xf7, 0x25, 0x5, 0xe, 0x8d, 0x92, 0x76, 0xf7,
+                                                       0x53, 0xad, 0x8b, 0xf7, 0x4f, 0xf7, 0xc7, 0x77,
+                                                       0x1, 0xf7, 0xb1, 0xac, 0x8b, 0xf7, 0x50, 0x8b,
+                                                       0xaf, 0x3, 0xf7, 0x49, 0x7d, 0x15, 0xf7, 0x7e,
+                                                       0xf7, 0x53, 0xf7, 0x84, 0xfb, 0x53, 0xfb, 0x5,
+                                                       0xf7, 0xb0, 0xf7, 0x9d, 0xf7, 0x26, 0xfb, 0xcc,
+                                                       0x89, 0x36, 0xf7, 0xb7, 0x3b, 0xfb, 0xb7, 0xfb,
+                                                       0xbb, 0x8d, 0xf7, 0x8e, 0xfb, 0x26, 0x5, 0xac,
+                                                       0xb3, 0x15, 0xbf, 0xb6, 0xaf, 0xbf, 0xbd, 0xb6,
+                                                       0x66, 0x58, 0x59, 0x63, 0x5a, 0x56, 0x58, 0x5f,
+                                                       0xb9, 0xc0, 0x1e, 0xe, 0x7b, 0xb2, 0x76, 0xf7,
+                                                       0x7b, 0xf7, 0x4a, 0x86, 0xb0, 0xf7, 0xa7, 0x77,
+                                                       0x12, 0xf7, 0xd4, 0xf7, 0x4a, 0x13, 0xb8, 0xf7,
+                                                       0x45, 0x35, 0xa, 0xec, 0x15, 0x13, 0xd8, 0x59,
+                                                       0xb4, 0x62, 0xbd, 0xbd, 0xb4, 0xb4, 0xbd, 0xbd,
+                                                       0x62, 0xb4, 0x59, 0x59, 0x62, 0x62, 0x59, 0x1e,
+                                                       0xe, 0xfb, 0xc, 0xc6, 0xa8, 0xf7, 0x5c, 0xc7,
+                                                       0x9e, 0xe1, 0xb3, 0xaf, 0x75, 0x77, 0xf7, 0x39,
+                                                       0x77, 0x12, 0xf8, 0xae, 0xa2, 0xce, 0xa5, 0x13,
+                                                       0xef, 0xf8, 0xae, 0xf8, 0x6a, 0x15, 0x90, 0x8d,
+                                                       0x97, 0x90, 0x8e, 0x8f, 0x8f, 0x9a, 0x8b, 0xa1,
+                                                       0x8a, 0x9c, 0x7b, 0x7b, 0x73, 0x82, 0x7e, 0x88,
+                                                       0x8, 0x8b, 0x9f, 0x71, 0x95, 0x80, 0x1e, 0xfc,
+                                                       0xc, 0x97, 0x15, 0x97, 0x96, 0xd0, 0xb5, 0xdb,
+                                                       0xaf, 0xbb, 0xa1, 0xc7, 0xa2, 0xa6, 0x94, 0x8,
+                                                       0x9c, 0x91, 0x94, 0x8d, 0x90, 0x1a, 0x94, 0x52,
+                                                       0x90, 0x7e, 0x7e, 0x4d, 0x73, 0x68, 0x3b, 0x1e,
+                                                       0x3b, 0x68, 0x34, 0x5f, 0x7f, 0x1a, 0x80, 0xa4,
+                                                       0x83, 0x99, 0x85, 0x1e, 0x99, 0x85, 0x92, 0x8d,
+                                                       0x95, 0x94, 0x8, 0xfb, 0xe, 0x4c, 0x15, 0x75,
+                                                       0x95, 0xaf, 0x6d, 0xaf, 0x1b, 0xaf, 0xbd, 0xaf,
+                                                       0x96, 0x93, 0x1f, 0x91, 0x98, 0x95, 0xa2, 0x9e,
+                                                       0x99, 0x9e, 0x98, 0xb2, 0xa1, 0xab, 0x9b, 0xa2,
+                                                       0x97, 0xb3, 0x9f, 0xb1, 0x8c, 0x9c, 0x8c, 0xa1,
+                                                       0x85, 0x9c, 0x78, 0xa2, 0x91, 0xb0, 0x9c, 0x8a,
+                                                       0x95, 0x8, 0xa3, 0x8a, 0x6f, 0xbd, 0x7e, 0x1b,
+                                                       0x82, 0x26, 0x66, 0x6a, 0x42, 0x1f, 0x42, 0x6a,
+                                                       0x47, 0x5c, 0x83, 0x86, 0x8, 0x86, 0x83, 0x7b,
+                                                       0x79, 0x81, 0x1b, 0x81, 0x79, 0x94, 0x90, 0x7e,
+                                                       0x1f, 0x83, 0x8e, 0x79, 0x97, 0x83, 0x95, 0x7e,
+                                                       0x7f, 0x81, 0x7d, 0x80, 0x5c, 0x8, 0xf7, 0xf,
+                                                       0xfb, 0x29, 0x15, 0x8b, 0xf7, 0x7c, 0xfb, 0x4d,
+                                                       0x97, 0x81, 0x1e, 0x81, 0x97, 0x9a, 0x85, 0x92,
+                                                       0x1b, 0x92, 0x90, 0x8e, 0x92, 0x96, 0x1f, 0x96,
+                                                       0x92, 0xf7, 0x2c, 0xf4, 0x96, 0x94, 0x8, 0x96,
+                                                       0x94, 0x8f, 0x9d, 0x98, 0x98, 0x8c, 0x94, 0x9d,
+                                                       0x1a, 0x9d, 0x86, 0x9b, 0x7a, 0xa3, 0x1e, 0x7a,
+                                                       0xa3, 0x29, 0xf7, 0x9, 0x80, 0x98, 0x83, 0x95,
+                                                       0x7f, 0xa0, 0x7a, 0x94, 0x8, 0x13, 0xf7, 0x83,
+                                                       0x8f, 0x82, 0x8f, 0x7d, 0x8a, 0x77, 0x8a, 0x66,
+                                                       0x7e, 0x6d, 0x7b, 0x78, 0x81, 0x61, 0x77, 0x72,
+                                                       0x78, 0x77, 0x7b, 0x84, 0x72, 0x88, 0x74, 0x84,
+                                                       0x54, 0x87, 0x79, 0x84, 0x83, 0x80, 0x7e, 0x73,
+                                                       0x7d, 0x78, 0x87, 0x8, 0xfb, 0x15, 0xf7, 0x11,
+                                                       0x15, 0x8c, 0x7a, 0x8d, 0x6b, 0x90, 0x75, 0x8,
+                                                       0x77, 0x97, 0xb3, 0x77, 0xa9, 0x1b, 0xa9, 0xa8,
+                                                       0x94, 0x9e, 0x9e, 0x1f, 0x92, 0xa1, 0x8f, 0xa9,
+                                                       0x8e, 0xa2, 0x8, 0x80, 0x81, 0x67, 0x6b, 0x5d,
+                                                       0x1b, 0x5d, 0x6c, 0xaf, 0x9a, 0x7e, 0x1f, 0xf8,
+                                                       0x44, 0x8e, 0x15, 0x76, 0xa2, 0xae, 0xa0, 0x9f,
+                                                       0x74, 0x5, 0x87, 0x54, 0x15, 0x79, 0xa0, 0xac,
+                                                       0xa0, 0x9c, 0x76, 0x5, 0x88, 0x55, 0x15, 0x79,
+                                                       0x9e, 0xaa, 0xa1, 0x9d, 0x77, 0x5, 0x53, 0x4,
+                                                       0x77, 0xa2, 0xa9, 0xa0, 0x9f, 0x77, 0x5, 0xfb,
+                                                       0x40, 0xb9, 0x15, 0x75, 0xa2, 0xaf, 0xa3, 0xa1,
+                                                       0x73, 0x5, 0x86, 0x51, 0x15, 0x77, 0xa0, 0xae,
+                                                       0xa3, 0xa0, 0x75, 0x5, 0x86, 0x50, 0x15, 0x78,
+                                                       0x9f, 0xaf, 0xa4, 0x9d, 0x78, 0x5, 0x86, 0x50,
+                                                       0x15, 0x76, 0xa3, 0xad, 0xa4, 0xa0, 0x73, 0x5,
+                                                       0xfb, 0x91, 0xf1, 0x15, 0x97, 0x93, 0xf7, 0x17,
+                                                       0xd9, 0x94, 0x90, 0x8, 0x90, 0x94, 0x94, 0x8f,
+                                                       0x92, 0x1b, 0x92, 0x8c, 0x88, 0x86, 0x86, 0x84,
+                                                       0x88, 0x7e, 0x83, 0x1f, 0x6e, 0x7a, 0x22, 0x4d,
+                                                       0x81, 0x85, 0x8, 0x84, 0x80, 0x7e, 0x7e, 0x80,
+                                                       0x1b, 0x85, 0x88, 0x8b, 0x91, 0x93, 0x90, 0x8e,
+                                                       0x9d, 0x97, 0x1f, 0xd7, 0x58, 0x15, 0x78, 0xa2,
+                                                       0xab, 0x9f, 0x9f, 0x74, 0x5, 0x8e, 0x51, 0x15,
+                                                       0x76, 0xa2, 0xa8, 0xa0, 0xa1, 0x74, 0x5, 0x8c,
+                                                       0x53, 0x15, 0x79, 0xa0, 0xa8, 0x9e, 0x9d, 0x78,
+                                                       0x5, 0x8a, 0x54, 0x15, 0x77, 0xa2, 0xa9, 0xa1,
+                                                       0xa1, 0x72, 0x5, 0x42, 0x48, 0x15, 0x83, 0x95,
+                                                       0x2f, 0xf4, 0x7c, 0x9c, 0x7c, 0x9c, 0x8c, 0x94,
+                                                       0x8f, 0x8e, 0x90, 0x8f, 0x9c, 0x7c, 0x93, 0x82,
+                                                       0x95, 0x80, 0xe6, 0x20, 0x92, 0x84, 0x8, 0x84,
+                                                       0x92, 0x93, 0x87, 0x8f, 0x1b, 0x8f, 0x95, 0x91,
+                                                       0x90, 0x92, 0x1f, 0x92, 0x90, 0xf7, 0x6, 0xd8,
+                                                       0x92, 0x90, 0x8, 0x90, 0x92, 0x94, 0x92, 0x8f,
+                                                       0x1b, 0x8f, 0x91, 0x88, 0x86, 0x86, 0x82, 0x84,
+                                                       0x82, 0x86, 0x1f, 0x82, 0x86, 0xfb, 0x16, 0x33,
+                                                       0x84, 0x86, 0x84, 0x86, 0x89, 0x89, 0x89, 0x85,
+                                                       0x89, 0x85, 0x8c, 0x70, 0x8a, 0x82, 0x8, 0x78,
+                                                       0x88, 0x8b, 0x79, 0x86, 0x1b, 0x86, 0x88, 0x95,
+                                                       0x9b, 0x93, 0x88, 0x9e, 0x8a, 0x9d, 0x1f, 0x8a,
+                                                       0x95, 0x86, 0x94, 0x83, 0x95, 0x8, 0xe, 0x85,
+                                                       0xb2, 0x76, 0xf8, 0x2, 0xb5, 0x8b, 0xb0, 0xf7,
+                                                       0xa7, 0x77, 0x1, 0xf7, 0x4a, 0x35, 0xa, 0x6e,
+                                                       0x15, 0xe6, 0xd7, 0xe6, 0x3f, 0x5f, 0xf7, 0x3,
+                                                       0xf0, 0xca, 0xfb, 0xb, 0x83, 0x6e, 0xf7, 0x7,
+                                                       0x6e, 0xfb, 0x7, 0xfb, 0xb, 0x93, 0xf0, 0x4c,
+                                                       0x5, 0xe, 0x74, 0xb2, 0x76, 0xf7, 0x75, 0xa9,
+                                                       0xf7, 0x19, 0xa5, 0x85, 0xb0, 0xf7, 0xa7, 0x77,
+                                                       0x12, 0x13, 0xe8, 0xf7, 0x42, 0x4f, 0xa, 0x5,
+                                                       0x13, 0xd8, 0x32, 0xa, 0xfb, 0x10, 0x42, 0x15,
+                                                       0xf7, 0x10, 0xf2, 0xf7, 0x10, 0x24, 0x4f, 0xf7,
+                                                       0x29, 0xf7, 0x1c, 0xe1, 0xfb, 0x34, 0x81, 0x63,
+                                                       0xf7, 0x30, 0x63, 0xfb, 0x30, 0xfb, 0x34, 0x95,
+                                                       0xf7, 0x1c, 0x35, 0x5, 0xe, 0x83, 0x92, 0x76,
+                                                       0xf8, 0x3f, 0xa0, 0xf7, 0xa3, 0x77, 0x1, 0xf8,
+                                                       0x38, 0xd9, 0x3, 0xf7, 0x3f, 0x7d, 0x15, 0xf7,
+                                                       0x8d, 0xf7, 0x44, 0xf7, 0x95, 0xfb, 0x44, 0x25,
+                                                       0xf7, 0xae, 0xf7, 0x71, 0xf7, 0x3a, 0x5, 0xfb,
+                                                       0xad, 0x6, 0x2c, 0xf7, 0xa3, 0x2a, 0xfb, 0xa3,
+                                                       0x5, 0xfb, 0xb4, 0x6, 0xf7, 0x7d, 0xfb, 0x3a,
+                                                       0x5, 0xf7, 0x2c, 0xba, 0x15, 0x38, 0xed, 0xde,
+                                                       0xf7, 0x8d, 0x5, 0xfb, 0xef, 0x4, 0xd9, 0xed,
+                                                       0x5, 0xf7, 0x92, 0x6, 0xfc, 0x61, 0xfb, 0x1f,
+                                                       0x15, 0xfb, 0x69, 0xf7, 0x24, 0xf7, 0xea, 0x24,
+                                                       0x5, 0x8b, 0x4, 0xf7, 0x19, 0x62, 0xf2, 0xfb,
+                                                       0x9f, 0x5, 0xfc, 0x61, 0x95, 0x15, 0xf7, 0x75,
+                                                       0xf7, 0xbd, 0x5, 0xfb, 0x16, 0x7, 0xe, 0xdf,
+                                                       0x92, 0x76, 0xf8, 0x47, 0xa0, 0xf7, 0x9b, 0x77,
+                                                       0x1, 0xf7, 0xd3, 0xf7, 0xed, 0x3, 0xf7, 0x43,
+                                                       0x92, 0x15, 0xf7, 0xd, 0x76, 0xf7, 0x47, 0xf7,
+                                                       0x17, 0xf7, 0x35, 0xfb, 0x12, 0xf7, 0xf, 0x86,
+                                                       0x2c, 0xf7, 0xa9, 0xf7, 0x74, 0xf7, 0x32, 0x4e,
+                                                       0xa0, 0x5, 0xfb, 0x73, 0x6, 0x37, 0xf7, 0x89,
+                                                       0xfb, 0x4, 0x9d, 0x32, 0xfb, 0x9b, 0x5, 0xfb,
+                                                       0xb0, 0x6, 0xf7, 0x76, 0xfb, 0x41, 0x5, 0x55,
+                                                       0xfb, 0x7c, 0x15, 0xdb, 0xf7, 0x86, 0xfb, 0x53,
+                                                       0xf7, 0x22, 0x5, 0xf7, 0x84, 0x6, 0xdc, 0xf7,
+                                                       0x8b, 0xdd, 0xfb, 0x8b, 0x5, 0xf7, 0x8c, 0x6,
+                                                       0xfb, 0x5f, 0xfb, 0x22, 0xda, 0xfb, 0x91, 0xfb,
+                                                       0x62, 0xf7, 0x38, 0x5, 0xe, 0x2c, 0x9d, 0x76,
+                                                       0xf9, 0x4b, 0x77, 0x1, 0xbf, 0xf9, 0x14, 0x3,
+                                                       0xd2, 0xf7, 0x3, 0x15, 0xf7, 0x82, 0xf7, 0x9,
+                                                       0xf7, 0x2d, 0xfb, 0x7b, 0xa0, 0x98, 0x68, 0xf7,
+                                                       0xa0, 0xf7, 0x88, 0xd6, 0x5, 0xa3, 0x7, 0xfb,
+                                                       0x8c, 0xb3, 0xa2, 0xf7, 0x9e, 0x70, 0x94, 0xfb,
+                                                       0x1e, 0xfb, 0x86, 0xfb, 0x7f, 0xf7, 0x14, 0x7c,
+                                                       0x76, 0xf7, 0x38, 0xfb, 0x71, 0xfb, 0x36, 0xfb,
+                                                       0x5d, 0x5, 0xe, 0xfb, 0x8, 0x9a, 0x76, 0xf7,
+                                                       0x99, 0xf7, 0x3f, 0xf7, 0x9b, 0x77, 0x1, 0xf7,
+                                                       0x85, 0x96, 0x8b, 0xf7, 0x3c, 0x3, 0xc4, 0xf7,
+                                                       0x3, 0x15, 0xf7, 0x91, 0xf7, 0x20, 0xf7, 0x2f,
+                                                       0xfb, 0x95, 0x9e, 0x99, 0x4f, 0xf7, 0xac, 0xf7,
+                                                       0x9b, 0xc9, 0x5, 0xa7, 0x7, 0xfb, 0xa2, 0x9e,
+                                                       0xb8, 0xf7, 0xab, 0x6f, 0x98, 0xfb, 0x16, 0xfb,
+                                                       0xa0, 0xfb, 0x8f, 0xf7, 0x2e, 0x7a, 0x76, 0xf7,
+                                                       0x61, 0xfb, 0x71, 0xfb, 0x5a, 0xfb, 0x5c, 0x5,
+                                                       0xf7, 0x65, 0xf7, 0x64, 0x15, 0xb9, 0xb0, 0xb2,
+                                                       0xbb, 0xba, 0xaf, 0x64, 0x5d, 0x5c, 0x67, 0x64,
+                                                       0x5c, 0x5b, 0x66, 0xb2, 0xba, 0x1e, 0xe, 0x31,
+                                                       0xa0, 0x76, 0xf9, 0x30, 0x77, 0x1, 0xb3, 0xf9,
+                                                       0x31, 0x3, 0xf7, 0x4, 0xf7, 0x10, 0x15, 0xf7,
+                                                       0x83, 0xf7, 0x45, 0xfb, 0x5, 0xfb, 0xa8, 0xb2,
+                                                       0x8a, 0xa4, 0x85, 0xb1, 0x79, 0x19, 0xb4, 0xf7,
+                                                       0xb8, 0xf7, 0x9, 0xfb, 0xa5, 0xa7, 0xa5, 0xa2,
+                                                       0x9b, 0xb1, 0x95, 0x19, 0xfb, 0x48, 0xf7, 0x82,
+                                                       0xf7, 0xa9, 0xfb, 0x3, 0x88, 0xaa, 0x99, 0xb2,
+                                                       0x99, 0xa8, 0x19, 0xfb, 0xb9, 0xb5, 0xf7, 0xa6,
+                                                       0xf7, 0x9, 0x74, 0xa3, 0x76, 0xb0, 0x82, 0xa6,
+                                                       0x19, 0xfb, 0x82, 0xfb, 0x45, 0xf7, 0x4, 0xf7,
+                                                       0xa8, 0x6c, 0x8c, 0x62, 0x96, 0x6f, 0x98, 0x19,
+                                                       0x60, 0xfb, 0xb8, 0xfb, 0x8, 0xf7, 0xa5, 0x77,
+                                                       0x79, 0x68, 0x76, 0x6a, 0x7e, 0x19, 0x8c, 0x6,
+                                                       0xf7, 0x45, 0xfb, 0x82, 0xfb, 0xa8, 0xf7, 0x3,
+                                                       0x5, 0x64, 0x80, 0x70, 0x7c, 0x6a, 0x1e, 0xf7,
+                                                       0xb9, 0x60, 0xfb, 0xa5, 0xfb, 0x8, 0xa4, 0x6f,
+                                                       0x98, 0x74, 0x99, 0x66, 0x19, 0xe, 0x5a, 0x9f,
+                                                       0x76, 0xf8, 0x8f, 0x77, 0xae, 0x77, 0xf7, 0x46,
+                                                       0x77, 0x12, 0xc2, 0xf9, 0x3c, 0x13, 0xd8, 0xeb,
+                                                       0xf7, 0x31, 0x15, 0xf7, 0x8b, 0xf7, 0x6, 0x5c,
+                                                       0xfb, 0xa1, 0x9d, 0x88, 0xe7, 0xf7, 0x93, 0xf7,
+                                                       0x31, 0xfb, 0x73, 0x99, 0x94, 0xfb, 0x7, 0xf7,
+                                                       0x8b, 0xf7, 0xa2, 0x5c, 0x8e, 0x9b, 0xfb, 0x93,
+                                                       0xe9, 0xf7, 0x73, 0xf7, 0x30, 0x5, 0x13, 0xb8,
+                                                       0x80, 0x9a, 0xfb, 0x89, 0xfb, 0x6, 0xba, 0xf7,
+                                                       0xa1, 0x79, 0x8e, 0x2d, 0xfb, 0x93, 0xfb, 0x2f,
+                                                       0xf7, 0x73, 0x7c, 0x82, 0xf7, 0x8, 0xfb, 0x8b,
+                                                       0xfb, 0xa2, 0xba, 0x88, 0x7b, 0xf7, 0x93, 0x2d,
+                                                       0xfb, 0x73, 0xfb, 0x30, 0x5, 0xe, 0x5c, 0x78,
+                                                       0x60, 0xa, 0x8e, 0xbe, 0x7e, 0x67, 0xa, 0x95,
+                                                       0x77, 0xb8, 0xcf, 0x48, 0xcf, 0xd7, 0xa7, 0x8c,
+                                                       0x77, 0x12, 0xb0, 0x60, 0xa, 0x95, 0xbe, 0x77,
+                                                       0x67, 0xa, 0xae, 0xcf, 0x48, 0xcf, 0xd7, 0xa7,
+                                                       0x13, 0xec, 0x52, 0xb4, 0x55, 0x40, 0xf7, 0x8a,
+                                                       0xa1, 0x15, 0x73, 0xa6, 0x7f, 0xb9, 0xae, 0x1a,
+                                                       0xb8, 0x9d, 0xb5, 0xab, 0xab, 0x1e, 0x8d, 0x89,
+                                                       0x5, 0x81, 0x7a, 0x85, 0x76, 0x78, 0x1a, 0x61,
+                                                       0xa3, 0x6c, 0xb4, 0x82, 0x1e, 0x49, 0x97, 0xbf,
+                                                       0x4e, 0xd2, 0x1b, 0xa5, 0xa3, 0x95, 0x9d, 0x9e,
+                                                       0x1f, 0x79, 0x8c, 0x79, 0x92, 0x7b, 0x93, 0x4f,
+                                                       0xa9, 0x65, 0xc3, 0x8a, 0xcf, 0x8e, 0x8c, 0x18,
+                                                       0x64, 0x94, 0xaf, 0x64, 0xb6, 0x1b, 0x9b, 0x9b,
+                                                       0x91, 0x93, 0x98, 0x1f, 0x78, 0xa7, 0xad, 0x80,
+                                                       0xad, 0x1b, 0xc9, 0xc0, 0xb2, 0xcc, 0x8e, 0x1f,
+                                                       0x73, 0x70, 0x5d, 0x7f, 0x68, 0x1b, 0x5e, 0x61,
+                                                       0x9d, 0xab, 0x6b, 0x7f, 0xa, 0x13, 0xd1, 0x52,
+                                                       0xb9, 0x21, 0x40, 0x81, 0x9c, 0xa0, 0x85, 0x9e,
+                                                       0x1b, 0xb5, 0xaa, 0xa3, 0xb4, 0x94, 0x1f, 0xcd,
+                                                       0x97, 0xc8, 0xbf, 0xd2, 0x1a, 0xa5, 0x81, 0xa3,
+                                                       0x79, 0x9e, 0x1e, 0x8a, 0x79, 0x84, 0x79, 0x83,
+                                                       0x7b, 0x6d, 0x4f, 0x53, 0x65, 0x47, 0x8a, 0x8a,
+                                                       0x8e, 0x18, 0xb2, 0x94, 0xb2, 0xaf, 0xb6, 0x1a,
+                                                       0x9b, 0x85, 0x9b, 0x83, 0x98, 0x1e, 0x13, 0xe5,
+                                                       0x52, 0xb9, 0x54, 0xc0, 0x9e, 0xa7, 0x96, 0xad,
+                                                       0xad, 0x1a, 0x13, 0xe5, 0x52, 0xb9, 0x21, 0x40,
+                                                       0xc9, 0x64, 0xc0, 0x4a, 0x8e, 0x1e, 0x13, 0xe5,
+                                                       0x52, 0xb9, 0x54, 0xc0, 0xa3, 0x70, 0x97, 0x5d,
+                                                       0x68, 0x1a, 0x5e, 0x79, 0x61, 0x6b, 0x6b, 0x1e,
+                                                       0x89, 0x8d, 0x5, 0x13, 0xe4, 0x82, 0xb9, 0x49,
+                                                       0x40, 0x95, 0x9c, 0x91, 0xa0, 0x9e, 0x1a, 0xb5,
+                                                       0x73, 0xaa, 0x62, 0x94, 0x1e, 0x13, 0xe5, 0x46,
+                                                       0x79, 0x49, 0x40, 0xcd, 0x7f, 0x57, 0xc8, 0x44,
+                                                       0x1b, 0x71, 0x73, 0x81, 0x79, 0x78, 0x1f, 0x9d,
+                                                       0x8a, 0x9d, 0x84, 0x9b, 0x83, 0xc7, 0x6d, 0xb1,
+                                                       0x53, 0x8c, 0x47, 0x88, 0x8a, 0x18, 0xb2, 0x82,
+                                                       0x67, 0xb2, 0x60, 0x1b, 0x7b, 0x7b, 0x85, 0x83,
+                                                       0x7e, 0x1f, 0x13, 0xe5, 0x51, 0xb9, 0x55, 0x40,
+                                                       0x9e, 0x6f, 0x69, 0x96, 0x69, 0x1b, 0x6e, 0xa,
+                                                       0x4d, 0x56, 0x64, 0x4a, 0x88, 0x1f, 0x13, 0xe5,
+                                                       0x51, 0xb9, 0x55, 0x40, 0xa3, 0xa6, 0xb9, 0x97,
+                                                       0xae, 0x1b, 0xb8, 0xb5, 0x79, 0x6b, 0xab, 0x1f,
+                                                       0x89, 0x89, 0x5, 0x13, 0xe8, 0x22, 0xb9, 0x55,
+                                                       0x40, 0x95, 0x7a, 0x76, 0x91, 0x78, 0x1b, 0x61,
+                                                       0x6c, 0x73, 0x62, 0x82, 0x1f, 0x49, 0x7f, 0x4e,
+                                                       0x57, 0x44, 0x1a, 0x71, 0x95, 0x73, 0x9d, 0x78,
+                                                       0x1e, 0x8c, 0x9d, 0x92, 0x9d, 0x93, 0x9b, 0xa9,
+                                                       0xc7, 0xc3, 0xb1, 0xcf, 0x8c, 0x8c, 0x88, 0x18,
+                                                       0x64, 0x82, 0x64, 0x67, 0x60, 0x1a, 0x7b, 0x91,
+                                                       0x7b, 0x93, 0x7e, 0x1e, 0x78, 0x6f, 0x80, 0x69,
+                                                       0x69, 0x1a, 0x4d, 0xb2, 0x56, 0xcc, 0x88, 0x1e,
+                                                       0xc6, 0xf7, 0x6, 0x15, 0x81, 0x9b, 0x87, 0x9e,
+                                                       0x9e, 0x1a, 0x13, 0xe3, 0x52, 0xb9, 0x55, 0x40,
+                                                       0xb6, 0xa1, 0xbc, 0xb4, 0x9d, 0x1e, 0x8a, 0x8d,
+                                                       0x5, 0x8e, 0x7f, 0x7e, 0x8d, 0x7f, 0x1b, 0x65,
+                                                       0x4c, 0x79, 0x6e, 0x70, 0x1f, 0x6e, 0xa, 0xbd,
+                                                       0x98, 0xc2, 0xb1, 0xbd, 0x1b, 0x96, 0x96, 0x89,
+                                                       0x87, 0x95, 0x1f, 0x8c, 0x8d, 0x73, 0xb6, 0x42,
+                                                       0xb8, 0x59, 0x8a, 0x19, 0x13, 0xe5, 0x4a, 0xb2,
+                                                       0x15, 0x40, 0x95, 0x9b, 0x9e, 0x8f, 0x9e, 0x1b,
+                                                       0x13, 0xe5, 0x52, 0xb8, 0xd5, 0x40, 0xb6, 0xbc,
+                                                       0x75, 0x62, 0x9d, 0x1f, 0x8d, 0x8c, 0x5, 0x8e,
+                                                       0x97, 0x8d, 0x98, 0x97, 0x1a, 0xb1, 0x79, 0xca,
+                                                       0x6e, 0xa6, 0x1e, 0x13, 0xe5, 0x52, 0xb9, 0x21,
+                                                       0x40, 0xbd, 0x7e, 0xb1, 0x54, 0x59, 0x1a, 0x80,
+                                                       0x89, 0x80, 0x87, 0x81, 0x1e, 0x8d, 0x8a, 0xb6,
+                                                       0xa3, 0xb8, 0xd4, 0x8a, 0xbd, 0x19, 0x13, 0xc8,
+                                                       0x82, 0xb9, 0x53, 0x40, 0x95, 0x7b, 0x8f, 0x78,
+                                                       0x78, 0x1a, 0x60, 0x75, 0x5a, 0x62, 0x79, 0x1e,
+                                                       0x8c, 0x89, 0x5, 0x88, 0x97, 0x98, 0x89, 0x97,
+                                                       0x1b, 0xb1, 0xca, 0x9d, 0xa8, 0xa6, 0x1f, 0x59,
+                                                       0x7e, 0x54, 0x65, 0x59, 0x1b, 0x80, 0x80, 0x8d,
+                                                       0x8f, 0x81, 0x1f, 0x8a, 0x89, 0x5, 0x13, 0xe5,
+                                                       0x52, 0xb9, 0x55, 0x40, 0xa3, 0x60, 0xd4, 0x5e,
+                                                       0xbd, 0x8c, 0x8, 0x13, 0xe5, 0x52, 0xb2, 0x21,
+                                                       0x40, 0x81, 0x7b, 0x78, 0x87, 0x78, 0x1b, 0x60,
+                                                       0x5a, 0xa1, 0xb4, 0x79, 0x1f, 0x89, 0x8a, 0x5,
+                                                       0x88, 0x7f, 0x89, 0x7e, 0x7f, 0x1a, 0x65, 0x9d,
+                                                       0x4c, 0xa8, 0x70, 0x1e, 0x59, 0x98, 0x65, 0xc2,
+                                                       0xbd, 0x1a, 0x96, 0x8d, 0x96, 0x8f, 0x95, 0x1e,
+                                                       0x89, 0x8c, 0x5, 0x13, 0xe5, 0x52, 0xb9, 0x55,
+                                                       0x40, 0x60, 0x73, 0x5e, 0x42, 0x8c, 0x59, 0x8,
+                                                       0xd1, 0xf7, 0x39, 0x15, 0xa4, 0x97, 0xa6, 0x86,
+                                                       0x87, 0xa6, 0x98, 0xa4, 0x70, 0x8f, 0x78, 0x9f,
+                                                       0x7e, 0x73, 0x5, 0x6e, 0xa, 0x72, 0x7f, 0x9f,
+                                                       0x77, 0x5, 0xe, 0xfb, 0x24, 0x92, 0x76, 0xf9,
+                                                       0x64, 0x77, 0x1, 0xb2, 0xf8, 0xfd, 0x3, 0xb2,
+                                                       0xf7, 0x3e, 0x15, 0xf7, 0x8d, 0xd7, 0xc6, 0xfb,
+                                                       0x98, 0xc7, 0xf7, 0x98, 0xf7, 0x8d, 0x3e, 0xfb,
+                                                       0x5a, 0xf7, 0x44, 0xf7, 0x5f, 0xf7, 0x44, 0xfb,
+                                                       0x92, 0x3c, 0x51, 0xf7, 0x9c, 0x4e, 0xfb, 0x9c,
+                                                       0xfb, 0x91, 0xda, 0xf7, 0x5e, 0xfb, 0x44, 0x5,
+                                                       0xe, 0x59, 0x4c, 0xa2, 0xf7, 0x6a, 0xa8, 0xf8,
+                                                       0x8a, 0x77, 0x1, 0xf7, 0x51, 0xcd, 0x15, 0x81,
+                                                       0x7c, 0x87, 0x79, 0x79, 0x1a, 0x5b, 0xa4, 0x6d,
+                                                       0xbc, 0xa7, 0xa8, 0x95, 0x97, 0xa5, 0x1e, 0xc0,
+                                                       0xa4, 0xba, 0xb1, 0xb5, 0xb3, 0x8, 0xb4, 0xb6,
+                                                       0xdb, 0xd2, 0xca, 0x1b, 0xa2, 0x9e, 0x82, 0x79,
+                                                       0x99, 0x1f, 0x8f, 0x9c, 0x9d, 0x8e, 0x5, 0xa3,
+                                                       0x7a, 0x72, 0x97, 0x6e, 0x1b, 0x4c, 0x46, 0x56,
+                                                       0x61, 0x5f, 0x1f, 0x5a, 0x58, 0xfb, 0x2, 0x28,
+                                                       0x40, 0x1b, 0x6e, 0x6d, 0xa1, 0xaa, 0x97, 0x8f,
+                                                       0x97, 0x90, 0x96, 0x1f, 0x84, 0x92, 0x99, 0x7d,
+                                                       0x95, 0x1b, 0x90, 0x8e, 0x8d, 0x8f, 0x8e, 0x1f,
+                                                       0xe8, 0xf7, 0x13, 0x5, 0x8f, 0x91, 0x8c, 0x98,
+                                                       0x92, 0x1a, 0x94, 0x89, 0x9f, 0x84, 0x91, 0x1e,
+                                                       0x81, 0x94, 0x77, 0x9b, 0x9a, 0x1a, 0xad, 0xc4,
+                                                       0xe0, 0x9f, 0xa7, 0x1e, 0xa5, 0x9e, 0xb7, 0xc8,
+                                                       0xb1, 0xac, 0xa5, 0x71, 0x95, 0x1b, 0x90, 0x8f,
+                                                       0x8f, 0x8f, 0x8e, 0x1f, 0xe7, 0xf7, 0x13, 0x5,
+                                                       0x8f, 0x90, 0x8b, 0x97, 0x91, 0x1a, 0x93, 0x8b,
+                                                       0x9d, 0x84, 0x91, 0x1e, 0xa0, 0x73, 0x54, 0x9b,
+                                                       0x6c, 0x1b, 0x7c, 0x7d, 0x88, 0x83, 0x7f, 0x1f,
+                                                       0x4a, 0x60, 0x32, 0xfb, 0x5, 0x5c, 0x4a, 0x59,
+                                                       0x46, 0x41, 0xfb, 0x0, 0x72, 0x39, 0x8, 0x88,
+                                                       0x80, 0x89, 0x7e, 0x7f, 0x1a, 0x65, 0x9d, 0x67,
+                                                       0xa2, 0x6e, 0x1e, 0xa8, 0xb3, 0x15, 0x72, 0x9d,
+                                                       0x74, 0xb1, 0xaa, 0x1a, 0xbb, 0xf7, 0x8, 0xf7,
+                                                       0x3f, 0xaa, 0xb6, 0x1e, 0xba, 0xcc, 0xd9, 0xf4,
+                                                       0xcc, 0xb8, 0x8, 0x92, 0x95, 0x97, 0x8d, 0x97,
+                                                       0x1b, 0xa4, 0xad, 0x80, 0x7c, 0x9f, 0x1f, 0x8e,
+                                                       0x88, 0x8f, 0x88, 0x86, 0x1a, 0x83, 0x4d, 0x3a,
+                                                       0x82, 0x7f, 0x1e, 0x88, 0x89, 0x87, 0x87, 0x87,
+                                                       0x84, 0x79, 0x9d, 0x79, 0x1b, 0x7b, 0x7e, 0x85,
+                                                       0x82, 0x7e, 0x1f, 0x54, 0x66, 0x37, 0xfb, 0x16,
+                                                       0x6e, 0x4c, 0x8, 0x87, 0x82, 0x7d, 0x6e, 0x81,
+                                                       0x7e, 0xb0, 0x73, 0x83, 0x1a, 0x81, 0x4a, 0x37,
+                                                       0x81, 0x7e, 0x1e, 0x88, 0x89, 0x88, 0x89, 0x87,
+                                                       0x1b, 0x87, 0x88, 0x8d, 0x8d, 0x88, 0x1f, 0xe,
+                                                       0x4c, 0x9a, 0x76, 0xf9, 0x55, 0x54, 0xa, 0xf9,
+                                                       0x56, 0x3, 0xf7, 0xad, 0xf7, 0x86, 0x15, 0x62,
+                                                       0xfb, 0x7d, 0x5, 0x7e, 0x89, 0x8c, 0x89, 0x8c,
+                                                       0x1b, 0x91, 0x92, 0x95, 0x8f, 0x8e, 0x1f, 0xf7,
+                                                       0x16, 0xf7, 0x4c, 0xf7, 0x1b, 0xfb, 0x53, 0x5,
+                                                       0x85, 0x90, 0x8c, 0x8a, 0x8d, 0x1b, 0x8f, 0x8e,
+                                                       0x8d, 0x93, 0x89, 0x1f, 0x5e, 0xf7, 0x82, 0xf7,
+                                                       0x7b, 0x5f, 0x5, 0x9d, 0x88, 0x8e, 0x8c, 0x8d,
+                                                       0x1a, 0x90, 0x7f, 0x93, 0x89, 0x8c, 0x1e, 0xfb,
+                                                       0x53, 0xf7, 0x1b, 0xf7, 0x51, 0xf7, 0x17, 0x5,
+                                                       0x94, 0x91, 0x92, 0x93, 0x8f, 0x1a, 0x90, 0x7c,
+                                                       0x8b, 0x81, 0x88, 0x1e, 0xfb, 0x77, 0x62, 0xb4,
+                                                       0xf7, 0x6e, 0x5, 0x9f, 0x8f, 0x8b, 0x8f, 0x89,
+                                                       0x1b, 0x81, 0x82, 0x7b, 0x8a, 0x8a, 0x1f, 0xfb,
+                                                       0x12, 0xfb, 0x49, 0xfb, 0x16, 0xf7, 0x4c, 0x5,
+                                                       0x8d, 0x8a, 0x84, 0x97, 0x87, 0x1b, 0x81, 0x91,
+                                                       0x7a, 0x87, 0x1f, 0xb4, 0xfb, 0x71, 0xfb, 0x74,
+                                                       0xb4, 0x5, 0x86, 0x8c, 0x7a, 0x90, 0x82, 0x1a,
+                                                       0x85, 0x97, 0x85, 0x8d, 0x89, 0x1e, 0xf7, 0x50,
+                                                       0xfb, 0x1a, 0xfb, 0x4f, 0xfb, 0x12, 0x5, 0x87,
+                                                       0x88, 0x80, 0x84, 0x87, 0x1a, 0x84, 0x9c, 0x8e,
+                                                       0x8f, 0x8c, 0x1e, 0xe, 0x44, 0x99, 0x76, 0xf9,
+                                                       0x56, 0x54, 0xa, 0xf9, 0x4f, 0x3, 0xae, 0xf7,
+                                                       0x58, 0x15, 0xf7, 0x6c, 0xa8, 0x70, 0xfb, 0x7c,
+                                                       0xf7, 0x32, 0xf7, 0x3d, 0xf7, 0x32, 0xfb, 0x3d,
+                                                       0x72, 0xf7, 0x7c, 0xf7, 0x6f, 0x6e, 0xfb, 0x3d,
+                                                       0xf7, 0x31, 0xf7, 0x39, 0xf7, 0x31, 0xfb, 0x6b,
+                                                       0x6e, 0xa4, 0xf7, 0x6e, 0xfb, 0x32, 0xfb, 0x3d,
+                                                       0xfb, 0x32, 0xf7, 0x3d, 0xa6, 0xfb, 0x6e, 0xfb,
+                                                       0x6c, 0xa8, 0xf7, 0x3c, 0xfb, 0x31, 0x5, 0xe,
+                                                       0x5c, 0x3a, 0xa, 0xdf, 0xf9, 0x7, 0x3, 0xdf,
+                                                       0xf7, 0x35, 0x15, 0xf7, 0x48, 0xbb, 0x5b, 0xfb,
+                                                       0x41, 0xf7, 0x18, 0xf7, 0x16, 0xc7, 0xfb, 0x48,
+                                                       0xb5, 0xf7, 0x41, 0xf7, 0x14, 0xfb, 0xf, 0x5b,
+                                                       0xf7, 0x3f, 0xf7, 0x49, 0x63, 0xfb, 0x14, 0xf7,
+                                                       0x18, 0xf7, 0x42, 0xb9, 0xfb, 0x41, 0xba, 0xf7,
+                                                       0x17, 0xf7, 0x10, 0xfb, 0x50, 0x62, 0xb9, 0xf7,
+                                                       0x47, 0xfb, 0x12, 0xfb, 0x14, 0x5b, 0xf7, 0x47,
+                                                       0x5a, 0xfb, 0x43, 0xfb, 0x15, 0xf7, 0x12, 0xb8,
+                                                       0xfb, 0x49, 0xfb, 0x4a, 0xba, 0xf7, 0x19, 0xfb,
+                                                       0x19, 0xfb, 0x4a, 0x56, 0xf7, 0x44, 0x5c, 0x5,
+                                                       0xe, 0x3b, 0x9c, 0x76, 0xa3, 0x76, 0xf7, 0xa4,
+                                                       0x7c, 0xa, 0xe6, 0x77, 0xa0, 0x77, 0xf7, 0x5f,
+                                                       0x77, 0x12, 0xf7, 0xcb, 0x7c, 0xa, 0x13, 0x6e,
+                                                       0xd8, 0xf7, 0x7, 0xf7, 0xb, 0x15, 0x99, 0x82,
+                                                       0xa0, 0x76, 0x94, 0x7d, 0xf7, 0x49, 0xf7, 0x63,
+                                                       0x18, 0x8c, 0x8a, 0xfb, 0xe, 0xfb, 0x8b, 0x9c,
+                                                       0x88, 0xa6, 0x81, 0x99, 0x80, 0x19, 0xe3, 0xf7,
+                                                       0x99, 0x5, 0x8d, 0x6, 0x13, 0xae, 0xd8, 0x79,
+                                                       0xfb, 0xa7, 0x9c, 0x8f, 0xa7, 0x8b, 0x9c, 0x87,
+                                                       0x19, 0x79, 0xf7, 0xa7, 0x5, 0x8c, 0x6, 0xe4,
+                                                       0xfb, 0x99, 0x99, 0x96, 0xa5, 0x95, 0x9c, 0x8e,
+                                                       0x19, 0xfb, 0xe, 0xf7, 0x8b, 0x8d, 0x8c, 0xf7,
+                                                       0x49, 0xfb, 0x63, 0x94, 0x99, 0xa0, 0xa0, 0x99,
+                                                       0x94, 0x19, 0xfb, 0x63, 0xf7, 0x49, 0x8c, 0x8c,
+                                                       0xf7, 0x8b, 0xfb, 0xe, 0x8e, 0x9c, 0x95, 0xa6,
+                                                       0x96, 0x99, 0x19, 0xfb, 0x99, 0xe3, 0x75, 0xa,
+                                                       0xf7, 0xa7, 0x79, 0x87, 0x9c, 0x8b, 0xa7, 0x8f,
+                                                       0x9c, 0x19, 0xfb, 0xa7, 0x79, 0x5, 0x8c, 0x7,
+                                                       0xf7, 0x99, 0xe4, 0x80, 0x99, 0x81, 0xa5, 0x88,
+                                                       0x9c, 0x19, 0xfb, 0x8b, 0xfb, 0xe, 0x8a, 0x8d,
+                                                       0xf7, 0x63, 0xf7, 0x49, 0x7d, 0x94, 0x76, 0xa0,
+                                                       0x82, 0x99, 0x19, 0xfb, 0x49, 0xfb, 0x63, 0x8a,
+                                                       0x8c, 0xf7, 0xe, 0xf7, 0x8b, 0x7a, 0x8e, 0x70,
+                                                       0x95, 0x7d, 0x96, 0x19, 0x33, 0xfb, 0x99, 0x5,
+                                                       0x89, 0x6, 0x9d, 0xf7, 0xa7, 0x7a, 0x87, 0x6f,
+                                                       0x8b, 0x7a, 0x8f, 0x19, 0x9d, 0xfb, 0xa7, 0x5,
+                                                       0x8a, 0x6, 0x32, 0xf7, 0x99, 0x5, 0x7d, 0x7e,
+                                                       0x71, 0x81, 0x79, 0x1b, 0xf7, 0xe, 0xfb, 0x8b,
+                                                       0x89, 0x8a, 0xfb, 0x49, 0xf7, 0x63, 0x82, 0x7d,
+                                                       0x76, 0x76, 0x7d, 0x82, 0x19, 0xf7, 0x63, 0xfb,
+                                                       0x49, 0x8a, 0x8a, 0x5, 0x13, 0x75, 0xe8, 0xfb,
+                                                       0x8b, 0xf7, 0xe, 0x88, 0x7a, 0x81, 0x70, 0x80,
+                                                       0x7d, 0x19, 0xf7, 0x99, 0x33, 0x80, 0xa, 0xfb,
+                                                       0xa7, 0x9d, 0x8f, 0x7a, 0x8b, 0x6f, 0x87, 0x7a,
+                                                       0x19, 0xf7, 0xa7, 0x9d, 0x5, 0x8a, 0x7, 0xfb,
+                                                       0x99, 0x32, 0x96, 0x7d, 0x95, 0x71, 0x8e, 0x7a,
+                                                       0x19, 0xf7, 0x8b, 0xf7, 0xe, 0x8c, 0x89, 0x5,
+                                                       0x8e, 0xb3, 0x15, 0xa9, 0xa4, 0xa4, 0xa9, 0xa9,
+                                                       0xa4, 0x72, 0x6d, 0x6d, 0x72, 0x72, 0x6d, 0x6d,
+                                                       0x72, 0xa4, 0xa9, 0x1e, 0xe, 0xfb, 0x18, 0xac,
+                                                       0x76, 0xf7, 0xc8, 0xa0, 0x89, 0xa0, 0xf7, 0xc8,
+                                                       0x77, 0x12, 0xf7, 0xe1, 0xa0, 0x89, 0xa0, 0x13,
+                                                       0xb8, 0xa4, 0xf7, 0x99, 0x15, 0x47, 0xf7, 0x8,
+                                                       0xaa, 0xaa, 0x99, 0x1e, 0xa3, 0x96, 0xa4, 0x99,
+                                                       0xa4, 0x99, 0xa4, 0x99, 0xa5, 0x99, 0xa0, 0x97,
+                                                       0x8, 0x8d, 0x8f, 0x8e, 0x8c, 0x8d, 0x1b, 0x8f,
+                                                       0x8d, 0x89, 0x87, 0x89, 0x8a, 0x88, 0x89, 0x87,
+                                                       0x1f, 0x7f, 0x74, 0x7c, 0x71, 0x7c, 0x70, 0x8,
+                                                       0x71, 0x5e, 0x6d, 0x5a, 0x57, 0x1a, 0x6e, 0x93,
+                                                       0x61, 0xad, 0xae, 0xa6, 0xbe, 0xa7, 0x92, 0x1e,
+                                                       0x94, 0xac, 0x8d, 0xb9, 0xb9, 0xa8, 0x8c, 0xa7,
+                                                       0xa4, 0x1a, 0x93, 0x8e, 0x90, 0x8f, 0x8e, 0x8f,
+                                                       0x88, 0x86, 0x8e, 0x1e, 0x99, 0x75, 0x9a, 0x71,
+                                                       0x9b, 0x70, 0xa2, 0x65, 0xa3, 0x64, 0xa1, 0x75,
+                                                       0xa4, 0x72, 0xc1, 0x6d, 0xa6, 0xa6, 0xa6, 0xa6,
+                                                       0x6d, 0xc1, 0x72, 0xa4, 0x73, 0xa3, 0x64, 0xa4,
+                                                       0x63, 0xa2, 0x72, 0x9a, 0x72, 0x9a, 0x76, 0x97,
+                                                       0x8, 0x86, 0x8e, 0x88, 0x8f, 0x8e, 0x1a, 0x8f,
+                                                       0x90, 0x8e, 0x93, 0x1e, 0x8c, 0xa5, 0xa9, 0x8b,
+                                                       0xaa, 0x1b, 0xb8, 0x8c, 0xb7, 0x8d, 0xaa, 0x93,
+                                                       0x8, 0xa9, 0x93, 0xbc, 0xa4, 0xaf, 0x1a, 0x13,
+                                                       0xd4, 0x99, 0x83, 0x95, 0x7f, 0x92, 0x1e, 0x67,
+                                                       0xa1, 0x57, 0x7e, 0x67, 0x7b, 0x73, 0x80, 0x70,
+                                                       0x7d, 0x71, 0x7c, 0x72, 0x7d, 0x72, 0x7d, 0x75,
+                                                       0x7f, 0x8, 0x89, 0x87, 0x88, 0x8a, 0x89, 0x1b,
+                                                       0x87, 0x89, 0x8d, 0x8f, 0x8d, 0x8c, 0x8e, 0x8d,
+                                                       0x8f, 0x1f, 0x97, 0xa2, 0x9a, 0xa5, 0x9a, 0xa6,
+                                                       0x9a, 0xa5, 0x99, 0xa6, 0x95, 0xa3, 0x8, 0xaa,
+                                                       0x99, 0xa4, 0xf7, 0x1, 0x4b, 0x1b, 0x66, 0x74,
+                                                       0x5a, 0x6d, 0x82, 0x1f, 0x82, 0x6a, 0x89, 0x5d,
+                                                       0x5d, 0x6e, 0x8a, 0x6f, 0x72, 0x1a, 0x83, 0x88,
+                                                       0x86, 0x87, 0x88, 0x87, 0x8e, 0x90, 0x88, 0x1e,
+                                                       0x7d, 0xa1, 0x7c, 0xa5, 0x7b, 0xa6, 0x74, 0xb1,
+                                                       0x73, 0xb2, 0x75, 0xa1, 0x72, 0xa4, 0x55, 0xa9,
+                                                       0x70, 0x70, 0x70, 0x70, 0xa9, 0x55, 0xa4, 0x72,
+                                                       0xa3, 0x73, 0xb2, 0x72, 0xb3, 0x74, 0xa4, 0x7c,
+                                                       0xa4, 0x7c, 0xa0, 0x7f, 0x8, 0x90, 0x88, 0x8e,
+                                                       0x87, 0x88, 0x1a, 0x87, 0x86, 0x88, 0x83, 0x1e,
+                                                       0x8a, 0x71, 0x6d, 0x8b, 0x6c, 0x1b, 0x5e, 0x8a,
+                                                       0x5f, 0x89, 0x6c, 0x83, 0x8, 0x13, 0xd8, 0x6c,
+                                                       0x83, 0x5b, 0x71, 0x68, 0x1a, 0xe, 0xfb, 0x17,
+                                                       0xae, 0x76, 0xf7, 0x64, 0xf7, 0x8, 0x63, 0xb3,
+                                                       0x94, 0xf7, 0xa, 0xf7, 0x63, 0x77, 0x12, 0xf7,
+                                                       0x80, 0xf7, 0xa, 0x9d, 0xf7, 0xc, 0x13, 0xde,
+                                                       0xa4, 0xf7, 0x9a, 0x15, 0x6b, 0xbe, 0x83, 0xa3,
+                                                       0x1e, 0x13, 0xbe, 0xda, 0xc2, 0xd7, 0xb6, 0x1b,
+                                                       0x9d, 0x9a, 0x7d, 0x79, 0x1f, 0x6e, 0x3f, 0x45,
+                                                       0x3c, 0x1a, 0x73, 0x92, 0x59, 0xac, 0xad, 0xa7,
+                                                       0xbd, 0xa7, 0x93, 0x1e, 0x91, 0x9f, 0x8d, 0xa0,
+                                                       0xa0, 0xa2, 0x88, 0xa0, 0xa2, 0x1a, 0xa2, 0x8d,
+                                                       0xa5, 0xaa, 0x97, 0x93, 0x86, 0x81, 0x92, 0x1e,
+                                                       0xa8, 0x61, 0x95, 0x61, 0xb3, 0x63, 0x8, 0x77,
+                                                       0x9f, 0xac, 0x79, 0xa7, 0x1b, 0xa1, 0x99, 0x97,
+                                                       0xa2, 0xa7, 0x77, 0xad, 0x78, 0x9e, 0x1f, 0x64,
+                                                       0xb2, 0x62, 0x96, 0x5f, 0xa7, 0x8, 0x81, 0x92,
+                                                       0x84, 0x94, 0x98, 0x1a, 0xa4, 0xa1, 0x91, 0xa0,
+                                                       0x1e, 0xa2, 0xa2, 0x89, 0xa2, 0x1b, 0xa2, 0xa2,
+                                                       0x8d, 0x91, 0xa1, 0x1f, 0xa7, 0x93, 0xbd, 0xa7,
+                                                       0xad, 0x1a, 0xac, 0x59, 0x94, 0x72, 0x1e, 0x3e,
+                                                       0x44, 0x3c, 0x6c, 0x1b, 0x7a, 0x7d, 0x9a, 0x9c,
+                                                       0x1f, 0xa9, 0xd9, 0xd6, 0xd6, 0x1a, 0xa3, 0x82,
+                                                       0xbd, 0x6b, 0x69, 0x6d, 0x59, 0x6f, 0x84, 0x1e,
+                                                       0x84, 0x71, 0x8a, 0x71, 0x70, 0x74, 0x8d, 0x74,
+                                                       0x75, 0x1a, 0x79, 0x81, 0x79, 0x77, 0x7e, 0x81,
+                                                       0x94, 0x95, 0x84, 0x1e, 0x85, 0x95, 0x85, 0x97,
+                                                       0x86, 0x96, 0x7a, 0xac, 0x79, 0xac, 0x71, 0xa5,
+                                                       0x8, 0x9e, 0x78, 0x6b, 0x9e, 0x6f, 0x1b, 0x74,
+                                                       0x7d, 0x7d, 0x74, 0x6f, 0x9e, 0x6b, 0x9e, 0x78,
+                                                       0x1f, 0xb0, 0x66, 0xb8, 0x7b, 0xb6, 0x71, 0x8,
+                                                       0x95, 0x85, 0x94, 0x81, 0x7e, 0x1a, 0x76, 0x74,
+                                                       0x81, 0x79, 0x1e, 0x72, 0x73, 0x8d, 0x72, 0x1b,
+                                                       0x75, 0x74, 0x8a, 0x85, 0x76, 0x1f, 0x6f, 0x83,
+                                                       0x57, 0x6e, 0x69, 0x1a, 0xf7, 0xa5, 0xda, 0x15,
+                                                       0xaa, 0xa4, 0xa4, 0xaa, 0xaa, 0xa4, 0x72, 0x6c,
+                                                       0x6c, 0x72, 0x72, 0x6c, 0x6c, 0x72, 0xa4, 0xaa,
+                                                       0x1e, 0xe, 0xfb, 0x31, 0x3f, 0xa, 0x12, 0xf7,
+                                                       0x9d, 0xf7, 0x2f, 0x2f, 0xa3, 0x13, 0xd0, 0xae,
+                                                       0xf7, 0x49, 0x15, 0xc2, 0x52, 0xd6, 0x96, 0xb2,
+                                                       0xc4, 0x8, 0x13, 0xe0, 0xae, 0xbb, 0xb0, 0xc1,
+                                                       0xbf, 0xa9, 0x8, 0x56, 0x7b, 0x5d, 0x7b, 0x63,
+                                                       0x1e, 0x73, 0x4d, 0x84, 0x76, 0x73, 0x1a, 0x5b,
+                                                       0xae, 0x6b, 0xb6, 0x7f, 0x1e, 0x13, 0xd0, 0xb7,
+                                                       0x97, 0xac, 0xac, 0xbe, 0x1a, 0x67, 0xf5, 0x7c,
+                                                       0xae, 0x79, 0xbc, 0x8c, 0xbf, 0x19, 0xbe, 0x6e,
+                                                       0xaf, 0x57, 0xad, 0x5d, 0xa7, 0x4a, 0xec, 0x83,
+                                                       0xbc, 0xc2, 0x8, 0xd3, 0x6d, 0xb1, 0x48, 0x94,
+                                                       0x1e, 0x20, 0x9a, 0x60, 0x98, 0x64, 0x9f, 0xc0,
+                                                       0xab, 0xc9, 0x92, 0xc7, 0x94, 0x8, 0xd5, 0x94,
+                                                       0xb0, 0xb0, 0xe1, 0x1a, 0x4a, 0xb4, 0x4b, 0x7b,
+                                                       0x5e, 0x53, 0x3b, 0x2b, 0x6f, 0x72, 0x7e, 0x86,
+                                                       0x89, 0xcb, 0x98, 0xa8, 0xa3, 0xc4, 0x8, 0x94,
+                                                       0xa0, 0xa2, 0xc4, 0xa2, 0x1a, 0xb5, 0x63, 0xaa,
+                                                       0x67, 0x97, 0x1e, 0x5f, 0x7f, 0x66, 0x6c, 0x5a,
+                                                       0x1a, 0x6c, 0x9d, 0x67, 0x96, 0x70, 0x1e, 0x9a,
+                                                       0x68, 0xa1, 0x53, 0x50, 0x1a, 0x5e, 0xa0, 0x67,
+                                                       0xbe, 0x6f, 0xb3, 0x61, 0xc7, 0x50, 0xaf, 0x38,
+                                                       0x59, 0x8, 0xfb, 0xc, 0xd0, 0x84, 0xcc, 0x81,
+                                                       0x1e, 0xbe, 0x84, 0xbf, 0x81, 0xba, 0x70, 0x67,
+                                                       0x75, 0x5e, 0x7f, 0x2a, 0x7d, 0x8, 0x45, 0x82,
+                                                       0x67, 0x79, 0x31, 0x1a, 0xe, 0xfb, 0x1e, 0x95,
+                                                       0xc3, 0x87, 0xb4, 0xef, 0xa7, 0x7c, 0xcc, 0x57,
+                                                       0xdb, 0xa0, 0x96, 0x89, 0x96, 0x91, 0x77, 0xaf,
+                                                       0xda, 0x57, 0xcd, 0x7c, 0xa6, 0xa5, 0x77, 0xea,
+                                                       0xb3, 0x87, 0xc3, 0x12, 0x90, 0xcc, 0xb0, 0xab,
+                                                       0xb2, 0xa4, 0xe6, 0xd1, 0x66, 0xb5, 0x65, 0xb5,
+                                                       0x68, 0xcf, 0xe8, 0xa2, 0xb1, 0xac, 0xb1, 0xcb,
+                                                       0x13, 0xa4, 0x9b, 0xa7, 0xf7, 0x8, 0x5b, 0xa,
+                                                       0x62, 0x86, 0x99, 0xfb, 0x12, 0x58, 0xa, 0x13,
+                                                       0x64, 0x9b, 0x8f, 0x59, 0xa, 0xad, 0x81, 0xae,
+                                                       0x7f, 0xab, 0x7f, 0xa, 0x13, 0x8c, 0x37, 0x97,
+                                                       0x43, 0xa, 0x71, 0xa, 0x19, 0x4e, 0xa, 0x13,
+                                                       0xa4, 0x9b, 0xc7, 0x57, 0xa, 0x69, 0x95, 0x68,
+                                                       0x3c, 0xa, 0xf7, 0xa9, 0xf7, 0xbf, 0x15, 0x8f,
+                                                       0x96, 0x8d, 0x97, 0x97, 0x1a, 0x9e, 0x86, 0x7b,
+                                                       0xa, 0x97, 0x1a, 0x13, 0x8c, 0x37, 0xc7, 0xa5,
+                                                       0xad, 0x9a, 0xa1, 0xb0, 0xb5, 0x6c, 0x64, 0x68,
+                                                       0x6a, 0x90, 0x75, 0x80, 0x1e, 0x75, 0x80, 0x78,
+                                                       0x74, 0x83, 0x74, 0x8, 0xcf, 0x30, 0x15, 0x92,
+                                                       0x7, 0xb8, 0x94, 0x9d, 0xa6, 0x98, 0xa1, 0x8,
+                                                       0x9b, 0x95, 0x93, 0x99, 0x9b, 0x1b, 0xae, 0xa2,
+                                                       0x61, 0x6c, 0x72, 0x7a, 0x60, 0x6d, 0x79, 0x7e,
+                                                       0xa2, 0x94, 0x7b, 0x1f, 0x13, 0xa1, 0x9b, 0xc7,
+                                                       0x95, 0x79, 0x76, 0x90, 0x77, 0x1b, 0x86, 0x86,
+                                                       0x8b, 0x8a, 0x86, 0x1f, 0x96, 0xe5, 0x15, 0x7b,
+                                                       0x67, 0x76, 0x5f, 0x62, 0x7e, 0x8, 0x13, 0x92,
+                                                       0x9b, 0xa7, 0x8a, 0x88, 0x87, 0x8a, 0x87, 0x1b,
+                                                       0x55, 0xa, 0x47, 0xa, 0x13, 0x52, 0x5b, 0x97,
+                                                       0x61, 0xa, 0xfb, 0x78, 0xf7, 0x23, 0x15, 0xa2,
+                                                       0x77, 0x6e, 0x99, 0x6d, 0x1b, 0x7e, 0x7f, 0x8b,
+                                                       0x8d, 0x81, 0x1f, 0x7e, 0x8e, 0x82, 0x94, 0xa2,
+                                                       0x1a, 0xb6, 0xb3, 0xac, 0xb4, 0x9e, 0xa4, 0x81,
+                                                       0x74, 0x1e, 0x7d, 0x83, 0x7e, 0x7c, 0x1a, 0x72,
+                                                       0x94, 0x70, 0x9b, 0x78, 0x1e, 0xf7, 0x1d, 0xfb,
+                                                       0x4b, 0x15, 0x91, 0x8f, 0x5, 0x74, 0x9f, 0xa8,
+                                                       0x7d, 0xa9, 0x1b, 0xa9, 0xa6, 0x8e, 0x63, 0x60,
+                                                       0x63, 0x6a, 0x62, 0x78, 0x72, 0x95, 0xa2, 0x1f,
+                                                       0x99, 0x93, 0x98, 0x9a, 0x1a, 0xa4, 0x82, 0xa6,
+                                                       0x7b, 0x9e, 0x1e, 0xfb, 0x71, 0xf7, 0x26, 0x15,
+                                                       0x8d, 0x9a, 0x9b, 0x8d, 0x9a, 0x1b, 0x13, 0xa1,
+                                                       0x9b, 0xa7, 0xa2, 0xc8, 0x7d, 0x6e, 0x1f, 0x13,
+                                                       0xa4, 0x9b, 0x97, 0x77, 0xa, 0x1e, 0x48, 0xa,
+                                                       0x9b, 0xaf, 0xa0, 0xb7, 0xb4, 0x98, 0x8, 0x8c,
+                                                       0x8e, 0x8f, 0x8c, 0x8f, 0x1b, 0x5d, 0xa, 0x97,
+                                                       0xdf, 0x15, 0x66, 0x84, 0x79, 0x78, 0x7e, 0x78,
+                                                       0x8, 0x75, 0x7c, 0x84, 0x76, 0x77, 0x1b, 0x68,
+                                                       0x74, 0xb6, 0xaa, 0xa4, 0x9c, 0xb5, 0xa9, 0x98,
+                                                       0x95, 0x7e, 0x7e, 0x9c, 0x1f, 0x80, 0x99, 0x9e,
+                                                       0x81, 0xaa, 0x1b, 0x91, 0x90, 0x8b, 0x8c, 0x91,
+                                                       0x1f, 0xd0, 0x2f, 0x15, 0x91, 0x88, 0x5, 0x13,
+                                                       0xa4, 0x9b, 0x8f, 0x87, 0x7f, 0x89, 0x7e, 0x7f,
+                                                       0x1a, 0x75, 0x92, 0x7c, 0x92, 0x7e, 0x1e, 0x93,
+                                                       0x7c, 0x94, 0x80, 0x80, 0x1a, 0x71, 0x69, 0x7c,
+                                                       0x75, 0x66, 0x61, 0xaa, 0xb2, 0xae, 0xac, 0x85,
+                                                       0xa1, 0x97, 0x1e, 0xa0, 0x96, 0x9f, 0xa2, 0x93,
+                                                       0xa2, 0x8, 0xe, 0x7e, 0xaa, 0x76, 0xf7, 0x6f,
+                                                       0xbf, 0xbc, 0x96, 0x89, 0x96, 0xbc, 0xbf, 0xbf,
+                                                       0x77, 0xf7, 0x4f, 0x77, 0x12, 0xf8, 0x1a, 0xb5,
+                                                       0x65, 0xb5, 0x83, 0xf7, 0x31, 0xfb, 0x12, 0x95,
+                                                       0x13, 0xef, 0x20, 0xf7, 0x47, 0x5b, 0xa, 0x8a,
+                                                       0x83, 0x8b, 0x83, 0x83, 0x1a, 0x65, 0x9a, 0x22,
+                                                       0xbe, 0xb7, 0xc1, 0xbe, 0xac, 0xa4, 0x1e, 0x53,
+                                                       0xa, 0x8f, 0x9c, 0x8d, 0x9e, 0x63, 0xa, 0xc2,
+                                                       0x75, 0xb7, 0x1b, 0xb6, 0x95, 0xaa, 0xb0, 0xad,
+                                                       0x81, 0xaf, 0x7f, 0xaa, 0x7f, 0xa, 0x5c, 0xa,
+                                                       0x77, 0x99, 0x77, 0x39, 0xa, 0x5, 0x13, 0xee,
+                                                       0x40, 0x71, 0xa, 0x8, 0xb3, 0x8f, 0x7f, 0xf7,
+                                                       0x13, 0x62, 0xa, 0x13, 0xde, 0xa0, 0x52, 0xa,
+                                                       0x87, 0x7a, 0x89, 0x78, 0x64, 0xa, 0x54, 0xa1,
+                                                       0x5f, 0x1b, 0x60, 0x81, 0x6c, 0x66, 0x69, 0x95,
+                                                       0x67, 0x97, 0x6c, 0x4a, 0xa, 0x9f, 0x7d, 0x9f,
+                                                       0x81, 0x8, 0x65, 0x7a, 0x3b, 0x45, 0xa, 0xf7,
+                                                       0xfe, 0xf7, 0xbb, 0x15, 0x7a, 0x65, 0x78, 0x63,
+                                                       0x61, 0x7c, 0x8, 0x8a, 0x87, 0x88, 0x8a, 0x87,
+                                                       0x1b, 0x13, 0xef, 0x20, 0x55, 0xa, 0x13, 0xee,
+                                                       0x40, 0x47, 0xa, 0x13, 0xde, 0xa0, 0x61, 0xa,
+                                                       0xfb, 0xc6, 0xf7, 0x2, 0x15, 0x8d, 0x9a, 0x9b,
+                                                       0x8d, 0x9a, 0x1b, 0x13, 0xef, 0x20, 0xa2, 0xc8,
+                                                       0x7d, 0x6e, 0x77, 0xa, 0x1f, 0x48, 0xa, 0x9c,
+                                                       0xb1, 0x9e, 0xb3, 0xb5, 0x9a, 0x8, 0x8c, 0x8f,
+                                                       0x8e, 0x8c, 0x8f, 0x1b, 0x13, 0xee, 0xa0, 0x5d,
+                                                       0xa, 0xe, 0x73, 0x95, 0xb3, 0x97, 0xa9, 0xf7,
+                                                       0xf, 0xaa, 0x7a, 0x9c, 0xc1, 0xdb, 0x75, 0x77,
+                                                       0xeb, 0x9c, 0x7a, 0xaa, 0xb1, 0x77, 0xf4, 0xa9,
+                                                       0x97, 0xb3, 0x12, 0xca, 0xb5, 0xc7, 0xa7, 0xb6,
+                                                       0xa2, 0xbf, 0xb0, 0x8f, 0x9c, 0x86, 0x9d, 0x7d,
+                                                       0xdb, 0x7d, 0x9d, 0x86, 0x9c, 0x8f, 0xb0, 0x66,
+                                                       0xf7, 0x4b, 0x2d, 0xa2, 0xb6, 0xa7, 0xc7, 0xb5,
+                                                       0x13, 0xda, 0xff, 0x14, 0x80, 0xf7, 0x42, 0x5b,
+                                                       0xa, 0x63, 0x86, 0x99, 0xfb, 0x13, 0x58, 0xa,
+                                                       0x59, 0xa, 0xae, 0x81, 0xad, 0x7f, 0xab, 0x7f,
+                                                       0xa, 0x43, 0xa, 0x5, 0x13, 0xd6, 0xff, 0x2b,
+                                                       0x80, 0x71, 0xa, 0x8, 0x4e, 0xa, 0x57, 0xa,
+                                                       0x68, 0x95, 0x69, 0x3c, 0xa, 0xf7, 0xa8, 0xf7,
+                                                       0xc1, 0x15, 0x8f, 0x96, 0x8d, 0x96, 0x97, 0x1a,
+                                                       0x9d, 0x87, 0x7b, 0xa, 0x96, 0x1a, 0xab, 0xbd,
+                                                       0xa5, 0xa7, 0xb1, 0x9e, 0x5e, 0x6a, 0x71, 0x81,
+                                                       0x84, 0x73, 0x86, 0x1e, 0x6b, 0x84, 0x6f, 0x6e,
+                                                       0x80, 0x6d, 0x8, 0xd3, 0x2f, 0x15, 0x8a, 0x92,
+                                                       0xad, 0x90, 0xa5, 0xa1, 0x9a, 0xa9, 0x19, 0x92,
+                                                       0x99, 0x90, 0x95, 0x9b, 0x8e, 0x8, 0x8c, 0x8e,
+                                                       0x8d, 0x8b, 0x8e, 0x1b, 0xab, 0xb8, 0x6c, 0x69,
+                                                       0x6e, 0x66, 0x5f, 0x6d, 0x7f, 0x82, 0x98, 0x97,
+                                                       0x7c, 0x1f, 0x97, 0x7d, 0x78, 0x96, 0x6a, 0x1b,
+                                                       0x85, 0x85, 0x8a, 0x8a, 0x85, 0x1f, 0xfb, 0x55,
+                                                       0xd3, 0x15, 0x13, 0xe9, 0xff, 0x2b, 0x80, 0xa3,
+                                                       0x78, 0x6c, 0x98, 0x6c, 0x85, 0x86, 0x8b, 0x85,
+                                                       0x1b, 0x6b, 0x83, 0xa7, 0xa6, 0xb0, 0x9b, 0xaa,
+                                                       0xb4, 0xa2, 0xb9, 0x7f, 0x6e, 0x1f, 0x7c, 0x83,
+                                                       0x7c, 0x7b, 0x1a, 0x73, 0x94, 0x71, 0x9b, 0x78,
+                                                       0x1e, 0xfb, 0x13, 0xfb, 0x90, 0x15, 0xaa, 0xca,
+                                                       0xa8, 0xc1, 0xcf, 0xaa, 0x8a, 0x8d, 0x18, 0x43,
+                                                       0x94, 0x5d, 0xb6, 0x5b, 0xbd, 0x8, 0x8c, 0x9d,
+                                                       0x9e, 0x8c, 0x9d, 0x1b, 0xbe, 0xb7, 0x82, 0x6d,
+                                                       0xb5, 0x1f, 0x8c, 0x8d, 0x5, 0x80, 0xa4, 0x87,
+                                                       0xa7, 0xa7, 0x1a, 0xb2, 0x95, 0xb0, 0x96, 0xb1,
+                                                       0x1e, 0xad, 0x58, 0xaa, 0x5a, 0x4b, 0x1a, 0x84,
+                                                       0x8b, 0x84, 0x8a, 0x84, 0x1e, 0x8d, 0x6, 0xb7,
+                                                       0xc5, 0xc8, 0x9e, 0xce, 0x9b, 0x6c, 0x4c, 0x6e,
+                                                       0x55, 0x47, 0x6c, 0x8c, 0x89, 0x18, 0xd3, 0x82,
+                                                       0xb9, 0x60, 0xbb, 0x59, 0x8, 0x8a, 0x79, 0x78,
+                                                       0x8a, 0x79, 0x1b, 0x58, 0x5f, 0x94, 0xa9, 0x61,
+                                                       0x1f, 0x8a, 0x89, 0x5, 0x96, 0x72, 0x8f, 0x6f,
+                                                       0x6f, 0x1a, 0x13, 0xea, 0xfe, 0x9b, 0x80, 0x64,
+                                                       0x81, 0x66, 0x80, 0x65, 0x1e, 0x69, 0xbe, 0x6c,
+                                                       0xbc, 0xcb, 0x1a, 0x92, 0x8b, 0x92, 0x8c, 0x92,
+                                                       0x1e, 0x89, 0x6, 0x5f, 0x51, 0x4e, 0x78, 0x48,
+                                                       0x7b, 0x8, 0xf7, 0xa3, 0xcf, 0x15, 0x90, 0x8f,
+                                                       0x5, 0x73, 0x9e, 0xaa, 0x7e, 0xaa, 0x91, 0x90,
+                                                       0x8b, 0x91, 0x1b, 0xab, 0x93, 0x6f, 0x70, 0x66,
+                                                       0x7b, 0x6c, 0x62, 0x74, 0x5d, 0x97, 0xa8, 0x1f,
+                                                       0x9a, 0x93, 0x9a, 0x9b, 0x1a, 0xa3, 0x82, 0xa5,
+                                                       0x7b, 0x9e, 0x1e, 0xfb, 0x4f, 0xd0, 0x15, 0x69,
+                                                       0x86, 0x71, 0x75, 0x7c, 0x6d, 0x84, 0x7d, 0x86,
+                                                       0x81, 0x7b, 0x88, 0x8, 0x6a, 0x80, 0x57, 0xb6,
+                                                       0xab, 0x1a, 0xa8, 0xb0, 0xb7, 0xa9, 0x94, 0x92,
+                                                       0x84, 0x82, 0x94, 0x1e, 0x7d, 0x9a, 0xa0, 0x79,
+                                                       0xb4, 0x1b, 0x91, 0x91, 0x8c, 0x8c, 0x91, 0x1f,
+                                                       0xd3, 0x2f, 0x15, 0x13, 0xda, 0xfe, 0xab, 0x80,
+                                                       0x91, 0x88, 0x5, 0x87, 0x80, 0x89, 0x80, 0x7f,
+                                                       0x1a, 0x75, 0x92, 0x7b, 0x92, 0x7d, 0x1e, 0x93,
+                                                       0x7c, 0x93, 0x80, 0x82, 0x1a, 0x6b, 0x59, 0x71,
+                                                       0x6f, 0x65, 0x78, 0xb8, 0xac, 0xa5, 0x95, 0x92,
+                                                       0xa3, 0x90, 0x1e, 0xab, 0x92, 0xa7, 0xa8, 0x96,
+                                                       0xa9, 0x8, 0x13, 0xda, 0xfe, 0x4b, 0x80, 0x8f,
+                                                       0xf7, 0x0, 0x15, 0x75, 0x9d, 0x79, 0xa1, 0xa1,
+                                                       0x9d, 0x9d, 0xa1, 0xa1, 0x79, 0x9d, 0x75, 0x75,
+                                                       0x79, 0x79, 0x75, 0x1e, 0xe, 0xfb, 0xed, 0xa0,
+                                                       0x76, 0xf8, 0x36, 0xea, 0xf7, 0x47, 0x77, 0x1,
+                                                       0xf7, 0x5c, 0xeb, 0x3, 0xf7, 0x5c, 0x16, 0xeb,
+                                                       0xf8, 0x36, 0xf7, 0x38, 0xea, 0xfb, 0x38, 0xf7,
+                                                       0x47, 0x2b, 0xfb, 0x47, 0xfb, 0x39, 0x2c, 0xf7,
+                                                       0x39, 0x6, 0xe, 0x59, 0x83, 0x56, 0xa, 0x8d,
+                                                       0x77, 0xb4, 0x5e, 0xa, 0x12, 0xb9, 0x56, 0xa,
+                                                       0xa2, 0x5e, 0xa, 0x13, 0xb2, 0x9a, 0x96, 0x96,
+                                                       0xa0, 0xb9, 0xf8, 0x19, 0x15, 0x57, 0xb2, 0x70,
+                                                       0xbb, 0xa3, 0xa3, 0x92, 0x90, 0xa2, 0x1e, 0x90,
+                                                       0xa6, 0xa7, 0x8f, 0xa6, 0x1b, 0x92, 0xa1, 0x8b,
+                                                       0x81, 0x1f, 0x13, 0x74, 0x9a, 0x95, 0xa, 0xa0,
+                                                       0x84, 0x7a, 0x82, 0x85, 0x89, 0x1e, 0x74, 0x81,
+                                                       0x73, 0x83, 0x72, 0x84, 0x8, 0x56, 0x7d, 0x3f,
+                                                       0x80, 0x43, 0x1a, 0x61, 0xaf, 0x69, 0xb5, 0xbf,
+                                                       0xa5, 0xbe, 0xb0, 0xa4, 0x1e, 0x98, 0x9f, 0x9a,
+                                                       0x9d, 0x9b, 0x9d, 0x8, 0x92, 0x91, 0x99, 0x9b,
+                                                       0x95, 0x1b, 0x13, 0xb4, 0x9a, 0x96, 0x56, 0x60,
+                                                       0x8f, 0x8f, 0x88, 0x86, 0x85, 0x87, 0x81, 0x89,
+                                                       0x85, 0x1f, 0x82, 0x73, 0x80, 0x74, 0x7e, 0x75,
+                                                       0x8, 0x78, 0x6a, 0x71, 0x6a, 0x63, 0x1a, 0x61,
+                                                       0xac, 0x6a, 0xb5, 0xbf, 0xa6, 0xb2, 0xbb, 0xa3,
+                                                       0x84, 0xa3, 0x86, 0xa2, 0x1e, 0x86, 0xa6, 0x87,
+                                                       0xa7, 0xa6, 0x1a, 0x13, 0xb2, 0x9a, 0x96, 0x56,
+                                                       0x88, 0x92, 0x8b, 0xa1, 0x95, 0x1e, 0x13, 0xa8,
+                                                       0x2a, 0x96, 0x56, 0xa0, 0x92, 0x94, 0x7a, 0x85,
+                                                       0x8d, 0x1f, 0x95, 0x74, 0x93, 0x73, 0x92, 0x72,
+                                                       0x8, 0x65, 0xa, 0x56, 0x99, 0x96, 0x3f, 0xd3,
+                                                       0x1b, 0x70, 0xa, 0xb5, 0xad, 0xaf, 0xb5, 0xbf,
+                                                       0x58, 0xa5, 0x66, 0xa4, 0x1f, 0x77, 0x98, 0x79,
+                                                       0x9a, 0x79, 0x9b, 0x8, 0x13, 0xb2, 0x9a, 0x96,
+                                                       0x56, 0x90, 0x86, 0x90, 0x79, 0x9b, 0x93, 0x1a,
+                                                       0x13, 0xb2, 0x99, 0x96, 0x56, 0xa0, 0x8f, 0x8f,
+                                                       0x90, 0x8f, 0x91, 0x95, 0x87, 0x89, 0x91, 0x1e,
+                                                       0xa3, 0x82, 0xa2, 0x80, 0xa1, 0x7e, 0x8, 0x78,
+                                                       0xac, 0xac, 0x71, 0xb3, 0x1b, 0xb5, 0xac, 0xac,
+                                                       0xb5, 0xbf, 0x64, 0xa6, 0x5b, 0x1f, 0x70, 0xa,
+                                                       0x73, 0x73, 0x84, 0x86, 0x74, 0x1f, 0x86, 0x70,
+                                                       0x6f, 0x87, 0x70, 0x1b, 0x13, 0xb2, 0x9a, 0x36,
+                                                       0x56, 0xa0, 0x84, 0x75, 0x8b, 0x95, 0x1f, 0x13,
+                                                       0xb2, 0x9a, 0x96, 0x60, 0xa0, 0x92, 0x9c, 0x94,
+                                                       0x91, 0x8d, 0x1e, 0xa2, 0x95, 0xa3, 0x93, 0xa4,
+                                                       0x92, 0x8, 0xc0, 0x99, 0xd7, 0x96, 0xd3, 0x1a,
+                                                       0x6f, 0xa, 0xb5, 0x67, 0xad, 0x61, 0x57, 0x71,
+                                                       0x58, 0x66, 0x72, 0x1e, 0x7e, 0x77, 0x7c, 0x79,
+                                                       0x7b, 0x79, 0x8, 0x13, 0xb2, 0x9a, 0x56, 0x56,
+                                                       0xa0, 0x84, 0x85, 0x7d, 0x7b, 0x81, 0x1b, 0x87,
+                                                       0x87, 0x8e, 0x90, 0x91, 0x8f, 0x95, 0x8d, 0x91,
+                                                       0x1f, 0x94, 0xa3, 0x96, 0xa2, 0x98, 0xa1, 0x8,
+                                                       0x9e, 0xac, 0xa5, 0xac, 0xb3, 0x1a, 0xb5, 0x6a,
+                                                       0xac, 0x61, 0x57, 0x70, 0x64, 0x5b, 0x1e, 0x6f,
+                                                       0xa, 0x73, 0x92, 0x73, 0x90, 0x74, 0x1e, 0x90,
+                                                       0x70, 0x8f, 0x6f, 0x70, 0x1a, 0x84, 0x8b, 0x75,
+                                                       0x81, 0x1e, 0x13, 0xb3, 0x2, 0x8e, 0x96, 0xa0,
+                                                       0x84, 0x82, 0x9c, 0x91, 0x89, 0x1f, 0x81, 0xa2,
+                                                       0x83, 0xa3, 0x84, 0xa4, 0x8, 0xc0, 0x7d, 0x80,
+                                                       0xd7, 0x43, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x57,
+                                                       0xbe, 0x71, 0xb0, 0x72, 0x1f, 0x9f, 0x7e, 0x9d,
+                                                       0x7c, 0x9d, 0x7b, 0x8, 0x91, 0x85, 0x9c, 0x7c,
+                                                       0x82, 0x1a, 0x86, 0x87, 0x88, 0x87, 0x85, 0x81,
+                                                       0x8f, 0x8d, 0x85, 0x1e, 0x73, 0x94, 0x74, 0x96,
+                                                       0x75, 0x98, 0x8, 0x9e, 0x6a, 0x6a, 0xa5, 0x63,
+                                                       0x1b, 0x61, 0x6a, 0x6a, 0x61, 0x1f, 0xf8, 0x2c,
+                                                       0x8c, 0x15, 0xa3, 0xa0, 0xa2, 0xa0, 0x9e, 0xa4,
+                                                       0x8, 0x13, 0xb2, 0x99, 0x96, 0x56, 0xa0, 0xa4,
+                                                       0x9e, 0xa4, 0xb2, 0xaf, 0x1b, 0x13, 0xb2, 0x9a,
+                                                       0x96, 0x56, 0x90, 0x9e, 0x9c, 0x7a, 0x78, 0x65,
+                                                       0x51, 0x7a, 0x6e, 0x81, 0x1f, 0x6c, 0x81, 0x6e,
+                                                       0x7d, 0x6f, 0x7c, 0x8, 0x4f, 0xb0, 0x15, 0x8d,
+                                                       0xaa, 0x8c, 0xab, 0x87, 0xaa, 0x8, 0x89, 0x9b,
+                                                       0x88, 0x9c, 0x9b, 0x1a, 0x13, 0xb2, 0x9a, 0x36,
+                                                       0x56, 0xa0, 0xa5, 0x94, 0xaf, 0xab, 0x1e, 0x70,
+                                                       0xa, 0xa4, 0x97, 0x7b, 0x73, 0x6d, 0x7e, 0x76,
+                                                       0x7e, 0x71, 0x1f, 0x7d, 0x6e, 0x7f, 0x6d, 0x82,
+                                                       0x6c, 0x8, 0xc5, 0x2d, 0x15, 0x8d, 0x96, 0xaa,
+                                                       0x89, 0xab, 0x8a, 0xaa, 0x8f, 0x19, 0x8d, 0x9b,
+                                                       0x9c, 0x8e, 0x9b, 0x1b, 0x13, 0xb4, 0x9a, 0x96,
+                                                       0x56, 0x88, 0xa5, 0xaf, 0x82, 0x6b, 0x72, 0x7b,
+                                                       0x7f, 0x73, 0x6d, 0x76, 0x98, 0x98, 0x71, 0x1f,
+                                                       0x6e, 0x99, 0x6d, 0x97, 0x6c, 0x94, 0x8, 0xfb,
+                                                       0x12, 0xd9, 0x15, 0x76, 0xa3, 0x76, 0xa2, 0x72,
+                                                       0x9e, 0x8, 0x72, 0x9e, 0x64, 0xa4, 0xaf, 0x1a,
+                                                       0x13, 0xb2, 0x9a, 0x56, 0x56, 0xa0, 0x9e, 0x9c,
+                                                       0x9c, 0x9e, 0xb1, 0x9c, 0x51, 0x6e, 0x95, 0x1e,
+                                                       0x95, 0x6c, 0x99, 0x6e, 0x9a, 0x6f, 0x8, 0x13,
+                                                       0xb3, 0x2, 0x96, 0x56, 0xa0, 0x89, 0x2a, 0x15,
+                                                       0x8e, 0xa0, 0x5, 0x65, 0xa, 0x7f, 0x9d, 0x9c,
+                                                       0x98, 0x5, 0x13, 0xb2, 0x9a, 0x96, 0x60, 0xa0,
+                                                       0x90, 0xa0, 0xa0, 0x88, 0x9d, 0x97, 0x98, 0x7a,
+                                                       0x5, 0x13, 0xa8, 0x2a, 0x96, 0x56, 0xa0, 0xa0,
+                                                       0x86, 0x5, 0x65, 0xa, 0x88, 0x76, 0x97, 0x79,
+                                                       0x7a, 0x7e, 0x5, 0x13, 0xb2, 0x9a, 0x95, 0xa,
+                                                       0xa0, 0x86, 0x76, 0x76, 0x8e, 0x79, 0x7f, 0x7e,
+                                                       0x9c, 0x5, 0x13, 0xb3, 0x2, 0x96, 0x56, 0xa0,
+                                                       0xca, 0x6b, 0x15, 0x94, 0x92, 0xa0, 0x73, 0xa0,
+                                                       0x74, 0xa4, 0x78, 0x19, 0x13, 0x72, 0x9a, 0x96,
+                                                       0x56, 0x60, 0xa4, 0x78, 0xb2, 0x72, 0x67, 0x1a,
+                                                       0x78, 0x7a, 0x7a, 0x78, 0x65, 0x7a, 0xc5, 0xa8,
+                                                       0x81, 0x1e, 0x81, 0xaa, 0x7d, 0xa8, 0x7c, 0xa7,
+                                                       0x8, 0xfb, 0xb, 0xd5, 0x15, 0x65, 0xa, 0x8c,
+                                                       0x7b, 0x7b, 0x8c, 0x7b, 0x1b, 0x7c, 0x7b, 0x8a,
+                                                       0x89, 0x7c, 0x1f, 0x89, 0x7b, 0x7a, 0x88, 0x7b,
+                                                       0x1b, 0x71, 0x67, 0x94, 0xab, 0x1f, 0x6f, 0xa,
+                                                       0xa4, 0x9b, 0x97, 0xa3, 0xa9, 0xa0, 0x7e, 0x7e,
+                                                       0xa5, 0x1e, 0xa8, 0x7d, 0xa9, 0x7f, 0xaa, 0x82,
+                                                       0x8, 0xc5, 0x2d, 0x15, 0x96, 0x89, 0x89, 0x6c,
+                                                       0x8a, 0x6b, 0x8f, 0x6c, 0x19, 0x8d, 0x7b, 0x8e,
+                                                       0x7a, 0x7b, 0x1a, 0x13, 0xb2, 0x9a, 0x8e, 0x96,
+                                                       0xa0, 0x71, 0x82, 0x67, 0x6b, 0x72, 0x7f, 0x9b,
+                                                       0xa3, 0xa9, 0x98, 0xa0, 0x98, 0xa5, 0x1e, 0x99,
+                                                       0xa8, 0x97, 0xa9, 0x94, 0xaa, 0x8, 0x5a, 0xae,
+                                                       0x15, 0x92, 0x82, 0x73, 0x76, 0x74, 0x76, 0x78,
+                                                       0x72, 0x19, 0x72, 0x78, 0x72, 0x64, 0x67, 0x1b,
+                                                       0x78, 0x7a, 0x9c, 0x9e, 0xb1, 0xc5, 0x9c, 0xa8,
+                                                       0x95, 0x1f, 0xaa, 0x95, 0xa8, 0x99, 0xa7, 0x9a,
+                                                       0x8, 0xe, 0x59, 0x94, 0x76, 0xa9, 0x76, 0xf7,
+                                                       0x6d, 0x9e, 0xf7, 0x69, 0x9e, 0xf7, 0x7a, 0x77,
+                                                       0x12, 0xf7, 0xa3, 0x9b, 0xf7, 0x6b, 0x9c, 0x13,
+                                                       0xbe, 0xf7, 0x2c, 0xdf, 0x15, 0xf7, 0x55, 0xf7,
+                                                       0x16, 0xb8, 0xfb, 0x76, 0x5, 0x13, 0x7e, 0x9c,
+                                                       0x94, 0x5, 0x87, 0xb9, 0xf7, 0x6e, 0x8b, 0x1f,
+                                                       0xf7, 0x50, 0xfb, 0x11, 0x98, 0x91, 0xfb, 0x17,
+                                                       0xf7, 0x54, 0xf7, 0x75, 0xb9, 0x91, 0x98, 0xfb,
+                                                       0x7b, 0xb7, 0xf7, 0x11, 0xf7, 0x4f, 0x86, 0x9c,
+                                                       0xfb, 0x56, 0xfb, 0x16, 0x5d, 0xf7, 0x7a, 0x7e,
+                                                       0x85, 0x5e, 0xfb, 0x75, 0xfb, 0x4e, 0xf7, 0x10,
+                                                       0x7c, 0x85, 0xf7, 0x17, 0xfb, 0x54, 0xfb, 0x71,
+                                                       0x5f, 0x80, 0x7d, 0xf7, 0x7c, 0x5e, 0xfb, 0x10,
+                                                       0xfb, 0x4b, 0x5, 0xf7, 0x20, 0xf7, 0x80, 0x15,
+                                                       0xc6, 0xbc, 0xba, 0xc6, 0xc6, 0xbb, 0x5c, 0x50,
+                                                       0x50, 0x5a, 0x5b, 0x50, 0x50, 0x5b, 0xbb, 0xc6,
+                                                       0x1e, 0xe, 0xfb, 0x18, 0x97, 0xc3, 0x92, 0xd6,
+                                                       0xae, 0xac, 0x6a, 0xe6, 0x77, 0x9f, 0x97, 0xc1,
+                                                       0x64, 0x9f, 0x9a, 0xc1, 0x68, 0x9f, 0xa6, 0x9f,
+                                                       0x77, 0xe6, 0x6a, 0xac, 0x94, 0x77, 0xb0, 0x77,
+                                                       0xa8, 0xd6, 0x92, 0xc3, 0x12, 0xa0, 0xd1, 0x8d,
+                                                       0xb4, 0xc8, 0xa1, 0x85, 0xcd, 0x73, 0x9f, 0xa2,
+                                                       0xb5, 0x65, 0xa5, 0x80, 0xaa, 0x99, 0xaa, 0x74,
+                                                       0xb5, 0x6d, 0xa5, 0xa2, 0xcd, 0x4d, 0x9f, 0xaf,
+                                                       0xa1, 0xc8, 0xb4, 0x8d, 0xd1, 0x13, 0xec, 0xd7,
+                                                       0xec, 0x33, 0xf8, 0x8, 0xf8, 0x30, 0x15, 0x8e,
+                                                       0x8f, 0x92, 0x8d, 0x8c, 0x1f, 0x95, 0x9c, 0x98,
+                                                       0x9a, 0x9a, 0x98, 0x98, 0x97, 0x9a, 0x94, 0x9b,
+                                                       0x92, 0x8, 0x8d, 0x8c, 0x90, 0x8e, 0x8e, 0x1a,
+                                                       0x13, 0xea, 0xcb, 0xea, 0x53, 0x8e, 0x85, 0x8b,
+                                                       0x89, 0x63, 0x56, 0x67, 0x60, 0x89, 0x8b, 0x80,
+                                                       0x8f, 0x1e, 0xc0, 0x58, 0x15, 0x87, 0x95, 0x8b,
+                                                       0x8d, 0x9f, 0x9e, 0x87, 0x85, 0x9e, 0x1e, 0x9c,
+                                                       0x85, 0x9a, 0x83, 0x99, 0x81, 0x8, 0x89, 0x8d,
+                                                       0x8e, 0x8a, 0x8e, 0x1b, 0x8d, 0x8c, 0x8b, 0x8d,
+                                                       0x8e, 0x89, 0x8f, 0x89, 0x8d, 0x1f, 0xa5, 0x7a,
+                                                       0x68, 0x9f, 0x6c, 0x1b, 0x83, 0x6b, 0x85, 0x81,
+                                                       0x1f, 0xfb, 0x13, 0xa9, 0x15, 0x8d, 0x8b, 0x8c,
+                                                       0x8d, 0x1f, 0x13, 0xec, 0xd7, 0xec, 0x93, 0x8e,
+                                                       0x89, 0x8f, 0x89, 0x8e, 0x1e, 0x81, 0x9c, 0x85,
+                                                       0x9f, 0x87, 0x9e, 0x8, 0x89, 0x96, 0x8a, 0x96,
+                                                       0x97, 0x92, 0x8c, 0x91, 0x92, 0x1a, 0x8d, 0x8b,
+                                                       0x90, 0x88, 0x80, 0x84, 0x5e, 0x82, 0x70, 0x95,
+                                                       0x6e, 0xa3, 0x7c, 0x1e, 0x89, 0x8e, 0x90, 0x88,
+                                                       0x8e, 0x1b, 0x13, 0xec, 0xd7, 0xd4, 0x33, 0xfb,
+                                                       0xa9, 0xfb, 0x4, 0x15, 0x4c, 0xcf, 0x6c, 0xc1,
+                                                       0xcb, 0xc2, 0xb0, 0xb7, 0xb6, 0x1e, 0x93, 0x93,
+                                                       0x95, 0x92, 0x97, 0x1b, 0x9b, 0x94, 0x7e, 0x7c,
+                                                       0x1f, 0x13, 0xeb, 0x57, 0xec, 0x8f, 0x73, 0x80,
+                                                       0x6c, 0x7c, 0x79, 0x1e, 0x78, 0x74, 0x72, 0x7e,
+                                                       0x6e, 0x87, 0x8, 0x69, 0x86, 0x7b, 0x71, 0x6a,
+                                                       0x1a, 0x63, 0xa9, 0x73, 0xb2, 0xca, 0xbc, 0xcc,
+                                                       0xc4, 0x95, 0x1e, 0x8e, 0x9a, 0x8c, 0x9a, 0x9b,
+                                                       0x1a, 0xa7, 0x85, 0xa5, 0x84, 0xa6, 0x1e, 0x8a,
+                                                       0x90, 0x8a, 0x91, 0x91, 0x1a, 0x9b, 0x94, 0x98,
+                                                       0x9c, 0x1e, 0x13, 0xeb, 0x27, 0xe9, 0x53, 0x91,
+                                                       0x8f, 0x8a, 0x88, 0x90, 0x1f, 0xac, 0x76, 0xa3,
+                                                       0x66, 0x63, 0x6f, 0x7d, 0x78, 0x77, 0x1a, 0x6a,
+                                                       0xb0, 0x6d, 0xab, 0xb7, 0xa4, 0xbb, 0xb2, 0xb7,
+                                                       0x74, 0xb8, 0x69, 0xa7, 0x1e, 0x67, 0xaa, 0x69,
+                                                       0x98, 0x5e, 0x97, 0x8, 0x7d, 0x8f, 0x7a, 0x94,
+                                                       0x9c, 0x1a, 0xa9, 0xbe, 0x94, 0xa2, 0x1e, 0xda,
+                                                       0x8e, 0x49, 0xbb, 0x1b, 0xae, 0xaf, 0xa5, 0xb0,
+                                                       0xca, 0x47, 0xaa, 0x55, 0x4b, 0x54, 0x66, 0x5f,
+                                                       0x60, 0x1f, 0x13, 0xec, 0xd7, 0xea, 0x93, 0x83,
+                                                       0x83, 0x81, 0x84, 0x7f, 0x1b, 0x7b, 0x82, 0x98,
+                                                       0x9a, 0x1f, 0x13, 0xec, 0xd7, 0xe9, 0x93, 0xa3,
+                                                       0x96, 0xaa, 0x9a, 0x9d, 0x1e, 0x9e, 0xa2, 0xa4,
+                                                       0x98, 0xa8, 0x8f, 0x8, 0xad, 0x90, 0x9b, 0xa5,
+                                                       0xac, 0x1a, 0xb3, 0x6d, 0xa3, 0x64, 0x4c, 0x5a,
+                                                       0x4a, 0x52, 0x81, 0x1e, 0x88, 0x7c, 0x8a, 0x7c,
+                                                       0x7b, 0x1a, 0x6f, 0x91, 0x71, 0x92, 0x70, 0x1e,
+                                                       0x8c, 0x86, 0x8c, 0x85, 0x85, 0x1a, 0x7b, 0x82,
+                                                       0x7e, 0x7a, 0x1e, 0x13, 0xd4, 0xd7, 0xd4, 0x93,
+                                                       0x85, 0x87, 0x8c, 0x8e, 0x86, 0x1f, 0x6a, 0xa0,
+                                                       0x73, 0xb0, 0xb3, 0xa7, 0x99, 0x9e, 0x9f, 0x1a,
+                                                       0xac, 0x66, 0xa9, 0x6b, 0x5f, 0x72, 0x5b, 0x64,
+                                                       0x5f, 0xa2, 0x5e, 0xad, 0x6f, 0x1e, 0xaf, 0x6c,
+                                                       0xad, 0x7e, 0xb8, 0x7f, 0x8, 0x99, 0x87, 0x9c,
+                                                       0x82, 0x7a, 0x1a, 0x6d, 0x58, 0x82, 0x74, 0x56,
+                                                       0x78, 0xa9, 0x9f, 0x76, 0x1e, 0x94, 0x81, 0x80,
+                                                       0x92, 0x7b, 0x1b, 0x68, 0x67, 0x71, 0x66, 0x1f,
+                                                       0x13, 0xec, 0xd7, 0xec, 0x33, 0xf8, 0x15, 0x92,
+                                                       0x15, 0x13, 0xec, 0xd7, 0xec, 0x4f, 0x88, 0x8d,
+                                                       0x87, 0x8d, 0x88, 0x1e, 0x95, 0x7a, 0x91, 0x77,
+                                                       0x8f, 0x78, 0x8, 0x8d, 0x80, 0x8c, 0x80, 0x7f,
+                                                       0x84, 0x8a, 0x85, 0x84, 0x1a, 0x89, 0x8b, 0x86,
+                                                       0x8e, 0x96, 0x92, 0xb8, 0x94, 0xa6, 0x81, 0xa8,
+                                                       0x73, 0x9a, 0x1e, 0x8d, 0x88, 0x86, 0x8e, 0x88,
+                                                       0x1b, 0x13, 0xea, 0xd7, 0xd4, 0x33, 0x89, 0x8b,
+                                                       0x8a, 0x89, 0x1f, 0xfb, 0x8c, 0xca, 0x15, 0x71,
+                                                       0x9c, 0xae, 0x77, 0xaa, 0x1b, 0x93, 0xab, 0x91,
+                                                       0x95, 0x8f, 0x81, 0x8b, 0x89, 0x77, 0x78, 0x8f,
+                                                       0x91, 0x78, 0x1f, 0x7a, 0x91, 0x7c, 0x93, 0x7d,
+                                                       0x95, 0x8, 0x8d, 0x89, 0x88, 0x8c, 0x88, 0x1b,
+                                                       0x89, 0x8a, 0x8b, 0x89, 0x88, 0x8d, 0x87, 0x8d,
+                                                       0x89, 0x1f, 0xda, 0xfb, 0x3e, 0x15, 0x88, 0x91,
+                                                       0x8b, 0x8d, 0xb3, 0xc0, 0xaf, 0xb6, 0x8d, 0x8b,
+                                                       0x96, 0x87, 0x1e, 0x13, 0xeb, 0x57, 0xea, 0x33,
+                                                       0x88, 0x87, 0x84, 0x89, 0x8a, 0x1f, 0x81, 0x7a,
+                                                       0x7e, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f, 0x7c, 0x82,
+                                                       0x7b, 0x84, 0x8, 0x89, 0x8a, 0x86, 0x88, 0x88,
+                                                       0x1a, 0xf7, 0x68, 0xf7, 0x88, 0x15, 0xa6, 0xa8,
+                                                       0xb3, 0x97, 0xb2, 0x1b, 0xa3, 0xad, 0x81, 0x6d,
+                                                       0x79, 0x7f, 0x7f, 0x79, 0x82, 0x84, 0x8e, 0x90,
+                                                       0x84, 0x1f, 0x6d, 0xa3, 0x5e, 0x91, 0x67, 0x7f,
+                                                       0x8, 0xfb, 0xe, 0xba, 0x15, 0x89, 0x95, 0x8a,
+                                                       0x94, 0x95, 0x1a, 0xb0, 0xa3, 0xdc, 0xb9, 0x9b,
+                                                       0x9c, 0x7e, 0x7a, 0x7e, 0x7f, 0x7e, 0x80, 0x86,
+                                                       0x1e, 0x6a, 0x7e, 0x69, 0x65, 0x86, 0x67, 0x8,
+                                                       0xf7, 0x1f, 0xfb, 0x3a, 0x15, 0xb4, 0x7e, 0xc5,
+                                                       0x58, 0x5c, 0x1a, 0x77, 0x7f, 0x7a, 0x76, 0x79,
+                                                       0x7f, 0x9c, 0x9c, 0x1e, 0x13, 0xec, 0xd7, 0xec,
+                                                       0x2f, 0x91, 0x8d, 0x91, 0x91, 0x1a, 0xaa, 0x7b,
+                                                       0xb5, 0x72, 0x9e, 0x1e, 0xfb, 0x81, 0xe3, 0x15,
+                                                       0x62, 0x98, 0x51, 0xbe, 0xba, 0x1a, 0x9f, 0x97,
+                                                       0x9c, 0xa0, 0x9d, 0x97, 0x7a, 0x7a, 0x1e, 0x85,
+                                                       0x89, 0x85, 0x85, 0x1a, 0x6c, 0x9b, 0x61, 0xa4,
+                                                       0x78, 0x1e, 0xf7, 0x21, 0xfb, 0x3f, 0x15, 0x8d,
+                                                       0x81, 0x8c, 0x82, 0x81, 0x1a, 0x66, 0x73, 0x3a,
+                                                       0x5d, 0x1e, 0x13, 0xec, 0xd7, 0xd2, 0x93, 0x7b,
+                                                       0x7a, 0x98, 0x9c, 0x98, 0x97, 0x98, 0x96, 0x90,
+                                                       0x1f, 0xac, 0x98, 0xad, 0xb1, 0x90, 0xaf, 0x8,
+                                                       0xfb, 0x7, 0xb4, 0x15, 0x70, 0x6e, 0x63, 0x7f,
+                                                       0x64, 0x1b, 0x73, 0x69, 0x95, 0xa9, 0x9d, 0x97,
+                                                       0x97, 0x9d, 0x94, 0x92, 0x88, 0x86, 0x92, 0x1f,
+                                                       0x7a, 0xa0, 0xa7, 0x84, 0xa6, 0x1b, 0x97, 0x97,
+                                                       0x8c, 0x90, 0x96, 0x1f, 0xe, 0xfb, 0x2c, 0x99,
+                                                       0x76, 0xf9, 0x4a, 0x77, 0x1, 0xf7, 0xda, 0xaf,
+                                                       0x3, 0xd1, 0xf7, 0xd, 0x15, 0xae, 0x81, 0xa3,
+                                                       0xdf, 0xc3, 0xab, 0x70, 0x2b, 0xae, 0x81, 0xb0,
+                                                       0xf7, 0x18, 0xdc, 0xba, 0x9a, 0x82, 0x5, 0x2e,
+                                                       0x7, 0x2b, 0x29, 0xa5, 0x71, 0xd1, 0xd3, 0x5,
+                                                       0x4a, 0x7, 0x4e, 0x4c, 0xa5, 0x72, 0xc0, 0xc1,
+                                                       0xc0, 0x55, 0xa5, 0xa4, 0x4e, 0xca, 0x5, 0xcc,
+                                                       0x7, 0xd1, 0x43, 0xa5, 0xa5, 0x2b, 0xed, 0x5,
+                                                       0xe8, 0x7, 0x9a, 0x94, 0xdc, 0x5c, 0xb0, 0xfb,
+                                                       0x18, 0xae, 0x95, 0x70, 0xeb, 0xc3, 0x6b, 0xa3,
+                                                       0x37, 0xae, 0x95, 0x77, 0xd4, 0xd4, 0x9d, 0x82,
+                                                       0xae, 0x36, 0x76, 0x53, 0xac, 0xec, 0xa3, 0x82,
+                                                       0xaf, 0xfb, 0x19, 0x69, 0x3a, 0xb9, 0x5, 0x9d,
+                                                       0x7, 0xdc, 0xb9, 0xf7, 0x19, 0x69, 0x94, 0xaf,
+                                                       0x2a, 0xa3, 0xc3, 0xac, 0xe0, 0x76, 0x94, 0xae,
+                                                       0x42, 0x9e, 0x9f, 0xd3, 0x68, 0x95, 0x73, 0x37,
+                                                       0x53, 0x6b, 0xa6, 0xeb, 0x68, 0x95, 0x66, 0xfb,
+                                                       0x18, 0x3a, 0x5c, 0x7c, 0x94, 0x5, 0xe8, 0x7,
+                                                       0xeb, 0xed, 0x71, 0xa5, 0x45, 0x43, 0x5, 0xcc,
+                                                       0x7, 0xc8, 0xca, 0x71, 0xa4, 0x56, 0x55, 0x56,
+                                                       0xc1, 0x71, 0x72, 0xc8, 0x4c, 0x5, 0x4a, 0x7,
+                                                       0x45, 0xd3, 0x71, 0x71, 0xeb, 0x29, 0x5, 0x2e,
+                                                       0x7, 0x7c, 0x82, 0x3a, 0xba, 0x66, 0xf7, 0x18,
+                                                       0x68, 0x81, 0xa6, 0x2b, 0x53, 0xab, 0x73, 0xdf,
+                                                       0x68, 0x81, 0x9f, 0x43, 0x42, 0x78, 0x94, 0x68,
+                                                       0xe0, 0xa0, 0xc3, 0x6a, 0x2a, 0x73, 0x94, 0x67,
+                                                       0xf7, 0x19, 0xad, 0xdc, 0x5d, 0x5, 0x79, 0x7,
+                                                       0x3a, 0x5d, 0xfb, 0x19, 0xad, 0x82, 0x67, 0xec,
+                                                       0x73, 0x53, 0x6a, 0x36, 0xa0, 0x82, 0x68, 0xd4,
+                                                       0x78, 0x5, 0xe, 0xfb, 0x23, 0x9e, 0x76, 0xf9,
+                                                       0x40, 0x77, 0x12, 0xf7, 0x71, 0xb0, 0xd0, 0xb3,
+                                                       0x64, 0xb3, 0xcf, 0xb0, 0x67, 0xb0, 0x13, 0xf2,
+                                                       0xdb, 0xf7, 0xc, 0x15, 0xb1, 0x7f, 0xa3, 0xe5,
+                                                       0xdd, 0xba, 0x86, 0x27, 0xa4, 0x7d, 0x5, 0x13,
+                                                       0xea, 0xdf, 0xc1, 0x5, 0x2d, 0x7, 0x49, 0x49,
+                                                       0xa8, 0x70, 0xc4, 0xc4, 0xc4, 0x52, 0xa8, 0xa6,
+                                                       0x49, 0xcd, 0x5, 0xe9, 0x7, 0xdf, 0x55, 0xa4,
+                                                       0x99, 0x86, 0xef, 0xdd, 0x5c, 0xa3, 0x31, 0xb1,
+                                                       0x97, 0x76, 0xd9, 0xd9, 0x9f, 0x82, 0xb2, 0x31,
+                                                       0x73, 0x39, 0xba, 0xe4, 0xb9, 0x5, 0xa7, 0x7,
+                                                       0x32, 0xb9, 0xdd, 0xba, 0xe5, 0x73, 0x94, 0xb2,
+                                                       0x3d, 0xa0, 0xa0, 0xd8, 0x65, 0x97, 0x73, 0x31,
+                                                       0x39, 0x5c, 0x90, 0xef, 0x72, 0x99, 0x37, 0x55,
+                                                       0x5, 0xe9, 0x7, 0xcd, 0xcd, 0x6e, 0xa6, 0x52,
+                                                       0x52, 0x52, 0xc4, 0x6e, 0x70, 0xcd, 0x49, 0x5,
+                                                       0x2d, 0x7, 0x37, 0xc1, 0x72, 0x7d, 0x90, 0x27,
+                                                       0x39, 0xba, 0x73, 0xe5, 0x65, 0x7f, 0xa0, 0x3e,
+                                                       0x3d, 0x76, 0x94, 0x64, 0xe5, 0xa3, 0xdd, 0x5c,
+                                                       0x32, 0x5d, 0x5, 0x6f, 0x7, 0xe4, 0x5d, 0x39,
+                                                       0x5c, 0x31, 0xa3, 0x82, 0x64, 0xd9, 0x76, 0x5,
+                                                       0xf7, 0x9f, 0xf7, 0x46, 0x15, 0xd9, 0x7, 0xd2,
+                                                       0xb7, 0x5, 0x13, 0xf4, 0x88, 0x38, 0x5, 0x13,
+                                                       0xea, 0x5b, 0x41, 0x15, 0xcf, 0xb2, 0xd5, 0x64,
+                                                       0x41, 0x64, 0x5, 0xfb, 0x14, 0xd5, 0x15, 0x47,
+                                                       0xb2, 0x88, 0xde, 0xd2, 0x5f, 0x5, 0xb3, 0xfb,
+                                                       0x76, 0x15, 0xd9, 0x7, 0x13, 0xf4, 0xcf, 0x64,
+                                                       0x8e, 0x38, 0x5, 0x13, 0xea, 0xfb, 0x5b, 0xf7,
+                                                       0xa, 0x15, 0x41, 0xb2, 0xd5, 0xb2, 0xcf, 0x64,
+                                                       0x5, 0x58, 0xfb, 0x31, 0x15, 0x8e, 0xde, 0xcf,
+                                                       0xb2, 0x5, 0x3d, 0x7, 0xe, 0xfb, 0x2a, 0x9b,
+                                                       0x76, 0xf9, 0x46, 0x77, 0x1, 0xf7, 0xd2, 0xbf,
+                                                       0x3, 0xd3, 0xf7, 0xe, 0x15, 0xbd, 0x7d, 0xa3,
+                                                       0xe2, 0xac, 0x9e, 0x74, 0x35, 0xbc, 0x7e, 0xb0,
+                                                       0xf7, 0x1c, 0xd4, 0xb5, 0x8e, 0x8a, 0x5, 0x36,
+                                                       0x7, 0x28, 0x27, 0xaf, 0x67, 0xca, 0xca, 0x5,
+                                                       0x65, 0x7, 0x4b, 0x4b, 0xb0, 0x66, 0xc0, 0xbf,
+                                                       0xc0, 0x57, 0xb0, 0xb0, 0x4b, 0xcb, 0x5, 0xb1,
+                                                       0x7, 0xca, 0x4c, 0xaf, 0xaf, 0x28, 0xef, 0x5,
+                                                       0xe0, 0x7, 0x8e, 0x8c, 0xd4, 0x61, 0xb0, 0xfb,
+                                                       0x1c, 0xbc, 0x98, 0x74, 0xe1, 0xac, 0x78, 0xa3,
+                                                       0x34, 0xbd, 0x99, 0x79, 0xd3, 0xd2, 0x9e, 0x7e,
+                                                       0xbe, 0x33, 0x74, 0x6a, 0x9e, 0xe1, 0xa2, 0x7e,
+                                                       0xbc, 0xfb, 0x1c, 0x67, 0x42, 0xb6, 0x75, 0xa,
+                                                       0xd4, 0xb6, 0xf7, 0x1c, 0x67, 0x98, 0xbc, 0x35,
+                                                       0xa2, 0xac, 0x9e, 0xe3, 0x74, 0x98, 0xbe, 0x44,
+                                                       0x9f, 0x9d, 0xd2, 0x59, 0x99, 0x73, 0x34, 0x6a,
+                                                       0x78, 0xa2, 0xe1, 0x5a, 0x98, 0x66, 0xfb, 0x1c,
+                                                       0x42, 0x61, 0x88, 0x8c, 0x5, 0xe0, 0x7, 0xee,
+                                                       0xef, 0x67, 0xaf, 0x4c, 0x4c, 0x5, 0xb1, 0x7,
+                                                       0xcb, 0xcb, 0x66, 0xb0, 0x56, 0x57, 0x56, 0xbf,
+                                                       0x66, 0x66, 0xcb, 0x4b, 0x5, 0x65, 0x7, 0x4c,
+                                                       0xca, 0x67, 0x67, 0xee, 0x27, 0x5, 0x36, 0x7,
+                                                       0x88, 0x8a, 0x42, 0xb5, 0x66, 0xf7, 0x1c, 0x5a,
+                                                       0x7e, 0xa2, 0x35, 0x6a, 0x9e, 0x73, 0xe2, 0x59,
+                                                       0x7d, 0x9d, 0x44, 0x44, 0x77, 0x98, 0x58, 0xe3,
+                                                       0xa2, 0xac, 0x78, 0x35, 0x74, 0x98, 0x5a, 0xf7,
+                                                       0x1c, 0xaf, 0xd4, 0x60, 0x80, 0xa, 0x42, 0x60,
+                                                       0xfb, 0x1c, 0xaf, 0x7e, 0x5a, 0xe1, 0x74, 0x6a,
+                                                       0x78, 0x33, 0xa2, 0x7e, 0x58, 0xd2, 0x77, 0x5,
+                                                       0xe, 0x56, 0x97, 0x76, 0xa5, 0x76, 0xf7, 0xdc,
+                                                       0xaa, 0xf7, 0xe2, 0x77, 0x12, 0xf8, 0xd, 0xaa,
+                                                       0x13, 0xb8, 0xf8, 0x30, 0xf8, 0x13, 0x15, 0x94,
+                                                       0x86, 0xf7, 0x3d, 0xf7, 0x8f, 0x76, 0x8f, 0x81,
+                                                       0x91, 0x7d, 0x9b, 0x19, 0xfb, 0x1, 0xfb, 0xbc,
+                                                       0x15, 0xf7, 0xa4, 0xf7, 0x19, 0x7b, 0x99, 0x85,
+                                                       0x95, 0x87, 0xa0, 0x19, 0xfb, 0x8f, 0xfb, 0x3d,
+                                                       0x5, 0x60, 0x9e, 0x15, 0x95, 0x6, 0xa0, 0xf7,
+                                                       0xc2, 0x5, 0x88, 0x82, 0x83, 0x89, 0x83, 0x1b,
+                                                       0x83, 0x83, 0x8c, 0x8f, 0x80, 0x1f, 0xd4, 0xfb,
+                                                       0xf6, 0x15, 0xf7, 0xc2, 0x76, 0x5, 0x87, 0x95,
+                                                       0x8a, 0x93, 0x93, 0x1a, 0x93, 0x8c, 0x93, 0x8f,
+                                                       0x95, 0x1e, 0xfb, 0xc2, 0x76, 0x5, 0x40, 0xac,
+                                                       0x15, 0x94, 0x90, 0xfb, 0x19, 0xf7, 0xa4, 0x7d,
+                                                       0x7b, 0x81, 0x85, 0x76, 0x87, 0x19, 0xf7, 0x7f,
+                                                       0xfb, 0xd1, 0x15, 0xf7, 0x8f, 0xfb, 0x3d, 0x8f,
+                                                       0xa0, 0x91, 0x95, 0x9b, 0x99, 0x19, 0xfb, 0xa4,
+                                                       0xf7, 0x19, 0x5, 0x35, 0xb1, 0x15, 0x90, 0x94,
+                                                       0xfb, 0x8f, 0xf7, 0x3d, 0x87, 0x76, 0x85, 0x81,
+                                                       0x7b, 0x7d, 0x19, 0xf7, 0xe2, 0xfb, 0x57, 0x15,
+                                                       0xf7, 0x19, 0xfb, 0xa4, 0x99, 0x9b, 0x95, 0x91,
+                                                       0xa0, 0x8f, 0x19, 0xfb, 0x3d, 0xf7, 0x8f, 0x5,
+                                                       0xfc, 0xd, 0x97, 0x15, 0xf7, 0xc2, 0xa0, 0x5,
+                                                       0x95, 0x7, 0xfb, 0xc2, 0xa0, 0x5, 0x8f, 0x80,
+                                                       0x8c, 0x84, 0x82, 0x1a, 0x83, 0x89, 0x83, 0x88,
+                                                       0x82, 0x1e, 0xf7, 0xd7, 0xfb, 0xd7, 0x15, 0x13,
+                                                       0x78, 0x8e, 0x95, 0x93, 0x8d, 0x93, 0x1b, 0x13,
+                                                       0xb8, 0x93, 0x93, 0x89, 0x88, 0x95, 0x1f, 0x76,
+                                                       0xf7, 0xc2, 0x5, 0x81, 0x6, 0xfb, 0xb0, 0xfb,
+                                                       0x2a, 0x15, 0xf7, 0x8f, 0xf7, 0x3d, 0x86, 0x94,
+                                                       0xfb, 0xa4, 0xfb, 0x19, 0x9b, 0x7d, 0x91, 0x81,
+                                                       0x8f, 0x76, 0x19, 0xe7, 0x2f, 0x15, 0xa0, 0x87,
+                                                       0x95, 0x85, 0x99, 0x7b, 0xf7, 0x19, 0xf7, 0xa4,
+                                                       0x18, 0x82, 0x90, 0x5, 0xe, 0x57, 0x97, 0x76,
+                                                       0xa5, 0x76, 0xf9, 0x49, 0x77, 0x12, 0xb7, 0xf9,
+                                                       0x4e, 0x13, 0xb0, 0xf8, 0x35, 0xf8, 0x7, 0x15,
+                                                       0xf7, 0x55, 0xf7, 0x8b, 0x78, 0x8e, 0x55, 0xaa,
+                                                       0x7f, 0x9a, 0x19, 0xfb, 0x9, 0xfb, 0xb7, 0x5,
+                                                       0xa0, 0x76, 0x15, 0xf7, 0xb7, 0xf7, 0x9, 0x7c,
+                                                       0x97, 0x6c, 0xc1, 0x88, 0x9e, 0x19, 0xfb, 0x8b,
+                                                       0xfb, 0x55, 0x5, 0x67, 0x9a, 0x15, 0x95, 0x6,
+                                                       0xb7, 0xf7, 0xca, 0x5, 0x87, 0x82, 0x77, 0x8a,
+                                                       0x77, 0x1b, 0x77, 0x77, 0x8c, 0x8f, 0x82, 0x1f,
+                                                       0xe3, 0xfb, 0xf6, 0x15, 0xf7, 0xca, 0x5f, 0x5,
+                                                       0x87, 0x94, 0x8a, 0xa0, 0x9f, 0x1a, 0x9f, 0x8d,
+                                                       0x9e, 0x8e, 0x94, 0x1e, 0xfb, 0xca, 0x5f, 0x5,
+                                                       0x4c, 0xa5, 0x15, 0x94, 0x90, 0xfb, 0x9, 0xf7,
+                                                       0xb7, 0x7f, 0x7c, 0x55, 0x6c, 0x78, 0x88, 0x19,
+                                                       0xf7, 0x8c, 0xfb, 0xc2, 0x15, 0xf7, 0x8b, 0xfb,
+                                                       0x55, 0x8e, 0x9e, 0xaa, 0xc1, 0x9a, 0x97, 0x19,
+                                                       0xfb, 0xb7, 0xf7, 0x9, 0x5, 0x43, 0xa9, 0x15,
+                                                       0x90, 0x94, 0xfb, 0x8b, 0xf7, 0x55, 0x88, 0x78,
+                                                       0x6c, 0x55, 0x7c, 0x7f, 0x19, 0xf8, 0x5f, 0xfc,
+                                                       0x5f, 0x15, 0x97, 0x9a, 0xc1, 0xaa, 0x9e, 0x8e,
+                                                       0xfb, 0x55, 0xf7, 0x8b, 0x18, 0x82, 0x86, 0x5,
+                                                       0xfc, 0x0, 0x7e, 0x15, 0xf7, 0xca, 0xb7, 0x5,
+                                                       0x95, 0x7, 0xfb, 0xca, 0xb7, 0x5, 0x8f, 0x82,
+                                                       0x8c, 0x76, 0x77, 0x1a, 0x77, 0x89, 0x78, 0x88,
+                                                       0x82, 0x1e, 0xf7, 0xc0, 0xfb, 0xc0, 0x15, 0x13,
+                                                       0x70, 0x8e, 0x94, 0x9e, 0x8d, 0x9f, 0x1b, 0x13,
+                                                       0xb0, 0x9f, 0xa0, 0x8a, 0x87, 0x94, 0x1f, 0x5f,
+                                                       0xf7, 0xca, 0x5, 0x81, 0x6, 0xfb, 0xa5, 0xfb,
+                                                       0x46, 0x15, 0xf7, 0x8b, 0xf7, 0x55, 0x86, 0x94,
+                                                       0xfb, 0xb7, 0xfb, 0x9, 0x9a, 0x7f, 0xaa, 0x55,
+                                                       0x8e, 0x78, 0x19, 0xc8, 0x4e, 0x15, 0x9e, 0x88,
+                                                       0xc1, 0x6c, 0x97, 0x7c, 0xf7, 0x9, 0xf7, 0xb7,
+                                                       0x18, 0x82, 0x90, 0x5, 0xe, 0xfb, 0x12, 0x92,
+                                                       0x76, 0xf7, 0x1f, 0xf7, 0x43, 0xe6, 0xf7, 0x42,
+                                                       0xf7, 0x15, 0x77, 0x12, 0xae, 0xf7, 0x45, 0xc5,
+                                                       0xf7, 0x42, 0x22, 0xae, 0xf7, 0x14, 0xf7, 0x44,
+                                                       0x13, 0xfb, 0xf7, 0xe7, 0xf7, 0x35, 0x15, 0x66,
+                                                       0x7f, 0x6b, 0x6b, 0x61, 0x1a, 0x59, 0xaf, 0x64,
+                                                       0xbe, 0xbd, 0xb0, 0xb3, 0xbc, 0xb6, 0x6b, 0xaa,
+                                                       0x65, 0x97, 0x1e, 0xf7, 0x30, 0x7, 0xf7, 0x18,
+                                                       0x3e, 0x5, 0x89, 0x83, 0x89, 0x83, 0x82, 0x1a,
+                                                       0x5a, 0xb3, 0x62, 0xbc, 0x1e, 0x13, 0xfd, 0xbd,
+                                                       0xb0, 0xb1, 0xbc, 0xba, 0x65, 0xb4, 0x5a, 0x6f,
+                                                       0x76, 0x7f, 0x78, 0x77, 0x1f, 0x13, 0xfb, 0xfb,
+                                                       0x16, 0xd7, 0xf7, 0x16, 0xd7, 0x5, 0x76, 0xa0,
+                                                       0x9f, 0x82, 0xa9, 0x1b, 0xbc, 0xaf, 0xb6, 0xba,
+                                                       0xbd, 0x62, 0xad, 0x5b, 0x5e, 0x61, 0x63, 0x5e,
+                                                       0x81, 0x8c, 0x80, 0x8e, 0x83, 0x1f, 0xfb, 0x18,
+                                                       0x3d, 0x5, 0xf7, 0x31, 0x7, 0xb1, 0x96, 0xab,
+                                                       0xab, 0xb5, 0x1a, 0xbd, 0x66, 0xb3, 0x59, 0x59,
+                                                       0x66, 0x63, 0x59, 0x61, 0xaa, 0x6b, 0xb1, 0x80,
+                                                       0x1e, 0xfb, 0x31, 0x7, 0xfb, 0x18, 0xd9, 0x5,
+                                                       0x8e, 0x92, 0x8d, 0x93, 0x95, 0x1a, 0xbc, 0x63,
+                                                       0xb3, 0x5a, 0x1e, 0x13, 0xfd, 0x59, 0x65, 0x66,
+                                                       0x59, 0x5c, 0xb2, 0x62, 0xbb, 0xa8, 0xa0, 0x97,
+                                                       0x9e, 0x9f, 0x1f, 0x13, 0xfb, 0xf7, 0x16, 0x3f,
+                                                       0xfb, 0x16, 0x3f, 0x5, 0xa1, 0x76, 0x77, 0x94,
+                                                       0x6c, 0x1b, 0x5a, 0x67, 0x5f, 0x5c, 0x59, 0xb5,
+                                                       0x69, 0xbb, 0xb7, 0xb6, 0xb3, 0xb8, 0x96, 0x7e,
+                                                       0x99, 0x93, 0x90, 0x1f, 0xf7, 0x18, 0xd8, 0x5,
+                                                       0xe, 0x5b, 0x97, 0x76, 0xf7, 0x83, 0xf7, 0xf,
+                                                       0x71, 0xf7, 0xf, 0xf7, 0x83, 0x77, 0x12, 0xf7,
+                                                       0xb2, 0xf7, 0xf, 0x71, 0xf7, 0xf, 0x13, 0xd4,
+                                                       0xf8, 0x39, 0xf7, 0xf1, 0x15, 0xbf, 0xaf, 0xbb,
+                                                       0x9f, 0xc7, 0x9b, 0xa8, 0x93, 0xa9, 0x92, 0xa4,
+                                                       0x9d, 0x9a, 0x95, 0x8b, 0x9e, 0x8c, 0x9e, 0x8c,
+                                                       0x95, 0x8b, 0x96, 0x8f, 0x94, 0x8, 0x8c, 0x8d,
+                                                       0x8b, 0x8d, 0x8d, 0x1a, 0x93, 0x84, 0x8c, 0x84,
+                                                       0x81, 0x81, 0x8e, 0x8e, 0x82, 0x1e, 0x8e, 0x81,
+                                                       0x81, 0x8f, 0x81, 0x1b, 0x6f, 0x67, 0x56, 0x76,
+                                                       0x7c, 0x1f, 0x6f, 0x63, 0x6e, 0x68, 0x65, 0x6c,
+                                                       0x82, 0x84, 0x82, 0x85, 0x82, 0x85, 0x8, 0x78,
+                                                       0x91, 0x15, 0x98, 0x88, 0x96, 0xc9, 0xa0, 0xbb,
+                                                       0xaa, 0xc1, 0x19, 0x98, 0xa2, 0xa2, 0xb3, 0xa6,
+                                                       0x1a, 0x98, 0x83, 0x93, 0x83, 0x94, 0x1e, 0x81,
+                                                       0x96, 0x83, 0x94, 0x84, 0x98, 0x8, 0x8e, 0x8a,
+                                                       0x88, 0x90, 0x87, 0x1b, 0x86, 0x8b, 0x89, 0x88,
+                                                       0x87, 0x1f, 0x7f, 0x80, 0x80, 0x87, 0x82, 0x86,
+                                                       0x8, 0x77, 0x81, 0x7e, 0x85, 0x61, 0x1a, 0x75,
+                                                       0x8f, 0x76, 0x8f, 0x76, 0x1e, 0x91, 0x6b, 0x8f,
+                                                       0x6b, 0x6a, 0x1a, 0x71, 0x89, 0x71, 0x86, 0x71,
+                                                       0x1e, 0xa5, 0x65, 0x15, 0xc9, 0x80, 0xbb, 0x76,
+                                                       0xc1, 0x6c, 0x8, 0x7e, 0xa2, 0xb3, 0x74, 0xa6,
+                                                       0x1b, 0x98, 0x94, 0x93, 0x93, 0x93, 0x1f, 0x96,
+                                                       0x95, 0x94, 0x93, 0x98, 0x92, 0x8, 0x8e, 0x8c,
+                                                       0x90, 0x8e, 0x8f, 0x1a, 0x90, 0x89, 0x8b, 0x88,
+                                                       0x8f, 0x1e, 0x82, 0x96, 0x85, 0x94, 0x87, 0x94,
+                                                       0x8, 0xa1, 0x80, 0x87, 0x99, 0x5f, 0x1b, 0x75,
+                                                       0x76, 0x87, 0x87, 0x76, 0x1f, 0x85, 0x6b, 0x6b,
+                                                       0x87, 0x6a, 0x1b, 0x71, 0x71, 0x8d, 0x90, 0x71,
+                                                       0x1f, 0x5b, 0x9a, 0x15, 0x97, 0x93, 0x67, 0xbf,
+                                                       0x77, 0xbb, 0x7b, 0xc7, 0x19, 0x83, 0xa8, 0x84,
+                                                       0xa9, 0x79, 0xa4, 0x82, 0x98, 0x7c, 0x8d, 0x7b,
+                                                       0x8c, 0x7e, 0x8c, 0x7e, 0x8b, 0x7f, 0x8f, 0x8,
+                                                       0x8c, 0x89, 0x89, 0x8b, 0x89, 0x1b, 0x83, 0x8a,
+                                                       0x84, 0x84, 0x80, 0x88, 0x80, 0x87, 0x81, 0x1f,
+                                                       0x88, 0x82, 0x88, 0x82, 0x82, 0x1a, 0x6f, 0xc0,
+                                                       0x67, 0xa0, 0x7c, 0x1e, 0xb3, 0x6f, 0xae, 0x6e,
+                                                       0xaa, 0x65, 0x92, 0x82, 0x91, 0x82, 0x91, 0x82,
+                                                       0x8, 0xa9, 0x61, 0x15, 0xaf, 0x57, 0x9f, 0x5b,
+                                                       0x9b, 0x4f, 0x93, 0x6e, 0x92, 0x6d, 0x9d, 0x72,
+                                                       0x94, 0x7d, 0x9c, 0x8a, 0x9c, 0x8a, 0x97, 0x8a,
+                                                       0x97, 0x8b, 0x96, 0x87, 0x8, 0x8a, 0x8d, 0x8d,
+                                                       0x8b, 0x8d, 0x1b, 0x93, 0x8c, 0x92, 0x92, 0x94,
+                                                       0x8d, 0x93, 0x8e, 0x94, 0x1f, 0x8f, 0x96, 0x8f,
+                                                       0x96, 0x96, 0x1a, 0xa7, 0x56, 0xaf, 0x76, 0x9a,
+                                                       0x1e, 0x63, 0xa7, 0x68, 0xa8, 0x6c, 0xb1, 0x84,
+                                                       0x94, 0x85, 0x94, 0x85, 0x94, 0x8, 0x5b, 0x9a,
+                                                       0x15, 0x8e, 0x98, 0x4d, 0x96, 0x5b, 0xa0, 0x55,
+                                                       0xaa, 0x19, 0x13, 0xb8, 0x98, 0x74, 0x63, 0xa2,
+                                                       0x70, 0x1b, 0x7e, 0x82, 0x83, 0x83, 0x83, 0x1f,
+                                                       0x80, 0x81, 0x82, 0x83, 0x7e, 0x84, 0x8, 0x88,
+                                                       0x8a, 0x86, 0x88, 0x87, 0x1a, 0x86, 0x8d, 0x8b,
+                                                       0x8e, 0x87, 0x1e, 0x95, 0x80, 0x91, 0x80, 0x8f,
+                                                       0x82, 0x8, 0x76, 0x95, 0x90, 0x7e, 0xb6, 0x1b,
+                                                       0xa1, 0xa0, 0x8f, 0x8f, 0xa0, 0x1f, 0x91, 0xab,
+                                                       0xab, 0x8f, 0xac, 0x1b, 0xa5, 0xa5, 0x89, 0x86,
+                                                       0xa5, 0x1f, 0x9b, 0x75, 0x15, 0x80, 0x4d, 0x76,
+                                                       0x5b, 0x6c, 0x55, 0x8, 0x7e, 0x74, 0x74, 0x63,
+                                                       0x70, 0x1a, 0x7e, 0x93, 0x82, 0x93, 0x83, 0x1e,
+                                                       0x95, 0x80, 0x93, 0x82, 0x92, 0x7e, 0x8, 0x88,
+                                                       0x8c, 0x8e, 0x86, 0x8f, 0x1b, 0x90, 0x8b, 0x8d,
+                                                       0x8e, 0x8f, 0x1f, 0x94, 0x93, 0x93, 0x90, 0x93,
+                                                       0x8f, 0x8, 0xa3, 0x97, 0x9b, 0x8d, 0xba, 0x1a,
+                                                       0xa1, 0x87, 0xa0, 0x87, 0xa0, 0x1e, 0x85, 0xab,
+                                                       0x87, 0xab, 0xac, 0x1a, 0xa5, 0x8d, 0xa5, 0x90,
+                                                       0xa5, 0x1e, 0x78, 0x91, 0x15, 0x83, 0x97, 0x57,
+                                                       0x67, 0x5b, 0x77, 0x4f, 0x7b, 0x19, 0x6e, 0x83,
+                                                       0x6d, 0x84, 0x72, 0x79, 0x7e, 0x82, 0x89, 0x7b,
+                                                       0x8a, 0x7a, 0x8a, 0x7f, 0x8b, 0x7e, 0x87, 0x80,
+                                                       0x8, 0x8a, 0x89, 0x8b, 0x89, 0x89, 0x1a, 0x83,
+                                                       0x92, 0x8a, 0x92, 0x95, 0x95, 0x88, 0x88, 0x95,
+                                                       0x1e, 0x88, 0x95, 0x94, 0x87, 0x95, 0x1b, 0xa7,
+                                                       0xaf, 0xc0, 0xa0, 0x9a, 0x1f, 0xa7, 0xb3, 0xa8,
+                                                       0xae, 0xb1, 0xaa, 0x94, 0x92, 0x94, 0x91, 0x94,
+                                                       0x91, 0x8, 0xe, 0xfb, 0xb3, 0x8b, 0xcd, 0xf7,
+                                                       0xb6, 0xd1, 0xe7, 0xa4, 0xf7, 0xf, 0xa5, 0x1,
+                                                       0xae, 0xa4, 0xf7, 0xf, 0xa6, 0xe8, 0xd3, 0xd4,
+                                                       0xd0, 0x3, 0xf7, 0x4b, 0xc8, 0x15, 0xe4, 0x4e,
+                                                       0x5, 0xf2, 0xf7, 0xf8, 0xf7, 0x22, 0xf7, 0x9,
+                                                       0x6, 0x4b, 0xd1, 0x5, 0x3d, 0xd7, 0x6, 0x46,
+                                                       0xd4, 0x5, 0xfb, 0xf, 0xfb, 0x29, 0xfb, 0x28,
+                                                       0xfb, 0xd, 0x6, 0xe6, 0x49, 0x5, 0xc4, 0x6,
+                                                       0xa6, 0xfb, 0xb6, 0x15, 0xf7, 0xfc, 0xfb, 0x2a,
+                                                       0xe7, 0xf7, 0x2a, 0xf7, 0x28, 0xe8, 0xfb, 0x28,
+                                                       0xf7, 0x25, 0x2f, 0xfb, 0x25, 0xfb, 0xfc, 0x7,
+                                                       0xe, 0x55, 0x3a, 0xa, 0xf7, 0xdf, 0xf7, 0xc9,
+                                                       0x15, 0xfb, 0x33, 0xfb, 0x3, 0x72, 0x7a, 0x7d,
+                                                       0x7a, 0x86, 0x73, 0x19, 0x69, 0x84, 0xa6, 0x6d,
+                                                       0xad, 0x1b, 0xa3, 0x9a, 0xa2, 0xaa, 0xa4, 0x1f,
+                                                       0xf7, 0x2, 0xf7, 0x2e, 0x9e, 0x83, 0x64, 0xfb,
+                                                       0x66, 0x5, 0x65, 0x84, 0xa1, 0x61, 0xb6, 0x1b,
+                                                       0xba, 0x9b, 0xb4, 0xb2, 0x83, 0x1f, 0x65, 0xf7,
+                                                       0x66, 0x9d, 0x93, 0xf7, 0x4, 0xfb, 0x32, 0x5,
+                                                       0x70, 0x9f, 0x98, 0x74, 0xb1, 0x1b, 0xac, 0xa1,
+                                                       0xa9, 0xaa, 0xa4, 0x7d, 0x99, 0x77, 0x98, 0x1f,
+                                                       0xfb, 0x46, 0xf7, 0xc, 0x93, 0x9f, 0xf7, 0x51,
+                                                       0x6d, 0x5, 0xb4, 0x85, 0xc5, 0x86, 0xc5, 0x1a,
+                                                       0xca, 0x51, 0x89, 0x60, 0x84, 0x1e, 0xfb, 0x4f,
+                                                       0x67, 0x83, 0x9f, 0xf7, 0x44, 0xf7, 0xd, 0x5,
+                                                       0x8b, 0xab, 0xa7, 0xa4, 0x1a, 0xa9, 0x72, 0xa9,
+                                                       0x6c, 0x6c, 0x7e, 0x7c, 0x74, 0x7b, 0x1e, 0xfb,
+                                                       0xa, 0xfb, 0x40, 0x79, 0x94, 0xab, 0xf7, 0x4d,
+                                                       0x5, 0xb5, 0x92, 0x8a, 0xc8, 0x50, 0x1b, 0x5d,
+                                                       0x78, 0x69, 0x46, 0x97, 0x1f, 0xb1, 0xfb, 0x4d,
+                                                       0x78, 0x82, 0xfb, 0x2, 0xf7, 0x29, 0x5, 0xa1,
+                                                       0x7b, 0x79, 0xab, 0x6c, 0x1b, 0x6a, 0x6f, 0x74,
+                                                       0x69, 0x65, 0xa7, 0x7e, 0xa6, 0x78, 0x1f, 0xf7,
+                                                       0x30, 0x26, 0x83, 0x78, 0xfb, 0x4e, 0xaf, 0x5,
+                                                       0x60, 0x93, 0x51, 0x8a, 0x4e, 0x1a, 0x4e, 0xc6,
+                                                       0x94, 0xb4, 0x91, 0x1e, 0xf7, 0x4f, 0xa7, 0x5,
+                                                       0xe, 0x5b, 0x3a, 0xa, 0xae, 0xf9, 0x66, 0x3,
+                                                       0x3b, 0xa, 0xfb, 0x5c, 0xf7, 0x37, 0xfb, 0x34,
+                                                       0xf7, 0x5b, 0xf7, 0x5a, 0xf7, 0x36, 0xf7, 0x36,
+                                                       0xf7, 0x5a, 0xf7, 0x5a, 0xfb, 0x36, 0xf7, 0x35,
+                                                       0xfb, 0x5a, 0xfb, 0x5b, 0xfb, 0x37, 0xfb, 0x33,
+                                                       0xfb, 0x5c, 0x1e, 0xe, 0xad, 0x7d, 0xae, 0xf9,
+                                                       0x1c, 0xaf, 0x1, 0xae, 0x9f, 0xf9, 0x1e, 0xf7,
+                                                       0x19, 0x3, 0xae, 0xf7, 0xec, 0x15, 0xfb, 0x75,
+                                                       0xf7, 0x49, 0xfb, 0x19, 0xf7, 0x6a, 0xf7, 0x6b,
+                                                       0xf7, 0x55, 0xf7, 0x13, 0xf7, 0x7b, 0xf7, 0x77,
+                                                       0xfb, 0x52, 0xf7, 0x1a, 0xfb, 0x69, 0xfb, 0x69,
+                                                       0xfb, 0x4f, 0xfb, 0x1b, 0xfb, 0x76, 0x1e, 0x9f,
+                                                       0x16, 0xf7, 0x48, 0xf7, 0x28, 0x41, 0xa, 0xf7,
+                                                       0x46, 0xf7, 0x25, 0xfb, 0x27, 0xfb, 0x46, 0xfb,
+                                                       0x46, 0xfb, 0x25, 0x3e, 0xa, 0xfb, 0x49, 0xfb,
+                                                       0x25, 0xf7, 0x23, 0xf7, 0x48, 0x1e, 0xe, 0x3d,
+                                                       0x3d, 0xa, 0xf9, 0x47, 0x7a, 0xa, 0xf9, 0x47,
+                                                       0xf9, 0x48, 0xfd, 0x47, 0x6, 0xe, 0x3e, 0x8b,
+                                                       0xf7, 0x12, 0x6e, 0xa8, 0xf8, 0xac, 0xa9, 0x12,
+                                                       0xae, 0xa8, 0xf8, 0xa9, 0xa8, 0x13, 0x78, 0xae,
+                                                       0xec, 0x15, 0xf7, 0x0, 0x6, 0x13, 0xb8, 0x2a,
+                                                       0xf8, 0xdc, 0xf8, 0xde, 0x26, 0xf5, 0xfc, 0xe3,
+                                                       0x7, 0x13, 0x78, 0xa8, 0xfc, 0xca, 0x15, 0xf8,
+                                                       0xac, 0xf8, 0xa9, 0xfc, 0xac, 0x7, 0xe, 0x3b,
+                                                       0x8b, 0xf7, 0xf, 0xf8, 0xad, 0xab, 0x1, 0xae,
+                                                       0xaa, 0xf8, 0xa8, 0xf7, 0x13, 0x3, 0xae, 0xf7,
+                                                       0x7, 0x15, 0xf7, 0xa, 0xfb, 0x7, 0x5, 0xf8,
+                                                       0xd0, 0xf8, 0xc7, 0x6, 0xfb, 0xd, 0xf7, 0x15,
+                                                       0x5, 0xfc, 0xcd, 0x6, 0xaa, 0xfc, 0xcd, 0x6d,
+                                                       0xa, 0xc0, 0xa0, 0x76, 0xf9, 0x55, 0x54, 0xa,
+                                                       0xf9, 0xcb, 0x7a, 0xa, 0xf9, 0xcb, 0x6, 0xfc,
+                                                       0x30, 0xf9, 0x55, 0x5, 0xe, 0xc0, 0x92, 0x76,
+                                                       0xf9, 0x56, 0x54, 0xa, 0xf9, 0xcb, 0x3, 0xf8,
+                                                       0x52, 0x7d, 0x15, 0xf8, 0x30, 0xf9, 0x56, 0x5,
+                                                       0xfd, 0xcb, 0x6, 0xe, 0x3a, 0xa, 0xa3, 0xf9,
+                                                       0x63, 0x3, 0x3b, 0xa, 0xf7, 0xfb, 0xfb, 0xfc,
+                                                       0xf7, 0xfc, 0xf7, 0xfc, 0xfb, 0xfc, 0xf7, 0xfb,
+                                                       0x5, 0xe, 0x54, 0x3f, 0xa, 0x12, 0xaf, 0xf9,
+                                                       0x5d, 0xfc, 0x8e, 0xf7, 0xc6, 0x13, 0xd0, 0xf8,
+                                                       0x1c, 0xf8, 0x21, 0x15, 0xf7, 0x2d, 0xf7, 0x2d,
+                                                       0xfb, 0x2d, 0xf7, 0x2f, 0xfb, 0x2d, 0xfb, 0x2e,
+                                                       0x5, 0xf7, 0x5f, 0xfb, 0x5f, 0x15, 0xf7, 0x2c,
+                                                       0xfb, 0x2c, 0x5, 0x13, 0xe0, 0xf7, 0x2f, 0xf7,
+                                                       0x25, 0xfb, 0x2d, 0xf7, 0x35, 0x5, 0xfb, 0xf9,
+                                                       0xfb, 0xfb, 0x15, 0xf7, 0x2d, 0xfb, 0x31, 0xf7,
+                                                       0x30, 0xf7, 0x31, 0xfb, 0x30, 0xf7, 0x2f, 0x5,
+                                                       0xfb, 0x5f, 0x25, 0x15, 0xf7, 0x2d, 0xf7, 0x2c,
+                                                       0xfb, 0x2f, 0xf7, 0x2e, 0xfb, 0x2b, 0xfb, 0x2e,
+                                                       0x5, 0xe, 0xfb, 0xc2, 0x8b, 0xa4, 0xf7, 0xdb,
+                                                       0xa2, 0xaa, 0xda, 0xaa, 0xa4, 0xf7, 0x12, 0xa4,
+                                                       0x1, 0xae, 0xa3, 0xf7, 0x6, 0xa4, 0xaa, 0xdc,
+                                                       0xa9, 0xa3, 0xf7, 0x6, 0xa4, 0x3, 0xf7, 0x41,
+                                                       0x16, 0xf7, 0x53, 0xf7, 0xf4, 0xf7, 0x1f, 0xf7,
+                                                       0x51, 0xfb, 0x1f, 0xf7, 0x2b, 0xfb, 0x53, 0xfb,
+                                                       0x2b, 0xfb, 0x1e, 0xfb, 0x51, 0xf7, 0x1e, 0x6,
+                                                       0xa4, 0xfb, 0xdb, 0x15, 0xf7, 0xf2, 0xfb, 0x1f,
+                                                       0xf7, 0x21, 0xf7, 0x1f, 0xf7, 0x2b, 0xf7, 0x22,
+                                                       0xfb, 0x2b, 0xf7, 0x1e, 0xfb, 0x21, 0xfb, 0x1e,
+                                                       0xfb, 0xf2, 0x7, 0xfb, 0x3, 0xa9, 0x15, 0xdc,
+                                                       0xf7, 0xf3, 0xf7, 0x1d, 0xda, 0xfb, 0x1d, 0xf7,
+                                                       0x2a, 0x3a, 0xfb, 0x2a, 0xfb, 0x1f, 0x3c, 0xf7,
+                                                       0x1f, 0x6, 0xe, 0xfc, 0x25, 0x3a, 0xa, 0xae,
+                                                       0xf8, 0x4, 0x3, 0xae, 0x7d, 0x15, 0xf7, 0x66,
+                                                       0xf7, 0x32, 0xf7, 0x35, 0xf7, 0x5c, 0xf7, 0x5c,
+                                                       0xfb, 0x37, 0xf7, 0x32, 0xfb, 0x61, 0x1f, 0xfd,
+                                                       0x63, 0x7, 0xe, 0xfd, 0x51, 0x3d, 0xa, 0xd0,
+                                                       0x7a, 0xa, 0xd0, 0xf9, 0x48, 0x46, 0x6, 0xe,
+                                                       0xfc, 0xc6, 0x5a, 0xa, 0xae, 0x16, 0xf7, 0x63,
+                                                       0xf9, 0x48, 0xfb, 0x63, 0x6, 0xe, 0xfc, 0x3c,
+                                                       0x3d, 0xa, 0xf7, 0xed, 0x7a, 0xa, 0xf7, 0xed,
+                                                       0xf9, 0x48, 0xfb, 0xed, 0x6, 0xe, 0x66, 0xa,
+                                                       0xb9, 0x64, 0x15, 0x96, 0x7e, 0xf7, 0x38, 0xf7,
+                                                       0x56, 0xf7, 0x42, 0xf7, 0x27, 0xd9, 0xbb, 0x19,
+                                                       0x30, 0xc2, 0xfb, 0x3f, 0xf7, 0x1f, 0xfb, 0x34,
+                                                       0xf7, 0x5b, 0x7c, 0x80, 0x18, 0xb7, 0xfb, 0xb,
+                                                       0xe3, 0xfb, 0x3d, 0xcf, 0x2d, 0x4c, 0x37, 0x2e,
+                                                       0xfb, 0x65, 0x69, 0x38, 0x8, 0xe, 0xfc, 0x41,
+                                                       0x3d, 0xa, 0xf7, 0xe8, 0x7a, 0xa, 0xf7, 0x84,
+                                                       0x6, 0xef, 0xf7, 0xee, 0x27, 0xf7, 0xee, 0x5,
+                                                       0xfb, 0x84, 0x6, 0xef, 0xfb, 0xee, 0x5, 0xe,
+                                                       0xfc, 0xf1, 0x3a, 0xa, 0xae, 0xc7, 0x3, 0xae,
+                                                       0xd3, 0x15, 0xf7, 0x22, 0x35, 0xa1, 0xa0, 0x23,
+                                                       0xd2, 0x5, 0xf8, 0xaf, 0x7, 0xf3, 0xcf, 0x75,
+                                                       0x9f, 0xfb, 0x22, 0x33, 0x5, 0xe, 0xfc, 0xf1,
+                                                       0x3a, 0xa, 0xf7, 0x1e, 0xc8, 0x3, 0xae, 0x93,
+                                                       0x15, 0xa0, 0x75, 0xf7, 0x23, 0xe1, 0x5, 0xf8,
+                                                       0xb5, 0x7, 0xfb, 0x23, 0xe3, 0x76, 0x77, 0xf2,
+                                                       0x47, 0x5, 0xfc, 0xae, 0x7, 0xe, 0xfc, 0x55,
+                                                       0x3a, 0xa, 0xae, 0xf7, 0x10, 0x3, 0xf7, 0xf2,
+                                                       0x7d, 0x15, 0x91, 0x96, 0x5, 0xfb, 0x25, 0xbc,
+                                                       0x57, 0xf7, 0x32, 0xf7, 0x21, 0x1a, 0xf7, 0x1e,
+                                                       0xc3, 0xf7, 0x38, 0xf7, 0x21, 0xba, 0x1e, 0x83,
+                                                       0x96, 0x5, 0xfb, 0x52, 0x54, 0xfb, 0xf, 0x20,
+                                                       0xfb, 0x5a, 0x1a, 0xfb, 0x5b, 0xf7, 0x1a, 0xfb,
+                                                       0x2, 0xf7, 0x49, 0x59, 0x1e, 0xe, 0xfb, 0x9a,
+                                                       0xf3, 0xa2, 0xf7, 0x55, 0xb3, 0xf7, 0x69, 0xa2,
+                                                       0x1, 0xae, 0xa2, 0xf7, 0x66, 0xb4, 0xf7, 0x66,
+                                                       0xa2, 0x14, 0x1c, 0xf4, 0xf3, 0x15, 0xf8, 0x4,
+                                                       0x6, 0x81, 0xa2, 0x5, 0x21, 0x5b, 0xe2, 0xf7,
+                                                       0x4, 0x1f, 0xf7, 0xa, 0xe7, 0x5c, 0x20, 0x1f,
+                                                       0xa2, 0x81, 0x5, 0xf8, 0x4, 0x7, 0x74, 0x81,
+                                                       0x8e, 0xfb, 0x5, 0xfb, 0x0, 0x65, 0x22, 0x88,
+                                                       0x19, 0xf2, 0xb6, 0xf7, 0x2, 0xf7, 0x3, 0x85,
+                                                       0x1e, 0x95, 0xa2, 0x5, 0xfc, 0x4, 0x6, 0x95,
+                                                       0x74, 0x5, 0xf6, 0x88, 0xb9, 0x31, 0xfb, 0x6,
+                                                       0x1a, 0xfb, 0x2, 0x22, 0xbb, 0xf5, 0x90, 0x1f,
+                                                       0x74, 0x95, 0x5, 0xfc, 0x4, 0x7, 0xa2, 0x95,
+                                                       0x8c, 0xf6, 0xf7, 0x0, 0xc4, 0xf0, 0x81, 0x19,
+                                                       0x22, 0x63, 0x29, 0xfb, 0x5, 0x8f, 0x1e, 0xe,
+                                                       0xfc, 0x55, 0x3a, 0xa, 0xf7, 0x7c, 0xf7, 0xf,
+                                                       0x3, 0xae, 0x88, 0x15, 0x92, 0x80, 0x5, 0xf7,
+                                                       0x50, 0xbf, 0xf7, 0x11, 0xf7, 0x0, 0xf7, 0x5b,
+                                                       0x1a, 0xf7, 0x59, 0xfb, 0xf, 0xf7, 0x0, 0xfb,
+                                                       0x52, 0xc2, 0x1e, 0x84, 0x80, 0x5, 0xf7, 0x20,
+                                                       0x5b, 0xc4, 0xfb, 0x37, 0xfb, 0x1e, 0x1a, 0xfb,
+                                                       0x21, 0x56, 0xfb, 0x32, 0xfb, 0x24, 0x5a, 0x1e,
+                                                       0xe, 0xfc, 0xc7, 0x5a, 0xa, 0xf7, 0x19, 0x16,
+                                                       0xf7, 0x1, 0x6, 0x26, 0xf7, 0xed, 0xf0, 0xf7,
+                                                       0xef, 0x5, 0x22, 0x6, 0x25, 0xfb, 0xef, 0x5,
+                                                       0xe, 0xfc, 0xc7, 0x5a, 0xa, 0xae, 0x16, 0xf5,
+                                                       0x6, 0xf0, 0xf7, 0xed, 0x24, 0xf7, 0xef, 0x5,
+                                                       0x23, 0x6, 0xef, 0xfb, 0xef, 0x5, 0xe, 0xfc,
+                                                       0x9e, 0x3d, 0xa, 0xf7, 0x34, 0x3, 0xf7, 0x4c,
+                                                       0x16, 0xee, 0x6, 0x54, 0xf7, 0x4, 0x6a, 0xf7,
+                                                       0x4, 0xf7, 0x11, 0x1a, 0xf7, 0x12, 0xa9, 0xed,
+                                                       0xbd, 0xf7, 0xb, 0x1e, 0x2b, 0x6, 0x3a, 0x29,
+                                                       0x4c, 0xfb, 0xc, 0xfb, 0x14, 0x1a, 0xfb, 0x12,
+                                                       0xcc, 0xfb, 0x13, 0xdf, 0x2e, 0x1e, 0xe, 0xfc,
+                                                       0x9e, 0x38, 0xa, 0xf7, 0xc, 0xf7, 0x37, 0x7a,
+                                                       0xa, 0xee, 0x6, 0xde, 0xe7, 0xcd, 0xf7, 0x14,
+                                                       0xf7, 0x11, 0x1a, 0xf7, 0x16, 0x4b, 0xf7, 0x9,
+                                                       0x3b, 0xef, 0x1e, 0x28, 0x6, 0xc0, 0xfb, 0xc,
+                                                       0xa6, 0x2a, 0xfb, 0x12, 0x1a, 0xfb, 0x10, 0x6c,
+                                                       0xfb, 0x5, 0x55, 0xfb, 0x4, 0x1e, 0xe, 0xfc,
+                                                       0x8d, 0x38, 0xa, 0xe1, 0xf7, 0x1b, 0x3, 0xf7,
+                                                       0xbf, 0x16, 0x99, 0x7, 0x3d, 0x8b, 0xc1, 0xc1,
+                                                       0xf7, 0x2e, 0x8f, 0xc0, 0x38, 0x9c, 0x1f, 0xde,
+                                                       0x9d, 0x87, 0xc6, 0xf7, 0x24, 0x1a, 0xd7, 0x8b,
+                                                       0xaf, 0xd9, 0x1e, 0x98, 0x61, 0x7, 0x67, 0x39,
+                                                       0x8b, 0x7c, 0x76, 0x1f, 0x6c, 0x75, 0x87, 0x70,
+                                                       0x68, 0x1a, 0x91, 0xfb, 0x3e, 0x5, 0x64, 0x7f,
+                                                       0x6d, 0x61, 0x83, 0x1e, 0xb5, 0x83, 0x97, 0x6f,
+                                                       0x63, 0x1a, 0x85, 0xfb, 0x3d, 0x5, 0x68, 0x8c,
+                                                       0x69, 0xaf, 0x79, 0x1e, 0x7f, 0xa3, 0xd2, 0x89,
+                                                       0xaf, 0x1b, 0xe, 0xfc, 0x8d, 0x38, 0xa, 0xf7,
+                                                       0x5, 0xf7, 0x1b, 0x7a, 0xa, 0xbb, 0x6, 0xaf,
+                                                       0xdc, 0x8b, 0x99, 0x99, 0x1f, 0xaf, 0x9d, 0x8c,
+                                                       0xad, 0xae, 0x1a, 0x85, 0xf7, 0x3d, 0x8a, 0xb4,
+                                                       0x98, 0xa6, 0xb5, 0x93, 0x19, 0x61, 0x93, 0x7d,
+                                                       0xa0, 0x8d, 0xbb, 0x91, 0xf7, 0x3e, 0x18, 0xae,
+                                                       0x88, 0xa7, 0x6b, 0xa0, 0x1e, 0x9a, 0x74, 0x3b,
+                                                       0x8b, 0x67, 0x1b, 0x61, 0x7e, 0x6, 0xd9, 0x8b,
+                                                       0x54, 0x56, 0x1f, 0x37, 0x7, 0x45, 0x87, 0x56,
+                                                       0xdd, 0x79, 0x1e, 0x39, 0x7a, 0x8f, 0x56, 0x45,
+                                                       0x1a, 0x37, 0x7, 0x55, 0x8b, 0x55, 0x3d, 0x1e,
+                                                       0xe, 0xfc, 0x53, 0x73, 0xa, 0xf0, 0x26, 0xf7,
+                                                       0xd0, 0x13, 0xa0, 0xf7, 0xcc, 0xf9, 0x3a, 0x15,
+                                                       0x86, 0xa0, 0x5, 0xfb, 0x13, 0x7a, 0xfb, 0x23,
+                                                       0x4b, 0xfb, 0x5b, 0x1a, 0x36, 0xc6, 0x21, 0xf2,
+                                                       0xeb, 0xc5, 0xd4, 0xd2, 0xc3, 0x71, 0xac, 0x75,
+                                                       0x97, 0x1e, 0x7e, 0x91, 0x7a, 0x8f, 0x7c, 0x86,
+                                                       0x8, 0x86, 0x78, 0x81, 0x86, 0x70, 0x1b, 0x13,
+                                                       0xc0, 0x63, 0x71, 0xa0, 0xb5, 0xbd, 0xaf, 0xcc,
+                                                       0xf7, 0x1e, 0xab, 0x1f, 0xe, 0xfc, 0x53, 0x73,
+                                                       0xa, 0xf7, 0xd0, 0x26, 0xf0, 0x13, 0xc0, 0xde,
+                                                       0xf7, 0x78, 0x15, 0xf7, 0x13, 0x9c, 0xf7, 0x23,
+                                                       0xcb, 0xf7, 0x5b, 0x1a, 0xe0, 0x50, 0xf5, 0x24,
+                                                       0x2b, 0x51, 0x42, 0x44, 0x53, 0xa5, 0x6a, 0xa1,
+                                                       0x7f, 0x1e, 0x97, 0x85, 0x9a, 0x87, 0x9d, 0x90,
+                                                       0x8, 0x90, 0x9e, 0x95, 0x90, 0xa6, 0x1b, 0x13,
+                                                       0xa0, 0xb3, 0xa5, 0x76, 0x61, 0x59, 0x67, 0x4a,
+                                                       0xfb, 0x1e, 0x6b, 0x1f, 0x90, 0x76, 0x5, 0xe,
+                                                       0xfb, 0x3f, 0xf8, 0xec, 0xf9, 0x3a, 0x15, 0x87,
+                                                       0xa0, 0x5, 0xfb, 0xc, 0x5f, 0xa, 0x73, 0xac,
+                                                       0x76, 0x97, 0x1e, 0x80, 0x91, 0x7c, 0x8f, 0x7a,
+                                                       0x86, 0x8, 0x86, 0x7a, 0x81, 0x86, 0x72, 0x1b,
+                                                       0x65, 0x73, 0xa0, 0xb5, 0xbd, 0xac, 0xcc, 0xf7,
+                                                       0x16, 0xab, 0x1f, 0xfb, 0xc4, 0x16, 0x86, 0xa0,
+                                                       0x5, 0xfb, 0xb, 0x5f, 0xa, 0x72, 0xac, 0x76,
+                                                       0x97, 0x1e, 0x80, 0x91, 0x7d, 0x8f, 0x7a, 0x86,
+                                                       0x8, 0x86, 0x79, 0x82, 0x86, 0x71, 0x1b, 0x66,
+                                                       0x72, 0xa0, 0xb5, 0xbd, 0xad, 0xcc, 0xf7, 0x16,
+                                                       0xab, 0x1f, 0xe, 0xfc, 0xc5, 0xe, 0x7d, 0x99,
+                                                       0xf7, 0xee, 0x98, 0xf7, 0xe1, 0x98, 0x6, 0x1e,
+                                                       0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xa7, 0xa,
+                                                       0xe5, 0xb, 0xf9, 0xa8, 0x14, 0xf9, 0xdb, 0x15,
+                                                       0xa7, 0x13, 0x0, 0x61, 0x2, 0x0, 0x1, 0x0,
+                                                       0x7, 0x0, 0xb, 0x0, 0x11, 0x0, 0x18, 0x0,
+                                                       0x1f, 0x0, 0x2c, 0x0, 0x30, 0x0, 0x39, 0x0,
+                                                       0x3e, 0x0, 0x43, 0x0, 0x4b, 0x0, 0x52, 0x0,
+                                                       0x5a, 0x0, 0x5f, 0x0, 0x64, 0x0, 0x69, 0x0,
+                                                       0x78, 0x0, 0x7f, 0x0, 0xba, 0x0, 0xbf, 0x1,
+                                                       0xb, 0x1, 0x11, 0x1, 0x18, 0x1, 0x1d, 0x1,
+                                                       0x24, 0x1, 0x3e, 0x1, 0x42, 0x1, 0x46, 0x1,
+                                                       0x55, 0x1, 0x59, 0x1, 0x5e, 0x1, 0x64, 0x1,
+                                                       0x69, 0x1, 0x6e, 0x1, 0x85, 0x1, 0x8d, 0x1,
+                                                       0x92, 0x1, 0xa5, 0x1, 0xaa, 0x1, 0xc7, 0x1,
+                                                       0xe2, 0x1, 0xfc, 0x2, 0xb, 0x2, 0x16, 0x2,
+                                                       0x1b, 0x2, 0x1f, 0x2, 0x29, 0x2, 0x37, 0x2,
+                                                       0x41, 0x2, 0x4b, 0x2, 0x58, 0x2, 0x65, 0x2,
+                                                       0x69, 0x2, 0x7f, 0x2, 0x95, 0x2, 0xa4, 0x2,
+                                                       0xaf, 0x2, 0xbe, 0x2, 0xc4, 0x2, 0xcf, 0x2,
+                                                       0xda, 0x2, 0xec, 0x2, 0xfe, 0x3, 0xf, 0x3,
+                                                       0x20, 0x3, 0x2f, 0x3, 0x38, 0x3, 0x41, 0x3,
+                                                       0x4a, 0x3, 0x51, 0x3, 0x5e, 0x3, 0x6b, 0x3,
+                                                       0x77, 0x3, 0x83, 0x3, 0x89, 0x3, 0x8d, 0x3,
+                                                       0x98, 0x3, 0xa1, 0x3, 0xa8, 0x3, 0xaf, 0x3,
+                                                       0xb6, 0x3, 0xbd, 0x3, 0xc4, 0x3, 0xcb, 0x3,
+                                                       0xd0, 0x3, 0xd4, 0x3, 0xde, 0x3, 0xe8, 0x3,
+                                                       0xf2, 0x3, 0xfc, 0x4, 0x0, 0x4, 0x9, 0x4,
+                                                       0x12, 0x4, 0x19, 0x4, 0x1f, 0x4, 0x24, 0x4,
+                                                       0x28, 0x30, 0xa, 0x33, 0xa, 0x1e, 0xb, 0x15,
+                                                       0x20, 0xa, 0xb, 0xae, 0xf7, 0xee, 0x21, 0xa,
+                                                       0xb, 0xae, 0xf7, 0xee, 0x15, 0x2c, 0xa, 0xb,
+                                                       0xf7, 0x5b, 0x25, 0xa, 0xfb, 0x5b, 0xb, 0xf7,
+                                                       0x35, 0xf7, 0x35, 0xf7, 0x5b, 0xf7, 0x5a, 0xfb,
+                                                       0x35, 0xf7, 0x35, 0xb, 0x3, 0x23, 0xa, 0xb,
+                                                       0xfb, 0x5a, 0xfb, 0x35, 0xfb, 0x35, 0xfb, 0x5a,
+                                                       0xb, 0xf7, 0x48, 0x2d, 0xa, 0xb, 0x2e, 0xa,
+                                                       0xf7, 0x5a, 0xb, 0xfb, 0x35, 0xfb, 0x35, 0xfb,
+                                                       0x5a, 0x1e, 0xb, 0xfb, 0x5b, 0xf7, 0x35, 0xfb,
+                                                       0x35, 0xb, 0x46, 0xa, 0x24, 0xa, 0x27, 0xa,
+                                                       0x1e, 0xb, 0xf7, 0x25, 0x31, 0xa, 0xb, 0x3b,
+                                                       0xa, 0x2b, 0xa, 0xb, 0x2d, 0xa, 0xfb, 0x25,
+                                                       0xb, 0x2c, 0xa, 0xae, 0x16, 0x40, 0xa, 0x41,
+                                                       0xa, 0xf7, 0x48, 0x2f, 0xa, 0xfb, 0x48, 0xb,
+                                                       0x3e, 0xa, 0xfb, 0x48, 0xfb, 0x25, 0xb, 0xf7,
+                                                       0x7e, 0xf7, 0x3e, 0x5, 0xfb, 0xb5, 0x6, 0x32,
+                                                       0xf7, 0xa7, 0x32, 0xfb, 0xa7, 0x5, 0xfb, 0xb5,
+                                                       0x6, 0xf7, 0x7e, 0xfb, 0x3e, 0x5, 0x68, 0xfb,
+                                                       0x5b, 0x15, 0xe1, 0xf7, 0x6c, 0xfb, 0x58, 0xf7,
+                                                       0x10, 0xf7, 0x7c, 0x7c, 0xc4, 0xf7, 0x75, 0xc4,
+                                                       0xfb, 0x75, 0xf7, 0x7c, 0x9a, 0xfb, 0x58, 0xfb,
+                                                       0x10, 0xe1, 0xfb, 0x6c, 0xfb, 0x47, 0xf7, 0x29,
+                                                       0x5, 0xb, 0xfb, 0x47, 0x36, 0xa, 0xb, 0xf8,
+                                                       0xaa, 0xf8, 0x8d, 0x15, 0xaf, 0xae, 0x5, 0xa2,
+                                                       0x98, 0xa9, 0xa6, 0xac, 0x1b, 0xba, 0xc5, 0x5f,
+                                                       0x4d, 0x71, 0x75, 0x6b, 0x70, 0x7a, 0x1f, 0x6e,
+                                                       0x65, 0xc1, 0x8e, 0xb3, 0xbe, 0x93, 0xb6, 0x19,
+                                                       0xf7, 0x12, 0xe9, 0x71, 0xf7, 0x2e, 0xfb, 0x23,
+                                                       0xfb, 0x1b, 0x7d, 0x98, 0x7a, 0x95, 0x77, 0x92,
+                                                       0x19, 0xf7, 0x5, 0xf7, 0x16, 0x5, 0x7a, 0x65,
+                                                       0x87, 0x83, 0x7d, 0x1f, 0x2f, 0xfb, 0x4, 0x5,
+                                                       0x52, 0x84, 0x61, 0x50, 0x68, 0x87, 0x8b, 0x88,
+                                                       0x87, 0x1a, 0xb, 0x4f, 0xa, 0x32, 0xa, 0x30,
+                                                       0xb, 0xfb, 0x25, 0xf7, 0x25, 0xf7, 0x48, 0xb,
+                                                       0x15, 0x30, 0xa, 0x1e, 0xb, 0xa0, 0x76, 0xf9,
+                                                       0x48, 0x77, 0x1, 0xb, 0x95, 0x8, 0xb2, 0x9c,
+                                                       0xda, 0xc4, 0xba, 0x1a, 0xbd, 0x26, 0xa7, 0x64,
+                                                       0x90, 0x1e, 0x8a, 0x8e, 0x97, 0x9b, 0x97, 0x9c,
+                                                       0x95, 0x9c, 0x19, 0x87, 0x8e, 0xb, 0x3f, 0xa,
+                                                       0x1, 0xb, 0xae, 0x4d, 0xa, 0xb, 0x97, 0x6b,
+                                                       0x4a, 0xa, 0x9e, 0x7d, 0xa0, 0x81, 0x8, 0x64,
+                                                       0x7a, 0x3c, 0x45, 0xa, 0xb, 0x38, 0xa, 0xae,
+                                                       0xb, 0xfb, 0x25, 0xfb, 0x47, 0xb, 0x92, 0x76,
+                                                       0xf9, 0x63, 0x77, 0xb, 0xf7, 0x47, 0xf7, 0x25,
+                                                       0xb, 0xf7, 0x25, 0xf7, 0x47, 0xb, 0x15, 0xa6,
+                                                       0x9f, 0xa0, 0xa6, 0xa6, 0xa0, 0x76, 0x4b, 0xa,
+                                                       0xfb, 0xb4, 0x4, 0xa6, 0x9f, 0x9f, 0xa6, 0xa6,
+                                                       0xa0, 0x77, 0x4b, 0xa, 0xb, 0x5c, 0xa, 0x78,
+                                                       0x99, 0x76, 0x39, 0xa, 0xb, 0x50, 0xa, 0x51,
+                                                       0xa, 0xb, 0x52, 0x5c, 0x1a, 0x59, 0xf0, 0x6f,
+                                                       0xb2, 0x86, 0x1e, 0x8c, 0x88, 0x7f, 0x7b, 0x7f,
+                                                       0x7a, 0x81, 0x7a, 0x19, 0xb, 0x2b, 0xa, 0xf7,
+                                                       0x5a, 0xb, 0xa1, 0x6e, 0xa1, 0x6d, 0x65, 0x1a,
+                                                       0x7f, 0x88, 0x73, 0x7b, 0x72, 0x82, 0xc3, 0x9e,
+                                                       0x9f, 0x90, 0x9e, 0x8f, 0x9e, 0x1e, 0x6a, 0xa,
+                                                       0x89, 0x7c, 0x7b, 0x89, 0x7c, 0x1b, 0xb, 0x6a,
+                                                       0xa, 0x75, 0xa8, 0x75, 0xa9, 0xb1, 0x1a, 0x97,
+                                                       0x8e, 0xa3, 0x9b, 0xa4, 0x94, 0x53, 0x78, 0x77,
+                                                       0x86, 0x78, 0x87, 0x78, 0x1e, 0xfb, 0x2d, 0xc2,
+                                                       0x15, 0xb, 0xe0, 0xf7, 0xb, 0x76, 0xf7, 0x8c,
+                                                       0x77, 0xf7, 0xa0, 0x54, 0xa, 0xf9, 0xea, 0x3,
+                                                       0xae, 0xed, 0x15, 0xf9, 0xea, 0xf7, 0x8c, 0xfd,
+                                                       0xea, 0xf7, 0x8c, 0xb, 0x1f, 0x89, 0x89, 0x5,
+                                                       0x8e, 0x77, 0x76, 0x8c, 0x77, 0x1b, 0x86, 0x7,
+                                                       0x9c, 0x7c, 0xb, 0x70, 0x70, 0x76, 0x77, 0x70,
+                                                       0x70, 0x77, 0x9f, 0xa6, 0x1e, 0xb, 0xae, 0x12,
+                                                       0xae, 0xae, 0xb, 0xf7, 0xee, 0x15, 0xb, 0xb4,
+                                                       0x8f, 0x7f, 0xf7, 0x12, 0x62, 0xa, 0x52, 0xa,
+                                                       0xb, 0x9d, 0x15, 0xf7, 0x7e, 0xf7, 0x3e, 0xf7,
+                                                       0x7e, 0xfb, 0x3e, 0x31, 0xf7, 0xa7, 0xb, 0x15,
+                                                       0x7d, 0x96, 0x80, 0x99, 0x99, 0x96, 0x96, 0x99,
+                                                       0xb, 0x99, 0x80, 0x96, 0x7d, 0x7d, 0x80, 0x80,
+                                                       0x7d, 0x1e, 0xb, 0x88, 0x8c, 0x84, 0x9e, 0x81,
+                                                       0x9d, 0x81, 0x9c, 0x19, 0x87, 0x89, 0x5, 0xb,
+                                                       0x8e, 0x8a, 0x92, 0x78, 0x95, 0x79, 0x95, 0x7a,
+                                                       0x19, 0x8f, 0x8d, 0x5, 0xb, 0x77, 0x1, 0xae,
+                                                       0xb, 0x83, 0x83, 0x90, 0x94, 0x91, 0x8d, 0x90,
+                                                       0x8e, 0x90, 0x1f, 0xa2, 0xb3, 0xaf, 0x97, 0xb4,
+                                                       0x98, 0x8, 0xfb, 0x2d, 0xc2, 0x15, 0xb, 0xcc,
+                                                       0x77, 0xc8, 0x92, 0xc1, 0xc4, 0xb8, 0x5e, 0xf7,
+                                                       0x2e, 0xfb, 0x1, 0xb0, 0x70, 0xae, 0x8f, 0xf7,
+                                                       0x2e, 0xfb, 0x1b, 0x9d, 0xb, 0x87, 0x79, 0x89,
+                                                       0x79, 0x64, 0xa, 0x55, 0xa1, 0x5e, 0x1b, 0x60,
+                                                       0x81, 0x6c, 0x66, 0xb, 0xc3, 0x1b, 0xb7, 0xc1,
+                                                       0xbe, 0xac, 0xa4, 0x1f, 0x53, 0xa, 0xb, 0x8f,
+                                                       0x9d, 0x8d, 0x9d, 0x63, 0xa, 0xc1, 0x75, 0xb8,
+                                                       0x1b, 0xb6, 0x95, 0xaa, 0xb0, 0xb, 0x3d, 0xa,
+                                                       0xf7, 0x63, 0x3, 0xb, 0xf7, 0x27, 0x15, 0xa1,
+                                                       0x92, 0xa0, 0x95, 0x9e, 0x98, 0x8, 0xb, 0x88,
+                                                       0x9f, 0xa0, 0x8a, 0x9f, 0x1b, 0x90, 0x7, 0x7a,
+                                                       0x9a, 0xb, 0x93, 0x93, 0x86, 0x82, 0x85, 0x89,
+                                                       0x86, 0x88, 0x86, 0x1f, 0x74, 0x63, 0x67, 0x7f,
+                                                       0x62, 0x7e, 0x8, 0xb, 0xae, 0x70, 0xb0, 0x8b,
+                                                       0xb8, 0x62, 0xb8, 0xc0, 0xc1, 0x59, 0xc1, 0x8e,
+                                                       0xc8, 0x52, 0xc8, 0x77, 0xcc, 0xb, 0x7a, 0xfb,
+                                                       0x1b, 0x4b, 0xfb, 0x5b, 0x1a, 0x36, 0xc3, 0x21,
+                                                       0xec, 0xe5, 0xc2, 0xd4, 0xd2, 0xc3, 0xb, 0xa7,
+                                                       0xd8, 0xcf, 0xaf, 0xb8, 0x5e, 0xf7, 0xa, 0xfb,
+                                                       0xa, 0xf7, 0x22, 0x38, 0xc6, 0x83, 0x92, 0xb,
+                                                       0x74, 0x4e, 0x99, 0xa8, 0x98, 0x99, 0x8d, 0x95,
+                                                       0xbb, 0xa3, 0x72, 0x6e, 0xad, 0x1f, 0xb, 0x52,
+                                                       0x1b, 0x5f, 0x55, 0x58, 0x6a, 0x72, 0x1f, 0xb,
+                                                       0x9d, 0x90, 0x8a, 0x90, 0x90, 0x1a, 0x71, 0xaf,
+                                                       0xb, 0x79, 0x86, 0x8c, 0x86, 0x86, 0x1a, 0xa5,
+                                                       0x67, 0xb, 0x13, 0xb2, 0x5a, 0x96, 0x56, 0xa0,
+                                                       0xb, 0xfb, 0xde, 0x6c, 0x76, 0xf9, 0xa2, 0x77,
+                                                       0x1, 0xaf, 0xf8, 0x49, 0x3, 0xb, 0xf7, 0x22,
+                                                       0xfb, 0xb, 0xc6, 0x51, 0xf7, 0xa, 0x5d, 0xb8,
+                                                       0x5f, 0xb8, 0xb, 0x9c, 0xf7, 0x1b, 0xcb, 0xf7,
+                                                       0x5b, 0x1a, 0xe0, 0x53, 0xf5, 0x2a, 0xb, 0xa5,
+                                                       0xa5, 0xa1, 0x76, 0x71, 0x71, 0x75, 0x75, 0x71,
+                                                       0x71, 0x75, 0xb, 0xf7, 0x4a, 0xfb, 0x6b, 0x15,
+                                                       0xb, 0xfb, 0x7f, 0x15, 0xb, 0xf7, 0x4a, 0x72,
+                                                       0xa4, 0xf7, 0x84, 0xa4, 0x72, 0xf7, 0x4a, 0xb,
+                                                       0x15, 0xf8, 0xad, 0xf8, 0xa8, 0xfc, 0xad, 0x7,
+                                                       0xe, 0x13, 0xe4, 0x82, 0xb9, 0x55, 0x40, 0xb,
+                                                       0x13, 0xb2, 0x96, 0x96, 0x56, 0xa0, 0xb, 0x13,
+                                                       0xb2, 0x9a, 0x96, 0x55, 0xa0, 0xb, 0x75, 0x84,
+                                                       0x76, 0x81, 0x78, 0x7e, 0xb, 0xf7, 0x11, 0xf8,
+                                                       0x78, 0xf7, 0x2, 0xb, 0xf7, 0x78, 0xf8, 0x6b,
+                                                       0x12, 0xb0, 0xb, 0xae, 0x1, 0xae, 0xae, 0xb,
+                                                       0x5, 0x8d, 0x7, 0xb, 0xf7, 0xf3, 0xf7, 0x7c,
+                                                       0xfb, 0xf3, 0xf7, 0x7c, 0x5, 0xb, 0x7e, 0x7d,
+                                                       0x89, 0x81, 0x5b, 0x73, 0xa4, 0xa8, 0x69, 0xb,
+                                                       0x15, 0x9b, 0x7b, 0x9d, 0x82, 0x90, 0x90, 0x90,
+                                                       0x90, 0xb, 0x15, 0x90, 0x86, 0x9d, 0x94, 0x9b,
+                                                       0x9b, 0x9b, 0x9b, 0xb, 0x3, 0xae, 0x16, 0xb,
+                                                       0x9a, 0x85, 0x97, 0x1e, 0x82, 0x9d, 0x80, 0x98,
+                                                       0xb, 0x99, 0x8b, 0xf7, 0x2, 0x3e, 0xb7, 0xac,
+                                                       0x99, 0xb, 0xfb, 0xad, 0x5, 0xf7, 0x35, 0x7,
+                                                       0xe, 0x13, 0x94, 0x54, 0xec, 0x1b, 0xb, 0x1f,
+                                                       0x8d, 0x8d, 0x5, 0xb, 0x5, 0x89, 0x7, 0xb
+                                                      };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitFixed.c b/core/src/fxge/fontdata/chromefontdata/FoxitFixed.c
new file mode 100644
index 0000000..8bae0fa
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitFixed.c
@@ -0,0 +1,2208 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitFixedFontData [17597] = {0x1,
+                                                    0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xe,
+                                                    0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,
+                                                    0x65, 0x64, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1,
+                                                    0x1, 0x23, 0xf8, 0x10, 0x0, 0xf8, 0x2a, 0x1,
+                                                    0xf8, 0x2b, 0x2, 0xf8, 0x2b, 0x3, 0xf8, 0x18,
+                                                    0x4, 0x6f, 0xfb, 0x8d, 0xf9, 0x8, 0xf9, 0xb7,
+                                                    0x5, 0xf7, 0x85, 0xf, 0xf9, 0x6c, 0x11, 0xaa,
+                                                    0x1c, 0x3e, 0x6b, 0x12, 0x0, 0x11, 0x1, 0x1,
+                                                    0x5, 0xb, 0xd, 0x11, 0x19, 0x22, 0x2b, 0x34,
+                                                    0x3e, 0x45, 0x4b, 0x4d, 0x51, 0x5d, 0x65, 0x8f,
+                                                    0x9e, 0x45, 0x75, 0x72, 0x6f, 0x47, 0x63, 0x61,
+                                                    0x72, 0x6f, 0x6e, 0x49, 0x4a, 0x49, 0x64, 0x6f,
+                                                    0x74, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c,
+                                                    0x61, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f,
+                                                    0x74, 0x68, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64,
+                                                    0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77,
+                                                    0x6c, 0x65, 0x66, 0x74, 0x61, 0x72, 0x72, 0x6f,
+                                                    0x77, 0x72, 0x69, 0x67, 0x68, 0x74, 0x61, 0x72,
+                                                    0x72, 0x6f, 0x77, 0x75, 0x70, 0x67, 0x63, 0x61,
+                                                    0x72, 0x6f, 0x6e, 0x69, 0x6a, 0x6c, 0x69, 0x72,
+                                                    0x61, 0x70, 0x72, 0x65, 0x73, 0x63, 0x72, 0x69,
+                                                    0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x65,
+                                                    0x64, 0x69, 0x6c, 0x6c, 0x61, 0x20, 0x20, 0x20,
+                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                    0x20, 0x20, 0x68, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
+                                                    0x68, 0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78,
+                                                    0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0,
+                                                    0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab, 0x0,
+                                                    0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0,
+                                                    0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1, 0x0,
+                                                    0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3, 0x0,
+                                                    0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87, 0x0,
+                                                    0x27, 0x0, 0x28, 0x1, 0x88, 0x0, 0x29, 0x0,
+                                                    0x2a, 0x1, 0x89, 0x0, 0xb6, 0x0, 0xb7, 0x0,
+                                                    0xb8, 0x1, 0x8a, 0x0, 0xb9, 0x0, 0x2b, 0x0,
+                                                    0x2c, 0x0, 0x2d, 0x0, 0x8c, 0x0, 0x2e, 0x0,
+                                                    0x2f, 0x0, 0xba, 0x0, 0x30, 0x0, 0x8e, 0x0,
+                                                    0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0,
+                                                    0x8d, 0x0, 0xbf, 0x0, 0x31, 0x0, 0x32, 0x0,
+                                                    0x33, 0x0, 0x34, 0x0, 0xc0, 0x1, 0x8b, 0x0,
+                                                    0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1, 0x0,
+                                                    0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37, 0x0,
+                                                    0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5, 0x0,
+                                                    0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42, 0x0,
+                                                    0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca, 0x0,
+                                                    0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc, 0x1,
+                                                    0x8c, 0x1, 0x8d, 0x1, 0x8e, 0x1, 0x8f, 0x1,
+                                                    0x90, 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0,
+                                                    0x21, 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0,
+                                                    0x5d, 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0,
+                                                    0x3e, 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0,
+                                                    0x44, 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0,
+                                                    0x61, 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0,
+                                                    0xaa, 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0,
+                                                    0x71, 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0,
+                                                    0x5, 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0,
+                                                    0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0,
+                                                    0x19, 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0,
+                                                    0x1e, 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0,
+                                                    0x47, 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0,
+                                                    0x65, 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x1,
+                                                    0x91, 0x0, 0x95, 0x0, 0x7c, 0x0, 0x1f, 0x0,
+                                                    0x6a, 0x0, 0x78, 0x0, 0x6b, 0x0, 0x6c, 0x0,
+                                                    0x49, 0x0, 0x86, 0x0, 0xe, 0x0, 0x4a, 0x0,
+                                                    0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x1,
+                                                    0x92, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0,
+                                                    0x1d, 0x1, 0x93, 0x0, 0x97, 0x0, 0x92, 0x0,
+                                                    0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98, 0x0,
+                                                    0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7, 0x0,
+                                                    0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9, 0x0,
+                                                    0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb, 0x0,
+                                                    0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96, 0x0,
+                                                    0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc, 0x0,
+                                                    0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa, 0x0,
+                                                    0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a, 0x0,
+                                                    0xc, 0x0, 0x9c, 0x1, 0x94, 0x0, 0x52, 0x0,
+                                                    0x20, 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0,
+                                                    0x69, 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0,
+                                                    0x75, 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0,
+                                                    0x84, 0x0, 0x54, 0x0, 0xdd, 0x1, 0x95, 0x0,
+                                                    0x66, 0x0, 0x1c, 0x0, 0x18, 0x0, 0x17, 0x0,
+                                                    0x10, 0x0, 0x1, 0x0, 0x62, 0x0, 0x55, 0x0,
+                                                    0xa2, 0x0, 0x14, 0x0, 0xa3, 0x0, 0xa9, 0x0,
+                                                    0x7f, 0x0, 0x99, 0x0, 0x13, 0x0, 0xa4, 0x0,
+                                                    0x56, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0,
+                                                    0xe1, 0x0, 0x40, 0x0, 0x57, 0x0, 0x58, 0x0,
+                                                    0x59, 0x0, 0x5a, 0x0, 0xe2, 0x0, 0xe3, 0x0,
+                                                    0x64, 0x0, 0x5b, 0x0, 0xe4, 0x0, 0x11, 0x0,
+                                                    0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x4e,
+                                                    0x0, 0xa8, 0x0, 0xc5, 0x0, 0xf1, 0x1, 0x22,
+                                                    0x1, 0x41, 0x1, 0x8a, 0x1, 0xd7, 0x2, 0x3b,
+                                                    0x2, 0x86, 0x3, 0x4, 0x3, 0x3e, 0x3, 0x79,
+                                                    0x3, 0x92, 0x3, 0xbf, 0x3, 0xf5, 0x4, 0xa,
+                                                    0x4, 0x57, 0x4, 0xd4, 0x5, 0xb, 0x5, 0x3c,
+                                                    0x5, 0x71, 0x5, 0xac, 0x5, 0xc9, 0x6, 0x15,
+                                                    0x6, 0x32, 0x6, 0x5b, 0x6, 0x78, 0x6, 0xa1,
+                                                    0x6, 0xbd, 0x6, 0xef, 0x7, 0x39, 0x7, 0x5b,
+                                                    0x7, 0x95, 0x7, 0xd5, 0x8, 0x7, 0x8, 0x7a,
+                                                    0x8, 0xc3, 0x9, 0x1c, 0x9, 0x39, 0x9, 0x4b,
+                                                    0x9, 0x6d, 0x9, 0x88, 0xa, 0x1, 0xa, 0x47,
+                                                    0xa, 0x8b, 0xb, 0x27, 0xb, 0x83, 0xb, 0xfa,
+                                                    0xc, 0x80, 0xd, 0x26, 0xd, 0x5f, 0xd, 0xb9,
+                                                    0xd, 0xf8, 0xe, 0x15, 0xe, 0x25, 0xe, 0x46,
+                                                    0xe, 0x61, 0xe, 0x92, 0xe, 0xd8, 0xf, 0x1d,
+                                                    0xf, 0x5a, 0xf, 0x78, 0xf, 0x9e, 0xf, 0xc9,
+                                                    0x10, 0x10, 0x10, 0x73, 0x10, 0x89, 0x10, 0xab,
+                                                    0x10, 0xbd, 0x10, 0xf4, 0x11, 0x88, 0x11, 0x9e,
+                                                    0x12, 0x1d, 0x12, 0x5b, 0x12, 0x79, 0x12, 0xa1,
+                                                    0x12, 0xae, 0x12, 0xc6, 0x12, 0xec, 0x13, 0x1b,
+                                                    0x13, 0x5f, 0x13, 0x95, 0x14, 0x31, 0x14, 0x84,
+                                                    0x14, 0xe3, 0x14, 0xfb, 0x15, 0x10, 0x15, 0x61,
+                                                    0x15, 0xb3, 0x15, 0xd1, 0x15, 0xed, 0x16, 0x11,
+                                                    0x16, 0x2e, 0x16, 0x4f, 0x16, 0x96, 0x16, 0xb8,
+                                                    0x17, 0x37, 0x17, 0x77, 0x17, 0xd2, 0x17, 0xf7,
+                                                    0x18, 0xb, 0x18, 0x1e, 0x18, 0xa6, 0x19, 0x15,
+                                                    0x19, 0x73, 0x19, 0x96, 0x19, 0xda, 0x1a, 0x13,
+                                                    0x1a, 0x35, 0x1a, 0x58, 0x1a, 0xdf, 0x1a, 0xf1,
+                                                    0x1b, 0x7, 0x1b, 0x5b, 0x1b, 0x71, 0x1b, 0x93,
+                                                    0x1b, 0xa5, 0x1b, 0xc1, 0x1c, 0x36, 0x1c, 0x82,
+                                                    0x1c, 0x94, 0x1c, 0xa7, 0x1c, 0xc6, 0x1d, 0x38,
+                                                    0x1d, 0x70, 0x1d, 0x9f, 0x1d, 0xe4, 0x1e, 0x17,
+                                                    0x1e, 0x6b, 0x1e, 0x98, 0x1e, 0xf6, 0x1f, 0x2c,
+                                                    0x1f, 0x41, 0x1f, 0x7b, 0x1f, 0xc1, 0x20, 0x4a,
+                                                    0x20, 0x5b, 0x20, 0x82, 0x20, 0xb1, 0x20, 0xe2,
+                                                    0x21, 0x2, 0x21, 0x23, 0x21, 0x67, 0x21, 0x7d,
+                                                    0x21, 0x90, 0x21, 0xb5, 0x21, 0xcd, 0x21, 0xf6,
+                                                    0x22, 0x15, 0x22, 0x2d, 0x22, 0x85, 0x22, 0xc6,
+                                                    0x23, 0xc, 0x23, 0x25, 0x23, 0x4a, 0x23, 0xeb,
+                                                    0x24, 0x2, 0x24, 0x36, 0x24, 0x91, 0x24, 0xa6,
+                                                    0x24, 0xb9, 0x25, 0xa, 0x25, 0x36, 0x25, 0x76,
+                                                    0x25, 0xc8, 0x26, 0x55, 0x26, 0xb1, 0x26, 0xf3,
+                                                    0x27, 0xc, 0x27, 0x33, 0x27, 0x53, 0x27, 0xd5,
+                                                    0x28, 0x4, 0x28, 0x1d, 0x28, 0x41, 0x28, 0xac,
+                                                    0x29, 0xf, 0x29, 0x33, 0x29, 0x8f, 0x29, 0xca,
+                                                    0x2a, 0x3f, 0x2a, 0x92, 0x2a, 0xe1, 0x2b, 0xb,
+                                                    0x2b, 0x3e, 0x2b, 0x71, 0x2b, 0xb3, 0x2b, 0xcc,
+                                                    0x2b, 0xed, 0x2c, 0x52, 0x2c, 0x77, 0x2c, 0xa7,
+                                                    0x2d, 0x19, 0x2d, 0x66, 0x2d, 0xab, 0x2e, 0x7,
+                                                    0x2e, 0x1e, 0x2e, 0x26, 0x2e, 0x48, 0x2e, 0x50,
+                                                    0x2e, 0x5e, 0x2e, 0x6c, 0x2e, 0x7a, 0x2e, 0x90,
+                                                    0x2e, 0xda, 0x2f, 0x66, 0x2f, 0x9f, 0x30, 0xc,
+                                                    0x30, 0x94, 0x31, 0x3a, 0x31, 0xe9, 0x32, 0x9,
+                                                    0x32, 0x27, 0x32, 0x79, 0x32, 0x90, 0x32, 0x91,
+                                                    0x33, 0x25, 0x33, 0x63, 0x33, 0xbd, 0x34, 0x1f,
+                                                    0x34, 0xb8, 0x35, 0x15, 0x35, 0x56, 0x35, 0x9a,
+                                                    0x35, 0xe0, 0x36, 0x1f, 0x36, 0x64, 0x36, 0x7b,
+                                                    0x36, 0x9b, 0x36, 0xcd, 0x36, 0xe4, 0x36, 0xf4,
+                                                    0x37, 0x25, 0x37, 0x65, 0x37, 0xb2, 0x37, 0xec,
+                                                    0x38, 0x36, 0x38, 0x8f, 0x38, 0xe7, 0x39, 0x10,
+                                                    0x39, 0x5a, 0x39, 0xa7, 0xe, 0x8b, 0xc1, 0xf7,
+                                                    0x4, 0xc1, 0xf7, 0xb4, 0xc1, 0x1, 0x8e, 0xf7,
+                                                    0x63, 0xab, 0xee, 0xbf, 0xf7, 0x60, 0x3, 0x8e,
+                                                    0x16, 0xf7, 0x63, 0xc1, 0x33, 0x6, 0xb6, 0xf7,
+                                                    0x4, 0x5, 0xf7, 0xaa, 0x6, 0xb7, 0xfb, 0x4,
+                                                    0x5, 0x2d, 0x55, 0xf7, 0x60, 0xc1, 0x56, 0x6,
+                                                    0xfb, 0x5f, 0xf8, 0x90, 0x5, 0xfb, 0x81, 0x55,
+                                                    0xf7, 0x1e, 0x6, 0xfb, 0x46, 0xfc, 0x5a, 0x5,
+                                                    0x4e, 0x6, 0xf7, 0x4a, 0xf7, 0x3a, 0x15, 0xf7,
+                                                    0x7, 0xf7, 0xba, 0xf7, 0xf, 0xfb, 0xba, 0x5,
+                                                    0xe, 0x8b, 0xc2, 0xf7, 0x3, 0xc2, 0xac, 0xc2,
+                                                    0xf7, 0x5b, 0xc1, 0x1, 0xdc, 0xc4, 0xf7, 0xa,
+                                                    0xc3, 0x8b, 0xc2, 0xdc, 0xc1, 0x9c, 0xc2, 0x3,
+                                                    0xa5, 0x16, 0xf7, 0x5a, 0xc2, 0x35, 0x6, 0xb7,
+                                                    0xf7, 0x3, 0x5, 0xf7, 0x16, 0xfb, 0x3a, 0xf7,
+                                                    0x9a, 0xf7, 0x2e, 0x54, 0x28, 0xfb, 0x2c, 0xf7,
+                                                    0x5b, 0xdc, 0x53, 0xc1, 0xf7, 0x3a, 0x55, 0x54,
+                                                    0x3a, 0xf7, 0x5b, 0xf7, 0x2c, 0x25, 0xc2, 0xf7,
+                                                    0x30, 0xfc, 0x2c, 0x55, 0xe5, 0x6, 0xfb, 0x43,
+                                                    0xfc, 0x59, 0x5, 0x54, 0x6, 0xf7, 0x44, 0xf7,
+                                                    0x3a, 0x15, 0xf7, 0x2, 0xf7, 0xb2, 0x5, 0xfb,
+                                                    0xb2, 0x7, 0xe, 0x4d, 0xa, 0xf7, 0x78, 0x77,
+                                                    0x1, 0x54, 0xa, 0x3, 0x8e, 0x16, 0x24, 0xa,
+                                                    0xfb, 0x95, 0xf8, 0x18, 0x15, 0xf7, 0xac, 0xf0,
+                                                    0x6a, 0xd4, 0xfb, 0x96, 0xfb, 0x24, 0x5, 0xe,
+                                                    0x4d, 0xa, 0xf7, 0x2f, 0xc2, 0x1, 0x54, 0xa,
+                                                    0x3, 0xf7, 0x2d, 0xf8, 0xf1, 0x15, 0xf7, 0x26,
+                                                    0xf7, 0x7, 0xf7, 0x22, 0xfb, 0x7, 0xb3, 0x9d,
+                                                    0xfb, 0x24, 0xf7, 0x2c, 0x5, 0x3d, 0x6, 0xfb,
+                                                    0x25, 0xfb, 0x2c, 0x5, 0xfb, 0x3, 0xfd, 0x3,
+                                                    0x15, 0x24, 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x11,
+                                                    0xc1, 0xf7, 0xaa, 0xc1, 0xda, 0xf7, 0x9, 0x12,
+                                                    0x8e, 0xf7, 0x63, 0x73, 0xdc, 0xca, 0xdc, 0x79,
+                                                    0xf7, 0x60, 0x13, 0xf6, 0xf7, 0xde, 0xf9, 0x18,
+                                                    0x72, 0xa, 0xfb, 0x24, 0xfb, 0x9, 0x72, 0xa,
+                                                    0xfb, 0x4b, 0xfd, 0x8d, 0x15, 0x2d, 0xa, 0x6,
+                                                    0x13, 0xe9, 0x39, 0xa, 0xe, 0x4d, 0xa, 0x12,
+                                                    0x54, 0xa, 0x17, 0x8e, 0x16, 0x25, 0xa, 0x13,
+                                                    0x40, 0xf7, 0x3, 0xf7, 0xbb, 0xf7, 0xb, 0xfb,
+                                                    0xbb, 0x5, 0xfb, 0x9f, 0xf8, 0x7d, 0x79, 0xa,
+                                                    0xf7, 0x24, 0x5, 0xe, 0x4d, 0xa, 0xb0, 0xbd,
+                                                    0xdb, 0xbe, 0x12, 0x8e, 0xf7, 0x63, 0x83, 0xbe,
+                                                    0xdb, 0xc0, 0x92, 0xf7, 0x60, 0x13, 0xfb, 0x80,
+                                                    0xf7, 0x5e, 0xf9, 0x47, 0x15, 0x58, 0xb4, 0x65,
+                                                    0xbe, 0xbe, 0xb4, 0xb1, 0xbe, 0xbe, 0x62, 0xb4,
+                                                    0x58, 0x58, 0x62, 0x62, 0x58, 0x1e, 0xbe, 0x8c,
+                                                    0x15, 0xa1, 0x9d, 0x9d, 0xa1, 0xa1, 0x9d, 0x79,
+                                                    0x75, 0x75, 0x79, 0x79, 0x75, 0x75, 0x79, 0x9d,
+                                                    0xa1, 0x1e, 0x13, 0xfd, 0x80, 0xfb, 0x8e, 0xfd,
+                                                    0x48, 0x15, 0x24, 0xa, 0xe, 0x8b, 0xc1, 0xf7,
+                                                    0xb, 0xc1, 0xf7, 0xa7, 0xc1, 0xdd, 0xbc, 0x1,
+                                                    0x54, 0xa, 0x3, 0xf7, 0x31, 0xf9, 0x17, 0x15,
+                                                    0x9e, 0x93, 0x9e, 0xb4, 0xbc, 0x1b, 0xa1, 0x9d,
+                                                    0x7e, 0x7c, 0xa0, 0x1f, 0x79, 0xa4, 0xa7, 0x78,
+                                                    0xb2, 0x1b, 0xcf, 0xad, 0xca, 0xb1, 0x96, 0x1f,
+                                                    0x58, 0x94, 0x5, 0x73, 0x83, 0x72, 0x66, 0x65,
+                                                    0x1b, 0x75, 0x7a, 0x9d, 0x9c, 0x75, 0x1f, 0x9a,
+                                                    0x77, 0x72, 0x9a, 0x63, 0x1b, 0x52, 0x5b, 0x5d,
+                                                    0x56, 0x78, 0x1f, 0x23, 0xfd, 0x21, 0x15, 0x24,
+                                                    0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0xc2, 0xf7,
+                                                    0x5c, 0xc1, 0x12, 0xf7, 0xb, 0xc2, 0xf7, 0xb0,
+                                                    0xc9, 0x74, 0xc8, 0x13, 0xf4, 0xb5, 0x16, 0xf7,
+                                                    0xbd, 0x6, 0xf7, 0x17, 0xe3, 0xb6, 0xf7, 0x0,
+                                                    0xd8, 0x4b, 0xb5, 0x4b, 0x97, 0x1f, 0x13, 0xf8,
+                                                    0xc0, 0x9b, 0xb0, 0xc7, 0xc1, 0x1a, 0xf7, 0xb,
+                                                    0x34, 0xaa, 0xfb, 0xc, 0x1e, 0xfb, 0xa3, 0x55,
+                                                    0xd8, 0xfc, 0x5a, 0x3e, 0x6, 0xf7, 0x18, 0xf7,
+                                                    0x8f, 0x15, 0xf7, 0x5f, 0x7, 0xf7, 0x2d, 0xf7,
+                                                    0x17, 0x92, 0x24, 0x32, 0x34, 0x79, 0x55, 0x1f,
+                                                    0xfb, 0x23, 0xfb, 0x8f, 0x15, 0xf7, 0x58, 0x7,
+                                                    0x13, 0xf4, 0xf7, 0x5d, 0xf7, 0xe, 0x7c, 0x36,
+                                                    0x37, 0x2e, 0x7f, 0x4a, 0x1f, 0xe, 0x79, 0xc1,
+                                                    0xf8, 0x7e, 0xc1, 0x1, 0xb9, 0xc3, 0xf8, 0x13,
+                                                    0xc1, 0x3, 0xf8, 0x9b, 0xf5, 0x15, 0x64, 0x56,
+                                                    0x39, 0x6c, 0x47, 0x1b, 0xfb, 0x9, 0x2a, 0xe9,
+                                                    0xf7, 0x32, 0xf7, 0x3f, 0xf7, 0x1f, 0xce, 0xd6,
+                                                    0xcb, 0xd5, 0x64, 0x59, 0xaa, 0x1f, 0x31, 0xc1,
+                                                    0xf7, 0x7d, 0x55, 0x4e, 0x7, 0xbd, 0x56, 0x4c,
+                                                    0x96, 0x56, 0x1b, 0xfb, 0x31, 0xfb, 0x5, 0xfb,
+                                                    0x1f, 0xfb, 0x2d, 0xfb, 0x39, 0xec, 0xfb, 0x21,
+                                                    0xf7, 0x41, 0xda, 0xe8, 0xa9, 0xb8, 0xc8, 0x1f,
+                                                    0xe, 0xfb, 0x16, 0x76, 0xf7, 0x3f, 0xbf, 0xf8,
+                                                    0x5d, 0xbe, 0x1, 0xbd, 0xc4, 0xf8, 0x15, 0xc4,
+                                                    0x3, 0xf7, 0x7c, 0xfb, 0xb, 0x15, 0x83, 0x92,
+                                                    0xa2, 0x73, 0xa7, 0x1b, 0xad, 0xb0, 0xa0, 0xc5,
+                                                    0xab, 0x7a, 0xa8, 0x6f, 0x94, 0x1f, 0x8d, 0xa1,
+                                                    0x5, 0xe6, 0xd9, 0xa3, 0xb5, 0xc9, 0x1f, 0x73,
+                                                    0xbb, 0x5, 0x66, 0x55, 0x47, 0x72, 0x46, 0x1b,
+                                                    0xfb, 0x15, 0x29, 0xe1, 0xf7, 0x28, 0xf7, 0x43,
+                                                    0xf7, 0x1f, 0xbb, 0xd7, 0xcc, 0xc7, 0x6e, 0x5f,
+                                                    0xb8, 0x1f, 0x35, 0xc4, 0xf7, 0x66, 0x52, 0x52,
+                                                    0x7, 0xbd, 0x43, 0x59, 0x92, 0x54, 0x1b, 0xfb,
+                                                    0x33, 0x21, 0xfb, 0x11, 0xfb, 0x24, 0xfb, 0x1e,
+                                                    0xd4, 0xfb, 0xe, 0xf7, 0x28, 0x70, 0x1f, 0x82,
+                                                    0x42, 0x5, 0x8f, 0x94, 0x94, 0x8b, 0x94, 0x1b,
+                                                    0x9a, 0x97, 0x7d, 0x7f, 0x76, 0x7d, 0x81, 0x7c,
+                                                    0x7d, 0x7b, 0x90, 0x9a, 0x82, 0x1f, 0xe, 0x46,
+                                                    0xa, 0xf7, 0x3, 0xc4, 0xf7, 0xe6, 0xc6, 0x3,
+                                                    0xad, 0x16, 0xf7, 0x7a, 0x6, 0xf7, 0x21, 0xf7,
+                                                    0x34, 0xc4, 0xf7, 0x7b, 0xf7, 0x62, 0xfb, 0x1c,
+                                                    0xcf, 0xfb, 0x39, 0x1f, 0xfb, 0x7a, 0x54, 0xd8,
+                                                    0xfc, 0x58, 0x3e, 0x6, 0xf7, 0x1a, 0x16, 0xf8,
+                                                    0x58, 0xeb, 0x7, 0xf7, 0x31, 0xe0, 0x47, 0xfb,
+                                                    0x2b, 0xfb, 0x35, 0x31, 0x43, 0xfb, 0x2c, 0x1f,
+                                                    0xe, 0x8b, 0xc0, 0xf7, 0x5c, 0xc1, 0xf7, 0x5d,
+                                                    0xc1, 0x1, 0xf7, 0x1a, 0xc3, 0xf7, 0x7, 0xc4,
+                                                    0xef, 0xc3, 0x3, 0xbf, 0x16, 0xf8, 0x66, 0xf7,
+                                                    0x4f, 0x53, 0xfb, 0x1a, 0xfb, 0xa4, 0xf7, 0x5c,
+                                                    0xf7, 0x7, 0x39, 0xc4, 0xf7, 0x6f, 0x52, 0x38,
+                                                    0xfb, 0x7, 0xf7, 0x5d, 0xf7, 0xa4, 0xfb, 0x1a,
+                                                    0xc3, 0xf7, 0x50, 0xfc, 0x66, 0x55, 0xdd, 0xfc,
+                                                    0x5b, 0x39, 0x6, 0xe, 0x47, 0xa, 0xf7, 0x58,
+                                                    0xf8, 0xfe, 0x15, 0xf7, 0xb8, 0xf0, 0x69, 0xd5,
+                                                    0xfb, 0xa3, 0xfb, 0x25, 0x5, 0xfb, 0x18, 0xfd,
+                                                    0x1c, 0x15, 0x2f, 0xa, 0xe, 0x4e, 0xa, 0xf7,
+                                                    0x7a, 0x77, 0x12, 0x61, 0xa, 0x17, 0xf7, 0x36,
+                                                    0xf9, 0x5, 0x15, 0x13, 0xfe, 0xf7, 0x2d, 0xf7,
+                                                    0x7, 0xf7, 0x29, 0xfb, 0x7, 0xb5, 0x9d, 0xfb,
+                                                    0x2b, 0xf7, 0x2c, 0x5, 0x39, 0x6, 0xfb, 0x2b,
+                                                    0xfb, 0x2b, 0x5, 0x44, 0xfd, 0x18, 0x15, 0x2f,
+                                                    0xa, 0xe, 0x4e, 0xa, 0xe5, 0xf7, 0x8, 0x12,
+                                                    0xf7, 0x1a, 0xc2, 0x93, 0xe0, 0xcb, 0xe1, 0x3c,
+                                                    0xc4, 0xdd, 0xc3, 0x13, 0xfe, 0x80, 0xf7, 0xee,
+                                                    0xf9, 0x23, 0x15, 0xe1, 0xf7, 0x8, 0x35, 0x6,
+                                                    0xfb, 0x29, 0xfb, 0x8, 0x15, 0xe0, 0xf7, 0x8,
+                                                    0x36, 0x6, 0xfb, 0x26, 0xfd, 0x97, 0x15, 0x40,
+                                                    0xa, 0x6, 0x13, 0xfd, 0x80, 0x2e, 0xa, 0xe,
+                                                    0x47, 0xa, 0xbe, 0x16, 0x2f, 0xa, 0xf8, 0x27,
+                                                    0xf8, 0xc9, 0x15, 0x96, 0xa9, 0xfb, 0xa4, 0xf7,
+                                                    0x24, 0x69, 0x42, 0x5, 0xe, 0x8b, 0xc1, 0xf7,
+                                                    0x56, 0xc0, 0xf7, 0x63, 0xc1, 0x1, 0xf7, 0x1,
+                                                    0xc3, 0xf7, 0xeb, 0xcb, 0x3, 0xa7, 0x16, 0xf7,
+                                                    0x8d, 0x6, 0xf7, 0x35, 0xf7, 0x1a, 0xc4, 0xf7,
+                                                    0x7f, 0xf7, 0x68, 0xfb, 0x33, 0xc5, 0xfb, 0x37,
+                                                    0x1f, 0xfb, 0x72, 0x55, 0xdc, 0xfb, 0x63, 0x3d,
+                                                    0x56, 0xd9, 0xfb, 0x56, 0x3a, 0x6, 0xf7, 0x1d,
+                                                    0x16, 0xf7, 0x56, 0xf7, 0x4d, 0xc0, 0xfb, 0x4d,
+                                                    0xf7, 0x63, 0xe0, 0x7, 0xf7, 0x37, 0xea, 0x4c,
+                                                    0xfb, 0x2d, 0xfb, 0x3b, 0x41, 0x44, 0xfb, 0x31,
+                                                    0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0x27, 0xbf, 0xc3,
+                                                    0xc0, 0xf7, 0x2b, 0xbe, 0x1, 0xd8, 0xc7, 0xf8,
+                                                    0x25, 0xc6, 0x3, 0x8e, 0xf7, 0x57, 0x15, 0xe0,
+                                                    0x6, 0xfb, 0x9, 0xaa, 0xe8, 0x3d, 0xf7, 0x30,
+                                                    0x1b, 0xde, 0xdc, 0xa6, 0xb6, 0xcc, 0x1f, 0x71,
+                                                    0xb8, 0x5, 0x65, 0x53, 0x44, 0x72, 0x44, 0x1b,
+                                                    0x20, 0x35, 0xb8, 0xed, 0x6b, 0x1f, 0xf7, 0x83,
+                                                    0x6, 0xa1, 0xbf, 0x5, 0xfb, 0xa4, 0x6, 0x9b,
+                                                    0x89, 0xa7, 0x8d, 0x9b, 0x1e, 0xf7, 0xb7, 0x6,
+                                                    0x9f, 0xc0, 0x5, 0xfb, 0xc1, 0x6, 0xe4, 0xa4,
+                                                    0xd8, 0xc9, 0xf0, 0x1b, 0xd5, 0xd5, 0x73, 0x64,
+                                                    0xb3, 0x1f, 0x3e, 0xc6, 0xf7, 0x53, 0x50, 0x5a,
+                                                    0x7, 0xac, 0x56, 0x54, 0x9b, 0x3e, 0x1b, 0xfb,
+                                                    0x1f, 0x28, 0x33, 0xfb, 0x6, 0x6e, 0x1f, 0x4e,
+                                                    0x6, 0x75, 0x56, 0x5, 0xd5, 0x6, 0x70, 0x8c,
+                                                    0x75, 0x8c, 0x80, 0x1e, 0x55, 0x6, 0xe, 0x8b,
+                                                    0xc2, 0xf7, 0x5f, 0xc2, 0xf7, 0x56, 0xc2, 0x1,
+                                                    0xf7, 0x18, 0xc2, 0xf7, 0x35, 0xc2, 0xe3, 0xc2,
+                                                    0x3, 0xc1, 0x16, 0xf7, 0x9c, 0xc2, 0xfb, 0x17,
+                                                    0xf7, 0x5f, 0xf7, 0x35, 0x38, 0xc2, 0xf7, 0x72,
+                                                    0x54, 0x37, 0xfb, 0x35, 0xf7, 0x56, 0xf7, 0xc4,
+                                                    0xfb, 0x11, 0xc2, 0xf7, 0x48, 0xfc, 0x80, 0x54,
+                                                    0xd9, 0xfc, 0x58, 0x3d, 0x6, 0xe, 0x79, 0xc2,
+                                                    0xf7, 0x39, 0xc2, 0xf7, 0xa0, 0xc2, 0x1, 0xad,
+                                                    0xc5, 0xf8, 0x12, 0xc2, 0x3, 0xf7, 0xcc, 0x7c,
+                                                    0xa, 0x7b, 0x6a, 0x48, 0x79, 0x54, 0x1b, 0xfb,
+                                                    0x23, 0x37, 0xf7, 0x8, 0xf7, 0x12, 0xf7, 0x44,
+                                                    0xf7, 0x2, 0x43, 0xa, 0x23, 0xfb, 0x1d, 0xfb,
+                                                    0x37, 0xfb, 0x21, 0xdd, 0x53, 0xa, 0xe, 0x79,
+                                                    0xc2, 0xf7, 0x3b, 0xc2, 0xf7, 0x9e, 0xc2, 0x1,
+                                                    0xa7, 0xc5, 0xf8, 0x11, 0xc2, 0x3, 0xf7, 0xc5,
+                                                    0x7c, 0xa, 0x76, 0x4b, 0x67, 0x7e, 0x54, 0x1b,
+                                                    0xfb, 0x23, 0x38, 0xf7, 0x8, 0xf7, 0x12, 0xf7,
+                                                    0x44, 0xf7, 0x1, 0x43, 0xa, 0x24, 0xfb, 0x1d,
+                                                    0xfb, 0x37, 0xfb, 0x21, 0xdc, 0x53, 0xa, 0x68,
+                                                    0xf8, 0x6, 0x37, 0xa, 0x8b, 0xc2, 0xf7, 0x5a,
+                                                    0xc2, 0xf7, 0x5b, 0xc2, 0x1, 0xf7, 0x1, 0xc1,
+                                                    0xf7, 0xa6, 0xc1, 0x3, 0xab, 0x16, 0xf7, 0x70,
+                                                    0xc2, 0x32, 0xf7, 0x5a, 0xf7, 0xa6, 0xfb, 0x5a,
+                                                    0x33, 0x54, 0xf7, 0x6f, 0xc2, 0x3e, 0xf8, 0x58,
+                                                    0xd8, 0xc2, 0xfb, 0x65, 0x54, 0xd9, 0xfb, 0x5b,
+                                                    0xfb, 0xa6, 0xf7, 0x5b, 0xda, 0xc2, 0xfb, 0x66,
+                                                    0x54, 0xd8, 0xfc, 0x58, 0x3e, 0x6, 0xe, 0x46,
+                                                    0xa, 0xf7, 0xa3, 0xc2, 0x3, 0xeb, 0x16, 0xf8,
+                                                    0x2c, 0xc2, 0xfb, 0x46, 0xf8, 0x58, 0xf7, 0x38,
+                                                    0xc2, 0xfc, 0x11, 0x54, 0xf7, 0x36, 0xfc, 0x58,
+                                                    0xfb, 0x43, 0x6, 0xe, 0x79, 0xc3, 0xf8, 0x68,
+                                                    0xc3, 0x1, 0xec, 0xc5, 0xf7, 0xd, 0xc2, 0xf7,
+                                                    0x22, 0xc4, 0x3, 0xa3, 0x79, 0x15, 0xf7, 0x62,
+                                                    0xc3, 0x40, 0xf8, 0x68, 0xd1, 0xc3, 0xfb, 0x5c,
+                                                    0x53, 0xd3, 0xfc, 0x68, 0x42, 0x6, 0xf7, 0x90,
+                                                    0xa0, 0x15, 0x85, 0x8c, 0xaa, 0x44, 0xf1, 0x1b,
+                                                    0xf7, 0xb, 0x8c, 0xf7, 0x24, 0xc2, 0x1f, 0x8c,
+                                                    0xf7, 0xda, 0x5, 0xb7, 0xc2, 0xfb, 0x4c, 0x54,
+                                                    0xde, 0x6, 0x8a, 0xfb, 0xd9, 0x5, 0x6f, 0x8e,
+                                                    0xfb, 0xc, 0x45, 0x71, 0x5a, 0x95, 0x7f, 0xa,
+                                                    0x6c, 0xa, 0x1, 0xf7, 0xa3, 0xc5, 0x3, 0xf7,
+                                                    0x48, 0xf8, 0xfe, 0x15, 0xf7, 0xc7, 0xf2, 0x68,
+                                                    0xd3, 0xfb, 0xb1, 0xfb, 0x25, 0x5, 0x44, 0xfd,
+                                                    0x1c, 0x15, 0x32, 0xa, 0xe, 0x6c, 0xa, 0x1,
+                                                    0xf7, 0xa3, 0xc5, 0x3, 0xf7, 0x25, 0xf8, 0xfb,
+                                                    0x15, 0xf7, 0x2e, 0xf7, 0x7, 0xf7, 0x30, 0xfb,
+                                                    0x7, 0xb7, 0x9d, 0xfb, 0x31, 0xf7, 0x2c, 0x5,
+                                                    0x35, 0x6, 0xfb, 0x2f, 0xfb, 0x2c, 0x5, 0x86,
+                                                    0xfd, 0xd, 0x15, 0x32, 0xa, 0xe, 0x6c, 0xa,
+                                                    0xe3, 0xf7, 0x8, 0x1, 0xf7, 0xa3, 0xc5, 0x3,
+                                                    0xf7, 0xe6, 0xf9, 0x20, 0x76, 0xa, 0xfb, 0x31,
+                                                    0xfb, 0x8, 0x76, 0xa, 0x36, 0xfd, 0x94, 0x15,
+                                                    0x32, 0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5e, 0xc1,
+                                                    0xcd, 0xf7, 0x8, 0x12, 0xf7, 0x95, 0xe5, 0x3f,
+                                                    0xc5, 0x13, 0xe8, 0xeb, 0x16, 0xf8, 0x2c, 0xc1,
+                                                    0xfb, 0x43, 0xf8, 0x5e, 0x42, 0xa, 0xfc, 0x5e,
+                                                    0xfb, 0x43, 0x6, 0x13, 0xf0, 0xf7, 0x35, 0xf8,
+                                                    0xd6, 0x76, 0xa, 0xe, 0x6c, 0xa, 0x1, 0x8b,
+                                                    0xa0, 0xf7, 0x8e, 0xc5, 0x3, 0xeb, 0x16, 0x32,
+                                                    0xa, 0xb9, 0xf9, 0x2d, 0x15, 0xf7, 0xc8, 0x26,
+                                                    0x97, 0xa9, 0xfb, 0xaf, 0xf7, 0x25, 0x5, 0xe,
+                                                    0x79, 0xba, 0xf8, 0x72, 0xc2, 0x1, 0xb7, 0xc2,
+                                                    0xf7, 0xa2, 0xc0, 0x3, 0xb7, 0xca, 0x15, 0x4c,
+                                                    0xc8, 0xd7, 0x79, 0xd0, 0x1b, 0xf7, 0x31, 0x9a,
+                                                    0xf4, 0xe9, 0x1f, 0xf7, 0xda, 0xf7, 0x1a, 0xc2,
+                                                    0xfc, 0x15, 0x54, 0xf7, 0x5a, 0xfb, 0xd9, 0x7,
+                                                    0x36, 0x80, 0x47, 0xfb, 0x6, 0x50, 0x35, 0x9a,
+                                                    0x7f, 0xa, 0x8b, 0xc1, 0xf8, 0x59, 0xc2, 0x1,
+                                                    0xf6, 0xc0, 0xf7, 0x47, 0xf7, 0x59, 0x3, 0xa7,
+                                                    0x16, 0xf7, 0x71, 0xc1, 0x32, 0xf7, 0x38, 0x6,
+                                                    0xdd, 0xdd, 0xe6, 0xfb, 0xa, 0xbd, 0x2d, 0xb6,
+                                                    0x33, 0x19, 0xf7, 0x26, 0xc1, 0xfb, 0x6, 0x6,
+                                                    0x5e, 0xea, 0x4c, 0xf0, 0x44, 0xde, 0xf7, 0x4d,
+                                                    0xf7, 0x42, 0x18, 0xd3, 0xc2, 0xfb, 0x59, 0x54,
+                                                    0xc5, 0x6, 0xfb, 0x81, 0xfb, 0x73, 0x5, 0xf7,
+                                                    0x73, 0xd9, 0xc2, 0xfb, 0x66, 0x54, 0xda, 0xfc,
+                                                    0x59, 0x3c, 0x7, 0xe, 0x46, 0xa, 0xf7, 0x2c,
+                                                    0xc2, 0xf7, 0xb7, 0xc2, 0x3, 0xb9, 0x16, 0xf8,
+                                                    0x8f, 0xf7, 0x8b, 0x54, 0xfb, 0x54, 0xfb, 0xb7,
+                                                    0xf8, 0x58, 0xf7, 0x11, 0xc2, 0xfb, 0xb2, 0x54,
+                                                    0xf5, 0xfc, 0x58, 0x21, 0x6, 0xe, 0x75, 0xa,
+                                                    0xf7, 0x2d, 0xc3, 0xf7, 0xb4, 0xc3, 0x3, 0xb9,
+                                                    0x16, 0xf8, 0x8f, 0xf7, 0x91, 0x53, 0xfb, 0x5b,
+                                                    0xfb, 0xb4, 0xf7, 0x4e, 0x6, 0xf7, 0x43, 0xd1,
+                                                    0x5, 0xc2, 0x7, 0xfb, 0x43, 0x44, 0x5, 0xf7,
+                                                    0x6a, 0xf7, 0x12, 0xc1, 0xfb, 0xb5, 0x55, 0xf6,
+                                                    0xfb, 0x80, 0x7, 0x37, 0x69, 0x5, 0x55, 0x7,
+                                                    0xdf, 0xad, 0x5, 0xfb, 0x38, 0x20, 0x7, 0xe,
+                                                    0x46, 0xa, 0xd1, 0xc3, 0xf7, 0xf2, 0xc3, 0x3,
+                                                    0xa0, 0x16, 0xf7, 0x3a, 0xc2, 0x4e, 0xf8, 0x58,
+                                                    0x93, 0x6, 0xf7, 0x26, 0xfc, 0xe, 0x5, 0xb6,
+                                                    0x6, 0xf7, 0x23, 0xf8, 0xe, 0x5, 0x95, 0xfc,
+                                                    0x58, 0x52, 0x54, 0xf7, 0x34, 0xc2, 0x5c, 0xf8,
+                                                    0x58, 0xb9, 0xc2, 0xfb, 0x25, 0x6, 0xfb, 0x16,
+                                                    0xfb, 0xeb, 0xfb, 0x19, 0xf7, 0xeb, 0x5, 0xfb,
+                                                    0x29, 0x54, 0xbc, 0xfc, 0x58, 0x5a, 0x6, 0xe,
+                                                    0x46, 0xa, 0xe4, 0xc4, 0xf7, 0xcd, 0xc3, 0x3,
+                                                    0x92, 0x16, 0xf7, 0x8d, 0xc2, 0xfb, 0x2, 0xf8,
+                                                    0x41, 0x6, 0xf7, 0xba, 0xfc, 0x78, 0x5, 0xd6,
+                                                    0xf8, 0x8f, 0xd9, 0xc2, 0xfb, 0x93, 0x54, 0xf7,
+                                                    0xd, 0xfc, 0x44, 0x6, 0xfb, 0xb9, 0xf8, 0x7b,
+                                                    0x5, 0xfb, 0x33, 0x54, 0xdd, 0xfc, 0x58, 0x39,
+                                                    0x6, 0xe, 0x8c, 0xbf, 0xf8, 0x5b, 0xc0, 0xd7,
+                                                    0xbf, 0x99, 0xbc, 0x1, 0xe4, 0xc4, 0xf7, 0xcd,
+                                                    0xc3, 0x3, 0x92, 0x8c, 0x15, 0xf7, 0x8d, 0xbf,
+                                                    0xfb, 0x2, 0xf8, 0x45, 0x6, 0xf7, 0xba, 0xfc,
+                                                    0x79, 0x5, 0xd6, 0xf8, 0x8f, 0xd9, 0xc0, 0xfb,
+                                                    0x88, 0x56, 0xf7, 0x2, 0xfc, 0x47, 0x6, 0xfb,
+                                                    0xb9, 0xf8, 0x7c, 0x5, 0xfb, 0x33, 0x56, 0xdd,
+                                                    0xfc, 0x5b, 0x39, 0x6, 0xf7, 0x2e, 0xf8, 0xe0,
+                                                    0x15, 0x9f, 0x93, 0x9f, 0xb5, 0xbd, 0x1b, 0xa5,
+                                                    0xa1, 0x78, 0x79, 0xa4, 0x1f, 0x7a, 0xa3, 0xa5,
+                                                    0x7f, 0xaf, 0x1b, 0xd2, 0xae, 0xca, 0xb3, 0x96,
+                                                    0x1f, 0x57, 0x94, 0x5, 0x72, 0x81, 0x72, 0x68,
+                                                    0x64, 0x1b, 0x71, 0x7b, 0x9c, 0x9e, 0x71, 0x1f,
+                                                    0x99, 0x77, 0x72, 0x98, 0x64, 0x1b, 0x50, 0x59,
+                                                    0x5d, 0x55, 0x78, 0x1f, 0xe, 0x79, 0xc2, 0xf8,
+                                                    0x7c, 0xc2, 0x1, 0xb6, 0xc2, 0xf8, 0x22, 0xc8,
+                                                    0x3, 0xb6, 0xf7, 0xa7, 0x15, 0xfb, 0x38, 0xeb,
+                                                    0xfb, 0x15, 0xf7, 0x32, 0xf7, 0x36, 0xed, 0xf7,
+                                                    0x12, 0xf7, 0x3b, 0xf7, 0x16, 0x4b, 0xf7, 0x43,
+                                                    0xfb, 0x57, 0xfb, 0x45, 0x3d, 0xfb, 0x38, 0xfb,
+                                                    0x21, 0x1e, 0xc2, 0x16, 0xee, 0xb9, 0xf7, 0x2b,
+                                                    0xf7, 0x2d, 0xf7, 0x2d, 0xb9, 0xfb, 0x2e, 0x2b,
+                                                    0xfb, 0x1e, 0x3d, 0x27, 0xfb, 0xd, 0xfb, 0x9,
+                                                    0x39, 0xec, 0xf7, 0x21, 0x1e, 0xe, 0x87, 0xc1,
+                                                    0xf7, 0x4f, 0xc2, 0xf7, 0x6c, 0xc1, 0x12, 0x9f,
+                                                    0xc3, 0xf7, 0x81, 0xc3, 0xd2, 0xc2, 0xa8, 0xc3,
+                                                    0x17, 0xf8, 0x5, 0xbd, 0x15, 0xf7, 0x60, 0xd2,
+                                                    0x4a, 0xc2, 0xf7, 0x4c, 0x54, 0x4b, 0x44, 0xf7,
+                                                    0x5b, 0x7, 0x13, 0xfa, 0xf7, 0x2f, 0x27, 0xc3,
+                                                    0xf7, 0x2e, 0xfb, 0xac, 0x6, 0xfb, 0x64, 0x43,
+                                                    0xfb, 0x1a, 0xfb, 0x2b, 0xfb, 0x1d, 0xd3, 0xfb,
+                                                    0x24, 0xf7, 0x56, 0x1f, 0xf7, 0xba, 0xf7, 0x32,
+                                                    0x53, 0x23, 0x6, 0xfb, 0x67, 0x16, 0xfb, 0x1a,
+                                                    0x87, 0x24, 0xd3, 0xf7, 0x34, 0x1a, 0xf7, 0x3e,
+                                                    0xf2, 0xcd, 0xf7, 0x1a, 0x85, 0x1e, 0xe, 0x64,
+                                                    0xa, 0xf7, 0x6d, 0x77, 0x57, 0xa, 0xf7, 0x51,
+                                                    0xf8, 0xfe, 0x15, 0xf7, 0xb0, 0xf0, 0x6a, 0xd5,
+                                                    0xfb, 0x9b, 0xfb, 0x25, 0x5, 0xfb, 0x1a, 0xfc,
+                                                    0x5, 0x20, 0xa, 0xe, 0x64, 0xa, 0xd1, 0x76,
+                                                    0x57, 0xa, 0xf7, 0x32, 0xf9, 0x5, 0x49, 0xa,
+                                                    0x41, 0xfb, 0xff, 0x20, 0xa, 0xe, 0x64, 0xa,
+                                                    0xcf, 0xf7, 0x9, 0x1, 0xb6, 0xc1, 0xe9, 0xde,
+                                                    0xca, 0xde, 0xdc, 0xc3, 0x3, 0xf7, 0xe5, 0xf9,
+                                                    0x18, 0x62, 0xa, 0xfb, 0x26, 0xfb, 0x9, 0x62,
+                                                    0xa, 0xfb, 0x28, 0xfc, 0x76, 0x20, 0xa, 0xe,
+                                                    0x64, 0xa, 0xf7, 0x49, 0x77, 0x57, 0xa, 0xb6,
+                                                    0xf7, 0xab, 0x20, 0xa, 0xc6, 0xf8, 0x2f, 0x15,
+                                                    0xf7, 0xb0, 0x45, 0x96, 0xa9, 0xfb, 0x9a, 0xf7,
+                                                    0x1, 0x5, 0xe, 0x7a, 0x76, 0xa5, 0xc2, 0xf8,
+                                                    0x7b, 0xc2, 0x9c, 0x77, 0x12, 0xb2, 0xc2, 0xf8,
+                                                    0x2d, 0xc4, 0x13, 0xdc, 0xc1, 0x85, 0x15, 0xb6,
+                                                    0x6b, 0xc2, 0xd6, 0x5, 0x6c, 0xb4, 0xbe, 0x79,
+                                                    0xc5, 0x1b, 0xf7, 0x36, 0xeb, 0xf7, 0x1b, 0xf7,
+                                                    0x38, 0xbf, 0x7c, 0xe1, 0x5a, 0xcd, 0x1f, 0xc5,
+                                                    0xd9, 0x60, 0xac, 0x56, 0x44, 0x5, 0x13, 0xec,
+                                                    0xab, 0x65, 0x59, 0xa1, 0x48, 0x1b, 0xfb, 0x45,
+                                                    0x34, 0xfb, 0x31, 0xfb, 0x21, 0x38, 0xa5, 0x3f,
+                                                    0xba, 0x55, 0x1f, 0xd4, 0x93, 0x15, 0xf7, 0xa8,
+                                                    0xf7, 0xff, 0x5, 0xad, 0x56, 0x93, 0x49, 0x62,
+                                                    0x1a, 0xfb, 0x13, 0x46, 0xfb, 0x7, 0xfb, 0x17,
+                                                    0x5d, 0x63, 0x9a, 0xa3, 0x6b, 0x1e, 0x65, 0xb1,
+                                                    0x15, 0x69, 0xb7, 0x78, 0xc6, 0xc9, 0x1a, 0xe4,
+                                                    0xc0, 0xf7, 0x30, 0xf7, 0x2e, 0xc0, 0xb3, 0x7a,
+                                                    0x71, 0xa9, 0x1e, 0xe, 0x64, 0xa, 0xcc, 0xbc,
+                                                    0x98, 0xbc, 0x57, 0xa, 0xf7, 0x3c, 0xf9, 0x15,
+                                                    0x15, 0x9f, 0x92, 0x9e, 0xb5, 0xbc, 0x1b, 0xa9,
+                                                    0x9f, 0x7c, 0x79, 0xa1, 0x1f, 0x7b, 0xa0, 0xa2,
+                                                    0x7e, 0xb0, 0x1b, 0xcf, 0xad, 0xc6, 0xb2, 0x96,
+                                                    0x1f, 0x58, 0x94, 0x5, 0x73, 0x82, 0x75, 0x69,
+                                                    0x65, 0x1b, 0x73, 0x7b, 0x9a, 0x9d, 0x75, 0x1f,
+                                                    0x9a, 0x78, 0x72, 0x99, 0x61, 0x1b, 0x52, 0x5b,
+                                                    0x52, 0x55, 0x78, 0x1f, 0x41, 0xfb, 0xfe, 0x20,
+                                                    0xa, 0xe, 0x8b, 0xc2, 0xf7, 0x1c, 0xc1, 0xf7,
+                                                    0x9b, 0xc1, 0x1, 0xf7, 0x1e, 0xc2, 0xf7, 0xb7,
+                                                    0xc2, 0x3, 0xc7, 0x16, 0xf7, 0xb2, 0xc2, 0xfb,
+                                                    0x2d, 0xf7, 0x1c, 0xf7, 0x1a, 0x6, 0xf7, 0x5,
+                                                    0xee, 0xca, 0xf7, 0xe, 0xe1, 0x50, 0xef, 0xfb,
+                                                    0x2c, 0x1f, 0xfb, 0xa0, 0x55, 0xd9, 0xfc, 0x59,
+                                                    0x3d, 0x6, 0xf7, 0x19, 0xf7, 0x52, 0x15, 0xf7,
+                                                    0x9b, 0xf7, 0x18, 0x7, 0xdb, 0xda, 0x6a, 0x28,
+                                                    0x27, 0x37, 0x6c, 0x42, 0x1f, 0xe, 0xfb, 0x9,
+                                                    0x76, 0xb6, 0xf7, 0x11, 0x56, 0xc0, 0xf8, 0x86,
+                                                    0xbf, 0x12, 0xb6, 0xc2, 0xf8, 0x26, 0xc4, 0x13,
+                                                    0xdc, 0xf7, 0x16, 0x31, 0x15, 0xa0, 0x5e, 0x5,
+                                                    0xa3, 0xb8, 0xaf, 0x9b, 0xb9, 0x1b, 0xaa, 0xa6,
+                                                    0x7f, 0x80, 0xa4, 0x1f, 0x81, 0xa2, 0xa5, 0x81,
+                                                    0xb0, 0x1b, 0xae, 0xae, 0x98, 0xa1, 0xa5, 0x1f,
+                                                    0x76, 0xb8, 0x5, 0x7d, 0x76, 0x71, 0x81, 0x72,
+                                                    0x1b, 0x72, 0x74, 0x95, 0x95, 0x73, 0x1f, 0x96,
+                                                    0x72, 0x71, 0x95, 0x6e, 0x1b, 0x7c, 0x7c, 0x86,
+                                                    0x89, 0x7c, 0x1f, 0x13, 0xbc, 0x99, 0x92, 0x97,
+                                                    0x92, 0x97, 0x96, 0x8, 0xf7, 0x2a, 0xf7, 0x8,
+                                                    0xf7, 0xc, 0xf7, 0x42, 0xf7, 0x32, 0x3f, 0xf7,
+                                                    0x2b, 0xfb, 0x4a, 0xfb, 0x33, 0x2a, 0xfb, 0x2a,
+                                                    0xfb, 0x33, 0xfb, 0x24, 0xcf, 0xfb, 0x0, 0xf7,
+                                                    0x10, 0x66, 0x1f, 0x70, 0x70, 0x5f, 0x70, 0x69,
+                                                    0x79, 0x8, 0x6b, 0xf7, 0xfd, 0x15, 0xf7, 0x16,
+                                                    0xe0, 0xf7, 0x13, 0xf7, 0x7, 0xf7, 0x13, 0xd6,
+                                                    0xfb, 0xf, 0xfb, 0x1a, 0xfb, 0x4a, 0xfb, 0x1d,
+                                                    0x50, 0x49, 0x48, 0xfb, 0x18, 0xc1, 0xf7, 0x4f,
+                                                    0x1e, 0xe, 0x8b, 0xc2, 0xf7, 0x55, 0xc2, 0xf7,
+                                                    0x60, 0xc2, 0x1, 0xf5, 0xc2, 0xf7, 0xac, 0xc2,
+                                                    0x3, 0xa4, 0x16, 0xf7, 0x6e, 0xc2, 0x39, 0xf7,
+                                                    0x55, 0xf7, 0x8, 0x6, 0xb2, 0x5c, 0xe4, 0xfb,
+                                                    0x19, 0xb2, 0x47, 0x8, 0xf7, 0x17, 0xc2, 0x24,
+                                                    0x6, 0x6a, 0xc1, 0x4f, 0xe8, 0x63, 0xbb, 0x8,
+                                                    0xce, 0x90, 0xe5, 0xab, 0xf7, 0xc, 0x1a, 0xdf,
+                                                    0x5b, 0xd2, 0xfb, 0xe, 0x1e, 0xfb, 0xc1, 0x54,
+                                                    0xdc, 0xfc, 0x58, 0x3a, 0x6, 0xf7, 0x1c, 0xf7,
+                                                    0x8c, 0x15, 0xf7, 0x60, 0xf7, 0x26, 0x7, 0xd2,
+                                                    0xca, 0x74, 0x3c, 0x20, 0x24, 0x90, 0x41, 0x1f,
+                                                    0x69, 0x68, 0x8b, 0x69, 0x1b, 0xe, 0x77, 0xbf,
+                                                    0x76, 0x76, 0xf8, 0xae, 0xbf, 0x7e, 0x77, 0x12,
+                                                    0xd3, 0xc2, 0x6e, 0xc1, 0xf7, 0xc2, 0xc1, 0x67,
+                                                    0xc2, 0x13, 0x6a, 0xd3, 0x81, 0x15, 0xc2, 0xb3,
+                                                    0x6, 0x13, 0xa5, 0x60, 0xc9, 0xd8, 0x84, 0xb9,
+                                                    0x1b, 0xf7, 0x4, 0xf2, 0xc1, 0xf7, 0x9, 0xf7,
+                                                    0xd, 0xfb, 0x2, 0x9a, 0x28, 0x9a, 0x1f, 0x42,
+                                                    0x97, 0x2e, 0xaa, 0xd8, 0x1a, 0xcb, 0xcc, 0xb5,
+                                                    0xe5, 0x1e, 0x13, 0x9a, 0xbf, 0xc6, 0x75, 0x68,
+                                                    0xaf, 0x1f, 0x32, 0xc1, 0xf7, 0x4d, 0x55, 0x6d,
+                                                    0x7, 0x13, 0xa5, 0xa7, 0x64, 0x50, 0x9a, 0x57,
+                                                    0x1b, 0xfb, 0x23, 0x4c, 0x3a, 0x37, 0xfb, 0xe,
+                                                    0xf7, 0x14, 0x67, 0xdf, 0x80, 0x1f, 0xdd, 0x80,
+                                                    0xdb, 0x80, 0x3a, 0x1a, 0x4a, 0x4a, 0x5d, 0x23,
+                                                    0x1e, 0x13, 0x6a, 0x4c, 0x4b, 0x9f, 0xb3, 0x5a,
+                                                    0x1f, 0xd9, 0x54, 0x7, 0xe, 0x77, 0xc3, 0x73,
+                                                    0x76, 0xf8, 0xac, 0xc3, 0x7f, 0x77, 0xab, 0xb7,
+                                                    0xf7, 0x46, 0x77, 0x12, 0xd2, 0xc3, 0x6d, 0xc2,
+                                                    0xf7, 0xc1, 0xc2, 0x62, 0xc8, 0x13, 0x6e, 0x80,
+                                                    0xd2, 0x82, 0x15, 0xc3, 0xbe, 0x6, 0x13, 0xad,
+                                                    0x40, 0x5f, 0xca, 0xd9, 0x79, 0xba, 0x1b, 0xf7,
+                                                    0x5, 0xef, 0xc2, 0xf7, 0xa, 0xf7, 0x9, 0xfb,
+                                                    0xe, 0x9b, 0x2e, 0x95, 0x1f, 0x44, 0x93, 0x31,
+                                                    0x9e, 0xe4, 0x1a, 0xcc, 0xcd, 0xbd, 0xe7, 0x1e,
+                                                    0x13, 0x9e, 0x80, 0xbf, 0xc1, 0x6f, 0x67, 0xb0,
+                                                    0x1f, 0x3b, 0xc2, 0xf7, 0x50, 0x54, 0x62, 0x7,
+                                                    0x13, 0xad, 0x40, 0xa8, 0x63, 0x55, 0xa3, 0x57,
+                                                    0x1b, 0xfb, 0x26, 0x4b, 0x28, 0x36, 0xfb, 0x11,
+                                                    0xf7, 0x1c, 0x73, 0xe2, 0x82, 0x1f, 0xd8, 0x83,
+                                                    0xd1, 0x7e, 0x3f, 0x1a, 0x49, 0x53, 0x61, 0x22,
+                                                    0x1e, 0x13, 0x6e, 0x80, 0x4b, 0x4a, 0xa7, 0xb4,
+                                                    0x59, 0x1f, 0xd0, 0x53, 0x7, 0xf7, 0x5d, 0xf8,
+                                                    0x59, 0x37, 0xa, 0xfb, 0x16, 0x76, 0xf7, 0x47,
+                                                    0xca, 0xf7, 0x48, 0xc9, 0xf7, 0x49, 0xcd, 0x12,
+                                                    0xd2, 0xc6, 0x57, 0xc5, 0xf7, 0x1e, 0xef, 0xd1,
+                                                    0xc6, 0x63, 0xcc, 0x13, 0xfa, 0x80, 0xd2, 0xa7,
+                                                    0x15, 0xc6, 0xcd, 0x6, 0xb6, 0x73, 0xb5, 0x6e,
+                                                    0xc8, 0x81, 0x88, 0x3f, 0x18, 0x8e, 0x92, 0x95,
+                                                    0x8c, 0x94, 0x1b, 0x99, 0x98, 0x7f, 0x7a, 0x77,
+                                                    0x7a, 0x80, 0x78, 0x7e, 0x7d, 0x90, 0x95, 0x81,
+                                                    0x1f, 0x7c, 0x60, 0x5, 0x7c, 0x9c, 0xa2, 0x84,
+                                                    0x9e, 0x1b, 0xb4, 0xaf, 0xb2, 0xbd, 0xb5, 0x72,
+                                                    0xa2, 0x77, 0x8d, 0x1f, 0xa2, 0x7, 0xf7, 0x9,
+                                                    0x8d, 0xdd, 0xce, 0xf2, 0x1a, 0xe5, 0x3f, 0xb1,
+                                                    0x3f, 0x90, 0x1e, 0x13, 0xf7, 0x0, 0x40, 0x92,
+                                                    0xfb, 0x39, 0x7a, 0xf2, 0x1a, 0xd6, 0xec, 0x98,
+                                                    0xba, 0xc7, 0xc5, 0x6b, 0x6a, 0xb9, 0x1e, 0x51,
+                                                    0xc6, 0xf7, 0x51, 0x50, 0x4f, 0x7, 0xac, 0x5a,
+                                                    0x52, 0xa6, 0x4d, 0x1b, 0xfb, 0xb, 0x3c, 0x4d,
+                                                    0x24, 0xfb, 0x22, 0xf7, 0x42, 0x8d, 0xe3, 0x87,
+                                                    0x1f, 0x13, 0xfa, 0x80, 0xbf, 0x89, 0xd2, 0x86,
+                                                    0x43, 0x1a, 0x33, 0xfb, 0x5, 0x7e, 0x63, 0x46,
+                                                    0x50, 0xb1, 0xb7, 0x57, 0x1e, 0xc6, 0x50, 0x7,
+                                                    0xe, 0x8b, 0xc2, 0xf7, 0xd3, 0xf7, 0x50, 0x54,
+                                                    0xc2, 0x12, 0xb0, 0xc3, 0xf7, 0x46, 0xc3, 0xf7,
+                                                    0x47, 0xc3, 0x13, 0xbc, 0xf7, 0x26, 0x16, 0xf7,
+                                                    0xc6, 0xc2, 0xfb, 0x11, 0xf8, 0x58, 0xf7, 0x47,
+                                                    0x6, 0x13, 0xdc, 0xfb, 0x19, 0xc3, 0xf7, 0x50,
+                                                    0xfc, 0xa1, 0xfb, 0x50, 0xc3, 0x7, 0x13, 0xbc,
+                                                    0xf7, 0x19, 0xf7, 0x46, 0xfc, 0x58, 0xfb, 0x11,
+                                                    0x7, 0xe, 0x8b, 0xc1, 0xf5, 0xc1, 0xf7, 0x42,
+                                                    0xc1, 0xf7, 0x12, 0xc1, 0x1, 0xf7, 0x40, 0xbc,
+                                                    0xf7, 0x95, 0xbe, 0x3, 0xf7, 0xf9, 0x16, 0xc1,
+                                                    0xfb, 0x1c, 0xf5, 0xf7, 0x1a, 0x7, 0xf7, 0x15,
+                                                    0xb8, 0xc5, 0xde, 0xe6, 0x5f, 0xbd, 0xfb, 0x18,
+                                                    0x1f, 0xfb, 0x18, 0xf7, 0x12, 0xee, 0xc1, 0xfb,
+                                                    0x8e, 0x55, 0xf1, 0xfc, 0x96, 0x25, 0x55, 0x6,
+                                                    0xf7, 0x2b, 0xf8, 0x18, 0x15, 0xf7, 0x18, 0x6,
+                                                    0xaf, 0xa9, 0x85, 0x80, 0xa2, 0x1f, 0xa3, 0x80,
+                                                    0x97, 0x73, 0x66, 0x1a, 0x68, 0x7f, 0x74, 0x73,
+                                                    0x80, 0x1e, 0x80, 0x74, 0x6e, 0x86, 0x68, 0x1b,
+                                                    0xfb, 0x1a, 0x6, 0xe, 0x79, 0xbe, 0xf8, 0x6e,
+                                                    0xc2, 0x1, 0xec, 0xbf, 0xf7, 0xc5, 0xbf, 0x3,
+                                                    0x9c, 0xf8, 0x8f, 0x15, 0xdb, 0xfb, 0xd1, 0x6,
+                                                    0xfb, 0x17, 0xc1, 0x3e, 0xf7, 0x2c, 0xf7, 0x12,
+                                                    0xd8, 0xd4, 0xf7, 0x1b, 0x1e, 0xf7, 0xd1, 0xd8,
+                                                    0xc2, 0xfb, 0x7c, 0x54, 0xf2, 0xfb, 0xd1, 0x7,
+                                                    0xfb, 0xf, 0x42, 0x69, 0x3c, 0x21, 0x5c, 0xb8,
+                                                    0xf7, 0x4, 0x1e, 0xf7, 0xd1, 0xf5, 0xc2, 0xfb,
+                                                    0x82, 0x7, 0xe, 0x6b, 0xa, 0xf7, 0x7a, 0x77,
+                                                    0x55, 0xa, 0xf7, 0x52, 0xf8, 0xfe, 0x15, 0xf7,
+                                                    0xab, 0xf0, 0x6b, 0xd5, 0xfb, 0x97, 0xfb, 0x25,
+                                                    0x5, 0xfb, 0x35, 0xfb, 0x20, 0x34, 0xa, 0xe,
+                                                    0x6b, 0xa, 0x5b, 0xa, 0xfb, 0x14, 0xd5, 0x2a,
+                                                    0x30, 0xa, 0xf7, 0x21, 0xc9, 0x49, 0xa, 0xe,
+                                                    0x6b, 0xa, 0xf7, 0x10, 0xf7, 0x9, 0x5b, 0xa,
+                                                    0xfb, 0x1b, 0xcf, 0x31, 0xf7, 0x1f, 0x31, 0xa,
+                                                    0xbf, 0xf7, 0xc, 0x4f, 0xa, 0xf7, 0xd0, 0xdc,
+                                                    0x62, 0xa, 0xfb, 0x22, 0xfb, 0x9, 0x62, 0xa,
+                                                    0xe, 0x6b, 0xa, 0xf7, 0x7a, 0x77, 0x1, 0xeb,
+                                                    0xbf, 0xf7, 0xc6, 0xbf, 0x3, 0x9c, 0xf8, 0x90,
+                                                    0x34, 0xa, 0xf7, 0x1e, 0xf7, 0x30, 0x79, 0xa,
+                                                    0xf7, 0x25, 0x5, 0xe, 0x93, 0x76, 0xf8, 0x9c,
+                                                    0xc2, 0x1, 0x87, 0xf7, 0x77, 0xf7, 0x31, 0xf7,
+                                                    0x74, 0x3, 0xf7, 0x9b, 0x7e, 0x15, 0xd4, 0x6,
+                                                    0xf7, 0x5c, 0xf8, 0x9c, 0x5, 0xcf, 0xc2, 0xfb,
+                                                    0x74, 0x54, 0xeb, 0x6, 0xfb, 0x45, 0xfc, 0x61,
+                                                    0xfb, 0x43, 0xf8, 0x61, 0x5, 0xee, 0xc2, 0xfb,
+                                                    0x77, 0x54, 0xcb, 0x6, 0xe, 0x96, 0x76, 0xf8,
+                                                    0x63, 0x77, 0xd5, 0xc2, 0x1, 0x9f, 0xf7, 0x5a,
+                                                    0xf7, 0x37, 0xf7, 0x5b, 0x3, 0xf7, 0x10, 0x81,
+                                                    0x15, 0xca, 0x6, 0xf7, 0x5, 0xf7, 0xfd, 0xf7,
+                                                    0xa, 0xfb, 0xfd, 0x5, 0xc8, 0x6, 0xc4, 0xf8,
+                                                    0x99, 0x5, 0xb7, 0xc2, 0xfb, 0x5b, 0x54, 0xee,
+                                                    0x6, 0x63, 0xfc, 0x36, 0xfb, 0xa, 0xf8, 0x0,
+                                                    0x5, 0x62, 0x6, 0xfb, 0x8, 0xfc, 0x2, 0x5e,
+                                                    0xf8, 0x38, 0x5, 0xed, 0xc2, 0xfb, 0x5a, 0x54,
+                                                    0xb9, 0x6, 0xe, 0x46, 0xa, 0xa2, 0x16, 0xf7,
+                                                    0x7e, 0xc2, 0x22, 0x6, 0xf7, 0x2a, 0xf7, 0x58,
+                                                    0xf7, 0x26, 0xfb, 0x58, 0x5, 0x2d, 0x54, 0xf7,
+                                                    0x73, 0xc2, 0x4a, 0x6, 0xfb, 0x46, 0xf7, 0x84,
+                                                    0xf7, 0x32, 0xf7, 0x68, 0x5, 0xcd, 0xc2, 0xfb,
+                                                    0x53, 0x54, 0xc8, 0x6, 0xfb, 0x13, 0xfb, 0x3f,
+                                                    0xfb, 0x14, 0xf7, 0x3f, 0x5, 0xcf, 0xc2, 0xfb,
+                                                    0x5a, 0x54, 0xce, 0x6, 0xf7, 0x32, 0xfb, 0x68,
+                                                    0xfb, 0x48, 0xfb, 0x84, 0x5, 0x4a, 0x6, 0xe,
+                                                    0x75, 0xa, 0xa3, 0xf7, 0x5f, 0xbb, 0xc3, 0xb9,
+                                                    0xf7, 0x5b, 0x3, 0xf7, 0x27, 0x16, 0xf7, 0xcb,
+                                                    0xc1, 0xfb, 0x13, 0xf7, 0x43, 0x6, 0xf7, 0x46,
+                                                    0xf7, 0xab, 0x5, 0xce, 0xc1, 0xfb, 0x5b, 0x55,
+                                                    0xd2, 0x6, 0xfb, 0x25, 0xfb, 0x76, 0xfb, 0x28,
+                                                    0xf7, 0x76, 0x5, 0xd3, 0xc1, 0xfb, 0x5f, 0x55,
+                                                    0xd0, 0x6, 0xf7, 0x4a, 0xfb, 0xab, 0x5, 0xfb,
+                                                    0x43, 0xfb, 0x14, 0x7, 0xe, 0x8b, 0xc1, 0xf8,
+                                                    0x5d, 0xc1, 0xf7, 0x78, 0x77, 0x81, 0xa, 0xf7,
+                                                    0x27, 0x16, 0x36, 0xa, 0xb0, 0xf8, 0xc9, 0x15,
+                                                    0xf7, 0xba, 0xf0, 0x69, 0xd4, 0xfb, 0xa4, 0xfb,
+                                                    0x24, 0x5, 0xe, 0x8b, 0xc1, 0xf8, 0x5d, 0xc1,
+                                                    0xf7, 0xe, 0xf7, 0x15, 0x81, 0xa, 0xf7, 0xe5,
+                                                    0xf9, 0x43, 0x15, 0xe1, 0xf7, 0x15, 0x35, 0x6,
+                                                    0xfb, 0x2b, 0xfb, 0x15, 0x15, 0xe0, 0xf7, 0x15,
+                                                    0x36, 0x6, 0x64, 0xfd, 0xc4, 0x15, 0x36, 0xa,
+                                                    0xe, 0x75, 0xa, 0xf7, 0xa, 0xbf, 0xf7, 0xb5,
+                                                    0xc2, 0x3, 0xe1, 0x16, 0xf8, 0x40, 0xf7, 0x5f,
+                                                    0x54, 0xfb, 0x29, 0xfb, 0xc1, 0x6, 0xf7, 0xf8,
+                                                    0xf8, 0x5d, 0x5, 0xbe, 0xfc, 0x20, 0xfb, 0x51,
+                                                    0xbf, 0xf7, 0x1b, 0xf7, 0xa3, 0x7, 0xfb, 0xf7,
+                                                    0xfc, 0x5b, 0x5, 0xe, 0x8b, 0xc2, 0xf8, 0x63,
+                                                    0xc2, 0x1, 0xf7, 0xa, 0xbf, 0xf7, 0xb7, 0xc0,
+                                                    0x3, 0xe1, 0x16, 0xf8, 0x40, 0xf7, 0x78, 0x56,
+                                                    0xfb, 0x41, 0xfb, 0xc2, 0x6, 0xf7, 0xf7, 0xf8,
+                                                    0x66, 0x5, 0xbf, 0xfc, 0x20, 0xfb, 0x68, 0xbf,
+                                                    0xf7, 0x31, 0xf7, 0xa4, 0x7, 0xfb, 0xf8, 0xfc,
+                                                    0x64, 0x5, 0xf7, 0x52, 0xf8, 0xd2, 0x15, 0xd9,
+                                                    0x6, 0xf7, 0x21, 0xf7, 0x33, 0x63, 0x9d, 0xfb,
+                                                    0x20, 0xfb, 0xb, 0xfb, 0x23, 0xf7, 0xb, 0x64,
+                                                    0x78, 0x5, 0xe, 0x88, 0xc2, 0xf7, 0x33, 0xc1,
+                                                    0xf7, 0xb, 0xc4, 0x1, 0xba, 0xc4, 0xf7, 0xca,
+                                                    0xc2, 0x3, 0xf1, 0xf7, 0xe1, 0x15, 0xd2, 0xa9,
+                                                    0xcf, 0xa1, 0xbc, 0x8a, 0xdf, 0x8a, 0xbb, 0x6b,
+                                                    0x83, 0x28, 0x8, 0x95, 0x5e, 0x5b, 0x8e, 0x5d,
+                                                    0x1b, 0xfb, 0xd, 0x20, 0x5c, 0x29, 0x4a, 0xc0,
+                                                    0x45, 0xf7, 0x8, 0xea, 0xd7, 0xc2, 0xb4, 0xa7,
+                                                    0x1f, 0x37, 0xf7, 0x1e, 0xc2, 0x37, 0xf7, 0x85,
+                                                    0x7, 0xf4, 0x49, 0xb6, 0xfb, 0x7, 0x40, 0x3b,
+                                                    0x6e, 0x71, 0x5c, 0x1e, 0xf7, 0xdc, 0xfb, 0x83,
+                                                    0x15, 0x4f, 0x58, 0x46, 0x55, 0x39, 0x1b, 0x4c,
+                                                    0x5e, 0xbb, 0xb1, 0xd2, 0xdd, 0xa0, 0xe3, 0xbc,
+                                                    0xc0, 0x88, 0x80, 0xb1, 0x1f, 0xe, 0x3e, 0xa,
+                                                    0xf7, 0x30, 0xf8, 0x83, 0x15, 0xf7, 0xbb, 0xf2,
+                                                    0x69, 0xd5, 0xfb, 0xa5, 0xfb, 0x26, 0x5, 0x5a,
+                                                    0xfb, 0x44, 0x23, 0xa, 0x3e, 0xa, 0xf7, 0x16,
+                                                    0xf8, 0x74, 0x15, 0xf7, 0x2d, 0xf7, 0xa, 0xf7,
+                                                    0x2a, 0xfb, 0xa, 0xb6, 0x9c, 0xfb, 0x2c, 0xf7,
+                                                    0x31, 0x5, 0x38, 0x6, 0xfb, 0x2d, 0xfb, 0x31,
+                                                    0x5, 0x92, 0xfb, 0x27, 0x23, 0xa, 0x6e, 0xa,
+                                                    0xf7, 0x61, 0xf8, 0x85, 0x15, 0xf7, 0x64, 0xf1,
+                                                    0x5e, 0xd4, 0xfb, 0x4a, 0xfb, 0x24, 0x5, 0xe,
+                                                    0x7c, 0xc3, 0x6a, 0xc3, 0xf7, 0x2b, 0xc3, 0xf7,
+                                                    0x7, 0xc3, 0xe3, 0xf7, 0x7, 0x12, 0xba, 0xc5,
+                                                    0xbf, 0xe2, 0xcc, 0xe1, 0x9e, 0xc3, 0x13, 0x7f,
+                                                    0x80, 0xf7, 0xc9, 0xf8, 0xa6, 0x15, 0xe1, 0xf7,
+                                                    0x7, 0x35, 0x6, 0xfb, 0x2c, 0x60, 0xa, 0x4d,
+                                                    0xfb, 0xbb, 0x28, 0xa, 0x1f, 0x13, 0xbf, 0x80,
+                                                    0x3d, 0xa, 0x1e, 0x29, 0xa, 0x2a, 0xa, 0x7c,
+                                                    0xc1, 0xf7, 0x42, 0xc2, 0xf7, 0xa, 0xc2, 0x1,
+                                                    0xa3, 0xc4, 0xf7, 0x4e, 0xc3, 0x3, 0xf7, 0xba,
+                                                    0xd7, 0x15, 0x58, 0x9f, 0xbf, 0x63, 0xda, 0x1b,
+                                                    0xb8, 0xb9, 0x96, 0x96, 0xb2, 0x1f, 0x7f, 0xc1,
+                                                    0x5, 0x82, 0x6b, 0x65, 0x7e, 0x67, 0x1b, 0x2e,
+                                                    0x62, 0xda, 0xde, 0x1f, 0x97, 0xf7, 0x8f, 0x7,
+                                                    0xf4, 0x8c, 0x76, 0xf7, 0xf, 0xfb, 0x13, 0x1b,
+                                                    0x53, 0x6a, 0x71, 0x62, 0x70, 0x1f, 0x99, 0x85,
+                                                    0x7d, 0xc0, 0x2b, 0x1b, 0x54, 0x58, 0x7e, 0x7b,
+                                                    0x5f, 0x1f, 0x96, 0x56, 0x5, 0x98, 0xad, 0xbe,
+                                                    0x99, 0xb4, 0x1b, 0xd2, 0x99, 0x68, 0x53, 0x1f,
+                                                    0x70, 0x7, 0xfb, 0x7, 0x8c, 0xfb, 0x14, 0x75,
+                                                    0xfb, 0x1e, 0x1a, 0x34, 0xcd, 0x66, 0xc9, 0xa5,
+                                                    0xc4, 0x90, 0xe1, 0xc6, 0x1e, 0xaa, 0xf7, 0x54,
+                                                    0x15, 0xcb, 0x8f, 0xb3, 0xc1, 0xc9, 0x1b, 0xd6,
+                                                    0x91, 0x49, 0x57, 0x92, 0x1f, 0xfb, 0x90, 0xfb,
+                                                    0x21, 0x15, 0x75, 0x7f, 0x64, 0x49, 0x4b, 0x1b,
+                                                    0x63, 0x6c, 0xa6, 0xb9, 0xf0, 0xf7, 0x0, 0x8b,
+                                                    0xd9, 0x1f, 0xe, 0x3e, 0xa, 0xf7, 0x1a, 0xf8,
+                                                    0xe8, 0x15, 0xf7, 0xbd, 0x24, 0x96, 0xaa, 0xfb,
+                                                    0xa5, 0xf7, 0x28, 0x5, 0x41, 0xfb, 0xd6, 0x23,
+                                                    0xa, 0x86, 0xc0, 0x64, 0xc2, 0xf7, 0x3e, 0xc1,
+                                                    0xf7, 0x5f, 0xbf, 0x1, 0xc9, 0xc2, 0x91, 0xbf,
+                                                    0x3, 0xf7, 0xf4, 0xbb, 0x15, 0xae, 0x59, 0x5,
+                                                    0xf7, 0x2a, 0xc2, 0xfb, 0x11, 0x6, 0x72, 0xb0,
+                                                    0xa6, 0xb0, 0xa1, 0xc0, 0x91, 0xc2, 0x19, 0xd8,
+                                                    0xc1, 0xfb, 0xd, 0x6, 0x60, 0x7b, 0x43, 0x71,
+                                                    0x63, 0x1e, 0xfb, 0x22, 0xf7, 0x5e, 0x87, 0x8f,
+                                                    0x69, 0xb8, 0x8a, 0xb2, 0x19, 0xc0, 0x89, 0xc2,
+                                                    0x99, 0xb5, 0x1b, 0xb9, 0xa9, 0x74, 0x7a, 0x9a,
+                                                    0x1f, 0xa9, 0xb7, 0x5, 0xa7, 0x6e, 0x5d, 0x9f,
+                                                    0x5e, 0x1b, 0x40, 0x42, 0x68, 0x42, 0x5f, 0xa4,
+                                                    0x5c, 0xa6, 0x64, 0x1f, 0x20, 0x50, 0x85, 0x38,
+                                                    0x6b, 0x1a, 0x50, 0xb0, 0x34, 0xf6, 0xc3, 0xc0,
+                                                    0xa2, 0xb3, 0xb0, 0x1e, 0x6e, 0xb7, 0x15, 0x75,
+                                                    0x73, 0x6e, 0x6b, 0x54, 0x1b, 0x59, 0x5b, 0xa7,
+                                                    0xd8, 0xc3, 0xbb, 0xbd, 0xb0, 0x9b, 0x1f, 0xe,
+                                                    0x41, 0xa, 0xc8, 0xf7, 0x38, 0x12, 0xba, 0xc5,
+                                                    0xe6, 0xf7, 0x46, 0xb3, 0xc3, 0x13, 0xbf, 0xf7,
+                                                    0x58, 0xf8, 0xe4, 0x15, 0x5d, 0xb2, 0x67, 0xbd,
+                                                    0xbd, 0xb2, 0xaf, 0xb9, 0xb9, 0x64, 0xaf, 0x59,
+                                                    0x59, 0x64, 0x67, 0x5d, 0x1e, 0xc1, 0x16, 0x9d,
+                                                    0x9b, 0x99, 0x9e, 0x9e, 0x9b, 0x7d, 0x79, 0x7a,
+                                                    0x7b, 0x7c, 0x78, 0x78, 0x7b, 0x9a, 0x9c, 0x1e,
+                                                    0xfb, 0x2f, 0xfb, 0x86, 0x2c, 0xa, 0xf7, 0xa4,
+                                                    0xbe, 0x1, 0x6f, 0xf9, 0x24, 0x3, 0xf7, 0x5d,
+                                                    0x70, 0xa, 0xf8, 0x55, 0x80, 0xa, 0xa7, 0x5e,
+                                                    0xf7, 0x7a, 0xf7, 0x4b, 0xfb, 0x7a, 0x78, 0xa,
+                                                    0xfc, 0x59, 0x5d, 0xa, 0x7c, 0xf9, 0x3, 0x1,
+                                                    0xf7, 0xa8, 0xbe, 0x3, 0xf7, 0x8, 0xf7, 0x66,
+                                                    0x15, 0xf7, 0x4d, 0xfb, 0x75, 0xf7, 0x4b, 0xf7,
+                                                    0x7b, 0x5e, 0xa7, 0xfb, 0x4, 0xfb, 0x2e, 0x5,
+                                                    0xf8, 0x9a, 0x58, 0xfc, 0x9c, 0x7, 0xfb, 0xf,
+                                                    0xf7, 0x2f, 0x5, 0xe, 0x7d, 0xa, 0xf7, 0x61,
+                                                    0x70, 0xa, 0xf8, 0xb5, 0xbe, 0xfc, 0xb7, 0x5d,
+                                                    0xa, 0x7d, 0xa, 0x73, 0xf7, 0xa4, 0x15, 0xf8,
+                                                    0xb5, 0x80, 0xa, 0xa7, 0x5e, 0xf7, 0x79, 0xf7,
+                                                    0x4b, 0xfb, 0x79, 0x78, 0xa, 0xfc, 0xb7, 0x6,
+                                                    0xe, 0xf8, 0x1c, 0xf7, 0x14, 0x1, 0xf7, 0xa8,
+                                                    0xbe, 0x3, 0xf7, 0xa8, 0x16, 0xbe, 0xf8, 0x9a,
+                                                    0x6, 0xf7, 0x4, 0xfb, 0x2e, 0xb8, 0xa7, 0xfb,
+                                                    0x4b, 0xf7, 0x75, 0xfb, 0x4d, 0xfb, 0x75, 0xb0,
+                                                    0x6f, 0xf7, 0xf, 0xf7, 0x30, 0x5, 0xe, 0xf8,
+                                                    0xb, 0x76, 0xf7, 0xa0, 0x77, 0x1, 0xe9, 0xf8,
+                                                    0x30, 0x3, 0xe9, 0xf7, 0xf6, 0x15, 0xd8, 0xa6,
+                                                    0xd2, 0xc6, 0xc5, 0xc5, 0xc7, 0x4e, 0xd0, 0x53,
+                                                    0xd8, 0x71, 0x8, 0xba, 0x7, 0x2a, 0xd6, 0x5e,
+                                                    0xb9, 0x63, 0xee, 0x8, 0x58, 0x6, 0x68, 0x2d,
+                                                    0x5a, 0x53, 0x2c, 0x44, 0x8, 0xe, 0xf7, 0x5b,
+                                                    0xbe, 0x9e, 0xbe, 0x12, 0xc8, 0xf8, 0x71, 0x17,
+                                                    0xf6, 0xf7, 0x59, 0x15, 0xaa, 0xa1, 0xa6, 0xb4,
+                                                    0xb2, 0x1b, 0xb1, 0xaa, 0x77, 0x78, 0xac, 0x1f,
+                                                    0x7a, 0xa9, 0xaa, 0x7b, 0xb1, 0x1b, 0xcd, 0xb6,
+                                                    0xba, 0xb8, 0xac, 0x1f, 0x5f, 0xaa, 0x5, 0x77,
+                                                    0x7d, 0x5e, 0x57, 0x65, 0x1b, 0x71, 0x73, 0x9b,
+                                                    0x9b, 0x6f, 0x1f, 0x13, 0xe0, 0x9e, 0x6a, 0x64,
+                                                    0xa0, 0x53, 0x1b, 0x4c, 0x6b, 0x5e, 0x62, 0x68,
+                                                    0x1f, 0xe, 0xf7, 0x95, 0xf7, 0xf2, 0x1, 0xf7,
+                                                    0xa0, 0xcb, 0x3, 0xf7, 0x37, 0xf7, 0xc0, 0x15,
+                                                    0xcc, 0x60, 0xd5, 0xf7, 0x16, 0xd5, 0xfb, 0x16,
+                                                    0xc8, 0xb5, 0x2a, 0xf7, 0x9, 0xf7, 0x24, 0xa6,
+                                                    0x79, 0xcf, 0xfb, 0x20, 0x57, 0x98, 0xf7, 0x28,
+                                                    0x5, 0x40, 0x6, 0x94, 0xfb, 0x29, 0xfb, 0x1d,
+                                                    0xc0, 0x77, 0x47, 0xf7, 0x26, 0x6f, 0x5, 0xe,
+                                                    0x7c, 0xb1, 0xde, 0xb1, 0xf7, 0x68, 0xb5, 0xf7,
+                                                    0x1, 0xb2, 0x1, 0xb0, 0xb6, 0xe5, 0xb3, 0xf7,
+                                                    0x24, 0xb7, 0xf7, 0xd, 0xb7, 0x3, 0xf7, 0xf6,
+                                                    0xf7, 0x40, 0x15, 0x6e, 0x93, 0xa0, 0x66, 0xb9,
+                                                    0x1b, 0xdc, 0xc0, 0xe9, 0xf7, 0x0, 0xf7, 0x23,
+                                                    0xfb, 0x1, 0xea, 0xfb, 0x24, 0xfb, 0x47, 0x2d,
+                                                    0xfb, 0x15, 0xfb, 0x31, 0xfb, 0x3a, 0xf7, 0x0,
+                                                    0xfb, 0x1, 0xf7, 0x44, 0xdf, 0xd0, 0xa7, 0xb3,
+                                                    0xcc, 0x1f, 0x77, 0xb3, 0x5, 0x76, 0x6e, 0x2c,
+                                                    0x5a, 0x41, 0x1b, 0xfb, 0x11, 0xfb, 0x8, 0xdd,
+                                                    0xf7, 0x2f, 0xf7, 0xe, 0xd2, 0xf7, 0x11, 0xf7,
+                                                    0x33, 0xf7, 0xb, 0xe5, 0x36, 0xfb, 0x5, 0x3e,
+                                                    0x67, 0x33, 0x58, 0x59, 0x91, 0xd9, 0xb6, 0x95,
+                                                    0x1f, 0xac, 0xf7, 0x1c, 0x5, 0x5f, 0x6, 0x7f,
+                                                    0x5a, 0x5, 0xb6, 0x76, 0x72, 0x8e, 0x6c, 0x1b,
+                                                    0x3d, 0x59, 0x2a, 0x2a, 0x5e, 0x99, 0x56, 0xce,
+                                                    0xb4, 0xb6, 0xac, 0xac, 0x9e, 0x1f, 0xfb, 0x24,
+                                                    0xa9, 0x15, 0xc1, 0xa6, 0xef, 0xc8, 0xbd, 0x91,
+                                                    0x67, 0x79, 0x4a, 0x64, 0x30, 0x51, 0x69, 0x7e,
+                                                    0xad, 0xa1, 0x1e, 0xe, 0x7c, 0xc3, 0x5f, 0xc3,
+                                                    0xf7, 0x34, 0xc3, 0xf7, 0x1c, 0xc3, 0xc7, 0xbd,
+                                                    0x9b, 0xbc, 0x12, 0xba, 0xc5, 0xf7, 0xc9, 0xc3,
+                                                    0x13, 0xbf, 0xf7, 0x15, 0xf8, 0xa1, 0x15, 0x99,
+                                                    0x8f, 0x9f, 0xbb, 0xaf, 0x1b, 0xa7, 0x9d, 0x7d,
+                                                    0x7c, 0x9f, 0x1f, 0x79, 0xa2, 0xa6, 0x78, 0xb9,
+                                                    0x1b, 0xcb, 0xbc, 0xb9, 0xc3, 0x9e, 0x1f, 0x58,
+                                                    0x94, 0x5, 0x72, 0x82, 0x6e, 0x67, 0x66, 0x1b,
+                                                    0x70, 0x78, 0x9b, 0x9d, 0x74, 0x1f, 0x9b, 0x76,
+                                                    0x73, 0x9a, 0x65, 0x1b, 0x57, 0x55, 0x67, 0x4a,
+                                                    0x75, 0x1f, 0x9d, 0xfb, 0x4d, 0x2c, 0xa, 0x7c,
+                                                    0xc2, 0x60, 0xc3, 0xf7, 0xea, 0xc3, 0x12, 0xf5,
+                                                    0xc4, 0xf7, 0xf9, 0xc7, 0x13, 0x78, 0x9e, 0x88,
+                                                    0x15, 0xf7, 0x24, 0xd1, 0x6, 0x13, 0xb8, 0x7b,
+                                                    0x99, 0xb5, 0x49, 0xf7, 0x18, 0x1b, 0xf7, 0x1e,
+                                                    0xe6, 0xf7, 0xa, 0xf7, 0x2, 0xf7, 0x2b, 0x27,
+                                                    0xe2, 0xfb, 0x13, 0xfb, 0x4, 0x4f, 0x4c, 0x72,
+                                                    0x79, 0x1f, 0xf7, 0x9e, 0xfb, 0x24, 0x54, 0xe2,
+                                                    0x7, 0x13, 0x78, 0xfc, 0x9d, 0x34, 0x7, 0xf7,
+                                                    0x25, 0xf7, 0x3d, 0x15, 0xf5, 0xe4, 0xce, 0xe4,
+                                                    0xf7, 0xc, 0xc6, 0x36, 0x2a, 0x8a, 0x1e, 0x13,
+                                                    0xb8, 0x24, 0x8a, 0x34, 0x45, 0x31, 0x1b, 0x38,
+                                                    0x2c, 0xc5, 0xf7, 0x10, 0x1f, 0xe, 0xfb, 0x1d,
+                                                    0xf9, 0xce, 0x1, 0xcf, 0xf8, 0x64, 0x3, 0xf8,
+                                                    0x7b, 0xfb, 0x1d, 0x15, 0xb8, 0xa3, 0xfc, 0x37,
+                                                    0xf9, 0xb6, 0x5e, 0x70, 0x5, 0xe, 0xfb, 0x79,
+                                                    0x76, 0xfa, 0x7c, 0x77, 0x68, 0xa, 0xbe, 0x3,
+                                                    0xf7, 0xa6, 0xfb, 0x8e, 0x15, 0xbe, 0xfa, 0x7c,
+                                                    0x58, 0x6, 0xe, 0xfb, 0x78, 0xbf, 0xf9, 0xf1,
+                                                    0xc4, 0x1, 0xf7, 0x9f, 0xc5, 0x3, 0xf7, 0x40,
+                                                    0xf7, 0x82, 0x15, 0xd9, 0x72, 0x9c, 0x75, 0x2b,
+                                                    0x1a, 0xfb, 0x50, 0x7, 0x49, 0xae, 0x46, 0xf7,
+                                                    0x11, 0x1e, 0xbf, 0x7, 0x4e, 0x8e, 0x62, 0xae,
+                                                    0xbb, 0x1a, 0xf7, 0x4d, 0x7, 0xcc, 0x8a, 0xc7,
+                                                    0x3a, 0xb0, 0x1e, 0xdc, 0xb4, 0x8c, 0xbe, 0xd1,
+                                                    0x1a, 0xf7, 0x5c, 0x7, 0xbb, 0xb4, 0x9a, 0xc8,
+                                                    0x8e, 0x1e, 0xc4, 0x7, 0xfb, 0x17, 0x6e, 0x4e,
+                                                    0x41, 0x1f, 0xfb, 0x50, 0x7, 0x2b, 0x77, 0x75,
+                                                    0x40, 0x72, 0x1e, 0xe, 0xfb, 0x78, 0xbf, 0xf9,
+                                                    0xf5, 0xc0, 0x68, 0xa, 0xc5, 0x3, 0xf7, 0x40,
+                                                    0xfb, 0x44, 0x15, 0x57, 0x7, 0xf7, 0x11, 0xae,
+                                                    0xd0, 0xcd, 0x1f, 0xf7, 0x50, 0x7, 0xeb, 0x9c,
+                                                    0xa1, 0xd9, 0xa4, 0x1e, 0xb1, 0x7, 0x40, 0xa4,
+                                                    0x77, 0xa1, 0xeb, 0x1a, 0xf7, 0x50, 0x7, 0xd5,
+                                                    0x6e, 0xc8, 0xfb, 0x17, 0x1e, 0x56, 0x7, 0xc8,
+                                                    0x88, 0xb4, 0x78, 0x5b, 0x1a, 0xfb, 0x5c, 0x7,
+                                                    0x45, 0x8c, 0x58, 0xdc, 0x62, 0x1e, 0x3a, 0x66,
+                                                    0x8a, 0x4f, 0x4a, 0x1a, 0xfb, 0x4d, 0x7, 0x5b,
+                                                    0x62, 0x68, 0x4e, 0x88, 0x1e, 0xe, 0x3d, 0x77,
+                                                    0x9f, 0xc1, 0xf9, 0x2, 0xc1, 0x1, 0xf7, 0x69,
+                                                    0xc2, 0x3, 0xf7, 0x69, 0x3d, 0x15, 0xf7, 0x41,
+                                                    0xc1, 0xfb, 0xa, 0xf9, 0x2, 0xf7, 0xa, 0xc1,
+                                                    0xfb, 0x41, 0x6, 0xe, 0x3d, 0xc1, 0xf9, 0x2,
+                                                    0xc1, 0x1, 0xf7, 0xdf, 0xc2, 0x3, 0xf7, 0x69,
+                                                    0x73, 0x15, 0x55, 0xf7, 0x41, 0xf9, 0x6e, 0xfb,
+                                                    0x41, 0x55, 0xf7, 0xa, 0xfd, 0x2, 0x7, 0xe,
+                                                    0xf8, 0x89, 0xb2, 0x1, 0xf7, 0x2d, 0xf8, 0xf5,
+                                                    0x15, 0x3b, 0xaf, 0xc3, 0x6f, 0xc4, 0x1b, 0xd5,
+                                                    0xc0, 0xbc, 0xc6, 0x9d, 0x1f, 0x61, 0x6, 0x6d,
+                                                    0x80, 0x64, 0x64, 0x55, 0x1b, 0x60, 0x63, 0xa5,
+                                                    0xb6, 0x78, 0x1f, 0xe, 0xfb, 0x2e, 0x76, 0xf9,
+                                                    0xe6, 0x77, 0x68, 0xa, 0xbe, 0x3, 0xf7, 0xa6,
+                                                    0xf7, 0xaf, 0x15, 0xbe, 0xf8, 0x1c, 0x58, 0x6,
+                                                    0xfd, 0xe6, 0x4, 0xbe, 0xf8, 0x1c, 0x58, 0x6,
+                                                    0xe, 0xf7, 0x16, 0xf7, 0x91, 0x1, 0xf7, 0x40,
+                                                    0xf7, 0x94, 0x3, 0xf7, 0x40, 0xf7, 0x95, 0x15,
+                                                    0x45, 0xc4, 0x52, 0xd2, 0xd3, 0xc3, 0xc4, 0xd1,
+                                                    0xd1, 0x53, 0xc3, 0x43, 0x44, 0x52, 0x53, 0x45,
+                                                    0x1e, 0xe, 0x7c, 0xc0, 0xf7, 0xef, 0xc3, 0x1,
+                                                    0xcf, 0xc1, 0xf7, 0xe4, 0xc1, 0x3, 0xf8, 0x89,
+                                                    0xf7, 0x8, 0x15, 0x76, 0x74, 0x34, 0x52, 0x3b,
+                                                    0x1b, 0xfb, 0x19, 0x53, 0xe7, 0xdf, 0xe4, 0xd4,
+                                                    0xdd, 0xf7, 0x4, 0xc4, 0xbf, 0x73, 0x67, 0xb5,
+                                                    0x1f, 0x46, 0xc1, 0xf7, 0x4d, 0x55, 0x5b, 0x7,
+                                                    0xaa, 0x5e, 0x5c, 0x9c, 0x51, 0x1b, 0xfb, 0x3e,
+                                                    0x45, 0xfb, 0x19, 0x30, 0xfb, 0x28, 0xec, 0x37,
+                                                    0xf7, 0x24, 0xeb, 0xcb, 0xab, 0xbb, 0xc9, 0x1f,
+                                                    0xe, 0xf8, 0x80, 0xc3, 0x1, 0xf7, 0x10, 0xf7,
+                                                    0xf4, 0x3, 0xf7, 0x9c, 0xf8, 0x80, 0x15, 0xd6,
+                                                    0x6, 0xf7, 0x1d, 0xf7, 0x31, 0x64, 0x9f, 0xfb,
+                                                    0x1c, 0xfb, 0xd, 0xfb, 0x1f, 0xf7, 0xc, 0x65,
+                                                    0x77, 0x5, 0xe, 0xfb, 0x21, 0x76, 0xf7, 0x40,
+                                                    0xbd, 0xf7, 0xdc, 0xc0, 0x12, 0xcf, 0xc2, 0xf7,
+                                                    0x2d, 0xe9, 0x5d, 0xb9, 0xea, 0xc2, 0x13, 0xfa,
+                                                    0xf7, 0xab, 0x95, 0x15, 0x86, 0x44, 0x5, 0x9c,
+                                                    0x92, 0xac, 0x8b, 0x71, 0x1a, 0x13, 0x72, 0x6d,
+                                                    0x5d, 0x85, 0x74, 0xa1, 0x1e, 0x7d, 0x65, 0x5,
+                                                    0x13, 0x76, 0x79, 0xa9, 0x9d, 0x8a, 0x93, 0x1b,
+                                                    0xb2, 0xad, 0xad, 0xb7, 0xb0, 0x73, 0x9f, 0x78,
+                                                    0x8d, 0x1f, 0xa3, 0x7, 0xde, 0x8f, 0xcd, 0xa8,
+                                                    0xc2, 0xb4, 0x75, 0xbf, 0x18, 0x76, 0x72, 0x3c,
+                                                    0x54, 0x3a, 0x1b, 0xfb, 0x31, 0x56, 0xf5, 0xc8,
+                                                    0xdf, 0xdd, 0xd8, 0xf7, 0x7, 0xc4, 0xc0, 0x7e,
+                                                    0x69, 0xb7, 0x1f, 0x41, 0xc2, 0xf7, 0x42, 0x54,
+                                                    0x7, 0x13, 0x4, 0x5e, 0x7, 0xa8, 0x5c, 0x5b,
+                                                    0x9b, 0x51, 0x1b, 0xfb, 0x43, 0x46, 0xfb, 0x11,
+                                                    0x35, 0xfb, 0x14, 0xec, 0x3a, 0xf7, 0x6, 0x80,
+                                                    0x1f, 0xe, 0xfb, 0x2b, 0xb3, 0xbb, 0xb3, 0x12,
+                                                    0xf7, 0xa5, 0xbd, 0x87, 0xbd, 0x13, 0xd0, 0xf7,
+                                                    0x7b, 0xfb, 0x1b, 0x15, 0x80, 0x9c, 0x9d, 0x86,
+                                                    0x9e, 0x1b, 0xb6, 0xb4, 0xa7, 0xb8, 0x1f, 0x13,
+                                                    0xe0, 0xae, 0x71, 0x9d, 0x77, 0x8d, 0x1e, 0xac,
+                                                    0x59, 0x7, 0x83, 0x3d, 0x5, 0x8f, 0x98, 0x94,
+                                                    0x8c, 0x93, 0x1b, 0x9e, 0x90, 0x7e, 0x80, 0x7a,
+                                                    0x7c, 0x84, 0x7a, 0x7c, 0x7b, 0x90, 0x93, 0x81,
+                                                    0x1f, 0xe, 0x6f, 0x76, 0xf7, 0x22, 0xc2, 0xf7,
+                                                    0x94, 0xc2, 0x1, 0xed, 0xc1, 0xf7, 0x8, 0xc3,
+                                                    0xf7, 0x1, 0xc1, 0x3, 0xf7, 0xa0, 0x5a, 0x15,
+                                                    0xc3, 0xf7, 0x22, 0x6, 0xd0, 0x8d, 0xd3, 0xa7,
+                                                    0xaf, 0xaa, 0x75, 0xbd, 0x18, 0x6b, 0x57, 0x56,
+                                                    0x73, 0x4b, 0x1b, 0xfb, 0xb, 0x64, 0xd2, 0xbe,
+                                                    0xd3, 0xc3, 0xc9, 0xed, 0xb8, 0xb3, 0x82, 0x71,
+                                                    0xb5, 0x1f, 0x55, 0xc1, 0xf7, 0x3c, 0x55, 0x56,
+                                                    0x7, 0x61, 0xa1, 0x6e, 0x8e, 0x65, 0x8f, 0x8,
+                                                    0xf7, 0x32, 0x53, 0xfb, 0x32, 0x7, 0x42, 0x84,
+                                                    0x2a, 0x52, 0xfb, 0xf, 0x1a, 0xfb, 0x8, 0xe1,
+                                                    0x51, 0xdf, 0x86, 0x1e, 0xe, 0xf8, 0xe9, 0xc4,
+                                                    0x1, 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7, 0x36,
+                                                    0xf8, 0x71, 0x15, 0xf7, 0x1e, 0xf7, 0xc, 0xf7,
+                                                    0x1d, 0xfb, 0xc, 0xb2, 0x9d, 0xfb, 0x1e, 0xf7,
+                                                    0x33, 0x5, 0x40, 0x6, 0xfb, 0x1f, 0xfb, 0x33,
+                                                    0x5, 0xe, 0xf4, 0xf7, 0xe, 0xf7, 0x30, 0xf7,
+                                                    0xe, 0x7a, 0xa, 0xf8, 0x50, 0x15, 0x52, 0xa,
+                                                    0xfb, 0xaa, 0x4, 0x52, 0xa, 0xe, 0xf7, 0x6e,
+                                                    0xf7, 0x37, 0x3, 0xf7, 0x6e, 0xfb, 0x4, 0x15,
+                                                    0xca, 0x6, 0xef, 0xf7, 0x7e, 0x5, 0x2e, 0x6,
+                                                    0xe, 0x79, 0xb9, 0xe2, 0xc0, 0xf7, 0x84, 0xbb,
+                                                    0xdb, 0xb7, 0x1, 0x8b, 0xb9, 0xf2, 0xba, 0xf7,
+                                                    0xfb, 0xb8, 0x3, 0xf7, 0xab, 0x4, 0xfb, 0x38,
+                                                    0xf7, 0x1a, 0xfb, 0x19, 0xf7, 0x3b, 0xf7, 0x35,
+                                                    0xf7, 0x1e, 0xf7, 0xe, 0xf7, 0x43, 0xf7, 0x4b,
+                                                    0xfb, 0x21, 0xf7, 0xa, 0xfb, 0x32, 0xfb, 0x2f,
+                                                    0xfb, 0x26, 0xfb, 0xb, 0xfb, 0x4a, 0x1e, 0xb9,
+                                                    0x16, 0xf7, 0x18, 0xee, 0xf7, 0x11, 0xf7, 0x30,
+                                                    0xf7, 0x21, 0xf7, 0x5, 0xfb, 0xc, 0xfb, 0x1d,
+                                                    0xfb, 0x22, 0xfb, 0x4, 0xfb, 0x1, 0xfb, 0x22,
+                                                    0xfb, 0x1b, 0xfb, 0xc, 0xf7, 0x1, 0xf7, 0x22,
+                                                    0x1e, 0xf8, 0x7, 0x43, 0x15, 0x6f, 0x71, 0x64,
+                                                    0x80, 0x65, 0x1b, 0x4f, 0x51, 0xb6, 0xd2, 0xda,
+                                                    0xc3, 0xba, 0xc9, 0xa6, 0xb2, 0x81, 0x75, 0x9e,
+                                                    0x1f, 0xac, 0xac, 0x5, 0xad, 0x6a, 0x5d, 0x98,
+                                                    0x64, 0x1b, 0x33, 0x3e, 0x3f, 0x29, 0x20, 0xdc,
+                                                    0x4f, 0xdf, 0xbc, 0xbe, 0x9e, 0xb2, 0xae, 0x1f,
+                                                    0xe, 0xd7, 0xba, 0xf7, 0xd2, 0xba, 0x1, 0xe9,
+                                                    0xba, 0xf7, 0xd2, 0xbb, 0x3, 0xd4, 0xe1, 0x15,
+                                                    0xab, 0x6f, 0xcc, 0xca, 0x5, 0x63, 0xc0, 0xb9,
+                                                    0x86, 0xaa, 0x1b, 0xbd, 0xba, 0x9b, 0xa8, 0xb1,
+                                                    0x1f, 0xc9, 0x4c, 0xa9, 0xa8, 0x4b, 0xcb, 0x5,
+                                                    0xa8, 0xb1, 0x9a, 0xba, 0xbb, 0x1a, 0xba, 0x7d,
+                                                    0xba, 0x6d, 0xae, 0x1e, 0xcb, 0xcb, 0x6c, 0xa8,
+                                                    0x4d, 0x4c, 0x5, 0xaa, 0x66, 0x5d, 0x99, 0x5b,
+                                                    0x1b, 0x59, 0x59, 0x7b, 0x6d, 0x67, 0x1f, 0x4c,
+                                                    0xcb, 0x6c, 0x6c, 0xcd, 0x4c, 0x5, 0x68, 0x5f,
+                                                    0x81, 0x5f, 0x63, 0x1a, 0x5b, 0x9a, 0x5b, 0xaa,
+                                                    0x67, 0x1e, 0x8c, 0xf7, 0x16, 0x15, 0xda, 0xc9,
+                                                    0xdb, 0xee, 0xe9, 0xca, 0x3e, 0x39, 0x2a, 0x40,
+                                                    0x4d, 0x38, 0x33, 0x43, 0xd1, 0xe4, 0x1e, 0xe,
+                                                    0x7c, 0xc2, 0x61, 0xc2, 0xf7, 0xe1, 0xc7, 0xf7,
+                                                    0x14, 0xc2, 0x12, 0xa6, 0xc4, 0xf7, 0xf3, 0xc3,
+                                                    0x13, 0x7c, 0xf8, 0x47, 0x89, 0x15, 0xf7, 0x1e,
+                                                    0xc2, 0x39, 0xf8, 0xd4, 0xfb, 0x4d, 0x54, 0xf7,
+                                                    0x15, 0xfb, 0x70, 0x6, 0xd7, 0x5e, 0x40, 0x9b,
+                                                    0x54, 0x1b, 0xfb, 0x1f, 0x2d, 0x27, 0xfb, 0x15,
+                                                    0x1f, 0x13, 0xbc, 0xfb, 0x8, 0xda, 0xfb, 0x8,
+                                                    0xf7, 0x2a, 0xd3, 0xce, 0xa8, 0xc5, 0xb3, 0x1e,
+                                                    0x13, 0x7c, 0xfb, 0xf3, 0xf7, 0x25, 0x15, 0xe7,
+                                                    0xd1, 0xd8, 0xf2, 0xf7, 0xf, 0xbd, 0x2b, 0x46,
+                                                    0x1e, 0x13, 0xbc, 0x21, 0x45, 0x40, 0x24, 0xfb,
+                                                    0x5, 0x4f, 0xe5, 0xe2, 0x1e, 0xe, 0xf7, 0xfc,
+                                                    0xc2, 0xf7, 0x39, 0x77, 0x1, 0xf7, 0xa5, 0xc2,
+                                                    0x3, 0xf7, 0xa5, 0x3c, 0x15, 0xc2, 0xf8, 0x4b,
+                                                    0xf7, 0x17, 0xc2, 0xfb, 0x17, 0xf7, 0x39, 0x54,
+                                                    0xfb, 0x39, 0xfb, 0x18, 0x54, 0xf7, 0x18, 0x6,
+                                                    0xe, 0xd0, 0xf7, 0xc9, 0xfb, 0x8e, 0xf7, 0xca,
+                                                    0x12, 0xf7, 0x21, 0xf7, 0x52, 0x13, 0xa0, 0xf7,
+                                                    0x21, 0xd0, 0x15, 0xf7, 0x15, 0xfb, 0x27, 0xc8,
+                                                    0xf7, 0x27, 0xf7, 0x14, 0x6, 0x13, 0x60, 0xc6,
+                                                    0xfb, 0x14, 0x7, 0x13, 0xa0, 0xf7, 0x8e, 0xf7,
+                                                    0x14, 0x7, 0x13, 0x60, 0xc7, 0xfb, 0x14, 0xf7,
+                                                    0x22, 0x4e, 0xfb, 0x22, 0xfb, 0x15, 0x7, 0x13,
+                                                    0xa0, 0x4f, 0xf7, 0x15, 0x7, 0x13, 0x60, 0xfb,
+                                                    0x8e, 0xfb, 0x15, 0x7, 0xe, 0xf7, 0xa4, 0xc9,
+                                                    0xf7, 0x76, 0xc9, 0x1, 0xf7, 0xf, 0xc9, 0xf7,
+                                                    0x77, 0xcc, 0x3, 0xf7, 0xf, 0xf8, 0x51, 0x15,
+                                                    0x2c, 0xd6, 0x3a, 0xf1, 0xeb, 0xdc, 0xd3, 0xf6,
+                                                    0xd8, 0x58, 0xec, 0xfb, 0x10, 0x25, 0x3e, 0x3b,
+                                                    0x2a, 0x1e, 0xc9, 0x16, 0xbc, 0xb0, 0xcd, 0xdb,
+                                                    0xe0, 0xa4, 0x3d, 0x66, 0x49, 0x59, 0x5b, 0x4d,
+                                                    0x46, 0x5d, 0xc5, 0xc3, 0x1e, 0xe, 0xf8, 0x80,
+                                                    0xf2, 0x1, 0xf7, 0x27, 0xf7, 0x4, 0xdc, 0xf7,
+                                                    0x4, 0x3, 0xf7, 0x27, 0xf8, 0x80, 0x15, 0xf7,
+                                                    0x4, 0xf2, 0xfb, 0x4, 0x6, 0xf7, 0x55, 0x24,
+                                                    0x15, 0xf7, 0x4, 0xf2, 0xfb, 0x4, 0x6, 0xe,
+                                                    0xbb, 0xf3, 0xd5, 0xca, 0xd5, 0xf3, 0x1, 0xf7,
+                                                    0x8a, 0xf3, 0x14, 0xe0, 0xe2, 0xf7, 0x76, 0x15,
+                                                    0xf8, 0x3e, 0xca, 0xfc, 0x3e, 0x6, 0xf7, 0x33,
+                                                    0xf7, 0x12, 0x15, 0x51, 0xa, 0xfb, 0xcf, 0x4,
+                                                    0x51, 0xa, 0xe, 0x22, 0x76, 0xf7, 0x20, 0xbb,
+                                                    0xf8, 0x4b, 0xbf, 0x9a, 0x77, 0xf7, 0x4, 0x77,
+                                                    0x12, 0xf7, 0x0, 0xc0, 0xf7, 0x2, 0xc2, 0xec,
+                                                    0xc1, 0x62, 0xc3, 0x13, 0xee, 0x80, 0xf6, 0x99,
+                                                    0x15, 0xc1, 0xbb, 0x6, 0xab, 0x73, 0xa0, 0x7b,
+                                                    0xc4, 0x83, 0x8, 0xfb, 0x20, 0xc2, 0xf7, 0x20,
+                                                    0x7, 0xf7, 0x4, 0x94, 0xc1, 0xd3, 0xd8, 0x1a,
+                                                    0xf7, 0x0, 0xfb, 0x20, 0xa2, 0x48, 0x9f, 0x1e,
+                                                    0x66, 0x96, 0x34, 0xa9, 0xbf, 0x1a, 0xc7, 0xcb,
+                                                    0xa4, 0xce, 0x1e, 0x13, 0xdf, 0x0, 0xc0, 0xc1,
+                                                    0x7c, 0x70, 0xa3, 0x1f, 0x58, 0xc1, 0xf7, 0x34,
+                                                    0x55, 0x5b, 0x7, 0x13, 0xee, 0x80, 0x74, 0xa0,
+                                                    0x60, 0x94, 0x6b, 0x8e, 0x8, 0xf6, 0x54, 0x20,
+                                                    0x7, 0x4b, 0x29, 0x64, 0x24, 0x1f, 0x8b, 0x7,
+                                                    0x43, 0xcf, 0x62, 0xee, 0x70, 0x1e, 0xd5, 0x76,
+                                                    0xe2, 0x74, 0x50, 0x1a, 0x47, 0x51, 0x65, 0x45,
+                                                    0x4f, 0x53, 0xa5, 0xb0, 0x6c, 0x1e, 0xc3, 0x55,
+                                                    0x7, 0xe, 0xf8, 0x71, 0xf2, 0x1, 0xf7, 0x8c,
+                                                    0xf2, 0x3, 0xf7, 0x8c, 0xf8, 0x71, 0x15, 0xf2,
+                                                    0xf2, 0x24, 0x6, 0xe, 0x74, 0xa, 0xf7, 0xa6,
+                                                    0x73, 0xa, 0xc1, 0xfb, 0x44, 0xf8, 0x8, 0xfb,
+                                                    0x5b, 0x55, 0xf7, 0x24, 0xfb, 0xd2, 0xfb, 0x47,
+                                                    0x6, 0xe, 0x7f, 0xc1, 0xf7, 0x3c, 0xc2, 0xf7,
+                                                    0x12, 0xc3, 0x1, 0xca, 0xc4, 0x3, 0xf7, 0xc,
+                                                    0xf7, 0x66, 0x15, 0xf8, 0x2e, 0x6, 0xf7, 0x12,
+                                                    0x48, 0xf7, 0x3, 0xfb, 0x35, 0xfb, 0x19, 0x21,
+                                                    0x2f, 0xfb, 0x1e, 0xfb, 0xa, 0xd0, 0xfb, 0x3,
+                                                    0xf7, 0x43, 0xdc, 0xdf, 0x99, 0xac, 0xcb, 0x1e,
+                                                    0x7a, 0xc0, 0x5, 0x64, 0x41, 0x39, 0x84, 0x5c,
+                                                    0x1b, 0x5c, 0x5e, 0x91, 0xa3, 0x65, 0x1f, 0x67,
+                                                    0xa2, 0x6d, 0xc1, 0xc0, 0x1a, 0x8d, 0xca, 0x15,
+                                                    0xc6, 0x93, 0xc6, 0xce, 0xf7, 0x5, 0x1b, 0xf7,
+                                                    0x1e, 0xaa, 0x26, 0x72, 0x1f, 0xe, 0x5a, 0xa,
+                                                    0xf7, 0x46, 0xf8, 0x81, 0x15, 0xf7, 0xb9, 0xf2,
+                                                    0x69, 0xd7, 0xfb, 0xa3, 0xfb, 0x28, 0x5, 0x5a,
+                                                    0xfb, 0xd9, 0x22, 0xa, 0x5a, 0xa, 0xf7, 0x2c,
+                                                    0xf8, 0x7d, 0x15, 0xf7, 0x2c, 0xf7, 0xa, 0xf7,
+                                                    0x29, 0xfb, 0xa, 0xb6, 0x9d, 0xfb, 0x2c, 0xf7,
+                                                    0x31, 0x5, 0x3a, 0x6, 0xfb, 0x2d, 0xfb, 0x31,
+                                                    0x5, 0x92, 0xfb, 0xc8, 0x22, 0xa, 0x5e, 0xa,
+                                                    0xdc, 0xf7, 0x7, 0x56, 0xa, 0xf7, 0xde, 0xf8,
+                                                    0xa6, 0x59, 0xa, 0x4d, 0xfc, 0x52, 0x22, 0xa,
+                                                    0x7c, 0x82, 0xa, 0xf7, 0x1f, 0xc3, 0x56, 0xa,
+                                                    0xf7, 0x31, 0xf8, 0xe8, 0x15, 0xf7, 0xb9, 0x24,
+                                                    0x97, 0xaa, 0xfb, 0xa3, 0xf7, 0x28, 0x5, 0x41,
+                                                    0xfc, 0x6d, 0x22, 0xa, 0x7c, 0xbd, 0xf7, 0x8a,
+                                                    0xc2, 0xf7, 0x7e, 0xbf, 0x12, 0xf1, 0xc4, 0x61,
+                                                    0xc5, 0xf7, 0x8c, 0xc6, 0x61, 0xc5, 0x13, 0xf2,
+                                                    0xf7, 0x56, 0xf7, 0xcc, 0x15, 0x75, 0x7e, 0x45,
+                                                    0x5c, 0x2b, 0x1a, 0x30, 0xc7, 0x3b, 0xf7, 0x1c,
+                                                    0xf7, 0x15, 0xd2, 0xd5, 0xee, 0xea, 0x4b, 0xb7,
+                                                    0x67, 0x9a, 0x1e, 0x13, 0xec, 0xaa, 0x96, 0xc0,
+                                                    0xb9, 0xe2, 0x1a, 0xc9, 0x5e, 0xf3, 0xfb, 0x1b,
+                                                    0x22, 0x3b, 0x49, 0x27, 0x4a, 0xb8, 0x50, 0xab,
+                                                    0x77, 0x1e, 0x13, 0xf2, 0x68, 0xfb, 0x2e, 0x15,
+                                                    0xcf, 0xc9, 0xc2, 0xd9, 0xd9, 0xca, 0x54, 0x47,
+                                                    0x47, 0x4c, 0x54, 0x3d, 0x3d, 0x4d, 0xc2, 0xcf,
+                                                    0x1e, 0x13, 0xec, 0x9b, 0xf7, 0xbe, 0x15, 0xcd,
+                                                    0xc3, 0xbb, 0xcf, 0xcf, 0xc3, 0x5b, 0x49, 0x49,
+                                                    0x53, 0x55, 0x47, 0x47, 0x53, 0xc1, 0xcd, 0x1e,
+                                                    0xe, 0x7c, 0xf7, 0x12, 0x1, 0xb0, 0xf7, 0x11,
+                                                    0xd4, 0xf7, 0x14, 0xd4, 0xf7, 0x13, 0x3, 0xf8,
+                                                    0x48, 0xba, 0x15, 0x6c, 0xa4, 0x6c, 0xb3, 0xa9,
+                                                    0xab, 0xa5, 0xae, 0xac, 0x72, 0xab, 0x65, 0x67,
+                                                    0x6f, 0x6e, 0x68, 0x1e, 0xfb, 0x5d, 0x16, 0x6c,
+                                                    0xa4, 0x6c, 0xb4, 0xaa, 0xaa, 0xa5, 0xae, 0xac,
+                                                    0x73, 0xab, 0x65, 0x65, 0x6f, 0x6e, 0x68, 0x1e,
+                                                    0xfb, 0x5a, 0x16, 0x6c, 0xa3, 0x6c, 0xb3, 0xaa,
+                                                    0xa9, 0xa5, 0xae, 0xac, 0x73, 0xab, 0x65, 0x67,
+                                                    0x70, 0x6e, 0x68, 0x1e, 0xe, 0xf7, 0x7b, 0xc1,
+                                                    0x1, 0x8b, 0xf8, 0xec, 0x3, 0xf7, 0x7b, 0x4,
+                                                    0xf8, 0xec, 0xc1, 0xfc, 0xec, 0x6, 0xe, 0xf7,
+                                                    0x7b, 0xc1, 0x1, 0xd6, 0xf8, 0x56, 0x3, 0xd6,
+                                                    0xf7, 0x7b, 0x15, 0xf8, 0x56, 0xc1, 0xfc, 0x56,
+                                                    0x6, 0xe, 0xf7, 0x1e, 0xc7, 0xf7, 0x8, 0xc8,
+                                                    0x1, 0xe5, 0xf8, 0x37, 0x3, 0xe5, 0xf7, 0xcf,
+                                                    0x15, 0xf8, 0x37, 0xc8, 0xfc, 0x37, 0x6, 0xfb,
+                                                    0x82, 0x4, 0xf8, 0x37, 0xc7, 0xfc, 0x37, 0x6,
+                                                    0xe, 0x7c, 0xbf, 0xf7, 0xe3, 0xbf, 0x1, 0xc9,
+                                                    0xc0, 0xf8, 0x0, 0xc6, 0x3, 0xf7, 0x6f, 0xf8,
+                                                    0x59, 0x15, 0xf4, 0xd1, 0xd5, 0x5c, 0xb1, 0x3a,
+                                                    0x91, 0x7e, 0x19, 0xa9, 0x67, 0x4f, 0x97, 0x58,
+                                                    0x1b, 0xfb, 0x36, 0x44, 0xfb, 0xd, 0x28, 0xfb,
+                                                    0x1b, 0xf1, 0x37, 0xf7, 0x1a, 0xf7, 0x3a, 0xd3,
+                                                    0xf7, 0x7, 0xf7, 0xd, 0x8d, 0x1f, 0x8e, 0x7,
+                                                    0xe5, 0x65, 0xf7, 0x2c, 0xfb, 0x11, 0xe6, 0x1e,
+                                                    0xe1, 0xc5, 0x71, 0xb9, 0xfb, 0x2, 0x42, 0x66,
+                                                    0x9e, 0x53, 0x96, 0x61, 0x91, 0x19, 0x79, 0x5c,
+                                                    0xaa, 0x88, 0xb3, 0x82, 0xa9, 0x7e, 0x19, 0x3b,
+                                                    0x51, 0x5, 0x3d, 0xfb, 0xb6, 0x15, 0xea, 0xcc,
+                                                    0xd4, 0xf7, 0x2, 0xf7, 0x2c, 0xb0, 0x22, 0x4d,
+                                                    0x26, 0x3f, 0x48, 0x23, 0xfb, 0x2, 0x41, 0xd6,
+                                                    0xe7, 0x1e, 0xe, 0x7c, 0xf7, 0x14, 0xf8, 0x64,
+                                                    0x77, 0x12, 0xf7, 0x80, 0xf7, 0x14, 0x2c, 0xcd,
+                                                    0x13, 0xd0, 0xf7, 0xaa, 0xf7, 0x49, 0x15, 0xbb,
+                                                    0x6, 0x9d, 0xf8, 0x18, 0x5, 0x37, 0x6, 0x13,
+                                                    0xe0, 0x73, 0xfc, 0x9d, 0x15, 0x6c, 0xa4, 0x6b,
+                                                    0xb2, 0x1e, 0xb3, 0xa3, 0xaa, 0xac, 0xab, 0x6d,
+                                                    0xab, 0x6b, 0x1f, 0x13, 0x60, 0x60, 0x74, 0x69,
+                                                    0x6c, 0x1f, 0xe, 0xfb, 0x1c, 0x76, 0xf8, 0x67,
+                                                    0xf7, 0xc, 0x1, 0xf7, 0xa2, 0xc8, 0x3, 0xf7,
+                                                    0x80, 0xf8, 0x5, 0x15, 0x6b, 0xa7, 0x70, 0xaf,
+                                                    0xb5, 0xa1, 0xa9, 0xa9, 0xa9, 0x71, 0xa9, 0x64,
+                                                    0x63, 0x74, 0x6f, 0x6a, 0x1e, 0xa4, 0xfc, 0xa2,
+                                                    0x15, 0xd9, 0x6, 0x7b, 0xf8, 0x21, 0x5, 0x5f,
+                                                    0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xd8, 0xc2, 0xf7,
+                                                    0x1f, 0xc2, 0x1, 0xf7, 0x58, 0xc3, 0x3, 0xe6,
+                                                    0x16, 0xf8, 0xd, 0xc2, 0xfb, 0x6c, 0xf7, 0xd8,
+                                                    0xf7, 0x62, 0xc2, 0xfb, 0x62, 0x6, 0x8c, 0xf7,
+                                                    0x11, 0x8a, 0x98, 0xf7, 0x7, 0x8c, 0x8, 0xb1,
+                                                    0xc9, 0x81, 0x85, 0xaf, 0x1f, 0x90, 0xc3, 0x5,
+                                                    0x90, 0x6a, 0x45, 0x95, 0x63, 0x1b, 0xfb, 0x20,
+                                                    0x8c, 0x6f, 0x6a, 0x8a, 0xfb, 0x36, 0x8, 0x22,
+                                                    0x54, 0xf4, 0xfb, 0xd8, 0x22, 0x6, 0xe, 0x8b,
+                                                    0xc0, 0xf7, 0xd5, 0xc0, 0xde, 0xf7, 0xd, 0x1,
+                                                    0xf7, 0x1, 0xc2, 0xf7, 0xa3, 0xc2, 0x3, 0xf8,
+                                                    0x37, 0xf8, 0x92, 0x15, 0xd2, 0xf7, 0xb, 0x44,
+                                                    0x6, 0x33, 0xfd, 0x9, 0x15, 0xf7, 0x9e, 0xc0,
+                                                    0x20, 0xf8, 0xa, 0xfb, 0x1c, 0x56, 0xdc, 0xfb,
+                                                    0xd5, 0x23, 0x6, 0xfb, 0xdc, 0x56, 0x48, 0xa,
+                                                    0x4a, 0xa, 0x7c, 0xc3, 0xf7, 0xa5, 0xc9, 0xf7,
+                                                    0x40, 0xc6, 0x1, 0xf7, 0x14, 0xc9, 0xf7, 0x8d,
+                                                    0xc9, 0x3, 0xec, 0xa7, 0x15, 0x6c, 0xd2, 0xc5,
+                                                    0x7f, 0xc2, 0x1b, 0xf7, 0x1c, 0xe0, 0xdc, 0xf7,
+                                                    0x9, 0x8a, 0x1f, 0xf7, 0xc, 0x8a, 0x38, 0xd4,
+                                                    0xfb, 0x5, 0x1b, 0x63, 0x6b, 0x80, 0x76, 0x61,
+                                                    0x1f, 0xf7, 0x60, 0xf7, 0xa8, 0xc6, 0xfb, 0xe6,
+                                                    0xfb, 0xd5, 0x7, 0xb5, 0x73, 0x5, 0xaf, 0xb6,
+                                                    0xbb, 0x9b, 0xb6, 0x1b, 0xd6, 0xc7, 0x5b, 0x35,
+                                                    0x2b, 0x42, 0x61, 0x36, 0x8a, 0x1f, 0x55, 0x8a,
+                                                    0x51, 0x9a, 0x58, 0xaa, 0x8, 0xe, 0x8b, 0xc2,
+                                                    0xf7, 0xd3, 0xc0, 0xf7, 0x26, 0xc3, 0x8d, 0x77,
+                                                    0x12, 0xf7, 0x1, 0xc2, 0xf7, 0xa5, 0xc1, 0x13,
+                                                    0xec, 0xf7, 0xdf, 0x16, 0xf7, 0x9e, 0xc2, 0x21,
+                                                    0xf8, 0xd2, 0xfb, 0x25, 0x53, 0xe6, 0xfc, 0x9a,
+                                                    0x21, 0x6, 0xfb, 0xdc, 0x54, 0x48, 0xa, 0x13,
+                                                    0xdc, 0x4a, 0xa, 0xfb, 0x23, 0xc6, 0xf8, 0x4b,
+                                                    0xc4, 0xf7, 0x2d, 0xc4, 0x1, 0xab, 0xf8, 0xab,
+                                                    0x3, 0xbf, 0x37, 0x15, 0x77, 0x50, 0x5, 0xd0,
+                                                    0x6, 0xf7, 0x2c, 0x9c, 0xc7, 0xf7, 0x2, 0x9f,
+                                                    0x1f, 0xc6, 0xf7, 0xdc, 0x5, 0xf6, 0x6, 0x92,
+                                                    0xc4, 0x5, 0x23, 0x6, 0xf7, 0x7, 0xa2, 0x84,
+                                                    0xb1, 0xf7, 0x5, 0x1b, 0x9d, 0xa8, 0x88, 0x8a,
+                                                    0x9d, 0x1f, 0x99, 0xc5, 0x4f, 0x8e, 0x5, 0x54,
+                                                    0x52, 0x86, 0x64, 0x66, 0x1f, 0x62, 0x61, 0x88,
+                                                    0x4b, 0x80, 0x4f, 0x8, 0xfb, 0x0, 0x6, 0x85,
+                                                    0x52, 0x5, 0xf3, 0x6, 0x51, 0xfb, 0xd5, 0x77,
+                                                    0xfb, 0x6, 0x59, 0x78, 0xfb, 0x5, 0x9a, 0x19,
+                                                    0xe, 0x95, 0xc3, 0xf7, 0x16, 0xc7, 0xf8, 0x2,
+                                                    0x77, 0x1, 0xf7, 0xfe, 0xc9, 0x3, 0xe4, 0xf7,
+                                                    0x4f, 0x15, 0xf7, 0xa5, 0xfb, 0x17, 0xfb, 0x2,
+                                                    0x53, 0xf7, 0x97, 0xc3, 0x34, 0xf7, 0x17, 0xe2,
+                                                    0xc7, 0x34, 0xf8, 0xb, 0x34, 0x6, 0xfb, 0x8c,
+                                                    0xfc, 0x11, 0x5, 0xcc, 0x91, 0x15, 0xf7, 0x64,
+                                                    0xf7, 0xd1, 0x5, 0xfb, 0xd1, 0x7, 0xe, 0x52,
+                                                    0xf9, 0x66, 0x1, 0xe6, 0xf8, 0x35, 0x3, 0xe6,
+                                                    0x66, 0x15, 0xb3, 0x77, 0xf8, 0xd, 0xf9, 0x50,
+                                                    0x64, 0xa1, 0x5, 0xe, 0xfb, 0x31, 0xbe, 0xf7,
+                                                    0x37, 0xbf, 0xf7, 0xac, 0xbf, 0x7f, 0x77, 0x12,
+                                                    0xb2, 0xc0, 0xf7, 0xf5, 0xc0, 0x13, 0xdc, 0xde,
+                                                    0x3c, 0x15, 0x80, 0x59, 0x50, 0xa, 0x41, 0x7,
+                                                    0x13, 0xec, 0xbc, 0x70, 0x43, 0xb0, 0x44, 0xa,
+                                                    0x70, 0x31, 0x48, 0x2c, 0x9b, 0x96, 0x57, 0x1e,
+                                                    0x94, 0xf7, 0xda, 0x15, 0xe0, 0xde, 0xc4, 0xe9,
+                                                    0xf7, 0x8, 0xc4, 0x69, 0xa, 0xe, 0xfb, 0x31,
+                                                    0xbe, 0x8b, 0xf7, 0x37, 0x8b, 0xbf, 0xf7, 0xac,
+                                                    0xbf, 0x7f, 0x77, 0xab, 0xbd, 0x12, 0xb2, 0xc0,
+                                                    0xf7, 0xf5, 0xc0, 0x13, 0xef, 0xde, 0x43, 0x15,
+                                                    0x80, 0x52, 0x50, 0xa, 0x55, 0x7, 0x13, 0xf7,
+                                                    0xae, 0x6a, 0x49, 0xaa, 0x44, 0xa, 0x6f, 0x31,
+                                                    0x8c, 0x1e, 0x48, 0x8c, 0x2c, 0x9f, 0x57, 0x96,
+                                                    0x8, 0x94, 0xf7, 0xd5, 0x15, 0xe0, 0xde, 0xc4,
+                                                    0xe9, 0xf7, 0x1e, 0xae, 0x69, 0xa, 0xf7, 0x43,
+                                                    0xf7, 0x88, 0x37, 0xa, 0x7c, 0xc0, 0x63, 0xc3,
+                                                    0xf7, 0xdf, 0xc2, 0xf7, 0x1a, 0xc2, 0x12, 0xf7,
+                                                    0x3, 0xc2, 0xd9, 0xc4, 0xf7, 0x17, 0xc2, 0xa7,
+                                                    0xc2, 0x13, 0x7f, 0xa9, 0x89, 0x15, 0xf7, 0x1c,
+                                                    0xf8, 0x77, 0x6, 0xde, 0xa1, 0x95, 0xf2, 0xd8,
+                                                    0xcb, 0x88, 0x56, 0x59, 0x5e, 0x88, 0x55, 0x72,
+                                                    0x1e, 0x5e, 0x77, 0x5f, 0x72, 0x58, 0x1a, 0x4d,
+                                                    0xc1, 0x6f, 0xbb, 0x78, 0x1e, 0xf7, 0x17, 0x59,
+                                                    0xb1, 0x80, 0x5d, 0x1a, 0x13, 0xbf, 0x4f, 0x4f,
+                                                    0x70, 0x48, 0x88, 0x1e, 0x45, 0x88, 0x41, 0xa7,
+                                                    0x74, 0xa4, 0x75, 0x54, 0x18, 0x6d, 0xb2, 0xd2,
+                                                    0x79, 0xd0, 0x1b, 0xec, 0xea, 0xb8, 0xf4, 0xd7,
+                                                    0x38, 0xaa, 0x40, 0xa4, 0x1f, 0x4f, 0x9f, 0x58,
+                                                    0x9a, 0xb4, 0x1a, 0xb3, 0xbb, 0x97, 0xbd, 0x9f,
+                                                    0x1e, 0xc4, 0xa2, 0xaa, 0x9a, 0xce, 0x1a, 0xdf,
+                                                    0x35, 0xa4, 0x2b, 0xfb, 0x3a, 0x6f, 0x6b, 0xfb,
+                                                    0x31, 0x1e, 0x3a, 0x54, 0xdc, 0x6, 0x13, 0x7f,
+                                                    0xfb, 0xdf, 0x3a, 0x7, 0xe, 0x6e, 0xa, 0xf8,
+                                                    0x20, 0xf8, 0x85, 0x15, 0x9c, 0xa8, 0xfb, 0x49,
+                                                    0xf7, 0x26, 0x5d, 0x46, 0x5, 0xe, 0xb5, 0xd0,
+                                                    0xf7, 0xbf, 0xc9, 0x1, 0xf8, 0x44, 0xce, 0x3,
+                                                    0xf8, 0x87, 0xf7, 0xbd, 0x15, 0xfc, 0x22, 0xf7,
+                                                    0x43, 0x5, 0x4d, 0x7, 0xf7, 0xdf, 0xfb, 0x2b,
+                                                    0xfb, 0xdf, 0xfb, 0x28, 0x5, 0x46, 0x7, 0xf8,
+                                                    0x22, 0xf7, 0x46, 0x5, 0xe, 0x7b, 0xa, 0xf7,
+                                                    0x95, 0xf7, 0x96, 0x15, 0xf7, 0x7e, 0xfb, 0x50,
+                                                    0x9c, 0xba, 0xfb, 0x3d, 0xf7, 0x21, 0xf7, 0x3d,
+                                                    0xf7, 0x21, 0x78, 0xba, 0x5, 0xfc, 0x21, 0xfb,
+                                                    0x50, 0x15, 0xf7, 0x79, 0xfb, 0x50, 0xa0, 0xba,
+                                                    0xfb, 0x40, 0xf7, 0x21, 0xf7, 0x3d, 0xf7, 0x1f,
+                                                    0x75, 0xbc, 0x5, 0xe, 0x7b, 0xa, 0xf7, 0x2,
+                                                    0xd1, 0x15, 0xf7, 0x7d, 0xf7, 0x50, 0xfb, 0x7d,
+                                                    0xf7, 0x50, 0x79, 0x5c, 0xf7, 0x3d, 0xfb, 0x21,
+                                                    0xfb, 0x3d, 0xfb, 0x21, 0x5, 0xf7, 0x51, 0x5c,
+                                                    0x15, 0xf7, 0x77, 0xf7, 0x50, 0xfb, 0x73, 0xf7,
+                                                    0x50, 0x73, 0x5a, 0xf7, 0x3d, 0xfb, 0x1f, 0xfb,
+                                                    0x40, 0xfb, 0x21, 0x5, 0xe, 0xd1, 0xf8, 0xc,
+                                                    0x1, 0xf7, 0x2b, 0xf7, 0xbd, 0x3, 0xf7, 0x2b,
+                                                    0xf7, 0x96, 0x15, 0xf7, 0xa3, 0xfb, 0x50, 0xa5,
+                                                    0xb3, 0xfb, 0x66, 0xf7, 0x28, 0xf7, 0x66, 0xf7,
+                                                    0x27, 0x71, 0xb4, 0x5, 0xe, 0xd1, 0xf8, 0xc,
+                                                    0x1, 0xf7, 0x2f, 0xf7, 0xba, 0x3, 0xf7, 0x46,
+                                                    0xd1, 0x15, 0xf7, 0xa3, 0xf7, 0x50, 0xfb, 0xa3,
+                                                    0xf7, 0x50, 0x70, 0x62, 0xf7, 0x67, 0xfb, 0x27,
+                                                    0xfb, 0x63, 0xfb, 0x28, 0x5, 0xe, 0x8b, 0xc2,
+                                                    0xf7, 0xf0, 0xc2, 0xf7, 0x8, 0xc2, 0x1, 0xf5,
+                                                    0xc3, 0xf7, 0xab, 0xc3, 0x3, 0x9e, 0x16, 0xf7,
+                                                    0x83, 0xc2, 0x2b, 0xf7, 0x99, 0x6, 0xb6, 0xbb,
+                                                    0xcb, 0xb7, 0xce, 0x1b, 0xe0, 0x9a, 0x59, 0x54,
+                                                    0x1f, 0xfb, 0x87, 0x36, 0x54, 0xf7, 0x76, 0xc2,
+                                                    0x36, 0xf7, 0x9d, 0x7, 0xca, 0x6e, 0xd6, 0xfb,
+                                                    0x13, 0x4a, 0x4e, 0x66, 0x5e, 0x56, 0x1e, 0xf7,
+                                                    0x91, 0xfb, 0x24, 0x54, 0xe3, 0xfc, 0x9b, 0x34,
+                                                    0x7, 0xe, 0xf8, 0x85, 0xf7, 0x43, 0x1, 0xf7,
+                                                    0x17, 0xf7, 0xe6, 0x3, 0xf7, 0x17, 0xf8, 0x9d,
+                                                    0x71, 0xa, 0x7d, 0xfb, 0x2b, 0x71, 0xa, 0xe,
+                                                    0xf7, 0x7b, 0xc1, 0x1, 0xf2, 0xf8, 0x1e, 0x3,
+                                                    0xf2, 0xf7, 0x7b, 0x15, 0xf8, 0x1e, 0xc1, 0xfc,
+                                                    0x1e, 0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xd9, 0xc2,
+                                                    0xed, 0xf7, 0x10, 0x81, 0xa, 0xf7, 0x95, 0x7e,
+                                                    0xa, 0xfb, 0x36, 0xfd, 0x25, 0x15, 0xf8, 0x2e,
+                                                    0xc2, 0xfb, 0x43, 0xf8, 0x10, 0xfb, 0x5d, 0x54,
+                                                    0xf7, 0x24, 0xfb, 0xd9, 0xfb, 0x46, 0x6, 0xe,
+                                                    0x6f, 0xa, 0xf7, 0x31, 0xf8, 0x82, 0x15, 0xf7,
+                                                    0xb7, 0xf1, 0x69, 0xd7, 0xfb, 0xa1, 0xfb, 0x27,
+                                                    0x5, 0x59, 0xfc, 0xa1, 0x15, 0x35, 0xa, 0xe,
+                                                    0x8b, 0xc2, 0xf7, 0xdd, 0x82, 0xa, 0x68, 0xa,
+                                                    0xc3, 0x3, 0xe9, 0xf8, 0x86, 0x15, 0xb4, 0x79,
+                                                    0xf7, 0x29, 0xf7, 0xa, 0xf7, 0x27, 0xfb, 0xa,
+                                                    0xb6, 0x9d, 0xfb, 0x29, 0xf7, 0x30, 0x5, 0x3a,
+                                                    0x6, 0xfb, 0x29, 0xfd, 0x22, 0x15, 0x35, 0xa,
+                                                    0xe, 0x8b, 0xc2, 0xf7, 0xdb, 0xc2, 0xe8, 0xf7,
+                                                    0x7, 0x12, 0xf7, 0x3a, 0xe2, 0xa0, 0xc3, 0x7e,
+                                                    0xe0, 0x13, 0xf8, 0xea, 0x16, 0x35, 0xa, 0x13,
+                                                    0xf4, 0xf7, 0x72, 0xf8, 0x6f, 0x59, 0xa, 0xe,
+                                                    0x6f, 0xa, 0xf7, 0x1c, 0xf8, 0xe8, 0x15, 0xf7,
+                                                    0xb9, 0x25, 0x96, 0xaa, 0xfb, 0xa2, 0xf7, 0x27,
+                                                    0x5, 0x40, 0xfd, 0x34, 0x15, 0x35, 0xa, 0xe,
+                                                    0xfb, 0x31, 0xc1, 0xf8, 0x76, 0xc5, 0xee, 0xf7,
+                                                    0x10, 0x1, 0xf7, 0x18, 0xc4, 0xf7, 0xa9, 0xc7,
+                                                    0x3, 0xf7, 0x8, 0x7e, 0xa, 0x60, 0xfd, 0x8c,
+                                                    0x15, 0x55, 0xf7, 0x3f, 0xc1, 0x54, 0xf8, 0xae,
+                                                    0x25, 0x54, 0xb8, 0xfc, 0x77, 0x7, 0xf7, 0xbc,
+                                                    0xf9, 0x17, 0x15, 0xd5, 0xf7, 0x9, 0x41, 0x6,
+                                                    0xfb, 0x2, 0xfd, 0x7a, 0x15, 0x7c, 0x55, 0x5,
+                                                    0x85, 0x91, 0xb6, 0x7f, 0xbf, 0x1b, 0xef, 0xa1,
+                                                    0xbd, 0xf7, 0xc, 0x1f, 0xf8, 0x3c, 0xfb, 0x32,
+                                                    0x51, 0xed, 0xfb, 0xf4, 0x7, 0x32, 0x88, 0x62,
+                                                    0x50, 0x56, 0x89, 0x93, 0x95, 0x6c, 0x1e, 0xe,
+                                                    0xfb, 0x31, 0xc1, 0xf8, 0x7b, 0xc0, 0xf2, 0xf7,
+                                                    0x9, 0x1, 0xf8, 0x28, 0xc7, 0x3, 0xf8, 0x2,
+                                                    0xf8, 0xb0, 0x15, 0xd5, 0xf7, 0x9, 0x41, 0x6,
+                                                    0xfb, 0x70, 0xfd, 0x7a, 0x15, 0x81, 0x53, 0x5,
+                                                    0x82, 0xb5, 0xbf, 0x84, 0xbf, 0x1b, 0xef, 0xdd,
+                                                    0xbd, 0xf7, 0xc, 0x1f, 0xf8, 0x3c, 0xfb, 0xd2,
+                                                    0x56, 0xf7, 0x96, 0xfb, 0xf9, 0x7, 0x32, 0x53,
+                                                    0x62, 0x49, 0x56, 0x5b, 0x96, 0x92, 0x68, 0x1e,
+                                                    0xe, 0x8b, 0xc2, 0xf7, 0xda, 0xc2, 0xf7, 0x1e,
+                                                    0xc2, 0x1, 0xf7, 0xa, 0xc3, 0x3, 0xaa, 0x16,
+                                                    0xf7, 0x23, 0xf7, 0x5a, 0x6, 0xc5, 0xb5, 0xb4,
+                                                    0x6a, 0xe0, 0x32, 0xbd, 0x4c, 0x19, 0x52, 0x54,
+                                                    0xf7, 0x6d, 0xc2, 0x2c, 0x6, 0x4d, 0xda, 0x4b,
+                                                    0xd3, 0x3f, 0xc9, 0xf7, 0x33, 0xf7, 0x5, 0x18,
+                                                    0xee, 0xc2, 0xfb, 0x72, 0x54, 0xba, 0x6, 0xfb,
+                                                    0x48, 0xfb, 0x14, 0x5, 0xf8, 0xc, 0xfb, 0x23,
+                                                    0x54, 0xe2, 0xfc, 0x9b, 0x34, 0x7, 0xe, 0x8b,
+                                                    0xc2, 0xf8, 0x9b, 0xc2, 0x68, 0xa, 0x73, 0xa,
+                                                    0xc2, 0xfb, 0x44, 0xf8, 0xd2, 0xfb, 0x6b, 0x54,
+                                                    0xf7, 0x34, 0xfc, 0x9b, 0xfb, 0x47, 0x6, 0xe,
+                                                    0xb5, 0xc9, 0xf7, 0xbf, 0xd0, 0x1, 0xf0, 0xce,
+                                                    0x3, 0xf0, 0xf7, 0x6d, 0x15, 0xf8, 0x22, 0xfb,
+                                                    0x43, 0x5, 0xc9, 0x7, 0xfb, 0xdf, 0xf7, 0x2b,
+                                                    0xf7, 0xdf, 0xf7, 0x28, 0x5, 0xd0, 0x7, 0xfc,
+                                                    0x22, 0xfb, 0x46, 0x5, 0xe, 0x76, 0xbe, 0xf7,
+                                                    0x37, 0xc3, 0xd7, 0xc5, 0xf7, 0x3e, 0xc5, 0x1,
+                                                    0xf7, 0x39, 0xc2, 0x3, 0xd6, 0xaa, 0x15, 0xa5,
+                                                    0x57, 0xa8, 0x94, 0xd8, 0xac, 0xb0, 0x8a, 0x19,
+                                                    0xaf, 0x8a, 0x90, 0x8c, 0xad, 0x7a, 0x8, 0x81,
+                                                    0x9f, 0x9f, 0x7d, 0xbc, 0x1b, 0xb6, 0xb6, 0x9d,
+                                                    0xa7, 0xaa, 0x1f, 0x76, 0xb8, 0x5, 0x7f, 0x7a,
+                                                    0x61, 0x6f, 0x68, 0x1b, 0x69, 0x81, 0x93, 0x9f,
+                                                    0x6c, 0x1f, 0x99, 0x75, 0x73, 0x90, 0x7c, 0x1b,
+                                                    0x6a, 0x6f, 0x84, 0x7a, 0x67, 0x1f, 0xc3, 0xb7,
+                                                    0x9b, 0xa9, 0x86, 0xcd, 0x8, 0xf7, 0x19, 0xc3,
+                                                    0xfb, 0x1d, 0x6, 0x87, 0x97, 0x88, 0xaf, 0x88,
+                                                    0xa7, 0x8, 0xf7, 0x27, 0xc5, 0x6, 0xfb, 0x2d,
+                                                    0x8c, 0x5, 0x89, 0xa3, 0x89, 0x97, 0x97, 0x1a,
+                                                    0xe8, 0xc6, 0xa7, 0xbe, 0xbe, 0xbd, 0x72, 0x59,
+                                                    0xa4, 0x1e, 0xc0, 0x9e, 0x5, 0xc4, 0x70, 0x50,
+                                                    0xc4, 0x2f, 0x1b, 0x22, 0x4e, 0x3f, 0x36, 0x7b,
+                                                    0x8d, 0x78, 0x8e, 0x6c, 0x1f, 0x2e, 0x4f, 0xef,
+                                                    0x6, 0x8f, 0x6f, 0x8b, 0x69, 0x8f, 0x7e, 0x8,
+                                                    0xfb, 0x0, 0x53, 0xf7, 0x4, 0x6, 0x96, 0x4c,
+                                                    0x53, 0x5a, 0x46, 0x59, 0x8, 0xe, 0xf7, 0xc7,
+                                                    0xc9, 0x1, 0xf8, 0x54, 0xc2, 0x3, 0xf8, 0x54,
+                                                    0xf7, 0xc7, 0x15, 0xfb, 0x5b, 0xc2, 0xf7, 0x99,
+                                                    0xfc, 0x3e, 0x4d, 0x7, 0xe, 0x8b, 0xc3, 0xf8,
+                                                    0x99, 0xc3, 0x1, 0xf7, 0xa5, 0x73, 0xa, 0xc3,
+                                                    0xfb, 0x45, 0xf7, 0x88, 0x6, 0xf7, 0x18, 0xc0,
+                                                    0x5, 0xc3, 0x7, 0xfb, 0x18, 0x55, 0x5, 0xf7,
+                                                    0xa6, 0xfb, 0x78, 0x53, 0xf7, 0x41, 0xfb, 0x84,
+                                                    0x7, 0xfb, 0x19, 0x55, 0x5, 0x54, 0x7, 0xf7,
+                                                    0x19, 0xc1, 0x5, 0xfb, 0x72, 0xfb, 0x46, 0x7,
+                                                    0xe, 0x8b, 0xc2, 0xf7, 0xdf, 0xc2, 0x1, 0xc2,
+                                                    0xc4, 0xf7, 0x3c, 0xc3, 0xf7, 0x2c, 0xc4, 0x3,
+                                                    0xc2, 0x16, 0xf7, 0xd, 0xc1, 0x4b, 0xf7, 0xa2,
+                                                    0x6, 0xa7, 0x9f, 0xa1, 0xad, 0xba, 0x1b, 0xd0,
+                                                    0x95, 0x40, 0x81, 0x1f, 0xfb, 0xc1, 0xf7, 0xd,
+                                                    0xc2, 0x4a, 0xf7, 0x96, 0x7, 0x96, 0xa7, 0xca,
+                                                    0xc4, 0xc9, 0x90, 0x54, 0x75, 0x1e, 0xfb, 0xca,
+                                                    0xf7, 0x4, 0xc2, 0x54, 0xf7, 0x96, 0x7, 0xcd,
+                                                    0x6a, 0xc9, 0x3d, 0x56, 0x6e, 0x68, 0x68, 0x6f,
+                                                    0x1e, 0xaf, 0x7c, 0x62, 0xad, 0x55, 0x1b, 0x5e,
+                                                    0x6f, 0x6f, 0x6e, 0x6e, 0x1f, 0xb7, 0xfb, 0x4,
+                                                    0x55, 0xc2, 0x7, 0xe, 0xf8, 0xa1, 0xb3, 0x1,
+                                                    0xf7, 0xc, 0xf7, 0xfc, 0x3, 0xf7, 0xc, 0xf8,
+                                                    0xa1, 0x15, 0xf7, 0xfc, 0xb3, 0xfb, 0xfc, 0x6,
+                                                    0xe, 0xf7, 0x7c, 0xbe, 0x1, 0xdb, 0xf8, 0x4c,
+                                                    0x3, 0xdb, 0xf7, 0x7c, 0x15, 0xf8, 0x4c, 0xbe,
+                                                    0xfc, 0x4c, 0x6, 0xe, 0xfb, 0x1c, 0x76, 0xf7,
+                                                    0x2c, 0xbf, 0x62, 0xb4, 0x62, 0xc1, 0xf7, 0xcd,
+                                                    0xc0, 0x12, 0xf7, 0x3, 0xc2, 0xf7, 0x9f, 0xc2,
+                                                    0x13, 0xce, 0xf7, 0x3a, 0xae, 0x15, 0x6f, 0xa7,
+                                                    0xb1, 0x7f, 0xb3, 0x1b, 0xc8, 0xcb, 0xae, 0xc5,
+                                                    0xaf, 0x1f, 0x13, 0xae, 0x39, 0xf7, 0x1d, 0x7,
+                                                    0x13, 0x9e, 0xc1, 0x39, 0xf8, 0x2, 0xfb, 0x1d,
+                                                    0x56, 0xdd, 0xfb, 0x18, 0x7, 0x13, 0xce, 0x5a,
+                                                    0x68, 0xfb, 0x25, 0xfb, 0x11, 0x49, 0x62, 0xb8,
+                                                    0xc6, 0x1e, 0xf7, 0xa7, 0xfb, 0x1d, 0x56, 0xdd,
+                                                    0xfc, 0xa6, 0xc2, 0x7, 0xe, 0xc9, 0x76, 0x1,
+                                                    0xe1, 0xdb, 0x15, 0xaf, 0x65, 0xf7, 0x45, 0xf7,
+                                                    0x43, 0xf7, 0x44, 0xfb, 0x42, 0xb2, 0xb2, 0xfb,
+                                                    0x44, 0xf7, 0x43, 0xf7, 0x44, 0xf7, 0x44, 0x69,
+                                                    0xb4, 0xfb, 0x49, 0xfb, 0x46, 0xfb, 0x43, 0xf7,
+                                                    0x42, 0x65, 0x64, 0xf7, 0x43, 0xfb, 0x43, 0x5,
+                                                    0xe, 0x8b, 0xc2, 0xf7, 0xe0, 0xc2, 0x1, 0xf7,
+                                                    0x1, 0xc2, 0xf7, 0xa5, 0xc2, 0x3, 0xa4, 0x16,
+                                                    0xf7, 0x73, 0xc2, 0x37, 0xf7, 0x85, 0x6, 0xb8,
+                                                    0xb5, 0xd0, 0xb9, 0xc9, 0x1b, 0xb7, 0xc3, 0x7e,
+                                                    0x47, 0x1f, 0xfb, 0x8f, 0x38, 0x54, 0xf7, 0x70,
+                                                    0xc2, 0x39, 0xf7, 0x90, 0x7, 0xe1, 0x5a, 0xbc,
+                                                    0x21, 0x45, 0x45, 0x5e, 0x62, 0x6a, 0x1e, 0xe1,
+                                                    0xfb, 0x1f, 0x54, 0xdf, 0xfb, 0xe0, 0x37, 0x7,
+                                                    0xe, 0x7c, 0xc4, 0xf7, 0x4a, 0xc9, 0xf7, 0xa9,
+                                                    0xc6, 0x1, 0xf5, 0xc7, 0xf7, 0xa2, 0xc5, 0x3,
+                                                    0xf5, 0x7c, 0x15, 0xf7, 0x8d, 0xf7, 0x1f, 0xf7,
+                                                    0x5, 0xf7, 0x7c, 0xf7, 0x62, 0x2d, 0xe1, 0xfb,
+                                                    0x6, 0x23, 0x3f, 0x27, 0x20, 0x28, 0xcb, 0x2f,
+                                                    0xf7, 0x2, 0xd9, 0xbc, 0xb9, 0xb3, 0xa8, 0x1f,
+                                                    0xfb, 0x5a, 0xfb, 0x34, 0x3d, 0xfb, 0x3e, 0x93,
+                                                    0x1e, 0xf7, 0xd9, 0xf7, 0xf2, 0x15, 0x54, 0x70,
+                                                    0x59, 0x58, 0x4a, 0x1b, 0x43, 0x58, 0xc0, 0xd9,
+                                                    0xc5, 0xab, 0xe3, 0xe3, 0xe2, 0xc1, 0x2d, 0x3e,
+                                                    0x8f, 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0xed, 0xc0,
+                                                    0x5b, 0xc0, 0xc7, 0xbb, 0x8c, 0xbc, 0x12, 0xa4,
+                                                    0xf7, 0x20, 0x54, 0xc2, 0xf7, 0xa5, 0xc1, 0x13,
+                                                    0xbd, 0xeb, 0xf8, 0xa1, 0x15, 0xbe, 0x81, 0x5,
+                                                    0x99, 0x8f, 0x9f, 0xae, 0xaf, 0x1b, 0xad, 0xaa,
+                                                    0x85, 0x7c, 0xa1, 0x1f, 0x7c, 0xa1, 0x9b, 0x7e,
+                                                    0xb4, 0x1b, 0xc9, 0xb6, 0xb6, 0xc2, 0x9e, 0x1f,
+                                                    0x59, 0x94, 0x5, 0x72, 0x82, 0x6e, 0x69, 0x67,
+                                                    0x1b, 0x76, 0x7a, 0x97, 0x98, 0x78, 0x1f, 0x9c,
+                                                    0x73, 0x71, 0x93, 0x5f, 0x1b, 0x58, 0x56, 0x74,
+                                                    0x4a, 0x75, 0x1f, 0x44, 0xfc, 0xa1, 0x15, 0xf7,
+                                                    0x73, 0xbf, 0x38, 0xf7, 0x93, 0x6, 0xb7, 0xb5,
+                                                    0xd0, 0xbe, 0xc8, 0x1b, 0xb7, 0xc4, 0x7f, 0x49,
+                                                    0x1f, 0xfb, 0xa4, 0x38, 0x57, 0xf7, 0x6f, 0xbf,
+                                                    0x39, 0xf7, 0xa5, 0x7, 0xdd, 0x62, 0xbb, 0x2a,
+                                                    0x45, 0x47, 0x65, 0x5f, 0x58, 0x1e, 0x13, 0xdd,
+                                                    0xd0, 0xfb, 0x20, 0x56, 0x7, 0x13, 0xdb, 0xe0,
+                                                    0xfb, 0xe5, 0x6, 0x13, 0xdd, 0x36, 0x6, 0xe,
+                                                    0xf7, 0x1f, 0xc1, 0xf7, 0x35, 0xc1, 0x1, 0xf7,
+                                                    0x3b, 0x3d, 0x15, 0xbd, 0x6, 0x95, 0xf7, 0x6d,
+                                                    0x5, 0xf7, 0x23, 0x6, 0x86, 0xfb, 0x6d, 0x5,
+                                                    0xbd, 0x6, 0x91, 0xf7, 0x6d, 0x5, 0xef, 0xc1,
+                                                    0x2b, 0x6, 0x8f, 0xf7, 0x35, 0x5, 0xe7, 0xc1,
+                                                    0x32, 0x6, 0x90, 0xf7, 0x6f, 0x5, 0x58, 0x6,
+                                                    0x87, 0xfb, 0x6f, 0x5, 0xfb, 0x25, 0x6, 0x8e,
+                                                    0xf7, 0x6f, 0x5, 0x57, 0x6, 0x88, 0xfb, 0x6f,
+                                                    0x5, 0x20, 0x55, 0xf4, 0x6, 0x86, 0xfb, 0x35,
+                                                    0x5, 0x27, 0x55, 0xec, 0x6, 0xc1, 0xc1, 0x15,
+                                                    0x90, 0xf7, 0x35, 0x5, 0xf7, 0x24, 0x6, 0x86,
+                                                    0xfb, 0x35, 0x5, 0xe, 0x7a, 0xc2, 0xf7, 0xf2,
+                                                    0xc2, 0x1, 0xc7, 0xc1, 0xf8, 0x2, 0xc6, 0x3,
+                                                    0xc7, 0xf7, 0x67, 0x15, 0xfb, 0x1f, 0xf6, 0x32,
+                                                    0xf7, 0x18, 0xf7, 0x1e, 0xf1, 0xe6, 0xf7, 0x1e,
+                                                    0xf7, 0x22, 0x24, 0xe4, 0xfb, 0x1d, 0xfb, 0x1f,
+                                                    0x27, 0x34, 0xfb, 0x25, 0x1e, 0xc1, 0x16, 0xf7,
+                                                    0x6, 0xd8, 0xca, 0xf5, 0xf5, 0xd8, 0x4d, 0xfb,
+                                                    0x6, 0xfb, 0xa, 0x43, 0x53, 0xfb, 0x3, 0x22,
+                                                    0x3d, 0xc5, 0xf7, 0x7, 0x1e, 0xe, 0x63, 0xa,
+                                                    0x58, 0xa, 0xf7, 0x4c, 0xf8, 0x95, 0x15, 0xf7,
+                                                    0xa6, 0xde, 0x6b, 0xd7, 0xfb, 0x92, 0xfb, 0x13,
+                                                    0x5, 0xfb, 0x2, 0xfb, 0xdd, 0x21, 0xa, 0x63,
+                                                    0xa, 0xf7, 0x62, 0x77, 0x58, 0xa, 0xf7, 0x32,
+                                                    0xf8, 0x7d, 0x15, 0xf7, 0x22, 0xf7, 0x3, 0xf7,
+                                                    0x20, 0xfb, 0x3, 0xb3, 0x9d, 0xfb, 0x22, 0xf7,
+                                                    0x27, 0x5, 0x3f, 0x6, 0xfb, 0x23, 0xfb, 0x27,
+                                                    0x5, 0x52, 0xfb, 0xb7, 0x21, 0xa, 0x63, 0xa,
+                                                    0xd2, 0xf7, 0x8, 0x58, 0xa, 0xf7, 0xf6, 0xf8,
+                                                    0x9b, 0x15, 0xda, 0xf7, 0x8, 0x3c, 0x6, 0xfb,
+                                                    0x54, 0xfb, 0x8, 0x15, 0xdd, 0xf7, 0x8, 0x39,
+                                                    0x6, 0x27, 0xfc, 0x37, 0x21, 0xa, 0x7c, 0xc2,
+                                                    0xf7, 0x2c, 0xc6, 0xf7, 0x1b, 0xc2, 0x1, 0xa9,
+                                                    0xc1, 0xf7, 0x59, 0xc0, 0xf7, 0x4b, 0xbf, 0x3,
+                                                    0xf7, 0xc8, 0xd3, 0x15, 0x58, 0xa4, 0xb2, 0x67,
+                                                    0xe0, 0x1b, 0xb6, 0xac, 0x96, 0x97, 0xaf, 0x1f,
+                                                    0x81, 0xc1, 0x5, 0x81, 0x6f, 0x65, 0x7f, 0x68,
+                                                    0x1b, 0x3f, 0x55, 0xbb, 0xf3, 0x91, 0x1f, 0xf7,
+                                                    0x7f, 0x6, 0xec, 0x8c, 0x82, 0xf7, 0x2c, 0xfb,
+                                                    0x14, 0x1b, 0x48, 0x66, 0x5a, 0x6d, 0x7d, 0x1f,
+                                                    0xb9, 0x76, 0x63, 0xac, 0x4b, 0x1b, 0xfb, 0x1d,
+                                                    0x74, 0xfb, 0x21, 0xfb, 0x3, 0xfb, 0x51, 0xf7,
+                                                    0x9, 0x7b, 0xad, 0xe3, 0xa9, 0xcb, 0xa3, 0x94,
+                                                    0x1f, 0xa6, 0xf7, 0x47, 0x15, 0xcb, 0x81, 0xba,
+                                                    0xcf, 0xc5, 0x1b, 0xd1, 0x9c, 0x3b, 0x57, 0x1f,
+                                                    0xfc, 0x45, 0x52, 0x15, 0xe3, 0x9d, 0xf3, 0xdf,
+                                                    0xd9, 0x9c, 0x35, 0x49, 0x47, 0x90, 0xfb, 0x12,
+                                                    0x24, 0x31, 0x82, 0xf7, 0x12, 0xa7, 0x1e, 0xe,
+                                                    0xfb, 0x2b, 0xc1, 0x1, 0xf7, 0x78, 0xcd, 0x3,
+                                                    0xf7, 0xb9, 0x16, 0x67, 0x7b, 0x6e, 0x6a, 0x67,
+                                                    0x1a, 0x61, 0xaf, 0x73, 0xb1, 0xa1, 0xa1, 0x93,
+                                                    0x9a, 0x9c, 0x1e, 0x93, 0xc3, 0x5, 0x7c, 0x82,
+                                                    0x75, 0x81, 0x79, 0x1b, 0x7b, 0x7f, 0x95, 0x9f,
+                                                    0xb1, 0xba, 0x9d, 0xa4, 0x96, 0x1f, 0xe, 0x63,
+                                                    0xa, 0x58, 0xa, 0xf7, 0x36, 0xf8, 0xe7, 0x15,
+                                                    0xf7, 0xa8, 0x24, 0x96, 0xaa, 0xfb, 0x93, 0xf7,
+                                                    0x29, 0x5, 0xfb, 0x18, 0xfc, 0x5c, 0x21, 0xa,
+                                                    0x8b, 0xc2, 0xf8, 0xcb, 0x77, 0x1, 0xf7, 0xa9,
+                                                    0xc2, 0x3, 0xea, 0x16, 0xf8, 0x2d, 0xc2, 0xfb,
+                                                    0x40, 0xf8, 0xcb, 0x6, 0xfb, 0x71, 0x58, 0x5,
+                                                    0x54, 0x7, 0xf7, 0x3a, 0xaf, 0x5, 0xfc, 0x85,
+                                                    0xfb, 0x4a, 0x7, 0xe, 0x5d, 0xc1, 0x5f, 0x76,
+                                                    0xf7, 0xd4, 0xc0, 0x7c, 0xc1, 0xf7, 0xca, 0x77,
+                                                    0x12, 0xf0, 0xc0, 0xf8, 0x3, 0xbe, 0x13, 0x5e,
+                                                    0xb9, 0x6e, 0x15, 0xb0, 0x6f, 0xf8, 0x9a, 0xf9,
+                                                    0x46, 0x66, 0xab, 0x5, 0xfc, 0xc8, 0xfc, 0x0,
+                                                    0x15, 0xf7, 0x94, 0xc1, 0x25, 0xf7, 0xc6, 0x6,
+                                                    0xfb, 0x25, 0x73, 0x5, 0x55, 0x7, 0xe7, 0x99,
+                                                    0x5, 0xfb, 0x86, 0x26, 0x7, 0xf7, 0xfa, 0xfb,
+                                                    0xf2, 0x15, 0x13, 0xae, 0x58, 0xf7, 0x6a, 0xc1,
+                                                    0xfb, 0x22, 0x7, 0xf1, 0xe5, 0xb3, 0xb0, 0xd2,
+                                                    0x1a, 0xc3, 0x69, 0xc1, 0x46, 0x65, 0x67, 0x78,
+                                                    0x69, 0x73, 0x1e, 0x4c, 0xb8, 0x7, 0xb0, 0x84,
+                                                    0xa9, 0xa5, 0xa9, 0x1b, 0xae, 0x9c, 0x6c, 0x69,
+                                                    0x59, 0x24, 0x39, 0x4f, 0x4e, 0x1f, 0xe, 0x5e,
+                                                    0xc1, 0x5e, 0x76, 0xf7, 0xf, 0xc3, 0xf7, 0x47,
+                                                    0xc1, 0xf7, 0xc6, 0x77, 0x12, 0xef, 0xbc, 0xf7,
+                                                    0xcc, 0xbd, 0x13, 0xbe, 0xf7, 0xd6, 0xc8, 0x15,
+                                                    0xf7, 0x1f, 0x57, 0x54, 0x55, 0xf7, 0x2b, 0xc1,
+                                                    0x5d, 0xbf, 0xb9, 0xc3, 0x5d, 0xf7, 0x55, 0x51,
+                                                    0x6, 0xfb, 0x17, 0xfb, 0x66, 0x5, 0xca, 0x9c,
+                                                    0x15, 0xd7, 0xf7, 0x8, 0x5, 0xfb, 0x8, 0x7,
+                                                    0xfc, 0x14, 0xfb, 0x24, 0x15, 0x13, 0x7e, 0xb3,
+                                                    0x6d, 0xf8, 0x77, 0xf9, 0x47, 0x63, 0x9f, 0x5,
+                                                    0xfc, 0xc4, 0xfb, 0xf5, 0x15, 0xf7, 0x87, 0xc1,
+                                                    0x2d, 0xf7, 0xc6, 0x6, 0xfb, 0x19, 0x73, 0x5,
+                                                    0x55, 0x7, 0xdf, 0x99, 0x5, 0xfb, 0x86, 0x27,
+                                                    0x7, 0xe, 0xf7, 0x8d, 0xc3, 0xf7, 0xd1, 0x77,
+                                                    0x68, 0xa, 0xc1, 0x3, 0xf7, 0x40, 0xf7, 0x8d,
+                                                    0x15, 0xf7, 0x94, 0xc3, 0x27, 0xf7, 0xd1, 0x6,
+                                                    0xfb, 0x25, 0x71, 0x5, 0x53, 0x7, 0xe6, 0x9a,
+                                                    0x5, 0xfb, 0x8e, 0x25, 0x7, 0xe, 0xf7, 0x8d,
+                                                    0xbf, 0xe7, 0xbe, 0xe4, 0xba, 0x1, 0xf7, 0xf1,
+                                                    0xb7, 0x3, 0xf7, 0xf2, 0xf7, 0x95, 0x15, 0xe8,
+                                                    0xc2, 0x59, 0xf7, 0x27, 0x6, 0xd6, 0x75, 0xb9,
+                                                    0x3e, 0x5f, 0x5b, 0x7a, 0x7c, 0x69, 0x1e, 0x96,
+                                                    0x5b, 0x5, 0xa8, 0xc0, 0xb0, 0x8f, 0xa8, 0x1b,
+                                                    0xac, 0x9d, 0x6a, 0x58, 0x1f, 0x7e, 0x7, 0x8f,
+                                                    0x75, 0x73, 0x8f, 0x73, 0x1b, 0x26, 0x76, 0x4a,
+                                                    0x69, 0x5c, 0xac, 0x5a, 0xc2, 0xb3, 0xaf, 0xa6,
+                                                    0xad, 0xa8, 0x1f, 0x8a, 0xcf, 0x15, 0x5f, 0x72,
+                                                    0x66, 0x6a, 0x64, 0x1b, 0x70, 0x76, 0x9e, 0xa4,
+                                                    0xa4, 0xa4, 0xa2, 0xba, 0xb1, 0xb2, 0x7c, 0x8b,
+                                                    0x1f, 0xe, 0xf7, 0x8d, 0xc1, 0xf7, 0x75, 0xbf,
+                                                    0x1, 0xf7, 0x31, 0xc2, 0xf7, 0x44, 0xc2, 0x3,
+                                                    0xf7, 0x31, 0xf8, 0x34, 0x15, 0xfb, 0x13, 0xed,
+                                                    0x63, 0xb8, 0xc3, 0xe2, 0xba, 0xf7, 0xa, 0xe5,
+                                                    0x55, 0xd7, 0x34, 0x4b, 0x3a, 0x59, 0xfb, 0x6,
+                                                    0x1e, 0xc2, 0x16, 0xc5, 0xad, 0xc1, 0xc4, 0xd1,
+                                                    0x9a, 0x3b, 0x6b, 0x45, 0x63, 0x60, 0x5d, 0x5f,
+                                                    0x5d, 0xb7, 0xd0, 0x1e, 0xe, 0x7f, 0xbd, 0x69,
+                                                    0x76, 0xf8, 0x33, 0xbd, 0x8e, 0x77, 0x12, 0xc8,
+                                                    0xbf, 0xf8, 0x0, 0xc2, 0x13, 0x6c, 0xc8, 0xa3,
+                                                    0x15, 0xaf, 0x62, 0xc0, 0xbe, 0x5, 0x13, 0x9c,
+                                                    0x69, 0xb7, 0xc1, 0x7f, 0xbe, 0x1b, 0xf7, 0x12,
+                                                    0xf6, 0xdd, 0xf7, 0x29, 0xbf, 0x7e, 0xbf, 0x6c,
+                                                    0xb1, 0x1f, 0xbd, 0xbc, 0x67, 0xb4, 0x57, 0x58,
+                                                    0x5, 0x13, 0xac, 0xac, 0x60, 0x57, 0x9a, 0x54,
+                                                    0x1b, 0xfb, 0x2d, 0x35, 0x22, 0xfb, 0x11, 0x55,
+                                                    0x9c, 0x54, 0xac, 0x65, 0x1f, 0xda, 0x8d, 0x15,
+                                                    0xf7, 0x96, 0xf7, 0x8d, 0x5, 0x98, 0x77, 0x9b,
+                                                    0x69, 0x4b, 0x1a, 0x50, 0x5a, 0x20, 0xfb, 0x16,
+                                                    0x64, 0x65, 0x99, 0xa0, 0x6c, 0x1e, 0x63, 0xb0,
+                                                    0x15, 0x73, 0xa7, 0x7e, 0xb3, 0xb3, 0x1a, 0xf6,
+                                                    0xdd, 0xd4, 0xf3, 0xa9, 0xb7, 0x7f, 0x72, 0xb0,
+                                                    0x1e, 0xe, 0x63, 0xa, 0xc9, 0xbd, 0x9c, 0xbc,
+                                                    0x12, 0xc9, 0xc5, 0xf7, 0xfa, 0xc7, 0x17, 0xf7,
+                                                    0x0, 0xf8, 0xa1, 0x15, 0xbb, 0x80, 0x5, 0x9a,
+                                                    0x8f, 0x9e, 0xbb, 0xad, 0x1b, 0xad, 0x9e, 0x76,
+                                                    0x79, 0xa3, 0x1f, 0x13, 0xfc, 0x7c, 0x9e, 0xa0,
+                                                    0x7e, 0xad, 0x1b, 0x13, 0xec, 0xc6, 0xb9, 0xbb,
+                                                    0xc2, 0x9d, 0x1f, 0x5c, 0x94, 0x5, 0x73, 0x82,
+                                                    0x70, 0x65, 0x69, 0x1b, 0x77, 0x7c, 0x94, 0x96,
+                                                    0x7c, 0x1f, 0x13, 0xdc, 0x9e, 0x71, 0x72, 0xa6,
+                                                    0x61, 0x1b, 0x5b, 0x59, 0x67, 0x4a, 0x76, 0x1f,
+                                                    0x5d, 0xfb, 0xc9, 0x21, 0xa, 0x66, 0xa, 0xe7,
+                                                    0xc2, 0xf7, 0xf1, 0xc4, 0x13, 0xdc, 0x92, 0x21,
+                                                    0x15, 0x58, 0xf7, 0xbd, 0xbe, 0xfb, 0x31, 0xf7,
+                                                    0x5f, 0x7, 0x67, 0xac, 0xc3, 0x62, 0xea, 0x1b,
+                                                    0xf7, 0x11, 0xec, 0xe8, 0xf7, 0x12, 0xf7, 0x4,
+                                                    0x2b, 0xde, 0xfb, 0xe, 0x33, 0x4d, 0x70, 0x60,
+                                                    0x65, 0x1f, 0x13, 0xec, 0xcc, 0xfb, 0x20, 0x58,
+                                                    0xe0, 0xfc, 0x78, 0x7, 0xc6, 0xf7, 0xe4, 0x15,
+                                                    0x13, 0xdc, 0xe4, 0xd8, 0xca, 0xeb, 0xeb, 0xd7,
+                                                    0x4c, 0x32, 0x32, 0x3f, 0x43, 0x2b, 0x2b, 0x3e,
+                                                    0xd3, 0xe4, 0x1e, 0xe, 0xf8, 0xa8, 0xa9, 0x1,
+                                                    0xf7, 0xd1, 0xb7, 0xd9, 0xb6, 0x3, 0xf7, 0xd1,
+                                                    0x3d, 0x15, 0xb7, 0xf8, 0xf6, 0xd9, 0xfc, 0xf6,
+                                                    0xb6, 0xf8, 0xf6, 0xbb, 0xa9, 0xfb, 0x6e, 0x6,
+                                                    0xfb, 0x38, 0x3c, 0x4f, 0xfb, 0xa, 0x4d, 0xc2,
+                                                    0x2a, 0xf7, 0x55, 0x8a, 0x1f, 0xe, 0xfb, 0x0,
+                                                    0xf9, 0x6e, 0x1, 0xf7, 0x6a, 0xc2, 0x3, 0xf8,
+                                                    0x16, 0xf9, 0x2, 0x15, 0x56, 0x6, 0x51, 0x31,
+                                                    0x4e, 0xfb, 0x29, 0xfb, 0x27, 0x1a, 0x26, 0xbb,
+                                                    0xfb, 0x1a, 0xd1, 0xfb, 0x1, 0x1e, 0xc1, 0x6,
+                                                    0x4e, 0xf7, 0x7, 0x53, 0xe5, 0xf7, 0x1f, 0x1a,
+                                                    0xf7, 0x3a, 0xd1, 0xf7, 0x1c, 0xba, 0xdf, 0x1e,
+                                                    0xe, 0xfb, 0x0, 0xf9, 0x6e, 0x1, 0xf7, 0xdf,
+                                                    0xc2, 0x3, 0xf7, 0x6a, 0xfb, 0x0, 0x15, 0xc0,
+                                                    0x6, 0xc5, 0xe5, 0xc8, 0xf7, 0x29, 0xf7, 0x27,
+                                                    0x1a, 0xf0, 0x5b, 0xf7, 0x1a, 0x45, 0xf7, 0x1,
+                                                    0x1e, 0x55, 0x6, 0xc8, 0xfb, 0x7, 0xc3, 0x31,
+                                                    0xfb, 0x1f, 0x1a, 0xfb, 0x3a, 0x45, 0xfb, 0x1c,
+                                                    0x5c, 0x37, 0x1e, 0xe, 0x7c, 0xc1, 0xf7, 0x22,
+                                                    0xc4, 0xf7, 0x20, 0xc1, 0xf7, 0x19, 0xc4, 0x12,
+                                                    0xf7, 0x1, 0xc3, 0xc3, 0xc3, 0xa9, 0xc2, 0xc4,
+                                                    0xc2, 0x17, 0xf0, 0xf7, 0x5d, 0x15, 0xf8, 0x35,
+                                                    0xf7, 0x3c, 0x78, 0xba, 0xfc, 0x36, 0xfb, 0x38,
+                                                    0x5, 0xf7, 0x58, 0xfb, 0x22, 0x65, 0xa, 0x64,
+                                                    0x6b, 0xab, 0xb2, 0x1e, 0x4b, 0xa, 0x53, 0xf8,
+                                                    0x13, 0x65, 0xa, 0x1e, 0x13, 0x3a, 0x64, 0x6b,
+                                                    0xab, 0xb2, 0x1f, 0x4b, 0xa, 0xe, 0x7c, 0xf7,
+                                                    0x10, 0x7a, 0xa, 0xb7, 0x15, 0x65, 0xab, 0x76,
+                                                    0xb1, 0xab, 0xb3, 0xa0, 0xb1, 0xb2, 0x6b, 0xa5,
+                                                    0x63, 0x65, 0x6b, 0x73, 0x62, 0x1e, 0xe, 0xf7,
+                                                    0x51, 0xf7, 0x1e, 0x1, 0xf7, 0x72, 0xf7, 0x30,
+                                                    0x3, 0xf7, 0x72, 0xf7, 0x95, 0x15, 0x69, 0xaa,
+                                                    0x69, 0xbc, 0xb1, 0xb1, 0xa7, 0xb2, 0xaf, 0x6d,
+                                                    0xae, 0x5c, 0x5f, 0x68, 0x6c, 0x64, 0x1e, 0xe,
+                                                    0x7c, 0xc2, 0xf7, 0x21, 0xc1, 0xf7, 0x1d, 0xc2,
+                                                    0xf7, 0x21, 0xc1, 0x12, 0xa4, 0xc3, 0x7d, 0xc3,
+                                                    0xf2, 0xc1, 0x7f, 0xc1, 0xa0, 0xc3, 0xf7, 0x25,
+                                                    0xc1, 0x13, 0xfa, 0xc0, 0xa4, 0xf8, 0x84, 0x15,
+                                                    0x49, 0xbd, 0x51, 0xd9, 0xd4, 0xc1, 0xc4, 0xcf,
+                                                    0xcd, 0x62, 0xc6, 0x33, 0x3e, 0x5a, 0x4f, 0x49,
+                                                    0x1e, 0xc3, 0x8a, 0x15, 0xb6, 0xa7, 0xa9, 0xb9,
+                                                    0xb8, 0xa5, 0x6a, 0x64, 0x69, 0x72, 0x68, 0x5d,
+                                                    0x61, 0x6b, 0xa5, 0xb5, 0x1e, 0xf7, 0x9a, 0xfc,
+                                                    0x15, 0x3a, 0xa, 0x13, 0xf5, 0xc0, 0xfb, 0xe0,
+                                                    0x8c, 0x3a, 0xa, 0x27, 0xf2, 0x15, 0x13, 0x0,
+                                                    0x0, 0xf8, 0x46, 0xf7, 0x47, 0x75, 0xbe, 0xfc,
+                                                    0x46, 0xfb, 0x47, 0x5, 0xe, 0xcc, 0x76, 0xf7,
+                                                    0x5a, 0xc1, 0xf7, 0x42, 0x77, 0x68, 0xa, 0xc1,
+                                                    0x3, 0xdb, 0xf7, 0x86, 0x15, 0xf7, 0x56, 0xfb,
+                                                    0x5a, 0xc1, 0xf7, 0x5a, 0xf7, 0x54, 0xc1, 0xfb,
+                                                    0x54, 0xf7, 0x42, 0x55, 0xfb, 0x42, 0xfb, 0x56,
+                                                    0x6, 0xe, 0xb7, 0xc2, 0xf7, 0x76, 0xc2, 0xf7,
+                                                    0x46, 0x77, 0x68, 0xa, 0xc2, 0x3, 0xf7, 0xa6,
+                                                    0xf7, 0x1e, 0x15, 0xc2, 0xf7, 0x4f, 0xf7, 0x4c,
+                                                    0xc2, 0xfb, 0x4c, 0xf7, 0x46, 0x54, 0xfb, 0x46,
+                                                    0xfb, 0x4f, 0x54, 0xf7, 0x4f, 0x6, 0xfb, 0x4f,
+                                                    0xfb, 0xad, 0x15, 0xf8, 0x3e, 0xc2, 0xfc, 0x3e,
+                                                    0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x5c, 0xc2, 0xf7,
+                                                    0x68, 0xc2, 0x1, 0xf5, 0xc2, 0xf7, 0xab, 0xc2,
+                                                    0x3, 0xa4, 0x7c, 0x15, 0xf7, 0x6d, 0xc2, 0x3a,
+                                                    0xf7, 0x5c, 0xf7, 0x8, 0x6, 0xa2, 0x6d, 0xb5,
+                                                    0x4e, 0xb1, 0x4f, 0x47, 0x47, 0x18, 0xaf, 0x67,
+                                                    0xc7, 0xc7, 0x98, 0x74, 0x98, 0x77, 0x94, 0x7a,
+                                                    0x19, 0xf7, 0x18, 0xc2, 0x23, 0x6, 0x83, 0x97,
+                                                    0x83, 0x9a, 0x81, 0x9a, 0xd5, 0xd5, 0x18, 0x67,
+                                                    0xaf, 0x4a, 0x4a, 0x70, 0xb5, 0x6d, 0xb7, 0x74,
+                                                    0xa8, 0x19, 0xcf, 0x90, 0xe4, 0xac, 0xf7, 0xf,
+                                                    0x1a, 0xe1, 0x5b, 0xd4, 0xfb, 0xe, 0x1e, 0xfb,
+                                                    0xc0, 0x54, 0xdc, 0xfc, 0x67, 0x3a, 0x6, 0xf7,
+                                                    0x1c, 0xf7, 0x93, 0x15, 0xf7, 0x68, 0xf7, 0x26,
+                                                    0x7, 0xd1, 0xca, 0x72, 0x3a, 0xfb, 0x2, 0x24,
+                                                    0x8f, 0x42, 0x1f, 0xe, 0x66, 0xa, 0xba, 0xc4,
+                                                    0xf7, 0xf1, 0xc2, 0x13, 0xec, 0xf7, 0xbc, 0x21,
+                                                    0x15, 0x58, 0xf7, 0xbd, 0xbe, 0x36, 0xf8, 0x78,
+                                                    0xe0, 0xbe, 0xfb, 0x20, 0x4a, 0x7, 0x13, 0xdc,
+                                                    0xb6, 0x65, 0x4d, 0xa6, 0x33, 0x1b, 0xfb, 0xe,
+                                                    0x2b, 0x38, 0xfb, 0x4, 0xfb, 0x12, 0xec, 0x2e,
+                                                    0xf7, 0x11, 0xea, 0xc3, 0xb4, 0xaf, 0xac, 0x1f,
+                                                    0xfb, 0x5f, 0x7, 0x87, 0xf7, 0xe4, 0x15, 0x32,
+                                                    0x3e, 0x43, 0x2b, 0x2b, 0x3f, 0xd3, 0xe4, 0xe4,
+                                                    0xd7, 0xca, 0xeb, 0xeb, 0xd8, 0x4c, 0x32, 0x1e,
+                                                    0xe, 0x7c, 0xf7, 0xb, 0xf8, 0x34, 0xbf, 0x1,
+                                                    0xf7, 0xa, 0xc1, 0xaa, 0xf7, 0x19, 0xe7, 0xc0,
+                                                    0x3, 0xf7, 0x86, 0xf7, 0x44, 0x15, 0xc2, 0xcd,
+                                                    0x6, 0xcc, 0x8f, 0xf7, 0xb, 0xb3, 0xf7, 0xc,
+                                                    0x1a, 0xf7, 0x6, 0x2c, 0xbf, 0x27, 0x4f, 0x4d,
+                                                    0x79, 0x69, 0x5d, 0x1e, 0x27, 0xc1, 0xc9, 0x7,
+                                                    0xa7, 0xb0, 0xb4, 0x95, 0xb1, 0x1b, 0xd7, 0xcb,
+                                                    0x5c, 0x4a, 0x29, 0xfb, 0x5, 0x7c, 0x42, 0x7d,
+                                                    0x1f, 0x64, 0xfb, 0x81, 0x4c, 0xa, 0xfb, 0x31,
+                                                    0xc1, 0xf7, 0xb, 0x76, 0xf7, 0xd2, 0xf7, 0x9,
+                                                    0x1, 0xf7, 0xa, 0xc0, 0xe6, 0xf7, 0x1b, 0xa9,
+                                                    0xc1, 0x3, 0xf7, 0x9a, 0xf8, 0x9, 0x15, 0x6c,
+                                                    0xa5, 0x6e, 0xb4, 0xb1, 0xa9, 0xa5, 0xac, 0xa8,
+                                                    0x70, 0xa8, 0x61, 0x6a, 0x6a, 0x73, 0x6a, 0x1e,
+                                                    0xb4, 0xfb, 0x52, 0x15, 0x40, 0x77, 0xfb, 0x2,
+                                                    0x67, 0xfb, 0xb, 0x1a, 0x21, 0xea, 0x50, 0xf1,
+                                                    0xc6, 0xc7, 0x9b, 0x9c, 0xba, 0x1e, 0xf7, 0xb,
+                                                    0x55, 0x44, 0x7, 0x7b, 0x68, 0x63, 0x80, 0x63,
+                                                    0x1b, 0xfb, 0x5, 0x6f, 0xd3, 0xb0, 0xec, 0xf7,
+                                                    0x6, 0xa0, 0xd4, 0x98, 0x1f, 0xf7, 0x6, 0x54,
+                                                    0x7, 0xe, 0xf8, 0xc2, 0x77, 0x1, 0xf7, 0x58,
+                                                    0xca, 0xdc, 0xca, 0x3, 0xf7, 0x62, 0xf7, 0xc7,
+                                                    0x77, 0xa, 0xf7, 0x37, 0xfb, 0x8f, 0x77, 0xa,
+                                                    0xe, 0xfb, 0x1a, 0x6d, 0xa, 0xfb, 0x1a, 0x45,
+                                                    0xa, 0xf7, 0xdc, 0xf7, 0x7e, 0x8b, 0x77, 0x1,
+                                                    0xf7, 0x1c, 0xf7, 0xdc, 0x3, 0xf8, 0x29, 0xf7,
+                                                    0xdc, 0x15, 0xc6, 0x6, 0x46, 0xf7, 0x7e, 0x5,
+                                                    0x2e, 0x6, 0x4a, 0xfb, 0x7e, 0x15, 0xc8, 0x6,
+                                                    0x45, 0x5c, 0xa, 0xf7, 0xdc, 0x6d, 0xa, 0xf7,
+                                                    0xdc, 0x45, 0xa, 0xf7, 0xdc, 0x5f, 0xa, 0xf7,
+                                                    0xd6, 0xf7, 0xdc, 0x15, 0xc6, 0x6, 0x44, 0x5c,
+                                                    0xa, 0xf7, 0xdc, 0x5f, 0xa, 0xf7, 0x6e, 0xf7,
+                                                    0xdc, 0x15, 0xc6, 0x6, 0xf3, 0x5c, 0xa, 0xfb,
+                                                    0x1a, 0x5f, 0xa, 0xf7, 0x6e, 0xfb, 0x1a, 0x15,
+                                                    0xc6, 0x6, 0xf3, 0x5c, 0xa, 0xf8, 0xc6, 0x77,
+                                                    0x1, 0xf7, 0x97, 0xdd, 0x3, 0xf7, 0xae, 0xf7,
+                                                    0xc7, 0x15, 0xae, 0x6, 0xa3, 0xf7, 0x93, 0x5,
+                                                    0x39, 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd4, 0xc1,
+                                                    0x63, 0xc0, 0x12, 0xbd, 0xf7, 0x4a, 0x54, 0xc2,
+                                                    0x13, 0xb0, 0xbd, 0x16, 0xf8, 0xf, 0xc1, 0xfb,
+                                                    0x59, 0xf7, 0x51, 0x6, 0xf1, 0xf7, 0x2, 0xc2,
+                                                    0xb6, 0xb6, 0x1b, 0xa4, 0x9e, 0x85, 0x69, 0x92,
+                                                    0x1f, 0xc5, 0x90, 0x5, 0xbf, 0x88, 0x6a, 0xaf,
+                                                    0x54, 0x1b, 0x2c, 0x3f, 0x36, 0x57, 0x54, 0x1f,
+                                                    0x13, 0xd0, 0xf7, 0x10, 0xfb, 0x4a, 0x55, 0x7,
+                                                    0x13, 0xc8, 0xf7, 0x13, 0xfb, 0xd4, 0x6, 0x13,
+                                                    0xd0, 0xfb, 0x13, 0x6, 0xe, 0x79, 0xb9, 0xf8,
+                                                    0x7, 0xba, 0xe4, 0xb8, 0x1, 0x8b, 0xb9, 0xf7,
+                                                    0x2f, 0xbb, 0xf7, 0xd, 0xbe, 0xf7, 0x17, 0xbb,
+                                                    0x3, 0xf7, 0xaa, 0x4, 0xfb, 0x37, 0xf7, 0x1c,
+                                                    0xfb, 0x19, 0xf7, 0x3b, 0xf7, 0x36, 0xf7, 0x1b,
+                                                    0xf7, 0x14, 0xf7, 0x43, 0xf7, 0x3b, 0xfb, 0x1e,
+                                                    0xf7, 0x14, 0xfb, 0x33, 0xfb, 0x2f, 0xfb, 0x28,
+                                                    0xfb, 0xc, 0xfb, 0x4a, 0x1e, 0xb9, 0x8d, 0x15,
+                                                    0xf7, 0x16, 0xf1, 0xf7, 0x11, 0xf7, 0x30, 0xf7,
+                                                    0x22, 0xf5, 0xfb, 0x8, 0xfb, 0x1d, 0xfb, 0x22,
+                                                    0xfb, 0x1, 0xfb, 0x4, 0xfb, 0x21, 0xfb, 0x1b,
+                                                    0xfb, 0xd, 0xf7, 0x2, 0xf7, 0x22, 0x1e, 0xf7,
+                                                    0x2f, 0xfb, 0x30, 0x15, 0xbb, 0xf7, 0xe, 0xc0,
+                                                    0x6, 0xd4, 0xfb, 0xe, 0x5, 0xc6, 0x6, 0x3d,
+                                                    0xf7, 0x1a, 0x5, 0xb1, 0x99, 0xa6, 0xba, 0xae,
+                                                    0x1a, 0xd1, 0x4f, 0xa1, 0x52, 0x1e, 0x24, 0x6,
+                                                    0xbb, 0xfb, 0x2d, 0x15, 0xf5, 0xc1, 0x7, 0xb8,
+                                                    0xa1, 0x71, 0x74, 0x65, 0x67, 0x78, 0x6d, 0x1f,
+                                                    0xe, 0xf8, 0x63, 0xbd, 0xab, 0x8b, 0xab, 0xbd,
+                                                    0x1, 0xf7, 0x6e, 0xbd, 0xcb, 0xbd, 0x14, 0xe0,
+                                                    0xf7, 0x6e, 0xf8, 0xb5, 0x15, 0x5d, 0xaf, 0x67,
+                                                    0xb9, 0xb9, 0xaf, 0xaf, 0xb9, 0xb9, 0x67, 0xaf,
+                                                    0x5d, 0x5d, 0x67, 0x67, 0x5d, 0x1e, 0xbd, 0x16,
+                                                    0x9d, 0x99, 0x99, 0x9d, 0x9d, 0x99, 0x7d, 0x79,
+                                                    0x79, 0x7d, 0x7d, 0x79, 0x79, 0x7d, 0x99, 0x9d,
+                                                    0x1e, 0xe, 0x7e, 0xc2, 0xf7, 0x2b, 0xc0, 0xf7,
+                                                    0x20, 0xc2, 0x12, 0xdf, 0xc2, 0x5a, 0xc1, 0xf7,
+                                                    0xba, 0xc1, 0x69, 0xc5, 0x13, 0xf4, 0xdf, 0x7f,
+                                                    0x15, 0xc2, 0xb8, 0x6, 0x74, 0xbc, 0xc5, 0x75,
+                                                    0xdb, 0x1b, 0x13, 0xea, 0xf7, 0x3, 0xda, 0xc4,
+                                                    0xe1, 0xf7, 0xb, 0xfb, 0x28, 0x80, 0x32, 0x92,
+                                                    0x1f, 0x5f, 0x8e, 0x30, 0x99, 0xc1, 0x1a, 0xc9,
+                                                    0xee, 0x92, 0xb6, 0xc2, 0xc2, 0x7a, 0x70, 0xb5,
+                                                    0x1e, 0x50, 0xc1, 0xf7, 0x32, 0x55, 0x63, 0x7,
+                                                    0xa6, 0x5e, 0x55, 0x98, 0x53, 0x1b, 0xfb, 0x2,
+                                                    0x38, 0x5c, 0x35, 0x33, 0xf7, 0xc, 0x72, 0xce,
+                                                    0x89, 0x1f, 0xc1, 0x89, 0xf7, 0x13, 0x85, 0x4f,
+                                                    0x1a, 0x45, 0x20, 0x7f, 0x66, 0x4c, 0x4b, 0x9e,
+                                                    0xb0, 0x5b, 0x1e, 0xc6, 0x54, 0x7, 0xe, 0x7c,
+                                                    0xc2, 0x8b, 0xf7, 0x27, 0x8b, 0xc1, 0x8b, 0xf7,
+                                                    0x2b, 0x8b, 0xc2, 0x8b, 0xb7, 0x12, 0xde, 0xc3,
+                                                    0xf7, 0xbd, 0xc2, 0x17, 0xf7, 0x96, 0xf8, 0x7f,
+                                                    0x15, 0xdd, 0x6, 0xf7, 0x2a, 0xf7, 0x32, 0x60,
+                                                    0x9f, 0xfb, 0x28, 0xfb, 0xe, 0xfb, 0x2d, 0xf7,
+                                                    0xd, 0x61, 0x77, 0x5, 0x76, 0xfd, 0x2b, 0x15,
+                                                    0xc3, 0xc2, 0x6, 0x74, 0xbd, 0xbe, 0x6b, 0xdd,
+                                                    0x1b, 0xf7, 0x5, 0xdc, 0xc4, 0xe2, 0xdf, 0x3f,
+                                                    0xa2, 0x44, 0x90, 0x1f, 0x44, 0x90, 0xfb, 0x2c,
+                                                    0x7b, 0xe1, 0x1a, 0xca, 0xe6, 0x98, 0xb7, 0x1e,
+                                                    0x13, 0xef, 0xc3, 0xc3, 0x70, 0x70, 0xb6, 0x1f,
+                                                    0x59, 0xc2, 0xf7, 0x33, 0x54, 0x59, 0x7, 0xa6,
+                                                    0x5d, 0x54, 0xa2, 0x51, 0x1b, 0xfb, 0x4, 0x41,
+                                                    0x56, 0x34, 0xfb, 0xa, 0xf7, 0x2a, 0x8c, 0xdd,
+                                                    0x88, 0x1f, 0xbc, 0x89, 0xdf, 0x91, 0x47, 0x1a,
+                                                    0x40, 0xfb, 0x1, 0x83, 0x65, 0x4b, 0x52, 0xa9,
+                                                    0xb0, 0x5a, 0x1e, 0xbc, 0x53, 0x7, 0xe, 0xfb,
+                                                    0x2b, 0xf7, 0x5a, 0x56, 0xc0, 0xf7, 0x22, 0xbd,
+                                                    0xf7, 0x29, 0xc0, 0x12, 0xde, 0xc3, 0x5a, 0xc2,
+                                                    0xf7, 0xb6, 0xc3, 0x6c, 0xc3, 0x13, 0x7a, 0xde,
+                                                    0x85, 0x15, 0xc3, 0xc0, 0x6, 0xb3, 0x78, 0xb3,
+                                                    0x73, 0xc4, 0x83, 0x89, 0x4a, 0x18, 0x8e, 0x92,
+                                                    0x95, 0x8c, 0x95, 0x1b, 0x98, 0x96, 0x84, 0x7e,
+                                                    0x7b, 0x7c, 0x82, 0x7a, 0x7d, 0x7d, 0x8e, 0x94,
+                                                    0x81, 0x1f, 0x7d, 0x68, 0x5, 0x13, 0xba, 0x7f,
+                                                    0x9b, 0xa0, 0x85, 0x9e, 0x1b, 0xb1, 0xae, 0xab,
+                                                    0xb3, 0xad, 0x73, 0x9e, 0x77, 0x8c, 0x1f, 0x13,
+                                                    0x75, 0x9e, 0x7, 0xf7, 0x3, 0x8c, 0xda, 0xb4,
+                                                    0xde, 0x1a, 0xdc, 0x4f, 0xae, 0x43, 0x8f, 0x1e,
+                                                    0x45, 0x90, 0xfb, 0x3d, 0x85, 0xde, 0x1a, 0xc8,
+                                                    0xe6, 0x91, 0xb7, 0x1e, 0x13, 0xb6, 0xc4, 0xc2,
+                                                    0x70, 0x70, 0xb6, 0x1f, 0x5c, 0xc3, 0xf7, 0x2e,
+                                                    0x53, 0x5b, 0x7, 0xa5, 0x5d, 0x55, 0xa1, 0x50,
+                                                    0x1b, 0xfb, 0x4, 0x41, 0x5d, 0x38, 0xfb, 0x7,
+                                                    0xf7, 0x2e, 0x86, 0xdd, 0x88, 0x1f, 0x13, 0xb9,
+                                                    0xbd, 0x89, 0xdf, 0x83, 0x48, 0x1a, 0x44, 0xfb,
+                                                    0x5, 0x91, 0x65, 0x4a, 0x53, 0xa7, 0xaf, 0x5a,
+                                                    0x1e, 0xb1, 0x53, 0x7, 0xe, 0x3e, 0xc0, 0xf8,
+                                                    0xa3, 0xc0, 0x1, 0xf7, 0x16, 0xc0, 0xf7, 0x74,
+                                                    0xc0, 0x3, 0xf7, 0x16, 0xdd, 0x15, 0xfb, 0x33,
+                                                    0xf7, 0x53, 0x7, 0xa5, 0xa7, 0x8c, 0x8f, 0xa0,
+                                                    0x1f, 0xa5, 0x91, 0xac, 0x9e, 0xb7, 0x1a, 0xa7,
+                                                    0x7a, 0xa7, 0x74, 0x9e, 0x1e, 0x8b, 0x7c, 0x96,
+                                                    0x84, 0x92, 0x1e, 0xe3, 0x9e, 0x8c, 0xc6, 0xa2,
+                                                    0x1a, 0x8c, 0x7, 0xad, 0x72, 0xa6, 0x71, 0x9f,
+                                                    0x1e, 0xfb, 0x67, 0xf7, 0x33, 0x5, 0x74, 0x9d,
+                                                    0x84, 0x93, 0x96, 0x1a, 0xa9, 0xae, 0x8f, 0x9f,
+                                                    0x1e, 0xf7, 0x36, 0x21, 0xc0, 0xf7, 0x33, 0xfb,
+                                                    0x47, 0x6, 0x69, 0x68, 0x8a, 0x81, 0x6e, 0x1f,
+                                                    0x6e, 0x82, 0x7a, 0x70, 0x6d, 0x1a, 0x6c, 0x9f,
+                                                    0x76, 0xa1, 0x77, 0x1e, 0x9e, 0x7a, 0x5, 0x6d,
+                                                    0x83, 0x59, 0x6b, 0x52, 0x1a, 0x69, 0x9e, 0x6d,
+                                                    0xa3, 0x79, 0x1e, 0xf7, 0x65, 0xfb, 0x32, 0x5,
+                                                    0xa8, 0x76, 0x8e, 0x7d, 0x80, 0x1a, 0x81, 0x86,
+                                                    0x76, 0x6a, 0x1e, 0xfb, 0x49, 0xf5, 0x6, 0xf7,
+                                                    0x3f, 0xbb, 0x15, 0xfb, 0x2c, 0xf7, 0x6, 0x5,
+                                                    0x7d, 0x96, 0x7a, 0x9b, 0xa0, 0x1a, 0xb0, 0xb5,
+                                                    0xa2, 0xa5, 0x1e, 0xf7, 0x31, 0xfb, 0x5, 0x5,
+                                                    0x9b, 0x7e, 0x9f, 0x7a, 0x75, 0x1a, 0x7c, 0x80,
+                                                    0x61, 0x48, 0x1e, 0xe, 0xa8, 0x76, 0xf7, 0x8e,
+                                                    0xf7, 0x15, 0x8b, 0xf7, 0xb, 0x1, 0xf7, 0x99,
+                                                    0xf7, 0x19, 0x3, 0xf7, 0x61, 0x93, 0x15, 0xcb,
+                                                    0x6, 0xf1, 0xf7, 0x8e, 0x5, 0x2b, 0x6, 0x7d,
+                                                    0xf7, 0x50, 0x4c, 0xa, 0xa0, 0x76, 0xf8, 0xbb,
+                                                    0xc3, 0x1, 0xee, 0xc3, 0x3, 0xf7, 0x8a, 0x16,
+                                                    0xc8, 0x6, 0xf7, 0x55, 0xf8, 0xb8, 0x5, 0xc6,
+                                                    0xfc, 0x25, 0xfb, 0x28, 0xc3, 0xe7, 0xf7, 0xb3,
+                                                    0x7, 0xe, 0x7c, 0xc6, 0xf7, 0xa9, 0xc9, 0xf7,
+                                                    0x4a, 0xc4, 0x1, 0xf1, 0xc5, 0xf7, 0xaa, 0xc7,
+                                                    0x3, 0xf7, 0x34, 0xf7, 0xbd, 0x15, 0xf7, 0x72,
+                                                    0xf7, 0x39, 0xb9, 0xf7, 0x37, 0x1e, 0xc4, 0x7,
+                                                    0xfb, 0x8d, 0xfb, 0x1d, 0x38, 0xfb, 0x9a, 0xfb,
+                                                    0x62, 0xe8, 0x35, 0xf7, 0x6, 0xf3, 0xe0, 0xef,
+                                                    0xf6, 0xee, 0x42, 0xe7, 0xfb, 0x2, 0x3d, 0x5b,
+                                                    0x5d, 0x63, 0x6e, 0x1f, 0x8e, 0x39, 0x15, 0xc2,
+                                                    0xa6, 0xbe, 0xbe, 0xcc, 0x1b, 0xd3, 0xc7, 0x56,
+                                                    0x3d, 0x51, 0x62, 0x33, 0x2c, 0x34, 0x5b, 0xe9,
+                                                    0xd8, 0x87, 0x1f, 0xe, 0x3b, 0xf9, 0x59, 0x1,
+                                                    0xf7, 0x11, 0xf7, 0xf2, 0x3, 0xf7, 0x11, 0x4d,
+                                                    0x15, 0xb3, 0x79, 0xf7, 0xca, 0xf9, 0x46, 0x63,
+                                                    0x9e, 0x5, 0xe, 0xe, 0x76, 0xc5, 0x70, 0xc4,
+                                                    0xf7, 0x64, 0xc5, 0xf7, 0x71, 0xc4, 0x12, 0xf7,
+                                                    0x25, 0xc1, 0x89, 0xc0, 0x13, 0xb8, 0xf7, 0xa,
+                                                    0xaa, 0x15, 0xa3, 0x57, 0x5, 0x13, 0x78, 0xa4,
+                                                    0xc3, 0xb5, 0x91, 0xad, 0x1b, 0x13, 0xb8, 0xc8,
+                                                    0xae, 0x6c, 0xae, 0x1b, 0xb6, 0xb2, 0x9d, 0xa6,
+                                                    0xaa, 0x1f, 0x76, 0xb9, 0x5, 0x7f, 0x7a, 0x6e,
+                                                    0x76, 0x68, 0x1b, 0x13, 0x74, 0x6e, 0x8a, 0x5f,
+                                                    0xa9, 0x50, 0x8c, 0x8, 0x6e, 0x69, 0x86, 0x77,
+                                                    0x66, 0x1f, 0x88, 0x6, 0xb6, 0xc1, 0xa3, 0xb7,
+                                                    0x8d, 0xb8, 0x8c, 0xa8, 0x88, 0xa8, 0x81, 0xab,
+                                                    0x8, 0xf7, 0x61, 0xc5, 0xfb, 0x73, 0x6, 0x13,
+                                                    0xb8, 0x80, 0xa3, 0x81, 0xbb, 0xa2, 0x1a, 0xdd,
+                                                    0xbf, 0xb7, 0xd8, 0xbe, 0xb9, 0x67, 0x5a, 0xa4,
+                                                    0x1e, 0xc0, 0xa9, 0x5, 0xc3, 0x70, 0x52, 0xc3,
+                                                    0x31, 0x1b, 0xfb, 0xb, 0x4a, 0x38, 0x2f, 0x69,
+                                                    0x93, 0x67, 0x9c, 0x6a, 0x1f, 0x32, 0x51, 0xf4,
+                                                    0x6, 0x13, 0xb4, 0x93, 0x73, 0x8e, 0x73, 0x74,
+                                                    0x1a, 0x48, 0x6d, 0x51, 0x5a, 0x5b, 0x1e, 0xe,
+                                                    0x7c, 0xc2, 0xf7, 0xe4, 0xc2, 0xf7, 0x16, 0x77,
+                                                    0x1, 0xf7, 0x2a, 0xc1, 0x3, 0xd9, 0xf8, 0xc,
+                                                    0x15, 0xd3, 0xfb, 0x98, 0x6, 0xfb, 0x5, 0xf7,
+                                                    0x0, 0x79, 0xbf, 0xd5, 0xd5, 0xa8, 0xa6, 0xca,
+                                                    0x1e, 0x85, 0xc1, 0x5, 0x77, 0x57, 0x41, 0x68,
+                                                    0x47, 0x1b, 0x3f, 0x62, 0x9d, 0xdd, 0x1f, 0xf7,
+                                                    0x80, 0xf7, 0x8c, 0xc2, 0xfb, 0x8c, 0xf7, 0x16,
+                                                    0x55, 0xfb, 0x16, 0x43, 0x7, 0xe, 0xfb, 0x31,
+                                                    0xc0, 0xf7, 0x16, 0xc1, 0xf7, 0xe1, 0xc1, 0xf7,
+                                                    0x1, 0xc0, 0x1, 0xf6, 0xc3, 0xf7, 0xfb, 0xc5,
+                                                    0x3, 0x9e, 0x23, 0x15, 0x56, 0xf7, 0xc5, 0xc0,
+                                                    0xfb, 0x35, 0xf7, 0x65, 0x7, 0x64, 0xab, 0xc6,
+                                                    0x63, 0xea, 0x1b, 0xf7, 0x14, 0xf2, 0xea, 0xf7,
+                                                    0x15, 0xf7, 0x14, 0xfb, 0x2, 0xe4, 0xfb, 0x8,
+                                                    0x31, 0x4b, 0x67, 0x5e, 0x66, 0x1f, 0xf7, 0x87,
+                                                    0xfb, 0x24, 0x56, 0xe3, 0xfd, 0x3c, 0x7, 0xc6,
+                                                    0xf7, 0xf4, 0x15, 0xe2, 0xd0, 0xd9, 0xf7, 0x4,
+                                                    0xf7, 0x1e, 0xb0, 0xfb, 0x1, 0x54, 0x21, 0x45,
+                                                    0x4c, 0x20, 0x2a, 0x39, 0xcf, 0xef, 0x1e, 0xe,
+                                                    0x7c, 0xbf, 0xf7, 0x7e, 0xc6, 0xf7, 0x7c, 0xc7,
+                                                    0x12, 0xf8, 0x2b, 0xc9, 0x6b, 0xc5, 0x13, 0xe8,
+                                                    0xf3, 0xa6, 0x15, 0x70, 0xbc, 0xcd, 0x7c, 0xca,
+                                                    0x1b, 0xf7, 0x2, 0xf2, 0xbb, 0xf7, 0x11, 0xf7,
+                                                    0x1, 0x33, 0xae, 0x65, 0x91, 0x1f, 0x13, 0xf0,
+                                                    0xb6, 0x9e, 0xc4, 0xc8, 0xd6, 0x1a, 0xf7, 0x3,
+                                                    0x31, 0xbb, 0x32, 0x4d, 0x4a, 0x70, 0x67, 0x5a,
+                                                    0x1e, 0xa8, 0x58, 0x5, 0xae, 0xb4, 0xc0, 0x9e,
+                                                    0xba, 0x1b, 0xcd, 0xc4, 0x74, 0x3d, 0x55, 0x49,
+                                                    0x3e, 0x30, 0x1f, 0x88, 0x50, 0x6, 0x13, 0xe8,
+                                                    0xd2, 0x8a, 0xf7, 0xb, 0x79, 0x2f, 0x1a, 0x35,
+                                                    0x42, 0x66, 0x3a, 0x53, 0x4f, 0x9c, 0xa9, 0x61,
+                                                    0x1e, 0xe, 0x62, 0xc2, 0x5a, 0x76, 0xf7, 0xd,
+                                                    0xc1, 0xf7, 0x47, 0xc2, 0xf7, 0x99, 0xbf, 0x12,
+                                                    0xf7, 0x44, 0xc1, 0x6a, 0xbf, 0xf7, 0x64, 0xbf,
+                                                    0x13, 0xbd, 0xf7, 0xca, 0xcc, 0x15, 0xf7, 0x27,
+                                                    0x58, 0x50, 0x54, 0xf7, 0x34, 0xc2, 0x5a, 0xbe,
+                                                    0xbc, 0xc1, 0x5a, 0xf7, 0x56, 0x4e, 0x6, 0xfb,
+                                                    0x1e, 0xfb, 0x65, 0x5, 0xce, 0x9a, 0x15, 0xdb,
+                                                    0xf7, 0x8, 0x5, 0xfb, 0x8, 0x7, 0xfc, 0x32,
+                                                    0xfb, 0x24, 0x15, 0x13, 0x7b, 0xb6, 0x6c, 0xf8,
+                                                    0x8e, 0xf9, 0x47, 0x60, 0xaa, 0x5, 0xfc, 0xb2,
+                                                    0xfb, 0xe7, 0x15, 0x7c, 0xa8, 0xbb, 0x7d, 0xb3,
+                                                    0x1b, 0xca, 0xc9, 0xb3, 0xce, 0xc0, 0x74, 0x9d,
+                                                    0x6f, 0x99, 0x1f, 0x13, 0xbd, 0xa0, 0x9d, 0x96,
+                                                    0x9f, 0xad, 0x1a, 0xcb, 0x5d, 0xb3, 0x4e, 0x63,
+                                                    0x61, 0x7b, 0x75, 0x6d, 0x1e, 0x9f, 0x57, 0x5,
+                                                    0xa2, 0x9b, 0xb5, 0x9a, 0xae, 0x1b, 0xa7, 0xa3,
+                                                    0x7b, 0x68, 0x69, 0x72, 0x74, 0x47, 0x8d, 0x1f,
+                                                    0x56, 0x7, 0x13, 0xbb, 0xbb, 0xcd, 0x8b, 0x59,
+                                                    0x68, 0x67, 0x7a, 0x63, 0x65, 0x61, 0x94, 0xa0,
+                                                    0x77, 0x1f, 0xe, 0xf7, 0x84, 0xc2, 0xf7, 0xa3,
+                                                    0xc3, 0x12, 0xf7, 0xf3, 0xc3, 0x63, 0xc5, 0x13,
+                                                    0xd0, 0xf7, 0x42, 0xf7, 0xa2, 0x15, 0x7c, 0xaa,
+                                                    0xbd, 0x7c, 0xb4, 0x1b, 0xcc, 0xcb, 0xb3, 0xd2,
+                                                    0xc2, 0x73, 0x9d, 0x6f, 0x99, 0x1f, 0x13, 0xe0,
+                                                    0xa5, 0xa2, 0x93, 0xab, 0xaa, 0x1a, 0xbe, 0x60,
+                                                    0xba, 0x48, 0x60, 0x5e, 0x7a, 0x73, 0x6b, 0x1e,
+                                                    0xa2, 0x5d, 0x5, 0xa0, 0xa4, 0xb4, 0x95, 0xa7,
+                                                    0x1b, 0xaa, 0xa5, 0x7b, 0x67, 0x69, 0x6f, 0x72,
+                                                    0x45, 0x8d, 0x1f, 0x55, 0x7, 0x13, 0xd0, 0xbd,
+                                                    0x8c, 0xcb, 0x88, 0x59, 0x1a, 0x63, 0x67, 0x7b,
+                                                    0x61, 0x66, 0x62, 0x97, 0x9f, 0x75, 0x1e, 0xe,
+                                                    0xf8, 0x7d, 0xbc, 0x9d, 0xbd, 0x1, 0xf0, 0xf8,
+                                                    0x8c, 0x15, 0xbe, 0x80, 0x5, 0x99, 0x8f, 0xa4,
+                                                    0xbc, 0xaf, 0x1b, 0xa9, 0x9d, 0x77, 0x79, 0xa3,
+                                                    0x1f, 0x7c, 0x9f, 0xa2, 0x7d, 0xb1, 0x1b, 0xc9,
+                                                    0xbb, 0xba, 0xc3, 0x9e, 0x1f, 0x59, 0x95, 0x82,
+                                                    0x72, 0x6e, 0x65, 0x62, 0x8a, 0x19, 0x73, 0x7a,
+                                                    0x97, 0x99, 0x7a, 0x1f, 0x9e, 0x74, 0x74, 0xa2,
+                                                    0x63, 0x1b, 0x58, 0x57, 0x66, 0x4a, 0x75, 0x1f,
+                                                    0xe, 0xf7, 0xb0, 0x76, 0xf7, 0x93, 0xb7, 0x1,
+                                                    0xf7, 0x10, 0xb8, 0xf7, 0x3, 0xb7, 0xf7, 0x4a,
+                                                    0xb7, 0x3, 0xf7, 0xac, 0xf7, 0x9b, 0x15, 0xb7,
+                                                    0xf7, 0x98, 0x6, 0xcb, 0xfb, 0x98, 0x5, 0xc4,
+                                                    0x6, 0xc8, 0xf7, 0x97, 0x5, 0xfb, 0x97, 0xb7,
+                                                    0xf7, 0xbf, 0x39, 0x7, 0x56, 0xfb, 0x7c, 0x55,
+                                                    0xf7, 0x7c, 0x5, 0x3a, 0x6, 0xfb, 0x30, 0xfb,
+                                                    0xbf, 0x15, 0xb8, 0xf7, 0x93, 0xd7, 0xb7, 0xfb,
+                                                    0x58, 0x5f, 0xd6, 0x6, 0xe, 0x8b, 0xc2, 0xf8,
+                                                    0x1f, 0x77, 0xf7, 0x1a, 0xc5, 0x1, 0xf8, 0x4c,
+                                                    0xc7, 0x3, 0xee, 0x16, 0xf8, 0x25, 0xf7, 0x24,
+                                                    0x51, 0x32, 0xfb, 0x9d, 0x6, 0xf7, 0x6d, 0xf7,
+                                                    0x44, 0xf5, 0xde, 0xf7, 0x4, 0x1a, 0xf7, 0x17,
+                                                    0x3b, 0xcc, 0xfb, 0x1, 0x37, 0x4b, 0x66, 0x3f,
+                                                    0x61, 0x1e, 0x50, 0xc1, 0x7, 0xd2, 0xc4, 0xb6,
+                                                    0xd9, 0xdd, 0xbb, 0x5d, 0x2f, 0x3f, 0x2f, 0x3f,
+                                                    0x6e, 0x72, 0x1e, 0x42, 0x4c, 0x41, 0x46, 0x42,
+                                                    0x4d, 0x8, 0xe, 0xf7, 0x8d, 0xc2, 0xf7, 0x9c,
+                                                    0xc1, 0x1, 0xf7, 0x53, 0xbf, 0xf7, 0x14, 0xbf,
+                                                    0x3, 0xf7, 0x44, 0xf7, 0x8d, 0x15, 0xf7, 0x8b,
+                                                    0xc2, 0xfb, 0x38, 0x6, 0xf7, 0x9, 0xe8, 0xba,
+                                                    0xb3, 0xd3, 0x1a, 0xc5, 0x64, 0xc2, 0x3b, 0x60,
+                                                    0x5c, 0x80, 0x4a, 0x74, 0x1e, 0x55, 0xbf, 0x7,
+                                                    0xc3, 0x83, 0xb0, 0x9f, 0xab, 0x1b, 0xb5, 0xa4,
+                                                    0x6b, 0x68, 0x55, 0xfb, 0x1f, 0x26, 0x53, 0x5e,
+                                                    0x1f, 0xe, 0x7c, 0xc0, 0x62, 0xc1, 0xf7, 0xd5,
+                                                    0xc1, 0x12, 0xf7, 0x4, 0xc0, 0xf7, 0xa2, 0xc0,
+                                                    0x13, 0xb8, 0xa8, 0xf8, 0x8, 0x15, 0xde, 0xfb,
+                                                    0x8b, 0x6, 0x31, 0xcf, 0x59, 0xe3, 0xb2, 0xbf,
+                                                    0x9b, 0xd3, 0xd7, 0x1e, 0x13, 0x78, 0x3f, 0xf7,
+                                                    0x1b, 0xc1, 0x39, 0xf8, 0xb, 0xfb, 0x1c, 0x55,
+                                                    0xde, 0xfb, 0x71, 0x7, 0x13, 0xb8, 0x5a, 0x62,
+                                                    0x54, 0x4b, 0x4f, 0x1b, 0x42, 0x62, 0xb5, 0xd3,
+                                                    0x1f, 0xf7, 0xa6, 0xfb, 0x1c, 0x7, 0xe, 0x3f,
+                                                    0xa, 0xf7, 0x41, 0xf8, 0x82, 0x15, 0xf7, 0xb3,
+                                                    0xf3, 0x6a, 0xd5, 0xfb, 0x9e, 0xfb, 0x26, 0x5,
+                                                    0xfb, 0x18, 0xfb, 0x25, 0x2b, 0xa, 0x3f, 0xa,
+                                                    0xf7, 0x0, 0xf8, 0x8f, 0x15, 0xb3, 0x79, 0xf7,
+                                                    0x27, 0xf7, 0xb, 0xf7, 0x26, 0xfb, 0xb, 0xb4,
+                                                    0x9d, 0xfb, 0x27, 0xf7, 0x31, 0x5, 0x3c, 0x6,
+                                                    0xfb, 0x77, 0xfb, 0xaf, 0x2b, 0xa, 0x7c, 0xc1,
+                                                    0x61, 0x67, 0xa, 0xe7, 0xf7, 0x9, 0x12, 0xf7,
+                                                    0x4, 0xc0, 0x94, 0xe0, 0xca, 0xdc, 0xaa, 0xc0,
+                                                    0x13, 0xbf, 0xf7, 0xd6, 0xf8, 0xa4, 0x72, 0xa,
+                                                    0xfb, 0x28, 0xfb, 0x9, 0x15, 0xe0, 0xf7, 0x9,
+                                                    0x36, 0x6, 0xfb, 0x25, 0xfb, 0x9c, 0x38, 0xa,
+                                                    0x13, 0x7f, 0x3b, 0xa, 0x13, 0xbf, 0x33, 0xa,
+                                                    0x3f, 0xa, 0xf7, 0x2c, 0xf8, 0xe8, 0x15, 0xf7,
+                                                    0xb3, 0x24, 0x96, 0xaa, 0xfb, 0x9c, 0xf7, 0x28,
+                                                    0x5, 0xfb, 0x31, 0xfb, 0xb7, 0x2b, 0xa, 0xfb,
+                                                    0x11, 0xbd, 0x1, 0x8b, 0xf8, 0xec, 0x3, 0x40,
+                                                    0x4, 0x59, 0xf8, 0xec, 0xbd, 0x7, 0xe, 0x96,
+                                                    0x76, 0xf8, 0x11, 0xc2, 0x1, 0x9a, 0xf7, 0x68,
+                                                    0xf7, 0x25, 0xf7, 0x69, 0x3, 0xf7, 0x9e, 0x81,
+                                                    0x15, 0xcc, 0x6, 0xf7, 0x45, 0xf8, 0x11, 0x5,
+                                                    0xd8, 0xc2, 0xfb, 0x69, 0x54, 0xd5, 0x6, 0xfb,
+                                                    0x27, 0xfb, 0xd1, 0xfb, 0x28, 0xf7, 0xd1, 0x5,
+                                                    0xd7, 0xc2, 0xfb, 0x68, 0x54, 0xd4, 0x6, 0xe,
+                                                    0x96, 0x76, 0xf8, 0x11, 0xc2, 0x1, 0x98, 0xf7,
+                                                    0x39, 0xf7, 0x8c, 0xf7, 0x34, 0x3, 0xf7, 0x31,
+                                                    0x81, 0x15, 0xca, 0x6, 0xdc, 0xf7, 0x9b, 0xdb,
+                                                    0xfb, 0x9b, 0x5, 0xc9, 0x6, 0xf6, 0xf8, 0x11,
+                                                    0x5, 0xaf, 0xc2, 0xfb, 0x34, 0x54, 0xce, 0x6,
+                                                    0x39, 0xfb, 0xc4, 0x34, 0xf7, 0xb0, 0x5, 0x5c,
+                                                    0x6, 0x35, 0xfb, 0xae, 0x33, 0xf7, 0xc2, 0x5,
+                                                    0xd6, 0xc2, 0xfb, 0x39, 0x54, 0xad, 0x6, 0xe,
+                                                    0x74, 0xa, 0xb0, 0xf7, 0x5b, 0xf7, 0x18, 0xf7,
+                                                    0x50, 0x3, 0x9f, 0x16, 0xf7, 0x6d, 0xc1, 0x43,
+                                                    0x6, 0xf7, 0x1a, 0xf7, 0x1b, 0xf7, 0x1a, 0xfb,
+                                                    0x1b, 0x5, 0x43, 0x55, 0xf7, 0x6f, 0xc1, 0x3f,
+                                                    0x6, 0xfb, 0x40, 0xf7, 0x3e, 0xf7, 0x28, 0xf7,
+                                                    0x28, 0x5, 0xd7, 0xc1, 0xfb, 0x50, 0x55, 0xb6,
+                                                    0x6, 0xfb, 0x5, 0xfb, 0x5, 0xfb, 0x4, 0xf7,
+                                                    0x5, 0x5, 0xbd, 0xc1, 0xfb, 0x5b, 0x55, 0xdb,
+                                                    0x6, 0xf7, 0x28, 0xfb, 0x27, 0xfb, 0x40, 0xfb,
+                                                    0x3f, 0x5, 0x42, 0x6, 0xe, 0xfb, 0x31, 0xbe,
+                                                    0xf8, 0x75, 0xbe, 0x6a, 0xa, 0x13, 0xe8, 0x13,
+                                                    0xd8, 0xc0, 0x21, 0x15, 0x58, 0xf7, 0x9a, 0xbe,
+                                                    0x32, 0x7, 0xf7, 0xc1, 0xf8, 0x75, 0x5, 0xcc,
+                                                    0xbe, 0xfb, 0x4b, 0x58, 0xc4, 0x6, 0xfb, 0x3d,
+                                                    0xfb, 0xa1, 0xfb, 0x34, 0xf7, 0xa1, 0x5, 0xcd,
+                                                    0xbe, 0xfb, 0x58, 0x58, 0xd0, 0x6, 0xf7, 0x53,
+                                                    0xfb, 0xd3, 0x25, 0xfb, 0x36, 0x5, 0xe, 0xfb,
+                                                    0x31, 0xc0, 0xf8, 0x87, 0xc0, 0x6a, 0xa, 0x13,
+                                                    0xd8, 0xf7, 0x3e, 0xf8, 0x89, 0x15, 0xf7, 0xbc,
+                                                    0xee, 0x69, 0xd3, 0xfb, 0xa6, 0xfb, 0x21, 0x5,
+                                                    0x22, 0xfd, 0xf, 0x15, 0x56, 0xf7, 0x9a, 0xc0,
+                                                    0x32, 0x7, 0xf7, 0xc1, 0xf8, 0x87, 0x5, 0xcc,
+                                                    0xc0, 0xfb, 0x4b, 0x56, 0xc4, 0x6, 0xfb, 0x3c,
+                                                    0xfb, 0xab, 0xfb, 0x35, 0xf7, 0xab, 0x5, 0x13,
+                                                    0xe8, 0xcd, 0xc0, 0xfb, 0x58, 0x56, 0xd0, 0x6,
+                                                    0xf7, 0x54, 0xfb, 0xe0, 0x24, 0xfb, 0x3b, 0x5,
+                                                    0xe, 0xfb, 0x31, 0xbd, 0xf8, 0x66, 0xbc, 0xd6,
+                                                    0xf7, 0x4, 0x12, 0x92, 0xf7, 0x58, 0x6b, 0xe2,
+                                                    0xce, 0xe0, 0x8a, 0xf7, 0x4b, 0x13, 0xec, 0xf7,
+                                                    0xd9, 0xf8, 0x77, 0x15, 0xe0, 0xf7, 0x4, 0x36,
+                                                    0x80, 0xa, 0x15, 0xe2, 0xf7, 0x4, 0x34, 0x6,
+                                                    0x13, 0xd2, 0xfb, 0xa, 0xfd, 0x52, 0x15, 0x59,
+                                                    0xf7, 0x9a, 0xbd, 0x32, 0x7, 0xf7, 0xc1, 0xf8,
+                                                    0x66, 0x5, 0xcc, 0xbc, 0xfb, 0x4b, 0x5a, 0xc4,
+                                                    0x6, 0xfb, 0x3c, 0xfb, 0x99, 0xfb, 0x35, 0xf7,
+                                                    0x99, 0x5, 0xcd, 0xbc, 0xfb, 0x58, 0x5a, 0xd0,
+                                                    0x6, 0xf7, 0x54, 0xfb, 0xc9, 0x24, 0xfb, 0x31,
+                                                    0x5, 0xe, 0x8b, 0xc1, 0xd8, 0xc1, 0xd1, 0xc2,
+                                                    0xf7, 0x5a, 0xc1, 0x1, 0xa5, 0xf7, 0x60, 0xb9,
+                                                    0xc1, 0xb4, 0xf7, 0x5f, 0x3, 0xf7, 0x3c, 0x16,
+                                                    0xf7, 0xa1, 0xc1, 0x20, 0xd8, 0xf7, 0x15, 0xc1,
+                                                    0xfb, 0x15, 0xd1, 0xf7, 0x15, 0xc2, 0xfb, 0xd,
+                                                    0x6, 0xf7, 0x47, 0xf7, 0x5a, 0x5, 0xc4, 0xc1,
+                                                    0xfb, 0x5f, 0x55, 0xce, 0x6, 0xfb, 0x1d, 0xfb,
+                                                    0x2b, 0xfb, 0x1d, 0xf7, 0x2b, 0x5, 0xcd, 0xc1,
+                                                    0xfb, 0x60, 0x55, 0xca, 0x6, 0xf7, 0x43, 0xfb,
+                                                    0x5a, 0x5, 0xfb, 0x9, 0x54, 0xf7, 0x15, 0x45,
+                                                    0xfb, 0x15, 0x55, 0xf7, 0x15, 0x3e, 0xfb, 0x0,
+                                                    0x6, 0xe, 0x74, 0xa, 0xf7, 0x4, 0xc1, 0xf7,
+                                                    0xad, 0xc1, 0x3, 0xed, 0x16, 0xf8, 0x27, 0xf7,
+                                                    0x2e, 0x55, 0x27, 0xfb, 0xa3, 0x6, 0xf7, 0xd9,
+                                                    0xf7, 0xd6, 0x5, 0xbd, 0xfc, 0x19, 0xfb, 0x2b,
+                                                    0xc1, 0xec, 0xf7, 0x94, 0x7, 0xfb, 0xd8, 0xfb,
+                                                    0xd5, 0x5, 0xe, 0x8b, 0x67, 0xa, 0xbf, 0xc4,
+                                                    0x1, 0xf7, 0x3, 0xc1, 0xf7, 0xad, 0xc2, 0x3,
+                                                    0xf7, 0x9e, 0xf8, 0x7f, 0x15, 0xda, 0x6, 0xf7,
+                                                    0x27, 0xf7, 0x32, 0x62, 0x9f, 0xfb, 0x26, 0xfb,
+                                                    0xd, 0xfb, 0x28, 0xf7, 0xc, 0x62, 0x77, 0x5,
+                                                    0x79, 0xfd, 0x1c, 0x15, 0xf8, 0x27, 0xf7, 0x31,
+                                                    0x54, 0x25, 0xfb, 0xa3, 0x6, 0xf7, 0xda, 0xf7,
+                                                    0xdd, 0x5, 0xc2, 0xfc, 0x1a, 0xfb, 0x32, 0xc1,
+                                                    0x7, 0x8c, 0xf2, 0x5, 0xf7, 0x98, 0x6, 0xfb,
+                                                    0xdc, 0xfb, 0xe0, 0x5, 0xe, 0x7d, 0xc1, 0xf8,
+                                                    0xa3, 0xc2, 0x1, 0xf5, 0xc4, 0xf7, 0xa5, 0xc5,
+                                                    0x3, 0xf5, 0xf7, 0xc4, 0x15, 0xfb, 0x29, 0xa2,
+                                                    0xfb, 0x3d, 0xf7, 0x40, 0xf7, 0x45, 0x9b, 0xf7,
+                                                    0x40, 0xf7, 0x26, 0xf7, 0x1b, 0x78, 0xf7, 0x4b,
+                                                    0xfb, 0x41, 0xfb, 0x41, 0x74, 0xfb, 0x49, 0xfb,
+                                                    0x1d, 0x1e, 0xc4, 0x16, 0xf7, 0xf, 0x9e, 0xf7,
+                                                    0x20, 0xf7, 0xc, 0xf7, 0x3, 0xa2, 0xfb, 0x1f,
+                                                    0xfb, 0x10, 0xfb, 0x17, 0x78, 0xfb, 0x19, 0xfb,
+                                                    0xa, 0xfb, 0x6, 0x75, 0xf7, 0x17, 0xf7, 0x19,
+                                                    0x1e, 0xe, 0x79, 0x9d, 0xf8, 0x3e, 0x9a, 0xf7,
+                                                    0xd, 0x9d, 0xa9, 0x97, 0x6, 0xfb, 0x31, 0x8b,
+                                                    0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9,
+                                                    0xc2, 0xa, 0xc2, 0xb, 0xf8, 0xec, 0x14, 0xaa,
+                                                    0x13, 0x0, 0x63, 0x2, 0x0, 0x1, 0x0, 0x3d,
+                                                    0x0, 0x70, 0x0, 0xae, 0x0, 0xb8, 0x0, 0xbd,
+                                                    0x0, 0xc2, 0x0, 0xc8, 0x0, 0xe5, 0x0, 0xff,
+                                                    0x1, 0x18, 0x1, 0x2e, 0x1, 0x38, 0x1, 0x42,
+                                                    0x1, 0x55, 0x1, 0x71, 0x1, 0x76, 0x1, 0x80,
+                                                    0x1, 0x9a, 0x1, 0xa9, 0x1, 0xba, 0x1, 0xc6,
+                                                    0x1, 0xd8, 0x2, 0x7, 0x2, 0x1c, 0x2, 0x2c,
+                                                    0x2, 0x33, 0x2, 0x5a, 0x2, 0x69, 0x2, 0x73,
+                                                    0x2, 0x7d, 0x2, 0x88, 0x2, 0x97, 0x2, 0xa3,
+                                                    0x2, 0xae, 0x2, 0xb7, 0x2, 0xcf, 0x2, 0xe7,
+                                                    0x2, 0xfd, 0x3, 0x4, 0x3, 0xe, 0x3, 0x24,
+                                                    0x3, 0x3a, 0x3, 0x4e, 0x3, 0x63, 0x3, 0x76,
+                                                    0x3, 0x7f, 0x3, 0x88, 0x3, 0x91, 0x3, 0xa5,
+                                                    0x3, 0xb7, 0x3, 0xc9, 0x3, 0xdb, 0x3, 0xe3,
+                                                    0x3, 0xeb, 0x3, 0xf3, 0x3, 0xfb, 0x4, 0x3,
+                                                    0x4, 0xe, 0x4, 0x13, 0x4, 0x1e, 0x4, 0x24,
+                                                    0x4, 0x31, 0x4, 0x38, 0x4, 0x41, 0x4, 0x4a,
+                                                    0x4, 0x53, 0x4, 0x5a, 0x4, 0x60, 0x4, 0x66,
+                                                    0x4, 0x74, 0x4, 0x81, 0x4, 0x86, 0x4, 0x8a,
+                                                    0x4, 0x96, 0x4, 0xa2, 0x4, 0xa8, 0x4, 0xae,
+                                                    0x4, 0xb9, 0x4, 0xc4, 0x4, 0xce, 0x4, 0xd9,
+                                                    0x4, 0xe4, 0x4, 0xeb, 0x4, 0xf2, 0x4, 0xf9,
+                                                    0x5, 0x0, 0x5, 0x7, 0x5, 0x11, 0x5, 0x1b,
+                                                    0x5, 0x24, 0x5, 0x2d, 0x5, 0x36, 0x5, 0x3f,
+                                                    0x5, 0x48, 0x5, 0x51, 0x5, 0x58, 0x5, 0x5e,
+                                                    0x5, 0x64, 0x5, 0x69, 0x15, 0xfb, 0x37, 0xf3,
+                                                    0xfb, 0x1a, 0xf7, 0x30, 0xf7, 0x34, 0xe9, 0xf7,
+                                                    0x1a, 0xf7, 0x37, 0xe9, 0x5a, 0xf7, 0x5f, 0xfb,
+                                                    0x60, 0xfb, 0x43, 0x35, 0xfb, 0x31, 0xfb, 0x20,
+                                                    0x1e, 0xc1, 0x89, 0x15, 0xe4, 0xc1, 0xf7, 0x31,
+                                                    0xf7, 0x2b, 0xf7, 0x2c, 0xba, 0xfb, 0x3d, 0x3e,
+                                                    0xfb, 0x13, 0x47, 0xfb, 0x7, 0xfb, 0x15, 0xfb,
+                                                    0x15, 0x3d, 0xf7, 0x7, 0xf7, 0x13, 0x1e, 0xb,
+                                                    0x15, 0xfb, 0x1b, 0xe2, 0x2b, 0xf7, 0x2a, 0xf7,
+                                                    0x25, 0xe9, 0xed, 0xf7, 0x19, 0xf7, 0x20, 0x2f,
+                                                    0xe7, 0xfb, 0x25, 0xfb, 0x1b, 0x23, 0x33, 0xfb,
+                                                    0x24, 0x1e, 0xc5, 0x8a, 0x15, 0xe9, 0xc9, 0xdd,
+                                                    0xf7, 0xb, 0xf7, 0xe, 0xc2, 0x38, 0x2e, 0x39,
+                                                    0x4b, 0x2f, 0xfb, 0x8, 0xfb, 0xa, 0x4f, 0xe7,
+                                                    0xdd, 0x1e, 0xe, 0x15, 0xf8, 0x36, 0x6, 0xf7,
+                                                    0x14, 0x45, 0xf7, 0xe, 0xfb, 0x3b, 0xfb, 0x1c,
+                                                    0x24, 0x24, 0xfb, 0x1f, 0xfb, 0xc, 0xd1, 0x25,
+                                                    0xf7, 0x47, 0xdd, 0xe0, 0xa6, 0xb0, 0xcd, 0x1e,
+                                                    0x7a, 0xc0, 0x5, 0x5f, 0x3b, 0x3c, 0x79, 0x5b,
+                                                    0x1b, 0x2a, 0x24, 0xb8, 0xf7, 0x6, 0x1f, 0x8d,
+                                                    0xc3, 0x15, 0xc7, 0x93, 0xc2, 0xd9, 0xf7, 0x8,
+                                                    0x1b, 0xf7, 0x19, 0xa9, 0x2e, 0x5e, 0x96, 0x1f,
+                                                    0xe, 0x26, 0xa, 0x13, 0x7c, 0x29, 0xa, 0x13,
+                                                    0xbc, 0x2a, 0xa, 0x25, 0xa, 0x3c, 0xa, 0xb,
+                                                    0x2d, 0xa, 0x27, 0xa, 0xb, 0x28, 0xa, 0x3d,
+                                                    0xa, 0x1f, 0xb, 0xf7, 0x60, 0xc1, 0x57, 0x6,
+                                                    0xfb, 0x60, 0xf8, 0x93, 0x5, 0xfb, 0x82, 0x55,
+                                                    0xf7, 0x20, 0x6, 0xfb, 0x48, 0xfc, 0x5d, 0x5,
+                                                    0x4f, 0x6, 0xf7, 0x4e, 0xf7, 0x45, 0x15, 0xb,
+                                                    0x15, 0x9a, 0xab, 0xe0, 0xa7, 0xd1, 0x1b, 0xd7,
+                                                    0xc3, 0x8b, 0x21, 0x1f, 0x6b, 0x7, 0x92, 0x5e,
+                                                    0x59, 0x92, 0x59, 0x1b, 0xfb, 0x3c, 0x55, 0x33,
+                                                    0x50, 0xb, 0x36, 0xf7, 0x1e, 0xc3, 0x38, 0xf7,
+                                                    0x88, 0x7, 0xeb, 0x59, 0xc3, 0xfb, 0x14, 0x45,
+                                                    0x3a, 0x77, 0x73, 0x4f, 0x1e, 0xf7, 0xe1, 0xfb,
+                                                    0x94, 0x15, 0xb, 0x4e, 0x58, 0x46, 0x5c, 0x38,
+                                                    0x1b, 0x4c, 0x60, 0xb4, 0xb2, 0xe1, 0xf7, 0x6,
+                                                    0x91, 0xcb, 0xb8, 0xb6, 0x85, 0x83, 0xb6, 0x1f,
+                                                    0xe, 0x38, 0xa, 0x13, 0x78, 0x3b, 0xa, 0x13,
+                                                    0xb8, 0x33, 0xa, 0x26, 0xa, 0x13, 0x7f, 0x29,
+                                                    0xa, 0x13, 0xbf, 0x2a, 0xa, 0xf7, 0x63, 0xc1,
+                                                    0x32, 0x6, 0xb9, 0xf7, 0xf, 0x5, 0xf7, 0xa6,
+                                                    0x6, 0xba, 0xfb, 0xf, 0x5, 0x2c, 0x55, 0xb,
+                                                    0xf7, 0x38, 0x39, 0xc4, 0xf7, 0x6f, 0x52, 0x38,
+                                                    0xfb, 0x38, 0xf7, 0x5e, 0xf7, 0xc2, 0xfb, 0x1b,
+                                                    0xc4, 0xf7, 0x51, 0xfc, 0x85, 0x55, 0xde, 0xfc,
+                                                    0x5d, 0x38, 0x6, 0xb, 0x40, 0xa, 0x2e, 0xa,
+                                                    0xb, 0xf7, 0x19, 0x31, 0xa, 0xb7, 0xf7, 0x14,
+                                                    0x4f, 0xa, 0xb, 0xf7, 0x11, 0xd9, 0xd6, 0xf7,
+                                                    0x27, 0x1e, 0xf7, 0xc4, 0xd8, 0xc2, 0xfb, 0x7c,
+                                                    0x54, 0xf2, 0xfb, 0xc3, 0x7, 0xfb, 0xe, 0x42,
+                                                    0x5d, 0x3c, 0x31, 0x4b, 0xb, 0xf8, 0x2c, 0xc1,
+                                                    0xfb, 0x43, 0xf8, 0x5c, 0x42, 0xa, 0xfc, 0x5c,
+                                                    0xfb, 0x43, 0x6, 0xb, 0x58, 0x63, 0x57, 0x54,
+                                                    0x4b, 0x1b, 0x42, 0x63, 0xb6, 0xd5, 0x1f, 0xf7,
+                                                    0xac, 0xfb, 0x1c, 0x7, 0xe, 0x15, 0xda, 0xfb,
+                                                    0xc1, 0x6, 0xfb, 0x1a, 0xd5, 0x30, 0x30, 0xa,
+                                                    0xb, 0xf8, 0x2e, 0xc2, 0xfb, 0x43, 0xf8, 0x12,
+                                                    0xfb, 0x5c, 0x54, 0xf7, 0x24, 0xfb, 0xdb, 0xfb,
+                                                    0x47, 0x6, 0xb, 0xf7, 0xc8, 0xc1, 0xfb, 0x11,
+                                                    0xf7, 0x43, 0x6, 0xf7, 0x45, 0xf7, 0xae, 0x5,
+                                                    0xd0, 0xc1, 0xfb, 0x5c, 0x55, 0xd1, 0x6, 0xfb,
+                                                    0x25, 0xfb, 0x78, 0xfb, 0x27, 0xf7, 0x78, 0x5,
+                                                    0xd2, 0xc1, 0xfb, 0x5d, 0x55, 0xcf, 0x6, 0xf7,
+                                                    0x49, 0xfb, 0xae, 0x5, 0xfb, 0x43, 0xfb, 0x12,
+                                                    0x7, 0xb, 0x15, 0xdd, 0x6, 0xf7, 0x2a, 0xf7,
+                                                    0x34, 0x60, 0x9d, 0xfb, 0x27, 0xfb, 0xd, 0xfb,
+                                                    0x2c, 0xf7, 0xd, 0x62, 0x78, 0x5, 0xe, 0x15,
+                                                    0xde, 0xfb, 0x90, 0x6, 0x2e, 0xcf, 0x58, 0xe2,
+                                                    0xb3, 0xbe, 0x9b, 0xd5, 0xd7, 0x1e, 0xb, 0x27,
+                                                    0xa, 0x13, 0x40, 0x3c, 0xa, 0xb, 0x15, 0x48,
+                                                    0xbd, 0x51, 0xd9, 0xd4, 0xc1, 0xc4, 0xd0, 0xcc,
+                                                    0x62, 0xc6, 0x33, 0x3e, 0x5a, 0x4f, 0x4a, 0x1e,
+                                                    0xc3, 0x8a, 0x15, 0xb5, 0xa6, 0xa9, 0xb9, 0xb8,
+                                                    0xa6, 0x6a, 0x65, 0x68, 0x71, 0x68, 0x5d, 0x61,
+                                                    0x6c, 0xa5, 0xb6, 0x1e, 0xb, 0x3d, 0xf7, 0x1c,
+                                                    0xc2, 0x38, 0xf8, 0x14, 0xfb, 0x1c, 0x54, 0xde,
+                                                    0xfb, 0x80, 0x7, 0xb, 0xf7, 0x3, 0xf7, 0xbb,
+                                                    0xf7, 0xb, 0xfb, 0xbb, 0x5, 0xb, 0x49, 0xc5,
+                                                    0x44, 0xf4, 0xd9, 0xd2, 0xb7, 0xc0, 0xc3, 0xb,
+                                                    0x41, 0xa, 0x12, 0xba, 0xc5, 0xf7, 0xc9, 0xc3,
+                                                    0x13, 0xbc, 0xb, 0x7c, 0xc1, 0x61, 0x67, 0xa,
+                                                    0x12, 0xf7, 0x4, 0xc0, 0xf7, 0xa1, 0xc0, 0x13,
+                                                    0xb8, 0xb, 0xf8, 0x85, 0xf7, 0x51, 0x53, 0xfb,
+                                                    0x1b, 0xfb, 0xc3, 0xf7, 0x5d, 0xb, 0x7c, 0xc3,
+                                                    0x5f, 0xc3, 0xf7, 0x34, 0xc3, 0xf7, 0x10, 0xc3,
+                                                    0xb, 0xf7, 0x3e, 0xc1, 0xfc, 0x24, 0x55, 0xf7,
+                                                    0x40, 0xb, 0xd1, 0xee, 0xcf, 0xc8, 0x67, 0x5b,
+                                                    0xb7, 0x1f, 0x40, 0xc2, 0xf7, 0x6a, 0x54, 0x49,
+                                                    0x7, 0xae, 0x65, 0x4f, 0xaa, 0x40, 0x1b, 0xfb,
+                                                    0x37, 0xb, 0x3c, 0x1b, 0xfb, 0x2a, 0x3d, 0x22,
+                                                    0x32, 0x30, 0xd3, 0x28, 0xf7, 0x2f, 0xcc, 0xd5,
+                                                    0xa1, 0xba, 0xb3, 0x1f, 0xfb, 0x9, 0x7, 0x33,
+                                                    0x51, 0xb, 0x15, 0xc3, 0x6, 0xef, 0xf7, 0x7e,
+                                                    0x5, 0x31, 0x6, 0xe7, 0xfb, 0x7e, 0x15, 0xc6,
+                                                    0x6, 0xec, 0xf7, 0x7e, 0x5, 0x32, 0x6, 0xe,
+                                                    0x8b, 0xc2, 0xf8, 0x58, 0xc2, 0x1, 0xb, 0x4e,
+                                                    0xa, 0xf7, 0x78, 0x77, 0x1, 0x61, 0xa, 0x3,
+                                                    0xb, 0x15, 0xf7, 0x9f, 0xc0, 0x21, 0xf7, 0xd5,
+                                                    0xf5, 0xc0, 0x21, 0xcd, 0x6, 0xdb, 0xce, 0x9e,
+                                                    0xde, 0x74, 0x1e, 0x94, 0xbe, 0x5, 0xb, 0x15,
+                                                    0xf7, 0x27, 0xe9, 0xf7, 0x24, 0x2d, 0xb4, 0x9c,
+                                                    0xfb, 0x26, 0xf7, 0x19, 0x5, 0x3b, 0x6, 0xfb,
+                                                    0x27, 0xfb, 0x19, 0x5, 0xb, 0x92, 0x72, 0x71,
+                                                    0x8f, 0x74, 0x1b, 0x3c, 0x4e, 0x62, 0x30, 0x1f,
+                                                    0x43, 0x21, 0x56, 0xf5, 0xfb, 0xd5, 0x21, 0x7,
+                                                    0xe, 0x53, 0x8c, 0x15, 0x46, 0xc4, 0x52, 0xd0,
+                                                    0xd0, 0xc5, 0xc4, 0xd0, 0xd0, 0x51, 0xc5, 0x46,
+                                                    0x46, 0x52, 0x51, 0x46, 0x1e, 0xb, 0x15, 0x6d,
+                                                    0xa6, 0x6e, 0xb5, 0xab, 0xab, 0xa3, 0xad, 0xaa,
+                                                    0x72, 0xa9, 0x63, 0x65, 0x6d, 0x70, 0x6a, 0x1e,
+                                                    0xe, 0x8b, 0xc1, 0xf7, 0xf, 0xc1, 0xf7, 0xac,
+                                                    0xc1, 0xb, 0x8b, 0xc1, 0xf7, 0x5d, 0xc1, 0xf7,
+                                                    0x5e, 0xc1, 0xb, 0x1e, 0xf7, 0xbf, 0xf5, 0xc2,
+                                                    0xfb, 0x81, 0x7, 0xb, 0x5, 0x80, 0xbf, 0xe8,
+                                                    0x7a, 0xdd, 0x1b, 0xf7, 0xe, 0xd8, 0xc0, 0xf0,
+                                                    0x1f, 0xf8, 0x11, 0xc9, 0xbe, 0xfb, 0x7, 0xb,
+                                                    0x6e, 0xa2, 0x74, 0xa8, 0xa8, 0xa2, 0xa2, 0xa8,
+                                                    0xa8, 0x74, 0xa2, 0x6e, 0x6e, 0x74, 0x74, 0x6e,
+                                                    0x1e, 0xb, 0x64, 0xab, 0x75, 0xb2, 0xb2, 0xab,
+                                                    0xa1, 0xb2, 0xb2, 0x6b, 0xa1, 0x64, 0x64, 0x6b,
+                                                    0x75, 0x64, 0x1e, 0xb, 0xfb, 0x31, 0xf7, 0x60,
+                                                    0xd4, 0xd4, 0xa0, 0xa5, 0xca, 0x1f, 0xf7, 0x41,
+                                                    0xbd, 0xc2, 0xfb, 0x9f, 0x7, 0xb, 0x8e, 0xf7,
+                                                    0x63, 0xf7, 0x4b, 0xf7, 0x60, 0xb, 0x1, 0xeb,
+                                                    0xbf, 0xf7, 0xc6, 0xbf, 0x3, 0xb, 0x1, 0xc6,
+                                                    0xc5, 0xf7, 0xf7, 0xca, 0x3, 0xb, 0x1, 0xb6,
+                                                    0xc1, 0xf8, 0x28, 0xc3, 0x3, 0xb, 0x1, 0xc9,
+                                                    0xc5, 0xf7, 0xfa, 0xc7, 0x3, 0xb, 0x15, 0xe0,
+                                                    0xf7, 0x7, 0x36, 0x6, 0xfb, 0x2b, 0x60, 0xa,
+                                                    0xb, 0x5e, 0xa, 0x56, 0xa, 0xb, 0x55, 0xa,
+                                                    0x9c, 0xf8, 0x90, 0x15, 0xda, 0xfb, 0xc1, 0x6,
+                                                    0xb, 0xf7, 0x7e, 0x5, 0x2f, 0x6, 0xe, 0x6,
+                                                    0xf7, 0x30, 0xf7, 0xf, 0x6f, 0xb0, 0xfb, 0x79,
+                                                    0xfb, 0x4d, 0x5, 0xe, 0x7c, 0x82, 0xa, 0xf7,
+                                                    0x1e, 0xc3, 0xb, 0xf7, 0x7e, 0x1, 0xf7, 0x6e,
+                                                    0xf7, 0x37, 0x3, 0xb, 0xfb, 0x7, 0x15, 0xe2,
+                                                    0xf7, 0x7, 0x34, 0x6, 0xb, 0xf7, 0x1a, 0xc2,
+                                                    0xf7, 0x38, 0xc4, 0xdd, 0xc3, 0xb, 0x15, 0xde,
+                                                    0xf7, 0x9, 0x38, 0x6, 0xb, 0x7c, 0xc3, 0xf7,
+                                                    0xf2, 0xc4, 0xb, 0x79, 0xc0, 0xf8, 0x7c, 0xc0,
+                                                    0xb, 0x15, 0xb2, 0xab, 0xab, 0xb2, 0xb2, 0xab,
+                                                    0x6b, 0x64, 0x64, 0x6b, 0x6b, 0x64, 0xb, 0xfb,
+                                                    0x31, 0xbe, 0xf7, 0x12, 0xbc, 0xf7, 0xc9, 0xbe,
+                                                    0x5c, 0xbf, 0x12, 0xb, 0xc2, 0xf7, 0xdd, 0xc2,
+                                                    0xb, 0x1, 0xf7, 0xa6, 0xb, 0x32, 0x58, 0x3a,
+                                                    0x3e, 0x50, 0x29, 0x27, 0x40, 0xc9, 0xd7, 0x1e,
+                                                    0xb, 0x12, 0x92, 0xf7, 0x58, 0xfb, 0x2a, 0xf7,
+                                                    0x9a, 0xe9, 0xf7, 0x4b, 0xb, 0x79, 0xc2, 0xf8,
+                                                    0x6b, 0xc2, 0xb, 0x8b, 0xc1, 0xf8, 0x5c, 0xc1,
+                                                    0xb, 0xf7, 0x7e, 0x1, 0xf7, 0x23, 0xf7, 0xce,
+                                                    0x3, 0xf7, 0x23, 0xb, 0xf8, 0x85, 0xf7, 0x43,
+                                                    0x1, 0xf7, 0x4e, 0xf7, 0x77, 0x3, 0xb, 0x8b,
+                                                    0xc2, 0xf7, 0xdb, 0xc2, 0x68, 0xa, 0xc3, 0x3,
+                                                    0xb, 0xf7, 0x7, 0x15, 0xa7, 0xb8, 0xfb, 0x2e,
+                                                    0xf7, 0x4, 0x5, 0xb, 0x15, 0xa7, 0x73, 0xf7,
+                                                    0x3e, 0xf7, 0x10, 0x5f, 0xbe, 0x5, 0xb, 0x15,
+                                                    0xdc, 0xf7, 0x9, 0x3a, 0x6, 0xb, 0xc2, 0x3,
+                                                    0xea, 0x16, 0xf8, 0x2e, 0xb, 0x8b, 0xc1, 0xf7,
+                                                    0xd2, 0xc1, 0x1, 0xb, 0x8b, 0xc1, 0xf8, 0x5a,
+                                                    0xc1, 0x1, 0xb, 0x15, 0xe5, 0xf7, 0x8, 0x31,
+                                                    0x6, 0xb, 0x15, 0xb7, 0x6, 0x9d, 0xf7, 0x8f,
+                                                    0x5, 0x3a, 0x6, 0xb, 0xf7, 0x4d, 0x6f, 0x66,
+                                                    0xf7, 0x30, 0xfb, 0xf, 0x5, 0xb, 0x15, 0xf7,
+                                                    0xac, 0x26, 0x96, 0xa9, 0xfb, 0x96, 0xb, 0x1,
+                                                    0xf7, 0x79, 0xf7, 0x22, 0x3, 0xf7, 0x79, 0xb,
+                                                    0xd1, 0xf8, 0xc, 0x1, 0xe7, 0xf8, 0x34, 0x3,
+                                                    0xb, 0xf7, 0x5e, 0x15, 0xf7, 0x36, 0xfb, 0x17,
+                                                    0x6, 0xb, 0xf7, 0xa4, 0xbe, 0x1, 0x73, 0xf9,
+                                                    0x1c, 0x3, 0xb, 0xf8, 0xa9, 0x15, 0xd4, 0xf7,
+                                                    0x10, 0x42, 0x6, 0xb, 0xf7, 0xf, 0x1e, 0xf0,
+                                                    0x54, 0x7, 0xe, 0x6, 0xfb, 0x2e, 0xfb, 0x4,
+                                                    0xb, 0x1, 0xf7, 0xa5, 0xc4, 0x3, 0xb, 0xc2,
+                                                    0xf7, 0x33, 0xc3, 0xb
+                                                   };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c b/core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c
new file mode 100644
index 0000000..eb4fb8f
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c
@@ -0,0 +1,2265 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitFixedBoldFontData [18055] = {0x1,
+                                                        0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x13,
+                                                        0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,
+                                                        0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,
+                                                        0x6c, 0x64, 0x0, 0x1, 0x1, 0x1, 0x24, 0xf8,
+                                                        0x10, 0x0, 0xf8, 0x2a, 0x1, 0xf8, 0x2b, 0x2,
+                                                        0xf8, 0x2c, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x5,
+                                                        0xfb, 0x8d, 0xf9, 0x5d, 0xf9, 0xbf, 0x5, 0xf7,
+                                                        0xa0, 0xf, 0xf9, 0x6, 0x11, 0xae, 0x1c, 0x40,
+                                                        0xc8, 0x12, 0x0, 0x12, 0x1, 0x1, 0x5, 0x7,
+                                                        0x9, 0x11, 0x19, 0x1f, 0x25, 0x29, 0x2d, 0x39,
+                                                        0x42, 0x49, 0x53, 0x5c, 0x65, 0x8f, 0xa3, 0xb2,
+                                                        0x49, 0x64, 0x6f, 0x74, 0x49, 0x4a, 0x69, 0x6a,
+                                                        0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61,
+                                                        0x73, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61,
+                                                        0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x67, 0x63,
+                                                        0x61, 0x72, 0x6f, 0x6e, 0x6c, 0x69, 0x72, 0x61,
+                                                        0x45, 0x75, 0x72, 0x6f, 0x70, 0x72, 0x65, 0x73,
+                                                        0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+                                                        0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66,
+                                                        0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70,
+                                                        0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, 0x67,
+                                                        0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64,
+                                                        0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77,
+                                                        0x62, 0x6f, 0x74, 0x68, 0x20, 0x20, 0x20, 0x20,
+                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68,
+                                                        0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78, 0x65,
+                                                        0x64, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f,
+                                                        0x6c, 0x64, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20,
+                                                        0x46, 0x69, 0x78, 0x65, 0x64, 0x20, 0x4f, 0x54,
+                                                        0x46, 0x0, 0x0, 0x1, 0x0, 0x1, 0x6, 0x0,
+                                                        0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0,
+                                                        0x0, 0x42, 0x20, 0x0, 0x67, 0x0, 0x0, 0x64,
+                                                        0x0, 0x0, 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0,
+                                                        0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0,
+                                                        0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, 0xa5,
+                                                        0x0, 0x0, 0x80, 0x0, 0x0, 0xa1, 0x0, 0x0,
+                                                        0x9c, 0x0, 0x0, 0xa4, 0x0, 0x0, 0xa9, 0x0,
+                                                        0x0, 0x7d, 0x0, 0x0, 0x98, 0x0, 0x0, 0x73,
+                                                        0x0, 0x0, 0x72, 0x0, 0x0, 0x85, 0x0, 0x0,
+                                                        0x96, 0x0, 0x0, 0x8f, 0x0, 0x0, 0x78, 0x0,
+                                                        0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0, 0x0, 0xa3,
+                                                        0x0, 0x0, 0x7b, 0x0, 0x0, 0xae, 0x0, 0x0,
+                                                        0xab, 0x1, 0x0, 0xb0, 0x0, 0x0, 0xad, 0x0,
+                                                        0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0, 0x0, 0xb1,
+                                                        0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0,
+                                                        0xb9, 0x0, 0x0, 0xb6, 0x2, 0x0, 0x9a, 0x0,
+                                                        0x0, 0xba, 0x0, 0x0, 0xbe, 0x0, 0x0, 0xbb,
+                                                        0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0,
+                                                        0xa8, 0x0, 0x0, 0x8d, 0x0, 0x0, 0xc4, 0x0,
+                                                        0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0, 0x0, 0x9d,
+                                                        0x0, 0x0, 0x95, 0x0, 0x0, 0xcb, 0x0, 0x0,
+                                                        0xc8, 0x1, 0x0, 0xcd, 0x0, 0x0, 0xca, 0x0,
+                                                        0x0, 0xcc, 0x0, 0x0, 0x90, 0x0, 0x0, 0xce,
+                                                        0x0, 0x0, 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0,
+                                                        0xd6, 0x0, 0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0,
+                                                        0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8,
+                                                        0x1, 0x0, 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0,
+                                                        0x9f, 0x0, 0x0, 0x93, 0x0, 0x0, 0xe1, 0x0,
+                                                        0x0, 0xde, 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2,
+                                                        0x0, 0x0, 0xe3, 0x0, 0x1, 0x87, 0x0, 0x0,
+                                                        0x91, 0x0, 0x1, 0x88, 0x1, 0x0, 0x8c, 0x0,
+                                                        0x0, 0x92, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x94,
+                                                        0x0, 0x1, 0x8a, 0x1, 0x0, 0xc0, 0x0, 0x0,
+                                                        0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0, 0xe4, 0x0,
+                                                        0x0, 0x65, 0x0, 0x1, 0x8c, 0x1, 0x0, 0x7e,
+                                                        0x0, 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0,
+                                                        0x84, 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0,
+                                                        0x0, 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89,
+                                                        0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0,
+                                                        0x75, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0,
+                                                        0x0, 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74,
+                                                        0x0, 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0,
+                                                        0x63, 0x0, 0x1, 0x8e, 0x2, 0x0, 0x99, 0x0,
+                                                        0x1, 0x91, 0x4, 0x0, 0xa6, 0x0, 0x0, 0x6d,
+                                                        0x1, 0x0, 0xf4, 0x2, 0x0, 0x1, 0x0, 0x2,
+                                                        0x0, 0x3, 0x0, 0x34, 0x0, 0x60, 0x0, 0xc1,
+                                                        0x1, 0x42, 0x1, 0xcc, 0x2, 0x52, 0x2, 0x68,
+                                                        0x2, 0x9d, 0x2, 0xd2, 0x3, 0x2, 0x3, 0x26,
+                                                        0x3, 0x39, 0x3, 0x4e, 0x3, 0x67, 0x3, 0x7e,
+                                                        0x3, 0xc4, 0x3, 0xe8, 0x4, 0x2f, 0x4, 0x8e,
+                                                        0x4, 0xc1, 0x5, 0xf, 0x5, 0x77, 0x5, 0x96,
+                                                        0x6, 0xc, 0x6, 0x73, 0x6, 0x86, 0x6, 0xa9,
+                                                        0x6, 0xc6, 0x6, 0xe4, 0x7, 0x1, 0x7, 0x5f,
+                                                        0x7, 0xff, 0x8, 0x3d, 0x8, 0xa0, 0x8, 0xee,
+                                                        0x9, 0x22, 0x9, 0x69, 0x9, 0xb0, 0x9, 0xd8,
+                                                        0xa, 0x12, 0xa, 0x26, 0xa, 0x57, 0xa, 0x94,
+                                                        0xa, 0xb6, 0xa, 0xf8, 0xb, 0x2d, 0xb, 0x76,
+                                                        0xb, 0xb7, 0xc, 0x32, 0xc, 0x86, 0xc, 0xfa,
+                                                        0xd, 0x26, 0xd, 0x64, 0xd, 0x94, 0xd, 0xcc,
+                                                        0xe, 0xf, 0xe, 0x45, 0xe, 0x6f, 0xe, 0x8b,
+                                                        0xe, 0x9f, 0xe, 0xbb, 0xe, 0xea, 0xe, 0xf6,
+                                                        0xf, 0xc, 0xf, 0x73, 0xf, 0xd4, 0x10, 0x1d,
+                                                        0x10, 0x7c, 0x10, 0xc8, 0x11, 0x6, 0x11, 0x43,
+                                                        0x11, 0x90, 0x11, 0xc3, 0x12, 0x7, 0x12, 0x43,
+                                                        0x12, 0x56, 0x12, 0xb6, 0x12, 0xfd, 0x13, 0x39,
+                                                        0x13, 0x97, 0x13, 0xdd, 0x14, 0x1d, 0x14, 0x95,
+                                                        0x14, 0xd4, 0x15, 0x29, 0x15, 0x51, 0x15, 0x91,
+                                                        0x15, 0xd0, 0x16, 0x7, 0x16, 0x3f, 0x16, 0xa5,
+                                                        0x16, 0xb5, 0x17, 0x1b, 0x17, 0x62, 0x17, 0x94,
+                                                        0x17, 0xe6, 0x18, 0x64, 0x18, 0xd4, 0x19, 0x29,
+                                                        0x19, 0x41, 0x19, 0xe1, 0x1a, 0x7, 0x1a, 0x90,
+                                                        0x1a, 0xf6, 0x1b, 0x29, 0x1b, 0x44, 0x1b, 0xd1,
+                                                        0x1b, 0xe4, 0x1c, 0x1e, 0x1c, 0x4b, 0x1c, 0x95,
+                                                        0x1c, 0xfe, 0x1d, 0x14, 0x1d, 0x76, 0x1d, 0xa3,
+                                                        0x1d, 0xbf, 0x1d, 0xf9, 0x1e, 0x25, 0x1e, 0x5f,
+                                                        0x1e, 0x93, 0x1e, 0xf6, 0x1f, 0x64, 0x1f, 0xff,
+                                                        0x20, 0x60, 0x20, 0x81, 0x20, 0xa0, 0x20, 0xca,
+                                                        0x21, 0x23, 0x21, 0x4c, 0x21, 0x8d, 0x21, 0xf8,
+                                                        0x22, 0x7b, 0x22, 0x8e, 0x22, 0xc1, 0x22, 0xf5,
+                                                        0x23, 0x31, 0x23, 0x49, 0x23, 0x68, 0x23, 0x93,
+                                                        0x23, 0xc1, 0x24, 0xc, 0x24, 0x7f, 0x24, 0xa0,
+                                                        0x24, 0xba, 0x24, 0xdf, 0x25, 0x33, 0x25, 0x5a,
+                                                        0x25, 0x89, 0x26, 0x6, 0x26, 0x1e, 0x26, 0x35,
+                                                        0x26, 0x5d, 0x26, 0x92, 0x26, 0xdd, 0x27, 0x26,
+                                                        0x27, 0xb4, 0x27, 0xd5, 0x27, 0xf6, 0x28, 0x26,
+                                                        0x28, 0x8b, 0x28, 0xcc, 0x29, 0x8, 0x29, 0xb0,
+                                                        0x2a, 0x2c, 0x2a, 0x46, 0x2a, 0x5f, 0x2a, 0x83,
+                                                        0x2a, 0xa2, 0x2a, 0xb8, 0x2a, 0xcd, 0x2a, 0xf5,
+                                                        0x2b, 0x3a, 0x2b, 0xab, 0x2c, 0x35, 0x2c, 0x54,
+                                                        0x2c, 0x70, 0x2c, 0x95, 0x2c, 0xe7, 0x2d, 0xa,
+                                                        0x2d, 0x29, 0x2d, 0xbd, 0x2d, 0xd4, 0x2d, 0xea,
+                                                        0x2e, 0xe, 0x2e, 0x5a, 0x2e, 0x86, 0x2e, 0xe6,
+                                                        0x2f, 0x21, 0x2f, 0x4b, 0x2f, 0x5c, 0x2f, 0xa1,
+                                                        0x30, 0x14, 0x30, 0x4e, 0x30, 0x7b, 0x30, 0xe8,
+                                                        0x31, 0x65, 0x32, 0x14, 0x32, 0xc5, 0x33, 0x60,
+                                                        0x33, 0xf4, 0x34, 0x57, 0x34, 0xa2, 0x34, 0xf2,
+                                                        0x35, 0x4f, 0x35, 0x9b, 0x35, 0xeb, 0x36, 0xe,
+                                                        0x36, 0x1b, 0x36, 0x4a, 0x36, 0x61, 0x36, 0x96,
+                                                        0x36, 0xca, 0x37, 0x9, 0x37, 0x31, 0x37, 0x44,
+                                                        0x37, 0x57, 0x37, 0x6e, 0x37, 0x80, 0x37, 0x94,
+                                                        0x37, 0xa2, 0x37, 0xb7, 0x37, 0xce, 0x37, 0xee,
+                                                        0x38, 0x22, 0x38, 0x43, 0x38, 0x90, 0x39, 0x34,
+                                                        0x39, 0x4d, 0x39, 0x6b, 0x39, 0x82, 0x3a, 0x8,
+                                                        0x3a, 0x89, 0x3a, 0xf0, 0x3b, 0x34, 0x3b, 0x41,
+                                                        0x3b, 0x63, 0x3b, 0x71, 0x3b, 0x94, 0x3b, 0xa8,
+                                                        0x3b, 0xb4, 0x3c, 0x11, 0x3c, 0x6a, 0xe, 0xe,
+                                                        0x7c, 0xf7, 0x31, 0xf8, 0x44, 0x77, 0x1, 0xf7,
+                                                        0x7e, 0xf7, 0x17, 0x3, 0xf7, 0x89, 0xf7, 0x4b,
+                                                        0x15, 0xf7, 0x2, 0x6, 0x9f, 0xf8, 0x19, 0x5,
+                                                        0xfb, 0x2b, 0x6, 0x75, 0xfc, 0x90, 0x15, 0x5f,
+                                                        0xb7, 0x68, 0xc1, 0xc1, 0xb7, 0xae, 0xb7, 0xb7,
+                                                        0x5f, 0xad, 0x55, 0x55, 0x5f, 0x69, 0x5f, 0x1e,
+                                                        0xe, 0xf7, 0xb8, 0x76, 0xf7, 0xb7, 0x77, 0x1,
+                                                        0xf7, 0x28, 0xf7, 0x6, 0xd6, 0xf7, 0x5, 0x3,
+                                                        0xf7, 0xe5, 0xf7, 0xa9, 0x15, 0xf7, 0x5, 0x6,
+                                                        0x9a, 0x59, 0xa, 0xfb, 0x22, 0x6, 0xfb, 0x43,
+                                                        0xfb, 0xb1, 0x15, 0xf7, 0x6, 0x6, 0x9b, 0x59,
+                                                        0xa, 0xfb, 0x23, 0x6, 0xe, 0x5e, 0x76, 0xf7,
+                                                        0x75, 0xe6, 0xf3, 0xe6, 0xf7, 0x54, 0x77, 0x1,
+                                                        0xf7, 0x24, 0xe3, 0xf3, 0xe7, 0x3, 0xf7, 0x1d,
+                                                        0x5e, 0x15, 0xe4, 0x6, 0x98, 0xf7, 0x60, 0x5,
+                                                        0xf4, 0x6, 0x7c, 0xfb, 0x60, 0x5, 0xe8, 0x6,
+                                                        0x98, 0xf7, 0x60, 0x5, 0xf7, 0x1, 0xe6, 0x24,
+                                                        0x6, 0x91, 0xf3, 0x5, 0xec, 0xe6, 0x30, 0x6,
+                                                        0x92, 0xf7, 0x62, 0x5, 0x31, 0x6, 0x83, 0xfb,
+                                                        0x62, 0x5, 0x24, 0x6, 0x92, 0xf7, 0x62, 0x5,
+                                                        0x32, 0x6, 0x82, 0xfb, 0x62, 0x5, 0xfb, 0x4,
+                                                        0x30, 0xf6, 0x6, 0x84, 0x23, 0x5, 0x27, 0x30,
+                                                        0xea, 0x6, 0xe9, 0xe6, 0x15, 0x93, 0xf3, 0x5,
+                                                        0xf1, 0x6, 0x85, 0x23, 0x5, 0xe, 0x22, 0x76,
+                                                        0xf7, 0x13, 0xf7, 0x54, 0xf7, 0x56, 0xf7, 0x53,
+                                                        0x20, 0xf7, 0x57, 0x12, 0xe0, 0xef, 0xcb, 0xef,
+                                                        0xbf, 0xee, 0x3a, 0xee, 0x13, 0xdd, 0xdc, 0x8c,
+                                                        0x15, 0xef, 0xa9, 0x6, 0x84, 0x9f, 0xa6, 0x86,
+                                                        0xa0, 0x1b, 0xfb, 0x25, 0xef, 0xf7, 0x24, 0x7,
+                                                        0xb1, 0x92, 0xf7, 0x17, 0xa1, 0xf7, 0x13, 0x1a,
+                                                        0xf3, 0x37, 0x9e, 0x20, 0xa7, 0x1e, 0x62, 0x97,
+                                                        0x26, 0x9d, 0xc1, 0x1a, 0xc0, 0xd9, 0x94, 0xaa,
+                                                        0x1e, 0x13, 0xee, 0xb0, 0xb0, 0x81, 0x7c, 0xac,
+                                                        0x1f, 0x50, 0xee, 0xf7, 0x53, 0x28, 0x6c, 0x7,
+                                                        0x7b, 0x93, 0x7a, 0x91, 0x78, 0x8e, 0x8, 0x13,
+                                                        0xdd, 0xf1, 0x27, 0x26, 0x7, 0x46, 0x82, 0x2c,
+                                                        0x67, 0xfb, 0x7, 0x1a, 0x21, 0xde, 0x76, 0xf7,
+                                                        0xe, 0x69, 0x1e, 0xb6, 0x80, 0xe1, 0x83, 0x56,
+                                                        0x1a, 0x55, 0x25, 0x87, 0x6f, 0x66, 0x67, 0x91,
+                                                        0x9a, 0x68, 0x1e, 0xc5, 0x27, 0x7, 0xe, 0x91,
+                                                        0x76, 0xf7, 0x5f, 0xd1, 0xdd, 0xd0, 0xf7, 0x1c,
+                                                        0xd2, 0x12, 0xc7, 0xd2, 0xf7, 0x9, 0xd2, 0x64,
+                                                        0xd1, 0xf7, 0xa, 0xd2, 0x13, 0xfb, 0xc7, 0xf8,
+                                                        0x71, 0x15, 0x42, 0xc3, 0x4c, 0xe3, 0x8a, 0x1e,
+                                                        0xdb, 0xcd, 0xc5, 0xdb, 0xd1, 0x52, 0xcf, 0x34,
+                                                        0x36, 0x4e, 0x48, 0x43, 0x1f, 0xd2, 0x8c, 0x15,
+                                                        0xae, 0xa5, 0xab, 0xba, 0x1e, 0x13, 0xeb, 0xba,
+                                                        0xa8, 0x6c, 0x67, 0x5d, 0x64, 0x74, 0x65, 0x5e,
+                                                        0x70, 0xac, 0xaf, 0x1f, 0x13, 0xfd, 0xf7, 0x9,
+                                                        0xfb, 0xf7, 0x15, 0x43, 0xc5, 0x4a, 0xe3, 0x8a,
+                                                        0x1e, 0x13, 0x45, 0xda, 0xcd, 0xc5, 0xdc, 0xd2,
+                                                        0x52, 0xce, 0x35, 0x36, 0x4c, 0x49, 0x42, 0x1f,
+                                                        0xd2, 0x8c, 0x15, 0xad, 0xa6, 0xad, 0xbb, 0x1e,
+                                                        0x13, 0x5, 0xb9, 0xa7, 0x6a, 0x68, 0x5c, 0x66,
+                                                        0x76, 0x65, 0x5d, 0x6f, 0xab, 0xaf, 0x1f, 0xfb,
+                                                        0x6b, 0xb3, 0x15, 0x13, 0x0, 0xf8, 0x46, 0xf7,
+                                                        0x63, 0x6f, 0xcf, 0xfc, 0x47, 0xfb, 0x6a, 0x5,
+                                                        0xe, 0x7c, 0xe7, 0x3b, 0xe8, 0xf7, 0xa, 0xe8,
+                                                        0xf7, 0x28, 0xe9, 0x12, 0xb8, 0xec, 0x68, 0xec,
+                                                        0x13, 0xb8, 0xf7, 0x2f, 0xf7, 0xc4, 0x15, 0x4d,
+                                                        0x6d, 0x5b, 0x4f, 0x45, 0x1a, 0x46, 0xbd, 0x31,
+                                                        0xf7, 0xb, 0xdb, 0xad, 0xad, 0x9d, 0xa3, 0x1e,
+                                                        0x13, 0x74, 0xb3, 0x63, 0x5, 0xf7, 0x37, 0xe8,
+                                                        0xfb, 0xc, 0x6, 0x6f, 0xa4, 0x9f, 0xa8, 0x97,
+                                                        0xac, 0x98, 0xaa, 0x19, 0xde, 0xe8, 0xfb, 0x27,
+                                                        0x6, 0x86, 0x73, 0x77, 0x52, 0x7c, 0x71, 0x30,
+                                                        0xf7, 0xd, 0x18, 0x7c, 0x9f, 0x65, 0xbd, 0xa2,
+                                                        0x1a, 0xaa, 0xa8, 0x95, 0xae, 0xb5, 0xbe, 0x73,
+                                                        0x79, 0x98, 0x1e, 0xc2, 0xd0, 0x5, 0xb3, 0x66,
+                                                        0x4b, 0xa6, 0x4f, 0x1b, 0x38, 0x3d, 0x63, 0x2e,
+                                                        0x5a, 0xb2, 0x64, 0x93, 0x7b, 0x1f, 0xbe, 0x43,
+                                                        0x15, 0xe7, 0x6a, 0xa, 0x13, 0xb8, 0x74, 0x77,
+                                                        0x6d, 0x7d, 0x6c, 0x1b, 0x54, 0x78, 0xb5, 0xa9,
+                                                        0xb8, 0xb1, 0xa4, 0xa4, 0x9a, 0x1f, 0xe, 0x4c,
+                                                        0xa, 0xf7, 0x7d, 0xf7, 0x19, 0x3, 0xf7, 0x84,
+                                                        0xf7, 0xa9, 0x15, 0xf7, 0xb, 0x6, 0x99, 0x59,
+                                                        0xa, 0xfb, 0x26, 0x6, 0xe, 0x3a, 0x76, 0xf9,
+                                                        0x62, 0x77, 0x1, 0xf7, 0x47, 0xf7, 0x1, 0x3,
+                                                        0xf7, 0xd3, 0x25, 0x15, 0xf1, 0x6, 0x53, 0xe2,
+                                                        0x3e, 0xf7, 0xf, 0xf7, 0x52, 0x1a, 0xf7, 0x2b,
+                                                        0xc4, 0xc0, 0xd7, 0xf7, 0x6, 0x1e, 0x29, 0x6,
+                                                        0x32, 0x27, 0x54, 0x27, 0xfb, 0xb, 0x1a, 0xfb,
+                                                        0x17, 0xa0, 0xfb, 0x0, 0xf7, 0xb, 0xfb, 0x34,
+                                                        0x1e, 0xe, 0x3a, 0x76, 0xf9, 0x62, 0x77, 0x1,
+                                                        0xf7, 0xcc, 0xf7, 0x1, 0x3, 0xf7, 0x47, 0x25,
+                                                        0x15, 0xf1, 0x6, 0xf7, 0xb, 0xf7, 0x34, 0xa0,
+                                                        0xf7, 0x0, 0xf7, 0x17, 0x1a, 0xf7, 0xb, 0x54,
+                                                        0xef, 0x32, 0xef, 0x1e, 0x29, 0x6, 0xd7, 0xfb,
+                                                        0x6, 0xc4, 0x56, 0xfb, 0x2b, 0x1a, 0xfb, 0x52,
+                                                        0x3e, 0xfb, 0xf, 0x53, 0x34, 0x1e, 0xe, 0xf7,
+                                                        0x8e, 0xf1, 0x3, 0xf7, 0x22, 0xf7, 0xac, 0x15,
+                                                        0xdf, 0x4e, 0xd6, 0xf7, 0xc, 0xd6, 0xfb, 0xb,
+                                                        0xdf, 0xc8, 0x33, 0xf2, 0xf7, 0x1d, 0xad, 0x69,
+                                                        0xed, 0xfb, 0x14, 0x59, 0x95, 0xf7, 0x1b, 0x5,
+                                                        0x6b, 0xa, 0x93, 0xfb, 0x19, 0xfb, 0x13, 0xbb,
+                                                        0x67, 0x28, 0xf7, 0x20, 0x6a, 0x5, 0xe, 0xc7,
+                                                        0x76, 0xf7, 0x41, 0xe9, 0xf7, 0x40, 0x67, 0xa,
+                                                        0xed, 0x3, 0xd2, 0xf7, 0x68, 0x15, 0xf7, 0x48,
+                                                        0xfb, 0x41, 0xed, 0xf7, 0x41, 0xf7, 0x48, 0xe9,
+                                                        0xfb, 0x48, 0xf7, 0x40, 0x29, 0xfb, 0x40, 0xfb,
+                                                        0x48, 0x6, 0xe, 0x31, 0x45, 0xa, 0xf7, 0x39,
+                                                        0xfb, 0x3, 0x15, 0xf7, 0x14, 0x6, 0xf7, 0x22,
+                                                        0x59, 0xa, 0xfb, 0x3d, 0x6, 0xe, 0xf7, 0x5f,
+                                                        0xf7, 0x2, 0x1, 0xef, 0xf8, 0x24, 0x3, 0xef,
+                                                        0xf7, 0x5f, 0x15, 0xf8, 0x24, 0xf7, 0x2, 0xfc,
+                                                        0x24, 0x6, 0xe, 0x7c, 0xf7, 0x4e, 0x6d, 0xa,
+                                                        0xd9, 0x15, 0x58, 0xbc, 0x61, 0xc6, 0xc6, 0xbc,
+                                                        0xb5, 0xbe, 0xbe, 0x5a, 0xb5, 0x50, 0x50, 0x5a,
+                                                        0x61, 0x58, 0x1e, 0xe, 0x53, 0x76, 0xf9, 0x53,
+                                                        0x77, 0x1, 0xed, 0xf8, 0x28, 0x3, 0xed, 0x5d,
+                                                        0x15, 0xd0, 0x6c, 0xf7, 0xe3, 0xf9, 0x34, 0x45,
+                                                        0xaa, 0x5, 0xe, 0x7c, 0xe8, 0xf8, 0x51, 0xe8,
+                                                        0x1, 0xe2, 0xed, 0xf7, 0x7c, 0xeb, 0x3, 0xe2,
+                                                        0xf7, 0xbe, 0x15, 0x42, 0x99, 0xfb, 0x84, 0xf7,
+                                                        0x5c, 0xf7, 0x60, 0x93, 0xf7, 0x84, 0xd5, 0xd4,
+                                                        0x78, 0xf7, 0x88, 0xfb, 0x53, 0xfb, 0x66, 0x85,
+                                                        0xfb, 0x86, 0x3f, 0x1e, 0xed, 0x8c, 0x15, 0xc6,
+                                                        0x8d, 0x90, 0xf7, 0x39, 0xf7, 0x1, 0x1b, 0xf7,
+                                                        0x3, 0x90, 0xfb, 0x3c, 0x50, 0x3b, 0x7c, 0xfb,
+                                                        0x1e, 0x28, 0x20, 0x80, 0xf7, 0x1f, 0xdd, 0x1f,
+                                                        0xe, 0x8b, 0xe8, 0xf8, 0x9f, 0x77, 0x1, 0xf7,
+                                                        0x91, 0xec, 0x3, 0xd2, 0x16, 0xf8, 0x5e, 0xe8,
+                                                        0xfb, 0x47, 0xf8, 0x9f, 0x6, 0xfb, 0x9e, 0x56,
+                                                        0x5, 0x30, 0x7, 0xf7, 0x3d, 0xad, 0x5, 0xfc,
+                                                        0x31, 0xfb, 0x4a, 0x7, 0xe, 0x8b, 0xea, 0x2c,
+                                                        0xf7, 0x34, 0xf7, 0xfe, 0xe9, 0x12, 0xf2, 0xed,
+                                                        0xf7, 0x6f, 0xee, 0x13, 0x78, 0xdc, 0x16, 0xf8,
+                                                        0x4a, 0xf7, 0x34, 0x2c, 0x6, 0x13, 0xb8, 0x4a,
+                                                        0xfb, 0x4c, 0x7, 0xf7, 0x1, 0xe8, 0xf7, 0x3e,
+                                                        0xf7, 0x17, 0xef, 0x1a, 0xef, 0x42, 0xec, 0xfb,
+                                                        0x1d, 0x39, 0x43, 0x69, 0x4d, 0x57, 0x1e, 0x34,
+                                                        0xed, 0x7, 0xdf, 0xe1, 0x90, 0xa6, 0xca, 0xb6,
+                                                        0x68, 0x48, 0x58, 0xfb, 0xb, 0x28, 0xfb, 0x70,
+                                                        0xfb, 0x45, 0x1e, 0xe, 0x7c, 0xe8, 0xf7, 0x50,
+                                                        0xe8, 0xf7, 0x37, 0xe9, 0x12, 0xf8, 0x1b, 0xf2,
+                                                        0x44, 0xeb, 0x13, 0xe8, 0xdc, 0xb3, 0x15, 0x79,
+                                                        0xbe, 0xcc, 0x66, 0xed, 0x1b, 0xdb, 0xf7, 0x24,
+                                                        0xb7, 0xf7, 0x23, 0xe1, 0x5e, 0xaa, 0x5b, 0xac,
+                                                        0x1f, 0x13, 0xf0, 0xba, 0xa1, 0xa1, 0xc4, 0xc1,
+                                                        0x1a, 0xf7, 0x6, 0x8a, 0x2a, 0xba, 0x23, 0x1b,
+                                                        0x40, 0x6a, 0x6f, 0x66, 0x4f, 0x1f, 0xad, 0x42,
+                                                        0x5, 0xb2, 0xd3, 0x9f, 0x90, 0xb6, 0x1b, 0xc8,
+                                                        0xb0, 0x77, 0x50, 0x3e, 0x33, 0x84, 0x4e, 0x1f,
+                                                        0x2e, 0x7, 0x13, 0xe8, 0xe6, 0xe4, 0x7f, 0x39,
+                                                        0x4d, 0x4f, 0x6b, 0x46, 0x57, 0x56, 0x9b, 0xaf,
+                                                        0x40, 0x1f, 0xe, 0x8b, 0xe9, 0xdf, 0xe9, 0xf7,
+                                                        0xec, 0x77, 0x1, 0xf7, 0xe3, 0xeb, 0x3, 0xd4,
+                                                        0xf7, 0x46, 0x15, 0xf7, 0x9a, 0x37, 0x23, 0x2d,
+                                                        0xf7, 0xbc, 0xe9, 0x2b, 0xdf, 0xe8, 0xe9, 0x2e,
+                                                        0xf7, 0xec, 0x24, 0x6, 0xfb, 0x93, 0xfb, 0xf9,
+                                                        0x5, 0xf7, 0x2, 0x98, 0x15, 0xf7, 0x2c, 0xf7,
+                                                        0x73, 0x5, 0xfb, 0x73, 0x7, 0xe, 0x7c, 0xe7,
+                                                        0xf7, 0x75, 0xe5, 0xf7, 0x8, 0xe8, 0x1, 0xf7,
+                                                        0x9, 0xeb, 0xf7, 0x6c, 0xeb, 0x3, 0xd5, 0xaf,
+                                                        0x15, 0x7b, 0xb1, 0xeb, 0x68, 0xe1, 0x1b, 0xf7,
+                                                        0x31, 0xd5, 0xee, 0xf6, 0xf7, 0x7, 0x3f, 0xe1,
+                                                        0xfb, 0xa, 0x67, 0x63, 0x89, 0x7e, 0x61, 0x1f,
+                                                        0xf7, 0x17, 0xf7, 0xb2, 0xe8, 0xfc, 0x12, 0xfb,
+                                                        0xaf, 0x7, 0xbc, 0x52, 0xb3, 0xa8, 0xbd, 0x98,
+                                                        0xb8, 0x8a, 0x19, 0xd0, 0x8a, 0xc6, 0x64, 0x41,
+                                                        0x1a, 0x4c, 0x5b, 0x5b, 0x36, 0x48, 0x4d, 0xa3,
+                                                        0xa1, 0x51, 0x1e, 0xe, 0x7c, 0xe4, 0xf7, 0x69,
+                                                        0xe9, 0xf7, 0x1c, 0xe6, 0x1, 0xdf, 0xf7, 0x2,
+                                                        0xf7, 0x6a, 0xec, 0x3, 0xf7, 0x51, 0xf7, 0xee,
+                                                        0x15, 0xf7, 0x19, 0xa5, 0xf7, 0x1, 0xb1, 0xf7,
+                                                        0xd, 0x1b, 0xa0, 0xa0, 0x8f, 0x87, 0xa0, 0x1f,
+                                                        0x92, 0xe9, 0x5, 0x8e, 0x73, 0x73, 0x85, 0x75,
+                                                        0x1b, 0xfb, 0xf, 0x31, 0x6c, 0x40, 0x46, 0x1f,
+                                                        0x5f, 0x59, 0x68, 0x32, 0x30, 0x1a, 0xfb, 0x21,
+                                                        0xce, 0xfb, 0x26, 0xf7, 0x30, 0xf6, 0xe6, 0xde,
+                                                        0xf7, 0x3, 0xf7, 0x12, 0x45, 0xd7, 0xfb, 0x16,
+                                                        0x56, 0x75, 0x7f, 0x74, 0x62, 0x1e, 0x90, 0xfb,
+                                                        0x17, 0x15, 0x8b, 0xa2, 0xd3, 0xdf, 0xdc, 0xa5,
+                                                        0x5a, 0x53, 0x48, 0x5e, 0x62, 0x51, 0x43, 0x64,
+                                                        0xd6, 0xcd, 0x1e, 0xe, 0xa0, 0x76, 0xf8, 0x90,
+                                                        0xe8, 0x1, 0xe5, 0xed, 0x3, 0xf7, 0x5d, 0x16,
+                                                        0xf6, 0x6, 0xf7, 0x5c, 0xf8, 0x8e, 0x8c, 0xea,
+                                                        0x5, 0xfc, 0x37, 0xfb, 0x48, 0xed, 0xe2, 0xf7,
+                                                        0x6e, 0x6, 0xe, 0x7c, 0xe8, 0xf7, 0x53, 0xe9,
+                                                        0xf7, 0x22, 0xe9, 0x12, 0xde, 0xee, 0x32, 0xee,
+                                                        0xf7, 0x6c, 0xec, 0x36, 0xec, 0x13, 0xf2, 0xf7,
+                                                        0x3d, 0xf7, 0xd5, 0x15, 0x58, 0x69, 0x68, 0x57,
+                                                        0x4d, 0x1a, 0xfb, 0x13, 0xf7, 0x9, 0x4e, 0xef,
+                                                        0xf7, 0x10, 0xe8, 0xc7, 0xf7, 0x12, 0xcc, 0x6c,
+                                                        0xbc, 0x55, 0xb0, 0x1e, 0x13, 0xec, 0xb7, 0xac,
+                                                        0xa8, 0xb8, 0xc9, 0x1a, 0xf0, 0x34, 0xc5, 0xfb,
+                                                        0xa, 0xfb, 0x16, 0x3e, 0x43, 0x31, 0x54, 0xa7,
+                                                        0x5c, 0xbb, 0x67, 0x1e, 0xa2, 0xf7, 0x19, 0x15,
+                                                        0xbb, 0xb7, 0xaa, 0xcb, 0xe0, 0xa2, 0x6b, 0x5d,
+                                                        0x51, 0x54, 0x6c, 0x56, 0x50, 0x5a, 0xae, 0xc0,
+                                                        0x1e, 0x13, 0xf2, 0x81, 0xfb, 0xaf, 0x15, 0xc0,
+                                                        0xc2, 0xb8, 0xca, 0xde, 0xb0, 0x57, 0x5d, 0x4f,
+                                                        0x69, 0x6d, 0x37, 0x3e, 0x60, 0xb6, 0xba, 0x1e,
+                                                        0xe, 0x7c, 0xe8, 0xf7, 0x1a, 0xed, 0xf7, 0x68,
+                                                        0xe9, 0x1, 0xe5, 0xf1, 0xf7, 0x6d, 0xf5, 0x3,
+                                                        0xdf, 0x81, 0x15, 0x88, 0xa6, 0xa5, 0x89, 0xa4,
+                                                        0x1b, 0xf7, 0x3c, 0xf7, 0xf, 0xcd, 0xf7, 0x28,
+                                                        0xb7, 0x1f, 0x97, 0xb3, 0x91, 0xb8, 0xbf, 0x1a,
+                                                        0xf7, 0x3, 0x6d, 0xf7, 0x42, 0xfb, 0x4e, 0xfb,
+                                                        0xb, 0x31, 0x2d, 0x26, 0xfb, 0x0, 0xd8, 0x23,
+                                                        0xf7, 0x13, 0xb6, 0xac, 0x9c, 0x9a, 0xa4, 0x1e,
+                                                        0xfb, 0xd, 0x6f, 0x3b, 0x5c, 0xfb, 0x14, 0x1b,
+                                                        0x75, 0x74, 0x8d, 0x8d, 0x73, 0x1f, 0xf7, 0xd3,
+                                                        0xf7, 0xcd, 0x15, 0x87, 0x8c, 0x6f, 0x3c, 0x37,
+                                                        0x1b, 0x50, 0x5c, 0xb8, 0xd1, 0xd4, 0xca, 0xa6,
+                                                        0xb9, 0xe1, 0x97, 0x42, 0x50, 0x95, 0x1f, 0xe,
+                                                        0x7c, 0xf7, 0x44, 0xe1, 0xf7, 0x44, 0x6d, 0xa,
+                                                        0xf7, 0xe5, 0x15, 0x37, 0xa, 0xfb, 0x9c, 0x4,
+                                                        0x37, 0xa, 0xe, 0x31, 0x76, 0xf8, 0x7, 0xf7,
+                                                        0x44, 0x1, 0xf7, 0x76, 0xf7, 0x6c, 0x3, 0xf7,
+                                                        0x31, 0xfb, 0x3, 0x15, 0xf7, 0x1c, 0x6, 0xf7,
+                                                        0x29, 0xf7, 0xad, 0x5, 0xfb, 0x46, 0x6, 0x65,
+                                                        0xf7, 0x3b, 0x15, 0x37, 0xa, 0xe, 0x5e, 0xa,
+                                                        0xf7, 0x5c, 0x15, 0xf8, 0x5d, 0xfb, 0x4d, 0x5,
+                                                        0xe9, 0x7, 0xfb, 0xf6, 0xf7, 0x2a, 0xf7, 0xf6,
+                                                        0xf7, 0x28, 0x5, 0xe9, 0x7, 0xfc, 0x5d, 0xfb,
+                                                        0x4c, 0x5, 0xe, 0xf7, 0xa, 0xf1, 0xd7, 0xf1,
+                                                        0x1, 0xd2, 0xf8, 0x5e, 0x3, 0xd2, 0xf7, 0xbc,
+                                                        0x15, 0xf8, 0x5e, 0xf1, 0xfc, 0x5e, 0x6, 0xfb,
+                                                        0xac, 0x4, 0xf8, 0x5e, 0xf1, 0xfc, 0x5e, 0x6,
+                                                        0xe, 0x5e, 0xa, 0x9a, 0x15, 0xf8, 0x5d, 0xf7,
+                                                        0x4d, 0x5, 0xf7, 0x9, 0x7, 0xfc, 0x5d, 0xf7,
+                                                        0x4c, 0x5, 0x2d, 0x7, 0xf7, 0xf9, 0xfb, 0x28,
+                                                        0xfb, 0xf9, 0xfb, 0x2a, 0x5, 0xe, 0x80, 0xf7,
+                                                        0x2a, 0xf7, 0xf1, 0xe7, 0x12, 0xed, 0xec, 0x7e,
+                                                        0xf7, 0x41, 0xbd, 0xeb, 0x13, 0xe8, 0xf7, 0x70,
+                                                        0xf7, 0x45, 0x15, 0xec, 0xc8, 0x6, 0xc0, 0x97,
+                                                        0xf7, 0x17, 0xb0, 0xf7, 0x10, 0x1a, 0xf7, 0x1,
+                                                        0x2b, 0xc7, 0xfb, 0xd, 0x53, 0x3e, 0x7d, 0x77,
+                                                        0x56, 0x1e, 0xfb, 0x23, 0xec, 0xd6, 0x7, 0xa8,
+                                                        0x92, 0xae, 0x8f, 0xad, 0x8a, 0x8, 0xc6, 0x8a,
+                                                        0xc0, 0x76, 0x54, 0x1a, 0x13, 0x90, 0x40, 0x2b,
+                                                        0x7a, 0x32, 0x7d, 0x1e, 0x13, 0xd8, 0x65, 0xfb,
+                                                        0x88, 0x15, 0x62, 0xb1, 0x69, 0xbb, 0xbb, 0xb2,
+                                                        0xad, 0xb4, 0xb4, 0x64, 0xad, 0x5b, 0x5b, 0x65,
+                                                        0x69, 0x62, 0x1e, 0xe, 0x79, 0xd3, 0xd2, 0xd4,
+                                                        0xf7, 0x85, 0x77, 0xe6, 0xd0, 0x1, 0x9e, 0xdf,
+                                                        0xcc, 0xd0, 0xf7, 0x9b, 0xdb, 0x3, 0xf7, 0xea,
+                                                        0xf7, 0x3b, 0x15, 0x6a, 0xa1, 0xaf, 0x82, 0x9d,
+                                                        0x1b, 0xc8, 0xf0, 0xc0, 0xf7, 0x26, 0xbd, 0x81,
+                                                        0xbc, 0x72, 0xb3, 0x1f, 0xde, 0x57, 0x2f, 0xac,
+                                                        0x30, 0x1b, 0xfb, 0x2d, 0xfb, 0x1e, 0x23, 0xfb,
+                                                        0x5d, 0xfb, 0x1, 0xbf, 0xfb, 0x4b, 0xf7, 0x78,
+                                                        0xf7, 0x13, 0xd4, 0xc4, 0xa4, 0xb1, 0x1f, 0x6f,
+                                                        0xcf, 0x5, 0x54, 0x3d, 0x4c, 0x74, 0x3f, 0x1b,
+                                                        0xfb, 0x2d, 0x67, 0xf7, 0x1b, 0xe3, 0xc9, 0xa2,
+                                                        0xf7, 0x3f, 0xf7, 0x4c, 0xf7, 0xb, 0xd2, 0x44,
+                                                        0x23, 0x3c, 0x69, 0x51, 0x63, 0x7d, 0x77, 0x91,
+                                                        0xa3, 0x90, 0x8b, 0x8f, 0x8d, 0x91, 0x1f, 0xbe,
+                                                        0xf7, 0x52, 0x5, 0x46, 0x6, 0x85, 0x79, 0x5,
+                                                        0xa3, 0x74, 0x7e, 0x8b, 0x7d, 0x1b, 0xfb, 0x4,
+                                                        0x63, 0xfb, 0xe, 0x3a, 0x35, 0xbe, 0x72, 0xad,
+                                                        0xac, 0xab, 0x9c, 0xa4, 0xa3, 0x1f, 0x22, 0xd0,
+                                                        0x15, 0xc3, 0xa5, 0xd4, 0xbc, 0xa3, 0x8d, 0x74,
+                                                        0x82, 0x70, 0x77, 0xfb, 0x0, 0x4f, 0x7b, 0x86,
+                                                        0x9d, 0x9f, 0x1e, 0xe, 0x8b, 0xe6, 0xd8, 0xe6,
+                                                        0xf7, 0x68, 0xe6, 0x1, 0x82, 0x16, 0xf7, 0x8d,
+                                                        0xe6, 0x31, 0x6, 0xab, 0xd8, 0x5, 0xf7, 0x80,
+                                                        0x6, 0xae, 0x3e, 0x5, 0x35, 0x30, 0xf7, 0x86,
+                                                        0xe6, 0x52, 0x6, 0xfb, 0x62, 0xf8, 0x6b, 0x5,
+                                                        0xfb, 0x90, 0x30, 0xf7, 0x15, 0x6, 0xfb, 0x3f,
+                                                        0xfc, 0x10, 0x5, 0x4e, 0x6, 0xf7, 0x7c, 0xf7,
+                                                        0x3c, 0x15, 0xdb, 0xf7, 0x40, 0xd7, 0xfb, 0x40,
+                                                        0x5, 0xe, 0x8b, 0xe6, 0xf7, 0x2e, 0xe6, 0xf7,
+                                                        0x1b, 0xe6, 0x12, 0xf7, 0x2, 0xeb, 0xf7, 0x7f,
+                                                        0xea, 0x4e, 0xeb, 0x13, 0xf4, 0xa7, 0x16, 0xf7,
+                                                        0xc4, 0x6, 0xf7, 0x49, 0xc5, 0xcf, 0xeb, 0xb8,
+                                                        0x78, 0xb5, 0x3f, 0xb7, 0x1f, 0x13, 0xf8, 0xb2,
+                                                        0xa8, 0xa0, 0xb4, 0xb7, 0x1a, 0xcd, 0x5a, 0xe2,
+                                                        0xfb, 0x2d, 0x1e, 0xfb, 0xc6, 0x30, 0xdd, 0xfc,
+                                                        0x10, 0x39, 0x6, 0xf7, 0x46, 0xf7, 0x89, 0x15,
+                                                        0xf7, 0x1b, 0xf7, 0x12, 0x7, 0xe6, 0x9d, 0x67,
+                                                        0x6e, 0x4d, 0x3e, 0x83, 0x6b, 0x1f, 0xfb, 0x12,
+                                                        0xfb, 0x89, 0x15, 0xf7, 0x2e, 0xf7, 0x12, 0x7,
+                                                        0x13, 0xf4, 0xa4, 0xf7, 0xa, 0x8a, 0x3b, 0x4a,
+                                                        0x55, 0x83, 0x32, 0x1f, 0xe, 0x79, 0xe7, 0xf8,
+                                                        0x33, 0xe6, 0x1, 0xaa, 0xec, 0xf7, 0xed, 0xeb,
+                                                        0x3, 0xf8, 0x95, 0xf7, 0x20, 0x15, 0x74, 0x6a,
+                                                        0x40, 0x60, 0x37, 0x1b, 0xfb, 0x1c, 0x52, 0xf3,
+                                                        0xf5, 0xf7, 0x2e, 0xf7, 0x8, 0xbe, 0xd6, 0xc1,
+                                                        0xc1, 0x77, 0x70, 0xb9, 0x1f, 0x22, 0xeb, 0xf7,
+                                                        0x87, 0x2b, 0x61, 0x7, 0x95, 0x7d, 0x55, 0xab,
+                                                        0x34, 0x1b, 0xfb, 0x3a, 0xfb, 0xd, 0xfb, 0x10,
+                                                        0xfb, 0x3f, 0xfb, 0x8, 0xcf, 0xfb, 0x4f, 0xf7,
+                                                        0x75, 0xda, 0xe0, 0x90, 0xd1, 0xdb, 0x1f, 0x8c,
+                                                        0x8a, 0x5, 0xe, 0x32, 0xa, 0xf0, 0xeb, 0xf7,
+                                                        0xaf, 0xf1, 0x3, 0x9d, 0x16, 0xf7, 0x87, 0x6,
+                                                        0xf7, 0x30, 0xf7, 0x39, 0xce, 0xf7, 0x75, 0xf7,
+                                                        0x47, 0xfb, 0x9, 0xe6, 0xfb, 0x45, 0x1f, 0xfb,
+                                                        0xa2, 0x7a, 0xa, 0x6, 0xf7, 0x47, 0x16, 0xf8,
+                                                        0x10, 0x7, 0xf7, 0x90, 0xaa, 0x39, 0x26, 0xfb,
+                                                        0x1d, 0x41, 0x4f, 0xfb, 0x65, 0x1f, 0xe, 0x8b,
+                                                        0xe6, 0x30, 0xf7, 0x58, 0xb8, 0xe5, 0xac, 0xf7,
+                                                        0x5a, 0x30, 0xe6, 0x12, 0xf7, 0x7, 0xef, 0xf7,
+                                                        0x3, 0xee, 0xb6, 0xee, 0x13, 0x77, 0xb1, 0x16,
+                                                        0xf8, 0xa5, 0xf7, 0x58, 0x28, 0x6, 0x13, 0xaf,
+                                                        0x22, 0xfb, 0x91, 0xf7, 0x2a, 0xf7, 0x3, 0x4a,
+                                                        0xee, 0xf7, 0x70, 0x28, 0x4a, 0xfb, 0x3, 0xf7,
+                                                        0x20, 0xf7, 0x91, 0x7, 0x13, 0xb7, 0x20, 0xee,
+                                                        0xf7, 0x5a, 0xfc, 0xa5, 0x7, 0x13, 0xaf, 0x30,
+                                                        0xd8, 0xfc, 0x10, 0x3e, 0x7, 0xe, 0x8b, 0xe6,
+                                                        0xf7, 0x28, 0xe6, 0xae, 0xf7, 0x58, 0x31, 0xe5,
+                                                        0x90, 0x77, 0x12, 0xf7, 0x6, 0xed, 0xf7, 0x8,
+                                                        0xed, 0xb2, 0xef, 0x13, 0xd7, 0xad, 0x16, 0xf7,
+                                                        0xd5, 0xe6, 0xfb, 0x23, 0xf7, 0x28, 0xf7, 0x8,
+                                                        0x4b, 0xed, 0xf7, 0x70, 0x29, 0x4a, 0xfb, 0x8,
+                                                        0xf7, 0x21, 0xf7, 0x91, 0x6, 0x13, 0xe7, 0x21,
+                                                        0xef, 0x7, 0x13, 0xcf, 0xf7, 0x5d, 0x7, 0x13,
+                                                        0xd7, 0xfc, 0xa7, 0x2b, 0x6, 0xdb, 0x8c, 0x5,
+                                                        0xfc, 0x10, 0x3b, 0x7, 0xe, 0x79, 0xe9, 0xf1,
+                                                        0xea, 0xf7, 0x6c, 0xe6, 0x1, 0x99, 0xed, 0xf7,
+                                                        0xc7, 0xed, 0x3, 0x46, 0xa, 0xda, 0xf7, 0x17,
+                                                        0xf7, 0x21, 0xe6, 0xc9, 0xed, 0x41, 0xa, 0xfb,
+                                                        0x5, 0xfb, 0x4d, 0xfb, 0x62, 0xf7, 0x33, 0x2d,
+                                                        0xf7, 0x36, 0x58, 0xa, 0xe, 0x8b, 0xe6, 0xf7,
+                                                        0x23, 0xe6, 0xf7, 0x26, 0xe6, 0x1, 0xec, 0xe8,
+                                                        0xf7, 0x70, 0xe8, 0x3, 0x9f, 0x16, 0xf7, 0x8c,
+                                                        0xe6, 0x3d, 0xf7, 0x23, 0xf7, 0x70, 0xfb, 0x23,
+                                                        0x3e, 0x30, 0xf7, 0x8b, 0xe6, 0x3e, 0xf8, 0x10,
+                                                        0xd8, 0xe6, 0xfb, 0x88, 0x30, 0xd5, 0xfb, 0x26,
+                                                        0xfb, 0x70, 0xf7, 0x26, 0xd7, 0xe6, 0xfb, 0x8a,
+                                                        0x30, 0xd8, 0xfc, 0x10, 0x3e, 0x6, 0xe, 0x32,
+                                                        0xa, 0xf7, 0x8f, 0xf0, 0x60, 0xa, 0xe6, 0xfb,
+                                                        0x3f, 0xf8, 0x10, 0x74, 0xa, 0xfc, 0x10, 0xfb,
+                                                        0x42, 0x6, 0xe, 0x79, 0xe5, 0xf8, 0x22, 0xe7,
+                                                        0x1, 0x9d, 0xed, 0xf7, 0x85, 0xeb, 0x3, 0x9d,
+                                                        0xbd, 0x15, 0x7a, 0xab, 0xef, 0x58, 0xf5, 0x1b,
+                                                        0xf7, 0x12, 0xd2, 0xd5, 0xf7, 0x1f, 0x1f, 0xf7,
+                                                        0xa7, 0xf7, 0x15, 0xe7, 0xfc, 0x24, 0x2f, 0xf7,
+                                                        0x43, 0xfb, 0xa8, 0x7, 0x49, 0x80, 0x53, 0x2e,
+                                                        0x3d, 0x50, 0x78, 0xa, 0x32, 0xa, 0xe9, 0xee,
+                                                        0x3, 0x96, 0x16, 0xf7, 0x9c, 0xe6, 0x39, 0xf7,
+                                                        0x2, 0x6, 0xc6, 0xc0, 0xcf, 0x34, 0xc5, 0x2a,
+                                                        0xbe, 0x45, 0x19, 0xf7, 0x34, 0xe6, 0x20, 0x6,
+                                                        0x5d, 0xce, 0x4c, 0xe1, 0x54, 0xcf, 0xf7, 0x44,
+                                                        0xf7, 0x33, 0x18, 0xcf, 0xe6, 0xfb, 0x86, 0x30,
+                                                        0xb6, 0x6, 0xfb, 0x3e, 0xfb, 0x2d, 0x5, 0xf7,
+                                                        0x2d, 0xda, 0xe6, 0xfb, 0x99, 0x7a, 0xa, 0x7,
+                                                        0xe, 0x32, 0xa, 0xf7, 0x17, 0xec, 0xf7, 0x86,
+                                                        0xee, 0x3, 0xa9, 0x16, 0xf8, 0xaf, 0xf7, 0x92,
+                                                        0x28, 0xfb, 0x37, 0xfb, 0x86, 0xf8, 0x10, 0xf7,
+                                                        0x14, 0xe6, 0xfb, 0xda, 0x30, 0xf0, 0xfc, 0x10,
+                                                        0x26, 0x6, 0xe, 0x32, 0xa, 0xd2, 0xe7, 0xf7,
+                                                        0xab, 0xe7, 0x3, 0x89, 0x16, 0xf7, 0x90, 0xe6,
+                                                        0x2c, 0x6, 0x9b, 0xf7, 0xce, 0xf1, 0xfb, 0xa2,
+                                                        0x5, 0xc6, 0x6, 0xf4, 0xf7, 0x9f, 0x96, 0xfb,
+                                                        0xcb, 0x5, 0x32, 0x30, 0xf7, 0x86, 0xe6, 0x4d,
+                                                        0x6, 0x81, 0xf8, 0x10, 0x5, 0xd4, 0xe6, 0xfb,
+                                                        0x52, 0x6, 0x20, 0xfb, 0xac, 0x25, 0xf7, 0xac,
+                                                        0x5, 0xfb, 0x5f, 0x30, 0xda, 0x6, 0x7b, 0xfc,
+                                                        0x10, 0x5, 0x4a, 0x6, 0xe, 0x7f, 0xe8, 0xf8,
+                                                        0x18, 0xe8, 0x1, 0xd8, 0xe8, 0xf7, 0x9a, 0xe5,
+                                                        0x3, 0x8a, 0x7f, 0x15, 0xf7, 0x8e, 0xe8, 0x3c,
+                                                        0xf7, 0xd1, 0x6, 0xf7, 0x9a, 0xfc, 0x2e, 0x5,
+                                                        0xe5, 0xf8, 0x75, 0xda, 0xe8, 0xfb, 0x96, 0x2e,
+                                                        0xe0, 0xfb, 0xc5, 0x6, 0xfb, 0x8b, 0xf8, 0x22,
+                                                        0x5, 0xfb, 0x4a, 0x2e, 0xd9, 0xfc, 0x18, 0x3d,
+                                                        0x6, 0xe, 0x79, 0xe7, 0xf8, 0x30, 0xe9, 0x1,
+                                                        0xa1, 0xee, 0xf7, 0xfd, 0xeb, 0x3, 0xa1, 0xf7,
+                                                        0xab, 0x15, 0xfb, 0x5c, 0xf7, 0x25, 0x2a, 0xf7,
+                                                        0x1a, 0xf2, 0xf7, 0x42, 0xd5, 0xf7, 0x76, 0xf7,
+                                                        0x21, 0x2f, 0xf7, 0x31, 0xfb, 0x4d, 0xfb, 0x42,
+                                                        0x22, 0xfb, 0x25, 0xfb, 0x30, 0x1e, 0xeb, 0x8e,
+                                                        0x15, 0xe9, 0xca, 0xf7, 0x2, 0xf7, 0xc, 0xf7,
+                                                        0x1d, 0xb9, 0xfb, 0x16, 0x44, 0x38, 0x5a, 0xfb,
+                                                        0x14, 0xfb, 0x1a, 0xfb, 0xd, 0x4d, 0xf7, 0x0,
+                                                        0xef, 0x1e, 0xe, 0x8b, 0xe6, 0xef, 0xe7, 0xf7,
+                                                        0x50, 0xe6, 0x1, 0xf7, 0x13, 0xed, 0xf7, 0x7d,
+                                                        0xec, 0x3, 0xb7, 0x16, 0xf7, 0xca, 0xe6, 0xfb,
+                                                        0x15, 0xef, 0x6, 0xf7, 0x8d, 0xdc, 0xbd, 0xf7,
+                                                        0x17, 0xf7, 0x5f, 0xfb, 0x36, 0x78, 0xfb, 0xf1,
+                                                        0x91, 0x1f, 0x7a, 0xa, 0x7, 0xf7, 0x49, 0xf7,
+                                                        0x54, 0x15, 0xf7, 0x50, 0x7, 0xf7, 0x20, 0x84,
+                                                        0xe8, 0x99, 0x24, 0x1a, 0x26, 0x25, 0x9b, 0xfb,
+                                                        0x17, 0x84, 0x1e, 0xe, 0xfb, 0x9, 0x76, 0xb8,
+                                                        0xf7, 0x49, 0xf8, 0x24, 0xe7, 0x12, 0xa6, 0xeb,
+                                                        0xf7, 0xf7, 0xea, 0x17, 0xf7, 0xa, 0x46, 0x15,
+                                                        0xb6, 0x46, 0x5, 0xab, 0xc7, 0xa5, 0x98, 0xaf,
+                                                        0x1b, 0xa9, 0xa4, 0x80, 0x81, 0xa4, 0x1f, 0x81,
+                                                        0xa3, 0xa4, 0x82, 0xa8, 0x1b, 0xc2, 0xaa, 0xa6,
+                                                        0xb8, 0xb9, 0x1f, 0x51, 0xca, 0x5, 0x68, 0x66,
+                                                        0x7e, 0x83, 0x79, 0x1b, 0x73, 0x70, 0x9b, 0xa1,
+                                                        0x6b, 0x1f, 0xf7, 0x26, 0xb1, 0xca, 0xf7, 0xf,
+                                                        0xf7, 0x10, 0x1a, 0xde, 0x5a, 0xf7, 0x6b, 0xfb,
+                                                        0x75, 0xfb, 0x1f, 0xfb, 0x19, 0x27, 0xfb, 0x56,
+                                                        0xfb, 0x20, 0xd1, 0x2f, 0xf0, 0x62, 0x1e, 0x40,
+                                                        0xf7, 0xa6, 0x15, 0xf7, 0x2e, 0xf6, 0xba, 0xd0,
+                                                        0x1e, 0x13, 0x58, 0xf7, 0xb, 0xc7, 0x24, 0x25,
+                                                        0x1f, 0x13, 0x50, 0xfb, 0x2c, 0x21, 0x60, 0x41,
+                                                        0x3b, 0x2c, 0xbc, 0xf7, 0x2a, 0x1e, 0xe, 0x8b,
+                                                        0xe6, 0xf7, 0x18, 0xe6, 0xf7, 0x31, 0xe6, 0x1,
+                                                        0xec, 0xef, 0xf7, 0x7a, 0xee, 0x3, 0x97, 0x16,
+                                                        0xf7, 0x9d, 0xe6, 0x3b, 0xf7, 0x18, 0xde, 0x6,
+                                                        0xe4, 0xfb, 0x9, 0xb6, 0x4d, 0xa9, 0x5f, 0x8,
+                                                        0xf7, 0x25, 0xe6, 0x33, 0x6, 0xfb, 0x4, 0xf7,
+                                                        0x2a, 0x5, 0xf6, 0x9d, 0xab, 0xcf, 0xd1, 0x1a,
+                                                        0xf7, 0x8, 0x27, 0xbc, 0xfb, 0x8, 0x1e, 0xfb,
+                                                        0xba, 0x30, 0xdc, 0xfc, 0x10, 0x36, 0x6, 0xf7,
+                                                        0x4d, 0xf7, 0x73, 0x15, 0xf7, 0x31, 0x7, 0xf7,
+                                                        0x49, 0xbc, 0x92, 0x39, 0x31, 0x39, 0x93, 0xfb,
+                                                        0x28, 0x1f, 0xe, 0x8b, 0xe3, 0xf8, 0x17, 0xe3,
+                                                        0x94, 0x77, 0x12, 0xd3, 0xe6, 0x41, 0xe7, 0xf7,
+                                                        0x80, 0xe6, 0x45, 0xe5, 0x13, 0xd2, 0xd3, 0x16,
+                                                        0xe6, 0xae, 0x6, 0x81, 0x9f, 0xb9, 0x72, 0xd5,
+                                                        0x1b, 0xf7, 0xe, 0xf2, 0xcc, 0xf5, 0xf7, 0x24,
+                                                        0xfb, 0x2a, 0x87, 0x21, 0x9a, 0x1f, 0x13, 0xcc,
+                                                        0x72, 0x8f, 0x49, 0x95, 0xc5, 0x1a, 0xb5, 0xb9,
+                                                        0xae, 0xdc, 0xb2, 0xb0, 0x88, 0x7d, 0xac, 0x1e,
+                                                        0x2e, 0xe6, 0x7, 0x13, 0xb4, 0xf7, 0x63, 0x30,
+                                                        0x76, 0x7, 0x13, 0xca, 0x99, 0x6a, 0x64, 0x89,
+                                                        0x62, 0x1b, 0xfb, 0x22, 0x42, 0x32, 0x3d, 0xfb,
+                                                        0x22, 0xf7, 0x1d, 0x81, 0xf7, 0x6, 0x82, 0x1f,
+                                                        0xbd, 0x87, 0xbb, 0x78, 0x62, 0x1a, 0x5b, 0x64,
+                                                        0x68, 0x2b, 0x1e, 0x13, 0xd4, 0x58, 0x5c, 0x9b,
+                                                        0xa3, 0x61, 0x1f, 0xd3, 0x30, 0x7, 0xe, 0x32,
+                                                        0xa, 0xb4, 0xee, 0xf7, 0x3, 0xed, 0xf7, 0x3,
+                                                        0xee, 0x14, 0x38, 0xf7, 0xe, 0x16, 0xf7, 0xe6,
+                                                        0xe6, 0xfb, 0x3, 0xf8, 0x10, 0xf7, 0x3, 0xfb,
+                                                        0x5, 0xee, 0xf7, 0x60, 0xfc, 0x9a, 0xfb, 0x60,
+                                                        0xee, 0xf7, 0x5, 0xf7, 0x3, 0xfc, 0x10, 0xfb,
+                                                        0x15, 0x6, 0xe, 0x79, 0xe7, 0xf8, 0x20, 0xe7,
+                                                        0x1, 0xde, 0xe9, 0xf7, 0x8b, 0xe9, 0x3, 0x8f,
+                                                        0xf8, 0x6a, 0x15, 0xda, 0xfb, 0xa2, 0x6, 0xfb,
+                                                        0x28, 0xd2, 0x45, 0xf7, 0x25, 0xf7, 0x13, 0xe7,
+                                                        0xc4, 0xf7, 0x21, 0x1e, 0xf7, 0xb6, 0xd9, 0xe7,
+                                                        0xfb, 0x96, 0x2f, 0xe1, 0xfb, 0x9a, 0x7, 0x35,
+                                                        0x73, 0x5b, 0x24, 0xfb, 0x4, 0x83, 0xcb, 0xc0,
+                                                        0x1e, 0xf7, 0xab, 0xdf, 0xe7, 0xfb, 0x95, 0x7,
+                                                        0xe, 0xa0, 0x76, 0xf8, 0x6b, 0xe6, 0x1, 0x7e,
+                                                        0xf7, 0x8a, 0xf7, 0x1a, 0xf7, 0x8a, 0x3, 0xf7,
+                                                        0x90, 0x16, 0xeb, 0x6, 0xf7, 0x58, 0xf8, 0x6b,
+                                                        0x5, 0xd0, 0xe6, 0xfb, 0x8a, 0x30, 0xde, 0x6,
+                                                        0xfb, 0x28, 0xfb, 0xf4, 0xfb, 0x1f, 0xf7, 0xf4,
+                                                        0x5, 0xd1, 0xe6, 0xfb, 0x8a, 0x30, 0xd8, 0x6,
+                                                        0xe, 0xa0, 0x76, 0xf8, 0x6b, 0xe6, 0x1, 0xed,
+                                                        0x16, 0xde, 0x6, 0xf7, 0xa, 0xf7, 0xbc, 0xf7,
+                                                        0xc, 0xfb, 0xbc, 0x5, 0xdd, 0x6, 0xcf, 0xf8,
+                                                        0x6b, 0x5, 0xbc, 0xe6, 0xfb, 0x78, 0x30, 0xe1,
+                                                        0x6, 0x69, 0xfb, 0xab, 0x21, 0xf7, 0x94, 0x5,
+                                                        0x45, 0x6, 0x23, 0xfb, 0x96, 0x67, 0xf7, 0xad,
+                                                        0x5, 0xe0, 0xe6, 0xfb, 0x79, 0x30, 0xbc, 0x6,
+                                                        0xe, 0x32, 0xa, 0x97, 0x16, 0xf7, 0x8c, 0xe6,
+                                                        0x45, 0x6, 0xf7, 0x1, 0xf7, 0x1b, 0xf7, 0x1,
+                                                        0xfb, 0x1b, 0x5, 0x4d, 0x30, 0xf7, 0x86, 0xe6,
+                                                        0x47, 0x6, 0xfb, 0x37, 0xf7, 0x5f, 0xf7, 0x23,
+                                                        0xf7, 0x45, 0x5, 0xd1, 0xe6, 0xfb, 0x77, 0x30,
+                                                        0xbb, 0x6, 0x34, 0xfb, 0x0, 0x32, 0xf7, 0x0,
+                                                        0x5, 0xb7, 0xe6, 0xfb, 0x7a, 0x30, 0xd2, 0x6,
+                                                        0xf7, 0x25, 0xfb, 0x45, 0xfb, 0x39, 0xfb, 0x5f,
+                                                        0x5, 0x47, 0x6, 0xe, 0x32, 0xa, 0xf7, 0x8e,
+                                                        0xec, 0x3, 0xf7, 0x12, 0x16, 0xf7, 0xec, 0xe6,
+                                                        0xfb, 0xf, 0xf7, 0x1c, 0x6, 0xf7, 0x35, 0xf7,
+                                                        0x88, 0x5, 0xdb, 0xe6, 0xfb, 0x81, 0x30, 0xc2,
+                                                        0x6, 0x22, 0xfb, 0x31, 0x22, 0xf7, 0x31, 0x5,
+                                                        0xc0, 0xe6, 0xfb, 0x82, 0x30, 0xda, 0x6, 0xf7,
+                                                        0x34, 0xfb, 0x88, 0x5, 0xfb, 0x1c, 0xfb, 0x10,
+                                                        0x7, 0xe, 0x32, 0xa, 0xcc, 0xed, 0xf7, 0xaa,
+                                                        0xec, 0x3, 0xc8, 0x16, 0xf8, 0x71, 0xf7, 0x70,
+                                                        0x2a, 0xfb, 0x15, 0xfb, 0x8d, 0x6, 0xf7, 0xd6,
+                                                        0xf8, 0x2a, 0x5, 0xcc, 0xfc, 0x55, 0xfb, 0x61,
+                                                        0xed, 0xf7, 0x6, 0xf7, 0x6c, 0x7, 0xfb, 0xd2,
+                                                        0xfc, 0x25, 0x5, 0xe, 0x25, 0xe7, 0xf8, 0xaa,
+                                                        0xe7, 0x1, 0xf7, 0x4d, 0xed, 0x3, 0xf7, 0x4d,
+                                                        0x25, 0x15, 0xf7, 0x7a, 0xe7, 0xfb, 0x18, 0xf8,
+                                                        0xaa, 0xf7, 0x18, 0xe7, 0xfb, 0x7a, 0x6, 0xe,
+                                                        0x53, 0x76, 0xf9, 0x53, 0x77, 0x1, 0xf8, 0x43,
+                                                        0x3e, 0x15, 0xd2, 0xa8, 0xfb, 0xe1, 0xf9, 0x36,
+                                                        0x44, 0x6e, 0x5, 0xe, 0x25, 0xe7, 0xf8, 0xaa,
+                                                        0xe7, 0x1, 0xf7, 0xd2, 0xec, 0x3, 0xf7, 0x4d,
+                                                        0x81, 0x15, 0x2f, 0xf7, 0x7a, 0xf9, 0x62, 0xfb,
+                                                        0x7a, 0x2f, 0xf7, 0x19, 0xfc, 0xaa, 0x7, 0xe,
+                                                        0xf7, 0xa3, 0x76, 0xf8, 0x2, 0x77, 0x1, 0xf7,
+                                                        0x0, 0xf7, 0x8e, 0x15, 0xd3, 0xb1, 0xce, 0xcc,
+                                                        0xc1, 0xd8, 0xc2, 0x3a, 0xcb, 0x4e, 0xd3, 0x66,
+                                                        0x8, 0xcb, 0x7, 0x30, 0xf7, 0x2, 0x6c, 0xc2,
+                                                        0x66, 0xf7, 0x1c, 0x8, 0x47, 0x6, 0x6b, 0xfb,
+                                                        0x14, 0x68, 0x45, 0x31, 0x23, 0x8, 0xe, 0xfb,
+                                                        0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8, 0xec,
+                                                        0xbd, 0x7, 0xe, 0xf8, 0xa5, 0x76, 0xf7, 0x2d,
+                                                        0x77, 0x1, 0xf7, 0x3c, 0xf8, 0xcd, 0x15, 0xf7,
+                                                        0x89, 0x4e, 0x9d, 0xbb, 0xfb, 0x7b, 0xf4, 0x5,
+                                                        0xe, 0x7c, 0xe9, 0x3a, 0xe9, 0xf1, 0xed, 0xd0,
+                                                        0xe8, 0x34, 0xa, 0x13, 0xbc, 0xf4, 0xf7, 0xcf,
+                                                        0x15, 0x9a, 0xa8, 0xe6, 0xaa, 0xd3, 0x1b, 0xbe,
+                                                        0xb4, 0x75, 0x5c, 0x1f, 0x7f, 0x7, 0x92, 0x67,
+                                                        0x68, 0x90, 0x6c, 0x1b, 0xfb, 0x33, 0x2b, 0x48,
+                                                        0x2d, 0x2d, 0xeb, 0x57, 0xed, 0xc8, 0xc9, 0x9e,
+                                                        0xb4, 0xb3, 0x1f, 0x13, 0x7a, 0x5c, 0xf7, 0x46,
+                                                        0xe9, 0x7, 0x13, 0x7c, 0x38, 0xf7, 0x3a, 0x6,
+                                                        0xf7, 0x11, 0x6e, 0xd2, 0xfb, 0x29, 0x31, 0x28,
+                                                        0x67, 0x75, 0x58, 0x1e, 0xf7, 0xd7, 0xfb, 0x83,
+                                                        0x15, 0x13, 0xbc, 0x60, 0x5b, 0x4f, 0x68, 0x47,
+                                                        0x1b, 0x60, 0x62, 0x9e, 0xab, 0xb8, 0xd7, 0x9e,
+                                                        0xc6, 0xc6, 0xb6, 0x86, 0x89, 0xa2, 0x1f, 0xe,
+                                                        0x7c, 0xe8, 0x3b, 0xe9, 0xf7, 0x9d, 0xe7, 0xde,
+                                                        0xe9, 0x12, 0x93, 0xf7, 0x4c, 0x28, 0xee, 0xf7,
+                                                        0xbf, 0xf0, 0x13, 0x7a, 0x94, 0x89, 0x15, 0xf7,
+                                                        0x4b, 0xb1, 0x6, 0x13, 0xba, 0x68, 0xbb, 0xc2,
+                                                        0x7b, 0xc0, 0x1b, 0xf7, 0x12, 0xf7, 0xa, 0xea,
+                                                        0xf7, 0x1f, 0xf7, 0x1b, 0xfb, 0x7, 0xea, 0xfb,
+                                                        0x12, 0x55, 0x53, 0x7d, 0x67, 0x5a, 0x1f, 0xf7,
+                                                        0x77, 0xfb, 0x4c, 0x2d, 0x7, 0x13, 0x76, 0xe0,
+                                                        0xfc, 0x4c, 0x37, 0x6, 0xf7, 0x48, 0xf7, 0x10,
+                                                        0x15, 0xd6, 0xb8, 0xcd, 0xf7, 0x0, 0xf7, 0x0,
+                                                        0xb4, 0x34, 0x59, 0x1e, 0x13, 0xba, 0x3e, 0x4b,
+                                                        0x4a, 0x34, 0x5d, 0x22, 0xa6, 0xf7, 0x3, 0x1e,
+                                                        0xe, 0x7c, 0xe9, 0xf7, 0xb2, 0xe9, 0x1, 0xba,
+                                                        0xeb, 0xf7, 0xab, 0xeb, 0x3, 0xf8, 0x3a, 0xf7,
+                                                        0x8b, 0x15, 0xeb, 0xf7, 0x68, 0x2b, 0x78, 0x6,
+                                                        0x98, 0x68, 0x65, 0x91, 0x65, 0x1b, 0xfb, 0x49,
+                                                        0x38, 0xfb, 0x11, 0xfb, 0x4, 0xfb, 0x2b, 0xf7,
+                                                        0x11, 0x35, 0xf7, 0x12, 0xeb, 0xe4, 0xb4, 0xc2,
+                                                        0xd0, 0x1f, 0x55, 0xd5, 0x5, 0x62, 0x52, 0x54,
+                                                        0x68, 0x3c, 0x1b, 0x39, 0x39, 0xbb, 0xe9, 0xdc,
+                                                        0xcb, 0xca, 0xf3, 0xb2, 0xb3, 0x81, 0x7a, 0xab,
+                                                        0x1f, 0xe, 0x7c, 0xe9, 0x3a, 0xe9, 0xf7, 0x9d,
+                                                        0xe9, 0xdc, 0xe9, 0x12, 0x99, 0xec, 0xf7, 0xbe,
+                                                        0xec, 0x2a, 0xf7, 0x44, 0x13, 0x7a, 0xf8, 0x2f,
+                                                        0x89, 0x15, 0xf7, 0x42, 0xe9, 0x3c, 0x6, 0x13,
+                                                        0x7c, 0xf8, 0xaa, 0xfb, 0x72, 0x2d, 0xf7, 0x11,
+                                                        0xfb, 0x17, 0x7, 0xad, 0x65, 0x52, 0x9b, 0x53,
+                                                        0x1b, 0xfb, 0x24, 0x27, 0xfb, 0x3, 0xfb, 0xe,
+                                                        0xfb, 0x11, 0xf4, 0xfb, 0x0, 0xf7, 0x23, 0x1f,
+                                                        0x13, 0xbc, 0xc2, 0xc1, 0x9c, 0xab, 0xb3, 0x1f,
+                                                        0xfb, 0xc0, 0xf7, 0x4e, 0x15, 0xd9, 0xcd, 0xc6,
+                                                        0xe2, 0xe6, 0xc1, 0x4c, 0x3e, 0xfb, 0xd, 0xfb,
+                                                        0x7, 0x7a, 0x69, 0x3a, 0x47, 0xc8, 0xdb, 0x1e,
+                                                        0xe, 0x7c, 0xe8, 0xee, 0xea, 0xe3, 0xe9, 0x1,
+                                                        0xf7, 0x22, 0xf7, 0x45, 0x15, 0xf8, 0x22, 0x6,
+                                                        0xf7, 0x3a, 0x9f, 0x29, 0xf7, 0x3, 0xfb, 0x37,
+                                                        0x1b, 0xfb, 0xe, 0xfb, 0x1f, 0x3c, 0xfb, 0x32,
+                                                        0xfb, 0xe, 0xe4, 0xfb, 0x2, 0xf7, 0x41, 0xe8,
+                                                        0xe7, 0xaa, 0xb6, 0xd7, 0x1f, 0x5f, 0xda, 0x5,
+                                                        0x6c, 0x4a, 0x44, 0x6e, 0x3d, 0x1b, 0xfb, 0x10,
+                                                        0x6b, 0xcc, 0xad, 0x86, 0x1f, 0x8d, 0xea, 0x15,
+                                                        0xc5, 0xa0, 0xce, 0xa9, 0xc9, 0x1b, 0xc9, 0xc9,
+                                                        0x78, 0x46, 0x9e, 0x1f, 0xe, 0x7c, 0xa, 0xe8,
+                                                        0xeb, 0xe7, 0x1, 0xf7, 0x44, 0xf5, 0x3, 0xcf,
+                                                        0x16, 0xf8, 0x50, 0xe9, 0xfb, 0x7a, 0xf7, 0x8f,
+                                                        0xf7, 0x7a, 0xe8, 0xfb, 0x7a, 0xae, 0x6, 0xb1,
+                                                        0x8d, 0xa2, 0xdb, 0xbd, 0xa9, 0x84, 0x80, 0xb9,
+                                                        0x1e, 0xb5, 0xe7, 0x5, 0x96, 0x35, 0x4d, 0x92,
+                                                        0x5a, 0x1b, 0x24, 0x53, 0x51, 0x24, 0x1f, 0x70,
+                                                        0xfb, 0x0, 0x2e, 0xf7, 0x0, 0xfb, 0x8f, 0xfb,
+                                                        0x0, 0x7, 0xe, 0xfb, 0x26, 0xe4, 0xf1, 0xe3,
+                                                        0xf7, 0x71, 0xe4, 0x3e, 0xe3, 0x69, 0xa, 0x13,
+                                                        0xec, 0x50, 0xa, 0xe9, 0xf2, 0x1f, 0xf7, 0xc3,
+                                                        0x7, 0x13, 0xea, 0xd7, 0xe4, 0xfb, 0x3c, 0x6e,
+                                                        0x6, 0x13, 0xdc, 0x5a, 0xa, 0xfb, 0x9, 0xee,
+                                                        0x36, 0xf7, 0x21, 0xc0, 0xbe, 0x94, 0xa7, 0xb1,
+                                                        0x1f, 0x67, 0x7, 0x51, 0x88, 0x5e, 0x42, 0xa,
+                                                        0x63, 0x33, 0x43, 0x44, 0xb7, 0xd2, 0x1e, 0xe,
+                                                        0x8b, 0xe9, 0xf7, 0x8b, 0xe8, 0xed, 0xe9, 0x12,
+                                                        0x91, 0xf7, 0x48, 0x2a, 0xec, 0xf7, 0x77, 0xec,
+                                                        0x13, 0xf4, 0x91, 0x16, 0xf7, 0x96, 0xe9, 0x3d,
+                                                        0xf7, 0x61, 0x6, 0xbd, 0xd5, 0xc2, 0x94, 0xa8,
+                                                        0x1b, 0xc3, 0x98, 0x6a, 0x69, 0x1f, 0xfb, 0x59,
+                                                        0x3d, 0x2d, 0xf7, 0x96, 0xe9, 0x38, 0xf7, 0x52,
+                                                        0x7, 0xd8, 0x71, 0xe5, 0xfb, 0x1f, 0x4e, 0x5b,
+                                                        0x75, 0x71, 0x59, 0x1e, 0xf7, 0x73, 0xfb, 0x48,
+                                                        0x2d, 0x7, 0x13, 0xec, 0xde, 0xfc, 0x4a, 0x6,
+                                                        0x13, 0xf4, 0x38, 0x6, 0xe, 0x8b, 0xea, 0xf7,
+                                                        0x92, 0xeb, 0xd1, 0xf7, 0x23, 0x12, 0xf7, 0x83,
+                                                        0xf7, 0x3, 0x29, 0xed, 0x13, 0xf0, 0xf7, 0x83,
+                                                        0xf8, 0x97, 0x79, 0xa, 0x6b, 0xa, 0xfb, 0x36,
+                                                        0xfd, 0x26, 0x15, 0xf8, 0x52, 0xea, 0xfb, 0x41,
+                                                        0xf7, 0xf2, 0xfb, 0x7f, 0x2b, 0x6, 0x13, 0xe8,
+                                                        0xf7, 0x1d, 0xfb, 0x92, 0xfb, 0x43, 0x6, 0xe,
+                                                        0xfb, 0x26, 0xe7, 0xf8, 0x37, 0xe6, 0xc5, 0xf7,
+                                                        0x24, 0x12, 0xf7, 0xf4, 0xf7, 0xa, 0x35, 0xf3,
+                                                        0x13, 0xf0, 0xf7, 0xf4, 0xf8, 0x96, 0x73, 0xa,
+                                                        0xfb, 0x6d, 0xfd, 0x49, 0x15, 0x73, 0x30, 0x5,
+                                                        0x81, 0xc2, 0xc4, 0x81, 0xc4, 0x1b, 0x13, 0xe8,
+                                                        0xf7, 0x63, 0x8c, 0xf7, 0x1b, 0xc6, 0x1f, 0xf8,
+                                                        0x2c, 0xfc, 0x2, 0x30, 0xf7, 0x9a, 0xfb, 0xcd,
+                                                        0x7, 0x46, 0x81, 0x66, 0x31, 0x55, 0x4d, 0x98,
+                                                        0x91, 0x6a, 0x1e, 0xe, 0x7c, 0xa, 0xe9, 0xe8,
+                                                        0xe9, 0x1, 0xec, 0xed, 0x3, 0x9c, 0x16, 0xf7,
+                                                        0x46, 0xf7, 0x3e, 0x6, 0xaf, 0xa2, 0xf7, 0xe,
+                                                        0x28, 0x5, 0x70, 0x2d, 0xf7, 0x94, 0xe9, 0xfb,
+                                                        0x0, 0x6, 0xfb, 0x41, 0xf7, 0x25, 0xf7, 0x37,
+                                                        0xf5, 0x5, 0xda, 0xe9, 0xfb, 0xb1, 0x2d, 0xd2,
+                                                        0x6, 0xfb, 0x1a, 0x39, 0x5, 0xf7, 0xff, 0xfb,
+                                                        0x46, 0x2d, 0xdb, 0xfc, 0x4a, 0x3b, 0x7, 0xe,
+                                                        0x8b, 0xe9, 0xf8, 0x4a, 0x40, 0xa, 0xf8, 0xa8,
+                                                        0xfb, 0x92, 0x2d, 0xf7, 0x2f, 0xfc, 0x4a, 0xfb,
+                                                        0x41, 0x6, 0xe, 0x90, 0xe9, 0xf7, 0x99, 0xe9,
+                                                        0x1, 0xc1, 0xe9, 0xf7, 0x3, 0xe6, 0xf7, 0x5,
+                                                        0xe7, 0x3, 0x73, 0x16, 0xf7, 0x8e, 0xe9, 0x3d,
+                                                        0xf7, 0x7b, 0x6, 0x9e, 0x9d, 0xa2, 0x9b, 0xa3,
+                                                        0x1b, 0xb1, 0x93, 0x6a, 0x77, 0x1f, 0xfb, 0xc7,
+                                                        0xf7, 0x38, 0xe9, 0x42, 0xf7, 0x73, 0x7, 0xad,
+                                                        0xa4, 0xa6, 0x94, 0x9c, 0x1b, 0xac, 0x96, 0x6d,
+                                                        0x81, 0x1f, 0xfb, 0xd4, 0xf7, 0x35, 0xe9, 0x46,
+                                                        0xf7, 0x72, 0x7, 0xd7, 0x5a, 0xc9, 0x38, 0x62,
+                                                        0x61, 0x79, 0x6c, 0x71, 0x1e, 0xb5, 0x72, 0x66,
+                                                        0x92, 0x73, 0x1b, 0x6c, 0x6d, 0x7f, 0x74, 0x78,
+                                                        0x1f, 0xa1, 0xfb, 0x40, 0x2d, 0xd9, 0xfb, 0x91,
+                                                        0x3d, 0x7, 0xe, 0x8b, 0xe9, 0xf7, 0x91, 0xe9,
+                                                        0x3b, 0xe8, 0x12, 0x98, 0xf7, 0x48, 0xf7, 0x75,
+                                                        0xea, 0x13, 0xb8, 0x9a, 0x16, 0xf7, 0x97, 0xe9,
+                                                        0x3a, 0xf7, 0x67, 0x6, 0xb7, 0xbd, 0xcf, 0x97,
+                                                        0xa9, 0x1b, 0xd1, 0x92, 0x55, 0x64, 0x1f, 0xfb,
+                                                        0x42, 0x46, 0x2d, 0xf7, 0x82, 0xe9, 0x41, 0xf7,
+                                                        0x42, 0x7, 0xf7, 0x12, 0x60, 0xc7, 0xfb, 0xc,
+                                                        0x52, 0x51, 0x79, 0x6f, 0x61, 0x1e, 0x13, 0xd0,
+                                                        0xac, 0xfb, 0x48, 0x2d, 0xde, 0xfb, 0x91, 0x3a,
+                                                        0x7, 0xe, 0x7c, 0xe9, 0xf7, 0xad, 0xe9, 0x4b,
+                                                        0xa, 0xa9, 0xf7, 0x6d, 0x15, 0xfb, 0x40, 0xf7,
+                                                        0x2f, 0x4f, 0xf7, 0x6, 0xf7, 0xe, 0xf7, 0x29,
+                                                        0xce, 0xf7, 0x39, 0xf7, 0x31, 0xfb, 0x18, 0xdb,
+                                                        0xfb, 0x1f, 0xfb, 0x1d, 0xfb, 0x18, 0x3b, 0xfb,
+                                                        0x31, 0x1e, 0xef, 0x16, 0xe2, 0xd6, 0xc3, 0xe9,
+                                                        0xe7, 0xdb, 0x50, 0x37, 0x28, 0x36, 0x64, 0x34,
+                                                        0x3c, 0x31, 0xb2, 0xee, 0x1e, 0xe, 0xfb, 0x22,
+                                                        0xe3, 0xd6, 0xe2, 0xf7, 0x89, 0xe3, 0x40, 0xe3,
+                                                        0x12, 0x9c, 0xf7, 0x43, 0x2c, 0xea, 0xf7, 0xbd,
+                                                        0xeb, 0x13, 0xda, 0x9c, 0x55, 0x15, 0x33, 0xf7,
+                                                        0xcc, 0xe3, 0xfb, 0x1d, 0xf7, 0xe, 0x7, 0x7d,
+                                                        0xa1, 0xc1, 0x6a, 0xd9, 0x1b, 0xf7, 0x1f, 0xef,
+                                                        0xed, 0xf7, 0xd, 0xf7, 0x28, 0xfb, 0x21, 0xcd,
+                                                        0x25, 0x56, 0x52, 0x7b, 0x6d, 0x63, 0x1f, 0x13,
+                                                        0xe6, 0xac, 0xfb, 0x46, 0x33, 0xde, 0xfc, 0x2b,
+                                                        0x7, 0x13, 0xda, 0xe6, 0xf7, 0xb8, 0x15, 0xf7,
+                                                        0x1, 0xf7, 0x4, 0x9e, 0xb4, 0xd9, 0xd1, 0x5e,
+                                                        0x38, 0x3c, 0x43, 0x58, 0x3e, 0x5f, 0xfb, 0x0,
+                                                        0xa4, 0xf4, 0x1e, 0xe, 0xf8, 0xda, 0x55, 0x15,
+                                                        0x33, 0xfb, 0xcc, 0xe3, 0xf7, 0x1d, 0xf7, 0xe,
+                                                        0x7, 0x7d, 0x75, 0x55, 0x6a, 0x3d, 0x1b, 0xfb,
+                                                        0x1f, 0x27, 0xed, 0xf7, 0xd, 0xf7, 0x28, 0xf7,
+                                                        0x21, 0xcd, 0xf1, 0xc0, 0xc4, 0x7b, 0x6d, 0xb3,
+                                                        0x1f, 0xac, 0xf7, 0x46, 0x33, 0x38, 0xfc, 0x2b,
+                                                        0x7, 0x30, 0xf7, 0xb8, 0x15, 0xf7, 0x1, 0xfb,
+                                                        0x4, 0x9e, 0x62, 0x3d, 0x45, 0x5e, 0x38, 0x3c,
+                                                        0xd3, 0x58, 0xd8, 0xb7, 0xf7, 0x0, 0xa4, 0xf4,
+                                                        0x1e, 0xe, 0x8b, 0xe9, 0xf7, 0x90, 0xe9, 0x3b,
+                                                        0xe9, 0x12, 0xf7, 0x28, 0xee, 0x13, 0xb0, 0xac,
+                                                        0x16, 0xf8, 0x21, 0xe9, 0xfb, 0x4b, 0xf7, 0x35,
+                                                        0x6, 0xae, 0xba, 0xd1, 0xd1, 0xd6, 0x1b, 0xa5,
+                                                        0x8f, 0x81, 0x71, 0x8e, 0x1f, 0xe9, 0x99, 0x5,
+                                                        0xb3, 0x89, 0x77, 0xd7, 0x22, 0x1b, 0x41, 0x4b,
+                                                        0x5e, 0x63, 0x55, 0x1f, 0x13, 0xd0, 0xd2, 0xfb,
+                                                        0x6a, 0x2d, 0xf7, 0x7, 0xfb, 0x90, 0xfb, 0x7,
+                                                        0x7, 0xe, 0x7a, 0xeb, 0xeb, 0xe3, 0x9b, 0xf7,
+                                                        0x48, 0x2b, 0xeb, 0x12, 0xcd, 0xed, 0x36, 0xe0,
+                                                        0x36, 0xea, 0xf7, 0x84, 0xee, 0x40, 0xea, 0x13,
+                                                        0xe8, 0x80, 0xcd, 0x7a, 0x15, 0xed, 0xad, 0x6,
+                                                        0x72, 0xb9, 0xc1, 0x82, 0xc2, 0x1b, 0xf7, 0xb,
+                                                        0xea, 0xc4, 0xe6, 0xf5, 0x21, 0x9f, 0x35, 0x91,
+                                                        0x1f, 0x13, 0xd3, 0x0, 0x2b, 0x93, 0x44, 0x91,
+                                                        0xb2, 0x1a, 0xb5, 0xe5, 0x90, 0xa2, 0xb7, 0xc2,
+                                                        0x80, 0x72, 0xa7, 0x1e, 0x13, 0xe5, 0x0, 0x5b,
+                                                        0xee, 0xf7, 0x48, 0x28, 0x69, 0x7, 0xa0, 0x6e,
+                                                        0x50, 0x98, 0x5c, 0x1b, 0x2e, 0x20, 0x64, 0x25,
+                                                        0xfb, 0x12, 0xf7, 0x2a, 0x81, 0xd6, 0x84, 0x1f,
+                                                        0x13, 0xe8, 0x80, 0xaf, 0x88, 0xed, 0x8a, 0x63,
+                                                        0x1a, 0x69, 0x47, 0x79, 0x53, 0x44, 0x54, 0x96,
+                                                        0x9e, 0x73, 0x1e, 0x13, 0xe9, 0x0, 0xd0, 0x29,
+                                                        0x7, 0xe, 0x7c, 0xe6, 0xf7, 0x99, 0xe8, 0xf7,
+                                                        0x18, 0x77, 0x1, 0xf7, 0x11, 0xee, 0x3, 0xc4,
+                                                        0xf7, 0xe5, 0x15, 0xcf, 0xfb, 0x57, 0x6, 0xfb,
+                                                        0x1d, 0xf7, 0x0, 0x77, 0xd7, 0xdc, 0xdd, 0xab,
+                                                        0xa6, 0xd1, 0x1e, 0x7a, 0xe8, 0x5, 0x7a, 0x65,
+                                                        0xfb, 0x0, 0x5f, 0x47, 0x1b, 0x39, 0x86, 0xb7,
+                                                        0xb6, 0x1f, 0xf7, 0x42, 0xf7, 0x9e, 0xe8, 0xfb,
+                                                        0x9e, 0xf7, 0x18, 0x28, 0xfb, 0x18, 0x47, 0x7,
+                                                        0xe, 0x7c, 0xe7, 0x3c, 0xe9, 0xf7, 0x91, 0xe9,
+                                                        0x12, 0x9a, 0xf7, 0x43, 0x2c, 0xea, 0xf7, 0x22,
+                                                        0xf7, 0x42, 0x2b, 0xeb, 0x2b, 0xf7, 0x43, 0x13,
+                                                        0xb4, 0x9a, 0xf7, 0xed, 0x15, 0x13, 0xaa, 0xdb,
+                                                        0xfb, 0x4e, 0x6, 0xfb, 0x5, 0xd0, 0x4e, 0xf7,
+                                                        0x1, 0xc0, 0xc2, 0xa6, 0xa7, 0xa8, 0x1e, 0x13,
+                                                        0x71, 0x61, 0xf7, 0x43, 0xe9, 0x7, 0x13, 0x74,
+                                                        0x3c, 0xf7, 0xef, 0xfb, 0x42, 0x2d, 0x6, 0x13,
+                                                        0xb2, 0xd9, 0xfb, 0x56, 0x6, 0x6c, 0x69, 0x65,
+                                                        0x60, 0x4d, 0x1b, 0x38, 0x88, 0xc4, 0xa2, 0x1f,
+                                                        0xf7, 0xae, 0xfb, 0x43, 0x7, 0xe, 0xa0, 0x76,
+                                                        0xf7, 0xed, 0xe9, 0x1, 0xf7, 0x98, 0x16, 0xe3,
+                                                        0x6, 0xf7, 0x3c, 0xf7, 0xed, 0x5, 0xe0, 0xe9,
+                                                        0xfb, 0x86, 0x2d, 0xc8, 0x6, 0xfb, 0x7, 0xfb,
+                                                        0x82, 0xfb, 0x8, 0xf7, 0x82, 0x5, 0xcf, 0xe9,
+                                                        0xfb, 0x96, 0x2d, 0xe0, 0x6, 0xe, 0xa0, 0x76,
+                                                        0xf7, 0xed, 0xe9, 0x1, 0x79, 0xf7, 0x6d, 0xf7,
+                                                        0x64, 0xf7, 0x67, 0x3, 0xf7, 0x24, 0x16, 0xda,
+                                                        0x6, 0xd5, 0xf7, 0x68, 0xe1, 0xfb, 0x68, 0x5,
+                                                        0xd7, 0x6, 0xf7, 0x2, 0xf7, 0xed, 0x5, 0xbc,
+                                                        0xe9, 0xfb, 0x67, 0x2d, 0xd3, 0x6, 0x4f, 0xfb,
+                                                        0x57, 0x36, 0xf7, 0x6f, 0x5, 0x49, 0x6, 0x3d,
+                                                        0xfb, 0x6f, 0x4e, 0xf7, 0x57, 0x5, 0xd1, 0xe9,
+                                                        0xfb, 0x6d, 0x2d, 0xbc, 0x6, 0xe, 0x7c, 0xa,
+                                                        0xe9, 0x1, 0x91, 0x16, 0xf7, 0x91, 0xe9, 0x62,
+                                                        0x6, 0xda, 0xd8, 0xdd, 0x3e, 0x5, 0x64, 0x2d,
+                                                        0xf7, 0x92, 0xe9, 0x37, 0x6, 0xfb, 0x28, 0xf7,
+                                                        0x1c, 0xf7, 0x10, 0xf7, 0x7, 0x5, 0xdc, 0xe9,
+                                                        0xfb, 0x75, 0x2d, 0x9e, 0x6, 0x4f, 0x52, 0x49,
+                                                        0xc4, 0x5, 0xa1, 0xe9, 0xfb, 0x82, 0x2d, 0xe1,
+                                                        0x6, 0xf7, 0x14, 0xfb, 0x9, 0xfb, 0x22, 0xfb,
+                                                        0x1a, 0x5, 0x36, 0x6, 0xe, 0xfb, 0x22, 0xe3,
+                                                        0xf8, 0x29, 0xe3, 0x12, 0x13, 0xc0, 0xb4, 0x55,
+                                                        0x15, 0x33, 0xf7, 0xb4, 0xe3, 0x48, 0x7, 0xf7,
+                                                        0x9e, 0xf8, 0x29, 0x5, 0xd6, 0xe3, 0xfb, 0x80,
+                                                        0x33, 0xc3, 0x6, 0xfb, 0x14, 0xfb, 0x55, 0xfb,
+                                                        0x6, 0xf7, 0x55, 0x5, 0xc6, 0xe3, 0xfb, 0x86,
+                                                        0x33, 0xd7, 0x6, 0xf7, 0x3b, 0xfb, 0xa8, 0x35,
+                                                        0xfb, 0x15, 0x5, 0xe, 0x8b, 0xe9, 0x2d, 0xf7,
+                                                        0x51, 0xd4, 0xf7, 0x45, 0x2e, 0xe8, 0x12, 0xea,
+                                                        0xec, 0xf7, 0x7a, 0xec, 0x13, 0x6c, 0xdb, 0x16,
+                                                        0xf8, 0x4b, 0xf7, 0x51, 0x2a, 0x6, 0x13, 0xac,
+                                                        0x2c, 0xfb, 0x51, 0x7, 0xf7, 0xb2, 0xf7, 0xa9,
+                                                        0x5, 0xcf, 0xfc, 0x3c, 0xfb, 0x45, 0xec, 0x7,
+                                                        0x13, 0x9c, 0xdf, 0xf7, 0x41, 0x7, 0xfb, 0xb1,
+                                                        0xfb, 0xa6, 0x5, 0xe, 0xf7, 0x86, 0xe4, 0x3,
+                                                        0xf8, 0x6b, 0xfb, 0x88, 0x15, 0xe8, 0x7, 0x65,
+                                                        0x64, 0x8b, 0x95, 0x69, 0x1f, 0x75, 0x92, 0x84,
+                                                        0xa5, 0xa1, 0x1a, 0xf7, 0x28, 0x7, 0xd4, 0x6a,
+                                                        0xde, 0x4d, 0xae, 0x1e, 0xc9, 0xae, 0xac, 0xdc,
+                                                        0xd4, 0x1a, 0xf7, 0x28, 0x7, 0xa1, 0x92, 0xa5,
+                                                        0xa1, 0x92, 0x1e, 0x95, 0xad, 0xb2, 0x8b, 0xb1,
+                                                        0x1b, 0xe8, 0x7, 0x5b, 0x4f, 0x8b, 0x79, 0x5d,
+                                                        0x1f, 0x56, 0x76, 0x75, 0x52, 0x5c, 0x1a, 0xfb,
+                                                        0x9, 0x7, 0xfb, 0x0, 0x82, 0x49, 0x22, 0x7c,
+                                                        0x1e, 0x2d, 0x7, 0xf4, 0x7c, 0x94, 0x49, 0xfb,
+                                                        0x0, 0x1a, 0xfb, 0x9, 0x7, 0x5c, 0xa1, 0x52,
+                                                        0xc0, 0x76, 0x1e, 0x79, 0xb9, 0xc7, 0x8b, 0xbb,
+                                                        0x1b, 0xe, 0xfb, 0x79, 0x76, 0xfa, 0x7c, 0x6e,
+                                                        0xa, 0xfb, 0x8e, 0x15, 0xe5, 0xfa, 0x7c, 0x31,
+                                                        0x6, 0xe, 0xf7, 0xa0, 0xe4, 0x3, 0xf7, 0x14,
+                                                        0xfb, 0x2c, 0x15, 0x2f, 0x7, 0xbb, 0xc6, 0x8b,
+                                                        0x9d, 0xba, 0x1f, 0xbf, 0x9f, 0xa2, 0xc5, 0xba,
+                                                        0x1a, 0xf7, 0x9, 0x7, 0xf7, 0x0, 0x94, 0xcc,
+                                                        0xf4, 0x9b, 0x1e, 0xe9, 0x7, 0x22, 0x9b, 0x82,
+                                                        0xcc, 0xf7, 0x0, 0x1a, 0xf7, 0x9, 0x7, 0xba,
+                                                        0x75, 0xc5, 0x56, 0x9f, 0x1e, 0x9d, 0x5c, 0x50,
+                                                        0x8b, 0x5b, 0x1b, 0x2e, 0x7, 0xb2, 0xb0, 0x8b,
+                                                        0x81, 0xae, 0x1f, 0xa2, 0x84, 0x91, 0x72, 0x74,
+                                                        0x1a, 0xfb, 0x28, 0x7, 0x43, 0xac, 0x39, 0xc9,
+                                                        0x68, 0x1e, 0x4d, 0x68, 0x6a, 0x38, 0x42, 0x1a,
+                                                        0xfb, 0x28, 0x7, 0x74, 0x85, 0x72, 0x74, 0x84,
+                                                        0x1e, 0x80, 0x67, 0x67, 0x8b, 0x64, 0x1b, 0xe,
+                                                        0xf7, 0x45, 0xef, 0x62, 0xf0, 0x12, 0x13, 0x40,
+                                                        0xd1, 0xf7, 0x67, 0x15, 0xcc, 0x51, 0x5, 0xab,
+                                                        0xa0, 0x9d, 0xbe, 0xb3, 0x1b, 0xa8, 0xb2, 0x75,
+                                                        0x7a, 0xb2, 0x1f, 0x13, 0x80, 0x80, 0xa4, 0xa5,
+                                                        0x82, 0xa3, 0x1b, 0xb4, 0xc3, 0xaf, 0xe0, 0xaf,
+                                                        0x1f, 0x4e, 0xc5, 0x5, 0x75, 0x7d, 0x6b, 0x52,
+                                                        0x71, 0x1b, 0x73, 0x74, 0x97, 0x99, 0x71, 0x1f,
+                                                        0x13, 0x40, 0x9b, 0x6b, 0x67, 0x9d, 0x5d, 0x1b,
+                                                        0x47, 0x65, 0x45, 0x53, 0x6a, 0x1f, 0xe, 0xfb,
+                                                        0x11, 0x76, 0xf8, 0x4a, 0xf7, 0x31, 0x1, 0xf7,
+                                                        0x7e, 0xf7, 0x17, 0x3, 0xf7, 0x74, 0xfb, 0x26,
+                                                        0x15, 0xf7, 0x2b, 0x6, 0x77, 0xf8, 0x22, 0x5,
+                                                        0xfb, 0x2, 0x6, 0x60, 0xf7, 0xa, 0x15, 0x5f,
+                                                        0xb7, 0x69, 0xc1, 0xc1, 0xb7, 0xad, 0xb7, 0xb7,
+                                                        0x5f, 0xae, 0x55, 0x55, 0x5f, 0x68, 0x5f, 0x1e,
+                                                        0xe, 0x6f, 0x76, 0x1, 0xd5, 0xec, 0xd9, 0xec,
+                                                        0xc8, 0xe9, 0x3, 0xf7, 0x8d, 0x5a, 0x15, 0xec,
+                                                        0xf7, 0x14, 0x6, 0xce, 0x95, 0xc5, 0xaf, 0xc2,
+                                                        0xb2, 0x5e, 0xd2, 0x18, 0x61, 0x41, 0x60, 0x73,
+                                                        0x4a, 0x1b, 0xfb, 0x6, 0x7d, 0xe7, 0xa2, 0xc9,
+                                                        0xc0, 0xca, 0xda, 0xaf, 0xb1, 0x7c, 0x7a, 0xa9,
+                                                        0x1f, 0x54, 0xe9, 0xf7, 0x44, 0x2d, 0x6c, 0x7,
+                                                        0x7b, 0x97, 0x72, 0x94, 0x77, 0x8e, 0x8, 0xf2,
+                                                        0x2a, 0x25, 0x7, 0xfb, 0xb, 0x72, 0x53, 0x2e,
+                                                        0x31, 0x1a, 0xfb, 0x24, 0xf7, 0x12, 0x5c, 0xbc,
+                                                        0x7e, 0x1e, 0xe, 0x84, 0x76, 0xf7, 0xb9, 0xe8,
+                                                        0xf7, 0x34, 0xe8, 0x12, 0xf7, 0xf, 0xe9, 0x5d,
+                                                        0xec, 0x13, 0xe8, 0xdf, 0xaf, 0x15, 0xbe, 0x4b,
+                                                        0x5, 0x93, 0x97, 0xce, 0xb0, 0xbb, 0x1b, 0xa1,
+                                                        0xac, 0x82, 0x83, 0xa6, 0x1f, 0x84, 0xa2, 0xa3,
+                                                        0x85, 0x9f, 0x1b, 0xd3, 0xb2, 0xb6, 0x71, 0xa,
+                                                        0x70, 0x79, 0x64, 0xa, 0x75, 0x94, 0x7c, 0x1b,
+                                                        0x78, 0x61, 0x84, 0x85, 0x7f, 0x1f, 0x9f, 0xac,
+                                                        0x9b, 0xab, 0xae, 0x1a, 0xa1, 0x8b, 0xa3, 0x84,
+                                                        0xa5, 0x1e, 0xf7, 0x5f, 0xd8, 0xfb, 0x74, 0x6,
+                                                        0x13, 0xf0, 0x7f, 0xa4, 0x86, 0xb4, 0xa2, 0x6c,
+                                                        0xa, 0xbd, 0x7c, 0x5e, 0xa0, 0x1f, 0xd5, 0xb9,
+                                                        0x5, 0xb9, 0x70, 0x5d, 0xc8, 0x63, 0xa, 0x76,
+                                                        0x8f, 0x66, 0x93, 0x77, 0x1e, 0x3d, 0x3e, 0xef,
+                                                        0x6, 0x13, 0xe8, 0x92, 0x76, 0x8c, 0x76, 0x75,
+                                                        0x1a, 0x8a, 0x49, 0x66, 0x49, 0x60, 0x6a, 0x8,
+                                                        0xe, 0xcf, 0xe3, 0xf7, 0x92, 0xe3, 0x1, 0xdc,
+                                                        0xe5, 0xf7, 0x97, 0xe5, 0x3, 0xc1, 0xf5, 0x15,
+                                                        0xc8, 0x52, 0xc8, 0xc4, 0x5, 0x71, 0xae, 0xb8,
+                                                        0x7f, 0xb9, 0x1b, 0xb8, 0xb7, 0x98, 0xa5, 0xad,
+                                                        0x1f, 0xc9, 0x51, 0xc6, 0xc6, 0x4c, 0xc5, 0x5,
+                                                        0xa3, 0xaa, 0x98, 0xb5, 0xb5, 0x1a, 0xb7, 0x7f,
+                                                        0xb7, 0x72, 0xac, 0x1e, 0xca, 0xc5, 0x51, 0xc4,
+                                                        0x4e, 0x50, 0x68, 0xa7, 0x5a, 0x98, 0x5b, 0x8a,
+                                                        0x19, 0x5f, 0x8a, 0x60, 0x7f, 0x6a, 0x72, 0x4e,
+                                                        0xc4, 0x18, 0x4f, 0x50, 0xca, 0x51, 0x5, 0x73,
+                                                        0x6a, 0x7f, 0x60, 0x61, 0x1a, 0x61, 0x97, 0x60,
+                                                        0xa4, 0x6b, 0x1e, 0xc0, 0xf7, 0xa, 0x15, 0xd0,
+                                                        0xc4, 0xc5, 0xd3, 0xd3, 0xc5, 0x51, 0x46, 0x45,
+                                                        0x51, 0x52, 0x43, 0x43, 0x52, 0xc4, 0xd1, 0x1e,
+                                                        0xe, 0x8b, 0xe2, 0xc4, 0xc1, 0xb5, 0xc0, 0xf7,
+                                                        0x4a, 0xe2, 0x1, 0x95, 0xf7, 0x84, 0xf3, 0xf7,
+                                                        0x80, 0x3, 0xf7, 0x22, 0x16, 0xf7, 0xd3, 0xe2,
+                                                        0xfb, 0x5, 0xc3, 0xf7, 0x25, 0xc1, 0xfb, 0x25,
+                                                        0xb6, 0xf7, 0x25, 0xc0, 0xfb, 0x20, 0x6, 0xf7,
+                                                        0x34, 0xf7, 0x4a, 0x5, 0xd8, 0xe2, 0xfb, 0x80,
+                                                        0x34, 0xb7, 0x6, 0x2b, 0xfb, 0x7, 0x2a, 0xf7,
+                                                        0x7, 0x5, 0xb8, 0xe2, 0xfb, 0x84, 0x34, 0xdc,
+                                                        0x6, 0xf7, 0x36, 0xfb, 0x4a, 0x5, 0xfb, 0x24,
+                                                        0x56, 0xf7, 0x26, 0x60, 0xfb, 0x26, 0x55, 0xf7,
+                                                        0x26, 0x53, 0xfb, 0x5, 0x6, 0xe, 0xfb, 0x2e,
+                                                        0x76, 0xf9, 0xe6, 0x6e, 0xa, 0xf7, 0xb1, 0x15,
+                                                        0xe5, 0xf8, 0x1a, 0x31, 0x6, 0xfd, 0xe6, 0x4,
+                                                        0xe5, 0xf8, 0x1b, 0x31, 0x6, 0xe, 0x45, 0xe8,
+                                                        0x2e, 0xf7, 0x40, 0xf7, 0xd5, 0xf7, 0x40, 0xfb,
+                                                        0x1, 0xe9, 0x12, 0xe3, 0xf1, 0xf7, 0x60, 0xf1,
+                                                        0x13, 0x9c, 0xe3, 0x45, 0x15, 0xf7, 0x84, 0x6,
+                                                        0xe8, 0xcd, 0xa4, 0xd4, 0xb1, 0x7d, 0x9f, 0x75,
+                                                        0x9f, 0x1f, 0xa5, 0x96, 0xb3, 0xaa, 0xc1, 0x1a,
+                                                        0xaf, 0x74, 0xab, 0x6b, 0xa2, 0x1e, 0xfb, 0x91,
+                                                        0xf7, 0x41, 0x5, 0x8b, 0x86, 0x8e, 0x90, 0x1a,
+                                                        0x96, 0x98, 0x8c, 0xa2, 0x1e, 0xf7, 0x2e, 0x4c,
+                                                        0x6, 0x13, 0xac, 0xf1, 0xf7, 0x40, 0xfb, 0x88,
+                                                        0x6, 0x49, 0x36, 0x78, 0x26, 0x6e, 0xa0, 0x74,
+                                                        0xa1, 0x78, 0x1f, 0x73, 0x7b, 0x66, 0x72, 0x50,
+                                                        0x1a, 0x59, 0xa7, 0x71, 0xbb, 0x6b, 0x1e, 0xf7,
+                                                        0x5e, 0xfb, 0x1d, 0x5, 0xa1, 0x7d, 0x8e, 0x88,
+                                                        0x82, 0x1a, 0x82, 0x7e, 0x8a, 0x7a, 0x1e, 0xfb,
+                                                        0x3a, 0xda, 0x6, 0x13, 0x6c, 0x25, 0x6, 0xf7,
+                                                        0xac, 0xcc, 0x15, 0xfb, 0x37, 0xf7, 0x1, 0x5,
+                                                        0x80, 0x92, 0x82, 0x97, 0x97, 0x1a, 0xa0, 0xa5,
+                                                        0x95, 0x98, 0x92, 0x1e, 0xf7, 0x48, 0xfb, 0xd,
+                                                        0x5, 0x94, 0x86, 0x92, 0x83, 0x82, 0x1a, 0x71,
+                                                        0x68, 0x84, 0x7a, 0x89, 0x1e, 0xe, 0xf8, 0x79,
+                                                        0xf7, 0x20, 0x1, 0xf7, 0x14, 0xf7, 0x17, 0xde,
+                                                        0xf7, 0x16, 0x3, 0xf7, 0xea, 0xf8, 0x79, 0x15,
+                                                        0xf7, 0x16, 0xf7, 0x20, 0xfb, 0x16, 0x6, 0xfb,
+                                                        0x6a, 0xfb, 0x20, 0x15, 0xf7, 0x17, 0xf7, 0x20,
+                                                        0xfb, 0x17, 0x6, 0xe, 0x79, 0xb8, 0xe7, 0xb9,
+                                                        0xf7, 0x8d, 0xba, 0xd5, 0xb8, 0x1, 0x8b, 0xb8,
+                                                        0xf3, 0xb9, 0xf7, 0xfc, 0xb8, 0x3, 0xf7, 0xad,
+                                                        0x4, 0xfb, 0x39, 0xf7, 0x1a, 0xfb, 0x1a, 0xf7,
+                                                        0x39, 0xf7, 0x3a, 0xf7, 0x1b, 0xf7, 0x1a, 0xf7,
+                                                        0x39, 0xf7, 0x39, 0xfb, 0x1b, 0xf7, 0x1a, 0xfb,
+                                                        0x3a, 0xfb, 0x39, 0xfb, 0x1a, 0xfb, 0x1a, 0xfb,
+                                                        0x39, 0x1e, 0xb8, 0x16, 0xf7, 0x21, 0xf7, 0x5,
+                                                        0xf7, 0x5, 0xf7, 0x21, 0xf7, 0x21, 0xf7, 0x7,
+                                                        0xfb, 0x5, 0xfb, 0x21, 0xfb, 0x21, 0xfb, 0x7,
+                                                        0xfb, 0x5, 0xfb, 0x21, 0xfb, 0x21, 0xfb, 0x5,
+                                                        0xf7, 0x5, 0xf7, 0x21, 0x1e, 0xf8, 0x9, 0x49,
+                                                        0x15, 0x71, 0x73, 0x61, 0x73, 0x64, 0x1b, 0x46,
+                                                        0x5a, 0xc7, 0xcc, 0xcd, 0xc0, 0xc5, 0xcb, 0xae,
+                                                        0xa7, 0x79, 0x75, 0xa1, 0x1f, 0xb1, 0xb2, 0x5,
+                                                        0xa8, 0x6a, 0x5f, 0x9e, 0x5e, 0x1b, 0x37, 0x3b,
+                                                        0x43, 0x29, 0x35, 0xcd, 0x35, 0xf2, 0xc4, 0xc9,
+                                                        0xb7, 0xa0, 0x9b, 0x1f, 0xe, 0xf7, 0x58, 0xde,
+                                                        0xf7, 0x71, 0xdb, 0x12, 0xf7, 0x27, 0xcf, 0xf7,
+                                                        0xd, 0xce, 0x48, 0xf7, 0x9, 0x13, 0xe8, 0xf7,
+                                                        0xe4, 0xf7, 0x60, 0x15, 0xf7, 0x9, 0xdd, 0x59,
+                                                        0x6, 0x13, 0xf0, 0xf7, 0x23, 0x7, 0xde, 0x86,
+                                                        0xcf, 0xfb, 0x8, 0x5c, 0x59, 0x7c, 0x77, 0x6d,
+                                                        0x1e, 0x9f, 0x47, 0x5, 0x99, 0xa5, 0xc6, 0x94,
+                                                        0xa2, 0x1b, 0xad, 0x9e, 0x7e, 0x62, 0x1f, 0x94,
+                                                        0x77, 0x75, 0x8e, 0x76, 0x1b, 0x24, 0x74, 0x3d,
+                                                        0x5b, 0x44, 0xb8, 0x4a, 0xce, 0xa7, 0xa7, 0xa0,
+                                                        0xa8, 0xa0, 0x1f, 0xf7, 0x12, 0x4, 0x63, 0x80,
+                                                        0x6b, 0x56, 0x67, 0x1b, 0x6d, 0x7f, 0xa4, 0x9d,
+                                                        0xb8, 0xb6, 0x95, 0xb1, 0x9a, 0x9a, 0x88, 0x89,
+                                                        0x95, 0x1f, 0xe, 0x7b, 0xa, 0xba, 0xf8, 0x8b,
+                                                        0x3, 0xf7, 0xa3, 0xf7, 0x98, 0x15, 0xf7, 0x77,
+                                                        0xfb, 0x52, 0xc1, 0xc9, 0xfb, 0x2d, 0xf7, 0x13,
+                                                        0xf7, 0x2b, 0xf7, 0x10, 0x54, 0xca, 0x5, 0xfc,
+                                                        0x54, 0xfb, 0x4e, 0x15, 0xf7, 0x6c, 0xfb, 0x52,
+                                                        0xc2, 0xc9, 0xfb, 0x28, 0xf7, 0x13, 0xf7, 0x26,
+                                                        0xf7, 0x10, 0x53, 0xca, 0x5, 0xe, 0xf7, 0x10,
+                                                        0x76, 0xf7, 0x5d, 0xf7, 0x1, 0x1, 0xf8, 0x45,
+                                                        0xeb, 0x3, 0xd2, 0xf7, 0xc4, 0x15, 0xf7, 0xfe,
+                                                        0xfb, 0x5d, 0xeb, 0xf7, 0xca, 0xfc, 0x5e, 0x6,
+                                                        0xe, 0x79, 0xb8, 0xf7, 0xf6, 0xb9, 0xf7, 0x0,
+                                                        0xb8, 0x1, 0x8b, 0xb8, 0xf7, 0x2f, 0xbb, 0xf7,
+                                                        0x5, 0xbd, 0xf7, 0x24, 0xb8, 0x3, 0xf7, 0xad,
+                                                        0x4, 0xfb, 0x39, 0xf7, 0x1b, 0xfb, 0x1a, 0xf7,
+                                                        0x39, 0xf7, 0x3a, 0xf7, 0x1a, 0xf7, 0x1a, 0xf7,
+                                                        0x39, 0xf7, 0x39, 0xfb, 0x1a, 0xf7, 0x1a, 0xfb,
+                                                        0x3a, 0xfb, 0x39, 0xfb, 0x1b, 0xfb, 0x1a, 0xfb,
+                                                        0x39, 0x1e, 0xb8, 0x16, 0xf7, 0x20, 0xf7, 0x7,
+                                                        0xf7, 0x6, 0xf7, 0x20, 0xf7, 0x22, 0xf7, 0x5,
+                                                        0xfb, 0x6, 0xfb, 0x20, 0xfb, 0x20, 0xfb, 0x5,
+                                                        0xfb, 0x6, 0xfb, 0x22, 0xfb, 0x20, 0xfb, 0x7,
+                                                        0xf7, 0x6, 0xf7, 0x20, 0x1e, 0xf7, 0x2f, 0xfb,
+                                                        0x27, 0x15, 0xbb, 0xf7, 0x8, 0xc1, 0x6, 0xbe,
+                                                        0xfb, 0x8, 0x5, 0xc5, 0x6, 0x54, 0xf7, 0x13,
+                                                        0x5, 0x9e, 0x91, 0xaf, 0xa4, 0xc7, 0x1a, 0xed,
+                                                        0x42, 0x86, 0xfb, 0x1e, 0x8d, 0x1e, 0xbb, 0xfb,
+                                                        0x29, 0x15, 0xf2, 0x7, 0xde, 0xa9, 0x83, 0x5f,
+                                                        0x5f, 0x64, 0x84, 0x41, 0x1f, 0xe, 0xf8, 0x8d,
+                                                        0xdb, 0x1, 0xe3, 0xf8, 0x3c, 0x3, 0xe3, 0xf8,
+                                                        0x8d, 0x15, 0xf8, 0x3c, 0xdb, 0xfc, 0x3c, 0x6,
+                                                        0xe, 0xf7, 0x87, 0xe6, 0xf7, 0x53, 0xe6, 0x1,
+                                                        0xf5, 0xea, 0xf7, 0x5b, 0xe9, 0x3, 0xf5, 0xf8,
+                                                        0x41, 0x15, 0x24, 0xe1, 0x38, 0xf7, 0x0, 0xf7,
+                                                        0x1, 0xe0, 0xde, 0xf2, 0xf3, 0x36, 0xde, 0xfb,
+                                                        0x1, 0xfb, 0x0, 0x35, 0x38, 0x23, 0x1e, 0xea,
+                                                        0x16, 0xc1, 0xb6, 0xb5, 0xc3, 0xc4, 0xb6, 0x61,
+                                                        0x55, 0x56, 0x60, 0x61, 0x52, 0x53, 0x60, 0xb5,
+                                                        0xc0, 0x1e, 0xe, 0xa3, 0xdc, 0xf7, 0x4a, 0xe3,
+                                                        0xf7, 0x20, 0x67, 0xa, 0xeb, 0x3, 0xd2, 0xf7,
+                                                        0xb3, 0x15, 0xf7, 0x48, 0xfb, 0x27, 0xeb, 0xf7,
+                                                        0x27, 0xf7, 0x4a, 0xe3, 0xfb, 0x4a, 0xf7, 0x20,
+                                                        0x2b, 0xfb, 0x20, 0xfb, 0x48, 0x6, 0xfb, 0xf3,
+                                                        0x4, 0xf8, 0x5e, 0xdc, 0xfc, 0x5e, 0x6, 0xe,
+                                                        0xf7, 0x7a, 0xd6, 0xf7, 0x39, 0xf7, 0x26, 0x3e,
+                                                        0xd8, 0x12, 0xf8, 0x0, 0xdd, 0x13, 0xb0, 0xf7,
+                                                        0x2d, 0xf7, 0x7a, 0x15, 0xf7, 0xb9, 0xd6, 0xfb,
+                                                        0x38, 0x6, 0xf7, 0x1, 0xe0, 0x5, 0xa7, 0xa0,
+                                                        0xa5, 0xb0, 0xb7, 0x1a, 0xae, 0x6e, 0xe4, 0xfb,
+                                                        0x5, 0x54, 0x57, 0x73, 0x56, 0x6c, 0x1e, 0x13,
+                                                        0xd0, 0x46, 0xde, 0x7, 0x13, 0xb0, 0xa1, 0x87,
+                                                        0xba, 0xc6, 0xa4, 0xaf, 0x82, 0x64, 0x78, 0x82,
+                                                        0x7c, 0x79, 0x7c, 0x1e, 0xfb, 0x4c, 0xfb, 0x27,
+                                                        0x5, 0xe, 0xf7, 0x72, 0xd6, 0xee, 0xd4, 0xf7,
+                                                        0x27, 0x77, 0x12, 0xf7, 0x83, 0xf7, 0x50, 0x3b,
+                                                        0xdb, 0x4e, 0xdc, 0x13, 0xe4, 0xf7, 0x2c, 0xf7,
+                                                        0x96, 0x15, 0x71, 0xcb, 0xb2, 0x81, 0xb3, 0x1b,
+                                                        0xe9, 0xc5, 0xc6, 0xce, 0xae, 0x7a, 0xae, 0x6d,
+                                                        0xa2, 0x1f, 0x13, 0xe8, 0x97, 0x97, 0x9a, 0xa1,
+                                                        0xab, 0x1a, 0xd7, 0x50, 0xac, 0x4a, 0x57, 0x54,
+                                                        0x78, 0x6a, 0x69, 0x1e, 0xb5, 0x4b, 0x5, 0x9d,
+                                                        0xaa, 0xaf, 0xa1, 0xaf, 0x1b, 0x9c, 0xa2, 0x84,
+                                                        0x70, 0x70, 0x75, 0x80, 0x70, 0x1f, 0x13, 0xf0,
+                                                        0x88, 0x7b, 0x8c, 0x63, 0x1b, 0x42, 0xce, 0x7,
+                                                        0x13, 0xe4, 0xb6, 0x9c, 0x74, 0x72, 0x6e, 0x73,
+                                                        0x75, 0x64, 0x1f, 0x5e, 0x8c, 0x66, 0x99, 0x67,
+                                                        0x9d, 0x8, 0xe, 0xf8, 0xa5, 0x76, 0xf7, 0x2d,
+                                                        0x77, 0x1, 0xf7, 0x4e, 0xf8, 0x90, 0x15, 0xf7,
+                                                        0x89, 0xcc, 0x6b, 0xe3, 0xfb, 0x7b, 0x24, 0x5,
+                                                        0xe, 0xfb, 0xd, 0x76, 0xf7, 0x36, 0xd9, 0x3d,
+                                                        0xe5, 0xf7, 0x83, 0xe5, 0x12, 0x9a, 0xf7, 0x45,
+                                                        0x2a, 0xec, 0xf7, 0x1c, 0xf7, 0x46, 0x2a, 0xec,
+                                                        0x2a, 0xf7, 0x44, 0x13, 0xd9, 0x0, 0xea, 0xfb,
+                                                        0x22, 0x15, 0xec, 0xf7, 0x51, 0x6, 0x77, 0x9e,
+                                                        0xaa, 0x83, 0xab, 0x1b, 0xc0, 0xc6, 0xa1, 0xa9,
+                                                        0xa2, 0x1f, 0x58, 0x7, 0x13, 0xb8, 0x80, 0xf7,
+                                                        0x44, 0xe5, 0x6, 0x13, 0xba, 0x0, 0x3c, 0xf7,
+                                                        0xdd, 0xfb, 0x46, 0x31, 0x6, 0x13, 0xd9, 0x0,
+                                                        0xdc, 0xfb, 0x56, 0x6, 0x6b, 0x71, 0x55, 0x72,
+                                                        0x5c, 0x1b, 0x5b, 0x61, 0xa0, 0xca, 0x1f, 0xf7,
+                                                        0x95, 0xfb, 0x45, 0x31, 0x7, 0x13, 0xd6, 0x0,
+                                                        0xdb, 0x6, 0xe, 0x5a, 0x76, 0xf9, 0x0, 0xa9,
+                                                        0x1, 0xf7, 0xd4, 0xc2, 0xeb, 0xc0, 0x3, 0xf7,
+                                                        0xd4, 0x45, 0x15, 0xc2, 0xf9, 0x0, 0xeb, 0xfd,
+                                                        0x0, 0xc0, 0xf9, 0x0, 0xc8, 0xa9, 0xfb, 0x98,
+                                                        0x6, 0xfb, 0x60, 0x21, 0x4f, 0xfb, 0xc, 0xfb,
+                                                        0x2, 0xf5, 0x57, 0xf7, 0x5b, 0x8a, 0x1f, 0xe,
+                                                        0xf7, 0x39, 0xf7, 0x4e, 0x1, 0xf7, 0x58, 0xf7,
+                                                        0x96, 0x15, 0x58, 0xba, 0x61, 0xc4, 0xc4, 0xba,
+                                                        0xb5, 0xbe, 0xbe, 0x5c, 0xb5, 0x52, 0x52, 0x5c,
+                                                        0x61, 0x58, 0x1e, 0xe, 0xfb, 0x4d, 0x76, 0xf7,
+                                                        0x62, 0x77, 0x12, 0xf7, 0x91, 0x16, 0x80, 0x2d,
+                                                        0x5, 0x8f, 0x92, 0x9a, 0x8d, 0x99, 0x1b, 0x9d,
+                                                        0x9b, 0x85, 0x77, 0x7d, 0x7e, 0x83, 0x7b, 0x1f,
+                                                        0x13, 0xc0, 0x7c, 0x74, 0x90, 0x94, 0x82, 0x1f,
+                                                        0x70, 0x53, 0x5, 0x79, 0xa4, 0xa6, 0x81, 0xa9,
+                                                        0x1b, 0xc9, 0xb1, 0xb8, 0xc2, 0xc8, 0x60, 0x9a,
+                                                        0x7b, 0x8f, 0x1f, 0xa5, 0x7, 0xe, 0xf7, 0x7a,
+                                                        0xd8, 0xf7, 0xc9, 0x77, 0x12, 0xf7, 0x3a, 0xf7,
+                                                        0x45, 0x3b, 0xdb, 0x13, 0xe0, 0xf7, 0x2d, 0xf7,
+                                                        0x7a, 0x15, 0xf7, 0xba, 0xd8, 0x23, 0xf7, 0xc9,
+                                                        0x6, 0xfb, 0x45, 0x75, 0x5, 0x3f, 0x7, 0x13,
+                                                        0xd0, 0xec, 0x91, 0x5, 0xfb, 0x6d, 0xfb, 0x2,
+                                                        0x7, 0xe, 0xf7, 0x58, 0xde, 0xf7, 0x6e, 0xde,
+                                                        0x1, 0xf7, 0x27, 0xcf, 0xf7, 0x3f, 0xce, 0x3,
+                                                        0xf7, 0x27, 0xf8, 0x18, 0x15, 0x21, 0xca, 0x35,
+                                                        0xe7, 0xda, 0xd3, 0xd6, 0xf7, 0x9, 0xe9, 0x53,
+                                                        0xed, 0x29, 0x2a, 0x54, 0x24, 0x32, 0x1e, 0xcf,
+                                                        0x89, 0x15, 0xbe, 0xa7, 0xc7, 0xc5, 0xc5, 0xa6,
+                                                        0x4c, 0x5d, 0x49, 0x66, 0x60, 0x5b, 0x53, 0x6d,
+                                                        0xbe, 0xc3, 0x1e, 0xe, 0x7b, 0xa, 0xbc, 0xf8,
+                                                        0x8b, 0x3, 0xf0, 0xd1, 0x15, 0xf7, 0x77, 0xf7,
+                                                        0x52, 0xfb, 0x74, 0xf7, 0x4e, 0x54, 0x4c, 0xf7,
+                                                        0x2b, 0xfb, 0x10, 0xfb, 0x2d, 0xfb, 0x13, 0x5,
+                                                        0xf7, 0xb5, 0x4d, 0x15, 0xf7, 0x6c, 0xf7, 0x52,
+                                                        0xfb, 0x69, 0xf7, 0x4e, 0x53, 0x4c, 0xf7, 0x26,
+                                                        0xfb, 0x10, 0xfb, 0x28, 0xfb, 0x13, 0x5, 0xe,
+                                                        0x64, 0x76, 0xa2, 0xc4, 0x5a, 0x76, 0xf7, 0x6,
+                                                        0xca, 0xf7, 0x43, 0xd0, 0x8b, 0xf7, 0x4f, 0xe1,
+                                                        0x77, 0x12, 0xbf, 0xd5, 0xf8, 0x8, 0xd7, 0x13,
+                                                        0xdf, 0x80, 0xf7, 0xf0, 0xcb, 0x15, 0xf7, 0x2a,
+                                                        0x5f, 0x3f, 0x52, 0xf7, 0x59, 0xc4, 0x5e, 0xb7,
+                                                        0xb8, 0xca, 0x5e, 0xf7, 0x41, 0x42, 0x6, 0xfb,
+                                                        0x2d, 0xfb, 0x52, 0x5, 0xe3, 0x9c, 0x15, 0xc9,
+                                                        0xd7, 0x5, 0x3f, 0x7, 0xfc, 0x71, 0xfb, 0x10,
+                                                        0x15, 0x13, 0x3f, 0x80, 0x65, 0xa, 0x50, 0xc6,
+                                                        0x5, 0xfd, 0x12, 0xfb, 0xea, 0x15, 0xf7, 0xa0,
+                                                        0xd0, 0x2d, 0xf7, 0xa4, 0x6, 0xfb, 0x37, 0x78,
+                                                        0x5, 0x47, 0x7, 0xe4, 0x90, 0x5, 0xfb, 0x52,
+                                                        0x27, 0x7, 0xe, 0x51, 0xce, 0xf7, 0x33, 0xf7,
+                                                        0x16, 0x47, 0xcf, 0x8a, 0xd1, 0x8b, 0xf7, 0x52,
+                                                        0xe2, 0x77, 0xb0, 0x77, 0x12, 0xbc, 0xd1, 0x13,
+                                                        0xcb, 0xf8, 0x20, 0x97, 0x15, 0x51, 0xf7, 0x90,
+                                                        0xce, 0xfb, 0x22, 0x7, 0xf7, 0xa, 0xeb, 0xa2,
+                                                        0xaa, 0xb3, 0x1a, 0xa9, 0x71, 0xdb, 0x29, 0x5d,
+                                                        0x62, 0x75, 0x67, 0x6d, 0x1e, 0x43, 0xd2, 0x7,
+                                                        0x13, 0xab, 0x9e, 0x87, 0xb6, 0xbd, 0xa1, 0xac,
+                                                        0x82, 0x69, 0x79, 0x82, 0x7e, 0xfb, 0x41, 0xfb,
+                                                        0x24, 0x1e, 0x13, 0x9b, 0xfc, 0x4f, 0xf7, 0xb1,
+                                                        0x15, 0xf7, 0x91, 0xd1, 0x34, 0xf7, 0xa8, 0x6,
+                                                        0x13, 0x9d, 0xfb, 0x2e, 0x78, 0x5, 0x46, 0x7,
+                                                        0xdf, 0x90, 0x5, 0xfb, 0x55, 0x2b, 0x7, 0xc7,
+                                                        0xfc, 0x0, 0x15, 0x65, 0xa, 0x50, 0xc6, 0x5,
+                                                        0xe, 0x5e, 0xc4, 0x58, 0x76, 0xaa, 0x76, 0xf5,
+                                                        0xcb, 0xf7, 0x3c, 0xd0, 0xe5, 0xcb, 0xc8, 0xcd,
+                                                        0x91, 0x77, 0xb0, 0x77, 0x12, 0x13, 0x5e, 0x80,
+                                                        0xf7, 0xe7, 0xc3, 0x15, 0xf7, 0x29, 0x6, 0x13,
+                                                        0x9e, 0x80, 0x5f, 0x41, 0x52, 0xf7, 0x56, 0xc4,
+                                                        0x5d, 0xb7, 0xb9, 0xcb, 0x5d, 0xf7, 0x46, 0x45,
+                                                        0x7, 0xfb, 0x2d, 0xfb, 0x56, 0x5, 0xe3, 0x9b,
+                                                        0x15, 0xc8, 0xd9, 0x5, 0x3d, 0x7, 0xfc, 0xa8,
+                                                        0xf7, 0x5f, 0x15, 0x71, 0xc7, 0xaf, 0x82, 0xb3,
+                                                        0x1b, 0xe1, 0xbe, 0xc1, 0xc9, 0xaa, 0x7c, 0xaa,
+                                                        0x70, 0x9f, 0x1f, 0x96, 0x95, 0x98, 0xa0, 0xa9,
+                                                        0x1a, 0xc9, 0x56, 0xa8, 0x4f, 0x5b, 0x57, 0x7b,
+                                                        0x6d, 0x6b, 0x1e, 0xb4, 0x56, 0x5, 0x9d, 0x99,
+                                                        0xad, 0x9a, 0xb0, 0x1b, 0xa4, 0x9f, 0x83, 0x79,
+                                                        0x71, 0x76, 0x82, 0x73, 0x1f, 0x55, 0x4b, 0xca,
+                                                        0x6, 0xb2, 0x9a, 0x76, 0x75, 0x71, 0x75, 0x76,
+                                                        0x69, 0x1f, 0x89, 0x6, 0x61, 0x8c, 0x69, 0x98,
+                                                        0x69, 0x9a, 0x8, 0xa8, 0xfc, 0x13, 0x15, 0x13,
+                                                        0x3e, 0x80, 0x65, 0xa, 0x5, 0x13, 0x5d, 0x0,
+                                                        0x50, 0xc6, 0x5, 0xe, 0xfb, 0x26, 0xe7, 0xf7,
+                                                        0xf1, 0xf7, 0x2e, 0x12, 0xed, 0xec, 0xba, 0xf7,
+                                                        0x44, 0x7c, 0xed, 0x13, 0xe8, 0xf7, 0xad, 0xf7,
+                                                        0x59, 0x15, 0x57, 0x7f, 0xfb, 0x17, 0x66, 0xfb,
+                                                        0xf, 0x1a, 0xfb, 0x2, 0xeb, 0x4e, 0xf7, 0xd,
+                                                        0xc2, 0xd9, 0x9a, 0x9f, 0xc0, 0x1e, 0xf7, 0x24,
+                                                        0x29, 0x3f, 0x7, 0x85, 0x6f, 0x6d, 0x86, 0x6e,
+                                                        0x1b, 0x48, 0x55, 0xa3, 0xc2, 0xd5, 0xe9, 0x9c,
+                                                        0xe4, 0x99, 0x1f, 0xf7, 0x13, 0x7, 0x13, 0x50,
+                                                        0x2a, 0x6, 0x13, 0xf0, 0x64, 0xf7, 0x7, 0x15,
+                                                        0x60, 0xb2, 0x69, 0xbc, 0x1e, 0x13, 0x50, 0xbc,
+                                                        0xb2, 0xad, 0xb6, 0xb6, 0x64, 0xad, 0x5a, 0x5a,
+                                                        0x64, 0x69, 0x60, 0x1f, 0xe, 0x8b, 0xe5, 0xcc,
+                                                        0xe5, 0xf7, 0x7a, 0xe5, 0xf7, 0x6f, 0x77, 0x44,
+                                                        0xa, 0xf7, 0x19, 0xf9, 0x3c, 0x15, 0xf7, 0xcf,
+                                                        0x40, 0xa5, 0xc5, 0xfb, 0xbe, 0xf7, 0xd, 0x5,
+                                                        0xfb, 0x4d, 0xfd, 0xa4, 0x22, 0xa, 0x8b, 0xe5,
+                                                        0xcc, 0xe5, 0xf7, 0x6d, 0xe5, 0xf7, 0x7c, 0x77,
+                                                        0x44, 0xa, 0x82, 0x16, 0x20, 0xa, 0xfb, 0x60,
+                                                        0xf7, 0xfc, 0x15, 0xf7, 0xd2, 0xd5, 0x62, 0xf4,
+                                                        0xfb, 0xbd, 0x6a, 0xa, 0xe, 0x8b, 0xe4, 0xcd,
+                                                        0xe4, 0xf7, 0x6d, 0xe4, 0xf7, 0x7a, 0x77, 0x44,
+                                                        0xa, 0xf7, 0x20, 0xf8, 0xef, 0x15, 0xf7, 0x2c,
+                                                        0xf1, 0xf7, 0x2b, 0x25, 0xc7, 0xaf, 0xfb, 0x36,
+                                                        0xf7, 0x21, 0x5, 0x2a, 0x6, 0xfb, 0x39, 0xfb,
+                                                        0x20, 0x5, 0x33, 0xfd, 0x14, 0x22, 0xa, 0x8b,
+                                                        0xe5, 0xcc, 0xe5, 0xf7, 0x6d, 0xe5, 0xc7, 0xde,
+                                                        0x74, 0xde, 0x8f, 0x77, 0x12, 0x82, 0xf7, 0x97,
+                                                        0xf4, 0xf7, 0x92, 0x13, 0xeb, 0xde, 0xf9, 0x10,
+                                                        0x15, 0xe3, 0x71, 0x5, 0xaf, 0x99, 0x98, 0xa5,
+                                                        0xa7, 0x1b, 0xaf, 0x9f, 0x78, 0x7b, 0xa4, 0x1f,
+                                                        0x13, 0xf7, 0x7e, 0x9f, 0xa1, 0x7f, 0xae, 0x1b,
+                                                        0xd9, 0xbd, 0xc6, 0xca, 0x9a, 0x1f, 0x35, 0xa4,
+                                                        0x5, 0x75, 0x84, 0x7d, 0x61, 0x66, 0x1b, 0x6d,
+                                                        0x76, 0x99, 0x9a, 0x75, 0x1f, 0x13, 0xeb, 0x9a,
+                                                        0x74, 0x73, 0x9b, 0x66, 0x1b, 0x38, 0x5e, 0x49,
+                                                        0x56, 0x7c, 0x1f, 0x2f, 0xfd, 0x10, 0x22, 0xa,
+                                                        0x8b, 0xe3, 0xcc, 0xe3, 0xf7, 0x69, 0xe3, 0xdf,
+                                                        0xf7, 0xe, 0x44, 0xa, 0xf7, 0xda, 0xf9, 0x10,
+                                                        0x15, 0xf7, 0x3, 0xf7, 0xe, 0x6b, 0xa, 0xfb,
+                                                        0x4b, 0xfb, 0xe, 0x15, 0xf7, 0x5, 0xf7, 0xe,
+                                                        0xfb, 0x5, 0x6, 0xfb, 0x2c, 0xfd, 0x8a, 0x22,
+                                                        0xa, 0x8b, 0xe8, 0xcf, 0xe9, 0xf7, 0x7e, 0xe8,
+                                                        0x9e, 0xc9, 0xd7, 0xc9, 0x1, 0xf7, 0x4d, 0xcc,
+                                                        0xdb, 0xcb, 0x3, 0xf7, 0x4d, 0xf9, 0x51, 0x15,
+                                                        0x54, 0xba, 0x5e, 0xc5, 0xc4, 0xba, 0xb8, 0xc2,
+                                                        0xc2, 0x5c, 0xb8, 0x52, 0x51, 0x5c, 0x5e, 0x54,
+                                                        0x1e, 0xcd, 0x16, 0xa0, 0x9c, 0x9c, 0xa1, 0xa1,
+                                                        0x9d, 0x7a, 0x76, 0x76, 0x79, 0x7a, 0x75, 0x75,
+                                                        0x7a, 0x9c, 0xa0, 0x1e, 0xfb, 0x98, 0xfd, 0x51,
+                                                        0x22, 0xa, 0x8b, 0xe5, 0x31, 0xf7, 0x40, 0x7e,
+                                                        0xe6, 0x48, 0xf7, 0x50, 0x9d, 0xf7, 0x41, 0x31,
+                                                        0xe5, 0x12, 0xf7, 0xbe, 0xed, 0xb5, 0xda, 0x9d,
+                                                        0xdc, 0x13, 0xab, 0x80, 0x7c, 0x16, 0xf7, 0x89,
+                                                        0xe5, 0x3e, 0x6, 0xa9, 0xd0, 0x5, 0xf7, 0x7,
+                                                        0xfb, 0x33, 0xf7, 0xd2, 0x6, 0x13, 0x5b, 0x80,
+                                                        0xf7, 0x40, 0x3a, 0x7, 0x13, 0x97, 0x80, 0x39,
+                                                        0xfb, 0x1f, 0xf7, 0x22, 0xb5, 0x5a, 0xda, 0xf7,
+                                                        0x50, 0x3c, 0x5a, 0x61, 0xf7, 0x2a, 0xf7, 0x1f,
+                                                        0x7, 0x13, 0xab, 0x80, 0x38, 0xdc, 0xf7, 0x41,
+                                                        0xfc, 0x7b, 0x7, 0x13, 0xa7, 0x80, 0x31, 0xea,
+                                                        0x7, 0xfb, 0x40, 0xfc, 0x12, 0x5, 0x48, 0x6,
+                                                        0xf7, 0x83, 0xf7, 0x34, 0x15, 0xd5, 0xf7, 0x39,
+                                                        0x5, 0xfb, 0x39, 0x7, 0xe, 0xfb, 0x4d, 0x76,
+                                                        0xf7, 0x54, 0xe7, 0xf8, 0x2e, 0xe7, 0x1, 0xaa,
+                                                        0xec, 0xf7, 0x16, 0xf7, 0x22, 0xcb, 0xec, 0x3,
+                                                        0xf7, 0x9b, 0x82, 0x15, 0x82, 0x2e, 0x5, 0x8e,
+                                                        0x98, 0x9f, 0x8e, 0x97, 0x1b, 0x94, 0x99, 0x84,
+                                                        0x7f, 0x7c, 0x80, 0x84, 0x7d, 0x7d, 0x79, 0x91,
+                                                        0x95, 0x7d, 0x1f, 0x6f, 0x52, 0x5, 0x71, 0xac,
+                                                        0xa0, 0x89, 0xa1, 0x1b, 0xc2, 0xb9, 0xac, 0xca,
+                                                        0x98, 0x8b, 0xc3, 0x4f, 0x99, 0x1f, 0x8c, 0x98,
+                                                        0xe3, 0x8f, 0xcf, 0xb2, 0xd3, 0xb9, 0x19, 0x52,
+                                                        0xcf, 0x5, 0x72, 0x60, 0x4a, 0x63, 0x36, 0x1b,
+                                                        0xfb, 0x21, 0x59, 0xf7, 0x15, 0xd7, 0xf7, 0x2f,
+                                                        0xf7, 0x6, 0xbd, 0xd7, 0xc1, 0xbd, 0x78, 0x71,
+                                                        0xb5, 0x1f, 0x21, 0xec, 0xf7, 0x87, 0x2a, 0x60,
+                                                        0x7, 0xa4, 0x6a, 0x55, 0x9d, 0x4e, 0x1b, 0xfb,
+                                                        0x1e, 0xfb, 0x27, 0x2a, 0xfb, 0x5e, 0xfb, 0x21,
+                                                        0xea, 0xfb, 0x13, 0xf7, 0x1d, 0x75, 0x1f, 0xe,
+                                                        0x48, 0xa, 0xc1, 0xed, 0x3, 0xb1, 0x16, 0x35,
+                                                        0xa, 0xf6, 0xf8, 0xe2, 0x15, 0xf7, 0xd2, 0x40,
+                                                        0xa6, 0x77, 0xa, 0x48, 0xa, 0xbf, 0xee, 0x3,
+                                                        0xb1, 0x16, 0xf8, 0xa5, 0x6, 0x8a, 0xf7, 0x5e,
+                                                        0x5, 0x28, 0xfb, 0x4, 0xfb, 0x91, 0x38, 0xa,
+                                                        0xf7, 0x91, 0xfb, 0x6, 0xee, 0xf7, 0x60, 0xfc,
+                                                        0xa1, 0x31, 0xd7, 0xfc, 0x8, 0x3c, 0x6, 0xf7,
+                                                        0x2b, 0xf8, 0x97, 0x15, 0xf7, 0xd8, 0xd5, 0x61,
+                                                        0xf4, 0xfb, 0xc3, 0x6a, 0xa, 0xe, 0x8b, 0xe4,
+                                                        0xf7, 0x26, 0xe4, 0xf7, 0x1d, 0xe4, 0xf7, 0x7a,
+                                                        0x77, 0x1, 0xf7, 0x9, 0xec, 0xf1, 0xee, 0xc0,
+                                                        0xee, 0x3, 0xf7, 0x2b, 0xf8, 0xef, 0x15, 0xf7,
+                                                        0x2d, 0xf1, 0xf7, 0x2d, 0x25, 0xc8, 0xaf, 0xfb,
+                                                        0x37, 0xf7, 0x21, 0x5, 0x27, 0x6, 0xfb, 0x3b,
+                                                        0xfb, 0x20, 0x5, 0x59, 0xfd, 0x14, 0x15, 0x35,
+                                                        0xa, 0xe, 0x8b, 0xe3, 0xf7, 0x24, 0xe2, 0xf7,
+                                                        0x1b, 0xe3, 0xdf, 0xf7, 0xe, 0x12, 0xf7, 0x9,
+                                                        0xec, 0x4f, 0xf7, 0x6, 0xbb, 0xee, 0x40, 0xf7,
+                                                        0x4, 0x9c, 0xed, 0x13, 0xf5, 0x80, 0xf7, 0xe8,
+                                                        0xf9, 0x10, 0x15, 0xf7, 0x4, 0xf7, 0xe, 0xfb,
+                                                        0x4, 0x56, 0xa, 0xfb, 0x8, 0xfd, 0x8a, 0x15,
+                                                        0xf8, 0xa5, 0xf7, 0x5e, 0x29, 0xfb, 0x4, 0x6,
+                                                        0x13, 0xfa, 0x80, 0x2d, 0xa, 0xe, 0x8b, 0xe5,
+                                                        0xf8, 0x8, 0x5f, 0xa, 0xf7, 0x90, 0xef, 0x3,
+                                                        0xd8, 0x16, 0x31, 0xa, 0xcd, 0xf8, 0xe2, 0x15,
+                                                        0xf7, 0xd4, 0x40, 0xa5, 0x77, 0xa, 0x8b, 0xe5,
+                                                        0xf8, 0x8, 0x5f, 0xa, 0xf7, 0x90, 0xef, 0x3,
+                                                        0xf7, 0x50, 0xf8, 0xf1, 0x15, 0xf7, 0xd9, 0xd5,
+                                                        0x60, 0xf4, 0xfb, 0xc2, 0x6a, 0xa, 0x30, 0xfd,
+                                                        0x2c, 0x15, 0x31, 0xa, 0xe, 0x8b, 0xe4, 0xf8,
+                                                        0x8, 0xe4, 0xf7, 0x7a, 0x67, 0xa, 0xef, 0x3,
+                                                        0xf7, 0x29, 0xf8, 0xef, 0x15, 0xf7, 0x2e, 0xf1,
+                                                        0xf7, 0x2d, 0x25, 0xc8, 0xaf, 0xfb, 0x38, 0xf7,
+                                                        0x21, 0x5, 0x28, 0x6, 0xfb, 0x3c, 0xfb, 0x20,
+                                                        0x5, 0x82, 0xfd, 0x14, 0x15, 0x31, 0xa, 0xe,
+                                                        0x8b, 0xe3, 0xf8, 0x2, 0xe3, 0xdf, 0xf7, 0xe,
+                                                        0x12, 0xf7, 0x2d, 0xf7, 0x6, 0x7c, 0xef, 0x7e,
+                                                        0xf7, 0x5, 0x13, 0xf4, 0xf7, 0xe7, 0xf9, 0x10,
+                                                        0x15, 0xf7, 0x5, 0xf7, 0xe, 0xfb, 0x5, 0x56,
+                                                        0xa, 0x3f, 0xfd, 0x8a, 0x15, 0xf8, 0x52, 0xe5,
+                                                        0x6, 0x13, 0xe8, 0x30, 0xa, 0xe, 0x8b, 0xe6,
+                                                        0xf7, 0x30, 0xce, 0xf7, 0x31, 0xe6, 0x1, 0xf0,
+                                                        0xeb, 0xf7, 0xb5, 0xeb, 0x3, 0x9d, 0x16, 0xf7,
+                                                        0xa1, 0x6, 0xf7, 0x2f, 0xf7, 0x20, 0xce, 0xf7,
+                                                        0x75, 0xf7, 0x39, 0x39, 0xf4, 0xfb, 0x4e, 0x1f,
+                                                        0xfb, 0xbc, 0x30, 0xde, 0xfb, 0x31, 0x43, 0x48,
+                                                        0xd3, 0xfb, 0x30, 0x38, 0x6, 0xf7, 0x47, 0x16,
+                                                        0xf7, 0x30, 0xf7, 0x12, 0xce, 0xfb, 0x12, 0xf7,
+                                                        0x31, 0xf7, 0xb, 0x7, 0xf7, 0xf, 0xba, 0x38,
+                                                        0x27, 0xfb, 0x12, 0x46, 0x44, 0xfb, 0x1a, 0x1f,
+                                                        0xe, 0x7f, 0xe7, 0xf8, 0x13, 0xe7, 0xc1, 0xdf,
+                                                        0x12, 0xd9, 0xe8, 0xf7, 0x97, 0xe8, 0x17, 0x8a,
+                                                        0x7f, 0x15, 0xf7, 0x99, 0xe7, 0x32, 0xf7, 0xd6,
+                                                        0x6, 0xf7, 0x9b, 0xfc, 0x32, 0x5, 0xe4, 0xf8,
+                                                        0x79, 0xd9, 0xe7, 0xfb, 0x9e, 0x2f, 0xea, 0xfb,
+                                                        0xcb, 0x6, 0xfb, 0x8b, 0xf8, 0x27, 0x5, 0xfb,
+                                                        0x4c, 0x2f, 0xda, 0xfc, 0x1d, 0x3c, 0x6, 0xe8,
+                                                        0xf8, 0xc7, 0x15, 0xe0, 0x71, 0x5, 0xaf, 0x9a,
+                                                        0x97, 0xa6, 0xa7, 0x1b, 0xb2, 0x9f, 0x79, 0x7a,
+                                                        0xa2, 0x1f, 0x13, 0x60, 0x7d, 0x9e, 0x9f, 0x7f,
+                                                        0xac, 0x1b, 0xd7, 0xbb, 0xc7, 0xcb, 0x9a, 0x1f,
+                                                        0x38, 0xa5, 0x5, 0x75, 0x84, 0x7c, 0x5f, 0x68,
+                                                        0x1b, 0x6f, 0x7b, 0x99, 0x99, 0x79, 0x1f, 0x9b,
+                                                        0x77, 0x73, 0x9c, 0x5c, 0x1b, 0x3a, 0x5f, 0x48,
+                                                        0x55, 0x7c, 0x1f, 0xe, 0x61, 0xa, 0xf7, 0x72,
+                                                        0x54, 0xa, 0xa1, 0xf7, 0xa2, 0x2f, 0xa, 0xf7,
+                                                        0x2b, 0x2e, 0xf7, 0x1f, 0x26, 0xa, 0xa3, 0xf8,
+                                                        0x2a, 0x15, 0xf7, 0xd0, 0x40, 0xa5, 0xc5, 0xfb,
+                                                        0xbf, 0xf7, 0xe, 0x5, 0xe, 0x61, 0xa, 0xf7,
+                                                        0x72, 0x54, 0xa, 0xa1, 0xf7, 0xa2, 0x25, 0xa,
+                                                        0xd0, 0xf7, 0xdf, 0x15, 0xf7, 0xd4, 0xd5, 0x61,
+                                                        0xf5, 0xfb, 0xbe, 0xfb, 0xd, 0x5, 0xe, 0x61,
+                                                        0xa, 0xf7, 0x6e, 0x54, 0xa, 0xf7, 0x2b, 0xf8,
+                                                        0xee, 0x15, 0xf7, 0x2c, 0xf2, 0xf7, 0x2c, 0x24,
+                                                        0xc6, 0xaf, 0xfb, 0x35, 0xf7, 0x22, 0x5, 0x29,
+                                                        0x6, 0xfb, 0x3a, 0xfb, 0x21, 0x5, 0x48, 0xfc,
+                                                        0x5, 0x25, 0xa, 0xe, 0x61, 0xa, 0xbb, 0xdf,
+                                                        0x73, 0xdf, 0x90, 0x77, 0x12, 0xa1, 0xed, 0xf7,
+                                                        0xff, 0xea, 0x13, 0xd6, 0xe7, 0xf9, 0xe, 0x15,
+                                                        0xe3, 0x71, 0x5, 0xae, 0x99, 0x99, 0xa6, 0xa6,
+                                                        0x1b, 0xac, 0x9e, 0x7d, 0x7d, 0xa0, 0x1f, 0x13,
+                                                        0xee, 0x7d, 0xa0, 0xa2, 0x79, 0xb6, 0x1b, 0xd9,
+                                                        0xbe, 0xc6, 0xcb, 0x9a, 0x1f, 0x36, 0xa5, 0x5,
+                                                        0x75, 0x83, 0x7c, 0x60, 0x66, 0x1b, 0x6a, 0x7c,
+                                                        0x9d, 0x9b, 0x74, 0x1f, 0x13, 0xd6, 0x98, 0x78,
+                                                        0x72, 0x98, 0x5f, 0x1b, 0x39, 0x5e, 0x49, 0x55,
+                                                        0x7b, 0x1f, 0x45, 0xfc, 0x0, 0x25, 0xa, 0xe,
+                                                        0x79, 0xe4, 0xf8, 0x15, 0xe6, 0xd8, 0xf7, 0x10,
+                                                        0x1, 0xa1, 0xed, 0xae, 0xf7, 0x5, 0xd1, 0xf7,
+                                                        0x5, 0xab, 0xea, 0x3, 0xf7, 0xe6, 0xf9, 0xe,
+                                                        0x53, 0xa, 0xfb, 0x4b, 0xfb, 0x10, 0x53, 0xa,
+                                                        0xfb, 0x19, 0xfc, 0x7c, 0x25, 0xa, 0xe, 0xc7,
+                                                        0x76, 0xf8, 0x4b, 0x77, 0x1, 0xdc, 0xef, 0x15,
+                                                        0xc8, 0x4e, 0xf7, 0x32, 0xf7, 0x33, 0xf7, 0x32,
+                                                        0xfb, 0x33, 0xc8, 0xc8, 0xfb, 0x31, 0xf7, 0x32,
+                                                        0xf7, 0x30, 0xf7, 0x30, 0x4f, 0xc8, 0xfb, 0x33,
+                                                        0xfb, 0x30, 0xfb, 0x32, 0xf7, 0x33, 0x4e, 0x4f,
+                                                        0xf7, 0x33, 0xfb, 0x33, 0x5, 0xe, 0x7c, 0xe6,
+                                                        0x3e, 0x76, 0xf8, 0x93, 0xe8, 0x8d, 0x77, 0x12,
+                                                        0xa1, 0xee, 0xf8, 0x2, 0xe6, 0x13, 0x6c, 0xad,
+                                                        0xa3, 0x15, 0xcc, 0x5d, 0xba, 0xbf, 0x5, 0x13,
+                                                        0x9c, 0x6d, 0xbb, 0xc1, 0x7c, 0xc2, 0x1b, 0xf2,
+                                                        0xf7, 0x40, 0xd1, 0xf7, 0x76, 0xce, 0x78, 0xd3,
+                                                        0x61, 0xc4, 0x1f, 0xbc, 0xc6, 0x4b, 0xbb, 0x62,
+                                                        0x58, 0x5, 0x13, 0xac, 0xa9, 0x61, 0x56, 0x9e,
+                                                        0x4c, 0x1b, 0xfb, 0x44, 0x8a, 0x22, 0xfb, 0x24,
+                                                        0xfb, 0x30, 0x1a, 0x38, 0xa3, 0x4b, 0xb2, 0x5a,
+                                                        0x1e, 0xcd, 0xda, 0x15, 0x77, 0xa9, 0x81, 0xb9,
+                                                        0xb4, 0x1a, 0xe9, 0xc7, 0xf7, 0x6, 0xf7, 0xe,
+                                                        0xb2, 0xab, 0x80, 0x7a, 0xa4, 0x1e, 0xfb, 0x54,
+                                                        0xfb, 0xfa, 0x15, 0xf7, 0x8a, 0xf7, 0xbd, 0x5,
+                                                        0xa1, 0x6a, 0x97, 0x54, 0x6c, 0x1a, 0x38, 0x58,
+                                                        0xfb, 0xe, 0xfb, 0x19, 0x65, 0x6a, 0x95, 0x9c,
+                                                        0x72, 0x1e, 0xe, 0x4f, 0xa, 0xf7, 0x20, 0xf9,
+                                                        0x3b, 0x15, 0xf7, 0xca, 0x41, 0xa5, 0xc5, 0xfb,
+                                                        0xb9, 0xf7, 0xd, 0x5, 0xfb, 0x47, 0xfb, 0xd8,
+                                                        0x15, 0x27, 0xa, 0x4f, 0xa, 0xf7, 0x4d, 0xf8,
+                                                        0xf1, 0x15, 0xf7, 0xcd, 0xd4, 0x62, 0xf5, 0xfb,
+                                                        0xb9, 0x6a, 0xa, 0xfb, 0x34, 0xfb, 0x60, 0x15,
+                                                        0x27, 0xa, 0x79, 0xe6, 0xf8, 0x16, 0xe5, 0xf7,
+                                                        0x7b, 0x52, 0xa, 0xf7, 0x26, 0xf8, 0xef, 0x15,
+                                                        0xf7, 0x2a, 0xf1, 0xf7, 0x28, 0x25, 0xc5, 0xae,
+                                                        0xfb, 0x32, 0xf7, 0x22, 0x5, 0x2c, 0x6, 0xfb,
+                                                        0x37, 0xfb, 0x21, 0x5, 0x39, 0xfb, 0x47, 0x15,
+                                                        0x27, 0xa, 0x79, 0xe4, 0xf8, 0x11, 0xe3, 0xe1,
+                                                        0xf7, 0xe, 0x12, 0xdf, 0xea, 0x6d, 0xf7, 0x3,
+                                                        0xd0, 0xf7, 0x2, 0x7c, 0xea, 0x13, 0xec, 0xf7,
+                                                        0xdd, 0xf9, 0x10, 0x15, 0xf7, 0x2, 0xf7, 0xe,
+                                                        0xfb, 0x2, 0x6, 0xfb, 0x48, 0xfb, 0xe, 0x15,
+                                                        0xf7, 0x3, 0xf7, 0xe, 0x6b, 0xa, 0xfb, 0x25,
+                                                        0xfb, 0xbe, 0x15, 0x13, 0xf2, 0x27, 0xa, 0x8b,
+                                                        0xe5, 0xf8, 0x9, 0xe5, 0xf7, 0x7b, 0x77, 0x1,
+                                                        0xf7, 0x8e, 0xec, 0x3, 0xf7, 0x12, 0x16, 0xf7,
+                                                        0xeb, 0xe5, 0xfb, 0xe, 0xf7, 0x6, 0x6, 0xf7,
+                                                        0x34, 0xf7, 0x97, 0x5, 0xdc, 0xe5, 0xfb, 0x82,
+                                                        0x31, 0xc2, 0x6, 0x21, 0xfb, 0x41, 0x24, 0xf7,
+                                                        0x41, 0x5, 0xc0, 0xe5, 0xfb, 0x82, 0x31, 0xda,
+                                                        0x6, 0xf7, 0x34, 0xfb, 0x97, 0x5, 0xfb, 0x6,
+                                                        0xfb, 0x10, 0x7, 0xc9, 0xf8, 0x98, 0x15, 0xf7,
+                                                        0xce, 0xd4, 0x62, 0xf4, 0xfb, 0xbb, 0xfb, 0xb,
+                                                        0x5, 0xe, 0x8b, 0xe6, 0xbe, 0xdb, 0xf7, 0x9,
+                                                        0xdb, 0xbf, 0xe6, 0x1, 0xf7, 0x2a, 0xde, 0xf7,
+                                                        0x81, 0xdf, 0x3, 0xb8, 0x16, 0xf7, 0xc5, 0xe6,
+                                                        0xfb, 0x9, 0xbe, 0xf7, 0xf, 0x6, 0xee, 0xee,
+                                                        0x9c, 0xf7, 0x13, 0xf7, 0x29, 0xfb, 0x1d, 0x7b,
+                                                        0x28, 0x1f, 0x36, 0xbf, 0xf7, 0xb, 0xe6, 0xfb,
+                                                        0xc5, 0x30, 0xf2, 0xfc, 0x10, 0x22, 0x6, 0xf7,
+                                                        0x50, 0xf7, 0x17, 0x15, 0xf7, 0x9, 0xf7, 0x16,
+                                                        0x7, 0xb1, 0xd0, 0x8c, 0x50, 0x48, 0x47, 0x93,
+                                                        0x6a, 0x1f, 0xe, 0x7c, 0xe9, 0x39, 0xe9, 0xf7,
+                                                        0x90, 0xe9, 0xea, 0xe9, 0x12, 0x98, 0xf7, 0x46,
+                                                        0x2b, 0xeb, 0xf7, 0x78, 0xeb, 0x72, 0xec, 0x13,
+                                                        0x7a, 0x98, 0x88, 0x15, 0xf7, 0x46, 0xf8, 0x56,
+                                                        0x6, 0xdc, 0xab, 0x8f, 0xcf, 0xd7, 0xbf, 0x87,
+                                                        0x70, 0x6e, 0x55, 0x7d, 0x62, 0x75, 0x1e, 0x66,
+                                                        0x77, 0x63, 0x6e, 0x5a, 0x1a, 0x38, 0xd4, 0x71,
+                                                        0xd9, 0x6f, 0x1e, 0x13, 0xb9, 0xab, 0x80, 0xc7,
+                                                        0x7f, 0x62, 0x1a, 0x69, 0x5a, 0x73, 0x4e, 0x66,
+                                                        0x42, 0x97, 0xa5, 0x73, 0x1e, 0x6e, 0x34, 0x5,
+                                                        0x67, 0xc8, 0xb3, 0x82, 0xc1, 0x1b, 0xf7, 0x18,
+                                                        0xde, 0xd4, 0xe0, 0xe5, 0x3d, 0xa2, 0x42, 0xa3,
+                                                        0x1f, 0x5b, 0x9b, 0x5f, 0x9b, 0xa4, 0x1a, 0xa1,
+                                                        0xaf, 0x9b, 0xb0, 0x9c, 0x1e, 0x13, 0xb6, 0xc6,
+                                                        0xa6, 0xb2, 0x9f, 0xcb, 0x1a, 0xd5, 0x51, 0xbc,
+                                                        0xfb, 0x40, 0xfb, 0x3a, 0x73, 0x4a, 0xfb, 0x10,
+                                                        0x1e, 0x13, 0xba, 0x39, 0x2d, 0x6, 0x13, 0x76,
+                                                        0xdd, 0xfb, 0x90, 0x6, 0x13, 0x7a, 0x39, 0x6,
+                                                        0xe, 0x39, 0xa, 0xf7, 0x78, 0x77, 0x3b, 0xa,
+                                                        0xf7, 0x13, 0xf8, 0xc1, 0x15, 0xf7, 0xd5, 0x3f,
+                                                        0xa2, 0xc5, 0xfb, 0xc2, 0xf7, 0xe, 0x5, 0x42,
+                                                        0xfb, 0xf8, 0x51, 0xa, 0xaa, 0x70, 0x5b, 0x8a,
+                                                        0x21, 0xa, 0x39, 0xa, 0xf7, 0x78, 0x77, 0x3b,
+                                                        0xa, 0xf7, 0x42, 0xf8, 0x75, 0x15, 0xf7, 0xd5,
+                                                        0xd7, 0x61, 0xf3, 0xfb, 0xc2, 0xfb, 0xe, 0x5,
+                                                        0x54, 0xfb, 0x7e, 0x51, 0xa, 0xab, 0x70, 0x5b,
+                                                        0x89, 0x21, 0xa, 0x39, 0xa, 0xf7, 0x74, 0x77,
+                                                        0x3b, 0xa, 0xf7, 0x1a, 0xf8, 0x72, 0x15, 0xf7,
+                                                        0x2c, 0xf3, 0xf7, 0x2d, 0x23, 0xc7, 0xae, 0xfb,
+                                                        0x36, 0xf7, 0x24, 0x5, 0x27, 0x6, 0xfb, 0x3a,
+                                                        0xfb, 0x23, 0x5, 0xa4, 0xfb, 0x65, 0x15, 0x9b,
+                                                        0xa9, 0xf4, 0xa4, 0xd7, 0x1b, 0xbf, 0xa9, 0x70,
+                                                        0x5b, 0x21, 0xa, 0x39, 0xa, 0xf7, 0x7, 0xe0,
+                                                        0x8e, 0x77, 0x34, 0xa, 0x13, 0xbb, 0x0, 0xf7,
+                                                        0x32, 0xf8, 0x7a, 0x15, 0xa3, 0x98, 0x94, 0xb1,
+                                                        0xb1, 0x1b, 0xa0, 0xa8, 0x7a, 0x7b, 0xa9, 0x1f,
+                                                        0x7d, 0xa5, 0xa6, 0x7f, 0xa4, 0x1b, 0xf2, 0xac,
+                                                        0xe3, 0xad, 0x96, 0x1f, 0x13, 0xb7, 0x0, 0x35,
+                                                        0xa4, 0x5, 0x61, 0x78, 0x80, 0x76, 0x6e, 0x1b,
+                                                        0x77, 0x74, 0x96, 0x98, 0x74, 0x1f, 0x13, 0xbb,
+                                                        0x0, 0x9c, 0x6d, 0x6b, 0x9e, 0x6c, 0x1b, 0x28,
+                                                        0x6c, 0x3d, 0x5f, 0x79, 0x1f, 0xa4, 0xfb, 0x62,
+                                                        0x15, 0x9b, 0xa9, 0xf4, 0xa4, 0xd7, 0x1b, 0x3d,
+                                                        0xa, 0x13, 0x7a, 0x80, 0x4d, 0xa, 0x13, 0x7b,
+                                                        0x0, 0x2b, 0xa, 0x13, 0xbb, 0x0, 0x29, 0xa,
+                                                        0x39, 0xa, 0xcf, 0xf7, 0x10, 0x12, 0xab, 0xec,
+                                                        0x90, 0xf7, 0x5, 0xd4, 0xf7, 0x4, 0x60, 0xea,
+                                                        0x2c, 0xf7, 0x46, 0x13, 0xbf, 0x0, 0xf7, 0xd4,
+                                                        0xf8, 0x89, 0x15, 0xf7, 0x4, 0xf7, 0x10, 0xfb,
+                                                        0x4, 0x6, 0xfb, 0x4e, 0xfb, 0x10, 0x53, 0xa,
+                                                        0x65, 0xfb, 0xd4, 0x3f, 0xa, 0x13, 0xbe, 0x80,
+                                                        0x3d, 0xa, 0x13, 0x7e, 0x40, 0x4d, 0xa, 0x13,
+                                                        0x7e, 0x80, 0x2b, 0xa, 0x13, 0xbe, 0x80, 0x29,
+                                                        0xa, 0x39, 0xa, 0xba, 0xf7, 0x5a, 0x3b, 0xa,
+                                                        0xf7, 0x46, 0xf8, 0xe0, 0x15, 0x55, 0xbc, 0x62,
+                                                        0xc8, 0xc8, 0xbc, 0xb4, 0xc1, 0xc1, 0x5a, 0xaf,
+                                                        0x4e, 0x4e, 0x5a, 0x67, 0x55, 0x1e, 0xcc, 0x16,
+                                                        0xa0, 0xa0, 0x95, 0xa3, 0xa4, 0x9e, 0x81, 0x76,
+                                                        0x75, 0x78, 0x7e, 0x72, 0x73, 0x76, 0x98, 0xa1,
+                                                        0x1e, 0xfb, 0x27, 0xfb, 0xaf, 0x51, 0xa, 0xa6,
+                                                        0x70, 0x5b, 0x8e, 0x21, 0xa, 0x7c, 0xed, 0x3f,
+                                                        0x76, 0xf7, 0x53, 0xe8, 0x40, 0xe6, 0xd5, 0xe9,
+                                                        0x12, 0x89, 0xec, 0xf7, 0x29, 0xee, 0x13, 0xae,
+                                                        0xf7, 0xb9, 0xc5, 0x15, 0x52, 0xa6, 0xc6, 0x7b,
+                                                        0xcc, 0x1b, 0xc0, 0xc6, 0x99, 0xa0, 0xba, 0x1f,
+                                                        0x6b, 0xe7, 0x5, 0x73, 0x4d, 0x62, 0x86, 0x74,
+                                                        0x1b, 0x37, 0x7d, 0xd1, 0xa0, 0x1f, 0x8e, 0xf7,
+                                                        0x89, 0x7, 0x8d, 0x9f, 0x8c, 0x9e, 0x9e, 0x1a,
+                                                        0xf7, 0x11, 0x5d, 0xe9, 0xfb, 0xa, 0x5f, 0x5b,
+                                                        0x78, 0x68, 0x6e, 0x1e, 0x7f, 0xb0, 0x5b, 0x9a,
+                                                        0x54, 0x8c, 0x48, 0x8c, 0x3e, 0x78, 0x6e, 0x74,
+                                                        0xa5, 0x39, 0x18, 0x9b, 0xb5, 0xc0, 0x99, 0xb6,
+                                                        0x1b, 0xbb, 0x97, 0x7a, 0x4d, 0x89, 0x1f, 0x13,
+                                                        0x5e, 0x8d, 0x73, 0x78, 0x8e, 0x66, 0x1b, 0xfb,
+                                                        0xb, 0x5c, 0x31, 0x44, 0x3d, 0xc4, 0x4e, 0xe1,
+                                                        0xd3, 0xbb, 0xb9, 0xa5, 0xab, 0x1f, 0x13, 0xae,
+                                                        0xbd, 0xf7, 0x68, 0x15, 0xc8, 0x8f, 0xb3, 0xa8,
+                                                        0xb5, 0x1b, 0xc4, 0x96, 0x47, 0x75, 0x8d, 0x1f,
+                                                        0xfb, 0x93, 0xfb, 0x1d, 0x15, 0x6e, 0x6f, 0x69,
+                                                        0x73, 0x62, 0x1b, 0x79, 0x6f, 0x98, 0xad, 0x1f,
+                                                        0x13, 0x9e, 0xb0, 0xa3, 0xaa, 0xc3, 0x9e, 0xa2,
+                                                        0x88, 0x84, 0xa6, 0x1e, 0xe, 0xfb, 0x4d, 0x76,
+                                                        0xf7, 0x5b, 0xe7, 0xf7, 0xa2, 0xe9, 0x12, 0xba,
+                                                        0xec, 0xf7, 0x13, 0xf7, 0x21, 0x95, 0xeb, 0x17,
+                                                        0xf7, 0x80, 0xfb, 0x45, 0x15, 0x7a, 0xa0, 0xa6,
+                                                        0x7f, 0xaa, 0x1b, 0xcc, 0xab, 0xbe, 0xbd, 0xa6,
+                                                        0x82, 0xb7, 0x5a, 0x97, 0x1f, 0x9d, 0x7, 0xd5,
+                                                        0x97, 0xd0, 0xad, 0xc2, 0xb7, 0x55, 0xd4, 0x18,
+                                                        0x62, 0x51, 0x55, 0x6a, 0x3c, 0x1b, 0x39, 0x3a,
+                                                        0xb8, 0xe9, 0xdb, 0xca, 0xbe, 0xf3, 0xb2, 0xb3,
+                                                        0x8b, 0x7c, 0xab, 0x1f, 0x30, 0xeb, 0xf7, 0x5c,
+                                                        0x2b, 0x82, 0x7, 0x95, 0x68, 0x65, 0x8a, 0x65,
+                                                        0x1b, 0xfb, 0x49, 0x38, 0xfb, 0x4, 0xfb, 0x3,
+                                                        0xfb, 0x21, 0xf7, 0x3, 0x39, 0xf7, 0x9, 0x81,
+                                                        0x1f, 0x84, 0x2e, 0x5, 0x8c, 0x95, 0xa0, 0x91,
+                                                        0x9b, 0x1b, 0x97, 0x94, 0x85, 0x7c, 0x7d, 0x80,
+                                                        0x84, 0x7d, 0x7a, 0x77, 0x8f, 0x94, 0x82, 0x1f,
+                                                        0xe, 0x55, 0xa, 0xf7, 0x77, 0x77, 0x1, 0xf7,
+                                                        0x1e, 0xf8, 0xc3, 0x15, 0xf7, 0xd2, 0x3f, 0xa1,
+                                                        0xc6, 0xfb, 0xbd, 0xf7, 0xb, 0x5, 0x5e, 0xfc,
+                                                        0x7f, 0x24, 0xa, 0x55, 0xa, 0xf7, 0x77, 0x77,
+                                                        0x1, 0xf7, 0x4d, 0xf8, 0x76, 0x15, 0xf7, 0xd3,
+                                                        0xd7, 0x60, 0xf2, 0xfb, 0xbf, 0x6a, 0xa, 0x71,
+                                                        0xfc, 0x7, 0x24, 0xa, 0x55, 0xa, 0xf7, 0x73,
+                                                        0x77, 0x1, 0xf7, 0x23, 0xf8, 0x73, 0x15, 0xf7,
+                                                        0x2c, 0xf2, 0xf7, 0x2c, 0x24, 0xc7, 0xad, 0xfb,
+                                                        0x36, 0xf7, 0x24, 0x5, 0x28, 0x6, 0xfb, 0x39,
+                                                        0xfb, 0x23, 0x5, 0xc2, 0xfb, 0xec, 0x24, 0xa,
+                                                        0x55, 0xa, 0xcc, 0xf7, 0x12, 0x1, 0xf7, 0x24,
+                                                        0xf7, 0x4, 0xd2, 0xf7, 0x4, 0x3, 0xf7, 0xdb,
+                                                        0xf8, 0x87, 0x72, 0xa, 0xfb, 0x4b, 0xfb, 0x12,
+                                                        0x72, 0xa, 0x83, 0xfc, 0x5b, 0x24, 0xa, 0x57,
+                                                        0xa, 0xf7, 0x17, 0xf8, 0xc2, 0x15, 0xf7, 0xd4,
+                                                        0x40, 0xa3, 0xc5, 0xfb, 0xc1, 0xf7, 0xc, 0x5,
+                                                        0x2a, 0xfd, 0x29, 0x33, 0xa, 0x57, 0xa, 0xf7,
+                                                        0x48, 0xf8, 0x77, 0x15, 0xf7, 0xd2, 0xd6, 0x61,
+                                                        0xf2, 0xfb, 0xc0, 0x6a, 0xa, 0x3c, 0xfc, 0xb1,
+                                                        0x33, 0xa, 0x8b, 0xe5, 0xf7, 0x84, 0xe6, 0xf7,
+                                                        0x80, 0x77, 0x1, 0xf7, 0x8d, 0xf1, 0x3, 0xd1,
+                                                        0xf8, 0x98, 0x15, 0xcb, 0x67, 0xf7, 0x31, 0xf1,
+                                                        0xf7, 0x31, 0x25, 0xc9, 0xae, 0xfb, 0x3b, 0xf7,
+                                                        0x22, 0x5, 0x24, 0x6, 0xfb, 0x30, 0xfd, 0x25,
+                                                        0x33, 0xa, 0x8b, 0xe6, 0xf7, 0x86, 0xe6, 0xd7,
+                                                        0xf7, 0x11, 0x12, 0xf7, 0x20, 0xf7, 0x4, 0x8a,
+                                                        0xec, 0x72, 0xf7, 0x5, 0x13, 0xf4, 0xf7, 0xd7,
+                                                        0xf8, 0x88, 0x15, 0xf7, 0x5, 0xf7, 0x11, 0xfb,
+                                                        0x5, 0x6, 0xfb, 0x4b, 0xfb, 0x11, 0x15, 0xf7,
+                                                        0x4, 0xf7, 0x11, 0xfb, 0x4, 0x6, 0x4c, 0xfd,
+                                                        0x5, 0x15, 0xf8, 0x52, 0xe6, 0x6, 0x13, 0xe8,
+                                                        0xfb, 0x43, 0xf7, 0xe1, 0xfb, 0x7e, 0x30, 0xf7,
+                                                        0x1d, 0xfb, 0x86, 0xfb, 0x42, 0x6, 0xe, 0x70,
+                                                        0xe3, 0xf7, 0x96, 0xe4, 0xf7, 0x6e, 0x77, 0x1,
+                                                        0xc4, 0xe8, 0xf7, 0xc1, 0xe6, 0x3, 0xf7, 0x51,
+                                                        0xf8, 0x48, 0x15, 0xf7, 0x5, 0xc2, 0xd1, 0x62,
+                                                        0xb7, 0x47, 0x8c, 0x87, 0x19, 0x9d, 0x6d, 0x77,
+                                                        0x97, 0x4c, 0x1b, 0xfb, 0x39, 0x39, 0xfb, 0x0,
+                                                        0xfb, 0x3, 0xfb, 0x0, 0xdd, 0xfb, 0x0, 0xf7,
+                                                        0x37, 0xf7, 0x3a, 0xd5, 0xf7, 0x3, 0xf7, 0x17,
+                                                        0xf7, 0x44, 0xfb, 0xa, 0xf6, 0x59, 0xaa, 0x1f,
+                                                        0xea, 0xb5, 0x6c, 0xc1, 0xfb, 0x15, 0x4e, 0x6f,
+                                                        0x9d, 0x3c, 0xb0, 0x63, 0x92, 0x19, 0x70, 0x4f,
+                                                        0xad, 0x83, 0xad, 0x7b, 0xab, 0x7d, 0x19, 0x3b,
+                                                        0x65, 0x5, 0x86, 0xfb, 0xc2, 0x15, 0xe7, 0xdb,
+                                                        0xb2, 0xd1, 0xf5, 0xb8, 0x49, 0x4c, 0x30, 0x3d,
+                                                        0x65, 0x45, 0x40, 0x3d, 0xb0, 0xe5, 0x1e, 0xe,
+                                                        0x8b, 0xe7, 0xf7, 0x97, 0xe5, 0x31, 0xe7, 0xf7,
+                                                        0x55, 0x77, 0x12, 0x98, 0xf7, 0x46, 0x2b, 0xeb,
+                                                        0xf7, 0x72, 0xeb, 0x13, 0xda, 0xe8, 0xf8, 0x95,
+                                                        0x15, 0xe1, 0x71, 0x96, 0x9f, 0x93, 0xad, 0xa1,
+                                                        0x8d, 0x19, 0xa1, 0x8d, 0xa4, 0x82, 0xb1, 0x77,
+                                                        0x8, 0x7e, 0xa4, 0xa8, 0x7e, 0xac, 0x1b, 0xf0,
+                                                        0xab, 0xe3, 0xad, 0x97, 0x1f, 0x35, 0xa3, 0x5,
+                                                        0x62, 0x79, 0x81, 0x76, 0x6e, 0x1b, 0x79, 0x77,
+                                                        0x94, 0x96, 0x77, 0x1f, 0x9c, 0x6b, 0x6a, 0xa2,
+                                                        0x6a, 0x1b, 0x2a, 0x6d, 0x3d, 0x60, 0x79, 0x1f,
+                                                        0x3c, 0xfc, 0x95, 0x15, 0xf7, 0x95, 0xe7, 0x3b,
+                                                        0xf7, 0x56, 0x6, 0xb6, 0xbd, 0xce, 0xa1, 0xa9,
+                                                        0x1b, 0xd0, 0x91, 0x6c, 0x64, 0x1f, 0xfb, 0x51,
+                                                        0x3d, 0x2f, 0xf7, 0x90, 0xe7, 0x3d, 0xf7, 0x66,
+                                                        0x7, 0xe6, 0x43, 0xbb, 0x31, 0x53, 0x51, 0x70,
+                                                        0x70, 0x61, 0x1e, 0x13, 0xba, 0xc3, 0xfb, 0x46,
+                                                        0x2f, 0x7, 0x13, 0xb6, 0xdd, 0xfb, 0x97, 0x3a,
+                                                        0x6, 0xe, 0x7b, 0xe7, 0xf7, 0xa0, 0xe7, 0xf7,
+                                                        0x75, 0x77, 0x4b, 0xa, 0xf7, 0x24, 0xf8, 0xc1,
+                                                        0x15, 0xf7, 0xda, 0x40, 0xa2, 0xc5, 0xfb, 0xc7,
+                                                        0xf7, 0xd, 0x5, 0xfb, 0x30, 0xfc, 0x5a, 0x23,
+                                                        0xa, 0x62, 0xa, 0xf7, 0x75, 0x77, 0x4b, 0xa,
+                                                        0xf7, 0x53, 0xf8, 0x76, 0x15, 0xf7, 0xda, 0xd6,
+                                                        0x61, 0xf3, 0xfb, 0xc7, 0xfb, 0xd, 0x5, 0xfb,
+                                                        0x1e, 0xfb, 0xe1, 0x23, 0xa, 0x62, 0xa, 0xf7,
+                                                        0x71, 0x77, 0x4b, 0xa, 0xf7, 0x2a, 0xf8, 0x72,
+                                                        0x15, 0xf7, 0x30, 0xf3, 0xf7, 0x2f, 0x23, 0xc7,
+                                                        0xad, 0xfb, 0x38, 0xf7, 0x25, 0x5, 0x24, 0x6,
+                                                        0xfb, 0x3b, 0xfb, 0x23, 0x5, 0x52, 0xfb, 0xc7,
+                                                        0x23, 0xa, 0x62, 0xa, 0xf7, 0x5, 0xe0, 0x8d,
+                                                        0x77, 0x12, 0xa9, 0xef, 0xf7, 0xe9, 0xee, 0x13,
+                                                        0xec, 0xe3, 0xf8, 0x94, 0x15, 0xe4, 0x71, 0x5,
+                                                        0xa5, 0x96, 0x98, 0xb0, 0xae, 0x1b, 0x9f, 0xa0,
+                                                        0x7e, 0x7d, 0xa3, 0x1f, 0x7b, 0xa7, 0xa9, 0x7a,
+                                                        0xb0, 0x1b, 0xf5, 0xac, 0xe4, 0xad, 0x95, 0x1f,
+                                                        0x13, 0xdc, 0x33, 0xa3, 0x5, 0x62, 0x79, 0x81,
+                                                        0x76, 0x6d, 0x1b, 0x74, 0x71, 0x99, 0x9a, 0x70,
+                                                        0x1f, 0x13, 0xec, 0x9a, 0x6f, 0x6e, 0x9b, 0x6f,
+                                                        0x1b, 0x26, 0x6b, 0x3d, 0x5f, 0x7a, 0x1f, 0x51,
+                                                        0xfb, 0xc5, 0x23, 0xa, 0x62, 0xa, 0xca, 0xf7,
+                                                        0x12, 0x1, 0xa9, 0xef, 0xa0, 0xf7, 0x6, 0xd5,
+                                                        0xf7, 0x6, 0x9d, 0xee, 0x3, 0xf7, 0xe7, 0xf8,
+                                                        0x87, 0x70, 0xa, 0xfb, 0x50, 0xfb, 0x12, 0x70,
+                                                        0xa, 0xfb, 0xd, 0xfc, 0x36, 0x23, 0xa, 0x9b,
+                                                        0xf7, 0x1d, 0xbd, 0xf7, 0x2, 0xbd, 0xf7, 0x1d,
+                                                        0x1, 0xf7, 0x79, 0xf7, 0x28, 0x14, 0xe0, 0x5c,
+                                                        0xa, 0xf7, 0x32, 0xf7, 0xa, 0x15, 0x49, 0xa,
+                                                        0xfb, 0xef, 0x4, 0x49, 0xa, 0xe, 0x7a, 0xe9,
+                                                        0x3b, 0x76, 0xf8, 0x1c, 0xea, 0x12, 0xa9, 0xed,
+                                                        0xf7, 0xed, 0xec, 0x13, 0x78, 0xb2, 0xa9, 0x15,
+                                                        0x8d, 0xc1, 0x56, 0x8a, 0x8d, 0x1f, 0x8b, 0xa1,
+                                                        0x9e, 0xaa, 0xa7, 0x1e, 0x13, 0xb8, 0x72, 0xb6,
+                                                        0xbe, 0x7c, 0xc3, 0x1b, 0xf7, 0x29, 0xf7, 0xd,
+                                                        0xf6, 0xf7, 0x18, 0xc0, 0x77, 0xbd, 0x69, 0xb3,
+                                                        0x1f, 0xa7, 0xa6, 0x9b, 0x9c, 0x8b, 0x8b, 0x53,
+                                                        0xbf, 0x8a, 0x1a, 0x8b, 0x77, 0x7f, 0x6c, 0x6e,
+                                                        0x1e, 0xa6, 0x60, 0x56, 0x9c, 0x52, 0x1b, 0xfb,
+                                                        0x29, 0xfb, 0xd, 0xfb, 0x1, 0xfb, 0x18, 0x53,
+                                                        0xa0, 0x59, 0xaf, 0x62, 0x1f, 0x6d, 0x6f, 0x79,
+                                                        0x7a, 0x8b, 0x1a, 0xf7, 0xa, 0xf7, 0x3, 0x15,
+                                                        0x78, 0xa2, 0x81, 0xa6, 0xa9, 0x1a, 0xdb, 0xd8,
+                                                        0xce, 0xea, 0xa7, 0xa7, 0x83, 0x81, 0xa3, 0x1e,
+                                                        0x45, 0x4a, 0x36, 0x3b, 0x47, 0x4b, 0x8, 0xcd,
+                                                        0x5a, 0x15, 0xd0, 0xcb, 0xe1, 0xdb, 0xce, 0xca,
+                                                        0x8, 0x9d, 0x75, 0x95, 0x70, 0x6e, 0x1a, 0x3b,
+                                                        0x3d, 0x4b, 0x2c, 0x6f, 0x71, 0x90, 0x95, 0x74,
+                                                        0x1e, 0xe, 0x3c, 0xa, 0xf7, 0x17, 0xf8, 0xc3,
+                                                        0x15, 0xf7, 0xcc, 0x3d, 0xa2, 0xc7, 0xfb, 0xbc,
+                                                        0xf7, 0xc, 0x5, 0xfb, 0x2f, 0xfb, 0xde, 0x28,
+                                                        0xa, 0x3c, 0xa, 0xf7, 0x43, 0xf8, 0x76, 0x15,
+                                                        0xf7, 0xcf, 0xd7, 0x62, 0xf2, 0xfb, 0xbd, 0x6a,
+                                                        0xa, 0xfb, 0x1d, 0xfb, 0x66, 0x28, 0xa, 0x4a,
+                                                        0xa, 0xf7, 0x7f, 0x36, 0xa, 0xf7, 0x1d, 0xf8,
+                                                        0x71, 0x15, 0xf7, 0x2a, 0xf4, 0xf7, 0x29, 0x22,
+                                                        0xc6, 0xae, 0xfb, 0x34, 0xf7, 0x25, 0x5, 0x2b,
+                                                        0x6, 0xfb, 0x37, 0xfb, 0x24, 0x5, 0x4e, 0xfb,
+                                                        0x4a, 0x28, 0xa, 0x4a, 0xa, 0xd9, 0xf7, 0x11,
+                                                        0x12, 0x9a, 0xf7, 0x42, 0x2e, 0xe8, 0x5a, 0xf7,
+                                                        0x2, 0xd0, 0xf7, 0x2, 0x29, 0xf7, 0x41, 0x2d,
+                                                        0xe9, 0x2d, 0xf7, 0x43, 0x13, 0xb3, 0x0, 0xf7,
+                                                        0xd3, 0xf8, 0x88, 0x6f, 0xa, 0xfb, 0x47, 0xfb,
+                                                        0x11, 0x6f, 0xa, 0x13, 0xb9, 0x0, 0xfb, 0x11,
+                                                        0xfb, 0xba, 0x15, 0x13, 0xb4, 0x40, 0x2e, 0xa,
+                                                        0x13, 0x78, 0x20, 0x64, 0xf7, 0x43, 0xe6, 0x7,
+                                                        0x13, 0x78, 0x80, 0x3a, 0xf7, 0xe1, 0xfb, 0x41,
+                                                        0x30, 0x6, 0x13, 0xb8, 0x40, 0x2c, 0xa, 0xfb,
+                                                        0x22, 0xe2, 0xf8, 0x26, 0xe2, 0xf7, 0x77, 0x77,
+                                                        0x1, 0xf7, 0x59, 0xf8, 0x7f, 0x15, 0xf7, 0xcf,
+                                                        0xd2, 0x62, 0xee, 0xfb, 0xbe, 0xfb, 0x7, 0x5,
+                                                        0xfb, 0x19, 0xfc, 0xed, 0x15, 0x34, 0xf7, 0xc9,
+                                                        0xe2, 0x33, 0x3a, 0xa, 0xfb, 0xa7, 0x35, 0xfb,
+                                                        0x13, 0x5, 0xe, 0xfb, 0x22, 0xe4, 0xe0, 0xe3,
+                                                        0xf7, 0x9a, 0xe4, 0xcd, 0xe4, 0x12, 0x93, 0xf7,
+                                                        0x49, 0x29, 0xed, 0xf7, 0xc4, 0xee, 0x13, 0xfa,
+                                                        0x93, 0x56, 0x15, 0x32, 0xf7, 0xe1, 0xe4, 0xfb,
+                                                        0x2c, 0xf7, 0x18, 0x7, 0x7d, 0xa1, 0xc3, 0x6a,
+                                                        0xde, 0x1b, 0xf7, 0x21, 0xf0, 0xee, 0xf7, 0x10,
+                                                        0xf7, 0x2b, 0xfb, 0x23, 0xcc, 0x24, 0x51, 0x51,
+                                                        0x7b, 0x6d, 0x62, 0x1f, 0xf7, 0x5d, 0xfb, 0x49,
+                                                        0x32, 0x7, 0x13, 0xf6, 0xde, 0xfc, 0xe2, 0x6,
+                                                        0x13, 0xfa, 0xe9, 0xf7, 0xc6, 0x15, 0xf7, 0x2,
+                                                        0xf7, 0x9, 0x9e, 0xb4, 0xdb, 0xd1, 0x5d, 0x38,
+                                                        0x3b, 0x43, 0x56, 0x3c, 0x5c, 0xfb, 0x2, 0xa5,
+                                                        0xf6, 0x1e, 0xe, 0xfb, 0x22, 0xe1, 0xf8, 0x26,
+                                                        0xe2, 0xd3, 0xf7, 0xc, 0x1, 0xf7, 0x31, 0xf7,
+                                                        0x3, 0xd2, 0xf7, 0x3, 0x3, 0xf7, 0xe7, 0xf8,
+                                                        0x8d, 0x15, 0xf7, 0x3, 0xf7, 0xc, 0x6b, 0xa,
+                                                        0xfb, 0x4a, 0xfb, 0xc, 0x15, 0xf7, 0x3, 0xf7,
+                                                        0xc, 0x6b, 0xa, 0xfb, 0x9, 0xfd, 0x3d, 0x15,
+                                                        0x35, 0xf7, 0xbf, 0xe1, 0x3d, 0x3a, 0xa, 0xfb,
+                                                        0xa5, 0x35, 0xfb, 0x15, 0x5, 0xe, 0x8b, 0xe6,
+                                                        0xf7, 0xf2, 0xe6, 0x4e, 0xe6, 0xb6, 0xf7, 0x23,
+                                                        0x12, 0xf7, 0x8f, 0xf0, 0x13, 0xb8, 0x66, 0xa,
+                                                        0xe6, 0xfb, 0x3f, 0x6, 0x13, 0xd8, 0xf7, 0xf2,
+                                                        0x74, 0xa, 0xfb, 0xf2, 0xfb, 0x42, 0x7, 0xf7,
+                                                        0x3d, 0xf8, 0x96, 0x79, 0xa, 0x6b, 0xa, 0xe,
+                                                        0x7c, 0xa, 0x40, 0xa, 0xf7, 0xed, 0xfb, 0x7f,
+                                                        0x2d, 0xf7, 0x1c, 0xfb, 0x8f, 0xfb, 0x41, 0x6,
+                                                        0xe, 0x79, 0xe6, 0xf8, 0x22, 0xe6, 0x1, 0xcb,
+                                                        0xf0, 0xf3, 0xed, 0xf0, 0xeb, 0x3, 0x7c, 0x79,
+                                                        0x15, 0xf7, 0x99, 0xe6, 0x3a, 0xf8, 0x22, 0xd9,
+                                                        0xe6, 0xfb, 0x95, 0x30, 0xd9, 0xfc, 0x22, 0x3c,
+                                                        0x6, 0xf7, 0xb0, 0x74, 0x15, 0x78, 0x9e, 0xa2,
+                                                        0x5a, 0xf5, 0x1b, 0xf7, 0x12, 0xa0, 0xd5, 0xf7,
+                                                        0x1f, 0x1f, 0xf7, 0xa7, 0xbe, 0xe7, 0xfb, 0x9a,
+                                                        0x2f, 0xf7, 0x7, 0xfb, 0xa8, 0x7, 0x49, 0x8a,
+                                                        0x53, 0x56, 0x5b, 0x8c, 0x78, 0xa, 0xfb, 0x23,
+                                                        0xe4, 0x32, 0xea, 0xf8, 0x31, 0xe6, 0x80, 0x77,
+                                                        0xe4, 0xf7, 0x24, 0x12, 0xae, 0xf7, 0x25, 0xfb,
+                                                        0x3, 0xf7, 0x3, 0x29, 0xed, 0xf7, 0x9f, 0xf7,
+                                                        0xa, 0x13, 0xac, 0x80, 0xd0, 0xf8, 0x97, 0x79,
+                                                        0xa, 0x6, 0x13, 0x5a, 0x80, 0x6b, 0xa, 0x56,
+                                                        0xfd, 0x56, 0x15, 0x2c, 0xf7, 0x77, 0xea, 0x4c,
+                                                        0xf8, 0x81, 0x7, 0x13, 0x9c, 0x80, 0xfb, 0x25,
+                                                        0x2b, 0x6, 0x13, 0x69, 0x80, 0xba, 0xfc, 0x21,
+                                                        0x6, 0xf8, 0x1, 0xf8, 0xc6, 0x73, 0xa, 0xfb,
+                                                        0x24, 0xfd, 0x49, 0x15, 0x73, 0x30, 0x5, 0x87,
+                                                        0xa9, 0x9a, 0x7b, 0xc8, 0x1b, 0xf7, 0x63, 0x82,
+                                                        0xf7, 0x1b, 0xc6, 0x1f, 0xf8, 0x2c, 0xfb, 0x80,
+                                                        0x30, 0xf7, 0x18, 0xfb, 0xcd, 0x7, 0x46, 0x81,
+                                                        0x66, 0x3b, 0x64, 0x7d, 0x94, 0x95, 0x6a, 0x1e,
+                                                        0xe, 0x32, 0xa, 0xf7, 0x17, 0xed, 0xf7, 0x85,
+                                                        0xee, 0x3, 0xa9, 0x16, 0xf8, 0xaf, 0xf7, 0x9c,
+                                                        0x28, 0xfb, 0x41, 0xfb, 0x85, 0xf7, 0x2e, 0x6,
+                                                        0xf7, 0x36, 0xbb, 0x5, 0xc9, 0x7, 0xfb, 0x36,
+                                                        0x5d, 0x5, 0xf7, 0x36, 0xf7, 0x13, 0xe6, 0xfb,
+                                                        0xda, 0x30, 0xf0, 0xfb, 0x50, 0x7, 0x36, 0x73,
+                                                        0x5, 0x4c, 0x7, 0xe0, 0xa1, 0x5, 0xfb, 0x13,
+                                                        0x26, 0x7, 0xe, 0x8b, 0xe9, 0xf8, 0x4a, 0x40,
+                                                        0xa, 0xf7, 0x68, 0x6, 0xf7, 0x12, 0xaf, 0x5,
+                                                        0xcd, 0x7, 0xfb, 0x12, 0x67, 0x5, 0xf7, 0x92,
+                                                        0xfb, 0x9e, 0x2d, 0xf7, 0x3b, 0xfb, 0x4f, 0x7,
+                                                        0xfb, 0x9, 0x69, 0x5, 0x4b, 0x7, 0xf7, 0x9,
+                                                        0xab, 0x5, 0xfb, 0x4d, 0xfb, 0x41, 0x7, 0xe,
+                                                        0x8b, 0xe6, 0x30, 0xf7, 0x3e, 0xa0, 0xf7, 0x4f,
+                                                        0x94, 0xf7, 0x43, 0x30, 0xe6, 0x12, 0x81, 0xe9,
+                                                        0xf7, 0x6f, 0xea, 0xaf, 0xd6, 0xa5, 0xd6, 0x13,
+                                                        0xaf, 0x80, 0xf8, 0x22, 0xe6, 0x15, 0xf7, 0x2b,
+                                                        0xaf, 0x58, 0xd6, 0xf7, 0x4f, 0x40, 0x5d, 0x67,
+                                                        0xf7, 0x1f, 0xf7, 0x1d, 0x7, 0x13, 0xb7, 0x80,
+                                                        0x37, 0xd6, 0xf7, 0x43, 0xfc, 0x16, 0x7, 0xfb,
+                                                        0xe, 0xfb, 0x4, 0xfb, 0x7, 0xfb, 0x43, 0xfb,
+                                                        0x43, 0xf7, 0x5, 0x2a, 0xf2, 0x1f, 0xf8, 0x28,
+                                                        0x6, 0x13, 0x77, 0x80, 0xf7, 0x3e, 0x40, 0x7,
+                                                        0x13, 0xaf, 0x80, 0x3c, 0x7, 0xfb, 0x7c, 0xbc,
+                                                        0x15, 0x5c, 0x5d, 0x89, 0x79, 0x23, 0x58, 0xd3,
+                                                        0xf7, 0x1, 0xf7, 0xf, 0xd2, 0xd7, 0xe8, 0x9b,
+                                                        0xb2, 0x8a, 0x66, 0x1e, 0xe, 0x7c, 0xe9, 0xec,
+                                                        0xea, 0xe3, 0xea, 0x1, 0x7d, 0xed, 0xf7, 0x3a,
+                                                        0xed, 0x3, 0xf7, 0xf5, 0xf7, 0x44, 0x15, 0xf7,
+                                                        0x8f, 0x6, 0xf7, 0xf, 0x9d, 0x61, 0xf7, 0x2f,
+                                                        0xfb, 0x23, 0x1b, 0x5c, 0x60, 0x78, 0x68, 0x6a,
+                                                        0x1f, 0xb1, 0x6a, 0x58, 0x9b, 0x57, 0x1b, 0xfb,
+                                                        0x18, 0x4f, 0x22, 0xfb, 0x1c, 0x49, 0x9b, 0xfb,
+                                                        0x36, 0xf7, 0x39, 0xd1, 0xba, 0xb8, 0xa2, 0x9d,
+                                                        0x1f, 0x6a, 0xaa, 0xa8, 0x68, 0xe5, 0x1b, 0xc4,
+                                                        0xbe, 0x9a, 0xa0, 0xc2, 0x1f, 0x73, 0xe6, 0x5,
+                                                        0x73, 0x4d, 0x53, 0x82, 0x74, 0x1b, 0x38, 0x7d,
+                                                        0xd6, 0x9f, 0x1f, 0x86, 0xec, 0x15, 0xb3, 0x8f,
+                                                        0xa7, 0xbb, 0xc1, 0x1b, 0xcf, 0x93, 0x48, 0x76,
+                                                        0x8c, 0x1f, 0xfc, 0x3f, 0x51, 0x15, 0xab, 0x8b,
+                                                        0xf7, 0x6, 0xe6, 0xd3, 0x8e, 0xfb, 0x2, 0x67,
+                                                        0x67, 0x87, 0x29, 0x3a, 0x47, 0x7e, 0xef, 0xad,
+                                                        0x1e, 0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x7d, 0xf4,
+                                                        0xf7, 0xc, 0xf1, 0xf7, 0xa, 0xf7, 0x2, 0x12,
+                                                        0xba, 0xf7, 0x0, 0x30, 0xf1, 0xd9, 0xf7, 0x2e,
+                                                        0xa5, 0xf6, 0x39, 0xf3, 0x13, 0xfa, 0x80, 0xba,
+                                                        0xa6, 0x15, 0xf7, 0x0, 0xb9, 0x6, 0xa6, 0x80,
+                                                        0xa9, 0x7e, 0xab, 0x82, 0x8, 0xfb, 0x13, 0x7,
+                                                        0x8d, 0x95, 0x9c, 0x92, 0x9d, 0x1b, 0x9d, 0x95,
+                                                        0x81, 0x78, 0x7c, 0x7e, 0x7e, 0x7d, 0x8a, 0x1f,
+                                                        0x74, 0x89, 0x78, 0x93, 0x81, 0x94, 0x6e, 0x55,
+                                                        0x18, 0x79, 0xa1, 0xa9, 0x7e, 0xac, 0x1b, 0xd0,
+                                                        0xae, 0xc2, 0xc0, 0xa8, 0x81, 0xbb, 0x57, 0x97,
+                                                        0x1f, 0x8c, 0xaf, 0x5, 0xf7, 0xc, 0x90, 0xeb,
+                                                        0xcd, 0xf2, 0x1a, 0xf7, 0x11, 0xfb, 0xc, 0xaa,
+                                                        0x2f, 0x88, 0x1e, 0x13, 0xf7, 0x0, 0x28, 0x92,
+                                                        0x3f, 0x93, 0xb7, 0x1a, 0xbf, 0xed, 0x92, 0xa3,
+                                                        0xb9, 0xbf, 0x73, 0x75, 0xb1, 0x1e, 0x54, 0xf6,
+                                                        0xf7, 0x67, 0x20, 0x63, 0x7, 0x9b, 0x62, 0x55,
+                                                        0xa3, 0x59, 0x1b, 0x27, 0xfb, 0x7, 0x5d, 0xfb,
+                                                        0xd, 0xfb, 0x25, 0xf7, 0x35, 0x7f, 0xdb, 0x85,
+                                                        0x1f, 0x13, 0xfa, 0x80, 0xb3, 0x88, 0xf3, 0x98,
+                                                        0x4e, 0x1a, 0x62, 0x43, 0x6f, 0x4f, 0x3e, 0x52,
+                                                        0xb3, 0x96, 0x6f, 0x1e, 0xd2, 0xfb, 0x0, 0x7,
+                                                        0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x59, 0xe3, 0xf1,
+                                                        0xe1, 0x99, 0xf7, 0x46, 0x2e, 0xe8, 0x12, 0xcd,
+                                                        0xef, 0x35, 0xe1, 0x35, 0xea, 0xd3, 0xf7, 0x23,
+                                                        0xa3, 0xee, 0x3f, 0xeb, 0x13, 0xf4, 0xa0, 0xcd,
+                                                        0x82, 0x15, 0xef, 0xb1, 0x6, 0xa4, 0x82, 0xa6,
+                                                        0x80, 0xa8, 0x84, 0x8, 0xfb, 0x0, 0x7, 0x8d,
+                                                        0x95, 0x9a, 0x91, 0x9b, 0x1b, 0x9d, 0x93, 0x82,
+                                                        0x7c, 0x7e, 0x80, 0x80, 0x7d, 0x8a, 0x1f, 0x76,
+                                                        0x89, 0x7a, 0x92, 0x81, 0x93, 0x71, 0x5d, 0x18,
+                                                        0x7c, 0x9f, 0xa7, 0x80, 0xa9, 0x1b, 0xcc, 0xab,
+                                                        0xb9, 0xb8, 0xa3, 0x82, 0xb4, 0x5b, 0x95, 0x1f,
+                                                        0x8c, 0xaa, 0x5, 0xf7, 0x2, 0x90, 0xe4, 0xc2,
+                                                        0xe1, 0x1a, 0xf5, 0xfb, 0x3, 0xa6, 0x36, 0x88,
+                                                        0x1e, 0x13, 0xe9, 0xc0, 0x2f, 0x91, 0x45, 0x92,
+                                                        0xaf, 0x1a, 0xb8, 0xe5, 0x90, 0xa2, 0xb6, 0xbb,
+                                                        0x77, 0x79, 0xae, 0x1e, 0x13, 0xf2, 0xc0, 0x5c,
+                                                        0xee, 0xf7, 0x46, 0x28, 0x69, 0x7, 0x99, 0x65,
+                                                        0x59, 0x9f, 0x5d, 0x1b, 0x2e, 0x20, 0x64, 0x24,
+                                                        0xfb, 0xe, 0xf7, 0x2a, 0x82, 0xd5, 0x86, 0x1f,
+                                                        0x13, 0xf4, 0xa0, 0xaf, 0x88, 0xec, 0x95, 0x58,
+                                                        0x1a, 0x69, 0x48, 0x73, 0x53, 0x44, 0x58, 0xae,
+                                                        0x94, 0x71, 0x1e, 0x13, 0xf4, 0xc0, 0xc7, 0x27,
+                                                        0x7, 0xe, 0x75, 0xe6, 0x8b, 0xf7, 0x27, 0xf7,
+                                                        0x97, 0xe6, 0x8b, 0xb6, 0x6d, 0xb6, 0xf7, 0x3c,
+                                                        0x77, 0x12, 0xba, 0xf1, 0x36, 0xe0, 0x36, 0xf2,
+                                                        0xf7, 0x99, 0xf1, 0x3d, 0xf0, 0x13, 0xed, 0x20,
+                                                        0xba, 0x75, 0x15, 0xf1, 0xae, 0x6, 0x82, 0xa1,
+                                                        0xbc, 0x71, 0xdc, 0x1b, 0xf7, 0x1d, 0xf7, 0x7,
+                                                        0xcc, 0xf7, 0x0, 0xe7, 0x3e, 0xb5, 0x3a, 0x98,
+                                                        0x1f, 0x13, 0xf4, 0xc0, 0x53, 0x93, 0xfb, 0x40,
+                                                        0x7e, 0xe7, 0x1a, 0xb5, 0xbc, 0xbb, 0xe6, 0xb6,
+                                                        0xb5, 0x7f, 0x7c, 0xaf, 0x1e, 0x22, 0xf1, 0xf7,
+                                                        0x73, 0x25, 0x73, 0x7, 0x9a, 0x67, 0x5f, 0x94,
+                                                        0x5e, 0x1b, 0xfb, 0x32, 0x3a, 0x26, 0x3b, 0xfb,
+                                                        0x2e, 0xf7, 0x48, 0x85, 0xf7, 0xa, 0x82, 0x1f,
+                                                        0x13, 0xed, 0x20, 0xc3, 0x87, 0xad, 0x79, 0x60,
+                                                        0x1a, 0x5b, 0x60, 0x69, 0xfb, 0x0, 0x54, 0x57,
+                                                        0x9a, 0xa4, 0x5e, 0x1e, 0xde, 0x7, 0x13, 0xee,
+                                                        0x40, 0x25, 0x6, 0x13, 0xf5, 0x40, 0xf7, 0x62,
+                                                        0xf8, 0x35, 0x15, 0xf5, 0x6, 0xf7, 0x3e, 0xf7,
+                                                        0x24, 0x4c, 0xaf, 0xfb, 0x35, 0x24, 0xfb, 0x31,
+                                                        0xf3, 0x49, 0x69, 0x5, 0xe, 0x7a, 0xe1, 0xed,
+                                                        0xdf, 0x8b, 0xeb, 0x3a, 0xf7, 0x41, 0x2f, 0xe7,
+                                                        0x7d, 0xb9, 0x12, 0xcd, 0xed, 0x37, 0xdf, 0x37,
+                                                        0xea, 0xf7, 0x83, 0xee, 0x40, 0xea, 0x13, 0xe6,
+                                                        0x20, 0xf7, 0x99, 0xf8, 0x79, 0x15, 0xf0, 0x6,
+                                                        0xf7, 0x38, 0xf7, 0x25, 0x4d, 0xb0, 0xfb, 0x2e,
+                                                        0x22, 0xfb, 0x2e, 0xf4, 0x4c, 0x67, 0x5, 0x70,
+                                                        0xfd, 0x1c, 0x15, 0xed, 0xb1, 0x6, 0x7b, 0xb9,
+                                                        0xc3, 0x75, 0xc0, 0x1b, 0xf7, 0xb, 0xea, 0xc2,
+                                                        0xe2, 0xf2, 0xfb, 0x3, 0xa5, 0x36, 0x88, 0x1f,
+                                                        0x13, 0xe4, 0xc0, 0x30, 0x92, 0x44, 0x91, 0xaf,
+                                                        0x1a, 0x13, 0xea, 0x40, 0xb5, 0xe6, 0x90, 0xa1,
+                                                        0xb6, 0xba, 0x78, 0x7a, 0xaf, 0x1e, 0x13, 0xd1,
+                                                        0x40, 0x5e, 0xee, 0xf7, 0x41, 0x28, 0x6a, 0x7,
+                                                        0x99, 0x64, 0x5a, 0x9e, 0x5d, 0x1b, 0x2e, 0x20,
+                                                        0x65, 0x28, 0xfb, 0xc, 0xf7, 0x2a, 0x82, 0xd5,
+                                                        0x85, 0x1f, 0x13, 0xe6, 0x20, 0xaf, 0x88, 0xed,
+                                                        0x96, 0x59, 0x1a, 0x6a, 0x47, 0x74, 0x53, 0x45,
+                                                        0x56, 0xab, 0x94, 0x70, 0x1e, 0xc6, 0x29, 0x7,
+                                                        0xe, 0x8b, 0xe3, 0xf8, 0x1b, 0xe8, 0xe3, 0xf7,
+                                                        0x15, 0x12, 0x99, 0xf7, 0x80, 0x2b, 0xf7, 0x4,
+                                                        0xd1, 0xf7, 0x4, 0x28, 0xf7, 0x80, 0x13, 0xec,
+                                                        0xf7, 0x13, 0x16, 0xf7, 0xe9, 0xe8, 0xfb, 0xe,
+                                                        0xf7, 0x14, 0x6, 0xf7, 0x34, 0xf7, 0x96, 0x5,
+                                                        0x13, 0xea, 0xda, 0xe8, 0xfb, 0x80, 0x2e, 0xc3,
+                                                        0x6, 0x22, 0xfb, 0x3d, 0x23, 0xf7, 0x3d, 0x5,
+                                                        0x13, 0xf4, 0xc1, 0xe8, 0xfb, 0x80, 0x2e, 0xd8,
+                                                        0x6, 0xf7, 0x34, 0xfb, 0x96, 0x5, 0xfb, 0x14,
+                                                        0xfb, 0x10, 0x7, 0xf7, 0x62, 0xf8, 0xcb, 0x15,
+                                                        0xf7, 0x1, 0xf7, 0x15, 0xfb, 0x1, 0x6, 0xfb,
+                                                        0x48, 0xfb, 0x15, 0x15, 0xf7, 0x2, 0xf7, 0x15,
+                                                        0xfb, 0x2, 0x6, 0xe, 0x8b, 0xe6, 0xf8, 0xc,
+                                                        0xe5, 0x8b, 0xc1, 0xf7, 0x47, 0x77, 0x12, 0xcd,
+                                                        0xed, 0xf7, 0xa8, 0xed, 0x17, 0xc8, 0x16, 0xf8,
+                                                        0x71, 0xf7, 0x6e, 0x29, 0xfb, 0x13, 0xfb, 0x8a,
+                                                        0x6, 0xf7, 0xd5, 0xf8, 0x26, 0x5, 0x13, 0x78,
+                                                        0xcb, 0xfc, 0x55, 0xfb, 0x5f, 0xed, 0xf7, 0x5,
+                                                        0xf7, 0x6d, 0x7, 0xfb, 0xd4, 0xfc, 0x22, 0x5,
+                                                        0xf7, 0x4f, 0xf8, 0xb2, 0x15, 0xf0, 0x6, 0xf7,
+                                                        0x36, 0xf7, 0x22, 0x51, 0xaf, 0xfb, 0x30, 0x25,
+                                                        0xfb, 0x2b, 0xf2, 0x4d, 0x69, 0x5, 0xe, 0x8b,
+                                                        0xe7, 0xf7, 0x2f, 0xf7, 0x43, 0x30, 0xe6, 0x8b,
+                                                        0xc8, 0xf7, 0x4c, 0x77, 0x12, 0xe9, 0xee, 0xf7,
+                                                        0x79, 0xec, 0x13, 0xde, 0xf7, 0x94, 0xf8, 0x77,
+                                                        0x15, 0xf0, 0x6, 0xf7, 0x36, 0xf7, 0x26, 0x4e,
+                                                        0xb1, 0xfb, 0x2c, 0x21, 0xfb, 0x2e, 0xf5, 0x4c,
+                                                        0x66, 0x5, 0x82, 0xfd, 0xa, 0x15, 0xf8, 0x4b,
+                                                        0xf7, 0x4e, 0x2a, 0x2d, 0xfb, 0x51, 0x6, 0xf7,
+                                                        0xb2, 0xf7, 0x9c, 0x5, 0xcd, 0xfc, 0x3d, 0xfb,
+                                                        0x43, 0xee, 0x7, 0x13, 0xbe, 0xdf, 0xf7, 0x40,
+                                                        0x7, 0xfb, 0xb1, 0xfb, 0x98, 0x5, 0xe, 0xfb,
+                                                        0x17, 0xe9, 0xf8, 0x9, 0xe8, 0xeb, 0xe6, 0x1,
+                                                        0xa4, 0x6c, 0x15, 0x71, 0x2f, 0x5, 0x87, 0xb1,
+                                                        0xab, 0x87, 0xb7, 0x1b, 0xdd, 0xde, 0xa9, 0xf2,
+                                                        0x9f, 0x1f, 0xd1, 0xf7, 0xe2, 0x5, 0xf6, 0x6,
+                                                        0x9d, 0xe8, 0x5, 0xfb, 0x1, 0x6, 0xe5, 0x93,
+                                                        0xad, 0x91, 0xd7, 0x1b, 0xab, 0xaa, 0x87, 0x89,
+                                                        0x9f, 0x1f, 0x9b, 0xe5, 0x5, 0x8d, 0x68, 0x67,
+                                                        0x90, 0x66, 0x1b, 0xfb, 0x10, 0x8a, 0x4b, 0x5f,
+                                                        0x7b, 0xfb, 0x22, 0x8, 0x25, 0x6, 0x78, 0x2e,
+                                                        0x5, 0xf3, 0x6, 0x4f, 0xfb, 0xae, 0x5, 0x3d,
+                                                        0x7d, 0x79, 0x7e, 0x51, 0x1b, 0x73, 0x5a, 0x8f,
+                                                        0x8d, 0x73, 0x1f, 0xe, 0x79, 0xe9, 0x8b, 0xf1,
+                                                        0x8b, 0xea, 0x8b, 0xd1, 0xf7, 0x26, 0xe6, 0x8b,
+                                                        0xaf, 0xf7, 0x42, 0x77, 0x12, 0x99, 0xed, 0xf7,
+                                                        0xdd, 0xea, 0x35, 0xed, 0x13, 0xff, 0x80, 0x46,
+                                                        0xa, 0xd0, 0xf7, 0x17, 0xf7, 0x21, 0xe6, 0xd3,
+                                                        0xed, 0x1f, 0x13, 0xff, 0x40, 0x41, 0xa, 0xfb,
+                                                        0xf, 0xfb, 0x4d, 0xfb, 0x62, 0xf7, 0x33, 0x37,
+                                                        0xf7, 0x36, 0x1f, 0x13, 0xff, 0x80, 0x58, 0xa,
+                                                        0x64, 0xf7, 0xeb, 0x15, 0xe7, 0x6, 0xf7, 0x29,
+                                                        0xf7, 0x1e, 0x5, 0x13, 0xff, 0x40, 0x3e, 0xa,
+                                                        0xfb, 0x26, 0xe4, 0xed, 0xe3, 0x3d, 0xe3, 0xf7,
+                                                        0x6b, 0xe4, 0x3e, 0xe3, 0x8b, 0xb2, 0xf7, 0x42,
+                                                        0x77, 0x69, 0xa, 0x13, 0xd7, 0x80, 0x50, 0xa,
+                                                        0xf3, 0xf2, 0x1f, 0xf7, 0xb9, 0x7, 0x13, 0xd7,
+                                                        0x40, 0xd7, 0xe4, 0xfb, 0x3c, 0x6e, 0x6, 0x13,
+                                                        0xcf, 0x80, 0x5a, 0xa, 0x1f, 0x13, 0xaf, 0x80,
+                                                        0xfb, 0x9, 0xee, 0x3c, 0xf7, 0x21, 0xc0, 0xbe,
+                                                        0x98, 0xa7, 0xb1, 0x1e, 0x67, 0x7, 0x51, 0x88,
+                                                        0x54, 0x42, 0xa, 0x69, 0x33, 0x43, 0x44, 0xb1,
+                                                        0xd2, 0x1e, 0xf7, 0x1d, 0xf7, 0x89, 0x43, 0xa,
+                                                        0xf8, 0x8c, 0x76, 0xf7, 0x42, 0x77, 0x1, 0xf7,
+                                                        0x35, 0xf8, 0x77, 0x15, 0xf7, 0x20, 0xf7, 0x2,
+                                                        0xf7, 0x20, 0xfb, 0x2, 0xc3, 0xac, 0xfb, 0x29,
+                                                        0xf7, 0x21, 0x5, 0x2e, 0x6, 0xfb, 0x2c, 0xfb,
+                                                        0x20, 0x5, 0xe, 0xf8, 0x96, 0x76, 0xf7, 0x42,
+                                                        0x77, 0x1, 0xf7, 0x94, 0xf8, 0x81, 0x43, 0xa,
+                                                        0xf8, 0x68, 0xde, 0x38, 0xf7, 0x37, 0x12, 0x13,
+                                                        0x40, 0xde, 0xf9, 0xb, 0x15, 0x43, 0x98, 0xcb,
+                                                        0x30, 0xf7, 0x21, 0x1b, 0xf7, 0x32, 0xbd, 0xf7,
+                                                        0x4, 0xbe, 0x93, 0x1f, 0x2e, 0x6, 0x13, 0x80,
+                                                        0x63, 0x7a, 0x70, 0x63, 0x3c, 0x1b, 0x13, 0x40,
+                                                        0x3d, 0x66, 0xb6, 0xb0, 0x83, 0x1f, 0xe, 0xf8,
+                                                        0x79, 0xf7, 0x20, 0x1, 0xf7, 0x7a, 0xf7, 0x20,
+                                                        0x3, 0xf7, 0x7a, 0xf8, 0x79, 0x15, 0xf7, 0x20,
+                                                        0xf7, 0x20, 0xfb, 0x20, 0x6, 0xe, 0xf8, 0x75,
+                                                        0xf7, 0x59, 0x1, 0xf7, 0x5a, 0xc8, 0xdd, 0xc8,
+                                                        0x3, 0xf7, 0x5a, 0xf8, 0xd7, 0x15, 0x56, 0xb9,
+                                                        0x5e, 0xc2, 0xc4, 0xb9, 0xb8, 0xc0, 0xc1, 0x5d,
+                                                        0xb8, 0x52, 0x54, 0x5d, 0x5e, 0x55, 0x1e, 0xc8,
+                                                        0x16, 0xa2, 0x9d, 0x9d, 0xa1, 0xa3, 0x9d, 0x79,
+                                                        0x74, 0x75, 0x79, 0x79, 0x73, 0x75, 0x79, 0x9d,
+                                                        0xa1, 0x1e, 0xe, 0xfb, 0x5b, 0xf7, 0x5b, 0x12,
+                                                        0xf7, 0x5d, 0xe4, 0x32, 0xf7, 0x51, 0x13, 0xc0,
+                                                        0xf7, 0xbe, 0x16, 0x7d, 0x88, 0x38, 0x68, 0x42,
+                                                        0x1a, 0x5d, 0xaf, 0x61, 0xc0, 0x1e, 0x13, 0xa0,
+                                                        0xab, 0xb9, 0x9e, 0xa0, 0xa1, 0x1f, 0xd7, 0x7,
+                                                        0x13, 0xc0, 0x79, 0x73, 0x39, 0x60, 0xc5, 0x1a,
+                                                        0xb6, 0xde, 0xad, 0xa5, 0x9a, 0x1e, 0xe, 0xe3,
+                                                        0xf8, 0x3b, 0x3, 0xe3, 0xf8, 0x9a, 0x15, 0xdc,
+                                                        0x72, 0x5, 0xa3, 0x98, 0x95, 0xae, 0xac, 0x1b,
+                                                        0x9e, 0xa0, 0x7e, 0x7d, 0xa2, 0x1f, 0x7d, 0xa4,
+                                                        0xa7, 0x7c, 0xab, 0x1b, 0xec, 0xaa, 0xdf, 0xab,
+                                                        0x95, 0x1f, 0x3a, 0xa3, 0x5, 0x64, 0x78, 0x83,
+                                                        0x76, 0x6e, 0x1b, 0x78, 0x76, 0x96, 0x97, 0x75,
+                                                        0x1f, 0x9b, 0x6f, 0x6e, 0x9d, 0x6e, 0x1b, 0x2d,
+                                                        0x6f, 0x41, 0x62, 0x7b, 0x1f, 0xe, 0xf8, 0x8f,
+                                                        0x76, 0xf7, 0x43, 0x77, 0x1, 0xb3, 0xf8, 0x9c,
+                                                        0x3, 0xf7, 0x93, 0xf8, 0x8f, 0x15, 0xc8, 0x76,
+                                                        0xf7, 0x88, 0xf7, 0x25, 0x28, 0xa9, 0x5, 0xfc,
+                                                        0x39, 0xfb, 0x2e, 0x15, 0xc8, 0x76, 0xf7, 0x8a,
+                                                        0xf7, 0x25, 0x28, 0xa9, 0x5, 0xe, 0xf7, 0x5f,
+                                                        0xef, 0x1, 0xcc, 0xf8, 0x6a, 0x3, 0xcc, 0xf7,
+                                                        0x5f, 0x15, 0xf8, 0x6a, 0xef, 0xfc, 0x6a, 0x6,
+                                                        0xe, 0xf7, 0x5f, 0xef, 0x1, 0x81, 0xf9, 0x0,
+                                                        0x3, 0x81, 0xf7, 0x5f, 0x15, 0xf9, 0x0, 0xef,
+                                                        0xfd, 0x0, 0x6, 0xe, 0xf7, 0xbe, 0x76, 0xf7,
+                                                        0xb5, 0x77, 0x1, 0xf7, 0xc7, 0xf7, 0xa9, 0x15,
+                                                        0xf7, 0xa, 0x6, 0x2b, 0xf7, 0xb5, 0x5, 0xfb,
+                                                        0x2e, 0x6, 0xe, 0x4c, 0xa, 0xf7, 0x42, 0xf7,
+                                                        0xa9, 0x15, 0xf7, 0xa, 0x6, 0xf7, 0x1a, 0x59,
+                                                        0xa, 0xfb, 0x30, 0x6, 0xe, 0xfb, 0xd, 0x45,
+                                                        0xa, 0xf7, 0x42, 0xfb, 0x22, 0x15, 0xf7, 0xd,
+                                                        0x6, 0xf7, 0x17, 0x59, 0xa, 0xfb, 0x2f, 0x6,
+                                                        0xe, 0x4c, 0xa, 0xf8, 0x33, 0xf7, 0xa9, 0x5d,
+                                                        0xa, 0x36, 0xfb, 0xb1, 0x5d, 0xa, 0xe, 0x4c,
+                                                        0xa, 0xf7, 0xad, 0xf7, 0xa9, 0x15, 0xf7, 0xb,
+                                                        0x6, 0xf7, 0x18, 0x59, 0xa, 0xfb, 0x2d, 0x6,
+                                                        0xfb, 0xcb, 0x4e, 0xa, 0xfb, 0xd, 0x45, 0xa,
+                                                        0xf7, 0xad, 0xfb, 0x22, 0x15, 0xf7, 0xa, 0x6,
+                                                        0xf7, 0x19, 0x59, 0xa, 0xfb, 0x2e, 0x6, 0xfb,
+                                                        0xca, 0x4e, 0xa, 0xf7, 0xdc, 0xed, 0x1, 0xf7,
+                                                        0x8e, 0xef, 0x3, 0xf7, 0x8e, 0x45, 0x15, 0xef,
+                                                        0xf8, 0x29, 0xf7, 0x24, 0xed, 0xfb, 0x24, 0xf7,
+                                                        0x1d, 0x27, 0xfb, 0x1d, 0xfb, 0x24, 0x29, 0xf7,
+                                                        0x24, 0x6, 0xe, 0x5a, 0x76, 0xf7, 0x53, 0xed,
+                                                        0xf6, 0xed, 0xf7, 0x30, 0x77, 0x1, 0xf7, 0x90,
+                                                        0xee, 0x3, 0xf5, 0xf7, 0xd, 0x15, 0xf7, 0x26,
+                                                        0xfb, 0x53, 0xee, 0xf7, 0x53, 0xf7, 0x23, 0xed,
+                                                        0xfb, 0x23, 0xf6, 0xf7, 0x23, 0xed, 0xfb, 0x23,
+                                                        0xf7, 0x30, 0x28, 0xfb, 0x30, 0xfb, 0x26, 0x29,
+                                                        0xf7, 0x26, 0x20, 0xfb, 0x26, 0x6, 0xe, 0xf7,
+                                                        0xc, 0xf7, 0xfe, 0x1, 0xf7, 0xc, 0xf7, 0xfc,
+                                                        0x3, 0xf8, 0x74, 0xf7, 0xc1, 0x15, 0xef, 0x3b,
+                                                        0xdc, 0x27, 0x27, 0x3b, 0x3a, 0x27, 0x27, 0xdb,
+                                                        0x3a, 0xef, 0xef, 0xdb, 0xdc, 0xef, 0x1e, 0xe,
+                                                        0x7c, 0xf7, 0x17, 0x1, 0xa5, 0xf7, 0x1c, 0xd1,
+                                                        0xf7, 0x1c, 0xd1, 0xf7, 0x1c, 0x14, 0x70, 0xf8,
+                                                        0x4a, 0xbd, 0x15, 0x6c, 0xa3, 0x69, 0xb9, 0xb6,
+                                                        0xa2, 0xad, 0xab, 0xad, 0x75, 0xaa, 0x5e, 0x5a,
+                                                        0x77, 0x66, 0x6e, 0x1e, 0xfb, 0x62, 0x16, 0x6c,
+                                                        0xa3, 0x69, 0xb9, 0xb7, 0xa1, 0xad, 0xab, 0xad,
+                                                        0x75, 0xaa, 0x5e, 0x5b, 0x76, 0x66, 0x6e, 0x1e,
+                                                        0xfb, 0x62, 0x16, 0x6c, 0xa4, 0x69, 0xb8, 0xb7,
+                                                        0xa1, 0xad, 0xab, 0xad, 0x76, 0xaa, 0x5d, 0x5b,
+                                                        0x76, 0x66, 0x6e, 0x1e, 0xe, 0x7c, 0xd1, 0xf7,
+                                                        0x1d, 0xd1, 0xd9, 0xd1, 0xf7, 0x1c, 0xd1, 0x12,
+                                                        0xfb, 0x5, 0xd8, 0xf3, 0xd7, 0x74, 0xd7, 0xf3,
+                                                        0xd8, 0xa3, 0xd7, 0xf7, 0x32, 0xd8, 0x13, 0xfb,
+                                                        0xc0, 0xf8, 0x26, 0xf7, 0xf, 0x15, 0x43, 0xc6,
+                                                        0x4a, 0xeb, 0x8a, 0x1e, 0xe1, 0xd1, 0xc6, 0xdb,
+                                                        0xd2, 0x4f, 0xce, 0x2d, 0x2f, 0x4a, 0x68, 0xa,
+                                                        0xc0, 0xbd, 0xa8, 0x6b, 0x67, 0x5c, 0x63, 0x75,
+                                                        0x63, 0x58, 0x70, 0xac, 0xaf, 0x1e, 0xfc, 0xe3,
+                                                        0xf7, 0xf5, 0x15, 0x43, 0xc6, 0x4b, 0xea, 0x8a,
+                                                        0x1e, 0xe2, 0xd0, 0xc6, 0xda, 0xd2, 0x50, 0xce,
+                                                        0x2c, 0x2f, 0x4b, 0x49, 0x42, 0x1f, 0xd8, 0x8c,
+                                                        0x15, 0xae, 0xa4, 0xac, 0xbf, 0xbe, 0xa8, 0x6b,
+                                                        0x67, 0x5d, 0x64, 0x75, 0x61, 0x5a, 0x70, 0xab,
+                                                        0xaf, 0x1e, 0x13, 0xfd, 0xc0, 0xf3, 0xfb, 0xf7,
+                                                        0x15, 0x43, 0xc5, 0x4a, 0xea, 0x8a, 0x1e, 0xe2,
+                                                        0xd1, 0xc6, 0xdb, 0xd2, 0x4f, 0xce, 0x2c, 0x2f,
+                                                        0x4c, 0x68, 0xa, 0xbe, 0xbe, 0xa8, 0x6b, 0x67,
+                                                        0x5c, 0x64, 0x75, 0x61, 0x5a, 0x70, 0xac, 0xaf,
+                                                        0x1e, 0xfb, 0x5b, 0xc0, 0x15, 0xf8, 0x55, 0xf7,
+                                                        0x52, 0x6c, 0xca, 0xfc, 0x56, 0xfb, 0x51, 0x5,
+                                                        0xe, 0x7b, 0xa, 0xf7, 0x21, 0xf7, 0x96, 0x15,
+                                                        0xf7, 0x9f, 0xfb, 0x50, 0xbc, 0xca, 0xfb, 0x4b,
+                                                        0xf7, 0x15, 0xf7, 0x4b, 0xf7, 0xd, 0x5a, 0xca,
+                                                        0x5, 0xe, 0x7b, 0xa, 0xf7, 0x21, 0xf7, 0xd0,
+                                                        0x3, 0xf7, 0x52, 0xf8, 0x52, 0x15, 0x5a, 0x4c,
+                                                        0xf7, 0x4b, 0xfb, 0xd, 0xfb, 0x4b, 0xfb, 0x15,
+                                                        0xbc, 0x4c, 0xf7, 0x9f, 0xf7, 0x50, 0x5, 0xe,
+                                                        0x64, 0x76, 0xf9, 0x65, 0x77, 0x1, 0xa3, 0xf8,
+                                                        0xbb, 0x3, 0xa3, 0x83, 0x15, 0xd1, 0x57, 0xf8,
+                                                        0x75, 0xf9, 0x34, 0x44, 0xbc, 0x5, 0xe, 0x84,
+                                                        0x76, 0xf7, 0x5f, 0xd4, 0xba, 0xd4, 0xf7, 0x2b,
+                                                        0xe8, 0x1, 0xf7, 0xf, 0xe9, 0x3, 0xc7, 0xaf,
+                                                        0x15, 0xbe, 0x4b, 0x5, 0x93, 0x97, 0xec, 0xb0,
+                                                        0xbb, 0x1b, 0xa1, 0xa6, 0x82, 0x83, 0xa6, 0x1f,
+                                                        0x84, 0xa2, 0xad, 0x85, 0x9f, 0x1b, 0xd3, 0xa8,
+                                                        0xbd, 0x71, 0xa, 0x7a, 0x72, 0x64, 0xa, 0x6b,
+                                                        0x94, 0x7c, 0x1b, 0x7a, 0x50, 0x86, 0x85, 0x7c,
+                                                        0x1f, 0xa6, 0x9a, 0x93, 0xb7, 0x89, 0xa0, 0x8,
+                                                        0xf7, 0x45, 0xd4, 0xfb, 0x50, 0x6, 0x88, 0x93,
+                                                        0x87, 0xa3, 0x8a, 0x9a, 0x8, 0xf7, 0x58, 0xd4,
+                                                        0xfb, 0x5a, 0x6, 0x89, 0xa8, 0x8a, 0xa4, 0x94,
+                                                        0x6c, 0xa, 0xba, 0x72, 0x5e, 0xa0, 0x1f, 0xde,
+                                                        0xaf, 0x5, 0xb9, 0x70, 0x57, 0xdc, 0x63, 0xa,
+                                                        0x83, 0x8b, 0x77, 0x8d, 0x73, 0x1e, 0x47, 0x42,
+                                                        0xd0, 0x6, 0x8e, 0x75, 0x8b, 0x79, 0x8d, 0x84,
+                                                        0x8, 0x41, 0x42, 0xe1, 0x6, 0x91, 0x59, 0x63,
+                                                        0x4d, 0x5a, 0x70, 0x8, 0xe, 0x8b, 0xde, 0xe5,
+                                                        0xd5, 0xc1, 0xd4, 0xf4, 0xde, 0x1, 0xd8, 0xee,
+                                                        0xf7, 0xdd, 0xed, 0x3, 0x82, 0xf7, 0x4c, 0x15,
+                                                        0xef, 0x6, 0xfb, 0xe, 0xae, 0xf7, 0x8, 0x4d,
+                                                        0xf7, 0xd, 0x1b, 0xe3, 0xe1, 0xaa, 0xbc, 0xd3,
+                                                        0x1f, 0x53, 0xc3, 0x5, 0x63, 0x65, 0x3a, 0x79,
+                                                        0x48, 0x1b, 0x46, 0x8c, 0x44, 0xb3, 0x6d, 0xcc,
+                                                        0x8, 0xf7, 0x40, 0x6, 0xa5, 0xd5, 0x5, 0xfb,
+                                                        0x6e, 0x6, 0x8a, 0x91, 0x8b, 0x94, 0x91, 0x92,
+                                                        0x8c, 0x93, 0x92, 0x1a, 0xf7, 0x7b, 0x6, 0xa6,
+                                                        0xd4, 0x5, 0xfb, 0x83, 0x6, 0xd5, 0xa3, 0xd5,
+                                                        0xaa, 0xd3, 0x1b, 0xbf, 0x8a, 0xbf, 0x79, 0xae,
+                                                        0x63, 0x8, 0x47, 0xed, 0xf7, 0x66, 0x29, 0x5c,
+                                                        0x7, 0xaa, 0x5e, 0x56, 0x9b, 0x54, 0x1b, 0xfb,
+                                                        0xa, 0xfb, 0x3, 0x43, 0xfb, 0x8, 0x6a, 0x1f,
+                                                        0x43, 0x6, 0x70, 0x42, 0x5, 0xe1, 0x79, 0x6,
+                                                        0x8c, 0x72, 0x5, 0x4f, 0x6, 0xe, 0x7c, 0xe8,
+                                                        0xf7, 0x1c, 0xe8, 0xf7, 0x36, 0xe8, 0x1, 0xec,
+                                                        0xee, 0xf7, 0x7b, 0xed, 0x3, 0x97, 0x7c, 0x15,
+                                                        0xf7, 0x9c, 0xe8, 0x3b, 0xf7, 0x1c, 0xde, 0x6,
+                                                        0xad, 0x5d, 0xb0, 0x5d, 0xa1, 0x6b, 0x5b, 0x55,
+                                                        0x18, 0xd1, 0x58, 0xaa, 0xa9, 0x95, 0x7c, 0x8d,
+                                                        0x88, 0x93, 0x7f, 0x19, 0xf7, 0x22, 0xe8, 0x32,
+                                                        0x6, 0x7f, 0x9f, 0xcc, 0xe4, 0x44, 0xbc, 0x5c,
+                                                        0x4a, 0x5d, 0xc8, 0x5, 0xf5, 0x9e, 0xab, 0xd1,
+                                                        0xd3, 0x1a, 0xf7, 0xb, 0x28, 0xbd, 0xfb, 0x8,
+                                                        0x1e, 0xfb, 0xba, 0x2e, 0xdc, 0xfc, 0x1b, 0x36,
+                                                        0x6, 0xf7, 0x4c, 0xf7, 0x79, 0x15, 0xf7, 0x36,
+                                                        0x7, 0xf7, 0x4a, 0xbc, 0x92, 0x37, 0x2e, 0x39,
+                                                        0x93, 0xfb, 0x29, 0x1f, 0xe, 0xf7, 0x8f, 0x76,
+                                                        0xf7, 0xae, 0xbc, 0x1, 0xf7, 0x4, 0xbb, 0xf7,
+                                                        0xb, 0xba, 0xf7, 0x58, 0xbb, 0x3, 0xf7, 0xab,
+                                                        0xf7, 0x7a, 0x15, 0xba, 0xf7, 0xb5, 0x6, 0xd1,
+                                                        0xfb, 0xb5, 0x5, 0xc7, 0x6, 0xcd, 0xf7, 0xb4,
+                                                        0x5, 0xfb, 0xb4, 0xbb, 0xf7, 0xe0, 0x32, 0x7,
+                                                        0x52, 0xfb, 0x97, 0x51, 0xf7, 0x97, 0x5, 0x34,
+                                                        0x6, 0xfb, 0x3b, 0xfb, 0xe0, 0x15, 0xbb, 0xf7,
+                                                        0xae, 0xdd, 0xbc, 0xfb, 0x69, 0x5a, 0xde, 0x6,
+                                                        0xe, 0x75, 0xa, 0xf7, 0x33, 0x76, 0xa, 0xf8,
+                                                        0x7e, 0xe1, 0xfc, 0x79, 0x5b, 0xa, 0x8e, 0xf9,
+                                                        0x3, 0x1, 0xf7, 0x92, 0xe1, 0x3, 0xf7, 0x92,
+                                                        0x8e, 0x15, 0xe1, 0xf8, 0x5b, 0x6, 0xbf, 0x45,
+                                                        0xcb, 0xbd, 0xfb, 0x31, 0xf7, 0x50, 0xfb, 0x2f,
+                                                        0xfb, 0x4d, 0xca, 0x58, 0xba, 0xca, 0x5, 0xe,
+                                                        0x75, 0xa, 0x6e, 0xf7, 0x96, 0x15, 0xf8, 0x7e,
+                                                        0x47, 0xa, 0xfc, 0x79, 0x6, 0xe, 0x91, 0x76,
+                                                        0x1, 0xf7, 0x92, 0xe1, 0x3, 0xf7, 0x24, 0xf7,
+                                                        0x3e, 0x15, 0xf7, 0x2f, 0xfb, 0x4d, 0xf7, 0x31,
+                                                        0xf7, 0x50, 0x4b, 0xbd, 0x57, 0x45, 0x5, 0xf8,
+                                                        0x5b, 0x35, 0xfc, 0x56, 0x7, 0x5c, 0xca, 0x5,
+                                                        0xe, 0xf7, 0x96, 0xe1, 0x1, 0x73, 0xf9, 0x1c,
+                                                        0x3, 0xf7, 0x38, 0x76, 0xa, 0xf7, 0xcc, 0x47,
+                                                        0xa, 0xfb, 0xc2, 0x5b, 0xa, 0xf7, 0x5f, 0xf7,
+                                                        0x2, 0x1, 0xd2, 0xf8, 0x5e, 0x3, 0x5c, 0xa,
+                                                        0xe, 0x8b, 0xe5, 0xf7, 0x87, 0xe5, 0xd7, 0xf7,
+                                                        0x13, 0x73, 0x77, 0x12, 0xf4, 0xe5, 0xf7, 0x12,
+                                                        0xf7, 0x42, 0x2f, 0xe7, 0x13, 0xea, 0xf8, 0x27,
+                                                        0xf8, 0x87, 0x15, 0xe7, 0xf7, 0x13, 0x2f, 0x6,
+                                                        0x2f, 0xfd, 0x6, 0x15, 0xf7, 0xab, 0xe5, 0x2c,
+                                                        0xf7, 0xe1, 0x6, 0x13, 0xec, 0xfb, 0x42, 0x31,
+                                                        0x6, 0x13, 0xda, 0xdd, 0xfb, 0x87, 0x2f, 0x6,
+                                                        0xfb, 0xc2, 0x31, 0x15, 0xf7, 0xae, 0xe5, 0x2b,
+                                                        0xf7, 0x87, 0xeb, 0xe5, 0x2b, 0xbf, 0x6, 0xb4,
+                                                        0xdf, 0x87, 0xa4, 0x1e, 0x8e, 0xe5, 0x5, 0x21,
+                                                        0x2b, 0x8c, 0xfb, 0x1d, 0x1f, 0x60, 0x2b, 0x31,
+                                                        0xeb, 0xfb, 0x87, 0x2b, 0x7, 0xe, 0x8b, 0xe8,
+                                                        0xf7, 0x90, 0xe8, 0xea, 0xe5, 0x8e, 0x77, 0x12,
+                                                        0xf4, 0xe5, 0xf7, 0x3d, 0xf7, 0x17, 0x31, 0xe5,
+                                                        0x13, 0xdc, 0xf7, 0xcc, 0x16, 0xf7, 0xaa, 0xe8,
+                                                        0x2c, 0xf8, 0xa9, 0xfb, 0x17, 0x6, 0x13, 0xec,
+                                                        0x2e, 0x7, 0x13, 0xea, 0xb4, 0xfc, 0x4c, 0x2e,
+                                                        0x6, 0xfb, 0xc3, 0x2e, 0x15, 0xf7, 0xac, 0xe8,
+                                                        0x2d, 0xf7, 0x90, 0xe9, 0xe8, 0x2d, 0xbe, 0x6,
+                                                        0xab, 0xb6, 0x96, 0xb1, 0x8c, 0x1e, 0xa5, 0x8c,
+                                                        0xa3, 0x8b, 0x91, 0x89, 0x8c, 0xe6, 0x18, 0x20,
+                                                        0xfb, 0xd, 0x8b, 0xfb, 0x20, 0x1f, 0x5e, 0x2b,
+                                                        0x2e, 0xeb, 0xfb, 0x90, 0x2b, 0x7, 0xe, 0x79,
+                                                        0x9d, 0xf8, 0x4b, 0x9f, 0xf2, 0x9d, 0x9f, 0x95,
+                                                        0x95, 0x95, 0x6, 0xfb, 0x26, 0x8f, 0x7, 0x1e,
+                                                        0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xe8, 0xa,
+                                                        0xe8, 0xb, 0x8c, 0xc, 0xe, 0xf8, 0xec, 0x14,
+                                                        0xae, 0x13, 0x0, 0x5d, 0x2, 0x0, 0x1, 0x0,
+                                                        0x35, 0x0, 0x43, 0x0, 0x47, 0x0, 0x7a, 0x0,
+                                                        0xba, 0x0, 0xc4, 0x0, 0xe9, 0x1, 0x17, 0x1,
+                                                        0x34, 0x1, 0x4c, 0x1, 0x65, 0x1, 0x7d, 0x1,
+                                                        0x94, 0x1, 0xa8, 0x1, 0xbb, 0x1, 0xca, 0x1,
+                                                        0xdc, 0x1, 0xe2, 0x1, 0xe9, 0x1, 0xfc, 0x2,
+                                                        0x6, 0x2, 0x10, 0x2, 0x24, 0x2, 0x36, 0x2,
+                                                        0x43, 0x2, 0x4c, 0x2, 0x6c, 0x2, 0x71, 0x2,
+                                                        0x78, 0x2, 0x7f, 0x2, 0x8d, 0x2, 0x95, 0x2,
+                                                        0xa0, 0x2, 0xb8, 0x2, 0xcf, 0x2, 0xd8, 0x2,
+                                                        0xe1, 0x2, 0xe7, 0x2, 0xfa, 0x3, 0xd, 0x3,
+                                                        0x1c, 0x3, 0x2e, 0x3, 0x36, 0x3, 0x3e, 0x3,
+                                                        0x43, 0x3, 0x49, 0x3, 0x57, 0x3, 0x61, 0x3,
+                                                        0x71, 0x3, 0x75, 0x3, 0x7e, 0x3, 0x87, 0x3,
+                                                        0x90, 0x3, 0x97, 0x3, 0xa5, 0x3, 0xb1, 0x3,
+                                                        0xbf, 0x3, 0xc3, 0x3, 0xd0, 0x3, 0xdb, 0x3,
+                                                        0xe7, 0x3, 0xf2, 0x3, 0xfe, 0x4, 0x4, 0x4,
+                                                        0x8, 0x4, 0xe, 0x4, 0x14, 0x4, 0x1f, 0x4,
+                                                        0x2a, 0x4, 0x31, 0x4, 0x36, 0x4, 0x3b, 0x4,
+                                                        0x45, 0x4, 0x4f, 0x4, 0x53, 0x4, 0x57, 0x4,
+                                                        0x60, 0x4, 0x69, 0x4, 0x72, 0x4, 0x7b, 0x4,
+                                                        0x84, 0x4, 0x8d, 0x4, 0x96, 0x4, 0x9f, 0x4,
+                                                        0xa8, 0x4, 0xb1, 0x4, 0xba, 0x4, 0xc1, 0x4,
+                                                        0xc8, 0x4, 0xce, 0x4, 0xd4, 0x4, 0xd9, 0x4,
+                                                        0xde, 0xf7, 0x97, 0xe5, 0x27, 0x6, 0xa9, 0xcc,
+                                                        0x5, 0xf7, 0x86, 0x6, 0xa9, 0x4a, 0x5, 0x2a,
+                                                        0x31, 0xf7, 0x92, 0xe5, 0x51, 0x6, 0xfb, 0x62,
+                                                        0xf8, 0x62, 0x5, 0xfb, 0x8f, 0x31, 0xf7, 0x15,
+                                                        0x6, 0xfb, 0x3f, 0xfc, 0x8, 0x5, 0x4e, 0x6,
+                                                        0xf7, 0x7a, 0xf7, 0x2f, 0x15, 0xdc, 0xf7, 0x47,
+                                                        0xdc, 0xfb, 0x47, 0x5, 0xb, 0x2a, 0xa, 0x13,
+                                                        0x7d, 0x4d, 0xa, 0x13, 0x7e, 0x2b, 0xa, 0x13,
+                                                        0xbe, 0x29, 0xa, 0x15, 0x20, 0xa, 0xe, 0x15,
+                                                        0xfb, 0x39, 0xf7, 0x2a, 0x51, 0xf7, 0xa, 0xf7,
+                                                        0xf, 0xf7, 0x29, 0xcb, 0xf7, 0x33, 0xf7, 0x24,
+                                                        0xfb, 0x6, 0xe0, 0xfb, 0x32, 0xfb, 0x21, 0xfb,
+                                                        0x13, 0x3d, 0xfb, 0x2b, 0x1e, 0xef, 0x16, 0xdf,
+                                                        0xd4, 0xc0, 0xea, 0xf7, 0x7, 0xc5, 0x52, 0x3b,
+                                                        0x34, 0x28, 0x5b, 0x41, 0x47, 0x27, 0xb7, 0xe6,
+                                                        0x1e, 0xe, 0x15, 0xf8, 0x23, 0x6, 0xf7, 0x1c,
+                                                        0xa5, 0x32, 0xf7, 0x14, 0xfb, 0x43, 0x1b, 0xfb,
+                                                        0xc, 0xfb, 0x1f, 0x3f, 0xfb, 0x2b, 0xfb, 0x8,
+                                                        0xe3, 0x21, 0xf7, 0x41, 0xe5, 0xeb, 0xa9, 0xb4,
+                                                        0xd7, 0x1f, 0x5f, 0xda, 0x5, 0x6d, 0x4b, 0x3b,
+                                                        0x6d, 0x41, 0x1b, 0xfb, 0x10, 0x69, 0xc7, 0xae,
+                                                        0x86, 0x1f, 0x92, 0xe6, 0x15, 0xc3, 0xa0, 0xce,
+                                                        0xa4, 0xc8, 0x1b, 0xc7, 0xca, 0x7a, 0x4b, 0x9e,
+                                                        0x1f, 0xe, 0x2f, 0xa, 0xf7, 0x2e, 0x2e, 0xf7,
+                                                        0x1c, 0x26, 0xa, 0xb, 0xfb, 0x4c, 0xfb, 0x42,
+                                                        0x22, 0xfb, 0x21, 0xfb, 0x2b, 0x1e, 0xed, 0x8e,
+                                                        0x15, 0xe6, 0xc8, 0xf6, 0xf7, 0xc, 0xf7, 0x1c,
+                                                        0xb9, 0xfb, 0x13, 0x47, 0x3a, 0x5a, 0xfb, 0x10,
+                                                        0xfb, 0x19, 0xfb, 0xd, 0x4f, 0xf3, 0xed, 0x1e,
+                                                        0xb, 0xdb, 0xfb, 0xa2, 0x6, 0xfb, 0x11, 0xd3,
+                                                        0x38, 0xf7, 0x25, 0xf7, 0x11, 0xe8, 0xdc, 0xf7,
+                                                        0x12, 0x1e, 0xf7, 0xa3, 0xd8, 0xe6, 0xfb, 0x96,
+                                                        0x30, 0xe1, 0xfb, 0x8d, 0x7, 0x35, 0x74, 0x57,
+                                                        0x25, 0xfb, 0x4, 0x83, 0xe2, 0xc0, 0x1e, 0xf7,
+                                                        0x8b, 0xdf, 0xe6, 0xfb, 0x97, 0x7, 0xe, 0x15,
+                                                        0x13, 0xb5, 0x0, 0x2e, 0xa, 0x13, 0x78, 0x80,
+                                                        0x64, 0xf7, 0x43, 0xe6, 0x7, 0x13, 0x7a, 0x0,
+                                                        0x3a, 0xf7, 0xe1, 0xfb, 0x41, 0x30, 0x6, 0x13,
+                                                        0xb9, 0x0, 0x2c, 0xa, 0x61, 0x5b, 0x4f, 0x69,
+                                                        0x47, 0x1b, 0x60, 0x62, 0x9c, 0xab, 0xb7, 0xbf,
+                                                        0x9d, 0xc6, 0x8c, 0x1f, 0xc7, 0x8c, 0xcd, 0x85,
+                                                        0xa2, 0x89, 0x8, 0xe, 0x1f, 0x8f, 0x67, 0x63,
+                                                        0x8e, 0x66, 0x1b, 0xfb, 0x7f, 0x82, 0xfb, 0x19,
+                                                        0x78, 0x4b, 0xcb, 0x3e, 0xf7, 0xa, 0xda, 0xb0,
+                                                        0xa1, 0xae, 0xc6, 0x1f, 0xb, 0x38, 0xf7, 0x37,
+                                                        0x6, 0xf7, 0xe, 0x5d, 0xc8, 0xfb, 0x10, 0xfb,
+                                                        0x0, 0xfb, 0xe, 0x66, 0x7f, 0x7a, 0x1e, 0xf7,
+                                                        0xd6, 0xfb, 0x7c, 0x15, 0xb, 0xda, 0xfb, 0x4f,
+                                                        0x6, 0x75, 0x63, 0x52, 0x71, 0x59, 0x8a, 0x8,
+                                                        0x5a, 0x8a, 0x60, 0xa0, 0xbf, 0x1a, 0xf7, 0xa5,
+                                                        0xfb, 0x42, 0x7, 0xe, 0xfb, 0x93, 0x38, 0xa,
+                                                        0xf7, 0x93, 0xfb, 0x6, 0xed, 0xf7, 0x60, 0xfc,
+                                                        0xa2, 0x31, 0xd7, 0xfc, 0x8, 0x3c, 0x6, 0xb,
+                                                        0xdc, 0xfb, 0x48, 0x6, 0xfb, 0x2, 0xc7, 0x54,
+                                                        0xf7, 0xa, 0x8a, 0x1e, 0xbf, 0xbe, 0xa1, 0xa9,
+                                                        0xac, 0x1f, 0xb, 0x15, 0xfb, 0x56, 0xf7, 0x25,
+                                                        0x2d, 0xf7, 0x1a, 0xf3, 0xf7, 0x41, 0xd2, 0xf7,
+                                                        0x6f, 0xb, 0xfb, 0x3f, 0xf8, 0x8, 0xf7, 0x36,
+                                                        0xe5, 0xfc, 0x3f, 0x31, 0xf7, 0x39, 0xfc, 0x8,
+                                                        0xfb, 0x43, 0x6, 0xb, 0xf8, 0x52, 0xe5, 0x30,
+                                                        0xa, 0xb, 0x8b, 0xe6, 0xf8, 0x10, 0xe6, 0x1,
+                                                        0xb, 0x15, 0xf8, 0x52, 0xe6, 0xfb, 0x43, 0xf7,
+                                                        0xe0, 0xfb, 0x7e, 0x30, 0xf7, 0x1d, 0xfb, 0x85,
+                                                        0xfb, 0x42, 0x6, 0xe, 0x12, 0xab, 0xec, 0xf7,
+                                                        0x98, 0xea, 0x2c, 0xf7, 0x46, 0xb, 0xf8, 0xa5,
+                                                        0xf7, 0x5e, 0x29, 0xfb, 0x4, 0x2d, 0xa, 0xb,
+                                                        0x77, 0x12, 0x9a, 0xf7, 0x42, 0x2e, 0xe8, 0xf7,
+                                                        0x22, 0xf7, 0x41, 0x2d, 0xe9, 0x2d, 0xf7, 0x43,
+                                                        0x13, 0xba, 0x0, 0xb, 0x5a, 0xbb, 0x64, 0xc7,
+                                                        0xc7, 0xbb, 0xb2, 0xbc, 0xbc, 0x5b, 0xb2, 0x4f,
+                                                        0x4f, 0x5b, 0x64, 0x5a, 0x1e, 0xb, 0xf7, 0x27,
+                                                        0xf1, 0x4b, 0xee, 0xf7, 0x6c, 0x28, 0x4b, 0x25,
+                                                        0xf7, 0x1d, 0xb, 0x7c, 0xe6, 0x3c, 0xe5, 0xf0,
+                                                        0xe5, 0xcf, 0xe2, 0xb, 0x7, 0xf7, 0x9e, 0xf8,
+                                                        0x26, 0x5, 0xd7, 0xe2, 0xfb, 0x76, 0x34, 0xb8,
+                                                        0x6, 0xfb, 0x14, 0xfb, 0x54, 0xfb, 0x6, 0xf7,
+                                                        0x54, 0x5, 0xbc, 0xe2, 0xfb, 0x7b, 0x34, 0xd7,
+                                                        0x6, 0xf7, 0x3a, 0xb, 0x34, 0xa, 0x13, 0xbe,
+                                                        0xb, 0x4a, 0xa, 0xf7, 0x83, 0x36, 0xa, 0xb,
+                                                        0xbf, 0xa9, 0x70, 0x5b, 0x2a, 0xa, 0xb, 0x53,
+                                                        0xaf, 0xfb, 0x20, 0xfb, 0x1, 0xfb, 0x20, 0xf7,
+                                                        0x1, 0x51, 0x68, 0x5, 0xe, 0x15, 0x9b, 0xa9,
+                                                        0xf4, 0xa4, 0xd7, 0x1b, 0xb, 0xe9, 0x1, 0xf7,
+                                                        0x8e, 0xee, 0x60, 0xa, 0xe9, 0xfb, 0x42, 0xb,
+                                                        0xc9, 0xaf, 0x75, 0x6d, 0xbe, 0x1f, 0x2d, 0xed,
+                                                        0xf7, 0x81, 0x29, 0x5c, 0x7, 0xa5, 0x62, 0x66,
+                                                        0xa0, 0x41, 0x1b, 0xfb, 0x32, 0xfb, 0x12, 0xb,
+                                                        0xfb, 0xa, 0x42, 0x39, 0xa3, 0x95, 0x64, 0x1e,
+                                                        0xa7, 0xf7, 0xa3, 0x15, 0xd2, 0xcd, 0xba, 0xd9,
+                                                        0xdf, 0xc6, 0x5f, 0x3f, 0x42, 0x53, 0xb, 0x15,
+                                                        0xe7, 0x6, 0xf7, 0x29, 0xf7, 0x1e, 0x3e, 0xa,
+                                                        0x1, 0x82, 0xf7, 0x97, 0xf4, 0xf7, 0x92, 0x3,
+                                                        0xb, 0x76, 0xf7, 0xb1, 0x77, 0x1, 0xb, 0xf7,
+                                                        0xc4, 0xf7, 0x46, 0x15, 0xf7, 0x1d, 0x32, 0x6,
+                                                        0x81, 0x62, 0x64, 0x88, 0x67, 0x1b, 0xfb, 0x14,
+                                                        0x36, 0xb, 0x6, 0x45, 0x57, 0xbd, 0x4c, 0xf7,
+                                                        0x50, 0xf7, 0x30, 0xfb, 0x4d, 0xf7, 0x30, 0x58,
+                                                        0x4c, 0xca, 0x5b, 0x5, 0xb, 0x8b, 0xe5, 0xf7,
+                                                        0x27, 0xe3, 0xf7, 0x1d, 0x5f, 0xa, 0xf7, 0x9,
+                                                        0xec, 0xf1, 0xee, 0xb, 0x66, 0xac, 0x6c, 0xb4,
+                                                        0xb4, 0xac, 0xaa, 0xb0, 0xb2, 0x6a, 0xa9, 0x62,
+                                                        0x62, 0x6a, 0x6d, 0x64, 0x1e, 0xb, 0x7c, 0xe7,
+                                                        0x3c, 0xe6, 0xf7, 0x86, 0xe6, 0xb, 0x1, 0xa9,
+                                                        0xef, 0xf7, 0xe9, 0xee, 0x3, 0xb, 0xf7, 0xbe,
+                                                        0x45, 0xa, 0xb, 0x5e, 0xf7, 0x46, 0xe5, 0x7,
+                                                        0xb, 0xfb, 0xb1, 0x15, 0xf7, 0x9, 0x6, 0xf7,
+                                                        0x1a, 0x59, 0xa, 0xfb, 0x2e, 0x6, 0xe, 0x79,
+                                                        0xe6, 0xf8, 0x17, 0xe6, 0xf7, 0x7d, 0x52, 0xa,
+                                                        0xb, 0xe7, 0x74, 0x15, 0x75, 0x32, 0x5, 0x79,
+                                                        0xdf, 0xc8, 0x7b, 0xd5, 0x1b, 0xf7, 0x50, 0xa1,
+                                                        0xb, 0x3f, 0xa, 0xbf, 0xb, 0x77, 0x1, 0xdf,
+                                                        0xea, 0xf7, 0x89, 0xea, 0x3, 0xb, 0x15, 0xf7,
+                                                        0x5, 0xf7, 0x10, 0xfb, 0x5, 0x6, 0xb, 0x77,
+                                                        0x1, 0xa1, 0xed, 0xf7, 0xff, 0xea, 0x3, 0xb,
+                                                        0x7c, 0xe5, 0xea, 0xe6, 0xdc, 0xe7, 0xb, 0x6,
+                                                        0xfb, 0x4e, 0xfb, 0xe, 0x15, 0xf7, 0x6, 0xf7,
+                                                        0xe, 0xfb, 0x6, 0x6, 0xb, 0x8b, 0xe6, 0xf7,
+                                                        0x85, 0xe6, 0xf7, 0x82, 0x67, 0xa, 0xec, 0x3,
+                                                        0xb, 0xd2, 0xd2, 0x9c, 0xaa, 0xc6, 0x1f, 0xf7,
+                                                        0x28, 0xbd, 0xea, 0xfb, 0xae, 0x7, 0xb, 0xf7,
+                                                        0xb1, 0x5, 0xb, 0xa7, 0x66, 0x5a, 0x97, 0x56,
+                                                        0x1b, 0xfb, 0x23, 0x27, 0x30, 0xfb, 0x8, 0xb,
+                                                        0x6, 0xca, 0xbb, 0x58, 0xca, 0xfb, 0x4d, 0xfb,
+                                                        0x30, 0x5, 0xe, 0xd2, 0xf7, 0x5f, 0x15, 0xf8,
+                                                        0x5e, 0xf7, 0x2, 0xfc, 0x5e, 0x6, 0xb, 0x15,
+                                                        0xf7, 0x9, 0x6, 0x2b, 0x59, 0xa, 0xfb, 0x2c,
+                                                        0x6, 0xb, 0xaf, 0x76, 0xf8, 0x7a, 0x77, 0x1,
+                                                        0xd2, 0xf8, 0x5d, 0x3, 0xd2, 0xb, 0xe5, 0xf7,
+                                                        0x7c, 0x77, 0x1, 0xb, 0x3, 0x66, 0xa, 0xb,
+                                                        0x79, 0xe4, 0xf8, 0x24, 0xe6, 0xb, 0x7c, 0xe7,
+                                                        0xf7, 0x9f, 0xe7, 0xb, 0xfb, 0x12, 0x1b, 0xfb,
+                                                        0x1b, 0x45, 0x2b, 0x2c, 0x8c, 0x1f, 0xb, 0x67,
+                                                        0x1b, 0x81, 0x7c, 0x8f, 0x91, 0x7b, 0x1f, 0x92,
+                                                        0x76, 0xb, 0xc3, 0x56, 0xf8, 0xd0, 0xf9, 0xf,
+                                                        0xb, 0xd8, 0x16, 0xf8, 0x52, 0xb, 0x77, 0x1,
+                                                        0xf7, 0x8f, 0xb, 0x49, 0x42, 0x1f, 0xd7, 0x8c,
+                                                        0x15, 0xae, 0xa5, 0xac, 0xb, 0x12, 0xa4, 0xea,
+                                                        0xf7, 0xb3, 0xe7, 0x2f, 0xf7, 0x3c, 0xb, 0xfb,
+                                                        0xc, 0x5, 0xb, 0xfb, 0x3, 0x6, 0xb, 0x1a,
+                                                        0xbc, 0x8a, 0xb2, 0xb1, 0xd5, 0x1b, 0xbf, 0xb,
+                                                        0x1, 0xf7, 0x54, 0xf7, 0x6c, 0x3, 0xf7, 0x54,
+                                                        0xb, 0x77, 0x1, 0xf7, 0x93, 0xe5, 0x3, 0xf7,
+                                                        0x93, 0xb, 0x15, 0xf7, 0x2, 0xf7, 0x11, 0xfb,
+                                                        0x2, 0x6, 0xb, 0x15, 0xf7, 0x6, 0xf7, 0x12,
+                                                        0xfb, 0x6, 0x6, 0xb, 0xa4, 0xa0, 0x1f, 0x53,
+                                                        0xca, 0x5, 0x77, 0x71, 0xb, 0x15, 0xf7, 0x4,
+                                                        0xf7, 0x12, 0xfb, 0x4, 0x6, 0xb, 0x15, 0xf7,
+                                                        0xa, 0xf7, 0x24, 0xfb, 0xa, 0x6, 0xb, 0xf7,
+                                                        0x3c, 0xe6, 0xfc, 0x4c, 0x30, 0xf7, 0x3f, 0xb,
+                                                        0xf7, 0x96, 0xe1, 0x1, 0x6e, 0xf9, 0x26, 0x3,
+                                                        0xb, 0xf7, 0x23, 0x15, 0xbd, 0xca, 0x45, 0xbf,
+                                                        0x5, 0xb, 0xc5, 0xfb, 0xc3, 0xf7, 0xd, 0x5,
+                                                        0xe, 0xa1, 0xd8, 0x1e, 0xf6, 0x29, 0x7, 0xe,
+                                                        0x15, 0xf7, 0x3, 0xf7, 0x23, 0xb, 0x30, 0xde,
+                                                        0xfc, 0x10, 0x38, 0xb, 0xd1, 0xf8, 0xc, 0x1,
+                                                        0xb, 0x8b, 0xe9, 0xf7, 0x8f, 0xb
+                                                       };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c
new file mode 100644
index 0000000..45847f6
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c
@@ -0,0 +1,2402 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitFixedBoldItalicFontData [19151] = {0x1,
+                                                              0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x19,
+                                                              0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,
+                                                              0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,
+                                                              0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63,
+                                                              0x0, 0x1, 0x1, 0x1, 0x24, 0xf8, 0x10, 0x0,
+                                                              0xf8, 0x2a, 0x1, 0xf8, 0x2b, 0x2, 0xf8, 0x2c,
+                                                              0x3, 0xf8, 0x14, 0x4, 0xfb, 0xa, 0xfb, 0x8d,
+                                                              0xf9, 0x49, 0xf9, 0xbf, 0x5, 0xf7, 0xad, 0xf,
+                                                              0xf9, 0x94, 0x11, 0xac, 0x1c, 0x44, 0x2e, 0x12,
+                                                              0x0, 0x12, 0x1, 0x1, 0x5, 0xb, 0xd, 0x11,
+                                                              0x19, 0x22, 0x2b, 0x34, 0x3e, 0x45, 0x4b, 0x4d,
+                                                              0x51, 0x5d, 0x65, 0x8f, 0xaa, 0xb9, 0x45, 0x75,
+                                                              0x72, 0x6f, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e,
+                                                              0x49, 0x4a, 0x49, 0x64, 0x6f, 0x74, 0x53, 0x63,
+                                                              0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x61, 0x72,
+                                                              0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68, 0x61,
+                                                              0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e,
+                                                              0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66,
+                                                              0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69,
+                                                              0x67, 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77,
+                                                              0x75, 0x70, 0x67, 0x63, 0x61, 0x72, 0x6f, 0x6e,
+                                                              0x69, 0x6a, 0x6c, 0x69, 0x72, 0x61, 0x70, 0x72,
+                                                              0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+                                                              0x6f, 0x6e, 0x73, 0x63, 0x65, 0x64, 0x69, 0x6c,
+                                                              0x6c, 0x61, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                              0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f,
+                                                              0x6d, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64, 0x20,
+                                                              0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64,
+                                                              0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43,
+                                                              0x68, 0x72, 0x6F, 0x68, 0x20, 0x46, 0x69, 0x78,
+                                                              0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0,
+                                                              0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab, 0x0,
+                                                              0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0,
+                                                              0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1, 0x0,
+                                                              0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3, 0x0,
+                                                              0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87, 0x0,
+                                                              0x27, 0x0, 0x28, 0x1, 0x88, 0x0, 0x29, 0x0,
+                                                              0x2a, 0x1, 0x89, 0x0, 0xb6, 0x0, 0xb7, 0x0,
+                                                              0xb8, 0x1, 0x8a, 0x0, 0xb9, 0x0, 0x2b, 0x0,
+                                                              0x2c, 0x0, 0x2d, 0x0, 0x8c, 0x0, 0x2e, 0x0,
+                                                              0x2f, 0x0, 0xba, 0x0, 0x30, 0x0, 0x8e, 0x0,
+                                                              0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0,
+                                                              0x8d, 0x0, 0xbf, 0x0, 0x31, 0x0, 0x32, 0x0,
+                                                              0x33, 0x0, 0x34, 0x0, 0xc0, 0x1, 0x8b, 0x0,
+                                                              0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1, 0x0,
+                                                              0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37, 0x0,
+                                                              0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5, 0x0,
+                                                              0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42, 0x0,
+                                                              0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca, 0x0,
+                                                              0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc, 0x1,
+                                                              0x8c, 0x1, 0x8d, 0x1, 0x8e, 0x1, 0x8f, 0x1,
+                                                              0x90, 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0,
+                                                              0x21, 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0,
+                                                              0x5d, 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0,
+                                                              0x3e, 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0,
+                                                              0x44, 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0,
+                                                              0x61, 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0,
+                                                              0xaa, 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0,
+                                                              0x71, 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0,
+                                                              0x5, 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0,
+                                                              0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0,
+                                                              0x19, 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0,
+                                                              0x1e, 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0,
+                                                              0x47, 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0,
+                                                              0x65, 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x1,
+                                                              0x91, 0x0, 0x95, 0x0, 0x7c, 0x0, 0x1f, 0x0,
+                                                              0x6a, 0x0, 0x78, 0x0, 0x6b, 0x0, 0x6c, 0x0,
+                                                              0x49, 0x0, 0x86, 0x0, 0xe, 0x0, 0x4a, 0x0,
+                                                              0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x1,
+                                                              0x92, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0,
+                                                              0x1d, 0x1, 0x93, 0x0, 0x97, 0x0, 0x92, 0x0,
+                                                              0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98, 0x0,
+                                                              0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7, 0x0,
+                                                              0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9, 0x0,
+                                                              0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb, 0x0,
+                                                              0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96, 0x0,
+                                                              0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc, 0x0,
+                                                              0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa, 0x0,
+                                                              0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a, 0x0,
+                                                              0xc, 0x0, 0x9c, 0x1, 0x94, 0x0, 0x52, 0x0,
+                                                              0x20, 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0,
+                                                              0x69, 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0,
+                                                              0x75, 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0,
+                                                              0x84, 0x0, 0x54, 0x0, 0xdd, 0x1, 0x95, 0x0,
+                                                              0x66, 0x0, 0x1c, 0x0, 0x18, 0x0, 0x17, 0x0,
+                                                              0x10, 0x0, 0x1, 0x0, 0x62, 0x0, 0x55, 0x0,
+                                                              0xa2, 0x0, 0x14, 0x0, 0xa3, 0x0, 0xa9, 0x0,
+                                                              0x7f, 0x0, 0x99, 0x0, 0x13, 0x0, 0xa4, 0x0,
+                                                              0x56, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0,
+                                                              0xe1, 0x0, 0x40, 0x0, 0x57, 0x0, 0x58, 0x0,
+                                                              0x59, 0x0, 0x5a, 0x0, 0xe2, 0x0, 0xe3, 0x0,
+                                                              0x64, 0x0, 0x5b, 0x0, 0xe4, 0x0, 0x11, 0x0,
+                                                              0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x44,
+                                                              0x0, 0xc1, 0x0, 0xdc, 0x1, 0x2, 0x1, 0x26,
+                                                              0x1, 0x40, 0x1, 0x76, 0x1, 0xbf, 0x2, 0x29,
+                                                              0x2, 0x78, 0x2, 0xfe, 0x3, 0x37, 0x3, 0x84,
+                                                              0x3, 0xa1, 0x3, 0xc9, 0x3, 0xed, 0x4, 0x13,
+                                                              0x4, 0x6e, 0x4, 0xf0, 0x5, 0x3a, 0x5, 0x9a,
+                                                              0x6, 0x8, 0x6, 0x5e, 0x6, 0x83, 0x6, 0xdb,
+                                                              0x6, 0xf4, 0x7, 0x1d, 0x7, 0x38, 0x7, 0x6e,
+                                                              0x7, 0x84, 0x7, 0xc1, 0x8, 0x19, 0x8, 0x45,
+                                                              0x8, 0x85, 0x8, 0xc9, 0x8, 0xf8, 0x9, 0x6e,
+                                                              0x9, 0xb6, 0xa, 0x36, 0xa, 0x52, 0xa, 0x75,
+                                                              0xa, 0x9a, 0xa, 0xbb, 0xb, 0x3c, 0xb, 0x86,
+                                                              0xb, 0xd0, 0xc, 0x48, 0xc, 0xa7, 0xd, 0x1b,
+                                                              0xd, 0x8b, 0xe, 0x2b, 0xe, 0x5c, 0xe, 0xba,
+                                                              0xf, 0x17, 0xf, 0x33, 0xf, 0x59, 0xf, 0x81,
+                                                              0xf, 0x9a, 0xf, 0xcb, 0x10, 0xd, 0x10, 0x56,
+                                                              0x10, 0x8f, 0x10, 0xe0, 0x11, 0x4b, 0x11, 0x7d,
+                                                              0x11, 0xce, 0x12, 0x48, 0x12, 0x67, 0x12, 0x9b,
+                                                              0x12, 0xaf, 0x12, 0xdd, 0x13, 0x88, 0x13, 0xa6,
+                                                              0x14, 0x29, 0x14, 0x62, 0x14, 0x83, 0x14, 0xa5,
+                                                              0x14, 0xc3, 0x14, 0xdc, 0x15, 0x0, 0x15, 0x32,
+                                                              0x15, 0x7e, 0x15, 0xad, 0x16, 0x4c, 0x16, 0xaa,
+                                                              0x17, 0x8, 0x17, 0x21, 0x17, 0x3b, 0x17, 0xb4,
+                                                              0x18, 0x2c, 0x18, 0x4c, 0x18, 0x70, 0x18, 0x94,
+                                                              0x18, 0xbd, 0x18, 0xde, 0x19, 0x29, 0x19, 0x44,
+                                                              0x19, 0xc2, 0x19, 0xfe, 0x1a, 0x5d, 0x1a, 0x7a,
+                                                              0x1a, 0xb5, 0x1a, 0xd3, 0x1b, 0x5a, 0x1b, 0xd7,
+                                                              0x1c, 0x39, 0x1c, 0x6a, 0x1c, 0xaf, 0x1c, 0xeb,
+                                                              0x1d, 0x15, 0x1d, 0x3f, 0x1d, 0xd5, 0x1d, 0xee,
+                                                              0x1e, 0xd, 0x1e, 0x5d, 0x1e, 0x73, 0x1e, 0x9e,
+                                                              0x1e, 0xc0, 0x1e, 0xe9, 0x1f, 0x63, 0x1f, 0x88,
+                                                              0x1f, 0x9e, 0x1f, 0xb4, 0x1f, 0xd9, 0x20, 0x4c,
+                                                              0x20, 0x7d, 0x20, 0xad, 0x20, 0xff, 0x21, 0x5c,
+                                                              0x21, 0xa9, 0x22, 0x9, 0x22, 0x6d, 0x22, 0xae,
+                                                              0x22, 0xbf, 0x23, 0x2f, 0x23, 0xa9, 0x24, 0x38,
+                                                              0x24, 0x4c, 0x24, 0x6c, 0x24, 0x85, 0x24, 0xbe,
+                                                              0x24, 0xde, 0x24, 0xf9, 0x25, 0x4d, 0x25, 0x75,
+                                                              0x25, 0x8d, 0x25, 0xc1, 0x25, 0xda, 0x25, 0xff,
+                                                              0x26, 0x27, 0x26, 0x40, 0x26, 0xb0, 0x26, 0xf8,
+                                                              0x27, 0x45, 0x27, 0x67, 0x27, 0x87, 0x27, 0xec,
+                                                              0x28, 0xa, 0x28, 0x44, 0x28, 0xc6, 0x28, 0xdc,
+                                                              0x28, 0xeb, 0x29, 0x3d, 0x29, 0x6a, 0x29, 0xc9,
+                                                              0x2a, 0x25, 0x2a, 0xc0, 0x2b, 0x2d, 0x2b, 0x6f,
+                                                              0x2b, 0x86, 0x2b, 0xb0, 0x2b, 0xc9, 0x2c, 0x4a,
+                                                              0x2c, 0x78, 0x2c, 0x8f, 0x2c, 0xb2, 0x2d, 0x2e,
+                                                              0x2d, 0x9e, 0x2d, 0xc6, 0x2e, 0x2f, 0x2e, 0x6d,
+                                                              0x2e, 0xe8, 0x2f, 0x32, 0x2f, 0x92, 0x2f, 0xcc,
+                                                              0x2f, 0xff, 0x30, 0x32, 0x30, 0x60, 0x30, 0x7f,
+                                                              0x30, 0xa0, 0x30, 0xed, 0x31, 0x1c, 0x31, 0x5e,
+                                                              0x31, 0xca, 0x32, 0x26, 0x32, 0x81, 0x32, 0xdd,
+                                                              0x33, 0x4, 0x33, 0x25, 0x33, 0x46, 0x33, 0x70,
+                                                              0x33, 0x82, 0x33, 0x9e, 0x33, 0xb7, 0x33, 0xd1,
+                                                              0x34, 0xd, 0x34, 0x97, 0x34, 0xce, 0x35, 0x41,
+                                                              0x35, 0xca, 0x36, 0x73, 0x37, 0xe, 0x37, 0x41,
+                                                              0x37, 0x65, 0x37, 0xc8, 0x37, 0xdd, 0x37, 0xde,
+                                                              0x38, 0x2f, 0x38, 0x7d, 0x38, 0xe4, 0x39, 0x44,
+                                                              0x39, 0xf0, 0x3a, 0x51, 0x3a, 0x94, 0x3a, 0xe9,
+                                                              0x3b, 0x3a, 0x3b, 0x88, 0x3b, 0xde, 0x3b, 0xff,
+                                                              0x3c, 0x26, 0x3c, 0x4a, 0x3c, 0x61, 0x3c, 0x72,
+                                                              0x3c, 0xa1, 0x3c, 0xe1, 0x3d, 0x2c, 0x3d, 0x78,
+                                                              0x3d, 0xba, 0x3e, 0xe, 0x3e, 0x76, 0x3e, 0xac,
+                                                              0x3f, 0x0, 0x3f, 0x42, 0xe, 0x8b, 0xe6, 0xd8,
+                                                              0xe6, 0xf7, 0x68, 0xe6, 0x1, 0x63, 0x16, 0xf7,
+                                                              0x8d, 0x34, 0xa, 0x31, 0x6, 0xba, 0xd8, 0x5,
+                                                              0xf7, 0x82, 0x6, 0x9e, 0x3e, 0x5, 0x34, 0x36,
+                                                              0xa, 0xf7, 0x8a, 0x42, 0xa, 0x50, 0x6, 0xfb,
+                                                              0x0, 0xf8, 0x6b, 0x5, 0xfb, 0x92, 0x4b, 0xa,
+                                                              0xf7, 0x15, 0x6, 0xfb, 0x8d, 0x7d, 0xa, 0x4c,
+                                                              0x6, 0xf7, 0x9e, 0xf7, 0x3c, 0x15, 0xf7, 0x9,
+                                                              0xf7, 0x41, 0xb5, 0xfb, 0x41, 0x5, 0xe, 0x8b,
+                                                              0xe5, 0x31, 0xf7, 0x40, 0x7e, 0xe6, 0x52, 0xf7,
+                                                              0x50, 0x93, 0xf7, 0x41, 0x31, 0xe5, 0x12, 0x13,
+                                                              0xa8, 0xfb, 0xa, 0x16, 0xf7, 0x85, 0x6, 0x9f,
+                                                              0xe5, 0x5, 0x3d, 0x6, 0xb8, 0xd0, 0x5, 0xf7,
+                                                              0x4, 0x6, 0x6a, 0xfb, 0x33, 0x5, 0xf7, 0xcc,
+                                                              0x6, 0x13, 0x58, 0xaf, 0xf7, 0x40, 0x5, 0x3c,
+                                                              0x6, 0x13, 0x94, 0x7a, 0x39, 0x5, 0xfb, 0x1e,
+                                                              0x6, 0xab, 0xf7, 0x2c, 0x5, 0xb1, 0x6, 0x81,
+                                                              0x5a, 0x5c, 0xa, 0xb3, 0xf7, 0x50, 0x5, 0x3c,
+                                                              0x6, 0x82, 0x5a, 0x5, 0x64, 0x6, 0xa8, 0x97,
+                                                              0xa, 0xf7, 0x1e, 0x6, 0x13, 0xa8, 0x7a, 0x38,
+                                                              0x5c, 0xa, 0xaf, 0xf7, 0x41, 0x5, 0xfc, 0x6f,
+                                                              0x6, 0x13, 0xa4, 0x77, 0x31, 0x5, 0xe8, 0x6,
+                                                              0xfb, 0x8e, 0xfc, 0x12, 0x5, 0x4a, 0x6, 0xf7,
+                                                              0xa0, 0xf7, 0x34, 0x15, 0xf5, 0xf7, 0x39, 0x69,
+                                                              0xfb, 0x39, 0x5, 0xe, 0x40, 0xa, 0xf7, 0x7a,
+                                                              0x77, 0x1, 0xf7, 0xb6, 0xf8, 0xf3, 0x15, 0xf7,
+                                                              0xef, 0xd5, 0x77, 0xf2, 0xfb, 0xe4, 0xfb, 0xa,
+                                                              0x5, 0xfb, 0xc2, 0xfd, 0x2e, 0x23, 0xa, 0x40,
+                                                              0xa, 0xf7, 0x76, 0x77, 0x1, 0xf7, 0x91, 0xf8,
+                                                              0xee, 0x15, 0xf7, 0x42, 0xf7, 0x4, 0xf7, 0x13,
+                                                              0xfb, 0x4, 0xcd, 0xae, 0xfb, 0x16, 0xf7, 0x23,
+                                                              0x66, 0xa, 0xfb, 0x55, 0xfb, 0x22, 0x5, 0xfb,
+                                                              0x71, 0xfd, 0x12, 0x23, 0xa, 0x40, 0xa, 0xd3,
+                                                              0xf7, 0xe, 0x1, 0xf8, 0x57, 0xf9, 0x6, 0x6d,
+                                                              0xa, 0xa5, 0xf7, 0xe, 0x5, 0xfb, 0x4, 0x6,
+                                                              0xfb, 0x66, 0xfb, 0xe, 0x5a, 0xa, 0xa5, 0xf7,
+                                                              0xe, 0x4c, 0xa, 0xfb, 0xd0, 0xfd, 0x80, 0x23,
+                                                              0xa, 0x40, 0xa, 0xf7, 0x7a, 0x77, 0x1, 0x76,
+                                                              0x16, 0x20, 0xa, 0xfb, 0x31, 0xf8, 0x44, 0x15,
+                                                              0xf7, 0xc2, 0x3a, 0xb2, 0xc5, 0xfb, 0xa7, 0xf7,
+                                                              0xb, 0x5, 0xe, 0x40, 0xa, 0xba, 0xf7, 0x5c,
+                                                              0x1, 0xf7, 0xd1, 0xf9, 0x3f, 0x15, 0x5d, 0xae,
+                                                              0x67, 0xbf, 0xce, 0xc7, 0xc1, 0xc9, 0xba, 0x69,
+                                                              0xb0, 0x57, 0x4d, 0x49, 0x58, 0x48, 0x1e, 0xce,
+                                                              0x95, 0x15, 0xa5, 0x9e, 0x9f, 0xa8, 0x9e, 0x9a,
+                                                              0x7d, 0x79, 0x73, 0x70, 0x77, 0x75, 0x79, 0x7c,
+                                                              0x99, 0x9b, 0x1e, 0xfc, 0x29, 0xfd, 0x49, 0x23,
+                                                              0xa, 0x40, 0xa, 0xc5, 0x77, 0xf7, 0x3b, 0x77,
+                                                              0x1, 0xf7, 0x50, 0xf9, 0x10, 0x15, 0xd6, 0x72,
+                                                              0x5, 0xae, 0xa1, 0x9c, 0xa5, 0xa6, 0x1b, 0xa2,
+                                                              0x9d, 0x7d, 0x7d, 0x9f, 0x1f, 0x7b, 0xa1, 0xa2,
+                                                              0x7b, 0xaa, 0x1b, 0xd3, 0xc6, 0xc6, 0xca, 0xa6,
+                                                              0x1f, 0x3f, 0xa4, 0x5, 0x76, 0x80, 0x75, 0x61,
+                                                              0x69, 0x1b, 0x7a, 0x7b, 0x93, 0x96, 0x7b, 0x1f,
+                                                              0x9c, 0x70, 0x70, 0xa2, 0x69, 0x1b, 0x3d, 0x55,
+                                                              0x49, 0x56, 0x73, 0x1f, 0xfb, 0x65, 0xfd, 0x10,
+                                                              0x23, 0xa, 0x8b, 0xe6, 0xf7, 0x36, 0xe6, 0xf7,
+                                                              0x13, 0xe6, 0x12, 0xf8, 0x64, 0xed, 0x3c, 0xeb,
+                                                              0x13, 0xf0, 0x77, 0x16, 0xf7, 0xee, 0x6, 0xf7,
+                                                              0x17, 0xf4, 0xdc, 0xed, 0x1f, 0x8c, 0xb1, 0x77,
+                                                              0xaf, 0x6a, 0xa1, 0x6e, 0x9e, 0x18, 0x13, 0xe8,
+                                                              0xc8, 0xab, 0xb0, 0xb1, 0xce, 0x1a, 0xc9, 0x66,
+                                                              0xd0, 0xfb, 0x1f, 0x1e, 0xfb, 0xc6, 0x36, 0xa,
+                                                              0xdd, 0x74, 0xa, 0x39, 0x6, 0xf7, 0x79, 0xf7,
+                                                              0x91, 0x15, 0xa8, 0xf7, 0x13, 0x5, 0xf7, 0x20,
+                                                              0x6, 0xc8, 0xa3, 0x70, 0x71, 0x8c, 0x1f, 0x44,
+                                                              0x23, 0x88, 0x71, 0x1e, 0xfb, 0x43, 0xfb, 0x91,
+                                                              0x15, 0xaa, 0xf7, 0x36, 0x5, 0xf6, 0x6, 0x13,
+                                                              0xf0, 0xb3, 0xf7, 0x0, 0x80, 0x4d, 0x4f, 0x38,
+                                                              0x6e, 0x6d, 0x1f, 0xe, 0x79, 0xe8, 0xf8, 0x1d,
+                                                              0xe7, 0x1, 0xa9, 0xec, 0x3, 0xf8, 0x7a, 0xf7,
+                                                              0x1e, 0x15, 0x76, 0x65, 0x38, 0x61, 0x39, 0x1b,
+                                                              0xfb, 0x0, 0x5b, 0xcb, 0xdb, 0xf7, 0x41, 0xf7,
+                                                              0x24, 0xd7, 0xe7, 0xc2, 0xbc, 0x77, 0x6f, 0xb2,
+                                                              0x1f, 0x76, 0x22, 0x5, 0xea, 0x6, 0xbc, 0xf7,
+                                                              0x89, 0x7a, 0xa, 0x83, 0x60, 0x5, 0x96, 0x80,
+                                                              0x5c, 0xab, 0x34, 0x1b, 0xfb, 0x4d, 0xfb, 0x39,
+                                                              0xfb, 0x25, 0xfb, 0x59, 0xfb, 0x2, 0xc0, 0xfb,
+                                                              0x12, 0xf7, 0x4c, 0xb4, 0xf7, 0x16, 0x9d, 0xd1,
+                                                              0xe7, 0x1f, 0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x56,
+                                                              0xe5, 0xf8, 0x19, 0xe7, 0x8c, 0x77, 0x12, 0x8b,
+                                                              0xee, 0x13, 0xe8, 0xf7, 0x0, 0xfb, 0x46, 0x15,
+                                                              0x71, 0xa7, 0xa0, 0x89, 0xa0, 0x1b, 0xc9, 0xca,
+                                                              0xb5, 0xd5, 0xa1, 0x84, 0xad, 0x64, 0x94, 0x1f,
+                                                              0x8f, 0x98, 0x5, 0xe8, 0xd7, 0xba, 0xb3, 0xd7,
+                                                              0x1f, 0x60, 0xcf, 0x5, 0x72, 0x5b, 0x42, 0x63,
+                                                              0x37, 0x1b, 0xfb, 0x1d, 0x75, 0xed, 0xd7, 0xf7,
+                                                              0x2b, 0xf7, 0x2e, 0xcb, 0xe0, 0xc1, 0xba, 0x79,
+                                                              0x70, 0xb0, 0x1f, 0x76, 0x24, 0x5, 0xeb, 0x6,
+                                                              0x13, 0xd8, 0xbc, 0xf7, 0x85, 0x7a, 0xa, 0x83,
+                                                              0x60, 0x5, 0x13, 0xe8, 0xa4, 0x6f, 0x58, 0x9c,
+                                                              0x4e, 0x1b, 0xfb, 0x42, 0xfb, 0x4a, 0x25, 0xfb,
+                                                              0x84, 0xfb, 0x8, 0xd6, 0x2e, 0xf7, 0x1, 0x7a,
+                                                              0x1f, 0x70, 0x2e, 0x5, 0x8e, 0x95, 0x9e, 0x8e,
+                                                              0x9b, 0x1b, 0x94, 0x95, 0x85, 0x80, 0x7f, 0x7e,
+                                                              0x81, 0x7c, 0x80, 0x7d, 0x8f, 0x95, 0x7c, 0x1f,
+                                                              0xe, 0x3a, 0xa, 0xf8, 0x78, 0xeb, 0x3, 0x55,
+                                                              0x16, 0xf7, 0xa2, 0x6, 0xf7, 0x57, 0xf7, 0x3d,
+                                                              0xf4, 0xf7, 0x91, 0xf7, 0xc, 0x40, 0xdf, 0xfb,
+                                                              0x27, 0x1f, 0xfb, 0xbc, 0x36, 0xa, 0xdf, 0x74,
+                                                              0xa, 0x38, 0x6, 0xf7, 0x48, 0x16, 0xda, 0xf8,
+                                                              0x10, 0x5, 0xf7, 0xb, 0x6, 0xea, 0xb9, 0x59,
+                                                              0x46, 0xfb, 0x28, 0x2d, 0xfb, 0x5, 0xfb, 0x1d,
+                                                              0x1f, 0xe, 0x8b, 0xe6, 0xd6, 0xf7, 0x39, 0x31,
+                                                              0xe5, 0xf7, 0x20, 0xe6, 0x12, 0x13, 0xb0, 0x75,
+                                                              0x16, 0xf8, 0xa4, 0x6, 0xb5, 0xf7, 0x59, 0x66,
+                                                              0xa, 0x73, 0x21, 0x5, 0xfb, 0x9a, 0x6, 0xa9,
+                                                              0xf7, 0x2a, 0x5, 0xf7, 0x10, 0x6, 0x13, 0xd0,
+                                                              0x7b, 0x40, 0x56, 0xa, 0xbc, 0xf7, 0x84, 0x4e,
+                                                              0xa, 0x7c, 0x40, 0x5, 0xfb, 0xe, 0x6, 0xa8,
+                                                              0x97, 0xa, 0xf7, 0x9a, 0x6, 0x76, 0x25, 0x96,
+                                                              0xa, 0xb3, 0xf7, 0x55, 0x5, 0xfc, 0xa2, 0x4b,
+                                                              0xa, 0xd1, 0x74, 0xa, 0x43, 0x6, 0xe, 0x54,
+                                                              0xa, 0xf7, 0x7a, 0x77, 0x12, 0x13, 0xb8, 0xf7,
+                                                              0x99, 0xf8, 0xf3, 0x15, 0xf7, 0xe4, 0xd5, 0x77,
+                                                              0xf2, 0xfb, 0xd9, 0xfb, 0xa, 0x5, 0xfb, 0xa6,
+                                                              0xfd, 0x2e, 0x28, 0xa, 0x54, 0xa, 0xf7, 0x76,
+                                                              0x77, 0x12, 0x13, 0xb8, 0xf7, 0x73, 0xf8, 0xee,
+                                                              0x15, 0xf7, 0x44, 0xf7, 0x4, 0xf7, 0x13, 0xfb,
+                                                              0x4, 0xcf, 0xae, 0xfb, 0x18, 0xf7, 0x23, 0x4e,
+                                                              0xa, 0xfb, 0x58, 0xfb, 0x22, 0x5, 0xfb, 0x52,
+                                                              0xfd, 0x12, 0x28, 0xa, 0x54, 0xa, 0xd4, 0xf7,
+                                                              0xd, 0x12, 0x13, 0xb8, 0xf8, 0x34, 0xf9, 0x7,
+                                                              0x92, 0xa, 0xa5, 0xf7, 0xd, 0x4c, 0xa, 0xfb,
+                                                              0x66, 0xfb, 0xd, 0x6d, 0xa, 0xa5, 0xf7, 0xd,
+                                                              0x65, 0xa, 0xfb, 0xac, 0xfd, 0x80, 0x28, 0xa,
+                                                              0x8b, 0xe5, 0xf7, 0x27, 0xe4, 0xa1, 0x8b, 0x1,
+                                                              0xdc, 0xea, 0xf7, 0x14, 0xed, 0xbd, 0xeb, 0x3,
+                                                              0x75, 0x16, 0x33, 0xa, 0x2a, 0xa, 0xf7, 0x7f,
+                                                              0xf8, 0xe4, 0x15, 0xf7, 0xc0, 0x40, 0xb1, 0xc5,
+                                                              0xfb, 0xa5, 0xf7, 0xb, 0x5, 0xe, 0x8b, 0xe6,
+                                                              0xf7, 0x30, 0xce, 0xf7, 0x31, 0xe6, 0x1, 0xf8,
+                                                              0x86, 0xee, 0x3, 0x70, 0x16, 0xf7, 0xa2, 0x6,
+                                                              0xf7, 0x36, 0xf7, 0x54, 0xf3, 0xf7, 0x8f, 0xf7,
+                                                              0xd, 0x4c, 0xe1, 0xfb, 0x28, 0x1f, 0xfb, 0xbc,
+                                                              0x36, 0xa, 0xde, 0x6, 0x6a, 0xfb, 0x31, 0x5,
+                                                              0x4d, 0x6, 0x7e, 0x48, 0x5, 0xc8, 0x6, 0x6b,
+                                                              0xfb, 0x30, 0x5, 0x38, 0x6, 0xf7, 0x48, 0x16,
+                                                              0xac, 0xf7, 0x30, 0x5, 0xf7, 0x12, 0x6, 0x99,
+                                                              0xce, 0x5, 0xfb, 0x12, 0x6, 0xaa, 0xf7, 0x31,
+                                                              0x5, 0xf7, 0xc, 0x6, 0xec, 0xaa, 0x57, 0x44,
+                                                              0xfb, 0x28, 0x39, 0xfb, 0x1, 0xfb, 0x33, 0x1f,
+                                                              0xe, 0x8b, 0xdd, 0xe9, 0xd3, 0xc1, 0xd3, 0xf5,
+                                                              0xdd, 0x1, 0xf8, 0x7b, 0xe4, 0x3, 0x77, 0xf7,
+                                                              0x44, 0x15, 0xe7, 0x6, 0x23, 0x91, 0xca, 0x43,
+                                                              0xf7, 0x25, 0x1b, 0xb2, 0xf7, 0x5, 0x9e, 0xc9,
+                                                              0xe2, 0x1f, 0x61, 0xc8, 0x5, 0x77, 0x68, 0x47,
+                                                              0x63, 0x3d, 0x1b, 0x45, 0x5a, 0xa9, 0xcb, 0x7d,
+                                                              0x1f, 0xf7, 0x32, 0x6, 0xb2, 0xd3, 0x5, 0xfb,
+                                                              0x5d, 0x6, 0x8c, 0x9b, 0x8f, 0xa3, 0x90, 0x99,
+                                                              0x8, 0xf7, 0x6a, 0x6, 0xb3, 0xd3, 0x5, 0xfb,
+                                                              0x71, 0x6, 0xcd, 0xae, 0xc7, 0xb3, 0xdd, 0x1b,
+                                                              0xbe, 0xbe, 0x6f, 0x6a, 0x98, 0x1f, 0x7e, 0x48,
+                                                              0x5, 0xe4, 0x6, 0xb7, 0xf7, 0x66, 0x5, 0x31,
+                                                              0x6, 0x81, 0x5c, 0x5, 0xaa, 0x6c, 0x59, 0x9b,
+                                                              0x5e, 0x1b, 0xfb, 0x10, 0x22, 0x40, 0xfb, 0x5,
+                                                              0x55, 0x1f, 0x48, 0x6, 0x63, 0x43, 0x5, 0xda,
+                                                              0x6, 0x85, 0x71, 0x89, 0x79, 0x8a, 0x81, 0x8,
+                                                              0x54, 0x6, 0xe, 0x8b, 0xe6, 0xdf, 0xf7, 0x2f,
+                                                              0xf7, 0x21, 0xe6, 0x1, 0xd8, 0xec, 0xf7, 0x18,
+                                                              0xed, 0xd5, 0xed, 0x3, 0x75, 0x16, 0xf7, 0xc7,
+                                                              0x6, 0x9f, 0xe6, 0x5, 0xfb, 0x17, 0x6, 0xaa,
+                                                              0xf7, 0x28, 0x5, 0xf7, 0x6, 0x6, 0x7e, 0x4b,
+                                                              0x56, 0xa, 0xb9, 0xf7, 0x70, 0x4e, 0xa, 0x7c,
+                                                              0x4a, 0x65, 0xa, 0xa9, 0xf7, 0x21, 0x88, 0xa,
+                                                              0x70, 0xfb, 0x12, 0x56, 0xa, 0xb9, 0xf7, 0x6d,
+                                                              0x5, 0xfc, 0xa2, 0x4b, 0xa, 0xda, 0x6, 0x3b,
+                                                              0x7d, 0xa, 0x3b, 0x6, 0xe, 0x79, 0xe8, 0xf5,
+                                                              0xe9, 0xf7, 0x56, 0xe5, 0x1, 0x9f, 0xee, 0x3,
+                                                              0xf7, 0xa7, 0xf7, 0x49, 0x15, 0xf7, 0x32, 0x6,
+                                                              0x7c, 0x3f, 0x5, 0x78, 0x65, 0x56, 0x80, 0x58,
+                                                              0x1b, 0x3a, 0x3f, 0xb1, 0xeb, 0xf7, 0x33, 0xf7,
+                                                              0xc, 0xf4, 0xf7, 0x9, 0xc9, 0xaa, 0x87, 0x6d,
+                                                              0xb9, 0x1f, 0x77, 0x2d, 0x96, 0xa, 0xba, 0xf7,
+                                                              0x6e, 0x66, 0xa, 0x82, 0x65, 0x5, 0xa1, 0x71,
+                                                              0x62, 0x9b, 0x41, 0x1b, 0xfb, 0x38, 0xfb, 0x50,
+                                                              0xfb, 0x23, 0xfb, 0x64, 0xfb, 0x2b, 0xf7, 0x1,
+                                                              0x3c, 0xf7, 0x1f, 0xeb, 0xf7, 0x5, 0xb6, 0x94,
+                                                              0xa3, 0x1f, 0xa7, 0xf7, 0x27, 0x5, 0xba, 0x55,
+                                                              0xa, 0xfb, 0xc1, 0x6, 0xe, 0x79, 0xe2, 0x8b,
+                                                              0xee, 0xa6, 0xe3, 0x70, 0xcd, 0xf7, 0x70, 0xcd,
+                                                              0x12, 0x8b, 0xee, 0x13, 0xec, 0xf7, 0x93, 0xf7,
+                                                              0x3c, 0x15, 0xf7, 0x32, 0x6, 0x7c, 0x44, 0x5,
+                                                              0x7a, 0x67, 0x59, 0x80, 0x5a, 0x1b, 0x37, 0x3b,
+                                                              0xac, 0xe8, 0xf7, 0x29, 0xf7, 0xc, 0xf7, 0x4,
+                                                              0xf7, 0x9, 0xc9, 0xaa, 0x78, 0x6f, 0xb9, 0x1f,
+                                                              0x13, 0xdc, 0x77, 0x34, 0x96, 0xa, 0xba, 0xf7,
+                                                              0x70, 0x66, 0xa, 0x82, 0x60, 0x5, 0xa2, 0x67,
+                                                              0x6c, 0x9f, 0x41, 0x1b, 0xfb, 0x42, 0xfb, 0x46,
+                                                              0xfb, 0x2a, 0xfb, 0x57, 0xfb, 0x21, 0xf7, 0x1,
+                                                              0x41, 0xf7, 0x1f, 0xeb, 0xf7, 0x5, 0xb3, 0x94,
+                                                              0xa3, 0x1f, 0xa7, 0xf7, 0x1d, 0x5, 0xba, 0x6,
+                                                              0x9f, 0xe3, 0x5, 0xfb, 0xc1, 0x6, 0xab, 0xf7,
+                                                              0xf4, 0x48, 0xa, 0x8b, 0xe6, 0xf7, 0x23, 0xe6,
+                                                              0xf7, 0x26, 0xe6, 0x1, 0xc4, 0xe9, 0xf7, 0x72,
+                                                              0xea, 0x3, 0x64, 0x16, 0xf7, 0x90, 0x34, 0xa,
+                                                              0x3a, 0x6, 0xa8, 0xf7, 0x23, 0x5, 0xf7, 0x72,
+                                                              0x6, 0x6e, 0xfb, 0x23, 0x5, 0x3b, 0x6, 0x79,
+                                                              0x30, 0x5, 0xf7, 0x8f, 0x34, 0xa, 0x3e, 0x6,
+                                                              0xd7, 0xf8, 0x10, 0x5, 0xd9, 0x42, 0xa, 0xfb,
+                                                              0x8f, 0x36, 0xa, 0xdb, 0x6, 0x6d, 0xfb, 0x26,
+                                                              0x5, 0xfb, 0x72, 0x6, 0xa9, 0xf7, 0x26, 0x5,
+                                                              0xdc, 0x6, 0x9d, 0xe6, 0x5, 0xfb, 0x90, 0x36,
+                                                              0xa, 0xd8, 0x6, 0x3f, 0x7d, 0xa, 0x3d, 0x6,
+                                                              0xe, 0x3a, 0xa, 0xf7, 0x67, 0xf0, 0x3, 0x9c,
+                                                              0x16, 0xf8, 0x54, 0x6, 0x9f, 0xe6, 0x5, 0xfb,
+                                                              0x41, 0x6, 0xdb, 0xf8, 0x10, 0x5, 0xf7, 0x3f,
+                                                              0x34, 0xa, 0xfc, 0x51, 0x36, 0xa, 0xf7, 0x41,
+                                                              0x6, 0x3b, 0xfc, 0x10, 0x43, 0xa, 0x79, 0xe6,
+                                                              0xf8, 0x22, 0xe6, 0x1, 0x41, 0x79, 0x15, 0xf7,
+                                                              0xaa, 0x6, 0x9f, 0xe6, 0x5, 0x2e, 0x6, 0xdb,
+                                                              0xf8, 0x22, 0x5, 0xe6, 0x34, 0xa, 0xfb, 0xa7,
+                                                              0x36, 0xa, 0xde, 0x6, 0x3b, 0xfc, 0x22, 0x5,
+                                                              0x36, 0x6, 0xf7, 0xd3, 0x72, 0x15, 0x76, 0xa2,
+                                                              0xa4, 0x5e, 0xe9, 0x1b, 0xf7, 0x1e, 0x87, 0x8c,
+                                                              0xa, 0xac, 0x5b, 0xa, 0xfb, 0xa6, 0x6, 0x79,
+                                                              0x2f, 0x5, 0xf7, 0x25, 0x6, 0x53, 0xfb, 0xa8,
+                                                              0x5, 0x40, 0x7c, 0x84, 0x5c, 0x5e, 0x1b, 0x73,
+                                                              0x83, 0x97, 0x9e, 0x9d, 0x91, 0xa3, 0x91, 0xa4,
+                                                              0x1f, 0xa1, 0xec, 0x4e, 0xa, 0xe, 0x68, 0xa,
+                                                              0xf7, 0x90, 0xf8, 0xf3, 0x15, 0xf7, 0xde, 0xd5,
+                                                              0x78, 0xf2, 0xfb, 0xd3, 0xfb, 0xa, 0x5, 0xfb,
+                                                              0x77, 0xfd, 0x2e, 0x15, 0x2b, 0xa, 0xe, 0x75,
+                                                              0xa, 0xf7, 0x76, 0x77, 0x62, 0xa, 0xf7, 0x6b,
+                                                              0xf8, 0xf0, 0x15, 0xf7, 0x49, 0xf7, 0x2, 0xf7,
+                                                              0xa, 0xfb, 0x2, 0xcf, 0xae, 0xfb, 0x16, 0xf7,
+                                                              0x21, 0x66, 0xa, 0xfb, 0x56, 0xfb, 0x20, 0x5,
+                                                              0xfb, 0x24, 0xfd, 0x14, 0x15, 0x2b, 0xa, 0xe,
+                                                              0x75, 0xa, 0xd2, 0xf7, 0xf, 0x62, 0xa, 0xf8,
+                                                              0x34, 0xf9, 0x5, 0x4a, 0xa, 0xfb, 0x69, 0xfb,
+                                                              0xf, 0x4a, 0xa, 0xfb, 0x84, 0xfd, 0x80, 0x15,
+                                                              0x2b, 0xa, 0xe, 0x8b, 0xe3, 0xf8, 0x2, 0xe3,
+                                                              0xde, 0xf7, 0xf, 0x62, 0xa, 0xf7, 0xca, 0xf9,
+                                                              0x5, 0x4a, 0xa, 0xfb, 0xd4, 0xfd, 0x80, 0x15,
+                                                              0xf8, 0x55, 0x6, 0x9e, 0xe3, 0x5, 0xfb, 0x40,
+                                                              0x6, 0xdb, 0xf8, 0x2, 0x5, 0xf7, 0x3e, 0x6,
+                                                              0x9e, 0xe3, 0x5, 0xfc, 0x51, 0x6, 0x78, 0x33,
+                                                              0x5, 0xf7, 0x41, 0x6, 0x3b, 0xfc, 0x2, 0x43,
+                                                              0xa, 0x68, 0xa, 0x9c, 0x16, 0x2b, 0xa, 0xf7,
+                                                              0x56, 0xf8, 0xe6, 0x15, 0xf7, 0xc5, 0x3e, 0xb3,
+                                                              0xc5, 0xfb, 0xac, 0xf7, 0xb, 0x5, 0xe, 0x79,
+                                                              0xe5, 0xf8, 0x22, 0xe7, 0x1, 0x9a, 0xed, 0xf7,
+                                                              0x73, 0xe8, 0x3, 0x6d, 0xbb, 0x15, 0x76, 0xa2,
+                                                              0xf7, 0xa, 0x5e, 0xe9, 0x1b, 0xf7, 0x1e, 0xc8,
+                                                              0x8c, 0xa, 0xf7, 0x11, 0x5b, 0xa, 0xfc, 0x29,
+                                                              0x6, 0x79, 0x2f, 0x5, 0xf7, 0x4c, 0x6, 0x53,
+                                                              0xfb, 0xa8, 0x5, 0x40, 0x7c, 0x67, 0x5c, 0x3a,
+                                                              0x1b, 0x45, 0x50, 0xa1, 0xd7, 0x9b, 0x1f, 0xa1,
+                                                              0xec, 0x4e, 0xa, 0xe, 0x3a, 0xa, 0xcf, 0xed,
+                                                              0xf7, 0x8e, 0xf7, 0x17, 0x3, 0x68, 0x16, 0xf7,
+                                                              0x9d, 0x34, 0xa, 0x38, 0x6, 0xa0, 0xf0, 0xd1,
+                                                              0xc0, 0x9f, 0x70, 0xa1, 0x66, 0x9a, 0x71, 0x19,
+                                                              0xa6, 0x56, 0xa6, 0x58, 0x9b, 0x58, 0x8, 0xf7,
+                                                              0x34, 0x34, 0xa, 0x20, 0x6, 0x7b, 0xb7, 0x76,
+                                                              0xa6, 0x75, 0xb5, 0x7e, 0xa8, 0x66, 0xc0, 0x80,
+                                                              0x9c, 0xf7, 0x67, 0xf7, 0x3c, 0x18, 0xd0, 0x34,
+                                                              0xa, 0xfb, 0x87, 0x6e, 0xa, 0xb7, 0x6, 0xfb,
+                                                              0x61, 0xfb, 0x36, 0xae, 0xf7, 0x36, 0x5, 0xdd,
+                                                              0x34, 0xa, 0xfb, 0x9c, 0x6e, 0xa, 0xdf, 0x74,
+                                                              0xa, 0x37, 0x6, 0xe, 0x3a, 0xa, 0xf7, 0xf,
+                                                              0xed, 0x3, 0x8d, 0x16, 0xf8, 0xb4, 0x6, 0xbf,
+                                                              0xf7, 0x92, 0x5, 0x27, 0x6, 0x6b, 0xfb, 0x37,
+                                                              0x5, 0xfb, 0x89, 0x6, 0xdd, 0xf8, 0x10, 0x5,
+                                                              0xf7, 0x14, 0x34, 0xa, 0xfb, 0xdd, 0x36, 0xa,
+                                                              0xf0, 0x6, 0x3b, 0x7d, 0xa, 0x26, 0x6, 0xe,
+                                                              0x3a, 0xa, 0xf7, 0xe, 0xed, 0x3, 0x8d, 0x16,
+                                                              0xf8, 0xb1, 0x6, 0xc2, 0xf7, 0x9c, 0x7b, 0xa,
+                                                              0x66, 0xfb, 0x41, 0x5, 0xfb, 0x86, 0x6, 0xae,
+                                                              0xf7, 0x37, 0xf7, 0x34, 0xb4, 0x9a, 0xc9, 0xfb,
+                                                              0x36, 0x63, 0xac, 0xf7, 0x2e, 0x5, 0xf7, 0x14,
+                                                              0x34, 0xa, 0xfb, 0xdc, 0x36, 0xa, 0xf0, 0x6,
+                                                              0x66, 0xfb, 0x47, 0x30, 0x74, 0x7f, 0x4b, 0xe4,
+                                                              0xa2, 0x6e, 0xfb, 0x1d, 0x5, 0x26, 0x6, 0xe,
+                                                              0x3a, 0xa, 0x4e, 0x16, 0xf7, 0x77, 0x34, 0xa,
+                                                              0x3e, 0x6, 0xda, 0xf7, 0xce, 0xc5, 0xfb, 0xac,
+                                                              0x5, 0xc7, 0x6, 0xf7, 0x2b, 0xf7, 0xa4, 0x5b,
+                                                              0xfb, 0xc6, 0x5, 0x41, 0x6, 0x7a, 0x30, 0x5,
+                                                              0xf7, 0x71, 0x42, 0xa, 0x55, 0x6, 0xc9, 0xf8,
+                                                              0x10, 0x5, 0xdb, 0x42, 0xa, 0xfb, 0x61, 0x6,
+                                                              0xfb, 0x32, 0xfb, 0xb6, 0x5b, 0xf7, 0xb6, 0x5,
+                                                              0xfb, 0x5f, 0x4b, 0xa, 0xd7, 0x6, 0x2e, 0x7d,
+                                                              0xa, 0x53, 0x6, 0xe, 0x7f, 0xe8, 0xf8, 0x18,
+                                                              0xe8, 0x1, 0x4f, 0x7f, 0x15, 0xf7, 0xa4, 0x94,
+                                                              0xa, 0x28, 0x6, 0xc9, 0xf7, 0xd1, 0xf7, 0x4a,
+                                                              0xfc, 0x2e, 0x5, 0xe7, 0x6, 0xeb, 0xf8, 0x75,
+                                                              0x6c, 0xa, 0xea, 0x6, 0x4e, 0xfb, 0xd0, 0xfb,
+                                                              0x3e, 0xf8, 0x2d, 0x7e, 0xa, 0xfc, 0x18, 0x5,
+                                                              0x3c, 0x6, 0xe, 0x7f, 0xe7, 0xf8, 0x13, 0xe8,
+                                                              0xc1, 0xe0, 0x73, 0xdf, 0x8f, 0x77, 0x12, 0x13,
+                                                              0xd0, 0x4f, 0x7f, 0x15, 0xf7, 0xa5, 0x5b, 0xa,
+                                                              0x27, 0x6, 0xca, 0xf7, 0xcd, 0xf7, 0x4c, 0xfc,
+                                                              0x29, 0x5, 0xe5, 0x6, 0xea, 0xf8, 0x6f, 0x6c,
+                                                              0xa, 0xeb, 0x6, 0x4e, 0xfb, 0xc6, 0xfb, 0x3e,
+                                                              0xf8, 0x23, 0x7e, 0xa, 0xfc, 0x13, 0x5, 0x3b,
+                                                              0x6, 0xf7, 0x62, 0xf8, 0xbe, 0x15, 0xdb, 0x72,
+                                                              0x5, 0xae, 0xa0, 0x9e, 0xa6, 0xa7, 0x1b, 0xa6,
+                                                              0xa0, 0x79, 0x7b, 0xa3, 0x1f, 0x13, 0xe8, 0x7d,
+                                                              0xa0, 0xa1, 0x7e, 0xa8, 0x1b, 0xd6, 0xca, 0xc7,
+                                                              0xcb, 0xa6, 0x1f, 0x3c, 0xa4, 0x5, 0x76, 0x7f,
+                                                              0x74, 0x60, 0x67, 0x1b, 0x77, 0x79, 0x95, 0x98,
+                                                              0x78, 0x1f, 0x13, 0xd0, 0x9c, 0x72, 0x70, 0x9f,
+                                                              0x6a, 0x1b, 0x39, 0x52, 0x48, 0x55, 0x71, 0x1f,
+                                                              0xe, 0x79, 0xe7, 0xf8, 0x1f, 0xe9, 0x1, 0xa2,
+                                                              0xf1, 0xf7, 0xff, 0xec, 0x3, 0xa2, 0xf7, 0x57,
+                                                              0x15, 0xfb, 0x24, 0xf3, 0x46, 0xf7, 0x6, 0xf7,
+                                                              0x4f, 0xf7, 0x31, 0xf7, 0xe, 0xf7, 0x8d, 0xf7,
+                                                              0xb, 0x45, 0xe6, 0xfb, 0x2d, 0xfb, 0x5d, 0xfb,
+                                                              0x1e, 0xfb, 0x49, 0xfb, 0x4f, 0x1e, 0xf1, 0x9a,
+                                                              0x15, 0xf7, 0xc, 0xd4, 0xf7, 0x1f, 0xf7, 0x24,
+                                                              0xf7, 0x0, 0xb1, 0x4d, 0x46, 0x23, 0x3e, 0xfb,
+                                                              0x34, 0xfb, 0x2c, 0x2f, 0x61, 0xc9, 0xd5, 0x1e,
+                                                              0xe, 0x8b, 0xe6, 0x30, 0xf7, 0x3d, 0xa4, 0xf7,
+                                                              0x4f, 0x92, 0xf7, 0x42, 0x30, 0xe6, 0x12, 0x66,
+                                                              0xea, 0x13, 0xac, 0xf7, 0xe2, 0xe6, 0x15, 0xaa,
+                                                              0xf7, 0x2b, 0x5, 0xaf, 0x6, 0x81, 0x58, 0x5,
+                                                              0xd4, 0x6, 0xb1, 0xf7, 0x4f, 0x5, 0x41, 0x6,
+                                                              0x83, 0x5d, 0x5, 0x65, 0x6, 0xa7, 0xf7, 0x1f,
+                                                              0x5, 0xf7, 0x1a, 0x6, 0x13, 0xb4, 0x7b, 0x38,
+                                                              0x5, 0xd5, 0x6, 0xae, 0xf7, 0x42, 0x5, 0xfc,
+                                                              0x10, 0x6, 0xfb, 0x1e, 0xfb, 0x30, 0xfb, 0xf,
+                                                              0xfb, 0x7a, 0xfb, 0x1c, 0xe2, 0x42, 0xe4, 0x1f,
+                                                              0xf8, 0x16, 0x6, 0x13, 0x74, 0xae, 0xf7, 0x3d,
+                                                              0x5, 0x40, 0x6, 0x13, 0xac, 0x7a, 0x3d, 0x5,
+                                                              0xfc, 0x2e, 0xf7, 0x25, 0x15, 0xf7, 0x8, 0xed,
+                                                              0xf7, 0xb, 0xf6, 0x99, 0xb2, 0x8a, 0x66, 0x84,
+                                                              0x1e, 0x50, 0xfb, 0xb9, 0x5, 0x5c, 0x82, 0x67,
+                                                              0x89, 0x7a, 0x1b, 0x30, 0x64, 0xc3, 0xe4, 0x1f,
+                                                              0xe, 0x77, 0xa, 0xf7, 0x71, 0x77, 0x58, 0xa,
+                                                              0xf7, 0x8d, 0xf8, 0xf0, 0x15, 0xf7, 0xe4, 0xd8,
+                                                              0x76, 0xf2, 0xfb, 0xd7, 0xfb, 0xd, 0x5, 0xfb,
+                                                              0x72, 0xfc, 0x61, 0x24, 0xa, 0x77, 0xa, 0xf7,
+                                                              0x6d, 0x77, 0x58, 0xa, 0xf7, 0x3f, 0xf9, 0x13,
+                                                              0x15, 0xc0, 0x66, 0xf7, 0x46, 0xf3, 0xf7, 0xa,
+                                                              0x22, 0xcc, 0xaf, 0xfb, 0x14, 0xf7, 0x23, 0x5,
+                                                              0x2c, 0x6, 0xfb, 0xeb, 0xfc, 0xd6, 0x24, 0xa,
+                                                              0x77, 0xa, 0xc9, 0xf7, 0xf, 0x58, 0xa, 0xf8,
+                                                              0x38, 0xf9, 0x5, 0x5a, 0xa, 0xa4, 0xf7, 0xf,
+                                                              0x4c, 0xa, 0xfb, 0x65, 0xfb, 0xf, 0x5a, 0xa,
+                                                              0xa5, 0xf7, 0xf, 0x5, 0xfb, 0x4, 0x6, 0xfb,
+                                                              0x88, 0xfc, 0xb6, 0x24, 0xa, 0x79, 0xe4, 0xf8,
+                                                              0x21, 0xe6, 0x1, 0x9e, 0xf1, 0xf7, 0xee, 0xed,
+                                                              0x3, 0xf7, 0x81, 0xf9, 0x3d, 0x15, 0xf7, 0xc2,
+                                                              0x40, 0xb2, 0xc5, 0xfb, 0xa7, 0xf7, 0xc, 0x5,
+                                                              0xfb, 0xb0, 0xfc, 0xda, 0x24, 0xa, 0x7c, 0xe6,
+                                                              0x3e, 0x76, 0xf8, 0x93, 0xe6, 0x8f, 0x77, 0x12,
+                                                              0x97, 0xf2, 0xf8, 0x5, 0xeb, 0x13, 0x6c, 0x7f,
+                                                              0xa7, 0x15, 0xbf, 0x59, 0xc1, 0xbf, 0x5, 0x13,
+                                                              0x9c, 0x6d, 0xb5, 0xbe, 0x7c, 0xbf, 0x1b, 0xf7,
+                                                              0x62, 0xf7, 0x1c, 0xf7, 0x2c, 0xf7, 0x7b, 0x8a,
+                                                              0x1f, 0xb2, 0x81, 0xb0, 0x7a, 0xac, 0x1e, 0xc6,
+                                                              0xc6, 0x57, 0xbb, 0x56, 0x58, 0x5, 0x13, 0xac,
+                                                              0xa9, 0x68, 0x59, 0x9c, 0x4c, 0x1b, 0xfb, 0x92,
+                                                              0x2e, 0xfb, 0x6e, 0xfb, 0x2f, 0x5b, 0x97, 0x62,
+                                                              0x9e, 0x6a, 0x1f, 0xdd, 0xda, 0x15, 0x83, 0x9e,
+                                                              0x88, 0xa5, 0x8c, 0xa5, 0x8, 0xf7, 0x3, 0xe4,
+                                                              0xf7, 0x23, 0xf7, 0x1b, 0xb3, 0xaa, 0x80, 0x7a,
+                                                              0xa1, 0x1e, 0xfb, 0x9b, 0xfb, 0xfa, 0x15, 0xf7,
+                                                              0xc4, 0xf7, 0xbd, 0x5, 0x93, 0x78, 0x8e, 0x74,
+                                                              0x74, 0x1a, 0x27, 0x41, 0xfb, 0x33, 0xfb, 0x2d,
+                                                              0x67, 0x6c, 0x95, 0x9c, 0x76, 0x1e, 0xe, 0x77,
+                                                              0xa, 0xbb, 0xdf, 0xcb, 0x77, 0x58, 0xa, 0xf7,
+                                                              0x2c, 0xf9, 0xf, 0x15, 0xd9, 0x71, 0xa0, 0xaf,
+                                                              0x9d, 0xa6, 0xa6, 0x8a, 0x19, 0xa4, 0x8a, 0x9e,
+                                                              0x80, 0x9b, 0x80, 0x8, 0x7a, 0xa3, 0xa0, 0x77,
+                                                              0xaf, 0x1b, 0xd5, 0xc6, 0xc6, 0xcb, 0xa6, 0x1f,
+                                                              0x3f, 0xa4, 0x5, 0x76, 0x80, 0x73, 0x60, 0x69,
+                                                              0x1b, 0x74, 0x7a, 0x9a, 0x9a, 0x76, 0x1f, 0x9a,
+                                                              0x77, 0x73, 0x9a, 0x68, 0x1b, 0x3c, 0x53, 0x48,
+                                                              0x56, 0x72, 0x1f, 0xfb, 0x19, 0xfc, 0x45, 0x24,
+                                                              0xa, 0x8b, 0xe7, 0xe5, 0xe6, 0xf7, 0x59, 0xe7,
+                                                              0x1, 0xf8, 0x7d, 0xed, 0x3, 0x84, 0x16, 0xf7,
+                                                              0xca, 0x5b, 0xa, 0xfb, 0x15, 0x46, 0xa, 0xf7,
+                                                              0x11, 0x6, 0xf7, 0x3b, 0xdf, 0xe6, 0xf7, 0x16,
+                                                              0x1f, 0xf3, 0x8a, 0x3a, 0xc2, 0xfb, 0xa, 0x1b,
+                                                              0xfb, 0xa8, 0x6, 0x78, 0x2f, 0x5, 0xde, 0x6,
+                                                              0x3b, 0xfc, 0xe, 0x5, 0x38, 0x6, 0xf7, 0x6f,
+                                                              0xf7, 0x49, 0x15, 0xb3, 0xf7, 0x59, 0x5, 0xeb,
+                                                              0x6, 0xc5, 0xcb, 0x73, 0x51, 0x20, 0x2b, 0x83,
+                                                              0x3d, 0x1f, 0xe, 0xfb, 0x9, 0x76, 0xc1, 0xf7,
+                                                              0x40, 0xf8, 0x11, 0xe6, 0x1, 0xba, 0xec, 0xf7,
+                                                              0xfd, 0xe9, 0x3, 0xd7, 0x45, 0x15, 0xa8, 0x47,
+                                                              0x5, 0xab, 0xcb, 0xa8, 0xa1, 0xaf, 0x1b, 0xa7,
+                                                              0xa1, 0x7e, 0x7e, 0xa2, 0x1f, 0x7f, 0xa1, 0xa1,
+                                                              0x80, 0xa7, 0x1b, 0xc3, 0xac, 0xa6, 0xb8, 0xc3,
+                                                              0x1f, 0x5f, 0xca, 0x5, 0x67, 0x60, 0x7c, 0x83,
+                                                              0x78, 0x1b, 0x73, 0x76, 0x9b, 0xa2, 0x6f, 0x1f,
+                                                              0xf7, 0x3f, 0xb5, 0xed, 0xf7, 0x28, 0xf7, 0x27,
+                                                              0x1a, 0xeb, 0x5e, 0xf7, 0x16, 0xfb, 0x3d, 0xfb,
+                                                              0x37, 0xfb, 0x43, 0xfb, 0x11, 0xfb, 0x6c, 0xfb,
+                                                              0x7, 0xbd, 0x48, 0xd4, 0x73, 0x1e, 0x69, 0x62,
+                                                              0x5, 0x93, 0xf7, 0x95, 0x15, 0xf7, 0x3b, 0xf7,
+                                                              0x22, 0xd4, 0xdb, 0xec, 0xb5, 0x40, 0x3a, 0xfb,
+                                                              0x13, 0xfb, 0x1c, 0x29, 0x37, 0x47, 0x42, 0xb0,
+                                                              0xf3, 0x1e, 0xe, 0x8b, 0xe7, 0xf7, 0xe, 0xe7,
+                                                              0xf7, 0x38, 0xe7, 0x1, 0xf5, 0xed, 0xf7, 0xb8,
+                                                              0xee, 0x3, 0x8e, 0x16, 0xf7, 0x98, 0x5b, 0xa,
+                                                              0x3d, 0x6, 0xa4, 0xf7, 0xe, 0x5, 0xdd, 0x6,
+                                                              0xd2, 0xfb, 0x2, 0x9d, 0x6a, 0x9b, 0x67, 0x95,
+                                                              0x68, 0x19, 0xf7, 0x22, 0x5b, 0xa, 0x3c, 0x6,
+                                                              0x2e, 0x97, 0xa, 0xf7, 0xa, 0x9d, 0xc9, 0xdf,
+                                                              0xe6, 0x1a, 0xe9, 0x3b, 0xb6, 0x26, 0x1e, 0xfb,
+                                                              0xb5, 0x6, 0x78, 0x2f, 0x8a, 0xa, 0x3b, 0xfc,
+                                                              0xe, 0x5, 0x37, 0x6, 0xf7, 0x77, 0xf7, 0x6a,
+                                                              0x15, 0xad, 0xf7, 0x38, 0x5, 0xf7, 0x18, 0x6,
+                                                              0xa2, 0xc5, 0x83, 0x5b, 0x2c, 0x25, 0x7e, 0x59,
+                                                              0x1f, 0xe, 0x75, 0xe9, 0xf8, 0x34, 0xe9, 0x12,
+                                                              0xeb, 0xf6, 0xf7, 0x81, 0xf4, 0x13, 0xe0, 0x82,
+                                                              0x75, 0x15, 0xf2, 0x6, 0x95, 0xba, 0x5, 0x80,
+                                                              0x9a, 0xdb, 0x67, 0xd2, 0x1b, 0x13, 0x70, 0xf7,
+                                                              0x41, 0xf1, 0xc3, 0xf7, 0x1e, 0xf7, 0x3, 0xfb,
+                                                              0x1c, 0x99, 0x33, 0x9d, 0x1f, 0x4c, 0x98, 0x54,
+                                                              0xac, 0xb4, 0x1a, 0xc7, 0xca, 0xa5, 0xee, 0xb6,
+                                                              0xb1, 0x76, 0x7b, 0xac, 0x1e, 0x13, 0xe0, 0x79,
+                                                              0x33, 0x5, 0xf2, 0x6, 0xb8, 0xf7, 0x6f, 0x5,
+                                                              0x24, 0x6, 0x85, 0x69, 0x5, 0x9b, 0x69, 0x55,
+                                                              0x9d, 0x5f, 0x1b, 0xfb, 0x45, 0x2c, 0x41, 0xfb,
+                                                              0xc, 0x34, 0xf0, 0x4d, 0xea, 0x81, 0x1f, 0xc1,
+                                                              0x84, 0xe9, 0x81, 0x55, 0x1a, 0x58, 0x4c, 0x68,
+                                                              0xfb, 0x0, 0x54, 0x5b, 0xa5, 0xa4, 0x61, 0x1e,
+                                                              0x9a, 0xcf, 0x5, 0x24, 0x6, 0xe, 0x75, 0xe6,
+                                                              0xf8, 0x2b, 0xe6, 0x1, 0xe4, 0xef, 0xf7, 0x6e,
+                                                              0xee, 0x3, 0x82, 0x75, 0x15, 0xec, 0x6, 0x95,
+                                                              0xb9, 0x5, 0x79, 0x9f, 0xbc, 0x6f, 0xd8, 0x1b,
+                                                              0xf7, 0x3a, 0xeb, 0xcb, 0xf7, 0x3, 0xf7, 0x2,
+                                                              0x41, 0xa5, 0x31, 0x98, 0x1f, 0x62, 0x90, 0xfb,
+                                                              0x4, 0x95, 0xcd, 0x1a, 0xb5, 0xcd, 0xbe, 0xe1,
+                                                              0xb2, 0xae, 0x75, 0x7c, 0xaa, 0x1e, 0x7c, 0x36,
+                                                              0x96, 0xa, 0xb5, 0xf7, 0x69, 0x7a, 0xa, 0x84,
+                                                              0x69, 0x5, 0x9a, 0x6b, 0x66, 0x9e, 0x61, 0x1b,
+                                                              0xfb, 0x36, 0x22, 0x3c, 0xfb, 0x13, 0x31, 0xdb,
+                                                              0x65, 0xdb, 0x82, 0x1f, 0xbf, 0x86, 0xf5, 0x83,
+                                                              0x51, 0x1a, 0x59, 0x45, 0x69, 0x35, 0x56, 0x64,
+                                                              0x99, 0xb0, 0x62, 0x1e, 0x97, 0xcb, 0x7a, 0xa,
+                                                              0xf7, 0xb1, 0xf8, 0x3c, 0x48, 0xa, 0xa1, 0xf7,
+                                                              0x57, 0xf7, 0xaa, 0xe2, 0x1, 0xea, 0xf6, 0xf7,
+                                                              0x7d, 0xf4, 0x3, 0xf7, 0x42, 0x2f, 0x15, 0x8e,
+                                                              0x96, 0xa0, 0x8f, 0x9e, 0x1b, 0x94, 0x96, 0x84,
+                                                              0x7f, 0x7e, 0x7c, 0x80, 0x7b, 0x7f, 0x7b, 0x8f,
+                                                              0x96, 0x7a, 0x1f, 0x59, 0x4c, 0x5, 0x6f, 0xab,
+                                                              0xa2, 0x89, 0xa2, 0x1b, 0xd1, 0xd1, 0xb9, 0xdc,
+                                                              0xa4, 0x83, 0xb0, 0x60, 0x95, 0x1f, 0x95, 0xa8,
+                                                              0x5, 0xf7, 0x30, 0x93, 0xe3, 0xc6, 0xee, 0x1a,
+                                                              0xf4, 0x3c, 0xa4, 0x2b, 0x97, 0x1e, 0x5f, 0x90,
+                                                              0xfb, 0xb, 0x94, 0xca, 0x1a, 0xb4, 0xd3, 0xba,
+                                                              0xe6, 0xb4, 0xb1, 0x76, 0x7d, 0xac, 0x1e, 0x7a,
+                                                              0x3b, 0x5, 0xf2, 0x6, 0xb9, 0xf7, 0x5e, 0x5,
+                                                              0x25, 0x6, 0x84, 0x6b, 0x5, 0x99, 0x68, 0x64,
+                                                              0x9d, 0x5e, 0x1b, 0xfb, 0x40, 0xfb, 0x6, 0x40,
+                                                              0xfb, 0xc, 0x35, 0xe0, 0x67, 0xe1, 0x82, 0x1f,
+                                                              0xc2, 0x86, 0xf7, 0x6, 0x83, 0x54, 0x1a, 0x5b,
+                                                              0x40, 0x6b, 0x2f, 0x53, 0x61, 0x98, 0xae, 0x60,
+                                                              0x1e, 0x97, 0xc8, 0x5, 0x25, 0x6, 0x5d, 0xfb,
+                                                              0x58, 0x5, 0xf2, 0x6, 0x96, 0xb6, 0x9c, 0x7e,
+                                                              0xad, 0x78, 0xc0, 0x83, 0x19, 0xe, 0x3a, 0xa,
+                                                              0xc6, 0x16, 0xf7, 0xf3, 0x34, 0xa, 0xfb, 0x12,
+                                                              0x6, 0xd9, 0xf8, 0x10, 0x5, 0xf7, 0x14, 0x6,
+                                                              0x75, 0xfb, 0x5, 0x56, 0xa, 0xb4, 0xf7, 0x60,
+                                                              0x5, 0xfc, 0xbb, 0x6, 0x62, 0xfb, 0x60, 0x96,
+                                                              0xa, 0xa3, 0xf7, 0x5, 0x5, 0xf7, 0x15, 0x6,
+                                                              0x3d, 0x7d, 0xa, 0xfb, 0x15, 0x6, 0xe, 0x8b,
+                                                              0xe6, 0xb4, 0xe5, 0xf7, 0x9, 0xe5, 0xb5, 0xe6,
+                                                              0x1, 0xf7, 0x26, 0xe0, 0xf7, 0xa0, 0xe1, 0x3,
+                                                              0x99, 0x16, 0xf7, 0xd4, 0x6, 0x9c, 0xe6, 0x5,
+                                                              0xfb, 0xc, 0x6, 0x92, 0xb4, 0x5, 0xf7, 0x9,
+                                                              0x6, 0xf7, 0x14, 0xf1, 0xaf, 0xf7, 0x28, 0xe6,
+                                                              0x45, 0xa1, 0x36, 0x1f, 0xfb, 0x1e, 0x6, 0x92,
+                                                              0xb5, 0x5, 0xf7, 0xf, 0x6, 0x9b, 0xe6, 0x5,
+                                                              0xfb, 0xd4, 0x6, 0x7a, 0x30, 0x5, 0xf7, 0x6,
+                                                              0x6, 0x46, 0x7d, 0xa, 0xfb, 0x7, 0x6, 0xf7,
+                                                              0x73, 0xf7, 0x17, 0x15, 0xa1, 0xf7, 0x9, 0x5,
+                                                              0xf7, 0x10, 0x6, 0xaa, 0xcf, 0x8a, 0x60, 0x3c,
+                                                              0x38, 0x91, 0x6c, 0x1f, 0xe, 0x79, 0xe7, 0xf8,
+                                                              0x20, 0xe7, 0x1, 0xd6, 0xea, 0xf7, 0x8a, 0xea,
+                                                              0x3, 0x84, 0xf8, 0x6a, 0x15, 0xdd, 0x6, 0x54,
+                                                              0xfb, 0xa3, 0x5, 0x87, 0x77, 0x88, 0x79, 0x7a,
+                                                              0x1a, 0xfb, 0x1, 0x8c, 0xc2, 0x56, 0xf7, 0x12,
+                                                              0x1b, 0xf7, 0x15, 0xf1, 0xc3, 0xf7, 0x2e, 0xab,
+                                                              0x1f, 0xc0, 0xf7, 0xaa, 0x5c, 0xa, 0x9d, 0xe7,
+                                                              0x5, 0xfb, 0xa0, 0x6, 0x78, 0x2f, 0x5, 0xeb,
+                                                              0x6, 0x57, 0xfb, 0x9b, 0x5, 0x35, 0x7a, 0x6a,
+                                                              0x5c, 0x25, 0x1b, 0x35, 0x7a, 0xaf, 0xb4, 0x8a,
+                                                              0x1f, 0x98, 0x8e, 0x98, 0x8d, 0x98, 0x1e, 0xc4,
+                                                              0xf7, 0xac, 0x5, 0xe9, 0x5b, 0xa, 0xfb, 0xa4,
+                                                              0x6, 0xe, 0x79, 0xa, 0xf7, 0x7e, 0x77, 0x59,
+                                                              0xa, 0xf7, 0x61, 0xf8, 0xf0, 0x15, 0xf7, 0xdc,
+                                                              0xd7, 0x77, 0xf3, 0xfb, 0xd0, 0xfb, 0xd, 0x8f,
+                                                              0xa, 0xfb, 0x5f, 0x25, 0xa, 0xe, 0x79, 0xa,
+                                                              0xf7, 0x7a, 0x77, 0x59, 0xa, 0xf7, 0x3a, 0xf8,
+                                                              0xed, 0x15, 0xf7, 0x41, 0xf5, 0xf7, 0x11, 0x21,
+                                                              0xcd, 0xaf, 0xfb, 0x15, 0xf7, 0x23, 0x5, 0x2c,
+                                                              0x6, 0xfb, 0x55, 0xfb, 0x22, 0x5, 0x31, 0xfb,
+                                                              0x46, 0x25, 0xa, 0xe, 0x79, 0xa, 0xd6, 0xf7,
+                                                              0xf, 0x59, 0xa, 0xf7, 0xf8, 0xf9, 0x5, 0x15,
+                                                              0xf7, 0x1, 0x6, 0xa5, 0xf7, 0xf, 0x86, 0xa,
+                                                              0xfb, 0x62, 0xfb, 0xf, 0x15, 0xf7, 0x2, 0x6,
+                                                              0xa6, 0xf7, 0xf, 0x86, 0xa, 0xfb, 0x47, 0xfb,
+                                                              0xb4, 0x25, 0xa, 0xe, 0x79, 0xa, 0x59, 0xa,
+                                                              0xa2, 0xf8, 0x60, 0x25, 0xa, 0xf7, 0x1a, 0xf7,
+                                                              0x17, 0x15, 0xf7, 0xbb, 0x3e, 0xb0, 0xc5, 0xfb,
+                                                              0xa0, 0xf7, 0xe, 0x5, 0xe, 0xf8, 0x6b, 0xe6,
+                                                              0x1, 0xf7, 0x2b, 0xec, 0xf7, 0x55, 0xe9, 0x3,
+                                                              0xf7, 0x2b, 0x89, 0x15, 0xec, 0x6, 0xf7, 0xb3,
+                                                              0xf8, 0x6d, 0x5, 0xd1, 0x34, 0xa, 0xfb, 0x96,
+                                                              0x36, 0xa, 0xe9, 0x6, 0xfb, 0x6a, 0xfc, 0x0,
+                                                              0x40, 0xf8, 0x0, 0x5, 0xdc, 0x34, 0xa, 0xfb,
+                                                              0x95, 0x36, 0xa, 0xd8, 0x6, 0xe, 0xa0, 0x76,
+                                                              0xf8, 0x5e, 0x77, 0xac, 0xe6, 0x1, 0x93, 0xed,
+                                                              0x3, 0x84, 0x16, 0xdd, 0x6, 0xf7, 0x49, 0xf7,
+                                                              0xc6, 0xc3, 0xfb, 0xc6, 0x5, 0xdd, 0x6, 0xf7,
+                                                              0x39, 0xf8, 0x6b, 0x5, 0xbc, 0x34, 0xa, 0xfb,
+                                                              0x82, 0x36, 0xa, 0xec, 0x6, 0x2e, 0xfb, 0xab,
+                                                              0x59, 0xf7, 0x9e, 0x5, 0x47, 0x6, 0xfb, 0x34,
+                                                              0xfb, 0xa0, 0xa0, 0xf7, 0xad, 0x5, 0xeb, 0x34,
+                                                              0xa, 0xfb, 0x83, 0x36, 0xa, 0xbd, 0x6, 0xe,
+                                                              0x3a, 0xa, 0x65, 0x16, 0xf7, 0x97, 0x34, 0xa,
+                                                              0x3b, 0x6, 0xf7, 0x1b, 0xf7, 0x11, 0xdf, 0xfb,
+                                                              0x11, 0x5, 0x4c, 0x6e, 0xa, 0xf7, 0x89, 0x34,
+                                                              0xa, 0x47, 0x6, 0xfb, 0x11, 0xf7, 0x55, 0xf7,
+                                                              0x4b, 0xf7, 0x4f, 0x5, 0xd1, 0x34, 0xa, 0xfb,
+                                                              0x76, 0x6e, 0xa, 0xba, 0x6, 0xfb, 0x5, 0xfb,
+                                                              0xa, 0x4b, 0xf7, 0xa, 0x5, 0xc2, 0x34, 0xa,
+                                                              0xfb, 0x84, 0x36, 0xa, 0xd2, 0x6, 0xf5, 0xfb,
+                                                              0x4f, 0xfb, 0x62, 0xfb, 0x55, 0x5, 0x47, 0x6,
+                                                              0xe, 0x3a, 0xa, 0x9d, 0x16, 0xf7, 0xf0, 0x42,
+                                                              0xa, 0xfb, 0x10, 0x6, 0xa7, 0xf7, 0x1c, 0xf7,
+                                                              0x68, 0xf7, 0x88, 0x5, 0xdc, 0x42, 0xa, 0xfb,
+                                                              0x83, 0x36, 0xa, 0xc3, 0x6, 0xfb, 0x1e, 0xfb,
+                                                              0x31, 0x41, 0xf7, 0x31, 0x5, 0xc2, 0x34, 0xa,
+                                                              0xfb, 0x85, 0x4b, 0xa, 0xda, 0x6, 0xf7, 0x3,
+                                                              0xfb, 0x88, 0x70, 0xfb, 0x1c, 0x5, 0xfb, 0x11,
+                                                              0x6, 0xe, 0x8b, 0xe5, 0xf8, 0x8, 0xe5, 0x1,
+                                                              0x9c, 0x16, 0xf7, 0xef, 0x6, 0x9f, 0xe5, 0x5,
+                                                              0xfb, 0x11, 0x6, 0xa7, 0xf7, 0x19, 0xf7, 0x69,
+                                                              0xf7, 0x83, 0x5, 0xdc, 0x46, 0xa, 0xfb, 0x84,
+                                                              0x6, 0x79, 0x31, 0x5, 0xc2, 0x6, 0xfb, 0x1f,
+                                                              0xfb, 0x2d, 0x43, 0xf7, 0x2d, 0x5, 0xc1, 0x46,
+                                                              0xa, 0xfb, 0x83, 0x6, 0x79, 0x31, 0x5c, 0xa,
+                                                              0xf7, 0x5, 0xfb, 0x83, 0x6d, 0xfb, 0x19, 0x5,
+                                                              0xfb, 0x10, 0x6, 0xf7, 0x3e, 0xf8, 0x97, 0x15,
+                                                              0xf7, 0xe1, 0xd8, 0x77, 0xf1, 0xfb, 0xd5, 0xfb,
+                                                              0xc, 0x5, 0xe, 0x8b, 0xe3, 0xf8, 0x1b, 0xe8,
+                                                              0xe3, 0xf7, 0x15, 0x12, 0xf7, 0x38, 0xeb, 0x3b,
+                                                              0xf7, 0x2, 0xd1, 0xf7, 0x3, 0x13, 0xf4, 0xa0,
+                                                              0x16, 0xf7, 0xec, 0x6, 0x9d, 0xe8, 0x5, 0xfb,
+                                                              0xf, 0x6, 0xa5, 0xf7, 0x14, 0xf7, 0x69, 0xf7,
+                                                              0x96, 0x5, 0xda, 0x94, 0xa, 0xfb, 0x82, 0x6,
+                                                              0x79, 0x2e, 0x5, 0xc3, 0x6, 0xfb, 0x20, 0xfb,
+                                                              0x3d, 0x45, 0xf7, 0x3d, 0x5, 0xc1, 0x6, 0x9d,
+                                                              0xe8, 0x5, 0xfb, 0x81, 0x82, 0xa, 0xd9, 0x6,
+                                                              0xf7, 0x1, 0xfb, 0x96, 0x71, 0xfb, 0x14, 0x5,
+                                                              0xfb, 0x11, 0x6, 0xf7, 0xd5, 0xf8, 0xcb, 0x92,
+                                                              0xa, 0xa5, 0xf7, 0x15, 0x4c, 0xa, 0x13, 0xec,
+                                                              0xfb, 0x62, 0xfb, 0x15, 0x15, 0xf7, 0x2, 0x6,
+                                                              0xa5, 0xf7, 0x15, 0x86, 0xa, 0xe, 0x3a, 0xa,
+                                                              0xe4, 0xec, 0x3, 0x98, 0x16, 0xf8, 0x74, 0x6,
+                                                              0xbc, 0xf7, 0x70, 0x66, 0xa, 0x6c, 0xfb, 0x15,
+                                                              0x5, 0xfb, 0x8e, 0x6, 0xf8, 0x2e, 0xf8, 0x2a,
+                                                              0x98, 0xcc, 0x5, 0xfc, 0x58, 0x6, 0x5d, 0xfb,
+                                                              0x61, 0x96, 0xa, 0xa7, 0xf7, 0x6, 0x5, 0xf7,
+                                                              0x6e, 0x6, 0xfc, 0x28, 0xfc, 0x25, 0x5, 0xe,
+                                                              0x8b, 0xe4, 0xf8, 0xd, 0xe5, 0x1, 0xd7, 0xea,
+                                                              0xf7, 0x8d, 0xea, 0x3, 0x8c, 0x16, 0xf8, 0x68,
+                                                              0x6, 0xb9, 0xf7, 0x6d, 0x5, 0x2c, 0x6, 0x71,
+                                                              0xfb, 0x14, 0x5, 0xfb, 0x89, 0x6, 0xf8, 0x23,
+                                                              0xf8, 0x27, 0x99, 0xcb, 0x5, 0xfc, 0x4d, 0x6,
+                                                              0x5e, 0xfb, 0x5f, 0x5, 0xea, 0x6, 0xa5, 0xf7,
+                                                              0x5, 0x5, 0xf7, 0x6a, 0x6, 0xfc, 0x20, 0xfc,
+                                                              0x23, 0x5, 0xf7, 0xbd, 0xf8, 0xb3, 0x15, 0xed,
+                                                              0x6, 0xf7, 0x50, 0xf7, 0x23, 0x58, 0xaf, 0xfb,
+                                                              0x42, 0x21, 0xfb, 0x11, 0xf6, 0x46, 0x69, 0x5,
+                                                              0xe, 0x7c, 0xea, 0x35, 0xea, 0xf5, 0xe9, 0xd0,
+                                                              0xeb, 0x12, 0xaf, 0xed, 0xf7, 0xbd, 0xed, 0x13,
+                                                              0x7c, 0xf8, 0x6, 0x85, 0x15, 0xf7, 0x44, 0x6,
+                                                              0x9e, 0xea, 0x5, 0x3a, 0x6, 0xad, 0xf7, 0x3f,
+                                                              0x92, 0xa7, 0x90, 0xaa, 0x8a, 0xa7, 0x19, 0xee,
+                                                              0xfb, 0x1e, 0x93, 0x6f, 0x3d, 0x2c, 0x71, 0x6e,
+                                                              0x42, 0x1e, 0xa0, 0x3a, 0x5, 0xa2, 0xcb, 0xd6,
+                                                              0x9c, 0xc9, 0x1b, 0xa2, 0xd0, 0x8a, 0x61, 0x80,
+                                                              0x89, 0x80, 0x8a, 0x80, 0x1f, 0x8f, 0x67, 0x64,
+                                                              0x8e, 0x65, 0x1b, 0xfb, 0x8c, 0x6c, 0xfb, 0x25,
+                                                              0x68, 0x1f, 0x13, 0xbc, 0x4e, 0xbc, 0x4c, 0xf5,
+                                                              0xdc, 0xb5, 0xa2, 0xae, 0xcc, 0x1e, 0x13, 0x7c,
+                                                              0xa3, 0xf7, 0x5, 0x15, 0x13, 0xbc, 0x5f, 0x51,
+                                                              0x48, 0x6b, 0x47, 0x1b, 0x66, 0x64, 0x96, 0xa4,
+                                                              0xc7, 0xed, 0x9e, 0xbc, 0xc6, 0xb1, 0x85, 0x89,
+                                                              0xab, 0x1f, 0xe, 0x41, 0xa, 0xf7, 0x75, 0x77,
+                                                              0x12, 0xa6, 0xeb, 0x13, 0x7c, 0xf7, 0x87, 0xf8,
+                                                              0x77, 0x15, 0xf7, 0xde, 0xd7, 0x77, 0xf1, 0xfb,
+                                                              0xd4, 0xfb, 0xd, 0x5, 0xf7, 0xe, 0xfc, 0xb3,
+                                                              0x21, 0xa, 0x8b, 0xe5, 0xee, 0xe4, 0xcc, 0xe6,
+                                                              0x1, 0xae, 0xe9, 0xf7, 0x7e, 0xef, 0x3, 0xf7,
+                                                              0x61, 0xf8, 0x73, 0x15, 0xf7, 0x3f, 0xf4, 0xf7,
+                                                              0x10, 0x22, 0xcc, 0xae, 0xfb, 0x14, 0xf7, 0x23,
+                                                              0x66, 0xa, 0xfb, 0x50, 0xfb, 0x22, 0x5, 0xf7,
+                                                              0x67, 0xfc, 0x9a, 0x22, 0xa, 0x3b, 0xa, 0x1f,
+                                                              0xa1, 0xf7, 0x1, 0x15, 0x2c, 0xa, 0xf7, 0x35,
+                                                              0xf7, 0xb2, 0x3, 0xf7, 0x35, 0xf8, 0x90, 0x15,
+                                                              0xf7, 0xb2, 0xca, 0x7a, 0xe5, 0xfb, 0xaa, 0x23,
+                                                              0x5, 0xe, 0x41, 0xa, 0xca, 0xf7, 0x12, 0x12,
+                                                              0xb3, 0xeb, 0x13, 0x7c, 0xf8, 0x35, 0xf8, 0x87,
+                                                              0x15, 0xf7, 0x8, 0x6, 0xa4, 0xf7, 0x12, 0x5,
+                                                              0xfb, 0x8, 0x6, 0xfb, 0x6a, 0xfb, 0x12, 0x15,
+                                                              0xf7, 0x6, 0x6, 0xa6, 0xf7, 0x12, 0x5, 0xfb,
+                                                              0x9, 0x6, 0xf7, 0x8, 0xfd, 0x8, 0x21, 0xa,
+                                                              0x7c, 0xea, 0xe0, 0xeb, 0x39, 0xec, 0xde, 0xea,
+                                                              0x12, 0x13, 0xd0, 0xf7, 0xa4, 0xc5, 0x15, 0x71,
+                                                              0x97, 0xad, 0x5c, 0xe6, 0x1b, 0xc3, 0xbc, 0x99,
+                                                              0xa0, 0xc7, 0x1f, 0x7d, 0xe7, 0x5, 0x74, 0x47,
+                                                              0x64, 0x82, 0x73, 0x1b, 0x36, 0x8b, 0xcb, 0x9e,
+                                                              0x8e, 0x1f, 0x8c, 0x8d, 0x5, 0xf7, 0x89, 0x6,
+                                                              0x98, 0xb2, 0x94, 0xb3, 0xb4, 0x1a, 0xde, 0x6c,
+                                                              0xe1, 0x2b, 0x60, 0x56, 0x78, 0x68, 0x67, 0x1e,
+                                                              0xb1, 0x77, 0x72, 0x9b, 0x47, 0x1b, 0x42, 0x2d,
+                                                              0x66, 0x89, 0x86, 0x1f, 0x94, 0x2d, 0x5, 0x9c,
+                                                              0xba, 0xc0, 0xa0, 0xb7, 0x1b, 0xac, 0x9b, 0x7f,
+                                                              0x6c, 0x81, 0x8a, 0x80, 0x88, 0x7d, 0x1f, 0x89,
+                                                              0x81, 0x5, 0x13, 0xb0, 0x8d, 0x72, 0x79, 0x8e,
+                                                              0x67, 0x1b, 0xfb, 0x14, 0x40, 0x2c, 0x34, 0x1f,
+                                                              0x4d, 0x8c, 0xb7, 0x5c, 0xd6, 0x1b, 0xd3, 0xc4,
+                                                              0xba, 0xa5, 0xb1, 0x1f, 0x13, 0xd0, 0xe7, 0xf7,
+                                                              0x5f, 0x15, 0xc6, 0x9a, 0xba, 0xb2, 0xb4, 0x1b,
+                                                              0xc5, 0x87, 0x3e, 0x76, 0x89, 0x1f, 0xfb, 0xae,
+                                                              0xfb, 0x1e, 0x15, 0x6e, 0x6a, 0x63, 0x7d, 0x63,
+                                                              0x1b, 0x79, 0x78, 0x95, 0xae, 0x1f, 0x13, 0xb0,
+                                                              0x95, 0x9a, 0xb7, 0xe3, 0x96, 0xab, 0x8a, 0x87,
+                                                              0x9a, 0x1e, 0xe, 0x41, 0xa, 0xf7, 0x75, 0x77,
+                                                              0x12, 0xae, 0xeb, 0x13, 0x7c, 0xf7, 0x74, 0xf8,
+                                                              0xc6, 0x15, 0xf7, 0xc4, 0x3b, 0xb0, 0xc5, 0xfb,
+                                                              0xa9, 0xf7, 0xd, 0x5, 0xd6, 0xfd, 0x2c, 0x21,
+                                                              0xa, 0x7c, 0xe9, 0x39, 0xe9, 0xf7, 0x17, 0xe9,
+                                                              0xf7, 0x18, 0xea, 0x12, 0xad, 0xf2, 0x9b, 0xed,
+                                                              0x13, 0x7c, 0xf7, 0xda, 0xb0, 0x15, 0xa0, 0x63,
+                                                              0x5, 0xf7, 0x45, 0x3f, 0xa, 0xfb, 0x19, 0x6,
+                                                              0x7f, 0xa1, 0xa5, 0xa8, 0x9d, 0xbc, 0xa0, 0xaa,
+                                                              0x19, 0xdf, 0x3f, 0xa, 0xfb, 0x2a, 0x6, 0x81,
+                                                              0x74, 0x6c, 0x44, 0x76, 0x71, 0x8, 0x3c, 0xf7,
+                                                              0x22, 0x73, 0xb3, 0xab, 0x1a, 0xa7, 0xab, 0x94,
+                                                              0xa9, 0x8c, 0x1e, 0xb9, 0x8c, 0xc3, 0x74, 0x9c,
+                                                              0x76, 0xd2, 0xd0, 0x18, 0xb1, 0x64, 0x4b, 0xaa,
+                                                              0x4d, 0x1b, 0x2c, 0x31, 0x4c, 0x34, 0x64, 0xa3,
+                                                              0x6c, 0x8f, 0x7d, 0x1f, 0x89, 0x7, 0x39, 0x69,
+                                                              0x4a, 0x3e, 0x34, 0x1a, 0x13, 0xbc, 0x4e, 0xb4,
+                                                              0x4c, 0xf1, 0xda, 0xb5, 0xad, 0x9d, 0xa7, 0x1e,
+                                                              0x62, 0xd9, 0x15, 0x74, 0x72, 0x6b, 0x7e, 0x6c,
+                                                              0x1b, 0x5f, 0x7b, 0xa5, 0xa4, 0xbf, 0xbd, 0xb2,
+                                                              0xaa, 0x9a, 0x1f, 0xe, 0x41, 0xa, 0xf7, 0x4b,
+                                                              0x77, 0x12, 0xb3, 0xeb, 0x13, 0x7c, 0xf7, 0xb1,
+                                                              0xf8, 0xc4, 0x15, 0x5e, 0xb0, 0x68, 0xc0, 0xcd,
+                                                              0xd0, 0xc0, 0xca, 0xb9, 0x65, 0xaf, 0x55, 0x49,
+                                                              0x48, 0x54, 0x4c, 0x1e, 0xcf, 0x91, 0x15, 0xa7,
+                                                              0xa6, 0xa4, 0xa5, 0xa0, 0x9b, 0x7d, 0x79, 0x72,
+                                                              0x70, 0x75, 0x70, 0x77, 0x7b, 0x96, 0x9a, 0x1e,
+                                                              0x9a, 0xfc, 0xcd, 0x21, 0xa, 0xf7, 0xa2, 0xcf,
+                                                              0x1, 0x73, 0xf9, 0x1c, 0x3, 0xf7, 0x3, 0xf7,
+                                                              0x23, 0x15, 0xc9, 0xbf, 0x48, 0xd7, 0xf8, 0x1,
+                                                              0x8a, 0x2c, 0x4b, 0x6a, 0xa, 0x4a, 0x5, 0xfb,
+                                                              0xeb, 0x6, 0xdd, 0xc1, 0x8e, 0xa, 0x9b, 0x76,
+                                                              0xf8, 0xef, 0x77, 0x1, 0xf7, 0x95, 0x86, 0x15,
+                                                              0xf7, 0x5f, 0xf7, 0x36, 0x58, 0xc0, 0x38, 0x40,
+                                                              0xf7, 0xe, 0xf8, 0x5a, 0x44, 0x94, 0xfb, 0xe,
+                                                              0xfc, 0x5f, 0x5a, 0xd4, 0x49, 0x5c, 0x5, 0xe,
+                                                              0xf7, 0x99, 0xd1, 0x1, 0x69, 0xf9, 0x26, 0x3,
+                                                              0xf0, 0xf7, 0x23, 0x15, 0xc9, 0xbf, 0x51, 0xcd,
+                                                              0x5, 0xf8, 0x9b, 0x6, 0x95, 0xd1, 0x5, 0xfc,
+                                                              0x96, 0x6, 0xe9, 0xc8, 0x8e, 0xa, 0xf7, 0x9f,
+                                                              0xd1, 0x1, 0x69, 0xf9, 0x30, 0x3, 0x69, 0xf7,
+                                                              0x9f, 0x15, 0xf8, 0x96, 0x6, 0x2d, 0x4e, 0x6a,
+                                                              0xa, 0x49, 0x5, 0xfc, 0x9b, 0x6, 0xe, 0xa1,
+                                                              0xf8, 0x3b, 0x1, 0xf7, 0x2d, 0xd1, 0x3, 0xf7,
+                                                              0x2d, 0xa1, 0x15, 0xd1, 0x82, 0xf7, 0xe, 0xf8,
+                                                              0x5e, 0xbc, 0x42, 0xcd, 0xba, 0xfb, 0x9, 0xf7,
+                                                              0x3f, 0xfb, 0x5f, 0xfb, 0x37, 0xbe, 0x56, 0xde,
+                                                              0xd6, 0x5, 0xe, 0xf7, 0x8f, 0xf8, 0x1, 0x1,
+                                                              0xf7, 0x0, 0xf8, 0xc, 0x3, 0xf7, 0x0, 0xf7,
+                                                              0x8e, 0x15, 0xd7, 0xb1, 0xd9, 0xdb, 0xca, 0xd8,
+                                                              0xb5, 0x3a, 0xbf, 0x3f, 0xcc, 0x66, 0x93, 0xcb,
+                                                              0x18, 0x41, 0xf7, 0x2, 0x6a, 0xc2, 0x78, 0xf7,
+                                                              0x1c, 0x8, 0x5c, 0x6, 0x5b, 0xfb, 0x15, 0x56,
+                                                              0x46, 0x25, 0x23, 0x8, 0xe, 0xf7, 0x3a, 0xf2,
+                                                              0x2c, 0x76, 0xde, 0xf3, 0x9b, 0x77, 0x12, 0xcc,
+                                                              0xf8, 0x69, 0x13, 0x68, 0xf7, 0xc, 0xf7, 0x2d,
+                                                              0x15, 0xab, 0xa3, 0xa7, 0xbe, 0xb4, 0x1b, 0x9a,
+                                                              0xaa, 0x76, 0x7a, 0xae, 0x1f, 0x7f, 0xa3, 0xa5,
+                                                              0x81, 0xa4, 0x1b, 0xb6, 0xd2, 0xad, 0xdf, 0xbe,
+                                                              0x1f, 0x13, 0x98, 0x58, 0xc9, 0x5, 0x75, 0x7c,
+                                                              0x65, 0x54, 0x61, 0x1b, 0x74, 0x73, 0x96, 0x98,
+                                                              0x73, 0x1f, 0x13, 0x68, 0x9c, 0x6b, 0x6c, 0x9f,
+                                                              0x71, 0x1b, 0x44, 0x59, 0x48, 0x55, 0x61, 0x1f,
+                                                              0xe, 0xf7, 0x4e, 0xf0, 0x3, 0xf7, 0x4e, 0xf7,
+                                                              0x6f, 0x15, 0xf0, 0xf7, 0x7, 0xbd, 0xfb, 0x6,
+                                                              0xec, 0xc7, 0x52, 0xf3, 0xf7, 0x18, 0xad, 0x7c,
+                                                              0xee, 0xfb, 0x1d, 0x56, 0xb0, 0xf7, 0x1d, 0x4c,
+                                                              0xa, 0x78, 0xfb, 0x19, 0xfb, 0xb, 0xbc, 0x55,
+                                                              0x27, 0xf7, 0x16, 0x6a, 0x20, 0x22, 0x5, 0xe,
+                                                              0x79, 0xd3, 0xd2, 0xd4, 0xf7, 0x3b, 0xd5, 0xd2,
+                                                              0xd0, 0x1, 0x91, 0xe1, 0xc6, 0xd2, 0xf7, 0xb4,
+                                                              0xdb, 0x3, 0xf7, 0xcf, 0xf7, 0x3b, 0x15, 0x6a,
+                                                              0x9b, 0xad, 0x82, 0x9d, 0x1b, 0xf7, 0x0, 0xee,
+                                                              0xf7, 0x1c, 0xf7, 0xe, 0xf7, 0x16, 0x25, 0xcd,
+                                                              0xfb, 0x10, 0xfb, 0x3b, 0xfb, 0x53, 0xfb, 0x22,
+                                                              0xfb, 0x75, 0x22, 0xb6, 0xfb, 0x11, 0xf7, 0x50,
+                                                              0xf7, 0x13, 0xdf, 0xc4, 0xa4, 0xb5, 0x1f, 0x7d,
+                                                              0xcf, 0x5, 0x54, 0x32, 0x47, 0x74, 0x3f, 0x1b,
+                                                              0xfb, 0xb, 0x6b, 0xdd, 0xd8, 0xe5, 0xd6, 0xf7,
+                                                              0x63, 0xf7, 0x4b, 0xf2, 0xc4, 0x55, 0x39, 0x3a,
+                                                              0x54, 0x2c, 0x59, 0x7d, 0x79, 0x91, 0xa3, 0x8f,
+                                                              0x1f, 0x8c, 0x90, 0x8c, 0x8f, 0x8e, 0x91, 0xe2,
+                                                              0xf7, 0x48, 0x18, 0x46, 0x6, 0x82, 0x79, 0x5,
+                                                              0xa3, 0x78, 0x7e, 0x8b, 0x7d, 0x1b, 0x25, 0x2f,
+                                                              0xfb, 0x1d, 0x30, 0x51, 0xb1, 0x79, 0xa8, 0xac,
+                                                              0xaf, 0x9c, 0xa4, 0xa7, 0x1f, 0xa8, 0xf7, 0x3a,
+                                                              0x15, 0x70, 0x85, 0x62, 0xfb, 0x0, 0x4f, 0x1b,
+                                                              0x80, 0x87, 0x93, 0x97, 0xc5, 0xd1, 0xe4, 0xab,
+                                                              0xa3, 0x88, 0x74, 0x82, 0x8a, 0x1f, 0xe, 0x41,
+                                                              0xa, 0xf7, 0x1e, 0x77, 0xdd, 0x77, 0x12, 0x95,
+                                                              0xeb, 0x13, 0x7e, 0xf7, 0x12, 0xf8, 0x95, 0x15,
+                                                              0xdb, 0x71, 0x9a, 0x9f, 0x94, 0xa2, 0xa3, 0x98,
+                                                              0x19, 0xa3, 0x98, 0xa9, 0x7a, 0xaa, 0x79, 0x8,
+                                                              0x7c, 0xa6, 0xa7, 0x7b, 0xa4, 0x1b, 0xf0, 0xbf,
+                                                              0xe3, 0xad, 0x9d, 0x1f, 0x39, 0xa3, 0x5, 0x62,
+                                                              0x70, 0x7d, 0x76, 0x6f, 0x1b, 0x79, 0x79, 0x94,
+                                                              0x97, 0x78, 0x1f, 0x9c, 0x6f, 0x6f, 0xa1, 0x6b,
+                                                              0x1b, 0x29, 0x5c, 0x3d, 0x60, 0x72, 0x1f, 0xf7,
+                                                              0x68, 0xfc, 0x98, 0x22, 0xa, 0x1f, 0x13, 0xbe,
+                                                              0x3b, 0xa, 0x1e, 0x13, 0x7e, 0xa1, 0xf7, 0x1,
+                                                              0x15, 0x13, 0xbe, 0x2c, 0xa, 0x7c, 0xe8, 0x3a,
+                                                              0xe9, 0xf7, 0x9d, 0xe9, 0xdd, 0xe9, 0x12, 0xf8,
+                                                              0x94, 0xef, 0x13, 0x78, 0x80, 0x88, 0x15, 0xf7,
+                                                              0x47, 0x6, 0x94, 0xbb, 0x5, 0x13, 0xb8, 0x70,
+                                                              0xad, 0xb2, 0x6a, 0xd7, 0x1b, 0xf7, 0x5a, 0xe3,
+                                                              0xf7, 0x18, 0xf7, 0x1e, 0xf3, 0x42, 0xe6, 0xfb,
+                                                              0x14, 0x53, 0x54, 0x84, 0x69, 0x5b, 0x1f, 0xb8,
+                                                              0xf7, 0x6d, 0x5, 0xfb, 0x49, 0x44, 0xa, 0xdd,
+                                                              0x6, 0x13, 0x78, 0x32, 0xfc, 0x4d, 0x5, 0x3a,
+                                                              0x6, 0xf7, 0x5b, 0xef, 0x15, 0xe6, 0xc7, 0xd5,
+                                                              0xf7, 0xd, 0xe8, 0xa9, 0x48, 0x58, 0x1e, 0x13,
+                                                              0xb8, 0x35, 0x2d, 0x41, 0x34, 0x63, 0x38, 0xa5,
+                                                              0xe2, 0x1e, 0xe, 0xfb, 0x1d, 0xf9, 0x8f, 0x1,
+                                                              0xf7, 0x37, 0xf7, 0xa5, 0x3, 0xf7, 0xfe, 0xfb,
+                                                              0x1d, 0x15, 0xd5, 0xa8, 0xfb, 0x5b, 0xf9, 0x72,
+                                                              0x41, 0x6e, 0x5, 0xe, 0xfb, 0x73, 0x76, 0xfa,
+                                                              0x7c, 0x77, 0x1, 0xf7, 0x1a, 0xe3, 0x3, 0xf7,
+                                                              0x1a, 0xfb, 0x88, 0x15, 0xe3, 0x6, 0xf7, 0x88,
+                                                              0xfa, 0x7c, 0x5, 0x33, 0x6, 0xe, 0xf7, 0x34,
+                                                              0xdc, 0x3, 0xd5, 0xf7, 0x71, 0x15, 0xdc, 0x7f,
+                                                              0x95, 0x60, 0x61, 0x1a, 0x85, 0x80, 0x45, 0x74,
+                                                              0xfb, 0x19, 0x1e, 0x83, 0x5c, 0x97, 0x52, 0xbd,
+                                                              0x76, 0x8, 0x79, 0xb6, 0xc7, 0x8b, 0xbc, 0x1b,
+                                                              0x9d, 0xe8, 0x5, 0x64, 0x63, 0x8b, 0x95, 0x6b,
+                                                              0x1f, 0x76, 0x92, 0x89, 0xa4, 0x8f, 0xa2, 0x9e,
+                                                              0xf7, 0x9, 0x95, 0xcb, 0x8c, 0x96, 0x8, 0x8c,
+                                                              0x97, 0x8b, 0x93, 0x90, 0x1a, 0xb3, 0x74, 0xc3,
+                                                              0x63, 0xa5, 0x1e, 0xd0, 0xae, 0xbd, 0xdd, 0x98,
+                                                              0xd3, 0xa7, 0xf7, 0x28, 0x18, 0x8f, 0xa2, 0x96,
+                                                              0xa5, 0xa3, 0x91, 0x8, 0x95, 0xb2, 0xaf, 0x8b,
+                                                              0xb2, 0x1b, 0x9e, 0xe8, 0x5, 0x5a, 0x51, 0x8b,
+                                                              0x79, 0x57, 0x1f, 0x52, 0x77, 0x67, 0x51, 0x83,
+                                                              0x5c, 0x75, 0xfb, 0x9, 0x18, 0x76, 0xfb, 0x0,
+                                                              0x77, 0x4a, 0xfb, 0x3, 0x7b, 0x8, 0xe, 0xf8,
+                                                              0x2, 0xda, 0x3, 0xd5, 0xfb, 0x78, 0x15, 0xbc,
+                                                              0xc5, 0x8b, 0x9d, 0xbf, 0x1f, 0xc4, 0x9f, 0xaf,
+                                                              0xc5, 0x93, 0xba, 0xa1, 0xf7, 0x9, 0x18, 0xa0,
+                                                              0xf7, 0x0, 0x9f, 0xcc, 0xf7, 0x3, 0x9b, 0x9c,
+                                                              0xe9, 0x18, 0x3a, 0x97, 0x81, 0xb6, 0xb5, 0x1a,
+                                                              0x91, 0x96, 0xd1, 0xa2, 0xf7, 0x19, 0x1e, 0x93,
+                                                              0xba, 0x7f, 0xc4, 0x59, 0xa0, 0x8, 0x9d, 0x60,
+                                                              0x4f, 0x8b, 0x5a, 0x1b, 0x79, 0x2e, 0x5, 0xb2,
+                                                              0xb3, 0x8b, 0x81, 0xab, 0x1f, 0xa0, 0x84, 0x8d,
+                                                              0x72, 0x87, 0x74, 0x78, 0xfb, 0x9, 0x81, 0x4b,
+                                                              0x8a, 0x7f, 0x8, 0x8a, 0x80, 0x8b, 0x83, 0x86,
+                                                              0x1a, 0x63, 0xa2, 0x53, 0xb3, 0x71, 0x1e, 0x46,
+                                                              0x68, 0x59, 0x39, 0x7e, 0x43, 0x6f, 0xfb, 0x28,
+                                                              0x18, 0x87, 0x74, 0x80, 0x71, 0x73, 0x85, 0x8,
+                                                              0x81, 0x64, 0x67, 0x8b, 0x64, 0x1b, 0xe, 0x25,
+                                                              0xe7, 0xf8, 0xaa, 0xe7, 0x1, 0xf7, 0x0, 0x25,
+                                                              0x15, 0xf7, 0x7c, 0x6, 0x9f, 0xe7, 0x5, 0xfb,
+                                                              0x1b, 0x6, 0xf7, 0x5, 0xf8, 0xaa, 0x5, 0xf7,
+                                                              0x1a, 0x5b, 0xa, 0xfb, 0x7c, 0x6, 0xe, 0x25,
+                                                              0xe7, 0xf8, 0xaa, 0xe7, 0x1, 0xf7, 0x13, 0x81,
+                                                              0x15, 0x78, 0x2f, 0x5, 0xf7, 0x7b, 0x6, 0xf7,
+                                                              0x2c, 0xf9, 0x62, 0x5, 0xfb, 0x7c, 0x6, 0x77,
+                                                              0x2f, 0x5, 0xf7, 0x1b, 0x6, 0xfb, 0x6, 0xfc,
+                                                              0xaa, 0x5, 0xe, 0xf8, 0x68, 0xd5, 0x1, 0xdf,
+                                                              0xf9, 0xb, 0x15, 0x44, 0xb7, 0x2f, 0xf7, 0x22,
+                                                              0xf7, 0x31, 0xd3, 0xf7, 0x5, 0xbd, 0x9d, 0x1e,
+                                                              0x2f, 0x6, 0x3d, 0x64, 0x41, 0x80, 0x70, 0x1b,
+                                                              0x3c, 0x71, 0xc0, 0xaf, 0x8a, 0x1f, 0xe, 0xfb,
+                                                              0x2e, 0x76, 0xf9, 0xe6, 0x77, 0x1, 0xf7, 0x39,
+                                                              0xc6, 0xf7, 0x2c, 0xc6, 0x3, 0xf7, 0xac, 0xf7,
+                                                              0xb0, 0x15, 0xc6, 0x6, 0xeb, 0xf8, 0x1b, 0x5,
+                                                              0x50, 0x6, 0xfb, 0x67, 0xfd, 0xe6, 0x15, 0xc6,
+                                                              0x6, 0xed, 0xf8, 0x1a, 0x5, 0x50, 0x6, 0xe,
+                                                              0xf7, 0x18, 0xf7, 0xbe, 0x1, 0xf7, 0x1d, 0xf7,
+                                                              0xd9, 0x3, 0xf7, 0x1d, 0xf7, 0x8c, 0x15, 0x48,
+                                                              0xbf, 0x5a, 0xd8, 0xed, 0xed, 0xdb, 0xeb, 0xd1,
+                                                              0x57, 0xbf, 0x3c, 0x23, 0x31, 0x38, 0x28, 0x1e,
+                                                              0xe, 0x7c, 0xea, 0xf7, 0xb0, 0xea, 0x1, 0xae,
+                                                              0xf2, 0x3, 0xf8, 0x89, 0xf7, 0x2e, 0x15, 0x62,
+                                                              0x46, 0x4c, 0x6a, 0x38, 0x1b, 0x3e, 0x44, 0xb0,
+                                                              0xd5, 0xee, 0xe5, 0xd5, 0xf7, 0xd, 0xb3, 0xb3,
+                                                              0x80, 0x7c, 0xab, 0x1f, 0x77, 0x30, 0x5, 0xef,
+                                                              0x6, 0xb7, 0xf7, 0x68, 0x7b, 0xa, 0x86, 0x78,
+                                                              0x5, 0x98, 0x69, 0x65, 0x91, 0x62, 0x1b, 0xfb,
+                                                              0x64, 0xfb, 0x11, 0xfb, 0x27, 0xfb, 0x20, 0xfb,
+                                                              0xc, 0xf4, 0x48, 0xf7, 0xa, 0xf0, 0xf0, 0xb3,
+                                                              0xc3, 0xdf, 0x1f, 0xe, 0xf7, 0x79, 0xe6, 0x3,
+                                                              0xf7, 0x79, 0xf8, 0x81, 0x15, 0xe6, 0x6, 0xf7,
+                                                              0x45, 0xf7, 0x1e, 0x5b, 0xaf, 0xfb, 0x36, 0x25,
+                                                              0xfb, 0xc, 0xf1, 0x4b, 0x68, 0x5, 0xe, 0xfb,
+                                                              0x4d, 0x76, 0xf7, 0x58, 0xe8, 0xf7, 0xae, 0xe9,
+                                                              0x1, 0xa4, 0xf1, 0x3, 0xf7, 0x23, 0xfb, 0x46,
+                                                              0x15, 0x7b, 0x9e, 0xa6, 0x7f, 0xac, 0x1b, 0xd3,
+                                                              0xc0, 0xc2, 0xc5, 0xa5, 0x85, 0xac, 0x62, 0x95,
+                                                              0x1f, 0x8f, 0x9c, 0xdd, 0x98, 0xda, 0xad, 0xcf,
+                                                              0xb7, 0x19, 0x60, 0xd4, 0x5, 0x61, 0x46, 0x4c,
+                                                              0x6b, 0x38, 0x1b, 0x3f, 0x43, 0xaf, 0xd2, 0xee,
+                                                              0xe4, 0xd7, 0xf7, 0xe, 0xb5, 0xb2, 0x81, 0x7b,
+                                                              0xaa, 0x1f, 0x77, 0x31, 0x5, 0xef, 0x6, 0xb8,
+                                                              0xf7, 0x66, 0x5, 0x27, 0x6, 0x87, 0x78, 0x5,
+                                                              0x98, 0x69, 0x64, 0x91, 0x62, 0x1b, 0xfb, 0x62,
+                                                              0xfb, 0x12, 0xfb, 0x26, 0xfb, 0x1d, 0xfb, 0x4,
+                                                              0xe4, 0x4a, 0xf6, 0x82, 0x1f, 0x70, 0x31, 0x5,
+                                                              0x8c, 0x95, 0x9f, 0x91, 0x9c, 0x1b, 0x96, 0x95,
+                                                              0x87, 0x7d, 0x7c, 0x79, 0x83, 0x79, 0x7b, 0x7b,
+                                                              0x91, 0x93, 0x83, 0x1f, 0xe, 0xfb, 0x62, 0xd1,
+                                                              0xb4, 0xea, 0x1, 0xf7, 0xae, 0xd9, 0x3, 0xf7,
+                                                              0x5d, 0xfb, 0x46, 0x15, 0x79, 0xa1, 0xa3, 0x81,
+                                                              0xa9, 0x1b, 0xce, 0xc2, 0xc0, 0xca, 0xb8, 0x6b,
+                                                              0x9a, 0x80, 0x8f, 0x1f, 0x8f, 0xa5, 0x5, 0x3d,
+                                                              0x6, 0x6b, 0x24, 0x5, 0x8d, 0x94, 0xa4, 0x91,
+                                                              0x9c, 0x1b, 0x95, 0x92, 0x86, 0x81, 0x78, 0x78,
+                                                              0x84, 0x75, 0x7e, 0x7f, 0x91, 0x93, 0x84, 0x1f,
+                                                              0xe, 0x6f, 0x76, 0xf7, 0xfd, 0xf7, 0x4e, 0xf7,
+                                                              0x8, 0x77, 0x1, 0xc5, 0xf0, 0x3, 0xf7, 0x43,
+                                                              0x5a, 0x15, 0xed, 0x6, 0xa5, 0xf7, 0x1d, 0xd1,
+                                                              0x95, 0xcc, 0xa4, 0xca, 0xb2, 0x19, 0x6c, 0xd3,
+                                                              0x5, 0x60, 0x37, 0x5b, 0x72, 0x49, 0x1b, 0x33,
+                                                              0x76, 0xc1, 0xb0, 0xd6, 0xd2, 0xd3, 0xe6, 0xaf,
+                                                              0xae, 0x80, 0x7c, 0xa8, 0x1f, 0x7c, 0x49, 0x96,
+                                                              0xa, 0xb1, 0xf7, 0x4e, 0x7a, 0xa, 0x85, 0x6c,
+                                                              0x78, 0x91, 0x76, 0x90, 0x78, 0x8e, 0x19, 0xa6,
+                                                              0xf7, 0x19, 0x66, 0xa, 0x70, 0xfb, 0x18, 0x5,
+                                                              0xfb, 0x23, 0x6c, 0x39, 0x2b, 0xfb, 0x9, 0x1a,
+                                                              0xfb, 0x0, 0xf2, 0x6e, 0xb5, 0x7f, 0x1e, 0xe,
+                                                              0xf7, 0xaf, 0xe7, 0x3, 0xf7, 0x2d, 0xf8, 0x77,
+                                                              0x15, 0xf7, 0x37, 0xf2, 0xf7, 0xa, 0x24, 0xca,
+                                                              0xad, 0xfb, 0xe, 0x97, 0xa, 0x2f, 0x6, 0xfb,
+                                                              0x48, 0xfb, 0x1f, 0x5, 0xe, 0x7c, 0xf7, 0x41,
+                                                              0xe9, 0xf7, 0x41, 0x1, 0xf7, 0x6f, 0xf7, 0xd4,
+                                                              0x15, 0x6e, 0xa3, 0x64, 0xd0, 0xcf, 0xc3, 0xbc,
+                                                              0xc8, 0xac, 0x6c, 0xa9, 0x51, 0x48, 0x4e, 0x56,
+                                                              0x57, 0x1e, 0x53, 0xfb, 0x9e, 0x15, 0x6e, 0xa4,
+                                                              0x63, 0xd0, 0xc8, 0xbf, 0xb3, 0xb9, 0x96, 0x1e,
+                                                              0x8c, 0x90, 0x8b, 0x91, 0x90, 0x1a, 0xaf, 0x70,
+                                                              0xae, 0x4c, 0x4a, 0x4b, 0x58, 0x56, 0x1e, 0xe,
+                                                              0xfb, 0x3, 0xf7, 0xb5, 0x1, 0xf7, 0x1a, 0xf7,
+                                                              0x13, 0xac, 0xf7, 0x3f, 0x3, 0xf7, 0x1a, 0xfb,
+                                                              0x3, 0x15, 0xf7, 0x13, 0x6, 0xf7, 0x60, 0xf7,
+                                                              0xb5, 0x5, 0xfb, 0x3f, 0x6, 0xe, 0x79, 0xb8,
+                                                              0xe9, 0xb9, 0xf7, 0x8c, 0xb9, 0xd5, 0xb8, 0x1,
+                                                              0x84, 0xb9, 0xf7, 0x2, 0xb9, 0xf8, 0x1, 0xba,
+                                                              0x3, 0x84, 0xf7, 0x6d, 0x15, 0xfb, 0x18, 0xf6,
+                                                              0x24, 0xf7, 0x21, 0xf7, 0x78, 0xf7, 0x1e, 0xf7,
+                                                              0x44, 0xf7, 0x48, 0xf7, 0x1d, 0x25, 0xf4, 0xfb,
+                                                              0x24, 0xfb, 0x4d, 0xfb, 0x4b, 0xfb, 0x1c, 0xfb,
+                                                              0x77, 0x1e, 0xb9, 0x9c, 0x15, 0xf7, 0x35, 0xf7,
+                                                              0x2f, 0xf7, 0x20, 0xf7, 0x30, 0xf7, 0x13, 0xde,
+                                                              0x30, 0xfb, 0xc, 0xfb, 0x32, 0xfb, 0x28, 0xfb,
+                                                              0x1f, 0xfb, 0x35, 0xfb, 0x11, 0x34, 0xe5, 0xf7,
+                                                              0x9, 0x1e, 0xf7, 0xfd, 0x77, 0x15, 0x72, 0x6f,
+                                                              0x62, 0x75, 0x63, 0x1b, 0x4e, 0x69, 0xb8, 0xc3,
+                                                              0x8a, 0x1f, 0xd6, 0xd4, 0xd3, 0xd2, 0xae, 0xaf,
+                                                              0x7a, 0x76, 0x9d, 0x1e, 0xae, 0xab, 0x5, 0xa9,
+                                                              0x72, 0x61, 0xa1, 0x5d, 0x1b, 0x2b, 0x22, 0x36,
+                                                              0xfb, 0x9, 0x42, 0xbb, 0x4a, 0xe4, 0xcc, 0xc7,
+                                                              0xaf, 0x9e, 0x9f, 0x1f, 0xe, 0xce, 0xe4, 0x35,
+                                                              0x76, 0xf7, 0xfd, 0xe3, 0x9e, 0x77, 0x12, 0xd7,
+                                                              0xe7, 0xf7, 0x9e, 0xe7, 0x13, 0x6c, 0x9c, 0xf5,
+                                                              0x15, 0xbe, 0x52, 0xd2, 0xc4, 0x5, 0x13, 0xac,
+                                                              0x6f, 0xac, 0xb7, 0x80, 0xb9, 0x1b, 0xb8, 0xba,
+                                                              0x9a, 0xa4, 0xaf, 0x1f, 0x13, 0x5c, 0xbe, 0x51,
+                                                              0xd2, 0xc6, 0x58, 0xc5, 0x5, 0xb2, 0xb2, 0xa5,
+                                                              0xc7, 0xc4, 0x1a, 0xa7, 0x86, 0xa7, 0x7f, 0xa3,
+                                                              0x1e, 0xd5, 0xc5, 0x5e, 0xc4, 0x40, 0x50, 0x5,
+                                                              0x13, 0xac, 0xa7, 0x6b, 0x5f, 0x97, 0x5e, 0x1b,
+                                                              0x5c, 0x5a, 0x7d, 0x73, 0x67, 0x1f, 0x13, 0x9c,
+                                                              0x5a, 0xc4, 0x43, 0x50, 0xbd, 0x51, 0x5, 0x67,
+                                                              0x63, 0x70, 0x51, 0x53, 0x1a, 0x6e, 0x8f, 0x70,
+                                                              0x98, 0x72, 0x1e, 0xd6, 0xec, 0x15, 0x13, 0xac,
+                                                              0xda, 0xdc, 0xd0, 0xd8, 0xcb, 0xb7, 0x5d, 0x50,
+                                                              0x3b, 0x3a, 0x46, 0x3d, 0x4b, 0x60, 0xb9, 0xc7,
+                                                              0x1e, 0xe, 0x7c, 0xe9, 0x39, 0xe9, 0xf7, 0x7f,
+                                                              0xe9, 0xf7, 0x4, 0xe9, 0x12, 0x9d, 0xef, 0x13,
+                                                              0x78, 0xf8, 0xe, 0x88, 0x15, 0xf7, 0x46, 0x3f,
+                                                              0xa, 0x3c, 0x6, 0xf4, 0xf8, 0xab, 0x5, 0xfb,
+                                                              0x73, 0x87, 0xa, 0xf7, 0x11, 0x6, 0x70, 0xfb,
+                                                              0x1c, 0x5, 0xac, 0x6a, 0x53, 0x91, 0x53, 0x1b,
+                                                              0xfb, 0x32, 0xfb, 0x1d, 0xfb, 0x16, 0xfb, 0x24,
+                                                              0x1f, 0x13, 0xb8, 0x24, 0xde, 0x42, 0xf7, 0x13,
+                                                              0xc1, 0xc6, 0xa5, 0xab, 0xba, 0x1e, 0x13, 0x78,
+                                                              0xfb, 0xa2, 0xf7, 0x20, 0x15, 0xe6, 0xe3, 0xce,
+                                                              0xea, 0xd9, 0xba, 0x68, 0x52, 0x1e, 0x13, 0xb8,
+                                                              0xfb, 0x18, 0xfb, 0x1e, 0x65, 0x5f, 0x44, 0x54,
+                                                              0xb1, 0xcd, 0x1e, 0xe, 0xf7, 0xcf, 0xed, 0xf7,
+                                                              0x3b, 0x77, 0x1, 0xf7, 0x3a, 0xee, 0x3, 0xf7,
+                                                              0x3a, 0x45, 0x15, 0xee, 0x6, 0xd6, 0xf8, 0x15,
+                                                              0x5, 0xf7, 0x26, 0x6, 0x9e, 0xed, 0x5, 0xfb,
+                                                              0x26, 0x6, 0xad, 0xf7, 0x3b, 0x7b, 0xa, 0x69,
+                                                              0xfb, 0x3b, 0x5, 0xfb, 0x26, 0x6, 0x78, 0x29,
+                                                              0x5, 0xf7, 0x25, 0x6, 0xe, 0xf7, 0x4, 0xee,
+                                                              0xf7, 0x9, 0xec, 0xf7, 0x2f, 0x77, 0x1, 0xf7,
+                                                              0x4b, 0xf0, 0x3, 0xcf, 0xf7, 0xe, 0x15, 0xf7,
+                                                              0x2e, 0x6, 0x64, 0xfb, 0x54, 0x5, 0xf0, 0x6,
+                                                              0xaf, 0xf7, 0x54, 0x70, 0xa, 0x9f, 0xee, 0x85,
+                                                              0xa, 0xa3, 0xf6, 0x70, 0xa, 0x9f, 0xec, 0x85,
+                                                              0xa, 0xa9, 0xf7, 0x2f, 0x66, 0xa, 0x68, 0xfb,
+                                                              0x2f, 0x5, 0xfb, 0x2a, 0x6, 0x77, 0x2a, 0x5,
+                                                              0xf7, 0x2a, 0x6, 0x77, 0x20, 0x5, 0xfb, 0x2e,
+                                                              0x6, 0xe, 0xf7, 0x87, 0xe6, 0xf7, 0x53, 0xe6,
+                                                              0x1, 0xf1, 0xed, 0xf7, 0x5e, 0xeb, 0x3, 0xf1,
+                                                              0xf8, 0x15, 0x15, 0x39, 0xcf, 0x4f, 0xe8, 0xf7,
+                                                              0x21, 0xe9, 0xf4, 0xf7, 0xd, 0xe2, 0x4a, 0xc7,
+                                                              0x2d, 0xfb, 0xa, 0xfb, 0xb, 0x2d, 0xfb, 0x1d,
+                                                              0x1e, 0xed, 0xa1, 0x15, 0xcc, 0xc1, 0xc0, 0xcd,
+                                                              0xbf, 0xa9, 0x6a, 0x5e, 0x4e, 0x51, 0x57, 0x4d,
+                                                              0x5a, 0x6a, 0xab, 0xb4, 0x1e, 0xe, 0xf8, 0x79,
+                                                              0xf7, 0x20, 0x1, 0xf7, 0x12, 0xf7, 0xe, 0xd8,
+                                                              0xf7, 0xf, 0x3, 0xf7, 0xd9, 0xf8, 0x79, 0x15,
+                                                              0xf7, 0xf, 0x6, 0xa5, 0x97, 0xa, 0xfb, 0xe,
+                                                              0x6, 0xfb, 0x76, 0xfb, 0x20, 0x15, 0xf7, 0xe,
+                                                              0x6, 0xa6, 0x97, 0xa, 0xfb, 0xf, 0x6, 0xe,
+                                                              0x9b, 0xf7, 0x2b, 0xaf, 0xf7, 0x2, 0xaf, 0xf7,
+                                                              0x2b, 0x12, 0xf7, 0x57, 0xf7, 0x23, 0x4d, 0xf7,
+                                                              0x23, 0x14, 0xe0, 0x13, 0xe8, 0xf7, 0xa8, 0xf8,
+                                                              0x29, 0x4f, 0xa, 0xfb, 0x6d, 0xfb, 0x5e, 0x73,
+                                                              0xa, 0x13, 0xf0, 0xf7, 0x9, 0xfb, 0x85, 0x4f,
+                                                              0xa, 0xe, 0x22, 0x76, 0xf7, 0x8, 0xf7, 0x4a,
+                                                              0xf7, 0x75, 0xf7, 0x49, 0x20, 0xe9, 0x2d, 0xf7,
+                                                              0x57, 0x12, 0xf7, 0x4, 0xf5, 0xf7, 0x4e, 0xf0,
+                                                              0x13, 0xce, 0xa8, 0x81, 0x15, 0xf0, 0x6, 0x93,
+                                                              0xbe, 0x5, 0x7b, 0x9c, 0xa4, 0x85, 0xa0, 0x1b,
+                                                              0x6e, 0xfb, 0x25, 0x5, 0xf0, 0x6, 0xa9, 0xf7,
+                                                              0x24, 0x5, 0xd5, 0x8c, 0xf7, 0x14, 0xbb, 0xf7,
+                                                              0x1f, 0x1a, 0xda, 0x31, 0xa1, 0x31, 0xa5, 0x1e,
+                                                              0x68, 0x94, 0x43, 0x9f, 0xb1, 0x1a, 0xcf, 0xe0,
+                                                              0x8e, 0xb1, 0xb0, 0xa5, 0x82, 0x71, 0xb1, 0x1e,
+                                                              0x13, 0xe6, 0x83, 0x64, 0x5, 0xee, 0x6, 0xb1,
+                                                              0xf7, 0x49, 0x5, 0x27, 0x6, 0x83, 0x62, 0x80,
+                                                              0x9e, 0x79, 0x90, 0x79, 0x8e, 0x19, 0x13, 0xce,
+                                                              0xa1, 0xf1, 0x5, 0x24, 0x6, 0x13, 0xd6, 0x77,
+                                                              0x26, 0x5, 0x3c, 0x8a, 0xfb, 0x10, 0x54, 0xfb,
+                                                              0x11, 0x1a, 0x8a, 0x3c, 0xd7, 0x6c, 0xf3, 0x6d,
+                                                              0x8, 0xb1, 0x81, 0xd6, 0x82, 0x56, 0x1a, 0x56,
+                                                              0xfb, 0x6, 0x86, 0x6f, 0x65, 0x69, 0x93, 0xa2,
+                                                              0x6c, 0x1e, 0x93, 0xa6, 0x5, 0x26, 0x6, 0xe,
+                                                              0xf8, 0x79, 0xf7, 0x20, 0x1, 0xf7, 0x78, 0xf7,
+                                                              0x9, 0x3, 0xf7, 0x78, 0xf8, 0x79, 0x15, 0xf7,
+                                                              0x9, 0x6, 0xa6, 0x97, 0xa, 0xfb, 0x9, 0x6,
+                                                              0xe, 0x7f, 0xa, 0xcd, 0xf8, 0x55, 0x3, 0xcd,
+                                                              0x16, 0xf8, 0x55, 0x6, 0x9e, 0xe9, 0x3e, 0xa,
+                                                              0xd1, 0xf7, 0xed, 0x5, 0xfb, 0x80, 0x6f, 0xa,
+                                                              0xf7, 0x1e, 0x6, 0x58, 0xfb, 0x8f, 0x43, 0xa,
+                                                              0x7c, 0xea, 0xe0, 0xeb, 0xec, 0xeb, 0x1, 0xf8,
+                                                              0x65, 0xea, 0x3, 0xf7, 0x26, 0xf7, 0x48, 0x15,
+                                                              0xf8, 0x23, 0x6, 0x91, 0xa0, 0x94, 0xb5, 0xa8,
+                                                              0x1a, 0xf4, 0x34, 0xd8, 0xfb, 0xc, 0xfb, 0x1a,
+                                                              0xfb, 0x49, 0x35, 0xfb, 0x5c, 0x26, 0xdb, 0x39,
+                                                              0xf7, 0x30, 0xe7, 0xe7, 0xab, 0xb2, 0xda, 0x1e,
+                                                              0x6d, 0xda, 0x5, 0x66, 0x44, 0x49, 0x79, 0x3e,
+                                                              0x1b, 0xfb, 0x11, 0x74, 0xbd, 0xae, 0x8c, 0x1f,
+                                                              0xa7, 0xeb, 0x15, 0xd1, 0xaa, 0xd9, 0xa6, 0xc7,
+                                                              0x1b, 0xcb, 0xc4, 0x6c, 0x49, 0x8c, 0x1f, 0xe,
+                                                              0x5f, 0xa, 0xf7, 0x82, 0xf8, 0x76, 0x15, 0xf7,
+                                                              0xd9, 0xd9, 0x77, 0xf0, 0xfb, 0xcf, 0xfb, 0xc,
+                                                              0x5, 0x34, 0xfc, 0x13, 0x32, 0xa, 0x61, 0xa,
+                                                              0xf7, 0x73, 0x77, 0x76, 0xa, 0xf7, 0x5c, 0xf8,
+                                                              0x73, 0x15, 0xf7, 0x40, 0xf4, 0xf7, 0x11, 0x22,
+                                                              0xcc, 0xad, 0xfb, 0x14, 0xf7, 0x24, 0x66, 0xa,
+                                                              0xfb, 0x52, 0xfb, 0x23, 0x5, 0x85, 0xfb, 0xf8,
+                                                              0x35, 0xa, 0xfb, 0x49, 0x93, 0xa, 0xd2, 0x31,
+                                                              0xa, 0x61, 0xa, 0xce, 0xf7, 0x10, 0x76, 0xa,
+                                                              0xf8, 0x25, 0xf8, 0x89, 0x6d, 0xa, 0xa5, 0xf7,
+                                                              0x10, 0x83, 0xa, 0xfb, 0x66, 0xfb, 0x10, 0x5a,
+                                                              0xa, 0xa4, 0xf7, 0x10, 0x65, 0xa, 0x28, 0xfc,
+                                                              0x67, 0x32, 0xa, 0x5f, 0xa, 0xf7, 0x6e, 0xf8,
+                                                              0xc3, 0x15, 0xf7, 0xc3, 0x3e, 0xaf, 0xc5, 0xfb,
+                                                              0xa7, 0xf7, 0xd, 0x5, 0xfb, 0x21, 0xfc, 0x8b,
+                                                              0x35, 0xa, 0xfb, 0x4a, 0x93, 0xa, 0xd3, 0x3c,
+                                                              0xf7, 0x2a, 0xea, 0xd9, 0xa0, 0xb5, 0xdd, 0x1f,
+                                                              0x81, 0xdc, 0x2f, 0xa, 0x7c, 0xe7, 0xf7, 0x49,
+                                                              0xea, 0xf7, 0x3e, 0xe8, 0x12, 0xc2, 0xf0, 0x6e,
+                                                              0xed, 0xf7, 0x45, 0xeb, 0x56, 0xee, 0x13, 0xf4,
+                                                              0xf7, 0x47, 0xf7, 0xc9, 0x15, 0x46, 0x62, 0x54,
+                                                              0x49, 0x3d, 0x1a, 0x2c, 0xf0, 0x5f, 0xe3, 0xf7,
+                                                              0x3d, 0xdf, 0xf7, 0x6, 0xe3, 0x8c, 0x1e, 0x8c,
+                                                              0xbe, 0x7b, 0xb3, 0x60, 0xab, 0x8, 0x13, 0xea,
+                                                              0xc9, 0xb0, 0xb5, 0xc7, 0xd4, 0x1a, 0xdb, 0x45,
+                                                              0xc3, 0x23, 0xfb, 0x1c, 0x20, 0x29, 0x25, 0x61,
+                                                              0x9c, 0x67, 0xae, 0x6e, 0x1e, 0xb9, 0xf7, 0x0,
+                                                              0x15, 0xc5, 0xc1, 0xbb, 0xd2, 0xd5, 0xa1, 0x67,
+                                                              0x6a, 0x8a, 0x1e, 0x4b, 0x47, 0x66, 0x51, 0x58,
+                                                              0x60, 0xa3, 0xb3, 0x1e, 0x13, 0xf4, 0x46, 0xfb,
+                                                              0x9b, 0x15, 0xc8, 0xd4, 0xb6, 0xcf, 0xd2, 0xaa,
+                                                              0x6c, 0x67, 0x8e, 0x1e, 0x46, 0x42, 0x5e, 0x4e,
+                                                              0x48, 0x5e, 0xaf, 0xb4, 0x1e, 0xe, 0x7c, 0xf7,
+                                                              0x17, 0x1, 0xa3, 0xf7, 0x21, 0xca, 0xf7, 0x21,
+                                                              0xcc, 0xf7, 0x21, 0x3, 0xa3, 0xaf, 0x15, 0x60,
+                                                              0xa, 0xa7, 0x7a, 0xa5, 0x63, 0x54, 0x6e, 0x5f,
+                                                              0x67, 0x1e, 0xf8, 0x2e, 0x50, 0xa, 0xfb, 0x62,
+                                                              0x50, 0xa, 0xe, 0xf7, 0x5f, 0xef, 0x1, 0x75,
+                                                              0xf9, 0x5, 0x3, 0x75, 0xf7, 0x5f, 0x15, 0xf9,
+                                                              0x5, 0x6, 0x9e, 0xef, 0x5, 0xfd, 0x5, 0x6,
+                                                              0xe, 0xf7, 0x5f, 0xef, 0x1, 0xc0, 0xf8, 0x6f,
+                                                              0x3, 0xc0, 0xf7, 0x5f, 0x15, 0xf8, 0x6f, 0x6,
+                                                              0x9e, 0xef, 0x5, 0xfc, 0x6f, 0x6, 0xe, 0xf7,
+                                                              0xa, 0xf2, 0xd5, 0xf2, 0x1, 0xb4, 0xf8, 0x64,
+                                                              0x3, 0xd6, 0xf7, 0xbb, 0x15, 0xf8, 0x65, 0x6,
+                                                              0x9e, 0xf2, 0x5, 0xfc, 0x64, 0x6, 0x55, 0xfb,
+                                                              0xac, 0x15, 0xf8, 0x64, 0x6, 0x9f, 0xf2, 0x5,
+                                                              0xfc, 0x65, 0x6, 0xe, 0x70, 0xe2, 0xf7, 0x95,
+                                                              0xe1, 0x91, 0xa, 0x9b, 0xf7, 0x0, 0xf7, 0xed,
+                                                              0xf7, 0x7, 0x3, 0xf7, 0x80, 0xf8, 0x42, 0x15,
+                                                              0xf7, 0x1d, 0xc1, 0xd0, 0x62, 0xa8, 0x4a, 0x8c,
+                                                              0x87, 0x19, 0x9d, 0x6d, 0x78, 0x96, 0x44, 0x1b,
+                                                              0xfb, 0x5c, 0xfb, 0x1c, 0xfb, 0x1, 0xfb, 0x2c,
+                                                              0x31, 0xd5, 0x3c, 0xf7, 0x35, 0xf7, 0x80, 0xec,
+                                                              0xf7, 0x2c, 0xf7, 0x41, 0xf7, 0x10, 0x39, 0xd4,
+                                                              0x63, 0xa5, 0x1f, 0xf7, 0xb, 0xbf, 0x74, 0xc0,
+                                                              0xfb, 0x2d, 0x46, 0x6c, 0x9d, 0x3f, 0xa7, 0x60,
+                                                              0x93, 0x19, 0x4f, 0x58, 0xb1, 0x84, 0xbc, 0x77,
+                                                              0xac, 0x7d, 0x19, 0x22, 0x5d, 0x5, 0x35, 0xfb,
+                                                              0xd0, 0x15, 0xf7, 0x0, 0xf7, 0x7, 0xbf, 0xe4,
+                                                              0xf2, 0xb1, 0x58, 0x55, 0x23, 0xfb, 0x7, 0x5b,
+                                                              0x39, 0x3e, 0x44, 0xa8, 0xcf, 0x1e, 0xe, 0x7c,
+                                                              0xf7, 0x2e, 0xf8, 0x45, 0x77, 0x1, 0xf7, 0x34,
+                                                              0xf7, 0x5d, 0x3, 0xf7, 0x80, 0xf7, 0x48, 0x15,
+                                                              0xee, 0x6, 0xf3, 0xf8, 0x1c, 0x5, 0xfb, 0x1e,
+                                                              0x6, 0xfb, 0x21, 0xfc, 0xa1, 0x15, 0x5f, 0xbf,
+                                                              0x79, 0xac, 0xc9, 0xc1, 0xb2, 0xc3, 0xab, 0x6b,
+                                                              0xa6, 0x56, 0x43, 0x5f, 0x5b, 0x5f, 0x1e, 0xe,
+                                                              0xfb, 0x11, 0x76, 0xf8, 0x4b, 0xf7, 0x30, 0x1,
+                                                              0xf7, 0x83, 0xf7, 0x5d, 0x3, 0xf7, 0x83, 0xf7,
+                                                              0xf9, 0x15, 0x69, 0xa9, 0x6d, 0xc0, 0xd4, 0xb8,
+                                                              0xb1, 0xc0, 0xbb, 0x57, 0x9c, 0x6a, 0x4e, 0x54,
+                                                              0x66, 0x54, 0x1e, 0x3c, 0xfc, 0x8b, 0x15, 0xf7,
+                                                              0x1f, 0x6, 0xcb, 0xf8, 0x22, 0x7b, 0xa, 0xe,
+                                                              0x8b, 0xe9, 0xf7, 0x90, 0xe8, 0xea, 0xe6, 0x1,
+                                                              0xf7, 0x87, 0xf3, 0x3, 0xb6, 0x16, 0xf8, 0x49,
+                                                              0x55, 0xa, 0xfb, 0x77, 0x6, 0xc0, 0xf7, 0x90,
+                                                              0x5, 0xf7, 0x78, 0x89, 0xa, 0xfb, 0x77, 0x6,
+                                                              0xd5, 0x9c, 0x93, 0xa0, 0xdb, 0x1b, 0xbc, 0xc0,
+                                                              0x82, 0x83, 0xb8, 0x1f, 0xb1, 0xe8, 0x3e, 0x95,
+                                                              0x52, 0x91, 0x5c, 0x8a, 0x19, 0x58, 0x8a, 0x65,
+                                                              0x83, 0x66, 0x78, 0x55, 0x6d, 0x7c, 0x5a, 0x80,
+                                                              0x58, 0x84, 0x6f, 0x18, 0x21, 0x6, 0x77, 0x2e,
+                                                              0x5, 0xf5, 0x6, 0x55, 0xfb, 0x90, 0x5, 0x21,
+                                                              0x6, 0xe, 0xf8, 0x75, 0xf8, 0x74, 0x15, 0xf5,
+                                                              0x6, 0xa8, 0xf7, 0x26, 0x5, 0x21, 0x6, 0xfb,
+                                                              0x68, 0xfd, 0x6, 0x15, 0xf7, 0xb4, 0x37, 0xa,
+                                                              0x29, 0x6, 0xcc, 0xf7, 0xd8, 0x5, 0xfb, 0x48,
+                                                              0x3c, 0xa, 0xe1, 0x6, 0x5e, 0xfb, 0x7e, 0x66,
+                                                              0xa, 0xfb, 0xe0, 0x31, 0x15, 0xf7, 0xb6, 0x37,
+                                                              0xa, 0x28, 0x6, 0xb9, 0xf7, 0x7e, 0x5, 0xee,
+                                                              0x37, 0xa, 0x28, 0x6, 0x99, 0xc9, 0x99, 0xc2,
+                                                              0xe1, 0x7c, 0xad, 0x88, 0x19, 0xab, 0xe5, 0xfb,
+                                                              0x2, 0x90, 0xfb, 0xe, 0x88, 0x6d, 0xfb, 0x1e,
+                                                              0x19, 0x7f, 0x56, 0x5, 0x29, 0x3c, 0xa, 0xed,
+                                                              0x6, 0x5e, 0xfb, 0x7e, 0x4e, 0xa, 0xe, 0x7c,
+                                                              0xe7, 0xf7, 0x7e, 0xe7, 0xf4, 0xe8, 0x1, 0xf8,
+                                                              0x37, 0xef, 0x3, 0xa7, 0xaf, 0x15, 0x7d, 0xad,
+                                                              0xe6, 0x66, 0xe3, 0x1b, 0xf7, 0x43, 0xf2, 0xf7,
+                                                              0xe, 0xf7, 0x17, 0xde, 0x55, 0xdd, 0xfb, 0x10,
+                                                              0x6a, 0x5c, 0x85, 0x77, 0x75, 0x1f, 0xa6, 0xf7,
+                                                              0x17, 0x5, 0xf7, 0xb3, 0x94, 0xa, 0xfc, 0x15,
+                                                              0x6, 0x4b, 0xfb, 0xd8, 0xcd, 0x71, 0x5, 0xc7,
+                                                              0xbb, 0xb4, 0x8b, 0xa6, 0x1b, 0xcb, 0xbd, 0x61,
+                                                              0x52, 0x3f, 0x4b, 0x50, 0x2d, 0x49, 0x4f, 0x9d,
+                                                              0xa1, 0x53, 0x1f, 0xe, 0x8b, 0xe8, 0xf7, 0x86,
+                                                              0xe9, 0xef, 0xe8, 0x8f, 0x77, 0x12, 0x13, 0xd0,
+                                                              0xf7, 0xbf, 0x16, 0xf7, 0xb8, 0x94, 0xa, 0x27,
+                                                              0x6, 0xf5, 0xf8, 0xa9, 0x5, 0xfb, 0x1b, 0x82,
+                                                              0xa, 0xb5, 0x6, 0x34, 0xfc, 0x4c, 0x7b, 0xa,
+                                                              0xfb, 0xe1, 0x2e, 0x15, 0xf7, 0xb9, 0x6, 0x9d,
+                                                              0xe8, 0x5, 0x27, 0x6, 0xbc, 0xf7, 0x86, 0x5,
+                                                              0xee, 0x6, 0x9d, 0xe9, 0x5, 0x27, 0x6, 0x9a,
+                                                              0xc2, 0x5, 0x13, 0xe0, 0x97, 0xc3, 0xe9, 0x7e,
+                                                              0xad, 0x8d, 0xaa, 0xe8, 0x18, 0xfb, 0x16, 0x8e,
+                                                              0xfb, 0x0, 0x8a, 0x6e, 0xfb, 0x22, 0x80, 0x56,
+                                                              0x18, 0x27, 0x44, 0xa, 0xef, 0x6, 0x5b, 0xfb,
+                                                              0x86, 0x7b, 0xa, 0xe, 0xfb, 0x17, 0xea, 0xf8,
+                                                              0x6, 0xea, 0xe8, 0xe9, 0x1, 0xf7, 0xc3, 0xee,
+                                                              0x3, 0x8d, 0x6d, 0x15, 0x3b, 0x2e, 0x5, 0x88,
+                                                              0xa7, 0xc0, 0x86, 0xbd, 0x1b, 0xdc, 0xe8, 0xa8,
+                                                              0xf1, 0xb3, 0x1f, 0xf7, 0x1b, 0xf7, 0xe2, 0x5,
+                                                              0xf7, 0x3, 0x6, 0xb1, 0xea, 0x65, 0xa, 0xd0,
+                                                              0xaa, 0xa3, 0xa3, 0xc2, 0x1b, 0xa4, 0xaa, 0x87,
+                                                              0x88, 0xa0, 0x1f, 0xc1, 0xe9, 0x5, 0x90, 0x5e,
+                                                              0x8b, 0x8d, 0x65, 0x1b, 0xfb, 0x10, 0x43, 0x5c,
+                                                              0x22, 0x5f, 0x1f, 0x7b, 0x68, 0x5, 0x20, 0x6,
+                                                              0x64, 0x2c, 0x5, 0xf7, 0x1, 0x6, 0xfb, 0x5,
+                                                              0xfb, 0xae, 0x5, 0x3e, 0x6d, 0x74, 0x80, 0x50,
+                                                              0x1b, 0x71, 0x70, 0x8f, 0x8d, 0x74, 0x1f, 0xe,
+                                                              0x8b, 0xe8, 0xd6, 0xe8, 0xf7, 0xf7, 0x77, 0x1,
+                                                              0xf7, 0xd0, 0xef, 0x3, 0xc9, 0xf7, 0x3c, 0x15,
+                                                              0xf7, 0xa4, 0x6, 0x79, 0x40, 0x5, 0xfb, 0x0,
+                                                              0x82, 0xa, 0xf7, 0xbd, 0x89, 0xa, 0x31, 0x6,
+                                                              0x9c, 0xd6, 0x5, 0xe0, 0x89, 0xa, 0x35, 0x6,
+                                                              0xd4, 0xf7, 0xf7, 0x5, 0xfb, 0x0, 0x6, 0xfb,
+                                                              0xe5, 0xfc, 0x4, 0x5, 0xf7, 0x6, 0x98, 0x15,
+                                                              0xf7, 0x62, 0xf7, 0x7d, 0x5b, 0xfb, 0x7d, 0x5,
+                                                              0xe, 0x61, 0xf9, 0x41, 0x3, 0x61, 0x83, 0x15,
+                                                              0xc8, 0x57, 0xf9, 0x4, 0xf9, 0x34, 0x4b, 0xbc,
+                                                              0x5, 0xe, 0xfb, 0x26, 0xe5, 0xea, 0xe3, 0xf7,
+                                                              0x6f, 0xe4, 0x45, 0xe4, 0x12, 0xb1, 0xed, 0x13,
+                                                              0xe8, 0xb8, 0x73, 0x15, 0x62, 0x31, 0x5, 0x79,
+                                                              0xdb, 0xd0, 0x7d, 0xd5, 0x1b, 0xf7, 0x50, 0xb4,
+                                                              0xe7, 0xf2, 0xa0, 0x1f, 0xc9, 0xf7, 0xbd, 0x5c,
+                                                              0xa, 0x9e, 0xe4, 0x5, 0xfb, 0x3d, 0x6, 0x83,
+                                                              0x6b, 0x5, 0x13, 0xd8, 0xa8, 0x6a, 0x5f, 0xa1,
+                                                              0x58, 0x1b, 0xfb, 0x2e, 0xfb, 0x1f, 0xfb, 0x0,
+                                                              0xfb, 0x1b, 0x27, 0xd6, 0x43, 0xf7, 0x14, 0xbe,
+                                                              0xc0, 0x8e, 0xa9, 0xb8, 0x1f, 0x2c, 0x77, 0x81,
+                                                              0x6a, 0xfb, 0x9, 0x1b, 0x41, 0x33, 0xa0, 0x96,
+                                                              0x67, 0x1f, 0xe6, 0xf7, 0x8e, 0x15, 0xdb, 0xe1,
+                                                              0xc6, 0xe1, 0xd4, 0xb9, 0x60, 0x4e, 0x8a, 0x1e,
+                                                              0x33, 0x41, 0x5d, 0x2c, 0x4a, 0x53, 0xb2, 0xc7,
+                                                              0x1e, 0xe, 0xfb, 0x26, 0xde, 0xe3, 0xdc, 0xf7,
+                                                              0x70, 0xdd, 0x1, 0x9d, 0xed, 0x3, 0xa4, 0x6a,
+                                                              0x15, 0x62, 0x38, 0x5, 0x7a, 0xdb, 0xd0, 0x7e,
+                                                              0xd5, 0x1b, 0xf7, 0x50, 0xb4, 0xe0, 0xea, 0xa0,
+                                                              0x1f, 0xc9, 0xf7, 0xae, 0x5c, 0xa, 0x9e, 0xdd,
+                                                              0x5, 0xfb, 0x3d, 0x6, 0x83, 0x66, 0x5, 0xa6,
+                                                              0x6a, 0x5f, 0x9f, 0x58, 0x1b, 0xfb, 0x2e, 0xfb,
+                                                              0x1f, 0x27, 0xfb, 0x10, 0x2e, 0xd6, 0x49, 0xf7,
+                                                              0x14, 0xbe, 0xc0, 0x8e, 0xa6, 0xb8, 0x1f, 0x34,
+                                                              0x77, 0x81, 0x6c, 0xfb, 0x9, 0x1b, 0x41, 0x33,
+                                                              0x9e, 0x96, 0x67, 0x1f, 0xe6, 0xf7, 0x7a, 0x15,
+                                                              0xd5, 0xe1, 0xc2, 0xe1, 0xd4, 0xb9, 0x63, 0x53,
+                                                              0x8a, 0x1e, 0x39, 0x41, 0x61, 0x2c, 0x4a, 0x53,
+                                                              0xaf, 0xc2, 0x1e, 0xf7, 0x65, 0xf7, 0xb5, 0x15,
+                                                              0xee, 0x6, 0xf7, 0x54, 0xf7, 0x24, 0x57, 0xaf,
+                                                              0xfb, 0x46, 0x5e, 0xa, 0x7c, 0xe9, 0x39, 0xe9,
+                                                              0xf7, 0x90, 0xe9, 0xf5, 0xde, 0x12, 0xf7, 0xb1,
+                                                              0xed, 0xf7, 0xe, 0xed, 0x13, 0x7c, 0x88, 0x88,
+                                                              0x15, 0xf7, 0x45, 0x6, 0xe6, 0xf8, 0x56, 0x5,
+                                                              0xdf, 0x9b, 0xad, 0x97, 0xdd, 0x1b, 0xbe, 0xb7,
+                                                              0x82, 0x6a, 0x6b, 0x40, 0x77, 0x74, 0x86, 0x1f,
+                                                              0x4d, 0x7d, 0x5c, 0x56, 0x46, 0x1a, 0x4f, 0xc9,
+                                                              0x74, 0xcb, 0x73, 0x1e, 0xaa, 0x80, 0xca, 0x81,
+                                                              0x6f, 0x1a, 0x13, 0xbc, 0x69, 0x4d, 0x64, 0x4d,
+                                                              0x66, 0x62, 0x9d, 0x97, 0x70, 0x1e, 0x46, 0x46,
+                                                              0x5, 0x67, 0xc2, 0xb0, 0x78, 0xc2, 0x1b, 0xf7,
+                                                              0x1f, 0xf7, 0x2, 0xda, 0xf6, 0xca, 0x46, 0xa4,
+                                                              0x4c, 0xa0, 0x1f, 0x71, 0x93, 0x4d, 0x99, 0xad,
+                                                              0x1a, 0xa3, 0xbc, 0x9e, 0xa7, 0x94, 0x1e, 0xcd,
+                                                              0xa0, 0xc9, 0xa1, 0xd3, 0x1a, 0xd6, 0x77, 0xbb,
+                                                              0xfb, 0x3f, 0xfb, 0x2f, 0x5c, 0x55, 0xfb, 0x5,
+                                                              0x74, 0x1e, 0x86, 0x75, 0x5, 0x3b, 0x6f, 0xa,
+                                                              0xdd, 0x6, 0x13, 0x7c, 0x59, 0xfb, 0x90, 0x5,
+                                                              0x38, 0x6, 0xe, 0xf7, 0x4c, 0xf7, 0x7b, 0x3,
+                                                              0xf7, 0x4c, 0xf8, 0xcf, 0x15, 0xf7, 0x63, 0x4c,
+                                                              0xa3, 0xbc, 0xfb, 0x50, 0xf3, 0x5, 0xe, 0xaf,
+                                                              0x76, 0xf8, 0x7a, 0x77, 0x1, 0xc1, 0x9a, 0x15,
+                                                              0xf8, 0x6b, 0xf7, 0x4b, 0xa0, 0xf7, 0xa, 0xfc,
+                                                              0x25, 0xf7, 0x4d, 0x7a, 0x2d, 0xf7, 0xd1, 0xfb,
+                                                              0x2a, 0xfc, 0xa, 0xfb, 0x28, 0x5, 0xe, 0xd1,
+                                                              0xc5, 0xf7, 0x96, 0xc7, 0x1, 0xc5, 0xf7, 0x5,
+                                                              0xf7, 0x2, 0xf7, 0x5, 0x3, 0xc5, 0xf7, 0x9b,
+                                                              0x51, 0xa, 0x9c, 0xfb, 0x4b, 0x51, 0xa, 0xe,
+                                                              0xe6, 0x76, 0xf8, 0xc, 0x77, 0x1, 0xf7, 0x86,
+                                                              0xf7, 0xa, 0xd0, 0xf7, 0x5, 0x3, 0xc5, 0xf7,
+                                                              0x19, 0x15, 0xaf, 0x4c, 0xf7, 0x9e, 0xf7, 0x4e,
+                                                              0xfb, 0x5e, 0xf7, 0x52, 0x53, 0x4d, 0xf7, 0x20,
+                                                              0xfb, 0x13, 0x5, 0x9a, 0xfb, 0x10, 0x15, 0xae,
+                                                              0x4c, 0xf7, 0x8e, 0xf7, 0x4e, 0xfb, 0x4c, 0xf7,
+                                                              0x52, 0x53, 0x4d, 0xf7, 0x13, 0xfb, 0x13, 0x5,
+                                                              0xe, 0xd1, 0xf8, 0xc, 0x1, 0xf7, 0x12, 0xf7,
+                                                              0xbd, 0x3, 0xf7, 0x12, 0xf7, 0x97, 0x15, 0xf7,
+                                                              0x7f, 0xfb, 0x51, 0xc9, 0xbf, 0xfb, 0x3f, 0xf7,
+                                                              0x1c, 0xf7, 0x72, 0xf7, 0x11, 0x65, 0xca, 0x5,
+                                                              0xe, 0xd1, 0xf8, 0xc, 0x1, 0xf7, 0x12, 0xf7,
+                                                              0x18, 0x15, 0xb2, 0x4d, 0xf7, 0xc9, 0xf7, 0x51,
+                                                              0xfb, 0x7a, 0xf7, 0x4f, 0x4b, 0x56, 0xf7, 0x3d,
+                                                              0xfb, 0x12, 0x5, 0xe, 0x81, 0xa, 0xf1, 0xec,
+                                                              0x3, 0x8d, 0x16, 0xf7, 0x94, 0x55, 0xa, 0x3c,
+                                                              0x6, 0xb2, 0xf7, 0x57, 0x5, 0xbc, 0xdc, 0xc4,
+                                                              0x94, 0xa7, 0x1b, 0xb1, 0x9f, 0x7b, 0x76, 0x82,
+                                                              0x89, 0x81, 0x89, 0x81, 0x1f, 0x66, 0xfb, 0x4f,
+                                                              0x5, 0x3b, 0x6f, 0xa, 0xf7, 0x96, 0x3f, 0xa,
+                                                              0x3a, 0x6, 0xaf, 0xf7, 0x48, 0x5, 0x8f, 0x9c,
+                                                              0x8f, 0x9d, 0x9d, 0x1a, 0xc5, 0x77, 0xc2, 0xfb,
+                                                              0x8, 0x4f, 0x57, 0x76, 0x71, 0x55, 0x1e, 0xbb,
+                                                              0xf7, 0x7d, 0x5, 0xfb, 0x46, 0x44, 0xa, 0xdd,
+                                                              0x6, 0x31, 0xfc, 0x4a, 0x5, 0x3a, 0x6, 0xe,
+                                                              0xf8, 0x7c, 0xf7, 0x41, 0x1, 0xba, 0xc2, 0xf7,
+                                                              0x34, 0xc2, 0x3, 0xf7, 0x9a, 0xf8, 0x8f, 0x15,
+                                                              0xc2, 0x78, 0xf7, 0x80, 0xf7, 0x23, 0x31, 0xa9,
+                                                              0x5, 0xfc, 0x34, 0xfb, 0x2e, 0x15, 0xc2, 0x78,
+                                                              0xf7, 0x82, 0xf7, 0x23, 0x31, 0xa9, 0x5, 0xe,
+                                                              0xf7, 0x5f, 0xf7, 0x2, 0x1, 0xe3, 0xf8, 0x25,
+                                                              0x3, 0xe3, 0xf7, 0x5f, 0x15, 0xf8, 0x25, 0x6,
+                                                              0xa2, 0xf7, 0x2, 0x5, 0xfc, 0x25, 0x6, 0xe,
+                                                              0x8b, 0xea, 0xf7, 0x93, 0xea, 0xc9, 0xf7, 0x2b,
+                                                              0x1, 0xf7, 0xf3, 0xf7, 0x4, 0x3, 0xf7, 0xd4,
+                                                              0x69, 0xa, 0xfb, 0xbb, 0xfd, 0x26, 0x15, 0xf8,
+                                                              0x54, 0x6, 0x9f, 0xea, 0x8f, 0xa, 0x6, 0xd1,
+                                                              0xf7, 0xf2, 0x5, 0xfb, 0x7f, 0x6, 0x77, 0x2c,
+                                                              0x5, 0xf7, 0x1d, 0x6, 0x59, 0xfb, 0x93, 0x5,
+                                                              0xfb, 0x44, 0x6, 0xe, 0x78, 0xa, 0x91, 0xa,
+                                                              0xf7, 0x7e, 0xf8, 0x77, 0x15, 0xf7, 0xdf, 0xd8,
+                                                              0x78, 0xf0, 0xfb, 0xd6, 0xfb, 0xc, 0x5, 0xfb,
+                                                              0x48, 0xfc, 0xb1, 0x2e, 0xa, 0x78, 0xa, 0xf7,
+                                                              0x6f, 0x77, 0x1, 0xf7, 0x5f, 0xf8, 0x74, 0x15,
+                                                              0xf7, 0x37, 0xf3, 0xf7, 0x9, 0x23, 0xc8, 0xae,
+                                                              0xfb, 0xc, 0xf7, 0x22, 0x5, 0x30, 0x6, 0xfb,
+                                                              0x48, 0xfb, 0x21, 0x5, 0xfb, 0x1, 0xfc, 0x98,
+                                                              0x2e, 0xa, 0x78, 0xa, 0xc9, 0xf7, 0x11, 0x1,
+                                                              0xf8, 0x27, 0xf8, 0x89, 0x15, 0xf7, 0x1, 0x89,
+                                                              0xa4, 0xf7, 0x12, 0x86, 0xa, 0xfb, 0x5e, 0xfb,
+                                                              0x10, 0x15, 0xf7, 0x0, 0x6, 0xa4, 0xf7, 0x10,
+                                                              0x5, 0xfb, 0x1, 0x6, 0xfb, 0x61, 0xfd, 0x5,
+                                                              0x2e, 0xa, 0x78, 0xa, 0x91, 0xa, 0xf7, 0x73,
+                                                              0xf8, 0xc4, 0x15, 0xf7, 0xaa, 0x3e, 0xac, 0xc5,
+                                                              0xfb, 0x90, 0xf7, 0xc, 0x5, 0xfb, 0x82, 0xfd,
+                                                              0x29, 0x2e, 0xa, 0xfb, 0x26, 0xea, 0xf8, 0x35,
+                                                              0xe6, 0xbd, 0xf7, 0x2b, 0xfb, 0x25, 0xf7, 0x25,
+                                                              0x12, 0x13, 0xe0, 0xf7, 0x20, 0x69, 0xa, 0xfb,
+                                                              0x61, 0xfd, 0x59, 0x15, 0x77, 0x2c, 0x5, 0xf7,
+                                                              0x82, 0x6, 0x9f, 0xea, 0x5, 0x41, 0x6, 0xf7,
+                                                              0x2, 0xf8, 0x84, 0x5, 0xfb, 0x39, 0x6, 0x77,
+                                                              0x2c, 0x5, 0xce, 0x6, 0x31, 0xfc, 0x25, 0x5,
+                                                              0x13, 0xd0, 0xf8, 0x69, 0xf8, 0xc8, 0x15, 0xf7,
+                                                              0xc, 0x6, 0xac, 0xf7, 0x25, 0x5, 0xfb, 0xd,
+                                                              0x6, 0xfb, 0xa1, 0xfd, 0x4a, 0x15, 0x5e, 0x30,
+                                                              0x5, 0x86, 0x9a, 0xa4, 0x7d, 0xc5, 0x1b, 0xf7,
+                                                              0x4b, 0x9e, 0x8b, 0xa, 0xfb, 0x67, 0x6e, 0xa,
+                                                              0xf4, 0x6, 0x44, 0xfb, 0xce, 0x5, 0x45, 0x7b,
+                                                              0x6c, 0x66, 0x61, 0x1b, 0x57, 0x7f, 0x9a, 0x8f,
+                                                              0x81, 0x1f, 0xe, 0xfb, 0x26, 0xe6, 0xf8, 0x39,
+                                                              0xe6, 0xc3, 0xf7, 0x25, 0x1, 0xf7, 0xc5, 0xf4,
+                                                              0x3, 0xf8, 0xf, 0xf8, 0x95, 0x15, 0xf7, 0xb,
+                                                              0x6, 0xac, 0xf7, 0x25, 0x5, 0xfb, 0xc, 0x6,
+                                                              0xfc, 0xe, 0xfd, 0x4a, 0x15, 0x5e, 0x30, 0x5,
+                                                              0x82, 0xc1, 0xc2, 0x81, 0xc5, 0x1b, 0xf7, 0x66,
+                                                              0xab, 0x8b, 0xa, 0xfc, 0x7, 0x6e, 0xa, 0xf7,
+                                                              0x9d, 0x6, 0x44, 0xfb, 0xce, 0x5, 0x45, 0x7b,
+                                                              0x6a, 0x66, 0x3b, 0x1b, 0x57, 0x5d, 0x93, 0x96,
+                                                              0x5e, 0x1f, 0xe, 0x8b, 0xe9, 0x1, 0xe9, 0xd9,
+                                                              0xf7, 0x15, 0xf7, 0x91, 0x3, 0x87, 0x16, 0xf7,
+                                                              0x44, 0x6, 0xae, 0xf7, 0x3d, 0xb2, 0xa3, 0xb1,
+                                                              0x72, 0xae, 0x68, 0xa7, 0x64, 0x19, 0x6f, 0x87,
+                                                              0xa, 0xf7, 0x91, 0x6, 0x9d, 0xe9, 0x5, 0x21,
+                                                              0x6, 0x6a, 0xbd, 0x44, 0xcc, 0x68, 0xac, 0xf7,
+                                                              0x2a, 0xf2, 0x18, 0xf7, 0x0, 0x55, 0xa, 0xfb,
+                                                              0xa3, 0x6f, 0xa, 0x9f, 0x6, 0x20, 0x43, 0xd3,
+                                                              0xf7, 0xf5, 0x5, 0xfb, 0x44, 0x6f, 0xa, 0xdb,
+                                                              0x6, 0x32, 0xfc, 0x4a, 0x5, 0x3c, 0x6, 0xe,
+                                                              0x81, 0xa, 0xf7, 0x98, 0xee, 0x3, 0xcd, 0x16,
+                                                              0xf8, 0x54, 0x6, 0x9f, 0xe9, 0x3e, 0xa, 0xf7,
+                                                              0x1, 0xf8, 0xa8, 0x5, 0xfb, 0x94, 0x87, 0xa,
+                                                              0xf7, 0x30, 0x6, 0x31, 0xfc, 0x4a, 0x8f, 0xa,
+                                                              0x6, 0xe, 0xaf, 0x76, 0xf8, 0x7a, 0x77, 0x1,
+                                                              0xc1, 0xf7, 0x5c, 0x15, 0xf8, 0x25, 0xfb, 0x4d,
+                                                              0x9c, 0xe9, 0xfb, 0xd1, 0xf7, 0x2a, 0xf8, 0x9,
+                                                              0xf7, 0x28, 0x9c, 0xe9, 0xfc, 0x6a, 0xfb, 0x4b,
+                                                              0x5, 0xe, 0x84, 0x76, 0xb0, 0x76, 0xf7, 0x46,
+                                                              0xde, 0xce, 0xde, 0xf7, 0xb, 0xe8, 0x12, 0xf7,
+                                                              0x3f, 0xea, 0x13, 0xbc, 0x52, 0xa, 0x13, 0x7c,
+                                                              0x3d, 0xa, 0x7c, 0x7f, 0x88, 0x83, 0x7f, 0x1f,
+                                                              0x9c, 0x9a, 0xa8, 0xbe, 0x89, 0x8e, 0x8, 0xf7,
+                                                              0x47, 0x6, 0x9f, 0xde, 0x5, 0xfb, 0x3e, 0x6,
+                                                              0x89, 0x92, 0x91, 0xa8, 0x8a, 0xaa, 0x8, 0xf7,
+                                                              0x27, 0x6, 0x9f, 0xde, 0x5, 0xfb, 0x3a, 0x92,
+                                                              0x6, 0xcb, 0xab, 0x47, 0xa, 0x3f, 0x3e, 0xfb,
+                                                              0x10, 0x1f, 0x80, 0x3b, 0x7, 0x78, 0x38, 0x5,
+                                                              0xeb, 0x6, 0x6c, 0x83, 0x6e, 0x8c, 0x84, 0x1e,
+                                                              0x27, 0x6, 0x78, 0x38, 0x5, 0xe8, 0x6, 0x8c,
+                                                              0x6f, 0x67, 0x56, 0x43, 0x5a, 0x8, 0xe, 0xf7,
+                                                              0xc0, 0xf7, 0x5, 0x1, 0xf8, 0x18, 0xee, 0x3,
+                                                              0xc6, 0xf7, 0xc0, 0x15, 0xf7, 0xff, 0x6, 0x69,
+                                                              0xfb, 0x59, 0x5, 0xee, 0x6, 0xc1, 0xf7, 0xca,
+                                                              0x5, 0xfc, 0x63, 0x6, 0xe, 0x81, 0xa, 0xf7,
+                                                              0x91, 0xf4, 0x3, 0xbc, 0x16, 0xf8, 0x6d, 0x55,
+                                                              0xa, 0xfb, 0x4c, 0x6, 0xbb, 0xf7, 0x73, 0xf7,
+                                                              0x16, 0xaa, 0x99, 0xcd, 0xfb, 0x15, 0x6b, 0xc0,
+                                                              0xf7, 0x88, 0x5, 0xfb, 0xae, 0x6, 0x76, 0x2d,
+                                                              0x5, 0xf7, 0x46, 0x6, 0x64, 0xfb, 0x45, 0xfb,
+                                                              0x18, 0x6a, 0x7e, 0x4a, 0xf7, 0x17, 0xab, 0x60,
+                                                              0xfb, 0x57, 0x5, 0xfb, 0x4b, 0x6, 0xe, 0x8b,
+                                                              0xea, 0xf7, 0x90, 0xea, 0x1, 0xd4, 0xdd, 0xf5,
+                                                              0xee, 0x3, 0x76, 0x16, 0xf7, 0x8a, 0x6, 0x9c,
+                                                              0xea, 0x5, 0x34, 0x6, 0xb6, 0xf7, 0x7b, 0x5,
+                                                              0x9c, 0xa0, 0xb0, 0x9b, 0xa1, 0x1b, 0xaa, 0x96,
+                                                              0x77, 0x78, 0x86, 0x8b, 0x87, 0x8a, 0x87, 0x1f,
+                                                              0x51, 0xfb, 0xc7, 0x5, 0xf7, 0x35, 0x6, 0x9b,
+                                                              0xea, 0x5, 0x3d, 0x6, 0xb6, 0xf7, 0x73, 0x5,
+                                                              0xab, 0xa7, 0xae, 0x94, 0x9b, 0x1b, 0xad, 0x97,
+                                                              0x6f, 0x81, 0x89, 0x1f, 0x4f, 0xfb, 0xd5, 0x5,
+                                                              0xf7, 0x1f, 0x6, 0x9b, 0xea, 0x5, 0x53, 0x6,
+                                                              0xb7, 0xf7, 0x72, 0x5, 0x8d, 0x95, 0x8c, 0x96,
+                                                              0x94, 0x1a, 0xc9, 0x65, 0xb8, 0x46, 0x62, 0x5f,
+                                                              0x79, 0x6c, 0x6a, 0x1e, 0xb5, 0x7b, 0x66, 0x92,
+                                                              0x75, 0x1b, 0x6c, 0x6c, 0x7f, 0x73, 0x73, 0x1f,
+                                                              0x8e, 0xa3, 0x5, 0xfb, 0x3b, 0x6, 0x79, 0x2c,
+                                                              0x5c, 0xa, 0x5a, 0xfb, 0x90, 0x5, 0x3d, 0x6,
+                                                              0xe, 0xf8, 0x8d, 0xdb, 0x1, 0xda, 0xf8, 0x3b,
+                                                              0x3, 0xda, 0xf8, 0x8d, 0x15, 0xf8, 0x3b, 0x6,
+                                                              0x9d, 0xdb, 0x5, 0xfc, 0x3b, 0x6, 0xe, 0xf7,
+                                                              0x5f, 0xf7, 0x2, 0x1, 0xc6, 0xf8, 0x63, 0x3,
+                                                              0xc6, 0xf7, 0x5f, 0x73, 0xa, 0xe, 0xfb, 0xd,
+                                                              0x76, 0xf7, 0x2a, 0xe0, 0x42, 0xe4, 0xf7, 0x85,
+                                                              0xe4, 0x12, 0x13, 0xd0, 0xa8, 0xfb, 0x22, 0x15,
+                                                              0xeb, 0x6, 0xb1, 0xf7, 0x48, 0x5, 0x7d, 0x98,
+                                                              0x9d, 0x7b, 0xb2, 0x1b, 0xcc, 0xb8, 0xab, 0xab,
+                                                              0xb7, 0x1f, 0x13, 0xb0, 0x7f, 0x57, 0x5, 0xf7,
+                                                              0x44, 0x6, 0x9e, 0xe4, 0x5, 0x3b, 0x6, 0xcf,
+                                                              0xf7, 0xde, 0x8d, 0xa, 0x63, 0xfb, 0x57, 0x5,
+                                                              0x13, 0xd0, 0x68, 0x5c, 0x62, 0x70, 0x50, 0x1b,
+                                                              0x5f, 0x74, 0xa1, 0xad, 0x92, 0x8b, 0x94, 0x8d,
+                                                              0x93, 0x1f, 0xc1, 0xf7, 0x9e, 0x8d, 0xa, 0xe,
+                                                              0xbc, 0xf8, 0x4e, 0x3, 0xbc, 0xef, 0x15, 0xbc,
+                                                              0x4e, 0xf7, 0x52, 0xf7, 0x35, 0xf7, 0x15, 0xfb,
+                                                              0x35, 0xd5, 0xc8, 0xfb, 0x15, 0xf7, 0x33, 0xf7,
+                                                              0x50, 0xf7, 0x30, 0x5b, 0xc7, 0xfb, 0x53, 0xfb,
+                                                              0x31, 0xfb, 0x13, 0xf7, 0x34, 0x41, 0x4f, 0xf7,
+                                                              0x16, 0xfb, 0x33, 0x5, 0xe, 0x8b, 0xe9, 0xf7,
+                                                              0x90, 0xea, 0x3b, 0xe8, 0x12, 0x13, 0xa0, 0x8d,
+                                                              0x16, 0xf7, 0x96, 0x3f, 0xa, 0x39, 0x6, 0xb4,
+                                                              0xf7, 0x5d, 0x5, 0xb6, 0xc6, 0xd3, 0xa2, 0xaa,
+                                                              0x1b, 0xbd, 0x9a, 0x7a, 0x72, 0x82, 0x89, 0x81,
+                                                              0x89, 0x80, 0x1f, 0x64, 0xfb, 0x57, 0x5, 0x3c,
+                                                              0x44, 0xa, 0xf7, 0x93, 0x3f, 0xa, 0x3b, 0x6,
+                                                              0xb7, 0xf7, 0x6d, 0x5, 0x13, 0xc0, 0x8e, 0x98,
+                                                              0x8d, 0x96, 0x96, 0x1a, 0x13, 0xa0, 0xd0, 0x4d,
+                                                              0xb2, 0x3e, 0x52, 0x4b, 0x6f, 0x6f, 0x5a, 0x1e,
+                                                              0x13, 0xc0, 0x93, 0xb6, 0x5, 0xfb, 0x46, 0x6,
+                                                              0x78, 0x2c, 0x5, 0xde, 0x6, 0x58, 0xfb, 0x90,
+                                                              0x5, 0x3b, 0x6, 0xe, 0x7c, 0xe4, 0xf7, 0x1b,
+                                                              0xe8, 0xf7, 0x70, 0xe9, 0x1, 0xf7, 0x1d, 0xf1,
+                                                              0xf7, 0x77, 0xe7, 0x3, 0xb5, 0x82, 0x15, 0x87,
+                                                              0xaa, 0xb5, 0x89, 0xbd, 0x1b, 0xf7, 0x5a, 0xf7,
+                                                              0x57, 0xf7, 0x28, 0xf7, 0xb0, 0xf2, 0x62, 0xeb,
+                                                              0xfb, 0x1a, 0xfb, 0x15, 0xfb, 0x9, 0xfb, 0x5,
+                                                              0xfb, 0xa, 0x1f, 0x2e, 0x89, 0xce, 0x38, 0xf1,
+                                                              0x1b, 0xb6, 0xb5, 0x9d, 0x9b, 0xa8, 0x1f, 0xfb,
+                                                              0xc, 0x6a, 0xfb, 0x1e, 0x5a, 0xfb, 0x48, 0x1b,
+                                                              0xf8, 0x23, 0xf7, 0xc6, 0x15, 0x86, 0x53, 0x42,
+                                                              0x37, 0x56, 0x69, 0xb1, 0xc4, 0xdf, 0xdb, 0xb4,
+                                                              0xbe, 0xe3, 0x97, 0x3d, 0x4b, 0x87, 0x1e, 0xe,
+                                                              0x8b, 0xe7, 0xf7, 0x89, 0xe7, 0xf7, 0xc, 0xe0,
+                                                              0x1, 0xf7, 0x38, 0xf8, 0x95, 0x15, 0xda, 0x71,
+                                                              0x5, 0xa4, 0x9a, 0x9c, 0xb0, 0xaf, 0x1b, 0xa1,
+                                                              0xa1, 0x7a, 0x7b, 0xa3, 0x1f, 0x7d, 0xa1, 0xa1,
+                                                              0x7e, 0xa4, 0x1b, 0xed, 0xbc, 0xe3, 0xaf, 0x9c,
+                                                              0x1f, 0x3d, 0xa2, 0x5, 0x62, 0x71, 0x7e, 0x75,
+                                                              0x6e, 0x1b, 0x78, 0x77, 0x98, 0x98, 0x77, 0x1f,
+                                                              0x9c, 0x72, 0x72, 0x9d, 0x6f, 0x1b, 0x2d, 0x5d,
+                                                              0x3d, 0x60, 0x72, 0x1f, 0xfb, 0x44, 0xfc, 0x95,
+                                                              0x15, 0xf7, 0x8c, 0x6, 0x9c, 0xe7, 0x5, 0x3d,
+                                                              0x6, 0xb1, 0xf7, 0x56, 0x5, 0xb6, 0xc4, 0xd1,
+                                                              0xa1, 0xa7, 0x1b, 0xba, 0x9b, 0x7c, 0x75, 0x81,
+                                                              0x8a, 0x80, 0x89, 0x7f, 0x1f, 0x66, 0xfb, 0x51,
+                                                              0x5, 0x3f, 0x6, 0x78, 0x2f, 0x5, 0xf7, 0x88,
+                                                              0x6, 0x9d, 0xe7, 0x5, 0x40, 0x6, 0xb4, 0xf7,
+                                                              0x66, 0x5, 0x8e, 0x98, 0x8c, 0x97, 0x97, 0x1a,
+                                                              0xcd, 0x50, 0xb0, 0x42, 0x55, 0x4b, 0x6f, 0x70,
+                                                              0x5e, 0x1e, 0x94, 0xb5, 0x5, 0xfb, 0x40, 0x6,
+                                                              0x79, 0x2f, 0x8a, 0xa, 0x5a, 0xfb, 0x89, 0x5,
+                                                              0x3e, 0x6, 0xe, 0xf7, 0x29, 0xe6, 0xf7, 0x6,
+                                                              0xe6, 0x12, 0xf7, 0x4, 0xe9, 0x84, 0xe5, 0x9f,
+                                                              0xe7, 0x81, 0xe9, 0x13, 0xe8, 0xce, 0x5e, 0x15,
+                                                              0xe2, 0x6, 0xbf, 0xf7, 0x56, 0x5, 0xf2, 0x6,
+                                                              0x56, 0x98, 0xa, 0xea, 0x6, 0xbd, 0xf7, 0x56,
+                                                              0x5, 0xf7, 0x5, 0x34, 0xa, 0x21, 0x6, 0xab,
+                                                              0xf7, 0x6, 0x5, 0xed, 0x34, 0xa, 0x13, 0xd4,
+                                                              0x30, 0x6, 0xc1, 0xf7, 0x62, 0x5, 0x30, 0x6,
+                                                              0x52, 0xfb, 0x62, 0x5, 0x25, 0x6, 0xc2, 0xf7,
+                                                              0x62, 0x5, 0x32, 0x6, 0x53, 0xfb, 0x62, 0x5,
+                                                              0xfb, 0x5, 0x36, 0xa, 0xf6, 0x6, 0x6b, 0xfb,
+                                                              0x6, 0x5, 0x28, 0x36, 0xa, 0x13, 0xe8, 0xe3,
+                                                              0x6, 0xf7, 0xb, 0xe6, 0x15, 0xab, 0xf7, 0x6,
+                                                              0x5, 0xf3, 0x6, 0x6b, 0xfb, 0x6, 0x5, 0xe,
+                                                              0x7c, 0xeb, 0xf7, 0xa9, 0xeb, 0x1, 0xa4, 0xf1,
+                                                              0xf7, 0xef, 0xf0, 0x3, 0xa4, 0xf7, 0x3c, 0x15,
+                                                              0xfb, 0x1b, 0xf7, 0x17, 0x5b, 0xf4, 0xf7, 0x31,
+                                                              0xf7, 0x31, 0xe5, 0xf7, 0x4d, 0xee, 0x4b, 0xea,
+                                                              0xfb, 0x35, 0xfb, 0x2e, 0xfb, 0x3f, 0x22, 0xfb,
+                                                              0x49, 0x1e, 0xf1, 0x9b, 0x15, 0xf3, 0xe8, 0xd1,
+                                                              0xf6, 0xf7, 0x3, 0xaf, 0x51, 0x54, 0xfb, 0x5,
+                                                              0xfb, 0x1, 0x58, 0x33, 0x54, 0x2c, 0x9e, 0xdf,
+                                                              0x1e, 0xe, 0x5d, 0xa, 0xf7, 0x88, 0xf8, 0x77,
+                                                              0x15, 0xf7, 0xdf, 0xd8, 0x77, 0xf0, 0xfb, 0xd6,
+                                                              0xfb, 0xc, 0x5, 0xfb, 0x65, 0xfc, 0x12, 0x29,
+                                                              0xa, 0x63, 0xa, 0xf7, 0x71, 0x77, 0x45, 0xa,
+                                                              0xf7, 0x2b, 0xf8, 0x95, 0x15, 0xc0, 0x67, 0xf7,
+                                                              0x45, 0xf7, 0x0, 0xf7, 0x13, 0xfb, 0x0, 0xce,
+                                                              0xae, 0xfb, 0x18, 0xf7, 0x25, 0x4e, 0xa, 0xfb,
+                                                              0xd5, 0xfc, 0x86, 0x30, 0xa, 0xfb, 0x3, 0xfb,
+                                                              0x3a, 0x2d, 0xa, 0x63, 0xa, 0xcc, 0xf7, 0x10,
+                                                              0x45, 0xa, 0xf8, 0x21, 0xf8, 0x89, 0x72, 0xa,
+                                                              0xfb, 0x68, 0xfb, 0x10, 0x72, 0xa, 0xfb, 0x69,
+                                                              0xfc, 0x66, 0x29, 0xa, 0x7c, 0xea, 0xe0, 0xea,
+                                                              0xed, 0xeb, 0x1, 0x76, 0xef, 0x3, 0xf7, 0xab,
+                                                              0xc1, 0x15, 0x69, 0xa3, 0xa1, 0x68, 0xe7, 0x1b,
+                                                              0xc3, 0xbc, 0x99, 0xa0, 0xc6, 0x1f, 0x7e, 0xe7,
+                                                              0x5, 0x74, 0x46, 0x62, 0x82, 0x73, 0x1b, 0x4a,
+                                                              0x77, 0xb0, 0xa6, 0x94, 0x8c, 0x92, 0x8e, 0x90,
+                                                              0x1f, 0xf7, 0x8a, 0x6, 0x97, 0xad, 0x95, 0xb9,
+                                                              0xb8, 0x1a, 0xde, 0x6c, 0xdc, 0x2c, 0x5c, 0x5a,
+                                                              0x78, 0x68, 0x63, 0x1e, 0xb1, 0x71, 0x5c, 0x9b,
+                                                              0x58, 0x1b, 0xfb, 0x32, 0x29, 0xfb, 0x32, 0xfb,
+                                                              0x32, 0x44, 0xa8, 0x39, 0xf7, 0xe, 0xd2, 0xc1,
+                                                              0xb8, 0xa3, 0xa3, 0x1f, 0xe1, 0xf7, 0x62, 0x15,
+                                                              0xb3, 0x97, 0xb6, 0xc5, 0xbf, 0x1b, 0xd0, 0x7d,
+                                                              0x3f, 0x75, 0x88, 0x1f, 0xfc, 0x51, 0xfb, 0xc,
+                                                              0x15, 0xc2, 0xb1, 0xf7, 0x37, 0xea, 0xbb, 0x96,
+                                                              0x66, 0x6b, 0x41, 0x60, 0xfb, 0x1b, 0x38, 0x60,
+                                                              0x74, 0xa1, 0xb1, 0x1e, 0xe, 0xfb, 0x5b, 0xd4,
+                                                              0x1, 0xf7, 0x59, 0xe2, 0x3, 0xf7, 0xc9, 0x8a,
+                                                              0x15, 0x78, 0x2e, 0x56, 0x40, 0x64, 0xa5, 0x6c,
+                                                              0xb7, 0xa9, 0xa9, 0x97, 0xa0, 0xa5, 0x1f, 0xa7,
+                                                              0xdd, 0x5, 0x7b, 0x80, 0x64, 0x71, 0x72, 0x1b,
+                                                              0x7e, 0x82, 0x91, 0x9e, 0xb1, 0xe7, 0xba, 0xa6,
+                                                              0x9a, 0x1f, 0xe, 0x5d, 0xa, 0xf7, 0x6d, 0xf8,
+                                                              0xc3, 0x15, 0xf7, 0xc9, 0x3e, 0xae, 0xc6, 0xfb,
+                                                              0xab, 0xf7, 0xc, 0x5, 0xfb, 0x96, 0xfc, 0x8a,
+                                                              0x29, 0xa, 0x8b, 0xe8, 0x1, 0xf7, 0x9c, 0xeb,
+                                                              0x3, 0xcd, 0x16, 0xf8, 0x55, 0x94, 0xa, 0xfb,
+                                                              0x42, 0x6, 0xf5, 0xf8, 0x9f, 0xfb, 0xa3, 0x56,
+                                                              0x78, 0x30, 0xf7, 0x3f, 0xad, 0x38, 0xfc, 0x31,
+                                                              0x5, 0xfb, 0x47, 0x6, 0xe, 0x5d, 0xce, 0x4f,
+                                                              0x76, 0xf7, 0xb7, 0xcf, 0x8a, 0xd0, 0xf7, 0xba,
+                                                              0x77, 0x12, 0xc4, 0xcf, 0xf7, 0x7d, 0xce, 0xeb,
+                                                              0xcf, 0x13, 0xaf, 0xf7, 0xc6, 0x5d, 0x15, 0xf7,
+                                                              0x82, 0x6, 0x98, 0xce, 0x5, 0xfb, 0x1a, 0x6,
+                                                              0xf1, 0xd8, 0x5, 0xac, 0xa0, 0xaa, 0xb4, 0xb9,
+                                                              0x1a, 0xaf, 0x7b, 0xc4, 0x3b, 0x5f, 0x5e, 0x75,
+                                                              0x68, 0x68, 0x1e, 0x80, 0x4c, 0x5, 0xce, 0x6,
+                                                              0xa4, 0x90, 0x91, 0xa6, 0xb6, 0x1b, 0x9f, 0xa1,
+                                                              0x81, 0x75, 0x79, 0x7e, 0x73, 0x79, 0x7e, 0x1f,
+                                                              0xfb, 0x41, 0xfb, 0x19, 0x5, 0xfb, 0xfe, 0x77,
+                                                              0x15, 0x13, 0x5f, 0xc5, 0x58, 0xf9, 0xd, 0xf9,
+                                                              0x35, 0x4d, 0xbb, 0x5, 0xfd, 0xa, 0xfb, 0xff,
+                                                              0x15, 0xf7, 0x83, 0x6, 0x99, 0xd0, 0x5, 0x39,
+                                                              0x6, 0xbf, 0xf7, 0xa9, 0xfb, 0x22, 0x6e, 0x7e,
+                                                              0x46, 0xd4, 0x9a, 0x65, 0x98, 0xa, 0x32, 0x6,
+                                                              0xe, 0x5c, 0xc4, 0x5a, 0x76, 0xf7, 0x6, 0xca,
+                                                              0xf7, 0x48, 0xd0, 0xf7, 0xbb, 0x77, 0x12, 0x13,
+                                                              0xb8, 0xf7, 0x96, 0xc1, 0x15, 0xf7, 0x19, 0x6,
+                                                              0x84, 0x5f, 0x5, 0x52, 0x6, 0x80, 0x52, 0x5,
+                                                              0xf7, 0x37, 0x6, 0x96, 0xc4, 0x5, 0x63, 0x6,
+                                                              0x93, 0xb7, 0x5, 0xb3, 0x6, 0x98, 0xca, 0x5,
+                                                              0x63, 0x6, 0xac, 0xf7, 0x46, 0x5, 0x4c, 0x6,
+                                                              0xfb, 0x41, 0x98, 0xa, 0xdd, 0x9b, 0x15, 0xd0,
+                                                              0xdc, 0x7c, 0x3a, 0x5, 0xfc, 0x52, 0xfb, 0x12,
+                                                              0x15, 0x13, 0x78, 0xc6, 0x58, 0xf9, 0x9, 0xf9,
+                                                              0x34, 0x4c, 0xbc, 0x5, 0xfd, 0x9, 0xfc, 0x0,
+                                                              0x15, 0xf7, 0x82, 0x6, 0x99, 0xd0, 0x5, 0x38,
+                                                              0x6, 0xbf, 0xf7, 0xa8, 0xfb, 0x1f, 0x6e, 0x7e,
+                                                              0x47, 0xd2, 0x9a, 0x66, 0x98, 0xa, 0x32, 0x6,
+                                                              0xe, 0xf7, 0x70, 0xd7, 0xf7, 0xd4, 0x77, 0x1,
+                                                              0xf7, 0xa4, 0xda, 0x3, 0xf7, 0x29, 0xf7, 0x70,
+                                                              0x15, 0xf7, 0xb0, 0x6, 0x9c, 0xd7, 0x7b, 0xa,
+                                                              0xc9, 0xf7, 0xd4, 0xfb, 0x3b, 0x6a, 0x7b, 0x3f,
+                                                              0xe0, 0x9c, 0x60, 0xfb, 0x78, 0x5, 0x21, 0x6,
+                                                              0xe, 0xf7, 0x58, 0xde, 0xed, 0xda, 0xb4, 0xde,
+                                                              0x1, 0xf7, 0x17, 0xd8, 0x3, 0xf7, 0xd6, 0xf7,
+                                                              0x60, 0x15, 0xf7, 0x17, 0x6, 0x9a, 0xdd, 0x5,
+                                                              0x53, 0x6, 0xa4, 0xf7, 0x22, 0x5, 0x8f, 0xa1,
+                                                              0x8d, 0xa5, 0xa1, 0x1a, 0xc9, 0x51, 0x9f, 0x53,
+                                                              0x55, 0x4e, 0x7b, 0x7d, 0x67, 0x1e, 0x9a, 0x3c,
+                                                              0x5, 0x99, 0xb2, 0xc3, 0x97, 0xb1, 0x1b, 0xaa,
+                                                              0x98, 0x77, 0x6c, 0x87, 0x1f, 0x92, 0x75, 0x74,
+                                                              0x8e, 0x73, 0x1b, 0xfb, 0x13, 0x64, 0x32, 0x4b,
+                                                              0x51, 0xb2, 0x5a, 0xcb, 0xab, 0xae, 0xa0, 0xa7,
+                                                              0xa7, 0x1f, 0xa2, 0xf7, 0x12, 0x15, 0x63, 0x76,
+                                                              0x60, 0x57, 0x63, 0x1b, 0x69, 0x85, 0xa0, 0x9e,
+                                                              0xb3, 0xbd, 0x9d, 0xb2, 0xa1, 0xac, 0x85, 0x8b,
+                                                              0x1f, 0xe, 0xf7, 0x58, 0xde, 0xf7, 0x6e, 0xde,
+                                                              0x1, 0xf7, 0x10, 0xd9, 0xf7, 0x58, 0xd9, 0x3,
+                                                              0xf7, 0x10, 0xf8, 0x3, 0x15, 0x35, 0xbf, 0x36,
+                                                              0xe6, 0xf7, 0x3, 0xed, 0xf7, 0xa, 0xf7, 0x14,
+                                                              0xdc, 0x5e, 0xe9, 0x2b, 0xfb, 0x16, 0x3a, 0xfb,
+                                                              0x26, 0x23, 0x1e, 0xd9, 0x99, 0x15, 0xc5, 0xb3,
+                                                              0xea, 0xd7, 0xc4, 0xa2, 0x4b, 0x61, 0x41, 0x54,
+                                                              0x40, 0x4c, 0x56, 0x72, 0xc4, 0xb8, 0x1e, 0xe,
+                                                              0x7d, 0xea, 0x37, 0x76, 0xf8, 0x18, 0xea, 0x8f,
+                                                              0x77, 0x12, 0xac, 0xf0, 0xf7, 0xe4, 0xec, 0x13,
+                                                              0x6c, 0x94, 0xa7, 0x15, 0xba, 0x57, 0xc6, 0xbb,
+                                                              0x5, 0x13, 0x9c, 0x70, 0xb7, 0xc1, 0x80, 0xbb,
+                                                              0x1b, 0xf7, 0x14, 0xf7, 0x46, 0xea, 0xf7, 0x4e,
+                                                              0x1f, 0x8c, 0xaf, 0x83, 0xae, 0x78, 0xaa, 0xbd,
+                                                              0xb4, 0x18, 0x5d, 0xc0, 0x56, 0x60, 0x5, 0x13,
+                                                              0xac, 0xa3, 0x68, 0x5c, 0x9a, 0x4d, 0x1b, 0xfb,
+                                                              0x29, 0xfb, 0x3a, 0x20, 0xfb, 0x48, 0x63, 0x96,
+                                                              0x6a, 0x9d, 0x70, 0x1f, 0xf7, 0x20, 0xa1, 0x15,
+                                                              0xf7, 0x93, 0xf7, 0x64, 0x5, 0x93, 0x7d, 0x90,
+                                                              0x7b, 0x7b, 0x1a, 0xfb, 0x5, 0xfb, 0x3, 0x4d,
+                                                              0x39, 0x76, 0x6e, 0x8e, 0x95, 0x72, 0x1e, 0x53,
+                                                              0xb8, 0x15, 0x7e, 0xa0, 0x8c, 0xa5, 0x9f, 0x1a,
+                                                              0xe9, 0xf0, 0xcb, 0xe7, 0xab, 0xa4, 0x86, 0x82,
+                                                              0x9f, 0x1e, 0xe, 0x63, 0xa, 0xf7, 0x1e, 0x77,
+                                                              0xdd, 0x77, 0x45, 0xa, 0xf7, 0x1b, 0xf8, 0x95,
+                                                              0x15, 0xd9, 0x71, 0x5, 0xa0, 0x9c, 0x99, 0xb4,
+                                                              0xad, 0x1b, 0x9e, 0x9f, 0x81, 0x7e, 0x9f, 0x1f,
+                                                              0x7a, 0xa5, 0xa6, 0x78, 0xa9, 0x1b, 0xee, 0xbc,
+                                                              0xe3, 0xad, 0x9c, 0x1f, 0x3d, 0xa3, 0x5, 0x62,
+                                                              0x70, 0x7e, 0x76, 0x6e, 0x1b, 0x76, 0x77, 0x98,
+                                                              0x99, 0x76, 0x1f, 0x9b, 0x73, 0x72, 0x9c, 0x70,
+                                                              0x1b, 0x2c, 0x5d, 0x3d, 0x60, 0x73, 0x1f, 0xfb,
+                                                              0x3, 0xfb, 0xf6, 0x29, 0xa, 0xfb, 0x22, 0xe3,
+                                                              0xea, 0x76, 0xf7, 0xe1, 0xe3, 0x40, 0xe3, 0x12,
+                                                              0xb7, 0xe9, 0xf7, 0xf6, 0xee, 0x13, 0xdc, 0x67,
+                                                              0x90, 0xa, 0x9e, 0xe3, 0x85, 0xa, 0xa2, 0xf7,
+                                                              0x3, 0x5, 0x7d, 0x9d, 0xbd, 0x74, 0xdb, 0x1b,
+                                                              0xf7, 0x39, 0xf7, 0xf, 0xf7, 0x7, 0xf7, 0x24,
+                                                              0xf7, 0x7, 0x3b, 0xc7, 0xfb, 0x1, 0x54, 0x44,
+                                                              0x72, 0x6c, 0x5b, 0x1f, 0x13, 0xec, 0x94, 0xb6,
+                                                              0x3e, 0xa, 0x79, 0x33, 0x8a, 0xa, 0x35, 0xfc,
+                                                              0x2b, 0x5, 0xf7, 0x29, 0xf7, 0x8f, 0x15, 0x13,
+                                                              0xdc, 0xf7, 0xe, 0xf7, 0x18, 0xae, 0xc0, 0xce,
+                                                              0xba, 0x6a, 0x56, 0x39, 0x2f, 0x3a, 0x3d, 0x63,
+                                                              0x32, 0x99, 0xd9, 0x1e, 0xe, 0xf8, 0xba, 0xa9,
+                                                              0x1, 0xf7, 0xb, 0xbf, 0xea, 0xc0, 0x3, 0xf7,
+                                                              0xb, 0x45, 0x15, 0xbf, 0x6, 0xf7, 0x7a, 0xf9,
+                                                              0x0, 0x5, 0xea, 0x6, 0xfb, 0x7a, 0xfd, 0x0,
+                                                              0x5, 0xc0, 0x6, 0xf7, 0x78, 0xf9, 0x0, 0x5,
+                                                              0xc8, 0x6, 0x96, 0xa9, 0x5, 0xfb, 0x97, 0x6,
+                                                              0xfb, 0x4e, 0xfb, 0x55, 0x59, 0xfb, 0x2a, 0x47,
+                                                              0xce, 0x49, 0xf7, 0x4a, 0x81, 0x1f, 0xe, 0x3a,
+                                                              0x76, 0xf9, 0x62, 0x77, 0x1, 0xf7, 0x1d, 0xf2,
+                                                              0x3, 0xf7, 0x5b, 0x25, 0x15, 0xec, 0x6, 0x6e,
+                                                              0xd1, 0x70, 0xec, 0xf6, 0x1a, 0xf7, 0x46, 0xf7,
+                                                              0xe, 0xf7, 0x23, 0xf0, 0xf7, 0xf, 0x1e, 0x2b,
+                                                              0x6, 0xfb, 0x1a, 0xfb, 0x23, 0x2b, 0xfb, 0x26,
+                                                              0xfb, 0x46, 0x1a, 0x48, 0x98, 0x32, 0xbc, 0x2c,
+                                                              0x1e, 0xe, 0x3a, 0x76, 0xf9, 0x62, 0x77, 0x1,
+                                                              0xf7, 0xfc, 0xf2, 0x3, 0xf7, 0x1c, 0x25, 0x15,
+                                                              0xeb, 0x6, 0xf7, 0x1a, 0xf7, 0x23, 0xec, 0xf7,
+                                                              0x26, 0xf7, 0x46, 0x1a, 0xce, 0x7e, 0xe4, 0x5a,
+                                                              0xea, 0x1e, 0x2a, 0x6, 0xa8, 0x45, 0xa6, 0x2a,
+                                                              0x20, 0x1a, 0xfb, 0x46, 0xfb, 0xf, 0xfb, 0x23,
+                                                              0x26, 0xfb, 0xf, 0x1e, 0xe, 0x7c, 0xd1, 0xf7,
+                                                              0x1c, 0xd1, 0xda, 0xd1, 0xf7, 0x1c, 0xd1, 0x1,
+                                                              0xc3, 0xdc, 0xd5, 0xdc, 0x9b, 0xdc, 0xd5, 0xdc,
+                                                              0x3, 0xc3, 0xf8, 0x5a, 0x39, 0xa, 0xd5, 0xfb,
+                                                              0xfd, 0x39, 0xa, 0xfb, 0x69, 0xce, 0x15, 0xf8,
+                                                              0x5e, 0xf7, 0x4a, 0x7a, 0xcb, 0xfc, 0x5f, 0xfb,
+                                                              0x4c, 0x5, 0xe, 0x7c, 0xf7, 0x4e, 0x1, 0xf7,
+                                                              0x52, 0xf7, 0x6f, 0x3, 0xf7, 0x52, 0xcb, 0x15,
+                                                              0x68, 0xa3, 0x5f, 0xd1, 0xc7, 0xcc, 0xb2, 0xcf,
+                                                              0xb3, 0x6d, 0xb2, 0x4d, 0x4b, 0x4c, 0x60, 0x4b,
+                                                              0x1e, 0xe, 0xf7, 0x39, 0xf7, 0x4e, 0x1, 0xf7,
+                                                              0x56, 0xf7, 0x68, 0x3, 0xf7, 0x56, 0xf7, 0x87,
+                                                              0x15, 0x6c, 0x9f, 0x5c, 0xd3, 0xc9, 0xc5, 0xbc,
+                                                              0xc5, 0xb3, 0x72, 0xb2, 0x4c, 0x49, 0x51, 0x55,
+                                                              0x55, 0x1e, 0xe, 0x7c, 0xd1, 0xf7, 0x1b, 0xd1,
+                                                              0xdb, 0xd1, 0xf7, 0x1c, 0xd1, 0x1, 0x3f, 0xd9,
+                                                              0xab, 0xd9, 0xc2, 0xd7, 0xad, 0xd7, 0xa0, 0xd9,
+                                                              0xf7, 0x39, 0xd7, 0x3, 0x3f, 0xf8, 0x57, 0x49,
+                                                              0xa, 0xc0, 0x3a, 0xfb, 0xa, 0x42, 0x3c, 0x35,
+                                                              0x1e, 0xd9, 0x95, 0x15, 0xb7, 0xaf, 0xb4, 0xc8,
+                                                              0xb5, 0xa5, 0x72, 0x53, 0xa, 0x3f, 0xfb, 0xaa,
+                                                              0x15, 0xf8, 0x77, 0xf7, 0x4f, 0x7a, 0xc9, 0xfc,
+                                                              0x79, 0xfb, 0x50, 0x5, 0xf8, 0x67, 0xfb, 0x28,
+                                                              0x38, 0xa, 0xfc, 0x36, 0x81, 0x38, 0xa, 0xe,
+                                                              0xf7, 0x68, 0xe9, 0xf7, 0x40, 0x77, 0x1, 0xf7,
+                                                              0x62, 0xed, 0x3, 0xc6, 0xf7, 0x68, 0x15, 0xf7,
+                                                              0x4a, 0x6, 0x68, 0xfb, 0x3d, 0x56, 0xa, 0xae,
+                                                              0xf7, 0x3d, 0x5, 0xf7, 0x4b, 0x3f, 0xa, 0xfb,
+                                                              0x4a, 0x6, 0xae, 0xf7, 0x40, 0x4e, 0xa, 0x68,
+                                                              0xfb, 0x40, 0x5, 0xfb, 0x4b, 0x6, 0xe, 0xa9,
+                                                              0xdc, 0xf7, 0x43, 0xdc, 0xf7, 0x28, 0x77, 0x1,
+                                                              0xf7, 0x82, 0xed, 0x3, 0xf7, 0x82, 0xf7, 0x1e,
+                                                              0x15, 0xed, 0x6, 0xad, 0xf7, 0x28, 0x5, 0xf7,
+                                                              0x48, 0x6, 0x9e, 0xdc, 0x5, 0xfb, 0x48, 0x6,
+                                                              0xae, 0xf7, 0x28, 0x4e, 0xa, 0x69, 0xfb, 0x28,
+                                                              0x5, 0xfb, 0x47, 0x6, 0x78, 0x3a, 0x5, 0xf7,
+                                                              0x47, 0x6, 0xfb, 0x86, 0xfb, 0x9a, 0x15, 0xf8,
+                                                              0x5c, 0x6, 0x9e, 0xdc, 0x5, 0xfc, 0x5c, 0x6,
+                                                              0xe, 0x7c, 0xe9, 0xf7, 0x12, 0xe9, 0xf7, 0x3d,
+                                                              0xe9, 0x1, 0xf8, 0x89, 0xf1, 0x3, 0xf7, 0xdc,
+                                                              0xb0, 0x15, 0xc8, 0x57, 0xb5, 0xb7, 0x96, 0x7c,
+                                                              0x95, 0x7d, 0x90, 0x7c, 0x19, 0xf7, 0xa, 0x55,
+                                                              0xa, 0x3a, 0x6, 0x7d, 0xa0, 0xdb, 0xdd, 0x54,
+                                                              0xbf, 0x46, 0x46, 0x65, 0xc5, 0x5, 0xf7, 0xd,
+                                                              0x9e, 0xcb, 0xe1, 0xe8, 0x1a, 0xec, 0x39, 0xb7,
+                                                              0x23, 0x1e, 0xfb, 0xbc, 0x44, 0xa, 0xdd, 0x6,
+                                                              0x39, 0xfc, 0x19, 0x5, 0x34, 0x44, 0xa, 0xf7,
+                                                              0x9f, 0x3f, 0xa, 0x3b, 0x6, 0xa5, 0xf7, 0x12,
+                                                              0x5, 0xdf, 0x6, 0xd3, 0xfb, 0x4, 0x5, 0xfb,
+                                                              0x1c, 0xf7, 0x62, 0x15, 0xae, 0xf7, 0x3d, 0x5,
+                                                              0xf7, 0x1b, 0x6, 0xa3, 0xc6, 0x82, 0x5a, 0x2a,
+                                                              0x23, 0x7d, 0x58, 0x1f, 0xe, 0xfb, 0x22, 0xe3,
+                                                              0xd6, 0xe1, 0xf7, 0x8c, 0xe3, 0x3f, 0xe2, 0x12,
+                                                              0x81, 0xf1, 0x13, 0xe8, 0xf7, 0x4a, 0x90, 0xa,
+                                                              0xa0, 0xe3, 0x5, 0x3b, 0x6, 0xe3, 0xf8, 0x2d,
+                                                              0x5c, 0xa, 0x9f, 0xe3, 0x3e, 0xa, 0x7f, 0x5e,
+                                                              0x5, 0x13, 0xd8, 0xad, 0x69, 0x5c, 0xa1, 0x53,
+                                                              0x1b, 0xfb, 0x31, 0xfb, 0x21, 0xfb, 0xf, 0xfb,
+                                                              0x18, 0x29, 0xd7, 0x3b, 0xf7, 0x14, 0xc1, 0xc2,
+                                                              0x90, 0xa9, 0xbb, 0x1f, 0x75, 0xfb, 0x2, 0x5,
+                                                              0xfb, 0x81, 0xf7, 0x9c, 0x15, 0xe1, 0xdc, 0xd2,
+                                                              0xf0, 0xed, 0xa0, 0x49, 0x56, 0xfb, 0x11, 0xfb,
+                                                              0x1a, 0x7b, 0x5e, 0x46, 0x56, 0xb4, 0xc9, 0x1e,
+                                                              0xe, 0x7d, 0xf7, 0x2c, 0xf7, 0xf2, 0xe7, 0x1,
+                                                              0xeb, 0xf7, 0x54, 0xf7, 0x8, 0xef, 0x3, 0xf7,
+                                                              0x3d, 0xf7, 0x4a, 0x15, 0xed, 0x6, 0x98, 0xc5,
+                                                              0x5, 0xe3, 0x9a, 0xf7, 0x1c, 0xc2, 0xf7, 0x1a,
+                                                              0x1a, 0xe4, 0x3c, 0xba, 0xfb, 0x0, 0x53, 0x3c,
+                                                              0x7d, 0x77, 0x52, 0x1e, 0x6e, 0xfb, 0x24, 0x5,
+                                                              0xee, 0x6, 0x99, 0xd7, 0x5, 0x91, 0xa7, 0xa9,
+                                                              0x8f, 0xa7, 0x1b, 0xc6, 0xbd, 0x7a, 0x62, 0x30,
+                                                              0xfb, 0x2, 0x79, 0x28, 0x7c, 0x1f, 0x28, 0xfb,
+                                                              0x9e, 0x15, 0x6a, 0xae, 0x76, 0xba, 0xd8, 0xac,
+                                                              0xbd, 0xb6, 0xa2, 0x7b, 0xaf, 0x4c, 0x4a, 0x5b,
+                                                              0x5c, 0x58, 0x1e, 0xe, 0xfb, 0x26, 0xe8, 0xf7,
+                                                              0xf2, 0xf7, 0x2c, 0x1, 0xeb, 0xed, 0xf7, 0xc,
+                                                              0xf7, 0x52, 0x3, 0xf7, 0xce, 0xf8, 0x2, 0x15,
+                                                              0x78, 0x8a, 0x90, 0x59, 0xd6, 0x1b, 0xce, 0xb7,
+                                                              0xb8, 0xbb, 0xaf, 0x6a, 0xa2, 0x5b, 0x44, 0x65,
+                                                              0x5d, 0x66, 0x1f, 0x8e, 0xfb, 0x3e, 0x15, 0x4b,
+                                                              0x85, 0xfb, 0x31, 0x4a, 0xfb, 0x1b, 0x1a, 0x33,
+                                                              0xd9, 0x5b, 0xf6, 0xc1, 0xdf, 0x99, 0x9f, 0xc4,
+                                                              0x1e, 0xa7, 0xf7, 0x1a, 0x66, 0xa, 0x7d, 0x49,
+                                                              0x5, 0x86, 0x6e, 0x68, 0x87, 0x6e, 0x1b, 0x51,
+                                                              0x5b, 0x9c, 0xb4, 0xe7, 0xf7, 0x2, 0x9d, 0xec,
+                                                              0x9a, 0x1f, 0xa4, 0xf7, 0x13, 0x66, 0xa, 0xe,
+                                                              0xf8, 0xc6, 0x77, 0x1, 0xf7, 0x6, 0xf7, 0x4,
+                                                              0xd5, 0xf7, 0x2, 0x3, 0xf7, 0xc0, 0xf7, 0xa9,
+                                                              0x15, 0xf7, 0x2, 0x6, 0xd7, 0x71, 0xa, 0xfb,
+                                                              0x20, 0x6, 0xfb, 0x7c, 0xfb, 0xb1, 0x5a, 0xa,
+                                                              0xd7, 0x71, 0xa, 0xfb, 0x20, 0x6, 0xe, 0xfb,
+                                                              0x22, 0xf7, 0xb1, 0x1, 0xf7, 0x90, 0xfb, 0x22,
+                                                              0x15, 0xf7, 0x9, 0x80, 0xa, 0xfb, 0x31, 0x6,
+                                                              0xfc, 0x3, 0xfb, 0xb1, 0x15, 0xf7, 0x7, 0x6,
+                                                              0xf7, 0x57, 0x71, 0xa, 0xfb, 0x32, 0x6, 0xe,
+                                                              0xf7, 0x46, 0xf7, 0x5, 0xed, 0xf7, 0x5, 0x3,
+                                                              0xf8, 0x19, 0xf7, 0xa9, 0x6d, 0xa, 0x63, 0x71,
+                                                              0xa, 0xfb, 0x2d, 0x6, 0xfb, 0x17, 0xfb, 0xb1,
+                                                              0x6d, 0xa, 0x64, 0x71, 0xa, 0xfb, 0x2e, 0x6,
+                                                              0xe, 0xf7, 0xbe, 0x76, 0xf7, 0xb1, 0x77, 0x1,
+                                                              0xb1, 0xf7, 0x8, 0xee, 0xf7, 0xa, 0x3, 0xf7,
+                                                              0x91, 0xf7, 0xa9, 0x15, 0xf7, 0xa, 0x6, 0xf7,
+                                                              0x53, 0x71, 0xa, 0xfb, 0x32, 0x6, 0xfc, 0x2,
+                                                              0xfb, 0xb1, 0x15, 0xf7, 0x8, 0x80, 0xa, 0xfb,
+                                                              0x33, 0x6, 0xe, 0xf7, 0xa9, 0xf7, 0xb1, 0x1,
+                                                              0xf7, 0xaf, 0xf7, 0xa9, 0x5a, 0xa, 0x65, 0x71,
+                                                              0xa, 0xfb, 0x2c, 0x6, 0xe, 0xf7, 0xbe, 0x76,
+                                                              0xf7, 0xb1, 0x77, 0x1, 0xf7, 0x24, 0xf7, 0xa,
+                                                              0x3, 0xf7, 0x24, 0xf7, 0xa9, 0x15, 0xf7, 0xa,
+                                                              0x6, 0xf7, 0x56, 0x71, 0xa, 0xfb, 0x35, 0x6,
+                                                              0xe, 0xfb, 0xd, 0x76, 0xf7, 0xae, 0x77, 0x1,
+                                                              0xf7, 0x24, 0xf7, 0xb, 0x3, 0xf7, 0x24, 0xfb,
+                                                              0x22, 0x15, 0xf7, 0xb, 0x80, 0xa, 0xfb, 0x34,
+                                                              0x6, 0xe, 0xf7, 0xbb, 0x76, 0xf7, 0xb4, 0x77,
+                                                              0x1, 0xf7, 0x62, 0xf7, 0x5, 0x3, 0xf7, 0x62,
+                                                              0xf7, 0xa6, 0x6d, 0xa, 0xd6, 0xf7, 0xb4, 0x5,
+                                                              0xfb, 0x20, 0x6, 0xe, 0x7f, 0xa, 0xf7, 0x2b,
+                                                              0xee, 0x3, 0x9c, 0x16, 0xf8, 0x2c, 0x3f, 0xa,
+                                                              0xfb, 0x56, 0x6, 0xac, 0xf7, 0x2b, 0x5, 0xc2,
+                                                              0xcd, 0xcc, 0xc7, 0xdf, 0x1b, 0xa4, 0x8d, 0x81,
+                                                              0x72, 0x8a, 0x1f, 0xed, 0x99, 0x5, 0xcb, 0x8b,
+                                                              0xbe, 0x22, 0x41, 0x40, 0x53, 0x63, 0x4e, 0x1e,
+                                                              0x98, 0xdc, 0x5, 0xfb, 0x6b, 0x87, 0xa, 0xf7,
+                                                              0x7, 0x6, 0x58, 0xfb, 0x8f, 0x83, 0xa, 0xe,
+                                                              0x79, 0xb8, 0xf6, 0xf7, 0x37, 0xf2, 0xba, 0xe3,
+                                                              0xb8, 0x1, 0x84, 0xba, 0xf7, 0xe5, 0xba, 0xf7,
+                                                              0x1d, 0xb9, 0x3, 0x84, 0xf7, 0x6e, 0x15, 0xfb,
+                                                              0x1a, 0xf5, 0x25, 0xf7, 0x24, 0xf7, 0x4c, 0xf7,
+                                                              0x48, 0xf7, 0x3b, 0xf7, 0x51, 0xf7, 0x1d, 0x25,
+                                                              0xf4, 0xfb, 0x25, 0xfb, 0x4f, 0xfb, 0x48, 0xfb,
+                                                              0x3f, 0xfb, 0x53, 0x1e, 0xba, 0x9e, 0x15, 0xf7,
+                                                              0x32, 0xf7, 0x34, 0xf7, 0x20, 0xf7, 0x2b, 0xf7,
+                                                              0x13, 0xde, 0x2e, 0xfb, 0xc, 0xfb, 0x31, 0xfb,
+                                                              0x34, 0xfb, 0x1e, 0xfb, 0x2a, 0xfb, 0x12, 0x36,
+                                                              0xe6, 0xf7, 0xb, 0x1e, 0xf7, 0x18, 0x24, 0x15,
+                                                              0xbb, 0x6, 0xa5, 0xf7, 0x8, 0x5, 0xbf, 0x6,
+                                                              0xa6, 0xfb, 0x8, 0x5, 0xc5, 0x6, 0x6e, 0xf7,
+                                                              0x13, 0x5, 0xb6, 0x95, 0xa6, 0xb4, 0xc4, 0x1a,
+                                                              0xcf, 0x53, 0x95, 0x4e, 0x1e, 0x41, 0x6, 0xa1,
+                                                              0xfb, 0x2a, 0x15, 0x9b, 0xf2, 0x5, 0xbb, 0x6,
+                                                              0xa8, 0xa8, 0x83, 0x6f, 0x55, 0x61, 0x7e, 0x6c,
+                                                              0x1f, 0xe, 0xf8, 0x75, 0xc6, 0xda, 0xc6, 0x1,
+                                                              0xf7, 0x57, 0xc9, 0xdf, 0xca, 0x3, 0xf7, 0x57,
+                                                              0xf8, 0xc5, 0x15, 0x5e, 0xad, 0x68, 0xbd, 0xcf,
+                                                              0xc4, 0xc4, 0xcb, 0xb6, 0x69, 0xac, 0x5a, 0x49,
+                                                              0x4f, 0x54, 0x4d, 0x1e, 0xc9, 0x96, 0x15, 0xa5,
+                                                              0xa3, 0xa0, 0xa6, 0x9f, 0x98, 0x7f, 0x7a, 0x71,
+                                                              0x76, 0x73, 0x6f, 0x76, 0x7d, 0x99, 0x9d, 0x1e,
+                                                              0xe, 0x7a, 0xe6, 0xf4, 0xd9, 0xa0, 0xf7, 0x49,
+                                                              0x2b, 0xeb, 0x12, 0xf7, 0x2, 0xe9, 0xf7, 0x76,
+                                                              0xed, 0x13, 0xdc, 0xa9, 0x7a, 0x15, 0xed, 0x6,
+                                                              0x93, 0xb2, 0x5, 0x76, 0xb5, 0xbe, 0x79, 0xc0,
+                                                              0x1b, 0xf7, 0x1e, 0xf7, 0x0, 0xab, 0xf7, 0x1,
+                                                              0xe8, 0x33, 0xab, 0x40, 0x93, 0x1f, 0xfb, 0x5,
+                                                              0x96, 0x5b, 0x97, 0xac, 0x1a, 0xb6, 0xef, 0x92,
+                                                              0xa2, 0xb6, 0xb7, 0x7c, 0x75, 0xab, 0x1e, 0x13,
+                                                              0xec, 0x81, 0x5b, 0x56, 0xa, 0xaf, 0xf7, 0x49,
+                                                              0x4e, 0xa, 0x85, 0x69, 0x5, 0x9a, 0x66, 0x5f,
+                                                              0x9e, 0x5c, 0x1b, 0xfb, 0x13, 0x26, 0x5b, 0x24,
+                                                              0x2b, 0xf7, 0xf, 0x70, 0xd4, 0x85, 0x1f, 0xad,
+                                                              0x88, 0xe5, 0x83, 0x57, 0x1a, 0x67, 0x3e, 0x85,
+                                                              0x52, 0x45, 0x5d, 0xa3, 0x9c, 0x71, 0x1e, 0x98,
+                                                              0xc8, 0x7b, 0xa, 0xe, 0x7a, 0xe0, 0xf7, 0x57,
+                                                              0xf7, 0x40, 0x1, 0xe8, 0xe4, 0xf7, 0x6c, 0xe6,
+                                                              0x3, 0xf7, 0xc1, 0xf8, 0x79, 0x15, 0xeb, 0x6,
+                                                              0xf7, 0x4d, 0xf7, 0x25, 0x58, 0xb0, 0xfb, 0x3d,
+                                                              0xfb, 0x0, 0xfb, 0x10, 0xf7, 0x0, 0x48, 0x67,
+                                                              0x5, 0xfb, 0x2e, 0xfd, 0x1c, 0x15, 0xe8, 0x6,
+                                                              0x93, 0xb1, 0x5, 0x7b, 0xb4, 0xc2, 0x75, 0xbf,
+                                                              0x1b, 0xf7, 0x24, 0xda, 0xc1, 0xe3, 0xdd, 0x4c,
+                                                              0xaf, 0x38, 0x92, 0x1f, 0x26, 0x93, 0x4f, 0x91,
+                                                              0xaf, 0x1a, 0xbf, 0xe5, 0x8b, 0xa2, 0xb4, 0xb9,
+                                                              0x73, 0x7a, 0xa9, 0x1e, 0x82, 0x5e, 0x5, 0xe9,
+                                                              0x6, 0xad, 0xf7, 0x40, 0x5, 0x2e, 0x6, 0x84,
+                                                              0x6b, 0x5, 0x98, 0x68, 0x5d, 0x9e, 0x5e, 0x1b,
+                                                              0x28, 0xfb, 0x4, 0x72, 0xfb, 0x3, 0x8a, 0x1f,
+                                                              0x2a, 0xf7, 0x9, 0x6b, 0xd0, 0x85, 0x1e, 0xac,
+                                                              0x88, 0xe1, 0x8f, 0x60, 0x1a, 0x6a, 0x4a, 0x73,
+                                                              0x55, 0x48, 0x57, 0xac, 0x94, 0x74, 0x1e, 0x95,
+                                                              0xc6, 0x5, 0x2d, 0x6, 0xe, 0xfb, 0x62, 0xce,
+                                                              0xf7, 0xe, 0xf7, 0x57, 0x81, 0xe2, 0xa4, 0xf7,
+                                                              0x47, 0x12, 0xf7, 0x2, 0xe8, 0x9f, 0xcd, 0xf7,
+                                                              0x26, 0xed, 0x13, 0xde, 0xa9, 0x7a, 0x15, 0xed,
+                                                              0x6, 0x93, 0xb3, 0xa4, 0x81, 0xa9, 0x7e, 0xab,
+                                                              0x84, 0x19, 0x6b, 0x26, 0x5, 0x8e, 0x94, 0x9d,
+                                                              0x8e, 0x9a, 0x1b, 0x93, 0x94, 0x85, 0x81, 0x80,
+                                                              0x7e, 0x81, 0x7e, 0x81, 0x7e, 0x8f, 0x94, 0x7c,
+                                                              0x1f, 0x62, 0x55, 0x5, 0x73, 0xa6, 0x9e, 0x89,
+                                                              0x9d, 0x1b, 0xc6, 0xc5, 0xb3, 0xd0, 0xa1, 0x85,
+                                                              0xab, 0x67, 0x93, 0x1f, 0x90, 0x9d, 0x5, 0xf7,
+                                                              0x2b, 0x8a, 0xe0, 0xc4, 0xe8, 0x1a, 0x13, 0xbe,
+                                                              0xe1, 0x49, 0xb1, 0x34, 0x92, 0x1e, 0x21, 0x93,
+                                                              0x4c, 0x92, 0xb0, 0x1a, 0xc2, 0xea, 0x8a, 0xa3,
+                                                              0xb6, 0xbb, 0x73, 0x79, 0xaa, 0x1e, 0x82, 0x5c,
+                                                              0x56, 0xa, 0xb0, 0xf7, 0x47, 0x4e, 0xa, 0x84,
+                                                              0x69, 0x5, 0x99, 0x66, 0x5b, 0x9f, 0x5c, 0x1b,
+                                                              0x23, 0xfb, 0xa, 0x72, 0xfb, 0x9, 0x8a, 0x1f,
+                                                              0x26, 0xf7, 0xe, 0x69, 0xd4, 0x85, 0x1e, 0xad,
+                                                              0x88, 0xe5, 0x8f, 0x5e, 0x1a, 0x68, 0x47, 0x72,
+                                                              0x53, 0x44, 0x55, 0xae, 0x94, 0x73, 0x1e, 0x13,
+                                                              0xde, 0x95, 0xc9, 0x4e, 0xa, 0xe, 0x45, 0xe9,
+                                                              0xf8, 0x62, 0xe8, 0x1, 0xcc, 0xf2, 0xf7, 0x9b,
+                                                              0xf1, 0x3, 0xa6, 0x45, 0x15, 0xf7, 0x82, 0x6,
+                                                              0xe6, 0xe7, 0xa7, 0xdf, 0xa8, 0x85, 0x9d, 0x7c,
+                                                              0x9c, 0x1f, 0xad, 0x95, 0xc1, 0xbe, 0xc5, 0x1a,
+                                                              0x8a, 0xa6, 0x7d, 0xa3, 0x74, 0x9d, 0xfb, 0x6c,
+                                                              0xf7, 0x41, 0x18, 0x8b, 0x88, 0x8e, 0x8f, 0x1a,
+                                                              0x96, 0x9c, 0x8c, 0x91, 0x1e, 0xf7, 0x3c, 0x6,
+                                                              0x79, 0x35, 0x5, 0xf1, 0x6, 0xb2, 0xf7, 0x48,
+                                                              0xfb, 0x88, 0x8a, 0x5, 0x32, 0x37, 0x76, 0x38,
+                                                              0x6f, 0x96, 0x75, 0x9d, 0x78, 0x1f, 0x56, 0x76,
+                                                              0x68, 0x60, 0x5c, 0x1a, 0x6b, 0x9d, 0x68, 0xb2,
+                                                              0x6c, 0x1e, 0xf7, 0x42, 0xfb, 0x1e, 0x5, 0x9c,
+                                                              0x7d, 0x8d, 0x88, 0x83, 0x1a, 0x82, 0x7b, 0x8a,
+                                                              0x87, 0x1e, 0xfb, 0x45, 0x6, 0x9e, 0xe3, 0x5,
+                                                              0x24, 0x6, 0xf7, 0xb7, 0xc3, 0x15, 0xfb, 0x1f,
+                                                              0xf7, 0x1, 0x5, 0x82, 0x92, 0x87, 0x97, 0x97,
+                                                              0x1a, 0xa0, 0xab, 0x95, 0x99, 0x92, 0x1e, 0xf7,
+                                                              0x30, 0xfb, 0xd, 0x5, 0x92, 0x86, 0x8d, 0x83,
+                                                              0x82, 0x1a, 0x71, 0x61, 0x84, 0x7a, 0x89, 0x1e,
+                                                              0xe, 0x31, 0x76, 0xf7, 0xfc, 0xf7, 0x44, 0x1,
+                                                              0xf7, 0xa5, 0xf7, 0x6d, 0x3, 0xf7, 0xa5, 0xf7,
+                                                              0xd6, 0x15, 0x6e, 0x9f, 0x5f, 0xd3, 0xce, 0xc5,
+                                                              0xbc, 0xc6, 0xae, 0x6e, 0xac, 0x4e, 0x45, 0x52,
+                                                              0x58, 0x57, 0x1e, 0xfb, 0x38, 0xfc, 0x45, 0x15,
+                                                              0xf7, 0x12, 0x6, 0xf7, 0x5d, 0xf7, 0xac, 0x5,
+                                                              0xfb, 0x3b, 0x6, 0xe, 0xa0, 0x76, 0xf8, 0x39,
+                                                              0xf7, 0x48, 0x1, 0xf4, 0xf5, 0x3, 0xf4, 0x16,
+                                                              0xf5, 0x6, 0xf7, 0xcc, 0xf8, 0xa9, 0x99, 0xcf,
+                                                              0x5, 0xfc, 0x4a, 0x6, 0x66, 0xfb, 0x48, 0x56,
+                                                              0xa, 0x9d, 0xe2, 0x5, 0xf7, 0x80, 0x6, 0xe,
+                                                              0x7c, 0xe6, 0xf7, 0x74, 0xe8, 0xf7, 0x1e, 0xdf,
+                                                              0x8a, 0x77, 0x12, 0xf8, 0x3, 0xed, 0x13, 0xe8,
+                                                              0xf7, 0x48, 0xf7, 0xfb, 0x15, 0xf7, 0x19, 0xda,
+                                                              0xf7, 0x6, 0xb2, 0xf7, 0x33, 0x1b, 0x13, 0xd8,
+                                                              0xa5, 0xde, 0x5, 0x13, 0xe8, 0x75, 0x69, 0x8c,
+                                                              0x5b, 0x1b, 0xfb, 0x5d, 0x8c, 0xfb, 0x67, 0xfb,
+                                                              0x50, 0xfb, 0x89, 0x1a, 0x20, 0xd3, 0x30, 0xf7,
+                                                              0xc, 0xf7, 0x7, 0xf7, 0x8, 0xf7, 0x7, 0xf7,
+                                                              0x8, 0xe3, 0x5b, 0xe4, 0xfb, 0x6, 0x56, 0x73,
+                                                              0x7f, 0x75, 0x5d, 0x1e, 0x65, 0xfb, 0x1c, 0x15,
+                                                              0x8b, 0xc0, 0xd8, 0xdf, 0xd3, 0x9b, 0x53, 0x60,
+                                                              0x40, 0x46, 0x59, 0x51, 0x41, 0x65, 0xe0, 0xc9,
+                                                              0x99, 0x1e, 0xe, 0xf9, 0x6, 0x77, 0x1, 0xab,
+                                                              0xf8, 0x69, 0x3, 0xab, 0x5d, 0x15, 0xcb, 0x6c,
+                                                              0xf8, 0x6b, 0xf9, 0x32, 0x49, 0xac, 0x5, 0xe,
+                                                              0xe, 0x84, 0x76, 0xb0, 0x76, 0xf7, 0xaa, 0xe8,
+                                                              0xf7, 0x33, 0xe8, 0x12, 0xf7, 0x21, 0xea, 0x36,
+                                                              0xed, 0x13, 0xb8, 0x52, 0xa, 0x13, 0x74, 0x3d,
+                                                              0xa, 0x7b, 0x7d, 0x87, 0x81, 0x7e, 0x1f, 0xb6,
+                                                              0xc1, 0xa0, 0xbb, 0xd1, 0x1a, 0xf7, 0x69, 0x89,
+                                                              0xa, 0xfb, 0x84, 0x6, 0x13, 0xb8, 0x86, 0x9b,
+                                                              0x8a, 0x9b, 0x9a, 0x1a, 0xcb, 0xc9, 0x47, 0xa,
+                                                              0x21, 0x3e, 0xfb, 0x10, 0x7a, 0x89, 0x7a, 0x8d,
+                                                              0x7a, 0x1f, 0x3b, 0x82, 0xa, 0x13, 0xb4, 0xf7,
+                                                              0x1, 0x6, 0x8a, 0x2e, 0x59, 0x33, 0x43, 0x5a,
+                                                              0x8, 0xe, 0x7c, 0xe7, 0xf7, 0x96, 0xe8, 0xf7,
+                                                              0x1a, 0x77, 0x1, 0xf4, 0xf7, 0xe3, 0x15, 0xd1,
+                                                              0x6, 0x62, 0x98, 0xa, 0x88, 0x7b, 0x89, 0x7e,
+                                                              0x7e, 0x1a, 0x29, 0xe9, 0x7b, 0xcf, 0xe0, 0xe6,
+                                                              0xab, 0xa6, 0xda, 0x1e, 0x8e, 0xe7, 0x5, 0x7c,
+                                                              0x5f, 0xfb, 0xc, 0x5f, 0x43, 0x1b, 0x53, 0x76,
+                                                              0x9f, 0xa4, 0x98, 0x8d, 0x99, 0x8e, 0x99, 0x1f,
+                                                              0xb2, 0xf7, 0x40, 0x5, 0xf7, 0x91, 0x89, 0xa,
+                                                              0xfb, 0x93, 0x6, 0xa9, 0xf7, 0x1a, 0x5, 0x23,
+                                                              0x6, 0x6f, 0xfb, 0x1a, 0x5, 0x44, 0x6, 0xe,
+                                                              0xfb, 0x22, 0xe4, 0xd5, 0xe4, 0xf7, 0xa6, 0xe5,
+                                                              0xca, 0xe4, 0x1, 0xd5, 0xe9, 0xf7, 0xfd, 0xed,
+                                                              0x3, 0x85, 0x56, 0x15, 0x77, 0x32, 0x5, 0xf7,
+                                                              0xd7, 0x6, 0x9e, 0xe4, 0x85, 0xa, 0xa9, 0xf7,
+                                                              0x18, 0x5, 0x7c, 0x9c, 0xb7, 0x60, 0xdb, 0x1b,
+                                                              0xf7, 0x2d, 0xf7, 0x1b, 0xf7, 0x13, 0xf7, 0x24,
+                                                              0xf7, 0xa, 0xfb, 0x1, 0xbf, 0x30, 0x55, 0x52,
+                                                              0x84, 0x6c, 0x5c, 0x1f, 0xb6, 0xf7, 0x5e, 0x5,
+                                                              0xfb, 0x45, 0x6, 0x78, 0x32, 0x5, 0xdd, 0x6,
+                                                              0xfb, 0x10, 0xfc, 0xe2, 0x5, 0xf7, 0x2e, 0xf7,
+                                                              0xa3, 0x15, 0xf7, 0x13, 0xf7, 0x10, 0xa6, 0xc3,
+                                                              0xce, 0xc1, 0x67, 0x49, 0x2f, 0x2e, 0x47, 0x36,
+                                                              0x64, 0x38, 0xa6, 0xdc, 0x8a, 0x1e, 0xe, 0x7c,
+                                                              0xe8, 0xf7, 0x2b, 0xe9, 0xf7, 0x5b, 0xe9, 0x12,
+                                                              0xf8, 0x3c, 0xef, 0x3f, 0xf0, 0x13, 0xf0, 0xbd,
+                                                              0xb3, 0x15, 0x79, 0xba, 0xd0, 0x66, 0xee, 0x1b,
+                                                              0xf7, 0x0, 0xf7, 0x2b, 0xc6, 0xf7, 0x31, 0xcb,
+                                                              0x6b, 0xa7, 0x66, 0xa9, 0x1f, 0x13, 0xe8, 0xb2,
+                                                              0x9f, 0xc2, 0xc8, 0xd4, 0x1a, 0xe0, 0x44, 0xc1,
+                                                              0x2b, 0x3f, 0x47, 0x68, 0x65, 0x47, 0x1e, 0xac,
+                                                              0x42, 0x5, 0xb2, 0xdb, 0xb1, 0x98, 0xb6, 0x1b,
+                                                              0xaf, 0xbb, 0x7c, 0x60, 0x29, 0xfb, 0xc, 0x5f,
+                                                              0x50, 0x8c, 0x1f, 0x78, 0x2d, 0x5, 0x13, 0xf0,
+                                                              0xdd, 0xe7, 0xaa, 0x50, 0x3f, 0x3b, 0x5c, 0x44,
+                                                              0x57, 0x6d, 0x95, 0xab, 0x34, 0x1f, 0xe, 0x5e,
+                                                              0xc4, 0x58, 0x76, 0xf7, 0x9, 0xca, 0xf7, 0x3d,
+                                                              0xce, 0xe6, 0xcb, 0x4b, 0xf7, 0x57, 0x49, 0x77,
+                                                              0xf4, 0x77, 0x12, 0x13, 0xbb, 0xf7, 0x98, 0xc4,
+                                                              0x15, 0xf7, 0x19, 0x6, 0x82, 0x5e, 0x5, 0x52,
+                                                              0x6, 0x80, 0x52, 0x5, 0xf7, 0x39, 0x6, 0x96,
+                                                              0xc4, 0x5, 0x62, 0x6, 0x93, 0xb8, 0x5, 0xb5,
+                                                              0x6, 0x97, 0xca, 0x5, 0x62, 0x6, 0xae, 0xf7,
+                                                              0x46, 0x5, 0x4a, 0x6, 0xfb, 0x41, 0x98, 0xa,
+                                                              0xdc, 0x9b, 0x15, 0xd0, 0xda, 0x7d, 0x3c, 0x5,
+                                                              0xfc, 0x56, 0xfb, 0x12, 0x15, 0x13, 0x7b, 0xc6,
+                                                              0x55, 0xf9, 0xb, 0xf9, 0x34, 0x4d, 0xbc, 0x5,
+                                                              0xfc, 0xfd, 0xfb, 0xe6, 0x15, 0x71, 0xbc, 0xaa,
+                                                              0x83, 0xad, 0x1b, 0xdf, 0xce, 0xc7, 0xd2, 0x1f,
+                                                              0x8c, 0xa4, 0x82, 0xa3, 0x79, 0x9c, 0x8, 0x9b,
+                                                              0x95, 0xa0, 0xaf, 0xa9, 0x1a, 0x13, 0xb4, 0xba,
+                                                              0x6b, 0xac, 0x51, 0x5f, 0x61, 0x77, 0x72, 0x64,
+                                                              0x1e, 0xa5, 0x51, 0x5, 0x13, 0xbb, 0x9b, 0xa7,
+                                                              0xad, 0xa0, 0xa9, 0x1b, 0x98, 0x9a, 0x86, 0x78,
+                                                              0x6e, 0x71, 0x7f, 0x73, 0x1f, 0x5c, 0x8c, 0x7e,
+                                                              0x4a, 0x5, 0xc3, 0x6, 0xac, 0x96, 0x7a, 0x78,
+                                                              0x6d, 0x70, 0x72, 0x67, 0x65, 0x70, 0x9a, 0x9a,
+                                                              0x6e, 0x1f, 0xe, 0xf7, 0x72, 0xd6, 0xf0, 0xd4,
+                                                              0xf7, 0x25, 0x77, 0x1, 0xf8, 0x5, 0xdd, 0x3,
+                                                              0xf7, 0x1a, 0xf7, 0x98, 0x15, 0x6f, 0xc5, 0xb0,
+                                                              0x81, 0xb4, 0x1b, 0xe8, 0xe3, 0xcc, 0xd8, 0x1f,
+                                                              0x8d, 0xa9, 0x81, 0xa7, 0x74, 0x9e, 0x8, 0x9f,
+                                                              0x97, 0xa5, 0xb3, 0xae, 0x1a, 0xbe, 0x62, 0xb0,
+                                                              0x46, 0x57, 0x5a, 0x74, 0x6f, 0x5a, 0x1e, 0xaa,
+                                                              0x4b, 0x5, 0x9d, 0xad, 0xb3, 0xa2, 0xb0, 0x1b,
+                                                              0x99, 0x9e, 0x84, 0x79, 0x8c, 0x1f, 0x69, 0x69,
+                                                              0x7f, 0x6b, 0x1e, 0x58, 0x6, 0x7c, 0x42, 0x5,
+                                                              0xcd, 0x6, 0xb2, 0x99, 0x79, 0x76, 0x68, 0x69,
+                                                              0x70, 0x62, 0x1f, 0x89, 0x6, 0x60, 0x69, 0x9c,
+                                                              0x9b, 0x69, 0x1f, 0xe, 0xf8, 0x84, 0xdb, 0x1,
+                                                              0xda, 0xf8, 0x4e, 0x3, 0xda, 0xf8, 0x99, 0x15,
+                                                              0xd8, 0x73, 0x5, 0xa1, 0x9d, 0x9e, 0xb5, 0xae,
+                                                              0x1b, 0xa0, 0x9f, 0x7d, 0x7b, 0xa0, 0x1f, 0x7c,
+                                                              0xa0, 0xa2, 0x7b, 0xa4, 0x1b, 0xec, 0xbb, 0xdf,
+                                                              0xad, 0x9c, 0x1f, 0x3e, 0xa1, 0x5, 0x63, 0x71,
+                                                              0x7f, 0x77, 0x6f, 0x1b, 0x78, 0x78, 0x96, 0x98,
+                                                              0x77, 0x1f, 0x9b, 0x72, 0x71, 0x9d, 0x6f, 0x1b,
+                                                              0x2e, 0x5f, 0x40, 0x61, 0x72, 0x1f, 0xe, 0xf8,
+                                                              0x95, 0xbc, 0x12, 0xad, 0xbf, 0xf7, 0x14, 0xbe,
+                                                              0xf7, 0x43, 0xcb, 0x6e, 0xbe, 0x13, 0xf0, 0xf7,
+                                                              0x6a, 0xf7, 0x7a, 0x15, 0xbe, 0x6, 0xc8, 0xf7,
+                                                              0xc0, 0x98, 0xfb, 0xc0, 0x5, 0xcd, 0x6, 0xf7,
+                                                              0x16, 0xf7, 0xbf, 0x5, 0x13, 0xe8, 0x4f, 0xfb,
+                                                              0xbf, 0x5, 0xbe, 0x6, 0xcf, 0xf7, 0xe0, 0x7a,
+                                                              0xa, 0xfb, 0x5, 0xfb, 0xa1, 0x82, 0xf7, 0xa1,
+                                                              0x5, 0x2e, 0x6, 0xfb, 0x8d, 0xfb, 0xe0, 0x15,
+                                                              0xbf, 0x6, 0xc4, 0xf7, 0xaf, 0x5, 0xe3, 0x6,
+                                                              0x96, 0xbc, 0x5, 0xfb, 0x77, 0x6, 0x81, 0x5a,
+                                                              0x5, 0xe2, 0x6, 0xe, 0xe9, 0x77, 0xf8, 0x55,
+                                                              0xe8, 0x1, 0xf7, 0x1e, 0xee, 0xf7, 0x7a, 0xee,
+                                                              0x3, 0xad, 0x16, 0xf8, 0x49, 0x6, 0xad, 0xf7,
+                                                              0x35, 0x5, 0x2d, 0x6, 0x7d, 0x48, 0x5, 0xfb,
+                                                              0x4e, 0x6, 0xf7, 0x2e, 0xf7, 0x5, 0x5, 0xf7,
+                                                              0x0, 0xda, 0xe8, 0xc9, 0xf7, 0xe, 0x1a, 0xdb,
+                                                              0x51, 0xcd, 0xfb, 0xd, 0x39, 0x45, 0x77, 0x36,
+                                                              0x3c, 0x1e, 0x79, 0x33, 0x5, 0xee, 0x6, 0xf1,
+                                                              0x9b, 0xf6, 0x89, 0x91, 0x1b, 0xc1, 0xba, 0x6f,
+                                                              0x57, 0x53, 0x6c, 0x6a, 0x45, 0x57, 0x1f, 0xfb,
+                                                              0xd1, 0xfb, 0x74, 0x5, 0xe, 0xf7, 0x70, 0xd6,
+                                                              0xf7, 0x88, 0xd8, 0x1, 0xf7, 0x50, 0xde, 0xf7,
+                                                              0xc, 0xde, 0x3, 0xf7, 0x11, 0xf7, 0x70, 0x15,
+                                                              0xf7, 0xb8, 0x6, 0x9b, 0xd6, 0x5, 0xfb, 0x38,
+                                                              0x6, 0xf7, 0x14, 0xea, 0x5, 0xae, 0xa3, 0xb5,
+                                                              0xba, 0xbe, 0x1a, 0xb4, 0x75, 0xca, 0x2b, 0x55,
+                                                              0x55, 0x72, 0x62, 0x5f, 0x1e, 0x7b, 0x3b, 0x5,
+                                                              0xde, 0x6, 0x8e, 0x96, 0x5, 0x9c, 0x8f, 0x94,
+                                                              0xb4, 0xc0, 0x1b, 0xa1, 0xa8, 0x85, 0x6f, 0x71,
+                                                              0x80, 0x78, 0x71, 0x79, 0x1f, 0xfb, 0x6c, 0xfb,
+                                                              0x27, 0x5, 0xe, 0x7c, 0xe8, 0x3a, 0xea, 0xf7,
+                                                              0x90, 0xea, 0x12, 0x13, 0xa0, 0xb2, 0xf7, 0xec,
+                                                              0x15, 0xdc, 0x6, 0x67, 0xfb, 0x4d, 0x5, 0x85,
+                                                              0x74, 0x89, 0x76, 0x79, 0x1a, 0x37, 0xd0, 0x6f,
+                                                              0xde, 0xbe, 0xc0, 0xa7, 0xa5, 0xb7, 0x1e, 0x13,
+                                                              0x60, 0x81, 0x61, 0x5, 0xf7, 0x43, 0x6, 0x9e,
+                                                              0xea, 0x5, 0x3b, 0x6, 0xd0, 0xf7, 0xef, 0x8f,
+                                                              0xa, 0x6, 0x78, 0x2c, 0x5, 0xda, 0x6, 0x65,
+                                                              0x98, 0xa, 0x13, 0xa0, 0x6b, 0x63, 0x5b, 0x63,
+                                                              0x4d, 0x1b, 0x54, 0x7a, 0xa4, 0xa2, 0x97, 0x8c,
+                                                              0x96, 0x8c, 0x93, 0x1f, 0xc3, 0xf7, 0xae, 0x43,
+                                                              0xa, 0x67, 0xa, 0xf7, 0x78, 0xf8, 0x75, 0x15,
+                                                              0xf7, 0xe9, 0xd9, 0x76, 0xf1, 0xfb, 0xde, 0xfb,
+                                                              0xb, 0x5, 0xfb, 0x47, 0xfb, 0x53, 0x15, 0xdc,
+                                                              0x6, 0x67, 0xfb, 0x5b, 0x5, 0x8a, 0x78, 0x84,
+                                                              0x26, 0xa, 0x57, 0xa, 0xf7, 0x6b, 0x77, 0x12,
+                                                              0x13, 0xb0, 0xf7, 0x52, 0xf8, 0x70, 0x15, 0xf7,
+                                                              0x44, 0xf7, 0x0, 0xf7, 0x14, 0xfb, 0x0, 0xcc,
+                                                              0xb0, 0xfb, 0x16, 0xf7, 0x24, 0x4e, 0xa, 0xfb,
+                                                              0x57, 0xfb, 0x23, 0x5, 0x2a, 0xfb, 0x37, 0x27,
+                                                              0xa, 0x57, 0xa, 0xc6, 0xf7, 0x10, 0x12, 0x13,
+                                                              0xb0, 0xf8, 0xe, 0xf8, 0x89, 0x92, 0xa, 0xa3,
+                                                              0xf7, 0x10, 0x86, 0xa, 0xfb, 0x62, 0xfb, 0x10,
+                                                              0x92, 0xa, 0xa4, 0xf7, 0x10, 0x4c, 0xa, 0xfb,
+                                                              0x4b, 0xfb, 0xa6, 0x27, 0xa, 0x67, 0xa, 0xf7,
+                                                              0x5d, 0xf8, 0xc6, 0x15, 0xf7, 0xbf, 0x3b, 0xae,
+                                                              0xc6, 0xfb, 0xa3, 0xf7, 0xc, 0x5, 0xfb, 0x75,
+                                                              0xfb, 0xca, 0x27, 0xa, 0xfb, 0x11, 0xbd, 0x1,
+                                                              0x90, 0x40, 0x15, 0x81, 0x59, 0x5, 0xf8, 0xed,
+                                                              0x6, 0x95, 0xbd, 0x5, 0xe, 0xa0, 0x76, 0xf7,
+                                                              0xed, 0xe9, 0x1, 0xf7, 0x4d, 0xdb, 0x3, 0xf7,
+                                                              0x4d, 0x16, 0xdb, 0x6, 0xf7, 0x87, 0xf7, 0xed,
+                                                              0x5, 0xe0, 0x3f, 0xa, 0xfb, 0x87, 0x87, 0xa,
+                                                              0xc7, 0x6, 0xfb, 0x34, 0xfb, 0x82, 0x44, 0xf7,
+                                                              0x82, 0x5, 0xce, 0x55, 0xa, 0xfb, 0x98, 0x44,
+                                                              0xa, 0xe1, 0x6, 0xe, 0xa0, 0x76, 0xf7, 0xed,
+                                                              0xe9, 0x1, 0xf7, 0x24, 0x16, 0xf7, 0x9, 0xf7,
+                                                              0x67, 0xb8, 0xfb, 0x67, 0x5, 0xd7, 0x6, 0xf7,
+                                                              0x47, 0xf7, 0xed, 0x5, 0xbc, 0x3f, 0xa, 0xfb,
+                                                              0x67, 0x44, 0xa, 0xd2, 0x6, 0x2b, 0xfb, 0x4d,
+                                                              0x5f, 0xf7, 0x65, 0x5, 0x48, 0x6, 0xfb, 0xc,
+                                                              0xfb, 0x65, 0x72, 0xf7, 0x4d, 0x5, 0xd1, 0x55,
+                                                              0xa, 0xfb, 0x6e, 0x44, 0xa, 0xbc, 0x6, 0xb8,
+                                                              0xfb, 0xed, 0x5, 0xe, 0x7f, 0xa, 0xd6, 0xf7,
+                                                              0x15, 0xf7, 0x39, 0xf7, 0x1a, 0x3, 0x6b, 0x16,
+                                                              0xf7, 0x8b, 0x55, 0xa, 0x6c, 0x6, 0xe7, 0xce,
+                                                              0xd4, 0x48, 0x5, 0x6f, 0x6f, 0xa, 0xf7, 0x8c,
+                                                              0x3f, 0xa, 0x36, 0x6, 0xfb, 0x17, 0xf7, 0x11,
+                                                              0xf7, 0x30, 0xf7, 0x12, 0x5, 0xe0, 0x3f, 0xa,
+                                                              0xfb, 0x79, 0x44, 0xa, 0x9d, 0x6, 0x3a, 0x48,
+                                                              0x5c, 0xce, 0x5, 0xa0, 0x3f, 0xa, 0xfb, 0x85,
+                                                              0x44, 0xa, 0xe2, 0x6, 0xef, 0xfb, 0x14, 0xfb,
+                                                              0x3a, 0xfb, 0xf, 0x5, 0x33, 0x6, 0xe, 0xfb,
+                                                              0x22, 0xe3, 0xf8, 0x29, 0xe3, 0x1, 0xe3, 0xf7,
+                                                              0x3, 0xf7, 0x8f, 0xf7, 0x1, 0x3, 0x67, 0x55,
+                                                              0x15, 0x76, 0x33, 0x5, 0xf7, 0xc0, 0x6, 0xa0,
+                                                              0xe3, 0x5, 0x45, 0x6, 0xf8, 0x1, 0xf8, 0x29,
+                                                              0x5c, 0xa, 0x9f, 0xe3, 0x5, 0xfb, 0x7f, 0x6,
+                                                              0x77, 0x33, 0x5, 0xbb, 0x6, 0xfb, 0x3c, 0xfb,
+                                                              0x4d, 0x38, 0xf7, 0x4d, 0x5, 0xbd, 0x6, 0x9f,
+                                                              0xe3, 0x5, 0xfb, 0x83, 0x6, 0x77, 0x33, 0x5c,
+                                                              0xa, 0xf7, 0xb, 0xfb, 0xa0, 0xfb, 0x11, 0xfb,
+                                                              0x1d, 0x5, 0xe, 0xfb, 0x22, 0xe2, 0xf8, 0x25,
+                                                              0xe3, 0x1, 0xe2, 0xf7, 0x4, 0xf7, 0x8e, 0xf7,
+                                                              0x2, 0x3, 0xf7, 0x8c, 0xf8, 0x7f, 0x15, 0xf7,
+                                                              0xec, 0xd4, 0x76, 0xec, 0xfb, 0xe2, 0xfb, 0x6,
+                                                              0x5, 0xfb, 0xa5, 0xfc, 0xee, 0x6b, 0xa, 0xf8,
+                                                              0x1, 0xf8, 0x25, 0x5, 0xd9, 0x84, 0xa, 0xfb,
+                                                              0x80, 0x6, 0x77, 0x34, 0x5, 0xbb, 0x6, 0xfb,
+                                                              0x40, 0xfb, 0x4a, 0x4d, 0xa, 0xfb, 0x9d, 0xfb,
+                                                              0xe, 0xfb, 0x1d, 0x5, 0xe, 0xfb, 0x22, 0xe2,
+                                                              0xf8, 0x26, 0xe2, 0xd4, 0xf7, 0xa, 0x1, 0xe2,
+                                                              0xf7, 0x4, 0xf7, 0x8f, 0xf7, 0x2, 0x3, 0xf8,
+                                                              0x24, 0xf8, 0x8f, 0x15, 0xf7, 0x9, 0x6, 0xa4,
+                                                              0xf7, 0xa, 0x5, 0xfb, 0x8, 0x6, 0xfb, 0x6b,
+                                                              0xfb, 0xa, 0x15, 0xf7, 0x8, 0x6, 0xa5, 0xf7,
+                                                              0xa, 0x5, 0xfb, 0x8, 0x6, 0xfb, 0xa5, 0xfd,
+                                                              0x3c, 0x6b, 0xa, 0xf8, 0x2, 0xf8, 0x26, 0x5,
+                                                              0xd8, 0x84, 0xa, 0xfb, 0x7f, 0x6, 0x77, 0x34,
+                                                              0x5, 0xbb, 0x6, 0xfb, 0x41, 0xfb, 0x4b, 0x4d,
+                                                              0xa, 0xfb, 0x9e, 0xfb, 0xe, 0xfb, 0x1c, 0x5,
+                                                              0xe, 0x8b, 0xe2, 0xbe, 0xbd, 0xc3, 0xbc, 0xf7,
+                                                              0x4a, 0xe2, 0x1, 0xa3, 0x16, 0xf7, 0xdb, 0x6,
+                                                              0x9e, 0xe2, 0x5, 0xfb, 0xa, 0x6, 0x97, 0xbe,
+                                                              0x70, 0xa, 0x95, 0xbd, 0x5, 0xfb, 0x29, 0x6,
+                                                              0x9a, 0xc3, 0x70, 0xa, 0x97, 0xbc, 0x5, 0xfb,
+                                                              0x22, 0x6, 0xf7, 0x5f, 0xf7, 0x4a, 0x5c, 0xa,
+                                                              0x9e, 0xe2, 0x5, 0xfb, 0x83, 0x6, 0x77, 0x34,
+                                                              0x5, 0xb8, 0x6, 0xfb, 0x11, 0xfb, 0x8, 0x41,
+                                                              0xf7, 0x8, 0x5, 0xb9, 0x6, 0x9e, 0xe2, 0x5,
+                                                              0xfb, 0x88, 0x6, 0x78, 0x34, 0x5, 0xdd, 0x6,
+                                                              0xf7, 0x10, 0xfb, 0x4a, 0x5, 0xfb, 0x26, 0x6,
+                                                              0x81, 0x5a, 0x70, 0xa, 0x7c, 0x53, 0x85, 0xa,
+                                                              0x82, 0x59, 0x70, 0xa, 0x7f, 0x58, 0x83, 0xa,
+                                                              0xe, 0x8b, 0xe9, 0xf7, 0x90, 0xe8, 0x1, 0xf2,
+                                                              0xed, 0xf7, 0x6c, 0xed, 0x3, 0xad, 0x16, 0xf8,
+                                                              0x4e, 0x6, 0xb2, 0xf7, 0x50, 0x5, 0x29, 0x44,
+                                                              0xa, 0xfb, 0x55, 0x6, 0xf7, 0xef, 0xf7, 0xa9,
+                                                              0x99, 0xcf, 0x5, 0xfc, 0x3f, 0x6, 0x67, 0xfb,
+                                                              0x46, 0x56, 0xa, 0x9c, 0xe0, 0x5, 0xf7, 0x43,
+                                                              0x6, 0xfb, 0xec, 0xfb, 0xa6, 0x5, 0xe, 0x8b,
+                                                              0xe6, 0xf7, 0x89, 0xe5, 0xc7, 0xd5, 0x1, 0xe8,
+                                                              0xea, 0xf7, 0x5d, 0xe9, 0x3, 0xf7, 0xb9, 0xf8,
+                                                              0x7a, 0x15, 0xec, 0x6, 0xf7, 0x4d, 0xf7, 0x24,
+                                                              0x58, 0xb0, 0xfb, 0x3f, 0x20, 0xfb, 0xf, 0xf6,
+                                                              0x46, 0x67, 0x5, 0xfb, 0x1d, 0xfd, 0xb, 0x15,
+                                                              0xf8, 0x3d, 0x6, 0xad, 0xf7, 0x3c, 0x5, 0x2d,
+                                                              0x6, 0x7a, 0x3e, 0x5, 0xfb, 0x49, 0x6, 0xf7,
+                                                              0xde, 0xf7, 0xa2, 0x98, 0xcc, 0x5, 0xfc, 0x2d,
+                                                              0x6, 0x6b, 0xfb, 0x2d, 0x5, 0xea, 0x6, 0x98,
+                                                              0xca, 0x5, 0xf7, 0x3a, 0x6, 0xfb, 0xdd, 0xfb,
+                                                              0x9e, 0x5, 0xe, 0x7c, 0xe9, 0xf8, 0x4f, 0xe9,
+                                                              0x1, 0xd3, 0xec, 0xf7, 0x9b, 0xeb, 0x3, 0xd3,
+                                                              0xf7, 0x50, 0x15, 0x2b, 0xa9, 0x20, 0xf7, 0x1b,
+                                                              0xf7, 0x91, 0xb1, 0xf7, 0xe3, 0xf7, 0xd, 0xe5,
+                                                              0x61, 0xe0, 0xfb, 0xc, 0xfb, 0x88, 0x59, 0xfb,
+                                                              0xd2, 0xfb, 0x2, 0x1e, 0xec, 0x9d, 0x15, 0xf7,
+                                                              0x10, 0xd1, 0xf7, 0x54, 0xf5, 0xee, 0x7f, 0x31,
+                                                              0x56, 0x3e, 0x58, 0xfb, 0x73, 0xfb, 0xe, 0x3b,
+                                                              0x81, 0xca, 0xcb, 0x1e, 0xe, 0x79, 0x9d, 0xf8,
+                                                              0x4b, 0x9f, 0xf6, 0x99, 0x9f, 0x9f, 0x6, 0xfb,
+                                                              0x26, 0x8f, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff,
+                                                              0xc, 0x9, 0xe8, 0xa, 0xe8, 0xb, 0x8c, 0xc,
+                                                              0xe, 0xf8, 0xec, 0x14, 0xac, 0x13, 0x0, 0x79,
+                                                              0x2, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x4d, 0x0,
+                                                              0x89, 0x0, 0x8d, 0x0, 0xcb, 0x1, 0x15, 0x1,
+                                                              0x51, 0x1, 0x5d, 0x1, 0x65, 0x1, 0x6c, 0x1,
+                                                              0x94, 0x1, 0xb0, 0x1, 0xc5, 0x1, 0xdd, 0x1,
+                                                              0xf8, 0x2, 0x16, 0x2, 0x2e, 0x2, 0x3b, 0x2,
+                                                              0x44, 0x2, 0x59, 0x2, 0x5e, 0x2, 0x72, 0x2,
+                                                              0x77, 0x2, 0x7c, 0x2, 0x93, 0x2, 0xba, 0x2,
+                                                              0xc1, 0x2, 0xcb, 0x2, 0xd0, 0x2, 0xf2, 0x2,
+                                                              0xf7, 0x2, 0xfc, 0x3, 0x4, 0x3, 0xd, 0x3,
+                                                              0x12, 0x3, 0x15, 0x3, 0x1a, 0x3, 0x22, 0x3,
+                                                              0x27, 0x3, 0x3c, 0x3, 0x49, 0x3, 0x55, 0x3,
+                                                              0x5c, 0x3, 0x61, 0x3, 0x66, 0x3, 0x77, 0x3,
+                                                              0x7b, 0x3, 0x8e, 0x3, 0x9b, 0x3, 0xae, 0x3,
+                                                              0xc1, 0x3, 0xcc, 0x3, 0xd7, 0x3, 0xdc, 0x3,
+                                                              0xe0, 0x3, 0xe8, 0x3, 0xf0, 0x3, 0xf8, 0x3,
+                                                              0xfd, 0x4, 0x2, 0x4, 0x6, 0x4, 0xe, 0x4,
+                                                              0x16, 0x4, 0x1e, 0x4, 0x27, 0x4, 0x2e, 0x4,
+                                                              0x34, 0x4, 0x3a, 0x4, 0x40, 0x4, 0x45, 0x4,
+                                                              0x49, 0x4, 0x52, 0x4, 0x5a, 0x4, 0x66, 0x4,
+                                                              0x74, 0x4, 0x7f, 0x4, 0x8a, 0x4, 0x8f, 0x4,
+                                                              0x94, 0x4, 0x99, 0x4, 0x9e, 0x4, 0xa2, 0x4,
+                                                              0xa9, 0x4, 0xb5, 0x4, 0xba, 0x4, 0xc0, 0x4,
+                                                              0xc6, 0x4, 0xcc, 0x4, 0xd2, 0x4, 0xd8, 0x4,
+                                                              0xdc, 0x4, 0xe0, 0x4, 0xe4, 0x4, 0xe8, 0x4,
+                                                              0xf3, 0x4, 0xfa, 0x5, 0x0, 0x5, 0x7, 0x5,
+                                                              0xc, 0x5, 0x11, 0x5, 0x16, 0x5, 0x1b, 0x5,
+                                                              0x20, 0x5, 0x25, 0x5, 0x2a, 0x5, 0x2f, 0x5,
+                                                              0x33, 0x5, 0x3d, 0x5, 0x47, 0x5, 0x50, 0x5,
+                                                              0x58, 0x5, 0x5c, 0x5, 0x65, 0x5, 0x6a, 0x5,
+                                                              0x6f, 0x5, 0x74, 0x5, 0x79, 0x5, 0x7e, 0x5,
+                                                              0x82, 0x5, 0x86, 0x5, 0x8a, 0xf7, 0x8d, 0x6,
+                                                              0x9f, 0xe5, 0x5, 0x30, 0x6, 0xb9, 0xd7, 0x5,
+                                                              0xf7, 0x84, 0x6, 0x9f, 0x3f, 0x5, 0x33, 0x3c,
+                                                              0xa, 0xf7, 0x88, 0x37, 0xa, 0x51, 0x6, 0xfb,
+                                                              0x1, 0xf8, 0x64, 0x5, 0xfb, 0x91, 0x3c, 0xa,
+                                                              0xf7, 0x15, 0x6, 0xfb, 0x8e, 0x7c, 0xa, 0x4e,
+                                                              0x6, 0xf7, 0x9d, 0xf7, 0x3a, 0x15, 0xf7, 0xa,
+                                                              0xf7, 0x3d, 0xb6, 0xfb, 0x3d, 0x5, 0xb, 0x22,
+                                                              0xa, 0x1f, 0x13, 0xbc, 0x3b, 0xa, 0x1e, 0x13,
+                                                              0x7c, 0xa1, 0xf7, 0x1, 0x15, 0x13, 0xbc, 0x2c,
+                                                              0xa, 0x15, 0xf7, 0x41, 0x42, 0xa, 0x3c, 0x6,
+                                                              0xac, 0xf7, 0x36, 0x5, 0x91, 0xa8, 0x90, 0xaa,
+                                                              0xa7, 0x1a, 0xcf, 0x46, 0xa9, 0x46, 0x2e, 0xfb,
+                                                              0x6, 0x6f, 0x74, 0x51, 0x1e, 0x9f, 0x3c, 0x5,
+                                                              0x9c, 0xa6, 0xef, 0xa1, 0xd6, 0x1b, 0xbc, 0xb0,
+                                                              0x7b, 0x69, 0x84, 0x8a, 0x83, 0x88, 0x83, 0x1f,
+                                                              0x8f, 0x68, 0x64, 0x8e, 0x67, 0x1b, 0xfb, 0x8a,
+                                                              0x6e, 0xfb, 0x20, 0x64, 0xb, 0x15, 0x20, 0xa,
+                                                              0xe, 0x15, 0xfb, 0x28, 0xf7, 0x1, 0x43, 0xf7,
+                                                              0x8, 0xf7, 0x44, 0xf7, 0x34, 0xf7, 0x9, 0xf7,
+                                                              0x89, 0xf7, 0x6, 0x48, 0xf4, 0xfb, 0x29, 0xfb,
+                                                              0x57, 0xfb, 0x2a, 0xfb, 0x2f, 0xfb, 0x62, 0x1e,
+                                                              0xef, 0x9e, 0x15, 0xf7, 0x4, 0x8a, 0xe4, 0xf7,
+                                                              0x1f, 0xf7, 0x1e, 0x1b, 0xf7, 0x5, 0xa6, 0x33,
+                                                              0x46, 0x8a, 0x1f, 0x2a, 0x3d, 0xfb, 0x27, 0xfb,
+                                                              0x23, 0x29, 0x5d, 0xd2, 0xda, 0x1e, 0xe, 0x15,
+                                                              0xdc, 0x6, 0x54, 0xfb, 0x9c, 0x5, 0x86, 0x73,
+                                                              0x89, 0x75, 0x77, 0x1a, 0x2d, 0xc8, 0x55, 0xf7,
+                                                              0xd, 0xf7, 0x15, 0xe9, 0xac, 0xf7, 0x48, 0xb0,
+                                                              0x1e, 0xc2, 0xf7, 0x9d, 0x5, 0xdb, 0x46, 0xa,
+                                                              0xfb, 0xa2, 0x6, 0x79, 0x31, 0x5, 0xeb, 0x6,
+                                                              0x57, 0xfb, 0x95, 0x5, 0x36, 0x79, 0x6b, 0x5e,
+                                                              0x24, 0x1b, 0x3b, 0x75, 0xab, 0xb0, 0x8a, 0x1f,
+                                                              0x9a, 0x8d, 0x9a, 0x8e, 0x9a, 0x1e, 0xc3, 0xf7,
+                                                              0xa5, 0x5, 0xea, 0x46, 0xa, 0xfb, 0xa2, 0x6,
+                                                              0xb, 0x7a, 0x7b, 0x1a, 0x43, 0xd0, 0x60, 0xdd,
+                                                              0xbf, 0xc0, 0xa6, 0xa5, 0xb7, 0x1e, 0x13, 0x70,
+                                                              0x81, 0x62, 0x5, 0xf7, 0x43, 0x37, 0xa, 0x3b,
+                                                              0x6, 0xd0, 0xf7, 0xf7, 0x8f, 0xa, 0x36, 0xa,
+                                                              0xda, 0x6, 0x65, 0xfb, 0x63, 0x5, 0x13, 0xb0,
+                                                              0x6c, 0x63, 0x5b, 0x64, 0x4d, 0x1b, 0x54, 0x7a,
+                                                              0xa2, 0xa1, 0x97, 0x8c, 0x96, 0x8c, 0x93, 0x1f,
+                                                              0xc3, 0xf7, 0xb8, 0x43, 0xa, 0x15, 0xdc, 0x6,
+                                                              0x67, 0xfb, 0x5b, 0x5, 0x85, 0x78, 0x89, 0x26,
+                                                              0xa, 0x15, 0x33, 0xa, 0x13, 0xd8, 0x2a, 0xa,
+                                                              0xe, 0x30, 0xa, 0x26, 0xfb, 0x44, 0x2d, 0xa,
+                                                              0x7b, 0x42, 0x56, 0xa, 0xbc, 0xf7, 0x80, 0x4e,
+                                                              0xa, 0x7c, 0x41, 0x4c, 0xa, 0xa7, 0xf7, 0x1e,
+                                                              0x88, 0xa, 0x72, 0xfb, 0x8, 0x56, 0xa, 0xb6,
+                                                              0xf7, 0x62, 0x5, 0xfc, 0xa1, 0x6, 0x79, 0x31,
+                                                              0x8a, 0xa, 0x3d, 0x7c, 0xa, 0x37, 0x6, 0xb,
+                                                              0xf8, 0x55, 0x37, 0xa, 0xfb, 0x40, 0x6, 0xdb,
+                                                              0xf8, 0xa, 0x5, 0xf7, 0x3e, 0x37, 0xa, 0xfc,
+                                                              0x51, 0x3c, 0xa, 0xf7, 0x41, 0x6, 0x3b, 0xfc,
+                                                              0xa, 0x3e, 0xa, 0xb, 0x61, 0x53, 0x49, 0x6a,
+                                                              0x48, 0x1b, 0x66, 0x65, 0x98, 0xa4, 0xc3, 0xe4,
+                                                              0x9d, 0xc3, 0xc5, 0xb1, 0x84, 0x89, 0xa8, 0x1f,
+                                                              0xe, 0x1e, 0xf1, 0xa2, 0x15, 0xef, 0xea, 0xca,
+                                                              0xf5, 0xf7, 0x3, 0xb0, 0x54, 0x56, 0x20, 0xfb,
+                                                              0x5, 0x55, 0x35, 0x53, 0x2d, 0xa3, 0xdd, 0x1e,
+                                                              0xe, 0x15, 0x9d, 0xe6, 0x5, 0xf7, 0x33, 0x6,
+                                                              0xdb, 0xf7, 0x94, 0x5, 0xfb, 0x35, 0x34, 0xa,
+                                                              0xf7, 0x98, 0x6, 0x25, 0xfb, 0xef, 0x5, 0xf7,
+                                                              0x4d, 0x4b, 0xa, 0xe, 0x5, 0x6d, 0x44, 0x3c,
+                                                              0x74, 0x3f, 0x1b, 0xfb, 0xf, 0x82, 0xb9, 0xaf,
+                                                              0x87, 0x1f, 0x9b, 0xe6, 0x15, 0xc4, 0xac, 0xd5,
+                                                              0xb0, 0xc8, 0x1b, 0xca, 0xd8, 0x6e, 0x4a, 0x8c,
+                                                              0x1f, 0xe, 0x15, 0xfb, 0x12, 0xf7, 0x18, 0x5b,
+                                                              0xf3, 0xf7, 0x1a, 0xf7, 0x49, 0xe6, 0xf7, 0x49,
+                                                              0xe9, 0x48, 0xe0, 0xfb, 0x32, 0xfb, 0x32, 0xfb,
+                                                              0x3c, 0xb, 0x3c, 0xf7, 0x2a, 0xea, 0xe0, 0xa1,
+                                                              0xb5, 0xdd, 0x1f, 0x7a, 0xdb, 0x2f, 0xa, 0x35,
+                                                              0xa, 0xfb, 0x4a, 0x93, 0xa, 0xd3, 0x31, 0xa,
+                                                              0xf8, 0xa4, 0x6, 0xb5, 0xf7, 0x5e, 0x7a, 0xa,
+                                                              0x73, 0xfb, 0x4, 0x95, 0xa, 0xab, 0xf7, 0x27,
+                                                              0x5, 0xf7, 0x4, 0x6, 0xb, 0x6, 0x9e, 0xe6,
+                                                              0x5, 0xb, 0x15, 0xf8, 0x21, 0x6, 0x94, 0xa3,
+                                                              0x97, 0xc0, 0xa9, 0x1a, 0xee, 0x89, 0x30, 0xd1,
+                                                              0xfb, 0x9, 0x1b, 0xfb, 0x17, 0xb, 0x6, 0x78,
+                                                              0x30, 0x5, 0xb, 0x6, 0x9e, 0xe5, 0x5, 0xb,
+                                                              0x49, 0xa, 0xbf, 0x3a, 0xfb, 0xa, 0x42, 0x3d,
+                                                              0x35, 0x1e, 0xd9, 0x95, 0x15, 0xb7, 0xaf, 0xb3,
+                                                              0xc8, 0xb5, 0xa5, 0x73, 0x53, 0xa, 0xb, 0x15,
+                                                              0x4d, 0xba, 0x57, 0xe3, 0xed, 0xef, 0xd2, 0xe9,
+                                                              0xc7, 0x58, 0xbe, 0x37, 0x27, 0x29, 0x3f, 0x35,
+                                                              0x1e, 0xdc, 0x91, 0x15, 0xba, 0xb2, 0xb2, 0xc7,
+                                                              0xba, 0xa4, 0x72, 0x6c, 0x56, 0x52, 0x70, 0x5e,
+                                                              0x62, 0x6f, 0xa3, 0xa5, 0x1e, 0xb, 0x8b, 0xe6,
+                                                              0xf8, 0x10, 0xe6, 0x1, 0xb, 0x52, 0xbf, 0x51,
+                                                              0xf0, 0xda, 0xb6, 0xa2, 0xae, 0xca, 0xb, 0x6,
+                                                              0x78, 0x31, 0x5, 0xb, 0x84, 0xa3, 0xa3, 0x83,
+                                                              0xa1, 0x1b, 0xd5, 0xc5, 0xbd, 0xa4, 0xa6, 0x1f,
+                                                              0x5f, 0xca, 0x5, 0x77, 0x6e, 0x69, 0x72, 0x67,
+                                                              0x1b, 0x7a, 0x76, 0x91, 0x92, 0x76, 0x1f, 0x92,
+                                                              0x75, 0x75, 0x92, 0x76, 0x1b, 0xb, 0x5, 0xfb,
+                                                              0x43, 0x6, 0xb, 0x6, 0x9e, 0xe9, 0x5, 0xb,
+                                                              0x8b, 0xe5, 0xd7, 0xe5, 0xf7, 0x64, 0xe5, 0xb,
+                                                              0x7c, 0xe7, 0x3b, 0xe6, 0xf0, 0xe5, 0xcd, 0xe6,
+                                                              0xb, 0x6, 0x9d, 0xe6, 0x5, 0xb, 0x3e, 0xa,
+                                                              0xe, 0x6, 0x78, 0x2d, 0x5, 0xb, 0x1, 0xa3,
+                                                              0xf1, 0xf7, 0xf1, 0xef, 0x3, 0xb, 0x6, 0x9d,
+                                                              0xe5, 0x5, 0xb, 0xbb, 0xd5, 0xbf, 0xb5, 0x73,
+                                                              0x5c, 0x99, 0x1e, 0xe6, 0xb0, 0x5, 0xb9, 0x78,
+                                                              0x69, 0xdc, 0xfb, 0x15, 0x1b, 0xfb, 0x22, 0xb,
+                                                              0x15, 0xee, 0x6, 0xf7, 0x53, 0xf7, 0x25, 0x57,
+                                                              0xaf, 0xfb, 0x45, 0x5e, 0xa, 0x15, 0x4f, 0xbb,
+                                                              0x58, 0xde, 0xf1, 0xe1, 0xd2, 0xe7, 0xc7, 0x5c,
+                                                              0xb, 0x64, 0xa, 0xf7, 0xf, 0x65, 0xa, 0xb,
+                                                              0x6, 0x79, 0x30, 0x5, 0xb, 0x5, 0xfb, 0x3,
+                                                              0x6, 0xb, 0x3d, 0xf7, 0x4b, 0x5, 0xbd, 0x84,
+                                                              0xa, 0xfb, 0x84, 0x6, 0x77, 0x34, 0x5c, 0xa,
+                                                              0xf7, 0x8, 0xb, 0x5, 0x29, 0x6, 0xb, 0x15,
+                                                              0x6b, 0xa2, 0x73, 0xad, 0xb7, 0xb5, 0xb5, 0xba,
+                                                              0xbb, 0x72, 0x99, 0x6a, 0x5a, 0x67, 0x5e, 0x59,
+                                                              0x1e, 0xb, 0x16, 0x60, 0xa, 0xa8, 0x7a, 0xa4,
+                                                              0x63, 0x54, 0x6e, 0x5f, 0x67, 0x1e, 0xb, 0x15,
+                                                              0xf7, 0x62, 0xfb, 0x55, 0xc0, 0xc5, 0xfb, 0x26,
+                                                              0xf7, 0x1b, 0xf7, 0x26, 0xf7, 0xf, 0x56, 0xc7,
+                                                              0x5, 0xb, 0xa7, 0xaf, 0x15, 0xb2, 0x4b, 0x5,
+                                                              0x93, 0x99, 0xcd, 0xb1, 0xbc, 0x1b, 0xa0, 0xa3,
+                                                              0x84, 0x83, 0xa4, 0x1f, 0xb, 0x6d, 0x55, 0x56,
+                                                              0x70, 0x5d, 0x61, 0x73, 0xa2, 0xa7, 0x1e, 0xb,
+                                                              0x8b, 0xe5, 0xd5, 0xf7, 0x36, 0x32, 0xe4, 0xf7,
+                                                              0x1e, 0xe5, 0xb, 0x6, 0x9f, 0xe9, 0x5, 0xb,
+                                                              0x5, 0xed, 0x6, 0xb, 0x7c, 0xe4, 0x3e, 0xe5,
+                                                              0xf7, 0x9c, 0xe6, 0xb, 0x1, 0x9e, 0xef, 0xf8,
+                                                              0x1, 0xeb, 0x3, 0xb, 0x1, 0xf3, 0xe9, 0xf7,
+                                                              0x8b, 0xe9, 0x3, 0xb, 0x15, 0xf7, 0x4, 0x6,
+                                                              0xb, 0x6, 0x9e, 0xe7, 0x5, 0xb, 0x5, 0xd9,
+                                                              0x6, 0xb, 0x63, 0xa, 0xf7, 0x75, 0x77, 0x45,
+                                                              0xa, 0xb, 0x22, 0xfb, 0x10, 0xf5, 0x45, 0x69,
+                                                              0x5, 0xe, 0x61, 0xa, 0xf7, 0x77, 0x77, 0x76,
+                                                              0xa, 0xb, 0x71, 0xa2, 0x72, 0xb1, 0xba, 0xac,
+                                                              0xb3, 0xb0, 0xb, 0x7c, 0xe6, 0xdd, 0xe6, 0xe9,
+                                                              0xe6, 0xb, 0x1, 0xf7, 0x67, 0xf1, 0x3, 0xb,
+                                                              0x7c, 0xe6, 0xf7, 0xa1, 0xe6, 0xb, 0x15, 0xf7,
+                                                              0x6, 0x6, 0xa5, 0xb, 0x5, 0xfb, 0x5, 0x6,
+                                                              0xb, 0x5, 0x2a, 0x6, 0xb, 0x57, 0xa, 0xf7,
+                                                              0x6f, 0x77, 0x12, 0x13, 0xb0, 0xb, 0x75, 0xa,
+                                                              0xf7, 0x7a, 0x77, 0x62, 0xa, 0xb, 0xf8, 0x8f,
+                                                              0x5a, 0xa, 0xaa, 0xf7, 0x2b, 0x5, 0xfb, 0x4,
+                                                              0x6, 0xb, 0xb1, 0x4c, 0xf7, 0x66, 0xf7, 0x2e,
+                                                              0xfb, 0x1b, 0xf7, 0x32, 0x4d, 0x57, 0xc5, 0xb,
+                                                              0x15, 0x76, 0x34, 0x5, 0xf7, 0xc0, 0x84, 0xa,
+                                                              0x46, 0x6, 0xb, 0x5, 0xda, 0x6, 0x9d, 0xe8,
+                                                              0x5, 0xfb, 0xa0, 0x82, 0xa, 0xb, 0x15, 0xf7,
+                                                              0x5, 0x6, 0xb, 0x6, 0x77, 0x30, 0x5, 0xb,
+                                                              0x6, 0x77, 0x2d, 0x5, 0xb, 0x5, 0xf7, 0x28,
+                                                              0x6, 0xb, 0xf7, 0xb1, 0x5, 0xb, 0x64, 0xa,
+                                                              0xf7, 0x10, 0x83, 0xa, 0xb, 0x15, 0xf8, 0x63,
+                                                              0x6, 0x9e, 0xf7, 0x2, 0x5, 0xfc, 0x63, 0x6,
+                                                              0xb, 0x6, 0x3c, 0x7d, 0xa, 0xb, 0x8b, 0xe5,
+                                                              0xf8, 0xa, 0xe5, 0xb, 0x1, 0xf8, 0x66, 0xe8,
+                                                              0x3, 0xb, 0x79, 0xe4, 0xf8, 0x25, 0xe6, 0xb,
+                                                              0x8b, 0xe6, 0xf7, 0x94, 0xe6, 0xb, 0x79, 0xe6,
+                                                              0xf8, 0x17, 0xe5, 0xb, 0x5, 0x2b, 0x6, 0xb,
+                                                              0x5, 0x28, 0x6, 0xb, 0xfc, 0xa, 0x5, 0xb,
+                                                              0xfc, 0x10, 0x5, 0xb, 0x5, 0xfb, 0x4c, 0x6,
+                                                              0x79, 0x2e, 0x5, 0xd8, 0x6, 0x3f, 0xb, 0x8b,
+                                                              0xe9, 0xf7, 0x8f, 0xe9, 0x1, 0xb, 0x6, 0xf7,
+                                                              0x55, 0x71, 0xa, 0xb, 0x8b, 0xe9, 0xf8, 0x4a,
+                                                              0xe9, 0x1, 0xb, 0x6, 0x78, 0x2e, 0x5, 0xb,
+                                                              0x5, 0xfb, 0x6, 0x6, 0xb, 0x6, 0x9f, 0xe2,
+                                                              0x5, 0xb, 0x5, 0xfb, 0x28, 0x6, 0xb, 0x5,
+                                                              0xfb, 0x2, 0x6, 0xb, 0x6, 0x79, 0x2d, 0x5,
+                                                              0xb, 0x5, 0xf7, 0x8f, 0x6, 0xb, 0x6, 0x9f,
+                                                              0xe8, 0x5, 0xb, 0x5, 0xdb, 0x6, 0xb, 0xf7,
+                                                              0x1b, 0xc5, 0x98, 0x1f, 0xe7, 0xf8, 0x2e, 0x5,
+                                                              0xb, 0xda, 0xf7, 0xb, 0xa4, 0x1f, 0xc5, 0xf7,
+                                                              0xb6, 0x5, 0xb, 0x5, 0xfb, 0x45, 0x6, 0x79,
+                                                              0x32, 0x8a, 0xa, 0xb, 0x65, 0xca, 0xfb, 0x66,
+                                                              0xfb, 0x2e, 0x5, 0xe, 0x5, 0xfb, 0x42, 0xb,
+                                                              0x55, 0x15, 0x77, 0x33, 0x5, 0xf7, 0xd7, 0x6,
+                                                              0xb, 0xf7, 0x73, 0x77, 0x1, 0xb, 0x15, 0xf7,
+                                                              0x3, 0x6, 0xb, 0x28, 0xfb, 0x42, 0x2a, 0xb,
+                                                              0x6, 0x9e, 0xe8, 0x5, 0xb, 0x5, 0xfb, 0x90,
+                                                              0x6, 0xb, 0x5, 0xec, 0x6, 0xb, 0xf7, 0x20,
+                                                              0x5, 0xb, 0xfb, 0x56, 0x5, 0xb
+                                                             };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c
new file mode 100644
index 0000000..d8409ba
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c
@@ -0,0 +1,2352 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitFixedItalicFontData [18746] = {0x1,
+                                                          0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x15,
+                                                          0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,
+                                                          0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74,
+                                                          0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1,
+                                                          0x23, 0xf8, 0x10, 0x0, 0xf8, 0x2a, 0x1, 0xf8,
+                                                          0x2b, 0x2, 0xf8, 0x2c, 0x3, 0xf8, 0x18, 0x4,
+                                                          0x5b, 0xfb, 0x8d, 0xf9, 0x2b, 0xf9, 0xb7, 0x5,
+                                                          0xf7, 0xa3, 0xf, 0xf9, 0xc, 0x11, 0xaa, 0x1c,
+                                                          0x42, 0x78, 0x12, 0x0, 0x12, 0x1, 0x1, 0x5,
+                                                          0x7, 0x9, 0x11, 0x19, 0x1f, 0x25, 0x29, 0x2d,
+                                                          0x39, 0x42, 0x49, 0x53, 0x5c, 0x65, 0x8f, 0xa5,
+                                                          0xb4, 0x49, 0x64, 0x6f, 0x74, 0x49, 0x4a, 0x69,
+                                                          0x6a, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c,
+                                                          0x61, 0x73, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c,
+                                                          0x61, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x67,
+                                                          0x63, 0x61, 0x72, 0x6f, 0x6e, 0x6c, 0x69, 0x72,
+                                                          0x61, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x72, 0x65,
+                                                          0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+                                                          0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65,
+                                                          0x66, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75,
+                                                          0x70, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69,
+                                                          0x67, 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77,
+                                                          0x64, 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f,
+                                                          0x77, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x20, 0x20,
+                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
+                                                          0x68, 0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78,
+                                                          0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x49,
+                                                          0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68, 0x72,
+                                                          0x6F, 0x6D, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64,
+                                                          0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, 0x1, 0x0,
+                                                          0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37,
+                                                          0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67,
+                                                          0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,
+                                                          0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,
+                                                          0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,
+                                                          0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,
+                                                          0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,
+                                                          0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,
+                                                          0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,
+                                                          0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,
+                                                          0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,
+                                                          0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,
+                                                          0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,
+                                                          0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,
+                                                          0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,
+                                                          0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,
+                                                          0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,
+                                                          0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,
+                                                          0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,
+                                                          0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,
+                                                          0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,
+                                                          0xcb, 0x0, 0x0, 0xc9, 0x0, 0x0, 0xc8, 0x0,
+                                                          0x0, 0xcd, 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc,
+                                                          0x0, 0x0, 0x90, 0x0, 0x0, 0xce, 0x0, 0x0,
+                                                          0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0,
+                                                          0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7,
+                                                          0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0,
+                                                          0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0,
+                                                          0x0, 0x93, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde,
+                                                          0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0,
+                                                          0xe3, 0x0, 0x1, 0x87, 0x0, 0x0, 0x91, 0x0,
+                                                          0x1, 0x88, 0x1, 0x0, 0x8c, 0x0, 0x0, 0x92,
+                                                          0x0, 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x1,
+                                                          0x8a, 0x1, 0x0, 0xc0, 0x0, 0x0, 0xdd, 0x0,
+                                                          0x0, 0xc6, 0x1, 0x0, 0xe4, 0x0, 0x0, 0x65,
+                                                          0x0, 0x1, 0x8c, 0x1, 0x0, 0x7e, 0x0, 0x0,
+                                                          0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, 0x0,
+                                                          0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x86,
+                                                          0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0,
+                                                          0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75, 0x0,
+                                                          0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x76,
+                                                          0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0, 0x0,
+                                                          0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63, 0x0,
+                                                          0x1, 0x8e, 0x2, 0x0, 0x99, 0x0, 0x1, 0x91,
+                                                          0x4, 0x0, 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0,
+                                                          0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3,
+                                                          0x0, 0x2f, 0x0, 0x62, 0x0, 0xd0, 0x1, 0x55,
+                                                          0x1, 0xb1, 0x2, 0x3c, 0x2, 0x50, 0x2, 0x87,
+                                                          0x2, 0xbe, 0x2, 0xf5, 0x3, 0x21, 0x3, 0x2f,
+                                                          0x3, 0x43, 0x3, 0x52, 0x3, 0x67, 0x3, 0xab,
+                                                          0x3, 0xd2, 0x4, 0x22, 0x4, 0x80, 0x4, 0xc1,
+                                                          0x5, 0x11, 0x5, 0x67, 0x5, 0x8f, 0x6, 0x0,
+                                                          0x6, 0x57, 0x6, 0x6f, 0x6, 0x8f, 0x6, 0xb2,
+                                                          0x6, 0xd4, 0x6, 0xf7, 0x7, 0x5b, 0x7, 0xf8,
+                                                          0x8, 0x32, 0x8, 0x9f, 0x8, 0xf3, 0x9, 0x2e,
+                                                          0x9, 0x77, 0x9, 0xc3, 0x9, 0xd7, 0xa, 0x28,
+                                                          0xa, 0x48, 0xa, 0x84, 0xa, 0xd7, 0xb, 0x1,
+                                                          0xb, 0x48, 0xb, 0x83, 0xb, 0xcd, 0xc, 0x1a,
+                                                          0xc, 0xb7, 0xd, 0x19, 0xd, 0x88, 0xd, 0xbc,
+                                                          0xe, 0x12, 0xe, 0x3d, 0xe, 0x7f, 0xe, 0xd2,
+                                                          0xf, 0x7, 0xf, 0x3e, 0xf, 0x5e, 0xf, 0x81,
+                                                          0xf, 0xa4, 0xf, 0xd4, 0xf, 0xe5, 0xf, 0xf5,
+                                                          0x10, 0x45, 0x10, 0xaa, 0x10, 0xfe, 0x11, 0x65,
+                                                          0x11, 0xb9, 0x12, 0xa, 0x12, 0x1f, 0x12, 0x6b,
+                                                          0x12, 0xa0, 0x12, 0xe2, 0x13, 0x30, 0x13, 0x53,
+                                                          0x13, 0xca, 0x14, 0x29, 0x14, 0x70, 0x14, 0xd7,
+                                                          0x15, 0x3f, 0x15, 0x84, 0x15, 0xed, 0x16, 0x39,
+                                                          0x16, 0x8f, 0x16, 0xbb, 0x16, 0xff, 0x17, 0x52,
+                                                          0x17, 0x92, 0x17, 0xc4, 0x18, 0x2b, 0x18, 0x45,
+                                                          0x18, 0xac, 0x18, 0xea, 0x19, 0x19, 0x19, 0x77,
+                                                          0x19, 0xe6, 0x1a, 0x67, 0x1a, 0xca, 0x1a, 0xe9,
+                                                          0x1b, 0x82, 0x1b, 0x9e, 0x1c, 0x23, 0x1c, 0x8a,
+                                                          0x1c, 0xbd, 0x1c, 0xd8, 0x1d, 0x60, 0x1d, 0x73,
+                                                          0x1d, 0xb0, 0x1d, 0xee, 0x1e, 0x31, 0x1e, 0x97,
+                                                          0x1e, 0xa9, 0x1e, 0xee, 0x1f, 0x27, 0x1f, 0x48,
+                                                          0x1f, 0x84, 0x1f, 0xa8, 0x1f, 0xe7, 0x20, 0x1c,
+                                                          0x20, 0x89, 0x20, 0xfc, 0x21, 0xaa, 0x22, 0x9,
+                                                          0x22, 0x27, 0x22, 0x4e, 0x22, 0x7b, 0x22, 0xc6,
+                                                          0x22, 0xe9, 0x23, 0x2f, 0x23, 0x9f, 0x24, 0x22,
+                                                          0x24, 0x40, 0x24, 0x63, 0x24, 0x89, 0x24, 0xb7,
+                                                          0x24, 0xd4, 0x25, 0x14, 0x25, 0x3e, 0x25, 0x6d,
+                                                          0x25, 0xc8, 0x26, 0x49, 0x26, 0x67, 0x26, 0x88,
+                                                          0x26, 0xae, 0x26, 0xff, 0x27, 0x31, 0x27, 0x60,
+                                                          0x27, 0xe8, 0x27, 0xfd, 0x28, 0x16, 0x28, 0x3f,
+                                                          0x28, 0x61, 0x28, 0x80, 0x28, 0xd1, 0x29, 0x5b,
+                                                          0x29, 0x71, 0x29, 0x97, 0x29, 0xad, 0x2a, 0x13,
+                                                          0x2a, 0x36, 0x2a, 0x7f, 0x2b, 0x2d, 0x2b, 0xaf,
+                                                          0x2b, 0xcd, 0x2b, 0xea, 0x2c, 0x19, 0x2c, 0x4a,
+                                                          0x2c, 0x65, 0x2c, 0x96, 0x2c, 0xba, 0x2c, 0xda,
+                                                          0x2d, 0x51, 0x2d, 0xf4, 0x2e, 0xc, 0x2e, 0x23,
+                                                          0x2e, 0x49, 0x2e, 0x92, 0x2e, 0xb9, 0x2e, 0xeb,
+                                                          0x2f, 0x6a, 0x2f, 0x89, 0x2f, 0xa8, 0x2f, 0xd0,
+                                                          0x2f, 0xf8, 0x30, 0x4b, 0x30, 0xb6, 0x31, 0x1b,
+                                                          0x31, 0x40, 0x31, 0x66, 0x31, 0xc3, 0x32, 0x29,
+                                                          0x32, 0x65, 0x32, 0x9f, 0x33, 0x0, 0x33, 0x8c,
+                                                          0x34, 0x39, 0x34, 0xe5, 0x35, 0x70, 0x36, 0x2,
+                                                          0x36, 0x2d, 0x36, 0x71, 0x36, 0xb3, 0x37, 0xa,
+                                                          0x37, 0x28, 0x37, 0x49, 0x37, 0x6b, 0x37, 0x8d,
+                                                          0x37, 0xb6, 0x37, 0xc6, 0x37, 0xfd, 0x38, 0x2e,
+                                                          0x38, 0x6f, 0x38, 0x8e, 0x38, 0x9e, 0x38, 0xae,
+                                                          0x38, 0xbf, 0x38, 0xd5, 0x38, 0xe4, 0x39, 0x7,
+                                                          0x39, 0x24, 0x39, 0x40, 0x39, 0x70, 0x39, 0xb6,
+                                                          0x39, 0xd4, 0x39, 0xf4, 0x3a, 0x2f, 0x3a, 0x4e,
+                                                          0x3a, 0x6e, 0x3a, 0x81, 0x3b, 0x1, 0x3b, 0x88,
+                                                          0x3c, 0x0, 0x3c, 0x53, 0x3c, 0x74, 0x3c, 0x9e,
+                                                          0x3c, 0xbe, 0x3c, 0xe3, 0x3d, 0x1d, 0x3d, 0x2c,
+                                                          0x3d, 0xa7, 0x3e, 0x14, 0xe, 0xe, 0x7c, 0xf7,
+                                                          0xc, 0x1, 0xf7, 0x9f, 0xb7, 0x3, 0xf7, 0x9f,
+                                                          0xf7, 0x49, 0x15, 0xb7, 0x6, 0xee, 0xf8, 0x1b,
+                                                          0x5, 0x3d, 0x6, 0xfb, 0x22, 0xfc, 0xab, 0x15,
+                                                          0x6e, 0x9d, 0x74, 0xb0, 0xb3, 0xb3, 0xa8, 0xb3,
+                                                          0xaa, 0x72, 0x9f, 0x68, 0x66, 0x65, 0x69, 0x69,
+                                                          0x1e, 0xe, 0xf7, 0xdc, 0xf7, 0x7e, 0x12, 0xf7,
+                                                          0x3e, 0xb6, 0x7d, 0xdb, 0xb5, 0xb5, 0x7e, 0xda,
+                                                          0x13, 0xd0, 0xf7, 0xd5, 0xf7, 0xdc, 0x15, 0x13,
+                                                          0xc8, 0xa8, 0x64, 0xa, 0xda, 0x6, 0x13, 0xd0,
+                                                          0x49, 0xfb, 0x7e, 0x5, 0xfb, 0x55, 0x16, 0x13,
+                                                          0xb0, 0xa8, 0x64, 0xa, 0xdb, 0x6, 0x13, 0xd0,
+                                                          0x49, 0xfb, 0x7e, 0x5, 0xe, 0xf7, 0x5e, 0xf7,
+                                                          0x34, 0xbf, 0xf7, 0x75, 0x1, 0xf7, 0x2a, 0xf7,
+                                                          0x1a, 0xbb, 0xf7, 0x39, 0x3, 0xf2, 0x4c, 0x15,
+                                                          0xba, 0x6, 0xc1, 0xf7, 0x69, 0x5, 0xf7, 0x16,
+                                                          0x6, 0x59, 0xfb, 0x69, 0x5, 0xbb, 0x6, 0xbf,
+                                                          0xf7, 0x69, 0x5, 0xf2, 0x6, 0x95, 0xbf, 0x5,
+                                                          0x27, 0x6, 0xb4, 0xf7, 0x34, 0x5, 0xe3, 0x6,
+                                                          0x95, 0xbf, 0x5, 0x33, 0x6, 0xc1, 0xf7, 0x75,
+                                                          0x5, 0x5b, 0x6, 0x54, 0xfb, 0x75, 0x83, 0xa,
+                                                          0xc1, 0xf7, 0x75, 0x5, 0x5b, 0x6, 0x51, 0xfb,
+                                                          0x75, 0x5, 0x25, 0x6, 0x81, 0x57, 0x5, 0xf1,
+                                                          0x6, 0x64, 0xfb, 0x34, 0x5, 0x2f, 0x6, 0x81,
+                                                          0x57, 0x5, 0xe5, 0x6, 0xca, 0xbf, 0x15, 0xb1,
+                                                          0xf7, 0x34, 0x5, 0xf7, 0x17, 0x6, 0x66, 0xfb,
+                                                          0x34, 0x5, 0xe, 0x22, 0x76, 0xf7, 0x2b, 0xc0,
+                                                          0xf8, 0x40, 0xbf, 0x1, 0xc3, 0xc0, 0xf7, 0xb,
+                                                          0xc3, 0xf7, 0x28, 0xc5, 0x3, 0xc3, 0x9c, 0x15,
+                                                          0xc0, 0x6, 0x96, 0xbe, 0xab, 0x77, 0xa9, 0x7d,
+                                                          0xb9, 0x81, 0x19, 0x6d, 0xfb, 0x2a, 0x51, 0xa,
+                                                          0xa9, 0xf7, 0x2b, 0x5, 0xf7, 0x0, 0xec, 0xbd,
+                                                          0xee, 0x8c, 0x1f, 0xd4, 0x45, 0xb1, 0x47, 0xa6,
+                                                          0x1e, 0x52, 0xa0, 0x2f, 0xa4, 0x89, 0xbc, 0x8,
+                                                          0xcd, 0xd9, 0xac, 0xcc, 0xba, 0xb6, 0x72, 0x75,
+                                                          0xad, 0x1e, 0x83, 0x66, 0x6a, 0xa, 0xa8, 0xf7,
+                                                          0x29, 0x5, 0x55, 0x6, 0x80, 0x54, 0x70, 0x9a,
+                                                          0x6e, 0x9d, 0x69, 0x8f, 0x19, 0x9f, 0xf7, 0x1,
+                                                          0x71, 0xa, 0x77, 0x23, 0x5, 0x57, 0x8a, 0xfb,
+                                                          0x21, 0x71, 0xfb, 0x1d, 0x1a, 0x45, 0xe6, 0x6c,
+                                                          0xd1, 0x72, 0x1e, 0xcb, 0x74, 0xce, 0x6c, 0x59,
+                                                          0x1a, 0x51, 0x3e, 0x6f, 0x29, 0x59, 0x5e, 0xa0,
+                                                          0xaa, 0x6d, 0x1e, 0x94, 0xb9, 0x52, 0xa, 0xe,
+                                                          0x7c, 0xc4, 0xf7, 0x28, 0xc2, 0xf7, 0x12, 0xc4,
+                                                          0xf7, 0x1f, 0xc2, 0x12, 0xf7, 0x13, 0xc4, 0xac,
+                                                          0xc4, 0xc3, 0xc5, 0xab, 0xc5, 0x17, 0xf7, 0x13,
+                                                          0xf8, 0x6b, 0x6d, 0xa, 0xba, 0x42, 0x35, 0x47,
+                                                          0x44, 0x3b, 0x1e, 0xc4, 0x94, 0x15, 0xbc, 0xae,
+                                                          0xb1, 0xc1, 0xad, 0xa2, 0x70, 0x72, 0xa, 0xfb,
+                                                          0x5, 0xfb, 0xb3, 0x15, 0xf8, 0x61, 0xf7, 0x43,
+                                                          0x5, 0x13, 0xc5, 0x86, 0xc1, 0xfc, 0x60, 0xfb,
+                                                          0x45, 0x5, 0xf7, 0x2a, 0xfb, 0x34, 0x6d, 0xa,
+                                                          0xc3, 0x42, 0x35, 0x47, 0x3b, 0x3b, 0x1e, 0xc4,
+                                                          0x94, 0x15, 0xbc, 0xae, 0xba, 0xc1, 0xad, 0xa2,
+                                                          0x67, 0x72, 0xa, 0xe, 0x7c, 0xbd, 0x67, 0xc3,
+                                                          0xf7, 0x38, 0xc3, 0xf7, 0x6d, 0xbe, 0x12, 0xc0,
+                                                          0xc0, 0xce, 0xc1, 0x13, 0x7c, 0xf7, 0xe1, 0xbd,
+                                                          0x15, 0xa6, 0x58, 0x5, 0xf7, 0x2b, 0x6, 0x95,
+                                                          0xc3, 0x5, 0xfb, 0x11, 0x6, 0x78, 0xae, 0xaf,
+                                                          0xaf, 0xa5, 0xbd, 0x9b, 0xb6, 0x19, 0xdc, 0x6,
+                                                          0x95, 0xc3, 0x5, 0xfb, 0xf, 0x6, 0x83, 0x60,
+                                                          0x72, 0x54, 0x67, 0x63, 0x21, 0xf7, 0x62, 0x18,
+                                                          0x88, 0x8f, 0x7a, 0xac, 0x8a, 0xab, 0x8, 0xc0,
+                                                          0xc1, 0xa6, 0xcf, 0xaf, 0xb2, 0x7d, 0x72, 0x9d,
+                                                          0x1e, 0xa7, 0xbb, 0x5, 0xab, 0x6d, 0x5d, 0x95,
+                                                          0x5d, 0x1b, 0x39, 0x2e, 0x60, 0x3d, 0x1f, 0x88,
+                                                          0x65, 0x9c, 0x67, 0x9b, 0x67, 0x8, 0xfb, 0x18,
+                                                          0x39, 0x79, 0x4b, 0x45, 0x1a, 0x13, 0xbc, 0x57,
+                                                          0xab, 0x50, 0xe2, 0xc2, 0xc7, 0xa3, 0xb4, 0xb9,
+                                                          0x1e, 0x76, 0xb9, 0x15, 0x75, 0x6e, 0x60, 0x64,
+                                                          0x54, 0x1b, 0x60, 0x68, 0xa2, 0xbe, 0x8a, 0x1f,
+                                                          0xd8, 0xd4, 0xc2, 0xbb, 0xa3, 0x1e, 0xe, 0xf7,
+                                                          0xee, 0x76, 0xf7, 0x81, 0x77, 0x1, 0xf7, 0x86,
+                                                          0xf7, 0xd9, 0x15, 0xb9, 0x6, 0xd0, 0xf7, 0x81,
+                                                          0x7b, 0xa, 0xe, 0x34, 0x76, 0xf9, 0x6e, 0x77,
+                                                          0x1, 0xf7, 0x3e, 0xbe, 0x3, 0xf7, 0x6e, 0xfb,
+                                                          0x0, 0x15, 0xbe, 0x6, 0x75, 0xc6, 0x71, 0xe2,
+                                                          0xeb, 0x1a, 0xf7, 0x4f, 0xee, 0xf7, 0x33, 0xf7,
+                                                          0x1, 0xf7, 0x22, 0x1e, 0x7a, 0x79, 0x8b, 0x7a,
+                                                          0x1b, 0xfb, 0x18, 0xfb, 0x37, 0x40, 0xfb, 0x29,
+                                                          0xfb, 0x46, 0x1a, 0x2c, 0xa1, 0x36, 0xa5, 0x4f,
+                                                          0x1e, 0xe, 0x34, 0x76, 0xf9, 0x6e, 0x77, 0x1,
+                                                          0xf8, 0xd, 0xbf, 0x3, 0xf7, 0x3e, 0xfb, 0x0,
+                                                          0x15, 0x9c, 0x9d, 0x8b, 0x9c, 0x1b, 0xf7, 0x18,
+                                                          0xf7, 0x37, 0xd6, 0xf7, 0x29, 0xf7, 0x46, 0x1a,
+                                                          0xea, 0x74, 0xe0, 0x71, 0xc7, 0x1e, 0x58, 0x6,
+                                                          0xa1, 0x50, 0xa5, 0x34, 0x2b, 0x1a, 0xfb, 0x4f,
+                                                          0x29, 0xfb, 0x33, 0xfb, 0x1, 0xfb, 0x22, 0x1e,
+                                                          0xe, 0xf7, 0x95, 0xf7, 0xf2, 0x1, 0xf7, 0x8,
+                                                          0xf8, 0x4, 0x3, 0xf7, 0x1d, 0xf7, 0xb5, 0x15,
+                                                          0xc0, 0x6b, 0xee, 0xf7, 0xe, 0xbb, 0xfb, 0xe,
+                                                          0xca, 0xab, 0x4a, 0xf7, 0x12, 0xf7, 0x29, 0xa7,
+                                                          0x82, 0xcd, 0xfb, 0x24, 0x5e, 0xae, 0xf7, 0x23,
+                                                          0x5, 0x46, 0x6, 0x74, 0xfb, 0x1d, 0xfb, 0x16,
+                                                          0xb2, 0x6f, 0x49, 0xf7, 0x17, 0x6e, 0x5, 0xe,
+                                                          0xf7, 0x79, 0xc1, 0x1, 0xf7, 0x79, 0xc3, 0x3,
+                                                          0xd5, 0xf7, 0x79, 0x15, 0xf7, 0x55, 0x6, 0x65,
+                                                          0xfb, 0x4d, 0x51, 0xa, 0xb1, 0xf7, 0x4d, 0x5,
+                                                          0xf7, 0x54, 0x4d, 0xa, 0xfb, 0x54, 0x6, 0xb1,
+                                                          0xf7, 0x4f, 0x71, 0xa, 0x65, 0xfb, 0x4f, 0x5,
+                                                          0xfb, 0x55, 0x6, 0xe, 0x30, 0x76, 0xf7, 0x7e,
+                                                          0x77, 0x1, 0xf7, 0x55, 0xfb, 0x4, 0x15, 0xcb,
+                                                          0x75, 0xa, 0xf7, 0x7b, 0xc1, 0x1, 0xec, 0xf8,
+                                                          0x2a, 0x3, 0xec, 0xf7, 0x7b, 0x15, 0xf8, 0x1e,
+                                                          0x47, 0xa, 0xfc, 0x1e, 0x6, 0xe, 0x7c, 0xf7,
+                                                          0x10, 0x1, 0xf7, 0x78, 0xf7, 0x24, 0x3, 0xf7,
+                                                          0x78, 0xae, 0x35, 0xa, 0xe, 0x3b, 0xf9, 0x59,
+                                                          0x1, 0xc1, 0xf8, 0x80, 0x3, 0xc1, 0x4f, 0x15,
+                                                          0xb6, 0x77, 0xf8, 0x55, 0xf9, 0x44, 0x63, 0xa0,
+                                                          0x5, 0xe, 0x7c, 0xc5, 0xf8, 0x77, 0xc1, 0x1,
+                                                          0xe5, 0xc0, 0xf7, 0xc8, 0xc6, 0x3, 0xe5, 0xf7,
+                                                          0x46, 0x15, 0x2f, 0xa8, 0x26, 0xf7, 0xe, 0xf7,
+                                                          0x78, 0xb4, 0xf7, 0xbe, 0xf7, 0xb, 0xe4, 0x67,
+                                                          0xe4, 0xfb, 0x3, 0xfb, 0x5a, 0x40, 0xfb, 0x8f,
+                                                          0xfb, 0x2b, 0x1e, 0xc0, 0x8e, 0x15, 0xf7, 0x13,
+                                                          0xd0, 0xf7, 0x6e, 0xf7, 0x1d, 0xdf, 0x9d, 0x41,
+                                                          0x4f, 0xfb, 0x46, 0x3b, 0xfb, 0x43, 0xfb, 0xd,
+                                                          0x39, 0x72, 0xd3, 0xd1, 0x1e, 0xe, 0x8b, 0xc2,
+                                                          0x54, 0xc6, 0xf8, 0x9f, 0x77, 0x1, 0xf7, 0xad,
+                                                          0xc2, 0x3, 0xe6, 0x16, 0xf8, 0x2a, 0x36, 0xa,
+                                                          0xfb, 0x40, 0x6, 0xf2, 0xf8, 0xa3, 0xfb, 0x7c,
+                                                          0x58, 0x80, 0x53, 0xf7, 0x42, 0xb0, 0x32, 0x7a,
+                                                          0xa, 0xfb, 0x47, 0x6, 0xe, 0x8b, 0xc2, 0x54,
+                                                          0xc6, 0xf8, 0x6b, 0xc0, 0x12, 0xf7, 0x34, 0xc3,
+                                                          0xf7, 0xaa, 0xc2, 0x13, 0xb8, 0xbe, 0x16, 0xf8,
+                                                          0x31, 0x6, 0xa3, 0xf7, 0x13, 0x52, 0xa, 0x7e,
+                                                          0x43, 0x5, 0xfb, 0xa9, 0x6, 0xf7, 0xff, 0xf7,
+                                                          0x7a, 0xb6, 0xb8, 0xf7, 0x9, 0x1a, 0xd3, 0x39,
+                                                          0xc8, 0x37, 0x3e, 0x4a, 0x7f, 0x43, 0x49, 0x1e,
+                                                          0x7c, 0x43, 0x51, 0xa, 0xe5, 0x99, 0xdb, 0x98,
+                                                          0xc4, 0x1b, 0xd3, 0xc2, 0x65, 0x53, 0x1f, 0x13,
+                                                          0x78, 0xfb, 0x7, 0xfb, 0x8b, 0xfb, 0xd, 0xfb,
+                                                          0x4d, 0xfb, 0x1e, 0x1e, 0xe, 0x7c, 0xc2, 0xf7,
+                                                          0x63, 0xc7, 0xf7, 0x96, 0xc4, 0x1, 0xf8, 0x31,
+                                                          0xc3, 0x3, 0xd3, 0xa2, 0x15, 0x71, 0xcc, 0xd0,
+                                                          0x7f, 0xce, 0x1b, 0xf7, 0x10, 0xf7, 0x0, 0xd0,
+                                                          0xf7, 0x17, 0xd5, 0x4d, 0xa3, 0x6d, 0x92, 0x1f,
+                                                          0xbd, 0xa4, 0xcc, 0xbb, 0xec, 0x1a, 0xda, 0x38,
+                                                          0xb3, 0x33, 0x8c, 0x1e, 0x4b, 0x49, 0x79, 0x6a,
+                                                          0x61, 0x1f, 0x9a, 0x58, 0x5, 0xa4, 0xa8, 0xcb,
+                                                          0xa3, 0xc9, 0x1b, 0xc6, 0xc2, 0x76, 0x53, 0x4a,
+                                                          0x39, 0x41, 0x20, 0x1f, 0x88, 0x6, 0x80, 0x4b,
+                                                          0x5, 0xc8, 0x8e, 0xf7, 0xb, 0x88, 0x43, 0x1a,
+                                                          0x32, 0x32, 0x59, 0x26, 0x50, 0x57, 0x97, 0xa3,
+                                                          0x5a, 0x1e, 0xe, 0x8b, 0xc7, 0xf3, 0xc6, 0xf7,
+                                                          0xa8, 0xcc, 0x1, 0xf7, 0xe8, 0xcd, 0x3, 0xde,
+                                                          0xf7, 0x38, 0x15, 0xf7, 0xa9, 0x6, 0x77, 0xfb,
+                                                          0x0, 0x5, 0x20, 0x60, 0xa, 0xf7, 0x91, 0x3c,
+                                                          0xa, 0x3b, 0x6, 0x9e, 0xf7, 0x0, 0x5, 0xdb,
+                                                          0x6, 0x96, 0xc6, 0x89, 0xa, 0xcf, 0xf7, 0xe9,
+                                                          0x5, 0x30, 0x6, 0xfb, 0xd4, 0xfb, 0xf0, 0x5,
+                                                          0xd8, 0x92, 0x15, 0xf7, 0x96, 0xf7, 0xa8, 0x51,
+                                                          0xfb, 0xa8, 0x5, 0xe, 0x7c, 0xc6, 0xf7, 0x9f,
+                                                          0xc6, 0xf7, 0x1e, 0xc3, 0x1, 0xf7, 0x1e, 0xcb,
+                                                          0xf7, 0x5d, 0xca, 0x3, 0xc2, 0xa5, 0x15, 0x6f,
+                                                          0xc4, 0xc7, 0x7e, 0xc3, 0x1b, 0xf7, 0x27, 0xf7,
+                                                          0x12, 0xd6, 0xf7, 0x22, 0xde, 0x45, 0xc8, 0x3a,
+                                                          0x5c, 0x54, 0x87, 0x72, 0x5d, 0x1f, 0xb2, 0xf7,
+                                                          0x53, 0x5, 0xf7, 0xb9, 0x3c, 0xa, 0xfb, 0xf1,
+                                                          0x6, 0x51, 0xfb, 0xc1, 0xb0, 0x81, 0x5, 0x9e,
+                                                          0xb5, 0xcb, 0x9d, 0xba, 0x1b, 0xd0, 0xb4, 0x63,
+                                                          0x54, 0x2d, 0x23, 0x50, 0x20, 0x55, 0x54, 0x96,
+                                                          0xa8, 0x62, 0x1f, 0xe, 0x7c, 0xc6, 0xf7, 0x99,
+                                                          0x76, 0xf7, 0x84, 0xc3, 0x1, 0xca, 0xc6, 0xf7,
+                                                          0x9f, 0xc9, 0x3, 0xf7, 0x16, 0xf7, 0x9c, 0x15,
+                                                          0xf7, 0x25, 0xa5, 0xf7, 0x4e, 0xf7, 0x7, 0xf7,
+                                                          0x4a, 0x1b, 0x98, 0xc3, 0x5, 0xfb, 0xa5, 0xfb,
+                                                          0x5d, 0xfb, 0x2f, 0xfb, 0x7c, 0xfb, 0x28, 0xd8,
+                                                          0x4f, 0xe8, 0xf7, 0x1d, 0xdc, 0xec, 0xf7, 0xc,
+                                                          0xe6, 0x34, 0xbb, 0x38, 0x4e, 0x50, 0x67, 0x62,
+                                                          0x6c, 0x1f, 0x83, 0x46, 0x15, 0xbc, 0xa0, 0xc9,
+                                                          0xb3, 0xca, 0x1b, 0xce, 0xc1, 0x6e, 0x44, 0x45,
+                                                          0x4e, 0x41, 0x2f, 0x36, 0x63, 0xd9, 0xd8, 0x96,
+                                                          0x1f, 0xe, 0xa0, 0x76, 0xf8, 0x91, 0xc2, 0x1,
+                                                          0xe0, 0xc0, 0xf7, 0xc8, 0xc5, 0x3, 0xf7, 0x32,
+                                                          0x16, 0xc6, 0x6, 0xf7, 0xb3, 0xf8, 0x8d, 0x96,
+                                                          0xc6, 0x5, 0xfc, 0x1d, 0x6, 0x66, 0xfb, 0x29,
+                                                          0x5, 0xc0, 0x6, 0xa6, 0xe9, 0x5, 0xf7, 0xad,
+                                                          0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x6d, 0xc8, 0xf7,
+                                                          0x5f, 0xc6, 0x1, 0xd3, 0xcb, 0xf7, 0x9b, 0xc9,
+                                                          0x3, 0xf7, 0x60, 0xf7, 0xb9, 0x15, 0x64, 0x85,
+                                                          0x2e, 0x4a, 0x31, 0x1a, 0x2b, 0xcf, 0x58, 0xf6,
+                                                          0xf7, 0x25, 0xea, 0xd8, 0xf7, 0xb, 0xd0, 0x5a,
+                                                          0xa8, 0x6d, 0x99, 0x1e, 0xc0, 0x93, 0xce, 0xc9,
+                                                          0xea, 0x1a, 0xc3, 0x54, 0xcd, 0x23, 0xfb, 0x8,
+                                                          0xfb, 0x3, 0x44, 0xfb, 0xc, 0x1e, 0x8c, 0x5f,
+                                                          0xa4, 0x6b, 0xaf, 0x77, 0x8, 0x89, 0xec, 0x15,
+                                                          0xf7, 0x5, 0xf7, 0x6, 0xa1, 0xb0, 0xcf, 0xb9,
+                                                          0x63, 0x62, 0x41, 0x42, 0x57, 0x39, 0x6d, 0x3b,
+                                                          0x95, 0xc9, 0x1e, 0x49, 0xfb, 0xa1, 0x15, 0xf7,
+                                                          0x6, 0xf7, 0xa, 0xa5, 0xba, 0xcb, 0xc7, 0x61,
+                                                          0x5b, 0x2e, 0x28, 0x62, 0x47, 0x62, 0x3a, 0xa4,
+                                                          0xc6, 0x1e, 0xe, 0x7d, 0xc7, 0xf7, 0x41, 0xc4,
+                                                          0xf7, 0x8e, 0xc1, 0x1, 0xf7, 0x25, 0xc4, 0xf7,
+                                                          0xab, 0xc6, 0x3, 0xc6, 0x7d, 0x15, 0xf8, 0x9,
+                                                          0xf7, 0x0, 0xf7, 0x55, 0xf7, 0x78, 0xe9, 0x58,
+                                                          0xda, 0xfb, 0x5, 0xfb, 0x18, 0x28, 0x20, 0xfb,
+                                                          0x4, 0x1f, 0x42, 0x8c, 0xbf, 0x46, 0xf3, 0x1b,
+                                                          0xc6, 0xca, 0x93, 0xb6, 0xb4, 0x1f, 0x66, 0xfb,
+                                                          0xe, 0x26, 0xfb, 0x0, 0xfb, 0x94, 0x8d, 0x8,
+                                                          0xf8, 0x2e, 0xf7, 0xce, 0x15, 0x64, 0x71, 0x4c,
+                                                          0x62, 0x42, 0x1b, 0x43, 0x5e, 0xb4, 0xbf, 0xe2,
+                                                          0xd9, 0xd1, 0xe7, 0xe9, 0xa5, 0x30, 0x3c, 0x80,
+                                                          0x1f, 0xe, 0x7c, 0xf7, 0x10, 0xf7, 0x2c, 0xf7,
+                                                          0x10, 0x1, 0xf7, 0x5a, 0xf7, 0x24, 0x3, 0xf7,
+                                                          0x5a, 0xae, 0x35, 0xa, 0xc6, 0xf7, 0xa8, 0x35,
+                                                          0xa, 0xe, 0xf7, 0x99, 0xf7, 0x10, 0x1, 0xf7,
+                                                          0x32, 0xcb, 0xd7, 0xf7, 0x24, 0x3, 0xf7, 0x32,
+                                                          0xfb, 0x4, 0x15, 0xcb, 0x6, 0xf7, 0x2a, 0xf7,
+                                                          0x8f, 0x5, 0x2e, 0x6, 0x9e, 0xf7, 0x40, 0x35,
+                                                          0xa, 0xe, 0xca, 0x76, 0xf7, 0xfe, 0xcf, 0x1,
+                                                          0xd4, 0xd5, 0x3, 0xd4, 0xf7, 0x6c, 0x15, 0xf7,
+                                                          0xfa, 0xfb, 0x42, 0x9c, 0xc9, 0xfb, 0xc1, 0xf7,
+                                                          0x2d, 0xf8, 0x3, 0xf7, 0x27, 0x98, 0xcf, 0xfc,
+                                                          0x48, 0xfb, 0x42, 0x5, 0xe, 0xf7, 0x1e, 0xc8,
+                                                          0xf7, 0x7, 0xc9, 0x1, 0xe0, 0xf7, 0xce, 0x15,
+                                                          0xf8, 0x56, 0x6, 0x95, 0xc9, 0x5, 0xfc, 0x55,
+                                                          0x6, 0x61, 0xfb, 0x82, 0x15, 0xf8, 0x54, 0x6,
+                                                          0x97, 0xc8, 0x5, 0xfc, 0x55, 0x6, 0xe, 0xb5,
+                                                          0xcf, 0xf7, 0xc0, 0xc9, 0x1, 0xf8, 0x59, 0xd5,
+                                                          0x3, 0xd4, 0xb5, 0x15, 0xf8, 0x48, 0xf7, 0x42,
+                                                          0x9d, 0xdd, 0xfb, 0xfa, 0xf7, 0x42, 0x7a, 0x4d,
+                                                          0xf7, 0xc1, 0xfb, 0x2d, 0xfc, 0x3, 0xfb, 0x27,
+                                                          0x5, 0xe, 0x7c, 0xf7, 0xa, 0xf7, 0x44, 0xf7,
+                                                          0x23, 0xeb, 0xc1, 0x12, 0xf7, 0xb, 0xc1, 0x9c,
+                                                          0xc3, 0xf7, 0x48, 0xc1, 0x17, 0xf7, 0x52, 0xf7,
+                                                          0x44, 0x15, 0xc3, 0x6, 0x96, 0xc5, 0x5, 0xda,
+                                                          0x9b, 0xf7, 0x24, 0xc6, 0xf7, 0x17, 0x1a, 0xe0,
+                                                          0x43, 0xba, 0x2c, 0x50, 0x4b, 0x73, 0x7a, 0x59,
+                                                          0x1e, 0x13, 0xf4, 0x76, 0xfb, 0x1, 0x5, 0xc1,
+                                                          0x6, 0x97, 0xc9, 0x5, 0x9a, 0xb1, 0xb5, 0x9e,
+                                                          0xb3, 0x1b, 0xe7, 0xa8, 0x5e, 0x65, 0x2d, 0xfb,
+                                                          0x17, 0x5a, 0x36, 0x7e, 0x1f, 0x36, 0xfb, 0x8f,
+                                                          0x15, 0x70, 0x8c, 0x9f, 0x7b, 0xad, 0x1b, 0xae,
+                                                          0xb9, 0xa9, 0xb3, 0xa3, 0x75, 0xa3, 0x69, 0x62,
+                                                          0x63, 0x67, 0x64, 0x8c, 0x1f, 0xe, 0x7d, 0xb0,
+                                                          0xdf, 0xaf, 0xf7, 0x6e, 0xb0, 0xf7, 0x0, 0xb0,
+                                                          0x1, 0xb1, 0xb0, 0xeb, 0xb0, 0xf7, 0xe6, 0xb1,
+                                                          0x3, 0xf7, 0xe4, 0xf7, 0x3e, 0x15, 0x6e, 0x8a,
+                                                          0xa3, 0x69, 0xba, 0x1b, 0xf0, 0xd8, 0xf7, 0x18,
+                                                          0xf7, 0xb, 0xf7, 0xb, 0x2c, 0xcd, 0xfb, 0x6,
+                                                          0xfb, 0x58, 0xfb, 0x21, 0xfb, 0x34, 0xfb, 0x4d,
+                                                          0x21, 0xbd, 0x21, 0xf7, 0x32, 0xdf, 0xe7, 0xa9,
+                                                          0xb2, 0xd4, 0x1f, 0x83, 0xaf, 0x5, 0x58, 0x29,
+                                                          0x42, 0x7a, 0x49, 0x1b, 0x20, 0x47, 0xd1, 0xf5,
+                                                          0xf7, 0x1c, 0xe4, 0xf7, 0x3f, 0xf7, 0x5a, 0xf0,
+                                                          0xde, 0x5a, 0x20, 0x2d, 0x4b, 0xfb, 0x5, 0x49,
+                                                          0x71, 0x74, 0x9f, 0xae, 0x91, 0x1f, 0x90, 0xa2,
+                                                          0x99, 0xa3, 0x95, 0xa0, 0xc6, 0xf7, 0x12, 0x18,
+                                                          0x66, 0x6, 0x73, 0x59, 0x5, 0xc2, 0x85, 0x6b,
+                                                          0x8c, 0x7e, 0x1b, 0x2d, 0x37, 0x23, 0xfb, 0x11,
+                                                          0x6a, 0x9e, 0x6e, 0xb1, 0xb4, 0xb5, 0xa9, 0xac,
+                                                          0xa4, 0x1f, 0xad, 0xf7, 0x19, 0x15, 0x4a, 0x7e,
+                                                          0x50, 0x2c, 0x51, 0x1b, 0x71, 0x85, 0xa1, 0x9f,
+                                                          0xd8, 0xcd, 0xee, 0xca, 0xb0, 0x8a, 0x62, 0x7a,
+                                                          0x88, 0x1f, 0xe, 0x8b, 0xc1, 0xf6, 0xc1, 0xf7,
+                                                          0xb4, 0xc1, 0x1, 0x89, 0xf7, 0x65, 0xf7, 0x48,
+                                                          0xf7, 0x60, 0x3, 0x89, 0x16, 0xf7, 0x65, 0x2a,
+                                                          0xa, 0x32, 0x6, 0xca, 0xf7, 0x4, 0x5, 0xf7,
+                                                          0xab, 0x6, 0xa2, 0xfb, 0x4, 0x2c, 0xa, 0xf8,
+                                                          0x90, 0x32, 0xa, 0x58, 0xa, 0x4f, 0x6, 0xf7,
+                                                          0x6c, 0xf7, 0x3a, 0x15, 0xf7, 0x3f, 0xf7, 0xba,
+                                                          0xcb, 0xfb, 0xba, 0x5, 0xe, 0x8b, 0xc1, 0xf7,
+                                                          0x50, 0xc2, 0xf7, 0x67, 0xc1, 0x12, 0xf5, 0xc3,
+                                                          0xf7, 0xec, 0xc8, 0x62, 0xc7, 0x13, 0xe8, 0x13,
+                                                          0xe4, 0x98, 0x16, 0xf7, 0xc8, 0x6, 0xf7, 0x1a,
+                                                          0xf7, 0x5, 0xbd, 0xf7, 0x18, 0x8a, 0x1f, 0xbe,
+                                                          0x58, 0xae, 0x58, 0x95, 0x1e, 0x13, 0xe8, 0xd2,
+                                                          0x9e, 0xbd, 0xbb, 0xe9, 0x1a, 0xe8, 0x2c, 0xa9,
+                                                          0x2a, 0x1e, 0xfb, 0x9e, 0x45, 0xa, 0xdd, 0x6,
+                                                          0x2f, 0xfc, 0x5a, 0x6b, 0xa, 0xf7, 0x51, 0xf7,
+                                                          0x87, 0x15, 0xb5, 0xf7, 0x67, 0x5, 0xf7, 0x1d,
+                                                          0xf7, 0x1a, 0x89, 0x40, 0x2e, 0x24, 0x62, 0x37,
+                                                          0x1f, 0xfb, 0x45, 0xfb, 0x87, 0x15, 0xb3, 0xf7,
+                                                          0x50, 0x5, 0xf7, 0x1e, 0x6, 0x13, 0xf8, 0xc7,
+                                                          0xf5, 0x83, 0x4c, 0x30, 0xfb, 0x3, 0x71, 0x41,
+                                                          0x1f, 0xe, 0x79, 0xc2, 0xf8, 0x7d, 0xc1, 0x8a,
+                                                          0x77, 0x12, 0xbc, 0xc5, 0x13, 0xd0, 0xf8, 0x6e,
+                                                          0xf2, 0x15, 0x64, 0x4d, 0x42, 0x70, 0x46, 0x1b,
+                                                          0x22, 0x51, 0xc9, 0xf7, 0x2, 0xf7, 0x5a, 0xf7,
+                                                          0x12, 0xf7, 0xb, 0xf7, 0xe, 0xcc, 0xc1, 0x6b,
+                                                          0x5c, 0xaf, 0x1f, 0x78, 0x30, 0x6a, 0xa, 0x13,
+                                                          0xb0, 0xb8, 0xf7, 0x73, 0x52, 0xa, 0x7f, 0x4e,
+                                                          0x5, 0x13, 0xd0, 0xb9, 0x4a, 0x5d, 0x9b, 0x55,
+                                                          0x1b, 0xfb, 0x54, 0xfb, 0xa, 0xfb, 0x38, 0xfb,
+                                                          0x61, 0xfb, 0x15, 0xbd, 0x27, 0xf7, 0x2f, 0xdb,
+                                                          0xdf, 0xa8, 0xb8, 0xd2, 0x1f, 0xe, 0x3e, 0xa,
+                                                          0xf8, 0xab, 0xc3, 0x3, 0x80, 0x16, 0xf7, 0x87,
+                                                          0x6, 0xf7, 0x48, 0xf7, 0x47, 0xd7, 0xf7, 0xb6,
+                                                          0xf7, 0x37, 0xfb, 0x0, 0xac, 0xfb, 0x18, 0x1f,
+                                                          0xfb, 0x8b, 0x45, 0xa, 0xdb, 0x5e, 0xa, 0x3a,
+                                                          0x6, 0xf7, 0x1c, 0x16, 0xe6, 0x87, 0xa, 0xf7,
+                                                          0x5a, 0x85, 0xf7, 0x2, 0x9f, 0xfb, 0x3e, 0x1a,
+                                                          0xfb, 0x42, 0x23, 0xfb, 0x10, 0xfb, 0x4a, 0x1e,
+                                                          0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0x61, 0xa, 0x1,
+                                                          0x88, 0x16, 0xf8, 0x87, 0x6, 0xb1, 0xf7, 0x4f,
+                                                          0x62, 0xa, 0x70, 0xfb, 0x19, 0x5, 0xfb, 0xc4,
+                                                          0x6, 0xb3, 0xf7, 0x5b, 0x5, 0xf7, 0x39, 0x6,
+                                                          0x7a, 0x3a, 0x51, 0xa, 0xba, 0xf7, 0x6d, 0x62,
+                                                          0xa, 0x79, 0x39, 0x5, 0xfb, 0x39, 0x6, 0xb4,
+                                                          0xf7, 0x5d, 0x81, 0xa, 0x70, 0xfb, 0x1a, 0x5,
+                                                          0xc4, 0x6, 0xb1, 0xf7, 0x50, 0x5, 0xfc, 0x82,
+                                                          0x45, 0xa, 0xdf, 0x6, 0x2f, 0xfc, 0x5a, 0x6b,
+                                                          0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0x61, 0xa,
+                                                          0x1, 0xe3, 0xc4, 0xf7, 0x54, 0xc3, 0xf7, 0x6,
+                                                          0xc4, 0x3, 0x88, 0x16, 0xf7, 0xa3, 0x6, 0x97,
+                                                          0xc1, 0x55, 0xa, 0xb3, 0xf7, 0x5b, 0x5, 0xf7,
+                                                          0x3a, 0x6, 0x7d, 0x43, 0x51, 0xa, 0xb4, 0xf7,
+                                                          0x5b, 0x62, 0xa, 0x7c, 0x42, 0x5, 0xfb, 0x3a,
+                                                          0x6, 0xb3, 0xf7, 0x5d, 0x5, 0xf7, 0xc0, 0x6,
+                                                          0x6e, 0xfb, 0x23, 0x5, 0xc4, 0x6, 0xb3, 0xf7,
+                                                          0x59, 0x5, 0xfc, 0x80, 0x45, 0xa, 0xdb, 0x6,
+                                                          0x2f, 0xfc, 0x5a, 0x89, 0xa, 0xe, 0x79, 0xc2,
+                                                          0xf7, 0x39, 0xc2, 0xf7, 0xa0, 0xc2, 0x1, 0x9e,
+                                                          0xc4, 0xf8, 0x2b, 0xc3, 0x3, 0x34, 0xa, 0x3d,
+                                                          0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x60, 0xc1, 0xf7,
+                                                          0x58, 0xc1, 0x1, 0xcb, 0xc1, 0xf7, 0xa8, 0xc1,
+                                                          0x3, 0x70, 0x16, 0xf7, 0x6a, 0x2a, 0xa, 0x3b,
+                                                          0x6, 0xb4, 0xf7, 0x60, 0x5, 0xf7, 0xa7, 0x6,
+                                                          0x63, 0xfb, 0x60, 0x5, 0x3c, 0x2d, 0xa, 0xf7,
+                                                          0x68, 0x2a, 0xa, 0x3c, 0x6, 0xe5, 0x87, 0xa,
+                                                          0xda, 0x2a, 0xa, 0xfb, 0x68, 0x2d, 0xa, 0xda,
+                                                          0x6, 0x64, 0xfb, 0x58, 0x5, 0xfb, 0xa7, 0x6,
+                                                          0xb1, 0xf7, 0x58, 0x5, 0xdb, 0x2a, 0xa, 0xfb,
+                                                          0x6a, 0x2d, 0xa, 0xdb, 0x6, 0x31, 0xfc, 0x5a,
+                                                          0x89, 0xa, 0xe, 0x3e, 0xa, 0xaf, 0x16, 0xf8,
+                                                          0x2e, 0x47, 0xa, 0xfb, 0x44, 0x6, 0xec, 0x87,
+                                                          0xa, 0xf7, 0x40, 0x47, 0xa, 0xfc, 0x2a, 0x45,
+                                                          0xa, 0xf7, 0x43, 0x6, 0x2a, 0x58, 0xa, 0xfb,
+                                                          0x43, 0x6, 0xe, 0x79, 0xc1, 0xf8, 0x6b, 0xc2,
+                                                          0x1, 0xa2, 0xc3, 0xf7, 0xec, 0xc1, 0x3, 0x7b,
+                                                          0xb4, 0x15, 0x65, 0xe2, 0xca, 0x76, 0xce, 0x1b,
+                                                          0xf7, 0x22, 0xbb, 0x7c, 0xa, 0xf7, 0x15, 0x36,
+                                                          0xa, 0xfc, 0x12, 0x38, 0xa, 0xf7, 0x5b, 0x6,
+                                                          0x4b, 0xfb, 0xdc, 0x5, 0x3a, 0x7b, 0x5f, 0x4d,
+                                                          0x2d, 0x1b, 0x71, 0xfb, 0x1f, 0x91, 0xf7, 0xe,
+                                                          0xa3, 0x1f, 0x9a, 0xe6, 0x71, 0xa, 0xe, 0x3e,
+                                                          0xa, 0xd7, 0xc1, 0xf7, 0xec, 0xcf, 0x3, 0x7b,
+                                                          0x16, 0xf7, 0x6d, 0x2a, 0xa, 0x39, 0x6, 0xab,
+                                                          0xf7, 0x2d, 0xef, 0xdd, 0xa5, 0x5f, 0xb6, 0x41,
+                                                          0xae, 0x38, 0xa4, 0x33, 0x19, 0xf7, 0x2a, 0x2a,
+                                                          0xa, 0xfb, 0x9, 0x6, 0x76, 0xd2, 0x65, 0xdd,
+                                                          0x62, 0xcc, 0x8, 0x8b, 0x76, 0xad, 0x82, 0x9a,
+                                                          0x1e, 0xf7, 0x81, 0xf7, 0x4f, 0x5, 0xcb, 0x43,
+                                                          0xa, 0xd2, 0x6, 0xfb, 0xbf, 0xfb, 0x7f, 0xc3,
+                                                          0xf7, 0x7f, 0x5, 0xd0, 0x2a, 0xa, 0xfb, 0x6b,
+                                                          0x2d, 0xa, 0xe7, 0x6, 0x26, 0x58, 0xa, 0x3a,
+                                                          0x6, 0xe, 0x3e, 0xa, 0xf7, 0xb, 0xc3, 0x3,
+                                                          0x8b, 0x4, 0xf8, 0x96, 0x6, 0xb9, 0xf7, 0x87,
+                                                          0x71, 0xa, 0x68, 0xfb, 0x51, 0x5, 0xfb, 0xba,
+                                                          0x6, 0xe7, 0x87, 0xa, 0xf7, 0x14, 0x2a, 0xa,
+                                                          0xfb, 0xb9, 0x2d, 0xa, 0xf7, 0x0, 0x5e, 0xa,
+                                                          0xfb, 0x0, 0x6, 0xe, 0x3e, 0xa, 0x9f, 0xc3,
+                                                          0xf7, 0xfc, 0xc3, 0x3, 0x63, 0x16, 0xf7, 0x3c,
+                                                          0x47, 0xa, 0x4b, 0x6, 0xe6, 0x87, 0xa, 0x94,
+                                                          0x6, 0xd4, 0xfc, 0xf, 0x5, 0xb7, 0x6, 0xf7,
+                                                          0x73, 0xf8, 0xf, 0x5, 0x96, 0x5e, 0xa, 0x4f,
+                                                          0x5f, 0xa, 0xf7, 0x36, 0x2a, 0xa, 0x5c, 0x6,
+                                                          0xe6, 0x87, 0xa, 0xb9, 0x47, 0xa, 0xfb, 0x28,
+                                                          0x6, 0xfb, 0x5e, 0xfb, 0xec, 0x48, 0xf7, 0xec,
+                                                          0x5, 0xfb, 0x2b, 0x5f, 0xa, 0xbb, 0x5e, 0xa,
+                                                          0x5b, 0x6, 0xe, 0x8a, 0xc2, 0xf8, 0x59, 0xc2,
+                                                          0x1, 0x5e, 0x8a, 0x15, 0xf7, 0x80, 0x36, 0xa,
+                                                          0x28, 0x6, 0xe1, 0xf8, 0x41, 0xf7, 0x54, 0xfc,
+                                                          0x78, 0x5, 0xd6, 0x6, 0xf0, 0xf8, 0x90, 0x5,
+                                                          0xd8, 0x36, 0xa, 0xfb, 0x7b, 0x38, 0xa, 0xed,
+                                                          0x6, 0x35, 0xfc, 0x44, 0xfb, 0x53, 0xf8, 0x7b,
+                                                          0x5, 0xfb, 0x31, 0x56, 0xa, 0xdd, 0x6, 0x31,
+                                                          0xfc, 0x59, 0x5, 0x3a, 0x6, 0xe, 0x79, 0xc2,
+                                                          0xf8, 0x7c, 0xc2, 0x1, 0xad, 0xc2, 0xf8, 0x38,
+                                                          0xc3, 0x3, 0xad, 0xf7, 0x6c, 0x15, 0xfb, 0x19,
+                                                          0xd5, 0x26, 0xf7, 0x1c, 0xf7, 0x4b, 0xf7, 0x1e,
+                                                          0xf7, 0x4f, 0xf7, 0x50, 0xee, 0x5c, 0xf7, 0x10,
+                                                          0xfb, 0x33, 0xfb, 0x5a, 0xfb, 0x13, 0xfb, 0x5c,
+                                                          0xfb, 0x38, 0x1e, 0xc2, 0x89, 0x15, 0xf7, 0x3,
+                                                          0xdd, 0xf7, 0x5c, 0xf7, 0x43, 0xf7, 0x10, 0xb2,
+                                                          0x2e, 0x3c, 0xfb, 0x24, 0xfb, 0xb, 0xfb, 0x40,
+                                                          0xfb, 0x1b, 0x20, 0x50, 0xd9, 0xee, 0x1e, 0xe,
+                                                          0x8b, 0xc1, 0xf7, 0x31, 0xc1, 0xf7, 0x87, 0xc1,
+                                                          0x1, 0xf6, 0xc5, 0xf7, 0xfa, 0xc6, 0x3, 0x9c,
+                                                          0x16, 0xf7, 0xba, 0x2a, 0xa, 0xfb, 0x31, 0x6,
+                                                          0xab, 0xf7, 0x31, 0x5, 0xf7, 0x1a, 0x6, 0xf7,
+                                                          0x31, 0xe9, 0xcf, 0xf7, 0x27, 0xd2, 0x5c, 0xcc,
+                                                          0xfb, 0x15, 0x1f, 0xfb, 0xa7, 0x2d, 0xa, 0xdb,
+                                                          0x6, 0x2e, 0x58, 0xa, 0x3c, 0x6, 0xf7, 0x47,
+                                                          0xf7, 0x67, 0x15, 0xbc, 0xf7, 0x87, 0x5, 0xf7,
+                                                          0x1b, 0x6, 0xd0, 0xca, 0x6b, 0x52, 0xfb, 0x11,
+                                                          0x20, 0x6e, 0x4a, 0x1f, 0xe, 0xfb, 0x1e, 0xf7,
+                                                          0x41, 0xfb, 0x15, 0xf7, 0x15, 0x54, 0xc2, 0xf8,
+                                                          0x7e, 0xc2, 0x12, 0xae, 0xc7, 0xf8, 0x2f, 0xc6,
+                                                          0x13, 0x5c, 0xd9, 0x3f, 0x15, 0x91, 0x54, 0x5,
+                                                          0xaa, 0xb4, 0xb2, 0x91, 0xb2, 0x1b, 0xaa, 0xaa,
+                                                          0x7c, 0x80, 0xab, 0x1f, 0x13, 0x9c, 0x82, 0xa6,
+                                                          0xa6, 0x82, 0xa6, 0x1b, 0xae, 0xaf, 0x9b, 0x9f,
+                                                          0xa7, 0x1f, 0x7b, 0xba, 0x5, 0x7f, 0x73, 0x6f,
+                                                          0x7d, 0x70, 0x1b, 0x75, 0x75, 0x94, 0x94, 0x75,
+                                                          0x1f, 0x94, 0x74, 0x74, 0x98, 0x70, 0x1b, 0x7c,
+                                                          0x7a, 0x8c, 0x86, 0x7a, 0x1f, 0x13, 0x3c, 0xa9,
+                                                          0x9a, 0x8d, 0x8b, 0x95, 0x95, 0x8, 0xf7, 0x5f,
+                                                          0x8a, 0xf7, 0x12, 0xf7, 0x4a, 0xf7, 0x64, 0x1a,
+                                                          0xf7, 0x1, 0x5e, 0xf1, 0xfb, 0x33, 0xfb, 0x4f,
+                                                          0xfb, 0x1f, 0xfb, 0x5d, 0xfb, 0x4c, 0x23, 0xbd,
+                                                          0x3e, 0xeb, 0x6e, 0x1e, 0x6a, 0x70, 0x6a, 0x7a,
+                                                          0x66, 0x7a, 0x8, 0x9c, 0xf7, 0xa3, 0x15, 0xf7,
+                                                          0x2b, 0xf7, 0x1, 0xf7, 0x47, 0xf7, 0x25, 0xf1,
+                                                          0xc2, 0x4c, 0x36, 0xfb, 0x60, 0xfb, 0x26, 0xfb,
+                                                          0x1e, 0xfb, 0x0, 0x40, 0x39, 0xb0, 0xf7, 0xf,
+                                                          0x1e, 0xe, 0x8b, 0xc1, 0xf7, 0x45, 0xbf, 0xf7,
+                                                          0x75, 0xc1, 0x1, 0xf7, 0x4, 0xc2, 0xf7, 0xf9,
+                                                          0xc3, 0x3, 0x9f, 0x16, 0xf7, 0x6c, 0x2a, 0xa,
+                                                          0x3b, 0x6, 0xae, 0xf7, 0x43, 0x5, 0xf7, 0x7,
+                                                          0x6, 0xa8, 0x5c, 0xcc, 0xfb, 0x6, 0xa4, 0x47,
+                                                          0x8, 0xf7, 0x18, 0x2a, 0xa, 0x24, 0x6, 0x73,
+                                                          0xc1, 0x60, 0xd6, 0x6d, 0xbb, 0x8, 0xe5, 0x8e,
+                                                          0xf7, 0x3, 0xb6, 0xf7, 0x33, 0x1a, 0xcb, 0x59,
+                                                          0xc9, 0x29, 0x1e, 0xfb, 0xbf, 0x2d, 0xa, 0xdc,
+                                                          0x5e, 0xa, 0x3a, 0x6, 0xf7, 0x4a, 0xf7, 0x79,
+                                                          0x15, 0xb8, 0xf7, 0x75, 0x5, 0xf7, 0x24, 0x6,
+                                                          0xd6, 0xba, 0x6c, 0x60, 0xfb, 0x26, 0xfb, 0x1c,
+                                                          0x86, 0x42, 0x1f, 0xe, 0x77, 0xc5, 0xf8, 0x7b,
+                                                          0xc2, 0x1, 0xf7, 0xc, 0xc7, 0xf7, 0xbc, 0xc7,
+                                                          0x3, 0x98, 0x7f, 0x15, 0xc5, 0x6, 0x95, 0xbf,
+                                                          0x5, 0x65, 0xc1, 0xd6, 0x75, 0xd5, 0x1b, 0xf7,
+                                                          0x8, 0xf7, 0x1c, 0xbe, 0xf7, 0x5, 0xf7, 0x5,
+                                                          0x2d, 0x9f, 0x31, 0x95, 0x1f, 0x3d, 0x93, 0x2d,
+                                                          0xaa, 0xcf, 0x1a, 0xdf, 0xe3, 0xba, 0xf2, 0xc3,
+                                                          0xbc, 0x6f, 0x68, 0xab, 0x1e, 0x7a, 0x3b, 0x5,
+                                                          0xc5, 0x6, 0xb1, 0xf7, 0x4f, 0x62, 0xa, 0x82,
+                                                          0x63, 0x5, 0xa6, 0x68, 0x58, 0xa3, 0x54, 0x1b,
+                                                          0xfb, 0x3a, 0x2d, 0x3a, 0x20, 0xfb, 0x6, 0xf7,
+                                                          0xd, 0x6d, 0xe5, 0x7d, 0x1f, 0xc8, 0x80, 0xdf,
+                                                          0x82, 0x43, 0x1a, 0x47, 0x24, 0x67, 0x2f, 0x42,
+                                                          0x41, 0xa1, 0xb5, 0x63, 0x1e, 0x9a, 0xd0, 0x5,
+                                                          0x50, 0x6, 0xe, 0x3e, 0xa, 0xf7, 0x54, 0xc2,
+                                                          0x3, 0xc5, 0x16, 0xf7, 0xc2, 0x2a, 0xa, 0xfb,
+                                                          0x10, 0x6, 0xe5, 0x87, 0xa, 0xf7, 0x43, 0x6,
+                                                          0x6d, 0xfb, 0x2d, 0x6a, 0xa, 0xb4, 0xf7, 0x63,
+                                                          0x5, 0xfc, 0x98, 0x6, 0x62, 0xfb, 0x63, 0x6a,
+                                                          0xa, 0xa9, 0xf7, 0x2d, 0x5, 0xf7, 0x43, 0x6,
+                                                          0x32, 0x58, 0xa, 0xfb, 0xf, 0x6, 0xe, 0x79,
+                                                          0xbf, 0xf8, 0x6d, 0xc2, 0x1, 0xd2, 0xc0, 0x3,
+                                                          0xbf, 0xf8, 0x8f, 0x85, 0xa, 0x56, 0xfb, 0x8c,
+                                                          0x81, 0x46, 0x68, 0x1a, 0x22, 0xb3, 0x47, 0xf7,
+                                                          0x16, 0xf7, 0x11, 0xe2, 0xc4, 0xf7, 0x2d, 0xa8,
+                                                          0x1e, 0x9f, 0xf4, 0x9e, 0xf4, 0x9f, 0xf4, 0x8,
+                                                          0xd8, 0x36, 0xa, 0xfb, 0x7c, 0x67, 0xa, 0xad,
+                                                          0xae, 0x8b, 0xad, 0x1b, 0x77, 0x22, 0x78, 0x23,
+                                                          0x77, 0x22, 0x8, 0xfb, 0xe, 0x73, 0x3c, 0x66,
+                                                          0x3d, 0x1b, 0x32, 0x66, 0xb7, 0xdb, 0xbf, 0xb4,
+                                                          0xf7, 0x49, 0x9f, 0xf7, 0x8, 0x1f, 0xf5, 0x36,
+                                                          0xa, 0xfb, 0x83, 0x6, 0xe, 0x93, 0x76, 0xf8,
+                                                          0x9c, 0xc2, 0x1, 0xf7, 0x31, 0x7e, 0x85, 0xa,
+                                                          0xf7, 0xbb, 0xf8, 0x9c, 0x5, 0xcb, 0x36, 0xa,
+                                                          0xfb, 0x70, 0x38, 0xa, 0xe5, 0x6, 0xfb, 0x99,
+                                                          0xfc, 0x64, 0x3a, 0xf8, 0x64, 0x5, 0xe6, 0x46,
+                                                          0xa, 0xfb, 0x77, 0x38, 0xa, 0xd3, 0x6, 0xe,
+                                                          0x93, 0x76, 0xf8, 0x9c, 0xc2, 0x1, 0xb1, 0xc5,
+                                                          0x3, 0x9c, 0x7e, 0x15, 0xcb, 0x6, 0xf7, 0x4b,
+                                                          0xf8, 0x0, 0xbe, 0xfc, 0x0, 0x5, 0xc6, 0x6,
+                                                          0xf7, 0x32, 0xf8, 0x9c, 0x5, 0xb7, 0x46, 0xa,
+                                                          0xfb, 0x5d, 0x56, 0xa, 0xf2, 0x6, 0xfb, 0xe,
+                                                          0xfc, 0x36, 0x58, 0xf8, 0x0, 0x5, 0x63, 0x6,
+                                                          0xfb, 0x4f, 0xfc, 0x2, 0xaf, 0xf8, 0x38, 0x5,
+                                                          0xef, 0x36, 0xa, 0xfb, 0x5d, 0x56, 0xa, 0xba,
+                                                          0x6, 0xe, 0x3e, 0xa, 0x71, 0xf7, 0x76, 0xf7,
+                                                          0x9, 0xf7, 0x6a, 0x3, 0x71, 0x16, 0xf7, 0x76,
+                                                          0x2a, 0xa, 0x2b, 0x6, 0xf7, 0x53, 0xf7, 0x50,
+                                                          0xf7, 0x0, 0xfb, 0x50, 0x5, 0x35, 0x2d, 0xa,
+                                                          0xf7, 0x6a, 0x2a, 0xa, 0x4a, 0x6, 0xfb, 0x18,
+                                                          0xf7, 0x7b, 0xf7, 0x5f, 0xf7, 0x73, 0x5, 0xce,
+                                                          0x2a, 0xa, 0xfb, 0x55, 0x2d, 0xa, 0xca, 0x6,
+                                                          0xfb, 0x37, 0xfb, 0x49, 0x2c, 0xf7, 0x49, 0x5,
+                                                          0xd8, 0x2a, 0xa, 0xfb, 0x64, 0x45, 0xa, 0xcf,
+                                                          0x6, 0xf7, 0x9, 0xfb, 0x73, 0xfb, 0x79, 0xfb,
+                                                          0x7b, 0x5, 0x49, 0x6, 0xe, 0x3e, 0xa, 0xb4,
+                                                          0x16, 0xf7, 0xc8, 0x2a, 0xa, 0xfb, 0x11, 0x6,
+                                                          0xab, 0xf7, 0x42, 0xf7, 0x7f, 0xf7, 0xac, 0x5,
+                                                          0xcf, 0x2a, 0xa, 0xfb, 0x5b, 0x2d, 0xa, 0xd2,
+                                                          0x6, 0xfb, 0x54, 0xfb, 0x77, 0x27, 0xf7, 0x77,
+                                                          0x5, 0xd3, 0x43, 0xa, 0xd1, 0x6, 0xf7, 0xe,
+                                                          0xfb, 0xac, 0x6b, 0xfb, 0x42, 0x5, 0xfb, 0x12,
+                                                          0x6, 0xe, 0x3e, 0xa, 0xba, 0xd3, 0xf7, 0xda,
+                                                          0xc0, 0x3, 0xb1, 0x16, 0xf8, 0x38, 0x6, 0xb3,
+                                                          0xf7, 0x5f, 0x5, 0x56, 0x6, 0x6e, 0xfb, 0x29,
+                                                          0x5, 0xfb, 0xbd, 0x6, 0xf8, 0x46, 0xf8, 0x5d,
+                                                          0x94, 0xbe, 0x5, 0xfc, 0x19, 0x6, 0x66, 0xfb,
+                                                          0x50, 0x5, 0xbe, 0x6, 0xa5, 0xf7, 0x1a, 0x5,
+                                                          0xf7, 0xa0, 0x6, 0xfc, 0x46, 0xfc, 0x5b, 0x5,
+                                                          0xe, 0xfb, 0x0, 0xc1, 0xf9, 0x2, 0xc1, 0x1,
+                                                          0xf7, 0x1c, 0xfb, 0x0, 0x15, 0xf7, 0x4e, 0x2a,
+                                                          0xa, 0xfb, 0x19, 0x6, 0xf7, 0xc, 0xf9, 0x2,
+                                                          0x5, 0xf7, 0x19, 0x2a, 0xa, 0xfb, 0x4e, 0x6,
+                                                          0xe, 0x23, 0xf9, 0x60, 0xfd, 0x33, 0x76, 0xf9,
+                                                          0x59, 0x77, 0x12, 0x13, 0x60, 0xf8, 0xb, 0xfb,
+                                                          0xd, 0x15, 0x13, 0x80, 0xba, 0x9c, 0x5, 0x13,
+                                                          0x60, 0xfb, 0x5a, 0xf9, 0x71, 0x5, 0x13, 0x80,
+                                                          0x5c, 0x7a, 0x5, 0xe, 0xfb, 0x0, 0xc1, 0xf9,
+                                                          0x2, 0xc1, 0x1, 0xf7, 0x27, 0x55, 0x15, 0x80,
+                                                          0x55, 0x5, 0xf7, 0x4e, 0x6, 0xf7, 0x22, 0xf9,
+                                                          0x6e, 0x5, 0xfb, 0x4e, 0x2d, 0xa, 0xf7, 0x19,
+                                                          0x6, 0xfb, 0xc, 0xfd, 0x2, 0x5, 0xe, 0xf7,
+                                                          0xf7, 0xf7, 0x9f, 0x12, 0xf2, 0xf8, 0x27, 0x17,
+                                                          0xe9, 0xf7, 0xf6, 0x15, 0xdc, 0xa6, 0xe1, 0xc6,
+                                                          0xce, 0xc4, 0xb9, 0x4f, 0xc1, 0x53, 0xd0, 0x71,
+                                                          0x94, 0xba, 0x18, 0x3b, 0xd7, 0x7c, 0xb8, 0x78,
+                                                          0xee, 0x8, 0x58, 0x6, 0x13, 0x40, 0x58, 0x2d,
+                                                          0x3c, 0x54, 0xfb, 0x0, 0x43, 0x8, 0xe, 0xfb,
+                                                          0x11, 0xbd, 0x1, 0x90, 0x40, 0x15, 0x81, 0x59,
+                                                          0x5, 0xf8, 0xed, 0x6, 0x95, 0xbd, 0x5, 0xe,
+                                                          0x65, 0xa, 0xf7, 0x61, 0xf8, 0xeb, 0x15, 0xf7,
+                                                          0x46, 0x25, 0x97, 0xaa, 0xfb, 0x31, 0x79, 0xa,
+                                                          0xf8, 0x20, 0x87, 0x15, 0xf7, 0x1f, 0x36, 0xa,
+                                                          0x36, 0x6, 0xbf, 0xf7, 0x97, 0x8b, 0x9e, 0x9b,
+                                                          0x1a, 0xc7, 0x5a, 0xaf, 0x25, 0x46, 0x36, 0x77,
+                                                          0x73, 0x4b, 0x1e, 0x39, 0xa, 0xc8, 0xc1, 0x8c,
+                                                          0x54, 0x77, 0x87, 0x5c, 0x85, 0x73, 0x1f, 0x92,
+                                                          0x5f, 0x5a, 0x92, 0x5a, 0x1b, 0xfb, 0x45, 0x41,
+                                                          0x38, 0x3f, 0x52, 0xb9, 0x56, 0xe6, 0xd8, 0xda,
+                                                          0xaf, 0xc0, 0xcd, 0x1f, 0x98, 0xd2, 0x15, 0x50,
+                                                          0x4b, 0x3e, 0x5d, 0x38, 0x1b, 0x56, 0x66, 0xa8,
+                                                          0xab, 0xdb, 0xf7, 0x7, 0x9c, 0xdb, 0x40, 0xa,
+                                                          0x7c, 0xc2, 0x5f, 0xc3, 0xf7, 0xe8, 0xc3, 0xf7,
+                                                          0x12, 0xc2, 0x12, 0xf8, 0xb0, 0xc5, 0x13, 0x78,
+                                                          0x8d, 0x87, 0x15, 0xf7, 0x21, 0x6, 0x9a, 0xdb,
+                                                          0x5, 0x13, 0xb8, 0x7b, 0x96, 0xa8, 0x40, 0xf7,
+                                                          0x14, 0x1b, 0xf7, 0x33, 0xf7, 0x5, 0xf7, 0x18,
+                                                          0xf7, 0x2f, 0xf7, 0x7, 0x32, 0xc8, 0x30, 0xfb,
+                                                          0x1, 0x46, 0x56, 0x72, 0x75, 0x1f, 0xbe, 0xf7,
+                                                          0x97, 0x66, 0xa, 0xe0, 0x6, 0x13, 0x78, 0x24,
+                                                          0xfc, 0x9e, 0x5, 0x35, 0x6, 0xf7, 0x48, 0xf7,
+                                                          0x45, 0x15, 0xf5, 0xa0, 0xed, 0xc4, 0xe4, 0x1b,
+                                                          0xea, 0xb7, 0x4c, 0x48, 0x1f, 0x13, 0xb8, 0xfb,
+                                                          0xe, 0xfb, 0x1, 0x27, 0x26, 0x3a, 0x3a, 0xcb,
+                                                          0xf7, 0x11, 0xa4, 0x1e, 0xe, 0x7c, 0xc0, 0xf7,
+                                                          0xf0, 0xc2, 0x12, 0xbc, 0xc5, 0xf7, 0xf5, 0xc2,
+                                                          0x17, 0xf8, 0x71, 0xf7, 0x9, 0x15, 0x76, 0x6d,
+                                                          0x31, 0x51, 0x3a, 0x1b, 0xfb, 0xe, 0x5c, 0xcd,
+                                                          0xc8, 0x1f, 0x13, 0x50, 0xf7, 0x5, 0xe8, 0xf7,
+                                                          0x0, 0xf7, 0x17, 0xc4, 0xbe, 0x7c, 0x67, 0xaf,
+                                                          0x1e, 0x7c, 0x3c, 0x6a, 0xa, 0x13, 0xe0, 0xaf,
+                                                          0xf7, 0x4d, 0x52, 0xa, 0x82, 0x5c, 0x5, 0xa9,
+                                                          0x63, 0x5d, 0x9c, 0x51, 0x1b, 0xfb, 0x5b, 0x2c,
+                                                          0xfb, 0x29, 0xfb, 0x15, 0xfb, 0x5, 0xe5, 0x4a,
+                                                          0xf7, 0x2, 0xe8, 0xd8, 0xab, 0xb9, 0xd0, 0x1f,
+                                                          0xe, 0x7c, 0xc2, 0x61, 0xc2, 0xf7, 0xe7, 0xc2,
+                                                          0xf7, 0x13, 0xc2, 0x12, 0xa1, 0xc5, 0x13, 0x78,
+                                                          0xf8, 0x1f, 0x89, 0x15, 0xf7, 0x1f, 0x36, 0xa,
+                                                          0x39, 0x6, 0xf7, 0x6, 0xf8, 0xd4, 0x5, 0xfb,
+                                                          0x58, 0x38, 0xa, 0xf7, 0x20, 0x6, 0x65, 0xfb,
+                                                          0x57, 0x5, 0xc9, 0x64, 0x46, 0x91, 0x54, 0x1b,
+                                                          0xfb, 0x33, 0xfb, 0x14, 0xfb, 0x16, 0xfb, 0x2c,
+                                                          0x1f, 0x13, 0xb8, 0x2a, 0xca, 0x38, 0xf7, 0x14,
+                                                          0xd4, 0xd8, 0xac, 0xc9, 0xbb, 0x1e, 0x13, 0x78,
+                                                          0xfb, 0xdf, 0xf7, 0x0, 0x15, 0xf4, 0xf3, 0xee,
+                                                          0xf7, 0x3, 0xf7, 0x0, 0xb2, 0x53, 0x52, 0x1e,
+                                                          0x13, 0xb8, 0xfb, 0xd, 0xfb, 0x1, 0xfb, 0xa,
+                                                          0xfb, 0x0, 0x26, 0x5f, 0xd1, 0xd9, 0x1e, 0xe,
+                                                          0x7c, 0xc0, 0xf7, 0x31, 0xc2, 0xf7, 0x21, 0xbd,
+                                                          0x1, 0xe4, 0xf7, 0x57, 0x15, 0xf8, 0x3b, 0x6,
+                                                          0x90, 0xa4, 0x8d, 0xa4, 0x8a, 0xa3, 0x8, 0xea,
+                                                          0x88, 0x51, 0xd8, 0xfb, 0x17, 0x1b, 0xfb, 0x35,
+                                                          0xfb, 0x1e, 0xfb, 0x19, 0xfb, 0x3d, 0x35, 0xd3,
+                                                          0x47, 0xf7, 0x21, 0xde, 0xe5, 0xa5, 0xaf, 0xd4,
+                                                          0x1f, 0x84, 0xbf, 0x5, 0x60, 0x32, 0x38, 0x79,
+                                                          0x5c, 0x1b, 0xfb, 0x7, 0x30, 0xc0, 0xf3, 0xae,
+                                                          0x1f, 0x9c, 0xc3, 0x15, 0xc6, 0x9f, 0xda, 0xdc,
+                                                          0xf7, 0x7, 0x1b, 0xf7, 0x21, 0x92, 0xfb, 0x8,
+                                                          0x72, 0x86, 0x1f, 0xe, 0x8b, 0xc2, 0xf7, 0xd9,
+                                                          0xc3, 0xf7, 0x1e, 0xc2, 0x1, 0xf7, 0x26, 0xc5,
+                                                          0x3, 0xa5, 0x16, 0xf8, 0x18, 0x36, 0xa, 0xfb,
+                                                          0x71, 0x6, 0xcb, 0xf7, 0xd9, 0x5, 0xf7, 0x71,
+                                                          0x3c, 0xa, 0xfb, 0x71, 0x6, 0xf7, 0x11, 0xab,
+                                                          0x87, 0x98, 0xf7, 0x9, 0x1b, 0xb2, 0xc3, 0x85,
+                                                          0x85, 0xaf, 0x1f, 0x9e, 0xc1, 0x5, 0x90, 0x6a,
+                                                          0x49, 0x93, 0x61, 0x1b, 0x3d, 0x31, 0x82, 0x3f,
+                                                          0x79, 0x1f, 0x71, 0xfb, 0x0, 0x5, 0xfb, 0x1,
+                                                          0x6, 0x81, 0x53, 0x5, 0xf7, 0x1, 0x6, 0x4a,
+                                                          0xfb, 0xd9, 0x57, 0xa, 0xe, 0xfb, 0x31, 0xbd,
+                                                          0xf7, 0x38, 0xbe, 0xf7, 0xae, 0xbe, 0x1, 0xab,
+                                                          0xc3, 0xf7, 0xca, 0xbf, 0x3, 0x3f, 0xa, 0x30,
+                                                          0xa, 0xe, 0x8b, 0xc2, 0xf7, 0xca, 0xc2, 0xf7,
+                                                          0x2e, 0xc2, 0x1, 0x9f, 0x16, 0xf7, 0x72, 0x36,
+                                                          0xa, 0x38, 0x6, 0xbf, 0xf7, 0x99, 0x5, 0xb6,
+                                                          0xc3, 0xd2, 0xb7, 0xcc, 0x1b, 0xdf, 0x90, 0x59,
+                                                          0x54, 0x81, 0x1f, 0x5a, 0xfb, 0x87, 0x5, 0x37,
+                                                          0x38, 0xa, 0xf7, 0x6f, 0x36, 0xa, 0x3a, 0x6,
+                                                          0xc0, 0xf7, 0x9d, 0x5, 0xca, 0x97, 0x85, 0xd6,
+                                                          0xfb, 0xa, 0x1b, 0x45, 0x40, 0x66, 0x5e, 0x4f,
+                                                          0x1f, 0xba, 0xf7, 0x91, 0x66, 0xa, 0xe2, 0x6,
+                                                          0x25, 0xfc, 0x9b, 0x7b, 0xa, 0xe, 0x8b, 0xc2,
+                                                          0xf7, 0xda, 0xc2, 0xed, 0xf7, 0xf, 0x1, 0xf7,
+                                                          0xe6, 0xf8, 0xaa, 0x15, 0xd1, 0x6, 0xa4, 0xf7,
+                                                          0xf, 0x5, 0x44, 0x6, 0xfb, 0xb8, 0xfd, 0x25,
+                                                          0x15, 0xf8, 0x2d, 0x36, 0xa, 0xfb, 0x42, 0x6,
+                                                          0xd4, 0xf8, 0x11, 0x5, 0xfb, 0x5b, 0x38, 0xa,
+                                                          0xf7, 0x25, 0x6, 0x4b, 0xfb, 0xda, 0x5, 0xfb,
+                                                          0x47, 0x6, 0xe, 0xfb, 0x31, 0xc1, 0xf8, 0x84,
+                                                          0xbf, 0xe9, 0xf7, 0xa, 0x1, 0xf8, 0x50, 0xf8,
+                                                          0xaf, 0x54, 0xa, 0xfc, 0x23, 0xfd, 0x80, 0x15,
+                                                          0x76, 0x59, 0x5, 0x82, 0xbe, 0xbe, 0x84, 0xbb,
+                                                          0x1b, 0xf6, 0xe0, 0xb6, 0xf7, 0x12, 0xaf, 0x1f,
+                                                          0xea, 0xf8, 0x45, 0x5, 0xfb, 0xe2, 0x82, 0xa,
+                                                          0xf7, 0xa5, 0x6, 0x39, 0xfc, 0x3, 0x5, 0xfb,
+                                                          0x9, 0x61, 0x46, 0x7f, 0x5c, 0x1b, 0x51, 0x5c,
+                                                          0x91, 0x91, 0x68, 0x1f, 0xe, 0x8b, 0xc2, 0xf7,
+                                                          0xd9, 0xc2, 0xf7, 0x1f, 0xc2, 0x1, 0x97, 0x16,
+                                                          0xf7, 0x20, 0x6, 0xb1, 0xf7, 0x5a, 0xcd, 0xb5,
+                                                          0xad, 0x6a, 0xcd, 0x31, 0xb0, 0x4d, 0x19, 0x53,
+                                                          0x38, 0xa, 0xf7, 0x6a, 0x46, 0xa, 0x2b, 0x6,
+                                                          0x6d, 0xba, 0x6d, 0xc5, 0x67, 0xb3, 0x4f, 0xcf,
+                                                          0x18, 0xf7, 0x47, 0xf7, 0x4, 0x5, 0xed, 0x77,
+                                                          0xa, 0xfb, 0x70, 0x6, 0x82, 0x54, 0x5, 0xb9,
+                                                          0x6, 0xfb, 0x5f, 0xfb, 0x13, 0xd5, 0xf8, 0xc,
+                                                          0x66, 0xa, 0xe1, 0x6, 0x26, 0xfc, 0x9b, 0x5,
+                                                          0x36, 0x6, 0xe, 0x8b, 0xc2, 0xf8, 0x9b, 0xc2,
+                                                          0x1, 0xe5, 0x16, 0xf8, 0x2d, 0x36, 0xa, 0xfb,
+                                                          0x43, 0x6, 0xf7, 0x1, 0xf8, 0xd2, 0x5, 0xfb,
+                                                          0x6b, 0x38, 0xa, 0xf7, 0x34, 0x6, 0x29, 0xfc,
+                                                          0x9b, 0x5, 0xfb, 0x47, 0x6, 0xe, 0x8b, 0xc1,
+                                                          0xf7, 0xe0, 0xc2, 0x7e, 0x77, 0x12, 0x13, 0xc0,
+                                                          0x91, 0x16, 0xf7, 0x11, 0x47, 0xa, 0x49, 0x6,
+                                                          0xc5, 0xf7, 0xa2, 0x5, 0xa7, 0xa6, 0xac, 0xad,
+                                                          0xbb, 0x1b, 0xbc, 0x96, 0x6d, 0x72, 0x7d, 0x88,
+                                                          0x7f, 0x8a, 0x87, 0x1f, 0x4c, 0xfb, 0xc1, 0x5,
+                                                          0xf7, 0x12, 0x2a, 0xa, 0x49, 0x6, 0xc2, 0xf7,
+                                                          0x97, 0x5, 0x96, 0x8d, 0xca, 0xcb, 0xc0, 0x1b,
+                                                          0xb3, 0x97, 0x77, 0x72, 0x78, 0x86, 0x74, 0x87,
+                                                          0x78, 0x1f, 0x50, 0xfb, 0xae, 0x5, 0xf7, 0x7,
+                                                          0x2a, 0xa, 0x53, 0x6, 0xc5, 0xf7, 0xa5, 0x8d,
+                                                          0x9b, 0x99, 0x1a, 0xba, 0x6d, 0xb0, 0x4c, 0x55,
+                                                          0x5a, 0x69, 0x67, 0x66, 0x1e, 0xb0, 0x83, 0x6e,
+                                                          0xac, 0x55, 0x1b, 0x5b, 0x64, 0x69, 0x74, 0x68,
+                                                          0x1f, 0x13, 0xa0, 0x93, 0xb7, 0x5, 0xfb, 0x7,
+                                                          0x5f, 0xa, 0xc3, 0x6, 0xe, 0x8b, 0xc1, 0xf7,
+                                                          0xc8, 0xc2, 0x6d, 0xc1, 0x12, 0xf7, 0x7, 0xc1,
+                                                          0xf7, 0xa5, 0xc1, 0x13, 0xd8, 0x9f, 0x16, 0xf7,
+                                                          0x72, 0x2a, 0xa, 0x37, 0x6, 0xbb, 0xf7, 0x86,
+                                                          0x5, 0x13, 0xb8, 0xbf, 0xc9, 0xe1, 0xb2, 0xd6,
+                                                          0x1b, 0xb5, 0x97, 0x79, 0x6a, 0x82, 0x8a, 0x81,
+                                                          0x89, 0x80, 0x1f, 0x5a, 0xfb, 0x90, 0x5, 0x38,
+                                                          0x2d, 0xa, 0xf7, 0x70, 0x2a, 0xa, 0x38, 0x6,
+                                                          0xbd, 0xf7, 0x91, 0x5, 0x8f, 0x9e, 0x8c, 0x9c,
+                                                          0x9b, 0x1a, 0xbf, 0x62, 0xa9, 0x40, 0x45, 0x3f,
+                                                          0x63, 0x5e, 0x4f, 0x1e, 0x99, 0xd3, 0x5, 0xfb,
+                                                          0x1e, 0x38, 0xa, 0xde, 0x6, 0x4d, 0xfb, 0xd3,
+                                                          0x5, 0x37, 0x6, 0xe, 0x7c, 0xc1, 0xf7, 0xf0,
+                                                          0xc1, 0x1, 0xc4, 0xc2, 0xf8, 0xb, 0xc3, 0x3,
+                                                          0xc4, 0xf7, 0x3b, 0x15, 0xfb, 0x0, 0xd5, 0x41,
+                                                          0xf7, 0x17, 0xf7, 0x39, 0xf7, 0x8, 0xf7, 0x13,
+                                                          0xf7, 0x2c, 0xde, 0x5d, 0xe9, 0xfb, 0x2b, 0xfb,
+                                                          0x28, 0xfb, 0x21, 0xfb, 0x2, 0xfb, 0x38, 0x1e,
+                                                          0xc2, 0x92, 0x15, 0xf7, 0x1, 0xea, 0xf3, 0xf7,
+                                                          0x14, 0xf7, 0xd, 0xaa, 0x40, 0x51, 0xfb, 0x9,
+                                                          0x2b, 0x29, 0xfb, 0xc, 0xfb, 0x1, 0x59, 0xcd,
+                                                          0xd0, 0x1e, 0xe, 0xfb, 0x31, 0xbe, 0xf7, 0xa,
+                                                          0xbf, 0xf7, 0xc5, 0xbf, 0x6a, 0xc0, 0x12, 0xf8,
+                                                          0x90, 0xc4, 0x13, 0xd8, 0x6a, 0x21, 0x15, 0x80,
+                                                          0x58, 0x5, 0xf7, 0xbb, 0x78, 0xa, 0xfb, 0x30,
+                                                          0x6, 0xb2, 0xf7, 0x4d, 0x5, 0x65, 0xa3, 0xbd,
+                                                          0x6e, 0xe7, 0x1b, 0xf7, 0x20, 0xf7, 0x6, 0xf7,
+                                                          0xa, 0xf7, 0x27, 0xe7, 0x4d, 0xd3, 0x21, 0x33,
+                                                          0x50, 0x60, 0x5f, 0x5d, 0x1f, 0x13, 0xe8, 0x9a,
+                                                          0xce, 0x5, 0xfb, 0x1f, 0x6, 0x81, 0x57, 0x5,
+                                                          0xdf, 0x6, 0x25, 0xfc, 0x6f, 0x5, 0xf7, 0xb,
+                                                          0xf7, 0xb2, 0x15, 0x13, 0xd8, 0xed, 0xe5, 0xf7,
+                                                          0x2, 0xf7, 0xe, 0xf3, 0xa0, 0x4d, 0x55, 0xfb,
+                                                          0xe, 0x2b, 0x35, 0x2d, 0x37, 0x4c, 0xb2, 0xd8,
+                                                          0x1e, 0xe, 0xfb, 0x31, 0xbf, 0xf7, 0xb, 0xbe,
+                                                          0xf7, 0xcd, 0xbe, 0x63, 0xbf, 0x12, 0xb4, 0xc4,
+                                                          0x13, 0xe8, 0xf7, 0x6b, 0x22, 0x15, 0x80, 0x57,
+                                                          0x5, 0xf7, 0xbf, 0x6, 0x96, 0xbf, 0x5, 0x35,
+                                                          0x6, 0xf4, 0xf8, 0x77, 0x5, 0xe0, 0x6, 0x95,
+                                                          0xbe, 0x5, 0xfb, 0x20, 0x6, 0x78, 0x42, 0x5,
+                                                          0x13, 0xd8, 0xb2, 0x75, 0x53, 0xb9, 0x36, 0x1b,
+                                                          0xfb, 0x1b, 0xfb, 0x16, 0xfb, 0x6, 0xfb, 0x24,
+                                                          0x27, 0xcc, 0x46, 0xf7, 0x2, 0xcb, 0xd2, 0x98,
+                                                          0xc1, 0xc7, 0x1f, 0x65, 0xfb, 0x4e, 0x5, 0xfb,
+                                                          0xa7, 0xf7, 0xbf, 0x15, 0xd3, 0xbc, 0xf7, 0xf,
+                                                          0xf7, 0x2a, 0xef, 0xba, 0x49, 0x3f, 0xfb, 0xb,
+                                                          0xfb, 0x12, 0x4c, 0x32, 0x40, 0x53, 0xbb, 0xdc,
+                                                          0x1e, 0xe, 0x8b, 0xc1, 0xf7, 0xe2, 0xc1, 0x1,
+                                                          0xf7, 0x32, 0xc4, 0x3, 0x9f, 0x16, 0xf7, 0xfe,
+                                                          0x2a, 0xa, 0xfb, 0x46, 0x6, 0xb4, 0xf7, 0x64,
+                                                          0x5, 0xf2, 0xf7, 0x18, 0xbc, 0xa2, 0xc1, 0x1b,
+                                                          0xa4, 0xa0, 0x85, 0x69, 0x8c, 0x1f, 0xc4, 0x90,
+                                                          0x5, 0xbe, 0x8c, 0x79, 0xb0, 0x51, 0x1b, 0x2a,
+                                                          0x3e, 0x4c, 0x54, 0x3f, 0x1f, 0x9f, 0xf4, 0x5,
+                                                          0xfb, 0x4c, 0x5f, 0xa, 0xf7, 0x13, 0x6, 0x4a,
+                                                          0xfb, 0xd4, 0x5, 0xfb, 0x13, 0x6, 0xe, 0x7c,
+                                                          0xc1, 0xf7, 0xf0, 0xc1, 0x1, 0xf7, 0xa, 0xca,
+                                                          0xf7, 0xaa, 0xc5, 0x3, 0xba, 0x7c, 0x15, 0xc4,
+                                                          0x3c, 0xa, 0x72, 0xb2, 0xbe, 0x6c, 0xdd, 0x1b,
+                                                          0xf7, 0x10, 0xf5, 0xba, 0xf3, 0xcc, 0x52, 0xa5,
+                                                          0x53, 0x94, 0x1f, 0x54, 0x94, 0xfb, 0x3c, 0x9c,
+                                                          0xbf, 0x1a, 0xd8, 0xea, 0x87, 0xbf, 0xc4, 0xbf,
+                                                          0x71, 0x70, 0xb1, 0x1e, 0x81, 0x5a, 0x51, 0xa,
+                                                          0xab, 0xf7, 0x30, 0x71, 0xa, 0x80, 0x5b, 0x5,
+                                                          0xa5, 0x62, 0x58, 0xa1, 0x51, 0x1b, 0xfb, 0x19,
+                                                          0x36, 0x67, 0x2a, 0x42, 0xf7, 0x21, 0x60, 0xd6,
+                                                          0x85, 0x1f, 0xb9, 0x87, 0xda, 0x83, 0x5b, 0x1a,
+                                                          0x30, 0xfb, 0x19, 0x8f, 0x62, 0x4a, 0x50, 0xa8,
+                                                          0xb2, 0x6a, 0x1e, 0x95, 0xbb, 0x62, 0xa, 0xe,
+                                                          0x7c, 0xc2, 0xf7, 0xe4, 0xc2, 0xf7, 0x16, 0x77,
+                                                          0x1, 0xf7, 0x17, 0xc6, 0x3, 0xf7, 0x5, 0xf8,
+                                                          0xc, 0x15, 0xd4, 0x6, 0x54, 0xfb, 0xa7, 0x8b,
+                                                          0x7f, 0x7f, 0x1a, 0x3d, 0x8c, 0xe9, 0x7d, 0xb9,
+                                                          0x1b, 0xd8, 0xdd, 0xa8, 0xa6, 0xd2, 0x1f, 0x8f,
+                                                          0xc1, 0x5, 0x77, 0x51, 0x37, 0x68, 0x45, 0x1b,
+                                                          0x51, 0x5d, 0x92, 0xc7, 0x1f, 0xbf, 0xf7, 0xa1,
+                                                          0x5, 0xf7, 0x93, 0x77, 0xa, 0xfb, 0x93, 0x6,
+                                                          0xa5, 0xf7, 0x16, 0x71, 0xa, 0x71, 0xfb, 0x16,
+                                                          0x5, 0x42, 0x6, 0xe, 0x7c, 0xc0, 0x63, 0xc1,
+                                                          0xf7, 0xd4, 0xc1, 0x12, 0x13, 0xa0, 0xcb, 0xf8,
+                                                          0x8, 0x85, 0xa, 0x58, 0xfb, 0x96, 0x8a, 0x80,
+                                                          0x81, 0x1a, 0x45, 0xc2, 0x65, 0xd7, 0xb2, 0xc0,
+                                                          0x9c, 0xd2, 0xe3, 0x1e, 0x13, 0x60, 0x7c, 0x40,
+                                                          0x5, 0xf7, 0x1a, 0x2a, 0xa, 0x3a, 0x6, 0xd3,
+                                                          0xf8, 0xa, 0x55, 0xa, 0x82, 0x55, 0x5, 0xdc,
+                                                          0x6, 0x5e, 0xfb, 0x7a, 0x5, 0x13, 0xa0, 0x59,
+                                                          0x5b, 0x4d, 0x55, 0x4d, 0x1b, 0x56, 0x62, 0xa1,
+                                                          0xb2, 0x90, 0x8b, 0x90, 0x8c, 0x90, 0x1f, 0x9e,
+                                                          0xf3, 0x9d, 0xf3, 0x9e, 0xf3, 0x8, 0xfb, 0x1b,
+                                                          0x6, 0xe, 0x96, 0x76, 0xf8, 0x11, 0xc2, 0x1,
+                                                          0xf7, 0x52, 0x81, 0x15, 0xcc, 0x6, 0xf7, 0x8d,
+                                                          0xf8, 0x11, 0x5, 0xdc, 0x77, 0xa, 0xfb, 0x6a,
+                                                          0x67, 0xa, 0xd5, 0x6, 0xfb, 0x68, 0xfb, 0xd7,
+                                                          0x38, 0xf7, 0xd7, 0x5, 0xd7, 0x77, 0xa, 0xfb,
+                                                          0x72, 0x67, 0xa, 0xe2, 0x6, 0xe, 0x96, 0x76,
+                                                          0xf8, 0x11, 0xc2, 0x1, 0xcb, 0xc0, 0x3, 0xdc,
+                                                          0x81, 0x15, 0xcb, 0x6, 0xf7, 0x11, 0xf7, 0x9b,
+                                                          0xaa, 0xfb, 0x9b, 0x5, 0xc8, 0x6, 0xf7, 0x44,
+                                                          0xf8, 0x11, 0x5, 0xb0, 0x77, 0xa, 0xfb, 0x32,
+                                                          0x38, 0xa, 0xd3, 0x6, 0xfb, 0x23, 0xfb, 0xc5,
+                                                          0x6b, 0xf7, 0xb2, 0x5, 0x5b, 0x6, 0xfb, 0x1b,
+                                                          0xfb, 0xb0, 0x71, 0xf7, 0xc3, 0x5, 0xd4, 0x6,
+                                                          0x94, 0xc2, 0x5, 0xfb, 0x36, 0x67, 0xa, 0xac,
+                                                          0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd3, 0xc0, 0x1,
+                                                          0x7a, 0x16, 0xf7, 0x68, 0x47, 0xa, 0x48, 0x6,
+                                                          0xf7, 0x3b, 0xf7, 0x16, 0xf7, 0x2, 0xfb, 0x16,
+                                                          0x5, 0x4c, 0x2d, 0xa, 0xf7, 0x69, 0x47, 0xa,
+                                                          0x3b, 0x6, 0xfb, 0x21, 0xf7, 0x38, 0xf7, 0x48,
+                                                          0xf7, 0x2f, 0x5, 0xdc, 0x6, 0x95, 0xc0, 0x5,
+                                                          0xfb, 0x55, 0x68, 0xa, 0xb6, 0x6, 0xfb, 0x1f,
+                                                          0xfb, 0xc, 0x30, 0xf7, 0xc, 0x5, 0xbf, 0x6,
+                                                          0x95, 0xc0, 0x5, 0xfb, 0x5e, 0x68, 0xa, 0xdb,
+                                                          0x6, 0xf7, 0xd, 0xfb, 0x2e, 0xfb, 0x64, 0xfb,
+                                                          0x39, 0x5, 0x3e, 0x6, 0xe, 0xfb, 0x31, 0xbe,
+                                                          0xf8, 0x75, 0xbe, 0x1, 0x6c, 0x21, 0x15, 0x7f,
+                                                          0x58, 0x5, 0xf7, 0xa2, 0x78, 0xa, 0x32, 0x6,
+                                                          0xf8, 0x35, 0xf8, 0x75, 0x5, 0xce, 0x78, 0xa,
+                                                          0xfb, 0x53, 0x6, 0x80, 0x58, 0x5, 0xc7, 0x6,
+                                                          0xfb, 0x7c, 0xfb, 0xa1, 0x21, 0xf7, 0xa1, 0x5,
+                                                          0xce, 0x78, 0xa, 0xfb, 0x5f, 0x6, 0x80, 0x58,
+                                                          0x5, 0xd3, 0x6, 0xf7, 0x13, 0xfb, 0xd2, 0xfb,
+                                                          0x22, 0xfb, 0x37, 0x5, 0xe, 0x8b, 0xc1, 0xf7,
+                                                          0xd2, 0xc1, 0x1, 0xc0, 0x16, 0xf8, 0x2d, 0x6,
+                                                          0xaa, 0xf7, 0x1a, 0x52, 0xa, 0x76, 0x3b, 0x5,
+                                                          0xfb, 0xa7, 0x6, 0xf8, 0x1f, 0xf7, 0xd6, 0x95,
+                                                          0xbd, 0x5, 0xfc, 0x1f, 0x6, 0x6b, 0xfb, 0x18,
+                                                          0x5, 0xc1, 0x6, 0xa2, 0xd9, 0x5, 0xf7, 0x98,
+                                                          0x6, 0xfc, 0x1e, 0xfb, 0xd5, 0x5, 0xe, 0xfb,
+                                                          0x70, 0xc0, 0xf9, 0xf1, 0xc0, 0x1, 0xf7, 0x53,
+                                                          0xba, 0x3, 0xf7, 0xa, 0xf7, 0x81, 0x15, 0xbe,
+                                                          0x73, 0x9e, 0x78, 0x8a, 0x53, 0x8, 0x74, 0x86,
+                                                          0x6d, 0x82, 0x65, 0x1e, 0x7a, 0x3b, 0x84, 0x55,
+                                                          0x65, 0x1a, 0x4c, 0xb1, 0x7b, 0xe4, 0x7b, 0x1e,
+                                                          0x95, 0xc0, 0x5, 0x59, 0x93, 0x67, 0x96, 0xad,
+                                                          0x1a, 0xa9, 0x92, 0xbb, 0xa0, 0xde, 0x1e, 0x91,
+                                                          0xa4, 0x8f, 0xb9, 0xb5, 0x1a, 0xb5, 0x7e, 0xb4,
+                                                          0x6e, 0xa1, 0x1e, 0xe6, 0xc2, 0xa1, 0xf7, 0x0,
+                                                          0x92, 0xb9, 0x8, 0xf7, 0x5f, 0xb0, 0xab, 0x9c,
+                                                          0xdf, 0x1b, 0x97, 0xc0, 0x5, 0xfb, 0x23, 0x74,
+                                                          0x5d, 0xfb, 0x71, 0x59, 0x1f, 0x6f, 0xfb, 0x14,
+                                                          0x72, 0x6e, 0x38, 0x6a, 0x8, 0xe, 0xfb, 0x79,
+                                                          0x76, 0xfa, 0x7c, 0x77, 0x1, 0xf7, 0x3c, 0xbe,
+                                                          0x3, 0xf7, 0x3c, 0xfb, 0x8e, 0x15, 0xbe, 0x6,
+                                                          0xf7, 0x68, 0xfa, 0x7c, 0x5, 0x58, 0x6, 0xe,
+                                                          0xfb, 0x71, 0xc0, 0xf9, 0xf1, 0xc0, 0x1, 0xf7,
+                                                          0xaf, 0xbe, 0x3, 0xf8, 0x75, 0xf7, 0xb5, 0x15,
+                                                          0x58, 0xa3, 0x78, 0x9e, 0x8c, 0xc3, 0x8, 0xa2,
+                                                          0x8f, 0xa9, 0x94, 0xb1, 0x1e, 0x9c, 0xdb, 0x93,
+                                                          0xc1, 0xb1, 0x1a, 0xca, 0x65, 0x9b, 0x32, 0x9b,
+                                                          0x1e, 0x81, 0x56, 0x5, 0xbd, 0x83, 0xaf, 0x80,
+                                                          0x69, 0x1a, 0x6d, 0x81, 0x59, 0x7c, 0x3a, 0x1e,
+                                                          0x86, 0x72, 0x83, 0x5d, 0x61, 0x1a, 0x61, 0x98,
+                                                          0x62, 0xa8, 0x75, 0x1e, 0x30, 0x54, 0x75, 0xfb,
+                                                          0x0, 0x84, 0x5d, 0x8, 0xfb, 0x5f, 0x66, 0x6b,
+                                                          0x7a, 0x37, 0x1b, 0x7f, 0x56, 0x5, 0xf7, 0x23,
+                                                          0xa2, 0xb9, 0xf7, 0x71, 0xbd, 0x1f, 0xa7, 0xf7,
+                                                          0x14, 0xa4, 0xa8, 0xde, 0xac, 0x8, 0xe, 0xf7,
+                                                          0x59, 0xc8, 0x91, 0xc3, 0x12, 0xf0, 0xf7, 0x59,
+                                                          0x15, 0xaa, 0xa7, 0xaf, 0xaf, 0xb1, 0x1b, 0xb0,
+                                                          0xa6, 0x78, 0x7a, 0xa7, 0x1f, 0x7b, 0xa4, 0xa5,
+                                                          0x7c, 0xae, 0x1b, 0xcd, 0xbf, 0xaf, 0xb7, 0xb6,
+                                                          0x1f, 0x64, 0xb6, 0x5, 0x77, 0x78, 0x4f, 0x61,
+                                                          0x66, 0x1b, 0x6e, 0x77, 0x97, 0x99, 0x75, 0x1f,
+                                                          0x9c, 0x70, 0x6e, 0x9e, 0x53, 0x1b, 0x4b, 0x62,
+                                                          0x5e, 0x67, 0x62, 0x1f, 0xe, 0xfb, 0x1c, 0x76,
+                                                          0xf8, 0x67, 0xf7, 0xc, 0x1, 0xf7, 0x9f, 0xf7,
+                                                          0x23, 0x3, 0xf7, 0x9f, 0xf7, 0xf8, 0x15, 0x71,
+                                                          0xa7, 0x77, 0xa8, 0xba, 0xb2, 0xae, 0xaf, 0xa5,
+                                                          0x74, 0xa2, 0x66, 0x5b, 0x68, 0x69, 0x63, 0x1e,
+                                                          0x3e, 0xfc, 0x95, 0x85, 0xa, 0xc9, 0xf8, 0x1e,
+                                                          0x5, 0x5d, 0x6, 0xe, 0xe9, 0xc2, 0xf7, 0xa1,
+                                                          0xc2, 0x1, 0xdc, 0xc4, 0xf7, 0x4f, 0xc2, 0x3,
+                                                          0xf7, 0x56, 0x5a, 0x15, 0xc2, 0x6, 0xa6, 0xf7,
+                                                          0x23, 0xd3, 0x8f, 0xc7, 0xa7, 0xc7, 0xad, 0x19,
+                                                          0x85, 0xb9, 0x5, 0x6b, 0x50, 0x4b, 0x72, 0x49,
+                                                          0x1b, 0x29, 0x66, 0xc2, 0xbb, 0xe1, 0xdd, 0xdb,
+                                                          0xf3, 0xb8, 0xc1, 0x7b, 0x6c, 0x9d, 0x1f, 0x81,
+                                                          0x59, 0x6a, 0xa, 0xab, 0xf7, 0x36, 0x5, 0x55,
+                                                          0x6, 0x81, 0x58, 0x6c, 0xa3, 0x6a, 0x99, 0x66,
+                                                          0x8f, 0x19, 0xa6, 0xf7, 0x20, 0x52, 0xa, 0x70,
+                                                          0xfb, 0x21, 0x5, 0x34, 0x8a, 0xfb, 0x16, 0x2c,
+                                                          0xfb, 0x18, 0x1a, 0x2e, 0xcf, 0x58, 0xd3, 0x84,
+                                                          0x1e, 0xe, 0x76, 0xc5, 0xf7, 0x82, 0xc4, 0xf7,
+                                                          0x71, 0xc5, 0x12, 0xf7, 0x33, 0xc1, 0x61, 0xbf,
+                                                          0x13, 0xe8, 0xbe, 0xaa, 0x15, 0x9b, 0x57, 0x5,
+                                                          0xa1, 0xc0, 0xe0, 0x93, 0x9b, 0x1b, 0xa1, 0x9d,
+                                                          0x82, 0x83, 0xa0, 0x1f, 0x84, 0x9d, 0x9f, 0x85,
+                                                          0xa4, 0x53, 0xa, 0x74, 0x7b, 0x91, 0x92, 0x7b,
+                                                          0x1f, 0x94, 0x77, 0x79, 0x94, 0x70, 0x1b, 0x69,
+                                                          0x67, 0x81, 0x7c, 0x69, 0x1f, 0x8e, 0x6, 0xea,
+                                                          0xe0, 0x8c, 0xc8, 0x8c, 0xe1, 0x8, 0xf7, 0x6e,
+                                                          0x6, 0x96, 0xc4, 0x5, 0xfb, 0x7f, 0x6, 0x13,
+                                                          0xf0, 0x89, 0xa3, 0x88, 0xa5, 0x8c, 0xa5, 0x8,
+                                                          0x42, 0xa, 0x6c, 0x8f, 0x6d, 0x8d, 0x6e, 0x8,
+                                                          0x2c, 0x6, 0x80, 0x52, 0x5, 0x13, 0xe8, 0xf7,
+                                                          0x5, 0x6, 0x23, 0x64, 0x3f, 0x3a, 0x4b, 0x1e,
+                                                          0xe, 0xd7, 0xb9, 0x60, 0x76, 0xf8, 0x14, 0xb9,
+                                                          0x9d, 0x77, 0x12, 0xe1, 0xbb, 0xf7, 0xdf, 0xbc,
+                                                          0x13, 0x6c, 0xac, 0xeb, 0x15, 0xa9, 0x65, 0xda,
+                                                          0xc5, 0x5, 0x13, 0xac, 0x64, 0xb9, 0xb0, 0x8a,
+                                                          0xac, 0x1b, 0xbd, 0xbe, 0x9b, 0xa7, 0xb7, 0x1f,
+                                                          0x13, 0x5c, 0xbe, 0x4d, 0xae, 0xa8, 0x58, 0xcb,
+                                                          0x5, 0xbe, 0xb3, 0xa4, 0xd6, 0xc1, 0x1a, 0x8c,
+                                                          0xaf, 0x86, 0xa4, 0x7a, 0xa5, 0xd5, 0xc9, 0x18,
+                                                          0x6c, 0xb0, 0x42, 0x50, 0x5, 0x13, 0xac, 0xa9,
+                                                          0x6c, 0x62, 0x96, 0x5a, 0x1b, 0x59, 0x55, 0x7b,
+                                                          0x6e, 0x61, 0x1f, 0x13, 0x9c, 0x57, 0xca, 0x66,
+                                                          0x6c, 0xc0, 0x4c, 0x5, 0x57, 0x51, 0x75, 0x5d,
+                                                          0x4c, 0x1a, 0x8a, 0x68, 0x92, 0x6e, 0x9c, 0x71,
+                                                          0x8, 0xa4, 0xe4, 0x15, 0x13, 0xac, 0xea, 0xe2,
+                                                          0xf2, 0xf7, 0x3, 0xdb, 0xc0, 0x52, 0x48, 0xfb,
+                                                          0x4, 0x21, 0x37, 0x30, 0x3f, 0x51, 0xbe, 0xd2,
+                                                          0x1e, 0xe, 0x8b, 0xc1, 0xd9, 0xc1, 0xcf, 0xc2,
+                                                          0xf7, 0x5b, 0xc1, 0x1, 0xc3, 0x16, 0xf7, 0xa9,
+                                                          0x2a, 0xa, 0xfb, 0x2, 0x6, 0x9a, 0xd9, 0x5,
+                                                          0xf7, 0x18, 0x47, 0xa, 0xfb, 0x19, 0x6, 0x98,
+                                                          0xcf, 0x5, 0xf7, 0x19, 0x46, 0xa, 0xfb, 0x12,
+                                                          0x6, 0xf7, 0x5f, 0xf7, 0x5b, 0x5, 0xdb, 0x2a,
+                                                          0xa, 0xfb, 0x64, 0x2d, 0xa, 0xd0, 0x6, 0xfb,
+                                                          0x45, 0xfb, 0x40, 0x22, 0xf7, 0x40, 0x5, 0xcf,
+                                                          0x2a, 0xa, 0xfb, 0x65, 0x2d, 0xa, 0xdc, 0x6,
+                                                          0xf7, 0xe, 0xfb, 0x5b, 0x5, 0xfb, 0xb, 0x38,
+                                                          0xa, 0xf7, 0x17, 0x6, 0x7e, 0x47, 0x5, 0xfb,
+                                                          0x17, 0x45, 0xa, 0xf7, 0x18, 0x6, 0x7b, 0x3d,
+                                                          0x5, 0xfb, 0x2, 0x6, 0xe, 0xf7, 0x4c, 0xbc,
+                                                          0x3, 0xf7, 0xad, 0xf7, 0xaf, 0x15, 0xbd, 0x6,
+                                                          0xdf, 0xf8, 0x1c, 0x5, 0x59, 0x6, 0xfb, 0x49,
+                                                          0xfd, 0xe6, 0x15, 0xbc, 0x6, 0xe0, 0xf8, 0x1d,
+                                                          0x5, 0x59, 0x6, 0xe, 0x3d, 0xc2, 0xf7, 0xb,
+                                                          0xb4, 0xf8, 0x18, 0xc2, 0x1, 0xe3, 0xc4, 0xf7,
+                                                          0x71, 0xc4, 0x3, 0xc4, 0x3d, 0x15, 0xf7, 0x87,
+                                                          0x6, 0xcd, 0xc4, 0xac, 0xbc, 0xa6, 0x7e, 0xaa,
+                                                          0x68, 0xad, 0x1f, 0xe3, 0x8a, 0xa7, 0xde, 0xb0,
+                                                          0x1a, 0xa8, 0x7a, 0xa3, 0x75, 0x9d, 0x1e, 0xfb,
+                                                          0x65, 0xf7, 0x4c, 0x87, 0x93, 0x96, 0x1a, 0xaf,
+                                                          0x8c, 0xb7, 0x8b, 0xa0, 0x1b, 0xf7, 0x3f, 0x6,
+                                                          0x75, 0x26, 0x5, 0xc4, 0x6, 0xab, 0xf7, 0x30,
+                                                          0x5, 0xfb, 0x50, 0x6, 0x48, 0x24, 0x85, 0x35,
+                                                          0x70, 0x9a, 0x76, 0xab, 0x6a, 0x1f, 0x5a, 0x4a,
+                                                          0x56, 0x52, 0x73, 0x9d, 0x6a, 0xa0, 0x79, 0x1f,
+                                                          0xf7, 0x4e, 0xfb, 0x39, 0x5, 0x99, 0x7f, 0x94,
+                                                          0x77, 0x7b, 0x1a, 0x79, 0x7d, 0x7d, 0x6d, 0x1e,
+                                                          0xfb, 0x5a, 0x6, 0xa0, 0xf0, 0x62, 0xa, 0xf7,
+                                                          0x93, 0xc6, 0x15, 0xfb, 0x1d, 0xf7, 0xb, 0x5,
+                                                          0x7c, 0x99, 0x85, 0x9a, 0x9a, 0x1a, 0xaf, 0xb6,
+                                                          0xab, 0xb2, 0x8c, 0x1e, 0xf7, 0x22, 0xfb, 0x9,
+                                                          0x5, 0x9a, 0x7d, 0x96, 0x7f, 0x74, 0x1a, 0x7c,
+                                                          0x75, 0x58, 0x45, 0x1e, 0xe, 0xf8, 0x80, 0xf2,
+                                                          0x1, 0xf7, 0xd9, 0xf8, 0x80, 0x15, 0xef, 0x6,
+                                                          0xa8, 0xf2, 0x5, 0x27, 0x6, 0xfb, 0x64, 0x24,
+                                                          0x15, 0xf2, 0x6, 0xa8, 0xf2, 0x5, 0x24, 0x6,
+                                                          0xe, 0x79, 0xb9, 0xe6, 0xb8, 0xf7, 0x8f, 0xb8,
+                                                          0xd7, 0xb7, 0x1, 0x84, 0xb9, 0xf7, 0x0, 0xba,
+                                                          0xf8, 0x3, 0xb9, 0x3, 0x84, 0xf7, 0x66, 0x15,
+                                                          0xfb, 0x18, 0xf5, 0x2b, 0xf7, 0x23, 0xf7, 0x59,
+                                                          0xf7, 0x3c, 0xf7, 0x38, 0xf7, 0x5d, 0xf7, 0x1d,
+                                                          0x20, 0xeb, 0xfb, 0x1f, 0xfb, 0x41, 0xfb, 0x57,
+                                                          0xfb, 0x35, 0xfb, 0x65, 0x1e, 0xb9, 0x9c, 0x15,
+                                                          0xf7, 0x2f, 0xf7, 0x20, 0xf7, 0x2e, 0xf7, 0x43,
+                                                          0xf7, 0x11, 0xdd, 0x39, 0xfb, 0x8, 0xfb, 0x37,
+                                                          0xfb, 0x2e, 0xfb, 0x27, 0xfb, 0x31, 0xfb, 0xa,
+                                                          0x2e, 0xde, 0xf7, 0x8, 0x1e, 0xf7, 0xfc, 0x7d,
+                                                          0x15, 0x6b, 0x69, 0x63, 0x7a, 0x68, 0x1b, 0x51,
+                                                          0x65, 0xb5, 0xc0, 0xe3, 0xd7, 0xcf, 0xd3, 0xaa,
+                                                          0xb1, 0x7c, 0x77, 0x9f, 0x1f, 0xad, 0xae, 0x5,
+                                                          0xab, 0x66, 0x6e, 0x98, 0x5d, 0x1b, 0xfb, 0x7,
+                                                          0x30, 0x27, 0x20, 0x39, 0xca, 0x57, 0xd2, 0xbd,
+                                                          0xc5, 0xa3, 0xab, 0xb2, 0x1f, 0xe, 0xf7, 0x8d,
+                                                          0xc7, 0xda, 0xc5, 0xda, 0xc2, 0x1, 0xf7, 0xeb,
+                                                          0xf7, 0x95, 0x15, 0xee, 0x6, 0x94, 0xc6, 0x5,
+                                                          0x56, 0x6, 0xa0, 0xf7, 0x25, 0x5, 0x8d, 0x9a,
+                                                          0x8d, 0x99, 0x95, 0x1a, 0xc8, 0x5c, 0x9e, 0x58,
+                                                          0x5b, 0x54, 0x7a, 0x7c, 0x6d, 0x1e, 0x8e, 0x50,
+                                                          0x5, 0x9d, 0xa6, 0xc1, 0x9d, 0xb4, 0x1b, 0xac,
+                                                          0xa2, 0x84, 0x61, 0x80, 0x89, 0x7f, 0x87, 0x7b,
+                                                          0x1f, 0x90, 0x75, 0x71, 0x8f, 0x71, 0x1b, 0xfb,
+                                                          0x8, 0x6e, 0x43, 0x5d, 0x62, 0xa8, 0x65, 0xbd,
+                                                          0xb6, 0xb9, 0xa7, 0xac, 0xae, 0x1f, 0x93, 0xd1,
+                                                          0x15, 0x5f, 0x6a, 0x5e, 0x70, 0x62, 0x1b, 0x71,
+                                                          0x78, 0x94, 0x9f, 0xab, 0xa7, 0x9d, 0xc1, 0xb4,
+                                                          0xb4, 0x83, 0x8b, 0x1f, 0xe, 0xda, 0x76, 0xf8,
+                                                          0x18, 0x77, 0x1, 0xf7, 0x86, 0xf7, 0x93, 0x15,
+                                                          0xf7, 0x4b, 0xfb, 0x4d, 0xab, 0xba, 0xfb, 0x15,
+                                                          0xf7, 0x1e, 0xf7, 0x59, 0xf7, 0x24, 0x6e, 0xba,
+                                                          0x5, 0xfc, 0x39, 0xfb, 0x53, 0x15, 0xf7, 0x3e,
+                                                          0xfb, 0x4d, 0xb1, 0xbc, 0xfb, 0x14, 0xf7, 0x1c,
+                                                          0xf7, 0x52, 0xf7, 0x24, 0x6c, 0xba, 0x5, 0xe,
+                                                          0xf7, 0x15, 0x76, 0xf7, 0x5b, 0xc9, 0x1, 0xdd,
+                                                          0xf7, 0xc7, 0x15, 0xf8, 0x7, 0x6, 0x68, 0xfb,
+                                                          0x5b, 0x6a, 0xa, 0xb8, 0xf7, 0x99, 0x5, 0xfc,
+                                                          0x3e, 0x6, 0xe, 0x79, 0xb9, 0xf7, 0x7, 0xf7,
+                                                          0x37, 0xe8, 0xbb, 0xe4, 0xb7, 0x1, 0x84, 0xbb,
+                                                          0xf7, 0xde, 0xbd, 0xf7, 0x1f, 0xba, 0x3, 0x84,
+                                                          0xf7, 0x74, 0x15, 0xfb, 0x1e, 0xf1, 0x23, 0xf7,
+                                                          0x27, 0xf7, 0x48, 0xf7, 0x4d, 0xf7, 0x35, 0xf7,
+                                                          0x5d, 0xf7, 0x1e, 0x21, 0xed, 0xfb, 0x20, 0xfb,
+                                                          0x3a, 0xfb, 0x5e, 0xfb, 0x2a, 0xfb, 0x62, 0x1e,
+                                                          0xbb, 0x93, 0x15, 0xf7, 0x1d, 0xf7, 0x22, 0xf7,
+                                                          0x3b, 0xf7, 0x3f, 0xf7, 0xe, 0xdf, 0x33, 0xfb,
+                                                          0x4, 0xfb, 0x30, 0xfb, 0x33, 0xfb, 0x2c, 0xfb,
+                                                          0x2b, 0xfb, 0xc, 0x32, 0xe0, 0xf7, 0xb, 0x1e,
+                                                          0xf7, 0x17, 0x32, 0x15, 0xba, 0x6, 0xa1, 0xf5,
+                                                          0x5, 0xbf, 0x6, 0xa9, 0x21, 0x5, 0xc6, 0x6,
+                                                          0x6d, 0xf7, 0x9, 0x5, 0xbf, 0x9d, 0x9c, 0xba,
+                                                          0xbc, 0x1a, 0xb8, 0x63, 0xa7, 0x5e, 0x1e, 0x23,
+                                                          0x6, 0x9d, 0xfb, 0x21, 0x15, 0x9f, 0xe8, 0x6a,
+                                                          0xa, 0xa8, 0x9c, 0x79, 0x7b, 0x59, 0x71, 0x82,
+                                                          0x65, 0x1f, 0xe, 0xf8, 0xa1, 0xb3, 0x1, 0xf7,
+                                                          0x8, 0xf8, 0xa1, 0x15, 0xf7, 0xfc, 0x6, 0x93,
+                                                          0xb3, 0x5, 0xfb, 0xfc, 0x6, 0xe, 0xf7, 0x9e,
+                                                          0xc9, 0xf7, 0x7c, 0xc9, 0x1, 0xf7, 0xb, 0xca,
+                                                          0xf7, 0x80, 0xca, 0x3, 0xf7, 0xb, 0xf8, 0x28,
+                                                          0x15, 0x3f, 0xc6, 0x4d, 0xe2, 0xf7, 0x1, 0xf6,
+                                                          0xf2, 0xf7, 0x11, 0xca, 0x5f, 0xcc, 0x28, 0xfb,
+                                                          0xb, 0x27, 0x23, 0xfb, 0x6, 0x1e, 0xca, 0x9a,
+                                                          0x15, 0xbf, 0xc1, 0xe4, 0xe4, 0xd0, 0xa3, 0x5d,
+                                                          0x67, 0x4f, 0x46, 0x31, 0x43, 0x4f, 0x68, 0xb6,
+                                                          0xbb, 0x1e, 0xe, 0xb7, 0xc0, 0xf7, 0x79, 0xc0,
+                                                          0xf7, 0x47, 0x77, 0x1, 0xf7, 0x97, 0xc2, 0x3,
+                                                          0xf7, 0x97, 0xf7, 0x26, 0x15, 0xc2, 0x6, 0xb0,
+                                                          0xf7, 0x48, 0x5, 0xf7, 0x4f, 0x80, 0xa, 0xfb,
+                                                          0x4f, 0x6, 0xaf, 0xf7, 0x47, 0x52, 0xa, 0x67,
+                                                          0xfb, 0x47, 0x5, 0xfb, 0x4f, 0x6, 0x80, 0x56,
+                                                          0x5, 0xf7, 0x4f, 0x6, 0xfb, 0x89, 0xfb, 0xae,
+                                                          0x15, 0xf8, 0x41, 0x80, 0xa, 0xfc, 0x41, 0x6,
+                                                          0xe, 0xf7, 0x8d, 0xc3, 0xf7, 0x9b, 0xc1, 0x1,
+                                                          0xf8, 0x1f, 0xc4, 0x3, 0xf7, 0x27, 0xf7, 0x8d,
+                                                          0x15, 0xf7, 0x91, 0x3c, 0xa, 0xfb, 0x3d, 0x6,
+                                                          0xf7, 0x17, 0xdf, 0xda, 0xbb, 0xef, 0x1a, 0xb9,
+                                                          0x68, 0xb2, 0x48, 0x5f, 0x4a, 0x74, 0x58, 0x73,
+                                                          0x1e, 0x82, 0x52, 0x5, 0xc0, 0x6, 0xb2, 0x8a,
+                                                          0xba, 0xb1, 0xaa, 0x1b, 0xae, 0xa1, 0x75, 0x71,
+                                                          0x5c, 0x62, 0x63, 0x68, 0x74, 0x1f, 0xfb, 0x36,
+                                                          0xfb, 0x1, 0x5, 0xe, 0xf7, 0x84, 0xc3, 0xf5,
+                                                          0xc2, 0xf7, 0x2, 0xc2, 0x12, 0xf8, 0xa, 0xc5,
+                                                          0x5e, 0xc4, 0x13, 0xf0, 0xf7, 0x30, 0xf7, 0xa3,
+                                                          0x15, 0x7c, 0xa8, 0xbb, 0x7b, 0xb6, 0x1b, 0xd7,
+                                                          0xdb, 0xc0, 0xde, 0xae, 0x79, 0x9a, 0x75, 0x97,
+                                                          0x1f, 0x13, 0xe8, 0xae, 0xa1, 0x9c, 0xb2, 0xb4,
+                                                          0x1a, 0xbc, 0x65, 0xac, 0x54, 0x60, 0x5c, 0x77,
+                                                          0x75, 0x64, 0x1e, 0x96, 0x57, 0x5, 0x9d, 0xab,
+                                                          0xac, 0xa0, 0xad, 0x1b, 0xa6, 0xa7, 0x7d, 0x71,
+                                                          0x5e, 0x5a, 0x72, 0x4b, 0x1f, 0x87, 0x79, 0x87,
+                                                          0x78, 0x87, 0x79, 0x8, 0x99, 0x9f, 0x8b, 0x9f,
+                                                          0x1b, 0x13, 0xf0, 0xa9, 0xa7, 0x81, 0x6e, 0x6a,
+                                                          0x71, 0x69, 0x4b, 0x66, 0x67, 0x99, 0x9d, 0x6f,
+                                                          0x1f, 0xe, 0x65, 0xa, 0xf7, 0x42, 0xf8, 0x85,
+                                                          0x15, 0xf7, 0x96, 0xf0, 0x7b, 0xd5, 0xfb, 0x8c,
+                                                          0xfb, 0x24, 0x5, 0xe, 0xf7, 0x22, 0xac, 0x15,
+                                                          0x75, 0x9a, 0xa9, 0x78, 0xbb, 0x1b, 0xbe, 0xdf,
+                                                          0xab, 0xca, 0xbc, 0x1f, 0x7b, 0x39, 0x5, 0xf7,
+                                                          0x1c, 0x2a, 0xa, 0x39, 0x6, 0xd3, 0xf8, 0x3,
+                                                          0x5, 0xfb, 0x1c, 0x68, 0xa, 0xdd, 0x6, 0x70,
+                                                          0xfb, 0x18, 0x5, 0x35, 0x7b, 0x51, 0xfb, 0x2,
+                                                          0xfb, 0x11, 0x1b, 0x4b, 0x6a, 0xb9, 0xc6, 0x96,
+                                                          0x1f, 0xc2, 0xf7, 0xa8, 0x5, 0xfb, 0x1d, 0x68,
+                                                          0xa, 0xdd, 0x6, 0x23, 0xfc, 0xa6, 0x6a, 0xa,
+                                                          0xe, 0xf8, 0xa9, 0xa8, 0x1, 0xf7, 0x28, 0xba,
+                                                          0xda, 0xb6, 0x3, 0xf7, 0x28, 0x3d, 0x15, 0xba,
+                                                          0x6, 0xf7, 0x52, 0xf8, 0xf7, 0x5, 0xda, 0x6,
+                                                          0xfb, 0x52, 0xfc, 0xf7, 0x5, 0xb6, 0x6, 0xf7,
+                                                          0x52, 0xf8, 0xf7, 0x5, 0xbc, 0x6, 0x94, 0xa8,
+                                                          0x5, 0xfb, 0x6f, 0x6, 0xfb, 0x34, 0xfb, 0x2b,
+                                                          0x4c, 0xfb, 0x21, 0x53, 0xb9, 0x3e, 0xf7, 0x35,
+                                                          0x1f, 0xe, 0xf7, 0x51, 0xf7, 0x1e, 0x1, 0xf7,
+                                                          0x70, 0xf7, 0x33, 0x3, 0xf7, 0x70, 0xf7, 0x87,
+                                                          0x15, 0x6e, 0xa6, 0x72, 0xb4, 0xb7, 0xba, 0xaf,
+                                                          0xb9, 0xa9, 0x73, 0xa5, 0x63, 0x58, 0x5f, 0x65,
+                                                          0x5d, 0x1e, 0xe, 0xfb, 0x2, 0xb9, 0x1, 0xf7,
+                                                          0xbf, 0xba, 0x3, 0xf7, 0x76, 0xfb, 0x1a, 0x15,
+                                                          0x88, 0x90, 0xa3, 0x7d, 0xa4, 0x1b, 0xbc, 0xb7,
+                                                          0xb0, 0xba, 0xa4, 0x78, 0x9c, 0x7c, 0x8d, 0x1f,
+                                                          0x92, 0xac, 0x5, 0x5c, 0x6, 0x73, 0x41, 0x5,
+                                                          0x8c, 0x93, 0x91, 0x8b, 0x91, 0x1b, 0x9d, 0x93,
+                                                          0x83, 0x83, 0x8c, 0x1f, 0x78, 0x79, 0x7f, 0x7b,
+                                                          0x7d, 0x7c, 0x8e, 0x94, 0x81, 0x1e, 0xe, 0xf7,
+                                                          0x8d, 0xc3, 0x1, 0xf7, 0xab, 0xc0, 0x3, 0xf7,
+                                                          0x3e, 0xf7, 0x8d, 0x15, 0xf7, 0x8d, 0x3c, 0xa,
+                                                          0x29, 0x6, 0xc5, 0xf7, 0xd1, 0xfb, 0x26, 0x72,
+                                                          0x80, 0x53, 0xe6, 0x9a, 0x5e, 0xfb, 0x8f, 0x5,
+                                                          0x29, 0x6, 0xe, 0xf7, 0x8d, 0xc6, 0xf7, 0x69,
+                                                          0xc6, 0x1, 0xf7, 0x1d, 0xc1, 0xf7, 0x6d, 0xc1,
+                                                          0x3, 0xf7, 0x1d, 0xf8, 0xc, 0x15, 0x2c, 0xe5,
+                                                          0x6b, 0xb6, 0xd4, 0xf7, 0xb, 0xd2, 0xf7, 0x17,
+                                                          0xd4, 0x5a, 0xc3, 0x39, 0x36, 0xfb, 0x1, 0x40,
+                                                          0xfb, 0x15, 0x1e, 0xc1, 0x9a, 0x15, 0xd1, 0xbf,
+                                                          0xc7, 0xd9, 0xcf, 0x9d, 0x5d, 0x68, 0x8c, 0x1e,
+                                                          0x3c, 0x4a, 0x56, 0x4e, 0x5c, 0x5f, 0xa9, 0xc0,
+                                                          0x1e, 0xe, 0xe6, 0x76, 0xf8, 0xc, 0x77, 0x1,
+                                                          0x8c, 0xf8, 0xc4, 0x3, 0xf3, 0xd1, 0x15, 0xf7,
+                                                          0x92, 0xf7, 0x53, 0xfb, 0x4b, 0xf7, 0x4d, 0x6b,
+                                                          0x5c, 0xf7, 0x15, 0xfb, 0x1e, 0xfb, 0x59, 0xfb,
+                                                          0x24, 0x5, 0xf7, 0x48, 0x16, 0xaa, 0x5c, 0xf7,
+                                                          0x83, 0xf7, 0x53, 0xfb, 0x3e, 0xf7, 0x4d, 0x65,
+                                                          0x5a, 0xf7, 0x14, 0xfb, 0x1c, 0x5, 0xe, 0x60,
+                                                          0xc1, 0x5c, 0x76, 0xf3, 0xc2, 0xf7, 0x5d, 0xc0,
+                                                          0xf7, 0xc9, 0x77, 0x12, 0x13, 0xb8, 0xf7, 0x8d,
+                                                          0xba, 0x15, 0xf7, 0x14, 0x6, 0x82, 0x67, 0x5,
+                                                          0x5a, 0x5f, 0xa, 0xf7, 0x20, 0x76, 0xa, 0x61,
+                                                          0x6, 0x93, 0xaf, 0x5, 0xb6, 0x6, 0x94, 0xc2,
+                                                          0x5, 0x60, 0x6, 0xac, 0xf7, 0x65, 0x52, 0xa,
+                                                          0xfb, 0x30, 0xfb, 0x65, 0x5, 0xc9, 0x16, 0xe4,
+                                                          0xf7, 0x19, 0x76, 0xfb, 0x19, 0x5, 0xfc, 0x19,
+                                                          0xfb, 0x14, 0x15, 0x13, 0x78, 0xac, 0x6c, 0xf8,
+                                                          0xd4, 0xf9, 0x47, 0x69, 0xaa, 0x5, 0xfc, 0xd3,
+                                                          0xfb, 0xfe, 0x15, 0xf7, 0x6e, 0x6, 0x94, 0xc0,
+                                                          0x5, 0x36, 0x6, 0xbe, 0xf7, 0xc6, 0xfb, 0x14,
+                                                          0x73, 0x82, 0x55, 0xdb, 0x99, 0x62, 0xfb, 0x86,
+                                                          0x5, 0x35, 0x6, 0xe, 0x5f, 0xc1, 0x5d, 0x76,
+                                                          0xf7, 0xd5, 0xc0, 0x7c, 0xc1, 0xf7, 0xc9, 0x77,
+                                                          0x12, 0xf8, 0x65, 0xbb, 0x13, 0x5c, 0x89, 0x71,
+                                                          0x15, 0xad, 0x6c, 0xf8, 0xce, 0xf9, 0x47, 0x67,
+                                                          0xaa, 0x5, 0xfc, 0xb5, 0xfb, 0xff, 0x15, 0xf7,
+                                                          0x70, 0x76, 0xa, 0x34, 0x6, 0xbe, 0xf7, 0xc4,
+                                                          0xfb, 0x13, 0x74, 0x82, 0x55, 0xda, 0x99, 0x64,
+                                                          0xfb, 0x85, 0x5, 0x34, 0x6, 0x13, 0xac, 0xf7,
+                                                          0x73, 0xfc, 0x24, 0x15, 0xf7, 0x6b, 0x76, 0xa,
+                                                          0xfb, 0x23, 0x6, 0xf7, 0xb, 0xee, 0xc6, 0xa8,
+                                                          0xe1, 0x1a, 0xbc, 0x72, 0xb7, 0x4d, 0x65, 0x63,
+                                                          0x78, 0x69, 0x6c, 0x1e, 0x81, 0x4c, 0x5, 0xb9,
+                                                          0x6, 0xb0, 0x89, 0xae, 0xa5, 0xaa, 0x1b, 0xaa,
+                                                          0x9c, 0x73, 0x6e, 0x62, 0x68, 0x6a, 0x6d, 0x74,
+                                                          0x1f, 0xfb, 0x1e, 0xfb, 0x0, 0x5, 0xe, 0x61,
+                                                          0xc1, 0x5c, 0x76, 0xf7, 0xb, 0xc2, 0xf7, 0x42,
+                                                          0xc2, 0xf7, 0xb3, 0x76, 0xc0, 0x77, 0x12, 0xf7,
+                                                          0x67, 0xba, 0x65, 0xbb, 0x13, 0xbe, 0xf7, 0x90,
+                                                          0xca, 0x15, 0xf7, 0x11, 0x6, 0x83, 0x58, 0x5,
+                                                          0x59, 0x6, 0x82, 0x55, 0x5, 0xf7, 0x1c, 0x76,
+                                                          0xa, 0x62, 0x6, 0x92, 0xbe, 0x5, 0xb6, 0x6,
+                                                          0x94, 0xc2, 0x5, 0x61, 0x6, 0xab, 0xf7, 0x57,
+                                                          0x5, 0x56, 0x6, 0xfb, 0x2c, 0xfb, 0x66, 0x5,
+                                                          0xc7, 0x9a, 0x15, 0xe3, 0xf7, 0x8, 0x78, 0xfb,
+                                                          0x8, 0x5, 0xfc, 0x10, 0xfb, 0x25, 0x15, 0x13,
+                                                          0x7e, 0xab, 0x6e, 0xf8, 0xbe, 0xf9, 0x47, 0x6a,
+                                                          0xaa, 0x5, 0xfc, 0xa1, 0xfb, 0xe8, 0x15, 0x7d,
+                                                          0xa2, 0xb1, 0x77, 0xae, 0x1b, 0xc4, 0xd1, 0xc2,
+                                                          0xd5, 0x1f, 0x8e, 0xb3, 0x7a, 0x9a, 0x78, 0x97,
+                                                          0x8, 0x13, 0xbd, 0xa6, 0xa0, 0x9b, 0xb1, 0xb1,
+                                                          0x1a, 0xbc, 0x6c, 0xab, 0x5d, 0x69, 0x66, 0x79,
+                                                          0x75, 0x6b, 0x1e, 0x94, 0x58, 0x5, 0x9d, 0xa5,
+                                                          0xa5, 0x9f, 0xa7, 0x1b, 0xa0, 0x9f, 0x7d, 0x72,
+                                                          0x8d, 0x1f, 0x64, 0x69, 0x6f, 0x57, 0x1e, 0x85,
+                                                          0x6, 0x82, 0x56, 0x5, 0x13, 0xbe, 0xb2, 0xc0,
+                                                          0x87, 0x6a, 0x6d, 0x73, 0x63, 0x59, 0x6d, 0x6e,
+                                                          0x9c, 0x9c, 0x76, 0x1f, 0xe, 0xfb, 0x31, 0xc1,
+                                                          0xf8, 0x33, 0xf7, 0xa, 0x12, 0xf7, 0xc, 0xc2,
+                                                          0xf7, 0x45, 0xc2, 0x9e, 0xc1, 0x17, 0xf7, 0xe5,
+                                                          0xf7, 0xf7, 0x15, 0x73, 0xa1, 0x78, 0xac, 0xb8,
+                                                          0xad, 0xad, 0xb3, 0xa2, 0x75, 0xa0, 0x68, 0x68,
+                                                          0x61, 0x69, 0x62, 0x1e, 0x8e, 0xfb, 0x41, 0x15,
+                                                          0x38, 0x7a, 0xfb, 0x1d, 0x5e, 0xfb, 0x22, 0x1a,
+                                                          0x31, 0xd6, 0x5e, 0xe5, 0xc6, 0xc9, 0x9a, 0x9c,
+                                                          0xbe, 0x1e, 0x13, 0xb8, 0xa2, 0xf7, 0xb, 0x5,
+                                                          0x55, 0x6, 0x7d, 0x44, 0x5, 0x7b, 0x66, 0x61,
+                                                          0x81, 0x63, 0x1b, 0x2f, 0x71, 0xba, 0xb1, 0xf7,
+                                                          0x2, 0xf7, 0x1f, 0xac, 0xd3, 0x96, 0x1f, 0xa0,
+                                                          0xf3, 0x52, 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x10,
+                                                          0xc1, 0xf7, 0xb1, 0xc1, 0x1, 0x89, 0x4f, 0xa,
+                                                          0x89, 0x16, 0x20, 0xa, 0xfb, 0x43, 0xf8, 0x7d,
+                                                          0x15, 0xf7, 0x9a, 0x26, 0x9b, 0xa9, 0xfb, 0x7b,
+                                                          0x79, 0xa, 0x8b, 0xc1, 0xf7, 0xf, 0xc2, 0xf7,
+                                                          0xab, 0xc1, 0x84, 0xa, 0x72, 0xf7, 0x74, 0xf7,
+                                                          0x5a, 0xf7, 0x71, 0x3, 0xf7, 0xc2, 0xf8, 0xff,
+                                                          0x15, 0xf7, 0xd7, 0xf0, 0x77, 0xd4, 0xfb, 0xc9,
+                                                          0xfb, 0x24, 0x5, 0xfb, 0xd5, 0xfd, 0x1d, 0x23,
+                                                          0xa, 0x8b, 0xc0, 0xf7, 0xc, 0xc0, 0xf7, 0xb1,
+                                                          0xc1, 0xf7, 0x66, 0x77, 0x1, 0x89, 0x4f, 0xa,
+                                                          0xf7, 0x7a, 0xf9, 0x3, 0x15, 0xb0, 0x79, 0xf7,
+                                                          0x3b, 0xf7, 0x7, 0xf7, 0xd, 0xfb, 0x7, 0xb5,
+                                                          0x9d, 0xfb, 0x5, 0xf7, 0x2c, 0x5, 0x3c, 0x6,
+                                                          0xfc, 0x2b, 0xfd, 0x9b, 0x23, 0xa, 0x7e, 0xa,
+                                                          0xd3, 0xbc, 0x9c, 0xbc, 0x1, 0x71, 0x4f, 0xa,
+                                                          0xf7, 0x6c, 0xf9, 0x20, 0x15, 0xbc, 0x81, 0x5,
+                                                          0x9e, 0x97, 0xa6, 0xb5, 0xbc, 0x1b, 0xa4, 0x9b,
+                                                          0x7b, 0x7b, 0x9e, 0x1f, 0x7a, 0x9f, 0xa1, 0x7a,
+                                                          0xb1, 0x1b, 0xd0, 0xb9, 0xca, 0xb1, 0x9e, 0x1f,
+                                                          0x5b, 0x94, 0x5, 0x73, 0x7d, 0x69, 0x66, 0x66,
+                                                          0x1b, 0x76, 0x7e, 0x99, 0x9b, 0x7a, 0x1f, 0x9c,
+                                                          0x79, 0x75, 0x9e, 0x61, 0x1b, 0x52, 0x51, 0x5c,
+                                                          0x56, 0x6d, 0x1f, 0xfb, 0x86, 0xfd, 0x20, 0x23,
+                                                          0xa, 0x7e, 0xa, 0xdb, 0xf7, 0x8, 0x1, 0x89,
+                                                          0x4f, 0xa, 0xf8, 0x55, 0xf9, 0x19, 0x15, 0xdd,
+                                                          0x5c, 0xa, 0x38, 0x6, 0xfb, 0x3c, 0xfb, 0x8,
+                                                          0x15, 0xdd, 0x5c, 0xa, 0x39, 0x6, 0xfb, 0xe0,
+                                                          0xfd, 0x8d, 0x23, 0xa, 0x8b, 0xbf, 0xf7, 0x20,
+                                                          0xc1, 0xf7, 0xaa, 0xc1, 0xaa, 0xc4, 0xd2, 0xc3,
+                                                          0x1, 0x89, 0xf7, 0x63, 0xf7, 0x11, 0xc6, 0xd4,
+                                                          0xc7, 0x3, 0xf7, 0xde, 0xf9, 0x3d, 0x15, 0x5d,
+                                                          0xb1, 0x71, 0xb7, 0xc8, 0xbc, 0xbf, 0xc5, 0xab,
+                                                          0x7f, 0xb5, 0x4a, 0x4c, 0x57, 0x58, 0x4e, 0x1e,
+                                                          0xc6, 0x93, 0x15, 0xa3, 0x97, 0xa3, 0xac, 0xad,
+                                                          0x85, 0x6f, 0x86, 0x75, 0x77, 0x7b, 0x76, 0x85,
+                                                          0x71, 0x8b, 0xa2, 0x1e, 0xfc, 0x1b, 0xfd, 0x45,
+                                                          0x23, 0xa, 0x8b, 0xc1, 0xeb, 0xc1, 0xbc, 0x61,
+                                                          0xa, 0x1, 0x71, 0xf7, 0x56, 0xe2, 0xcd, 0xf6,
+                                                          0xc1, 0x93, 0xc2, 0x3, 0x71, 0x16, 0xf7, 0x56,
+                                                          0x2a, 0xa, 0x35, 0x6, 0xc8, 0xf7, 0x3, 0x5,
+                                                          0xf7, 0x19, 0x6, 0x6b, 0xfb, 0x39, 0x5, 0xf7,
+                                                          0x97, 0x6, 0xaa, 0xf7, 0x2d, 0x52, 0xa, 0x78,
+                                                          0x28, 0x5, 0xfb, 0x2a, 0x6, 0xb1, 0xf7, 0x5c,
+                                                          0x5, 0xdb, 0x6, 0x80, 0x52, 0x5, 0xc1, 0x6,
+                                                          0xab, 0xf7, 0x3b, 0x5, 0x57, 0x60, 0xa, 0x39,
+                                                          0x6, 0xb3, 0xf7, 0x5c, 0x5, 0xf7, 0x2b, 0x6,
+                                                          0x78, 0x26, 0x6a, 0xa, 0xa9, 0xf7, 0x2f, 0x5,
+                                                          0xfc, 0x2a, 0x2d, 0xa, 0xe4, 0x6, 0xfb, 0x99,
+                                                          0x58, 0xa, 0x57, 0x6, 0xf7, 0x5b, 0xf7, 0x39,
+                                                          0x15, 0xf7, 0x3e, 0xf7, 0xb4, 0x52, 0xfb, 0xb4,
+                                                          0x5, 0xe, 0xfb, 0x2b, 0xc2, 0xe7, 0xbe, 0xf8,
+                                                          0x76, 0xbe, 0x1, 0x9c, 0xc5, 0xf7, 0x3, 0xbb,
+                                                          0xf7, 0x8b, 0xc3, 0x3, 0xf7, 0x5, 0xfb, 0x13,
+                                                          0x15, 0x84, 0x90, 0xa3, 0x7a, 0xa7, 0x1b, 0xb3,
+                                                          0xc2, 0xa2, 0xcb, 0xab, 0x7c, 0xa2, 0x77, 0x93,
+                                                          0x1f, 0x8f, 0x88, 0x5, 0xe7, 0xdc, 0xbe, 0xb5,
+                                                          0xd3, 0x1f, 0x7b, 0xb7, 0x5, 0x66, 0x4d, 0x45,
+                                                          0x5a, 0x44, 0x1b, 0xfb, 0x5, 0x43, 0xe5, 0xf7,
+                                                          0x9, 0xf7, 0x43, 0xf7, 0x44, 0xef, 0xeb, 0xcc,
+                                                          0xc5, 0x6d, 0x60, 0xaa, 0x1f, 0x77, 0x36, 0x51,
+                                                          0xa, 0xb8, 0xf7, 0x65, 0x52, 0xa, 0x7e, 0x51,
+                                                          0x5, 0xb7, 0x49, 0x60, 0x99, 0x55, 0x1b, 0xfb,
+                                                          0x54, 0xfb, 0x22, 0xfb, 0x3d, 0xfb, 0x44, 0x22,
+                                                          0xd1, 0x30, 0xee, 0x7c, 0x1f, 0x78, 0x42, 0x5,
+                                                          0x8f, 0x92, 0x94, 0x8b, 0x92, 0x1b, 0x98, 0x96,
+                                                          0x83, 0x81, 0x80, 0x85, 0x75, 0x6e, 0x7d, 0x7e,
+                                                          0x93, 0x92, 0x81, 0x1f, 0xe, 0x5b, 0xa, 0x1,
+                                                          0xe4, 0xc2, 0xf7, 0x52, 0xc3, 0xc6, 0xb8, 0x3,
+                                                          0x88, 0x16, 0x28, 0xa, 0xf8, 0x9d, 0xf8, 0xc9,
+                                                          0x15, 0x9a, 0xa9, 0xfb, 0xc9, 0xf7, 0x24, 0x6f,
+                                                          0x42, 0x5, 0xe, 0x5b, 0xa, 0x84, 0xa, 0xe5,
+                                                          0xc3, 0xf7, 0x55, 0xc4, 0xc7, 0xb9, 0x3, 0xf7,
+                                                          0xa0, 0xf8, 0xff, 0x15, 0xf7, 0xd5, 0xf0, 0x78,
+                                                          0xd4, 0xfb, 0xc9, 0xfb, 0x24, 0x5, 0xfb, 0x9c,
+                                                          0xfd, 0x1d, 0x15, 0x28, 0xa, 0xe, 0x5b, 0xa,
+                                                          0x1, 0xe4, 0xc2, 0x3, 0xf7, 0x54, 0xf9, 0xd,
+                                                          0x15, 0xb2, 0x79, 0xf7, 0x45, 0xf7, 0x7, 0xf7,
+                                                          0x14, 0xfb, 0x7, 0xb9, 0x9d, 0xfb, 0xb, 0xf7,
+                                                          0x2c, 0x5, 0x36, 0x6, 0xfc, 0x11, 0xfd, 0xa5,
+                                                          0x15, 0x28, 0xa, 0xe, 0x8b, 0xbe, 0xf7, 0x75,
+                                                          0x76, 0xf7, 0xca, 0x77, 0xf7, 0x2, 0xf7, 0x8,
+                                                          0x1, 0xe4, 0xc2, 0x3, 0xf8, 0x3d, 0xf9, 0x23,
+                                                          0x15, 0xe2, 0x5c, 0xa, 0x34, 0x6, 0xfb, 0x46,
+                                                          0xfb, 0x8, 0x15, 0xe2, 0x6, 0xa5, 0x88, 0xa,
+                                                          0x34, 0x6, 0xfb, 0xc1, 0xfd, 0x97, 0x15, 0x28,
+                                                          0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5c, 0xc2, 0x84,
+                                                          0xa, 0xf7, 0x74, 0xc6, 0x3, 0xaf, 0x16, 0x2f,
+                                                          0xa, 0xf7, 0x50, 0xf9, 0x2e, 0x15, 0xf7, 0xb5,
+                                                          0x26, 0x9e, 0xa9, 0xfb, 0x94, 0x79, 0xa, 0x8b,
+                                                          0xc1, 0xf8, 0x5d, 0xc2, 0xf7, 0x77, 0x77, 0x1,
+                                                          0xf7, 0x6c, 0xc5, 0x3, 0xf7, 0x88, 0xf9, 0x0,
+                                                          0x15, 0xf7, 0xdb, 0xef, 0x78, 0xd4, 0xfb, 0xcf,
+                                                          0xfb, 0x23, 0x5, 0xfb, 0x64, 0xfd, 0x1e, 0x15,
+                                                          0xf8, 0x2d, 0x2a, 0xa, 0xfb, 0x43, 0x6, 0xeb,
+                                                          0xf8, 0x5d, 0x5, 0xf7, 0x40, 0x46, 0xa, 0xfc,
+                                                          0x29, 0x6, 0x7e, 0x54, 0x5, 0xf7, 0x42, 0x6,
+                                                          0x2d, 0x7a, 0xa, 0xfb, 0x44, 0x6, 0xe, 0x8b,
+                                                          0xc0, 0xf8, 0x5d, 0xc2, 0x1, 0xf7, 0x74, 0xc6,
+                                                          0x3, 0xf7, 0x3f, 0xf9, 0xb, 0x15, 0xb2, 0x7a,
+                                                          0xf7, 0x47, 0xf7, 0x8, 0xf7, 0x14, 0xfb, 0x8,
+                                                          0xb9, 0x9c, 0xfb, 0xd, 0xf7, 0x2e, 0x5, 0x36,
+                                                          0x6, 0xfb, 0xd5, 0xfd, 0xa5, 0x15, 0x2f, 0xa,
+                                                          0xe, 0x8b, 0xbe, 0xf8, 0x5f, 0xc2, 0xf7, 0x62,
+                                                          0x77, 0x1, 0xf7, 0x74, 0xc6, 0x3, 0xf8, 0x35,
+                                                          0xf9, 0x22, 0x15, 0xe7, 0x6, 0xa5, 0xf7, 0x9,
+                                                          0x5, 0x31, 0x6, 0xfb, 0x4e, 0xfb, 0x9, 0x15,
+                                                          0xe5, 0x6, 0xa6, 0xf7, 0x9, 0x5, 0x31, 0x6,
+                                                          0xfb, 0x8e, 0xfd, 0x97, 0x15, 0x2f, 0xa, 0xe,
+                                                          0x8b, 0xc1, 0xf7, 0x57, 0xbf, 0xf7, 0x63, 0xc1,
+                                                          0x1, 0xf8, 0xad, 0xcb, 0x3, 0x8a, 0x16, 0xf7,
+                                                          0x6f, 0x6, 0xf7, 0x56, 0xf7, 0x49, 0xe1, 0xf7,
+                                                          0xaf, 0xf7, 0x22, 0x28, 0xbe, 0xfb, 0x1a, 0x1f,
+                                                          0xfb, 0x8c, 0x2d, 0xa, 0xda, 0x6, 0x63, 0xfb,
+                                                          0x63, 0x5, 0x3f, 0x6, 0x7f, 0x57, 0x5, 0xd8,
+                                                          0x6, 0x64, 0xfb, 0x57, 0x89, 0xa, 0xf7, 0x1b,
+                                                          0x16, 0xb1, 0xf7, 0x57, 0x5, 0xf7, 0x55, 0x6,
+                                                          0x96, 0xbf, 0x5, 0xfb, 0x54, 0x6, 0xb4, 0xf7,
+                                                          0x63, 0x5, 0xf0, 0x6, 0xf7, 0x2a, 0xb5, 0x60,
+                                                          0xfb, 0x16, 0xfb, 0x1a, 0x21, 0xfb, 0x27, 0xfb,
+                                                          0x3a, 0x1f, 0xe, 0x7e, 0xbf, 0xf8, 0x4e, 0xbf,
+                                                          0xdf, 0xbc, 0x9b, 0xbd, 0x1, 0x61, 0x7e, 0x15,
+                                                          0xf7, 0x8f, 0x6, 0x96, 0xbf, 0x5, 0xfb, 0x3,
+                                                          0x6, 0xe2, 0xf8, 0x37, 0xf7, 0x5a, 0xfc, 0x6b,
+                                                          0x5, 0xd7, 0x6, 0xf1, 0xf8, 0x82, 0x5, 0xdb,
+                                                          0x6, 0x96, 0xbf, 0x5, 0xfb, 0x8b, 0x82, 0xa,
+                                                          0xf7, 0x2, 0x6, 0x34, 0xfc, 0x3b, 0xfb, 0x58,
+                                                          0xf8, 0x6f, 0x5, 0xfb, 0x34, 0x6, 0x7f, 0x57,
+                                                          0x5, 0xde, 0x6, 0x30, 0xfc, 0x4e, 0x7b, 0xa,
+                                                          0xf7, 0x6c, 0xf8, 0xe5, 0x15, 0xbe, 0x80, 0x5,
+                                                          0x9f, 0x97, 0xa8, 0xb4, 0xbe, 0x1b, 0xac, 0x9e,
+                                                          0x78, 0x7a, 0xa1, 0x1f, 0x7c, 0x9e, 0x9f, 0x7d,
+                                                          0xac, 0x1b, 0xd2, 0xbb, 0xcb, 0xb2, 0x9f, 0x1f,
+                                                          0x58, 0x94, 0x5, 0x73, 0x7d, 0x6d, 0x64, 0x64,
+                                                          0x1b, 0x70, 0x7c, 0x99, 0x9a, 0x7b, 0x1f, 0x9d,
+                                                          0x78, 0x76, 0x9e, 0x5e, 0x1b, 0x50, 0x4e, 0x5d,
+                                                          0x55, 0x6c, 0x1f, 0xe, 0x79, 0xc1, 0xf8, 0x7b,
+                                                          0xc1, 0xf7, 0x6c, 0x7d, 0xa, 0xf7, 0x82, 0xf9,
+                                                          0x64, 0x15, 0xf7, 0xa0, 0x27, 0x9b, 0xa9, 0xfb,
+                                                          0x7f, 0xf7, 0x23, 0x5, 0xfb, 0x91, 0xfc, 0xd9,
+                                                          0x25, 0xa, 0x79, 0xc1, 0xf8, 0x7a, 0xc1, 0x1,
+                                                          0xaa, 0xc2, 0xf8, 0x45, 0xc3, 0x3, 0xf7, 0x97,
+                                                          0xf8, 0xff, 0x15, 0xf7, 0xbb, 0xef, 0x78, 0xd5,
+                                                          0xfb, 0xb5, 0xfb, 0x25, 0x5, 0xfb, 0x68, 0xfc,
+                                                          0x48, 0x25, 0xa, 0x79, 0xc1, 0xf8, 0x7b, 0xc1,
+                                                          0xf7, 0x5a, 0x7d, 0xa, 0xf7, 0x4b, 0xf9, 0x2,
+                                                          0x15, 0xb1, 0x7a, 0xf7, 0x40, 0xf7, 0x7, 0xf7,
+                                                          0xf, 0xfb, 0x7, 0xb6, 0x9c, 0xfb, 0x8, 0xf7,
+                                                          0x2d, 0x89, 0xa, 0xfb, 0xdd, 0xfc, 0xc7, 0x25,
+                                                          0xa, 0x79, 0xbf, 0xf8, 0x7d, 0xc1, 0xd1, 0xbc,
+                                                          0x9c, 0xbc, 0x1, 0x9e, 0xc6, 0xf8, 0x36, 0xc1,
+                                                          0x3, 0xf7, 0x2e, 0xf9, 0x2a, 0x15, 0xbd, 0x80,
+                                                          0x5, 0x9f, 0x97, 0xa7, 0xb5, 0xbb, 0x1b, 0xae,
+                                                          0x9c, 0x7a, 0x7a, 0x9d, 0x1f, 0x7b, 0x9c, 0x9e,
+                                                          0x7b, 0xb0, 0x1b, 0xd1, 0xbb, 0xca, 0xb2, 0x9e,
+                                                          0x1f, 0x58, 0x94, 0x5, 0x73, 0x7e, 0x6b, 0x65,
+                                                          0x66, 0x1b, 0x73, 0x7e, 0x97, 0x99, 0x7d, 0x1f,
+                                                          0x9d, 0x79, 0x76, 0xa1, 0x5b, 0x1b, 0x52, 0x4f,
+                                                          0x5d, 0x55, 0x6d, 0x1f, 0xfb, 0xc, 0xfc, 0x56,
+                                                          0x25, 0xa, 0x79, 0xbe, 0xf8, 0x7e, 0xc1, 0xce,
+                                                          0xf7, 0x9, 0x1, 0xad, 0xc2, 0xf7, 0x40, 0xdf,
+                                                          0xc9, 0xde, 0x9e, 0xc3, 0x3, 0xf8, 0x2b, 0xf9,
+                                                          0x18, 0x15, 0xde, 0x6, 0xa5, 0xf7, 0x9, 0x5,
+                                                          0x37, 0x6, 0xfb, 0x3f, 0xfb, 0x9, 0x15, 0xdf,
+                                                          0x6, 0xa4, 0xf7, 0x9, 0x7b, 0xa, 0xfb, 0x91,
+                                                          0xfc, 0xb9, 0x25, 0xa, 0xcb, 0x76, 0xf8, 0x3f,
+                                                          0x77, 0x1, 0xbb, 0xe4, 0x15, 0xb9, 0x5d, 0xf7,
+                                                          0x5b, 0xf7, 0x3d, 0xf7, 0x1e, 0xfb, 0x3d, 0xbb,
+                                                          0xb2, 0xfb, 0x20, 0xf7, 0x3e, 0xf7, 0x69, 0xf7,
+                                                          0x41, 0x63, 0xb8, 0xfb, 0x67, 0xfb, 0x41, 0xfb,
+                                                          0x1f, 0xf7, 0x40, 0x5d, 0x64, 0xf7, 0x1e, 0xfb,
+                                                          0x3d, 0x5, 0xe, 0x82, 0xbf, 0x5d, 0x76, 0xf8,
+                                                          0xae, 0xc0, 0x12, 0x13, 0x60, 0xf8, 0xbd, 0xf7,
+                                                          0xab, 0x15, 0x95, 0xbe, 0x8d, 0xde, 0x67, 0xca,
+                                                          0xc3, 0xc6, 0x18, 0x68, 0xab, 0x59, 0x57, 0x5,
+                                                          0xaa, 0x6c, 0x5f, 0xa0, 0x4a, 0x1b, 0xfb, 0x3f,
+                                                          0xfb, 0x7, 0xfb, 0x2b, 0xfb, 0x1d, 0x71, 0x1f,
+                                                          0x7b, 0x3b, 0x96, 0x41, 0xae, 0x58, 0x4c, 0x48,
+                                                          0x18, 0xaf, 0x6c, 0xc6, 0xc9, 0x5, 0x13, 0xa0,
+                                                          0x6d, 0xad, 0xb9, 0x7a, 0xc4, 0x1b, 0xf7, 0x31,
+                                                          0xf7, 0xa, 0xf7, 0x16, 0xf7, 0x32, 0xaa, 0x1f,
+                                                          0x55, 0x89, 0x15, 0xfb, 0xe, 0x73, 0x30, 0xfb,
+                                                          0x4, 0xfb, 0x13, 0x1b, 0x5f, 0x67, 0x9a, 0xa3,
+                                                          0x71, 0x1f, 0xf7, 0xe3, 0xf7, 0xf2, 0xa2, 0x57,
+                                                          0x88, 0x4c, 0x84, 0x63, 0x19, 0x63, 0xf7, 0x57,
+                                                          0x15, 0xfb, 0xe6, 0xfb, 0xf6, 0x72, 0xb6, 0x84,
+                                                          0xc3, 0x96, 0xc7, 0x19, 0xe1, 0x9d, 0xdb, 0xf7,
+                                                          0x2b, 0xf7, 0x29, 0x1b, 0xbf, 0xaf, 0x7b, 0x71,
+                                                          0xa3, 0x1f, 0xe, 0x59, 0xa, 0x96, 0xf8, 0x91,
+                                                          0x26, 0xa, 0xf7, 0x3c, 0xf7, 0x2f, 0x15, 0xf7,
+                                                          0x99, 0x26, 0x9c, 0xa9, 0xfb, 0x7b, 0x79, 0xa,
+                                                          0x59, 0xa, 0xf7, 0x6c, 0xf8, 0xfa, 0x15, 0xf7,
+                                                          0xb3, 0xf7, 0x0, 0x7a, 0xd2, 0xfb, 0xb2, 0xfb,
+                                                          0x25, 0x5, 0xfb, 0x51, 0xfb, 0x1f, 0x26, 0xa,
+                                                          0xe, 0x70, 0xa, 0xf7, 0x4d, 0xc2, 0x50, 0xa,
+                                                          0xf7, 0x42, 0xf9, 0xe, 0x15, 0xf7, 0x3d, 0xf7,
+                                                          0x8, 0xf7, 0xa, 0xfb, 0x8, 0xb5, 0x9c, 0xfb,
+                                                          0x4, 0xf7, 0x2e, 0x5, 0x3c, 0x6, 0xfb, 0x43,
+                                                          0xfb, 0x2e, 0x5, 0xfb, 0x12, 0xfb, 0x22, 0x26,
+                                                          0xa, 0xe, 0x70, 0xa, 0x50, 0xa, 0xf7, 0xf8,
+                                                          0xf9, 0x21, 0x15, 0xdc, 0x6, 0xa4, 0xf7, 0xa,
+                                                          0x6b, 0xa, 0xfb, 0x3b, 0xfb, 0xa, 0x85, 0xa,
+                                                          0xa3, 0xf7, 0xa, 0x6b, 0xa, 0xfb, 0x76, 0xfb,
+                                                          0x9a, 0x26, 0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5d,
+                                                          0xc1, 0x84, 0xa, 0xf7, 0x47, 0xc3, 0x3, 0xb4,
+                                                          0x16, 0x31, 0xa, 0xf7, 0x34, 0xf8, 0xc7, 0x15,
+                                                          0xf7, 0xc3, 0xf1, 0x79, 0xd5, 0xfb, 0xc1, 0xfb,
+                                                          0x24, 0x5, 0xe, 0x8b, 0xc1, 0xd1, 0x61, 0xa,
+                                                          0xd6, 0xc1, 0x1, 0xf8, 0x92, 0xc0, 0x3, 0xaf,
+                                                          0x16, 0xf7, 0xba, 0x4d, 0xa, 0xfb, 0x21, 0x6,
+                                                          0x98, 0xd1, 0x5, 0xf7, 0x15, 0x6, 0xf7, 0x1,
+                                                          0xf7, 0x5, 0xb5, 0xf7, 0x32, 0xd3, 0x46, 0xb0,
+                                                          0x37, 0x1f, 0xfb, 0x24, 0x6, 0x99, 0xd6, 0x5,
+                                                          0xf3, 0x76, 0xa, 0xfb, 0x95, 0x5f, 0xa, 0xf4,
+                                                          0x6, 0x3a, 0x58, 0xa, 0x23, 0x6, 0xf7, 0x44,
+                                                          0xf7, 0x10, 0x15, 0xae, 0xf7, 0x5d, 0x5, 0xf7,
+                                                          0x1a, 0x6, 0xc0, 0xcd, 0x7d, 0x5a, 0x28, 0x41,
+                                                          0x64, 0x38, 0x1f, 0xe, 0x7c, 0xc2, 0x60, 0xc3,
+                                                          0xf7, 0xda, 0xc3, 0xf7, 0x1f, 0xc2, 0x12, 0xf7,
+                                                          0xc4, 0xc0, 0xf7, 0x34, 0xc1, 0x5f, 0xc4, 0x13,
+                                                          0x7c, 0x9a, 0x88, 0x15, 0xf7, 0x1c, 0x6, 0xe8,
+                                                          0xf8, 0x76, 0x5, 0xd1, 0x99, 0xa5, 0xa4, 0xf2,
+                                                          0x1b, 0xd8, 0xc0, 0x8a, 0x54, 0x1f, 0x28, 0xfb,
+                                                          0x69, 0xb9, 0xfb, 0x23, 0x1a, 0x41, 0xf7, 0x17,
+                                                          0x73, 0xad, 0x7c, 0x1e, 0x13, 0xba, 0xb8, 0x76,
+                                                          0x98, 0x74, 0x74, 0x1a, 0x43, 0xfb, 0x26, 0x6d,
+                                                          0x6d, 0x59, 0x5f, 0xa4, 0xab, 0x69, 0x1e, 0x6b,
+                                                          0x53, 0x5, 0x6d, 0xb4, 0xc0, 0x71, 0xc4, 0x1b,
+                                                          0xde, 0xf7, 0x33, 0xb3, 0xf7, 0x1a, 0xb9, 0x5c,
+                                                          0xac, 0x5c, 0x9f, 0x1f, 0x53, 0xa5, 0x3e, 0x95,
+                                                          0xae, 0x1a, 0x13, 0x7c, 0xe2, 0xf7, 0x6a, 0x5d,
+                                                          0xf7, 0x25, 0x1a, 0xe8, 0x48, 0xa0, 0xfb, 0x9,
+                                                          0x2b, 0x35, 0x6f, 0xfb, 0x1f, 0x79, 0x1e, 0x85,
+                                                          0x70, 0x7b, 0xa, 0x81, 0x53, 0x5, 0xde, 0x6,
+                                                          0x4c, 0xfb, 0xda, 0x6b, 0xa, 0xe, 0x4b, 0xa,
+                                                          0xf7, 0x80, 0xf8, 0xe7, 0x15, 0xf7, 0xa5, 0x24,
+                                                          0x9d, 0xaa, 0xfb, 0x85, 0xf7, 0x29, 0x5, 0xf4,
+                                                          0xfd, 0x37, 0x21, 0xa, 0x3b, 0xa, 0xf7, 0x61,
+                                                          0x77, 0x4a, 0xa, 0x13, 0x7e, 0xf7, 0x3c, 0xf8,
+                                                          0x85, 0x15, 0xb1, 0x79, 0xf7, 0x43, 0xf7, 0xb,
+                                                          0xf7, 0x10, 0xfb, 0xb, 0xba, 0x9d, 0xfb, 0xc,
+                                                          0xf7, 0x31, 0x5, 0x3a, 0x6, 0xb3, 0xfd, 0x25,
+                                                          0x21, 0xa, 0x4b, 0xa, 0xf8, 0xa0, 0xf8, 0xe7,
+                                                          0x15, 0x72, 0xd8, 0xfb, 0x9e, 0xfb, 0x29, 0x9d,
+                                                          0x6c, 0x5, 0xf7, 0x20, 0xfc, 0x83, 0x21, 0xa,
+                                                          0x3b, 0xa, 0xc6, 0xbd, 0x9e, 0xbc, 0x90, 0x76,
+                                                          0x4a, 0xa, 0x13, 0xbd, 0x80, 0xf7, 0x21, 0xf8,
+                                                          0x9e, 0x15, 0xbd, 0x81, 0x5, 0x9a, 0x92, 0xba,
+                                                          0xbd, 0xb0, 0x1b, 0xb1, 0x9e, 0x71, 0x77, 0xa5,
+                                                          0x1f, 0x7e, 0x9b, 0x9e, 0x81, 0xa7, 0x1b, 0x13,
+                                                          0xbb, 0x80, 0xcc, 0xbe, 0xba, 0xc2, 0xab, 0x1f,
+                                                          0x8a, 0x6, 0x5a, 0x94, 0x5, 0x73, 0x7c, 0x68,
+                                                          0x66, 0x65, 0x1b, 0x72, 0x7d, 0x94, 0x97, 0x7e,
+                                                          0x1f, 0x13, 0x7d, 0x80, 0x9f, 0x75, 0x7a, 0xa6,
+                                                          0x55, 0x1b, 0x56, 0x4c, 0x64, 0x4a, 0x67, 0x1f,
+                                                          0xf7, 0x8e, 0xfc, 0xa1, 0x22, 0xa, 0x13, 0xbd,
+                                                          0x80, 0x3a, 0xa, 0x13, 0x7d, 0x80, 0x98, 0xce,
+                                                          0x15, 0x13, 0xbd, 0x80, 0x2b, 0xa, 0x3b, 0xa,
+                                                          0xd1, 0xf7, 0x8, 0x4a, 0xa, 0x13, 0x7e, 0xf8,
+                                                          0x1f, 0xf8, 0x9b, 0x15, 0xdf, 0x5c, 0xa, 0x36,
+                                                          0x6, 0xfb, 0x42, 0xfb, 0x8, 0x15, 0xe0, 0x5c,
+                                                          0xa, 0x36, 0x6, 0xf7, 0xd, 0xfd, 0x12, 0x21,
+                                                          0xa, 0x3b, 0xa, 0xb1, 0xf7, 0x48, 0x6a, 0x76,
+                                                          0x4a, 0xa, 0x13, 0xbb, 0xf7, 0xb2, 0xf8, 0xc1,
+                                                          0x15, 0x63, 0xae, 0x6d, 0xba, 0xc6, 0xc7, 0xbc,
+                                                          0xc5, 0xb5, 0x6a, 0xaa, 0x5b, 0x4d, 0x51, 0x59,
+                                                          0x4f, 0x1e, 0xc9, 0x95, 0x15, 0x13, 0x77, 0xa4,
+                                                          0xa1, 0xa0, 0xa3, 0x9c, 0x9a, 0x81, 0x7d, 0x72,
+                                                          0x74, 0x75, 0x73, 0x7b, 0x7c, 0x97, 0x98, 0x1e,
+                                                          0xb6, 0xfc, 0xce, 0x22, 0xa, 0x13, 0xbb, 0x3a,
+                                                          0xa, 0x13, 0x7b, 0x98, 0xce, 0x15, 0x13, 0xbb,
+                                                          0x2b, 0xa, 0x7c, 0xc1, 0xf7, 0x39, 0xc2, 0xf7,
+                                                          0x13, 0xc2, 0x1, 0x93, 0xc6, 0x3, 0xf7, 0xa5,
+                                                          0xd7, 0x15, 0x58, 0x93, 0xb7, 0x63, 0xda, 0x1b,
+                                                          0xb8, 0xbb, 0x96, 0x96, 0xb3, 0x1f, 0x8a, 0xc1,
+                                                          0x5, 0x82, 0x6a, 0x62, 0x7e, 0x67, 0x1b, 0x3e,
+                                                          0x6c, 0xbc, 0xcc, 0x8d, 0x1f, 0x97, 0x8f, 0x98,
+                                                          0x8c, 0x98, 0x1e, 0x8c, 0x98, 0x5, 0xf7, 0x91,
+                                                          0x6, 0x93, 0xad, 0x90, 0xa4, 0xaf, 0x1a, 0xd4,
+                                                          0x6f, 0xd0, 0x33, 0x54, 0x65, 0x71, 0x62, 0x68,
+                                                          0x1e, 0x99, 0x88, 0x88, 0xc0, 0x2b, 0x1b, 0x55,
+                                                          0x5f, 0x7e, 0x7b, 0x5c, 0x1f, 0x56, 0x7, 0x98,
+                                                          0xb0, 0xb6, 0x99, 0xb4, 0x1b, 0xbf, 0x9c, 0x78,
+                                                          0x6a, 0x8c, 0x1f, 0x80, 0x8b, 0x73, 0x87, 0x7c,
+                                                          0x1e, 0x85, 0x72, 0x5, 0x8f, 0x76, 0x75, 0x83,
+                                                          0x76, 0x1b, 0x2c, 0x8a, 0xfb, 0x7, 0x59, 0xfb,
+                                                          0xe, 0x1a, 0x48, 0xbe, 0x6d, 0xc1, 0xa5, 0xe0,
+                                                          0x90, 0xe1, 0xbc, 0x1e, 0xce, 0xf7, 0x4b, 0x15,
+                                                          0xcb, 0x9b, 0xbe, 0xca, 0xc9, 0x1b, 0xd5, 0x87,
+                                                          0x3e, 0x59, 0x87, 0x1f, 0xfb, 0xad, 0xfb, 0x18,
+                                                          0x15, 0x75, 0x7b, 0x58, 0x49, 0x4b, 0x1b, 0x68,
+                                                          0x76, 0xa0, 0xaf, 0xd7, 0xd7, 0xa7, 0xc5, 0x8c,
+                                                          0x1f, 0xa7, 0xaa, 0x92, 0x87, 0x96, 0x1f, 0xe,
+                                                          0xfb, 0x1c, 0x76, 0xf7, 0x3a, 0xbe, 0xf7, 0xdc,
+                                                          0xc0, 0x8a, 0x77, 0x12, 0xb9, 0xc5, 0x13, 0xe8,
+                                                          0xf7, 0x26, 0xfb, 0x1e, 0x15, 0x7c, 0xa1, 0x9f,
+                                                          0x87, 0x9d, 0x1b, 0xbe, 0xb3, 0xaa, 0xbf, 0xa3,
+                                                          0x78, 0xa9, 0x7d, 0x90, 0x1f, 0x90, 0xa3, 0xe1,
+                                                          0x8f, 0xd3, 0xa9, 0xcb, 0xb3, 0x19, 0x80, 0xbf,
+                                                          0x5, 0x76, 0x6c, 0x31, 0x55, 0x38, 0x1b, 0xfb,
+                                                          0x1c, 0x67, 0xda, 0xc8, 0xe3, 0xf2, 0xef, 0xf7,
+                                                          0x10, 0xc5, 0xbe, 0x7f, 0x69, 0xb0, 0x1f, 0x7b,
+                                                          0x40, 0x51, 0xa, 0x13, 0xd8, 0xb0, 0xf7, 0x41,
+                                                          0x71, 0xa, 0x82, 0x60, 0x5, 0x13, 0xe8, 0xa8,
+                                                          0x62, 0x5d, 0x9a, 0x50, 0x1b, 0xfb, 0x58, 0x26,
+                                                          0xfb, 0x1b, 0xfb, 0x10, 0x26, 0xd7, 0x4d, 0xee,
+                                                          0x81, 0x1f, 0x77, 0x44, 0x5, 0x8d, 0x90, 0x92,
+                                                          0x8c, 0x93, 0x1b, 0x98, 0x98, 0x7e, 0x80, 0x77,
+                                                          0x79, 0x7d, 0x77, 0x7f, 0x77, 0x91, 0x96, 0x82,
+                                                          0x1f, 0xe, 0x7c, 0xc2, 0xf7, 0x34, 0xc4, 0x7f,
+                                                          0xa, 0xc5, 0x3, 0xf7, 0x7d, 0xf8, 0xe9, 0x15,
+                                                          0xf7, 0xa8, 0x25, 0x9d, 0xa9, 0xfb, 0x88, 0xf7,
+                                                          0x27, 0x5, 0xfb, 0x39, 0xfc, 0x6b, 0x27, 0xa,
+                                                          0x7c, 0xc2, 0xf7, 0x33, 0xc5, 0x7f, 0xa, 0xc7,
+                                                          0x3, 0xf7, 0x78, 0xf8, 0x82, 0x15, 0xf7, 0xd0,
+                                                          0xf2, 0x77, 0xd6, 0xfb, 0xc2, 0xfb, 0x26, 0x5,
+                                                          0x23, 0xfb, 0xd9, 0x27, 0xa, 0x7c, 0xc2, 0xf7,
+                                                          0x34, 0xc4, 0xf7, 0x2c, 0xc4, 0xf7, 0x18, 0xc3,
+                                                          0x1, 0xc1, 0xc5, 0xf8, 0xb, 0xc6, 0x3, 0xf7,
+                                                          0x3b, 0xf8, 0x86, 0x15, 0xb1, 0x79, 0xf7, 0x41,
+                                                          0xf7, 0xa, 0xf7, 0xf, 0xfb, 0xa, 0xb8, 0x9d,
+                                                          0xfb, 0x9, 0xf7, 0x30, 0x89, 0xa, 0xfb, 0x7b,
+                                                          0xfc, 0x59, 0x27, 0xa, 0x7c, 0xbd, 0xf7, 0x38,
+                                                          0xc5, 0xf7, 0x32, 0x76, 0xf7, 0x1c, 0xf7, 0x7,
+                                                          0x1, 0xc1, 0xc5, 0xf7, 0x16, 0xe3, 0xcc, 0xe2,
+                                                          0x90, 0xc6, 0x3, 0xf8, 0x1f, 0xf8, 0xa6, 0x15,
+                                                          0xe2, 0x6e, 0xa, 0x33, 0x6, 0xfb, 0x45, 0xfb,
+                                                          0x7, 0x15, 0xe3, 0x6e, 0xa, 0x33, 0x6, 0xfb,
+                                                          0x29, 0xfc, 0x50, 0x27, 0xa, 0x6f, 0xa, 0xf7,
+                                                          0x7f, 0x77, 0x1, 0xf7, 0x82, 0xf8, 0xe8, 0x15,
+                                                          0xf7, 0x93, 0x25, 0x9c, 0xab, 0xfb, 0x75, 0xf7,
+                                                          0x26, 0x5, 0xfb, 0x61, 0xfd, 0x34, 0x33, 0xa,
+                                                          0x6f, 0xa, 0xf7, 0x7f, 0x77, 0x1, 0xdb, 0x16,
+                                                          0xf8, 0x13, 0x46, 0xa, 0xfb, 0x3a, 0x6, 0xd2,
+                                                          0xf8, 0x12, 0x5, 0xfb, 0x4f, 0x67, 0xa, 0xf7,
+                                                          0x1b, 0x6, 0x4e, 0xfb, 0xdb, 0x5, 0xfb, 0x3b,
+                                                          0x6, 0xf7, 0x2f, 0xf8, 0x4b, 0x15, 0xf7, 0xa7,
+                                                          0xf1, 0x70, 0xd7, 0xfb, 0x9d, 0xfb, 0x26, 0x5,
+                                                          0xe, 0x6f, 0xa, 0xf7, 0x6d, 0x77, 0x1, 0xf7,
+                                                          0x36, 0xf8, 0x86, 0x15, 0xaf, 0x79, 0xf7, 0x3c,
+                                                          0xf7, 0xa, 0xf7, 0x9, 0xfb, 0xa, 0xb8, 0x9d,
+                                                          0xfb, 0x5, 0xf7, 0x30, 0x5, 0x3e, 0x6, 0xfb,
+                                                          0x96, 0xfd, 0x22, 0x33, 0xa, 0x6f, 0xa, 0xde,
+                                                          0xf7, 0x7, 0x1, 0xf8, 0x2c, 0xf8, 0x9c, 0x15,
+                                                          0xe4, 0x6e, 0xa, 0x32, 0x6, 0xfb, 0x4b, 0xfb,
+                                                          0x7, 0x15, 0xe6, 0x6e, 0xa, 0x31, 0x6, 0xfb,
+                                                          0x58, 0xfd, 0xf, 0x33, 0xa, 0x7c, 0xbe, 0xf7,
+                                                          0xc6, 0xbf, 0xf7, 0x7f, 0x77, 0x1, 0xaa, 0xc6,
+                                                          0xf8, 0x2f, 0xce, 0x3, 0xf7, 0x9b, 0xf8, 0x50,
+                                                          0x15, 0xf7, 0x13, 0xc6, 0xd2, 0x5d, 0xad, 0x28,
+                                                          0x8e, 0x7d, 0x19, 0xaa, 0x69, 0x4c, 0x9e, 0x53,
+                                                          0x1b, 0xfb, 0x66, 0x23, 0xfb, 0x11, 0xfb, 0x11,
+                                                          0x22, 0xe5, 0x55, 0xf7, 0x15, 0xf7, 0x6e, 0xef,
+                                                          0xf7, 0x26, 0xf7, 0x35, 0xd9, 0x6c, 0xef, 0x37,
+                                                          0xcb, 0x1f, 0xf2, 0xbd, 0x78, 0xb8, 0xfb, 0x18,
+                                                          0x4b, 0x66, 0x9d, 0x62, 0xa2, 0x5d, 0x90, 0x19,
+                                                          0x5e, 0x5d, 0xac, 0x88, 0xaf, 0x79, 0xa9, 0x7f,
+                                                          0x19, 0x31, 0x5f, 0x5, 0xfb, 0x2f, 0xfb, 0xe7,
+                                                          0x15, 0xf7, 0x7, 0xf7, 0x1, 0xd9, 0xf7, 0x11,
+                                                          0x1e, 0x92, 0x6, 0xf7, 0x18, 0xb1, 0x5c, 0x52,
+                                                          0x22, 0xfb, 0xa, 0x2a, 0xfb, 0xe, 0x27, 0x44,
+                                                          0xb6, 0xd1, 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0xc5,
+                                                          0xc0, 0xdb, 0xbb, 0x9b, 0xbf, 0x1, 0xea, 0xc3,
+                                                          0xf7, 0xa9, 0xc3, 0x3, 0xf7, 0x45, 0xf8, 0x96,
+                                                          0x15, 0xbb, 0x7d, 0x5, 0x9a, 0x92, 0xb9, 0xbc,
+                                                          0xaf, 0x1b, 0xaa, 0x9b, 0x79, 0x7a, 0x9d, 0x1f,
+                                                          0x7c, 0x9b, 0x9e, 0x7d, 0xae, 0x1b, 0xcb, 0xc6,
+                                                          0xb9, 0xc2, 0xa9, 0x1f, 0x59, 0x97, 0x5, 0x73,
+                                                          0x7d, 0x5e, 0x62, 0x65, 0x1b, 0x73, 0x7e, 0x9a,
+                                                          0x9a, 0x7c, 0x1f, 0x9d, 0x7a, 0x78, 0x9f, 0x62,
+                                                          0x1b, 0x56, 0x4e, 0x65, 0x4b, 0x68, 0x1f, 0xfb,
+                                                          0x46, 0xfc, 0x96, 0x15, 0xf7, 0x76, 0x6, 0x97,
+                                                          0xbf, 0x5, 0x35, 0x6, 0xbb, 0xf7, 0x7c, 0x5,
+                                                          0xb6, 0xc0, 0xda, 0xb7, 0xca, 0x1b, 0xb1, 0xbc,
+                                                          0x82, 0x5f, 0x84, 0x8b, 0x82, 0x89, 0x82, 0x1f,
+                                                          0x58, 0xfb, 0x85, 0x5, 0x37, 0x82, 0xa, 0xf7,
+                                                          0x73, 0x6, 0x97, 0xbf, 0x5, 0x37, 0x6, 0xbd,
+                                                          0xf7, 0x86, 0x5, 0x8e, 0x98, 0x8d, 0x97, 0x96,
+                                                          0x1a, 0xc5, 0x8c, 0x67, 0xae, 0x38, 0x1b, 0x44,
+                                                          0x3e, 0x65, 0x5f, 0x4d, 0x1f, 0x9a, 0xd0, 0x5,
+                                                          0xfb, 0x21, 0x6, 0x80, 0x56, 0x5, 0xe0, 0x6,
+                                                          0x4b, 0xfb, 0xc5, 0x5, 0x36, 0x6, 0xe, 0x5a,
+                                                          0xa, 0xf7, 0x7d, 0xf8, 0xe7, 0x15, 0xf7, 0x93,
+                                                          0x23, 0x9a, 0xaa, 0xfb, 0x73, 0xf7, 0x2a, 0x5,
+                                                          0xfb, 0x73, 0xfc, 0x90, 0x29, 0xa, 0xe, 0x5a,
+                                                          0xa, 0xc4, 0xf7, 0x38, 0x29, 0xa, 0xf7, 0x15,
+                                                          0xf7, 0xcc, 0x15, 0xf7, 0xba, 0xea, 0x7b, 0xe1,
+                                                          0xfb, 0xb9, 0xfb, 0x2a, 0x5, 0xe, 0x5d, 0xa,
+                                                          0xf7, 0x62, 0x77, 0x49, 0xa, 0xf7, 0x43, 0xf8,
+                                                          0x85, 0x15, 0xae, 0x79, 0xf7, 0x38, 0xf7, 0xb,
+                                                          0xf7, 0x8, 0xfb, 0xb, 0xb7, 0x9d, 0xfb, 0x4,
+                                                          0xf7, 0x31, 0x5, 0x3f, 0x6, 0xfb, 0xb5, 0xfc,
+                                                          0x7e, 0x29, 0xa, 0xe, 0x5d, 0xa, 0xc9, 0xbd,
+                                                          0x9c, 0xbc, 0x49, 0xa, 0xf7, 0x2c, 0xf8, 0xa1,
+                                                          0x15, 0xbb, 0x80, 0x5, 0x9a, 0x91, 0xb6, 0xbb,
+                                                          0xaf, 0x1b, 0xa3, 0x9c, 0x7c, 0x7b, 0x9d, 0x1f,
+                                                          0x7a, 0x9f, 0x9f, 0x78, 0xaa, 0x1b, 0xc8, 0xc5,
+                                                          0xbb, 0xc2, 0xa8, 0x1f, 0x5b, 0x94, 0x5, 0x73,
+                                                          0x7d, 0x63, 0x65, 0x67, 0x1b, 0x75, 0x7b, 0x99,
+                                                          0x98, 0x7c, 0x1f, 0x9e, 0x75, 0x76, 0x9f, 0x69,
+                                                          0x1b, 0x59, 0x50, 0x67, 0x4a, 0x69, 0x1f, 0x2c,
+                                                          0xfb, 0xfd, 0x29, 0xa, 0xe, 0x5d, 0xa, 0xd3,
+                                                          0xf7, 0x7, 0x49, 0xa, 0xf8, 0x11, 0xf8, 0x9c,
+                                                          0x15, 0xda, 0x6, 0xa3, 0xf7, 0x7, 0x89, 0xa,
+                                                          0xfb, 0x38, 0xfb, 0x7, 0x15, 0xdc, 0x6, 0xa2,
+                                                          0xf7, 0x7, 0x5, 0x3a, 0x6, 0xfb, 0x62, 0xfc,
+                                                          0x6b, 0x29, 0xa, 0xe, 0xc6, 0x76, 0xf7, 0x55,
+                                                          0xc6, 0xf7, 0x45, 0x77, 0x1, 0xf7, 0xad, 0xf8,
+                                                          0x2e, 0x6c, 0xa, 0x9f, 0x75, 0x71, 0x6f, 0x70,
+                                                          0x6d, 0x1e, 0xfb, 0x5c, 0xfb, 0x47, 0x15, 0xf8,
+                                                          0x3e, 0x6, 0x96, 0xc6, 0x5, 0xfc, 0x3e, 0x6,
+                                                          0xf7, 0x1b, 0xfb, 0x64, 0x6c, 0xa, 0x9d, 0x75,
+                                                          0x71, 0x6f, 0x72, 0x6d, 0x1e, 0xe, 0x7f, 0xc3,
+                                                          0x63, 0x76, 0xf8, 0x2e, 0xc2, 0x8e, 0x77, 0x12,
+                                                          0x13, 0x60, 0xa3, 0xa3, 0x15, 0xa7, 0x62, 0xcb,
+                                                          0xbe, 0x5, 0x13, 0x90, 0x69, 0xb1, 0xc0, 0x7f,
+                                                          0xbd, 0x1b, 0xf7, 0x14, 0xf7, 0xf, 0xdd, 0xf7,
+                                                          0x29, 0xa6, 0x1f, 0x95, 0xbf, 0x86, 0xbf, 0x72,
+                                                          0xb1, 0xc8, 0xbc, 0x18, 0x6f, 0xb4, 0x4c, 0x58,
+                                                          0x5, 0x13, 0xa0, 0xac, 0x65, 0x5a, 0x9a, 0x53,
+                                                          0x1b, 0xfb, 0x2d, 0x21, 0x22, 0xfb, 0x11, 0x73,
+                                                          0x1f, 0x82, 0x55, 0x91, 0x54, 0xa6, 0x65, 0x8,
+                                                          0xdb, 0x8d, 0x15, 0xf7, 0xc6, 0xf7, 0x8d, 0x9c,
+                                                          0x6e, 0x8f, 0x66, 0x83, 0x65, 0x19, 0x7e, 0x5d,
+                                                          0x5, 0x68, 0x7d, 0x52, 0x2e, 0xfb, 0x18, 0x1b,
+                                                          0x65, 0x66, 0x93, 0xa0, 0x6f, 0x1f, 0x69, 0xb0,
+                                                          0x15, 0x78, 0xa7, 0x86, 0xb3, 0x92, 0xb3, 0x8,
+                                                          0xf6, 0x9f, 0xea, 0xcf, 0xf3, 0x1b, 0xaa, 0xb6,
+                                                          0x84, 0x72, 0xab, 0x1f, 0xe, 0x4e, 0xa, 0xf7,
+                                                          0x80, 0x77, 0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf7,
+                                                          0x75, 0xf8, 0xea, 0x15, 0xf7, 0x9c, 0x21, 0x9b,
+                                                          0xad, 0xfb, 0x7c, 0xf7, 0x26, 0x5, 0xfb, 0x65,
+                                                          0xfb, 0xb8, 0x24, 0xa, 0x4e, 0xa, 0xf7, 0x80,
+                                                          0x77, 0x12, 0xdd, 0xc6, 0x13, 0xb8, 0xf7, 0x77,
+                                                          0xf8, 0x81, 0x15, 0xf7, 0xd4, 0xf3, 0x77, 0xd6,
+                                                          0xfb, 0xc7, 0xfb, 0x20, 0x5, 0xfb, 0x3b, 0xfb,
+                                                          0x2c, 0x24, 0xa, 0x4e, 0xa, 0xf7, 0x82, 0x77,
+                                                          0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf7, 0x39, 0xf8,
+                                                          0x98, 0x15, 0xaf, 0x7a, 0xf7, 0x3d, 0xf7, 0xb,
+                                                          0xf7, 0xc, 0xfb, 0xb, 0xb8, 0x9c, 0xfb, 0x7,
+                                                          0xf7, 0x32, 0x5, 0x3d, 0x6, 0xfb, 0xaa, 0xfb,
+                                                          0xba, 0x24, 0xa, 0x4e, 0xa, 0xe8, 0xf7, 0x8,
+                                                          0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf8, 0x10, 0xf8,
+                                                          0xa5, 0x15, 0xdc, 0x6, 0xa3, 0xf7, 0x8, 0x6b,
+                                                          0xa, 0xfb, 0x3d, 0xfb, 0x8, 0x15, 0xdf, 0x6,
+                                                          0xa2, 0xf7, 0x8, 0x7b, 0xa, 0xfb, 0x56, 0xfb,
+                                                          0x9d, 0x24, 0xa, 0xfb, 0x31, 0xc1, 0xf8, 0x72,
+                                                          0xc1, 0x1, 0xe0, 0xcb, 0xf7, 0xf6, 0xcb, 0x3,
+                                                          0xf7, 0x70, 0xf8, 0x89, 0x15, 0xf7, 0xdb, 0xef,
+                                                          0x76, 0xd2, 0xfb, 0xcc, 0xfb, 0x20, 0x5, 0xfb,
+                                                          0x89, 0xfd, 0xf, 0x15, 0x7f, 0x55, 0x5, 0xf7,
+                                                          0xa3, 0x2a, 0xa, 0x31, 0x6, 0xf8, 0x36, 0xf8,
+                                                          0x72, 0x5, 0xce, 0x4d, 0xa, 0xfb, 0x52, 0x5f,
+                                                          0xa, 0xc6, 0x6, 0xfb, 0x82, 0xfb, 0xa1, 0x26,
+                                                          0xf7, 0xa1, 0x5, 0xcf, 0x4d, 0xa, 0xfb, 0x5f,
+                                                          0x2d, 0xa, 0xd3, 0x6, 0xf7, 0xf, 0xfb, 0xd6,
+                                                          0xfb, 0x1e, 0xfb, 0x30, 0x5, 0xe, 0xfb, 0x31,
+                                                          0xc0, 0xf7, 0xc, 0xc1, 0xf7, 0xe1, 0xc1, 0xf7,
+                                                          0xb, 0xc0, 0x1, 0xdc, 0xc2, 0xf8, 0x3a, 0xc4,
+                                                          0x3, 0x88, 0x23, 0x15, 0x80, 0x56, 0x5, 0xf7,
+                                                          0xba, 0x80, 0xa, 0xfb, 0x2f, 0x6, 0xb6, 0xf7,
+                                                          0x64, 0x5, 0x65, 0xa3, 0xb9, 0x59, 0xe7, 0x1b,
+                                                          0xf7, 0x22, 0xf7, 0x18, 0xf7, 0x11, 0xf7, 0x2a,
+                                                          0xf3, 0x37, 0xc9, 0x2c, 0x34, 0x49, 0x71, 0x5e,
+                                                          0x5e, 0x1f, 0xbc, 0xf7, 0x87, 0x5, 0xfb, 0x1e,
+                                                          0x6, 0x7f, 0x56, 0x5, 0xdf, 0x6, 0xfb, 0x20,
+                                                          0xfd, 0x3c, 0x5, 0xf7, 0x17, 0xf7, 0xf3, 0x15,
+                                                          0xe2, 0x9d, 0xdb, 0xd0, 0xf7, 0x1, 0x1b, 0xf7,
+                                                          0x5, 0xa5, 0x3c, 0x52, 0xfb, 0xa, 0xfb, 0xf,
+                                                          0x3c, 0x34, 0x2d, 0x4c, 0xd8, 0xef, 0xa0, 0x1f,
+                                                          0xe, 0xfb, 0x31, 0xbd, 0xf8, 0x64, 0xbc, 0xd8,
+                                                          0xf7, 0x4, 0x1, 0xf8, 0x15, 0xf8, 0x81, 0x15,
+                                                          0xe3, 0x6, 0xa4, 0xf7, 0x4, 0x5, 0x33, 0x6,
+                                                          0xfb, 0x4b, 0xfb, 0x4, 0x15, 0xe6, 0x6, 0xa4,
+                                                          0xf7, 0x4, 0x5, 0x31, 0x6, 0xfb, 0xb0, 0xfd,
+                                                          0x5c, 0x15, 0x7f, 0x59, 0x5, 0xf7, 0xa2, 0x6,
+                                                          0x97, 0xbd, 0x5, 0x30, 0x6, 0xf8, 0x36, 0xf8,
+                                                          0x64, 0x5, 0xce, 0x6, 0x96, 0xbc, 0x5, 0xfb,
+                                                          0x51, 0x6, 0x7f, 0x5a, 0x5, 0xc6, 0x6, 0xfb,
+                                                          0x80, 0xfb, 0x97, 0x24, 0xf7, 0x97, 0x5, 0xd0,
+                                                          0x6, 0x95, 0xbc, 0x5, 0xfb, 0x5f, 0x6, 0x81,
+                                                          0x5a, 0x5, 0xd2, 0x6, 0xf7, 0xf, 0xfb, 0xc8,
+                                                          0xfb, 0x1e, 0xfb, 0x30, 0x5, 0xe, 0x8b, 0xc1,
+                                                          0xf8, 0x3e, 0xc2, 0xcf, 0xf7, 0x5, 0x1, 0xaf,
+                                                          0x16, 0x44, 0xa, 0xf8, 0x3e, 0x37, 0xa, 0xfc,
+                                                          0x3e, 0x5, 0xfb, 0x45, 0x6, 0xf7, 0xa8, 0xf8,
+                                                          0xb9, 0x15, 0xe6, 0x6, 0xa4, 0xf7, 0x5, 0x5,
+                                                          0x31, 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd2, 0xc1,
+                                                          0x1, 0xf7, 0xab, 0xc3, 0x3, 0xe5, 0x16, 0xf8,
+                                                          0x2d, 0x2a, 0xa, 0xfb, 0x43, 0x6, 0xd4, 0xf8,
+                                                          0x8, 0x5, 0xfb, 0x5b, 0x5f, 0xa, 0xf7, 0x24,
+                                                          0x6, 0x4b, 0xfb, 0xd2, 0x5, 0xfb, 0x46, 0x6,
+                                                          0xe, 0x7a, 0xc1, 0x69, 0x76, 0xf8, 0xa2, 0xc1,
+                                                          0x12, 0xf7, 0x23, 0xc6, 0xf7, 0xd5, 0xc1, 0x13,
+                                                          0xb8, 0x68, 0x7a, 0x15, 0xf7, 0x56, 0x47, 0xa,
+                                                          0x49, 0x6, 0xec, 0xf8, 0x6b, 0x5, 0xc9, 0x47,
+                                                          0xa, 0xfb, 0x4e, 0x45, 0xa, 0xcc, 0x6, 0x2a,
+                                                          0xfc, 0x6b, 0x5, 0x46, 0x6, 0xf7, 0x92, 0xa0,
+                                                          0x15, 0x13, 0x78, 0x67, 0xa3, 0xa8, 0x63, 0xce,
+                                                          0x1b, 0xf7, 0x13, 0x98, 0x7c, 0xa, 0xba, 0x36,
+                                                          0xa, 0xfb, 0x66, 0x38, 0xa, 0xf7, 0x1, 0x6,
+                                                          0x4b, 0xfb, 0xdc, 0x5, 0x3a, 0x7b, 0x88, 0x4d,
+                                                          0x36, 0x1b, 0x71, 0x5b, 0x91, 0xf7, 0xe, 0xa2,
+                                                          0x1f, 0x9a, 0xe6, 0x71, 0xa, 0xe, 0xfb, 0x31,
+                                                          0xc1, 0xf8, 0x84, 0xc4, 0xe4, 0xf7, 0xa, 0x1,
+                                                          0xf8, 0x7f, 0xf8, 0xaf, 0x54, 0xa, 0xfb, 0xa2,
+                                                          0xfd, 0xb2, 0x15, 0x81, 0xa8, 0xa1, 0x85, 0xa8,
+                                                          0x1b, 0xf6, 0x92, 0xb6, 0xf7, 0x12, 0xad, 0x1f,
+                                                          0xea, 0xf8, 0x45, 0x5, 0xfb, 0x25, 0x82, 0xa,
+                                                          0xdf, 0x6, 0x39, 0xfc, 0x3, 0x74, 0x2e, 0x83,
+                                                          0x69, 0x5c, 0x89, 0x19, 0x6c, 0x8a, 0x7c, 0x91,
+                                                          0x73, 0x92, 0x8, 0xfb, 0x93, 0x81, 0x15, 0x80,
+                                                          0x55, 0x5, 0xf7, 0x3c, 0x6, 0x98, 0xc1, 0x5,
+                                                          0x4e, 0x6, 0xf7, 0x1, 0xf8, 0x84, 0x5, 0xc3,
+                                                          0x46, 0xa, 0xfb, 0x3e, 0x38, 0xa, 0xc1, 0x6,
+                                                          0xfb, 0x1, 0xfc, 0x84, 0x5, 0xf7, 0x17, 0xf9,
+                                                          0x14, 0x54, 0xa, 0xe, 0x3e, 0xa, 0x9f, 0x16,
+                                                          0xf8, 0x91, 0x6, 0xbe, 0xf7, 0x91, 0x71, 0xa,
+                                                          0x5f, 0xfb, 0x5b, 0x5, 0xfb, 0xb2, 0x6, 0xb0,
+                                                          0xf7, 0x4e, 0xf7, 0x53, 0xd1, 0x96, 0xc2, 0xfb,
+                                                          0x53, 0x44, 0xb6, 0xf7, 0x6a, 0x5, 0xf7, 0x13,
+                                                          0x2a, 0xa, 0xfb, 0xb6, 0x45, 0xa, 0xf7, 0x0,
+                                                          0x6, 0x5c, 0xfb, 0x80, 0x30, 0x69, 0x80, 0x55,
+                                                          0xe6, 0xad, 0x6b, 0xfb, 0x38, 0x57, 0xa, 0xe,
+                                                          0x8b, 0xc2, 0xf8, 0x9b, 0xc2, 0x1, 0xc3, 0x16,
+                                                          0xf8, 0x57, 0x6, 0x98, 0xc2, 0x5, 0xfb, 0x56,
+                                                          0x6, 0xbf, 0xf7, 0x89, 0xf7, 0x2e, 0xc0, 0x97,
+                                                          0xc2, 0xfb, 0x2d, 0x56, 0xc5, 0xf7, 0xa6, 0x5,
+                                                          0xfb, 0x90, 0x56, 0xa, 0xf7, 0x53, 0x6, 0x58,
+                                                          0xfb, 0x85, 0xfb, 0x33, 0x55, 0x80, 0x55, 0xf7,
+                                                          0x32, 0xc0, 0x59, 0xfb, 0x73, 0x5, 0xfb, 0x57,
+                                                          0x6, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0xc2, 0xf7,
+                                                          0x5c, 0xc1, 0x1, 0x85, 0xc3, 0x3, 0xf7, 0xc2,
+                                                          0xc1, 0x15, 0xb2, 0xf7, 0x5b, 0x5, 0xda, 0x60,
+                                                          0xa, 0xc1, 0x6, 0xac, 0xf7, 0x3a, 0x5, 0x55,
+                                                          0x38, 0xa, 0x3c, 0x6, 0xb2, 0xf7, 0x5c, 0x5,
+                                                          0xf7, 0x2a, 0x6, 0x78, 0x27, 0x6a, 0xa, 0xa9,
+                                                          0xf7, 0x2e, 0x5, 0xfb, 0xa5, 0x6, 0xfb, 0x3f,
+                                                          0xfb, 0x3d, 0xfb, 0x21, 0xfb, 0x6a, 0xfb, 0x3,
+                                                          0xc3, 0x2b, 0xf7, 0x32, 0x1f, 0xf7, 0xb5, 0x6,
+                                                          0xaa, 0xf7, 0x2c, 0x52, 0xa, 0x77, 0x29, 0x5,
+                                                          0xfb, 0x62, 0x16, 0xfb, 0x25, 0x57, 0xc9, 0xf2,
+                                                          0xf7, 0x3e, 0xf7, 0x2c, 0xf7, 0xc, 0xf7, 0x1a,
+                                                          0x8a, 0x1f, 0xe, 0x7c, 0xc2, 0xf7, 0x38, 0xc1,
+                                                          0xf7, 0x14, 0xc2, 0x1, 0x9e, 0xc2, 0xf7, 0x65,
+                                                          0xba, 0xf7, 0x57, 0xc2, 0x3, 0xf7, 0xad, 0xd3,
+                                                          0x15, 0x57, 0x9b, 0xaa, 0x68, 0xd5, 0x1b, 0xb6,
+                                                          0xba, 0x97, 0x96, 0xb2, 0x1f, 0xc2, 0x7, 0x82,
+                                                          0x6d, 0x62, 0x7d, 0x68, 0x1b, 0x4c, 0x64, 0xad,
+                                                          0xd6, 0x99, 0x8e, 0xa5, 0x8f, 0x9a, 0x1f, 0xf7,
+                                                          0x80, 0x6, 0x94, 0xaa, 0x90, 0xa2, 0xae, 0x1a,
+                                                          0xd6, 0x78, 0xd4, 0x36, 0x46, 0x5f, 0x5a, 0x6d,
+                                                          0x76, 0x1e, 0xba, 0x80, 0x69, 0xab, 0x4b, 0x1b,
+                                                          0xfb, 0x2f, 0x50, 0xfb, 0x5c, 0xfb, 0x11, 0xfb,
+                                                          0xc, 0xe3, 0x80, 0xa8, 0xe3, 0xb7, 0xcb, 0xa2,
+                                                          0x98, 0x1f, 0xc7, 0xf7, 0x4e, 0x15, 0xcb, 0x9b,
+                                                          0xbe, 0xcb, 0xc7, 0x1b, 0xd1, 0x82, 0x3d, 0x59,
+                                                          0x87, 0x1f, 0xfc, 0x57, 0xfb, 0xf, 0x15, 0xe9,
+                                                          0xbe, 0xf7, 0x31, 0xec, 0xe2, 0x7e, 0x29, 0x4c,
+                                                          0x7e, 0x1e, 0x47, 0x7f, 0x75, 0xfb, 0x9, 0x23,
+                                                          0x1b, 0x4d, 0x82, 0xbc, 0xb9, 0x1f, 0xe, 0xfb,
+                                                          0x16, 0x76, 0xf7, 0x70, 0xc6, 0xf7, 0x36, 0xc4,
+                                                          0xf7, 0x3a, 0xc8, 0x91, 0x77, 0x12, 0xeb, 0xce,
+                                                          0xf7, 0xd0, 0xcf, 0x13, 0xf6, 0x98, 0xcf, 0x15,
+                                                          0xcc, 0x6, 0x97, 0xc7, 0xba, 0x75, 0xb8, 0x6c,
+                                                          0xd8, 0x85, 0x19, 0x78, 0x38, 0x5, 0x90, 0x94,
+                                                          0x95, 0x8c, 0x94, 0x1b, 0x9b, 0x98, 0x80, 0x7d,
+                                                          0x7d, 0x84, 0x6d, 0x68, 0x7a, 0x79, 0x8f, 0x94,
+                                                          0x7f, 0x1f, 0x6c, 0x50, 0x5, 0x82, 0x91, 0xa6,
+                                                          0x78, 0xad, 0x1b, 0xbb, 0xc9, 0xb5, 0xe1, 0xa6,
+                                                          0x7e, 0xaf, 0x73, 0x96, 0x1f, 0x8e, 0x9d, 0x5,
+                                                          0xf7, 0x20, 0x91, 0xe2, 0xba, 0xf6, 0x1a, 0xcf,
+                                                          0x3c, 0xb8, 0x34, 0x90, 0x1e, 0x3c, 0x8f, 0xfb,
+                                                          0x1f, 0x7f, 0xe5, 0x1a, 0xc7, 0xf7, 0xc, 0xa3,
+                                                          0xbc, 0xcc, 0xc8, 0x73, 0x6e, 0xb7, 0x1e, 0x7e,
+                                                          0x52, 0x5, 0xc9, 0x6, 0x13, 0xee, 0xaf, 0xf7,
+                                                          0x45, 0x5, 0x4d, 0x6, 0x82, 0x54, 0x5, 0x13,
+                                                          0xf6, 0xa8, 0x5b, 0x4e, 0x9f, 0x4a, 0x1b, 0xfb,
+                                                          0x16, 0xfb, 0x8, 0x50, 0x30, 0xfb, 0x16, 0xf7,
+                                                          0x1f, 0x8b, 0xf3, 0x87, 0x1f, 0xdf, 0x88, 0xc3,
+                                                          0x75, 0x5a, 0x1a, 0x35, 0xfb, 0x22, 0x89, 0x56,
+                                                          0x40, 0x53, 0xad, 0xb4, 0x5b, 0x1e, 0x96, 0xc0,
+                                                          0x5, 0x4b, 0x6, 0xe, 0xfb, 0x16, 0x76, 0xf7,
+                                                          0x47, 0xba, 0xf7, 0x17, 0xb9, 0xf7, 0x1b, 0xbd,
+                                                          0x8f, 0x77, 0x12, 0xf7, 0xa, 0xc8, 0xf7, 0xac,
+                                                          0xc7, 0x13, 0xf6, 0xba, 0xa6, 0x15, 0xc2, 0x6,
+                                                          0x96, 0xbb, 0xb5, 0x7a, 0xb5, 0x76, 0xcd, 0x82,
+                                                          0x19, 0x7b, 0x47, 0x5, 0x8e, 0x92, 0x92, 0x8d,
+                                                          0x92, 0x1b, 0x9a, 0x99, 0x82, 0x7f, 0x80, 0x85,
+                                                          0x73, 0x6c, 0x7c, 0x7b, 0x8e, 0x92, 0x80, 0x1f,
+                                                          0x70, 0x5c, 0x5, 0x83, 0x90, 0xa3, 0x7c, 0xa9,
+                                                          0x1b, 0xb5, 0xc2, 0xac, 0xd0, 0x1f, 0x8a, 0xa1,
+                                                          0x81, 0xaa, 0x76, 0x94, 0x8d, 0x9a, 0x18, 0xf7,
+                                                          0x11, 0x90, 0xd8, 0xb0, 0xe2, 0x1a, 0x8c, 0xc2,
+                                                          0x44, 0xaf, 0x3d, 0x8f, 0x8, 0x45, 0x8e, 0xfb,
+                                                          0xe, 0x82, 0xd4, 0x1a, 0xbc, 0xf5, 0x9e, 0xb6,
+                                                          0xc4, 0xc2, 0x78, 0x73, 0xb2, 0x1e, 0x80, 0x5d,
+                                                          0x5, 0xc1, 0x6, 0x13, 0xee, 0xaa, 0xf7, 0x23,
+                                                          0x5, 0x55, 0x6, 0x83, 0x5f, 0x5, 0x13, 0xf6,
+                                                          0xa2, 0x61, 0x54, 0x9c, 0x52, 0x1b, 0xfb, 0x7,
+                                                          0x23, 0x5b, 0x41, 0x21, 0xf7, 0x10, 0x8b, 0xe7,
+                                                          0x88, 0x1f, 0xd5, 0x89, 0xbe, 0x79, 0x63, 0x1a,
+                                                          0x46, 0xfb, 0x13, 0x89, 0x5c, 0x49, 0x59, 0xa7,
+                                                          0xac, 0x60, 0x1e, 0x95, 0xb6, 0x62, 0xa, 0xe,
+                                                          0x77, 0xc2, 0xf8, 0x7d, 0xc2, 0x8b, 0xb9, 0xf7,
+                                                          0x48, 0x77, 0x12, 0xf4, 0xc7, 0xf7, 0xa7, 0xc8,
+                                                          0x17, 0x8c, 0x81, 0x15, 0xc4, 0x78, 0xa, 0x5f,
+                                                          0xc1, 0xe9, 0x7a, 0xb9, 0x1b, 0xf7, 0x9, 0xf7,
+                                                          0xd, 0xae, 0xf7, 0x21, 0xe6, 0x38, 0xa8, 0x3a,
+                                                          0x9f, 0x1f, 0x45, 0x9c, 0x25, 0x98, 0xde, 0x1a,
+                                                          0xd7, 0xcd, 0xb2, 0xee, 0xc1, 0xcf, 0x71, 0x68,
+                                                          0xab, 0x1e, 0x7a, 0x3a, 0x5, 0xc6, 0x6, 0xad,
+                                                          0xf7, 0x50, 0x71, 0xa, 0x83, 0x63, 0x5, 0x13,
+                                                          0xfc, 0xa7, 0x69, 0x45, 0xa0, 0x56, 0x1b, 0xfb,
+                                                          0x33, 0x40, 0x4c, 0xfb, 0x3, 0xfb, 0xf, 0xf7,
+                                                          0x10, 0x74, 0xdc, 0x79, 0x1f, 0xce, 0x7d, 0xca,
+                                                          0x6c, 0x61, 0x1a, 0x49, 0x4e, 0x56, 0xfb, 0x6,
+                                                          0x4a, 0x3e, 0xa7, 0xb3, 0x60, 0x1e, 0x99, 0xd1,
+                                                          0x62, 0xa, 0xf7, 0xbb, 0xf8, 0x58, 0x15, 0xde,
+                                                          0x6, 0xf7, 0x4b, 0xf7, 0x36, 0x62, 0x9d, 0xfb,
+                                                          0x3c, 0xfb, 0xd, 0xfb, 0x1b, 0xf7, 0xd, 0x5d,
+                                                          0x78, 0x5, 0xe, 0x7c, 0xc2, 0x8b, 0xf7, 0x25,
+                                                          0x8b, 0xbf, 0x8b, 0xf7, 0x2a, 0x8b, 0xc2, 0x8b,
+                                                          0xbc, 0xf7, 0x46, 0x77, 0x1, 0xf3, 0xc4, 0xf7,
+                                                          0xa5, 0xc6, 0x3, 0xf7, 0xc5, 0xf8, 0x7f, 0x85,
+                                                          0xa, 0xf7, 0x49, 0xf7, 0x32, 0x64, 0x9f, 0xfb,
+                                                          0x3d, 0xfb, 0x4, 0xfb, 0x17, 0xf7, 0x3, 0x5e,
+                                                          0x77, 0x5, 0xfb, 0x2c, 0xfd, 0x2b, 0x15, 0xc3,
+                                                          0x36, 0xa, 0x74, 0xb8, 0xb5, 0x6b, 0xdd, 0x1b,
+                                                          0xf7, 0x1e, 0xe2, 0xb5, 0xf2, 0x1f, 0x8c, 0xc8,
+                                                          0x46, 0xb5, 0x40, 0x8f, 0x8, 0x47, 0x8f, 0xfb,
+                                                          0xd, 0x80, 0xdc, 0x1a, 0xc1, 0xf3, 0xa1, 0xb6,
+                                                          0xc3, 0xbf, 0x75, 0x70, 0xb1, 0x1e, 0x80, 0x58,
+                                                          0x5, 0xc1, 0x6, 0xab, 0xf7, 0x34, 0x5, 0x55,
+                                                          0x6, 0x82, 0x59, 0x5, 0xa6, 0x62, 0x57, 0x9d,
+                                                          0x52, 0x1b, 0xfb, 0x4, 0x27, 0x56, 0x38, 0xfb,
+                                                          0x9, 0xf7, 0xc, 0x8b, 0xe5, 0x87, 0x1f, 0xd4,
+                                                          0x88, 0xba, 0x78, 0x5f, 0x1a, 0x3e, 0xfb, 0xe,
+                                                          0x89, 0x5d, 0x4a, 0x5b, 0xa8, 0xb1, 0x62, 0x1e,
+                                                          0x94, 0xbc, 0x52, 0xa, 0xe, 0x8b, 0xc1, 0xf8,
+                                                          0x5d, 0xc1, 0xee, 0xf7, 0x9, 0x1, 0xf7, 0xfb,
+                                                          0xf9, 0x2c, 0x15, 0xe2, 0x6, 0xa4, 0xf7, 0x9,
+                                                          0x5, 0x35, 0x6, 0xfb, 0x44, 0xfb, 0x9, 0x15,
+                                                          0xe0, 0x6, 0xa6, 0xf7, 0x9, 0x5, 0x34, 0x6,
+                                                          0xfb, 0x55, 0xfd, 0xa1, 0x15, 0x31, 0xa, 0xe,
+                                                          0x8b, 0xc2, 0xf8, 0x63, 0xc2, 0x8b, 0xc1, 0x8b,
+                                                          0xc5, 0x1, 0xf7, 0x6, 0xc3, 0xf7, 0xa1, 0xc0,
+                                                          0x3, 0xa0, 0x16, 0xf8, 0x41, 0x6, 0xb5, 0xf7,
+                                                          0x63, 0x5, 0x56, 0x6, 0x6b, 0xfb, 0x2c, 0x5,
+                                                          0xfb, 0xc4, 0x6, 0xf8, 0x4f, 0xf8, 0x66, 0x95,
+                                                          0xbf, 0x5, 0xfc, 0x26, 0x6, 0x63, 0xfb, 0x55,
+                                                          0x51, 0xa, 0xa9, 0xf7, 0x1e, 0x5, 0xf7, 0xa5,
+                                                          0x6, 0xfc, 0x4e, 0xfc, 0x64, 0x5, 0xf7, 0xbd,
+                                                          0xf8, 0xd1, 0x48, 0xa, 0x8b, 0xc2, 0xf7, 0xd8,
+                                                          0xc2, 0x8b, 0xc3, 0xf7, 0x47, 0x77, 0x12, 0xf7,
+                                                          0xc4, 0xf8, 0x7e, 0x4c, 0xa, 0xfb, 0x28, 0xfd,
+                                                          0x1c, 0x15, 0xf8, 0x2b, 0x6, 0xaa, 0xf7, 0x31,
+                                                          0x52, 0xa, 0x77, 0x25, 0x5, 0xfb, 0xa7, 0x6,
+                                                          0xf8, 0x1d, 0xf7, 0xdc, 0x95, 0xbe, 0x5, 0x13,
+                                                          0x60, 0xfc, 0x1a, 0x6, 0x6d, 0xfb, 0x2e, 0x5,
+                                                          0xc1, 0x6, 0x9f, 0xee, 0x5, 0xf7, 0x95, 0x6,
+                                                          0xfc, 0x1c, 0xfb, 0xdb, 0x5, 0xe, 0xfb, 0x23,
+                                                          0xc6, 0xf8, 0x4f, 0xc5, 0xf7, 0x2d, 0xbf, 0x1,
+                                                          0x7f, 0x37, 0x15, 0x67, 0x50, 0x5, 0xf7, 0x75,
+                                                          0x9f, 0xb3, 0xf7, 0x19, 0xbd, 0x1f, 0xf7, 0x11,
+                                                          0xf7, 0xdd, 0x5, 0xf7, 0x2, 0x6, 0x9e, 0xc5,
+                                                          0x57, 0xa, 0xf7, 0x8, 0xba, 0x97, 0xb0, 0xf2,
+                                                          0x1b, 0x9e, 0x9f, 0x88, 0x8a, 0x9e, 0x1f, 0xaf,
+                                                          0xc3, 0x5, 0x61, 0x65, 0x8b, 0x6e, 0x1b, 0xfb,
+                                                          0x1f, 0x80, 0x4b, 0xfb, 0x21, 0x55, 0x1f, 0xfb,
+                                                          0x5, 0x6, 0x7a, 0x51, 0x5, 0xf7, 0x0, 0x6,
+                                                          0xfb, 0xf, 0xfb, 0xd7, 0x5, 0x20, 0x63, 0x55,
+                                                          0x7e, 0xfb, 0x1, 0x1b, 0xe, 0x79, 0xc2, 0x8b,
+                                                          0xf7, 0x39, 0x8b, 0xc2, 0xf7, 0xa0, 0xc2, 0x8b,
+                                                          0xba, 0xf7, 0x46, 0x77, 0x12, 0x9e, 0xc4, 0x17,
+                                                          0x34, 0xa, 0x13, 0xfe, 0x3d, 0xa, 0xa8, 0xf8,
+                                                          0x6, 0x48, 0xa, 0xfb, 0x31, 0xbd, 0x8b, 0xf7,
+                                                          0x38, 0x8b, 0xbe, 0xf7, 0xae, 0xbe, 0x8b, 0xbc,
+                                                          0xf7, 0x47, 0x77, 0x12, 0xab, 0xc3, 0x17, 0x3f,
+                                                          0xa, 0x13, 0xfe, 0x30, 0xa, 0xf7, 0x6f, 0xf7,
+                                                          0xa0, 0x4c, 0xa, 0xe, 0xf8, 0xe2, 0xcb, 0x1,
+                                                          0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7, 0x10, 0xf8,
+                                                          0x83, 0x15, 0xad, 0x79, 0xf7, 0x36, 0xf7, 0x5,
+                                                          0xf7, 0x5, 0xfb, 0x5, 0xb6, 0x9d, 0xfb, 0x1,
+                                                          0xf7, 0x33, 0x5, 0x40, 0x6, 0xe, 0xf8, 0x80,
+                                                          0xc9, 0x1, 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7,
+                                                          0x7f, 0xf8, 0x80, 0x15, 0xd5, 0x6, 0xf7, 0x3b,
+                                                          0xf7, 0x31, 0x67, 0x9f, 0xfb, 0x32, 0xfb, 0x7,
+                                                          0xfb, 0x9, 0xf7, 0x6, 0x62, 0x77, 0x5, 0xe,
+                                                          0xf8, 0x89, 0xb2, 0x1, 0xf7, 0x2b, 0xf7, 0xbd,
+                                                          0x3, 0xf7, 0x2b, 0xf8, 0xf5, 0x15, 0x3c, 0xa1,
+                                                          0xbf, 0x6e, 0xc4, 0x1b, 0xd7, 0xc8, 0xbc, 0xc6,
+                                                          0xa8, 0x1f, 0x60, 0x6, 0x6d, 0x7b, 0x5c, 0x64,
+                                                          0x55, 0x1b, 0x60, 0x64, 0xa5, 0xb6, 0x80, 0x1f,
+                                                          0xe, 0xf8, 0x71, 0xf2, 0x1, 0xf7, 0x8b, 0xf8,
+                                                          0x71, 0x15, 0xde, 0x6, 0xa2, 0xf2, 0x7b, 0xa,
+                                                          0xe, 0xf8, 0x63, 0xbe, 0xca, 0xbd, 0x1, 0xf7,
+                                                          0x6c, 0xbe, 0xcd, 0xbe, 0x3, 0xf7, 0x6c, 0xf8,
+                                                          0xa3, 0x15, 0x67, 0xa6, 0x6f, 0xb4, 0xbf, 0xbb,
+                                                          0xb9, 0xbf, 0xb1, 0x6f, 0xa7, 0x62, 0x57, 0x5c,
+                                                          0x5c, 0x56, 0x1e, 0xbe, 0x96, 0x15, 0xa0, 0x9d,
+                                                          0x9d, 0x9f, 0x9b, 0x97, 0x81, 0x7d, 0x77, 0x79,
+                                                          0x78, 0x76, 0x7b, 0x80, 0x96, 0x98, 0x1e, 0xe,
+                                                          0xfb, 0x28, 0xbf, 0xeb, 0x77, 0x1, 0xf7, 0x79,
+                                                          0xcc, 0x3, 0xf7, 0xc4, 0x16, 0x64, 0x78, 0x67,
+                                                          0x65, 0x61, 0x1a, 0x6f, 0x9d, 0x76, 0xae, 0xa0,
+                                                          0xa1, 0x92, 0x99, 0x9f, 0x1e, 0x9b, 0xc2, 0x5,
+                                                          0x7d, 0x83, 0x73, 0x81, 0x7a, 0x1b, 0x81, 0x83,
+                                                          0x90, 0x96, 0xb2, 0xbd, 0xa5, 0xa5, 0x9a, 0x1f,
+                                                          0xe, 0xf8, 0x7d, 0xbd, 0x9d, 0xbc, 0x1, 0xe6,
+                                                          0xf8, 0x8c, 0x15, 0xbc, 0x80, 0x5, 0x9a, 0x92,
+                                                          0xae, 0xbc, 0xae, 0x1b, 0xa5, 0x9f, 0x78, 0x79,
+                                                          0xa2, 0x1f, 0x7b, 0x9f, 0xa1, 0x7c, 0xa9, 0x1b,
+                                                          0xc9, 0xc5, 0xbb, 0xc3, 0xa9, 0x1f, 0x5a, 0x95,
+                                                          0x5, 0x71, 0x7d, 0x5d, 0x65, 0x67, 0x1b, 0x75,
+                                                          0x7b, 0x99, 0x9b, 0x78, 0x1f, 0x9d, 0x76, 0x73,
+                                                          0x9e, 0x6a, 0x1b, 0x58, 0x58, 0x67, 0x49, 0x68,
+                                                          0x1f, 0xe, 0x65, 0xa, 0xf7, 0xa5, 0xf8, 0x99,
+                                                          0x15, 0xad, 0x77, 0xf7, 0x52, 0xf7, 0x22, 0x55,
+                                                          0xac, 0x5, 0xfb, 0xe8, 0xfb, 0x2f, 0x15, 0xad,
+                                                          0x77, 0xf7, 0x56, 0xf7, 0x22, 0x52, 0xac, 0x5,
+                                                          0xe, 0xf7, 0x7b, 0xc1, 0x1, 0xd0, 0xf7, 0x7b,
+                                                          0x15, 0xf8, 0x57, 0x2a, 0xa, 0xfc, 0x57, 0x6,
+                                                          0xe, 0xf7, 0x7b, 0xc1, 0x1, 0x85, 0xf7, 0x7b,
+                                                          0x15, 0xf8, 0xed, 0x2a, 0xa, 0xfc, 0xed, 0x6,
+                                                          0xe, 0xf7, 0xbb, 0xc9, 0x3, 0xf7, 0xbb, 0xf7,
+                                                          0xdc, 0x15, 0xc9, 0x6, 0x72, 0x64, 0xa, 0x32,
+                                                          0x6, 0xe, 0xf8, 0xc6, 0x77, 0x1, 0xf7, 0x56,
+                                                          0xc9, 0x3, 0xf7, 0x56, 0xf7, 0xdc, 0x15, 0xc9,
+                                                          0x6, 0xf7, 0x2a, 0x64, 0xa, 0x30, 0x6, 0xe,
+                                                          0xef, 0x77, 0x1, 0xf7, 0x56, 0xca, 0x3, 0xf7,
+                                                          0x56, 0xfb, 0x1a, 0x15, 0xca, 0x75, 0xa, 0xf8,
+                                                          0xc6, 0x77, 0x1, 0xf7, 0x68, 0xc9, 0xf4, 0xc7,
+                                                          0x3, 0xf8, 0xf, 0xf7, 0xdc, 0x15, 0xc7, 0x6,
+                                                          0x72, 0x64, 0xa, 0x32, 0x6, 0xfb, 0x5, 0xfb,
+                                                          0x7e, 0x15, 0xc9, 0x6, 0x73, 0x64, 0xa, 0x31,
+                                                          0x6, 0xe, 0xf8, 0xc6, 0x74, 0xa, 0xf7, 0xdc,
+                                                          0x15, 0xc7, 0x6, 0xf7, 0x21, 0x64, 0xa, 0x35,
+                                                          0x6, 0xfb, 0xa9, 0xfb, 0x7e, 0x15, 0xc6, 0x6,
+                                                          0xf7, 0x23, 0x64, 0xa, 0x35, 0x6, 0xe, 0xef,
+                                                          0x74, 0xa, 0xfb, 0x1a, 0x15, 0xc7, 0x6, 0xf7,
+                                                          0x21, 0x64, 0xa, 0x34, 0x6, 0xfb, 0xa8, 0xfb,
+                                                          0x7e, 0x15, 0xc6, 0x6, 0xf7, 0x22, 0x64, 0xa,
+                                                          0x34, 0x6, 0xe, 0xf7, 0xfb, 0xc6, 0xf7, 0x36,
+                                                          0x77, 0x1, 0xf7, 0x40, 0xc6, 0x3, 0xf7, 0x40,
+                                                          0x3d, 0x15, 0xc6, 0x6, 0xe5, 0xf8, 0x4f, 0x5,
+                                                          0xf7, 0x17, 0x6, 0x97, 0xc0, 0x83, 0xa, 0xae,
+                                                          0xf7, 0x36, 0x5, 0x50, 0x6, 0x69, 0xfb, 0x36,
+                                                          0x5, 0xfb, 0x14, 0x6, 0x80, 0x56, 0x5, 0xf7,
+                                                          0x14, 0x6, 0xe, 0xf2, 0xc6, 0xf7, 0x64, 0xc5,
+                                                          0xf7, 0x2c, 0x77, 0x1, 0xec, 0xf2, 0x15, 0xf7,
+                                                          0x18, 0x6, 0x64, 0xfb, 0x49, 0x5, 0xcb, 0x6,
+                                                          0xb2, 0xf7, 0x49, 0x5, 0xf7, 0x18, 0x6, 0x97,
+                                                          0xc6, 0x5, 0xfb, 0x17, 0x6, 0xb6, 0xf7, 0x64,
+                                                          0x5, 0xf7, 0x16, 0x6, 0x97, 0xc5, 0x5, 0xfb,
+                                                          0x16, 0x6, 0xab, 0xf7, 0x2c, 0x5, 0x4b, 0x6,
+                                                          0x6b, 0xfb, 0x2c, 0x83, 0xa, 0x81, 0x51, 0x5,
+                                                          0xf7, 0x17, 0x6, 0x5f, 0xfb, 0x64, 0x83, 0xa,
+                                                          0xe, 0xf7, 0x2b, 0x76, 0xf7, 0x91, 0x77, 0x1,
+                                                          0xf7, 0x3d, 0xf7, 0x7c, 0x15, 0x52, 0xb5, 0x5e,
+                                                          0xc9, 0xd7, 0xdc, 0xd2, 0xd9, 0xc6, 0x5f, 0xb8,
+                                                          0x4c, 0x3c, 0x40, 0x45, 0x3a, 0x1e, 0xe, 0x7c,
+                                                          0xf7, 0x12, 0x1, 0xae, 0xf7, 0x15, 0xd2, 0xf7,
+                                                          0x15, 0xd2, 0xf7, 0x15, 0x14, 0x70, 0xf7, 0x7f,
+                                                          0xb1, 0x15, 0x41, 0xa, 0xfb, 0x5c, 0x16, 0x41,
+                                                          0xa, 0xf8, 0x24, 0x16, 0x41, 0xa, 0xe, 0x7c,
+                                                          0xc2, 0xf7, 0x21, 0xc1, 0xf7, 0x1d, 0xc2, 0xf7,
+                                                          0x21, 0xc1, 0x12, 0xaa, 0xc4, 0xf7, 0x57, 0xc4,
+                                                          0x77, 0xc4, 0xf7, 0x2a, 0xc4, 0x13, 0xfd, 0xd7,
+                                                          0xf8, 0x6e, 0x2e, 0xa, 0xfb, 0x5, 0xfb, 0x94,
+                                                          0x15, 0xf8, 0x6c, 0xf7, 0x38, 0x87, 0xc0, 0xfc,
+                                                          0x6c, 0xfb, 0x3a, 0x5, 0x13, 0xfb, 0xf7, 0xc4,
+                                                          0xfb, 0x51, 0x2e, 0xa, 0xfb, 0xee, 0x84, 0x2e,
+                                                          0xa, 0xe, 0xf8, 0x52, 0x77, 0x1, 0xf7, 0x18,
+                                                          0xe8, 0x3, 0xf7, 0x18, 0xf7, 0x95, 0x15, 0xf7,
+                                                          0x84, 0xfb, 0x4f, 0xa9, 0xba, 0xfb, 0x45, 0xf7,
+                                                          0x1d, 0xf7, 0x87, 0xf7, 0x1c, 0x82, 0xc3, 0x5,
+                                                          0xe, 0xf8, 0x52, 0x77, 0x1, 0xf8, 0x6, 0xed,
+                                                          0x3, 0xf7, 0x21, 0xd1, 0x15, 0xf7, 0xdb, 0xf7,
+                                                          0x4f, 0xfb, 0x84, 0xf7, 0x51, 0x6c, 0x5c, 0xf7,
+                                                          0x41, 0xfb, 0x1a, 0xfb, 0x82, 0xfb, 0x20, 0x5,
+                                                          0xe, 0x67, 0x76, 0xf9, 0x66, 0x77, 0x1, 0x9e,
+                                                          0x6e, 0x15, 0xab, 0x6f, 0xf8, 0xa6, 0xf9, 0x4a,
+                                                          0x6b, 0xa7, 0x5, 0xe, 0x76, 0xc5, 0xf7, 0x28,
+                                                          0xc4, 0xdb, 0xc3, 0xf7, 0x43, 0xc5, 0x1, 0xf7,
+                                                          0x36, 0xc1, 0x3, 0xbb, 0xaa, 0x15, 0x9b, 0x57,
+                                                          0x5, 0xa1, 0xc0, 0xe6, 0x93, 0x9b, 0x1b, 0x9f,
+                                                          0x9d, 0x87, 0x84, 0x9e, 0x1f, 0x83, 0x9e, 0xa0,
+                                                          0x80, 0xa6, 0x53, 0xa, 0x71, 0x79, 0x97, 0x93,
+                                                          0x79, 0x1f, 0x93, 0x7a, 0x7a, 0x8e, 0x73, 0x1b,
+                                                          0x6e, 0x6d, 0x84, 0x80, 0x6e, 0x1f, 0xc8, 0xb0,
+                                                          0x9f, 0xc2, 0x8e, 0xb6, 0x8, 0xf7, 0x48, 0x6,
+                                                          0x99, 0xc4, 0x5, 0xfb, 0x5c, 0x6, 0x8a, 0x96,
+                                                          0x8a, 0xae, 0x8a, 0xad, 0x8, 0xf7, 0x66, 0x6,
+                                                          0x9b, 0xc3, 0x5, 0xfb, 0x77, 0xa9, 0x6, 0x42,
+                                                          0xa, 0x82, 0x8b, 0x7b, 0x8c, 0x78, 0x8, 0x4a,
+                                                          0x6, 0x7d, 0x53, 0x5, 0xdb, 0x6, 0x8c, 0x6a,
+                                                          0x8d, 0x69, 0x8c, 0x7e, 0x8, 0x29, 0x6, 0x7b,
+                                                          0x52, 0x5, 0xf7, 0x8, 0x6, 0x55, 0x63, 0x67,
+                                                          0x3a, 0x4b, 0x1e, 0xe, 0x8b, 0xbf, 0xf7, 0x22,
+                                                          0xbf, 0xc8, 0xbf, 0xf7, 0x2b, 0xbf, 0x1, 0xe0,
+                                                          0xc2, 0xf8, 0x8, 0xbe, 0x3, 0x89, 0xf7, 0x56,
+                                                          0x15, 0xd7, 0x6, 0xfb, 0x7, 0x90, 0xcf, 0x3c,
+                                                          0xf7, 0x1f, 0x1b, 0xd6, 0xda, 0xa7, 0xb5, 0xcd,
+                                                          0x1f, 0x7d, 0xb7, 0x5, 0x67, 0x52, 0x45, 0x71,
+                                                          0x4a, 0x1b, 0x2c, 0x49, 0xb9, 0xeb, 0x81, 0x1f,
+                                                          0xf7, 0x6b, 0x6, 0xa7, 0xbf, 0x5, 0xfb, 0x87,
+                                                          0x6, 0x8e, 0x9f, 0x8e, 0xa2, 0x90, 0x9d, 0x8,
+                                                          0xf7, 0x98, 0x6, 0xa9, 0xbf, 0x5, 0xfb, 0xa4,
+                                                          0x6, 0xe5, 0xb4, 0xdc, 0xc8, 0xe5, 0x1b, 0xcf,
+                                                          0xc8, 0x73, 0x66, 0xa8, 0x1f, 0x7b, 0x3d, 0x5,
+                                                          0xbe, 0x6, 0xb2, 0xf7, 0x53, 0x5, 0x58, 0x6,
+                                                          0x80, 0x59, 0x5, 0xac, 0x63, 0x5b, 0x9c, 0x47,
+                                                          0x1b, 0xfb, 0x12, 0xfb, 0x0, 0x32, 0xfb, 0x6,
+                                                          0x5c, 0x1f, 0x54, 0x6, 0x6d, 0x57, 0x5, 0xce,
+                                                          0x6, 0x86, 0x73, 0x89, 0x76, 0x89, 0x7b, 0x8,
+                                                          0x5a, 0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x49, 0xc1,
+                                                          0xf7, 0x7c, 0xc2, 0x1, 0xf8, 0xac, 0xc6, 0x3,
+                                                          0x90, 0x7c, 0x15, 0xf7, 0x79, 0x36, 0xa, 0x37,
+                                                          0x6, 0xb1, 0xf7, 0x48, 0x5, 0xf7, 0xc, 0x6,
+                                                          0x9d, 0x6e, 0xaa, 0x57, 0xa7, 0x56, 0x40, 0x44,
+                                                          0x18, 0xba, 0x6d, 0xc1, 0xbd, 0x94, 0x79, 0x92,
+                                                          0x7a, 0x91, 0x7c, 0x19, 0xf7, 0x1f, 0x6, 0x96,
+                                                          0xc2, 0x57, 0xa, 0x78, 0xb1, 0xda, 0xd5, 0x5c,
+                                                          0xa9, 0x51, 0x54, 0x77, 0xae, 0x77, 0xac, 0x7a,
+                                                          0xa5, 0x19, 0xea, 0x8e, 0xf7, 0x8, 0xb8, 0xf7,
+                                                          0x37, 0x1a, 0xcd, 0x57, 0xcb, 0x23, 0x1e, 0xfb,
+                                                          0xce, 0x38, 0xa, 0xe1, 0x6, 0x2a, 0xfc, 0x67,
+                                                          0x5, 0x34, 0x6, 0xf7, 0x56, 0xf7, 0x7f, 0x15,
+                                                          0xba, 0xf7, 0x7c, 0x5, 0xf7, 0x2c, 0x6, 0xd9,
+                                                          0xbc, 0x6b, 0x5f, 0xfb, 0x2b, 0xfb, 0x23, 0x86,
+                                                          0x3f, 0x1f, 0xe, 0xf7, 0xb0, 0x76, 0xf7, 0x93,
+                                                          0xb7, 0x1, 0xb6, 0xbe, 0xf7, 0x10, 0xbb, 0xf7,
+                                                          0x60, 0xbd, 0x3, 0xf7, 0x6e, 0xf7, 0x9b, 0x15,
+                                                          0xbb, 0x6, 0xc7, 0xf7, 0xa2, 0x97, 0xfb, 0xa2,
+                                                          0x5, 0xcb, 0x6, 0xf7, 0x14, 0xf7, 0xa1, 0x4f,
+                                                          0xfb, 0xa1, 0x5, 0xbd, 0x6, 0xcd, 0xf7, 0xbf,
+                                                          0x5, 0x30, 0x6, 0xfb, 0x6, 0xfb, 0x87, 0x84,
+                                                          0xf7, 0x87, 0x5, 0x31, 0x6, 0xfb, 0x85, 0xfb,
+                                                          0xbf, 0x15, 0xbe, 0x6, 0xc2, 0xf7, 0x93, 0x5,
+                                                          0xe1, 0x6, 0x95, 0xb7, 0x5, 0xfb, 0x71, 0x6,
+                                                          0x81, 0x5f, 0x5, 0xe0, 0x6, 0xe, 0x73, 0xa,
+                                                          0xf7, 0x11, 0xf7, 0x7, 0x15, 0xa9, 0xba, 0x2f,
+                                                          0xf7, 0x3, 0x5, 0xf8, 0xbd, 0x6, 0x96, 0xbd,
+                                                          0x5, 0xfc, 0xae, 0x6, 0xf7, 0x18, 0xf3, 0x82,
+                                                          0xc3, 0xfb, 0x82, 0xfb, 0x4e, 0x5, 0xe, 0xa0,
+                                                          0x76, 0xf9, 0x3, 0x77, 0x1, 0xf7, 0x88, 0xbd,
+                                                          0x3, 0xf7, 0x38, 0x9c, 0x15, 0xf7, 0x18, 0xf8,
+                                                          0x80, 0xfb, 0x1a, 0x26, 0x58, 0xa2, 0xf7, 0x84,
+                                                          0xf7, 0x49, 0xf7, 0x1e, 0xfb, 0x54, 0x55, 0x7a,
+                                                          0x37, 0xf7, 0xa, 0xfb, 0x1b, 0xfc, 0x8e, 0x5,
+                                                          0xe, 0x73, 0xa, 0x70, 0xf7, 0xa7, 0x15, 0x96,
+                                                          0xbd, 0x5, 0xf8, 0xbf, 0x6, 0x2f, 0xf7, 0x3,
+                                                          0xa9, 0xba, 0xf7, 0x2a, 0xfb, 0x4a, 0xfb, 0x81,
+                                                          0xfb, 0x4e, 0x82, 0xc3, 0xf7, 0x18, 0xf3, 0x5,
+                                                          0xe, 0x9a, 0x76, 0xf8, 0xea, 0x77, 0x1, 0xf7,
+                                                          0x3, 0xf7, 0x4f, 0x15, 0xc0, 0x9c, 0xdd, 0xfb,
+                                                          0x9, 0xf7, 0x1c, 0xf8, 0x8d, 0xbe, 0x88, 0xfb,
+                                                          0x18, 0xfc, 0x7e, 0xf7, 0x1c, 0xef, 0xbf, 0x74,
+                                                          0xfb, 0x86, 0xfb, 0x4a, 0x5, 0xe, 0xf7, 0x1c,
+                                                          0x76, 0xf7, 0x32, 0xbf, 0xf7, 0x32, 0x77, 0x1,
+                                                          0xf7, 0x10, 0xf7, 0x7, 0x15, 0xfb, 0x2c, 0xf7,
+                                                          0x4a, 0xf7, 0x83, 0xf7, 0x4e, 0x94, 0x53, 0xfb,
+                                                          0x18, 0x25, 0x5, 0xf8, 0x58, 0x6, 0x31, 0xf7,
+                                                          0x3, 0xa9, 0xba, 0xf7, 0x28, 0xfb, 0x4a, 0xfb,
+                                                          0x7f, 0xfb, 0x4e, 0x82, 0xc3, 0xf7, 0x16, 0xf2,
+                                                          0xfc, 0x58, 0x8a, 0xe7, 0xfb, 0x3, 0x5, 0xe,
+                                                          0xf7, 0x7c, 0xbe, 0x1, 0xd5, 0xf7, 0x7c, 0x15,
+                                                          0xf8, 0x57, 0xbe, 0xfc, 0x57, 0x6, 0xe, 0x8b,
+                                                          0xc0, 0xf7, 0xc1, 0xc0, 0xf1, 0xf7, 0xc, 0x1,
+                                                          0xf7, 0x0, 0xc1, 0xf7, 0xa7, 0xc1, 0x3, 0xf8,
+                                                          0x96, 0xf8, 0x91, 0x15, 0xd2, 0x6, 0xa2, 0xf7,
+                                                          0xc, 0x5, 0x44, 0x6, 0xfb, 0x6d, 0xfd, 0x9,
+                                                          0x15, 0xf7, 0xa1, 0x80, 0xa, 0xfb, 0x1, 0x6,
+                                                          0xd3, 0xf7, 0xf6, 0x5, 0xfb, 0x1c, 0x68, 0xa,
+                                                          0xdd, 0x6, 0x4d, 0xfb, 0xc1, 0x5, 0x21, 0x6,
+                                                          0xfb, 0xe7, 0x56, 0x15, 0xf7, 0x9e, 0x6, 0x97,
+                                                          0xc0, 0x57, 0xa, 0xc9, 0xf7, 0xc1, 0x5, 0xf6,
+                                                          0x6, 0x96, 0xc0, 0x57, 0xa, 0xa6, 0xed, 0x5,
+                                                          0x9f, 0x90, 0x96, 0xa2, 0xd4, 0x1b, 0xa1, 0xa1,
+                                                          0x87, 0x87, 0x9e, 0x1f, 0xa0, 0xbf, 0x5, 0x8f,
+                                                          0x71, 0x5e, 0x90, 0x78, 0x1b, 0x5a, 0x43, 0x7e,
+                                                          0x38, 0x77, 0x1f, 0x73, 0x29, 0x5, 0x20, 0x68,
+                                                          0xa, 0xf6, 0x6, 0x4e, 0xfb, 0xc1, 0x5, 0x22,
+                                                          0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xcf, 0xc2, 0xf7,
+                                                          0x29, 0xc2, 0x1, 0xf7, 0x2, 0xc1, 0xf7, 0xa8,
+                                                          0xc3, 0x3, 0xf7, 0xd5, 0x16, 0xf7, 0xa2, 0x36,
+                                                          0xa, 0x21, 0x6, 0xf7, 0x4, 0xf8, 0xd2, 0x5,
+                                                          0xfb, 0x27, 0x56, 0xa, 0xe8, 0x6, 0x25, 0xfc,
+                                                          0x9b, 0x57, 0xa, 0xfb, 0xe8, 0x54, 0x15, 0xf7,
+                                                          0xa0, 0x6, 0x97, 0xc2, 0x57, 0xa, 0xc9, 0xf7,
+                                                          0xcf, 0x5, 0xf6, 0x6, 0x96, 0xc2, 0x57, 0xa,
+                                                          0x9c, 0xe0, 0x5, 0xa1, 0x8f, 0x97, 0xb5, 0xde,
+                                                          0x1b, 0xa2, 0xa0, 0x86, 0x86, 0xa0, 0x1f, 0x9f,
+                                                          0xc1, 0x5, 0x90, 0x71, 0x6f, 0x91, 0x6f, 0x1b,
+                                                          0x30, 0x58, 0x5a, 0x45, 0x7e, 0x1f, 0x79, 0x36,
+                                                          0x5, 0xfb, 0x1, 0x67, 0xa, 0xf7, 0x1, 0x6,
+                                                          0x4d, 0xfb, 0xcf, 0x5, 0x20, 0x6, 0xe, 0x79,
+                                                          0x9d, 0xf8, 0x3e, 0x9a, 0xf7, 0xd, 0x9d, 0xa9,
+                                                          0x97, 0x6, 0xfb, 0x31, 0x8b, 0x7, 0x1e, 0xa0,
+                                                          0x39, 0x63, 0xff, 0xc, 0x9, 0xc2, 0xa, 0xc2,
+                                                          0xb, 0xf8, 0xec, 0x14, 0xaa, 0x13, 0x0, 0x6a,
+                                                          0x2, 0x0, 0x1, 0x0, 0x29, 0x0, 0x38, 0x0,
+                                                          0x69, 0x0, 0x6d, 0x0, 0xb9, 0x0, 0xf5, 0x1,
+                                                          0x3b, 0x1, 0x83, 0x1, 0xc3, 0x1, 0xf8, 0x1,
+                                                          0xfd, 0x2, 0xe, 0x2, 0x1a, 0x2, 0x1f, 0x2,
+                                                          0x46, 0x2, 0x53, 0x2, 0x93, 0x2, 0xc4, 0x2,
+                                                          0xce, 0x2, 0xe8, 0x3, 0x19, 0x3, 0x2c, 0x3,
+                                                          0x31, 0x3, 0x3f, 0x3, 0x44, 0x3, 0x4e, 0x3,
+                                                          0x59, 0x3, 0x64, 0x3, 0x69, 0x3, 0x8e, 0x3,
+                                                          0x95, 0x3, 0xb8, 0x3, 0xbf, 0x3, 0xd1, 0x3,
+                                                          0xed, 0x3, 0xf4, 0x3, 0xff, 0x4, 0x4, 0x4,
+                                                          0x9, 0x4, 0xe, 0x4, 0x23, 0x4, 0x2b, 0x4,
+                                                          0x32, 0x4, 0x3c, 0x4, 0x51, 0x4, 0x56, 0x4,
+                                                          0x5e, 0x4, 0x66, 0x4, 0x6e, 0x4, 0x72, 0x4,
+                                                          0x76, 0x4, 0x87, 0x4, 0x91, 0x4, 0x96, 0x4,
+                                                          0x9b, 0x4, 0x9f, 0x4, 0xa3, 0x4, 0xab, 0x4,
+                                                          0xb3, 0x4, 0xba, 0x4, 0xbf, 0x4, 0xc5, 0x4,
+                                                          0xca, 0x4, 0xcf, 0x4, 0xd4, 0x4, 0xd9, 0x4,
+                                                          0xdd, 0x4, 0xe1, 0x4, 0xe5, 0x4, 0xed, 0x4,
+                                                          0xf3, 0x4, 0xf8, 0x4, 0xfd, 0x5, 0x1, 0x5,
+                                                          0x5, 0x5, 0x9, 0x5, 0x15, 0x5, 0x21, 0x5,
+                                                          0x27, 0x5, 0x2d, 0x5, 0x33, 0x5, 0x37, 0x5,
+                                                          0x42, 0x5, 0x4d, 0x5, 0x58, 0x5, 0x60, 0x5,
+                                                          0x65, 0x5, 0x69, 0x5, 0x6e, 0x5, 0x72, 0x5,
+                                                          0x76, 0x5, 0x7a, 0x5, 0x83, 0x5, 0x8c, 0x5,
+                                                          0x95, 0x5, 0x9e, 0x5, 0xa3, 0x5, 0xa8, 0x5,
+                                                          0xad, 0x5, 0xb2, 0x5, 0xb7, 0x5, 0xbb, 0x5,
+                                                          0xbf, 0x5, 0xc3, 0x5, 0xc7, 0x5, 0xcb, 0xf7,
+                                                          0x63, 0x4d, 0xa, 0x33, 0x6, 0xcc, 0xf7, 0xf,
+                                                          0x5, 0xf7, 0xaa, 0x6, 0xa3, 0xfb, 0xf, 0x2c,
+                                                          0xa, 0xf8, 0x93, 0x32, 0xa, 0x7a, 0xa, 0x4f,
+                                                          0x6, 0xf7, 0x6b, 0xf7, 0x45, 0x15, 0xf7, 0x40,
+                                                          0xf7, 0xbb, 0xca, 0xfb, 0xbb, 0x5, 0xb, 0x22,
+                                                          0xa, 0x13, 0xbe, 0x3a, 0xa, 0x13, 0x7e, 0x98,
+                                                          0xce, 0x15, 0x13, 0xbe, 0x2b, 0xa, 0x15, 0xf7,
+                                                          0x1e, 0x3c, 0xa, 0x37, 0x6, 0xbe, 0xf7, 0x9a,
+                                                          0x8c, 0x9b, 0x9a, 0x1a, 0xcb, 0x8a, 0x5e, 0xb2,
+                                                          0x22, 0x1b, 0x46, 0x36, 0x77, 0x72, 0x4b, 0x1f,
+                                                          0x39, 0xa, 0xa8, 0xe1, 0x9c, 0x33, 0x1f, 0x81,
+                                                          0x49, 0x5, 0x92, 0x5f, 0x5a, 0x92, 0x5a, 0x1b,
+                                                          0xfb, 0x51, 0x4c, 0x2c, 0x3f, 0x1f, 0xb, 0x15,
+                                                          0x20, 0xa, 0xe, 0x15, 0xdb, 0x6, 0x5a, 0xfb,
+                                                          0x91, 0x5, 0x88, 0x7e, 0x8c, 0x7f, 0x80, 0x1a,
+                                                          0x45, 0xc3, 0x67, 0xd6, 0xb2, 0xc1, 0x9a, 0xd5,
+                                                          0xe3, 0x1e, 0x13, 0x78, 0x7c, 0x3d, 0x5, 0xf7,
+                                                          0x1a, 0x36, 0xa, 0x3a, 0x6, 0xd3, 0xf8, 0x15,
+                                                          0x55, 0xa, 0x82, 0x53, 0x5, 0xdc, 0x6, 0x5e,
+                                                          0xfb, 0x77, 0x5, 0x13, 0xb8, 0x59, 0x5b, 0x4d,
+                                                          0x4b, 0x4c, 0x1b, 0x4e, 0x6c, 0xa8, 0xbe, 0x8a,
+                                                          0x1f, 0x96, 0x8c, 0x96, 0x8d, 0x98, 0x1e, 0xc0,
+                                                          0xf7, 0xae, 0x5, 0xfb, 0x1a, 0x6, 0xe, 0x15,
+                                                          0xfb, 0x15, 0xd7, 0x26, 0xf7, 0x1a, 0xf7, 0x4d,
+                                                          0xf7, 0x1c, 0xf7, 0x4d, 0xf7, 0x4f, 0xed, 0x5f,
+                                                          0xf7, 0x11, 0xfb, 0x35, 0xfb, 0x60, 0xfb, 0xe,
+                                                          0xfb, 0x5c, 0xfb, 0x39, 0x1e, 0xc2, 0x93, 0x15,
+                                                          0xf7, 0x2, 0xea, 0xf7, 0x55, 0xf7, 0x3c, 0xf7,
+                                                          0x1a, 0xa4, 0x20, 0x3a, 0xfb, 0x13, 0xfb, 0xf,
+                                                          0xfb, 0x40, 0xfb, 0x19, 0xfb, 0x1, 0x52, 0xdf,
+                                                          0xef, 0x1e, 0xe, 0x15, 0xdc, 0x6, 0x55, 0xfb,
+                                                          0xb5, 0x5, 0x85, 0x6b, 0x88, 0x6d, 0x70, 0x1a,
+                                                          0x30, 0xbd, 0x51, 0xf7, 0xc, 0xf7, 0x12, 0xe2,
+                                                          0xc1, 0xf7, 0x30, 0xa7, 0x1e, 0xc7, 0xf7, 0xd1,
+                                                          0x5, 0xd8, 0x3c, 0xa, 0xfb, 0x7b, 0x60, 0xa,
+                                                          0xf1, 0x6, 0x50, 0xfb, 0xca, 0x63, 0xa, 0x76,
+                                                          0x53, 0x54, 0x23, 0x1b, 0x32, 0x65, 0xb4, 0xdc,
+                                                          0x9d, 0x8e, 0x9e, 0x8f, 0xa0, 0x1f, 0xc3, 0xf7,
+                                                          0xb9, 0x5, 0xf4, 0x3c, 0xa, 0xfb, 0x82, 0x6,
+                                                          0xb, 0x15, 0xf8, 0x38, 0x89, 0x5, 0x8f, 0xa1,
+                                                          0x8f, 0xaa, 0xa0, 0x1a, 0xe8, 0x51, 0xe0, 0xfb,
+                                                          0x1c, 0xfb, 0x34, 0xfb, 0x1e, 0xfb, 0x9, 0xfb,
+                                                          0x48, 0x2c, 0xc5, 0x41, 0xf7, 0x2c, 0xe0, 0xe5,
+                                                          0xa8, 0xb0, 0xd5, 0x1e, 0x84, 0xc1, 0x5, 0x5e,
+                                                          0x32, 0x37, 0x77, 0x5a, 0x1b, 0x44, 0x26, 0xa1,
+                                                          0xe3, 0x9b, 0x8b, 0x9c, 0x91, 0x9d, 0x1f, 0x9b,
+                                                          0xc3, 0x15, 0xc6, 0xa0, 0xd0, 0xd9, 0xf7, 0x9,
+                                                          0x1b, 0xf7, 0x22, 0x8f, 0xfb, 0x4, 0x72, 0x1f,
+                                                          0xe, 0xf8, 0x85, 0x6, 0xb1, 0xf7, 0x51, 0x71,
+                                                          0xa, 0x70, 0xfb, 0x1b, 0x5, 0xfb, 0xc5, 0x6,
+                                                          0xb4, 0xf7, 0x5d, 0x5, 0xf7, 0x39, 0x6, 0x7b,
+                                                          0x39, 0x51, 0xa, 0xb8, 0xf7, 0x6f, 0x62, 0xa,
+                                                          0x7a, 0x38, 0x5, 0xfb, 0x38, 0x6, 0xb3, 0xf7,
+                                                          0x5e, 0x81, 0xa, 0x71, 0xfb, 0x1b, 0x5, 0xc4,
+                                                          0x6, 0xb1, 0xf7, 0x51, 0x5, 0xfc, 0x83, 0x45,
+                                                          0xa, 0xdf, 0x6, 0x2f, 0xfc, 0x5d, 0x6b, 0xa,
+                                                          0xb, 0x15, 0x20, 0xd7, 0x43, 0xf7, 0x15, 0xf7,
+                                                          0x38, 0xf7, 0x9, 0xf7, 0x14, 0xf7, 0x2e, 0xdf,
+                                                          0x5b, 0xec, 0xfb, 0x2a, 0xfb, 0x2b, 0xfb, 0x1d,
+                                                          0xfb, 0x9, 0xfb, 0x3b, 0x1e, 0xc9, 0x9a, 0x15,
+                                                          0xf5, 0xe8, 0xf6, 0xf7, 0xe, 0xf7, 0x16, 0x9d,
+                                                          0x34, 0x4f, 0x28, 0x2c, 0x21, 0xfb, 0x9, 0xfb,
+                                                          0x7, 0x67, 0xcc, 0xd5, 0x1e, 0xb, 0x6, 0x96,
+                                                          0xc1, 0x5, 0xb, 0x4e, 0x4b, 0x3e, 0x5c, 0x38,
+                                                          0x1b, 0x57, 0x64, 0xa8, 0xab, 0xed, 0xf7, 0x1d,
+                                                          0x97, 0xc6, 0x40, 0xa, 0x5, 0x2b, 0x2d, 0xa,
+                                                          0xf7, 0x60, 0x2a, 0xa, 0x57, 0x6, 0x21, 0xb,
+                                                          0x6, 0x80, 0x55, 0x5, 0xb, 0x15, 0x52, 0xb2,
+                                                          0x5e, 0xcf, 0xdf, 0xd4, 0xd3, 0xdb, 0xc1, 0x6c,
+                                                          0xb7, 0x3d, 0x38, 0x43, 0x42, 0x40, 0x1e, 0xc4,
+                                                          0x92, 0x15, 0xbc, 0xb3, 0xb1, 0xbe, 0xb3, 0x9e,
+                                                          0x73, 0x6c, 0x61, 0x6a, 0x5f, 0x55, 0x66, 0x71,
+                                                          0x9f, 0xad, 0x1e, 0xb, 0x44, 0xa, 0xf8, 0x5c,
+                                                          0x37, 0xa, 0xfc, 0x5c, 0x5, 0xfb, 0x45, 0x6,
+                                                          0xb, 0xad, 0x71, 0x53, 0xb4, 0x3c, 0x1b, 0xfb,
+                                                          0x33, 0xfb, 0x9, 0xfb, 0x9, 0x22, 0x39, 0xc1,
+                                                          0x3b, 0xf7, 0x21, 0xcc, 0xd6, 0x98, 0xb8, 0xbd,
+                                                          0x1f, 0x78, 0x20, 0x5, 0x34, 0x79, 0x52, 0x6f,
+                                                          0xfb, 0xb, 0x1b, 0x48, 0x4b, 0x9c, 0x96, 0x59,
+                                                          0x1f, 0xcc, 0xf7, 0xc1, 0x15, 0xee, 0xf7, 0x1,
+                                                          0xd0, 0xf0, 0xf7, 0x6, 0xab, 0x4c, 0x4b, 0x2c,
+                                                          0x25, 0x4f, 0x23, 0x31, 0x4f, 0xbd, 0xcb, 0x1e,
+                                                          0xb, 0xf7, 0xc9, 0x2a, 0xa, 0xfb, 0x12, 0x6,
+                                                          0xad, 0xf7, 0x43, 0xf7, 0x7e, 0xf7, 0xae, 0x5,
+                                                          0xce, 0x2a, 0xa, 0xfb, 0x5a, 0x2d, 0xa, 0xd1,
+                                                          0x6, 0xfb, 0x52, 0xfb, 0x78, 0x26, 0xf7, 0x78,
+                                                          0x5, 0xd2, 0x43, 0xa, 0xd1, 0x6, 0xf7, 0x10,
+                                                          0xfb, 0xae, 0x69, 0xfb, 0x43, 0x5, 0xfb, 0x12,
+                                                          0x6, 0xb, 0x5, 0xfb, 0x82, 0x2d, 0xa, 0x86,
+                                                          0xa, 0xfb, 0x9d, 0xb, 0x15, 0x69, 0xa, 0xf7,
+                                                          0x3b, 0x6, 0xc8, 0xf7, 0xdb, 0x5, 0xfb, 0x1b,
+                                                          0x77, 0xa, 0xf7, 0x4f, 0x6, 0x44, 0xfc, 0x12,
+                                                          0x5, 0xf7, 0x3a, 0x56, 0xa, 0xe, 0xf7, 0xb5,
+                                                          0xf7, 0x5e, 0x15, 0xf7, 0x37, 0x6, 0x72, 0xfb,
+                                                          0x18, 0x5, 0x76, 0x46, 0x64, 0x7f, 0x54, 0x1b,
+                                                          0xfb, 0x18, 0x53, 0xd8, 0xeb, 0xf7, 0x74, 0xf7,
+                                                          0x2a, 0xe6, 0xf7, 0x7, 0xd0, 0xc0, 0x68, 0x5b,
+                                                          0xae, 0x1f, 0x7c, 0x3f, 0x51, 0xa, 0xb5, 0xf7,
+                                                          0x6a, 0x52, 0xa, 0x7e, 0x49, 0x5, 0xb, 0x15,
+                                                          0x71, 0xa3, 0x73, 0xb1, 0xb2, 0xb6, 0xa9, 0xb3,
+                                                          0xa8, 0x75, 0xa4, 0x67, 0x60, 0x60, 0x69, 0x63,
+                                                          0x1e, 0xb, 0x6, 0x96, 0xc2, 0x5, 0xb, 0x5,
+                                                          0xf7, 0x41, 0x46, 0xa, 0xfc, 0x2b, 0x38, 0xa,
+                                                          0xf7, 0x42, 0x6, 0x2c, 0xb, 0x6, 0x80, 0x54,
+                                                          0x5, 0xb, 0x8f, 0x55, 0x5, 0x9a, 0xae, 0xe4,
+                                                          0xa6, 0xd0, 0x1b, 0xb, 0x51, 0xb9, 0x54, 0xe7,
+                                                          0xd8, 0xda, 0xb6, 0xc1, 0xcd, 0x1e, 0xb, 0x7c,
+                                                          0xc3, 0x5f, 0xc3, 0xf7, 0x33, 0xc4, 0xf7, 0xf,
+                                                          0xc4, 0xb, 0x6, 0x96, 0xc3, 0x5, 0xb, 0xb4,
+                                                          0x62, 0x4d, 0xa4, 0x46, 0x1b, 0xfb, 0x3f, 0xfb,
+                                                          0x2b, 0xfb, 0x24, 0xfb, 0x7c, 0xfb, 0x8, 0xce,
+                                                          0x21, 0xf7, 0x3d, 0xd4, 0xd9, 0x9f, 0xa5, 0xcf,
+                                                          0x1f, 0xac, 0xf7, 0x42, 0x5, 0xbf, 0x36, 0xa,
+                                                          0xfb, 0xa2, 0x6, 0xb, 0x8b, 0xc1, 0xf8, 0x5a,
+                                                          0xc1, 0x1, 0xb, 0xa2, 0x3c, 0x15, 0x76, 0x59,
+                                                          0x5, 0x80, 0xbd, 0xdc, 0x7a, 0xdd, 0x1b, 0xf7,
+                                                          0x10, 0xe3, 0xbf, 0xf0, 0xa2, 0x1f, 0xd9, 0xf8,
+                                                          0x12, 0x5, 0xc7, 0x6, 0x95, 0xbe, 0x5, 0xfb,
+                                                          0x6, 0x6, 0x7c, 0x4c, 0x5, 0xb, 0xb8, 0xb5,
+                                                          0x85, 0x84, 0xb5, 0x1f, 0xe, 0x70, 0xa0, 0x71,
+                                                          0xae, 0xb0, 0xaf, 0xab, 0xb4, 0xaa, 0x73, 0xa1,
+                                                          0x6c, 0x65, 0x67, 0x68, 0x65, 0x1e, 0xb, 0xf3,
+                                                          0xef, 0xb4, 0xc8, 0xc0, 0xbd, 0x75, 0x59, 0x9b,
+                                                          0x1e, 0xc2, 0x9c, 0x5, 0xc3, 0x79, 0x6d, 0xc4,
+                                                          0xfb, 0x9, 0x1b, 0xfb, 0xc, 0x23, 0x32, 0x27,
+                                                          0x1f, 0x8a, 0xb, 0x2a, 0xa, 0xfb, 0x5f, 0x2d,
+                                                          0xa, 0xb, 0xf8, 0x2f, 0x6, 0x98, 0xc1, 0x5,
+                                                          0xfb, 0x45, 0x6, 0xea, 0xb, 0x6, 0x7f, 0x55,
+                                                          0x5, 0xb, 0x6, 0x97, 0xc2, 0x5, 0xb, 0x6,
+                                                          0x97, 0xc1, 0x5, 0xb, 0x15, 0xd9, 0x6, 0xf7,
+                                                          0x40, 0xf7, 0x33, 0x65, 0x9d, 0xfb, 0x33, 0xfb,
+                                                          0xb, 0xfb, 0x11, 0xf7, 0xc, 0x5f, 0x78, 0x5,
+                                                          0xe, 0x1, 0xc4, 0xc9, 0xf7, 0xff, 0xc8, 0x3,
+                                                          0xb, 0x12, 0xba, 0xc5, 0xf7, 0xee, 0xc4, 0xb,
+                                                          0x3b, 0xa, 0xf7, 0x73, 0x77, 0x4a, 0xa, 0x13,
+                                                          0x7e, 0xb, 0x15, 0xdb, 0x6, 0xf7, 0x46, 0xf7,
+                                                          0x33, 0x65, 0x9f, 0xfb, 0x3d, 0xfb, 0xf, 0xfb,
+                                                          0x12, 0xf7, 0xe, 0x5f, 0x77, 0x5, 0xb, 0x6,
+                                                          0x95, 0xc1, 0x5, 0xb, 0x7c, 0xc1, 0x60, 0xc2,
+                                                          0xf7, 0xdd, 0xc3, 0xb, 0xf7, 0x63, 0xf7, 0x4a,
+                                                          0xf7, 0x60, 0x3, 0xb, 0x1, 0xe7, 0xbf, 0xf7,
+                                                          0xc4, 0xbf, 0x3, 0xb, 0x5, 0xc3, 0x6, 0xb,
+                                                          0x5, 0x54, 0x6, 0xb, 0x1b, 0xb7, 0xb9, 0x9d,
+                                                          0xa7, 0xb1, 0x1f, 0x7d, 0xb8, 0x5, 0x7f, 0x77,
+                                                          0x53, 0x76, 0x67, 0x1b, 0xb, 0x15, 0xda, 0x6,
+                                                          0xa5, 0xf7, 0xa, 0x5, 0x3d, 0x6, 0xb, 0x5,
+                                                          0xfb, 0x1b, 0x6, 0xb, 0x6, 0x7f, 0x54, 0x5,
+                                                          0xb, 0x63, 0xa, 0x6, 0xb, 0xfc, 0x5a, 0x5,
+                                                          0xb, 0x70, 0xa, 0xf7, 0x78, 0x77, 0x50, 0xa,
+                                                          0xb, 0x5d, 0xa, 0xf7, 0x74, 0x77, 0x49, 0xa,
+                                                          0xb, 0x8b, 0x61, 0xa, 0xf7, 0x5e, 0xc1, 0xb,
+                                                          0x6, 0xa4, 0x88, 0xa, 0xb, 0x7c, 0xc2, 0xf7,
+                                                          0xf4, 0xc3, 0xb, 0x6, 0x30, 0x58, 0xa, 0xb,
+                                                          0x6, 0x81, 0x55, 0x5, 0xb, 0x6, 0x80, 0x53,
+                                                          0x5, 0xb, 0xc1, 0xf7, 0x5d, 0xc1, 0xb, 0x5,
+                                                          0x52, 0x6, 0xb, 0x5, 0xfb, 0x0, 0xb, 0xf7,
+                                                          0x7e, 0x5, 0xb, 0xf8, 0x9a, 0x76, 0xf7, 0x43,
+                                                          0x77, 0x1, 0xb, 0x5, 0xfb, 0x21, 0x38, 0xa,
+                                                          0xb, 0x6, 0x81, 0x54, 0x5, 0xb, 0x6, 0x81,
+                                                          0x56, 0x5, 0xb, 0x95, 0xc2, 0x5, 0xb, 0x5,
+                                                          0xc2, 0x6, 0xb, 0x5, 0x39, 0x6, 0xb, 0x15,
+                                                          0x74, 0x97, 0x76, 0xa4, 0xa6, 0xa5, 0xa8, 0xa9,
+                                                          0xa1, 0x7d, 0xb, 0x15, 0x57, 0xb4, 0x5b, 0xcd,
+                                                          0xdf, 0xd1, 0xd3, 0xdd, 0xbd, 0x69, 0xb, 0x6,
+                                                          0xa4, 0xf7, 0x7, 0x5, 0xb, 0x8b, 0xc2, 0xf7,
+                                                          0xdb, 0xc2, 0xb, 0x79, 0xc1, 0xf8, 0x6d, 0xc3,
+                                                          0xb, 0x5, 0x53, 0x6, 0xb, 0x71, 0x5f, 0x6c,
+                                                          0x61, 0x55, 0x68, 0x71, 0xa1, 0xa9, 0x1e, 0xb,
+                                                          0xf7, 0x1c, 0x76, 0xf7, 0x32, 0xbd, 0xf7, 0x34,
+                                                          0x77, 0x1, 0xb, 0x77, 0x1, 0xf7, 0xa, 0xc6,
+                                                          0xf2, 0xc7, 0x3, 0xf7, 0xac, 0xb, 0x6, 0xf7,
+                                                          0x29, 0x64, 0xa, 0x2f, 0x6, 0xe, 0x6, 0x94,
+                                                          0xc1, 0x5, 0xb, 0x6, 0x69, 0xa, 0xb, 0x6,
+                                                          0x96, 0xbe, 0x5, 0xb, 0xf7, 0x24, 0x5, 0xe,
+                                                          0xfc, 0x5d, 0x5, 0xb, 0x5, 0x38, 0x6, 0xb,
+                                                          0xe2, 0xdd, 0x9b, 0x1f, 0xd1, 0xf7, 0xf8, 0x5,
+                                                          0xb, 0x77, 0x1, 0xad, 0xc1, 0xf8, 0x3a, 0xc2,
+                                                          0x3, 0xb, 0x8b, 0xbe, 0xf7, 0x12, 0xc1, 0xf7,
+                                                          0xac, 0xc1, 0xb, 0xf7, 0x1d, 0xc4, 0xf7, 0x71,
+                                                          0x77, 0x1, 0xc1, 0xb, 0x6, 0x96, 0xc0, 0x5,
+                                                          0xb, 0x5, 0xf7, 0xbe, 0x6, 0xb, 0x6, 0x80,
+                                                          0x57, 0x5, 0xb, 0x5, 0xfb, 0x18, 0x6, 0xb,
+                                                          0xf7, 0x78, 0x77, 0x1, 0xb, 0x15, 0xdd, 0x6,
+                                                          0xb, 0xf7, 0x1f, 0x6, 0xb, 0xf8, 0x5a, 0x5,
+                                                          0xb, 0xf7, 0x8, 0x5, 0xb, 0x5, 0x3b, 0x6,
+                                                          0xb
+                                                         };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSans.c b/core/src/fxge/fontdata/chromefontdata/FoxitSans.c
new file mode 100644
index 0000000..cd87d2b
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSans.c
@@ -0,0 +1,1886 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansFontData [15025] = {0x1,
+                                                   0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xd,
+                                                   0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,
+                                                   0x73, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1, 0x1,
+                                                   0x24, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8,
+                                                   0x1d, 0x2, 0xf8, 0x1d, 0x3, 0xf8, 0x18, 0x4,
+                                                   0xfb, 0x3a, 0xfb, 0x75, 0xfa, 0x7c, 0xfa, 0x45,
+                                                   0x5, 0xf7, 0x16, 0xf, 0xf8, 0xe1, 0x11, 0xab,
+                                                   0x1c, 0x34, 0xa2, 0x12, 0x0, 0x3, 0x1, 0x1,
+                                                   0x5, 0x2f, 0x3d, 0x45, 0x75, 0x72, 0x6f, 0x20,
+                                                   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                   0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53,
+                                                   0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46, 0x0,
+                                                   0x0, 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab,
+                                                   0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf,
+                                                   0x0, 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1,
+                                                   0x0, 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3,
+                                                   0x0, 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87,
+                                                   0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a,
+                                                   0x0, 0xb6, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9,
+                                                   0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x8c,
+                                                   0x0, 0x2e, 0x0, 0x2f, 0x0, 0xba, 0x0, 0x30,
+                                                   0x0, 0x8e, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd,
+                                                   0x0, 0xbe, 0x0, 0x8d, 0x0, 0xbf, 0x0, 0x31,
+                                                   0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0xc0,
+                                                   0x0, 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1,
+                                                   0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37,
+                                                   0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5,
+                                                   0x0, 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42,
+                                                   0x0, 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca,
+                                                   0x0, 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc,
+                                                   0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0, 0x21,
+                                                   0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0, 0x5d,
+                                                   0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0, 0x3e,
+                                                   0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0, 0x44,
+                                                   0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0, 0x61,
+                                                   0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0, 0xaa,
+                                                   0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0, 0x71,
+                                                   0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0, 0x5,
+                                                   0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0, 0xcf,
+                                                   0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0x19,
+                                                   0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0, 0x1e,
+                                                   0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0, 0x47,
+                                                   0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0, 0x65,
+                                                   0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x0, 0x95,
+                                                   0x0, 0x7c, 0x0, 0x1f, 0x0, 0x6a, 0x0, 0x78,
+                                                   0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x86,
+                                                   0x0, 0xe, 0x0, 0x4a, 0x0, 0xd3, 0x0, 0xd4,
+                                                   0x0, 0xd5, 0x0, 0xd6, 0x0, 0x4b, 0x0, 0x4c,
+                                                   0x0, 0x4d, 0x0, 0x1d, 0x0, 0x97, 0x0, 0x92,
+                                                   0x0, 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98,
+                                                   0x0, 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7,
+                                                   0x0, 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9,
+                                                   0x0, 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb,
+                                                   0x0, 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96,
+                                                   0x0, 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc,
+                                                   0x0, 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa,
+                                                   0x0, 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a,
+                                                   0x0, 0xc, 0x0, 0x9c, 0x0, 0x52, 0x0, 0x20,
+                                                   0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0, 0x69,
+                                                   0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0, 0x75,
+                                                   0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0, 0x84,
+                                                   0x0, 0x54, 0x0, 0xdd, 0x0, 0x66, 0x0, 0x1c,
+                                                   0x0, 0x18, 0x0, 0x17, 0x0, 0x10, 0x0, 0x1,
+                                                   0x0, 0x62, 0x0, 0x55, 0x0, 0xa2, 0x0, 0x14,
+                                                   0x0, 0xa3, 0x0, 0xa9, 0x0, 0x7f, 0x0, 0x99,
+                                                   0x0, 0x13, 0x0, 0xa4, 0x0, 0x56, 0x0, 0xde,
+                                                   0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0x40,
+                                                   0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a,
+                                                   0x0, 0xe2, 0x0, 0xe3, 0x0, 0x64, 0x0, 0x5b,
+                                                   0x0, 0xe4, 0x0, 0x11, 0x0, 0xe6, 0x2, 0x0,
+                                                   0x1, 0x0, 0x4, 0x0, 0x36, 0x0, 0x75, 0x0,
+                                                   0x8a, 0x0, 0xa2, 0x0, 0xc2, 0x0, 0xd3, 0x1,
+                                                   0x4, 0x1, 0x32, 0x1, 0x92, 0x1, 0xe1, 0x2,
+                                                   0x5b, 0x2, 0x9d, 0x2, 0xc0, 0x2, 0xcd, 0x2,
+                                                   0xd9, 0x2, 0xeb, 0x2, 0xfc, 0x3, 0x47, 0x3,
+                                                   0xc2, 0x3, 0xe1, 0x4, 0x42, 0x4, 0x68, 0x4,
+                                                   0x77, 0x4, 0x87, 0x4, 0xa4, 0x4, 0xbf, 0x4,
+                                                   0xd0, 0x5, 0x1, 0x5, 0x2f, 0x5, 0x44, 0x5,
+                                                   0x71, 0x5, 0xa7, 0x5, 0xcc, 0x6, 0x16, 0x6,
+                                                   0x68, 0x6, 0xd7, 0x6, 0xe8, 0x6, 0xf9, 0x7,
+                                                   0x8, 0x7, 0x21, 0x7, 0xa4, 0x7, 0xdf, 0x8,
+                                                   0x1c, 0x8, 0x98, 0x8, 0xf0, 0x9, 0x58, 0x9,
+                                                   0xc6, 0x9, 0xe1, 0xa, 0x25, 0xa, 0x58, 0xa,
+                                                   0x60, 0xa, 0x67, 0xa, 0x74, 0xa, 0x7b, 0xa,
+                                                   0x96, 0xa, 0xcf, 0xb, 0x3, 0xb, 0x2a, 0xb,
+                                                   0x4e, 0xb, 0x76, 0xb, 0x90, 0xb, 0xb2, 0xc,
+                                                   0x31, 0xc, 0x40, 0xc, 0x4e, 0xc, 0x5c, 0xc,
+                                                   0x6a, 0xd, 0x12, 0xd, 0x37, 0xd, 0xcd, 0xe,
+                                                   0xa, 0xe, 0x2c, 0xe, 0x74, 0xe, 0xc8, 0xf,
+                                                   0x7c, 0xf, 0xb4, 0x10, 0xb, 0x10, 0x21, 0x10,
+                                                   0x37, 0x10, 0x85, 0x10, 0xd3, 0x10, 0xf1, 0x11,
+                                                   0xe, 0x11, 0x32, 0x11, 0x4f, 0x11, 0x70, 0x11,
+                                                   0xba, 0x11, 0xd1, 0x12, 0x42, 0x12, 0x76, 0x12,
+                                                   0xed, 0x13, 0x3, 0x13, 0x1c, 0x13, 0x40, 0x13,
+                                                   0xd1, 0x14, 0x41, 0x14, 0x90, 0x14, 0xb4, 0x14,
+                                                   0xe5, 0x15, 0x1d, 0x15, 0x39, 0x15, 0x62, 0x15,
+                                                   0xe9, 0x15, 0xfd, 0x16, 0xb, 0x16, 0x5c, 0x16,
+                                                   0x6f, 0x16, 0x81, 0x16, 0xcb, 0x16, 0xe6, 0x17,
+                                                   0x5a, 0x17, 0x81, 0x17, 0x91, 0x17, 0x9f, 0x17,
+                                                   0xbb, 0x18, 0x2e, 0x18, 0x56, 0x18, 0x7e, 0x18,
+                                                   0xae, 0x18, 0xc2, 0x19, 0x15, 0x19, 0x25, 0x19,
+                                                   0x87, 0x19, 0xb7, 0x19, 0xcf, 0x1a, 0x40, 0x1a,
+                                                   0xa3, 0x1a, 0xba, 0x1a, 0xd6, 0x1b, 0x8, 0x1b,
+                                                   0x3a, 0x1b, 0x54, 0x1b, 0x6e, 0x1b, 0xa4, 0x1b,
+                                                   0xb8, 0x1b, 0xc9, 0x1b, 0xe0, 0x1b, 0xf1, 0x1c,
+                                                   0xe, 0x1c, 0x29, 0x1c, 0x3a, 0x1c, 0x6b, 0x1c,
+                                                   0x92, 0x1c, 0x9a, 0x1c, 0xb7, 0x1c, 0xcb, 0x1c,
+                                                   0xe9, 0x1d, 0x3b, 0x1d, 0x4c, 0x1d, 0x58, 0x1d,
+                                                   0x9b, 0x1d, 0xd1, 0x1e, 0x1, 0x1e, 0x62, 0x1e,
+                                                   0xd1, 0x1f, 0x38, 0x1f, 0x7d, 0x1f, 0x8f, 0x1f,
+                                                   0xa1, 0x1f, 0xb5, 0x20, 0x40, 0x20, 0x73, 0x20,
+                                                   0x8c, 0x20, 0xb0, 0x21, 0x2d, 0x21, 0x85, 0x21,
+                                                   0xad, 0x22, 0x24, 0x22, 0x66, 0x22, 0xdf, 0x23,
+                                                   0x25, 0x23, 0x6e, 0x23, 0x9e, 0x23, 0xd2, 0x24,
+                                                   0x8, 0x24, 0x9d, 0x24, 0xac, 0x24, 0xc3, 0x25,
+                                                   0x37, 0x25, 0x59, 0x25, 0x89, 0x25, 0xd3, 0x26,
+                                                   0x29, 0x26, 0x7f, 0x26, 0x9a, 0x26, 0xb5, 0x26,
+                                                   0xd1, 0x26, 0xf2, 0x27, 0x16, 0x27, 0x38, 0x27,
+                                                   0x5a, 0x27, 0x77, 0x27, 0xa8, 0x28, 0x45, 0x28,
+                                                   0x7d, 0x28, 0xd4, 0x29, 0x32, 0x29, 0xcd, 0x29,
+                                                   0xf8, 0x2a, 0x24, 0x2a, 0x87, 0x2a, 0x9d, 0x2a,
+                                                   0xa0, 0x2b, 0x31, 0x2b, 0x6b, 0x2b, 0xc2, 0x2c,
+                                                   0x21, 0x2c, 0xba, 0x2d, 0x14, 0x2d, 0x50, 0x2d,
+                                                   0x9d, 0x2d, 0xeb, 0x2e, 0x36, 0x2e, 0x6b, 0x2e,
+                                                   0x7a, 0x2e, 0x88, 0x2e, 0xbc, 0x2e, 0xd8, 0x2e,
+                                                   0xe4, 0x2f, 0x0, 0x2f, 0x33, 0x2f, 0x62, 0x2f,
+                                                   0xa0, 0x2f, 0xb3, 0x2f, 0xcb, 0x30, 0x12, 0x30,
+                                                   0x23, 0x30, 0x3c, 0x30, 0x85, 0xfc, 0x31, 0xe,
+                                                   0x5f, 0xa, 0xf7, 0x70, 0xd6, 0xf8, 0x3b, 0x77,
+                                                   0x1, 0x99, 0x16, 0xea, 0x6, 0xd8, 0xf7, 0x70,
+                                                   0x5, 0xf7, 0xb2, 0x6, 0xdb, 0xfb, 0x70, 0x5,
+                                                   0xf1, 0x6, 0xfb, 0xaa, 0xf9, 0x62, 0x5, 0x28,
+                                                   0x6, 0x49, 0xfc, 0x3b, 0x15, 0xf7, 0x4, 0xf7,
+                                                   0xef, 0x5, 0x8d, 0x6, 0xf7, 0xb, 0xfb, 0xef,
+                                                   0x5, 0xe, 0xf7, 0xc9, 0x8b, 0xdf, 0xf7, 0xf,
+                                                   0xdf, 0xaf, 0xdf, 0xf7, 0x72, 0xe0, 0x1, 0xf8,
+                                                   0x78, 0xea, 0x3, 0x93, 0x16, 0xf2, 0x6, 0xec,
+                                                   0xf7, 0x63, 0x5, 0xf7, 0xa8, 0xfb, 0x63, 0xf8,
+                                                   0x67, 0xdf, 0xfc, 0x8, 0xf7, 0x87, 0xf7, 0xdf,
+                                                   0xdf, 0xfb, 0xdf, 0xf7, 0x72, 0xf8, 0x7, 0xe0,
+                                                   0xfc, 0xea, 0x6, 0x23, 0xfc, 0x3f, 0x15, 0xf7,
+                                                   0x39, 0xf7, 0xea, 0x5, 0xd2, 0xfb, 0xea, 0x6,
+                                                   0xe, 0x46, 0xa, 0xf8, 0x7f, 0xf7, 0x19, 0x1,
+                                                   0x27, 0xa, 0xfb, 0x44, 0xf8, 0x7f, 0x4c, 0xa,
+                                                   0xf7, 0x0, 0xf7, 0x19, 0x59, 0xa, 0x35, 0xa,
+                                                   0xfb, 0x9d, 0xf8, 0x7f, 0x15, 0xef, 0x6, 0xc3,
+                                                   0xda, 0xc0, 0x3c, 0x5, 0xef, 0x6, 0xfb, 0x2,
+                                                   0xf7, 0x19, 0x5, 0x2e, 0x6, 0xe, 0x46, 0xa,
+                                                   0xf8, 0x86, 0xed, 0x1, 0xf7, 0x5a, 0xe5, 0xe6,
+                                                   0xe5, 0x3, 0x27, 0xa, 0xfb, 0x8a, 0xf8, 0x86,
+                                                   0x15, 0xe5, 0xed, 0x31, 0x6, 0xf7, 0x49, 0x29,
+                                                   0x15, 0xe5, 0xed, 0x31, 0x6, 0xe, 0x35, 0xa,
+                                                   0xfb, 0x11, 0xf8, 0x7a, 0x15, 0xd0, 0x6, 0x4c,
+                                                   0xf7, 0x1e, 0x5, 0xfb, 0x1, 0x6, 0xe, 0x46,
+                                                   0xa, 0xf8, 0x65, 0xaf, 0xf2, 0xaf, 0x1, 0xf7,
+                                                   0x85, 0xaf, 0xf3, 0xaf, 0x3, 0x27, 0xa, 0xfb,
+                                                   0x5f, 0xf8, 0xbe, 0x64, 0xa, 0xaf, 0x5a, 0x5a,
+                                                   0x65, 0x67, 0x5a, 0x1e, 0xaf, 0x16, 0xa5, 0xa1,
+                                                   0xa3, 0xa9, 0xa9, 0xa1, 0x75, 0x6f, 0x6e, 0x74,
+                                                   0x73, 0x6e, 0x70, 0x72, 0xa0, 0xab, 0x1e, 0xe,
+                                                   0x46, 0xa, 0xf8, 0x87, 0x75, 0xa, 0x13, 0xe0,
+                                                   0x27, 0xa, 0xfb, 0xa6, 0xf8, 0x87, 0x6b, 0xa,
+                                                   0xa3, 0xa2, 0x80, 0x7f, 0xa1, 0x1f, 0x80, 0xa0,
+                                                   0x9f, 0x7f, 0x53, 0xa, 0x7e, 0x7b, 0x92, 0x93,
+                                                   0x79, 0x1f, 0x13, 0xd0, 0x97, 0x72, 0x70, 0x99,
+                                                   0x6d, 0x1b, 0x13, 0xe0, 0x73, 0xa, 0x73, 0x8b,
+                                                   0xe0, 0xf7, 0x8a, 0xe0, 0xf7, 0x6d, 0xe0, 0x1,
+                                                   0xd5, 0xea, 0xf7, 0xd2, 0xe8, 0x3, 0xd5, 0x16,
+                                                   0xf7, 0x82, 0x6, 0xf7, 0x18, 0xf7, 0x4b, 0xa5,
+                                                   0xf7, 0x4a, 0xc3, 0x67, 0xdf, 0xfb, 0x2, 0xac,
+                                                   0x1f, 0xe8, 0xba, 0x91, 0xce, 0xa5, 0x1a, 0xf7,
+                                                   0x32, 0xfb, 0x26, 0xb2, 0xfb, 0xe, 0x1e, 0xfb,
+                                                   0x82, 0x6, 0xea, 0xfd, 0xd, 0x15, 0xf7, 0x8a,
+                                                   0xf7, 0x23, 0x7, 0xc5, 0xf7, 0x33, 0x8b, 0xfb,
+                                                   0xf, 0xfb, 0x10, 0xfb, 0x3b, 0x8c, 0x59, 0x1f,
+                                                   0xfb, 0x23, 0xf7, 0xdf, 0x15, 0xf7, 0x6d, 0xf7,
+                                                   0x23, 0x7, 0xda, 0xeb, 0x89, 0xfb, 0x2, 0x21,
+                                                   0xfb, 0x4, 0x8c, 0x4c, 0x1f, 0xe, 0xaa, 0x78,
+                                                   0xde, 0xf8, 0xe2, 0xde, 0x1, 0xc3, 0xee, 0x3,
+                                                   0xf8, 0xde, 0xf7, 0x8d, 0x15, 0x32, 0x78, 0x53,
+                                                   0x2b, 0xfb, 0x1d, 0x1b, 0xfb, 0x40, 0x50, 0xf7,
+                                                   0x47, 0xf7, 0xc, 0xf7, 0xa, 0xab, 0xf7, 0x41,
+                                                   0xf7, 0x5b, 0xf7, 0x19, 0xbc, 0x2c, 0x50, 0x9e,
+                                                   0x1f, 0xe9, 0xa1, 0x5, 0xf7, 0x2b, 0x60, 0xfb,
+                                                   0xf, 0xcb, 0xfb, 0x15, 0x1b, 0xfb, 0x45, 0xfb,
+                                                   0x2d, 0xfb, 0x8, 0xfb, 0x96, 0xfb, 0x57, 0xe1,
+                                                   0xfb, 0x4f, 0xf7, 0x88, 0xd9, 0xf7, 0x41, 0xa2,
+                                                   0xf7, 0x70, 0xc3, 0x1f, 0xe, 0xaa, 0xfb, 0x60,
+                                                   0x76, 0xf7, 0x67, 0xda, 0xf8, 0xe1, 0xde, 0x1,
+                                                   0xb7, 0xee, 0xf7, 0x85, 0xe1, 0x3, 0xf7, 0xda,
+                                                   0x7d, 0x15, 0x72, 0x3f, 0x5, 0xbf, 0x8a, 0xaa,
+                                                   0x80, 0x70, 0x1a, 0x65, 0xfb, 0x7, 0x91, 0x78,
+                                                   0x8a, 0x1e, 0x87, 0x4c, 0x5, 0xf7, 0x2d, 0xd2,
+                                                   0x9e, 0xd8, 0xae, 0x75, 0xb0, 0x4e, 0x92, 0x1f,
+                                                   0x91, 0xac, 0x5, 0xf7, 0x1e, 0xf7, 0x0, 0xd8,
+                                                   0xf7, 0x3a, 0xb5, 0x1f, 0x2b, 0xa4, 0x5, 0x2f,
+                                                   0x75, 0x59, 0x2d, 0xfb, 0x1e, 0x1b, 0xfb, 0x42,
+                                                   0x51, 0xf7, 0x2d, 0xf7, 0x21, 0xf7, 0x1a, 0xbc,
+                                                   0xf7, 0x35, 0xf7, 0x52, 0xf7, 0x19, 0xb4, 0x2e,
+                                                   0x50, 0x9d, 0x1f, 0xe9, 0xa1, 0x5, 0xf7, 0x2c,
+                                                   0x60, 0xfb, 0x7, 0xc8, 0xfb, 0x13, 0x1b, 0xfb,
+                                                   0x31, 0xfb, 0x4a, 0x28, 0xfb, 0xab, 0xfb, 0x38,
+                                                   0xd0, 0xfb, 0x65, 0xf7, 0x69, 0x1f, 0xe, 0xaa,
+                                                   0x8b, 0xe0, 0xf8, 0xb8, 0xe0, 0x12, 0xdc, 0xea,
+                                                   0xf8, 0x24, 0xed, 0x17, 0xdc, 0x16, 0xf7, 0x8a,
+                                                   0x6, 0xf7, 0x6e, 0xf7, 0x15, 0xf7, 0x10, 0xf7,
+                                                   0x82, 0x1f, 0x13, 0xe0, 0xf7, 0x9a, 0xfb, 0x24,
+                                                   0xe9, 0xfb, 0x5f, 0x1e, 0xfb, 0x8a, 0x6, 0xea,
+                                                   0xfd, 0xd, 0x15, 0xf8, 0xb8, 0x7, 0x13, 0xd0,
+                                                   0xf7, 0x2b, 0x6, 0xf7, 0x2e, 0xea, 0x21, 0xfb,
+                                                   0x39, 0xfb, 0xac, 0xfb, 0x39, 0x8e, 0x37, 0x1f,
+                                                   0xe, 0x73, 0x8b, 0xe0, 0xf7, 0x86, 0xe0, 0xf7,
+                                                   0x71, 0xe0, 0x6e, 0xa, 0x3, 0xe1, 0x16, 0xf9,
+                                                   0x62, 0xf8, 0x85, 0x36, 0xfc, 0x26, 0xfb, 0x71,
+                                                   0xf8, 0x15, 0x36, 0xfc, 0x15, 0xfb, 0x86, 0xf8,
+                                                   0x26, 0x36, 0x7, 0xe, 0x43, 0xa, 0xc3, 0xf7,
+                                                   0x1d, 0x36, 0xa, 0xf7, 0x54, 0xc3, 0x2f, 0xa,
+                                                   0xe, 0x43, 0xa, 0xf7, 0x55, 0x77, 0x36, 0xa,
+                                                   0xf2, 0xc3, 0x2c, 0xa, 0xe, 0x43, 0xa, 0xcc,
+                                                   0xef, 0x6e, 0xa, 0xa6, 0xe5, 0xe6, 0xe5, 0x30,
+                                                   0xa, 0xf7, 0xe, 0xcc, 0x2e, 0xa, 0xe, 0x43,
+                                                   0xa, 0xc7, 0xf7, 0x19, 0x36, 0xa, 0xf7, 0x8f,
+                                                   0xc7, 0x4c, 0xa, 0x4a, 0xf7, 0x19, 0x59, 0xa,
+                                                   0xaa, 0x8b, 0xe0, 0xf7, 0x7b, 0xe0, 0xf7, 0x7c,
+                                                   0xe0, 0x1, 0xdb, 0xea, 0xf8, 0x25, 0xed, 0x3,
+                                                   0xdb, 0x16, 0xf7, 0x89, 0x6, 0xf7, 0x5a, 0xf7,
+                                                   0x2b, 0xf7, 0xc, 0xf7, 0x86, 0xf7, 0x9a, 0xfb,
+                                                   0x26, 0xe9, 0xfb, 0x5f, 0x1f, 0xfb, 0x89, 0xfb,
+                                                   0xd1, 0x3b, 0x36, 0xdb, 0x6, 0xea, 0xfb, 0x7b,
+                                                   0x15, 0xf7, 0x7b, 0xf7, 0x57, 0xe0, 0xfb, 0x57,
+                                                   0xf7, 0x7c, 0xf7, 0x2a, 0x7, 0xf7, 0x34, 0xe6,
+                                                   0x46, 0xfb, 0x5e, 0xfb, 0xab, 0xfb, 0x3b, 0x8d,
+                                                   0x37, 0x1f, 0xe, 0x73, 0x8b, 0xda, 0xf7, 0x43,
+                                                   0xcb, 0xdf, 0xcb, 0xf7, 0x41, 0xda, 0x1, 0x99,
+                                                   0xf7, 0x93, 0x15, 0xf4, 0x6, 0xfb, 0x40, 0xb7,
+                                                   0xe4, 0x38, 0xf7, 0x6b, 0x1b, 0xc1, 0xc9, 0x94,
+                                                   0x9d, 0xbb, 0x1f, 0xed, 0x7, 0x68, 0x5e, 0x50,
+                                                   0x80, 0x4f, 0x1b, 0xfb, 0x20, 0x31, 0xcb, 0xf7,
+                                                   0x4, 0x73, 0x1f, 0xf7, 0xe4, 0x6, 0x9a, 0xcb,
+                                                   0x5, 0xfb, 0xff, 0x6, 0x8a, 0x99, 0x8b, 0xae,
+                                                   0x8c, 0xac, 0x8, 0xf8, 0xf, 0x6, 0x9a, 0xcb,
+                                                   0x5, 0xfc, 0x15, 0x6, 0xf7, 0x6, 0xa2, 0xf7,
+                                                   0x2, 0xc7, 0xf7, 0x19, 0x1b, 0xc5, 0xbf, 0x7b,
+                                                   0x6c, 0xb8, 0x1f, 0xa2, 0xe2, 0x5, 0xa7, 0x56,
+                                                   0x4b, 0x96, 0x4e, 0x1b, 0xfb, 0x5b, 0xfb, 0x12,
+                                                   0x32, 0xfb, 0x38, 0x66, 0x1f, 0x37, 0x6, 0x7b,
+                                                   0x4b, 0x5, 0xe7, 0x6, 0x8a, 0x77, 0x8c, 0x61,
+                                                   0x8c, 0x77, 0x8, 0x3e, 0x6, 0xe, 0x3b, 0xa0,
+                                                   0x76, 0xf7, 0xd8, 0xe0, 0xf7, 0x74, 0xe0, 0x6e,
+                                                   0xa, 0x3, 0xe1, 0x16, 0xea, 0xf7, 0xd8, 0xf7,
+                                                   0xdb, 0xe0, 0xfb, 0xdb, 0xf7, 0x74, 0xf8, 0x26,
+                                                   0xe0, 0xfc, 0x85, 0x6, 0xe, 0xe2, 0x78, 0xe2,
+                                                   0xf7, 0x66, 0xe2, 0xf7, 0xb5, 0xde, 0x12, 0xbb,
+                                                   0xea, 0xf8, 0x6a, 0xe6, 0x17, 0xf8, 0x29, 0xf7,
+                                                   0xaa, 0x15, 0xf7, 0x64, 0xfb, 0x1c, 0x6, 0x7d,
+                                                   0x7a, 0x39, 0x4f, 0x20, 0x1b, 0x13, 0x30, 0xfb,
+                                                   0x3c, 0x2b, 0xf7, 0xc, 0xf7, 0x3b, 0xd2, 0xa2,
+                                                   0xf7, 0x78, 0xf7, 0x83, 0x1f, 0x13, 0xf8, 0xf7,
+                                                   0x35, 0xa9, 0xfb, 0x5, 0x5d, 0x98, 0x1f, 0xdf,
+                                                   0xa3, 0x5, 0xc0, 0x7e, 0x64, 0xf7, 0x39, 0xfb,
+                                                   0x80, 0x1b, 0xfb, 0xb4, 0x46, 0xfb, 0x82, 0xfb,
+                                                   0x24, 0xfb, 0x7b, 0xf7, 0x24, 0xfb, 0x23, 0xf7,
+                                                   0x6b, 0xf7, 0x2d, 0xf5, 0xdd, 0xaa, 0xb1, 0x1f,
+                                                   0xf7, 0xa3, 0xfb, 0xbf, 0x7, 0xe, 0xaa, 0xa0,
+                                                   0x76, 0xf7, 0xe5, 0xe0, 0xf7, 0xbc, 0x77, 0x1,
+                                                   0xd8, 0xea, 0xf8, 0xf, 0xea, 0x3, 0xd8, 0x16,
+                                                   0xea, 0xf7, 0xe5, 0xf8, 0xf, 0xfb, 0xe5, 0xea,
+                                                   0xf9, 0x62, 0x2c, 0xfb, 0xbc, 0xfc, 0xf, 0xf7,
+                                                   0xbc, 0x2c, 0x6, 0xe, 0xfc, 0x31, 0x39, 0xa,
+                                                   0xe6, 0xec, 0x3, 0xe6, 0x16, 0xec, 0xf9, 0x62,
+                                                   0x2a, 0x6, 0xe, 0x61, 0xa, 0xd2, 0xf9, 0xab,
+                                                   0x4c, 0xa, 0xf7, 0x15, 0xf7, 0x1e, 0x38, 0xa,
+                                                   0x48, 0x51, 0xa, 0x4b, 0xa, 0xf9, 0xac, 0xf7,
+                                                   0x1d, 0x1, 0xe5, 0xea, 0x3, 0x85, 0xf9, 0xac,
+                                                   0x15, 0xef, 0x6, 0xba, 0xde, 0xb8, 0x38, 0x5,
+                                                   0xee, 0x6, 0x26, 0x42, 0xa, 0x8a, 0x51, 0xa,
+                                                   0x4b, 0xa, 0xf9, 0xb5, 0xef, 0x12, 0x98, 0xe5,
+                                                   0x7e, 0xea, 0x82, 0xe5, 0x13, 0xd0, 0xe5, 0x16,
+                                                   0xea, 0xf9, 0x60, 0x2c, 0x6, 0x13, 0xe8, 0x3e,
+                                                   0xe0, 0x58, 0xa, 0x61, 0xa, 0xf7, 0x1e, 0xf9,
+                                                   0xaa, 0x15, 0xd1, 0x6, 0x35, 0xf7, 0x1f, 0x38,
+                                                   0xa, 0xde, 0x51, 0xa, 0xfb, 0x53, 0x78, 0xe0,
+                                                   0xf9, 0x20, 0x77, 0x1, 0x9c, 0xe1, 0xf7, 0x7a,
+                                                   0xea, 0x3, 0x9c, 0xf7, 0x5b, 0x15, 0xfb, 0x4c,
+                                                   0xf7, 0x19, 0x69, 0xd2, 0xf7, 0x49, 0xa5, 0xf7,
+                                                   0x13, 0xf7, 0x3, 0x1e, 0xf8, 0x87, 0x2c, 0xfc,
+                                                   0x87, 0x7, 0x50, 0x86, 0x2d, 0x20, 0x27, 0x7b,
+                                                   0xeb, 0xbc, 0x89, 0x1e, 0xe, 0x73, 0x39, 0xa,
+                                                   0xd7, 0xea, 0x3, 0xd7, 0x16, 0xea, 0xf7, 0x8c,
+                                                   0x6, 0xf7, 0xa, 0xf7, 0x6, 0xf7, 0x8d, 0xfb,
+                                                   0xfe, 0x5, 0xf7, 0x11, 0x6, 0xfb, 0xc8, 0xf8,
+                                                   0x3e, 0xf7, 0xbf, 0xf7, 0xb8, 0x5, 0xfb, 0x14,
+                                                   0x6, 0xfb, 0xf7, 0xfb, 0xf9, 0x5, 0xf7, 0xf9,
+                                                   0x2c, 0x7, 0xe, 0x8b, 0xe0, 0xf9, 0xd, 0x77,
+                                                   0x1, 0xd7, 0xea, 0x3, 0xd7, 0x16, 0xf8, 0x61,
+                                                   0xe0, 0xfc, 0x2, 0xf9, 0xd, 0x2c, 0x6, 0xe,
+                                                   0x8b, 0xe0, 0xf9, 0xd, 0x77, 0x1, 0xd6, 0xea,
+                                                   0x3, 0xd6, 0x16, 0xf8, 0x62, 0xe0, 0xfc, 0x3,
+                                                   0xf7, 0xa4, 0x6, 0xf7, 0x35, 0x5a, 0xa, 0xdd,
+                                                   0x7, 0xfb, 0x35, 0xfb, 0x1e, 0x5, 0xf7, 0xac,
+                                                   0x2c, 0xfb, 0xfc, 0x7, 0x2c, 0x38, 0x5, 0x3a,
+                                                   0x7, 0xea, 0xdd, 0x5, 0xe, 0xf7, 0x22, 0x39,
+                                                   0xa, 0xd4, 0xe5, 0xf8, 0x90, 0xe5, 0x3, 0xd4,
+                                                   0x16, 0xe5, 0xf8, 0xf7, 0x8e, 0x6, 0xf7, 0x64,
+                                                   0xfc, 0xf7, 0x5, 0xe0, 0x6, 0xf7, 0x66, 0xf8,
+                                                   0xed, 0x5, 0x8d, 0xfc, 0xed, 0xe5, 0xf9, 0x62,
+                                                   0xfb, 0x16, 0x6, 0xfb, 0x65, 0xfc, 0xfb, 0x5,
+                                                   0x89, 0x6, 0xfb, 0x5e, 0xf8, 0xfb, 0x5, 0xfb,
+                                                   0x25, 0x6, 0xe, 0xaa, 0x39, 0xa, 0xd7, 0xe5,
+                                                   0xf8, 0x1a, 0xe5, 0x3, 0xd7, 0x16, 0xe5, 0xf8,
+                                                   0xc8, 0x8d, 0x6, 0xf8, 0x11, 0xfc, 0xc8, 0x5,
+                                                   0xec, 0xf9, 0x62, 0x31, 0xfc, 0xc8, 0x89, 0x6,
+                                                   0xfc, 0x11, 0xf8, 0xc8, 0x5, 0x2a, 0x6, 0xe,
+                                                   0xaa, 0xa0, 0x76, 0xf8, 0xd7, 0xf7, 0x2e, 0xf7,
+                                                   0x22, 0xb5, 0x1, 0xd7, 0xe5, 0xf8, 0x1a, 0xe5,
+                                                   0x3, 0xd7, 0x16, 0xe5, 0xf8, 0xc6, 0x8d, 0x6,
+                                                   0xf8, 0x11, 0xfc, 0xc6, 0x5, 0xec, 0xf9, 0x60,
+                                                   0x31, 0xfc, 0xc6, 0x6, 0xfc, 0x13, 0xf8, 0xc6,
+                                                   0x5, 0x2a, 0x6, 0xf7, 0x18, 0xe3, 0x6b, 0xa,
+                                                   0xa1, 0xa1, 0x7f, 0x80, 0xa1, 0x1f, 0x7f, 0xa1,
+                                                   0xa1, 0x80, 0x53, 0xa, 0x87, 0x78, 0x94, 0x95,
+                                                   0x73, 0x1f, 0x96, 0x72, 0x6c, 0x96, 0x71, 0x1b,
+                                                   0x73, 0xa, 0xe2, 0x78, 0xde, 0xf8, 0xe2, 0xde,
+                                                   0x1, 0xc7, 0xef, 0xf8, 0x5f, 0xef, 0x3, 0xb2,
+                                                   0xf7, 0xf8, 0x15, 0xfb, 0x4f, 0xf7, 0xd, 0xfb,
+                                                   0x50, 0xf7, 0x78, 0xf7, 0x57, 0xf7, 0x30, 0xf7,
+                                                   0x1f, 0xf7, 0x80, 0xf7, 0x7f, 0xfb, 0x2c, 0xf7,
+                                                   0x26, 0xfb, 0x5b, 0xfb, 0x4c, 0xfb, 0x39, 0xfb,
+                                                   0xe, 0xfb, 0x97, 0x1e, 0xef, 0x16, 0xf7, 0x18,
+                                                   0xcf, 0xf7, 0x3a, 0xf7, 0x49, 0xf7, 0x10, 0xf7,
+                                                   0x13, 0x32, 0xfb, 0x65, 0xfb, 0x5c, 0xfb, 0xa,
+                                                   0x2f, 0xfb, 0x19, 0xfb, 0x28, 0x26, 0xf7, 0xd,
+                                                   0xf7, 0x3f, 0x1e, 0xe, 0xf7, 0xc9, 0x78, 0xd7,
+                                                   0x4c, 0xe0, 0xf7, 0x8d, 0xe0, 0xf7, 0x79, 0xe0,
+                                                   0x49, 0xd7, 0x12, 0xcd, 0xed, 0xf8, 0x2, 0xe3,
+                                                   0x13, 0x76, 0xf8, 0xa6, 0x85, 0x15, 0xf8, 0x47,
+                                                   0xe0, 0xfb, 0xef, 0xf7, 0x8d, 0xf7, 0xc7, 0xe0,
+                                                   0xfb, 0xc7, 0xf7, 0x79, 0xf7, 0xe0, 0xe0, 0xfc,
+                                                   0x39, 0x2a, 0x89, 0x6, 0x13, 0x8e, 0xe2, 0x59,
+                                                   0x39, 0x9f, 0x43, 0x1b, 0xfb, 0x66, 0x3e, 0xfb,
+                                                   0x48, 0xfb, 0x57, 0xfb, 0x3b, 0xca, 0xfb, 0x6a,
+                                                   0xf7, 0x74, 0xb5, 0xf1, 0x92, 0xf7, 0x1, 0xc8,
+                                                   0x1f, 0x8d, 0x6, 0xfc, 0x20, 0xf7, 0x9d, 0x15,
+                                                   0xf7, 0xf, 0xac, 0xf7, 0x44, 0xf7, 0x30, 0xf7,
+                                                   0x2f, 0xb9, 0xfb, 0x5d, 0x29, 0xfb, 0xe, 0x58,
+                                                   0xfb, 0x4b, 0xfb, 0x2a, 0x25, 0x34, 0xf2, 0xf7,
+                                                   0x5e, 0x1e, 0xe, 0x4f, 0xa, 0xbd, 0xf7, 0x1d,
+                                                   0x45, 0xa, 0xf7, 0xe2, 0xf9, 0xac, 0x2f, 0xa,
+                                                   0xfb, 0xf2, 0x26, 0xa, 0x4f, 0xa, 0xf7, 0x4f,
+                                                   0x77, 0x45, 0xa, 0xf7, 0x7f, 0xf9, 0xac, 0x2c,
+                                                   0xa, 0xfb, 0xb8, 0x26, 0xa, 0x4f, 0xa, 0x45,
+                                                   0xa, 0xbc, 0xf7, 0xf9, 0x21, 0xa, 0xf4, 0xf8,
+                                                   0x50, 0x2e, 0xa, 0xe, 0x4f, 0xa, 0xb9, 0xf7,
+                                                   0x21, 0x45, 0xa, 0xf8, 0x12, 0xf9, 0xa8, 0x15,
+                                                   0xd5, 0x6, 0x49, 0xf7, 0x21, 0x5, 0xfb, 0xa,
+                                                   0x6, 0xfb, 0x73, 0x26, 0xa, 0xe2, 0x87, 0xda,
+                                                   0x42, 0x76, 0xf9, 0x28, 0xda, 0x9c, 0x77, 0x12,
+                                                   0xb8, 0xed, 0xf8, 0x7c, 0xed, 0x13, 0x6c, 0xb2,
+                                                   0xa0, 0x15, 0xbc, 0x63, 0xdc, 0xe5, 0x5, 0x13,
+                                                   0x9c, 0x6c, 0xb6, 0xc4, 0x5f, 0xf7, 0xb, 0x1b,
+                                                   0xf7, 0x48, 0xf7, 0x35, 0xf7, 0x10, 0xf7, 0x80,
+                                                   0xf7, 0x17, 0x60, 0xcd, 0x6a, 0xbb, 0x1f, 0xe2,
+                                                   0xeb, 0x5a, 0xb3, 0x39, 0x30, 0x5, 0x13, 0xac,
+                                                   0xab, 0x60, 0x4e, 0xb5, 0xfb, 0x9, 0x1b, 0xfb,
+                                                   0x65, 0xfb, 0x1a, 0xfb, 0x25, 0xfb, 0x6d, 0xfb,
+                                                   0xf, 0xb2, 0x52, 0xb4, 0x4d, 0x1f, 0xc8, 0xce,
+                                                   0x15, 0x76, 0xb3, 0x75, 0xb3, 0xea, 0x1a, 0xf7,
+                                                   0x75, 0xf7, 0x21, 0xc5, 0xf3, 0xdd, 0xb3, 0x6f,
+                                                   0x6c, 0xb3, 0x1e, 0xfb, 0xd7, 0xfc, 0x53, 0x15,
+                                                   0xf8, 0x0, 0xf8, 0x21, 0x5, 0xa4, 0x5d, 0x9a,
+                                                   0x52, 0x42, 0x1a, 0xfb, 0x48, 0x24, 0x26, 0xfb,
+                                                   0x20, 0x34, 0x5c, 0xb2, 0xa0, 0x70, 0x1e, 0xe,
+                                                   0x4f, 0xa, 0x45, 0xa, 0xf7, 0x76, 0xf9, 0xb8,
+                                                   0x15, 0xcc, 0x6, 0xbb, 0xab, 0x8a, 0x90, 0x9e,
+                                                   0xa2, 0x82, 0x80, 0xa3, 0x1e, 0x7f, 0xa7, 0xa3,
+                                                   0x7d, 0x96, 0x1b, 0xa0, 0xd6, 0x86, 0xf7, 0x9,
+                                                   0x56, 0xa, 0x87, 0x78, 0x94, 0x96, 0x73, 0x1f,
+                                                   0x72, 0x96, 0x6d, 0x96, 0x70, 0x8a, 0x8, 0x5a,
+                                                   0x59, 0x67, 0x3f, 0x1f, 0xfb, 0x45, 0xfc, 0x53,
+                                                   0x21, 0xa, 0xe, 0x5f, 0xa, 0xf7, 0xb6, 0xe0,
+                                                   0xf7, 0x96, 0xe0, 0x6e, 0xa, 0xf7, 0xda, 0xed,
+                                                   0x3, 0xe1, 0x16, 0xea, 0xf7, 0xb6, 0xf7, 0x44,
+                                                   0x6, 0xf7, 0x18, 0xf7, 0x19, 0xbb, 0xf7, 0x3c,
+                                                   0xf7, 0x39, 0xfb, 0x15, 0xba, 0xfb, 0x1c, 0x1f,
+                                                   0xfb, 0xa3, 0x6, 0xea, 0xfb, 0xeb, 0x15, 0xf7,
+                                                   0x96, 0xf7, 0x44, 0x7, 0xeb, 0xd2, 0x71, 0x26,
+                                                   0xfb, 0x12, 0xfb, 0x7, 0x86, 0x57, 0x1f, 0xe,
+                                                   0xe2, 0x68, 0x76, 0xb7, 0xdd, 0xf8, 0xdd, 0xdd,
+                                                   0x1, 0xc3, 0xed, 0xf8, 0x6f, 0xed, 0x3, 0xf8,
+                                                   0xc2, 0xab, 0x15, 0x6c, 0x53, 0x50, 0x7e, 0x4e,
+                                                   0x1b, 0xfb, 0x5c, 0xfb, 0x23, 0xf7, 0x2e, 0xf7,
+                                                   0x70, 0xf7, 0x68, 0xf7, 0x13, 0xf7, 0x37, 0xf7,
+                                                   0x6c, 0xf7, 0x5a, 0xf7, 0x27, 0xfb, 0x27, 0xfb,
+                                                   0x78, 0x37, 0x77, 0xfb, 0x7, 0x33, 0x36, 0x1f,
+                                                   0xb0, 0x70, 0xb3, 0x74, 0xb6, 0x7a, 0x70, 0x48,
+                                                   0x18, 0x58, 0x9e, 0x58, 0xa8, 0x57, 0xb3, 0x8,
+                                                   0xfb, 0x29, 0xf7, 0x3c, 0x15, 0xd7, 0x76, 0xae,
+                                                   0x71, 0xa3, 0x74, 0x8, 0xd3, 0xcb, 0x98, 0xef,
+                                                   0xcf, 0x1a, 0xf7, 0x60, 0xfb, 0xe, 0xe4, 0xfb,
+                                                   0x11, 0x26, 0xfb, 0x24, 0x50, 0xfb, 0x7e, 0xfb,
+                                                   0x6b, 0xf7, 0x13, 0x3e, 0xf7, 0xa, 0xbe, 0xaf,
+                                                   0x99, 0x90, 0x96, 0x1e, 0x6c, 0x9e, 0x6f, 0x99,
+                                                   0x68, 0x93, 0x8, 0xe, 0xaa, 0xa0, 0x76, 0xf7,
+                                                   0xd0, 0xe0, 0xf7, 0x82, 0xda, 0x1, 0xe3, 0xea,
+                                                   0xf7, 0xec, 0xed, 0x3, 0xe3, 0x16, 0xea, 0xf7,
+                                                   0xd0, 0xcb, 0x6, 0xda, 0xb6, 0x84, 0xfb, 0x35,
+                                                   0xf1, 0x1f, 0xe9, 0xfb, 0x28, 0x5, 0xf7, 0xb,
+                                                   0x6, 0xfb, 0xd, 0xf7, 0x43, 0x53, 0xe2, 0x5c,
+                                                   0xb9, 0x67, 0x9c, 0x19, 0x8d, 0x7, 0xf7, 0xe,
+                                                   0x9b, 0xda, 0xcb, 0xf7, 0x7, 0x1a, 0xf7, 0x2c,
+                                                   0xfb, 0x25, 0xb7, 0xfb, 0x15, 0x1e, 0xfb, 0x9b,
+                                                   0x6, 0xea, 0xfb, 0xd1, 0x15, 0xf7, 0x82, 0xf7,
+                                                   0x3c, 0x7, 0xd5, 0xf1, 0x72, 0x2f, 0x24, 0x2a,
+                                                   0x79, 0x3c, 0x1f, 0xe, 0x73, 0x78, 0xe2, 0xf8,
+                                                   0xda, 0xe2, 0x1, 0xd7, 0xe6, 0xf7, 0xf5, 0xe6,
+                                                   0x3, 0xbc, 0xf7, 0x79, 0x15, 0xfb, 0x27, 0x9b,
+                                                   0xd2, 0x26, 0xf7, 0x6b, 0x1b, 0xf7, 0x37, 0xf5,
+                                                   0xe6, 0xf7, 0xd, 0xf7, 0x35, 0xfb, 0x2a, 0xb5,
+                                                   0xfb, 0x17, 0xa8, 0x1f, 0xfb, 0x18, 0xa9, 0x63,
+                                                   0x9c, 0xcb, 0x1a, 0xe6, 0xee, 0xa2, 0xc9, 0xf7,
+                                                   0x29, 0xa4, 0x35, 0x56, 0x90, 0x1e, 0xe7, 0x92,
+                                                   0x5, 0xf7, 0x24, 0x86, 0xfb, 0x3, 0xd6, 0xfb,
+                                                   0x2f, 0x1b, 0xfb, 0x33, 0x2e, 0x33, 0xfb, 0x5,
+                                                   0xfb, 0x26, 0xf7, 0x22, 0x69, 0xe8, 0x74, 0x1f,
+                                                   0xf7, 0x26, 0x68, 0xd3, 0x78, 0x35, 0x1a, 0x3a,
+                                                   0x3c, 0x5f, 0x28, 0x41, 0xfb, 0xe, 0xab, 0xf7,
+                                                   0x1d, 0x7b, 0x1e, 0xe, 0x73, 0x78, 0xe0, 0xf8,
+                                                   0xcc, 0xe0, 0x1, 0xd9, 0xe5, 0xf7, 0xef, 0xe6,
+                                                   0x3, 0xbc, 0xf7, 0x74, 0x15, 0xfb, 0x10, 0xa1,
+                                                   0xcd, 0xfb, 0xb, 0xf7, 0x6a, 0x1b, 0xf7, 0x37,
+                                                   0xf5, 0xe4, 0xf7, 0xb, 0xf7, 0x31, 0xfb, 0x2a,
+                                                   0xb4, 0xfb, 0x17, 0xa8, 0x1f, 0xfb, 0x17, 0xa8,
+                                                   0x63, 0x9c, 0xc9, 0x1a, 0xe4, 0xee, 0xa3, 0xc9,
+                                                   0xf7, 0x28, 0xa4, 0x36, 0x57, 0x90, 0x1e, 0xe6,
+                                                   0x92, 0x5, 0xf7, 0x21, 0x86, 0xfb, 0x2, 0xd5,
+                                                   0xfb, 0x2e, 0x1b, 0xfb, 0x33, 0x2f, 0x34, 0xfb,
+                                                   0x3, 0xfb, 0x23, 0xf7, 0x21, 0x6a, 0xe8, 0x75,
+                                                   0x1f, 0xf7, 0x25, 0x68, 0xd3, 0x79, 0x37, 0x1a,
+                                                   0x3b, 0x3c, 0x60, 0x28, 0x42, 0xfb, 0x6, 0xad,
+                                                   0xf7, 0x18, 0x72, 0x1e, 0xf7, 0x2a, 0xf8, 0xc4,
+                                                   0x37, 0xa, 0x3b, 0xa0, 0x76, 0xf9, 0xd, 0xe0,
+                                                   0x1, 0xf7, 0x95, 0xea, 0x3, 0xf7, 0x95, 0x16,
+                                                   0xea, 0xf9, 0xd, 0xf7, 0x89, 0xe0, 0xfc, 0xdb,
+                                                   0x36, 0xf7, 0x87, 0x6, 0xe, 0x5f, 0xa, 0xf7,
+                                                   0x25, 0xe0, 0xf7, 0x94, 0xe0, 0xf7, 0x27, 0x77,
+                                                   0x6e, 0xa, 0xf7, 0xeb, 0xed, 0x3, 0xe1, 0x16,
+                                                   0xea, 0xf7, 0x25, 0xf7, 0x39, 0x6, 0xf7, 0x18,
+                                                   0xf7, 0x24, 0xb9, 0xf7, 0x3d, 0xf7, 0x35, 0xfb,
+                                                   0x1b, 0xbd, 0xfb, 0x21, 0x1f, 0xfb, 0x39, 0xf7,
+                                                   0x27, 0x2c, 0x6, 0xea, 0xfc, 0x7c, 0x15, 0xf7,
+                                                   0x94, 0xf7, 0x39, 0x7, 0xe5, 0xe3, 0x79, 0xfb,
+                                                   0x0, 0xfb, 0x13, 0xfb, 0x15, 0x88, 0x5a, 0x1f,
+                                                   0xe, 0xaa, 0x78, 0xe0, 0xf9, 0x20, 0x77, 0x41,
+                                                   0xa, 0xf9, 0x62, 0x15, 0xfc, 0x3a, 0x7, 0xfb,
+                                                   0x13, 0x91, 0xfb, 0x50, 0xf7, 0xa3, 0xf7, 0xac,
+                                                   0x93, 0xf7, 0x70, 0xea, 0x1e, 0xf8, 0x3a, 0x2c,
+                                                   0xfc, 0x3a, 0x7, 0xfb, 0x15, 0x7a, 0x26, 0xfb,
+                                                   0x44, 0xfb, 0x48, 0x89, 0xf7, 0x23, 0xe2, 0x1e,
+                                                   0xf8, 0x3a, 0x7, 0xe, 0x2b, 0xa, 0xf7, 0x18,
+                                                   0xda, 0x2f, 0xa, 0xe, 0x2b, 0xa, 0xac, 0xda,
+                                                   0x2c, 0xa, 0xe, 0xaa, 0x78, 0xe0, 0xf9, 0x6e,
+                                                   0xef, 0x2a, 0xa, 0xbf, 0xe3, 0x2e, 0xa, 0xe,
+                                                   0x2b, 0xa, 0xf7, 0x3f, 0xda, 0x5e, 0xa, 0x73,
+                                                   0x39, 0xa, 0xf7, 0xb5, 0x16, 0xe8, 0x6, 0xf7,
+                                                   0x9d, 0xf9, 0x62, 0x5, 0x30, 0x6, 0xfb, 0x71,
+                                                   0xfd, 0x13, 0xfb, 0x6e, 0xf9, 0x13, 0x5, 0x2a,
+                                                   0x6, 0xe, 0xf7, 0x91, 0x39, 0xa, 0xf7, 0x62,
+                                                   0x16, 0xea, 0x6, 0xf7, 0x3c, 0xf9, 0xc, 0x5,
+                                                   0x8c, 0x6, 0xf7, 0x40, 0xfd, 0xc, 0x5, 0xe5,
+                                                   0x6, 0xf7, 0x58, 0xf9, 0x62, 0x5, 0x2d, 0x6,
+                                                   0xfb, 0x27, 0xfc, 0xfe, 0xfb, 0x32, 0xf8, 0xfe,
+                                                   0x5, 0xfb, 0x2, 0x6, 0xfb, 0x3a, 0xfc, 0xfe,
+                                                   0x5, 0x89, 0x6, 0xfb, 0x1f, 0xf8, 0xfe, 0x5,
+                                                   0x2b, 0x6, 0xe, 0x73, 0x39, 0xa, 0x9e, 0x16,
+                                                   0xf7, 0x1, 0x6, 0xf7, 0x61, 0xf7, 0xc4, 0x5,
+                                                   0x8c, 0x6, 0xf7, 0x5e, 0xfb, 0xc4, 0x5, 0xf7,
+                                                   0x4, 0x6, 0xfb, 0x98, 0xf8, 0x10, 0xf7, 0x85,
+                                                   0xf7, 0xe6, 0x5, 0x32, 0x6, 0xfb, 0x5f, 0xfb,
+                                                   0xa5, 0xfb, 0x47, 0xf7, 0xa5, 0x5, 0xfb, 0x0,
+                                                   0x6, 0xf7, 0x7f, 0xfb, 0xec, 0x5, 0xe, 0x73,
+                                                   0x39, 0xa, 0xf7, 0xaf, 0xe8, 0x3, 0xf7, 0xaf,
+                                                   0x16, 0xe8, 0xf7, 0xc3, 0x6, 0xf7, 0xa9, 0xf8,
+                                                   0x33, 0x5, 0x20, 0x6, 0xfb, 0x67, 0xfb, 0xe7,
+                                                   0xfb, 0x65, 0xf7, 0xe7, 0x5, 0xfb, 0x4, 0x6,
+                                                   0xf7, 0xa1, 0xfc, 0x33, 0x5, 0xe, 0x5f, 0xa,
+                                                   0xf9, 0xac, 0xf7, 0x1d, 0x1, 0xf7, 0xad, 0xea,
+                                                   0x3, 0x57, 0xa, 0xfb, 0x65, 0xfb, 0xe2, 0xfb,
+                                                   0x60, 0xf7, 0xe2, 0x5, 0xfb, 0x8, 0x6, 0xf7,
+                                                   0x9f, 0xfc, 0x2e, 0x5, 0x88, 0xf8, 0x7d, 0x2f,
+                                                   0xa, 0xe, 0x5f, 0xa, 0xf9, 0xb5, 0xef, 0x12,
+                                                   0xf7, 0x5a, 0xe5, 0x84, 0xea, 0x8e, 0xe5, 0x13,
+                                                   0xd8, 0x57, 0xa, 0xfb, 0x6a, 0xfb, 0xe2, 0xfb,
+                                                   0x5c, 0xf7, 0xe2, 0x38, 0xa, 0xf7, 0x9f, 0xfc,
+                                                   0x2e, 0x5, 0x13, 0xe8, 0x38, 0xf8, 0x86, 0x2e,
+                                                   0xa, 0xe, 0x3b, 0x8b, 0xe0, 0xf8, 0xb8, 0xe0,
+                                                   0x6a, 0xa, 0xf8, 0x4f, 0xf8, 0xb8, 0x5, 0xe0,
+                                                   0xfc, 0x93, 0x36, 0xf8, 0x22, 0x7, 0xfc, 0x4b,
+                                                   0xfc, 0xb4, 0x5, 0xe, 0x3b, 0x8b, 0xe0, 0xf8,
+                                                   0xb3, 0xe0, 0xf7, 0x6c, 0x77, 0x6a, 0xa, 0xf8,
+                                                   0x51, 0xf8, 0xb3, 0x5, 0xe0, 0xfc, 0x95, 0x36,
+                                                   0xf8, 0x24, 0x7, 0xfc, 0x4d, 0xfc, 0xaf, 0x5,
+                                                   0xf7, 0x82, 0xf9, 0x53, 0x37, 0xa, 0x7c, 0xd0,
+                                                   0xf8, 0x30, 0xd3, 0x1, 0xaf, 0xe9, 0xf7, 0xa0,
+                                                   0xe3, 0x3, 0xbe, 0xf8, 0xd, 0x15, 0xe1, 0x80,
+                                                   0x5, 0xb6, 0x96, 0x9b, 0xc4, 0xf7, 0x2, 0x1b,
+                                                   0xf7, 0x15, 0x88, 0x3a, 0x53, 0x89, 0x1f, 0x59,
+                                                   0x79, 0x2e, 0x81, 0x7e, 0x89, 0x8, 0x52, 0x84,
+                                                   0xfb, 0x29, 0x7a, 0xfb, 0x1e, 0x1a, 0x35, 0xcc,
+                                                   0x49, 0xf7, 0x6, 0xc3, 0xc6, 0x98, 0xca, 0xd5,
+                                                   0x1e, 0x8d, 0x7e, 0x9d, 0x73, 0x99, 0x70, 0x8,
+                                                   0xe7, 0x6, 0x6f, 0xbd, 0x7b, 0x92, 0xf7, 0x19,
+                                                   0x1a, 0xf7, 0x28, 0x7, 0xe5, 0x80, 0xf7, 0x5,
+                                                   0xfb, 0x5d, 0xfb, 0x5c, 0x7e, 0xfb, 0x7, 0x5d,
+                                                   0x81, 0x1e, 0xf7, 0xef, 0xfb, 0x9, 0x15, 0x40,
+                                                   0x87, 0x5f, 0x68, 0x65, 0x1e, 0x5f, 0x62, 0x3d,
+                                                   0x86, 0x72, 0x1b, 0x3c, 0x85, 0xbb, 0xb0, 0xd1,
+                                                   0xc5, 0x95, 0xc1, 0x93, 0x1f, 0xb9, 0x92, 0xd7,
+                                                   0x98, 0xad, 0x98, 0x8, 0xe, 0x40, 0xa, 0xce,
+                                                   0xf7, 0x1d, 0x49, 0xa, 0x3f, 0xa, 0xfb, 0x1f,
+                                                   0xfc, 0xb, 0x20, 0xa, 0x40, 0xa, 0xf7, 0x60,
+                                                   0x77, 0x49, 0xa, 0x3a, 0xa, 0x3a, 0xfc, 0xb,
+                                                   0x20, 0xa, 0x54, 0xa, 0xf7, 0xe, 0xf8, 0xe5,
+                                                   0x4c, 0xa, 0xf7, 0x11, 0xf7, 0x21, 0x59, 0xa,
+                                                   0x40, 0xa, 0xd7, 0xef, 0x49, 0xa, 0x3e, 0xa,
+                                                   0xfb, 0x43, 0xfb, 0xef, 0x20, 0xa, 0xf7, 0x5a,
+                                                   0x7c, 0xd4, 0xf7, 0x47, 0xd3, 0xf7, 0x31, 0xd3,
+                                                   0x1, 0xaf, 0xe9, 0xf7, 0x94, 0xe4, 0x3, 0xbc,
+                                                   0xf8, 0x4, 0x15, 0xe1, 0x81, 0x5, 0xba, 0x95,
+                                                   0xb0, 0xc8, 0xe6, 0x1b, 0xf6, 0x95, 0x50, 0x3b,
+                                                   0x87, 0x1f, 0x64, 0x7f, 0x58, 0x88, 0x50, 0x83,
+                                                   0x8, 0x25, 0x7d, 0x28, 0x3f, 0x3e, 0x1a, 0x63,
+                                                   0xa4, 0xfb, 0x4, 0xf7, 0x2d, 0xed, 0xcc, 0xbd,
+                                                   0xbd, 0xbd, 0x1e, 0x3d, 0xc7, 0xcc, 0x75, 0xce,
+                                                   0x1b, 0xf7, 0x1e, 0xcb, 0xe2, 0xe2, 0xa4, 0x1f,
+                                                   0x30, 0x97, 0x5, 0x65, 0x82, 0x69, 0x40, 0x2e,
+                                                   0x1b, 0x2b, 0x50, 0xdd, 0xec, 0x96, 0x1f, 0xf8,
+                                                   0x8, 0x6, 0xf7, 0x38, 0x51, 0xf7, 0x1d, 0xfb,
+                                                   0x3e, 0x25, 0x5f, 0x5a, 0x76, 0x77, 0x1e, 0xa1,
+                                                   0x7e, 0x6d, 0xbb, 0xfb, 0x1d, 0x1b, 0xfb, 0x4e,
+                                                   0x71, 0xfb, 0xc, 0x59, 0x7f, 0x1f, 0xf7, 0xe7,
+                                                   0xfb, 0x0, 0x15, 0xfb, 0x12, 0xa2, 0x3e, 0x3c,
+                                                   0xfb, 0xc, 0x1b, 0x33, 0x8f, 0xc8, 0xa3, 0xb6,
+                                                   0xd2, 0xb0, 0xaf, 0x91, 0x1f, 0xbf, 0x93, 0xc8,
+                                                   0x94, 0xb1, 0x9c, 0x8, 0xe2, 0xbc, 0x15, 0xd5,
+                                                   0x90, 0xb4, 0xde, 0xed, 0x1b, 0xf7, 0x14, 0x93,
+                                                   0xfb, 0x11, 0x6b, 0x8e, 0x1f, 0xe, 0x40, 0xa,
+                                                   0xcf, 0xf7, 0x1c, 0x12, 0xba, 0xe9, 0xf7, 0x8d,
+                                                   0xe3, 0x13, 0xbc, 0xf7, 0x9a, 0xf8, 0xea, 0x4c,
+                                                   0xa, 0x4a, 0xf7, 0x1c, 0x38, 0xa, 0x86, 0xfc,
+                                                   0xb, 0x24, 0xa, 0x13, 0x7c, 0x25, 0xa, 0x13,
+                                                   0xbc, 0x28, 0xa, 0x73, 0x7c, 0xda, 0xf8, 0xda,
+                                                   0xd3, 0x12, 0xb7, 0xe8, 0x87, 0xe5, 0xf7, 0x38,
+                                                   0xe5, 0x13, 0xe8, 0xf7, 0x69, 0xf8, 0x2b, 0x15,
+                                                   0xfb, 0x12, 0x4e, 0x60, 0x42, 0x3b, 0x1a, 0x2f,
+                                                   0xd4, 0xfb, 0x8, 0xf7, 0x2d, 0xde, 0xcd, 0xab,
+                                                   0xca, 0xc3, 0x1e, 0x99, 0x7c, 0xb7, 0x5f, 0xc0,
+                                                   0x68, 0xc6, 0xce, 0x18, 0x64, 0xa7, 0x62, 0xaf,
+                                                   0x6a, 0xb5, 0xa8, 0xb7, 0x9e, 0xbb, 0x9b, 0xca,
+                                                   0x30, 0x9e, 0x18, 0x88, 0x7f, 0x81, 0x5e, 0x76,
+                                                   0x60, 0xfb, 0x15, 0xf7, 0x38, 0x18, 0xea, 0xbd,
+                                                   0xb3, 0xbe, 0xcd, 0x1a, 0xdd, 0x44, 0xd3, 0x27,
+                                                   0x1e, 0x13, 0xd8, 0x22, 0x47, 0x45, 0x37, 0x5f,
+                                                   0x9d, 0x62, 0xc9, 0x43, 0x1f, 0xb9, 0x52, 0x15,
+                                                   0xf7, 0x35, 0xfb, 0x5c, 0x5, 0x5c, 0x6c, 0x4f,
+                                                   0x64, 0x51, 0x1b, 0x13, 0xe8, 0x2d, 0x63, 0xe1,
+                                                   0xba, 0xcf, 0xc7, 0xba, 0xc9, 0xb1, 0x1f, 0xb1,
+                                                   0xf2, 0x15, 0x13, 0xd8, 0x47, 0xdb, 0x85, 0x97,
+                                                   0x9e, 0x1a, 0xbe, 0xb7, 0xaa, 0xb2, 0xb2, 0xb5,
+                                                   0x70, 0x54, 0x4d, 0x5d, 0x74, 0x5f, 0x71, 0x1e,
+                                                   0xe, 0x40, 0xa, 0xbb, 0xaf, 0xf5, 0xaf, 0x12,
+                                                   0xba, 0xe9, 0xbd, 0xaf, 0xf3, 0xaf, 0xa2, 0xe3,
+                                                   0x13, 0x7f, 0x80, 0xf7, 0x53, 0xf9, 0x2f, 0x64,
+                                                   0xa, 0xb3, 0x5a, 0x5a, 0x65, 0x63, 0x5a, 0x1e,
+                                                   0xaf, 0x8c, 0x15, 0xa6, 0xa0, 0xa4, 0xaa, 0xaa,
+                                                   0xa0, 0x72, 0x6f, 0x6e, 0x74, 0x73, 0x6e, 0x70,
+                                                   0x72, 0xa1, 0xab, 0x1e, 0x3d, 0xfb, 0xc9, 0x22,
+                                                   0xa, 0x13, 0xbf, 0x80, 0x28, 0xa, 0xfb, 0x72,
+                                                   0xf7, 0xb1, 0x76, 0xf8, 0x3c, 0x77, 0x1, 0x7d,
+                                                   0xf7, 0x9c, 0x15, 0xe5, 0x6, 0xf7, 0x32, 0xf7,
+                                                   0xd9, 0xf7, 0x34, 0xfb, 0xd9, 0x5, 0xe4, 0x6,
+                                                   0xfb, 0x69, 0xf8, 0x3c, 0x5, 0x44, 0x6, 0xe,
+                                                   0x20, 0xf7, 0x49, 0xe1, 0x49, 0x76, 0xc6, 0xe1,
+                                                   0x8c, 0x77, 0x12, 0x13, 0x60, 0xc8, 0xf7, 0x48,
+                                                   0x15, 0xa6, 0xa8, 0xae, 0xab, 0xc1, 0x1b, 0xbc,
+                                                   0xaf, 0x7a, 0x7b, 0xb0, 0x1f, 0x13, 0x90, 0x7e,
+                                                   0xa9, 0xa9, 0x7f, 0xb1, 0x1b, 0xc9, 0xae, 0xa5,
+                                                   0xa3, 0xa6, 0x1f, 0xea, 0x7, 0x82, 0x83, 0x59,
+                                                   0x59, 0x51, 0x1b, 0x6e, 0x69, 0x96, 0x97, 0x69,
+                                                   0x1f, 0x13, 0x60, 0x9b, 0x5e, 0x5e, 0x9e, 0x69,
+                                                   0x1b, 0x64, 0x59, 0x7f, 0x63, 0x67, 0x1f, 0xe,
+                                                   0xfb, 0xc2, 0xf8, 0x58, 0x76, 0xf7, 0xb3, 0x77,
+                                                   0x1, 0xf7, 0x16, 0xf8, 0x43, 0x15, 0x9f, 0xa5,
+                                                   0x99, 0xa0, 0xa7, 0xbf, 0xa3, 0x63, 0x98, 0x74,
+                                                   0xa6, 0x67, 0xc4, 0xb3, 0x18, 0x86, 0x8f, 0x54,
+                                                   0xcb, 0x75, 0x9e, 0xaf, 0x8f, 0xbf, 0x97, 0xa9,
+                                                   0x94, 0x75, 0xcd, 0x18, 0x72, 0x83, 0x59, 0x79,
+                                                   0x67, 0x79, 0x8, 0x93, 0xbf, 0x8d, 0xb3, 0xa0,
+                                                   0x1a, 0x48, 0x6, 0x6c, 0x8d, 0x79, 0x93, 0x4a,
+                                                   0x1e, 0x83, 0x84, 0x3d, 0xb7, 0x75, 0x93, 0x75,
+                                                   0x49, 0x18, 0xb3, 0x81, 0xaf, 0x83, 0xb1, 0x84,
+                                                   0x3d, 0x34, 0x18, 0xe, 0xf7, 0xd8, 0x5c, 0xc8,
+                                                   0x4e, 0xf7, 0x4e, 0x82, 0xcc, 0xf7, 0xdb, 0xca,
+                                                   0xf7, 0x1, 0xc7, 0x12, 0xf7, 0x1c, 0xc6, 0xe8,
+                                                   0xd6, 0xf8, 0x5e, 0xc6, 0x13, 0xbf, 0xf8, 0xc3,
+                                                   0xf7, 0x5c, 0x15, 0x71, 0x8e, 0x90, 0x5f, 0xd1,
+                                                   0x1b, 0xf7, 0xc, 0xf7, 0xf, 0xf7, 0x1c, 0xf7,
+                                                   0x38, 0xf7, 0x33, 0xfb, 0xb, 0xf7, 0x39, 0xfb,
+                                                   0x7a, 0xfb, 0xc5, 0x31, 0xfb, 0x99, 0xfb, 0x3a,
+                                                   0xfb, 0x5a, 0xf7, 0x7, 0xfb, 0x44, 0xf7, 0xb8,
+                                                   0x1f, 0x13, 0x5f, 0xf7, 0x97, 0xe3, 0xf7, 0x39,
+                                                   0xa0, 0x95, 0x1f, 0x42, 0x6, 0x13, 0xbf, 0x62,
+                                                   0x6d, 0x3e, 0x37, 0xfb, 0x45, 0x1b, 0xfb, 0x3d,
+                                                   0xfb, 0x47, 0xd0, 0xf7, 0x88, 0xf7, 0x54, 0xf7,
+                                                   0x15, 0xf7, 0x43, 0xf7, 0x63, 0xf7, 0x35, 0xf7,
+                                                   0x15, 0x20, 0xfb, 0x31, 0xfb, 0x24, 0xfb, 0x4,
+                                                   0x34, 0x5f, 0x7f, 0x7a, 0x94, 0x9e, 0x1f, 0xd1,
+                                                   0xf7, 0xed, 0x5, 0x43, 0x6, 0x7d, 0x4a, 0x5,
+                                                   0xd3, 0x60, 0x53, 0x91, 0x74, 0x1b, 0xfb, 0x4,
+                                                   0x29, 0xfb, 0x28, 0xfb, 0x10, 0x22, 0xcb, 0x3e,
+                                                   0xde, 0xc7, 0xb6, 0xb8, 0xa3, 0xa0, 0x1f, 0xfb,
+                                                   0x58, 0xf7, 0x5, 0x15, 0xd4, 0xb3, 0xf7, 0x1c,
+                                                   0xea, 0xbc, 0xba, 0x64, 0x3b, 0xfb, 0x6, 0x32,
+                                                   0x2d, 0x45, 0x63, 0x6b, 0xad, 0xdf, 0x1e, 0xe,
+                                                   0x40, 0xa, 0xda, 0xf7, 0x5, 0x49, 0xa, 0xf7,
+                                                   0x48, 0xf8, 0xf5, 0x15, 0xbb, 0xab, 0x8a, 0x90,
+                                                   0xa7, 0xa0, 0x80, 0x80, 0x9e, 0x1e, 0x7f, 0x9f,
+                                                   0x9d, 0x7f, 0xa2, 0x1b, 0xa0, 0xd6, 0x92, 0xf4,
+                                                   0x56, 0xa, 0x8f, 0x79, 0x94, 0x96, 0x70, 0x1f,
+                                                   0x96, 0x6f, 0x66, 0x96, 0x74, 0x1b, 0x5a, 0x59,
+                                                   0x66, 0x3f, 0x1f, 0xad, 0xfb, 0x8e, 0x20, 0xa,
+                                                   0x7c, 0xd3, 0xf8, 0x25, 0xd3, 0xf7, 0x50, 0x77,
+                                                   0x12, 0xc5, 0xdc, 0x3a, 0xe3, 0xf7, 0xa5, 0xe5,
+                                                   0x13, 0xec, 0xc5, 0x16, 0xdd, 0xcc, 0x8d, 0x6,
+                                                   0x41, 0xbb, 0xd5, 0x85, 0xa1, 0x1b, 0xde, 0xf7,
+                                                   0x28, 0xc3, 0xf7, 0x6f, 0xf7, 0x29, 0x30, 0xf7,
+                                                   0xd, 0xfb, 0x20, 0x35, 0x63, 0x57, 0x79, 0x7f,
+                                                   0x1f, 0x89, 0xf7, 0x96, 0x33, 0x6, 0x13, 0xf4,
+                                                   0xdc, 0xfc, 0x5e, 0x15, 0xf4, 0xc3, 0xe8, 0xe6,
+                                                   0xe6, 0xbd, 0x37, 0xfb, 0x6, 0xfb, 0x22, 0x44,
+                                                   0x4e, 0x45, 0x5a, 0x5e, 0xaa, 0xb3, 0x70, 0x1e,
+                                                   0x7f, 0x9d, 0x7d, 0xa5, 0xe3, 0x1a, 0xe, 0xfc,
+                                                   0x31, 0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0xf7,
+                                                   0x74, 0x78, 0x15, 0xd2, 0x6, 0xfb, 0x85, 0xf9,
+                                                   0x88, 0x5, 0x44, 0x6, 0xe, 0xfc, 0x43, 0xfb,
+                                                   0x50, 0x76, 0xfa, 0x46, 0x77, 0x1, 0xe9, 0xd4,
+                                                   0x3, 0xe9, 0xfb, 0x65, 0x15, 0xd4, 0xfa, 0x46,
+                                                   0x42, 0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x58, 0xd5,
+                                                   0xf7, 0xee, 0xda, 0xf7, 0xed, 0xd5, 0x1, 0xf7,
+                                                   0x18, 0xd3, 0x3, 0xb5, 0xf7, 0x74, 0x15, 0xe4,
+                                                   0x89, 0x8b, 0x33, 0x8c, 0x2d, 0x8, 0xfb, 0x4c,
+                                                   0x8a, 0x9e, 0x57, 0xf7, 0x22, 0x1b, 0xd5, 0x7,
+                                                   0x33, 0x8d, 0x93, 0xf7, 0x2e, 0xf7, 0x6, 0x7a,
+                                                   0xd5, 0x40, 0xae, 0x1f, 0xe5, 0xbb, 0x8d, 0x8b,
+                                                   0xf7, 0x44, 0x1a, 0xe2, 0x89, 0xd5, 0xe3, 0x1e,
+                                                   0xd5, 0x7, 0xfb, 0x22, 0x79, 0x31, 0xfb, 0x25,
+                                                   0x1f, 0x8a, 0x2c, 0x8b, 0x34, 0x32, 0x89, 0x8,
+                                                   0xe, 0xfb, 0xf9, 0xfb, 0x58, 0xd5, 0xf7, 0xed,
+                                                   0xda, 0xf7, 0xee, 0xd5, 0x1, 0xf7, 0x15, 0xd3,
+                                                   0x3, 0xb5, 0xfb, 0xe, 0x15, 0x41, 0x7, 0xde,
+                                                   0xd7, 0x99, 0xf7, 0x33, 0x1f, 0x8c, 0xeb, 0x8d,
+                                                   0xf7, 0x28, 0xe3, 0x8d, 0x8, 0xda, 0x7, 0x33,
+                                                   0x8d, 0x88, 0xdb, 0xea, 0x1a, 0xf7, 0x29, 0x86,
+                                                   0xe9, 0xfb, 0x2e, 0x1e, 0x41, 0x7, 0xe2, 0x8b,
+                                                   0x73, 0xfb, 0x25, 0xfb, 0x7, 0x9a, 0x49, 0xd6,
+                                                   0x68, 0x1f, 0x31, 0x5b, 0x8b, 0x4d, 0xfb, 0x44,
+                                                   0x1a, 0x34, 0x79, 0x7f, 0x46, 0x1e, 0xe, 0x69,
+                                                   0xa, 0xca, 0xe3, 0x33, 0xf7, 0x4f, 0x13, 0xe0,
+                                                   0xf7, 0x2b, 0xfb, 0xf, 0x15, 0xf9, 0x98, 0x7,
+                                                   0x13, 0xd0, 0xee, 0xd4, 0xfb, 0x4f, 0xfe, 0x2a,
+                                                   0xf7, 0x4f, 0xd4, 0x6, 0xe, 0x69, 0xa, 0xa7,
+                                                   0xf7, 0x4f, 0x33, 0xe3, 0x13, 0xe0, 0xa7, 0xfb,
+                                                   0xf, 0x15, 0x42, 0xf7, 0x4f, 0xfa, 0x2a, 0xfb,
+                                                   0x4f, 0x42, 0x7, 0x13, 0xd0, 0xee, 0xfd, 0x98,
+                                                   0x6, 0xe, 0xfb, 0xfa, 0xf8, 0xe7, 0xcc, 0xd2,
+                                                   0x77, 0x1, 0x98, 0xf9, 0x6f, 0x15, 0x2c, 0xe3,
+                                                   0x62, 0xcd, 0xce, 0xe2, 0xb6, 0xe8, 0x1e, 0x4b,
+                                                   0x6, 0x6a, 0x84, 0x7e, 0x65, 0x45, 0x1b, 0x43,
+                                                   0x7d, 0xbf, 0x9e, 0x87, 0x1f, 0xe, 0xfc, 0x43,
+                                                   0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0xe9, 0xd4,
+                                                   0x3, 0xe9, 0xf8, 0x3f, 0x15, 0xd4, 0xf7, 0xca,
+                                                   0x42, 0x6, 0xfd, 0x88, 0x4, 0xd4, 0xf7, 0xc9,
+                                                   0x42, 0x6, 0xe, 0xfb, 0xe9, 0xf7, 0x5e, 0xf7,
+                                                   0xcf, 0x1, 0x9d, 0xf7, 0xcf, 0x3, 0x9d, 0xf7,
+                                                   0xfb, 0x15, 0x33, 0xd2, 0x46, 0xe1, 0xe1, 0xd3,
+                                                   0xd0, 0xe3, 0xe4, 0x43, 0xd0, 0x35, 0x35, 0x44,
+                                                   0x46, 0x32, 0x1e, 0xe, 0xfb, 0x53, 0x7c, 0xd3,
+                                                   0xf8, 0x29, 0xd7, 0x1, 0xbb, 0xe5, 0xf7, 0x9b,
+                                                   0xe0, 0x3, 0xf8, 0x24, 0xf7, 0x52, 0x15, 0x71,
+                                                   0x88, 0x7a, 0x20, 0xfb, 0x4, 0x1b, 0xfb, 0xf,
+                                                   0x7c, 0xf7, 0x18, 0xd0, 0xc8, 0x93, 0xf7, 0x23,
+                                                   0xf7, 0x1d, 0xc1, 0xc1, 0x6f, 0x40, 0x9d, 0x1f,
+                                                   0xe0, 0x98, 0x5, 0xf4, 0xfb, 0x8, 0xc8, 0x2c,
+                                                   0x24, 0xfb, 0x18, 0x4b, 0xfb, 0x6c, 0xfb, 0x1e,
+                                                   0xc4, 0xfb, 0x1b, 0xf7, 0x3f, 0xb7, 0xf7, 0x27,
+                                                   0x9e, 0xf7, 0x43, 0xa7, 0x1e, 0xe, 0x54, 0xa,
+                                                   0xf7, 0xc, 0xf8, 0xe5, 0x15, 0xeb, 0x6, 0xeb,
+                                                   0xf7, 0x21, 0x5, 0x31, 0x6, 0x57, 0x34, 0x50,
+                                                   0xe2, 0x5, 0x31, 0x6, 0xe, 0xfb, 0x53, 0xfb,
+                                                   0x60, 0x76, 0xf7, 0x5b, 0xd6, 0xf8, 0x32, 0xd6,
+                                                   0x1, 0xa9, 0xe4, 0x3, 0xf7, 0x67, 0x76, 0x15,
+                                                   0x7b, 0x3d, 0x5, 0x9b, 0xc0, 0x86, 0x69, 0x8d,
+                                                   0x1f, 0x78, 0x8c, 0x48, 0x84, 0x60, 0x1b, 0x89,
+                                                   0x4e, 0x5, 0xf7, 0x13, 0xcb, 0xb2, 0xbb, 0xc2,
+                                                   0x5d, 0xa0, 0x6a, 0x1f, 0x91, 0xaf, 0xda, 0x91,
+                                                   0xf1, 0xb6, 0xa2, 0xf7, 0x2a, 0x19, 0x36, 0x96,
+                                                   0x5, 0x71, 0x87, 0x7a, 0xfb, 0x1, 0xfb, 0x2,
+                                                   0x1b, 0xfb, 0x23, 0x8c, 0xf7, 0x3d, 0xad, 0xd9,
+                                                   0x9c, 0xf7, 0x19, 0xf7, 0x13, 0xc2, 0xba, 0x6d,
+                                                   0x3c, 0x9c, 0x1f, 0xe0, 0x9a, 0x5, 0xf7, 0x7,
+                                                   0x7c, 0x3a, 0xc1, 0xfb, 0x0, 0x1b, 0xfb, 0x43,
+                                                   0x51, 0xfb, 0x21, 0xfb, 0x25, 0xfb, 0x2c, 0xd0,
+                                                   0x27, 0xf7, 0x4, 0x76, 0x1f, 0xe, 0xfb, 0xfa,
+                                                   0xfb, 0x60, 0x76, 0xf7, 0x75, 0x77, 0x1, 0xeb,
+                                                   0xf2, 0x3, 0xf7, 0x1a, 0x16, 0x6a, 0x2c, 0x5,
+                                                   0xa5, 0xbe, 0x85, 0x6b, 0x58, 0x2c, 0x9a, 0x6a,
+                                                   0x91, 0x1f, 0x86, 0x52, 0x5, 0x87, 0xa1, 0x92,
+                                                   0x8a, 0xa1, 0x1b, 0xf7, 0x5, 0xbd, 0xb8, 0xba,
+                                                   0xb6, 0x64, 0xa3, 0x5f, 0x90, 0x1f, 0xa2, 0xc8,
+                                                   0x5, 0xe, 0x2d, 0x76, 0xf1, 0xd2, 0xf8, 0x25,
+                                                   0xd3, 0xe7, 0x77, 0x1, 0xbe, 0xe5, 0x3, 0xf7,
+                                                   0x4a, 0x95, 0x15, 0x69, 0xfb, 0x1, 0xc2, 0x7b,
+                                                   0xae, 0xf7, 0x0, 0x5, 0x88, 0x98, 0x98, 0x88,
+                                                   0xa2, 0x1b, 0xcd, 0xf7, 0x18, 0xad, 0xf7, 0x33,
+                                                   0xa7, 0x1f, 0x37, 0x95, 0x5, 0x2f, 0x7e, 0x45,
+                                                   0x63, 0x50, 0x1b, 0x7d, 0x84, 0x8d, 0x8d, 0x82,
+                                                   0x1f, 0xf7, 0x1, 0xf8, 0xa, 0xad, 0x6f, 0x93,
+                                                   0x68, 0x8f, 0x77, 0x19, 0xe1, 0x98, 0x84, 0xac,
+                                                   0x7d, 0xd4, 0x32, 0xb2, 0x19, 0xa5, 0xeb, 0x56,
+                                                   0x9b, 0x6f, 0x2b, 0x5, 0x8f, 0x6c, 0x7f, 0x8b,
+                                                   0x85, 0x1b, 0x52, 0xfb, 0x44, 0x6f, 0xfb, 0x8b,
+                                                   0xfb, 0x12, 0xc3, 0x37, 0xd6, 0x67, 0x1f, 0xa2,
+                                                   0xd7, 0x15, 0x56, 0xac, 0x80, 0xea, 0xb5, 0x1a,
+                                                   0xd5, 0xa1, 0xf7, 0x22, 0xf7, 0x2b, 0x7e, 0x1e,
+                                                   0xe, 0x54, 0xa, 0xa0, 0xf8, 0xe5, 0x15, 0xe9,
+                                                   0x6, 0xc1, 0xe2, 0xbc, 0x34, 0x5, 0xe9, 0x6,
+                                                   0x24, 0xf7, 0x21, 0x5, 0x34, 0x6, 0xe, 0xfc,
+                                                   0x31, 0x8b, 0xee, 0xf7, 0xd2, 0xee, 0x1, 0xe2,
+                                                   0xf3, 0x3, 0xe2, 0x16, 0xf3, 0xee, 0x23, 0x6,
+                                                   0xf7, 0xd2, 0x4, 0xf3, 0xee, 0x23, 0x6, 0xe,
+                                                   0xfc, 0x31, 0xfb, 0x12, 0x76, 0xf7, 0x91, 0x77,
+                                                   0x1, 0xe3, 0xf1, 0x3, 0xe3, 0x8d, 0x15, 0xbe,
+                                                   0x6, 0x61, 0x85, 0x5a, 0x5d, 0x76, 0x1e, 0xa2,
+                                                   0x66, 0x5, 0xce, 0xa1, 0x98, 0xe8, 0xad, 0x1a,
+                                                   0xf3, 0x25, 0x7, 0xe, 0xb9, 0x78, 0xca, 0xed,
+                                                   0xc7, 0xf7, 0xce, 0xc3, 0xf1, 0xca, 0x1, 0x7d,
+                                                   0xcb, 0xf7, 0xa, 0xd1, 0xf8, 0x57, 0xca, 0x3,
+                                                   0xf8, 0x80, 0xf7, 0xbe, 0x15, 0x35, 0x75, 0x3e,
+                                                   0x81, 0x70, 0x1b, 0x46, 0x50, 0xbb, 0xf5, 0xd7,
+                                                   0xa9, 0xdf, 0xed, 0x9c, 0xd4, 0x8a, 0x40, 0xa9,
+                                                   0x1f, 0xc8, 0x99, 0x5, 0xdd, 0x72, 0x3e, 0xaf,
+                                                   0x3c, 0x1b, 0xfb, 0x14, 0x45, 0x37, 0xfb, 0x18,
+                                                   0xfb, 0x1c, 0xdc, 0x3d, 0xf7, 0x9, 0xdb, 0xe0,
+                                                   0xb6, 0xea, 0xa2, 0x1f, 0xfc, 0xcc, 0xd7, 0x15,
+                                                   0xfb, 0x65, 0xf7, 0x3c, 0xfb, 0x3a, 0xf7, 0x68,
+                                                   0xf7, 0x68, 0xf7, 0x42, 0xf7, 0x3b, 0xf7, 0x64,
+                                                   0xf7, 0x67, 0xfb, 0x44, 0xf7, 0x3e, 0xfb, 0x66,
+                                                   0xfb, 0x66, 0xfb, 0x3e, 0xfb, 0x3d, 0xfb, 0x68,
+                                                   0x1e, 0xcb, 0x16, 0xf7, 0x44, 0xf7, 0x1f, 0xf7,
+                                                   0x22, 0xf7, 0x45, 0xf7, 0x45, 0xf7, 0x26, 0xfb,
+                                                   0x22, 0xfb, 0x44, 0xfb, 0x42, 0xfb, 0x26, 0xfb,
+                                                   0x1e, 0xfb, 0x45, 0xfb, 0x45, 0xfb, 0x1f, 0xf7,
+                                                   0x1e, 0xf7, 0x42, 0x1e, 0xe, 0xf7, 0xc, 0x76,
+                                                   0xae, 0xdf, 0xf7, 0x9e, 0xdf, 0xae, 0x77, 0x1,
+                                                   0xe1, 0xee, 0x15, 0xd2, 0xd2, 0x5, 0x71, 0xb2,
+                                                   0xb6, 0x81, 0xb2, 0x1b, 0xb1, 0xb7, 0x95, 0xa5,
+                                                   0xb2, 0x1f, 0xd2, 0x44, 0xc5, 0xc8, 0x44, 0xd0,
+                                                   0x5, 0xaa, 0xbd, 0x91, 0xb9, 0xa5, 0x1a, 0xa6,
+                                                   0x85, 0xb8, 0x6c, 0xbc, 0x1e, 0xd2, 0xd1, 0x51,
+                                                   0xc8, 0x44, 0x44, 0x5, 0xa5, 0x64, 0x5f, 0x95,
+                                                   0x65, 0x1b, 0x64, 0x60, 0x81, 0x71, 0x64, 0x1f,
+                                                   0x44, 0xd2, 0x51, 0x4e, 0xd2, 0x45, 0x5, 0x6c,
+                                                   0x5a, 0x85, 0x5e, 0x70, 0x1a, 0x71, 0x91, 0x5d,
+                                                   0xaa, 0x59, 0x1e, 0x44, 0x46, 0x5, 0xf7, 0xa,
+                                                   0xf7, 0x53, 0x15, 0xd4, 0xc5, 0xc7, 0xd5, 0xce,
+                                                   0xcc, 0x52, 0x3f, 0x41, 0x50, 0x50, 0x42, 0x41,
+                                                   0x51, 0xc6, 0xd5, 0x1e, 0xe, 0x7c, 0xd3, 0xf8,
+                                                   0x23, 0xd5, 0xf7, 0x50, 0x77, 0x1, 0xae, 0xe5,
+                                                   0xf7, 0xa7, 0xe3, 0x3, 0xf8, 0x35, 0x16, 0xdd,
+                                                   0xf9, 0x62, 0x33, 0xfb, 0x97, 0x89, 0x6, 0xb4,
+                                                   0x70, 0x4d, 0xa9, 0x4a, 0x1b, 0xfb, 0x16, 0x31,
+                                                   0xfb, 0x2, 0xfb, 0x3d, 0xfb, 0x3a, 0xec, 0x27,
+                                                   0xf7, 0xf, 0x9e, 0xe9, 0x8e, 0xd9, 0xbc, 0x1f,
+                                                   0xfb, 0xb8, 0xf7, 0x4d, 0x15, 0xb1, 0x89, 0xf7,
+                                                   0x3b, 0xf7, 0x18, 0xf6, 0xc4, 0x23, 0x26, 0xfb,
+                                                   0x46, 0xfb, 0x1c, 0x7b, 0x6f, 0x58, 0x3c, 0xaa,
+                                                   0xf7, 0x37, 0x1e, 0xe, 0xfb, 0x1e, 0x76, 0xf8,
+                                                   0xe0, 0xd9, 0xf7, 0x67, 0x77, 0x1, 0xf7, 0x7e,
+                                                   0xe3, 0x3, 0xf7, 0x7e, 0xfb, 0x33, 0x15, 0xe3,
+                                                   0xf8, 0xe0, 0x78, 0xa, 0xf7, 0x67, 0x33, 0xfb,
+                                                   0x67, 0xfb, 0x53, 0x3d, 0xf7, 0x53, 0x6, 0xe,
+                                                   0xfb, 0x1e, 0x76, 0xf7, 0x4c, 0xd9, 0xf7, 0xf5,
+                                                   0xd9, 0xf7, 0x4c, 0x77, 0x1, 0xf7, 0x7e, 0xe3,
+                                                   0x3, 0xb6, 0xa4, 0x15, 0xf7, 0x53, 0xfb, 0x4c,
+                                                   0xe3, 0xf7, 0x4c, 0x78, 0xa, 0xf7, 0xf5, 0x78,
+                                                   0xa, 0xf7, 0x4c, 0x33, 0xfb, 0x4c, 0xfb, 0x53,
+                                                   0x3d, 0xf7, 0x53, 0xfb, 0xf5, 0xfb, 0x53, 0x6,
+                                                   0xe, 0xfb, 0xb7, 0xf8, 0x2f, 0xc4, 0xf7, 0x46,
+                                                   0xc4, 0x1, 0xc1, 0xc5, 0xf7, 0x44, 0xc5, 0x3,
+                                                   0xc1, 0xf8, 0xc2, 0x15, 0x39, 0xcc, 0x4a, 0xdb,
+                                                   0xdc, 0xcd, 0xcc, 0xdd, 0xda, 0x4a, 0xcd, 0x39,
+                                                   0x3a, 0x4b, 0x4a, 0x3b, 0x1e, 0xc5, 0x16, 0xbb,
+                                                   0xb1, 0xb3, 0xbc, 0xbd, 0xb2, 0x63, 0x5b, 0x59,
+                                                   0x63, 0x63, 0x5a, 0x5b, 0x64, 0xb3, 0xbd, 0x1e,
+                                                   0xe, 0xfb, 0xfa, 0xf8, 0xf0, 0xf1, 0x1, 0xb3,
+                                                   0xe5, 0xd4, 0xe5, 0x3, 0xb3, 0xf8, 0xf0, 0x15,
+                                                   0xe5, 0xf1, 0x31, 0x6, 0xf7, 0x37, 0x25, 0x15,
+                                                   0xe5, 0xf1, 0x31, 0x6, 0xe, 0x20, 0x78, 0xed,
+                                                   0xf7, 0x1e, 0xdd, 0xf7, 0x14, 0xec, 0x1, 0xf7,
+                                                   0x86, 0xef, 0x3, 0xb2, 0xf7, 0x6c, 0x15, 0xf8,
+                                                   0x8e, 0xdd, 0xfc, 0x8e, 0x6, 0xf7, 0x5f, 0xf7,
+                                                   0x15, 0x15, 0xef, 0xec, 0x27, 0x6, 0xfc, 0xb3,
+                                                   0x4, 0xef, 0xed, 0x27, 0x6, 0xe, 0x2d, 0x76,
+                                                   0xfa, 0xe, 0x77, 0x1, 0xbb, 0xe6, 0xf7, 0x5,
+                                                   0xc0, 0xf7, 0xf, 0xe7, 0x3, 0xab, 0xf7, 0x52,
+                                                   0x15, 0x98, 0xfb, 0x52, 0xf7, 0x2b, 0x7a, 0xc3,
+                                                   0x83, 0x8, 0x31, 0xc0, 0xe6, 0x7, 0xf7, 0x22,
+                                                   0x90, 0xd4, 0xee, 0xf5, 0x1a, 0xf7, 0x39, 0xfb,
+                                                   0x23, 0xb0, 0x43, 0x9b, 0x1e, 0xf7, 0x93, 0x7,
+                                                   0xa7, 0x85, 0xc6, 0x7e, 0x9b, 0x2a, 0xe9, 0x98,
+                                                   0x18, 0x78, 0xf7, 0x8, 0x3d, 0xc1, 0x27, 0x93,
+                                                   0x8, 0xb4, 0x56, 0x62, 0x7, 0x22, 0x86, 0x2d,
+                                                   0x4f, 0x86, 0xfb, 0x17, 0x88, 0x42, 0xda, 0xfb,
+                                                   0x13, 0xf7, 0x14, 0x83, 0x8, 0xfb, 0xad, 0x7,
+                                                   0x20, 0x96, 0x71, 0xf7, 0x9, 0x88, 0xa8, 0x8,
+                                                   0xf7, 0x1c, 0xf7, 0x65, 0x15, 0x26, 0xa8, 0x7f,
+                                                   0xc1, 0xb5, 0x1a, 0xbf, 0xac, 0xc2, 0xdb, 0x98,
+                                                   0x1e, 0xc0, 0xfc, 0xf7, 0x15, 0xf7, 0xa1, 0x7,
+                                                   0xcd, 0x76, 0xc4, 0x73, 0x36, 0x1a, 0x2d, 0x40,
+                                                   0x63, 0x5b, 0x86, 0x1e, 0xe, 0xfb, 0xfa, 0xf8,
+                                                   0xf0, 0xf1, 0x1, 0xf7, 0xd, 0xe6, 0x3, 0xf7,
+                                                   0xd, 0xf8, 0xf0, 0x15, 0xe6, 0xf1, 0x30, 0x6,
+                                                   0xe, 0xfc, 0x31, 0x68, 0xa, 0xea, 0xe3, 0x3,
+                                                   0xea, 0x16, 0xe3, 0xf8, 0x9f, 0x7a, 0xa, 0x7c,
+                                                   0xd3, 0xf7, 0x48, 0xd3, 0xf7, 0x2e, 0xd6, 0x1,
+                                                   0xc3, 0xe5, 0xf7, 0x91, 0xe5, 0x3, 0xf7, 0x16,
+                                                   0xf7, 0x81, 0x15, 0xf8, 0x16, 0x6, 0xf7, 0x9c,
+                                                   0xfb, 0x34, 0xb0, 0x41, 0xfb, 0x32, 0x37, 0xfb,
+                                                   0x11, 0xfb, 0x32, 0xfb, 0x34, 0xdc, 0xfb, 0x2,
+                                                   0xf7, 0x35, 0xf7, 0x14, 0xd8, 0xd4, 0xed, 0xa5,
+                                                   0x1e, 0x31, 0x96, 0x5, 0x6d, 0x80, 0x6c, 0x3b,
+                                                   0x28, 0x1b, 0x3d, 0x48, 0xc3, 0xf7, 0x10, 0x84,
+                                                   0x1f, 0x90, 0xd3, 0x15, 0xcf, 0x90, 0xb7, 0xe1,
+                                                   0xed, 0x1b, 0xe7, 0xbf, 0x3d, 0x3f, 0x1f, 0xe,
+                                                   0x4a, 0xa, 0xce, 0xf7, 0x1d, 0x1, 0xf8, 0x34,
+                                                   0xe5, 0x3, 0x3f, 0xa, 0xfb, 0x28, 0xfc, 0x85,
+                                                   0x29, 0xa, 0xe, 0x4a, 0xa, 0xf7, 0x60, 0x77,
+                                                   0x1, 0xf8, 0x34, 0xe5, 0x3, 0x3a, 0xa, 0x31,
+                                                   0xfc, 0x85, 0x29, 0xa, 0xe, 0x4a, 0xa, 0xd7,
+                                                   0xef, 0x1, 0xf7, 0xae, 0x8b, 0xf7, 0x1a, 0xe5,
+                                                   0x3, 0x3e, 0xa, 0xfb, 0x4c, 0xfc, 0x69, 0x15,
+                                                   0xf8, 0x2, 0x6, 0xf7, 0x1c, 0x65, 0xd8, 0x56,
+                                                   0xb0, 0x1e, 0xb0, 0x56, 0x52, 0x91, 0x74, 0x1b,
+                                                   0xfb, 0x38, 0x4c, 0xfb, 0xa, 0xfb, 0x31, 0x86,
+                                                   0x1f, 0x2d, 0xa, 0x7b, 0x7c, 0x3a, 0x23, 0x1b,
+                                                   0x37, 0x5e, 0xc2, 0xf7, 0x11, 0x7e, 0x1f, 0x90,
+                                                   0xd3, 0x15, 0xcf, 0x96, 0xa2, 0xdc, 0xf2, 0x1b,
+                                                   0xec, 0xab, 0x42, 0x3f, 0x90, 0x1f, 0xe, 0x4a,
+                                                   0xa, 0xcf, 0xf7, 0x1c, 0x1, 0xf8, 0x34, 0xe5,
+                                                   0x3, 0xf7, 0x20, 0xf7, 0x81, 0x29, 0xa, 0xfb,
+                                                   0x2e, 0xf7, 0xb5, 0x4c, 0xa, 0x4a, 0xf7, 0x1c,
+                                                   0x59, 0xa, 0x78, 0xd2, 0xf7, 0xb2, 0xaf, 0x67,
+                                                   0xd1, 0xf7, 0x74, 0xd2, 0x12, 0xc1, 0xe7, 0xf7,
+                                                   0x9d, 0xe7, 0x13, 0xdc, 0xf7, 0x45, 0xf8, 0xa,
+                                                   0x15, 0x31, 0x5a, 0xfb, 0x10, 0x56, 0xfb, 0xc,
+                                                   0xe6, 0x2b, 0xf7, 0x28, 0xf7, 0x27, 0xe8, 0xeb,
+                                                   0xf7, 0x9, 0xed, 0x52, 0xc5, 0x3b, 0xa3, 0x1f,
+                                                   0x8d, 0x7, 0xab, 0x96, 0xd6, 0xb0, 0xec, 0x1a,
+                                                   0xe9, 0x3f, 0xe3, 0xfb, 0x1c, 0xfb, 0x18, 0x40,
+                                                   0x39, 0x29, 0x21, 0xd9, 0x6c, 0xaa, 0x81, 0x1e,
+                                                   0x7a, 0xf7, 0x2a, 0x15, 0xc2, 0xb6, 0xbe, 0xd4,
+                                                   0xcf, 0xbe, 0x5c, 0x4b, 0x1e, 0x13, 0xbc, 0x4c,
+                                                   0x58, 0x59, 0x48, 0x51, 0x50, 0xb3, 0xd9, 0x1e,
+                                                   0x6d, 0xfb, 0xde, 0x15, 0xd3, 0xbe, 0xd1, 0xe9,
+                                                   0xdb, 0xd1, 0x53, 0x33, 0x33, 0x48, 0x55, 0x3a,
+                                                   0x31, 0x52, 0xcc, 0xda, 0x1e, 0xe, 0xf7, 0xc9,
+                                                   0x8b, 0xf5, 0x1, 0xf7, 0x7, 0xef, 0xf7, 0x7d,
+                                                   0xef, 0xf7, 0x81, 0xef, 0x3, 0xf7, 0x7, 0x16,
+                                                   0xef, 0xf5, 0x27, 0x6, 0xf7, 0xe1, 0x21, 0x15,
+                                                   0xef, 0xf5, 0x27, 0x6, 0xf7, 0xe5, 0x21, 0x15,
+                                                   0xef, 0xf5, 0x27, 0x6, 0xe, 0xf7, 0xc9, 0xf7,
+                                                   0x84, 0xd4, 0x1, 0xf7, 0x84, 0x4, 0xfa, 0x7c,
+                                                   0xd4, 0xfe, 0x7c, 0x6, 0xe, 0xf7, 0x84, 0xd4,
+                                                   0x1, 0xf7, 0x84, 0x4, 0xf8, 0xc0, 0xd4, 0xfc,
+                                                   0xc0, 0x6, 0xe, 0x20, 0xf7, 0x7, 0xdb, 0xf7,
+                                                   0x7, 0xdb, 0x1, 0xb2, 0xf7, 0xca, 0x15, 0xf8,
+                                                   0x8e, 0xdb, 0xfc, 0x8e, 0x6, 0xfb, 0xa7, 0x4,
+                                                   0xf8, 0x8e, 0xdb, 0xfc, 0x8e, 0x6, 0xe, 0x7c,
+                                                   0xd5, 0xf8, 0x1d, 0xda, 0xf7, 0x62, 0x77, 0x1,
+                                                   0xae, 0xe6, 0xf7, 0xc5, 0xe6, 0x3, 0xf7, 0x41,
+                                                   0xf8, 0xc0, 0x15, 0xf7, 0xc, 0xc4, 0xb0, 0x61,
+                                                   0x97, 0x76, 0xa1, 0x5f, 0x19, 0x98, 0x6f, 0x6b,
+                                                   0x97, 0x59, 0x1b, 0x30, 0xfb, 0x14, 0x50, 0xfb,
+                                                   0x6c, 0xfb, 0x71, 0xf7, 0x15, 0x59, 0xea, 0xf7,
+                                                   0x27, 0xf7, 0x8, 0xf4, 0xf7, 0x3a, 0xf7, 0x27,
+                                                   0x4e, 0xf7, 0x12, 0x29, 0xf7, 0x8, 0x1f, 0xe4,
+                                                   0xb6, 0x72, 0xbc, 0x21, 0x58, 0x75, 0xa0, 0x83,
+                                                   0x90, 0x6b, 0xa4, 0x19, 0xfb, 0x0, 0x6, 0xb6,
+                                                   0x6d, 0x9d, 0x7f, 0xb5, 0x62, 0x20, 0x5a, 0x18,
+                                                   0x76, 0xfb, 0xf1, 0x15, 0xf7, 0x21, 0xd3, 0xc2,
+                                                   0xc9, 0xea, 0xd7, 0x64, 0xfb, 0x31, 0xfb, 0x30,
+                                                   0x22, 0x62, 0x48, 0x6b, 0x26, 0x99, 0xf7, 0x4b,
+                                                   0x1e, 0xe, 0xfc, 0x31, 0x8b, 0xef, 0xf7, 0x88,
+                                                   0xef, 0xf7, 0xa6, 0x77, 0xb7, 0x77, 0x1, 0xe5,
+                                                   0xec, 0x35, 0xd7, 0x3, 0xe5, 0x16, 0xec, 0xef,
+                                                   0x2a, 0x6, 0xa2, 0xdb, 0x15, 0xc1, 0x6, 0x9f,
+                                                   0xf8, 0xf, 0x5, 0xf7, 0x33, 0x2a, 0xfb, 0x33,
+                                                   0x7, 0xe, 0xfb, 0xfa, 0xfb, 0x42, 0x76, 0xf8,
+                                                   0xfe, 0xef, 0x1, 0xf7, 0xa, 0xec, 0x33, 0xd8,
+                                                   0x3, 0xf7, 0xa, 0xf8, 0x3b, 0x15, 0xec, 0xef,
+                                                   0x2a, 0x6, 0xfc, 0xc6, 0x4, 0xfb, 0x30, 0xec,
+                                                   0xf7, 0x30, 0x7, 0x75, 0xf8, 0xf, 0x5, 0x53,
+                                                   0x6, 0xe, 0x4b, 0xa, 0xf8, 0x56, 0xcf, 0xf7,
+                                                   0x66, 0x77, 0x1, 0xd7, 0xe3, 0x3, 0xd7, 0x16,
+                                                   0xe3, 0xf8, 0x56, 0xed, 0xcf, 0x29, 0xbc, 0x6,
+                                                   0xc2, 0xa7, 0xb4, 0xc3, 0x76, 0x1e, 0x98, 0xd8,
+                                                   0x5, 0x8b, 0x72, 0x94, 0x7a, 0xfb, 0x23, 0x8b,
+                                                   0xfb, 0x3, 0x59, 0x1e, 0x5a, 0x4d, 0x47, 0xc9,
+                                                   0x7, 0xe, 0x5b, 0xa, 0xf7, 0x3d, 0x3b, 0xa,
+                                                   0xf7, 0x95, 0xfc, 0x56, 0x15, 0xe3, 0xf8, 0x9a,
+                                                   0x33, 0x6, 0xed, 0x4, 0x6d, 0xa, 0x78, 0xd2,
+                                                   0xf7, 0xe0, 0xd8, 0xf7, 0x3f, 0xdf, 0x12, 0xf8,
+                                                   0x2a, 0xeb, 0x17, 0xab, 0xf7, 0x46, 0x15, 0xfb,
+                                                   0x2e, 0x99, 0xf7, 0x16, 0x60, 0xe5, 0x1b, 0xf7,
+                                                   0x36, 0xe1, 0xf7, 0x9, 0xf7, 0x13, 0xf7, 0x2f,
+                                                   0xfb, 0x25, 0xdc, 0x23, 0x59, 0x61, 0x78, 0x72,
+                                                   0x74, 0x1f, 0xb3, 0xf7, 0x4f, 0x5, 0xf7, 0xb6,
+                                                   0xdf, 0xfb, 0xfd, 0x6, 0x43, 0xfb, 0xfe, 0xe0,
+                                                   0x81, 0x5, 0xb1, 0xa3, 0xba, 0xa9, 0xc8, 0x1b,
+                                                   0xdf, 0xd1, 0x56, 0x21, 0x30, 0x54, 0x39, 0x2a,
+                                                   0x1f, 0x6f, 0x2f, 0x92, 0xf7, 0x12, 0x77, 0x1f,
+                                                   0xe, 0x5b, 0xa, 0xf7, 0x3b, 0x3b, 0xa, 0xf7,
+                                                   0x93, 0xfc, 0x56, 0x15, 0xe3, 0xf9, 0x58, 0x7a,
+                                                   0xa, 0xfb, 0x4e, 0x76, 0xf9, 0x22, 0xcf, 0xf7,
+                                                   0x20, 0xdd, 0x1, 0x90, 0xfb, 0xb, 0x15, 0x7b,
+                                                   0x3f, 0x5, 0x7f, 0xca, 0xa0, 0x8b, 0x92, 0x1b,
+                                                   0xda, 0xbe, 0xb3, 0xe2, 0x9a, 0x1f, 0xe9, 0xf8,
+                                                   0xa3, 0x5, 0xef, 0x6, 0x97, 0xcf, 0x5, 0x27,
+                                                   0x6, 0x98, 0xc8, 0x5, 0xbf, 0x95, 0x94, 0xa6,
+                                                   0xba, 0x1b, 0xa0, 0x9c, 0x87, 0x83, 0xaf, 0x1f,
+                                                   0x9c, 0xd6, 0x5, 0x95, 0x68, 0x7a, 0x94, 0x64,
+                                                   0x1b, 0xfb, 0x4, 0x6c, 0x27, 0x4e, 0x7e, 0x1f,
+                                                   0x7f, 0x4e, 0x5, 0x28, 0x6, 0x80, 0x47, 0x5,
+                                                   0xed, 0x6, 0x33, 0xfc, 0x8a, 0x5, 0x5f, 0x84,
+                                                   0x73, 0x6c, 0x6c, 0x1b, 0x7b, 0x76, 0x8e, 0x93,
+                                                   0x65, 0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x3d, 0xda,
+                                                   0xf8, 0x5b, 0x77, 0x1, 0xf7, 0xb3, 0xe3, 0x3,
+                                                   0xa4, 0xf7, 0x3d, 0x15, 0xf7, 0xcd, 0xfb, 0x3d,
+                                                   0xe3, 0xf7, 0x3d, 0xec, 0xda, 0x2a, 0xf8, 0x5b,
+                                                   0x43, 0x6, 0xfb, 0xdd, 0xfc, 0x5b, 0x5, 0xe2,
+                                                   0x16, 0xf7, 0x73, 0xf7, 0xd3, 0x5, 0x8e, 0xfb,
+                                                   0xd3, 0x6, 0xe, 0xfc, 0xa0, 0x8d, 0x76, 0xf9,
+                                                   0x66, 0x77, 0x1, 0x32, 0x78, 0x15, 0xf8, 0x3a,
+                                                   0xf9, 0x66, 0x5, 0x3f, 0x6, 0xfc, 0x3b, 0xfd,
+                                                   0x66, 0x5, 0xe, 0xfb, 0x70, 0xd4, 0xf7, 0x1c,
+                                                   0xd3, 0xf8, 0x29, 0xd3, 0x12, 0xcb, 0xe5, 0xf7,
+                                                   0x94, 0xe4, 0x39, 0xdd, 0x13, 0xf8, 0xc9, 0x55,
+                                                   0x15, 0xfb, 0x28, 0x87, 0xf7, 0x23, 0x79, 0xcc,
+                                                   0x1b, 0xf7, 0x47, 0xc1, 0xf7, 0x2, 0xf7, 0x3d,
+                                                   0x1f, 0xf8, 0x66, 0x3a, 0x4d, 0x89, 0x7, 0xd2,
+                                                   0x54, 0x49, 0x8f, 0x6e, 0x1b, 0xfb, 0x36, 0x4b,
+                                                   0xfb, 0x34, 0xfb, 0x12, 0xfb, 0x20, 0xdc, 0xfb,
+                                                   0xf, 0xf7, 0x25, 0x1f, 0x13, 0xb8, 0xb4, 0xc1,
+                                                   0x95, 0xc5, 0xbc, 0x1f, 0x24, 0x8e, 0x26, 0xfb,
+                                                   0x27, 0x24, 0x7f, 0xc0, 0xa6, 0x87, 0x1e, 0x7a,
+                                                   0xf7, 0xd3, 0x15, 0xf7, 0x11, 0xc5, 0xe4, 0xd9,
+                                                   0x1e, 0x13, 0xf4, 0xc8, 0xe5, 0x49, 0xfb, 0x28,
+                                                   0x2c, 0x67, 0x2b, 0xfb, 0x7, 0x26, 0x68, 0xf7,
+                                                   0x15, 0xc9, 0x1f, 0xe, 0x3b, 0x7c, 0xd3, 0xf8,
+                                                   0xeb, 0xd3, 0x12, 0xce, 0xe3, 0xf7, 0x22, 0xe5,
+                                                   0x80, 0xe0, 0x9f, 0xe5, 0x13, 0xec, 0xce, 0x16,
+                                                   0xe3, 0xf8, 0x7e, 0x6, 0xce, 0x93, 0xee, 0xf7,
+                                                   0x7, 0xc3, 0xb5, 0x6a, 0x5f, 0x1e, 0x13, 0xf4,
+                                                   0x57, 0x3c, 0x30, 0x4e, 0x44, 0xf7, 0x4c, 0x38,
+                                                   0x3c, 0x1a, 0x5d, 0x62, 0x64, 0x5a, 0x6e, 0x69,
+                                                   0x97, 0xd0, 0x66, 0x1e, 0x3f, 0x67, 0x5, 0x67,
+                                                   0x9c, 0xbf, 0x3a, 0xf7, 0x1, 0x1b, 0xf7, 0x0,
+                                                   0xd1, 0xd2, 0xe1, 0x1f, 0xf7, 0x14, 0xfb, 0x4c,
+                                                   0xc0, 0xbf, 0x1a, 0x13, 0xec, 0xc2, 0xd5, 0xe9,
+                                                   0xc2, 0x1a, 0xd2, 0x4b, 0xd9, 0xfb, 0x9, 0xfb,
+                                                   0x21, 0x43, 0x35, 0xfb, 0x2c, 0x1e, 0xe, 0xfb,
+                                                   0xfa, 0xf8, 0xf8, 0x76, 0xf7, 0x25, 0x77, 0x1,
+                                                   0xf7, 0x29, 0xf8, 0xe5, 0x15, 0xc9, 0x6, 0x2f,
+                                                   0xf7, 0x21, 0x5, 0x22, 0x6, 0xe, 0x71, 0xa,
+                                                   0x96, 0x15, 0xf8, 0x7c, 0xf7, 0x5c, 0x5, 0xdd,
+                                                   0x7, 0xfc, 0x7c, 0xf7, 0x5e, 0x5, 0x34, 0x7,
+                                                   0xf8, 0x1a, 0xfb, 0x30, 0xfc, 0x1a, 0xfb, 0x2e,
+                                                   0x5, 0xe, 0x3c, 0x52, 0xa, 0xf7, 0x93, 0xf7,
+                                                   0x16, 0x15, 0xd9, 0x6, 0xfb, 0xc, 0xf7, 0x5e,
+                                                   0xf7, 0xc, 0xf7, 0x5f, 0x5, 0x3d, 0x6, 0xfb,
+                                                   0x27, 0xfb, 0x5f, 0x5, 0xf7, 0xd1, 0xfb, 0x5e,
+                                                   0x15, 0xdb, 0x6, 0xfb, 0xe, 0xf7, 0x5e, 0xf7,
+                                                   0xe, 0xf7, 0x5f, 0x5, 0x3b, 0x6, 0xfb, 0x27,
+                                                   0xfb, 0x5f, 0x5, 0xe, 0x3c, 0x52, 0xa, 0xf7,
+                                                   0xa9, 0xf7, 0x16, 0x15, 0xdc, 0x6, 0xf7, 0x27,
+                                                   0xf7, 0x5e, 0xfb, 0x27, 0xf7, 0x5f, 0x5, 0x3a,
+                                                   0x6, 0xf7, 0xd, 0xfb, 0x5f, 0x5, 0xfb, 0xb7,
+                                                   0xfb, 0x5e, 0x15, 0xda, 0x6, 0xf7, 0x28, 0xf7,
+                                                   0x5e, 0xfb, 0x28, 0xf7, 0x5f, 0x5, 0x3c, 0x6,
+                                                   0xf7, 0xd, 0xfb, 0x5f, 0x5, 0xe, 0xfb, 0xfa,
+                                                   0x52, 0xa, 0xf7, 0x6b, 0xf7, 0x16, 0x15, 0xc1,
+                                                   0x6, 0x36, 0xf7, 0x5e, 0xe0, 0xf7, 0x5f, 0x5,
+                                                   0x55, 0x6, 0xfb, 0xa, 0xfb, 0x5f, 0x5, 0xe,
+                                                   0xfb, 0xd9, 0x52, 0xa, 0xec, 0xf7, 0x16, 0x15,
+                                                   0xc3, 0x6, 0xf7, 0x8, 0xf7, 0x60, 0xfb, 0x8,
+                                                   0xf7, 0x5d, 0x5, 0x53, 0x6, 0xe2, 0xfb, 0x5d,
+                                                   0x5, 0xe, 0xa0, 0x76, 0xf8, 0x5a, 0xd7, 0xf7,
+                                                   0x50, 0x77, 0x1, 0xcc, 0xe3, 0xf7, 0x8e, 0xe3,
+                                                   0x3, 0xcc, 0x16, 0xe3, 0xf7, 0xaf, 0x6, 0xdd,
+                                                   0xb2, 0xe4, 0xf4, 0xf7, 0x1, 0x88, 0x2a, 0x6d,
+                                                   0x1e, 0xfb, 0xdb, 0xe3, 0xf7, 0xdb, 0x7, 0xf7,
+                                                   0x8, 0x49, 0xe2, 0xfb, 0x14, 0x66, 0x59, 0x85,
+                                                   0x4a, 0x52, 0x1e, 0xf7, 0x97, 0x33, 0x7, 0xe,
+                                                   0xfb, 0xfa, 0xf8, 0xe5, 0xf7, 0x21, 0x1, 0xf7,
+                                                   0x58, 0xf8, 0xe5, 0x60, 0xa, 0xfb, 0x9b, 0xfb,
+                                                   0x21, 0x60, 0xa, 0xe, 0xfb, 0xfa, 0xf7, 0x7c,
+                                                   0xe5, 0x1, 0xb7, 0xf7, 0x7c, 0x15, 0xf7, 0x89,
+                                                   0xe5, 0xfb, 0x89, 0x6, 0xe, 0xfc, 0x69, 0xa0,
+                                                   0x76, 0xf9, 0x1, 0xec, 0x1, 0xf7, 0x24, 0xe3,
+                                                   0x3, 0xce, 0x16, 0xe3, 0xf8, 0x98, 0x33, 0x6,
+                                                   0xf4, 0x4, 0x6d, 0xa, 0x62, 0xa, 0xcc, 0xf8,
+                                                   0xe3, 0x15, 0xd2, 0x6, 0xf7, 0x12, 0xf7, 0x23,
+                                                   0x38, 0xa, 0x57, 0x50, 0xa, 0x4b, 0xa, 0xf8,
+                                                   0xe9, 0xf7, 0x1d, 0x1, 0xea, 0xe3, 0x3, 0x85,
+                                                   0xf8, 0xe9, 0x15, 0xee, 0x6, 0xbb, 0xde, 0xb6,
+                                                   0x38, 0x5, 0xf0, 0x6, 0x26, 0x42, 0xa, 0x8f,
+                                                   0x50, 0xa, 0x4b, 0xa, 0xf8, 0xf2, 0xef, 0x12,
+                                                   0x98, 0xe5, 0x83, 0xe3, 0x84, 0xe5, 0x13, 0xd0,
+                                                   0xea, 0x16, 0xe3, 0xf8, 0x99, 0x33, 0x6, 0x13,
+                                                   0xe8, 0x39, 0xe4, 0x58, 0xa, 0x62, 0xa, 0xf7,
+                                                   0x17, 0xf8, 0xea, 0x15, 0xd4, 0x6, 0x39, 0xf7,
+                                                   0x1c, 0x38, 0xa, 0xe3, 0x50, 0xa, 0xfc, 0x69,
+                                                   0xfb, 0x51, 0x76, 0xf9, 0xd3, 0xec, 0x1, 0xce,
+                                                   0xe3, 0x3, 0x8c, 0xfb, 0x12, 0x15, 0x7a, 0x40,
+                                                   0x5, 0x85, 0xa2, 0x9e, 0x88, 0x9c, 0x1b, 0xdc,
+                                                   0xaa, 0xc7, 0xf7, 0xe, 0x1f, 0xf8, 0xb5, 0x33,
+                                                   0xfc, 0xb5, 0x7, 0x2d, 0x72, 0x7d, 0x62, 0x95,
+                                                   0x1e, 0xcd, 0xf9, 0x7f, 0x15, 0x6d, 0xa, 0xfb,
+                                                   0x53, 0x44, 0xa, 0xf7, 0x62, 0x6, 0xca, 0xc6,
+                                                   0xf7, 0x43, 0xfb, 0x9d, 0x5, 0xf7, 0x0, 0x6,
+                                                   0xfb, 0x71, 0xf7, 0xda, 0xf7, 0x5a, 0xf7, 0x54,
+                                                   0x5, 0xfb, 0x6, 0x6, 0xfb, 0x65, 0xfb, 0x66,
+                                                   0x5, 0xf8, 0x2e, 0x33, 0x7, 0xe, 0xfc, 0x69,
+                                                   0x44, 0xa, 0xf9, 0x62, 0x7a, 0xa, 0x71, 0xa,
+                                                   0xf7, 0x69, 0x15, 0xf8, 0x7c, 0xfb, 0x5e, 0x5,
+                                                   0xe2, 0x7, 0xfc, 0x1a, 0xf7, 0x30, 0xf8, 0x1a,
+                                                   0xf7, 0x2e, 0x5, 0xe2, 0x7, 0xfc, 0x7c, 0xfb,
+                                                   0x5c, 0x5, 0xe, 0x20, 0xf7, 0x15, 0x76, 0x1,
+                                                   0xb2, 0xf7, 0xc8, 0x15, 0xf8, 0x27, 0xfb, 0x5c,
+                                                   0xde, 0xf7, 0xae, 0xfc, 0x7a, 0x6, 0xe, 0xfc,
+                                                   0x69, 0x44, 0xa, 0xf7, 0xf9, 0x6, 0xe2, 0xd6,
+                                                   0x5, 0xd8, 0x7, 0x34, 0x40, 0x5, 0xf7, 0xb0,
+                                                   0x33, 0xfb, 0xfb, 0x7, 0x34, 0x43, 0x5, 0x3e,
+                                                   0x7, 0xe2, 0xd3, 0x5, 0xe, 0xf7, 0x22, 0x6f,
+                                                   0xa, 0xf7, 0x70, 0xe3, 0xf7, 0x70, 0xe3, 0x17,
+                                                   0xcc, 0x16, 0xe3, 0xf7, 0xa1, 0x6, 0xcc, 0x9c,
+                                                   0xf7, 0x14, 0xf7, 0x2, 0xe1, 0x92, 0x3f, 0x5a,
+                                                   0x1e, 0xfb, 0xe5, 0xe3, 0xf7, 0xc1, 0x7, 0xdc,
+                                                   0xb2, 0xdb, 0xe3, 0xe8, 0x8b, 0x36, 0x59, 0x1e,
+                                                   0xfb, 0xdb, 0xe3, 0xf7, 0xf3, 0x7, 0xb0, 0x76,
+                                                   0xf7, 0x2a, 0xfb, 0x34, 0x2a, 0x72, 0x4c, 0x6f,
+                                                   0x79, 0x1e, 0xc7, 0x76, 0x42, 0xaa, 0x41, 0x1b,
+                                                   0x40, 0x6c, 0x5e, 0x5d, 0x6f, 0x1f, 0x13, 0xf8,
+                                                   0x89, 0x8a, 0x5, 0xd3, 0x3c, 0x7, 0xe, 0xfb,
+                                                   0xfa, 0xf9, 0x7, 0xc4, 0x1, 0x95, 0xf9, 0x7,
+                                                   0x15, 0xf7, 0xcd, 0xc4, 0xfb, 0xcd, 0x6, 0xe,
+                                                   0x20, 0xb2, 0xf7, 0x6c, 0x15, 0xf8, 0x8e, 0xd4,
+                                                   0xfc, 0x8e, 0x6, 0xe, 0xfb, 0x4e, 0x76, 0xf7,
+                                                   0x57, 0xda, 0x48, 0xce, 0xf8, 0x5c, 0x77, 0x4e,
+                                                   0xa, 0x13, 0xdc, 0xf7, 0x33, 0xbf, 0x15, 0x6f,
+                                                   0x9f, 0xa8, 0x67, 0xd4, 0x1b, 0xdd, 0xa9, 0xb9,
+                                                   0xa6, 0x9b, 0x1f, 0x8d, 0x6, 0x13, 0xbc, 0x4e,
+                                                   0xd9, 0xf8, 0x9f, 0x33, 0xfb, 0x75, 0x7, 0xfb,
+                                                   0x10, 0x8a, 0x20, 0xfb, 0xb, 0xfb, 0x11, 0x8b,
+                                                   0xf7, 0xf, 0xf7, 0x1, 0x1e, 0xf7, 0x74, 0x33,
+                                                   0xfd, 0x6e, 0xe4, 0xf7, 0x97, 0x7, 0xe, 0x20,
+                                                   0xa0, 0x76, 0xf8, 0x8e, 0x77, 0x1, 0xb3, 0xd1,
+                                                   0xf8, 0x1, 0xd0, 0x3, 0xb2, 0xd1, 0x15, 0xd1,
+                                                   0x45, 0xf7, 0x4c, 0xf7, 0x4b, 0xf7, 0x4a, 0xfb,
+                                                   0x4b, 0xd1, 0xd2, 0xfb, 0x49, 0xf7, 0x4a, 0xf7,
+                                                   0x48, 0xf7, 0x49, 0x46, 0xd2, 0xfb, 0x49, 0xfb,
+                                                   0x4c, 0xfb, 0x4c, 0xf7, 0x4d, 0x45, 0x43, 0xf7,
+                                                   0x4a, 0xfb, 0x4a, 0x5, 0xe, 0x6f, 0xa, 0xf7,
+                                                   0x8e, 0xe3, 0x17, 0xcc, 0x16, 0xe3, 0xf7, 0xaf,
+                                                   0x6, 0xe0, 0xac, 0xe9, 0xf7, 0x0, 0xf7, 0x0,
+                                                   0x8c, 0x25, 0x5e, 0x1e, 0xfb, 0xcf, 0xe3, 0xf7,
+                                                   0xcf, 0x7, 0xf7, 0xe, 0x4a, 0xf0, 0xfb, 0x18,
+                                                   0x68, 0x4d, 0x7c, 0x3d, 0x58, 0x1e, 0x13, 0xf0,
+                                                   0x89, 0xd4, 0x3c, 0x6, 0xe, 0x78, 0xd2, 0xf7,
+                                                   0x47, 0xd7, 0xf7, 0xdd, 0xd4, 0x1, 0xc6, 0xe5,
+                                                   0xf7, 0x9d, 0xec, 0x3, 0xc2, 0xf7, 0x30, 0x15,
+                                                   0xfb, 0x3b, 0xa0, 0xf7, 0x30, 0x83, 0xb2, 0x1b,
+                                                   0xf7, 0x86, 0x8c, 0xf7, 0xc0, 0xd9, 0xf7, 0x61,
+                                                   0x4e, 0xf7, 0x1f, 0xfb, 0x4a, 0xfb, 0x18, 0x2a,
+                                                   0x23, 0xfb, 0x20, 0xfb, 0x27, 0xf7, 0xb, 0x3a,
+                                                   0xf7, 0x2, 0xe0, 0xb8, 0xc0, 0xb3, 0xa3, 0x1f,
+                                                   0x8d, 0x6, 0x47, 0x8c, 0x88, 0xfb, 0x60, 0xfb,
+                                                   0x2e, 0x1b, 0x29, 0x6e, 0xdf, 0xa6, 0x86, 0x1f,
+                                                   0x84, 0xf7, 0xbc, 0x15, 0xe7, 0xc2, 0xda, 0xdf,
+                                                   0xde, 0xca, 0x39, 0x32, 0x38, 0x56, 0x46, 0x2e,
+                                                   0x3d, 0x4e, 0xc6, 0xe8, 0x1e, 0xe, 0xa0, 0x76,
+                                                   0xf8, 0x5a, 0xd7, 0xdc, 0x75, 0xa, 0xcc, 0xe3,
+                                                   0xf7, 0x8e, 0xe3, 0x13, 0xec, 0xcc, 0x16, 0xe3,
+                                                   0xf7, 0xc2, 0x6, 0xdf, 0xac, 0xcf, 0xf7, 0x0,
+                                                   0xf7, 0x0, 0x8c, 0x20, 0x5e, 0x1e, 0xfb, 0xc2,
+                                                   0xe3, 0xf7, 0xc2, 0x7, 0xf7, 0x19, 0x52, 0xea,
+                                                   0xfb, 0x20, 0x68, 0x4d, 0x83, 0x3e, 0x58, 0x1e,
+                                                   0x89, 0xd4, 0x3c, 0x6, 0xbd, 0xe8, 0x15, 0xcc,
+                                                   0x6, 0xbb, 0xab, 0x8a, 0x90, 0x9f, 0xa4, 0x7f,
+                                                   0x7f, 0xa3, 0x1e, 0x80, 0xa2, 0x9f, 0x80, 0x9c,
+                                                   0x1b, 0xa1, 0xd0, 0x90, 0xf6, 0x90, 0x1f, 0x4b,
+                                                   0x6, 0x13, 0xdc, 0x68, 0x87, 0x80, 0x84, 0x77,
+                                                   0x1b, 0x86, 0x78, 0x95, 0x96, 0x70, 0x1f, 0x13,
+                                                   0xec, 0x96, 0x72, 0x6d, 0x94, 0x74, 0x1b, 0x5a,
+                                                   0x59, 0x68, 0x3e, 0x1f, 0xe, 0xa0, 0x76, 0xf7,
+                                                   0x55, 0xcb, 0xf7, 0x3a, 0xce, 0xf7, 0x5a, 0x77,
+                                                   0x1, 0xa7, 0xf8, 0x89, 0x3, 0xcb, 0x16, 0xd0,
+                                                   0x6, 0xb3, 0xf7, 0x55, 0x5, 0xf7, 0x25, 0x6,
+                                                   0x62, 0xfb, 0x55, 0x5, 0xd1, 0x6, 0xb3, 0xf7,
+                                                   0x55, 0x5, 0xf7, 0x22, 0xcb, 0xfb, 0x14, 0x6,
+                                                   0xad, 0xf7, 0x3a, 0x5, 0xe9, 0xce, 0x3b, 0x6,
+                                                   0xb2, 0xf7, 0x5a, 0x5, 0x47, 0x6, 0x62, 0xfb,
+                                                   0x5a, 0x5, 0xfb, 0x24, 0x6, 0xb3, 0xf7, 0x5a,
+                                                   0x5, 0x46, 0x6, 0x62, 0xfb, 0x5a, 0x5, 0xfb,
+                                                   0x1d, 0x48, 0xf7, 0x10, 0x6, 0x68, 0xfb, 0x3a,
+                                                   0x5, 0x32, 0x4b, 0xd7, 0x6, 0xd9, 0xcb, 0x15,
+                                                   0xae, 0xf7, 0x3b, 0x5, 0xf7, 0x2e, 0x6, 0x67,
+                                                   0xfb, 0x3b, 0x5, 0xe, 0x7d, 0xd3, 0xf8, 0x2c,
+                                                   0xd3, 0x1, 0xbb, 0xe5, 0xf7, 0xa8, 0xe5, 0x3,
+                                                   0xae, 0xf7, 0xa0, 0x15, 0xfb, 0x2e, 0xd1, 0xfb,
+                                                   0x14, 0xf7, 0x41, 0xf7, 0x30, 0xe2, 0xf1, 0xf7,
+                                                   0x48, 0xf7, 0x5a, 0xfb, 0x1a, 0xd3, 0xfb, 0x1,
+                                                   0xfb, 0x3c, 0x40, 0xfb, 0x13, 0xfb, 0x23, 0x1e,
+                                                   0xe5, 0x16, 0xf7, 0x3c, 0xed, 0xa9, 0xc2, 0xda,
+                                                   0xd5, 0x4f, 0xfb, 0x1e, 0x39, 0x6f, 0xfb, 0x14,
+                                                   0xfb, 0x11, 0x57, 0x26, 0xb4, 0xf7, 0x3d, 0x1e,
+                                                   0xe, 0x76, 0xa, 0xc8, 0xf7, 0x1d, 0x1, 0x77,
+                                                   0xa, 0x3, 0x3f, 0xa, 0xfb, 0x87, 0xfc, 0x6a,
+                                                   0x23, 0xa, 0xe, 0x76, 0xa, 0xf7, 0x5a, 0x77,
+                                                   0x1, 0x77, 0xa, 0x3, 0x3a, 0xa, 0xfb, 0x4d,
+                                                   0xfc, 0x6a, 0x23, 0xa, 0xe, 0x7d, 0xd3, 0xf8,
+                                                   0x34, 0xd3, 0xc7, 0xef, 0x1, 0x77, 0xa, 0x3,
+                                                   0x3e, 0xa, 0xfb, 0xab, 0xfc, 0x4e, 0x23, 0xa,
+                                                   0xe, 0xf7, 0x91, 0x7c, 0xd4, 0xf7, 0x46, 0xd3,
+                                                   0xf7, 0x32, 0xd3, 0x1, 0xae, 0xe5, 0xf7, 0xc8,
+                                                   0xe7, 0xf7, 0xb1, 0xe7, 0x3, 0xf8, 0x6f, 0xde,
+                                                   0x15, 0x3d, 0xbf, 0xd4, 0x77, 0xca, 0x1b, 0xc8,
+                                                   0xf7, 0x18, 0x9f, 0xf7, 0x2b, 0xb3, 0x1f, 0x3c,
+                                                   0x98, 0x5, 0x77, 0x85, 0x5e, 0x30, 0x24, 0x1b,
+                                                   0x2e, 0x5c, 0xd8, 0xf0, 0x8a, 0x1f, 0xf8, 0x10,
+                                                   0x6, 0xf7, 0xaa, 0xfb, 0x41, 0xa3, 0x49, 0x3d,
+                                                   0x49, 0x68, 0x4b, 0x5f, 0x1e, 0xc8, 0x61, 0x5a,
+                                                   0xb1, 0x21, 0x1b, 0xfb, 0xd, 0xfb, 0xe, 0x2c,
+                                                   0xfb, 0x49, 0xfb, 0x47, 0xf7, 0x1, 0x29, 0xf7,
+                                                   0x1a, 0xa9, 0xea, 0x8e, 0xea, 0xd3, 0x1f, 0xfb,
+                                                   0xf2, 0xf7, 0x47, 0x15, 0xf6, 0xc7, 0xec, 0xe8,
+                                                   0xe0, 0xd1, 0x3c, 0xfb, 0x11, 0xfb, 0x1d, 0x3e,
+                                                   0x48, 0x3d, 0x63, 0xfb, 0x5, 0xa2, 0xf7, 0x49,
+                                                   0x1e, 0xf8, 0x24, 0xb9, 0x15, 0xf7, 0x4, 0x94,
+                                                   0xcf, 0xb5, 0xc8, 0x1b, 0xd7, 0xc8, 0x61, 0xfb,
+                                                   0x4, 0x95, 0x1f, 0xe, 0xfb, 0xfa, 0xfb, 0x75,
+                                                   0xc7, 0xf7, 0x39, 0x77, 0x1, 0xd4, 0xc9, 0xc9,
+                                                   0xe5, 0x3, 0xe8, 0x16, 0x7a, 0x4f, 0x88, 0x6e,
+                                                   0x76, 0x1a, 0x3d, 0xc1, 0x66, 0xc6, 0xae, 0xb0,
+                                                   0x97, 0x9d, 0xa8, 0x1e, 0xc2, 0x7, 0x78, 0x6d,
+                                                   0x6a, 0x85, 0x70, 0x1b, 0x67, 0x71, 0xa1, 0xba,
+                                                   0x91, 0x88, 0xb9, 0x9e, 0xb7, 0x1f, 0xe, 0x76,
+                                                   0xa, 0xca, 0xf7, 0x1b, 0x1, 0x77, 0xa, 0x3,
+                                                   0xb8, 0xf7, 0x9c, 0x23, 0xa, 0xf7, 0x13, 0xf7,
+                                                   0xe3, 0x4c, 0xa, 0x4a, 0xf7, 0x1b, 0x59, 0xa,
+                                                   0xa0, 0x76, 0xf8, 0xbe, 0xf7, 0x33, 0x1, 0xf7,
+                                                   0xa3, 0xe3, 0x3, 0xf7, 0xa3, 0x16, 0xe3, 0xf9,
+                                                   0x53, 0x48, 0x6, 0x67, 0x42, 0x44, 0x47, 0x37,
+                                                   0x64, 0x8, 0x36, 0x7, 0xab, 0x97, 0xdd, 0xb3,
+                                                   0xc3, 0xc1, 0x8, 0xe, 0xf7, 0x23, 0x81, 0xc3,
+                                                   0x5f, 0x76, 0xf7, 0xc6, 0xc3, 0xf7, 0xfb, 0x77,
+                                                   0xa0, 0x77, 0x12, 0xf7, 0x2a, 0xd1, 0xf8, 0x6f,
+                                                   0xd7, 0x13, 0x76, 0xf7, 0x2a, 0xf7, 0xf1, 0x15,
+                                                   0xd1, 0xf7, 0xf5, 0x57, 0x6, 0x68, 0x60, 0x53,
+                                                   0x69, 0x69, 0x80, 0x8, 0x51, 0x7, 0xb0, 0x94,
+                                                   0xb4, 0xa0, 0xa8, 0xa3, 0x8, 0x50, 0xfd, 0x9,
+                                                   0x15, 0xd7, 0x6, 0x13, 0x6e, 0xf8, 0xa3, 0xf9,
+                                                   0x66, 0x5, 0x40, 0x6, 0x13, 0xb6, 0xfb, 0x24,
+                                                   0xfd, 0x5d, 0x15, 0xf7, 0xbe, 0xc3, 0xfb, 0x4d,
+                                                   0x6, 0xd3, 0xc3, 0x5, 0xcf, 0xba, 0xb6, 0xa4,
+                                                   0xc8, 0x1a, 0xe9, 0xfb, 0xc, 0x99, 0x76, 0xfb,
+                                                   0xb, 0x79, 0x46, 0x6a, 0x83, 0x1e, 0xd3, 0x84,
+                                                   0x5, 0xa6, 0x94, 0x95, 0xa5, 0xc1, 0x1b, 0xb3,
+                                                   0xa4, 0x79, 0x69, 0x6b, 0x74, 0x7a, 0x41, 0x57,
+                                                   0x1f, 0x4c, 0x5e, 0x55, 0x5c, 0x85, 0x57, 0x8,
+                                                   0xe, 0xf7, 0x23, 0x8d, 0x76, 0xdc, 0xbe, 0xf8,
+                                                   0xe2, 0x77, 0x1, 0xf7, 0x43, 0xce, 0xf8, 0x24,
+                                                   0xcd, 0x3, 0xf8, 0x67, 0xc9, 0x15, 0xf7, 0x43,
+                                                   0x44, 0xcd, 0xd2, 0xbb, 0xbe, 0x5b, 0xf7, 0x78,
+                                                   0x53, 0x6, 0xfb, 0x4d, 0xfb, 0x71, 0x5, 0xd1,
+                                                   0x84, 0x15, 0xf4, 0xf7, 0xf, 0x5, 0xfb, 0xf,
+                                                   0x7, 0xfc, 0x67, 0xf7, 0x83, 0x15, 0xce, 0xf7,
+                                                   0xf3, 0x59, 0x6, 0x6a, 0x60, 0x56, 0x69, 0x6a,
+                                                   0x81, 0x8, 0x51, 0x7, 0xaf, 0x94, 0xb1, 0x9f,
+                                                   0xa7, 0xa3, 0x8, 0x5d, 0xfd, 0xa, 0x15, 0xd4,
+                                                   0x6, 0xf8, 0x8d, 0xf9, 0x63, 0x5, 0x44, 0x6,
+                                                   0xe, 0xfb, 0xfa, 0xf7, 0xe0, 0x76, 0xf8, 0x3a,
+                                                   0x77, 0x1, 0xf7, 0x2b, 0xd2, 0x3, 0xf7, 0x2b,
+                                                   0xf7, 0xcb, 0x15, 0xd2, 0xf8, 0x3a, 0x56, 0x6,
+                                                   0x68, 0x5e, 0x53, 0x68, 0x68, 0x80, 0x8, 0x4e,
+                                                   0x7, 0xb1, 0x95, 0xb3, 0xa0, 0xa9, 0xa4, 0x8,
+                                                   0xe, 0xfb, 0xd5, 0xf7, 0xc4, 0xd1, 0xf7, 0xbe,
+                                                   0xcc, 0x1, 0xa3, 0xd3, 0xf7, 0x38, 0xce, 0x3,
+                                                   0xf7, 0xa6, 0xf7, 0xcf, 0x4c, 0xa, 0x78, 0xa7,
+                                                   0x8b, 0xb3, 0xd6, 0x1a, 0xf7, 0x1e, 0x7, 0xf7,
+                                                   0x11, 0x3d, 0x9b, 0x48, 0xfb, 0x9, 0x74, 0x3b,
+                                                   0x62, 0x86, 0x1e, 0xcc, 0x77, 0x5, 0xc9, 0x93,
+                                                   0xb1, 0x99, 0xad, 0x1b, 0xd6, 0x8e, 0x56, 0x64,
+                                                   0x1f, 0x82, 0x85, 0x3b, 0x7f, 0x7b, 0x87, 0x8,
+                                                   0x5a, 0x84, 0x39, 0x7d, 0x22, 0x1a, 0x27, 0xd2,
+                                                   0x6f, 0xb8, 0xbe, 0xb7, 0xab, 0xa9, 0xa8, 0x1e,
+                                                   0x75, 0x8f, 0x7d, 0x91, 0x7c, 0x1e, 0x7c, 0xf7,
+                                                   0x5b, 0x15, 0x5b, 0x8a, 0x7d, 0x81, 0x77, 0x1e,
+                                                   0x65, 0x79, 0x64, 0x77, 0x68, 0x1b, 0x6a, 0x70,
+                                                   0x9f, 0xb1, 0xb9, 0xa6, 0x93, 0xcb, 0x97, 0x1f,
+                                                   0xb7, 0x94, 0x96, 0x8c, 0x9c, 0x91, 0x8, 0xe,
+                                                   0xfb, 0xda, 0xf7, 0xc4, 0xd0, 0xf7, 0xbb, 0xd0,
+                                                   0x1, 0xa4, 0xcb, 0xf7, 0x50, 0xcb, 0x3, 0xa4,
+                                                   0xf8, 0x9e, 0x15, 0xfb, 0x9, 0xc0, 0x26, 0xf4,
+                                                   0xf7, 0xe, 0xaf, 0xf7, 0x15, 0xe4, 0xe2, 0x68,
+                                                   0xf7, 0x14, 0xfb, 0xf, 0xfb, 0xd, 0x66, 0xfb,
+                                                   0xc, 0x2c, 0x1e, 0xcb, 0x16, 0xb2, 0x97, 0xf6,
+                                                   0xdd, 0xe1, 0x93, 0xfb, 0x12, 0x77, 0x68, 0x83,
+                                                   0xfb, 0x6, 0x35, 0x35, 0x83, 0xf7, 0x13, 0xa1,
+                                                   0x1e, 0xe, 0x3b, 0x8a, 0x76, 0xa6, 0xd0, 0xf8,
+                                                   0x10, 0xd0, 0xa1, 0x77, 0x1, 0xa7, 0xd3, 0xf7,
+                                                   0xf8, 0xdc, 0x3, 0xb0, 0x97, 0x15, 0xbb, 0x69,
+                                                   0xc1, 0xcc, 0x5, 0x7d, 0xa3, 0xaf, 0x73, 0xdc,
+                                                   0x1b, 0xf7, 0x39, 0xe7, 0xf7, 0x3, 0xf7, 0x27,
+                                                   0xf7, 0x1, 0x69, 0xb7, 0x71, 0xab, 0x1f, 0xc2,
+                                                   0xcb, 0x5a, 0xac, 0x58, 0x4f, 0x5, 0x9b, 0x6e,
+                                                   0x5c, 0xa1, 0x3f, 0x1b, 0xfb, 0x3a, 0x35, 0xfb,
+                                                   0x8, 0xfb, 0x24, 0x2e, 0xaa, 0x53, 0xad, 0x68,
+                                                   0x1f, 0xba, 0xc6, 0x15, 0x6e, 0xa6, 0x80, 0xb8,
+                                                   0xbe, 0x1a, 0xf7, 0x3a, 0xf7, 0x17, 0xa6, 0xbc,
+                                                   0xbe, 0xad, 0x78, 0x7e, 0x9e, 0x1e, 0xfb, 0x60,
+                                                   0xfb, 0xdc, 0x15, 0xf7, 0x86, 0xf7, 0xaf, 0x5,
+                                                   0xa1, 0x6f, 0x97, 0x72, 0x4e, 0x1a, 0xfb, 0x34,
+                                                   0xfb, 0x8, 0x6e, 0x4f, 0x59, 0x6c, 0x91, 0x99,
+                                                   0x78, 0x1e, 0xe, 0x7d, 0xd3, 0xf8, 0x34, 0xd3,
+                                                   0xca, 0x75, 0xa, 0x77, 0xa, 0x13, 0xec, 0xf7,
+                                                   0x7, 0xf8, 0xf5, 0x15, 0xcc, 0x6, 0xbb, 0xac,
+                                                   0x8a, 0x8f, 0xa2, 0xa4, 0x7f, 0x7f, 0xa2, 0x1e,
+                                                   0x80, 0xa2, 0x9f, 0x80, 0x9a, 0x1b, 0xa0, 0xd6,
+                                                   0x8d, 0xf7, 0x2, 0x56, 0xa, 0x87, 0x79, 0x92,
+                                                   0x96, 0x74, 0x1f, 0x13, 0xdc, 0x70, 0x96, 0x6b,
+                                                   0x98, 0x72, 0x8a, 0x8, 0x13, 0xec, 0x5a, 0x59,
+                                                   0x66, 0x40, 0x1f, 0x45, 0xfb, 0xed, 0x23, 0xa,
+                                                   0xe, 0x66, 0xa, 0xc7, 0xe3, 0xf7, 0x98, 0xe5,
+                                                   0x3, 0xf7, 0x28, 0xc8, 0x15, 0x68, 0xa5, 0xb3,
+                                                   0x6c, 0xc9, 0x1b, 0xf7, 0x6, 0xf7, 0x13, 0xe0,
+                                                   0xf7, 0x4c, 0xf7, 0x25, 0x2d, 0xf7, 0x15, 0xfb,
+                                                   0x27, 0x2d, 0x70, 0x54, 0x73, 0x7c, 0x1f, 0x89,
+                                                   0xce, 0x3b, 0xfd, 0x71, 0xe3, 0xf7, 0xa0, 0x6,
+                                                   0x82, 0xf7, 0x5e, 0x15, 0xf7, 0xd, 0xc2, 0xe0,
+                                                   0xdf, 0xcd, 0xe0, 0x50, 0xfb, 0x26, 0xfb, 0x3e,
+                                                   0x28, 0x70, 0x57, 0x4f, 0x3c, 0xb3, 0xf7, 0x30,
+                                                   0x1e, 0xe, 0xfb, 0x2e, 0xfb, 0x2c, 0x76, 0xf9,
+                                                   0xba, 0xe0, 0x1, 0x9d, 0xf7, 0xa2, 0xdd, 0xd0,
+                                                   0x3, 0xf7, 0x6c, 0xfb, 0x41, 0x15, 0xd3, 0xf9,
+                                                   0xba, 0xdd, 0xfd, 0xba, 0xd0, 0xf9, 0xba, 0xc5,
+                                                   0xe0, 0xfb, 0x8b, 0x6, 0xfb, 0xf, 0xfb, 0x1,
+                                                   0x48, 0xfb, 0x1d, 0x27, 0xca, 0x2d, 0xf7, 0x1b,
+                                                   0x1f, 0xe, 0x70, 0xa, 0x1, 0xcf, 0xe6, 0x3,
+                                                   0xf7, 0x88, 0xfb, 0x63, 0x15, 0xc2, 0x6, 0x21,
+                                                   0xf7, 0x3e, 0x69, 0xf7, 0x30, 0xf7, 0x23, 0x1a,
+                                                   0xf7, 0x6d, 0xd4, 0xf7, 0x1f, 0xce, 0xf7, 0x7,
+                                                   0x1e, 0x4a, 0x6, 0x21, 0xfb, 0x1f, 0x4f, 0xfb,
+                                                   0x37, 0xfb, 0x3d, 0x1a, 0xfb, 0x7f, 0xf7, 0x1d,
+                                                   0xfb, 0x4d, 0xb2, 0x5a, 0x1e, 0xe, 0x70, 0xa,
+                                                   0x12, 0xf7, 0x42, 0xe6, 0x17, 0xad, 0xfb, 0x61,
+                                                   0x15, 0xc6, 0x89, 0x5, 0xf5, 0xf7, 0x1f, 0xcd,
+                                                   0xf7, 0x35, 0xf7, 0x3d, 0x1a, 0xf7, 0x7f, 0xfb,
+                                                   0x16, 0xf7, 0x4f, 0x64, 0xbc, 0x1e, 0x4d, 0x6,
+                                                   0x13, 0x20, 0xf5, 0xfb, 0x3e, 0xad, 0xfb, 0x32,
+                                                   0xfb, 0x23, 0x1a, 0xfb, 0x6d, 0x3d, 0xfb, 0x26,
+                                                   0x4d, 0x23, 0x1e, 0xe, 0xf7, 0x5a, 0x79, 0xc5,
+                                                   0x65, 0x76, 0xf7, 0xc5, 0xc4, 0x89, 0xc5, 0xf7,
+                                                   0x8a, 0xc4, 0x8c, 0x77, 0x12, 0xb2, 0xde, 0xf7,
+                                                   0x3a, 0xdd, 0xf7, 0x29, 0xdd, 0xf7, 0x3b, 0xdd,
+                                                   0x13, 0x9b, 0xc0, 0xb2, 0xf8, 0x9d, 0x15, 0xfb,
+                                                   0x37, 0xf7, 0x2, 0x7a, 0xc0, 0xce, 0xf0, 0xb2,
+                                                   0xf7, 0x21, 0xf7, 0x27, 0x26, 0xad, 0x48, 0x1e,
+                                                   0xfb, 0xa, 0x5e, 0x29, 0x38, 0x1f, 0xde, 0x16,
+                                                   0xae, 0x89, 0xe4, 0xdd, 0xdf, 0x8d, 0x28, 0x72,
+                                                   0x68, 0x89, 0x34, 0x37, 0x1e, 0x13, 0xa6, 0xc0,
+                                                   0x39, 0x8d, 0xed, 0xa3, 0x1f, 0xf8, 0x21, 0xfb,
+                                                   0xfa, 0x15, 0xfb, 0x37, 0xf7, 0x2, 0x79, 0xc0,
+                                                   0xce, 0xf0, 0xb3, 0xf7, 0x21, 0x1e, 0x13, 0xab,
+                                                   0xc0, 0xf7, 0x26, 0x26, 0xad, 0x48, 0xfb, 0xb,
+                                                   0x5f, 0x2a, 0x38, 0x1e, 0xdd, 0x16, 0xae, 0x89,
+                                                   0xe3, 0xde, 0xdf, 0x8d, 0x29, 0x72, 0x68, 0x89,
+                                                   0x33, 0x37, 0x38, 0x8d, 0xee, 0xa3, 0x1e, 0x13,
+                                                   0x67, 0xc0, 0xfc, 0x2b, 0xfb, 0x4a, 0x15, 0xda,
+                                                   0x6, 0xf8, 0x3b, 0xf9, 0x66, 0x5, 0x3e, 0x6,
+                                                   0xe, 0xfc, 0x31, 0x8b, 0xf5, 0x1, 0xe2, 0xf3,
+                                                   0x3, 0xe2, 0x16, 0xf3, 0xf5, 0x23, 0x6, 0xe,
+                                                   0xfc, 0x31, 0xf7, 0x52, 0xf7, 0x11, 0x1, 0xd8,
+                                                   0xf7, 0x11, 0x3, 0xd8, 0xf7, 0x52, 0x15, 0xf7,
+                                                   0x11, 0xf7, 0x11, 0xfb, 0x11, 0x6, 0xe, 0xf7,
+                                                   0xc9, 0x78, 0xc5, 0xf7, 0x86, 0xc5, 0x88, 0xc6,
+                                                   0xf7, 0x85, 0xc4, 0x95, 0x77, 0x12, 0x92, 0xd5,
+                                                   0xf7, 0x1f, 0xd4, 0xd9, 0xd4, 0xf7, 0x1f, 0xd5,
+                                                   0xbe, 0xd4, 0xf7, 0x1f, 0xd5, 0x13, 0xb7, 0xe0,
+                                                   0x92, 0xf8, 0x98, 0x15, 0x52, 0x97, 0xfb, 0xf,
+                                                   0xf7, 0x16, 0xf7, 0x23, 0x8c, 0xf7, 0x1b, 0xb8,
+                                                   0xb2, 0x86, 0xf7, 0x1e, 0xfb, 0x1f, 0xfb, 0x1a,
+                                                   0x83, 0xfb, 0x16, 0x5c, 0x1e, 0xd5, 0x16, 0xb1,
+                                                   0x8a, 0xdd, 0xd0, 0xc4, 0x99, 0x53, 0x4b, 0x5d,
+                                                   0x83, 0x40, 0x4c, 0x48, 0x8a, 0xd7, 0xb8, 0x1e,
+                                                   0xf7, 0xb6, 0xfb, 0xf8, 0x15, 0x5d, 0xa, 0x1e,
+                                                   0x13, 0xcf, 0xe0, 0x3c, 0xa, 0xf7, 0x9c, 0x16,
+                                                   0x5d, 0xa, 0x3c, 0xa, 0xfd, 0xb, 0xfb, 0x45,
+                                                   0x15, 0xcd, 0x6, 0xf7, 0xbf, 0xf9, 0x64, 0x5,
+                                                   0x49, 0x6, 0xe, 0x20, 0xf7, 0x82, 0xe4, 0x1,
+                                                   0xf7, 0x8d, 0xe4, 0x3, 0xb2, 0xf7, 0x82, 0x15,
+                                                   0xf7, 0x66, 0xfb, 0x64, 0xe4, 0xf7, 0x64, 0xf7,
+                                                   0x63, 0xe4, 0xfb, 0x63, 0xf7, 0x64, 0x32, 0xfb,
+                                                   0x64, 0xfb, 0x66, 0x6, 0xe, 0x20, 0x8b, 0xd9,
+                                                   0xf7, 0x57, 0xd8, 0xf7, 0x30, 0x77, 0x1, 0xf7,
+                                                   0x8b, 0xe4, 0x3, 0xb2, 0xf7, 0xa5, 0x15, 0xf7,
+                                                   0x64, 0xfb, 0x2e, 0xe4, 0xf7, 0x2e, 0xf7, 0x65,
+                                                   0xd8, 0xfb, 0x65, 0xf7, 0x30, 0x32, 0xfb, 0x30,
+                                                   0xfb, 0x64, 0x6, 0xfb, 0xf2, 0x4, 0xf8, 0x8e,
+                                                   0xd9, 0xfc, 0x8e, 0x6, 0xe, 0x66, 0xa, 0xbe,
+                                                   0xe5, 0xf7, 0xa6, 0xda, 0x3, 0xf8, 0x28, 0xc8,
+                                                   0x15, 0x8d, 0xfb, 0xa0, 0xe3, 0xf9, 0x71, 0x3b,
+                                                   0x48, 0x89, 0x6, 0xa3, 0x7c, 0x5b, 0xc2, 0x2d,
+                                                   0x1b, 0xfb, 0x27, 0x42, 0xfb, 0x10, 0xfb, 0x25,
+                                                   0xfb, 0x4c, 0xf5, 0x31, 0xf7, 0x6, 0xc9, 0xc8,
+                                                   0xaa, 0xae, 0xa5, 0x1f, 0xfb, 0xab, 0xf7, 0x64,
+                                                   0x15, 0xf7, 0x26, 0xcb, 0xc1, 0xcd, 0xdf, 0xd7,
+                                                   0x3c, 0xfb, 0xd, 0xfb, 0x30, 0x27, 0x5d, 0x4f,
+                                                   0x57, 0x3d, 0xab, 0xf7, 0x3e, 0x1e, 0xe, 0x8b,
+                                                   0xef, 0xf8, 0xbf, 0xd3, 0x12, 0xf7, 0x71, 0xeb,
+                                                   0x31, 0xdc, 0xec, 0xe2, 0x13, 0xd8, 0xf7, 0x77,
+                                                   0xf7, 0x44, 0x15, 0xdc, 0x6, 0x8d, 0xed, 0x97,
+                                                   0x9a, 0xce, 0xc8, 0x8, 0xc6, 0xc2, 0xb7, 0xb4,
+                                                   0xdc, 0x1a, 0xf7, 0x4, 0x30, 0xe3, 0xfb, 0x16,
+                                                   0x26, 0xfb, 0x6, 0x33, 0xfb, 0xa, 0x1e, 0xd8,
+                                                   0x81, 0x5, 0xe0, 0x99, 0xb4, 0xc6, 0xdf, 0x1b,
+                                                   0xd8, 0xc3, 0x4d, 0x49, 0x59, 0x6f, 0x6e, 0x62,
+                                                   0x66, 0x1f, 0x38, 0x40, 0x6c, 0x67, 0x90, 0xfb,
+                                                   0x10, 0x8, 0x13, 0xe8, 0x85, 0xfb, 0x44, 0x15,
+                                                   0xeb, 0xef, 0x2b, 0x6, 0xe, 0x3b, 0xfb, 0x5d,
+                                                   0xd3, 0xf8, 0xbf, 0xee, 0x12, 0xe6, 0xe5, 0xe0,
+                                                   0xef, 0x31, 0xdf, 0xe0, 0xdd, 0x13, 0xec, 0xf7,
+                                                   0xa8, 0xf7, 0xea, 0x15, 0x89, 0x29, 0x85, 0x86,
+                                                   0x46, 0x4e, 0x8, 0x4d, 0x54, 0x5d, 0x5c, 0x3a,
+                                                   0x1a, 0xfb, 0x4, 0xea, 0x37, 0xf7, 0x1b, 0xcc,
+                                                   0xf7, 0x21, 0xb8, 0xf7, 0x37, 0x1e, 0x39, 0x95,
+                                                   0x5, 0x3f, 0x8c, 0x63, 0x45, 0x35, 0x1b, 0x3b,
+                                                   0x50, 0xc5, 0xcd, 0xbd, 0xa9, 0xae, 0xb5, 0xb0,
+                                                   0x1f, 0xe1, 0xd6, 0xa5, 0xa5, 0x86, 0xf7, 0x10,
+                                                   0x8, 0x13, 0xf4, 0x2d, 0xdf, 0x15, 0xef, 0xee,
+                                                   0x27, 0x6, 0xe, 0xfb, 0xe4, 0xf8, 0x78, 0x76,
+                                                   0xf7, 0x93, 0x77, 0x1, 0xd1, 0xd8, 0xc8, 0xd8,
+                                                   0x3, 0xf7, 0x74, 0xf8, 0x63, 0x5c, 0xa, 0xfb,
+                                                   0xe, 0xfb, 0x1e, 0x5c, 0xa, 0xe, 0xfb, 0xfa,
+                                                   0xfb, 0x14, 0x76, 0xf7, 0x22, 0xf7, 0x5, 0x1,
+                                                   0xdb, 0xbb, 0xf7, 0xb, 0xbb, 0x3, 0xad, 0x84,
+                                                   0x48, 0xa, 0xf7, 0x3b, 0xfb, 0x5, 0x48, 0xa,
+                                                   0xe, 0xfb, 0xfa, 0xf8, 0x6a, 0xf7, 0x6, 0xf7,
+                                                   0x21, 0x77, 0x1, 0xb1, 0xbb, 0xf7, 0xb, 0xbb,
+                                                   0x3, 0xf7, 0x61, 0xf8, 0x6a, 0x47, 0xa, 0xfb,
+                                                   0x3b, 0x2f, 0x47, 0xa, 0xe, 0xfb, 0xfa, 0xf8,
+                                                   0x78, 0x76, 0xf7, 0x21, 0xf7, 0x6, 0x12, 0xdb,
+                                                   0xbb, 0xf7, 0xb, 0xbb, 0x17, 0xbb, 0xf8, 0x63,
+                                                   0x15, 0x13, 0xf0, 0x4d, 0xa, 0xf7, 0x51, 0x69,
+                                                   0x15, 0x13, 0x50, 0x4d, 0xa, 0xe, 0xfc, 0x69,
+                                                   0xf8, 0x6a, 0xef, 0xf7, 0x2f, 0x77, 0x1, 0xcc,
+                                                   0xba, 0x3, 0xcc, 0xf8, 0x6a, 0x15, 0xe8, 0xef,
+                                                   0x5d, 0x6, 0x8c, 0xa7, 0x90, 0xd3, 0xbe, 0xa0,
+                                                   0x75, 0xad, 0x18, 0x3b, 0x67, 0x89, 0x2f, 0x5a,
+                                                   0x1a, 0xe, 0xfc, 0x69, 0xf8, 0x78, 0x76, 0x1,
+                                                   0xf7, 0x2, 0xba, 0x3, 0xd6, 0xf8, 0x63, 0x15,
+                                                   0xdb, 0xaf, 0x8d, 0xd6, 0xbc, 0x1a, 0xea, 0x2e,
+                                                   0xfb, 0x9, 0xb9, 0x7, 0x8a, 0x6f, 0x86, 0x54,
+                                                   0x58, 0x76, 0x8, 0xe, 0xfc, 0x69, 0x85, 0xf7,
+                                                   0x4, 0x1, 0xf7, 0x1, 0xbb, 0x3, 0xca, 0x85,
+                                                   0x15, 0xb9, 0x6, 0x8a, 0x6f, 0x87, 0x4f, 0x58,
+                                                   0x76, 0xa1, 0x69, 0x18, 0xdb, 0xaf, 0x8d, 0xdb,
+                                                   0xbc, 0x1a, 0xe5, 0x2d, 0x7, 0xe, 0xfc, 0x88,
+                                                   0xf8, 0x78, 0x76, 0xf7, 0x93, 0x77, 0x1, 0xc6,
+                                                   0xd4, 0x3, 0xdb, 0xf8, 0x63, 0x15, 0xa9, 0x6,
+                                                   0xa1, 0xf7, 0x1e, 0x5, 0xf7, 0x9, 0x42, 0xfb,
+                                                   0x9, 0x7, 0xe, 0xfb, 0xfa, 0xa0, 0x76, 0xf8,
+                                                   0x55, 0xe4, 0x12, 0x85, 0xe3, 0x17, 0xd8, 0x16,
+                                                   0xe3, 0xf7, 0xac, 0x6, 0xd7, 0x9b, 0xe8, 0xc3,
+                                                   0xa2, 0xa0, 0x8a, 0x78, 0xa0, 0x1e, 0xa9, 0xdd,
+                                                   0x5, 0x92, 0x82, 0x78, 0x9f, 0x5e, 0x1b, 0x4c,
+                                                   0x7a, 0x5f, 0x63, 0x77, 0x1f, 0x13, 0xe0, 0x89,
+                                                   0xd4, 0x3b, 0x6, 0xe, 0xb9, 0x78, 0xca, 0xf7,
+                                                   0xab, 0xc3, 0xf7, 0xe, 0xc2, 0xf7, 0xa, 0xca,
+                                                   0x1, 0x7d, 0xca, 0xf7, 0x2e, 0xcd, 0xf7, 0x49,
+                                                   0xd2, 0xf7, 0x3c, 0xca, 0x3, 0xf7, 0x5f, 0xf7,
+                                                   0x2a, 0x15, 0xcd, 0xf7, 0x41, 0xb3, 0x6, 0xc0,
+                                                   0x9e, 0x76, 0x33, 0xbd, 0x1f, 0xb0, 0x4b, 0x5,
+                                                   0xdc, 0x6, 0x59, 0xda, 0x58, 0xdc, 0x7a, 0x97,
+                                                   0x73, 0x95, 0x19, 0x9d, 0xeb, 0x94, 0xef, 0xec,
+                                                   0x2a, 0x9d, 0x3c, 0x1f, 0xfb, 0x22, 0x6, 0xcd,
+                                                   0xfb, 0x45, 0x15, 0xf7, 0xe, 0xd7, 0x7, 0xb4,
+                                                   0xcb, 0x8b, 0x4f, 0x4d, 0x41, 0x8b, 0x6c, 0x1f,
+                                                   0xfb, 0xfb, 0x78, 0x15, 0xfb, 0x66, 0xf7, 0x41,
+                                                   0xfb, 0x3d, 0xf7, 0x68, 0xf7, 0x68, 0xf7, 0x3d,
+                                                   0xf7, 0x3e, 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x3f,
+                                                   0xf7, 0x3c, 0xfb, 0x66, 0xfb, 0x66, 0xfb, 0x43,
+                                                   0xfb, 0x3b, 0xfb, 0x66, 0x1e, 0xca, 0x16, 0xf7,
+                                                   0x42, 0xf7, 0x25, 0xf7, 0x20, 0xf7, 0x44, 0xf7,
+                                                   0x44, 0xf7, 0x23, 0xfb, 0x20, 0xfb, 0x42, 0xfb,
+                                                   0x43, 0xfb, 0x23, 0xfb, 0x21, 0xfb, 0x44, 0xfb,
+                                                   0x44, 0xfb, 0x25, 0xf7, 0x21, 0xf7, 0x43, 0x1e,
+                                                   0xe, 0xfb, 0xfa, 0xf8, 0xd0, 0xb1, 0xf7, 0x0,
+                                                   0xb1, 0x1, 0xd6, 0xb1, 0xf7, 0x0, 0xb1, 0x3,
+                                                   0xd6, 0xf9, 0x2e, 0x15, 0x57, 0xb3, 0x61, 0xbe,
+                                                   0xbf, 0xb4, 0xb5, 0xbf, 0xbe, 0x62, 0xb2, 0x57,
+                                                   0x58, 0x63, 0x64, 0x58, 0x1e, 0xb1, 0x16, 0xa6,
+                                                   0xa1, 0xa4, 0xaa, 0xab, 0xa2, 0x74, 0x6e, 0x6c,
+                                                   0x73, 0x72, 0x6c, 0x6f, 0x72, 0xa1, 0xad, 0x1e,
+                                                   0xe, 0xfb, 0x53, 0x7c, 0xd3, 0xf8, 0x2d, 0xd3,
+                                                   0x1, 0xc8, 0xe0, 0xf7, 0x78, 0xe5, 0x3, 0xab,
+                                                   0xf7, 0x2f, 0x15, 0x57, 0x94, 0xa3, 0xfb, 0xa,
+                                                   0xf7, 0x50, 0x1b, 0xf7, 0x1b, 0xd7, 0xd3, 0xe1,
+                                                   0xf6, 0x3f, 0xa9, 0xfb, 0x1c, 0xae, 0x1f, 0x36,
+                                                   0xa1, 0x66, 0x91, 0xb7, 0x1a, 0xc6, 0xd2, 0x9f,
+                                                   0xae, 0xae, 0xd5, 0x83, 0x6c, 0xa, 0xf6, 0xfb,
+                                                   0x4a, 0x1b, 0xfb, 0x11, 0x49, 0x44, 0x3b, 0xfb,
+                                                   0x0, 0xf1, 0x73, 0xda, 0x78, 0x1f, 0xf7, 0x2,
+                                                   0x70, 0xb1, 0x73, 0x61, 0x1a, 0x68, 0x6c, 0x58,
+                                                   0x30, 0x38, 0x62, 0xb5, 0xd0, 0x82, 0x1e, 0xe,
+                                                   0xfb, 0x53, 0x7c, 0xd3, 0xf8, 0x22, 0xd3, 0xf7,
+                                                   0x63, 0x77, 0x1, 0xb9, 0xe0, 0xf7, 0x87, 0xe5,
+                                                   0x3, 0xab, 0xf7, 0x2c, 0x15, 0x57, 0x94, 0xa3,
+                                                   0xfb, 0x7, 0xf7, 0x50, 0x1b, 0xf7, 0x1b, 0xd7,
+                                                   0xd0, 0xe1, 0xf6, 0x40, 0x9c, 0xfb, 0x1c, 0xae,
+                                                   0x1f, 0x36, 0xa1, 0x66, 0xa2, 0xb7, 0x1a, 0xc6,
+                                                   0xd2, 0x93, 0xae, 0xae, 0xd5, 0x85, 0x6c, 0xa,
+                                                   0xf4, 0xfb, 0x4a, 0x1b, 0xfb, 0x11, 0x49, 0x46,
+                                                   0x3b, 0xfb, 0x0, 0xf1, 0x70, 0xda, 0x78, 0x1f,
+                                                   0xf7, 0x2, 0x70, 0xb0, 0x7c, 0x61, 0x1a, 0x68,
+                                                   0x6d, 0x5b, 0x30, 0x38, 0x61, 0xb2, 0xd0, 0x82,
+                                                   0x1e, 0xe2, 0xf8, 0x44, 0x37, 0xa, 0xfb, 0x53,
+                                                   0xd4, 0xf9, 0xa4, 0xd2, 0x1, 0xd4, 0x7a, 0x15,
+                                                   0xfb, 0x10, 0x9b, 0xe6, 0x59, 0xf4, 0x1b, 0xf7,
+                                                   0x9, 0xd7, 0xd0, 0xe4, 0xd8, 0x4f, 0xb8, 0x79,
+                                                   0x99, 0x1f, 0xb5, 0x9c, 0xd1, 0x98, 0xe7, 0x1a,
+                                                   0xe7, 0x3f, 0xc6, 0x27, 0xc6, 0x1e, 0x49, 0xb3,
+                                                   0x2d, 0xbf, 0xc4, 0x1a, 0xb2, 0xaa, 0xb6, 0xc8,
+                                                   0xe0, 0x9e, 0x46, 0x66, 0x92, 0x1e, 0xe6, 0x95,
+                                                   0x5, 0xf7, 0x8, 0xfb, 0x15, 0xbe, 0x47, 0xfb,
+                                                   0x14, 0x52, 0x32, 0x4b, 0x50, 0xb0, 0x68, 0xa7,
+                                                   0x73, 0x1e, 0x3f, 0x74, 0x69, 0x4f, 0x54, 0x1a,
+                                                   0x2a, 0xe2, 0x55, 0xda, 0x5c, 0x1e, 0xda, 0x5a,
+                                                   0xb0, 0x6f, 0xa2, 0x79, 0x8, 0xaf, 0x6f, 0x91,
+                                                   0x76, 0x77, 0x1a, 0x6d, 0x73, 0x55, 0x3a, 0x28,
+                                                   0x7b, 0xd5, 0xb2, 0x82, 0x1e, 0xf7, 0x57, 0xf7,
+                                                   0x20, 0x15, 0x78, 0x99, 0x6f, 0x9c, 0x4b, 0xb0,
+                                                   0x8, 0x3b, 0xba, 0x60, 0xa5, 0xbf, 0x1a, 0xbf,
+                                                   0xba, 0xb0, 0xa6, 0x9a, 0x1e, 0xa3, 0x77, 0xab,
+                                                   0x76, 0xb5, 0x71, 0x8, 0xd9, 0x5b, 0xc3, 0x62,
+                                                   0x58, 0x1a, 0x70, 0x79, 0x67, 0x55, 0x70, 0x1e,
+                                                   0xe, 0xfc, 0x31, 0xfb, 0x12, 0x76, 0xf8, 0xc8,
+                                                   0xee, 0x1, 0xe3, 0xf2, 0x3, 0xe3, 0x85, 0x15,
+                                                   0xc8, 0x6, 0x8a, 0x61, 0x7d, 0x62, 0x5c, 0x76,
+                                                   0xa3, 0x66, 0x18, 0xd2, 0xa4, 0x94, 0xdd, 0xad,
+                                                   0x1a, 0xee, 0x24, 0x7, 0xf7, 0xd8, 0x4, 0xf2,
+                                                   0xee, 0x24, 0x6, 0xe, 0xa0, 0x76, 0xf9, 0xa,
+                                                   0xdc, 0x1, 0xf7, 0x23, 0xe9, 0x3, 0xf7, 0x23,
+                                                   0x16, 0xe9, 0x6, 0xa2, 0xf7, 0xcc, 0xf7, 0x54,
+                                                   0xf7, 0x85, 0xd2, 0xd2, 0x8, 0xcb, 0xfc, 0x7a,
+                                                   0x3a, 0xf8, 0x3, 0x7, 0xfb, 0x3b, 0xfb, 0x46,
+                                                   0x2f, 0xfb, 0x9e, 0x89, 0xfb, 0x37, 0x8, 0xe,
+                                                   0x78, 0xd2, 0xf7, 0xd8, 0xd7, 0xf7, 0x48, 0xd2,
+                                                   0x1, 0xc4, 0xf3, 0xf7, 0x9d, 0xe7, 0x3, 0xf7,
+                                                   0x14, 0xf7, 0xfa, 0x15, 0xf7, 0x4, 0xb3, 0xf7,
+                                                   0x36, 0xf7, 0xd, 0xed, 0xa3, 0x36, 0x70, 0x91,
+                                                   0x1e, 0xe5, 0x93, 0x5, 0xf7, 0x1b, 0x78, 0xfb,
+                                                   0x6, 0xb3, 0x36, 0x1b, 0xfb, 0x88, 0x84, 0xfb,
+                                                   0xb4, 0x30, 0xfb, 0x43, 0xb6, 0xfb, 0x3c, 0xf7,
+                                                   0x64, 0xf7, 0x2d, 0xd7, 0xf7, 0xa, 0xf7, 0xa,
+                                                   0xf7, 0x20, 0xfb, 0x6, 0xea, 0xfb, 0x7, 0x40,
+                                                   0x5d, 0x69, 0x4f, 0x65, 0x1f, 0x97, 0xfb, 0x1c,
+                                                   0x15, 0xf1, 0xd8, 0xbf, 0xd1, 0xe3, 0xbc, 0x45,
+                                                   0x32, 0x38, 0x5b, 0x39, 0x32, 0x31, 0x52, 0xdc,
+                                                   0xe4, 0x1e, 0xe, 0xfc, 0x31, 0x8d, 0x76, 0x1,
+                                                   0x7a, 0xf7, 0xcc, 0x3, 0x7a, 0x78, 0x15, 0xd2,
+                                                   0x6, 0xf7, 0x85, 0xf9, 0x88, 0x5, 0x4c, 0x6,
+                                                   0xe, 0xfc, 0x31, 0xe, 0x7b, 0xda, 0x6a, 0xd3,
+                                                   0xf7, 0x6c, 0xd2, 0xf7, 0x96, 0xd2, 0x12, 0xe8,
+                                                   0xe3, 0x67, 0xe7, 0x13, 0x78, 0xac, 0xd0, 0x15,
+                                                   0xac, 0x37, 0x5, 0xa7, 0xb5, 0xc4, 0x9c, 0xbb,
+                                                   0x1b, 0x13, 0xb8, 0xca, 0xe3, 0x5d, 0xc7, 0x1b,
+                                                   0xb5, 0xab, 0x98, 0x9c, 0xb4, 0x1f, 0x6f, 0xdb,
+                                                   0x5, 0x83, 0x7a, 0x64, 0x74, 0x68, 0x1b, 0x13,
+                                                   0x74, 0x43, 0x54, 0xb2, 0x41, 0x1b, 0x6d, 0x73,
+                                                   0x85, 0x86, 0x7e, 0x1f, 0x89, 0x8d, 0x5, 0xbb,
+                                                   0xbc, 0xb2, 0xca, 0xd1, 0x1a, 0xa0, 0x86, 0x95,
+                                                   0x86, 0x97, 0x1e, 0xf7, 0x1b, 0xd2, 0xfb, 0x2a,
+                                                   0x6, 0x13, 0xb8, 0x7e, 0xb1, 0x79, 0xbf, 0xb0,
+                                                   0x1a, 0xc6, 0xbd, 0xd3, 0xd8, 0xc9, 0xc2, 0x60,
+                                                   0x39, 0x95, 0x1e, 0xe1, 0x98, 0x5, 0xf7, 0x4,
+                                                   0x84, 0x26, 0xd2, 0x22, 0x1b, 0x20, 0xfb, 0x0,
+                                                   0x4c, 0xfb, 0x1f, 0x67, 0x92, 0x6d, 0x9c, 0x4e,
+                                                   0x1f, 0x42, 0x44, 0xe8, 0x6, 0x13, 0xb4, 0x8f,
+                                                   0x7b, 0x8f, 0x7c, 0x6e, 0x1a, 0xfb, 0xc, 0x34,
+                                                   0x54, 0x72, 0x7d, 0x1e, 0xe, 0xfc, 0x31, 0x99,
+                                                   0x76, 0xf8, 0x52, 0xcf, 0xf7, 0x36, 0x77, 0x1,
+                                                   0xdc, 0xe3, 0x3, 0xf7, 0x95, 0x8c, 0x15, 0x7f,
+                                                   0xd9, 0x5, 0x54, 0x7e, 0x76, 0x93, 0xd4, 0x1a,
+                                                   0xf7, 0xb8, 0xe3, 0xcf, 0x33, 0xf7, 0x36, 0x7,
+                                                   0x33, 0x56, 0x5, 0xfb, 0x1, 0x48, 0x47, 0xce,
+                                                   0xfb, 0xb8, 0x7, 0x35, 0x90, 0x47, 0xf7, 0x6,
+                                                   0xa8, 0x98, 0x90, 0x8e, 0x9a, 0x1e, 0xe, 0xfb,
+                                                   0x4e, 0x76, 0xf7, 0x57, 0xd4, 0xf8, 0x20, 0xd4,
+                                                   0xf7, 0x50, 0x77, 0x12, 0xc5, 0xda, 0x3c, 0xe3,
+                                                   0xf7, 0xad, 0xe5, 0x13, 0xf6, 0xf7, 0x26, 0xc1,
+                                                   0x15, 0x6c, 0xa8, 0xaf, 0x68, 0xd6, 0x1b, 0xf7,
+                                                   0x2, 0xf7, 0xd, 0xdd, 0xf7, 0x4e, 0xf7, 0x25,
+                                                   0x37, 0xf7, 0x15, 0xfb, 0x27, 0x3c, 0x6d, 0x6a,
+                                                   0x6a, 0x6c, 0x1f, 0xf7, 0x92, 0x33, 0xfe, 0x31,
+                                                   0xe3, 0x7, 0x13, 0xfa, 0x82, 0xf8, 0x63, 0x15,
+                                                   0xf7, 0xd, 0xcc, 0xdb, 0xdf, 0xcd, 0xd6, 0x53,
+                                                   0xfb, 0x25, 0xfb, 0x3e, 0x32, 0x72, 0x57, 0x4f,
+                                                   0x32, 0xb2, 0xf7, 0x30, 0x1e, 0xe, 0x78, 0xd2,
+                                                   0xf8, 0xd8, 0xd2, 0x1, 0xf8, 0x29, 0xe9, 0x3,
+                                                   0xad, 0xf7, 0x47, 0x15, 0x28, 0x95, 0xd8, 0x28,
+                                                   0xf7, 0x2b, 0x1b, 0xf7, 0x13, 0xf7, 0xf, 0xdd,
+                                                   0xf7, 0x1e, 0xd2, 0x4f, 0xf0, 0x3b, 0x1f, 0x8d,
+                                                   0x7, 0xe4, 0xb0, 0x99, 0xd2, 0xb0, 0x1a, 0xf1,
+                                                   0x30, 0xdc, 0xfb, 0x12, 0x3d, 0xfb, 0xa, 0x6a,
+                                                   0xfb, 0x2a, 0x6e, 0x1e, 0xe7, 0x7b, 0x5, 0xd1,
+                                                   0x96, 0xb3, 0xc5, 0xdf, 0x1b, 0xc5, 0xca, 0x66,
+                                                   0x40, 0x24, 0xfb, 0x6, 0x77, 0x57, 0x90, 0x1f,
+                                                   0x80, 0x3f, 0x5, 0xf4, 0xad, 0xf4, 0x51, 0x24,
+                                                   0x1a, 0x38, 0x48, 0x4b, 0x36, 0xfb, 0x9, 0x75,
+                                                   0xf3, 0xae, 0x84, 0x1e, 0xe, 0xf7, 0x23, 0x8d,
+                                                   0x76, 0xdc, 0xbe, 0xf7, 0x77, 0xc2, 0xf7, 0x6,
+                                                   0xf7, 0x56, 0x56, 0xc0, 0x12, 0xf7, 0x8f, 0xd7,
+                                                   0x50, 0xd7, 0xf7, 0xec, 0xd1, 0x13, 0xf3, 0xf8,
+                                                   0x89, 0xc9, 0x15, 0xf7, 0x4f, 0x43, 0xd1, 0xd3,
+                                                   0xbf, 0xbe, 0x57, 0xf7, 0x78, 0x4f, 0x6, 0xfb,
+                                                   0x59, 0xfb, 0x71, 0x5, 0xd6, 0x84, 0x15, 0xf7,
+                                                   0x4, 0xf7, 0x10, 0x5, 0xfb, 0x10, 0x7, 0xfd,
+                                                   0x17, 0xf7, 0xdc, 0x15, 0x51, 0x97, 0xae, 0x60,
+                                                   0xee, 0x1b, 0xef, 0xc0, 0xc1, 0xc2, 0xbd, 0x68,
+                                                   0xa7, 0x5a, 0x96, 0x1f, 0x8d, 0x7, 0x13, 0xed,
+                                                   0xbb, 0x97, 0x9e, 0xa3, 0xab, 0x1a, 0xe3, 0xfb,
+                                                   0x8, 0x92, 0x78, 0x31, 0x70, 0x68, 0x54, 0x75,
+                                                   0x1e, 0xd1, 0x80, 0x5, 0xa7, 0x96, 0x99, 0x9f,
+                                                   0xb7, 0x1b, 0xb5, 0x9c, 0x77, 0x75, 0x63, 0x59,
+                                                   0x83, 0x70, 0x1f, 0x13, 0xf3, 0x81, 0x58, 0x5,
+                                                   0xc1, 0x8d, 0xbd, 0x7d, 0x5b, 0x1a, 0x65, 0x69,
+                                                   0x7b, 0x60, 0x53, 0x7e, 0xae, 0x9d, 0x85, 0x1e,
+                                                   0xa5, 0xfc, 0x67, 0x15, 0xd8, 0x6, 0xf8, 0xaf,
+                                                   0xf9, 0x66, 0x5, 0x3f, 0x6, 0xe, 0xfb, 0xfa,
+                                                   0xf7, 0xa2, 0xcd, 0xf7, 0xc4, 0xca, 0x1, 0xf7,
+                                                   0x76, 0xdc, 0x3, 0x90, 0xf8, 0x1c, 0x15, 0x46,
+                                                   0x98, 0xb1, 0x56, 0xf5, 0x1b, 0xf5, 0xc4, 0xcc,
+                                                   0xcd, 0xc7, 0x66, 0xac, 0x56, 0x98, 0x1f, 0x8d,
+                                                   0x7, 0xbf, 0x9a, 0x9f, 0xa8, 0xb0, 0x1a, 0xf4,
+                                                   0xfb, 0x11, 0x93, 0x77, 0x2b, 0x6f, 0x62, 0x49,
+                                                   0x74, 0x1e, 0xd5, 0x7f, 0x5, 0xab, 0x97, 0x99,
+                                                   0xa3, 0xba, 0x1b, 0xb8, 0x9e, 0x73, 0x71, 0x5b,
+                                                   0x55, 0x82, 0x6f, 0x1f, 0x80, 0x4e, 0x5, 0xc5,
+                                                   0x8c, 0xc0, 0x7c, 0x52, 0x1a, 0x5e, 0x67, 0x77,
+                                                   0x5d, 0x4f, 0x7c, 0xb6, 0xa0, 0x85, 0x1e, 0xe,
+                                                   0xfb, 0xfa, 0xf9, 0x37, 0xba, 0x1, 0x87, 0xf8,
+                                                   0xf2, 0x15, 0xce, 0x6, 0xbb, 0xad, 0x8b, 0x8f,
+                                                   0xa0, 0x9f, 0x81, 0x80, 0x9f, 0x1e, 0x7f, 0xa2,
+                                                   0xa2, 0x7d, 0xa2, 0x1b, 0xa1, 0xdf, 0x91, 0xf7,
+                                                   0x1, 0x1f, 0x49, 0x6, 0x68, 0x87, 0x7c, 0x7f,
+                                                   0x76, 0x1b, 0x78, 0x7b, 0x92, 0x94, 0x7c, 0x1f,
+                                                   0x98, 0x73, 0x74, 0x9c, 0x6a, 0x1b, 0x59, 0x54,
+                                                   0x66, 0x3d, 0x1f, 0xe, 0xf7, 0xc9, 0xf7, 0xdb,
+                                                   0x76, 0xf7, 0xf5, 0xc6, 0x1, 0xf7, 0x5b, 0xcd,
+                                                   0xf7, 0x8b, 0xc8, 0xf7, 0xa1, 0xc8, 0x3, 0xf7,
+                                                   0x5b, 0xf7, 0xc6, 0x15, 0xcd, 0xf7, 0xf5, 0xf7,
+                                                   0x2f, 0xc6, 0xfc, 0xa, 0x50, 0xf7, 0x2d, 0x6,
+                                                   0xf7, 0xcd, 0xfb, 0xf5, 0x15, 0xc8, 0xf7, 0xf5,
+                                                   0x8d, 0x6, 0xf4, 0xfb, 0xf5, 0x5, 0xc7, 0x6,
+                                                   0xef, 0xf7, 0xf0, 0x5, 0x8d, 0xfb, 0xf0, 0xc8,
+                                                   0xf8, 0x30, 0x2b, 0x6, 0x2b, 0xfb, 0xe0, 0x5,
+                                                   0x89, 0x6, 0x28, 0xf7, 0xe0, 0x5, 0x29, 0x6,
+                                                   0xe, 0x8b, 0xde, 0xf8, 0xbc, 0xd4, 0x1, 0xf8,
+                                                   0x32, 0xe6, 0x3, 0xa5, 0x16, 0xf8, 0x75, 0xde,
+                                                   0xfb, 0xfa, 0x6, 0x97, 0x9e, 0x97, 0xa3, 0xdb,
+                                                   0xc9, 0x8, 0xf7, 0x25, 0xf7, 0x4, 0xf6, 0xf5,
+                                                   0xf1, 0x1a, 0xe1, 0x4c, 0xf7, 0x1, 0xfb, 0x38,
+                                                   0xfb, 0xe, 0x2b, 0x49, 0xfb, 0x1c, 0x7d, 0x1e,
+                                                   0xe6, 0x81, 0x5, 0xf7, 0x20, 0x8c, 0xf7, 0x11,
+                                                   0x8a, 0x9a, 0x1b, 0xda, 0xc4, 0x5a, 0x44, 0x37,
+                                                   0xfb, 0x0, 0x2d, 0x3d, 0x4f, 0x1f, 0x38, 0x4a,
+                                                   0xfb, 0xb, 0x2d, 0xfb, 0x5, 0x1a, 0xe, 0xfb,
+                                                   0xfa, 0xf7, 0xa0, 0xcd, 0xf7, 0xc7, 0xc9, 0x1,
+                                                   0xf7, 0x84, 0xdb, 0x3, 0x8f, 0xf7, 0xad, 0x15,
+                                                   0xf7, 0xd3, 0xcd, 0xfb, 0x5d, 0x6, 0x95, 0x96,
+                                                   0x95, 0x95, 0xc5, 0xbb, 0x8, 0xd3, 0xc4, 0xbb,
+                                                   0xa8, 0xd3, 0x1a, 0xf7, 0x4, 0x2b, 0x9c, 0x54,
+                                                   0xfb, 0x11, 0x77, 0x38, 0x64, 0x81, 0x1e, 0xd5,
+                                                   0x83, 0x5, 0xab, 0x95, 0x95, 0xaf, 0xc4, 0x1b,
+                                                   0xb6, 0xab, 0x70, 0x63, 0x65, 0x72, 0x78, 0x3d,
+                                                   0x4b, 0x1f, 0x47, 0x55, 0x50, 0x53, 0x85, 0x4d,
+                                                   0x8, 0xe, 0x7c, 0xd7, 0x63, 0x76, 0xf8, 0x9f,
+                                                   0x77, 0x4e, 0xa, 0x13, 0x78, 0xf8, 0x2e, 0x16,
+                                                   0xda, 0xf8, 0x9f, 0x33, 0xfb, 0xb8, 0x6, 0x13,
+                                                   0xb8, 0x33, 0x5b, 0x39, 0x30, 0x36, 0x76, 0xd9,
+                                                   0xe3, 0x1e, 0xf7, 0xbc, 0x33, 0xfb, 0xda, 0x7,
+                                                   0xfb, 0x8, 0xca, 0x2b, 0xf7, 0x17, 0xa4, 0xcc,
+                                                   0x91, 0xe0, 0xc3, 0x1e, 0x8d, 0x6, 0xe, 0x79,
+                                                   0xa, 0xf8, 0xec, 0xf7, 0x1d, 0x34, 0xa, 0xfb,
+                                                   0x4f, 0xf8, 0xa0, 0x2f, 0xa, 0xe, 0x79, 0xa,
+                                                   0xf9, 0x75, 0x77, 0x34, 0xa, 0xfb, 0xb2, 0xf8,
+                                                   0xa0, 0x2c, 0xa, 0xe, 0x79, 0xa, 0xf8, 0xf5,
+                                                   0xef, 0x12, 0xcf, 0xe3, 0x7e, 0xe5, 0xe6, 0xe5,
+                                                   0x7e, 0xe3, 0x3c, 0xda, 0x13, 0x71, 0xf8, 0x2e,
+                                                   0x88, 0x15, 0xda, 0xf8, 0x9c, 0x6, 0x13, 0xb2,
+                                                   0x33, 0xfb, 0xa8, 0x6, 0x32, 0xa, 0x1e, 0x13,
+                                                   0x69, 0x65, 0xa, 0x1f, 0xfb, 0x9f, 0xf8, 0xa9,
+                                                   0x31, 0xa, 0x13, 0xb4, 0xf7, 0x49, 0x72, 0xa,
+                                                   0x79, 0xa, 0xf8, 0xec, 0xf7, 0x1d, 0x3d, 0xa,
+                                                   0x33, 0x6, 0x13, 0xb8, 0xfb, 0xa8, 0x7, 0x32,
+                                                   0xa, 0x65, 0xa, 0x1e, 0x13, 0xb4, 0xfb, 0x28,
+                                                   0xf8, 0xa0, 0x5e, 0xa, 0xfb, 0x11, 0xbd, 0x1,
+                                                   0x40, 0x4, 0x59, 0xf8, 0xc0, 0xbd, 0x7, 0xe,
+                                                   0xfb, 0x53, 0x68, 0xa, 0xf7, 0x64, 0x16, 0xdd,
+                                                   0x6, 0xf7, 0x5e, 0xf8, 0x9f, 0x5, 0x31, 0x6,
+                                                   0xfb, 0x2d, 0xfc, 0x38, 0xfb, 0x28, 0xf8, 0x38,
+                                                   0x5, 0x2e, 0x6, 0xe, 0xaa, 0x68, 0xa, 0xf7,
+                                                   0x41, 0x16, 0xe7, 0x6, 0xe9, 0xf8, 0x28, 0x5,
+                                                   0x8d, 0x6, 0xf1, 0xfc, 0x28, 0x5, 0xe6, 0x6,
+                                                   0xf7, 0x2f, 0xf8, 0x9f, 0x5, 0x35, 0x6, 0xfb,
+                                                   0x2, 0xfc, 0x28, 0x5, 0x89, 0x6, 0x25, 0xf8,
+                                                   0x28, 0x5, 0x31, 0x6, 0x26, 0xfc, 0x33, 0xfb,
+                                                   0x5, 0xf8, 0x33, 0x5, 0x30, 0x6, 0xe, 0xfb,
+                                                   0x53, 0x68, 0xa, 0x96, 0x16, 0xf4, 0x6, 0xf7,
+                                                   0x1b, 0xf7, 0x60, 0xf7, 0x18, 0xfb, 0x60, 0x5,
+                                                   0xf6, 0x6, 0xfb, 0x52, 0xf7, 0xa6, 0xf7, 0x44,
+                                                   0xf7, 0x8d, 0x5, 0x23, 0x6, 0xfb, 0x10, 0xfb,
+                                                   0x4d, 0xfb, 0x7, 0xf7, 0x4d, 0x5, 0x20, 0x6,
+                                                   0xf7, 0x3f, 0xfb, 0x92, 0x5, 0xe, 0xfb, 0x53,
+                                                   0xfb, 0x6a, 0xdd, 0xf9, 0x23, 0x77, 0x1, 0xba,
+                                                   0xfb, 0x10, 0x15, 0x94, 0x3b, 0x55, 0xa, 0xa4,
+                                                   0xf7, 0x0, 0xf2, 0xbe, 0x1f, 0xf7, 0x5d, 0xf8,
+                                                   0xa2, 0x5, 0x32, 0x6, 0xfb, 0x28, 0xfc, 0x37,
+                                                   0x5, 0x89, 0x6, 0xfb, 0x24, 0xf8, 0x37, 0x5,
+                                                   0x2c, 0x6, 0xf7, 0x58, 0xfc, 0x9a, 0x5, 0x43,
+                                                   0x71, 0x81, 0x4a, 0x41, 0x1b, 0x76, 0x7b, 0x8f,
+                                                   0x8f, 0x7e, 0x1f, 0xe, 0xfb, 0x53, 0xfb, 0x6a,
+                                                   0xda, 0xf9, 0x70, 0xf7, 0x1d, 0x1, 0x33, 0xa,
+                                                   0xf7, 0x27, 0xf9, 0x62, 0x2f, 0xa, 0xe, 0xfb,
+                                                   0x53, 0xfb, 0x6a, 0xda, 0xf9, 0x79, 0xef, 0x1,
+                                                   0x96, 0xea, 0x94, 0xe5, 0xe6, 0xe5, 0x3, 0x33,
+                                                   0xa, 0xce, 0xf9, 0x6b, 0x2e, 0xa, 0xe, 0xa0,
+                                                   0x76, 0xf7, 0x39, 0xcf, 0xe3, 0xcf, 0xf7, 0xbf,
+                                                   0x77, 0x1, 0xf7, 0x7f, 0xe3, 0x3, 0xab, 0xf7,
+                                                   0x39, 0x15, 0xf7, 0x5f, 0xfb, 0x39, 0xe3, 0xf7,
+                                                   0x39, 0xf7, 0x5d, 0xcf, 0xfb, 0x5d, 0xe3, 0xf7,
+                                                   0x5d, 0xcf, 0xfb, 0x2f, 0x6, 0xf7, 0x4c, 0xf7,
+                                                   0xbf, 0x5, 0x23, 0x6, 0xfb, 0x40, 0xfb, 0xbf,
+                                                   0xfb, 0x44, 0xf7, 0xbf, 0x5, 0x29, 0x6, 0xf7,
+                                                   0x4d, 0xfb, 0xbf, 0x5, 0xfb, 0x30, 0x47, 0xf7,
+                                                   0x5f, 0x33, 0xfb, 0x5f, 0x6, 0xe, 0xfb, 0x53,
+                                                   0x8b, 0xd7, 0xf8, 0xb, 0xd3, 0x63, 0xa, 0xf8,
+                                                   0x1a, 0x67, 0xa, 0xfc, 0x10, 0x5, 0xe, 0xfb,
+                                                   0x53, 0x8b, 0xd7, 0xf8, 0x6, 0xd3, 0xf7, 0x6c,
+                                                   0x77, 0x63, 0xa, 0xf8, 0x15, 0x67, 0xa, 0xfc,
+                                                   0xb, 0x5, 0xf7, 0x43, 0xf8, 0xa2, 0x37, 0xa,
+                                                   0x78, 0xd2, 0xf8, 0xd8, 0xd2, 0x1, 0xbe, 0xe8,
+                                                   0xf7, 0xa6, 0xe8, 0x3, 0xb1, 0xf7, 0xec, 0x15,
+                                                   0x37, 0x92, 0xfb, 0xab, 0xf7, 0x7e, 0xf7, 0x7d,
+                                                   0x91, 0xf7, 0xb3, 0xd7, 0xd9, 0x88, 0xf7, 0xad,
+                                                   0xfb, 0x81, 0xfb, 0x71, 0x78, 0xfb, 0xaf, 0x3f,
+                                                   0x1e, 0xe7, 0x16, 0xf7, 0x21, 0xa1, 0xf7, 0x27,
+                                                   0xf7, 0x12, 0xf7, 0x1c, 0x96, 0xfb, 0x38, 0xfb,
+                                                   0x10, 0xfb, 0xd, 0x7e, 0xfb, 0x3f, 0xfb, 0x19,
+                                                   0xfb, 0x1c, 0x7e, 0xf7, 0x42, 0xf7, 0xa, 0x1e,
+                                                   0xe, 0x76, 0xa0, 0xf8, 0x9f, 0x9a, 0xf7, 0x48,
+                                                   0x9e, 0x6, 0xfb, 0x70, 0x98, 0x7, 0x1e, 0xa0,
+                                                   0x39, 0x63, 0xff, 0xc, 0x9, 0xd2, 0xa, 0xe2,
+                                                   0xb, 0xf8, 0xc0, 0x14, 0xf9, 0x47, 0x15, 0xab,
+                                                   0x13, 0x0, 0x5b, 0x2, 0x0, 0x1, 0x0, 0x7,
+                                                   0x0, 0x68, 0x0, 0x6d, 0x0, 0xbc, 0x0, 0xf0,
+                                                   0x1, 0x1e, 0x1, 0x23, 0x1, 0x4c, 0x1, 0x72,
+                                                   0x1, 0xac, 0x1, 0xd9, 0x1, 0xdf, 0x1, 0xee,
+                                                   0x2, 0xb, 0x2, 0x13, 0x2, 0x1c, 0x2, 0x34,
+                                                   0x2, 0x3a, 0x2, 0x50, 0x2, 0x84, 0x2, 0x96,
+                                                   0x2, 0x9f, 0x2, 0xa4, 0x2, 0xb4, 0x2, 0xb9,
+                                                   0x2, 0xc0, 0x2, 0xc7, 0x2, 0xee, 0x3, 0xf,
+                                                   0x3, 0x1d, 0x3, 0x24, 0x3, 0x2b, 0x3, 0x33,
+                                                   0x3, 0x3c, 0x3, 0x41, 0x3, 0x4b, 0x3, 0x54,
+                                                   0x3, 0x5c, 0x3, 0x62, 0x3, 0x78, 0x3, 0x8e,
+                                                   0x3, 0x97, 0x3, 0xa0, 0x3, 0xa5, 0x3, 0xa9,
+                                                   0x3, 0xbd, 0x3, 0xc4, 0x3, 0xcb, 0x3, 0xd3,
+                                                   0x3, 0xdc, 0x3, 0xe4, 0x3, 0xf5, 0x3, 0xff,
+                                                   0x4, 0x9, 0x4, 0x13, 0x4, 0x23, 0x4, 0x29,
+                                                   0x4, 0x2c, 0x4, 0x30, 0x4, 0x3e, 0x4, 0x4c,
+                                                   0x4, 0x59, 0x4, 0x5e, 0x4, 0x62, 0x4, 0x6c,
+                                                   0x4, 0x76, 0x4, 0x80, 0x4, 0x8c, 0x4, 0x98,
+                                                   0x4, 0x9e, 0x4, 0xa9, 0x4, 0xb4, 0x4, 0xbb,
+                                                   0x4, 0xc5, 0x4, 0xcf, 0x4, 0xd9, 0x4, 0xe3,
+                                                   0x4, 0xe7, 0x4, 0xeb, 0x4, 0xf4, 0x4, 0xfd,
+                                                   0x5, 0x6, 0x5, 0xa, 0x5, 0x11, 0x5, 0x15,
+                                                   0x5, 0x1b, 0x5, 0x21, 0x5, 0x27, 0x5, 0x2d,
+                                                   0x5, 0x32, 0x5, 0x35, 0x22, 0xa, 0x13, 0xbc,
+                                                   0x28, 0xa, 0x15, 0x2b, 0xa9, 0x2e, 0xc6, 0x44,
+                                                   0x1e, 0x46, 0xc6, 0xd7, 0x5c, 0xf7, 0x7, 0x1b,
+                                                   0xf7, 0x4f, 0xf7, 0x2b, 0xf7, 0x1a, 0xf7, 0x86,
+                                                   0x8e, 0x1f, 0xf6, 0x64, 0xf1, 0x52, 0xcf, 0x1e,
+                                                   0xd0, 0x53, 0x32, 0xb2, 0x27, 0x1b, 0x2c, 0x32,
+                                                   0x6a, 0x4a, 0x52, 0x1f, 0x53, 0x4a, 0x61, 0x24,
+                                                   0xfb, 0xb, 0x1a, 0xef, 0x16, 0xc0, 0x9c, 0xdd,
+                                                   0xb3, 0xc7, 0x1e, 0xc8, 0xb3, 0xbe, 0xb7, 0xe6,
+                                                   0x1b, 0xca, 0xcb, 0x73, 0x58, 0xb3, 0x1f, 0xb4,
+                                                   0x58, 0xac, 0x3a, 0x2e, 0x1a, 0x85, 0xfb, 0x61,
+                                                   0x2b, 0x35, 0xfb, 0x1f, 0x8a, 0x8, 0x40, 0x58,
+                                                   0xa9, 0xbe, 0x5f, 0x1f, 0x5f, 0xbf, 0x72, 0xd3,
+                                                   0xe2, 0x1a, 0xb, 0x24, 0xa, 0x25, 0xa, 0xb,
+                                                   0x15, 0x47, 0x9c, 0x45, 0xb2, 0x57, 0x1e, 0x57,
+                                                   0xb2, 0xbb, 0x67, 0xde, 0x1b, 0xf7, 0x24, 0xeb,
+                                                   0xec, 0xf7, 0x49, 0xee, 0x68, 0xcd, 0x5a, 0xb3,
+                                                   0x1f, 0xb4, 0x5a, 0x57, 0x9c, 0x54, 0x1b, 0x3c,
+                                                   0x5b, 0x6d, 0x5b, 0x63, 0x1f, 0x64, 0x5b, 0x77,
+                                                   0x4a, 0x43, 0x1a, 0xe5, 0x16, 0xf7, 0x27, 0x90,
+                                                   0xd2, 0xb7, 0xc7, 0x1b, 0xd2, 0xd7, 0x56, 0xfb,
+                                                   0x1e, 0x8e, 0x1f, 0x62, 0x82, 0x57, 0x73, 0x62,
+                                                   0x1e, 0x62, 0x73, 0x6d, 0x6c, 0x4c, 0x1b, 0x51,
+                                                   0x43, 0xc2, 0xf7, 0x2b, 0x85, 0x1f, 0xb, 0x15,
+                                                   0x90, 0xa0, 0x91, 0xa4, 0x9e, 0x9e, 0x8, 0x9f,
+                                                   0x9e, 0xa0, 0x99, 0xc2, 0x1b, 0xcb, 0xa1, 0x78,
+                                                   0x72, 0x9b, 0x1f, 0x9b, 0x73, 0x8a, 0x6a, 0x8a,
+                                                   0x6f, 0x54, 0x77, 0x40, 0x85, 0x79, 0x87, 0x8,
+                                                   0x60, 0x85, 0xfb, 0x2d, 0x78, 0xfb, 0x1d, 0x1a,
+                                                   0x33, 0xd9, 0x4b, 0xe8, 0xc3, 0xbb, 0x9b, 0xca,
+                                                   0xd6, 0x1e, 0xb, 0x8e, 0x7e, 0x99, 0x73, 0x9a,
+                                                   0x70, 0x8, 0xe7, 0x6, 0x6e, 0xbd, 0x7e, 0xad,
+                                                   0xf7, 0x19, 0x1a, 0xf7, 0xa, 0x7, 0x90, 0xe5,
+                                                   0x6e, 0xf3, 0xfb, 0x48, 0x8c, 0x8, 0x2b, 0x60,
+                                                   0x6f, 0x68, 0x6a, 0x1f, 0x6e, 0x68, 0x87, 0x64,
+                                                   0x85, 0x74, 0x8, 0xf7, 0xdb, 0xfb, 0x22, 0x15,
+                                                   0xb, 0xfc, 0xd0, 0x21, 0xa, 0xe, 0x99, 0x16,
+                                                   0xeb, 0x6, 0xd7, 0xf7, 0x77, 0x5, 0xf7, 0xb2,
+                                                   0x6, 0xdb, 0xfb, 0x77, 0x5, 0xf1, 0x6, 0xfb,
+                                                   0xab, 0xf9, 0x7c, 0x5, 0x2a, 0x6, 0x49, 0xfc,
+                                                   0x4b, 0x15, 0xf7, 0x4, 0xf7, 0xfd, 0x5, 0x8c,
+                                                   0x6, 0xf7, 0xb, 0xfb, 0xfd, 0x5, 0xb, 0x27,
+                                                   0x85, 0x45, 0x4c, 0x2a, 0x1b, 0x78, 0x7a, 0x92,
+                                                   0x9a, 0x7a, 0x1f, 0x7b, 0x9b, 0x84, 0x9c, 0x9e,
+                                                   0x1a, 0xae, 0x99, 0x9f, 0xa0, 0x97, 0x1e, 0xa0,
+                                                   0x97, 0x9d, 0x90, 0xa6, 0x8f, 0xbd, 0x94, 0xc7,
+                                                   0x94, 0xb1, 0x9a, 0x8, 0xe, 0x15, 0xf8, 0x2,
+                                                   0x6, 0xf7, 0x1c, 0x66, 0xd8, 0x55, 0xb0, 0x1e,
+                                                   0xb1, 0x55, 0x53, 0x90, 0x74, 0x1b, 0xfb, 0x38,
+                                                   0x8a, 0x4c, 0xfb, 0x8, 0x86, 0xfb, 0x32, 0x8,
+                                                   0x2d, 0xa, 0x7a, 0x7e, 0x3a, 0x22, 0x1b, 0x38,
+                                                   0x5d, 0xc3, 0xf7, 0x10, 0x7e, 0x1f, 0x90, 0xd3,
+                                                   0x15, 0x96, 0xce, 0xa2, 0xde, 0xf2, 0x8a, 0xec,
+                                                   0x8c, 0xab, 0x40, 0x90, 0x40, 0x8, 0xb, 0x41,
+                                                   0xa, 0xf9, 0x5d, 0x15, 0xfc, 0x2f, 0x7, 0xfb,
+                                                   0x13, 0x8f, 0xfb, 0x56, 0xf7, 0xa3, 0xf7, 0xac,
+                                                   0x95, 0xf7, 0x76, 0xea, 0x1e, 0xf8, 0x2f, 0x2c,
+                                                   0xfc, 0x2f, 0x7, 0xfb, 0x15, 0x78, 0x20, 0xfb,
+                                                   0x44, 0xfb, 0x48, 0x8b, 0xf7, 0x29, 0xe2, 0x1e,
+                                                   0xf8, 0x2f, 0x7, 0xb, 0xaa, 0x78, 0xe0, 0x2a,
+                                                   0xa, 0xb, 0x15, 0xef, 0x6, 0xc3, 0xde, 0xc0,
+                                                   0x38, 0x5, 0xef, 0x6, 0xfb, 0x2, 0x42, 0xa,
+                                                   0xb, 0x3b, 0x9f, 0x48, 0xb3, 0x5b, 0x1e, 0x5b,
+                                                   0xb4, 0xbe, 0x70, 0xdb, 0x1b, 0xcb, 0xb5, 0x9d,
+                                                   0xaa, 0xb0, 0x1f, 0xb2, 0xaa, 0xa4, 0xb5, 0x98,
+                                                   0xbc, 0x36, 0x96, 0x18, 0x6e, 0xb, 0x31, 0xa,
+                                                   0xf7, 0x49, 0x27, 0x31, 0xa, 0xb, 0x4c, 0xa,
+                                                   0xf7, 0x0, 0xf7, 0x1d, 0x38, 0xa, 0xb, 0x3,
+                                                   0xe1, 0x16, 0xf8, 0xa6, 0xe0, 0xfc, 0x47, 0xf7,
+                                                   0x90, 0xf8, 0x13, 0xe0, 0xfc, 0x13, 0xf7, 0x79,
+                                                   0xf8, 0x38, 0xe0, 0xfc, 0x97, 0x6, 0xb, 0x15,
+                                                   0xe5, 0xef, 0x31, 0x6, 0xb, 0x33, 0x6d, 0x2f,
+                                                   0x20, 0x24, 0x86, 0xdd, 0xe3, 0x1e, 0xf7, 0xb2,
+                                                   0x33, 0xfb, 0xd4, 0x7, 0xfb, 0x8, 0xcc, 0x2b,
+                                                   0xf7, 0x17, 0xb, 0xbb, 0xfb, 0xd, 0x15, 0x94,
+                                                   0x38, 0x55, 0xa, 0xa5, 0xec, 0xf2, 0xbe, 0x1f,
+                                                   0xf7, 0x5b, 0xf8, 0xa2, 0x5, 0x32, 0x6, 0xfb,
+                                                   0x27, 0xfc, 0x37, 0x5, 0x89, 0x6, 0xfb, 0x25,
+                                                   0xf8, 0x37, 0x5, 0x2c, 0x6, 0xf7, 0x59, 0xfc,
+                                                   0x9a, 0x5, 0x43, 0x71, 0x80, 0x52, 0x41, 0x1b,
+                                                   0x76, 0x7c, 0x95, 0x8f, 0x7e, 0x1f, 0xb, 0x3d,
+                                                   0xa, 0x6, 0x13, 0xb8, 0x33, 0xfb, 0xa8, 0x6,
+                                                   0x32, 0xa, 0x1e, 0x13, 0x74, 0x65, 0xa, 0x1f,
+                                                   0xb, 0x46, 0xa, 0xf9, 0x4, 0x77, 0x1, 0x27,
+                                                   0xa, 0xb, 0x6e, 0xa, 0x30, 0xa, 0xb, 0x15,
+                                                   0xe8, 0x6, 0xf5, 0x5a, 0xa, 0x27, 0x6, 0x53,
+                                                   0x38, 0x56, 0xde, 0x5, 0x27, 0x6, 0xe, 0x5,
+                                                   0xfb, 0x7, 0x6, 0xb, 0xa0, 0x76, 0xf9, 0x62,
+                                                   0x77, 0x1, 0xb, 0xf7, 0x10, 0xf8, 0xe9, 0x2c,
+                                                   0xa, 0xb, 0xe3, 0x3, 0xe4, 0x16, 0xe3, 0xf8,
+                                                   0x56, 0xf0, 0xcf, 0x26, 0xc0, 0x6, 0xc7, 0xb4,
+                                                   0xa5, 0xe0, 0x7c, 0x1e, 0x99, 0xd5, 0x5, 0x94,
+                                                   0x6f, 0x74, 0x8d, 0x74, 0x1b, 0xfb, 0x3, 0x60,
+                                                   0x2a, 0x4e, 0x1f, 0x58, 0x40, 0x47, 0xd6, 0x7,
+                                                   0xb, 0xb2, 0x86, 0xf7, 0x20, 0xfb, 0x1f, 0xfb,
+                                                   0x1a, 0x83, 0xfb, 0x19, 0x5d, 0x1e, 0xd4, 0x16,
+                                                   0xb1, 0x8a, 0xde, 0xd1, 0xc4, 0x98, 0x52, 0x4b,
+                                                   0x5d, 0x84, 0x40, 0x4c, 0x47, 0x8a, 0xd7, 0xb8,
+                                                   0x1e, 0xb, 0x4e, 0xa, 0x3c, 0xda, 0x13, 0x74,
+                                                   0xf8, 0x2e, 0x88, 0x15, 0xda, 0xf8, 0x9c, 0xb,
+                                                   0xf7, 0x23, 0xf8, 0xf2, 0x2e, 0xa, 0xb, 0xf7,
+                                                   0x73, 0xf8, 0xe9, 0x2f, 0xa, 0xb, 0x7d, 0xda,
+                                                   0x5f, 0x76, 0xf8, 0x5e, 0xd3, 0xb, 0x1, 0xda,
+                                                   0xea, 0xf8, 0xb, 0xea, 0x3, 0xda, 0xb, 0x5a,
+                                                   0xa, 0x2e, 0x6, 0xb, 0x73, 0x8b, 0xe0, 0xf7,
+                                                   0x90, 0xe0, 0xf7, 0x79, 0xe0, 0xb, 0x39, 0xa,
+                                                   0xce, 0xe3, 0x3, 0xce, 0x16, 0xe3, 0xb, 0x1,
+                                                   0xbc, 0xef, 0xf8, 0x74, 0xef, 0x3, 0xb, 0x5f,
+                                                   0xa, 0xf7, 0x77, 0xd9, 0xb, 0x15, 0xe9, 0xf7,
+                                                   0x6, 0x5d, 0x6, 0x8c, 0xa7, 0x8d, 0xc5, 0xbe,
+                                                   0xa0, 0x75, 0xad, 0x18, 0x3b, 0x67, 0x8b, 0x3d,
+                                                   0x5a, 0x1a, 0xb, 0x15, 0xb9, 0x6, 0x8a, 0x6f,
+                                                   0x89, 0x50, 0x58, 0x76, 0xa1, 0x69, 0x18, 0xdb,
+                                                   0xaf, 0x8b, 0xda, 0xbc, 0x1a, 0xe6, 0x2d, 0x7,
+                                                   0xb, 0x12, 0xba, 0xe9, 0xf7, 0x8d, 0xe3, 0x13,
+                                                   0x7c, 0xb, 0x7c, 0xd3, 0xf7, 0x48, 0xd3, 0xf7,
+                                                   0x29, 0xd3, 0xb, 0xfc, 0x31, 0xa0, 0x76, 0xb,
+                                                   0x15, 0xd3, 0x6, 0xb, 0xdb, 0xaf, 0x8b, 0xd9,
+                                                   0xbc, 0x1a, 0xe7, 0x2d, 0xfb, 0x6, 0xb9, 0x7,
+                                                   0x8a, 0x6f, 0x89, 0x51, 0x58, 0x76, 0x8, 0xb,
+                                                   0x12, 0xcf, 0xe3, 0xf7, 0x89, 0xe3, 0xb, 0xe2,
+                                                   0x78, 0xdf, 0xf8, 0xe4, 0xe0, 0xb, 0xfd, 0x72,
+                                                   0x15, 0xe3, 0xf8, 0x99, 0x7a, 0xa, 0xfe, 0x35,
+                                                   0x15, 0xea, 0xf9, 0x60, 0x2c, 0x6, 0xe, 0xf7,
+                                                   0x2b, 0x76, 0xf8, 0x29, 0x77, 0x1, 0xb, 0x9e,
+                                                   0x1b, 0xa0, 0xd2, 0x91, 0xf5, 0x8f, 0x1f, 0x4b,
+                                                   0x6, 0x69, 0x87, 0x80, 0x83, 0x77, 0x1b, 0xb,
+                                                   0xfb, 0xfa, 0xf8, 0xfa, 0x76, 0xf7, 0x21, 0x77,
+                                                   0x1, 0xb, 0x5, 0x87, 0x99, 0x8d, 0x85, 0xa4,
+                                                   0x1b, 0xf7, 0x7, 0xb, 0x1f, 0x4b, 0x6, 0x68,
+                                                   0x87, 0x80, 0x84, 0x77, 0x1b, 0xb, 0xf7, 0xad,
+                                                   0x16, 0xea, 0xf7, 0xc3, 0x6, 0xf7, 0xa9, 0xf8,
+                                                   0x2e, 0x5, 0xfb, 0x2, 0x6, 0xb, 0x31, 0xa,
+                                                   0xf7, 0x37, 0x72, 0xa, 0x38, 0xa, 0xe, 0xf7,
+                                                   0x1d, 0x5, 0xb, 0xfb, 0x53, 0xa0, 0x76, 0xf8,
+                                                   0x56, 0xcf, 0xf7, 0x10, 0xd5, 0x1, 0xe4, 0xe3,
+                                                   0xb, 0x15, 0xb7, 0x6, 0x9c, 0xf7, 0x1e, 0x5,
+                                                   0xf7, 0x9, 0x3e, 0xfb, 0x9, 0x7, 0xb, 0x69,
+                                                   0x8a, 0xfb, 0x25, 0xf7, 0x23, 0xf7, 0x23, 0x8c,
+                                                   0xf7, 0x1a, 0xb8, 0xb, 0x4c, 0xa, 0x4a, 0x74,
+                                                   0xa, 0x73, 0xa0, 0x76, 0xb, 0x15, 0xc9, 0x6,
+                                                   0xf7, 0x2b, 0xf7, 0x21, 0x38, 0xa, 0xb, 0x4b,
+                                                   0xa, 0xfa, 0x35, 0x77, 0x1, 0xe5, 0xea, 0x3,
+                                                   0xb, 0x4b, 0xa, 0xf9, 0x72, 0x77, 0x1, 0xea,
+                                                   0xe3, 0x3, 0xb, 0x1, 0xaa, 0x16, 0xf8, 0x4a,
+                                                   0xd7, 0xfb, 0xde, 0x6, 0xf7, 0xce, 0xb, 0x15,
+                                                   0x5a, 0xb1, 0x63, 0xbc, 0xbc, 0xb3, 0xb3, 0xbc,
+                                                   0xbc, 0x63, 0xb, 0xa6, 0xc7, 0x8e, 0xe0, 0xc6,
+                                                   0xb, 0xfb, 0x4e, 0x76, 0xf7, 0x5e, 0xd3, 0xf8,
+                                                   0x26, 0xd0, 0x1, 0xb, 0x5, 0xc4, 0xfc, 0x28,
+                                                   0x43, 0xf7, 0xb7, 0x7, 0xfb, 0xc9, 0xb, 0xa0,
+                                                   0x76, 0xf8, 0x9f, 0x77, 0x1, 0xb, 0xfc, 0x31,
+                                                   0xfb, 0x58, 0xd4, 0xf9, 0x98, 0xd4, 0x12, 0xb,
+                                                   0x1, 0xa2, 0x16, 0xf8, 0xc9, 0xe0, 0xfc, 0x5c,
+                                                   0x6, 0xb, 0x15, 0xcc, 0x6, 0xba, 0x8a, 0xad,
+                                                   0x8b, 0x8f, 0x1b, 0xb, 0x3c, 0x96, 0x1e, 0xe1,
+                                                   0x97, 0x5, 0xb3, 0x84, 0x7a, 0xb, 0xe3, 0xec,
+                                                   0x7a, 0xa, 0x1, 0xe1, 0xea, 0xb, 0xa0, 0x76,
+                                                   0xf8, 0x62, 0xd7, 0x12, 0xcc, 0xe3, 0xb, 0xfb,
+                                                   0xfa, 0xfb, 0x4e, 0x76, 0xfa, 0x40, 0x77, 0xb,
+                                                   0x20, 0xab, 0x76, 0xf8, 0x78, 0x77, 0x1, 0xbb,
+                                                   0xb, 0x27, 0x31, 0xa, 0xe, 0x5a, 0x58, 0x68,
+                                                   0x3e, 0x8c, 0x1f, 0xe, 0xf7, 0x1d, 0x59, 0xa,
+                                                   0xf7, 0x5, 0x8a, 0x77, 0x12, 0xb, 0x7d, 0xd3,
+                                                   0xf8, 0x2a, 0xd3, 0xb, 0xb8, 0xe5, 0xf7, 0xb2,
+                                                   0xe5, 0xb, 0xf7, 0x54, 0xd9, 0xfb, 0x54, 0xb,
+                                                   0x7c, 0xd7, 0x60, 0x76, 0xb, 0x33, 0x6, 0xe
+                                                  };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c b/core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c
new file mode 100644
index 0000000..594b37f
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c
@@ -0,0 +1,2051 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansBoldFontData [16344] = {0x1,
+                                                       0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x12,
+                                                       0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,
+                                                       0x73, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f, 0x6c,
+                                                       0x64, 0x0, 0x1, 0x1, 0x1, 0x24, 0xf8, 0x10,
+                                                       0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8,
+                                                       0x1e, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x3e, 0xfb,
+                                                       0x78, 0xfa, 0x7e, 0xfa, 0x56, 0x5, 0xf7, 0x2f,
+                                                       0xf, 0xf8, 0x8f, 0x11, 0xb5, 0x1c, 0x39, 0x77,
+                                                       0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f, 0x42,
+                                                       0x50, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20,
+                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
+                                                       0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x61, 0x6e,
+                                                       0x73, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f,
+                                                       0x6c, 0x64, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20,
+                                                       0x53, 0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46,
+                                                       0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x81,
+                                                       0x1, 0x0, 0x84, 0x0, 0x0, 0x86, 0x2, 0x0,
+                                                       0x91, 0x0, 0x0, 0x63, 0x0, 0x0, 0x6d, 0x1,
+                                                       0x0, 0x8c, 0x0, 0x0, 0x92, 0x0, 0x0, 0xc7,
+                                                       0x0, 0x0, 0xe4, 0x0, 0x0, 0x2, 0x5, 0x0,
+                                                       0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0,
+                                                       0x0, 0x42, 0x1d, 0x1, 0x87, 0x0, 0x0, 0x75,
+                                                       0x0, 0x0, 0x65, 0x0, 0x0, 0x76, 0x0, 0x0,
+                                                       0x79, 0x0, 0x0, 0x70, 0x1, 0x0, 0x7e, 0x0,
+                                                       0x0, 0x7a, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x6b,
+                                                       0x0, 0x0, 0x8e, 0x0, 0x0, 0x41, 0x0, 0x0,
+                                                       0x8, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0,
+                                                       0x0, 0x74, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89,
+                                                       0x0, 0x0, 0x7f, 0x0, 0x0, 0x99, 0x0, 0x0,
+                                                       0xdd, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x94, 0x0,
+                                                       0x0, 0xc6, 0x0, 0x0, 0x60, 0x2, 0x0, 0x67,
+                                                       0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,
+                                                       0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,
+                                                       0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,
+                                                       0x0, 0x0, 0xa6, 0x0, 0x0, 0xa5, 0x0, 0x0,
+                                                       0x80, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0,
+                                                       0x0, 0xa4, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d,
+                                                       0x0, 0x0, 0x98, 0x0, 0x0, 0x73, 0x0, 0x0,
+                                                       0x72, 0x0, 0x0, 0x85, 0x0, 0x0, 0x96, 0x0,
+                                                       0x0, 0x8f, 0x0, 0x0, 0x78, 0x0, 0x0, 0x9e,
+                                                       0x0, 0x0, 0x9b, 0x0, 0x0, 0xa3, 0x0, 0x0,
+                                                       0x7b, 0x0, 0x0, 0xae, 0x0, 0x0, 0xab, 0x1,
+                                                       0x0, 0xb0, 0x0, 0x0, 0xad, 0x0, 0x0, 0xaf,
+                                                       0x0, 0x0, 0x8a, 0x0, 0x0, 0xb1, 0x0, 0x0,
+                                                       0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0,
+                                                       0x0, 0xb6, 0x2, 0x0, 0x9a, 0x0, 0x0, 0xba,
+                                                       0x0, 0x0, 0xbe, 0x0, 0x0, 0xbb, 0x1, 0x0,
+                                                       0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0,
+                                                       0x0, 0x8d, 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1,
+                                                       0x2, 0x0, 0xc5, 0x0, 0x0, 0x9d, 0x0, 0x0,
+                                                       0x95, 0x0, 0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1,
+                                                       0x0, 0xcd, 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc,
+                                                       0x0, 0x0, 0x90, 0x0, 0x0, 0xce, 0x0, 0x0,
+                                                       0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0,
+                                                       0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7,
+                                                       0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0,
+                                                       0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0,
+                                                       0x0, 0x93, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde,
+                                                       0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0,
+                                                       0xe3, 0x0, 0x0, 0xe6, 0x2, 0x0, 0x1, 0x0,
+                                                       0x4, 0x0, 0x7, 0x0, 0x2c, 0x0, 0x41, 0x0,
+                                                       0x75, 0x0, 0x84, 0x0, 0xb3, 0x0, 0xce, 0x0,
+                                                       0xd9, 0x0, 0xf1, 0x1, 0x30, 0x1, 0x6b, 0x1,
+                                                       0x9a, 0x1, 0xc3, 0x1, 0xf1, 0x2, 0x32, 0x2,
+                                                       0x5e, 0x2, 0x8a, 0x2, 0xed, 0x3, 0x76, 0x4,
+                                                       0x7, 0x4, 0xa5, 0x4, 0xc4, 0x4, 0xfb, 0x5,
+                                                       0x33, 0x5, 0x66, 0x5, 0x8c, 0x5, 0xbb, 0x5,
+                                                       0xcc, 0x5, 0xdf, 0x5, 0xf5, 0x6, 0x3f, 0x6,
+                                                       0x69, 0x6, 0xbc, 0x7, 0x1e, 0x7, 0x55, 0x7,
+                                                       0xa7, 0x8, 0xa, 0x8, 0x3e, 0x8, 0xaf, 0x9,
+                                                       0x14, 0x9, 0x34, 0x9, 0x6d, 0x9, 0x8c, 0x9,
+                                                       0xab, 0x9, 0xc9, 0xa, 0x2e, 0xa, 0xda, 0xb,
+                                                       0xd, 0xb, 0x6c, 0xb, 0xbc, 0xb, 0xfb, 0xc,
+                                                       0x24, 0xc, 0x48, 0xc, 0xc3, 0xc, 0xef, 0xd,
+                                                       0x2, 0xd, 0x33, 0xd, 0x64, 0xd, 0x78, 0xd,
+                                                       0xb8, 0xd, 0xdb, 0xe, 0x52, 0xe, 0x88, 0xf,
+                                                       0x1a, 0xf, 0x73, 0xf, 0xdc, 0xf, 0xfb, 0x10,
+                                                       0x32, 0x10, 0x50, 0x10, 0x93, 0x10, 0xc5, 0x10,
+                                                       0xdf, 0x10, 0xf9, 0x11, 0x13, 0x11, 0x2a, 0x11,
+                                                       0x44, 0x11, 0x65, 0x11, 0x72, 0x11, 0x88, 0x11,
+                                                       0xed, 0x12, 0x48, 0x12, 0x92, 0x12, 0xed, 0x13,
+                                                       0x43, 0x13, 0x79, 0x13, 0xe7, 0x14, 0x23, 0x14,
+                                                       0x3c, 0x14, 0x80, 0x14, 0xaf, 0x14, 0xba, 0x15,
+                                                       0x19, 0x15, 0x58, 0x15, 0xa2, 0x15, 0xef, 0x16,
+                                                       0x43, 0x16, 0x82, 0x16, 0xe4, 0x17, 0x1e, 0x17,
+                                                       0x60, 0x17, 0x85, 0x17, 0xc1, 0x17, 0xf3, 0x18,
+                                                       0x22, 0x18, 0x48, 0x18, 0x8c, 0x18, 0xa4, 0x18,
+                                                       0xea, 0x19, 0x2c, 0x19, 0xa7, 0x19, 0xcf, 0x1a,
+                                                       0x33, 0x1a, 0x70, 0x1a, 0xa3, 0x1a, 0xcd, 0x1b,
+                                                       0x5, 0x1b, 0x19, 0x1b, 0xcf, 0x1c, 0x49, 0x1c,
+                                                       0x5f, 0x1c, 0xda, 0x1d, 0x5, 0x1d, 0x2e, 0x1d,
+                                                       0x7f, 0x1d, 0xb8, 0x1d, 0xdb, 0x1d, 0xea, 0x1d,
+                                                       0xfa, 0x1e, 0x3e, 0x1e, 0x8c, 0x1f, 0x4, 0x1f,
+                                                       0x19, 0x1f, 0xaf, 0x1f, 0xda, 0x20, 0xa, 0x20,
+                                                       0x88, 0x21, 0x14, 0x21, 0x8e, 0x21, 0xd3, 0x21,
+                                                       0xf2, 0x22, 0x9b, 0x22, 0xab, 0x23, 0x1b, 0x23,
+                                                       0x95, 0x23, 0xa3, 0x23, 0xbd, 0x23, 0xcf, 0x24,
+                                                       0x4d, 0x24, 0x60, 0x24, 0x99, 0x24, 0xc7, 0x25,
+                                                       0x9, 0x25, 0x61, 0x25, 0x74, 0x25, 0xba, 0x25,
+                                                       0xec, 0x26, 0x4, 0x26, 0x3b, 0x26, 0x61, 0x26,
+                                                       0xa4, 0x26, 0xb1, 0x27, 0x19, 0x27, 0x96, 0x28,
+                                                       0x2f, 0x28, 0x85, 0x28, 0x9d, 0x28, 0xb6, 0x28,
+                                                       0xd5, 0x29, 0x1b, 0x29, 0x3d, 0x29, 0x71, 0x29,
+                                                       0xb8, 0x2a, 0x49, 0x2a, 0x59, 0x2a, 0x6a, 0x2a,
+                                                       0x91, 0x2a, 0xb8, 0x2a, 0xcd, 0x2a, 0xe1, 0x2a,
+                                                       0xfc, 0x2b, 0x15, 0x2b, 0x63, 0x2b, 0xbb, 0x2b,
+                                                       0xe9, 0x2c, 0xd, 0x2c, 0x3a, 0x2c, 0x87, 0x2c,
+                                                       0xaf, 0x2c, 0xdf, 0x2d, 0x5f, 0x2d, 0x7c, 0x2d,
+                                                       0x98, 0x2d, 0xbf, 0x2d, 0xea, 0x2e, 0x1a, 0x2e,
+                                                       0x5d, 0x2e, 0xcc, 0x2e, 0xe3, 0x2e, 0xfa, 0x2f,
+                                                       0x1b, 0x2f, 0x77, 0x2f, 0x9f, 0x2f, 0xe5, 0x30,
+                                                       0x8f, 0x31, 0x1c, 0x31, 0x36, 0x31, 0x51, 0x31,
+                                                       0x73, 0x31, 0x97, 0x31, 0xae, 0x31, 0xc5, 0x31,
+                                                       0xe4, 0x32, 0x3, 0x32, 0x7c, 0x32, 0xf4, 0x33,
+                                                       0x11, 0x33, 0x24, 0x33, 0x42, 0x33, 0x80, 0x33,
+                                                       0xa8, 0x33, 0xd7, 0x34, 0x55, 0x34, 0x6b, 0x34,
+                                                       0x81, 0x34, 0xa8, 0x34, 0xd6, 0x35, 0x13, 0x35,
+                                                       0x67, 0x35, 0xac, 0xfc, 0x15, 0xe, 0xfc, 0x15,
+                                                       0xe, 0xf8, 0xf0, 0xcb, 0xdd, 0x77, 0x1, 0x89,
+                                                       0xf9, 0x82, 0x15, 0x22, 0x95, 0xd9, 0x62, 0xdb,
+                                                       0x1b, 0xda, 0xdb, 0xb3, 0xf5, 0x95, 0x1f, 0x4b,
+                                                       0x6, 0x78, 0x8a, 0x7b, 0x4c, 0x33, 0x1b, 0x4a,
+                                                       0x6a, 0xb2, 0xb6, 0x85, 0x1f, 0xe, 0xf8, 0xfa,
+                                                       0xf7, 0x7, 0x1, 0xf3, 0xf7, 0x12, 0x3, 0xf3,
+                                                       0xf8, 0xfa, 0x15, 0xf7, 0x12, 0xf7, 0x7, 0xfb,
+                                                       0x12, 0x6, 0xe, 0xf8, 0xcc, 0xc4, 0xe9, 0xc4,
+                                                       0x1, 0xc6, 0xc6, 0xed, 0xc6, 0x3, 0xc6, 0xf9,
+                                                       0x35, 0x15, 0x51, 0xbc, 0x5c, 0xc7, 0xc4, 0xbd,
+                                                       0xb8, 0xc7, 0xc6, 0x5a, 0xb7, 0x51, 0x4d, 0x5c,
+                                                       0x5e, 0x51, 0x1e, 0xc6, 0x16, 0xa5, 0xa0, 0x9f,
+                                                       0xa8, 0xa5, 0xa1, 0x78, 0x70, 0x70, 0x75, 0x76,
+                                                       0x71, 0x6f, 0x75, 0xa0, 0xa6, 0x1e, 0xe, 0xf8,
+                                                       0xf0, 0x84, 0xa, 0x94, 0xf8, 0xf0, 0x6b, 0xa,
+                                                       0xef, 0xfb, 0x26, 0x6b, 0xa, 0xe, 0xfb, 0x78,
+                                                       0xd8, 0xf7, 0x2b, 0x77, 0x1, 0xd2, 0xe2, 0x3,
+                                                       0xe5, 0x16, 0x80, 0x61, 0x83, 0x6a, 0x67, 0x1a,
+                                                       0x35, 0xdd, 0x6c, 0xcc, 0x9c, 0xa5, 0x8e, 0x9c,
+                                                       0xb6, 0x1e, 0xd0, 0x7, 0x87, 0x80, 0x61, 0x83,
+                                                       0x6a, 0x1b, 0x53, 0x87, 0xac, 0xb8, 0xa3, 0x8e,
+                                                       0xa7, 0x93, 0xa0, 0x1f, 0xe, 0xf8, 0xf0, 0xd1,
+                                                       0x1, 0xed, 0xf8, 0xf0, 0x15, 0xf7, 0x1b, 0x6,
+                                                       0xf7, 0x2, 0x83, 0xa, 0xfb, 0xa, 0x6, 0x52,
+                                                       0x3f, 0x4e, 0xd7, 0x5, 0xfb, 0x9, 0x6, 0xe,
+                                                       0xfc, 0x15, 0x73, 0xa, 0xd3, 0x63, 0xa, 0xf8,
+                                                       0xa8, 0x6d, 0xa, 0xfc, 0x84, 0x8d, 0x76, 0xf9,
+                                                       0x6d, 0x77, 0x1, 0x2f, 0x78, 0x15, 0xf8, 0x40,
+                                                       0xf9, 0x6d, 0x5, 0x3d, 0x6, 0xfc, 0x40, 0xfd,
+                                                       0x6d, 0x5, 0xe, 0x57, 0x76, 0xa, 0xd2, 0xf7,
+                                                       0x13, 0x1, 0xe2, 0xf7, 0x20, 0xf7, 0x43, 0x7d,
+                                                       0xa, 0xe2, 0x16, 0xf7, 0x20, 0xf8, 0x2c, 0xf4,
+                                                       0xf7, 0x1, 0x22, 0x6, 0xf4, 0xc5, 0x96, 0xca,
+                                                       0x78, 0x1e, 0x9f, 0xeb, 0x5, 0x98, 0x5f, 0x73,
+                                                       0x8f, 0x6f, 0x1b, 0xfb, 0x37, 0x6f, 0xa, 0xf7,
+                                                       0xcf, 0xfc, 0x2c, 0x15, 0xf7, 0x20, 0xf8, 0x99,
+                                                       0x68, 0xa, 0xd2, 0x4, 0xf7, 0x20, 0xf7, 0x13,
+                                                       0x6d, 0xa, 0x57, 0x76, 0xa, 0xf7, 0x66, 0x77,
+                                                       0x1, 0xe2, 0xf7, 0x20, 0xf7, 0x44, 0xf7, 0x1f,
+                                                       0x3, 0xf8, 0x27, 0x16, 0xf7, 0x1f, 0xf9, 0x5f,
+                                                       0xfb, 0x1f, 0x6, 0xfb, 0xd0, 0xfd, 0x5f, 0x15,
+                                                       0xf7, 0x20, 0xf8, 0x2c, 0xf3, 0xf7, 0x1, 0x23,
+                                                       0x6, 0xdf, 0xb1, 0xab, 0xde, 0x78, 0x1e, 0x9e,
+                                                       0xeb, 0x5, 0x98, 0x5f, 0x74, 0x8f, 0x6e, 0x1b,
+                                                       0xfb, 0x36, 0x6f, 0xa, 0xe, 0x86, 0xa, 0xa7,
+                                                       0xf7, 0x16, 0x3, 0xc6, 0x16, 0xf8, 0xa0, 0xf7,
+                                                       0xe, 0xfc, 0x1e, 0xf7, 0x7c, 0x6, 0xf7, 0x3b,
+                                                       0xf7, 0x1a, 0x5, 0xf7, 0xc, 0x7, 0xfb, 0x3b,
+                                                       0xfb, 0x1c, 0x5, 0xf7, 0x8a, 0xfb, 0x16, 0xfb,
+                                                       0xf9, 0x7, 0x3c, 0x4a, 0x5, 0xfb, 0x9, 0x7,
+                                                       0xda, 0xcb, 0x5, 0xe, 0xfc, 0x15, 0x3f, 0xa,
+                                                       0xd1, 0xf7, 0xa, 0x3, 0xd1, 0x16, 0xf7, 0xa,
+                                                       0xf7, 0xfa, 0x6, 0xf7, 0x0, 0xd8, 0x5, 0xe9,
+                                                       0x7, 0xfb, 0x0, 0x3d, 0x5, 0xf7, 0x9f, 0xfb,
+                                                       0xa, 0xfb, 0xf6, 0x7, 0x33, 0x48, 0x5, 0x2d,
+                                                       0x7, 0xe3, 0xcf, 0x5, 0xe, 0x57, 0x8b, 0xf7,
+                                                       0xd, 0xf8, 0x6e, 0x82, 0xa, 0xa4, 0x16, 0xf8,
+                                                       0xc5, 0xf7, 0xd, 0x87, 0xa, 0xf7, 0x5, 0xfc,
+                                                       0x8e, 0xfb, 0xd, 0x8c, 0xa, 0xf7, 0x6e, 0xf9,
+                                                       0x2d, 0x15, 0xf7, 0xf, 0x6, 0xee, 0xf7, 0x21,
+                                                       0x5, 0x20, 0x6, 0x58, 0x42, 0x54, 0xd4, 0x5,
+                                                       0x21, 0x6, 0xe, 0xfb, 0x37, 0x8b, 0xf7, 0xd,
+                                                       0xf7, 0xaf, 0xf7, 0x6, 0xe5, 0xf7, 0x22, 0x1,
+                                                       0x9f, 0x16, 0xf8, 0x60, 0xf7, 0xd, 0xfb, 0xad,
+                                                       0x6, 0xf7, 0x9d, 0xf7, 0xc0, 0x5, 0xec, 0xfc,
+                                                       0x3d, 0xfb, 0x6, 0x7, 0xf7, 0x88, 0x8c, 0xfb,
+                                                       0x9b, 0xfb, 0xbe, 0x5, 0xf7, 0x3b, 0xf8, 0x89,
+                                                       0x15, 0xf7, 0x12, 0x6, 0xf1, 0xf7, 0x22, 0x5,
+                                                       0xfb, 0x2, 0x6, 0x56, 0x42, 0x53, 0xd4, 0x5,
+                                                       0xfb, 0x1, 0x6, 0xe, 0x8b, 0xf7, 0x1d, 0xf8,
+                                                       0xd9, 0x77, 0x12, 0xe5, 0xf7, 0x28, 0xfb, 0x28,
+                                                       0xf7, 0x2e, 0x13, 0xe0, 0xe8, 0x16, 0xf7, 0x25,
+                                                       0xf7, 0x1d, 0xfb, 0x25, 0x6, 0xab, 0xbc, 0x15,
+                                                       0xdd, 0x6, 0x13, 0xd0, 0xb0, 0xf8, 0x0, 0x5,
+                                                       0xf7, 0x3c, 0xfb, 0x2e, 0xfb, 0x3c, 0x7, 0xe,
+                                                       0xfb, 0x51, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77,
+                                                       0x1, 0xf7, 0xb3, 0xf8, 0x53, 0x15, 0xd3, 0x6,
+                                                       0x9c, 0x67, 0xa, 0xf7, 0x14, 0xfb, 0x1, 0xfb,
+                                                       0x14, 0x7, 0xfb, 0x2a, 0xfb, 0x23, 0x15, 0xd4,
+                                                       0x6, 0x9b, 0x67, 0xa, 0xf7, 0x14, 0xfb, 0x0,
+                                                       0xfb, 0x14, 0x7, 0xe, 0x20, 0xa0, 0x76, 0xf7,
+                                                       0x47, 0xf2, 0xf7, 0x1c, 0xf2, 0xf7, 0x45, 0x77,
+                                                       0x1, 0xb8, 0x16, 0xf6, 0x6, 0xb0, 0xf7, 0x47,
+                                                       0x5, 0xf4, 0x6, 0x67, 0xfb, 0x47, 0x5, 0xf4,
+                                                       0x6, 0xb1, 0xf7, 0x47, 0x5, 0xf7, 0x1d, 0xf2,
+                                                       0xfb, 0x7, 0x6, 0xa7, 0xf7, 0x1c, 0x5, 0xe2,
+                                                       0xf2, 0x49, 0x6, 0xb1, 0xf7, 0x45, 0x5, 0xfb,
+                                                       0x2, 0x6, 0x66, 0xfb, 0x45, 0x5, 0x24, 0x6,
+                                                       0xaf, 0xf7, 0x45, 0x5, 0x22, 0x6, 0x65, 0xfb,
+                                                       0x45, 0x5, 0xfb, 0x1b, 0x24, 0xf7, 0x6, 0x6,
+                                                       0x6e, 0xfb, 0x1c, 0x5, 0x36, 0x24, 0xcb, 0x6,
+                                                       0xf7, 0x14, 0xf2, 0x15, 0xa7, 0xf7, 0x1c, 0x5,
+                                                       0xf4, 0x6, 0x6f, 0xfb, 0x1c, 0x5, 0xe, 0x20,
+                                                       0x2d, 0x76, 0xfa, 0xe, 0x77, 0x12, 0xf7, 0x85,
+                                                       0xd4, 0xdf, 0xf7, 0x11, 0x17, 0xa9, 0xf7, 0x54,
+                                                       0x15, 0x9b, 0x24, 0xc2, 0x2a, 0xf7, 0x20, 0x7b,
+                                                       0x8, 0x30, 0xd4, 0xe8, 0x7, 0xf7, 0x44, 0xa4,
+                                                       0xac, 0xf7, 0x7, 0xd0, 0x1a, 0xf7, 0x34, 0xfb,
+                                                       0x19, 0xc0, 0x3f, 0xa0, 0x1e, 0xf7, 0x56, 0x7,
+                                                       0xbb, 0x77, 0x94, 0x62, 0x8e, 0x79, 0xf7, 0x13,
+                                                       0x9b, 0x18, 0x71, 0xf7, 0x2e, 0xfb, 0x13, 0x9a,
+                                                       0x69, 0x8f, 0x8, 0x13, 0x70, 0xbd, 0x7, 0x42,
+                                                       0x59, 0x6, 0x24, 0x81, 0x34, 0x46, 0xfb, 0xe,
+                                                       0x1a, 0xfb, 0x32, 0xf7, 0x17, 0x5c, 0xc6, 0x7b,
+                                                       0x1e, 0xfb, 0x64, 0x7, 0x74, 0x96, 0x60, 0xab,
+                                                       0x7e, 0xcf, 0x8, 0xf7, 0x2c, 0xfb, 0xa, 0x15,
+                                                       0xf7, 0x56, 0x7, 0xa1, 0x85, 0xc9, 0x79, 0x44,
+                                                       0x1a, 0x60, 0x6f, 0x5d, 0x53, 0x81, 0x1e, 0x42,
+                                                       0xf7, 0xf9, 0x15, 0x4a, 0xa7, 0x8a, 0xb5, 0x94,
+                                                       0x1a, 0xad, 0xa1, 0xb7, 0xb7, 0x99, 0x1e, 0xe,
+                                                       0xf7, 0x76, 0x78, 0xd5, 0xf7, 0x69, 0xd5, 0x90,
+                                                       0xd5, 0xf7, 0x69, 0xd5, 0x8d, 0x77, 0x12, 0xa7,
+                                                       0xf7, 0x4, 0xf3, 0xf7, 0x4, 0xf7, 0x45, 0xf7,
+                                                       0x4, 0xf3, 0xf7, 0x4, 0x13, 0xf7, 0x80, 0xf7,
+                                                       0x20, 0xf8, 0xa4, 0x15, 0xd2, 0x98, 0xae, 0xb2,
+                                                       0xb3, 0x97, 0x67, 0x45, 0x42, 0x7f, 0x69, 0x63,
+                                                       0x63, 0x7f, 0xaf, 0xd2, 0x1e, 0xfb, 0x4, 0x16,
+                                                       0x2d, 0xaf, 0x34, 0xf7, 0x14, 0xf7, 0x29, 0x9a,
+                                                       0xf7, 0xd, 0xc7, 0xf6, 0x5e, 0xd4, 0xfb, 0xb,
+                                                       0xfb, 0x28, 0x7b, 0xfb, 0xd, 0x50, 0x1e, 0xf7,
+                                                       0x3b, 0xfc, 0xb7, 0x15, 0xf6, 0x6, 0x13, 0xef,
+                                                       0x80, 0xf8, 0x1f, 0xf9, 0x6d, 0x5, 0x24, 0x6,
+                                                       0x4e, 0xfc, 0xba, 0x15, 0x2d, 0xb0, 0x36, 0xf7,
+                                                       0x15, 0xf7, 0x27, 0x9a, 0xf7, 0xb, 0xc9, 0xf6,
+                                                       0x5e, 0xd4, 0xfb, 0xa, 0xfb, 0x2a, 0x7c, 0xfb,
+                                                       0xd, 0x4e, 0x1e, 0xf7, 0x4, 0x8e, 0x15, 0xd3,
+                                                       0x97, 0xac, 0xb3, 0xb3, 0x97, 0x68, 0x45, 0x43,
+                                                       0x7f, 0x67, 0x63, 0x63, 0x7f, 0xb0, 0xd2, 0x1e,
+                                                       0xe, 0xc6, 0x7e, 0xf7, 0x4, 0x2a, 0x76, 0xf9,
+                                                       0x15, 0xeb, 0x12, 0xc1, 0xf7, 0x1e, 0x59, 0xf7,
+                                                       0x17, 0x13, 0x68, 0xf8, 0x8e, 0xca, 0x15, 0xa5,
+                                                       0x72, 0xb5, 0x69, 0xb9, 0x74, 0xdc, 0xf5, 0x18,
+                                                       0x75, 0x94, 0x52, 0xb3, 0x6c, 0xa9, 0x9c, 0xa1,
+                                                       0x9c, 0xa7, 0xa5, 0xeb, 0xfb, 0xd, 0xa6, 0x18,
+                                                       0x87, 0x7a, 0x81, 0x69, 0x7c, 0x6d, 0x29, 0xf7,
+                                                       0x16, 0x18, 0xda, 0xbe, 0xbc, 0xb8, 0xd4, 0x1a,
+                                                       0xe5, 0x42, 0xd2, 0xfb, 0xd, 0xfb, 0xe, 0x42,
+                                                       0x40, 0x35, 0x57, 0xa7, 0x5e, 0xb7, 0x59, 0x1e,
+                                                       0x13, 0xb0, 0x68, 0x79, 0xfb, 0x11, 0x4c, 0xfb,
+                                                       0x1c, 0x1a, 0x54, 0xa6, 0xfb, 0x2b, 0xf7, 0x6b,
+                                                       0xf7, 0x4, 0xc7, 0xb4, 0xae, 0xb1, 0x1e, 0x36,
+                                                       0xe5, 0x15, 0x76, 0x71, 0x64, 0x6a, 0x4f, 0x1b,
+                                                       0x43, 0x6b, 0xb8, 0xbc, 0xb5, 0xa3, 0xc0, 0xcf,
+                                                       0xae, 0x1f, 0xbd, 0xf7, 0x29, 0x15, 0x6c, 0xaf,
+                                                       0x5, 0x13, 0xa8, 0x89, 0x8e, 0x6f, 0x8f, 0xb5,
+                                                       0x1a, 0xa5, 0x9e, 0xb2, 0xb8, 0xbf, 0xa3, 0x66,
+                                                       0x6f, 0x74, 0x7c, 0x7e, 0x7a, 0x7d, 0x1e, 0x7a,
+                                                       0x7c, 0x77, 0x7e, 0x81, 0x84, 0x8, 0xe, 0xfc,
+                                                       0x3d, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77, 0x1,
+                                                       0x7e, 0x85, 0xa, 0xc3, 0xf8, 0x53, 0x15, 0xf7,
+                                                       0x8, 0x6, 0x9b, 0xf7, 0x22, 0x5, 0xf7, 0x15,
+                                                       0xfb, 0x28, 0xfb, 0x15, 0x7, 0xe, 0xfb, 0x4f,
+                                                       0x76, 0xfa, 0x42, 0x77, 0x1, 0xae, 0x85, 0xa,
+                                                       0xf7, 0x63, 0xfb, 0x64, 0x15, 0xf5, 0x6, 0x61,
+                                                       0xdb, 0x33, 0xf7, 0x39, 0xf7, 0x73, 0x1a, 0xf7,
+                                                       0x52, 0xc0, 0xf7, 0x16, 0xd9, 0xf7, 0x2e, 0x1e,
+                                                       0x22, 0x6, 0x34, 0xfb, 0x4, 0x34, 0xfb, 0x39,
+                                                       0xfb, 0x59, 0x1a, 0xfb, 0x3b, 0xd0, 0xfb, 0x35,
+                                                       0xf2, 0xfb, 0x20, 0x1e, 0xe, 0xfb, 0x4f, 0x76,
+                                                       0xfa, 0x42, 0x77, 0x1, 0xf7, 0x29, 0xf7, 0x29,
+                                                       0x3, 0x9e, 0xfb, 0x64, 0x15, 0xf4, 0x6, 0xe2,
+                                                       0xf7, 0x4, 0xe2, 0xf7, 0x35, 0xf7, 0x59, 0x1a,
+                                                       0xf7, 0x3b, 0x46, 0xf7, 0x39, 0x24, 0xf7, 0x20,
+                                                       0x1e, 0x21, 0x6, 0xb5, 0x3b, 0xe2, 0xfb, 0x3d,
+                                                       0xfb, 0x73, 0x1a, 0xfb, 0x52, 0x57, 0xfb, 0x12,
+                                                       0x3d, 0xfb, 0x2e, 0x1e, 0xe, 0xfb, 0xa6, 0x4d,
+                                                       0xa, 0xf7, 0x30, 0xd2, 0x3, 0xf7, 0x13, 0xf8,
+                                                       0x17, 0x15, 0xcc, 0xf7, 0x1, 0xc9, 0x21, 0xd1,
+                                                       0xbb, 0x3a, 0xeb, 0xf7, 0xb, 0xa2, 0x72, 0xe1,
+                                                       0xfb, 0x8, 0x57, 0x97, 0xf7, 0x13, 0x5, 0x39,
+                                                       0x6, 0x96, 0xfb, 0x12, 0xfb, 0x1, 0xc2, 0x71,
+                                                       0x38, 0xf7, 0x9, 0x6d, 0x34, 0x2f, 0x5, 0xe,
+                                                       0x3c, 0xa0, 0x76, 0xf7, 0x52, 0xf7, 0x15, 0xf7,
+                                                       0x4f, 0x90, 0xa, 0xf7, 0x52, 0x15, 0xf7, 0x50,
+                                                       0xfb, 0x52, 0xf7, 0x13, 0xf7, 0x52, 0xf7, 0x51,
+                                                       0xf7, 0x15, 0xfb, 0x51, 0xf7, 0x4f, 0xfb, 0x13,
+                                                       0xfb, 0x4f, 0xfb, 0x50, 0x6, 0xe, 0xfc, 0x15,
+                                                       0xfb, 0x27, 0x76, 0xf7, 0x51, 0x76, 0xf7, 0x26,
+                                                       0x77, 0x12, 0xd7, 0xf7, 0x1e, 0x44, 0xd2, 0x13,
+                                                       0xf0, 0xd7, 0x16, 0x13, 0xe8, 0xce, 0x6, 0x89,
+                                                       0x38, 0x58, 0x7c, 0x71, 0x82, 0xa6, 0x4e, 0x18,
+                                                       0xf7, 0xf, 0xba, 0x8b, 0xec, 0xcd, 0x1a, 0xf3,
+                                                       0x7, 0x13, 0xf0, 0x81, 0xa, 0xf7, 0x6b, 0xf7,
+                                                       0x16, 0x1, 0xa6, 0xf7, 0x6b, 0x15, 0xf7, 0xab,
+                                                       0xf7, 0x16, 0xfb, 0xab, 0x6, 0xe, 0xfc, 0x15,
+                                                       0x8b, 0x84, 0xa, 0xcb, 0xf7, 0x2a, 0x3, 0xcb,
+                                                       0x16, 0xf7, 0x2a, 0xf7, 0x26, 0xfb, 0x2a, 0x6,
+                                                       0xe, 0xfc, 0x15, 0x86, 0x76, 0xf9, 0x8f, 0x77,
+                                                       0x1, 0x76, 0xf7, 0x11, 0x3, 0x6a, 0x78, 0x15,
+                                                       0xf7, 0x11, 0x6, 0xf7, 0x6f, 0x93, 0xa, 0x79,
+                                                       0xa, 0xf8, 0x89, 0xf7, 0x6, 0x1, 0xab, 0xf7,
+                                                       0x2c, 0xf7, 0x50, 0xf7, 0x2c, 0x3, 0xab, 0xf7,
+                                                       0xf5, 0x15, 0xfb, 0x21, 0xa2, 0xfb, 0x7b, 0xf7,
+                                                       0x74, 0xf7, 0x6d, 0xa7, 0xf7, 0x7d, 0xf7, 0x1d,
+                                                       0xf7, 0x20, 0x72, 0xf7, 0x6f, 0xfb, 0x72, 0xfb,
+                                                       0x70, 0x72, 0xfb, 0x6f, 0xfb, 0x1e, 0x1e, 0xf7,
+                                                       0x2c, 0x89, 0x15, 0xf7, 0x53, 0xa4, 0xc1, 0xcf,
+                                                       0xd1, 0xa4, 0x54, 0xfb, 0x52, 0xfb, 0x52, 0x72,
+                                                       0x49, 0x45, 0x47, 0x72, 0xcc, 0xf7, 0x53, 0x1e,
+                                                       0xe, 0x20, 0xa0, 0x76, 0xf9, 0x5a, 0x77, 0x1,
+                                                       0xf7, 0x87, 0xf7, 0x1b, 0x3, 0xf7, 0x87, 0x16,
+                                                       0xf7, 0x1b, 0xf9, 0x5a, 0xfb, 0x2, 0x6, 0x61,
+                                                       0xfb, 0xc, 0xfb, 0x23, 0x56, 0x7d, 0x86, 0x8,
+                                                       0xfb, 0xe, 0x7, 0xe1, 0xa7, 0xc5, 0xba, 0xa9,
+                                                       0xa7, 0x8, 0xe, 0x20, 0x8b, 0xf7, 0x12, 0xf8,
+                                                       0x6b, 0xf7, 0x5, 0x1, 0xb5, 0xf7, 0x1e, 0xf7,
+                                                       0x55, 0xf7, 0x1e, 0x3, 0xa5, 0x16, 0xf8, 0x79,
+                                                       0xf7, 0x12, 0xfb, 0xa7, 0x6, 0x9e, 0xab, 0xa2,
+                                                       0xa0, 0xd2, 0xcb, 0x8, 0xd1, 0xca, 0xe7, 0xd5,
+                                                       0xf7, 0x10, 0x1a, 0xe3, 0x4a, 0xf7, 0xa, 0xfb,
+                                                       0x3b, 0xfb, 0x17, 0x21, 0x2d, 0xfb, 0x7, 0x1e,
+                                                       0xf7, 0x1e, 0x7d, 0x5, 0xd3, 0x90, 0xa9, 0xb1,
+                                                       0xcb, 0x1b, 0xc8, 0xac, 0x63, 0x56, 0x43, 0x5b,
+                                                       0x64, 0x2b, 0x33, 0x1f, 0xfb, 0x1e, 0xfb, 0x12,
+                                                       0x55, 0x41, 0x80, 0x22, 0x8, 0xe, 0x79, 0xa,
+                                                       0xf8, 0x83, 0xf7, 0x6, 0x1, 0xf7, 0xe6, 0xf7,
+                                                       0x25, 0x3, 0xa6, 0xf7, 0x4a, 0x15, 0x25, 0x97,
+                                                       0xda, 0x28, 0xf7, 0x2a, 0x1b, 0xf7, 0x1d, 0xf7,
+                                                       0x3, 0xeb, 0xf7, 0x16, 0xe1, 0x56, 0xcd, 0x35,
+                                                       0x9c, 0x1f, 0x8d, 0x7, 0xa5, 0x97, 0xda, 0xae,
+                                                       0xe9, 0x1a, 0xdf, 0x3b, 0xf6, 0xfb, 0x22, 0xfb,
+                                                       0x4f, 0x72, 0xfb, 0x22, 0x5f, 0x80, 0x1e, 0xf7,
+                                                       0x17, 0x75, 0x5, 0xd4, 0x94, 0xb9, 0xa0, 0xb0,
+                                                       0x1b, 0xbd, 0xaa, 0x6c, 0x5d, 0x43, 0x4c, 0x75,
+                                                       0x55, 0x8c, 0x1f, 0x7c, 0xfb, 0x3, 0x5, 0xdd,
+                                                       0xad, 0xdb, 0x56, 0x32, 0x1a, 0x55, 0x6c, 0x51,
+                                                       0x43, 0x48, 0x6c, 0xc0, 0xbd, 0x85, 0x1e, 0xe,
+                                                       0x20, 0xa0, 0x76, 0xf7, 0x23, 0xf7, 0xc, 0xf8,
+                                                       0x53, 0x77, 0x1, 0xf7, 0xcc, 0xf7, 0x14, 0x3,
+                                                       0xa6, 0xf7, 0x23, 0x15, 0xf7, 0xb1, 0xfb, 0x23,
+                                                       0xf7, 0x14, 0xf7, 0x23, 0xe1, 0xf7, 0xc, 0x35,
+                                                       0xf8, 0x53, 0x7c, 0xa, 0xfb, 0xc1, 0xfc, 0x54,
+                                                       0x5, 0xf7, 0x11, 0x8c, 0x15, 0xf7, 0x32, 0xf7,
+                                                       0x86, 0x5, 0x8d, 0xfb, 0x86, 0x6, 0xe, 0x79,
+                                                       0xa, 0xf8, 0x7f, 0xf7, 0x11, 0x1, 0xf8, 0x3f,
+                                                       0xf7, 0x23, 0x3, 0xa6, 0xf7, 0x48, 0x15, 0xfb,
+                                                       0x11, 0x9b, 0xec, 0x41, 0xf7, 0x13, 0x1b, 0xf7,
+                                                       0x3e, 0xda, 0xf7, 0x1e, 0xf7, 0x7, 0x1f, 0x8a,
+                                                       0xf7, 0x5e, 0xfb, 0x38, 0xe8, 0xfb, 0x2c, 0x46,
+                                                       0xa1, 0xf7, 0x19, 0x18, 0xf7, 0x9b, 0xf7, 0x11,
+                                                       0xfc, 0x5, 0x6, 0x44, 0xfc, 0x11, 0xf7, 0x5,
+                                                       0x7b, 0xbb, 0xbf, 0xc1, 0x96, 0xb4, 0x7a, 0x19,
+                                                       0xb6, 0x7a, 0xa9, 0x53, 0x4f, 0x1a, 0x23, 0x54,
+                                                       0x68, 0x58, 0x5c, 0x60, 0xa6, 0xd3, 0x80, 0x1e,
+                                                       0xe, 0x79, 0xa, 0xf7, 0x99, 0xef, 0xf7, 0x20,
+                                                       0xf7, 0x6, 0x1, 0xaa, 0xf7, 0x31, 0x3, 0xf7,
+                                                       0x44, 0xf8, 0x23, 0x15, 0xd5, 0x90, 0x96, 0xf7,
+                                                       0xf, 0xee, 0x1b, 0xd2, 0x92, 0x4d, 0x7b, 0x8d,
+                                                       0x1f, 0xf7, 0x1b, 0x99, 0x5, 0xf6, 0x77, 0x3f,
+                                                       0xd2, 0xfb, 0xb, 0x1b, 0xfb, 0x8a, 0x7d, 0xfb,
+                                                       0xc4, 0x4a, 0xfb, 0x4d, 0xe6, 0xfb, 0x43, 0xf7,
+                                                       0x3d, 0xf7, 0x20, 0xe4, 0xee, 0xf7, 0x22, 0xf7,
+                                                       0x22, 0xfb, 0x6, 0xe7, 0xfb, 0x7, 0x52, 0x5e,
+                                                       0x6f, 0x6e, 0x7e, 0x1f, 0x97, 0xfb, 0x45, 0x15,
+                                                       0xf7, 0x7, 0xdf, 0x9e, 0x9e, 0xec, 0x85, 0xfb,
+                                                       0x9, 0x7a, 0x77, 0x8a, 0x20, 0x31, 0x48, 0x67,
+                                                       0xc4, 0xd1, 0x1e, 0xe, 0x20, 0xa0, 0x76, 0xf8,
+                                                       0xe1, 0xf7, 0x10, 0x12, 0xf7, 0x14, 0xf7, 0x22,
+                                                       0x17, 0xf7, 0x14, 0x16, 0xf7, 0x22, 0x6, 0x13,
+                                                       0xe0, 0xf7, 0x6e, 0xf7, 0x12, 0xf7, 0x9c, 0xf7,
+                                                       0x18, 0xf7, 0xd, 0x1e, 0xea, 0xfc, 0x8b, 0xfb,
+                                                       0x10, 0xf7, 0xe3, 0x7, 0xfb, 0xb, 0xfb, 0x1d,
+                                                       0xfb, 0x5, 0xfb, 0x6f, 0xfb, 0x6e, 0x1a, 0xe,
+                                                       0x20, 0x78, 0xf7, 0x2, 0xf8, 0x8d, 0xf7, 0x2,
+                                                       0x1, 0xab, 0xf7, 0x23, 0xf7, 0x62, 0xf7, 0x23,
+                                                       0x3, 0xf7, 0x31, 0xf8, 0xe, 0x15, 0x3b, 0x6a,
+                                                       0x5e, 0x57, 0x36, 0x1a, 0xfb, 0x21, 0xf7, 0x4,
+                                                       0x35, 0xf7, 0x18, 0xf7, 0x1e, 0xf7, 0x2, 0xe3,
+                                                       0xf7, 0x1f, 0xc7, 0x72, 0xd1, 0x25, 0xb3, 0x1e,
+                                                       0xd1, 0xa9, 0xab, 0xc0, 0xc9, 0x1a, 0xe6, 0x4a,
+                                                       0xeb, 0xfb, 0x32, 0xfb, 0x34, 0x4c, 0x2b, 0x30,
+                                                       0x36, 0xc0, 0x64, 0xbe, 0x76, 0x1e, 0xa8, 0xf7,
+                                                       0x25, 0x15, 0xb3, 0xa4, 0xb0, 0xcc, 0xbc, 0xb4,
+                                                       0x74, 0x55, 0x3c, 0x47, 0x7c, 0x75, 0x77, 0x45,
+                                                       0x99, 0xdb, 0x1e, 0x80, 0xfb, 0xcf, 0x15, 0xa9,
+                                                       0x9a, 0xdc, 0xe1, 0xd4, 0xab, 0x51, 0x56, 0x2c,
+                                                       0x48, 0x75, 0x65, 0x59, 0x58, 0xac, 0xdf, 0x1e,
+                                                       0xe, 0x79, 0xa, 0xf7, 0x20, 0xef, 0xf7, 0x99,
+                                                       0xf7, 0x6, 0x1, 0xa9, 0xf7, 0x1f, 0xf7, 0x41,
+                                                       0xf7, 0x33, 0x3, 0xb7, 0xf7, 0x33, 0x15, 0x25,
+                                                       0x8e, 0xdd, 0x3f, 0xf7, 0x10, 0x1b, 0xf7, 0xa1,
+                                                       0x8b, 0xf7, 0xc4, 0xcc, 0xf7, 0x4e, 0x46, 0xf7,
+                                                       0x42, 0xfb, 0x55, 0xfb, 0x21, 0x32, 0x28, 0xfb,
+                                                       0x22, 0xfb, 0x22, 0xf7, 0x2, 0x2f, 0xf7, 0x8,
+                                                       0xa6, 0xb8, 0x90, 0xc1, 0xb9, 0x1f, 0x8d, 0x89,
+                                                       0x5, 0x41, 0x86, 0x78, 0xfb, 0xf, 0x28, 0x1b,
+                                                       0x44, 0x8b, 0xc9, 0x9b, 0x89, 0x1f, 0x80, 0xf7,
+                                                       0xbc, 0x15, 0x9f, 0x8b, 0xf6, 0xe6, 0xce, 0xaf,
+                                                       0x47, 0x44, 0xfb, 0x7, 0x33, 0x84, 0x78, 0x2a,
+                                                       0x95, 0xf7, 0x9, 0x9c, 0x1e, 0xe, 0x8b, 0xf7,
+                                                       0x19, 0xf7, 0x89, 0xf7, 0x1a, 0x1, 0xe7, 0xf7,
+                                                       0x2a, 0x3, 0xe7, 0x16, 0xf7, 0x2a, 0xf7, 0x19,
+                                                       0xfb, 0x2a, 0x6, 0xf7, 0x89, 0x4, 0xf7, 0x2a,
+                                                       0xf7, 0x1a, 0xfb, 0x2a, 0x6, 0xe, 0xfb, 0x27,
+                                                       0x76, 0xf7, 0x4a, 0x76, 0xf8, 0x12, 0xf7, 0x1d,
+                                                       0x12, 0xf3, 0xf7, 0x1e, 0x44, 0xd2, 0x13, 0xf0,
+                                                       0xf3, 0x84, 0x15, 0x13, 0xe8, 0xce, 0x6, 0x2c,
+                                                       0x56, 0x8b, 0x71, 0x82, 0x1e, 0xa6, 0x52, 0x5,
+                                                       0xf7, 0xf, 0xb7, 0x8b, 0xe9, 0xc9, 0x1a, 0xed,
+                                                       0x7, 0x13, 0xf0, 0xfb, 0x1e, 0x6, 0xf7, 0x89,
+                                                       0x4, 0xf7, 0x1e, 0xf7, 0x1d, 0x81, 0xa, 0x91,
+                                                       0xa, 0xf7, 0x58, 0x15, 0xf8, 0x90, 0xfb, 0x60,
+                                                       0x5, 0xf7, 0x18, 0x7, 0xfb, 0xf6, 0xf7, 0x14,
+                                                       0xf7, 0xf6, 0xf7, 0x15, 0x5, 0xf7, 0x19, 0x7,
+                                                       0xfc, 0x90, 0xfb, 0x62, 0x5, 0xe, 0x3c, 0xe2,
+                                                       0xf7, 0xe, 0xe4, 0x82, 0xa, 0xb3, 0xf8, 0x8c,
+                                                       0x3, 0xb3, 0xe2, 0x15, 0xf8, 0x8c, 0xf7, 0xe,
+                                                       0xfc, 0x8c, 0x6, 0xe4, 0x4, 0xf8, 0x8c, 0xf7,
+                                                       0xd, 0xfc, 0x8c, 0x6, 0xe, 0x91, 0xa, 0x83,
+                                                       0x15, 0xf8, 0x90, 0xf7, 0x62, 0x5, 0xf7, 0x4,
+                                                       0x7, 0xfc, 0x90, 0xf7, 0x60, 0x5, 0xfb, 0x18,
+                                                       0x7, 0xf7, 0xf5, 0xfb, 0x14, 0xfb, 0xf5, 0xfb,
+                                                       0x15, 0x5, 0xe, 0x57, 0x8b, 0xf7, 0x1e, 0xf8,
+                                                       0x77, 0xf5, 0x12, 0xf7, 0x87, 0xf7, 0xc, 0xfb,
+                                                       0xc, 0xf7, 0x19, 0xbe, 0xf7, 0x15, 0x13, 0xe8,
+                                                       0xf7, 0x87, 0xf7, 0x4e, 0x15, 0xf7, 0xd, 0x6,
+                                                       0x8a, 0x92, 0x8b, 0x93, 0x8f, 0x1a, 0xbf, 0x91,
+                                                       0x9e, 0xc3, 0xba, 0x1e, 0xe8, 0xdb, 0xb1, 0xba,
+                                                       0xd2, 0x1a, 0xf7, 0x5, 0x25, 0xe8, 0xfb, 0x27,
+                                                       0xfb, 0x37, 0x3d, 0xfb, 0x4, 0x29, 0x85, 0x1e,
+                                                       0xf7, 0xe, 0x7b, 0x5, 0xd7, 0x9a, 0xb1, 0xb7,
+                                                       0xd3, 0x1b, 0xc4, 0xca, 0x6b, 0x4a, 0x60, 0x75,
+                                                       0x79, 0x49, 0x52, 0x1f, 0x2d, 0x3d, 0x87, 0x5e,
+                                                       0x8d, 0x2a, 0x8, 0xfb, 0x4e, 0x4, 0x13, 0xd8,
+                                                       0xf7, 0x19, 0xf7, 0x1e, 0xfb, 0x19, 0x6, 0xe,
+                                                       0xf8, 0x2d, 0x46, 0xda, 0xf7, 0x0, 0xda, 0xf7,
+                                                       0xca, 0xdb, 0xec, 0xda, 0x1, 0xf7, 0x16, 0xd8,
+                                                       0xdc, 0xf7, 0x1, 0xf8, 0x53, 0xd7, 0x3, 0xf8,
+                                                       0xc8, 0xf7, 0x3b, 0x15, 0x79, 0x90, 0x93, 0x6c,
+                                                       0xcb, 0x1b, 0xf7, 0x40, 0xf6, 0xf7, 0x37, 0xf7,
+                                                       0x28, 0xf7, 0x4c, 0xfb, 0x17, 0xf7, 0x2a, 0xfb,
+                                                       0x79, 0xfb, 0xc8, 0xfb, 0xe, 0xfb, 0x89, 0xfb,
+                                                       0x5b, 0xfb, 0x9e, 0xf7, 0x7d, 0xfb, 0xe, 0xf7,
+                                                       0x5c, 0xf7, 0x18, 0xf7, 0x41, 0xb4, 0xf7, 0x2e,
+                                                       0xd5, 0x1f, 0x32, 0x6, 0x66, 0x6f, 0x47, 0x3c,
+                                                       0xfb, 0x56, 0x1b, 0xfb, 0xa9, 0x3c, 0xf7, 0x41,
+                                                       0xf7, 0x1c, 0xf7, 0x11, 0xc7, 0xf7, 0x84, 0xf7,
+                                                       0xb9, 0xf7, 0x72, 0xc9, 0xfb, 0x30, 0x28, 0xfb,
+                                                       0x1d, 0x20, 0x35, 0x62, 0x75, 0x91, 0xa9, 0xa8,
+                                                       0x90, 0x1f, 0xca, 0xf7, 0xcb, 0x5, 0xfb, 0x2,
+                                                       0x6, 0x81, 0x5b, 0x5, 0xc0, 0x6a, 0x56, 0x91,
+                                                       0x72, 0x1b, 0xfb, 0x2b, 0x3d, 0xfb, 0x3a, 0xfb,
+                                                       0xd, 0x27, 0xc8, 0x39, 0xf0, 0xcd, 0xb0, 0xb1,
+                                                       0x96, 0x96, 0x1f, 0xfb, 0x3b, 0xf7, 0x19, 0x15,
+                                                       0xc8, 0xa0, 0xf7, 0x26, 0xee, 0xd0, 0x9d, 0x43,
+                                                       0x6f, 0x51, 0x6b, 0xfb, 0x2c, 0x28, 0x50, 0x7a,
+                                                       0xc0, 0xbd, 0x1e, 0xe, 0x69, 0xa, 0xf7, 0x37,
+                                                       0xf7, 0xe, 0xf8, 0x45, 0x77, 0x1, 0x9f, 0xf9,
+                                                       0x3e, 0x3, 0x9f, 0x16, 0xf7, 0x26, 0x6, 0xc3,
+                                                       0xf7, 0x37, 0x5, 0xf7, 0xa3, 0x6, 0xc6, 0xfb,
+                                                       0x37, 0x5, 0xf7, 0x2a, 0x6, 0xfb, 0xa4, 0xf9,
+                                                       0x62, 0x40, 0xa, 0x76, 0xfc, 0x45, 0x15, 0xe7,
+                                                       0xf7, 0x9e, 0xe9, 0xfb, 0x9e, 0x5, 0xe, 0xc6,
+                                                       0x8c, 0xf7, 0xd, 0xf7, 0x51, 0xf7, 0xe, 0xf7,
+                                                       0x38, 0x7b, 0xa, 0xf7, 0x22, 0xf7, 0xa9, 0xf7,
+                                                       0x1f, 0x3, 0xd7, 0x8d, 0x15, 0xf7, 0xa7, 0x6,
+                                                       0xf7, 0x30, 0xf7, 0x36, 0x89, 0xf7, 0x5f, 0xb4,
+                                                       0x7e, 0xf0, 0xfb, 0xd, 0xb1, 0x1f, 0xcd, 0xa8,
+                                                       0xac, 0xba, 0xca, 0x1a, 0xf7, 0x33, 0xfb, 0x22,
+                                                       0xb0, 0xfb, 0x21, 0x1e, 0xfb, 0xa7, 0x6, 0xf7,
+                                                       0x22, 0xfb, 0xb1, 0x15, 0xf7, 0x38, 0xf7, 0x19,
+                                                       0x7, 0xc8, 0xde, 0x8c, 0x3f, 0x3f, 0x2a, 0x7e,
+                                                       0x5c, 0x1f, 0xfb, 0x19, 0xfb, 0xcb, 0x15, 0xf7,
+                                                       0x51, 0xf7, 0x19, 0x7, 0xef, 0xd2, 0x82, 0x28,
+                                                       0x47, 0x3d, 0x7e, 0x2e, 0x1f, 0xe, 0xc6, 0x78,
+                                                       0xf7, 0x13, 0xf8, 0x8a, 0xf7, 0x13, 0x1, 0xb7,
+                                                       0xf7, 0x2d, 0x3, 0xf8, 0xb0, 0xf7, 0x9a, 0x15,
+                                                       0x3b, 0x79, 0x5d, 0x41, 0x29, 0x1b, 0xfb, 0x2b,
+                                                       0x6d, 0xf7, 0xc, 0xf7, 0x11, 0xba, 0x89, 0xf7,
+                                                       0x66, 0xf7, 0x4b, 0xd7, 0xca, 0x60, 0x3c, 0x9d,
+                                                       0x1f, 0xf7, 0x27, 0xad, 0x5, 0xf7, 0xa, 0x71,
+                                                       0xfb, 0x17, 0xec, 0xfb, 0x27, 0x1b, 0xfb, 0x83,
+                                                       0x2c, 0xfb, 0x49, 0xfb, 0x5f, 0xfb, 0x78, 0xf7,
+                                                       0x1b, 0xfb, 0x24, 0xf7, 0x5b, 0xf7, 0x84, 0xbe,
+                                                       0xf7, 0x47, 0xc4, 0x9a, 0x1f, 0xe, 0xc6, 0x8b,
+                                                       0xf7, 0xd, 0xf8, 0x70, 0x7b, 0xa, 0xf7, 0x26,
+                                                       0xf7, 0xcc, 0xf7, 0x2b, 0x3, 0xd7, 0x16, 0xf7,
+                                                       0x7c, 0x6, 0xf7, 0x9e, 0xf7, 0x3, 0xf7, 0x23,
+                                                       0xf7, 0x65, 0xf7, 0xb0, 0xfb, 0x36, 0xdd, 0xfb,
+                                                       0x6b, 0x1f, 0xfb, 0x7c, 0x6, 0xf7, 0x26, 0xfc,
+                                                       0xe9, 0x15, 0xf8, 0x70, 0xe1, 0x7, 0xf7, 0xe,
+                                                       0xf3, 0x85, 0xfb, 0x83, 0xfb, 0x7b, 0xfb, 0x5,
+                                                       0x8b, 0xfb, 0x5, 0x1f, 0xe, 0x8f, 0x8b, 0xf7,
+                                                       0xd, 0xf7, 0x57, 0xf7, 0xd, 0xf7, 0x34, 0x7b,
+                                                       0xa, 0xf7, 0x24, 0x3, 0xd7, 0x16, 0xf8, 0xb5,
+                                                       0xf7, 0xd, 0xfc, 0x25, 0xf7, 0x57, 0xf7, 0xf3,
+                                                       0xf7, 0xd, 0xfb, 0xf3, 0xf7, 0x34, 0xf8, 0x18,
+                                                       0xf7, 0xd, 0xfc, 0xa8, 0x6, 0xe, 0x57, 0xa0,
+                                                       0x76, 0xf7, 0xc5, 0xf7, 0xd, 0xf7, 0x3f, 0x7b,
+                                                       0xa, 0xf7, 0x2a, 0x3, 0xd7, 0x16, 0xf7, 0x2a,
+                                                       0xf7, 0xc5, 0xf7, 0xc2, 0xf7, 0xd, 0xfb, 0xc2,
+                                                       0xf7, 0x3f, 0xf7, 0xfd, 0xf7, 0xd, 0xfc, 0x93,
+                                                       0x6, 0xe, 0xf7, 0x7, 0x78, 0xf7, 0x13, 0xf7,
+                                                       0x2e, 0xf7, 0x10, 0xf7, 0x60, 0xf7, 0x13, 0x1,
+                                                       0xc5, 0xf7, 0x29, 0xf7, 0xfc, 0xf7, 0x26, 0x3,
+                                                       0xf8, 0x22, 0xf7, 0x9a, 0x15, 0xf7, 0x3d, 0x2f,
+                                                       0x6, 0x7d, 0x78, 0x49, 0x5b, 0x37, 0x1b, 0xfb,
+                                                       0x3c, 0x66, 0xf7, 0x25, 0xf7, 0x0, 0xa0, 0x8f,
+                                                       0xa4, 0x94, 0xa9, 0x1f, 0x94, 0xaa, 0x97, 0xa5,
+                                                       0x9c, 0xa1, 0x8, 0xb8, 0xae, 0xbe, 0xa8, 0xcf,
+                                                       0x1b, 0xb6, 0xe5, 0x7c, 0x27, 0xa8, 0x1f, 0xf7,
+                                                       0x24, 0xa6, 0x5, 0xf7, 0x48, 0x63, 0xfb, 0x29,
+                                                       0xae, 0xfb, 0x9, 0x1b, 0xfb, 0x15, 0x32, 0x5a,
+                                                       0x43, 0x53, 0x1f, 0x6f, 0x67, 0x77, 0x63, 0x7e,
+                                                       0x5e, 0x8, 0x7e, 0x5e, 0x85, 0x65, 0x6c, 0x1a,
+                                                       0xfb, 0x54, 0xea, 0xfb, 0x50, 0xf7, 0x97, 0xf7,
+                                                       0x26, 0xf7, 0x12, 0xd4, 0xb3, 0xb6, 0x1e, 0xf7,
+                                                       0xb8, 0xfb, 0xcf, 0x7, 0xe, 0x69, 0xa, 0xf7,
+                                                       0xcf, 0xf7, 0xe, 0xf7, 0xad, 0x77, 0x1, 0xd2,
+                                                       0xf7, 0x26, 0xf7, 0xb4, 0xf7, 0x26, 0x3, 0xd2,
+                                                       0x16, 0xf7, 0x26, 0xf7, 0xcf, 0xf7, 0xb4, 0xfb,
+                                                       0xcf, 0xf7, 0x26, 0xf9, 0x62, 0xfb, 0x26, 0xfb,
+                                                       0xad, 0xfb, 0xb4, 0xf7, 0xad, 0xfb, 0x26, 0x6,
+                                                       0xe, 0xfc, 0x15, 0x3f, 0xa, 0xf7, 0x10, 0xf7,
+                                                       0x2a, 0x3, 0xcb, 0x16, 0xf7, 0x2a, 0xf9, 0x62,
+                                                       0xfb, 0x2a, 0x6, 0xe, 0x20, 0x79, 0xf7, 0x12,
+                                                       0xf8, 0xf6, 0x77, 0x1, 0xf7, 0xe7, 0xf7, 0x25,
+                                                       0x3, 0xa1, 0xf7, 0x70, 0x15, 0xfb, 0x38, 0xdb,
+                                                       0x41, 0xf7, 0x23, 0xf7, 0x41, 0xcd, 0xf7, 0xb,
+                                                       0xf7, 0x2b, 0x1e, 0xf8, 0x66, 0xfb, 0x25, 0xfc,
+                                                       0x66, 0x7, 0x44, 0x86, 0x42, 0x32, 0x36, 0x8f,
+                                                       0xdf, 0xb9, 0x87, 0x1e, 0xe, 0xc6, 0x3f, 0xa,
+                                                       0xe2, 0xf7, 0x22, 0x3, 0xe2, 0x16, 0xf7, 0x22,
+                                                       0xf7, 0x6e, 0x6, 0xf7, 0x8, 0xf7, 0xc, 0xf7,
+                                                       0x55, 0xfb, 0xe6, 0x5, 0xf7, 0x4c, 0x6, 0xfb,
+                                                       0xab, 0xf8, 0x4c, 0xf7, 0x9c, 0xf7, 0xaa, 0x5,
+                                                       0xfb, 0x52, 0x6, 0xfb, 0xb4, 0xfb, 0xd1, 0x5,
+                                                       0xf7, 0xd1, 0xfb, 0x22, 0x7, 0xe, 0x86, 0xa,
+                                                       0xd7, 0xf7, 0x25, 0x3, 0xd7, 0x16, 0xf8, 0x8f,
+                                                       0xf7, 0xe, 0xfb, 0xfe, 0xf8, 0xe8, 0xfb, 0x25,
+                                                       0x6, 0xe, 0xf7, 0x3e, 0xa0, 0x76, 0xf8, 0xc9,
+                                                       0xf7, 0x2d, 0x1, 0xd0, 0xf7, 0x1b, 0xf8, 0x3e,
+                                                       0xf7, 0x1b, 0x3, 0xd0, 0x16, 0xf7, 0x1b, 0xf8,
+                                                       0xc9, 0x8d, 0x6, 0xf7, 0x22, 0xfc, 0xc9, 0x5,
+                                                       0xf7, 0x20, 0x6, 0xf7, 0x20, 0xf8, 0xc9, 0x5,
+                                                       0x8d, 0xfc, 0xc9, 0xf7, 0x1b, 0xf9, 0x62, 0xfb,
+                                                       0x6f, 0x6, 0xfb, 0x13, 0xfc, 0x7c, 0x5, 0x88,
+                                                       0x6, 0xfb, 0x15, 0xf8, 0x7c, 0x5, 0xfb, 0x6e,
+                                                       0x6, 0xe, 0xc6, 0xa0, 0x76, 0xf9, 0x62, 0x5c,
+                                                       0xa, 0xf8, 0x67, 0x8d, 0x6, 0xf7, 0xbb, 0xfc,
+                                                       0x67, 0x5, 0xf7, 0x2a, 0xf9, 0x62, 0xfb, 0x1e,
+                                                       0xfc, 0x72, 0x89, 0x6, 0xfb, 0xc1, 0xf8, 0x72,
+                                                       0x5, 0xfb, 0x24, 0x6, 0xe, 0xf7, 0x7, 0x78,
+                                                       0xf7, 0x13, 0xf8, 0x76, 0xf7, 0x13, 0x1, 0xd0,
+                                                       0xf7, 0x28, 0xf7, 0xf8, 0x85, 0xa, 0xb7, 0xf7,
+                                                       0xea, 0x15, 0x7c, 0x8d, 0x75, 0x90, 0x6d, 0x1e,
+                                                       0x94, 0x4f, 0xa0, 0x53, 0xae, 0x58, 0x8, 0x40,
+                                                       0xbe, 0xe5, 0x57, 0xf7, 0x18, 0x1b, 0xf7, 0x10,
+                                                       0xe2, 0xba, 0xd2, 0xc2, 0x1f, 0xa6, 0xaf, 0x9f,
+                                                       0xb4, 0x98, 0xb8, 0x8, 0x98, 0xb9, 0x91, 0xb3,
+                                                       0xae, 0x1a, 0xf7, 0x69, 0x3d, 0xa, 0xfb, 0x20,
+                                                       0xfb, 0x7f, 0x1e, 0xf7, 0x28, 0x16, 0xf7, 0x0,
+                                                       0xac, 0xf7, 0x20, 0xf7, 0x38, 0xf7, 0x44, 0xa0,
+                                                       0xfb, 0x39, 0x38, 0x76, 0x87, 0x72, 0x84, 0x6c,
+                                                       0x1e, 0x84, 0x6c, 0x80, 0x70, 0x7c, 0x74, 0x8,
+                                                       0x5c, 0x6c, 0x59, 0x6e, 0x43, 0x1b, 0x3f, 0x5a,
+                                                       0xa9, 0x89, 0xa, 0xaa, 0x8, 0x85, 0xaa, 0x88,
+                                                       0xa5, 0xa0, 0x1a, 0xe, 0x8f, 0xa0, 0x76, 0xf7,
+                                                       0xac, 0xf7, 0xd, 0xf7, 0x58, 0xf7, 0xd, 0x60,
+                                                       0xa, 0xf7, 0xac, 0xdb, 0x6, 0xf7, 0x31, 0xf7,
+                                                       0x3d, 0x7e, 0xf7, 0x7a, 0xf7, 0x6c, 0xfb, 0x26,
+                                                       0x90, 0xfb, 0x48, 0x1f, 0xfb, 0x75, 0x6, 0xf7,
+                                                       0x25, 0xfb, 0xd1, 0x15, 0xf7, 0x58, 0xdb, 0x7,
+                                                       0xf4, 0xd2, 0x89, 0x27, 0x24, 0x26, 0x94, 0x40,
+                                                       0x1f, 0xe, 0xf7, 0x7, 0x6c, 0x76, 0xc6, 0xf7,
+                                                       0xf, 0xf8, 0x6f, 0xf7, 0xe, 0x1, 0xd1, 0xf7,
+                                                       0x23, 0xf7, 0xe7, 0xf7, 0x23, 0x3, 0xf8, 0xa8,
+                                                       0xb0, 0x15, 0xc4, 0x64, 0xb5, 0x68, 0xc2, 0x7c,
+                                                       0xbe, 0xf0, 0x18, 0x4f, 0xa2, 0x68, 0xa5, 0x7b,
+                                                       0x96, 0x8, 0xa6, 0xa7, 0xc5, 0xe2, 0xf7, 0x20,
+                                                       0x1a, 0xf7, 0x67, 0xfb, 0x3, 0xf7, 0x2c, 0xfb,
+                                                       0x73, 0xfb, 0x6b, 0xfb, 0xa, 0xfb, 0x20, 0xfb,
+                                                       0x73, 0x38, 0xa0, 0x2c, 0xbf, 0x47, 0x1e, 0x48,
+                                                       0xc0, 0xde, 0x5f, 0xf7, 0x10, 0x1b, 0xd3, 0xc7,
+                                                       0x9e, 0x96, 0xa2, 0x1f, 0xfb, 0x50, 0xf7, 0x23,
+                                                       0x15, 0xab, 0x7f, 0xb2, 0x76, 0x9a, 0x80, 0x8,
+                                                       0x88, 0x80, 0x80, 0x88, 0x6c, 0x1b, 0x44, 0x5c,
+                                                       0xa8, 0x89, 0xa, 0xac, 0x8, 0x85, 0xac, 0x88,
+                                                       0xa4, 0x9e, 0x1a, 0xf7, 0x7, 0xac, 0xf7, 0x12,
+                                                       0xf7, 0x31, 0xf7, 0x32, 0xac, 0xfb, 0x21, 0x27,
+                                                       0x6a, 0x81, 0x50, 0x7f, 0x6e, 0x1e, 0x80, 0x6f,
+                                                       0x7e, 0x7a, 0x84, 0x82, 0x6a, 0xa4, 0x5d, 0xa8,
+                                                       0x56, 0x9e, 0x8, 0xe, 0x69, 0xa, 0xf7, 0xc0,
+                                                       0xf7, 0x6, 0xf7, 0x4b, 0x7b, 0xa, 0xf7, 0x1b,
+                                                       0xf7, 0xa5, 0xf7, 0x1f, 0x3, 0xd7, 0x16, 0xf7,
+                                                       0x1b, 0xf7, 0xc0, 0xa6, 0x6, 0xe5, 0xa1, 0x81,
+                                                       0xfb, 0x16, 0xdc, 0x1f, 0xdf, 0xfb, 0x34, 0x5,
+                                                       0xf7, 0x36, 0x6, 0x3a, 0xf7, 0x20, 0x47, 0xf7,
+                                                       0x8, 0x71, 0xa5, 0x53, 0xad, 0x19, 0x8d, 0x7,
+                                                       0xf0, 0x92, 0xd7, 0xdb, 0xf7, 0x3, 0x1a, 0xf7,
+                                                       0x52, 0xfb, 0x1b, 0x97, 0xfb, 0x45, 0x1e, 0xfb,
+                                                       0x7f, 0x6, 0xf7, 0x1b, 0xfb, 0xc4, 0x15, 0xf7,
+                                                       0x4b, 0xef, 0x7, 0xf5, 0xce, 0x94, 0x28, 0x2c,
+                                                       0x30, 0x8d, 0x39, 0x1f, 0xe, 0x8f, 0x78, 0xf7,
+                                                       0x10, 0xf7, 0x64, 0xf7, 0x1b, 0xf7, 0x3b, 0xf7,
+                                                       0xe, 0x1, 0xcc, 0xf7, 0x21, 0xf7, 0x96, 0xf7,
+                                                       0x26, 0x3, 0xb2, 0xf7, 0x7b, 0x15, 0xfb, 0x87,
+                                                       0x72, 0xa, 0xbe, 0xf7, 0x42, 0xf7, 0x48, 0xfb,
+                                                       0x2a, 0xae, 0xfb, 0x3, 0xa6, 0x1f, 0xfb, 0x9,
+                                                       0xa6, 0x5e, 0x96, 0xba, 0x1a, 0xc6, 0xda, 0xa2,
+                                                       0xb6, 0xf7, 0x8, 0x96, 0x47, 0x65, 0x91, 0x1e,
+                                                       0xf7, 0x28, 0x91, 0x5, 0xf7, 0x3a, 0x85, 0xfb,
+                                                       0x18, 0xc3, 0xfb, 0x23, 0x1b, 0xfb, 0x69, 0x59,
+                                                       0xfb, 0x11, 0x3c, 0xfb, 0x36, 0xf7, 0x35, 0x63,
+                                                       0xd3, 0x79, 0x1f, 0xf7, 0x1a, 0x6a, 0xbe, 0x7e,
+                                                       0x4e, 0x1a, 0x5c, 0x61, 0x55, 0x25, 0xfb, 0x18,
+                                                       0x78, 0xf1, 0xb1, 0x84, 0x1e, 0xe, 0x57, 0xa0,
+                                                       0x76, 0xf8, 0xe8, 0xf7, 0xe, 0x1, 0xf7, 0x7c,
+                                                       0x85, 0xa, 0xf7, 0x7c, 0x16, 0xf7, 0x28, 0xf8,
+                                                       0xe8, 0xf7, 0x6e, 0xf7, 0xe, 0xfc, 0xdc, 0xfb,
+                                                       0xe, 0xf7, 0x6e, 0x6, 0xe, 0xc6, 0x78, 0xf7,
+                                                       0x12, 0xf8, 0xf7, 0x77, 0x42, 0xa, 0xd3, 0xf9,
+                                                       0x62, 0x15, 0xfc, 0x22, 0x7, 0xfb, 0x3c, 0xb7,
+                                                       0xfb, 0x3f, 0xf7, 0x8d, 0xf7, 0x6d, 0xd0, 0xf7,
+                                                       0x1, 0xf7, 0x7a, 0x1e, 0xf8, 0x22, 0xfb, 0x26,
+                                                       0xfc, 0x22, 0x7, 0xfb, 0x11, 0x8b, 0x33, 0xfb,
+                                                       0x20, 0xfb, 0x16, 0x7a, 0xdc, 0xf7, 0x18, 0x1e,
+                                                       0xf8, 0x22, 0x7, 0xe, 0x8f, 0x3f, 0xa, 0xf7,
+                                                       0x98, 0x16, 0xf7, 0x26, 0x6, 0xf7, 0x86, 0xf9,
+                                                       0x62, 0x40, 0xa, 0xfb, 0x39, 0xfc, 0xa7, 0x6e,
+                                                       0xa, 0xfb, 0x3d, 0xf8, 0xa7, 0x5, 0xfb, 0x28,
+                                                       0x6, 0xe, 0xf7, 0xad, 0xa0, 0x76, 0xf8, 0xaf,
+                                                       0x77, 0xf7, 0x5b, 0x77, 0x1, 0xf7, 0x4a, 0x16,
+                                                       0xf7, 0x2d, 0x6, 0xf7, 0x1d, 0xf8, 0xaf, 0x5,
+                                                       0x8c, 0x6, 0xf7, 0x1d, 0xfc, 0xaf, 0x5, 0xf7,
+                                                       0x2a, 0x6, 0xf7, 0x3d, 0xf9, 0x62, 0x5, 0xfb,
+                                                       0x22, 0x6, 0x22, 0xfc, 0x88, 0x6e, 0xa, 0xfb,
+                                                       0xd, 0xf8, 0x88, 0x5, 0xfb, 0x3b, 0x6, 0xfb,
+                                                       0x12, 0xfc, 0x80, 0x6e, 0xa, 0x23, 0xf8, 0x80,
+                                                       0x5, 0xfb, 0x24, 0x6, 0xe, 0x8f, 0x3f, 0xa,
+                                                       0x99, 0x16, 0xf7, 0x3b, 0x6, 0xf7, 0x2c, 0xf7,
+                                                       0x8d, 0xf7, 0x2d, 0xfb, 0x8d, 0x5, 0xf7, 0x3b,
+                                                       0x6, 0xfb, 0x7f, 0xf8, 0x7, 0xf7, 0x6a, 0xf7,
+                                                       0xef, 0x5, 0xfb, 0x35, 0x6, 0xfb, 0x1b, 0xfb,
+                                                       0x7c, 0xfb, 0x1e, 0xf7, 0x7c, 0x5, 0xfb, 0x36,
+                                                       0x6, 0xf7, 0x69, 0xfb, 0xe9, 0x5, 0xe, 0x8f,
+                                                       0x3f, 0xa, 0xf7, 0x9d, 0xf7, 0x1d, 0x3, 0xf7,
+                                                       0x9d, 0x16, 0xf7, 0x1d, 0xf7, 0xc2, 0x6, 0xf7,
+                                                       0x8f, 0xf8, 0x34, 0x4f, 0xa, 0xfc, 0x33, 0x5,
+                                                       0xe, 0x57, 0x8b, 0xf7, 0xe, 0xf8, 0x6e, 0xf7,
+                                                       0xe, 0x1, 0xa4, 0x16, 0xf8, 0xc5, 0xf7, 0xe,
+                                                       0x87, 0xa, 0xf7, 0x6, 0xfc, 0x8e, 0xfb, 0xe,
+                                                       0x8c, 0xa, 0xe, 0x7f, 0xa, 0xca, 0xf7, 0x19,
+                                                       0x3, 0xf7, 0x58, 0x33, 0x15, 0xf9, 0x52, 0xf7,
+                                                       0x5, 0xf7, 0x0, 0xfb, 0x8a, 0xfe, 0x2a, 0xf7,
+                                                       0x8a, 0xf7, 0x0, 0x7, 0xe, 0xfc, 0x15, 0x8d,
+                                                       0x76, 0xf9, 0x88, 0x77, 0x1, 0x4e, 0xf7, 0xec,
+                                                       0x3, 0xf7, 0x4e, 0x78, 0x15, 0xf7, 0x11, 0x6,
+                                                       0xfb, 0x6d, 0x93, 0xa, 0x7f, 0xa, 0xf7, 0x1d,
+                                                       0xf7, 0x19, 0x3, 0xa3, 0x33, 0x15, 0xfb, 0x0,
+                                                       0xf7, 0x8a, 0xfa, 0x2a, 0xfb, 0x8a, 0xfb, 0x0,
+                                                       0xf7, 0x5, 0xfd, 0x52, 0x7, 0xe, 0x3c, 0xf7,
+                                                       0xec, 0x76, 0xf7, 0x79, 0x84, 0xa, 0xc9, 0xf7,
+                                                       0xd7, 0x15, 0xf7, 0x1c, 0x6, 0xe9, 0xf7, 0x79,
+                                                       0xea, 0xfb, 0x79, 0x5, 0xf7, 0x1b, 0x6, 0xfb,
+                                                       0x42, 0xf8, 0xb, 0x5, 0x20, 0x6, 0xe, 0x20,
+                                                       0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8,
+                                                       0xc0, 0xbd, 0x7, 0xe, 0xf8, 0xf0, 0x84, 0xa,
+                                                       0x74, 0xf7, 0x8c, 0x3, 0xf7, 0x13, 0xf8, 0xf0,
+                                                       0x15, 0xed, 0x6, 0x3f, 0x83, 0xa, 0xfb, 0x40,
+                                                       0x6, 0xe, 0x20, 0x7d, 0xef, 0x48, 0x76, 0xf8,
+                                                       0x4c, 0xf7, 0x0, 0x12, 0xa8, 0xf7, 0x1a, 0xf7,
+                                                       0x58, 0xf7, 0x1d, 0x13, 0x78, 0xf8, 0x6, 0xc4,
+                                                       0x30, 0xa, 0x77, 0xb8, 0x83, 0xa3, 0x38, 0xa,
+                                                       0xad, 0x1a, 0xeb, 0x8a, 0xf4, 0xfb, 0x73, 0xfb,
+                                                       0x32, 0x5b, 0x49, 0x35, 0x73, 0x1e, 0xf7, 0x13,
+                                                       0x73, 0x5, 0xa6, 0x2d, 0xa, 0x7f, 0x6e, 0x83,
+                                                       0x3c, 0x7d, 0x8, 0x41, 0x7c, 0xfb, 0xc, 0x73,
+                                                       0xfb, 0x17, 0x1a, 0x13, 0xb8, 0x2e, 0xd1, 0x4a,
+                                                       0x37, 0xa, 0xf7, 0x5b, 0x15, 0x6f, 0x7, 0x3c,
+                                                       0x97, 0x5d, 0x4c, 0x3d, 0x1b, 0x55, 0x6d, 0xa7,
+                                                       0xa9, 0xbd, 0xca, 0xa9, 0xa4, 0x90, 0x1f, 0xa9,
+                                                       0x92, 0xc8, 0x95, 0x9c, 0x95, 0x8, 0xe, 0x57,
+                                                       0x7d, 0xf7, 0x2, 0x3e, 0x76, 0xf8, 0x41, 0xf5,
+                                                       0xf7, 0x4d, 0x77, 0x12, 0xde, 0xf7, 0x20, 0xf7,
+                                                       0x5a, 0xf7, 0x24, 0x13, 0x7c, 0xc8, 0x89, 0x15,
+                                                       0xf7, 0x17, 0xd8, 0x8d, 0x6, 0x13, 0xbc, 0x3d,
+                                                       0xc1, 0xd8, 0x80, 0xaa, 0x1b, 0xf7, 0x7, 0xf6,
+                                                       0xe0, 0xf7, 0x50, 0xf7, 0x4c, 0x22, 0xe5, 0xfb,
+                                                       0xa, 0x35, 0x5b, 0x5a, 0x74, 0x77, 0x1f, 0xf7,
+                                                       0x95, 0xfb, 0x20, 0x7, 0x13, 0x7c, 0xf7, 0x1f,
+                                                       0xfc, 0x52, 0x15, 0xf5, 0xbf, 0xbc, 0xcc, 0xf3,
+                                                       0x98, 0xfb, 0x2, 0x51, 0x1e, 0x13, 0xbc, 0xfb,
+                                                       0x16, 0x4c, 0x6a, 0x5b, 0x31, 0x6a, 0xda, 0xec,
+                                                       0x1e, 0xe, 0x20, 0x7d, 0xf7, 0x8, 0xf7, 0xe1,
+                                                       0xf7, 0x3, 0x1, 0xb9, 0xf7, 0x21, 0x3, 0xf8,
+                                                       0x1a, 0xf7, 0x5e, 0x15, 0x6c, 0x85, 0x76, 0x46,
+                                                       0x3b, 0x1b, 0x3c, 0x6e, 0xc6, 0xf7, 0x5, 0xac,
+                                                       0x86, 0xf7, 0x14, 0xf7, 0x5, 0xce, 0xa4, 0x5c,
+                                                       0x66, 0x92, 0x1f, 0xf7, 0x1b, 0xa4, 0x5, 0xd2,
+                                                       0x77, 0x5a, 0xee, 0xfb, 0x39, 0x1b, 0xfb, 0x59,
+                                                       0x57, 0xfb, 0x28, 0xfb, 0x10, 0x31, 0xae, 0xfb,
+                                                       0x5a, 0xf7, 0x6a, 0xf7, 0x17, 0xdc, 0xc9, 0xf7,
+                                                       0x18, 0xa8, 0x1f, 0xe, 0x57, 0x7d, 0xf7, 0x2,
+                                                       0x3e, 0x76, 0xf8, 0x3f, 0xf5, 0xf7, 0x4f, 0x77,
+                                                       0x12, 0xad, 0xf7, 0x24, 0xf7, 0x6d, 0xf7, 0x20,
+                                                       0x13, 0x7c, 0xf8, 0x38, 0x89, 0x15, 0xf7, 0x17,
+                                                       0xf9, 0x64, 0xfb, 0x20, 0xfb, 0x97, 0x6, 0xa2,
+                                                       0x77, 0x5b, 0xbc, 0x35, 0x1b, 0xfb, 0xa, 0x22,
+                                                       0x36, 0xfb, 0x4c, 0x1f, 0x13, 0xbc, 0xfb, 0x50,
+                                                       0xf6, 0x33, 0xf7, 0x7, 0xe9, 0xae, 0xb7, 0xb7,
+                                                       0xae, 0x1e, 0x13, 0x7c, 0xfb, 0x86, 0xf7, 0x50,
+                                                       0x15, 0xc5, 0x98, 0xf4, 0xf3, 0xcc, 0xbf, 0x51,
+                                                       0x22, 0x1e, 0x13, 0xbc, 0x2a, 0x6a, 0x46, 0x31,
+                                                       0x5b, 0x4c, 0xb0, 0xf7, 0x15, 0x1e, 0xe, 0x20,
+                                                       0x7d, 0xf7, 0x0, 0xf7, 0x17, 0xe1, 0xf7, 0x2b,
+                                                       0xf7, 0x0, 0x1, 0xa9, 0xf7, 0x28, 0xf7, 0x64,
+                                                       0xf7, 0x22, 0x3, 0xf7, 0x3c, 0xf7, 0x76, 0x15,
+                                                       0xf7, 0xfc, 0x6, 0xf7, 0x33, 0x57, 0xf7, 0x35,
+                                                       0xfb, 0x5e, 0xfb, 0x3e, 0x3a, 0xfb, 0x1e, 0xfb,
+                                                       0x25, 0xfb, 0x3b, 0xf1, 0xfb, 0x2, 0xf7, 0x29,
+                                                       0xf7, 0x46, 0xc3, 0xf7, 0x12, 0xac, 0x97, 0x1e,
+                                                       0xfb, 0x22, 0xa3, 0x5, 0x72, 0x83, 0x6d, 0x59,
+                                                       0x49, 0x1b, 0x3a, 0x74, 0xcf, 0xcb, 0x89, 0x1f,
+                                                       0x8e, 0xe1, 0x15, 0xce, 0xaf, 0xc6, 0xce, 0xd3,
+                                                       0xb3, 0x4d, 0x4b, 0x1e, 0xe, 0x76, 0xa, 0xf4,
+                                                       0xf4, 0x1, 0xd8, 0xf7, 0x14, 0x3, 0xd8, 0x16,
+                                                       0xf7, 0x14, 0xf8, 0x2c, 0xde, 0xf7, 0x1, 0x38,
+                                                       0xb0, 0x6, 0xa9, 0x8b, 0xb1, 0xbd, 0x93, 0x9c,
+                                                       0x89, 0x85, 0xa1, 0x1e, 0x9b, 0xeb, 0x5, 0x98,
+                                                       0x65, 0x76, 0x8f, 0x73, 0x1b, 0xfb, 0x21, 0x7a,
+                                                       0xfb, 0x1, 0x4e, 0x1f, 0x63, 0x48, 0xfb, 0x1,
+                                                       0xce, 0x7, 0xe, 0x57, 0xfb, 0x6d, 0xf7, 0x0,
+                                                       0xf7, 0x1, 0xf7, 0x7, 0xf7, 0xd7, 0xf7, 0x0,
+                                                       0x1, 0xb3, 0xf7, 0x23, 0xf7, 0x7b, 0xf7, 0x1f,
+                                                       0x3, 0xc5, 0x67, 0x15, 0xfb, 0x40, 0xf7, 0x10,
+                                                       0x82, 0xf7, 0xe, 0xf7, 0x79, 0x9f, 0xf7, 0xf,
+                                                       0xf7, 0x28, 0x1e, 0xf8, 0x74, 0xfb, 0x16, 0x40,
+                                                       0x89, 0x7, 0xa3, 0x7c, 0x5c, 0xca, 0x2a, 0x1b,
+                                                       0x35, 0xfb, 0x1c, 0x55, 0xfb, 0x70, 0xfb, 0x2c,
+                                                       0xde, 0xfb, 0xc, 0xf7, 0x1a, 0xca, 0xc4, 0xae,
+                                                       0xbe, 0xae, 0x1f, 0x8d, 0x3d, 0x6, 0x4d, 0x8b,
+                                                       0x54, 0xfb, 0x7, 0x50, 0x7d, 0x9c, 0xb0, 0x82,
+                                                       0x1e, 0x69, 0xf7, 0xdb, 0x15, 0xb3, 0x94, 0xf7,
+                                                       0x12, 0xf5, 0xea, 0xa1, 0x29, 0x47, 0xfb, 0x1f,
+                                                       0x38, 0x79, 0x66, 0x32, 0x74, 0xdf, 0xd4, 0x1e,
+                                                       0xe, 0x57, 0xa0, 0x76, 0xf8, 0x3e, 0xf4, 0xf7,
+                                                       0x4f, 0x77, 0x1, 0xcc, 0xf7, 0x20, 0xf7, 0x5d,
+                                                       0x7d, 0xa, 0xcc, 0x16, 0xf7, 0x20, 0xf7, 0x99,
+                                                       0x6, 0xc4, 0x8b, 0xf7, 0x0, 0xf7, 0x6, 0xe2,
+                                                       0x8b, 0x3e, 0x33, 0x1e, 0xfb, 0x99, 0xf7, 0x20,
+                                                       0xf7, 0x99, 0x7, 0xf7, 0x44, 0x4f, 0xe9, 0xfb,
+                                                       0xc, 0x6e, 0x47, 0x88, 0x40, 0x4b, 0x1e, 0xf7,
+                                                       0x9d, 0xfb, 0x20, 0x7, 0xe, 0x4c, 0xa, 0xf8,
+                                                       0xa1, 0x77, 0xe9, 0xf7, 0x12, 0x1, 0xf7, 0x22,
+                                                       0x63, 0xa, 0xf8, 0xa1, 0x68, 0xa, 0xd5, 0x4,
+                                                       0xf7, 0x20, 0xf7, 0x12, 0x6d, 0xa, 0xfc, 0x15,
+                                                       0xfb, 0x6a, 0xf7, 0x16, 0xf8, 0xf5, 0x77, 0xe9,
+                                                       0xf7, 0x12, 0x1, 0xf7, 0x8, 0xf7, 0x1b, 0x3,
+                                                       0xa7, 0x3b, 0x15, 0x73, 0xfb, 0xb, 0x5, 0x88,
+                                                       0x97, 0xb4, 0x7f, 0xb3, 0x1b, 0xf7, 0x22, 0x97,
+                                                       0xf7, 0x9, 0xf7, 0x5, 0x1f, 0xf8, 0x91, 0xfb,
+                                                       0x1b, 0xfc, 0x89, 0x7, 0x42, 0x8c, 0x68, 0x52,
+                                                       0x7c, 0x7f, 0x8e, 0x8c, 0x86, 0x1e, 0xe3, 0xf9,
+                                                       0x3b, 0x15, 0xf7, 0x1b, 0xf7, 0x12, 0xfb, 0x1b,
+                                                       0x6, 0xe, 0x20, 0x3f, 0xa, 0xd0, 0xf7, 0x21,
+                                                       0x3, 0xd0, 0x16, 0xf7, 0x21, 0xf7, 0x3b, 0x6,
+                                                       0xcd, 0xcf, 0xf7, 0x1a, 0xfb, 0x7f, 0x5, 0xf7,
+                                                       0x2c, 0x6, 0xfb, 0x57, 0xf7, 0xdf, 0xf7, 0x4b,
+                                                       0xf7, 0x53, 0x5, 0xfb, 0x42, 0x6, 0xfb, 0x3a,
+                                                       0xfb, 0x4c, 0x5, 0xf8, 0x10, 0xfb, 0x21, 0x7,
+                                                       0xe, 0xfc, 0x15, 0x3f, 0xa, 0xd0, 0x63, 0xa,
+                                                       0xf9, 0x62, 0x6d, 0xa, 0xf7, 0x76, 0xa0, 0x76,
+                                                       0xf8, 0x4a, 0xf7, 0x0, 0x7f, 0x77, 0x12, 0xdc,
+                                                       0xf7, 0x1d, 0xf7, 0x33, 0xf7, 0x1c, 0xf7, 0x44,
+                                                       0xf7, 0x1d, 0x13, 0xdc, 0xcb, 0x16, 0xf7, 0x1d,
+                                                       0xf7, 0xb1, 0x6, 0xe6, 0x9f, 0xc9, 0xe0, 0xd3,
+                                                       0x8a, 0x4f, 0x30, 0x1e, 0xfb, 0xb3, 0xf7, 0x1c,
+                                                       0xf7, 0xb3, 0x7, 0xd8, 0xa3, 0xd5, 0xda, 0xd4,
+                                                       0x8b, 0x33, 0x4c, 0x1e, 0xfb, 0xb3, 0xf7, 0x1d,
+                                                       0xf7, 0xb7, 0x7, 0xc5, 0x8b, 0xf7, 0x59, 0xfb,
+                                                       0x3e, 0x36, 0x59, 0x53, 0x6f, 0x74, 0x1e, 0xa1,
+                                                       0x7e, 0x69, 0xc9, 0x28, 0x1b, 0x66, 0x4d, 0x85,
+                                                       0x3d, 0x4f, 0x1f, 0x13, 0xbc, 0x89, 0xd3, 0xfb,
+                                                       0x13, 0x6, 0xe, 0x57, 0xa0, 0x76, 0xf8, 0x4a,
+                                                       0xeb, 0x2b, 0xf7, 0x0, 0x12, 0x7a, 0xf7, 0x20,
+                                                       0xf7, 0xaf, 0xf7, 0x20, 0x13, 0xb8, 0xcc, 0x16,
+                                                       0xf7, 0x20, 0xf7, 0x8f, 0x6, 0xe3, 0x94, 0xee,
+                                                       0xf6, 0xe0, 0x8b, 0x28, 0x33, 0x1e, 0xfb, 0x8f,
+                                                       0xf7, 0x20, 0xf7, 0x8f, 0x7, 0xf7, 0x18, 0x72,
+                                                       0xf7, 0x37, 0xfb, 0x2b, 0x55, 0x48, 0x78, 0x43,
+                                                       0x57, 0x1e, 0x13, 0xd8, 0x89, 0xda, 0xfb, 0x16,
+                                                       0x6, 0xe, 0x57, 0x7d, 0xf7, 0x8, 0xf7, 0xdc,
+                                                       0xf7, 0x8, 0x1, 0xac, 0xf7, 0x23, 0xf7, 0x95,
+                                                       0xf7, 0x23, 0x3, 0xad, 0xf7, 0xa1, 0x15, 0xfb,
+                                                       0x8e, 0xf7, 0x50, 0x6a, 0xde, 0xf7, 0x3e, 0xf2,
+                                                       0xf7, 0x1a, 0xf7, 0x29, 0xf7, 0x1c, 0x32, 0xf7,
+                                                       0x21, 0xfb, 0x4c, 0xfb, 0x4f, 0x37, 0xfb, 0x2a,
+                                                       0xfb, 0x13, 0x1e, 0xf7, 0x23, 0x16, 0xf7, 0x5,
+                                                       0xc8, 0xbb, 0xce, 0xd3, 0xc5, 0x56, 0xfb, 0x0,
+                                                       0xfb, 0xc, 0x49, 0x5c, 0x4b, 0x49, 0x4d, 0xbf,
+                                                       0xf7, 0x7, 0x1e, 0xe, 0x5a, 0xa, 0xe5, 0xf7,
+                                                       0x17, 0xf7, 0x60, 0xf7, 0x24, 0x13, 0xec, 0xf7,
+                                                       0x5e, 0xc6, 0x15, 0x73, 0x9f, 0xbb, 0x59, 0xe1,
+                                                       0x1b, 0xf7, 0x9, 0xf4, 0xdf, 0xf7, 0x51, 0xf7,
+                                                       0x55, 0x20, 0xea, 0xfb, 0x6, 0x6b, 0x3f, 0x80,
+                                                       0x3b, 0x55, 0x1f, 0x89, 0x6, 0x13, 0xdc, 0xda,
+                                                       0xfb, 0x17, 0xfd, 0x79, 0xf7, 0x20, 0x7, 0x8a,
+                                                       0xf8, 0x65, 0x15, 0x13, 0xec, 0xee, 0xab, 0xd7,
+                                                       0xe5, 0xbb, 0xca, 0x61, 0xfb, 0x19, 0x4f, 0x7e,
+                                                       0x22, 0x24, 0x4a, 0x57, 0xc3, 0xf7, 0x1, 0x1e,
+                                                       0xe, 0x5a, 0xa, 0xad, 0xf7, 0x24, 0xf7, 0x7e,
+                                                       0xf7, 0x20, 0xfb, 0x17, 0xf7, 0x17, 0x13, 0xdc,
+                                                       0xf8, 0x30, 0xc6, 0x15, 0xfb, 0x9e, 0xf7, 0x20,
+                                                       0xf9, 0x79, 0x7, 0x13, 0xda, 0xfb, 0x17, 0x3c,
+                                                       0x89, 0x6, 0x13, 0xec, 0xdb, 0x55, 0x3e, 0x96,
+                                                       0x6b, 0x1b, 0xfb, 0x7, 0x20, 0x2c, 0xfb, 0x55,
+                                                       0xfb, 0x51, 0xf4, 0x37, 0xf7, 0xa, 0xe1, 0xbb,
+                                                       0xbd, 0xa3, 0xa0, 0x1f, 0xfb, 0x7e, 0xf7, 0x5b,
+                                                       0x15, 0xf7, 0x19, 0xcb, 0xb5, 0xbb, 0xe5, 0xac,
+                                                       0x3f, 0x28, 0xfb, 0x1, 0x57, 0x53, 0x49, 0x24,
+                                                       0x7d, 0xf4, 0xc7, 0x1e, 0xe, 0xfb, 0xa6, 0xa0,
+                                                       0x76, 0xf8, 0x37, 0xf7, 0x7, 0xfb, 0x7, 0xf7,
+                                                       0x13, 0x12, 0xb9, 0xf7, 0x12, 0xf7, 0x35, 0xb3,
+                                                       0x13, 0xb8, 0xcb, 0x16, 0xf7, 0x12, 0xf7, 0x39,
+                                                       0x6, 0xf7, 0x28, 0x96, 0xf5, 0xdd, 0xa3, 0x9b,
+                                                       0x7c, 0x84, 0x95, 0x1e, 0xb3, 0xf7, 0xc, 0x5,
+                                                       0x9a, 0x75, 0x62, 0x99, 0x70, 0x1b, 0x55, 0x64,
+                                                       0x66, 0x58, 0x84, 0x1f, 0x13, 0xd0, 0x89, 0xd7,
+                                                       0xfb, 0x9, 0x6, 0xe, 0x20, 0x7d, 0xf0, 0xf7,
+                                                       0xfa, 0xf0, 0x1, 0xcb, 0xf7, 0x14, 0xf7, 0x51,
+                                                       0xf7, 0x1e, 0x3, 0xa9, 0xf7, 0x2b, 0x15, 0xfb,
+                                                       0x2a, 0x9e, 0xf7, 0x32, 0x7c, 0xd4, 0x1b, 0xf7,
+                                                       0x40, 0xce, 0xd7, 0xdf, 0xf7, 0xa, 0x20, 0xba,
+                                                       0x2f, 0xa2, 0x1f, 0x66, 0x94, 0x21, 0x99, 0xb6,
+                                                       0x1a, 0xb7, 0xcf, 0x8c, 0xa2, 0xa4, 0xc6, 0x89,
+                                                       0x4c, 0x9c, 0x1e, 0xf7, 0x17, 0xa3, 0x5, 0xf6,
+                                                       0x6d, 0x3d, 0xae, 0xfb, 0x10, 0x1b, 0xfb, 0x1,
+                                                       0xfb, 0x2, 0x62, 0xfb, 0xf, 0xfb, 0x13, 0xf6,
+                                                       0x77, 0xf7, 0x32, 0x68, 0x1f, 0xab, 0x84, 0xae,
+                                                       0x7b, 0x6c, 0x1a, 0x51, 0x32, 0x8a, 0x7f, 0x5e,
+                                                       0x58, 0x9a, 0xd2, 0x7b, 0x1e, 0xe, 0x9a, 0x76,
+                                                       0xf8, 0x26, 0xf3, 0xf7, 0x44, 0x77, 0x1, 0xe4,
+                                                       0xf7, 0x1a, 0x3, 0xf7, 0xc9, 0x99, 0x15, 0x7f,
+                                                       0xf0, 0x5, 0x46, 0x71, 0x75, 0x8c, 0xe5, 0x1a,
+                                                       0xf7, 0x6c, 0xe6, 0xf3, 0x30, 0xf7, 0x44, 0x7,
+                                                       0xfb, 0x1a, 0x3e, 0x5, 0x28, 0x4d, 0x23, 0xc9,
+                                                       0xfb, 0x6c, 0x7, 0xfb, 0x7, 0x95, 0x44, 0xf7,
+                                                       0xd, 0x99, 0xbb, 0x8d, 0x9d, 0xb7, 0x1e, 0xe,
+                                                       0x57, 0x7d, 0xf7, 0x0, 0x2b, 0xeb, 0xf8, 0x4a,
+                                                       0x77, 0x12, 0xd5, 0xf7, 0x1f, 0xf7, 0x55, 0xf7,
+                                                       0x1f, 0x13, 0x78, 0xf8, 0x34, 0x89, 0x15, 0xf7,
+                                                       0x15, 0xf8, 0xaa, 0xfb, 0x1f, 0xfb, 0xbb, 0x6,
+                                                       0x5c, 0x8d, 0x2b, 0xfb, 0x7, 0x2f, 0x8f, 0xde,
+                                                       0xc7, 0x1e, 0xf7, 0xbb, 0xfb, 0x1f, 0xfb, 0xbb,
+                                                       0x7, 0x13, 0xb8, 0xfb, 0x37, 0xba, 0x33, 0xf7,
+                                                       0x14, 0xcf, 0xce, 0xad, 0xc6, 0xb1, 0x1e, 0x8d,
+                                                       0x6, 0xe, 0x20, 0x73, 0xa, 0x98, 0xf8, 0xa6,
+                                                       0x3, 0xf7, 0x6f, 0x16, 0xf7, 0xd, 0x6, 0xf7,
+                                                       0x5f, 0xf8, 0xa8, 0x5, 0xfb, 0x1f, 0x6, 0xfb,
+                                                       0x11, 0xfb, 0xfd, 0x5, 0x8a, 0x6, 0xfb, 0xf,
+                                                       0xf7, 0xfd, 0x5, 0xfb, 0x22, 0x6, 0xe, 0xf7,
+                                                       0x7, 0x73, 0xa, 0x95, 0xf9, 0x8b, 0x3, 0xf7,
+                                                       0x40, 0x16, 0xf7, 0x17, 0x6, 0xe0, 0xf7, 0xec,
+                                                       0x5, 0x8d, 0x6, 0xe1, 0xfb, 0xec, 0x5, 0xf7,
+                                                       0x16, 0x6, 0xf7, 0x37, 0xf8, 0xa8, 0x5, 0xfb,
+                                                       0x19, 0x6, 0x2b, 0xfb, 0xf0, 0x6e, 0xa, 0x38,
+                                                       0xf7, 0xf0, 0x5, 0xfb, 0x17, 0x6, 0x35, 0xfb,
+                                                       0xf0, 0x6e, 0xa, 0x2d, 0xf7, 0xf0, 0x5, 0xfb,
+                                                       0x18, 0x6, 0xe, 0x20, 0x73, 0xa, 0x9a, 0xf8,
+                                                       0xa2, 0x3, 0x9a, 0x16, 0xf7, 0x30, 0x6, 0xf3,
+                                                       0xf7, 0x3a, 0xf2, 0xfb, 0x3a, 0x5, 0xf7, 0x37,
+                                                       0x6, 0xfb, 0x4f, 0xf7, 0xad, 0xf7, 0x3f, 0xf7,
+                                                       0x8f, 0x5, 0xfb, 0x30, 0x6, 0x2d, 0xfb, 0x25,
+                                                       0x32, 0xf7, 0x25, 0x5, 0xfb, 0x37, 0x6, 0xf7,
+                                                       0x42, 0xfb, 0x95, 0x5, 0xe, 0x20, 0xfb, 0x55,
+                                                       0x76, 0xf9, 0x7e, 0x77, 0x1, 0xb6, 0x2b, 0x15,
+                                                       0x97, 0xfb, 0x2, 0x52, 0xa, 0xf7, 0x1, 0xf7,
+                                                       0x12, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8, 0x93, 0x78,
+                                                       0xa, 0xfc, 0xd, 0x6e, 0xa, 0xfb, 0xe, 0xf8,
+                                                       0xd, 0x40, 0xa, 0xf7, 0x58, 0xfc, 0xa8, 0x5,
+                                                       0x29, 0x48, 0xa, 0xe, 0xfb, 0x37, 0x8b, 0xf7,
+                                                       0x10, 0xf7, 0xb7, 0xf7, 0x9, 0x1, 0x9f, 0x16,
+                                                       0xf8, 0x60, 0xf7, 0x10, 0xfb, 0xae, 0x6, 0xf7,
+                                                       0x9e, 0xf7, 0xc8, 0x5, 0xef, 0xfc, 0x3d, 0xfb,
+                                                       0x9, 0xf7, 0x88, 0x7, 0xfb, 0x9b, 0xfb, 0xc5,
+                                                       0x5, 0xe, 0x5b, 0xa, 0xf7, 0x2a, 0xf7, 0xc,
+                                                       0x14, 0xe0, 0xbb, 0xf7, 0x61, 0x15, 0xe8, 0x94,
+                                                       0x3f, 0xfb, 0x4, 0xfb, 0x2f, 0xbd, 0x51, 0xf7,
+                                                       0x20, 0x1f, 0xa4, 0xf7, 0x7, 0x6, 0x47, 0x70,
+                                                       0x8e, 0xcc, 0xf7, 0x4f, 0x78, 0xbc, 0x48, 0xb3,
+                                                       0x1f, 0xca, 0xb5, 0xa2, 0xab, 0xf7, 0x5d, 0x1a,
+                                                       0xcb, 0x9e, 0x90, 0xd7, 0x1e, 0xf7, 0x7, 0x72,
+                                                       0x7, 0xfb, 0x52, 0x8b, 0x32, 0xfb, 0x23, 0xfb,
+                                                       0x8, 0x7d, 0x56, 0x33, 0x1f, 0xe, 0xfc, 0x13,
+                                                       0xfb, 0x5a, 0x76, 0xfa, 0x50, 0x77, 0x1, 0xdf,
+                                                       0xf7, 0x4, 0x3, 0xdf, 0xfb, 0x6f, 0x15, 0xf7,
+                                                       0x4, 0xfa, 0x50, 0x7c, 0xa, 0xe, 0x5b, 0xa,
+                                                       0xf7, 0xb, 0xf7, 0xc, 0x14, 0xe0, 0xa3, 0x3a,
+                                                       0x15, 0xfb, 0x7, 0xa4, 0x7, 0xf7, 0x52, 0x8b,
+                                                       0xe4, 0xf7, 0x23, 0xf7, 0x8, 0x92, 0xc0, 0xea,
+                                                       0x1f, 0xf7, 0x8, 0x7, 0x29, 0x87, 0xd7, 0xf7,
+                                                       0x4, 0xf7, 0x2f, 0x59, 0xc5, 0xfb, 0x20, 0x1f,
+                                                       0x72, 0xfb, 0x7, 0x6, 0xcf, 0xa6, 0x88, 0x4a,
+                                                       0xfb, 0x4f, 0x9e, 0x5a, 0xce, 0x63, 0x1f, 0x4c,
+                                                       0x61, 0x74, 0x6b, 0xfb, 0x5d, 0x1a, 0x4b, 0x78,
+                                                       0x86, 0x3f, 0x1e, 0xe, 0x3c, 0xf7, 0x73, 0xf7,
+                                                       0xc, 0x1, 0xce, 0xf8, 0x62, 0x3, 0xc8, 0xf7,
+                                                       0x37, 0x15, 0xc2, 0xbf, 0xb3, 0x91, 0xa6, 0x1b,
+                                                       0xb4, 0xae, 0x7b, 0x7b, 0xae, 0x1f, 0x7d, 0xac,
+                                                       0xab, 0x7d, 0xb0, 0x1b, 0xd0, 0xbf, 0xbc, 0x95,
+                                                       0x94, 0x1f, 0xf7, 0xc, 0x7, 0x4d, 0x53, 0x56,
+                                                       0x89, 0x81, 0x1b, 0x72, 0x6b, 0x99, 0x98, 0x69,
+                                                       0x1f, 0x9b, 0x64, 0x61, 0x9c, 0x60, 0x1b, 0x76,
+                                                       0x56, 0x8b, 0x4e, 0x55, 0x1f, 0xe, 0xc6, 0x8b,
+                                                       0xf7, 0xb, 0xf7, 0xa4, 0xd5, 0xf7, 0x19, 0xf7,
+                                                       0xc, 0x1, 0x9f, 0xf7, 0x93, 0x15, 0xf7, 0x1,
+                                                       0x6, 0xfb, 0x2e, 0xae, 0xf7, 0x2b, 0x26, 0xf7,
+                                                       0x53, 0x1b, 0xcd, 0xc6, 0x95, 0xa0, 0xbc, 0x1f,
+                                                       0xf7, 0x25, 0x7, 0x66, 0x5f, 0x51, 0x77, 0x40,
+                                                       0x1b, 0x28, 0xfb, 0xa, 0xc2, 0xdc, 0x7a, 0x1f,
+                                                       0xf8, 0xf, 0x6, 0x9e, 0xd5, 0x5, 0xfc, 0x30,
+                                                       0x6, 0x9e, 0x89, 0xa5, 0x8d, 0x9c, 0x1e, 0xf8,
+                                                       0x3f, 0x6, 0x9f, 0xd5, 0x5, 0xfc, 0x46, 0x6,
+                                                       0xdb, 0x9f, 0xf7, 0xb, 0xc0, 0xef, 0x1b, 0xca,
+                                                       0xba, 0x7e, 0x70, 0xac, 0x1f, 0xae, 0xf7, 0x17,
+                                                       0x5, 0x9e, 0x5b, 0x4a, 0x95, 0x4a, 0x1b, 0xfb,
+                                                       0x58, 0xfb, 0x21, 0x29, 0xfb, 0x2f, 0x64, 0x1f,
+                                                       0x2e, 0x6, 0x79, 0x41, 0x5, 0xee, 0x6, 0x8a,
+                                                       0x7b, 0x8a, 0x6e, 0x8d, 0x7a, 0x8, 0x3a, 0x6,
+                                                       0xe, 0xfc, 0x15, 0xfb, 0x11, 0x76, 0x12, 0xdb,
+                                                       0xf7, 0x15, 0x48, 0xce, 0x13, 0xc0, 0xdb, 0x8a,
+                                                       0x15, 0x13, 0xa0, 0xc9, 0x6, 0x89, 0x43, 0x5c,
+                                                       0x7f, 0x73, 0x83, 0xa4, 0x56, 0x18, 0xf7, 0x7,
+                                                       0x45, 0xa, 0x7, 0x13, 0xc0, 0xfb, 0x15, 0x6,
+                                                       0xe, 0x20, 0xfb, 0x66, 0xf7, 0xa, 0xf8, 0x91,
+                                                       0xf4, 0xdc, 0xf7, 0x5, 0x1, 0x9b, 0x3b, 0x15,
+                                                       0x71, 0xfb, 0x3, 0x5, 0x7d, 0xb5, 0xa8, 0x86,
+                                                       0xa9, 0x1b, 0xf7, 0xb, 0xb6, 0xd4, 0xd9, 0x98,
+                                                       0x1f, 0xd9, 0xf8, 0x70, 0x5, 0xe7, 0x6, 0x9c,
+                                                       0xf4, 0x5, 0x2d, 0x6, 0x90, 0xa7, 0x5, 0xb1,
+                                                       0x92, 0x90, 0xa8, 0xb7, 0x1b, 0xa7, 0xa9, 0x81,
+                                                       0x87, 0x98, 0x1f, 0xa4, 0xf7, 0x5, 0x5, 0x9e,
+                                                       0x52, 0x6f, 0x8d, 0x80, 0x1b, 0xfb, 0x14, 0x67,
+                                                       0x48, 0xfb, 0x28, 0x73, 0x1f, 0x30, 0x6, 0x7a,
+                                                       0x22, 0x5, 0xe6, 0x6, 0x47, 0xfc, 0x3c, 0x5,
+                                                       0x4f, 0x82, 0x87, 0x72, 0x60, 0x1b, 0x77, 0x7b,
+                                                       0x8d, 0x95, 0x64, 0x1f, 0xe, 0xfb, 0x37, 0xfb,
+                                                       0x11, 0x76, 0xf7, 0x26, 0xf7, 0x13, 0x12, 0xd7,
+                                                       0xf7, 0x1a, 0x46, 0xd0, 0xe7, 0xf7, 0x1a, 0x45,
+                                                       0xd1, 0x13, 0xe8, 0xf7, 0xc2, 0x16, 0x13, 0xe4,
+                                                       0xcb, 0x6, 0x98, 0xa, 0x72, 0x83, 0xa5, 0x56,
+                                                       0x18, 0xf7, 0xc, 0x61, 0xa, 0xfb, 0x76, 0xfb,
+                                                       0x13, 0x15, 0x13, 0xd8, 0xcc, 0x6, 0x98, 0xa,
+                                                       0x71, 0x83, 0xa6, 0x56, 0x18, 0xf7, 0xb, 0x61,
+                                                       0xa, 0xe, 0xf7, 0xe5, 0x8b, 0x84, 0xa, 0xe7,
+                                                       0xf7, 0x1f, 0xf7, 0x5b, 0xf7, 0x20, 0xf7, 0x5b,
+                                                       0xf7, 0x1f, 0x14, 0x70, 0xf9, 0x95, 0x16, 0xf7,
+                                                       0x1f, 0xf7, 0x26, 0xfb, 0x1f, 0x6, 0xfd, 0x39,
+                                                       0xfb, 0x26, 0x15, 0xf7, 0x1f, 0xf7, 0x26, 0xfb,
+                                                       0x1f, 0x6, 0xf7, 0xe6, 0xfb, 0x26, 0x15, 0xf7,
+                                                       0x20, 0xf7, 0x26, 0x6d, 0xa, 0x20, 0xfb, 0x2a,
+                                                       0x76, 0xf8, 0xda, 0xf7, 0x7, 0xf7, 0x54, 0x77,
+                                                       0x1, 0xf7, 0x6b, 0xf7, 0x15, 0x3, 0xf7, 0x6b,
+                                                       0xfb, 0x3f, 0x15, 0xf7, 0x15, 0xf8, 0xda, 0x74,
+                                                       0xa, 0xf7, 0x54, 0xfb, 0x15, 0xfb, 0x54, 0xfb,
+                                                       0x47, 0xfb, 0x7, 0xf7, 0x47, 0x6, 0xe, 0x20,
+                                                       0xfb, 0x2a, 0x76, 0xf7, 0x3e, 0xf7, 0x7, 0xf7,
+                                                       0xd3, 0xf7, 0x7, 0xf7, 0x3e, 0x77, 0x1, 0xf7,
+                                                       0x6b, 0xf7, 0x15, 0x3, 0xaf, 0x8a, 0x15, 0xf7,
+                                                       0x47, 0xfb, 0x3e, 0xf7, 0x15, 0xf7, 0x3e, 0x74,
+                                                       0xa, 0xf7, 0xd3, 0x74, 0xa, 0xf7, 0x3e, 0xfb,
+                                                       0x15, 0xfb, 0x3e, 0xfb, 0x47, 0xfb, 0x7, 0xf7,
+                                                       0x47, 0xfb, 0xd3, 0xfb, 0x47, 0x6, 0xe, 0xf9,
+                                                       0x39, 0xd4, 0x1, 0x81, 0xf8, 0xf0, 0x95, 0xa,
+                                                       0xd4, 0xc8, 0x42, 0x77, 0xa, 0x83, 0xa, 0xfb,
+                                                       0x1b, 0x6, 0xe, 0xf7, 0xe5, 0x78, 0xd4, 0x5a,
+                                                       0x76, 0xf7, 0xab, 0xd4, 0x99, 0xd4, 0xf7, 0x64,
+                                                       0xd4, 0x91, 0x77, 0x12, 0x88, 0xeb, 0xe6, 0xeb,
+                                                       0xf7, 0x1, 0xeb, 0xe7, 0xea, 0xba, 0xeb, 0xe6,
+                                                       0xeb, 0x13, 0x7b, 0xf0, 0xe8, 0xf8, 0xa8, 0x15,
+                                                       0xcc, 0x93, 0xad, 0xb0, 0xaf, 0x96, 0x6b, 0x48,
+                                                       0x8a, 0x1e, 0x48, 0x8a, 0x82, 0x61, 0x67, 0x1b,
+                                                       0x66, 0x83, 0xb7, 0xcc, 0x1f, 0x2b, 0x16, 0x51,
+                                                       0x92, 0xfb, 0x10, 0xf7, 0x1a, 0xf7, 0x18, 0x95,
+                                                       0xf7, 0x10, 0xc5, 0xd1, 0x72, 0xf1, 0xfb, 0x9,
+                                                       0xfb, 0x10, 0x7a, 0xfb, 0x5, 0x50, 0x1e, 0xf7,
+                                                       0x1d, 0xfc, 0xb8, 0x15, 0xec, 0x6, 0x13, 0x77,
+                                                       0xf0, 0xf7, 0xc1, 0xf9, 0x6a, 0x5, 0x2a, 0x6,
+                                                       0x5d, 0xfc, 0xb2, 0x15, 0x13, 0xbb, 0xf0, 0x50,
+                                                       0x91, 0xfb, 0x14, 0xf7, 0x1b, 0xf7, 0x1c, 0x91,
+                                                       0xf7, 0x1f, 0xbb, 0xd0, 0x72, 0xee, 0xfb, 0x9,
+                                                       0x71, 0xa, 0x94, 0xa9, 0xaf, 0xb2, 0x93, 0x6d,
+                                                       0x4a, 0x48, 0x83, 0x5d, 0x64, 0x67, 0x82, 0xb9,
+                                                       0xce, 0x1e, 0xf7, 0x7e, 0x16, 0x50, 0x92, 0xfb,
+                                                       0x14, 0xf7, 0x1a, 0xf7, 0x1b, 0x92, 0xf7, 0x1f,
+                                                       0xbb, 0xd0, 0x73, 0xee, 0xfb, 0xa, 0x71, 0xa,
+                                                       0x93, 0xa9, 0xb0, 0xaf, 0x95, 0x6d, 0x4a, 0x4e,
+                                                       0x85, 0x56, 0x63, 0x5e, 0x8b, 0xc9, 0xbf, 0x1e,
+                                                       0xe, 0x8f, 0x78, 0xf7, 0xe, 0xf8, 0x8c, 0xf7,
+                                                       0xb, 0x1, 0xcc, 0xf7, 0x21, 0xf7, 0xa9, 0xf7,
+                                                       0x26, 0x3, 0xb2, 0xf7, 0x78, 0x15, 0xfb, 0x84,
+                                                       0x72, 0xa, 0xbd, 0xf7, 0x40, 0xf7, 0x45, 0xfb,
+                                                       0x2a, 0xae, 0xfb, 0x3, 0xa5, 0x1f, 0xfb, 0x9,
+                                                       0xa7, 0x5e, 0x95, 0xb9, 0x1a, 0xc5, 0xda, 0xa3,
+                                                       0xb6, 0xf7, 0x8, 0x96, 0x47, 0x66, 0x91, 0x1e,
+                                                       0xf7, 0x28, 0x91, 0x5, 0xf7, 0x37, 0x85, 0xfb,
+                                                       0x18, 0xc2, 0xfb, 0x23, 0x1b, 0xfb, 0x69, 0x59,
+                                                       0xfb, 0xe, 0x3c, 0xfb, 0x33, 0xf7, 0x35, 0x64,
+                                                       0xd3, 0x78, 0x1f, 0xf7, 0x1a, 0x6b, 0xbe, 0x7e,
+                                                       0x4f, 0x1a, 0x5c, 0x61, 0x56, 0x25, 0xfb, 0x18,
+                                                       0x78, 0xf0, 0xb0, 0x84, 0x1e, 0xe3, 0xf8, 0xbd,
+                                                       0x15, 0xf7, 0x14, 0x6, 0xf4, 0xf7, 0x22, 0x5,
+                                                       0xfb, 0x5, 0x6, 0x56, 0x41, 0x51, 0xd5, 0x5,
+                                                       0x7c, 0xa, 0xe, 0x5d, 0xa, 0xf7, 0x49, 0xd7,
+                                                       0x15, 0xd0, 0x6, 0x39, 0xf7, 0x64, 0xdd, 0xf7,
+                                                       0x5c, 0x5, 0x46, 0x6, 0x29, 0xfb, 0x5c, 0x5,
+                                                       0xe, 0xf7, 0xe5, 0x78, 0xf7, 0x13, 0xfb, 0x7,
+                                                       0xf7, 0x10, 0xf7, 0x59, 0xf7, 0x10, 0xf7, 0x37,
+                                                       0xf7, 0x10, 0xfb, 0x7, 0xf7, 0x13, 0x12, 0xb0,
+                                                       0xf7, 0x27, 0xf7, 0xcd, 0xf7, 0x19, 0x13, 0x76,
+                                                       0xf8, 0x8e, 0x84, 0x15, 0xf8, 0x5b, 0xf7, 0x10,
+                                                       0xfb, 0xdf, 0xf7, 0x59, 0xf7, 0xad, 0xf7, 0x10,
+                                                       0xfb, 0xad, 0xf7, 0x37, 0xf7, 0xd1, 0xf7, 0x10,
+                                                       0xfc, 0x4d, 0x3a, 0x89, 0x6, 0x13, 0xae, 0xc2,
+                                                       0x64, 0x5e, 0xb1, 0x37, 0x1b, 0xfb, 0x48, 0xfb,
+                                                       0xb, 0xfb, 0x26, 0xfb, 0x71, 0xfb, 0x7c, 0xeb,
+                                                       0xfb, 0x31, 0xf7, 0x55, 0xc0, 0xdb, 0x99, 0xdf,
+                                                       0xba, 0x1f, 0x13, 0x6e, 0xfb, 0xd6, 0xf7, 0xb7,
+                                                       0x15, 0xf7, 0x21, 0xaf, 0xee, 0xf7, 0x8, 0xf7,
+                                                       0x0, 0xc0, 0x3c, 0xfb, 0x35, 0x1e, 0x13, 0xb6,
+                                                       0xfb, 0x5b, 0x3d, 0x4c, 0x2e, 0x29, 0x5f, 0xcf,
+                                                       0xf7, 0x56, 0x1e, 0xe, 0xfc, 0x15, 0xf8, 0x6f,
+                                                       0x76, 0xf7, 0xa5, 0x77, 0x12, 0xd0, 0xf7, 0x15,
+                                                       0x17, 0xd0, 0xf8, 0x5a, 0x15, 0xf7, 0x15, 0xf7,
+                                                       0x10, 0x6, 0x13, 0xe0, 0x4d, 0x6, 0x8d, 0xd4,
+                                                       0xba, 0x9a, 0xa3, 0x93, 0x72, 0xc0, 0x18, 0xfb,
+                                                       0x7, 0x62, 0x8b, 0x35, 0x51, 0x1a, 0xe, 0xfc,
+                                                       0x15, 0xf8, 0x66, 0x76, 0xf7, 0xa5, 0x77, 0x12,
+                                                       0xdb, 0xf7, 0x15, 0x48, 0xce, 0x13, 0xe0, 0xe9,
+                                                       0xf8, 0x51, 0x15, 0xf7, 0x7, 0x45, 0xa, 0xfb,
+                                                       0x15, 0xfb, 0x13, 0x7, 0x13, 0xd0, 0xc9, 0x6,
+                                                       0x89, 0x42, 0x5c, 0x7f, 0x73, 0x83, 0x8, 0xe,
+                                                       0xfb, 0x37, 0xf8, 0x5a, 0xf7, 0x10, 0xf7, 0x29,
+                                                       0x77, 0x12, 0xcb, 0xd1, 0x45, 0xf7, 0x1a, 0xe7,
+                                                       0xd0, 0x46, 0xf7, 0x1a, 0x13, 0xd8, 0xcb, 0xf8,
+                                                       0x5a, 0x15, 0xf7, 0x1a, 0xf7, 0x10, 0x6, 0x13,
+                                                       0xd4, 0x4b, 0x6, 0x8d, 0xd4, 0xbc, 0x9a, 0xa4,
+                                                       0x93, 0x71, 0xc0, 0x18, 0xfb, 0xc, 0x62, 0x8b,
+                                                       0x34, 0x52, 0x1a, 0xf7, 0x76, 0x33, 0x15, 0xf7,
+                                                       0x1a, 0xf7, 0x10, 0x6, 0x13, 0xe4, 0x4a, 0x6,
+                                                       0x8d, 0xd4, 0xbc, 0x9a, 0xa5, 0x93, 0x70, 0xc0,
+                                                       0x18, 0xfb, 0xb, 0x62, 0x8b, 0x34, 0x52, 0x1a,
+                                                       0xe, 0xfb, 0x37, 0xf8, 0x66, 0x76, 0xf7, 0x26,
+                                                       0xf7, 0x13, 0x1, 0xd7, 0xf7, 0x1a, 0xe7, 0xf7,
+                                                       0x1a, 0x3, 0xf7, 0xd0, 0xf8, 0x51, 0x15, 0xf7,
+                                                       0xc, 0x45, 0xa, 0xfb, 0x1a, 0xfb, 0x13, 0xcb,
+                                                       0x7, 0x98, 0xa, 0x72, 0x83, 0x8, 0xfb, 0x5b,
+                                                       0x56, 0x15, 0xf7, 0xb, 0x45, 0xa, 0xfb, 0x1a,
+                                                       0xfb, 0x13, 0xcc, 0x7, 0x98, 0xa, 0x71, 0x83,
+                                                       0x8, 0xe, 0xfb, 0xcd, 0xf7, 0x6b, 0x76, 0xf7,
+                                                       0xde, 0x77, 0x1, 0x95, 0xf7, 0xde, 0x3, 0x95,
+                                                       0xf7, 0xfb, 0x15, 0x30, 0xd5, 0x41, 0xe5, 0xe6,
+                                                       0xd6, 0xd4, 0xe7, 0xe8, 0x40, 0xd3, 0x30, 0x30,
+                                                       0x42, 0x42, 0x2f, 0x1e, 0xe, 0x20, 0xf7, 0x77,
+                                                       0xf5, 0x1, 0xf7, 0x77, 0x4, 0xf8, 0xc0, 0xf5,
+                                                       0xfc, 0xc0, 0x6, 0xe, 0xf7, 0xe5, 0xf7, 0x77,
+                                                       0xf5, 0x1, 0xf7, 0x77, 0x4, 0xfa, 0x7c, 0xf5,
+                                                       0xfe, 0x7c, 0x6, 0xe, 0xf8, 0xf8, 0xf7, 0x11,
+                                                       0x21, 0x76, 0xb7, 0xde, 0x8a, 0x77, 0x12, 0x13,
+                                                       0x60, 0x7a, 0xf8, 0xf6, 0x15, 0xcf, 0x65, 0xa,
+                                                       0xab, 0xaf, 0x1b, 0xab, 0xa6, 0x81, 0x80, 0xa6,
+                                                       0x1f, 0x13, 0x80, 0x81, 0xa6, 0xa5, 0x80, 0xa8,
+                                                       0x1b, 0xe9, 0x8b, 0xee, 0xa5, 0x1f, 0x46, 0x7a,
+                                                       0xa, 0x6d, 0x66, 0x1b, 0x7f, 0x71, 0x95, 0x96,
+                                                       0x6d, 0x1f, 0x13, 0x50, 0x96, 0x6d, 0x69, 0x96,
+                                                       0x71, 0x1b, 0x44, 0x71, 0x59, 0x3f, 0x1f, 0xe,
+                                                       0xf7, 0xe5, 0xf7, 0xdb, 0x76, 0xf7, 0xe7, 0xd4,
+                                                       0x1, 0xf7, 0x5b, 0xe3, 0xf7, 0x54, 0xdf, 0xf7,
+                                                       0xca, 0xde, 0x3, 0xf7, 0x5b, 0xf7, 0xc6, 0x15,
+                                                       0xe3, 0xf7, 0xe7, 0xf7, 0x2b, 0xd4, 0xfc, 0x1e,
+                                                       0x42, 0xf7, 0x2f, 0x6, 0xf7, 0xac, 0xfb, 0xe7,
+                                                       0x15, 0xdf, 0xf7, 0xdc, 0x8d, 0x6, 0xf7, 0x5,
+                                                       0xfb, 0xdc, 0x5, 0xda, 0x6, 0xf7, 0x5, 0xf7,
+                                                       0xdc, 0x5, 0x8e, 0xfb, 0xdc, 0xde, 0xf8, 0x30,
+                                                       0xfb, 0x1e, 0x6, 0x28, 0xfb, 0xaf, 0x6e, 0xa,
+                                                       0x27, 0xf7, 0xaf, 0x5, 0x81, 0xa, 0x20, 0x7d,
+                                                       0xed, 0xf8, 0xa1, 0xf7, 0x21, 0x1, 0xbc, 0xf7,
+                                                       0x15, 0xf7, 0x5f, 0xf7, 0x1e, 0x3, 0xa9, 0xf7,
+                                                       0x26, 0x15, 0xfb, 0x1c, 0x9e, 0xf7, 0x33, 0x73,
+                                                       0xd4, 0x1b, 0xf7, 0x40, 0xcd, 0xe8, 0xdc, 0xf7,
+                                                       0x6, 0x22, 0xa6, 0x2e, 0xa1, 0x1f, 0x66, 0x94,
+                                                       0x21, 0x98, 0xb5, 0x1a, 0xb5, 0xd2, 0x8c, 0xa2,
+                                                       0xa4, 0xc3, 0x89, 0x4e, 0x9c, 0x1e, 0xf7, 0x18,
+                                                       0xa3, 0x5, 0xf2, 0x6d, 0x3d, 0xad, 0xfb, 0x11,
+                                                       0x1b, 0xfb, 0x2, 0xfb, 0x2, 0x63, 0xfb, 0xb,
+                                                       0xfb, 0xf, 0xf2, 0x75, 0xf7, 0x33, 0x69, 0x1f,
+                                                       0xab, 0x84, 0xb1, 0x7f, 0x6d, 0x1a, 0x53, 0x33,
+                                                       0x8a, 0x7f, 0x5e, 0x58, 0x99, 0xd0, 0x7a, 0x1e,
+                                                       0xb5, 0xf8, 0x4e, 0x15, 0xf7, 0x14, 0x6, 0xf3,
+                                                       0xf7, 0x21, 0x5, 0x7c, 0xa, 0x56, 0x42, 0x51,
+                                                       0xd4, 0x5, 0xfb, 0x3, 0x6, 0xe, 0x5d, 0xa,
+                                                       0xde, 0xd7, 0x15, 0xcf, 0x6, 0xee, 0xf7, 0x5f,
+                                                       0x28, 0xf7, 0x61, 0x5, 0x47, 0x6, 0xdc, 0xfb,
+                                                       0x61, 0x5, 0xe, 0xf7, 0xad, 0x7d, 0xf7, 0x0,
+                                                       0xfb, 0x0, 0xf7, 0x8, 0xf7, 0xf, 0xe4, 0xf7,
+                                                       0x8, 0xf7, 0x8, 0x24, 0xf2, 0x12, 0xad, 0xf7,
+                                                       0x24, 0xf7, 0x8b, 0xf7, 0x1f, 0x13, 0xb6, 0xf8,
+                                                       0x7c, 0xc7, 0x15, 0x41, 0xd4, 0xe3, 0x8b, 0x9c,
+                                                       0x1b, 0xe4, 0xf7, 0x3, 0xb1, 0xf7, 0x10, 0xb2,
+                                                       0x1f, 0xfb, 0x1c, 0xa2, 0x5, 0x6f, 0x81, 0x70,
+                                                       0x5a, 0x49, 0x1b, 0x4b, 0x6a, 0xbb, 0xde, 0x86,
+                                                       0x1f, 0xf7, 0xf0, 0x6, 0xf7, 0x82, 0x29, 0xde,
+                                                       0xfb, 0x28, 0xfb, 0x0, 0x57, 0x52, 0x7a, 0x7a,
+                                                       0x1e, 0xd0, 0x46, 0x35, 0x90, 0x6c, 0x1b, 0xfb,
+                                                       0x4c, 0x36, 0xfb, 0x18, 0xfb, 0x24, 0xfb, 0x20,
+                                                       0xe7, 0xfb, 0x24, 0xf7, 0x45, 0xef, 0xc5, 0xbc,
+                                                       0xa4, 0xa6, 0x1f, 0xfb, 0xca, 0xf7, 0x66, 0x15,
+                                                       0xf7, 0xc, 0xc0, 0xb3, 0xd3, 0xce, 0xc2, 0x53,
+                                                       0x23, 0x1e, 0x13, 0x6e, 0xfb, 0x2c, 0x2e, 0x7b,
+                                                       0x6e, 0x2c, 0x6d, 0xf7, 0x8, 0xbf, 0x1e, 0xf8,
+                                                       0x17, 0xb7, 0x15, 0xa6, 0x8d, 0x91, 0xf1, 0xe8,
+                                                       0x1b, 0xf0, 0x94, 0xfb, 0x0, 0x76, 0x8c, 0x1f,
+                                                       0xe, 0x8f, 0xa0, 0x76, 0xf9, 0xb2, 0xf7, 0x9,
+                                                       0x12, 0xf7, 0x45, 0xf7, 0x5, 0x72, 0xf7, 0x1d,
+                                                       0x73, 0xf7, 0x5, 0x13, 0xd0, 0x70, 0xa, 0xf8,
+                                                       0x33, 0x4f, 0xa, 0xfc, 0x32, 0x5, 0x13, 0xe8,
+                                                       0x33, 0xf8, 0x85, 0x8b, 0xa, 0xf7, 0x5d, 0xfb,
+                                                       0x9, 0x8b, 0xa, 0xe, 0xfb, 0x39, 0x76, 0xf8,
+                                                       0xd9, 0xf7, 0x1d, 0x12, 0xe5, 0xf7, 0x2e, 0xfb,
+                                                       0x28, 0xf7, 0x22, 0x13, 0xd0, 0xeb, 0xf8, 0x1f,
+                                                       0x15, 0xf7, 0x22, 0xf7, 0x1d, 0xfb, 0x22, 0x6,
+                                                       0x13, 0xe0, 0x85, 0xfc, 0xba, 0x15, 0xfb, 0x3c,
+                                                       0xf7, 0x2e, 0xf7, 0x3c, 0x7, 0x65, 0xf8, 0x0,
+                                                       0x5, 0x38, 0x6, 0xe, 0x20, 0x2a, 0x76, 0xf3,
+                                                       0xf7, 0x1, 0xf7, 0xcf, 0xf5, 0xf7, 0x4, 0x77,
+                                                       0x1, 0xad, 0xf7, 0x1a, 0x3, 0xf7, 0x42, 0x90,
+                                                       0x15, 0x6c, 0x21, 0xc6, 0x7a, 0xab, 0xf7, 0x0,
+                                                       0x5, 0x89, 0x94, 0x9b, 0x89, 0xa4, 0x1b, 0xf7,
+                                                       0x18, 0xdb, 0xc8, 0xf7, 0xe, 0xa7, 0x1f, 0xfb,
+                                                       0x1b, 0xa2, 0x5, 0x6e, 0x86, 0x77, 0x47, 0x3b,
+                                                       0x1b, 0x7f, 0x8a, 0x8c, 0x8c, 0x87, 0x1f, 0xe5,
+                                                       0xf7, 0xb4, 0x9d, 0x78, 0x90, 0x74, 0x8d, 0x7f,
+                                                       0x19, 0xf7, 0x1b, 0xa2, 0x70, 0xe8, 0x58, 0xad,
+                                                       0x5c, 0x9d, 0x19, 0xb2, 0xf7, 0x4, 0x4f, 0x9c,
+                                                       0x64, 0xfb, 0x7, 0x5, 0x8c, 0x81, 0x7d, 0x8d,
+                                                       0x75, 0x1b, 0xfb, 0x62, 0x5d, 0xfb, 0x35, 0x25,
+                                                       0x3a, 0xb7, 0xfb, 0x25, 0xeb, 0x75, 0x1f, 0xb1,
+                                                       0xf7, 0xc, 0x15, 0x67, 0xb4, 0x83, 0xce, 0x9f,
+                                                       0x1a, 0xab, 0x92, 0xf7, 0x1c, 0xf7, 0x11, 0x80,
+                                                       0x1e, 0xe, 0x20, 0x7b, 0xf7, 0xf, 0xf7, 0x50,
+                                                       0xf7, 0x1, 0xf7, 0x62, 0xf7, 0x0, 0x1, 0xdd,
+                                                       0xf7, 0x14, 0x3, 0xd9, 0x7b, 0x15, 0x9b, 0xa2,
+                                                       0xb0, 0xa5, 0xc3, 0x1b, 0xab, 0xb8, 0x82, 0x81,
+                                                       0xb4, 0x1f, 0x80, 0xb9, 0xb4, 0x7f, 0x97, 0x1b,
+                                                       0xbc, 0xbd, 0x9d, 0x9c, 0xaa, 0x1f, 0x58, 0xf7,
+                                                       0x7, 0x5, 0x81, 0x74, 0x67, 0x7a, 0x66, 0x1b,
+                                                       0x72, 0x79, 0x92, 0x92, 0x75, 0x1f, 0x91, 0x77,
+                                                       0x73, 0x91, 0x67, 0x1b, 0x83, 0x6c, 0x8b, 0x7d,
+                                                       0x73, 0x1f, 0x89, 0x8d, 0xb1, 0xb4, 0xb4, 0xbd,
+                                                       0x83, 0xde, 0x19, 0xf7, 0x11, 0xf7, 0x1, 0xfb,
+                                                       0x27, 0x6, 0x82, 0xa4, 0x7d, 0xc2, 0xae, 0x1a,
+                                                       0xb2, 0xa5, 0xbf, 0xc8, 0xd4, 0x98, 0x42, 0x73,
+                                                       0x90, 0x1e, 0xf7, 0x13, 0x9e, 0x5, 0xf7, 0x3f,
+                                                       0x73, 0xfb, 0x1b, 0x9a, 0x50, 0x1b, 0xfb, 0x1c,
+                                                       0x3c, 0x2e, 0x22, 0x7e, 0x8c, 0x5a, 0x9d, 0x55,
+                                                       0x1f, 0x42, 0xfb, 0x1, 0xec, 0x6, 0x98, 0x3d,
+                                                       0x5b, 0x45, 0x4d, 0x5d, 0x8, 0xe, 0x20, 0xec,
+                                                       0x76, 0xb5, 0xf7, 0x16, 0xf7, 0x6c, 0xf7, 0x16,
+                                                       0xb5, 0x77, 0x1, 0xb2, 0xf7, 0x17, 0xf7, 0x6e,
+                                                       0xf7, 0x16, 0x3, 0xe6, 0xd8, 0x15, 0xd2, 0xd2,
+                                                       0x5, 0x78, 0xae, 0xb3, 0x80, 0xb4, 0x1b, 0xb7,
+                                                       0xb5, 0x97, 0x9e, 0xaa, 0x1f, 0xd5, 0x42, 0xe5,
+                                                       0xe6, 0x43, 0xd3, 0x5, 0x9e, 0xae, 0x97, 0xb3,
+                                                       0xb5, 0x1a, 0xab, 0x83, 0xb5, 0x74, 0xb6, 0x1e,
+                                                       0xd3, 0xd3, 0x30, 0xe6, 0x42, 0x42, 0x5, 0x95,
+                                                       0x78, 0x66, 0xa0, 0x4e, 0x1b, 0x4e, 0x63, 0x76,
+                                                       0x81, 0x7a, 0x1f, 0x42, 0xd4, 0x31, 0x2b, 0xd2,
+                                                       0x46, 0x5, 0x78, 0x68, 0x81, 0x64, 0x62, 0x1a,
+                                                       0x71, 0x8f, 0x60, 0xa6, 0x5b, 0x1e, 0x44, 0x45,
+                                                       0x5, 0xf7, 0x3f, 0xf7, 0x4f, 0x15, 0xc7, 0xbb,
+                                                       0xbb, 0xc7, 0xc7, 0xbd, 0x5b, 0x4f, 0x4f, 0x59,
+                                                       0x5b, 0x4f, 0x4f, 0x5b, 0xbb, 0xc7, 0x1e, 0xe,
+                                                       0x20, 0xa0, 0x76, 0xf9, 0x4e, 0x77, 0x1, 0xf7,
+                                                       0x61, 0xf7, 0x23, 0x3, 0x9b, 0xf7, 0x2a, 0x15,
+                                                       0xf7, 0x51, 0xfb, 0x2a, 0xf7, 0x23, 0xf7, 0x2a,
+                                                       0xf7, 0x54, 0xf5, 0xfb, 0x54, 0xd0, 0xf7, 0x54,
+                                                       0xf5, 0xfb, 0xa, 0x6, 0xf7, 0x23, 0xf7, 0x9f,
+                                                       0x96, 0xa, 0xfb, 0x16, 0xfb, 0xa0, 0x6e, 0xa,
+                                                       0xfb, 0x14, 0xf7, 0xa0, 0x96, 0xa, 0xf7, 0x22,
+                                                       0xfb, 0x9f, 0x5, 0xfb, 0x9, 0x21, 0xf7, 0x51,
+                                                       0x46, 0xfb, 0x51, 0x6, 0xe, 0xfc, 0x13, 0x8d,
+                                                       0x76, 0xf9, 0x88, 0x77, 0x1, 0xdf, 0xf7, 0x4,
+                                                       0x3, 0xdf, 0x78, 0x15, 0xf7, 0x4, 0xf7, 0xcb,
+                                                       0x7c, 0xa, 0xf7, 0x1b, 0x4, 0xf7, 0x4, 0xf7,
+                                                       0xca, 0x7c, 0xa, 0xe, 0x20, 0xfb, 0x4c, 0xf1,
+                                                       0xf9, 0x57, 0xf1, 0x12, 0xad, 0xf7, 0x10, 0x38,
+                                                       0xf7, 0x1c, 0xf7, 0x27, 0xf7, 0x1a, 0x32, 0xf7,
+                                                       0xb, 0x13, 0xe8, 0xc8, 0x7f, 0x15, 0xfb, 0x7,
+                                                       0x9b, 0xe6, 0x52, 0xf7, 0x8, 0x1b, 0xf7, 0x2d,
+                                                       0xc2, 0xe3, 0xd7, 0xaf, 0x7e, 0xb7, 0x5e, 0xb5,
+                                                       0x1f, 0x13, 0xd4, 0xa9, 0x9e, 0xc5, 0xb7, 0xe0,
+                                                       0x1a, 0xd0, 0x67, 0xc0, 0x23, 0xcd, 0x1e, 0x57,
+                                                       0xab, 0xfb, 0xb, 0xcb, 0xba, 0x1a, 0x9f, 0x95,
+                                                       0xa3, 0xbb, 0xba, 0xaa, 0x71, 0x5d, 0x8d, 0x1e,
+                                                       0xf7, 0x19, 0x9a, 0x5, 0xc5, 0x83, 0x60, 0xf0,
+                                                       0xfb, 0x36, 0x1b, 0xfb, 0xe, 0x43, 0x49, 0x35,
+                                                       0x53, 0xad, 0x67, 0x99, 0x7c, 0x1f, 0x13, 0xe8,
+                                                       0x44, 0x61, 0x79, 0x48, 0x60, 0x1a, 0x24, 0xb6,
+                                                       0x6d, 0xf7, 0x1e, 0x36, 0x1e, 0xbd, 0x6c, 0xe8,
+                                                       0x5f, 0x59, 0x1a, 0x65, 0x63, 0x7a, 0x69, 0x4c,
+                                                       0x77, 0xb8, 0xb3, 0x83, 0x1e, 0xf7, 0x3c, 0xf7,
+                                                       0x30, 0x15, 0xfb, 0x1f, 0xe7, 0x5, 0x61, 0xa8,
+                                                       0x75, 0xa8, 0xac, 0x1a, 0xaf, 0xa9, 0xa3, 0x96,
+                                                       0x90, 0x1e, 0xf7, 0x18, 0x2d, 0x5, 0x13, 0xe4,
+                                                       0xb8, 0x6a, 0xa6, 0x78, 0x6b, 0x1a, 0x72, 0x7a,
+                                                       0x75, 0x72, 0x74, 0x1e, 0xe, 0xf8, 0xfa, 0xf7,
+                                                       0x7, 0x1, 0x91, 0xf7, 0x7, 0xe6, 0xf7, 0x7,
+                                                       0x3, 0x91, 0x44, 0xa, 0xe, 0xd5, 0x78, 0xd6,
+                                                       0xe7, 0xd2, 0xf7, 0xab, 0xd2, 0xe8, 0xd6, 0x1,
+                                                       0x80, 0xd6, 0xf7, 0xb, 0xe2, 0xf8, 0x28, 0xd6,
+                                                       0x3, 0xcb, 0xf7, 0xfb, 0x15, 0xf7, 0x3c, 0xf7,
+                                                       0x1d, 0xf7, 0x1b, 0xf7, 0x3d, 0x58, 0xa, 0xfb,
+                                                       0x3d, 0xfb, 0x1d, 0xf7, 0x1b, 0xf7, 0x3c, 0x1e,
+                                                       0xf8, 0x22, 0x53, 0x15, 0x76, 0x84, 0x78, 0x4c,
+                                                       0x45, 0x1b, 0x5e, 0x58, 0xad, 0xf5, 0xbd, 0x99,
+                                                       0xe4, 0xe4, 0xc9, 0x9e, 0x5b, 0x77, 0x92, 0x1f,
+                                                       0xdb, 0x9e, 0x5, 0xaf, 0x7e, 0x66, 0xdf, 0xfb,
+                                                       0xa, 0x1b, 0xfb, 0x10, 0x49, 0x36, 0xfb, 0x11,
+                                                       0xfb, 0x2f, 0xeb, 0x53, 0xe2, 0xcc, 0xdc, 0xa9,
+                                                       0xed, 0xa8, 0x1f, 0xfc, 0xbc, 0xde, 0x15, 0xfb,
+                                                       0x65, 0xf7, 0x3e, 0xfb, 0x3d, 0xf7, 0x67, 0x57,
+                                                       0xa, 0xfb, 0x67, 0x80, 0xa, 0xfb, 0xb9, 0xf7,
+                                                       0xa8, 0xe7, 0xf7, 0xa5, 0xeb, 0x1, 0xa1, 0xef,
+                                                       0xf7, 0x4, 0xed, 0x3, 0xf7, 0x93, 0xf7, 0xb3,
+                                                       0x15, 0xe7, 0x6, 0x7c, 0xaf, 0x8b, 0xa0, 0xd3,
+                                                       0x1a, 0xf7, 0x27, 0x7, 0xf0, 0x8b, 0xd4, 0xfb,
+                                                       0x29, 0x3a, 0x5a, 0x6b, 0x2f, 0x7a, 0x1e, 0xe6,
+                                                       0x73, 0x5, 0x8c, 0x8d, 0x8f, 0x8c, 0x8e, 0x1e,
+                                                       0xa5, 0x93, 0x93, 0x9d, 0xb1, 0x1b, 0xba, 0x8c,
+                                                       0x79, 0x5a, 0x8d, 0x1f, 0x78, 0x83, 0x73, 0x85,
+                                                       0x79, 0x86, 0x8, 0x35, 0x74, 0x4a, 0x7f, 0xfb,
+                                                       0x0, 0x1a, 0x41, 0xb5, 0x4d, 0xd6, 0xc1, 0xaf,
+                                                       0xae, 0x9e, 0x9a, 0x1e, 0x8d, 0x80, 0x8e, 0x7b,
+                                                       0x91, 0x7b, 0x8, 0x76, 0xf7, 0x62, 0x15, 0x72,
+                                                       0x7, 0x30, 0x5a, 0x82, 0x7c, 0x69, 0x7d, 0xa4,
+                                                       0x9e, 0xb3, 0xaa, 0x9a, 0xbd, 0x97, 0x1e, 0x9f,
+                                                       0x90, 0x8f, 0x8f, 0x92, 0x90, 0x8, 0xe, 0x20,
+                                                       0x5d, 0xa, 0xf8, 0x10, 0xd7, 0x53, 0xa, 0x61,
+                                                       0xfb, 0x64, 0x53, 0xa, 0xe, 0x3c, 0xf7, 0x15,
+                                                       0x76, 0x1, 0xf8, 0x20, 0xf7, 0x13, 0x3, 0xb3,
+                                                       0xf7, 0xc6, 0x15, 0xf7, 0xf9, 0xfb, 0x5a, 0xf7,
+                                                       0x13, 0xf7, 0xcb, 0xfc, 0x78, 0x6, 0xe, 0x3c,
+                                                       0xf7, 0x59, 0xf7, 0x4, 0x1, 0xb3, 0xf7, 0x59,
+                                                       0x15, 0xf8, 0x8c, 0xf7, 0x4, 0xfc, 0x8c, 0x6,
+                                                       0xe, 0xd5, 0x78, 0xd6, 0xf7, 0x9e, 0xca, 0xf7,
+                                                       0x1, 0xcb, 0xf3, 0xd6, 0x1, 0x80, 0xd6, 0xf7,
+                                                       0x19, 0xdc, 0xf7, 0x32, 0xe2, 0xf7, 0x2a, 0xd6,
+                                                       0x3, 0xf7, 0x59, 0xf7, 0x31, 0x15, 0xdc, 0xf7,
+                                                       0x39, 0xab, 0x6, 0xb4, 0x9e, 0x85, 0x2e, 0xbb,
+                                                       0x1f, 0xa7, 0x49, 0x5, 0xf0, 0x6, 0x5c, 0xdc,
+                                                       0x67, 0xc7, 0x7f, 0x9f, 0x66, 0x99, 0x19, 0x8d,
+                                                       0x7, 0xdd, 0x96, 0xa5, 0xc3, 0xb8, 0x1a, 0xf0,
+                                                       0x34, 0x96, 0xfb, 0x13, 0x1e, 0x7c, 0xa, 0xdc,
+                                                       0xfb, 0x41, 0x15, 0xf7, 0x1, 0xac, 0x7, 0xd2,
+                                                       0xc1, 0x8b, 0x56, 0x53, 0x57, 0x8b, 0x42, 0x1f,
+                                                       0xfb, 0x8b, 0x71, 0x15, 0xf7, 0x3c, 0xf7, 0x1d,
+                                                       0xf7, 0x1b, 0xf7, 0x3c, 0x58, 0xa, 0xfb, 0x3c,
+                                                       0xfb, 0x1d, 0xf7, 0x1b, 0xf7, 0x3c, 0x1e, 0x40,
+                                                       0x16, 0xfb, 0x65, 0xf7, 0x3e, 0xfb, 0x3d, 0xf7,
+                                                       0x66, 0x57, 0xa, 0xfb, 0x66, 0x80, 0xa, 0xf8,
+                                                       0xf0, 0xd5, 0x1, 0x85, 0xf7, 0xed, 0x3, 0x85,
+                                                       0xf8, 0xf0, 0x15, 0xf7, 0xed, 0xd5, 0xfb, 0xed,
+                                                       0x6, 0xe, 0xfb, 0x9b, 0xf8, 0x3e, 0xd6, 0xf7,
+                                                       0x1c, 0xd6, 0x1, 0xc4, 0xd5, 0xf7, 0x1e, 0xd5,
+                                                       0x3, 0xc4, 0xf8, 0xcf, 0x15, 0x3b, 0xca, 0x4a,
+                                                       0xda, 0xda, 0xcc, 0xcc, 0xdb, 0xdb, 0x4a, 0xc8,
+                                                       0x3c, 0x3c, 0x4c, 0x4e, 0x3b, 0x1e, 0xd5, 0x8a,
+                                                       0x15, 0xb1, 0xaa, 0xa8, 0xb1, 0xb1, 0xaa, 0x6f,
+                                                       0x64, 0x65, 0x6c, 0x6c, 0x65, 0x65, 0x6c, 0xaa,
+                                                       0xb1, 0x1e, 0xe, 0x3c, 0x8b, 0xe6, 0xf7, 0x42,
+                                                       0xf7, 0x6, 0xf7, 0x13, 0x90, 0xa, 0x16, 0xf8,
+                                                       0x8c, 0xe6, 0xfc, 0x8c, 0x6, 0xf7, 0x50, 0xb7,
+                                                       0x15, 0xf7, 0x13, 0xf7, 0x16, 0xf7, 0x51, 0xf7,
+                                                       0x6, 0xfb, 0x51, 0xf7, 0x13, 0xfb, 0x13, 0xfb,
+                                                       0x13, 0xfb, 0x50, 0xfb, 0x6, 0xf7, 0x50, 0x6,
+                                                       0xe, 0xf7, 0xaf, 0xdc, 0xf7, 0x9d, 0xdc, 0x1,
+                                                       0xf7, 0x76, 0xed, 0x3, 0x94, 0xf7, 0xaf, 0x15,
+                                                       0xf7, 0xcf, 0xdc, 0xfb, 0x46, 0x6, 0xf7, 0x9,
+                                                       0xe4, 0xc8, 0xbc, 0xdc, 0x1a, 0xbd, 0x64, 0xd8,
+                                                       0xfb, 0x4, 0xfb, 0x21, 0x83, 0x27, 0x67, 0x87,
+                                                       0x1e, 0xed, 0x82, 0x5, 0xa7, 0x8d, 0x90, 0xaf,
+                                                       0xbb, 0x1b, 0x92, 0xb9, 0x8b, 0x5d, 0x67, 0x73,
+                                                       0x78, 0x4b, 0x54, 0x1f, 0x28, 0x36, 0x6d, 0x69,
+                                                       0x44, 0x1a, 0xe, 0xf7, 0xa3, 0xdd, 0xf7, 0xa7,
+                                                       0xdd, 0x1, 0xf7, 0x61, 0xee, 0x3, 0x93, 0xf8,
+                                                       0x27, 0x15, 0xfb, 0xf, 0x9a, 0xf7, 0x2, 0x82,
+                                                       0xab, 0x1b, 0xe9, 0xce, 0xca, 0xd6, 0xbd, 0x70,
+                                                       0xae, 0x5e, 0x9d, 0x1f, 0xad, 0xa1, 0x9b, 0xa6,
+                                                       0xa9, 0x1a, 0xc8, 0x53, 0xc5, 0x34, 0xfb, 0xe,
+                                                       0x7b, 0x37, 0x63, 0x82, 0x1e, 0xea, 0x7d, 0x5,
+                                                       0xa0, 0x8d, 0x8f, 0xae, 0xb9, 0x1b, 0x9e, 0xa4,
+                                                       0x83, 0x6e, 0x5c, 0x50, 0x8c, 0x7d, 0x1f, 0x7f,
+                                                       0x38, 0x5, 0xb8, 0x9f, 0xc5, 0x79, 0x54, 0x1a,
+                                                       0x6f, 0x7a, 0x6f, 0x62, 0x57, 0x87, 0xb5, 0x9d,
+                                                       0x87, 0x1e, 0xe, 0xf8, 0xf0, 0x84, 0xa, 0xf7,
+                                                       0x0, 0xf8, 0xf0, 0x15, 0xed, 0x6, 0xf7, 0x2a,
+                                                       0x83, 0xa, 0xfb, 0x40, 0x6, 0xe, 0x57, 0xfb,
+                                                       0x4e, 0x76, 0xf7, 0x53, 0xf7, 0x5, 0x27, 0xef,
+                                                       0xf8, 0x47, 0x77, 0x49, 0xa, 0x13, 0xdc, 0xf7,
+                                                       0x61, 0xc9, 0x15, 0x8d, 0x6, 0x68, 0x9c, 0x9e,
+                                                       0x60, 0xcb, 0x1b, 0xbc, 0xb1, 0xaf, 0xb5, 0xa0,
+                                                       0x1f, 0x8d, 0x6, 0x13, 0xbc, 0x4a, 0xf7, 0x14,
+                                                       0xf8, 0xab, 0xfb, 0x1f, 0xfb, 0x87, 0x7, 0x3e,
+                                                       0x87, 0xfb, 0x7, 0x2c, 0x2c, 0x84, 0xf7, 0x8,
+                                                       0xd9, 0x1e, 0xf7, 0x85, 0xfb, 0x1f, 0xfd, 0x77,
+                                                       0xf7, 0x1f, 0x7, 0xe, 0x20, 0xfb, 0x3e, 0x76,
+                                                       0xf9, 0x92, 0xf7, 0x11, 0x1, 0xf8, 0x6, 0xf7,
+                                                       0x6, 0x3, 0xf7, 0x4a, 0xfb, 0x53, 0x15, 0xf7,
+                                                       0x7, 0xf9, 0x92, 0xd4, 0xfd, 0x92, 0xf7, 0x6,
+                                                       0xf9, 0x92, 0xc2, 0xf7, 0x11, 0xfb, 0xb4, 0x6,
+                                                       0xfb, 0x2e, 0x22, 0x5f, 0xfb, 0x2d, 0x5a, 0xa1,
+                                                       0xfb, 0x27, 0xf7, 0x3c, 0x1f, 0xe, 0xfc, 0x15,
+                                                       0xf7, 0x40, 0xf7, 0x36, 0x1, 0xf7, 0x8, 0xf7,
+                                                       0x36, 0x3, 0xc5, 0xf7, 0x40, 0x15, 0xf7, 0x36,
+                                                       0xf7, 0x36, 0xfb, 0x36, 0x6, 0xe, 0xfb, 0x78,
+                                                       0xd0, 0xee, 0xc7, 0x1, 0xc6, 0x7c, 0x15, 0x7f,
+                                                       0x54, 0x5, 0x90, 0x99, 0xa3, 0x90, 0x9f, 0x1b,
+                                                       0xba, 0x94, 0x6e, 0x79, 0x69, 0x6e, 0x79, 0x60,
+                                                       0x67, 0x71, 0x8e, 0x8f, 0x76, 0x1f, 0x48, 0x7,
+                                                       0x84, 0xa1, 0xb7, 0x89, 0x9e, 0x1b, 0xd5, 0xdb,
+                                                       0xac, 0xe5, 0xd2, 0x57, 0xad, 0x4f, 0x7a, 0x69,
+                                                       0x86, 0x81, 0x74, 0x1f, 0xe, 0xf7, 0xc4, 0x76,
+                                                       0xf8, 0x3f, 0x77, 0x1, 0xf7, 0x1e, 0xee, 0x3,
+                                                       0xf7, 0x1e, 0xf7, 0xaf, 0x15, 0xee, 0xf8, 0x3f,
+                                                       0x3b, 0x6, 0x6f, 0x42, 0x31, 0x6f, 0x7e, 0x88,
+                                                       0x8, 0x34, 0x7, 0xa5, 0x92, 0xa5, 0x90, 0xc7,
+                                                       0xb5, 0x8, 0xe, 0xfb, 0xbe, 0xf7, 0xa8, 0xf4,
+                                                       0xf7, 0x92, 0xf1, 0x1, 0x91, 0xf7, 0x0, 0xf7,
+                                                       0x1e, 0xf7, 0x0, 0x3, 0x91, 0xf8, 0x94, 0x15,
+                                                       0xfb, 0x1a, 0xc7, 0x25, 0xf7, 0x7, 0xf7, 0x8,
+                                                       0xca, 0xf0, 0xf7, 0x1b, 0xf7, 0x12, 0x51, 0xee,
+                                                       0xfb, 0xd, 0xfb, 0x6, 0x4e, 0x30, 0xfb, 0x1a,
+                                                       0x1e, 0xf7, 0x0, 0x16, 0xbb, 0x93, 0xd6, 0xc6,
+                                                       0xc6, 0x97, 0x4f, 0x4c, 0x54, 0x80, 0x3f, 0x4f,
+                                                       0x51, 0x82, 0xda, 0xbf, 0x1e, 0xe, 0x20, 0x5d,
+                                                       0xa, 0xe3, 0xd7, 0x50, 0xa, 0xcb, 0xfb, 0x5f,
+                                                       0x50, 0xa, 0xe, 0xf7, 0x3f, 0x8d, 0x76, 0xa7,
+                                                       0x76, 0xd0, 0xcf, 0xf8, 0xdc, 0x77, 0xa0, 0x77,
+                                                       0x12, 0xa5, 0xf7, 0x57, 0xf8, 0x2c, 0xe1, 0x13,
+                                                       0x6e, 0xf8, 0x5b, 0xc4, 0x15, 0xf7, 0x42, 0x46,
+                                                       0xe1, 0xd0, 0xbe, 0xcf, 0x58, 0xf7, 0x71, 0x3f,
+                                                       0x6, 0xfb, 0x4c, 0xfb, 0x72, 0x5, 0xe1, 0x8c,
+                                                       0x15, 0xe1, 0xf6, 0x5, 0x8d, 0x20, 0x6, 0x13,
+                                                       0xae, 0xfc, 0x77, 0xfb, 0x24, 0x15, 0xd7, 0x6,
+                                                       0xf8, 0x38, 0xf9, 0x6d, 0x5, 0x3f, 0x6, 0xfc,
+                                                       0x48, 0xfb, 0xfa, 0x15, 0xe6, 0x6, 0x13, 0x76,
+                                                       0xf7, 0xf9, 0x41, 0x7, 0x72, 0x4e, 0x37, 0x74,
+                                                       0x7f, 0x88, 0x8, 0x42, 0x7, 0x8f, 0x8c, 0x91,
+                                                       0x8c, 0x8d, 0x8c, 0x96, 0x8e, 0xae, 0x94, 0xb9,
+                                                       0xa9, 0x8, 0xe, 0xf7, 0x3f, 0x7d, 0xd6, 0x50,
+                                                       0x76, 0xf7, 0x8a, 0xf7, 0xb, 0xf8, 0x0, 0x77,
+                                                       0x12, 0xa5, 0xf7, 0x5b, 0xf8, 0x71, 0xe7, 0x13,
+                                                       0x7c, 0xf7, 0x29, 0x78, 0x15, 0xd8, 0x6, 0xf8,
+                                                       0x3f, 0xf9, 0x6d, 0x5, 0x3e, 0x6, 0xfc, 0x50,
+                                                       0xfb, 0xfb, 0x15, 0xe8, 0xf7, 0xf8, 0x40, 0x6,
+                                                       0x71, 0x4e, 0x35, 0x76, 0x7f, 0x88, 0x8, 0x42,
+                                                       0x7, 0xa3, 0x91, 0xa4, 0x90, 0xc4, 0xae, 0x8,
+                                                       0x13, 0xbc, 0xf8, 0x0, 0xfc, 0xf5, 0x15, 0xf7,
+                                                       0xbe, 0xd6, 0xfb, 0x2e, 0x6, 0x94, 0x94, 0x91,
+                                                       0x91, 0x94, 0x90, 0x8, 0xf5, 0xd4, 0xa3, 0xb0,
+                                                       0xba, 0x1a, 0xb5, 0x69, 0xcd, 0x21, 0xfb, 0x18,
+                                                       0x80, 0x37, 0x6c, 0x87, 0x1e, 0xe7, 0x84, 0x5,
+                                                       0xa3, 0x8d, 0x90, 0xa9, 0xb8, 0x1b, 0x92, 0xb7,
+                                                       0x8a, 0x64, 0x6d, 0x73, 0x7b, 0x4f, 0x5e, 0x1f,
+                                                       0x2f, 0x41, 0x75, 0x6c, 0x83, 0x53, 0x8, 0xe,
+                                                       0xf7, 0x3f, 0x8d, 0x76, 0xa5, 0x76, 0xd0, 0xcf,
+                                                       0xf7, 0x71, 0xcf, 0xf7, 0x79, 0xcf, 0x8c, 0x77,
+                                                       0x12, 0xf7, 0x5c, 0xe8, 0xf8, 0x2, 0xe2, 0x13,
+                                                       0x7b, 0xf8, 0x75, 0xc2, 0x15, 0xf7, 0x46, 0x46,
+                                                       0xe2, 0xd0, 0xc0, 0xcf, 0x56, 0xf7, 0x71, 0x3e,
+                                                       0x6, 0xfb, 0x50, 0xfb, 0x72, 0x5, 0xe3, 0x8c,
+                                                       0x15, 0xe3, 0xf6, 0x5, 0x8d, 0x20, 0x6, 0x13,
+                                                       0xb7, 0xfc, 0x77, 0xfb, 0x22, 0x15, 0xd9, 0x6,
+                                                       0xf8, 0x42, 0xf9, 0x6d, 0x5, 0x3d, 0x6, 0xfc,
+                                                       0xe2, 0xfb, 0x94, 0x15, 0x25, 0x99, 0xf2, 0x83,
+                                                       0xa8, 0x1b, 0xe3, 0xca, 0xbf, 0xca, 0xb4, 0x72,
+                                                       0xa8, 0x60, 0x9a, 0x1f, 0xac, 0x9d, 0x9a, 0xa4,
+                                                       0xa4, 0x1a, 0x13, 0x7b, 0xbd, 0x56, 0xba, 0x39,
+                                                       0xfb, 0x5, 0x7c, 0x45, 0x6a, 0x83, 0x1e, 0xe3,
+                                                       0x7f, 0x5, 0x9d, 0x8d, 0x8f, 0xa8, 0xb5, 0x1b,
+                                                       0x9e, 0xa2, 0x86, 0x73, 0x64, 0x54, 0x8a, 0x7e,
+                                                       0x1f, 0x80, 0x46, 0x5, 0x90, 0x9e, 0x96, 0x8d,
+                                                       0x9a, 0x1b, 0xac, 0x9d, 0x71, 0x72, 0x73, 0x7b,
+                                                       0x74, 0x64, 0x5b, 0x87, 0xae, 0x9a, 0x88, 0x1f,
+                                                       0xe, 0x57, 0xfb, 0x57, 0xf5, 0xf8, 0x48, 0x77,
+                                                       0x1, 0xc2, 0xf7, 0x15, 0xbe, 0xf7, 0x19, 0x3,
+                                                       0xf7, 0x8b, 0xf7, 0xef, 0x15, 0x8e, 0x4b, 0x8a,
+                                                       0x76, 0x4c, 0x57, 0x8, 0x2e, 0x3a, 0x65, 0x5c,
+                                                       0x44, 0x1a, 0xfb, 0x5, 0xec, 0x2e, 0xf7, 0x27,
+                                                       0xf7, 0x37, 0xde, 0xf7, 0x4, 0xed, 0x91, 0x1e,
+                                                       0xfb, 0xc, 0x9c, 0x5, 0x3e, 0x7c, 0x5f, 0x5f,
+                                                       0x42, 0x1b, 0x52, 0x51, 0xab, 0xcc, 0xb7, 0xa1,
+                                                       0x9d, 0xcd, 0xc3, 0x1f, 0xe9, 0xda, 0x8f, 0xb8,
+                                                       0x89, 0xec, 0x8, 0xfb, 0x19, 0xbb, 0x15, 0xf7,
+                                                       0x19, 0xf7, 0x1d, 0xfb, 0x19, 0x6, 0xe, 0x35,
+                                                       0xa, 0xd3, 0xf7, 0x28, 0x1, 0xf7, 0xf2, 0xf9,
+                                                       0xa8, 0x15, 0xde, 0x6, 0x4a, 0xf7, 0x28, 0x40,
+                                                       0xa, 0xfb, 0x5f, 0xfe, 0x3c, 0x28, 0xa, 0x35,
+                                                       0xa, 0xd3, 0xf7, 0x28, 0x1, 0xf7, 0xb7, 0xf9,
+                                                       0xa8, 0x15, 0xde, 0x6, 0xf7, 0x13, 0xf7, 0x28,
+                                                       0x40, 0xa, 0xfb, 0xe4, 0xfe, 0x3c, 0x28, 0xa,
+                                                       0x35, 0xa, 0xd5, 0x84, 0xa, 0xf7, 0x61, 0xf9,
+                                                       0xaa, 0x15, 0xf4, 0x6, 0xbe, 0xd4, 0xc1, 0x42,
+                                                       0x5, 0xf3, 0x6, 0x2b, 0x83, 0xa, 0xfb, 0xc,
+                                                       0x6, 0xfb, 0xaf, 0xfe, 0x3c, 0x28, 0xa, 0x35,
+                                                       0xa, 0xf7, 0xf, 0xdf, 0x8a, 0x77, 0x12, 0x13,
+                                                       0xf0, 0xf7, 0x5e, 0xf9, 0xaf, 0x15, 0xc6, 0x65,
+                                                       0xa, 0xab, 0xaa, 0x1b, 0xa6, 0xa1, 0x82, 0x82,
+                                                       0x9f, 0x1f, 0x80, 0xa6, 0xa3, 0x7e, 0xa6, 0x1b,
+                                                       0xdd, 0x8b, 0xef, 0xa5, 0x1f, 0x4f, 0x7a, 0xa,
+                                                       0x6d, 0x6b, 0x1b, 0x81, 0x78, 0x95, 0x95, 0x73,
+                                                       0x1f, 0x13, 0xe8, 0x97, 0x72, 0x6d, 0x96, 0x6e,
+                                                       0x1b, 0x4d, 0x71, 0x5a, 0x3d, 0x8e, 0x1f, 0xfb,
+                                                       0x4a, 0xfd, 0xaf, 0x28, 0xa, 0x35, 0xa, 0xda,
+                                                       0xf7, 0xc, 0x1, 0xf7, 0x62, 0xf9, 0xaf, 0x15,
+                                                       0xf7, 0x4, 0xf7, 0xc, 0x7c, 0xa, 0xf7, 0x5c,
+                                                       0xfb, 0xc, 0x15, 0xf7, 0x4, 0xf7, 0xc, 0x7c,
+                                                       0xa, 0xfc, 0x16, 0xfe, 0x27, 0x28, 0xa, 0x35,
+                                                       0xa, 0xc0, 0xf7, 0x55, 0x1, 0x9f, 0x16, 0x27,
+                                                       0xa, 0xfb, 0x47, 0xf8, 0xd3, 0x15, 0x56, 0xb4,
+                                                       0x5f, 0xbd, 0xbc, 0xb5, 0xb5, 0xc2, 0xc3, 0x62,
+                                                       0xb3, 0x59, 0x58, 0x63, 0x62, 0x54, 0x1e, 0xbd,
+                                                       0x16, 0xa4, 0x9d, 0x9d, 0xa2, 0xa1, 0x9e, 0x7a,
+                                                       0x71, 0x73, 0x78, 0x77, 0x75, 0x75, 0x78, 0x9f,
+                                                       0xa3, 0x1e, 0xe, 0xf7, 0xe5, 0x8b, 0xf7, 0xe,
+                                                       0xba, 0xf7, 0x12, 0xa0, 0xf7, 0xe, 0xf7, 0x35,
+                                                       0xf7, 0xb, 0x1, 0xf8, 0x66, 0xf7, 0x1d, 0x3,
+                                                       0x90, 0x16, 0xf7, 0x2d, 0x6, 0xd1, 0xf7, 0x3d,
+                                                       0x5, 0xf7, 0x81, 0xfb, 0x3d, 0xf8, 0x7d, 0xf7,
+                                                       0xe, 0xfb, 0xf3, 0xf7, 0x56, 0xf7, 0xc2, 0xf7,
+                                                       0xe, 0xfb, 0xc2, 0xf7, 0x35, 0xf7, 0xe7, 0xf7,
+                                                       0xb, 0xfc, 0xfe, 0x6, 0x5e, 0xfc, 0x3b, 0x15,
+                                                       0xf7, 0x1a, 0xf7, 0xd0, 0x5, 0xc0, 0xfb, 0xd0,
+                                                       0x6, 0xe, 0xc6, 0xfb, 0x78, 0xc9, 0xe4, 0xbe,
+                                                       0x8d, 0xf7, 0x13, 0xf8, 0x8e, 0xf7, 0x14, 0x1,
+                                                       0xb7, 0xf7, 0x2d, 0xf7, 0x68, 0xea, 0x3, 0xf7,
+                                                       0x7c, 0xfb, 0x35, 0x15, 0x4f, 0x7, 0x85, 0xa7,
+                                                       0xbd, 0x8a, 0x8f, 0x1b, 0xf6, 0xde, 0xb1, 0xd2,
+                                                       0xb0, 0x78, 0xba, 0x30, 0x94, 0x1f, 0x8d, 0x7,
+                                                       0xf7, 0x65, 0xca, 0xf7, 0x40, 0xcc, 0x9d, 0x1f,
+                                                       0xfb, 0x24, 0xb9, 0x5, 0x3a, 0x79, 0x5d, 0x40,
+                                                       0x29, 0x1b, 0xfb, 0x26, 0x68, 0xf7, 0x11, 0xf7,
+                                                       0xe, 0xbb, 0x8b, 0xf7, 0x67, 0xf7, 0x4b, 0xd7,
+                                                       0xc8, 0x60, 0x3b, 0x9d, 0x1f, 0xf7, 0x27, 0xae,
+                                                       0x5, 0xf7, 0x40, 0x4d, 0xfb, 0x1b, 0xb7, 0x22,
+                                                       0x1b, 0xfb, 0x83, 0x2a, 0xfb, 0x4a, 0xfb, 0x61,
+                                                       0xfb, 0x7a, 0xf7, 0x20, 0xfb, 0x24, 0xf7, 0x45,
+                                                       0x1f, 0x89, 0x7, 0x8c, 0x7, 0x75, 0x8a, 0x76,
+                                                       0x88, 0x72, 0x82, 0x7d, 0x5a, 0x18, 0x8f, 0x9b,
+                                                       0xa6, 0x91, 0xa2, 0x1b, 0xc0, 0x96, 0x6f, 0x7d,
+                                                       0x61, 0x54, 0x86, 0x63, 0x6d, 0x86, 0x8b, 0x90,
+                                                       0x5c, 0x1f, 0xe, 0x33, 0xa, 0xf7, 0x8a, 0xbb,
+                                                       0x15, 0xe3, 0x6, 0x46, 0xf7, 0x28, 0x5, 0xfb,
+                                                       0x2d, 0x6, 0xe, 0x33, 0xa, 0xf7, 0x4c, 0xbb,
+                                                       0x15, 0xe2, 0x6, 0xf7, 0x1b, 0xf7, 0x28, 0x5,
+                                                       0xfb, 0x2e, 0x6, 0xe, 0x3a, 0xa, 0xbd, 0x84,
+                                                       0xa, 0xd7, 0xf7, 0x24, 0x3, 0xf7, 0x3d, 0xf9,
+                                                       0xaa, 0x15, 0xf7, 0x3, 0x6, 0xc0, 0xd4, 0xc5,
+                                                       0x42, 0x5, 0xf7, 0x2, 0x6, 0x26, 0x83, 0xa,
+                                                       0xfb, 0x14, 0x6, 0xfb, 0x58, 0xfe, 0x3c, 0x15,
+                                                       0x2e, 0xa, 0xe, 0x3a, 0xa, 0xc3, 0xf7, 0xb,
+                                                       0x12, 0xd7, 0xf7, 0x24, 0x59, 0xf7, 0xa, 0xe9,
+                                                       0xf7, 0xa, 0x13, 0xf6, 0xf7, 0x3e, 0xf9, 0xb0,
+                                                       0x8e, 0xa, 0xf7, 0x68, 0xfb, 0xb, 0x8e, 0xa,
+                                                       0x13, 0xfa, 0xfb, 0xc6, 0xfe, 0x27, 0x15, 0x2e,
+                                                       0xa, 0xe, 0x4c, 0xa, 0xf9, 0xad, 0xf7, 0x23,
+                                                       0x94, 0xa, 0xe9, 0xf9, 0xad, 0x15, 0xe2, 0x6,
+                                                       0x3d, 0x75, 0xa, 0xf7, 0xb, 0x46, 0xa, 0x4c,
+                                                       0xa, 0xfa, 0x3c, 0x77, 0x94, 0xa, 0xcb, 0xf9,
+                                                       0xad, 0x15, 0xe2, 0x6, 0xf7, 0x46, 0x75, 0xa,
+                                                       0x20, 0x46, 0xa, 0x4c, 0xa, 0xf9, 0xaf, 0xf7,
+                                                       0x21, 0x94, 0xa, 0x66, 0xf9, 0xaf, 0x95, 0xa,
+                                                       0xd1, 0xc8, 0x45, 0x77, 0xa, 0xf7, 0x21, 0x5,
+                                                       0xfb, 0x1b, 0x6, 0x87, 0x46, 0xa, 0x4c, 0xa,
+                                                       0xf9, 0xb3, 0xf7, 0x8, 0x1, 0xd0, 0x63, 0xa,
+                                                       0xf9, 0x60, 0x68, 0xa, 0x31, 0xde, 0x92, 0xa,
+                                                       0xf7, 0x62, 0xfb, 0x8, 0x92, 0xa, 0xe, 0xc6,
+                                                       0x8b, 0xf7, 0xd, 0xf8, 0x70, 0x82, 0xa, 0xd2,
+                                                       0xf7, 0x27, 0xf7, 0xcc, 0xf7, 0x2f, 0x3, 0xf7,
+                                                       0x6e, 0xf7, 0xd, 0x15, 0xf7, 0x4f, 0xf7, 0x31,
+                                                       0xef, 0xfb, 0x31, 0xf7, 0x51, 0xf7, 0x0, 0x7,
+                                                       0xf7, 0x24, 0xc7, 0x8b, 0xfb, 0x86, 0xfb, 0x7a,
+                                                       0x2e, 0x87, 0xfb, 0x0, 0x1f, 0xfb, 0x96, 0xfb,
+                                                       0xd, 0x15, 0xf7, 0x96, 0x6, 0xf7, 0x8e, 0xf5,
+                                                       0xf7, 0x46, 0xf7, 0x42, 0xf7, 0x9d, 0xfb, 0x1,
+                                                       0xf0, 0xfb, 0x8e, 0x1f, 0xfb, 0x93, 0xfb, 0xca,
+                                                       0x3f, 0x27, 0xd7, 0x6, 0xe, 0x69, 0xa, 0xf9,
+                                                       0x74, 0x77, 0xf7, 0x62, 0x5c, 0xa, 0xf8, 0x74,
+                                                       0x8d, 0x6, 0xf7, 0xbb, 0xfc, 0x74, 0x5, 0xf7,
+                                                       0x2a, 0xf9, 0x74, 0xfb, 0x1e, 0xfc, 0x7f, 0x89,
+                                                       0x6, 0xfb, 0xc1, 0xf8, 0x7f, 0x5, 0xfb, 0x24,
+                                                       0x6, 0xf7, 0xb, 0xc6, 0x15, 0xcb, 0x65, 0xa,
+                                                       0xab, 0xad, 0x1b, 0xaa, 0xa2, 0x80, 0x81, 0xa3,
+                                                       0x1f, 0x81, 0xa4, 0xa4, 0x80, 0xab, 0x1b, 0xe3,
+                                                       0x8b, 0xef, 0xa5, 0x1f, 0x4a, 0x7a, 0xa, 0x6d,
+                                                       0x68, 0x1b, 0x80, 0x77, 0x95, 0x95, 0x71, 0x1f,
+                                                       0x97, 0x71, 0x69, 0x96, 0x6a, 0x1b, 0x48, 0x70,
+                                                       0x5a, 0x3d, 0x8e, 0x1f, 0xe, 0x59, 0xa, 0xd1,
+                                                       0xf7, 0x23, 0x1, 0xc6, 0xf7, 0x28, 0xf8, 0x0,
+                                                       0x85, 0xa, 0xb7, 0xf7, 0xf4, 0x29, 0xa, 0xfb,
+                                                       0x22, 0x51, 0x22, 0xfb, 0x1f, 0xfb, 0x2c, 0x5e,
+                                                       0xf7, 0x4, 0xf7, 0x1b, 0x1e, 0xf7, 0x4d, 0xf8,
+                                                       0x4d, 0x15, 0xe1, 0x6, 0x47, 0x67, 0xa, 0xfb,
+                                                       0x2c, 0x6, 0xe, 0x5f, 0xa, 0xf8, 0x82, 0xf7,
+                                                       0x10, 0xd1, 0xf7, 0x23, 0x7e, 0xa, 0xf7, 0xcf,
+                                                       0xf9, 0xad, 0x15, 0xe1, 0x6, 0xf7, 0x1a, 0x67,
+                                                       0xa, 0xfb, 0x2c, 0x6, 0xfb, 0xe7, 0x31, 0xa,
+                                                       0x54, 0xfb, 0xb, 0xfb, 0x22, 0x41, 0xa, 0x5f,
+                                                       0xa, 0xf8, 0x82, 0xf7, 0x10, 0xd3, 0xf7, 0x21,
+                                                       0x7e, 0xa, 0xf7, 0x74, 0xf9, 0xaf, 0x15, 0xf7,
+                                                       0x3, 0x6, 0xc0, 0xd1, 0xc3, 0x45, 0x5, 0xf7,
+                                                       0x2, 0x6, 0x26, 0xf7, 0x21, 0x5, 0xfb, 0x12,
+                                                       0x6, 0xfb, 0xaf, 0x31, 0xa, 0x4f, 0xfb, 0xb,
+                                                       0xfb, 0x1d, 0x41, 0xa, 0x59, 0xa, 0xd8, 0x64,
+                                                       0xa, 0xd1, 0xf7, 0x28, 0xf7, 0xf1, 0xf7, 0x28,
+                                                       0x13, 0xd6, 0xf7, 0x71, 0xf9, 0xb2, 0x15, 0xc9,
+                                                       0x6a, 0xa, 0x9f, 0x1f, 0x13, 0xe6, 0x80, 0xa3,
+                                                       0xa1, 0x80, 0xad, 0x1b, 0xe1, 0x8b, 0xed, 0xa4,
+                                                       0x1f, 0x4c, 0x7a, 0xa, 0x6e, 0x69, 0x1b, 0x81,
+                                                       0x79, 0x93, 0x94, 0x75, 0x1f, 0x13, 0xce, 0x97,
+                                                       0x70, 0x67, 0x98, 0x6c, 0x1b, 0x4a, 0x70, 0x5b,
+                                                       0x3f, 0x8e, 0x1f, 0xfb, 0x45, 0xfc, 0x52, 0x29,
+                                                       0xa, 0xfb, 0x2c, 0x4f, 0x2c, 0xfb, 0x1d, 0x41,
+                                                       0xa, 0x59, 0xa, 0xd6, 0xf7, 0x9, 0x1, 0xc6,
+                                                       0xf7, 0x28, 0xf8, 0x1, 0x85, 0xa, 0xf7, 0x75,
+                                                       0xf9, 0xb2, 0x8d, 0xa, 0xf7, 0x66, 0xfb, 0x9,
+                                                       0x8d, 0xa, 0xfc, 0x1b, 0xfc, 0xc7, 0x29, 0xa,
+                                                       0xfb, 0x11, 0x54, 0xfb, 0xe, 0xfb, 0x22, 0x41,
+                                                       0xa, 0x3c, 0xa1, 0x76, 0xf8, 0x8c, 0x77, 0x1,
+                                                       0xb4, 0xec, 0x15, 0xe9, 0x2c, 0xf7, 0x30, 0xf7,
+                                                       0x31, 0xf7, 0x32, 0xfb, 0x32, 0xeb, 0xec, 0xfb,
+                                                       0x32, 0xf7, 0x31, 0xf7, 0x30, 0xf7, 0x2f, 0x2e,
+                                                       0xea, 0xfb, 0x31, 0xfb, 0x31, 0xfb, 0x31, 0xf7,
+                                                       0x31, 0x2b, 0x2b, 0xf7, 0x32, 0xfb, 0x30, 0x5,
+                                                       0xe, 0xf7, 0x7, 0x85, 0x76, 0xa6, 0xf7, 0xe,
+                                                       0xf8, 0x74, 0xf7, 0xe, 0xa0, 0x77, 0x1, 0xbc,
+                                                       0xf7, 0x27, 0xf8, 0x7, 0xf7, 0x27, 0x3, 0xac,
+                                                       0xab, 0x15, 0xcf, 0x50, 0xd9, 0xe2, 0x5, 0x5a,
+                                                       0xce, 0xd5, 0x80, 0xcd, 0x1b, 0xf7, 0x8a, 0xed,
+                                                       0xf7, 0x56, 0xf7, 0x43, 0xab, 0x89, 0xf7, 0x2,
+                                                       0x4a, 0xe1, 0x1f, 0xdc, 0xe4, 0x48, 0xc6, 0x3f,
+                                                       0x36, 0x5, 0x9f, 0x71, 0x4c, 0xb7, 0xfb, 0x12,
+                                                       0x1b, 0xfb, 0x88, 0x2a, 0xfb, 0x40, 0xfb, 0x4b,
+                                                       0xfb, 0x18, 0xb1, 0x44, 0xab, 0x60, 0x1f, 0xee,
+                                                       0xf7, 0x2, 0x15, 0x7d, 0xad, 0x83, 0xbc, 0xc0,
+                                                       0x1a, 0xf7, 0x12, 0xc6, 0xf6, 0xf7, 0x1b, 0xb8,
+                                                       0xba, 0x80, 0x6e, 0xad, 0x1e, 0xfb, 0x87, 0xfc,
+                                                       0x25, 0x15, 0xf7, 0xbb, 0xf7, 0xda, 0x5, 0x95,
+                                                       0x72, 0x94, 0x64, 0x55, 0x1a, 0xfb, 0x47, 0x2a,
+                                                       0x47, 0x27, 0x6e, 0x63, 0x8e, 0xaf, 0x5b, 0x1e,
+                                                       0xe, 0x54, 0xa, 0xd3, 0xf9, 0x5e, 0x5e, 0xa,
+                                                       0xb5, 0xfb, 0x48, 0xf7, 0x8f, 0xf7, 0x7a, 0xc3,
+                                                       0x2b, 0xa, 0xf7, 0x18, 0xd9, 0x15, 0xe4, 0x6,
+                                                       0x45, 0xf7, 0x24, 0x97, 0xa, 0xe, 0x54, 0xa,
+                                                       0xf7, 0xb3, 0xf9, 0xac, 0x15, 0xe3, 0x6, 0xf7,
+                                                       0x1c, 0xf7, 0x24, 0x97, 0xa, 0xfb, 0xb0, 0xfb,
+                                                       0x72, 0x5e, 0xa, 0xa1, 0xfb, 0x48, 0xf7, 0xa3,
+                                                       0x2f, 0xa, 0xc6, 0x78, 0xf7, 0x11, 0xf9, 0x44,
+                                                       0xf7, 0x22, 0x42, 0xa, 0xf7, 0x57, 0xf9, 0xae,
+                                                       0x15, 0xf7, 0x4, 0x6, 0xc1, 0xd1, 0xc5, 0x45,
+                                                       0x5, 0xf7, 0x3, 0x6, 0x25, 0xf7, 0x22, 0x5,
+                                                       0xfb, 0x15, 0x6, 0xfb, 0x77, 0xfb, 0x72, 0x34,
+                                                       0xa, 0xc6, 0x78, 0xf7, 0x11, 0xf9, 0x48, 0xf7,
+                                                       0x9, 0x12, 0xd3, 0xf7, 0x26, 0x75, 0xf7, 0xb,
+                                                       0xea, 0xf7, 0xb, 0x73, 0xf7, 0x26, 0x13, 0xd8,
+                                                       0xf7, 0x58, 0xf9, 0xb2, 0x8f, 0xa, 0xf7, 0x6a,
+                                                       0xfb, 0x9, 0x8f, 0xa, 0x13, 0xe4, 0xfb, 0xe6,
+                                                       0xfb, 0x5d, 0x34, 0xa, 0x8f, 0xa0, 0x76, 0x1,
+                                                       0xf7, 0x9d, 0xf7, 0x1d, 0x3, 0x70, 0xa, 0xf8,
+                                                       0x34, 0x5, 0xfb, 0x32, 0x6, 0xfb, 0x33, 0xfb,
+                                                       0xaf, 0xfb, 0x34, 0xf7, 0xaf, 0x5, 0xfb, 0x35,
+                                                       0x6, 0xf7, 0x8e, 0xfc, 0x33, 0x5, 0x89, 0xf8,
+                                                       0x80, 0x15, 0xde, 0x6, 0xf7, 0x14, 0x67, 0xa,
+                                                       0xfb, 0x26, 0x6, 0xe, 0x8f, 0xa0, 0x76, 0xf7,
+                                                       0x1b, 0xf7, 0xe, 0xf7, 0x60, 0xf7, 0xe, 0xf7,
+                                                       0x1b, 0x77, 0x60, 0xa, 0xf7, 0x1b, 0xd1, 0x6,
+                                                       0xcc, 0xf1, 0x8c, 0xa3, 0xbe, 0x1f, 0xb9, 0xa1,
+                                                       0xd3, 0xbf, 0xf7, 0x12, 0x1a, 0xf7, 0x73, 0xfb,
+                                                       0x2f, 0x8b, 0xfb, 0x49, 0x1e, 0x45, 0xf7, 0x1b,
+                                                       0xfb, 0x25, 0x6, 0xf7, 0x25, 0xfc, 0x61, 0x15,
+                                                       0xf7, 0x60, 0xd1, 0x7, 0xf4, 0xdc, 0x88, 0x29,
+                                                       0x24, 0xfb, 0x3, 0x8b, 0x40, 0x1f, 0xe, 0x57,
+                                                       0x92, 0x76, 0xf9, 0x11, 0xf7, 0x0, 0x1, 0xd0,
+                                                       0xf7, 0x1e, 0xf7, 0x7e, 0xf7, 0x1e, 0x3, 0xd0,
+                                                       0x84, 0x15, 0xf7, 0x1e, 0xf8, 0x6b, 0x6, 0xe3,
+                                                       0x8b, 0xd2, 0xd6, 0xe6, 0x68, 0x36, 0x4c, 0x6d,
+                                                       0x1e, 0x75, 0x5e, 0x81, 0x6d, 0x72, 0x1a, 0x64,
+                                                       0xa6, 0x6e, 0xc3, 0x56, 0x1e, 0xcf, 0x49, 0x99,
+                                                       0x7d, 0x6d, 0x1a, 0x6a, 0x73, 0x79, 0x72, 0x76,
+                                                       0x76, 0x97, 0xa6, 0x83, 0x1e, 0x2b, 0x53, 0x5,
+                                                       0x4e, 0xa8, 0xcd, 0x6e, 0xcc, 0x1b, 0xe3, 0xe0,
+                                                       0xc3, 0xf7, 0x0, 0xc0, 0x76, 0xb5, 0x4a, 0xcd,
+                                                       0x1f, 0x57, 0xc0, 0x75, 0x9c, 0xa3, 0x1a, 0x9c,
+                                                       0x97, 0x9f, 0xa1, 0xb4, 0x1e, 0xf7, 0x2, 0xc6,
+                                                       0x7a, 0xf7, 0x1e, 0xfb, 0x67, 0x1b, 0xfb, 0x59,
+                                                       0x79, 0xfb, 0x3d, 0x29, 0x1f, 0xe, 0x39, 0xa,
+                                                       0xc4, 0xf7, 0x29, 0x51, 0xa, 0xf7, 0x9b, 0xf8,
+                                                       0xed, 0x15, 0xe4, 0x6, 0x45, 0xf7, 0x29, 0x96,
+                                                       0xa, 0xf7, 0x89, 0x22, 0xa, 0x39, 0xa, 0xc5,
+                                                       0xf7, 0x28, 0x51, 0xa, 0xf7, 0x5b, 0xf8, 0xee,
+                                                       0x15, 0xe4, 0x6, 0xf7, 0x1e, 0xf7, 0x28, 0x96,
+                                                       0xa, 0xf0, 0x22, 0xa, 0x39, 0xa, 0xc6, 0xf7,
+                                                       0x27, 0x51, 0xa, 0xf5, 0xf8, 0xef, 0x15, 0xf7,
+                                                       0x6, 0x6, 0xc1, 0xd4, 0xc5, 0x42, 0x5, 0xf7,
+                                                       0x5, 0x6, 0x24, 0xf7, 0x27, 0x5, 0xfb, 0x17,
+                                                       0x6, 0xf7, 0x33, 0x22, 0xa, 0x39, 0xa, 0xcd,
+                                                       0xf7, 0x13, 0x37, 0xdf, 0x8a, 0x77, 0x66, 0xa,
+                                                       0x49, 0xcd, 0xf7, 0x52, 0xf7, 0x1d, 0x13, 0xa9,
+                                                       0x80, 0xf2, 0xf8, 0xf4, 0x15, 0xca, 0x6, 0x98,
+                                                       0x8c, 0x8b, 0xab, 0xad, 0x1b, 0xb0, 0xa4, 0x7e,
+                                                       0x80, 0xa3, 0x1f, 0x13, 0xb2, 0x80, 0x82, 0xa1,
+                                                       0xa0, 0x81, 0xa9, 0x1b, 0xe3, 0x8b, 0xf0, 0xa5,
+                                                       0x1f, 0x4b, 0x6, 0x7d, 0x88, 0x87, 0x6d, 0x69,
+                                                       0x1b, 0x80, 0x78, 0x94, 0x95, 0x73, 0x1f, 0x13,
+                                                       0x65, 0x80, 0x97, 0x70, 0x68, 0x97, 0x6a, 0x1b,
+                                                       0x48, 0x70, 0x5a, 0x3c, 0x8e, 0x1f, 0xf7, 0x9f,
+                                                       0xfc, 0xbb, 0x21, 0xa, 0x13, 0xb2, 0x80, 0x32,
+                                                       0xa, 0x39, 0xa, 0xce, 0xf7, 0xa, 0x66, 0xa,
+                                                       0x4d, 0xf7, 0xd, 0xea, 0xf7, 0xd, 0x36, 0xf7,
+                                                       0x1d, 0x13, 0x76, 0xf6, 0xf8, 0xf7, 0x8a, 0xa,
+                                                       0xf7, 0x6c, 0xfb, 0xa, 0x8a, 0xa, 0xba, 0xfd,
+                                                       0x34, 0x30, 0xa, 0x13, 0xb9, 0x20, 0xa, 0x32,
+                                                       0xa, 0x39, 0xa, 0xb1, 0xf7, 0x56, 0x56, 0x77,
+                                                       0x66, 0xa, 0x9e, 0xf7, 0x58, 0x72, 0xf7, 0x1d,
+                                                       0x13, 0xb6, 0xf7, 0x50, 0xf9, 0x3b, 0x15, 0x56,
+                                                       0xb7, 0x5f, 0xc1, 0xbf, 0xb9, 0xb5, 0xc2, 0xc3,
+                                                       0x5e, 0xb4, 0x56, 0x54, 0x60, 0x61, 0x54, 0x1e,
+                                                       0xc0, 0x16, 0x13, 0x6d, 0xa4, 0x9f, 0x9e, 0xa4,
+                                                       0xa3, 0x9f, 0x79, 0x71, 0x73, 0x77, 0x77, 0x73,
+                                                       0x73, 0x76, 0x9f, 0xa3, 0x1e, 0xf7, 0x15, 0xfd,
+                                                       0x2, 0x24, 0xa, 0x13, 0xb5, 0x26, 0xa, 0xf7,
+                                                       0x76, 0x7d, 0xf7, 0x0, 0xf7, 0x17, 0xe4, 0xf7,
+                                                       0x10, 0xf7, 0x0, 0x1, 0xa8, 0xf7, 0x22, 0xf7,
+                                                       0x50, 0xf7, 0x21, 0xf7, 0x6c, 0xf7, 0x22, 0x3,
+                                                       0xf8, 0x39, 0xc7, 0x15, 0x52, 0xc8, 0xca, 0x7a,
+                                                       0xc8, 0x1b, 0xf7, 0x47, 0xbf, 0xf7, 0xc, 0xb2,
+                                                       0x99, 0x1f, 0xfb, 0x1f, 0xa3, 0x5, 0x7a, 0x84,
+                                                       0x72, 0x51, 0x41, 0x1b, 0x2b, 0x84, 0xf2, 0xa7,
+                                                       0x88, 0x1f, 0xf7, 0xfa, 0x6, 0xf4, 0x77, 0xf7,
+                                                       0x6c, 0xfb, 0x7c, 0x4c, 0x5a, 0x78, 0x6c, 0x63,
+                                                       0x1e, 0x9a, 0x7b, 0x4f, 0xae, 0x21, 0x1b, 0xfb,
+                                                       0x2d, 0x61, 0x59, 0x26, 0x6a, 0x1f, 0xf7, 0x15,
+                                                       0x73, 0x5, 0x9d, 0x90, 0x9a, 0xbc, 0xda, 0x1b,
+                                                       0xe3, 0x8b, 0x53, 0x75, 0x1f, 0x7e, 0x7, 0x7a,
+                                                       0x85, 0x78, 0x89, 0x59, 0x7d, 0x8, 0x24, 0x6e,
+                                                       0xfb, 0x22, 0x88, 0xfb, 0x29, 0x1a, 0x43, 0xbb,
+                                                       0x35, 0xf7, 0x1a, 0xf0, 0xd9, 0xb9, 0xa7, 0xaa,
+                                                       0x1e, 0x4d, 0xf7, 0x57, 0x15, 0x42, 0x8b, 0x63,
+                                                       0x6c, 0x71, 0x1e, 0x56, 0x5f, 0x23, 0x93, 0xd7,
+                                                       0x1a, 0xb9, 0xb5, 0x99, 0xb8, 0x97, 0x1e, 0xf7,
+                                                       0x88, 0xe1, 0x15, 0x9b, 0x8a, 0x92, 0xf7, 0x0,
+                                                       0xed, 0x1b, 0xf0, 0x92, 0x2f, 0x6b, 0x8d, 0x1f,
+                                                       0xe, 0x20, 0xfb, 0x78, 0xc2, 0xe4, 0xf7, 0x40,
+                                                       0xfb, 0xa, 0xf7, 0xa, 0xf7, 0xec, 0xf7, 0x6,
+                                                       0x12, 0xad, 0xf7, 0x21, 0xf7, 0x23, 0xdd, 0x13,
+                                                       0xdc, 0xf7, 0x5a, 0x2f, 0x15, 0x92, 0xaa, 0x9c,
+                                                       0x8c, 0x92, 0x1b, 0xc4, 0x93, 0x6d, 0x7e, 0x5d,
+                                                       0x45, 0x8b, 0x6c, 0x6a, 0x79, 0x8e, 0x8c, 0x83,
+                                                       0x1f, 0x56, 0x7, 0x85, 0xb2, 0x9d, 0x8b, 0x8d,
+                                                       0x1b, 0xf7, 0x11, 0xc5, 0xc7, 0xb9, 0xc1, 0x5b,
+                                                       0xaa, 0x5f, 0x90, 0x1f, 0x13, 0xbc, 0x8d, 0x7,
+                                                       0xf7, 0x3f, 0x91, 0xaf, 0xf7, 0x2b, 0x94, 0xb5,
+                                                       0xfb, 0x1b, 0xa3, 0x18, 0x69, 0x85, 0x7e, 0x44,
+                                                       0x3a, 0x1b, 0x36, 0x6e, 0xcd, 0xf3, 0xad, 0x89,
+                                                       0xf7, 0x20, 0xf7, 0x5, 0xda, 0x99, 0x47, 0x78,
+                                                       0x8e, 0x1f, 0xf7, 0x1b, 0xa4, 0x5, 0xd4, 0x77,
+                                                       0x5e, 0xf2, 0xfb, 0x3a, 0x1b, 0xfb, 0x5e, 0x59,
+                                                       0xfb, 0x3b, 0xfb, 0xd, 0x3a, 0xa5, 0xfb, 0x56,
+                                                       0xf7, 0x5f, 0x7e, 0x1f, 0x89, 0x7, 0x7c, 0x8a,
+                                                       0x7e, 0x8a, 0x75, 0x85, 0x8, 0xe, 0x3c, 0xa,
+                                                       0xc8, 0xf7, 0x28, 0x43, 0xa, 0xf7, 0x9d, 0xf8,
+                                                       0xee, 0x15, 0xe6, 0x6, 0x44, 0xf7, 0x28, 0x5,
+                                                       0xfb, 0x33, 0x6, 0xb6, 0xfc, 0xa2, 0x25, 0xa,
+                                                       0x3c, 0xa, 0xc7, 0xf7, 0x29, 0x43, 0xa, 0xf7,
+                                                       0x5c, 0xf8, 0xed, 0x15, 0xe6, 0x6, 0xf7, 0x20,
+                                                       0xf7, 0x29, 0x5, 0xfb, 0x34, 0x6, 0x25, 0xfc,
+                                                       0xa2, 0x25, 0xa, 0x3c, 0xa, 0xc9, 0xf7, 0x27,
+                                                       0x43, 0xa, 0xf4, 0xf8, 0xef, 0x15, 0xf7, 0x8,
+                                                       0x6, 0xc3, 0xd4, 0xc6, 0x42, 0x5, 0xf7, 0x7,
+                                                       0x6, 0x21, 0xf7, 0x27, 0x5, 0xfb, 0x18, 0x6,
+                                                       0x5f, 0xfc, 0xa2, 0x25, 0xa, 0x3c, 0xa, 0xd1,
+                                                       0xf7, 0xa, 0x43, 0xa, 0xf5, 0xf8, 0xf7, 0x15,
+                                                       0xf7, 0x10, 0xf7, 0xa, 0xfb, 0x10, 0x6, 0xf7,
+                                                       0x71, 0xfb, 0xa, 0x15, 0xf7, 0xf, 0xf7, 0xa,
+                                                       0xfb, 0xf, 0x6, 0xfb, 0x32, 0xfc, 0x8d, 0x25,
+                                                       0xa, 0x62, 0xa, 0xf7, 0x23, 0xf8, 0xf2, 0x15,
+                                                       0xe1, 0x6, 0x20, 0xf7, 0x24, 0x5, 0xfb, 0x2c,
+                                                       0x6, 0xf5, 0xfd, 0x82, 0x15, 0x55, 0xa, 0xe,
+                                                       0x62, 0xa, 0xbc, 0xf8, 0xf1, 0x15, 0xe2, 0x6,
+                                                       0xf7, 0x41, 0xf7, 0x25, 0x5, 0xfb, 0x2c, 0x6,
+                                                       0x3a, 0xfd, 0x82, 0x15, 0x55, 0xa, 0xe, 0x4c,
+                                                       0xa, 0xf8, 0xf3, 0xf7, 0x23, 0x1, 0xd7, 0xf7,
+                                                       0x13, 0x3, 0xd7, 0x16, 0x55, 0xa, 0xfb, 0x5,
+                                                       0xe1, 0x95, 0xa, 0xd3, 0xc8, 0x43, 0x77, 0xa,
+                                                       0x67, 0xa, 0xfb, 0x1b, 0x6, 0xe, 0x4c, 0xa,
+                                                       0xf8, 0xfa, 0xf7, 0x7, 0x12, 0x76, 0xf7, 0x7,
+                                                       0x79, 0xf7, 0x13, 0x79, 0xf7, 0x7, 0x13, 0xe8,
+                                                       0x76, 0x44, 0xa, 0x13, 0xd0, 0xfb, 0x1, 0xfd,
+                                                       0x6d, 0x15, 0x55, 0xa, 0xe, 0x57, 0x7d, 0xf7,
+                                                       0x8, 0xf7, 0xd4, 0xf7, 0x3, 0xf7, 0x60, 0x77,
+                                                       0x1, 0xad, 0xf7, 0x26, 0xf7, 0x90, 0xf7, 0x26,
+                                                       0x3, 0xf7, 0x65, 0xf8, 0xc7, 0x15, 0xeb, 0xb8,
+                                                       0xb0, 0x5b, 0x95, 0x7b, 0xa4, 0x60, 0x19, 0x89,
+                                                       0x89, 0x5, 0x9b, 0x70, 0x6b, 0x9d, 0x5a, 0x1b,
+                                                       0xfb, 0x1, 0xfb, 0x10, 0x22, 0xfb, 0x3b, 0xfb,
+                                                       0x26, 0xec, 0xfb, 0x15, 0xf7, 0x40, 0xf7, 0x31,
+                                                       0xf7, 0xa, 0xea, 0xf7, 0x48, 0xf7, 0x26, 0x3e,
+                                                       0xf7, 0x23, 0x26, 0xf2, 0x1f, 0xd2, 0xad, 0x75,
+                                                       0xbd, 0x30, 0x60, 0x75, 0x9d, 0x85, 0x8f, 0x72,
+                                                       0xa0, 0x19, 0xfb, 0x26, 0x6, 0xbe, 0x66, 0x9a,
+                                                       0x81, 0xb5, 0x63, 0x3a, 0x65, 0x18, 0x85, 0xfb,
+                                                       0xf3, 0x15, 0xf7, 0x4, 0xcc, 0xbc, 0xc5, 0xce,
+                                                       0xc9, 0x54, 0x21, 0x27, 0x52, 0x50, 0x44, 0x52,
+                                                       0x48, 0xb2, 0xf7, 0xc, 0x1e, 0xe, 0x57, 0xa0,
+                                                       0x76, 0xf8, 0xfa, 0x64, 0xa, 0xcc, 0xf7, 0x16,
+                                                       0x58, 0xc8, 0xf7, 0x5d, 0xf7, 0x20, 0x13, 0xca,
+                                                       0xcc, 0x16, 0x13, 0xc6, 0xf7, 0x20, 0xf7, 0x7f,
+                                                       0x6, 0xe2, 0x90, 0xf2, 0xf7, 0x3, 0xe0, 0x8b,
+                                                       0x22, 0x36, 0x1e, 0xfb, 0x7f, 0xf7, 0x20, 0xf7,
+                                                       0xd6, 0x7, 0xf7, 0x6, 0x3e, 0xe9, 0x28, 0x55,
+                                                       0x48, 0x79, 0x45, 0x57, 0x1e, 0x13, 0xca, 0x89,
+                                                       0xd7, 0xfb, 0x16, 0x6, 0x13, 0xa6, 0xda, 0xe9,
+                                                       0x15, 0xca, 0x65, 0xa, 0xaa, 0xad, 0x1b, 0xa9,
+                                                       0xa1, 0x82, 0x82, 0xa0, 0x1f, 0x13, 0xca, 0x80,
+                                                       0xa5, 0xa3, 0x7f, 0xae, 0x1b, 0xdf, 0x8f, 0xed,
+                                                       0xa4, 0x1f, 0x4b, 0x6, 0x7d, 0x88, 0x87, 0x6e,
+                                                       0x69, 0x1b, 0x13, 0x96, 0x80, 0x73, 0x96, 0x96,
+                                                       0x70, 0x1f, 0x95, 0x71, 0x6e, 0x95, 0x6c, 0x1b,
+                                                       0x49, 0x72, 0x6a, 0x30, 0x1f, 0xe, 0x3e, 0xa,
+                                                       0xd7, 0xf7, 0x25, 0x1, 0x56, 0xa, 0x3, 0xf7,
+                                                       0xb9, 0xf8, 0xf1, 0x15, 0xe4, 0x6, 0x46, 0xf7,
+                                                       0x25, 0x5, 0xfb, 0x30, 0x6, 0xfb, 0xf, 0xfc,
+                                                       0x7a, 0x23, 0xa, 0x47, 0xa, 0xf7, 0x77, 0xf8,
+                                                       0xf3, 0x15, 0xe2, 0x6, 0xf7, 0x1a, 0x75, 0xa,
+                                                       0xfb, 0x99, 0xfc, 0x7a, 0x23, 0xa, 0x47, 0xa,
+                                                       0xf7, 0x1e, 0xf8, 0xf3, 0x15, 0xf7, 0x5, 0x6,
+                                                       0xc0, 0xd2, 0xc5, 0x44, 0x5, 0xf7, 0x4, 0x6,
+                                                       0x25, 0x67, 0xa, 0xfb, 0x16, 0x6, 0xfb, 0x64,
+                                                       0xfc, 0x7a, 0x23, 0xa, 0x3e, 0xa, 0xe0, 0x64,
+                                                       0xa, 0x56, 0xa, 0x13, 0xd6, 0xf7, 0x1b, 0xf8,
+                                                       0xf8, 0x15, 0xca, 0x6a, 0xa, 0xa3, 0x1f, 0x13,
+                                                       0xe6, 0x80, 0xa4, 0xa3, 0x80, 0xaa, 0x1b, 0xe2,
+                                                       0x8b, 0xed, 0xa4, 0x1f, 0x4b, 0x7a, 0xa, 0x6e,
+                                                       0x69, 0x1b, 0x13, 0xce, 0x7f, 0x75, 0x96, 0x96,
+                                                       0x71, 0x1f, 0x95, 0x71, 0x6d, 0x95, 0x6b, 0x1b,
+                                                       0x49, 0x73, 0x5a, 0x40, 0x1f, 0x26, 0xfb, 0xf0,
+                                                       0x23, 0xa, 0x3e, 0xa, 0xe0, 0xf7, 0x7, 0x12,
+                                                       0xad, 0xf7, 0x23, 0x65, 0xf7, 0xc, 0xe9, 0xf7,
+                                                       0xc, 0x65, 0xf7, 0x23, 0x13, 0xec, 0xf7, 0x1f,
+                                                       0xf8, 0xfa, 0x4a, 0xa, 0xf7, 0x6a, 0xfb, 0x7,
+                                                       0x4a, 0xa, 0x13, 0xf2, 0xfb, 0xd3, 0xfc, 0x65,
+                                                       0x23, 0xa, 0x3c, 0x61, 0xf7, 0x1f, 0xe9, 0xf7,
+                                                       0x13, 0xe9, 0xf7, 0x1c, 0x1, 0xf7, 0x73, 0xf7,
+                                                       0x1e, 0x3, 0xb3, 0xf7, 0x53, 0x15, 0xf8, 0x8c,
+                                                       0xf7, 0x13, 0xfc, 0x8c, 0x6, 0xf7, 0x4b, 0xe9,
+                                                       0x15, 0xf7, 0x1e, 0xf7, 0x1c, 0xfb, 0x1e, 0x6,
+                                                       0xfc, 0xe2, 0x4, 0xf7, 0x1e, 0xf7, 0x1f, 0x81,
+                                                       0xa, 0x57, 0x83, 0x76, 0xa3, 0xf7, 0x6, 0xf7,
+                                                       0xd5, 0xf7, 0x6, 0x9b, 0x77, 0x12, 0xb2, 0xf7,
+                                                       0x26, 0xf7, 0x89, 0xf7, 0x24, 0x13, 0xdc, 0xab,
+                                                       0x9e, 0x15, 0xc4, 0x5b, 0xc4, 0xcb, 0x5, 0x71,
+                                                       0xbb, 0xc8, 0x7d, 0xbd, 0x1b, 0xf7, 0x41, 0xf7,
+                                                       0x3, 0xf7, 0x13, 0xf7, 0x28, 0xd4, 0x6d, 0xd0,
+                                                       0x68, 0xb4, 0x1f, 0xc5, 0xc9, 0x50, 0xb8, 0x54,
+                                                       0x4f, 0x5, 0x13, 0xec, 0x95, 0x7a, 0x55, 0xad,
+                                                       0x2f, 0x1b, 0xfb, 0x47, 0x23, 0xfb, 0x15, 0xfb,
+                                                       0x25, 0x41, 0x9e, 0x4e, 0xbc, 0x56, 0x1f, 0xeb,
+                                                       0xf7, 0x0, 0x15, 0x7b, 0xb1, 0x89, 0xac, 0x94,
+                                                       0x1a, 0xf7, 0x7, 0xd2, 0xb8, 0xcd, 0xb6, 0xa2,
+                                                       0x7c, 0x82, 0x96, 0x1e, 0xfb, 0x29, 0xfb, 0xa7,
+                                                       0x15, 0xf7, 0x56, 0xf7, 0x69, 0x5, 0x91, 0x7b,
+                                                       0x97, 0x6c, 0x70, 0x1a, 0x37, 0x5d, 0x3e, 0x2d,
+                                                       0x60, 0x7b, 0x99, 0x93, 0x7e, 0x1e, 0xe, 0x4e,
+                                                       0xa, 0xf8, 0x34, 0x89, 0x2a, 0xa, 0x13, 0x78,
+                                                       0xfb, 0xf, 0xf8, 0xa4, 0x15, 0xe3, 0x6, 0x46,
+                                                       0xf7, 0x25, 0x97, 0xa, 0xe, 0x4e, 0xa, 0xf7,
+                                                       0x7a, 0xf8, 0xf1, 0x15, 0xe3, 0x6, 0xf7, 0x1c,
+                                                       0xf7, 0x25, 0x97, 0xa, 0xf7, 0x9, 0xfd, 0x84,
+                                                       0x2a, 0xa, 0xe, 0x6c, 0xa, 0xf8, 0x97, 0xf7,
+                                                       0x23, 0x49, 0xa, 0x13, 0x78, 0xf7, 0x1d, 0xf8,
+                                                       0xf3, 0x15, 0xf7, 0x5, 0x6, 0xc1, 0xd2, 0xc5,
+                                                       0x44, 0x5, 0xf7, 0x4, 0x6, 0x24, 0x67, 0xa,
+                                                       0xfb, 0x15, 0x6, 0xf7, 0x42, 0xfd, 0x84, 0x2a,
+                                                       0xa, 0xe, 0x6c, 0xa, 0xf8, 0x9e, 0xf7, 0x7,
+                                                       0x12, 0xcd, 0xf7, 0x1f, 0x48, 0xf7, 0xc, 0xea,
+                                                       0xf7, 0xc, 0x48, 0xf7, 0x1f, 0x13, 0x6c, 0xf7,
+                                                       0x1e, 0xf8, 0xfa, 0x4a, 0xa, 0xf7, 0x6b, 0xfb,
+                                                       0x7, 0x4a, 0xa, 0xca, 0xfd, 0x6f, 0x15, 0x13,
+                                                       0x72, 0x2c, 0xa, 0x13, 0xac, 0x36, 0xa, 0xe,
+                                                       0x20, 0xfb, 0x55, 0x76, 0xf9, 0xc8, 0xf7, 0x24,
+                                                       0x1, 0xb6, 0x28, 0x15, 0x97, 0x20, 0x52, 0xa,
+                                                       0xf5, 0xf7, 0xf, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8,
+                                                       0x89, 0x78, 0xa, 0xfc, 0x5, 0x6e, 0xa, 0xfb,
+                                                       0xe, 0xf8, 0x5, 0x40, 0xa, 0xf7, 0x58, 0xfc,
+                                                       0x9d, 0x5, 0x2b, 0x48, 0xa, 0xf7, 0x35, 0xf9,
+                                                       0x55, 0x15, 0xe1, 0x6, 0xf7, 0x19, 0xf7, 0x24,
+                                                       0x5, 0xfb, 0x2c, 0x6, 0xe, 0x57, 0xfb, 0x4f,
+                                                       0x76, 0xf7, 0x50, 0xf7, 0x3, 0xf7, 0xe2, 0xf6,
+                                                       0xf7, 0x4e, 0x77, 0x1, 0xc9, 0xf7, 0x20, 0xf7,
+                                                       0x7c, 0xf7, 0x24, 0x3, 0xf7, 0x5e, 0xc5, 0x15,
+                                                       0x6c, 0xa7, 0xb8, 0x5c, 0xdd, 0x1b, 0xf7, 0x10,
+                                                       0xec, 0xef, 0xf7, 0x43, 0xf7, 0x49, 0x21, 0xeb,
+                                                       0xfb, 0x7, 0x39, 0x64, 0x64, 0x69, 0x69, 0x1f,
+                                                       0xf7, 0x97, 0xfb, 0x20, 0xfe, 0x32, 0xf7, 0x20,
+                                                       0x7, 0x8a, 0xf8, 0x63, 0x15, 0xf6, 0xbf, 0xca,
+                                                       0xcc, 0xf2, 0x98, 0xfb, 0x3, 0x50, 0xfb, 0x16,
+                                                       0x4c, 0x69, 0x5b, 0x36, 0x66, 0xd1, 0xe9, 0x1e,
+                                                       0xe, 0x20, 0xfb, 0x55, 0x76, 0xf9, 0xcf, 0xf7,
+                                                       0x8, 0x1, 0xf7, 0x6, 0xf7, 0x9, 0xe8, 0xf7,
+                                                       0x9, 0x3, 0xf7, 0x6, 0xf8, 0xf9, 0x88, 0xa,
+                                                       0xf7, 0x66, 0xfb, 0x8, 0x88, 0xa, 0xfb, 0xad,
+                                                       0xfd, 0xcf, 0x15, 0x97, 0xfb, 0x0, 0x52, 0xa,
+                                                       0xf6, 0xf7, 0x10, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8,
+                                                       0x8d, 0x78, 0xa, 0xfc, 0x8, 0x6e, 0xa, 0xfb,
+                                                       0xe, 0xf8, 0x8, 0x40, 0xa, 0xf7, 0x58, 0xfc,
+                                                       0xa1, 0x5, 0x2a, 0x48, 0xa, 0xe, 0x76, 0xa0,
+                                                       0xf8, 0x9f, 0x9a, 0xf7, 0x48, 0x9e, 0x6, 0xfb,
+                                                       0x70, 0x98, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff,
+                                                       0xc, 0x9, 0xf7, 0x11, 0xa, 0xf7, 0x20, 0xb,
+                                                       0xf7, 0x0, 0x9c, 0xc, 0xc, 0x8c, 0xc, 0xe,
+                                                       0xf7, 0xe1, 0x14, 0xf9, 0x2b, 0x15, 0xb5, 0x13,
+                                                       0x0, 0x79, 0x2, 0x0, 0x1, 0x0, 0x23, 0x0,
+                                                       0x28, 0x0, 0x30, 0x0, 0x65, 0x0, 0x6a, 0x0,
+                                                       0xaa, 0x0, 0xca, 0x0, 0xed, 0x0, 0xf1, 0x1,
+                                                       0x19, 0x1, 0x21, 0x1, 0x3e, 0x1, 0x5b, 0x1,
+                                                       0x69, 0x1, 0x81, 0x1, 0x87, 0x1, 0x93, 0x1,
+                                                       0xc7, 0x1, 0xcb, 0x1, 0xda, 0x1, 0xe3, 0x1,
+                                                       0xed, 0x1, 0xfc, 0x2, 0x5, 0x2, 0xe, 0x2,
+                                                       0x18, 0x2, 0x25, 0x2, 0x2e, 0x2, 0x39, 0x2,
+                                                       0x44, 0x2, 0x4d, 0x2, 0x52, 0x2, 0x57, 0x2,
+                                                       0x60, 0x2, 0x6a, 0x2, 0x74, 0x2, 0x7f, 0x2,
+                                                       0x86, 0x2, 0x8f, 0x2, 0x99, 0x2, 0xa5, 0x2,
+                                                       0xae, 0x2, 0xb7, 0x2, 0xc0, 0x2, 0xc5, 0x2,
+                                                       0xca, 0x2, 0xd5, 0x2, 0xe8, 0x2, 0xfb, 0x3,
+                                                       0x4, 0x3, 0xf, 0x3, 0x21, 0x3, 0x2c, 0x3,
+                                                       0x34, 0x3, 0x3c, 0x3, 0x4d, 0x3, 0x5e, 0x3,
+                                                       0x65, 0x3, 0x75, 0x3, 0x85, 0x3, 0x94, 0x3,
+                                                       0x9b, 0x3, 0xa2, 0x3, 0xa8, 0x3, 0xb6, 0x3,
+                                                       0xbf, 0x3, 0xca, 0x3, 0xd1, 0x3, 0xd9, 0x3,
+                                                       0xde, 0x3, 0xe3, 0x3, 0xe7, 0x3, 0xeb, 0x3,
+                                                       0xef, 0x3, 0xf9, 0x4, 0x4, 0x4, 0xa, 0x4,
+                                                       0xd, 0x4, 0x11, 0x4, 0x1c, 0x4, 0x27, 0x4,
+                                                       0x32, 0x4, 0x3d, 0x4, 0x44, 0x4, 0x4b, 0x4,
+                                                       0x51, 0x4, 0x58, 0x4, 0x5f, 0x4, 0x66, 0x4,
+                                                       0x6b, 0x4, 0x70, 0x4, 0x74, 0x4, 0x78, 0x4,
+                                                       0x7c, 0x4, 0x85, 0x4, 0x8f, 0x4, 0x97, 0x4,
+                                                       0x9b, 0x4, 0x9f, 0x4, 0xa3, 0x4, 0xa7, 0x4,
+                                                       0xab, 0x4, 0xb4, 0x4, 0xbd, 0x4, 0xc6, 0x4,
+                                                       0xcf, 0x4, 0xd8, 0x4, 0xe1, 0x4, 0xea, 0x4,
+                                                       0xf3, 0x4, 0xfc, 0x5, 0x5, 0x5, 0xe, 0x5,
+                                                       0x17, 0x5, 0x20, 0x5, 0x27, 0x5, 0x2c, 0x5,
+                                                       0x32, 0x5, 0x37, 0x5, 0x3c, 0x5, 0x41, 0x77,
+                                                       0xb8, 0x83, 0xa2, 0x38, 0xa, 0xac, 0x1a, 0xeb,
+                                                       0x80, 0xf4, 0xfb, 0x73, 0xfb, 0x32, 0x65, 0x49,
+                                                       0x35, 0x73, 0x1e, 0xf7, 0x13, 0x74, 0x5, 0xa5,
+                                                       0x2d, 0xa, 0x80, 0x6e, 0x82, 0x3c, 0x7d, 0x8,
+                                                       0xb, 0x30, 0xa, 0x20, 0xa, 0xb, 0xfd, 0x49,
+                                                       0x24, 0xa, 0x13, 0xbc, 0x26, 0xa, 0x15, 0xfb,
+                                                       0x84, 0xf7, 0x50, 0x65, 0xde, 0xf7, 0x3e, 0xf2,
+                                                       0xf7, 0x1b, 0xf7, 0x23, 0xf7, 0x18, 0x32, 0xf7,
+                                                       0x19, 0xfb, 0x4c, 0xfb, 0x4f, 0x37, 0xfb, 0x21,
+                                                       0xfb, 0x10, 0x1e, 0xf7, 0x23, 0x16, 0xf7, 0x2,
+                                                       0xc8, 0xb6, 0xce, 0xd3, 0xc5, 0x5b, 0x22, 0xfb,
+                                                       0x7, 0x49, 0x58, 0x4b, 0x49, 0x4d, 0xc3, 0xf7,
+                                                       0x2, 0x1e, 0xe, 0x21, 0xa, 0x3b, 0xa, 0xb,
+                                                       0x15, 0xf7, 0xfb, 0x6, 0xf7, 0x34, 0x5a, 0xf7,
+                                                       0x31, 0xfb, 0x60, 0xfb, 0x3f, 0x3a, 0xfb, 0x1d,
+                                                       0xfb, 0x23, 0xfb, 0x42, 0xf7, 0x20, 0x26, 0xf7,
+                                                       0xe, 0xf7, 0x47, 0xb8, 0xf7, 0x11, 0xac, 0x97,
+                                                       0x1e, 0xfb, 0x23, 0xa2, 0x5, 0x73, 0x83, 0x79,
+                                                       0x5a, 0x48, 0x1b, 0x3a, 0x6a, 0xcd, 0xcb, 0x89,
+                                                       0x1f, 0x8e, 0xe1, 0x15, 0xd1, 0x8a, 0xb0, 0xc1,
+                                                       0xce, 0x1b, 0xda, 0xab, 0x55, 0x45, 0x1f, 0xe,
+                                                       0x2e, 0xd1, 0x45, 0x37, 0xa, 0xf7, 0x59, 0x15,
+                                                       0x70, 0x7, 0x3d, 0x72, 0x4c, 0x34, 0x55, 0x73,
+                                                       0xac, 0xa9, 0xbc, 0xc4, 0xa4, 0xa4, 0x90, 0x1e,
+                                                       0xa9, 0x92, 0xc8, 0x95, 0x9c, 0x94, 0x8, 0xe,
+                                                       0xf7, 0x26, 0x6, 0xc3, 0xf7, 0x3b, 0x5, 0xf7,
+                                                       0xa3, 0x6, 0xc6, 0xfb, 0x3b, 0x5, 0xf7, 0x2a,
+                                                       0x6, 0xfb, 0xa4, 0xf9, 0x74, 0x40, 0xa, 0x76,
+                                                       0xfc, 0x51, 0x15, 0xe7, 0xf7, 0xa5, 0xe9, 0xfb,
+                                                       0xa5, 0x5, 0xb, 0x15, 0x27, 0xa, 0xe, 0x15,
+                                                       0xfb, 0x3a, 0xd8, 0xfb, 0x61, 0xf7, 0xa0, 0xf7,
+                                                       0x8d, 0xeb, 0xf7, 0x4b, 0xf7, 0x50, 0xf7, 0x65,
+                                                       0x3d, 0xa, 0xfb, 0x22, 0xfb, 0x79, 0x1e, 0xf7,
+                                                       0x28, 0x16, 0xf4, 0xac, 0xf7, 0x21, 0xf7, 0x38,
+                                                       0xf7, 0x43, 0xa1, 0xfb, 0x39, 0x3a, 0xb, 0x15,
+                                                       0x2c, 0xa, 0x13, 0xb8, 0x36, 0xa, 0xb, 0xf7,
+                                                       0x3, 0xf7, 0x80, 0x1e, 0xf8, 0x16, 0xfb, 0x26,
+                                                       0xfc, 0x16, 0x7, 0xfb, 0xf, 0x8b, 0x28, 0xfb,
+                                                       0x20, 0xfb, 0x1a, 0x7e, 0xe4, 0xf7, 0x19, 0x1e,
+                                                       0xf8, 0x16, 0x7, 0xb, 0xf7, 0x15, 0xf8, 0x9e,
+                                                       0xfb, 0x1f, 0xfb, 0x67, 0x6, 0xfb, 0x15, 0x8d,
+                                                       0x33, 0xfb, 0x7, 0x2a, 0x94, 0xe1, 0xf7, 0x17,
+                                                       0x1e, 0xf7, 0x67, 0xfb, 0x1f, 0xfb, 0xdd, 0x7,
+                                                       0xb, 0x95, 0x99, 0xb4, 0xd0, 0x1b, 0xeb, 0x8b,
+                                                       0x5d, 0x68, 0x1f, 0x82, 0x7, 0x6f, 0xb, 0xf8,
+                                                       0xb5, 0xf7, 0x11, 0xfc, 0x25, 0xf7, 0x5c, 0xf7,
+                                                       0xfd, 0xf7, 0x11, 0xfb, 0xfd, 0xf7, 0x39, 0xf8,
+                                                       0x18, 0xf7, 0x11, 0xfc, 0xa8, 0x6, 0xb, 0xf7,
+                                                       0x79, 0xc4, 0x2b, 0xa, 0xe, 0x15, 0x98, 0x5f,
+                                                       0x8e, 0x84, 0x8e, 0x83, 0x8, 0xf7, 0x1e, 0x6,
+                                                       0xb, 0xfc, 0xdc, 0x15, 0xfb, 0x39, 0xd8, 0xfb,
+                                                       0x62, 0xf7, 0xa0, 0xf7, 0x8d, 0xeb, 0xf7, 0x4c,
+                                                       0xf7, 0x4f, 0xf7, 0x66, 0xfb, 0x5, 0xf7, 0x35,
+                                                       0xfb, 0x7c, 0xfb, 0x72, 0xfb, 0xf, 0xfb, 0x21,
+                                                       0xfb, 0x7a, 0x1e, 0xf7, 0x28, 0x16, 0xf4, 0xac,
+                                                       0xf7, 0x22, 0xf7, 0x38, 0xf7, 0x43, 0xa1, 0xfb,
+                                                       0x3a, 0x3a, 0xfb, 0x14, 0xb, 0x3b, 0xa, 0x26,
+                                                       0xa, 0x3a, 0xa, 0xbb, 0xf7, 0x28, 0x1, 0xd7,
+                                                       0xf7, 0x24, 0x3, 0xd7, 0x16, 0x2e, 0xa, 0xb,
+                                                       0x5e, 0xa, 0xa4, 0xfb, 0x48, 0xf7, 0xa0, 0x2f,
+                                                       0xa, 0x69, 0xa, 0xf7, 0x3b, 0xf7, 0x10, 0xf8,
+                                                       0x51, 0x77, 0xb, 0xfb, 0x8, 0xba, 0x32, 0xf7,
+                                                       0x14, 0xcf, 0xce, 0xac, 0xc5, 0xb1, 0x1e, 0x8d,
+                                                       0x6, 0xb, 0xf5, 0xe1, 0xbf, 0xb6, 0xa7, 0xa6,
+                                                       0x1e, 0x80, 0xb, 0x88, 0xd1, 0x8, 0x8a, 0xa9,
+                                                       0x8d, 0xf7, 0x24, 0xb, 0x20, 0x7d, 0xef, 0x48,
+                                                       0x76, 0xf8, 0x4a, 0xf7, 0x0, 0xb, 0x8f, 0x8b,
+                                                       0xf7, 0x11, 0xf7, 0x5c, 0xf7, 0x11, 0xf7, 0x39,
+                                                       0xf7, 0x11, 0xb, 0x41, 0x7d, 0xfb, 0xc, 0x78,
+                                                       0xfb, 0x16, 0x1a, 0xb, 0x20, 0x7d, 0xf7, 0x0,
+                                                       0xf7, 0x16, 0xe1, 0xf7, 0x10, 0xf6, 0xb, 0xfb,
+                                                       0x5, 0xf7, 0x36, 0xfb, 0x7c, 0xfb, 0x72, 0xfb,
+                                                       0xf, 0xb, 0x57, 0x7d, 0xf7, 0x4, 0xf7, 0xd3,
+                                                       0xf7, 0x4, 0xb, 0xa0, 0x76, 0x4d, 0xa, 0xb,
+                                                       0x5, 0xfb, 0x25, 0x6, 0xb, 0xfb, 0x2c, 0x5e,
+                                                       0xf7, 0x5, 0xf7, 0x1a, 0x1e, 0xe, 0x1, 0xd3,
+                                                       0xf7, 0x26, 0xf7, 0xb3, 0xf7, 0x26, 0x3, 0xb,
+                                                       0x1, 0xa2, 0xf7, 0x29, 0xf7, 0x6a, 0xf7, 0x22,
+                                                       0x3, 0xb, 0xf8, 0xfa, 0x4b, 0xa, 0xf7, 0x62,
+                                                       0xfb, 0x7, 0x4b, 0xa, 0xb, 0xb4, 0x8b, 0xde,
+                                                       0xc5, 0x1a, 0xe6, 0xb, 0xfe, 0x3c, 0x15, 0xf7,
+                                                       0x20, 0xf9, 0x60, 0x6d, 0xa, 0x3e, 0xa, 0xd9,
+                                                       0xf7, 0x23, 0x1, 0x56, 0xa, 0x3, 0xb, 0x70,
+                                                       0x5b, 0x87, 0x6c, 0x1b, 0x76, 0x7f, 0x8c, 0x90,
+                                                       0x73, 0x1f, 0xb, 0x12, 0xcd, 0xf7, 0x1f, 0xf7,
+                                                       0x5d, 0xf7, 0x1f, 0xb, 0x15, 0xf7, 0xc, 0xf7,
+                                                       0x7, 0xfb, 0xc, 0x6, 0xb, 0x15, 0xf7, 0x7,
+                                                       0xf7, 0x7, 0xfb, 0x7, 0x6, 0xb, 0xfc, 0x15,
+                                                       0xa0, 0x76, 0xb, 0xf9, 0x62, 0x77, 0x1, 0xb,
+                                                       0x6c, 0xa, 0xf8, 0x95, 0xf7, 0x25, 0x49, 0xa,
+                                                       0x13, 0x78, 0xb, 0x5, 0xfb, 0x32, 0x6, 0xfb,
+                                                       0x33, 0xfb, 0xae, 0xfb, 0x34, 0xf7, 0xae, 0x5,
+                                                       0xfb, 0x35, 0x6, 0xf7, 0x8e, 0xb, 0x15, 0xe3,
+                                                       0x6, 0xf7, 0x11, 0xf7, 0x5f, 0xfb, 0x11, 0xf7,
+                                                       0x61, 0x5, 0x33, 0x6, 0xf2, 0xfb, 0x61, 0x5,
+                                                       0xb, 0x66, 0xa, 0xf7, 0x52, 0xf7, 0x1d, 0x13,
+                                                       0x7c, 0xb, 0x5, 0x87, 0x9e, 0x82, 0x87, 0xae,
+                                                       0x1b, 0xf7, 0x41, 0xa2, 0xb, 0x15, 0xe3, 0x6,
+                                                       0x24, 0xf7, 0x64, 0xf2, 0xf7, 0x5c, 0x5, 0x33,
+                                                       0x6, 0xfb, 0x11, 0xfb, 0x5c, 0x5, 0xb, 0xc6,
+                                                       0x78, 0xf7, 0x11, 0xf9, 0x42, 0xf7, 0x24, 0x42,
+                                                       0xa, 0xb, 0xf7, 0x13, 0xf8, 0x9d, 0xfb, 0x13,
+                                                       0x6, 0xb, 0xad, 0xf7, 0x23, 0xf7, 0x96, 0xf7,
+                                                       0x23, 0xb, 0xf7, 0x66, 0xf7, 0x3d, 0xf7, 0x3d,
+                                                       0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x3d, 0xf7, 0x3d,
+                                                       0xfb, 0x66, 0xb, 0xf7, 0x3c, 0xf7, 0x1c, 0xfb,
+                                                       0x1b, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1c, 0xfb,
+                                                       0x1b, 0xfb, 0x3c, 0xb, 0x5f, 0xa, 0xf8, 0x81,
+                                                       0xf7, 0x11, 0xb, 0x57, 0xfb, 0x4e, 0x76, 0xf7,
+                                                       0x54, 0xf7, 0x0, 0xf7, 0xe8, 0xf7, 0x5, 0x7f,
+                                                       0x77, 0x12, 0xb, 0xfb, 0xa6, 0xfb, 0x58, 0xf7,
+                                                       0x7, 0xf7, 0xb2, 0xf7, 0x8, 0xf7, 0xb2, 0xf7,
+                                                       0x7, 0x1, 0xb, 0x77, 0x1, 0xd0, 0xf7, 0x1e,
+                                                       0xf7, 0xc9, 0xf7, 0x1e, 0x3, 0xd0, 0x16, 0xf7,
+                                                       0x1e, 0xb, 0xec, 0x76, 0xf8, 0x2c, 0x77, 0x1,
+                                                       0xb, 0x15, 0xfc, 0x16, 0x7, 0xfb, 0x3b, 0xb,
+                                                       0xf7, 0x7, 0x78, 0xf7, 0x10, 0xb, 0x1, 0xd7,
+                                                       0xf7, 0x25, 0xf7, 0x94, 0xf7, 0x2a, 0x3, 0xd7,
+                                                       0x16, 0xf7, 0x25, 0xb, 0x45, 0xa, 0x7, 0x13,
+                                                       0xe8, 0xfb, 0x1a, 0x6, 0xb, 0x4c, 0xa, 0xf9,
+                                                       0x82, 0x77, 0x1, 0xd7, 0xf7, 0x13, 0x3, 0xb,
+                                                       0x7d, 0xa, 0xd0, 0x16, 0xf7, 0x20, 0xb, 0xf7,
+                                                       0xf, 0x39, 0xdd, 0x8a, 0x77, 0x12, 0xb, 0x6,
+                                                       0x97, 0x8c, 0x8b, 0xb, 0x12, 0xa8, 0xf7, 0x20,
+                                                       0xb, 0xf7, 0x23, 0x5, 0xb, 0xfb, 0x20, 0x6,
+                                                       0xb, 0xc6, 0xa0, 0x76, 0xb, 0x65, 0xa, 0xaa,
+                                                       0xac, 0x1b, 0xaa, 0xa2, 0x82, 0x81, 0xb, 0x15,
+                                                       0xe9, 0x6, 0xf7, 0x45, 0x83, 0xa, 0xfb, 0x39,
+                                                       0x6, 0xb, 0x57, 0x7d, 0xf5, 0x2d, 0xe9, 0xb,
+                                                       0x68, 0xa, 0xe, 0x5, 0x89, 0x6, 0xb, 0x75,
+                                                       0xfb, 0x1, 0x26, 0x1f, 0x3e, 0xfb, 0x1, 0xd8,
+                                                       0x6, 0xb, 0xf7, 0x9d, 0x16, 0xf7, 0x1d, 0xf7,
+                                                       0xc0, 0x6, 0xf7, 0x8f, 0xb, 0xfb, 0x10, 0x7a,
+                                                       0xfb, 0x3, 0x52, 0x1e, 0xeb, 0x16, 0xcc, 0xb,
+                                                       0xa7, 0xf7, 0x55, 0x84, 0xda, 0x1b, 0xf7, 0xd,
+                                                       0xf7, 0x3d, 0xb, 0xa0, 0x76, 0xf8, 0xa8, 0x77,
+                                                       0x1, 0xb, 0xf7, 0x44, 0xf7, 0x7, 0xfb, 0x44,
+                                                       0xb, 0x67, 0xa, 0xfb, 0x2d, 0x6, 0xb, 0xa0,
+                                                       0x76, 0xf8, 0x2c, 0xf7, 0x1, 0xb, 0x5, 0xf7,
+                                                       0x9, 0x6, 0xfb, 0x0, 0xb, 0x5, 0xfb, 0x21,
+                                                       0x6, 0xfb, 0xb, 0xb, 0x20, 0x78, 0xf7, 0x6,
+                                                       0xb, 0x6, 0x7d, 0x89, 0x87, 0xb, 0x82, 0xa,
+                                                       0xd7, 0xb, 0xfb, 0x4, 0x6, 0xb, 0xf7, 0x20,
+                                                       0x3, 0xb, 0x1, 0xcb, 0xf7, 0x28, 0xf7, 0xfc,
+                                                       0x85, 0xa, 0xb, 0xfb, 0x58, 0xf7, 0x0, 0xf9,
+                                                       0x52, 0xf7, 0x0, 0x1, 0xb, 0xfb, 0x3e, 0xfb,
+                                                       0x3d, 0xfb, 0x65, 0x1e, 0xe, 0xfb, 0x1e, 0x6,
+                                                       0xe, 0xf7, 0xd, 0x1, 0xb, 0xf7, 0x26, 0x5,
+                                                       0xb, 0xf7, 0x26, 0x1, 0xb, 0xf7, 0x28, 0x3,
+                                                       0xb, 0x57, 0x8b, 0xf7, 0xe, 0xf8, 0xe8, 0x77,
+                                                       0x1, 0xb, 0xfc, 0x1d, 0x6, 0xf8, 0xf, 0xf8,
+                                                       0x76, 0x5, 0xb, 0x15, 0xf7, 0x9, 0xf7, 0x8,
+                                                       0xfb, 0x9, 0x6, 0xb, 0xb8, 0x6c, 0x1f, 0x7c,
+                                                       0xa2, 0x81, 0xa6, 0x84, 0xb, 0x15, 0xf7, 0xd,
+                                                       0xf7, 0xa, 0xfb, 0xd, 0x6, 0xb, 0x15, 0xf7,
+                                                       0x5, 0xf7, 0x9, 0xfb, 0x5, 0x6, 0xb, 0xf7,
+                                                       0xd6, 0x7, 0xfb, 0xff, 0xfc, 0x65, 0x5, 0xb,
+                                                       0x15, 0xf7, 0xa, 0xf7, 0x9, 0xfb, 0xa, 0x6,
+                                                       0xb, 0x15, 0xf7, 0xa, 0xf7, 0xb, 0xfb, 0xa,
+                                                       0x6, 0xb, 0x15, 0xf7, 0xb, 0xf7, 0x9, 0xfb,
+                                                       0xb, 0x6, 0xb, 0x77, 0x1, 0xf7, 0x78, 0xf7,
+                                                       0x13, 0x3, 0xb3, 0xb, 0x3c, 0x98, 0x76, 0xf8,
+                                                       0x9e, 0x77, 0x1, 0xb1, 0xb, 0x15, 0xf7, 0x7,
+                                                       0xf7, 0x8, 0xfb, 0x7, 0x6, 0xb, 0xf9, 0x88,
+                                                       0x5, 0xfb, 0x13, 0x6, 0xe, 0x1, 0xd0, 0x7d,
+                                                       0xa, 0xb, 0x15, 0xf7, 0xa, 0x6, 0xc4, 0xb,
+                                                       0x5, 0xfb, 0x31, 0x6, 0xb, 0x5, 0xfb, 0x2f,
+                                                       0x6, 0xb, 0x89, 0x42, 0x5a, 0x7f, 0xb
+                                                      };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c
new file mode 100644
index 0000000..0555165
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c
@@ -0,0 +1,2061 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansBoldItalicFontData [16418] = {0x1,
+                                                             0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x17,
+                                                             0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,
+                                                             0x73, 0x50, 0x53, 0x2d, 0x42, 0x6f, 0x6c, 0x64,
+                                                             0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1,
+                                                             0x1, 0x1, 0x27, 0xf8, 0x10, 0x0, 0xf8, 0x1c,
+                                                             0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e, 0x3, 0xf8,
+                                                             0x14, 0x4, 0x7f, 0xc, 0x2, 0xfb, 0x42, 0xfb,
+                                                             0x78, 0xfa, 0xee, 0xfa, 0x56, 0x5, 0xf7, 0x3c,
+                                                             0xf, 0xf8, 0x9c, 0x11, 0xb1, 0x1c, 0x39, 0xfc,
+                                                             0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f, 0x48,
+                                                             0x55, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20,
+                                                             0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                             0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                             0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                             0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                             0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
+                                                             0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x61, 0x6e,
+                                                             0x73, 0x20, 0x50, 0x53, 0x20, 0x42, 0x6f, 0x6c,
+                                                             0x64, 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63,
+                                                             0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x61,
+                                                             0x6e, 0x73, 0x20, 0x50, 0x53, 0x0, 0x0, 0x1,
+                                                             0x0, 0x1, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84,
+                                                             0x0, 0x0, 0x86, 0x2, 0x0, 0x91, 0x0, 0x0,
+                                                             0x63, 0x0, 0x0, 0x6d, 0x1, 0x0, 0x8c, 0x0,
+                                                             0x0, 0x92, 0x0, 0x0, 0xc7, 0x0, 0x0, 0xe4,
+                                                             0x0, 0x0, 0x2, 0x5, 0x0, 0x68, 0x0, 0x0,
+                                                             0x9, 0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x1d,
+                                                             0x1, 0x87, 0x0, 0x0, 0x75, 0x0, 0x0, 0x65,
+                                                             0x0, 0x0, 0x76, 0x0, 0x0, 0x79, 0x0, 0x0,
+                                                             0x70, 0x1, 0x0, 0x7e, 0x0, 0x0, 0x7a, 0x0,
+                                                             0x0, 0xc0, 0x0, 0x0, 0x6b, 0x0, 0x0, 0x8e,
+                                                             0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0,
+                                                             0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x74, 0x0,
+                                                             0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0, 0x7f,
+                                                             0x0, 0x0, 0x99, 0x0, 0x0, 0xdd, 0x0, 0x0,
+                                                             0x6c, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc6, 0x0,
+                                                             0x0, 0x60, 0x2, 0x0, 0x67, 0x0, 0x0, 0x64,
+                                                             0x0, 0x0, 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0,
+                                                             0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0,
+                                                             0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, 0xa6,
+                                                             0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,
+                                                             0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,
+                                                             0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,
+                                                             0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,
+                                                             0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,
+                                                             0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,
+                                                             0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,
+                                                             0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,
+                                                             0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,
+                                                             0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,
+                                                             0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,
+                                                             0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,
+                                                             0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,
+                                                             0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,
+                                                             0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,
+                                                             0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,
+                                                             0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0,
+                                                             0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90,
+                                                             0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0,
+                                                             0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2,
+                                                             0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb,
+                                                             0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0,
+                                                             0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0,
+                                                             0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2,
+                                                             0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0,
+                                                             0xe6, 0x2, 0x0, 0x1, 0x0, 0x4, 0x0, 0x7,
+                                                             0x0, 0x37, 0x0, 0x4c, 0x0, 0x76, 0x0, 0x89,
+                                                             0x0, 0xb9, 0x0, 0xcf, 0x0, 0xde, 0x0, 0xf6,
+                                                             0x1, 0x48, 0x1, 0x94, 0x1, 0xbc, 0x1, 0xe0,
+                                                             0x2, 0x2b, 0x2, 0x70, 0x2, 0x99, 0x2, 0xd3,
+                                                             0x3, 0x39, 0x3, 0xc9, 0x4, 0x5a, 0x5, 0x4,
+                                                             0x5, 0x21, 0x5, 0x5f, 0x5, 0x97, 0x5, 0xcc,
+                                                             0x5, 0xf3, 0x6, 0x1a, 0x6, 0x2e, 0x6, 0x40,
+                                                             0x6, 0x55, 0x6, 0x9e, 0x6, 0xca, 0x7, 0x1f,
+                                                             0x7, 0x83, 0x7, 0xc5, 0x8, 0x25, 0x8, 0x90,
+                                                             0x8, 0xc1, 0x9, 0x35, 0x9, 0x9f, 0x9, 0xc2,
+                                                             0x9, 0xfa, 0xa, 0x1f, 0xa, 0x3f, 0xa, 0x62,
+                                                             0xa, 0xb7, 0xb, 0x65, 0xb, 0x96, 0xb, 0xef,
+                                                             0xc, 0x39, 0xc, 0x6b, 0xc, 0x97, 0xc, 0xba,
+                                                             0xd, 0x1a, 0xd, 0x48, 0xd, 0x58, 0xd, 0x89,
+                                                             0xd, 0xb7, 0xd, 0xc9, 0xe, 0x7, 0xe, 0x2d,
+                                                             0xe, 0x7c, 0xe, 0xb8, 0xf, 0x2d, 0xf, 0x8a,
+                                                             0xf, 0xe6, 0x10, 0xa, 0x10, 0x59, 0x10, 0x74,
+                                                             0x10, 0xb2, 0x10, 0xe1, 0x11, 0x3, 0x11, 0x31,
+                                                             0x11, 0x53, 0x11, 0x6c, 0x11, 0x8d, 0x11, 0xae,
+                                                             0x11, 0xbc, 0x11, 0xcb, 0x12, 0x1d, 0x12, 0x7d,
+                                                             0x12, 0xc7, 0x13, 0x21, 0x13, 0x73, 0x13, 0xb1,
+                                                             0x14, 0x1c, 0x14, 0x64, 0x14, 0x82, 0x14, 0xc6,
+                                                             0x14, 0xf2, 0x14, 0xfe, 0x15, 0x65, 0x15, 0xaf,
+                                                             0x15, 0xc9, 0x16, 0x24, 0x16, 0x80, 0x16, 0xbf,
+                                                             0x17, 0x16, 0x17, 0x5a, 0x17, 0xa8, 0x17, 0xc5,
+                                                             0x18, 0x1, 0x18, 0x2f, 0x18, 0x6b, 0x18, 0x98,
+                                                             0x18, 0xeb, 0x19, 0x4, 0x19, 0x5b, 0x19, 0xa1,
+                                                             0x1a, 0x1c, 0x1a, 0x3e, 0x1a, 0x9e, 0x1a, 0xbd,
+                                                             0x1a, 0xd7, 0x1b, 0xe, 0x1b, 0x58, 0x1b, 0x6c,
+                                                             0x1c, 0xa, 0x1c, 0x8f, 0x1c, 0xa7, 0x1d, 0x32,
+                                                             0x1d, 0x5a, 0x1d, 0x7d, 0x1d, 0xc5, 0x1d, 0xe8,
+                                                             0x1e, 0x7, 0x1e, 0x11, 0x1e, 0x1c, 0x1e, 0x68,
+                                                             0x1e, 0xb8, 0x1f, 0x2e, 0x1f, 0x44, 0x1f, 0xdc,
+                                                             0x20, 0x1b, 0x20, 0x48, 0x20, 0xbc, 0x21, 0x52,
+                                                             0x21, 0xd7, 0x22, 0x2d, 0x22, 0x4d, 0x22, 0xf6,
+                                                             0x23, 0x8, 0x23, 0x98, 0x24, 0x2, 0x24, 0x10,
+                                                             0x24, 0x25, 0x24, 0x37, 0x24, 0xd9, 0x24, 0xf1,
+                                                             0x25, 0x25, 0x25, 0x56, 0x25, 0x9c, 0x25, 0xf2,
+                                                             0x26, 0x2, 0x26, 0x4a, 0x26, 0x78, 0x26, 0x8a,
+                                                             0x26, 0xbd, 0x26, 0xe2, 0x27, 0x26, 0x27, 0x33,
+                                                             0x27, 0x93, 0x28, 0x10, 0x28, 0xaa, 0x29, 0x0,
+                                                             0x29, 0x18, 0x29, 0x33, 0x29, 0x53, 0x29, 0x9e,
+                                                             0x29, 0xc2, 0x29, 0xf9, 0x2a, 0x49, 0x2a, 0xd8,
+                                                             0x2a, 0xed, 0x2b, 0x4, 0x2b, 0x24, 0x2b, 0x49,
+                                                             0x2b, 0x6d, 0x2b, 0x84, 0x2b, 0xa5, 0x2b, 0xbf,
+                                                             0x2c, 0xc, 0x2c, 0x66, 0x2c, 0x72, 0x2c, 0x8e,
+                                                             0x2c, 0xa8, 0x2c, 0xed, 0x2d, 0x13, 0x2d, 0x46,
+                                                             0x2d, 0xbd, 0x2d, 0xca, 0x2d, 0xd0, 0x2d, 0xde,
+                                                             0x2d, 0xee, 0x2e, 0x1e, 0x2e, 0x6a, 0x2e, 0xe8,
+                                                             0x2f, 0x5, 0x2f, 0x2a, 0x2f, 0x4f, 0x2f, 0xa2,
+                                                             0x2f, 0xc2, 0x30, 0x5b, 0x31, 0x8, 0x31, 0x8e,
+                                                             0x31, 0xb1, 0x31, 0xd6, 0x31, 0xfb, 0x32, 0x29,
+                                                             0x32, 0x3f, 0x32, 0x5b, 0x32, 0x7d, 0x32, 0x9e,
+                                                             0x33, 0x1a, 0x33, 0xac, 0x33, 0xbf, 0x33, 0xe4,
+                                                             0x34, 0x1, 0x34, 0x52, 0x34, 0x77, 0x34, 0xa3,
+                                                             0x35, 0x1d, 0x35, 0x2b, 0x35, 0x37, 0x35, 0x45,
+                                                             0x35, 0x58, 0x35, 0x94, 0x35, 0xed, 0x36, 0x24,
+                                                             0xfb, 0xf9, 0xe, 0xfb, 0xf9, 0xe, 0xf8, 0xf0,
+                                                             0xd4, 0x42, 0xf7, 0x26, 0x12, 0x13, 0x40, 0xf7,
+                                                             0x30, 0xf9, 0x82, 0x15, 0x49, 0x94, 0xae, 0x3b,
+                                                             0xf7, 0x4, 0x1b, 0xf7, 0x11, 0xb9, 0xf7, 0x4,
+                                                             0xad, 0x96, 0x1f, 0x43, 0x6, 0x13, 0x80, 0x75,
+                                                             0x80, 0x6c, 0x58, 0x4b, 0x1b, 0x13, 0x40, 0x55,
+                                                             0x76, 0xad, 0xb2, 0x81, 0x1f, 0xe, 0xf8, 0xfa,
+                                                             0xf7, 0x7, 0x1, 0xf7, 0x7f, 0xf8, 0xfa, 0x15,
+                                                             0xf7, 0x10, 0x6, 0xa5, 0xf7, 0x7, 0x5, 0xfb,
+                                                             0x10, 0x6, 0xe, 0xf7, 0x5c, 0xf9, 0x36, 0x15,
+                                                             0x51, 0xbd, 0x5b, 0xc8, 0xc5, 0xbe, 0xb9, 0xc7,
+                                                             0xc7, 0x59, 0xb5, 0x50, 0x4c, 0x5b, 0x60, 0x50,
+                                                             0x1e, 0xc7, 0x16, 0xa5, 0xa1, 0x9d, 0xa8, 0xa5,
+                                                             0xa2, 0x7a, 0x70, 0x70, 0x74, 0x76, 0x71, 0x6f,
+                                                             0x74, 0xa0, 0xa6, 0x1e, 0xe, 0x72, 0xa, 0xf7,
+                                                             0x1d, 0xf8, 0xf0, 0x15, 0xf3, 0x52, 0xa, 0xf7,
+                                                             0x6, 0xfb, 0x26, 0x15, 0xf3, 0x52, 0xa, 0xe,
+                                                             0xfb, 0x78, 0xd9, 0xf7, 0x2a, 0x77, 0x1, 0xb4,
+                                                             0xdc, 0x3, 0xd6, 0x16, 0x83, 0x7a, 0x71, 0x4f,
+                                                             0x54, 0x1a, 0x46, 0xb1, 0x70, 0xc3, 0xaf, 0xbe,
+                                                             0x9b, 0x9b, 0xa6, 0x1e, 0x9a, 0xcd, 0x5, 0x89,
+                                                             0x86, 0x55, 0x79, 0x6a, 0x1b, 0x76, 0x6e, 0x95,
+                                                             0xb2, 0x9b, 0x8f, 0xaa, 0xa2, 0xc1, 0x1f, 0xe,
+                                                             0x72, 0xa, 0xf7, 0x68, 0xf8, 0xf0, 0x8e, 0xa,
+                                                             0xf7, 0x2c, 0xf7, 0x26, 0x7a, 0xa, 0x32, 0x34,
+                                                             0x63, 0xe2, 0x5, 0x25, 0x6, 0xe, 0x48, 0xa,
+                                                             0x1, 0xd0, 0x16, 0xf7, 0x23, 0x6, 0xf7, 0x2,
+                                                             0xf8, 0xa8, 0x47, 0xa, 0xe, 0xfc, 0x68, 0x8d,
+                                                             0x76, 0xf9, 0x6d, 0x77, 0x1, 0x29, 0x78, 0x15,
+                                                             0xf8, 0xdd, 0xf9, 0x6d, 0x5, 0x3f, 0x6, 0xfc,
+                                                             0xdd, 0xfd, 0x6d, 0x5, 0xe, 0x84, 0xa, 0xf9,
+                                                             0x6b, 0x77, 0x1, 0xe2, 0x16, 0xf7, 0x21, 0x6,
+                                                             0xe3, 0xf8, 0x33, 0x5, 0xef, 0x6, 0xa1, 0xf1,
+                                                             0x5, 0x27, 0x6, 0xda, 0x9a, 0x9d, 0xa4, 0xb2,
+                                                             0x1b, 0x99, 0x9d, 0x87, 0x7d, 0xb1, 0x1f, 0xa6,
+                                                             0xf0, 0x5, 0x9c, 0x55, 0x59, 0x91, 0x6b, 0x1b,
+                                                             0xfb, 0x17, 0x81, 0x28, 0xfb, 0x3, 0x6a, 0x1f,
+                                                             0x3b, 0x6, 0x76, 0x25, 0x5, 0xda, 0x6, 0xf7,
+                                                             0x79, 0xfc, 0x33, 0x15, 0x9b, 0xa, 0xf7, 0x1,
+                                                             0xf8, 0x99, 0x3d, 0xa, 0x9a, 0xd2, 0x15, 0xf7,
+                                                             0x21, 0x6, 0xa5, 0xf7, 0x13, 0x65, 0xa, 0x84,
+                                                             0xa, 0xf8, 0x33, 0xf1, 0xf7, 0x66, 0x77, 0x1,
+                                                             0xf8, 0x28, 0x16, 0xf7, 0x20, 0x6, 0xf7, 0x2b,
+                                                             0xf9, 0x5f, 0x3d, 0xa, 0xfc, 0x67, 0xfd, 0x5f,
+                                                             0x15, 0x9b, 0xa, 0xe2, 0xf8, 0x33, 0x5, 0xef,
+                                                             0x6, 0xa0, 0xf1, 0x5, 0x27, 0x6, 0xda, 0x9c,
+                                                             0x9a, 0xa4, 0xb2, 0x1b, 0x99, 0x9f, 0x86, 0x7e,
+                                                             0xb0, 0x1f, 0xa6, 0xf0, 0x5, 0x9c, 0x55, 0x5a,
+                                                             0x91, 0x6a, 0x1b, 0xfb, 0x15, 0x80, 0x28, 0xfb,
+                                                             0x3, 0x6a, 0x1f, 0x3c, 0x6, 0x75, 0x25, 0x5,
+                                                             0xda, 0x6, 0xe, 0x87, 0xa, 0xcf, 0x16, 0xf8,
+                                                             0x9a, 0x50, 0xa, 0xfc, 0x4, 0x6, 0xbe, 0xf7,
+                                                             0x84, 0xf7, 0x4c, 0xee, 0xa3, 0xf7, 0x7, 0xfb,
+                                                             0x4c, 0x28, 0xbd, 0xf7, 0x86, 0x94, 0xa, 0x44,
+                                                             0xfb, 0xe0, 0x30, 0x59, 0x73, 0xfb, 0x8, 0xe6,
+                                                             0xbd, 0x5, 0xe, 0xfb, 0xf9, 0x37, 0xa, 0xdc,
+                                                             0x16, 0xf7, 0x20, 0x6, 0xd6, 0xf8, 0x0, 0xe7,
+                                                             0xcc, 0x9e, 0xe9, 0x2e, 0x4a, 0xc2, 0xf7, 0x98,
+                                                             0x5, 0xfb, 0x20, 0x6, 0x44, 0xfb, 0xe8, 0x29,
+                                                             0x48, 0x77, 0x2d, 0xef, 0xcd, 0x5, 0xe, 0x73,
+                                                             0x8b, 0xf7, 0xd, 0xf8, 0x7f, 0xf7, 0x10, 0xbe,
+                                                             0x95, 0xa, 0xa4, 0x16, 0xf8, 0xcb, 0x40, 0xa,
+                                                             0x8c, 0x8a, 0x2c, 0x8b, 0x2b, 0x1b, 0x52, 0x4c,
+                                                             0x8b, 0x8a, 0x44, 0x1f, 0xf8, 0x3e, 0xf8, 0x88,
+                                                             0xa0, 0xf7, 0x8, 0x5, 0xfc, 0xa2, 0x6, 0x71,
+                                                             0xfb, 0x10, 0x5, 0xf7, 0xe8, 0x6, 0xfc, 0x37,
+                                                             0xfc, 0x84, 0x5, 0xf7, 0xc7, 0xf9, 0x33, 0x15,
+                                                             0xf7, 0x19, 0x6, 0xf7, 0x28, 0x67, 0xa, 0xfb,
+                                                             0xa, 0x6, 0x34, 0x31, 0x65, 0xe5, 0x5, 0x27,
+                                                             0x6, 0xe, 0xfb, 0x1b, 0x8b, 0xf7, 0x9, 0xf7,
+                                                             0xc0, 0xf7, 0x5, 0xd0, 0x95, 0xa, 0x9f, 0x16,
+                                                             0xf8, 0x69, 0x6, 0xa5, 0xf7, 0x9, 0x5, 0xfb,
+                                                             0xa8, 0x6, 0xf7, 0xd1, 0xf7, 0xdb, 0x9e, 0xe1,
+                                                             0x5, 0xfc, 0x56, 0x6, 0x72, 0xfb, 0x5, 0x5,
+                                                             0xf7, 0x94, 0x6, 0xfb, 0xce, 0xfb, 0xd3, 0x5,
+                                                             0xf7, 0x83, 0xf8, 0x89, 0x15, 0xf7, 0x25, 0x6,
+                                                             0xf7, 0x34, 0x67, 0xa, 0xfb, 0x14, 0x6, 0x2d,
+                                                             0x31, 0x61, 0xe5, 0x5, 0x20, 0x6, 0xe, 0x8b,
+                                                             0xf7, 0x1b, 0xf8, 0xdb, 0x77, 0x1, 0xe9, 0xf7,
+                                                             0xc3, 0x3, 0xe9, 0x16, 0x7c, 0xa, 0xa8, 0xf7,
+                                                             0x1b, 0x47, 0xa, 0xb1, 0xbb, 0x15, 0xdb, 0x6,
+                                                             0xf7, 0x8, 0xf7, 0xf5, 0xb2, 0xf7, 0x4a, 0x5,
+                                                             0xfb, 0x2d, 0x6, 0x67, 0xfb, 0x4a, 0x5, 0xe,
+                                                             0xfb, 0x35, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77,
+                                                             0x1, 0xf7, 0x55, 0xf7, 0x25, 0xb9, 0xf7, 0x25,
+                                                             0x3, 0xf8, 0x14, 0xf8, 0x53, 0x15, 0xdd, 0x6,
+                                                             0xb5, 0xf7, 0x22, 0xa0, 0xf7, 0x15, 0x7a, 0xa,
+                                                             0x78, 0xfb, 0x15, 0x5, 0xfb, 0x57, 0xfb, 0x22,
+                                                             0x15, 0xdd, 0x6, 0xb7, 0xf7, 0x22, 0x9e, 0xf7,
+                                                             0x15, 0x5, 0xfb, 0xd, 0x6, 0x77, 0xfb, 0x15,
+                                                             0x5, 0xe, 0x3c, 0xa0, 0x76, 0xf8, 0x35, 0xf2,
+                                                             0xf7, 0x46, 0x77, 0x1, 0xe6, 0x16, 0xf7, 0xb,
+                                                             0x6, 0xb5, 0xf7, 0x47, 0x5, 0xf7, 0xb, 0x6,
+                                                             0x61, 0xfb, 0x47, 0x5, 0xf7, 0xb, 0x6, 0xb5,
+                                                             0xf7, 0x47, 0x5, 0xf7, 0x2e, 0xf1, 0xfb, 0x16,
+                                                             0x6, 0xab, 0xf7, 0x1c, 0x5, 0xed, 0xf2, 0x41,
+                                                             0x6, 0xb5, 0xf7, 0x46, 0x5, 0xfb, 0xf, 0x6,
+                                                             0x62, 0xfb, 0x46, 0x5, 0xfb, 0x9, 0x6, 0xb5,
+                                                             0xf7, 0x46, 0x5, 0xfb, 0xb, 0x6, 0x60, 0xfb,
+                                                             0x46, 0x5, 0xfb, 0x2b, 0x24, 0xf7, 0x13, 0x6,
+                                                             0x6c, 0xfb, 0x1c, 0x5, 0x2b, 0x25, 0xd3, 0x6,
+                                                             0xf7, 0x24, 0xf1, 0x15, 0xaa, 0xf7, 0x1c, 0x5,
+                                                             0xf7, 0xa, 0x6, 0x6b, 0xfb, 0x1c, 0x5, 0xe,
+                                                             0x3c, 0x2d, 0x76, 0xe3, 0xf7, 0x3, 0xf9, 0x47,
+                                                             0x77, 0x1, 0xf7, 0x2e, 0xf7, 0xe, 0xf7, 0x46,
+                                                             0xf7, 0xc, 0x3, 0xce, 0xf7, 0x5b, 0x15, 0x93,
+                                                             0xfb, 0x7, 0xcf, 0x3c, 0xec, 0x73, 0x76, 0x2b,
+                                                             0x18, 0xd4, 0x6, 0x9e, 0xe3, 0x5, 0xf7, 0x41,
+                                                             0xe5, 0xf4, 0xf7, 0x5, 0xf7, 0x26, 0xfb, 0x12,
+                                                             0xc9, 0x5f, 0x9c, 0x1f, 0xb6, 0xf7, 0x5b, 0x97,
+                                                             0x85, 0xa7, 0x7b, 0x94, 0x53, 0x19, 0xf7, 0x12,
+                                                             0x93, 0x80, 0xf7, 0x6, 0x42, 0xba, 0x47, 0x9d,
+                                                             0x19, 0x95, 0xbe, 0x5, 0x44, 0x6, 0x81, 0x61,
+                                                             0x5, 0xfb, 0xb, 0xfb, 0x12, 0x4e, 0xfb, 0x1d,
+                                                             0x5b, 0x9f, 0xfb, 0x5, 0xf7, 0x1d, 0x50, 0x1f,
+                                                             0x5c, 0xfb, 0x71, 0x50, 0xa5, 0x84, 0xcd, 0x89,
+                                                             0xa0, 0x19, 0xf7, 0x22, 0xf7, 0x82, 0x15, 0x66,
+                                                             0xa0, 0x72, 0xa7, 0xb4, 0x1a, 0xba, 0xb2, 0xb9,
+                                                             0xc8, 0x89, 0x1e, 0x61, 0xfc, 0xb2, 0x15, 0xb5,
+                                                             0xf7, 0x5c, 0x5, 0xb4, 0x77, 0xb0, 0x76, 0x57,
+                                                             0x1a, 0x63, 0x70, 0x4f, 0x2e, 0x84, 0x1e, 0xe,
+                                                             0xf7, 0x92, 0x7a, 0xdb, 0x4e, 0x76, 0xf7, 0xaf,
+                                                             0xdc, 0x8f, 0xdb, 0xf7, 0x5d, 0xdb, 0x8a, 0x77,
+                                                             0x12, 0xf7, 0xfa, 0xf0, 0xf7, 0xe9, 0xf0, 0x13,
+                                                             0x7b, 0xf7, 0x81, 0xf8, 0x6e, 0x15, 0x90, 0x99,
+                                                             0xf7, 0x2b, 0xce, 0x9d, 0xa1, 0x82, 0x68, 0x76,
+                                                             0x7e, 0xfb, 0x1c, 0x47, 0x63, 0x8b, 0xaa, 0x99,
+                                                             0x1e, 0x47, 0xfc, 0x81, 0x15, 0xf7, 0x2, 0x6,
+                                                             0x13, 0x77, 0xf8, 0xe2, 0xf9, 0x6c, 0x5, 0xfb,
+                                                             0x3, 0x6, 0xfd, 0x2, 0xfb, 0x75, 0x15, 0x4b,
+                                                             0xb0, 0x44, 0xeb, 0xf7, 0x30, 0xad, 0xf7, 0x2f,
+                                                             0xcb, 0x1e, 0x13, 0xbb, 0xc4, 0x71, 0xe0, 0xfb,
+                                                             0x1, 0xfb, 0x1f, 0x5a, 0xfb, 0x1a, 0x2f, 0x1e,
+                                                             0xf8, 0x4e, 0xfc, 0x1, 0x15, 0x4a, 0xb0, 0x44,
+                                                             0xeb, 0xf7, 0x2f, 0xae, 0xf7, 0x30, 0xcb, 0xc4,
+                                                             0x70, 0xe0, 0x20, 0xfb, 0x20, 0x5a, 0xfb, 0x1b,
+                                                             0x30, 0x1e, 0xf0, 0x81, 0x15, 0x91, 0x98, 0xf7,
+                                                             0x29, 0xd0, 0x9b, 0xa2, 0x83, 0x68, 0x76, 0x7d,
+                                                             0xfb, 0x1d, 0x48, 0x63, 0x8b, 0xab, 0x99, 0x1e,
+                                                             0xe, 0xe2, 0x7d, 0xf7, 0x5, 0x2a, 0x76, 0xf9,
+                                                             0x19, 0xe5, 0x12, 0xe4, 0xf7, 0x23, 0x9a, 0xf7,
+                                                             0x19, 0x13, 0x98, 0xf7, 0xac, 0xf8, 0x3b, 0x15,
+                                                             0x4b, 0x6b, 0xfb, 0x13, 0x4e, 0xfb, 0x1f, 0x1a,
+                                                             0x32, 0xcd, 0xfb, 0x8, 0xf7, 0x49, 0xec, 0xd4,
+                                                             0xad, 0xa9, 0xb2, 0x1e, 0x13, 0x58, 0x9f, 0x77,
+                                                             0xb4, 0x69, 0xa6, 0x7c, 0xe7, 0xe6, 0x18, 0x8a,
+                                                             0x8c, 0x86, 0x8f, 0x8c, 0x1a, 0x6d, 0xa2, 0x7d,
+                                                             0x98, 0x72, 0xa2, 0xa7, 0xa5, 0xae, 0xbb, 0x9e,
+                                                             0xae, 0x23, 0xc6, 0x18, 0x68, 0x56, 0x7b, 0x7c,
+                                                             0x81, 0x81, 0x76, 0xa1, 0x58, 0xd1, 0x62, 0xcf,
+                                                             0x8, 0x13, 0x8, 0xf7, 0x2f, 0xd6, 0x9c, 0xe3,
+                                                             0xab, 0x1a, 0x13, 0x28, 0xc7, 0x56, 0xd7, 0xfb,
+                                                             0xc, 0x23, 0x25, 0x54, 0xfb, 0x9, 0x5e, 0x99,
+                                                             0x62, 0x9e, 0x66, 0x1e, 0xbf, 0x2a, 0x15, 0xac,
+                                                             0x52, 0xbf, 0x40, 0xbb, 0x53, 0x8, 0x13, 0x98,
+                                                             0x7c, 0x73, 0x63, 0x73, 0x4f, 0x1b, 0x3e, 0x6b,
+                                                             0xb7, 0xbb, 0xd9, 0xd5, 0xb7, 0xa5, 0x98, 0x1f,
+                                                             0xd1, 0xf7, 0x2f, 0x15, 0x84, 0x98, 0x7c, 0x9f,
+                                                             0xab, 0x1a, 0x13, 0x0, 0xb6, 0xaa, 0xb2, 0xb2,
+                                                             0xac, 0x9f, 0x77, 0x71, 0x5f, 0x50, 0x66, 0x61,
+                                                             0x77, 0x1e, 0xe, 0xfc, 0x21, 0xf8, 0x68, 0x76,
+                                                             0xf7, 0xa3, 0x77, 0x1, 0xf7, 0x39, 0xf8, 0x53,
+                                                             0x15, 0xe4, 0x6, 0xb7, 0xf7, 0x22, 0xa2, 0xf7,
+                                                             0x15, 0x66, 0xa, 0x77, 0xfb, 0x15, 0x5, 0xe,
+                                                             0xfb, 0x4f, 0x76, 0xfa, 0x42, 0x77, 0x1, 0xd7,
+                                                             0xf7, 0x19, 0x3, 0xf7, 0x33, 0xfb, 0x64, 0x15,
+                                                             0xf1, 0x6, 0x8c, 0x89, 0x92, 0x8a, 0x8d, 0x1e,
+                                                             0x6d, 0xed, 0x78, 0xf7, 0x2c, 0xf4, 0x1a, 0xf7,
+                                                             0x9a, 0xf7, 0x2a, 0xf7, 0x76, 0xf7, 0x3, 0xe4,
+                                                             0x1e, 0xfb, 0x5, 0x6, 0x32, 0x2d, 0xfb, 0x54,
+                                                             0xfb, 0x62, 0xfb, 0xa9, 0x1a, 0x50, 0x94, 0xfb,
+                                                             0x22, 0xd5, 0xfb, 0x38, 0x1e, 0xe, 0xfb, 0x4f,
+                                                             0x76, 0xfa, 0x42, 0x77, 0x1, 0xf7, 0x80, 0xf7,
+                                                             0x19, 0x3, 0x72, 0xfb, 0x64, 0x15, 0xf7, 0x5,
+                                                             0x6, 0xe4, 0xe9, 0xf7, 0x54, 0xf7, 0x62, 0xf7,
+                                                             0xa9, 0x1a, 0xc6, 0x82, 0xf7, 0x22, 0x41, 0xf7,
+                                                             0x38, 0x1e, 0x25, 0x6, 0xab, 0x26, 0x9f, 0xfb,
+                                                             0x2d, 0xfb, 0x1, 0x1a, 0xfb, 0xd1, 0xfb, 0x5e,
+                                                             0xfb, 0x6e, 0x50, 0x5f, 0x1e, 0xe, 0xfb, 0x8a,
+                                                             0xf8, 0x2c, 0x76, 0xf7, 0xdf, 0x77, 0x1, 0xf7,
+                                                             0x8c, 0xf8, 0x17, 0x15, 0xcc, 0xf7, 0x2, 0xca,
+                                                             0xfb, 0x2, 0xd0, 0xc1, 0x39, 0xe8, 0xf7, 0xa,
+                                                             0xa4, 0x71, 0xe0, 0xfb, 0x6, 0x57, 0x97, 0xf7,
+                                                             0x12, 0x5, 0x37, 0x6, 0x98, 0xfb, 0x12, 0xfb,
+                                                             0x0, 0xc2, 0x6f, 0x36, 0xf7, 0xa, 0x6f, 0x32,
+                                                             0x2d, 0x5, 0xe, 0x58, 0xf7, 0x52, 0xf7, 0x14,
+                                                             0x1, 0xf7, 0xab, 0xf7, 0x19, 0x3, 0xdd, 0xf7,
+                                                             0x52, 0x15, 0xf7, 0x59, 0xfb, 0x52, 0xf7, 0x19,
+                                                             0xf7, 0x52, 0xf7, 0x5a, 0xf7, 0x14, 0xfb, 0x5a,
+                                                             0xf7, 0x50, 0xfb, 0x19, 0xfb, 0x50, 0xfb, 0x59,
+                                                             0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x27, 0x76, 0xf7,
+                                                             0xce, 0x77, 0x1, 0xc9, 0x8d, 0x15, 0xd0, 0x6,
+                                                             0x7d, 0x4a, 0x70, 0x74, 0x5b, 0x80, 0x7d, 0x44,
+                                                             0x18, 0xf7, 0x2d, 0x8e, 0xa4, 0xf7, 0x16, 0x98,
+                                                             0xca, 0xa5, 0xf7, 0xa, 0x18, 0xfb, 0x2d, 0x6,
+                                                             0xe, 0xf7, 0x6b, 0xf7, 0x16, 0x1, 0xd4, 0xf7,
+                                                             0x6b, 0x15, 0xf7, 0xa9, 0x6, 0xa8, 0xf7, 0x16,
+                                                             0x5, 0xfb, 0xa9, 0x6, 0xe, 0xfb, 0xf9, 0x8b,
+                                                             0xf7, 0x26, 0x1, 0xcb, 0x16, 0xf7, 0x2b, 0x6,
+                                                             0xa9, 0xf7, 0x26, 0x5, 0x97, 0xa, 0xe, 0xfb,
+                                                             0xf9, 0x78, 0xa, 0x76, 0xf8, 0x8d, 0x3, 0x66,
+                                                             0x78, 0x15, 0xef, 0x6, 0xf8, 0x29, 0xf9, 0x88,
+                                                             0x5, 0x25, 0x6, 0xe, 0x3c, 0x78, 0xf7, 0x4,
+                                                             0xf8, 0x8d, 0xf7, 0x4, 0x1, 0xe1, 0xf7, 0xf,
+                                                             0xf7, 0xb0, 0xf7, 0x10, 0x3, 0xe1, 0xf7, 0x63,
+                                                             0x15, 0xfb, 0x3b, 0xea, 0x50, 0xf7, 0x6, 0xf7,
+                                                             0x81, 0xe0, 0xf7, 0xe6, 0xf7, 0x30, 0xf7, 0x3e,
+                                                             0x2d, 0xcc, 0xfb, 0x5, 0xfb, 0x7a, 0x2d, 0xfb,
+                                                             0xe3, 0xfb, 0x3c, 0x1e, 0xf7, 0xf, 0x16, 0xb6,
+                                                             0xc6, 0xf7, 0xf0, 0xf7, 0x1b, 0xc5, 0xab, 0x3c,
+                                                             0x5f, 0x44, 0x52, 0xfb, 0xcb, 0xfb, 0x1b, 0x45,
+                                                             0x75, 0xe6, 0xa2, 0x1e, 0xe, 0x3c, 0xa0, 0x76,
+                                                             0xf9, 0x5a, 0x77, 0x1, 0xf7, 0x41, 0xf7, 0xf8,
+                                                             0x3, 0xf7, 0x9c, 0x16, 0xf7, 0x14, 0x6, 0xf7,
+                                                             0x1d, 0xf9, 0x5a, 0x5, 0x3e, 0x6, 0x39, 0x2c,
+                                                             0xfb, 0x1, 0x56, 0x4b, 0x6c, 0x73, 0xfb, 0x10,
+                                                             0x18, 0xb3, 0x95, 0xdb, 0xa7, 0xcd, 0xba, 0x8,
+                                                             0xe, 0x3c, 0x8b, 0xf7, 0x12, 0xf8, 0x6f, 0xf7,
+                                                             0x1, 0x1, 0xf8, 0x54, 0xf7, 0x20, 0x3, 0xa4,
+                                                             0x16, 0xf8, 0x74, 0x6, 0xa9, 0xf7, 0x12, 0x5,
+                                                             0xfb, 0xa6, 0x6, 0xb0, 0xb5, 0x9b, 0x99, 0xf7,
+                                                             0x10, 0xf2, 0x8, 0xf7, 0x0, 0xe4, 0xb5, 0xd1,
+                                                             0xd7, 0x1a, 0xdf, 0x4f, 0xf5, 0xfb, 0x45, 0xfb,
+                                                             0x15, 0x28, 0x45, 0xfb, 0x19, 0x73, 0x1e, 0xf7,
+                                                             0x21, 0x77, 0x5, 0xbf, 0x96, 0xae, 0xc9, 0xd1,
+                                                             0x1b, 0xc3, 0xaf, 0x61, 0x65, 0x38, 0xfb, 0x14,
+                                                             0x35, 0x40, 0x48, 0x1f, 0xfb, 0x2, 0x2f, 0x2d,
+                                                             0x3f, 0x7b, 0xfb, 0x9, 0x8, 0xe, 0x3c, 0x78,
+                                                             0xf7, 0x6, 0xf7, 0x63, 0xf7, 0x9, 0xf7, 0x46,
+                                                             0xf7, 0x5, 0x1, 0xf8, 0x60, 0xf7, 0x28, 0x3,
+                                                             0xcc, 0xf7, 0x47, 0x15, 0xfb, 0x2b, 0xa0, 0xf7,
+                                                             0x4, 0x5c, 0xf2, 0x1b, 0xf7, 0x3b, 0xf3, 0xf7,
+                                                             0xb, 0xf7, 0x1, 0xc9, 0x68, 0xc5, 0x50, 0xa8,
+                                                             0x1f, 0xcc, 0xa1, 0xcc, 0xc3, 0xe3, 0x1a, 0xe0,
+                                                             0x45, 0xf0, 0xfb, 0x2f, 0xfb, 0x4c, 0x65, 0xfb,
+                                                             0x25, 0x64, 0x7e, 0x1e, 0xf7, 0x1d, 0x71, 0x5,
+                                                             0xc1, 0x9a, 0xa7, 0xb6, 0xc2, 0x1b, 0xaa, 0xb9,
+                                                             0x7c, 0x51, 0x49, 0x4f, 0x64, 0x3d, 0x1f, 0x71,
+                                                             0xfb, 0x9, 0x5, 0xd0, 0xc2, 0x72, 0x47, 0x4e,
+                                                             0x5e, 0x56, 0x42, 0x4b, 0x77, 0xb5, 0xc5, 0x81,
+                                                             0x1f, 0xe, 0x3c, 0xa0, 0x76, 0xf7, 0x25, 0xf7,
+                                                             0xa, 0xf8, 0x38, 0x77, 0x1, 0xc7, 0xf8, 0xae,
+                                                             0x3, 0xc7, 0xf7, 0x25, 0x15, 0xf7, 0xb1, 0x6,
+                                                             0x6b, 0xfb, 0x25, 0x5, 0xf7, 0x1a, 0x6, 0xaa,
+                                                             0xf7, 0x25, 0x5, 0xe3, 0x6, 0xa4, 0xf7, 0xa,
+                                                             0x5, 0x33, 0x6, 0xea, 0xf8, 0x53, 0x7a, 0xa,
+                                                             0xfc, 0x1b, 0xfc, 0x55, 0x5, 0xf7, 0x22, 0x8d,
+                                                             0x15, 0xf7, 0x50, 0xf7, 0x72, 0x8d, 0x89, 0x5c,
+                                                             0xfb, 0x70, 0x5, 0xe, 0x20, 0x78, 0xf7, 0x7,
+                                                             0xf7, 0xab, 0xf2, 0xf7, 0x2, 0xf7, 0x14, 0x1,
+                                                             0xc8, 0xf7, 0x24, 0xf7, 0x73, 0xf7, 0x27, 0x3,
+                                                             0xc8, 0xf7, 0x5a, 0x15, 0xfb, 0x22, 0x8d, 0xf1,
+                                                             0x40, 0xf7, 0x9, 0x1b, 0xf7, 0x44, 0xf7, 0x9,
+                                                             0xf7, 0x27, 0xf7, 0x28, 0xf7, 0x9, 0x3d, 0xe0,
+                                                             0xfb, 0xd, 0x60, 0x73, 0x81, 0x83, 0x78, 0x1f,
+                                                             0xae, 0xf7, 0x2, 0x5, 0xf7, 0x8f, 0x6, 0xa7,
+                                                             0xf7, 0x14, 0x5, 0xfc, 0x11, 0x6, 0xfb, 0x6,
+                                                             0xfc, 0x1, 0xf7, 0xe, 0x82, 0x5, 0xbe, 0xbc,
+                                                             0xbd, 0x8b, 0x94, 0x1b, 0xb7, 0xb8, 0x73, 0x3f,
+                                                             0xfb, 0x9, 0x42, 0x4d, 0x49, 0x4a, 0x75, 0xbc,
+                                                             0xcc, 0x8e, 0x1f, 0xe, 0x3c, 0x78, 0xf7, 0x4,
+                                                             0xf7, 0xb0, 0xe7, 0xf7, 0x15, 0xf7, 0x4, 0x1,
+                                                             0xe0, 0xf7, 0x26, 0xf7, 0x5e, 0xf7, 0x27, 0x3,
+                                                             0xf7, 0xa3, 0xf8, 0x4c, 0x15, 0xb7, 0x98, 0xaf,
+                                                             0xf7, 0x6, 0xe3, 0x1b, 0xc9, 0x90, 0x59, 0x72,
+                                                             0x8d, 0x1f, 0xf7, 0x22, 0x94, 0x5, 0xf7, 0xd,
+                                                             0x7c, 0x45, 0xc4, 0xfb, 0x7, 0x1b, 0xfb, 0x6b,
+                                                             0xfb, 0xb, 0xfb, 0x8f, 0xfb, 0x81, 0xfb, 0x10,
+                                                             0xd7, 0xfb, 0x9, 0xf7, 0x2a, 0xf7, 0x43, 0xe9,
+                                                             0xf7, 0x2a, 0xf7, 0x14, 0xf7, 0x11, 0x3a, 0xe0,
+                                                             0xfb, 0x10, 0x64, 0x6a, 0x82, 0x77, 0x6b, 0x1f,
+                                                             0x63, 0xfb, 0x6e, 0x15, 0xe3, 0xb8, 0xce, 0xd7,
+                                                             0xb0, 0xb7, 0x6d, 0x33, 0xfb, 0x0, 0x54, 0x51,
+                                                             0x4c, 0x47, 0x7b, 0xde, 0xb9, 0x1e, 0xe, 0x3c,
+                                                             0xa0, 0x76, 0xf8, 0xdd, 0xf7, 0x11, 0x1, 0xf7,
+                                                             0x27, 0x16, 0xf7, 0x27, 0x6, 0xa7, 0xf7, 0x1c,
+                                                             0xf7, 0x2d, 0xf7, 0xe7, 0xf7, 0x47, 0xf7, 0x13,
+                                                             0xa1, 0xeb, 0x18, 0xfc, 0x9c, 0x6, 0x6c, 0xfb,
+                                                             0x11, 0x5, 0xf7, 0xe7, 0x6, 0xfb, 0x8e, 0xfb,
+                                                             0x9c, 0x4b, 0xfb, 0xb3, 0x88, 0x75, 0x8, 0xe,
+                                                             0x3c, 0x78, 0xf6, 0xf7, 0x80, 0xf6, 0xf7, 0x38,
+                                                             0xf6, 0x1, 0xd0, 0xf7, 0x2d, 0xf7, 0x65, 0xf7,
+                                                             0x29, 0x3, 0xf7, 0x7c, 0xf8, 0x16, 0x15, 0xfb,
+                                                             0x21, 0x5f, 0x75, 0xfb, 0xd, 0x5d, 0x1a, 0x22,
+                                                             0xdc, 0x32, 0xf7, 0x28, 0xf7, 0x48, 0xf1, 0xf7,
+                                                             0x13, 0xf7, 0x6, 0xee, 0x47, 0xb1, 0x6f, 0x9b,
+                                                             0x1e, 0xac, 0x98, 0xee, 0xa9, 0xf7, 0x0, 0x1a,
+                                                             0xf0, 0x37, 0xde, 0xfb, 0x1e, 0xfb, 0x3e, 0x41,
+                                                             0xfb, 0xd, 0x38, 0x3b, 0xc6, 0x71, 0xa2, 0x7d,
+                                                             0x1e, 0x81, 0xfb, 0x67, 0x15, 0xcf, 0xb3, 0xdc,
+                                                             0xdd, 0xbe, 0xaf, 0x55, 0x5b, 0x60, 0x72, 0x30,
+                                                             0x29, 0x62, 0x5e, 0xa4, 0xc9, 0x1e, 0xcf, 0xf7,
+                                                             0xdf, 0x15, 0xc4, 0xbd, 0xb3, 0xbf, 0xc1, 0xa7,
+                                                             0x65, 0x64, 0x59, 0x5b, 0x5e, 0x53, 0x5b, 0x6b,
+                                                             0xab, 0xb6, 0x1e, 0xe, 0x3c, 0x78, 0xf7, 0x4,
+                                                             0xfb, 0x4, 0xf7, 0x4a, 0xc6, 0xe7, 0xf7, 0xb0,
+                                                             0xf7, 0x4, 0x1, 0xf7, 0x9, 0xf7, 0x28, 0xf7,
+                                                             0x5e, 0xf7, 0x28, 0x3, 0xd9, 0xf7, 0x33, 0x15,
+                                                             0xfb, 0xd, 0x9a, 0xd2, 0x52, 0xf7, 0x7, 0x1b,
+                                                             0xf7, 0x6c, 0xf7, 0xc, 0xf7, 0x90, 0xf7, 0x81,
+                                                             0xf7, 0x10, 0x3f, 0xf7, 0x8, 0xfb, 0x2b, 0xfb,
+                                                             0x44, 0x2c, 0xfb, 0x2f, 0xfb, 0x14, 0xfb, 0x11,
+                                                             0xdd, 0x3b, 0xf7, 0x11, 0xb2, 0xab, 0x94, 0x9f,
+                                                             0xac, 0x1f, 0x5f, 0x7e, 0x67, 0xfb, 0x6, 0x32,
+                                                             0x1b, 0x4d, 0x86, 0xbd, 0xa4, 0x88, 0x1f, 0xb8,
+                                                             0xf7, 0x97, 0x15, 0xf7, 0x0, 0xc2, 0xca, 0xca,
+                                                             0xd0, 0x9a, 0x3a, 0x5d, 0x33, 0x5f, 0x46, 0x3e,
+                                                             0x67, 0x5e, 0xa4, 0xe3, 0x1e, 0xe, 0x8b, 0xf7,
+                                                             0x17, 0xf7, 0x8f, 0xf7, 0x16, 0x1, 0xf7, 0x44,
+                                                             0xf8, 0x12, 0x15, 0xf7, 0x26, 0x6, 0xa8, 0xf7,
+                                                             0x16, 0x93, 0xa, 0xfb, 0x5, 0xfc, 0x94, 0x15,
+                                                             0xf7, 0x26, 0x6, 0xa8, 0xf7, 0x17, 0x93, 0xa,
+                                                             0xe, 0xfb, 0x27, 0x76, 0xf7, 0x47, 0x76, 0xf8,
+                                                             0x19, 0xf7, 0x19, 0x1, 0xc3, 0xf7, 0xbb, 0x3,
+                                                             0xe5, 0x81, 0x15, 0xcf, 0x6, 0x7d, 0x4f, 0x70,
+                                                             0x75, 0x5c, 0x81, 0x7d, 0x49, 0x18, 0xf7, 0x2a,
+                                                             0x8e, 0xa5, 0xf7, 0xd, 0x97, 0xc5, 0xa5, 0xf7,
+                                                             0x2, 0x18, 0x97, 0xa, 0xc2, 0xf7, 0x93, 0x15,
+                                                             0xf7, 0x27, 0x6, 0xa9, 0xf7, 0x19, 0x7b, 0xa,
+                                                             0xe, 0x58, 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1,
+                                                             0xdd, 0xf7, 0x58, 0x15, 0xf8, 0x8b, 0xfb, 0x60,
+                                                             0x5, 0xf7, 0x17, 0x7, 0xfb, 0xdd, 0xf7, 0x17,
+                                                             0xf7, 0xdd, 0xf7, 0x13, 0x5, 0xf7, 0x19, 0x7,
+                                                             0xfc, 0x8b, 0xfb, 0x60, 0x5, 0xe, 0x58, 0xe2,
+                                                             0xf7, 0xb, 0xe9, 0xf7, 0xb, 0x1, 0xc5, 0xf8,
+                                                             0xd3, 0x3, 0xc5, 0xe2, 0x15, 0xf8, 0xd3, 0xf7,
+                                                             0xb, 0xfc, 0xd3, 0x6, 0xe9, 0x4, 0xf8, 0xd3,
+                                                             0xf7, 0xb, 0xfc, 0xd3, 0x6, 0xe, 0x58, 0x98,
+                                                             0x76, 0xf8, 0x9e, 0x77, 0x1, 0xf5, 0x83, 0x15,
+                                                             0xf8, 0x8b, 0xf7, 0x60, 0x5, 0xf7, 0x6, 0x7,
+                                                             0xfc, 0x8b, 0xf7, 0x60, 0x98, 0xa, 0x7, 0xf7,
+                                                             0xdc, 0xfb, 0x17, 0xfb, 0xdc, 0xfb, 0x13, 0x5,
+                                                             0xe, 0x73, 0x8b, 0xf7, 0x1b, 0xf8, 0x7d, 0xf2,
+                                                             0x1, 0xf7, 0x98, 0xf7, 0x47, 0x15, 0xf7, 0x15,
+                                                             0x6, 0x96, 0xca, 0x9f, 0x9b, 0xdd, 0xce, 0x8,
+                                                             0xf7, 0xa, 0xea, 0xbe, 0xbc, 0xda, 0x1a, 0xdf,
+                                                             0x45, 0xea, 0xfb, 0x35, 0xfb, 0x50, 0x46, 0xfb,
+                                                             0x1b, 0x45, 0x79, 0x1e, 0xf7, 0x17, 0x74, 0x5,
+                                                             0xf7, 0x9, 0xa6, 0xd3, 0x93, 0xb6, 0x1b, 0xd8,
+                                                             0xa1, 0x5f, 0x6b, 0x66, 0x75, 0x79, 0x35, 0x42,
+                                                             0x1f, 0xfb, 0x4, 0x2d, 0x61, 0x5b, 0x7c, 0x28,
+                                                             0x8, 0x5f, 0xfb, 0x47, 0x15, 0xf7, 0x21, 0x6,
+                                                             0xa9, 0xf7, 0x1b, 0x92, 0xa, 0xe, 0xf8, 0x49,
+                                                             0x4d, 0xda, 0xf7, 0x0, 0xda, 0xf7, 0xca, 0xda,
+                                                             0xed, 0xda, 0x1, 0xf7, 0x61, 0xdb, 0xe0, 0xf7,
+                                                             0x5, 0xf8, 0x64, 0xdb, 0x3, 0xf9, 0x25, 0xf7,
+                                                             0x42, 0x15, 0x79, 0x8f, 0x94, 0x6c, 0xce, 0x1b,
+                                                             0xf7, 0x46, 0xf7, 0x4, 0xf7, 0x37, 0xf7, 0x28,
+                                                             0xf7, 0x4c, 0xfb, 0x1b, 0xf7, 0x2a, 0xfb, 0x83,
+                                                             0xfb, 0xd4, 0xfb, 0x14, 0xfb, 0x87, 0xfb, 0x5b,
+                                                             0xfb, 0xa5, 0xf7, 0x7f, 0xfb, 0x9, 0xf7, 0x6c,
+                                                             0xf7, 0x1d, 0xf7, 0x47, 0xb4, 0xf7, 0x2e, 0xd8,
+                                                             0x1f, 0x2f, 0x6, 0x68, 0x6d, 0x46, 0x3a, 0xfb,
+                                                             0x5e, 0x1b, 0xfb, 0xb5, 0x39, 0xf7, 0x41, 0xf7,
+                                                             0x1e, 0xf7, 0xf, 0xca, 0xf7, 0x84, 0xf7, 0xc4,
+                                                             0xf7, 0x7a, 0xcc, 0xfb, 0x2b, 0x28, 0xfb, 0x1d,
+                                                             0xfb, 0x3, 0x30, 0x61, 0x73, 0x91, 0xa9, 0xa8,
+                                                             0x92, 0x1f, 0xcc, 0xf7, 0xcb, 0x5, 0xfb, 0x6,
+                                                             0x6, 0x80, 0x5b, 0x5, 0xc0, 0x67, 0x56, 0x90,
+                                                             0x6f, 0x1b, 0xfb, 0x30, 0x3b, 0xfb, 0x39, 0xfb,
+                                                             0xd, 0x28, 0xc8, 0x38, 0xf5, 0xd0, 0xb3, 0xb1,
+                                                             0x96, 0x96, 0x1f, 0xfb, 0x42, 0xf7, 0x19, 0x15,
+                                                             0xc8, 0xab, 0xf7, 0x26, 0xf0, 0xd2, 0x95, 0x42,
+                                                             0x70, 0x51, 0x6a, 0xfb, 0x2c, 0x24, 0x4f, 0x79,
+                                                             0xbf, 0xbe, 0x1e, 0xe, 0x68, 0xa, 0xf7, 0x33,
+                                                             0xf7, 0xc, 0xf8, 0x4b, 0x77, 0x1, 0x9f, 0x16,
+                                                             0x5e, 0xa, 0xe1, 0xf7, 0x33, 0x5, 0xf7, 0xaf,
+                                                             0x6, 0xa3, 0xfb, 0x33, 0x5, 0xf7, 0x1f, 0x6,
+                                                             0xfb, 0x8, 0xf9, 0x62, 0x43, 0xa, 0x27, 0xfc,
+                                                             0x4b, 0x15, 0xf7, 0x30, 0xf7, 0xb5, 0x5c, 0xa,
+                                                             0xb3, 0xfb, 0xb5, 0x5, 0xe, 0xe2, 0x8b, 0xf7,
+                                                             0xc, 0xf7, 0x50, 0xf7, 0xc, 0xf7, 0x3e, 0x8b,
+                                                             0xa, 0xf7, 0xef, 0x6, 0xf7, 0x27, 0xf7, 0x42,
+                                                             0xb5, 0xf7, 0x4c, 0xc0, 0x6c, 0xd1, 0x32, 0xa3,
+                                                             0x1f, 0x8d, 0x7, 0xa9, 0x93, 0xf7, 0x2, 0x9c,
+                                                             0xf7, 0x12, 0x1a, 0xf7, 0x23, 0x24, 0xbc, 0xfb,
+                                                             0x47, 0x1e, 0xfb, 0x90, 0x6, 0xa2, 0xfc, 0xea,
+                                                             0x15, 0xb3, 0xf7, 0x50, 0x5, 0xf7, 0x48, 0x6,
+                                                             0xa2, 0xe9, 0x8b, 0x39, 0x25, 0x24, 0x87, 0x32,
+                                                             0x1f, 0x3c, 0xf7, 0xc8, 0x15, 0xaf, 0xf7, 0x3e,
+                                                             0x5, 0xf7, 0x9, 0x6, 0xd5, 0xcf, 0x8b, 0x43,
+                                                             0x2d, 0x2b, 0x87, 0x37, 0x1f, 0xe, 0xe2, 0x78,
+                                                             0xf7, 0x12, 0xf8, 0x8c, 0xf7, 0x12, 0x1, 0xf6,
+                                                             0xf7, 0x2c, 0x3, 0xf8, 0xe6, 0xf7, 0x95, 0x15,
+                                                             0xfb, 0xb, 0x64, 0x34, 0x6c, 0x51, 0x1b, 0x27,
+                                                             0x58, 0xe3, 0xef, 0xf7, 0xa, 0x80, 0xa, 0x69,
+                                                             0x92, 0x1f, 0xf7, 0x28, 0x99, 0x5, 0xf7, 0x3d,
+                                                             0x77, 0xfb, 0x16, 0xcd, 0xfb, 0x1c, 0x1b, 0xfb,
+                                                             0x7f, 0xfb, 0x35, 0xfb, 0x54, 0xfb, 0x8e, 0xfb,
+                                                             0x31, 0xce, 0xfb, 0x31, 0xf7, 0x75, 0xf7, 0x62,
+                                                             0xf0, 0xf7, 0x1b, 0xf7, 0x9, 0xb6, 0x1f, 0xe,
+                                                             0x57, 0xa, 0xd7, 0x16, 0xf7, 0x98, 0x6, 0xf7,
+                                                             0x7c, 0xf7, 0x65, 0xf7, 0x24, 0xf7, 0xa7, 0xf7,
+                                                             0x71, 0xfb, 0x3, 0xd9, 0xfb, 0x81, 0x1f, 0xfb,
+                                                             0x58, 0x6, 0xa0, 0xfc, 0xec, 0x15, 0xf3, 0xf8,
+                                                             0x76, 0x5, 0xe1, 0x6, 0xd8, 0xf4, 0x86, 0xfb,
+                                                             0x44, 0xfb, 0x8a, 0xfb, 0x38, 0x54, 0xfb, 0x17,
+                                                             0x1f, 0xe, 0xab, 0x8b, 0xf7, 0xc, 0xf7, 0x56,
+                                                             0xf7, 0xc, 0xf7, 0x38, 0x8b, 0xa, 0xf8, 0xc4,
+                                                             0x6, 0xa5, 0x83, 0xa, 0xfc, 0x31, 0x6, 0xb3,
+                                                             0xf7, 0x56, 0x5, 0xf7, 0xfe, 0x40, 0xa, 0xfb,
+                                                             0xfe, 0x6, 0xad, 0xf7, 0x38, 0x5, 0xf8, 0x14,
+                                                             0x40, 0xa, 0xfc, 0xa7, 0x6, 0xe, 0x84, 0xa,
+                                                             0xf7, 0xc5, 0xf7, 0xc, 0xf7, 0x41, 0x8b, 0xa,
+                                                             0x5e, 0xa, 0xcc, 0xf7, 0xc5, 0x5, 0xf7, 0xeb,
+                                                             0x40, 0xa, 0xfb, 0xea, 0x6, 0xaf, 0xf7, 0x41,
+                                                             0x5, 0xf7, 0xfe, 0x40, 0xa, 0xfc, 0x93, 0x6,
+                                                             0xe, 0x8c, 0xa, 0xf7, 0x2e, 0xf7, 0xf, 0xf7,
+                                                             0x77, 0xf7, 0x12, 0x1, 0xf7, 0x0, 0xf7, 0x25,
+                                                             0x3, 0xf8, 0x4c, 0xf7, 0x99, 0x15, 0xf7, 0x4e,
+                                                             0x6, 0x74, 0xfb, 0x0, 0x5, 0x81, 0x78, 0x3d,
+                                                             0x67, 0x32, 0x1b, 0x4d, 0x25, 0x98, 0xf7, 0x3b,
+                                                             0xf7, 0x28, 0xd1, 0xf7, 0x44, 0xf7, 0x55, 0xd3,
+                                                             0xc9, 0x6d, 0x2f, 0xa7, 0x1f, 0xf7, 0x1f, 0x9a,
+                                                             0x5, 0xf7, 0x3a, 0x71, 0xfb, 0x15, 0xce, 0xfb,
+                                                             0x28, 0x1b, 0xfb, 0xb2, 0xfb, 0xc, 0xfb, 0x97,
+                                                             0xfb, 0x55, 0xfb, 0x49, 0xee, 0xfb, 0xf, 0xf7,
+                                                             0x63, 0xf7, 0x26, 0xf7, 0x9, 0xc4, 0xab, 0xbb,
+                                                             0x1f, 0xcd, 0xf7, 0xce, 0x5, 0xfb, 0xda, 0x6,
+                                                             0xe, 0x68, 0xa, 0xf7, 0xd4, 0xf7, 0xd, 0xf7,
+                                                             0xa9, 0x77, 0x1, 0xd2, 0x16, 0x5e, 0xa, 0xcf,
+                                                             0xf7, 0xd4, 0x5, 0xf7, 0xad, 0x6, 0x47, 0xfb,
+                                                             0xd4, 0x5, 0x5e, 0xa, 0xf7, 0x2c, 0xf9, 0x62,
+                                                             0x53, 0xa, 0x50, 0xfb, 0xa9, 0x5, 0xfb, 0xad,
+                                                             0x6, 0xc5, 0xf7, 0xa9, 0x5a, 0xa, 0xe, 0xfb,
+                                                             0xf9, 0x37, 0xa, 0xcb, 0x16, 0x5e, 0xa, 0xf7,
+                                                             0x2d, 0xf9, 0x62, 0x5, 0x97, 0xa, 0xe, 0x3c,
+                                                             0x79, 0xf7, 0x11, 0xf8, 0xf7, 0x77, 0x1, 0xc7,
+                                                             0xf7, 0x5b, 0x15, 0xfb, 0x20, 0xbb, 0x3e, 0xf7,
+                                                             0x32, 0xf7, 0x5b, 0xb7, 0xf7, 0xd, 0xf7, 0x45,
+                                                             0xb0, 0x1e, 0xe6, 0xf8, 0x4a, 0x7b, 0xa, 0x30,
+                                                             0xfc, 0x4a, 0x85, 0xa, 0x6f, 0x6a, 0x66, 0x4c,
+                                                             0x1b, 0x2f, 0x98, 0xcf, 0xb1, 0x8d, 0x1f, 0xe,
+                                                             0xe2, 0x37, 0xa, 0xe2, 0x16, 0x5e, 0xa, 0xb9,
+                                                             0xf7, 0x70, 0xf7, 0x20, 0xf7, 0xe, 0xf7, 0x48,
+                                                             0xfb, 0xea, 0x5, 0xf7, 0x3d, 0x6, 0xfb, 0x83,
+                                                             0xf8, 0x49, 0xf7, 0xd9, 0xf7, 0xad, 0x5, 0xfb,
+                                                             0x5c, 0x6, 0xfb, 0xe1, 0xfb, 0xc4, 0x89, 0x8d,
+                                                             0xcb, 0xf7, 0xc2, 0x53, 0xa, 0xe, 0x87, 0xa,
+                                                             0xd7, 0x16, 0xf8, 0x92, 0x50, 0xa, 0xfb, 0xff,
+                                                             0x6, 0xf7, 0x10, 0xf8, 0xe9, 0x7b, 0xa, 0xe,
+                                                             0xf7, 0x5a, 0x37, 0xa, 0xf7, 0xe1, 0xf7, 0x3,
+                                                             0x3, 0xd0, 0x16, 0x82, 0xa, 0xf7, 0x6, 0xf8,
+                                                             0xec, 0x5c, 0xa, 0xa6, 0xfc, 0xec, 0x5, 0xf7,
+                                                             0x20, 0x6, 0xf7, 0xb0, 0xf8, 0xe7, 0x8d, 0x89,
+                                                             0xfb, 0x23, 0xfc, 0xe5, 0x5, 0xf7, 0x1c, 0x6,
+                                                             0xf7, 0x2c, 0xf9, 0x62, 0x5, 0xfb, 0x6b, 0x6,
+                                                             0xfb, 0x8a, 0xfc, 0x8b, 0x51, 0xa, 0x76, 0xf8,
+                                                             0x8b, 0x5, 0xfb, 0x69, 0x6, 0xe, 0xe2, 0x37,
+                                                             0xa, 0xd0, 0xf9, 0x76, 0x3, 0x8a, 0xa, 0xf2,
+                                                             0xf8, 0x77, 0x5c, 0xa, 0xf7, 0x59, 0xfc, 0x77,
+                                                             0x5, 0x9b, 0xa, 0xf7, 0x2d, 0xf9, 0x62, 0x3d,
+                                                             0xa, 0x25, 0xfc, 0x74, 0x51, 0xa, 0xfb, 0x5a,
+                                                             0xf8, 0x74, 0x65, 0xa, 0x8c, 0xa, 0xf8, 0x8c,
+                                                             0xf7, 0x12, 0x1, 0xf7, 0x17, 0xf7, 0x2a, 0xf8,
+                                                             0xf, 0xf7, 0x2a, 0x3, 0xf6, 0xf7, 0xb1, 0x15,
+                                                             0xfb, 0x22, 0xe3, 0xfb, 0x36, 0xf7, 0x69, 0xf7,
+                                                             0xb1, 0xf7, 0x16, 0xf7, 0x93, 0xf7, 0x55, 0xf7,
+                                                             0x48, 0xfb, 0x6, 0xf7, 0x14, 0xfb, 0x53, 0xfb,
+                                                             0xc9, 0x25, 0xfb, 0xaf, 0xfb, 0x3d, 0x1e, 0xf7,
+                                                             0x2a, 0x16, 0xf7, 0x37, 0xf0, 0xf7, 0x37, 0xf7,
+                                                             0x29, 0xf7, 0x3, 0xc2, 0x33, 0x2b, 0xfb, 0x9,
+                                                             0x3b, 0xfb, 0x5f, 0xfb, 0x3c, 0x2a, 0x44, 0xd5,
+                                                             0xf3, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf7, 0xa6,
+                                                             0xf7, 0xc, 0xf7, 0x60, 0x8b, 0xa, 0xf7, 0x27,
+                                                             0x6, 0xc4, 0xf7, 0xa6, 0x5, 0xea, 0x6, 0xf7,
+                                                             0x51, 0xf7, 0x42, 0xba, 0xf7, 0x60, 0xf7, 0x49,
+                                                             0xfb, 0x3c, 0x97, 0x57, 0x1f, 0xfb, 0xb9, 0x6,
+                                                             0xdb, 0xfb, 0xd8, 0x15, 0xb6, 0xf7, 0x60, 0x5,
+                                                             0xf6, 0x6, 0xd6, 0xc9, 0x8d, 0x40, 0xfb, 0xb,
+                                                             0xfb, 0x19, 0x7f, 0xfb, 0x1, 0x1f, 0xe, 0xf7,
+                                                             0x23, 0x6c, 0x76, 0xdb, 0xf7, 0xa, 0xf8, 0x6d,
+                                                             0xf7, 0xa, 0x36, 0xa, 0xf8, 0xc4, 0xc0, 0x15,
+                                                             0xa4, 0x6b, 0xb3, 0x5e, 0xca, 0x6f, 0xd3, 0xe3,
+                                                             0x18, 0x67, 0x9e, 0x67, 0xa5, 0x6d, 0xa6, 0x8,
+                                                             0xf7, 0x4, 0xe1, 0xc0, 0xf7, 0x1b, 0xf7, 0xb,
+                                                             0x1a, 0xf7, 0x3f, 0xfb, 0x7, 0xf7, 0xa, 0xfb,
+                                                             0x50, 0xfb, 0xd0, 0x2a, 0xfb, 0xa8, 0xfb, 0x29,
+                                                             0xfb, 0x1f, 0xe6, 0xfb, 0x25, 0xf7, 0x66, 0xc1,
+                                                             0xba, 0x92, 0x9d, 0xbe, 0x1e, 0xfb, 0x35, 0xf7,
+                                                             0x35, 0x15, 0xb8, 0x7b, 0xb0, 0x67, 0x85, 0x1a,
+                                                             0x81, 0x5a, 0x8b, 0x86, 0x32, 0x3a, 0xbd, 0xf7,
+                                                             0x8, 0xf7, 0x15, 0xe6, 0xf7, 0x46, 0xf7, 0x33,
+                                                             0xf7, 0x2, 0xc3, 0x3d, 0x2e, 0x5a, 0x75, 0xfb,
+                                                             0x9, 0x3c, 0x3f, 0x1e, 0x62, 0xb8, 0x65, 0xa3,
+                                                             0x65, 0x9d, 0x8, 0xe, 0x68, 0xa, 0xf7, 0xbb,
+                                                             0xf7, 0x4, 0xf7, 0x53, 0x96, 0xa, 0xf9, 0x25,
+                                                             0xf7, 0x27, 0x3, 0xd7, 0x16, 0xf7, 0x29, 0x6,
+                                                             0xca, 0xf7, 0xbb, 0x5, 0xc7, 0x6, 0xb7, 0xa8,
+                                                             0x8b, 0x5d, 0xab, 0x1f, 0xb5, 0x50, 0xce, 0xfb,
+                                                             0x50, 0x89, 0x1a, 0xf7, 0x34, 0x6, 0x60, 0xf7,
+                                                             0x1, 0x51, 0xf7, 0x1f, 0x4b, 0xc4, 0x8, 0xf7,
+                                                             0x0, 0x9a, 0xf7, 0x5, 0xbe, 0xf7, 0x32, 0x1a,
+                                                             0xf7, 0x51, 0xfb, 0x36, 0x8b, 0x47, 0x1e, 0xfb,
+                                                             0xd5, 0x6, 0xde, 0xfb, 0xcb, 0x15, 0xb3, 0xf7,
+                                                             0x53, 0x5, 0xf7, 0x38, 0x6, 0xbc, 0xcf, 0x8b,
+                                                             0x44, 0xfb, 0x4, 0xfb, 0x1c, 0x83, 0x21, 0x1f,
+                                                             0xe, 0xab, 0x78, 0xf7, 0x12, 0xf8, 0x92, 0x96,
+                                                             0xa, 0xdc, 0xf7, 0x7a, 0x15, 0xfb, 0x53, 0xf7,
+                                                             0x28, 0x51, 0xf7, 0x24, 0xf7, 0x67, 0xdf, 0xf7,
+                                                             0x0, 0xf7, 0x0, 0xf7, 0x10, 0x34, 0xc3, 0xfb,
+                                                             0x14, 0xc2, 0x1e, 0x35, 0xae, 0x59, 0x8e, 0xbf,
+                                                             0x1a, 0xd8, 0xe7, 0x9d, 0xa5, 0xd1, 0xcd, 0x70,
+                                                             0x3a, 0x1e, 0xf7, 0x27, 0x92, 0x5, 0xf7, 0x2d,
+                                                             0xfb, 0x1f, 0xcf, 0xfb, 0x23, 0xfb, 0x65, 0x53,
+                                                             0xfb, 0x13, 0x33, 0xfb, 0x12, 0xe5, 0x64, 0xf7,
+                                                             0x15, 0x54, 0x1e, 0xdc, 0x68, 0xb8, 0x79, 0x57,
+                                                             0x1a, 0x3e, 0x32, 0x7e, 0x57, 0xfb, 0x23, 0x88,
+                                                             0xce, 0xca, 0x89, 0x1e, 0xe, 0x84, 0xa, 0xf8,
+                                                             0xe9, 0xf7, 0xd, 0x1, 0xf7, 0x77, 0x16, 0xf7,
+                                                             0x2d, 0x6, 0xf7, 0x15, 0xf8, 0xe9, 0x5, 0xf7,
+                                                             0x6c, 0x6, 0xa5, 0xf7, 0xd, 0x5, 0xfc, 0xdd,
+                                                             0x6, 0x71, 0xfb, 0xd, 0x5, 0xf7, 0x6c, 0x6,
+                                                             0xe, 0xe2, 0x78, 0xf7, 0x11, 0xf8, 0xf8, 0x77,
+                                                             0x1, 0xf7, 0x8, 0xf7, 0x2b, 0x3, 0xf7, 0x66,
+                                                             0xf9, 0x62, 0x15, 0x39, 0xfc, 0x20, 0x5, 0x84,
+                                                             0x67, 0x86, 0x67, 0x65, 0x1a, 0xfb, 0xd, 0x8c,
+                                                             0xc1, 0xfb, 0x2, 0xf7, 0x5f, 0x1b, 0xf7, 0xa5,
+                                                             0xb6, 0xf7, 0x60, 0xf7, 0x1d, 0xa8, 0x1f, 0xe0,
+                                                             0xf8, 0x20, 0x5, 0xfb, 0x2c, 0x6, 0x36, 0xfc,
+                                                             0x20, 0x5, 0xfb, 0x11, 0x71, 0x49, 0x30, 0x2d,
+                                                             0x1b, 0x36, 0x6e, 0xba, 0xc8, 0xb0, 0x8f, 0xb1,
+                                                             0x92, 0xac, 0x1f, 0xdf, 0xf8, 0x20, 0x5, 0xe,
+                                                             0xab, 0x37, 0xa, 0xf7, 0xb6, 0x16, 0xf7, 0x26,
+                                                             0x6, 0xf8, 0x1, 0xf9, 0x62, 0x91, 0xa, 0xfb,
+                                                             0xa6, 0xfc, 0xb3, 0x51, 0xa, 0x39, 0xf8, 0xb3,
+                                                             0x5b, 0xa, 0xe, 0xf7, 0xc9, 0x37, 0xa, 0xf7,
+                                                             0x4a, 0xf7, 0x14, 0xf7, 0xb5, 0xf7, 0x3, 0x3,
+                                                             0xf7, 0x57, 0x16, 0xf7, 0x26, 0x6, 0xf7, 0x8d,
+                                                             0xf8, 0xa0, 0x5c, 0xa, 0x9a, 0xfc, 0xa0, 0x8d,
+                                                             0xa, 0xf7, 0xe0, 0xf9, 0x62, 0x5, 0xfb, 0x1d,
+                                                             0x6, 0xfb, 0x75, 0xfc, 0x85, 0x51, 0xa, 0x7c,
+                                                             0xf8, 0x85, 0x5, 0xfb, 0x2e, 0x6, 0xfb, 0x7e,
+                                                             0xfc, 0x8a, 0x51, 0xa, 0x85, 0xf8, 0x8a, 0x81,
+                                                             0xa, 0xab, 0x37, 0xa, 0x99, 0x16, 0xf7, 0x49,
+                                                             0x6, 0xf7, 0x50, 0xf7, 0x7b, 0xf3, 0xfb, 0x7b,
+                                                             0x5, 0xf7, 0x33, 0x6, 0xfb, 0x3b, 0xf7, 0xe8,
+                                                             0xf7, 0xcc, 0xf8, 0xe, 0x5, 0xfb, 0x45, 0x6,
+                                                             0xfb, 0x5f, 0xfb, 0x8b, 0xfb, 0xa, 0xf7, 0x8b,
+                                                             0x7b, 0xa, 0xf7, 0x3e, 0xfb, 0xf6, 0x5, 0xe,
+                                                             0xab, 0x37, 0xa, 0xf7, 0x3c, 0xf9, 0x12, 0x3,
+                                                             0x64, 0xa, 0xf7, 0x9e, 0xf7, 0xcc, 0xf8, 0x58,
+                                                             0x43, 0xa, 0xfb, 0x5d, 0xfb, 0xc7, 0xfb, 0x10,
+                                                             0xf7, 0xc7, 0x5a, 0xa, 0xf7, 0x51, 0xfc, 0x4a,
+                                                             0x5, 0xe, 0x84, 0xa, 0xf8, 0xe9, 0xf7, 0xd,
+                                                             0x1, 0xa4, 0x16, 0xf8, 0xfb, 0x6, 0xa6, 0xf7,
+                                                             0x9, 0x5, 0x8a, 0xfc, 0x33, 0x8c, 0x8b, 0x1e,
+                                                             0xf8, 0x62, 0xf8, 0x7d, 0xa2, 0xf7, 0x4, 0x5,
+                                                             0xfc, 0xcf, 0x6, 0x6f, 0xfb, 0xd, 0x5, 0xf8,
+                                                             0x5, 0x6, 0xfc, 0x5b, 0xfc, 0x78, 0x5, 0xe,
+                                                             0x7f, 0xa, 0xf7, 0x48, 0x35, 0x15, 0xf7, 0x29,
+                                                             0xf9, 0x4e, 0x5, 0xf7, 0x1, 0x6, 0xa3, 0xf7,
+                                                             0x2, 0x5, 0xfb, 0x89, 0x6, 0xfb, 0x58, 0xfe,
+                                                             0x2a, 0x5, 0xf7, 0x89, 0x6, 0xa3, 0xf7, 0x2,
+                                                             0x5, 0xe, 0xfb, 0xf9, 0x78, 0xa, 0xf7, 0x10,
+                                                             0xf7, 0x87, 0x3, 0xf7, 0x85, 0x78, 0x15, 0xf7,
+                                                             0x12, 0x6, 0xfb, 0x7, 0xf9, 0x88, 0x5, 0xfb,
+                                                             0x14, 0x6, 0xe, 0x7f, 0xa, 0x91, 0x35, 0x15,
+                                                             0x73, 0xfb, 0x2, 0x5, 0xf7, 0x89, 0x6, 0xf7,
+                                                             0x58, 0xfa, 0x2a, 0x5, 0xfb, 0x89, 0x6, 0x73,
+                                                             0xfb, 0x2, 0x5, 0xf7, 0x2, 0x6, 0xfb, 0x29,
+                                                             0xfd, 0x4e, 0x5, 0xe, 0x58, 0xf7, 0xec, 0x76,
+                                                             0xf8, 0xb, 0x77, 0x1, 0xf7, 0x17, 0xf7, 0xd7,
+                                                             0x15, 0xf7, 0x1c, 0x6, 0xe9, 0xf7, 0x79, 0xea,
+                                                             0xfb, 0x79, 0x5, 0x82, 0xa, 0xfb, 0x42, 0xf8,
+                                                             0xb, 0x5, 0x20, 0x6, 0xe, 0x3c, 0xfb, 0x11,
+                                                             0xbd, 0x1, 0x70, 0x40, 0x15, 0x59, 0xf8, 0xcb,
+                                                             0xbd, 0x7, 0xe, 0x72, 0xa, 0xf7, 0x8c, 0xf8,
+                                                             0xf0, 0x15, 0xf4, 0x6, 0x47, 0xf7, 0x26, 0x53,
+                                                             0xa, 0xe, 0x42, 0xa, 0xf7, 0xf1, 0xf2, 0x76,
+                                                             0xa, 0xf8, 0x1a, 0x89, 0x2f, 0xa, 0x13, 0xb0,
+                                                             0x99, 0xa, 0xaa, 0xb2, 0x1a, 0xab, 0x7c, 0xf7,
+                                                             0x3, 0x33, 0xa, 0x80, 0x5, 0xb8, 0x98, 0xb1,
+                                                             0x9b, 0xb8, 0x1b, 0xce, 0xa8, 0x5a, 0x55, 0x70,
+                                                             0x1f, 0x6c, 0x80, 0x54, 0x86, 0x50, 0x86, 0x8,
+                                                             0x42, 0x86, 0xfb, 0x2f, 0x81, 0xfb, 0x34, 0x1a,
+                                                             0x28, 0xd6, 0x50, 0xe1, 0x1e, 0x30, 0xa, 0x99,
+                                                             0xf7, 0x8a, 0x15, 0x60, 0x81, 0x77, 0x20, 0x20,
+                                                             0x1b, 0x5a, 0x77, 0xa1, 0xa7, 0xca, 0xdc, 0xa2,
+                                                             0xe7, 0x97, 0x1f, 0xe, 0x73, 0x7d, 0xf6, 0x41,
+                                                             0x76, 0xf8, 0x45, 0xf0, 0xf7, 0x4e, 0x77, 0x12,
+                                                             0xf7, 0x67, 0xf7, 0x18, 0xf7, 0x36, 0xf7, 0x20,
+                                                             0x13, 0x7c, 0xc8, 0x89, 0x15, 0xf7, 0x18, 0x6,
+                                                             0x9d, 0xe1, 0x5c, 0xa, 0x13, 0xb4, 0x73, 0x96,
+                                                             0xb4, 0x41, 0xf7, 0x7, 0x1b, 0xf7, 0x25, 0xf7,
+                                                             0xc, 0xf7, 0x23, 0xf7, 0x4f, 0xf7, 0x5, 0x57,
+                                                             0xf2, 0xfb, 0x1b, 0x42, 0x5f, 0x6c, 0x73, 0x6b,
+                                                             0x1f, 0xbe, 0xf7, 0x85, 0x44, 0xa, 0x13, 0x74,
+                                                             0xb3, 0xfc, 0x90, 0x15, 0xf7, 0x3, 0xc4, 0xf7,
+                                                             0x2, 0xe6, 0xc1, 0xba, 0x60, 0x3f, 0x1e, 0x13,
+                                                             0xb4, 0x38, 0x5e, 0xfb, 0x1c, 0x25, 0x4c, 0x64,
+                                                             0xc5, 0xc6, 0x1e, 0xe, 0x3c, 0x7d, 0xf7, 0x5,
+                                                             0xf7, 0xe8, 0xf6, 0x1, 0xda, 0xf7, 0x23, 0x3,
+                                                             0xf8, 0x38, 0xf7, 0x5b, 0x15, 0x36, 0x6d, 0x4f,
+                                                             0x7c, 0x70, 0x1b, 0x63, 0x62, 0xb2, 0xd0, 0xe0,
+                                                             0xb3, 0xf7, 0x27, 0xf7, 0x5, 0xd7, 0x93, 0x48,
+                                                             0x77, 0x8d, 0x1f, 0xf7, 0x1e, 0x9a, 0x5, 0xe3,
+                                                             0x83, 0x4d, 0xe6, 0xfb, 0x25, 0x1b, 0xfb, 0x4b,
+                                                             0xfb, 0xe, 0xfb, 0x2f, 0xfb, 0x4c, 0xfb, 0x4,
+                                                             0xc6, 0xfb, 0x1, 0xf7, 0x36, 0xf7, 0x16, 0xe3,
+                                                             0xd6, 0xf7, 0x8, 0xb6, 0x1f, 0xe, 0x73, 0x7d,
+                                                             0xf6, 0x2c, 0xea, 0xf7, 0xde, 0xf7, 0x1, 0xf7,
+                                                             0x4e, 0x77, 0x12, 0x13, 0x70, 0xf8, 0x38, 0x89,
+                                                             0x15, 0xf7, 0x17, 0x6, 0xf7, 0x2d, 0xf9, 0x64,
+                                                             0x47, 0xa, 0x52, 0xfb, 0xa1, 0x5, 0x9e, 0x7e,
+                                                             0x62, 0xcb, 0x20, 0x1b, 0xfb, 0x32, 0x24, 0xfb,
+                                                             0x34, 0xfb, 0x3c, 0x1f, 0x13, 0xb0, 0xfb, 0x20,
+                                                             0xd1, 0x3d, 0xf7, 0x6, 0xe1, 0xbe, 0xb3, 0xa7,
+                                                             0xa6, 0x1e, 0x8d, 0x89, 0x5, 0x13, 0x70, 0xfb,
+                                                             0x67, 0xf7, 0x2c, 0x15, 0xe7, 0xbe, 0xf7, 0x13,
+                                                             0xe7, 0xc8, 0xb4, 0x54, 0x49, 0x3f, 0x62, 0xfb,
+                                                             0x19, 0x22, 0x4b, 0x68, 0xba, 0xcb, 0x1e, 0xe,
+                                                             0x3c, 0xf7, 0x71, 0xe3, 0xf7, 0x1a, 0xf2, 0x7d,
+                                                             0xa, 0xf7, 0x68, 0xf7, 0x71, 0x15, 0xf8, 0x8,
+                                                             0x6, 0x93, 0xae, 0x8c, 0xb8, 0x99, 0x1a, 0xf0,
+                                                             0x5e, 0xf7, 0x16, 0xfb, 0x41, 0xfb, 0x6d, 0x33,
+                                                             0xfb, 0x53, 0xfb, 0x1a, 0xfb, 0x24, 0xeb, 0x30,
+                                                             0xf7, 0x2c, 0xd7, 0xf7, 0x0, 0xa6, 0xf7, 0x15,
+                                                             0xcc, 0x1e, 0xfb, 0x19, 0xa0, 0x5, 0x7b, 0x82,
+                                                             0x6b, 0x51, 0x41, 0x1b, 0x4e, 0x59, 0xbc, 0xde,
+                                                             0x8f, 0x1f, 0x9a, 0xe3, 0x15, 0xbd, 0x96, 0xaf,
+                                                             0xdf, 0xe0, 0x1b, 0xd8, 0xa5, 0x4c, 0x44, 0x88,
+                                                             0x1f, 0xe, 0xa0, 0x76, 0xf8, 0x33, 0xf1, 0xf7,
+                                                             0x66, 0x77, 0x1, 0xe2, 0x16, 0xf7, 0x15, 0x6,
+                                                             0xda, 0xf8, 0x33, 0x5, 0xe6, 0x6, 0x9f, 0xf1,
+                                                             0x5, 0x30, 0x6, 0xda, 0x99, 0x91, 0xa4, 0xae,
+                                                             0x1b, 0x98, 0xa6, 0x86, 0x7e, 0xad, 0x1f, 0xa4,
+                                                             0xf0, 0x5, 0x9c, 0x5a, 0x5e, 0x91, 0x6d, 0x1b,
+                                                             0xfb, 0xa, 0x80, 0x28, 0xfb, 0x3, 0x6d, 0x1f,
+                                                             0x44, 0x6, 0x76, 0x25, 0x5, 0xd4, 0x6, 0xe,
+                                                             0x73, 0xfb, 0x6d, 0xf2, 0xf7, 0x3, 0xf6, 0xf7,
+                                                             0xe7, 0xf2, 0x7e, 0x77, 0x12, 0x13, 0xd0, 0xb1,
+                                                             0x6e, 0x15, 0xfb, 0x46, 0xf7, 0x40, 0x81, 0xca,
+                                                             0xf7, 0x7b, 0xa3, 0xf6, 0xf7, 0x5a, 0xb5, 0x1e,
+                                                             0xeb, 0xf8, 0x51, 0x3d, 0xa, 0x78, 0x2d, 0x51,
+                                                             0xa, 0x13, 0xe0, 0xd3, 0x68, 0x48, 0xae, 0x46,
+                                                             0x1b, 0xfb, 0x1d, 0xfb, 0x14, 0x20, 0xfb, 0x65,
+                                                             0xfb, 0x3d, 0xf2, 0x4b, 0xdd, 0xde, 0xc2, 0xb7,
+                                                             0x9e, 0x9f, 0x1f, 0x8d, 0x89, 0x5, 0xfb, 0x8,
+                                                             0x74, 0x80, 0x53, 0x24, 0x1b, 0x44, 0x80, 0xae,
+                                                             0xa7, 0x8d, 0x1f, 0x9d, 0xf7, 0xac, 0x15, 0xc5,
+                                                             0xb3, 0xf7, 0x30, 0xf4, 0xcb, 0xb4, 0x4d, 0x4a,
+                                                             0x2b, 0x53, 0xfb, 0x8, 0x2c, 0x51, 0x62, 0xb9,
+                                                             0xda, 0x1e, 0xe, 0x84, 0xa, 0xf8, 0x44, 0xef,
+                                                             0xf7, 0x4e, 0x77, 0x1, 0xf8, 0x76, 0xf7, 0x27,
+                                                             0x3, 0xcc, 0x16, 0x7c, 0xa, 0xb7, 0xf7, 0x62,
+                                                             0x5, 0xf4, 0xa2, 0xb2, 0xf7, 0xd, 0xf6, 0x1b,
+                                                             0xba, 0x98, 0x6f, 0x69, 0x76, 0x87, 0x74, 0x86,
+                                                             0x75, 0x1f, 0x49, 0xfb, 0xc4, 0x5, 0x7c, 0xa,
+                                                             0xcc, 0xf7, 0xc4, 0x5, 0x91, 0xa7, 0x92, 0xaf,
+                                                             0xae, 0x1a, 0xcd, 0x6f, 0xca, 0xfb, 0x3, 0x30,
+                                                             0x51, 0x5d, 0x73, 0x6b, 0x1e, 0xc1, 0xf7, 0x94,
+                                                             0x44, 0xa, 0xe, 0x48, 0xa, 0xf8, 0xa1, 0x77,
+                                                             0xe7, 0xf7, 0x14, 0x1, 0xd0, 0x16, 0x9b, 0xa,
+                                                             0xf7, 0x1, 0xf8, 0xa1, 0x92, 0xa, 0x9b, 0xd3,
+                                                             0x15, 0x9b, 0xa, 0xa6, 0xf7, 0x14, 0x92, 0xa,
+                                                             0xe, 0xfb, 0xf9, 0xfb, 0x55, 0x76, 0x1, 0x75,
+                                                             0x3a, 0x15, 0x77, 0xfb, 0xa, 0x5, 0x7c, 0xb6,
+                                                             0xb8, 0x8b, 0x94, 0x1b, 0xf7, 0xe, 0xb1, 0xf7,
+                                                             0x31, 0xf7, 0x1d, 0xa5, 0x1f, 0xdf, 0xf8, 0x51,
+                                                             0x5, 0xfb, 0x16, 0x6, 0x3a, 0xfc, 0x51, 0x5,
+                                                             0xfb, 0x30, 0x6c, 0x7e, 0x7e, 0x63, 0x1b, 0x80,
+                                                             0x7a, 0x8c, 0x92, 0x73, 0x1f, 0xf7, 0x7b, 0xf9,
+                                                             0x3a, 0x15, 0xf7, 0x16, 0x6, 0xa3, 0xf7, 0x14,
+                                                             0x5, 0xfb, 0x16, 0x6, 0xe, 0x3c, 0x37, 0xa,
+                                                             0xd0, 0x16, 0xf7, 0x26, 0x6, 0xae, 0xf7, 0x31,
+                                                             0xed, 0xdf, 0xd6, 0xfb, 0x85, 0x5, 0xf7, 0x26,
+                                                             0x6, 0xfb, 0x8, 0xf7, 0xdf, 0xf7, 0x6d, 0xf7,
+                                                             0x51, 0x5, 0xfb, 0x52, 0x6, 0xfb, 0x50, 0xfb,
+                                                             0x44, 0x89, 0x8d, 0xdd, 0xf8, 0x8, 0x93, 0xa,
+                                                             0xe, 0xfb, 0xf9, 0x37, 0xa, 0x8a, 0xa, 0xf7,
+                                                             0x2c, 0xf9, 0x62, 0x65, 0xa, 0xf7, 0x92, 0xa0,
+                                                             0x76, 0xf8, 0x4f, 0xf2, 0x1, 0xcb, 0x16, 0xf7,
+                                                             0x23, 0x6, 0xbe, 0xf7, 0x89, 0x5, 0xdf, 0x9d,
+                                                             0xa1, 0xf7, 0x6, 0xf2, 0x1b, 0xb5, 0x96, 0x75,
+                                                             0x6e, 0x78, 0x87, 0x75, 0x87, 0x77, 0x1f, 0x45,
+                                                             0xfb, 0xdf, 0x5, 0x7c, 0xa, 0xbe, 0xf7, 0x86,
+                                                             0x5, 0xd2, 0x98, 0xaf, 0xf7, 0x16, 0xed, 0x1b,
+                                                             0xae, 0x94, 0x68, 0x68, 0x7a, 0x89, 0x7a, 0x88,
+                                                             0x7e, 0x1f, 0x47, 0xfb, 0xda, 0x8d, 0xa, 0xd0,
+                                                             0xf7, 0xda, 0x5, 0x8f, 0xa5, 0x8f, 0xa6, 0xa5,
+                                                             0x1a, 0xd5, 0x72, 0xce, 0x23, 0x3a, 0x44, 0x5e,
+                                                             0x59, 0x6a, 0x1e, 0xe1, 0x7b, 0x40, 0x94, 0x60,
+                                                             0x1b, 0x38, 0x61, 0x77, 0x54, 0x63, 0x1f, 0x99,
+                                                             0xc9, 0x91, 0xa, 0xe, 0x84, 0xa, 0xf8, 0x4f,
+                                                             0xe5, 0x31, 0xf2, 0x12, 0x13, 0xa0, 0xcc, 0x16,
+                                                             0x7c, 0xa, 0xba, 0xf7, 0x6f, 0x5, 0xf3, 0xa1,
+                                                             0xa7, 0xf7, 0xc, 0xf7, 0x9, 0x1b, 0xb7, 0x9b,
+                                                             0x6a, 0x76, 0x6d, 0x84, 0x6d, 0x86, 0x71, 0x1f,
+                                                             0x4b, 0xfb, 0xc3, 0x5, 0xf7, 0x25, 0x6, 0xcb,
+                                                             0xf7, 0xc2, 0x5, 0x92, 0xad, 0x91, 0xb3, 0xb0,
+                                                             0x1a, 0xd2, 0x6c, 0xc9, 0xfb, 0x0, 0x34, 0x4f,
+                                                             0x5f, 0x65, 0x61, 0x1e, 0x89, 0x8d, 0x5, 0x13,
+                                                             0xc0, 0x99, 0xce, 0x5b, 0xa, 0xe, 0x73, 0x7d,
+                                                             0xf7, 0x2, 0xf7, 0xe8, 0xf7, 0x2, 0x3f, 0xa,
+                                                             0xdd, 0xf7, 0x71, 0x15, 0xfb, 0x11, 0xde, 0xfb,
+                                                             0x2, 0x38, 0xa, 0xf7, 0x37, 0x26, 0xa, 0xe,
+                                                             0x73, 0xfb, 0x4e, 0x76, 0xf7, 0x54, 0xf7, 0x4,
+                                                             0xf7, 0xe8, 0xeb, 0x2b, 0xf7, 0x1, 0x12, 0xf8,
+                                                             0x8d, 0xf7, 0x20, 0x13, 0xd8, 0x9d, 0xfb, 0x63,
+                                                             0x15, 0x7c, 0xa, 0xc5, 0xf7, 0xaa, 0x5, 0x77,
+                                                             0x98, 0xb4, 0x49, 0xf6, 0x1b, 0xf7, 0x34, 0xf3,
+                                                             0xf7, 0x32, 0xf7, 0x41, 0xf7, 0x23, 0x44, 0xe2,
+                                                             0xfb, 0x6, 0x34, 0x58, 0x62, 0x6e, 0x6f, 0x1f,
+                                                             0x89, 0x8d, 0x5, 0x13, 0xe8, 0x96, 0xc2, 0x5,
+                                                             0xfb, 0x18, 0x6, 0xe2, 0xfb, 0xcb, 0x15, 0xd8,
+                                                             0xb4, 0xf7, 0x1e, 0xf5, 0xcc, 0xae, 0x54, 0x49,
+                                                             0x2d, 0x58, 0xfb, 0x11, 0x2e, 0x4d, 0x62, 0xc3,
+                                                             0xd0, 0x1e, 0xe, 0x73, 0xfb, 0x4e, 0x76, 0xf7,
+                                                             0x54, 0xf2, 0xf7, 0xf1, 0xf7, 0x1, 0x7e, 0x77,
+                                                             0x12, 0xdb, 0xf7, 0x21, 0x13, 0xd8, 0xf8, 0x2,
+                                                             0xfb, 0x63, 0x15, 0xf7, 0x25, 0x6, 0xf7, 0x2e,
+                                                             0xf9, 0x78, 0x66, 0xa, 0x79, 0x34, 0x51, 0xa,
+                                                             0x13, 0xe8, 0xa3, 0x7f, 0x62, 0xd7, 0xfb, 0x7,
+                                                             0x1b, 0xfb, 0x26, 0xfb, 0xc, 0xfb, 0x27, 0xfb,
+                                                             0x54, 0xfb, 0x9, 0xbf, 0x22, 0xf7, 0x1b, 0xd5,
+                                                             0xb7, 0xab, 0xa4, 0xac, 0x1f, 0xfb, 0x59, 0xf7,
+                                                             0x39, 0x15, 0xe0, 0xb7, 0xf7, 0x25, 0xf2, 0xca,
+                                                             0xb2, 0x4f, 0x4e, 0xfb, 0x6, 0x52, 0xfb, 0x6,
+                                                             0x30, 0x54, 0x5d, 0xb4, 0xd9, 0x1e, 0xe, 0xfb,
+                                                             0x8a, 0xa0, 0x76, 0xf8, 0x30, 0xf7, 0xd, 0xfb,
+                                                             0xd, 0xf7, 0x1a, 0x12, 0xd7, 0xf8, 0x3d, 0x13,
+                                                             0xb0, 0xcb, 0x16, 0x82, 0xa, 0xab, 0xf7, 0x3c,
+                                                             0xa6, 0xf7, 0x17, 0xa2, 0xf7, 0x13, 0xf7, 0x30,
+                                                             0x7d, 0x19, 0xbf, 0xf7, 0xb, 0x5, 0x91, 0x7e,
+                                                             0x76, 0x94, 0x6e, 0x1b, 0x49, 0x59, 0x51, 0x51,
+                                                             0x69, 0x1f, 0x89, 0x8d, 0x5, 0x13, 0xc0, 0x9f,
+                                                             0xf0, 0x5, 0xfb, 0x12, 0x6, 0xe, 0x3c, 0x7d,
+                                                             0xef, 0xf7, 0xfc, 0xef, 0x1, 0xca, 0xf7, 0x28,
+                                                             0x15, 0xfb, 0x7, 0xab, 0xe5, 0x5c, 0xf7, 0x17,
+                                                             0x1b, 0xf7, 0x48, 0xc0, 0xf7, 0x8, 0xd3, 0xf4,
+                                                             0x20, 0xab, 0x3f, 0xa3, 0x1f, 0x44, 0xa0, 0x71,
+                                                             0x93, 0xab, 0x1a, 0xa5, 0xa3, 0xa3, 0xc4, 0x9b,
+                                                             0xd0, 0x8b, 0x4b, 0xa0, 0x1e, 0xf7, 0x14, 0xa3,
+                                                             0x5, 0xf7, 0x11, 0x70, 0xfb, 0x6, 0x9a, 0x44,
+                                                             0x1b, 0xfb, 0x32, 0x42, 0x46, 0x38, 0x35, 0xd7,
+                                                             0x4f, 0xe2, 0x6c, 0x1f, 0xe9, 0x69, 0x95, 0x85,
+                                                             0x6e, 0x1a, 0x67, 0x5d, 0x71, 0x5a, 0x41, 0x71,
+                                                             0xb3, 0xb8, 0x7b, 0x1e, 0xe, 0x9a, 0x76, 0xf8,
+                                                             0x2c, 0xee, 0xf7, 0x43, 0x77, 0x1, 0xf7, 0xda,
+                                                             0x85, 0x15, 0xa2, 0xf1, 0x5, 0x87, 0x25, 0x76,
+                                                             0x9b, 0xc7, 0x1f, 0x70, 0x6f, 0x91, 0xa8, 0x91,
+                                                             0x1f, 0xc5, 0xf7, 0xa8, 0x5, 0xe3, 0x6, 0xa1,
+                                                             0xee, 0x5, 0x33, 0x6, 0xb1, 0xf7, 0x43, 0xfb,
+                                                             0x37, 0x2c, 0x7a, 0x3b, 0x5, 0x45, 0x6, 0x75,
+                                                             0x28, 0x5, 0xd0, 0x6, 0x8b, 0x4c, 0xfb, 0xb2,
+                                                             0x73, 0x1a, 0x2e, 0xf7, 0x1b, 0x86, 0xe0, 0x1e,
+                                                             0xe, 0x59, 0xa, 0xf8, 0x4f, 0x77, 0x12, 0xed,
+                                                             0xf7, 0x27, 0x13, 0x70, 0xf8, 0x31, 0x89, 0x15,
+                                                             0xf7, 0x1a, 0x6, 0xf7, 0x3, 0xf8, 0xaa, 0x44,
+                                                             0xa, 0x57, 0xfb, 0x91, 0x5, 0x46, 0x72, 0x82,
+                                                             0xfb, 0xd, 0xfb, 0xe, 0x1b, 0x5d, 0x7c, 0xb0,
+                                                             0xb4, 0x9c, 0x8f, 0x9c, 0x8f, 0x9a, 0x1f, 0xcd,
+                                                             0xf7, 0xd0, 0x47, 0xa, 0x4a, 0xfb, 0xd0, 0x5,
+                                                             0x85, 0x6f, 0x84, 0x67, 0x67, 0x1a, 0x13, 0xb0,
+                                                             0x47, 0xa5, 0x4d, 0xf7, 0x5, 0xcf, 0xce, 0xa9,
+                                                             0xc1, 0xc2, 0x1e, 0x8c, 0x89, 0x5, 0xe, 0x3c,
+                                                             0x79, 0xa, 0xf7, 0x78, 0x16, 0xf7, 0x9, 0x6,
+                                                             0xf7, 0xcb, 0xf8, 0xa8, 0x7b, 0xa, 0xfb, 0x57,
+                                                             0xfb, 0xf8, 0x51, 0xa, 0x57, 0xf7, 0xf8, 0x5,
+                                                             0xfb, 0x1a, 0x6, 0xe, 0xf7, 0x23, 0x79, 0xa,
+                                                             0xf8, 0x79, 0xe5, 0x3, 0xf7, 0x4f, 0x16, 0xf7,
+                                                             0x15, 0x6, 0xf7, 0x2f, 0xf7, 0xea, 0x5c, 0xa,
+                                                             0xa3, 0xfb, 0xea, 0x5, 0xf7, 0x16, 0x6, 0xf7,
+                                                             0x93, 0xf8, 0xa8, 0x54, 0xa, 0xfb, 0x32, 0xfb,
+                                                             0xf7, 0x51, 0xa, 0x7a, 0xf7, 0xf7, 0x5, 0xfb,
+                                                             0x12, 0x6, 0xfb, 0x33, 0xfb, 0xf7, 0x51, 0xa,
+                                                             0x69, 0xf7, 0xf7, 0x5, 0xfb, 0xf, 0x6, 0xe,
+                                                             0x3c, 0x79, 0xa, 0x9a, 0x16, 0xf7, 0x3f, 0x6,
+                                                             0xf7, 0x16, 0xf7, 0x2b, 0xd4, 0xfb, 0x2b, 0x5,
+                                                             0xf7, 0x29, 0x6, 0xfb, 0x17, 0xf7, 0x97, 0xf7,
+                                                             0x85, 0xf7, 0xa5, 0x5, 0xfb, 0x3e, 0x6, 0xfb,
+                                                             0x18, 0xfb, 0x28, 0x41, 0xf7, 0x28, 0x53, 0xa,
+                                                             0xf7, 0x18, 0xfb, 0x96, 0x5, 0xe, 0x3c, 0xfb,
+                                                             0x6a, 0xf7, 0x9, 0xf9, 0x9, 0x77, 0x1, 0xc2,
+                                                             0x34, 0x15, 0x7e, 0xfb, 0x0, 0x5, 0x7e, 0xad,
+                                                             0xaa, 0x85, 0xa6, 0x1b, 0xe2, 0xc5, 0xcd, 0xf0,
+                                                             0xc3, 0x1f, 0xf7, 0xd1, 0xf8, 0xd7, 0x77, 0xa,
+                                                             0xfc, 0x27, 0x51, 0xa, 0x59, 0xf8, 0x27, 0x54,
+                                                             0xa, 0xe5, 0xfc, 0xa3, 0x5, 0x4c, 0x6f, 0x6c,
+                                                             0x64, 0x5c, 0x1b, 0x7d, 0x7b, 0x8e, 0x92, 0x79,
+                                                             0x1f, 0xe, 0xfb, 0x1b, 0x8b, 0xf7, 0xa, 0xf7,
+                                                             0xc1, 0xf7, 0x5, 0x1, 0x9f, 0x16, 0xf8, 0x70,
+                                                             0x6, 0xa5, 0xf7, 0xa, 0x5, 0xfb, 0xac, 0x6,
+                                                             0xf7, 0xd6, 0xf7, 0xdc, 0x9e, 0xe1, 0x5, 0xfc,
+                                                             0x5c, 0x6, 0x71, 0xfb, 0x5, 0x5, 0xf7, 0x98,
+                                                             0x6, 0xfb, 0xd3, 0xfb, 0xd5, 0x5, 0xe, 0x73,
+                                                             0xa, 0xf7, 0xb2, 0xf7, 0x7, 0x1, 0x14, 0xe0,
+                                                             0xe9, 0xf7, 0x61, 0x15, 0xef, 0x79, 0x3f, 0xfb,
+                                                             0x4, 0x74, 0x1f, 0xfb, 0x2f, 0x69, 0xb1, 0x51,
+                                                             0xf7, 0x1e, 0x1b, 0xa3, 0x6, 0xa3, 0xf7, 0x7,
+                                                             0x5, 0x49, 0x72, 0x8e, 0xcc, 0x98, 0x1f, 0xb4,
+                                                             0xf7, 0x4e, 0x82, 0xbd, 0x52, 0xb3, 0xd3, 0xb5,
+                                                             0xa8, 0xac, 0xb7, 0xf7, 0x5c, 0x8, 0xcb, 0x98,
+                                                             0xa0, 0x90, 0xd6, 0x1b, 0xa3, 0xf7, 0x7, 0x5,
+                                                             0x73, 0x6, 0xfb, 0x50, 0x77, 0x32, 0xfb, 0x23,
+                                                             0x6c, 0x1f, 0xfb, 0x9, 0x72, 0x7f, 0x57, 0x27,
+                                                             0x1b, 0xe, 0xfb, 0xf7, 0xfb, 0x50, 0x76, 0xfa,
+                                                             0x46, 0x77, 0x1, 0xbd, 0xfb, 0x65, 0x15, 0xf7,
+                                                             0x3, 0x6, 0xf7, 0x5e, 0xfa, 0x46, 0x5, 0xfb,
+                                                             0x3, 0x6, 0xe, 0x73, 0xa, 0xf8, 0x25, 0x77,
+                                                             0x1, 0x93, 0x3a, 0x15, 0x71, 0xfb, 0x7, 0x5,
+                                                             0xf7, 0x66, 0x9f, 0xe4, 0xf7, 0x23, 0xac, 0x1f,
+                                                             0xf7, 0x9, 0xa5, 0xa8, 0xbf, 0xdd, 0x1b, 0xa4,
+                                                             0xf7, 0x8, 0x5, 0x29, 0x9c, 0xd7, 0xf7, 0x4,
+                                                             0xa4, 0x1f, 0x94, 0xae, 0x8e, 0xa9, 0xa5, 0x1a,
+                                                             0xe3, 0x59, 0xad, 0xfb, 0x10, 0x1e, 0x71, 0xfb,
+                                                             0x7, 0x5, 0xc0, 0xa6, 0x89, 0x67, 0x83, 0x8a,
+                                                             0x82, 0x88, 0x7e, 0x1f, 0x61, 0xfb, 0x4e, 0x94,
+                                                             0x59, 0xc4, 0x63, 0x41, 0x61, 0x6e, 0x6a, 0x5f,
+                                                             0xfb, 0x5c, 0x8, 0x4b, 0x7c, 0x77, 0x86, 0x42,
+                                                             0x1b, 0xe, 0x58, 0xf7, 0x4d, 0x76, 0xf7, 0x47,
+                                                             0x77, 0x1, 0xf7, 0x7, 0xf8, 0x62, 0x3, 0xf7,
+                                                             0x7, 0xf7, 0x37, 0x15, 0xc2, 0xbf, 0xb3, 0x91,
+                                                             0xa6, 0x1b, 0xbc, 0xab, 0x7d, 0x7c, 0xa9, 0x1f,
+                                                             0x7b, 0xaa, 0xa9, 0x7c, 0xb4, 0x1b, 0xd0, 0xbf,
+                                                             0xbc, 0x95, 0x94, 0x1f, 0xf7, 0xc, 0x7, 0x4d,
+                                                             0x53, 0x56, 0x89, 0x81, 0x1b, 0x69, 0x6d, 0x97,
+                                                             0x98, 0x6e, 0x1f, 0x9b, 0x64, 0x66, 0x9e, 0x5d,
+                                                             0x1b, 0x75, 0x57, 0x8b, 0x4e, 0x55, 0x1f, 0xe,
+                                                             0xe2, 0x8b, 0xf7, 0xc, 0xf8, 0x6f, 0xf7, 0xf,
+                                                             0x1, 0xf7, 0x8, 0xf7, 0x1f, 0x3, 0x9f, 0xf7,
+                                                             0x94, 0x15, 0xeb, 0x6, 0xfb, 0x32, 0x9a, 0xec,
+                                                             0x29, 0xf7, 0x4b, 0x1b, 0xbb, 0xba, 0x93, 0x9a,
+                                                             0xb9, 0x1f, 0xaf, 0xf7, 0x25, 0x5, 0x6b, 0x5c,
+                                                             0x53, 0x7b, 0x4c, 0x1b, 0x38, 0x3a, 0xca, 0xd4,
+                                                             0x88, 0x1f, 0xf7, 0xda, 0x6, 0x9b, 0xd4, 0x5,
+                                                             0xfb, 0xe7, 0x6, 0x8f, 0xaa, 0x90, 0xa1, 0x8d,
+                                                             0x94, 0x8, 0xf7, 0xe9, 0x6, 0x9b, 0xd4, 0x5,
+                                                             0xfb, 0xdf, 0x6, 0xe2, 0xb9, 0xdb, 0xb7, 0xeb,
+                                                             0x1b, 0xc4, 0xb5, 0x81, 0x6a, 0xa6, 0x1f, 0xc6,
+                                                             0x55, 0xa, 0xa8, 0x5a, 0x4e, 0x9a, 0x43, 0x1b,
+                                                             0xfb, 0x49, 0xfb, 0x20, 0x23, 0xfb, 0x2a, 0x54,
+                                                             0x1f, 0xfb, 0x0, 0x6, 0x7b, 0x42, 0x5, 0xf4,
+                                                             0x6, 0x87, 0x71, 0x89, 0x76, 0x8a, 0x7c, 0x8,
+                                                             0x39, 0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x11, 0x76,
+                                                             0xf7, 0x3a, 0x76, 0xf7, 0x14, 0x77, 0x1, 0xd3,
+                                                             0x8a, 0x15, 0xc9, 0x6, 0x7e, 0x52, 0x73, 0x7a,
+                                                             0x60, 0x82, 0x7e, 0x4d, 0x18, 0xf7, 0x1d, 0x3e,
+                                                             0xa, 0xfb, 0x1d, 0x6, 0xe, 0x3c, 0xfb, 0x51,
+                                                             0x76, 0xf9, 0xcf, 0x96, 0xa, 0x88, 0x3b, 0x15,
+                                                             0x5c, 0xfb, 0x3, 0x5, 0x7d, 0xb6, 0xc5, 0x86,
+                                                             0xaa, 0x1b, 0xf7, 0x15, 0xbb, 0xf7, 0xf, 0xd9,
+                                                             0xa6, 0x1f, 0xf7, 0x27, 0xf8, 0x3e, 0x5, 0xef,
+                                                             0x6, 0xae, 0xf4, 0x5, 0x27, 0x6, 0xcd, 0xa2,
+                                                             0x96, 0xa8, 0xba, 0x1b, 0xa9, 0xa9, 0x81, 0x87,
+                                                             0x98, 0x1f, 0xba, 0xf7, 0x5, 0x5, 0x9e, 0x50,
+                                                             0x52, 0x8d, 0x80, 0x1b, 0xfb, 0x1e, 0x7b, 0x35,
+                                                             0xfb, 0x15, 0x51, 0x1f, 0x2a, 0x6, 0x67, 0x22,
+                                                             0x5, 0xed, 0x6, 0xfb, 0x26, 0xfc, 0x3c, 0x5,
+                                                             0x4f, 0x77, 0x75, 0x72, 0x6b, 0x1b, 0x77, 0x78,
+                                                             0x8d, 0x95, 0x64, 0x1f, 0xe, 0xfb, 0x1b, 0xfb,
+                                                             0x11, 0x76, 0xf7, 0x25, 0xf7, 0x14, 0x1, 0xf7,
+                                                             0xbd, 0x8a, 0x61, 0xa, 0xf7, 0x1f, 0x3e, 0xa,
+                                                             0xfb, 0x1e, 0x6, 0xfb, 0x96, 0xfb, 0x14, 0x61,
+                                                             0xa, 0x56, 0xa, 0xe, 0xf8, 0x1, 0x8b, 0xf7,
+                                                             0x26, 0x1, 0xf9, 0x92, 0x16, 0x4b, 0xa, 0xfd,
+                                                             0x53, 0xfb, 0x26, 0x15, 0x4b, 0xa, 0xf7, 0xc8,
+                                                             0xfb, 0x26, 0x15, 0x4b, 0xa, 0xe, 0x3c, 0xfb,
+                                                             0x2a, 0x76, 0xf8, 0xdb, 0xf7, 0x3, 0xf7, 0x57,
+                                                             0x77, 0x1, 0xf7, 0x45, 0xfb, 0x3f, 0x15, 0xf7,
+                                                             0x18, 0x6, 0xf7, 0xc, 0xf8, 0xdb, 0x5, 0xf7,
+                                                             0x42, 0x6, 0xa2, 0xf7, 0x3, 0x5, 0xfb, 0x43,
+                                                             0x6, 0xb4, 0xf7, 0x57, 0x66, 0xa, 0x62, 0xfb,
+                                                             0x57, 0x5, 0xfb, 0x48, 0x6, 0x75, 0xfb, 0x3,
+                                                             0x5, 0xf7, 0x48, 0x6, 0xe, 0x3c, 0xfb, 0x2a,
+                                                             0x76, 0xf7, 0x42, 0xf7, 0x3, 0xf7, 0xd7, 0xf7,
+                                                             0x3, 0xf7, 0x3e, 0x77, 0x1, 0xb9, 0x8e, 0x15,
+                                                             0xf7, 0x43, 0x6, 0x69, 0xfb, 0x42, 0x5, 0xf7,
+                                                             0x14, 0x6, 0xad, 0xf7, 0x42, 0x5, 0xf7, 0x3d,
+                                                             0x89, 0xa, 0xcc, 0xf7, 0xd7, 0x5, 0xf7, 0x3e,
+                                                             0x89, 0xa, 0xac, 0xf7, 0x3e, 0x5, 0xfb, 0x13,
+                                                             0x6, 0x69, 0xfb, 0x3e, 0x5, 0xfb, 0x44, 0x6,
+                                                             0x75, 0xfb, 0x3, 0x5, 0xf7, 0x43, 0x6, 0x4b,
+                                                             0xfb, 0xd7, 0x5, 0xfb, 0x44, 0x6, 0xe, 0x72,
+                                                             0xa, 0xf7, 0xa, 0xf8, 0xf0, 0x8f, 0xa, 0xe4,
+                                                             0xe1, 0xb3, 0x35, 0x5, 0xf1, 0x6, 0x4c, 0xf7,
+                                                             0x26, 0x81, 0xa, 0xf8, 0x1, 0x7a, 0xdb, 0x4e,
+                                                             0x76, 0xf9, 0x1d, 0xdb, 0x12, 0x13, 0x60, 0xf7,
+                                                             0x3e, 0xf8, 0x6f, 0x15, 0x9b, 0xa1, 0xf7, 0x1f,
+                                                             0xc3, 0x9b, 0x9e, 0x76, 0x6e, 0x75, 0x77, 0xfb,
+                                                             0x17, 0x4f, 0x6a, 0x8b, 0xaa, 0x9c, 0x1e, 0x47,
+                                                             0xfc, 0x82, 0x15, 0xed, 0x6, 0xf8, 0x6a, 0xf9,
+                                                             0x6d, 0x5, 0x26, 0x6, 0xfc, 0x81, 0xfb, 0x7f,
+                                                             0x15, 0xfb, 0x1, 0xd3, 0x79, 0xba, 0xf7, 0x1c,
+                                                             0xb8, 0xf7, 0x36, 0xd1, 0xb5, 0x79, 0xe3, 0x21,
+                                                             0xfb, 0x2f, 0x76, 0xfb, 0x6b, 0x77, 0x1e, 0xf7,
+                                                             0xd7, 0xfc, 0x1, 0x15, 0x13, 0xa0, 0xfb, 0x1,
+                                                             0xd1, 0x79, 0xbb, 0xf7, 0x1c, 0xb8, 0xf7, 0x3e,
+                                                             0xd0, 0xb5, 0x79, 0xdc, 0x21, 0x74, 0xa, 0xa1,
+                                                             0xf7, 0x1f, 0xc3, 0x9a, 0x9e, 0x7e, 0x6d, 0x76,
+                                                             0x77, 0xfb, 0x1e, 0x51, 0x69, 0x8b, 0xaa, 0x9b,
+                                                             0x1e, 0xf7, 0x8b, 0x16, 0xfb, 0x1, 0xd1, 0x79,
+                                                             0xba, 0xf7, 0x1e, 0xb7, 0xf7, 0x3d, 0xcf, 0xb2,
+                                                             0x7b, 0xe1, 0xfb, 0x0, 0x74, 0xa, 0xa0, 0xf7,
+                                                             0x1f, 0xc4, 0x9a, 0x9e, 0x7c, 0x6d, 0x76, 0x77,
+                                                             0xfb, 0x1c, 0x50, 0x6a, 0x8b, 0xaa, 0x9b, 0x1e,
+                                                             0xe, 0xab, 0x78, 0xf7, 0x14, 0x12, 0xdc, 0xf7,
+                                                             0x26, 0x53, 0xf7, 0x26, 0xf7, 0x5b, 0xf7, 0x2c,
+                                                             0x2a, 0xf7, 0x27, 0x13, 0xd0, 0xdc, 0xf7, 0x7e,
+                                                             0x15, 0xfb, 0x46, 0xf7, 0x28, 0x40, 0xf7, 0x24,
+                                                             0xf7, 0x67, 0xdf, 0xf7, 0x2, 0xf7, 0x1, 0xf7,
+                                                             0x12, 0x34, 0xc4, 0xfb, 0x14, 0xc2, 0x1e, 0x13,
+                                                             0xa8, 0x35, 0xb0, 0x59, 0x8e, 0xc0, 0x1a, 0xd8,
+                                                             0xe7, 0x9e, 0xa5, 0xd1, 0xc5, 0x73, 0x35, 0x93,
+                                                             0x1e, 0xf7, 0x27, 0x92, 0x5, 0xf7, 0x37, 0x80,
+                                                             0xfb, 0x14, 0xc8, 0xfb, 0x23, 0x1b, 0xfb, 0x65,
+                                                             0x53, 0xfb, 0x14, 0x32, 0xfb, 0x15, 0xe5, 0x6e,
+                                                             0xf7, 0x15, 0x53, 0x1f, 0x13, 0xd0, 0xdc, 0x68,
+                                                             0xb8, 0x6e, 0x56, 0x1a, 0x3d, 0x32, 0x7e, 0x57,
+                                                             0xfb, 0x23, 0x88, 0xcf, 0xcb, 0x89, 0x1e, 0xf7,
+                                                             0x3e, 0xf8, 0xb3, 0x15, 0xf7, 0x1d, 0x6, 0xf7,
+                                                             0x2b, 0x5d, 0xa, 0xfb, 0xd, 0x6, 0x32, 0x31,
+                                                             0x64, 0xe5, 0x5, 0x26, 0x6, 0xe, 0x58, 0xa,
+                                                             0xf7, 0x62, 0xd7, 0x15, 0xd0, 0x6, 0x5e, 0xf7,
+                                                             0x65, 0xf7, 0xf, 0xf7, 0x5b, 0x5, 0x39, 0x6,
+                                                             0xfb, 0x21, 0xfb, 0x5b, 0x5, 0xe, 0xf8, 0x1,
+                                                             0x78, 0xf7, 0xd, 0xfb, 0x1, 0xf7, 0x1, 0xfb,
+                                                             0x1, 0xf7, 0xf, 0xf7, 0x5c, 0xf7, 0xf, 0xf7,
+                                                             0x37, 0xf7, 0xf, 0xfb, 0x1, 0xf7, 0xd, 0x12,
+                                                             0xee, 0xf7, 0x19, 0x13, 0x3a, 0xf8, 0x84, 0x84,
+                                                             0x15, 0xf8, 0x88, 0x71, 0xa, 0xfb, 0xfc, 0x6,
+                                                             0xb4, 0xf7, 0x5c, 0x5, 0xf7, 0xc7, 0x71, 0xa,
+                                                             0xfb, 0xc8, 0x6, 0xac, 0xf7, 0x37, 0x5, 0xf7,
+                                                             0xdc, 0x6, 0xa4, 0xf7, 0xf, 0x5, 0xfc, 0x68,
+                                                             0x6, 0x7a, 0x39, 0x5, 0x13, 0x96, 0xd6, 0x62,
+                                                             0x3c, 0x9e, 0x57, 0x1b, 0xfb, 0x52, 0xfb, 0x3c,
+                                                             0xfb, 0x57, 0xfb, 0xab, 0xfb, 0x61, 0xf7, 0x12,
+                                                             0x3e, 0xf7, 0x12, 0xe3, 0xb4, 0xb1, 0xad, 0xa5,
+                                                             0x1f, 0x8d, 0x88, 0x5, 0x13, 0x56, 0xfb, 0xa8,
+                                                             0xf7, 0x69, 0x15, 0xf7, 0x12, 0xc5, 0xf7, 0x77,
+                                                             0xf7, 0x38, 0xe1, 0xb7, 0x4a, 0x3e, 0x4e, 0x76,
+                                                             0xfb, 0x9, 0x6f, 0x42, 0x1e, 0x6f, 0x80, 0x63,
+                                                             0x2e, 0x20, 0x1b, 0x38, 0x4d, 0xc5, 0xf2, 0x1f,
+                                                             0xe, 0xfb, 0xf9, 0xf8, 0x6f, 0x76, 0xf7, 0xa5,
+                                                             0x77, 0x1, 0xf7, 0x39, 0xf8, 0x5a, 0x8e, 0xa,
+                                                             0xa6, 0xf7, 0x15, 0x5, 0x4d, 0x6, 0x97, 0xc4,
+                                                             0xa4, 0x9a, 0xb6, 0x95, 0x98, 0xc9, 0x18, 0xfb,
+                                                             0x1e, 0x88, 0x74, 0xfb, 0x1, 0x7f, 0x54, 0x8,
+                                                             0xe, 0xfb, 0xf9, 0xf8, 0x66, 0x76, 0xf7, 0xa5,
+                                                             0x77, 0x1, 0xf7, 0x3b, 0xf8, 0x51, 0x15, 0xf7,
+                                                             0x1d, 0x3e, 0xa, 0xfb, 0x1d, 0x6, 0x70, 0xfb,
+                                                             0x15, 0x5, 0xc9, 0x6, 0x7e, 0x53, 0x73, 0x7b,
+                                                             0x60, 0x81, 0x8, 0xe, 0xfb, 0x1b, 0xf8, 0x5a,
+                                                             0xf7, 0x14, 0xf7, 0x25, 0x77, 0x1, 0xf7, 0x34,
+                                                             0xf8, 0x5a, 0x15, 0xf7, 0x1f, 0x6, 0xa6, 0xf7,
+                                                             0x14, 0x5, 0x4d, 0x6, 0x97, 0xc3, 0xa4, 0x9d,
+                                                             0xb7, 0x94, 0x97, 0xc9, 0x18, 0xfb, 0x1e, 0x88,
+                                                             0x73, 0xfb, 0x3, 0x7f, 0x55, 0x8, 0xf7, 0x64,
+                                                             0x22, 0x8e, 0xa, 0xa7, 0xf7, 0x14, 0x5, 0x4c,
+                                                             0x6, 0x98, 0xc3, 0xa3, 0x9d, 0xb7, 0x94, 0x98,
+                                                             0xc9, 0x18, 0xfb, 0x1f, 0x88, 0x74, 0xfb, 0x3,
+                                                             0x7f, 0x55, 0x8, 0xe, 0xfb, 0x1b, 0xf8, 0x66,
+                                                             0x76, 0xf7, 0x24, 0xf7, 0x15, 0x1, 0xf8, 0x1c,
+                                                             0xf8, 0x51, 0x15, 0xf7, 0x1f, 0x3e, 0xa, 0xfb,
+                                                             0x1e, 0x6, 0x6f, 0x62, 0xa, 0xfb, 0x87, 0x4d,
+                                                             0x15, 0x56, 0xa, 0x70, 0x62, 0xa, 0xe, 0xfb,
+                                                             0xb1, 0xf7, 0x6b, 0x76, 0xf7, 0xde, 0x77, 0x1,
+                                                             0xde, 0xf7, 0xfd, 0x15, 0x2f, 0xd7, 0x40, 0xe7,
+                                                             0xe7, 0xd8, 0xd5, 0xe8, 0xe9, 0x3e, 0xd0, 0x2f,
+                                                             0x2e, 0x40, 0x44, 0x2f, 0x1e, 0xe, 0x3c, 0x88,
+                                                             0xa, 0xf8, 0xd7, 0xf5, 0xfc, 0xd7, 0x6, 0xe,
+                                                             0xf8, 0x1, 0x88, 0xa, 0xfa, 0x93, 0xf5, 0xfe,
+                                                             0x93, 0x6, 0xe, 0xf8, 0xf6, 0xf7, 0x13, 0x38,
+                                                             0xde, 0x89, 0x77, 0x12, 0x13, 0x80, 0xf7, 0x5,
+                                                             0xf8, 0xf6, 0x15, 0xd4, 0x6, 0x13, 0x40, 0x8f,
+                                                             0x9a, 0x96, 0xa7, 0xae, 0x8c, 0x8, 0xaa, 0xa2,
+                                                             0x81, 0x81, 0xa3, 0x1f, 0x81, 0xa2, 0xa2, 0x80,
+                                                             0xaa, 0x1b, 0xc1, 0xbb, 0xb5, 0xdd, 0x99, 0x1f,
+                                                             0x41, 0x6, 0x72, 0x83, 0x83, 0x7a, 0x74, 0x1b,
+                                                             0x75, 0x75, 0x93, 0x93, 0x72, 0x1f, 0x13, 0x20,
+                                                             0x96, 0x6c, 0x6a, 0x98, 0x69, 0x1b, 0x13, 0x80,
+                                                             0x3d, 0x72, 0x42, 0x57, 0x80, 0x1f, 0xe, 0xf8,
+                                                             0x1, 0xf7, 0xdb, 0x76, 0xf7, 0xe7, 0xd4, 0x1,
+                                                             0xf7, 0x68, 0xe5, 0xf7, 0x58, 0xe0, 0xf7, 0xd0,
+                                                             0xe0, 0x3, 0xf7, 0x68, 0xf7, 0xc6, 0x15, 0xe5,
+                                                             0xf7, 0xe7, 0xf7, 0x2e, 0xd4, 0xfc, 0x26, 0x42,
+                                                             0xf7, 0x32, 0x6, 0xf7, 0xb2, 0xfb, 0xe7, 0x15,
+                                                             0xe0, 0xf7, 0xdc, 0x8d, 0x6, 0xf7, 0x8, 0xfb,
+                                                             0xdc, 0x5, 0xdb, 0x6, 0xf7, 0x7, 0xf7, 0xdc,
+                                                             0x5, 0x8e, 0xfb, 0xdc, 0xe0, 0xf8, 0x30, 0xfb,
+                                                             0x21, 0x6, 0x26, 0xfb, 0xaf, 0x51, 0xa, 0x25,
+                                                             0xf7, 0xaf, 0x5, 0xfb, 0x20, 0x6, 0xe, 0x3c,
+                                                             0x7d, 0xef, 0xf8, 0x94, 0xf7, 0x2c, 0x1, 0xf7,
+                                                             0x24, 0xf7, 0x1c, 0xf7, 0x26, 0xf7, 0x28, 0x3,
+                                                             0xca, 0xf7, 0x28, 0x15, 0xfb, 0x7, 0xad, 0xe9,
+                                                             0x5c, 0xf7, 0x1e, 0x1b, 0xf7, 0x51, 0xc3, 0xe5,
+                                                             0xd3, 0xf4, 0xfb, 0x4, 0xc5, 0x3a, 0xa3, 0x1f,
+                                                             0x41, 0xa1, 0x70, 0x8b, 0xab, 0x1a, 0xa4, 0xa4,
+                                                             0xab, 0xc7, 0x9b, 0xd4, 0x8b, 0x4b, 0xa2, 0x1e,
+                                                             0xf7, 0x1a, 0xa3, 0x5, 0xf7, 0x11, 0x6f, 0xfb,
+                                                             0xc, 0x9b, 0x40, 0x1b, 0xfb, 0x3a, 0x3d, 0x46,
+                                                             0x32, 0x27, 0xdc, 0x69, 0xe6, 0x6c, 0x1f, 0xef,
+                                                             0x69, 0x95, 0x7e, 0x6e, 0x1a, 0x67, 0x5a, 0x71,
+                                                             0x58, 0x3d, 0x70, 0xb3, 0xb8, 0x7a, 0x1e, 0xf7,
+                                                             0x11, 0xf8, 0x3f, 0x15, 0x82, 0xa, 0xf7, 0x2a,
+                                                             0x5d, 0xa, 0xfb, 0xc, 0x6, 0x33, 0x31, 0x64,
+                                                             0xe5, 0x5, 0x27, 0x6, 0xe, 0x58, 0xa, 0xee,
+                                                             0xd7, 0x15, 0xdd, 0x6, 0xf7, 0x21, 0xf7, 0x55,
+                                                             0x3f, 0xf7, 0x6b, 0x5, 0x46, 0x6, 0xb8, 0xfb,
+                                                             0x6b, 0x5, 0xe, 0xf7, 0xc9, 0x7d, 0xf1, 0x25,
+                                                             0xf7, 0x2, 0xf7, 0x10, 0xe3, 0xf7, 0x15, 0xf7,
+                                                             0x1, 0x24, 0xf2, 0x12, 0xdd, 0xf7, 0x21, 0xf7,
+                                                             0x98, 0xf7, 0x15, 0x13, 0xb6, 0xf8, 0xa5, 0xcc,
+                                                             0x15, 0x56, 0xb8, 0xd0, 0x71, 0xd0, 0x1b, 0xf7,
+                                                             0x2a, 0xca, 0xf7, 0x1, 0xb9, 0xa5, 0x1f, 0xfb,
+                                                             0x13, 0xa2, 0x5, 0x69, 0x7b, 0x6a, 0x61, 0x4d,
+                                                             0x1b, 0x68, 0x47, 0xa4, 0xf6, 0x8d, 0x1f, 0xf7,
+                                                             0xf6, 0x6, 0x94, 0xae, 0x8d, 0xb0, 0xaf, 0x1a,
+                                                             0xec, 0x4c, 0xf7, 0xd, 0xfb, 0x2b, 0x74, 0x33,
+                                                             0x89, 0x42, 0x39, 0x1e, 0xca, 0x51, 0x45, 0x97,
+                                                             0x53, 0x1b, 0xfb, 0xaa, 0x71, 0xfb, 0xa5, 0x4a,
+                                                             0xfb, 0xa, 0xcf, 0x23, 0xf7, 0x45, 0xd6, 0xd5,
+                                                             0xa5, 0xc0, 0xc0, 0x1f, 0xec, 0xf7, 0x87, 0x15,
+                                                             0x13, 0xae, 0xa8, 0x92, 0xa4, 0xf5, 0xe9, 0x1b,
+                                                             0xf0, 0x86, 0xfb, 0x4, 0x74, 0x8a, 0x1f, 0xfd,
+                                                             0x4, 0x27, 0x15, 0x13, 0x76, 0xf7, 0x5, 0xc0,
+                                                             0xf7, 0x8, 0xf0, 0xb7, 0xc9, 0x6f, 0x29, 0x43,
+                                                             0x65, 0xfb, 0x23, 0xfb, 0x9, 0x47, 0x66, 0xc1,
+                                                             0xc5, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf9, 0x6d,
+                                                             0x77, 0xdf, 0xf7, 0xe, 0x1, 0x64, 0xa, 0xf7,
+                                                             0xa2, 0xf7, 0xcc, 0xf8, 0x5f, 0x43, 0xa, 0xfb,
+                                                             0x5d, 0xfb, 0xcc, 0xfb, 0x10, 0xf7, 0xcc, 0x5a,
+                                                             0xa, 0xf7, 0x51, 0xfc, 0x50, 0x5, 0x8a, 0xf8,
+                                                             0x90, 0x15, 0xf7, 0x6, 0x6, 0xa3, 0x55, 0xa,
+                                                             0xfb, 0x7, 0x6, 0xf7, 0x40, 0xfb, 0xe, 0x15,
+                                                             0xf7, 0x6, 0x6, 0xa3, 0x55, 0xa, 0xfb, 0x6,
+                                                             0x6, 0xe, 0xfb, 0x39, 0x76, 0xf8, 0xab, 0x77,
+                                                             0xcf, 0xf7, 0x1b, 0x1, 0xf7, 0x46, 0xf8, 0x21,
+                                                             0x15, 0xf7, 0x25, 0x6, 0xa9, 0xf7, 0x1b, 0x93,
+                                                             0xa, 0xfb, 0xb, 0xfc, 0xb9, 0x15, 0x65, 0xfb,
+                                                             0x3d, 0x5, 0xf7, 0x2b, 0x6, 0xb0, 0xf7, 0x3d,
+                                                             0xb9, 0xf8, 0x2, 0x5, 0x3a, 0x6, 0xe, 0x3c,
+                                                             0x2a, 0x76, 0xf6, 0xf5, 0xf7, 0xed, 0xe9, 0xe9,
+                                                             0x77, 0x1, 0xda, 0xf7, 0x1b, 0x3, 0xf7, 0x24,
+                                                             0x2c, 0x15, 0xc9, 0x74, 0xbe, 0xf7, 0x3, 0x5,
+                                                             0x89, 0x95, 0x9b, 0x89, 0xa1, 0x1b, 0xf7, 0x2f,
+                                                             0xd5, 0xf7, 0x3, 0xd8, 0xa6, 0x1f, 0xfb, 0x19,
+                                                             0x9f, 0x73, 0x50, 0x64, 0x5c, 0x4b, 0x8f, 0x19,
+                                                             0xf7, 0x1c, 0xf7, 0xd8, 0xa0, 0x79, 0x96, 0x72,
+                                                             0x8d, 0x6d, 0x19, 0xf7, 0x14, 0x99, 0x85, 0xe3,
+                                                             0x4f, 0xbb, 0x54, 0xa0, 0x19, 0xb0, 0xe2, 0x4f,
+                                                             0xa3, 0x61, 0x2b, 0x5, 0x8c, 0x85, 0x81, 0x8c,
+                                                             0x7b, 0x1b, 0xfb, 0x39, 0xfb, 0x1d, 0xfb, 0x20,
+                                                             0xfb, 0x57, 0x2a, 0xb6, 0x4f, 0xd3, 0x6b, 0x1f,
+                                                             0xb9, 0xf7, 0x2, 0x15, 0x82, 0x93, 0x7a, 0x9e,
+                                                             0xbf, 0x1a, 0xd2, 0xab, 0xf7, 0x35, 0xf7, 0x14,
+                                                             0x94, 0x1e, 0xe, 0x3c, 0x90, 0x76, 0xa6, 0x76,
+                                                             0xf7, 0xc8, 0xf7, 0x0, 0xf7, 0x61, 0xf6, 0x12,
+                                                             0xf7, 0x4b, 0xf7, 0x14, 0x13, 0xb8, 0xcb, 0x7b,
+                                                             0x15, 0x9c, 0xaa, 0xc2, 0xa3, 0xc4, 0x1b, 0xbb,
+                                                             0xa9, 0x82, 0x82, 0xaa, 0x1f, 0x13, 0x78, 0x82,
+                                                             0xa9, 0xab, 0x83, 0xbc, 0x1b, 0xc5, 0xaf, 0x9a,
+                                                             0x98, 0xaf, 0x1f, 0x61, 0xf7, 0xb, 0x5, 0x71,
+                                                             0x53, 0x68, 0x8b, 0x78, 0x1b, 0x7e, 0x41, 0x97,
+                                                             0x84, 0xad, 0x1f, 0x86, 0xa4, 0x3e, 0x97, 0x74,
+                                                             0x1b, 0x75, 0x78, 0x87, 0x81, 0x7e, 0x1f, 0x89,
+                                                             0x8d, 0xca, 0xc2, 0xad, 0xbd, 0x90, 0xdd, 0x19,
+                                                             0xe9, 0x6, 0xa2, 0xf7, 0x0, 0x7a, 0xa, 0x87,
+                                                             0xa1, 0x88, 0xa1, 0xa3, 0x1a, 0xe9, 0xc2, 0xb6,
+                                                             0xc0, 0xd7, 0x96, 0x44, 0x72, 0x8f, 0x1e, 0xf7,
+                                                             0x11, 0x98, 0x5, 0xea, 0x84, 0x4f, 0xea, 0xfb,
+                                                             0x23, 0x1b, 0xfb, 0x28, 0x2d, 0xfb, 0x8, 0xfb,
+                                                             0x14, 0x85, 0x8b, 0x75, 0x93, 0x63, 0x1f, 0x3d,
+                                                             0x6, 0x75, 0xfb, 0x0, 0x5, 0xf7, 0x3, 0x6,
+                                                             0x7e, 0xfb, 0x9, 0x23, 0x52, 0x68, 0x7c, 0x8,
+                                                             0xe, 0x3c, 0xec, 0x76, 0xb5, 0xf7, 0x16, 0xf7,
+                                                             0x69, 0xf7, 0x16, 0xb8, 0x77, 0x1, 0xdc, 0xd8,
+                                                             0x15, 0xe6, 0xd2, 0x5, 0x78, 0xa6, 0xad, 0x80,
+                                                             0xb1, 0x1b, 0xb5, 0xb7, 0x97, 0x9e, 0xae, 0x1f,
+                                                             0xb8, 0x42, 0xf7, 0x7, 0xe6, 0x5f, 0xd3, 0xaa,
+                                                             0xae, 0xa4, 0xb4, 0x99, 0xb5, 0x19, 0x92, 0xa0,
+                                                             0x91, 0xa6, 0xa7, 0x1a, 0x98, 0x8b, 0x98, 0x88,
+                                                             0x99, 0x1e, 0xe7, 0xd3, 0x55, 0xe6, 0x2e, 0x42,
+                                                             0x5, 0x95, 0x7d, 0x6e, 0x9d, 0x52, 0x1b, 0x51,
+                                                             0x60, 0x79, 0x81, 0x77, 0x1f, 0x5e, 0xd4, 0xfb,
+                                                             0x8, 0x2b, 0xb5, 0x46, 0x6e, 0x69, 0x74, 0x62,
+                                                             0x7e, 0x62, 0x19, 0x82, 0x71, 0x80, 0x60, 0x93,
+                                                             0x5c, 0x32, 0x44, 0x18, 0xf7, 0x74, 0xf7, 0x51,
+                                                             0x15, 0xc6, 0x9e, 0xc9, 0xb8, 0xc3, 0x1b, 0xb7,
+                                                             0xa8, 0x6f, 0x62, 0x80, 0x89, 0x7f, 0x87, 0x7f,
+                                                             0x1f, 0x4f, 0x77, 0x4b, 0x5a, 0x53, 0x1b, 0x53,
+                                                             0x6e, 0xbc, 0xc7, 0xa0, 0x1f, 0xe, 0x3c, 0xa0,
+                                                             0x76, 0xf7, 0x21, 0xe6, 0xf8, 0x66, 0x77, 0x1,
+                                                             0xc7, 0xf7, 0x21, 0x15, 0xf7, 0x4d, 0x6, 0x6d,
+                                                             0xfb, 0x21, 0x5, 0xf7, 0x20, 0x6, 0xab, 0xf7,
+                                                             0x21, 0x5, 0xf7, 0x4b, 0x6, 0x9f, 0xe6, 0x5,
+                                                             0xfb, 0x4c, 0x6, 0x9c, 0xd7, 0x5, 0xf7, 0x4b,
+                                                             0x6, 0x9f, 0xe7, 0x5, 0xfb, 0x13, 0x6, 0xf7,
+                                                             0x6a, 0xf7, 0xbe, 0x43, 0xa, 0xfb, 0x4b, 0xfb,
+                                                             0xbe, 0x51, 0xa, 0x40, 0xf7, 0xbe, 0x44, 0xa,
+                                                             0xe8, 0xfb, 0xbe, 0x5, 0xfb, 0xf, 0x6, 0x78,
+                                                             0x2f, 0x5, 0xf7, 0x4d, 0x6, 0x7b, 0x3f, 0x5,
+                                                             0xfb, 0x4e, 0x6, 0xe, 0xfb, 0xf7, 0x78, 0xa,
+                                                             0xdb, 0x78, 0x15, 0xf7, 0x0, 0x6, 0xce, 0xf7,
+                                                             0xc9, 0x5, 0xfb, 0x0, 0x6, 0xaa, 0xf7, 0x1d,
+                                                             0x15, 0xf7, 0x0, 0x6, 0xce, 0xf7, 0xca, 0x5,
+                                                             0xfb, 0x0, 0x6, 0xe, 0x3c, 0xfb, 0x4c, 0xe9,
+                                                             0xf9, 0x1e, 0xf7, 0x3b, 0x12, 0xf6, 0xf7, 0xd,
+                                                             0x78, 0xf7, 0x11, 0xa1, 0xf7, 0x16, 0x6b, 0xf7,
+                                                             0xa, 0x13, 0xe8, 0xc8, 0x77, 0x15, 0x35, 0x9c,
+                                                             0xd6, 0x3d, 0xf7, 0x1a, 0x1b, 0xf7, 0x1b, 0xcb,
+                                                             0xd6, 0xd5, 0xbd, 0x6f, 0xb7, 0x7d, 0x9e, 0x1f,
+                                                             0x13, 0xd4, 0xd5, 0xae, 0xc1, 0xc6, 0xd3, 0x1a,
+                                                             0xc6, 0x6e, 0xbe, 0x2f, 0xdb, 0x1e, 0x27, 0xe3,
+                                                             0x7a, 0x92, 0xb1, 0x1a, 0xa5, 0x9c, 0xb3, 0xba,
+                                                             0xcf, 0x8f, 0x4f, 0x78, 0x8d, 0x1e, 0xf7, 0x12,
+                                                             0x97, 0x5, 0xc4, 0x84, 0x72, 0xf3, 0xfb, 0x36,
+                                                             0x1b, 0xfb, 0x28, 0x5c, 0x30, 0x46, 0x75, 0x90,
+                                                             0x6d, 0xa3, 0x65, 0x1f, 0x13, 0xe8, 0x67, 0x79,
+                                                             0x2c, 0x63, 0x22, 0x1a, 0x76, 0x89, 0x4a, 0xe1,
+                                                             0x3e, 0x1e, 0xc8, 0x55, 0xf3, 0x48, 0x4a, 0x1a,
+                                                             0x83, 0x87, 0x5c, 0x4d, 0x60, 0x64, 0x9f, 0xd9,
+                                                             0x77, 0x1e, 0xf7, 0x57, 0xf7, 0x1c, 0x15, 0xfb,
+                                                             0x9, 0xf7, 0x2, 0x5, 0x65, 0xaf, 0x8b, 0x98,
+                                                             0x96, 0x1a, 0xb9, 0xad, 0xaa, 0xab, 0x9d, 0x1e,
+                                                             0x86, 0xe2, 0x40, 0x82, 0x8f, 0x1f, 0x13, 0xe4,
+                                                             0xb6, 0x64, 0xaa, 0x6e, 0x66, 0x1a, 0x5d, 0x51,
+                                                             0x71, 0x7e, 0x87, 0x1e, 0xe, 0xf8, 0xfa, 0xf7,
+                                                             0x7, 0x1, 0xf7, 0x1d, 0xf8, 0xfa, 0x69, 0xa,
+                                                             0xf7, 0x45, 0xfb, 0x7, 0x69, 0xa, 0xe, 0xf1,
+                                                             0x78, 0xd6, 0xe7, 0xd2, 0xf7, 0xab, 0xd2, 0xe8,
+                                                             0xd6, 0x1, 0xc3, 0xd8, 0xf9, 0x5, 0xd8, 0x3,
+                                                             0xf7, 0x19, 0xf7, 0xf8, 0x15, 0xf7, 0x3c, 0xf7,
+                                                             0x1d, 0xf7, 0x1e, 0xf7, 0x41, 0xf7, 0x41, 0xf7,
+                                                             0x22, 0xfb, 0x1e, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb,
+                                                             0x22, 0xfb, 0x18, 0xfb, 0x41, 0xfb, 0x41, 0xfb,
+                                                             0x1d, 0xf7, 0x18, 0xf7, 0x3c, 0x1e, 0xf8, 0x2c,
+                                                             0x56, 0x15, 0x76, 0x83, 0x79, 0x4c, 0x43, 0x1b,
+                                                             0x5c, 0x57, 0xaa, 0xf5, 0xbc, 0x93, 0xe8, 0xe6,
+                                                             0xcb, 0xa4, 0x5b, 0x77, 0x93, 0x1f, 0xdd, 0x9e,
+                                                             0x5, 0xaf, 0x7d, 0x60, 0xdf, 0xfb, 0xe, 0x1b,
+                                                             0xfb, 0x13, 0x4e, 0x33, 0xfb, 0x11, 0xfb, 0x2f,
+                                                             0xed, 0x56, 0xe5, 0xcd, 0xde, 0xa9, 0xed, 0xa9,
+                                                             0x1f, 0xfc, 0xca, 0xdb, 0x15, 0xfb, 0x65, 0xf7,
+                                                             0x40, 0xfb, 0x3a, 0xf7, 0x6b, 0xf7, 0x6b, 0xf7,
+                                                             0x45, 0xf7, 0x3a, 0xf7, 0x65, 0xf7, 0x65, 0xfb,
+                                                             0x45, 0xf7, 0x40, 0xfb, 0x6b, 0xfb, 0x6b, 0xfb,
+                                                             0x40, 0xfb, 0x40, 0xfb, 0x65, 0x1e, 0xe, 0xfb,
+                                                             0x9d, 0xf7, 0xa8, 0xe3, 0xf8, 0x9, 0x77, 0x1,
+                                                             0xf7, 0xd9, 0xf7, 0xb2, 0x15, 0xf5, 0x6, 0x81,
+                                                             0xa6, 0x89, 0xa1, 0x9b, 0xe9, 0xb9, 0xe0, 0xdf,
+                                                             0x1a, 0xf7, 0xf, 0xfb, 0x15, 0x8b, 0x76, 0x6b,
+                                                             0x21, 0x8a, 0xfb, 0x16, 0x5b, 0x1e, 0xf4, 0x7b,
+                                                             0x5, 0xbe, 0xa4, 0xb3, 0x8b, 0x95, 0x1b, 0xaf,
+                                                             0xab, 0x6d, 0x53, 0x70, 0x1f, 0xfb, 0x3, 0x7e,
+                                                             0x78, 0x89, 0x65, 0x80, 0x8, 0x54, 0x7a, 0x68,
+                                                             0x4a, 0x4f, 0x1a, 0x51, 0xad, 0x56, 0xe0, 0xaf,
+                                                             0xb2, 0x98, 0xa4, 0xac, 0x1e, 0x8c, 0x7d, 0x8c,
+                                                             0x87, 0x8f, 0x81, 0x8, 0x8c, 0xf7, 0x4a, 0x15,
+                                                             0x61, 0x82, 0x7e, 0x4d, 0x4e, 0x1b, 0x73, 0x6d,
+                                                             0x9c, 0xa4, 0xb5, 0xbf, 0x94, 0xe0, 0x96, 0x1f,
+                                                             0xe, 0x3c, 0x58, 0xa, 0xf8, 0x23, 0xd7, 0x4a,
+                                                             0xa, 0x35, 0xfb, 0x6d, 0x4a, 0xa, 0xe, 0x58,
+                                                             0xf7, 0x15, 0x76, 0x1, 0xf4, 0xf7, 0xc6, 0x15,
+                                                             0xf8, 0x1, 0xfb, 0x5a, 0xf7, 0x19, 0xf7, 0xcb,
+                                                             0xfc, 0x86, 0x6, 0xe, 0x58, 0xf7, 0x59, 0xf7,
+                                                             0x4, 0x1, 0xdd, 0xf7, 0x59, 0x15, 0xf7, 0x4,
+                                                             0xf8, 0xa4, 0xfb, 0x4, 0x7, 0xe, 0xf1, 0x78,
+                                                             0xd6, 0xf7, 0xa0, 0xca, 0xf7, 0xa7, 0xd6, 0x1,
+                                                             0xc2, 0xd8, 0xf8, 0x32, 0xe4, 0xf7, 0xe, 0xd8,
+                                                             0x3, 0xf7, 0x94, 0xf7, 0x33, 0x15, 0xde, 0x6,
+                                                             0xa4, 0xf7, 0x39, 0x5, 0xa1, 0x6, 0xb5, 0xa4,
+                                                             0x85, 0x2e, 0xae, 0x1f, 0xa3, 0x49, 0x5, 0xf3,
+                                                             0x6, 0x66, 0xdc, 0x71, 0xc7, 0x81, 0x9f, 0x67,
+                                                             0x99, 0x19, 0x8d, 0x7, 0xe1, 0x96, 0xb5, 0xbd,
+                                                             0xb9, 0x1a, 0xf7, 0x15, 0xfb, 0x6, 0x7f, 0xfb,
+                                                             0xc, 0x1e, 0x38, 0x6, 0xc3, 0xfb, 0x41, 0x15,
+                                                             0x9c, 0xf7, 0x1, 0x5, 0xae, 0x6, 0xd4, 0xba,
+                                                             0x8f, 0x52, 0x52, 0x4d, 0x8c, 0x40, 0x1f, 0xfb,
+                                                             0xa9, 0x6f, 0x15, 0xf7, 0x3c, 0xf7, 0x20, 0xf7,
+                                                             0x1b, 0xf7, 0x41, 0xf7, 0x41, 0xf7, 0x1f, 0xfb,
+                                                             0x1b, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1f, 0xfb,
+                                                             0x1b, 0xfb, 0x41, 0xfb, 0x41, 0xfb, 0x20, 0xf7,
+                                                             0x1b, 0xf7, 0x3c, 0x1e, 0x3e, 0x16, 0xfb, 0x65,
+                                                             0xf7, 0x43, 0xfb, 0x3d, 0xf7, 0x6b, 0xf7, 0x6b,
+                                                             0xf7, 0x42, 0xf7, 0x3d, 0xf7, 0x65, 0xf7, 0x65,
+                                                             0xfb, 0x42, 0xf7, 0x3d, 0xfb, 0x6b, 0xfb, 0x6b,
+                                                             0xfb, 0x43, 0xfb, 0x3d, 0xfb, 0x65, 0x1e, 0xe,
+                                                             0xf8, 0xf0, 0xd5, 0x1, 0xf7, 0xe, 0xf7, 0xfd,
+                                                             0x3, 0xf7, 0xe, 0xf8, 0xf0, 0x15, 0xf7, 0xe7,
+                                                             0x6, 0xa1, 0xd5, 0x5, 0xfb, 0xe8, 0x6, 0xe,
+                                                             0xfb, 0x7f, 0xf7, 0x43, 0xd7, 0xf7, 0x20, 0xd7,
+                                                             0x3, 0xf7, 0x43, 0xf8, 0xcf, 0x15, 0x3b, 0xcc,
+                                                             0x4a, 0xdb, 0xdc, 0xcd, 0xcc, 0xdb, 0xdb, 0x49,
+                                                             0xc8, 0x3a, 0x3b, 0x4a, 0x4e, 0x3b, 0x1e, 0xd7,
+                                                             0x8a, 0x15, 0xb2, 0xab, 0xa7, 0xb1, 0xb1, 0xab,
+                                                             0x70, 0x63, 0x65, 0x6b, 0x6c, 0x65, 0x65, 0x6b,
+                                                             0xaa, 0xb1, 0x1e, 0xe, 0x58, 0x8b, 0xe7, 0xf7,
+                                                             0x4c, 0xe9, 0xf7, 0x1c, 0x77, 0x1, 0xf7, 0xaa,
+                                                             0xf7, 0x0, 0x3, 0xb3, 0x16, 0xf8, 0xdd, 0xe7,
+                                                             0xfc, 0xdd, 0x6, 0xf7, 0x4c, 0x4, 0xf7, 0x82,
+                                                             0xfb, 0x1f, 0xf7, 0x0, 0xf7, 0x1f, 0xf7, 0x83,
+                                                             0xe9, 0xfb, 0x83, 0xf7, 0x1c, 0xfb, 0x0, 0xfb,
+                                                             0x1c, 0xfb, 0x82, 0x6, 0xe, 0xf7, 0xaf, 0xe4,
+                                                             0xf7, 0x95, 0xdc, 0x1, 0xd0, 0xf7, 0xaf, 0x15,
+                                                             0xf7, 0xd8, 0x6, 0xa2, 0xe4, 0x5, 0xfb, 0x3c,
+                                                             0x6, 0xa0, 0x9c, 0xc4, 0xb1, 0x97, 0x96, 0x8,
+                                                             0xdc, 0xd3, 0xa9, 0xb3, 0xb5, 0x1a, 0xc5, 0x5d,
+                                                             0xc7, 0xfb, 0x7, 0xfb, 0x25, 0x75, 0x22, 0x6f,
+                                                             0x86, 0x1e, 0xf7, 0x4, 0x7d, 0x5, 0xa7, 0x92,
+                                                             0x94, 0xb1, 0xb9, 0x1b, 0xef, 0x30, 0xfb, 0x1,
+                                                             0x52, 0x30, 0x1f, 0x2a, 0x4e, 0x6c, 0x5d, 0x80,
+                                                             0x42, 0x8, 0xe, 0xf7, 0xa3, 0xdd, 0x39, 0xf7,
+                                                             0x1c, 0xf7, 0xc3, 0x77, 0x1, 0xe6, 0xf8, 0x26,
+                                                             0x15, 0x71, 0x8e, 0x9b, 0x22, 0xf7, 0x1b, 0x1b,
+                                                             0xf7, 0x2, 0xca, 0xda, 0xc8, 0x1f, 0xb9, 0x61,
+                                                             0x9e, 0x9f, 0x9c, 0xcc, 0xa6, 0xc0, 0x1a, 0xb8,
+                                                             0x6a, 0xd3, 0x21, 0xfb, 0xa, 0x6c, 0x33, 0x6a,
+                                                             0x7f, 0x1e, 0xed, 0x79, 0x5, 0xb0, 0x95, 0x9c,
+                                                             0x9f, 0xa8, 0x1b, 0x92, 0xad, 0x8a, 0x69, 0x4f,
+                                                             0x46, 0x92, 0x7d, 0x8d, 0x1f, 0x77, 0x34, 0x5,
+                                                             0xab, 0x95, 0xba, 0x83, 0x5d, 0x1a, 0x6d, 0x72,
+                                                             0x6f, 0x61, 0x60, 0x86, 0xaa, 0xa7, 0x86, 0x1e,
+                                                             0xe, 0xf9, 0x5, 0x76, 0xf7, 0x26, 0x77, 0x1,
+                                                             0xf7, 0x80, 0xf8, 0xf0, 0x15, 0xf2, 0x52, 0xa,
+                                                             0xe, 0x73, 0xfb, 0x4e, 0x76, 0xf7, 0x62, 0xeb,
+                                                             0x33, 0x76, 0xf8, 0xb6, 0x77, 0x12, 0x13, 0xb0,
+                                                             0xf7, 0x70, 0xc3, 0x15, 0x70, 0x9a, 0xa4, 0x60,
+                                                             0xc8, 0x1b, 0xb7, 0xa3, 0xa0, 0xb4, 0xb1, 0x1f,
+                                                             0x13, 0xd0, 0x82, 0x5a, 0x5, 0xf7, 0x14, 0x6,
+                                                             0xf7, 0x4, 0xf8, 0xa9, 0x3d, 0xa, 0x4f, 0xfb,
+                                                             0xa9, 0x5, 0x54, 0x80, 0x74, 0x22, 0x33, 0x1b,
+                                                             0x68, 0x5c, 0xa6, 0xcb, 0x1f, 0xce, 0xf7, 0xee,
+                                                             0x92, 0xa, 0xfb, 0x30, 0xfd, 0x77, 0x8d, 0xa,
+                                                             0xe, 0x3c, 0xfb, 0x3e, 0x76, 0xf9, 0x92, 0xf7,
+                                                             0x11, 0x1, 0xf7, 0xc3, 0xfb, 0x53, 0x15, 0xf7,
+                                                             0x10, 0xf9, 0x92, 0xd9, 0xfd, 0x92, 0xf7, 0xc,
+                                                             0xf9, 0x92, 0xca, 0xf7, 0x11, 0xfb, 0xcb, 0x6,
+                                                             0xfb, 0x29, 0xfb, 0x16, 0x5f, 0xfb, 0x2d, 0x5a,
+                                                             0xa4, 0xfb, 0x26, 0xf7, 0x48, 0x1f, 0xe, 0xfb,
+                                                             0xf9, 0xf7, 0x40, 0xf7, 0x36, 0x1, 0xf7, 0x2,
+                                                             0xf7, 0x40, 0x8e, 0xa, 0xa7, 0xf7, 0x36, 0x81,
+                                                             0xa, 0xfb, 0x78, 0xce, 0xf7, 0x35, 0x77, 0x1,
+                                                             0xf7, 0x18, 0xe3, 0x3, 0xbc, 0x80, 0x15, 0x7b,
+                                                             0x53, 0x5, 0x8e, 0x9d, 0x9b, 0x8e, 0x95, 0x1b,
+                                                             0x99, 0xb4, 0x87, 0x66, 0x5c, 0x48, 0x7f, 0x3c,
+                                                             0x1f, 0x74, 0x48, 0x5, 0xf7, 0x2f, 0xf1, 0xae,
+                                                             0xe6, 0xbc, 0x69, 0xc0, 0x41, 0x70, 0x76, 0x86,
+                                                             0x85, 0x7c, 0x1f, 0xe, 0xf7, 0xc4, 0x76, 0xf8,
+                                                             0x3f, 0x77, 0x1, 0xf7, 0x62, 0xf7, 0xaf, 0x15,
+                                                             0xe7, 0x6, 0xe5, 0xf8, 0x3f, 0x5, 0x51, 0x6,
+                                                             0x71, 0x6f, 0x55, 0x5f, 0x3f, 0x6b, 0x71, 0x31,
+                                                             0x18, 0xaf, 0x93, 0xb2, 0x98, 0xb4, 0xa2, 0x8,
+                                                             0xe, 0xfb, 0xa2, 0xf7, 0xa8, 0xf2, 0xf7, 0x93,
+                                                             0xf2, 0x1, 0xe7, 0xf7, 0x6, 0xf7, 0x39, 0xf7,
+                                                             0x6, 0x3, 0xe7, 0xf8, 0x57, 0x15, 0x30, 0xbe,
+                                                             0x37, 0xf7, 0xf, 0xf7, 0x3f, 0xbb, 0xf7, 0x60,
+                                                             0xd8, 0xe9, 0x50, 0xe1, 0xfb, 0xa, 0xfb, 0x2b,
+                                                             0x4a, 0xfb, 0x43, 0xfb, 0x3, 0x1e, 0xf7, 0x6,
+                                                             0x16, 0xc2, 0xa6, 0xf7, 0x14, 0xd8, 0xa8, 0xab,
+                                                             0x74, 0x55, 0x5a, 0x6f, 0xfb, 0x15, 0x3f, 0x62,
+                                                             0x77, 0xad, 0xb1, 0x1e, 0xe, 0x3c, 0x58, 0xa,
+                                                             0xf3, 0xd7, 0x4d, 0xa, 0xaa, 0xfb, 0x59, 0x4d,
+                                                             0xa, 0xe, 0xf7, 0x5b, 0x92, 0x76, 0xf9, 0x68,
+                                                             0x77, 0x1, 0xf8, 0x69, 0xc3, 0x15, 0xf7, 0x31,
+                                                             0x6, 0x7b, 0x45, 0x5, 0xd7, 0x6, 0x9c, 0xd1,
+                                                             0x5, 0xba, 0x6, 0x9b, 0xcd, 0x5, 0x5d, 0x6,
+                                                             0xbd, 0xf7, 0x70, 0x5, 0x41, 0x6, 0xfb, 0x67,
+                                                             0xfb, 0x70, 0x5, 0xdf, 0x16, 0xee, 0xf6, 0x8d,
+                                                             0x89, 0x70, 0x22, 0x5, 0xfc, 0x93, 0xfb, 0x21,
+                                                             0x15, 0xd8, 0x6, 0xf8, 0xe9, 0xf9, 0x6d, 0x5,
+                                                             0x3e, 0x6, 0xfc, 0xa5, 0xfb, 0xfd, 0x15, 0xe2,
+                                                             0x6, 0xdf, 0xf7, 0xfb, 0x5, 0x55, 0x6, 0x72,
+                                                             0x74, 0x58, 0x66, 0x44, 0x70, 0x84, 0x89, 0x18,
+                                                             0x7a, 0x41, 0xac, 0x92, 0xb0, 0x96, 0xb2, 0x9e,
+                                                             0x19, 0xe, 0xf7, 0x5b, 0x7d, 0xd5, 0x51, 0x76,
+                                                             0xf7, 0xbe, 0xcd, 0xf8, 0x1, 0x77, 0x12, 0x13,
+                                                             0x70, 0xf7, 0x18, 0x78, 0x15, 0xdd, 0x6, 0xf9,
+                                                             0xe, 0xf9, 0x6d, 0x5, 0x39, 0x6, 0xfc, 0xb8,
+                                                             0xfb, 0xfd, 0x15, 0xe7, 0x6, 0xe5, 0xf7, 0xfb,
+                                                             0x5, 0x51, 0x6, 0x71, 0x74, 0x55, 0x66, 0x3f,
+                                                             0x70, 0x83, 0x89, 0x18, 0x79, 0x41, 0xaf, 0x92,
+                                                             0xb2, 0x96, 0xb4, 0x9e, 0x19, 0x13, 0xb0, 0xf7,
+                                                             0xaa, 0xfc, 0xe8, 0x15, 0xf7, 0x97, 0x6, 0x9e,
+                                                             0xd5, 0x91, 0xa, 0x9c, 0x9a, 0x94, 0x95, 0x96,
+                                                             0x92, 0x8, 0xf7, 0x1, 0xd9, 0x9a, 0xb3, 0xaf,
+                                                             0x1a, 0xbb, 0x66, 0xbe, 0x2f, 0xfb, 0x8, 0x7a,
+                                                             0x32, 0x74, 0x87, 0x1e, 0xe4, 0x7f, 0x5, 0xa3,
+                                                             0x91, 0x92, 0xad, 0xb0, 0x1b, 0xa5, 0x97, 0x79,
+                                                             0x7c, 0x70, 0x70, 0x76, 0x3e, 0x4e, 0x1f, 0x43,
+                                                             0x51, 0x6d, 0x6b, 0x82, 0x4e, 0x8, 0xe, 0xf7,
+                                                             0x5b, 0x92, 0x76, 0xf7, 0xfa, 0xce, 0xf7, 0xbf,
+                                                             0x77, 0x12, 0xf7, 0xb4, 0xe6, 0x45, 0xe5, 0x13,
+                                                             0xf0, 0xf8, 0x6f, 0xc3, 0x15, 0xf7, 0x38, 0x6,
+                                                             0x7a, 0x45, 0x5, 0xdb, 0x6, 0x9e, 0xd1, 0x5,
+                                                             0xbb, 0x6, 0x9c, 0xcd, 0x5, 0x5b, 0x6, 0xbf,
+                                                             0xf7, 0x70, 0x5, 0x3e, 0x6, 0xfb, 0x72, 0xfb,
+                                                             0x70, 0x5, 0xe3, 0x16, 0xf3, 0xf6, 0x8d, 0x89,
+                                                             0x70, 0x22, 0x5, 0xfc, 0xa2, 0xfb, 0x21, 0x15,
+                                                             0xdd, 0x6, 0xf9, 0x5, 0xf9, 0x6d, 0x5, 0x3b,
+                                                             0x6, 0xfd, 0x28, 0xfb, 0x96, 0x15, 0x76, 0x8e,
+                                                             0x98, 0x34, 0xf7, 0x8, 0x1b, 0xe9, 0xc1, 0xcc,
+                                                             0xbe, 0x1f, 0xb3, 0x67, 0x99, 0x9c, 0x1a, 0x13,
+                                                             0xe8, 0x98, 0xc3, 0x93, 0xc8, 0x1a, 0xb0, 0x6e,
+                                                             0xc5, 0x30, 0x26, 0x71, 0x42, 0x6f, 0x81, 0x1e,
+                                                             0xdf, 0x7d, 0x5, 0xaa, 0x94, 0x99, 0x9b, 0xa4,
+                                                             0x1b, 0x90, 0xa9, 0x8a, 0x6f, 0x59, 0x50, 0x91,
+                                                             0x7e, 0x8c, 0x1f, 0x7a, 0x44, 0x5, 0x13, 0xf0,
+                                                             0xa7, 0x92, 0xb3, 0x85, 0x65, 0x1a, 0x72, 0x76,
+                                                             0x73, 0x67, 0x66, 0x87, 0xa6, 0xa2, 0x87, 0x1e,
+                                                             0xe, 0x73, 0xfb, 0x57, 0xf2, 0xf8, 0x54, 0x77,
+                                                             0xcb, 0xf7, 0x18, 0x1, 0xc0, 0xf7, 0x1a, 0x3,
+                                                             0xf8, 0x40, 0xad, 0x15, 0xfb, 0xa, 0x70, 0x43,
+                                                             0x83, 0x60, 0x1b, 0x3e, 0x75, 0xb3, 0xab, 0xb0,
+                                                             0xa1, 0xa2, 0xe1, 0xd4, 0x1f, 0xf7, 0x4, 0xeb,
+                                                             0xb5, 0xbb, 0x9a, 0xee, 0x8, 0xfb, 0x15, 0x6,
+                                                             0x80, 0x4c, 0x77, 0x7b, 0x39, 0x48, 0x8, 0xfb,
+                                                             0xa, 0x2a, 0x58, 0x55, 0x3c, 0x1a, 0x36, 0xd1,
+                                                             0x31, 0xf7, 0x35, 0xf7, 0x50, 0xd0, 0xf7, 0x1c,
+                                                             0xd1, 0x9d, 0x1e, 0xfb, 0x72, 0xf8, 0x19, 0x15,
+                                                             0x9b, 0xa, 0xa8, 0xf7, 0x18, 0x65, 0xa, 0x34,
+                                                             0xa, 0xd7, 0xf7, 0x27, 0x1, 0xf8, 0x7d, 0xf9,
+                                                             0xa9, 0x15, 0xea, 0x6, 0x4d, 0xf7, 0x27, 0x91,
+                                                             0xa, 0xfc, 0x3, 0xfe, 0x3c, 0x27, 0xa, 0x34,
+                                                             0xa, 0xf7, 0x73, 0x77, 0x1, 0xf8, 0x51, 0xf9,
+                                                             0xa8, 0x15, 0xee, 0x6, 0xf7, 0x3d, 0xf7, 0x28,
+                                                             0x5, 0xfb, 0x33, 0x6, 0xfc, 0xaa, 0xfe, 0x3c,
+                                                             0x27, 0xa, 0x34, 0xa, 0xd6, 0xf7, 0x28, 0x1,
+                                                             0xf7, 0xd5, 0xf9, 0xa8, 0x15, 0xf7, 0x9, 0x6,
+                                                             0xe0, 0xe1, 0xb1, 0x35, 0x5, 0xec, 0x6, 0x4f,
+                                                             0xf7, 0x28, 0x66, 0xa, 0xfc, 0x53, 0xfe, 0x3c,
+                                                             0x27, 0xa, 0x34, 0xa, 0xe3, 0xf7, 0xe, 0x39,
+                                                             0xdd, 0x12, 0x13, 0xe8, 0xf7, 0xed, 0xf9, 0xb2,
+                                                             0x15, 0xcc, 0x6, 0x98, 0x90, 0x94, 0xa9, 0xab,
+                                                             0x1b, 0xaa, 0xa0, 0x82, 0x80, 0x9e, 0x1f, 0x13,
+                                                             0xf0, 0x80, 0xa0, 0x9e, 0x82, 0xa7, 0x1b, 0xbb,
+                                                             0xb6, 0xb4, 0xdc, 0x98, 0x1f, 0x49, 0x6, 0x72,
+                                                             0x83, 0x84, 0x7b, 0x77, 0x1b, 0x74, 0x78, 0x94,
+                                                             0x94, 0x74, 0x1f, 0x96, 0x73, 0x71, 0x95, 0x67,
+                                                             0x1b, 0x46, 0x75, 0x43, 0x58, 0x80, 0x1f, 0xfb,
+                                                             0xd9, 0xfd, 0xb2, 0x27, 0xa, 0x34, 0xa, 0xde,
+                                                             0xf7, 0xb, 0x1, 0xf7, 0xed, 0xf9, 0xb0, 0x8f,
+                                                             0xa, 0xa4, 0xf7, 0xb, 0x5, 0xfb, 0xd, 0x6,
+                                                             0xf7, 0x4a, 0xfb, 0xb, 0x8f, 0xa, 0xa5, 0xf7,
+                                                             0xb, 0x7a, 0xa, 0xfc, 0xc3, 0xfe, 0x27, 0x27,
+                                                             0xa, 0x34, 0xa, 0xf7, 0x58, 0xc0, 0x1, 0x9f,
+                                                             0xf9, 0x3e, 0x3, 0x9f, 0x16, 0x25, 0xa, 0x29,
+                                                             0xf8, 0xdb, 0x15, 0x56, 0xb6, 0x5f, 0xc0, 0xbe,
+                                                             0xb6, 0xb5, 0xc2, 0xc3, 0x61, 0xb1, 0x57, 0x54,
+                                                             0x62, 0x64, 0x54, 0x1e, 0xbf, 0x16, 0xa3, 0x9e,
+                                                             0x9c, 0xa4, 0xa2, 0x9f, 0x7b, 0x72, 0x72, 0x77,
+                                                             0x78, 0x74, 0x73, 0x77, 0x9e, 0xa4, 0x1e, 0xe,
+                                                             0xf8, 0x1, 0x8b, 0xf7, 0xd, 0xc6, 0xf7, 0xc,
+                                                             0x98, 0xf7, 0xd, 0xf7, 0x39, 0xf7, 0xb, 0x1,
+                                                             0x90, 0x16, 0xf7, 0x2c, 0x6, 0xf1, 0xf7, 0x48,
+                                                             0x5, 0xf7, 0x83, 0x6, 0x66, 0xfb, 0x48, 0x5,
+                                                             0xf8, 0x99, 0x50, 0xa, 0xfc, 0x10, 0x6, 0xb3,
+                                                             0xf7, 0x54, 0x5, 0xf7, 0xdd, 0x50, 0xa, 0xfb,
+                                                             0xdd, 0x6, 0xaf, 0xf7, 0x39, 0x5, 0xf7, 0xf3,
+                                                             0x6, 0xa4, 0xf7, 0xb, 0x5, 0xfd, 0x39, 0x6,
+                                                             0x2c, 0xfc, 0x36, 0x15, 0xf7, 0x3e, 0xf7, 0xbf,
+                                                             0x5, 0xe2, 0x6, 0x4d, 0xfb, 0xbf, 0x5, 0xe,
+                                                             0xe2, 0xfb, 0x63, 0x76, 0xf7, 0x27, 0xf7, 0x4b,
+                                                             0xfb, 0x11, 0xf7, 0x11, 0xf8, 0x90, 0xf7, 0x13,
+                                                             0x12, 0xf6, 0xf7, 0x2c, 0xf7, 0x38, 0xed, 0x13,
+                                                             0xbc, 0xf7, 0x88, 0xfb, 0x36, 0x15, 0x70, 0x51,
+                                                             0x5, 0x83, 0xbe, 0xc7, 0x8b, 0x93, 0x1b, 0xf1,
+                                                             0xde, 0xaa, 0xd9, 0xc6, 0x5b, 0xa7, 0x51, 0x91,
+                                                             0x1f, 0x8d, 0x7, 0xf7, 0x61, 0x92, 0xe6, 0xf7,
+                                                             0x23, 0xb1, 0xf3, 0xfb, 0x2f, 0xa2, 0x18, 0xfb,
+                                                             0x9, 0x64, 0x37, 0x69, 0x4e, 0x1b, 0x27, 0x58,
+                                                             0xe6, 0xef, 0xf7, 0xb, 0x80, 0xa, 0x68, 0x92,
+                                                             0x1f, 0xf7, 0x28, 0x99, 0x5, 0xf7, 0x3e, 0x76,
+                                                             0xfb, 0x15, 0xce, 0xfb, 0x1c, 0x1b, 0xfb, 0x84,
+                                                             0xfb, 0x30, 0xfb, 0x5e, 0xfb, 0x86, 0xfb, 0x31,
+                                                             0xcd, 0xfb, 0x33, 0xf7, 0x67, 0x1f, 0x8c, 0x87,
+                                                             0x89, 0x87, 0x1b, 0x5b, 0x82, 0x73, 0x56, 0x5,
+                                                             0x13, 0xdc, 0x8e, 0x99, 0x9d, 0x8e, 0xa0, 0x1b,
+                                                             0xbd, 0x9a, 0x77, 0x79, 0x5c, 0x2e, 0x8b, 0x7c,
+                                                             0x7e, 0x5c, 0x8e, 0x8c, 0x80, 0x1f, 0xe, 0x41,
+                                                             0xa, 0xbb, 0x95, 0xa, 0xd7, 0x16, 0x2c, 0xa,
+                                                             0xf7, 0xa2, 0xbb, 0x15, 0xea, 0x6, 0x4d, 0xf7,
+                                                             0x2b, 0x5b, 0xa, 0xe, 0x41, 0xa, 0xf7, 0x5b,
+                                                             0x77, 0x1, 0xd7, 0x16, 0x2c, 0xa, 0xf7, 0x4f,
+                                                             0xbb, 0x15, 0xe9, 0x6, 0xf7, 0x32, 0xf7, 0x2b,
+                                                             0x53, 0xa, 0xe, 0x41, 0xa, 0xbb, 0x95, 0xa,
+                                                             0xd7, 0xf9, 0x3d, 0x3, 0xd7, 0x16, 0x2c, 0xa,
+                                                             0xe4, 0xbb, 0x15, 0xf7, 0x9, 0x6, 0xe0, 0xe4,
+                                                             0xb1, 0x32, 0x5, 0xec, 0x6, 0x4f, 0xf7, 0x2b,
+                                                             0x66, 0xa, 0xe, 0xab, 0x8b, 0xf7, 0xe, 0xf7,
+                                                             0x5c, 0xf7, 0x10, 0xf7, 0x3c, 0xf7, 0xf, 0x1,
+                                                             0xf7, 0xec, 0xf9, 0xad, 0x15, 0xf7, 0xd, 0x5f,
+                                                             0xa, 0xf7, 0xc, 0x4f, 0xa, 0xfb, 0xc, 0x6,
+                                                             0xfc, 0x87, 0xfe, 0x27, 0x15, 0x2c, 0xa, 0xe,
+                                                             0x4e, 0xa, 0xd0, 0x95, 0xa, 0xf7, 0xbd, 0xf9,
+                                                             0xa5, 0x15, 0xe5, 0x6, 0x50, 0x67, 0xa, 0xfb,
+                                                             0x14, 0x6, 0xfb, 0x1c, 0xfe, 0x3c, 0x15, 0xf7,
+                                                             0x3f, 0xf9, 0x74, 0x5, 0x5e, 0xa, 0xfb, 0x40,
+                                                             0xfd, 0x74, 0x5, 0xe, 0x4e, 0xa, 0xf7, 0x70,
+                                                             0x77, 0x1, 0xcb, 0x16, 0x46, 0xa, 0x90, 0xbc,
+                                                             0x15, 0xf6, 0x6, 0xf7, 0x49, 0x67, 0xa, 0xfb,
+                                                             0x3f, 0x6, 0xe, 0x4e, 0xa, 0xd0, 0x95, 0xa,
+                                                             0xf7, 0xf, 0xf9, 0xa5, 0x15, 0xf7, 0x11, 0x6,
+                                                             0xe6, 0xe4, 0xb4, 0x32, 0x5, 0xf3, 0x6, 0x4b,
+                                                             0xf7, 0x2b, 0x3d, 0xa, 0xfb, 0x6b, 0xfe, 0x3c,
+                                                             0x15, 0x46, 0xa, 0xe, 0x4e, 0xa, 0xd8, 0xf7,
+                                                             0xe, 0x1, 0xf7, 0x1f, 0xf9, 0xad, 0x6a, 0xa,
+                                                             0xf7, 0x4b, 0xfb, 0xe, 0x6a, 0xa, 0xfb, 0xc8,
+                                                             0xfe, 0x27, 0x15, 0x46, 0xa, 0xe, 0x57, 0xa,
+                                                             0xd3, 0x16, 0xf7, 0x99, 0x6, 0xf7, 0x7e, 0xf7,
+                                                             0x66, 0xf7, 0x22, 0xf7, 0xa7, 0xf7, 0x71, 0xfb,
+                                                             0x1a, 0xdb, 0xfb, 0x6c, 0x1f, 0xfb, 0x59, 0x6,
+                                                             0x49, 0xfb, 0xc3, 0x5, 0x3d, 0x6, 0x73, 0xfb,
+                                                             0x4, 0x5, 0xd8, 0x6, 0xf7, 0x5, 0xfb, 0x4d,
+                                                             0x15, 0xb2, 0xf7, 0x4d, 0x5, 0xf7, 0x32, 0x6,
+                                                             0xa3, 0xf7, 0x4, 0x5, 0xfb, 0x31, 0x6, 0xb3,
+                                                             0xf7, 0x4d, 0x5, 0xe1, 0x6, 0xd9, 0xf5, 0x84,
+                                                             0xfb, 0x44, 0xfb, 0x8a, 0xfb, 0x15, 0x56, 0xfb,
+                                                             0x3d, 0x1f, 0xe, 0x68, 0xa, 0xf9, 0x73, 0x77,
+                                                             0x1, 0x8a, 0xa, 0xf2, 0xf8, 0x82, 0x5c, 0xa,
+                                                             0xf7, 0x59, 0xfc, 0x82, 0x5, 0x9b, 0xa, 0xf7,
+                                                             0x2d, 0xf9, 0x73, 0x3d, 0xa, 0x25, 0xfc, 0x80,
+                                                             0x51, 0xa, 0xfb, 0x5a, 0xf8, 0x80, 0x3d, 0xa,
+                                                             0xf7, 0x12, 0xca, 0x15, 0xca, 0x6, 0x8f, 0x99,
+                                                             0x95, 0xaa, 0xaa, 0x89, 0xab, 0x89, 0x9e, 0x81,
+                                                             0x9c, 0x81, 0x9e, 0x81, 0x9b, 0x81, 0xab, 0x8d,
+                                                             0xba, 0x8d, 0xb6, 0xb2, 0x97, 0xdc, 0x8, 0x4a,
+                                                             0x63, 0xa, 0x77, 0x78, 0x93, 0x94, 0x76, 0x1f,
+                                                             0x96, 0x73, 0x70, 0x96, 0x67, 0x1b, 0x47, 0x75,
+                                                             0x43, 0x58, 0x82, 0x1f, 0xe, 0x49, 0xa, 0xf8,
+                                                             0x9e, 0xf9, 0xa4, 0x75, 0xa, 0xfb, 0xca, 0x2b,
+                                                             0xa, 0xf7, 0x23, 0x78, 0xf7, 0x14, 0xf9, 0xcf,
+                                                             0x77, 0x36, 0xa, 0xf8, 0x54, 0xf9, 0xa4, 0x15,
+                                                             0xea, 0x6, 0xf7, 0x37, 0x5d, 0xa, 0xfb, 0x2e,
+                                                             0x6, 0xfc, 0x51, 0x2b, 0xa, 0x49, 0xa, 0xf7,
+                                                             0xef, 0xf9, 0xa4, 0x15, 0xf7, 0xb, 0x6, 0xe2,
+                                                             0xe5, 0xb3, 0x31, 0x5, 0xee, 0x6, 0x4e, 0xf7,
+                                                             0x2c, 0x91, 0xa, 0xfc, 0x19, 0x2b, 0xa, 0xf7,
+                                                             0x23, 0x78, 0xf7, 0x13, 0xf9, 0x70, 0xde, 0x36,
+                                                             0xa, 0xf8, 0xa, 0xf9, 0xb1, 0x15, 0xcb, 0x6,
+                                                             0x99, 0x8f, 0x95, 0xa8, 0xa9, 0x1b, 0xac, 0xa0,
+                                                             0x82, 0x81, 0x9f, 0x1f, 0x80, 0x9e, 0x9d, 0x81,
+                                                             0xa4, 0x1b, 0xbb, 0xb5, 0xb4, 0xdd, 0x97, 0x1f,
+                                                             0x4a, 0x63, 0xa, 0x76, 0x79, 0x94, 0x94, 0x76,
+                                                             0x1f, 0x96, 0x74, 0x70, 0x95, 0x66, 0x1b, 0x47,
+                                                             0x75, 0x43, 0x57, 0x81, 0x1f, 0xfb, 0x9f, 0xfc,
+                                                             0x97, 0x21, 0xa, 0xe, 0x8c, 0xa, 0xf8, 0x8f,
+                                                             0xf7, 0x12, 0x36, 0xa, 0xf6, 0xf7, 0xae, 0x21,
+                                                             0xa, 0xf7, 0xc, 0xf8, 0x92, 0x15, 0xf7, 0xf,
+                                                             0x71, 0xa, 0xfb, 0x10, 0x6, 0xf7, 0x4d, 0xfb,
+                                                             0xf, 0x15, 0xf7, 0x10, 0x71, 0xa, 0xfb, 0x10,
+                                                             0x6, 0xe, 0x58, 0xa1, 0x76, 0xf8, 0x8c, 0x77,
+                                                             0x1, 0xc5, 0xec, 0x15, 0xf7, 0x0, 0x2c, 0xf7,
+                                                             0x46, 0xf7, 0x31, 0xf7, 0x49, 0xfb, 0x32, 0xf7,
+                                                             0x2, 0xec, 0xfb, 0x49, 0xf7, 0x31, 0xf7, 0x47,
+                                                             0xf7, 0x2f, 0x20, 0xea, 0xfb, 0x47, 0xfb, 0x31,
+                                                             0xfb, 0x48, 0xf7, 0x31, 0xfb, 0x2, 0x2b, 0xf7,
+                                                             0x49, 0xfb, 0x30, 0x5, 0xe, 0xf7, 0x23, 0x85,
+                                                             0x76, 0xf9, 0x98, 0x77, 0x1, 0xe0, 0xf7, 0xb,
+                                                             0xf8, 0x21, 0xf7, 0x3, 0x3, 0xf8, 0xea, 0xf8,
+                                                             0x9c, 0x15, 0x98, 0x76, 0x94, 0x55, 0x65, 0x1a,
+                                                             0xfb, 0xf, 0x23, 0xfb, 0x2b, 0xfb, 0x32, 0x5a,
+                                                             0x65, 0x8b, 0x94, 0x7b, 0x1e, 0x4f, 0xca, 0x15,
+                                                             0x80, 0x97, 0x82, 0xb2, 0xb6, 0x1a, 0xf7, 0x14,
+                                                             0xf3, 0xf7, 0x3b, 0xf7, 0x31, 0xc3, 0xb4, 0x89,
+                                                             0x84, 0x93, 0x1e, 0xfc, 0x93, 0xfc, 0xc4, 0x15,
+                                                             0xd1, 0x57, 0xd7, 0xde, 0x5, 0x6c, 0xc0, 0xc5,
+                                                             0x84, 0xc0, 0x1b, 0xf7, 0xac, 0xf7, 0x3, 0xf7,
+                                                             0x62, 0xf7, 0x4b, 0xc4, 0x87, 0xe7, 0x64, 0xc7,
+                                                             0x1f, 0xd3, 0xd8, 0x46, 0xbf, 0x44, 0x3e, 0x5,
+                                                             0xa8, 0x58, 0x4e, 0x97, 0x4e, 0x1b, 0xfb, 0xc1,
+                                                             0x31, 0xfb, 0x8c, 0xfb, 0x36, 0x59, 0x95, 0x3b,
+                                                             0xb4, 0x4f, 0x1f, 0xe, 0x2d, 0xa, 0xf7, 0x30,
+                                                             0xbc, 0x15, 0xed, 0x6, 0x4a, 0xf7, 0x2c, 0x81,
+                                                             0xa, 0x2d, 0xa, 0xb6, 0xc1, 0x60, 0xa, 0xe2,
+                                                             0x78, 0xf7, 0x14, 0xf9, 0x3c, 0xf7, 0x27, 0x24,
+                                                             0xa, 0x68, 0xc1, 0x45, 0xa, 0xe2, 0x78, 0xf7,
+                                                             0x14, 0xf9, 0x6, 0x77, 0xdb, 0xf7, 0xc, 0x24,
+                                                             0xa, 0x85, 0xc7, 0x3a, 0xa, 0xab, 0xa0, 0x76,
+                                                             0xf9, 0x74, 0x77, 0xf7, 0x70, 0x77, 0x1, 0x64,
+                                                             0xa, 0xf7, 0xa5, 0xf7, 0xcc, 0xf8, 0x63, 0x43,
+                                                             0xa, 0xfb, 0x5d, 0xfb, 0xcf, 0xfb, 0x10, 0xf7,
+                                                             0xcf, 0x5a, 0xa, 0xf7, 0x51, 0xfc, 0x55, 0x5,
+                                                             0xcb, 0xf8, 0x86, 0x15, 0xe4, 0x6, 0xf7, 0x2a,
+                                                             0xf7, 0x2b, 0x92, 0xa, 0xe, 0xab, 0xa0, 0x76,
+                                                             0xf7, 0x1d, 0xf7, 0xc, 0xf7, 0x60, 0xf7, 0xc,
+                                                             0xf7, 0x1d, 0x77, 0x1, 0xf8, 0xcc, 0xf7, 0x28,
+                                                             0x3, 0xd7, 0x16, 0xf7, 0x29, 0x6, 0xa8, 0xf7,
+                                                             0x1d, 0x5, 0xeb, 0x6, 0xf7, 0x52, 0xf7, 0x44,
+                                                             0xba, 0xf7, 0x61, 0xf7, 0x48, 0xfb, 0x3e, 0x97,
+                                                             0x57, 0x1f, 0xfb, 0x27, 0x6, 0xa8, 0xf7, 0x1d,
+                                                             0x53, 0xa, 0xbf, 0xfc, 0x61, 0x15, 0xb7, 0xf7,
+                                                             0x60, 0x5, 0xf6, 0x6, 0xd7, 0xc9, 0x8d, 0x41,
+                                                             0xfb, 0xc, 0xfb, 0x1a, 0x7f, 0xfb, 0x1, 0x1f,
+                                                             0xe, 0x73, 0x7d, 0xf7, 0x8, 0x38, 0x76, 0xf9,
+                                                             0x7, 0xf5, 0x12, 0xf8, 0x94, 0xf7, 0x25, 0x13,
+                                                             0x70, 0xd0, 0x89, 0x15, 0xf7, 0x2e, 0x6, 0xf2,
+                                                             0xf8, 0x56, 0x5, 0xe1, 0x9e, 0xa0, 0xe6, 0xe2,
+                                                             0x1b, 0xb4, 0x97, 0x7b, 0x74, 0x73, 0x77, 0x6d,
+                                                             0x79, 0x77, 0x1f, 0x61, 0x5b, 0x79, 0x61, 0x63,
+                                                             0x1a, 0x5e, 0xa4, 0x5e, 0xb2, 0x55, 0x1e, 0x9c,
+                                                             0x72, 0xa2, 0x65, 0x6e, 0x1a, 0x13, 0xb0, 0x72,
+                                                             0x7c, 0x78, 0x5c, 0x65, 0x7c, 0x9f, 0x9b, 0x7e,
+                                                             0x1e, 0xfb, 0x1, 0x53, 0x5, 0x66, 0xa7, 0xcf,
+                                                             0x50, 0xef, 0x1b, 0xf7, 0x1c, 0xbd, 0xd1, 0xdc,
+                                                             0xc1, 0x73, 0xc7, 0x68, 0xb6, 0x1f, 0x6a, 0xb2,
+                                                             0x7b, 0xa0, 0xa3, 0x1a, 0xa2, 0x98, 0x9b, 0xa0,
+                                                             0xaa, 0x1e, 0xac, 0xbb, 0xaf, 0xcf, 0xc4, 0x1a,
+                                                             0xc4, 0x5c, 0xc0, 0xfb, 0x1a, 0xfb, 0x63, 0x5a,
+                                                             0xfb, 0x0, 0xfb, 0x43, 0x61, 0x1e, 0xe, 0x42,
+                                                             0xa, 0xf8, 0x8c, 0xf7, 0x2c, 0x76, 0xa, 0xf8,
+                                                             0x1a, 0x89, 0x20, 0xa, 0x13, 0xb0, 0x2a, 0xa,
+                                                             0x70, 0xf7, 0xf2, 0x15, 0xf2, 0x6, 0x48, 0xf7,
+                                                             0x2c, 0x93, 0xa, 0xe, 0x42, 0xa, 0xf7, 0xf1,
+                                                             0xf3, 0xf7, 0x5f, 0x77, 0x12, 0xc2, 0xf7, 0x2b,
+                                                             0x13, 0x78, 0xf7, 0xe8, 0xf8, 0xea, 0x15, 0xf5,
+                                                             0x6, 0xf7, 0x49, 0x5d, 0xa, 0xfb, 0x3e, 0x6,
+                                                             0x48, 0xfd, 0x84, 0x20, 0xa, 0x13, 0xb8, 0x2e,
+                                                             0xa, 0x42, 0xa, 0xf8, 0x8c, 0xf7, 0x2c, 0x76,
+                                                             0xa, 0xf7, 0x62, 0xf8, 0xea, 0x15, 0xf7, 0x11,
+                                                             0x6, 0xe7, 0xe5, 0xb4, 0x31, 0x5, 0xf3, 0x6,
+                                                             0x4b, 0xf7, 0x2c, 0x92, 0xa, 0xa7, 0xfd, 0x84,
+                                                             0x20, 0xa, 0x13, 0xb0, 0x2e, 0xa, 0x42, 0xa,
+                                                             0xf8, 0xc5, 0xdd, 0x89, 0x77, 0x12, 0xc2, 0xf7,
+                                                             0x2b, 0x13, 0xa8, 0xf7, 0x7f, 0xf8, 0xf7, 0x15,
+                                                             0xd2, 0x6, 0x90, 0x9a, 0x95, 0xa7, 0xad, 0x8c,
+                                                             0xaa, 0x8c, 0xa6, 0x7f, 0xa6, 0x80, 0x8, 0x82,
+                                                             0xa2, 0xa0, 0x82, 0xa1, 0x1b, 0xbf, 0xba, 0xb4,
+                                                             0xdc, 0x99, 0x1f, 0x43, 0x6, 0x72, 0x83, 0x83,
+                                                             0x7b, 0x75, 0x1b, 0x77, 0x79, 0x91, 0x93, 0x76,
+                                                             0x1f, 0x13, 0x58, 0x97, 0x70, 0x6b, 0x98, 0x5e,
+                                                             0x1b, 0x40, 0x72, 0x43, 0x57, 0x80, 0x1f, 0xf7,
+                                                             0x2f, 0xfc, 0xf9, 0x20, 0xa, 0x13, 0xa8, 0x2e,
+                                                             0xa, 0x3c, 0x7d, 0xf6, 0x2c, 0xea, 0x12, 0xc2,
+                                                             0xf7, 0x22, 0x13, 0x60, 0xf7, 0x6d, 0xf8, 0xf3,
+                                                             0x6d, 0xa, 0xf7, 0x56, 0xfb, 0xe, 0x6d, 0xa,
+                                                             0x40, 0xfd, 0x6f, 0x20, 0xa, 0x13, 0xa0, 0x2e,
+                                                             0xa, 0x42, 0xa, 0xf7, 0xba, 0xf7, 0x33, 0x23,
+                                                             0xf3, 0xad, 0xf7, 0x57, 0x56, 0x77, 0x12, 0xc2,
+                                                             0xf7, 0x23, 0x13, 0xaa, 0xf7, 0xb3, 0xf9, 0x3a,
+                                                             0x15, 0x56, 0xba, 0x5f, 0xc4, 0xc3, 0xb9, 0xb5,
+                                                             0xc2, 0xc2, 0x5d, 0xb6, 0x53, 0x4f, 0x5f, 0x60,
+                                                             0x54, 0x1e, 0xc3, 0x16, 0x13, 0x56, 0xa4, 0xa0,
+                                                             0x9f, 0xa6, 0xa4, 0xa0, 0x79, 0x70, 0x73, 0x76,
+                                                             0x77, 0x72, 0x70, 0x76, 0x9f, 0xa3, 0x1e, 0xba,
+                                                             0xfd, 0x3c, 0x32, 0xa, 0x99, 0xca, 0x9a, 0xc0,
+                                                             0x1e, 0x99, 0xa, 0xab, 0xb1, 0x1a, 0xab, 0x7b,
+                                                             0xf7, 0x4, 0xfb, 0x59, 0x27, 0xfb, 0x4, 0x6b,
+                                                             0xfb, 0xd, 0x60, 0x1e, 0xf7, 0x28, 0x7f, 0x5,
+                                                             0xba, 0x98, 0xb1, 0x99, 0xb8, 0x1b, 0xcf, 0xa6,
+                                                             0x5b, 0x54, 0x71, 0x1f, 0x6c, 0x80, 0x55, 0x88,
+                                                             0x4f, 0x84, 0x8, 0x42, 0x87, 0xfb, 0x2f, 0x7d,
+                                                             0xfb, 0x33, 0x1a, 0x28, 0xd6, 0x52, 0xe1, 0x1e,
+                                                             0x13, 0xaa, 0xba, 0xcb, 0x9d, 0xc2, 0xbf, 0x1f,
+                                                             0x8e, 0x70, 0x8b, 0x82, 0x93, 0x72, 0x8, 0x99,
+                                                             0xf7, 0x7b, 0x15, 0x31, 0xa, 0x91, 0xe6, 0x98,
+                                                             0x1f, 0xe, 0xf7, 0x92, 0x7d, 0xf7, 0x1, 0xf7,
+                                                             0x11, 0xe3, 0xf7, 0x1b, 0xf2, 0x1, 0xc3, 0xf7,
+                                                             0x17, 0xf8, 0xef, 0xf7, 0x19, 0x3, 0xf7, 0x7,
+                                                             0xf8, 0x1e, 0x15, 0xf7, 0x1f, 0x7d, 0x5, 0xa4,
+                                                             0x94, 0x99, 0xb1, 0xd0, 0x1b, 0xce, 0xa2, 0x60,
+                                                             0x50, 0x7f, 0x1f, 0x7b, 0x86, 0x7c, 0x84, 0xfb,
+                                                             0x0, 0x82, 0x8, 0x35, 0x83, 0xfb, 0x23, 0x86,
+                                                             0xfb, 0x31, 0x1a, 0x28, 0xd3, 0x4a, 0xec, 0xf7,
+                                                             0x15, 0xd0, 0xe7, 0xac, 0xa3, 0x1e, 0x6e, 0x99,
+                                                             0xb8, 0x2b, 0xf7, 0x22, 0x1b, 0xf7, 0x36, 0xcf,
+                                                             0xf7, 0x11, 0xab, 0x9e, 0x1f, 0xfb, 0x17, 0x9f,
+                                                             0x5, 0x46, 0x64, 0x50, 0x8b, 0x7d, 0x1b, 0x4f,
+                                                             0x5a, 0xbb, 0xd9, 0x88, 0x1f, 0xf8, 0x7, 0x6,
+                                                             0x94, 0xb4, 0x8c, 0xb0, 0x9a, 0x1a, 0xf7, 0x1f,
+                                                             0x37, 0xe9, 0xfb, 0x1b, 0x64, 0x3f, 0x85, 0x4e,
+                                                             0x4b, 0x1e, 0x9f, 0x7f, 0x6d, 0xba, 0xfb, 0x12,
+                                                             0x1b, 0xfb, 0x1b, 0x39, 0x4d, 0x31, 0x72, 0x1f,
+                                                             0xf8, 0x4a, 0x35, 0x15, 0xf7, 0x5, 0xa4, 0xd7,
+                                                             0xa1, 0xb1, 0x1b, 0xcb, 0xb3, 0x5b, 0x34, 0x85,
+                                                             0x1f, 0xfc, 0x15, 0x52, 0x15, 0x43, 0x7c, 0x56,
+                                                             0x37, 0x3a, 0x1b, 0x55, 0x7c, 0xab, 0xa2, 0xbb,
+                                                             0xbf, 0xad, 0xf7, 0x3a, 0x9e, 0x1f, 0xe, 0x3c,
+                                                             0xfb, 0x63, 0x76, 0xf9, 0x2c, 0xf7, 0x2, 0x1,
+                                                             0xda, 0xf7, 0x23, 0xe4, 0xe2, 0x3, 0xf7, 0x8a,
+                                                             0x67, 0x15, 0x72, 0x55, 0x5, 0xa0, 0x8e, 0xd0,
+                                                             0x9b, 0x5d, 0x1a, 0x56, 0x2c, 0x8d, 0x61, 0x8c,
+                                                             0x1e, 0x71, 0x52, 0x5, 0x88, 0x9e, 0xa4, 0x8a,
+                                                             0x9e, 0x1b, 0xa6, 0xf7, 0x34, 0x8b, 0xf7, 0x3,
+                                                             0x97, 0x89, 0xc7, 0x3c, 0x98, 0x1f, 0x8d, 0x7,
+                                                             0xa7, 0x8c, 0xbc, 0x90, 0xbd, 0xad, 0xa3, 0x9a,
+                                                             0xc5, 0xb6, 0xae, 0xed, 0xfb, 0x20, 0xa3, 0x18,
+                                                             0x33, 0x6c, 0x50, 0x7c, 0x6f, 0x1b, 0x64, 0x61,
+                                                             0xb1, 0xd2, 0xe3, 0xb4, 0xf7, 0x2c, 0xf7, 0x4,
+                                                             0xd7, 0x93, 0x46, 0x77, 0x8e, 0x1f, 0xf7, 0x1d,
+                                                             0x9a, 0x5, 0xe3, 0x84, 0x4f, 0xeb, 0xfb, 0x28,
+                                                             0x1b, 0xfb, 0x3f, 0xfb, 0x1a, 0xfb, 0x1e, 0xfb,
+                                                             0x68, 0x22, 0xc9, 0x2d, 0xdd, 0x7a, 0x1f, 0x89,
+                                                             0x96, 0xb2, 0x83, 0x88, 0x1b, 0x89, 0x8a, 0x7f,
+                                                             0x89, 0x81, 0x88, 0x8, 0xe, 0x3c, 0xf7, 0x71,
+                                                             0xe3, 0xf7, 0xb5, 0xf7, 0x2c, 0x1, 0xd1, 0xf7,
+                                                             0x21, 0xf7, 0x8c, 0xf7, 0x1a, 0x3, 0xf7, 0x67,
+                                                             0xf7, 0x71, 0x23, 0xa, 0x35, 0xf7, 0xb5, 0x15,
+                                                             0xef, 0x6, 0x4a, 0xf7, 0x2c, 0x47, 0xa, 0xe,
+                                                             0x3c, 0xf7, 0x71, 0xe3, 0xf8, 0x4d, 0x77, 0x1,
+                                                             0xce, 0xf7, 0x2c, 0xf7, 0x7e, 0xf7, 0x23, 0x3,
+                                                             0xf7, 0xd8, 0xf8, 0xea, 0x15, 0xf3, 0x6, 0xf7,
+                                                             0x46, 0x5d, 0xa, 0xfb, 0x3c, 0x6, 0xfb, 0x77,
+                                                             0xfc, 0xa5, 0x23, 0xa, 0xe, 0x3c, 0x7d, 0xf2,
+                                                             0xf7, 0x18, 0xe3, 0xf7, 0xb5, 0xf7, 0x2c, 0x7d,
+                                                             0xa, 0xf7, 0x4c, 0xf8, 0xea, 0x8f, 0xa, 0xe5,
+                                                             0xe5, 0xb3, 0x31, 0x5, 0xf1, 0x6, 0x4c, 0xf7,
+                                                             0x2c, 0x54, 0xa, 0xfb, 0x12, 0xfc, 0xa5, 0x23,
+                                                             0xa, 0xe, 0x3c, 0x7d, 0xf1, 0xf7, 0x17, 0xe1,
+                                                             0x1, 0xd1, 0xf7, 0x23, 0xf7, 0x8b, 0xf7, 0x1a,
+                                                             0x3, 0xf7, 0x6b, 0xf8, 0xf3, 0x15, 0xf7, 0x13,
+                                                             0x6e, 0xa, 0xfb, 0x13, 0x6, 0xf7, 0x52, 0xfb,
+                                                             0xe, 0x15, 0xf7, 0x13, 0x6e, 0xa, 0xfb, 0x12,
+                                                             0x6, 0xfb, 0x8b, 0xfc, 0x90, 0x23, 0xa, 0xe,
+                                                             0x48, 0xa, 0xf8, 0xeb, 0x95, 0xa, 0xd0, 0x16,
+                                                             0x3c, 0xa, 0xc7, 0xd0, 0x15, 0xe7, 0x6, 0x4f,
+                                                             0x67, 0xa, 0xfb, 0x18, 0x6, 0xe, 0x48, 0xa,
+                                                             0xf9, 0x82, 0x77, 0x1, 0xf7, 0x4a, 0xf8, 0xeb,
+                                                             0x15, 0xf5, 0x6, 0xf7, 0x48, 0x67, 0xa, 0xfb,
+                                                             0x3e, 0x6, 0xfb, 0x79, 0xfd, 0x82, 0x15, 0x3c,
+                                                             0xa, 0xe, 0x48, 0xa, 0xf8, 0xeb, 0x95, 0xa,
+                                                             0xc9, 0xf8, 0xeb, 0x15, 0xf7, 0x15, 0x6, 0xe9,
+                                                             0xe4, 0xb5, 0x32, 0x5, 0xf6, 0x6, 0x49, 0x67,
+                                                             0xa, 0xfb, 0x25, 0x6, 0xfb, 0x2e, 0xfd, 0x82,
+                                                             0x15, 0x3c, 0xa, 0xe, 0x48, 0xa, 0xf8, 0xf3,
+                                                             0xf7, 0xe, 0x1, 0xe6, 0xf8, 0xf3, 0x15, 0xf7,
+                                                             0xe, 0x5f, 0xa, 0xf7, 0xe, 0x6, 0xa4, 0xf7,
+                                                             0xe, 0x5, 0xfb, 0xd, 0x6, 0xfb, 0x93, 0xfd,
+                                                             0x6d, 0x15, 0x3c, 0xa, 0xe, 0x73, 0x7d, 0xf7,
+                                                             0x3, 0xf7, 0xd8, 0xf7, 0x4, 0xf7, 0x60, 0x77,
+                                                             0x1, 0xdd, 0xf7, 0x28, 0xf7, 0xae, 0xf7, 0x2f,
+                                                             0x3, 0xf7, 0xe7, 0xf8, 0xcf, 0x15, 0xf7, 0x13,
+                                                             0xb6, 0xac, 0x52, 0x98, 0x5a, 0x93, 0x68, 0x19,
+                                                             0x88, 0x89, 0x5, 0xa4, 0x76, 0x67, 0xb0, 0x32,
+                                                             0x1b, 0xfb, 0x42, 0xfb, 0x7, 0xfb, 0x26, 0xfb,
+                                                             0x36, 0x26, 0xc2, 0xfb, 0x1e, 0xf7, 0x68, 0xf7,
+                                                             0x87, 0xd6, 0xf7, 0x4e, 0xf7, 0x18, 0xf7, 0x1e,
+                                                             0x68, 0xf7, 0x6, 0x53, 0xed, 0x1f, 0xe9, 0xad,
+                                                             0x7a, 0xbc, 0x20, 0x65, 0x81, 0x9b, 0x87, 0x91,
+                                                             0x7f, 0x9b, 0x19, 0x9a, 0xa, 0xae, 0x64, 0x93,
+                                                             0x82, 0x9c, 0x6f, 0xfb, 0x9, 0x63, 0x18, 0x30,
+                                                             0xfc, 0x20, 0x15, 0xdd, 0xc2, 0xf7, 0x6, 0xf7,
+                                                             0x6, 0xbe, 0xc9, 0x6c, 0x35, 0x57, 0x5f, 0xfb,
+                                                             0x2f, 0xfb, 0x10, 0x3c, 0x68, 0xd1, 0xc5, 0x1e,
+                                                             0xe, 0x84, 0xa, 0xf8, 0xf8, 0xf7, 0x11, 0x39,
+                                                             0xdd, 0x89, 0x77, 0x12, 0xf8, 0x84, 0xf7, 0x2a,
+                                                             0x13, 0xc8, 0xcc, 0x16, 0xf7, 0x29, 0x6, 0xbb,
+                                                             0xf7, 0x6f, 0x9d, 0xdc, 0x91, 0xad, 0xa7, 0xb0,
+                                                             0x19, 0xad, 0xa7, 0xb9, 0xb0, 0xb9, 0x1b, 0xba,
+                                                             0x9a, 0x71, 0x6a, 0x70, 0x85, 0x6c, 0x85, 0x75,
+                                                             0x1f, 0x49, 0xfb, 0xc3, 0x5, 0xf7, 0x29, 0x6,
+                                                             0xcd, 0xf7, 0xc2, 0x5, 0x94, 0xb2, 0x8f, 0xb8,
+                                                             0xb4, 0x1a, 0xc1, 0x65, 0xcb, 0x22, 0x32, 0x4d,
+                                                             0x5f, 0x65, 0x60, 0x1e, 0x89, 0x8d, 0x99, 0xce,
+                                                             0x5, 0xfb, 0x20, 0x6, 0xe3, 0xdb, 0x15, 0xcd,
+                                                             0x6, 0x13, 0xa8, 0x90, 0x99, 0x94, 0xa7, 0xab,
+                                                             0x8c, 0xa6, 0x8c, 0xa0, 0x80, 0xa1, 0x7f, 0xa1,
+                                                             0x81, 0xa0, 0x82, 0xa6, 0x8c, 0xbc, 0x8e, 0xb7,
+                                                             0xb1, 0x98, 0xdc, 0x8, 0x48, 0x6, 0x72, 0x83,
+                                                             0x84, 0x7b, 0x77, 0x1b, 0x78, 0x78, 0x91, 0x93,
+                                                             0x78, 0x1f, 0x13, 0x98, 0x97, 0x70, 0x6d, 0x98,
+                                                             0x65, 0x1b, 0x13, 0xc8, 0x44, 0x74, 0x43, 0x58,
+                                                             0x81, 0x1f, 0xe, 0x4c, 0xa, 0xdd, 0xf7, 0x70,
+                                                             0x22, 0xa, 0xf7, 0x4c, 0xf8, 0xe, 0x15, 0xee,
+                                                             0x6, 0x4b, 0xf7, 0x2c, 0x65, 0xa, 0x73, 0x7d,
+                                                             0xf7, 0x1, 0xf9, 0x23, 0x77, 0x1, 0xdd, 0xf7,
+                                                             0x28, 0xf7, 0x9d, 0xf7, 0x28, 0x3, 0xf7, 0xfe,
+                                                             0xf8, 0xea, 0x15, 0xee, 0x6, 0xf7, 0x3d, 0x5d,
+                                                             0xa, 0xfb, 0x33, 0x6, 0xfc, 0x19, 0xfc, 0xa6,
+                                                             0x22, 0xa, 0xe, 0x4c, 0xa, 0xf7, 0x73, 0xf8,
+                                                             0xea, 0x15, 0xf7, 0xd, 0x6, 0xe4, 0xe5, 0xb3,
+                                                             0x31, 0x5, 0xf0, 0x6, 0x4c, 0xf7, 0x2c, 0x5b,
+                                                             0xa, 0xfb, 0xb9, 0xfc, 0xa6, 0x22, 0xa, 0xe,
+                                                             0x73, 0x7d, 0xf7, 0x1, 0xf8, 0xc4, 0xdd, 0x89,
+                                                             0x77, 0x12, 0xdd, 0xf7, 0x26, 0xf7, 0xa4, 0xf7,
+                                                             0x26, 0x13, 0xd8, 0xf7, 0x9b, 0xf8, 0xf7, 0x15,
+                                                             0xcc, 0x6, 0x8f, 0x9a, 0x94, 0xa7, 0xab, 0x8c,
+                                                             0xa4, 0x8c, 0xa5, 0x7c, 0xa7, 0x80, 0x9f, 0x82,
+                                                             0xa0, 0x84, 0x9e, 0x8c, 0xbb, 0x8e, 0xb6, 0xb1,
+                                                             0x98, 0xdc, 0x8, 0x48, 0x63, 0xa, 0x77, 0x78,
+                                                             0x92, 0x93, 0x76, 0x1f, 0x13, 0xb8, 0x97, 0x70,
+                                                             0x6d, 0x97, 0x6a, 0x1b, 0x45, 0x74, 0x43, 0x57,
+                                                             0x82, 0x1f, 0xfb, 0x49, 0xfc, 0x1b, 0x22, 0xa,
+                                                             0xe, 0x73, 0x7d, 0xf7, 0x0, 0x3f, 0xa, 0xf7,
+                                                             0x91, 0xf8, 0xf3, 0x15, 0xf7, 0x12, 0x6e, 0xa,
+                                                             0xfb, 0x12, 0x6, 0xf7, 0x50, 0xfb, 0xe, 0x15,
+                                                             0xf7, 0x12, 0x6e, 0xa, 0xfb, 0x11, 0x6, 0xfc,
+                                                             0x30, 0xfc, 0x91, 0x22, 0xa, 0xe, 0x58, 0xf7,
+                                                             0x4d, 0xf7, 0x1d, 0x1, 0xf7, 0xa6, 0xf7, 0x24,
+                                                             0x3, 0xdd, 0xf7, 0x4d, 0x15, 0xf8, 0xa4, 0xf7,
+                                                             0x1d, 0xfc, 0xa4, 0x6, 0xf7, 0x54, 0xda, 0x15,
+                                                             0xf7, 0x24, 0xf7, 0x27, 0xfb, 0x24, 0x6, 0xfc,
+                                                             0xe2, 0x4, 0xf7, 0x24, 0xf7, 0x25, 0xfb, 0x24,
+                                                             0x6, 0xe, 0xfb, 0x8, 0x83, 0x76, 0xb1, 0xeb,
+                                                             0xf7, 0xd5, 0xeb, 0xb1, 0x77, 0x1, 0xd3, 0xf7,
+                                                             0xb, 0xf7, 0x68, 0xf7, 0xc, 0x3, 0x9e, 0x9a,
+                                                             0x15, 0xc2, 0x5f, 0xcb, 0xce, 0x5, 0x70, 0xc3,
+                                                             0xc0, 0x89, 0xac, 0x1b, 0xf7, 0x59, 0xeb, 0xf7,
+                                                             0x24, 0xf7, 0x28, 0xbf, 0x7b, 0xd0, 0x73, 0xa8,
+                                                             0x1f, 0xca, 0xcd, 0x52, 0xb6, 0x4b, 0x49, 0x5,
+                                                             0xa6, 0x56, 0x4d, 0x8c, 0x72, 0x1b, 0xfb, 0x97,
+                                                             0x69, 0xfb, 0x6c, 0x32, 0x48, 0x9b, 0x59, 0xa2,
+                                                             0x78, 0x1f, 0xe3, 0xe7, 0x15, 0x88, 0x93, 0x86,
+                                                             0x98, 0xa2, 0x1a, 0xd7, 0xc2, 0xf7, 0x19, 0xf7,
+                                                             0x7, 0xb0, 0x9e, 0x80, 0x87, 0x94, 0x1e, 0xfb,
+                                                             0x47, 0xfb, 0xb8, 0x15, 0xf7, 0x76, 0xf7, 0x82,
+                                                             0x5, 0x8e, 0x80, 0x92, 0x73, 0x76, 0x1a, 0x49,
+                                                             0x5d, 0xfb, 0x16, 0xfb, 0x13, 0x67, 0x7b, 0x94,
+                                                             0x90, 0x80, 0x1e, 0xe, 0x59, 0xa, 0xf8, 0x91,
+                                                             0xf7, 0x2c, 0x29, 0xa, 0x79, 0xf8, 0xa5, 0x75,
+                                                             0xa, 0xe, 0x59, 0xa, 0xf9, 0x29, 0x77, 0x29,
+                                                             0xa, 0x21, 0xf8, 0xaa, 0x60, 0xa, 0x59, 0xa,
+                                                             0xf8, 0x96, 0xf7, 0x27, 0x29, 0xa, 0xfb, 0x74,
+                                                             0xf8, 0xaa, 0x45, 0xa, 0x59, 0xa, 0x12, 0x13,
+                                                             0x40, 0x28, 0xa, 0x13, 0x80, 0x35, 0xa, 0x13,
+                                                             0x40, 0xfb, 0x2f, 0xf8, 0xb0, 0x3a, 0xa, 0x3c,
+                                                             0xfb, 0x55, 0x76, 0xfa, 0x58, 0x77, 0x1, 0xcb,
+                                                             0xf8, 0xf6, 0x3, 0xc2, 0x30, 0x15, 0x7e, 0xfb,
+                                                             0x0, 0x7e, 0xa, 0xcb, 0xee, 0xc2, 0x1f, 0xf7,
+                                                             0xd1, 0xf8, 0xd9, 0x77, 0xa, 0xfc, 0x28, 0x51,
+                                                             0xa, 0x59, 0xf8, 0x28, 0x54, 0xa, 0xe5, 0xfc,
+                                                             0xa4, 0x5, 0x4e, 0x6c, 0xa, 0xf7, 0xa5, 0xf9,
+                                                             0x46, 0x15, 0xe7, 0x6, 0xf7, 0x31, 0xf7, 0x2b,
+                                                             0x94, 0xa, 0xe, 0x73, 0xfb, 0x4f, 0x76, 0xf7,
+                                                             0x51, 0xf6, 0xf7, 0xea, 0xf0, 0xf7, 0x4f, 0x77,
+                                                             0x1, 0x9d, 0xf7, 0x23, 0xf7, 0xec, 0xf7, 0x20,
+                                                             0x3, 0xf7, 0x70, 0xcc, 0x15, 0x3d, 0xbd, 0xd8,
+                                                             0x85, 0xac, 0x1b, 0xf7, 0x2d, 0xf7, 0x4, 0xf7,
+                                                             0x2d, 0xf7, 0x3e, 0xe9, 0x69, 0xf7, 0x19, 0xfb,
+                                                             0x2b, 0x40, 0x58, 0x66, 0x79, 0x73, 0x1f, 0xbd,
+                                                             0xf7, 0x86, 0x47, 0xa, 0xfb, 0x5b, 0xfe, 0x32,
+                                                             0x8d, 0xa, 0xed, 0xf8, 0x3d, 0x15, 0xc0, 0xab,
+                                                             0xf7, 0x34, 0xf7, 0x5, 0xc1, 0xba, 0x60, 0x38,
+                                                             0x4a, 0x67, 0xfb, 0x2b, 0xfb, 0x1, 0x6a, 0x47,
+                                                             0xa2, 0xf5, 0x1e, 0xe, 0x3c, 0xfb, 0x55, 0x76,
+                                                             0xf9, 0xca, 0xf7, 0xd, 0x1, 0xc2, 0x2f, 0x15,
+                                                             0x7e, 0x20, 0x7e, 0xa, 0xca, 0xee, 0xc2, 0x1f,
+                                                             0xf7, 0xd1, 0xf8, 0xd8, 0x77, 0xa, 0xfc, 0x29,
+                                                             0x51, 0xa, 0x59, 0xf8, 0x29, 0x54, 0xa, 0xe5,
+                                                             0xfc, 0xa4, 0x5, 0x4f, 0x6c, 0xa, 0xf7, 0x42,
+                                                             0xf9, 0x50, 0x6b, 0xa, 0xf7, 0x47, 0xfb, 0xd,
+                                                             0x6b, 0xa, 0xe, 0x78, 0x9e, 0xf8, 0xa8, 0x99,
+                                                             0xf7, 0x40, 0x9e, 0x6, 0xfb, 0x6d, 0x95, 0x7,
+                                                             0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xf2,
+                                                             0xa, 0xf7, 0x2a, 0xb, 0xf2, 0x9c, 0x93, 0xc,
+                                                             0xc, 0xf7, 0xe1, 0x14, 0xf9, 0xf, 0x15, 0xb1,
+                                                             0x13, 0x0, 0x7c, 0x2, 0x0, 0x1, 0x0, 0x31,
+                                                             0x0, 0x6d, 0x0, 0x7a, 0x0, 0xc0, 0x1, 0x5,
+                                                             0x1, 0x2a, 0x1, 0x51, 0x1, 0x55, 0x1, 0x87,
+                                                             0x1, 0x93, 0x1, 0xa3, 0x1, 0xa8, 0x1, 0xc7,
+                                                             0x1, 0xd1, 0x1, 0xd4, 0x1, 0xdc, 0x1, 0xea,
+                                                             0x1, 0xf8, 0x2, 0x4, 0x2, 0x11, 0x2, 0x1b,
+                                                             0x2, 0x2a, 0x2, 0x34, 0x2, 0x3b, 0x2, 0x44,
+                                                             0x2, 0x4d, 0x2, 0x56, 0x2, 0x5e, 0x2, 0x67,
+                                                             0x2, 0x6c, 0x2, 0x71, 0x2, 0x7b, 0x2, 0x80,
+                                                             0x2, 0x8d, 0x2, 0x94, 0x2, 0x99, 0x2, 0x9e,
+                                                             0x2, 0xaf, 0x2, 0xb9, 0x2, 0xbe, 0x2, 0xc3,
+                                                             0x2, 0xcf, 0x2, 0xe2, 0x2, 0xea, 0x2, 0xf5,
+                                                             0x3, 0x7, 0x3, 0xd, 0x3, 0x12, 0x3, 0x18,
+                                                             0x3, 0x1c, 0x3, 0x26, 0x3, 0x2b, 0x3, 0x30,
+                                                             0x3, 0x34, 0x3, 0x3e, 0x3, 0x4d, 0x3, 0x54,
+                                                             0x3, 0x5a, 0x3, 0x5f, 0x3, 0x63, 0x3, 0x67,
+                                                             0x3, 0x6b, 0x3, 0x6f, 0x3, 0x7a, 0x3, 0x84,
+                                                             0x3, 0x91, 0x3, 0x9e, 0x3, 0xa6, 0x3, 0xae,
+                                                             0x3, 0xb1, 0x3, 0xb5, 0x3, 0xb9, 0x3, 0xbd,
+                                                             0x3, 0xc9, 0x3, 0xcf, 0x3, 0xd8, 0x3, 0xe4,
+                                                             0x3, 0xef, 0x3, 0xf4, 0x3, 0xfa, 0x4, 0x0,
+                                                             0x4, 0x6, 0x4, 0xc, 0x4, 0x17, 0x4, 0x22,
+                                                             0x4, 0x2c, 0x4, 0x33, 0x4, 0x38, 0x4, 0x3f,
+                                                             0x4, 0x46, 0x4, 0x4b, 0x4, 0x50, 0x4, 0x54,
+                                                             0x4, 0x5e, 0x4, 0x68, 0x4, 0x72, 0x4, 0x7c,
+                                                             0x4, 0x7f, 0x4, 0x83, 0x4, 0x87, 0x4, 0x8b,
+                                                             0x4, 0x8f, 0x4, 0x95, 0x4, 0x9e, 0x4, 0xa7,
+                                                             0x4, 0xb0, 0x4, 0xb6, 0x4, 0xbb, 0x4, 0xc1,
+                                                             0x4, 0xc6, 0x4, 0xcb, 0x4, 0xd0, 0x4, 0xd5,
+                                                             0x4, 0xda, 0x4, 0xde, 0x4, 0xe3, 0x4, 0xe8,
+                                                             0x4, 0xec, 0x4, 0xf0, 0x4, 0xf4, 0x4, 0xf8,
+                                                             0x4, 0xfc, 0x5, 0x0, 0x5, 0x4, 0x2f, 0xa,
+                                                             0x99, 0xa, 0xab, 0xb1, 0x1a, 0xab, 0x7c, 0xf7,
+                                                             0x4, 0x33, 0xa, 0x7f, 0x5, 0xb9, 0x98, 0xb1,
+                                                             0x9a, 0xb8, 0x1b, 0xce, 0xa8, 0x5b, 0x54, 0x70,
+                                                             0x1f, 0x6c, 0x81, 0x54, 0x86, 0x50, 0x85, 0x8,
+                                                             0x42, 0x86, 0xfb, 0x2f, 0x7f, 0xfb, 0x34, 0x1a,
+                                                             0x28, 0xd6, 0x52, 0xe1, 0x1e, 0xb, 0x15, 0xfb,
+                                                             0x23, 0xe3, 0xfb, 0x32, 0xf7, 0x69, 0xf7, 0xb1,
+                                                             0xf7, 0x16, 0xf7, 0x95, 0xf7, 0x56, 0xf7, 0x49,
+                                                             0xfb, 0x6, 0xf7, 0x13, 0xfb, 0x53, 0xfb, 0xc9,
+                                                             0x25, 0xfb, 0xb4, 0xfb, 0x3e, 0x1e, 0xf7, 0x2a,
+                                                             0x16, 0xf7, 0x37, 0xf0, 0xf7, 0x3d, 0xf7, 0x29,
+                                                             0xf7, 0x3, 0xc2, 0x34, 0x2a, 0xfb, 0xa, 0x3b,
+                                                             0xfb, 0x61, 0xfb, 0x3c, 0x2a, 0x44, 0xd1, 0xf4,
+                                                             0x1e, 0xb, 0x15, 0xfb, 0x11, 0xde, 0xfb, 0x1,
+                                                             0x38, 0xa, 0xf7, 0x36, 0x26, 0xa, 0xb, 0x15,
+                                                             0xf8, 0x8, 0x6, 0x94, 0xae, 0x8c, 0xb3, 0x99,
+                                                             0x1a, 0xf0, 0x5d, 0xf7, 0x1c, 0xfb, 0x41, 0xfb,
+                                                             0x6e, 0x35, 0xfb, 0x33, 0xfb, 0x1b, 0xfb, 0x24,
+                                                             0xe9, 0xfb, 0xf, 0xf7, 0x2d, 0xd7, 0xf7, 0x1,
+                                                             0xa6, 0xf7, 0x15, 0xcc, 0x1e, 0xfb, 0x1a, 0xa1,
+                                                             0x5, 0x7a, 0x83, 0x6a, 0x51, 0x41, 0x1b, 0x4d,
+                                                             0x5a, 0xbc, 0xde, 0x8f, 0x1f, 0x9a, 0xe3, 0x15,
+                                                             0xbe, 0x95, 0xaf, 0xde, 0xe1, 0x1b, 0xd8, 0xa6,
+                                                             0x4c, 0x44, 0x88, 0x1f, 0xb, 0x1, 0xf7, 0x8,
+                                                             0xf7, 0x28, 0x3, 0xf7, 0x6b, 0xf9, 0x73, 0x15,
+                                                             0x3a, 0xfc, 0x2a, 0x5, 0x81, 0x5f, 0x83, 0x59,
+                                                             0x5b, 0x1a, 0xfb, 0x1, 0xc2, 0x2a, 0xf7, 0x62,
+                                                             0xf7, 0xa3, 0xb6, 0xf7, 0x64, 0xf7, 0x20, 0xa8,
+                                                             0x1e, 0xdf, 0xf8, 0x2a, 0x5, 0x97, 0xa, 0x37,
+                                                             0xfc, 0x2a, 0x5, 0xfb, 0x13, 0x71, 0x78, 0x2e,
+                                                             0xfb, 0x20, 0x1b, 0x2b, 0x73, 0xb4, 0xc5, 0xaf,
+                                                             0x94, 0xb5, 0x94, 0xb6, 0x1f, 0xdf, 0xf8, 0x2a,
+                                                             0x5, 0xb, 0x5e, 0xa, 0xe1, 0xf7, 0x36, 0x5,
+                                                             0xf7, 0xaf, 0x6, 0xa3, 0xfb, 0x36, 0x5, 0xf7,
+                                                             0x1f, 0x6, 0xfb, 0x8, 0xf9, 0x71, 0x43, 0xa,
+                                                             0x27, 0xfc, 0x54, 0x15, 0xf7, 0x30, 0xf7, 0xba,
+                                                             0x5c, 0xa, 0xb3, 0xfb, 0xba, 0x5, 0xb, 0xf7,
+                                                             0xe, 0x48, 0xf7, 0xa, 0xfb, 0x4f, 0xfb, 0x7d,
+                                                             0x41, 0xfb, 0x4c, 0xfb, 0x21, 0x1e, 0xf7, 0x25,
+                                                             0x16, 0xcb, 0xb0, 0xf7, 0x2b, 0xf7, 0x11, 0xdb,
+                                                             0xa8, 0x3d, 0x57, 0x29, 0x56, 0xfb, 0x4, 0x21,
+                                                             0x3f, 0x67, 0xcb, 0xc8, 0x1e, 0xb, 0x15, 0x25,
+                                                             0xa, 0xe, 0xf8, 0x31, 0x89, 0x15, 0x82, 0xa,
+                                                             0xf7, 0x2, 0xf8, 0xa7, 0x47, 0xa, 0x57, 0xfb,
+                                                             0x8e, 0x5, 0x46, 0x71, 0x7f, 0xfb, 0xd, 0xfb,
+                                                             0xe, 0x1b, 0x5e, 0x7d, 0xa4, 0xad, 0xa1, 0x90,
+                                                             0xa4, 0x91, 0xa0, 0x1f, 0xcc, 0xf7, 0xcd, 0x44,
+                                                             0xa, 0x4d, 0xfb, 0xba, 0x5, 0x85, 0x6a, 0x81,
+                                                             0x60, 0x62, 0x1a, 0xb, 0x12, 0x13, 0x60, 0x28,
+                                                             0xa, 0x13, 0xa0, 0x35, 0xa, 0x13, 0x60, 0xb,
+                                                             0x30, 0xa, 0x9c, 0xf7, 0x8e, 0x15, 0x88, 0x78,
+                                                             0x5, 0x31, 0xa, 0x90, 0xe6, 0x99, 0x1f, 0xb,
+                                                             0xfd, 0x22, 0x21, 0xa, 0xe, 0xf8, 0xc4, 0x6,
+                                                             0xa5, 0xf7, 0x10, 0x5, 0xfc, 0x31, 0x6, 0xb3,
+                                                             0xf7, 0x5a, 0x70, 0xa, 0xf7, 0x10, 0x5, 0xfb,
+                                                             0xfe, 0x6, 0xad, 0xf7, 0x3c, 0x6f, 0xa, 0xf7,
+                                                             0xf, 0x90, 0xa, 0xb, 0xe2, 0x78, 0xf7, 0x14,
+                                                             0xf9, 0x6, 0x77, 0x24, 0xa, 0xb, 0x2a, 0xa,
+                                                             0xe, 0x32, 0xa, 0x9a, 0xca, 0x99, 0xc0, 0x1e,
+                                                             0xb, 0xba, 0xcb, 0x9d, 0xc2, 0xbf, 0x1f, 0x8d,
+                                                             0x70, 0x8c, 0x82, 0x93, 0x72, 0x8, 0xb, 0x5f,
+                                                             0x81, 0x77, 0x30, 0x20, 0x1b, 0x5a, 0x77, 0xab,
+                                                             0xa7, 0xd6, 0xf7, 0xa, 0xb, 0x15, 0xf7, 0x27,
+                                                             0x6, 0x83, 0xa6, 0x87, 0x9e, 0xaa, 0x1a, 0xbc,
+                                                             0xb, 0xfb, 0x5a, 0x27, 0xfb, 0x3, 0x6b, 0xfb,
+                                                             0xd, 0x5f, 0x1e, 0xf7, 0x28, 0xb, 0x68, 0xa,
+                                                             0xf7, 0x36, 0xf7, 0xf, 0xf8, 0x54, 0x77, 0xb,
+                                                             0x46, 0xa6, 0x4c, 0xf7, 0x6, 0xcd, 0xce, 0xa9,
+                                                             0xc2, 0xc2, 0x1e, 0x8d, 0x89, 0x5, 0xb, 0x1,
+                                                             0xf6, 0xf7, 0x2a, 0xf8, 0x34, 0xf7, 0x2a, 0x3,
+                                                             0xb, 0xa0, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xb,
+                                                             0xf7, 0x3d, 0xf7, 0x59, 0xf7, 0x4, 0xf7, 0x31,
+                                                             0xb, 0x15, 0xf7, 0xc, 0x40, 0xa, 0xfb, 0xc,
+                                                             0x6, 0xb, 0x39, 0xa, 0xf7, 0x48, 0xfb, 0xc,
+                                                             0x39, 0xa, 0xe, 0xf7, 0x2, 0x97, 0xc1, 0xa2,
+                                                             0xf5, 0x18, 0xb, 0xf7, 0x1c, 0x6, 0xf4, 0xf8,
+                                                             0xa6, 0x5b, 0xa, 0xb, 0x5, 0xfb, 0x21, 0x6,
+                                                             0xb, 0x8e, 0xa2, 0x3b, 0xa, 0xb, 0x1, 0xdd,
+                                                             0xf7, 0x25, 0xf7, 0xa3, 0xf7, 0x25, 0x3, 0xb,
+                                                             0x6, 0xa4, 0x83, 0xa, 0xb, 0xab, 0x8b, 0xf7,
+                                                             0x10, 0xf7, 0x5a, 0xf7, 0x10, 0xf7, 0x3c, 0xf7,
+                                                             0xf, 0xb, 0x3c, 0x7d, 0xf7, 0x0, 0x2b, 0xeb,
+                                                             0xb, 0x5, 0xfb, 0x37, 0x6, 0xb, 0x5, 0xfb,
+                                                             0x24, 0x6, 0xb, 0x15, 0xf7, 0x8, 0x6, 0xe0,
+                                                             0xe2, 0xb1, 0x34, 0x5, 0xec, 0x6, 0x4f, 0xf7,
+                                                             0x27, 0x66, 0xa, 0xe, 0xf7, 0x29, 0x6, 0xf7,
+                                                             0x40, 0xf9, 0x74, 0x5a, 0xa, 0xb, 0x5, 0xfb,
+                                                             0x23, 0x6, 0xb, 0xfb, 0xf9, 0xa0, 0x76, 0xb,
+                                                             0xf7, 0x23, 0x78, 0xf7, 0x14, 0xf9, 0x37, 0xf7,
+                                                             0x2c, 0x36, 0xa, 0xb, 0x15, 0xdb, 0x6, 0x57,
+                                                             0xf7, 0x65, 0xf7, 0x24, 0xf7, 0x5b, 0x5, 0x2b,
+                                                             0x6, 0xfb, 0x39, 0xfb, 0x53, 0x5, 0xb, 0x7c,
+                                                             0xa, 0xa8, 0xf7, 0x26, 0x44, 0xa, 0xb, 0x73,
+                                                             0x7d, 0xf7, 0x1, 0xf8, 0x8b, 0xf7, 0x2c, 0x3f,
+                                                             0xa, 0xb, 0x15, 0xeb, 0x6, 0xf7, 0x39, 0xf7,
+                                                             0x59, 0x32, 0xf7, 0x67, 0x5, 0x3b, 0x6, 0xbf,
+                                                             0xfb, 0x67, 0x5, 0xb, 0x48, 0xa, 0xf9, 0x74,
+                                                             0x77, 0xb, 0x6, 0xa4, 0x55, 0xa, 0xb, 0x6,
+                                                             0xa4, 0xf7, 0xd, 0x5, 0xb, 0x5, 0x89, 0x6,
+                                                             0xb, 0x6, 0xf7, 0x44, 0xf7, 0x26, 0x5, 0xfb,
+                                                             0x3a, 0x6, 0xb, 0x5, 0xfb, 0x29, 0x6, 0xb,
+                                                             0x5, 0xfb, 0x1e, 0x6, 0xb, 0xf7, 0xe, 0x5,
+                                                             0xb, 0xf7, 0x1e, 0x8e, 0xa3, 0x3b, 0xa, 0xfb,
+                                                             0x1f, 0x6, 0xb, 0xe2, 0x8b, 0xf7, 0xa, 0xf8,
+                                                             0x76, 0xf7, 0xa, 0x1, 0xf9, 0x6, 0xf7, 0x2b,
+                                                             0x3, 0xb, 0xec, 0x76, 0xf8, 0x2c, 0x77, 0x1,
+                                                             0xb, 0x73, 0x7d, 0xf2, 0x30, 0xe6, 0xb, 0x5,
+                                                             0xfb, 0x2a, 0x6, 0xb, 0x85, 0xa, 0x6, 0xb,
+                                                             0x5, 0x8d, 0x6, 0xb, 0xf7, 0x2c, 0x5, 0xb,
+                                                             0xf7, 0x2a, 0x6, 0xb, 0x4f, 0xa, 0xfb, 0xd,
+                                                             0x6, 0xf7, 0x49, 0xfb, 0xe, 0x15, 0xb, 0x15,
+                                                             0xe8, 0x6, 0xf7, 0x32, 0xf7, 0x27, 0x53, 0xa,
+                                                             0xe, 0x15, 0xca, 0x6, 0x7e, 0x52, 0x73, 0x7a,
+                                                             0x5f, 0x82, 0x7e, 0x4d, 0x18, 0xb, 0xfb, 0x15,
+                                                             0x5, 0xca, 0x6, 0x7e, 0x53, 0x73, 0x7b, 0x5f,
+                                                             0x81, 0x8, 0xb, 0x6, 0x72, 0x84, 0x84, 0x7b,
+                                                             0x77, 0x1b, 0xb, 0xf7, 0xc0, 0x16, 0xf7, 0x20,
+                                                             0x6, 0xc1, 0xb, 0x3d, 0xa, 0xe, 0x98, 0xa,
+                                                             0x6, 0xb, 0xf7, 0x2b, 0x5, 0xb, 0xe2, 0xa0,
+                                                             0x76, 0xb, 0x15, 0xf7, 0xa, 0x6, 0xa4, 0xf7,
+                                                             0x7, 0x5, 0xfb, 0xa, 0x6, 0xb, 0x86, 0xa,
+                                                             0xfb, 0xe, 0x6, 0xb, 0x15, 0xf7, 0xb, 0x50,
+                                                             0xa, 0xfb, 0xb, 0x6, 0xb, 0x72, 0x69, 0x63,
+                                                             0x5c, 0x1b, 0x86, 0x79, 0x8b, 0x93, 0x72, 0x1f,
+                                                             0xb, 0x15, 0xf7, 0x15, 0x6, 0xa6, 0x55, 0xa,
+                                                             0xfb, 0x15, 0x6, 0xb, 0x6, 0xa5, 0x55, 0xa,
+                                                             0xb, 0x5, 0xf8, 0x14, 0x6, 0xa4, 0xb, 0x5,
+                                                             0xf7, 0xfe, 0x6, 0xa4, 0xb, 0x6, 0xa5, 0xf7,
+                                                             0xf, 0x5, 0xb, 0xf8, 0xf0, 0xf7, 0x26, 0x1,
+                                                             0xb, 0xfb, 0x8a, 0xfb, 0x58, 0xf7, 0x7, 0xf7,
+                                                             0xb2, 0xf7, 0x8, 0xb, 0xfb, 0x11, 0x59, 0xfb,
+                                                             0x2f, 0x3b, 0x1e, 0xe8, 0x16, 0x9b, 0xb, 0x15,
+                                                             0xec, 0x6, 0x4c, 0x5d, 0xa, 0xfb, 0x1f, 0x6,
+                                                             0xb, 0x12, 0xc2, 0xf7, 0x23, 0x13, 0x70, 0xb,
+                                                             0x94, 0xa, 0xfb, 0x57, 0xb, 0x8d, 0x76, 0xf9,
+                                                             0x88, 0x77, 0x1, 0xb, 0xa0, 0x76, 0xf8, 0xa8,
+                                                             0x77, 0x1, 0xb, 0x5, 0xfb, 0xe, 0x6, 0xb,
+                                                             0x5, 0xfb, 0x27, 0x6, 0xb, 0xf7, 0x24, 0x6,
+                                                             0xb, 0x1, 0xd1, 0xf7, 0x22, 0xf7, 0x8b, 0xf7,
+                                                             0x1a, 0x3, 0xb, 0x5, 0x87, 0x9b, 0xb8, 0x80,
+                                                             0xb2, 0x1b, 0xf2, 0xae, 0xb, 0xfb, 0x58, 0xf7,
+                                                             0x2, 0xf9, 0x4e, 0xf7, 0x2, 0x1, 0xb, 0xcc,
+                                                             0xf7, 0x5a, 0xf7, 0x44, 0xf7, 0x9, 0x9c, 0x32,
+                                                             0xb, 0x54, 0xa, 0xe, 0xf7, 0x1b, 0x6, 0xb,
+                                                             0xf7, 0xc, 0x5, 0xb, 0x73, 0xa0, 0x76, 0xb,
+                                                             0x5, 0xfb, 0x1c, 0xb, 0x15, 0xf7, 0xe, 0x4f,
+                                                             0xa, 0xb, 0x73, 0x8b, 0xf7, 0xd, 0xf8, 0xe9,
+                                                             0x77, 0x1, 0xb, 0xf7, 0x77, 0xf5, 0x1, 0xbb,
+                                                             0xf7, 0x77, 0x15, 0xb, 0x6, 0xa1, 0xf7, 0x3,
+                                                             0x5, 0xfb, 0x3d, 0x6, 0xb, 0xd0, 0x16, 0xf7,
+                                                             0x21, 0x6, 0xb, 0x96, 0xa, 0xd7, 0x16, 0xb,
+                                                             0xf7, 0x23, 0x78, 0xf7, 0x12, 0xb, 0x5, 0xf7,
+                                                             0x23, 0x6, 0xb, 0x15, 0xf7, 0x1e, 0x6, 0xb,
+                                                             0x15, 0xf7, 0xe, 0x6, 0xb, 0x5, 0xfc, 0xa7,
+                                                             0x6, 0xb, 0x5, 0xfb, 0x1b, 0x6, 0xb, 0x5,
+                                                             0x9a, 0xa, 0xb, 0x5, 0xfb, 0x26, 0x6, 0xb,
+                                                             0x5, 0xfb, 0x28, 0x6, 0xb, 0xf7, 0x2b, 0x1,
+                                                             0xb, 0xf7, 0xc, 0x1, 0xb, 0xfb, 0x2b, 0x6,
+                                                             0xb, 0x5, 0xfb, 0x17, 0xb, 0xa0, 0xe8, 0x93,
+                                                             0xb, 0xfb, 0x22, 0x6, 0xb, 0xf7, 0x22, 0x6,
+                                                             0xb
+                                                            };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c
new file mode 100644
index 0000000..9ac2ede
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c
@@ -0,0 +1,2051 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansItalicFontData [16339] = {0x1,
+                                                         0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x14,
+                                                         0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,
+                                                         0x73, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74, 0x61,
+                                                         0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1, 0x27,
+                                                         0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d,
+                                                         0x2, 0xf8, 0x1e, 0x3, 0xf8, 0x18, 0x4, 0x7f,
+                                                         0xc, 0x2, 0xfb, 0x3e, 0xfb, 0x75, 0xfa, 0xf0,
+                                                         0xfa, 0x4b, 0x5, 0xf7, 0x36, 0xf, 0xf9, 0x1,
+                                                         0x11, 0xc3, 0x1c, 0x3a, 0xfc, 0x12, 0x0, 0x4,
+                                                         0x1, 0x1, 0x5, 0x2f, 0x44, 0x52, 0x45, 0x75,
+                                                         0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                         0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f,
+                                                         0x6d, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x4f,
+                                                         0x54, 0x46, 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69,
+                                                         0x63, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x53,
+                                                         0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46, 0x0,
+                                                         0x0, 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab,
+                                                         0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf,
+                                                         0x0, 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1,
+                                                         0x0, 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3,
+                                                         0x0, 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87,
+                                                         0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a,
+                                                         0x0, 0xb6, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9,
+                                                         0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x8c,
+                                                         0x0, 0x2e, 0x0, 0x2f, 0x0, 0xba, 0x0, 0x30,
+                                                         0x0, 0x8e, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd,
+                                                         0x0, 0xbe, 0x0, 0x8d, 0x0, 0xbf, 0x0, 0x31,
+                                                         0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0xc0,
+                                                         0x0, 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1,
+                                                         0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37,
+                                                         0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5,
+                                                         0x0, 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42,
+                                                         0x0, 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca,
+                                                         0x0, 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc,
+                                                         0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0, 0x21,
+                                                         0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0, 0x5d,
+                                                         0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0, 0x3e,
+                                                         0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0, 0x44,
+                                                         0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0, 0x61,
+                                                         0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0, 0xaa,
+                                                         0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0, 0x71,
+                                                         0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0, 0x5,
+                                                         0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0, 0xcf,
+                                                         0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0x19,
+                                                         0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0, 0x1e,
+                                                         0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0, 0x47,
+                                                         0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0, 0x65,
+                                                         0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x0, 0x95,
+                                                         0x0, 0x7c, 0x0, 0x1f, 0x0, 0x6a, 0x0, 0x78,
+                                                         0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x86,
+                                                         0x0, 0xe, 0x0, 0x4a, 0x0, 0xd3, 0x0, 0xd4,
+                                                         0x0, 0xd5, 0x0, 0xd6, 0x0, 0x4b, 0x0, 0x4c,
+                                                         0x0, 0x4d, 0x0, 0x1d, 0x0, 0x97, 0x0, 0x92,
+                                                         0x0, 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98,
+                                                         0x0, 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7,
+                                                         0x0, 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9,
+                                                         0x0, 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb,
+                                                         0x0, 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96,
+                                                         0x0, 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc,
+                                                         0x0, 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa,
+                                                         0x0, 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a,
+                                                         0x0, 0xc, 0x0, 0x9c, 0x0, 0x52, 0x0, 0x20,
+                                                         0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0, 0x69,
+                                                         0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0, 0x75,
+                                                         0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0, 0x84,
+                                                         0x0, 0x54, 0x0, 0xdd, 0x0, 0x66, 0x0, 0x1c,
+                                                         0x0, 0x18, 0x0, 0x17, 0x0, 0x10, 0x0, 0x1,
+                                                         0x0, 0x62, 0x0, 0x55, 0x0, 0xa2, 0x0, 0x14,
+                                                         0x0, 0xa3, 0x0, 0xa9, 0x0, 0x7f, 0x0, 0x99,
+                                                         0x0, 0x13, 0x0, 0xa4, 0x0, 0x56, 0x0, 0xde,
+                                                         0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0x40,
+                                                         0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a,
+                                                         0x0, 0xe2, 0x0, 0xe3, 0x0, 0x64, 0x0, 0x5b,
+                                                         0x0, 0xe4, 0x0, 0x11, 0x0, 0xe6, 0x2, 0x0,
+                                                         0x1, 0x0, 0x3, 0x0, 0x36, 0x0, 0x82, 0x0,
+                                                         0x94, 0x0, 0xa7, 0x0, 0xb9, 0x0, 0xd1, 0x1,
+                                                         0x10, 0x1, 0x54, 0x1, 0xb3, 0x2, 0x5, 0x2,
+                                                         0x89, 0x2, 0xc9, 0x2, 0xf6, 0x3, 0x3, 0x3,
+                                                         0x10, 0x3, 0x1c, 0x3, 0x2f, 0x3, 0x87, 0x4,
+                                                         0x6, 0x4, 0x2e, 0x4, 0x8d, 0x4, 0xbc, 0x4,
+                                                         0xca, 0x4, 0xe6, 0x5, 0x6, 0x5, 0x29, 0x5,
+                                                         0x3e, 0x5, 0x72, 0x5, 0xa5, 0x5, 0xbb, 0x5,
+                                                         0xe6, 0x6, 0x17, 0x6, 0x3f, 0x6, 0xa1, 0x6,
+                                                         0xf1, 0x7, 0x77, 0x7, 0x9a, 0x7, 0xc3, 0x7,
+                                                         0xe8, 0x8, 0x5, 0x8, 0x84, 0x8, 0xd2, 0x9,
+                                                         0x12, 0x9, 0x91, 0x9, 0xec, 0xa, 0x59, 0xa,
+                                                         0xdf, 0xa, 0xff, 0xb, 0x47, 0xb, 0x84, 0xb,
+                                                         0xd6, 0xb, 0xf7, 0xc, 0x1f, 0xc, 0x71, 0xc,
+                                                         0x8c, 0xc, 0xc9, 0xc, 0xfa, 0xd, 0x22, 0xd,
+                                                         0x51, 0xd, 0x89, 0xd, 0xb1, 0xd, 0xee, 0xe,
+                                                         0x7c, 0xe, 0x9e, 0xe, 0xc3, 0xe, 0xda, 0xf,
+                                                         0x9, 0xf, 0xbb, 0xf, 0xda, 0x10, 0x79, 0x10,
+                                                         0xc2, 0x10, 0xe4, 0x11, 0x2e, 0x11, 0x63, 0x12,
+                                                         0x19, 0x12, 0x70, 0x12, 0xca, 0x12, 0xe2, 0x12,
+                                                         0xfc, 0x13, 0x4f, 0x13, 0xa6, 0x13, 0xca, 0x13,
+                                                         0xec, 0x14, 0x16, 0x14, 0x38, 0x14, 0x56, 0x14,
+                                                         0xa0, 0x14, 0xb7, 0x15, 0x2a, 0x15, 0x63, 0x15,
+                                                         0xce, 0x15, 0xee, 0x16, 0x6, 0x16, 0x26, 0x16,
+                                                         0xbd, 0x17, 0x35, 0x17, 0x90, 0x17, 0xc8, 0x18,
+                                                         0x16, 0x18, 0x50, 0x18, 0x61, 0x18, 0x92, 0x19,
+                                                         0x1f, 0x19, 0x31, 0x19, 0x42, 0x19, 0x99, 0x19,
+                                                         0xbc, 0x19, 0xe6, 0x1a, 0x4, 0x1a, 0x25, 0x1a,
+                                                         0x96, 0x1a, 0xad, 0x1a, 0xb8, 0x1a, 0xc1, 0x1a,
+                                                         0xe2, 0x1b, 0x51, 0x1b, 0x75, 0x1b, 0xa3, 0x1b,
+                                                         0xde, 0x1c, 0x22, 0x1c, 0x7a, 0x1c, 0xb7, 0x1d,
+                                                         0x16, 0x1d, 0x53, 0x1d, 0x70, 0x1d, 0xdd, 0x1e,
+                                                         0x52, 0x1e, 0x60, 0x1e, 0x89, 0x1e, 0xb7, 0x1e,
+                                                         0xe3, 0x1e, 0xfd, 0x1f, 0x1b, 0x1f, 0x5d, 0x1f,
+                                                         0x6b, 0x1f, 0x82, 0x1f, 0x9f, 0x1f, 0xbb, 0x1f,
+                                                         0xdd, 0x1f, 0xfd, 0x20, 0x13, 0x20, 0x51, 0x20,
+                                                         0x7c, 0x20, 0x8b, 0x20, 0xaf, 0x20, 0xcd, 0x20,
+                                                         0xee, 0x21, 0x52, 0x21, 0x66, 0x21, 0x7a, 0x21,
+                                                         0xcc, 0x21, 0xfd, 0x22, 0x3c, 0x22, 0xa1, 0x23,
+                                                         0x1b, 0x23, 0x72, 0x23, 0xb9, 0x23, 0xd7, 0x23,
+                                                         0xfb, 0x24, 0x23, 0x24, 0xba, 0x24, 0xeb, 0x25,
+                                                         0x3, 0x25, 0x2f, 0x25, 0xb0, 0x26, 0x16, 0x26,
+                                                         0x3c, 0x26, 0xc6, 0x27, 0x6, 0x27, 0x7c, 0x27,
+                                                         0xd3, 0x28, 0x29, 0x28, 0x52, 0x28, 0x88, 0x28,
+                                                         0xbd, 0x29, 0x5d, 0x29, 0x6b, 0x29, 0x7f, 0x2a,
+                                                         0x39, 0x2a, 0x5c, 0x2a, 0x9d, 0x2a, 0xf8, 0x2b,
+                                                         0x4b, 0x2b, 0xa1, 0x2b, 0xd2, 0x2b, 0xfa, 0x2c,
+                                                         0x12, 0x2c, 0x3e, 0x2c, 0x54, 0x2c, 0x6b, 0x2c,
+                                                         0x86, 0x2c, 0x9f, 0x2c, 0xd7, 0x2d, 0x7d, 0x2d,
+                                                         0xb7, 0x2e, 0x17, 0x2e, 0x8e, 0x2f, 0x26, 0x2f,
+                                                         0x55, 0x2f, 0x84, 0x2f, 0xe7, 0x2f, 0xfc, 0x2f,
+                                                         0xfe, 0x30, 0x8c, 0x30, 0xde, 0x31, 0x35, 0x31,
+                                                         0x95, 0x32, 0x30, 0x32, 0x8e, 0x32, 0xe2, 0x33,
+                                                         0x3e, 0x33, 0x8c, 0x33, 0xdc, 0x34, 0x27, 0x34,
+                                                         0x34, 0x34, 0x42, 0x34, 0x4e, 0x34, 0x62, 0x34,
+                                                         0x6f, 0x34, 0x8b, 0x34, 0xc1, 0x34, 0xf0, 0x35,
+                                                         0x27, 0x35, 0x75, 0x35, 0xc2, 0x36, 0x1b, 0x36,
+                                                         0x41, 0x36, 0x7a, 0x36, 0xbf, 0x77, 0xe, 0x35,
+                                                         0xa, 0xf7, 0x62, 0xd5, 0xf8, 0x4a, 0x77, 0x1,
+                                                         0x99, 0x16, 0xf4, 0x6, 0xf7, 0x7, 0xf7, 0x62,
+                                                         0x5, 0xf7, 0xb8, 0x6, 0xae, 0xfb, 0x62, 0x5,
+                                                         0xe8, 0x6, 0xfb, 0xa, 0xf9, 0x62, 0x5, 0xfb,
+                                                         0x5, 0x6, 0xfb, 0x28, 0xfc, 0x4a, 0x15, 0xf7,
+                                                         0x53, 0xf7, 0xfc, 0x48, 0xa, 0xb9, 0xfb, 0xfc,
+                                                         0x5, 0xe, 0xf9, 0x52, 0x8b, 0xdc, 0xf7, 0x10,
+                                                         0xdc, 0xb9, 0xdc, 0xf7, 0x74, 0xdc, 0x1, 0x93,
+                                                         0x16, 0xf7, 0x0, 0x6, 0xf7, 0x10, 0xf7, 0x61,
+                                                         0x5, 0xf7, 0xaa, 0x6, 0x60, 0xfb, 0x61, 0x5,
+                                                         0xf8, 0x98, 0x55, 0xa, 0xfc, 0x33, 0x6, 0xbf,
+                                                         0xf7, 0x8f, 0x5, 0xf8, 0x3, 0x55, 0xa, 0xfc,
+                                                         0x3, 0x6, 0xba, 0xf7, 0x74, 0x5, 0xf8, 0x7,
+                                                         0x55, 0xa, 0xfd, 0x1a, 0x6, 0xfb, 0x35, 0xfc,
+                                                         0x44, 0x15, 0xf7, 0x6b, 0xf7, 0xf3, 0x5, 0xf2,
+                                                         0x6, 0x42, 0xfb, 0xf3, 0x5, 0xe, 0x31, 0xa,
+                                                         0xf9, 0x13, 0x77, 0x1, 0xf8, 0x74, 0xf9, 0xae,
+                                                         0x36, 0xa, 0xfc, 0xc1, 0xfe, 0x35, 0x26, 0xa,
+                                                         0x31, 0xa, 0xf8, 0x8c, 0xf7, 0x1b, 0x1, 0xf7,
+                                                         0xc7, 0xf9, 0xae, 0x30, 0xa, 0xfc, 0x3b, 0xfe,
+                                                         0x35, 0x26, 0xa, 0x31, 0xa, 0xf8, 0x93, 0xef,
+                                                         0x1, 0xf8, 0xb1, 0xf9, 0xb5, 0x2e, 0xa, 0xfc,
+                                                         0x4, 0xfe, 0x19, 0x26, 0xa, 0x31, 0xa, 0xf8,
+                                                         0x87, 0xf7, 0x20, 0x1, 0xf8, 0x78, 0xf9, 0xa9,
+                                                         0x56, 0xa, 0xf7, 0x20, 0x5, 0x20, 0x6, 0xfc,
+                                                         0xb, 0xfe, 0x35, 0x26, 0xa, 0x31, 0xa, 0xf8,
+                                                         0x77, 0xb0, 0xf7, 0x36, 0x76, 0x1, 0xf8, 0x28,
+                                                         0xb0, 0xf3, 0xb0, 0x3, 0xf8, 0x28, 0xf9, 0xf2,
+                                                         0x15, 0x59, 0xb4, 0x64, 0xbb, 0xbb, 0xb4, 0xb2,
+                                                         0xbd, 0xbd, 0x63, 0xb2, 0x5a, 0x5a, 0x63, 0x64,
+                                                         0x59, 0x1e, 0xb0, 0x8a, 0x15, 0xa8, 0xa2, 0xa3,
+                                                         0xa8, 0xa8, 0xa2, 0x74, 0x6d, 0x6e, 0x74, 0x75,
+                                                         0x6e, 0x6f, 0x73, 0xa1, 0xa8, 0x1e, 0xfc, 0x3f,
+                                                         0xfd, 0xf1, 0x26, 0xa, 0x31, 0xa, 0xf8, 0x9a,
+                                                         0xf5, 0x8e, 0x77, 0x12, 0x13, 0xe0, 0xf8, 0x5,
+                                                         0xf9, 0xbc, 0x15, 0xc8, 0x66, 0xa, 0xa3, 0x1b,
+                                                         0xa7, 0xa1, 0x82, 0x82, 0x9e, 0x1f, 0x80, 0xa2,
+                                                         0x9f, 0x7e, 0xa0, 0x1b, 0xc5, 0xac, 0xc1, 0xc0,
+                                                         0x90, 0x1f, 0x50, 0x6, 0x7d, 0x87, 0x85, 0x73,
+                                                         0x5e, 0xa, 0x13, 0xd0, 0x95, 0x73, 0x70, 0x96,
+                                                         0x6e, 0x1b, 0x13, 0xe0, 0x48, 0x7a, 0x58, 0x51,
+                                                         0x7c, 0x1f, 0xfb, 0xf7, 0xfd, 0xbc, 0x26, 0xa,
+                                                         0xf8, 0x5, 0x8b, 0xdc, 0xf7, 0x8d, 0xdd, 0xf7,
+                                                         0x75, 0xdc, 0x1, 0xf8, 0xd4, 0xf1, 0x3, 0xd5,
+                                                         0x16, 0xf7, 0xfd, 0x6, 0xf7, 0x37, 0xec, 0xf7,
+                                                         0xd, 0xf5, 0xe5, 0x4b, 0xb3, 0x52, 0x9e, 0x1f,
+                                                         0xb6, 0x99, 0xea, 0xac, 0xf7, 0xa, 0x1a, 0xf7,
+                                                         0x22, 0xfb, 0x18, 0xae, 0xfb, 0xb, 0x1e, 0xfb,
+                                                         0x7b, 0x6, 0x64, 0xfd, 0x11, 0x15, 0xc1, 0xf7,
+                                                         0x8d, 0x5, 0xf7, 0x52, 0x6, 0xc9, 0xeb, 0x8a,
+                                                         0x25, 0xfb, 0x11, 0xfb, 0x13, 0x76, 0x22, 0x1f,
+                                                         0x29, 0xf7, 0xdf, 0x15, 0xbc, 0xf7, 0x75, 0x5,
+                                                         0xf7, 0x29, 0x6, 0xc7, 0xec, 0x8a, 0x2c, 0xfb,
+                                                         0x3, 0xfb, 0x6, 0x79, 0x31, 0x1f, 0xe, 0xf8,
+                                                         0x3c, 0x78, 0xdc, 0xf8, 0xe6, 0xdc, 0x1, 0xf7,
+                                                         0x14, 0xef, 0x3, 0xf9, 0x1b, 0xf7, 0x8f, 0x15,
+                                                         0x51, 0x79, 0x4a, 0xfb, 0x17, 0xfb, 0x2b, 0x1b,
+                                                         0x3c, 0xfb, 0x12, 0xb4, 0xf7, 0x53, 0xf7, 0x47,
+                                                         0xf2, 0xf7, 0x4b, 0xf7, 0x52, 0xf7, 0x28, 0xaa,
+                                                         0xfb, 0x8, 0x62, 0x92, 0x1f, 0xea, 0x93, 0x5,
+                                                         0xf7, 0x52, 0x75, 0xfb, 0x3a, 0xb3, 0x2e, 0x1b,
+                                                         0xfb, 0x7e, 0xfb, 0x33, 0xfb, 0x5d, 0xfb, 0x86,
+                                                         0xfb, 0x74, 0xf7, 0x1c, 0x32, 0xf7, 0x36, 0xf7,
+                                                         0x3b, 0xf7, 0x8, 0xf2, 0xf7, 0x2d, 0xc5, 0x1f,
+                                                         0xe, 0xf8, 0x3c, 0xfb, 0x75, 0xc6, 0xf7, 0x24,
+                                                         0xdc, 0xf8, 0xe9, 0xdc, 0x1, 0xf7, 0x0, 0xf0,
+                                                         0x3, 0xf7, 0x79, 0xfb, 0x37, 0x15, 0x72, 0x52,
+                                                         0x5, 0x87, 0xa6, 0xad, 0x8a, 0xa6, 0x1b, 0xf7,
+                                                         0x46, 0x9e, 0xd5, 0xa8, 0xc6, 0x53, 0x93, 0x77,
+                                                         0x8e, 0x1f, 0x99, 0xa9, 0xc8, 0x8e, 0xf7, 0x43,
+                                                         0xa6, 0xe0, 0xf7, 0x78, 0x19, 0x27, 0x98, 0x5,
+                                                         0x50, 0x78, 0x4c, 0xfb, 0x17, 0xfb, 0x2c, 0x1b,
+                                                         0x38, 0xfb, 0xe, 0xbe, 0xf7, 0x54, 0xf7, 0x48,
+                                                         0xf0, 0xf7, 0x42, 0xf7, 0x54, 0xf7, 0x28, 0xa8,
+                                                         0xfb, 0x9, 0x62, 0x93, 0x1f, 0xea, 0x93, 0x5,
+                                                         0xf7, 0x54, 0x76, 0xfb, 0x3b, 0xb2, 0x2f, 0x1b,
+                                                         0xfb, 0x7f, 0xfb, 0x33, 0xfb, 0x53, 0xfb, 0x88,
+                                                         0xfb, 0x35, 0xd0, 0xfb, 0x1c, 0xf7, 0x48, 0x73,
+                                                         0x1f, 0x6a, 0x47, 0x5, 0xc4, 0x8a, 0x9d, 0x7b,
+                                                         0x78, 0x1a, 0x5f, 0x43, 0x8c, 0x57, 0x82, 0x87,
+                                                         0x8d, 0x8c, 0x6a, 0x1e, 0xe, 0xf8, 0x3c, 0x8b,
+                                                         0xdc, 0xf8, 0xc0, 0xdc, 0x1, 0xf9, 0x2c, 0xef,
+                                                         0x3, 0xdc, 0x16, 0xf7, 0x9b, 0x6, 0xf7, 0x6a,
+                                                         0xf7, 0x62, 0xf7, 0x12, 0xf7, 0xc0, 0xf7, 0x42,
+                                                         0xfb, 0xb, 0xf7, 0xa, 0xfb, 0x52, 0x1f, 0xfb,
+                                                         0x72, 0x6, 0x66, 0xfd, 0x11, 0x15, 0xf7, 0xa,
+                                                         0xf8, 0xc0, 0x5, 0xf7, 0x17, 0x6, 0xe0, 0xf7,
+                                                         0x1a, 0x87, 0xfb, 0x63, 0xfb, 0x9b, 0xfb, 0x30,
+                                                         0x39, 0xfb, 0x58, 0x1f, 0xe, 0xf8, 0x5, 0x8b,
+                                                         0xdc, 0xf7, 0x8e, 0xdd, 0xf7, 0x74, 0xdc, 0x1,
+                                                         0xe1, 0x16, 0xf8, 0xbe, 0x6b, 0xa, 0xfc, 0x5d,
+                                                         0x6, 0xc2, 0xf7, 0x8e, 0x5, 0xf8, 0x2a, 0x6,
+                                                         0x9c, 0xdd, 0x5, 0xfc, 0x29, 0x6, 0xb7, 0xf7,
+                                                         0x74, 0x5, 0xf8, 0x3e, 0x6b, 0xa, 0xfc, 0xa0,
+                                                         0x6, 0xe, 0x32, 0xa, 0xf7, 0x53, 0x77, 0x2a,
+                                                         0xa, 0xf7, 0x1e, 0xc3, 0x36, 0xa, 0xe, 0x32,
+                                                         0xa, 0xc3, 0xf7, 0x1b, 0x2a, 0xa, 0xf7, 0x1,
+                                                         0xc3, 0x30, 0xa, 0xe, 0x32, 0xa, 0xca, 0xef,
+                                                         0x2a, 0xa, 0xf7, 0xa7, 0xca, 0x2e, 0xa, 0xe,
+                                                         0x32, 0xa, 0xbe, 0xf7, 0x20, 0x2a, 0xa, 0xf7,
+                                                         0x95, 0xbe, 0x56, 0xa, 0xf7, 0x20, 0x5, 0xfb,
+                                                         0x0, 0x6, 0xe, 0xf8, 0x3c, 0x8b, 0xdc, 0xf7,
+                                                         0x8e, 0xdc, 0xf7, 0x75, 0xdc, 0x1, 0xf9, 0x2c,
+                                                         0xef, 0x3, 0xd8, 0x16, 0xf7, 0x9c, 0x6, 0xf7,
+                                                         0x6a, 0xf7, 0x65, 0xf7, 0x12, 0xf7, 0xbf, 0xf7,
+                                                         0x44, 0xfb, 0xb, 0xf7, 0x9, 0xfb, 0x55, 0x1f,
+                                                         0xfb, 0x6f, 0x6, 0x49, 0xfb, 0xc6, 0x5, 0x3a,
+                                                         0x6, 0x7a, 0x3a, 0x5, 0xdb, 0x6, 0xb6, 0xfb,
+                                                         0x8e, 0x15, 0xc2, 0xf7, 0x8e, 0x5, 0xf7, 0x64,
+                                                         0x6b, 0xa, 0xfb, 0x65, 0x6, 0xbd, 0xf7, 0x75,
+                                                         0x5, 0xf7, 0x14, 0x6, 0xe1, 0xf7, 0x1c, 0x86,
+                                                         0xfb, 0x63, 0xfb, 0x9b, 0xfb, 0x33, 0x3a, 0xfb,
+                                                         0x58, 0x1f, 0xe, 0xf8, 0x5, 0x8b, 0xd8, 0xf7,
+                                                         0x50, 0xcb, 0xc9, 0xcb, 0xf7, 0x4e, 0xd8, 0x1,
+                                                         0xd0, 0xf0, 0x3, 0x99, 0xf7, 0x9d, 0x15, 0xc2,
+                                                         0x6, 0xfb, 0x38, 0x97, 0xf2, 0x26, 0xf7, 0x4b,
+                                                         0x1b, 0xb8, 0xb6, 0x92, 0x9a, 0xb2, 0x1f, 0xa3,
+                                                         0xf0, 0x5, 0x6c, 0x62, 0x5b, 0x7c, 0x55, 0x1b,
+                                                         0xfb, 0x12, 0x44, 0xda, 0xf7, 0x1, 0x83, 0x1f,
+                                                         0xf7, 0xcb, 0x6, 0x9a, 0xcb, 0x5, 0xfb, 0xda,
+                                                         0x6, 0x8e, 0x9f, 0x8c, 0xa1, 0x90, 0x9f, 0x8,
+                                                         0xf7, 0xdf, 0x6, 0x9a, 0xcb, 0x5, 0xfb, 0xd9,
+                                                         0x6, 0xf6, 0xb8, 0xdf, 0xda, 0xf7, 0x17, 0x1b,
+                                                         0xc6, 0xc4, 0x7b, 0x5f, 0xae, 0x1f, 0xb6, 0xdc,
+                                                         0x5, 0xb3, 0x54, 0x45, 0x9b, 0x46, 0x1b, 0xfb,
+                                                         0x46, 0xfb, 0x1c, 0xfb, 0x3, 0xfb, 0x2c, 0x56,
+                                                         0x1f, 0x4a, 0x6, 0x7d, 0x4b, 0x5, 0xc9, 0x6,
+                                                         0x87, 0x77, 0x89, 0x75, 0x8a, 0x77, 0x8, 0x62,
+                                                         0x6, 0xe, 0xf7, 0xcd, 0xa0, 0x76, 0xf7, 0xd9,
+                                                         0xdd, 0xf7, 0x7a, 0xdc, 0x1, 0xe1, 0x16, 0xf0,
+                                                         0x6, 0xd3, 0xf7, 0xd9, 0x5, 0xf8, 0x19, 0x6,
+                                                         0x9d, 0xdd, 0x5, 0xfc, 0x19, 0x6, 0xbd, 0xf7,
+                                                         0x7a, 0x5, 0xf8, 0x1b, 0x6b, 0xa, 0xfc, 0x81,
+                                                         0x6, 0xe, 0x6c, 0xa, 0xf7, 0x70, 0xdd, 0xf7,
+                                                         0xb8, 0xdc, 0x1, 0xf7, 0x3, 0xef, 0x3, 0xf8,
+                                                         0x43, 0xf7, 0xae, 0x15, 0xf7, 0x75, 0x6, 0x6a,
+                                                         0xfb, 0x31, 0x5, 0x78, 0x67, 0x37, 0x5f, 0x33,
+                                                         0x1b, 0xfb, 0x15, 0x40, 0xf7, 0x1, 0xf7, 0x6,
+                                                         0xf7, 0x69, 0xf7, 0xc, 0xf7, 0x32, 0xf7, 0x49,
+                                                         0xe5, 0xd8, 0x5f, 0xfb, 0x4, 0xa2, 0x1f, 0xec,
+                                                         0x95, 0x5, 0xf7, 0x26, 0x81, 0xfb, 0x20, 0xdc,
+                                                         0xfb, 0x1a, 0x1b, 0xfb, 0xa6, 0xfb, 0x16, 0xfb,
+                                                         0x87, 0xfb, 0x65, 0x26, 0xb0, 0xfb, 0x5f, 0xf7,
+                                                         0xa0, 0xf7, 0xe, 0xf7, 0x2, 0xbc, 0xb2, 0xc9,
+                                                         0x1f, 0xc9, 0xf7, 0xbb, 0x5, 0xfb, 0xd8, 0x6,
+                                                         0xe, 0xf8, 0x3c, 0xa0, 0x76, 0xf7, 0xe5, 0xdc,
+                                                         0xf7, 0xc0, 0x77, 0x1, 0xd8, 0x16, 0xed, 0x6,
+                                                         0xd1, 0xf7, 0xe5, 0x5, 0xf8, 0xb, 0x6, 0x45,
+                                                         0xfb, 0xe5, 0x5, 0xeb, 0x6, 0xf7, 0x2d, 0xf9,
+                                                         0x62, 0x57, 0xa, 0x4b, 0xfb, 0xc0, 0x5, 0xfc,
+                                                         0xc, 0x6, 0xcb, 0xf7, 0xc0, 0x4d, 0xa, 0xe,
+                                                         0x77, 0x2d, 0xa, 0xe6, 0x16, 0xeb, 0x6, 0xf7,
+                                                         0x2e, 0xf9, 0x62, 0x4d, 0xa, 0xe, 0x54, 0xa,
+                                                         0xf7, 0x6a, 0x77, 0x1, 0xf7, 0x85, 0xf9, 0xa8,
+                                                         0x15, 0xd6, 0x6, 0xf7, 0x23, 0x6d, 0xa, 0xfb,
+                                                         0x8, 0x6, 0xfb, 0x90, 0xfe, 0x35, 0x15, 0x34,
+                                                         0xa, 0xe, 0x54, 0xa, 0xd6, 0xf7, 0x1f, 0x1,
+                                                         0xf7, 0x2f, 0xf9, 0xaa, 0x6e, 0xa, 0xda, 0xe4,
+                                                         0xb2, 0x32, 0x5, 0xd9, 0x6, 0x4e, 0x6f, 0xa,
+                                                         0x2a, 0x6, 0xfb, 0x55, 0xfe, 0x35, 0x15, 0x34,
+                                                         0xa, 0xe, 0x5c, 0xa, 0xf9, 0x6d, 0x77, 0x1,
+                                                         0xf7, 0xed, 0xf9, 0xb4, 0x15, 0xe7, 0x6, 0xa0,
+                                                         0xf0, 0x3d, 0xa, 0xfb, 0x5e, 0x26, 0x15, 0xe7,
+                                                         0x6, 0xa1, 0xf0, 0x5, 0x2e, 0x6, 0x2d, 0xfe,
+                                                         0x19, 0x15, 0x34, 0xa, 0xe, 0x54, 0xa, 0xf7,
+                                                         0x6a, 0x77, 0x1, 0xe6, 0x16, 0x34, 0xa, 0xb9,
+                                                         0xc0, 0x15, 0xce, 0x6, 0x54, 0x6d, 0xa, 0x23,
+                                                         0x6, 0xe, 0xf7, 0x5e, 0x78, 0xdb, 0xf9, 0x25,
+                                                         0x77, 0x1, 0xba, 0xea, 0x3, 0xba, 0xf7, 0x60,
+                                                         0x15, 0xfb, 0x2c, 0xc3, 0x44, 0xf7, 0x15, 0xf7,
+                                                         0x31, 0xbe, 0xf5, 0xf1, 0xa2, 0x1e, 0xf7, 0xa,
+                                                         0xf8, 0xa5, 0x5, 0x24, 0x6, 0xfb, 0x8, 0xfc,
+                                                         0xa5, 0x5, 0x49, 0x7d, 0x61, 0x4d, 0x42, 0x1b,
+                                                         0x5b, 0x60, 0xbe, 0xee, 0x1f, 0xe, 0xf8, 0x5,
+                                                         0x2d, 0xa, 0xf9, 0x1f, 0xf7, 0x21, 0x3, 0xd7,
+                                                         0x16, 0xf0, 0x6, 0xbe, 0xf7, 0x7e, 0xf7, 0x31,
+                                                         0xf7, 0x17, 0xf7, 0x6d, 0xfc, 0x1, 0x5, 0xf7,
+                                                         0x4, 0x6, 0xfb, 0x93, 0xf8, 0x3f, 0xf7, 0xf1,
+                                                         0xf7, 0xb7, 0x5, 0xfb, 0x21, 0x6, 0xfc, 0x30,
+                                                         0xfb, 0xf1, 0xdb, 0xf7, 0xf1, 0x5, 0x26, 0x6,
+                                                         0xe, 0x8b, 0xdc, 0xf9, 0x11, 0x77, 0x1, 0xd7,
+                                                         0x16, 0xf8, 0x62, 0x55, 0xa, 0xfc, 0x2, 0x6,
+                                                         0xf7, 0x19, 0xf9, 0x11, 0x50, 0xa, 0xe, 0x8b,
+                                                         0xdc, 0xf9, 0x11, 0x77, 0x1, 0xd1, 0x16, 0xf8,
+                                                         0x68, 0x55, 0xa, 0xfc, 0x7, 0x6, 0xc4, 0xf7,
+                                                         0xa7, 0xf7, 0x54, 0xf7, 0x0, 0x9c, 0xdc, 0xfb,
+                                                         0x54, 0x21, 0xc6, 0xf7, 0xab, 0x50, 0xa, 0x43,
+                                                         0xfb, 0xe8, 0x30, 0x59, 0x7a, 0x37, 0xe6, 0xbf,
+                                                         0x5, 0xe, 0xf8, 0xab, 0x2d, 0xa, 0xd4, 0x16,
+                                                         0xe9, 0x6, 0xf7, 0xd, 0xf8, 0xf4, 0xe2, 0xfc,
+                                                         0xf4, 0x5, 0xe8, 0x6, 0xf7, 0xf0, 0xf8, 0xf9,
+                                                         0xfb, 0x28, 0xfc, 0xf9, 0x5, 0xea, 0x6, 0xf7,
+                                                         0x2b, 0xf9, 0x62, 0x5, 0xfb, 0xc, 0x6, 0xfb,
+                                                         0xfc, 0xfd, 0x15, 0x30, 0xf9, 0x15, 0x5, 0xfb,
+                                                         0xa, 0x6, 0xe, 0xf8, 0x3c, 0x2d, 0xa, 0xcb,
+                                                         0xf9, 0x67, 0x3, 0xd7, 0x16, 0xea, 0x6, 0xf7,
+                                                         0xb, 0xf8, 0xf4, 0xf7, 0x99, 0xfc, 0xf4, 0x5,
+                                                         0xeb, 0x6, 0xf7, 0x2c, 0xf9, 0x62, 0x4d, 0xa,
+                                                         0xfb, 0xf, 0xfc, 0xf5, 0xfb, 0x97, 0xf8, 0xf5,
+                                                         0x4d, 0xa, 0xe, 0xf8, 0x3c, 0xa0, 0x76, 0xf9,
+                                                         0x6d, 0x77, 0xf7, 0xa, 0x76, 0xf7, 0x3, 0x77,
+                                                         0x12, 0xd7, 0x16, 0xea, 0x6, 0xf7, 0xd, 0xf8,
+                                                         0xfc, 0x48, 0xa, 0xf7, 0x95, 0xfc, 0xfc, 0x5,
+                                                         0xeb, 0x6, 0xf7, 0x2c, 0xf9, 0x6d, 0x4d, 0xa,
+                                                         0xfb, 0xf, 0xfc, 0xfe, 0x4e, 0xa, 0xfb, 0x94,
+                                                         0xf8, 0xfe, 0x4d, 0xa, 0xf7, 0x19, 0xd8, 0x15,
+                                                         0xca, 0x66, 0xa, 0xa4, 0x1b, 0x13, 0x10, 0xa5,
+                                                         0xa0, 0x83, 0x82, 0x9e, 0x1f, 0x7f, 0xa3, 0xa0,
+                                                         0x7e, 0xa4, 0x1b, 0xc6, 0xad, 0xc2, 0xc1, 0x90,
+                                                         0x1f, 0x4e, 0x69, 0xa, 0x5e, 0xa, 0x13, 0x30,
+                                                         0x96, 0x72, 0x6f, 0x96, 0x6d, 0x1b, 0x46, 0x7a,
+                                                         0x57, 0x50, 0x7b, 0x1f, 0xe, 0x6c, 0xa, 0xf8,
+                                                         0xe6, 0xdc, 0x1, 0xf7, 0x18, 0xef, 0xf8, 0x59,
+                                                         0xef, 0x3, 0xf7, 0x21, 0xf7, 0xbb, 0x15, 0xfb,
+                                                         0x40, 0xf5, 0xfb, 0x22, 0xf7, 0x47, 0xf7, 0x60,
+                                                         0xf7, 0x34, 0xf7, 0x54, 0xf7, 0x80, 0xf7, 0x52,
+                                                         0xfb, 0x1, 0xf7, 0x1e, 0xfb, 0x47, 0xfb, 0x55,
+                                                         0xfb, 0x3c, 0xfb, 0x3f, 0xfb, 0xa3, 0x1e, 0xe5,
+                                                         0x16, 0xf7, 0x89, 0xf7, 0x28, 0xf7, 0x8, 0xf7,
+                                                         0xf, 0xf0, 0xec, 0x30, 0xfb, 0x30, 0xfb, 0x46,
+                                                         0xfb, 0x2, 0xfb, 0x3d, 0xfb, 0x31, 0x27, 0x25,
+                                                         0xdc, 0xf7, 0x2c, 0x1e, 0xe, 0xf9, 0x52, 0x78,
+                                                         0xdc, 0x46, 0xd0, 0x46, 0xde, 0xf7, 0x8f, 0xde,
+                                                         0xf7, 0x7b, 0xdf, 0x46, 0xdc, 0x12, 0xed, 0xe8,
+                                                         0x13, 0x3a, 0xf8, 0xa6, 0x84, 0x15, 0xf8, 0x67,
+                                                         0x6, 0x9d, 0xde, 0x5, 0xfc, 0x3, 0x6, 0xc2,
+                                                         0xf7, 0x8f, 0x5, 0xf7, 0xd4, 0x6, 0x9d, 0xde,
+                                                         0x5, 0xfb, 0xd4, 0x6, 0xbd, 0xf7, 0x7b, 0x5,
+                                                         0xf7, 0xdb, 0x6, 0x9d, 0xdf, 0x5, 0xfc, 0x41,
+                                                         0x6, 0x78, 0x34, 0x5, 0x13, 0x96, 0xdb, 0x51,
+                                                         0x3c, 0x9e, 0x52, 0x1b, 0xfb, 0x66, 0xfb, 0x3a,
+                                                         0xfb, 0x4b, 0xfb, 0x93, 0xfb, 0x69, 0xf7, 0xe,
+                                                         0x22, 0xf7, 0x26, 0xf2, 0xba, 0xb6, 0xa0, 0xa5,
+                                                         0x1f, 0x13, 0x56, 0xfb, 0xf3, 0xf7, 0x92, 0x15,
+                                                         0xf7, 0x2c, 0xf7, 0x3, 0xf7, 0x61, 0xf7, 0x39,
+                                                         0xde, 0xdc, 0x4f, 0x25, 0x59, 0x6c, 0xfb, 0x32,
+                                                         0x74, 0x50, 0x1e, 0x6d, 0x80, 0x59, 0xfb, 0x1b,
+                                                         0xfb, 0x21, 0x1b, 0xfb, 0x23, 0x62, 0xef, 0xf7,
+                                                         0x1d, 0x1f, 0xe, 0xf8, 0x74, 0x78, 0xdd, 0xf9,
+                                                         0x7e, 0x76, 0xf7, 0x21, 0x77, 0x1, 0xf4, 0xf0,
+                                                         0xf8, 0x9b, 0xf0, 0x3, 0xf8, 0x51, 0xf9, 0xa8,
+                                                         0x15, 0xda, 0x6, 0xf7, 0x1d, 0x6d, 0xa, 0xfb,
+                                                         0xa, 0x6, 0xfc, 0x4a, 0x28, 0xa, 0xf8, 0x74,
+                                                         0x78, 0xdd, 0xf9, 0xc4, 0xbd, 0x1, 0xf4, 0xf0,
+                                                         0xf7, 0xc4, 0xf2, 0xf7, 0x4, 0xf0, 0x3, 0xf8,
+                                                         0x8, 0xf9, 0xa9, 0x15, 0xec, 0x6, 0xe0, 0xe5,
+                                                         0xb4, 0x31, 0x5, 0xdd, 0x6, 0x4b, 0xf7, 0x20,
+                                                         0x5, 0x24, 0x6, 0xfc, 0x29, 0x28, 0xa, 0x6c,
+                                                         0xa, 0xf9, 0x74, 0xf2, 0x1, 0x68, 0xa, 0x3,
+                                                         0xf4, 0xf7, 0xc1, 0x21, 0xa, 0xf8, 0x1, 0xf8,
+                                                         0x8a, 0x15, 0xec, 0x6, 0xa2, 0xf2, 0x57, 0xa,
+                                                         0xfb, 0x68, 0x24, 0x15, 0xec, 0x6, 0xa1, 0xf2,
+                                                         0x5, 0x2a, 0x6, 0xe, 0xf8, 0x74, 0x78, 0xdd,
+                                                         0xf8, 0xef, 0xdd, 0x1, 0x68, 0xa, 0x3, 0xf8,
+                                                         0x94, 0xf9, 0xa9, 0x15, 0xd4, 0x6, 0x4f, 0xf7,
+                                                         0x20, 0x5, 0xfb, 0x5, 0x6, 0xfb, 0xc7, 0x28,
+                                                         0xa, 0xf8, 0x74, 0x8d, 0x76, 0xae, 0xdf, 0xf8,
+                                                         0x9b, 0xdf, 0xad, 0x77, 0x1, 0xbb, 0xe0, 0xf8,
+                                                         0x97, 0xe5, 0x3, 0xa6, 0x9b, 0x15, 0xba, 0x68,
+                                                         0xdd, 0xe3, 0x5, 0x67, 0xc3, 0xcd, 0x7a, 0xcf,
+                                                         0x1b, 0xf7, 0x77, 0xf7, 0x39, 0xf7, 0x43, 0xf7,
+                                                         0x65, 0xce, 0x81, 0xdd, 0x4e, 0xcb, 0x1f, 0xdf,
+                                                         0xe3, 0x5c, 0xaf, 0x3a, 0x34, 0x5, 0xbe, 0x3b,
+                                                         0x33, 0x8d, 0x6f, 0x1b, 0xfb, 0x84, 0xfb, 0x1f,
+                                                         0xfb, 0x54, 0xfb, 0x5c, 0x4e, 0x92, 0x3e, 0xc3,
+                                                         0x49, 0x1f, 0xc8, 0xc8, 0x15, 0x6c, 0xb2, 0x83,
+                                                         0xc6, 0xba, 0x1a, 0xf7, 0x3b, 0xf7, 0x1a, 0xf7,
+                                                         0x1f, 0xf7, 0x35, 0xc0, 0xc3, 0x81, 0x74, 0xa6,
+                                                         0x1e, 0xfb, 0xf3, 0xfc, 0x5c, 0x15, 0xf8, 0x1b,
+                                                         0xf8, 0x35, 0x5, 0x9e, 0x6e, 0xa4, 0x55, 0x49,
+                                                         0x1a, 0xfb, 0x2c, 0xfb, 0x13, 0xfb, 0x26, 0xfb,
+                                                         0x39, 0x5a, 0x52, 0x8e, 0xa6, 0x66, 0x1e, 0xe,
+                                                         0x6c, 0xa, 0xf9, 0x7b, 0xf7, 0x1, 0x8e, 0x77,
+                                                         0x12, 0x68, 0xa, 0x13, 0xd8, 0xf7, 0xf9, 0xf9,
+                                                         0xb9, 0x15, 0xcb, 0x6, 0xa4, 0x90, 0x97, 0x9c,
+                                                         0xa4, 0x1b, 0xa7, 0xa0, 0x83, 0x82, 0x9e, 0x1f,
+                                                         0x7f, 0xa4, 0xa0, 0x7d, 0xa6, 0x1b, 0xc8, 0xae,
+                                                         0xc2, 0xc2, 0x90, 0x1f, 0x4d, 0x69, 0xa, 0x70,
+                                                         0x1b, 0x13, 0xb8, 0x7b, 0x75, 0x96, 0x96, 0x71,
+                                                         0x1f, 0x95, 0x73, 0x6f, 0x95, 0x6e, 0x1b, 0x13,
+                                                         0xd8, 0x44, 0x79, 0x57, 0x4f, 0x7c, 0x1f, 0xfb,
+                                                         0x90, 0xfc, 0x8c, 0x21, 0xa, 0xe, 0x35, 0xa,
+                                                         0xf7, 0xb6, 0xdc, 0xf7, 0xa0, 0xda, 0x1, 0xf9,
+                                                         0x16, 0xea, 0x3, 0xe1, 0x16, 0xeb, 0x6, 0xc7,
+                                                         0xf7, 0xb6, 0x5, 0xf7, 0x47, 0x6, 0xf7, 0x32,
+                                                         0xf7, 0x32, 0xd7, 0xf7, 0x40, 0xf7, 0x1b, 0x33,
+                                                         0xb8, 0xfb, 0x7, 0x1f, 0xfb, 0xbf, 0x6, 0xa3,
+                                                         0xfb, 0xef, 0x15, 0xc2, 0xf7, 0xa0, 0x5, 0xf7,
+                                                         0x4c, 0x6, 0xd1, 0xd5, 0x8a, 0x27, 0xfb, 0x1c,
+                                                         0xfb, 0x18, 0x6c, 0x2d, 0x1f, 0xe, 0xf8, 0x74,
+                                                         0x68, 0x76, 0xcf, 0xd8, 0xf8, 0xcf, 0xd8, 0x1,
+                                                         0xf7, 0x1c, 0xf0, 0xf8, 0x7c, 0xf0, 0x3, 0xf8,
+                                                         0xcd, 0xb7, 0x15, 0xb0, 0x5f, 0xb0, 0x6c, 0xb1,
+                                                         0x72, 0xb3, 0xc3, 0x18, 0x7d, 0x95, 0x5e, 0xa6,
+                                                         0x69, 0xb5, 0x8, 0xef, 0xd8, 0xc9, 0xf7, 0xf,
+                                                         0xf7, 0x23, 0x1a, 0xf7, 0x4a, 0xfb, 0x1, 0xf7,
+                                                         0x19, 0xfb, 0x49, 0xfb, 0x75, 0xfb, 0x1a, 0xfb,
+                                                         0x67, 0xfb, 0x60, 0xfb, 0xb9, 0xf7, 0x7b, 0x7a,
+                                                         0xcb, 0xb6, 0xb9, 0x95, 0xa1, 0xb7, 0x1e, 0xfb,
+                                                         0x24, 0xf7, 0x10, 0x15, 0xac, 0x7a, 0x9f, 0x7c,
+                                                         0xad, 0x6c, 0x8, 0x80, 0x6d, 0x6c, 0x86, 0x6c,
+                                                         0x1b, 0x53, 0xfb, 0x18, 0xbb, 0xf7, 0x4d, 0xf7,
+                                                         0x52, 0xf7, 0xa, 0xf7, 0x28, 0xf7, 0x2d, 0xe5,
+                                                         0xf5, 0x3d, 0xfb, 0x34, 0x26, 0x60, 0xfb, 0x7,
+                                                         0x37, 0x49, 0x1f, 0x83, 0x94, 0x76, 0x9f, 0x6c,
+                                                         0xad, 0x55, 0xa3, 0x19, 0xe, 0xf8, 0x3c, 0xa0,
+                                                         0x76, 0xf7, 0xd2, 0xd8, 0xf7, 0x88, 0xda, 0x1,
+                                                         0xf9, 0x3d, 0xe7, 0x3, 0xe3, 0x16, 0xeb, 0x6,
+                                                         0xcd, 0xf7, 0xd2, 0x5, 0xf7, 0x2, 0x6, 0xf7,
+                                                         0x10, 0xaf, 0x2f, 0x2e, 0xaf, 0x1f, 0xbf, 0xfb,
+                                                         0x19, 0x5, 0xf6, 0x6, 0x54, 0xf7, 0x19, 0x6d,
+                                                         0xd3, 0x64, 0xd2, 0x4d, 0xb9, 0x19, 0xbe, 0x92,
+                                                         0xf7, 0x55, 0xa4, 0xf7, 0x4f, 0x1a, 0xf7, 0x43,
+                                                         0xfb, 0x25, 0x8d, 0x30, 0x1e, 0xfb, 0xbf, 0x6,
+                                                         0xa8, 0xfb, 0xd7, 0x15, 0xbd, 0xf7, 0x88, 0x5,
+                                                         0xf7, 0x70, 0x6, 0xbe, 0xe8, 0x87, 0x2d, 0xfb,
+                                                         0x27, 0xfb, 0x2a, 0x8c, 0xfb, 0x19, 0x1f, 0xe,
+                                                         0xf8, 0x5, 0x78, 0xdb, 0xf8, 0xe8, 0xdb, 0x12,
+                                                         0xe5, 0xeb, 0x86, 0xea, 0xf7, 0xaf, 0xee, 0x62,
+                                                         0xeb, 0x13, 0xe8, 0xe5, 0xf7, 0x7a, 0x15, 0xfb,
+                                                         0x48, 0xf7, 0x1c, 0x46, 0xf7, 0x28, 0xf7, 0x43,
+                                                         0xf7, 0x1, 0xe6, 0xf7, 0x9, 0xf7, 0xb, 0x36,
+                                                         0xb7, 0xfb, 0x21, 0xc8, 0x1e, 0x13, 0xd4, 0xfb,
+                                                         0x0, 0xba, 0x5b, 0x9d, 0xca, 0x1a, 0xe8, 0xf7,
+                                                         0x4, 0xa2, 0xba, 0xe1, 0xeb, 0x53, 0x2f, 0x1e,
+                                                         0xeb, 0x92, 0x5, 0xe0, 0x49, 0xf7, 0x1c, 0xfb,
+                                                         0x64, 0xfb, 0x2a, 0xfb, 0x0, 0x41, 0xfb, 0xe,
+                                                         0xfb, 0xe, 0xf7, 0x0, 0x5e, 0xf7, 0x0, 0x5c,
+                                                         0x1e, 0x13, 0xe8, 0xf5, 0x5d, 0xc3, 0x70, 0x4a,
+                                                         0x1a, 0x4a, 0x4e, 0x4c, 0xfb, 0xd, 0xfb, 0x40,
+                                                         0x78, 0xe6, 0xe1, 0x1e, 0xe, 0xf8, 0x5, 0x78,
+                                                         0xdd, 0xf8, 0xf1, 0xdd, 0xb2, 0xf7, 0x20, 0x12,
+                                                         0xe5, 0xec, 0x86, 0xeb, 0xf7, 0xb1, 0xef, 0x13,
+                                                         0xf4, 0xe5, 0xf7, 0x7f, 0x15, 0xfb, 0x4c, 0xf7,
+                                                         0x1d, 0x45, 0xf7, 0x29, 0xf7, 0x45, 0xf7, 0x2,
+                                                         0xe6, 0xf7, 0xc, 0xf7, 0xf, 0x35, 0xb6, 0xfb,
+                                                         0x22, 0xcb, 0x1e, 0x13, 0xec, 0xfb, 0x1, 0xbb,
+                                                         0x5b, 0x9c, 0xcc, 0x1a, 0xea, 0xf7, 0x3, 0xa0,
+                                                         0xbc, 0xe1, 0xe7, 0x62, 0xfb, 0x0, 0x1e, 0xec,
+                                                         0x93, 0x5, 0xeb, 0x4e, 0xf7, 0x13, 0xfb, 0x66,
+                                                         0xfb, 0x2b, 0xfb, 0x1, 0x41, 0xfb, 0x10, 0xfb,
+                                                         0x11, 0xf7, 0x1, 0x5d, 0xf7, 0x0, 0x5b, 0x1e,
+                                                         0xf6, 0x5e, 0xc4, 0x6e, 0x48, 0x1a, 0x4a, 0x4e,
+                                                         0x4b, 0xfb, 0xf, 0x1e, 0x13, 0xf4, 0xfb, 0x20,
+                                                         0x5a, 0xe0, 0xea, 0x88, 0x1f, 0xf7, 0x70, 0xf8,
+                                                         0xb6, 0x15, 0xef, 0x6, 0xf7, 0x1b, 0xf7, 0x20,
+                                                         0x5, 0x2d, 0x6, 0x38, 0x31, 0x63, 0xe5, 0x5,
+                                                         0x39, 0x6, 0xe, 0xf7, 0xcd, 0xa0, 0x76, 0xf9,
+                                                         0x11, 0xdc, 0x1, 0xf7, 0x94, 0x16, 0xee, 0x6,
+                                                         0xf7, 0x1c, 0xf9, 0x11, 0x5, 0xf7, 0x85, 0x6b,
+                                                         0xa, 0xfc, 0xdc, 0x6, 0x79, 0x3a, 0x5, 0xf7,
+                                                         0x89, 0x6, 0xe, 0x35, 0xa, 0xf7, 0x26, 0xdc,
+                                                         0xf7, 0xa0, 0xda, 0xf7, 0x24, 0x77, 0x1, 0xf8,
+                                                         0xfd, 0xea, 0x3, 0xe1, 0x16, 0xeb, 0x6, 0xaa,
+                                                         0xf7, 0x26, 0x5, 0xf7, 0x47, 0x6, 0xf7, 0x33,
+                                                         0xf7, 0x35, 0xcd, 0xf7, 0x41, 0xf7, 0x1c, 0x30,
+                                                         0xc0, 0xfb, 0x7, 0x1f, 0xfb, 0x61, 0x6, 0xaa,
+                                                         0xf7, 0x24, 0x50, 0xa, 0x85, 0xfc, 0x7f, 0x15,
+                                                         0xc2, 0xf7, 0xa0, 0x5, 0xf7, 0x4d, 0x6, 0xd1,
+                                                         0xd8, 0x82, 0x26, 0xfb, 0x1d, 0xfb, 0x1b, 0x76,
+                                                         0x2c, 0x1f, 0xe, 0xf8, 0x3c, 0x78, 0xdd, 0xf9,
+                                                         0x23, 0x42, 0xa, 0xf7, 0x77, 0xf9, 0x62, 0x15,
+                                                         0x8f, 0xfb, 0x0, 0xfc, 0x7b, 0x65, 0xfb, 0x22,
+                                                         0xf7, 0x9, 0x45, 0xf7, 0x27, 0xf7, 0x91, 0xbb,
+                                                         0xf7, 0x7a, 0xde, 0x9d, 0x1f, 0xe6, 0xf8, 0x3c,
+                                                         0x57, 0xa, 0x30, 0xfc, 0x3c, 0x5, 0xfb, 0x10,
+                                                         0x72, 0x5c, 0x20, 0xfb, 0x2e, 0x1b, 0x39, 0x3b,
+                                                         0xb7, 0xe1, 0x1f, 0xf4, 0xf8, 0xa1, 0x5, 0xe,
+                                                         0xf8, 0x3c, 0x78, 0xdf, 0xf9, 0x31, 0x77, 0xe9,
+                                                         0x76, 0xf7, 0x22, 0x42, 0xa, 0xf8, 0x49, 0xf9,
+                                                         0xa7, 0x15, 0xd5, 0x6, 0xf7, 0x19, 0xf7, 0x22,
+                                                         0x5, 0xfb, 0x7, 0x6, 0xfb, 0xc1, 0xfb, 0x57,
+                                                         0x15, 0x8b, 0x22, 0xfc, 0x85, 0x64, 0x1a, 0xfb,
+                                                         0x25, 0xf7, 0xa, 0x43, 0xf7, 0x28, 0xf7, 0x90,
+                                                         0xbb, 0xf7, 0x7f, 0xe1, 0x9c, 0x1e, 0xe6, 0xf8,
+                                                         0x44, 0x57, 0xa, 0x32, 0xfc, 0x44, 0x5, 0xfb,
+                                                         0xb, 0x75, 0x48, 0xfb, 0xa, 0xfb, 0x1e, 0x1b,
+                                                         0x3a, 0x39, 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xac,
+                                                         0x5, 0xe, 0xf8, 0x3c, 0x78, 0xdf, 0xf9, 0x32,
+                                                         0x42, 0xa, 0xf8, 0x2, 0xf9, 0xa8, 0x15, 0xe8,
+                                                         0x6, 0xdd, 0xe5, 0xb3, 0x31, 0x5, 0xdb, 0x6,
+                                                         0x4d, 0xf7, 0x21, 0x47, 0xa, 0xfb, 0xa3, 0xfb,
+                                                         0x56, 0x2c, 0xa, 0xf8, 0x3c, 0x78, 0xde, 0xf9,
+                                                         0x2b, 0x77, 0xf7, 0x56, 0x42, 0xa, 0xf8, 0xcb,
+                                                         0xf9, 0xb2, 0x15, 0xe9, 0x6, 0xa0, 0xf2, 0x5,
+                                                         0x2d, 0x6, 0xfb, 0x62, 0x24, 0x15, 0xe9, 0x6,
+                                                         0xa1, 0xf2, 0x5, 0x2d, 0x6, 0xfb, 0x44, 0xfb,
+                                                         0x3a, 0x2c, 0xa, 0xf8, 0x3c, 0x78, 0xdf, 0xf9,
+                                                         0x33, 0x77, 0xd4, 0xf7, 0x20, 0x1, 0xf7, 0xf,
+                                                         0xeb, 0x3, 0xf7, 0x77, 0xf9, 0x74, 0x15, 0x8b,
+                                                         0x23, 0xfc, 0x87, 0x64, 0x1a, 0xfb, 0x25, 0xf7,
+                                                         0x9, 0x43, 0xf7, 0x27, 0xf7, 0x92, 0xbb, 0xf7,
+                                                         0x80, 0xe0, 0x9d, 0x1e, 0xe5, 0xf8, 0x46, 0x57,
+                                                         0xa, 0x33, 0xfc, 0x46, 0x5, 0xfb, 0xb, 0x74,
+                                                         0x48, 0xfb, 0xa, 0xfb, 0x1f, 0x1b, 0x39, 0x3a,
+                                                         0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xae, 0x5, 0xf7,
+                                                         0x4e, 0xc0, 0x15, 0xd2, 0x6, 0x50, 0xf7, 0x20,
+                                                         0x5, 0xfb, 0x2, 0x6, 0xe, 0xf8, 0x5, 0x2d,
+                                                         0xa, 0xf7, 0xcc, 0x16, 0xf1, 0x6, 0xf8, 0x16,
+                                                         0xf9, 0x62, 0x5, 0x28, 0x6, 0xfb, 0xd5, 0xfc,
+                                                         0xfd, 0xfb, 0x7, 0xf8, 0xfd, 0x3d, 0xa, 0xe,
+                                                         0xf9, 0x1a, 0x2d, 0xa, 0xf7, 0x52, 0xdf, 0xf7,
+                                                         0xe6, 0xd9, 0xf7, 0xbc, 0xea, 0x3, 0xf7, 0x68,
+                                                         0x16, 0xec, 0x6, 0xf7, 0xb3, 0xf8, 0xd0, 0x48,
+                                                         0xa, 0xa7, 0xfc, 0xd0, 0x5, 0xf0, 0x6, 0xf7,
+                                                         0xf6, 0xf9, 0x62, 0x4d, 0xa, 0xfb, 0xac, 0xfc,
+                                                         0xe5, 0x4e, 0xa, 0x70, 0xf8, 0xe5, 0x5, 0x2a,
+                                                         0x6, 0xfb, 0xb9, 0xfc, 0xde, 0x89, 0x8d, 0x76,
+                                                         0xf8, 0xdc, 0x4d, 0xa, 0xe, 0xf8, 0x5, 0x2d,
+                                                         0xa, 0x9e, 0x16, 0xf7, 0xe, 0x6, 0xf7, 0x92,
+                                                         0xf7, 0xb4, 0xf7, 0x2b, 0xfb, 0xb4, 0x5, 0xef,
+                                                         0x6, 0xfb, 0x51, 0xf7, 0xee, 0xf7, 0xe1, 0xf8,
+                                                         0x8, 0x5, 0xfb, 0xc, 0x6, 0xfb, 0x98, 0xfb,
+                                                         0xbc, 0xfb, 0x30, 0xf7, 0xbc, 0x5, 0x26, 0x6,
+                                                         0xf7, 0x57, 0xfb, 0xf8, 0x5, 0xe, 0xf8, 0x5,
+                                                         0x2d, 0xa, 0xf7, 0x3b, 0xef, 0xf8, 0x40, 0xf7,
+                                                         0x3, 0x3, 0xf7, 0xda, 0x16, 0xe8, 0x6, 0xc2,
+                                                         0xf7, 0xa1, 0xf7, 0xe0, 0xf8, 0x55, 0x51, 0xa,
+                                                         0xfb, 0xf9, 0xfb, 0x3d, 0xf7, 0xf9, 0x47, 0xa,
+                                                         0xf7, 0x6b, 0xfc, 0x4d, 0x5, 0xe, 0x35, 0xa,
+                                                         0xfa, 0x35, 0x77, 0x1, 0xf7, 0xda, 0x16, 0xe7,
+                                                         0x6, 0xc3, 0xf7, 0xaa, 0xf7, 0xe0, 0xf8, 0x5f,
+                                                         0x51, 0xa, 0xfc, 0x0, 0xfb, 0x3d, 0xf8, 0x0,
+                                                         0x47, 0xa, 0xf7, 0x6a, 0xfc, 0x57, 0x5, 0xb1,
+                                                         0xf8, 0x8c, 0x15, 0xd2, 0x6, 0xf7, 0x13, 0x6f,
+                                                         0xa, 0xfb, 0x1, 0x6, 0xe, 0x35, 0xa, 0xf9,
+                                                         0x6d, 0x77, 0xe5, 0xf1, 0x1, 0xf7, 0xda, 0x16,
+                                                         0xe7, 0x6, 0xc3, 0xf7, 0xa6, 0xf7, 0xe0, 0xf8,
+                                                         0x5b, 0x51, 0xa, 0xfb, 0xfd, 0xfb, 0x3d, 0xf7,
+                                                         0xfd, 0x47, 0xa, 0xf7, 0x6a, 0xfc, 0x5b, 0x5,
+                                                         0xf7, 0x36, 0xf8, 0xa1, 0x15, 0xe5, 0x6, 0x9f,
+                                                         0xf1, 0x3f, 0xa, 0xfb, 0x57, 0x25, 0x15, 0xe4,
+                                                         0x6, 0xa0, 0xf1, 0x3e, 0xa, 0xf7, 0xcd, 0x8b,
+                                                         0xdc, 0xf8, 0xc0, 0xdc, 0x1, 0x84, 0x16, 0xf9,
+                                                         0x2, 0x6, 0x9f, 0xdc, 0x5, 0xfc, 0x7f, 0x6,
+                                                         0xf8, 0xe0, 0xf8, 0xc6, 0x94, 0xd6, 0x5, 0xfc,
+                                                         0xd8, 0x6, 0x77, 0x3a, 0xf8, 0x5d, 0x8c, 0xfc,
+                                                         0xe6, 0xfc, 0xca, 0x5, 0xe, 0xf7, 0xcd, 0x8b,
+                                                         0xdf, 0xf9, 0x56, 0xf7, 0x1f, 0x1, 0x84, 0x16,
+                                                         0xf8, 0xf8, 0x6, 0x9f, 0xdf, 0x5, 0xfc, 0x75,
+                                                         0x6, 0xf8, 0xe0, 0xf8, 0xd6, 0x94, 0xd8, 0x5,
+                                                         0xfc, 0xd8, 0x6, 0x77, 0x37, 0xf8, 0x57, 0x8a,
+                                                         0xfc, 0xe0, 0xfc, 0xd8, 0x5, 0xf8, 0x24, 0xf9,
+                                                         0x60, 0x15, 0xf7, 0x6, 0x6, 0xf7, 0x2d, 0x6f,
+                                                         0xa, 0x20, 0x6, 0x2d, 0x31, 0x5d, 0xe5, 0x45,
+                                                         0xa, 0xe, 0x7c, 0xd1, 0x66, 0x76, 0xf7, 0x8b,
+                                                         0xcd, 0xf7, 0x2e, 0xd5, 0x12, 0xc8, 0xe7, 0x13,
+                                                         0x78, 0xf8, 0x3c, 0x88, 0x15, 0xe8, 0x6, 0x85,
+                                                         0xa7, 0x87, 0x9f, 0xa3, 0x1a, 0xae, 0x91, 0xad,
+                                                         0x92, 0xad, 0x1e, 0xaa, 0xf7, 0x17, 0x5, 0x91,
+                                                         0xa4, 0x8d, 0xa4, 0xa2, 0x1a, 0xe7, 0x51, 0xd1,
+                                                         0xfb, 0x25, 0x40, 0xfb, 0x25, 0x60, 0xfb, 0xb,
+                                                         0x73, 0x1e, 0xe9, 0x83, 0x5, 0xd8, 0xa7, 0xc6,
+                                                         0x9e, 0xc6, 0x1b, 0x13, 0xb8, 0xc1, 0xe3, 0x7b,
+                                                         0xfb, 0xb, 0x6a, 0x1f, 0x65, 0x7d, 0x64, 0x89,
+                                                         0x3d, 0x88, 0x8, 0x4d, 0x89, 0xfb, 0x4b, 0x83,
+                                                         0xfb, 0x36, 0x1a, 0x29, 0xd6, 0x54, 0xe6, 0x1e,
+                                                         0xe8, 0xca, 0xc0, 0xa5, 0xa9, 0x1f, 0x8c, 0x7f,
+                                                         0x8d, 0x6e, 0x93, 0x71, 0x8, 0xa2, 0xf7, 0xa1,
+                                                         0x15, 0x82, 0x56, 0x80, 0x5f, 0x71, 0x66, 0x8,
+                                                         0x5a, 0x69, 0x53, 0x6f, 0x53, 0x1b, 0x3c, 0x74,
+                                                         0xb7, 0xb2, 0xe0, 0xe8, 0x9a, 0xc7, 0x91, 0x1f,
+                                                         0xdd, 0x92, 0xa4, 0x8d, 0xad, 0x98, 0x8, 0xe,
+                                                         0x4a, 0xa, 0xf8, 0x39, 0x77, 0x12, 0xc8, 0xea,
+                                                         0xf7, 0xe1, 0xed, 0x13, 0x7c, 0xf7, 0xcf, 0xf8,
+                                                         0xe9, 0x15, 0xda, 0x6, 0xf7, 0x21, 0xf7, 0x1d,
+                                                         0x5, 0xfb, 0xd, 0x6, 0x90, 0xfd, 0x75, 0x22,
+                                                         0xa, 0xe, 0x4a, 0xa, 0xf7, 0xb0, 0xf7, 0x1d,
+                                                         0x12, 0x13, 0x70, 0xf7, 0x7b, 0xf8, 0xe9, 0x15,
+                                                         0xe8, 0x6, 0xdd, 0xe2, 0xb3, 0x34, 0x5, 0xdb,
+                                                         0x6, 0x4d, 0xf7, 0x1d, 0x47, 0xa, 0xc2, 0xfd,
+                                                         0x75, 0x20, 0xa, 0x13, 0xb0, 0x2b, 0xa, 0xae,
+                                                         0xf8, 0xfa, 0x76, 0xf7, 0x21, 0x77, 0x1, 0xf7,
+                                                         0x8c, 0xf8, 0xe5, 0x15, 0xdd, 0x6, 0xf7, 0x25,
+                                                         0x6d, 0xa, 0xfb, 0x11, 0x6, 0xe, 0x7c, 0xd0,
+                                                         0x67, 0x76, 0xf7, 0x8a, 0xcd, 0xf7, 0xbe, 0xee,
+                                                         0x12, 0xc8, 0xe5, 0xf7, 0xcf, 0xe8, 0x13, 0x7c,
+                                                         0xf8, 0x44, 0xf8, 0xf3, 0x15, 0xe9, 0x6, 0xa1,
+                                                         0xee, 0x4d, 0xa, 0xfb, 0x62, 0x28, 0x15, 0xea,
+                                                         0x6, 0xa0, 0xee, 0x5, 0x2d, 0x6, 0xf7, 0x2a,
+                                                         0xfd, 0x59, 0x22, 0xa, 0xe, 0xf8, 0xe3, 0x7c,
+                                                         0xd1, 0xf7, 0x4c, 0xcf, 0xf7, 0x35, 0xd0, 0x8c,
+                                                         0x77, 0x12, 0xc8, 0xe6, 0x13, 0xe8, 0xf8, 0x47,
+                                                         0xf1, 0x15, 0x44, 0xa8, 0xe3, 0x5d, 0xd6, 0x1b,
+                                                         0xf7, 0x39, 0xcc, 0xf7, 0x1b, 0xbb, 0xa2, 0x1f,
+                                                         0x2f, 0x93, 0x5, 0x33, 0x5f, 0x4c, 0x6e, 0x57,
+                                                         0x1b, 0x44, 0x50, 0xcd, 0xf7, 0x6, 0x99, 0x1f,
+                                                         0xf8, 0x19, 0x6, 0x8d, 0x9a, 0x90, 0xad, 0xa9,
+                                                         0x1a, 0xf7, 0x7, 0x46, 0xf3, 0xfb, 0x20, 0x49,
+                                                         0x4b, 0x72, 0x5c, 0x5d, 0x1e, 0x13, 0xd8, 0x9f,
+                                                         0x7c, 0x5f, 0xc0, 0xfb, 0x0, 0x1b, 0xfb, 0x2,
+                                                         0x2c, 0x5c, 0xfb, 0x7, 0x65, 0x1f, 0xe4, 0x84,
+                                                         0x5, 0x13, 0xe8, 0xa6, 0x97, 0xa7, 0xd3, 0xf7,
+                                                         0x4, 0x1b, 0xd7, 0xb9, 0x51, 0x38, 0x65, 0x1f,
+                                                         0x30, 0x76, 0xfb, 0xe, 0x89, 0x58, 0x7c, 0x8,
+                                                         0x2f, 0x6f, 0x75, 0x45, 0x57, 0x1a, 0x48, 0xb2,
+                                                         0x34, 0xf7, 0x16, 0xf6, 0xc0, 0xc4, 0xc7, 0xb8,
+                                                         0x1e, 0x81, 0xf7, 0x30, 0x15, 0x54, 0x82, 0x67,
+                                                         0xfb, 0x28, 0xfb, 0x14, 0x1b, 0x42, 0x70, 0xb6,
+                                                         0xb4, 0xde, 0xdc, 0x96, 0xc9, 0x91, 0x1f, 0xd8,
+                                                         0x92, 0xa3, 0x91, 0xa8, 0x91, 0x8, 0xf4, 0xbc,
+                                                         0x15, 0xec, 0xa6, 0xc8, 0xcb, 0xe1, 0x1b, 0xc8,
+                                                         0xd8, 0x60, 0xfb, 0xa, 0x78, 0x1f, 0xe, 0x4a,
+                                                         0xa, 0xf7, 0xb0, 0xf7, 0x1d, 0x12, 0xc8, 0xe5,
+                                                         0xf7, 0xcf, 0xe8, 0x13, 0x7c, 0xf8, 0x37, 0x88,
+                                                         0x22, 0xa, 0x4a, 0xf7, 0xdc, 0x56, 0xa, 0xf7,
+                                                         0x1d, 0x5, 0xfb, 0x2, 0x6, 0xe, 0xf8, 0x5,
+                                                         0x7e, 0xd9, 0x50, 0x76, 0xf9, 0x2b, 0xd1, 0x12,
+                                                         0xd8, 0xe2, 0xcb, 0xe3, 0xf7, 0x30, 0xe4, 0x13,
+                                                         0xbc, 0xf7, 0x9e, 0xf8, 0x34, 0x15, 0x47, 0x6e,
+                                                         0xfb, 0xd, 0x52, 0xfb, 0x26, 0x1a, 0xfb, 0x7,
+                                                         0xe3, 0x39, 0xf7, 0x14, 0xea, 0xbf, 0xb4, 0xb6,
+                                                         0xbf, 0x1e, 0x13, 0x7c, 0xa9, 0x63, 0xaf, 0x6b,
+                                                         0x9c, 0x7d, 0xcd, 0xbf, 0x18, 0x74, 0xa5, 0x6c,
+                                                         0xac, 0x6f, 0xb0, 0xa6, 0xaa, 0xaf, 0xbb, 0xa4,
+                                                         0xbf, 0x40, 0xae, 0x18, 0x6a, 0x51, 0x76, 0x76,
+                                                         0x7b, 0x79, 0x57, 0xcc, 0x56, 0xea, 0x7c, 0xa6,
+                                                         0x8, 0xdc, 0xb5, 0xed, 0xc3, 0xeb, 0x1a, 0xca,
+                                                         0x58, 0xd3, 0x23, 0xfb, 0x6, 0x4b, 0x2d, 0x3e,
+                                                         0x58, 0x9b, 0x6d, 0x9b, 0x67, 0x1e, 0xf7, 0x4a,
+                                                         0xfb, 0xb9, 0x15, 0x13, 0xbc, 0x55, 0x57, 0x59,
+                                                         0x79, 0x60, 0x1b, 0x46, 0x4b, 0xb6, 0xd7, 0xe7,
+                                                         0xe1, 0xbb, 0xbe, 0xa3, 0x1f, 0xb1, 0x44, 0xcc,
+                                                         0x31, 0xb1, 0x59, 0x8, 0x2e, 0xf7, 0xd2, 0x15,
+                                                         0x6d, 0xc4, 0x88, 0xa6, 0x93, 0x1a, 0xb9, 0xb2,
+                                                         0xc2, 0xbd, 0xb1, 0xa8, 0x6d, 0x66, 0x4a, 0x2d,
+                                                         0x5c, 0x6e, 0x7d, 0x1e, 0xe, 0x7c, 0xd0, 0x67,
+                                                         0x76, 0xf7, 0x88, 0xcc, 0xf7, 0xa3, 0xb1, 0xf3,
+                                                         0xb0, 0x12, 0xc8, 0xe5, 0xf7, 0x22, 0xb0, 0xf6,
+                                                         0xb1, 0x13, 0x7f, 0xf7, 0xb9, 0xf9, 0x2f, 0x15,
+                                                         0x59, 0xb5, 0x63, 0xbc, 0xbc, 0xb5, 0xb3, 0xbd,
+                                                         0xbe, 0x62, 0xb1, 0x59, 0x59, 0x62, 0x65, 0x58,
+                                                         0x1e, 0xb0, 0x8a, 0x15, 0xa8, 0xa3, 0xa3, 0xa9,
+                                                         0xa8, 0xa3, 0x74, 0x6d, 0x6e, 0x73, 0x75, 0x6e,
+                                                         0x6e, 0x72, 0xa1, 0xa8, 0x1e, 0xe4, 0xfd, 0x31,
+                                                         0x20, 0xa, 0x13, 0xbf, 0x2b, 0xa, 0xf7, 0x3f,
+                                                         0xf7, 0xb1, 0x76, 0xf8, 0x3c, 0x77, 0x1, 0xb5,
+                                                         0xf7, 0x9c, 0x15, 0xec, 0x6, 0xf7, 0x2a, 0xf7,
+                                                         0xda, 0xf7, 0x2e, 0xfb, 0xda, 0x5, 0xeb, 0x6,
+                                                         0xfb, 0x63, 0xf8, 0x3c, 0x5, 0x37, 0x6, 0xe,
+                                                         0xf7, 0xb2, 0xf7, 0x49, 0xdf, 0x4b, 0x76, 0xc7,
+                                                         0xe0, 0x8c, 0x77, 0x12, 0x13, 0x60, 0xf7, 0x3,
+                                                         0xf7, 0x48, 0x15, 0xa6, 0xa8, 0xaf, 0xac, 0xc2,
+                                                         0x1b, 0xb6, 0xac, 0x80, 0x7f, 0xa9, 0x1f, 0x13,
+                                                         0x90, 0x7a, 0xb3, 0xae, 0x78, 0xb4, 0x1b, 0xca,
+                                                         0xb0, 0xa5, 0xa4, 0xa6, 0x1f, 0xe9, 0x7, 0x82,
+                                                         0x82, 0x59, 0x57, 0x4f, 0x1b, 0x60, 0x65, 0x9d,
+                                                         0x9c, 0x63, 0x1f, 0x13, 0x60, 0x98, 0x6b, 0x6a,
+                                                         0x97, 0x66, 0x1b, 0x64, 0x58, 0x7e, 0x62, 0x66,
+                                                         0x1f, 0xe, 0xe6, 0xf8, 0x58, 0x76, 0xf7, 0xb3,
+                                                         0x77, 0x1, 0xf7, 0xb6, 0xc5, 0x3, 0xf7, 0x96,
+                                                         0xf8, 0x43, 0x15, 0xc8, 0xee, 0xcb, 0x28, 0xc3,
+                                                         0xb3, 0x3a, 0xe2, 0xf7, 0x9, 0xa4, 0x75, 0xcd,
+                                                         0xfb, 0x2, 0x5f, 0x95, 0xf7, 0x5, 0x47, 0x8a,
+                                                         0x95, 0xfb, 0x5, 0xfb, 0x1, 0xb7, 0x76, 0x49,
+                                                         0xf7, 0x7, 0x73, 0x3d, 0x33, 0x5, 0xe, 0xf9,
+                                                         0xc6, 0x61, 0xcb, 0x4b, 0xf7, 0x56, 0x81, 0xcc,
+                                                         0xf7, 0xe9, 0xca, 0xeb, 0xcb, 0x12, 0xf7, 0x81,
+                                                         0xca, 0xf2, 0xdb, 0xf8, 0x7f, 0xcb, 0x13, 0xbf,
+                                                         0xf9, 0x49, 0xf7, 0x6a, 0x15, 0x70, 0x8e, 0x90,
+                                                         0x5e, 0xd8, 0x1b, 0xf7, 0x12, 0xf7, 0x1a, 0xf7,
+                                                         0x23, 0xf7, 0x3a, 0xf7, 0x3c, 0xfb, 0x12, 0xf7,
+                                                         0x3f, 0xfb, 0x87, 0xfb, 0xdf, 0x26, 0xfb, 0xa6,
+                                                         0xfb, 0x3e, 0xfb, 0x66, 0xf7, 0x19, 0xfb, 0x46,
+                                                         0xf7, 0xc6, 0x1f, 0x13, 0x5f, 0xf7, 0xaa, 0xea,
+                                                         0xf7, 0x3d, 0xa4, 0x97, 0x1f, 0x3d, 0x6, 0x13,
+                                                         0xbf, 0x5f, 0x6d, 0x30, 0x35, 0xfb, 0x4c, 0x1b,
+                                                         0xfb, 0x5e, 0xfb, 0x44, 0xe0, 0xf7, 0x83, 0xf7,
+                                                         0x63, 0xf7, 0x27, 0xf7, 0x41, 0xf7, 0x6d, 0xf7,
+                                                         0x3e, 0xf7, 0x20, 0xfb, 0x4, 0xfb, 0x37, 0xfb,
+                                                         0x2a, 0xfb, 0xd, 0x33, 0x5d, 0x1f, 0x67, 0x83,
+                                                         0x94, 0xca, 0x94, 0xb4, 0xc9, 0xf7, 0xb6, 0x18,
+                                                         0x3e, 0x6, 0x7c, 0x48, 0x5, 0xd5, 0x5e, 0x4c,
+                                                         0x90, 0x73, 0x1b, 0xfb, 0xc, 0x23, 0xfb, 0x26,
+                                                         0xfb, 0x1a, 0x26, 0xca, 0x33, 0xe9, 0xc8, 0xbe,
+                                                         0xbb, 0xa3, 0xa0, 0x1f, 0xfb, 0x66, 0xf7, 0x9,
+                                                         0x15, 0xd9, 0xbf, 0xf7, 0x1f, 0xec, 0xbb, 0xc1,
+                                                         0x6b, 0x2d, 0xfb, 0x6, 0x39, 0x26, 0x40, 0x5d,
+                                                         0x5b, 0xb3, 0xdf, 0x1e, 0xe, 0x7c, 0xd0, 0x67,
+                                                         0x76, 0xf7, 0x89, 0xcd, 0xf0, 0xd5, 0xf7, 0x83,
+                                                         0x77, 0x12, 0xc8, 0xea, 0xf7, 0xe1, 0xee, 0x13,
+                                                         0x7e, 0xf7, 0x7e, 0xf8, 0xf7, 0x15, 0xcd, 0x6,
+                                                         0xa4, 0x91, 0x97, 0x9c, 0xa5, 0x1b, 0xa5, 0xa4,
+                                                         0x82, 0x81, 0xa2, 0x1f, 0x7f, 0xa6, 0xa3, 0x7f,
+                                                         0x9e, 0x1b, 0xca, 0xaf, 0xc2, 0xc1, 0x90, 0x1f,
+                                                         0x4b, 0x6, 0x7d, 0x87, 0x84, 0x72, 0x70, 0x1b,
+                                                         0x7c, 0x77, 0x95, 0x95, 0x74, 0x1f, 0x96, 0x72,
+                                                         0x6e, 0x96, 0x67, 0x1b, 0x42, 0x79, 0x57, 0x50,
+                                                         0x7a, 0x1f, 0xf7, 0x4d, 0xfc, 0xfa, 0x20, 0xa,
+                                                         0x13, 0xae, 0x2b, 0xa, 0x7c, 0xd3, 0x64, 0x76,
+                                                         0xf8, 0x61, 0xd4, 0xf7, 0x4f, 0x77, 0x12, 0xf8,
+                                                         0x80, 0xe7, 0x13, 0x78, 0xc5, 0x88, 0x15, 0xdd,
+                                                         0x6, 0x9f, 0xee, 0x48, 0xa, 0x13, 0xb8, 0x4a,
+                                                         0x9e, 0xce, 0x5d, 0xd3, 0x1b, 0xf7, 0x13, 0xf7,
+                                                         0x1d, 0xf7, 0x19, 0xf7, 0x5a, 0xf7, 0x5a, 0xfb,
+                                                         0x20, 0x9c, 0x66, 0x4c, 0x5d, 0x6e, 0x63, 0x5d,
+                                                         0x1f, 0xc2, 0xf7, 0x94, 0x3d, 0xa, 0x13, 0x78,
+                                                         0x77, 0xfc, 0x8e, 0x15, 0xdd, 0xcd, 0xf7, 0x38,
+                                                         0xf7, 0xa, 0xea, 0x9d, 0x29, 0x5f, 0x1e, 0x13,
+                                                         0xb8, 0x42, 0x60, 0xfb, 0x4e, 0xfb, 0x1d, 0x6a,
+                                                         0x37, 0x98, 0xf7, 0x22, 0x1e, 0xe, 0x77, 0x8d,
+                                                         0x76, 0xf9, 0x88, 0x77, 0x1, 0xf7, 0x20, 0xf7,
+                                                         0x5e, 0x3, 0xf7, 0x90, 0x78, 0x15, 0xe5, 0x6,
+                                                         0xfb, 0x4, 0xf9, 0x88, 0x3e, 0xa, 0x65, 0xfb,
+                                                         0x64, 0x76, 0xfa, 0x5a, 0x77, 0x1, 0xd5, 0xf7,
+                                                         0x74, 0x3, 0xd5, 0xfb, 0x79, 0x15, 0xd7, 0x6,
+                                                         0xf7, 0x28, 0xfa, 0x5a, 0x5, 0x3f, 0x6, 0xe,
+                                                         0xaf, 0xfb, 0x58, 0xd5, 0xf7, 0xee, 0xd9, 0xf7,
+                                                         0xed, 0xd5, 0x1, 0xe7, 0xf7, 0xf5, 0x3, 0xe7,
+                                                         0xf7, 0x74, 0x15, 0xeb, 0x82, 0x31, 0x2c, 0x7e,
+                                                         0x1f, 0xfb, 0x26, 0x76, 0x89, 0x32, 0xf7, 0x3c,
+                                                         0x1b, 0x96, 0xd5, 0x5, 0x29, 0x8b, 0x94, 0xf7,
+                                                         0x2c, 0xa3, 0x1f, 0x9b, 0xf7, 0x6, 0x85, 0xd7,
+                                                         0x3c, 0xad, 0xf6, 0xbb, 0x90, 0x9f, 0xa3, 0xf7,
+                                                         0x44, 0x8, 0xe3, 0x98, 0xa3, 0xbf, 0xdd, 0x1b,
+                                                         0x96, 0xd5, 0x5, 0xfb, 0x36, 0x72, 0x45, 0xfb,
+                                                         0x24, 0x73, 0x1f, 0x2b, 0x7b, 0x79, 0xfb, 0x1,
+                                                         0x2a, 0x1b, 0xe, 0xaf, 0xfb, 0x58, 0xd5, 0xf7,
+                                                         0xee, 0xd9, 0xf8, 0x7, 0xd5, 0x1, 0x8b, 0xf7,
+                                                         0xf6, 0x3, 0x96, 0xfb, 0xe, 0x15, 0x80, 0x41,
+                                                         0x5, 0xf7, 0x24, 0xb9, 0xd7, 0xf7, 0x13, 0x9f,
+                                                         0x1f, 0xea, 0x9a, 0xa2, 0xf7, 0xe, 0xe9, 0x1b,
+                                                         0x97, 0xd9, 0x5, 0x2d, 0x91, 0xdd, 0xea, 0x99,
+                                                         0x1f, 0xf7, 0x28, 0xa1, 0x89, 0xea, 0xfb, 0x38,
+                                                         0x1b, 0x80, 0x41, 0x5, 0xee, 0x89, 0x7c, 0xfb,
+                                                         0x2e, 0x74, 0x1f, 0x7a, 0xfb, 0x6, 0x92, 0x48,
+                                                         0xd9, 0x68, 0xfb, 0x0, 0x5b, 0x86, 0x6b, 0x71,
+                                                         0xfb, 0x44, 0x8, 0x33, 0x7e, 0x71, 0x62, 0x3d,
+                                                         0x1b, 0xe, 0x5f, 0xa, 0xa0, 0xf8, 0x12, 0x3,
+                                                         0xf7, 0xf, 0xfb, 0x14, 0x15, 0xf7, 0x33, 0xf9,
+                                                         0xa2, 0x5, 0xf6, 0x6, 0x99, 0xcf, 0x5, 0xfb,
+                                                         0x59, 0x6, 0xfb, 0x4d, 0xfe, 0x2a, 0x5, 0xf7,
+                                                         0x57, 0x6, 0x9a, 0xcf, 0x5, 0xe, 0x5f, 0xa,
+                                                         0x7d, 0xf8, 0x12, 0x3, 0xfb, 0x14, 0x4, 0x7d,
+                                                         0x47, 0x5, 0xf7, 0x56, 0x6, 0xf7, 0x50, 0xfa,
+                                                         0x2a, 0x5, 0xfb, 0x54, 0x6, 0x7c, 0x47, 0x5,
+                                                         0xf5, 0x6, 0xfb, 0x36, 0xfd, 0xa2, 0x5, 0xe,
+                                                         0xae, 0xf8, 0xe7, 0xca, 0x1, 0xf7, 0x3b, 0xc8,
+                                                         0x3, 0xf7, 0x3b, 0xf9, 0x6f, 0x15, 0x42, 0x8e,
+                                                         0xb9, 0x4c, 0xe5, 0x1b, 0xf7, 0x2, 0xb9, 0xe2,
+                                                         0xbc, 0x99, 0x1f, 0x4e, 0x6, 0x73, 0x81, 0x6f,
+                                                         0x5a, 0x47, 0x1b, 0x53, 0x78, 0xa9, 0xb6, 0x85,
+                                                         0x1f, 0xe, 0x65, 0x8d, 0x76, 0xf9, 0x88, 0x77,
+                                                         0x1, 0xf7, 0x4b, 0xf8, 0x3f, 0x15, 0xd8, 0x6,
+                                                         0xcb, 0xf7, 0xca, 0x5, 0x3e, 0x6, 0xfb, 0x31,
+                                                         0xfd, 0x88, 0x15, 0xd8, 0x6, 0xcb, 0xf7, 0xc9,
+                                                         0x5, 0x3e, 0x6, 0xe, 0xbf, 0xf7, 0x73, 0x76,
+                                                         0xf7, 0xcf, 0x77, 0x1, 0xe6, 0xf7, 0xfd, 0x15,
+                                                         0x34, 0xd3, 0x43, 0xe4, 0xe3, 0xd4, 0xd3, 0xe2,
+                                                         0xe1, 0x42, 0xd1, 0x33, 0x32, 0x43, 0x45, 0x35,
+                                                         0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd1, 0xf7, 0xc5,
+                                                         0xf7, 0x46, 0x41, 0xd5, 0x1, 0xd5, 0xea, 0xf7,
+                                                         0xb8, 0xe7, 0x3, 0xf8, 0x3e, 0xf7, 0x52, 0x15,
+                                                         0x54, 0x78, 0x5c, 0x3b, 0x36, 0x1b, 0x72, 0x3a,
+                                                         0x98, 0xf7, 0x12, 0xbf, 0xa0, 0xf7, 0x6e, 0xf7,
+                                                         0x36, 0xa6, 0xdd, 0x84, 0x28, 0x1f, 0xe7, 0x90,
+                                                         0x5, 0xf7, 0x1d, 0xfb, 0x4, 0xb1, 0x3b, 0xfb,
+                                                         0x6d, 0x45, 0xfb, 0x66, 0xfb, 0x1a, 0xfb, 0x26,
+                                                         0xe7, 0x4c, 0xf7, 0x0, 0xf3, 0xe8, 0xc6, 0xf7,
+                                                         0x1d, 0xbb, 0x1e, 0xe, 0x53, 0xa, 0xf7, 0x83,
+                                                         0xf8, 0xe5, 0x15, 0xed, 0x6, 0xf7, 0x17, 0xf7,
+                                                         0x21, 0x3d, 0xa, 0x3a, 0x31, 0x64, 0xe5, 0x5,
+                                                         0x3c, 0x6, 0xe, 0xf7, 0x5e, 0xfb, 0x60, 0x76,
+                                                         0xf7, 0x58, 0xd1, 0xf7, 0xce, 0xf7, 0x4b, 0x40,
+                                                         0xd6, 0x1, 0xd5, 0xea, 0xf7, 0x3, 0xdd, 0xee,
+                                                         0xe6, 0x3, 0xf7, 0x63, 0x2d, 0x15, 0xa7, 0xb8,
+                                                         0x8e, 0x68, 0x5c, 0x3c, 0x91, 0x5b, 0x1f, 0x78,
+                                                         0x53, 0x5, 0x8a, 0x9e, 0xa1, 0x8a, 0x9e, 0x1b,
+                                                         0xb2, 0xf7, 0x15, 0x98, 0xe3, 0x9d, 0x83, 0xbb,
+                                                         0x41, 0x1f, 0x97, 0xa8, 0x5, 0xf7, 0x1, 0xd9,
+                                                         0xe1, 0xf7, 0x6, 0xb3, 0x1f, 0x2f, 0x95, 0x5,
+                                                         0x53, 0x78, 0x5b, 0x37, 0x36, 0x1b, 0x63, 0x49,
+                                                         0xb3, 0xf5, 0xdc, 0xa8, 0xf7, 0x57, 0xf7, 0x2f,
+                                                         0xa6, 0xdc, 0x74, 0x33, 0x1f, 0xe6, 0x91, 0x5,
+                                                         0xf7, 0x20, 0xfb, 0x3, 0xb3, 0x3b, 0xfb, 0x68,
+                                                         0x40, 0xfb, 0x61, 0xfb, 0x26, 0xfb, 0x44, 0xf7,
+                                                         0x11, 0x62, 0xae, 0x8e, 0x1e, 0xe, 0xae, 0xfb,
+                                                         0x60, 0x76, 0xf7, 0x75, 0x77, 0x12, 0xf7, 0x2e,
+                                                         0xd9, 0x17, 0xee, 0x16, 0x78, 0x38, 0x5, 0xb8,
+                                                         0xa8, 0x79, 0x6f, 0x67, 0x4b, 0x8d, 0x7d, 0x66,
+                                                         0x7f, 0x8d, 0x8c, 0x7b, 0x1f, 0x13, 0xe0, 0x82,
+                                                         0x4f, 0x5, 0x87, 0xa2, 0xa9, 0x8a, 0xa2, 0x1b,
+                                                         0xa7, 0xf7, 0x12, 0x90, 0xe6, 0x96, 0x88, 0xc6,
+                                                         0x3d, 0x98, 0x1f, 0x95, 0xb9, 0x5, 0xe, 0xad,
+                                                         0xc1, 0xf7, 0xd8, 0xc5, 0x1, 0xf6, 0x2a, 0x15,
+                                                         0xc4, 0x79, 0xe0, 0xf7, 0x2d, 0x5, 0x89, 0x94,
+                                                         0x9b, 0x89, 0xa4, 0x1b, 0xf2, 0xed, 0xb7, 0xf7,
+                                                         0x1, 0xbd, 0x1f, 0x40, 0x92, 0x5, 0x61, 0x78,
+                                                         0x46, 0x4b, 0x34, 0x1b, 0x82, 0x83, 0x8d, 0x8c,
+                                                         0x87, 0x1f, 0xf7, 0x40, 0xf7, 0xca, 0xb4, 0x75,
+                                                         0x9e, 0x68, 0x8c, 0x78, 0x19, 0xd3, 0x8f, 0x5,
+                                                         0x9f, 0x7d, 0xd7, 0x32, 0xa7, 0x1e, 0xdf, 0xf7,
+                                                         0x2c, 0x53, 0x9d, 0x34, 0xfb, 0x33, 0x5, 0x8c,
+                                                         0x83, 0x82, 0x8c, 0x7a, 0x1b, 0xfb, 0x71, 0x43,
+                                                         0xfb, 0x3a, 0x23, 0x5d, 0x9a, 0x4e, 0xdd, 0x68,
+                                                         0x1f, 0xac, 0xc7, 0x15, 0x79, 0x95, 0x66, 0x9d,
+                                                         0xc1, 0x1a, 0xb7, 0xa9, 0xf7, 0x3c, 0xf7, 0x51,
+                                                         0x1e, 0xe, 0xae, 0xf8, 0xe5, 0xe5, 0x31, 0xf7,
+                                                         0x21, 0x12, 0x13, 0x80, 0xf7, 0x27, 0xf8, 0xe5,
+                                                         0x15, 0xe7, 0x6, 0xdc, 0xe5, 0xb2, 0x31, 0x5,
+                                                         0xda, 0x6, 0x13, 0x40, 0x4d, 0xf7, 0x21, 0x57,
+                                                         0xa, 0xe, 0x77, 0x8b, 0xeb, 0xf7, 0xd8, 0xeb,
+                                                         0x1, 0xe2, 0xf7, 0x6a, 0x3, 0xf7, 0x43, 0xf8,
+                                                         0x38, 0x40, 0xa, 0xfb, 0x2, 0xfc, 0x98, 0x40,
+                                                         0xa, 0xe, 0x77, 0xfb, 0x12, 0x76, 0xf7, 0x91,
+                                                         0x77, 0x1, 0xe2, 0x8e, 0x15, 0xc4, 0x6, 0x78,
+                                                         0x2d, 0x5f, 0x81, 0x7a, 0x87, 0x83, 0x61, 0x18,
+                                                         0x67, 0xa, 0x92, 0xaf, 0x9e, 0xe5, 0x18, 0x22,
+                                                         0x6, 0xe, 0xf8, 0x4b, 0x78, 0xc9, 0xee, 0xc6,
+                                                         0xf7, 0xce, 0xc2, 0xf4, 0xc9, 0x1, 0xc1, 0xcc,
+                                                         0xf9, 0x21, 0xcc, 0x3, 0xf8, 0xcb, 0xf7, 0xbe,
+                                                         0x15, 0x34, 0x6b, 0x41, 0x81, 0x6f, 0x1b, 0x44,
+                                                         0x4f, 0xbb, 0xf6, 0x98, 0x1f, 0xd6, 0x94, 0xb9,
+                                                         0xdf, 0xef, 0x1b, 0x9d, 0xd0, 0x8a, 0x3f, 0xa1,
+                                                         0x1f, 0xcb, 0x99, 0x5, 0xdd, 0x7b, 0x46, 0xaf,
+                                                         0x3a, 0x1b, 0xfb, 0x17, 0x35, 0x37, 0xfb, 0x16,
+                                                         0x7b, 0x1f, 0xfb, 0x1c, 0x7b, 0xd9, 0x3d, 0xf7,
+                                                         0xc, 0x1b, 0xdd, 0xe2, 0xb6, 0xe9, 0xad, 0x1f,
+                                                         0xfc, 0xd3, 0xd8, 0x15, 0xfb, 0x65, 0xf7, 0x45,
+                                                         0xfb, 0x3a, 0xf7, 0x6d, 0xf7, 0x6d, 0xf7, 0x40,
+                                                         0xf7, 0x3b, 0xf7, 0x64, 0xf7, 0x65, 0xfb, 0x42,
+                                                         0xf7, 0x40, 0xfb, 0x6b, 0xfb, 0x6a, 0xfb, 0x48,
+                                                         0xfb, 0x3f, 0xfb, 0x66, 0x1e, 0xcc, 0x16, 0xf7,
+                                                         0x42, 0xf7, 0x29, 0xf7, 0x25, 0xf7, 0x48, 0xf7,
+                                                         0x49, 0xf7, 0x23, 0xfb, 0x25, 0xfb, 0x42, 0xfb,
+                                                         0x42, 0xfb, 0x23, 0xfb, 0x1f, 0xfb, 0x49, 0xfb,
+                                                         0x48, 0xfb, 0x29, 0xf7, 0x1f, 0xf7, 0x42, 0x1e,
+                                                         0xe, 0xf7, 0xc, 0x76, 0xae, 0xdf, 0xf7, 0x9e,
+                                                         0xdf, 0xae, 0x77, 0x1, 0xee, 0xee, 0x15, 0xe3,
+                                                         0xd3, 0x5, 0x70, 0xa9, 0xb0, 0x81, 0xb0, 0x1b,
+                                                         0xb0, 0xbb, 0x95, 0xa6, 0xb7, 0x1f, 0xbb, 0x43,
+                                                         0xd4, 0xc8, 0x5a, 0xd0, 0xb6, 0xbd, 0x9c, 0xb8,
+                                                         0x92, 0xa5, 0x19, 0x92, 0xa7, 0x94, 0xb8, 0x7a,
+                                                         0xbb, 0xe3, 0xd2, 0x18, 0x63, 0xc8, 0x33, 0x43,
+                                                         0x5, 0xa6, 0x6e, 0x63, 0x95, 0x66, 0x1b, 0x66,
+                                                         0x5e, 0x81, 0x70, 0x5e, 0x1f, 0x5b, 0xd3, 0x43,
+                                                         0x4e, 0xbb, 0x44, 0x60, 0x5b, 0x79, 0x5e, 0x84,
+                                                         0x6f, 0x19, 0x84, 0x71, 0x83, 0x5e, 0x9c, 0x59,
+                                                         0x34, 0x46, 0x18, 0xf7, 0x39, 0xf7, 0x52, 0x15,
+                                                         0xd6, 0xa0, 0xd3, 0xc6, 0xd1, 0x1b, 0xd1, 0xb5,
+                                                         0x4f, 0x41, 0x76, 0x1f, 0x42, 0x77, 0x42, 0x50,
+                                                         0x44, 0x1b, 0x46, 0x62, 0xc6, 0xd4, 0x9f, 0x1f,
+                                                         0xe, 0x7c, 0xd3, 0x4f, 0xc7, 0xf8, 0x25, 0xd4,
+                                                         0xf7, 0x4f, 0x77, 0x12, 0xdf, 0xe7, 0x13, 0x78,
+                                                         0xf8, 0x30, 0x88, 0x15, 0xe0, 0x6, 0xf7, 0x2f,
+                                                         0xf9, 0x65, 0x3d, 0xa, 0x50, 0xfb, 0xad, 0x4e,
+                                                         0xa, 0xd5, 0x64, 0x51, 0x9f, 0x55, 0x1b, 0xfb,
+                                                         0x20, 0xfb, 0x10, 0xfb, 0x1c, 0xfb, 0x4a, 0x1f,
+                                                         0x13, 0xb8, 0xfb, 0x3c, 0xf3, 0x4f, 0xd6, 0xd0,
+                                                         0xc0, 0xb2, 0xba, 0xb6, 0x1e, 0x13, 0x78, 0xfb,
+                                                         0x90, 0xf7, 0x22, 0x15, 0xc4, 0xb5, 0xf7, 0x50,
+                                                         0xf7, 0x16, 0xc2, 0xcf, 0x67, 0x2a, 0xfb, 0x1e,
+                                                         0x3a, 0xfb, 0x16, 0x27, 0xfb, 0x6, 0x8b, 0xf7,
+                                                         0x11, 0xaa, 0x1e, 0xe, 0xfb, 0x1e, 0x76, 0xf8,
+                                                         0xe6, 0xd5, 0xf7, 0x65, 0x77, 0x1, 0xf7, 0x1b,
+                                                         0xf8, 0x7b, 0x3, 0xf7, 0x61, 0xfb, 0x33, 0x15,
+                                                         0xe2, 0x6, 0xf7, 0xf, 0xf8, 0xe6, 0x5, 0xf7,
+                                                         0x54, 0x6, 0x9a, 0xd5, 0x5, 0xfb, 0x53, 0x6,
+                                                         0xb6, 0xf7, 0x65, 0x5, 0x33, 0x6, 0x60, 0xfb,
+                                                         0x65, 0x5, 0xfb, 0x55, 0x6, 0x7c, 0x41, 0x5,
+                                                         0xf7, 0x55, 0x6, 0xe, 0xfb, 0x1e, 0x76, 0xf7,
+                                                         0x50, 0xd5, 0xf7, 0xf6, 0xd8, 0xf7, 0x4c, 0x77,
+                                                         0x1, 0xbf, 0xa8, 0x15, 0xf7, 0x53, 0x6, 0x66,
+                                                         0xfb, 0x50, 0x5, 0xe1, 0x6, 0xb0, 0xf7, 0x50,
+                                                         0x5, 0xf7, 0x50, 0x6, 0x9b, 0xd5, 0x5, 0xfb,
+                                                         0x51, 0x6, 0xd5, 0xf7, 0xf6, 0x5, 0xf7, 0x4f,
+                                                         0x6, 0x9d, 0xd8, 0x5, 0xfb, 0x52, 0x6, 0xb0,
+                                                         0xf7, 0x4c, 0x5, 0x35, 0x6, 0x65, 0xfb, 0x4c,
+                                                         0x5, 0xfb, 0x52, 0x6, 0x7b, 0x3e, 0x5, 0xf7,
+                                                         0x53, 0x6, 0x42, 0xfb, 0xf6, 0x5, 0xfb, 0x52,
+                                                         0x6, 0xe, 0xf1, 0xf8, 0x2f, 0xc2, 0xf7, 0x4c,
+                                                         0xc0, 0x1, 0xf7, 0x3d, 0xc1, 0xf7, 0x51, 0xc3,
+                                                         0x3, 0xf7, 0x3d, 0xf8, 0xc3, 0x15, 0x38, 0xcf,
+                                                         0x4a, 0xdc, 0xdd, 0xcf, 0xcc, 0xde, 0xdc, 0x49,
+                                                         0xca, 0x37, 0x38, 0x49, 0x4d, 0x39, 0x1e, 0xc1,
+                                                         0x8c, 0x15, 0xbe, 0xb5, 0xb2, 0xbf, 0xc0, 0xb5,
+                                                         0x64, 0x58, 0x57, 0x60, 0x61, 0x57, 0x58, 0x60,
+                                                         0xb5, 0xbf, 0x1e, 0xe, 0xae, 0xf8, 0xf0, 0xf1,
+                                                         0x1, 0xf7, 0xf9, 0xf9, 0x56, 0x5d, 0xa, 0xfb,
+                                                         0x27, 0xf1, 0x5d, 0xa, 0xe, 0xf7, 0xb2, 0x78,
+                                                         0xec, 0xf7, 0x18, 0xdd, 0xf7, 0x1a, 0xed, 0x1,
+                                                         0xe0, 0xf7, 0x66, 0x15, 0xf8, 0x76, 0x6, 0xb2,
+                                                         0xdd, 0x5, 0xfc, 0x76, 0x6, 0xf7, 0x7c, 0xf7,
+                                                         0x1a, 0x15, 0xf0, 0x6, 0xb9, 0xed, 0x5, 0x25,
+                                                         0x6, 0xfb, 0x61, 0xfc, 0xb3, 0x15, 0xf1, 0x6,
+                                                         0xb8, 0xec, 0x5, 0x26, 0x6, 0xe, 0x2d, 0x76,
+                                                         0xf7, 0x12, 0x76, 0xf9, 0x35, 0xd4, 0xb2, 0x77,
+                                                         0x1, 0xf7, 0x1a, 0xe6, 0xf7, 0xc3, 0xde, 0x3,
+                                                         0xf7, 0x8c, 0x81, 0x15, 0x74, 0x22, 0x5, 0xbf,
+                                                         0x6, 0xa0, 0xee, 0x5, 0xf7, 0x5e, 0xd0, 0xf7,
+                                                         0xb, 0xe5, 0xf7, 0x12, 0xfb, 0xe, 0xc9, 0x50,
+                                                         0xa3, 0x1f, 0xc1, 0xf7, 0x8e, 0x5, 0xc6, 0xa8,
+                                                         0x38, 0x6f, 0x8f, 0x1f, 0xde, 0x91, 0x5, 0xb2,
+                                                         0x4e, 0xf7, 0x1f, 0x29, 0x1e, 0x95, 0xba, 0x5,
+                                                         0x59, 0x6, 0x81, 0x64, 0x5, 0xfb, 0x55, 0x52,
+                                                         0xfb, 0x8, 0x3a, 0xfb, 0x13, 0xf7, 0x5, 0x58,
+                                                         0xbf, 0x76, 0x1f, 0x50, 0xfb, 0xa9, 0x5, 0x65,
+                                                         0x53, 0xb6, 0xf4, 0x83, 0x1f, 0x2e, 0x86, 0x5,
+                                                         0x25, 0x91, 0xca, 0xfb, 0x6, 0xf7, 0x2, 0x1b,
+                                                         0xe9, 0xf8, 0x46, 0x15, 0x62, 0x9e, 0x57, 0xa1,
+                                                         0xd5, 0x1a, 0xda, 0xd9, 0xb8, 0xcd, 0x1e, 0x3c,
+                                                         0xfc, 0xf5, 0x15, 0xc2, 0xf7, 0x9d, 0x5, 0xba,
+                                                         0x77, 0xc8, 0x6e, 0x3e, 0x1a, 0x44, 0x4a, 0x47,
+                                                         0x29, 0x1e, 0xe, 0xae, 0xf8, 0xf0, 0xf1, 0x1,
+                                                         0xf7, 0x8d, 0xf8, 0xf0, 0x15, 0xe7, 0x6, 0xa0,
+                                                         0xf1, 0x5, 0x2e, 0x6, 0xe, 0x77, 0x43, 0xa,
+                                                         0xea, 0xf7, 0x5b, 0x3, 0xea, 0x16, 0xe4, 0x6,
+                                                         0xf7, 0x2, 0xf8, 0x9f, 0x3e, 0xa, 0x7c, 0xd5,
+                                                         0xf7, 0x49, 0xd0, 0xf7, 0x33, 0xd1, 0x1, 0xdf,
+                                                         0xe7, 0xf7, 0xcf, 0xe2, 0x3, 0xf7, 0x44, 0xf7,
+                                                         0x84, 0x15, 0xf8, 0x1f, 0x6, 0x8e, 0x9f, 0x8f,
+                                                         0x9f, 0xb3, 0x1a, 0xe6, 0x5c, 0xf7, 0x13, 0xfb,
+                                                         0x38, 0xfb, 0x5a, 0x36, 0xfb, 0x55, 0xfb, 0x1b,
+                                                         0xfb, 0x27, 0xe8, 0x3d, 0xf7, 0x8, 0xf7, 0x1f,
+                                                         0xe6, 0xf7, 0x2, 0xd4, 0xa1, 0x1e, 0x32, 0x94,
+                                                         0x5, 0x2a, 0x61, 0x39, 0x76, 0x64, 0x1b, 0x43,
+                                                         0x4f, 0xd5, 0xf6, 0x9a, 0x1f, 0x99, 0xd0, 0x15,
+                                                         0xce, 0xa0, 0xc0, 0xe7, 0xf4, 0x1b, 0xd3, 0xc6,
+                                                         0x4c, 0x2b, 0x82, 0x1f, 0xe, 0x7c, 0xd5, 0x41,
+                                                         0xf7, 0x50, 0xcf, 0xd1, 0xf8, 0x3b, 0x77, 0x1,
+                                                         0xdf, 0xe7, 0x3, 0xf7, 0xd7, 0xf8, 0xe7, 0x15,
+                                                         0xd8, 0x6, 0xf7, 0x1d, 0x6f, 0xa, 0xfb, 0xa,
+                                                         0x6, 0xfb, 0x86, 0xfc, 0x81, 0x25, 0xa, 0xe,
+                                                         0x7c, 0xd5, 0xf7, 0x4a, 0xd1, 0xf7, 0xb0, 0xf7,
+                                                         0x1f, 0x1, 0xdf, 0xe6, 0xf7, 0xd0, 0xe2, 0x3,
+                                                         0xf7, 0x8c, 0xf8, 0xe7, 0x15, 0xe9, 0x6, 0xdd,
+                                                         0xe5, 0xb4, 0x31, 0x5, 0xdb, 0x6, 0x4c, 0xf7,
+                                                         0x1f, 0x47, 0xa, 0xfb, 0x61, 0xfc, 0x81, 0x25,
+                                                         0xa, 0xe, 0x7c, 0xd4, 0xf7, 0x48, 0xcf, 0xf7,
+                                                         0xbf, 0xf0, 0x1, 0xdf, 0xe6, 0x3, 0xf8, 0x56,
+                                                         0xf8, 0xf1, 0x63, 0xa, 0xfb, 0x64, 0x26, 0x63,
+                                                         0xa, 0xfb, 0x1, 0xfc, 0x65, 0x25, 0xa, 0xe,
+                                                         0x7c, 0xd5, 0xf7, 0x4a, 0xd1, 0xf7, 0xb1, 0xf7,
+                                                         0x1e, 0x1, 0xdf, 0xe6, 0x3, 0xf7, 0x45, 0xf7,
+                                                         0x85, 0x25, 0xa, 0x29, 0xf7, 0xb1, 0x15, 0xd3,
+                                                         0x6, 0x50, 0xf7, 0x1e, 0x5, 0xfb, 0x3, 0x6,
+                                                         0xe, 0x78, 0xd0, 0xf7, 0xbb, 0xcb, 0xf7, 0x75,
+                                                         0xd0, 0x1, 0xd5, 0xeb, 0xf7, 0xee, 0xe6, 0x3,
+                                                         0xf7, 0x83, 0xf8, 0x15, 0x15, 0xfb, 0x31, 0x63,
+                                                         0x83, 0xfb, 0x2a, 0x6c, 0x1a, 0x23, 0xe0, 0x3c,
+                                                         0xf7, 0x1f, 0xf7, 0x3e, 0xf2, 0xf7, 0xb, 0xf7,
+                                                         0xe, 0xe9, 0x4d, 0xb4, 0x6b, 0x9d, 0x1e, 0xd0,
+                                                         0x9c, 0xc8, 0xcc, 0xd3, 0x1a, 0xca, 0x5c, 0xf7,
+                                                         0x3, 0xfb, 0x3f, 0xfb, 0x39, 0x44, 0xfb, 0xb,
+                                                         0x40, 0x78, 0x8d, 0x4c, 0xdf, 0x61, 0x1e, 0x46,
+                                                         0xfb, 0x71, 0x15, 0xe7, 0xcf, 0xe4, 0xf6, 0xd3,
+                                                         0xc5, 0x55, 0x46, 0x40, 0x4f, 0x2a, 0x20, 0x39,
+                                                         0x53, 0xbc, 0xcc, 0x1e, 0xd8, 0xf7, 0xed, 0x15,
+                                                         0xc2, 0xb2, 0xd1, 0xf2, 0xd4, 0xc1, 0x5d, 0x50,
+                                                         0x54, 0x5f, 0x4a, 0x23, 0x43, 0x5a, 0xb0, 0xca,
+                                                         0x1e, 0xe, 0xf9, 0x52, 0x8b, 0xf5, 0x1, 0xf8,
+                                                         0x57, 0x16, 0x4b, 0xa, 0xf7, 0xcf, 0x21, 0x15,
+                                                         0x4b, 0xa, 0xfd, 0x49, 0x21, 0x15, 0x4b, 0xa,
+                                                         0xe, 0xf9, 0x52, 0x64, 0xa, 0xfa, 0x8c, 0xd4,
+                                                         0xfe, 0x8c, 0x6, 0xe, 0x64, 0xa, 0xf8, 0xd0,
+                                                         0xd4, 0xfc, 0xd0, 0x6, 0xe, 0xf7, 0xb2, 0xf7,
+                                                         0x7, 0xdc, 0xf7, 0x8, 0xd9, 0x1, 0xb5, 0xf8,
+                                                         0xc9, 0x3, 0xca, 0xf7, 0xce, 0x15, 0xf8, 0xc9,
+                                                         0xd7, 0xfc, 0xc9, 0x6, 0xfb, 0xa7, 0x4, 0xf8,
+                                                         0xc9, 0xda, 0xfc, 0xc9, 0x6, 0xe, 0x81, 0xd5,
+                                                         0x1, 0xf8, 0x8e, 0xf0, 0x3, 0xf7, 0xf0, 0xf8,
+                                                         0xd1, 0x15, 0xf7, 0x0, 0xb9, 0xa5, 0x5e, 0xa0,
+                                                         0x5b, 0x94, 0x59, 0x19, 0x89, 0x89, 0x5, 0xa2,
+                                                         0x72, 0x61, 0xae, 0x36, 0x1b, 0xfb, 0x2a, 0xfb,
+                                                         0x13, 0xfb, 0x29, 0xfb, 0x47, 0xfb, 0x7, 0xd2,
+                                                         0x23, 0xf7, 0x32, 0xf7, 0x8c, 0xc6, 0xf7, 0x90,
+                                                         0xf7, 0x8, 0xf7, 0x38, 0x53, 0xe4, 0x6d, 0xb9,
+                                                         0x1f, 0xdd, 0xae, 0x73, 0xbd, 0x2e, 0x65, 0x88,
+                                                         0x90, 0x78, 0x9e, 0x7a, 0x99, 0x19, 0x28, 0x6,
+                                                         0xa5, 0x73, 0x90, 0x85, 0xad, 0x62, 0x28, 0x60,
+                                                         0x18, 0xfb, 0x26, 0xfc, 0x37, 0x15, 0xea, 0xc3,
+                                                         0xf7, 0x33, 0xf7, 0x26, 0xcb, 0xd3, 0x68, 0x21,
+                                                         0x34, 0x4f, 0xfb, 0x3f, 0xfb, 0x24, 0xfb, 0x3,
+                                                         0x74, 0xdf, 0xc8, 0x1e, 0xe, 0x77, 0x8b, 0xef,
+                                                         0xe0, 0x77, 0xf8, 0xbd, 0x77, 0x1, 0xe5, 0x16,
+                                                         0xef, 0x6, 0xa0, 0xef, 0x47, 0xa, 0xb0, 0xe0,
+                                                         0x15, 0xc2, 0x6, 0xf3, 0xf8, 0x4, 0xac, 0xf7,
+                                                         0x39, 0x5, 0x20, 0x6, 0x6c, 0xfb, 0x39, 0x5,
+                                                         0xe, 0xae, 0xfb, 0x42, 0x76, 0xf8, 0xaf, 0x77,
+                                                         0xf0, 0xed, 0x1, 0xd8, 0xf7, 0x8d, 0x3, 0xf7,
+                                                         0x61, 0xf8, 0x3d, 0x15, 0xef, 0x6, 0xa0, 0xed,
+                                                         0x47, 0xa, 0xfb, 0x8, 0xfc, 0xc0, 0x15, 0x6a,
+                                                         0xfb, 0x36, 0x5, 0xf6, 0x6, 0xab, 0xf7, 0x36,
+                                                         0xc1, 0xf8, 0xd, 0x5, 0x54, 0x6, 0xe, 0x77,
+                                                         0x3a, 0xa, 0xf5, 0xf7, 0xde, 0x3, 0xe1, 0x16,
+                                                         0xdb, 0x6, 0xe0, 0xf8, 0x56, 0x5, 0xe5, 0x6,
+                                                         0x98, 0xcf, 0x3f, 0xa, 0xf0, 0x9f, 0x91, 0xa9,
+                                                         0xb5, 0x1b, 0xa7, 0xa8, 0x82, 0x88, 0x98, 0x1f,
+                                                         0x99, 0xd8, 0x5, 0x8f, 0x79, 0x62, 0x95, 0x6c,
+                                                         0x1b, 0x25, 0x80, 0x36, 0x46, 0x7a, 0x1f, 0x7f,
+                                                         0x53, 0x5, 0x43, 0x6, 0x7f, 0x47, 0x5, 0xd2,
+                                                         0x6, 0xe, 0xf7, 0x5e, 0x3a, 0xa, 0xe1, 0x16,
+                                                         0xe5, 0x46, 0xa, 0xa1, 0x8f, 0xa9, 0xba, 0x1b,
+                                                         0xaa, 0xae, 0x82, 0x88, 0x99, 0x1f, 0x9b, 0xd8,
+                                                         0x5, 0x8f, 0x77, 0x62, 0x95, 0x68, 0x1b, 0xfb,
+                                                         0x6, 0x7a, 0x36, 0x46, 0x78, 0x1f, 0x7e, 0x53,
+                                                         0x5, 0x3b, 0x6, 0x7c, 0x47, 0x5, 0xdc, 0x6,
+                                                         0xf7, 0x36, 0xfc, 0x56, 0x15, 0xe5, 0x6, 0xf7,
+                                                         0x3, 0xf8, 0x9a, 0x3f, 0xa, 0x9f, 0xe9, 0x15,
+                                                         0xe5, 0x6, 0xa1, 0xf3, 0x3e, 0xa, 0x78, 0xd0,
+                                                         0xf7, 0xef, 0xd9, 0xf7, 0x2d, 0xdb, 0x1, 0xcf,
+                                                         0xee, 0xf7, 0xb7, 0xeb, 0x3, 0xce, 0xf7, 0x57,
+                                                         0x15, 0x23, 0xd4, 0xfb, 0x2, 0xf7, 0x2e, 0xf7,
+                                                         0x41, 0xf7, 0x10, 0xf7, 0xd, 0xf7, 0x37, 0xf7,
+                                                         0x2c, 0xfb, 0xa, 0xc5, 0x34, 0x41, 0x61, 0x6e,
+                                                         0x7e, 0x73, 0x1e, 0xc6, 0xf7, 0x47, 0x5, 0xf7,
+                                                         0xbd, 0x6, 0x9e, 0xdb, 0x5, 0xfc, 0x12, 0x6,
+                                                         0xfb, 0x9, 0xfb, 0xfe, 0xdf, 0x84, 0x5, 0x9e,
+                                                         0x9b, 0xbc, 0xc2, 0xdf, 0x1b, 0xe7, 0xbb, 0x4c,
+                                                         0x46, 0x23, 0x34, 0xfb, 0x3, 0x20, 0x50, 0x38,
+                                                         0xb8, 0xf7, 0x1, 0x93, 0x1f, 0xe, 0xf7, 0x5e,
+                                                         0x3a, 0xa, 0xe1, 0x16, 0xe4, 0x46, 0xa, 0xa2,
+                                                         0x8f, 0xa9, 0xba, 0x1b, 0xaa, 0xac, 0x82, 0x88,
+                                                         0x9a, 0x1f, 0x9b, 0xd8, 0x5, 0x8f, 0x77, 0x63,
+                                                         0x95, 0x68, 0x1b, 0xfb, 0x5, 0x78, 0x37, 0x46,
+                                                         0x79, 0x1f, 0x7e, 0x52, 0x5, 0x3a, 0x6, 0x7d,
+                                                         0x47, 0x5, 0xdc, 0x6, 0xf7, 0x35, 0xfc, 0x56,
+                                                         0x15, 0xe5, 0x6, 0xf7, 0x2c, 0xf9, 0x60, 0x5,
+                                                         0x32, 0x6, 0xe, 0xfb, 0x63, 0xd9, 0xf8, 0xda,
+                                                         0xd1, 0xf7, 0x17, 0xde, 0x1, 0x77, 0xfb, 0xa,
+                                                         0x15, 0x6b, 0x3e, 0x5, 0x7f, 0xc7, 0xb2, 0x8b,
+                                                         0x92, 0x1b, 0xdb, 0xca, 0xdc, 0xe4, 0xae, 0x1f,
+                                                         0xf7, 0x4d, 0xf8, 0x7e, 0x5, 0xf0, 0x6, 0xa7,
+                                                         0xd1, 0x5, 0x25, 0x6, 0xf3, 0xb6, 0x98, 0xa6,
+                                                         0xbb, 0x1b, 0xa0, 0x9c, 0x87, 0x82, 0xae, 0x1f,
+                                                         0xac, 0xd8, 0x5, 0x95, 0x6a, 0x6d, 0x94, 0x64,
+                                                         0x1b, 0xfb, 0x6, 0x67, 0x27, 0xfb, 0x6, 0x5b,
+                                                         0x1f, 0x27, 0x6, 0x71, 0x45, 0x5, 0xee, 0x6,
+                                                         0xfb, 0x48, 0xfc, 0x7d, 0x5, 0x64, 0x7b, 0x68,
+                                                         0x55, 0x60, 0x1b, 0x7b, 0x76, 0x8e, 0x93, 0x67,
+                                                         0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x48, 0xd9, 0xf7,
+                                                         0xc0, 0xf7, 0x2e, 0x1, 0xcb, 0xf7, 0x48, 0x15,
+                                                         0xf7, 0xd0, 0x6, 0x62, 0xfb, 0x48, 0x5, 0xeb,
+                                                         0x6, 0xb5, 0xf7, 0x48, 0x5, 0xf7, 0x1, 0x6,
+                                                         0x9e, 0xd9, 0x5, 0xfb, 0x2, 0x6, 0xf1, 0xf8,
+                                                         0x51, 0x5, 0x3d, 0x6, 0xfc, 0x46, 0xfc, 0x49,
+                                                         0x5, 0xe8, 0x83, 0x15, 0xf7, 0xb2, 0xf7, 0xb9,
+                                                         0x8d, 0x89, 0x48, 0xfb, 0xb7, 0x5, 0xe, 0xfb,
+                                                         0x17, 0x8d, 0x76, 0xf9, 0x66, 0x77, 0x1, 0xfb,
+                                                         0x3b, 0xf9, 0x20, 0x3, 0x23, 0x78, 0x15, 0xf8,
+                                                         0xde, 0xf9, 0x66, 0x5, 0x43, 0x6, 0xfc, 0xd8,
+                                                         0xfd, 0x66, 0x5, 0xe, 0xfb, 0x70, 0xd5, 0xf7,
+                                                         0x1f, 0xd5, 0xf8, 0x21, 0xd5, 0x7f, 0x77, 0x12,
+                                                         0x13, 0xd0, 0xb5, 0x54, 0x15, 0xfb, 0x30, 0xf7,
+                                                         0x36, 0x82, 0xc0, 0xf7, 0x57, 0xac, 0xf7, 0x2f,
+                                                         0xd6, 0x9b, 0x1e, 0xf7, 0x1, 0xf8, 0x98, 0x5,
+                                                         0x37, 0x6, 0x7b, 0x33, 0x4e, 0xa, 0x13, 0xe0,
+                                                         0xe0, 0x5c, 0x47, 0x9a, 0x5c, 0x1b, 0xfb, 0x28,
+                                                         0xfb, 0xe, 0xfb, 0x26, 0xfb, 0x33, 0xfb, 0x2b,
+                                                         0xe2, 0x32, 0xf4, 0xb5, 0xbf, 0x98, 0xc4, 0xc5,
+                                                         0x1f, 0x82, 0x56, 0x5, 0x2e, 0x7a, 0x61, 0x4c,
+                                                         0x22, 0x1b, 0x25, 0x81, 0xb9, 0xaf, 0x1f, 0xae,
+                                                         0xf7, 0xbd, 0x15, 0xd2, 0xc2, 0xf7, 0x34, 0xf7,
+                                                         0xf, 0xd9, 0xbd, 0x4b, 0x3d, 0x27, 0x4b, 0xfb,
+                                                         0x2f, 0xfb, 0x12, 0x31, 0x71, 0xe6, 0xd6, 0x1e,
+                                                         0xe, 0xf7, 0xcd, 0x7c, 0xd3, 0x64, 0x76, 0xf9,
+                                                         0x2b, 0xcf, 0x12, 0xf8, 0xb8, 0xef, 0x13, 0x70,
+                                                         0xce, 0x88, 0x15, 0xee, 0x6, 0xf7, 0x6, 0xf8,
+                                                         0x84, 0x5, 0xe5, 0xa0, 0xbb, 0xd8, 0xf6, 0x1b,
+                                                         0xe0, 0x81, 0x2a, 0x5a, 0x61, 0x1f, 0x53, 0x4b,
+                                                         0x6b, 0x62, 0x65, 0x1a, 0x66, 0xa7, 0x68, 0xc6,
+                                                         0x59, 0x1e, 0xc0, 0x5c, 0x9c, 0x79, 0x6f, 0x1a,
+                                                         0x13, 0xb0, 0x5d, 0x56, 0x56, 0x4b, 0x4e, 0x6b,
+                                                         0xc4, 0xa6, 0x7c, 0x1e, 0x38, 0x62, 0x5, 0x23,
+                                                         0xd0, 0xd7, 0x80, 0xba, 0x1b, 0xf7, 0x8, 0xef,
+                                                         0xda, 0xe7, 0xc1, 0x6e, 0xa5, 0x4a, 0xc8, 0x1f,
+                                                         0x5f, 0xb4, 0x79, 0xa2, 0xa2, 0x1a, 0xa2, 0xa2,
+                                                         0xa5, 0xb3, 0xb9, 0x1e, 0xec, 0xdf, 0x7f, 0xf7,
+                                                         0x2c, 0xfb, 0x46, 0x1b, 0xfb, 0x3d, 0x3b, 0xfb,
+                                                         0x1, 0xfb, 0x12, 0x6d, 0x1f, 0xe, 0x53, 0xa,
+                                                         0xf7, 0x9f, 0xf8, 0xe5, 0x56, 0xa, 0x6d, 0xa,
+                                                         0xfb, 0x1, 0x6, 0xe, 0xf7, 0xb2, 0xbc, 0x76,
+                                                         0xf8, 0x60, 0x77, 0x1, 0xf7, 0x16, 0xf8, 0x71,
+                                                         0x3, 0xf7, 0xc, 0x96, 0x15, 0xf8, 0x71, 0xf7,
+                                                         0x5c, 0x5, 0xde, 0x7, 0xfc, 0x71, 0xf7, 0x5d,
+                                                         0x5, 0x34, 0x7, 0xf8, 0x0, 0xfb, 0x2f, 0xfc,
+                                                         0x0, 0xfb, 0x2f, 0x5, 0xe, 0x49, 0xa, 0xf8,
+                                                         0x2c, 0xf7, 0x17, 0x15, 0xc6, 0x6, 0x45, 0xf7,
+                                                         0x64, 0xf7, 0x31, 0xf7, 0x5d, 0x5, 0x4a, 0x6,
+                                                         0xfb, 0x3f, 0xfb, 0x5d, 0x5, 0x39, 0xfb, 0x64,
+                                                         0x15, 0xc7, 0x6, 0x45, 0xf7, 0x64, 0xf7, 0x30,
+                                                         0xf7, 0x5d, 0x5, 0x4b, 0x6, 0xfb, 0x40, 0xfb,
+                                                         0x5d, 0x5, 0xe, 0x49, 0xa, 0xf7, 0xc, 0xf7,
+                                                         0x17, 0x15, 0xcc, 0x6, 0xf7, 0x3f, 0xf7, 0x5d,
+                                                         0x31, 0xf7, 0x64, 0x5, 0x51, 0x6, 0xd0, 0xfb,
+                                                         0x64, 0x5, 0x9a, 0xfb, 0x5d, 0x15, 0xcb, 0x6,
+                                                         0xf7, 0x40, 0xf7, 0x5d, 0x31, 0xf7, 0x64, 0x5,
+                                                         0x50, 0x6, 0xd0, 0xfb, 0x64, 0x5, 0xe, 0xbf,
+                                                         0x49, 0xa, 0xf7, 0x75, 0xf7, 0x17, 0x15, 0xc0,
+                                                         0x6, 0x4c, 0xf7, 0x60, 0xf7, 0x22, 0xf7, 0x61,
+                                                         0x5, 0x51, 0x6, 0xfb, 0x2f, 0xfb, 0x61, 0x5,
+                                                         0xe, 0xae, 0xf7, 0x2b, 0x76, 0xf8, 0x29, 0x77,
+                                                         0x1, 0xf7, 0x9, 0xf7, 0x16, 0x15, 0xc5, 0x6,
+                                                         0xf7, 0x2f, 0xf7, 0x55, 0x39, 0xf7, 0x68, 0x5,
+                                                         0x57, 0x6, 0xc8, 0xfb, 0x68, 0x5, 0xe, 0xa0,
+                                                         0x76, 0xf8, 0x5f, 0xd3, 0xf7, 0x4f, 0x77, 0x1,
+                                                         0xcc, 0x16, 0xe7, 0x6, 0xba, 0xf7, 0x73, 0x94,
+                                                         0xb5, 0x9c, 0xd6, 0xad, 0xb8, 0x19, 0xb4, 0xac,
+                                                         0xc0, 0xac, 0xcc, 0x1b, 0xeb, 0x71, 0x2f, 0x4f,
+                                                         0x7d, 0x1f, 0x47, 0xfb, 0xc7, 0x5, 0xe7, 0x6,
+                                                         0xcd, 0xf7, 0xc7, 0x5, 0x91, 0xac, 0x91, 0xaf,
+                                                         0xad, 0x1a, 0xcc, 0x6c, 0xc3, 0x22, 0x34, 0x4f,
+                                                         0x56, 0x69, 0x65, 0x1e, 0xc5, 0xf7, 0xa6, 0x3e,
+                                                         0xa, 0x53, 0xa, 0xf7, 0x31, 0xf8, 0xe5, 0x4f,
+                                                         0xa, 0xdd, 0xfb, 0x21, 0x4f, 0xa, 0xe, 0xae,
+                                                         0xf7, 0x7c, 0xe5, 0x1, 0xe8, 0xf7, 0x9c, 0x3,
+                                                         0xe8, 0xf7, 0x7c, 0x15, 0xf7, 0x8b, 0x6, 0x9c,
+                                                         0xe5, 0x5, 0xfb, 0x8b, 0x6, 0xe, 0x3f, 0xa0,
+                                                         0x76, 0xf8, 0x99, 0x77, 0xf7, 0xe, 0xee, 0x1,
+                                                         0xce, 0x16, 0xe4, 0x6, 0xf7, 0x2, 0xf8, 0x99,
+                                                         0x3f, 0xa, 0xa0, 0xf1, 0x15, 0xe5, 0x6, 0xa0,
+                                                         0xee, 0x3e, 0xa, 0x52, 0xa, 0xf7, 0x77, 0x77,
+                                                         0x1, 0xf7, 0x45, 0xf8, 0xe8, 0x6e, 0xa, 0xf7,
+                                                         0x34, 0xf7, 0x1e, 0x5, 0xfb, 0x1e, 0x6, 0xfb,
+                                                         0x57, 0xfd, 0x72, 0x15, 0x38, 0xa, 0xe, 0x52,
+                                                         0xa, 0xe4, 0xf7, 0x1e, 0x1, 0xf7, 0x2, 0xf8,
+                                                         0xe8, 0x15, 0xea, 0x6, 0xdf, 0xe4, 0xb3, 0x32,
+                                                         0x5, 0xdd, 0x6, 0x4b, 0xf7, 0x1e, 0x5, 0x26,
+                                                         0x6, 0xfb, 0x2b, 0xfd, 0x72, 0x15, 0x38, 0xa,
+                                                         0xe, 0x5c, 0xa, 0xf8, 0xf1, 0xf0, 0x1, 0xf7,
+                                                         0xc4, 0xf8, 0xf1, 0x6e, 0xa, 0xa0, 0xf0, 0x45,
+                                                         0xa, 0xfb, 0x5c, 0x26, 0x6e, 0xa, 0xa0, 0xf0,
+                                                         0x45, 0xa, 0x58, 0xfd, 0x56, 0x15, 0x38, 0xa,
+                                                         0xe, 0x52, 0xa, 0xf7, 0x77, 0x77, 0x1, 0xea,
+                                                         0x16, 0x38, 0xa, 0xb8, 0xd0, 0x15, 0xcd, 0x6,
+                                                         0x54, 0xf7, 0x1e, 0x5, 0x25, 0x6, 0xe, 0x3f,
+                                                         0xfb, 0x51, 0x76, 0xf9, 0x6b, 0x77, 0xf7, 0xe,
+                                                         0xee, 0x1, 0x5d, 0xfb, 0xd, 0x15, 0x7d, 0x3f,
+                                                         0x5, 0x7e, 0xba, 0xa5, 0x8b, 0x92, 0x1b, 0xe7,
+                                                         0xab, 0xf7, 0x10, 0xdf, 0x9c, 0x1f, 0xf7, 0x0,
+                                                         0xf8, 0x9b, 0x5, 0x36, 0x6, 0x24, 0xfc, 0x9b,
+                                                         0x72, 0xfb, 0x11, 0x78, 0x7a, 0x38, 0xa2, 0x19,
+                                                         0xf7, 0x8d, 0xf9, 0x78, 0x15, 0xe0, 0x6, 0x9f,
+                                                         0xee, 0x5, 0x36, 0x6, 0xe, 0xf7, 0x5e, 0x2d,
+                                                         0xa, 0xce, 0x16, 0xe5, 0x6, 0xb1, 0xf7, 0x42,
+                                                         0xf7, 0x2, 0xe9, 0xf4, 0xfb, 0xa0, 0x5, 0xef,
+                                                         0x6, 0xfb, 0x1e, 0xf7, 0xdb, 0xf7, 0x78, 0xf7,
+                                                         0x57, 0x5, 0xfb, 0xc, 0x6, 0xfb, 0x9a, 0xfb,
+                                                         0x8c, 0x89, 0x8d, 0xea, 0xf8, 0x4e, 0x3e, 0xa,
+                                                         0x3f, 0x2d, 0xa, 0xce, 0x16, 0xe5, 0x6, 0xf7,
+                                                         0x2b, 0xf9, 0x62, 0x5, 0x32, 0x6, 0xe, 0xf7,
+                                                         0xb2, 0xab, 0x76, 0xf8, 0x78, 0x77, 0x1, 0xe9,
+                                                         0xf7, 0x68, 0x15, 0xf8, 0x71, 0xfb, 0x5d, 0x5,
+                                                         0xe2, 0x7, 0xfc, 0x0, 0xf7, 0x2f, 0xf8, 0x0,
+                                                         0xf7, 0x2f, 0x5, 0xe2, 0x7, 0xfc, 0x71, 0xfb,
+                                                         0x5d, 0x5, 0xe, 0xf7, 0xb2, 0xf7, 0x15, 0x76,
+                                                         0xf7, 0x60, 0xd9, 0x1, 0xf5, 0xf7, 0xcc, 0x15,
+                                                         0xf8, 0x3b, 0x6, 0x5b, 0xfb, 0x60, 0x5, 0xdd,
+                                                         0x6, 0xcc, 0xf7, 0xae, 0x5, 0xfc, 0x8d, 0x6,
+                                                         0xe, 0x3f, 0x2d, 0xa, 0xc0, 0x16, 0xf1, 0x6,
+                                                         0xe0, 0xf7, 0xfb, 0xe4, 0xb4, 0x9d, 0xd8, 0x32,
+                                                         0x61, 0xcf, 0xf7, 0xaf, 0x5, 0x26, 0x6, 0x3b,
+                                                         0xfb, 0xe4, 0x34, 0x64, 0x7a, 0x3e, 0xe0, 0xb3,
+                                                         0x5, 0xe, 0xf8, 0xab, 0x60, 0xa, 0x13, 0xc0,
+                                                         0xcc, 0x16, 0xe5, 0x6, 0xbf, 0xf7, 0x8d, 0x5,
+                                                         0xe1, 0x9e, 0xbc, 0xf7, 0x16, 0xf7, 0xe, 0x1b,
+                                                         0xd2, 0x83, 0x42, 0x56, 0x7f, 0x1f, 0x41, 0xfb,
+                                                         0xe7, 0x5, 0xe4, 0x6, 0xc1, 0xf7, 0x94, 0x5,
+                                                         0xc9, 0x98, 0xb6, 0xf7, 0x27, 0xf7, 0x16, 0x1b,
+                                                         0xca, 0x91, 0x52, 0x46, 0x7d, 0x1f, 0x41, 0xfb,
+                                                         0xe7, 0x5, 0xe4, 0x6, 0xd3, 0xf7, 0xe7, 0x5,
+                                                         0x90, 0xa3, 0x8d, 0xa0, 0x9f, 0x1a, 0x13, 0xa0,
+                                                         0xdb, 0x5d, 0xc1, 0x38, 0x6c, 0x42, 0x83, 0x31,
+                                                         0x42, 0x1e, 0xdf, 0x78, 0x49, 0x99, 0x62, 0x1b,
+                                                         0x37, 0x59, 0x55, 0x61, 0x63, 0x1f, 0x13, 0xc0,
+                                                         0x9d, 0xdf, 0x5, 0x32, 0x6, 0xe, 0xae, 0xf9,
+                                                         0x7, 0xc4, 0x1, 0xf7, 0x23, 0xf9, 0x7, 0x15,
+                                                         0xf7, 0xca, 0x6, 0x9a, 0xc4, 0x5, 0xfb, 0xcb,
+                                                         0x6, 0xe, 0xf7, 0xb2, 0xf7, 0x6c, 0xd4, 0x1,
+                                                         0xe0, 0xf7, 0x6c, 0x15, 0xf8, 0x6e, 0x6, 0xba,
+                                                         0xd4, 0x5, 0xfc, 0x6e, 0x6, 0xe, 0xfb, 0x4e,
+                                                         0x76, 0xf7, 0x5f, 0xcb, 0x54, 0x76, 0xf8, 0xaf,
+                                                         0x77, 0x12, 0x13, 0xb0, 0xf7, 0x39, 0xb9, 0x15,
+                                                         0x76, 0x9d, 0xac, 0x62, 0xce, 0x1b, 0xcc, 0xb5,
+                                                         0xac, 0xa0, 0xa2, 0x1f, 0x8d, 0x89, 0x5, 0x13,
+                                                         0xd0, 0x83, 0x63, 0x5, 0xde, 0x6, 0xf7, 0x2,
+                                                         0xf8, 0xa3, 0x5, 0x32, 0x6, 0x4f, 0xfb, 0xae,
+                                                         0x5, 0x37, 0x78, 0x68, 0x2a, 0x23, 0x1b, 0xfb,
+                                                         0x0, 0x8d, 0xe3, 0xe8, 0xa0, 0x1f, 0x8c, 0x91,
+                                                         0x90, 0xa4, 0xc0, 0xf7, 0x8f, 0x8, 0x31, 0x6,
+                                                         0xfb, 0x2d, 0xfd, 0x6e, 0x5, 0xe2, 0x6, 0xe,
+                                                         0xf7, 0xb2, 0xa0, 0x76, 0xf8, 0x8e, 0x77, 0x1,
+                                                         0xbd, 0xd2, 0x15, 0xc2, 0x44, 0xf7, 0x81, 0xf7,
+                                                         0x52, 0xf7, 0x22, 0xfb, 0x52, 0xd8, 0xce, 0xfb,
+                                                         0x22, 0xf7, 0x51, 0xf7, 0x73, 0xf7, 0x47, 0x55,
+                                                         0xd1, 0xfb, 0x74, 0xfb, 0x46, 0xfb, 0x23, 0xf7,
+                                                         0x47, 0x3e, 0x4e, 0xf7, 0x23, 0xfb, 0x48, 0x5,
+                                                         0xe, 0x60, 0xa, 0x13, 0xa0, 0xcc, 0x16, 0xe7,
+                                                         0x6, 0xbf, 0xf7, 0x89, 0x5, 0xd5, 0x9a, 0xc6,
+                                                         0xf7, 0x26, 0xf7, 0x18, 0x1b, 0xd9, 0x8b, 0x3d,
+                                                         0x47, 0x7b, 0x1f, 0x43, 0xfb, 0xd3, 0x5, 0xe7,
+                                                         0x6, 0xcf, 0xf7, 0xd3, 0x5, 0x90, 0xa1, 0x8e,
+                                                         0xa0, 0x9e, 0x1a, 0xe4, 0x5e, 0xcf, 0x31, 0x2e,
+                                                         0x44, 0x44, 0x6a, 0x6c, 0x1e, 0x89, 0x8d, 0x5,
+                                                         0x13, 0xc0, 0x9f, 0xe5, 0x5, 0x38, 0x6, 0xe,
+                                                         0x78, 0xd4, 0x42, 0xf7, 0x47, 0xf8, 0x6e, 0xd0,
+                                                         0x1, 0xf7, 0x9, 0xe6, 0xf7, 0xa9, 0xec, 0x3,
+                                                         0xdd, 0xf7, 0x30, 0x15, 0x35, 0x93, 0xbc, 0x32,
+                                                         0xf7, 0x17, 0x1b, 0xf7, 0x97, 0xdb, 0xf7, 0xf3,
+                                                         0xf7, 0x24, 0xf7, 0x4e, 0xfb, 0x12, 0xb4, 0x26,
+                                                         0xfb, 0x30, 0xfb, 0x1, 0xfb, 0x1a, 0xfb, 0x25,
+                                                         0xfb, 0x1b, 0xeb, 0x48, 0xf7, 0x0, 0xd9, 0xc2,
+                                                         0xb3, 0x9f, 0xa3, 0x1f, 0x8d, 0x89, 0x5, 0x69,
+                                                         0x82, 0x4c, 0xfb, 0x54, 0xfb, 0x18, 0x1b, 0x46,
+                                                         0x70, 0xbc, 0xc8, 0x82, 0x1f, 0xb0, 0xf7, 0x98,
+                                                         0x15, 0xee, 0xdf, 0xf7, 0x3, 0xe3, 0xf4, 0xa6,
+                                                         0x34, 0x45, 0xfb, 0xe, 0x33, 0x4b, 0x37, 0x3d,
+                                                         0x55, 0xc0, 0xdb, 0x1e, 0xe, 0xa0, 0x76, 0xf9,
+                                                         0x21, 0xcd, 0x8e, 0x77, 0x12, 0xcc, 0xf8, 0xa3,
+                                                         0x13, 0xd0, 0xcc, 0x16, 0xe8, 0x6, 0xbf, 0xf7,
+                                                         0x88, 0x5, 0xf7, 0xf, 0xa7, 0xe3, 0xeb, 0xe8,
+                                                         0x1b, 0xd3, 0x90, 0x3d, 0x48, 0x7c, 0x1f, 0x42,
+                                                         0xfb, 0xd2, 0x5, 0xe9, 0x6, 0xcf, 0xf7, 0xd2,
+                                                         0x5, 0x91, 0xa5, 0x8d, 0xa4, 0xa2, 0x1a, 0xe0,
+                                                         0x5a, 0xc6, 0x34, 0x2d, 0x44, 0x44, 0x6b, 0x6b,
+                                                         0x1e, 0x89, 0x8d, 0x9f, 0xe4, 0x5, 0x37, 0x6,
+                                                         0xce, 0xe3, 0x15, 0xcb, 0x66, 0xa, 0xa5, 0x1b,
+                                                         0xa8, 0xa2, 0x80, 0x80, 0xa1, 0x1f, 0x81, 0xa0,
+                                                         0x9f, 0x81, 0xa3, 0x1b, 0xc8, 0xae, 0xc1, 0xc1,
+                                                         0x90, 0x1f, 0x4d, 0x6, 0x7d, 0x86, 0x85, 0x73,
+                                                         0x71, 0x1b, 0x7d, 0x75, 0x94, 0x95, 0x73, 0x1f,
+                                                         0x13, 0xa0, 0x96, 0x70, 0x6e, 0x96, 0x70, 0x1b,
+                                                         0x45, 0x79, 0x57, 0x51, 0x7b, 0x1f, 0xe, 0x8c,
+                                                         0x76, 0xf7, 0x69, 0xd5, 0xf7, 0x55, 0xd4, 0xf7,
+                                                         0x60, 0x77, 0x1, 0xf7, 0x7, 0x66, 0x15, 0xd8,
+                                                         0x6, 0xb7, 0xf7, 0x69, 0x5, 0xf7, 0x34, 0x6,
+                                                         0x5f, 0xfb, 0x69, 0x5, 0xd8, 0x6, 0xb7, 0xf7,
+                                                         0x69, 0x5, 0xf7, 0x32, 0xd5, 0xfb, 0x23, 0x6,
+                                                         0xb1, 0xf7, 0x55, 0x5, 0xf4, 0xd4, 0x31, 0x6,
+                                                         0xb7, 0x58, 0xa, 0xfb, 0x33, 0x6, 0xb6, 0x58,
+                                                         0xa, 0xfb, 0x2e, 0x42, 0xf7, 0x20, 0x6, 0x64,
+                                                         0xfb, 0x55, 0x5, 0x26, 0x41, 0xe2, 0x6, 0xe6,
+                                                         0xd5, 0x15, 0xb1, 0xf7, 0x55, 0x5, 0xf7, 0x35,
+                                                         0x6, 0x64, 0xfb, 0x55, 0x5, 0xe, 0x7d, 0xd1,
+                                                         0xf8, 0x30, 0xd1, 0x1, 0xed, 0xe5, 0xf7, 0xb6,
+                                                         0xe5, 0x3, 0xde, 0xf7, 0x67, 0x15, 0xfb, 0x24,
+                                                         0xf1, 0x3a, 0xf7, 0x6, 0xf7, 0x30, 0xf7, 0x16,
+                                                         0xf7, 0x1b, 0xf7, 0x5a, 0xf7, 0x1f, 0x33, 0xdb,
+                                                         0xfb, 0x12, 0xfb, 0x4c, 0x23, 0xfb, 0x26, 0xfb,
+                                                         0x49, 0x1e, 0xe5, 0x16, 0xf7, 0x5, 0xcb, 0xf7,
+                                                         0x24, 0xf7, 0x17, 0xe1, 0xb4, 0x48, 0x3a, 0xfb,
+                                                         0x5, 0x43, 0xfb, 0x2b, 0xfb, 0xf, 0x6e, 0x29,
+                                                         0x98, 0xf7, 0x22, 0x1e, 0xe, 0x7d, 0xd1, 0xf9,
+                                                         0x3a, 0x77, 0x1, 0xe8, 0xe5, 0xf7, 0xc2, 0xe5,
+                                                         0x3, 0xf7, 0xd3, 0xf8, 0xe7, 0x15, 0xd6, 0x6,
+                                                         0xf7, 0x19, 0x6f, 0xa, 0xfb, 0x7, 0x6, 0xfb,
+                                                         0xdd, 0x29, 0xa, 0x7d, 0xd1, 0xf8, 0xaf, 0xf7,
+                                                         0x1f, 0x1, 0xe8, 0xe5, 0xf7, 0xbd, 0xe5, 0x3,
+                                                         0xf7, 0x8c, 0xf8, 0xe7, 0x15, 0xe8, 0x6, 0xdc,
+                                                         0xe5, 0xb3, 0x31, 0x5, 0xdb, 0x6, 0x4d, 0x6f,
+                                                         0xa, 0x28, 0x6, 0xfb, 0xbe, 0x29, 0xa, 0x7d,
+                                                         0xd0, 0xf8, 0xba, 0xf0, 0x1, 0xe8, 0xe5, 0xf7,
+                                                         0xb8, 0xe5, 0x3, 0xde, 0xf7, 0x64, 0x24, 0xa,
+                                                         0xf7, 0xa7, 0xf8, 0x21, 0x15, 0xe9, 0x6, 0xa1,
+                                                         0xf0, 0x4d, 0xa, 0xfb, 0x61, 0x26, 0x15, 0xe9,
+                                                         0x6, 0xa0, 0xf0, 0x5, 0x2d, 0x6, 0xe, 0xf9,
+                                                         0x1a, 0x7c, 0xd4, 0x42, 0xf7, 0x4f, 0xcd, 0xd0,
+                                                         0xf7, 0x36, 0xd0, 0x1, 0xde, 0xe4, 0xf9, 0x53,
+                                                         0xe4, 0x3, 0xf8, 0x8b, 0xe3, 0x15, 0x40, 0xb3,
+                                                         0xd0, 0x6f, 0xd3, 0x1b, 0xf7, 0x11, 0xe1, 0xed,
+                                                         0xe0, 0xb0, 0x1f, 0x2d, 0x94, 0x5, 0x61, 0x79,
+                                                         0x54, 0x3e, 0x3b, 0x1b, 0xfb, 0x2, 0x7d, 0xf7,
+                                                         0xe, 0xc5, 0x93, 0x1f, 0xf8, 0x16, 0x6, 0x8f,
+                                                         0x9e, 0x90, 0xb1, 0xa4, 0x1a, 0xf7, 0x13, 0x3a,
+                                                         0xe6, 0xfb, 0x14, 0xfb, 0x0, 0x53, 0x52, 0x61,
+                                                         0x63, 0x1e, 0xee, 0x53, 0xfb, 0x0, 0x8b, 0x75,
+                                                         0x1b, 0xfb, 0x52, 0x2f, 0xfb, 0x43, 0xfb, 0x32,
+                                                         0xfb, 0x32, 0xf1, 0x4d, 0xf7, 0x0, 0xf7, 0xc,
+                                                         0xc8, 0xd1, 0xac, 0xa8, 0x1f, 0xfb, 0xdf, 0xf7,
+                                                         0x9, 0x15, 0xdd, 0xbb, 0xf7, 0x4a, 0xf7, 0x26,
+                                                         0xea, 0xa7, 0x32, 0x56, 0xfb, 0x1, 0x4b, 0xfb,
+                                                         0x38, 0xfb, 0x17, 0xfb, 0xe, 0x8b, 0xf7, 0xf,
+                                                         0xa7, 0x1e, 0xf8, 0x2f, 0xf1, 0x15, 0xf7, 0x17,
+                                                         0xb7, 0xdb, 0xaa, 0xbc, 0x1b, 0xa0, 0xf7, 0x4,
+                                                         0x87, 0xfb, 0x32, 0x7d, 0x1f, 0xe, 0xae, 0xfb,
+                                                         0x60, 0x76, 0xf7, 0x75, 0x77, 0x1, 0xb6, 0xc9,
+                                                         0x3, 0xda, 0x16, 0x75, 0x5d, 0x7d, 0x5a, 0x64,
+                                                         0x1a, 0x6e, 0x93, 0x4d, 0xdb, 0xbb, 0xb2, 0x9c,
+                                                         0x96, 0x9e, 0x1e, 0x97, 0xc7, 0x5, 0x7c, 0x66,
+                                                         0x70, 0x83, 0x74, 0x1b, 0x81, 0x5c, 0x91, 0xc1,
+                                                         0xae, 0xa1, 0xbd, 0x91, 0x9a, 0x1f, 0xe, 0x7d,
+                                                         0xd1, 0x1, 0xf2, 0xe5, 0xf7, 0xb8, 0xe5, 0x3,
+                                                         0xf8, 0x1c, 0xf8, 0xe7, 0x56, 0xa, 0x6f, 0xa,
+                                                         0xfb, 0x1, 0x6, 0xfb, 0x68, 0x29, 0xa, 0xa0,
+                                                         0x76, 0xf8, 0xa4, 0xf7, 0x43, 0x1, 0xf7, 0x63,
+                                                         0xf7, 0xc1, 0x3, 0xf7, 0xb7, 0x16, 0xdb, 0x6,
+                                                         0xf7, 0x1d, 0xf9, 0x53, 0x5, 0x5c, 0x6, 0x5a,
+                                                         0x35, 0xfb, 0x18, 0x40, 0x51, 0x72, 0x7c, 0x3d,
+                                                         0x18, 0xbd, 0x99, 0xdd, 0xa9, 0xbf, 0xba, 0x8d,
+                                                         0x89, 0x18, 0xe, 0xf8, 0xac, 0x80, 0xc4, 0x5f,
+                                                         0x76, 0xf7, 0xc5, 0xc3, 0xf7, 0xfc, 0x77, 0xa0,
+                                                         0x77, 0x12, 0xf9, 0x92, 0xd1, 0x13, 0x6c, 0xf7,
+                                                         0x6, 0x78, 0x15, 0xd5, 0x6, 0xf9, 0x1f, 0xf9,
+                                                         0x66, 0x5, 0x3a, 0x6, 0x13, 0xb4, 0xfb, 0x7d,
+                                                         0xfd, 0x5e, 0x15, 0xf7, 0xa7, 0x6, 0x96, 0xc4,
+                                                         0x5, 0xfb, 0x43, 0x6, 0x9d, 0xa2, 0xa0, 0x97,
+                                                         0xca, 0xb2, 0x8, 0xc1, 0xac, 0xb7, 0xa9, 0xc5,
+                                                         0x1a, 0xba, 0x6b, 0xc1, 0x2a, 0x3c, 0x5a, 0x6a,
+                                                         0x44, 0x78, 0x1e, 0xd1, 0x85, 0x5, 0xb3, 0x98,
+                                                         0xa4, 0x99, 0xb4, 0x1b, 0xb3, 0x9c, 0x74, 0x75,
+                                                         0x6b, 0x72, 0x7d, 0x5a, 0x6e, 0x1f, 0xfb, 0xf,
+                                                         0x44, 0x6f, 0x55, 0x7b, 0x57, 0x8, 0xfb, 0xaa,
+                                                         0xf7, 0xfd, 0x15, 0xd1, 0x6, 0xd4, 0xf7, 0xf4,
+                                                         0x5, 0x57, 0x6, 0x5d, 0x53, 0x3c, 0x6f, 0x79,
+                                                         0x85, 0x7e, 0x50, 0x18, 0xa8, 0x90, 0xb7, 0x96,
+                                                         0xb7, 0xab, 0x8, 0xe, 0x65, 0xa, 0xf8, 0xe0,
+                                                         0x77, 0xa0, 0x77, 0x12, 0x13, 0x68, 0xf8, 0x6a,
+                                                         0xc7, 0x15, 0xf7, 0x36, 0x6, 0x7e, 0x44, 0x5,
+                                                         0xc6, 0x6, 0x99, 0xd2, 0x5, 0xb4, 0x6, 0x13,
+                                                         0xa8, 0x96, 0xc1, 0x5, 0x61, 0x6, 0xb5, 0xf7,
+                                                         0x77, 0x5, 0x59, 0x6, 0xfb, 0x6a, 0xfb, 0x74,
+                                                         0x5, 0xd0, 0x88, 0x15, 0xf7, 0xb, 0xf7, 0xf,
+                                                         0x70, 0xfb, 0xf, 0x5, 0xfc, 0x7f, 0xfb, 0x19,
+                                                         0x15, 0xce, 0x6, 0xf8, 0xdd, 0xf9, 0x66, 0x5,
+                                                         0x42, 0x6, 0xfc, 0x74, 0xfb, 0xf5, 0x15, 0xcb,
+                                                         0x6, 0x13, 0x70, 0xcc, 0xf7, 0xf4, 0x5, 0x5c,
+                                                         0x6, 0x64, 0x55, 0x41, 0x6c, 0x7b, 0x86, 0x80,
+                                                         0x4f, 0x18, 0xa5, 0x91, 0xb2, 0x95, 0xb3, 0xab,
+                                                         0x8, 0xe, 0xae, 0xf7, 0xc2, 0x76, 0xf8, 0x3a,
+                                                         0x77, 0x1, 0xf7, 0x7a, 0xf7, 0xad, 0x15, 0xd1,
+                                                         0x6, 0xd2, 0xf8, 0x3a, 0x5, 0x58, 0x6, 0x5d,
+                                                         0x48, 0x3d, 0x6b, 0x79, 0x84, 0x7f, 0x43, 0x18,
+                                                         0xa7, 0x92, 0xb6, 0x98, 0xb8, 0xb1, 0x8, 0xe,
+                                                         0xd3, 0xf7, 0xd1, 0x77, 0xa7, 0x76, 0xf7, 0x4d,
+                                                         0xd0, 0xf7, 0x47, 0x77, 0x12, 0xef, 0xd6, 0x13,
+                                                         0xb8, 0xf7, 0xee, 0xf7, 0xd1, 0x15, 0xd3, 0x6,
+                                                         0x84, 0x97, 0x88, 0x95, 0xac, 0x1a, 0x99, 0x89,
+                                                         0x9d, 0xa0, 0xda, 0x1e, 0x96, 0xb4, 0x95, 0xb5,
+                                                         0xb2, 0x1a, 0xd6, 0x6d, 0xc4, 0xfb, 0x4, 0xfb,
+                                                         0xa, 0x63, 0x30, 0x69, 0x7e, 0x1e, 0xd6, 0x7d,
+                                                         0x5, 0xd0, 0xa6, 0xc4, 0x8c, 0x96, 0x1b, 0xad,
+                                                         0xb1, 0x76, 0x63, 0x81, 0x89, 0x7f, 0x86, 0x7c,
+                                                         0x1f, 0x6b, 0x84, 0x7b, 0x87, 0x5f, 0x8a, 0x8,
+                                                         0x53, 0x88, 0xfb, 0xe, 0x82, 0xfb, 0x11, 0x1a,
+                                                         0x13, 0x78, 0x63, 0xa4, 0x3e, 0xe7, 0xc2, 0xbc,
+                                                         0xab, 0x9d, 0x9d, 0x1e, 0x13, 0xb8, 0x8f, 0x74,
+                                                         0x8b, 0x88, 0x8e, 0x80, 0x8, 0x95, 0xf7, 0x50,
+                                                         0x15, 0xfb, 0x16, 0x71, 0x3a, 0x89, 0x7a, 0x1b,
+                                                         0x79, 0x64, 0x97, 0xb6, 0xb9, 0xbb, 0x95, 0xab,
+                                                         0x90, 0x1f, 0xc9, 0x90, 0x94, 0x8e, 0xa9, 0x93,
+                                                         0x8, 0xe, 0xce, 0xf7, 0xc4, 0xd7, 0xf7, 0xad,
+                                                         0xd7, 0x1, 0xef, 0xd8, 0xf7, 0x6a, 0xd8, 0x3,
+                                                         0xef, 0xf8, 0x84, 0x15, 0x27, 0xa9, 0x2f, 0xf7,
+                                                         0x18, 0xf7, 0x10, 0xdd, 0xf7, 0x22, 0xf7, 0x6,
+                                                         0xe7, 0x53, 0xe0, 0xfb, 0x1, 0xfb, 0x23, 0x4f,
+                                                         0xfb, 0x2f, 0x35, 0x1e, 0xd8, 0x8d, 0x15, 0xbe,
+                                                         0xb4, 0xf7, 0x4, 0xe0, 0xbe, 0xb0, 0x61, 0x50,
+                                                         0x3c, 0x5b, 0x26, 0x3a, 0x4e, 0x73, 0xbe, 0xce,
+                                                         0x1e, 0xe, 0xf7, 0xcd, 0x9b, 0xca, 0xf8, 0x2,
+                                                         0xca, 0x1, 0xbc, 0xd6, 0xf7, 0xf0, 0xd8, 0x3,
+                                                         0xb8, 0x94, 0x15, 0xb8, 0x6c, 0xc4, 0xcb, 0x5,
+                                                         0x80, 0x9f, 0xb5, 0x79, 0xca, 0x1b, 0xf7, 0x37,
+                                                         0xf7, 0xb, 0xf7, 0x13, 0xf7, 0x3d, 0xc4, 0x80,
+                                                         0xb9, 0x6e, 0xae, 0x1f, 0xc6, 0xcd, 0x5e, 0xab,
+                                                         0x51, 0x4b, 0x5, 0x93, 0x7e, 0x63, 0xa2, 0x43,
+                                                         0x1b, 0xfb, 0x63, 0x41, 0xfb, 0x3d, 0xfb, 0x18,
+                                                         0x40, 0xa2, 0x67, 0x9b, 0x71, 0x1f, 0xc5, 0xca,
+                                                         0x15, 0x7e, 0xa2, 0x82, 0xa2, 0xa8, 0x1a, 0xec,
+                                                         0xcc, 0xf7, 0x20, 0xf7, 0x1d, 0xba, 0xa2, 0x7a,
+                                                         0x84, 0x93, 0x1e, 0xfb, 0x72, 0xfb, 0xdc, 0x15,
+                                                         0xf7, 0x97, 0xf7, 0xb1, 0x5, 0x90, 0x7c, 0x9b,
+                                                         0x78, 0x64, 0x1a, 0x24, 0x3b, 0xfb, 0x16, 0xfb,
+                                                         0x11, 0x6e, 0x72, 0x93, 0x98, 0x76, 0x1e, 0xe,
+                                                         0x7d, 0xd0, 0xf8, 0x15, 0xcf, 0xf2, 0xf7, 0x0,
+                                                         0x49, 0xcd, 0x8e, 0x77, 0x12, 0xe5, 0xe8, 0xf7,
+                                                         0xb8, 0xe8, 0x13, 0xe6, 0xf7, 0x8b, 0xf8, 0xf7,
+                                                         0x15, 0xcb, 0x6, 0x13, 0xd6, 0xa4, 0x91, 0x96,
+                                                         0x9c, 0xa5, 0x1b, 0xad, 0xa1, 0x7d, 0x7f, 0xa3,
+                                                         0x1f, 0x82, 0x9d, 0x9e, 0x83, 0xa2, 0x1b, 0xc8,
+                                                         0xae, 0xc2, 0xc1, 0x91, 0x1f, 0x4c, 0x69, 0xa,
+                                                         0x70, 0x1b, 0x7c, 0x78, 0x96, 0x95, 0x73, 0x1f,
+                                                         0x13, 0xce, 0x96, 0x73, 0x6e, 0x95, 0x69, 0x1b,
+                                                         0x13, 0xe6, 0x45, 0x79, 0x57, 0x50, 0x7b, 0x1f,
+                                                         0xfb, 0x38, 0xfc, 0x27, 0x24, 0xa, 0xe, 0xfb,
+                                                         0x4e, 0x76, 0xf7, 0x53, 0xd5, 0xf8, 0x2a, 0xc9,
+                                                         0x4d, 0xd5, 0x12, 0xf8, 0x80, 0xe7, 0x13, 0xd8,
+                                                         0xf7, 0x3b, 0xdd, 0x15, 0x4b, 0xad, 0xbb, 0x69,
+                                                         0xd0, 0x1b, 0xf7, 0x1c, 0xf7, 0x16, 0xf7, 0x25,
+                                                         0xf7, 0x53, 0xf7, 0x21, 0x3c, 0xd8, 0x26, 0x45,
+                                                         0x5c, 0x65, 0x5d, 0x5c, 0x1f, 0x13, 0xe8, 0x9b,
+                                                         0xd3, 0x5, 0x35, 0x6, 0xfb, 0x30, 0xfd, 0x71,
+                                                         0x5, 0xe7, 0x6, 0xe5, 0xf8, 0x38, 0x15, 0xe0,
+                                                         0xcb, 0xf7, 0x3a, 0xf7, 0x9, 0xda, 0xaf, 0x43,
+                                                         0x43, 0x3e, 0x5c, 0xfb, 0x4d, 0xfb, 0x17, 0x31,
+                                                         0x6f, 0xda, 0xd7, 0x1e, 0xe, 0xf7, 0x83, 0xfb,
+                                                         0x2c, 0x76, 0xf9, 0xc0, 0xda, 0x1, 0xf7, 0xd2,
+                                                         0xfb, 0x41, 0x15, 0xd9, 0xf9, 0xc0, 0xf6, 0xfd,
+                                                         0xc0, 0xda, 0xf9, 0xc0, 0xcf, 0xda, 0xfb, 0xc0,
+                                                         0x6, 0xfb, 0xb, 0x22, 0x47, 0xfb, 0x19, 0x29,
+                                                         0xd5, 0x2d, 0xf7, 0xa, 0x1f, 0xe, 0x61, 0xa,
+                                                         0xf7, 0x0, 0xe2, 0x3, 0xf7, 0x4d, 0xfb, 0x63,
+                                                         0x15, 0xcd, 0x6, 0x68, 0xf7, 0x0, 0x76, 0xf7,
+                                                         0x6, 0xf7, 0x5, 0x1a, 0xf7, 0xda, 0xf7, 0x74,
+                                                         0xf7, 0x85, 0xae, 0xb1, 0x1e, 0x46, 0x6, 0xfb,
+                                                         0x0, 0xfb, 0x12, 0xfb, 0x3d, 0xfb, 0x4b, 0xfb,
+                                                         0xbc, 0x1a, 0xfb, 0x5, 0xa6, 0xfb, 0x5, 0xbd,
+                                                         0xfb, 0x1, 0x1e, 0xe, 0x61, 0xa, 0xf7, 0x8e,
+                                                         0xe2, 0x3, 0x82, 0xfb, 0x63, 0x15, 0xd0, 0x6,
+                                                         0xf7, 0x0, 0xf7, 0x12, 0xf7, 0x3d, 0xf7, 0x42,
+                                                         0xf7, 0xbc, 0x1a, 0xf7, 0x5, 0x70, 0xf7, 0xe,
+                                                         0x59, 0xf7, 0x1, 0x1e, 0x49, 0x6, 0xae, 0xfb,
+                                                         0x0, 0xa0, 0xfb, 0xf, 0xfb, 0x5, 0x1a, 0xfb,
+                                                         0xda, 0xfb, 0x74, 0xfb, 0x7c, 0x68, 0x65, 0x1e,
+                                                         0xe, 0xf8, 0xe3, 0x78, 0xc3, 0xf7, 0x89, 0xc7,
+                                                         0x86, 0xc4, 0xf7, 0x8a, 0xc4, 0x91, 0x77, 0x12,
+                                                         0xf7, 0x27, 0xd8, 0xf7, 0x3d, 0xd7, 0xee, 0xd7,
+                                                         0xf7, 0x3c, 0xd8, 0x13, 0xd7, 0x80, 0xf8, 0xcc,
+                                                         0xf7, 0x2, 0x15, 0x68, 0x8b, 0x2d, 0xf7, 0x18,
+                                                         0xf7, 0x4f, 0x8d, 0xf7, 0x74, 0x91, 0xf7, 0x1,
+                                                         0x3f, 0xa1, 0x4b, 0x1e, 0xfb, 0x18, 0x5a, 0xfb,
+                                                         0x3c, 0x4b, 0x1f, 0xd7, 0x16, 0xae, 0x9f, 0xf7,
+                                                         0x1d, 0xe3, 0x96, 0xbc, 0x84, 0x4b, 0x7c, 0x80,
+                                                         0xfb, 0x33, 0x28, 0x1e, 0x13, 0x37, 0x0, 0x53,
+                                                         0x89, 0xbe, 0xa1, 0x1f, 0xfc, 0x85, 0xf7, 0xfd,
+                                                         0x15, 0x13, 0xb7, 0x80, 0x68, 0x8b, 0x28, 0xf7,
+                                                         0x18, 0xf7, 0x4f, 0x8e, 0xf7, 0x72, 0x92, 0xf7,
+                                                         0x1, 0x3f, 0xa1, 0x49, 0x1e, 0x13, 0x36, 0x0,
+                                                         0xfb, 0x16, 0x59, 0xfb, 0x36, 0x4b, 0x1f, 0xd8,
+                                                         0x16, 0xad, 0x9f, 0xf7, 0x1b, 0xe2, 0x9f, 0xb5,
+                                                         0x7a, 0x52, 0x7d, 0x80, 0xfb, 0x32, 0x26, 0x1e,
+                                                         0x13, 0x8c, 0x0, 0x54, 0x89, 0xc3, 0xa0, 0x1f,
+                                                         0x5f, 0xfc, 0x7e, 0x15, 0xde, 0x6, 0x13, 0xcf,
+                                                         0x80, 0xf8, 0xe7, 0xf9, 0x66, 0x5, 0x3a, 0x6,
+                                                         0xe, 0x77, 0x8b, 0xf5, 0x1, 0xe2, 0x16, 0xf4,
+                                                         0x6, 0xa1, 0xf5, 0x5, 0x22, 0x6, 0xe, 0x77,
+                                                         0xf7, 0x52, 0xf7, 0x11, 0x1, 0xf7, 0x15, 0xf7,
+                                                         0x52, 0x15, 0xf5, 0x6, 0xa1, 0xf7, 0x11, 0x5,
+                                                         0x21, 0x6, 0xe, 0xf9, 0x52, 0x78, 0xc3, 0xf7,
+                                                         0x8c, 0xc4, 0x8b, 0xc3, 0xf7, 0x8b, 0xc3, 0x8d,
+                                                         0x77, 0x12, 0xe3, 0xd3, 0xf7, 0x31, 0xd3, 0x8e,
+                                                         0xd3, 0x13, 0xf7, 0xf7, 0x34, 0xf8, 0x6b, 0x15,
+                                                         0x95, 0x9a, 0xf7, 0x38, 0xe4, 0xc0, 0x8b, 0x52,
+                                                         0x82, 0x67, 0x75, 0xfb, 0x25, 0x39, 0x56, 0x8b,
+                                                         0xbd, 0xa2, 0x1e, 0x64, 0xfc, 0x7e, 0x15, 0xd4,
+                                                         0x6, 0x13, 0xe8, 0xf8, 0x67, 0xf9, 0x66, 0x5,
+                                                         0x41, 0x6, 0xfc, 0x87, 0xfb, 0x7c, 0x5b, 0xa,
+                                                         0xf7, 0x53, 0xb9, 0x1e, 0x13, 0xf0, 0xd5, 0x5e,
+                                                         0xbb, 0x3d, 0xfb, 0x1a, 0x5f, 0xfb, 0x26, 0x37,
+                                                         0x1e, 0xf7, 0xc4, 0xfb, 0xfd, 0x5b, 0xa, 0xf7,
+                                                         0x51, 0xb9, 0xd6, 0x5e, 0xbb, 0x3d, 0xfb, 0x1a,
+                                                         0x5f, 0xfb, 0x25, 0x37, 0x1e, 0xd3, 0x16, 0x96,
+                                                         0x9a, 0xf7, 0x35, 0xe4, 0xc0, 0x8b, 0x53, 0x81,
+                                                         0x68, 0x75, 0xfb, 0x24, 0x39, 0x1e, 0x13, 0x81,
+                                                         0x56, 0x8b, 0xbd, 0xa2, 0x1f, 0xf7, 0x9d, 0x16,
+                                                         0x74, 0x8b, 0x21, 0xf7, 0x10, 0x1e, 0x13, 0x0,
+                                                         0xf7, 0x2e, 0xa1, 0xf7, 0x53, 0xb7, 0xd7, 0x5d,
+                                                         0xba, 0x3f, 0x1f, 0x13, 0x80, 0xfb, 0xe, 0x53,
+                                                         0xfb, 0x2b, 0x3d, 0x1f, 0xd3, 0x16, 0x96, 0x9a,
+                                                         0xf7, 0x35, 0xe4, 0xbf, 0x8b, 0x53, 0x81, 0x68,
+                                                         0x75, 0xfb, 0x24, 0x3a, 0x1e, 0x13, 0x0, 0x56,
+                                                         0x8b, 0xbd, 0xa2, 0x1f, 0xe, 0xf7, 0xb2, 0xf7,
+                                                         0x64, 0xe2, 0x1, 0xf7, 0xc0, 0xe6, 0x3, 0xe0,
+                                                         0xf7, 0x64, 0x15, 0xf7, 0x6b, 0xfb, 0x64, 0xe6,
+                                                         0xf7, 0x64, 0xf7, 0x6b, 0xe2, 0xfb, 0x6b, 0xf7,
+                                                         0x66, 0x30, 0xfb, 0x66, 0xfb, 0x6b, 0x6, 0xe,
+                                                         0xf7, 0xb2, 0x8b, 0xcf, 0xf7, 0x64, 0xcf, 0xf7,
+                                                         0x36, 0x77, 0x1, 0xf7, 0xa0, 0xf7, 0x6, 0x15,
+                                                         0xdd, 0x6, 0xbf, 0xf7, 0x36, 0x5, 0xf7, 0x55,
+                                                         0x6, 0xa2, 0xcf, 0x5, 0xfb, 0x55, 0x6, 0xbf,
+                                                         0xf7, 0x36, 0x5, 0x3a, 0x6, 0x57, 0xfb, 0x36,
+                                                         0x5, 0xfb, 0x56, 0x6, 0x75, 0x47, 0x5, 0xf7,
+                                                         0x55, 0x6, 0xfb, 0xae, 0xfb, 0xa8, 0x15, 0xf8,
+                                                         0x67, 0x6, 0xa1, 0xcf, 0x5, 0xfc, 0x66, 0x6,
+                                                         0xe, 0xfb, 0x4e, 0x76, 0xf7, 0x53, 0xd4, 0xf8,
+                                                         0x2c, 0xd4, 0x7f, 0x77, 0x12, 0xdf, 0xe7, 0x13,
+                                                         0xd8, 0xf8, 0x31, 0xc1, 0x15, 0x52, 0xfb, 0x99,
+                                                         0x5, 0xe8, 0x6, 0xf7, 0x30, 0xf9, 0x71, 0x5,
+                                                         0x3b, 0x6, 0x77, 0x2a, 0x5, 0x13, 0xe8, 0xf5,
+                                                         0x5b, 0x37, 0x8e, 0x74, 0x1b, 0xfb, 0x26, 0xfb,
+                                                         0xc, 0xfb, 0x1d, 0xfb, 0x52, 0xfb, 0x3c, 0xf4,
+                                                         0x50, 0xd4, 0xb3, 0xba, 0x99, 0xc3, 0xcb, 0x1f,
+                                                         0xfb, 0x81, 0xf7, 0x31, 0x15, 0xd1, 0xb7, 0xf7,
+                                                         0x4c, 0xf7, 0x16, 0xd2, 0xbd, 0x4f, 0x3c, 0xfb,
+                                                         0x4, 0x44, 0xfb, 0x31, 0xfb, 0x3, 0x43, 0x62,
+                                                         0xc1, 0xef, 0x1e, 0xe, 0x8b, 0xef, 0xf8, 0xbf,
+                                                         0xd3, 0x1, 0xf7, 0x86, 0xf3, 0x3, 0xf7, 0x89,
+                                                         0xf7, 0x47, 0x15, 0xe1, 0x6, 0x96, 0xc7, 0x95,
+                                                         0xa4, 0xea, 0xd4, 0x8, 0xe7, 0xd3, 0xd2, 0xc1,
+                                                         0xe5, 0x1a, 0xeb, 0x35, 0xd9, 0xfb, 0x14, 0xfb,
+                                                         0x28, 0x34, 0xfb, 0x9, 0x31, 0x1e, 0xe8, 0x7c,
+                                                         0x5, 0xb0, 0x90, 0x9a, 0xf7, 0x5, 0xf7, 0x10,
+                                                         0x1b, 0xd1, 0xbe, 0x5a, 0x56, 0x4c, 0x49, 0x5c,
+                                                         0x56, 0x61, 0x1f, 0x39, 0x4b, 0x4f, 0x5b, 0x7e,
+                                                         0xfb, 0x2, 0x8, 0x5d, 0xfb, 0x47, 0x15, 0xf3,
+                                                         0x6, 0xa1, 0xef, 0x5, 0x23, 0x6, 0xe, 0xf7,
+                                                         0xcd, 0xfb, 0x5d, 0xd3, 0xf8, 0x73, 0x77, 0xee,
+                                                         0xeb, 0x1, 0xe0, 0xe8, 0x3, 0xf8, 0x56, 0xa2,
+                                                         0x15, 0x86, 0x66, 0x61, 0xfb, 0x6, 0x24, 0x8a,
+                                                         0x8, 0x44, 0x8a, 0x58, 0xb8, 0xc0, 0x1a, 0xcb,
+                                                         0xcd, 0xc0, 0xc0, 0xb5, 0x1e, 0xde, 0xcb, 0xc8,
+                                                         0xbb, 0x98, 0xf7, 0x3, 0x8, 0x34, 0x6, 0x80,
+                                                         0x4e, 0x81, 0x72, 0x2b, 0x42, 0x8, 0x2e, 0x43,
+                                                         0x43, 0x4f, 0x30, 0x1a, 0x2b, 0xe2, 0x42, 0xf7,
+                                                         0x16, 0xf7, 0xd, 0xf7, 0x3, 0xf5, 0xf2, 0x1e,
+                                                         0xfb, 0x35, 0xf8, 0x39, 0x15, 0xf4, 0x6, 0xa1,
+                                                         0xeb, 0x5, 0x22, 0x6, 0xe, 0xc4, 0xf8, 0x78,
+                                                         0x44, 0xa, 0xf7, 0x3c, 0xf7, 0xa2, 0x3, 0xf7,
+                                                         0xd5, 0xf8, 0x63, 0x15, 0xbc, 0x6, 0xb8, 0xf7,
+                                                         0x1f, 0xa2, 0xf7, 0x8, 0x3f, 0xa, 0x74, 0xfb,
+                                                         0x8, 0x5, 0xfb, 0x31, 0xfb, 0x1f, 0x15, 0xbc,
+                                                         0x6, 0xb9, 0xf7, 0x1f, 0xa1, 0xf7, 0x8, 0x3f,
+                                                         0xa, 0x75, 0xfb, 0x8, 0x5, 0xe, 0xae, 0xfb,
+                                                         0x14, 0x76, 0xf7, 0x2a, 0xf4, 0x1, 0xa4, 0x8c,
+                                                         0x15, 0x37, 0xa, 0x83, 0x62, 0x18, 0x67, 0xa,
+                                                         0x93, 0xb0, 0x9d, 0xe6, 0x18, 0x22, 0x6, 0xf7,
+                                                         0x24, 0x22, 0x15, 0x62, 0xa, 0x83, 0x62, 0x18,
+                                                         0xf6, 0x3c, 0xa, 0x22, 0x6, 0xe, 0xae, 0xf8,
+                                                         0x6a, 0xf4, 0xf7, 0x2a, 0x77, 0x1, 0xf7, 0x1e,
+                                                         0xf4, 0x3, 0xf7, 0xc3, 0xf8, 0x6a, 0x33, 0xa,
+                                                         0xfb, 0x4c, 0x30, 0x33, 0xa, 0xe, 0xae, 0xf8,
+                                                         0x78, 0x76, 0xf7, 0x2a, 0xf4, 0x1, 0xf7, 0x10,
+                                                         0xf8, 0x63, 0x15, 0x67, 0xa, 0x93, 0xb0, 0x9d,
+                                                         0xe6, 0x18, 0x22, 0x6, 0x75, 0x22, 0x5, 0x37,
+                                                         0xa, 0x8, 0xf7, 0x32, 0x62, 0x15, 0xf6, 0x3c,
+                                                         0xa, 0x22, 0x6, 0x75, 0x22, 0x5, 0x62, 0xa,
+                                                         0x8, 0xe, 0x3f, 0xf8, 0x7f, 0x44, 0xa, 0xf7,
+                                                         0x39, 0xf8, 0x6a, 0x3b, 0xa, 0xea, 0xb7, 0x95,
+                                                         0x41, 0xa, 0xfb, 0x4, 0x84, 0x66, 0x8, 0xe,
+                                                         0x3f, 0xf8, 0x78, 0x44, 0xa, 0xf7, 0x2b, 0xf8,
+                                                         0x63, 0x15, 0xf7, 0x0, 0x3c, 0xa, 0x21, 0x6,
+                                                         0x75, 0x22, 0x5, 0x37, 0xa, 0x8, 0xe, 0x3f,
+                                                         0xfb, 0x14, 0x44, 0xa, 0xbf, 0x8c, 0x15, 0x37,
+                                                         0xa, 0x83, 0x62, 0x18, 0xf7, 0x0, 0x99, 0xa3,
+                                                         0xf7, 0x5, 0x93, 0xb0, 0x9e, 0xe6, 0x18, 0x21,
+                                                         0x6, 0xe, 0x20, 0xf8, 0x78, 0x44, 0xa, 0xf7,
+                                                         0x31, 0xf8, 0x63, 0x15, 0xc1, 0x6, 0xbc, 0xf7,
+                                                         0x1f, 0xa4, 0xf7, 0x8, 0x57, 0xa, 0x72, 0xfb,
+                                                         0x8, 0x5, 0xe, 0xae, 0xa0, 0x76, 0xf8, 0x59,
+                                                         0xd4, 0x42, 0xe0, 0x12, 0x13, 0xa0, 0xd8, 0x16,
+                                                         0xdb, 0x6, 0xb5, 0xf7, 0x67, 0x5, 0xf7, 0x3,
+                                                         0xa1, 0xc0, 0xf7, 0x17, 0xe4, 0x1b, 0x9c, 0x9b,
+                                                         0x86, 0x7e, 0x9a, 0x1f, 0xae, 0xdf, 0x5, 0x96,
+                                                         0x76, 0x78, 0x93, 0x74, 0x1b, 0x41, 0x56, 0x37,
+                                                         0x68, 0x77, 0x1f, 0x13, 0xc0, 0x9e, 0xf6, 0x5,
+                                                         0x41, 0x6, 0xe, 0xf8, 0x4b, 0x78, 0xca, 0xf7,
+                                                         0xab, 0xc3, 0xf7, 0xe, 0xc2, 0xf7, 0xa, 0xca,
+                                                         0x1, 0xc1, 0xcc, 0xf9, 0x21, 0xcc, 0x3, 0xf7,
+                                                         0x93, 0xf7, 0x2a, 0x15, 0xd0, 0x6, 0xad, 0xf7,
+                                                         0x41, 0x5, 0xb3, 0x6, 0xc1, 0x9c, 0x76, 0x33,
+                                                         0xad, 0x1f, 0xa3, 0x4b, 0x5, 0xde, 0x6, 0x68,
+                                                         0xda, 0x65, 0xdc, 0x7a, 0x98, 0x73, 0x93, 0x19,
+                                                         0x8c, 0x8d, 0xe3, 0x90, 0xb8, 0xc4, 0x94, 0xb9,
+                                                         0x19, 0xec, 0x9d, 0x2d, 0x9d, 0x3a, 0x1b, 0xfb,
+                                                         0x27, 0x6, 0xad, 0xfb, 0x45, 0x15, 0xa4, 0xf7,
+                                                         0xe, 0x5, 0xd9, 0x6, 0xb4, 0xcd, 0x8b, 0x4f,
+                                                         0x7f, 0x1f, 0x4d, 0x7e, 0x45, 0x8b, 0x6b, 0x1b,
+                                                         0xfc, 0x22, 0x78, 0x15, 0xfb, 0x66, 0xf7, 0x44,
+                                                         0xfb, 0x3d, 0xf7, 0x6c, 0xf7, 0x6d, 0xf7, 0x42,
+                                                         0xf7, 0x3e, 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x45,
+                                                         0xf7, 0x3c, 0xfb, 0x6a, 0xfb, 0x6a, 0xfb, 0x46,
+                                                         0xfb, 0x3b, 0xfb, 0x66, 0x1e, 0xcc, 0x16, 0xf7,
+                                                         0x42, 0xf7, 0x25, 0xf7, 0x20, 0xf7, 0x48, 0xf7,
+                                                         0x4a, 0xf7, 0x26, 0xfb, 0x20, 0xfb, 0x42, 0xfb,
+                                                         0x43, 0xfb, 0x26, 0xfb, 0x21, 0xfb, 0x4a, 0xfb,
+                                                         0x48, 0xfb, 0x25, 0xf7, 0x21, 0xf7, 0x43, 0x1e,
+                                                         0xe, 0xae, 0xf8, 0xd0, 0xb1, 0xf7, 0x0, 0xb1,
+                                                         0x1, 0xf7, 0x6a, 0xb2, 0xf7, 0x2, 0xb2, 0x3,
+                                                         0xf7, 0x6a, 0xf9, 0x2d, 0x15, 0x57, 0xb6, 0x62,
+                                                         0xbe, 0xbe, 0xb6, 0xb4, 0xbf, 0xbe, 0x61, 0xb3,
+                                                         0x57, 0x57, 0x61, 0x63, 0x58, 0x1e, 0xb2, 0x89,
+                                                         0x15, 0xaa, 0xa3, 0xa3, 0xaa, 0xaa, 0xa3, 0x74,
+                                                         0x6b, 0x6d, 0x73, 0x74, 0x6c, 0x6d, 0x72, 0xa2,
+                                                         0xa9, 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd0, 0xf8,
+                                                         0x33, 0xd0, 0x12, 0xf7, 0x1d, 0xde, 0xf7, 0x49,
+                                                         0xe6, 0x57, 0xe4, 0x13, 0xf0, 0xca, 0xf7, 0x46,
+                                                         0x15, 0xfb, 0x49, 0xf7, 0x39, 0x7f, 0xbd, 0xf7,
+                                                         0x27, 0xce, 0xd4, 0xd8, 0xeb, 0x3f, 0xb7, 0x2a,
+                                                         0xb5, 0x1e, 0x49, 0xa7, 0x6a, 0x94, 0xb5, 0x1a,
+                                                         0xaa, 0xac, 0xb5, 0xcc, 0x1e, 0x13, 0xe8, 0x9b,
+                                                         0xf5, 0x81, 0x2e, 0x1f, 0xe4, 0x90, 0x5, 0xf7,
+                                                         0x1c, 0xfb, 0x14, 0xaa, 0x3e, 0xfb, 0x1f, 0x5b,
+                                                         0x3c, 0x4c, 0x34, 0xcd, 0x66, 0xe5, 0x63, 0x1e,
+                                                         0x13, 0xf0, 0xca, 0x6f, 0xb8, 0x75, 0x5c, 0x1a,
+                                                         0x58, 0x56, 0x6d, 0x4a, 0xfb, 0x14, 0x89, 0xf0,
+                                                         0xa8, 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd1, 0xf8,
+                                                         0x36, 0xd1, 0x12, 0xf7, 0x20, 0xe2, 0x9f, 0xde,
+                                                         0xe2, 0xe9, 0x55, 0xe8, 0x13, 0xf8, 0xca, 0xf7,
+                                                         0x47, 0x15, 0xfb, 0x4b, 0xf7, 0x40, 0x80, 0xbf,
+                                                         0xf7, 0x2e, 0xd1, 0xd6, 0xd7, 0xec, 0x3b, 0xb6,
+                                                         0x27, 0xb6, 0x1e, 0x46, 0xa8, 0x68, 0x8a, 0xb5,
+                                                         0x1a, 0xaa, 0xae, 0xc0, 0xcf, 0x1e, 0x13, 0xf4,
+                                                         0x9b, 0xf7, 0x3, 0x8f, 0xfb, 0x0, 0x1f, 0xe8,
+                                                         0x90, 0x5, 0xf7, 0x1e, 0xfb, 0x19, 0xaa, 0x3a,
+                                                         0xfb, 0x27, 0x5a, 0x31, 0x4b, 0x34, 0xd0, 0x6f,
+                                                         0xe9, 0x63, 0x1e, 0x13, 0xf8, 0xce, 0x6e, 0xba,
+                                                         0x77, 0x5a, 0x1a, 0x58, 0x52, 0x6d, 0x48, 0xfb,
+                                                         0x19, 0x88, 0xf1, 0xa8, 0x1e, 0xf7, 0x2f, 0xf8,
+                                                         0x2d, 0x15, 0xf1, 0x6, 0xf7, 0x1e, 0xf7, 0x1f,
+                                                         0x50, 0xa, 0x36, 0x31, 0x62, 0xe5, 0x5, 0x38,
+                                                         0x6, 0xe, 0xfb, 0x53, 0xce, 0xf9, 0xaa, 0xd2,
+                                                         0x1, 0xd7, 0x71, 0x15, 0xfb, 0xb, 0xa4, 0xe7,
+                                                         0x5d, 0xe8, 0x1b, 0xf7, 0xb, 0xd0, 0xdc, 0xd9,
+                                                         0xae, 0x7d, 0xae, 0x6a, 0xb1, 0x1f, 0xed, 0xbb,
+                                                         0xad, 0xbe, 0xc2, 0x1a, 0xc9, 0x68, 0xba, 0x29,
+                                                         0xdb, 0x1e, 0x3b, 0xcd, 0x5a, 0xb4, 0xc2, 0x1a,
+                                                         0xb9, 0xb3, 0xb2, 0xc5, 0x9d, 0xe0, 0x88, 0x27,
+                                                         0x1e, 0xe1, 0x96, 0x5, 0xbd, 0x83, 0x7a, 0xf7,
+                                                         0x5, 0xfb, 0x34, 0x1b, 0xfb, 0xd, 0x4e, 0x40,
+                                                         0x38, 0x66, 0x99, 0x69, 0xa2, 0x70, 0x1f, 0x53,
+                                                         0x6f, 0x3c, 0x5f, 0x29, 0x1a, 0x41, 0xbc, 0x63,
+                                                         0xc8, 0x57, 0x1e, 0xf7, 0x1f, 0xfb, 0x7, 0xa3,
+                                                         0x7a, 0x5e, 0x1a, 0x5d, 0x5f, 0x5d, 0x4d, 0x73,
+                                                         0x39, 0x90, 0xf7, 0x5, 0x73, 0x1e, 0xf7, 0x78,
+                                                         0xf7, 0x14, 0x15, 0x75, 0xa0, 0x5f, 0xae, 0x64,
+                                                         0xaa, 0x8, 0x55, 0xb7, 0x6e, 0x9d, 0xb3, 0x1a,
+                                                         0xcb, 0xcd, 0xbb, 0xa5, 0x9a, 0x1e, 0xac, 0x67,
+                                                         0xbd, 0x5f, 0xbf, 0x60, 0x8, 0xb6, 0x66, 0x98,
+                                                         0x79, 0x6d, 0x1a, 0x73, 0x7c, 0x5d, 0x3b, 0x65,
+                                                         0x1e, 0xe, 0x77, 0xfb, 0x12, 0x76, 0xf7, 0x3b,
+                                                         0x76, 0xf8, 0x39, 0xeb, 0x1, 0xc3, 0xf7, 0x89,
+                                                         0x3, 0xe2, 0x8a, 0x15, 0xc5, 0x6, 0x77, 0x30,
+                                                         0x5f, 0x7f, 0x7b, 0x87, 0x82, 0x64, 0x18, 0xf6,
+                                                         0x98, 0xa4, 0xf7, 0x3, 0x92, 0xae, 0x9d, 0xe2,
+                                                         0x18, 0x23, 0x6, 0xcd, 0xf7, 0xd5, 0x40, 0xa,
+                                                         0xe, 0xa0, 0x76, 0xf9, 0x9, 0xda, 0x1, 0xf7,
+                                                         0x3a, 0x16, 0xf1, 0x6, 0xb9, 0xf7, 0x52, 0xf7,
+                                                         0x1b, 0xf7, 0x94, 0xf7, 0x5d, 0xf7, 0x3b, 0x9e,
+                                                         0xda, 0x18, 0xfc, 0x95, 0x6, 0x78, 0x3c, 0x5,
+                                                         0xf8, 0x24, 0x6, 0xfb, 0x63, 0xfb, 0x51, 0xfb,
+                                                         0x1d, 0xfb, 0xa1, 0x70, 0xfb, 0x2f, 0x8, 0xe,
+                                                         0x78, 0xd0, 0xf7, 0xec, 0xd0, 0xf7, 0x44, 0xd4,
+                                                         0x1, 0xe6, 0xe9, 0xf7, 0xb8, 0xe5, 0x3, 0xf7,
+                                                         0x6f, 0xf8, 0x29, 0x15, 0xac, 0x93, 0xcb, 0xf7,
+                                                         0x54, 0xf7, 0x17, 0x1b, 0xd0, 0xa7, 0x58, 0x50,
+                                                         0x93, 0x1f, 0xe3, 0x93, 0x5, 0xe0, 0x83, 0x5a,
+                                                         0xe5, 0xfb, 0x16, 0x1b, 0xfb, 0x95, 0x3b, 0xfb,
+                                                         0xf2, 0xfb, 0x24, 0xfb, 0x4d, 0xf7, 0x11, 0x60,
+                                                         0xef, 0xf7, 0x30, 0xf7, 0x0, 0xf7, 0x13, 0xf7,
+                                                         0x25, 0xf7, 0x19, 0x2c, 0xd8, 0x20, 0x3d, 0x52,
+                                                         0x64, 0x78, 0x73, 0x1f, 0x69, 0xfb, 0x58, 0x15,
+                                                         0xf7, 0xd, 0xe5, 0xcb, 0xde, 0xd9, 0xc1, 0x4d,
+                                                         0x3c, 0x28, 0x37, 0x23, 0x33, 0x3e, 0x53, 0xe4,
+                                                         0xd1, 0x1e, 0xe, 0x77, 0x8d, 0x76, 0x1, 0x88,
+                                                         0xf8, 0x6d, 0x3, 0x76, 0x78, 0x15, 0xd2, 0x6,
+                                                         0xf8, 0x26, 0xf9, 0x88, 0x5, 0x44, 0x6, 0xe,
+                                                         0x77, 0xe, 0x90, 0x76, 0xf7, 0xdc, 0xd3, 0xf7,
+                                                         0x9c, 0xd1, 0x1, 0xf7, 0x4c, 0xe6, 0x3, 0xc6,
+                                                         0x7b, 0x15, 0xaf, 0xae, 0xb5, 0x95, 0xb8, 0x8a,
+                                                         0xb6, 0x8a, 0xb8, 0x7f, 0xb6, 0x80, 0x8, 0x81,
+                                                         0xb3, 0xb0, 0x81, 0xab, 0x1b, 0x95, 0xb9, 0x8b,
+                                                         0xaf, 0xd7, 0x1f, 0x6f, 0xd9, 0x5, 0x6d, 0x57,
+                                                         0x5d, 0x8b, 0x81, 0x1b, 0x6b, 0x69, 0x96, 0x94,
+                                                         0x65, 0x1f, 0x65, 0x94, 0x61, 0x93, 0x5c, 0x84,
+                                                         0x88, 0x8c, 0x18, 0xc0, 0xb1, 0xc2, 0xc4, 0x88,
+                                                         0xf7, 0xa, 0x8, 0xf7, 0x11, 0x6, 0x9a, 0xd3,
+                                                         0x5, 0xfb, 0x23, 0x6, 0x81, 0xbe, 0x8a, 0xb0,
+                                                         0x98, 0x1a, 0xf7, 0x18, 0xea, 0xaa, 0xc0, 0x9e,
+                                                         0xeb, 0x88, 0xfb, 0x10, 0x9a, 0x1e, 0xdc, 0x93,
+                                                         0x5, 0xf7, 0x30, 0x7a, 0xfb, 0xd, 0xac, 0x43,
+                                                         0x1b, 0xfb, 0x14, 0xfb, 0x4, 0x28, 0xfb, 0x1a,
+                                                         0x5f, 0x8d, 0x7e, 0x92, 0x5f, 0x1f, 0x35, 0x6,
+                                                         0x7c, 0x43, 0x5, 0xf7, 0x1, 0x6, 0x9f, 0xfb,
+                                                         0xa, 0xfb, 0x11, 0x29, 0x5c, 0x70, 0x8, 0xe,
+                                                         0x77, 0x84, 0xd2, 0xf7, 0xfd, 0xcb, 0xf7, 0x48,
+                                                         0x77, 0x1, 0xf7, 0x3, 0xf7, 0x9d, 0x3, 0xf7,
+                                                         0xa2, 0x8d, 0x15, 0x9a, 0xcf, 0x5, 0x87, 0x79,
+                                                         0x79, 0x89, 0x79, 0x1b, 0x65, 0x8b, 0xb2, 0xbd,
+                                                         0x96, 0x1f, 0xc7, 0xf7, 0xa4, 0x5, 0xe4, 0x6,
+                                                         0x9a, 0xcb, 0x5, 0x32, 0x6, 0xb4, 0xf7, 0x48,
+                                                         0x23, 0x51, 0x70, 0xfb, 0xe, 0x5, 0x43, 0x6,
+                                                         0x7d, 0x4b, 0x5, 0xd2, 0x6, 0x4b, 0xfb, 0xa4,
+                                                         0x5, 0x86, 0x72, 0x88, 0x75, 0x77, 0x1a, 0x51,
+                                                         0xa8, 0x68, 0xd6, 0x93, 0xa7, 0x8c, 0x93, 0xa7,
+                                                         0x1e, 0xe, 0xfb, 0x4e, 0x76, 0xf7, 0x51, 0xd4,
+                                                         0xf8, 0x26, 0xd4, 0xf7, 0x50, 0x77, 0x1, 0xb1,
+                                                         0xe7, 0xf7, 0xfe, 0xe7, 0x3, 0xf7, 0x3c, 0xd9,
+                                                         0x15, 0x4d, 0xad, 0xb9, 0x69, 0xd1, 0x1b, 0xf7,
+                                                         0x1c, 0xf7, 0x16, 0xf7, 0x23, 0xf7, 0x52, 0xf7,
+                                                         0x1e, 0x3d, 0xd8, 0x25, 0x57, 0x5d, 0x77, 0x56,
+                                                         0x52, 0x1f, 0xc5, 0xf7, 0x99, 0x5, 0x2e, 0x6,
+                                                         0xfb, 0x5c, 0xfe, 0x31, 0x5, 0xe7, 0x6, 0xe5,
+                                                         0xf8, 0x32, 0x15, 0xdf, 0xca, 0xf7, 0x3a, 0xf7,
+                                                         0xa, 0xd9, 0xb0, 0x45, 0x43, 0x3e, 0x5b, 0xfb,
+                                                         0x4b, 0xfb, 0x16, 0x31, 0x6f, 0xd9, 0xd5, 0x1e,
+                                                         0xe, 0x78, 0xd0, 0xf7, 0xa3, 0xd4, 0xf7, 0x84,
+                                                         0xd0, 0x1, 0xf8, 0x71, 0xeb, 0x3, 0xd6, 0xf7,
+                                                         0x45, 0x15, 0xfb, 0x20, 0x96, 0xf7, 0x8, 0x53,
+                                                         0xf7, 0x3, 0x1b, 0xf7, 0x20, 0xf7, 0xc, 0xe6,
+                                                         0xf7, 0x15, 0xe5, 0x48, 0xbf, 0x75, 0x97, 0x1f,
+                                                         0xe6, 0xb2, 0xae, 0xc3, 0xcf, 0x1a, 0xeb, 0x38,
+                                                         0xe4, 0xfb, 0x19, 0x6f, 0xfb, 0x34, 0x87, 0xfb,
+                                                         0x46, 0x5b, 0x1e, 0xe8, 0x79, 0x5, 0xe8, 0x9d,
+                                                         0xce, 0xb1, 0xc5, 0x1b, 0xd0, 0xc0, 0x58, 0x4a,
+                                                         0x52, 0x46, 0x48, 0xfb, 0x10, 0x1f, 0x7b, 0x42,
+                                                         0x5, 0xe8, 0xd8, 0x61, 0x3d, 0x43, 0x44, 0x3c,
+                                                         0x27, 0xfb, 0xc, 0x7d, 0xf0, 0xb0, 0x86, 0x1f,
+                                                         0xe, 0x65, 0xa, 0xf7, 0x77, 0xc4, 0xf7, 0x92,
+                                                         0xbe, 0x12, 0xf7, 0xe7, 0xd3, 0x55, 0xd1, 0x13,
+                                                         0x7c, 0xf8, 0x79, 0xc7, 0x15, 0xf7, 0x45, 0x6,
+                                                         0x7d, 0x44, 0x5, 0xcb, 0x6, 0x9a, 0xd2, 0x5,
+                                                         0xb8, 0x6, 0x97, 0xc1, 0x5, 0x5e, 0x6, 0xb8,
+                                                         0xf7, 0x77, 0x5, 0x55, 0x6, 0xfb, 0x7e, 0xfb,
+                                                         0x74, 0x5, 0xd6, 0x88, 0x15, 0xf7, 0x14, 0xf7,
+                                                         0x11, 0x8d, 0x89, 0x6e, 0xfb, 0xf, 0x5, 0xfc,
+                                                         0xb2, 0xf7, 0xdc, 0x15, 0x50, 0x9b, 0xbe, 0x61,
+                                                         0xd6, 0x1b, 0xde, 0xc3, 0xbd, 0xc4, 0xc1, 0x66,
+                                                         0x9a, 0x74, 0x95, 0x1f, 0x8d, 0x7, 0x13, 0x7a,
+                                                         0xb7, 0x94, 0xab, 0xa1, 0xbb, 0x1a, 0xc7, 0x51,
+                                                         0xae, 0x47, 0x48, 0x57, 0x6c, 0x50, 0x7b, 0x1e,
+                                                         0xce, 0x82, 0x5, 0x9e, 0x92, 0x97, 0xa8, 0xbc,
+                                                         0x1b, 0xa8, 0xa6, 0x7d, 0x6d, 0x5d, 0x5c, 0x85,
+                                                         0x60, 0x8a, 0x1f, 0x81, 0x58, 0x5, 0x13, 0xbc,
+                                                         0xae, 0xba, 0x82, 0x5c, 0x79, 0x80, 0x6b, 0x51,
+                                                         0x55, 0x7c, 0xb0, 0x9a, 0x85, 0x1f, 0x5d, 0xfc,
+                                                         0x69, 0x15, 0xd4, 0x6, 0xf9, 0x13, 0xf9, 0x66,
+                                                         0x5, 0x3c, 0x6, 0xe, 0xae, 0xf7, 0xa2, 0xcf,
+                                                         0xf7, 0xc4, 0xc8, 0x12, 0xf7, 0xe2, 0xdf, 0x4b,
+                                                         0xdd, 0x13, 0xe0, 0xe5, 0xf8, 0x1b, 0x15, 0x45,
+                                                         0x9d, 0xc5, 0x58, 0xe2, 0x1b, 0xec, 0xcf, 0xc7,
+                                                         0xcf, 0xcb, 0x5f, 0x9d, 0x70, 0x98, 0x1f, 0x8d,
+                                                         0x7, 0x13, 0xd0, 0xbe, 0x97, 0xb1, 0xa7, 0xc5,
+                                                         0x1a, 0xd3, 0x48, 0xb1, 0x3b, 0x3d, 0x4f, 0x66,
+                                                         0x44, 0x77, 0x1e, 0xda, 0x81, 0x5, 0xa2, 0x93,
+                                                         0x98, 0xad, 0xc5, 0x1b, 0xad, 0xaa, 0x7a, 0x67,
+                                                         0x55, 0x55, 0x83, 0x59, 0x8a, 0x1f, 0x7f, 0x4d,
+                                                         0x5, 0x13, 0xe0, 0xb3, 0xc3, 0x8b, 0x53, 0x75,
+                                                         0x7e, 0x5b, 0x47, 0x4c, 0x7a, 0xb8, 0x9c, 0x84,
+                                                         0x1f, 0xe, 0xae, 0xf8, 0xf3, 0xf7, 0x4, 0x2f,
+                                                         0x76, 0xb7, 0xd0, 0x8e, 0x77, 0x12, 0xf7, 0x11,
+                                                         0xce, 0xf7, 0x7d, 0xcc, 0x13, 0x8c, 0xf7, 0x11,
+                                                         0xf8, 0xf3, 0x15, 0xce, 0x6, 0x13, 0x6c, 0xa4,
+                                                         0x91, 0x97, 0x9d, 0xa6, 0x1b, 0xae, 0xa6, 0x7e,
+                                                         0x7f, 0xa3, 0x1f, 0x81, 0x9f, 0x9e, 0x82, 0xa1,
+                                                         0x1b, 0xcb, 0xaf, 0xc4, 0xc3, 0x91, 0x1f, 0x4a,
+                                                         0x6, 0x7c, 0x86, 0x85, 0x72, 0x6f, 0x1b, 0x7a,
+                                                         0x78, 0x91, 0x92, 0x78, 0x1f, 0x13, 0x5c, 0x98,
+                                                         0x6a, 0x69, 0x9c, 0x6d, 0x1b, 0x13, 0x8c, 0x41,
+                                                         0x79, 0x55, 0x4e, 0x7a, 0x1f, 0xe, 0xf9, 0x52,
+                                                         0xf7, 0xdb, 0x76, 0xf7, 0xf3, 0xc8, 0x1, 0xf9,
+                                                         0x33, 0xc8, 0x3, 0xf7, 0x5c, 0xf7, 0xc6, 0x15,
+                                                         0xd2, 0x6, 0xf7, 0x13, 0xf7, 0xf3, 0x5, 0xf7,
+                                                         0x21, 0x6, 0xa0, 0xc8, 0x5, 0xfb, 0xf4, 0x6,
+                                                         0x75, 0x4e, 0x5, 0xf7, 0x21, 0x6, 0xf7, 0x31,
+                                                         0xfb, 0xf3, 0x15, 0xcd, 0x6, 0xf7, 0x12, 0xf7,
+                                                         0xf3, 0x48, 0xa, 0x7e, 0xfb, 0xf3, 0x5, 0xcd,
+                                                         0x6, 0xf7, 0x7d, 0xf7, 0xed, 0x48, 0xa, 0xfb,
+                                                         0x10, 0xfb, 0xed, 0x5, 0xcd, 0x6, 0xf7, 0x28,
+                                                         0xf8, 0x30, 0x5, 0x23, 0x6, 0xfb, 0x73, 0xfb,
+                                                         0xdd, 0x4e, 0xa, 0x96, 0xf7, 0xdd, 0x5, 0x21,
+                                                         0x6, 0xe, 0x8b, 0xda, 0xf8, 0xbd, 0xd7, 0x1,
+                                                         0xf8, 0x63, 0xe9, 0x3, 0xa2, 0x16, 0xf8, 0x58,
+                                                         0x6, 0x9d, 0xda, 0x5, 0xfb, 0xe8, 0x6, 0xe1,
+                                                         0xf7, 0xa, 0xf7, 0x11, 0xc2, 0xcf, 0xc7, 0x8,
+                                                         0xa9, 0xa3, 0xea, 0xe1, 0xe8, 0x1a, 0xee, 0x3d,
+                                                         0xe4, 0xfb, 0x26, 0xfb, 0x31, 0x49, 0x23, 0x29,
+                                                         0x7b, 0x1e, 0xe6, 0x80, 0x5, 0xce, 0x98, 0xb6,
+                                                         0xd1, 0xe7, 0x1b, 0xd3, 0xc5, 0x5e, 0x48, 0x38,
+                                                         0x37, 0x53, 0x36, 0x4b, 0x1f, 0xfb, 0x4a, 0xfb,
+                                                         0x1b, 0x4d, 0x5f, 0x70, 0xfb, 0x19, 0x8, 0xe,
+                                                         0xae, 0xf7, 0xad, 0xcf, 0xf7, 0x76, 0xf7, 0x14,
+                                                         0x47, 0xcf, 0x1, 0xf7, 0xfe, 0xe2, 0x3, 0xcb,
+                                                         0xf7, 0xad, 0x15, 0xf7, 0xe8, 0x6, 0x99, 0xcf,
+                                                         0x5, 0xfb, 0x6d, 0x6, 0xa2, 0xa6, 0xa4, 0x9a,
+                                                         0xda, 0xb9, 0x8, 0xce, 0xb2, 0xc1, 0xb1, 0xd0,
+                                                         0x1a, 0xc2, 0x63, 0xcc, 0xfb, 0xc, 0x2a, 0x4e,
+                                                         0x63, 0x37, 0x73, 0x1e, 0xe2, 0x83, 0x5, 0xbb,
+                                                         0x9c, 0xa7, 0x9b, 0xbd, 0x1b, 0xbd, 0xa2, 0x71,
+                                                         0x71, 0x64, 0x6d, 0x78, 0x4e, 0x6a, 0x1f, 0xfb,
+                                                         0x2c, 0x36, 0x67, 0x4b, 0x78, 0x4d, 0x8, 0xe,
+                                                         0x7c, 0xd5, 0x62, 0x76, 0xf8, 0xa2, 0x77, 0x12,
+                                                         0x13, 0x60, 0xf8, 0x2e, 0x88, 0x15, 0xdd, 0x6,
+                                                         0xf7, 0x0, 0xf8, 0xa2, 0x5, 0x33, 0x6, 0x5c,
+                                                         0xfb, 0x75, 0x7d, 0x44, 0x7d, 0x4c, 0x55, 0x57,
+                                                         0x19, 0x13, 0xa0, 0x62, 0x60, 0x62, 0x7f, 0x69,
+                                                         0x1b, 0x4e, 0x5d, 0x97, 0xf7, 0xa, 0xa9, 0x1f,
+                                                         0xcc, 0xf7, 0xe2, 0x5, 0x38, 0x6, 0x49, 0xfb,
+                                                         0xe2, 0x5, 0x85, 0x6b, 0x87, 0x6b, 0x70, 0x1a,
+                                                         0x4c, 0xb5, 0x59, 0xf2, 0xd9, 0xca, 0xbd, 0xc3,
+                                                         0xbd, 0x1e, 0xe, 0x39, 0xa, 0xf7, 0x78, 0x77,
+                                                         0x27, 0xa, 0x31, 0xf8, 0x8f, 0x36, 0xa, 0xe,
+                                                         0x39, 0xa, 0xe8, 0xf7, 0x1b, 0x27, 0xa, 0xfb,
+                                                         0x40, 0xf8, 0x8f, 0x30, 0xa, 0xe, 0x39, 0xa,
+                                                         0xef, 0xef, 0x27, 0xa, 0x8d, 0xf8, 0x96, 0x2e,
+                                                         0xa, 0xe, 0x39, 0xa, 0xe4, 0xf7, 0x1f, 0x27,
+                                                         0xa, 0x65, 0xf8, 0x8b, 0x15, 0xd3, 0x6, 0x50,
+                                                         0x6f, 0xa, 0xfb, 0x3, 0x6, 0xe, 0xfb, 0x11,
+                                                         0xbd, 0x1, 0x70, 0x40, 0x15, 0x59, 0xf8, 0xcb,
+                                                         0xbd, 0x7, 0xe, 0xf7, 0x5e, 0x43, 0xa, 0xf7,
+                                                         0x61, 0x16, 0xee, 0x6, 0xf7, 0xbf, 0xf8, 0x9f,
+                                                         0x4d, 0xa, 0xfb, 0x83, 0xfc, 0x4e, 0x4e, 0xa,
+                                                         0x4e, 0xf8, 0x4e, 0x5, 0x34, 0x6, 0xe, 0xf8,
+                                                         0x3c, 0x43, 0xa, 0xf8, 0x65, 0xcd, 0x3, 0xf7,
+                                                         0x47, 0x16, 0xe7, 0x6, 0xf7, 0x4a, 0xf8, 0x36,
+                                                         0xa3, 0xfc, 0x36, 0x5, 0xe6, 0x6, 0xf7, 0x90,
+                                                         0xf8, 0x9f, 0x5, 0x34, 0x6, 0xfb, 0x51, 0xfc,
+                                                         0x38, 0x4e, 0xa, 0x76, 0xf8, 0x38, 0x50, 0xa,
+                                                         0xfb, 0x48, 0xfc, 0x3d, 0x4e, 0xa, 0x6a, 0xf8,
+                                                         0x3d, 0x5, 0x36, 0x6, 0xe, 0xf7, 0x5e, 0x43,
+                                                         0xa, 0x96, 0x16, 0xf7, 0xc, 0x6, 0xf7, 0x3a,
+                                                         0xf7, 0x54, 0xec, 0xfb, 0x54, 0x5, 0xf4, 0x6,
+                                                         0xfb, 0x20, 0xf7, 0x98, 0xf7, 0x7f, 0xf7, 0x9b,
+                                                         0x5, 0xfb, 0x9, 0x6, 0xfb, 0x36, 0xfb, 0x52,
+                                                         0x2c, 0xf7, 0x52, 0x5, 0x22, 0x6, 0xf7, 0x20,
+                                                         0xfb, 0x93, 0x5, 0xe, 0xf7, 0x5e, 0xfb, 0x55,
+                                                         0x76, 0xf9, 0x75, 0x77, 0x1, 0x9f, 0xfb, 0xe,
+                                                         0x15, 0x86, 0x36, 0x5, 0x86, 0x9f, 0x9d, 0x89,
+                                                         0x9c, 0x1b, 0xe8, 0xc0, 0xd1, 0xd3, 0xb3, 0x1f,
+                                                         0xf7, 0xec, 0xf8, 0xe7, 0x50, 0xa, 0xfb, 0x86,
+                                                         0xfc, 0x3a, 0x4e, 0xf8, 0x3a, 0x3f, 0xa, 0xe4,
+                                                         0xfc, 0xa3, 0x41, 0xfb, 0x15, 0x74, 0x7e, 0x38,
+                                                         0xa3, 0x19, 0xe, 0xf7, 0x5e, 0xfb, 0x55, 0x76,
+                                                         0xf9, 0x7d, 0x77, 0xf7, 0x73, 0x77, 0x1, 0xf8,
+                                                         0x74, 0xeb, 0x3, 0x9f, 0xfb, 0xb, 0x15, 0x86,
+                                                         0x36, 0x59, 0xa, 0xd8, 0xce, 0xb2, 0x1f, 0xf7,
+                                                         0xec, 0xf8, 0xed, 0x50, 0xa, 0xfb, 0x85, 0xfc,
+                                                         0x3f, 0x4e, 0xa, 0x4f, 0xf8, 0x3f, 0x45, 0xa,
+                                                         0xe5, 0xfc, 0xa8, 0x5, 0xfb, 0x15, 0x53, 0x59,
+                                                         0x8e, 0x78, 0x1b, 0x71, 0x7b, 0x8f, 0x8f, 0x7e,
+                                                         0x1f, 0xf7, 0x97, 0xf9, 0x5f, 0x15, 0xd7, 0x6,
+                                                         0xf7, 0x1c, 0xf7, 0x1e, 0x5, 0xfb, 0x9, 0x6,
+                                                         0xe, 0xf7, 0x5e, 0xfb, 0x6a, 0xe1, 0xf9, 0x71,
+                                                         0xf0, 0x1, 0x9f, 0xfb, 0xc, 0x15, 0x86, 0x37,
+                                                         0x59, 0xa, 0xd7, 0xce, 0xb2, 0x1f, 0xf7, 0xec,
+                                                         0xf8, 0xe6, 0x50, 0xa, 0xfb, 0x85, 0xfc, 0x3a,
+                                                         0x4e, 0xa, 0x4f, 0xf8, 0x3a, 0x45, 0xa, 0xe5,
+                                                         0xfc, 0xa2, 0x5, 0xfb, 0x16, 0x3f, 0x7f, 0x90,
+                                                         0x66, 0x1b, 0x71, 0x7b, 0x8f, 0x8f, 0x7e, 0x1f,
+                                                         0xf8, 0x1b, 0xf9, 0x69, 0x15, 0xeb, 0x6, 0xa1,
+                                                         0xf0, 0x50, 0xa, 0xfb, 0x65, 0x26, 0x15, 0xea,
+                                                         0x6, 0xa1, 0xf0, 0x50, 0xa, 0xe, 0xa0, 0x76,
+                                                         0xf7, 0xbf, 0xcb, 0xf7, 0xd9, 0x77, 0x1, 0xdc,
+                                                         0xf7, 0x2e, 0x15, 0xf7, 0x58, 0x6, 0x6b, 0xfb,
+                                                         0x2e, 0x5, 0xe1, 0x6, 0xac, 0xf7, 0x2e, 0x5,
+                                                         0xf7, 0x56, 0x6, 0x99, 0xcc, 0x5, 0xfb, 0x56,
+                                                         0x6, 0x9b, 0xdb, 0x5, 0xf7, 0x54, 0x6, 0x99,
+                                                         0xcb, 0x5, 0xfb, 0x2c, 0x6, 0xf7, 0x8f, 0xf7,
+                                                         0xd9, 0x5, 0xfb, 0x0, 0x6, 0xfb, 0x77, 0xfb,
+                                                         0xd9, 0x4e, 0xa, 0xfb, 0x9, 0xf7, 0xd9, 0x5,
+                                                         0x33, 0x6, 0xf7, 0x13, 0xfb, 0xd9, 0x5, 0xfb,
+                                                         0x35, 0x6, 0x7e, 0x4b, 0x5, 0xf7, 0x59, 0x6,
+                                                         0x7b, 0x3b, 0x5, 0xfb, 0x58, 0x6, 0xe, 0xf7,
+                                                         0x5e, 0x8b, 0xda, 0xf8, 0x6, 0xd5, 0x1, 0xaa,
+                                                         0xf8, 0xb0, 0x3, 0xaa, 0x16, 0xf8, 0x5e, 0x6,
+                                                         0x9c, 0xda, 0x5, 0xfb, 0xe3, 0x6, 0xf8, 0x18,
+                                                         0xf8, 0x18, 0x5a, 0xa, 0xf7, 0xca, 0x6, 0xfc,
+                                                         0xe, 0xfc, 0x10, 0x5, 0xe, 0xf7, 0x5e, 0x8b,
+                                                         0xdb, 0xf8, 0x98, 0xf7, 0x1e, 0x1, 0xaa, 0x16,
+                                                         0xf8, 0x5e, 0x6, 0x9c, 0xdb, 0x5, 0xfb, 0xe3,
+                                                         0x6, 0xf8, 0x18, 0xf8, 0x1c, 0x5a, 0xa, 0xf7,
+                                                         0xc8, 0x6, 0x8d, 0x89, 0xfc, 0xe, 0xfc, 0x12,
+                                                         0x5, 0xf7, 0x9b, 0xf8, 0xa2, 0x15, 0xf5, 0x6,
+                                                         0xf7, 0x23, 0xf7, 0x1e, 0x47, 0xa, 0x33, 0x32,
+                                                         0x60, 0xe4, 0x5, 0x36, 0x6, 0xe, 0x78, 0xd0,
+                                                         0xf8, 0xdc, 0xd0, 0x1, 0xf7, 0x2, 0xe3, 0xf7,
+                                                         0xd0, 0xe3, 0x3, 0xe8, 0xf7, 0x63, 0x15, 0xfb,
+                                                         0x44, 0xf0, 0x59, 0xec, 0xf7, 0x73, 0xe9, 0xf7,
+                                                         0xbc, 0xf7, 0x50, 0xf7, 0x4f, 0xfb, 0xd, 0xbe,
+                                                         0x3b, 0xfb, 0x6c, 0x29, 0xfb, 0xd7, 0xfb, 0x41,
+                                                         0x1e, 0xe3, 0x16, 0xa2, 0xac, 0xf8, 0x28, 0xf7,
+                                                         0x56, 0xf7, 0x3, 0x8c, 0xfb, 0x1d, 0x6b, 0x38,
+                                                         0x5a, 0xfb, 0xe0, 0xfb, 0x43, 0x49, 0x5a, 0xbd,
+                                                         0xf6, 0x1e, 0xe, 0x78, 0x9e, 0xf8, 0x9f, 0x9a,
+                                                         0xf7, 0x48, 0x9e, 0x6, 0xfb, 0x70, 0x98, 0xf8,
+                                                         0xc0, 0x94, 0x7, 0x78, 0x9e, 0xf8, 0x9f, 0x9a,
+                                                         0xf7, 0x48, 0x9e, 0x8, 0xfb, 0x70, 0x98, 0x9,
+                                                         0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xdc,
+                                                         0xa, 0xe5, 0xb, 0xd5, 0x92, 0xc, 0xc, 0xe5,
+                                                         0x95, 0xc, 0xd, 0xf8, 0xc0, 0x14, 0xf7, 0xbe,
+                                                         0x15, 0xc3, 0x13, 0x0, 0x50, 0x2, 0x0, 0x1,
+                                                         0x0, 0x4e, 0x0, 0x92, 0x0, 0x99, 0x0, 0xc9,
+                                                         0x1, 0x1, 0x1, 0x49, 0x1, 0x72, 0x1, 0xb1,
+                                                         0x1, 0xb6, 0x1, 0xbb, 0x1, 0xde, 0x1, 0xe1,
+                                                         0x2, 0x13, 0x2, 0x1a, 0x2, 0x22, 0x2, 0x2a,
+                                                         0x2, 0x3a, 0x2, 0x40, 0x2, 0x4b, 0x2, 0x58,
+                                                         0x2, 0x61, 0x2, 0x66, 0x2, 0x72, 0x2, 0x7b,
+                                                         0x2, 0x84, 0x2, 0x8c, 0x2, 0x96, 0x2, 0xa0,
+                                                         0x2, 0xa8, 0x2, 0xac, 0x2, 0xaf, 0x2, 0xb3,
+                                                         0x2, 0xbc, 0x2, 0xc5, 0x2, 0xcc, 0x2, 0xd3,
+                                                         0x2, 0xd9, 0x2, 0xdd, 0x2, 0xeb, 0x2, 0xef,
+                                                         0x2, 0xf3, 0x2, 0xfb, 0x3, 0x3, 0x3, 0xa,
+                                                         0x3, 0xf, 0x3, 0x13, 0x3, 0x17, 0x3, 0x22,
+                                                         0x3, 0x26, 0x3, 0x2d, 0x3, 0x33, 0x3, 0x3a,
+                                                         0x3, 0x40, 0x3, 0x45, 0x3, 0x4a, 0x3, 0x4e,
+                                                         0x3, 0x58, 0x3, 0x62, 0x3, 0x6c, 0x3, 0x76,
+                                                         0x3, 0x7a, 0x3, 0x83, 0x3, 0x8c, 0x3, 0x95,
+                                                         0x3, 0x9e, 0x3, 0xa7, 0x3, 0xb0, 0x3, 0xb8,
+                                                         0x3, 0xc1, 0x3, 0xca, 0x3, 0xd0, 0x3, 0xd4,
+                                                         0x3, 0xda, 0x3, 0xe0, 0x3, 0xe5, 0x3, 0xea,
+                                                         0x3, 0xef, 0x3, 0xf3, 0x3, 0xf7, 0x3, 0xfb,
+                                                         0x6e, 0xa, 0x85, 0xa7, 0x87, 0x9f, 0xa4, 0x1a,
+                                                         0xae, 0x91, 0xae, 0x92, 0xad, 0x1e, 0xa9, 0xf7,
+                                                         0x18, 0x5, 0x97, 0xc4, 0x8f, 0xa5, 0x91, 0x1a,
+                                                         0xe3, 0x2d, 0xc8, 0xfb, 0x2, 0x30, 0xfb, 0x11,
+                                                         0x5f, 0xfb, 0xc, 0x73, 0x1e, 0xe1, 0x83, 0x5,
+                                                         0xd8, 0xa6, 0xcc, 0xa0, 0xc5, 0x1b, 0xa4, 0xe5,
+                                                         0x87, 0x44, 0x80, 0x87, 0x6f, 0x83, 0x74, 0x1f,
+                                                         0x67, 0x7c, 0x65, 0x89, 0x3d, 0x88, 0x8, 0x4e,
+                                                         0x89, 0xfb, 0x48, 0x83, 0xfb, 0x37, 0x1a, 0x28,
+                                                         0xd6, 0x53, 0xe4, 0x1e, 0xb, 0x15, 0xfb, 0x41,
+                                                         0xf7, 0xb, 0xfb, 0x27, 0xf7, 0x5b, 0xf7, 0x76,
+                                                         0xf7, 0x45, 0xf7, 0x54, 0xf7, 0x82, 0xf7, 0x54,
+                                                         0xfb, 0xb, 0xf7, 0x1c, 0xfb, 0x5c, 0xfb, 0x6a,
+                                                         0xfb, 0x50, 0xfb, 0x38, 0xfb, 0xa6, 0x1e, 0xef,
+                                                         0x86, 0x15, 0xf7, 0x8b, 0xf7, 0x39, 0xf7, 0x7,
+                                                         0xf7, 0x1d, 0xf7, 0x4, 0xf6, 0x32, 0xfb, 0x32,
+                                                         0xfb, 0x47, 0xfb, 0xd, 0xfb, 0x3e, 0xfb, 0x42,
+                                                         0xfb, 0x4, 0xfb, 0x6, 0xdd, 0xf7, 0x2c, 0x1e,
+                                                         0xb, 0x20, 0xa, 0x13, 0xbc, 0x23, 0xa, 0xb,
+                                                         0xe7, 0xc9, 0xc1, 0xa4, 0xa7, 0x1f, 0x8c, 0x80,
+                                                         0x8d, 0x6d, 0x94, 0x71, 0x8, 0xa1, 0xf7, 0xa4,
+                                                         0x15, 0x82, 0x55, 0x81, 0x5f, 0x71, 0x66, 0x8,
+                                                         0x59, 0x69, 0x54, 0x6e, 0x54, 0x1b, 0x3e, 0x73,
+                                                         0xbd, 0xb2, 0xe1, 0xe7, 0x96, 0xc6, 0x90, 0x1f,
+                                                         0xdd, 0x92, 0xa2, 0x8d, 0xad, 0x99, 0x8, 0xb,
+                                                         0x15, 0xfb, 0x22, 0xf1, 0x3b, 0xf7, 0x7, 0xf7,
+                                                         0x30, 0xf7, 0x15, 0xf7, 0x1a, 0xf7, 0x57, 0xf7,
+                                                         0x1d, 0x34, 0xde, 0xfb, 0x13, 0xfb, 0x4c, 0x23,
+                                                         0xfb, 0x28, 0xfb, 0x47, 0x1e, 0xe5, 0x16, 0xf7,
+                                                         0x3, 0xcb, 0xf7, 0x27, 0xf7, 0x17, 0xe2, 0xb3,
+                                                         0x43, 0x3c, 0xfb, 0x4, 0x43, 0xfb, 0x28, 0xfb,
+                                                         0xe, 0x6d, 0x29, 0x98, 0xf7, 0x20, 0x1e, 0xb,
+                                                         0x15, 0xf8, 0x1e, 0x6, 0x8e, 0x9f, 0x8f, 0xa0,
+                                                         0xb3, 0x1a, 0xe7, 0x5d, 0xf7, 0x15, 0xfb, 0x38,
+                                                         0xfb, 0x5a, 0x35, 0xfb, 0x58, 0xfb, 0x1c, 0xfb,
+                                                         0x29, 0xe9, 0x3e, 0xf7, 0x7, 0xf7, 0x20, 0xe5,
+                                                         0xf7, 0x2, 0xd5, 0xa1, 0x1e, 0x32, 0x94, 0x5,
+                                                         0x29, 0x61, 0x3a, 0x76, 0x63, 0x1b, 0x4c, 0x54,
+                                                         0xbe, 0xf2, 0x96, 0x8c, 0x92, 0x8c, 0x95, 0x1f,
+                                                         0x99, 0xd1, 0x15, 0xcf, 0xa0, 0xbf, 0xe9, 0xf5,
+                                                         0x1b, 0xd2, 0xcd, 0x4b, 0x29, 0x7b, 0x1f, 0xb,
+                                                         0x15, 0xf4, 0x6, 0xf7, 0x8, 0xf7, 0x69, 0x5,
+                                                         0xf7, 0xb6, 0x6, 0xaf, 0xfb, 0x69, 0x5, 0xe8,
+                                                         0x6, 0xfb, 0xb, 0xf9, 0x76, 0x5, 0xfb, 0x5,
+                                                         0x6, 0xfb, 0x26, 0xfc, 0x54, 0x15, 0xf7, 0x51,
+                                                         0xf8, 0x4, 0x48, 0xa, 0xb9, 0xfc, 0x4, 0x5,
+                                                         0xe, 0x12, 0x13, 0x70, 0xf8, 0x27, 0x88, 0x15,
+                                                         0xe0, 0x6, 0xf7, 0x4, 0xf8, 0xa5, 0x45, 0xa,
+                                                         0x5a, 0xfb, 0x76, 0x5, 0x21, 0x75, 0x50, 0xfb,
+                                                         0x1b, 0xfb, 0x12, 0x1b, 0x4b, 0x7a, 0xc5, 0xd4,
+                                                         0x9a, 0x1f, 0xd4, 0xf7, 0xe4, 0x45, 0xa, 0x46,
+                                                         0xfb, 0xe2, 0x5, 0x87, 0x74, 0x89, 0x76, 0x76,
+                                                         0x1a, 0x13, 0xb0, 0x3a, 0xae, 0x4e, 0xec, 0xdc,
+                                                         0xcc, 0xbd, 0xc4, 0xbf, 0x1e, 0x13, 0x70, 0xb,
+                                                         0xfd, 0x8, 0x21, 0xa, 0xe, 0xfc, 0xa2, 0x24,
+                                                         0xa, 0xe, 0x1, 0xe1, 0x16, 0xf8, 0xbe, 0x6a,
+                                                         0xa, 0xfc, 0x5c, 0x6, 0xbf, 0xf7, 0x94, 0x5,
+                                                         0xf8, 0x29, 0x6, 0x9d, 0xde, 0x5, 0xfc, 0x29,
+                                                         0x6, 0xb9, 0xf7, 0x7b, 0x5, 0xf8, 0x40, 0x6a,
+                                                         0xa, 0xfc, 0xa0, 0x6, 0xb, 0x23, 0xa, 0xe,
+                                                         0x15, 0x8b, 0x22, 0xfc, 0x86, 0x64, 0x1a, 0xfb,
+                                                         0x25, 0xf7, 0xb, 0x43, 0xf7, 0x27, 0xf7, 0x91,
+                                                         0xbb, 0xf7, 0x80, 0xe0, 0x9c, 0x1e, 0xe5, 0xf8,
+                                                         0x45, 0x57, 0xa, 0x33, 0xfc, 0x45, 0x5, 0xfb,
+                                                         0xb, 0x74, 0x49, 0xfb, 0xa, 0xfb, 0x1e, 0x1b,
+                                                         0x39, 0x39, 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xad,
+                                                         0x5, 0xe, 0xa0, 0x76, 0xf9, 0x62, 0x77, 0x1,
+                                                         0xb, 0x2f, 0xa, 0xfb, 0x5d, 0x27, 0x2f, 0xa,
+                                                         0xb, 0x15, 0xe7, 0x6, 0xa0, 0xef, 0x3d, 0xa,
+                                                         0xb, 0x6e, 0xa, 0xdb, 0xe2, 0xb2, 0x34, 0x5,
+                                                         0xd9, 0x6, 0x4e, 0xf7, 0x1b, 0x5, 0x2a, 0x6,
+                                                         0xb, 0x35, 0xa, 0xf7, 0x69, 0xd8, 0xb, 0xf8,
+                                                         0x5, 0x8b, 0xdf, 0xf7, 0x94, 0xde, 0xf7, 0x7b,
+                                                         0xdf, 0xb, 0x3b, 0xa, 0xe9, 0xb7, 0x96, 0x41,
+                                                         0xa, 0xfb, 0x5, 0x84, 0x66, 0x8, 0xb, 0xe9,
+                                                         0x6, 0xf7, 0x25, 0xf9, 0x73, 0x3d, 0xa, 0xb,
+                                                         0xf8, 0x5, 0xa0, 0x76, 0xb, 0x15, 0xd4, 0x6,
+                                                         0xf7, 0x16, 0xf7, 0x1b, 0x5, 0xfb, 0x4, 0x6,
+                                                         0xb, 0xc5, 0x6, 0x77, 0x2d, 0x5f, 0x80, 0x7a,
+                                                         0x87, 0xb, 0xdf, 0x6, 0xf4, 0xf8, 0xa3, 0x5,
+                                                         0x36, 0x6, 0xb, 0x7c, 0xd5, 0x4d, 0xc9, 0xf8,
+                                                         0x67, 0x77, 0xb, 0xa0, 0x76, 0xf8, 0x56, 0xcf,
+                                                         0xf7, 0x17, 0xda, 0x1, 0xb, 0x15, 0xf4, 0x6,
+                                                         0xa1, 0xf4, 0x5, 0x52, 0x6, 0x9e, 0xb, 0x4c,
+                                                         0xa, 0x92, 0xb0, 0x9e, 0xe6, 0x18, 0xb, 0x5,
+                                                         0x2f, 0x6, 0xb, 0x3f, 0xa, 0xe, 0x5, 0x31,
+                                                         0x6, 0xb, 0x15, 0xf3, 0x6, 0xa1, 0xeb, 0x5,
+                                                         0x23, 0x6, 0xb, 0x9c, 0x8f, 0x93, 0xb4, 0x18,
+                                                         0x20, 0x7d, 0x72, 0xb, 0x77, 0x1, 0xf7, 0xf,
+                                                         0xec, 0x3, 0xb, 0xa0, 0x76, 0xf8, 0x9f, 0x77,
+                                                         0x1, 0xb, 0x76, 0xf7, 0x93, 0x77, 0x1, 0xb,
+                                                         0x5, 0x30, 0x6, 0xb, 0x6, 0xeb, 0xf8, 0x56,
+                                                         0x5, 0xf0, 0x6, 0x99, 0xcf, 0x5, 0x26, 0x6,
+                                                         0xf0, 0xb, 0x5, 0x27, 0x6, 0xb, 0x5, 0x8d,
+                                                         0x6, 0xb, 0xf7, 0x2c, 0x76, 0xf8, 0x2d, 0x77,
+                                                         0x1, 0xb, 0x7c, 0xd1, 0x66, 0x76, 0xf7, 0x8d,
+                                                         0xce, 0xb, 0xef, 0x6, 0xa0, 0xf5, 0x47, 0xa,
+                                                         0xb, 0x99, 0xa4, 0xf7, 0x5, 0xb, 0x5, 0x2c,
+                                                         0x6, 0xb, 0x5, 0x89, 0x6, 0xb, 0x15, 0xdc,
+                                                         0x6, 0xf7, 0x24, 0x6d, 0xa, 0xfb, 0x10, 0x6,
+                                                         0xb, 0x5, 0x2b, 0x6, 0xb, 0x5, 0xfb, 0x3,
+                                                         0x6, 0xfb, 0x97, 0xb, 0x5c, 0xa, 0xf8, 0xa3,
+                                                         0x77, 0xb, 0xae, 0xf8, 0xe5, 0xf7, 0x21, 0x1,
+                                                         0xb, 0x5c, 0xa, 0xf9, 0x73, 0x77, 0xb, 0x6,
+                                                         0x9c, 0xdc, 0x5, 0xb, 0x15, 0xd1, 0x6, 0x51,
+                                                         0xb, 0x5, 0x29, 0x6, 0xb, 0xf7, 0x60, 0x5,
+                                                         0x3f, 0x6, 0x5e, 0xfb, 0x60, 0x5, 0xb, 0x5,
+                                                         0x82, 0xa5, 0xa1, 0x8a, 0x9a, 0x1b, 0xe9, 0xb8,
+                                                         0xb, 0x97, 0xc3, 0x5, 0xfc, 0x4c, 0x6, 0x7a,
+                                                         0x41, 0x5, 0xb, 0x15, 0x74, 0x8b, 0x21, 0xf7,
+                                                         0x10, 0xf7, 0x2d, 0xa3, 0xb, 0x77, 0xa0, 0x76,
+                                                         0xb, 0x15, 0xe1, 0x6, 0x76, 0x25, 0x5, 0x35,
+                                                         0x6, 0xb, 0x72, 0x1b, 0x7c, 0x78, 0x95, 0x95,
+                                                         0x74, 0x1f, 0xb, 0x77, 0xfb, 0x58, 0xcf, 0xf9,
+                                                         0xa2, 0xcf, 0x1, 0xb, 0xa0, 0x76, 0xf8, 0x65,
+                                                         0xc8, 0x4e, 0xd4, 0x12, 0xb, 0xae, 0xfb, 0x4e,
+                                                         0x76, 0xfa, 0x40, 0x77, 0x1, 0xb, 0xc4, 0x6,
+                                                         0x77, 0x2d, 0x60, 0x80, 0x7a, 0x87, 0xb, 0x15,
+                                                         0xea, 0x6, 0xa1, 0xf0, 0x4d, 0xa, 0xb, 0xf7,
+                                                         0x84, 0xd4, 0x1, 0xbe, 0xf7, 0x84, 0x15, 0xb,
+                                                         0xf8, 0xac, 0x8d, 0x76, 0xa8, 0x76, 0xd2, 0xc1,
+                                                         0xb, 0x6, 0xa3, 0x90, 0x96, 0x9c, 0xb, 0xf6,
+                                                         0x4c, 0xa, 0xb, 0xf4, 0xef, 0xf8, 0x9d, 0xef,
+                                                         0xb, 0x6, 0x7d, 0x87, 0x85, 0x72, 0xb, 0x6,
+                                                         0x9c, 0xdf, 0x5, 0xb, 0x6, 0x9d, 0xdc, 0x5,
+                                                         0xb, 0xf8, 0x74, 0x78, 0xdc, 0xb, 0xf7, 0x21,
+                                                         0x5, 0xb, 0x15, 0xe6, 0x6, 0xb, 0xf7, 0x1f,
+                                                         0x5, 0xb
+                                                        };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c b/core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c
new file mode 100644
index 0000000..05b0a16
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c
@@ -0,0 +1,4191 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansMMFontData [66919] = {
+    0x80, 0x01, 0xD2, 0x29, 0x00, 0x00, 0x25, 0x21, 0x50, 0x53, 0x2D, 0x41, 0x64, 0x6F, 0x62, 0x65,
+    0x46, 0x6F, 0x6E, 0x74, 0x2D, 0x31, 0x2E, 0x30, 0x3A, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53,
+    0x61, 0x6E, 0x73, 0x4D, 0x4D, 0x20, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x0D, 0x25, 0x25,
+    0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x46, 0x72,
+    0x69, 0x20, 0x53, 0x65, 0x70, 0x20, 0x32, 0x39, 0x20, 0x31, 0x36, 0x3A, 0x30, 0x32, 0x3A, 0x35,
+    0x33, 0x20, 0x32, 0x30, 0x30, 0x36, 0x0D, 0x25, 0x25, 0x56, 0x4D, 0x75, 0x73, 0x61, 0x67, 0x65,
+    0x3A, 0x20, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30, 0x0D,
+    0x31, 0x37, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x46,
+    0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20,
+    0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x76, 0x65, 0x72, 0x73, 0x69,
+    0x6F, 0x6E, 0x20, 0x28, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x29, 0x20, 0x72, 0x65, 0x61,
+    0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x4E, 0x6F, 0x74, 0x69, 0x63,
+    0x65, 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65,
+    0x66, 0x0D, 0x2F, 0x46, 0x75, 0x6C, 0x6C, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72,
+    0x6f, 0x6d, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x73, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64,
+    0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x61, 0x6D, 0x69, 0x6C, 0x79,
+    0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x73,
+    0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65,
+    0x66, 0x0D, 0x2F, 0x49, 0x74, 0x61, 0x6C, 0x69, 0x63, 0x41, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x30,
+    0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x69, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x69, 0x74,
+    0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E,
+    0x64, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20,
+    0x2D, 0x31, 0x30, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E, 0x64, 0x65, 0x72, 0x6C,
+    0x69, 0x6E, 0x65, 0x54, 0x68, 0x69, 0x63, 0x6B, 0x6E, 0x65, 0x73, 0x73, 0x20, 0x35, 0x30, 0x20,
+    0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x41, 0x6C, 0x6C,
+    0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,
+    0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x50, 0x6F, 0x73, 0x69, 0x74,
+    0x69, 0x6F, 0x6E, 0x73, 0x20, 0x5B, 0x5B, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x30,
+    0x20, 0x5D, 0x5B, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x20,
+    0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E,
+    0x4D, 0x61, 0x70, 0x20, 0x5B, 0x5B, 0x5B, 0x35, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31, 0x34,
+    0x35, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5B, 0x5B, 0x35, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B,
+    0x31, 0x34, 0x35, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,
+    0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65, 0x73, 0x20, 0x5B,
+    0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2F, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x5D,
+    0x20, 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C,
+    0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63,
+    0x74, 0x6F, 0x72, 0x20, 0x5B, 0x30, 0x2E, 0x33, 0x31, 0x35, 0x38, 0x20, 0x30, 0x2E, 0x31, 0x33,
+    0x34, 0x39, 0x20, 0x30, 0x2E, 0x33, 0x38, 0x34, 0x39, 0x20, 0x30, 0x2E, 0x31, 0x36, 0x34, 0x34,
+    0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65,
+    0x20, 0x2F, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53, 0x61, 0x6E, 0x73, 0x4D, 0x4D, 0x20, 0x64, 0x65,
+    0x66, 0x0D, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x32, 0x35, 0x36, 0x20,
+    0x61, 0x72, 0x72, 0x61, 0x79, 0x0D, 0x30, 0x20, 0x31, 0x20, 0x32, 0x35, 0x35, 0x20, 0x7B, 0x31,
+    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x2E, 0x6E, 0x6F,
+    0x74, 0x64, 0x65, 0x66, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x33, 0x32, 0x20, 0x2F, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x34, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74,
+    0x65, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x35, 0x20,
+    0x2F, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x33, 0x36, 0x20, 0x2F, 0x64, 0x6F, 0x6C, 0x6C, 0x61, 0x72, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x63, 0x65,
+    0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x38, 0x20, 0x2F, 0x61,
+    0x6D, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x33, 0x39, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x65,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x30, 0x20, 0x2F, 0x70, 0x61, 0x72,
+    0x65, 0x6E, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34,
+    0x31, 0x20, 0x2F, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x32, 0x20, 0x2F, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69,
+    0x73, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x33, 0x20, 0x2F, 0x70,
+    0x6C, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x34, 0x20, 0x2F,
+    0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x35,
+    0x20, 0x2F, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x34, 0x36, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x34, 0x37, 0x20, 0x2F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x38, 0x20, 0x2F, 0x7A, 0x65, 0x72, 0x6F, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x39, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x30, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x31, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x32, 0x20, 0x2F, 0x66, 0x6F, 0x75,
+    0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x33, 0x20, 0x2F, 0x66, 0x69,
+    0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x34, 0x20, 0x2F, 0x73,
+    0x69, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x35, 0x20, 0x2F, 0x73,
+    0x65, 0x76, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x36, 0x20,
+    0x2F, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35,
+    0x37, 0x20, 0x2F, 0x6E, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x35, 0x38, 0x20, 0x2F, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x35, 0x39, 0x20, 0x2F, 0x73, 0x65, 0x6D, 0x69, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x30, 0x20, 0x2F, 0x6C, 0x65, 0x73, 0x73,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x71, 0x75,
+    0x61, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x32, 0x20, 0x2F, 0x67,
+    0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36,
+    0x33, 0x20, 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x36, 0x34, 0x20, 0x2F, 0x61, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x36, 0x35, 0x20, 0x2F, 0x41, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x36, 0x36, 0x20, 0x2F, 0x42, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36,
+    0x37, 0x20, 0x2F, 0x43, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x38, 0x20,
+    0x2F, 0x44, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x39, 0x20, 0x2F, 0x45,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x30, 0x20, 0x2F, 0x46, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x31, 0x20, 0x2F, 0x47, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x32, 0x20, 0x2F, 0x48, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x37, 0x33, 0x20, 0x2F, 0x49, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x37, 0x34, 0x20, 0x2F, 0x4A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37,
+    0x35, 0x20, 0x2F, 0x4B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x36, 0x20,
+    0x2F, 0x4C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x37, 0x20, 0x2F, 0x4D,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x38, 0x20, 0x2F, 0x4E, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x39, 0x20, 0x2F, 0x4F, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x30, 0x20, 0x2F, 0x50, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x38, 0x31, 0x20, 0x2F, 0x51, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x38, 0x32, 0x20, 0x2F, 0x52, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38,
+    0x33, 0x20, 0x2F, 0x53, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x34, 0x20,
+    0x2F, 0x54, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x35, 0x20, 0x2F, 0x55,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x36, 0x20, 0x2F, 0x56, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x37, 0x20, 0x2F, 0x57, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x38, 0x20, 0x2F, 0x58, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x38, 0x39, 0x20, 0x2F, 0x59, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x39, 0x30, 0x20, 0x2F, 0x5A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39,
+    0x31, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x32, 0x20, 0x2F, 0x62, 0x61, 0x63, 0x6B, 0x73,
+    0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x33, 0x20,
+    0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x34, 0x20, 0x2F, 0x61, 0x73, 0x63, 0x69, 0x69, 0x63,
+    0x69, 0x72, 0x63, 0x75, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x35,
+    0x20, 0x2F, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6F, 0x72, 0x65, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x36, 0x20, 0x2F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x37, 0x20, 0x2F, 0x61, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x38, 0x20, 0x2F, 0x62, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x39, 0x39, 0x20, 0x2F, 0x63, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x31, 0x30, 0x30, 0x20, 0x2F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x31, 0x30, 0x31, 0x20, 0x2F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x30, 0x32, 0x20, 0x2F, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30,
+    0x33, 0x20, 0x2F, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x34,
+    0x20, 0x2F, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x35, 0x20,
+    0x2F, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x36, 0x20, 0x2F,
+    0x6A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x37, 0x20, 0x2F, 0x6B,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x38, 0x20, 0x2F, 0x6C, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x39, 0x20, 0x2F, 0x6D, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x30, 0x20, 0x2F, 0x6E, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x31, 0x20, 0x2F, 0x6F, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x32, 0x20, 0x2F, 0x70, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x33, 0x20, 0x2F, 0x71, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x31, 0x34, 0x20, 0x2F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x31, 0x35, 0x20, 0x2F, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x31, 0x31, 0x36, 0x20, 0x2F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x31, 0x31, 0x37, 0x20, 0x2F, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x31, 0x38, 0x20, 0x2F, 0x76, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31,
+    0x39, 0x20, 0x2F, 0x77, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x30,
+    0x20, 0x2F, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x31, 0x20,
+    0x2F, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x32, 0x20, 0x2F,
+    0x7A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x33, 0x20, 0x2F, 0x62,
+    0x72, 0x61, 0x63, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x31, 0x32, 0x34, 0x20, 0x2F, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x32, 0x35, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68,
+    0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x36, 0x20, 0x2F, 0x61,
+    0x73, 0x63, 0x69, 0x69, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x32, 0x38, 0x20, 0x2F, 0x45, 0x75, 0x72, 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x30, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69,
+    0x6E, 0x67, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x31, 0x33, 0x31, 0x20, 0x2F, 0x66, 0x6C, 0x6F, 0x72, 0x69, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x32, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62,
+    0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33,
+    0x33, 0x20, 0x2F, 0x65, 0x6C, 0x6C, 0x69, 0x70, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x34, 0x20, 0x2F, 0x64, 0x61, 0x67, 0x67, 0x65, 0x72, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x35, 0x20, 0x2F, 0x64, 0x61, 0x67,
+    0x67, 0x65, 0x72, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x33, 0x36, 0x20, 0x2F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x74,
+    0x68, 0x6F, 0x75, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x31, 0x33, 0x38, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x39, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E,
+    0x67, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x34, 0x30, 0x20, 0x2F, 0x4F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x34, 0x35, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x36, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65,
+    0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34,
+    0x37, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x38, 0x20, 0x2F, 0x71, 0x75, 0x6F,
+    0x74, 0x65, 0x64, 0x62, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x34, 0x39, 0x20, 0x2F, 0x62, 0x75, 0x6C, 0x6C, 0x65, 0x74, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x30, 0x20, 0x2F, 0x65, 0x6E, 0x64, 0x61,
+    0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x31, 0x20, 0x2F,
+    0x65, 0x6D, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x35, 0x32, 0x20, 0x2F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x35, 0x33, 0x20, 0x2F, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6D, 0x61, 0x72, 0x6B,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x34, 0x20, 0x2F, 0x73, 0x63,
+    0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x35,
+    0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x36, 0x20, 0x2F, 0x6F, 0x65,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x39, 0x20, 0x2F, 0x59, 0x64,
+    0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x31, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x64, 0x6F, 0x77, 0x6E, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x32, 0x20, 0x2F, 0x63, 0x65, 0x6E,
+    0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x33, 0x20, 0x2F, 0x73,
+    0x74, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x31, 0x36, 0x34, 0x20, 0x2F, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x35, 0x20, 0x2F, 0x79, 0x65, 0x6E, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x36, 0x20, 0x2F, 0x62, 0x72, 0x6F, 0x6B,
+    0x65, 0x6E, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36,
+    0x37, 0x20, 0x2F, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x36, 0x38, 0x20, 0x2F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x39, 0x20, 0x2F, 0x63, 0x6F,
+    0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x31, 0x37, 0x30, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x66, 0x65, 0x6D, 0x69, 0x6E, 0x69, 0x6E, 0x65,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x31, 0x20, 0x2F, 0x67, 0x75,
+    0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x32, 0x20, 0x2F, 0x6C, 0x6F, 0x67, 0x69, 0x63, 0x61, 0x6C,
+    0x6E, 0x6F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x34, 0x20,
+    0x2F, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x35, 0x20, 0x2F, 0x6D, 0x61, 0x63, 0x72, 0x6F, 0x6E, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x36, 0x20, 0x2F, 0x64, 0x65, 0x67,
+    0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x37, 0x20,
+    0x2F, 0x70, 0x6C, 0x75, 0x73, 0x6D, 0x69, 0x6E, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x37, 0x38, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x73, 0x75, 0x70, 0x65, 0x72,
+    0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x39, 0x20,
+    0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x30, 0x20, 0x2F, 0x61, 0x63, 0x75, 0x74,
+    0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x31, 0x20, 0x2F, 0x6D,
+    0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x32, 0x20, 0x2F, 0x70,
+    0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x31, 0x38, 0x33, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x63, 0x65, 0x6E, 0x74,
+    0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x34,
+    0x20, 0x2F, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x38, 0x35, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69,
+    0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x36, 0x20, 0x2F,
+    0x6F, 0x72, 0x64, 0x6D, 0x61, 0x73, 0x63, 0x75, 0x6C, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x37, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x6C, 0x65,
+    0x6D, 0x6F, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x31, 0x38, 0x38, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x39, 0x20, 0x2F, 0x6F, 0x6E,
+    0x65, 0x68, 0x61, 0x6C, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39,
+    0x30, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x73,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x31, 0x20, 0x2F, 0x71, 0x75,
+    0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x64, 0x6F, 0x77, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x39, 0x32, 0x20, 0x2F, 0x41, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x33, 0x20, 0x2F, 0x41, 0x61, 0x63, 0x75,
+    0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x34, 0x20, 0x2F,
+    0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x35, 0x20, 0x2F, 0x41, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x36, 0x20, 0x2F, 0x41, 0x64, 0x69,
+    0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x39, 0x37, 0x20, 0x2F, 0x41, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x39, 0x38, 0x20, 0x2F, 0x41, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x39, 0x39, 0x20, 0x2F, 0x43, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x30, 0x20, 0x2F, 0x45, 0x67, 0x72,
+    0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x31, 0x20,
+    0x2F, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x32, 0x30, 0x32, 0x20, 0x2F, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x33, 0x20, 0x2F, 0x45, 0x64,
+    0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x32, 0x30, 0x34, 0x20, 0x2F, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x35, 0x20, 0x2F, 0x49, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x36, 0x20, 0x2F, 0x49, 0x63, 0x69,
+    0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x32, 0x30, 0x37, 0x20, 0x2F, 0x49, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x38, 0x20, 0x2F, 0x45, 0x74, 0x68,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x39, 0x20, 0x2F, 0x4E, 0x74,
+    0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x30,
+    0x20, 0x2F, 0x4F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x32, 0x31, 0x31, 0x20, 0x2F, 0x4F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x32, 0x20, 0x2F, 0x4F, 0x63, 0x69, 0x72, 0x63, 0x75,
+    0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31,
+    0x33, 0x20, 0x2F, 0x4F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x32, 0x31, 0x34, 0x20, 0x2F, 0x4F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x35, 0x20, 0x2F, 0x6D, 0x75,
+    0x6C, 0x74, 0x69, 0x70, 0x6C, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+    0x31, 0x36, 0x20, 0x2F, 0x4F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x32, 0x31, 0x37, 0x20, 0x2F, 0x55, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x38, 0x20, 0x2F, 0x55, 0x61, 0x63, 0x75,
+    0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x39, 0x20, 0x2F,
+    0x55, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x30, 0x20, 0x2F, 0x55, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73,
+    0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x31, 0x20, 0x2F,
+    0x59, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+    0x32, 0x32, 0x20, 0x2F, 0x54, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x32, 0x32, 0x33, 0x20, 0x2F, 0x67, 0x65, 0x72, 0x6D, 0x61, 0x6E, 0x64, 0x62, 0x6C,
+    0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x34, 0x20, 0x2F, 0x61,
+    0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32,
+    0x35, 0x20, 0x2F, 0x61, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x32, 0x32, 0x36, 0x20, 0x2F, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C,
+    0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x37, 0x20, 0x2F,
+    0x61, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+    0x32, 0x38, 0x20, 0x2F, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x39, 0x20, 0x2F, 0x61, 0x72, 0x69, 0x6E, 0x67,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x30, 0x20, 0x2F, 0x61, 0x65,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x31, 0x20, 0x2F, 0x63, 0x63,
+    0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+    0x33, 0x32, 0x20, 0x2F, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x32, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x34, 0x20, 0x2F, 0x65, 0x63, 0x69, 0x72,
+    0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x32, 0x33, 0x35, 0x20, 0x2F, 0x65, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x36, 0x20, 0x2F, 0x69, 0x67, 0x72, 0x61,
+    0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x37, 0x20, 0x2F,
+    0x69, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+    0x33, 0x38, 0x20, 0x2F, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x39, 0x20, 0x2F, 0x69, 0x64, 0x69,
+    0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+    0x34, 0x30, 0x20, 0x2F, 0x65, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x32, 0x34, 0x31, 0x20, 0x2F, 0x6E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x32, 0x20, 0x2F, 0x6F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x33, 0x20, 0x2F, 0x6F, 0x61, 0x63,
+    0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x34, 0x20,
+    0x2F, 0x6F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x35, 0x20, 0x2F, 0x6F, 0x74, 0x69, 0x6C, 0x64, 0x65,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x36, 0x20, 0x2F, 0x6F, 0x64,
+    0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x32, 0x34, 0x37, 0x20, 0x2F, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x38, 0x20, 0x2F, 0x6F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x39, 0x20, 0x2F, 0x75, 0x67, 0x72,
+    0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x30, 0x20,
+    0x2F, 0x75, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x32, 0x35, 0x31, 0x20, 0x2F, 0x75, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x32, 0x20, 0x2F, 0x75, 0x64,
+    0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x32, 0x35, 0x33, 0x20, 0x2F, 0x79, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x34, 0x20, 0x2F, 0x74, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x35, 0x20, 0x2F, 0x79, 0x64, 0x69, 0x65,
+    0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E,
+    0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x61, 0x69, 0x6E, 0x74, 0x54, 0x79, 0x70,
+    0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70,
+    0x65, 0x20, 0x31, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20,
+    0x7B, 0x20, 0x30, 0x2E, 0x31, 0x33, 0x34, 0x39, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x65, 0x78, 0x63,
+    0x68, 0x20, 0x30, 0x2E, 0x33, 0x38, 0x34, 0x39, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64,
+    0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x31, 0x36, 0x34, 0x34, 0x20, 0x6D, 0x75, 0x6C,
+    0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20,
+    0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20,
+    0x5B, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20,
+    0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x20,
+    0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F,
+    0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x2D, 0x31, 0x31, 0x39, 0x20, 0x2D, 0x32, 0x35,
+    0x37, 0x20, 0x31, 0x31, 0x35, 0x30, 0x20, 0x38, 0x37, 0x32, 0x7D, 0x20, 0x72, 0x65, 0x61, 0x64,
+    0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20,
+    0x33, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E,
+    0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x7B, 0x20, 0x2D, 0x35,
+    0x35, 0x20, 0x2D, 0x31, 0x31, 0x32, 0x20, 0x2D, 0x31, 0x36, 0x32, 0x20, 0x2D, 0x31, 0x34, 0x35,
+    0x20, 0x7D, 0x20, 0x7B, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D,
+    0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x34, 0x32, 0x34,
+    0x20, 0x31, 0x31, 0x35, 0x36, 0x20, 0x31, 0x33, 0x38, 0x39, 0x20, 0x31, 0x39, 0x38, 0x31, 0x20,
+    0x7D, 0x20, 0x7B, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20,
+    0x38, 0x37, 0x32, 0x20, 0x7D, 0x7D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x72, 0x69, 0x76,
+    0x61, 0x74, 0x65, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x65, 0x66, 0x0D,
+    0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x25, 0x20, 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69,
+    0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x30, 0x2D, 0x31, 0x39, 0x39,
+    0x34, 0x20, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x20,
+    0x49, 0x6E, 0x63, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x65, 0x64, 0x0D, 0x25, 0x20, 0x41,
+    0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76,
+    0x65, 0x64, 0x2E, 0x0D, 0x2F, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x20,
+    0x77, 0x68, 0x65, 0x72, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x63, 0x75, 0x72, 0x72,
+    0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x73, 0x65, 0x74, 0x73,
+    0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74,
+    0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63,
+    0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69,
+    0x63, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x75, 0x70, 0x0D,
+    0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74,
+    0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C,
+    0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75,
+    0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x6F, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6F, 0x72,
+    0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61,
+    0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75,
+    0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x74,
+    0x79, 0x70, 0x65, 0x20, 0x6E, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C,
+    0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x31, 0x31, 0x20, 0x6C, 0x74, 0x20, 0x7D, 0x20, 0x69,
+    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D,
+    0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+    0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66,
+    0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x31, 0x31, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x63,
+    0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x67, 0x65,
+    0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x71, 0x0D, 0x7B, 0x20, 0x64, 0x75,
+    0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D,
+    0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x61, 0x62,
+    0x73, 0x20, 0x2E, 0x30, 0x30, 0x31, 0x20, 0x67, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x74, 0x72,
+    0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x6D,
+    0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63,
+    0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x72, 0x61,
+    0x6E, 0x67, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65,
+    0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20,
+    0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x64, 0x69,
+    0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C, 0x73, 0x65,
+    0x20, 0x7B, 0x20, 0x2F, 0x46, 0x49, 0x44, 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49,
+    0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E,
+    0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61,
+    0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B,
+    0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20,
+    0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x32, 0x20, 0x63,
+    0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x67, 0x65, 0x74, 0x20,
+    0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64,
+    0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x64, 0x75,
+    0x70, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75,
+    0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x63,
+    0x6F, 0x70, 0x79, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+    0x20, 0x7B, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x63, 0x76, 0x69,
+    0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20, 0x70, 0x6F, 0x70, 0x20,
+    0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x70,
+    0x6F, 0x70, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x65,
+    0x66, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20,
+    0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70,
+    0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x50,
+    0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F,
+    0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x64, 0x75,
+    0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x64, 0x69, 0x63, 0x74,
+    0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7B,
+    0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44,
+    0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20,
+    0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F,
+    0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20,
+    0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20,
+    0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x20,
+    0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x65,
+    0x78, 0x63, 0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x24, 0x42, 0x6C,
+    0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x5B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C,
+    0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x2D, 0x31, 0x20, 0x31,
+    0x20, 0x7B, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C,
+    0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x33, 0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20,
+    0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x71,
+    0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B,
+    0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20,
+    0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x2F, 0x70, 0x6F, 0x70, 0x20, 0x6C,
+    0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x7D, 0x20, 0x7B,
+    0x20, 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20,
+    0x7D, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x65,
+    0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x34, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C,
+    0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20,
+    0x2F, 0x6D, 0x75, 0x6C, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F,
+    0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x31, 0x20, 0x69, 0x6E,
+    0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20,
+    0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78,
+    0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68,
+    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D,
+    0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20,
+    0x7D, 0x20, 0x69, 0x66, 0x0D, 0x5D, 0x20, 0x63, 0x76, 0x78, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7B,
+    0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65,
+    0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E, 0x65, 0x20, 0x7B, 0x20,
+    0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74,
+    0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F,
+    0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78,
+    0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x33, 0x20,
+    0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73,
+    0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+    0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33,
+    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20,
+    0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D, 0x65, 0x78,
+    0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20,
+    0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64,
+    0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70,
+    0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B, 0x65,
+    0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72,
+    0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x2F,
+    0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x35,
+    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x33, 0x20, 0x69,
+    0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75,
+    0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+    0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64,
+    0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x20,
+    0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+    0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20,
+    0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+    0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x54, 0x68, 0x72, 0x65, 0x73,
+    0x68, 0x6F, 0x6C, 0x64, 0x20, 0x67, 0x65, 0x74, 0x20, 0x67, 0x74, 0x20, 0x33, 0x20, 0x63, 0x6F,
+    0x70, 0x79, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x7B, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+    0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E,
+    0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20,
+    0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x74, 0x79,
+    0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x74,
+    0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x72, 0x65, 0x61,
+    0x6C, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6F, 0x72,
+    0x20, 0x61, 0x6E, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7D, 0x20,
+    0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20,
+    0x38, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x65, 0x78, 0x65,
+    0x63, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+    0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B,
+    0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68,
+    0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x78,
+    0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x78, 0x20, 0x7D, 0x20, 0x69, 0x66,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75,
+    0x62, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78,
+    0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20,
+    0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65,
+    0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x72,
+    0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x69,
+    0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x0D, 0x39, 0x20, 0x69, 0x6E,
+    0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x39, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+    0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20,
+    0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20, 0x69,
+    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x0D, 0x31, 0x20, 0x69,
+    0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x53, 0x74, 0x65, 0x6D, 0x53, 0x6E,
+    0x61, 0x70, 0x48, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x53, 0x74, 0x65,
+    0x6D, 0x53, 0x6E, 0x61, 0x70, 0x56, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20,
+    0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x20, 0x65, 0x78, 0x69,
+    0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63,
+    0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64,
+    0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x32, 0x20, 0x63, 0x6F,
+    0x70, 0x79, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E,
+    0x64, 0x65, 0x78, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x70, 0x75,
+    0x74, 0x20, 0x30, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x20, 0x31, 0x20,
+    0x73, 0x75, 0x62, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20,
+    0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78,
+    0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E,
+    0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x33, 0x20, 0x69,
+    0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65,
+    0x78, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20, 0x70, 0x6F, 0x70, 0x0D,
+    0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67,
+    0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6C, 0x74, 0x20, 0x7B, 0x20, 0x31, 0x20,
+    0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,
+    0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20,
+    0x7B, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x31, 0x20, 0x61, 0x64,
+    0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x78,
+    0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76,
+    0x61, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69,
+    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x64,
+    0x69, 0x63, 0x74, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20, 0x36, 0x20, 0x63,
+    0x6F, 0x70, 0x79, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x67, 0x65, 0x74,
+    0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78,
+    0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E,
+    0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F,
+    0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B,
+    0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+    0x73, 0x65, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x6F, 0x70, 0x20,
+    0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x70, 0x6F, 0x70,
+    0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x63,
+    0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x42, 0x6C, 0x65, 0x6E, 0x64,
+    0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75,
+    0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x7D, 0x20,
+    0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x2F, 0x24, 0x66, 0x62, 0x66, 0x20, 0x7B,
+    0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x63,
+    0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x33, 0x20, 0x61, 0x64, 0x64,
+    0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B,
+    0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x70, 0x6F, 0x70,
+    0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x5D, 0x20,
+    0x65, 0x78, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x65, 0x78,
+    0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F,
+    0x6E, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67,
+    0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, 0x45, 0x6E,
+    0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x67, 0x65, 0x74, 0x20, 0x70, 0x75, 0x74, 0x20, 0x64,
+    0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+    0x73, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F,
+    0x53, 0x63, 0x61, 0x6C, 0x65, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x67, 0x65, 0x74, 0x20,
+    0x6D, 0x61, 0x6B, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x65, 0x74, 0x66, 0x6F, 0x6E, 0x74,
+    0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20,
+    0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+    0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x65,
+    0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x65,
+    0x78, 0x63, 0x68, 0x20, 0x35, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x34, 0x30, 0x30, 0x20,
+    0x64, 0x69, 0x76, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x35, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20,
+    0x31, 0x34, 0x30, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20,
+    0x64, 0x65, 0x66, 0x0D, 0x2F, 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69,
+    0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69,
+    0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64,
+    0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72,
+    0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x32, 0x20,
+    0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20,
+    0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+    0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75, 0x6C,
+    0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65,
+    0x78, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20,
+    0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D,
+    0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x6D, 0x6D, 0x66, 0x66,
+    0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68,
+    0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x73, 0x61, 0x76, 0x65, 0x20, 0x7B,
+    0x20, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70,
+    0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7B,
+    0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+    0x2F, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65,
+    0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20,
+    0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x2F,
+    0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x70,
+    0x6F, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x64, 0x69, 0x63,
+    0x74, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72,
+    0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D,
+    0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61,
+    0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73,
+    0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+    0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x0D, 0x7D, 0x20, 0x7B, 0x20,
+    0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x20, 0x69,
+    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x7D, 0x20, 0x7B, 0x20,
+    0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64,
+    0x69, 0x63, 0x74, 0x20, 0x73, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x66,
+    0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D,
+    0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20,
+    0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74,
+    0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x73,
+    0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+    0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66,
+    0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x24,
+    0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E,
+    0x74, 0x20, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x6C, 0x6F, 0x61, 0x64,
+    0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x66,
+    0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F,
+    0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68,
+    0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, 0x6E,
+    0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67, 0x65,
+    0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x53,
+    0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+    0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20,
+    0x64, 0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69,
+    0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74,
+    0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x33,
+    0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20,
+    0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+    0x7B, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64,
+    0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70,
+    0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x63,
+    0x76, 0x73, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x0D,
+    0x63, 0x76, 0x6E, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74,
+    0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B,
+    0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64,
+    0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78,
+    0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x74, 0x72,
+    0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74,
+    0x68, 0x20, 0x37, 0x20, 0x61, 0x64, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x64,
+    0x75, 0x70, 0x20, 0x30, 0x20, 0x28, 0x25, 0x66, 0x6F, 0x6E, 0x74, 0x25, 0x29, 0x20, 0x70, 0x75,
+    0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x20,
+    0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70,
+    0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x63,
+    0x76, 0x73, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x7B,
+    0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65,
+    0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20,
+    0x69, 0x66, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+    0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x66, 0x61,
+    0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69,
+    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72,
+    0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E,
+    0x20, 0x70, 0x6F, 0x70, 0x0D, 0x5B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x28, 0x5F,
+    0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x72,
+    0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70,
+    0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F,
+    0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+    0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69,
+    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C,
+    0x73, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x77, 0x68, 0x65,
+    0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66,
+    0x6F, 0x20, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65,
+    0x73, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B,
+    0x0D, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6F, 0x75, 0x6E,
+    0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x32, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x71,
+    0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F,
+    0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D,
+    0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x65, 0x44,
+    0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D, 0x43, 0x6F, 0x6E, 0x76,
+    0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D,
+    0x5D, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x78,
+    0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F,
+    0x6E, 0x74, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F,
+    0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B,
+    0x20, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x24, 0x6D, 0x6D,
+    0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20,
+    0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x7D, 0x20, 0x7B,
+    0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x24, 0x6D, 0x6D,
+    0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20,
+    0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70,
+    0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66,
+    0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69,
+    0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x33, 0x20, 0x69,
+    0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x53, 0x68, 0x61, 0x72, 0x65,
+    0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x64,
+    0x75, 0x70, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70,
+    0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x33, 0x20,
+    0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+    0x6C, 0x73, 0x65, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x70, 0x6F, 0x70,
+    0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63,
+    0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x69, 0x6C,
+    0x65, 0x20, 0x65, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x80, 0x02, 0x6D, 0xD9, 0x00, 0x00, 0xE8, 0xDC,
+    0x61, 0x72, 0x80, 0x71, 0xAB, 0xD4, 0xD5, 0xBC, 0xD2, 0x30, 0xC4, 0xE1, 0x86, 0xDC, 0xE0, 0x96,
+    0x54, 0x1C, 0x9C, 0x1F, 0x2E, 0x58, 0x69, 0x40, 0x4E, 0x33, 0xF9, 0xCE, 0xFF, 0x7D, 0x2F, 0xBF,
+    0xEF, 0x5F, 0x26, 0xC7, 0xE1, 0x84, 0x89, 0x54, 0xC7, 0x07, 0x55, 0x24, 0x4E, 0x73, 0x41, 0xB8,
+    0x26, 0x97, 0xE2, 0xE8, 0xEA, 0x9C, 0xE9, 0x13, 0x1D, 0x00, 0x55, 0x78, 0xAB, 0x3D, 0xE1, 0x9F,
+    0xA9, 0xF2, 0xFA, 0xFF, 0x3B, 0xEB, 0x53, 0x17, 0x4A, 0x8E, 0x2F, 0x33, 0xE9, 0xDB, 0xE0, 0x38,
+    0x63, 0x42, 0xF4, 0x0E, 0x5D, 0xF2, 0x5B, 0x7A, 0x88, 0x22, 0xEE, 0x2B, 0x6C, 0xDC, 0xAC, 0x58,
+    0xA9, 0x8F, 0x9B, 0x04, 0x71, 0x44, 0xE3, 0xF6, 0xE7, 0x4A, 0xB6, 0x0C, 0x00, 0xE4, 0x42, 0xE8,
+    0x30, 0xB1, 0x30, 0x30, 0x8A, 0x3F, 0x0E, 0xDF, 0x2C, 0xE6, 0x62, 0x35, 0xF9, 0x21, 0x6D, 0x42,
+    0x0F, 0x23, 0xAC, 0xED, 0xEC, 0x60, 0xA8, 0x8A, 0x73, 0x77, 0x14, 0x62, 0xE1, 0xB2, 0x04, 0x04,
+    0x29, 0x5D, 0x49, 0xBA, 0x8A, 0x8B, 0xCB, 0xF2, 0x04, 0x2A, 0x8D, 0xEB, 0x9A, 0x65, 0xBA, 0xF1,
+    0xC8, 0x24, 0x2F, 0x7E, 0x90, 0xD9, 0x49, 0x63, 0x23, 0x73, 0xF8, 0x43, 0x8F, 0xC1, 0xE7, 0x37,
+    0x37, 0x0B, 0x91, 0x15, 0x08, 0x9D, 0xA7, 0x90, 0xA8, 0x28, 0x50, 0xB6, 0x91, 0xE6, 0xE9, 0xE2,
+    0x79, 0x11, 0x12, 0x36, 0xFF, 0xD7, 0xC7, 0x69, 0xE2, 0x5A, 0x86, 0xDA, 0xFA, 0x47, 0x58, 0x69,
+    0x73, 0xB5, 0x49, 0xF3, 0xB4, 0x9B, 0x15, 0x16, 0x9C, 0x35, 0xF5, 0xDD, 0x2F, 0xD1, 0x4A, 0x95,
+    0x2A, 0x95, 0x04, 0x43, 0x8B, 0xF2, 0x75, 0x99, 0xA4, 0x90, 0xA6, 0xA1, 0x0A, 0x87, 0x35, 0x71,
+    0xEB, 0x17, 0x1A, 0x46, 0x59, 0x3E, 0xC6, 0xF8, 0x99, 0xF7, 0x60, 0x2C, 0x66, 0x27, 0x4A, 0x48,
+    0x63, 0x35, 0xAD, 0xC1, 0xDF, 0x19, 0x26, 0x81, 0x68, 0x9C, 0x17, 0xD4, 0x71, 0x79, 0xEF, 0x5B,
+    0xE3, 0xB5, 0xBE, 0xA9, 0xE5, 0xD2, 0x6C, 0xA2, 0x64, 0x0A, 0x14, 0x44, 0xFE, 0x73, 0x6B, 0x69,
+    0xEF, 0x3D, 0xF3, 0x0A, 0x79, 0x68, 0x5B, 0x61, 0x86, 0xAE, 0x9B, 0x42, 0x80, 0x6E, 0xBF, 0x24,
+    0x85, 0xA9, 0x87, 0x98, 0x59, 0xBB, 0x30, 0x36, 0x38, 0x81, 0x2A, 0x82, 0xB6, 0x05, 0x19, 0x94,
+    0x0A, 0x88, 0x24, 0x8A, 0x57, 0x0C, 0x51, 0x58, 0xE4, 0xAE, 0x1B, 0xE4, 0xDF, 0xD3, 0x2F, 0x92,
+    0xBE, 0xB5, 0xDB, 0x51, 0x5E, 0xA2, 0xC4, 0x58, 0xF0, 0x64, 0xF7, 0x57, 0xFB, 0x61, 0x3E, 0xAA,
+    0x46, 0xE6, 0x33, 0x46, 0x6E, 0x45, 0x4D, 0x33, 0x17, 0x66, 0xE7, 0xD7, 0xCE, 0x92, 0xF0, 0xF6,
+    0xB2, 0xFB, 0x62, 0x7B, 0xAD, 0x7C, 0x68, 0x0A, 0x8E, 0x14, 0x8F, 0xB7, 0x48, 0x3D, 0x84, 0xEF,
+    0x49, 0xDC, 0x52, 0xE3, 0xAA, 0x04, 0xC9, 0xF3, 0x0B, 0x21, 0x41, 0x96, 0x4D, 0x36, 0xC3, 0x3D,
+    0x54, 0xE8, 0x82, 0x69, 0xFF, 0xB1, 0xA8, 0xE3, 0x8A, 0x39, 0xDC, 0xC8, 0x14, 0x0A, 0x49, 0xAC,
+    0x96, 0x33, 0x1E, 0x09, 0xE8, 0x62, 0x64, 0x57, 0x82, 0x68, 0x46, 0xAB, 0xE0, 0xBB, 0xCF, 0xCF,
+    0x8F, 0xCF, 0x9E, 0x08, 0xB0, 0xAD, 0x98, 0x71, 0x33, 0x08, 0xE4, 0x5C, 0xCC, 0x7F, 0x17, 0x09,
+    0x98, 0x65, 0xEE, 0xED, 0x93, 0x84, 0xC9, 0xFD, 0x46, 0x57, 0xB4, 0xF1, 0x98, 0x3A, 0xB5, 0xC2,
+    0x7F, 0xF8, 0xFB, 0x60, 0x78, 0xD7, 0x47, 0xD7, 0x63, 0x58, 0x51, 0xE9, 0xDC, 0xF1, 0x0E, 0xB8,
+    0x59, 0x3B, 0x72, 0x81, 0x31, 0xAF, 0xC8, 0x5B, 0x35, 0x47, 0xF1, 0xBC, 0xCD, 0xED, 0x45, 0xF1,
+    0xFC, 0x6D, 0xFF, 0x2E, 0xAA, 0x6C, 0xC2, 0x65, 0x5F, 0x8F, 0x8F, 0x95, 0x20, 0xBA, 0xCA, 0xF9,
+    0x68, 0xA5, 0x47, 0x7F, 0xCC, 0xD0, 0xA6, 0x3B, 0xAE, 0xA2, 0xE5, 0x11, 0x0D, 0x4E, 0x20, 0x44,
+    0x6B, 0x64, 0xDB, 0x75, 0x68, 0x9D, 0xA4, 0xEC, 0xB2, 0x1D, 0xDF, 0x66, 0xC5, 0x89, 0x4F, 0x94,
+    0x0B, 0x06, 0xD9, 0x11, 0x9C, 0x83, 0x3F, 0x55, 0x21, 0xA0, 0x65, 0x2E, 0x6D, 0x39, 0x6F, 0xCA,
+    0x08, 0xDE, 0x60, 0x7F, 0x47, 0xE8, 0x9D, 0xC2, 0x9E, 0x5F, 0x81, 0x9C, 0xAA, 0xB7, 0x46, 0x0A,
+    0xAC, 0xA0, 0xFD, 0x22, 0x59, 0xE6, 0xCB, 0x78, 0xF6, 0x37, 0x7A, 0xD8, 0x6C, 0x8D, 0x61, 0xF1,
+    0x10, 0xE9, 0x60, 0x74, 0x4C, 0x43, 0xB0, 0x4B, 0x3C, 0x0A, 0x77, 0x6A, 0xF3, 0xF5, 0xAE, 0x16,
+    0x1C, 0xBB, 0x75, 0xDB, 0x81, 0x97, 0xA2, 0xDA, 0x6A, 0x8C, 0xE4, 0xBA, 0xB4, 0xBE, 0x6C, 0xAD,
+    0x24, 0x18, 0x37, 0x3F, 0x05, 0x8A, 0x96, 0x9C, 0x75, 0xD0, 0x97, 0xC5, 0x3B, 0xDB, 0x23, 0xBF,
+    0x62, 0x76, 0xC8, 0xD3, 0xFD, 0x09, 0x57, 0xD7, 0x8B, 0x85, 0x1B, 0x9F, 0x65, 0x79, 0x83, 0x16,
+    0x10, 0x92, 0xE4, 0x10, 0xB3, 0x65, 0xED, 0x7B, 0x42, 0x3B, 0xC6, 0x05, 0x03, 0xF7, 0xFE, 0xEE,
+    0x4B, 0x1E, 0x87, 0x05, 0x65, 0x4E, 0x00, 0xE2, 0x30, 0x67, 0x0A, 0xDB, 0xAB, 0x57, 0x04, 0xB6,
+    0x19, 0x39, 0x24, 0xFA, 0x7F, 0xB8, 0xD9, 0x08, 0x64, 0x38, 0xFA, 0x16, 0xE1, 0xF2, 0x19, 0xB2,
+    0x12, 0xBB, 0x5F, 0xDB, 0xEE, 0x81, 0xDA, 0x96, 0x41, 0x88, 0xE0, 0x9B, 0x41, 0x27, 0x2C, 0x9B,
+    0xB8, 0x27, 0x41, 0x72, 0xC1, 0xE5, 0xD9, 0xE7, 0x8D, 0x1F, 0x94, 0xF9, 0xCD, 0x0F, 0x68, 0x0D,
+    0xD3, 0x24, 0x6B, 0xBB, 0xD5, 0x65, 0x71, 0x8B, 0xE9, 0x10, 0x4F, 0xED, 0x59, 0xCD, 0xEF, 0x1D,
+    0x0E, 0xA7, 0x70, 0xB5, 0x1C, 0x62, 0xE5, 0x05, 0x88, 0x0C, 0xF3, 0x26, 0x5D, 0xD8, 0x78, 0xA1,
+    0xF9, 0x79, 0x06, 0x9C, 0x7A, 0x5A, 0xEA, 0x30, 0xCA, 0x16, 0x0F, 0x4E, 0xBE, 0x5F, 0x97, 0x58,
+    0xAA, 0x3F, 0x9B, 0xB0, 0x32, 0xBE, 0xC8, 0x2C, 0x32, 0x70, 0xA1, 0xC3, 0xD9, 0x4A, 0xEB, 0x00,
+    0xAF, 0xB2, 0x4E, 0x57, 0x7A, 0x2E, 0xE9, 0x68, 0xBD, 0x27, 0x09, 0x91, 0xD6, 0xDC, 0xB5, 0x01,
+    0x5C, 0x6D, 0x1F, 0x98, 0x7C, 0x2E, 0x73, 0x41, 0x8A, 0x09, 0x1D, 0x00, 0xE6, 0x5A, 0x9C, 0x4A,
+    0x6C, 0xEF, 0x59, 0x75, 0x30, 0x70, 0x4C, 0xCF, 0xF1, 0x7F, 0x7B, 0x3F, 0xFA, 0x01, 0x0F, 0xED,
+    0x29, 0x31, 0x5A, 0x5E, 0x62, 0x0D, 0x37, 0x52, 0xAB, 0x92, 0x04, 0x28, 0xA6, 0xA8, 0x88, 0x63,
+    0x24, 0x0A, 0x38, 0x7F, 0x32, 0xCF, 0xC5, 0xC6, 0xC0, 0x7C, 0x00, 0x77, 0x6C, 0x4F, 0x36, 0x82,
+    0xEF, 0x69, 0xF0, 0xEB, 0xCC, 0x8C, 0x6D, 0x08, 0xFF, 0xCB, 0x03, 0x29, 0x8B, 0xEF, 0x0F, 0x45,
+    0x81, 0xA3, 0xDF, 0x22, 0xEE, 0xB4, 0x72, 0x53, 0x20, 0xDC, 0x19, 0x6F, 0x21, 0xEA, 0xF1, 0xF1,
+    0x51, 0x98, 0x3C, 0xA8, 0x48, 0x2E, 0x4C, 0xF9, 0xEB, 0x10, 0x71, 0xFA, 0xF8, 0x87, 0x64, 0xE1,
+    0xBB, 0xAD, 0xD8, 0x12, 0xE2, 0x8A, 0x1E, 0xFE, 0x48, 0x1C, 0x0C, 0xA6, 0x3D, 0xBD, 0x33, 0x54,
+    0x8E, 0xD9, 0x88, 0x53, 0x55, 0x0D, 0x55, 0x62, 0x4F, 0x2D, 0x36, 0xE6, 0xDF, 0x7C, 0x0F, 0xAE,
+    0x0E, 0x78, 0x11, 0xA3, 0x70, 0x65, 0x41, 0xE8, 0x91, 0x36, 0xEE, 0xB6, 0xDD, 0xAB, 0xBA, 0x1F,
+    0x0D, 0x06, 0x48, 0x1F, 0xE0, 0x4C, 0x12, 0xF6, 0xD2, 0x37, 0xC0, 0xBD, 0x5D, 0x34, 0x25, 0xE2,
+    0xAB, 0x93, 0x4B, 0xD6, 0x17, 0x7B, 0x95, 0xD9, 0x2B, 0xFE, 0x60, 0xB0, 0x32, 0xCD, 0x5F, 0x0F,
+    0x0B, 0x81, 0x58, 0xBC, 0x95, 0x9C, 0x4B, 0x81, 0xBF, 0xD2, 0xA0, 0x64, 0xDB, 0xE8, 0xE0, 0x6A,
+    0x49, 0xFB, 0xC4, 0x99, 0x59, 0x2F, 0x2B, 0xED, 0x21, 0x8D, 0xD7, 0xA7, 0x56, 0x04, 0x67, 0xC6,
+    0x0C, 0x89, 0x58, 0x12, 0x5A, 0x5C, 0x27, 0x62, 0x79, 0x0C, 0x5E, 0xC3, 0xCC, 0x99, 0x5A, 0xCF,
+    0x71, 0x99, 0x75, 0x2E, 0xBA, 0x1C, 0x28, 0xAA, 0x64, 0x62, 0x17, 0xF9, 0xCD, 0x38, 0x1A, 0x0B,
+    0xE3, 0xF7, 0xF7, 0x98, 0x4F, 0x0D, 0xB5, 0xF0, 0x03, 0x37, 0x68, 0x5F, 0x3D, 0xE8, 0x13, 0x01,
+    0xE2, 0x36, 0xF9, 0xB6, 0x25, 0x41, 0xDE, 0x4C, 0x53, 0xD2, 0xD5, 0xB1, 0xA1, 0x77, 0x1B, 0x9D,
+    0x3A, 0x67, 0x93, 0xCB, 0x00, 0xB9, 0xA0, 0x50, 0x56, 0x00, 0xFF, 0xA6, 0xCC, 0x17, 0x5A, 0x4A,
+    0x5C, 0x98, 0xFA, 0x98, 0x1E, 0x12, 0x60, 0x50, 0x4B, 0xA9, 0x91, 0x7E, 0x25, 0x9C, 0x30, 0x91,
+    0xA9, 0x39, 0x22, 0xC3, 0xF8, 0x6D, 0xDC, 0xC7, 0xE7, 0x09, 0x4A, 0x56, 0xCA, 0xD8, 0x3B, 0x4F,
+    0x4D, 0x2F, 0xC2, 0x2B, 0x93, 0x32, 0xE5, 0x47, 0xEC, 0x14, 0x03, 0xC8, 0xB7, 0xE2, 0xA0, 0x84,
+    0xF7, 0x99, 0x51, 0x86, 0x68, 0x08, 0x98, 0x02, 0x41, 0x29, 0x07, 0x56, 0x55, 0xE6, 0x6C, 0x74,
+    0xC5, 0x61, 0x7B, 0xDB, 0x33, 0x01, 0xF8, 0xF0, 0xA9, 0x18, 0xFE, 0xC5, 0x35, 0x8C, 0xB2, 0x80,
+    0xDA, 0xD0, 0x84, 0x8A, 0xFC, 0x4C, 0x3C, 0x3A, 0x1F, 0x71, 0xF4, 0x46, 0x63, 0x60, 0x13, 0xF4,
+    0x1D, 0x82, 0xD7, 0xB0, 0x48, 0x4F, 0x2E, 0x79, 0xF7, 0xEC, 0x06, 0x12, 0x7A, 0xD2, 0x94, 0x74,
+    0x91, 0xC9, 0x68, 0x8A, 0xF0, 0x63, 0xD9, 0x18, 0x3C, 0x8B, 0x54, 0x94, 0x12, 0x4F, 0xFE, 0x9F,
+    0x9D, 0x12, 0xFA, 0xAD, 0xEE, 0xD1, 0xFD, 0x56, 0x31, 0x17, 0x5A, 0xC3, 0x09, 0xC1, 0x35, 0x53,
+    0x41, 0xEF, 0xF9, 0x9B, 0x7E, 0xBE, 0xFC, 0xA8, 0x96, 0x6E, 0x8D, 0xFD, 0xB8, 0x42, 0xC3, 0xA7,
+    0x78, 0xCB, 0xF9, 0x9B, 0xFB, 0x01, 0xCB, 0x9F, 0xA4, 0xA2, 0x0C, 0x80, 0xB7, 0x4D, 0x01, 0x50,
+    0x2F, 0xD3, 0xC1, 0xD5, 0x4B, 0x01, 0xEE, 0xDF, 0x08, 0x6A, 0xB2, 0xC6, 0x08, 0x49, 0x71, 0x89,
+    0xB3, 0xF0, 0xC1, 0x50, 0x74, 0xAC, 0xFE, 0x7E, 0x82, 0xE7, 0xA6, 0x10, 0xF2, 0x0C, 0x5A, 0xEC,
+    0xC2, 0xE8, 0x55, 0x40, 0xB0, 0x1E, 0x7F, 0x95, 0xF7, 0x39, 0x1C, 0xA7, 0xEC, 0xEB, 0x81, 0xF4,
+    0xCB, 0x82, 0x1D, 0x94, 0x8C, 0xBF, 0xDA, 0xB7, 0x65, 0x51, 0x05, 0x22, 0x92, 0x3C, 0x7A, 0x38,
+    0xB1, 0xBB, 0x14, 0xAF, 0xB1, 0xFF, 0x8A, 0x98, 0x24, 0x1B, 0xE0, 0x51, 0x0B, 0x72, 0xD1, 0x2E,
+    0x97, 0xE0, 0x4D, 0xA2, 0xFF, 0x0F, 0x30, 0xAC, 0x7A, 0xD2, 0x88, 0x6C, 0xB4, 0xCE, 0x67, 0xC2,
+    0xF7, 0x18, 0x91, 0x1E, 0x1C, 0xF4, 0xFA, 0x0D, 0xDC, 0x42, 0x3B, 0xA4, 0xB8, 0x48, 0xF3, 0x98,
+    0x94, 0x5C, 0x57, 0x98, 0xA9, 0x71, 0x14, 0x5B, 0x79, 0xCF, 0x33, 0xAA, 0xE1, 0x19, 0x49, 0xFC,
+    0x2E, 0x66, 0x2C, 0x6C, 0xEB, 0xB8, 0x71, 0x3B, 0x9C, 0x19, 0x14, 0x5C, 0x95, 0xDB, 0x7D, 0x47,
+    0xB8, 0x54, 0x14, 0xC9, 0xA8, 0x38, 0xA3, 0x3A, 0xF8, 0x40, 0xD6, 0x4F, 0x3E, 0x52, 0x48, 0x66,
+    0xED, 0xE9, 0xB8, 0xB7, 0x03, 0x0E, 0x4B, 0x8F, 0x84, 0xDF, 0xA3, 0xE4, 0x7A, 0x97, 0xA6, 0xB8,
+    0x9C, 0x97, 0xBF, 0x70, 0xDA, 0xAC, 0x71, 0x01, 0xAA, 0xDE, 0x0E, 0xFB, 0xFA, 0xF1, 0xCF, 0x0D,
+    0x9C, 0x93, 0xEB, 0xE4, 0xF4, 0xAF, 0xB6, 0x1D, 0x10, 0xB0, 0x0C, 0xDB, 0x80, 0xF2, 0x9A, 0x8C,
+    0xB5, 0x5F, 0x2C, 0xB1, 0x67, 0xE9, 0x3A, 0xD7, 0xE4, 0xCF, 0x20, 0xE7, 0x06, 0x86, 0xFA, 0x23,
+    0x8E, 0xBF, 0x85, 0x45, 0x2A, 0x4B, 0x53, 0x45, 0xF1, 0xA2, 0x6C, 0x2A, 0x4F, 0x4D, 0x67, 0xED,
+    0x78, 0x15, 0x06, 0x43, 0x94, 0x44, 0xFB, 0x1C, 0xD5, 0xDB, 0x88, 0x95, 0xD5, 0x53, 0x90, 0xBD,
+    0xF8, 0x7A, 0xD8, 0xED, 0xE0, 0x3E, 0x86, 0xC9, 0x9D, 0xFC, 0xA7, 0x29, 0x94, 0x82, 0xC3, 0x71,
+    0xB4, 0xE7, 0x77, 0x35, 0x48, 0x7A, 0xA0, 0x79, 0x8A, 0x68, 0x7F, 0xA2, 0xDF, 0xDA, 0x34, 0x4D,
+    0x72, 0xD2, 0xB3, 0x51, 0xA6, 0x64, 0x84, 0xF5, 0x01, 0x74, 0x87, 0x57, 0xA3, 0x3F, 0x25, 0x28,
+    0xAA, 0x88, 0x75, 0xFC, 0xE6, 0x79, 0x62, 0xBF, 0xF8, 0xD7, 0xBE, 0x22, 0x13, 0xD2, 0xAD, 0x08,
+    0x7D, 0x15, 0xF3, 0x9D, 0x74, 0xB6, 0x49, 0x53, 0xE7, 0x4C, 0xE9, 0x57, 0x80, 0x5A, 0x8F, 0x5D,
+    0x75, 0xDE, 0x04, 0x59, 0x0B, 0x8C, 0xC6, 0x1B, 0x7A, 0xFC, 0xF0, 0x42, 0xC2, 0x6A, 0x17, 0x3A,
+    0x19, 0x92, 0x66, 0xE3, 0x04, 0x28, 0x85, 0x02, 0xA3, 0x2F, 0xA8, 0x3D, 0x92, 0x9F, 0xD4, 0xDF,
+    0x24, 0x57, 0xF9, 0x61, 0x10, 0xD6, 0x6B, 0x32, 0x5F, 0x7F, 0xC6, 0xDD, 0x58, 0x4D, 0x83, 0xF9,
+    0x27, 0x0E, 0xF9, 0x6D, 0x4F, 0x30, 0x32, 0x12, 0x5A, 0xC5, 0xEA, 0x83, 0x35, 0x14, 0x23, 0x58,
+    0x66, 0x79, 0x5B, 0x44, 0x44, 0x9E, 0xBE, 0xBF, 0x2D, 0x02, 0x76, 0x4A, 0x59, 0x2A, 0x1F, 0xC8,
+    0xF6, 0x84, 0xD1, 0x87, 0x55, 0xE5, 0x3D, 0xF2, 0xCC, 0x63, 0xE0, 0x47, 0x1F, 0x14, 0x00, 0x56,
+    0xF1, 0xF1, 0x7B, 0x45, 0xD2, 0xE6, 0xC9, 0x38, 0x1C, 0xE1, 0x29, 0x3D, 0xF4, 0x1D, 0x2B, 0x3E,
+    0x67, 0x9C, 0x67, 0xE4, 0x82, 0x40, 0x29, 0x55, 0xC4, 0x46, 0xBE, 0x6B, 0xA5, 0x2A, 0xDD, 0xFF,
+    0xCA, 0xD0, 0xC9, 0x05, 0x03, 0xA0, 0x4F, 0x0D, 0xA0, 0xA5, 0x04, 0x26, 0x02, 0x92, 0x16, 0x5C,
+    0x2D, 0x68, 0xDF, 0x06, 0x87, 0x79, 0x71, 0xA3, 0x40, 0xB5, 0xCC, 0x1E, 0x71, 0x3C, 0x7F, 0x16,
+    0xFA, 0xA0, 0xA5, 0x58, 0xD9, 0x53, 0x93, 0x31, 0x03, 0x28, 0x0A, 0x94, 0x41, 0xC1, 0xEE, 0x61,
+    0x47, 0xE0, 0x02, 0x8E, 0x39, 0xEF, 0x6D, 0xA9, 0xD3, 0x00, 0xA0, 0x30, 0x95, 0xF5, 0xFC, 0xBF,
+    0xC7, 0x6B, 0x8A, 0x32, 0x16, 0x9E, 0x50, 0xB0, 0xEF, 0x0C, 0xF3, 0x55, 0x61, 0xD0, 0x21, 0xF7,
+    0x6B, 0xA0, 0xB9, 0xC9, 0x69, 0xE7, 0x85, 0xF8, 0xE7, 0x69, 0xC4, 0xB5, 0x27, 0x01, 0x1B, 0xB1,
+    0xAD, 0x09, 0x5A, 0xD0, 0x40, 0xC0, 0x1C, 0x34, 0x51, 0x23, 0x3F, 0xD2, 0xD4, 0x94, 0xBA, 0x42,
+    0xA8, 0xC9, 0x4B, 0x84, 0x2B, 0x82, 0xDD, 0xDA, 0x22, 0x14, 0xE0, 0x24, 0x53, 0x12, 0xD0, 0x67,
+    0x62, 0xC2, 0x4E, 0xF6, 0x7A, 0xBA, 0xCB, 0xF1, 0xF0, 0xE4, 0x51, 0x2A, 0xA5, 0x48, 0x4C, 0xC6,
+    0xC2, 0x30, 0x00, 0xEC, 0xEE, 0xEB, 0xBC, 0xE9, 0x76, 0x4E, 0x23, 0xB1, 0xCE, 0x05, 0x40, 0x1F,
+    0x2D, 0x0E, 0xEB, 0x84, 0x96, 0x38, 0x16, 0x5B, 0xCF, 0x4D, 0xFB, 0x1A, 0xB4, 0x74, 0x61, 0x7C,
+    0x4D, 0x67, 0x95, 0x79, 0xB5, 0x81, 0x88, 0x32, 0xDA, 0x84, 0x9D, 0xC1, 0x53, 0x21, 0xDD, 0x0A,
+    0xDE, 0x3C, 0xB3, 0xB5, 0xB8, 0x1A, 0xFC, 0x72, 0x7A, 0xB8, 0xEB, 0xC8, 0xF6, 0x7A, 0x00, 0xDD,
+    0x2E, 0x7E, 0x52, 0x06, 0x66, 0x0C, 0xFF, 0x3F, 0x8B, 0x16, 0x4B, 0x1A, 0x9B, 0x3C, 0x17, 0x5B,
+    0xD8, 0xCB, 0xA0, 0xCA, 0xF9, 0x41, 0x36, 0xD6, 0xA6, 0x08, 0x6D, 0xFC, 0xD3, 0x77, 0x14, 0x58,
+    0xF1, 0xB5, 0x3E, 0x54, 0xDB, 0xAC, 0x03, 0xAC, 0x11, 0x5C, 0x4D, 0xC6, 0xB5, 0x03, 0x5A, 0xFF,
+    0x52, 0xA8, 0xDF, 0xDC, 0x39, 0xF3, 0x6A, 0xC8, 0xB4, 0x23, 0x0B, 0x0B, 0x67, 0x1B, 0x02, 0xBA,
+    0x79, 0x03, 0x16, 0xB2, 0xA9, 0xC3, 0xA1, 0x62, 0x6B, 0x96, 0x23, 0x14, 0x6D, 0x8F, 0x94, 0xF1,
+    0xD2, 0xEA, 0x5B, 0x3A, 0x48, 0x79, 0x1E, 0x02, 0xCE, 0xE8, 0xF5, 0x2C, 0x6A, 0xB2, 0x08, 0x62,
+    0xC6, 0x85, 0x09, 0x9E, 0x5A, 0xD0, 0xE5, 0x34, 0x75, 0x81, 0xF5, 0xA7, 0x55, 0x6A, 0x31, 0x6E,
+    0x30, 0x08, 0x1B, 0xF9, 0xF1, 0x5A, 0x33, 0x36, 0x3C, 0x7D, 0xA9, 0xB5, 0x91, 0x80, 0x06, 0x34,
+    0x57, 0xD7, 0xC5, 0xA8, 0x74, 0x0F, 0x01, 0x27, 0x4C, 0x82, 0x98, 0xC6, 0x6B, 0x4F, 0xC5, 0x7F,
+    0xFF, 0xAC, 0x13, 0x4A, 0xDA, 0x73, 0x97, 0xBF, 0xEA, 0xA3, 0xF2, 0xBB, 0xE9, 0x51, 0x7D, 0x7E,
+    0xE6, 0xE9, 0x15, 0x85, 0x1D, 0x72, 0x4A, 0xB8, 0xB7, 0x99, 0x3E, 0x9F, 0x71, 0x8F, 0x18, 0x56,
+    0x9C, 0xBF, 0x45, 0x54, 0xB8, 0x14, 0x5C, 0x39, 0x7B, 0x93, 0xD8, 0x41, 0xA7, 0x00, 0x1B, 0x74,
+    0x47, 0x29, 0x29, 0xB4, 0x42, 0xCF, 0x17, 0x69, 0x43, 0xB2, 0x2E, 0x38, 0x1E, 0x11, 0xA7, 0x97,
+    0x6A, 0xB4, 0xB5, 0xDF, 0x40, 0xE6, 0x75, 0x5B, 0xC0, 0xF0, 0x80, 0xC6, 0xFF, 0x73, 0xD5, 0x45,
+    0x03, 0x04, 0x83, 0x17, 0xF4, 0x62, 0xBE, 0xF6, 0x4D, 0x25, 0x84, 0xD6, 0xB2, 0xE3, 0x34, 0x49,
+    0xDE, 0x3D, 0x67, 0xF8, 0x7A, 0x7F, 0xFB, 0xF9, 0xE5, 0x5E, 0xD1, 0x39, 0x8B, 0x9D, 0xFE, 0x7F,
+    0xE3, 0x0B, 0x8B, 0x48, 0xA0, 0x9E, 0x15, 0x82, 0x57, 0xAF, 0xBA, 0xFE, 0x65, 0xFE, 0x07, 0x7A,
+    0x3B, 0x46, 0xDE, 0x94, 0x7B, 0x69, 0x9C, 0xB0, 0x48, 0x68, 0x14, 0x45, 0xF6, 0x85, 0xBB, 0x95,
+    0x94, 0x5E, 0x2D, 0x6C, 0x38, 0x2C, 0xF8, 0x65, 0x13, 0x88, 0xA7, 0xEA, 0x05, 0xE7, 0x25, 0xAF,
+    0x13, 0xC8, 0x0F, 0xA3, 0xDB, 0x1E, 0x58, 0x28, 0x95, 0xBD, 0x34, 0x50, 0x06, 0xEF, 0xBB, 0xC9,
+    0x93, 0xA3, 0xD4, 0x2D, 0x4F, 0x07, 0x4F, 0x1D, 0xB8, 0xAF, 0x42, 0x59, 0x34, 0x8A, 0x33, 0xB0,
+    0xD5, 0x4E, 0x55, 0x79, 0x0E, 0x53, 0xCD, 0xA4, 0xE0, 0x96, 0x23, 0x8B, 0x1A, 0x04, 0xB0, 0x48,
+    0x82, 0xE8, 0xEC, 0xA8, 0xB8, 0x52, 0xAF, 0xD0, 0xFB, 0xD1, 0xF1, 0xD0, 0x50, 0xFC, 0x7B, 0x27,
+    0x38, 0xFC, 0x7A, 0xDE, 0x83, 0x50, 0x7E, 0xD3, 0xE6, 0xF5, 0x45, 0x76, 0xC5, 0x2D, 0x50, 0xB4,
+    0x69, 0xF5, 0x10, 0x91, 0xBD, 0x18, 0xB1, 0x49, 0xE4, 0x6A, 0x17, 0x45, 0xB1, 0xF1, 0x20, 0xC7,
+    0xE0, 0xC2, 0x02, 0x2D, 0x3C, 0x91, 0x16, 0x26, 0x25, 0xDE, 0x49, 0x88, 0xB3, 0xD7, 0x91, 0x7D,
+    0x21, 0xC1, 0x08, 0xDC, 0xEF, 0x52, 0x15, 0xD8, 0xE5, 0x3B, 0x58, 0xC6, 0xD9, 0x97, 0x0E, 0x7E,
+    0xD8, 0x94, 0x4F, 0xCE, 0xCA, 0xD7, 0xC7, 0x3C, 0xEF, 0xD1, 0x34, 0x3D, 0x78, 0xB6, 0x67, 0xA7,
+    0x6A, 0x13, 0x9D, 0x1E, 0x0A, 0x50, 0x67, 0xA0, 0xBF, 0x88, 0xAA, 0x34, 0xB4, 0xAA, 0x47, 0x71,
+    0x48, 0x78, 0x34, 0x42, 0xC8, 0x13, 0x1A, 0x96, 0x3E, 0x29, 0xF9, 0x9B, 0xD3, 0x87, 0xC0, 0x64,
+    0xD6, 0x5C, 0x76, 0xBF, 0xD4, 0xF2, 0x85, 0xE7, 0xB6, 0x64, 0x68, 0x47, 0x54, 0xE8, 0x1C, 0x3A,
+    0x06, 0x06, 0x83, 0xE6, 0xF2, 0x43, 0x53, 0x2A, 0x8F, 0xFE, 0x8C, 0x04, 0xB0, 0xAB, 0x70, 0xE0,
+    0xC7, 0xE3, 0x72, 0x4E, 0xB8, 0x2E, 0xA5, 0x8F, 0x1E, 0xDB, 0x80, 0xE6, 0x46, 0xDD, 0xE5, 0x55,
+    0xAB, 0xBB, 0x1C, 0xB4, 0x98, 0xD3, 0x79, 0xAF, 0xBE, 0x10, 0x9E, 0xB1, 0x33, 0x47, 0xDE, 0xF3,
+    0x46, 0x10, 0xAB, 0xBB, 0xF1, 0xDD, 0x24, 0x4E, 0x91, 0xBF, 0x6E, 0xDD, 0xE5, 0x88, 0x46, 0xDB,
+    0x44, 0x07, 0x69, 0x38, 0x2A, 0x8D, 0x48, 0xEE, 0xF3, 0xF0, 0xBE, 0xEE, 0xA4, 0x67, 0x07, 0x25,
+    0x4D, 0x39, 0x76, 0x74, 0x17, 0xBB, 0x59, 0xA7, 0x99, 0x49, 0xE7, 0x22, 0x73, 0xCD, 0x83, 0x4E,
+    0xA5, 0xDD, 0x65, 0xB7, 0x36, 0x3D, 0xDF, 0x77, 0xF9, 0xB2, 0x5C, 0xD8, 0xC7, 0x0C, 0xCF, 0x7C,
+    0x33, 0x7E, 0x28, 0x32, 0xDD, 0xAB, 0x5C, 0x27, 0x80, 0x54, 0x4C, 0xCF, 0xF4, 0x92, 0xD5, 0xFC,
+    0x28, 0x15, 0x91, 0x7B, 0x77, 0x28, 0x0E, 0x85, 0x63, 0xE2, 0x38, 0x6C, 0x10, 0xAE, 0x55, 0xB1,
+    0x76, 0x69, 0xCA, 0x0E, 0x1E, 0x86, 0x76, 0x6B, 0x40, 0xC3, 0xA9, 0xD5, 0xDC, 0xB3, 0x2E, 0xBE,
+    0x1F, 0xE9, 0x3A, 0x2C, 0xB8, 0x0B, 0xEC, 0xB4, 0xCA, 0x9E, 0x47, 0xCD, 0x0D, 0x49, 0xC3, 0xB9,
+    0x28, 0xD9, 0xBF, 0xCD, 0xB9, 0xFA, 0x66, 0xC5, 0x89, 0xD3, 0xDF, 0x04, 0xC1, 0x06, 0x31, 0xAF,
+    0xA4, 0xBC, 0xEE, 0xEB, 0x33, 0xF6, 0x2B, 0x8B, 0xCB, 0xC4, 0x51, 0x84, 0x8D, 0x94, 0xFD, 0xDC,
+    0xA8, 0xBC, 0x23, 0xDE, 0x48, 0xF1, 0xE6, 0x20, 0x20, 0x6E, 0x88, 0x6C, 0x69, 0xA0, 0x3D, 0x3B,
+    0x7F, 0xE1, 0x35, 0x16, 0x79, 0x23, 0x8E, 0x23, 0xED, 0x54, 0x7A, 0x1C, 0x90, 0x6C, 0x35, 0xD9,
+    0x31, 0xD6, 0x9B, 0xE6, 0x18, 0x41, 0x07, 0x4C, 0x0A, 0xDC, 0x57, 0x8F, 0xEB, 0x04, 0xA2, 0xB9,
+    0xDD, 0xC1, 0xBD, 0xEF, 0xD2, 0x51, 0x3D, 0x9D, 0x8B, 0x3F, 0xEC, 0x34, 0xF3, 0x0D, 0xB3, 0xAD,
+    0xBC, 0xAD, 0x62, 0xAA, 0x02, 0xF8, 0x7C, 0x21, 0xD9, 0x8F, 0x65, 0x08, 0xA1, 0x0E, 0x5F, 0x5D,
+    0xA5, 0x24, 0x5E, 0xF4, 0x9C, 0x8A, 0x24, 0xA8, 0xF7, 0xF6, 0x0A, 0xAD, 0x28, 0xAE, 0x21, 0x50,
+    0xA2, 0x2B, 0x1B, 0x6C, 0xAF, 0xDC, 0x63, 0xC4, 0x88, 0x54, 0xB6, 0x77, 0xE0, 0xC5, 0x27, 0xD6,
+    0xF3, 0x92, 0xE1, 0x81, 0x19, 0x99, 0x0E, 0x83, 0x3A, 0x17, 0x10, 0xF2, 0xB5, 0x74, 0x95, 0xB2,
+    0x87, 0x98, 0xBC, 0x75, 0xFA, 0x54, 0x2C, 0x8B, 0x26, 0xAD, 0xE9, 0xA7, 0xCA, 0x28, 0x89, 0xB9,
+    0x77, 0x5B, 0xF7, 0xC2, 0x75, 0x42, 0x73, 0x76, 0x83, 0xCA, 0x26, 0xF5, 0xB9, 0x70, 0x23, 0x6F,
+    0x5F, 0x35, 0x91, 0xCE, 0x6A, 0x5D, 0x57, 0xB8, 0xE0, 0x3C, 0x91, 0x6F, 0xC4, 0xB7, 0x30, 0x6F,
+    0xDD, 0xBD, 0xD7, 0x5F, 0x1A, 0xD2, 0xE4, 0xE7, 0x0D, 0x2B, 0x02, 0x2F, 0x61, 0x9E, 0x22, 0x4C,
+    0xFE, 0xBD, 0x1A, 0xDD, 0xE5, 0x67, 0xA2, 0x6F, 0x90, 0x4C, 0x31, 0x5E, 0x6A, 0x9F, 0x8E, 0xE8,
+    0xC1, 0xB2, 0x4E, 0xE4, 0xCA, 0x2B, 0xB8, 0x4A, 0xE8, 0xFF, 0x06, 0x91, 0x76, 0x2E, 0x51, 0x3F,
+    0x1B, 0xA5, 0x2A, 0x1C, 0xEB, 0xD4, 0x07, 0x00, 0x03, 0x40, 0x33, 0x6A, 0xD8, 0xB7, 0x5A, 0xF0,
+    0xF8, 0xF7, 0xCD, 0xCB, 0x3D, 0xB8, 0x98, 0xB4, 0x56, 0xE9, 0x20, 0xCC, 0x45, 0x0F, 0xA3, 0x76,
+    0xB1, 0x2D, 0x41, 0x9A, 0x89, 0x24, 0x7C, 0xAC, 0x62, 0xCC, 0xCF, 0xE5, 0xA1, 0xEB, 0x7E, 0x41,
+    0x64, 0x7D, 0x6D, 0xF1, 0x05, 0xC2, 0x65, 0xE9, 0xF8, 0xE8, 0xDB, 0xA0, 0xB8, 0x1A, 0x87, 0x32,
+    0x9C, 0xF7, 0x48, 0xA4, 0x83, 0x66, 0x12, 0xAC, 0x9D, 0x9D, 0xE4, 0x7B, 0xF4, 0x7A, 0x2B, 0x28,
+    0xB7, 0x12, 0x3B, 0xAC, 0x7D, 0xF4, 0xB6, 0x72, 0x87, 0x4C, 0xFC, 0x5F, 0x75, 0x4C, 0xE5, 0xE1,
+    0x6D, 0x10, 0xF8, 0xD5, 0xA2, 0x3F, 0x04, 0xB2, 0x33, 0x6A, 0x0A, 0x3C, 0x45, 0x95, 0x77, 0x5F,
+    0x20, 0x9E, 0x78, 0x91, 0xEB, 0x72, 0x6B, 0x90, 0x78, 0x9C, 0x5D, 0x47, 0xE4, 0x9A, 0xC5, 0x10,
+    0xB8, 0xE1, 0x1D, 0x5A, 0x7D, 0xF3, 0x55, 0x8F, 0x66, 0x54, 0x1D, 0x97, 0x05, 0x3F, 0xFC, 0xDA,
+    0x29, 0x04, 0x57, 0x3F, 0xD0, 0x52, 0x12, 0x3C, 0xBA, 0xF5, 0x52, 0x02, 0xE6, 0x37, 0x3A, 0xF9,
+    0xAD, 0xB7, 0x2F, 0x81, 0x8D, 0x14, 0xCC, 0x1C, 0x8C, 0x3A, 0x9D, 0x54, 0x5D, 0x75, 0xEC, 0x15,
+    0x29, 0xB4, 0xCE, 0x44, 0xDA, 0x71, 0x8B, 0xD1, 0xB6, 0x77, 0x08, 0x2E, 0x80, 0x43, 0x57, 0xF5,
+    0x94, 0x37, 0xFC, 0x11, 0x1C, 0x75, 0x62, 0xA1, 0x17, 0xB2, 0x5E, 0x54, 0xA6, 0xBD, 0xAF, 0x0B,
+    0xB4, 0x38, 0x77, 0xE8, 0x08, 0xC7, 0x93, 0xDD, 0x96, 0x83, 0x91, 0x1D, 0x4B, 0x5F, 0xE5, 0xB3,
+    0xC8, 0x28, 0xA9, 0x51, 0x5D, 0xCB, 0xCE, 0x6F, 0x7E, 0xCF, 0xBE, 0x4D, 0x5D, 0x46, 0xB0, 0x02,
+    0xFA, 0xAF, 0x6E, 0x0A, 0x5B, 0xA4, 0x6D, 0x35, 0xEB, 0x78, 0x31, 0xB3, 0x36, 0x05, 0xD2, 0x84,
+    0xBD, 0xB7, 0x38, 0x47, 0xCA, 0x47, 0x07, 0xA5, 0x9B, 0x67, 0x45, 0x3E, 0x10, 0x82, 0x05, 0xE7,
+    0x7B, 0x80, 0xA9, 0x55, 0x34, 0x44, 0x6A, 0xC7, 0x84, 0x24, 0x4F, 0xAA, 0xD5, 0x7D, 0x78, 0xF7,
+    0x16, 0x43, 0xC1, 0xD5, 0x20, 0x83, 0xD7, 0xB0, 0x51, 0x14, 0xC6, 0xF4, 0xD5, 0xCB, 0x62, 0xDE,
+    0xE4, 0xAD, 0x47, 0xB5, 0xE5, 0x57, 0xCA, 0x9D, 0x76, 0x10, 0x35, 0xDE, 0x8F, 0xDA, 0x2B, 0x0A,
+    0xF8, 0x65, 0x90, 0xDB, 0xF5, 0x3D, 0x2E, 0xDE, 0x1F, 0xF5, 0x6C, 0xF4, 0x2B, 0x2E, 0x18, 0x1C,
+    0xD5, 0x97, 0xC2, 0xDE, 0xC2, 0xD8, 0xE1, 0x79, 0x43, 0xC8, 0xFC, 0x9A, 0x2A, 0xF3, 0x14, 0x28,
+    0x0E, 0xB6, 0x08, 0xE1, 0xE8, 0xF1, 0x76, 0xB9, 0xA5, 0x57, 0x5C, 0x81, 0x19, 0x27, 0xA5, 0x80,
+    0x16, 0x0A, 0x5E, 0xDC, 0xCC, 0xE1, 0xBD, 0x8B, 0xC5, 0xEC, 0x07, 0xFF, 0x53, 0x3B, 0xB1, 0x1D,
+    0xAD, 0x02, 0xAB, 0xB6, 0x04, 0x7B, 0xA1, 0x2E, 0x3F, 0x07, 0x19, 0xD5, 0x82, 0xDA, 0x77, 0x22,
+    0x80, 0x31, 0x20, 0xDA, 0x83, 0xDB, 0x56, 0x22, 0x88, 0x89, 0x44, 0x53, 0x87, 0x67, 0xAE, 0x30,
+    0x50, 0x4C, 0xD0, 0x90, 0x8B, 0x45, 0x23, 0xCE, 0x41, 0x39, 0x03, 0xDE, 0xE6, 0xD3, 0xFC, 0x28,
+    0x19, 0x3E, 0x0B, 0xD2, 0x2E, 0x96, 0xAC, 0x8D, 0xD0, 0x8E, 0x29, 0x48, 0x58, 0xA2, 0xD4, 0x17,
+    0x65, 0x4B, 0x75, 0x4C, 0x48, 0x43, 0x34, 0x43, 0x3A, 0xDD, 0xCE, 0xC5, 0xF0, 0xF4, 0x6C, 0xB8,
+    0xDD, 0xF3, 0x3E, 0x34, 0x50, 0x2A, 0x8C, 0x6C, 0x90, 0x96, 0x1E, 0x21, 0x61, 0x13, 0x42, 0xA5,
+    0x12, 0x0F, 0x73, 0x02, 0xBA, 0x9E, 0xFF, 0x47, 0x83, 0xDB, 0xE4, 0x16, 0x90, 0xD9, 0x0A, 0x40,
+    0x84, 0xCA, 0xD2, 0x03, 0x05, 0xD8, 0x64, 0xB2, 0x3D, 0x8A, 0x42, 0x02, 0x8C, 0x88, 0xDF, 0xEE,
+    0x5A, 0x47, 0xF1, 0xF4, 0x82, 0x6E, 0x61, 0xD5, 0xF5, 0xA3, 0x58, 0x21, 0x6B, 0xEE, 0x8F, 0xE2,
+    0xEB, 0x07, 0x39, 0xA9, 0x71, 0xFC, 0x55, 0x39, 0x37, 0x4D, 0xD2, 0x41, 0xC5, 0x33, 0xF7, 0xF5,
+    0xED, 0x67, 0xA7, 0x42, 0xAD, 0x61, 0xEC, 0xE2, 0x9D, 0xB9, 0x13, 0x4B, 0xF5, 0x14, 0xB0, 0xE1,
+    0x47, 0x06, 0x2B, 0x65, 0xCD, 0x09, 0x31, 0x46, 0x47, 0xFE, 0x1B, 0xB5, 0xD8, 0x53, 0x04, 0x28,
+    0x5C, 0x3F, 0x46, 0x28, 0xCD, 0xB9, 0x87, 0x9A, 0xB0, 0xE2, 0x49, 0xA6, 0xCF, 0x56, 0x8D, 0x52,
+    0xD5, 0x05, 0xCD, 0x0C, 0x3D, 0x45, 0x11, 0x18, 0x84, 0x38, 0x98, 0xD4, 0xD3, 0x2D, 0xD0, 0x2A,
+    0xAD, 0xF4, 0x7A, 0xAB, 0xBF, 0xF4, 0xA8, 0x9F, 0x7A, 0xB7, 0x73, 0xC0, 0xEC, 0xF5, 0x3E, 0x87,
+    0x9F, 0x12, 0xEF, 0xB8, 0xAC, 0x19, 0x34, 0xB9, 0x72, 0xB9, 0x6B, 0xF3, 0xBB, 0x08, 0x8E, 0x7F,
+    0xEC, 0x24, 0x1A, 0xF4, 0x00, 0xC0, 0xD4, 0x27, 0xB1, 0x3B, 0x05, 0x68, 0xD4, 0x30, 0xD2, 0x21,
+    0x63, 0xD8, 0x33, 0x6C, 0xDC, 0xA9, 0x3E, 0x7C, 0xA4, 0xE0, 0x43, 0xC9, 0x80, 0xA3, 0xCA, 0x35,
+    0x72, 0x10, 0xF1, 0xEA, 0xCD, 0xA2, 0xDB, 0x02, 0x5A, 0xEE, 0x52, 0x5E, 0x31, 0x33, 0x2C, 0x68,
+    0x3A, 0xBE, 0x34, 0x5E, 0xCE, 0xF2, 0x23, 0xE7, 0x4D, 0xCF, 0x71, 0xD4, 0x3E, 0x8C, 0x4E, 0x08,
+    0x82, 0xF5, 0x01, 0xE9, 0xF8, 0x35, 0xFC, 0x88, 0xFE, 0xC1, 0x1E, 0x67, 0x95, 0x44, 0x45, 0xF8,
+    0x67, 0xB8, 0x91, 0xF0, 0x8E, 0x6C, 0xE4, 0x57, 0xA6, 0xDB, 0x56, 0xE3, 0x6C, 0x18, 0x37, 0x0C,
+    0x48, 0x49, 0xB5, 0x7E, 0x51, 0x7A, 0x46, 0x0E, 0xD4, 0x8E, 0x2B, 0x93, 0x63, 0x6B, 0xEC, 0xE5,
+    0x5B, 0x72, 0x49, 0xB2, 0x3D, 0x24, 0xAA, 0x59, 0xAF, 0x1B, 0x0A, 0x82, 0xE8, 0x56, 0xC1, 0x56,
+    0x46, 0x9F, 0xB2, 0x5B, 0x8D, 0x4E, 0x45, 0x34, 0x49, 0xE6, 0xDA, 0xEF, 0x43, 0x53, 0x11, 0x41,
+    0x12, 0x82, 0xB9, 0xA8, 0xCC, 0x95, 0x8E, 0x5F, 0xD3, 0xB9, 0xA0, 0x53, 0xC5, 0x6E, 0x75, 0xC0,
+    0x50, 0xF8, 0xC8, 0xA8, 0x19, 0xEE, 0x17, 0x6F, 0xD0, 0xB1, 0xA6, 0xD3, 0xC5, 0x39, 0x5E, 0x68,
+    0xCA, 0x7D, 0x17, 0x17, 0x46, 0x83, 0xF3, 0x84, 0x05, 0x36, 0xB8, 0xE2, 0xD4, 0x20, 0xC0, 0x86,
+    0xCE, 0xB3, 0xC2, 0x4D, 0xE8, 0xE8, 0x1A, 0x7E, 0x06, 0x1C, 0xE1, 0xA9, 0x55, 0xCB, 0x2A, 0x88,
+    0xC5, 0x5A, 0xE1, 0x15, 0x74, 0x1E, 0x31, 0x0E, 0xCE, 0xA9, 0x7D, 0xA4, 0xCB, 0xF1, 0x7B, 0xCD,
+    0x56, 0x54, 0xF2, 0xDC, 0xD7, 0xE8, 0x59, 0x5C, 0xC1, 0x47, 0x6D, 0xB5, 0x3A, 0xB7, 0x4F, 0x30,
+    0x90, 0x10, 0x7F, 0xD7, 0x16, 0xC2, 0xD5, 0xA2, 0x36, 0x10, 0x1A, 0x71, 0x19, 0x4A, 0x6F, 0xFF,
+    0x5E, 0x4E, 0xC1, 0x2B, 0xC1, 0x96, 0xE4, 0x2A, 0x2A, 0xEB, 0x60, 0x9C, 0x4B, 0x11, 0x97, 0xED,
+    0xEA, 0x6E, 0x83, 0xA3, 0x8B, 0x17, 0xEB, 0x42, 0xC8, 0x18, 0x40, 0x61, 0xB0, 0x26, 0x72, 0xAC,
+    0xA2, 0x49, 0xA4, 0x9C, 0xD1, 0x32, 0x8E, 0xCF, 0x80, 0x71, 0xF1, 0x20, 0x47, 0xA5, 0x28, 0xD4,
+    0xC8, 0x1E, 0xF1, 0xB0, 0xD2, 0x15, 0x21, 0xBF, 0x9C, 0x57, 0x88, 0xED, 0x30, 0x6F, 0x69, 0x3A,
+    0xB4, 0x14, 0x16, 0x98, 0x17, 0xC1, 0xC2, 0x36, 0x16, 0x54, 0x02, 0xB7, 0x42, 0x0C, 0x88, 0x45,
+    0x5E, 0x90, 0x89, 0xD6, 0xE3, 0xDB, 0x0F, 0xF6, 0x07, 0xC8, 0x5B, 0x89, 0x8E, 0x24, 0xA0, 0x9D,
+    0xB7, 0xC6, 0xEC, 0x7E, 0xDB, 0xC1, 0xAC, 0x38, 0xB3, 0x26, 0xD9, 0xFE, 0x8A, 0xC2, 0x76, 0xDD,
+    0x01, 0x41, 0x30, 0x2D, 0x75, 0xDC, 0xE8, 0x60, 0x0B, 0xEF, 0xCC, 0xBA, 0x41, 0x85, 0xFC, 0x34,
+    0x59, 0x4C, 0xA4, 0x13, 0x10, 0x7D, 0xF6, 0xE0, 0x00, 0x14, 0x86, 0x95, 0xF0, 0x00, 0x41, 0xDF,
+    0xBD, 0xB5, 0x00, 0xDB, 0xDC, 0x8F, 0x5B, 0x75, 0xDE, 0x5F, 0x75, 0xFC, 0x11, 0x7A, 0xC0, 0x0D,
+    0xA2, 0xDB, 0xB8, 0x53, 0x59, 0x0B, 0xFE, 0xAF, 0x45, 0xDD, 0xB7, 0x72, 0x87, 0x2C, 0x4B, 0x04,
+    0xCE, 0xC3, 0x37, 0x54, 0x9D, 0x62, 0xC3, 0x6A, 0x4D, 0x71, 0xAB, 0xF4, 0x85, 0xA5, 0x89, 0xD1,
+    0xC9, 0xFB, 0x8C, 0x23, 0x70, 0x36, 0x75, 0x74, 0x5A, 0x6C, 0xD4, 0x50, 0x5C, 0xD0, 0x49, 0xCC,
+    0x9B, 0x27, 0x8C, 0x99, 0xC9, 0x55, 0x9C, 0x48, 0xD1, 0x40, 0x91, 0xD9, 0x1F, 0xA2, 0x4F, 0xBB,
+    0x87, 0x42, 0xA5, 0xDA, 0xC5, 0xCB, 0x13, 0xA4, 0x9C, 0xFB, 0xD1, 0xD7, 0xB9, 0x90, 0xEF, 0xF5,
+    0x03, 0x92, 0xCD, 0x7B, 0xF9, 0x76, 0xF4, 0xF8, 0x76, 0x2E, 0x99, 0x13, 0x33, 0x61, 0xE1, 0x72,
+    0x92, 0x4A, 0x9E, 0x8F, 0x20, 0xCE, 0x37, 0xC7, 0x17, 0x0F, 0xFF, 0x25, 0xDF, 0x16, 0xD4, 0xAF,
+    0xD2, 0x47, 0x65, 0x4E, 0x2B, 0x0E, 0xBE, 0x45, 0x58, 0x8D, 0xFA, 0x7D, 0x59, 0x9D, 0xAE, 0x4E,
+    0x7D, 0x9F, 0x8B, 0x40, 0x5E, 0x1D, 0x0C, 0x23, 0xAE, 0xC9, 0xFD, 0x9E, 0x61, 0x38, 0xF8, 0x81,
+    0xC5, 0x71, 0xD4, 0x6B, 0x24, 0xB6, 0x96, 0xDC, 0xC9, 0x1B, 0xD1, 0x7C, 0x84, 0xFD, 0x79, 0xEE,
+    0x7B, 0x34, 0x82, 0xA9, 0x01, 0xB1, 0x76, 0x61, 0x65, 0xDA, 0x74, 0x94, 0x93, 0x38, 0x1D, 0x23,
+    0x3E, 0x69, 0x24, 0x4C, 0xA4, 0x9F, 0x4D, 0x04, 0xDA, 0x99, 0x32, 0x56, 0x81, 0x8D, 0x75, 0xDE,
+    0x53, 0x09, 0x51, 0x6E, 0x31, 0x81, 0x0B, 0x1B, 0x18, 0xA3, 0xFF, 0xDF, 0x76, 0x7D, 0x57, 0x97,
+    0x62, 0x8C, 0x48, 0x3B, 0x99, 0x1C, 0xA2, 0x8A, 0x16, 0xDA, 0x2D, 0x07, 0xEB, 0xE8, 0x2F, 0xAE,
+    0x4E, 0xCF, 0xB4, 0xA1, 0xAD, 0xB2, 0xC5, 0xEB, 0x2C, 0x69, 0x8B, 0x3F, 0x02, 0xD8, 0x8E, 0x17,
+    0x5E, 0xED, 0x51, 0xD9, 0x2A, 0x95, 0xAA, 0x3C, 0x61, 0x18, 0x67, 0x69, 0x8B, 0x1B, 0x5D, 0x60,
+    0x88, 0xCF, 0x6C, 0x61, 0x96, 0xD5, 0x2C, 0xCD, 0xF2, 0x8A, 0xA5, 0x8E, 0x66, 0xC2, 0x18, 0x27,
+    0x51, 0xA6, 0x4E, 0xDE, 0x95, 0x18, 0xBD, 0xC7, 0xDC, 0x52, 0x9F, 0xC0, 0x74, 0xBA, 0xD8, 0xF2,
+    0x1C, 0x2B, 0x5C, 0x01, 0x29, 0xE4, 0x9D, 0xEE, 0xD5, 0xF6, 0xFF, 0x0E, 0x7C, 0x0D, 0x9E, 0x07,
+    0x29, 0xF5, 0xED, 0xD7, 0x37, 0xA0, 0x57, 0x1A, 0x54, 0x3E, 0x15, 0xB6, 0xEC, 0x97, 0x27, 0x32,
+    0xEA, 0x32, 0xC6, 0xB6, 0xBB, 0xF6, 0x2F, 0x0C, 0x12, 0x74, 0x0E, 0xFA, 0x75, 0x94, 0xD0, 0x11,
+    0x79, 0xEE, 0xE4, 0xBD, 0x9C, 0x0E, 0x34, 0xFA, 0xA9, 0x66, 0x14, 0x89, 0xDA, 0x0E, 0x20, 0x65,
+    0x4A, 0x68, 0x5B, 0xE8, 0xAE, 0x51, 0x4F, 0x9E, 0x18, 0x5D, 0x6F, 0x7C, 0x16, 0xD3, 0x76, 0x6C,
+    0xBE, 0x5E, 0x2D, 0x95, 0x95, 0x0B, 0x08, 0x07, 0x35, 0xD3, 0x09, 0xCB, 0x68, 0x31, 0x13, 0x0C,
+    0x5B, 0xED, 0x4A, 0xE2, 0x0F, 0x8B, 0x5B, 0x68, 0xDC, 0x33, 0xA6, 0x83, 0x98, 0x6B, 0x85, 0x06,
+    0x16, 0xF3, 0xFE, 0xED, 0x60, 0x4E, 0x52, 0x6D, 0x71, 0x91, 0x88, 0x43, 0xBE, 0xEF, 0xC4, 0xAD,
+    0x13, 0x42, 0x18, 0x50, 0x71, 0x34, 0x1A, 0x18, 0xE0, 0x83, 0x5F, 0xD0, 0xE3, 0x68, 0xAD, 0x85,
+    0xFB, 0x81, 0x9A, 0xCE, 0x38, 0x25, 0xFE, 0xDF, 0xE8, 0xE9, 0xE4, 0x89, 0xE9, 0x38, 0x6D, 0x99,
+    0xA4, 0x7C, 0x05, 0xB6, 0xB6, 0x5C, 0x96, 0x70, 0xDE, 0x62, 0xE5, 0x6F, 0x91, 0x19, 0xFF, 0x84,
+    0x14, 0x5E, 0xD4, 0xCC, 0xE9, 0x99, 0x89, 0xF5, 0x72, 0x72, 0x83, 0x9D, 0xEF, 0x8B, 0xA3, 0x63,
+    0xEA, 0x76, 0x7A, 0xF2, 0xD5, 0x1D, 0x50, 0xC9, 0x1B, 0xBC, 0x4D, 0x77, 0xB3, 0xDA, 0x1E, 0x8B,
+    0x1B, 0x39, 0x04, 0xB5, 0x1A, 0x42, 0xDD, 0x18, 0xE5, 0xE3, 0x5F, 0xFD, 0x05, 0x9B, 0xBE, 0x01,
+    0xA5, 0xAD, 0x0A, 0x9A, 0x62, 0xBB, 0xE2, 0x43, 0xAB, 0x14, 0x96, 0xD2, 0xCC, 0xBE, 0xA9, 0x0C,
+    0xE8, 0xBF, 0x40, 0x04, 0x01, 0xD5, 0x34, 0x5F, 0x25, 0x25, 0x2B, 0xD2, 0x76, 0xA4, 0x60, 0x6F,
+    0xF2, 0xE6, 0x5C, 0x35, 0x44, 0x06, 0x36, 0x8D, 0xBA, 0xD5, 0xD7, 0x9F, 0x13, 0xC8, 0xF1, 0x0B,
+    0x0A, 0x40, 0xED, 0xD2, 0x40, 0x93, 0xCE, 0x4E, 0x15, 0x78, 0xF1, 0x92, 0x59, 0xDB, 0xE9, 0x1B,
+    0x1E, 0x91, 0xF3, 0xCA, 0x22, 0x00, 0x28, 0xE6, 0xCE, 0xF1, 0x4E, 0x77, 0x2B, 0xF5, 0xFC, 0x2E,
+    0x90, 0xAA, 0xFA, 0x47, 0x00, 0xEC, 0x42, 0x45, 0x8B, 0xD0, 0xD8, 0xAA, 0x06, 0x0A, 0x79, 0xD3,
+    0xBB, 0xAE, 0xDA, 0xE6, 0xF2, 0x7E, 0x15, 0x34, 0xA7, 0x10, 0xB9, 0xAD, 0xC7, 0x24, 0x25, 0xFF,
+    0xF1, 0xDD, 0x12, 0x68, 0xFA, 0x93, 0xAF, 0x55, 0xEB, 0xEC, 0xA0, 0xAB, 0x48, 0x66, 0xBB, 0x2C,
+    0x15, 0x9A, 0x36, 0xD9, 0xC4, 0x6C, 0x6B, 0x9E, 0x8B, 0x55, 0x67, 0x03, 0xE4, 0xAE, 0x23, 0xB0,
+    0x89, 0x92, 0xDD, 0x04, 0x3A, 0xEB, 0xFA, 0x43, 0x00, 0xA5, 0x03, 0x32, 0x25, 0x86, 0x02, 0x37,
+    0xCD, 0xCA, 0xF2, 0x88, 0x22, 0x41, 0x93, 0x31, 0x75, 0x6C, 0xA1, 0x66, 0xD5, 0xC8, 0x26, 0x2C,
+    0x30, 0x4F, 0xED, 0xF2, 0x07, 0xA6, 0x4F, 0x85, 0x0C, 0xBC, 0xEC, 0xA6, 0xE5, 0x8A, 0xBA, 0x1C,
+    0xCA, 0xF6, 0x22, 0x65, 0xDD, 0x7A, 0x65, 0x85, 0x2C, 0x5A, 0xF3, 0xDC, 0xAD, 0xB6, 0xC3, 0xF8,
+    0x03, 0x2A, 0x0B, 0x01, 0xB2, 0x38, 0x96, 0xF7, 0x2F, 0xFA, 0xD6, 0x6B, 0xD9, 0x5C, 0x0C, 0xCD,
+    0x3F, 0xE4, 0xB9, 0x8B, 0xA7, 0x51, 0x23, 0x8A, 0xCE, 0x08, 0xD5, 0xDB, 0x19, 0xF6, 0xF4, 0x92,
+    0xF8, 0xE2, 0x6B, 0xB0, 0xC6, 0x3D, 0x2E, 0xE7, 0xF1, 0x84, 0xA1, 0x12, 0x07, 0x14, 0x50, 0xBB,
+    0x86, 0x8D, 0x59, 0xBD, 0x6C, 0xE3, 0x3B, 0xA6, 0xEF, 0xF9, 0xD4, 0x3B, 0x1F, 0x1D, 0x39, 0xBF,
+    0xB6, 0xFD, 0xF2, 0x22, 0x00, 0xBC, 0xF5, 0xA8, 0x48, 0xFF, 0x65, 0xF4, 0xD0, 0xD5, 0x5E, 0x47,
+    0x47, 0x82, 0xF6, 0xC5, 0x88, 0x95, 0xE7, 0x65, 0xA7, 0x89, 0x2D, 0x6C, 0x1C, 0xCA, 0x2D, 0x30,
+    0xE7, 0xD5, 0x77, 0xBA, 0xA4, 0x08, 0x03, 0x8B, 0x2D, 0x2D, 0x5A, 0xA3, 0xA5, 0x1D, 0x00, 0x62,
+    0x61, 0xC8, 0x6D, 0x9B, 0xF9, 0x61, 0xF1, 0x0A, 0x8C, 0x2B, 0x48, 0x10, 0x66, 0x9D, 0x41, 0xC8,
+    0x5A, 0xE3, 0x7C, 0xC1, 0x24, 0x09, 0x93, 0xE3, 0x71, 0x53, 0x2D, 0x44, 0xA5, 0x9A, 0xE1, 0xCF,
+    0xBE, 0x89, 0x35, 0x1E, 0x7A, 0x22, 0x71, 0xD4, 0x68, 0x4D, 0x7F, 0xBD, 0x4D, 0x67, 0x76, 0x03,
+    0xA8, 0x56, 0x12, 0xC7, 0x6B, 0x84, 0x81, 0xBB, 0x0B, 0x3A, 0x6A, 0xE2, 0x0F, 0x9D, 0xA0, 0xD6,
+    0x2E, 0x88, 0xA9, 0x64, 0xE7, 0xF0, 0x28, 0x78, 0xCD, 0x26, 0xBB, 0x4B, 0xE5, 0xFB, 0xB8, 0xD1,
+    0x63, 0xA2, 0x99, 0x76, 0x50, 0xCE, 0xF6, 0xC1, 0x96, 0xE0, 0x1A, 0x4E, 0x1B, 0xC6, 0x09, 0x58,
+    0x3B, 0xE6, 0xFF, 0x75, 0x96, 0x80, 0x8D, 0x85, 0x2B, 0x90, 0x01, 0x06, 0x8D, 0xB0, 0x42, 0x7E,
+    0xF5, 0x25, 0xAD, 0x24, 0xB1, 0x88, 0x9C, 0x1A, 0x24, 0x8A, 0x68, 0x5A, 0xD5, 0x24, 0x94, 0x78,
+    0xB2, 0x1A, 0xB9, 0xC3, 0xA2, 0x19, 0x92, 0x91, 0x1A, 0x77, 0x66, 0xD6, 0x6B, 0xF5, 0x5A, 0x49,
+    0xC7, 0xAA, 0x44, 0x41, 0x43, 0xF3, 0xE9, 0xC3, 0x5F, 0x16, 0x43, 0x7D, 0x15, 0xF5, 0x0A, 0xC2,
+    0x8A, 0x50, 0x64, 0x01, 0x7B, 0x8C, 0x09, 0x85, 0xDD, 0x22, 0xE3, 0x9E, 0xA9, 0x46, 0x1E, 0x02,
+    0xE4, 0x01, 0xB0, 0x5D, 0xB8, 0xE8, 0x14, 0xEB, 0x4E, 0x29, 0x23, 0xDE, 0xAE, 0x62, 0x45, 0x01,
+    0xC8, 0x25, 0x87, 0x18, 0xB3, 0xF9, 0xAD, 0x03, 0x3E, 0x59, 0x49, 0x71, 0xA9, 0xC7, 0x27, 0xD7,
+    0xBA, 0x65, 0xCD, 0x27, 0x1E, 0x50, 0xE0, 0xD8, 0x8F, 0x84, 0x6B, 0x0F, 0x6C, 0x12, 0x36, 0x04,
+    0x6B, 0x5D, 0xE3, 0x7D, 0xD5, 0x53, 0xAF, 0xBC, 0xB0, 0x82, 0x21, 0x58, 0xC9, 0xFF, 0xDF, 0x87,
+    0x18, 0x09, 0x4B, 0x79, 0x50, 0xB4, 0x5F, 0x9B, 0xF7, 0x94, 0xAA, 0x7F, 0xB5, 0x03, 0x29, 0x58,
+    0x60, 0xD4, 0xC9, 0x39, 0xC1, 0x58, 0x21, 0xE8, 0xF5, 0x2D, 0x49, 0x58, 0xB1, 0x25, 0xE9, 0x82,
+    0x15, 0xB7, 0xDD, 0x8E, 0x3D, 0x28, 0x1F, 0x97, 0xE5, 0xDA, 0x2B, 0x33, 0xB9, 0x2F, 0x08, 0x29,
+    0x80, 0x87, 0xA2, 0xB7, 0x80, 0x33, 0x2A, 0xE5, 0xD5, 0x49, 0x7B, 0x84, 0x13, 0x66, 0x7D, 0xE3,
+    0x1B, 0x92, 0x9F, 0x90, 0xCE, 0x74, 0x67, 0x4C, 0xC3, 0x74, 0xC0, 0x75, 0x86, 0x63, 0x4C, 0x5E,
+    0xA1, 0x42, 0xAC, 0xC7, 0x9B, 0x65, 0x17, 0x23, 0x6D, 0x50, 0x19, 0xF9, 0x99, 0x15, 0xA8, 0x73,
+    0x0E, 0x28, 0xBA, 0x2C, 0x9A, 0xC0, 0x35, 0x13, 0x16, 0xBC, 0x12, 0x09, 0x0F, 0xF3, 0x0C, 0xE3,
+    0xE1, 0x27, 0x63, 0x75, 0x60, 0xD3, 0xA8, 0xB9, 0xAD, 0x10, 0x18, 0xC3, 0x52, 0x36, 0xED, 0xF4,
+    0xA4, 0x22, 0x4C, 0xC0, 0x24, 0x36, 0xD5, 0xBC, 0xDF, 0xD5, 0x5A, 0xC2, 0xA1, 0x23, 0x6F, 0x2F,
+    0x1A, 0xA2, 0x31, 0x97, 0x24, 0xB8, 0x67, 0xD7, 0x4B, 0x53, 0x50, 0x19, 0x6A, 0xDF, 0x40, 0x21,
+    0xCB, 0x2F, 0x43, 0xD1, 0xD2, 0x68, 0x6B, 0x76, 0x07, 0x8B, 0xA4, 0xC8, 0xD0, 0x5E, 0xAF, 0x22,
+    0x51, 0x13, 0x34, 0x1F, 0x26, 0xAC, 0x7D, 0xC2, 0x6E, 0x6D, 0x21, 0x98, 0xFC, 0x3B, 0xC2, 0x95,
+    0xAD, 0x74, 0xCB, 0xF0, 0xC0, 0xB7, 0xD0, 0xAE, 0x86, 0x46, 0x5D, 0x84, 0xED, 0xEB, 0xB8, 0x64,
+    0x66, 0x2A, 0xA7, 0xA1, 0xE3, 0xCB, 0x48, 0x7D, 0xD8, 0x2E, 0xCE, 0x7B, 0x37, 0xD2, 0x24, 0xB5,
+    0x80, 0x31, 0x0C, 0x77, 0x24, 0x4E, 0x96, 0x59, 0x99, 0x05, 0x80, 0xCF, 0x13, 0x15, 0x4A, 0x97,
+    0x43, 0x6F, 0x45, 0xB9, 0xE8, 0x45, 0x46, 0x90, 0x98, 0x49, 0xC1, 0x83, 0x85, 0x4B, 0x67, 0x7E,
+    0x58, 0x78, 0x9E, 0x69, 0x9C, 0xDF, 0x1F, 0xEC, 0xC5, 0x01, 0xB3, 0x5D, 0x51, 0xF9, 0xCE, 0x84,
+    0x19, 0x5C, 0x67, 0xC1, 0xCE, 0x26, 0x4A, 0xAD, 0xBF, 0x23, 0x00, 0x43, 0x78, 0x3C, 0x2A, 0x0C,
+    0xAE, 0xFC, 0x0A, 0x9A, 0x46, 0x2D, 0x37, 0x80, 0xCB, 0xB2, 0xBE, 0x8B, 0x5D, 0xAE, 0x21, 0x11,
+    0xAC, 0xDE, 0x6F, 0xC1, 0x8D, 0xFB, 0xA1, 0xCF, 0xBA, 0x72, 0xCF, 0x81, 0xD7, 0x74, 0x1A, 0x10,
+    0x82, 0x2A, 0x5F, 0xFB, 0xE0, 0x22, 0xD5, 0x7B, 0x5A, 0x62, 0xB3, 0x4B, 0x5D, 0x94, 0x9C, 0xFE,
+    0xFE, 0x7E, 0xFE, 0xC9, 0x1F, 0xA7, 0x9B, 0xBB, 0x8F, 0x42, 0x26, 0x8E, 0x96, 0x70, 0x2C, 0xD0,
+    0x20, 0xE3, 0xC7, 0xC0, 0x29, 0x4C, 0xCE, 0x37, 0x67, 0x77, 0x51, 0x22, 0x43, 0x83, 0xEA, 0x36,
+    0x85, 0xEA, 0xCD, 0x08, 0x28, 0xC7, 0x36, 0x8E, 0xF6, 0x5F, 0x34, 0x65, 0x02, 0x61, 0xAC, 0xB5,
+    0x42, 0xE3, 0xD6, 0x8D, 0x9B, 0xFC, 0x2F, 0x5A, 0xBA, 0xC4, 0x84, 0x10, 0x42, 0xCE, 0xBB, 0x8C,
+    0x48, 0xF6, 0xD1, 0x0A, 0xDA, 0x45, 0x8D, 0x47, 0x6C, 0x18, 0xBB, 0x87, 0xB6, 0x35, 0xDB, 0xDE,
+    0x01, 0x79, 0x5E, 0x0C, 0x94, 0xFC, 0xF0, 0x9B, 0x61, 0x77, 0xEF, 0x6C, 0x36, 0xE9, 0x85, 0x54,
+    0xC8, 0x37, 0x1F, 0x35, 0x85, 0x8B, 0x22, 0x53, 0x02, 0xF4, 0xBA, 0x09, 0x5E, 0xD9, 0x4A, 0x74,
+    0xE5, 0x62, 0x7C, 0xE0, 0x41, 0xC9, 0x02, 0xA2, 0xAB, 0x9E, 0x0B, 0x53, 0xB7, 0x04, 0xAF, 0xBF,
+    0x4A, 0xC3, 0x88, 0x53, 0x13, 0xE5, 0xED, 0xC7, 0x2D, 0x35, 0x4E, 0x7F, 0xA5, 0x34, 0xA7, 0xB3,
+    0x3B, 0xEB, 0x7B, 0x60, 0xB1, 0x0B, 0xB3, 0xA0, 0x32, 0x02, 0xBB, 0x31, 0x34, 0x7B, 0xE5, 0x91,
+    0x1F, 0x48, 0xE0, 0x7F, 0x94, 0x95, 0x3C, 0xA4, 0x36, 0x86, 0x31, 0x3A, 0x77, 0xA0, 0xDA, 0x50,
+    0x15, 0xB9, 0x13, 0xA0, 0x35, 0x27, 0x70, 0xCC, 0x19, 0xF3, 0x89, 0x22, 0x7C, 0x35, 0xF1, 0xF0,
+    0xCE, 0xCF, 0x3B, 0x15, 0x39, 0xB7, 0xE1, 0x11, 0xB4, 0xFC, 0x4E, 0x02, 0x60, 0x05, 0xBB, 0x7E,
+    0x08, 0x01, 0x8B, 0xB5, 0x77, 0x87, 0x70, 0x60, 0xDB, 0x38, 0x52, 0x31, 0x6B, 0x11, 0x41, 0xBF,
+    0x1B, 0xCB, 0x67, 0x84, 0xC9, 0x7B, 0xA1, 0xBA, 0xA3, 0x2F, 0x21, 0xEC, 0x0D, 0x89, 0x5A, 0x75,
+    0x36, 0x20, 0x82, 0xC6, 0xC1, 0x93, 0x12, 0xD6, 0x11, 0x22, 0xBF, 0x9F, 0x0E, 0x59, 0xFC, 0xFB,
+    0xA0, 0x20, 0x47, 0xC7, 0x9A, 0x98, 0xB8, 0x1F, 0x95, 0x1D, 0x4C, 0x5B, 0x97, 0xEF, 0x92, 0x40,
+    0xAB, 0xB7, 0x21, 0x60, 0xE4, 0x65, 0xCF, 0xAC, 0xD8, 0x34, 0x91, 0x83, 0xD2, 0x71, 0xAA, 0xFC,
+    0xAB, 0xA8, 0xF5, 0x6A, 0x05, 0x86, 0x01, 0x56, 0x72, 0x8F, 0x5B, 0xAA, 0x51, 0x6B, 0x3F, 0xA3,
+    0x32, 0xA3, 0xE4, 0x99, 0xED, 0x38, 0x43, 0x46, 0x8D, 0x61, 0x80, 0x88, 0xC3, 0xEF, 0xAA, 0xF6,
+    0xAA, 0x6F, 0x34, 0xA1, 0xD7, 0x81, 0x4C, 0x9C, 0xD7, 0xEC, 0xE0, 0x9E, 0x26, 0x6B, 0x2C, 0xF8,
+    0xC0, 0xD5, 0x0B, 0xA1, 0x73, 0xA7, 0xBD, 0x4B, 0x68, 0xD0, 0xFB, 0x75, 0xF3, 0x1C, 0x9C, 0x26,
+    0xC3, 0x60, 0xB2, 0x11, 0x81, 0xFE, 0x12, 0x13, 0xC4, 0x6B, 0xE5, 0x52, 0x72, 0x00, 0x26, 0x4E,
+    0x7A, 0xFF, 0x2C, 0x20, 0xCB, 0x32, 0xAA, 0xE4, 0xEE, 0x6B, 0x89, 0x52, 0xC5, 0x2B, 0xDC, 0xFA,
+    0x1B, 0x52, 0x4D, 0x8E, 0x02, 0xDB, 0x84, 0x4E, 0x7C, 0x37, 0xBA, 0xFF, 0xDC, 0x8D, 0x3F, 0xC6,
+    0xBE, 0x5C, 0x1D, 0x85, 0xF3, 0xE3, 0x4A, 0x83, 0x28, 0x61, 0xB3, 0xC0, 0xF6, 0x05, 0x8B, 0x8A,
+    0xE8, 0xED, 0x3E, 0x92, 0x70, 0x9A, 0xFB, 0xF3, 0x5B, 0x39, 0x3A, 0x3B, 0x3E, 0x33, 0x25, 0x01,
+    0x15, 0x86, 0x5B, 0x17, 0x14, 0x42, 0xBD, 0x83, 0xD5, 0x8B, 0x7E, 0xA8, 0xFC, 0xF9, 0x26, 0x1D,
+    0xEC, 0xD9, 0xE4, 0x25, 0xCC, 0x3A, 0x3A, 0xD7, 0x07, 0x7C, 0x59, 0x87, 0xC2, 0x4F, 0x7C, 0x7E,
+    0xDD, 0x4F, 0x02, 0x4B, 0x46, 0xBA, 0xFD, 0x1A, 0x26, 0x46, 0x01, 0x3C, 0x26, 0xDF, 0x38, 0x03,
+    0xA5, 0x0E, 0xF0, 0x8B, 0xC8, 0xDD, 0xE1, 0x37, 0xD5, 0xDB, 0x51, 0x1B, 0x9C, 0x7B, 0x81, 0x12,
+    0x15, 0xCA, 0x6D, 0x85, 0xDB, 0x02, 0x2A, 0xA3, 0x2B, 0x52, 0xAA, 0x05, 0xE9, 0xCA, 0x42, 0xCA,
+    0x01, 0x4B, 0xBF, 0x2C, 0x82, 0x5F, 0x4E, 0x9E, 0xE2, 0xCB, 0x2D, 0xAD, 0x64, 0xC4, 0xA6, 0xC1,
+    0xFB, 0xA8, 0xA7, 0x7F, 0x46, 0xC3, 0xA9, 0xF5, 0xC1, 0x68, 0x5F, 0x54, 0x18, 0x2F, 0xD4, 0x5A,
+    0xD1, 0x94, 0x71, 0x52, 0x90, 0x33, 0xD0, 0xD9, 0xF2, 0x05, 0x83, 0x08, 0x42, 0x77, 0xE5, 0x57,
+    0x6D, 0x78, 0xB9, 0x20, 0x92, 0x1C, 0xB0, 0x64, 0x39, 0xE1, 0xC8, 0x27, 0x33, 0xB6, 0x24, 0x3D,
+    0x8E, 0xE3, 0x6D, 0x41, 0x9A, 0x4C, 0x36, 0x11, 0xB2, 0x7D, 0x5C, 0xD3, 0x4B, 0x56, 0x42, 0x1E,
+    0xB3, 0xD4, 0x1E, 0x55, 0xFE, 0x0C, 0x1B, 0x91, 0x30, 0x74, 0x3C, 0x2C, 0x98, 0x58, 0xD7, 0x0D,
+    0xA3, 0xCD, 0x17, 0x07, 0xBD, 0xDC, 0x31, 0x7C, 0xCE, 0x89, 0x9E, 0xDB, 0xDF, 0x39, 0x52, 0x9B,
+    0x8B, 0x02, 0x78, 0xAD, 0xD8, 0xA7, 0xB3, 0xE4, 0x81, 0xE4, 0xFB, 0x41, 0xE6, 0x64, 0x56, 0x8F,
+    0x86, 0x80, 0xF4, 0x67, 0x20, 0x40, 0x72, 0xFD, 0xCC, 0x36, 0x15, 0xDA, 0xB7, 0x2E, 0xD8, 0x4F,
+    0x25, 0x54, 0x50, 0xA9, 0xD0, 0x5B, 0x1A, 0x7D, 0xB0, 0xA6, 0xDF, 0x5D, 0xB4, 0x1B, 0x13, 0x3A,
+    0xA2, 0x46, 0xEF, 0xE7, 0x53, 0x60, 0xF4, 0x20, 0xF1, 0x51, 0x31, 0x5A, 0x36, 0xB1, 0xA6, 0xA7,
+    0xDA, 0x9E, 0x26, 0x73, 0xEC, 0x8B, 0x65, 0xD8, 0x64, 0x85, 0x27, 0x51, 0x27, 0xB1, 0xEB, 0x4B,
+    0xBB, 0x78, 0x0C, 0xD0, 0xF5, 0xE4, 0xEC, 0x52, 0xEB, 0x0E, 0xEB, 0x13, 0x3C, 0x1E, 0xD7, 0x35,
+    0x88, 0x5D, 0x98, 0x11, 0x9D, 0x0B, 0x75, 0xEC, 0xEC, 0x67, 0x42, 0xB5, 0x4C, 0xF6, 0xF0, 0x4C,
+    0xA2, 0xE1, 0x38, 0xF4, 0x55, 0x95, 0xCB, 0x54, 0x0F, 0xD3, 0xE8, 0x3C, 0xF2, 0x39, 0x9E, 0xD6,
+    0x34, 0x46, 0x21, 0x85, 0xD5, 0x63, 0xE8, 0x4B, 0x34, 0xAA, 0x31, 0x6E, 0xA7, 0xD0, 0xA9, 0xC7,
+    0x54, 0x54, 0x62, 0x00, 0x9B, 0xB5, 0x89, 0x94, 0x8F, 0x6C, 0x0C, 0xD5, 0x6C, 0x23, 0x13, 0xCD,
+    0x58, 0x6E, 0xCA, 0x9A, 0xF1, 0x08, 0x24, 0x94, 0xA3, 0x80, 0xD9, 0x2F, 0xA9, 0x32, 0x1D, 0x3A,
+    0x3F, 0x67, 0xCB, 0xD5, 0x7D, 0x4D, 0x89, 0x56, 0x5C, 0xE5, 0xDC, 0x37, 0x99, 0x27, 0x3E, 0x66,
+    0x82, 0x59, 0x3F, 0xF2, 0x68, 0xE2, 0xC4, 0xA9, 0xE9, 0xD8, 0xFB, 0x5E, 0x8E, 0x22, 0x0E, 0x77,
+    0x5F, 0x65, 0x9B, 0x91, 0xDC, 0x59, 0xC4, 0x91, 0x30, 0x44, 0x24, 0x7A, 0x74, 0x49, 0xA3, 0xA1,
+    0x4C, 0x2A, 0xBF, 0xC3, 0xD7, 0x21, 0x21, 0x2A, 0xA9, 0x8C, 0x5F, 0x45, 0xDA, 0x78, 0x5E, 0x55,
+    0x7F, 0x7C, 0x41, 0xD3, 0x6D, 0x0B, 0xBE, 0x83, 0xA8, 0x5E, 0x08, 0xF5, 0xEC, 0xCC, 0xFD, 0x21,
+    0xB3, 0x1D, 0x6A, 0xCC, 0xF9, 0x52, 0xF3, 0x89, 0x96, 0x2A, 0x70, 0xAB, 0x63, 0x62, 0xA3, 0xB4,
+    0xE7, 0x70, 0xE9, 0xDF, 0x4C, 0xED, 0x52, 0xA0, 0x24, 0x38, 0x58, 0xF1, 0xC6, 0x5B, 0x28, 0xA0,
+    0x8F, 0x84, 0x36, 0x60, 0xFB, 0x17, 0xAA, 0x27, 0xB1, 0xA5, 0x71, 0xE8, 0x1E, 0xDF, 0xB9, 0x0A,
+    0x0D, 0x15, 0x83, 0xF6, 0xE1, 0xF2, 0x51, 0x8F, 0x92, 0x67, 0x63, 0xAB, 0xD1, 0x2A, 0x29, 0x77,
+    0x2D, 0xF0, 0x1E, 0x0E, 0x19, 0xCC, 0x4E, 0x9D, 0x8F, 0xAA, 0xDE, 0xC1, 0x15, 0x1A, 0xBD, 0x19,
+    0x79, 0xD0, 0x61, 0x51, 0x2D, 0x23, 0x82, 0x8E, 0x2C, 0xA3, 0x00, 0x9E, 0x91, 0x83, 0xD4, 0x61,
+    0x6E, 0x53, 0x1B, 0x81, 0xBD, 0x07, 0x69, 0x24, 0xE7, 0xF7, 0xD4, 0x5B, 0x65, 0x72, 0xE2, 0x0F,
+    0x05, 0x41, 0xD5, 0xD6, 0x5E, 0x9D, 0xF3, 0xF0, 0xA0, 0xF5, 0x7C, 0xC9, 0x2F, 0x0C, 0x87, 0xEC,
+    0x13, 0xDB, 0x79, 0x70, 0x89, 0x0C, 0x67, 0x40, 0xC9, 0xCA, 0xF3, 0xE0, 0xEA, 0x12, 0xF1, 0x92,
+    0xD4, 0x02, 0x71, 0x79, 0xE6, 0xF7, 0xC6, 0xC5, 0x27, 0x4A, 0x9D, 0xAC, 0x32, 0x6A, 0x44, 0xD9,
+    0x01, 0x8D, 0x01, 0x1F, 0x2A, 0xD7, 0xE5, 0x7F, 0x32, 0x51, 0x9F, 0xB6, 0x36, 0x8A, 0x98, 0x4E,
+    0xA1, 0x0D, 0xA3, 0xCD, 0x3C, 0xF7, 0xDF, 0x30, 0x0A, 0xD9, 0x2A, 0x6A, 0xD6, 0x97, 0x14, 0x34,
+    0x0C, 0xA1, 0xC5, 0x87, 0x1B, 0x63, 0x4D, 0xBA, 0x23, 0x9E, 0x3D, 0x6E, 0x4F, 0x80, 0x3D, 0x32,
+    0x28, 0x1D, 0x51, 0x8F, 0x63, 0xCA, 0xA6, 0x5A, 0x77, 0xB8, 0xB9, 0xA2, 0xE5, 0x05, 0x8C, 0xE9,
+    0xE3, 0xC7, 0xC8, 0xF0, 0x43, 0x14, 0x29, 0x7E, 0x70, 0x23, 0x77, 0x18, 0x2D, 0x3A, 0x20, 0x14,
+    0x1F, 0x26, 0x0F, 0x46, 0x33, 0x0A, 0x6A, 0x6B, 0xCA, 0x62, 0xB0, 0xF0, 0xCB, 0xB4, 0x48, 0xFA,
+    0xB2, 0x84, 0x55, 0x0B, 0x45, 0x35, 0xC2, 0x47, 0x65, 0x72, 0x4B, 0x78, 0x54, 0x29, 0xD3, 0xD6,
+    0x44, 0xF9, 0xA5, 0x83, 0xA7, 0xA7, 0x04, 0x31, 0x34, 0xA8, 0x3B, 0x8B, 0xCD, 0x13, 0xA2, 0x00,
+    0xCB, 0x61, 0x9D, 0x9E, 0x40, 0xE1, 0xDB, 0x75, 0x47, 0x12, 0xE8, 0x89, 0x4C, 0x31, 0xA5, 0x4D,
+    0xDC, 0xA5, 0x6D, 0x79, 0x47, 0x3E, 0x58, 0xB5, 0x91, 0x9B, 0x02, 0xEC, 0x82, 0x28, 0xCF, 0x11,
+    0x5C, 0x12, 0xFA, 0x88, 0xDE, 0x9C, 0x15, 0x4D, 0xCF, 0xD4, 0x24, 0xAD, 0x5F, 0x16, 0xF0, 0xD0,
+    0x88, 0xC0, 0xF9, 0x77, 0x97, 0xE0, 0xC5, 0x69, 0x20, 0x18, 0x4E, 0x9C, 0x2A, 0x19, 0x66, 0x42,
+    0xD5, 0x5C, 0xD3, 0x87, 0x6B, 0xB2, 0xB0, 0xDE, 0x78, 0xB3, 0x8C, 0x5D, 0x90, 0xC3, 0x25, 0x3D,
+    0xA3, 0xCC, 0xB0, 0x4C, 0x97, 0x0F, 0x6D, 0x29, 0x11, 0x42, 0xB3, 0x86, 0x99, 0x87, 0x37, 0x5A,
+    0x45, 0x93, 0xE0, 0x88, 0xC9, 0x35, 0x05, 0x48, 0xCA, 0x84, 0xAB, 0x13, 0xF8, 0x06, 0xA4, 0x0B,
+    0x72, 0x2A, 0x8D, 0xEB, 0xA0, 0x89, 0x3D, 0x0B, 0x00, 0x1A, 0x17, 0x87, 0xCD, 0x95, 0x30, 0x2E,
+    0xC5, 0xF3, 0xA6, 0x42, 0x5C, 0x63, 0x7A, 0xF6, 0xD0, 0xE3, 0x6D, 0x9C, 0xC8, 0xF7, 0x83, 0xC3,
+    0xED, 0x9F, 0xFA, 0xF0, 0xC6, 0xE0, 0xFE, 0xCD, 0xFB, 0xC8, 0x18, 0x83, 0x77, 0xAA, 0xDA, 0x58,
+    0x17, 0xD2, 0x7B, 0x73, 0x62, 0x2D, 0xC0, 0xE1, 0xF8, 0xA9, 0x3E, 0x06, 0x97, 0x3F, 0x9B, 0xF4,
+    0xBB, 0x16, 0x25, 0x31, 0x69, 0x7C, 0xD6, 0xD6, 0xB3, 0x01, 0x35, 0x41, 0x77, 0x25, 0x71, 0xDE,
+    0x2D, 0x2C, 0xEF, 0x9E, 0x9A, 0xD6, 0x4C, 0xD9, 0x8C, 0x0C, 0xD1, 0xD8, 0xA2, 0x48, 0x59, 0x6D,
+    0x41, 0x15, 0xED, 0xAC, 0x98, 0xA8, 0x47, 0x3D, 0x4B, 0x7D, 0xE7, 0x14, 0xB7, 0xAB, 0x7F, 0xA9,
+    0xCD, 0xAA, 0x49, 0x65, 0x48, 0x34, 0x8C, 0x65, 0xD6, 0x38, 0x5D, 0xE1, 0x14, 0xFC, 0x4F, 0xE6,
+    0xE4, 0x87, 0x21, 0xE2, 0x54, 0x08, 0x91, 0x22, 0xED, 0x3E, 0x87, 0xEE, 0x31, 0x9A, 0xC4, 0x40,
+    0x78, 0x46, 0x2E, 0xF9, 0xDB, 0xED, 0x64, 0xD7, 0x10, 0xA4, 0x99, 0x3E, 0x43, 0x43, 0xB2, 0x54,
+    0x20, 0x20, 0x7D, 0x93, 0x34, 0x0D, 0x0C, 0x86, 0x52, 0x1A, 0x9D, 0x19, 0x12, 0x88, 0xDD, 0x14,
+    0xAE, 0x57, 0x72, 0x75, 0x26, 0xDF, 0xC4, 0xA1, 0x90, 0x49, 0xC7, 0x0C, 0xE1, 0xA6, 0x11, 0x2C,
+    0x00, 0xBF, 0xB6, 0xF5, 0xF2, 0x21, 0x4B, 0x14, 0xB4, 0x07, 0xBE, 0x04, 0x72, 0xCB, 0xBE, 0xB6,
+    0x24, 0x27, 0xCF, 0x7D, 0x75, 0x2B, 0x31, 0xD6, 0xA6, 0x84, 0x55, 0x11, 0xD7, 0x91, 0x5A, 0x15,
+    0x9C, 0xB0, 0x9D, 0x7E, 0xB1, 0xC6, 0xB7, 0xA5, 0xE0, 0xB2, 0x88, 0x98, 0x9C, 0x2F, 0x67, 0x29,
+    0xDA, 0x88, 0xC9, 0xA5, 0x27, 0x53, 0x4D, 0x8F, 0x0B, 0xF8, 0x08, 0x2C, 0xE7, 0x88, 0x26, 0x9C,
+    0xD9, 0x10, 0xD9, 0xE4, 0xDB, 0xA4, 0xF7, 0xAD, 0x9F, 0x4E, 0x65, 0x3E, 0xF4, 0xA4, 0x57, 0x18,
+    0x2C, 0xDD, 0x0E, 0x6D, 0x26, 0xA3, 0xC2, 0x66, 0x0D, 0x71, 0x79, 0x22, 0x8E, 0xD5, 0x6A, 0xFC,
+    0xF4, 0x71, 0x83, 0x27, 0xEF, 0x24, 0x50, 0xBA, 0x54, 0x1A, 0xE4, 0x98, 0x84, 0x3F, 0x27, 0xE3,
+    0x29, 0x3E, 0x45, 0xC1, 0xB1, 0x00, 0x88, 0x54, 0x4D, 0xF0, 0x87, 0x7B, 0x30, 0x7B, 0xA1, 0xC7,
+    0x6C, 0xD7, 0x48, 0xA0, 0xFF, 0xCB, 0x89, 0x92, 0x6D, 0x0E, 0x05, 0x3A, 0xCE, 0x95, 0x30, 0x23,
+    0xD7, 0x42, 0x77, 0xA9, 0x5E, 0xF5, 0xD9, 0xEB, 0x5A, 0xB7, 0x83, 0xB9, 0x91, 0x14, 0x51, 0x13,
+    0x96, 0x1E, 0x13, 0x5B, 0x28, 0x56, 0xFB, 0x4C, 0x6C, 0x7B, 0x87, 0x4A, 0xF5, 0x44, 0xD3, 0xC6,
+    0xC0, 0x17, 0x77, 0x45, 0x61, 0x60, 0x5E, 0x1D, 0xA6, 0x0C, 0x19, 0x70, 0x95, 0x46, 0x7D, 0xD2,
+    0x3B, 0x94, 0xD5, 0x9E, 0xD9, 0xB9, 0x1C, 0x02, 0x2D, 0xF5, 0x52, 0xEF, 0x77, 0x84, 0x1A, 0xA0,
+    0x65, 0x7A, 0x61, 0xFF, 0x5A, 0xDD, 0x1E, 0xB6, 0xD5, 0xE7, 0xEC, 0xF6, 0x33, 0x54, 0xB7, 0xE7,
+    0x33, 0x30, 0xB0, 0xB4, 0x61, 0x0F, 0xAA, 0xFE, 0xAC, 0xDB, 0x9D, 0x3A, 0x2B, 0x78, 0x82, 0x93,
+    0x8B, 0x74, 0x86, 0x6A, 0x07, 0xDF, 0x82, 0x1F, 0x35, 0xFA, 0xFD, 0x65, 0x39, 0x52, 0x87, 0xD9,
+    0x20, 0x05, 0xF5, 0x56, 0x85, 0x70, 0xFA, 0x46, 0x54, 0x59, 0xE5, 0xA0, 0xF3, 0x14, 0x09, 0x95,
+    0x5F, 0x9B, 0x56, 0x45, 0xA5, 0x32, 0x64, 0x88, 0x98, 0x4A, 0x1D, 0x91, 0xDF, 0x32, 0x22, 0xAF,
+    0xCD, 0x3D, 0x8B, 0x5E, 0x77, 0x59, 0x41, 0x25, 0xA0, 0xCC, 0x7F, 0xC6, 0x6B, 0x61, 0x60, 0x0F,
+    0xCD, 0x0A, 0xC9, 0x55, 0x6E, 0x0E, 0xB7, 0x6B, 0x85, 0xC8, 0xD9, 0xD6, 0x26, 0x93, 0x0C, 0x3D,
+    0x1C, 0xEE, 0xEB, 0x19, 0x8F, 0x98, 0xF0, 0x90, 0x88, 0x06, 0x05, 0xF0, 0x0D, 0xE7, 0xC9, 0x5B,
+    0x86, 0xE2, 0x7E, 0x2C, 0x4A, 0xD3, 0x80, 0xB6, 0x74, 0x54, 0x7F, 0x03, 0x12, 0x38, 0xB3, 0xA2,
+    0xBB, 0x43, 0x24, 0xDA, 0x41, 0x6D, 0xEE, 0x99, 0x4D, 0xD1, 0xEC, 0x69, 0x37, 0xE7, 0x41, 0xF3,
+    0x9D, 0xAA, 0xD8, 0xC1, 0xA5, 0xE0, 0x11, 0x3F, 0x47, 0xB4, 0x2E, 0xAD, 0x09, 0x84, 0x56, 0x0F,
+    0x4E, 0x0C, 0xB1, 0x78, 0xE6, 0xE0, 0x33, 0xA0, 0x32, 0xDA, 0xF6, 0x67, 0x80, 0xF0, 0xB3, 0xE9,
+    0x2F, 0x41, 0x23, 0xF2, 0x79, 0xE3, 0xD2, 0x59, 0x7A, 0x0D, 0x4A, 0x58, 0x29, 0x90, 0x92, 0xCA,
+    0x6C, 0x70, 0x15, 0x41, 0xCB, 0x72, 0xF4, 0x09, 0x47, 0xB9, 0xE2, 0x98, 0xAB, 0x15, 0xCE, 0x3D,
+    0xA9, 0x9D, 0x0E, 0x44, 0xDD, 0xA9, 0x23, 0x8E, 0x0E, 0x1D, 0x78, 0xBC, 0xEC, 0x5F, 0x48, 0x92,
+    0x22, 0xEC, 0x2A, 0xED, 0x9A, 0x41, 0x8D, 0x14, 0xC8, 0x77, 0x44, 0x36, 0xCE, 0xE6, 0xF5, 0x70,
+    0xF4, 0xC1, 0x50, 0x41, 0xAB, 0x7B, 0x28, 0xFD, 0xB9, 0x00, 0x39, 0x63, 0x8D, 0x20, 0x73, 0x8E,
+    0x42, 0x7E, 0xB8, 0x40, 0x7A, 0xAD, 0x8D, 0x8D, 0x6E, 0xFA, 0x93, 0x24, 0xA5, 0xF6, 0xF7, 0x61,
+    0x72, 0x75, 0xFC, 0xBB, 0xF5, 0xD1, 0xBE, 0xA0, 0x36, 0x91, 0x61, 0x87, 0x7F, 0x7F, 0xFD, 0x2A,
+    0x9B, 0xC8, 0x12, 0xE9, 0xB2, 0xE9, 0xFC, 0xBB, 0x05, 0xA3, 0xA8, 0x21, 0x97, 0x9B, 0x96, 0x3C,
+    0x40, 0x64, 0x7F, 0xA3, 0x51, 0x27, 0x3D, 0x6A, 0xB7, 0x67, 0x15, 0x57, 0x68, 0x4E, 0x87, 0x7D,
+    0xB5, 0x2F, 0x45, 0x8F, 0x77, 0x3E, 0x92, 0x98, 0x10, 0xB7, 0x77, 0xA3, 0x27, 0x20, 0x3C, 0x82,
+    0x42, 0x37, 0xF2, 0xD7, 0xD6, 0xE7, 0xBF, 0x8D, 0xD6, 0xEF, 0x4B, 0x53, 0xEC, 0x0F, 0xCC, 0xA7,
+    0xB0, 0x91, 0x03, 0x27, 0xAC, 0xE1, 0x9A, 0xA6, 0x38, 0x6E, 0x64, 0xF6, 0x4E, 0xE9, 0xD1, 0x78,
+    0x7C, 0x7A, 0xD6, 0xF9, 0x0E, 0xEB, 0x24, 0x2C, 0x01, 0xF3, 0xB1, 0x38, 0x22, 0x22, 0xBF, 0x91,
+    0x19, 0x44, 0xCB, 0xEC, 0x8B, 0xEF, 0x59, 0xF0, 0xA8, 0x3D, 0x5D, 0x66, 0x43, 0xEF, 0x56, 0x6C,
+    0x1A, 0x88, 0x0A, 0xA7, 0x74, 0x48, 0x0B, 0x1A, 0x9E, 0x2D, 0xD5, 0x0B, 0xCC, 0x43, 0xA3, 0x09,
+    0xB9, 0xCD, 0xD7, 0x82, 0x0C, 0x73, 0x29, 0x4F, 0xE7, 0x0B, 0x69, 0x68, 0x82, 0x00, 0x65, 0x4D,
+    0x5F, 0xF8, 0xE6, 0xD7, 0x02, 0x2A, 0x8F, 0x22, 0x99, 0x5E, 0xAA, 0x08, 0x4D, 0xBD, 0x9A, 0xC4,
+    0xEC, 0x32, 0x0E, 0x15, 0x3F, 0xB4, 0x94, 0xBF, 0x01, 0x3A, 0xB1, 0x0C, 0x78, 0x77, 0xDF, 0x72,
+    0x5B, 0x77, 0x0D, 0x33, 0x7A, 0x0B, 0xC1, 0x1E, 0xED, 0x9A, 0xE8, 0x72, 0x68, 0x8D, 0x24, 0xEE,
+    0x97, 0x24, 0xF6, 0xCA, 0x6D, 0xE8, 0x3B, 0x9D, 0xDA, 0x93, 0x40, 0x85, 0xA1, 0x9D, 0x1F, 0xB8,
+    0xC9, 0xE5, 0xEA, 0x59, 0xA0, 0xD4, 0x6D, 0xCB, 0x71, 0x52, 0x75, 0x9D, 0xA2, 0xAF, 0x91, 0x6A,
+    0x4E, 0x0A, 0x6B, 0xB5, 0x67, 0x7B, 0x6C, 0xAC, 0x5E, 0x9B, 0x02, 0x27, 0x4B, 0x3E, 0xCF, 0x19,
+    0x57, 0xCC, 0x74, 0x4B, 0x33, 0xA4, 0x6B, 0x1E, 0x56, 0x6D, 0x0B, 0xA4, 0x84, 0xA3, 0x81, 0xC9,
+    0x89, 0xF7, 0x9E, 0x3F, 0xFE, 0x57, 0x60, 0x4F, 0x79, 0x84, 0x53, 0xEB, 0x80, 0x8F, 0xB9, 0x63,
+    0x29, 0x4F, 0xBD, 0xA0, 0x0C, 0xF0, 0x7F, 0x35, 0xEC, 0x18, 0xC1, 0x22, 0xA3, 0x6D, 0x7F, 0x2E,
+    0xCC, 0x4D, 0x51, 0xFD, 0x76, 0x74, 0x18, 0x19, 0x67, 0x6B, 0x81, 0x07, 0x07, 0x5B, 0x5D, 0xB3,
+    0x98, 0x4D, 0x23, 0xB8, 0x77, 0xD1, 0xEC, 0x3C, 0x0E, 0x10, 0xD0, 0x65, 0x99, 0x29, 0xF1, 0x42,
+    0x83, 0x51, 0x26, 0x18, 0x8C, 0x8E, 0x4F, 0x8D, 0x2A, 0x14, 0x34, 0x6A, 0xC5, 0x71, 0x2F, 0x4C,
+    0xFF, 0xBA, 0x11, 0xD7, 0x76, 0x16, 0x00, 0xEE, 0xBA, 0x26, 0xD9, 0xC2, 0x51, 0xBD, 0xC6, 0x67,
+    0x85, 0x56, 0x98, 0x36, 0x12, 0xC3, 0xF1, 0xCC, 0xFA, 0xFB, 0xF6, 0x5A, 0xD2, 0x7A, 0xFF, 0x1B,
+    0x33, 0xD3, 0x72, 0x05, 0x01, 0x67, 0xA2, 0x42, 0x45, 0x0C, 0x5E, 0x46, 0xAD, 0x26, 0xA7, 0xCE,
+    0x38, 0x30, 0xFB, 0x9B, 0x39, 0x8D, 0x40, 0x61, 0xDF, 0xE5, 0xC5, 0x8A, 0x26, 0xA6, 0x31, 0xFC,
+    0x8B, 0x0B, 0x2E, 0xAD, 0xD8, 0xA5, 0x12, 0x92, 0xD2, 0xCA, 0x86, 0x73, 0x52, 0xA6, 0x19, 0xE7,
+    0x70, 0xD2, 0x31, 0x14, 0x1C, 0xDA, 0x27, 0xC9, 0xB7, 0x6C, 0x98, 0xE9, 0xD9, 0x59, 0x8B, 0x5F,
+    0x27, 0xA6, 0xB3, 0xAC, 0x89, 0xFC, 0x99, 0xF5, 0x6A, 0x56, 0xC1, 0x99, 0xFE, 0x05, 0x3A, 0x0A,
+    0x27, 0x1E, 0xE4, 0xD2, 0x75, 0x98, 0x7C, 0x00, 0x23, 0xD0, 0x19, 0x0B, 0x49, 0xC6, 0x52, 0x48,
+    0x03, 0xB5, 0x24, 0x40, 0x03, 0xA2, 0x18, 0xA2, 0x0A, 0x5D, 0x84, 0xF2, 0xDA, 0xF2, 0x01, 0xF5,
+    0xE7, 0xDD, 0x54, 0x1F, 0x6C, 0x04, 0xBA, 0x74, 0x46, 0x29, 0xA3, 0x08, 0x18, 0xA1, 0xA9, 0x80,
+    0xA3, 0x85, 0x42, 0x49, 0x33, 0x30, 0x79, 0x08, 0x7B, 0x72, 0x32, 0xB7, 0x59, 0x85, 0xA1, 0xB5,
+    0x29, 0xDF, 0x69, 0xDF, 0x2C, 0xC3, 0x5F, 0xD7, 0xA7, 0xE9, 0x97, 0x6A, 0xA4, 0x38, 0x8B, 0x8C,
+    0xDE, 0xB2, 0xA8, 0x27, 0xFE, 0x6E, 0xD5, 0xFF, 0xF6, 0x00, 0x64, 0xB7, 0xBD, 0x14, 0x3C, 0xEC,
+    0x0E, 0x86, 0x83, 0x7A, 0x16, 0xEF, 0x50, 0xBB, 0x3D, 0xBA, 0xA2, 0x43, 0x14, 0x61, 0x06, 0x8B,
+    0x85, 0xCF, 0x86, 0xE6, 0xC9, 0x77, 0xC6, 0x9F, 0x84, 0xF2, 0x1E, 0xD8, 0x51, 0x9F, 0xB6, 0xC8,
+    0x11, 0x56, 0x9A, 0x4B, 0x8B, 0xEA, 0x58, 0x68, 0x18, 0x78, 0x44, 0x8C, 0x36, 0x0B, 0xA0, 0x4C,
+    0x74, 0x2E, 0x14, 0xBD, 0xE8, 0x57, 0xA9, 0x1D, 0x4A, 0x9F, 0xD5, 0x44, 0xB3, 0x15, 0xD6, 0xED,
+    0xAE, 0x7A, 0x4E, 0x7D, 0xA7, 0x3C, 0x30, 0xFF, 0x6F, 0x0C, 0x23, 0xCC, 0x1B, 0x92, 0xC1, 0x48,
+    0xF9, 0x8C, 0x97, 0x47, 0x3E, 0x5E, 0x66, 0x83, 0xE8, 0xB9, 0xF0, 0xD0, 0x1B, 0x79, 0x68, 0x1D,
+    0xA2, 0x35, 0xC7, 0x34, 0x07, 0x8A, 0xCE, 0x68, 0xBD, 0x9B, 0x7C, 0x76, 0x38, 0x7A, 0x23, 0x9B,
+    0x39, 0xD7, 0x04, 0x4A, 0x82, 0xB9, 0x4B, 0xCF, 0xB1, 0x9A, 0xBA, 0x75, 0x6B, 0x04, 0xF5, 0x23,
+    0x8D, 0x36, 0x4F, 0x9A, 0x3E, 0x60, 0xD3, 0xAA, 0xF9, 0x0F, 0x05, 0x5C, 0xA7, 0x28, 0x7E, 0xB4,
+    0xCA, 0x77, 0x92, 0x9B, 0x21, 0x0C, 0x99, 0x84, 0xB0, 0xB1, 0xD2, 0x1C, 0xF7, 0x9A, 0x24, 0x0A,
+    0xD7, 0x8A, 0xE3, 0x08, 0x3F, 0xE1, 0x5A, 0xC6, 0x32, 0xCF, 0xD8, 0xBB, 0x6F, 0x86, 0x62, 0x28,
+    0xDC, 0xC6, 0xF5, 0x00, 0x8C, 0xBE, 0x15, 0x25, 0x53, 0x87, 0x81, 0xAF, 0xDE, 0xAC, 0x6D, 0x59,
+    0x0D, 0x51, 0x1F, 0xF9, 0x76, 0xEA, 0x44, 0x95, 0xFB, 0x1C, 0xC5, 0xB0, 0x0A, 0x29, 0xF2, 0xAE,
+    0x8F, 0x03, 0xE7, 0x41, 0xD1, 0x54, 0x9D, 0xD3, 0xD2, 0xB4, 0x7D, 0x9A, 0xC1, 0x09, 0xDA, 0xC5,
+    0xD8, 0x26, 0x59, 0xC4, 0x35, 0x66, 0xD7, 0xD1, 0xE5, 0xA6, 0xED, 0xBB, 0x82, 0xAD, 0x50, 0x4C,
+    0xE0, 0x01, 0xC9, 0x57, 0x78, 0x66, 0x8E, 0x0E, 0x69, 0xFD, 0x8C, 0xE9, 0x63, 0xA3, 0x21, 0xDA,
+    0xC8, 0x58, 0x1D, 0x6B, 0x76, 0x6F, 0xA4, 0x8F, 0x46, 0xC8, 0x00, 0xB2, 0x1E, 0xEF, 0x93, 0x54,
+    0x89, 0xAB, 0xD9, 0x18, 0x23, 0x95, 0xE6, 0x2A, 0xF8, 0xCC, 0xF2, 0x74, 0xE5, 0x71, 0x60, 0x8C,
+    0xA1, 0x0E, 0x67, 0x14, 0xBA, 0xEF, 0x69, 0xC4, 0x01, 0xFE, 0x93, 0x54, 0x26, 0x0A, 0xE1, 0xC2,
+    0xC1, 0x47, 0xC9, 0x6A, 0xF6, 0x6A, 0xD8, 0xB6, 0xDD, 0xEE, 0x67, 0xB5, 0xA0, 0xD8, 0x5F, 0x58,
+    0x7B, 0x42, 0xFE, 0xD3, 0xD0, 0xCB, 0xFD, 0x5E, 0x22, 0x4F, 0x31, 0xF7, 0xBA, 0x12, 0x6C, 0xEF,
+    0x4A, 0x78, 0x23, 0x85, 0xA3, 0xB1, 0x35, 0x59, 0x13, 0x5D, 0x35, 0xA2, 0x32, 0xF4, 0x6C, 0x07,
+    0x33, 0x56, 0x53, 0xD9, 0xB5, 0x4B, 0x6F, 0xC7, 0x73, 0x01, 0x69, 0x54, 0x7F, 0x95, 0x8C, 0x10,
+    0xD7, 0x11, 0xF1, 0xF5, 0x0C, 0x21, 0x17, 0xE5, 0x23, 0x34, 0xDB, 0x4D, 0xC5, 0xA9, 0x18, 0x54,
+    0xD0, 0x76, 0xB2, 0x74, 0x68, 0x61, 0x00, 0x8D, 0xCA, 0x3A, 0x70, 0xE4, 0x36, 0xDE, 0x2D, 0x9B,
+    0x5F, 0xB0, 0x4E, 0x66, 0x15, 0x7B, 0x92, 0x04, 0x38, 0xBD, 0xC1, 0x61, 0xF2, 0x19, 0xB9, 0xD9,
+    0x71, 0xCF, 0xFB, 0x4D, 0x19, 0x99, 0xE5, 0x2A, 0x50, 0x27, 0x20, 0xC2, 0x18, 0x7B, 0xE9, 0xFA,
+    0x02, 0x13, 0x66, 0x89, 0xE7, 0x72, 0x2A, 0xDC, 0x27, 0x72, 0x91, 0xE7, 0xCF, 0x3A, 0x76, 0x6B,
+    0xFD, 0xAF, 0x6C, 0x68, 0x57, 0x38, 0xEE, 0x97, 0x55, 0x0C, 0xBF, 0xA6, 0xBA, 0xDD, 0xC3, 0x2F,
+    0xDE, 0xD5, 0x39, 0x91, 0x8E, 0xFA, 0xE8, 0xFC, 0x52, 0x87, 0x94, 0x85, 0x24, 0x3A, 0xDE, 0x03,
+    0xBE, 0x02, 0x1B, 0x81, 0xE8, 0x1F, 0xE6, 0x96, 0xAA, 0x38, 0x42, 0x42, 0x2F, 0xDF, 0x4F, 0x13,
+    0x50, 0xD3, 0x77, 0xE4, 0x2C, 0x8E, 0x96, 0x3C, 0x4A, 0x6E, 0x37, 0xAF, 0xE5, 0x03, 0x27, 0x5F,
+    0x71, 0xE1, 0x79, 0xEA, 0xF7, 0xC5, 0x71, 0x4F, 0xAC, 0xFE, 0x36, 0x45, 0x0A, 0x96, 0x60, 0x59,
+    0xD9, 0x52, 0x9F, 0x31, 0xDF, 0x20, 0x6F, 0x33, 0x03, 0x3D, 0x51, 0x57, 0x18, 0xC1, 0xD0, 0xA4,
+    0x7C, 0x33, 0x2E, 0x59, 0x04, 0xF8, 0x3C, 0xF3, 0x58, 0xBB, 0x2F, 0x12, 0xB1, 0x35, 0xC4, 0xF6,
+    0xC4, 0x95, 0x3D, 0xDF, 0x13, 0x09, 0xFC, 0xFB, 0x30, 0xA2, 0xF6, 0x9B, 0xAE, 0xC4, 0xA3, 0xB3,
+    0x2E, 0xFE, 0x29, 0x8D, 0x56, 0x24, 0x37, 0xA4, 0xA4, 0x1E, 0xC3, 0x13, 0x6F, 0x99, 0x3D, 0x35,
+    0xF8, 0xA0, 0x08, 0x7E, 0x4C, 0x7C, 0x59, 0x81, 0xC0, 0xD8, 0x8F, 0xF7, 0x33, 0x8E, 0x67, 0x2F,
+    0xD2, 0x04, 0xE7, 0x4D, 0xB4, 0x90, 0x07, 0xD3, 0xF7, 0x73, 0x18, 0x1D, 0x69, 0x89, 0x49, 0x13,
+    0x08, 0x65, 0x6F, 0xCA, 0xDC, 0x8A, 0x32, 0xBC, 0xCF, 0x5C, 0x6E, 0xDE, 0x23, 0x83, 0x22, 0x94,
+    0xEE, 0x02, 0xC6, 0x44, 0xE8, 0xDE, 0xBD, 0xB4, 0x79, 0xD2, 0xF0, 0x9E, 0x46, 0xCB, 0xF6, 0x5B,
+    0x2B, 0xA3, 0x97, 0x98, 0x05, 0x60, 0x83, 0xE3, 0x74, 0xFA, 0xA5, 0x0A, 0x04, 0xE0, 0x76, 0xB5,
+    0x2B, 0x16, 0xA2, 0x00, 0xE1, 0x0D, 0xAF, 0x5C, 0x8E, 0xB3, 0x5E, 0x24, 0xC4, 0xA3, 0xB5, 0x8B,
+    0xAC, 0x56, 0x13, 0x09, 0x8D, 0xDE, 0xE5, 0xA1, 0x85, 0x49, 0x65, 0xB2, 0xFF, 0xE4, 0xF2, 0x61,
+    0x12, 0xE2, 0x45, 0x48, 0x8D, 0x8A, 0x02, 0x60, 0xBB, 0x2F, 0xF3, 0xFF, 0x10, 0xCD, 0xE3, 0xA7,
+    0xE8, 0xF0, 0xC1, 0x14, 0xB5, 0x0D, 0x65, 0xDE, 0x37, 0x33, 0xFC, 0x2F, 0x22, 0xB9, 0xBF, 0xE0,
+    0x56, 0x0C, 0x44, 0x18, 0xFC, 0xAA, 0xBA, 0xBE, 0x24, 0x0E, 0xA1, 0x31, 0x17, 0x7D, 0x2C, 0x2A,
+    0xA2, 0xAA, 0xF4, 0x65, 0x81, 0x12, 0xB4, 0x7E, 0x0D, 0x13, 0xE3, 0x9B, 0x3F, 0xAD, 0xA1, 0x20,
+    0x19, 0x91, 0x34, 0x92, 0xAD, 0x15, 0x5A, 0x93, 0x65, 0xC1, 0xDD, 0x10, 0xCD, 0x6D, 0xAD, 0x94,
+    0x15, 0xA4, 0x88, 0x30, 0x4A, 0x8B, 0x8C, 0xB0, 0xEB, 0xA9, 0x04, 0x8E, 0xEA, 0x4A, 0xBA, 0x28,
+    0x1F, 0x28, 0xD4, 0x65, 0x85, 0x49, 0xF4, 0x7C, 0x69, 0x13, 0xB4, 0x3E, 0x84, 0x36, 0x77, 0x9E,
+    0x70, 0x36, 0x12, 0x53, 0x1B, 0xD4, 0xD0, 0x2A, 0x17, 0xDC, 0x84, 0x93, 0xC1, 0xDF, 0xB9, 0x44,
+    0x68, 0x0B, 0xF5, 0xEE, 0x3B, 0xB2, 0xA2, 0x8C, 0xCB, 0xB6, 0xA6, 0xD8, 0x97, 0xA8, 0x2C, 0x61,
+    0x7C, 0xB7, 0x21, 0x58, 0x07, 0xC9, 0xD4, 0x5D, 0x54, 0x3A, 0x70, 0xC9, 0xF4, 0x51, 0x00, 0xC6,
+    0x25, 0xFF, 0x1E, 0x1D, 0x94, 0xBA, 0x48, 0xDE, 0x5E, 0x69, 0xB4, 0x87, 0x4F, 0x87, 0x83, 0x64,
+    0x9A, 0xDF, 0x83, 0x93, 0x59, 0x2A, 0x43, 0xD7, 0xCE, 0x35, 0xE7, 0xD5, 0x77, 0x72, 0x23, 0xB5,
+    0xFF, 0x52, 0xA6, 0x11, 0x2A, 0x29, 0x0A, 0xCA, 0x3B, 0xB8, 0xBC, 0xF3, 0xFE, 0x3A, 0x6B, 0x1B,
+    0x13, 0xC9, 0x5D, 0xD1, 0xF5, 0xEE, 0x6A, 0xC4, 0x05, 0x03, 0xAE, 0x04, 0xC5, 0x36, 0x03, 0x56,
+    0x3C, 0x5D, 0xE1, 0x3E, 0x32, 0x45, 0x18, 0x3C, 0x90, 0x46, 0xF3, 0xB0, 0xDA, 0xD4, 0xCC, 0xE0,
+    0xE1, 0xCD, 0x40, 0xAD, 0xC3, 0xFA, 0x6B, 0x2B, 0x74, 0xC5, 0x20, 0xCA, 0xF6, 0xA2, 0xA7, 0xC6,
+    0xD3, 0xA2, 0x38, 0x1E, 0x5C, 0x03, 0xE5, 0xCC, 0x3F, 0x21, 0xED, 0x8E, 0xAE, 0x6B, 0xDE, 0x75,
+    0xF9, 0x67, 0x63, 0xEA, 0x8B, 0x18, 0x06, 0x7A, 0xBD, 0x67, 0x32, 0xA3, 0x89, 0x6D, 0x71, 0x0A,
+    0x43, 0x00, 0x74, 0x6B, 0x19, 0x42, 0x8D, 0x0C, 0x93, 0xAC, 0x4F, 0x69, 0x3B, 0x5C, 0xB0, 0x35,
+    0xAE, 0x7F, 0x54, 0x48, 0x1A, 0x48, 0x36, 0x4A, 0xD4, 0x60, 0x32, 0x16, 0x21, 0x75, 0xF6, 0xAA,
+    0x3A, 0x34, 0x14, 0xC3, 0xC7, 0x0D, 0xB6, 0x3E, 0xF8, 0x7D, 0xDE, 0x17, 0x46, 0xBD, 0xA7, 0x87,
+    0x08, 0xF5, 0x1B, 0x6B, 0x13, 0x0B, 0xCD, 0xA9, 0x4D, 0x9A, 0xD2, 0x39, 0x83, 0xCA, 0xE9, 0x47,
+    0xE1, 0xCF, 0xD6, 0x73, 0xF1, 0x15, 0xCC, 0x50, 0x87, 0xE2, 0xB2, 0x56, 0x04, 0xCC, 0x20, 0x06,
+    0x87, 0x3F, 0x19, 0x8D, 0xE6, 0x45, 0x70, 0xF1, 0x13, 0xB1, 0x32, 0x1C, 0xC2, 0xFF, 0xB9, 0x2F,
+    0xC9, 0x76, 0x2C, 0x0E, 0x81, 0x18, 0xEF, 0x34, 0xA7, 0xD0, 0x85, 0xD1, 0x37, 0xC3, 0x83, 0x44,
+    0xFB, 0x35, 0x2B, 0xB8, 0x38, 0x4A, 0xB8, 0x44, 0x61, 0xE0, 0x65, 0x97, 0x90, 0x2A, 0xFB, 0x09,
+    0x68, 0x1A, 0x8A, 0xF0, 0x56, 0xF7, 0xF7, 0xE4, 0xF5, 0x01, 0x35, 0xD2, 0x92, 0xB5, 0xE0, 0x82,
+    0x2D, 0x39, 0x03, 0x1B, 0x0C, 0xDC, 0x30, 0x8D, 0x7E, 0x55, 0xB4, 0x38, 0x29, 0x93, 0xA0, 0x99,
+    0x85, 0x6E, 0x8B, 0x6B, 0x82, 0x6F, 0x5A, 0x57, 0xC0, 0x04, 0x68, 0xE3, 0x41, 0xB6, 0xF9, 0x5B,
+    0xC7, 0xE9, 0xCF, 0x96, 0x06, 0x86, 0x63, 0x93, 0x12, 0xC1, 0xEC, 0xF3, 0xBB, 0x25, 0x39, 0x8F,
+    0x1F, 0x06, 0x70, 0x08, 0xC6, 0x60, 0x4C, 0xD1, 0x67, 0x89, 0x8A, 0x13, 0x97, 0x67, 0x13, 0x6E,
+    0x08, 0x2B, 0xE5, 0x59, 0x5C, 0xAA, 0xFF, 0x4B, 0xE7, 0x49, 0x81, 0x6E, 0x46, 0x5E, 0x9E, 0x13,
+    0x5C, 0x69, 0xEB, 0x95, 0x36, 0x2A, 0x77, 0xBF, 0xD2, 0xB5, 0xDC, 0x49, 0x33, 0x5F, 0x17, 0x5D,
+    0x1F, 0x1C, 0x78, 0x8B, 0x38, 0x4D, 0x5D, 0xC4, 0x03, 0xF2, 0x58, 0xF4, 0x0A, 0xFD, 0xE4, 0xEF,
+    0x18, 0xF0, 0x8F, 0x31, 0x29, 0x5D, 0x69, 0xEE, 0xA1, 0x31, 0x37, 0xE2, 0x31, 0x5F, 0xF6, 0x92,
+    0x33, 0xDC, 0x70, 0x28, 0xD2, 0x6D, 0xC7, 0x88, 0xC5, 0x86, 0x61, 0x0D, 0xA9, 0x7B, 0x15, 0xA4,
+    0xE5, 0x35, 0x7C, 0xF3, 0xBD, 0xE1, 0x80, 0xDE, 0x9D, 0x7A, 0x7D, 0x98, 0x06, 0xFF, 0x20, 0x6A,
+    0xF4, 0xCD, 0xC8, 0x99, 0x25, 0x64, 0x81, 0xEA, 0xC8, 0x7E, 0x3C, 0x5B, 0x28, 0x06, 0xBD, 0xA5,
+    0xA8, 0xF8, 0x9C, 0xF3, 0x3D, 0x4F, 0xB1, 0xB5, 0x15, 0x1D, 0x50, 0x0C, 0x45, 0x55, 0x48, 0xEA,
+    0x4C, 0x62, 0x5C, 0x11, 0xF3, 0xAE, 0x7E, 0x13, 0xA0, 0x9E, 0x6A, 0xB4, 0x99, 0x88, 0x03, 0x8F,
+    0xC7, 0xAE, 0x20, 0x67, 0x2D, 0x4D, 0x88, 0x11, 0xB5, 0x41, 0x0D, 0x37, 0xA3, 0xAB, 0xD8, 0xE4,
+    0x7C, 0x59, 0xC5, 0x71, 0x74, 0x5E, 0x95, 0xB8, 0x38, 0x95, 0x40, 0xAC, 0x15, 0xD3, 0x7D, 0x21,
+    0xD0, 0xB3, 0x82, 0x40, 0x55, 0x92, 0x43, 0x90, 0xDE, 0x83, 0x62, 0xE7, 0xD4, 0x56, 0x32, 0x72,
+    0x52, 0x0B, 0x2E, 0x09, 0x30, 0x64, 0x4A, 0xAC, 0x5A, 0x67, 0x01, 0x0A, 0xBD, 0x22, 0xF4, 0x58,
+    0xB0, 0xE5, 0x6B, 0x92, 0x69, 0x89, 0x72, 0xE2, 0x91, 0x50, 0x3E, 0x47, 0xBB, 0xE0, 0x23, 0x57,
+    0xBC, 0xA5, 0x5D, 0xEF, 0xA7, 0x39, 0x96, 0x00, 0x99, 0xE4, 0x30, 0x89, 0xCF, 0x0C, 0xA5, 0x22,
+    0x8F, 0x78, 0x5F, 0xAA, 0x69, 0x50, 0xF6, 0xB9, 0x61, 0xA1, 0x3E, 0x1C, 0x65, 0x15, 0xD1, 0x50,
+    0x4B, 0xDF, 0xD0, 0xA0, 0x87, 0xC2, 0xF8, 0xB2, 0xAA, 0x00, 0xB6, 0xFD, 0x7A, 0x4E, 0xA6, 0xEA,
+    0xD8, 0xCE, 0x22, 0x3C, 0x41, 0xFA, 0x6A, 0x05, 0xCA, 0x5F, 0xEC, 0x98, 0x4E, 0xFC, 0xF1, 0x06,
+    0x5E, 0x07, 0xF3, 0x98, 0x73, 0xCF, 0xBD, 0x17, 0xF5, 0xB5, 0x5B, 0x52, 0x29, 0xEF, 0xCC, 0xAE,
+    0x8C, 0x8F, 0x6C, 0xB0, 0x82, 0x9D, 0x1C, 0x15, 0x62, 0x4C, 0xFC, 0x99, 0xFD, 0x3D, 0xD1, 0x7F,
+    0x13, 0xFD, 0x8A, 0xD1, 0x96, 0x50, 0x98, 0x2D, 0x30, 0xE8, 0x57, 0x07, 0xFC, 0xD0, 0x06, 0x24,
+    0xB5, 0x7A, 0xC6, 0xBE, 0xAA, 0x1E, 0xBF, 0xFF, 0xC6, 0x6C, 0x24, 0x70, 0xB7, 0x59, 0xC3, 0xDB,
+    0xC1, 0x3A, 0x79, 0x6F, 0x83, 0xCB, 0x55, 0x84, 0x7E, 0x04, 0xF8, 0xDB, 0x7D, 0x41, 0xAF, 0x5D,
+    0xDB, 0x5A, 0xE6, 0xCE, 0x9B, 0x66, 0x6F, 0x38, 0xF4, 0xEA, 0x20, 0x09, 0x75, 0x75, 0xCD, 0xF8,
+    0x62, 0x74, 0x7E, 0x4A, 0x3E, 0x2E, 0xAE, 0xCC, 0x8D, 0x49, 0xBC, 0xCC, 0x34, 0xE9, 0x9B, 0xC7,
+    0x05, 0x81, 0x9C, 0xBA, 0x00, 0xF2, 0x83, 0xC5, 0xE4, 0x78, 0x85, 0xD0, 0xC5, 0xF3, 0x0F, 0xB0,
+    0x18, 0x30, 0x9B, 0xA3, 0x62, 0x92, 0x72, 0xD5, 0xEA, 0xE1, 0xC0, 0x5B, 0xDA, 0x0C, 0xBC, 0x19,
+    0x46, 0x7F, 0x03, 0xC8, 0x7B, 0x31, 0x13, 0x1B, 0xA0, 0x91, 0xB4, 0x99, 0xC1, 0x9D, 0xB8, 0xE5,
+    0x33, 0xD9, 0x41, 0x53, 0x19, 0x97, 0x99, 0x27, 0x8C, 0x8E, 0x5B, 0xAA, 0x17, 0x85, 0x42, 0xA9,
+    0x47, 0x1C, 0x19, 0x33, 0xCB, 0x88, 0xBE, 0xF4, 0x48, 0x43, 0x66, 0xEB, 0x9F, 0xF6, 0x94, 0x2C,
+    0xC2, 0x74, 0xF8, 0xD7, 0x9B, 0xEB, 0x2F, 0x2F, 0xF3, 0x52, 0x1F, 0x45, 0x9D, 0x9E, 0xB4, 0x86,
+    0x76, 0xAB, 0x43, 0xB9, 0x52, 0x0C, 0x0A, 0x06, 0xD7, 0xF2, 0xA5, 0xFE, 0x9C, 0x0D, 0x8A, 0xE0,
+    0xA4, 0xEA, 0x65, 0x3F, 0x2B, 0x7C, 0x03, 0x31, 0x3A, 0x40, 0x97, 0xA8, 0x56, 0xA2, 0xAD, 0x63,
+    0x7A, 0xE5, 0xDC, 0xFD, 0x8D, 0xA9, 0xF3, 0x55, 0xB5, 0x14, 0xB7, 0x51, 0xBA, 0x00, 0x32, 0x43,
+    0x25, 0xEB, 0x61, 0x78, 0xA6, 0x2A, 0xEA, 0x9D, 0x15, 0x72, 0x5D, 0xD0, 0x0E, 0x0C, 0xB4, 0xC1,
+    0x4B, 0x10, 0x9A, 0xFB, 0x1B, 0x54, 0x33, 0x8D, 0x3A, 0x0B, 0x43, 0x51, 0x6C, 0x22, 0xB8, 0x29,
+    0xC5, 0x11, 0x1F, 0x28, 0xF5, 0x82, 0x5F, 0xCF, 0x0A, 0xB0, 0xBF, 0xDA, 0x90, 0x13, 0xCE, 0x69,
+    0xFF, 0x05, 0x85, 0x9D, 0x80, 0xF3, 0x3D, 0x4B, 0x21, 0xAB, 0xED, 0x73, 0xB9, 0xC4, 0xAD, 0x70,
+    0xEA, 0x17, 0x20, 0x78, 0xCA, 0xCC, 0x4E, 0x47, 0xCA, 0x30, 0xA8, 0xDB, 0x1C, 0x7B, 0x46, 0x3C,
+    0xC0, 0xE2, 0x96, 0xF8, 0x60, 0xDD, 0x43, 0xFE, 0x41, 0x7C, 0xD2, 0x7B, 0xB9, 0x90, 0x97, 0xF6,
+    0x86, 0x62, 0xD5, 0xF3, 0x49, 0x78, 0x81, 0xCF, 0x0C, 0xF1, 0x30, 0xC7, 0x37, 0x16, 0xDE, 0xB4,
+    0x93, 0x6A, 0xE0, 0x9F, 0x5B, 0x17, 0x43, 0x69, 0x7E, 0x54, 0xBB, 0x83, 0x4F, 0x1B, 0xA9, 0x70,
+    0x41, 0x97, 0x5A, 0x5D, 0x6E, 0x51, 0x1F, 0xEA, 0xDF, 0x44, 0xFB, 0x2D, 0x1E, 0xB9, 0xF9, 0xA4,
+    0xCE, 0x11, 0xD5, 0x6C, 0x43, 0xF5, 0xD1, 0x23, 0x7B, 0x7E, 0x30, 0x4B, 0x82, 0xF4, 0x3F, 0x9C,
+    0x53, 0xF5, 0xC8, 0xF6, 0xA1, 0xAB, 0x39, 0xD2, 0x01, 0xD5, 0xEA, 0x01, 0xFF, 0x75, 0xFD, 0x23,
+    0x63, 0xBE, 0x4C, 0x70, 0xC0, 0xF6, 0x78, 0xED, 0x83, 0x79, 0x19, 0x33, 0x58, 0xEA, 0x73, 0xC4,
+    0xE9, 0x0E, 0xF6, 0x89, 0x3C, 0xD4, 0x0C, 0xF6, 0xBE, 0xAC, 0x81, 0x32, 0x70, 0x24, 0x7D, 0xEA,
+    0x70, 0xBF, 0xC4, 0x45, 0x56, 0x8C, 0x49, 0x91, 0xA4, 0x04, 0x76, 0x84, 0x5B, 0x43, 0x11, 0x72,
+    0x74, 0x1C, 0xF5, 0xEB, 0x93, 0x42, 0x87, 0x1D, 0x6B, 0x16, 0x9F, 0xAD, 0xCA, 0x9B, 0xD3, 0x1F,
+    0x78, 0x1A, 0x0A, 0xC5, 0x7D, 0x44, 0xD2, 0xDE, 0x91, 0x0C, 0x3E, 0x12, 0x74, 0xDF, 0x92, 0xF7,
+    0x96, 0xD3, 0x6E, 0x76, 0xD6, 0x98, 0x48, 0x78, 0x77, 0x92, 0xC9, 0x45, 0xD8, 0x75, 0xB3, 0x84,
+    0xDC, 0x1A, 0x2A, 0x0E, 0xAF, 0xD8, 0xB2, 0x6D, 0x88, 0x60, 0xEE, 0x77, 0x4A, 0xFE, 0x4B, 0xC1,
+    0x2E, 0x27, 0x4C, 0x4F, 0x31, 0x51, 0x5B, 0x92, 0x75, 0xC2, 0x41, 0x7F, 0xB0, 0x43, 0x09, 0xC7,
+    0xBA, 0xB0, 0xB3, 0x9B, 0x27, 0x3D, 0xD4, 0x10, 0x59, 0xD3, 0x4F, 0xB8, 0x7C, 0xFF, 0xC8, 0x4C,
+    0x06, 0xCA, 0xB4, 0x5C, 0x37, 0xA4, 0xCD, 0x12, 0x60, 0x5C, 0x15, 0xB2, 0xA2, 0xAA, 0x81, 0x1A,
+    0x17, 0x7D, 0xD9, 0xF6, 0x31, 0xD6, 0xEB, 0xE7, 0xE7, 0x16, 0x85, 0x36, 0x3C, 0xE3, 0x57, 0x76,
+    0xAC, 0x35, 0xE3, 0xEC, 0x0F, 0xB7, 0x9B, 0xD5, 0xD1, 0x8E, 0x63, 0x7F, 0x1A, 0xB8, 0x23, 0x02,
+    0x50, 0x62, 0x06, 0xBF, 0xE5, 0x14, 0x2D, 0xED, 0xF0, 0x68, 0xEF, 0x8B, 0x82, 0x35, 0x29, 0x8A,
+    0xE1, 0x64, 0x14, 0xFB, 0xAA, 0x4B, 0xE3, 0x2B, 0x91, 0x6A, 0x1D, 0x8E, 0xB2, 0x60, 0xC1, 0xC4,
+    0x5A, 0x0B, 0xA5, 0xD6, 0xA1, 0xE8, 0x91, 0x97, 0xA1, 0x51, 0xBD, 0x81, 0xD0, 0xB5, 0x7F, 0x69,
+    0x4A, 0xA8, 0x5D, 0xB5, 0x36, 0x55, 0x22, 0xE2, 0x7E, 0x1C, 0x53, 0xE2, 0x5B, 0x57, 0x17, 0x62,
+    0x96, 0xC8, 0x7E, 0x31, 0xCB, 0xE0, 0xC6, 0x71, 0x5E, 0xC1, 0xB9, 0xD6, 0x54, 0x22, 0x49, 0xEF,
+    0xDD, 0x50, 0xB0, 0x88, 0xC0, 0x0F, 0x16, 0xE7, 0xD6, 0xBA, 0x9A, 0x08, 0xAC, 0xD6, 0x78, 0xDA,
+    0x80, 0xDF, 0x7D, 0x69, 0x97, 0xD4, 0xA7, 0x97, 0xFA, 0xDF, 0x76, 0x54, 0xE4, 0x3B, 0x1D, 0xF1,
+    0x98, 0xC4, 0x68, 0xA6, 0xE8, 0x0B, 0x27, 0xE1, 0x0C, 0x2C, 0xC2, 0x8F, 0x88, 0xB3, 0x31, 0xFF,
+    0x3A, 0xDB, 0x90, 0x1C, 0x59, 0x2A, 0x88, 0x54, 0x26, 0x7E, 0xCB, 0xFF, 0x73, 0x99, 0xE5, 0xCF,
+    0x31, 0x8B, 0x69, 0xDB, 0x8F, 0x28, 0x4D, 0x3B, 0x2F, 0x63, 0xC8, 0xEB, 0x61, 0x3E, 0x95, 0xBC,
+    0x8B, 0x5C, 0x1C, 0xCA, 0xED, 0x43, 0xDF, 0x1A, 0x94, 0xF4, 0xF1, 0xF2, 0x7D, 0x37, 0x71, 0xC2,
+    0x28, 0xE7, 0xFE, 0x69, 0x69, 0x3B, 0x6D, 0x31, 0x3A, 0xE7, 0x0F, 0x26, 0xCE, 0xCD, 0x19, 0xA5,
+    0xE0, 0x66, 0x29, 0x54, 0x65, 0x43, 0x43, 0xB9, 0x22, 0x86, 0x0E, 0x2E, 0xD5, 0x63, 0x55, 0xA8,
+    0x78, 0x05, 0x54, 0xE3, 0x1E, 0xEC, 0x01, 0x67, 0xB4, 0x22, 0xFC, 0x18, 0xDB, 0x53, 0x6F, 0x97,
+    0xC0, 0xEB, 0x58, 0x57, 0x49, 0xDC, 0xBD, 0x76, 0xCA, 0x00, 0x46, 0xE3, 0x7F, 0x4D, 0x53, 0xAC,
+    0xDC, 0x77, 0xF3, 0xAF, 0x4F, 0x5A, 0x85, 0xC8, 0x37, 0x2B, 0x41, 0x63, 0x6F, 0xD7, 0x25, 0x61,
+    0x6D, 0x09, 0x9C, 0xEB, 0x43, 0xE2, 0xE8, 0x49, 0x72, 0xCD, 0x8E, 0x1C, 0xD0, 0x8E, 0xD3, 0x96,
+    0x1F, 0x98, 0xAA, 0x2B, 0xF6, 0x47, 0x4D, 0x92, 0x2A, 0xAA, 0x41, 0xA5, 0xA9, 0x71, 0xFE, 0x6C,
+    0x43, 0x7E, 0xB8, 0x21, 0x4A, 0x58, 0xA4, 0xF7, 0x5D, 0xF8, 0x44, 0xC4, 0xE8, 0x9A, 0xA7, 0xB9,
+    0xAC, 0x97, 0xD4, 0x8D, 0xA6, 0xC4, 0x04, 0x43, 0x30, 0x21, 0x54, 0x16, 0x92, 0x49, 0x77, 0x7D,
+    0xEA, 0xD1, 0x1F, 0xB4, 0x75, 0xF4, 0x1F, 0x73, 0xD0, 0xEA, 0x0F, 0xA6, 0x60, 0x4B, 0xE9, 0xDE,
+    0x79, 0x4C, 0xFF, 0xD9, 0xAB, 0x9D, 0xA6, 0x92, 0xE8, 0x64, 0x25, 0x2F, 0x75, 0x97, 0x5C, 0x7A,
+    0x7E, 0xF1, 0x5A, 0xE1, 0x6D, 0xD7, 0x16, 0x5A, 0x42, 0x83, 0x43, 0xDD, 0x8D, 0x22, 0xEB, 0xEE,
+    0x63, 0xB0, 0x73, 0x67, 0x83, 0x1E, 0xF8, 0x7C, 0xB6, 0x5B, 0xA5, 0xF9, 0xD1, 0xFF, 0x8A, 0xAD,
+    0x9A, 0x75, 0x4A, 0x3D, 0x37, 0x67, 0x40, 0x78, 0xD5, 0x2A, 0xB3, 0xBE, 0xF3, 0x66, 0x3F, 0x51,
+    0x94, 0x79, 0x2D, 0x98, 0xB7, 0x29, 0x81, 0x9B, 0xC3, 0xC4, 0x28, 0x38, 0xB3, 0x99, 0x84, 0xBA,
+    0x50, 0x15, 0x66, 0x68, 0x40, 0x3D, 0xCD, 0xAF, 0x3B, 0xF3, 0x1F, 0xD1, 0xE4, 0x17, 0x80, 0x74,
+    0xE3, 0x14, 0xBF, 0xB3, 0x3D, 0xC3, 0xC2, 0x07, 0x1E, 0x74, 0x57, 0x96, 0xDF, 0xE4, 0x62, 0xBA,
+    0x4C, 0x57, 0x47, 0x0A, 0x09, 0xC2, 0x46, 0x81, 0xF5, 0xBB, 0x77, 0x34, 0x49, 0x3B, 0xBB, 0x02,
+    0xDC, 0xF1, 0x15, 0x99, 0x15, 0xB8, 0xF0, 0xD2, 0x28, 0xD5, 0xC8, 0x79, 0xAB, 0xAF, 0xF8, 0x83,
+    0xE3, 0x57, 0x9A, 0x5E, 0xC0, 0x0C, 0x72, 0x2E, 0xD8, 0xB7, 0xDE, 0xAB, 0x27, 0x49, 0xEC, 0x4E,
+    0x8E, 0xB0, 0x49, 0x65, 0xDD, 0x2F, 0x56, 0xA4, 0xBE, 0x04, 0x90, 0x9C, 0xCA, 0x76, 0x5F, 0x59,
+    0x94, 0x99, 0x5F, 0x97, 0xFD, 0xA7, 0x38, 0xD2, 0x7F, 0x53, 0xBC, 0x7B, 0x0F, 0x6F, 0xC9, 0xE5,
+    0x3A, 0x0F, 0x94, 0x2C, 0xBA, 0x85, 0x6D, 0xAE, 0xF7, 0x21, 0x6A, 0x64, 0xFD, 0xAA, 0x65, 0xD8,
+    0x30, 0xB3, 0x0A, 0x6C, 0x91, 0xC6, 0xB6, 0x29, 0x8D, 0x68, 0xC7, 0x1A, 0x06, 0x9C, 0x58, 0x30,
+    0x3C, 0xF2, 0xC6, 0x15, 0xD3, 0x8A, 0xC9, 0xA0, 0x4D, 0x56, 0x88, 0xC7, 0xC2, 0x4E, 0x47, 0x87,
+    0x9F, 0x20, 0x13, 0x6C, 0xEF, 0xC4, 0x6D, 0x31, 0x47, 0xB3, 0xEB, 0xBC, 0x61, 0x11, 0xE1, 0xA1,
+    0xD8, 0x6E, 0x2B, 0x5C, 0xC1, 0xFD, 0xC3, 0x75, 0xBF, 0x70, 0xBC, 0x77, 0x4E, 0x47, 0x65, 0xE5,
+    0xEC, 0xDD, 0x70, 0x24, 0x63, 0xA9, 0xD6, 0x9C, 0xA9, 0x0C, 0x86, 0xDB, 0xC0, 0x3D, 0x96, 0x65,
+    0xA4, 0x9D, 0x89, 0xF1, 0xB1, 0x65, 0x16, 0x29, 0x3E, 0x8C, 0x97, 0xC0, 0x73, 0xED, 0xD1, 0x96,
+    0x84, 0x17, 0x8D, 0x66, 0x8E, 0x7F, 0x47, 0xD1, 0x64, 0x7F, 0x83, 0x54, 0xE6, 0xD3, 0xA0, 0x6E,
+    0xB7, 0xB0, 0xA5, 0x7E, 0x8E, 0xFE, 0xBD, 0xA9, 0xDE, 0x0B, 0x7E, 0xE9, 0x68, 0x82, 0x2B, 0x59,
+    0xF2, 0xA2, 0x45, 0x86, 0x84, 0xEF, 0x04, 0x18, 0x6E, 0x5F, 0x5D, 0x21, 0xED, 0x8B, 0xAE, 0x65,
+    0x0A, 0xC4, 0xD0, 0xD8, 0x2A, 0x9E, 0x81, 0x85, 0x78, 0x2B, 0x4E, 0x11, 0x47, 0xC6, 0x60, 0x31,
+    0x63, 0xB1, 0x9A, 0xEB, 0x55, 0x34, 0x98, 0x27, 0x9E, 0xCC, 0x7D, 0x28, 0x1B, 0xF9, 0xFF, 0x4D,
+    0x14, 0xF1, 0x48, 0x88, 0x8C, 0x26, 0xDE, 0x1F, 0xF3, 0xE0, 0xCB, 0xD1, 0x4A, 0x06, 0x0C, 0xE0,
+    0x79, 0x07, 0x6F, 0x01, 0xF6, 0x0F, 0x7B, 0x6E, 0x9E, 0x21, 0x0A, 0x7C, 0x8D, 0xDC, 0xAB, 0xE9,
+    0xDB, 0xCB, 0xC8, 0x68, 0x4F, 0x20, 0xBB, 0xDB, 0xF6, 0x3A, 0xEC, 0xD4, 0x52, 0x6F, 0xDF, 0xFF,
+    0x39, 0xAB, 0x30, 0xF9, 0xBF, 0xCB, 0xC6, 0xC6, 0x63, 0x6B, 0xFE, 0x38, 0xF8, 0x50, 0x56, 0x00,
+    0x23, 0xF9, 0xB7, 0x33, 0xE2, 0x93, 0x0A, 0x4A, 0xA1, 0x20, 0x85, 0xEC, 0x88, 0x0E, 0x83, 0x57,
+    0x25, 0x38, 0x91, 0x48, 0x99, 0x0D, 0xAA, 0x28, 0xEA, 0xBF, 0x66, 0x01, 0xC5, 0x08, 0xFF, 0xC6,
+    0x78, 0x37, 0x36, 0x51, 0x0B, 0xF0, 0x63, 0x74, 0xC5, 0x3E, 0x14, 0x9C, 0xE4, 0x4B, 0x3A, 0x71,
+    0x02, 0x96, 0x3F, 0x56, 0xF0, 0x9C, 0xCA, 0x9C, 0xAB, 0xA7, 0x86, 0x7E, 0xB0, 0x9E, 0xFB, 0x58,
+    0xDE, 0xE5, 0x6E, 0x47, 0xEE, 0x80, 0x39, 0x52, 0xD9, 0xCA, 0xE6, 0xC9, 0xA7, 0x9C, 0x89, 0xB0,
+    0x52, 0x68, 0xAB, 0x4B, 0x3F, 0x86, 0xD3, 0x11, 0xE6, 0xFC, 0x2C, 0x77, 0x8C, 0x5C, 0x6E, 0x19,
+    0xD8, 0x53, 0x95, 0xA4, 0x46, 0x08, 0xAC, 0x7D, 0x5D, 0xFB, 0xDE, 0x6C, 0x4D, 0x45, 0xA3, 0x41,
+    0x9D, 0xCE, 0xC5, 0xB1, 0x49, 0xBD, 0x06, 0xF6, 0x74, 0x2F, 0x82, 0xF6, 0x91, 0x4D, 0xDE, 0x8A,
+    0x2D, 0xD8, 0xAF, 0x17, 0xFB, 0xC8, 0x85, 0xE2, 0x19, 0x39, 0xDD, 0x1B, 0x58, 0x2B, 0x4F, 0xB6,
+    0xED, 0x32, 0x35, 0xF6, 0xEB, 0x12, 0xCE, 0x7F, 0xD1, 0x3C, 0xF1, 0x6E, 0xC4, 0xE5, 0xBA, 0x6E,
+    0x92, 0xF7, 0x36, 0xF0, 0x84, 0xB3, 0x36, 0xFE, 0x89, 0x4C, 0xFE, 0xA7, 0x9D, 0x73, 0x98, 0x28,
+    0xBB, 0x01, 0x5A, 0x9B, 0x76, 0x6C, 0x82, 0x81, 0x55, 0x3B, 0xA9, 0x42, 0xD7, 0x7A, 0x37, 0x0C,
+    0x3E, 0x1D, 0x6D, 0xB6, 0xF8, 0xD7, 0xA5, 0xAC, 0x5A, 0xBF, 0x83, 0x16, 0x10, 0x2B, 0x2F, 0x25,
+    0x2D, 0x28, 0x7F, 0xD3, 0xB4, 0xC3, 0x54, 0x1D, 0x7E, 0x36, 0xF1, 0x00, 0x80, 0xD5, 0x50, 0xA0,
+    0xB7, 0x81, 0xAB, 0x6E, 0xA9, 0xEF, 0x7F, 0xB2, 0x1E, 0xA5, 0xE4, 0x62, 0x06, 0x49, 0xB3, 0xA8,
+    0x61, 0xD2, 0x6C, 0xED, 0x4B, 0xF7, 0xAD, 0xD3, 0x4C, 0x1F, 0x23, 0xB1, 0x5B, 0x54, 0x1B, 0xA5,
+    0xAA, 0x5F, 0x92, 0x6D, 0x6D, 0x23, 0xB2, 0x5F, 0x73, 0xC5, 0x1A, 0x1E, 0xD9, 0x17, 0xE5, 0x19,
+    0xAF, 0x30, 0x9B, 0x77, 0x0D, 0xF5, 0xC4, 0xAF, 0xDF, 0x57, 0x72, 0x25, 0xAE, 0xA6, 0x63, 0xFD,
+    0xB3, 0xAF, 0x73, 0x1B, 0x37, 0x12, 0x1F, 0x4C, 0x62, 0x93, 0xC3, 0x3B, 0x07, 0x59, 0xEA, 0x82,
+    0xB5, 0x4D, 0xCF, 0x90, 0xC7, 0x36, 0x08, 0xA4, 0xE7, 0x69, 0xE5, 0xF9, 0x6E, 0x84, 0x68, 0x6D,
+    0x2A, 0x00, 0x27, 0x3B, 0x7E, 0xD4, 0x34, 0x6B, 0x1B, 0xFB, 0x0C, 0x8F, 0xF4, 0x03, 0x31, 0x39,
+    0x79, 0x07, 0x53, 0x04, 0x54, 0xFA, 0x6E, 0x23, 0x0D, 0x95, 0x6D, 0xF9, 0x7D, 0xCA, 0x1B, 0x08,
+    0xDE, 0xD9, 0xC0, 0xFE, 0x99, 0x76, 0x8A, 0xE4, 0x41, 0x33, 0x6F, 0x83, 0xC1, 0x55, 0xDA, 0xE7,
+    0x23, 0xA4, 0x56, 0x0A, 0xC5, 0x06, 0x1E, 0x0D, 0xB1, 0x7F, 0x5B, 0xDB, 0x9A, 0xE5, 0x39, 0x28,
+    0x3B, 0x41, 0xC6, 0x22, 0xAC, 0x23, 0x09, 0x43, 0x3B, 0x16, 0xFF, 0x02, 0xC9, 0x3D, 0xC3, 0x53,
+    0x0E, 0xF9, 0xDB, 0x8A, 0x3B, 0xA0, 0xF5, 0xCC, 0x89, 0x2D, 0x59, 0xFF, 0xB1, 0x39, 0xB1, 0xB4,
+    0x0E, 0x9C, 0x98, 0x8F, 0x27, 0xF7, 0x6F, 0x91, 0x8B, 0x53, 0x67, 0x8B, 0xA2, 0x5E, 0xC0, 0x17,
+    0x84, 0x3C, 0x76, 0xD2, 0xB8, 0x9A, 0x10, 0x8D, 0x0B, 0xAE, 0x3E, 0xA9, 0x51, 0x50, 0xC1, 0x94,
+    0x05, 0xB2, 0x8B, 0x88, 0x67, 0xFE, 0x76, 0x0F, 0xAF, 0xD6, 0x88, 0xFD, 0x38, 0x9F, 0xF8, 0xA9,
+    0x27, 0xB8, 0xB3, 0x99, 0x97, 0x1A, 0xD6, 0x82, 0x8E, 0x92, 0x8E, 0x85, 0x7B, 0x85, 0xD4, 0x94,
+    0xF8, 0x4F, 0x9A, 0xF1, 0xC8, 0xE6, 0x9A, 0x1F, 0xC8, 0xA3, 0xD7, 0x87, 0xAD, 0x0C, 0xF8, 0x34,
+    0x00, 0x7E, 0x30, 0xCC, 0xBE, 0x8E, 0xD9, 0x44, 0xF3, 0xBF, 0x98, 0xCF, 0xBF, 0x0F, 0x78, 0xBA,
+    0x39, 0xD7, 0x20, 0x94, 0x46, 0x4A, 0xE2, 0x8A, 0xB0, 0x22, 0x5C, 0x8E, 0x43, 0xF8, 0xC3, 0x1D,
+    0x4F, 0x6B, 0x4A, 0x14, 0x26, 0x9A, 0xD3, 0x10, 0xD4, 0xD3, 0x99, 0xB6, 0xD4, 0xC8, 0x6A, 0x8E,
+    0x5D, 0x45, 0x09, 0x14, 0x30, 0x28, 0xE6, 0x75, 0xCB, 0x4C, 0x28, 0xB7, 0x27, 0x36, 0x6D, 0x4F,
+    0xFE, 0x25, 0xCB, 0xD5, 0xAF, 0x0B, 0xA1, 0x61, 0x77, 0x7C, 0x64, 0x28, 0xDB, 0x74, 0x65, 0x2C,
+    0xA7, 0x88, 0x3F, 0xF8, 0xA0, 0xFC, 0xD3, 0xCF, 0x99, 0x4B, 0xE8, 0xDE, 0xB7, 0x16, 0xA2, 0x80,
+    0x16, 0x8F, 0xBB, 0x53, 0x27, 0x72, 0x6B, 0x53, 0xAB, 0x80, 0xAB, 0x37, 0xE8, 0x7C, 0x16, 0x31,
+    0xA9, 0x81, 0xDF, 0x36, 0xD3, 0x69, 0xD9, 0xA1, 0xA9, 0x4B, 0x8F, 0x1F, 0x85, 0x64, 0x6E, 0x4D,
+    0x39, 0x79, 0x47, 0x87, 0xF3, 0x0B, 0xB9, 0xF9, 0xE1, 0xF7, 0x6E, 0x5F, 0x29, 0x0B, 0x32, 0xEE,
+    0xBA, 0x79, 0x01, 0x34, 0x1F, 0x1C, 0xF0, 0x03, 0xEE, 0x96, 0x2F, 0x76, 0x4E, 0x2E, 0x0F, 0xD1,
+    0x8B, 0x94, 0x61, 0x9B, 0x33, 0x16, 0xFD, 0xA7, 0x37, 0x6F, 0x6D, 0x6C, 0x5B, 0xCA, 0xA4, 0x9F,
+    0x19, 0x69, 0x4E, 0x17, 0xEC, 0x02, 0xE6, 0x49, 0xAA, 0x7E, 0x8E, 0xC0, 0xE9, 0x15, 0x54, 0x2F,
+    0xA6, 0x01, 0xE9, 0x27, 0x9F, 0x2E, 0x9D, 0x85, 0x4D, 0xFF, 0x3E, 0x78, 0x0B, 0x14, 0xAC, 0x19,
+    0x78, 0x30, 0xCF, 0xA0, 0x24, 0x01, 0x7B, 0x1D, 0x82, 0x43, 0x02, 0xAC, 0xF7, 0x6C, 0x0C, 0xA9,
+    0xC7, 0x74, 0xE3, 0x8E, 0x15, 0xC1, 0xF2, 0xAD, 0x9D, 0x58, 0xDA, 0x50, 0x93, 0x69, 0x4F, 0x74,
+    0x5A, 0xD2, 0xB5, 0xA0, 0x06, 0x08, 0x9D, 0xC0, 0x0F, 0x27, 0x2B, 0x19, 0x82, 0x41, 0x27, 0x32,
+    0x66, 0xBC, 0xAA, 0x4E, 0x90, 0x44, 0x88, 0x33, 0x6E, 0x60, 0xBC, 0x7C, 0xDA, 0x29, 0x04, 0x94,
+    0x19, 0xF7, 0xD8, 0x5E, 0x99, 0x7F, 0xEF, 0xA8, 0xBD, 0x3A, 0xE0, 0x6A, 0xB6, 0xA8, 0x00, 0x15,
+    0x29, 0x04, 0xF1, 0x41, 0x3F, 0x2B, 0xF7, 0x59, 0x3E, 0x8E, 0xAB, 0x8D, 0x84, 0x26, 0x2D, 0xC2,
+    0xAD, 0xA7, 0x33, 0x6C, 0x08, 0xCA, 0xB4, 0x8A, 0xF8, 0x5E, 0xD7, 0x6A, 0x5B, 0x92, 0xCE, 0x70,
+    0x23, 0x01, 0x54, 0x88, 0xDB, 0xD7, 0xF5, 0x24, 0xED, 0xA8, 0x49, 0xDB, 0x5C, 0x4C, 0x25, 0xE1,
+    0xBB, 0xC7, 0x5E, 0x0D, 0x05, 0x0B, 0xD0, 0x26, 0x4F, 0x1D, 0xE4, 0xD6, 0xEB, 0x38, 0x30, 0xC5,
+    0x3F, 0x50, 0xB1, 0x46, 0x91, 0x01, 0x7A, 0xE3, 0x01, 0xD1, 0x17, 0x29, 0x4B, 0x56, 0x34, 0xAC,
+    0x72, 0xA0, 0xA5, 0x0C, 0xBB, 0x69, 0x93, 0x3D, 0x39, 0xE4, 0x8A, 0x94, 0x2C, 0xD9, 0xD0, 0x24,
+    0x24, 0x1C, 0x60, 0xA9, 0x79, 0xD6, 0xF2, 0x33, 0xBD, 0xB3, 0x7A, 0x61, 0x55, 0x7F, 0x66, 0xEF,
+    0xC5, 0xC8, 0xE7, 0x60, 0xFC, 0xA5, 0xAF, 0x44, 0x34, 0x7E, 0x30, 0x17, 0xC5, 0xB1, 0xC4, 0x35,
+    0xC7, 0x62, 0xBF, 0xA4, 0x6C, 0xD9, 0xD2, 0x86, 0xD7, 0xD7, 0x48, 0x5C, 0x8A, 0x67, 0x76, 0xFF,
+    0xBE, 0x34, 0x5B, 0x4E, 0x20, 0xD9, 0x9F, 0xB9, 0xD4, 0x94, 0x30, 0x22, 0x6B, 0xA9, 0x01, 0xBC,
+    0x7B, 0xEF, 0x35, 0xBD, 0x7D, 0x18, 0x68, 0x5B, 0x1D, 0x4A, 0xF5, 0x11, 0x57, 0x1D, 0xE3, 0x66,
+    0x8C, 0xA8, 0x40, 0xD9, 0xFA, 0x55, 0xB8, 0x83, 0xE9, 0x2C, 0xDE, 0x0E, 0xBA, 0xE2, 0x16, 0xEF,
+    0xA6, 0xE3, 0x5E, 0xA6, 0xD9, 0x1F, 0x17, 0x97, 0xCE, 0x78, 0xAC, 0x8A, 0xA0, 0x5C, 0x51, 0x2D,
+    0xF4, 0xDE, 0xCE, 0x14, 0x57, 0xA0, 0x3A, 0x36, 0x0C, 0xAB, 0xF9, 0xEB, 0xC0, 0x91, 0x57, 0xED,
+    0x21, 0x3D, 0x39, 0x87, 0x61, 0x93, 0x8E, 0x3E, 0x55, 0x3A, 0x7A, 0x2F, 0x1B, 0xA1, 0x00, 0x89,
+    0xB5, 0xF7, 0x1C, 0xE0, 0x08, 0x74, 0x00, 0xD8, 0x9B, 0x4A, 0x74, 0x37, 0xE6, 0x24, 0xDB, 0x7B,
+    0xAE, 0xA9, 0xF8, 0x92, 0x35, 0x44, 0x3A, 0x0B, 0xDB, 0xB7, 0xED, 0x65, 0xAA, 0x5F, 0x7F, 0xE3,
+    0x35, 0xD5, 0x2D, 0x24, 0x74, 0x53, 0xA6, 0x1D, 0x55, 0x60, 0x1F, 0xB6, 0x22, 0x9C, 0x14, 0xBA,
+    0x63, 0x52, 0x7F, 0x88, 0xF9, 0x90, 0xBC, 0xE9, 0xDB, 0x80, 0xB5, 0x00, 0x2B, 0x12, 0x50, 0xE4,
+    0x10, 0xC9, 0xBB, 0x18, 0x76, 0x06, 0x8A, 0x93, 0xD3, 0x0B, 0xE4, 0xCB, 0x2E, 0x5C, 0xA3, 0x42,
+    0xC5, 0xFF, 0xCF, 0x9D, 0x53, 0xD1, 0x6B, 0xE7, 0x10, 0x7D, 0x9F, 0x3C, 0xC3, 0xF9, 0xB1, 0x5B,
+    0x8A, 0x15, 0x56, 0x63, 0xD5, 0x27, 0x40, 0x1E, 0x01, 0x1A, 0xDC, 0x0C, 0x6B, 0x7D, 0x42, 0x91,
+    0xDD, 0x63, 0x9D, 0x1A, 0xA9, 0xA8, 0xB0, 0xC5, 0xE4, 0x4A, 0x79, 0x4B, 0x04, 0x29, 0xDF, 0x22,
+    0x59, 0xC1, 0xF3, 0xAB, 0x09, 0x00, 0x51, 0xEE, 0x3A, 0x96, 0xE1, 0x7B, 0xDB, 0xC2, 0x36, 0x41,
+    0x60, 0xB1, 0x84, 0x74, 0x76, 0xB4, 0xA0, 0xD2, 0x2F, 0x95, 0x5A, 0x89, 0x42, 0xB7, 0x57, 0xCD,
+    0xFB, 0x3E, 0x5B, 0x33, 0xDC, 0x0A, 0x62, 0x18, 0x0F, 0x98, 0x71, 0x9B, 0xE6, 0x74, 0x19, 0x39,
+    0xF6, 0xFF, 0x69, 0x4B, 0x5C, 0x24, 0x18, 0xF9, 0x3A, 0xD5, 0x70, 0x1F, 0x7B, 0x5D, 0xAC, 0x01,
+    0xE9, 0xFE, 0xC2, 0x9E, 0xB5, 0x28, 0xB2, 0xFF, 0x5A, 0xCB, 0xA2, 0x1A, 0xF2, 0xEA, 0x7D, 0xA0,
+    0x7A, 0xCC, 0x89, 0xEB, 0x0A, 0x1C, 0x81, 0x2B, 0x8F, 0xF3, 0x2D, 0xF5, 0x67, 0x58, 0xF9, 0x10,
+    0x3A, 0x8F, 0x9E, 0x0A, 0x04, 0xAD, 0x7F, 0xB2, 0x2D, 0xCB, 0xCC, 0x3D, 0x84, 0x38, 0x46, 0x1B,
+    0x9A, 0xE1, 0xAA, 0xB2, 0x7E, 0xA7, 0xF3, 0x5E, 0x43, 0x7B, 0x67, 0x7F, 0xC8, 0x0F, 0x45, 0xC0,
+    0xB8, 0xEE, 0xE6, 0x68, 0x16, 0x1E, 0xBF, 0x14, 0xA5, 0xD1, 0xDA, 0x12, 0x7F, 0x42, 0x3B, 0x18,
+    0xD3, 0x85, 0x8A, 0xEB, 0x2A, 0x47, 0xCF, 0xEB, 0x85, 0xFB, 0xA5, 0x10, 0x98, 0x4C, 0x56, 0x4B,
+    0x63, 0x8A, 0x86, 0xD9, 0x98, 0x36, 0xB5, 0x2B, 0x4A, 0xA1, 0xC9, 0x2B, 0x7F, 0xF9, 0xC9, 0x29,
+    0x9C, 0x90, 0xFE, 0x58, 0x2B, 0x85, 0xD8, 0x01, 0x93, 0x0E, 0x2A, 0x5B, 0x0E, 0xCA, 0xD6, 0xB6,
+    0x8F, 0xE1, 0x49, 0x9C, 0x49, 0xEE, 0x83, 0xAD, 0x28, 0x33, 0x94, 0xFB, 0xA9, 0x2B, 0x47, 0x35,
+    0xCF, 0xBD, 0x1F, 0x06, 0xFB, 0x9E, 0x70, 0xA4, 0xEC, 0x26, 0x79, 0x36, 0x3F, 0x67, 0xCF, 0x71,
+    0x61, 0x00, 0x35, 0xD8, 0xB2, 0x3B, 0x03, 0x02, 0xD7, 0x80, 0x69, 0xE3, 0x22, 0x5F, 0x57, 0xD6,
+    0x0A, 0x12, 0x77, 0xBB, 0x51, 0x93, 0xAC, 0xBF, 0x8A, 0xDC, 0x88, 0x48, 0x77, 0x5F, 0xD9, 0x40,
+    0x01, 0x93, 0x83, 0xAD, 0x71, 0x32, 0xFA, 0xF8, 0xF7, 0x1D, 0x81, 0xE2, 0x6B, 0xB9, 0x39, 0xE3,
+    0xB7, 0x4C, 0x22, 0xEA, 0x38, 0x1B, 0xF5, 0x03, 0x9D, 0xBC, 0x5A, 0x81, 0xA5, 0x87, 0xB8, 0x8D,
+    0x91, 0x59, 0xA8, 0xBE, 0xB0, 0x47, 0x68, 0x14, 0x70, 0xC2, 0xE0, 0x65, 0xBA, 0x4B, 0xF4, 0x18,
+    0x7E, 0xDD, 0xDD, 0x6B, 0xE2, 0xE1, 0x95, 0x14, 0xA0, 0x3E, 0x26, 0xA5, 0x43, 0x54, 0x51, 0xFE,
+    0x26, 0x24, 0x90, 0xA3, 0x32, 0xB3, 0xE6, 0xB4, 0x8D, 0xF0, 0x7A, 0x77, 0x76, 0x2E, 0xE1, 0x0B,
+    0x32, 0x44, 0x7B, 0x5F, 0x6B, 0x3F, 0x3C, 0x1E, 0x03, 0x0C, 0x49, 0x6E, 0x22, 0x5B, 0x18, 0x5F,
+    0x49, 0x72, 0xDA, 0x3E, 0xB4, 0xB8, 0xA4, 0xE4, 0xB9, 0xED, 0xAA, 0xC6, 0xAB, 0xB1, 0x69, 0x80,
+    0x55, 0xCD, 0x9C, 0xDF, 0x03, 0xC1, 0x24, 0xEC, 0xA7, 0xA1, 0x8C, 0x15, 0x6C, 0x1B, 0x3B, 0xBA,
+    0xA5, 0xCF, 0xDF, 0x7B, 0x38, 0x81, 0xDF, 0x40, 0xF1, 0xA4, 0x03, 0x7B, 0x57, 0xAD, 0x75, 0x96,
+    0xE9, 0xC2, 0xEE, 0x76, 0x90, 0x81, 0x3E, 0xE8, 0xD3, 0x23, 0x9B, 0x96, 0x3E, 0xF6, 0xF8, 0xFE,
+    0xC5, 0x52, 0xA3, 0xBB, 0x68, 0x98, 0xFF, 0x92, 0xE7, 0xED, 0xC1, 0xDD, 0xF8, 0x6C, 0xC5, 0xBC,
+    0xC4, 0x6A, 0x50, 0x53, 0x95, 0x28, 0x1D, 0x8D, 0x84, 0x90, 0xEE, 0xB0, 0x27, 0x4C, 0xE9, 0x7C,
+    0x2E, 0x46, 0x94, 0xF5, 0xE3, 0xBB, 0xEB, 0x9F, 0x6E, 0xD1, 0x6B, 0x6F, 0x83, 0xCB, 0x2A, 0x5A,
+    0x22, 0xAC, 0x67, 0xE4, 0x5C, 0xF9, 0x57, 0x20, 0x42, 0xA7, 0xA6, 0x89, 0x22, 0x08, 0x68, 0x92,
+    0x64, 0x1B, 0x4B, 0x82, 0xD3, 0x62, 0xE6, 0x80, 0xAC, 0x84, 0x36, 0x19, 0x24, 0x55, 0x02, 0x4C,
+    0x79, 0x32, 0xAD, 0x22, 0xF4, 0xE0, 0x46, 0x7B, 0x8B, 0x96, 0x9A, 0xEC, 0xC7, 0x67, 0xA1, 0x21,
+    0x8F, 0x5C, 0x48, 0xFC, 0x52, 0xC7, 0x33, 0xA8, 0x22, 0xA0, 0x3D, 0x72, 0x44, 0x7E, 0xEB, 0x8F,
+    0x19, 0xBE, 0x54, 0x98, 0x96, 0x91, 0xA2, 0xCA, 0x72, 0xA6, 0xAE, 0x5E, 0xA8, 0xA6, 0xC9, 0x14,
+    0xB3, 0x09, 0xA4, 0x2B, 0x3B, 0xF8, 0x13, 0x13, 0x1D, 0x51, 0xDC, 0x93, 0x37, 0x1B, 0xFC, 0x18,
+    0xF9, 0xA4, 0xFA, 0x57, 0x3E, 0x8D, 0xF7, 0xF0, 0xD8, 0xBF, 0x8D, 0x83, 0x3F, 0x9B, 0x5A, 0x73,
+    0x63, 0x82, 0x56, 0x94, 0x2E, 0x02, 0x62, 0x61, 0x01, 0x3C, 0x20, 0x86, 0x44, 0xCA, 0xF8, 0xB7,
+    0x2D, 0xDA, 0x99, 0x25, 0xD7, 0x16, 0xE1, 0xEB, 0x71, 0xEB, 0x16, 0xBC, 0xEB, 0x2F, 0x93, 0x6D,
+    0x9F, 0xD2, 0xD0, 0xE8, 0xD4, 0xDD, 0x70, 0x8A, 0x2E, 0x82, 0xF6, 0x23, 0xF3, 0x11, 0x53, 0xC5,
+    0xE3, 0x87, 0x06, 0xF9, 0xE6, 0x0A, 0xEE, 0xBA, 0x7B, 0x2C, 0x03, 0xBB, 0x59, 0x60, 0x1E, 0xD2,
+    0x55, 0x43, 0xE6, 0xC1, 0x0C, 0x9E, 0x8A, 0x3A, 0x69, 0xEB, 0x0F, 0x9E, 0x34, 0x3D, 0x48, 0x5D,
+    0xB4, 0xC1, 0xC0, 0xEF, 0x50, 0x0E, 0xC6, 0x4A, 0xFB, 0xAC, 0x5F, 0x05, 0x03, 0x39, 0xDE, 0x3C,
+    0x09, 0xF4, 0x29, 0xC9, 0x62, 0x90, 0xFB, 0x0F, 0x78, 0x66, 0x31, 0x06, 0x2D, 0xE4, 0x1D, 0x4A,
+    0x80, 0xF0, 0x9E, 0x33, 0xBE, 0x89, 0x35, 0x8F, 0x5D, 0xC0, 0x86, 0x0B, 0xCF, 0x4B, 0xE0, 0xF8,
+    0xEF, 0x43, 0x69, 0x3D, 0x0D, 0xF7, 0x74, 0xC0, 0x42, 0x3A, 0x87, 0x44, 0x1D, 0xE4, 0x15, 0x82,
+    0x54, 0x13, 0xCB, 0x05, 0xFD, 0x1D, 0xE1, 0x34, 0x97, 0x91, 0xFB, 0x4B, 0x9F, 0xB8, 0x42, 0xAC,
+    0x9C, 0x97, 0x01, 0x26, 0x38, 0x76, 0xC5, 0x94, 0xCF, 0xA0, 0xA3, 0x18, 0x1D, 0x4C, 0x10, 0x63,
+    0xEE, 0x20, 0x6A, 0xAD, 0xFD, 0x85, 0xCF, 0x00, 0x9E, 0x3D, 0x63, 0xE9, 0x7F, 0x73, 0x30, 0x65,
+    0x39, 0xF4, 0x5C, 0x25, 0xE5, 0x64, 0x80, 0xE3, 0x42, 0x04, 0xCE, 0x25, 0xCB, 0x4B, 0x7C, 0x47,
+    0x09, 0x76, 0x1B, 0x92, 0xFA, 0x1E, 0x50, 0x66, 0x87, 0x24, 0x9B, 0x12, 0x77, 0x9B, 0xC0, 0x6E,
+    0x26, 0xC8, 0x29, 0x11, 0x29, 0x6E, 0xEC, 0x13, 0x83, 0x7B, 0xD4, 0x73, 0xDE, 0x86, 0x00, 0x08,
+    0xD0, 0xD5, 0xA1, 0xD0, 0xCB, 0xBF, 0x05, 0x1C, 0xBC, 0xBD, 0x6F, 0x65, 0x69, 0x45, 0x22, 0xFF,
+    0xBD, 0x0F, 0x02, 0xC0, 0xFC, 0x9B, 0x68, 0x4A, 0xC0, 0x60, 0xA4, 0x9E, 0x40, 0x50, 0xC5, 0xD2,
+    0x76, 0x08, 0x7E, 0x58, 0xB7, 0xE2, 0x4F, 0xA2, 0xCB, 0x0B, 0xA2, 0x56, 0x10, 0xAF, 0x40, 0xA9,
+    0xF1, 0x89, 0x77, 0xD6, 0xE8, 0xD5, 0x07, 0x9A, 0x77, 0x4D, 0x44, 0xFE, 0x18, 0x71, 0xCC, 0x4D,
+    0x1A, 0x20, 0x5C, 0x1B, 0x44, 0x7B, 0x1E, 0xB4, 0x25, 0x2C, 0xDF, 0xE5, 0x47, 0xD4, 0xA0, 0xC7,
+    0xB1, 0x2E, 0xDA, 0xFA, 0xB1, 0x76, 0xBB, 0xFD, 0xA0, 0x02, 0xEB, 0x4D, 0x04, 0x00, 0xCA, 0xAF,
+    0x45, 0x83, 0x58, 0xC6, 0x52, 0x71, 0x5A, 0x3D, 0x3C, 0xF7, 0xF2, 0x29, 0xA6, 0xA2, 0xA4, 0xF3,
+    0xC0, 0x30, 0xE0, 0x61, 0xB2, 0x55, 0x78, 0x2C, 0x57, 0x84, 0xB4, 0x33, 0xB3, 0xF8, 0xD9, 0x57,
+    0x81, 0x37, 0xA7, 0xC1, 0x14, 0x3F, 0x1C, 0x9B, 0x0B, 0x44, 0x99, 0xDB, 0x7C, 0x0E, 0x87, 0xF2,
+    0xAC, 0xA6, 0x71, 0xFD, 0xC9, 0x29, 0x2E, 0x3C, 0x67, 0x2C, 0x7F, 0xB2, 0xF7, 0xCB, 0x07, 0x82,
+    0x54, 0xC8, 0x92, 0x1A, 0x94, 0xEB, 0x46, 0x96, 0x7D, 0xBB, 0x08, 0x70, 0x8C, 0x8E, 0x5F, 0x7F,
+    0x2F, 0xAF, 0xAA, 0xF3, 0x6A, 0x2B, 0xA9, 0xF8, 0xDC, 0x92, 0x20, 0x9F, 0xC5, 0xFC, 0x18, 0xED,
+    0x03, 0x85, 0xB1, 0x86, 0xF2, 0x74, 0x93, 0x81, 0x5D, 0x07, 0x48, 0xE4, 0xED, 0xDC, 0x67, 0x4F,
+    0x12, 0xA0, 0x3B, 0x2A, 0x85, 0x4C, 0x04, 0xC7, 0xFA, 0x87, 0xC1, 0x25, 0x20, 0x96, 0x17, 0x5D,
+    0x89, 0xC4, 0x0E, 0x36, 0x9B, 0xA6, 0x92, 0x70, 0xFC, 0xF5, 0x1A, 0x5C, 0xAD, 0xED, 0xD8, 0xFD,
+    0xDD, 0x67, 0xC6, 0x3A, 0xF0, 0x5B, 0x16, 0xDF, 0x4E, 0x3F, 0xBF, 0xF9, 0x47, 0x9F, 0x01, 0x47,
+    0x73, 0xE1, 0x5A, 0x38, 0x7E, 0xC0, 0xA9, 0x18, 0x70, 0x00, 0x88, 0xFF, 0x21, 0x2B, 0x12, 0xF4,
+    0xC5, 0x4E, 0xC6, 0x80, 0x7D, 0xC4, 0x11, 0xB9, 0xC3, 0xF9, 0x5C, 0x69, 0x2A, 0x60, 0x6F, 0xE0,
+    0xC6, 0x79, 0x3D, 0x15, 0xC2, 0xE7, 0x23, 0xDA, 0xFB, 0x9B, 0xAB, 0x13, 0x1D, 0x6D, 0xBD, 0xC2,
+    0x6F, 0x3D, 0xF7, 0x44, 0xBD, 0x51, 0xF8, 0xA6, 0xD1, 0x47, 0x7D, 0x8C, 0xA8, 0x52, 0x56, 0xF7,
+    0x01, 0x04, 0xD5, 0x22, 0xE8, 0x16, 0x21, 0x61, 0x27, 0xC8, 0xE2, 0xF9, 0xA1, 0x55, 0x44, 0x5F,
+    0x8F, 0xC3, 0x22, 0x22, 0x3A, 0xCA, 0x2B, 0x05, 0x31, 0xCF, 0x88, 0x8E, 0x3B, 0xB0, 0x99, 0x1C,
+    0xAA, 0x96, 0xF9, 0xDB, 0x41, 0x91, 0x64, 0x0E, 0xE1, 0xF1, 0xE0, 0xB0, 0x50, 0x62, 0x5D, 0x6B,
+    0x36, 0xA7, 0x59, 0xD9, 0x2B, 0x77, 0x36, 0xA2, 0x18, 0xF4, 0x67, 0x74, 0xB8, 0x09, 0x88, 0x91,
+    0x38, 0x9A, 0x01, 0x7D, 0xDE, 0xDF, 0xC3, 0xBB, 0x08, 0x59, 0xE9, 0xAD, 0xA0, 0xEE, 0xC0, 0x4B,
+    0xC2, 0xBC, 0xB0, 0xAB, 0x4C, 0x32, 0xCB, 0x92, 0xC9, 0x97, 0x0D, 0xCF, 0x43, 0x83, 0x9D, 0xED,
+    0x40, 0x98, 0x8E, 0x1B, 0x2D, 0x67, 0x68, 0x7C, 0x68, 0x8A, 0x38, 0x71, 0xC8, 0xCB, 0x81, 0x32,
+    0x95, 0x86, 0x9E, 0x77, 0x5F, 0x9E, 0x85, 0xEE, 0x63, 0xC6, 0x41, 0x49, 0xD2, 0x98, 0xB0, 0x52,
+    0x41, 0xDE, 0x59, 0x54, 0x41, 0x64, 0x6F, 0xE5, 0x1E, 0x73, 0x15, 0xA6, 0x21, 0x51, 0x4A, 0x66,
+    0xAC, 0xB3, 0x0B, 0x69, 0x4C, 0xA3, 0xE5, 0xFA, 0xE5, 0xE3, 0xA9, 0xF5, 0x9A, 0x3A, 0x54, 0x04,
+    0x82, 0x89, 0xF0, 0x33, 0x8F, 0x5C, 0x0E, 0x1E, 0x80, 0x17, 0x8A, 0x0E, 0x2F, 0xF8, 0x2D, 0xF3,
+    0x84, 0xDE, 0xA7, 0x76, 0x1F, 0x4A, 0x39, 0xCA, 0x6C, 0x8E, 0xA6, 0x27, 0x4B, 0x8C, 0xC8, 0xE3,
+    0xFF, 0x60, 0xD9, 0xE0, 0xC2, 0x90, 0xD7, 0x8E, 0x28, 0xA4, 0xD4, 0xC9, 0xA9, 0x05, 0x27, 0xD1,
+    0x7D, 0x0C, 0xEA, 0x9F, 0x4B, 0x45, 0xC5, 0x34, 0xDA, 0xE4, 0xAC, 0x51, 0x23, 0xCC, 0xB0, 0x76,
+    0x41, 0x91, 0x92, 0x6B, 0x7E, 0x19, 0xDD, 0x7C, 0x8D, 0x3D, 0xB9, 0xA1, 0xB3, 0x77, 0xEB, 0xD5,
+    0x62, 0xAF, 0x45, 0x9C, 0xBD, 0x3B, 0xD4, 0x84, 0xAE, 0xA7, 0x8D, 0x3E, 0x47, 0xE1, 0xFB, 0x6C,
+    0xD5, 0x27, 0xC6, 0x39, 0x1F, 0x74, 0x5C, 0x4D, 0x95, 0xE4, 0x7A, 0x79, 0xA9, 0x9D, 0x29, 0x02,
+    0xC0, 0xC8, 0xA1, 0x33, 0xB8, 0xDF, 0x2A, 0x2E, 0xDC, 0x6F, 0x99, 0x9C, 0x49, 0xA3, 0x4C, 0x2A,
+    0x2A, 0xFA, 0x4B, 0x56, 0xE8, 0x84, 0x21, 0xBE, 0x6A, 0xDA, 0x6B, 0x71, 0x98, 0x20, 0x52, 0x32,
+    0xF3, 0xA9, 0xFA, 0x36, 0xC1, 0x42, 0x58, 0x3B, 0xDD, 0x5F, 0x05, 0x73, 0x5F, 0x3A, 0xEB, 0xC9,
+    0x7A, 0x8A, 0x84, 0xC1, 0xDE, 0x50, 0x67, 0x1C, 0x7B, 0x98, 0xCE, 0xD9, 0x9C, 0x12, 0x81, 0x99,
+    0xA5, 0x6B, 0x27, 0x8E, 0x32, 0x43, 0x12, 0xC9, 0xE1, 0x7A, 0x9A, 0x4D, 0xF6, 0x36, 0xAE, 0xF8,
+    0x99, 0x4A, 0xC2, 0x90, 0x77, 0x79, 0xEF, 0x10, 0x1A, 0x4D, 0xD6, 0x71, 0x6F, 0xFB, 0xB8, 0x83,
+    0x4E, 0x3F, 0xF3, 0xF9, 0xE5, 0xEB, 0xEB, 0xF9, 0x6E, 0x1C, 0x89, 0x47, 0x52, 0xED, 0x3F, 0x4D,
+    0xEF, 0x26, 0xA7, 0x3C, 0x4B, 0x46, 0x9A, 0x32, 0x1E, 0x80, 0x70, 0xBC, 0x5C, 0xF2, 0x80, 0x6E,
+    0x62, 0x7C, 0xAE, 0x80, 0xBB, 0x81, 0x82, 0x27, 0xCD, 0xA0, 0x86, 0x34, 0xD0, 0x80, 0x1E, 0x42,
+    0xFE, 0x1B, 0xA4, 0x42, 0xC0, 0x67, 0x4D, 0xBB, 0xFC, 0x08, 0x20, 0x03, 0x6D, 0x62, 0x2F, 0xF2,
+    0x0C, 0x57, 0x77, 0x6A, 0xC1, 0x51, 0x66, 0x74, 0x8D, 0x94, 0xE1, 0xF9, 0xF6, 0xC5, 0x78, 0xCD,
+    0xCC, 0x68, 0xC6, 0x59, 0x2E, 0x3C, 0x94, 0x49, 0x76, 0x74, 0xD8, 0x67, 0x41, 0xF6, 0x30, 0xF2,
+    0x83, 0xF1, 0xA8, 0x31, 0x7B, 0x86, 0x65, 0xED, 0x5F, 0xD3, 0xF3, 0x9A, 0xF3, 0x7C, 0x57, 0x13,
+    0x57, 0x2C, 0x00, 0x49, 0xB6, 0x96, 0xB5, 0x0B, 0x13, 0xE6, 0x2B, 0x17, 0xFA, 0x66, 0xFF, 0x40,
+    0xF9, 0x55, 0xF3, 0x61, 0xB2, 0x85, 0xA6, 0xA7, 0xC3, 0x95, 0xFC, 0x69, 0x48, 0x16, 0x8E, 0x61,
+    0x84, 0x61, 0xCB, 0xF5, 0x5C, 0x51, 0x8E, 0x22, 0xC1, 0x26, 0x3F, 0x65, 0x59, 0xD2, 0x05, 0x23,
+    0xAB, 0xFB, 0x18, 0x09, 0xFF, 0x91, 0x15, 0x21, 0x3E, 0xFD, 0xA3, 0x74, 0x33, 0xB4, 0x32, 0x49,
+    0xA9, 0x3D, 0x73, 0x46, 0xA6, 0xF2, 0x20, 0x4F, 0x93, 0xD8, 0x83, 0xC0, 0xA1, 0x90, 0x28, 0xBD,
+    0x58, 0x94, 0x53, 0x5A, 0xF1, 0x1F, 0xC7, 0x74, 0x9E, 0x6A, 0x6A, 0xD3, 0x11, 0x7A, 0x02, 0x06,
+    0x1F, 0x9C, 0x84, 0x43, 0xAE, 0xE0, 0x92, 0x36, 0xD1, 0x93, 0x81, 0x26, 0xDC, 0x31, 0x6C, 0x0A,
+    0xD7, 0x5B, 0x39, 0xF2, 0x8B, 0xD3, 0xAF, 0xD9, 0x9D, 0xB2, 0xBB, 0x2B, 0xFC, 0x0D, 0x0B, 0x7A,
+    0x71, 0xEA, 0x5E, 0xC9, 0xC5, 0x78, 0xDF, 0xB4, 0x66, 0xAA, 0xB8, 0x49, 0x3E, 0x3C, 0x9D, 0x69,
+    0xA1, 0xC2, 0xED, 0x24, 0xCE, 0xCB, 0x1D, 0x66, 0x05, 0x6B, 0xAF, 0x38, 0x0E, 0xE2, 0x52, 0x26,
+    0x36, 0x9A, 0x78, 0xCC, 0xB1, 0xF5, 0x67, 0xC9, 0xA0, 0x4C, 0x47, 0x82, 0xC0, 0x94, 0xD5, 0x57,
+    0x63, 0xD5, 0xA6, 0x7E, 0x7A, 0x68, 0xCA, 0x62, 0xA1, 0x5D, 0xD5, 0x21, 0x7D, 0x84, 0x1E, 0xA1,
+    0xB5, 0x3A, 0xE3, 0xD4, 0x06, 0x9B, 0xEC, 0xED, 0x19, 0xE3, 0xD3, 0xCA, 0x90, 0x8C, 0xB7, 0x6E,
+    0xDC, 0x1B, 0x58, 0xED, 0x3B, 0x1B, 0x55, 0xE9, 0xAA, 0xED, 0xB9, 0x36, 0x74, 0x46, 0x24, 0xA8,
+    0x30, 0x32, 0xE9, 0x1C, 0x56, 0xFE, 0x80, 0xF6, 0x62, 0x44, 0x99, 0x22, 0x8C, 0xEB, 0x33, 0x8D,
+    0x6F, 0xB2, 0xF9, 0xAA, 0x4D, 0x85, 0x64, 0x9F, 0xCE, 0x9A, 0x02, 0x98, 0x30, 0x94, 0x5F, 0x95,
+    0xD4, 0xD9, 0xDE, 0xC1, 0x3B, 0xC2, 0x74, 0x84, 0xE4, 0x0C, 0x3F, 0xB6, 0xFC, 0x5E, 0xCA, 0x22,
+    0xFE, 0xED, 0xAC, 0x59, 0x08, 0xCD, 0x90, 0x5A, 0xCB, 0x12, 0x8E, 0xE4, 0xD6, 0x87, 0x3B, 0x75,
+    0xB8, 0xB8, 0x8F, 0xFC, 0x20, 0x5F, 0x1B, 0x90, 0xCF, 0x60, 0xF3, 0xF2, 0xBE, 0x86, 0xF4, 0x47,
+    0x50, 0x13, 0xCE, 0xF7, 0xBD, 0x1B, 0x51, 0xE5, 0x75, 0x2A, 0xDB, 0x27, 0xA4, 0x30, 0xF4, 0xE5,
+    0x75, 0xC2, 0x2F, 0x65, 0xC8, 0xAF, 0x65, 0xFE, 0x83, 0x82, 0x1D, 0x3B, 0xA6, 0xA3, 0x62, 0xE7,
+    0x76, 0xD1, 0x03, 0x82, 0x60, 0xB6, 0x50, 0xE5, 0xE0, 0xF1, 0xB6, 0x1F, 0x1C, 0xFE, 0x03, 0x5F,
+    0x33, 0x13, 0xFA, 0x01, 0xF4, 0x56, 0x45, 0xB1, 0xD9, 0x58, 0x8D, 0xC4, 0xE4, 0xAE, 0x68, 0xD1,
+    0x5D, 0xA0, 0x47, 0x4B, 0x3B, 0xCF, 0x60, 0x94, 0xBE, 0x8B, 0xFC, 0xC8, 0x8E, 0x2A, 0x1C, 0xDF,
+    0x09, 0x10, 0x26, 0x92, 0x30, 0x9D, 0x15, 0x67, 0x35, 0xD1, 0xD9, 0xAD, 0x09, 0x50, 0x02, 0xA9,
+    0xC7, 0xD5, 0xCA, 0x8E, 0x88, 0xD7, 0x17, 0x50, 0x0B, 0x76, 0xA4, 0x21, 0xCD, 0xE2, 0x6C, 0xBA,
+    0x36, 0x39, 0x6D, 0xB4, 0xD0, 0xFA, 0x8A, 0x67, 0x68, 0x3D, 0xF1, 0x8D, 0x3A, 0xB7, 0x61, 0x06,
+    0x2A, 0x9D, 0x3B, 0xB0, 0x9B, 0xD1, 0xA1, 0x0A, 0x5A, 0xBD, 0x45, 0xD9, 0x06, 0x17, 0xFD, 0x24,
+    0x63, 0x7E, 0x21, 0x76, 0x85, 0x9B, 0x56, 0x4E, 0x5A, 0xDA, 0x98, 0x2C, 0x63, 0x4C, 0x01, 0xC3,
+    0x1E, 0xE9, 0xA7, 0xEB, 0xB8, 0x8E, 0xE2, 0x2B, 0xB4, 0xFF, 0x6B, 0x09, 0x61, 0xFB, 0xE9, 0xCC,
+    0xDA, 0xE9, 0xEC, 0xA5, 0xFF, 0x43, 0x68, 0x7E, 0xFE, 0x4D, 0x69, 0x49, 0xF7, 0xF2, 0x99, 0xBD,
+    0x56, 0x18, 0xB6, 0x79, 0x98, 0x40, 0x6D, 0xC1, 0x60, 0xF8, 0x09, 0x14, 0x4C, 0xBD, 0xD3, 0xB8,
+    0xF3, 0x0A, 0x7C, 0xF2, 0x98, 0x58, 0x61, 0xA6, 0x30, 0x95, 0xEA, 0xB8, 0x91, 0xF2, 0xD0, 0x30,
+    0x68, 0x62, 0x25, 0xEF, 0xFC, 0x4F, 0xC3, 0x5A, 0x40, 0x3C, 0xC9, 0xCE, 0xD9, 0x31, 0xA4, 0xBB,
+    0x27, 0x59, 0xAA, 0x30, 0xD8, 0x71, 0xD2, 0x95, 0xDC, 0x76, 0x57, 0xCE, 0x35, 0x1B, 0x51, 0x04,
+    0x7F, 0x42, 0x3C, 0xF5, 0x3A, 0xC8, 0xE7, 0x15, 0x36, 0x8E, 0x69, 0x1F, 0x5E, 0x08, 0x40, 0x0E,
+    0x63, 0x12, 0x92, 0x1E, 0x78, 0xF4, 0x49, 0xD0, 0x0A, 0x90, 0xBE, 0x41, 0x3B, 0xBC, 0x8B, 0x50,
+    0x89, 0xFC, 0x88, 0x6C, 0x3C, 0x00, 0xFC, 0xC0, 0x3A, 0x52, 0x59, 0x42, 0xA9, 0xC4, 0x35, 0x71,
+    0x7E, 0x5D, 0x73, 0x53, 0x28, 0xD7, 0xA4, 0x58, 0x09, 0x52, 0x0F, 0xF1, 0xD5, 0xCB, 0xD6, 0x3C,
+    0x6C, 0x5E, 0xF6, 0xF3, 0x0F, 0xE6, 0x07, 0xF0, 0x25, 0xB0, 0x76, 0x5A, 0xF0, 0x53, 0x70, 0xFB,
+    0xF3, 0x3A, 0xDE, 0x52, 0x97, 0x4C, 0x1F, 0x34, 0x7B, 0xEE, 0xD9, 0x4C, 0xFF, 0xAD, 0x53, 0xC6,
+    0xBA, 0x74, 0x82, 0x21, 0x81, 0x2E, 0x00, 0x19, 0x32, 0xAA, 0x3E, 0x52, 0x0E, 0x53, 0x40, 0x1A,
+    0x63, 0xC4, 0x74, 0xF5, 0xA2, 0x33, 0x2D, 0xAB, 0x3F, 0xE4, 0x56, 0xFE, 0x1D, 0x91, 0xF3, 0x8F,
+    0x46, 0x21, 0x10, 0x1D, 0x38, 0x3D, 0x71, 0x85, 0x6C, 0xD3, 0x44, 0xDA, 0x3D, 0x7C, 0x69, 0xEB,
+    0x92, 0xDF, 0xE1, 0x6C, 0x82, 0x88, 0xF5, 0x15, 0x2D, 0xB2, 0x0F, 0x2D, 0xBF, 0x56, 0x6E, 0x8A,
+    0xC8, 0x87, 0x20, 0xA2, 0xA7, 0xBC, 0xFF, 0x2A, 0x4A, 0x1F, 0x2C, 0x5B, 0x0A, 0x84, 0x41, 0x82,
+    0xDE, 0xE2, 0x64, 0x0B, 0x42, 0xA6, 0x76, 0x44, 0x93, 0xDC, 0xD6, 0xDF, 0x26, 0x95, 0x89, 0xEF,
+    0x76, 0x74, 0x34, 0x93, 0x45, 0x49, 0xB1, 0xB4, 0x0B, 0x2F, 0xF6, 0x6F, 0xE0, 0xC9, 0x99, 0x47,
+    0xB1, 0x76, 0x1A, 0xBD, 0x7E, 0xCD, 0x04, 0x7E, 0xBA, 0x50, 0xA6, 0xB7, 0xC8, 0x31, 0x2C, 0x16,
+    0x0E, 0xB9, 0x8A, 0x96, 0xC4, 0x45, 0xB4, 0x06, 0xCE, 0xFF, 0x73, 0x80, 0xED, 0x24, 0xD0, 0x9E,
+    0xA9, 0x24, 0x1B, 0x79, 0x25, 0xA9, 0x3D, 0x86, 0x19, 0x68, 0xBF, 0x31, 0x83, 0x3C, 0x12, 0xB0,
+    0x5B, 0x23, 0x3B, 0x07, 0x23, 0x81, 0xAF, 0xDD, 0x62, 0xE8, 0x55, 0x2D, 0x36, 0xA5, 0x16, 0xB1,
+    0xA4, 0xFB, 0x20, 0x1A, 0x10, 0x3A, 0x0E, 0x7E, 0x97, 0xFC, 0x29, 0x06, 0x78, 0xC1, 0x63, 0xB3,
+    0x6F, 0x64, 0xBE, 0x70, 0x8B, 0x43, 0x70, 0xEB, 0xEB, 0xE9, 0xEF, 0x7C, 0xC3, 0x59, 0x1B, 0xCC,
+    0xAB, 0x5B, 0xE0, 0xBF, 0xF4, 0xC6, 0xD4, 0xE5, 0x07, 0xCF, 0xAB, 0x5E, 0xE8, 0x2F, 0x68, 0xD9,
+    0xF6, 0x3A, 0x36, 0x08, 0xE3, 0xF6, 0xAE, 0x7B, 0xC5, 0x7A, 0xF1, 0x16, 0xC8, 0x46, 0x59, 0xEA,
+    0xD9, 0xAD, 0x65, 0x74, 0xE7, 0x63, 0xA8, 0xF4, 0x5E, 0x01, 0x91, 0xE7, 0xEB, 0xA2, 0x0B, 0x92,
+    0x3C, 0x28, 0x50, 0x9A, 0x54, 0x76, 0x4A, 0xEC, 0x38, 0x0E, 0x52, 0x02, 0xF4, 0xC8, 0x82, 0xC5,
+    0x7D, 0x2D, 0x39, 0x6B, 0x30, 0xB3, 0x68, 0x87, 0x7B, 0x0A, 0x5C, 0x14, 0xDF, 0x5D, 0xF9, 0xF8,
+    0x7E, 0x81, 0x6D, 0x76, 0x27, 0x78, 0x33, 0xBC, 0x9B, 0x9E, 0xEE, 0xDD, 0xFB, 0x24, 0x1B, 0xBD,
+    0x49, 0x4B, 0x5E, 0xEA, 0xC9, 0xDD, 0x2A, 0x04, 0x2D, 0xEB, 0xB3, 0xBD, 0x22, 0xDC, 0x61, 0xC3,
+    0x95, 0xB7, 0x95, 0x92, 0xDC, 0x32, 0x39, 0xC0, 0x18, 0xC1, 0x43, 0x3B, 0x20, 0x20, 0x32, 0x0A,
+    0xB0, 0x51, 0x70, 0x21, 0x59, 0x64, 0x8E, 0x35, 0xFA, 0xD6, 0xF8, 0x75, 0x56, 0x59, 0x96, 0xA8,
+    0xEE, 0x3F, 0xF1, 0x49, 0x64, 0xF1, 0x8F, 0x7C, 0x2B, 0xB9, 0x74, 0xC0, 0x03, 0x55, 0xBF, 0x95,
+    0x9C, 0x31, 0x80, 0xDA, 0x37, 0x61, 0x99, 0x28, 0x8A, 0x45, 0x38, 0xF4, 0x23, 0xC7, 0x55, 0x13,
+    0x79, 0x01, 0xE2, 0x1D, 0xFC, 0x76, 0x64, 0x20, 0x4B, 0x63, 0x74, 0x0B, 0x40, 0x8C, 0x11, 0x52,
+    0xBF, 0xD1, 0x1C, 0xAF, 0x32, 0xAD, 0x92, 0x11, 0x50, 0x61, 0x57, 0x1A, 0xDD, 0x7A, 0x4B, 0x54,
+    0xC3, 0x57, 0x2A, 0xC3, 0xF6, 0x4C, 0xDF, 0x82, 0x6B, 0x5E, 0xD9, 0x7F, 0x06, 0x52, 0x1D, 0xE3,
+    0x78, 0x4E, 0x6C, 0xC3, 0x14, 0x73, 0xF1, 0x10, 0x7D, 0xDC, 0xBE, 0xE0, 0x30, 0x75, 0xCF, 0x24,
+    0x18, 0x44, 0xA2, 0x61, 0xC5, 0x36, 0xD8, 0x44, 0x5E, 0x57, 0x3A, 0x2C, 0xFA, 0xDF, 0x6F, 0x0B,
+    0x75, 0x69, 0xB7, 0x82, 0x53, 0x78, 0x23, 0x8A, 0x46, 0x65, 0xFF, 0x04, 0xC8, 0xBF, 0x7D, 0xF0,
+    0x79, 0xDE, 0x36, 0x78, 0x2B, 0xDF, 0x30, 0x16, 0x25, 0x71, 0xDC, 0xE3, 0x02, 0xD7, 0x49, 0xF7,
+    0x08, 0xB4, 0x9B, 0xC1, 0xEE, 0x73, 0xA5, 0x35, 0x43, 0x9E, 0xB0, 0xEA, 0x11, 0x82, 0xC4, 0xC0,
+    0x14, 0x1D, 0x00, 0xDC, 0xB4, 0x43, 0x41, 0xC2, 0x22, 0xA3, 0xBD, 0x1B, 0x41, 0xEF, 0x9E, 0x3F,
+    0x3A, 0x50, 0x8E, 0x0E, 0xEB, 0x08, 0x5C, 0xAC, 0x66, 0x05, 0x19, 0xF0, 0xCD, 0x3D, 0x84, 0xB8,
+    0x04, 0x0A, 0x22, 0x69, 0xD2, 0xE1, 0x41, 0x9A, 0x9B, 0xFA, 0xAD, 0xB9, 0x84, 0x08, 0xFF, 0xEC,
+    0x50, 0x9B, 0xD2, 0x55, 0xF6, 0x21, 0xA8, 0x4A, 0xF7, 0x19, 0xC4, 0xE9, 0x1B, 0xE7, 0xD6, 0x97,
+    0x0F, 0xCB, 0xA3, 0xE1, 0xF5, 0xEB, 0x48, 0x38, 0x8D, 0xCD, 0x6C, 0x14, 0xC8, 0x30, 0xDD, 0xC6,
+    0x3D, 0xA0, 0xDB, 0x46, 0xB1, 0x07, 0x89, 0x38, 0xF7, 0x2E, 0x30, 0x7F, 0xD8, 0x93, 0x92, 0x32,
+    0x0B, 0xD8, 0x8B, 0xC8, 0x5A, 0x1A, 0x60, 0xAC, 0xD1, 0x41, 0xEC, 0xB5, 0xB5, 0xE3, 0x7B, 0xDE,
+    0x3A, 0x33, 0x24, 0x5E, 0x06, 0x85, 0x2B, 0x65, 0x74, 0xBA, 0x40, 0x7D, 0x60, 0x87, 0xD3, 0xBE,
+    0xD9, 0x88, 0xF8, 0x36, 0xA5, 0x83, 0xB8, 0x83, 0x62, 0x44, 0x20, 0x2F, 0xCB, 0xC7, 0xA1, 0x57,
+    0xA8, 0x32, 0x60, 0xAB, 0x97, 0x6F, 0x70, 0x07, 0x2B, 0x41, 0x71, 0xF8, 0xCE, 0xCD, 0x73, 0x4C,
+    0xB9, 0x04, 0x14, 0x9E, 0xC2, 0x5A, 0x6F, 0x14, 0xD0, 0x83, 0x10, 0xAE, 0x2F, 0x67, 0x10, 0x46,
+    0x5F, 0x6D, 0x40, 0xF5, 0x2F, 0x77, 0x50, 0x82, 0x65, 0x16, 0xAB, 0x82, 0x3F, 0xBA, 0xF1, 0xBC,
+    0x53, 0x2D, 0x86, 0xAA, 0x96, 0x40, 0x14, 0x6D, 0x38, 0x4D, 0x37, 0xD0, 0x0E, 0xFF, 0x2D, 0xBE,
+    0x31, 0x04, 0xC3, 0x78, 0x56, 0x28, 0x7A, 0x92, 0xB6, 0xFD, 0x9D, 0x2D, 0x65, 0x1E, 0x90, 0xFE,
+    0x30, 0x0E, 0xC6, 0x7B, 0x08, 0x27, 0x2E, 0xDC, 0x3A, 0xED, 0x07, 0x74, 0xF0, 0xF2, 0x09, 0xE9,
+    0x1D, 0x96, 0x5B, 0xB2, 0x4D, 0x37, 0x41, 0xA9, 0xB4, 0xA3, 0x71, 0x2A, 0xAB, 0x15, 0x4F, 0x31,
+    0x85, 0xC2, 0xD9, 0x10, 0x22, 0x10, 0xFF, 0xAF, 0xD1, 0x08, 0x36, 0x0F, 0x05, 0x2A, 0xA9, 0xE2,
+    0xBA, 0x0E, 0x07, 0xAB, 0xAC, 0x01, 0xCF, 0xC6, 0xB8, 0xE9, 0x61, 0x45, 0xFB, 0x3F, 0x94, 0x5A,
+    0x0C, 0x6D, 0x7B, 0x0E, 0x57, 0x5D, 0x9D, 0xEB, 0x96, 0x0C, 0x1D, 0xC1, 0x13, 0x24, 0x49, 0xB8,
+    0xA7, 0xE9, 0x5C, 0x9E, 0xED, 0xAD, 0xF3, 0x56, 0xED, 0x91, 0xA0, 0xA1, 0x72, 0x51, 0xDE, 0xCD,
+    0xCC, 0x05, 0x89, 0xD4, 0x01, 0xA4, 0x80, 0x0D, 0x4E, 0x5A, 0xA9, 0x5F, 0xEA, 0x71, 0x27, 0x84,
+    0xE6, 0x70, 0x1D, 0xA2, 0xC9, 0x4C, 0x4C, 0x08, 0xAB, 0xD1, 0x73, 0x9B, 0x5D, 0xE0, 0xB7, 0x5D,
+    0xDE, 0x1F, 0x49, 0x75, 0xD1, 0x92, 0x5B, 0x52, 0x58, 0x3A, 0xCE, 0xA0, 0x25, 0x1F, 0xA7, 0xB1,
+    0xF7, 0xDD, 0x68, 0xD5, 0xA7, 0xB6, 0xAA, 0xEC, 0x57, 0x93, 0x61, 0xF5, 0x67, 0x9E, 0x5B, 0x9C,
+    0xB8, 0xE0, 0x0A, 0xC5, 0x34, 0x35, 0x25, 0xDC, 0x4B, 0xC5, 0xCF, 0x20, 0x47, 0x84, 0x53, 0xDD,
+    0x0B, 0x83, 0x70, 0xD6, 0xF7, 0x2C, 0xF3, 0x55, 0x3A, 0x52, 0xBC, 0x48, 0x0F, 0xCA, 0xFD, 0x4F,
+    0x91, 0x79, 0x57, 0xDD, 0x46, 0xB5, 0xF2, 0xA8, 0x16, 0xC0, 0x06, 0x9B, 0xAF, 0x02, 0x12, 0x15,
+    0xB6, 0xB0, 0x48, 0x1E, 0x95, 0xA4, 0x36, 0xBB, 0xD6, 0xF8, 0xBA, 0x1D, 0x70, 0x50, 0x23, 0xA8,
+    0xF6, 0xBB, 0x61, 0x46, 0x91, 0x24, 0x16, 0x4E, 0x02, 0xD8, 0x73, 0x01, 0x78, 0xDD, 0x42, 0x7A,
+    0xA6, 0x4F, 0xFE, 0x94, 0xF6, 0xEA, 0x1E, 0x62, 0xB0, 0xAC, 0xE4, 0x94, 0x09, 0x0D, 0x43, 0xF4,
+    0xA0, 0xA8, 0x7A, 0xAA, 0x1C, 0x28, 0x49, 0xD7, 0xCC, 0x8B, 0x55, 0xF3, 0xD3, 0x99, 0x9B, 0xEC,
+    0x41, 0x6B, 0x86, 0x85, 0x65, 0x1B, 0xC2, 0x2E, 0xD2, 0xF6, 0x46, 0x9F, 0x46, 0xFF, 0x9A, 0x5F,
+    0xAF, 0x6F, 0x22, 0x29, 0x59, 0x40, 0xE4, 0x2D, 0xBE, 0x4A, 0x8E, 0xF0, 0x2B, 0x48, 0x5F, 0xC1,
+    0x76, 0xA5, 0x2F, 0xEE, 0x03, 0xEB, 0xCF, 0xA7, 0x2E, 0xB0, 0x27, 0xD7, 0x49, 0xB1, 0xB4, 0x01,
+    0x46, 0x00, 0x72, 0xCC, 0x98, 0xD7, 0xA3, 0xBC, 0x4E, 0xF1, 0x32, 0x3D, 0xF1, 0x29, 0x98, 0xA4,
+    0x39, 0xD0, 0xD9, 0xD9, 0x2A, 0x99, 0x14, 0x69, 0xE1, 0x99, 0x70, 0xC8, 0xEE, 0x5D, 0xC9, 0xC3,
+    0x92, 0xF3, 0xB6, 0xE7, 0xA7, 0x14, 0xC3, 0xC4, 0xBB, 0x05, 0x44, 0xDD, 0xDC, 0x77, 0xDB, 0x00,
+    0x73, 0xC9, 0x0B, 0x17, 0x38, 0xAF, 0xCB, 0x7E, 0x5F, 0x4D, 0x3F, 0x79, 0x16, 0x10, 0x75, 0x79,
+    0x69, 0x16, 0xAC, 0x7E, 0xAA, 0x73, 0xC7, 0x71, 0xF6, 0x01, 0x45, 0xC2, 0xA9, 0xB8, 0xC2, 0x77,
+    0x88, 0x45, 0x3A, 0xCC, 0x9E, 0x02, 0xF5, 0xCC, 0x58, 0x4B, 0x98, 0x9B, 0xA4, 0x7F, 0x9F, 0xB2,
+    0xE9, 0x8F, 0x0F, 0x21, 0xA2, 0xA3, 0x30, 0x24, 0x96, 0x8E, 0x45, 0xCA, 0x7E, 0x88, 0x92, 0x8A,
+    0x81, 0xC5, 0xB5, 0x84, 0x99, 0x98, 0x2D, 0x97, 0xAF, 0x75, 0x7D, 0x0E, 0xCB, 0x28, 0x96, 0xD5,
+    0x4D, 0xFE, 0xDD, 0x30, 0xE1, 0xC3, 0x19, 0x3D, 0x04, 0x5A, 0xEA, 0x09, 0x82, 0x66, 0x51, 0xE2,
+    0xE9, 0x03, 0xA3, 0xC2, 0xF7, 0x72, 0x7F, 0xE0, 0x13, 0xF6, 0x29, 0x15, 0xE9, 0x51, 0xF3, 0x12,
+    0xE1, 0xB1, 0xC8, 0xC9, 0x4F, 0xE0, 0x44, 0xA7, 0xE8, 0x80, 0x42, 0x82, 0x98, 0x1D, 0xA9, 0x0F,
+    0x17, 0x29, 0xEF, 0xD6, 0xAB, 0x6D, 0x5F, 0x9D, 0xD3, 0x63, 0x61, 0xF3, 0x63, 0x02, 0xC0, 0xF5,
+    0xB5, 0x75, 0x52, 0x9F, 0x0B, 0xED, 0x8E, 0x37, 0x1C, 0xC4, 0x33, 0x02, 0xD8, 0xF5, 0xE4, 0x57,
+    0x0F, 0xD4, 0x7F, 0x07, 0xFB, 0x7B, 0x98, 0x92, 0x71, 0x17, 0x45, 0xB0, 0x03, 0xD3, 0x62, 0xFF,
+    0x65, 0xDC, 0x5B, 0xA4, 0xA1, 0x8A, 0x3F, 0xF8, 0x0F, 0x34, 0xF8, 0xDF, 0x59, 0x60, 0xE4, 0xC1,
+    0x16, 0xC7, 0xAE, 0x46, 0x88, 0x33, 0x9E, 0xE0, 0xD0, 0xB6, 0x21, 0xB6, 0x4B, 0x77, 0xB0, 0x12,
+    0x3A, 0x15, 0x15, 0x21, 0x5E, 0xC7, 0xC5, 0xE3, 0x90, 0x4E, 0x79, 0x96, 0x1C, 0xCA, 0xEA, 0xC3,
+    0x2D, 0x0B, 0x8C, 0xCE, 0x3E, 0x54, 0x7A, 0x44, 0xBA, 0xE4, 0xCC, 0x23, 0x14, 0xEA, 0x73, 0x96,
+    0x88, 0x54, 0x99, 0xD8, 0x7B, 0x10, 0xB8, 0xB9, 0xD2, 0xA4, 0x57, 0x63, 0x35, 0xDB, 0x8A, 0xFB,
+    0xBE, 0x57, 0xA3, 0x9B, 0x0B, 0x39, 0x35, 0x08, 0x03, 0x9A, 0x22, 0x55, 0x04, 0xE2, 0x14, 0xBF,
+    0xA1, 0xCA, 0x15, 0xAC, 0xA6, 0x6E, 0xF7, 0xEC, 0x7B, 0xE4, 0xE7, 0x9C, 0x22, 0x4C, 0x25, 0x77,
+    0x77, 0x23, 0xEF, 0xF8, 0xB3, 0x52, 0x88, 0xB2, 0x85, 0x65, 0xFC, 0xAE, 0xCA, 0xAB, 0x44, 0x77,
+    0x5B, 0x09, 0xC0, 0xC3, 0xB1, 0x46, 0xAF, 0xEB, 0xEF, 0x50, 0xC4, 0x47, 0x0E, 0xAC, 0xEF, 0x22,
+    0xAF, 0x24, 0x53, 0x51, 0x52, 0xB9, 0x55, 0xD7, 0xA8, 0x1A, 0x1A, 0xC5, 0xDC, 0x64, 0xD4, 0x0C,
+    0x15, 0x37, 0x23, 0xC5, 0xD9, 0x2C, 0x02, 0xC5, 0x53, 0x9D, 0xB4, 0x0C, 0x27, 0xB8, 0x00, 0xA3,
+    0x2E, 0x38, 0xAD, 0xE8, 0xD0, 0x52, 0xB0, 0x37, 0x9A, 0xC8, 0x81, 0x33, 0x87, 0x37, 0x0C, 0xB8,
+    0x17, 0x45, 0x8A, 0xAC, 0xB1, 0xEF, 0xA4, 0xA1, 0x10, 0x4E, 0x88, 0x13, 0x10, 0x28, 0xF0, 0x22,
+    0x55, 0x18, 0x96, 0xB1, 0xDC, 0x54, 0x7B, 0xC3, 0x7A, 0xA1, 0x8C, 0x58, 0x14, 0x9D, 0xB4, 0xC5,
+    0x98, 0xA9, 0xBF, 0xB6, 0x27, 0x4F, 0x7A, 0x1C, 0xF4, 0x03, 0x6B, 0x60, 0x91, 0xB0, 0x1E, 0x9A,
+    0x3B, 0x2B, 0x40, 0x30, 0x22, 0x3F, 0x61, 0x16, 0x8E, 0x4D, 0xC0, 0x8F, 0xED, 0xA5, 0x4F, 0x73,
+    0x10, 0x4A, 0xD2, 0x73, 0xC5, 0xF8, 0x95, 0x25, 0xB0, 0xBC, 0x01, 0x14, 0x37, 0x0D, 0x74, 0x45,
+    0xAA, 0xD6, 0x21, 0x4B, 0x7D, 0x55, 0x93, 0x16, 0x02, 0xBB, 0xBD, 0x77, 0x4F, 0xEE, 0xEA, 0x29,
+    0x3C, 0xDF, 0x45, 0x9A, 0x9B, 0x73, 0xBC, 0x01, 0xF7, 0x18, 0x53, 0x1A, 0x73, 0x2B, 0x3F, 0x78,
+    0x69, 0xB8, 0x45, 0x16, 0x9F, 0x76, 0x09, 0x91, 0x04, 0x21, 0x6B, 0x82, 0xCF, 0xFB, 0x0C, 0xF2,
+    0x15, 0x6A, 0xDD, 0x67, 0x2C, 0x21, 0x39, 0x06, 0x13, 0x6C, 0xD7, 0x58, 0x54, 0xBA, 0xAC, 0x8D,
+    0x1A, 0x13, 0x8F, 0x4F, 0xC3, 0xE8, 0x0A, 0xCC, 0xA0, 0x25, 0xC5, 0xBD, 0x49, 0x95, 0x6D, 0x95,
+    0xA8, 0x6F, 0xCA, 0x85, 0x4F, 0xA1, 0x94, 0x45, 0x86, 0xE2, 0xBA, 0xD6, 0xE3, 0xFA, 0x91, 0xF5,
+    0x03, 0xA2, 0x2C, 0xCD, 0x54, 0x37, 0x61, 0xA6, 0x34, 0xE0, 0x8D, 0x1C, 0xD4, 0xC9, 0x31, 0x4B,
+    0x13, 0x04, 0xA6, 0x52, 0xFC, 0x8F, 0x4F, 0x81, 0x0A, 0x15, 0xB0, 0xB0, 0x33, 0x2F, 0x2A, 0xFC,
+    0xFF, 0x95, 0x87, 0x66, 0xFD, 0x19, 0xDE, 0x77, 0x4C, 0xF9, 0x3A, 0x5D, 0x34, 0x5D, 0x47, 0x0B,
+    0x33, 0x55, 0x9B, 0x90, 0x13, 0x2C, 0xE3, 0xD8, 0xA9, 0xDB, 0xAA, 0xA0, 0x4F, 0x7F, 0x20, 0xF6,
+    0x8C, 0x5A, 0x48, 0x8F, 0x88, 0x95, 0x51, 0x11, 0x95, 0x88, 0x13, 0x31, 0x4D, 0x6F, 0xA2, 0x5A,
+    0x1B, 0xE5, 0x16, 0x6E, 0x9C, 0x24, 0xA2, 0x82, 0x69, 0xAC, 0x0A, 0x54, 0x8B, 0x12, 0x64, 0x4D,
+    0xC4, 0x51, 0x7F, 0xEA, 0x4C, 0x44, 0x58, 0xF2, 0xA1, 0x1E, 0xBF, 0x02, 0x15, 0x75, 0x4C, 0x4A,
+    0xEB, 0x4F, 0x77, 0xE5, 0xB1, 0x3C, 0x26, 0x4F, 0x21, 0xB9, 0xAD, 0x70, 0x36, 0x4C, 0x02, 0x10,
+    0x55, 0x29, 0x7C, 0xA1, 0x01, 0x9F, 0xD9, 0x67, 0xAB, 0xEE, 0x93, 0xD5, 0x91, 0xDF, 0xC5, 0x18,
+    0x48, 0x9B, 0x9D, 0x3C, 0xCB, 0xCF, 0x06, 0x21, 0xA7, 0x5B, 0xE5, 0x83, 0x3B, 0x54, 0xCC, 0x04,
+    0x43, 0x63, 0x60, 0x66, 0x60, 0x0F, 0xA2, 0x23, 0xAE, 0xE1, 0x55, 0x78, 0x09, 0x62, 0x51, 0x0F,
+    0xAE, 0xF1, 0xE5, 0xBE, 0xCB, 0x4E, 0x83, 0xB1, 0xB8, 0x45, 0x0E, 0x85, 0x54, 0x69, 0xCC, 0xFD,
+    0x7C, 0x5C, 0x95, 0xBB, 0x46, 0xF5, 0x21, 0xB9, 0x86, 0x8C, 0x71, 0x10, 0xF3, 0x6C, 0x1E, 0xE5,
+    0xBB, 0x5B, 0xCA, 0x38, 0xAE, 0xF1, 0xB8, 0x73, 0xDB, 0x16, 0x30, 0x28, 0xB6, 0x18, 0xB4, 0xF4,
+    0x01, 0x0A, 0x99, 0xCC, 0x01, 0x14, 0x80, 0xC1, 0xC1, 0xED, 0xC4, 0xE3, 0xE6, 0x92, 0x61, 0x7E,
+    0x18, 0x44, 0xB2, 0x41, 0xE6, 0x41, 0xC5, 0xFB, 0x07, 0x75, 0xD3, 0xFB, 0xA7, 0xA9, 0xE7, 0x3B,
+    0xAA, 0xFE, 0xB8, 0x16, 0x34, 0x9B, 0xA9, 0xEB, 0x75, 0xBA, 0xE6, 0x19, 0x21, 0x4B, 0x3E, 0xF9,
+    0xFF, 0xC7, 0x03, 0x22, 0x42, 0xC4, 0x03, 0x38, 0x83, 0xA9, 0xB0, 0xCE, 0xB7, 0x32, 0x8E, 0x99,
+    0x18, 0x8A, 0x3E, 0xC9, 0x38, 0x23, 0x7E, 0x21, 0x0A, 0xBD, 0x2A, 0x07, 0x3C, 0x05, 0xA6, 0x1E,
+    0x5A, 0x56, 0xD8, 0xC8, 0xE7, 0x5F, 0x5D, 0x6D, 0x4F, 0xA6, 0x6F, 0xB6, 0xE1, 0xEE, 0x65, 0x6A,
+    0x9F, 0xA1, 0xD8, 0x69, 0xC0, 0x9E, 0x6D, 0x4F, 0x64, 0x78, 0x34, 0x21, 0x56, 0x46, 0x98, 0xC4,
+    0x23, 0xE7, 0x4D, 0x25, 0x24, 0x50, 0x86, 0xFC, 0xED, 0xB9, 0x32, 0x1D, 0x81, 0x0E, 0xE1, 0xFD,
+    0x01, 0x67, 0x07, 0xD8, 0xF0, 0x15, 0xFC, 0x67, 0x62, 0x24, 0xD7, 0xB3, 0xAE, 0x48, 0x26, 0xE2,
+    0xBD, 0x98, 0x51, 0xE2, 0x28, 0xC7, 0x54, 0x30, 0xC0, 0x7C, 0xFF, 0xA7, 0x8A, 0x43, 0x19, 0xE0,
+    0xEF, 0x17, 0x1D, 0xF2, 0x15, 0xD5, 0x8E, 0x55, 0xAA, 0x8B, 0x98, 0x13, 0xF8, 0xAA, 0xCB, 0xB8,
+    0x44, 0x74, 0x8E, 0x54, 0x38, 0xA9, 0xB7, 0x2E, 0xCE, 0x69, 0xEE, 0x12, 0x13, 0xEB, 0xA4, 0x73,
+    0xE0, 0x22, 0x0D, 0x1D, 0x38, 0xA5, 0x51, 0x68, 0xFC, 0x8D, 0x1F, 0xF8, 0x97, 0xE9, 0xD9, 0xF6,
+    0xC4, 0x0E, 0x19, 0x8C, 0xB8, 0xB4, 0xE0, 0xB7, 0x9C, 0x88, 0x97, 0x45, 0xA5, 0x09, 0xEC, 0x28,
+    0x6C, 0x84, 0xE6, 0xA2, 0x79, 0xD2, 0x82, 0x08, 0x3E, 0xA4, 0xD5, 0x27, 0x6E, 0x2C, 0x00, 0x3B,
+    0x2C, 0x69, 0x5C, 0x9F, 0x23, 0x98, 0x14, 0x44, 0x73, 0x1C, 0x2B, 0x42, 0x69, 0xAE, 0x77, 0xF3,
+    0xA8, 0x8D, 0xC5, 0xA0, 0x75, 0xD6, 0xDF, 0xDA, 0xC1, 0x72, 0x77, 0x5F, 0x25, 0x7A, 0x76, 0x80,
+    0x8C, 0x78, 0x5D, 0xD4, 0x13, 0xA7, 0x4C, 0x72, 0xB8, 0x8C, 0x0F, 0xE1, 0x10, 0xE2, 0x00, 0xBA,
+    0xE9, 0x7A, 0x50, 0x81, 0xDB, 0x60, 0x98, 0x39, 0x90, 0x58, 0x5B, 0x8E, 0xA7, 0x96, 0x56, 0xB5,
+    0x0A, 0xC7, 0x72, 0x5A, 0x26, 0x53, 0x23, 0x99, 0x52, 0xCB, 0xD5, 0xFE, 0xC9, 0xF8, 0xE3, 0x78,
+    0x16, 0x80, 0xFE, 0xCC, 0x6A, 0x4F, 0x4B, 0x0C, 0xCA, 0x72, 0xCC, 0xF7, 0x23, 0xCA, 0x0E, 0x0E,
+    0x5C, 0xD7, 0xA2, 0xA5, 0xA9, 0x8D, 0xC1, 0xE9, 0x73, 0x7B, 0x84, 0xD6, 0x86, 0x49, 0x45, 0xD2,
+    0xD4, 0x05, 0xEB, 0xA8, 0xD2, 0x5A, 0x69, 0x0F, 0xCB, 0x99, 0x39, 0x26, 0xDD, 0x4F, 0xDC, 0x42,
+    0xFD, 0x8F, 0xC8, 0x0B, 0x29, 0xB8, 0x83, 0x3D, 0xB8, 0x96, 0x6C, 0x8A, 0x5E, 0xC5, 0x28, 0x60,
+    0xE3, 0xC8, 0x9F, 0xFA, 0x0C, 0xC7, 0xAB, 0x67, 0x8D, 0x23, 0x0F, 0x35, 0xAB, 0xCF, 0xBF, 0x7D,
+    0xC2, 0xF6, 0x33, 0xC8, 0xED, 0x53, 0x86, 0x77, 0x28, 0x0B, 0xD5, 0x47, 0x3E, 0x17, 0x54, 0x9F,
+    0x49, 0xD7, 0x29, 0x69, 0x57, 0xC0, 0x70, 0xC9, 0x0E, 0xC1, 0x3A, 0x77, 0x4A, 0x91, 0x2E, 0x23,
+    0xF1, 0x13, 0xD0, 0x61, 0x8F, 0xA3, 0x6A, 0xDE, 0x01, 0x6A, 0xC2, 0x4B, 0x8F, 0xCD, 0x5D, 0x98,
+    0x70, 0x6D, 0xAC, 0xE3, 0xFD, 0x17, 0x77, 0x37, 0x81, 0x4C, 0x31, 0xC0, 0x93, 0x74, 0x27, 0x79,
+    0xA3, 0x65, 0x7F, 0x35, 0x31, 0x9F, 0x4E, 0x21, 0x13, 0xCE, 0x7E, 0xAB, 0x01, 0x85, 0x1D, 0x66,
+    0x95, 0xF5, 0x0C, 0x19, 0x8B, 0x06, 0x3D, 0xB3, 0x14, 0xD9, 0x64, 0x2B, 0x46, 0xB5, 0x8A, 0x47,
+    0x0A, 0x98, 0x6D, 0x4E, 0x7C, 0xE6, 0x26, 0xC8, 0xFA, 0xAB, 0x90, 0xFB, 0x4F, 0x04, 0xCC, 0xB2,
+    0x0C, 0x9D, 0x62, 0x45, 0x55, 0x89, 0x4A, 0x55, 0x9B, 0x76, 0x71, 0x1D, 0x90, 0xE4, 0xCF, 0x46,
+    0xFC, 0x2F, 0x92, 0x88, 0x9B, 0xFA, 0xF0, 0xCE, 0xB1, 0x56, 0xB5, 0xD7, 0x65, 0xBF, 0x8A, 0x63,
+    0x5E, 0x0E, 0x05, 0xDA, 0xD9, 0xFF, 0x26, 0xFD, 0x2A, 0xA0, 0x98, 0x70, 0x32, 0xBC, 0xBC, 0x93,
+    0x22, 0x8C, 0x6E, 0xB1, 0x36, 0xE8, 0x9D, 0x7F, 0xBC, 0xDE, 0xDD, 0x0A, 0x3F, 0x6D, 0xEA, 0xA2,
+    0xDA, 0xAC, 0x7B, 0x77, 0x4E, 0x6D, 0x7A, 0x71, 0xEF, 0x49, 0x6E, 0x31, 0xD1, 0xD6, 0xC9, 0x15,
+    0xBA, 0x1E, 0x18, 0x98, 0x92, 0xF1, 0x21, 0x23, 0xC0, 0xB5, 0x9C, 0x37, 0x15, 0x97, 0xA6, 0x48,
+    0x09, 0x6D, 0x46, 0x6C, 0x45, 0x06, 0xC5, 0x27, 0x64, 0x54, 0x78, 0xF5, 0xFF, 0xD3, 0xD3, 0xAE,
+    0xC8, 0x6E, 0xFC, 0x59, 0xB1, 0xD9, 0x26, 0xE8, 0xEE, 0x3C, 0x1D, 0xC7, 0xCF, 0xC0, 0xE0, 0xAB,
+    0xDC, 0x10, 0x74, 0x48, 0xBA, 0xC2, 0xCA, 0xA1, 0x9C, 0xFB, 0x87, 0x99, 0x7A, 0x6B, 0x37, 0x5C,
+    0x6F, 0x9F, 0x97, 0xCB, 0x90, 0x4F, 0xBC, 0x26, 0x15, 0xAC, 0x0D, 0xC6, 0x72, 0xF6, 0x29, 0xF8,
+    0xDD, 0x57, 0x68, 0x46, 0x35, 0x60, 0xD8, 0x16, 0xE7, 0x3F, 0xC7, 0xEC, 0xDE, 0x6B, 0x8C, 0xF0,
+    0x3D, 0x4A, 0x17, 0x58, 0x55, 0xD5, 0xE8, 0xA8, 0x4A, 0x62, 0x48, 0x8B, 0x52, 0xBD, 0x13, 0x00,
+    0xF7, 0x44, 0xD1, 0x78, 0x3C, 0x1D, 0xAC, 0x34, 0xEE, 0xA5, 0x9B, 0xCC, 0x6D, 0xAD, 0x30, 0x31,
+    0xFC, 0x81, 0x91, 0x50, 0x26, 0x2A, 0x48, 0x30, 0x20, 0xB7, 0xAA, 0x87, 0x02, 0x99, 0xB2, 0xE4,
+    0xAC, 0x83, 0x71, 0x59, 0xDC, 0xD9, 0x5D, 0x6C, 0xB1, 0x03, 0x32, 0x97, 0x97, 0xEE, 0xFD, 0xCC,
+    0xC4, 0xF3, 0xDD, 0x94, 0xC6, 0x43, 0xB9, 0xB7, 0x1D, 0x2F, 0x9C, 0x9D, 0x7F, 0x91, 0x51, 0x1A,
+    0x35, 0xAF, 0xD8, 0x50, 0xFB, 0xBF, 0xD0, 0xA0, 0x28, 0x39, 0x6F, 0x47, 0x96, 0x57, 0x7D, 0x52,
+    0x5C, 0xCD, 0xC9, 0x7F, 0xBB, 0x2C, 0x15, 0xFE, 0x2A, 0x3A, 0xFD, 0x23, 0xB2, 0x91, 0x6F, 0xC7,
+    0x3C, 0xB2, 0x91, 0xB9, 0x59, 0xAA, 0x2E, 0x96, 0x45, 0xC5, 0x30, 0xAC, 0x03, 0x42, 0x78, 0xFD,
+    0x46, 0xD2, 0x2F, 0x7A, 0x46, 0x55, 0x26, 0x49, 0x38, 0x4C, 0xA1, 0xD2, 0x78, 0x17, 0xD6, 0x3D,
+    0x00, 0xCB, 0xF7, 0xB2, 0x68, 0x7D, 0x4A, 0xDA, 0x2E, 0x54, 0xF6, 0x6C, 0xCF, 0xDE, 0x8F, 0xF7,
+    0xFA, 0xF8, 0x87, 0x38, 0xCA, 0xEA, 0xD2, 0x1F, 0xED, 0x04, 0xD0, 0xE9, 0x12, 0xCF, 0x11, 0x18,
+    0xAF, 0xF3, 0x4E, 0x13, 0x3D, 0xBC, 0x30, 0xB4, 0x15, 0x71, 0x8B, 0x2D, 0x63, 0xCA, 0x53, 0x8C,
+    0x20, 0x6D, 0x0C, 0x4E, 0xF8, 0x10, 0xD2, 0x1A, 0xC1, 0x0C, 0xE8, 0xCF, 0xE1, 0xA8, 0x93, 0x7E,
+    0x8B, 0x32, 0x9D, 0x47, 0x03, 0x2B, 0x92, 0x27, 0x73, 0xE9, 0x39, 0xBD, 0x9F, 0x7B, 0x76, 0x8B,
+    0x3C, 0x66, 0xA1, 0x3E, 0x4B, 0x69, 0x36, 0x71, 0x93, 0x02, 0x47, 0x5E, 0x3D, 0x8F, 0x28, 0x72,
+    0x15, 0x85, 0x64, 0x1C, 0x8F, 0x2F, 0x58, 0x8F, 0xDD, 0x25, 0x84, 0x70, 0x0A, 0xD4, 0x8A, 0x3A,
+    0x02, 0x08, 0xC6, 0x91, 0xBD, 0xE9, 0xA9, 0x66, 0xD0, 0x9F, 0xE5, 0x2F, 0xCF, 0xA2, 0x94, 0x7E,
+    0xB8, 0x91, 0x31, 0x90, 0xC8, 0x06, 0x9B, 0x91, 0xCD, 0xE7, 0xDD, 0x1D, 0x6F, 0x57, 0x40, 0x59,
+    0x64, 0x95, 0x49, 0xAA, 0xA6, 0x48, 0x2F, 0x09, 0x78, 0xE8, 0xA5, 0xCF, 0x41, 0x8C, 0x23, 0x38,
+    0xEB, 0xA6, 0x93, 0x7F, 0x33, 0xE1, 0x38, 0x02, 0x64, 0x8C, 0x6A, 0x40, 0x93, 0xD0, 0x4D, 0xA9,
+    0x9A, 0x4C, 0xE4, 0x2F, 0x8C, 0xC4, 0xFE, 0x00, 0xB6, 0x6C, 0xD2, 0x55, 0xA8, 0xB6, 0xF1, 0x44,
+    0x43, 0x07, 0x53, 0x38, 0x12, 0xD3, 0xA3, 0x25, 0x76, 0x13, 0x7E, 0x81, 0x39, 0xAB, 0x87, 0x90,
+    0x15, 0xEC, 0x81, 0xC4, 0x37, 0x08, 0x18, 0xDC, 0xED, 0xE5, 0xF0, 0xA5, 0x68, 0x41, 0x52, 0x92,
+    0xFA, 0x53, 0x70, 0xF6, 0xA0, 0xDC, 0xEF, 0xCF, 0x6C, 0x3F, 0xDE, 0x72, 0x33, 0x3F, 0x43, 0x84,
+    0xB0, 0xA0, 0xC5, 0xEF, 0x1B, 0x45, 0x63, 0x00, 0x6B, 0xDA, 0x3E, 0xCD, 0x84, 0x19, 0xD4, 0xD9,
+    0x0D, 0x8C, 0x27, 0xF0, 0x6E, 0xA2, 0x03, 0xD5, 0xFD, 0xD7, 0x8F, 0x43, 0x46, 0x5E, 0x38, 0x91,
+    0x7B, 0x2E, 0xB8, 0x65, 0xCD, 0x16, 0xC2, 0xB9, 0x50, 0x97, 0x1C, 0xAF, 0x3A, 0xE0, 0xA9, 0x44,
+    0xE7, 0xF6, 0x5E, 0x40, 0x41, 0x55, 0xDD, 0x05, 0xD9, 0xFC, 0x50, 0xB1, 0x1D, 0x51, 0xEE, 0xB0,
+    0x8A, 0x52, 0x38, 0x77, 0x59, 0x36, 0xDE, 0xB2, 0xB9, 0x28, 0x07, 0xE0, 0xC8, 0x44, 0x80, 0x6D,
+    0x91, 0x72, 0x65, 0xD8, 0xC6, 0xA2, 0xFF, 0xF6, 0x61, 0x37, 0x22, 0x1B, 0x98, 0x65, 0xF9, 0x96,
+    0xDB, 0xF9, 0x33, 0xE7, 0xAE, 0x25, 0x07, 0xC2, 0x01, 0x54, 0xF3, 0xA3, 0xFD, 0xC8, 0x25, 0x8E,
+    0x7B, 0x7F, 0x49, 0xD1, 0x55, 0xA3, 0x17, 0x58, 0x53, 0xF0, 0x0F, 0xCA, 0x1F, 0x6D, 0xEF, 0x28,
+    0x46, 0x0B, 0x35, 0x21, 0x66, 0x6C, 0x4F, 0x01, 0x79, 0x92, 0xD2, 0x16, 0x3C, 0x2C, 0xBE, 0x88,
+    0x2E, 0x09, 0xC3, 0x8E, 0x8E, 0x62, 0x0F, 0x5E, 0x4D, 0x3C, 0x0C, 0xFE, 0x02, 0x1A, 0x02, 0xB1,
+    0xF4, 0x86, 0xCA, 0x17, 0x0E, 0x57, 0x00, 0x35, 0x6C, 0xA6, 0xBF, 0x29, 0x35, 0x24, 0x78, 0x30,
+    0x90, 0xF3, 0xBE, 0x0B, 0x9D, 0x88, 0x79, 0x14, 0x92, 0x32, 0x8F, 0xA0, 0xC1, 0xF7, 0x98, 0xFA,
+    0x9B, 0x62, 0x70, 0x84, 0xA6, 0x5A, 0xA6, 0x03, 0xD0, 0x9F, 0xE9, 0x6A, 0x9F, 0x3A, 0xD4, 0xB7,
+    0xE2, 0x83, 0x6A, 0x5B, 0x94, 0x44, 0x01, 0x99, 0x2F, 0x7F, 0x59, 0xA9, 0xF2, 0xAD, 0x74, 0x15,
+    0xC7, 0x31, 0x22, 0x13, 0x76, 0xF4, 0x3D, 0x4A, 0x07, 0xA7, 0xC0, 0x89, 0xFC, 0x7A, 0x83, 0x6D,
+    0xB1, 0xF8, 0xA3, 0x1F, 0xB9, 0x3B, 0xCC, 0x81, 0x32, 0x37, 0x65, 0x46, 0x2D, 0xAF, 0x9A, 0x4E,
+    0x96, 0x14, 0x3D, 0x57, 0x9C, 0xF1, 0x92, 0xB3, 0x0E, 0x54, 0x4F, 0xF0, 0xA0, 0x70, 0x66, 0x65,
+    0x36, 0x8D, 0x11, 0xD0, 0xBD, 0xD6, 0xEB, 0x49, 0x76, 0x79, 0xB4, 0xB7, 0x91, 0xAA, 0x21, 0x2D,
+    0xBA, 0x19, 0x1C, 0xDC, 0x90, 0x16, 0xEC, 0xB7, 0x09, 0xFF, 0x1F, 0xC8, 0xE5, 0x75, 0xDB, 0x42,
+    0x35, 0x53, 0x07, 0x77, 0x1F, 0x0C, 0xA3, 0x77, 0xD0, 0xCA, 0xDE, 0xC5, 0xB8, 0x15, 0xA6, 0xAB,
+    0x5E, 0x2B, 0xC9, 0x3A, 0x1B, 0xDC, 0xDB, 0x4F, 0x1C, 0xA7, 0xF7, 0xD7, 0xBF, 0x27, 0x07, 0x0C,
+    0xF7, 0xFD, 0x64, 0xF1, 0xA1, 0x89, 0x50, 0xE8, 0xA5, 0x94, 0x12, 0xBC, 0x0B, 0x82, 0x3A, 0xDB,
+    0xE4, 0xCC, 0x8C, 0x61, 0x5D, 0xB6, 0xD0, 0x38, 0xC6, 0xF2, 0xE3, 0xE8, 0x6E, 0xDE, 0xA8, 0x5E,
+    0x13, 0x05, 0x08, 0x17, 0x1F, 0xE5, 0x04, 0x51, 0x7E, 0xB8, 0x67, 0x55, 0xEA, 0x3F, 0x09, 0x53,
+    0xE0, 0x02, 0xD4, 0xD7, 0xE5, 0x4B, 0x71, 0x0C, 0x28, 0xF0, 0x84, 0x9A, 0x3C, 0x5E, 0x3D, 0xA2,
+    0x79, 0xDE, 0x75, 0x8B, 0xCF, 0xA6, 0x69, 0xDC, 0xAB, 0x13, 0x92, 0xFE, 0xDA, 0xEC, 0x89, 0x7C,
+    0x88, 0x66, 0x94, 0x14, 0xD2, 0xDB, 0xCC, 0x5E, 0x5D, 0x5D, 0xD6, 0x64, 0x85, 0x17, 0x9A, 0x48,
+    0xD3, 0xCC, 0xD7, 0x4C, 0x43, 0x40, 0x13, 0x56, 0x3C, 0x27, 0x28, 0xDB, 0xDF, 0xF9, 0x7D, 0x10,
+    0xE5, 0xB4, 0xAB, 0x62, 0x79, 0x08, 0xFA, 0x9E, 0xCE, 0xB2, 0x92, 0x27, 0x05, 0x8F, 0x6C, 0x7B,
+    0xCD, 0xC6, 0xAD, 0x7A, 0xBD, 0x89, 0x04, 0x21, 0x32, 0x52, 0xF8, 0x5B, 0xB1, 0x53, 0x5C, 0x0B,
+    0x43, 0x0E, 0xD2, 0x2D, 0x13, 0xC9, 0xFD, 0x33, 0xB7, 0x5D, 0x91, 0xC5, 0xC8, 0x33, 0xB8, 0xDD,
+    0x29, 0x9D, 0x5D, 0xC4, 0x5A, 0xF9, 0x4A, 0x1A, 0xAF, 0x3F, 0x40, 0x0D, 0x53, 0x64, 0x85, 0x51,
+    0xC4, 0xCD, 0xA3, 0x2E, 0x68, 0x57, 0xFD, 0x4E, 0xF6, 0x43, 0x8F, 0x7D, 0x2E, 0x3D, 0x44, 0x14,
+    0xB0, 0xF1, 0xB3, 0x65, 0x95, 0x3E, 0x20, 0xE1, 0x19, 0xCC, 0xFB, 0x54, 0xA7, 0x89, 0x7F, 0xF4,
+    0xD7, 0x4D, 0x61, 0x00, 0xA0, 0x9C, 0x97, 0x03, 0xA0, 0x0E, 0x95, 0xCD, 0xF4, 0xF5, 0xF9, 0xCA,
+    0x2E, 0x3F, 0x23, 0x86, 0xFE, 0xCF, 0xAA, 0x70, 0x26, 0x8E, 0x80, 0x7F, 0xBC, 0x71, 0x16, 0x40,
+    0x92, 0x4D, 0xB3, 0xF7, 0x82, 0x55, 0x60, 0x20, 0xA2, 0x79, 0x88, 0x55, 0x52, 0xD2, 0xD8, 0x62,
+    0x1B, 0x4B, 0xBD, 0x3D, 0x95, 0x35, 0x3B, 0x90, 0x98, 0xE5, 0x90, 0x83, 0xB9, 0x68, 0xF0, 0xD3,
+    0xFF, 0x20, 0xB9, 0x19, 0xCB, 0xE1, 0xD6, 0x30, 0x69, 0xDF, 0xEB, 0x59, 0xDF, 0x89, 0x77, 0xD1,
+    0x49, 0x8C, 0x5A, 0x4E, 0x8D, 0xD9, 0x63, 0xAF, 0xAA, 0x2E, 0xF1, 0x93, 0x9C, 0xAA, 0xB2, 0x7D,
+    0x6C, 0x2C, 0x69, 0x1E, 0xDA, 0x9C, 0x24, 0xAA, 0x56, 0x66, 0x19, 0x03, 0xBE, 0x21, 0x9D, 0xF4,
+    0x36, 0x65, 0x5A, 0x02, 0x6B, 0x91, 0x41, 0xF7, 0x07, 0x68, 0x26, 0xEA, 0x33, 0x1A, 0x79, 0x9D,
+    0xEF, 0x7A, 0xAF, 0x9B, 0x66, 0x8B, 0xA2, 0xA7, 0x8C, 0x17, 0x33, 0xA0, 0x64, 0x2D, 0x3E, 0x84,
+    0xBC, 0x13, 0x74, 0x52, 0xF9, 0x25, 0x22, 0x67, 0x9A, 0xC3, 0x8C, 0x04, 0x56, 0x66, 0xD6, 0x55,
+    0xB7, 0xF5, 0x50, 0xDC, 0x22, 0xB6, 0x0D, 0x80, 0x49, 0xD9, 0xC8, 0x48, 0x3C, 0xEB, 0x37, 0x42,
+    0x9E, 0x2F, 0xE4, 0xD5, 0xA3, 0xD5, 0xBF, 0xD9, 0xBC, 0x3D, 0x99, 0x03, 0xBE, 0x0C, 0x53, 0x18,
+    0x93, 0x0D, 0xCE, 0x59, 0xB4, 0x08, 0xFA, 0x93, 0x93, 0xAD, 0xEC, 0x24, 0xC1, 0x76, 0x07, 0x06,
+    0xFB, 0x78, 0x93, 0x40, 0xB0, 0x40, 0x7C, 0xBA, 0x4E, 0xBE, 0x93, 0x04, 0xD5, 0xF6, 0x6D, 0x72,
+    0x84, 0x09, 0x2D, 0x8A, 0x5C, 0x86, 0xF3, 0xC0, 0x6B, 0x53, 0xE6, 0xDD, 0xA0, 0x34, 0x41, 0x2B,
+    0x46, 0x7C, 0xE3, 0x76, 0x32, 0xD3, 0x3A, 0x8C, 0x46, 0x9C, 0x98, 0xFF, 0x3D, 0x5F, 0xD5, 0xB0,
+    0xA1, 0xF2, 0x0A, 0xAE, 0x52, 0x3D, 0xD1, 0x71, 0xBA, 0x5B, 0x09, 0xB4, 0x52, 0x65, 0xE8, 0x15,
+    0x80, 0xD5, 0x59, 0x68, 0x68, 0xEC, 0x2B, 0x80, 0x72, 0xDA, 0xCB, 0xEB, 0x68, 0xBC, 0x68, 0xD0,
+    0x19, 0xBC, 0x5E, 0xED, 0x1F, 0x80, 0x8F, 0xD1, 0x76, 0x44, 0x46, 0x6E, 0xD9, 0x78, 0x91, 0xED,
+    0x71, 0x9B, 0x4A, 0xCF, 0x1B, 0x1D, 0xDE, 0xC2, 0x4A, 0xEC, 0xF1, 0x2E, 0xC0, 0xC3, 0xEA, 0x7E,
+    0x76, 0x1F, 0x74, 0xCE, 0x9D, 0xF1, 0x6B, 0x94, 0x21, 0x06, 0x00, 0x58, 0x1E, 0x37, 0x6B, 0xFB,
+    0xB6, 0x45, 0xB4, 0x71, 0x35, 0x74, 0x20, 0x83, 0xA1, 0xD8, 0x3A, 0x1F, 0xA4, 0x17, 0x71, 0xEB,
+    0x10, 0x93, 0xD0, 0xD7, 0x6C, 0xD2, 0x43, 0xF2, 0xF3, 0x66, 0xC1, 0x55, 0x07, 0x00, 0x54, 0xA1,
+    0x4A, 0x4E, 0x55, 0xD9, 0x9D, 0x1D, 0xB0, 0x3F, 0x2E, 0x60, 0xF1, 0x5F, 0x30, 0x1E, 0x66, 0xD8,
+    0xE9, 0xCD, 0x99, 0x0B, 0x72, 0x35, 0x99, 0x55, 0x1E, 0x4A, 0xD7, 0xA3, 0x02, 0x87, 0x27, 0x76,
+    0x5A, 0x8D, 0xBC, 0x3D, 0xAA, 0xD6, 0xDA, 0xFA, 0x43, 0xE7, 0xD4, 0xCD, 0x92, 0xF0, 0xAB, 0xEB,
+    0x9F, 0xD2, 0xC8, 0xA4, 0x3A, 0xF6, 0x1F, 0xAE, 0xBC, 0x79, 0xDD, 0xDD, 0x98, 0xE6, 0xA5, 0x11,
+    0x53, 0x35, 0x24, 0xEE, 0x55, 0xC6, 0x86, 0x17, 0x55, 0x57, 0x8A, 0xCB, 0xAC, 0x9B, 0xA3, 0xBA,
+    0x25, 0x24, 0xB6, 0x14, 0xC2, 0x42, 0xB2, 0xDE, 0x42, 0x0A, 0x23, 0x58, 0xCE, 0xBF, 0x21, 0x2A,
+    0xDB, 0xF1, 0xBD, 0x78, 0xD4, 0x18, 0xCC, 0xFE, 0x49, 0xAE, 0x04, 0xD7, 0x94, 0x58, 0x71, 0x6E,
+    0x8F, 0x3B, 0xE1, 0xBF, 0x6A, 0x9C, 0x73, 0x88, 0x9D, 0xD7, 0xAB, 0x7C, 0xE6, 0xAC, 0x31, 0xFB,
+    0xB0, 0x80, 0xD7, 0x47, 0x8E, 0x32, 0x81, 0x61, 0xCF, 0xCF, 0x41, 0x2B, 0xA8, 0x84, 0x2D, 0x4F,
+    0x64, 0x89, 0xC3, 0xC8, 0xEE, 0xFA, 0xF5, 0x6E, 0xB9, 0x62, 0x38, 0xBC, 0xBA, 0xFF, 0x26, 0x75,
+    0xB4, 0xF3, 0x34, 0xB4, 0x94, 0xD1, 0x31, 0x57, 0x87, 0xDF, 0x93, 0xBC, 0x27, 0xE5, 0x34, 0xEF,
+    0xF5, 0x50, 0xD1, 0x52, 0x53, 0x36, 0xAD, 0x7F, 0xF1, 0x7A, 0x0C, 0xAB, 0x29, 0x17, 0x0A, 0xD4,
+    0xD1, 0x18, 0xA0, 0xC5, 0xD9, 0xC9, 0xFB, 0xC6, 0x08, 0x47, 0xD8, 0x2D, 0x8B, 0xA6, 0x06, 0xA0,
+    0xC1, 0xF3, 0xF4, 0x50, 0x65, 0x0F, 0xF2, 0x1B, 0x04, 0x48, 0x3E, 0x9B, 0xC4, 0x70, 0x6A, 0xCC,
+    0xE6, 0x7C, 0x6D, 0x1F, 0x3F, 0x3B, 0x5B, 0xBE, 0x87, 0x60, 0x31, 0x09, 0x3F, 0xF6, 0x37, 0xF3,
+    0xD9, 0xB8, 0x13, 0x20, 0x38, 0x41, 0xF1, 0xF5, 0xE1, 0x2A, 0xDB, 0x33, 0xE4, 0xFA, 0xCE, 0x15,
+    0xA0, 0x9D, 0x59, 0x2C, 0x05, 0x92, 0xC0, 0x87, 0xBE, 0x3C, 0x21, 0x53, 0xEF, 0xF8, 0x63, 0xB5,
+    0x7F, 0x67, 0x7A, 0xA3, 0x5E, 0x76, 0x75, 0x79, 0x90, 0x15, 0xA8, 0x8B, 0x06, 0xB4, 0x91, 0x6B,
+    0xDE, 0x37, 0x0D, 0x31, 0x40, 0xE1, 0x7E, 0xC4, 0x1F, 0x00, 0xDD, 0xBA, 0x62, 0x00, 0xEA, 0x90,
+    0xE5, 0xF2, 0xEE, 0x71, 0x2E, 0x1C, 0xA3, 0xFA, 0xBA, 0x9C, 0x64, 0xFF, 0x11, 0x07, 0xD2, 0xE7,
+    0x00, 0xF1, 0x08, 0xAA, 0x8E, 0x1A, 0x55, 0x29, 0xFB, 0xFB, 0x17, 0x11, 0xC7, 0xA3, 0xA0, 0x7D,
+    0x10, 0x4E, 0x02, 0xFA, 0xBB, 0x12, 0x3D, 0x74, 0xA2, 0x84, 0xE7, 0xBD, 0x78, 0x77, 0x1E, 0x97,
+    0xC9, 0x33, 0x2B, 0x19, 0x5B, 0x5D, 0xDD, 0xF2, 0xE1, 0xD6, 0xB3, 0x08, 0x0D, 0xE0, 0x56, 0x71,
+    0x9D, 0xE2, 0x0C, 0xB9, 0x60, 0xC4, 0x0C, 0x90, 0x54, 0x07, 0xDC, 0x03, 0x92, 0xC6, 0x20, 0x38,
+    0x3D, 0x3D, 0xC5, 0xC9, 0xF6, 0x02, 0x84, 0x7D, 0x84, 0x5C, 0x6A, 0x60, 0xE5, 0xEF, 0xBC, 0x54,
+    0x71, 0x0C, 0xD3, 0xF7, 0xED, 0x3D, 0x76, 0x0F, 0x19, 0x15, 0x50, 0x53, 0xB4, 0x81, 0x8D, 0x0E,
+    0xCF, 0xA1, 0x59, 0x8D, 0xEF, 0xF2, 0x29, 0x21, 0xF2, 0x64, 0xCE, 0x9C, 0xE2, 0x96, 0x4A, 0x0C,
+    0x1B, 0x71, 0x7A, 0x72, 0x45, 0x24, 0x68, 0xC7, 0xD0, 0x6B, 0xD2, 0x3B, 0x5B, 0x16, 0xEC, 0xFE,
+    0x40, 0x84, 0x72, 0xD7, 0x35, 0x7C, 0xA8, 0x80, 0x8C, 0xBA, 0xDA, 0x56, 0xA3, 0xA9, 0xC1, 0xCC,
+    0x98, 0x6C, 0x20, 0x42, 0xBB, 0xB7, 0x1B, 0x0C, 0xCF, 0x98, 0x77, 0x71, 0x07, 0x1D, 0xDA, 0x66,
+    0xA3, 0xD7, 0xE1, 0x2F, 0xB0, 0x70, 0x7B, 0x53, 0xA9, 0x80, 0x76, 0x16, 0x4E, 0xB3, 0x82, 0x0A,
+    0x33, 0xD0, 0x30, 0x2F, 0x76, 0x89, 0x80, 0x76, 0x25, 0x85, 0xA1, 0x29, 0x97, 0xFA, 0xE3, 0xAE,
+    0x6E, 0x44, 0xBD, 0xA2, 0x6A, 0xA5, 0xCA, 0x9C, 0x13, 0x7A, 0xAE, 0x51, 0x8D, 0x7C, 0xC8, 0xE1,
+    0xE6, 0xA8, 0x36, 0x01, 0x34, 0x1D, 0xA6, 0x40, 0x93, 0xF2, 0x2F, 0x7F, 0xCD, 0x29, 0xB5, 0x5B,
+    0x15, 0xEE, 0x59, 0x63, 0xE6, 0xD7, 0x77, 0xBB, 0x77, 0x0A, 0x25, 0x4D, 0xF3, 0x9D, 0x23, 0x0C,
+    0xD4, 0x6D, 0xBB, 0x11, 0x96, 0x4E, 0x96, 0x15, 0xDE, 0xFE, 0xE6, 0x1A, 0xD2, 0x10, 0xE2, 0xA4,
+    0x6B, 0x2F, 0x99, 0xB5, 0xFA, 0xAC, 0xC5, 0xB6, 0x90, 0xFA, 0x6C, 0x90, 0x16, 0x45, 0xB6, 0x93,
+    0x71, 0x6B, 0x80, 0xE1, 0x9C, 0x65, 0x0D, 0x05, 0x84, 0xB0, 0x1B, 0xAC, 0x4E, 0xAE, 0x6A, 0x42,
+    0x80, 0xF5, 0xD7, 0xAA, 0x43, 0x93, 0xE1, 0x3E, 0x51, 0x71, 0x5B, 0x6E, 0xA7, 0x9F, 0x56, 0x9A,
+    0xFC, 0xFD, 0x3B, 0xA5, 0x07, 0x7C, 0xF6, 0x65, 0x22, 0xEA, 0x8E, 0x52, 0xAA, 0x51, 0x5A, 0x41,
+    0x4A, 0x19, 0x7F, 0x92, 0x18, 0x0C, 0x04, 0x6A, 0xFB, 0x23, 0x30, 0xEC, 0xF5, 0x5B, 0x4E, 0xEA,
+    0xE8, 0x4D, 0x3D, 0x87, 0xAE, 0xE7, 0x7C, 0x9A, 0x9F, 0xC0, 0xAC, 0xB8, 0x28, 0xC2, 0xC8, 0x9D,
+    0xB9, 0x45, 0x9E, 0x4C, 0xC6, 0x7F, 0x34, 0x15, 0x2F, 0x58, 0xE5, 0x10, 0x75, 0x5A, 0x44, 0xB2,
+    0xB6, 0x2B, 0xF5, 0x1D, 0x8F, 0xF7, 0xD8, 0xF5, 0xB2, 0xF5, 0xAA, 0x88, 0x16, 0xD0, 0x26, 0xF4,
+    0x32, 0xFC, 0x8E, 0x60, 0xE7, 0x41, 0x6F, 0x9A, 0xCA, 0x51, 0x8E, 0x45, 0xF6, 0x39, 0xFF, 0x8C,
+    0x48, 0x61, 0x40, 0xE1, 0xC9, 0x45, 0x82, 0x04, 0xEF, 0xB2, 0x59, 0x30, 0xA4, 0x2C, 0x62, 0xD9,
+    0x2D, 0xDD, 0xAB, 0xAD, 0x18, 0x81, 0x19, 0x81, 0xCA, 0xCA, 0x75, 0xB3, 0xD0, 0x37, 0x0F, 0xE9,
+    0x5D, 0x54, 0x8E, 0x0B, 0xB2, 0x55, 0x2A, 0x98, 0xC0, 0x75, 0x5A, 0xEB, 0x9D, 0x11, 0x3F, 0x20,
+    0xE2, 0x3E, 0xB0, 0xB7, 0xCA, 0xB1, 0xD8, 0x30, 0x66, 0x4C, 0xBC, 0xEA, 0x8F, 0x76, 0x30, 0xC4,
+    0x9D, 0x03, 0x21, 0x93, 0xEF, 0x54, 0x06, 0xEC, 0x93, 0xFA, 0x89, 0x48, 0xC7, 0x9C, 0x06, 0x22,
+    0x77, 0xBD, 0xD1, 0x5E, 0xCF, 0x60, 0xD6, 0xA5, 0x17, 0x9A, 0x75, 0x50, 0xF3, 0x97, 0xD4, 0x8E,
+    0xE3, 0x17, 0x41, 0xFD, 0xC0, 0x3B, 0xBB, 0x8A, 0xA7, 0x2B, 0x98, 0xF6, 0xBD, 0xE7, 0x14, 0x2D,
+    0xE9, 0xEF, 0xC9, 0x0B, 0x6E, 0xCC, 0xE3, 0x17, 0xF3, 0xB8, 0xDF, 0x06, 0x3A, 0xE1, 0xB3, 0x58,
+    0x22, 0x3D, 0xEF, 0xEA, 0xBA, 0xF1, 0x9D, 0x4F, 0xDB, 0xCC, 0x0C, 0xED, 0x57, 0x39, 0x80, 0x3A,
+    0x3B, 0xBC, 0xEE, 0x29, 0x04, 0x34, 0xA5, 0x08, 0xE9, 0xDF, 0x96, 0xD3, 0x53, 0xC5, 0x4E, 0xF6,
+    0x38, 0xAD, 0xCA, 0x53, 0x77, 0x59, 0xF1, 0x80, 0x9F, 0xA8, 0xB6, 0xDA, 0x5A, 0x56, 0xAA, 0x84,
+    0x6C, 0x0E, 0xA8, 0xB2, 0x10, 0x37, 0xC8, 0x6A, 0xD8, 0x4D, 0x78, 0xAE, 0x36, 0xD0, 0xDC, 0xE7,
+    0x1D, 0x8E, 0x57, 0xAC, 0xDD, 0x15, 0xAB, 0xB5, 0x30, 0x3C, 0xE7, 0xE6, 0x51, 0xD3, 0x26, 0xF6,
+    0x13, 0x1D, 0xC8, 0xFC, 0x28, 0x83, 0x5E, 0x64, 0xA6, 0xCA, 0xA7, 0x67, 0xE6, 0x34, 0x19, 0x66,
+    0xC8, 0x07, 0xB6, 0x74, 0xB2, 0x59, 0xAE, 0xDA, 0x36, 0x3F, 0x1F, 0xF6, 0x81, 0xEB, 0xC7, 0xB3,
+    0x6D, 0x1F, 0x87, 0xA8, 0x90, 0x37, 0xD5, 0x85, 0xC3, 0x17, 0xC5, 0xE5, 0xE8, 0xCE, 0x83, 0xB5,
+    0x73, 0x49, 0xA7, 0x2B, 0x91, 0x28, 0x2D, 0x2A, 0xC2, 0x22, 0xA7, 0x31, 0x18, 0xA6, 0xA4, 0x8C,
+    0x45, 0x68, 0xA5, 0x95, 0xA4, 0x91, 0xA3, 0xEE, 0x4E, 0x2D, 0xE7, 0xEB, 0x20, 0x8E, 0xE5, 0xF6,
+    0x9E, 0x53, 0x15, 0xCE, 0xA9, 0x21, 0x18, 0xE3, 0x9B, 0x75, 0x32, 0x02, 0x3D, 0xFC, 0x2C, 0x9D,
+    0x85, 0x6A, 0xB2, 0xB9, 0x5D, 0x3A, 0xD1, 0x85, 0xFB, 0xD8, 0xB8, 0x8B, 0x48, 0x09, 0xD3, 0xFD,
+    0xED, 0x11, 0xAA, 0x90, 0xB5, 0x25, 0xC8, 0xB9, 0xA5, 0x49, 0xE9, 0x1E, 0xD0, 0x43, 0xBA, 0x7A,
+    0x49, 0xB7, 0xE3, 0x87, 0xBE, 0xE0, 0xF4, 0x83, 0xDA, 0x82, 0x4F, 0x9E, 0xC1, 0x55, 0x57, 0xF2,
+    0x58, 0x20, 0x63, 0xCF, 0x2C, 0x34, 0x61, 0x6C, 0x15, 0xEF, 0x11, 0xB3, 0x7E, 0xA6, 0x13, 0xD9,
+    0x2F, 0xD1, 0xAD, 0x61, 0xDE, 0x69, 0xB9, 0x9D, 0x1A, 0x24, 0x72, 0x5D, 0x4E, 0xA0, 0xB4, 0x7E,
+    0xE9, 0x14, 0x77, 0x4C, 0xD6, 0xAE, 0xF6, 0x35, 0x69, 0x2D, 0x28, 0x98, 0x29, 0x73, 0xDE, 0x1D,
+    0x3D, 0x10, 0x50, 0x8C, 0x55, 0x3D, 0x27, 0x89, 0x57, 0x1F, 0x7B, 0x62, 0xD9, 0x12, 0xF7, 0x8D,
+    0xD3, 0x0F, 0x6B, 0x98, 0x6A, 0x64, 0xF7, 0x62, 0xFB, 0x69, 0x6D, 0x14, 0xF1, 0xF5, 0x6D, 0x5E,
+    0xC1, 0x79, 0x3C, 0x1D, 0xDE, 0x45, 0x95, 0xE4, 0x10, 0x70, 0x68, 0x78, 0x0F, 0x70, 0xBE, 0xAC,
+    0xFE, 0xD3, 0x6E, 0x5B, 0x9F, 0x7E, 0x2C, 0xD3, 0x0E, 0xC2, 0x6A, 0x96, 0x4D, 0x11, 0xEA, 0x62,
+    0x6F, 0xAC, 0xAB, 0xE7, 0x8E, 0x0F, 0xC4, 0xFB, 0x23, 0x06, 0x7E, 0x0A, 0x87, 0x8E, 0x8D, 0xA8,
+    0xE9, 0x90, 0x2D, 0xA2, 0xBF, 0x0B, 0x4C, 0x4C, 0x91, 0xE1, 0x7F, 0x55, 0x7C, 0x01, 0x94, 0xE3,
+    0xA1, 0x08, 0xA0, 0x52, 0x8A, 0x2B, 0x0F, 0x5D, 0xD5, 0x70, 0x5F, 0x65, 0x1C, 0xB9, 0x9B, 0x0C,
+    0x2B, 0xD6, 0x8E, 0x95, 0x29, 0x6C, 0x69, 0x63, 0xEA, 0x50, 0xB1, 0x2F, 0xAE, 0x06, 0x14, 0xDD,
+    0x44, 0x38, 0x59, 0xF4, 0x35, 0xC6, 0x5B, 0xE9, 0xA8, 0x42, 0x10, 0xB1, 0x3C, 0x56, 0x76, 0x33,
+    0x81, 0x88, 0x9D, 0x5B, 0x71, 0xEB, 0xA8, 0x78, 0xA2, 0xC6, 0x37, 0x3E, 0x75, 0xDB, 0x4F, 0xB5,
+    0xE6, 0x9E, 0x53, 0x6C, 0x66, 0x65, 0x4C, 0x9F, 0xF7, 0x52, 0x7A, 0x24, 0x5B, 0x1C, 0xD1, 0x6B,
+    0xFE, 0xD4, 0x05, 0x22, 0x5D, 0x4A, 0x85, 0x88, 0x82, 0xF6, 0xF7, 0x25, 0xF5, 0xED, 0xF0, 0xCC,
+    0x47, 0xDE, 0x79, 0x9A, 0x88, 0xBE, 0xA1, 0x94, 0xF1, 0x4E, 0x2C, 0xFA, 0x8C, 0xE5, 0xE0, 0x8C,
+    0xA1, 0x86, 0xFF, 0x2B, 0x0A, 0x84, 0x1C, 0xBB, 0x38, 0x49, 0x94, 0x33, 0xBD, 0xBA, 0xAB, 0x8B,
+    0x66, 0x6D, 0x2C, 0x08, 0x78, 0x21, 0xB7, 0xDF, 0xAD, 0x17, 0x23, 0xCF, 0x42, 0x4E, 0xBD, 0x4F,
+    0x1B, 0x50, 0x9A, 0x55, 0x60, 0x1D, 0x1D, 0x52, 0xAC, 0x3A, 0x70, 0x8E, 0x20, 0x4C, 0x74, 0x7F,
+    0xBE, 0xC1, 0xFB, 0xF7, 0x0E, 0x03, 0x90, 0x36, 0x25, 0x08, 0x10, 0xAD, 0x02, 0xAB, 0x0E, 0xD0,
+    0x3E, 0xA3, 0xF8, 0x8D, 0x06, 0x73, 0x09, 0x07, 0x81, 0x1B, 0x07, 0x15, 0x56, 0x13, 0xB4, 0x5A,
+    0xBD, 0x88, 0xB5, 0xA8, 0x64, 0xC2, 0x8C, 0x20, 0xDD, 0xA5, 0xD1, 0x3F, 0x43, 0xEA, 0xD1, 0x64,
+    0x70, 0x78, 0x66, 0x0F, 0x14, 0xC8, 0x13, 0x30, 0x74, 0xEE, 0x2D, 0x8C, 0xD3, 0x39, 0x3B, 0xDA,
+    0x21, 0x64, 0x66, 0x0E, 0xC0, 0xC2, 0xCF, 0xF9, 0x27, 0xDD, 0x95, 0xDC, 0xA7, 0x2A, 0x72, 0xE2,
+    0x2C, 0x60, 0x6F, 0x93, 0x45, 0x36, 0x58, 0x7B, 0xD2, 0x47, 0x88, 0xDF, 0xCD, 0xD7, 0x76, 0xEC,
+    0xA6, 0x2C, 0xE4, 0x5E, 0xD9, 0x74, 0xBD, 0x06, 0xC7, 0xBD, 0xBB, 0x09, 0x87, 0x97, 0x2E, 0x2B,
+    0x55, 0x48, 0xC1, 0xCD, 0x58, 0xB0, 0x33, 0x31, 0xD8, 0x19, 0x56, 0x4A, 0x57, 0x33, 0xEA, 0x86,
+    0xA7, 0x68, 0x2A, 0xBB, 0x15, 0xC9, 0xB5, 0x9C, 0xCE, 0x77, 0x82, 0xD5, 0x56, 0xE2, 0x8C, 0xA0,
+    0xC3, 0x86, 0x0A, 0x61, 0xE4, 0xF8, 0xF6, 0x1F, 0xA6, 0xE1, 0xD7, 0x96, 0xC9, 0xD7, 0xD7, 0x12,
+    0xB8, 0x2E, 0xFB, 0x31, 0x8D, 0xFA, 0x13, 0x4C, 0xE7, 0x82, 0x90, 0xBC, 0x41, 0xA5, 0x9B, 0x55,
+    0x24, 0xF5, 0xCE, 0xA6, 0x3D, 0x24, 0xCF, 0xB1, 0x66, 0xF9, 0x51, 0x2C, 0x86, 0xCD, 0x67, 0x82,
+    0x3F, 0xA9, 0x29, 0x6B, 0x33, 0x00, 0xD2, 0xBB, 0x75, 0x12, 0xEC, 0x8F, 0x0E, 0x45, 0x2A, 0x5C,
+    0x2D, 0x79, 0xC8, 0xFD, 0x84, 0xE8, 0x29, 0x61, 0x73, 0xFF, 0x9F, 0xB3, 0x23, 0x9C, 0xD5, 0x56,
+    0x47, 0x72, 0x71, 0xF3, 0x69, 0xC5, 0xD5, 0x48, 0x6B, 0x12, 0xBF, 0x93, 0xB0, 0x2F, 0x6F, 0x31,
+    0xF6, 0xCD, 0x53, 0xAB, 0x9F, 0xA3, 0x61, 0x60, 0x09, 0x44, 0x27, 0x18, 0x75, 0x90, 0xFA, 0x72,
+    0x77, 0xC9, 0xC7, 0xFC, 0x2F, 0x37, 0x9A, 0xC2, 0x94, 0xE9, 0xE0, 0x55, 0x44, 0x15, 0x8A, 0xFC,
+    0xE2, 0x68, 0x93, 0x69, 0x68, 0x79, 0xC3, 0x49, 0xF7, 0x6B, 0xCA, 0xE3, 0xF4, 0x51, 0xDB, 0x05,
+    0x66, 0xBF, 0x95, 0x80, 0x9B, 0xEA, 0xED, 0xE7, 0x9A, 0xB6, 0xFF, 0xA1, 0xBB, 0x2D, 0x4B, 0xF9,
+    0xD1, 0xAC, 0x8C, 0x1B, 0x8A, 0xF5, 0xEE, 0x37, 0xDF, 0xC8, 0xEA, 0x73, 0x23, 0x74, 0xAE, 0xCE,
+    0x5F, 0x9B, 0x08, 0x3D, 0xD9, 0x40, 0xF2, 0x0B, 0x0D, 0x0D, 0x8D, 0x6D, 0x5C, 0xAB, 0x7B, 0xB3,
+    0x12, 0x7E, 0xA1, 0xD5, 0xEA, 0xD5, 0xA8, 0x13, 0xF9, 0x71, 0xE2, 0x3A, 0x5B, 0x35, 0x8C, 0x7A,
+    0x6F, 0x52, 0xB0, 0xB8, 0x0F, 0x78, 0x30, 0xF3, 0xD5, 0x8A, 0x93, 0xF6, 0x24, 0x75, 0xBE, 0x18,
+    0xB1, 0x81, 0x6A, 0xC3, 0xCC, 0x5B, 0x23, 0x55, 0x9D, 0xEB, 0x5F, 0x25, 0x76, 0x5C, 0xCD, 0x9E,
+    0x58, 0x12, 0xFD, 0x49, 0xC5, 0x46, 0xD3, 0x5D, 0x45, 0xAD, 0xCD, 0xC1, 0x4A, 0xA2, 0x7B, 0xF7,
+    0x5D, 0x13, 0x97, 0xCF, 0xB4, 0x94, 0xAA, 0xCD, 0xC9, 0xDC, 0x9C, 0xE4, 0xB1, 0x67, 0xE1, 0x7D,
+    0x11, 0x64, 0x2E, 0x13, 0x59, 0x70, 0xB9, 0x27, 0x33, 0x77, 0xB7, 0xC1, 0xA6, 0x54, 0xAA, 0x43,
+    0x94, 0xA1, 0x06, 0xA4, 0xDE, 0x8F, 0x0A, 0x9B, 0xD5, 0x40, 0xBF, 0x7E, 0x69, 0xAA, 0x5C, 0x0A,
+    0xDC, 0x93, 0xFD, 0x05, 0x04, 0x6F, 0x9D, 0x1F, 0x42, 0x7D, 0x2A, 0x60, 0x77, 0x87, 0xF4, 0x52,
+    0xAB, 0xC3, 0xD5, 0x88, 0xF5, 0x89, 0xA0, 0xC7, 0x6A, 0x48, 0xB9, 0x75, 0xE5, 0x39, 0x7A, 0x39,
+    0xC1, 0x25, 0xC6, 0xF8, 0xF6, 0x96, 0x7B, 0x0F, 0x4B, 0xBC, 0x37, 0x46, 0x9D, 0xA7, 0xA5, 0xDD,
+    0x71, 0x99, 0xDA, 0x12, 0x88, 0x18, 0x80, 0x04, 0xF9, 0x5B, 0xDE, 0x01, 0x2C, 0xA2, 0x97, 0xDF,
+    0xC9, 0xC3, 0xC8, 0xAB, 0x18, 0x80, 0x3D, 0xDA, 0xD0, 0xD6, 0x9C, 0xDC, 0xE6, 0xA1, 0x08, 0xD8,
+    0x63, 0xC0, 0x28, 0x6E, 0x61, 0x33, 0x3F, 0x44, 0xD0, 0x8B, 0xB9, 0x4D, 0xB5, 0x99, 0x53, 0xE9,
+    0x20, 0x02, 0x2F, 0x40, 0xD6, 0x16, 0x32, 0x1E, 0xE7, 0x6D, 0x20, 0xCA, 0x73, 0xC7, 0xCA, 0x3A,
+    0x3C, 0x0C, 0xFE, 0xBB, 0xE8, 0xB4, 0x5F, 0x85, 0xA6, 0x33, 0x9C, 0x3D, 0x4B, 0xD9, 0x94, 0xAA,
+    0x5D, 0x23, 0xDE, 0xC7, 0x8F, 0xDE, 0xF3, 0x94, 0x54, 0x56, 0x36, 0x9A, 0x52, 0x18, 0x6A, 0x91,
+    0x0E, 0x00, 0xD4, 0x2F, 0xBB, 0x2A, 0x2E, 0xEB, 0x11, 0x05, 0xA5, 0xB3, 0xA9, 0x9A, 0xB1, 0x96,
+    0xAB, 0xBB, 0x5F, 0x55, 0x9F, 0x9E, 0xDB, 0x44, 0x44, 0xE7, 0x19, 0x2F, 0x42, 0xAA, 0x66, 0xA1,
+    0x8E, 0xFC, 0x4F, 0xD5, 0xBC, 0x6C, 0x70, 0x65, 0x05, 0x4F, 0x0A, 0xD4, 0xD1, 0x11, 0xA8, 0x24,
+    0x4A, 0xDD, 0x6C, 0x70, 0xA4, 0x62, 0xC6, 0x17, 0xB1, 0x55, 0xF1, 0x2D, 0x7B, 0x3D, 0x8F, 0xF9,
+    0xB6, 0x86, 0xEF, 0xD7, 0xF2, 0x70, 0x2C, 0xF0, 0x82, 0x3F, 0x2E, 0x05, 0xC6, 0xFE, 0xD6, 0x14,
+    0xFA, 0x43, 0xCE, 0x3A, 0xD9, 0xC3, 0x18, 0x42, 0xF8, 0xE3, 0x92, 0x59, 0x90, 0x5C, 0xE1, 0xBE,
+    0x30, 0x36, 0xEF, 0x15, 0x9E, 0xFB, 0x1F, 0xD0, 0x82, 0xCF, 0x34, 0xB8, 0x44, 0xF3, 0x6C, 0x98,
+    0x13, 0x9A, 0x25, 0xEC, 0xD7, 0x8C, 0x1B, 0x7D, 0x92, 0x91, 0xBB, 0x39, 0xD9, 0x5C, 0x76, 0xBA,
+    0x5D, 0x8B, 0xA3, 0xF3, 0x48, 0x72, 0x7D, 0xAE, 0x6E, 0x2B, 0x41, 0x6D, 0xCA, 0xDC, 0xBA, 0xD4,
+    0x01, 0x47, 0x5E, 0x92, 0xDA, 0x8F, 0x06, 0xAF, 0xB5, 0x76, 0xDE, 0xA2, 0xC0, 0x64, 0x1A, 0xB3,
+    0x5F, 0xA1, 0x16, 0xCF, 0x77, 0x48, 0x1E, 0x5C, 0x7F, 0xCD, 0x03, 0xA1, 0x2F, 0x83, 0x8C, 0x1B,
+    0x6B, 0xFD, 0x9B, 0x67, 0x32, 0x7E, 0xBE, 0x9E, 0xE0, 0x82, 0x75, 0x7E, 0xAC, 0xD7, 0x3F, 0x26,
+    0x53, 0xB8, 0x83, 0x15, 0x16, 0x49, 0x70, 0x01, 0x6F, 0x22, 0x3D, 0x9B, 0x56, 0x61, 0x96, 0x59,
+    0x05, 0x98, 0x0F, 0xA5, 0x76, 0x26, 0x5D, 0xFE, 0x92, 0x0E, 0xF4, 0xAC, 0x73, 0x40, 0xEF, 0xEB,
+    0x56, 0x14, 0xCD, 0x8D, 0x94, 0x8E, 0x34, 0xBF, 0x5B, 0xA0, 0xD0, 0xE3, 0xBA, 0xF3, 0x1F, 0x0D,
+    0x40, 0xD0, 0xE4, 0x53, 0x00, 0xCB, 0x30, 0x4A, 0x8C, 0xA2, 0x95, 0xCC, 0xB0, 0x36, 0xE3, 0x51,
+    0x19, 0x00, 0xBE, 0x86, 0x91, 0x7F, 0x15, 0x1B, 0xF1, 0x9D, 0x37, 0x9C, 0x24, 0xCB, 0x7F, 0xFB,
+    0x96, 0x22, 0x49, 0xC0, 0x5F, 0x12, 0xE8, 0x97, 0x00, 0xCB, 0x09, 0x2B, 0x10, 0x82, 0x88, 0xEA,
+    0x83, 0x79, 0x50, 0xA5, 0x78, 0x40, 0x61, 0xD3, 0xB7, 0x28, 0x55, 0xC9, 0x16, 0xFA, 0x31, 0xA0,
+    0x38, 0xCE, 0x89, 0x36, 0xA3, 0x75, 0xC0, 0x13, 0xF0, 0xB1, 0xD9, 0x0B, 0x83, 0x92, 0x84, 0xEC,
+    0xF8, 0x42, 0x26, 0xF8, 0xA1, 0xDE, 0x4F, 0xC1, 0xE9, 0x22, 0x74, 0xA1, 0x11, 0x93, 0x3F, 0x98,
+    0x5C, 0x7D, 0x84, 0xC1, 0x66, 0xD0, 0xDC, 0x7E, 0x5A, 0x9B, 0xF1, 0xBD, 0x46, 0xBA, 0x2B, 0xD9,
+    0xCA, 0x80, 0xDA, 0x3D, 0x04, 0xE1, 0xBE, 0x74, 0x1F, 0x83, 0x6C, 0xD1, 0x1C, 0xC5, 0x6F, 0x1D,
+    0x1E, 0xF3, 0x29, 0x93, 0x12, 0xFB, 0x19, 0xCF, 0xB7, 0xA0, 0xF6, 0x21, 0x24, 0x5E, 0x1D, 0xD9,
+    0x1C, 0x66, 0x21, 0xE9, 0xC8, 0x54, 0xDB, 0x5B, 0x81, 0x4B, 0xDB, 0xE0, 0x36, 0x88, 0xC5, 0x5F,
+    0x0B, 0xA2, 0xBD, 0x8D, 0x6B, 0x14, 0x46, 0xA0, 0xE0, 0x37, 0x1D, 0x11, 0xB0, 0x15, 0x53, 0xF5,
+    0xBF, 0xF8, 0x0F, 0x6E, 0xCB, 0x42, 0xE2, 0xFC, 0xE5, 0xBB, 0xFB, 0x8F, 0x98, 0x23, 0x21, 0xC2,
+    0x69, 0x6D, 0x13, 0x2A, 0x55, 0xEF, 0x32, 0xBF, 0x9E, 0xC3, 0x74, 0x55, 0x0D, 0xA3, 0xF8, 0x56,
+    0xC0, 0xE1, 0x25, 0x91, 0x78, 0x79, 0x6D, 0xEA, 0xEB, 0xCF, 0x48, 0x82, 0xB0, 0xEB, 0x44, 0x0C,
+    0xB6, 0xF6, 0x21, 0x9D, 0xD2, 0xF4, 0x67, 0xC1, 0x93, 0x55, 0x48, 0x35, 0xB3, 0xE0, 0x62, 0x86,
+    0x9C, 0x5C, 0xF1, 0x4C, 0xB5, 0x2A, 0xAF, 0x3D, 0x42, 0xFD, 0x6F, 0x95, 0x4F, 0x00, 0xE9, 0x42,
+    0x20, 0x6E, 0x8B, 0x51, 0xFF, 0xD4, 0xD8, 0xCE, 0x76, 0xE4, 0xE8, 0x9F, 0x2B, 0x0E, 0x47, 0x12,
+    0xC4, 0xEF, 0xAB, 0x91, 0xCF, 0x37, 0x4F, 0x52, 0x29, 0x75, 0xC3, 0xC0, 0xB8, 0xF4, 0x04, 0x9E,
+    0xA9, 0x86, 0x6B, 0x93, 0x21, 0x7A, 0x11, 0x26, 0x33, 0xC0, 0x0A, 0x7B, 0xED, 0x0F, 0x2B, 0x9F,
+    0x91, 0xE3, 0x19, 0x47, 0xD8, 0xD8, 0x0D, 0xCB, 0x6D, 0xC0, 0xAC, 0xEB, 0xEB, 0x59, 0xA6, 0x44,
+    0x56, 0xE3, 0x95, 0xB6, 0x2A, 0xBA, 0xBC, 0x65, 0x5B, 0x0C, 0x9E, 0x04, 0xDE, 0x65, 0x8E, 0x29,
+    0x73, 0x18, 0x0B, 0xC7, 0xA3, 0x76, 0x43, 0xD4, 0x07, 0xF0, 0x3B, 0x09, 0xCC, 0xF7, 0x10, 0x57,
+    0x9C, 0x05, 0x2A, 0xC5, 0x8C, 0x53, 0xE3, 0xA9, 0xA6, 0x20, 0x0B, 0x71, 0xAF, 0x4B, 0x95, 0x8F,
+    0xB1, 0xA6, 0x96, 0xDC, 0xFC, 0x85, 0xC5, 0x94, 0xBF, 0x86, 0xA6, 0x88, 0xC9, 0xEB, 0x04, 0x2A,
+    0x3B, 0xF8, 0x17, 0x07, 0x7D, 0x0F, 0x89, 0x44, 0x3D, 0x97, 0xA1, 0x8A, 0x4E, 0x2E, 0x8F, 0x9C,
+    0xB8, 0x6C, 0xA0, 0x50, 0x5D, 0xC4, 0x22, 0xDF, 0xF0, 0x5A, 0xD2, 0xF4, 0x3F, 0x20, 0xFD, 0xAA,
+    0x6E, 0x04, 0xF3, 0xFA, 0x2E, 0x5D, 0x6F, 0x6B, 0x2A, 0xE9, 0x77, 0x16, 0x65, 0xB7, 0x1B, 0xDC,
+    0x8F, 0x58, 0x2F, 0x32, 0x9D, 0x57, 0xB7, 0x64, 0xD0, 0x77, 0x6E, 0xE7, 0x03, 0x39, 0xB0, 0xDF,
+    0x19, 0x97, 0x29, 0xCA, 0xFE, 0xFC, 0xB6, 0x21, 0xD0, 0x2C, 0x07, 0x36, 0x1D, 0x72, 0x07, 0x9B,
+    0xEB, 0xED, 0x1B, 0xB9, 0xD3, 0x87, 0xF8, 0x33, 0x94, 0x42, 0xAF, 0x91, 0x7C, 0x43, 0x91, 0xAF,
+    0x33, 0x22, 0x5E, 0x48, 0xE6, 0x73, 0xF6, 0xB6, 0x00, 0xAC, 0x29, 0x88, 0xCB, 0x45, 0x31, 0x3D,
+    0xF8, 0x24, 0x98, 0x3F, 0xD9, 0x21, 0xAA, 0x6D, 0xCA, 0x49, 0x53, 0xC5, 0x20, 0x48, 0xA7, 0xCE,
+    0x5B, 0x9C, 0x23, 0x54, 0x51, 0xFC, 0xB6, 0x7A, 0x61, 0x4E, 0xDE, 0xE2, 0x82, 0xE8, 0xE0, 0xEC,
+    0xE3, 0x65, 0xA6, 0xB5, 0x5E, 0x0F, 0x5A, 0xDC, 0xB2, 0x9D, 0x4B, 0x5D, 0x35, 0x71, 0xDB, 0x9F,
+    0x9D, 0x5F, 0xB6, 0x56, 0x17, 0x02, 0x69, 0x65, 0x1C, 0x5E, 0xC2, 0x81, 0x0D, 0x5D, 0x4A, 0x0F,
+    0x25, 0x89, 0x60, 0x06, 0xEB, 0xEB, 0x1C, 0x8D, 0x8C, 0x2F, 0xBD, 0xD2, 0x68, 0xB6, 0xE5, 0x86,
+    0xCA, 0xEC, 0x85, 0x3F, 0x69, 0x90, 0x45, 0xC3, 0x70, 0x57, 0x72, 0x3E, 0xCD, 0xAA, 0xAE, 0xA2,
+    0x46, 0xEE, 0x70, 0xBE, 0x30, 0xEC, 0x6F, 0xA5, 0xC2, 0xCD, 0x5B, 0x1C, 0x9A, 0x4D, 0xAA, 0x23,
+    0xE4, 0xC7, 0x4F, 0x9B, 0xF2, 0x19, 0x67, 0x14, 0x32, 0x66, 0xD8, 0xF2, 0x0D, 0xD6, 0x62, 0xEC,
+    0x95, 0xF5, 0x50, 0xF3, 0x98, 0x75, 0xFA, 0xE2, 0xCA, 0x5D, 0x3F, 0x28, 0x7D, 0xD0, 0xE2, 0x34,
+    0x40, 0x7B, 0xB5, 0x07, 0x1F, 0x52, 0xEF, 0x2C, 0x3D, 0xAB, 0x3A, 0x72, 0x45, 0xC5, 0x47, 0x83,
+    0xFA, 0x5C, 0xE3, 0x66, 0x77, 0x4F, 0x89, 0x7C, 0xFE, 0x9C, 0xDB, 0x4E, 0xA4, 0xB9, 0xE6, 0xE8,
+    0x78, 0x50, 0x43, 0x20, 0x8B, 0x8C, 0x78, 0x27, 0x88, 0x9A, 0x40, 0x89, 0x36, 0x4B, 0x08, 0x2E,
+    0xC2, 0x60, 0x51, 0x9C, 0xE8, 0x96, 0x93, 0x8B, 0x69, 0xF7, 0x2A, 0x7E, 0x9E, 0xF7, 0x4C, 0xFC,
+    0xD2, 0xF5, 0x97, 0xC2, 0x49, 0x9D, 0x1B, 0xB0, 0xAA, 0x61, 0x50, 0xD9, 0x06, 0xE7, 0x9E, 0x61,
+    0x06, 0xB7, 0xD6, 0xDE, 0x64, 0x2A, 0x9D, 0x1E, 0xF3, 0xFB, 0xD4, 0xC1, 0x49, 0x13, 0x4C, 0xC8,
+    0x1C, 0x84, 0x0C, 0xD9, 0xF8, 0x70, 0x7A, 0x57, 0x7B, 0xE5, 0xAA, 0xD7, 0x0C, 0xD8, 0x90, 0xBB,
+    0x10, 0x7D, 0x68, 0x76, 0xD9, 0x70, 0xBE, 0x89, 0x75, 0xF9, 0xE6, 0x67, 0x06, 0x1E, 0x43, 0xAF,
+    0x44, 0xB0, 0x0C, 0xC8, 0x69, 0x9B, 0x07, 0x42, 0xAF, 0xB2, 0x87, 0xCE, 0x39, 0xC6, 0xFE, 0xCF,
+    0xF9, 0x3F, 0xD0, 0xB6, 0xC5, 0x3C, 0xC4, 0xC9, 0x15, 0x04, 0xA7, 0x4B, 0xB2, 0xC2, 0x1F, 0x52,
+    0x08, 0x5E, 0xBB, 0x1C, 0x87, 0x0C, 0xF3, 0xF2, 0x3D, 0xE2, 0xC3, 0xEC, 0xFD, 0xA6, 0x99, 0x6B,
+    0x6D, 0x2F, 0xC6, 0xE0, 0x24, 0xE5, 0xCD, 0xF5, 0x0C, 0x43, 0xDD, 0xDA, 0x85, 0xEF, 0xDD, 0x47,
+    0xDD, 0xB0, 0xE5, 0x56, 0x8E, 0xC7, 0x3E, 0x20, 0x29, 0x0F, 0x36, 0x6C, 0x5C, 0x39, 0x9C, 0x60,
+    0x9B, 0x42, 0xDE, 0x40, 0x6E, 0xC0, 0x27, 0x76, 0x68, 0x5C, 0x35, 0xE5, 0x57, 0x1E, 0x27, 0x38,
+    0x3C, 0x59, 0x17, 0x3E, 0xC1, 0x77, 0x06, 0x45, 0xBD, 0x5E, 0xFD, 0x13, 0x72, 0x2E, 0xCD, 0x62,
+    0x28, 0x63, 0xAF, 0x61, 0x26, 0x67, 0x07, 0x0F, 0xC3, 0xFE, 0xBB, 0x99, 0x17, 0x6F, 0xBB, 0x82,
+    0xCC, 0x6E, 0x99, 0xF1, 0x70, 0xAD, 0x4B, 0x78, 0x1C, 0x44, 0x78, 0x36, 0x05, 0x01, 0x38, 0x1E,
+    0x8E, 0xB1, 0xCE, 0x2F, 0xD2, 0x9F, 0x09, 0x4F, 0x01, 0xB1, 0x12, 0xDD, 0x8E, 0x94, 0x51, 0x43,
+    0xCD, 0x48, 0xE4, 0x62, 0x71, 0xA5, 0x64, 0xDD, 0xB5, 0x25, 0x2B, 0x67, 0x97, 0x17, 0xC8, 0xE5,
+    0xD1, 0x52, 0x0E, 0x2E, 0xD1, 0x7D, 0xA1, 0x0C, 0x2E, 0x16, 0x91, 0xC2, 0x5D, 0xE0, 0x16, 0x41,
+    0x91, 0xA9, 0x27, 0x84, 0x36, 0x1C, 0xC2, 0xAC, 0x10, 0x69, 0x1E, 0x5E, 0x83, 0xE4, 0xA2, 0x9B,
+    0xEE, 0x4F, 0xAE, 0xE5, 0xAF, 0x83, 0x6C, 0xD7, 0xF8, 0x24, 0x41, 0x33, 0x2B, 0x02, 0xD8, 0xBE,
+    0x77, 0x8D, 0xC4, 0x86, 0xBA, 0x2F, 0xE6, 0x0F, 0x46, 0xE8, 0x83, 0x38, 0x8E, 0x17, 0x02, 0x98,
+    0xF7, 0x3B, 0xA0, 0x0C, 0xDD, 0x34, 0x25, 0x0C, 0x19, 0x94, 0x18, 0xF9, 0xA7, 0xCD, 0x33, 0xED,
+    0xD1, 0xA9, 0x8B, 0xB7, 0xEF, 0x6B, 0xF0, 0x1D, 0x71, 0x22, 0x6D, 0xC5, 0x5B, 0xF0, 0xCA, 0x08,
+    0xE0, 0xBE, 0x75, 0x76, 0x5E, 0x50, 0x68, 0xA3, 0xC1, 0x39, 0x08, 0x18, 0x85, 0xA8, 0xC6, 0xDE,
+    0x50, 0x0E, 0xF0, 0x38, 0x8B, 0xA9, 0x16, 0xFB, 0x2D, 0x69, 0x16, 0xA2, 0x55, 0x3D, 0x48, 0x82,
+    0xD3, 0x14, 0xCA, 0x76, 0x26, 0xA3, 0x61, 0x56, 0xC1, 0x0E, 0xF7, 0xAE, 0x61, 0xC4, 0xEC, 0xB8,
+    0x1D, 0x7C, 0x8E, 0x4A, 0x9F, 0xC4, 0x62, 0xB8, 0x5A, 0x42, 0x5E, 0xA9, 0x5E, 0x20, 0x06, 0x66,
+    0xBD, 0x53, 0x49, 0x84, 0x8C, 0xE7, 0xA4, 0xB3, 0xF8, 0x25, 0xA3, 0xF8, 0x49, 0x8B, 0x8F, 0x66,
+    0xEF, 0xC9, 0xBF, 0x88, 0x5A, 0xE9, 0x22, 0xDD, 0x38, 0xEE, 0xED, 0x7B, 0xB7, 0x0C, 0x0A, 0xEC,
+    0x26, 0x72, 0x5A, 0xE8, 0xAF, 0x62, 0xAE, 0x01, 0xFA, 0xA0, 0x91, 0x52, 0x55, 0x49, 0x09, 0x5A,
+    0x4E, 0xC4, 0xB4, 0x78, 0x8C, 0xAE, 0x4F, 0xED, 0x32, 0x88, 0x55, 0xE1, 0x40, 0xDA, 0x77, 0x1A,
+    0x17, 0x00, 0x9C, 0x14, 0xB9, 0x52, 0x94, 0xB3, 0x02, 0x91, 0x03, 0x90, 0xF4, 0xF1, 0x4C, 0x52,
+    0x6C, 0x52, 0x39, 0xC5, 0x92, 0xCE, 0x91, 0x42, 0x27, 0xAE, 0x16, 0x44, 0xCF, 0xE4, 0xB8, 0x51,
+    0x39, 0x03, 0xC0, 0xEE, 0xCE, 0xAB, 0x9F, 0x76, 0x75, 0x53, 0xCD, 0x5E, 0x88, 0x54, 0x9F, 0x61,
+    0x70, 0xFA, 0xDD, 0x36, 0xFA, 0x37, 0x35, 0x6D, 0xF4, 0x0F, 0x29, 0xC2, 0x22, 0x40, 0x7B, 0x86,
+    0x7E, 0xCE, 0x9A, 0xED, 0x1A, 0xDC, 0x49, 0xDE, 0x7A, 0xCD, 0xCB, 0x0F, 0xAB, 0xFC, 0x97, 0xC8,
+    0x8B, 0x3A, 0x0A, 0xAB, 0x23, 0x6D, 0xFC, 0xE9, 0xC4, 0x30, 0x46, 0x30, 0x82, 0x14, 0xFB, 0xBA,
+    0x77, 0x6F, 0x16, 0x32, 0xD7, 0xE8, 0xAA, 0x79, 0x3D, 0x0B, 0x91, 0x11, 0x45, 0x57, 0x05, 0x79,
+    0x99, 0x12, 0x55, 0x36, 0x5B, 0x06, 0xCA, 0xAA, 0x82, 0x51, 0x84, 0x8B, 0x20, 0xE9, 0x6A, 0x3A,
+    0x17, 0x30, 0x30, 0xFD, 0x99, 0xEC, 0xBD, 0x54, 0xCC, 0x3A, 0xC0, 0xFF, 0x5C, 0x49, 0xE0, 0x6C,
+    0x99, 0x0F, 0x48, 0xCD, 0x70, 0x62, 0x7B, 0x69, 0x92, 0x34, 0x2D, 0x44, 0x63, 0x23, 0x9E, 0x1F,
+    0x17, 0x7B, 0x2A, 0xF5, 0x06, 0x02, 0x24, 0x21, 0x51, 0x2E, 0x02, 0x2D, 0x23, 0x51, 0x7C, 0x8E,
+    0xD3, 0x32, 0xE2, 0x28, 0x3B, 0x6B, 0x0E, 0x5B, 0x4B, 0xD5, 0x2B, 0x38, 0x1E, 0x5C, 0xC9, 0x31,
+    0x88, 0x85, 0xB9, 0xD3, 0x6F, 0x37, 0xAF, 0x93, 0x80, 0xD6, 0x19, 0x31, 0x9A, 0x98, 0x45, 0xF9,
+    0x74, 0x30, 0x99, 0x56, 0x29, 0xF3, 0xFA, 0x33, 0x6A, 0xBB, 0x70, 0x58, 0x53, 0x0E, 0x17, 0x27,
+    0xDD, 0x3D, 0xE8, 0x07, 0x85, 0x2A, 0xCB, 0x33, 0x60, 0x23, 0xB0, 0xE9, 0x60, 0x7C, 0xF1, 0x47,
+    0x69, 0xE1, 0x69, 0x57, 0x3E, 0x8C, 0x49, 0x30, 0xA3, 0x7A, 0xD6, 0x79, 0x1F, 0xF9, 0xCF, 0x1C,
+    0xE1, 0x56, 0xF1, 0x92, 0xC0, 0x66, 0xC7, 0x67, 0xF0, 0xC6, 0x78, 0x6A, 0x48, 0x26, 0xD4, 0xE9,
+    0xFA, 0x50, 0x8B, 0xC4, 0xB1, 0x19, 0x96, 0x1F, 0x0C, 0x67, 0x0A, 0xB0, 0x4B, 0x75, 0x1C, 0xBA,
+    0x86, 0x42, 0xE3, 0x2E, 0x0C, 0xF8, 0xFC, 0x19, 0x66, 0x7B, 0x51, 0xDB, 0x3E, 0xBB, 0xA2, 0xC0,
+    0xBF, 0x31, 0x9A, 0x8A, 0x3E, 0x4F, 0x24, 0xA0, 0xD3, 0xDA, 0x15, 0x35, 0x91, 0x10, 0x3F, 0x1B,
+    0x40, 0x9A, 0x79, 0xB7, 0xE4, 0x8B, 0x9E, 0xBB, 0xD8, 0x98, 0x31, 0x8C, 0x69, 0xDE, 0x25, 0xFD,
+    0x0E, 0x87, 0xC3, 0xD9, 0x8C, 0xAD, 0xC0, 0x95, 0x19, 0x15, 0x18, 0xE1, 0xBD, 0xB1, 0x4F, 0xD4,
+    0x94, 0x09, 0x3B, 0xD5, 0x07, 0xC1, 0x72, 0xEE, 0x33, 0xA2, 0x9E, 0xAA, 0x05, 0x4E, 0xD3, 0xD3,
+    0x43, 0x43, 0xB9, 0xE6, 0xBE, 0xCF, 0xE8, 0xE4, 0x00, 0x11, 0x5D, 0xA2, 0x97, 0xAE, 0x1F, 0x3C,
+    0x3C, 0x0F, 0xA5, 0x06, 0xE5, 0xF8, 0xDE, 0x94, 0x00, 0xA0, 0x99, 0xD2, 0x4C, 0x13, 0x05, 0x09,
+    0xB8, 0x08, 0x61, 0x3A, 0x67, 0xBB, 0x77, 0xA8, 0x69, 0xA3, 0x8F, 0xF4, 0xF2, 0x2A, 0x6A, 0x88,
+    0x9E, 0xFD, 0x81, 0xF1, 0x7B, 0xA7, 0xFA, 0x15, 0xCF, 0x32, 0x04, 0x22, 0xD3, 0x62, 0x4C, 0xF4,
+    0x65, 0x76, 0x5C, 0x85, 0x5E, 0x98, 0x18, 0x6A, 0xF8, 0x95, 0xC1, 0x2A, 0x8E, 0xFF, 0xCD, 0x48,
+    0x8E, 0x58, 0xE6, 0xCA, 0x8A, 0x8E, 0xA2, 0x0D, 0x33, 0x35, 0xA0, 0xD3, 0xC6, 0x28, 0x72, 0x63,
+    0xB4, 0xCB, 0x0A, 0xB1, 0x47, 0xF8, 0xFC, 0xF1, 0xC3, 0x7A, 0xAD, 0x56, 0x51, 0x4D, 0xE5, 0x53,
+    0xB1, 0x3F, 0xC4, 0x2C, 0x7E, 0x93, 0xEB, 0x71, 0x91, 0x06, 0x7C, 0xC7, 0x4E, 0x1F, 0xC0, 0x3C,
+    0x70, 0x7C, 0x54, 0x7A, 0xA7, 0x46, 0x92, 0x33, 0x3C, 0x99, 0x32, 0x07, 0xAE, 0x7F, 0xD9, 0xF0,
+    0xEE, 0x4E, 0x26, 0xEE, 0xD7, 0x67, 0xCD, 0xE6, 0x47, 0xD1, 0x1C, 0x17, 0x71, 0x68, 0xAA, 0x07,
+    0xA4, 0xF4, 0xD0, 0x87, 0xA3, 0x65, 0x2D, 0xA8, 0x3A, 0x06, 0x7B, 0x23, 0x6C, 0xA7, 0xD3, 0x4B,
+    0xE3, 0x46, 0x6C, 0x31, 0x5B, 0x4F, 0x8F, 0xBF, 0xEB, 0x17, 0x68, 0x05, 0xF3, 0x3D, 0xD9, 0xA1,
+    0x7B, 0x05, 0x7E, 0x05, 0x14, 0xEF, 0x00, 0xE2, 0xF6, 0xD3, 0xF1, 0x4C, 0x60, 0xC9, 0x71, 0xBD,
+    0x8B, 0x47, 0x84, 0x24, 0x99, 0x94, 0x99, 0x03, 0xB7, 0xE7, 0x1E, 0x8A, 0x56, 0xE0, 0xCB, 0xD8,
+    0x12, 0x73, 0x08, 0x3D, 0x31, 0xCF, 0xE2, 0x46, 0xBF, 0x16, 0x62, 0x13, 0xA3, 0x3B, 0x62, 0x2A,
+    0x6C, 0xF4, 0x77, 0x90, 0x04, 0x7A, 0x95, 0x2C, 0x61, 0xD0, 0xA4, 0x84, 0x3F, 0x32, 0x48, 0xBA,
+    0xE5, 0xCD, 0x39, 0xF5, 0x5D, 0x5A, 0x3E, 0x0A, 0x4C, 0xBF, 0x0A, 0xEC, 0xCF, 0x0B, 0xF2, 0xEA,
+    0x38, 0x17, 0x36, 0xDB, 0xD6, 0x2D, 0x48, 0x78, 0xBB, 0x20, 0x5F, 0x5F, 0xDF, 0x63, 0x6D, 0xF5,
+    0x3D, 0x74, 0xA8, 0xE1, 0xE4, 0x4C, 0x87, 0x65, 0x78, 0x1B, 0x5B, 0xC6, 0xEE, 0x37, 0x69, 0x39,
+    0x8C, 0xD6, 0x3C, 0x24, 0x6B, 0xFE, 0x4A, 0xC9, 0x13, 0xF8, 0x33, 0x2C, 0xDB, 0xA3, 0x7A, 0xE3,
+    0x6C, 0x76, 0x18, 0x01, 0x62, 0x95, 0x67, 0x4A, 0xB5, 0xE7, 0xF4, 0xD7, 0x63, 0x74, 0x2F, 0xE0,
+    0x57, 0x3B, 0x3C, 0x33, 0xC6, 0x06, 0x03, 0xD7, 0x93, 0x0F, 0x8D, 0xDD, 0x57, 0xC3, 0x0C, 0x50,
+    0xBC, 0x08, 0xF6, 0x98, 0xA1, 0x04, 0x1D, 0xC8, 0x46, 0x02, 0x2E, 0x2D, 0x3D, 0xF1, 0xCD, 0x4B,
+    0x9B, 0x3F, 0x0C, 0xBC, 0xD3, 0x2F, 0x87, 0xE7, 0x50, 0xA1, 0x7B, 0x94, 0xC5, 0xCD, 0xEC, 0xE9,
+    0x29, 0xE7, 0x6C, 0xD4, 0xC1, 0x18, 0xA4, 0xCA, 0x4F, 0x00, 0x4E, 0xF9, 0x36, 0x89, 0xFD, 0x07,
+    0x47, 0xE6, 0xD5, 0xB7, 0xAA, 0x34, 0x7C, 0x16, 0x7B, 0xCB, 0x49, 0x92, 0xF2, 0x03, 0x66, 0x8E,
+    0xEF, 0x11, 0xFC, 0x8F, 0x26, 0xA5, 0x78, 0x9A, 0x4B, 0x29, 0xC7, 0x98, 0x15, 0xA1, 0x35, 0x58,
+    0x0C, 0xD5, 0xF8, 0x6F, 0x50, 0x1C, 0xDC, 0x41, 0x20, 0xCC, 0x2A, 0x42, 0xE1, 0xEF, 0x28, 0x22,
+    0x67, 0x89, 0x71, 0x5B, 0x9B, 0xBA, 0x92, 0xED, 0x1C, 0xB6, 0x9C, 0x89, 0xD4, 0x00, 0x21, 0xD3,
+    0xF1, 0xD9, 0x3E, 0x9B, 0x55, 0x71, 0xF7, 0x75, 0x26, 0x5A, 0x13, 0x65, 0xBF, 0x6E, 0x46, 0x90,
+    0x85, 0x7B, 0xD7, 0xD4, 0xDC, 0x90, 0x23, 0x4C, 0x83, 0x12, 0x87, 0x7D, 0x8D, 0xF2, 0x39, 0x4E,
+    0x9A, 0xA0, 0x4A, 0xDE, 0xAB, 0xCA, 0xA7, 0xCB, 0xBD, 0x1A, 0xA5, 0x3F, 0x54, 0x12, 0x92, 0x6F,
+    0xEF, 0x37, 0x88, 0xDD, 0x52, 0xDB, 0xD0, 0x8F, 0xEA, 0xCD, 0x88, 0x69, 0x8C, 0x44, 0x6A, 0xF3,
+    0xD0, 0x61, 0x8B, 0x20, 0x91, 0x17, 0x32, 0x32, 0xBE, 0x39, 0x42, 0xE7, 0x1C, 0x3E, 0x8A, 0x02,
+    0x58, 0x95, 0x76, 0x45, 0x3A, 0x06, 0x28, 0xE0, 0x7A, 0x47, 0x23, 0x87, 0xB1, 0x5F, 0xF0, 0xE1,
+    0x2D, 0x18, 0xA4, 0x9B, 0xE7, 0x90, 0xB3, 0xFC, 0x96, 0x2D, 0xAA, 0x04, 0x72, 0x39, 0xCA, 0xF6,
+    0x8B, 0xFE, 0x5D, 0xF8, 0xAA, 0xFF, 0xBE, 0x94, 0xE3, 0xEF, 0xF2, 0x74, 0x22, 0xD4, 0x8C, 0x82,
+    0x2C, 0x73, 0x8B, 0xB8, 0x39, 0x35, 0xCF, 0xCB, 0x48, 0xE8, 0xAC, 0x05, 0x49, 0xEE, 0x08, 0x30,
+    0xFF, 0x99, 0x48, 0xE1, 0x66, 0xDD, 0x01, 0xD9, 0x39, 0x22, 0xDE, 0x2C, 0x1C, 0x47, 0x08, 0xA3,
+    0x97, 0xFE, 0x02, 0x8C, 0x6B, 0x9E, 0xBF, 0xC4, 0x46, 0xAB, 0x94, 0x6D, 0x86, 0xC2, 0x45, 0x95,
+    0xB9, 0x1D, 0x15, 0x89, 0xA9, 0x76, 0x7A, 0xDD, 0x11, 0xDC, 0x54, 0x4E, 0x37, 0x96, 0x1E, 0x37,
+    0xE2, 0xB4, 0xE0, 0xD8, 0xB6, 0xBC, 0xF8, 0xA4, 0x47, 0xC5, 0x6E, 0x33, 0x8F, 0xC2, 0x5C, 0x3B,
+    0x8E, 0x51, 0x01, 0x10, 0xF1, 0x08, 0x10, 0xD8, 0x47, 0x38, 0xF4, 0x28, 0x22, 0x0E, 0x21, 0x96,
+    0x8B, 0x89, 0xA6, 0x43, 0x6B, 0xDA, 0xBC, 0xD5, 0xDC, 0x74, 0x74, 0xC6, 0x64, 0xCA, 0x6A, 0x42,
+    0x7C, 0x24, 0x80, 0x40, 0x1F, 0x82, 0x19, 0x25, 0xB7, 0x97, 0x40, 0x78, 0x16, 0x18, 0x71, 0x5C,
+    0x44, 0xCD, 0x1B, 0x9F, 0xC9, 0xE0, 0xA6, 0x3F, 0xF4, 0xAA, 0x2B, 0x4E, 0xC2, 0x12, 0x24, 0x3F,
+    0x98, 0xAD, 0x54, 0x84, 0xAF, 0x72, 0xA9, 0xBF, 0x61, 0x85, 0xA1, 0x95, 0xD8, 0xC1, 0x72, 0x4B,
+    0x02, 0x21, 0x38, 0x7E, 0x29, 0xA8, 0x90, 0xBA, 0x9A, 0xF9, 0x4D, 0xB4, 0xFC, 0xAC, 0xB8, 0x27,
+    0x77, 0xA0, 0xBE, 0x1E, 0x45, 0xFE, 0x2B, 0x49, 0x8E, 0x48, 0x66, 0xD5, 0x97, 0x1B, 0x21, 0x65,
+    0x4F, 0xA5, 0x7E, 0xF8, 0x7E, 0x89, 0xB6, 0x1B, 0x4F, 0xB1, 0x2E, 0xC2, 0x84, 0x50, 0xB6, 0xC7,
+    0xD5, 0xBC, 0xEE, 0x86, 0xBE, 0xB7, 0x27, 0xDB, 0xE8, 0xF3, 0x49, 0x02, 0xBF, 0xB1, 0x33, 0x71,
+    0x5D, 0xA3, 0x3D, 0x28, 0x7E, 0x24, 0x76, 0x0E, 0x29, 0xAA, 0x65, 0xC8, 0x0B, 0xD2, 0xE1, 0xF1,
+    0x36, 0x03, 0x2C, 0x28, 0x92, 0x3A, 0x42, 0x5A, 0xF8, 0x20, 0xEE, 0x43, 0xB6, 0x56, 0x12, 0xA9,
+    0x2B, 0x8A, 0xC5, 0x5D, 0x7B, 0x77, 0x76, 0xC3, 0x9B, 0x80, 0xD9, 0x30, 0x7F, 0xE5, 0x0F, 0x2B,
+    0x6A, 0x87, 0x29, 0xEF, 0x51, 0xED, 0x8C, 0x27, 0x2D, 0xD3, 0x9E, 0xEC, 0x4D, 0x3A, 0xDA, 0x65,
+    0xB6, 0x17, 0xD1, 0x73, 0xEE, 0xE7, 0x94, 0x07, 0x12, 0x79, 0x9F, 0xF4, 0xA0, 0x0C, 0x7F, 0x95,
+    0xBB, 0x28, 0xF9, 0xE3, 0x5F, 0x46, 0xB5, 0xC6, 0x0C, 0x4A, 0x18, 0xCB, 0x79, 0xA6, 0x90, 0x36,
+    0xC5, 0xF7, 0x08, 0x36, 0xD2, 0xE7, 0x73, 0x21, 0x59, 0x8F, 0xF5, 0xC8, 0x89, 0xB1, 0x09, 0x11,
+    0x03, 0xCD, 0xA4, 0xB7, 0x64, 0x04, 0x4A, 0xF4, 0x69, 0x06, 0x89, 0x66, 0x9E, 0xB1, 0x96, 0x1C,
+    0x55, 0x22, 0x3F, 0x70, 0xBE, 0x72, 0x3D, 0x7C, 0xBC, 0x18, 0x8F, 0xEF, 0x69, 0x91, 0x76, 0x75,
+    0x21, 0x20, 0x01, 0xAB, 0x44, 0x60, 0x13, 0x6A, 0xBC, 0xB5, 0x0B, 0x95, 0x3E, 0xE4, 0xA3, 0x4E,
+    0x18, 0xD6, 0xBC, 0x51, 0x3C, 0xE2, 0x3D, 0x71, 0x70, 0xFB, 0xBF, 0xAD, 0x5F, 0x57, 0xB6, 0x6E,
+    0x9F, 0xBE, 0x70, 0x69, 0x53, 0xEE, 0x34, 0x53, 0x9D, 0xE5, 0xBD, 0x51, 0x9D, 0x1D, 0xEA, 0xBC,
+    0xD8, 0x89, 0x98, 0xC1, 0x26, 0xCF, 0x0F, 0x65, 0x71, 0xFE, 0x3B, 0x89, 0x9B, 0x5E, 0xAF, 0x6C,
+    0xFD, 0xB2, 0x53, 0x88, 0x42, 0x7C, 0xFB, 0x87, 0x49, 0x69, 0x4D, 0x7D, 0xC9, 0x76, 0xA7, 0x84,
+    0x10, 0xFF, 0xF8, 0x63, 0x64, 0xB1, 0xF2, 0x7D, 0x72, 0x79, 0xD8, 0xF1, 0x8B, 0xB6, 0xA3, 0x80,
+    0xEF, 0x15, 0x92, 0x40, 0xBE, 0x01, 0x05, 0xCB, 0xA8, 0x07, 0x0C, 0xE0, 0xEE, 0x8F, 0xEA, 0xF6,
+    0x62, 0x9B, 0x4C, 0x89, 0xC4, 0x0D, 0xBC, 0x55, 0x32, 0x91, 0xCC, 0x68, 0xD7, 0x40, 0x54, 0x13,
+    0x1D, 0xD9, 0x96, 0x49, 0xB6, 0x63, 0xCB, 0xF3, 0x3E, 0x4C, 0xA1, 0xE3, 0xDA, 0xD1, 0x7C, 0x88,
+    0x2D, 0xB5, 0xED, 0x6F, 0x9D, 0x85, 0x91, 0x3A, 0x5B, 0x80, 0xBB, 0xB8, 0x3B, 0x7E, 0xD2, 0x4B,
+    0xE1, 0xDF, 0x2A, 0x32, 0x5B, 0x2C, 0xED, 0xB4, 0x39, 0xD2, 0x46, 0xB9, 0x3F, 0x4F, 0x98, 0xB5,
+    0xB7, 0xB7, 0x16, 0xE9, 0xB1, 0x2A, 0xD5, 0x3A, 0x1B, 0xC1, 0xC4, 0xA4, 0xEB, 0x15, 0x86, 0x86,
+    0x2E, 0x51, 0xA6, 0xCE, 0x9D, 0xEB, 0x47, 0x15, 0x7F, 0x37, 0x1B, 0x3E, 0x26, 0xED, 0x17, 0xE4,
+    0x23, 0xE2, 0x7E, 0xDA, 0x03, 0xC8, 0x94, 0xE0, 0x50, 0x6C, 0x8C, 0x68, 0xCE, 0x04, 0x24, 0x7F,
+    0x67, 0x0D, 0x2F, 0x77, 0xF7, 0x07, 0x75, 0x33, 0xFE, 0x4C, 0x1B, 0x2C, 0x53, 0x19, 0x47, 0xFA,
+    0x4E, 0x1F, 0x5D, 0x2E, 0x80, 0x2E, 0x9E, 0xE5, 0xA6, 0x4E, 0x41, 0x45, 0x8C, 0x63, 0xA4, 0x4C,
+    0x5E, 0x19, 0x04, 0x51, 0x6A, 0xAF, 0x6E, 0x4F, 0xBB, 0xA8, 0xAB, 0x87, 0xD4, 0xD7, 0x99, 0x59,
+    0x77, 0x54, 0x0E, 0x10, 0xE8, 0x7B, 0xC5, 0x7B, 0x6D, 0x13, 0xA8, 0x58, 0xB7, 0x67, 0xD6, 0x23,
+    0xF1, 0x97, 0xC6, 0xB1, 0xFE, 0x83, 0xE8, 0xBB, 0xC1, 0xD2, 0x26, 0x83, 0xDD, 0x8E, 0x86, 0x4F,
+    0x69, 0xE5, 0xC4, 0x72, 0x56, 0x98, 0x0A, 0xB1, 0x58, 0x03, 0x4E, 0x14, 0xCD, 0x25, 0x65, 0xEF,
+    0x31, 0xD0, 0x68, 0x45, 0x9C, 0x42, 0x84, 0xB8, 0xC9, 0x8F, 0xB0, 0xF8, 0xF1, 0xD2, 0x45, 0x75,
+    0xD3, 0x4F, 0x13, 0x52, 0xD3, 0x8F, 0xF3, 0x8A, 0x3F, 0x73, 0xF0, 0x56, 0x24, 0x1B, 0x77, 0xFC,
+    0xE4, 0xCC, 0x42, 0x57, 0x8F, 0xF8, 0xE8, 0x4C, 0x53, 0x5F, 0x22, 0x35, 0xDD, 0x6E, 0x33, 0x11,
+    0xC8, 0xB2, 0xEB, 0xFF, 0x9B, 0x0F, 0xC7, 0x20, 0xED, 0x6F, 0x70, 0xC8, 0x8D, 0x1E, 0xDE, 0x2F,
+    0x0E, 0x19, 0x50, 0xA2, 0xF1, 0x4F, 0x90, 0x56, 0x07, 0x63, 0x0A, 0x8D, 0xE2, 0x6E, 0xAE, 0x95,
+    0x68, 0xCA, 0xEA, 0x78, 0x0C, 0xB1, 0xA4, 0x30, 0x14, 0x77, 0x48, 0x0C, 0x51, 0xD9, 0xE5, 0x30,
+    0x7C, 0xCE, 0x77, 0xBA, 0xC7, 0x34, 0x9D, 0x25, 0x4D, 0xCF, 0x21, 0xE2, 0xCF, 0x50, 0xBA, 0x2A,
+    0x32, 0xC7, 0x66, 0x07, 0xBA, 0x46, 0xE6, 0x69, 0xDE, 0x46, 0xDF, 0x03, 0x28, 0x51, 0xFE, 0x11,
+    0x1C, 0x33, 0xBC, 0x4F, 0xD4, 0x2E, 0xC3, 0x7A, 0xED, 0x2A, 0xCE, 0xCA, 0x34, 0xE8, 0x4F, 0x65,
+    0x8E, 0xF3, 0x77, 0x05, 0x67, 0xFB, 0xD5, 0x1D, 0x5C, 0x94, 0xB5, 0x27, 0xA9, 0x61, 0xF7, 0x99,
+    0x15, 0x77, 0x2B, 0xA0, 0xB1, 0xB4, 0x3B, 0x72, 0x33, 0x67, 0xA7, 0x70, 0xFB, 0x60, 0x72, 0x04,
+    0xC4, 0x88, 0x4C, 0xA5, 0x1C, 0xEF, 0x17, 0x66, 0x74, 0xAE, 0xBC, 0x01, 0xC3, 0x2F, 0x0D, 0xD6,
+    0x12, 0xDF, 0x4F, 0x2C, 0x63, 0xC1, 0x79, 0xF8, 0x50, 0xC9, 0x52, 0x34, 0xA0, 0x6E, 0x73, 0xBA,
+    0x5A, 0x31, 0x22, 0xF3, 0xC5, 0x98, 0xB0, 0x18, 0xD8, 0x7B, 0x2B, 0x06, 0x47, 0x9D, 0x50, 0xE6,
+    0x16, 0xBF, 0x59, 0xC9, 0x34, 0xF0, 0x51, 0x58, 0x60, 0xD8, 0xEE, 0x83, 0xC8, 0x8B, 0x1E, 0x92,
+    0x8F, 0xF0, 0xDF, 0x12, 0x61, 0xCC, 0x69, 0x21, 0x68, 0xE8, 0x78, 0xB8, 0xF2, 0xF0, 0xDE, 0xE7,
+    0xAB, 0x8A, 0xA4, 0x38, 0x32, 0x06, 0xAE, 0xCD, 0x53, 0x92, 0xE4, 0x9B, 0x2C, 0xC1, 0x63, 0x30,
+    0x29, 0xB5, 0x12, 0x21, 0x99, 0xCA, 0x99, 0x94, 0x92, 0x71, 0xFB, 0x0A, 0x31, 0xEF, 0xBF, 0xE2,
+    0x52, 0x2B, 0xA5, 0xCE, 0x16, 0x5D, 0x15, 0x4A, 0x25, 0xCF, 0x74, 0x96, 0x9A, 0x95, 0x21, 0x2C,
+    0xEA, 0xB7, 0xA1, 0xAE, 0xD4, 0x15, 0x29, 0x38, 0xF9, 0x7B, 0x6C, 0xD7, 0x3A, 0x52, 0xFD, 0x60,
+    0xA2, 0xD0, 0xEE, 0xA5, 0xDF, 0x4C, 0xC6, 0xBF, 0x30, 0x82, 0x20, 0xB6, 0x73, 0x58, 0xC8, 0x7B,
+    0xA8, 0xEA, 0x01, 0x9B, 0xEA, 0x02, 0x89, 0xD0, 0x83, 0x71, 0x14, 0x98, 0xB0, 0x6E, 0x5B, 0x80,
+    0xB4, 0xBA, 0x4D, 0xC5, 0x95, 0x77, 0x5A, 0x44, 0x56, 0x74, 0x12, 0x48, 0xBC, 0xAE, 0x92, 0xCF,
+    0x5A, 0xF9, 0x62, 0xE8, 0x72, 0xA5, 0x72, 0x5B, 0x58, 0xC6, 0x14, 0x29, 0xF1, 0xC4, 0xD6, 0xC6,
+    0x75, 0x71, 0x9C, 0xC4, 0x7D, 0xC5, 0x93, 0x26, 0xA2, 0x9B, 0x1C, 0x30, 0xE8, 0x41, 0xC7, 0x03,
+    0x66, 0x98, 0x2C, 0x10, 0x34, 0x6A, 0x0E, 0xC2, 0x35, 0x53, 0xAA, 0x17, 0x3E, 0xF4, 0xCB, 0x9C,
+    0xC4, 0x1E, 0xB4, 0x79, 0x0B, 0xA0, 0x41, 0x4B, 0xC6, 0xB4, 0xAC, 0x5F, 0xDA, 0x48, 0x01, 0x0D,
+    0xBF, 0xDF, 0x6A, 0x0E, 0x42, 0x16, 0xFC, 0x97, 0x58, 0x98, 0x04, 0xDA, 0x46, 0x1E, 0x37, 0x55,
+    0x77, 0x2A, 0xB8, 0x58, 0x6B, 0x9E, 0x55, 0x2E, 0xF6, 0x52, 0x17, 0x38, 0xE1, 0xA7, 0xD9, 0xA0,
+    0x08, 0xF3, 0x3E, 0x0B, 0xE4, 0x10, 0x37, 0x2A, 0x16, 0x54, 0x63, 0x1E, 0x5A, 0x43, 0xC7, 0xDE,
+    0xA3, 0xE9, 0x3B, 0x85, 0x3A, 0xFB, 0x03, 0xE9, 0xDE, 0xD9, 0x1C, 0xDD, 0x9B, 0x56, 0x4F, 0x70,
+    0x77, 0xDD, 0xF3, 0xBA, 0x0F, 0xA4, 0x0F, 0x12, 0x5A, 0x1C, 0xF4, 0x32, 0xE8, 0x58, 0x6C, 0x23,
+    0xC5, 0x46, 0x2E, 0x1C, 0xCA, 0xE0, 0x99, 0x27, 0x77, 0xC8, 0x14, 0xD3, 0x34, 0xA4, 0xEA, 0xDD,
+    0x76, 0x3C, 0x91, 0x39, 0x96, 0x2A, 0xEE, 0x63, 0x05, 0x6A, 0x2D, 0x65, 0x48, 0x88, 0xE6, 0x9D,
+    0x26, 0xE3, 0x95, 0xD6, 0xFC, 0x86, 0xC8, 0x41, 0xB5, 0x14, 0x99, 0x2C, 0x35, 0x8C, 0xBD, 0xA8,
+    0x28, 0x1D, 0xF7, 0x74, 0x00, 0x36, 0xCA, 0xE8, 0xBB, 0x28, 0x35, 0x03, 0x10, 0x23, 0xEC, 0x82,
+    0x4C, 0x32, 0x59, 0xAB, 0x6B, 0x01, 0x2B, 0x42, 0xEB, 0x67, 0x4D, 0x49, 0x80, 0x47, 0x7C, 0xD0,
+    0xFE, 0x48, 0xB5, 0xC8, 0xB3, 0xF3, 0x06, 0x37, 0x13, 0x65, 0xF1, 0x53, 0x9C, 0x24, 0x00, 0x29,
+    0x41, 0x8E, 0x97, 0xE7, 0x47, 0x21, 0xF8, 0xB6, 0xEF, 0xC1, 0x08, 0xAC, 0x8B, 0xF3, 0xDF, 0xD1,
+    0x9B, 0xED, 0x16, 0xEA, 0x5C, 0x3C, 0x39, 0xF6, 0xB9, 0x0F, 0x0D, 0xC1, 0x0C, 0x79, 0xB4, 0xFA,
+    0xEC, 0x7F, 0xD2, 0xE0, 0x80, 0xEC, 0xF1, 0x88, 0xBE, 0x68, 0xA8, 0xD1, 0x38, 0xB5, 0xFE, 0xB5,
+    0xED, 0x1A, 0xB1, 0x8D, 0xBC, 0x50, 0x9B, 0xA5, 0x40, 0x45, 0xB4, 0x94, 0x25, 0xF8, 0xA5, 0xEB,
+    0x88, 0x00, 0xC8, 0xCA, 0xBA, 0x86, 0xF6, 0xB6, 0xDA, 0xC0, 0xF3, 0x42, 0xDA, 0xE4, 0x16, 0xB1,
+    0x3A, 0xC1, 0xAB, 0x29, 0xF8, 0xD2, 0xCF, 0xB6, 0x24, 0xBD, 0xE9, 0xA7, 0x18, 0xA7, 0xED, 0x80,
+    0x0B, 0x0A, 0x91, 0xD7, 0x8C, 0xC9, 0x60, 0x5F, 0x73, 0xBE, 0x7C, 0x12, 0x26, 0xED, 0xC5, 0xA4,
+    0x55, 0x83, 0x55, 0x93, 0x74, 0xF7, 0x1B, 0x05, 0x8B, 0xBA, 0x88, 0x1D, 0x42, 0x9A, 0x15, 0x78,
+    0x9F, 0xE9, 0x62, 0x95, 0x65, 0xD5, 0x16, 0x02, 0x1F, 0xCA, 0x13, 0xA8, 0x52, 0x84, 0xBF, 0xAD,
+    0xE5, 0xDD, 0xDB, 0x18, 0xB5, 0x37, 0x8D, 0x70, 0x5E, 0xF9, 0xE3, 0xC2, 0x33, 0x1F, 0xCC, 0x97,
+    0x52, 0x35, 0x13, 0xD9, 0xD0, 0x29, 0x44, 0x0B, 0xD8, 0xBD, 0xB2, 0x93, 0x6C, 0x2C, 0xAC, 0x7B,
+    0x14, 0x94, 0x67, 0xCC, 0x65, 0x5E, 0x78, 0x53, 0x82, 0x72, 0xFE, 0xFB, 0xD9, 0x04, 0x5F, 0x90,
+    0x6C, 0xB0, 0xFB, 0x80, 0x6C, 0x7D, 0x0B, 0x62, 0x8B, 0x7B, 0x73, 0x7D, 0x1F, 0x6B, 0x93, 0x7D,
+    0x07, 0x66, 0x98, 0xBB, 0xB2, 0x49, 0xB3, 0x34, 0x10, 0xBB, 0x23, 0x2B, 0x14, 0xA0, 0xB4, 0x4A,
+    0xC1, 0x56, 0x7B, 0x47, 0xD4, 0x49, 0x97, 0x4D, 0x69, 0x9C, 0xFC, 0x7C, 0xF2, 0x87, 0xF4, 0x8B,
+    0xA4, 0xD6, 0xF8, 0xAE, 0x3B, 0x8F, 0x9A, 0x5B, 0x90, 0x29, 0x9C, 0xD9, 0xE2, 0xA9, 0xA2, 0x60,
+    0x52, 0x4A, 0x1F, 0xE5, 0x6E, 0x7C, 0x49, 0xEC, 0x83, 0xA8, 0x0E, 0x79, 0x5B, 0x0A, 0x1F, 0x53,
+    0xDB, 0x6C, 0xEF, 0x78, 0x2D, 0x52, 0xBA, 0x00, 0x3A, 0x49, 0xB2, 0xB1, 0x56, 0x1C, 0x3B, 0x7E,
+    0x99, 0x9C, 0x20, 0xB7, 0xC7, 0x9E, 0x8B, 0x8C, 0x88, 0xF2, 0x15, 0xFF, 0x4F, 0x06, 0xF4, 0x1B,
+    0x6F, 0x02, 0x1E, 0x3A, 0x29, 0xA0, 0x7B, 0xFA, 0x2C, 0x26, 0x58, 0xE3, 0x75, 0x5F, 0xB8, 0x94,
+    0x27, 0x70, 0xF6, 0xA5, 0x79, 0x51, 0x0F, 0x72, 0x52, 0x81, 0xDC, 0xDC, 0x74, 0x93, 0xAF, 0xB4,
+    0xB5, 0x9F, 0xF2, 0x03, 0x4F, 0x79, 0x0A, 0xC5, 0xB9, 0xC7, 0x3E, 0x12, 0x53, 0x3A, 0x63, 0x6A,
+    0x8A, 0x27, 0xB6, 0x9D, 0x4C, 0x84, 0x87, 0x92, 0xBF, 0x7D, 0x49, 0x52, 0xAF, 0x10, 0xCD, 0x6C,
+    0x58, 0xC5, 0xF0, 0xFE, 0x59, 0x5C, 0xA8, 0x5A, 0xDE, 0x0E, 0x19, 0x23, 0x3F, 0x01, 0x87, 0xFD,
+    0x95, 0xA8, 0x61, 0x90, 0x06, 0x49, 0x77, 0xD8, 0xAD, 0xC4, 0x5D, 0x72, 0x65, 0x5D, 0x2A, 0x48,
+    0x70, 0xE1, 0x37, 0x2C, 0x20, 0x50, 0x24, 0xC4, 0xE7, 0x74, 0x91, 0x30, 0x91, 0x0E, 0xA3, 0x8B,
+    0x73, 0x6C, 0x31, 0xE1, 0xAF, 0xC7, 0x8C, 0x37, 0xF8, 0x22, 0x71, 0x36, 0xCA, 0xE0, 0xE1, 0x41,
+    0xF6, 0x74, 0x26, 0x17, 0x08, 0xC2, 0xD9, 0xB5, 0xCE, 0x4A, 0x67, 0x17, 0xC2, 0x54, 0xA0, 0x1F,
+    0x22, 0xFF, 0x8D, 0xB6, 0x60, 0x26, 0x7B, 0x7B, 0x05, 0x0D, 0x69, 0xAE, 0x6F, 0x09, 0x78, 0x9D,
+    0xD0, 0x2C, 0x59, 0xB1, 0xE7, 0xAB, 0x9F, 0x5F, 0x0C, 0xB7, 0xB4, 0x98, 0x47, 0x85, 0x28, 0x24,
+    0x74, 0x05, 0x79, 0xC8, 0x37, 0xDB, 0x2D, 0x71, 0xBA, 0x70, 0x24, 0x1D, 0xC6, 0x4C, 0x23, 0xF6,
+    0xFE, 0xE5, 0x47, 0x33, 0xA2, 0xAE, 0x44, 0xB1, 0x64, 0x5D, 0xAB, 0xA3, 0xD5, 0xF1, 0x91, 0x12,
+    0xA1, 0x12, 0x42, 0xFC, 0xF5, 0xE7, 0x15, 0x57, 0x1F, 0x3F, 0x08, 0x7F, 0xD4, 0x5D, 0x0B, 0x97,
+    0x43, 0x0B, 0xF3, 0x36, 0x54, 0xF6, 0x0A, 0x54, 0xE4, 0x77, 0xBE, 0xDF, 0x8A, 0xCA, 0xC2, 0x43,
+    0x5F, 0x4A, 0x32, 0xBC, 0x9A, 0x20, 0x27, 0xB3, 0xB9, 0x2F, 0xA7, 0x92, 0x8E, 0xDD, 0x12, 0x15,
+    0x27, 0x5A, 0x0D, 0xD6, 0x5E, 0xC7, 0xDE, 0xFB, 0x78, 0xE6, 0x63, 0x5E, 0x07, 0x35, 0xC7, 0xAE,
+    0x04, 0xC0, 0x14, 0xDB, 0x26, 0x45, 0x4D, 0x57, 0x91, 0x4A, 0xB5, 0xDE, 0xF8, 0x40, 0xE1, 0xE4,
+    0x6C, 0x32, 0xCC, 0x37, 0x44, 0x34, 0x05, 0xC8, 0xC3, 0x49, 0x28, 0xFA, 0xED, 0x93, 0x08, 0x10,
+    0xA8, 0x8B, 0x00, 0x8C, 0x4D, 0xF5, 0x23, 0xB1, 0x47, 0x2E, 0x2E, 0x6B, 0xC8, 0x18, 0x89, 0x86,
+    0x59, 0xBA, 0xC7, 0x3F, 0x1C, 0xD5, 0x24, 0x35, 0xBC, 0x37, 0x46, 0x7F, 0xB3, 0x7E, 0xEF, 0x35,
+    0xA9, 0x1C, 0x2D, 0x8F, 0x10, 0x11, 0x07, 0x8B, 0x5C, 0x1C, 0x4C, 0x42, 0xC6, 0xE6, 0x17, 0x32,
+    0xF1, 0xBF, 0x61, 0x7A, 0x75, 0x3E, 0x02, 0x58, 0xE1, 0x6B, 0x59, 0x1E, 0xFF, 0x16, 0xC8, 0x65,
+    0xAF, 0xF1, 0xB1, 0x14, 0x86, 0x84, 0xC1, 0x03, 0x7A, 0x75, 0x7B, 0x9E, 0x6B, 0xD2, 0x4C, 0x39,
+    0xD0, 0x01, 0x71, 0xB7, 0xFA, 0x36, 0x78, 0x59, 0xB5, 0xF0, 0x63, 0xF1, 0x24, 0xD1, 0x10, 0x37,
+    0x92, 0xF6, 0x0F, 0x58, 0x7A, 0xC7, 0xCE, 0xB5, 0xC9, 0x79, 0x1C, 0x38, 0x36, 0x07, 0x34, 0x99,
+    0xCE, 0xC4, 0x97, 0x98, 0x7C, 0xA0, 0xA7, 0xD0, 0x04, 0x2B, 0x5F, 0x10, 0xC9, 0xE8, 0x7A, 0xF6,
+    0x5C, 0xFC, 0xAC, 0xF4, 0x6F, 0x2E, 0x6B, 0xB7, 0xE8, 0xC5, 0x26, 0xC5, 0xB1, 0x38, 0x8E, 0x5B,
+    0x81, 0x90, 0x1C, 0x38, 0xB8, 0x8F, 0xD0, 0x82, 0x1B, 0xF0, 0x4A, 0x0C, 0x46, 0x8B, 0xED, 0x49,
+    0x21, 0xD9, 0x6D, 0x17, 0x29, 0xA1, 0xBB, 0x59, 0xDE, 0x98, 0x24, 0xDF, 0xAE, 0x07, 0xC5, 0x92,
+    0xD2, 0xC9, 0x92, 0x00, 0x8F, 0xB0, 0xB0, 0x36, 0x58, 0xFA, 0xB8, 0xB0, 0x43, 0x17, 0xB0, 0xA3,
+    0x3B, 0xAF, 0x39, 0xB8, 0x31, 0x8A, 0x38, 0xBF, 0xD2, 0xEE, 0x06, 0x0B, 0xB6, 0x99, 0x00, 0x41,
+    0xF5, 0x72, 0x9A, 0x9C, 0x1F, 0xBA, 0xFB, 0x22, 0xB3, 0xA5, 0x8A, 0x11, 0x7B, 0xF2, 0x53, 0xEB,
+    0x90, 0x60, 0x72, 0x3C, 0xC3, 0x56, 0xAC, 0xBD, 0xE2, 0xFA, 0xBF, 0x37, 0xB8, 0x9F, 0xDD, 0x4E,
+    0xF1, 0x05, 0x9E, 0x65, 0x3B, 0x45, 0x89, 0xA5, 0xD3, 0xA3, 0xBA, 0xD4, 0x1C, 0xCA, 0x0C, 0xCE,
+    0xDC, 0x5C, 0x66, 0xFE, 0x4B, 0x44, 0x1A, 0xC9, 0xB0, 0x52, 0x02, 0xCD, 0x47, 0x89, 0x90, 0x2E,
+    0xA4, 0x3F, 0xEC, 0x90, 0xCD, 0x84, 0xF3, 0x58, 0x6B, 0x24, 0xBA, 0x03, 0xBC, 0x57, 0x1B, 0xA2,
+    0xAC, 0xF2, 0x80, 0x0F, 0x26, 0x04, 0x59, 0xA2, 0x74, 0x07, 0x03, 0xFD, 0xC4, 0x57, 0x29, 0xCF,
+    0x90, 0xF7, 0xD3, 0x58, 0x4A, 0x71, 0x69, 0x7C, 0x7F, 0x52, 0x77, 0x1B, 0x0D, 0xFF, 0x0A, 0x59,
+    0x80, 0x4E, 0x3F, 0xE8, 0x82, 0xB6, 0xA5, 0x68, 0x9C, 0x62, 0x3A, 0x6C, 0x71, 0x3A, 0xCA, 0x23,
+    0x6E, 0x03, 0xB1, 0x50, 0x32, 0x13, 0x27, 0x81, 0xCB, 0x68, 0x42, 0x7D, 0x32, 0x23, 0x4F, 0x85,
+    0x39, 0x76, 0x8C, 0x8F, 0xB0, 0x73, 0xD3, 0xED, 0x56, 0xF0, 0xC6, 0x66, 0x01, 0x13, 0xB4, 0x13,
+    0x95, 0x8E, 0x49, 0x22, 0x4F, 0x5D, 0xFF, 0xDB, 0xAE, 0x50, 0x71, 0x6E, 0xC2, 0xA2, 0xA7, 0x70,
+    0xEE, 0xDB, 0xB5, 0x18, 0x1E, 0x4C, 0x0F, 0x57, 0xC7, 0x4E, 0x46, 0xDD, 0x78, 0x5F, 0x1A, 0xEE,
+    0x02, 0xAC, 0x80, 0xE4, 0xA8, 0x38, 0x67, 0xAD, 0x5C, 0xF7, 0x00, 0xC5, 0xCA, 0x0B, 0x52, 0x49,
+    0x94, 0x43, 0x97, 0x90, 0x46, 0xF5, 0x1A, 0xA5, 0x21, 0x7E, 0x05, 0xAC, 0xF1, 0x97, 0x66, 0x42,
+    0xFB, 0x5D, 0x4F, 0x71, 0x4B, 0x8E, 0x3E, 0xC3, 0x9E, 0x14, 0xF7, 0xAD, 0xDE, 0x34, 0xEB, 0x9C,
+    0x06, 0xB1, 0x8A, 0xE2, 0x9D, 0xA6, 0x25, 0xFD, 0x1B, 0x69, 0xDF, 0x41, 0x60, 0xBF, 0xA4, 0x04,
+    0x5C, 0xF7, 0x76, 0xFD, 0x22, 0x30, 0x0C, 0x63, 0xDB, 0xAD, 0x42, 0xA8, 0x0A, 0x97, 0xE7, 0xF0,
+    0x57, 0x9D, 0x17, 0x6B, 0x37, 0x5D, 0x35, 0xC9, 0x5F, 0xAC, 0xF6, 0xB8, 0x89, 0x41, 0xB0, 0x6F,
+    0x49, 0xA8, 0x47, 0x61, 0xB1, 0x63, 0x65, 0x40, 0x07, 0xD8, 0xC5, 0x5A, 0x5D, 0x1D, 0x82, 0x7F,
+    0xCC, 0x6A, 0xF2, 0xA1, 0x36, 0x3C, 0xC0, 0x51, 0x6E, 0xD3, 0x4B, 0x36, 0xE0, 0x07, 0xCE, 0xA3,
+    0x9B, 0xB1, 0x13, 0x04, 0x32, 0x87, 0x75, 0x4A, 0x16, 0x34, 0xB4, 0x75, 0x0F, 0x75, 0x33, 0x7C,
+    0xEC, 0x02, 0x35, 0xA9, 0x49, 0x39, 0xF6, 0x24, 0x03, 0x73, 0xCE, 0x54, 0x45, 0x02, 0x6C, 0x0A,
+    0x53, 0x2B, 0x73, 0x38, 0x3C, 0x81, 0x56, 0xA7, 0xBB, 0xF2, 0x73, 0x0F, 0xC7, 0xB7, 0x0E, 0xAA,
+    0x45, 0x62, 0xA6, 0x29, 0x8C, 0xC9, 0x0D, 0x45, 0x0E, 0xBD, 0xDB, 0xD8, 0x71, 0x5C, 0xD7, 0x18,
+    0xFC, 0xB0, 0x61, 0x89, 0xA2, 0x22, 0xF4, 0xF5, 0x48, 0x38, 0xE8, 0x7F, 0x17, 0x5C, 0x82, 0xF6,
+    0x2D, 0x1F, 0x28, 0x85, 0xD9, 0xB7, 0x16, 0xA4, 0x52, 0x6F, 0x3A, 0xF1, 0xEE, 0xA7, 0x2D, 0x99,
+    0x71, 0xAD, 0xAA, 0x15, 0x24, 0xD8, 0x86, 0x1D, 0x78, 0x90, 0x0B, 0x4C, 0x4E, 0x78, 0xC1, 0xC2,
+    0xD7, 0xED, 0xE6, 0xB4, 0xF0, 0xAC, 0x2A, 0xFD, 0xE6, 0x75, 0xBA, 0xCA, 0x0C, 0xAD, 0xD6, 0x3D,
+    0x38, 0x4D, 0x1F, 0xE9, 0x7D, 0x87, 0xA8, 0xCA, 0x13, 0x1A, 0xFA, 0x72, 0x53, 0x8E, 0xB2, 0x2F,
+    0xE3, 0xAD, 0xAA, 0x8E, 0x7A, 0xBA, 0x6A, 0xBC, 0x2C, 0x8E, 0xBA, 0xD5, 0x0B, 0x3E, 0x2F, 0x4D,
+    0xB3, 0xC4, 0xF6, 0x6F, 0x01, 0xEF, 0x90, 0x60, 0xC9, 0x3D, 0xD2, 0x93, 0x45, 0x03, 0xCB, 0x65,
+    0x11, 0xE1, 0xAD, 0x7A, 0x90, 0xCE, 0xFA, 0x41, 0x05, 0x45, 0x55, 0x10, 0xE9, 0x44, 0xBF, 0x59,
+    0x58, 0xC2, 0x71, 0xDB, 0x00, 0xBA, 0x0C, 0x32, 0x08, 0xF9, 0xB1, 0x58, 0xFA, 0xE6, 0x45, 0xFD,
+    0x0B, 0xBC, 0x23, 0xB7, 0x82, 0xE1, 0x89, 0x3A, 0x1F, 0xA1, 0xDA, 0xD2, 0x27, 0x7A, 0x0C, 0x18,
+    0xA1, 0x1D, 0x02, 0xD0, 0x59, 0xEE, 0xA8, 0x42, 0xF4, 0x67, 0x02, 0x0A, 0xC1, 0xB0, 0xC2, 0x3E,
+    0x8E, 0x86, 0xAD, 0xB5, 0x3B, 0x78, 0x05, 0xBE, 0x51, 0x12, 0xBF, 0x50, 0x58, 0xBD, 0xF3, 0x94,
+    0xFB, 0x02, 0x04, 0x38, 0x5F, 0xFD, 0xDC, 0x7D, 0xCB, 0xDA, 0x26, 0x36, 0x79, 0x5C, 0x89, 0x52,
+    0xB8, 0xF8, 0x96, 0x4B, 0xA9, 0x49, 0x43, 0xB5, 0x32, 0x22, 0x40, 0x27, 0x67, 0xFE, 0x46, 0xB9,
+    0x0B, 0x17, 0x75, 0x4B, 0xEB, 0x08, 0xA1, 0xDE, 0xC6, 0x7E, 0xD5, 0xAF, 0x4A, 0x69, 0xAA, 0x8C,
+    0xA1, 0x74, 0x33, 0x54, 0x33, 0x47, 0x62, 0x00, 0xE8, 0x63, 0x76, 0x4C, 0xE7, 0x76, 0xEE, 0x78,
+    0x5A, 0xB8, 0x44, 0x4A, 0x8F, 0x0D, 0xD7, 0x32, 0xC4, 0xB9, 0xB0, 0x1A, 0xF9, 0x58, 0x8F, 0x9E,
+    0x06, 0x9F, 0x87, 0x9D, 0x29, 0x1E, 0xBF, 0xA5, 0xFD, 0xA6, 0xCD, 0xF9, 0xD8, 0x6D, 0x01, 0xCC,
+    0x0F, 0xF6, 0x52, 0xCB, 0xFA, 0xE0, 0xA5, 0x2D, 0xCC, 0xB9, 0xA0, 0xB1, 0x9D, 0xD3, 0x09, 0x24,
+    0x34, 0xD7, 0x01, 0x15, 0x3D, 0xEB, 0x0F, 0x07, 0xAC, 0x3A, 0x94, 0xCC, 0xAA, 0x52, 0x1E, 0xBD,
+    0x4C, 0x49, 0xCD, 0x22, 0x85, 0x89, 0x47, 0x27, 0x21, 0x4E, 0x96, 0x41, 0x94, 0x6F, 0xFF, 0x2E,
+    0x69, 0x3A, 0x6B, 0xA7, 0x74, 0xBA, 0x9B, 0xEB, 0x25, 0x5E, 0xA9, 0x5A, 0xE0, 0x66, 0x59, 0xF6,
+    0x18, 0x5B, 0x77, 0xDF, 0x8E, 0x56, 0x67, 0x52, 0x2C, 0xDA, 0x0C, 0xB0, 0xF2, 0xF8, 0xB9, 0xE2,
+    0x80, 0xB4, 0x2A, 0x6E, 0xFF, 0x81, 0xC2, 0x72, 0x7C, 0xEE, 0x71, 0xC7, 0x06, 0xF5, 0x61, 0xAC,
+    0xFC, 0x77, 0x84, 0xD4, 0xEB, 0x41, 0x95, 0x7F, 0xEE, 0xD0, 0xDD, 0x91, 0x20, 0xAE, 0xF9, 0xBE,
+    0xF8, 0x30, 0xF3, 0x25, 0x57, 0xA4, 0x1D, 0xDB, 0x0F, 0xD3, 0x5A, 0xA7, 0x93, 0x1B, 0x83, 0x4B,
+    0x62, 0xD4, 0x4C, 0xA1, 0xD6, 0x34, 0x0D, 0xBC, 0x36, 0x00, 0x35, 0x65, 0x61, 0x14, 0x48, 0x03,
+    0x4B, 0xB5, 0xBB, 0xFA, 0x5D, 0xB0, 0x2D, 0xCA, 0x8E, 0x54, 0x2A, 0xBA, 0x77, 0xA4, 0xE4, 0x94,
+    0x31, 0x21, 0x0B, 0xDB, 0x04, 0xA2, 0x6B, 0xEB, 0x80, 0xF2, 0x71, 0xD9, 0x2E, 0xDA, 0x8C, 0x61,
+    0xA5, 0x79, 0x48, 0x7F, 0x70, 0xFB, 0x04, 0xF5, 0xB8, 0xA0, 0xCD, 0x1D, 0xB0, 0xBF, 0x62, 0x29,
+    0xC1, 0xAB, 0xB1, 0xA1, 0xD8, 0x6E, 0x48, 0xC7, 0x0B, 0x20, 0x1A, 0xF6, 0xD6, 0xB2, 0x37, 0xD2,
+    0xA3, 0xCC, 0x84, 0x33, 0xBD, 0x90, 0xFE, 0x23, 0x10, 0x9A, 0x41, 0x0A, 0xBA, 0xB3, 0xE6, 0x75,
+    0x62, 0x7D, 0x91, 0x82, 0x1C, 0x45, 0xBB, 0x24, 0xD3, 0x67, 0xDA, 0xB2, 0xA5, 0xE5, 0x0F, 0xDF,
+    0x0B, 0x58, 0xDA, 0x25, 0xEB, 0x02, 0x66, 0xE1, 0x5C, 0xEA, 0x3E, 0x6B, 0x32, 0xFF, 0xFA, 0x8A,
+    0x6F, 0x91, 0x23, 0x3E, 0x52, 0xD5, 0x84, 0x30, 0xA4, 0x15, 0xB5, 0x04, 0xCC, 0xCE, 0x10, 0x9F,
+    0x04, 0xD2, 0x53, 0x94, 0xB9, 0x01, 0x71, 0x0D, 0xA2, 0xA0, 0xCB, 0x8F, 0x9C, 0xA3, 0x49, 0x6C,
+    0x2A, 0x3E, 0x88, 0xC3, 0x39, 0x05, 0x99, 0x57, 0xAE, 0xEA, 0x38, 0x78, 0xF9, 0x4C, 0x49, 0x1D,
+    0xCE, 0x32, 0x10, 0x4A, 0x10, 0x24, 0x5D, 0x16, 0xBE, 0x82, 0x40, 0x28, 0xC5, 0xC4, 0xC9, 0x4E,
+    0xE0, 0xF9, 0x68, 0xB8, 0x83, 0x68, 0xAC, 0x2F, 0x74, 0xB1, 0x9B, 0x52, 0xFC, 0x0D, 0x31, 0xBB,
+    0xF2, 0xB0, 0x24, 0x94, 0x78, 0x8C, 0x39, 0xEC, 0xA7, 0xDE, 0x3F, 0xF4, 0xC7, 0xC8, 0x4A, 0x3B,
+    0x37, 0x42, 0x41, 0x46, 0x4B, 0x5D, 0x53, 0x6C, 0x45, 0xB2, 0x2A, 0x6E, 0x6A, 0x4A, 0x8F, 0xDD,
+    0x56, 0x1E, 0xAA, 0xB2, 0x41, 0x60, 0xDC, 0xE7, 0x45, 0x86, 0xFD, 0xE2, 0xCE, 0xD9, 0x9B, 0x98,
+    0x39, 0x4E, 0xBE, 0x2B, 0x89, 0x2E, 0xEF, 0xCB, 0xE4, 0x4D, 0xCD, 0x00, 0x0A, 0x8E, 0x69, 0xAD,
+    0x36, 0x0A, 0xBB, 0xCC, 0x5E, 0x8F, 0x5D, 0x12, 0x30, 0x6E, 0xEF, 0xAE, 0x4E, 0xAD, 0xFE, 0xF8,
+    0x3D, 0x71, 0x61, 0x75, 0x37, 0x5B, 0x61, 0xC7, 0x1B, 0x38, 0xFB, 0x16, 0x19, 0xD7, 0x82, 0x5F,
+    0x98, 0x4E, 0xDF, 0x7E, 0xAD, 0x24, 0x38, 0x6E, 0xCF, 0xA6, 0xD0, 0x93, 0xBE, 0x70, 0x16, 0x1C,
+    0x01, 0x29, 0xA9, 0x67, 0xD9, 0x08, 0x22, 0x48, 0xDD, 0x1E, 0x82, 0x13, 0xB7, 0xA7, 0xFD, 0x74,
+    0xAE, 0xA2, 0xE4, 0xEA, 0x60, 0xB8, 0xD1, 0x43, 0xDA, 0x35, 0xFF, 0x76, 0xF8, 0xF5, 0x91, 0x5F,
+    0xB7, 0xEF, 0x21, 0x81, 0xA1, 0x8B, 0x88, 0xE7, 0x4E, 0xA4, 0x12, 0xDC, 0x3C, 0x35, 0xA8, 0x9D,
+    0x27, 0x78, 0x1F, 0x48, 0xE7, 0x54, 0x4C, 0x98, 0x7B, 0x13, 0x1F, 0x42, 0xD4, 0x36, 0x55, 0xDB,
+    0x96, 0x74, 0xE4, 0xDA, 0xF2, 0xE3, 0xCC, 0xC1, 0xC8, 0x23, 0x4D, 0x90, 0x51, 0x77, 0x0B, 0xA3,
+    0x4D, 0x0C, 0xDD, 0x19, 0x87, 0x13, 0x15, 0xDB, 0x4F, 0x39, 0x8B, 0x48, 0x25, 0x85, 0x3B, 0x02,
+    0x1E, 0x73, 0x83, 0xEF, 0xBD, 0x5A, 0x13, 0x06, 0xAD, 0xAB, 0x90, 0xD9, 0x9F, 0xBC, 0x59, 0xE7,
+    0x0A, 0xA8, 0xB6, 0xEF, 0xAD, 0xB5, 0x37, 0x7B, 0x9D, 0xAA, 0xAC, 0x9C, 0xC7, 0x0F, 0x7B, 0x34,
+    0x78, 0x83, 0x51, 0xCB, 0x5B, 0xD3, 0xFE, 0x14, 0x0E, 0xB1, 0x31, 0xAB, 0x78, 0x9F, 0xDE, 0x3F,
+    0xDF, 0x05, 0x96, 0xA4, 0xA3, 0x44, 0x3B, 0x5F, 0x20, 0x80, 0x5C, 0xE5, 0x02, 0xFF, 0xD2, 0xD3,
+    0xB9, 0x0A, 0xFD, 0x39, 0x97, 0x39, 0x68, 0x43, 0x2E, 0x73, 0x18, 0x29, 0xFC, 0x9B, 0x2D, 0x03,
+    0x4B, 0x93, 0xD0, 0x57, 0x82, 0x82, 0x14, 0x4C, 0xD3, 0x87, 0x21, 0x39, 0x9E, 0x2B, 0x15, 0x6C,
+    0xCE, 0xB6, 0xB4, 0x69, 0x17, 0xE9, 0xD5, 0xA0, 0x67, 0xED, 0x47, 0xAF, 0xAE, 0xFD, 0xBC, 0xA6,
+    0xAA, 0xC3, 0xEA, 0x86, 0xF5, 0x5E, 0x2A, 0xA9, 0x41, 0xF9, 0x4D, 0x70, 0x77, 0x43, 0xBF, 0x31,
+    0xCC, 0x02, 0x06, 0x31, 0xCB, 0x9C, 0x47, 0xD6, 0xAF, 0x79, 0x5B, 0xE3, 0x0B, 0xA9, 0xCB, 0xBF,
+    0x42, 0xC4, 0x3E, 0xC2, 0x13, 0x3D, 0x5B, 0x5C, 0x23, 0x82, 0xF3, 0x57, 0x08, 0xA7, 0x0A, 0x06,
+    0x73, 0xC3, 0x13, 0x86, 0xE0, 0x24, 0xAC, 0x45, 0xA6, 0x93, 0x2D, 0x69, 0xA4, 0x13, 0x28, 0x18,
+    0x7D, 0x92, 0xFB, 0x51, 0x3F, 0x9B, 0x62, 0xFD, 0x51, 0xA9, 0xDA, 0xFC, 0x4A, 0xA0, 0x9D, 0xFC,
+    0x15, 0xE1, 0xFA, 0x19, 0x08, 0xD3, 0xB7, 0xE3, 0x1F, 0xA5, 0x53, 0xA1, 0xFE, 0xFF, 0xA5, 0xF3,
+    0x28, 0x9D, 0x26, 0x12, 0xED, 0xD2, 0x3C, 0xFA, 0x7E, 0x7C, 0x20, 0x8D, 0x9D, 0x4E, 0xD8, 0x6A,
+    0xBD, 0xEE, 0xF8, 0x31, 0x29, 0xDF, 0x36, 0xC7, 0x2B, 0x5F, 0x45, 0xB7, 0x9B, 0xAE, 0x33, 0x95,
+    0xE3, 0xE3, 0x9F, 0x0C, 0x9C, 0xEB, 0xCE, 0xD3, 0xF2, 0x05, 0x3D, 0xDC, 0x0A, 0xD5, 0x7C, 0xF8,
+    0x4A, 0xDA, 0xEB, 0xA9, 0x47, 0x90, 0xA1, 0x2B, 0x3E, 0xE3, 0x46, 0xFE, 0x44, 0xE4, 0x90, 0x55,
+    0xD7, 0x3C, 0x36, 0xAF, 0xCE, 0x42, 0x1C, 0xC8, 0xD7, 0xF2, 0xAB, 0x02, 0x4E, 0x6F, 0x3F, 0xA5,
+    0x71, 0x9B, 0xB4, 0x67, 0x65, 0x17, 0x06, 0x4C, 0x7A, 0x0E, 0xF5, 0x22, 0x46, 0x11, 0x55, 0x21,
+    0xD8, 0x27, 0x16, 0x1D, 0xB4, 0xF1, 0xA8, 0x5B, 0x9D, 0xA4, 0x4B, 0xD6, 0xEC, 0xC7, 0x20, 0x37,
+    0x93, 0x20, 0x40, 0x12, 0x88, 0x9A, 0xE9, 0xDA, 0x63, 0x1A, 0xA4, 0xA6, 0xE1, 0x3E, 0x04, 0xE2,
+    0x9C, 0x74, 0xDF, 0x7C, 0x4C, 0x34, 0xED, 0x58, 0xAC, 0x6B, 0x55, 0x85, 0x9A, 0xC6, 0x9E, 0x3F,
+    0x00, 0x2F, 0x2E, 0x03, 0xED, 0x48, 0xDD, 0xC2, 0x49, 0xF5, 0x2B, 0x64, 0x76, 0xD7, 0xF5, 0x2F,
+    0xC3, 0xE0, 0xE8, 0x56, 0x4D, 0xD4, 0x64, 0x1B, 0xBB, 0xD3, 0x1B, 0x21, 0x1F, 0x01, 0x4C, 0x32,
+    0xD2, 0xCC, 0xFD, 0xF5, 0x38, 0x99, 0xBC, 0x40, 0x05, 0xE2, 0x02, 0xCB, 0x28, 0x92, 0xE5, 0x5D,
+    0xFF, 0x2A, 0xBC, 0xFF, 0x98, 0x01, 0x7C, 0xEF, 0x04, 0x36, 0x50, 0xFC, 0x61, 0x35, 0xC6, 0xC1,
+    0xB2, 0x1B, 0xCD, 0x8C, 0x38, 0x42, 0xBD, 0x8F, 0x84, 0x06, 0xBE, 0x4C, 0x3F, 0xBE, 0xF0, 0xA2,
+    0x0A, 0x92, 0x4E, 0xD4, 0x87, 0x7E, 0x8A, 0x11, 0x0B, 0x75, 0xF6, 0x5A, 0xBD, 0x3B, 0xB5, 0x9B,
+    0xFF, 0x39, 0x5E, 0x7E, 0x3C, 0xA1, 0xBD, 0x76, 0xAF, 0xCB, 0x1B, 0xA5, 0x48, 0x35, 0x83, 0x89,
+    0xCF, 0xB4, 0x18, 0x37, 0xFB, 0x95, 0x34, 0x4F, 0x39, 0x29, 0x17, 0x9C, 0xBB, 0xDC, 0xF7, 0x68,
+    0x1B, 0xFB, 0x95, 0x42, 0xED, 0xA6, 0xFE, 0xE2, 0xBE, 0x06, 0xDB, 0xE1, 0x6B, 0xC9, 0x54, 0x2F,
+    0xA3, 0x75, 0x91, 0xBE, 0xE0, 0x55, 0x6B, 0xA5, 0xD8, 0x0E, 0xD0, 0xD0, 0x08, 0x64, 0xEE, 0xFC,
+    0xEE, 0x7E, 0x39, 0xAC, 0x94, 0x9C, 0x3F, 0x77, 0xF2, 0xDA, 0xF5, 0xBE, 0x9F, 0x91, 0x63, 0x68,
+    0xB6, 0xE2, 0x06, 0xAD, 0x8B, 0x1B, 0xDB, 0xE9, 0x0D, 0x87, 0x6F, 0x78, 0x6B, 0x51, 0x86, 0xE1,
+    0x44, 0x91, 0xD7, 0x62, 0x1D, 0x7F, 0x88, 0xE8, 0x2A, 0xAD, 0x19, 0x01, 0x02, 0x76, 0x05, 0x43,
+    0xBE, 0x1A, 0xB8, 0x36, 0xC2, 0x0D, 0x24, 0x90, 0x2E, 0x13, 0xCF, 0xFC, 0x0C, 0x3E, 0x18, 0x9D,
+    0xBF, 0x16, 0x1E, 0xAB, 0x22, 0x5B, 0xF8, 0x72, 0xE0, 0xDF, 0xF9, 0x51, 0x73, 0xB2, 0x54, 0x99,
+    0x32, 0x00, 0x4E, 0x06, 0x3F, 0xAA, 0x1F, 0xE5, 0x6C, 0xF0, 0x1D, 0xF5, 0xA0, 0x10, 0x2B, 0x63,
+    0x1C, 0x65, 0xAA, 0xC6, 0x8C, 0x8D, 0x7D, 0xE5, 0xA8, 0x98, 0xBD, 0x0E, 0xE4, 0xCF, 0x06, 0x28,
+    0x8A, 0xC3, 0xFB, 0x16, 0x2A, 0x29, 0xE7, 0xCA, 0xDC, 0xCC, 0xAB, 0xB3, 0xF1, 0x7B, 0x87, 0x76,
+    0xBA, 0xB3, 0xA2, 0x70, 0x47, 0x08, 0x52, 0x2F, 0x3A, 0xA6, 0x30, 0x0F, 0xA8, 0x66, 0x32, 0xC3,
+    0x0B, 0x7F, 0x19, 0x24, 0x0A, 0xE3, 0x69, 0x09, 0xD4, 0x90, 0x14, 0xE8, 0xF5, 0xD3, 0xAB, 0x7C,
+    0xB4, 0xB4, 0x2B, 0x4C, 0xB8, 0x44, 0x90, 0xCF, 0xE4, 0xB1, 0x5C, 0xEE, 0x0E, 0xC1, 0x19, 0xFF,
+    0x10, 0xC6, 0x9A, 0xD5, 0x32, 0x90, 0x69, 0x9D, 0xCF, 0xD4, 0x7B, 0x65, 0x39, 0x59, 0x19, 0x97,
+    0x30, 0xB8, 0x00, 0xD1, 0xE2, 0x82, 0x61, 0xBF, 0x9C, 0x6E, 0x05, 0x6A, 0xB4, 0x36, 0x42, 0xC2,
+    0x7A, 0xB9, 0x96, 0x6E, 0x62, 0x9C, 0x68, 0x11, 0x71, 0x87, 0x64, 0x87, 0x96, 0x80, 0x56, 0x67,
+    0xFC, 0xDB, 0x71, 0x51, 0x87, 0x4C, 0x5C, 0xFD, 0xA2, 0x90, 0xD2, 0x0E, 0x9C, 0x52, 0xD2, 0xE7,
+    0x49, 0x07, 0x56, 0x12, 0xA6, 0xD8, 0x8A, 0x1C, 0xAD, 0xAF, 0xA7, 0x20, 0x56, 0x1F, 0xD0, 0xCD,
+    0x93, 0xBE, 0x4F, 0xFB, 0x60, 0xA3, 0x10, 0xB5, 0x79, 0xB5, 0x7E, 0x79, 0xF5, 0x2F, 0x57, 0xC2,
+    0xDD, 0x23, 0x23, 0x4E, 0x91, 0xC2, 0xBD, 0x81, 0xDA, 0x48, 0x88, 0xA3, 0xDC, 0x2A, 0xF0, 0xBE,
+    0x08, 0x00, 0xE7, 0xC6, 0xA4, 0x66, 0x16, 0x30, 0x40, 0xA5, 0xF1, 0x40, 0x1C, 0x57, 0x5F, 0x1D,
+    0x96, 0x76, 0xF2, 0xE3, 0x71, 0xD4, 0x2E, 0x76, 0x90, 0x32, 0x4F, 0x2F, 0xF5, 0xED, 0x59, 0x2F,
+    0x20, 0x97, 0x7A, 0x1F, 0xE1, 0xE0, 0xE4, 0x1E, 0x93, 0xF3, 0x79, 0x8B, 0xCD, 0x0B, 0x84, 0x91,
+    0xDF, 0x35, 0x7C, 0x7F, 0xEE, 0xC9, 0x61, 0xF1, 0xFD, 0xBF, 0xFB, 0xA0, 0x09, 0x7A, 0xA1, 0xFF,
+    0xD6, 0x13, 0x14, 0xD7, 0xEB, 0x37, 0x26, 0x31, 0x98, 0x16, 0xD8, 0xA7, 0xCE, 0x6C, 0x64, 0x71,
+    0xE0, 0xE3, 0x5C, 0x33, 0x97, 0x9E, 0x1A, 0x25, 0x13, 0xBF, 0x05, 0x04, 0x0D, 0x11, 0xF3, 0x19,
+    0x20, 0x43, 0x7B, 0x7D, 0x8A, 0x5F, 0x89, 0x05, 0xAC, 0x59, 0xBC, 0xDA, 0x45, 0x57, 0x30, 0xA3,
+    0x68, 0x9F, 0x18, 0x0B, 0x9A, 0x41, 0x7E, 0x7B, 0x85, 0x8E, 0x37, 0xAE, 0x2D, 0xDE, 0x7C, 0xE8,
+    0xB5, 0x37, 0xA7, 0xB9, 0xF0, 0xA9, 0xA4, 0x55, 0x83, 0x3F, 0x8F, 0x1E, 0x01, 0x0C, 0xF9, 0x9E,
+    0x43, 0x5C, 0x60, 0x3F, 0x26, 0xE4, 0xBB, 0x8B, 0xAC, 0x61, 0xFF, 0x2F, 0x43, 0x1E, 0x6B, 0x0B,
+    0xFB, 0xC9, 0x6A, 0x8C, 0x22, 0x36, 0xC1, 0x21, 0x77, 0x44, 0xFF, 0x2C, 0xF8, 0xCF, 0x29, 0x9F,
+    0x6F, 0x3E, 0x43, 0x2B, 0xE2, 0x3F, 0x8E, 0x0F, 0xC1, 0x38, 0x2E, 0x7D, 0x25, 0x76, 0x1A, 0x10,
+    0x19, 0xEE, 0x37, 0x05, 0xEB, 0x7A, 0x4F, 0x07, 0xD8, 0x1D, 0x0F, 0xF3, 0x50, 0x43, 0x4E, 0x67,
+    0x85, 0x26, 0x16, 0xE5, 0x38, 0x3D, 0x3F, 0xEB, 0x4C, 0x87, 0x5E, 0xDE, 0x9E, 0xD2, 0x82, 0x04,
+    0x5B, 0x69, 0x12, 0xEA, 0xB4, 0x8D, 0x73, 0xE0, 0xA9, 0x1A, 0xEB, 0x19, 0x89, 0xEA, 0xBF, 0x6E,
+    0xBA, 0x6D, 0x9D, 0x2B, 0x0B, 0x6A, 0x64, 0x50, 0x9B, 0x79, 0x30, 0xB3, 0x12, 0x30, 0x89, 0x92,
+    0x0B, 0xF8, 0x88, 0x31, 0x7E, 0xB7, 0xD0, 0x2D, 0x84, 0xFD, 0x7D, 0xE0, 0x08, 0x39, 0x84, 0x45,
+    0xD2, 0x5E, 0x1F, 0x42, 0xEE, 0x2C, 0xF3, 0xE5, 0xBA, 0xB5, 0xA5, 0x50, 0xAB, 0xD2, 0xEB, 0xEB,
+    0x72, 0x9A, 0xE7, 0x18, 0x7A, 0x41, 0xFE, 0x8A, 0xBB, 0x4F, 0x0B, 0x2B, 0xB7, 0xF0, 0x12, 0x12,
+    0x58, 0xCC, 0xC1, 0x88, 0x9E, 0x20, 0xF2, 0xFA, 0x0F, 0xE5, 0x36, 0xAD, 0x64, 0x05, 0xB4, 0x1C,
+    0xA4, 0xD8, 0x60, 0x36, 0x7C, 0xD8, 0x1F, 0xED, 0xAA, 0x51, 0x60, 0x2F, 0x1F, 0x76, 0x80, 0xB9,
+    0x02, 0xAA, 0x2C, 0x14, 0x17, 0xE6, 0xD2, 0xFE, 0x26, 0xBA, 0xD2, 0xE5, 0xCB, 0x0B, 0x7D, 0xBE,
+    0xCC, 0x09, 0xD9, 0xEE, 0x8D, 0x23, 0x52, 0xFB, 0x54, 0xF4, 0x9E, 0x3B, 0x2A, 0xEA, 0x91, 0x40,
+    0x6E, 0x3B, 0x03, 0xC0, 0x82, 0x3D, 0x35, 0x72, 0xAD, 0xC5, 0xB9, 0x53, 0xA1, 0x82, 0x4E, 0xE9,
+    0xB6, 0x99, 0x16, 0xF7, 0xE4, 0x98, 0x93, 0x70, 0xAB, 0xEB, 0x91, 0xC6, 0x7E, 0x70, 0x5D, 0x47,
+    0xCF, 0x71, 0x5C, 0xCB, 0x61, 0x90, 0xDA, 0xD8, 0xF1, 0x41, 0xA5, 0x85, 0xA2, 0x4A, 0x9A, 0x15,
+    0xA3, 0x9D, 0x4A, 0xC9, 0x42, 0x9A, 0x41, 0x67, 0x68, 0x02, 0xC1, 0x8D, 0x5F, 0xD5, 0x7F, 0xDF,
+    0x8F, 0x08, 0xE9, 0x96, 0xF9, 0x8A, 0x43, 0x30, 0xA6, 0x2F, 0x46, 0x31, 0xCC, 0x73, 0x16, 0x31,
+    0xF5, 0x56, 0x19, 0x7B, 0x99, 0xC1, 0xF0, 0xA3, 0x54, 0x90, 0xFF, 0x1E, 0x81, 0xCB, 0x88, 0x50,
+    0x64, 0x9F, 0x23, 0xFC, 0xB5, 0x12, 0x24, 0xDC, 0xD2, 0x6B, 0x22, 0x5C, 0xED, 0xA3, 0xF2, 0x8B,
+    0x0E, 0xE9, 0xD4, 0x8B, 0xAF, 0x94, 0x0B, 0xA4, 0x7B, 0x25, 0x88, 0xD8, 0x4A, 0x5E, 0x33, 0x85,
+    0x5B, 0xD0, 0xD4, 0x50, 0xA4, 0xB2, 0xE5, 0x18, 0x7B, 0x7B, 0xEE, 0xCB, 0xF0, 0xDA, 0xF5, 0x18,
+    0xD8, 0x5C, 0x22, 0x0B, 0x11, 0xDE, 0x02, 0x1F, 0xF8, 0xC6, 0x0D, 0x75, 0x36, 0xCA, 0x82, 0xCE,
+    0x46, 0x31, 0x8C, 0x5E, 0x6A, 0x28, 0x3E, 0xD5, 0x3F, 0xB7, 0x16, 0x31, 0x13, 0x6A, 0x14, 0x59,
+    0x88, 0x6A, 0x55, 0x65, 0x8A, 0x21, 0xD5, 0x48, 0xD3, 0x4A, 0xD1, 0x70, 0xF4, 0x3B, 0x72, 0xC2,
+    0x8D, 0x1E, 0x28, 0xAF, 0x41, 0x7B, 0xC2, 0x0C, 0x82, 0x6C, 0x3D, 0xD9, 0x25, 0x48, 0x6C, 0xD9,
+    0x49, 0x0F, 0x8A, 0xDF, 0x27, 0x6E, 0x1E, 0x21, 0xB7, 0x65, 0x5A, 0x8F, 0x89, 0x4E, 0x3F, 0x82,
+    0x47, 0xBF, 0x7C, 0x21, 0x91, 0x75, 0x10, 0x55, 0x54, 0x21, 0x95, 0xE3, 0xDC, 0x4F, 0x12, 0x0C,
+    0x1B, 0x55, 0xC2, 0xBE, 0x85, 0x60, 0x57, 0xB3, 0x70, 0x31, 0x54, 0xD3, 0x53, 0x84, 0xB6, 0x93,
+    0xB5, 0x68, 0xC2, 0x14, 0x80, 0xC9, 0x91, 0x32, 0x87, 0x96, 0xFA, 0x20, 0x03, 0xC2, 0xBE, 0xC2,
+    0x42, 0xDC, 0x4D, 0x28, 0xC4, 0xC1, 0x95, 0x5D, 0xCF, 0x4D, 0xFE, 0xFA, 0x09, 0x43, 0x4F, 0xC2,
+    0x30, 0x65, 0xC4, 0x55, 0xDE, 0x05, 0x6C, 0x29, 0xFA, 0xDD, 0x9C, 0x17, 0x9F, 0x05, 0x89, 0xD9,
+    0xA8, 0x97, 0x46, 0x8C, 0x85, 0x81, 0xFC, 0x99, 0x72, 0x4F, 0x0A, 0xA0, 0x8F, 0xF3, 0x25, 0x89,
+    0xBA, 0xDD, 0x63, 0x53, 0x6B, 0xA7, 0x15, 0x20, 0x14, 0x92, 0x88, 0x51, 0x23, 0x82, 0xA3, 0x9D,
+    0x0D, 0xC2, 0x79, 0xB7, 0xA3, 0x18, 0x88, 0xC9, 0xE0, 0xB0, 0x56, 0x8F, 0x16, 0x16, 0x36, 0xAA,
+    0x40, 0xC9, 0x61, 0x41, 0x30, 0x82, 0x65, 0x2F, 0x81, 0x57, 0xD3, 0x86, 0x90, 0x05, 0xC4, 0x44,
+    0x04, 0x12, 0xC8, 0x1B, 0xB8, 0x4D, 0x6A, 0x06, 0x1B, 0x9F, 0xEF, 0xC0, 0xA3, 0xE9, 0x9B, 0xEA,
+    0x70, 0xC0, 0xCE, 0x73, 0x89, 0x5F, 0x6D, 0x0C, 0x9B, 0x4C, 0x3B, 0x96, 0xB2, 0x8B, 0x6B, 0xF5,
+    0x07, 0x00, 0xE4, 0x30, 0xED, 0xE0, 0xB6, 0xF0, 0xB5, 0xF8, 0x1D, 0xFB, 0xCC, 0xC9, 0x10, 0x66,
+    0x5B, 0xE0, 0x15, 0xFB, 0x1D, 0xB7, 0x5C, 0x67, 0x7F, 0x52, 0xD5, 0xA0, 0xF0, 0x9A, 0x6D, 0x37,
+    0xA7, 0x1B, 0xBD, 0x1F, 0x7B, 0xF9, 0x82, 0x11, 0x98, 0x7D, 0x27, 0x0B, 0xF5, 0x31, 0x5F, 0x20,
+    0x8D, 0x47, 0xA0, 0xB4, 0xD3, 0x59, 0x4B, 0x17, 0xF9, 0xA2, 0x38, 0x66, 0x31, 0x3F, 0x02, 0xCD,
+    0x5D, 0xBE, 0x5B, 0x06, 0x17, 0xD7, 0xEC, 0xC4, 0xD1, 0x67, 0x97, 0x49, 0xBA, 0x1D, 0xE5, 0xCD,
+    0x8E, 0xCF, 0x0D, 0xCD, 0x6B, 0xAB, 0x9A, 0xDA, 0x2F, 0x3F, 0x62, 0xDF, 0xFA, 0xE5, 0xEC, 0x50,
+    0x6D, 0x62, 0xCB, 0x0F, 0x53, 0xC7, 0x8A, 0x33, 0xF5, 0xB2, 0x8D, 0xFD, 0x85, 0x31, 0x06, 0xE3,
+    0xCE, 0x77, 0xB6, 0x8B, 0x2A, 0xC7, 0xC2, 0x72, 0xD5, 0xA9, 0x06, 0xBF, 0xAF, 0x76, 0x6F, 0xC2,
+    0x62, 0x31, 0x9A, 0x89, 0x87, 0xE7, 0x54, 0xD4, 0x8F, 0x32, 0x31, 0x40, 0xE8, 0xAF, 0x82, 0x6C,
+    0x69, 0x18, 0x19, 0x25, 0x74, 0xF0, 0xD1, 0xEB, 0x43, 0x71, 0x50, 0x20, 0xCD, 0x84, 0xE9, 0x94,
+    0x86, 0x17, 0xA0, 0xF9, 0xB8, 0x65, 0xFE, 0x48, 0x81, 0x57, 0xCE, 0x0F, 0xA7, 0xF3, 0x28, 0x3F,
+    0x02, 0x0D, 0xD9, 0x78, 0x7A, 0x2F, 0x9F, 0x36, 0xAD, 0x8D, 0x47, 0x76, 0x51, 0xA7, 0x95, 0xF2,
+    0xE3, 0x20, 0xDB, 0x57, 0x7F, 0xA9, 0x26, 0x29, 0xF1, 0x0F, 0xF7, 0xAB, 0x2F, 0x7B, 0x2F, 0xEB,
+    0x96, 0x6C, 0xFD, 0xAA, 0x25, 0x21, 0x35, 0x38, 0x89, 0xFF, 0xAE, 0xCD, 0x5F, 0xA0, 0xFE, 0x0F,
+    0x57, 0x70, 0xC0, 0x65, 0x49, 0xA6, 0x5E, 0x3F, 0xB5, 0x24, 0x8A, 0x46, 0x32, 0xA1, 0x12, 0xC0,
+    0x79, 0x0B, 0xD6, 0xE4, 0x26, 0x21, 0x90, 0x25, 0xB6, 0x81, 0xE5, 0x84, 0xB9, 0x4E, 0x78, 0xFF,
+    0x44, 0xB7, 0xDB, 0xD5, 0xE2, 0x9B, 0x46, 0xBF, 0xB9, 0x5F, 0xC5, 0x70, 0xCC, 0xD3, 0xA2, 0x77,
+    0xAE, 0xAC, 0xCE, 0x52, 0x08, 0x52, 0x34, 0x6C, 0x41, 0xDA, 0xD6, 0x03, 0x87, 0x71, 0xFB, 0xD6,
+    0x2B, 0xFC, 0x64, 0x89, 0x9F, 0x5D, 0x1C, 0x4E, 0xEE, 0x2F, 0xE5, 0xAC, 0x01, 0x31, 0x46, 0x63,
+    0x12, 0x45, 0x79, 0x41, 0x93, 0x0C, 0x1A, 0x6B, 0x3E, 0x73, 0x25, 0xCE, 0xD9, 0x35, 0x87, 0xBD,
+    0x9F, 0x30, 0xBC, 0x82, 0xA8, 0x47, 0xCE, 0x8F, 0x48, 0x77, 0x26, 0x71, 0xCB, 0x9B, 0xD3, 0x1A,
+    0x79, 0x2A, 0x29, 0x78, 0x7C, 0x6D, 0x5A, 0x72, 0x01, 0x0B, 0xE1, 0x46, 0x32, 0x65, 0x9D, 0x2B,
+    0xD4, 0xD6, 0x28, 0x1F, 0xB2, 0x23, 0xA9, 0xF6, 0x62, 0x2F, 0xCD, 0x99, 0x6C, 0x5D, 0x03, 0x5D,
+    0xA0, 0x7A, 0xC4, 0x05, 0x82, 0x71, 0xB3, 0xC3, 0x2B, 0x9B, 0xC5, 0x47, 0x22, 0x84, 0x29, 0x23,
+    0xB7, 0x7D, 0xAF, 0xFA, 0xB7, 0x00, 0x10, 0xC9, 0xAB, 0xCF, 0xD6, 0xEA, 0x24, 0xE3, 0x4A, 0x29,
+    0xDE, 0xD4, 0x93, 0x95, 0x44, 0xC5, 0xD7, 0xEC, 0xA9, 0x2C, 0x31, 0x82, 0x12, 0x7E, 0x21, 0x47,
+    0x1C, 0x5A, 0xD5, 0xA1, 0x19, 0x9A, 0x57, 0x42, 0x46, 0x70, 0x94, 0x6A, 0xC0, 0xC6, 0x66, 0xA9,
+    0x88, 0xB6, 0x52, 0x5E, 0xB8, 0xB3, 0x09, 0x84, 0xF5, 0x0B, 0xF1, 0x2E, 0x89, 0x0B, 0x01, 0xD0,
+    0x40, 0xFC, 0x97, 0xC4, 0xE4, 0xF0, 0x99, 0x1E, 0x48, 0xA5, 0x20, 0x0B, 0x4F, 0xF4, 0xA7, 0x6E,
+    0xB5, 0x78, 0xB8, 0x80, 0xFB, 0x5C, 0x51, 0x6B, 0xE3, 0x4E, 0x94, 0xF3, 0x94, 0xAC, 0xCC, 0xBB,
+    0xA4, 0x39, 0x78, 0x67, 0xF9, 0x43, 0x73, 0x63, 0x6E, 0xC0, 0x51, 0xFB, 0xEA, 0xEE, 0x85, 0x57,
+    0xD4, 0x16, 0xEB, 0xB0, 0x36, 0x1E, 0x2A, 0x80, 0x8A, 0x63, 0x7B, 0x91, 0xB0, 0x6A, 0xA7, 0xC5,
+    0x59, 0x93, 0x04, 0x1E, 0x44, 0x52, 0x02, 0xB2, 0xBB, 0xEF, 0x23, 0x07, 0x2F, 0x41, 0x93, 0x80,
+    0x4A, 0x3E, 0x2B, 0x4A, 0x83, 0x79, 0x65, 0x1E, 0x02, 0x58, 0xD5, 0x3E, 0x51, 0xFF, 0x5F, 0x8A,
+    0x3E, 0x09, 0x90, 0x02, 0xAF, 0x57, 0xCF, 0x0F, 0x30, 0x78, 0x2F, 0x0D, 0x50, 0x51, 0xA9, 0x24,
+    0xD2, 0x10, 0xB5, 0xE2, 0x3E, 0xD5, 0x53, 0xA2, 0xD9, 0xC6, 0x9C, 0xBC, 0xEB, 0x26, 0xAB, 0xEE,
+    0x3B, 0x0E, 0x26, 0x03, 0x54, 0x73, 0x0E, 0x58, 0xDA, 0x92, 0x00, 0xA7, 0x2A, 0xDC, 0xA7, 0xD2,
+    0x4B, 0x78, 0x20, 0x88, 0x5D, 0x11, 0x43, 0x15, 0x67, 0xB5, 0xC2, 0x31, 0x78, 0xD7, 0xCB, 0x5A,
+    0x1A, 0x04, 0x38, 0xAF, 0x1A, 0xDB, 0x24, 0x90, 0x5F, 0xF0, 0xB3, 0x11, 0xB9, 0x68, 0x9A, 0x8B,
+    0x1B, 0x28, 0xCA, 0x51, 0x63, 0x8C, 0xD2, 0x70, 0xA9, 0x8B, 0x42, 0x69, 0x86, 0x2E, 0x46, 0x5F,
+    0x85, 0xA7, 0x80, 0x4D, 0x70, 0x1E, 0xAE, 0x08, 0xD2, 0xFC, 0xCF, 0x5E, 0xDB, 0x41, 0x9F, 0x21,
+    0xEF, 0xA6, 0x64, 0x38, 0xE7, 0x73, 0xEF, 0xEA, 0xF9, 0x31, 0x61, 0x67, 0xEF, 0xD5, 0x21, 0x44,
+    0xD9, 0x28, 0xB0, 0x6D, 0xD6, 0x11, 0xF9, 0x28, 0x02, 0x99, 0x84, 0x11, 0x8A, 0xFB, 0x56, 0xF8,
+    0x37, 0x98, 0xDC, 0x90, 0x22, 0x13, 0xE3, 0x37, 0xBF, 0x9A, 0xD4, 0x05, 0xBF, 0x69, 0x76, 0xE1,
+    0x70, 0x90, 0x81, 0x72, 0xA5, 0x7A, 0x19, 0x6B, 0x68, 0x13, 0xF1, 0x05, 0xA4, 0xFB, 0xBA, 0x6F,
+    0x13, 0xCB, 0x15, 0xA4, 0x5D, 0x09, 0x47, 0x4A, 0xD0, 0x50, 0x34, 0x00, 0x45, 0xB8, 0xDF, 0x5E,
+    0x89, 0x02, 0x50, 0x42, 0x65, 0xDF, 0xB7, 0x46, 0x59, 0x35, 0x81, 0xD9, 0x7D, 0xB6, 0x1E, 0x84,
+    0x41, 0x08, 0xBA, 0xFA, 0x2B, 0xBB, 0x85, 0x92, 0x0A, 0x9C, 0x9F, 0x9E, 0x8F, 0xE2, 0x7A, 0xF7,
+    0x6F, 0x5D, 0x8D, 0x0B, 0xA8, 0xE1, 0x02, 0x94, 0x54, 0x76, 0xFB, 0xD0, 0x80, 0xEA, 0x66, 0x17,
+    0xE5, 0x76, 0x96, 0xF9, 0xC1, 0xB1, 0xA6, 0x7B, 0x3C, 0x7C, 0xA8, 0x0B, 0x4E, 0x28, 0x8B, 0x46,
+    0xFE, 0x0B, 0xCC, 0x57, 0x41, 0x54, 0x37, 0x49, 0x28, 0x19, 0xD8, 0x43, 0xBF, 0x59, 0x76, 0x59,
+    0x37, 0x71, 0xD5, 0x19, 0x99, 0xD2, 0xA3, 0xD8, 0x0A, 0x09, 0x58, 0xF4, 0xEE, 0xC6, 0xF4, 0x47,
+    0xD7, 0xB3, 0xB4, 0x42, 0x74, 0x71, 0x23, 0xF8, 0xE0, 0x76, 0xA1, 0x91, 0x28, 0xE8, 0xE6, 0xFD,
+    0x38, 0x13, 0x02, 0xD0, 0x07, 0x4C, 0x06, 0x1B, 0xB8, 0x18, 0xA5, 0xB3, 0x0F, 0xBF, 0x06, 0xBB,
+    0x40, 0xD7, 0xE2, 0xE1, 0x54, 0xAC, 0x3F, 0x40, 0x5E, 0x68, 0x08, 0xA6, 0xF2, 0x7B, 0xA7, 0x97,
+    0xFE, 0x05, 0x75, 0x41, 0x99, 0xBB, 0xCB, 0x2D, 0xC9, 0xE9, 0x41, 0x69, 0xA5, 0x69, 0x51, 0xC0,
+    0x85, 0xD9, 0x3D, 0x82, 0x09, 0xF8, 0x91, 0xCB, 0xE1, 0x89, 0xA6, 0xD1, 0x30, 0xBF, 0xF7, 0xFC,
+    0x5E, 0x23, 0xBB, 0x66, 0x65, 0x17, 0x2B, 0x96, 0xF2, 0xA0, 0xF3, 0xA0, 0xDA, 0xF2, 0x5B, 0x2A,
+    0xDA, 0x20, 0x25, 0x1C, 0x7B, 0x3E, 0x42, 0xEC, 0xFC, 0xA0, 0x75, 0x1C, 0xDA, 0x96, 0x37, 0x40,
+    0xF9, 0xD7, 0x6C, 0xA5, 0x2D, 0xE1, 0x9C, 0x69, 0x7D, 0xB3, 0x07, 0x8E, 0xC7, 0xE8, 0x8A, 0x24,
+    0xDF, 0x77, 0x18, 0x4C, 0xCC, 0xAE, 0x1A, 0x5F, 0xF9, 0xC4, 0x21, 0x77, 0xFA, 0x2B, 0xA7, 0x2C,
+    0xC3, 0xB4, 0x85, 0x3B, 0x2D, 0x34, 0xF7, 0x2D, 0xFA, 0xE8, 0x42, 0xDA, 0x7D, 0x4B, 0x18, 0x40,
+    0xC6, 0xC6, 0x4B, 0xE4, 0xCE, 0x64, 0x97, 0x46, 0xC1, 0xA0, 0x32, 0x1C, 0xA4, 0xBB, 0xA0, 0x6C,
+    0x49, 0xE9, 0x80, 0x46, 0x08, 0xA8, 0x1B, 0x30, 0x5E, 0x79, 0x54, 0x74, 0xE2, 0x0C, 0xC3, 0xD5,
+    0x5C, 0x27, 0xD0, 0x0C, 0x30, 0xDC, 0x24, 0x47, 0x51, 0x78, 0xF5, 0x42, 0x37, 0xE2, 0x13, 0x4D,
+    0x6B, 0x1C, 0x3B, 0x92, 0xF6, 0x70, 0xEE, 0x29, 0x04, 0xDF, 0x61, 0x68, 0x7E, 0xC9, 0xF2, 0xA8,
+    0x9B, 0x0A, 0xD3, 0xC8, 0x2E, 0x34, 0x9B, 0x35, 0xE1, 0xD4, 0x7F, 0x15, 0x1B, 0x77, 0xDE, 0xF6,
+    0x17, 0x44, 0xE8, 0xDA, 0xDF, 0x5D, 0xE1, 0xEE, 0xA2, 0x4B, 0xBE, 0x7E, 0x69, 0xFA, 0x01, 0x27,
+    0x3F, 0x2C, 0xA6, 0x59, 0x4C, 0x63, 0x68, 0x48, 0x66, 0xC9, 0x43, 0xAB, 0x2A, 0x44, 0x20, 0xC7,
+    0x04, 0x29, 0x0A, 0xA5, 0x83, 0x8C, 0xD7, 0x84, 0xE0, 0x87, 0xBB, 0x16, 0xBF, 0xC3, 0xBD, 0xC9,
+    0x84, 0x41, 0x15, 0x9A, 0xDC, 0x67, 0xD8, 0x08, 0xB1, 0x89, 0xE1, 0xDC, 0x4C, 0x66, 0xFA, 0x64,
+    0x1E, 0x21, 0xC8, 0x89, 0x1F, 0xC3, 0x74, 0x82, 0xB9, 0x88, 0x2B, 0x05, 0xA4, 0x95, 0xB2, 0x50,
+    0xE6, 0xC2, 0x85, 0xC6, 0x4B, 0xE1, 0x7E, 0xB0, 0x63, 0x29, 0x9C, 0x2E, 0x51, 0x52, 0xB8, 0xB9,
+    0xC6, 0x00, 0xE1, 0x7C, 0xA8, 0xFD, 0x41, 0x6D, 0xF0, 0x6E, 0x20, 0x53, 0xB6, 0x2E, 0x2A, 0x42,
+    0xD7, 0xDF, 0x0F, 0xA5, 0x4E, 0x77, 0xC9, 0xEF, 0xBA, 0x71, 0xA7, 0x51, 0x39, 0xB1, 0xDB, 0xF6,
+    0x81, 0x67, 0x0E, 0x87, 0x87, 0xE6, 0x47, 0x89, 0xC7, 0xF3, 0xDD, 0xB4, 0x6C, 0xA5, 0x53, 0x83,
+    0xBF, 0xD7, 0xEC, 0xBE, 0xED, 0x8A, 0xAD, 0xE2, 0x31, 0x43, 0x9E, 0x2C, 0xBE, 0xAD, 0x0F, 0x60,
+    0xA9, 0xEA, 0xB2, 0x95, 0x0B, 0xBE, 0x13, 0x3C, 0x98, 0x9C, 0xED, 0x0A, 0x04, 0x36, 0xBD, 0x7A,
+    0x9F, 0x21, 0x41, 0x17, 0xA4, 0x89, 0x01, 0x62, 0xD5, 0x3C, 0xCF, 0xF9, 0xD7, 0x68, 0x4B, 0x3A,
+    0xF4, 0x89, 0x10, 0x08, 0x10, 0x0C, 0xC5, 0x7C, 0xAD, 0x97, 0x24, 0x7C, 0xF5, 0x52, 0xB6, 0x65,
+    0xEE, 0x3F, 0x76, 0x81, 0x41, 0xDF, 0x19, 0x8C, 0x75, 0x1D, 0x8E, 0x09, 0xCA, 0x60, 0xBD, 0x29,
+    0x91, 0x68, 0x2C, 0x4C, 0x23, 0x90, 0x75, 0x27, 0x7F, 0xA5, 0x40, 0xB8, 0xAC, 0xE8, 0xFC, 0xDB,
+    0xCB, 0xDD, 0x2A, 0xFA, 0x8A, 0x76, 0x3D, 0x9D, 0xF7, 0x74, 0x16, 0x7C, 0x31, 0x6A, 0x88, 0x93,
+    0x95, 0xD6, 0x5F, 0xE8, 0xBE, 0x1B, 0x0C, 0x4D, 0x65, 0xC1, 0xF6, 0x0D, 0x8E, 0xC9, 0x71, 0x13,
+    0x61, 0x26, 0xBD, 0xB5, 0xFD, 0x16, 0xDF, 0xE1, 0x2E, 0x36, 0x8C, 0xA8, 0x51, 0xB7, 0x9B, 0xB1,
+    0x69, 0x35, 0xD1, 0xF6, 0x09, 0x3D, 0x09, 0xB7, 0xDD, 0xAC, 0x39, 0xBD, 0x3F, 0x1D, 0xA6, 0xB8,
+    0xA2, 0xE8, 0x70, 0x17, 0x9F, 0x49, 0xF9, 0x29, 0x48, 0xDF, 0xA3, 0xBF, 0x95, 0x8C, 0xD2, 0x8E,
+    0x32, 0xD1, 0xDD, 0x98, 0x49, 0xC8, 0xBC, 0xA2, 0xAD, 0x99, 0x5A, 0xB4, 0x33, 0x51, 0x3D, 0xB8,
+    0x6E, 0xA3, 0x72, 0xDD, 0xEF, 0x45, 0x51, 0xEC, 0x06, 0x8D, 0xFE, 0x15, 0xA9, 0x76, 0x69, 0xA1,
+    0xAF, 0x75, 0x1B, 0xE7, 0x8E, 0xDE, 0x4B, 0xF7, 0x49, 0xDC, 0x66, 0xAA, 0xBE, 0xDA, 0x01, 0x18,
+    0xA7, 0x2A, 0x11, 0xA3, 0x16, 0xF7, 0x29, 0x2C, 0x97, 0xCC, 0x2B, 0x54, 0xBC, 0xEF, 0x9F, 0x94,
+    0xC8, 0xA4, 0xB8, 0x87, 0x01, 0x3F, 0x0C, 0x69, 0xD5, 0xE9, 0xB9, 0x71, 0x30, 0x9B, 0xAC, 0x1B,
+    0x1F, 0xB2, 0xC0, 0x67, 0x52, 0x78, 0x91, 0xBA, 0x3F, 0x2F, 0xC3, 0x5C, 0x80, 0x39, 0x70, 0x1C,
+    0x7E, 0x07, 0x71, 0x70, 0x9D, 0x95, 0x6D, 0xE2, 0x0A, 0x5D, 0x1E, 0x19, 0x06, 0x9A, 0x85, 0xE1,
+    0x2E, 0xD5, 0xFA, 0x02, 0x2E, 0x32, 0x53, 0xAD, 0x05, 0x2F, 0xEC, 0x08, 0x7E, 0xDD, 0x71, 0x9D,
+    0x34, 0xFC, 0x9D, 0x0D, 0x44, 0x4E, 0x3E, 0x20, 0x00, 0xA8, 0x76, 0x02, 0xF8, 0xBF, 0x6B, 0x9F,
+    0x4A, 0x60, 0x99, 0xA1, 0x74, 0x4B, 0xB9, 0x91, 0x16, 0x4D, 0x41, 0xC5, 0xA1, 0x33, 0xD3, 0x90,
+    0x8A, 0x2F, 0x83, 0x92, 0x8B, 0x53, 0x1D, 0x29, 0x8F, 0x97, 0xD8, 0xA0, 0x48, 0x63, 0xB4, 0x43,
+    0x20, 0x82, 0xC7, 0xC2, 0x0A, 0x7F, 0xFB, 0x07, 0x74, 0x31, 0x54, 0x2A, 0xCB, 0xCA, 0x7E, 0xD6,
+    0x91, 0x6B, 0x82, 0x73, 0x51, 0x66, 0x7B, 0xDF, 0x63, 0x53, 0x08, 0xFC, 0x17, 0x20, 0xA9, 0x87,
+    0x1D, 0x24, 0xD0, 0x44, 0x45, 0xBC, 0x80, 0x80, 0x4B, 0x52, 0x90, 0x4E, 0xA5, 0xDF, 0xD1, 0x3F,
+    0xA9, 0xCC, 0xD7, 0xD9, 0xAD, 0x1F, 0x65, 0x63, 0xA6, 0x57, 0x85, 0x39, 0x98, 0x33, 0xE8, 0xBC,
+    0xF5, 0xE2, 0xD2, 0x4B, 0xF7, 0xEA, 0x61, 0xE3, 0xFA, 0xF3, 0x73, 0x6C, 0xA2, 0x0A, 0x26, 0xCB,
+    0x09, 0x2E, 0xC4, 0x03, 0x38, 0x97, 0x7A, 0x3A, 0xC7, 0xB0, 0x0C, 0x35, 0x6D, 0x73, 0x14, 0x70,
+    0x01, 0xF6, 0x8F, 0x67, 0xBA, 0xD9, 0x4E, 0xAF, 0xEA, 0x96, 0x3D, 0xC6, 0x7E, 0xE7, 0x2B, 0x29,
+    0x27, 0xAB, 0xFA, 0xA8, 0x08, 0xB1, 0x01, 0x20, 0xF3, 0xD1, 0x45, 0x35, 0x33, 0x56, 0x26, 0x81,
+    0x00, 0xB2, 0x41, 0x01, 0x1A, 0x71, 0x28, 0x35, 0xF4, 0x43, 0x2F, 0x48, 0x59, 0x69, 0x22, 0x5A,
+    0x89, 0x8D, 0xC7, 0x38, 0x5F, 0x12, 0x40, 0x65, 0x7B, 0x89, 0x06, 0x76, 0x74, 0x08, 0xE5, 0xFC,
+    0x83, 0x61, 0x2B, 0xAF, 0xB4, 0xE0, 0xE4, 0x51, 0x4D, 0xF7, 0x31, 0x09, 0x0A, 0xC0, 0xB9, 0x47,
+    0x23, 0xCB, 0xF7, 0x90, 0x86, 0x65, 0x27, 0xF3, 0x65, 0xBF, 0x52, 0xAF, 0x4A, 0x3E, 0xBF, 0x0C,
+    0x9E, 0xC9, 0x6D, 0x4D, 0xD6, 0x64, 0x77, 0x59, 0x2B, 0x88, 0x6B, 0xD7, 0x7E, 0xBF, 0x8F, 0x53,
+    0x48, 0xD8, 0x9E, 0x6E, 0x7E, 0x16, 0x60, 0x4C, 0xE9, 0x33, 0x83, 0x01, 0x74, 0xCD, 0x1F, 0x8B,
+    0x4F, 0x3A, 0xEA, 0xCC, 0x45, 0xEE, 0x8F, 0xEA, 0x0C, 0x40, 0x76, 0xA7, 0xDF, 0x69, 0xFE, 0xD4,
+    0xD3, 0x23, 0x93, 0x07, 0x77, 0x8D, 0xCD, 0x20, 0xE9, 0x71, 0xB7, 0xFA, 0xFB, 0x27, 0x6D, 0x0A,
+    0xBC, 0x1E, 0xFE, 0x49, 0x2B, 0x15, 0x68, 0x9B, 0x58, 0x3A, 0xA7, 0xC5, 0xB8, 0x17, 0xA3, 0xAA,
+    0xCF, 0xF7, 0x91, 0x2E, 0xF2, 0xFC, 0xA4, 0xDC, 0x50, 0xB3, 0x19, 0x5C, 0x85, 0xA2, 0x89, 0x8C,
+    0xBB, 0x9A, 0x12, 0x45, 0xC9, 0x06, 0x36, 0xA3, 0x10, 0x3F, 0x4A, 0x0E, 0x08, 0x7F, 0xF9, 0x45,
+    0x09, 0xBC, 0xD5, 0xAC, 0x56, 0x6F, 0xB4, 0xC1, 0x15, 0x4E, 0xD4, 0x55, 0xD1, 0xF4, 0x97, 0x19,
+    0x7E, 0x88, 0x4E, 0xA7, 0x95, 0x5B, 0x89, 0xF9, 0x4A, 0x7A, 0xDD, 0x69, 0xB9, 0xEF, 0xB6, 0x1D,
+    0x68, 0x98, 0xAB, 0xBE, 0xF9, 0x10, 0x12, 0x79, 0xC0, 0x2E, 0x08, 0x8B, 0xD4, 0xFE, 0xFB, 0x33,
+    0xF5, 0x17, 0x6F, 0x71, 0x71, 0xD9, 0x95, 0x08, 0xBC, 0x05, 0x71, 0x6A, 0x54, 0x99, 0x80, 0x94,
+    0x8A, 0x92, 0x2B, 0x1A, 0x52, 0x60, 0x53, 0xAC, 0xB0, 0x58, 0xE1, 0x97, 0xC6, 0xAB, 0x1A, 0x81,
+    0x89, 0xBE, 0x60, 0xB1, 0x16, 0x79, 0xED, 0x3D, 0xE5, 0x31, 0xA2, 0x35, 0x74, 0x26, 0xAE, 0xFF,
+    0xEB, 0x7D, 0x62, 0xD0, 0x08, 0x00, 0x44, 0x9C, 0xBA, 0x22, 0x1F, 0x4D, 0x12, 0x1C, 0xF6, 0xEF,
+    0x43, 0x31, 0xBA, 0x80, 0xB7, 0x21, 0x2C, 0xAA, 0x0C, 0x47, 0xAA, 0x50, 0xC9, 0xE5, 0x9B, 0x6F,
+    0xAF, 0x69, 0x92, 0xD6, 0x72, 0x73, 0xAE, 0x2D, 0x7B, 0x60, 0x91, 0x0B, 0xC5, 0x48, 0x4D, 0xE4,
+    0x1B, 0x92, 0xC5, 0x60, 0x81, 0xF5, 0x96, 0xD5, 0x19, 0x72, 0x39, 0xF6, 0xC7, 0x47, 0x81, 0x3C,
+    0x2E, 0x5D, 0xDA, 0xBE, 0xAE, 0xF0, 0x04, 0x40, 0x2C, 0x0F, 0x98, 0x91, 0x2A, 0xB3, 0x2B, 0x90,
+    0xCD, 0x31, 0x92, 0x75, 0x9A, 0x93, 0x51, 0x83, 0x74, 0xCD, 0xFE, 0x53, 0x00, 0x99, 0xAE, 0x49,
+    0x47, 0x4B, 0x4F, 0x04, 0x70, 0xEE, 0x58, 0x4D, 0x84, 0x97, 0x7C, 0x75, 0x46, 0xBC, 0x64, 0xC7,
+    0x85, 0xA9, 0x0A, 0x7D, 0x5C, 0x6C, 0x9A, 0x21, 0x0B, 0x2A, 0x16, 0xF6, 0x96, 0xE6, 0x35, 0x6B,
+    0x59, 0xB1, 0xBB, 0xF7, 0xC2, 0x24, 0x33, 0x52, 0x79, 0x55, 0x33, 0x8D, 0xE6, 0xD0, 0xD8, 0xA7,
+    0xE5, 0x18, 0x5F, 0xF3, 0xE1, 0xE4, 0x23, 0xFF, 0xBF, 0x16, 0xDC, 0xFE, 0x5F, 0x32, 0x99, 0x2B,
+    0x22, 0x1A, 0x77, 0x2A, 0xAD, 0x04, 0x07, 0x3C, 0x15, 0xBF, 0x99, 0x53, 0x9C, 0x29, 0x2B, 0x67,
+    0xAF, 0xDD, 0x51, 0x89, 0x03, 0x85, 0xFF, 0x64, 0x2E, 0x1D, 0x0B, 0x03, 0x32, 0xB9, 0x51, 0xB8,
+    0xE4, 0x9F, 0x54, 0x49, 0xC4, 0x32, 0x0F, 0x99, 0x34, 0xB3, 0x51, 0xE9, 0x2D, 0x75, 0xF3, 0xF8,
+    0x04, 0x86, 0x6B, 0x84, 0xB0, 0x97, 0x95, 0xF4, 0x38, 0x4C, 0x8C, 0x88, 0x49, 0x48, 0x9E, 0x59,
+    0x0E, 0x8B, 0xB1, 0xE1, 0x41, 0x66, 0x10, 0x94, 0x59, 0xF9, 0x6E, 0x78, 0xCC, 0x11, 0x80, 0x92,
+    0x33, 0x7E, 0x6A, 0xB8, 0xC9, 0x33, 0xE8, 0xDD, 0x1B, 0x3F, 0x74, 0x79, 0x42, 0x5C, 0x93, 0x00,
+    0x4B, 0x68, 0xDA, 0x70, 0x8A, 0xB5, 0x24, 0xFD, 0x6B, 0x14, 0xF8, 0x1A, 0x26, 0x6A, 0x21, 0x36,
+    0x7C, 0xF6, 0x49, 0x44, 0xB4, 0xA6, 0x59, 0xF3, 0x00, 0x76, 0xC5, 0x8A, 0x30, 0xF4, 0x9C, 0x13,
+    0xC9, 0xB2, 0xCE, 0xF1, 0x3F, 0xAB, 0x75, 0xD6, 0x4F, 0x36, 0xEA, 0x86, 0x12, 0x7A, 0x9A, 0x54,
+    0x68, 0xEA, 0x13, 0xF4, 0x39, 0xC1, 0xC5, 0x70, 0x22, 0x79, 0x21, 0x0D, 0x7B, 0x47, 0x02, 0x97,
+    0x14, 0xFF, 0xD2, 0xBE, 0x99, 0x84, 0x0F, 0x3E, 0xDF, 0xA5, 0x64, 0x98, 0xDF, 0xF8, 0xAA, 0xA2,
+    0xD2, 0xED, 0xE8, 0x6E, 0x41, 0xF4, 0x04, 0x3C, 0xE8, 0x39, 0x80, 0x07, 0xBA, 0x7A, 0xCF, 0x69,
+    0x32, 0xDB, 0x7B, 0x72, 0x56, 0xE4, 0x1A, 0xA9, 0x87, 0xB2, 0x32, 0x3F, 0xD9, 0xF4, 0x3F, 0x4B,
+    0x04, 0xF2, 0xE1, 0x55, 0xD0, 0xED, 0x5D, 0xD9, 0x57, 0x7A, 0x04, 0x08, 0x05, 0x68, 0x15, 0x7B,
+    0x41, 0x61, 0x73, 0x52, 0x7C, 0xC9, 0x23, 0x30, 0x7A, 0x2F, 0xA4, 0xDF, 0x53, 0xEB, 0x99, 0xAF,
+    0x28, 0x89, 0x47, 0x10, 0xC5, 0xFD, 0xE0, 0x72, 0xA3, 0x5D, 0xE1, 0x02, 0x22, 0x49, 0x25, 0xDF,
+    0x00, 0x71, 0x26, 0xE7, 0xC5, 0x16, 0x6C, 0x5F, 0x24, 0x7F, 0xBF, 0x12, 0x2E, 0x71, 0xF1, 0x54,
+    0x15, 0xE3, 0x76, 0xDA, 0x27, 0x41, 0x8E, 0xF8, 0xA0, 0xC0, 0xF9, 0x5F, 0x6D, 0x4F, 0xC5, 0x4B,
+    0x58, 0xB5, 0xAB, 0xC4, 0x40, 0xA4, 0x89, 0x32, 0x08, 0x63, 0x5F, 0x68, 0x93, 0x56, 0x1C, 0x1F,
+    0x6F, 0xDE, 0xF1, 0x63, 0x28, 0x2E, 0x88, 0x52, 0x10, 0x3C, 0xFC, 0xEF, 0x03, 0x87, 0x91, 0xA5,
+    0x22, 0x06, 0x58, 0x88, 0x4F, 0x2C, 0x0B, 0x11, 0xFC, 0x21, 0x23, 0xB8, 0x6A, 0xBD, 0x21, 0x5B,
+    0x0C, 0x59, 0x2D, 0x6C, 0x83, 0x6F, 0x7C, 0xF8, 0x4D, 0x7F, 0x62, 0xBC, 0xD1, 0x7D, 0x39, 0x6E,
+    0x78, 0xCB, 0x88, 0xF2, 0x98, 0xDC, 0xBE, 0xCE, 0x38, 0x45, 0xF5, 0xE9, 0x3F, 0x58, 0x54, 0x62,
+    0xB4, 0x15, 0xE6, 0xF7, 0xE3, 0xCA, 0x91, 0x05, 0x35, 0x8C, 0x6A, 0xE6, 0x08, 0xFC, 0x05, 0x6D,
+    0x64, 0x31, 0x4B, 0xA4, 0x61, 0x21, 0x99, 0x4D, 0x51, 0xF5, 0x98, 0x07, 0x65, 0x3F, 0xD0, 0x6A,
+    0x8F, 0xDB, 0x8B, 0xB2, 0x0E, 0x43, 0x75, 0x49, 0x5D, 0x57, 0xAF, 0x98, 0x51, 0xA8, 0x28, 0x62,
+    0x8B, 0xBA, 0x47, 0x60, 0x90, 0xCC, 0xC8, 0xC2, 0x8D, 0xA7, 0xC0, 0xD5, 0x80, 0x6D, 0x54, 0x7F,
+    0xCD, 0xC6, 0xE6, 0x08, 0x23, 0x84, 0x69, 0x79, 0x29, 0x8F, 0x47, 0xB7, 0x85, 0x78, 0x8F, 0x29,
+    0xE1, 0x53, 0x50, 0xE4, 0x1B, 0x77, 0x66, 0x10, 0x63, 0xBF, 0xA4, 0xC2, 0xDF, 0xB3, 0x2C, 0x87,
+    0x21, 0x34, 0xE4, 0xE6, 0xE4, 0x6F, 0x2F, 0x5D, 0x5E, 0x45, 0xCF, 0x31, 0x7C, 0x4A, 0x5E, 0x99,
+    0xB9, 0x81, 0xAF, 0x9C, 0xCD, 0x24, 0x6B, 0x33, 0xE6, 0x8D, 0xB8, 0xB8, 0xA0, 0xDE, 0x15, 0x41,
+    0xFA, 0xBA, 0x21, 0xFC, 0x5D, 0xD0, 0x85, 0x3E, 0xD2, 0x06, 0x43, 0x3E, 0x93, 0xD6, 0x83, 0x58,
+    0x74, 0x57, 0xE0, 0xBD, 0x11, 0x4E, 0xF4, 0x17, 0xEA, 0x1C, 0x8B, 0x22, 0xB7, 0x6E, 0x89, 0x92,
+    0xC8, 0x48, 0xF9, 0x88, 0xEA, 0x46, 0x83, 0x54, 0x76, 0x94, 0xFD, 0x58, 0xD3, 0xA7, 0xD3, 0x24,
+    0xAF, 0xC9, 0x05, 0x64, 0x76, 0xC9, 0xC5, 0xA6, 0x41, 0x2E, 0xD7, 0xAA, 0x37, 0x72, 0x7A, 0x7C,
+    0x1B, 0x69, 0xBD, 0xA4, 0xD2, 0x43, 0x9D, 0xC6, 0xE4, 0x20, 0x8F, 0x08, 0x31, 0xE7, 0x6E, 0xD4,
+    0xFB, 0x2D, 0x85, 0x3D, 0x5A, 0x21, 0xEC, 0x03, 0xB5, 0x66, 0xFE, 0xF0, 0x24, 0x2A, 0xBF, 0x32,
+    0x6D, 0x5C, 0x4D, 0x9C, 0x4B, 0x22, 0x49, 0xEC, 0x72, 0x9B, 0x9A, 0x36, 0x03, 0x91, 0x8C, 0x7C,
+    0xB9, 0xE9, 0x8D, 0x72, 0xE0, 0xB0, 0x52, 0x63, 0x2E, 0xDB, 0x9C, 0x0D, 0x55, 0x33, 0xA5, 0x17,
+    0x7A, 0x2D, 0xAF, 0x75, 0x69, 0x50, 0x7D, 0xDC, 0xEE, 0x26, 0xC6, 0xE3, 0x26, 0xF9, 0x59, 0xF9,
+    0x10, 0x42, 0x1E, 0xC7, 0x3E, 0x11, 0xCB, 0xFA, 0x4E, 0xE6, 0xAB, 0x6E, 0xA9, 0x1C, 0xD1, 0x76,
+    0x20, 0xB6, 0xD6, 0xBD, 0xD3, 0xCA, 0x9C, 0x82, 0x33, 0xB8, 0x5E, 0xED, 0xCA, 0x2C, 0x50, 0xC3,
+    0x58, 0x13, 0x7A, 0xA7, 0xF0, 0x92, 0x89, 0x04, 0xF8, 0x27, 0x98, 0xE2, 0x1C, 0xF2, 0xDA, 0xF6,
+    0x4D, 0xC0, 0x6A, 0x1C, 0xC5, 0xA5, 0x79, 0x6B, 0x84, 0x37, 0x05, 0x90, 0x6A, 0x0E, 0x2B, 0xAF,
+    0x96, 0x9E, 0x45, 0xDB, 0x79, 0xDA, 0x2F, 0x46, 0x5F, 0xE2, 0xE8, 0xA6, 0xC6, 0x00, 0xF2, 0x8F,
+    0xC2, 0xA0, 0xF9, 0x32, 0x53, 0x63, 0xF9, 0xED, 0x9C, 0x0F, 0x29, 0x8F, 0x5D, 0x6C, 0x56, 0xE9,
+    0xBF, 0x52, 0xB1, 0xB5, 0xD3, 0x8A, 0xE4, 0xE6, 0x1D, 0xB2, 0xC9, 0x0E, 0x8F, 0x28, 0xB0, 0xBF,
+    0x68, 0x91, 0x87, 0x8E, 0x30, 0x6A, 0xF6, 0x5E, 0x44, 0x81, 0x3E, 0xAA, 0xC2, 0x93, 0x9D, 0x41,
+    0xAE, 0x54, 0xF1, 0x96, 0x40, 0x30, 0x5F, 0xAD, 0x44, 0xCF, 0xB4, 0x34, 0x86, 0xE2, 0xF4, 0x97,
+    0x14, 0x21, 0x1D, 0xA5, 0x58, 0xAF, 0x7B, 0x32, 0x5D, 0x63, 0x9A, 0x9D, 0x2A, 0x7C, 0xDA, 0xAD,
+    0xD5, 0xB2, 0xA8, 0x0D, 0x8F, 0xDA, 0x44, 0xCE, 0xB6, 0xA0, 0xC3, 0x3C, 0x73, 0xC5, 0x8C, 0x9B,
+    0x62, 0x0C, 0xF2, 0x79, 0x3C, 0x78, 0xF8, 0xC3, 0xC4, 0x4B, 0xAE, 0x29, 0x5A, 0x30, 0xC9, 0xB9,
+    0x6A, 0xE4, 0x52, 0x09, 0xE1, 0x09, 0x60, 0x8B, 0x56, 0x90, 0x84, 0xE2, 0x5A, 0x07, 0x88, 0x25,
+    0x03, 0xB7, 0x5B, 0x86, 0x1E, 0x68, 0x2C, 0x25, 0x5D, 0xFE, 0xB9, 0x5A, 0xF0, 0xDC, 0x81, 0x1F,
+    0xEE, 0xF7, 0x11, 0x94, 0x67, 0x85, 0x13, 0xEC, 0x65, 0xEC, 0x83, 0x53, 0x81, 0x57, 0xEB, 0x95,
+    0xF5, 0xCE, 0xFF, 0x26, 0xDE, 0x85, 0xDD, 0x7D, 0xA3, 0xFB, 0xA2, 0xB9, 0xD9, 0x33, 0x82, 0x0D,
+    0x43, 0xC9, 0x1B, 0x72, 0x14, 0x39, 0x24, 0x57, 0x2A, 0x8E, 0x36, 0xA6, 0x86, 0xCC, 0xE8, 0x1F,
+    0x6B, 0xAD, 0x7B, 0x0E, 0x89, 0xF9, 0x1C, 0xBB, 0x6E, 0x43, 0x99, 0xD5, 0xAA, 0x59, 0xDF, 0x63,
+    0x12, 0x29, 0x56, 0xCD, 0x55, 0x56, 0xFC, 0x3E, 0xC2, 0x38, 0xD4, 0x65, 0x59, 0xE8, 0x6E, 0x31,
+    0xFE, 0xA8, 0x18, 0xAA, 0xB4, 0x4C, 0x72, 0x3C, 0xB2, 0xBD, 0xA7, 0x54, 0x8B, 0x53, 0xF8, 0xF7,
+    0xB8, 0x80, 0xCE, 0x06, 0x89, 0x5E, 0x9D, 0x19, 0x29, 0xDE, 0x73, 0x01, 0xCF, 0x0C, 0xD2, 0xF8,
+    0xE3, 0x2B, 0x3D, 0x7C, 0x84, 0xFF, 0x4D, 0xE3, 0x2E, 0x33, 0x6F, 0x47, 0x1E, 0x97, 0xB3, 0x55,
+    0x0B, 0x5C, 0xE3, 0xAB, 0x9C, 0xCB, 0x40, 0x82, 0xD6, 0xA3, 0x47, 0x8B, 0xFF, 0xB1, 0x26, 0x44,
+    0xE3, 0x7E, 0x39, 0xDB, 0xDD, 0x1B, 0x35, 0xE6, 0x6E, 0xF2, 0x48, 0x57, 0x09, 0x02, 0xB6, 0xA4,
+    0xD4, 0xB9, 0x7E, 0x20, 0x93, 0x8F, 0x59, 0xE7, 0x2D, 0x0D, 0xB8, 0x82, 0x9A, 0xA4, 0xC7, 0xB2,
+    0x2A, 0x31, 0x88, 0x52, 0x98, 0xDF, 0x4C, 0xF6, 0xD4, 0xB4, 0xD2, 0x71, 0x41, 0xAA, 0x37, 0x52,
+    0x34, 0x70, 0x51, 0x9B, 0x33, 0x2D, 0xA3, 0x71, 0x3E, 0xB4, 0xC2, 0x5B, 0xEC, 0xC4, 0xD4, 0x51,
+    0xF5, 0x8A, 0xD8, 0xB2, 0x87, 0xAE, 0x41, 0xC2, 0xBA, 0x0B, 0x43, 0xEA, 0x83, 0xD8, 0x32, 0x97,
+    0x5C, 0xCA, 0xF6, 0xBD, 0x65, 0x89, 0xF7, 0x92, 0x8E, 0xF9, 0x97, 0x7F, 0xF7, 0x17, 0x28, 0x47,
+    0x45, 0xB3, 0xEB, 0x71, 0x86, 0x16, 0x40, 0x86, 0x28, 0x43, 0x33, 0x92, 0x11, 0x06, 0xED, 0x26,
+    0x5D, 0x8F, 0x35, 0xAB, 0xA7, 0xF6, 0x6C, 0xCE, 0x29, 0x62, 0xD6, 0xBE, 0x16, 0xA3, 0x6B, 0x34,
+    0xAE, 0x40, 0xED, 0x25, 0x2A, 0xA7, 0x84, 0x1A, 0x7F, 0xB0, 0xBE, 0x2E, 0x09, 0x8A, 0x06, 0x90,
+    0x11, 0x2D, 0x54, 0x88, 0x2C, 0x23, 0x78, 0x4A, 0x79, 0x13, 0x39, 0xEA, 0xC5, 0x4F, 0x05, 0x30,
+    0x46, 0xBB, 0x38, 0xF1, 0x47, 0x36, 0xBF, 0xAF, 0xD1, 0x7E, 0x3A, 0x7B, 0x31, 0x54, 0x22, 0x2F,
+    0x3D, 0xA6, 0xAB, 0x10, 0x1A, 0x3B, 0x76, 0x9A, 0xED, 0xCC, 0xD2, 0xD3, 0x29, 0xA5, 0x90, 0xEB,
+    0x57, 0x15, 0x1D, 0xC8, 0xB6, 0xCD, 0xD0, 0x11, 0x44, 0x2C, 0x7B, 0xCF, 0x42, 0xA0, 0x76, 0xE2,
+    0x14, 0x43, 0xC0, 0xBD, 0x53, 0x22, 0x37, 0x4E, 0x83, 0xD2, 0x91, 0x47, 0xDD, 0xCB, 0x8E, 0x5A,
+    0xB0, 0xA6, 0xB0, 0x13, 0x84, 0x81, 0x6A, 0x59, 0xC4, 0xC9, 0x58, 0x1A, 0x3B, 0x41, 0x09, 0x2B,
+    0xC1, 0xCB, 0x39, 0x98, 0xE8, 0xDD, 0x1B, 0x45, 0x5F, 0xB6, 0x86, 0x6B, 0x41, 0x7C, 0x32, 0xDC,
+    0x0E, 0x03, 0xE7, 0xF3, 0xB9, 0x65, 0x8E, 0x3A, 0x69, 0x67, 0x8E, 0xE2, 0x6D, 0x6F, 0xB7, 0xA7,
+    0x2A, 0x93, 0x9D, 0xEA, 0xA7, 0x2E, 0x82, 0x88, 0x67, 0xC6, 0x91, 0x36, 0xDC, 0x93, 0x47, 0x9A,
+    0xCD, 0xF9, 0xF6, 0xFA, 0x2A, 0x3A, 0x85, 0xD1, 0x66, 0x48, 0xFC, 0x1A, 0x9E, 0x64, 0x6C, 0x20,
+    0xD4, 0x19, 0x07, 0xDA, 0xE3, 0xC3, 0x54, 0xD2, 0x45, 0xB5, 0x47, 0x10, 0x2A, 0xB4, 0x00, 0xDF,
+    0x06, 0xF6, 0xE4, 0xBF, 0x47, 0x6C, 0x61, 0xDD, 0xD7, 0x3C, 0xE2, 0x27, 0x3A, 0x4E, 0xEE, 0xCA,
+    0x07, 0x03, 0x7E, 0xFC, 0x41, 0x94, 0x3B, 0xA8, 0xD5, 0x28, 0x65, 0xBE, 0x55, 0x28, 0x69, 0x10,
+    0xF3, 0x91, 0xCE, 0xF8, 0x84, 0x65, 0x45, 0xDC, 0xB0, 0x54, 0x79, 0x1A, 0x17, 0x60, 0x61, 0xBD,
+    0xB6, 0x2C, 0x93, 0x21, 0x8E, 0x19, 0x35, 0x27, 0x9B, 0x5E, 0xFE, 0x8D, 0xB4, 0x1A, 0xD6, 0xD1,
+    0xB2, 0xCE, 0xC6, 0x20, 0x6B, 0x92, 0xEC, 0x78, 0xF8, 0x7D, 0x93, 0x22, 0xF0, 0xD5, 0xD4, 0x5B,
+    0x41, 0xF3, 0xC2, 0x32, 0xB7, 0x58, 0x5E, 0x40, 0x9E, 0x0F, 0x93, 0x2A, 0xBC, 0xBC, 0xD5, 0x33,
+    0x27, 0x13, 0x0E, 0x4B, 0x9B, 0x8F, 0x3D, 0x77, 0x02, 0x24, 0xA4, 0x72, 0xAE, 0x77, 0xE4, 0x1A,
+    0xE8, 0xA3, 0x88, 0x7C, 0xDC, 0x15, 0x23, 0x62, 0xD1, 0x53, 0xF8, 0x2F, 0x42, 0xAB, 0xC1, 0xF9,
+    0x43, 0x4F, 0x5E, 0xAD, 0x44, 0xD3, 0x8B, 0x36, 0x39, 0x5C, 0xAB, 0x52, 0x3D, 0xEB, 0x86, 0x00,
+    0x49, 0x18, 0x3C, 0x3C, 0x5A, 0x2B, 0xD0, 0xD4, 0xEF, 0xD9, 0xEA, 0xC5, 0x51, 0x53, 0xBD, 0xBD,
+    0xBE, 0x42, 0x37, 0x37, 0x74, 0x89, 0xBB, 0x1D, 0x6E, 0x2D, 0x42, 0xD3, 0x73, 0x28, 0x47, 0x2F,
+    0xFD, 0x2C, 0xC0, 0xE0, 0xBE, 0xFD, 0x7D, 0x4E, 0x8A, 0xD8, 0xC6, 0xE0, 0xFE, 0xF5, 0xE0, 0x33,
+    0x2D, 0xB2, 0x38, 0xAC, 0x83, 0xDF, 0x6D, 0x7F, 0x29, 0xAA, 0x0C, 0x12, 0x74, 0xC0, 0x5B, 0xB6,
+    0x7E, 0x7F, 0x07, 0x83, 0xC9, 0x70, 0x2E, 0x89, 0x86, 0x13, 0xE6, 0xBA, 0x83, 0xE6, 0x41, 0xA2,
+    0xC2, 0xFF, 0xE4, 0x33, 0x77, 0xD8, 0x42, 0x80, 0x46, 0xDB, 0x0C, 0x02, 0xF1, 0x4D, 0xAD, 0x82,
+    0x0E, 0x6F, 0xE2, 0x76, 0x3F, 0x5E, 0x16, 0x23, 0xF8, 0xC9, 0x8D, 0x55, 0x91, 0xBA, 0x52, 0xEF,
+    0x8A, 0x49, 0x0E, 0x33, 0x7A, 0xF6, 0xB5, 0x62, 0xD3, 0x79, 0xC4, 0x99, 0x49, 0xE9, 0x81, 0xC1,
+    0xF9, 0x3F, 0x75, 0x9E, 0x24, 0x14, 0x9A, 0x9D, 0x70, 0x62, 0x04, 0x6A, 0xB4, 0x3C, 0xA9, 0xDB,
+    0x46, 0x5C, 0x3C, 0xDE, 0xA3, 0xF4, 0xCE, 0x9D, 0x4C, 0x84, 0x69, 0xDA, 0x0E, 0x29, 0x86, 0x8F,
+    0xF0, 0xD1, 0x3A, 0x33, 0xE4, 0xEE, 0xFC, 0x8D, 0xA9, 0x51, 0x3C, 0x60, 0x27, 0x61, 0x3F, 0x90,
+    0xE4, 0xC9, 0x71, 0xE1, 0xEB, 0xF9, 0x04, 0xEB, 0xA3, 0xB8, 0xAD, 0x04, 0x82, 0x2B, 0x40, 0x13,
+    0x46, 0xC0, 0x47, 0x72, 0xC7, 0x37, 0xD5, 0xCF, 0x0E, 0x93, 0x58, 0x2C, 0xED, 0x03, 0x68, 0xE2,
+    0x78, 0xFD, 0x70, 0xE8, 0x53, 0x27, 0x06, 0x70, 0x7A, 0x7F, 0x85, 0xEF, 0x2B, 0x98, 0x7F, 0xFD,
+    0x34, 0x2B, 0xAC, 0xA0, 0x46, 0x35, 0x56, 0x75, 0x96, 0x0B, 0xF9, 0xEC, 0xE4, 0x9B, 0xBD, 0x1E,
+    0xE0, 0x94, 0x67, 0x86, 0xD3, 0xBB, 0xE4, 0x53, 0x82, 0x28, 0x29, 0xC2, 0x1B, 0x3F, 0x79, 0x86,
+    0x44, 0x6A, 0x50, 0x1E, 0xCE, 0x1B, 0xCC, 0x8C, 0x13, 0x49, 0x32, 0xE3, 0xE6, 0xD1, 0x5B, 0xDD,
+    0x59, 0x33, 0x75, 0x95, 0xF2, 0xC1, 0xC5, 0x77, 0x08, 0x81, 0x47, 0x39, 0xCD, 0xBA, 0x78, 0xA1,
+    0x47, 0xD4, 0x2C, 0xDE, 0x9F, 0xB0, 0x20, 0x55, 0xA1, 0x4B, 0xD9, 0x0A, 0xA8, 0x9C, 0xFE, 0x8C,
+    0x5F, 0x80, 0x2B, 0x90, 0x5D, 0x86, 0xB5, 0x91, 0x31, 0x5C, 0x34, 0x4A, 0xC8, 0x27, 0xFF, 0x2D,
+    0xDA, 0xA8, 0xA3, 0xBE, 0x9A, 0xB3, 0x24, 0x8A, 0xB4, 0x1C, 0xCC, 0xC1, 0x80, 0x75, 0xEB, 0x88,
+    0x79, 0xA2, 0x20, 0xD9, 0x7E, 0x13, 0xCC, 0x6E, 0xE9, 0x2E, 0xA0, 0x3A, 0x46, 0x2F, 0xA1, 0x99,
+    0xDE, 0x57, 0xE4, 0x33, 0x10, 0xB2, 0xC8, 0xE5, 0xCF, 0xC0, 0x75, 0x9E, 0xF7, 0xB9, 0x74, 0xA8,
+    0xD0, 0x56, 0xFF, 0x86, 0x95, 0x73, 0xE1, 0x36, 0xF5, 0xED, 0x89, 0x0C, 0x35, 0x25, 0xDF, 0x05,
+    0xDB, 0xAA, 0x09, 0x54, 0x29, 0xF4, 0x96, 0xD1, 0x82, 0x50, 0xC2, 0x60, 0x2C, 0xE4, 0xCB, 0x86,
+    0xBE, 0xAB, 0xB1, 0x05, 0x1D, 0x85, 0xA6, 0x76, 0xA3, 0xE2, 0x4E, 0x74, 0x71, 0xEB, 0x65, 0xA1,
+    0x53, 0xF6, 0x32, 0x67, 0x3A, 0x56, 0x2A, 0xE3, 0xE1, 0x8E, 0x75, 0xCF, 0xE0, 0xB2, 0xBB, 0x40,
+    0x0A, 0xD1, 0x93, 0x83, 0xA0, 0x21, 0x29, 0x77, 0xC1, 0x8D, 0x67, 0x67, 0x27, 0xF0, 0xB1, 0x9B,
+    0x1C, 0xD2, 0x3F, 0x93, 0x63, 0x86, 0x38, 0x12, 0xB6, 0x33, 0x6D, 0xAB, 0x5B, 0x16, 0xF2, 0xB5,
+    0xAD, 0x30, 0xD6, 0xDD, 0xA7, 0xA1, 0x9F, 0xDD, 0x52, 0xEE, 0xEA, 0x50, 0xD4, 0x36, 0x1E, 0x9C,
+    0x2B, 0xD0, 0x45, 0xEF, 0x7E, 0x43, 0xC7, 0x72, 0xBB, 0x55, 0xF7, 0xF6, 0x32, 0xE8, 0xC4, 0xAE,
+    0x48, 0x1A, 0x6A, 0x8D, 0xE1, 0xA0, 0xBC, 0x83, 0x0F, 0x4A, 0xAC, 0x9C, 0x6F, 0x98, 0x56, 0x8A,
+    0x66, 0x73, 0x15, 0x07, 0xA6, 0x46, 0xD1, 0x6B, 0x07, 0x1C, 0x36, 0x1E, 0xC9, 0x48, 0x8A, 0x05,
+    0xC2, 0x1D, 0x9D, 0x54, 0x37, 0x34, 0x8F, 0x4B, 0xD7, 0x63, 0x1F, 0xC3, 0x02, 0xC2, 0x11, 0x70,
+    0x40, 0x61, 0x4F, 0xE1, 0x17, 0x63, 0xDF, 0x21, 0x50, 0x7D, 0x08, 0x02, 0xB6, 0x97, 0x11, 0x2E,
+    0xF5, 0xE6, 0x0C, 0x94, 0x10, 0x31, 0x5A, 0x51, 0x5D, 0x00, 0x84, 0xC2, 0x86, 0x90, 0xD4, 0xAE,
+    0x34, 0xB7, 0x1E, 0x97, 0x80, 0x3F, 0x85, 0x52, 0x2D, 0x7A, 0xBD, 0x32, 0x03, 0x2B, 0x9F, 0xF5,
+    0xCA, 0x85, 0x6D, 0x9A, 0xF3, 0x65, 0xAF, 0xE2, 0x60, 0xDF, 0x8C, 0x4F, 0x18, 0xD1, 0x85, 0xD3,
+    0x01, 0x6B, 0x07, 0xA0, 0x54, 0xB6, 0xCB, 0x25, 0xB3, 0x92, 0x96, 0xC5, 0x0B, 0xE8, 0xB4, 0xA4,
+    0x60, 0x23, 0x81, 0x47, 0xBA, 0xAD, 0x31, 0x05, 0x58, 0x3D, 0xC4, 0xA9, 0xF7, 0xAB, 0x9E, 0x9F,
+    0xAF, 0x7E, 0xAA, 0x20, 0xB5, 0xA4, 0xA5, 0x9A, 0x46, 0xF7, 0xCC, 0xE8, 0xFE, 0x6B, 0x93, 0x07,
+    0x7B, 0x43, 0x9F, 0x79, 0x55, 0x4E, 0xAB, 0xCD, 0xEF, 0x3A, 0xA1, 0x8E, 0xC4, 0xDE, 0x62, 0x5F,
+    0x0A, 0xFF, 0xC7, 0x1B, 0x4E, 0x53, 0x50, 0x36, 0x93, 0x1C, 0x47, 0xF2, 0x6A, 0x58, 0xD0, 0xBF,
+    0x70, 0x8B, 0x45, 0x34, 0x34, 0x33, 0x9E, 0x44, 0xB9, 0x64, 0xED, 0x9B, 0x6D, 0x07, 0x5F, 0x8C,
+    0x12, 0xEF, 0xDC, 0x26, 0xFF, 0x4C, 0xCE, 0xCE, 0x8D, 0xB9, 0x91, 0xC7, 0x82, 0xBF, 0x08, 0x23,
+    0xA8, 0x9A, 0x8E, 0x21, 0x8C, 0xDE, 0x1C, 0x92, 0x5B, 0xB0, 0x70, 0x69, 0x42, 0xD6, 0xB9, 0x94,
+    0x1A, 0xA2, 0x12, 0x91, 0xF1, 0x54, 0x80, 0x02, 0x0C, 0xD2, 0x54, 0x17, 0x4C, 0x29, 0xEA, 0x31,
+    0xC1, 0x60, 0x94, 0x9F, 0x44, 0xDF, 0x7B, 0x38, 0xFE, 0xD4, 0x32, 0x36, 0x6C, 0xD4, 0x6A, 0xD1,
+    0x3D, 0x6C, 0x73, 0x77, 0x81, 0xDC, 0xE2, 0x9D, 0x48, 0x5A, 0xB2, 0x95, 0x28, 0x40, 0x5F, 0xF5,
+    0x6C, 0x9A, 0x63, 0x4B, 0x24, 0xD5, 0xE3, 0x25, 0x75, 0xD4, 0xAC, 0x87, 0xA4, 0x55, 0x97, 0xA7,
+    0xB0, 0xD7, 0x06, 0x10, 0xD5, 0x0F, 0xC9, 0x8F, 0xC7, 0x6C, 0x63, 0x49, 0x81, 0x14, 0x24, 0xB0,
+    0x2C, 0xAA, 0xDE, 0x01, 0xB0, 0x4E, 0x2C, 0xD8, 0xB7, 0xDF, 0x24, 0x21, 0xF8, 0x07, 0xF6, 0x36,
+    0x93, 0x09, 0x66, 0x1D, 0xBF, 0x6D, 0x76, 0xA7, 0xDC, 0xA2, 0x67, 0xAA, 0x9E, 0x04, 0xB4, 0x9C,
+    0xE9, 0xBC, 0x78, 0xDC, 0xEC, 0x1D, 0x4D, 0xED, 0x5F, 0x9F, 0xAA, 0xFF, 0x75, 0x24, 0x3A, 0x95,
+    0xF8, 0xA2, 0xC0, 0x38, 0x73, 0xEF, 0xFF, 0x11, 0x71, 0xDE, 0xBB, 0x76, 0x19, 0xBA, 0xB9, 0xB0,
+    0xA6, 0x1B, 0x0F, 0x33, 0xFA, 0x3B, 0xB5, 0x4D, 0x32, 0x9F, 0x15, 0x09, 0xC3, 0x22, 0xCE, 0x73,
+    0x31, 0xDD, 0x23, 0xBF, 0x1E, 0x99, 0x57, 0x6D, 0x0B, 0xDF, 0xF8, 0xFD, 0xAC, 0x41, 0xA7, 0x91,
+    0x8B, 0x70, 0x5C, 0x41, 0x02, 0x77, 0x52, 0x1D, 0xAC, 0xBF, 0xBD, 0x03, 0xA3, 0x5A, 0xC4, 0x61,
+    0xA8, 0xE1, 0x00, 0xE1, 0x77, 0x14, 0x7E, 0x5F, 0xDF, 0x11, 0x80, 0x40, 0xBA, 0xA1, 0x07, 0x9F,
+    0xC7, 0xED, 0xC6, 0x77, 0xF4, 0x14, 0x55, 0x99, 0x56, 0x15, 0x6C, 0xF9, 0x34, 0x02, 0x28, 0x69,
+    0x81, 0xDD, 0x0D, 0x9E, 0x5B, 0x35, 0xEA, 0x1D, 0x9C, 0xA9, 0xBB, 0x82, 0x79, 0x1B, 0xE7, 0xF5,
+    0xF8, 0xFD, 0x14, 0xC8, 0xDC, 0xE8, 0x7A, 0x6D, 0x7B, 0xA1, 0x35, 0x7C, 0x0B, 0x13, 0x1B, 0x08,
+    0x2E, 0x8B, 0x04, 0x27, 0x16, 0x04, 0xFC, 0x6C, 0xE4, 0x1E, 0x29, 0x06, 0xF1, 0x05, 0xCD, 0x6C,
+    0x10, 0xB1, 0xBA, 0xB9, 0x7F, 0x97, 0xDD, 0x8C, 0xA5, 0x51, 0xB8, 0xD5, 0xE8, 0xE9, 0xEA, 0x23,
+    0x5D, 0x2C, 0x6A, 0xC2, 0x74, 0x7F, 0x81, 0xB6, 0x47, 0xF9, 0xA5, 0x94, 0x57, 0x31, 0x3B, 0xCE,
+    0xCB, 0x13, 0xA7, 0xED, 0x9A, 0x29, 0x33, 0x4F, 0xE2, 0xB5, 0xAA, 0x41, 0x37, 0x6F, 0xF4, 0x82,
+    0x65, 0x5F, 0x5D, 0xAE, 0x4D, 0x92, 0xD9, 0x03, 0xCC, 0x71, 0xA7, 0x6D, 0x68, 0x46, 0x87, 0xA0,
+    0x79, 0x28, 0x9C, 0x4A, 0x39, 0x7F, 0x5E, 0xA2, 0xD5, 0xB4, 0x8B, 0x35, 0x07, 0x49, 0x66, 0x47,
+    0x08, 0xFB, 0xFF, 0xE4, 0x44, 0x06, 0x3B, 0x7D, 0x99, 0xED, 0xE6, 0x9D, 0xDD, 0x9B, 0x86, 0x27,
+    0x4D, 0x3A, 0x46, 0x42, 0xDA, 0xEC, 0xCD, 0xEA, 0x1E, 0x4F, 0xDA, 0x5F, 0x5F, 0x0E, 0x0C, 0xCF,
+    0x65, 0x64, 0x34, 0x29, 0x4E, 0x14, 0x4B, 0x8A, 0x9A, 0x2C, 0xF6, 0x80, 0xBC, 0x4B, 0xAD, 0xB9,
+    0x24, 0xC3, 0x56, 0x2E, 0x5E, 0x3D, 0xBD, 0xE0, 0x48, 0x96, 0x30, 0x01, 0xD7, 0x4A, 0xEA, 0x0B,
+    0xCD, 0xF2, 0xFA, 0x99, 0x67, 0xA3, 0x98, 0x01, 0xD5, 0x19, 0x0D, 0xD5, 0x6E, 0xB3, 0x18, 0x05,
+    0x62, 0x5C, 0x75, 0xB3, 0xC2, 0x60, 0xCF, 0xF5, 0x22, 0x42, 0x32, 0x73, 0x99, 0x1D, 0x31, 0x94,
+    0xE6, 0x37, 0xC8, 0x74, 0x41, 0xF1, 0xBD, 0x46, 0xBA, 0x0B, 0x2A, 0xA7, 0x4A, 0x28, 0xB8, 0x25,
+    0x48, 0x99, 0xEF, 0xE1, 0xE7, 0x4D, 0xEB, 0x53, 0xBA, 0x76, 0xA2, 0x15, 0x1B, 0xFE, 0x80, 0x6F,
+    0x66, 0x81, 0x15, 0x99, 0x6B, 0x1C, 0x12, 0xB6, 0x61, 0x52, 0xCD, 0xBA, 0x47, 0x79, 0x0D, 0x9A,
+    0xEE, 0xA9, 0x3E, 0xFB, 0xBD, 0x56, 0xA7, 0xBC, 0x41, 0xF1, 0x17, 0x00, 0xC5, 0x0E, 0x58, 0xA7,
+    0x71, 0x42, 0x7D, 0x4A, 0xAF, 0x3C, 0x8E, 0xA6, 0x77, 0x6F, 0x35, 0xEC, 0x92, 0x8A, 0xC9, 0xCC,
+    0xB0, 0x58, 0x74, 0xCE, 0xD3, 0xBB, 0xA0, 0xC1, 0xCD, 0x12, 0xF2, 0x81, 0x1C, 0xA4, 0x26, 0x7C,
+    0x92, 0x8A, 0x27, 0x19, 0x3C, 0x44, 0x2A, 0x7D, 0x0E, 0xD3, 0xEA, 0x15, 0x3A, 0xF9, 0x4B, 0xBF,
+    0x99, 0x8A, 0x7F, 0xAB, 0x13, 0x24, 0x65, 0x46, 0x94, 0x29, 0xBD, 0xB7, 0x2A, 0xEE, 0x65, 0xEF,
+    0x02, 0x34, 0x20, 0xF4, 0xD2, 0xAF, 0xC4, 0x10, 0x93, 0x05, 0xD5, 0x82, 0x71, 0x7C, 0xF8, 0x9D,
+    0x43, 0x72, 0x09, 0xBB, 0x8C, 0xC3, 0x60, 0x21, 0x40, 0xCB, 0x97, 0xA3, 0x47, 0xE1, 0xDF, 0x18,
+    0x5E, 0x22, 0x2F, 0x95, 0x49, 0x3F, 0x89, 0x50, 0xFD, 0x08, 0x3D, 0xC2, 0xE2, 0x5D, 0x5A, 0xA3,
+    0xF2, 0x09, 0x4F, 0x0C, 0x55, 0x38, 0x69, 0xF8, 0x39, 0xC3, 0x94, 0xF7, 0x55, 0x71, 0xA9, 0xC7,
+    0x0F, 0x2C, 0x8E, 0x3C, 0x70, 0x86, 0x57, 0x6F, 0xCF, 0x5D, 0xE9, 0x4B, 0x4F, 0x80, 0x7E, 0x15,
+    0x42, 0x43, 0x7B, 0xEC, 0xCD, 0x4E, 0x92, 0x8D, 0x5C, 0x89, 0xD2, 0x08, 0x5A, 0x32, 0x0F, 0x6E,
+    0x0D, 0x09, 0x29, 0x02, 0x6F, 0xA0, 0x2E, 0x8E, 0x5C, 0x10, 0x16, 0x1E, 0x82, 0xDF, 0xD3, 0xCD,
+    0xB5, 0x93, 0xD6, 0x21, 0x7B, 0x96, 0xC5, 0xFC, 0x79, 0x21, 0x88, 0x99, 0xC9, 0x3C, 0x75, 0x98,
+    0x13, 0x67, 0x62, 0xFD, 0x70, 0xB0, 0x58, 0xDA, 0xCF, 0xDC, 0x9E, 0x92, 0x5F, 0x84, 0x3B, 0x0E,
+    0xD8, 0xE0, 0xCF, 0xF3, 0x90, 0x9E, 0xFC, 0x40, 0xC7, 0x58, 0x2F, 0x11, 0x55, 0x9D, 0x7A, 0xE9,
+    0x9D, 0x5C, 0xD7, 0xDF, 0xEF, 0xC5, 0x87, 0x7E, 0xC5, 0x14, 0xA7, 0xCE, 0xE6, 0xDB, 0x83, 0xD4,
+    0x3A, 0xF7, 0x86, 0xD0, 0xE6, 0x2B, 0xFF, 0x8B, 0x80, 0xF8, 0xD6, 0xFE, 0x55, 0x82, 0xD7, 0x5B,
+    0xEB, 0x29, 0x9C, 0x1D, 0xCD, 0x69, 0x1D, 0xF2, 0xB5, 0x44, 0x09, 0xAD, 0x1D, 0x40, 0xDD, 0xC1,
+    0xFB, 0xDF, 0x79, 0xCA, 0xA4, 0x61, 0xAC, 0x39, 0x80, 0x66, 0xB8, 0x37, 0x91, 0xF6, 0x23, 0xEB,
+    0x82, 0x49, 0x05, 0x41, 0x72, 0x98, 0xA6, 0x1C, 0x21, 0xB1, 0x64, 0x90, 0xDC, 0x68, 0x00, 0x2E,
+    0x61, 0x2A, 0x80, 0x91, 0xEB, 0xCA, 0x04, 0x3D, 0x8E, 0x70, 0x21, 0x60, 0x1E, 0x11, 0x69, 0x4A,
+    0x3B, 0x09, 0x84, 0x90, 0x98, 0x78, 0xF0, 0x9D, 0x5A, 0x92, 0x71, 0xC3, 0xB7, 0x4B, 0x42, 0x98,
+    0x8E, 0xB6, 0x2B, 0x39, 0x59, 0x5F, 0xC1, 0x04, 0xC6, 0x8F, 0x6B, 0x33, 0xF7, 0x9E, 0x0B, 0x32,
+    0x35, 0x60, 0x57, 0x23, 0xA1, 0xCB, 0x73, 0x82, 0xEA, 0x05, 0x3D, 0xDC, 0xF5, 0x36, 0x1B, 0x5E,
+    0x18, 0x1F, 0x37, 0x14, 0xD7, 0x06, 0xAE, 0xDD, 0x46, 0x15, 0x82, 0xA2, 0x9C, 0xAA, 0x41, 0xFE,
+    0x28, 0xB8, 0x3E, 0x2A, 0x7D, 0x78, 0xB8, 0x27, 0xE7, 0x65, 0x52, 0x7D, 0x93, 0x9F, 0x13, 0x9A,
+    0x22, 0xF1, 0xF5, 0xB3, 0x2A, 0x37, 0xB6, 0x81, 0xF7, 0x5D, 0x4C, 0xA3, 0x65, 0x28, 0x13, 0x9E,
+    0x41, 0xD8, 0xC4, 0xA8, 0x10, 0xD5, 0x5D, 0xB0, 0xBA, 0xE5, 0xDF, 0xF3, 0xFF, 0x49, 0xD1, 0xED,
+    0x9D, 0x9E, 0xFA, 0x19, 0xF7, 0x41, 0xDB, 0xC1, 0xBE, 0x8E, 0x72, 0xAD, 0xB2, 0xD5, 0x7A, 0x93,
+    0x6F, 0xF7, 0x25, 0xB9, 0x62, 0xB5, 0xA9, 0x3B, 0x79, 0xF6, 0xA8, 0x56, 0x4A, 0x8F, 0x98, 0x9E,
+    0xC7, 0x4F, 0x42, 0x49, 0xB3, 0x75, 0xFA, 0x73, 0xDD, 0x37, 0xCA, 0xCE, 0xEA, 0x5E, 0xF0, 0x84,
+    0x88, 0x6F, 0x54, 0x54, 0xA5, 0xA0, 0x1D, 0xF9, 0xE7, 0x4E, 0xCB, 0xD6, 0x0A, 0xB4, 0x84, 0xBF,
+    0xD0, 0x2E, 0x2C, 0xF9, 0x12, 0x33, 0x28, 0x91, 0x40, 0x3E, 0xC9, 0x18, 0x9E, 0x84, 0x76, 0xDB,
+    0xEB, 0x21, 0x62, 0x35, 0xAE, 0x98, 0x20, 0x97, 0x2B, 0x8D, 0x6B, 0x86, 0x73, 0x91, 0x00, 0x0C,
+    0xA0, 0xF1, 0xAB, 0xB7, 0x65, 0x94, 0x7A, 0x80, 0x09, 0x28, 0x90, 0x0B, 0xAF, 0x1C, 0x72, 0xCD,
+    0x93, 0x7C, 0xDA, 0xC7, 0xE0, 0x85, 0x72, 0x3F, 0x0A, 0xAA, 0x1E, 0xE7, 0xBF, 0xEA, 0x84, 0xE1,
+    0xF9, 0xB8, 0x2B, 0x41, 0x4E, 0x30, 0x23, 0x99, 0x47, 0xE4, 0x6C, 0x45, 0x86, 0x51, 0xB2, 0xB1,
+    0x2A, 0x11, 0x1B, 0x3E, 0xD1, 0x5A, 0xC4, 0x6C, 0xEF, 0x37, 0xBC, 0xAE, 0x10, 0x0C, 0x28, 0xB0,
+    0x14, 0x6B, 0xB7, 0x34, 0x12, 0x21, 0x12, 0x5D, 0xFC, 0x19, 0x80, 0x72, 0x0B, 0xF3, 0x27, 0x8B,
+    0x3F, 0x14, 0x7B, 0xD5, 0x66, 0xF2, 0x0F, 0xEF, 0x2E, 0xC6, 0x87, 0x49, 0x61, 0xD1, 0xE6, 0xA5,
+    0x00, 0xF9, 0x1A, 0x11, 0xB2, 0x3B, 0xAC, 0x77, 0xBF, 0xFB, 0x6B, 0xB1, 0x9C, 0x25, 0x0D, 0x68,
+    0x2C, 0x2C, 0xA8, 0xE8, 0x67, 0xE7, 0xAF, 0x32, 0x03, 0x6C, 0xAB, 0xF2, 0x27, 0x55, 0xD6, 0xCA,
+    0x36, 0xC4, 0x2A, 0xD7, 0x74, 0x7F, 0xD5, 0xE5, 0x4E, 0x2F, 0x97, 0xA8, 0x21, 0x71, 0xE0, 0xD7,
+    0x96, 0xD3, 0x14, 0xA2, 0x3D, 0x6C, 0xC0, 0x86, 0x17, 0x80, 0xA0, 0x9B, 0x96, 0x3F, 0x42, 0x45,
+    0xCF, 0x34, 0x24, 0x9C, 0xEF, 0x8A, 0xA2, 0x33, 0xB7, 0xEB, 0xF7, 0xB1, 0xE1, 0xE9, 0x9F, 0xDB,
+    0xA9, 0x80, 0xD0, 0xA8, 0xBC, 0x6A, 0x49, 0x86, 0x69, 0xAF, 0x21, 0x82, 0x9B, 0xF1, 0x90, 0x12,
+    0x92, 0x7C, 0xCE, 0x56, 0xB7, 0x31, 0xFF, 0x68, 0xE1, 0x5D, 0x54, 0x17, 0xBC, 0x06, 0x46, 0x56,
+    0xE3, 0x4A, 0x36, 0xAB, 0x7D, 0xBC, 0xE8, 0x34, 0x32, 0x79, 0xEB, 0x96, 0xFC, 0xA5, 0x17, 0x72,
+    0x50, 0x63, 0xCB, 0x6C, 0x4D, 0x0D, 0xBD, 0xEC, 0x78, 0xC7, 0x73, 0x97, 0x7F, 0xA6, 0xF5, 0xCE,
+    0xFC, 0xC7, 0x28, 0x59, 0x62, 0xAF, 0xCC, 0x9F, 0xFB, 0x4F, 0x8D, 0xBE, 0xC6, 0xEF, 0xCF, 0x92,
+    0xDE, 0x56, 0x06, 0xF0, 0xB6, 0xEE, 0x7F, 0xFE, 0x90, 0x59, 0xFF, 0xF1, 0xB2, 0x7A, 0x67, 0xA9,
+    0x16, 0x0B, 0xB9, 0xDB, 0xF8, 0x5B, 0xAB, 0x6C, 0xD0, 0x4F, 0x6A, 0xB1, 0x42, 0x39, 0x2D, 0x71,
+    0x31, 0x30, 0x83, 0xC4, 0x3D, 0x5D, 0xB7, 0x6A, 0xE5, 0xE0, 0x1A, 0x07, 0xC8, 0xA1, 0xCC, 0x5C,
+    0x8B, 0x0E, 0xDA, 0xBA, 0xC5, 0x0E, 0x1D, 0x6D, 0x8C, 0x25, 0x56, 0xAA, 0xA2, 0xC3, 0x1C, 0xB1,
+    0xDE, 0x5E, 0xAA, 0xCA, 0x53, 0xF8, 0x78, 0x69, 0x51, 0x69, 0x03, 0xA4, 0x0F, 0xB7, 0xA7, 0xAA,
+    0xB6, 0x44, 0x59, 0x9F, 0xB8, 0x45, 0x48, 0x19, 0x5F, 0x29, 0x64, 0x66, 0xA7, 0x7B, 0x7F, 0x79,
+    0xF8, 0x9D, 0x15, 0x48, 0x34, 0x57, 0xA1, 0x25, 0x27, 0xCE, 0xBF, 0xD1, 0xC8, 0x5E, 0x96, 0xBF,
+    0xC9, 0xD2, 0xC7, 0x08, 0x75, 0xDB, 0x8D, 0x55, 0x26, 0x92, 0x2C, 0xB2, 0x87, 0xB1, 0x15, 0x37,
+    0x22, 0x9B, 0x61, 0xBC, 0xA8, 0xC7, 0x7E, 0xC3, 0x98, 0x89, 0xBC, 0x44, 0x6B, 0x13, 0x93, 0x30,
+    0xCD, 0x5B, 0x35, 0xB4, 0x9F, 0x5C, 0xB5, 0x2E, 0xB1, 0x23, 0x20, 0xA8, 0xF3, 0xA3, 0x5A, 0x01,
+    0x29, 0x24, 0x54, 0x20, 0xEF, 0x27, 0xCD, 0xF3, 0x56, 0xE0, 0x6B, 0x02, 0x23, 0x0A, 0xD9, 0x6A,
+    0xA6, 0x23, 0xE1, 0xC3, 0x96, 0xEE, 0x06, 0x11, 0x53, 0x9E, 0xD6, 0x80, 0xC1, 0x68, 0x15, 0xA4,
+    0x24, 0x8F, 0xBF, 0xB2, 0x49, 0xC1, 0x2E, 0xE2, 0x6B, 0xD2, 0x48, 0x45, 0x3C, 0xA6, 0xF8, 0x6C,
+    0xC0, 0x55, 0x51, 0xC4, 0xAC, 0x52, 0x8D, 0x44, 0xEF, 0xBC, 0x04, 0x05, 0x69, 0x5C, 0x87, 0x99,
+    0x0C, 0x27, 0xFB, 0x02, 0x6E, 0xD1, 0xF7, 0x5E, 0x07, 0x11, 0x26, 0x5A, 0x59, 0x5A, 0xF8, 0x54,
+    0x12, 0x88, 0x20, 0xBB, 0x38, 0x92, 0x49, 0xF0, 0xE5, 0x82, 0xA3, 0xF6, 0xEE, 0xBD, 0xD7, 0xCC,
+    0x58, 0xDC, 0x3B, 0x8A, 0x13, 0xE8, 0x5F, 0x58, 0x0C, 0x12, 0x64, 0x3C, 0xAF, 0x92, 0xC0, 0xC9,
+    0x11, 0xE9, 0xC1, 0xB8, 0xE7, 0xFA, 0x09, 0xAE, 0x61, 0xA3, 0x70, 0x4C, 0x07, 0x45, 0x7C, 0x61,
+    0x82, 0x1B, 0x64, 0x4C, 0x0F, 0x7D, 0xC2, 0xC5, 0xD9, 0x92, 0x00, 0x35, 0xCC, 0x34, 0x07, 0xBA,
+    0xDD, 0x52, 0xE3, 0x67, 0x76, 0xC6, 0x8B, 0xD5, 0x51, 0xE7, 0xB3, 0x57, 0x7D, 0xF6, 0xA3, 0x82,
+    0xEA, 0x7D, 0x88, 0x09, 0x67, 0x49, 0x2B, 0x37, 0x04, 0x1E, 0xBF, 0x83, 0x76, 0xBA, 0x7F, 0xB4,
+    0xC1, 0x8F, 0xCD, 0xD3, 0x04, 0xD2, 0x89, 0x5F, 0x0E, 0xA7, 0x43, 0x4F, 0x8A, 0x4A, 0x98, 0x48,
+    0x74, 0x83, 0x0B, 0x2E, 0x6E, 0xC4, 0xAF, 0x29, 0x38, 0xBA, 0xD1, 0x67, 0xEA, 0x96, 0x10, 0x35,
+    0x69, 0xFF, 0xD2, 0x43, 0x00, 0x2E, 0x9D, 0x60, 0x08, 0x04, 0xDF, 0xFB, 0xCD, 0x6C, 0x98, 0xCE,
+    0x73, 0x9A, 0xF4, 0x46, 0x23, 0x22, 0x58, 0x0C, 0x1F, 0xE1, 0x5A, 0x43, 0x76, 0x18, 0x81, 0xE3,
+    0xF4, 0xBE, 0x95, 0xBF, 0x61, 0x88, 0x16, 0xF4, 0x7B, 0x01, 0xEB, 0xD4, 0x85, 0xB9, 0xC2, 0x0C,
+    0x22, 0x02, 0x27, 0x8D, 0xB5, 0x7F, 0xC8, 0xA9, 0xAA, 0x8A, 0xF7, 0x91, 0x7A, 0x4A, 0x20, 0x37,
+    0xB7, 0xBE, 0x15, 0x6E, 0x48, 0x2C, 0x50, 0xE3, 0xAE, 0x2B, 0xAE, 0x1E, 0x5C, 0x59, 0x9A, 0x36,
+    0x46, 0x85, 0x04, 0xE8, 0x51, 0xED, 0x1F, 0xB0, 0x38, 0xE3, 0xC7, 0x5D, 0x9A, 0xD1, 0x07, 0x85,
+    0xED, 0xDC, 0x3C, 0x99, 0x35, 0x03, 0x57, 0x85, 0xE2, 0x83, 0xFB, 0x06, 0x81, 0x08, 0xDA, 0xF2,
+    0xFA, 0xF4, 0x9E, 0x5F, 0x2F, 0x82, 0xC2, 0xBA, 0xE3, 0x04, 0x42, 0x59, 0x4B, 0xBD, 0xEB, 0xFD,
+    0x8F, 0x5D, 0x34, 0x37, 0x86, 0x06, 0x6B, 0xCC, 0x8C, 0x48, 0x7C, 0x14, 0xE9, 0x48, 0xF5, 0x28,
+    0x51, 0xF3, 0x7E, 0xC9, 0xC8, 0x73, 0x88, 0x8B, 0x03, 0xAD, 0xEA, 0x37, 0x3F, 0x02, 0x95, 0xB8,
+    0x6A, 0x28, 0xFC, 0x42, 0xD9, 0xAD, 0xFC, 0x4C, 0xE8, 0xEA, 0xDC, 0x4B, 0xD3, 0x9C, 0x74, 0x09,
+    0x44, 0x74, 0x81, 0xB6, 0x36, 0x96, 0x07, 0xFB, 0x48, 0xF5, 0xBA, 0x21, 0xA5, 0xD4, 0xCA, 0x48,
+    0x1E, 0x63, 0xF4, 0x8C, 0x16, 0x4C, 0xDF, 0xC2, 0xAA, 0x11, 0x02, 0xCF, 0xE8, 0x28, 0xEF, 0xB9,
+    0x57, 0x70, 0x6C, 0x2C, 0x43, 0x18, 0x6D, 0xBD, 0x2D, 0xF4, 0x20, 0x54, 0x2A, 0xF3, 0xAE, 0x57,
+    0x46, 0xA4, 0x0E, 0xC8, 0x18, 0xB3, 0x37, 0x6E, 0xFF, 0x99, 0x6A, 0x26, 0xF8, 0x7E, 0xCF, 0x8B,
+    0xDB, 0x43, 0xF3, 0x10, 0x30, 0xA7, 0x27, 0x96, 0x07, 0x8F, 0x50, 0xE0, 0x45, 0x41, 0x16, 0xA6,
+    0xC1, 0x1B, 0xCB, 0x97, 0x00, 0x81, 0x9D, 0x3A, 0x1A, 0x1E, 0xA0, 0x11, 0xFA, 0xBC, 0x89, 0xF5,
+    0x07, 0x66, 0x93, 0x4E, 0xC4, 0x90, 0xF7, 0xA1, 0x65, 0x00, 0xDE, 0x39, 0x9A, 0xED, 0xCC, 0xEA,
+    0x70, 0x57, 0x83, 0x62, 0x68, 0xE0, 0x9C, 0x0A, 0xC5, 0x2F, 0x6E, 0x75, 0xB9, 0x93, 0x15, 0x62,
+    0xAC, 0x7C, 0x8B, 0x23, 0x32, 0xF4, 0xC9, 0x97, 0xBA, 0x7D, 0x7D, 0x9D, 0x19, 0x13, 0x4B, 0x6E,
+    0xEF, 0xDE, 0x2B, 0x9B, 0x30, 0x9B, 0x30, 0xA8, 0x22, 0xBC, 0x7B, 0x63, 0xC8, 0x08, 0x84, 0xA6,
+    0x66, 0xE0, 0x87, 0x0C, 0x4A, 0x1B, 0xC3, 0xE2, 0xE4, 0x3B, 0x45, 0x21, 0x45, 0x36, 0x05, 0x98,
+    0x41, 0xE1, 0x03, 0x82, 0x95, 0x69, 0x0C, 0x6D, 0x4A, 0x13, 0x94, 0x15, 0x66, 0x9C, 0x2F, 0xA5,
+    0x93, 0x3F, 0x59, 0xE0, 0x86, 0xED, 0x13, 0xD5, 0x9A, 0x0A, 0xEB, 0x0C, 0x58, 0xD1, 0xBB, 0x9C,
+    0xD9, 0x16, 0x3C, 0xC7, 0x47, 0x7A, 0x2B, 0x62, 0xC5, 0x29, 0x08, 0x03, 0xC6, 0xCE, 0x7B, 0xAB,
+    0x9B, 0x96, 0x69, 0x42, 0x9A, 0x27, 0x23, 0x0E, 0xAC, 0x69, 0xDA, 0x84, 0xD3, 0xCC, 0xFF, 0x55,
+    0x58, 0x30, 0x45, 0xFD, 0xBE, 0xA2, 0x25, 0xE1, 0x66, 0xF9, 0x70, 0xAE, 0x1E, 0xC3, 0x3E, 0xC6,
+    0xF8, 0xF2, 0x0D, 0xA6, 0x49, 0x1F, 0x73, 0x82, 0xBE, 0x74, 0x8C, 0x3B, 0xD7, 0xF1, 0xDA, 0x94,
+    0x41, 0x20, 0xD4, 0x45, 0xD8, 0xB4, 0x44, 0x97, 0x85, 0x12, 0xE9, 0xB4, 0x4A, 0xDF, 0xD4, 0xED,
+    0xA5, 0x7D, 0xCD, 0x15, 0x08, 0xD2, 0x7C, 0x46, 0xF4, 0x34, 0x0C, 0x0C, 0x56, 0x4A, 0xFA, 0xDB,
+    0x8B, 0xC2, 0xB3, 0x0F, 0xB4, 0xEB, 0x26, 0xB6, 0xA7, 0x0A, 0x0C, 0xB7, 0x19, 0x0A, 0x2C, 0x27,
+    0xC9, 0x1B, 0x83, 0x4B, 0x32, 0xAE, 0xBE, 0x11, 0xA3, 0xBC, 0x3D, 0x94, 0x2B, 0xC8, 0xCB, 0x5D,
+    0x1F, 0xA6, 0x7C, 0xB6, 0x4C, 0x5E, 0xCF, 0xA4, 0x51, 0x90, 0xDB, 0xE2, 0xBA, 0x4D, 0x14, 0x9D,
+    0x22, 0x1E, 0x82, 0x2E, 0x28, 0xB9, 0x94, 0x83, 0x46, 0x63, 0xD6, 0xEA, 0x14, 0x03, 0xDE, 0x74,
+    0x09, 0xD4, 0x21, 0x07, 0xFA, 0xEB, 0x36, 0xB5, 0x76, 0x7D, 0x98, 0xBC, 0x3A, 0x9E, 0xD4, 0xB3,
+    0x24, 0x35, 0x87, 0x0C, 0x70, 0x09, 0x7C, 0xE4, 0x70, 0x46, 0x6C, 0x8C, 0x19, 0xD0, 0x42, 0xE9,
+    0x24, 0x2F, 0xCA, 0x16, 0xAD, 0x21, 0xD1, 0x16, 0xDF, 0x01, 0xEC, 0x23, 0xCA, 0xE3, 0x81, 0xD2,
+    0x53, 0x20, 0x7E, 0xA1, 0x99, 0x8E, 0x88, 0x5D, 0x73, 0xF8, 0xD9, 0x0E, 0x37, 0xB4, 0xF3, 0xE9,
+    0x66, 0x7B, 0x2D, 0xA0, 0x5B, 0x4B, 0x28, 0xE5, 0xE3, 0x6C, 0xA2, 0x82, 0x6C, 0xA9, 0xE7, 0x1C,
+    0xD3, 0x33, 0x2C, 0xB4, 0x7D, 0x95, 0xEA, 0x9F, 0x20, 0xEF, 0x02, 0x38, 0x26, 0x3C, 0x5F, 0x39,
+    0xBB, 0xFA, 0x75, 0x10, 0xBE, 0x00, 0x1A, 0x4B, 0xE8, 0xBC, 0x1B, 0xCE, 0x02, 0x59, 0x97, 0x36,
+    0xD9, 0xE9, 0x03, 0x2B, 0x1A, 0x54, 0x35, 0x31, 0x9E, 0x59, 0xDE, 0x46, 0x56, 0x5D, 0xF6, 0xB5,
+    0x91, 0xBC, 0x52, 0xB6, 0xB5, 0x9A, 0xF6, 0x8B, 0x5B, 0xE4, 0x7D, 0x4F, 0xD6, 0x74, 0x2A, 0x7D,
+    0xC3, 0x85, 0x50, 0xF4, 0xCD, 0x3A, 0x81, 0x3C, 0x2C, 0xA5, 0xF5, 0xAF, 0xE2, 0xA9, 0x9F, 0x97,
+    0xE5, 0x7B, 0x67, 0x64, 0x46, 0xD4, 0x7C, 0x1A, 0x41, 0xD4, 0x2D, 0x7C, 0xE3, 0xD9, 0xFA, 0x2A,
+    0xDE, 0x83, 0x17, 0xEC, 0x78, 0x02, 0x7D, 0xAF, 0x4A, 0x06, 0x53, 0xE3, 0x44, 0x0B, 0x06, 0xEC,
+    0xD4, 0xA7, 0xA5, 0x87, 0x09, 0x23, 0x44, 0x76, 0x3D, 0xD4, 0xA5, 0xEF, 0x5C, 0x75, 0x3A, 0xF7,
+    0x99, 0xC8, 0x21, 0x6A, 0xFB, 0xBF, 0x0D, 0x08, 0xF0, 0xEE, 0xD6, 0x7E, 0xF8, 0x67, 0x02, 0x87,
+    0xCA, 0x94, 0x27, 0x4D, 0x0C, 0x5F, 0xA1, 0x94, 0xC9, 0x1F, 0xE1, 0x4B, 0x93, 0x2D, 0x40, 0xE0,
+    0x25, 0x5A, 0xDB, 0x28, 0xBE, 0x7F, 0xFD, 0x0D, 0x6D, 0x22, 0xF4, 0x31, 0xE5, 0x1C, 0x84, 0x71,
+    0x09, 0x5F, 0x1D, 0x78, 0xE9, 0x64, 0xD9, 0xB9, 0x82, 0x7D, 0xF5, 0x9B, 0x73, 0x4F, 0x74, 0x8B,
+    0xA1, 0xB3, 0xC2, 0x01, 0x30, 0x1E, 0x20, 0x72, 0xB9, 0xB8, 0x92, 0x1A, 0xFE, 0x34, 0xF8, 0x5F,
+    0x69, 0xEC, 0x09, 0x41, 0x50, 0x77, 0x44, 0xF9, 0x68, 0xE4, 0xEC, 0xC7, 0xB5, 0xA3, 0x45, 0x6B,
+    0x03, 0xC4, 0xE8, 0xA0, 0x53, 0xF2, 0x94, 0xB9, 0x49, 0xA0, 0x6D, 0x11, 0xBA, 0x1C, 0x89, 0x87,
+    0x08, 0x72, 0xC0, 0xE3, 0x7B, 0x0C, 0x8D, 0x18, 0xDD, 0xB0, 0x3B, 0x0E, 0xC2, 0x0E, 0xBB, 0x4B,
+    0x61, 0x22, 0x48, 0x64, 0x69, 0x54, 0xE8, 0x29, 0x94, 0x84, 0xE5, 0xD7, 0x1A, 0x5F, 0x4B, 0xBC,
+    0xAD, 0x35, 0x82, 0xF1, 0xFD, 0x40, 0x14, 0xAE, 0xD0, 0x28, 0x0E, 0xE9, 0xEE, 0x2E, 0x88, 0xFF,
+    0xD1, 0xC9, 0xC5, 0x36, 0x39, 0xFB, 0x9F, 0xC9, 0x85, 0x97, 0x2A, 0x58, 0x07, 0xD9, 0x6E, 0x6E,
+    0x83, 0x09, 0x6D, 0xC6, 0x92, 0x1C, 0xBF, 0x50, 0xE3, 0xCB, 0xAD, 0x50, 0x3C, 0xDB, 0xF9, 0xE3,
+    0x32, 0x51, 0x58, 0x20, 0xE6, 0xD8, 0xCA, 0x50, 0xF7, 0x50, 0x05, 0xAF, 0xB6, 0xF7, 0xAB, 0x3E,
+    0x48, 0xB7, 0xA4, 0xB1, 0x52, 0x32, 0x2A, 0xD6, 0xC2, 0x78, 0x62, 0x05, 0x34, 0x96, 0x61, 0xF1,
+    0x21, 0x14, 0x69, 0x6F, 0x10, 0x96, 0xDD, 0xE2, 0x1D, 0xEB, 0xE5, 0x4F, 0xA0, 0x67, 0xA8, 0x46,
+    0x52, 0xBD, 0x2F, 0xA5, 0x59, 0xF8, 0xCB, 0xB2, 0x51, 0x09, 0xD3, 0x13, 0x9C, 0x37, 0xD3, 0x9B,
+    0xD4, 0x5C, 0x8E, 0xF9, 0xF2, 0xE4, 0xBF, 0x69, 0xA2, 0xB2, 0x06, 0xC1, 0xF5, 0x65, 0xB9, 0x0A,
+    0xC6, 0x73, 0x77, 0xEF, 0x4E, 0x50, 0x2D, 0x2C, 0xEE, 0xFF, 0xE9, 0x61, 0x8A, 0x07, 0xC9, 0x64,
+    0x48, 0x27, 0x4B, 0xCE, 0xE1, 0x80, 0xCC, 0x14, 0x8F, 0x42, 0x92, 0x4D, 0x6F, 0x87, 0x48, 0x90,
+    0x29, 0xF4, 0x4E, 0x72, 0x2C, 0xCC, 0x1A, 0xDD, 0x96, 0xDA, 0xFE, 0xD7, 0xCB, 0xEE, 0x6F, 0xA4,
+    0xA0, 0xCB, 0xEE, 0x7F, 0xB3, 0x21, 0x54, 0xBA, 0x6F, 0xC9, 0x53, 0x66, 0x7B, 0x38, 0xEC, 0xF4,
+    0x5F, 0xA0, 0x99, 0x23, 0x5F, 0x79, 0xD7, 0x08, 0xCC, 0x74, 0xDA, 0x02, 0xA1, 0xFC, 0x01, 0xF0,
+    0xF6, 0xA9, 0x9C, 0xA5, 0x85, 0xC6, 0x7E, 0xF6, 0x0F, 0x53, 0x11, 0x91, 0x92, 0x6D, 0x60, 0xC7,
+    0x63, 0xD5, 0x1C, 0x84, 0x7E, 0x91, 0xDA, 0x97, 0x5B, 0xD8, 0x3D, 0xBF, 0x83, 0xC3, 0x42, 0xC1,
+    0xDB, 0xB6, 0xE3, 0xFB, 0x9F, 0x40, 0x36, 0x6E, 0xB9, 0x8F, 0x44, 0xB8, 0x73, 0x2C, 0x14, 0xBD,
+    0x6C, 0x5E, 0x71, 0x76, 0xD2, 0xB9, 0xA2, 0x0B, 0xEC, 0xD4, 0x97, 0x9A, 0x1F, 0xCF, 0x0C, 0x3D,
+    0x5F, 0x49, 0x24, 0x08, 0x3C, 0xEC, 0xCE, 0xA3, 0x16, 0xFC, 0x7B, 0xD9, 0x98, 0x73, 0xEF, 0x74,
+    0x76, 0x0E, 0x51, 0x94, 0xBC, 0x18, 0x71, 0xAB, 0x43, 0xA8, 0x27, 0xA1, 0x5D, 0x69, 0x23, 0xB5,
+    0x5C, 0xFB, 0xFB, 0xD1, 0xBE, 0x59, 0x9C, 0x35, 0x1B, 0x5D, 0x49, 0x58, 0xEB, 0x06, 0xFB, 0x0E,
+    0xFC, 0x3B, 0x4B, 0x47, 0xF9, 0x80, 0xD2, 0x50, 0x97, 0xA1, 0xFB, 0x2F, 0x0D, 0x65, 0x7A, 0x30,
+    0xA3, 0x33, 0x04, 0x44, 0x0B, 0x4A, 0x88, 0xEB, 0x59, 0x1A, 0xA5, 0x96, 0x8C, 0x09, 0x1E, 0x26,
+    0x6A, 0x89, 0x74, 0x0C, 0x97, 0xDE, 0x51, 0x1C, 0x49, 0x16, 0x99, 0xDE, 0x80, 0x95, 0xDA, 0x0B,
+    0xD6, 0x0B, 0x85, 0x83, 0x13, 0x70, 0xCC, 0x60, 0xE3, 0x24, 0xDA, 0xB1, 0xE9, 0x8E, 0x29, 0x04,
+    0x68, 0xE7, 0x85, 0x0F, 0x78, 0x9D, 0x69, 0x9A, 0x3A, 0xFC, 0x1B, 0x34, 0x65, 0x9D, 0x0D, 0x84,
+    0xF5, 0x21, 0x30, 0xF6, 0xDF, 0x4E, 0xC5, 0xEB, 0x8C, 0x9A, 0x5F, 0x00, 0xDE, 0x19, 0x2B, 0x1F,
+    0x7C, 0x86, 0x7D, 0x43, 0xA2, 0x43, 0xC5, 0xA9, 0xDD, 0x84, 0x18, 0x90, 0xAB, 0x4C, 0xD3, 0x0B,
+    0x01, 0xA6, 0xCC, 0x04, 0x24, 0xF0, 0x0C, 0x3A, 0x8B, 0x20, 0x36, 0x1C, 0xBF, 0x40, 0x5E, 0x1F,
+    0x70, 0x7D, 0x69, 0xAA, 0xF6, 0xA8, 0x7B, 0x0F, 0x55, 0x4C, 0x63, 0xB8, 0x28, 0x8B, 0x9F, 0xB1,
+    0xF9, 0x84, 0x20, 0x7C, 0xFD, 0x41, 0x94, 0xAA, 0x92, 0xE0, 0x4E, 0x66, 0x7B, 0x4D, 0xBF, 0x96,
+    0xA3, 0xE9, 0x9B, 0xEC, 0xD5, 0x75, 0x8B, 0x08, 0x8A, 0x1A, 0xFF, 0x0C, 0xF3, 0x9D, 0xFC, 0x92,
+    0x61, 0x19, 0x41, 0x5A, 0x52, 0x5E, 0xC2, 0x91, 0xFE, 0xD8, 0x8F, 0xF2, 0xD6, 0x0B, 0x73, 0x4B,
+    0x1F, 0x63, 0x30, 0xC5, 0x8E, 0x85, 0x8C, 0xE2, 0xEA, 0xE1, 0xDC, 0xBC, 0xDA, 0xF7, 0xA1, 0xBA,
+    0x3F, 0xCC, 0xD7, 0xAC, 0xF8, 0xAD, 0xB8, 0x53, 0x82, 0x3B, 0xD3, 0x69, 0xC1, 0xDD, 0xB7, 0xD5,
+    0x89, 0x89, 0x50, 0xF7, 0x73, 0x56, 0xA7, 0xC5, 0x05, 0xB5, 0xEE, 0xE6, 0x4A, 0x22, 0xF8, 0x33,
+    0xEB, 0xED, 0xF2, 0xDE, 0x73, 0x02, 0x95, 0x3C, 0x0E, 0x4E, 0x5B, 0x0B, 0xE7, 0x6C, 0xF7, 0xE1,
+    0xF8, 0x67, 0x8A, 0xDF, 0x41, 0x3F, 0xCC, 0x5E, 0x0C, 0xD6, 0x6E, 0x96, 0xBF, 0x95, 0x71, 0x4C,
+    0x79, 0x7C, 0x3B, 0x88, 0x46, 0x73, 0x96, 0xA2, 0xDA, 0x6C, 0x71, 0xEC, 0x54, 0x14, 0x79, 0x1E,
+    0x47, 0xF8, 0x94, 0x63, 0x28, 0x4A, 0xFB, 0xBB, 0x82, 0x66, 0x91, 0x99, 0x0E, 0xBE, 0xBB, 0x33,
+    0x4D, 0x55, 0xE2, 0x08, 0xCA, 0xE7, 0x52, 0x4A, 0xED, 0x64, 0xFF, 0xDD, 0xF7, 0xF9, 0xEA, 0x7D,
+    0xD0, 0xBD, 0xB9, 0xAC, 0x62, 0x3B, 0xBC, 0xC6, 0x47, 0xEF, 0xEC, 0xA0, 0x6D, 0x7D, 0x0F, 0xD8,
+    0xC6, 0x10, 0x90, 0x29, 0xCB, 0xF3, 0xA1, 0xC2, 0x2B, 0x1D, 0xDD, 0x43, 0x6A, 0x49, 0xCB, 0x1F,
+    0x8C, 0x29, 0xC4, 0x4A, 0xAB, 0xCB, 0xD3, 0x89, 0xF6, 0x24, 0x73, 0xA3, 0xA0, 0x5C, 0x9E, 0xE2,
+    0x93, 0x2C, 0x18, 0x6A, 0xA1, 0x07, 0x5A, 0x77, 0xAA, 0x26, 0x38, 0x2C, 0xF0, 0xA9, 0xFC, 0x6C,
+    0x94, 0xBE, 0xAF, 0x20, 0xCA, 0x8B, 0xB1, 0x7B, 0x9A, 0x3A, 0xBD, 0x0B, 0xF5, 0x03, 0x73, 0x6D,
+    0x6F, 0x15, 0xB1, 0x8F, 0x85, 0xDE, 0x24, 0x47, 0x94, 0x1B, 0x94, 0x25, 0xA5, 0x85, 0x31, 0x33,
+    0x75, 0xA9, 0x0E, 0x16, 0x90, 0x12, 0x91, 0x72, 0x0F, 0x1E, 0x47, 0x7B, 0x42, 0xB4, 0x99, 0x9E,
+    0xDA, 0xD8, 0xD9, 0xB4, 0x2C, 0xA4, 0x06, 0x05, 0x2F, 0x83, 0xF6, 0xE7, 0x6D, 0x7A, 0x9E, 0x40,
+    0xCE, 0x91, 0x37, 0x6C, 0x2A, 0x90, 0x87, 0x5D, 0x3E, 0xAA, 0xDB, 0x45, 0x55, 0xEC, 0x79, 0x03,
+    0x03, 0x22, 0x3B, 0x61, 0x73, 0xBD, 0x53, 0xF3, 0x5A, 0x9B, 0xD4, 0xB4, 0x0E, 0x2C, 0x68, 0x5F,
+    0x5D, 0x1B, 0xCC, 0xD6, 0x11, 0x7B, 0xA0, 0x4A, 0xB6, 0xD0, 0x56, 0xD0, 0x26, 0xC1, 0xFE, 0x3B,
+    0x05, 0x20, 0x05, 0xC0, 0xBA, 0xF4, 0xB7, 0x2B, 0x55, 0xE7, 0x69, 0x67, 0xB2, 0x7A, 0xB5, 0x59,
+    0x78, 0xB4, 0x3E, 0x80, 0x08, 0x20, 0xD8, 0x75, 0x28, 0xF1, 0x21, 0xFE, 0xA3, 0x86, 0xD1, 0x21,
+    0x76, 0x1F, 0xA6, 0x95, 0x60, 0xA7, 0x5E, 0xB5, 0x68, 0x25, 0xB7, 0x02, 0x56, 0xDA, 0xF8, 0x6D,
+    0xE3, 0x79, 0x31, 0x63, 0x76, 0xC4, 0x9B, 0x16, 0x08, 0xCA, 0xA8, 0xBA, 0xA0, 0x5A, 0x9A, 0x76,
+    0x3D, 0x09, 0x80, 0x54, 0x89, 0x50, 0xFC, 0x4F, 0x04, 0x52, 0x2C, 0xAB, 0x01, 0x3B, 0x52, 0xA7,
+    0x7E, 0x4F, 0x0C, 0x08, 0xE2, 0x18, 0x6F, 0xC6, 0xDF, 0x77, 0x09, 0xE4, 0x21, 0x5E, 0xD7, 0xE2,
+    0x4A, 0x15, 0x1C, 0xB5, 0xFD, 0x6F, 0x4D, 0xC6, 0xC8, 0x97, 0x26, 0x9F, 0x7C, 0x97, 0xE8, 0x05,
+    0x4C, 0x89, 0xC3, 0xA6, 0x89, 0x38, 0x11, 0xAB, 0xEC, 0x7E, 0xF4, 0x4C, 0xE1, 0x3A, 0x37, 0x24,
+    0x57, 0xD9, 0x93, 0xCE, 0x9E, 0xC8, 0x22, 0x78, 0xBB, 0xDB, 0x35, 0x99, 0xFB, 0x82, 0xF4, 0x56,
+    0x3B, 0x4B, 0x72, 0xE3, 0xF1, 0x48, 0xF3, 0xFE, 0x4B, 0x08, 0xAB, 0x33, 0xF7, 0x30, 0x57, 0xB1,
+    0x9E, 0xF0, 0xE1, 0xCD, 0x11, 0x7D, 0xD2, 0x1B, 0x33, 0xE8, 0x22, 0xF2, 0xA4, 0x90, 0xB7, 0xD1,
+    0xFA, 0xA9, 0xB3, 0x23, 0x0F, 0x0F, 0xF4, 0x56, 0x9C, 0x15, 0x31, 0x59, 0x2C, 0x6F, 0xE4, 0xD6,
+    0x3A, 0xB4, 0x06, 0xCF, 0x80, 0xDD, 0xAE, 0x6F, 0x9B, 0x54, 0x74, 0x31, 0x66, 0xF5, 0x1F, 0x41,
+    0x0B, 0x4B, 0x19, 0x11, 0xA7, 0x7B, 0x58, 0x29, 0x96, 0x83, 0x44, 0x54, 0x63, 0xAF, 0x09, 0x6B,
+    0xA4, 0xFE, 0x03, 0xCC, 0xA8, 0xCA, 0x4A, 0xDC, 0xD9, 0x95, 0x56, 0xEB, 0x2E, 0x79, 0x7C, 0xCE,
+    0xDC, 0x14, 0x26, 0xF5, 0x94, 0x9D, 0x9D, 0xD1, 0x95, 0x09, 0x8B, 0x2E, 0x21, 0xA0, 0x96, 0xC5,
+    0x4E, 0x09, 0xA0, 0x35, 0x92, 0xAA, 0x95, 0x3C, 0x30, 0xE7, 0xC7, 0x6A, 0x7B, 0xB1, 0x62, 0x01,
+    0x7D, 0x62, 0x78, 0x77, 0x62, 0xE6, 0x08, 0x63, 0x77, 0x5E, 0xE1, 0x0A, 0xFD, 0xB5, 0x08, 0xE1,
+    0xED, 0x79, 0x27, 0xD9, 0xB8, 0x1D, 0xB6, 0xBA, 0x3D, 0x6C, 0xA0, 0xB5, 0xA6, 0xE1, 0x92, 0x18,
+    0x15, 0xC9, 0x25, 0x25, 0xF6, 0x21, 0x7A, 0x4E, 0x2E, 0x18, 0x08, 0x8D, 0x54, 0x79, 0x35, 0xED,
+    0x76, 0x2F, 0x39, 0xB1, 0x38, 0x38, 0x9F, 0xB6, 0xF4, 0x2D, 0xBF, 0x55, 0x64, 0x3F, 0xEB, 0x49,
+    0x17, 0x5D, 0xEC, 0x07, 0xC1, 0x08, 0x4E, 0x75, 0xE7, 0xE8, 0xF7, 0xA3, 0xB5, 0x63, 0x01, 0x27,
+    0xCF, 0xF5, 0x39, 0xDD, 0x65, 0x38, 0x4C, 0xD4, 0xE3, 0xAA, 0xAD, 0x55, 0xD3, 0x3C, 0x6E, 0xC4,
+    0x99, 0x09, 0x3E, 0xD1, 0xA5, 0x0B, 0xEF, 0xF2, 0x08, 0xA1, 0xBE, 0xD8, 0xE0, 0x7C, 0x58, 0xB9,
+    0x9E, 0x2E, 0x95, 0x4A, 0xAA, 0x1D, 0xEE, 0xE3, 0x2F, 0x6A, 0xE2, 0x94, 0x70, 0xC4, 0x1C, 0x07,
+    0xCC, 0x76, 0xE0, 0x40, 0xEA, 0x6D, 0xB4, 0x83, 0xA0, 0x6A, 0x97, 0x76, 0x84, 0x11, 0x40, 0x9F,
+    0xCA, 0x18, 0x00, 0x6F, 0x7D, 0x07, 0xBE, 0xC9, 0xFC, 0x2D, 0xD7, 0xAF, 0x60, 0x76, 0xC9, 0xD8,
+    0x28, 0xC2, 0xC8, 0xA8, 0xD7, 0x60, 0x90, 0x64, 0x6C, 0xED, 0xEE, 0xFD, 0x2C, 0xD1, 0x3F, 0x35,
+    0xD4, 0xCB, 0xA0, 0x34, 0xAA, 0xB0, 0x3A, 0x91, 0x07, 0x1B, 0xD4, 0xB5, 0x33, 0xD2, 0xD3, 0x9D,
+    0x08, 0xCD, 0x45, 0x01, 0x83, 0x04, 0xB1, 0xE7, 0x0C, 0x1A, 0x57, 0x9F, 0xBB, 0xED, 0x37, 0x46,
+    0xB1, 0x16, 0x87, 0x3C, 0x20, 0xDE, 0x63, 0x10, 0xAF, 0x2D, 0x77, 0x71, 0x56, 0xEF, 0x7C, 0x14,
+    0xD0, 0xE3, 0x1E, 0xFB, 0x1F, 0x77, 0x18, 0x1E, 0xA8, 0xD3, 0x40, 0xA7, 0xD7, 0x1F, 0x36, 0x7D,
+    0x87, 0x1C, 0x42, 0xF6, 0x2F, 0x51, 0xAF, 0x69, 0x2C, 0xCF, 0x79, 0x11, 0xD1, 0x17, 0x47, 0xD3,
+    0x44, 0x86, 0x9D, 0x2B, 0x44, 0xA3, 0x74, 0x1C, 0x83, 0x75, 0xAB, 0xD1, 0xA5, 0xFE, 0x14, 0x0A,
+    0x41, 0x76, 0x89, 0x1B, 0x08, 0x4F, 0x29, 0x30, 0x82, 0xD1, 0xFE, 0xD6, 0x0B, 0x71, 0xCD, 0x2C,
+    0x8E, 0x31, 0x69, 0xAF, 0xD8, 0x67, 0xA6, 0x1A, 0x8E, 0x2A, 0xD4, 0xF1, 0x83, 0xC3, 0xEC, 0x08,
+    0x76, 0x27, 0xA3, 0xB5, 0xF6, 0x7B, 0xC2, 0x6F, 0xEA, 0xD0, 0x52, 0x6C, 0x6E, 0x2F, 0x18, 0xBB,
+    0x23, 0x10, 0x3E, 0x7F, 0x37, 0x90, 0x89, 0x7E, 0xF4, 0xBA, 0x47, 0x09, 0xCE, 0x80, 0x34, 0x5D,
+    0x20, 0x87, 0x1F, 0x76, 0x30, 0xBF, 0xC3, 0xFC, 0x3C, 0xB3, 0x88, 0x89, 0xC9, 0x3D, 0xA4, 0xF4,
+    0xCE, 0x7E, 0x93, 0xA6, 0x88, 0xFA, 0xAC, 0x32, 0x64, 0x19, 0x76, 0xE7, 0xE0, 0xAE, 0x4B, 0x4F,
+    0xC3, 0xAC, 0x82, 0xD9, 0xDB, 0x3D, 0xBE, 0x3E, 0x58, 0x4B, 0xBF, 0xD0, 0x17, 0x43, 0xEC, 0x17,
+    0xEA, 0xFA, 0xA9, 0x6F, 0x9A, 0x33, 0xC2, 0xB9, 0xDC, 0xFF, 0x80, 0x14, 0x9D, 0xD6, 0xA1, 0x41,
+    0x7F, 0xFE, 0x08, 0x57, 0x21, 0xD6, 0xEB, 0xED, 0xEF, 0xA2, 0xAD, 0x5D, 0x9E, 0xC5, 0x31, 0xC6,
+    0xBE, 0x73, 0xB9, 0x7D, 0x58, 0x12, 0x28, 0x35, 0x0A, 0xB7, 0x56, 0x9A, 0x23, 0x61, 0x0B, 0x3B,
+    0x8D, 0x20, 0x35, 0xC7, 0xBF, 0xB1, 0xCE, 0x33, 0x28, 0xEC, 0x2F, 0x71, 0x49, 0xE1, 0x90, 0x36,
+    0x53, 0x9D, 0x19, 0xB1, 0xBB, 0xFF, 0xF4, 0x50, 0x89, 0xE8, 0x69, 0x88, 0xAF, 0xB6, 0x58, 0x46,
+    0xDF, 0x73, 0xEC, 0x5B, 0x82, 0xA6, 0xDC, 0x18, 0x71, 0x81, 0xE3, 0x03, 0x25, 0x71, 0x0E, 0x0B,
+    0xB5, 0x63, 0x67, 0x1A, 0xD1, 0x13, 0x0A, 0xE5, 0xFF, 0x4B, 0x97, 0xEA, 0xBB, 0x75, 0xD7, 0x31,
+    0xCD, 0x4B, 0x06, 0xBD, 0x6E, 0xB1, 0xA1, 0xD9, 0x30, 0x52, 0x8F, 0xF4, 0x4C, 0x51, 0x16, 0x72,
+    0x73, 0x81, 0x48, 0x88, 0x3F, 0x9B, 0x80, 0x40, 0xDD, 0xE7, 0xA4, 0x98, 0xC3, 0xB6, 0x7A, 0xF9,
+    0x91, 0xA1, 0xB1, 0xBB, 0x1D, 0x16, 0x3D, 0x13, 0xF9, 0x7D, 0xD9, 0x31, 0xE6, 0x19, 0x83, 0xCF,
+    0xA6, 0x59, 0xC9, 0x8F, 0xF7, 0x1E, 0xA3, 0x9C, 0x2B, 0x65, 0x9D, 0x21, 0x5B, 0x7C, 0xA4, 0x4D,
+    0x07, 0x24, 0x99, 0xA2, 0x51, 0xDF, 0x4D, 0x5F, 0xB6, 0xB0, 0x17, 0xAA, 0xEF, 0x16, 0xAB, 0x45,
+    0xAA, 0xD2, 0xA0, 0xBC, 0x09, 0x1B, 0x9A, 0x3C, 0x27, 0x86, 0xE0, 0xAD, 0x9E, 0xE4, 0x4D, 0x73,
+    0x09, 0x88, 0xCC, 0x55, 0x2A, 0x8A, 0x33, 0x29, 0x84, 0xD1, 0x8D, 0xF6, 0xE6, 0xDF, 0x27, 0x70,
+    0xA0, 0xD6, 0x5B, 0x31, 0xEE, 0x7E, 0x7A, 0x31, 0x87, 0xF2, 0xCC, 0x4C, 0xBE, 0x63, 0xC1, 0x41,
+    0xC6, 0x39, 0xFA, 0x3B, 0x9A, 0x60, 0x05, 0x29, 0xDF, 0x91, 0x9E, 0x3B, 0x7B, 0xDB, 0x8F, 0x6E,
+    0xFB, 0x0F, 0xF1, 0x20, 0xC7, 0x08, 0x47, 0x2A, 0x14, 0xB4, 0x7C, 0x93, 0xEB, 0x63, 0xE3, 0x03,
+    0xC7, 0x4D, 0x9F, 0x7D, 0x29, 0x7F, 0xC3, 0x03, 0x44, 0x89, 0x22, 0x8D, 0x2D, 0xF1, 0x86, 0xCB,
+    0x28, 0xBE, 0x39, 0xAC, 0x16, 0xBB, 0x73, 0xB2, 0x44, 0xC6, 0xA5, 0x63, 0x06, 0xE2, 0xED, 0x76,
+    0x95, 0x73, 0x02, 0xCE, 0x6A, 0x7E, 0x55, 0x2D, 0x2A, 0x1D, 0x78, 0x30, 0x3B, 0x0A, 0xAB, 0x3A,
+    0xDB, 0x21, 0xD8, 0x6D, 0xA4, 0xBE, 0xAD, 0x07, 0xD1, 0x08, 0xAC, 0x26, 0xBC, 0x4F, 0x50, 0x31,
+    0xA2, 0xDA, 0x18, 0x75, 0xA2, 0xE9, 0x1D, 0x93, 0xB6, 0x34, 0x01, 0xA5, 0xE9, 0xBE, 0x94, 0x7B,
+    0x33, 0x61, 0x7C, 0x71, 0xE3, 0x72, 0x78, 0x45, 0x3D, 0x2A, 0x7A, 0x87, 0x5B, 0x8D, 0x4E, 0xF8,
+    0x79, 0x01, 0xF6, 0x49, 0x5B, 0x9B, 0xBD, 0xB8, 0xC8, 0xAE, 0xBD, 0xC2, 0x5D, 0x14, 0x8B, 0x51,
+    0x4F, 0x86, 0x56, 0xB2, 0xD8, 0xF5, 0x5C, 0x0F, 0x38, 0xDC, 0x30, 0x15, 0x2B, 0x6A, 0x15, 0x98,
+    0x08, 0x23, 0x5A, 0xEA, 0x1E, 0xCA, 0xC7, 0xAC, 0x74, 0x26, 0xD0, 0x7C, 0xC6, 0x75, 0x1A, 0x67,
+    0x1E, 0xD3, 0xD3, 0x26, 0x9F, 0x82, 0x2E, 0x90, 0x5D, 0x50, 0xD1, 0x4F, 0x2B, 0x79, 0x5C, 0xCE,
+    0x4A, 0x8F, 0x9F, 0xBB, 0x60, 0xD4, 0x21, 0x92, 0x63, 0x3E, 0xBC, 0x77, 0x57, 0x0E, 0xC0, 0x56,
+    0x62, 0x6F, 0x47, 0x75, 0x88, 0xF0, 0x87, 0xA3, 0xCC, 0x1F, 0x12, 0xCC, 0xA2, 0x0B, 0x74, 0x19,
+    0xEE, 0xD6, 0x2F, 0x5C, 0x34, 0x06, 0x50, 0x7D, 0xBB, 0xB6, 0x21, 0xDB, 0xB4, 0xB1, 0x8C, 0x88,
+    0x42, 0x8E, 0x3B, 0xBF, 0x89, 0x5F, 0x89, 0x77, 0x5A, 0x46, 0xE4, 0x02, 0xE4, 0x48, 0xBB, 0xA9,
+    0x3F, 0x09, 0xAA, 0x1F, 0x62, 0x98, 0xF8, 0xE6, 0xCD, 0x62, 0xCB, 0xF7, 0xD0, 0x1D, 0xA4, 0x7A,
+    0x18, 0x0A, 0x0D, 0x44, 0x6C, 0x14, 0xDB, 0x97, 0x94, 0xCA, 0x98, 0x7F, 0x60, 0x36, 0x1E, 0x13,
+    0x52, 0xE8, 0x7F, 0x18, 0xEE, 0x99, 0xFA, 0xCB, 0x23, 0x5D, 0xB1, 0x2B, 0xA1, 0xFE, 0xD6, 0xB0,
+    0x77, 0x13, 0xE4, 0x55, 0xCC, 0x56, 0xFA, 0x8E, 0x29, 0x25, 0xA9, 0xDF, 0x81, 0x58, 0xEE, 0xB6,
+    0x3B, 0xC2, 0x29, 0xB4, 0x1E, 0x72, 0xCA, 0x55, 0xD3, 0x7B, 0xA6, 0xDD, 0x48, 0x96, 0x3B, 0x76,
+    0x3A, 0x41, 0xF3, 0x2A, 0x94, 0x13, 0xF3, 0x51, 0xC3, 0x00, 0x09, 0x4F, 0x88, 0xBA, 0x24, 0xD1,
+    0x14, 0x12, 0x14, 0x2D, 0xC1, 0xAB, 0x3B, 0x21, 0x54, 0x8B, 0x4C, 0xDC, 0x17, 0x08, 0x1E, 0xE8,
+    0x83, 0x4A, 0x3E, 0x25, 0x0E, 0x7B, 0xBC, 0xD5, 0xC7, 0xCA, 0x13, 0x31, 0x1B, 0xD8, 0x8F, 0xE2,
+    0x4A, 0x23, 0x24, 0xA9, 0x69, 0xF4, 0x8E, 0x65, 0xB2, 0xEF, 0xA1, 0x83, 0xFF, 0xBF, 0x01, 0xE7,
+    0x8B, 0xFC, 0xD1, 0x92, 0x91, 0xCF, 0x3D, 0xB7, 0x49, 0x3B, 0xF5, 0x81, 0x54, 0xB1, 0xFF, 0xB6,
+    0xD9, 0x2C, 0x31, 0xA1, 0xC0, 0x8F, 0x56, 0x54, 0x52, 0x5B, 0x7D, 0x80, 0x61, 0x44, 0x44, 0x8C,
+    0xC4, 0xFA, 0x8E, 0x59, 0xDE, 0xA1, 0xC5, 0xFB, 0xF7, 0x40, 0xE7, 0xD6, 0x06, 0x55, 0xC3, 0x19,
+    0x73, 0x21, 0xFD, 0x86, 0x8C, 0x68, 0x1B, 0x37, 0x7A, 0xC9, 0xC4, 0x70, 0x07, 0x38, 0x15, 0x03,
+    0xA7, 0x2A, 0xBD, 0x37, 0x8A, 0xD0, 0x63, 0x13, 0x66, 0xEA, 0x9D, 0x65, 0x67, 0x87, 0x78, 0xE8,
+    0xD2, 0x7E, 0xDB, 0x90, 0xA2, 0xAC, 0x9F, 0xAC, 0x7A, 0x81, 0xF1, 0x5F, 0x4C, 0x6C, 0x53, 0x0C,
+    0xD5, 0x9E, 0x64, 0x1D, 0xD1, 0x85, 0x5D, 0x65, 0x54, 0x9C, 0xE5, 0x20, 0xF7, 0xE5, 0x9C, 0x03,
+    0x29, 0x71, 0x9A, 0xE4, 0xC7, 0xD1, 0x91, 0x07, 0x66, 0x60, 0x89, 0x37, 0xF9, 0x3F, 0x58, 0x7D,
+    0x07, 0x06, 0xCC, 0xEE, 0x05, 0x49, 0xEA, 0x50, 0xD7, 0x4A, 0x76, 0x63, 0x16, 0x66, 0xE3, 0x1D,
+    0xDC, 0xCA, 0x3B, 0x0B, 0x89, 0x4C, 0xF8, 0x04, 0xD2, 0x50, 0x62, 0x2C, 0x1B, 0x7E, 0x62, 0x8B,
+    0x7B, 0x55, 0x68, 0x3F, 0xAC, 0xD0, 0x5E, 0xB4, 0xF8, 0x25, 0xE5, 0xEA, 0x40, 0xA4, 0x06, 0x7B,
+    0xA3, 0xC6, 0x8B, 0xE1, 0x4A, 0x83, 0x4B, 0xCC, 0x9C, 0xDA, 0x7C, 0x9F, 0xF6, 0xE7, 0x7A, 0xC2,
+    0xDD, 0x9E, 0x2F, 0xB4, 0x3A, 0x07, 0xBA, 0x47, 0x83, 0x43, 0x79, 0xBE, 0x69, 0x19, 0x02, 0x48,
+    0x03, 0x22, 0x10, 0xAE, 0x99, 0x80, 0xEE, 0xB0, 0xDE, 0xBA, 0xC1, 0x51, 0x4B, 0xF4, 0x2E, 0x61,
+    0xB0, 0xF9, 0x1B, 0x88, 0x6D, 0x92, 0x8B, 0x36, 0x30, 0x92, 0x32, 0x0A, 0xE8, 0xA5, 0x79, 0xAC,
+    0x27, 0x18, 0xE9, 0x67, 0x4B, 0xBC, 0x12, 0xE5, 0xB3, 0x66, 0x19, 0xD8, 0xFC, 0x62, 0x55, 0xF0,
+    0x59, 0xFB, 0x58, 0x57, 0x15, 0xB9, 0x15, 0x89, 0x32, 0xAA, 0xA1, 0x0F, 0xC7, 0xD8, 0xFB, 0xD5,
+    0x6E, 0x94, 0xB8, 0xE3, 0xC7, 0x7B, 0x76, 0x25, 0x0D, 0xB1, 0xD7, 0x2D, 0x26, 0x5E, 0xCA, 0x88,
+    0xA3, 0x96, 0xD8, 0x1C, 0xBC, 0x31, 0x34, 0x6A, 0xBA, 0x99, 0x64, 0x51, 0xEF, 0x4C, 0xB4, 0x6A,
+    0x06, 0xEB, 0x4F, 0x98, 0x95, 0x56, 0x75, 0x6F, 0x74, 0x86, 0x22, 0x53, 0x9C, 0x0A, 0x1E, 0x4D,
+    0xF0, 0xB0, 0xD5, 0x1B, 0x85, 0x8F, 0xD6, 0x37, 0xE1, 0x25, 0x66, 0x5E, 0xE9, 0x89, 0x8F, 0x51,
+    0x51, 0x8D, 0x76, 0x99, 0xD7, 0xBC, 0x17, 0xEE, 0xF6, 0x6B, 0x3F, 0xCF, 0x56, 0x31, 0x50, 0x77,
+    0x84, 0x1E, 0xFB, 0x4D, 0x5A, 0x35, 0xBE, 0xE3, 0xAF, 0x88, 0xC3, 0xAC, 0x22, 0xDF, 0x56, 0x58,
+    0x34, 0x52, 0x8A, 0xCA, 0xE7, 0x9D, 0x76, 0xD4, 0xB8, 0x86, 0xFB, 0xD9, 0xBD, 0x59, 0xEC, 0x84,
+    0x29, 0x06, 0x0E, 0x65, 0x65, 0x18, 0x50, 0x57, 0xE5, 0xCC, 0xA2, 0xBB, 0x1A, 0x85, 0xF6, 0xFD,
+    0xBA, 0x40, 0xA8, 0x1E, 0x52, 0xAD, 0x36, 0x12, 0xC7, 0xF1, 0x9B, 0xEA, 0x50, 0xA0, 0xFA, 0x99,
+    0x54, 0xF5, 0xD0, 0xFA, 0xDA, 0xEC, 0x70, 0xC8, 0x21, 0xA0, 0xEA, 0xEF, 0xC0, 0x51, 0x26, 0x3A,
+    0x13, 0xD6, 0x4C, 0x95, 0xC5, 0x07, 0xA1, 0xA8, 0x3B, 0x63, 0x8A, 0x4E, 0xAE, 0xE8, 0xA4, 0x68,
+    0x8E, 0xA3, 0x13, 0xD9, 0x13, 0xDF, 0xA2, 0xB3, 0xEF, 0x9F, 0x4E, 0x0D, 0x00, 0xB2, 0xC2, 0x40,
+    0xBE, 0x0D, 0xD1, 0x59, 0x20, 0x1F, 0x27, 0x2D, 0x99, 0xEE, 0x1D, 0x05, 0xD7, 0x7D, 0x2A, 0xA3,
+    0x86, 0x44, 0x54, 0x28, 0x8A, 0x31, 0x1C, 0x66, 0xFB, 0x9F, 0x68, 0xE8, 0xCA, 0xEB, 0x74, 0x9A,
+    0xAC, 0x77, 0x2F, 0xF4, 0xCF, 0x9D, 0x48, 0xA9, 0x8F, 0xB2, 0x9F, 0x74, 0x9F, 0x75, 0xE3, 0x88,
+    0x42, 0xB1, 0x5F, 0x7C, 0xEE, 0xED, 0x7E, 0x5A, 0xB0, 0x62, 0xCD, 0x2F, 0x95, 0x68, 0x2F, 0xF2,
+    0x58, 0x29, 0x8A, 0x22, 0x31, 0xC8, 0x82, 0x75, 0x51, 0x9B, 0xF7, 0xE3, 0x59, 0x52, 0xD9, 0x5B,
+    0xDE, 0x49, 0x54, 0x22, 0xD1, 0xF2, 0xF6, 0xB0, 0x0B, 0xB8, 0x4E, 0x08, 0x43, 0xF9, 0xEA, 0x98,
+    0xB4, 0xE3, 0x10, 0xB7, 0x8B, 0x79, 0x2C, 0x86, 0xAC, 0x75, 0x80, 0x6A, 0xC2, 0x18, 0x43, 0x06,
+    0x5E, 0xB9, 0x80, 0xA9, 0x87, 0x02, 0x9A, 0xF5, 0x57, 0x73, 0xA2, 0x68, 0x49, 0x4E, 0xEF, 0x2D,
+    0x48, 0x7F, 0x0B, 0x0C, 0x91, 0x35, 0x8A, 0x20, 0x7F, 0xB2, 0xD8, 0x7A, 0x88, 0x70, 0xC3, 0xA7,
+    0x37, 0xC4, 0x68, 0x21, 0x3E, 0x55, 0x91, 0x88, 0x07, 0x2C, 0x0F, 0xC6, 0xB3, 0x49, 0x7F, 0x85,
+    0xFB, 0xFF, 0x2D, 0x7E, 0x78, 0x13, 0xB7, 0xD5, 0x69, 0x21, 0xB7, 0x7C, 0xAF, 0x20, 0x14, 0xFD,
+    0xD9, 0x9C, 0xA8, 0xB2, 0x2F, 0xFE, 0x28, 0x8B, 0xF3, 0x66, 0xF0, 0xA5, 0xED, 0x8E, 0x1B, 0x1C,
+    0xF8, 0x24, 0x67, 0xB7, 0xE6, 0x06, 0x33, 0xC6, 0x60, 0x28, 0x6A, 0xE6, 0xB8, 0xA1, 0xCF, 0x9B,
+    0x15, 0x41, 0xA4, 0x7A, 0x7F, 0xAD, 0xF4, 0x8A, 0x1F, 0xE1, 0x77, 0x07, 0x51, 0x66, 0x8C, 0x6B,
+    0x35, 0x81, 0x60, 0x66, 0x8D, 0x58, 0xA1, 0xDF, 0xAA, 0x0C, 0x3B, 0x9A, 0x70, 0x0F, 0x1F, 0x06,
+    0x67, 0xC2, 0x0C, 0x6E, 0xD1, 0xFC, 0x93, 0x5C, 0xC7, 0x1F, 0x19, 0x59, 0x70, 0x6C, 0x5C, 0xC8,
+    0xFA, 0x9C, 0xFB, 0xB2, 0x46, 0x98, 0x5F, 0x1F, 0x80, 0x7B, 0x8D, 0x16, 0x2D, 0x2A, 0x03, 0xF6,
+    0x27, 0xCB, 0x11, 0xAE, 0x9D, 0xE5, 0x36, 0xDD, 0x20, 0x52, 0x53, 0xD7, 0x66, 0x22, 0x4F, 0x51,
+    0xE1, 0x2B, 0x7E, 0xF1, 0x9A, 0xAC, 0xBC, 0x8A, 0x6D, 0x78, 0x60, 0x62, 0x20, 0xB3, 0xA2, 0x1E,
+    0xA5, 0x68, 0x1A, 0x29, 0x45, 0x25, 0x7E, 0xF8, 0x50, 0x62, 0xED, 0x4E, 0x06, 0x44, 0x2A, 0x79,
+    0xF4, 0x52, 0xD0, 0x4F, 0x2C, 0x2F, 0xC6, 0xFF, 0x74, 0xE2, 0x5B, 0x13, 0x4C, 0x99, 0xB5, 0x7D,
+    0x0D, 0x01, 0x66, 0x77, 0x3C, 0x74, 0x38, 0x11, 0xFE, 0x1F, 0x31, 0xAA, 0xF4, 0xAF, 0x42, 0x7D,
+    0xC7, 0x62, 0xA1, 0xA2, 0xBB, 0xFE, 0xE9, 0x89, 0x8F, 0x3D, 0x0B, 0xE4, 0xA0, 0x5B, 0xA1, 0x18,
+    0x87, 0x36, 0xA0, 0x75, 0x06, 0xA8, 0x83, 0x00, 0xF3, 0x5B, 0x83, 0x3E, 0x42, 0xFA, 0x09, 0x4C,
+    0x35, 0x27, 0xA7, 0xB0, 0x00, 0xDA, 0x8C, 0x8E, 0x1A, 0x51, 0x9B, 0x5A, 0x8F, 0x05, 0x9A, 0xBD,
+    0xCB, 0x10, 0x12, 0x4D, 0x17, 0xE5, 0x78, 0xDF, 0xE7, 0x49, 0x5D, 0xB0, 0x78, 0x5F, 0x44, 0xE1,
+    0xDB, 0xE9, 0x84, 0xD9, 0x90, 0xAD, 0xBE, 0x86, 0x95, 0x81, 0xC1, 0xCD, 0x1B, 0xD4, 0xCE, 0x6D,
+    0x5E, 0xB3, 0x52, 0xB1, 0x67, 0x5E, 0xF2, 0xE4, 0xC5, 0xCB, 0x5C, 0xC6, 0x57, 0xBE, 0x1C, 0x0E,
+    0xDE, 0x7B, 0xD3, 0xB3, 0x01, 0xDC, 0x1F, 0x11, 0x12, 0xFC, 0x62, 0x9B, 0xFD, 0xF8, 0x8C, 0xDC,
+    0xE4, 0x35, 0x22, 0x61, 0x0E, 0xA0, 0x80, 0xF9, 0x48, 0xFC, 0x1C, 0x36, 0x2A, 0x02, 0x4A, 0xDC,
+    0x55, 0xE2, 0x35, 0xC8, 0xB4, 0x2E, 0xED, 0x43, 0x11, 0x31, 0x6C, 0xFB, 0x77, 0x68, 0x5E, 0xC6,
+    0x72, 0x37, 0x08, 0x5A, 0xC4, 0x98, 0x23, 0x9E, 0x0A, 0xE3, 0x82, 0x1B, 0xCA, 0xDE, 0x3F, 0xBE,
+    0xF0, 0x74, 0x6C, 0x9E, 0x16, 0x9B, 0x41, 0xC9, 0x79, 0xB9, 0x82, 0x9D, 0x66, 0x60, 0x09, 0xBD,
+    0x46, 0x2F, 0xDC, 0xF8, 0xC9, 0xB8, 0x0B, 0xB6, 0xEB, 0x30, 0xD1, 0xAD, 0x93, 0xB4, 0xE3, 0xD1,
+    0xE6, 0x35, 0xE1, 0x6B, 0xC7, 0x49, 0x47, 0xAE, 0xF1, 0x7A, 0x7A, 0x2E, 0xAE, 0xF8, 0xEC, 0x5D,
+    0x62, 0x67, 0xFD, 0x9D, 0x18, 0x74, 0xBA, 0xA6, 0xA8, 0xA8, 0x6E, 0xD8, 0xBF, 0x24, 0xCA, 0x74,
+    0x51, 0xE1, 0x6A, 0x8B, 0xAC, 0x96, 0x43, 0xC5, 0x75, 0x60, 0xAE, 0xA9, 0xCC, 0x89, 0x06, 0xA9,
+    0x6C, 0xEA, 0x47, 0x53, 0x60, 0x21, 0x7A, 0x38, 0xD4, 0xE4, 0x8A, 0xE6, 0x86, 0xAB, 0x36, 0x39,
+    0x2F, 0xEA, 0x08, 0xC1, 0x32, 0xDA, 0xA2, 0xC4, 0xD5, 0xB2, 0xC0, 0x12, 0x37, 0x9E, 0xDC, 0xBA,
+    0xC4, 0xF6, 0x8D, 0xDF, 0xA1, 0x9A, 0x3B, 0x70, 0xE9, 0x9F, 0x4E, 0xD1, 0xE1, 0x27, 0x52, 0x27,
+    0x69, 0x57, 0xFF, 0x63, 0xF6, 0x68, 0xF5, 0xF1, 0x42, 0x31, 0xE5, 0x05, 0xD2, 0xB7, 0xB5, 0x21,
+    0xB9, 0xCE, 0x5D, 0xD4, 0xBB, 0xFE, 0xC5, 0x09, 0x8E, 0x98, 0xAA, 0xE7, 0x9D, 0xE4, 0x92, 0x42,
+    0x7C, 0x2F, 0xC2, 0xC8, 0x05, 0xE0, 0xF7, 0xC5, 0xD5, 0xFA, 0xC7, 0x9E, 0x75, 0x32, 0x7A, 0x7C,
+    0x18, 0x08, 0xB8, 0x90, 0xDE, 0x09, 0xF1, 0x15, 0xA5, 0x6F, 0xFC, 0xE2, 0xAD, 0x97, 0x9A, 0x63,
+    0x55, 0xDB, 0x2E, 0x0A, 0xFC, 0x2C, 0x3B, 0xD0, 0x47, 0xC4, 0xF1, 0x06, 0x32, 0xF0, 0x5D, 0xC9,
+    0xC9, 0x87, 0x13, 0xC0, 0x67, 0xC4, 0x8B, 0x76, 0x80, 0x62, 0x60, 0xC9, 0x3B, 0x0C, 0x81, 0x51,
+    0x00, 0xFD, 0xF6, 0x9B, 0xE4, 0xF9, 0xC1, 0x03, 0xBB, 0x0F, 0x5D, 0xE3, 0xAC, 0xE6, 0x1F, 0x49,
+    0xB5, 0x3C, 0x3E, 0x60, 0xC7, 0xC5, 0xD3, 0xB8, 0xAF, 0x07, 0xDF, 0x60, 0x4B, 0x19, 0xB5, 0x90,
+    0x33, 0x41, 0x61, 0x75, 0xDB, 0x50, 0xD4, 0xB6, 0x63, 0xFA, 0xF9, 0x83, 0x06, 0xBC, 0x4E, 0xF2,
+    0x53, 0xF0, 0xDC, 0xB8, 0xD5, 0x9B, 0x63, 0xEE, 0xF3, 0x92, 0x68, 0xBB, 0xCB, 0xC3, 0x08, 0x7E,
+    0x12, 0x4A, 0x8A, 0x48, 0xF9, 0xED, 0xA7, 0x6A, 0xCE, 0xDE, 0x0D, 0x7A, 0xED, 0x2E, 0xA4, 0x75,
+    0x6C, 0x94, 0xB3, 0x0A, 0xF1, 0x3E, 0xA4, 0xE6, 0x8F, 0x34, 0x13, 0x0E, 0xC7, 0xCE, 0x6B, 0x82,
+    0x5D, 0xD3, 0xD2, 0x79, 0x7B, 0x6F, 0xB5, 0x00, 0x8B, 0xD6, 0x47, 0x95, 0x98, 0xDD, 0x56, 0xBC,
+    0x8C, 0x40, 0x3B, 0x5A, 0x65, 0x88, 0x9F, 0xF5, 0x6F, 0x96, 0x32, 0x40, 0x31, 0xAC, 0x3F, 0x18,
+    0x22, 0xE2, 0xDB, 0xD1, 0xF7, 0xAD, 0x48, 0x20, 0x31, 0x8D, 0x3F, 0xD0, 0xC9, 0x88, 0x7F, 0x94,
+    0x34, 0x69, 0xBC, 0xEE, 0xB2, 0x5B, 0x42, 0x82, 0x31, 0xBC, 0x83, 0xBD, 0x2C, 0x5A, 0x57, 0x74,
+    0x94, 0x29, 0xC4, 0xD0, 0x18, 0x8B, 0x2C, 0xAA, 0x09, 0x14, 0x99, 0x33, 0xD0, 0xDA, 0xD8, 0xCD,
+    0xED, 0x75, 0xBD, 0x69, 0xAA, 0x34, 0xD8, 0x4B, 0x3D, 0xC2, 0xC0, 0x69, 0x7F, 0x2F, 0x0B, 0xDE,
+    0x23, 0xEE, 0xB1, 0x7C, 0xD8, 0x5A, 0x7C, 0x0C, 0x45, 0x89, 0x08, 0x21, 0xE4, 0x23, 0x99, 0x75,
+    0xFC, 0x0C, 0xF1, 0x59, 0x19, 0x07, 0xA9, 0xA9, 0x5E, 0x48, 0xEB, 0xCD, 0x10, 0x61, 0xC2, 0xEB,
+    0x60, 0x74, 0x34, 0x80, 0xC2, 0xAA, 0xEF, 0x35, 0x55, 0x19, 0x8A, 0x95, 0xE4, 0x4A, 0x88, 0x9E,
+    0x70, 0x73, 0x17, 0xA5, 0x75, 0xB6, 0xBC, 0x5E, 0x5E, 0xAC, 0x88, 0xA8, 0x4E, 0x54, 0x71, 0x4F,
+    0xB8, 0x84, 0xC2, 0xA3, 0xB5, 0x9D, 0x6C, 0xA2, 0x9B, 0x6C, 0x6F, 0xA6, 0xD8, 0xE6, 0x83, 0x5D,
+    0xC3, 0x01, 0x2F, 0xB5, 0xE0, 0xFF, 0x62, 0x52, 0xD4, 0x71, 0x8D, 0x2D, 0x72, 0x57, 0xF9, 0x90,
+    0xA7, 0x76, 0x3D, 0x47, 0x76, 0xDE, 0x7E, 0x1B, 0xFB, 0xA4, 0x44, 0x7A, 0xE1, 0xBC, 0xB9, 0x72,
+    0x3C, 0x42, 0xC6, 0x26, 0x0F, 0x70, 0xF1, 0xA6, 0x58, 0x91, 0xB1, 0xE7, 0xA1, 0x70, 0x13, 0x75,
+    0xFE, 0x2C, 0xC2, 0x11, 0x48, 0x19, 0x72, 0xDF, 0xD2, 0x1E, 0x5A, 0x35, 0xC9, 0x2B, 0xE6, 0x8E,
+    0xC6, 0x10, 0x9E, 0x6F, 0x67, 0xCF, 0x40, 0xB8, 0x7D, 0x60, 0x8A, 0xD9, 0x09, 0x59, 0xFD, 0x04,
+    0x51, 0xEB, 0xE7, 0x18, 0x8A, 0x77, 0x2C, 0x94, 0xA3, 0xA2, 0x82, 0xF2, 0x50, 0xA6, 0xD9, 0x9C,
+    0x55, 0x65, 0x94, 0xE9, 0x67, 0xC4, 0xE1, 0x34, 0x04, 0x22, 0x3F, 0x50, 0xAB, 0x1F, 0x0B, 0x94,
+    0xCC, 0x51, 0x35, 0x28, 0xF9, 0x88, 0xA0, 0xA0, 0xA3, 0xF1, 0x97, 0x00, 0xC2, 0x9C, 0x35, 0x01,
+    0xC1, 0x1B, 0x01, 0x49, 0x44, 0x4C, 0x06, 0xC9, 0x35, 0xA2, 0xEA, 0x93, 0x26, 0xF0, 0xCA, 0x07,
+    0x7E, 0x1E, 0xBB, 0xCB, 0x03, 0x27, 0x35, 0x2D, 0xF1, 0xE0, 0x15, 0x1D, 0xBE, 0xCE, 0x89, 0x3A,
+    0x65, 0xDA, 0x5B, 0xB8, 0x3C, 0xF7, 0xF1, 0x3C, 0xDC, 0xFA, 0xAA, 0xD0, 0x43, 0x72, 0x73, 0x94,
+    0x72, 0xD2, 0x10, 0x82, 0x32, 0x10, 0xB6, 0x05, 0x25, 0x16, 0x25, 0xD2, 0x10, 0x73, 0xFD, 0x97,
+    0x7B, 0x7D, 0x31, 0x25, 0x89, 0x26, 0x83, 0xF8, 0x78, 0x1B, 0x32, 0xFF, 0x35, 0x19, 0x91, 0x68,
+    0x3F, 0x1F, 0x78, 0x38, 0x83, 0xA0, 0x49, 0x63, 0x4F, 0x70, 0x04, 0xAD, 0x57, 0xBC, 0x9D, 0x6F,
+    0xBE, 0xDA, 0x56, 0xD1, 0xFF, 0xC2, 0x25, 0xA1, 0xF5, 0x39, 0xB3, 0xA8, 0x69, 0x0A, 0xD2, 0xB1,
+    0xA0, 0x4F, 0x16, 0xB3, 0x15, 0xF4, 0xDD, 0x59, 0x8C, 0xD3, 0x56, 0xDF, 0x11, 0x50, 0x33, 0x6D,
+    0x15, 0xB9, 0xCC, 0x89, 0xC9, 0x81, 0xC2, 0x7A, 0xCD, 0x1F, 0x04, 0x17, 0xDB, 0x2B, 0x80, 0xFA,
+    0xC8, 0x00, 0x94, 0xB1, 0x41, 0x42, 0xA8, 0x0F, 0x6D, 0x72, 0xCB, 0xA9, 0xBA, 0xBC, 0x19, 0x5E,
+    0x42, 0x70, 0x94, 0x1B, 0xA4, 0x16, 0x86, 0x04, 0xF7, 0x06, 0x6E, 0xC2, 0x4A, 0xBE, 0xD5, 0x27,
+    0x2A, 0x61, 0x1F, 0x56, 0x34, 0x31, 0x8D, 0x59, 0x57, 0x2B, 0x86, 0x01, 0xC3, 0x94, 0x62, 0x8A,
+    0x9C, 0x18, 0xB5, 0xDD, 0x52, 0xBC, 0x85, 0xB5, 0x09, 0x25, 0xBC, 0x36, 0x05, 0x3F, 0xE4, 0xA8,
+    0xC9, 0x4A, 0xA1, 0x7C, 0xEB, 0xC1, 0x12, 0x64, 0x05, 0xD4, 0x6A, 0x2D, 0x41, 0xBC, 0xC3, 0xF5,
+    0x57, 0x00, 0x4A, 0xB0, 0xFF, 0xD3, 0xD2, 0x51, 0x76, 0x71, 0x0E, 0xC4, 0x78, 0x01, 0xD8, 0xC1,
+    0xCA, 0xA4, 0x1B, 0xBB, 0xB5, 0x99, 0x50, 0xC7, 0xB9, 0xCD, 0x74, 0xAB, 0x09, 0x89, 0x07, 0x54,
+    0x3A, 0xEA, 0x76, 0xA5, 0xA7, 0xE9, 0x96, 0x3D, 0x8A, 0xFE, 0x24, 0x46, 0x7A, 0x4F, 0x57, 0x8B,
+    0x6D, 0x5B, 0xB2, 0x12, 0xCA, 0x09, 0x7B, 0x45, 0x4D, 0xC1, 0x03, 0x7A, 0x27, 0xFB, 0x2C, 0xE2,
+    0x95, 0xC6, 0x17, 0x46, 0x7B, 0x48, 0xFB, 0x8F, 0x78, 0x5B, 0xC8, 0x3E, 0x54, 0x51, 0x99, 0x71,
+    0xE3, 0xC7, 0x92, 0xED, 0x99, 0xB4, 0x8A, 0x98, 0x86, 0xA8, 0x91, 0x1D, 0x36, 0xB6, 0xB2, 0xC7,
+    0x9C, 0xD6, 0x68, 0x4D, 0x45, 0x9B, 0x4D, 0x37, 0xB5, 0xA0, 0xCE, 0x30, 0x00, 0x13, 0x5A, 0x49,
+    0xE4, 0x52, 0x45, 0x7D, 0x30, 0xEA, 0x74, 0xBE, 0xEE, 0x41, 0x43, 0xBC, 0xB5, 0xC9, 0x0C, 0x40,
+    0x7F, 0x75, 0xC6, 0x57, 0x56, 0x9A, 0x90, 0xF6, 0x56, 0x35, 0x83, 0x99, 0x80, 0x08, 0x69, 0x08,
+    0xB2, 0x59, 0x9F, 0x79, 0x51, 0x5D, 0x9A, 0xE1, 0xCA, 0x16, 0x17, 0x28, 0xFE, 0x2B, 0xD1, 0x9F,
+    0x1B, 0x25, 0x62, 0xC0, 0x5A, 0xF6, 0x26, 0x11, 0x6E, 0xD7, 0xE1, 0xBA, 0x5C, 0xB8, 0x04, 0x7A,
+    0x55, 0xD3, 0x16, 0x59, 0x5C, 0x37, 0x26, 0xD0, 0xB6, 0x09, 0xED, 0x57, 0x88, 0x56, 0x21, 0x5C,
+    0x91, 0xB6, 0xEB, 0xE4, 0xC2, 0x70, 0x8D, 0x2F, 0x5A, 0x9F, 0x07, 0x5B, 0x57, 0x38, 0x9E, 0x3A,
+    0x49, 0xDF, 0x67, 0x18, 0xA5, 0x50, 0x90, 0xDC, 0xBD, 0xA1, 0xA6, 0xE5, 0x33, 0x25, 0xD7, 0xA0,
+    0x25, 0x71, 0x63, 0xD3, 0x8B, 0x89, 0xE2, 0xC0, 0xC5, 0xC8, 0x51, 0xF1, 0x9B, 0x23, 0xD7, 0x35,
+    0xAC, 0x04, 0xD6, 0x8B, 0x5A, 0xDF, 0x9A, 0x9D, 0x98, 0x5E, 0x5B, 0xD0, 0x2B, 0x28, 0xDF, 0x89,
+    0x1B, 0x85, 0xC5, 0xB2, 0xDD, 0x43, 0xEF, 0x14, 0x99, 0x74, 0x8B, 0xAB, 0x49, 0x45, 0xA7, 0x57,
+    0xBF, 0xCD, 0x7E, 0x80, 0xDF, 0x0C, 0x1B, 0x05, 0xB2, 0x1E, 0xD0, 0xFD, 0x72, 0x3E, 0x25, 0xD2,
+    0xE1, 0x0B, 0x1C, 0x17, 0x6C, 0x5B, 0x61, 0xC0, 0x84, 0xCD, 0xFA, 0xB6, 0x07, 0x0A, 0xBE, 0x2B,
+    0xF7, 0x3E, 0xEA, 0x2B, 0x0B, 0x52, 0x33, 0x0A, 0x37, 0xC3, 0x48, 0x0A, 0x93, 0x9C, 0xF7, 0x52,
+    0x45, 0x9B, 0xE5, 0x04, 0xED, 0x3B, 0x5A, 0xFF, 0x8E, 0x4A, 0xFE, 0xD5, 0x76, 0x04, 0xED, 0xA2,
+    0xAE, 0x36, 0x6A, 0xCC, 0x62, 0x7F, 0xB2, 0xBE, 0x3A, 0x30, 0x02, 0x59, 0xF3, 0x2F, 0xDF, 0x94,
+    0x0D, 0x03, 0x22, 0xB6, 0x65, 0xDF, 0x26, 0x8A, 0xCE, 0x9F, 0x32, 0x4B, 0x8D, 0x4E, 0x3B, 0x37,
+    0x24, 0x00, 0x0F, 0xB7, 0xF4, 0x4B, 0x2F, 0x0B, 0xF9, 0x94, 0x14, 0x41, 0x94, 0xD0, 0x66, 0x80,
+    0x66, 0x9F, 0x04, 0x74, 0xB8, 0x90, 0x35, 0xEE, 0xCC, 0x4B, 0xA7, 0xD4, 0x42, 0x7D, 0xD6, 0x23,
+    0x3C, 0x2A, 0x8A, 0xB6, 0xAC, 0x19, 0x92, 0x37, 0xD9, 0x46, 0xDF, 0xE1, 0x75, 0x2D, 0x05, 0x02,
+    0xB1, 0xCA, 0x34, 0x34, 0x1B, 0xB4, 0x67, 0x1F, 0x56, 0xBD, 0x55, 0xCD, 0xEC, 0x9E, 0x3D, 0x4E,
+    0x83, 0x90, 0x5D, 0x66, 0xBA, 0xA6, 0x76, 0x7E, 0x2E, 0xAA, 0x92, 0xD2, 0x80, 0xC5, 0x25, 0x0D,
+    0x91, 0xF5, 0x9B, 0x54, 0x6F, 0x05, 0xCE, 0xE3, 0x4A, 0x55, 0xCB, 0xA6, 0xDD, 0x4C, 0x91, 0x92,
+    0xA0, 0x1C, 0x83, 0xBD, 0x28, 0x05, 0xB9, 0xFC, 0x75, 0x42, 0xEF, 0xB1, 0x7D, 0x2A, 0x17, 0x3E,
+    0x7A, 0xB3, 0xB5, 0xCB, 0xD9, 0x43, 0x0F, 0xAD, 0x4D, 0x36, 0x70, 0x4E, 0x39, 0x3C, 0x91, 0xF6,
+    0x05, 0xDB, 0x0A, 0x43, 0xDC, 0x5B, 0xAF, 0x4C, 0x34, 0x72, 0x9B, 0xF1, 0x2D, 0x89, 0x0F, 0x85,
+    0x1C, 0x90, 0x8B, 0x90, 0x84, 0xCC, 0x1D, 0xD0, 0xAE, 0xF6, 0x58, 0x20, 0x38, 0xE9, 0x44, 0x16,
+    0xB6, 0xCB, 0x90, 0x5C, 0x76, 0x91, 0xB7, 0x1B, 0x15, 0xB6, 0xEF, 0xB1, 0x31, 0xAE, 0xD0, 0x9E,
+    0x78, 0x37, 0xBC, 0x69, 0x3B, 0x2C, 0x22, 0x89, 0x10, 0xE5, 0xBF, 0xA5, 0xAA, 0x32, 0x0F, 0x5F,
+    0xED, 0x7A, 0x85, 0xC2, 0x25, 0x0E, 0x8C, 0x8D, 0xEB, 0x8D, 0xE7, 0x33, 0x84, 0x9B, 0x47, 0xC5,
+    0xD6, 0x49, 0xAB, 0x1D, 0xA1, 0x0A, 0x84, 0x14, 0x1A, 0x90, 0xD8, 0x11, 0x78, 0x4A, 0x1A, 0x01,
+    0xE2, 0x27, 0xC9, 0x49, 0x61, 0x82, 0x62, 0xA2, 0xE0, 0xE4, 0xDF, 0x99, 0xC5, 0x5A, 0x7B, 0x54,
+    0x7B, 0x77, 0xC9, 0xF8, 0xA4, 0xB5, 0xA2, 0xA0, 0x09, 0x42, 0x9F, 0x47, 0x82, 0x6C, 0x79, 0xED,
+    0x5F, 0x79, 0xBD, 0x0C, 0x73, 0x84, 0x88, 0x05, 0x16, 0x17, 0x08, 0x9D, 0x3C, 0xCA, 0xCB, 0x55,
+    0xD4, 0x14, 0x16, 0xD3, 0x83, 0xAE, 0x39, 0x1D, 0x3D, 0x19, 0x51, 0x1A, 0x45, 0x32, 0x19, 0xA0,
+    0xF0, 0xC0, 0xB0, 0x27, 0x4D, 0xC6, 0x6F, 0x75, 0x52, 0x59, 0x14, 0x50, 0xF7, 0xDF, 0x6A, 0x51,
+    0xE5, 0xB0, 0xDC, 0xE8, 0x27, 0x2E, 0x49, 0x7A, 0x53, 0x96, 0x2C, 0x28, 0x9A, 0x65, 0x75, 0x65,
+    0xBE, 0x35, 0x1B, 0x6D, 0x1C, 0x90, 0xCA, 0x80, 0x42, 0xBF, 0xA4, 0x45, 0xA2, 0x5C, 0x93, 0xFC,
+    0xB5, 0x63, 0x30, 0xB2, 0xA7, 0x7B, 0x20, 0x3F, 0x0F, 0x5E, 0xE1, 0x41, 0x61, 0x79, 0xBC, 0xB1,
+    0x07, 0x69, 0x2F, 0xA9, 0x48, 0x99, 0xEE, 0xD3, 0x46, 0xFF, 0x51, 0x54, 0x31, 0xB5, 0xC1, 0xCE,
+    0x87, 0x20, 0xB9, 0x0F, 0x47, 0x77, 0x46, 0xB3, 0x57, 0xAD, 0x3C, 0x1E, 0x03, 0xD0, 0xA5, 0x3D,
+    0x66, 0xB3, 0xC5, 0x28, 0x2E, 0x06, 0xF6, 0x02, 0x49, 0x9D, 0xF9, 0xF5, 0x29, 0x69, 0xF8, 0x16,
+    0x0A, 0x2F, 0xB7, 0xCD, 0xE8, 0xDB, 0x5F, 0xA2, 0x12, 0xAB, 0x7C, 0x09, 0x24, 0x81, 0x9C, 0x04,
+    0x27, 0x51, 0x66, 0x4D, 0xDC, 0xE5, 0x24, 0xE9, 0xE4, 0x53, 0xA9, 0x8B, 0x41, 0x25, 0x47, 0x2B,
+    0x2B, 0xC6, 0xA0, 0x41, 0x81, 0xEB, 0xD1, 0xC6, 0xB3, 0x77, 0x97, 0x90, 0x25, 0x15, 0xFA, 0xB2,
+    0x37, 0x9F, 0xE4, 0xE3, 0xB2, 0x11, 0xEB, 0xF2, 0x72, 0x62, 0xC6, 0x8A, 0x00, 0xF3, 0x99, 0x83,
+    0x11, 0x26, 0x64, 0x82, 0xA6, 0xA2, 0x8B, 0xF2, 0xB0, 0xCE, 0xAE, 0x49, 0xE1, 0x16, 0xC1, 0x6F,
+    0x81, 0x89, 0x61, 0x6F, 0x9E, 0x0A, 0x07, 0xB3, 0xDB, 0x62, 0x45, 0xEF, 0x54, 0x6C, 0x9F, 0x95,
+    0xC5, 0x50, 0xEF, 0xD7, 0x81, 0x0B, 0x8F, 0x67, 0x15, 0xE4, 0xDF, 0xC6, 0xFB, 0xD5, 0x17, 0x8F,
+    0x90, 0x27, 0xE5, 0x3B, 0x86, 0xF4, 0xBC, 0xF1, 0x9D, 0x1D, 0x07, 0xB1, 0x3D, 0x45, 0xE4, 0x62,
+    0x76, 0x6B, 0xFC, 0x2C, 0xE5, 0x31, 0x7E, 0x1D, 0x66, 0x0B, 0x85, 0x27, 0x80, 0xF8, 0xCB, 0xB8,
+    0x2A, 0xA4, 0x23, 0x4B, 0x3D, 0xB7, 0xE3, 0x10, 0x4D, 0xB8, 0xD1, 0xA9, 0x10, 0x33, 0x84, 0xF1,
+    0x07, 0x28, 0xE0, 0x89, 0x4D, 0x9C, 0x4F, 0xA3, 0x84, 0xFA, 0x30, 0xBC, 0x38, 0x72, 0x91, 0x59,
+    0xD5, 0x66, 0x49, 0x2E, 0x62, 0x69, 0x7A, 0x6E, 0xCB, 0x3F, 0x18, 0x9A, 0x24, 0x8A, 0x8A, 0x72,
+    0x1E, 0x2F, 0xF5, 0xD5, 0x23, 0x5D, 0x85, 0x58, 0x22, 0x1D, 0x23, 0x44, 0x82, 0x94, 0x85, 0x66,
+    0x07, 0x4C, 0x1C, 0x85, 0xF8, 0x1C, 0x28, 0x0A, 0x09, 0x39, 0x79, 0xFF, 0xCC, 0xF0, 0x20, 0x84,
+    0xCA, 0x88, 0x77, 0x8F, 0xC3, 0x58, 0x56, 0xDD, 0xB9, 0x06, 0x1C, 0x0D, 0xFB, 0x9B, 0x10, 0xE1,
+    0xDB, 0x23, 0x84, 0xF0, 0xB0, 0x76, 0xC0, 0x0C, 0xF8, 0x28, 0x13, 0xE7, 0x4E, 0xDD, 0xC3, 0x1A,
+    0xBD, 0x9F, 0x5B, 0x47, 0xEC, 0x22, 0x01, 0x0A, 0x8E, 0xFC, 0x4A, 0x36, 0xF7, 0xC6, 0xFC, 0x33,
+    0x1E, 0x29, 0xBB, 0x34, 0xD0, 0xA9, 0x9A, 0x57, 0x17, 0x8E, 0x02, 0x1C, 0x44, 0xB8, 0x33, 0x24,
+    0xD6, 0x8D, 0xB6, 0x3F, 0xDB, 0x1B, 0xAD, 0xC5, 0x5A, 0x98, 0x88, 0xE6, 0x7D, 0x9C, 0x2F, 0xE7,
+    0x0E, 0x14, 0xD3, 0xA1, 0x9A, 0x98, 0xB8, 0x54, 0xE2, 0x90, 0x97, 0x5E, 0x48, 0xDE, 0xCF, 0x3B,
+    0x4F, 0x57, 0x92, 0x66, 0x2D, 0xB4, 0xA7, 0x71, 0x4D, 0x08, 0xB7, 0xA3, 0xF1, 0x5A, 0xAA, 0x7E,
+    0xAD, 0xAD, 0xAC, 0xD2, 0xBD, 0x27, 0x41, 0x51, 0xC1, 0xEA, 0x4F, 0xE0, 0x0D, 0xC7, 0x3B, 0x20,
+    0x84, 0x18, 0x7B, 0xBB, 0x78, 0xB7, 0xCB, 0x6E, 0x5B, 0x83, 0xBF, 0x59, 0x72, 0x2F, 0x74, 0x32,
+    0xA6, 0x55, 0x81, 0x6B, 0xFA, 0xE0, 0xA7, 0x68, 0x0D, 0xB5, 0xCF, 0x02, 0xCB, 0xDD, 0xF0, 0x69,
+    0xB1, 0x74, 0x4A, 0x53, 0x77, 0xF7, 0xD1, 0xC2, 0xCE, 0x2A, 0x59, 0xFD, 0x01, 0xBD, 0xD9, 0x50,
+    0x3E, 0xC4, 0xE6, 0xE0, 0x0C, 0x62, 0x44, 0x64, 0xEE, 0x70, 0x9F, 0x69, 0x81, 0x0D, 0xCE, 0x42,
+    0x87, 0x3A, 0xF2, 0x3A, 0x6B, 0x78, 0xDA, 0x42, 0x99, 0x33, 0xC9, 0xEB, 0x3B, 0x9C, 0xED, 0x3B,
+    0xC7, 0xF2, 0x65, 0xD1, 0x32, 0xB2, 0x3F, 0x9D, 0x80, 0xEC, 0xAC, 0x7D, 0x04, 0xF1, 0xE9, 0xBA,
+    0x52, 0x4A, 0x74, 0x70, 0x8C, 0xCF, 0xB1, 0xB9, 0x91, 0x8C, 0x4F, 0x12, 0x0D, 0xC2, 0x7A, 0x2F,
+    0xB8, 0x86, 0xF2, 0x9B, 0x4D, 0x58, 0xE0, 0xA0, 0x2E, 0xEA, 0x82, 0x17, 0xC1, 0x7E, 0x48, 0xBE,
+    0x56, 0xA5, 0xC7, 0xB9, 0x88, 0xF5, 0x26, 0xA6, 0xC1, 0x60, 0x83, 0xBC, 0x40, 0x7C, 0x36, 0x2B,
+    0x32, 0x57, 0x25, 0xBE, 0x88, 0x38, 0x2B, 0x8D, 0xBE, 0xA0, 0xE0, 0x64, 0x0D, 0x06, 0x2C, 0xD5,
+    0x88, 0x31, 0xCC, 0x79, 0x49, 0x81, 0x19, 0xE5, 0x36, 0x43, 0x3D, 0x74, 0xA3, 0x20, 0x59, 0x3C,
+    0xFD, 0x5B, 0x5C, 0x35, 0x4D, 0xF1, 0x90, 0x26, 0x8A, 0x06, 0xB5, 0x76, 0x87, 0x1D, 0xC6, 0x7D,
+    0x93, 0x8A, 0x35, 0x62, 0x12, 0x23, 0x7E, 0xD7, 0x33, 0x4C, 0x73, 0xEB, 0x01, 0x6D, 0xCB, 0xAF,
+    0xE5, 0xF2, 0x5D, 0x6C, 0x48, 0x73, 0x8E, 0x78, 0xA6, 0xA1, 0x11, 0xAC, 0x91, 0xA1, 0x6D, 0x13,
+    0xAE, 0x2B, 0xA7, 0x7B, 0x03, 0xDA, 0x16, 0x7A, 0xE3, 0x6A, 0x53, 0xF1, 0x82, 0x1F, 0xD0, 0x29,
+    0xA6, 0x99, 0xB0, 0xC1, 0x1A, 0x28, 0xBC, 0x08, 0xC7, 0x6C, 0x3E, 0xD8, 0x3B, 0x7D, 0x31, 0x4F,
+    0xB9, 0xCC, 0x1F, 0x8F, 0x06, 0x85, 0xDE, 0x97, 0xBD, 0x7A, 0x02, 0xA4, 0x16, 0x0E, 0x8F, 0xF2,
+    0x61, 0xAE, 0x02, 0xA2, 0x43, 0x84, 0xE0, 0x9E, 0x1E, 0xA9, 0xDB, 0xF0, 0x7A, 0xC3, 0xA0, 0xDD,
+    0x93, 0xE9, 0x84, 0x8D, 0xC3, 0x79, 0x9C, 0xE5, 0x68, 0xBC, 0x63, 0xB8, 0x82, 0xA0, 0x94, 0x7D,
+    0x7F, 0x5B, 0x73, 0x13, 0x0B, 0x7A, 0x46, 0xBE, 0xEF, 0x70, 0x64, 0xB9, 0x26, 0xB0, 0x86, 0xBB,
+    0x33, 0x8A, 0xCC, 0x81, 0x04, 0x8E, 0x62, 0x7A, 0x34, 0xFA, 0x25, 0x14, 0x0F, 0x0A, 0xD4, 0x0B,
+    0xCF, 0xD6, 0x92, 0x05, 0x88, 0x2C, 0x2D, 0x26, 0xDF, 0x08, 0xD6, 0x19, 0x6A, 0xAB, 0x74, 0x2C,
+    0xB0, 0x08, 0x6B, 0xAB, 0x87, 0xEA, 0x6A, 0x48, 0xB8, 0x73, 0xB6, 0x16, 0x30, 0x33, 0xE7, 0x4B,
+    0x81, 0xBD, 0xEE, 0x67, 0x31, 0x83, 0x4B, 0xCF, 0x83, 0x22, 0x05, 0x8A, 0x81, 0xEB, 0xFA, 0x75,
+    0xBB, 0x54, 0x8E, 0x78, 0x5B, 0x76, 0x70, 0x3F, 0x7D, 0x3F, 0xAA, 0x6C, 0x69, 0x7F, 0x19, 0x68,
+    0xB3, 0x68, 0x51, 0xD1, 0x61, 0xD5, 0x3C, 0x2C, 0x6B, 0xC5, 0x96, 0xE0, 0xDA, 0x26, 0x63, 0xC5,
+    0x0E, 0xA1, 0xF5, 0x59, 0xD5, 0x78, 0x87, 0x81, 0xEF, 0x87, 0x01, 0x88, 0xD4, 0xE1, 0xBD, 0xB8,
+    0x96, 0x1D, 0x5D, 0x85, 0x1C, 0x6F, 0x53, 0xED, 0x6A, 0x6A, 0xC0, 0x2A, 0xB2, 0xF1, 0x6C, 0x7A,
+    0x92, 0xF5, 0x70, 0x6D, 0x94, 0xD5, 0x87, 0x57, 0xE3, 0x26, 0xCD, 0xDA, 0x52, 0x5C, 0x22, 0x03,
+    0xBD, 0xF6, 0x60, 0xA6, 0xC9, 0x64, 0xF0, 0xC6, 0x11, 0xA4, 0x96, 0xB1, 0x27, 0x8B, 0x8E, 0x99,
+    0x3E, 0xC2, 0xC1, 0x43, 0xD4, 0x10, 0x7D, 0xCC, 0x9F, 0xE4, 0x7C, 0xA6, 0x10, 0x1E, 0xE5, 0x59,
+    0x37, 0x58, 0xF0, 0xB3, 0xF6, 0x4F, 0x8B, 0x41, 0xDB, 0x65, 0x01, 0xDD, 0xE3, 0xAB, 0xBD, 0x4C,
+    0x4C, 0x69, 0x2B, 0x82, 0xBA, 0x80, 0xDE, 0x9E, 0x4D, 0xAC, 0x86, 0xDF, 0x34, 0xDB, 0xDF, 0x1C,
+    0xBA, 0x25, 0x03, 0xD0, 0x5E, 0x29, 0x29, 0x4E, 0xFC, 0xF6, 0xC0, 0x10, 0x03, 0xCA, 0xB0, 0xA3,
+    0x22, 0xB0, 0x46, 0xAA, 0xC3, 0xBB, 0xF1, 0xC6, 0x7C, 0xB1, 0xC2, 0x70, 0xCD, 0xAC, 0xE0, 0x6B,
+    0xDD, 0x14, 0xEC, 0xAD, 0x80, 0x09, 0xF9, 0xBD, 0x1F, 0x4A, 0xD7, 0x20, 0xFA, 0x15, 0xCF, 0xDD,
+    0xE5, 0x65, 0x2A, 0x06, 0xBD, 0x88, 0xC0, 0x12, 0x74, 0xC4, 0x8B, 0x3C, 0x50, 0x8D, 0x73, 0xC3,
+    0xF0, 0x36, 0x40, 0x64, 0x39, 0x4C, 0x78, 0x92, 0xD8, 0xDC, 0x93, 0x2A, 0xC0, 0x91, 0x16, 0xB0,
+    0x96, 0x88, 0x70, 0x85, 0x86, 0xEF, 0x38, 0xF5, 0x8E, 0x70, 0x63, 0x3C, 0xE8, 0xDB, 0x26, 0xDF,
+    0x3F, 0xEE, 0x01, 0xB1, 0xF6, 0xF6, 0x8E, 0x1A, 0xEE, 0x6F, 0x42, 0x9B, 0x76, 0x08, 0xF2, 0xE4,
+    0xB5, 0xD8, 0x45, 0x55, 0xCE, 0xF3, 0x89, 0xEC, 0x2D, 0x00, 0xF7, 0xC1, 0xED, 0x4D, 0xD0, 0x04,
+    0xC1, 0xB2, 0x92, 0xE1, 0xE5, 0xEE, 0x44, 0xFD, 0x79, 0xC1, 0x45, 0xAD, 0x1F, 0x99, 0x49, 0xB9,
+    0xC3, 0x79, 0xAF, 0xFC, 0x09, 0x31, 0x3F, 0xBE, 0x15, 0x37, 0xB7, 0x9B, 0xA2, 0xD5, 0xD7, 0xDD,
+    0x1B, 0xBC, 0x69, 0xA3, 0x27, 0x8A, 0x7C, 0xAA, 0xC6, 0x31, 0x2A, 0xA9, 0x6F, 0xA1, 0x3D, 0xFE,
+    0xB6, 0x40, 0xD0, 0x96, 0xBF, 0xEC, 0x37, 0xB1, 0x5C, 0x8E, 0xA8, 0xF7, 0x4B, 0x9D, 0x62, 0x5C,
+    0x33, 0x4E, 0x54, 0xDA, 0x66, 0xF2, 0xFF, 0xEE, 0xE2, 0x19, 0xF3, 0x47, 0x74, 0xD2, 0xC8, 0x8D,
+    0xDB, 0x67, 0xEC, 0x77, 0xD7, 0xC0, 0x1F, 0xC7, 0x4D, 0x7D, 0x03, 0xD1, 0xEB, 0xDD, 0x43, 0xD1,
+    0x25, 0xD8, 0x29, 0x18, 0xCA, 0xE5, 0xF3, 0x89, 0x86, 0xA0, 0x09, 0xD1, 0x4E, 0x0C, 0x69, 0x47,
+    0x1B, 0x89, 0x9B, 0xB2, 0xE9, 0xE3, 0x7E, 0x9C, 0xE4, 0xCD, 0xE8, 0x0A, 0x70, 0xF0, 0x95, 0x81,
+    0x70, 0xF5, 0xAD, 0x6E, 0xD9, 0x41, 0x2D, 0xCD, 0xEC, 0xA3, 0x10, 0x18, 0xF1, 0x34, 0xD3, 0xC1,
+    0x85, 0x5D, 0x07, 0xE5, 0x8C, 0x6A, 0xEF, 0xCC, 0xB0, 0xA7, 0x00, 0xE8, 0x53, 0x5D, 0xD5, 0xE5,
+    0x47, 0x60, 0x94, 0xAB, 0x43, 0x26, 0xCD, 0x0E, 0x02, 0xD3, 0x8C, 0xF1, 0x8F, 0xAC, 0x23, 0x0F,
+    0xDF, 0xB1, 0x3A, 0x8F, 0x99, 0xAF, 0x89, 0xAC, 0x5B, 0xAE, 0x6C, 0x40, 0x6D, 0xC1, 0x20, 0x2A,
+    0x01, 0xFB, 0xC6, 0x02, 0x19, 0xC1, 0x89, 0x98, 0x41, 0x24, 0x9F, 0xCF, 0xA2, 0x43, 0x15, 0x3F,
+    0xA7, 0x8F, 0x6F, 0xC6, 0x47, 0x91, 0x0A, 0xBA, 0x7B, 0xD3, 0x5E, 0xD2, 0xB3, 0x70, 0x00, 0x86,
+    0xAD, 0xD6, 0xF4, 0xC4, 0x1D, 0x76, 0x90, 0x26, 0x47, 0xE3, 0x69, 0xA5, 0x8E, 0x2E, 0xBF, 0xA8,
+    0x9D, 0x72, 0x84, 0x41, 0xC3, 0x8E, 0x4A, 0x6B, 0xE5, 0xA5, 0xB3, 0x05, 0x67, 0xDC, 0x5F, 0xAF,
+    0xF0, 0x06, 0x08, 0x9C, 0x8E, 0x10, 0xDC, 0x73, 0x98, 0x73, 0x9A, 0x9B, 0xA6, 0x3D, 0xCF, 0xC2,
+    0x2E, 0x7F, 0x37, 0xF8, 0xC2, 0xC6, 0x45, 0x6D, 0xD3, 0x01, 0x48, 0x55, 0x4E, 0x62, 0xEF, 0x67,
+    0xD6, 0xAC, 0x7F, 0x6E, 0x9C, 0x0A, 0x1F, 0x5D, 0x9F, 0xB4, 0x55, 0x4F, 0xEB, 0x9D, 0xFC, 0xDD,
+    0x92, 0x45, 0x1D, 0xAE, 0xBD, 0xCA, 0xCB, 0x04, 0xB9, 0x18, 0x3A, 0xBB, 0x2B, 0x8C, 0x8A, 0x80,
+    0x4D, 0x1A, 0x24, 0x39, 0xDA, 0x10, 0x94, 0xDA, 0xC9, 0x4B, 0x2F, 0x0F, 0x86, 0x24, 0x0B, 0x51,
+    0xF5, 0x57, 0xBA, 0x57, 0x23, 0x4D, 0x03, 0xAA, 0xA4, 0xC0, 0x23, 0x7D, 0xF9, 0x13, 0x02, 0x30,
+    0x42, 0x4D, 0xDA, 0xE0, 0x5E, 0x11, 0x8E, 0xA7, 0x21, 0x20, 0xEA, 0x1F, 0x26, 0xF1, 0x5C, 0xCD,
+    0x9C, 0x6F, 0x1E, 0xCC, 0xE8, 0x23, 0xA4, 0xDD, 0x40, 0x36, 0xFC, 0x8A, 0x95, 0x80, 0xFD, 0x91,
+    0xD3, 0x8F, 0x61, 0x75, 0x6B, 0x09, 0xF8, 0x0A, 0xBE, 0x94, 0x25, 0x9C, 0x02, 0xFD, 0x65, 0x50,
+    0x6F, 0x90, 0xA5, 0x9E, 0xDE, 0xD8, 0x98, 0x90, 0xBA, 0x06, 0xEF, 0xF6, 0xDC, 0x37, 0x4F, 0x46,
+    0x3F, 0xF4, 0xD1, 0x91, 0xB2, 0x0D, 0xA7, 0x56, 0x78, 0x76, 0x35, 0xE7, 0x2D, 0x66, 0x2A, 0xF8,
+    0x5B, 0xC5, 0x1F, 0x41, 0xB1, 0x89, 0xB6, 0x7C, 0x43, 0x68, 0x8E, 0x19, 0x44, 0x03, 0x8C, 0xD0,
+    0xCA, 0xEF, 0x64, 0x34, 0x87, 0xC4, 0xEB, 0xD4, 0xCD, 0x33, 0x07, 0x71, 0x57, 0xA7, 0xDC, 0xE5,
+    0x65, 0x2E, 0xD9, 0xE1, 0x7F, 0xAA, 0xCA, 0x11, 0xEC, 0xDF, 0x83, 0xAB, 0xBD, 0x9C, 0x27, 0xAB,
+    0x5C, 0x34, 0x6A, 0x49, 0xDF, 0xAD, 0x68, 0xFA, 0x61, 0x39, 0xDC, 0x49, 0x7D, 0xF5, 0x76, 0xC2,
+    0x3F, 0xD4, 0x48, 0xA2, 0x9C, 0x2D, 0x50, 0x94, 0x3E, 0xF7, 0xB3, 0xBA, 0x71, 0x23, 0x9F, 0x63,
+    0x5F, 0x6D, 0x4D, 0x89, 0xA5, 0x37, 0x03, 0xDB, 0x79, 0x87, 0x27, 0x9E, 0x15, 0x65, 0x1C, 0x9F,
+    0x61, 0x2B, 0x37, 0xFF, 0x87, 0xF4, 0x18, 0xF8, 0xBE, 0xAA, 0x1D, 0x4E, 0xBC, 0x02, 0x26, 0x1A,
+    0xA5, 0x3E, 0x52, 0x97, 0x21, 0xE1, 0xD2, 0xDA, 0xC0, 0x2D, 0x8D, 0x4B, 0x57, 0xFC, 0x08, 0xAA,
+    0x7C, 0x59, 0xF9, 0xBF, 0x3A, 0xF1, 0x96, 0x83, 0xA2, 0x59, 0x70, 0xA4, 0x06, 0x13, 0x6B, 0x15,
+    0xA8, 0xCB, 0xC8, 0x0B, 0x85, 0x31, 0x42, 0x3E, 0x3E, 0x83, 0x0C, 0xAF, 0x40, 0xAC, 0xBE, 0x6C,
+    0x6E, 0x17, 0x9A, 0xC6, 0x45, 0xCE, 0x1B, 0x1B, 0xBC, 0x94, 0xBF, 0xA2, 0x53, 0x5B, 0xDF, 0x95,
+    0xEF, 0x6A, 0x41, 0x93, 0xC4, 0x58, 0xE9, 0x20, 0x68, 0x28, 0xB1, 0xA3, 0x80, 0x80, 0x48, 0xEF,
+    0x7A, 0x7C, 0x11, 0x33, 0x62, 0x18, 0xB7, 0x41, 0x52, 0x36, 0xD5, 0xB6, 0xC0, 0x95, 0xD7, 0x71,
+    0x00, 0x0B, 0x0A, 0x86, 0xE7, 0x13, 0x8D, 0xE6, 0x73, 0x33, 0xB5, 0x8B, 0xEE, 0xC3, 0xCA, 0x24,
+    0x12, 0x96, 0x89, 0x91, 0x90, 0x95, 0xCA, 0x24, 0x30, 0xDB, 0x25, 0x9B, 0x1B, 0xF2, 0x13, 0xCA,
+    0xC3, 0x3A, 0x8A, 0x7E, 0xEA, 0xF9, 0x7D, 0xB1, 0xF0, 0x69, 0xF8, 0xD9, 0xA0, 0xEE, 0x3C, 0xF8,
+    0x02, 0x37, 0x93, 0xB5, 0xE3, 0xD9, 0x7B, 0x54, 0xF1, 0x3A, 0x9D, 0x20, 0xB0, 0xD2, 0xC6, 0xAE,
+    0x61, 0x26, 0x90, 0x4C, 0xA5, 0x9D, 0x20, 0xE1, 0xEF, 0x4A, 0x07, 0xF6, 0xAF, 0xE9, 0x28, 0xF5,
+    0x9B, 0x47, 0xDE, 0xD1, 0x65, 0x76, 0x0C, 0x70, 0x40, 0xBC, 0xA6, 0xA4, 0xE1, 0xF2, 0xEE, 0x0B,
+    0xAA, 0xF3, 0x3A, 0x8E, 0x4F, 0x7D, 0x9F, 0x97, 0xB6, 0x65, 0x54, 0x16, 0x88, 0xAF, 0x5C, 0xCD,
+    0xE3, 0x66, 0xEB, 0xB2, 0xA2, 0xA2, 0x5B, 0xE9, 0x0A, 0x54, 0x9B, 0x0E, 0x50, 0x4F, 0x89, 0xAD,
+    0x67, 0x11, 0x48, 0x33, 0x08, 0x47, 0xA6, 0xE1, 0xB4, 0x03, 0xF5, 0x65, 0x2B, 0xD1, 0xF7, 0xC7,
+    0x48, 0x3D, 0x1A, 0x33, 0xA6, 0x1E, 0x71, 0x1C, 0x02, 0x0A, 0x47, 0x9C, 0xE1, 0x97, 0xB3, 0x14,
+    0xD4, 0xEA, 0xFA, 0xF9, 0xFF, 0x35, 0x67, 0xAA, 0xC3, 0x2E, 0x78, 0x33, 0x3D, 0x03, 0x17, 0x78,
+    0x0B, 0xC7, 0x68, 0xC1, 0x19, 0x4D, 0x21, 0xFE, 0xD7, 0x84, 0xB8, 0xA0, 0x50, 0x36, 0xE6, 0x98,
+    0xE7, 0x5C, 0xF2, 0x0C, 0xAC, 0x8D, 0x9E, 0xB4, 0xC4, 0xFB, 0x29, 0x50, 0x9F, 0xF7, 0x27, 0xEB,
+    0x22, 0xDB, 0xD1, 0x19, 0x8E, 0x1C, 0xC4, 0x8C, 0x84, 0xF8, 0x0D, 0xB4, 0x1F, 0x80, 0x91, 0x70,
+    0xE1, 0xFC, 0x64, 0xE2, 0x5B, 0xD8, 0x07, 0x67, 0x87, 0xA2, 0x7E, 0x37, 0xE4, 0x7A, 0xBF, 0x87,
+    0xE4, 0x1F, 0x05, 0xAE, 0x25, 0xA5, 0x8C, 0xCE, 0xB5, 0x5F, 0x87, 0x77, 0xCF, 0x8E, 0x18, 0xA7,
+    0xAB, 0x4E, 0x16, 0xB1, 0xFC, 0x70, 0x9C, 0x00, 0x4D, 0xC6, 0x9F, 0x92, 0x3F, 0x42, 0xAF, 0xB4,
+    0xD0, 0x36, 0x13, 0xF0, 0xA3, 0xFE, 0x0E, 0x4B, 0xA3, 0xB9, 0xD6, 0xF0, 0x5F, 0xD3, 0x29, 0xDD,
+    0xB0, 0x27, 0x49, 0x13, 0x9F, 0x2B, 0xF8, 0xCB, 0x62, 0xC2, 0xBF, 0x80, 0x1D, 0x62, 0x23, 0x5B,
+    0xCE, 0x19, 0x6F, 0xE1, 0xAA, 0xD9, 0x99, 0x0F, 0x48, 0x72, 0xFE, 0xEF, 0x52, 0x58, 0x39, 0xF6,
+    0x4A, 0x98, 0x4A, 0xEF, 0xCF, 0xA3, 0x71, 0x92, 0xC6, 0xC6, 0x8F, 0x39, 0xED, 0x7D, 0x0B, 0x6C,
+    0x62, 0xE1, 0xA8, 0x0E, 0x62, 0xF7, 0x59, 0xD6, 0xB0, 0x67, 0x82, 0x12, 0x5C, 0xA9, 0xBC, 0x52,
+    0x7F, 0xCF, 0xD3, 0x33, 0x7A, 0x98, 0xFE, 0x8E, 0x70, 0x31, 0xB9, 0x82, 0x37, 0xD2, 0x37, 0xC9,
+    0xEE, 0x1C, 0xBC, 0x76, 0x0B, 0xBD, 0x95, 0xD4, 0xD0, 0x9C, 0xEE, 0x9F, 0x8A, 0x9C, 0xA0, 0x34,
+    0xFE, 0x8D, 0x64, 0xF0, 0xDA, 0x02, 0x17, 0xA3, 0x26, 0x68, 0x4B, 0xE8, 0x54, 0xF7, 0xE1, 0x94,
+    0x6D, 0xA9, 0x5E, 0x8B, 0x86, 0x13, 0xDB, 0x5C, 0x0C, 0xF0, 0x3C, 0x40, 0x4F, 0x0D, 0x15, 0xD7,
+    0xE7, 0x48, 0x3F, 0xC6, 0x33, 0x24, 0x30, 0x83, 0x50, 0x30, 0xBC, 0xD7, 0xE5, 0x25, 0x32, 0x11,
+    0xD0, 0xA7, 0xE3, 0x7C, 0x4D, 0xE4, 0x46, 0xE3, 0xCB, 0xF7, 0x04, 0x49, 0xFF, 0x5F, 0x0C, 0xFE,
+    0x36, 0xEE, 0x39, 0x46, 0x5B, 0x41, 0x7D, 0x1B, 0xF0, 0xCF, 0x90, 0xEF, 0x72, 0x6E, 0x61, 0xE5,
+    0x26, 0xC7, 0xC5, 0x6A, 0xCA, 0x40, 0x7A, 0x30, 0x8E, 0x0A, 0x2F, 0xDD, 0x64, 0x95, 0xF7, 0x19,
+    0x6D, 0x0F, 0xDB, 0x80, 0xFB, 0x9E, 0x6B, 0x36, 0xD6, 0x1E, 0x0A, 0x34, 0x7A, 0x8B, 0x1B, 0xB9,
+    0xA8, 0xBB, 0x49, 0x67, 0xCA, 0x7E, 0xD6, 0x27, 0x6F, 0xAC, 0xED, 0x25, 0x89, 0xFD, 0xB4, 0x11,
+    0x2F, 0x43, 0x74, 0x40, 0x2D, 0x73, 0x20, 0xA1, 0x94, 0x9E, 0x79, 0x5D, 0x20, 0x88, 0xD5, 0x1F,
+    0x13, 0x10, 0x35, 0x7A, 0x4C, 0xF0, 0x5B, 0x09, 0x96, 0x75, 0x6F, 0x5F, 0xED, 0x9D, 0x68, 0xBD,
+    0x0D, 0x77, 0x5C, 0x85, 0x13, 0x3A, 0x11, 0x0D, 0x0A, 0x90, 0x98, 0x8F, 0xCE, 0x4C, 0xE5, 0x46,
+    0x40, 0x86, 0x75, 0xA5, 0x49, 0x5C, 0x12, 0x57, 0xF8, 0x48, 0x86, 0xD4, 0x81, 0xA4, 0x47, 0x39,
+    0x19, 0x42, 0x23, 0x44, 0x7F, 0x57, 0x9C, 0x95, 0xA1, 0xFD, 0x3E, 0xA6, 0x29, 0x84, 0xF6, 0x8F,
+    0x87, 0x79, 0x8B, 0xF6, 0x45, 0x5A, 0x9B, 0x7E, 0xBB, 0xC1, 0xD3, 0xB7, 0xE4, 0x18, 0xB0, 0x61,
+    0x77, 0xB4, 0x12, 0x25, 0xEE, 0x6C, 0x3D, 0x6C, 0xA9, 0xFE, 0x67, 0xDE, 0xCC, 0x8F, 0x11, 0xC1,
+    0x8A, 0xD6, 0x72, 0xAC, 0x45, 0x77, 0xEF, 0xD3, 0x96, 0x41, 0xA7, 0xC1, 0x92, 0x15, 0x93, 0x44,
+    0x18, 0x08, 0x14, 0x7C, 0xAB, 0xCE, 0xBF, 0xFA, 0x89, 0xEF, 0xAD, 0x09, 0x9A, 0xB9, 0x8A, 0x7D,
+    0xD5, 0xA2, 0x82, 0x90, 0x10, 0x4E, 0xD6, 0xCC, 0x04, 0x43, 0x21, 0x6B, 0xDF, 0xE4, 0x56, 0xE9,
+    0x7D, 0x17, 0xCD, 0xC1, 0x3A, 0xC0, 0xA1, 0x83, 0xCE, 0xC8, 0x90, 0x2E, 0xA6, 0x73, 0x44, 0x72,
+    0x10, 0x7B, 0x03, 0xDB, 0x2F, 0xCA, 0x9C, 0x71, 0x44, 0x06, 0xAC, 0xCB, 0x4A, 0x09, 0xF0, 0x08,
+    0x1C, 0x99, 0x49, 0x13, 0x19, 0x6E, 0xEE, 0x4C, 0xA2, 0xE4, 0xB8, 0xA0, 0x36, 0xE2, 0x9C, 0x13,
+    0x7E, 0x6C, 0x9B, 0x3C, 0x74, 0x5A, 0x50, 0x90, 0x8C, 0xE1, 0x24, 0x76, 0x14, 0xF7, 0x2E, 0x77,
+    0x24, 0x64, 0xFA, 0x37, 0x0C, 0xE1, 0x90, 0xDB, 0xB4, 0x4C, 0x9E, 0xC5, 0x26, 0xA8, 0xED, 0x02,
+    0x72, 0x4D, 0xF4, 0x91, 0x94, 0xDF, 0x77, 0x3B, 0x96, 0xB9, 0x42, 0x34, 0xD2, 0xB7, 0x1E, 0x49,
+    0xBD, 0x29, 0xBB, 0x3C, 0xC6, 0x5B, 0x3F, 0x15, 0xE5, 0x8F, 0x0E, 0x23, 0xA5, 0xD5, 0x73, 0x06,
+    0x6F, 0xEF, 0x73, 0x51, 0xB2, 0xC8, 0xD4, 0x44, 0xFC, 0x25, 0x95, 0xA9, 0x44, 0x57, 0xB7, 0x80,
+    0x07, 0xB0, 0xCE, 0x58, 0x12, 0xFF, 0xD3, 0xD9, 0x13, 0xDD, 0x11, 0x26, 0x5B, 0xC3, 0x5B, 0xEE,
+    0xA9, 0x53, 0x19, 0xE9, 0x31, 0x9C, 0x1B, 0x3A, 0x2A, 0x9F, 0xD9, 0x7C, 0x7A, 0x55, 0x52, 0x40,
+    0xE0, 0xEC, 0x11, 0x39, 0x7E, 0x09, 0xD7, 0xE7, 0xCF, 0xC7, 0x67, 0xDB, 0xDE, 0x02, 0x92, 0xEF,
+    0x47, 0x2C, 0x54, 0xFD, 0xE4, 0x37, 0xC6, 0x9F, 0x51, 0x66, 0x96, 0x84, 0x19, 0x94, 0x90, 0xE6,
+    0x4E, 0x43, 0x2A, 0xB9, 0x13, 0x40, 0x9C, 0xE9, 0x89, 0xA2, 0x2B, 0x8E, 0x8C, 0x39, 0x42, 0x42,
+    0xF8, 0xD9, 0x5A, 0x86, 0x0E, 0xA6, 0x3A, 0x9E, 0xA8, 0xA5, 0x23, 0x19, 0x58, 0xDB, 0x4C, 0x46,
+    0xCA, 0x26, 0x50, 0x0B, 0xD2, 0x6A, 0x9B, 0xBE, 0x63, 0x55, 0xF4, 0x42, 0xD8, 0x20, 0xCD, 0x55,
+    0x01, 0xA0, 0x3D, 0xE3, 0x97, 0x23, 0x14, 0xF1, 0x6A, 0x2A, 0x5A, 0xA9, 0xBD, 0x01, 0x5E, 0x56,
+    0x8F, 0xC7, 0x31, 0x6F, 0xBB, 0x78, 0x88, 0x01, 0xF0, 0x00, 0xD2, 0x1B, 0x40, 0x6D, 0x50, 0xD0,
+    0xCB, 0x44, 0x35, 0x3A, 0xBC, 0xBB, 0x6F, 0x6C, 0xF4, 0xDB, 0x6F, 0x54, 0x27, 0x8C, 0x0A, 0x5A,
+    0xE8, 0x56, 0xC9, 0x28, 0x44, 0xBC, 0xF7, 0x70, 0xF0, 0x95, 0x17, 0xA1, 0x0B, 0x91, 0xDF, 0x80,
+    0xF8, 0xF3, 0xF9, 0xB9, 0x1C, 0xEB, 0x81, 0x31, 0x18, 0xE2, 0xB6, 0xF8, 0x80, 0x64, 0x61, 0x1F,
+    0xD9, 0x14, 0x6C, 0x64, 0xE8, 0xDB, 0x45, 0x5E, 0x16, 0xD4, 0xDB, 0xC9, 0x13, 0x70, 0x4B, 0x0E,
+    0x40, 0x80, 0xB9, 0xCA, 0x9E, 0xB7, 0x85, 0x88, 0xDA, 0xF8, 0x13, 0xFE, 0x51, 0x28, 0xB9, 0x6E,
+    0x65, 0x92, 0xAA, 0x45, 0x68, 0xC6, 0x82, 0xCC, 0xBA, 0x28, 0x6E, 0xCF, 0x54, 0x7A, 0xB4, 0x8A,
+    0x8A, 0x92, 0x3C, 0x2F, 0x55, 0x6A, 0xE3, 0x23, 0x27, 0x4B, 0xFA, 0x13, 0x58, 0xB5, 0xAE, 0x9D,
+    0xA3, 0x77, 0x25, 0xFA, 0x70, 0x59, 0x5A, 0x34, 0x4C, 0xF1, 0xA9, 0x9A, 0x37, 0x2B, 0xEF, 0xA0,
+    0x85, 0xB7, 0x97, 0x74, 0x04, 0xD0, 0x08, 0xFE, 0x01, 0x7B, 0x33, 0x44, 0xB8, 0x44, 0x12, 0xE6,
+    0x1D, 0xCF, 0xE0, 0x8D, 0xDE, 0x92, 0x93, 0x49, 0xB8, 0x2B, 0x65, 0x0D, 0x38, 0x55, 0x3B, 0x90,
+    0x89, 0x01, 0x40, 0xEB, 0xF1, 0x33, 0x5C, 0x36, 0xAA, 0xF7, 0x84, 0x75, 0x8A, 0xB1, 0xE4, 0x68,
+    0x6F, 0x3C, 0x7C, 0x84, 0x71, 0x06, 0x57, 0xC4, 0x83, 0x9F, 0x6A, 0x96, 0x8F, 0xEB, 0xA6, 0x59,
+    0xBB, 0x2D, 0x68, 0x35, 0x8F, 0xBF, 0x8D, 0xFE, 0xC8, 0xBC, 0xA7, 0x41, 0x97, 0x17, 0x49, 0x82,
+    0x6E, 0x4D, 0xB0, 0xE8, 0xC9, 0x10, 0x57, 0x7B, 0x9C, 0x03, 0xDD, 0x90, 0xE3, 0x15, 0x30, 0x9A,
+    0x66, 0xAB, 0xF8, 0x9A, 0x69, 0xBE, 0x6E, 0x74, 0x3C, 0xF4, 0xDD, 0x0D, 0x77, 0x77, 0x30, 0x2C,
+    0x3C, 0x2B, 0x7E, 0x01, 0x90, 0xFD, 0xD7, 0xF1, 0x87, 0x03, 0x61, 0x87, 0x8B, 0x46, 0x5C, 0x02,
+    0x20, 0x5C, 0xB0, 0x8C, 0x56, 0x51, 0xA3, 0xFE, 0x15, 0x28, 0x24, 0xC7, 0x43, 0xE9, 0x15, 0x43,
+    0xA7, 0xD7, 0x21, 0x12, 0x88, 0xD5, 0x32, 0xAE, 0x04, 0xC8, 0x3E, 0x28, 0x7E, 0x08, 0xD4, 0x97,
+    0x5E, 0xCF, 0x60, 0xF1, 0x42, 0x96, 0x2B, 0xED, 0xAE, 0x71, 0x43, 0xD0, 0x04, 0x48, 0x65, 0x03,
+    0x9A, 0xFA, 0x77, 0x45, 0x5A, 0xFC, 0x48, 0x12, 0x16, 0xCF, 0xAF, 0x13, 0xE4, 0x03, 0xCC, 0x8F,
+    0xF4, 0xB5, 0x68, 0xB3, 0xF5, 0x53, 0x13, 0x42, 0x26, 0x8F, 0xB5, 0x71, 0x8E, 0x9B, 0xB3, 0x2E,
+    0xF6, 0x9F, 0x1E, 0x4A, 0xBC, 0xB9, 0xD8, 0xA5, 0x77, 0xCE, 0x95, 0x94, 0xE3, 0x9F, 0xD8, 0xAD,
+    0x53, 0x79, 0x03, 0xA6, 0x57, 0xF7, 0x13, 0xD5, 0x66, 0x25, 0x66, 0x88, 0x78, 0xF7, 0xF6, 0x35,
+    0xF9, 0xCC, 0x7F, 0xC6, 0x36, 0xAD, 0xC2, 0x70, 0x34, 0x94, 0xAA, 0xED, 0xCA, 0x4A, 0x14, 0x16,
+    0xF6, 0x6E, 0x46, 0xE8, 0x32, 0x63, 0xDF, 0x88, 0x66, 0x65, 0x6E, 0xA3, 0xCF, 0xDB, 0x1E, 0x5B,
+    0xFD, 0xCB, 0xB1, 0x99, 0x4A, 0x65, 0xD3, 0x24, 0xD8, 0xC9, 0xA1, 0xAA, 0x06, 0xA9, 0x4C, 0xF5,
+    0x7C, 0x9E, 0x98, 0x77, 0x12, 0xC2, 0xA9, 0xF9, 0x8D, 0x5F, 0x43, 0x1B, 0x9D, 0xEB, 0xD2, 0x28,
+    0x2C, 0x54, 0x60, 0x97, 0x5A, 0x70, 0x28, 0x78, 0xCA, 0x43, 0xD1, 0xBA, 0xA3, 0x5F, 0x49, 0x6A,
+    0x0C, 0x2A, 0x53, 0x09, 0xF8, 0x5E, 0x89, 0x5C, 0x6A, 0x5D, 0x2A, 0x8B, 0x58, 0x7D, 0x19, 0x1A,
+    0xF1, 0x1B, 0x5A, 0x12, 0xE7, 0x09, 0x9C, 0x88, 0xD5, 0xD7, 0x15, 0xFB, 0xDF, 0x62, 0xA9, 0x54,
+    0xD7, 0xD5, 0x7A, 0x2B, 0xBF, 0xCA, 0x0B, 0xB9, 0x07, 0xB4, 0xC9, 0x17, 0x81, 0x33, 0x07, 0x25,
+    0xE2, 0x0A, 0x6C, 0xF4, 0xD1, 0xF7, 0xF7, 0x65, 0xDE, 0x71, 0x00, 0x72, 0x9C, 0x2A, 0xBC, 0x31,
+    0xC0, 0x94, 0x85, 0x93, 0x9C, 0x65, 0xA6, 0xF1, 0x2F, 0x01, 0x8B, 0xD8, 0x66, 0x3E, 0x96, 0xB6,
+    0x96, 0xA0, 0x78, 0xA3, 0x85, 0x35, 0x6C, 0x3A, 0x37, 0x09, 0x76, 0x12, 0xB1, 0xA8, 0xC5, 0xE3,
+    0x53, 0xFB, 0x17, 0xB4, 0x10, 0xD1, 0x0F, 0xFA, 0xE7, 0x42, 0x58, 0x20, 0x72, 0x79, 0xC2, 0x94,
+    0xAF, 0xF7, 0x7D, 0x35, 0xD3, 0x48, 0x23, 0x67, 0x0F, 0xD7, 0x65, 0xE0, 0x48, 0x05, 0x7E, 0x09,
+    0xE6, 0x0A, 0x4B, 0xD2, 0xB0, 0xB9, 0x84, 0x12, 0xAF, 0x4B, 0x92, 0xDD, 0x30, 0x4B, 0x9F, 0xDC,
+    0xD5, 0x5D, 0xD4, 0x5A, 0x13, 0xE6, 0xB7, 0x18, 0x18, 0xC0, 0x52, 0x18, 0xBF, 0xC2, 0xB8, 0x7D,
+    0x2B, 0x2A, 0x36, 0x7A, 0x63, 0x6E, 0xF7, 0x59, 0x61, 0xC3, 0x97, 0x31, 0xDD, 0x61, 0x15, 0x1B,
+    0x30, 0xC3, 0xDD, 0xF5, 0x51, 0x2F, 0x77, 0xB4, 0x54, 0x6E, 0x4D, 0x98, 0x13, 0xDB, 0x3E, 0x4C,
+    0xA9, 0xCF, 0x77, 0xC8, 0x2D, 0x8E, 0x49, 0xDA, 0x67, 0xBA, 0x6C, 0x37, 0x54, 0xAB, 0x55, 0x80,
+    0x15, 0x94, 0x5F, 0xB6, 0x4D, 0x6B, 0xB3, 0xA3, 0x13, 0xBD, 0x7C, 0x47, 0xE3, 0xA5, 0x70, 0x9B,
+    0xEC, 0x5C, 0x94, 0x60, 0xC9, 0xEA, 0xD6, 0x64, 0xEE, 0x3B, 0x8F, 0x4E, 0xE2, 0x07, 0x61, 0xC6,
+    0xA4, 0x64, 0x8A, 0xA1, 0xF9, 0x57, 0xC2, 0xEA, 0x89, 0x95, 0x12, 0x67, 0xE0, 0xC6, 0xCF, 0x44,
+    0x40, 0x98, 0x8E, 0xB7, 0xDF, 0xFF, 0xCB, 0xAA, 0xEF, 0xC5, 0x72, 0x8D, 0xD4, 0xC7, 0x58, 0x60,
+    0x9D, 0xE1, 0xD6, 0x1D, 0x3A, 0x12, 0xBA, 0x5E, 0xA9, 0xAB, 0x21, 0xB9, 0x2E, 0xE0, 0x04, 0x47,
+    0x1B, 0xB2, 0x37, 0x28, 0xED, 0x7F, 0x7D, 0x24, 0x63, 0x2D, 0x98, 0x04, 0x4D, 0x1E, 0x6B, 0xE7,
+    0x11, 0x1C, 0xED, 0xB1, 0x02, 0x64, 0x63, 0x51, 0x71, 0x6E, 0xB1, 0x3D, 0xAD, 0xE1, 0xEB, 0x3B,
+    0x23, 0x51, 0xE3, 0x45, 0xA4, 0x83, 0xB2, 0x83, 0xD9, 0x43, 0x5C, 0xF6, 0x99, 0xDE, 0xC8, 0xD2,
+    0xB7, 0x11, 0x26, 0xF3, 0xEA, 0x69, 0xFE, 0x54, 0x22, 0x33, 0xCD, 0xDE, 0xE4, 0x2F, 0x65, 0x19,
+    0xA0, 0x3E, 0xDB, 0x4E, 0xB0, 0x4A, 0xFA, 0x57, 0x47, 0x13, 0x84, 0x7B, 0x73, 0x3B, 0x8E, 0xB1,
+    0x8A, 0x1C, 0x80, 0x0C, 0x9D, 0x67, 0xF3, 0xD5, 0x00, 0xD7, 0xDA, 0x92, 0xA5, 0xF7, 0xE4, 0x8D,
+    0x60, 0x48, 0xD2, 0x5C, 0xF6, 0x9A, 0x0D, 0x94, 0xE4, 0x19, 0x75, 0xCF, 0xE2, 0xCD, 0x22, 0xD5,
+    0x87, 0x9C, 0x36, 0x65, 0xC7, 0x36, 0x0D, 0x5B, 0x5C, 0x7A, 0x08, 0xC7, 0x98, 0xF5, 0xAE, 0x04,
+    0x45, 0xCE, 0x32, 0x1A, 0x25, 0xC9, 0x1F, 0x2E, 0x96, 0x95, 0x62, 0x97, 0x4C, 0x27, 0x82, 0xB9,
+    0x0A, 0xFA, 0x0D, 0xE3, 0xF1, 0xEA, 0xD6, 0x59, 0x3A, 0x6C, 0x9B, 0x28, 0xCA, 0x8A, 0x19, 0x79,
+    0x5C, 0xE9, 0xFF, 0xFD, 0x93, 0x54, 0x26, 0xF4, 0x09, 0x58, 0xB9, 0x41, 0x90, 0x2C, 0x74, 0x98,
+    0x45, 0x9A, 0x71, 0x12, 0x06, 0x52, 0xAA, 0x31, 0xAD, 0xEA, 0x97, 0x81, 0x33, 0xD6, 0xA3, 0x54,
+    0xCA, 0x9D, 0x5E, 0xF1, 0x87, 0xDD, 0xAB, 0x1E, 0xF1, 0x1B, 0xA4, 0xFD, 0x74, 0x60, 0x93, 0xD6,
+    0x01, 0x9F, 0x5C, 0x2D, 0x7D, 0xE7, 0xB8, 0x76, 0x36, 0x80, 0xD0, 0x63, 0x27, 0xC8, 0x94, 0x15,
+    0x4B, 0x1C, 0xC2, 0x6B, 0x67, 0x23, 0xEC, 0xAC, 0xD2, 0xEB, 0xC5, 0x5D, 0x78, 0x81, 0xD6, 0x30,
+    0xDD, 0xA6, 0x2C, 0xEE, 0x16, 0xDA, 0x8B, 0xA0, 0x9D, 0x20, 0xF8, 0x62, 0x87, 0x6D, 0xC2, 0x9C,
+    0x80, 0x53, 0x3C, 0x20, 0x06, 0x78, 0x71, 0xD7, 0xA6, 0x0D, 0xEA, 0xA8, 0x58, 0xA6, 0x21, 0x77,
+    0xCB, 0xD0, 0x6F, 0x05, 0x7A, 0x47, 0x1C, 0xFB, 0xA0, 0x4D, 0xD8, 0x22, 0xD1, 0xE3, 0x9B, 0x14,
+    0x98, 0xF4, 0xAE, 0x20, 0xEC, 0x64, 0xD9, 0xC6, 0xBF, 0xB1, 0x40, 0x1A, 0x4C, 0x66, 0xC3, 0x2B,
+    0xC0, 0xE7, 0xD3, 0x61, 0x4C, 0x6D, 0xF8, 0x5D, 0xC9, 0x33, 0x92, 0xC4, 0x1D, 0xA3, 0xF5, 0x69,
+    0x10, 0xF3, 0x4B, 0x31, 0x1C, 0x1D, 0x11, 0x8E, 0xB0, 0xF8, 0xD9, 0x3A, 0xBF, 0x06, 0xC1, 0xB0,
+    0x27, 0x8B, 0xB6, 0x9E, 0x7C, 0x6E, 0x27, 0x15, 0xF1, 0xE0, 0xE7, 0x31, 0x87, 0x10, 0x94, 0x2C,
+    0x0D, 0xC6, 0x75, 0x54, 0xD2, 0x5A, 0xE4, 0x25, 0xA7, 0xB9, 0x16, 0x4A, 0x93, 0x8E, 0x1D, 0x84,
+    0x06, 0xDC, 0x84, 0xDE, 0x57, 0x9D, 0xF7, 0xC1, 0x68, 0x08, 0x67, 0xFD, 0x5C, 0x38, 0x2A, 0xC9,
+    0x99, 0x28, 0xEC, 0x5D, 0xB4, 0x2A, 0xCA, 0xB3, 0xBC, 0x92, 0x0C, 0xFC, 0xC9, 0xED, 0x22, 0x52,
+    0x79, 0xC4, 0x04, 0x3F, 0xD0, 0x7D, 0x4B, 0xE0, 0x0C, 0x0F, 0x82, 0x00, 0xB8, 0x38, 0x70, 0x06,
+    0xC5, 0x34, 0x1E, 0x0D, 0x96, 0x7E, 0xDC, 0x94, 0x7E, 0x64, 0x47, 0xA9, 0x62, 0xAE, 0xA3, 0x8B,
+    0x6E, 0x0B, 0x1D, 0xB9, 0x8F, 0xE8, 0xAA, 0x57, 0xD7, 0xE3, 0x65, 0x15, 0x28, 0x88, 0xF5, 0x21,
+    0xF3, 0x38, 0xA4, 0xFC, 0xDB, 0x09, 0xC1, 0x7A, 0x7B, 0xA7, 0xFF, 0x0B, 0xA3, 0x18, 0xA2, 0x42,
+    0x28, 0x22, 0xB2, 0x95, 0x25, 0x56, 0x08, 0xFF, 0x3D, 0xB5, 0xF1, 0x41, 0x44, 0x34, 0x64, 0x67,
+    0x2C, 0xD5, 0xF0, 0x40, 0x9B, 0x82, 0x18, 0xAE, 0x8E, 0x74, 0xFE, 0x6D, 0xCC, 0x3E, 0x02, 0x13,
+    0x41, 0xC3, 0x32, 0x33, 0x76, 0x3A, 0x4A, 0x5B, 0xED, 0xFC, 0x64, 0xFB, 0x17, 0x2A, 0xB1, 0x9B,
+    0xF6, 0xB9, 0x45, 0x83, 0xBC, 0x42, 0x12, 0xAB, 0x91, 0xFD, 0x2A, 0x34, 0xE7, 0x56, 0xBA, 0xB8,
+    0x69, 0x81, 0xBA, 0x30, 0x6C, 0x8C, 0x4B, 0xAB, 0x1D, 0x47, 0x57, 0xAA, 0xE7, 0x3F, 0x25, 0x25,
+    0x7E, 0x6A, 0x2D, 0x35, 0x61, 0xB0, 0xC1, 0xAC, 0x81, 0xFE, 0xB5, 0x28, 0x7E, 0xFF, 0x6B, 0x6B,
+    0x71, 0xBA, 0x60, 0x0C, 0x56, 0xCC, 0x6D, 0xA2, 0x23, 0xB2, 0x2B, 0xFB, 0xCB, 0x16, 0x25, 0xFE,
+    0x6C, 0xAC, 0x81, 0x2E, 0xAC, 0x11, 0xB2, 0x79, 0xC8, 0x7A, 0x44, 0x0B, 0x82, 0xF8, 0xC6, 0xE0,
+    0x2D, 0x92, 0x58, 0x73, 0xAF, 0x8A, 0xD7, 0x3D, 0x2C, 0x05, 0x09, 0x54, 0x2F, 0xDE, 0x12, 0x17,
+    0xC5, 0xB1, 0x32, 0xFA, 0x58, 0xE4, 0x0F, 0x74, 0x1E, 0xAA, 0xAC, 0x3B, 0x35, 0xDF, 0x92, 0x9C,
+    0xB2, 0xC2, 0xA6, 0x90, 0x6D, 0xD4, 0xEB, 0x13, 0xA8, 0xEA, 0xC2, 0x61, 0xED, 0x67, 0x65, 0x44,
+    0xAD, 0x46, 0x28, 0x11, 0x0F, 0x46, 0x04, 0x49, 0xE6, 0x2E, 0x1A, 0xD6, 0x67, 0x72, 0x7C, 0x0D,
+    0x6A, 0x8A, 0xFA, 0xDB, 0x94, 0x66, 0x84, 0xF1, 0x31, 0x3F, 0x38, 0x1C, 0x04, 0xCF, 0x09, 0x52,
+    0x2F, 0xDB, 0xF6, 0x6F, 0xEB, 0x69, 0x03, 0x10, 0x92, 0xA0, 0x95, 0x0A, 0xE5, 0x52, 0x4A, 0x9B,
+    0xD7, 0x76, 0x05, 0x80, 0x07, 0x09, 0x4A, 0x3A, 0x37, 0xCD, 0xB3, 0x73, 0x64, 0x1F, 0xAB, 0x14,
+    0x57, 0xA0, 0xFF, 0x9B, 0x0D, 0x34, 0x56, 0x0A, 0x79, 0x79, 0x20, 0x7C, 0x4A, 0x52, 0xD8, 0xB4,
+    0x22, 0x45, 0x88, 0x90, 0xA0, 0x35, 0x36, 0x71, 0x9B, 0xD8, 0x2E, 0xC5, 0x89, 0x20, 0x54, 0x36,
+    0x7A, 0x47, 0x03, 0x45, 0xF8, 0xB2, 0x20, 0xD0, 0xBC, 0x84, 0x05, 0x40, 0xDB, 0xD4, 0xD0, 0x1C,
+    0x9E, 0xF0, 0x37, 0x02, 0x31, 0xD9, 0xDE, 0xBC, 0xBD, 0x87, 0x3E, 0xA7, 0x2A, 0xD9, 0x7E, 0x8B,
+    0xBD, 0xEF, 0x67, 0xC4, 0x06, 0x00, 0x43, 0xA7, 0x89, 0xE6, 0xA8, 0x7B, 0xBD, 0x03, 0xCB, 0xC8,
+    0x2F, 0x46, 0xEF, 0xA5, 0xEF, 0x16, 0x7D, 0xE3, 0xE9, 0x63, 0xCC, 0x89, 0xFC, 0xE5, 0x14, 0x40,
+    0x3A, 0x5A, 0xC8, 0xBC, 0xF6, 0xD9, 0x3D, 0xAC, 0x82, 0xB5, 0x7F, 0xB7, 0xE4, 0x8F, 0x5C, 0x0A,
+    0x5F, 0x6E, 0x0C, 0xF1, 0x7E, 0xAD, 0x12, 0xFA, 0x4E, 0x01, 0xC5, 0x62, 0xBF, 0x10, 0x27, 0xE7,
+    0x72, 0xC0, 0xC3, 0xA6, 0x8B, 0xF7, 0xD8, 0xA5, 0x52, 0x20, 0xA3, 0xEE, 0x70, 0xB0, 0xF6, 0xE2,
+    0x6A, 0x8D, 0x29, 0x73, 0x17, 0xBD, 0x68, 0x45, 0x25, 0x53, 0x68, 0xC5, 0x1B, 0xD5, 0xC1, 0xFF,
+    0x38, 0x17, 0x25, 0x47, 0x0C, 0x2E, 0xD4, 0x3E, 0xF7, 0x91, 0x36, 0x35, 0xAD, 0x72, 0xBE, 0x5A,
+    0x19, 0x04, 0x97, 0x77, 0x51, 0x5D, 0x2E, 0x51, 0xA7, 0xC3, 0x22, 0xEE, 0xE6, 0xC9, 0x9A, 0x3B,
+    0x9D, 0xA2, 0x84, 0xDE, 0x2B, 0x76, 0x62, 0x00, 0x2C, 0x4F, 0xA5, 0x12, 0xC5, 0x43, 0x8B, 0xD0,
+    0x13, 0x9E, 0x88, 0x3D, 0x33, 0xC3, 0xF4, 0x41, 0x6D, 0x00, 0x3B, 0xC3, 0xE1, 0xA1, 0x0A, 0x6A,
+    0x63, 0xE8, 0x42, 0x89, 0x05, 0xAF, 0xAA, 0x2B, 0x07, 0x25, 0x5B, 0xE1, 0xAA, 0xC6, 0xA7, 0xBD,
+    0x72, 0xC5, 0x17, 0x75, 0x53, 0x61, 0x20, 0x76, 0x14, 0xCC, 0x7A, 0x06, 0xF5, 0x21, 0xD2, 0x8F,
+    0x8F, 0x18, 0x5C, 0x50, 0xAA, 0x98, 0xA4, 0xB9, 0x7E, 0xBF, 0xD6, 0xBA, 0xEA, 0x9D, 0x64, 0xF3,
+    0x31, 0x4D, 0x48, 0x18, 0x58, 0xF0, 0x07, 0x23, 0xD6, 0x3E, 0xCA, 0xB4, 0x54, 0xE6, 0x04, 0x19,
+    0x18, 0xD5, 0xC7, 0x54, 0x85, 0x75, 0xA6, 0x58, 0x0E, 0xEB, 0x74, 0xD6, 0xF6, 0xAF, 0xB4, 0x9D,
+    0x70, 0xF0, 0x7B, 0x88, 0x8B, 0x8B, 0x64, 0x2C, 0x20, 0x40, 0x98, 0x5E, 0x2C, 0x64, 0xC6, 0x98,
+    0x26, 0x1D, 0x94, 0x90, 0x01, 0x03, 0x66, 0x5D, 0x6D, 0xC0, 0xBB, 0x5A, 0xC4, 0xF0, 0x0B, 0x78,
+    0x4E, 0x2E, 0x89, 0xA2, 0x86, 0x41, 0x90, 0x7B, 0x1D, 0x2C, 0x76, 0x17, 0xE5, 0x39, 0xE9, 0xF7,
+    0x00, 0xC0, 0x6B, 0x1F, 0x7E, 0xC1, 0xC2, 0x15, 0xA8, 0xA3, 0xF6, 0x7C, 0xF6, 0x19, 0x3F, 0xE0,
+    0xCE, 0xEF, 0x5C, 0x7B, 0x63, 0x63, 0xBE, 0x64, 0x33, 0x0E, 0x03, 0xFE, 0xF9, 0x03, 0xD9, 0xF7,
+    0xDF, 0x99, 0x37, 0x70, 0xAE, 0x6B, 0x90, 0x2A, 0x99, 0x14, 0x1D, 0x0C, 0x83, 0x6A, 0xC9, 0xEA,
+    0x34, 0x8C, 0xAC, 0x51, 0x30, 0x04, 0x4A, 0x71, 0xA8, 0x8E, 0xC6, 0xD8, 0x19, 0x70, 0xB0, 0xE4,
+    0x80, 0x55, 0x52, 0x09, 0x5E, 0x58, 0x22, 0xFF, 0x80, 0xC1, 0xAE, 0x0A, 0x87, 0xC7, 0xBE, 0xC7,
+    0x95, 0xEA, 0x98, 0x5A, 0xC0, 0x67, 0xA3, 0xDA, 0x68, 0xEF, 0xBA, 0x48, 0xF1, 0xA0, 0x2C, 0x33,
+    0x56, 0x1A, 0x45, 0xB8, 0xA3, 0x70, 0xA8, 0xD3, 0xB2, 0xCF, 0x1C, 0xC0, 0x02, 0x1E, 0xDA, 0x14,
+    0x0B, 0x2C, 0x03, 0xEA, 0xEC, 0x2E, 0x2B, 0x21, 0x1C, 0xE1, 0x99, 0xDF, 0x46, 0xD1, 0xC1, 0xE9,
+    0x00, 0x90, 0xB6, 0x7D, 0x79, 0xA2, 0x42, 0xF7, 0x0E, 0x67, 0xE3, 0x8B, 0xE1, 0x42, 0x26, 0x7A,
+    0x69, 0x82, 0x9D, 0x5C, 0x26, 0xFE, 0xE2, 0x6D, 0x51, 0x48, 0x74, 0x4A, 0xE1, 0xA7, 0x77, 0x07,
+    0x09, 0xA3, 0x30, 0x0B, 0x48, 0x4F, 0x64, 0xB1, 0x84, 0x91, 0xFF, 0x81, 0xFF, 0x5C, 0x94, 0x08,
+    0x44, 0xA8, 0xD6, 0x80, 0x5B, 0x26, 0xF7, 0x5A, 0xDC, 0xF0, 0xC1, 0x6D, 0xED, 0xAF, 0xC3, 0x8D,
+    0xFA, 0x54, 0xE4, 0xB1, 0x8F, 0x03, 0x45, 0x01, 0x63, 0x72, 0x17, 0x81, 0x21, 0x1D, 0x1E, 0xF3,
+    0x19, 0x2A, 0xD2, 0x43, 0x4C, 0x6E, 0xC8, 0x83, 0x13, 0x13, 0x4A, 0x00, 0x7E, 0xEF, 0x2D, 0x06,
+    0x07, 0x40, 0x81, 0x0A, 0xC3, 0xE8, 0x13, 0xF6, 0xDC, 0xD7, 0x2C, 0xEB, 0xEC, 0x7C, 0xF9, 0x7B,
+    0xC9, 0xD1, 0x79, 0x3A, 0x18, 0x74, 0xFF, 0xE8, 0xB3, 0xAC, 0x06, 0xDC, 0x68, 0x07, 0x35, 0x0A,
+    0x45, 0x67, 0x5B, 0xC8, 0x1C, 0x3D, 0x4F, 0x77, 0xCD, 0x1D, 0xEF, 0x2E, 0xBD, 0xA7, 0x2E, 0xD4,
+    0xD7, 0x2E, 0x32, 0xEC, 0x89, 0x42, 0x46, 0x4B, 0x68, 0x60, 0x86, 0x72, 0xA9, 0x9B, 0xC3, 0x36,
+    0xDE, 0x00, 0xBF, 0xCF, 0x4A, 0xFD, 0x2C, 0x98, 0xEE, 0x98, 0x6F, 0xD7, 0xA7, 0x7B, 0xE4, 0xDA,
+    0xF6, 0xE2, 0x6E, 0x33, 0x29, 0x7F, 0x7E, 0xA0, 0xE9, 0x6A, 0x07, 0x69, 0xA8, 0xF3, 0x65, 0xC6,
+    0x8F, 0x9D, 0x43, 0x88, 0xDB, 0xF9, 0x7A, 0x81, 0x7C, 0x8F, 0xF0, 0x99, 0xC7, 0x4A, 0x30, 0xC0,
+    0x5C, 0x15, 0x21, 0x00, 0xC7, 0x19, 0x23, 0x48, 0xD7, 0x4E, 0x64, 0x8C, 0xA4, 0x26, 0x94, 0x80,
+    0x24, 0xC1, 0xC1, 0x87, 0xC9, 0x55, 0x51, 0x90, 0x7F, 0x9A, 0xDB, 0x2A, 0x7E, 0x56, 0xCA, 0xE1,
+    0xDF, 0x81, 0xD9, 0x8B, 0x78, 0xAB, 0x7C, 0x65, 0x04, 0x69, 0x49, 0x6C, 0x42, 0x8D, 0x48, 0x24,
+    0x1C, 0xB7, 0x8A, 0x58, 0xAA, 0x18, 0x8E, 0xF3, 0xD1, 0x73, 0xB2, 0x20, 0xD9, 0x46, 0x0C, 0x5A,
+    0xBE, 0x76, 0x2E, 0x86, 0x9F, 0xD5, 0x15, 0xA9, 0x7C, 0x24, 0x09, 0x05, 0x0F, 0xF0, 0x3E, 0xB9,
+    0x9A, 0x12, 0x1A, 0xDC, 0x41, 0x5A, 0x9F, 0x50, 0x3C, 0x76, 0xE5, 0x21, 0x98, 0x33, 0x1A, 0xA1,
+    0x90, 0x2C, 0xF0, 0x22, 0x1A, 0x3D, 0x20, 0x24, 0xC4, 0x96, 0xC9, 0x13, 0xD5, 0x8D, 0x81, 0x89,
+    0xA1, 0x61, 0x88, 0xAA, 0xEC, 0x8C, 0xDC, 0x31, 0x7E, 0x3A, 0xFD, 0x6A, 0xBF, 0x8F, 0x97, 0x03,
+    0x67, 0x58, 0x31, 0xD3, 0x2D, 0x63, 0xFC, 0x67, 0x8D, 0x14, 0xC3, 0xEB, 0xB7, 0xF8, 0x3E, 0x85,
+    0xD3, 0x8F, 0x9E, 0xD7, 0xB4, 0x86, 0x3C, 0xDB, 0xD2, 0x5F, 0x0D, 0xD2, 0xB2, 0xD1, 0xFC, 0xA5,
+    0x95, 0x4E, 0x80, 0x9E, 0x4E, 0x8D, 0x93, 0xAD, 0xB3, 0xCA, 0x8A, 0xE0, 0xBC, 0x54, 0x7F, 0xD6,
+    0xB1, 0x74, 0xC0, 0xE8, 0x4A, 0xF5, 0xC7, 0x72, 0xA7, 0xB7, 0x42, 0x4D, 0xD9, 0x60, 0x15, 0xEB,
+    0xB6, 0x29, 0x02, 0x1F, 0x83, 0x78, 0x58, 0x09, 0x9E, 0x50, 0xA3, 0x39, 0xC6, 0x22, 0x1E, 0xD1,
+    0xE6, 0xB9, 0x5A, 0xA3, 0x6F, 0x80, 0x43, 0xA9, 0x58, 0x0B, 0x8C, 0x60, 0xF4, 0xC2, 0xD2, 0x0F,
+    0x9C, 0x78, 0xFE, 0xB1, 0x33, 0x01, 0x67, 0xFF, 0xEC, 0x93, 0xC1, 0x6C, 0x77, 0x04, 0x1E, 0xD7,
+    0xD2, 0x65, 0xDD, 0xF5, 0xAF, 0x6D, 0xC2, 0x04, 0x33, 0xF9, 0x38, 0x8F, 0xF3, 0xCF, 0x80, 0x7D,
+    0x46, 0xFA, 0x53, 0x58, 0x30, 0xA6, 0x0B, 0x47, 0xAE, 0xF0, 0xCB, 0x31, 0xA2, 0xC2, 0xB4, 0xB9,
+    0xA3, 0x8C, 0xA3, 0xAA, 0x48, 0xF5, 0x0E, 0x8E, 0x45, 0x92, 0x12, 0xFB, 0x17, 0x8F, 0xC3, 0x2C,
+    0x8D, 0xA7, 0x93, 0x2A, 0xB3, 0x76, 0x7B, 0x8D, 0xE6, 0x66, 0xBF, 0x9A, 0x88, 0x64, 0x91, 0x2C,
+    0xD5, 0x9D, 0xE6, 0x28, 0xD6, 0x91, 0x48, 0xAC, 0x5D, 0xCB, 0xE1, 0x9B, 0x1E, 0x9C, 0x73, 0xF4,
+    0xCB, 0x54, 0x3D, 0x72, 0xED, 0xA0, 0xFA, 0x97, 0x00, 0xCB, 0x32, 0x69, 0xCC, 0xB7, 0x00, 0x61,
+    0xE8, 0x97, 0x78, 0x79, 0xBA, 0x3D, 0x7B, 0x98, 0xA8, 0xBF, 0xA0, 0xF2, 0x3B, 0x23, 0x22, 0x02,
+    0x10, 0x16, 0xB2, 0x93, 0xE1, 0x74, 0x95, 0x65, 0xE5, 0x5F, 0x53, 0xEC, 0x70, 0x9F, 0x9F, 0xB6,
+    0xDD, 0x0B, 0xFF, 0xB4, 0x48, 0x34, 0x1F, 0xA1, 0xF6, 0xBF, 0x61, 0x36, 0x4B, 0xF2, 0xCD, 0xE4,
+    0xD6, 0x88, 0x08, 0x4A, 0x17, 0xE9, 0x33, 0xC6, 0xCA, 0x44, 0xD6, 0x00, 0xA1, 0x6D, 0x2C, 0xFD,
+    0x09, 0x80, 0x51, 0xB8, 0xDC, 0xA1, 0xF9, 0x7D, 0x55, 0x87, 0xE1, 0x52, 0x66, 0xF3, 0xA5, 0xF7,
+    0x0E, 0x61, 0xFC, 0x7B, 0xA5, 0xC0, 0x26, 0x82, 0x37, 0x7A, 0x2D, 0xBF, 0xEA, 0x0E, 0xBD, 0xF3,
+    0xCD, 0x50, 0x4C, 0x7E, 0x0F, 0xD2, 0xCC, 0x90, 0x81, 0x25, 0x28, 0xAF, 0xD5, 0x7E, 0x89, 0xA5,
+    0xA8, 0x18, 0x2C, 0x6B, 0x53, 0x07, 0x51, 0xE5, 0x09, 0x07, 0x3E, 0xCF, 0x58, 0xB8, 0x49, 0xCA,
+    0xE7, 0xA3, 0x36, 0x88, 0xAD, 0x46, 0xF4, 0x8F, 0xA9, 0x55, 0x53, 0x02, 0xED, 0x8D, 0xFE, 0x50,
+    0x20, 0xD6, 0x5E, 0xD4, 0xEB, 0x2B, 0x34, 0x3D, 0x04, 0x84, 0x39, 0x20, 0x16, 0xCD, 0xDF, 0x40,
+    0x06, 0x2E, 0xE1, 0xB7, 0x81, 0x13, 0xE3, 0xC2, 0x94, 0x5A, 0xFF, 0xE4, 0x4D, 0xBC, 0x1A, 0x80,
+    0x9A, 0x17, 0xBD, 0x1C, 0xD3, 0x2B, 0x3C, 0xDE, 0xE4, 0x77, 0xA6, 0x59, 0x48, 0x5A, 0x1C, 0xE1,
+    0x81, 0x89, 0xAF, 0x34, 0xBC, 0x2F, 0xC2, 0x69, 0x39, 0x9E, 0xE9, 0xEF, 0x9B, 0x72, 0x56, 0x19,
+    0x90, 0x5E, 0x54, 0x09, 0xF7, 0x5D, 0xBF, 0x04, 0x4F, 0x4D, 0x9A, 0x0B, 0x93, 0x55, 0x09, 0xDB,
+    0x63, 0xB1, 0xF3, 0x7C, 0xD8, 0xB0, 0x8A, 0x69, 0x43, 0x1E, 0x11, 0x3B, 0x57, 0x6C, 0x0B, 0x04,
+    0xC8, 0x38, 0xFF, 0x1F, 0x11, 0x07, 0xF7, 0x05, 0x9E, 0x15, 0x3E, 0xF9, 0x37, 0x34, 0x66, 0x33,
+    0x0B, 0x33, 0x01, 0xBE, 0x7B, 0xD6, 0xDA, 0x54, 0x38, 0xA9, 0x5B, 0x82, 0x83, 0xCC, 0x91, 0xD4,
+    0x89, 0xA2, 0x3F, 0x88, 0x46, 0x4A, 0x38, 0xE7, 0x23, 0x03, 0xCB, 0x80, 0x3B, 0xFA, 0xFE, 0xB9,
+    0x1E, 0xE9, 0x2D, 0x3C, 0x64, 0x60, 0x2D, 0xB6, 0xAC, 0xBA, 0xAB, 0xD6, 0x51, 0x15, 0xB2, 0x1A,
+    0xB6, 0x98, 0xBB, 0x67, 0x2D, 0x04, 0xBB, 0x78, 0x6D, 0xE5, 0xFB, 0x95, 0x8B, 0xE5, 0xCC, 0xAD,
+    0xE4, 0x15, 0xBB, 0x5F, 0xF0, 0x56, 0x41, 0x06, 0x4D, 0x21, 0x10, 0x61, 0x3C, 0x63, 0xAC, 0x59,
+    0x83, 0x2D, 0x4F, 0x0E, 0x52, 0xDB, 0x0A, 0x9D, 0x3B, 0xCB, 0x61, 0xAA, 0x4D, 0x84, 0xB2, 0xC2,
+    0xFC, 0x7E, 0x67, 0xD3, 0x86, 0x3E, 0x83, 0xF2, 0x6B, 0x1C, 0x8D, 0xD2, 0x6C, 0x55, 0x80, 0x14,
+    0x54, 0xC9, 0x14, 0x7E, 0x14, 0xD9, 0x2A, 0xEE, 0x53, 0xAE, 0xB8, 0x27, 0xB3, 0x34, 0x02, 0xD2,
+    0xFE, 0xA3, 0xC8, 0x75, 0x81, 0x6E, 0xC7, 0xCE, 0x83, 0xD5, 0xCB, 0xDF, 0x5C, 0xED, 0xD2, 0x5A,
+    0xCC, 0xA9, 0x4E, 0xD1, 0x0A, 0x50, 0x0C, 0x9D, 0x84, 0x79, 0x84, 0x6D, 0xA4, 0x41, 0x53, 0x69,
+    0x0E, 0x6C, 0x7D, 0x19, 0x66, 0x1D, 0x05, 0xCE, 0xF8, 0xBE, 0xCC, 0xF8, 0xC5, 0x22, 0x0B, 0x8A,
+    0x12, 0xC1, 0xB6, 0xF1, 0x96, 0xC7, 0xEA, 0xDC, 0xAE, 0x8D, 0xE9, 0x4A, 0x88, 0x8B, 0xC0, 0xA9,
+    0xBD, 0xE7, 0xA4, 0x61, 0x3C, 0xE7, 0x8A, 0xB5, 0x60, 0x5C, 0xA3, 0x02, 0x63, 0x6A, 0x3D, 0xE3,
+    0xBB, 0x25, 0x62, 0xA6, 0xC1, 0xFA, 0x37, 0x10, 0x51, 0x24, 0x85, 0x7A, 0x2F, 0x03, 0x07, 0x35,
+    0x0E, 0xDF, 0xFE, 0xA1, 0x81, 0x06, 0xCC, 0xC4, 0xBA, 0xFA, 0xE7, 0x92, 0x1E, 0xCA, 0xB2, 0x2C,
+    0x69, 0x92, 0xAD, 0x10, 0xDF, 0x14, 0xBA, 0xC0, 0xD1, 0xE0, 0x80, 0x56, 0x63, 0xF7, 0x02, 0x63,
+    0x9B, 0x2C, 0xEA, 0xE6, 0x07, 0x14, 0x77, 0x30, 0xD9, 0x9A, 0xA5, 0xEF, 0xE8, 0xF1, 0x69, 0xA9,
+    0x8B, 0x74, 0xD6, 0xCB, 0x4A, 0xAB, 0x3E, 0xD0, 0x05, 0xCF, 0xC7, 0xCB, 0x5F, 0x77, 0x61, 0x0B,
+    0xF3, 0xEF, 0x84, 0x42, 0x63, 0x1A, 0x08, 0x90, 0x38, 0xCC, 0xCC, 0x77, 0x73, 0xF4, 0x10, 0x16,
+    0x3B, 0x88, 0x6A, 0x36, 0x7F, 0x3D, 0x1B, 0x47, 0xA8, 0x43, 0x13, 0xDE, 0x0F, 0x3E, 0xF8, 0x32,
+    0xEB, 0xE0, 0x13, 0x3F, 0xE9, 0x45, 0x64, 0x17, 0xAD, 0x1D, 0x94, 0x00, 0x89, 0x5B, 0xDD, 0x1B,
+    0xD8, 0xCC, 0x3C, 0x2A, 0x48, 0xB3, 0xF8, 0xB8, 0xF1, 0xC1, 0x3D, 0x36, 0x45, 0xB6, 0xDC, 0x29,
+    0x47, 0x8F, 0x1D, 0x5B, 0x3C, 0x11, 0xF1, 0xEC, 0xA0, 0xB6, 0x74, 0xBF, 0xF0, 0x55, 0xC6, 0x52,
+    0x65, 0x24, 0x6E, 0x75, 0xE5, 0xC0, 0x3D, 0xE1, 0x34, 0x50, 0xB2, 0xB1, 0xD2, 0xC4, 0x69, 0xAB,
+    0x31, 0xB5, 0xFD, 0x10, 0xAD, 0x10, 0x00, 0x18, 0x87, 0x0B, 0x63, 0xEC, 0x74, 0x72, 0x07, 0xCC,
+    0x6B, 0xD8, 0x46, 0x69, 0x4A, 0x3A, 0xD1, 0x2B, 0x25, 0x6C, 0xF7, 0x45, 0x84, 0x1D, 0x97, 0x63,
+    0x70, 0x68, 0xF4, 0x8B, 0x33, 0x4A, 0xE5, 0x16, 0x81, 0xD2, 0x50, 0x2B, 0xD8, 0x51, 0xEC, 0x33,
+    0xDB, 0xC8, 0xC0, 0x50, 0xE3, 0xF0, 0x1B, 0x57, 0xFC, 0xC9, 0x7D, 0x7A, 0xC4, 0xA4, 0xF3, 0x39,
+    0x73, 0xAB, 0xAE, 0x42, 0x71, 0x4B, 0xF0, 0xD1, 0xAD, 0xF4, 0x67, 0x3A, 0x9E, 0xFD, 0xA9, 0xA7,
+    0x22, 0xF9, 0x06, 0x93, 0xEE, 0xBA, 0x96, 0xB4, 0x31, 0x69, 0x41, 0x8A, 0x6D, 0x8D, 0x7C, 0xBA,
+    0x03, 0xBB, 0x56, 0x91, 0xAA, 0x63, 0x58, 0xC0, 0x99, 0x61, 0xF8, 0x83, 0x65, 0x9D, 0x0B, 0x95,
+    0x64, 0x6D, 0xD6, 0x24, 0x9D, 0x52, 0x6F, 0x4A, 0x46, 0xDD, 0x77, 0x09, 0x10, 0x4B, 0x4F, 0x94,
+    0x82, 0x3E, 0xA6, 0xB4, 0x48, 0xE9, 0x9D, 0x5E, 0x8D, 0x79, 0x36, 0xDD, 0x4A, 0xF4, 0x23, 0x79,
+    0x10, 0x38, 0xF4, 0x4D, 0x53, 0xA4, 0xB9, 0xD1, 0xC3, 0xF3, 0x79, 0x31, 0xC3, 0x63, 0xBD, 0x71,
+    0x0B, 0x6A, 0x0C, 0x5F, 0x08, 0x6E, 0xB5, 0x36, 0x89, 0x03, 0x16, 0x5D, 0x26, 0xCE, 0x9C, 0xBF,
+    0x8F, 0x7E, 0x8D, 0x9A, 0x0B, 0x01, 0x77, 0xD1, 0x94, 0xA9, 0x39, 0x04, 0x20, 0x02, 0xF0, 0x90,
+    0x4A, 0x89, 0xF0, 0x6F, 0x22, 0xD9, 0xC5, 0x05, 0xDD, 0x2A, 0xB7, 0xDA, 0x78, 0x9A, 0x2C, 0xEB,
+    0xA0, 0x43, 0xE8, 0xAB, 0x82, 0xA4, 0xF2, 0x5F, 0xA2, 0xFA, 0xC3, 0x30, 0x3E, 0x75, 0xCE, 0x2A,
+    0xFC, 0x5B, 0x46, 0x87, 0x94, 0xC8, 0x6E, 0x3A, 0x97, 0x07, 0x31, 0x1D, 0x80, 0xE0, 0xD8, 0xC7,
+    0x80, 0x43, 0x47, 0xC5, 0xA3, 0xBD, 0xFA, 0x47, 0x6B, 0x09, 0x21, 0xF8, 0x2D, 0xA0, 0xFE, 0x41,
+    0x78, 0xC1, 0x44, 0x54, 0xE5, 0xAD, 0x1E, 0xCF, 0x9B, 0x67, 0xED, 0x27, 0x5C, 0x76, 0x1A, 0x16,
+    0x08, 0x8A, 0x70, 0x7D, 0x74, 0x93, 0x0B, 0x01, 0x7A, 0x3E, 0x5E, 0x15, 0xBD, 0x4B, 0xFC, 0x29,
+    0x34, 0x11, 0x43, 0x95, 0x0F, 0xE7, 0x50, 0xCC, 0xAD, 0xE3, 0xD4, 0x1F, 0x53, 0x5B, 0x85, 0x52,
+    0x72, 0x3C, 0x65, 0x2F, 0xFA, 0x34, 0xD7, 0x1C, 0xAF, 0x81, 0x74, 0x7F, 0xCD, 0x2C, 0x14, 0x08,
+    0xD6, 0x72, 0xA6, 0xBF, 0x7F, 0x5B, 0x23, 0x74, 0x55, 0xFD, 0xBF, 0x58, 0x4C, 0x1F, 0x26, 0x4C,
+    0x77, 0xDA, 0x0B, 0x11, 0xDD, 0x11, 0x99, 0x10, 0xB6, 0x9A, 0xE5, 0x77, 0xA5, 0x63, 0x81, 0xF7,
+    0x2B, 0x9D, 0x8E, 0xD1, 0xFE, 0xF8, 0x8D, 0x8E, 0x24, 0x12, 0x5B, 0x7D, 0x3A, 0xDD, 0x49, 0xAD,
+    0x06, 0xEE, 0x1F, 0x8C, 0x95, 0x9A, 0x8F, 0x2C, 0xEF, 0xF5, 0x85, 0x61, 0xAF, 0x09, 0xB0, 0x27,
+    0x16, 0x48, 0xC6, 0x37, 0x2D, 0x0A, 0x17, 0xC4, 0xDA, 0x53, 0x51, 0xEB, 0x42, 0x95, 0xCA, 0x14,
+    0x32, 0x93, 0x5B, 0x40, 0x92, 0x08, 0x6A, 0xE9, 0xB3, 0x66, 0x9D, 0xE0, 0x81, 0x57, 0x9A, 0x38,
+    0x4A, 0x23, 0xFE, 0x8F, 0x02, 0x65, 0x33, 0x35, 0x55, 0xB8, 0xB2, 0x34, 0x9D, 0xD2, 0xDC, 0xD7,
+    0xF4, 0x19, 0x1D, 0x83, 0x2A, 0x91, 0xF0, 0x84, 0xD6, 0x7F, 0x45, 0x63, 0x6E, 0x4F, 0x0E, 0x7E,
+    0x59, 0xBC, 0x22, 0x92, 0xD4, 0xC5, 0xCF, 0xE8, 0xED, 0x15, 0x8C, 0xB5, 0xAA, 0x43, 0x17, 0xE0,
+    0x46, 0x04, 0x7A, 0x80, 0x15, 0x0A, 0x40, 0xE8, 0x6E, 0x4E, 0x53, 0x10, 0x7E, 0xB1, 0x71, 0x43,
+    0x20, 0x14, 0xA3, 0xF5, 0xD2, 0x04, 0x37, 0x90, 0xA8, 0xBF, 0x4C, 0x4E, 0x1E, 0xB7, 0xCE, 0x0F,
+    0x0C, 0xD1, 0x82, 0x64, 0x4B, 0x79, 0x47, 0x12, 0xE6, 0x7A, 0x4E, 0xC1, 0xAD, 0xFD, 0xFE, 0x31,
+    0x09, 0x36, 0x41, 0x24, 0x0A, 0xCF, 0x20, 0x0C, 0xC3, 0x04, 0x57, 0x39, 0xDD, 0x9C, 0x3E, 0x2E,
+    0xED, 0xAD, 0x96, 0x20, 0xBD, 0xC6, 0xB7, 0x18, 0xEC, 0x03, 0x2E, 0xFC, 0x45, 0x93, 0xD2, 0x09,
+    0x13, 0xAE, 0xB8, 0x22, 0xFB, 0x4B, 0xB4, 0x7D, 0x0F, 0x5E, 0x9F, 0xE1, 0xFB, 0x94, 0xA4, 0xC7,
+    0x07, 0x9E, 0x72, 0x48, 0x7F, 0xEC, 0xC5, 0x0A, 0x19, 0xD5, 0x54, 0x2B, 0x77, 0x16, 0x0A, 0xDC,
+    0x22, 0xC7, 0x03, 0x12, 0x9E, 0x11, 0xAC, 0x70, 0x44, 0x1D, 0xA4, 0xC5, 0xE2, 0x19, 0x9B, 0xE3,
+    0xDC, 0x05, 0x36, 0x30, 0x92, 0xCC, 0xC3, 0xF7, 0xCF, 0xD5, 0x67, 0x3C, 0xF7, 0x99, 0x37, 0x16,
+    0xB3, 0x38, 0x38, 0xEE, 0x66, 0x7C, 0x80, 0xFD, 0x02, 0x94, 0xFA, 0x1F, 0x10, 0xD9, 0xA8, 0x45,
+    0x58, 0x91, 0x85, 0xDA, 0x1F, 0xF2, 0x6B, 0xE3, 0x8F, 0x09, 0xB8, 0xA1, 0x17, 0xA2, 0xF0, 0x75,
+    0x5B, 0x5D, 0xEC, 0x39, 0x86, 0x0C, 0x88, 0xAE, 0xF6, 0x99, 0x7F, 0x55, 0x70, 0x52, 0xF0, 0x63,
+    0x66, 0x75, 0x80, 0xF4, 0x87, 0x13, 0x01, 0x26, 0x82, 0x39, 0xE3, 0x2F, 0xE2, 0x5F, 0xCF, 0xFC,
+    0x22, 0x28, 0xE9, 0x75, 0x8F, 0xCD, 0x7A, 0x03, 0x77, 0xB0, 0x4E, 0x19, 0x03, 0x73, 0x2B, 0xFB,
+    0x87, 0xF4, 0x94, 0x18, 0xF8, 0xF7, 0xCB, 0x94, 0x7C, 0xB9, 0x54, 0xD5, 0xED, 0xC5, 0x47, 0x3B,
+    0x12, 0xA1, 0x65, 0x05, 0x39, 0x45, 0x5A, 0x51, 0x75, 0x3B, 0xC8, 0x84, 0x6F, 0x1F, 0x5D, 0x6C,
+    0x7E, 0xBE, 0xE2, 0x42, 0x1A, 0xD8, 0x74, 0x0D, 0x17, 0x62, 0x9B, 0xBE, 0xDF, 0x55, 0x15, 0x50,
+    0xC4, 0xDF, 0x95, 0x92, 0x9D, 0xCD, 0xA2, 0x3F, 0x38, 0x5C, 0x09, 0x51, 0xBB, 0xF4, 0xD8, 0xE9,
+    0xEF, 0xB0, 0x88, 0x0C, 0x92, 0x7F, 0xCB, 0x01, 0x91, 0x13, 0x7A, 0x44, 0xA1, 0x98, 0x2E, 0x0E,
+    0x12, 0x63, 0xA7, 0xBC, 0xD3, 0x0C, 0x07, 0xE0, 0xD4, 0x72, 0xF5, 0x45, 0xCE, 0x44, 0x4D, 0xF8,
+    0x76, 0xF9, 0x1A, 0x1C, 0xF5, 0x80, 0xB2, 0x93, 0x23, 0x93, 0x9B, 0xEE, 0x99, 0x35, 0xE4, 0xBB,
+    0xE9, 0x4D, 0x72, 0xFC, 0xA0, 0xE6, 0x7B, 0x27, 0x67, 0x11, 0x88, 0x9B, 0xAA, 0x38, 0x8D, 0x6C,
+    0x33, 0x52, 0x5D, 0xD6, 0x22, 0xF4, 0xBC, 0xD1, 0xCD, 0x9C, 0x74, 0x3A, 0xEA, 0x2B, 0xB0, 0x20,
+    0x2E, 0xAA, 0x75, 0xF2, 0xD6, 0xDA, 0xFB, 0x93, 0xDB, 0x71, 0xB6, 0x07, 0xD9, 0x85, 0xCA, 0xBB,
+    0x45, 0x97, 0x00, 0x42, 0xA8, 0xD1, 0xA3, 0x44, 0x13, 0x66, 0xAF, 0x0A, 0xA0, 0xEB, 0x2F, 0xA3,
+    0x27, 0x64, 0x78, 0x46, 0x9C, 0xE4, 0x99, 0xA5, 0x47, 0x96, 0xC1, 0xD1, 0x99, 0x5C, 0x9A, 0x6A,
+    0xBA, 0x5E, 0xC6, 0xBA, 0xEB, 0x63, 0x19, 0x6F, 0xC9, 0xDB, 0x36, 0xD8, 0xAD, 0x58, 0x44, 0x30,
+    0x8F, 0x59, 0x19, 0x42, 0xAF, 0x6A, 0x1B, 0x8A, 0xC9, 0xA2, 0xAE, 0x00, 0x5D, 0x5A, 0x09, 0x33,
+    0xAC, 0x02, 0xDA, 0x64, 0xAF, 0xDD, 0xDF, 0x15, 0x2A, 0xA2, 0xD2, 0xA1, 0xA6, 0x93, 0x5C, 0xE1,
+    0x10, 0xC3, 0x6A, 0x10, 0xA5, 0x97, 0x2D, 0x6D, 0xD9, 0xA9, 0xB5, 0x36, 0x71, 0x54, 0xC4, 0xEF,
+    0xC8, 0xC6, 0x17, 0x30, 0xDD, 0xCF, 0x96, 0x86, 0xC8, 0x63, 0x60, 0x21, 0xAB, 0x3D, 0xBA, 0x40,
+    0x8F, 0x30, 0x16, 0xBE, 0xD9, 0xDF, 0x7E, 0x13, 0xCB, 0xBF, 0xF7, 0x0E, 0x33, 0x31, 0x18, 0xED,
+    0x1E, 0x47, 0xD8, 0xF2, 0xCF, 0x42, 0xC8, 0xF3, 0x2C, 0x20, 0x00, 0xB1, 0x8F, 0xB9, 0x1F, 0xEA,
+    0x82, 0x11, 0x03, 0x8D, 0xB5, 0x25, 0xB4, 0x84, 0x79, 0x97, 0xDC, 0x56, 0x3C, 0x8B, 0x41, 0x9A,
+    0x01, 0x63, 0x7A, 0xF7, 0x66, 0x0F, 0x05, 0xF7, 0x4A, 0xDC, 0x05, 0x03, 0x29, 0x5C, 0xF1, 0x89,
+    0x8D, 0x38, 0x19, 0x48, 0x38, 0xBE, 0x82, 0xCD, 0x04, 0x16, 0xEC, 0xD6, 0x68, 0xB8, 0x00, 0x3D,
+    0xC6, 0x6E, 0xDA, 0x10, 0x0F, 0x12, 0x19, 0x18, 0xAE, 0x24, 0x29, 0x2E, 0xD1, 0x5D, 0xD3, 0xA2,
+    0x7A, 0x8A, 0x10, 0x20, 0xB5, 0x8A, 0xD4, 0x41, 0x66, 0x8E, 0x00, 0x9E, 0x29, 0x11, 0x3A, 0xBD,
+    0xEA, 0x66, 0xA6, 0x18, 0x87, 0xD3, 0xEE, 0x0F, 0x17, 0xE5, 0x5B, 0xB9, 0x16, 0x56, 0x22, 0xDD,
+    0x9C, 0xB6, 0x02, 0xBD, 0x6C, 0x19, 0xBA, 0x85, 0x1F, 0x44, 0xB7, 0x88, 0x43, 0x45, 0xBE, 0x29,
+    0x65, 0xA2, 0xBE, 0xC1, 0x4E, 0xCF, 0x25, 0x53, 0xD6, 0xC2, 0x53, 0x59, 0xF9, 0xA3, 0xC3, 0x52,
+    0x9C, 0xEE, 0xE0, 0x92, 0x39, 0x20, 0x97, 0xA0, 0xF7, 0x8C, 0x58, 0x8B, 0x7A, 0xEA, 0x05, 0x7B,
+    0x6B, 0x92, 0x65, 0xAC, 0x63, 0x9C, 0x11, 0x06, 0xB5, 0x2F, 0xC2, 0x5D, 0x97, 0x55, 0x88, 0x25,
+    0x3C, 0x37, 0xE8, 0x8D, 0xBE, 0xB2, 0x3C, 0xFB, 0xC5, 0x0D, 0xD9, 0x6B, 0xA6, 0x7F, 0xD4, 0xD7,
+    0xB9, 0xB8, 0x56, 0xC3, 0x9B, 0xA0, 0x75, 0x7B, 0x3D, 0x5D, 0xF4, 0x53, 0xED, 0xF7, 0xBF, 0xA7,
+    0xD9, 0xD8, 0x0C, 0x14, 0x4F, 0xD6, 0xA4, 0xAC, 0xB3, 0x33, 0x44, 0x62, 0x04, 0x52, 0xB4, 0xA2,
+    0xE3, 0x1E, 0x46, 0x73, 0x78, 0x92, 0x66, 0x24, 0xEB, 0x43, 0x46, 0xEC, 0x6C, 0x1D, 0x7B, 0xA1,
+    0x0B, 0x55, 0xCB, 0xA1, 0xF7, 0x7F, 0xCA, 0x78, 0x46, 0x22, 0x8F, 0xD7, 0xB2, 0x42, 0x86, 0x4A,
+    0xE9, 0xCC, 0xFC, 0x77, 0x88, 0x84, 0x95, 0x0A, 0x24, 0x8B, 0xB5, 0xC2, 0x66, 0x6B, 0xA3, 0x91,
+    0x47, 0xFD, 0x5B, 0x87, 0x9B, 0xE0, 0xBF, 0xB0, 0x49, 0x38, 0xD9, 0x6D, 0x05, 0x7A, 0x53, 0xFF,
+    0xDC, 0xE8, 0x9C, 0xB9, 0xAF, 0x59, 0xFD, 0xE5, 0xD4, 0xE3, 0x3A, 0x58, 0xCD, 0xA7, 0x9C, 0x6F,
+    0xE0, 0x19, 0x17, 0xB4, 0x14, 0xFD, 0x16, 0xD5, 0x39, 0x77, 0x8F, 0xCE, 0x7F, 0xC0, 0xF1, 0x5F,
+    0xE1, 0x69, 0x26, 0x89, 0x4C, 0x43, 0xCA, 0xD7, 0x37, 0x51, 0x12, 0x6B, 0x45, 0x3D, 0x8B, 0xD9,
+    0xD7, 0x8B, 0xDB, 0x22, 0x33, 0x79, 0x34, 0x56, 0xE7, 0xDC, 0x00, 0xBD, 0xD1, 0x98, 0x52, 0xAC,
+    0x1D, 0x47, 0x69, 0xFF, 0x88, 0xBF, 0x15, 0x3F, 0x7D, 0xDF, 0x12, 0x26, 0xF7, 0x1F, 0xBD, 0xD4,
+    0x13, 0x52, 0x86, 0xB5, 0x2F, 0x4F, 0x0F, 0xD2, 0x44, 0x6A, 0xB7, 0x71, 0x67, 0x69, 0x2E, 0x76,
+    0x56, 0x82, 0xFA, 0x88, 0x8B, 0xE2, 0x80, 0x45, 0x31, 0x4E, 0xE8, 0xEF, 0xFC, 0x48, 0xEA, 0x2E,
+    0x10, 0x9C, 0x73, 0x12, 0x89, 0xA6, 0x17, 0x3A, 0xFE, 0x2E, 0x4C, 0x33, 0x97, 0x54, 0x3C, 0x8D,
+    0x0F, 0xAC, 0xA5, 0xD0, 0x71, 0x62, 0x73, 0x97, 0xF8, 0xED, 0xD5, 0xCF, 0xC5, 0x18, 0x67, 0x1A,
+    0x1C, 0xE2, 0xA6, 0x2E, 0xD1, 0x51, 0x74, 0x57, 0xD3, 0xE8, 0x6E, 0x60, 0x00, 0x96, 0x2D, 0x3E,
+    0x7F, 0xD3, 0x05, 0xB0, 0x22, 0xC2, 0x0F, 0xF4, 0x69, 0x73, 0xAF, 0xC2, 0x02, 0x22, 0x40, 0xF9,
+    0x6F, 0x35, 0x13, 0x04, 0xA4, 0x48, 0xD3, 0xE7, 0xEE, 0x88, 0xC4, 0x03, 0xD5, 0x0D, 0x90, 0x48,
+    0x97, 0x8A, 0x9D, 0x12, 0x02, 0xE9, 0x04, 0xD4, 0x2A, 0xA6, 0x13, 0xF6, 0x04, 0x3C, 0x76, 0x0D,
+    0x37, 0xBB, 0xF5, 0x8A, 0x12, 0x04, 0x3A, 0xFE, 0xAC, 0xA7, 0x8D, 0xB8, 0x6E, 0xC4, 0xA5, 0x26,
+    0x84, 0xFF, 0xEA, 0x81, 0x8D, 0x33, 0x2D, 0xF0, 0x9D, 0x0B, 0xFB, 0x04, 0x7B, 0x46, 0x71, 0x57,
+    0xA0, 0x24, 0xD9, 0xF6, 0x8A, 0x44, 0x16, 0xE1, 0x7F, 0x28, 0xD2, 0xC5, 0xC2, 0xEF, 0x8D, 0xA9,
+    0x63, 0x8B, 0x6B, 0x98, 0x50, 0x1A, 0xB4, 0x66, 0xFB, 0xCD, 0x3D, 0x1E, 0x79, 0x86, 0x22, 0xA3,
+    0xB3, 0x78, 0xBF, 0x0D, 0x2E, 0x66, 0x45, 0x0A, 0xA0, 0x58, 0xE9, 0x4D, 0x52, 0x5E, 0x9E, 0x07,
+    0xAD, 0x05, 0x3D, 0x35, 0x17, 0xA2, 0x65, 0x0C, 0xFE, 0x80, 0x56, 0x81, 0x8C, 0x5D, 0x08, 0x0B,
+    0x15, 0x75, 0x0E, 0x88, 0x19, 0x34, 0x2D, 0xB7, 0x88, 0x92, 0x6C, 0xC9, 0xF3, 0xDF, 0x19, 0xB6,
+    0x6D, 0xAB, 0x58, 0x13, 0x6E, 0xCE, 0xC9, 0x9A, 0x07, 0xF9, 0x34, 0x9C, 0x5C, 0x9E, 0x33, 0x8F,
+    0x11, 0xCA, 0xA5, 0x1D, 0xD4, 0xDA, 0xC7, 0x8C, 0x3B, 0x61, 0xBF, 0x8D, 0xCB, 0x69, 0xFF, 0x36,
+    0x8E, 0x0C, 0xAD, 0xF4, 0x32, 0xC3, 0x20, 0x57, 0xCE, 0x19, 0xAD, 0x61, 0xB0, 0x2C, 0xB0, 0xCD,
+    0xA4, 0xBD, 0xE0, 0xFC, 0x73, 0x3F, 0xA6, 0xE9, 0x72, 0x6E, 0xB8, 0x84, 0x2F, 0x6A, 0xE8, 0xAF,
+    0x58, 0xC6, 0x64, 0xD7, 0xA0, 0x3F, 0x36, 0x63, 0x95, 0x72, 0x06, 0x8B, 0xA7, 0xE5, 0xB4, 0x25,
+    0xC7, 0xB7, 0xB7, 0xBD, 0xFA, 0xF2, 0xCD, 0x28, 0xDD, 0xC2, 0x80, 0x7B, 0x45, 0xFA, 0x8D, 0xCF,
+    0xD2, 0x5E, 0xB8, 0x0C, 0xA1, 0x40, 0xC7, 0x40, 0xCB, 0x0D, 0xF4, 0x61, 0xAC, 0x20, 0x45, 0x58,
+    0xB7, 0x56, 0x2A, 0xE6, 0x2E, 0x64, 0xFF, 0xC3, 0xC7, 0xE1, 0xF6, 0xB3, 0xE8, 0x42, 0x3F, 0xB5,
+    0x26, 0x4F, 0x49, 0x02, 0x39, 0x91, 0x2C, 0x49, 0x70, 0xDA, 0x87, 0x86, 0xA4, 0x29, 0x36, 0x62,
+    0xF8, 0x2F, 0xBD, 0xD0, 0xF1, 0x0B, 0xD3, 0xEB, 0x8A, 0x68, 0x13, 0xD6, 0x9C, 0xC8, 0x78, 0x28,
+    0xBD, 0xAA, 0xDF, 0xEA, 0x72, 0xCD, 0x03, 0x83, 0xE9, 0xBB, 0x3C, 0x6F, 0x75, 0x1F, 0xAF, 0x67,
+    0x47, 0x5E, 0x01, 0xC1, 0x88, 0xE9, 0x9B, 0xB0, 0xF9, 0x65, 0xF6, 0x8D, 0x79, 0x2A, 0xA9, 0xC9,
+    0x3C, 0xF3, 0x24, 0x19, 0x22, 0x81, 0x32, 0x9E, 0xBE, 0xFA, 0xB4, 0x53, 0x17, 0x64, 0x02, 0x8C,
+    0x7C, 0x18, 0x21, 0x01, 0xF2, 0x14, 0xE8, 0x6E, 0xAE, 0x3E, 0xAE, 0x60, 0xB1, 0x4C, 0x51, 0x9B,
+    0xBA, 0x28, 0x24, 0xA0, 0xB9, 0xFC, 0xEA, 0xE5, 0x9C, 0xA7, 0x18, 0xE2, 0x35, 0x05, 0x07, 0x19,
+    0xAD, 0xE8, 0x02, 0x71, 0x17, 0x53, 0x20, 0x4A, 0xCD, 0x33, 0xC6, 0xB3, 0x70, 0x9F, 0x46, 0x24,
+    0xEB, 0xA8, 0x18, 0x24, 0x99, 0xD4, 0x87, 0x16, 0x00, 0xBE, 0xF4, 0x41, 0x6C, 0xBF, 0x45, 0xE3,
+    0xF7, 0x6F, 0xD1, 0x0A, 0x4A, 0x6A, 0x23, 0x5D, 0x0B, 0xFA, 0xB5, 0x71, 0x97, 0xE2, 0x6B, 0xD3,
+    0x81, 0xB9, 0x49, 0xBC, 0xC4, 0x3C, 0xB2, 0x0C, 0x15, 0x77, 0x8E, 0x5A, 0xC0, 0x89, 0x5F, 0x9A,
+    0x93, 0x9A, 0x75, 0xB2, 0xA4, 0xE2, 0x7E, 0x5A, 0x9C, 0x0A, 0x7E, 0x8C, 0xDD, 0x9F, 0x31, 0x10,
+    0x95, 0x8D, 0x57, 0x0E, 0xB7, 0xDD, 0x8B, 0xE7, 0x39, 0xAC, 0x79, 0x11, 0x51, 0x3C, 0xBB, 0x21,
+    0x58, 0xD7, 0x23, 0xFA, 0x63, 0xFD, 0x21, 0x85, 0x3F, 0x5F, 0x85, 0xF0, 0x3C, 0xF8, 0xE9, 0x40,
+    0x72, 0x92, 0x79, 0xCF, 0x21, 0x14, 0xED, 0xAB, 0xB9, 0xC3, 0xCF, 0x10, 0x85, 0x28, 0x3B, 0x81,
+    0xB6, 0x6E, 0x99, 0x18, 0x7C, 0xD9, 0x36, 0x11, 0x22, 0x6C, 0xF8, 0x83, 0xB2, 0x51, 0xD3, 0xF7,
+    0x42, 0x37, 0xD4, 0xBA, 0x85, 0xB7, 0x9E, 0x6C, 0x61, 0xB3, 0xDB, 0x6F, 0x79, 0xF2, 0x34, 0xA7,
+    0x29, 0x3C, 0xE9, 0x2B, 0x2B, 0x0B, 0xF4, 0x5F, 0x47, 0x96, 0x14, 0x36, 0xA4, 0x2F, 0x67, 0x54,
+    0x77, 0x48, 0x2B, 0x5F, 0x4A, 0x1F, 0xB2, 0xE5, 0xFF, 0x38, 0xE4, 0xE2, 0xAE, 0x76, 0xB1, 0x66,
+    0x7F, 0x01, 0xE8, 0x31, 0xA4, 0x24, 0xBA, 0x95, 0xAB, 0x0A, 0x9B, 0x1F, 0xC4, 0x04, 0x59, 0x9C,
+    0x0D, 0xD0, 0x3D, 0x2E, 0x7F, 0xCE, 0xBE, 0xD2, 0x93, 0x2A, 0xB0, 0x95, 0x22, 0xA5, 0xE9, 0xE4,
+    0xCA, 0xE2, 0x49, 0x15, 0xDF, 0x64, 0x65, 0xE4, 0xE5, 0xC8, 0x65, 0xA3, 0x18, 0x53, 0x36, 0xD4,
+    0x8B, 0xC7, 0x97, 0xE1, 0x4E, 0xD9, 0x92, 0xE7, 0x4A, 0x01, 0x2F, 0x93, 0xB0, 0x09, 0x40, 0x4E,
+    0x5A, 0x58, 0x7F, 0x2D, 0xDB, 0x7E, 0xA5, 0xAB, 0x8A, 0xA1, 0xFD, 0x4C, 0x9C, 0x55, 0x0F, 0x47,
+    0x64, 0x02, 0x80, 0xCB, 0x57, 0x50, 0xEC, 0xFE, 0xB7, 0xDC, 0xD2, 0x21, 0xD7, 0x0B, 0xF5, 0x0F,
+    0xD3, 0xB2, 0x10, 0xDF, 0x8D, 0x8B, 0x91, 0xE0, 0x9C, 0x44, 0x59, 0x0E, 0x08, 0xF2, 0xAB, 0x94,
+    0x75, 0xF3, 0x56, 0x96, 0xF0, 0x3E, 0x65, 0xA0, 0xBA, 0x4C, 0x10, 0x20, 0xB7, 0xF4, 0x2E, 0xEC,
+    0xE2, 0xC4, 0x03, 0x7D, 0xFB, 0xD9, 0x79, 0xCC, 0x88, 0x1F, 0x77, 0xE8, 0x9D, 0x1B, 0x89, 0xCD,
+    0xBB, 0x3D, 0x63, 0x3D, 0xCC, 0x95, 0x8C, 0xFA, 0x5C, 0x79, 0xC2, 0xE1, 0x83, 0x64, 0xE0, 0xB3,
+    0x52, 0x38, 0x90, 0x49, 0x2A, 0x02, 0x1A, 0x9F, 0x85, 0xC4, 0x45, 0x59, 0xE2, 0xE1, 0xF6, 0x7B,
+    0x61, 0xAF, 0x0A, 0xBA, 0xA3, 0x8F, 0xA0, 0x2D, 0xEE, 0x7C, 0xBE, 0x54, 0x40, 0x15, 0xB5, 0x87,
+    0xA1, 0xEF, 0x7E, 0x09, 0x38, 0x51, 0xED, 0x2D, 0xDE, 0xDB, 0x41, 0xC6, 0xEE, 0x88, 0xAD, 0x1F,
+    0x9C, 0x1C, 0xEC, 0x70, 0x39, 0x38, 0x45, 0xB8, 0x01, 0xB6, 0x58, 0x85, 0x61, 0x48, 0x3A, 0xCB,
+    0xE9, 0x97, 0xB3, 0x96, 0x8C, 0x0B, 0xD7, 0x33, 0x73, 0x73, 0x7F, 0x1D, 0x85, 0xFF, 0xE9, 0x9E,
+    0xCE, 0xD1, 0x1E, 0xFD, 0x1B, 0x7A, 0x63, 0x33, 0x10, 0x47, 0x96, 0xBA, 0x0A, 0x8E, 0xF6, 0x4C,
+    0x70, 0xC1, 0xE1, 0xFD, 0x19, 0x5A, 0xE0, 0x19, 0xE8, 0xD9, 0x0C, 0x31, 0x8E, 0xA7, 0x42, 0x9D,
+    0x50, 0xB2, 0xC9, 0x20, 0xE8, 0x62, 0xD2, 0x27, 0x67, 0x8E, 0xB6, 0x33, 0x8C, 0xD9, 0x38, 0x85,
+    0xDC, 0x4D, 0xCF, 0x72, 0xF3, 0xCF, 0xAF, 0xB6, 0x00, 0xF0, 0x54, 0xAE, 0x27, 0xEC, 0x80, 0x28,
+    0x4B, 0x4B, 0xA8, 0x57, 0x5C, 0xC3, 0xEE, 0x3A, 0x1F, 0x77, 0xAC, 0x9E, 0xA9, 0x11, 0x71, 0x23,
+    0x5B, 0xFB, 0xF6, 0x80, 0x0E, 0x80, 0xCB, 0xC7, 0xE8, 0x1F, 0x8B, 0x09, 0x45, 0xA0, 0xF6, 0x70,
+    0xD1, 0x3D, 0x9D, 0x46, 0x00, 0x80, 0x3E, 0x79, 0x1F, 0x4C, 0xF2, 0x4F, 0xCC, 0x8B, 0x9F, 0x63,
+    0xCC, 0x01, 0x62, 0xD3, 0x30, 0x7D, 0xB1, 0x74, 0xB8, 0xF5, 0xB1, 0x0F, 0x13, 0x57, 0xF7, 0x70,
+    0x7F, 0x16, 0x6C, 0x27, 0x17, 0x16, 0x49, 0xE6, 0x5F, 0x87, 0xA2, 0x52, 0x0E, 0x9C, 0xF9, 0xA9,
+    0xEE, 0x91, 0xF0, 0xB1, 0x9C, 0x32, 0x13, 0x67, 0x08, 0xFA, 0x0C, 0x62, 0xBF, 0x11, 0xB2, 0x81,
+    0x9F, 0xFF, 0xC1, 0x0C, 0xF9, 0x84, 0xBA, 0x85, 0x2E, 0xC2, 0xBC, 0xC0, 0x59, 0x1E, 0x56, 0x62,
+    0x58, 0x39, 0x38, 0x6B, 0xFC, 0xC5, 0xC4, 0x9A, 0x97, 0xBC, 0x15, 0xA3, 0x2E, 0x90, 0xD2, 0x8E,
+    0x18, 0xDF, 0x51, 0x39, 0x61, 0x99, 0xE4, 0x2D, 0xA9, 0x50, 0x70, 0x0B, 0x0F, 0x41, 0x20, 0x89,
+    0x37, 0xFC, 0xE5, 0xD7, 0x3B, 0x57, 0xF5, 0x94, 0x69, 0x4C, 0xEC, 0x56, 0x1B, 0x9B, 0xA3, 0x73,
+    0xC2, 0x6F, 0xA8, 0xFF, 0xF2, 0xEC, 0xD0, 0xD9, 0x79, 0x9F, 0x39, 0x0B, 0x7C, 0xF2, 0xE2, 0x5E,
+    0x52, 0x7A, 0xE0, 0x81, 0xE3, 0x54, 0xC6, 0x2D, 0x86, 0x27, 0x8D, 0x04, 0xC3, 0x63, 0x2E, 0x25,
+    0x6E, 0x05, 0x8F, 0xFB, 0xCA, 0x89, 0x18, 0x4D, 0x9B, 0xB9, 0x20, 0xA1, 0x15, 0xA2, 0x33, 0x56,
+    0xAB, 0x3F, 0x2D, 0x14, 0x5A, 0x04, 0x5D, 0xBB, 0x7E, 0xE8, 0xF7, 0x4B, 0xD6, 0x49, 0xE8, 0xAF,
+    0xE5, 0x10, 0x1F, 0x91, 0x68, 0x7C, 0xA0, 0x55, 0x24, 0x75, 0x46, 0xAF, 0xE1, 0xCD, 0x75, 0x0D,
+    0x36, 0xC7, 0xAB, 0x21, 0xAC, 0xA8, 0x1C, 0xF0, 0x69, 0x6F, 0x38, 0x5E, 0x67, 0x7D, 0x99, 0x72,
+    0xB9, 0x39, 0xE9, 0xFB, 0xCF, 0xCC, 0x24, 0x8C, 0x63, 0x6B, 0x6D, 0xBD, 0x0C, 0xFF, 0x5A, 0x2D,
+    0xD0, 0x3F, 0x62, 0xE9, 0xFE, 0xC3, 0x50, 0x18, 0xC1, 0xE9, 0x07, 0xE8, 0xE5, 0x2E, 0xA5, 0x98,
+    0x53, 0x27, 0x4A, 0x3D, 0xC9, 0xAF, 0x1B, 0x5E, 0x41, 0x4F, 0x67, 0xFE, 0x84, 0xBB, 0x74, 0x0C,
+    0x6C, 0x88, 0x02, 0xFA, 0x37, 0x6A, 0xAD, 0xBC, 0x08, 0xDB, 0xE8, 0xF2, 0xCD, 0xA4, 0xF0, 0xFC,
+    0xCC, 0xAD, 0xB5, 0xE7, 0x95, 0x61, 0x93, 0x99, 0xF1, 0xA3, 0x06, 0xCC, 0x01, 0x8D, 0x45, 0x9E,
+    0xE1, 0xA6, 0x15, 0xDC, 0x4A, 0x99, 0x0F, 0x15, 0x34, 0x1E, 0x7E, 0x4F, 0xE5, 0x42, 0xEC, 0xE9,
+    0xD3, 0xA3, 0xAD, 0xAB, 0x96, 0x5B, 0x89, 0x94, 0x12, 0xD3, 0xB1, 0x64, 0x69, 0x5B, 0x55, 0xC6,
+    0x8C, 0x77, 0xD0, 0x9D, 0x0D, 0xF3, 0x36, 0x79, 0x49, 0x50, 0xE9, 0xBC, 0x61, 0x62, 0xFA, 0x67,
+    0xDE, 0x00, 0x87, 0xC5, 0x95, 0x02, 0xBD, 0xAC, 0x7F, 0x3C, 0x92, 0x49, 0x15, 0xFE, 0xB4, 0x9D,
+    0x44, 0xD9, 0x19, 0x10, 0x88, 0xDE, 0xBB, 0xC9, 0xE1, 0xEF, 0xC0, 0xD6, 0x60, 0xC7, 0x1D, 0x8B,
+    0xE8, 0xE3, 0xD1, 0xE8, 0x28, 0x5D, 0xEC, 0x49, 0xEA, 0x79, 0xE4, 0x61, 0x61, 0x7C, 0x81, 0xBF,
+    0x6D, 0xA1, 0x89, 0x80, 0x63, 0x83, 0x65, 0xF2, 0x5C, 0xF6, 0xBB, 0xAD, 0xD4, 0x3B, 0x2F, 0xFE,
+    0x6F, 0x0A, 0xD6, 0x6E, 0x2D, 0x6E, 0x34, 0xB9, 0x0B, 0xE2, 0x12, 0x8B, 0x40, 0xFE, 0x0E, 0x24,
+    0x6C, 0x67, 0xDE, 0x25, 0xCD, 0x48, 0x34, 0x8A, 0x5B, 0x0D, 0x9B, 0xC4, 0xD3, 0x1C, 0xE6, 0x9D,
+    0x8C, 0x77, 0xB0, 0x2B, 0x0C, 0x77, 0x2C, 0x0D, 0xBE, 0xAD, 0xE1, 0x9D, 0x9F, 0x10, 0x84, 0x34,
+    0x39, 0x52, 0xB0, 0xB8, 0x1C, 0x02, 0x24, 0x3C, 0xD8, 0x80, 0xD4, 0x40, 0x63, 0x59, 0xE6, 0x6C,
+    0x0F, 0xFA, 0xEB, 0xAE, 0xDC, 0x67, 0x47, 0x03, 0x25, 0x80, 0xCD, 0x4B, 0x21, 0x77, 0x17, 0xBB,
+    0x19, 0x8C, 0xC1, 0x09, 0x7E, 0x0F, 0x7D, 0xD7, 0x50, 0xF9, 0xC3, 0xAA, 0x05, 0x10, 0xDD, 0x6B,
+    0xD2, 0x96, 0x46, 0x14, 0xC2, 0xA5, 0xD7, 0xF8, 0xED, 0xDA, 0x58, 0x53, 0xC3, 0x8F, 0xAB, 0x47,
+    0x91, 0x95, 0x48, 0x0C, 0xDE, 0xED, 0x99, 0x04, 0x3A, 0xC7, 0xCC, 0xB5, 0x1C, 0xAC, 0x29, 0xAE,
+    0xFA, 0xA6, 0xA5, 0x57, 0x65, 0x12, 0x86, 0xBE, 0x72, 0xFB, 0x06, 0x93, 0x49, 0xD0, 0x53, 0x43,
+    0xD0, 0xD4, 0xC7, 0x2F, 0x8A, 0x13, 0xEC, 0x95, 0x3B, 0x18, 0xD3, 0x67, 0x2B, 0xA6, 0xCF, 0x0B,
+    0xE6, 0x47, 0xF9, 0x3A, 0x32, 0x41, 0x27, 0xC8, 0xDB, 0xD7, 0xC7, 0xED, 0xB7, 0xCF, 0x75, 0xF1,
+    0x29, 0xC7, 0x28, 0x97, 0x07, 0xBA, 0x74, 0x2C, 0x5A, 0xAE, 0x6E, 0x39, 0x51, 0xF3, 0xD2, 0x07,
+    0xE2, 0x82, 0xFA, 0xE0, 0xD0, 0x22, 0x6B, 0xC7, 0xDA, 0x90, 0x0D, 0x1B, 0xB5, 0x17, 0x8A, 0xFA,
+    0x9E, 0xB5, 0x1A, 0xBD, 0x6F, 0x64, 0x02, 0xF5, 0x14, 0xB4, 0x63, 0x64, 0xFB, 0x42, 0x99, 0x42,
+    0xDE, 0x6A, 0x6C, 0xAB, 0x5B, 0xE5, 0xC4, 0x62, 0x25, 0x66, 0x83, 0xC3, 0x6A, 0x64, 0x4A, 0xD0,
+    0xA7, 0x4F, 0x66, 0x21, 0xF9, 0x7C, 0xCC, 0x15, 0x5F, 0x69, 0xB3, 0x2E, 0x83, 0x26, 0x12, 0xC7,
+    0xE0, 0xE4, 0xAE, 0x92, 0x44, 0xA4, 0x1F, 0xEE, 0xBC, 0x06, 0xAF, 0xC4, 0x5A, 0x14, 0x89, 0xCF,
+    0x46, 0xC2, 0xA8, 0x80, 0x98, 0xF6, 0xCC, 0xA8, 0x7E, 0xDE, 0x94, 0x31, 0x36, 0xBF, 0x80, 0xA9,
+    0x49, 0x62, 0xF9, 0x4B, 0x09, 0xFF, 0x29, 0xCC, 0xB6, 0x5A, 0x84, 0xBC, 0xCB, 0xF4, 0xBB, 0x19,
+    0xC1, 0xA7, 0x09, 0x60, 0xF9, 0xD4, 0x0F, 0x84, 0xE0, 0xDF, 0x9A, 0x0D, 0xCC, 0xCA, 0x14, 0x68,
+    0x39, 0x74, 0x10, 0x63, 0x13, 0xC0, 0xAE, 0xD2, 0x2B, 0x3C, 0x6E, 0xC2, 0x29, 0x51, 0xC9, 0xAF,
+    0x0E, 0x09, 0x87, 0xAD, 0x82, 0x8A, 0xA6, 0x0F, 0x02, 0x4B, 0xAD, 0x1F, 0x63, 0xEE, 0xAE, 0x57,
+    0xE0, 0xE5, 0x51, 0xCC, 0x8C, 0x9A, 0x9E, 0x4F, 0x67, 0xFB, 0xD4, 0x9F, 0xA5, 0x18, 0x13, 0x9F,
+    0x24, 0xF4, 0x9E, 0x2B, 0x52, 0xC0, 0x08, 0xE8, 0x77, 0xEA, 0xBB, 0x01, 0x5A, 0x77, 0x46, 0xEF,
+    0x10, 0xAC, 0xA4, 0x70, 0x56, 0x98, 0x5A, 0xBF, 0x4A, 0x82, 0x72, 0x96, 0xB9, 0xB1, 0x61, 0x78,
+    0x6D, 0x6E, 0xAD, 0x66, 0x6C, 0x67, 0xB3, 0x45, 0x8F, 0xF8, 0xFD, 0x1E, 0xAA, 0x7A, 0x13, 0x0C,
+    0x35, 0x1A, 0x9F, 0x69, 0x5E, 0x13, 0x8A, 0xB5, 0xE7, 0x17, 0x58, 0x7A, 0xF5, 0xB3, 0x06, 0x48,
+    0x16, 0x55, 0xDC, 0xD8, 0xB7, 0x70, 0x3D, 0xB1, 0x04, 0x13, 0xA1, 0x21, 0x60, 0xF2, 0x15, 0xA8,
+    0x09, 0x2A, 0xD2, 0xBC, 0x67, 0xAD, 0x23, 0x01, 0x8E, 0x91, 0xE2, 0x4C, 0x73, 0x41, 0xA4, 0x29,
+    0x9A, 0x09, 0xFD, 0xC6, 0x8C, 0xC2, 0x0D, 0x62, 0xFE, 0x70, 0x53, 0x8B, 0x72, 0x07, 0x26, 0x73,
+    0xC1, 0xED, 0x07, 0xE0, 0xD3, 0x02, 0x9C, 0x10, 0x30, 0x83, 0x83, 0x50, 0xDA, 0x11, 0x36, 0x8B,
+    0x22, 0xE6, 0xF3, 0x90, 0xDE, 0x90, 0x87, 0x6F, 0x10, 0x41, 0x3B, 0x6E, 0x41, 0x87, 0x0A, 0x56,
+    0x27, 0x95, 0xCA, 0xFE, 0xC8, 0xE0, 0x15, 0xD2, 0xEE, 0xB8, 0xBF, 0x35, 0x4F, 0x8B, 0xF3, 0xBA,
+    0x37, 0x6F, 0x16, 0x61, 0x80, 0x7E, 0x95, 0x50, 0x27, 0x7A, 0x46, 0x0F, 0xBF, 0xDC, 0x74, 0xB1,
+    0x73, 0xE0, 0x50, 0x86, 0x6F, 0x92, 0xB6, 0x41, 0x5B, 0x2E, 0xE1, 0xCA, 0x8E, 0xDB, 0x8E, 0xEC,
+    0xD1, 0x8C, 0xF4, 0x74, 0x7C, 0x9C, 0x1E, 0x24, 0x60, 0xF4, 0xD3, 0x5B, 0xA0, 0x3B, 0xE2, 0x5B,
+    0x17, 0xBB, 0x7D, 0x97, 0x57, 0x2A, 0x09, 0x9A, 0x1D, 0x5C, 0x02, 0x63, 0x4A, 0xC0, 0x0E, 0xA1,
+    0xA0, 0x96, 0xE5, 0x4D, 0x6D, 0x91, 0x3C, 0x69, 0x59, 0x80, 0x41, 0x7D, 0xF7, 0x53, 0x93, 0x52,
+    0x58, 0xF9, 0x11, 0x33, 0xFF, 0xDB, 0x7F, 0x26, 0x5E, 0x90, 0x5B, 0xB5, 0x42, 0x16, 0xE0, 0x05,
+    0x4E, 0x5B, 0x23, 0xAE, 0x35, 0x7D, 0x95, 0x79, 0x4C, 0xD1, 0x77, 0x47, 0x77, 0x9B, 0x63, 0xED,
+    0x86, 0x6E, 0x6F, 0x76, 0x54, 0x7C, 0x4A, 0x9D, 0x0F, 0xAE, 0xE7, 0x41, 0xBD, 0x20, 0x1F, 0x04,
+    0xF4, 0xA8, 0x90, 0x48, 0xF7, 0x59, 0xF7, 0x14, 0xCF, 0x1D, 0x18, 0xE5, 0x54, 0x25, 0x4D, 0x87,
+    0xE4, 0x61, 0x84, 0x7B, 0xB5, 0xCB, 0xF5, 0x70, 0x78, 0x80, 0xF1, 0x52, 0x89, 0x2D, 0xEA, 0x72,
+    0xB3, 0xE7, 0x7D, 0x24, 0x59, 0xB7, 0x22, 0x49, 0x9F, 0xDA, 0x7D, 0x81, 0x86, 0xAB, 0xD3, 0x80,
+    0x18, 0x55, 0xF5, 0x21, 0xC6, 0xE4, 0x9E, 0xE5, 0xBB, 0x12, 0x8D, 0x3E, 0xD1, 0xEE, 0x33, 0x56,
+    0xCF, 0x24, 0x37, 0x65, 0x73, 0x41, 0x63, 0xDD, 0x21, 0x4C, 0x85, 0xA3, 0xB1, 0x74, 0x67, 0xFC,
+    0x60, 0xC9, 0x14, 0x0D, 0x4F, 0x31, 0x15, 0x87, 0x70, 0xEA, 0x18, 0x9C, 0xE9, 0x13, 0x09, 0x6A,
+    0xC5, 0xE2, 0x01, 0x08, 0xF3, 0x2A, 0xE0, 0x28, 0x42, 0x1B, 0x80, 0x30, 0xC3, 0x87, 0xF8, 0x31,
+    0xBC, 0x0C, 0xC7, 0xBA, 0x61, 0x77, 0x85, 0xC7, 0x9B, 0x56, 0x29, 0x48, 0xCF, 0x65, 0x18, 0x05,
+    0x2F, 0x8E, 0x23, 0x3D, 0xA3, 0x34, 0xB2, 0x17, 0xAB, 0x42, 0xE6, 0x88, 0x8C, 0x96, 0xB5, 0x5F,
+    0x44, 0x20, 0x47, 0xAB, 0x1F, 0x02, 0xE3, 0xDF, 0xF2, 0xEF, 0xBE, 0x5A, 0xA8, 0x87, 0x98, 0x57,
+    0xCE, 0x73, 0x75, 0xAE, 0xA1, 0x51, 0x16, 0xEC, 0x5A, 0x0F, 0xFA, 0xF0, 0xC6, 0x80, 0xFE, 0x7F,
+    0xE4, 0x3B, 0x02, 0x27, 0x9D, 0x75, 0xE3, 0x41, 0x8C, 0x5C, 0x5B, 0x20, 0x40, 0x22, 0xBF, 0x09,
+    0x79, 0x63, 0xB4, 0xDC, 0x06, 0x44, 0xE4, 0x5B, 0x09, 0x58, 0xC9, 0x51, 0x38, 0x9D, 0x07, 0x10,
+    0x98, 0x75, 0x6A, 0x3B, 0x87, 0x00, 0x76, 0x9D, 0x6C, 0xE9, 0xB0, 0x94, 0x1E, 0x50, 0x48, 0x26,
+    0x5E, 0xFB, 0x2D, 0x10, 0x54, 0x8E, 0xA2, 0x50, 0x03, 0xC6, 0x78, 0x55, 0x86, 0x4E, 0xD4, 0x4B,
+    0xFC, 0x15, 0x61, 0x4C, 0x72, 0xFB, 0xCE, 0x21, 0xC5, 0x89, 0x23, 0x00, 0x16, 0x63, 0x73, 0xAD,
+    0xB0, 0xE1, 0x94, 0x36, 0x43, 0xFE, 0xA4, 0x37, 0x34, 0x3F, 0xE2, 0xB9, 0x75, 0x2D, 0x95, 0x72,
+    0x2C, 0xC8, 0x8A, 0xC5, 0x4B, 0x03, 0x8C, 0xA4, 0xE8, 0x79, 0x15, 0x38, 0x24, 0x8D, 0x92, 0x0B,
+    0x91, 0xA4, 0xF3, 0x94, 0x58, 0x35, 0xD6, 0x6D, 0x14, 0x3E, 0x78, 0x4E, 0x17, 0x21, 0x80, 0x5D,
+    0x95, 0xF0, 0x73, 0x7E, 0xA2, 0xDA, 0x3D, 0xD4, 0x33, 0xF4, 0x0A, 0x80, 0x4A, 0x5C, 0x83, 0x91,
+    0x6E, 0xE7, 0x13, 0x73, 0x26, 0x94, 0x17, 0xD4, 0x13, 0xBD, 0x8B, 0x74, 0x25, 0x06, 0x34, 0xA8,
+    0x98, 0x99, 0x94, 0x1F, 0xC7, 0xDC, 0x3F, 0x36, 0xF8, 0x24, 0x57, 0x1E, 0xB7, 0x9D, 0x29, 0xA4,
+    0xB6, 0x27, 0x1B, 0x31, 0xF3, 0x21, 0x80, 0x60, 0x51, 0xF1, 0x66, 0x10, 0xBD, 0x15, 0xF5, 0xBB,
+    0x47, 0x50, 0xCD, 0xC7, 0xEC, 0x05, 0x48, 0xCB, 0x84, 0x70, 0xB0, 0x58, 0x5F, 0x53, 0x2A, 0x2B,
+    0x02, 0x42, 0x5C, 0x78, 0x1C, 0x7C, 0x56, 0xA2, 0xF2, 0x4B, 0xA0, 0x94, 0x8A, 0x84, 0xB0, 0x2D,
+    0x9B, 0xF5, 0xA8, 0xC2, 0xE2, 0xE3, 0x20, 0xC5, 0xAE, 0xD6, 0x4F, 0x17, 0xDF, 0x52, 0x47, 0x8E,
+    0x6F, 0x6D, 0x41, 0xDB, 0x59, 0xF0, 0xC5, 0x9D, 0x6D, 0xBD, 0xA0, 0xC9, 0x9D, 0x72, 0x2D, 0x2E,
+    0x51, 0x10, 0xAC, 0x37, 0x01, 0xA7, 0xD7, 0x4E, 0xF3, 0x96, 0xD6, 0x79, 0xFD, 0xA0, 0xC4, 0x3F,
+    0x38, 0x68, 0xA4, 0x19, 0x01, 0xE6, 0x0B, 0x96, 0x32, 0xA3, 0x48, 0x8B, 0x4F, 0x77, 0x56, 0x98,
+    0xB6, 0x85, 0x73, 0xA9, 0x2B, 0x04, 0xED, 0x2F, 0x13, 0x6A, 0x32, 0x0C, 0xAB, 0x51, 0x54, 0xBE,
+    0x0B, 0x7F, 0xBD, 0x93, 0x4E, 0xB1, 0xBB, 0xA9, 0xA8, 0xD4, 0x53, 0x64, 0x83, 0x49, 0x63, 0x64,
+    0x5B, 0xD7, 0xB5, 0x02, 0xDD, 0x13, 0x3F, 0xFD, 0x64, 0xF5, 0xC3, 0x18, 0x97, 0xC7, 0xCF, 0x96,
+    0x11, 0x63, 0xB3, 0x20, 0x15, 0x81, 0x3D, 0x9A, 0x52, 0x99, 0xF2, 0xBE, 0x76, 0xD1, 0x1F, 0xF6,
+    0x0E, 0xD3, 0x7C, 0x55, 0x42, 0x55, 0x94, 0x5E, 0x10, 0x96, 0x37, 0x4C, 0x2E, 0xAC, 0x9E, 0x30,
+    0x40, 0xB9, 0xD0, 0xFC, 0x81, 0xA2, 0x87, 0x34, 0x74, 0x82, 0xA2, 0x88, 0xDD, 0x30, 0x4D, 0x50,
+    0xA6, 0x0E, 0x0C, 0x50, 0x0C, 0xB7, 0xB6, 0xC2, 0x33, 0x7D, 0x73, 0x8C, 0x66, 0x90, 0xC2, 0x42,
+    0x87, 0x35, 0xD5, 0x4D, 0xB7, 0xEE, 0x1D, 0x0D, 0xB4, 0xFC, 0xD4, 0x3B, 0xD9, 0xA7, 0xF1, 0x2D,
+    0x02, 0x16, 0x89, 0x1B, 0x32, 0xB2, 0x4D, 0x38, 0x61, 0x6C, 0xD3, 0x3B, 0x53, 0xBF, 0x1E, 0x46,
+    0xA8, 0x6B, 0x1A, 0x83, 0xB8, 0x3A, 0x2C, 0xCD, 0x6E, 0xBF, 0xBB, 0xDD, 0x42, 0x71, 0xB9, 0x71,
+    0x93, 0x4C, 0x3B, 0x24, 0x3B, 0xBD, 0x6A, 0x78, 0x93, 0x42, 0x6B, 0x5A, 0x24, 0xCF, 0x41, 0x10,
+    0xAD, 0x05, 0x3B, 0x7E, 0x90, 0x2C, 0xA7, 0x9C, 0x6B, 0xB5, 0xE0, 0x5E, 0xB5, 0xA0, 0x3C, 0xCB,
+    0xD0, 0xCB, 0x48, 0x75, 0xE3, 0x17, 0x86, 0x42, 0x5A, 0xF7, 0x2E, 0x4C, 0x6C, 0xF2, 0x21, 0x37,
+    0xEE, 0xB4, 0xE5, 0x30, 0x6B, 0xA1, 0x4B, 0x31, 0xDB, 0x8C, 0x86, 0xF9, 0x5C, 0xDA, 0xDA, 0x44,
+    0x95, 0xEA, 0x26, 0x96, 0xD6, 0x26, 0xAE, 0x23, 0x11, 0xEB, 0x21, 0x34, 0xFF, 0xB2, 0x8C, 0x9E,
+    0x9B, 0xBD, 0x27, 0xFB, 0x09, 0x0F, 0xE3, 0x50, 0x73, 0x8E, 0xAC, 0xE0, 0x05, 0x22, 0x20, 0xD5,
+    0xF7, 0x4E, 0x72, 0xD0, 0x4E, 0xF7, 0xC5, 0xC9, 0xE7, 0x25, 0x7F, 0xF9, 0x91, 0x19, 0x68, 0x03,
+    0x17, 0x04, 0xD2, 0xBA, 0x4D, 0x94, 0xAF, 0x95, 0xBC, 0x81, 0x57, 0xB6, 0xD9, 0x56, 0x8F, 0x67,
+    0x40, 0x24, 0x6D, 0xEC, 0xD5, 0xD1, 0x1E, 0x2E, 0xFC, 0xE8, 0xBA, 0xAB, 0x80, 0x63, 0x35, 0xC3,
+    0x38, 0x18, 0x98, 0x71, 0x55, 0xA7, 0xC8, 0x09, 0xAE, 0xA3, 0xA3, 0x37, 0xA3, 0x96, 0xCE, 0x8F,
+    0x0F, 0x12, 0x53, 0xF5, 0x8E, 0x02, 0xB1, 0xBC, 0x56, 0x1E, 0x67, 0x71, 0xFE, 0xAB, 0xF0, 0x04,
+    0x5B, 0x87, 0x93, 0x92, 0xB2, 0xAC, 0x47, 0xB6, 0xEF, 0xBD, 0x55, 0x1D, 0x30, 0xCB, 0xA6, 0x60,
+    0x13, 0x13, 0xFE, 0x82, 0x4E, 0x06, 0xA8, 0xAB, 0x2B, 0x40, 0x2E, 0x7C, 0x66, 0x8F, 0xCC, 0x40,
+    0x36, 0x20, 0xE9, 0xAF, 0xC6, 0x3A, 0xE2, 0xE2, 0xFE, 0x01, 0x97, 0x7E, 0xCA, 0x82, 0x20, 0x58,
+    0x5E, 0xB5, 0x10, 0xE1, 0x99, 0xE3, 0x4F, 0x82, 0xE3, 0x4D, 0x35, 0xB6, 0x7B, 0x28, 0x37, 0x02,
+    0x26, 0x00, 0xA1, 0x6C, 0x7B, 0xA1, 0x48, 0x4F, 0xCB, 0x55, 0x25, 0xB8, 0x6B, 0xDD, 0xB1, 0xAE,
+    0xA0, 0xD3, 0xA1, 0x8B, 0x84, 0x9E, 0xF2, 0xB8, 0x53, 0xDC, 0xE0, 0xE4, 0x6C, 0x5C, 0x63, 0xA8,
+    0xD7, 0x4F, 0x1C, 0xB6, 0x73, 0xF9, 0x50, 0xA7, 0x99, 0x30, 0x42, 0x3E, 0x60, 0x49, 0x6A, 0x7F,
+    0x6F, 0x0A, 0x83, 0xAD, 0x99, 0x90, 0x00, 0xC3, 0x5A, 0xFD, 0x83, 0xDA, 0xDE, 0x0A, 0x37, 0xC0,
+    0x7F, 0xC6, 0x96, 0x61, 0x9A, 0xF8, 0xBF, 0xBF, 0x45, 0x33, 0x3C, 0x17, 0x48, 0x7B, 0x54, 0xB8,
+    0x38, 0xAD, 0x88, 0xD7, 0x7C, 0x1B, 0x08, 0x04, 0xA9, 0x88, 0xDD, 0x1A, 0x7B, 0x53, 0xEF, 0x8F,
+    0x49, 0xBC, 0xBC, 0x64, 0x98, 0x17, 0xA0, 0xB2, 0xAE, 0x63, 0x5B, 0x33, 0xE3, 0xED, 0x93, 0x88,
+    0x5D, 0xB9, 0x3F, 0xF2, 0x8A, 0xD3, 0x38, 0xD9, 0xD6, 0xC9, 0xFE, 0x13, 0x92, 0x3B, 0xF0, 0xA5,
+    0xE4, 0x1A, 0x09, 0x28, 0x70, 0x27, 0x1A, 0xB5, 0x99, 0xBA, 0x39, 0x2A, 0xBA, 0x8E, 0xAE, 0x79,
+    0x6A, 0x21, 0xF7, 0xB7, 0x7D, 0x16, 0x34, 0xA4, 0x5D, 0x0E, 0x97, 0xF5, 0xFC, 0x1A, 0x88, 0xEE,
+    0x4A, 0x9E, 0xB9, 0x64, 0x2B, 0xFF, 0x89, 0xC2, 0x45, 0x34, 0xE7, 0xC4, 0xE0, 0xFC, 0x9E, 0xF8,
+    0xF6, 0x89, 0x5E, 0x68, 0x53, 0xEC, 0xF0, 0x98, 0x63, 0x5E, 0x53, 0xA0, 0xBE, 0x42, 0x8E, 0xD9,
+    0x70, 0x5D, 0x3C, 0xC5, 0x11, 0x11, 0x20, 0xC1, 0x9B, 0xF4, 0x6E, 0x61, 0x63, 0x4A, 0xB3, 0xE7,
+    0x5F, 0x91, 0xC9, 0x2C, 0xFF, 0x1E, 0xCE, 0x25, 0xFE, 0x26, 0x6A, 0xA4, 0x06, 0xE3, 0x30, 0xCF,
+    0xFC, 0x9D, 0xE8, 0x0D, 0xFD, 0x41, 0xC6, 0x9F, 0x20, 0x2E, 0xB0, 0x24, 0x9B, 0xA1, 0xB2, 0x30,
+    0x75, 0x3F, 0xFC, 0x33, 0x68, 0x8E, 0x97, 0x33, 0xE5, 0xFE, 0xF8, 0xEC, 0x28, 0xAC, 0xD4, 0x52,
+    0xA5, 0x97, 0x23, 0x9B, 0x89, 0xDF, 0x42, 0x38, 0xA2, 0xD9, 0x38, 0x7C, 0x59, 0x58, 0x78, 0x2D,
+    0x64, 0x3E, 0xAC, 0xA4, 0x2F, 0x30, 0x55, 0xD2, 0xE3, 0x4C, 0x4E, 0xA5, 0xEC, 0x4E, 0x5A, 0xF9,
+    0xAA, 0xB6, 0xB9, 0xBA, 0xFA, 0x23, 0x41, 0x9D, 0xCA, 0x54, 0xDA, 0x90, 0xDD, 0xC4, 0x68, 0x16,
+    0x2E, 0x4F, 0xB5, 0xDC, 0x9A, 0x25, 0xBF, 0x8B, 0xC0, 0x79, 0x0D, 0xCF, 0xB7, 0xBE, 0xDE, 0x95,
+    0x59, 0xF0, 0x28, 0x8A, 0x14, 0xD9, 0x90, 0x66, 0xAA, 0xEB, 0x5F, 0x64, 0x61, 0xD1, 0x7E, 0x4C,
+    0x45, 0x8E, 0x98, 0x11, 0x7A, 0x84, 0x81, 0x0A, 0xD2, 0xBA, 0x5D, 0x72, 0x09, 0xA0, 0x05, 0x1E,
+    0x16, 0xD4, 0x4A, 0x91, 0xEE, 0xD8, 0x4A, 0x06, 0x4B, 0x5C, 0xEC, 0x79, 0x28, 0xA3, 0xB3, 0x81,
+    0x4C, 0x90, 0xF1, 0xB2, 0x29, 0x02, 0x2B, 0xF2, 0x44, 0x9F, 0xD9, 0x6D, 0x66, 0x33, 0x78, 0x73,
+    0x23, 0x5D, 0x26, 0x2C, 0x86, 0x43, 0x9E, 0x69, 0x0A, 0x97, 0x01, 0x8F, 0x64, 0xDA, 0xF9, 0xCC,
+    0xC7, 0xA0, 0x59, 0xF0, 0x60, 0xD9, 0x46, 0xAA, 0x77, 0x9F, 0xFC, 0xF3, 0xBA, 0x66, 0xD4, 0xBE,
+    0x69, 0x9B, 0xAE, 0x3C, 0xB6, 0x57, 0x8A, 0x30, 0x53, 0xEC, 0xC6, 0xF8, 0x14, 0x76, 0x84, 0x76,
+    0x7F, 0x53, 0xA8, 0x14, 0x8A, 0x55, 0xAE, 0x89, 0xE8, 0x4D, 0x8C, 0x69, 0xC2, 0x56, 0xB7, 0x64,
+    0x2A, 0x57, 0x9A, 0x76, 0xC5, 0x77, 0x8A, 0xC8, 0x01, 0x29, 0xB6, 0xB2, 0xA9, 0x50, 0x43, 0xCD,
+    0x22, 0xD0, 0xE8, 0xDE, 0x6B, 0xB9, 0x87, 0x18, 0x70, 0xEF, 0xCB, 0x72, 0xAA, 0x18, 0xB6, 0x42,
+    0xCE, 0xBD, 0xC4, 0x34, 0x7C, 0x6E, 0xA7, 0x6F, 0x63, 0x29, 0x16, 0x97, 0x3A, 0x19, 0x11, 0xEF,
+    0xB6, 0x47, 0xF0, 0x01, 0xAA, 0x25, 0x4A, 0x50, 0x67, 0xCC, 0x60, 0xF2, 0x36, 0x06, 0x85, 0x7A,
+    0x99, 0x50, 0x11, 0x24, 0xDD, 0xA5, 0xC1, 0x1A, 0xA6, 0x76, 0x62, 0xBB, 0xB6, 0x34, 0xB8, 0x90,
+    0x37, 0x35, 0xAA, 0x96, 0xF3, 0xC5, 0xA2, 0x5E, 0x5D, 0x4F, 0x9C, 0x9F, 0x95, 0x99, 0xEF, 0xDE,
+    0xCC, 0x89, 0xC5, 0x2E, 0x73, 0xC7, 0xF7, 0xAC, 0xFB, 0x87, 0x95, 0xFE, 0x20, 0x99, 0x2B, 0x62,
+    0x5D, 0xDC, 0x61, 0x3B, 0x10, 0x7A, 0x5C, 0xF5, 0x09, 0xCB, 0xE0, 0xB1, 0x41, 0xB0, 0x7A, 0x90,
+    0x49, 0x65, 0x2D, 0x3F, 0x7D, 0x10, 0x6C, 0xDD, 0x5F, 0x04, 0x21, 0x70, 0xCA, 0x13, 0x42, 0x2B,
+    0x71, 0x30, 0xE9, 0x40, 0x80, 0xB4, 0xDD, 0xBF, 0xDF, 0x0D, 0x11, 0x21, 0xC1, 0xE4, 0x51, 0xC8,
+    0x48, 0xAC, 0x37, 0xD3, 0xDE, 0x32, 0xBE, 0xCF, 0x61, 0xF6, 0x8A, 0xEB, 0x8C, 0xE1, 0xF7, 0x1D,
+    0xCD, 0xAA, 0x24, 0x68, 0x4C, 0xA1, 0x33, 0x8A, 0x0B, 0xA5, 0xA4, 0xC6, 0x94, 0xCD, 0x1E, 0x07,
+    0x62, 0xB9, 0x3B, 0x3E, 0xD6, 0x13, 0x6F, 0x54, 0xD9, 0x93, 0x02, 0xD9, 0x1E, 0x72, 0x9C, 0x6C,
+    0xC9, 0x97, 0xEF, 0xB6, 0x96, 0xDA, 0x93, 0x7E, 0x8D, 0x4F, 0x88, 0x0B, 0xA4, 0x7E, 0xF9, 0x0A,
+    0x7E, 0xD3, 0x2D, 0x8D, 0x15, 0xCA, 0xC4, 0x14, 0xDC, 0x0E, 0x1B, 0x93, 0x02, 0xC5, 0x7E, 0x31,
+    0xC8, 0xCC, 0x59, 0x92, 0x9F, 0x66, 0x43, 0xA5, 0x51, 0xFA, 0x76, 0x92, 0xDE, 0x20, 0xCF, 0x5D,
+    0x28, 0xAA, 0x4E, 0x80, 0x61, 0x6D, 0xE2, 0x3C, 0xD3, 0xAE, 0x55, 0xEC, 0xD1, 0xC2, 0x30, 0xEA,
+    0xE3, 0xD7, 0x9D, 0xCE, 0x01, 0x64, 0xD4, 0x85, 0x95, 0xC0, 0x91, 0xBD, 0xB7, 0xAF, 0x78, 0xDB,
+    0xAC, 0x3C, 0xCF, 0x18, 0xE3, 0x07, 0x6C, 0xD4, 0x85, 0xD9, 0x04, 0xF5, 0xFA, 0x43, 0x1C, 0x27,
+    0x85, 0x1A, 0xF1, 0x86, 0xE5, 0xEE, 0x36, 0x83, 0x18, 0xE4, 0x40, 0x88, 0x67, 0xA4, 0xF9, 0x0E,
+    0x2C, 0x6F, 0xA9, 0xB2, 0xD8, 0x58, 0x89, 0xC1, 0xF5, 0x5C, 0xC0, 0x79, 0xDB, 0xF0, 0xA3, 0x92,
+    0xED, 0xBB, 0x7F, 0x76, 0xEE, 0x7D, 0x60, 0x5D, 0x05, 0xB5, 0xBA, 0x4C, 0x6A, 0x58, 0x8A, 0xBD,
+    0xF3, 0x69, 0x68, 0x4F, 0xDE, 0xE3, 0x7F, 0xF2, 0x05, 0x42, 0xC6, 0xDC, 0x7D, 0x04, 0x48, 0x3B,
+    0x1F, 0x99, 0x7E, 0x6C, 0x1E, 0x91, 0x86, 0xC8, 0xDF, 0x10, 0x92, 0x3F, 0xBD, 0xC3, 0x43, 0x39,
+    0xE3, 0xC1, 0x30, 0x7B, 0xBD, 0x02, 0x1F, 0x16, 0xEF, 0x72, 0x07, 0x99, 0xB1, 0x3B, 0x6A, 0x2C,
+    0xBE, 0x41, 0x38, 0xC6, 0xBF, 0xA0, 0xA4, 0xF4, 0xFF, 0x65, 0x4D, 0xF0, 0x76, 0xF2, 0x2F, 0x02,
+    0x87, 0x02, 0x13, 0xFD, 0x19, 0xC6, 0x4F, 0x6B, 0x57, 0x45, 0xCE, 0xDE, 0xEC, 0x24, 0x9E, 0x29,
+    0x0D, 0x9C, 0xF4, 0x16, 0x7A, 0x13, 0x33, 0xB9, 0x1C, 0x9E, 0xC1, 0x6B, 0xE3, 0xAD, 0xFD, 0x06,
+    0x52, 0xDF, 0x8B, 0xAE, 0x35, 0xA6, 0x1B, 0xE7, 0x93, 0x24, 0xB5, 0x5F, 0xD1, 0x77, 0xD5, 0x3E,
+    0xC4, 0x9F, 0x2F, 0x8A, 0x5C, 0x1C, 0x35, 0xAE, 0x08, 0xBE, 0x22, 0x10, 0x54, 0xDD, 0x6C, 0xC4,
+    0x1A, 0xDD, 0xD1, 0x04, 0x16, 0x04, 0x3D, 0x7B, 0x65, 0x92, 0xAC, 0x4B, 0x51, 0x51, 0x12, 0x96,
+    0xAB, 0x10, 0x05, 0x78, 0xD8, 0x77, 0x6D, 0x46, 0x3A, 0x50, 0x3B, 0xB8, 0xB9, 0xF5, 0x64, 0x13,
+    0xDA, 0xAD, 0x17, 0x2A, 0xD5, 0xAA, 0x40, 0x56, 0x7F, 0xC5, 0xF4, 0x73, 0xE5, 0xFC, 0x77, 0x96,
+    0xFD, 0xC5, 0x96, 0xCE, 0x68, 0x2C, 0x95, 0xDB, 0x0B, 0x98, 0xAC, 0x99, 0x3F, 0xF9, 0x22, 0x3D,
+    0xA2, 0xDC, 0x59, 0x30, 0xBF, 0x40, 0x1F, 0x73, 0xB9, 0xBA, 0xE3, 0x09, 0xF2, 0xDD, 0x51, 0x97,
+    0x46, 0x2E, 0xB5, 0x1E, 0xA3, 0x4D, 0x62, 0x9F, 0x20, 0xCA, 0xF5, 0xC3, 0xF5, 0x14, 0xC4, 0xD5,
+    0x5C, 0x06, 0x9A, 0xD7, 0x9B, 0x93, 0xD3, 0x0B, 0xA4, 0xDE, 0xCD, 0xAA, 0xBC, 0xFA, 0x91, 0xD8,
+    0xF5, 0xA2, 0xC1, 0x31, 0xCD, 0x16, 0xE3, 0x5C, 0xFB, 0x33, 0x4C, 0x33, 0x02, 0xD1, 0x17, 0x69,
+    0x29, 0xE1, 0x94, 0x97, 0xC9, 0x6C, 0x0F, 0x73, 0x5D, 0xCE, 0xBC, 0xF1, 0x76, 0xCE, 0x22, 0xBC,
+    0xB5, 0x11, 0xAF, 0x5D, 0x0F, 0x78, 0x54, 0x2E, 0x45, 0xDB, 0x02, 0x58, 0x7C, 0xE3, 0x39, 0x99,
+    0x74, 0x9D, 0x11, 0xFD, 0xF6, 0x87, 0x10, 0x47, 0xA9, 0xF3, 0x3B, 0x08, 0x6E, 0xBC, 0x0C, 0x8E,
+    0x54, 0x5E, 0x04, 0x58, 0xF6, 0xD9, 0x66, 0xEC, 0xD9, 0x11, 0x6D, 0x35, 0xAB, 0xB4, 0xE5, 0xDC,
+    0xF0, 0xB6, 0x1E, 0x71, 0xAC, 0x5D, 0x92, 0xC1, 0x5C, 0xB1, 0xC7, 0xD0, 0x0B, 0x10, 0x6E, 0xE2,
+    0x32, 0xA6, 0x89, 0x42, 0xAD, 0xA6, 0x5C, 0xBA, 0xAD, 0xB2, 0x0F, 0x47, 0x8C, 0xEF, 0xDD, 0x88,
+    0xEA, 0x04, 0x70, 0xB5, 0xFA, 0xD7, 0x22, 0x78, 0xD8, 0xCB, 0x20, 0xDD, 0xE4, 0xFE, 0x84, 0x68,
+    0xFD, 0x86, 0x1E, 0xE3, 0x87, 0x7B, 0x74, 0x61, 0xB2, 0x03, 0xC5, 0xA5, 0x06, 0xED, 0x4E, 0x87,
+    0x4E, 0x31, 0x0C, 0x0A, 0x2B, 0x49, 0x25, 0xD1, 0x33, 0xFF, 0xFE, 0xAC, 0x5E, 0x1F, 0xB2, 0x8D,
+    0xC0, 0x0D, 0x67, 0xAD, 0x92, 0x64, 0x12, 0xCD, 0x4C, 0x80, 0x68, 0x8B, 0x91, 0xA3, 0xBD, 0x88,
+    0xA6, 0x0F, 0xEC, 0x4D, 0x26, 0x1F, 0xD6, 0xB1, 0x8C, 0x5D, 0x6B, 0x25, 0x7A, 0x98, 0xA7, 0x30,
+    0x57, 0x7D, 0x9D, 0x31, 0x8B, 0xE0, 0x61, 0xBC, 0xA1, 0xB5, 0xB6, 0xD3, 0x21, 0xAF, 0x26, 0x7C,
+    0x53, 0xC2, 0xFB, 0x3E, 0x82, 0xEC, 0xB3, 0x17, 0x02, 0x82, 0xD7, 0x00, 0x82, 0x0A, 0x28, 0x4B,
+    0xDE, 0x55, 0x8E, 0x9E, 0x42, 0xB5, 0x93, 0xA6, 0x0C, 0x54, 0x09, 0x59, 0xD0, 0x02, 0x68, 0xBE,
+    0x00, 0x0C, 0x8F, 0x50, 0x73, 0xE9, 0x19, 0x03, 0xBB, 0x47, 0x65, 0xDE, 0x85, 0x23, 0x8C, 0xDC,
+    0xBB, 0x5A, 0xB5, 0x59, 0xC7, 0xA3, 0x1A, 0xDF, 0x10, 0x1E, 0x2C, 0x10, 0xD7, 0x36, 0xAE, 0x1E,
+    0x27, 0x78, 0x4D, 0xEE, 0xE6, 0xC0, 0x30, 0xC3, 0x57, 0x0B, 0x5F, 0xFF, 0x5A, 0xB1, 0x05, 0x73,
+    0xF6, 0x4D, 0x1C, 0x3E, 0x18, 0x3F, 0x01, 0x43, 0x47, 0x23, 0xE2, 0x0F, 0xA9, 0x1C, 0xDE, 0xC5,
+    0xAA, 0x2B, 0x24, 0xAB, 0x8F, 0xE0, 0xEC, 0x3A, 0x57, 0xBD, 0xBD, 0x47, 0xF4, 0x86, 0x53, 0x7A,
+    0xC3, 0x32, 0x20, 0x78, 0x3E, 0x0A, 0xDB, 0xBD, 0x33, 0xA4, 0x62, 0x57, 0x55, 0x5B, 0xB3, 0x33,
+    0x48, 0x2E, 0x24, 0xCD, 0x54, 0xB9, 0xD6, 0x7B, 0x73, 0x51, 0xDB, 0x45, 0xC5, 0x91, 0xDF, 0x49,
+    0xC0, 0x83, 0x22, 0x2C, 0x08, 0x9A, 0xE7, 0x24, 0x31, 0xEF, 0xDA, 0x7E, 0x54, 0xE1, 0xAF, 0x43,
+    0xB3, 0xBB, 0x57, 0x79, 0x4A, 0x07, 0xCC, 0x50, 0x6D, 0x2F, 0x32, 0x46, 0x00, 0xE0, 0xCA, 0x4A,
+    0xE6, 0x2C, 0xE6, 0xCD, 0x41, 0x23, 0xE3, 0xB9, 0x2F, 0x6A, 0x9B, 0xB7, 0xDE, 0x17, 0x50, 0xEA,
+    0x38, 0x58, 0x97, 0x40, 0x34, 0x4A, 0x9A, 0x57, 0x5E, 0x68, 0x1A, 0xA3, 0xF9, 0x53, 0xB3, 0xC3,
+    0x5F, 0xC5, 0x20, 0x37, 0xC9, 0x59, 0xFC, 0xE4, 0xFC, 0x3F, 0xD4, 0x5B, 0xBA, 0xF8, 0xB4, 0xAD,
+    0x50, 0x65, 0xAE, 0xDC, 0x5D, 0xE6, 0xF9, 0x95, 0xF2, 0xAC, 0x41, 0xC2, 0x96, 0x0F, 0x3F, 0x1F,
+    0xE3, 0x33, 0x7A, 0x0B, 0x13, 0x2D, 0x68, 0x34, 0xAA, 0x23, 0x5B, 0xC9, 0x81, 0x9D, 0xD1, 0x97,
+    0x4A, 0x5A, 0x55, 0xD6, 0xF9, 0xCE, 0x7F, 0xA2, 0x05, 0x00, 0x63, 0xF8, 0xF8, 0xE2, 0xD4, 0x43,
+    0x2B, 0x92, 0x63, 0x49, 0x3B, 0xE0, 0x05, 0x60, 0xBA, 0x29, 0x1F, 0x20, 0x09, 0x3E, 0xB9, 0x56,
+    0xF8, 0x8D, 0xBC, 0x23, 0xAA, 0xC8, 0xDB, 0xAE, 0xF7, 0xED, 0x15, 0x6E, 0xFE, 0xA8, 0xBA, 0xFC,
+    0xD5, 0x5B, 0x85, 0xCC, 0x78, 0xC6, 0x50, 0xA1, 0x96, 0xE8, 0x0D, 0x56, 0xBD, 0x45, 0x35, 0xFB,
+    0xF3, 0xF0, 0x1F, 0x87, 0x90, 0xD8, 0x1B, 0x49, 0x3B, 0x8B, 0xB6, 0x44, 0xF5, 0x08, 0xA7, 0xCB,
+    0xE6, 0x29, 0x72, 0x01, 0xC5, 0x73, 0x07, 0xD3, 0x6F, 0x8A, 0x08, 0xBC, 0x35, 0x07, 0x7B, 0xE8,
+    0x3F, 0x85, 0xE4, 0x63, 0x23, 0xF2, 0x99, 0x99, 0x52, 0x6D, 0x4F, 0xEC, 0xAE, 0x92, 0x8A, 0xB1,
+    0x5D, 0x62, 0x20, 0xFE, 0xC6, 0x8B, 0x5B, 0xA1, 0xD9, 0x21, 0x1E, 0xB5, 0x26, 0x6C, 0x53, 0x92,
+    0x9C, 0x82, 0x66, 0xCD, 0xA0, 0x2E, 0xD2, 0x72, 0xE2, 0xEB, 0xB1, 0x21, 0xCD, 0xC6, 0xC2, 0xB0,
+    0xB8, 0x13, 0x96, 0x1B, 0xF3, 0x5E, 0xF8, 0x46, 0xA2, 0xA7, 0x73, 0xFB, 0x67, 0xCB, 0x5E, 0x24,
+    0x1E, 0x1A, 0x40, 0xA2, 0x96, 0x9E, 0x72, 0x44, 0x3F, 0xFA, 0x4C, 0x03, 0x9B, 0x2B, 0x0E, 0x44,
+    0xDB, 0x0F, 0x2F, 0x55, 0x82, 0xAF, 0x08, 0x27, 0x85, 0xFB, 0xFE, 0x55, 0x08, 0x28, 0x85, 0x04,
+    0x92, 0x0D, 0xC7, 0x25, 0x48, 0x2C, 0x2A, 0x49, 0x31, 0x52, 0x65, 0xB4, 0xB4, 0xF2, 0xC0, 0xD2,
+    0x64, 0x0C, 0xB0, 0xEB, 0xC3, 0x6F, 0x11, 0xF6, 0xB3, 0x8B, 0xB1, 0xA8, 0x1F, 0xB2, 0x69, 0x46,
+    0x7E, 0x15, 0xFE, 0xCC, 0xE2, 0x1A, 0xF9, 0x1F, 0x7B, 0x65, 0xDD, 0xA6, 0xD9, 0x10, 0x03, 0xD5,
+    0x37, 0x8C, 0x25, 0x41, 0x0B, 0xFF, 0xFF, 0xF8, 0x46, 0xCE, 0x8A, 0x7A, 0x9F, 0x74, 0x61, 0xD8,
+    0xD4, 0x64, 0xE6, 0xF1, 0x46, 0xC6, 0x04, 0xC0, 0xEA, 0xDB, 0x10, 0x40, 0x6B, 0x9B, 0xD0, 0xC1,
+    0x45, 0x83, 0x1C, 0x74, 0xA8, 0x3B, 0x5F, 0xC9, 0x45, 0x69, 0x70, 0x90, 0xBD, 0x93, 0x79, 0x82,
+    0x71, 0x96, 0x75, 0x23, 0x01, 0x9A, 0x3B, 0x0E, 0xCA, 0x7D, 0xDE, 0x66, 0x49, 0x57, 0x11, 0xB2,
+    0xBF, 0xB4, 0x7E, 0x33, 0xEB, 0xA4, 0x4E, 0xE0, 0x33, 0xCC, 0x44, 0x6F, 0x89, 0xEC, 0xD0, 0x7D,
+    0x75, 0x79, 0x41, 0x96, 0x37, 0x9D, 0x5A, 0x82, 0x7A, 0xAA, 0xE8, 0x1A, 0x43, 0xA3, 0xE8, 0x1A,
+    0x24, 0x14, 0x29, 0x84, 0xE0, 0x2E, 0xD0, 0x7F, 0xAC, 0x35, 0x52, 0xF2, 0xE5, 0xD5, 0xA9, 0x7B,
+    0x9F, 0x55, 0xF3, 0xF1, 0xCB, 0x31, 0x3C, 0xDF, 0x22, 0x4A, 0x1A, 0x47, 0xB7, 0x5E, 0x3A, 0x8C,
+    0x1A, 0xF2, 0xE7, 0x0C, 0x9A, 0xC8, 0xE4, 0xF9, 0xF9, 0x30, 0xC7, 0x00, 0x9F, 0x57, 0xEF, 0x67,
+    0xB4, 0x36, 0x0A, 0xF9, 0xB4, 0x3F, 0xE6, 0x20, 0x66, 0x36, 0x88, 0x60, 0x19, 0x74, 0x8B, 0x29,
+    0x55, 0x64, 0xF2, 0x6C, 0x9D, 0x3B, 0xF4, 0xE9, 0xC8, 0x74, 0x48, 0x48, 0xCA, 0x56, 0xFF, 0x74,
+    0xE7, 0x39, 0x98, 0xD9, 0x1D, 0xCE, 0x22, 0x98, 0x35, 0xB6, 0xF5, 0xA8, 0x70, 0x51, 0xA8, 0x53,
+    0x6C, 0xEB, 0xB7, 0x99, 0xDF, 0x97, 0x34, 0x3C, 0x51, 0x74, 0x4E, 0x1E, 0xB9, 0xF4, 0x11, 0xB6,
+    0x3B, 0xAC, 0x5F, 0x32, 0xA3, 0xB8, 0x3E, 0xB3, 0x78, 0x45, 0xEB, 0x08, 0xB2, 0xAB, 0xA8, 0xD9,
+    0xBD, 0x32, 0x95, 0xD2, 0x5C, 0xAE, 0xF2, 0x86, 0x82, 0x1A, 0x53, 0xBB, 0x97, 0xA4, 0x8E, 0x4E,
+    0xD4, 0x1B, 0x3D, 0x5B, 0x70, 0x4A, 0xCE, 0x7A, 0x1A, 0xBD, 0xAE, 0xF0, 0xE4, 0xF2, 0xC0, 0x9D,
+    0x00, 0xBA, 0xD7, 0xAF, 0xF6, 0x63, 0x7D, 0x7C, 0xA0, 0x58, 0x29, 0x45, 0xBF, 0x96, 0x8F, 0x5D,
+    0xE1, 0x79, 0x75, 0x52, 0x98, 0xBF, 0x8E, 0x2C, 0x9B, 0xAE, 0xA5, 0x1B, 0x2A, 0xB0, 0x8A, 0x89,
+    0x25, 0xFE, 0x4D, 0xDA, 0x12, 0xFE, 0xA5, 0x11, 0xC3, 0x72, 0xEB, 0xE5, 0x91, 0xE0, 0xD8, 0x7E,
+    0x9B, 0xD1, 0x2D, 0xA5, 0x25, 0x3D, 0x18, 0x53, 0x68, 0x5C, 0x22, 0x7D, 0x18, 0x0A, 0x12, 0x3D,
+    0x40, 0x08, 0x40, 0x59, 0xA6, 0x12, 0x5F, 0x1C, 0x3A, 0xC5, 0xF5, 0xDB, 0xF6, 0x8D, 0x04, 0x90,
+    0xF9, 0xB7, 0x43, 0x6D, 0x88, 0x42, 0x0F, 0x5F, 0x97, 0xD0, 0x6E, 0x1B, 0xA3, 0xED, 0x0E, 0xEA,
+    0x68, 0xDE, 0x9C, 0x42, 0x91, 0xE3, 0xC2, 0xFC, 0xB3, 0x06, 0x7F, 0x55, 0x43, 0x07, 0x1B, 0x76,
+    0xC2, 0x8F, 0xFE, 0x55, 0xA9, 0x08, 0x83, 0x7F, 0xC5, 0xD9, 0x69, 0xAB, 0x91, 0xCC, 0x68, 0x6C,
+    0x7C, 0xCA, 0x45, 0x99, 0x72, 0x15, 0xF1, 0x50, 0x47, 0xC6, 0x10, 0xAD, 0xB2, 0x91, 0x93, 0xEA,
+    0x02, 0x57, 0x73, 0x96, 0x91, 0xB3, 0xD1, 0x06, 0x33, 0x2F, 0x73, 0xB0, 0x9F, 0xB1, 0xC3, 0x44,
+    0x48, 0x3F, 0xB0, 0x99, 0xD4, 0xE5, 0x89, 0x03, 0xC6, 0x10, 0x31, 0xBA, 0xD4, 0xD0, 0x93, 0x91,
+    0xBC, 0x21, 0xFA, 0xEA, 0x4B, 0xB1, 0x1A, 0x01, 0x88, 0x0C, 0x30, 0x03, 0x78, 0x8D, 0xF6, 0xF5,
+    0x99, 0x57, 0x1B, 0x00, 0xBB, 0x08, 0x31, 0x23, 0xA4, 0xAD, 0x68, 0x59, 0x80, 0xE5, 0x52, 0x59,
+    0x32, 0xE0, 0xC2, 0x93, 0x3B, 0x99, 0xC2, 0x0E, 0x03, 0x46, 0x4A, 0x5E, 0x12, 0x24, 0x7F, 0xE8,
+    0x35, 0xA5, 0xA3, 0x1A, 0xB6, 0xF6, 0xA5, 0xBE, 0xEA, 0x93, 0x04, 0xFA, 0x06, 0x0A, 0x9B, 0xEB,
+    0x0D, 0x9C, 0x52, 0x57, 0xC7, 0x88, 0x59, 0xAF, 0x2A, 0x72, 0x59, 0x7C, 0xB3, 0xFC, 0x92, 0x1B,
+    0x6E, 0xE4, 0x76, 0x1F, 0xD5, 0xFC, 0x4A, 0xF1, 0x2B, 0xEF, 0x64, 0xF8, 0x48, 0x17, 0x43, 0x7E,
+    0x1A, 0xC0, 0xAE, 0x3B, 0xC1, 0xC2, 0x37, 0x2E, 0xDC, 0x16, 0xAB, 0x8F, 0xE7, 0x54, 0x9D, 0x7C,
+    0xFD, 0x38, 0xC0, 0xE7, 0x7F, 0xF9, 0x5E, 0x54, 0x56, 0x51, 0xE9, 0x37, 0x95, 0x8A, 0x9E, 0xF0,
+    0x8F, 0x86, 0x57, 0xE8, 0x49, 0x1C, 0xCE, 0x26, 0x29, 0x94, 0x8C, 0x31, 0x35, 0xB3, 0xD5, 0x7A,
+    0x22, 0x36, 0xFB, 0x8A, 0x65, 0x21, 0xED, 0x02, 0x0D, 0x97, 0x92, 0xD5, 0x37, 0x6E, 0x25, 0xAC,
+    0x23, 0xC2, 0x92, 0xCF, 0xF4, 0x11, 0x9B, 0x04, 0x58, 0x31, 0x9C, 0xB6, 0xFA, 0xF8, 0x60, 0xDF,
+    0xA1, 0xE0, 0x53, 0x5F, 0x78, 0x5D, 0x27, 0x02, 0xD7, 0x60, 0xD3, 0x78, 0xF6, 0xF8, 0x0D, 0xA7,
+    0x9F, 0x07, 0x91, 0xAB, 0xDC, 0xB6, 0xB4, 0x8E, 0xD3, 0xCE, 0x44, 0x30, 0xEE, 0xEC, 0x94, 0x32,
+    0xB0, 0x0C, 0x49, 0x07, 0x88, 0x76, 0x67, 0xC0, 0xD7, 0x46, 0x84, 0x1F, 0x07, 0xBA, 0x1A, 0xD6,
+    0xB9, 0x3B, 0xBF, 0xD1, 0x81, 0xF0, 0xE0, 0xB8, 0xB4, 0xE8, 0x00, 0x20, 0x74, 0xA2, 0x2D, 0x25,
+    0x40, 0xE6, 0x97, 0x0C, 0xCA, 0xCF, 0xE6, 0xCD, 0x47, 0x9A, 0xAC, 0xD8, 0x68, 0x96, 0x80, 0x3F,
+    0x1C, 0x2E, 0x22, 0x8F, 0x34, 0x37, 0xCC, 0x7A, 0xC5, 0x30, 0x24, 0xB7, 0x98, 0x25, 0x62, 0x41,
+    0x6C, 0x9B, 0x38, 0x51, 0x91, 0x99, 0x98, 0x61, 0x54, 0xE7, 0x56, 0xD0, 0x76, 0x4D, 0xFB, 0xEB,
+    0xE3, 0x7A, 0x85, 0xCF, 0x18, 0x31, 0x6D, 0xD8, 0x58, 0x17, 0x40, 0x18, 0x9F, 0xED, 0x01, 0xBF,
+    0x68, 0x6D, 0x5E, 0x3D, 0xE7, 0x02, 0x37, 0xF8, 0x11, 0x71, 0x2D, 0x1A, 0xD4, 0x7E, 0xC6, 0xBD,
+    0x48, 0xB9, 0xE5, 0xF1, 0xF5, 0x9C, 0x6B, 0x34, 0xC4, 0xB8, 0xB2, 0x24, 0x04, 0x9E, 0xFC, 0x02,
+    0x99, 0x5E, 0xF6, 0x3B, 0x37, 0xAA, 0xA6, 0x54, 0xAB, 0x34, 0x46, 0x26, 0xF5, 0xC7, 0x5E, 0x06,
+    0xFA, 0x6E, 0x6E, 0xB1, 0x6E, 0xBC, 0xF1, 0x64, 0xDB, 0x86, 0x07, 0x69, 0x35, 0x51, 0x72, 0xCE,
+    0x8B, 0x3C, 0xE5, 0x1D, 0xB0, 0x54, 0xCD, 0xDE, 0x29, 0x52, 0x72, 0x7F, 0xDF, 0xA0, 0xE7, 0x75,
+    0xDA, 0xED, 0x05, 0xE9, 0x5E, 0xFE, 0x7F, 0xE5, 0xEF, 0x3B, 0x21, 0x0E, 0xD0, 0x08, 0xE7, 0x7F,
+    0x77, 0x69, 0xF3, 0x5D, 0x00, 0xB1, 0x51, 0xC4, 0x0C, 0xBA, 0x8D, 0xC2, 0x5E, 0x36, 0xE9, 0xF7,
+    0xCC, 0x50, 0xEE, 0xD8, 0xF9, 0x5E, 0x53, 0x26, 0x49, 0x7B, 0xAD, 0xE2, 0x80, 0xDF, 0xBE, 0x0D,
+    0xD1, 0x6A, 0x86, 0x35, 0x34, 0x6D, 0x35, 0x6D, 0x2F, 0xA9, 0xAC, 0x14, 0xE7, 0x06, 0xB5, 0x75,
+    0xED, 0x5A, 0xF5, 0x5B, 0xE1, 0xA5, 0x64, 0x55, 0x0F, 0x72, 0x1A, 0x43, 0x70, 0x48, 0x6B, 0x13,
+    0xC1, 0x18, 0x2C, 0x50, 0xC7, 0xCF, 0x7D, 0x69, 0x2C, 0x20, 0xD3, 0xEE, 0xE0, 0xB7, 0x29, 0x97,
+    0xB2, 0x89, 0xF8, 0xAF, 0x4B, 0x4D, 0xBB, 0x44, 0xFB, 0xC6, 0x28, 0x1D, 0xD3, 0x05, 0xD2, 0xF5,
+    0x59, 0x2D, 0x92, 0x7D, 0xEC, 0xB0, 0x81, 0x76, 0x76, 0x7A, 0xF8, 0x09, 0x8E, 0x67, 0x5A, 0xAC,
+    0x77, 0x4C, 0x64, 0x4D, 0x6B, 0x61, 0xE9, 0x27, 0x85, 0x91, 0x57, 0xF9, 0x45, 0xF0, 0xFC, 0xCC,
+    0x11, 0x0E, 0x6D, 0x84, 0x8F, 0x21, 0xE4, 0xB2, 0xA7, 0x7B, 0x9B, 0x31, 0xF9, 0xEF, 0x45, 0xE1,
+    0x3F, 0x74, 0x10, 0xEA, 0xF5, 0xBF, 0x65, 0x7E, 0xC8, 0xCF, 0x01, 0xBD, 0x40, 0x41, 0x32, 0x9D,
+    0x3E, 0xC0, 0x00, 0xC1, 0x9E, 0x6A, 0xE2, 0x54, 0xA1, 0x0D, 0xB3, 0x84, 0x3A, 0xD4, 0x08, 0xC7,
+    0x4D, 0x6A, 0x01, 0xC5, 0xD3, 0xB9, 0x80, 0xB9, 0x3C, 0xD1, 0x81, 0xB7, 0x5D, 0x8D, 0x37, 0xD4,
+    0x3C, 0x5A, 0xDC, 0xC9, 0xDD, 0x84, 0x4F, 0x56, 0xBC, 0xCC, 0xA5, 0x0D, 0x9A, 0x53, 0x9D, 0xCC,
+    0x7A, 0x52, 0xA7, 0xAE, 0x3A, 0x7F, 0x4E, 0xE1, 0x63, 0xAE, 0xFF, 0x0E, 0xA7, 0x7A, 0x3B, 0x05,
+    0x0A, 0x53, 0xC5, 0xAC, 0xD3, 0x58, 0xB5, 0xB6, 0xE1, 0xC1, 0x8B, 0x1C, 0xEF, 0x77, 0xEB, 0x2A,
+    0xAF, 0x41, 0xDA, 0x4D, 0xBC, 0xC5, 0x37, 0x27, 0xCD, 0x20, 0xBD, 0xA9, 0x83, 0x64, 0xA6, 0x28,
+    0xDE, 0x1C, 0xD7, 0x7A, 0x98, 0xEA, 0x55, 0x3D, 0xE2, 0x59, 0x2F, 0x4E, 0x96, 0xEE, 0xB2, 0xAF,
+    0xAA, 0xD3, 0xC7, 0x03, 0xEB, 0x47, 0x37, 0xF5, 0x3C, 0x6A, 0x07, 0x88, 0x20, 0x9D, 0x2A, 0xD8,
+    0xED, 0x0F, 0x38, 0xB7, 0x55, 0x3E, 0x99, 0x67, 0x8A, 0x80, 0x0F, 0x20, 0x38, 0xC2, 0x3E, 0x21,
+    0x65, 0x07, 0x62, 0x7D, 0x56, 0xE2, 0x61, 0x3E, 0x1F, 0x29, 0x20, 0x06, 0x2E, 0xB4, 0xEA, 0x23,
+    0x72, 0x91, 0xB6, 0x2B, 0x78, 0xB1, 0x01, 0xF0, 0x25, 0x0E, 0x6F, 0xD0, 0x3A, 0x98, 0x14, 0x4B,
+    0xF7, 0x18, 0x27, 0x70, 0xBF, 0x89, 0x29, 0xF2, 0x0C, 0xFA, 0xAC, 0x26, 0x73, 0xBC, 0xAA, 0x21,
+    0x5C, 0x0A, 0xC4, 0xF6, 0x95, 0x10, 0xA3, 0x90, 0x46, 0x49, 0x5C, 0x53, 0x25, 0x95, 0x93, 0x80,
+    0x0F, 0xF3, 0xB5, 0xA1, 0x7F, 0x27, 0xD5, 0xF2, 0x9D, 0x41, 0xA0, 0x34, 0xAB, 0xDC, 0xD2, 0x8F,
+    0xA4, 0xBC, 0xE8, 0x54, 0x06, 0x60, 0x13, 0x6D, 0x9B, 0x74, 0x57, 0x82, 0x1C, 0x0D, 0x1F, 0xDB,
+    0x54, 0xC3, 0x4F, 0x0C, 0xC3, 0x99, 0x0F, 0xF6, 0x6B, 0x6A, 0x72, 0x4F, 0x2C, 0x01, 0x0C, 0x91,
+    0xDC, 0x06, 0x05, 0xA7, 0xCC, 0xD4, 0x6C, 0xB3, 0x35, 0xAF, 0x10, 0xDE, 0xEE, 0xE6, 0x42, 0x93,
+    0x11, 0x41, 0x66, 0x86, 0x2F, 0xD6, 0xCF, 0xC3, 0xA7, 0x61, 0x24, 0xD0, 0xC8, 0x9D, 0x8B, 0x01,
+    0x68, 0xF7, 0x54, 0x10, 0x5C, 0xE7, 0x01, 0x49, 0xA3, 0x4D, 0x5D, 0x97, 0xEA, 0x79, 0xA8, 0xFA,
+    0x09, 0x0F, 0xAD, 0x93, 0x16, 0xCD, 0x75, 0x6B, 0x70, 0x79, 0xDB, 0xC3, 0xC8, 0x04, 0xE1, 0xD6,
+    0xDA, 0x11, 0x8E, 0x4B, 0xB6, 0x6E, 0x60, 0x5D, 0x21, 0xAA, 0xB0, 0xC0, 0xA0, 0xCD, 0xC7, 0x81,
+    0x92, 0x0F, 0xF3, 0xBC, 0xA3, 0x80, 0x5C, 0x54, 0xCA, 0x05, 0x9C, 0x75, 0x5B, 0x80, 0x3E, 0x66,
+    0x76, 0x65, 0xAA, 0x96, 0xE3, 0x6E, 0x9A, 0x6C, 0x09, 0xEC, 0x74, 0xF3, 0x95, 0x7A, 0xA8, 0x0F,
+    0x4D, 0x08, 0x1B, 0x39, 0x7F, 0xA3, 0x27, 0xA3, 0x50, 0x4F, 0xCA, 0x1A, 0xDA, 0x40, 0xFE, 0x6F,
+    0x63, 0xFB, 0xB6, 0xBC, 0x03, 0x8F, 0xBD, 0x4A, 0x95, 0xE2, 0xA1, 0xCE, 0x1E, 0xFA, 0xE6, 0xF0,
+    0x6D, 0x65, 0x7E, 0x03, 0x6C, 0xEF, 0x10, 0x88, 0x2F, 0xC3, 0x35, 0xFC, 0x67, 0xDB, 0xEF, 0xF3,
+    0xA1, 0xBC, 0x5B, 0x12, 0x9C, 0x4C, 0xFF, 0xD9, 0x5E, 0x53, 0x4E, 0xEC, 0x9C, 0x67, 0x9F, 0xED,
+    0x24, 0x75, 0x9D, 0xC5, 0xE0, 0xCB, 0x74, 0x89, 0x0D, 0x0B, 0x3B, 0x85, 0x24, 0x12, 0xAA, 0xF8,
+    0x22, 0x32, 0xAC, 0xDD, 0x3B, 0xC6, 0x90, 0x6F, 0xEF, 0xBB, 0x72, 0xEF, 0xCA, 0x0D, 0xB1, 0x49,
+    0x30, 0x9B, 0xE3, 0xBC, 0x50, 0x8D, 0x8D, 0xE0, 0x21, 0x79, 0x64, 0x89, 0x01, 0x59, 0xEF, 0xD6,
+    0x0C, 0x83, 0xED, 0xA4, 0x23, 0xCB, 0x41, 0xC5, 0x4D, 0x10, 0xC4, 0xCF, 0xC2, 0x2F, 0xC7, 0xA3,
+    0xD9, 0x03, 0xF5, 0x11, 0xD4, 0x2C, 0xC5, 0x31, 0x62, 0xF6, 0xAF, 0x90, 0x39, 0x3D, 0xC8, 0xCB,
+    0x9F, 0x98, 0xCD, 0x00, 0xBD, 0x0E, 0x80, 0xE4, 0xDF, 0xE7, 0x66, 0x00, 0x19, 0xA4, 0x8D, 0x40,
+    0x1A, 0x1E, 0xED, 0x2B, 0xD2, 0xAB, 0xDC, 0x6E, 0x0F, 0x0A, 0xD4, 0xD7, 0x44, 0xC7, 0x74, 0x85,
+    0xC2, 0xF2, 0x63, 0x96, 0x62, 0x90, 0x56, 0x0D, 0x3B, 0x27, 0x1A, 0xB1, 0xBF, 0x9F, 0x58, 0x07,
+    0xF1, 0xF5, 0x3E, 0xAF, 0x07, 0x00, 0x76, 0xA9, 0xB7, 0x38, 0x7A, 0xBC, 0xF8, 0xD7, 0x83, 0xF7,
+    0x17, 0x9F, 0xD5, 0xD5, 0x0A, 0x34, 0xBE, 0x07, 0x28, 0xFB, 0xA9, 0x00, 0xC3, 0x2A, 0xD0, 0x32,
+    0xC6, 0xAD, 0x4A, 0x58, 0x5E, 0xD9, 0xAD, 0x4D, 0x86, 0x14, 0x1D, 0x3E, 0xEB, 0xE9, 0xE5, 0x7D,
+    0xD0, 0x95, 0x33, 0x54, 0xEC, 0xC1, 0x72, 0x8B, 0xD1, 0x5A, 0x23, 0xBF, 0xB8, 0xD0, 0x85, 0x6E,
+    0x38, 0x93, 0xD7, 0xD4, 0xE9, 0x7C, 0x03, 0xC7, 0x21, 0x3F, 0x38, 0x36, 0xFB, 0xF5, 0xAD, 0xF4,
+    0xCA, 0x1A, 0x03, 0x82, 0x9B, 0x3B, 0xEB, 0xB0, 0x0F, 0xE1, 0xEF, 0x98, 0x6D, 0x76, 0x8C, 0x1E,
+    0xDC, 0xBA, 0x45, 0xE0, 0xE9, 0xAE, 0xC7, 0xC9, 0xAC, 0x91, 0xE7, 0xB5, 0xD1, 0x18, 0xFA, 0x56,
+    0x5A, 0xA1, 0x92, 0xF9, 0x2C, 0x9C, 0x06, 0x4F, 0x34, 0xDD, 0x80, 0xB5, 0xF4, 0x5F, 0x7E, 0xE0,
+    0xAF, 0xAB, 0xDE, 0x95, 0x72, 0x7F, 0xCD, 0x5D, 0x29, 0x54, 0x6A, 0xA8, 0x13, 0x5B, 0xDB, 0xCB,
+    0x30, 0xEE, 0x56, 0xD3, 0x45, 0x8E, 0xCB, 0x59, 0xDA, 0x07, 0xED, 0xEC, 0x43, 0x5E, 0x17, 0x44,
+    0xAF, 0xBC, 0x81, 0x5C, 0x4B, 0xDB, 0xAE, 0xA0, 0x46, 0x19, 0xA8, 0x61, 0x35, 0x9F, 0x17, 0xB3,
+    0xAF, 0xCC, 0x22, 0xC6, 0x0B, 0x78, 0x58, 0xE9, 0x87, 0xE2, 0x2D, 0x96, 0xF0, 0xA9, 0x62, 0x12,
+    0x35, 0xD0, 0x46, 0x6C, 0x61, 0xAE, 0xB9, 0x5D, 0x5A, 0xDE, 0x8B, 0x7F, 0xAC, 0x9E, 0x29, 0xA1,
+    0xEA, 0xC7, 0x1B, 0x24, 0x9E, 0x08, 0x48, 0xBD, 0x23, 0xF6, 0xAB, 0x4E, 0xE9, 0xDE, 0xAF, 0x4C,
+    0x79, 0xCC, 0x52, 0xB2, 0xAC, 0xF4, 0x01, 0xA9, 0xA8, 0x02, 0x9B, 0x14, 0x86, 0x4B, 0xEE, 0x94,
+    0xA8, 0x34, 0x6C, 0x00, 0x4F, 0x4C, 0xE1, 0x6D, 0xF9, 0x19, 0x8F, 0x36, 0x5E, 0x22, 0x5D, 0xB7,
+    0x03, 0x62, 0x7C, 0x4D, 0xC4, 0xF0, 0x4C, 0x3C, 0x5F, 0xBD, 0x0E, 0xB0, 0x74, 0x14, 0x08, 0xEE,
+    0x0E, 0x06, 0x65, 0xAB, 0x69, 0x7A, 0x70, 0x67, 0xC2, 0x12, 0x04, 0x45, 0xF2, 0xC8, 0xD7, 0x80,
+    0x7F, 0xDB, 0xB5, 0xD0, 0xF7, 0xAB, 0x62, 0x7A, 0xFA, 0xD6, 0x1A, 0x9E, 0x14, 0x4C, 0x4A, 0x6C,
+    0x75, 0x81, 0x37, 0xEF, 0x68, 0x4A, 0x5D, 0x23, 0xDD, 0x7E, 0xF5, 0xDD, 0x9E, 0xEF, 0xB3, 0xC8,
+    0x3F, 0x18, 0x65, 0x42, 0x14, 0x68, 0x77, 0x56, 0x24, 0x8C, 0xAD, 0x7A, 0xC3, 0x1D, 0xB3, 0xAA,
+    0x3C, 0x90, 0x38, 0x65, 0xA2, 0x6A, 0x42, 0xD9, 0x4D, 0xA1, 0xAA, 0x04, 0xA5, 0xE6, 0x36, 0xF4,
+    0xA3, 0x18, 0xA3, 0x9B, 0x8C, 0x9A, 0x5E, 0xAF, 0x6D, 0xDC, 0x6A, 0xD3, 0x61, 0xB7, 0x59, 0x2C,
+    0xF4, 0xE1, 0x16, 0xFF, 0xFC, 0x3D, 0xBC, 0x2F, 0xD6, 0xC1, 0xEE, 0xBD, 0x9B, 0x48, 0x11, 0x90,
+    0x7B, 0xED, 0x58, 0x9B, 0x84, 0x57, 0x85, 0xB3, 0xB3, 0x65, 0x14, 0x08, 0x14, 0x8F, 0x71, 0xF2,
+    0x50, 0x38, 0x7C, 0xCE, 0xEE, 0x47, 0xBD, 0xFD, 0x27, 0x6B, 0x07, 0xB7, 0xB2, 0xBB, 0x05, 0xB0,
+    0x4F, 0xB5, 0x94, 0xA0, 0x30, 0x89, 0x97, 0xD2, 0x2E, 0xE1, 0xCC, 0xAC, 0xDA, 0x95, 0x2F, 0x2E,
+    0xDD, 0xA9, 0xA9, 0xD0, 0xC6, 0xC3, 0x77, 0xB8, 0xBA, 0x19, 0xD2, 0x66, 0x91, 0xB6, 0xA8, 0x4D,
+    0x34, 0xC5, 0xE3, 0xC9, 0x4B, 0x8C, 0x49, 0x68, 0xD2, 0x47, 0xC5, 0x8C, 0x10, 0xE4, 0xBB, 0x40,
+    0x04, 0x7B, 0x26, 0x34, 0x75, 0x53, 0xC5, 0xA5, 0x57, 0x91, 0x11, 0x81, 0x49, 0x79, 0x0F, 0xE9,
+    0x95, 0x33, 0x6C, 0xF2, 0x2F, 0x2A, 0x07, 0x43, 0x71, 0xAD, 0x7B, 0x2C, 0x99, 0xFD, 0x4E, 0xC0,
+    0x8C, 0xC8, 0x69, 0x12, 0xF9, 0x1F, 0x11, 0xFA, 0x28, 0x80, 0xC7, 0xEE, 0x50, 0x63, 0x6D, 0x08,
+    0x88, 0x9D, 0x6C, 0x2E, 0x05, 0x54, 0xC2, 0x0B, 0x26, 0x69, 0xAB, 0xA5, 0xAD, 0xC1, 0xFD, 0xD9,
+    0x1D, 0xE6, 0x85, 0xD5, 0x71, 0xB6, 0xA9, 0xE9, 0x10, 0xB7, 0x2F, 0x1E, 0x12, 0x9C, 0x41, 0x14,
+    0xAF, 0xE0, 0x07, 0x8C, 0xF2, 0xA3, 0x7F, 0xA4, 0x94, 0x91, 0xF9, 0x41, 0x62, 0x8B, 0xE9, 0xA4,
+    0x11, 0x78, 0x9D, 0x75, 0x33, 0x01, 0xBD, 0x7F, 0x1E, 0x4F, 0x2F, 0x80, 0x7A, 0xF9, 0x70, 0x84,
+    0xE6, 0x45, 0xDE, 0x76, 0xD8, 0x36, 0x5C, 0xC1, 0xB9, 0x42, 0x59, 0x85, 0x9C, 0x60, 0x5F, 0x29,
+    0x03, 0x34, 0xE8, 0x65, 0xEB, 0x99, 0x7B, 0xCD, 0x3A, 0x9C, 0xB6, 0x9E, 0xA9, 0xBA, 0x7D, 0x6D,
+    0x9D, 0x27, 0xDD, 0xBE, 0xD4, 0xF9, 0xB5, 0xF8, 0x66, 0xD5, 0xAC, 0x27, 0x9D, 0x8F, 0x72, 0x04,
+    0x1D, 0xA3, 0x91, 0x9E, 0x3C, 0xBA, 0x4B, 0xF7, 0x58, 0x06, 0xBD, 0xE6, 0x8F, 0xB5, 0xA5, 0x8F,
+    0x7F, 0x1C, 0xF9, 0xD9, 0x2E, 0xD6, 0xB0, 0x52, 0x2D, 0x23, 0x8B, 0x8E, 0xD7, 0xE8, 0xFF, 0x5E,
+    0x04, 0x4A, 0xC4, 0xDA, 0x95, 0xA4, 0x91, 0xFF, 0xCB, 0x36, 0x38, 0xEE, 0x47, 0xB7, 0x51, 0xCD,
+    0x80, 0x37, 0x0D, 0x06, 0xB6, 0x56, 0x19, 0xFB, 0xAF, 0x4E, 0x94, 0x57, 0x12, 0xCC, 0x46, 0xD4,
+    0x16, 0x59, 0xF4, 0x83, 0xEF, 0x3C, 0x7C, 0xE3, 0x50, 0x61, 0x69, 0xB3, 0xC7, 0xB5, 0x96, 0xDB,
+    0x89, 0x6C, 0x27, 0xA6, 0x48, 0x67, 0x9F, 0xE8, 0x31, 0x01, 0x6D, 0x16, 0xD4, 0x8A, 0xFF, 0x93,
+    0x47, 0x9D, 0xC6, 0x2C, 0x53, 0x18, 0x01, 0x09, 0x09, 0x35, 0xFD, 0xAA, 0x43, 0x1B, 0xC0, 0xD7,
+    0x9D, 0x84, 0x01, 0x4D, 0x08, 0x51, 0x76, 0xF0, 0x21, 0x21, 0x74, 0x1D, 0xB6, 0x97, 0x0C, 0xEE,
+    0xC8, 0xCA, 0x00, 0x87, 0x52, 0xD9, 0x50, 0xD3, 0x84, 0xC9, 0xF6, 0xB3, 0x3E, 0x69, 0xB8, 0x7A,
+    0xDF, 0x10, 0x02, 0xE9, 0xB1, 0x4E, 0xF7, 0x81, 0x6D, 0x3A, 0x6E, 0x5B, 0x14, 0x78, 0xBF, 0x0E,
+    0x50, 0xB8, 0x63, 0x8B, 0x1F, 0x5F, 0xEB, 0xEA, 0x5C, 0xBB, 0xE8, 0x87, 0x07, 0x60, 0x50, 0x13,
+    0xE1, 0x36, 0xD9, 0x54, 0xEA, 0xDD, 0x9B, 0x9B, 0x53, 0xEF, 0xFD, 0xD6, 0x92, 0x88, 0x90, 0x50,
+    0x18, 0xD2, 0xAA, 0x67, 0xFF, 0xF4, 0x95, 0x06, 0xC4, 0x36, 0xB1, 0x38, 0x74, 0xAA, 0xFD, 0x05,
+    0xC8, 0x0E, 0x59, 0xB3, 0xBA, 0xD3, 0x83, 0x84, 0x3B, 0x96, 0x9E, 0x8D, 0xF4, 0xE2, 0xCA, 0x2A,
+    0x77, 0x0B, 0xD6, 0xE1, 0x2E, 0x37, 0x88, 0x0E, 0xD9, 0x13, 0xC8, 0xF8, 0x6D, 0xFC, 0x70, 0x95,
+    0xF5, 0x83, 0x02, 0xA2, 0x0F, 0x75, 0xD4, 0xE0, 0xEC, 0xFD, 0x4A, 0x82, 0xDD, 0x87, 0x1D, 0xC4,
+    0x57, 0x96, 0x54, 0xDB, 0x36, 0x07, 0x11, 0x0C, 0x0B, 0x94, 0xD0, 0xF4, 0x97, 0x75, 0xF9, 0x1D,
+    0xC4, 0x5D, 0x34, 0x19, 0x38, 0xE1, 0x2A, 0x23, 0xBD, 0x3B, 0xE6, 0x8F, 0xC2, 0x0A, 0x2B, 0x1D,
+    0xFD, 0x2E, 0x68, 0xBC, 0x11, 0xA4, 0xA1, 0x87, 0x98, 0x4E, 0x71, 0x1C, 0xBE, 0x19, 0x3F, 0xFC,
+    0x17, 0x24, 0x52, 0xA5, 0xA3, 0x16, 0xD1, 0xAD, 0x0F, 0xF8, 0x57, 0x9F, 0x7B, 0x8E, 0xD0, 0xC2,
+    0x3F, 0x78, 0x43, 0xDC, 0x58, 0xEA, 0xE2, 0x5B, 0x71, 0x66, 0x46, 0x20, 0x28, 0x01, 0xFC, 0x41,
+    0xAF, 0x19, 0x55, 0xA8, 0x8F, 0xB0, 0x08, 0x91, 0x9C, 0xA5, 0x4C, 0x10, 0xA1, 0xD5, 0x6C, 0x9E,
+    0x85, 0x68, 0x55, 0x5E, 0x07, 0x7B, 0xF6, 0xA3, 0x91, 0xEC, 0x11, 0xA7, 0xE7, 0x2C, 0x6D, 0xF8,
+    0x73, 0x26, 0x53, 0xB5, 0x44, 0x2C, 0x7E, 0x9B, 0xDD, 0x78, 0x24, 0xBA, 0xB9, 0xE5, 0xB2, 0xD1,
+    0x0E, 0xE6, 0xC8, 0x4D, 0x1F, 0x14, 0x32, 0x76, 0x1C, 0xBC, 0xE5, 0x1F, 0xC6, 0x81, 0x0E, 0x38,
+    0xD9, 0xB0, 0xC3, 0x89, 0xE7, 0x51, 0xE2, 0x6D, 0xB5, 0x4C, 0x10, 0x3B, 0xAE, 0x9F, 0x07, 0x6C,
+    0x88, 0x52, 0x09, 0x06, 0xA5, 0x5C, 0x1A, 0x2D, 0x2F, 0x3F, 0x90, 0x2D, 0xB9, 0xB7, 0x85, 0x2F,
+    0xC0, 0xE0, 0x60, 0x4A, 0x7D, 0x24, 0xC3, 0xCD, 0x9C, 0x15, 0x37, 0x5A, 0xF0, 0x56, 0x58, 0x9B,
+    0xA6, 0xB6, 0x0A, 0xED, 0x9E, 0x21, 0xF3, 0xA8, 0x53, 0x78, 0x8C, 0xB4, 0x84, 0x41, 0x02, 0xC4,
+    0xB7, 0xF5, 0x4B, 0xB2, 0x98, 0x9D, 0x89, 0xB8, 0xAD, 0xE3, 0x5E, 0x84, 0xB9, 0xDB, 0xC7, 0xA8,
+    0xC9, 0x20, 0x91, 0x05, 0x8E, 0x4B, 0x6F, 0x74, 0x1D, 0xC9, 0x6D, 0x2A, 0x4A, 0xF1, 0x5E, 0xD1,
+    0x6B, 0xFA, 0xF2, 0x4B, 0xC6, 0x72, 0xB5, 0x99, 0x05, 0xEF, 0xFF, 0xE3, 0x00, 0x97, 0xE1, 0xB6,
+    0x07, 0x1F, 0xBC, 0x95, 0xCD, 0x1F, 0xDC, 0xD5, 0x93, 0x62, 0x7C, 0xA0, 0xEC, 0xCE, 0x9A, 0xC4,
+    0x55, 0x9C, 0x79, 0x23, 0x2A, 0x61, 0x17, 0x46, 0x86, 0x9E, 0x81, 0xC5, 0x40, 0x0D, 0x63, 0xBC,
+    0xAC, 0x52, 0xE8, 0x69, 0xBE, 0x7C, 0x76, 0xE8, 0x12, 0xB3, 0x66, 0x3F, 0xE7, 0xB9, 0x97, 0xF0,
+    0x32, 0xD9, 0xC6, 0xBF, 0xF3, 0x12, 0xC9, 0x9E, 0x93, 0xD8, 0xF4, 0x2E, 0x17, 0x54, 0xA7, 0x32,
+    0xE2, 0xF6, 0x6C, 0xBE, 0xCA, 0xBA, 0x8D, 0x76, 0x11, 0xA2, 0x48, 0xB7, 0x4E, 0x84, 0x42, 0xE5,
+    0xF4, 0xAF, 0x12, 0x4F, 0x56, 0x98, 0x7B, 0xF3, 0xE0, 0x22, 0x94, 0x1A, 0x64, 0xA3, 0xDD, 0x26,
+    0x13, 0x73, 0x96, 0x84, 0x46, 0xB5, 0x98, 0xE4, 0x91, 0xEC, 0xF3, 0x06, 0x37, 0x21, 0x79, 0x77,
+    0x91, 0x02, 0x2E, 0x18, 0xE0, 0x60, 0x75, 0xB8, 0xC5, 0xAD, 0x9D, 0xB3, 0x56, 0x8B, 0x92, 0x0E,
+    0x01, 0xAB, 0x91, 0xF2, 0xDC, 0x41, 0xBC, 0x25, 0xCE, 0x16, 0x31, 0x1B, 0x24, 0x52, 0xD9, 0x02,
+    0x25, 0x4E, 0x64, 0x8A, 0x11, 0x15, 0xB9, 0x20, 0x33, 0x01, 0xD0, 0x4F, 0x6B, 0x04, 0x67, 0x32,
+    0xB9, 0xEC, 0xD0, 0x77, 0xFC, 0x51, 0x0F, 0x9E, 0x5C, 0xF5, 0x3C, 0x18, 0x0A, 0xF2, 0xD3, 0x4E,
+    0x2C, 0x3B, 0xA7, 0xC0, 0x43, 0x33, 0xE8, 0x59, 0x40, 0xB7, 0xAF, 0x75, 0x38, 0xDC, 0x1D, 0xF3,
+    0x77, 0xAD, 0xD9, 0xF7, 0x3A, 0x5D, 0xF4, 0xD4, 0xB5, 0x54, 0x15, 0x73, 0x7B, 0xE7, 0xA3, 0x2B,
+    0x22, 0xE9, 0x09, 0x2C, 0xDE, 0x60, 0x2A, 0x5B, 0xBB, 0xD9, 0xA1, 0xF6, 0x1E, 0x69, 0x38, 0xC2,
+    0x4B, 0xCD, 0xEC, 0xA2, 0xA3, 0x1D, 0xBA, 0xBE, 0x0C, 0xA4, 0x42, 0x01, 0xE9, 0x1C, 0x4A, 0xC6,
+    0xCF, 0xF8, 0x9A, 0x1B, 0x2B, 0x2B, 0x44, 0x81, 0x50, 0x69, 0x85, 0x08, 0xDD, 0xE7, 0xBE, 0xF9,
+    0xBF, 0x65, 0x59, 0xB3, 0x80, 0x5C, 0x85, 0x5D, 0x68, 0x05, 0xBA, 0xA1, 0xDC, 0x32, 0x9C, 0xA9,
+    0x98, 0x7D, 0x3B, 0x4E, 0x03, 0xA4, 0x28, 0x0A, 0x3F, 0xB3, 0x09, 0xA8, 0x0C, 0x5A, 0x92, 0xA3,
+    0xDF, 0xAE, 0x69, 0xBE, 0x5D, 0xFA, 0x75, 0x49, 0xA4, 0x5C, 0xE5, 0xBB, 0xCD, 0x7C, 0xD8, 0x5A,
+    0xAA, 0x77, 0x7C, 0x81, 0xE3, 0xCA, 0xB9, 0x7C, 0xC8, 0xF9, 0x83, 0x8B, 0x84, 0xB7, 0xE6, 0xEF,
+    0x52, 0xF0, 0xC5, 0xB8, 0xAF, 0x7F, 0xA6, 0xA0, 0x4E, 0xE0, 0x1A, 0x41, 0x93, 0x01, 0xF7, 0xBE,
+    0x0E, 0x58, 0x73, 0xFA, 0x43, 0xE7, 0xC0, 0x72, 0x2B, 0x4F, 0x4A, 0x80, 0xBA, 0xC7, 0x2E, 0x19,
+    0x4C, 0xB5, 0xF1, 0xFD, 0x97, 0x11, 0x8A, 0xD3, 0xB7, 0xC9, 0x73, 0x6D, 0x04, 0x9E, 0xAA, 0xC2,
+    0xD3, 0xEE, 0xB9, 0xC0, 0x98, 0x06, 0x9D, 0xA5, 0x6B, 0x19, 0x5B, 0x95, 0x13, 0x6C, 0x27, 0x9E,
+    0x77, 0xFB, 0x66, 0x7B, 0x7F, 0x1E, 0x9D, 0x5D, 0x38, 0x30, 0xB6, 0x7E, 0xA9, 0x0D, 0xF6, 0x8B,
+    0xAE, 0x58, 0x94, 0xA3, 0x3B, 0x67, 0x95, 0xAD, 0xCD, 0xEE, 0x37, 0xB6, 0x4A, 0xC1, 0x68, 0x2B,
+    0x69, 0x5F, 0x46, 0x9F, 0x7D, 0x29, 0x52, 0xEF, 0x7A, 0xCF, 0xB2, 0x28, 0x8C, 0xCE, 0x3D, 0x71,
+    0xBC, 0x0F, 0x46, 0x7F, 0xC2, 0xB9, 0x86, 0x84, 0x9B, 0x45, 0x21, 0x96, 0x01, 0x1D, 0xD7, 0x03,
+    0x48, 0xC5, 0xBB, 0x55, 0x30, 0x18, 0x8A, 0xDA, 0xE8, 0xFA, 0x72, 0x94, 0xE0, 0xD8, 0x13, 0xF1,
+    0x8B, 0x4C, 0xC3, 0xD5, 0x6D, 0x74, 0x92, 0xD0, 0x21, 0xDE, 0xAF, 0x38, 0x99, 0xB3, 0x7D, 0xCB,
+    0xB3, 0xF4, 0x3C, 0xC8, 0xC3, 0xFA, 0xB6, 0x3F, 0xF8, 0x3E, 0x30, 0x82, 0x55, 0x7F, 0x64, 0x71,
+    0xEE, 0x62, 0x6B, 0xFA, 0x1D, 0x97, 0x7E, 0xBC, 0x89, 0xCD, 0x3C, 0x72, 0x6A, 0xEA, 0xE0, 0xDE,
+    0xB7, 0x10, 0x62, 0x16, 0x00, 0x2A, 0xD9, 0x02, 0x47, 0x51, 0xAA, 0x56, 0x8D, 0x1F, 0xC9, 0x04,
+    0x33, 0x87, 0xE3, 0x1F, 0x0F, 0x19, 0xBC, 0x54, 0x17, 0x9A, 0x3A, 0x88, 0x48, 0x81, 0xC0, 0x68,
+    0xC7, 0x96, 0xBB, 0xB7, 0x24, 0x7B, 0xF2, 0xA0, 0x45, 0x65, 0x30, 0x4A, 0xDA, 0x70, 0x78, 0x77,
+    0xC8, 0x0E, 0x98, 0x7B, 0x4E, 0xC3, 0x04, 0x41, 0xDD, 0x9B, 0xA3, 0xED, 0x1A, 0x88, 0x1E, 0x2A,
+    0xCF, 0x8A, 0xB7, 0xD7, 0x86, 0x2F, 0xC1, 0xBF, 0x67, 0xC2, 0x65, 0x70, 0xDC, 0x77, 0x7B, 0xC5,
+    0xFA, 0x03, 0x57, 0x42, 0xAD, 0x92, 0xCF, 0xCB, 0xD0, 0x11, 0x11, 0x9E, 0x93, 0x5B, 0xCB, 0x78,
+    0xC2, 0x55, 0xD6, 0xAD, 0x95, 0x3A, 0x45, 0x32, 0x42, 0x8F, 0xB1, 0x18, 0x17, 0xAF, 0xF2, 0x94,
+    0x21, 0x08, 0x58, 0x13, 0x19, 0x8F, 0x12, 0x51, 0xB7, 0x95, 0x26, 0x8E, 0xD6, 0x9A, 0x82, 0x78,
+    0x4D, 0x58, 0xEF, 0xC0, 0x89, 0x0D, 0xF7, 0xB6, 0xCF, 0x46, 0x28, 0x3C, 0x97, 0x68, 0x32, 0xC5,
+    0x09, 0x25, 0x18, 0xE5, 0x9E, 0x74, 0x0E, 0x73, 0xD8, 0x98, 0xC6, 0x2D, 0xCA, 0xE4, 0xDF, 0x2B,
+    0x8A, 0xE1, 0x15, 0x8D, 0x9F, 0x70, 0xC0, 0x81, 0xCC, 0x9B, 0x4B, 0x0A, 0xA5, 0x0A, 0x82, 0x5F,
+    0xC0, 0x55, 0x73, 0x47, 0x0D, 0xEE, 0x59, 0xFD, 0xE5, 0xDD, 0x52, 0x74, 0xA2, 0x0F, 0xF1, 0xFC,
+    0xE9, 0x14, 0x9C, 0xF7, 0x03, 0x3F, 0xC3, 0xF5, 0xFD, 0x7D, 0x1C, 0xB4, 0x62, 0x8E, 0xDD, 0x01,
+    0x77, 0x96, 0x4D, 0x23, 0x5D, 0x37, 0x88, 0x83, 0x33, 0xB0, 0x75, 0x1E, 0x9D, 0x15, 0xB5, 0x9F,
+    0x78, 0x04, 0x92, 0x9E, 0x54, 0x40, 0x10, 0x4E, 0xFF, 0x5B, 0xF3, 0xF8, 0xFC, 0x67, 0xEF, 0x85,
+    0x1D, 0xFF, 0x0B, 0x2F, 0x5D, 0x54, 0xE1, 0xEA, 0x8C, 0xB8, 0x41, 0x71, 0x91, 0x2D, 0xEB, 0x14,
+    0x78, 0x78, 0x25, 0x95, 0x73, 0x70, 0xED, 0x24, 0x2F, 0x97, 0x51, 0xE0, 0x8E, 0x6E, 0x43, 0x12,
+    0x2B, 0xCF, 0x88, 0xDE, 0xA1, 0xB0, 0xDB, 0x7F, 0x1C, 0xA1, 0x75, 0xD9, 0x54, 0x1D, 0x9E, 0xE1,
+    0x95, 0x68, 0x7E, 0xD4, 0x47, 0xD1, 0x42, 0x61, 0x60, 0xD9, 0xDE, 0x25, 0xC0, 0xD1, 0x5A, 0xB6,
+    0x72, 0xF5, 0x37, 0xF8, 0x73, 0xC2, 0x05, 0xE3, 0xE1, 0x3B, 0x55, 0x29, 0xCB, 0xB0, 0x2D, 0xBD,
+    0x6A, 0xF8, 0x67, 0xF6, 0xCD, 0x8B, 0xE3, 0x80, 0x49, 0x24, 0x38, 0x22, 0x2E, 0xA6, 0x68, 0x25,
+    0x41, 0xCA, 0xEF, 0x0F, 0x33, 0x53, 0xC0, 0xBB, 0x74, 0xEA, 0xC6, 0xC5, 0xA5, 0x5F, 0x07, 0xE6,
+    0x3B, 0xB4, 0xA0, 0x43, 0xFC, 0xA9, 0x28, 0x9B, 0xD2, 0x11, 0x57, 0x61, 0xD9, 0x79, 0x63, 0x5E,
+    0x7A, 0x7E, 0x9A, 0xDF, 0x77, 0x70, 0x0E, 0x0C, 0xDA, 0xD6, 0xCE, 0x6B, 0x92, 0x71, 0x94, 0x9B,
+    0x2B, 0xEE, 0x3B, 0x99, 0xCB, 0x82, 0x19, 0x55, 0x0E, 0x3E, 0xA3, 0xAF, 0x1D, 0xF4, 0x05, 0x1E,
+    0x50, 0x8F, 0x0E, 0x72, 0x6E, 0x16, 0x28, 0xE3, 0xD1, 0xB2, 0x57, 0xBE, 0x54, 0x9F, 0xE8, 0x7F,
+    0xBE, 0xC2, 0x07, 0x22, 0xD0, 0x3E, 0xE4, 0x1A, 0x50, 0xB5, 0x78, 0x48, 0x93, 0xC3, 0x7E, 0xA8,
+    0x62, 0xD1, 0x92, 0x29, 0x52, 0x70, 0xC5, 0x62, 0x5F, 0x44, 0xE8, 0xD5, 0x27, 0x5A, 0x07, 0xBE,
+    0xE2, 0x01, 0xCB, 0x9F, 0xFF, 0xD4, 0x02, 0x15, 0xD8, 0x9E, 0xB6, 0x19, 0x5A, 0x94, 0x2C, 0x74,
+    0xC9, 0xEE, 0x0B, 0x0D, 0x57, 0x32, 0x0E, 0x3C, 0x75, 0xC3, 0xEE, 0xC4, 0x48, 0x13, 0xB3, 0xD1,
+    0x5F, 0xB4, 0xAA, 0xE4, 0x6F, 0xE9, 0x98, 0xD8, 0x02, 0xF4, 0x00, 0xF5, 0xA5, 0x52, 0xED, 0x27,
+    0x3E, 0x40, 0xB1, 0x84, 0x81, 0x3E, 0x79, 0xF0, 0xF4, 0x09, 0x34, 0x36, 0x01, 0xF3, 0xD5, 0x5D,
+    0x68, 0xE8, 0xE0, 0xEF, 0x36, 0xA6, 0x67, 0xBA, 0xD7, 0xE2, 0xC7, 0x06, 0x6A, 0x43, 0xCD, 0xC5,
+    0xD2, 0x78, 0x45, 0x8A, 0xE8, 0x8D, 0x5F, 0x41, 0x10, 0xCA, 0x38, 0x8B, 0x6D, 0x91, 0xF1, 0x05,
+    0x06, 0xDE, 0x51, 0xE8, 0xF9, 0xC3, 0x68, 0xEE, 0x2D, 0x48, 0x09, 0x58, 0x2E, 0x08, 0x18, 0x0B,
+    0xD3, 0x64, 0x6B, 0xD3, 0xB3, 0xC4, 0x66, 0xB7, 0x29, 0x4B, 0xDB, 0x47, 0x40, 0xB2, 0xC7, 0xBD,
+    0x48, 0x21, 0xA0, 0xCF, 0xBC, 0x23, 0xA1, 0x31, 0x42, 0x48, 0x3E, 0xB2, 0xAF, 0x6F, 0x25, 0x95,
+    0x89, 0xCC, 0x8F, 0xC0, 0x4F, 0xA6, 0x37, 0xCE, 0x0A, 0xF7, 0xF5, 0x93, 0xBE, 0x98, 0x5E, 0x5C,
+    0x37, 0x2B, 0xBD, 0x14, 0xD3, 0xF7, 0x1F, 0x38, 0x27, 0xA8, 0xD1, 0x55, 0x18, 0xDD, 0x16, 0xF1,
+    0x3B, 0xC1, 0x20, 0x75, 0x21, 0x30, 0x0B, 0xC3, 0xC1, 0xD9, 0x78, 0x9E, 0x7A, 0xDD, 0xD0, 0x36,
+    0xEF, 0x97, 0xFC, 0x61, 0x45, 0x9B, 0x49, 0x8D, 0x73, 0x70, 0xC5, 0xEC, 0xB0, 0x45, 0x78, 0x09,
+    0x85, 0x42, 0x68, 0x9F, 0x7F, 0x50, 0x35, 0xE4, 0x2A, 0x5F, 0xEB, 0x30, 0xB5, 0x01, 0x0F, 0x5B,
+    0x2B, 0x48, 0xAE, 0xD4, 0x41, 0x00, 0x69, 0x58, 0x7D, 0xCA, 0x23, 0x0B, 0xC0, 0x32, 0xDC, 0x54,
+    0xBA, 0x26, 0x22, 0xB5, 0xB1, 0xDB, 0xF9, 0x5E, 0x81, 0x6E, 0x48, 0xB8, 0x70, 0x66, 0xAA, 0x7E,
+    0x6B, 0x42, 0xB4, 0x51, 0x25, 0xB5, 0x0D, 0x1B, 0x45, 0x4B, 0x6C, 0x31, 0x45, 0xA3, 0x91, 0x56,
+    0x18, 0x2E, 0x34, 0x1A, 0x67, 0x87, 0xA8, 0xC9, 0x6B, 0x72, 0xD8, 0xE5, 0x91, 0x2D, 0x71, 0xD8,
+    0xC8, 0xA4, 0x95, 0xB1, 0xFD, 0xF8, 0x0F, 0xEA, 0x08, 0x4F, 0x11, 0x2A, 0x39, 0xE7, 0xF6, 0x50,
+    0xCC, 0xF7, 0x64, 0xA1, 0x66, 0xE7, 0xA9, 0xDD, 0x49, 0xAB, 0xBF, 0x5B, 0x99, 0x14, 0xE2, 0xD6,
+    0x91, 0x3A, 0x70, 0x08, 0x67, 0x87, 0x7C, 0xB7, 0x76, 0x21, 0xE5, 0x23, 0x32, 0x9F, 0x6F, 0x88,
+    0xBB, 0x10, 0xB6, 0xBE, 0xA2, 0xB1, 0x3E, 0xDA, 0x64, 0x5C, 0x25, 0x0B, 0x0F, 0x94, 0x39, 0x0E,
+    0x21, 0x91, 0x01, 0x60, 0x8C, 0x9B, 0x3D, 0x9E, 0xEB, 0x3C, 0x05, 0x28, 0x66, 0x58, 0x9A, 0x7D,
+    0xA3, 0x2C, 0x42, 0x13, 0xD7, 0x52, 0x09, 0x0A, 0x12, 0x14, 0xB1, 0x05, 0x4D, 0x7C, 0xE4, 0x04,
+    0x2C, 0xC8, 0x93, 0x98, 0xBB, 0x90, 0x7C, 0xDE, 0x31, 0xD1, 0x21, 0x5C, 0x21, 0x75, 0x94, 0x64,
+    0x62, 0x33, 0xB9, 0xCF, 0xD1, 0x5C, 0x77, 0xC0, 0xAB, 0x0A, 0xF8, 0x03, 0x00, 0x35, 0xA1, 0xE9,
+    0x8D, 0xB5, 0x43, 0x6F, 0x94, 0x82, 0xAA, 0xCE, 0xB3, 0x5E, 0x6C, 0x13, 0x45, 0x6F, 0xD5, 0xE8,
+    0x12, 0xFA, 0x4C, 0x68, 0x3D, 0x04, 0x57, 0x77, 0x87, 0x1D, 0xFC, 0xA6, 0x19, 0xC2, 0x09, 0x5B,
+    0x65, 0xD7, 0x86, 0xE2, 0x8E, 0x14, 0x52, 0x92, 0xA5, 0xC9, 0xCA, 0xFD, 0x42, 0x54, 0x12, 0xF3,
+    0xB9, 0x87, 0x11, 0x71, 0x70, 0x8D, 0x98, 0x85, 0xBB, 0x92, 0x36, 0x42, 0x42, 0x4F, 0x2D, 0xDB,
+    0x8A, 0x77, 0x2A, 0x93, 0x8D, 0xF6, 0x87, 0x5D, 0x8F, 0x52, 0x91, 0x5A, 0x50, 0xC2, 0x9D, 0xE3,
+    0x8C, 0xA6, 0xD2, 0x4C, 0xDF, 0xE6, 0xEC, 0xF7, 0x6E, 0x4C, 0xAF, 0x80, 0x28, 0xF1, 0x1A, 0x80,
+    0x25, 0x15, 0x27, 0xFF, 0xB2, 0x6C, 0x3A, 0x49, 0xC1, 0xF4, 0x8F, 0xCD, 0x82, 0x8A, 0xC7, 0x9F,
+    0x3D, 0x32, 0x6D, 0xDD, 0x36, 0xDB, 0x2F, 0x26, 0x60, 0x2F, 0x21, 0x91, 0xBC, 0x8C, 0x53, 0x7C,
+    0x76, 0xEF, 0x8F, 0xE7, 0xE6, 0x1D, 0xA9, 0x32, 0x2C, 0x23, 0x81, 0xF9, 0x07, 0x88, 0xB3, 0xD7,
+    0xBE, 0x83, 0x1A, 0xE4, 0x02, 0x5A, 0x29, 0x72, 0x73, 0x2A, 0x6A, 0xBE, 0x57, 0x3A, 0x05, 0x89,
+    0xD1, 0xD8, 0x26, 0x9B, 0xCF, 0x01, 0x9F, 0xA4, 0xAB, 0xC1, 0x53, 0x62, 0x83, 0xE9, 0x3D, 0xE5,
+    0x7C, 0xA4, 0x2A, 0x98, 0x95, 0x57, 0x19, 0x45, 0xE3, 0x54, 0x43, 0xD4, 0x39, 0x51, 0x3B, 0x27,
+    0x8E, 0xB9, 0x33, 0x90, 0xEF, 0x0E, 0xAD, 0xD2, 0xE6, 0x7A, 0x2A, 0x00, 0xEB, 0x84, 0x3C, 0xE8,
+    0x97, 0x1F, 0x0A, 0xAB, 0x56, 0x0F, 0x9D, 0xB7, 0xD1, 0x67, 0x64, 0x24, 0xF9, 0x89, 0xE1, 0xB6,
+    0x1B, 0xEE, 0xB7, 0xA8, 0xDD, 0x03, 0x40, 0xB0, 0xEB, 0x2D, 0x29, 0x53, 0x81, 0x8B, 0x0C, 0x67,
+    0x53, 0x5E, 0xD3, 0xD5, 0xC5, 0xE6, 0x7C, 0x12, 0xE6, 0xBB, 0x34, 0x24, 0xF1, 0x5B, 0x05, 0xBA,
+    0x6E, 0x16, 0xA7, 0xA9, 0x31, 0xFB, 0x47, 0xE1, 0xFE, 0x67, 0x07, 0xF9, 0x96, 0x34, 0x5A, 0x3E,
+    0x95, 0xAD, 0x64, 0x16, 0xE9, 0xD8, 0x72, 0x58, 0x90, 0x67, 0x52, 0xFE, 0x08, 0x83, 0x35, 0xEB,
+    0x8A, 0x8C, 0xF2, 0xD0, 0xAA, 0x79, 0x42, 0x33, 0x13, 0x8D, 0x34, 0x76, 0xFD, 0x39, 0x2C, 0xEC,
+    0xCA, 0x74, 0x07, 0xC1, 0xE2, 0x47, 0xF4, 0x5C, 0x65, 0x99, 0xE4, 0xBA, 0xC9, 0x41, 0xA4, 0x48,
+    0x51, 0xEF, 0x99, 0x5E, 0x99, 0x4F, 0x74, 0x56, 0x4C, 0xA6, 0xFA, 0xC7, 0x4C, 0xC2, 0xAD, 0xA4,
+    0x3C, 0xF6, 0xD4, 0x8C, 0xB6, 0x91, 0x6B, 0xB4, 0xCE, 0xFB, 0x34, 0xF7, 0xE3, 0xF6, 0x11, 0xE2,
+    0x56, 0x3E, 0xA2, 0x60, 0xA3, 0x47, 0x59, 0x3E, 0xDF, 0x6A, 0x13, 0xB8, 0xED, 0x03, 0x8B, 0x54,
+    0x12, 0xD1, 0x29, 0xFD, 0x06, 0x26, 0x03, 0xF5, 0x25, 0x69, 0x05, 0x6D, 0x73, 0xE6, 0x1D, 0x28,
+    0xC0, 0x6F, 0x75, 0x67, 0xCE, 0xC4, 0xF7, 0x31, 0xBB, 0x21, 0x61, 0xB1, 0xC4, 0x5D, 0x36, 0x50,
+    0xEC, 0xBE, 0x23, 0xEE, 0x47, 0x62, 0x82, 0x6B, 0xE9, 0x79, 0xCE, 0xAF, 0x76, 0x6A, 0xD1, 0xFC,
+    0x79, 0x5E, 0xE8, 0x1E, 0xD8, 0x8F, 0xF9, 0x63, 0x5F, 0x09, 0x1A, 0x21, 0x93, 0x09, 0x90, 0x15,
+    0x62, 0xDE, 0x69, 0x65, 0x8D, 0xA3, 0xAC, 0x79, 0x71, 0xA1, 0xBB, 0xA9, 0xCF, 0x45, 0x89, 0x15,
+    0x1B, 0x7D, 0x49, 0x37, 0x56, 0x2D, 0x52, 0xF1, 0x66, 0x8F, 0x03, 0xA1, 0xE3, 0x93, 0x8C, 0xAC,
+    0xB3, 0x77, 0x89, 0x69, 0x41, 0x23, 0xE4, 0x17, 0xEE, 0x8E, 0x73, 0x06, 0xE4, 0xDC, 0x95, 0x49,
+    0xA6, 0x30, 0xCD, 0x1B, 0x30, 0x42, 0xD9, 0x06, 0xF9, 0x5C, 0x8A, 0x50, 0xBB, 0xA0, 0xA8, 0xEF,
+    0xD3, 0xA1, 0x83, 0xF1, 0xC1, 0x77, 0x4C, 0x4B, 0x7B, 0xCC, 0xEF, 0xE4, 0xB4, 0x4D, 0x50, 0x01,
+    0x1B, 0x44, 0x33, 0xFD, 0xEF, 0xB5, 0x10, 0x72, 0x92, 0x3E, 0x96, 0x61, 0xAB, 0x20, 0x7C, 0x38,
+    0xCB, 0xD7, 0x79, 0xA3, 0x7A, 0x35, 0x87, 0xFA, 0xC6, 0x5E, 0xB8, 0x9E, 0x2C, 0xE5, 0x96, 0xBA,
+    0x6E, 0xF1, 0xC3, 0x63, 0x92, 0x65, 0xEE, 0x05, 0x5B, 0x13, 0xFA, 0xE8, 0x8B, 0xE7, 0xCB, 0x73,
+    0xB9, 0xC9, 0x0F, 0x60, 0xC6, 0x36, 0x1D, 0x8F, 0x9C, 0xC0, 0x83, 0x1A, 0xB4, 0x34, 0xDE, 0xF6,
+    0x13, 0x4E, 0x58, 0x15, 0x3D, 0xD6, 0x21, 0x5F, 0xE6, 0x21, 0x25, 0x15, 0x07, 0xEF, 0xD7, 0x06,
+    0x5D, 0x9A, 0x59, 0xC2, 0x9F, 0x2D, 0x5A, 0xE4, 0x21, 0x19, 0x02, 0xF2, 0x01, 0x5E, 0xC2, 0x80,
+    0xAB, 0x8D, 0x96, 0x38, 0x0F, 0x43, 0x71, 0x61, 0x17, 0x72, 0x1E, 0x16, 0x3E, 0x4B, 0xE1, 0xA0,
+    0xB5, 0x22, 0xFB, 0x74, 0xED, 0x4F, 0xEF, 0x4E, 0x56, 0x8A, 0x52, 0x5D, 0x76, 0x60, 0x9D, 0xE2,
+    0x8B, 0xC0, 0xEC, 0xF3, 0x05, 0x2F, 0x59, 0xE5, 0xC0, 0x68, 0x02, 0xE9, 0x77, 0x17, 0x86, 0x7D,
+    0xC6, 0x71, 0xA7, 0xF1, 0x44, 0x50, 0xB3, 0xFB, 0xB6, 0x27, 0x23, 0x57, 0x5E, 0xCA, 0x18, 0xAA,
+    0xA7, 0x7C, 0xCD, 0xE7, 0xEA, 0xB9, 0xA9, 0xB8, 0xA0, 0x99, 0xF0, 0xED, 0xF1, 0xF8, 0x4D, 0x11,
+    0xFA, 0x04, 0x75, 0xA7, 0x41, 0xC5, 0xB3, 0xFB, 0x37, 0x46, 0x14, 0xBF, 0x89, 0xAB, 0x33, 0x55,
+    0x86, 0x92, 0x36, 0x2F, 0xF6, 0xF1, 0x7B, 0x60, 0x8D, 0xA9, 0x85, 0x48, 0xF5, 0x49, 0x46, 0xD9,
+    0xB3, 0x18, 0xB9, 0x1E, 0x3F, 0x09, 0x87, 0x33, 0x23, 0x72, 0xE8, 0x4F, 0x48, 0xC9, 0xD7, 0x30,
+    0x1C, 0xF0, 0x7B, 0x88, 0xF9, 0xAE, 0x5C, 0x23, 0x42, 0xC8, 0x3D, 0xD4, 0xA4, 0xA9, 0x8F, 0xBA,
+    0x9E, 0xFD, 0x6F, 0xC7, 0x10, 0x4F, 0xFD, 0xA5, 0xAC, 0xA4, 0xBF, 0xDB, 0x1D, 0xFB, 0x67, 0xAA,
+    0x47, 0xE1, 0x8E, 0x47, 0xCC, 0x51, 0xE3, 0xAD, 0x80, 0x63, 0x2A, 0x5A, 0xEF, 0x3B, 0x6B, 0x7E,
+    0x5B, 0xC6, 0x6F, 0x84, 0x3E, 0xD9, 0xAE, 0x3A, 0x7B, 0x2F, 0xED, 0x23, 0x57, 0x56, 0x59, 0x5A,
+    0x35, 0x11, 0x0D, 0xFD, 0x43, 0x06, 0x6C, 0xB3, 0x26, 0xDA, 0xB4, 0xEA, 0x84, 0x94, 0xB8, 0x4F,
+    0x60, 0xAC, 0x3F, 0x2E, 0x9D, 0xF0, 0x1B, 0xD5, 0xCA, 0xF6, 0x97, 0x82, 0x7A, 0x45, 0x76, 0xCC,
+    0xF2, 0x63, 0x3E, 0xED, 0x80, 0x63, 0xB2, 0x1E, 0x18, 0x21, 0x85, 0x84, 0x89, 0xF8, 0xB0, 0x31,
+    0x4F, 0x12, 0x76, 0x8E, 0x3B, 0x32, 0x54, 0x57, 0x95, 0x26, 0x0E, 0xB0, 0x28, 0x65, 0xC3, 0x31,
+    0x18, 0x5B, 0xD1, 0x8E, 0x32, 0x53, 0x40, 0x57, 0xD5, 0x90, 0x16, 0xE6, 0x23, 0xAE, 0xAF, 0x59,
+    0xD1, 0x8B, 0xDC, 0x3D, 0x34, 0xA5, 0x56, 0xCA, 0x61, 0xF2, 0xEE, 0xF4, 0xD2, 0x67, 0x82, 0x54,
+    0x5F, 0x5A, 0x05, 0x94, 0x24, 0xDF, 0xD9, 0xE3, 0x72, 0x20, 0x30, 0x6C, 0x58, 0x25, 0x66, 0x12,
+    0x81, 0x75, 0x46, 0x51, 0xAB, 0xCB, 0x0F, 0xEC, 0x77, 0x84, 0x3D, 0xB1, 0xA7, 0x4A, 0xF5, 0x35,
+    0xAF, 0xF2, 0x01, 0x6C, 0x7F, 0x42, 0xA9, 0x28, 0x76, 0xE4, 0x6E, 0xF2, 0x4B, 0x7E, 0xD0, 0x7D,
+    0x57, 0x2E, 0x25, 0x4F, 0x90, 0x8A, 0x74, 0xB2, 0x87, 0x4C, 0x9C, 0x75, 0x5A, 0xBE, 0xEF, 0x46,
+    0xA1, 0x0D, 0x20, 0xF5, 0x94, 0x7A, 0xA7, 0x72, 0x0A, 0x6E, 0xBC, 0x80, 0x01, 0x14, 0x02, 0x00,
+    0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F,
+    0x6D, 0x61, 0x72, 0x6B, 0x0D, 0x80, 0x03,
+};
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerif.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerif.c
new file mode 100644
index 0000000..ccb12ed
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerif.c
@@ -0,0 +1,2442 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifFontData [19469] = {0x1,
+                                                    0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xe,
+                                                    0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
+                                                    0x69, 0x66, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1,
+                                                    0x1, 0x26, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1,
+                                                    0xf8, 0x1d, 0x2, 0xf8, 0x1d, 0x3, 0xf8, 0x18,
+                                                    0x4, 0xfb, 0x3c, 0xfb, 0x8e, 0xfa, 0x7c, 0xfa,
+                                                    0x2, 0x5, 0x1c, 0x7, 0x9f, 0xf, 0x1c, 0x8,
+                                                    0xf6, 0x11, 0xb6, 0x1c, 0x44, 0xa3, 0x12, 0x0,
+                                                    0x3, 0x1, 0x1, 0x5, 0x2f, 0x3e, 0x45, 0x75,
+                                                    0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                    0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f,
+                                                    0x6d, 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20,
+                                                    0x4f, 0x54, 0x46, 0x0, 0x7b, 0x2, 0x0, 0x1,
+                                                    0x0, 0x9, 0x0, 0x11, 0x0, 0x24, 0x0, 0x2c,
+                                                    0x0, 0x4a, 0x0, 0x54, 0x0, 0x60, 0x0, 0x68,
+                                                    0x0, 0x71, 0x0, 0x86, 0x0, 0x91, 0x0, 0x9e,
+                                                    0x0, 0xb9, 0x0, 0xc1, 0x0, 0xe2, 0x0, 0xff,
+                                                    0x1, 0xb, 0x1, 0x1d, 0x1, 0x25, 0x1, 0x33,
+                                                    0x1, 0x4e, 0x1, 0x55, 0x1, 0x68, 0x1, 0x7a,
+                                                    0x1, 0x7f, 0x1, 0x90, 0x1, 0x94, 0x1, 0x9d,
+                                                    0x1, 0xa9, 0x1, 0xb9, 0x1, 0xc6, 0x1, 0xfb,
+                                                    0x2, 0x14, 0x2, 0x1a, 0x2, 0x34, 0x2, 0x3c,
+                                                    0x2, 0x48, 0x2, 0x59, 0x2, 0x63, 0x2, 0x71,
+                                                    0x2, 0x84, 0x2, 0x89, 0x2, 0x92, 0x2, 0xac,
+                                                    0x2, 0xb6, 0x2, 0xc2, 0x2, 0xe6, 0x2, 0xf0,
+                                                    0x2, 0xfe, 0x3, 0x11, 0x3, 0x19, 0x3, 0x20,
+                                                    0x3, 0x23, 0x3, 0x2a, 0x3, 0x49, 0x3, 0x53,
+                                                    0x3, 0x71, 0x3, 0x8e, 0x3, 0x9c, 0x3, 0xa2,
+                                                    0x3, 0xa8, 0x3, 0xc0, 0x3, 0xd8, 0x3, 0xef,
+                                                    0x3, 0xf7, 0x3, 0xfe, 0x4, 0x2, 0x4, 0x17,
+                                                    0x4, 0x2a, 0x4, 0x30, 0x4, 0x44, 0x4, 0x57,
+                                                    0x4, 0x62, 0x4, 0x69, 0x4, 0x7b, 0x4, 0x87,
+                                                    0x4, 0x98, 0x4, 0xa3, 0x4, 0xb3, 0x4, 0xb9,
+                                                    0x4, 0xbf, 0x4, 0xc5, 0x4, 0xcb, 0x4, 0xd8,
+                                                    0x4, 0xe7, 0x4, 0xf1, 0x4, 0xfb, 0x5, 0xa,
+                                                    0x5, 0x19, 0x5, 0x22, 0x5, 0x28, 0x5, 0x2d,
+                                                    0x5, 0x3b, 0x5, 0x3f, 0x5, 0x4c, 0x5, 0x59,
+                                                    0x5, 0x5e, 0x5, 0x62, 0x5, 0x6e, 0x5, 0x74,
+                                                    0x5, 0x77, 0x5, 0x82, 0x5, 0x8d, 0x5, 0x94,
+                                                    0x5, 0x99, 0x5, 0x9e, 0x5, 0xa3, 0x5, 0xad,
+                                                    0x5, 0xb7, 0x5, 0xc1, 0x5, 0xcb, 0x5, 0xd3,
+                                                    0x5, 0xdc, 0x5, 0xe5, 0x5, 0xee, 0x5, 0xf7,
+                                                    0x6, 0x0, 0x6, 0x5, 0x6, 0xc, 0x6, 0x12,
+                                                    0x6, 0x18, 0x6, 0x1d, 0x6, 0x21, 0x21, 0xa,
+                                                    0x78, 0x5f, 0x6c, 0x2a, 0x1d, 0xb, 0x15, 0xb3,
+                                                    0x6, 0xf7, 0x2e, 0x22, 0x1d, 0xb, 0xec, 0x5,
+                                                    0x95, 0x91, 0x9f, 0x98, 0xa2, 0x1a, 0x8f, 0x8a,
+                                                    0xa7, 0x6b, 0x7d, 0x84, 0x8b, 0x74, 0x74, 0x1e,
+                                                    0xb, 0x36, 0x1d, 0x26, 0xa, 0x3e, 0x7a, 0xa,
+                                                    0xb, 0x70, 0x1d, 0x88, 0x7f, 0x6c, 0x7c, 0x1e,
+                                                    0x86, 0x82, 0x6c, 0x74, 0x75, 0x1b, 0x66, 0x6e,
+                                                    0xaa, 0xba, 0x1f, 0x8d, 0x7, 0xad, 0x96, 0xc3,
+                                                    0xf7, 0x2b, 0xbd, 0x1e, 0x2a, 0xa, 0xb, 0x2b,
+                                                    0x1d, 0xfb, 0x11, 0xf7, 0x3b, 0x5, 0x4d, 0x6,
+                                                    0xb, 0x37, 0x1d, 0x4e, 0xfb, 0x4d, 0xfb, 0x22,
+                                                    0xd7, 0x39, 0x2b, 0xa, 0xb, 0x2d, 0xa, 0x8a,
+                                                    0x81, 0x1d, 0x9c, 0x57, 0xa, 0x24, 0x1d, 0x40,
+                                                    0xa, 0xef, 0xfb, 0x29, 0x1e, 0xb, 0x70, 0xa,
+                                                    0xfb, 0x1f, 0x69, 0x1d, 0xf7, 0xf, 0x61, 0x1d,
+                                                    0xf7, 0x10, 0x34, 0xa, 0x32, 0x71, 0x1d, 0x3a,
+                                                    0x5e, 0xa, 0xb, 0x4c, 0x74, 0x72, 0x19, 0x79,
+                                                    0x78, 0x7a, 0x7f, 0x2e, 0xa, 0xb, 0x15, 0xad,
+                                                    0x6, 0xf7, 0xd, 0xf2, 0xf7, 0xe, 0x24, 0x5,
+                                                    0xad, 0x6, 0xb, 0x6d, 0x1b, 0x49, 0x82, 0xc9,
+                                                    0x99, 0x1f, 0xf7, 0xda, 0xfb, 0x26, 0x7d, 0x7,
+                                                    0xa9, 0x89, 0xab, 0x7f, 0x4f, 0x1a, 0xfb, 0x86,
+                                                    0x7, 0x21, 0xd9, 0x73, 0xb4, 0xb, 0x2e, 0x1d,
+                                                    0x9e, 0xfb, 0x7c, 0x50, 0x1d, 0xb, 0x15, 0xd7,
+                                                    0x86, 0x99, 0x76, 0x41, 0x1a, 0xfb, 0xc2, 0x7,
+                                                    0x4f, 0x8b, 0xfb, 0x57, 0xf7, 0x8c, 0xf7, 0x97,
+                                                    0x8b, 0xf7, 0x50, 0xdb, 0x1e, 0xf7, 0x8f, 0x7,
+                                                    0xf4, 0x9c, 0xa4, 0xd8, 0x93, 0x1e, 0xb, 0xa8,
+                                                    0xf7, 0x78, 0x15, 0xfb, 0x1b, 0xe5, 0x24, 0x65,
+                                                    0x1d, 0xf7, 0x1f, 0xee, 0xf7, 0x25, 0x2d, 0xe2,
+                                                    0xfb, 0x17, 0xfb, 0x1a, 0x39, 0xfb, 0x1, 0xfb,
+                                                    0xf, 0x1e, 0xe5, 0xb, 0x5b, 0xa, 0xf7, 0x6a,
+                                                    0x77, 0x85, 0xa, 0xf7, 0xe6, 0x29, 0x1d, 0xb,
+                                                    0x9b, 0x16, 0xf7, 0x81, 0x9a, 0x6, 0x46, 0x8f,
+                                                    0x86, 0xa6, 0xcd, 0x1a, 0xf7, 0xed, 0x7, 0x87,
+                                                    0x8e, 0xb, 0x2d, 0x1d, 0x4f, 0x3f, 0xfb, 0x13,
+                                                    0x49, 0x1d, 0xa0, 0x1e, 0xf7, 0x1b, 0x4e, 0xa,
+                                                    0x6, 0x88, 0xf7, 0x23, 0x5, 0xfc, 0xa7, 0xb,
+                                                    0x8c, 0xa, 0x86, 0x83, 0x70, 0x75, 0x1e, 0x7f,
+                                                    0x7c, 0x70, 0x7e, 0x75, 0x1b, 0x66, 0x6e, 0xaa,
+                                                    0xba, 0xaf, 0x96, 0xc3, 0xf7, 0x2b, 0xbd, 0x1f,
+                                                    0x4d, 0xa, 0xb, 0x7d, 0x1d, 0xa1, 0xa1, 0x3d,
+                                                    0xa, 0xb, 0x39, 0x1d, 0x8b, 0xdc, 0x1f, 0xf7,
+                                                    0x65, 0x7, 0xf7, 0x24, 0x89, 0xde, 0x8a, 0xa4,
+                                                    0x7d, 0x97, 0x3b, 0x19, 0xb, 0xe9, 0xf7, 0x9f,
+                                                    0x15, 0xf7, 0xcb, 0x6, 0xf7, 0x17, 0x80, 0x44,
+                                                    0xc9, 0x2d, 0x1b, 0x3b, 0xfb, 0x10, 0xb, 0x8d,
+                                                    0x1b, 0x39, 0xa, 0xb, 0xb8, 0xf7, 0x3d, 0x5,
+                                                    0x6f, 0x6, 0x26, 0x5f, 0x59, 0x6d, 0xfb, 0x11,
+                                                    0x1b, 0xfb, 0x29, 0x8b, 0xb, 0x3b, 0x1d, 0xa2,
+                                                    0xb, 0x15, 0xb3, 0x6, 0xfb, 0x27, 0xf7, 0x28,
+                                                    0x5, 0xb, 0xaa, 0xb1, 0x37, 0xa, 0xbf, 0x89,
+                                                    0xa, 0xbd, 0xac, 0xb0, 0x1e, 0xb, 0x8e, 0xab,
+                                                    0x15, 0xe3, 0x9b, 0xb2, 0xb0, 0xc2, 0x1b, 0xda,
+                                                    0x95, 0x3e, 0x5b, 0x92, 0x1f, 0xb, 0xfb, 0x8,
+                                                    0x5c, 0x44, 0x57, 0x1d, 0x1f, 0x94, 0x86, 0x9a,
+                                                    0x9a, 0x1a, 0xb, 0x3, 0x94, 0x16, 0xf8, 0xc8,
+                                                    0x6, 0xa3, 0xf7, 0x44, 0x5, 0x74, 0x6, 0x42,
+                                                    0x75, 0x6e, 0x4a, 0xfb, 0x17, 0x1b, 0xfb, 0x8b,
+                                                    0x6, 0xf8, 0x44, 0xf8, 0xf5, 0x5, 0x9a, 0xfc,
+                                                    0xa2, 0x7, 0x77, 0xfb, 0x3f, 0x5, 0xa5, 0x6,
+                                                    0xce, 0x98, 0xa1, 0xcd, 0xf7, 0x23, 0x1b, 0xf7,
+                                                    0x67, 0x6, 0xfc, 0x49, 0xfc, 0xf5, 0x5, 0xb,
+                                                    0xf7, 0xb3, 0xf7, 0x9, 0x15, 0x3b, 0xa, 0xf7,
+                                                    0x6, 0xfb, 0x80, 0x18, 0x99, 0x6c, 0xbb, 0x2f,
+                                                    0x7c, 0x1a, 0x7b, 0x63, 0xfb, 0x1e, 0x57, 0x1e,
+                                                    0xb, 0xa7, 0xa7, 0x76, 0x55, 0x1d, 0xb, 0x15,
+                                                    0x6d, 0xb9, 0xf7, 0x2c, 0xfb, 0x38, 0x98, 0x1b,
+                                                    0x91, 0x90, 0x8f, 0x92, 0x98, 0x6f, 0xb3, 0x79,
+                                                    0xa3, 0x1f, 0x75, 0xa9, 0x64, 0xb7, 0x75, 0xa9,
+                                                    0xb, 0x65, 0xad, 0x4d, 0x1d, 0x72, 0x99, 0xa,
+                                                    0xb, 0xfb, 0x7a, 0x1e, 0xf7, 0x6, 0x8c, 0x15,
+                                                    0xf7, 0x78, 0xf7, 0x3, 0xb, 0x7a, 0xae, 0x1f,
+                                                    0x7d, 0xa8, 0xa0, 0x7c, 0x52, 0x1d, 0x63, 0x7a,
+                                                    0x7d, 0x81, 0x70, 0x1b, 0x7c, 0xb, 0x3c, 0xa,
+                                                    0xae, 0x7e, 0xa5, 0x92, 0x91, 0x88, 0x1d, 0xb,
+                                                    0xfc, 0x2a, 0x35, 0xa, 0xfb, 0x87, 0x7, 0x6e,
+                                                    0x73, 0x7c, 0x6e, 0x89, 0x1e, 0xb, 0x51, 0xa,
+                                                    0x6a, 0x98, 0x71, 0x84, 0x83, 0x87, 0x8a, 0x88,
+                                                    0x1e, 0x8a, 0x87, 0x88, 0x8a, 0x89, 0x64, 0xa,
+                                                    0xb, 0x47, 0xa, 0x88, 0xa, 0xe, 0x15, 0x43,
+                                                    0xa, 0xf7, 0x5c, 0x16, 0x43, 0xa, 0xe, 0x9e,
+                                                    0xfb, 0x6f, 0x78, 0x7, 0xaa, 0xb1, 0x89, 0x75,
+                                                    0x1d, 0xfb, 0x76, 0xfb, 0x28, 0xf7, 0x72, 0x75,
+                                                    0xa, 0x8c, 0xb9, 0x8d, 0x1e, 0x9e, 0xfb, 0xac,
+                                                    0xb, 0x1, 0xa8, 0xe5, 0xf7, 0x99, 0xe5, 0x3,
+                                                    0x2f, 0x1d, 0xb, 0x7b, 0xa0, 0xa0, 0xae, 0x9c,
+                                                    0xb0, 0xaa, 0x71, 0xa5, 0x6d, 0x6d, 0xb, 0xb1,
+                                                    0xa5, 0xa1, 0xa5, 0xab, 0x1a, 0xa8, 0x6f, 0xbf,
+                                                    0x37, 0x5f, 0x55, 0x75, 0x42, 0x69, 0x1e, 0xa4,
+                                                    0x79, 0x5, 0xa4, 0x9d, 0x9f, 0xab, 0xbb, 0x1b,
+                                                    0xb5, 0x9a, 0x73, 0x71, 0x65, 0x5c, 0x72, 0x50,
+                                                    0x79, 0x1f, 0xe, 0xe2, 0x81, 0xc5, 0xf7, 0x95,
+                                                    0xf7, 0x2f, 0x73, 0xa3, 0xb, 0x78, 0x7, 0xd1,
+                                                    0x87, 0xa3, 0x70, 0x20, 0x1a, 0xfb, 0x98, 0x7,
+                                                    0xfb, 0x1f, 0xb, 0x7e, 0x1b, 0x85, 0x86, 0x87,
+                                                    0x84, 0x7e, 0xa7, 0x63, 0x9d, 0x73, 0x1f, 0xa1,
+                                                    0x6d, 0xb2, 0x5f, 0xa1, 0x6d, 0xb, 0xaa, 0x1b,
+                                                    0xd9, 0x9d, 0xd3, 0x65, 0xa, 0xb, 0x8d, 0x99,
+                                                    0x1b, 0x9b, 0x9e, 0x8a, 0xb, 0x33, 0xa, 0xe,
+                                                    0xa1, 0x6f, 0x6f, 0x76, 0x62, 0x1d, 0xb, 0x6,
+                                                    0xf7, 0xa1, 0xf8, 0x29, 0x5, 0x9a, 0xfb, 0xef,
+                                                    0x7, 0x88, 0xfb, 0xa, 0x5, 0x9d, 0x6, 0xc1,
+                                                    0x92, 0x99, 0xad, 0xd4, 0x1b, 0xf7, 0x14, 0x6,
+                                                    0xfb, 0x9e, 0xfc, 0x29, 0x5, 0xb, 0x63, 0x7b,
+                                                    0x97, 0x6f, 0xaa, 0xa5, 0x9e, 0xa1, 0xa0, 0xb,
+                                                    0xf7, 0x1, 0x3, 0x9b, 0x16, 0xf7, 0xb0, 0x6,
+                                                    0xf7, 0xc6, 0xda, 0xf7, 0x58, 0xf7, 0x19, 0xf7,
+                                                    0x74, 0xfb, 0x33, 0xf7, 0x1, 0xfb, 0x84, 0x1f,
+                                                    0xfb, 0xa2, 0x78, 0x6, 0xd8, 0xb, 0x5, 0x76,
+                                                    0x6, 0x6a, 0x83, 0x60, 0x8b, 0x86, 0x75, 0x54,
+                                                    0xac, 0x32, 0x1b, 0xfb, 0x40, 0xfb, 0x3c, 0xfb,
+                                                    0xd, 0xfb, 0x74, 0xfb, 0x8d, 0xf7, 0x41, 0x2b,
+                                                    0xf7, 0x35, 0xb, 0x7b, 0xa, 0xf7, 0x17, 0x77,
+                                                    0xdd, 0x77, 0xf7, 0x8, 0xb4, 0xf7, 0x94, 0xb1,
+                                                    0xb, 0x80, 0x1d, 0xf7, 0x6c, 0xb4, 0xb, 0x5b,
+                                                    0x1d, 0xf8, 0x35, 0x77, 0xb, 0xf1, 0x3, 0x97,
+                                                    0x16, 0xf8, 0xae, 0x6, 0xbb, 0xf7, 0x42, 0x5,
+                                                    0x72, 0x6, 0xfb, 0x17, 0x52, 0x4b, 0x87, 0xfb,
+                                                    0x2a, 0x1b, 0x38, 0x79, 0xb, 0x78, 0x7, 0xb8,
+                                                    0x87, 0x9a, 0x88, 0xf1, 0xfb, 0x2a, 0xf7, 0x17,
+                                                    0xfb, 0x54, 0x18, 0xfb, 0x38, 0x7, 0x3f, 0x88,
+                                                    0x6a, 0x29, 0x89, 0x1e, 0xb, 0x6b, 0xac, 0xa7,
+                                                    0x80, 0xb3, 0x1b, 0xf7, 0x1f, 0xd2, 0xf7, 0x20,
+                                                    0xf7, 0x7, 0xf7, 0x19, 0x3f, 0xdd, 0x32, 0x3e,
+                                                    0x5d, 0x5a, 0x6f, 0xb, 0x9f, 0xd9, 0x1a, 0xf8,
+                                                    0x3c, 0x7, 0xdb, 0xb, 0xf7, 0x69, 0xf7, 0x7a,
+                                                    0xfb, 0x37, 0xb, 0x75, 0x6f, 0x1e, 0xb, 0x7d,
+                                                    0x94, 0x5, 0x58, 0x69, 0x66, 0x60, 0x43, 0x1b,
+                                                    0x37, 0x46, 0xd7, 0xf7, 0x7, 0xf7, 0x27, 0xe7,
+                                                    0xaa, 0xb0, 0xc0, 0xb, 0x15, 0x6f, 0xa2, 0x74,
+                                                    0xa7, 0xa7, 0xa2, 0xa2, 0xa7, 0xa7, 0x74, 0xa2,
+                                                    0x6f, 0x6f, 0x74, 0x74, 0x6f, 0x1e, 0xe, 0xf7,
+                                                    0x15, 0xf7, 0x2c, 0xd1, 0xb, 0x7, 0x89, 0xa3,
+                                                    0x9e, 0x8a, 0xa3, 0x1b, 0xf4, 0xcb, 0x9d, 0xb4,
+                                                    0xb6, 0x1f, 0x9c, 0x9b, 0xb7, 0xb4, 0xd9, 0x1a,
+                                                    0xb, 0x7, 0xd2, 0x97, 0xa2, 0xd7, 0x91, 0x1e,
+                                                    0x9e, 0xfb, 0xaa, 0x78, 0x7, 0xd5, 0x85, 0x99,
+                                                    0x77, 0x41, 0x1a, 0xb, 0x15, 0xbc, 0x6, 0xf8,
+                                                    0x56, 0xf9, 0x46, 0x5, 0x5d, 0x6, 0xb, 0xf7,
+                                                    0x49, 0xf7, 0x49, 0xf7, 0x26, 0xb, 0x70, 0xa1,
+                                                    0x75, 0xa6, 0xa6, 0xa2, 0xa1, 0xa6, 0xa6, 0x74,
+                                                    0xa2, 0x70, 0x70, 0x75, 0x74, 0x70, 0x1e, 0xb,
+                                                    0x5b, 0x7a, 0x5a, 0x7d, 0x5b, 0x6f, 0x1d, 0x91,
+                                                    0x95, 0x82, 0xa, 0xb, 0x6f, 0xa1, 0x7d, 0x1d,
+                                                    0xa2, 0xa1, 0xa7, 0xa7, 0x74, 0xa2, 0x6f, 0x6f,
+                                                    0x75, 0x74, 0x6f, 0x1e, 0xb, 0x6f, 0xa0, 0x76,
+                                                    0x9a, 0x1d, 0x95, 0x1d, 0x74, 0x6f, 0x1e, 0xb,
+                                                    0x6f, 0xa1, 0x7d, 0x1d, 0x9f, 0xa1, 0xa7, 0xa7,
+                                                    0x77, 0xa1, 0x6f, 0x6f, 0x75, 0x62, 0x1d, 0xb,
+                                                    0x7e, 0x19, 0x7b, 0x7, 0x8c, 0xb, 0x15, 0xfb,
+                                                    0x1b, 0x7, 0x6d, 0xb, 0xfb, 0x78, 0xfb, 0x70,
+                                                    0x25, 0xb, 0xfb, 0x3, 0xfb, 0x3, 0x25, 0xb,
+                                                    0xa4, 0x9c, 0xcf, 0x8f, 0x1e, 0x9e, 0xfb, 0xae,
+                                                    0x78, 0x7, 0x60, 0xa, 0xb, 0xfb, 0x23, 0xfb,
+                                                    0x2c, 0xfb, 0x1a, 0x8b, 0x66, 0x76, 0x77, 0x8c,
+                                                    0x8d, 0x78, 0x1e, 0xe, 0x6c, 0x7d, 0x84, 0x7f,
+                                                    0x84, 0x80, 0x1f, 0xfb, 0x23, 0xb, 0x81, 0xc7,
+                                                    0xf8, 0x24, 0x77, 0xf7, 0x8c, 0x90, 0xa, 0xb,
+                                                    0x6d, 0x6c, 0x43, 0x44, 0xfb, 0xf, 0x1b, 0xfb,
+                                                    0x12, 0xfb, 0xb, 0xe2, 0xf7, 0x68, 0xb, 0xbc,
+                                                    0xac, 0x69, 0xb7, 0x1b, 0xa6, 0x9e, 0x9c, 0xa5,
+                                                    0xa5, 0x78, 0x9c, 0x70, 0x1f, 0xb, 0xc2, 0xb8,
+                                                    0xb7, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0xb, 0x76,
+                                                    0xf9, 0x46, 0x77, 0x1, 0xb, 0x1, 0xad, 0xf7,
+                                                    0x6, 0xb, 0x8f, 0x78, 0x1b, 0x2a, 0x60, 0x49,
+                                                    0x53, 0x41, 0xc2, 0x66, 0xc9, 0x68, 0x1f, 0xb,
+                                                    0x75, 0xa7, 0xa7, 0xb, 0x7, 0xf7, 0x28, 0xf7,
+                                                    0x76, 0xd0, 0xf5, 0xac, 0x8f, 0xaf, 0x8f, 0x19,
+                                                    0xb, 0xb6, 0x1b, 0xbd, 0xa1, 0x5c, 0x6d, 0x6d,
+                                                    0x6c, 0x59, 0x59, 0x53, 0x1f, 0xb, 0xf8, 0x1,
+                                                    0xa0, 0x76, 0xb, 0x6e, 0x89, 0x76, 0xb, 0x66,
+                                                    0x88, 0x1e, 0x7c, 0xf7, 0x64, 0x9a, 0x7, 0x5a,
+                                                    0x8f, 0x7f, 0xb, 0x15, 0xa8, 0x6, 0x9c, 0x91,
+                                                    0xb, 0x87, 0x1e, 0xe, 0xbb, 0xf7, 0xca, 0xc3,
+                                                    0x12, 0xf7, 0x51, 0xd7, 0x54, 0xdc, 0xb, 0xf7,
+                                                    0x69, 0x5, 0x76, 0x6, 0x80, 0x89, 0x7c, 0x74,
+                                                    0x6f, 0xb, 0xe2, 0x81, 0xd0, 0xf7, 0x64, 0xab,
+                                                    0xb, 0x8f, 0x8c, 0x8e, 0x1e, 0xb, 0x1a, 0xfc,
+                                                    0x3c, 0x7, 0xb, 0x76, 0xf9, 0x2a, 0x77, 0xb,
+                                                    0x2e, 0x6f, 0x1e, 0xa4, 0x7d, 0x5, 0xb2, 0x9b,
+                                                    0xa7, 0xb, 0xf7, 0x63, 0x98, 0x76, 0xf8, 0x9e,
+                                                    0x77, 0x1, 0xa7, 0xb, 0xb6, 0x28, 0xee, 0xef,
+                                                    0xb6, 0xee, 0xd9, 0xda, 0x60, 0xb, 0xfb, 0x58,
+                                                    0x76, 0xf7, 0x63, 0xab, 0xf8, 0xe, 0xc7, 0xb,
+                                                    0x85, 0x1a, 0x84, 0x8e, 0x87, 0x93, 0x1e, 0xe,
+                                                    0x73, 0xfb, 0x30, 0x76, 0xf9, 0xe9, 0x77, 0x1,
+                                                    0xb, 0x73, 0xf8, 0x5a, 0x76, 0xf7, 0x87, 0x77,
+                                                    0x1, 0xb, 0x73, 0xf8, 0xa4, 0x76, 0xf7, 0x3f,
+                                                    0x77, 0x1, 0xb, 0x73, 0xfb, 0x30, 0xa4, 0xf9,
+                                                    0x94, 0xa4, 0x1, 0xb, 0xa8, 0x73, 0xa3, 0x6e,
+                                                    0x6e, 0x74, 0x73, 0x6e, 0xb, 0xa1, 0x3d, 0xa,
+                                                    0x77, 0xb, 0x1a, 0x92, 0x88, 0x8f, 0x83, 0x1e,
+                                                    0xe, 0xf7, 0x1f, 0xe8, 0xf7, 0x1f, 0xb, 0xfb,
+                                                    0x13, 0xfb, 0x42, 0x8b, 0xb, 0xf7, 0x5b, 0xa0,
+                                                    0x76, 0xb, 0xa7, 0xa7, 0xa0, 0xb, 0x1, 0x0,
+                                                    0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37,
+                                                    0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67,
+                                                    0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,
+                                                    0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,
+                                                    0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,
+                                                    0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,
+                                                    0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,
+                                                    0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,
+                                                    0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,
+                                                    0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,
+                                                    0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,
+                                                    0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,
+                                                    0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,
+                                                    0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,
+                                                    0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,
+                                                    0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,
+                                                    0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,
+                                                    0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,
+                                                    0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,
+                                                    0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,
+                                                    0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,
+                                                    0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0,
+                                                    0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90,
+                                                    0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0,
+                                                    0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2,
+                                                    0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb,
+                                                    0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0,
+                                                    0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0,
+                                                    0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2,
+                                                    0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0,
+                                                    0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0,
+                                                    0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0,
+                                                    0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0,
+                                                    0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0,
+                                                    0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84,
+                                                    0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0,
+                                                    0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0,
+                                                    0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75,
+                                                    0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0,
+                                                    0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0,
+                                                    0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63,
+                                                    0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0,
+                                                    0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2,
+                                                    0x0, 0x1, 0x0, 0x3, 0x0, 0x5, 0x0, 0x47,
+                                                    0x0, 0x61, 0x0, 0xcc, 0x1, 0x51, 0x1, 0xe0,
+                                                    0x2, 0x97, 0x2, 0xaa, 0x2, 0xdd, 0x3, 0x14,
+                                                    0x3, 0xb8, 0x3, 0xdd, 0x4, 0x0, 0x4, 0x10,
+                                                    0x4, 0x1f, 0x4, 0x34, 0x4, 0x7e, 0x4, 0xb4,
+                                                    0x5, 0x3, 0x5, 0x71, 0x5, 0xa1, 0x6, 0x12,
+                                                    0x6, 0x72, 0x6, 0x9b, 0x7, 0x10, 0x7, 0x7d,
+                                                    0x7, 0x98, 0x7, 0xf6, 0x8, 0x1a, 0x8, 0x3e,
+                                                    0x8, 0x5d, 0x8, 0xc5, 0x9, 0x7e, 0x9, 0xc2,
+                                                    0xa, 0x4a, 0xa, 0x7e, 0xa, 0xb5, 0xa, 0xfc,
+                                                    0xb, 0x54, 0xb, 0xc1, 0xc, 0x9, 0xc, 0x11,
+                                                    0xc, 0x5f, 0xc, 0xd3, 0xc, 0xf4, 0xd, 0x4c,
+                                                    0xd, 0x67, 0xd, 0x8f, 0xd, 0xc6, 0xe, 0x30,
+                                                    0xe, 0xa4, 0xe, 0xfe, 0xf, 0x44, 0xf, 0x58,
+                                                    0xf, 0xa3, 0x10, 0x30, 0x10, 0xb0, 0x10, 0xfa,
+                                                    0x11, 0x6, 0x11, 0x27, 0x11, 0x3e, 0x11, 0x60,
+                                                    0x11, 0x7f, 0x11, 0x8f, 0x11, 0xab, 0x12, 0x4,
+                                                    0x12, 0x54, 0x12, 0x94, 0x13, 0x3, 0x13, 0x1c,
+                                                    0x13, 0x6b, 0x14, 0x1a, 0x14, 0x87, 0x14, 0xbb,
+                                                    0x15, 0xd, 0x15, 0x90, 0x15, 0xb2, 0x16, 0x4c,
+                                                    0x16, 0x6a, 0x16, 0xa7, 0x16, 0xeb, 0x17, 0x55,
+                                                    0x17, 0xb0, 0x18, 0x17, 0x18, 0x5f, 0x18, 0x85,
+                                                    0x18, 0xdb, 0x19, 0x6e, 0x19, 0xf4, 0x1a, 0x17,
+                                                    0x1a, 0x28, 0x1a, 0x79, 0x1a, 0x91, 0x1a, 0xdc,
+                                                    0x1b, 0x1c, 0x1b, 0x5e, 0x1b, 0xe1, 0x1c, 0x8e,
+                                                    0x1d, 0x10, 0x1d, 0x94, 0x1d, 0xae, 0x1e, 0x5f,
+                                                    0x1e, 0x75, 0x1e, 0xce, 0x1f, 0x44, 0x1f, 0x5e,
+                                                    0x1f, 0x81, 0x1f, 0xf9, 0x20, 0x9, 0x20, 0x40,
+                                                    0x20, 0x7b, 0x20, 0x99, 0x20, 0xb6, 0x20, 0xbd,
+                                                    0x21, 0x2f, 0x21, 0x5e, 0x21, 0x71, 0x21, 0xb4,
+                                                    0x21, 0xcf, 0x22, 0x8, 0x22, 0x34, 0x22, 0x59,
+                                                    0x22, 0x8c, 0x22, 0xba, 0x23, 0x20, 0x23, 0x3d,
+                                                    0x23, 0x58, 0x23, 0x6b, 0x23, 0xb7, 0x23, 0xd5,
+                                                    0x23, 0xff, 0x24, 0xb1, 0x25, 0xe, 0x25, 0x27,
+                                                    0x25, 0x3c, 0x25, 0x4f, 0x25, 0x83, 0x25, 0x96,
+                                                    0x25, 0xc1, 0x25, 0xf5, 0x26, 0x26, 0x26, 0x66,
+                                                    0x26, 0x99, 0x26, 0xa1, 0x26, 0xa9, 0x26, 0xbb,
+                                                    0x26, 0xf3, 0x27, 0x23, 0x27, 0x5b, 0x27, 0xd6,
+                                                    0x28, 0x32, 0x28, 0x44, 0x28, 0x5a, 0x28, 0x93,
+                                                    0x28, 0xac, 0x28, 0xf0, 0x29, 0x72, 0x29, 0xab,
+                                                    0x29, 0xf5, 0x2a, 0x6, 0x2a, 0x31, 0x2a, 0x5c,
+                                                    0x2a, 0xc0, 0x2b, 0x65, 0x2b, 0xc1, 0x2b, 0xdf,
+                                                    0x2b, 0xf6, 0x2c, 0xe, 0x2c, 0x2d, 0x2c, 0x39,
+                                                    0x2c, 0x44, 0x2c, 0x50, 0x2c, 0x6a, 0x2c, 0xda,
+                                                    0x2d, 0x29, 0x2d, 0x5a, 0x2d, 0x9b, 0x2d, 0xbd,
+                                                    0x2d, 0xfa, 0x2e, 0x2e, 0x2e, 0x60, 0x2e, 0xd8,
+                                                    0x2e, 0xec, 0x2e, 0xfa, 0x2f, 0xf, 0x2f, 0x36,
+                                                    0x2f, 0x51, 0x2f, 0x90, 0x2f, 0xae, 0x2f, 0xb5,
+                                                    0x2f, 0xe8, 0x30, 0x22, 0x30, 0xda, 0x31, 0x68,
+                                                    0x31, 0xbd, 0x32, 0x2c, 0x32, 0x68, 0x32, 0x80,
+                                                    0x32, 0x99, 0x33, 0xc, 0x33, 0x1b, 0x33, 0x23,
+                                                    0x33, 0x4a, 0x33, 0x5b, 0x33, 0x91, 0x33, 0xc3,
+                                                    0x33, 0xe9, 0x34, 0x4, 0x34, 0xd, 0x34, 0x18,
+                                                    0x34, 0x37, 0x34, 0x4e, 0x34, 0x6f, 0x34, 0x89,
+                                                    0x34, 0xa1, 0x34, 0xdc, 0x35, 0x75, 0x36, 0x33,
+                                                    0x36, 0x51, 0x36, 0x85, 0x37, 0x3a, 0x37, 0x50,
+                                                    0x37, 0x70, 0x37, 0x8b, 0x38, 0x1a, 0x38, 0xbf,
+                                                    0x38, 0xd2, 0x39, 0x5c, 0x39, 0xdd, 0x20, 0xe,
+                                                    0x20, 0xe, 0x73, 0x82, 0xf5, 0xf8, 0xd7, 0x77,
+                                                    0x1, 0xf7, 0x16, 0xf7, 0x0, 0x14, 0x20, 0xf7,
+                                                    0x44, 0xf7, 0x44, 0x15, 0x9c, 0x6, 0xa1, 0xf7,
+                                                    0x50, 0xa2, 0xf7, 0xe, 0xd8, 0x1a, 0xca, 0x82,
+                                                    0xbd, 0x5d, 0x5f, 0x82, 0x58, 0x4e, 0x3d, 0xa3,
+                                                    0xfb, 0x10, 0xa1, 0xfb, 0x4e, 0x1e, 0x5d, 0xfb,
+                                                    0x18, 0x15, 0x6e, 0xa3, 0x73, 0xa8, 0xa8, 0xa5,
+                                                    0xa2, 0xa8, 0xa8, 0x71, 0xa4, 0x6e, 0x6e, 0x73,
+                                                    0x73, 0x6e, 0x1e, 0xe, 0xbe, 0xf8, 0x58, 0x76,
+                                                    0xf7, 0x89, 0x77, 0x1, 0xd8, 0xe0, 0xdf, 0xe0,
+                                                    0x3, 0xf7, 0xaa, 0xf8, 0x43, 0x15, 0x44, 0xa,
+                                                    0xfb, 0x3d, 0x16, 0x44, 0xa, 0xe, 0xa0, 0x76,
+                                                    0xf7, 0x6d, 0xbd, 0xf7, 0x21, 0xbc, 0xf7, 0x61,
+                                                    0x77, 0x12, 0x8d, 0xf8, 0x85, 0x17, 0xde, 0x16,
+                                                    0xbf, 0x6, 0xaf, 0xf7, 0x6d, 0x5, 0xf7, 0x1b,
+                                                    0x6, 0x6b, 0xfb, 0x6d, 0x5, 0xc1, 0x6, 0xab,
+                                                    0xf7, 0x6d, 0x5, 0xf7, 0x1, 0xbd, 0x26, 0x6,
+                                                    0x9f, 0xf7, 0x21, 0x5, 0xf7, 0x3, 0xbc, 0x25,
+                                                    0x6, 0xab, 0xf7, 0x61, 0x5, 0x55, 0x6, 0x6c,
+                                                    0xfb, 0x61, 0x5, 0xfb, 0x1c, 0x6, 0xaa, 0xf7,
+                                                    0x61, 0x5, 0x54, 0x6, 0x6b, 0xfb, 0x61, 0x5,
+                                                    0xfb, 0xc, 0x5a, 0xf7, 0x7, 0x6, 0x75, 0xfb,
+                                                    0x21, 0x5, 0xfb, 0xf, 0x59, 0xf7, 0x7, 0x6,
+                                                    0x13, 0x60, 0xc8, 0xbd, 0x15, 0x9f, 0xf7, 0x21,
+                                                    0x5, 0xf7, 0x1c, 0x6, 0x78, 0xfb, 0x21, 0x5,
+                                                    0xe, 0x49, 0x76, 0xe3, 0xa7, 0xf8, 0xf4, 0xa6,
+                                                    0xca, 0x77, 0x12, 0xb7, 0x9a, 0xf7, 0x3f, 0xad,
+                                                    0xf7, 0x26, 0x9a, 0x17, 0xb7, 0xbe, 0x15, 0x7a,
+                                                    0xa6, 0xc7, 0x69, 0xee, 0x1b, 0x34, 0xad, 0xe2,
+                                                    0x7, 0xf4, 0x99, 0xe3, 0xb8, 0xf7, 0x7, 0x1a,
+                                                    0xf7, 0x0, 0x4b, 0xae, 0xfb, 0x15, 0xd5, 0x1e,
+                                                    0xf7, 0x8a, 0x7, 0xbe, 0xd5, 0x70, 0xfb, 0x2,
+                                                    0xa0, 0x1f, 0x9a, 0xf7, 0x3, 0x6, 0xb2, 0x5f,
+                                                    0x45, 0x99, 0x5c, 0x1b, 0xca, 0x69, 0x4c, 0x7,
+                                                    0xfb, 0x13, 0x58, 0x39, 0x44, 0x29, 0xe2, 0x57,
+                                                    0xe6, 0x58, 0x1f, 0xfb, 0xae, 0x7, 0x2d, 0x54,
+                                                    0xbf, 0xf0, 0x75, 0x1f, 0x7c, 0x6, 0xf7, 0x4d,
+                                                    0xf7, 0x76, 0x15, 0x13, 0x64, 0x4f, 0xb3, 0x60,
+                                                    0xab, 0xc0, 0x1a, 0xa1, 0x91, 0xde, 0xec, 0x1e,
+                                                    0xae, 0xfc, 0xf5, 0x15, 0xf7, 0x9d, 0x7, 0x13,
+                                                    0x44, 0xca, 0x64, 0xbe, 0x6b, 0x44, 0x1a, 0x25,
+                                                    0x3a, 0x7c, 0x6a, 0x85, 0x1e, 0xe, 0xf8, 0x70,
+                                                    0x7f, 0xa9, 0x6e, 0x76, 0xf7, 0xc4, 0xa9, 0x9f,
+                                                    0xa9, 0xf7, 0x91, 0xa9, 0x9c, 0x77, 0x12, 0xbc,
+                                                    0xd4, 0xf7, 0x24, 0xd3, 0xde, 0xd4, 0xf7, 0x23,
+                                                    0xd4, 0x13, 0x77, 0xc0, 0xf7, 0x34, 0x82, 0x15,
+                                                    0xa9, 0x74, 0xf8, 0x28, 0xf9, 0x29, 0x6a, 0xa2,
+                                                    0x5, 0x13, 0xbb, 0xc0, 0xfc, 0x94, 0xfb, 0x5b,
+                                                    0x15, 0x3c, 0xb6, 0x25, 0xf1, 0xf1, 0xb5, 0xf1,
+                                                    0xdb, 0xdb, 0x60, 0xf0, 0x27, 0x1e, 0x8a, 0x6,
+                                                    0x25, 0x60, 0x26, 0x3a, 0x1f, 0xd4, 0x8c, 0x15,
+                                                    0xbe, 0x96, 0xef, 0xc8, 0x1e, 0x8c, 0x6, 0xc9,
+                                                    0x94, 0x26, 0x58, 0x5b, 0x82, 0x24, 0x4d, 0x4d,
+                                                    0x80, 0xf0, 0xbe, 0x1f, 0xf7, 0xbf, 0xfb, 0xb1,
+                                                    0x15, 0x3c, 0xb6, 0x25, 0xf1, 0xf0, 0xb6, 0xf1,
+                                                    0xdb, 0xdb, 0x60, 0xf1, 0x27, 0x1e, 0x8a, 0x6,
+                                                    0x25, 0x60, 0x25, 0x3a, 0x1f, 0xd4, 0x8c, 0x15,
+                                                    0xc0, 0x96, 0xee, 0xc7, 0x1e, 0x8c, 0x6, 0xc9,
+                                                    0x94, 0x26, 0x58, 0x5a, 0x82, 0x24, 0x4e, 0x4d,
+                                                    0x80, 0xf1, 0xbd, 0x1f, 0xe, 0xf8, 0x39, 0x7e,
+                                                    0xbf, 0x57, 0xd2, 0xf8, 0x4, 0x77, 0xf7, 0x82,
+                                                    0xab, 0x12, 0xb5, 0xe7, 0xcf, 0xda, 0x8b, 0xf7,
+                                                    0x31, 0x8b, 0xc0, 0x13, 0x7f, 0xf7, 0xd5, 0xf8,
+                                                    0x34, 0x15, 0x77, 0xb4, 0x77, 0xbf, 0xbb, 0x1a,
+                                                    0xc9, 0xb0, 0xa4, 0xb4, 0xb6, 0xaf, 0x69, 0x59,
+                                                    0x38, 0x31, 0x5c, 0x70, 0x7d, 0x1e, 0xf7, 0x0,
+                                                    0xfb, 0xe6, 0x15, 0x6d, 0xa8, 0xc7, 0x4e, 0xdc,
+                                                    0x1b, 0xf5, 0xb7, 0xf7, 0x1, 0x8f, 0x8c, 0x1f,
+                                                    0x7c, 0x96, 0x5, 0x6d, 0x73, 0x77, 0x74, 0x57,
+                                                    0x1b, 0x41, 0x47, 0xdc, 0x99, 0x82, 0x1f, 0xef,
+                                                    0xf7, 0x2d, 0xaf, 0xc3, 0xbe, 0xb1, 0xaf, 0x90,
+                                                    0x19, 0xa0, 0xfb, 0x6c, 0x76, 0x7, 0xb0, 0x88,
+                                                    0xa6, 0x7c, 0x65, 0x1a, 0x55, 0x4d, 0x3c, 0x6e,
+                                                    0x65, 0x1e, 0x58, 0xc9, 0x5e, 0xd3, 0x67, 0xd3,
+                                                    0x8, 0xcb, 0xa9, 0xe6, 0xb7, 0xed, 0x1a, 0xd7,
+                                                    0x4c, 0xb7, 0x42, 0x26, 0x57, 0x36, 0x43, 0x5b,
+                                                    0x98, 0x6a, 0xa1, 0x4e, 0x1e, 0x23, 0x4f, 0x30,
+                                                    0x46, 0x23, 0x1a, 0xfb, 0x17, 0xf3, 0x71, 0xc8,
+                                                    0xf7, 0xb, 0xca, 0xc3, 0xae, 0xb3, 0x1e, 0x72,
+                                                    0xa5, 0x15, 0x13, 0xbf, 0x51, 0x46, 0x5a, 0x84,
+                                                    0x74, 0x1b, 0x44, 0x51, 0xcb, 0xd8, 0xe3, 0xd4,
+                                                    0xb9, 0xb8, 0xa8, 0x1f, 0xb5, 0x3b, 0xbf, 0x32,
+                                                    0xc5, 0x45, 0x8, 0xe, 0xfb, 0x45, 0xf8, 0x58,
+                                                    0x76, 0xf7, 0x89, 0x77, 0x1, 0xbb, 0xe0, 0x3,
+                                                    0xe5, 0xf8, 0x43, 0x15, 0x44, 0xa, 0xe, 0x90,
+                                                    0x1d, 0xbb, 0xdc, 0x3, 0xf7, 0xbb, 0xfb, 0x45,
+                                                    0x15, 0x97, 0x9b, 0x5, 0xfb, 0x24, 0xf7, 0x3,
+                                                    0x69, 0xf7, 0x66, 0xf1, 0x1a, 0xf7, 0x92, 0xf0,
+                                                    0xe0, 0xd5, 0xc6, 0x1e, 0x82, 0x9b, 0x5, 0xfb,
+                                                    0x2f, 0x2f, 0x2f, 0xfb, 0x2a, 0xfb, 0x40, 0x1a,
+                                                    0xfb, 0x73, 0xea, 0x27, 0xf7, 0x2c, 0xfb, 0x8,
+                                                    0x1e, 0xe, 0x90, 0x1d, 0xf7, 0x5e, 0xde, 0x3,
+                                                    0xa8, 0xfb, 0x35, 0x15, 0x94, 0x7b, 0x5, 0xf7,
+                                                    0x2f, 0xf7, 0x1, 0xe7, 0xf7, 0x19, 0xf7, 0x40,
+                                                    0x1a, 0xf7, 0x73, 0x2f, 0xf7, 0x0, 0xfb, 0x2c,
+                                                    0xf7, 0x0, 0x1e, 0x7f, 0x7b, 0x5, 0xf7, 0x3e,
+                                                    0xfb, 0xd, 0x8e, 0xfb, 0x5e, 0x25, 0x1a, 0xfb,
+                                                    0x71, 0xfb, 0x27, 0xfb, 0x31, 0x71, 0x79, 0x1e,
+                                                    0xe, 0xf8, 0x65, 0x90, 0x8b, 0xf7, 0xf, 0xfb,
+                                                    0x8, 0x76, 0xa9, 0x77, 0xb7, 0xf7, 0x13, 0x12,
+                                                    0xf7, 0x73, 0xa9, 0x13, 0x2c, 0xf7, 0x84, 0xf8,
+                                                    0x5c, 0x15, 0x8c, 0x84, 0x5, 0x94, 0x4f, 0x67,
+                                                    0x55, 0x6c, 0x1a, 0x72, 0x9d, 0x7d, 0x9c, 0xa4,
+                                                    0x99, 0xa2, 0x9e, 0x1e, 0xa9, 0x6f, 0x98, 0xee,
+                                                    0x1a, 0x92, 0x7, 0x92, 0x88, 0x5, 0x71, 0xc9,
+                                                    0xa2, 0x3e, 0xb7, 0x1b, 0x9e, 0x9c, 0x97, 0xa3,
+                                                    0x1f, 0x13, 0xc4, 0xc6, 0x40, 0x6c, 0x3a, 0xbe,
+                                                    0x1e, 0x83, 0x90, 0x5, 0xf2, 0xcc, 0xc7, 0x61,
+                                                    0xcb, 0x1a, 0xa7, 0x73, 0x93, 0x7f, 0x66, 0x71,
+                                                    0x47, 0x66, 0x4a, 0x1e, 0x84, 0x87, 0x5, 0x13,
+                                                    0x1c, 0xa5, 0x7, 0xbf, 0xa6, 0xbb, 0xa6, 0x1a,
+                                                    0x98, 0x83, 0xa5, 0x71, 0x84, 0x6d, 0x8b, 0x64,
+                                                    0x1e, 0x5f, 0xa4, 0x7e, 0x3a, 0x1a, 0x7e, 0x7,
+                                                    0xbe, 0x2c, 0x8c, 0xc1, 0x5e, 0x1b, 0x70, 0x85,
+                                                    0x70, 0x84, 0x51, 0xe1, 0xa1, 0xcf, 0x60, 0x1f,
+                                                    0x96, 0x84, 0x5, 0x37, 0x51, 0x3a, 0xac, 0x4c,
+                                                    0x1a, 0x80, 0x93, 0x76, 0xa5, 0xa2, 0x90, 0x91,
+                                                    0xb0, 0xac, 0x1e, 0x13, 0x2c, 0xa4, 0xa7, 0x8b,
+                                                    0x8b, 0xbe, 0xad, 0x8, 0xe, 0xf7, 0x63, 0xa0,
+                                                    0x76, 0xf7, 0x89, 0xb3, 0x1, 0xf7, 0x9a, 0xb5,
+                                                    0x3, 0xa9, 0xf7, 0x7c, 0x15, 0xf7, 0x7c, 0xfb,
+                                                    0x7c, 0xb5, 0xf7, 0x7c, 0xf7, 0x7a, 0xb3, 0xfb,
+                                                    0x7a, 0xf7, 0x7e, 0x61, 0xfb, 0x7e, 0xfb, 0x7c,
+                                                    0x6, 0xe, 0x20, 0x7f, 0xf7, 0x6, 0x38, 0x76,
+                                                    0x12, 0x13, 0x80, 0xd5, 0xfb, 0xe, 0x15, 0x94,
+                                                    0x78, 0x5, 0x3f, 0xa, 0x79, 0x60, 0x5f, 0xb3,
+                                                    0x78, 0xaa, 0x95, 0x1e, 0x13, 0x40, 0x8c, 0x8f,
+                                                    0x94, 0x94, 0x38, 0x1d, 0xe, 0x73, 0xf7, 0x56,
+                                                    0xca, 0x1, 0xb2, 0xf7, 0x56, 0x15, 0xf7, 0x8a,
+                                                    0xca, 0xfb, 0x8a, 0x6, 0xe, 0x20, 0x80, 0xf7,
+                                                    0x3, 0x1, 0xd1, 0xf7, 0x3, 0x3, 0xd1, 0xb6,
+                                                    0x15, 0x43, 0x1d, 0xe, 0x3c, 0x92, 0x7a, 0x1d,
+                                                    0x83, 0xf7, 0xbb, 0x3, 0x83, 0x7d, 0x15, 0xb3,
+                                                    0x6, 0xf7, 0x93, 0xf9, 0x46, 0x5, 0x66, 0x6,
+                                                    0xe, 0x7d, 0xa5, 0xf9, 0x12, 0xa5, 0x1, 0xa3,
+                                                    0xeb, 0xf7, 0x98, 0xeb, 0x3, 0xf7, 0xc, 0xf7,
+                                                    0xdf, 0x15, 0xcf, 0x8d, 0xf7, 0x8f, 0xf7, 0x14,
+                                                    0xf7, 0x14, 0x8d, 0xfb, 0x8f, 0x47, 0x3c, 0x89,
+                                                    0xfb, 0x84, 0xfb, 0x14, 0xfb, 0x14, 0x89, 0xf7,
+                                                    0x82, 0xdc, 0x1e, 0x2b, 0x16, 0xfb, 0xd, 0xb5,
+                                                    0xfb, 0x74, 0xf7, 0x4c, 0xf7, 0x4c, 0xb5, 0xf7,
+                                                    0x74, 0xf7, 0xd, 0xf7, 0xa, 0x61, 0xf7, 0x77,
+                                                    0xfb, 0x4c, 0xfb, 0x4c, 0x61, 0xfb, 0x77, 0xfb,
+                                                    0xa, 0x1e, 0xe, 0xa0, 0x76, 0xf9, 0x38, 0x77,
+                                                    0x1, 0xf7, 0x69, 0xe1, 0x3, 0xf7, 0x3, 0x16,
+                                                    0xf7, 0xaf, 0x9a, 0x6, 0x40, 0x77, 0x99, 0xd6,
+                                                    0x1f, 0xf8, 0xce, 0x7, 0x83, 0x8d, 0xfb, 0x48,
+                                                    0x30, 0x5, 0x7d, 0x7, 0xa1, 0xc3, 0x8b, 0x8b,
+                                                    0x97, 0x1b, 0xad, 0x8b, 0x71, 0x76, 0x1f, 0xfc,
+                                                    0x4f, 0x7, 0x41, 0x5f, 0x7f, 0x51, 0x89, 0x1e,
+                                                    0xe, 0x8b, 0xd7, 0xf8, 0xa2, 0xd5, 0x1, 0xf7,
+                                                    0xe6, 0xe1, 0x3, 0xa9, 0x16, 0xf8, 0x1a, 0x6,
+                                                    0xc2, 0xf7, 0x1d, 0x7e, 0x90, 0x5, 0x4c, 0x64,
+                                                    0x6c, 0x88, 0x66, 0x1b, 0xfb, 0x77, 0x6, 0xf7,
+                                                    0x3c, 0xf7, 0x44, 0x5, 0xb7, 0xba, 0xdf, 0xe6,
+                                                    0xf5, 0x1a, 0xf7, 0x4, 0x31, 0xcf, 0x30, 0x33,
+                                                    0x2c, 0x5b, 0xfb, 0x2b, 0x6d, 0x1e, 0xa1, 0x86,
+                                                    0x5, 0xc1, 0xa1, 0xa9, 0xd7, 0xe6, 0x1b, 0xf7,
+                                                    0xa, 0xa4, 0x2f, 0x58, 0x40, 0x60, 0x31, 0x34,
+                                                    0x2e, 0x1f, 0xfb, 0x46, 0xfb, 0x51, 0x5, 0xe,
+                                                    0x7d, 0xaf, 0xf8, 0xe6, 0xc7, 0x12, 0xf7, 0xfb,
+                                                    0xc5, 0x51, 0xd3, 0x13, 0xd0, 0xf7, 0x2d, 0xf7,
+                                                    0xdc, 0x15, 0xd0, 0x8d, 0xa4, 0x88, 0xaf, 0x78,
+                                                    0x8, 0xcb, 0x6a, 0x97, 0x2b, 0x72, 0x1a, 0x40,
+                                                    0x62, 0x52, 0x2e, 0x6e, 0x73, 0x98, 0x99, 0x75,
+                                                    0x1e, 0x99, 0x74, 0x75, 0x9a, 0x74, 0x1b, 0x7b,
+                                                    0x74, 0x84, 0x6f, 0x57, 0xe2, 0x86, 0xa3, 0xf7,
+                                                    0x31, 0xf7, 0xc, 0xcd, 0xf7, 0x22, 0xf7, 0x18,
+                                                    0x36, 0xc4, 0x61, 0x9d, 0x1f, 0x13, 0x60, 0xcd,
+                                                    0xb6, 0xba, 0xb6, 0xc1, 0x1a, 0xb4, 0x70, 0xe9,
+                                                    0xfb, 0x15, 0x48, 0xfb, 0x3, 0x6c, 0xfb, 0x17,
+                                                    0x63, 0x1e, 0x9c, 0x87, 0x5, 0xa7, 0x9a, 0xcb,
+                                                    0xd9, 0xe6, 0x1b, 0xd5, 0xad, 0x56, 0x58, 0x2f,
+                                                    0x2c, 0x63, 0x30, 0x6e, 0x1f, 0xe, 0xa0, 0x76,
+                                                    0xf7, 0x31, 0xcb, 0xf8, 0x5b, 0x77, 0x1, 0xf7,
+                                                    0xb8, 0xd9, 0x3, 0x97, 0xf7, 0x31, 0x15, 0xf7,
+                                                    0xad, 0xfb, 0x31, 0xd8, 0xf7, 0x31, 0xf1, 0xcb,
+                                                    0x25, 0xf8, 0x5b, 0x5f, 0x6, 0xfb, 0xce, 0xfc,
+                                                    0x5b, 0x5, 0xb3, 0x16, 0xf7, 0x82, 0xf7, 0xf2,
+                                                    0x5, 0x8d, 0xfb, 0xf2, 0x6, 0xe, 0x7d, 0xb0,
+                                                    0xf8, 0xcd, 0xda, 0x12, 0xf7, 0xf8, 0xd1, 0x17,
+                                                    0xf7, 0x1f, 0xf8, 0x79, 0x15, 0xb5, 0xe3, 0x5,
+                                                    0xf7, 0x4e, 0x6, 0x96, 0x9e, 0x8b, 0x94, 0x8e,
+                                                    0x1f, 0xb1, 0xda, 0x82, 0x9c, 0x5, 0x7c, 0x80,
+                                                    0x78, 0x80, 0x71, 0x1b, 0xfb, 0x61, 0x6, 0x24,
+                                                    0xfb, 0x84, 0x5, 0x84, 0x88, 0x8e, 0x85, 0x91,
+                                                    0x1b, 0xf7, 0x0, 0x87, 0xf7, 0x45, 0x69, 0xfb,
+                                                    0x34, 0x1a, 0xfb, 0xe, 0x41, 0x53, 0x4a, 0x70,
+                                                    0x76, 0x9b, 0x9b, 0x75, 0x1e, 0x13, 0xc0, 0x9a,
+                                                    0x76, 0x74, 0x9a, 0x6c, 0x1b, 0x63, 0x8b, 0x6e,
+                                                    0x81, 0x67, 0xba, 0x73, 0xda, 0x1f, 0x13, 0x60,
+                                                    0xf7, 0x32, 0xf7, 0x2, 0xf5, 0xf7, 0x19, 0xe4,
+                                                    0x80, 0x9e, 0x60, 0xbf, 0x1f, 0x13, 0x40, 0x50,
+                                                    0xd3, 0x2d, 0x99, 0x3b, 0x99, 0x8, 0xe, 0x7d,
+                                                    0xa7, 0xf7, 0xe6, 0xb8, 0xf7, 0xb2, 0x77, 0x1,
+                                                    0xbe, 0xe8, 0xf7, 0x77, 0xe5, 0x3, 0xf7, 0x2e,
+                                                    0xf8, 0xd, 0x15, 0x9e, 0xf7, 0xe, 0xf6, 0xe6,
+                                                    0xf7, 0x46, 0xa7, 0x89, 0xaf, 0x18, 0xfb, 0x86,
+                                                    0x83, 0xfb, 0x3e, 0xfb, 0x40, 0xfb, 0x5f, 0x1a,
+                                                    0xfb, 0x66, 0xf1, 0x40, 0xf7, 0xa, 0xf7, 0x46,
+                                                    0xa8, 0xf7, 0x33, 0xd4, 0xf7, 0x1a, 0x44, 0xcd,
+                                                    0x21, 0x53, 0x64, 0x86, 0x67, 0x5e, 0x1e, 0x75,
+                                                    0xfb, 0x21, 0x15, 0xc7, 0x90, 0x9e, 0x97, 0x9c,
+                                                    0x1e, 0xa7, 0x9f, 0xbc, 0x97, 0xad, 0x1b, 0xf5,
+                                                    0xa2, 0x31, 0x24, 0xfb, 0x5, 0x64, 0x57, 0x4c,
+                                                    0x40, 0x43, 0xc1, 0xf7, 0x3c, 0x1f, 0xe, 0x98,
+                                                    0x76, 0xf8, 0xe8, 0xd5, 0x1, 0x9f, 0xf8, 0x41,
+                                                    0x3, 0xf7, 0x40, 0x83, 0x15, 0xcc, 0x6, 0xf7,
+                                                    0x68, 0xf9, 0x22, 0x5, 0x9b, 0xfc, 0x6, 0x7,
+                                                    0x50, 0xfb, 0x27, 0x9c, 0x83, 0x5, 0xbf, 0xac,
+                                                    0xa7, 0xa8, 0xcc, 0x1b, 0xf7, 0x63, 0x6, 0xe,
+                                                    0x7d, 0xa7, 0xf9, 0xe, 0xa7, 0x12, 0xd6, 0xd7,
+                                                    0x45, 0xd1, 0xf7, 0x60, 0xd0, 0x4c, 0xd7, 0x13,
+                                                    0xe4, 0xf7, 0x6c, 0xf7, 0xcc, 0x15, 0xf7, 0x7,
+                                                    0x39, 0xbb, 0x6d, 0x41, 0x1a, 0x45, 0x52, 0x61,
+                                                    0x4c, 0x3a, 0x5d, 0xcc, 0xd8, 0xe6, 0xbf, 0xb2,
+                                                    0xab, 0xa5, 0x1e, 0x71, 0x9f, 0x15, 0x32, 0x47,
+                                                    0x5e, 0x6c, 0x34, 0x1a, 0x3d, 0xcd, 0x39, 0xf7,
+                                                    0x10, 0xf7, 0x3a, 0xb6, 0xf7, 0x4, 0xbf, 0xce,
+                                                    0x7a, 0xc5, 0xfb, 0x1a, 0xeb, 0x1e, 0x13, 0xd8,
+                                                    0xc1, 0xa8, 0xd7, 0xb5, 0xe7, 0x1a, 0xd7, 0x43,
+                                                    0xcd, 0xfb, 0x5, 0x35, 0x26, 0x55, 0x26, 0x3a,
+                                                    0xb7, 0x69, 0xdf, 0x41, 0x1e, 0xd6, 0xc4, 0x15,
+                                                    0x67, 0xa2, 0x2e, 0xc4, 0xd9, 0x1a, 0xbb, 0xab,
+                                                    0xc0, 0xd6, 0xd8, 0xb8, 0x55, 0x54, 0x33, 0x4d,
+                                                    0x66, 0x65, 0x72, 0x1e, 0xe, 0x8b, 0x76, 0xf7,
+                                                    0x74, 0xb6, 0xf8, 0x19, 0xa7, 0x1, 0xa9, 0xe7,
+                                                    0xf7, 0x88, 0xe8, 0x3, 0xc6, 0x75, 0x15, 0xf7,
+                                                    0x91, 0x9b, 0xf7, 0x27, 0xf7, 0x51, 0xf7, 0x69,
+                                                    0x1a, 0xdf, 0x73, 0xc7, 0x63, 0xbb, 0x1e, 0xbc,
+                                                    0x64, 0x54, 0xa8, 0x4e, 0x1b, 0xfb, 0x17, 0x89,
+                                                    0x3c, 0x23, 0xfb, 0x11, 0x1a, 0x38, 0xba, 0x23,
+                                                    0xf7, 0x19, 0xbe, 0xbf, 0x92, 0xb0, 0xb7, 0x1e,
+                                                    0x8c, 0x8a, 0x83, 0x73, 0x58, 0xfb, 0x78, 0xfb,
+                                                    0x87, 0x62, 0x19, 0xf7, 0xc7, 0xf7, 0xf9, 0x15,
+                                                    0x54, 0x4a, 0x82, 0x5b, 0x20, 0x76, 0xee, 0xd7,
+                                                    0xa7, 0x93, 0xbb, 0x9c, 0xae, 0x1e, 0xaf, 0x9e,
+                                                    0xa6, 0xa4, 0xb6, 0x1b, 0xcd, 0xad, 0x5b, 0x52,
+                                                    0x9b, 0x1f, 0x9a, 0x56, 0x8c, 0x59, 0x89, 0x68,
+                                                    0x8, 0xe, 0x3c, 0x80, 0xf7, 0x3, 0xf7, 0x8c,
+                                                    0xf7, 0x3, 0x8b, 0x77, 0x1, 0xdc, 0xf7, 0x3,
+                                                    0x3, 0xdc, 0xf8, 0x26, 0x15, 0x43, 0x1d, 0xfb,
+                                                    0xfb, 0x4, 0x43, 0x1d, 0xe, 0x3c, 0xfb, 0xc,
+                                                    0x76, 0xf7, 0x28, 0x76, 0xf7, 0x8, 0x77, 0xf7,
+                                                    0x9d, 0xf7, 0x4, 0x12, 0xdb, 0xf7, 0x4, 0xfb,
+                                                    0x4, 0xf7, 0x1f, 0x13, 0x94, 0xed, 0xfb, 0xe,
+                                                    0x15, 0x94, 0x78, 0x5, 0x13, 0x74, 0xac, 0x97,
+                                                    0xda, 0xcc, 0xd1, 0x1a, 0xdf, 0x50, 0x97, 0x76,
+                                                    0x80, 0x5b, 0x85, 0x54, 0x66, 0xa3, 0x79, 0xab,
+                                                    0x92, 0x96, 0x94, 0x8c, 0x8e, 0x1e, 0x8c, 0x8f,
+                                                    0x8e, 0x8c, 0x8d, 0x1b, 0x13, 0x18, 0x39, 0xa,
+                                                    0x79, 0xf8, 0xa1, 0x15, 0x13, 0x10, 0x6c, 0xa4,
+                                                    0x72, 0xaa, 0x1e, 0x13, 0x98, 0xaa, 0xa4, 0xa4,
+                                                    0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, 0x72, 0x72,
+                                                    0x6c, 0x1f, 0xe, 0x8c, 0x1d, 0xf8, 0x90, 0xfc,
+                                                    0x7e, 0xca, 0x3, 0xa7, 0xf7, 0x81, 0x15, 0xf8,
+                                                    0x90, 0xfb, 0x89, 0x5, 0xb8, 0x7, 0xfc, 0x51,
+                                                    0xf7, 0x6c, 0xf8, 0x51, 0xf7, 0x6b, 0x5, 0xb9,
+                                                    0x7, 0xfc, 0x90, 0xfb, 0x8c, 0x5, 0xe, 0xf7,
+                                                    0x63, 0xf7, 0xc, 0xcd, 0xf7, 0x1a, 0xcd, 0x63,
+                                                    0xb3, 0x12, 0x13, 0xa0, 0xa9, 0xf7, 0xee, 0x15,
+                                                    0xf8, 0x8c, 0xb3, 0xfc, 0x8c, 0x6, 0xfb, 0x9e,
+                                                    0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xb6, 0xfc,
+                                                    0x8c, 0x7, 0xe, 0x8c, 0x1d, 0x8b, 0x3, 0xa7,
+                                                    0x83, 0x15, 0xf8, 0x90, 0xf7, 0x89, 0x5, 0xa8,
+                                                    0x7, 0xfc, 0x90, 0xf7, 0x8c, 0x5, 0x5d, 0x7,
+                                                    0xf8, 0x51, 0xfb, 0x6b, 0xfc, 0x51, 0xfb, 0x6c,
+                                                    0x5, 0xe, 0xe2, 0x83, 0xf4, 0xf7, 0xfe, 0x77,
+                                                    0xf7, 0x63, 0xa9, 0x12, 0xcf, 0xbe, 0xf7, 0x5f,
+                                                    0xe7, 0x17, 0xf7, 0x77, 0xf7, 0x38, 0x15, 0x9c,
+                                                    0x6, 0x99, 0xe1, 0xa5, 0xb3, 0xc2, 0xcb, 0x8,
+                                                    0xa9, 0xae, 0xb8, 0xd1, 0xbe, 0x1a, 0xf1, 0x44,
+                                                    0xcb, 0xfb, 0x4, 0x46, 0x2d, 0x56, 0x26, 0x69,
+                                                    0x95, 0x6e, 0xb3, 0xa7, 0x96, 0xa3, 0x9c, 0x9c,
+                                                    0x83, 0x97, 0x82, 0x95, 0x1e, 0x81, 0x97, 0x80,
+                                                    0x95, 0x99, 0x1a, 0xac, 0xbe, 0xb1, 0xb5, 0xd8,
+                                                    0xac, 0x48, 0x4f, 0x63, 0x78, 0x46, 0x79, 0x63,
+                                                    0x1e, 0x69, 0x3d, 0x73, 0x46, 0x50, 0x1a, 0x61,
+                                                    0xfb, 0xc, 0x15, 0x6e, 0xa2, 0x74, 0xa8, 0xa8,
+                                                    0xa3, 0xa2, 0xa8, 0x1e, 0x13, 0x80, 0x94, 0x1d,
+                                                    0x1e, 0xe, 0xf8, 0xc8, 0x7d, 0xb2, 0xf7, 0xa,
+                                                    0xac, 0x7f, 0xb7, 0xf7, 0x7a, 0xb7, 0xf7, 0x37,
+                                                    0xaa, 0x12, 0xf7, 0x8, 0xdf, 0xf7, 0xd, 0xd2,
+                                                    0xf8, 0xd, 0xb3, 0x13, 0xbf, 0xf8, 0x1c, 0xf7,
+                                                    0xa3, 0x15, 0xf7, 0xd, 0xe4, 0xd3, 0xbb, 0xa9,
+                                                    0x94, 0x74, 0x61, 0x5a, 0x7d, 0x63, 0x7e, 0x6b,
+                                                    0x1e, 0x4e, 0x72, 0x6a, 0x6d, 0x6f, 0x1b, 0x68,
+                                                    0x6f, 0xa3, 0xc7, 0x1f, 0xf7, 0x22, 0x52, 0x15,
+                                                    0x7e, 0x8a, 0xa3, 0x51, 0xcd, 0x1b, 0xf7, 0xb,
+                                                    0xce, 0xf7, 0x1c, 0xf1, 0xf7, 0x3d, 0xfb, 0x24,
+                                                    0xf7, 0x12, 0xfb, 0x4c, 0xfb, 0x5a, 0xfb, 0x3b,
+                                                    0xfb, 0x25, 0xfb, 0x6c, 0xfb, 0x1a, 0xf7, 0x6,
+                                                    0xfb, 0x57, 0xf7, 0x99, 0xd9, 0xd9, 0xab, 0xa8,
+                                                    0xca, 0x1f, 0x7f, 0xa9, 0x5, 0x71, 0x52, 0x4d,
+                                                    0x71, 0x32, 0x1b, 0xfb, 0x42, 0xfb, 0x8, 0xf7,
+                                                    0x1d, 0xf7, 0x23, 0xf7, 0x72, 0xf7, 0x14, 0xf7,
+                                                    0xa, 0xf7, 0x2d, 0xf7, 0x4b, 0xf4, 0xfb, 0x2b,
+                                                    0xfb, 0x6, 0x1f, 0x13, 0xdf, 0x35, 0x5a, 0xfb,
+                                                    0xa, 0x3a, 0x5e, 0x91, 0xbc, 0x9a, 0x8e, 0x1e,
+                                                    0xcd, 0xf7, 0x9c, 0x5, 0x46, 0x6, 0x80, 0x5b,
+                                                    0x5, 0x13, 0x32, 0xa3, 0x7e, 0x7f, 0xa7, 0x5d,
+                                                    0x1b, 0xfb, 0x1b, 0x4d, 0xfb, 0x3e, 0x45, 0xfb,
+                                                    0x5, 0xcf, 0x80, 0xa7, 0xc5, 0xb9, 0xbf, 0x9d,
+                                                    0x96, 0x1f, 0xe, 0x5c, 0x1d, 0x1, 0x9a, 0x16,
+                                                    0xf7, 0x5a, 0x9e, 0x6, 0x76, 0x51, 0xa4, 0xb2,
+                                                    0x9a, 0x1f, 0xbd, 0xf7, 0x19, 0x5, 0xf7, 0x9a,
+                                                    0x6, 0xba, 0x27, 0x93, 0x7d, 0x8f, 0x7b, 0x8,
+                                                    0x5f, 0x96, 0x60, 0x74, 0x66, 0x1b, 0x78, 0xf7,
+                                                    0x93, 0x9e, 0x7, 0x73, 0x68, 0xa1, 0xb8, 0x77,
+                                                    0x1f, 0xfb, 0x98, 0xf8, 0xe0, 0x5, 0x77, 0x6,
+                                                    0xfb, 0x77, 0xfc, 0xab, 0x78, 0x71, 0x7c, 0x6d,
+                                                    0x73, 0x5c, 0x6c, 0x7b, 0x2e, 0xa, 0xe, 0xf7,
+                                                    0xca, 0x8b, 0xb0, 0xf7, 0xb5, 0xb2, 0xf7, 0x98,
+                                                    0xb0, 0x12, 0xf7, 0x5, 0xf1, 0xf7, 0x86, 0xf1,
+                                                    0x3a, 0xf7, 0x7, 0x13, 0xf4, 0x9c, 0x16, 0xf7,
+                                                    0xe2, 0x6, 0xf7, 0x72, 0x9f, 0xf7, 0x1e, 0xb1,
+                                                    0xf4, 0x3b, 0xbb, 0x34, 0x9d, 0x1f, 0x8d, 0x7,
+                                                    0x13, 0xf8, 0xb8, 0x96, 0xe3, 0xa1, 0xf7, 0x3,
+                                                    0x1a, 0xf7, 0x2f, 0xfb, 0x43, 0x99, 0x34, 0x1e,
+                                                    0xfb, 0xac, 0x78, 0x6, 0xda, 0x9c, 0x66, 0x77,
+                                                    0x1f, 0xfc, 0x86, 0x7, 0x6c, 0x7f, 0x67, 0x37,
+                                                    0x89, 0x1e, 0xf7, 0x5a, 0xf7, 0xc7, 0x15, 0xeb,
+                                                    0xab, 0x86, 0x81, 0xad, 0x1f, 0x13, 0xf4, 0xbf,
+                                                    0x7b, 0xbc, 0x6a, 0x39, 0x1a, 0xfb, 0x1a, 0xfb,
+                                                    0xd, 0x82, 0x49, 0x51, 0x79, 0x99, 0xb0, 0x1e,
+                                                    0xf7, 0xa9, 0x4, 0xf7, 0x70, 0x7, 0x9a, 0x8d,
+                                                    0xa3, 0x9f, 0x1e, 0x95, 0x99, 0x8c, 0xa0, 0x1b,
+                                                    0x13, 0xf8, 0xd2, 0xf3, 0x78, 0xfb, 0xb, 0xfb,
+                                                    0xb, 0xfb, 0xb, 0x89, 0x6f, 0x1f, 0xe, 0xf7,
+                                                    0xca, 0x7d, 0xb7, 0xf8, 0x39, 0x77, 0xf7, 0x61,
+                                                    0xb3, 0x1, 0xa7, 0xf7, 0x8, 0x3, 0xf8, 0xfb,
+                                                    0xf7, 0x17, 0x15, 0x77, 0x1d, 0xf7, 0x57, 0xdb,
+                                                    0xf7, 0x4, 0xf7, 0x2d, 0xf7, 0xf, 0xd3, 0x3b,
+                                                    0x22, 0xa4, 0x1f, 0xa2, 0x6, 0x82, 0xf7, 0x75,
+                                                    0x59, 0x1d, 0xf7, 0x4c, 0xe1, 0xf7, 0x11, 0x8d,
+                                                    0x8c, 0x1f, 0xe, 0xf8, 0x1, 0x8b, 0xb0, 0xf8,
+                                                    0xe0, 0xb0, 0x1, 0xf3, 0xf1, 0xf7, 0xf3, 0x58,
+                                                    0x1d, 0x85, 0x96, 0x72, 0x67, 0x1a, 0xfc, 0x7c,
+                                                    0x7, 0x6c, 0x7f, 0x69, 0x3f, 0x87, 0x1e, 0xf7,
+                                                    0x52, 0xd0, 0x15, 0xf8, 0x7c, 0x7, 0x9f, 0x8b,
+                                                    0xa8, 0x8b, 0xa, 0xfb, 0xa8, 0xfb, 0x8a, 0x7b,
+                                                    0x4b, 0x8c, 0x1e, 0x5b, 0x8c, 0x7f, 0x9b, 0xad,
+                                                    0x1a, 0xe, 0x7b, 0xa, 0xf7, 0xb5, 0xb4, 0xf7,
+                                                    0x9a, 0xb1, 0x12, 0xee, 0xf1, 0xf7, 0x9c, 0xa2,
+                                                    0x17, 0x62, 0xa, 0x96, 0xb4, 0x1f, 0xf7, 0x82,
+                                                    0x7, 0xf7, 0x2e, 0x89, 0xde, 0x8a, 0x9a, 0x7d,
+                                                    0x97, 0x3b, 0x19, 0x6f, 0xa, 0x44, 0x80, 0x81,
+                                                    0x73, 0x32, 0x1b, 0xfb, 0x2e, 0xf7, 0x68, 0x6,
+                                                    0xad, 0x97, 0x95, 0x33, 0x1d, 0x6, 0x13, 0x10,
+                                                    0x78, 0x7, 0xca, 0x86, 0xa3, 0x71, 0x6b, 0x1a,
+                                                    0xfc, 0x7d, 0x7, 0x64, 0x74, 0x6e, 0x4b, 0x84,
+                                                    0x1d, 0x99, 0x1d, 0xf7, 0x7b, 0x77, 0xf7, 0x8,
+                                                    0xb4, 0xf7, 0x9a, 0xb1, 0x1, 0xee, 0xf1, 0xf7,
+                                                    0x8a, 0xa2, 0xb4, 0xa4, 0x3, 0x97, 0x16, 0xf7,
+                                                    0xac, 0x9e, 0x6, 0x44, 0x8e, 0x77, 0xa1, 0xd6,
+                                                    0x1a, 0xf7, 0x65, 0x7, 0xf7, 0x25, 0x89, 0xd6,
+                                                    0x8a, 0xa3, 0x81, 0x96, 0x37, 0x19, 0x6f, 0xa,
+                                                    0x40, 0x81, 0x79, 0x77, 0x39, 0x1b, 0xfb, 0x25,
+                                                    0xf7, 0x68, 0x6, 0xa9, 0x92, 0x99, 0xa4, 0x1e,
+                                                    0xf7, 0x1c, 0x4e, 0xa, 0xf7, 0x23, 0xfc, 0xaa,
+                                                    0x78, 0x6, 0xca, 0x86, 0xa3, 0x71, 0x6b, 0x1a,
+                                                    0xfc, 0x61, 0x7, 0x45, 0x7f, 0x71, 0x40, 0x84,
+                                                    0x1d, 0xf8, 0x1, 0x7d, 0xb3, 0xf7, 0xca, 0x9d,
+                                                    0xf7, 0xae, 0xb3, 0x1, 0xab, 0xf7, 0x6, 0xf8,
+                                                    0x17, 0xec, 0x3, 0xf8, 0x5a, 0xf7, 0xe4, 0x15,
+                                                    0xcf, 0x86, 0x9f, 0x7b, 0x49, 0x98, 0xa, 0x67,
+                                                    0x46, 0x74, 0x47, 0xfb, 0x2f, 0x23, 0xf7, 0x5,
+                                                    0xf7, 0x49, 0xf7, 0x91, 0xf7, 0x27, 0xca, 0xea,
+                                                    0xf7, 0x20, 0xbf, 0x28, 0x43, 0xa6, 0x1e, 0xa2,
+                                                    0x6, 0x83, 0xf7, 0x67, 0x5, 0x75, 0x6, 0x6f,
+                                                    0x85, 0x6a, 0x86, 0x83, 0x6b, 0x5d, 0xac, 0x26,
+                                                    0x1b, 0xfb, 0x68, 0xfb, 0x16, 0xfb, 0x3b, 0xfb,
+                                                    0x3c, 0xfb, 0x80, 0xf7, 0x2a, 0xfb, 0xb, 0xf7,
+                                                    0x6a, 0xf7, 0x2, 0xf7, 0x19, 0xc5, 0x99, 0x1f,
+                                                    0xf7, 0x53, 0x7, 0xd2, 0xa5, 0x97, 0xb7, 0x8f,
+                                                    0x1e, 0x9d, 0xfb, 0x93, 0x7, 0xe, 0x80, 0x1d,
+                                                    0xf7, 0xcf, 0xb7, 0xf7, 0xc3, 0x77, 0x1, 0xf6,
+                                                    0xf1, 0xf7, 0xc3, 0xf1, 0x3, 0x9e, 0x16, 0xf7,
+                                                    0xaa, 0x9e, 0x6, 0x3d, 0x90, 0x81, 0xb3, 0xcd,
+                                                    0x1a, 0xf7, 0x4d, 0xf7, 0xc3, 0xfb, 0x4d, 0x7,
+                                                    0x40, 0x87, 0x6b, 0x37, 0x87, 0x1e, 0x78, 0xf7,
+                                                    0xaa, 0x9e, 0x7, 0x3d, 0x90, 0x81, 0xae, 0xcd,
+                                                    0x1a, 0xf8, 0x36, 0x67, 0x1d, 0xfb, 0x4c, 0xfb,
+                                                    0xc3, 0xf7, 0x4c, 0x67, 0x1d, 0xfc, 0x31, 0x7,
+                                                    0x40, 0x87, 0x6b, 0x37, 0x84, 0x1d, 0x73, 0xa0,
+                                                    0x76, 0xf9, 0x2a, 0x42, 0xa, 0xe, 0xab, 0x6a,
+                                                    0xf7, 0xe, 0xf8, 0xd4, 0x77, 0x1, 0xf7, 0x44,
+                                                    0xf1, 0x3, 0xde, 0xf9, 0x17, 0x15, 0xdc, 0x86,
+                                                    0x97, 0x73, 0x44, 0x1a, 0xfc, 0x53, 0x7, 0x57,
+                                                    0x7c, 0x7d, 0x73, 0x75, 0x8a, 0xa8, 0xa3, 0x81,
+                                                    0x1e, 0x9c, 0x84, 0x7e, 0x99, 0x6f, 0x1b, 0x6e,
+                                                    0x7a, 0x6d, 0x78, 0x7d, 0x91, 0x7b, 0x9b, 0x79,
+                                                    0x1f, 0x7f, 0x96, 0xa4, 0x7e, 0xb5, 0x1b, 0xa6,
+                                                    0xf7, 0x21, 0x8e, 0xf7, 0x56, 0x1f, 0xf7, 0xf6,
+                                                    0x7, 0xd5, 0x99, 0xa0, 0xd9, 0x90, 0x1e, 0x9e,
+                                                    0xfb, 0xb3, 0x7, 0xe, 0xf8, 0x1, 0x83, 0xa,
+                                                    0x1, 0xf7, 0x10, 0xf1, 0x3, 0xad, 0x16, 0xf7,
+                                                    0xae, 0x9e, 0x6, 0x3d, 0x8f, 0x7f, 0xa5, 0xd1,
+                                                    0x1a, 0xf7, 0x45, 0x7, 0xa5, 0xa0, 0xf5, 0x22,
+                                                    0x5, 0xad, 0x69, 0xeb, 0x24, 0x6c, 0x1a, 0x75,
+                                                    0x7a, 0x8a, 0x56, 0x89, 0x1e, 0x78, 0xf7, 0xc5,
+                                                    0x9e, 0x7, 0x52, 0x89, 0x67, 0xbe, 0x4b, 0xc6,
+                                                    0xfb, 0x7d, 0xf7, 0x8e, 0x18, 0xf7, 0x52, 0xf7,
+                                                    0x50, 0xd2, 0xd1, 0xa0, 0x8e, 0xc7, 0x90, 0x19,
+                                                    0x9e, 0xfb, 0x9a, 0x78, 0x7, 0xbc, 0x89, 0x9e,
+                                                    0x89, 0x70, 0x1a, 0x69, 0x6e, 0x70, 0xfb, 0x76,
+                                                    0xfb, 0x5f, 0x1e, 0xf7, 0x57, 0x7, 0xd5, 0x99,
+                                                    0xa0, 0xd9, 0x90, 0x1e, 0x9e, 0xfb, 0xb0, 0x78,
+                                                    0x7, 0xcf, 0x86, 0xa1, 0x7a, 0x3d, 0x1a, 0xfc,
+                                                    0x3a, 0x7, 0x43, 0x7f, 0x71, 0x3d, 0x84, 0x1d,
+                                                    0xf7, 0x92, 0x8b, 0xb2, 0xf7, 0x1b, 0x77, 0xf8,
+                                                    0x90, 0x77, 0x1, 0xf7, 0x13, 0x5d, 0x1d, 0x96,
+                                                    0xb3, 0x1f, 0xf8, 0x59, 0x7, 0xda, 0x73, 0x1d,
+                                                    0xfc, 0x59, 0x7, 0x68, 0x74, 0x6b, 0x4b, 0x84,
+                                                    0x1d, 0xf8, 0xa8, 0x83, 0xa, 0x1, 0xf7, 0x1,
+                                                    0xb7, 0xf8, 0x9d, 0xf1, 0x3, 0x5f, 0xa, 0xf8,
+                                                    0x19, 0x8d, 0x7, 0xf7, 0x8d, 0xfc, 0xb6, 0x5,
+                                                    0x99, 0x6, 0xf7, 0x92, 0xf8, 0xcd, 0x5, 0x8d,
+                                                    0xfc, 0x57, 0x6, 0x4e, 0x7e, 0x69, 0x3d, 0x87,
+                                                    0x1e, 0x78, 0xf7, 0xac, 0x9e, 0x7, 0x4b, 0x8f,
+                                                    0x74, 0x9e, 0xd8, 0x1a, 0xf8, 0x46, 0x7, 0xda,
+                                                    0xa3, 0x91, 0xca, 0x90, 0x1e, 0x9e, 0xfb, 0x5b,
+                                                    0x7, 0xfb, 0x71, 0xfc, 0x8d, 0xfb, 0x7b, 0xf8,
+                                                    0x8d, 0x5, 0xfb, 0x5c, 0x78, 0x6, 0xd5, 0x87,
+                                                    0xa2, 0x83, 0x3d, 0x1a, 0xfc, 0x20, 0x78, 0xa,
+                                                    0xe, 0xf8, 0x1, 0x95, 0x76, 0xab, 0x8a, 0x1d,
+                                                    0x12, 0xf7, 0x1, 0xb7, 0xf8, 0x33, 0xb7, 0x13,
+                                                    0x78, 0x5f, 0xa, 0xf8, 0x10, 0x8d, 0x7, 0x13,
+                                                    0xb8, 0x3a, 0xa, 0xe, 0x5b, 0xa, 0x85, 0xa,
+                                                    0xf7, 0xe4, 0x70, 0xa, 0xfb, 0x1d, 0x69, 0x1d,
+                                                    0xf7, 0xf, 0x61, 0x1d, 0xf7, 0x10, 0x61, 0xa,
+                                                    0xfb, 0x2, 0x44, 0x1d, 0xd6, 0xf1, 0xf1, 0xf7,
+                                                    0x3, 0x32, 0x71, 0x1d, 0x3a, 0x72, 0x1d, 0xea,
+                                                    0xf7, 0x70, 0x1e, 0xe, 0x99, 0x1d, 0xf7, 0xb4,
+                                                    0xb3, 0xf7, 0xbd, 0xb0, 0x6d, 0xa, 0xa5, 0xdc,
+                                                    0x1a, 0xf7, 0x37, 0x66, 0x1d, 0xf7, 0x13, 0xfb,
+                                                    0x10, 0xc0, 0xfb, 0x1e, 0x1e, 0xfb, 0x9c, 0x78,
+                                                    0x6, 0xd4, 0x84, 0x96, 0x6d, 0x74, 0x1a, 0xfc,
+                                                    0x59, 0x8d, 0xa, 0xf7, 0xcc, 0x15, 0xf7, 0x8e,
+                                                    0x7, 0xac, 0x96, 0x96, 0xa9, 0xb7, 0xf7, 0x26,
+                                                    0x89, 0x74, 0x1d, 0xf8, 0x1, 0xfb, 0x46, 0x9e,
+                                                    0xf7, 0x32, 0xa2, 0x8b, 0xf8, 0xfe, 0x8b, 0xaf,
+                                                    0x1, 0xc4, 0xf7, 0x6, 0xf8, 0x16, 0x9a, 0xa,
+                                                    0xf7, 0x93, 0x8a, 0x15, 0xfb, 0x33, 0xf7, 0x21,
+                                                    0xf7, 0x27, 0x79, 0xf7, 0x32, 0x1b, 0x9e, 0x7,
+                                                    0xfb, 0x22, 0x99, 0x53, 0xb9, 0x3e, 0xe7, 0x8,
+                                                    0xf7, 0x0, 0x98, 0xf7, 0x24, 0xf3, 0xf7, 0x70,
+                                                    0x1a, 0xf7, 0x7a, 0xfb, 0x2d, 0xf7, 0x8, 0xfb,
+                                                    0x38, 0xfb, 0x38, 0xfb, 0x2d, 0xfb, 0x9, 0xfb,
+                                                    0x79, 0xfb, 0x69, 0xf7, 0xa, 0x2e, 0xe8, 0x72,
+                                                    0x1e, 0x2a, 0xf7, 0xdf, 0x15, 0xf7, 0x79, 0xf0,
+                                                    0xdc, 0xf1, 0xf1, 0xf0, 0x3a, 0xfb, 0x79, 0xfb,
+                                                    0x6f, 0x2f, 0x32, 0xfb, 0x3, 0xfb, 0x3, 0x2f,
+                                                    0xe4, 0xf7, 0x6f, 0x1e, 0xe, 0xf7, 0xca, 0x8b,
+                                                    0x9e, 0xf7, 0xb3, 0xb0, 0xf7, 0xae, 0xb0, 0x1,
+                                                    0xf1, 0xf1, 0xf7, 0x7e, 0xf7, 0x1, 0x3, 0x9c,
+                                                    0x16, 0xf7, 0xa9, 0x9e, 0x6, 0x3b, 0x8f, 0x81,
+                                                    0xa8, 0xce, 0x1a, 0xf7, 0x4f, 0x7, 0xc3, 0x8d,
+                                                    0xf7, 0x82, 0xfb, 0xc8, 0x5, 0xf7, 0x35, 0x9e,
+                                                    0x6, 0x62, 0x8d, 0x73, 0x9d, 0x75, 0xa6, 0xfb,
+                                                    0x62, 0xf7, 0x91, 0x18, 0xbe, 0x95, 0xf7, 0x16,
+                                                    0xa3, 0xf7, 0x1a, 0x1a, 0xf7, 0x2e, 0xfb, 0x39,
+                                                    0xa0, 0x32, 0x1e, 0xfb, 0xa8, 0x78, 0x6, 0xd1,
+                                                    0x84, 0x9a, 0x6f, 0x6f, 0x1a, 0xfc, 0x63, 0x7,
+                                                    0x4f, 0x87, 0x6a, 0x3a, 0x86, 0x1e, 0xf7, 0x4f,
+                                                    0xf7, 0xd8, 0x15, 0xf7, 0x80, 0x7, 0xa8, 0x94,
+                                                    0x9c, 0xc0, 0xb4, 0xf7, 0x17, 0x88, 0xfb, 0x19,
+                                                    0xfb, 0x23, 0xfb, 0x2a, 0x89, 0x37, 0x8a, 0x1e,
+                                                    0xe, 0xf7, 0x5b, 0x7d, 0xaf, 0xf8, 0xf4, 0xb4,
+                                                    0x12, 0xb5, 0xa1, 0x96, 0xe1, 0xf7, 0x79, 0xf0,
+                                                    0x17, 0xb5, 0x7d, 0x15, 0xa1, 0x6, 0x9b, 0xbd,
+                                                    0x9d, 0xa0, 0x9c, 0x9f, 0x80, 0x81, 0xa8, 0x1e,
+                                                    0x13, 0xf8, 0x84, 0xa0, 0xa5, 0x85, 0xab, 0x1b,
+                                                    0xf7, 0x23, 0xcf, 0xeb, 0xe0, 0xf1, 0x38, 0xc4,
+                                                    0x38, 0xbc, 0x1f, 0x37, 0xbd, 0x37, 0xb5, 0xd6,
+                                                    0x1a, 0xc9, 0xbe, 0xaa, 0xbd, 0xf4, 0xb8, 0x31,
+                                                    0x39, 0x9c, 0x1e, 0xa4, 0x6, 0x88, 0x86, 0x1d,
+                                                    0x1b, 0x7d, 0x77, 0x96, 0x94, 0x71, 0x1f, 0x92,
+                                                    0x77, 0x74, 0x92, 0x71, 0x55, 0xa, 0x13, 0x70,
+                                                    0x74, 0x6, 0xe, 0xf7, 0x92, 0xa0, 0x76, 0xf9,
+                                                    0x0, 0xb5, 0x1, 0xf7, 0x92, 0xf1, 0x3, 0xf7,
+                                                    0x34, 0x16, 0xf7, 0xb8, 0x9e, 0x6, 0x37, 0x8e,
+                                                    0x7f, 0xa8, 0xcf, 0x1a, 0xf8, 0x89, 0xc1, 0x7,
+                                                    0xf7, 0x2, 0xa7, 0x79, 0xfb, 0x2, 0xa0, 0x1f,
+                                                    0xa3, 0x6, 0x85, 0xf7, 0x3e, 0x5, 0xfc, 0xc8,
+                                                    0x6, 0x85, 0xfb, 0x3e, 0x5, 0xa3, 0x6, 0xf7,
+                                                    0x1, 0xa1, 0xa6, 0x9e, 0xf7, 0x2, 0x1b, 0xc1,
+                                                    0xfc, 0x8b, 0x6, 0x4d, 0x88, 0x6b, 0x30, 0x84,
+                                                    0x1d, 0x6e, 0xa, 0x1, 0xf3, 0xf1, 0xf7, 0xfd,
+                                                    0xb7, 0x3, 0x99, 0xf9, 0x17, 0x2d, 0x1d, 0x63,
+                                                    0x3f, 0xfb, 0x27, 0x49, 0x1d, 0xf8, 0x1, 0x95,
+                                                    0x76, 0xf9, 0x35, 0x77, 0x12, 0x9b, 0xf9, 0x3d,
+                                                    0x17, 0xf8, 0x4, 0x80, 0x15, 0x9a, 0x6, 0xf7,
+                                                    0x86, 0xf8, 0xe9, 0x5, 0x13, 0x60, 0x97, 0xa9,
+                                                    0x97, 0xa3, 0xbb, 0x8e, 0x8, 0x9e, 0xfb, 0x61,
+                                                    0x78, 0x7, 0xb1, 0x89, 0xae, 0x7e, 0x62, 0x1a,
+                                                    0xfb, 0x3a, 0xfc, 0x3e, 0x5, 0xfb, 0x42, 0xf8,
+                                                    0xf, 0x79, 0xb4, 0x9a, 0x1a, 0xab, 0x9e, 0x97,
+                                                    0xc3, 0x8e, 0x1e, 0x9e, 0xfb, 0x9e, 0x78, 0x7,
+                                                    0xba, 0x89, 0x9f, 0x77, 0x98, 0x6f, 0x8, 0xe,
+                                                    0xf8, 0xdf, 0x95, 0x76, 0xf9, 0x35, 0x77, 0x9f,
+                                                    0x8b, 0x12, 0x90, 0xfa, 0x33, 0x17, 0xf7, 0xc1,
+                                                    0x80, 0x15, 0x13, 0xf0, 0x9a, 0x6, 0xf7, 0x2e,
+                                                    0xf8, 0x3b, 0xb6, 0xfb, 0x1, 0xdd, 0xfb, 0x66,
+                                                    0xae, 0x23, 0x19, 0x9a, 0x6, 0xc6, 0xf7, 0x55,
+                                                    0xd9, 0xf7, 0x60, 0xd0, 0xf7, 0x4e, 0x99, 0xb2,
+                                                    0x9d, 0xa3, 0xbc, 0x93, 0x8, 0x9e, 0xfb, 0x5a,
+                                                    0x78, 0x7, 0xad, 0x88, 0xac, 0x7d, 0x64, 0x1a,
+                                                    0x76, 0x83, 0x6d, 0x83, 0x76, 0x1e, 0xfb, 0xf,
+                                                    0xfb, 0xdd, 0x5, 0xfb, 0x27, 0xf8, 0x10, 0x7d,
+                                                    0x97, 0x9c, 0x1a, 0xaf, 0xbb, 0x97, 0xaa, 0x1e,
+                                                    0x9e, 0xfb, 0x9f, 0x78, 0x7, 0xc0, 0x8a, 0x98,
+                                                    0x7b, 0xac, 0x38, 0xae, 0x43, 0x18, 0x20, 0xfb,
+                                                    0xae, 0x5, 0xfb, 0x29, 0xf8, 0x19, 0x83, 0x92,
+                                                    0x99, 0x1a, 0xa5, 0xa1, 0x9b, 0xb8, 0x8d, 0x1e,
+                                                    0x9e, 0xfb, 0x89, 0x78, 0x7, 0xc4, 0x86, 0x97,
+                                                    0x64, 0xab, 0x38, 0xb1, 0x27, 0xf5, 0xfb, 0xa6,
+                                                    0xbe, 0xfb, 0x2d, 0x8, 0xe, 0xf8, 0x1, 0x8b,
+                                                    0x9e, 0xf9, 0x4, 0x9e, 0x1, 0x95, 0x16, 0xf7,
+                                                    0x7d, 0x9e, 0x6, 0x64, 0x66, 0x9a, 0xab, 0x9e,
+                                                    0xaa, 0xb2, 0xa0, 0xa5, 0x1f, 0xf7, 0xb, 0xf7,
+                                                    0x1e, 0xea, 0xfb, 0x16, 0x5, 0x9b, 0x74, 0xae,
+                                                    0x55, 0x79, 0x1a, 0x6c, 0x70, 0x7e, 0x59, 0x1e,
+                                                    0x78, 0xf7, 0xbd, 0x9e, 0x7, 0x57, 0x77, 0xa8,
+                                                    0xc2, 0x64, 0x1f, 0xfb, 0x54, 0xf7, 0x9c, 0xf7,
+                                                    0x26, 0xf7, 0x40, 0x5, 0xe2, 0xd1, 0xa5, 0x9c,
+                                                    0xc0, 0x1b, 0x9e, 0xfb, 0x82, 0x78, 0x7, 0xad,
+                                                    0xaf, 0x7f, 0x6c, 0x78, 0x7a, 0x77, 0x74, 0x6e,
+                                                    0x1f, 0xfb, 0x5, 0xfb, 0x14, 0x5, 0xfb, 0x1,
+                                                    0xf7, 0x24, 0x79, 0xac, 0x9f, 0x1a, 0xa9, 0xa3,
+                                                    0x97, 0xbf, 0x1e, 0x9e, 0xfb, 0xc2, 0x78, 0x7,
+                                                    0xc5, 0xa0, 0x7a, 0xfb, 0x2a, 0xf1, 0x1f, 0xf7,
+                                                    0x1, 0xfb, 0x2a, 0x5, 0xfb, 0xac, 0xfb, 0x80,
+                                                    0x80, 0x70, 0x54, 0x1b, 0xe, 0xf8, 0x1, 0xa0,
+                                                    0x76, 0xf9, 0x2a, 0x72, 0xa, 0xa6, 0xd3, 0x1a,
+                                                    0xf7, 0x4c, 0x7, 0xf7, 0x28, 0xf7, 0x6c, 0xd0,
+                                                    0xf5, 0xac, 0x99, 0xaf, 0x8f, 0x19, 0x9e, 0xfb,
+                                                    0x6f, 0x78, 0x7, 0xaa, 0xb1, 0x7f, 0x75, 0x1d,
+                                                    0xfb, 0x6c, 0xfb, 0x28, 0xf7, 0x68, 0x75, 0xa,
+                                                    0x96, 0xb9, 0x8d, 0x1e, 0x9e, 0xfb, 0xac, 0x78,
+                                                    0x7, 0xb8, 0x87, 0x9a, 0x7e, 0xf1, 0xfb, 0x2a,
+                                                    0xf7, 0x17, 0xfb, 0x4a, 0x18, 0xfb, 0x44, 0x7,
+                                                    0x46, 0x88, 0x6f, 0x29, 0x89, 0x1e, 0xe, 0x7b,
+                                                    0xa, 0xf8, 0xde, 0xb1, 0x1, 0x94, 0xf8, 0xe0,
+                                                    0x3f, 0x1d, 0xe, 0x93, 0x1d, 0xe3, 0xd7, 0x3,
+                                                    0xe3, 0xfb, 0x30, 0x15, 0xf7, 0x67, 0xa4, 0x3f,
+                                                    0x6, 0x5a, 0x81, 0xb3, 0x97, 0x1f, 0xf9, 0x34,
+                                                    0x7, 0x99, 0x95, 0xa9, 0xb8, 0x1e, 0xdb, 0xa4,
+                                                    0xfb, 0x67, 0x6, 0xe, 0x3c, 0xfb, 0x23, 0x76,
+                                                    0xf7, 0x3f, 0x7a, 0x1d, 0xf7, 0x7e, 0xfb, 0x38,
+                                                    0x15, 0xb6, 0x6, 0xfb, 0x7c, 0xf9, 0xdc, 0x5,
+                                                    0x60, 0x6, 0xe, 0x93, 0x1d, 0xf7, 0x3d, 0xd7,
+                                                    0x3, 0xad, 0xfb, 0x17, 0x15, 0x72, 0xf7, 0x67,
+                                                    0xf9, 0xc6, 0xfb, 0x67, 0x72, 0xd7, 0x7, 0xbc,
+                                                    0x95, 0x63, 0x7f, 0x1f, 0xfd, 0x34, 0x7, 0x7d,
+                                                    0x81, 0x6d, 0x5e, 0x1e, 0xe, 0xf7, 0x4, 0xf9,
+                                                    0x2a, 0x77, 0x1, 0xa3, 0xf7, 0xbd, 0x15, 0xcf,
+                                                    0x6, 0xf7, 0x23, 0xf7, 0xb5, 0xf7, 0x23, 0xfb,
+                                                    0xb5, 0x5, 0xcf, 0x6, 0xfb, 0x48, 0xf8, 0x1,
+                                                    0x5, 0x4d, 0x6, 0xe, 0xfb, 0x11, 0xbd, 0x1,
+                                                    0x8b, 0xf8, 0x88, 0x3, 0x40, 0x4, 0x59, 0xf8,
+                                                    0x88, 0xbd, 0x7, 0xe, 0x92, 0x1d, 0x9e, 0xf7,
+                                                    0x73, 0x3, 0xf7, 0x5e, 0xf8, 0x8f, 0x15, 0xb3,
+                                                    0x6, 0xfb, 0x1d, 0xf7, 0x24, 0x5, 0xa2, 0x72,
+                                                    0x7e, 0x94, 0xa, 0xa6, 0x79, 0x97, 0x7d, 0xa,
+                                                    0x4f, 0x1d, 0x12, 0xb0, 0xe3, 0x4a, 0xe3, 0xf7,
+                                                    0x1f, 0xdc, 0x13, 0xd4, 0xf7, 0xb3, 0xf7, 0xaa,
+                                                    0x15, 0xfb, 0x2f, 0x7, 0x5d, 0x61, 0x6e, 0x55,
+                                                    0x66, 0x6e, 0xaa, 0xba, 0x1e, 0x8d, 0x7, 0xad,
+                                                    0x96, 0xcd, 0xf7, 0x2b, 0xbd, 0x1e, 0x8c, 0xfb,
+                                                    0x6b, 0x15, 0x43, 0x90, 0xb5, 0x8a, 0x2f, 0xa,
+                                                    0x40, 0xa, 0xef, 0xfb, 0x29, 0x1e, 0x13, 0xcc,
+                                                    0x3e, 0x1d, 0x13, 0xb4, 0xaa, 0xb1, 0x9d, 0xac,
+                                                    0xa9, 0xba, 0x80, 0x43, 0x1e, 0x58, 0x7, 0xfb,
+                                                    0x37, 0x4b, 0x34, 0x5f, 0x27, 0x1a, 0x48, 0xbf,
+                                                    0x66, 0xc1, 0xc2, 0xc0, 0xb3, 0xac, 0xb0, 0x1e,
+                                                    0xe, 0x81, 0xab, 0xf8, 0xb, 0xca, 0xf7, 0x73,
+                                                    0x77, 0x1, 0xd0, 0xdf, 0xf7, 0x77, 0xe3, 0x3,
+                                                    0xf7, 0x2d, 0xd1, 0x15, 0xf7, 0x90, 0x7, 0xc4,
+                                                    0xcf, 0x9d, 0xab, 0xe6, 0xaf, 0x24, 0x2e, 0x49,
+                                                    0x7b, 0xfb, 0x5, 0xfb, 0x7, 0x72, 0x44, 0x98,
+                                                    0xae, 0x1e, 0xf7, 0xc9, 0x4, 0xf7, 0xc2, 0x7,
+                                                    0x86, 0x8d, 0x6b, 0x1d, 0x6c, 0x6d, 0x1f, 0xfc,
+                                                    0x91, 0x7, 0x66, 0xf4, 0x70, 0xbd, 0xf7, 0x4d,
+                                                    0xc6, 0xf7, 0x32, 0xe5, 0xf6, 0x52, 0xf7, 0x7,
+                                                    0xfb, 0xd, 0x3f, 0x56, 0x51, 0x74, 0x85, 0x1e,
+                                                    0xe, 0xe2, 0x81, 0xd3, 0xf8, 0x5, 0xa8, 0x1,
+                                                    0xa4, 0xd8, 0x3, 0xf8, 0x30, 0xf7, 0x27, 0x15,
+                                                    0x63, 0x1d, 0x93, 0x79, 0x6d, 0x93, 0x1f, 0x5f,
+                                                    0x97, 0x99, 0x73, 0xa5, 0x1b, 0xa9, 0x9b, 0xa0,
+                                                    0xa2, 0x9d, 0x81, 0xaa, 0x6d, 0xa0, 0x1f, 0x9b,
+                                                    0x72, 0x5b, 0x9a, 0x67, 0x1b, 0xfb, 0x0, 0xfb,
+                                                    0x8, 0x38, 0xfb, 0x38, 0xfb, 0x32, 0xf6, 0x4a,
+                                                    0xdb, 0xdc, 0xcc, 0xb6, 0xf7, 0x6, 0xc1, 0x1f,
+                                                    0xe, 0x81, 0xbf, 0xf8, 0x1a, 0xa7, 0xf7, 0x78,
+                                                    0x77, 0x1, 0xa6, 0xe1, 0xf7, 0x77, 0xdf, 0x3,
+                                                    0xf7, 0xe8, 0xf1, 0x15, 0x67, 0x83, 0x64, 0x73,
+                                                    0x61, 0x1b, 0x49, 0x43, 0xc3, 0xf7, 0x29, 0xf7,
+                                                    0x1c, 0xcf, 0xbc, 0xc3, 0xba, 0xbc, 0x6b, 0x47,
+                                                    0x92, 0x1f, 0xfb, 0xe7, 0x4, 0x8f, 0x88, 0xc0,
+                                                    0x9e, 0xb9, 0x9b, 0xbb, 0x9c, 0x19, 0x9b, 0x7,
+                                                    0x48, 0x86, 0x8b, 0xa9, 0xb4, 0x1a, 0xf8, 0xc1,
+                                                    0x7, 0x86, 0x8d, 0x5b, 0x7a, 0x5a, 0x7d, 0x59,
+                                                    0x6f, 0x1d, 0x93, 0x95, 0x82, 0xa, 0x6c, 0x6d,
+                                                    0x1f, 0xfb, 0x26, 0x7, 0xa8, 0x6a, 0x6d, 0x99,
+                                                    0x60, 0x1b, 0xfb, 0x4, 0x2c, 0xfb, 0x7, 0xfb,
+                                                    0x17, 0xfb, 0x60, 0xf7, 0x23, 0x77, 0xb2, 0xd5,
+                                                    0xb0, 0xb0, 0xa6, 0x9d, 0x1f, 0x8d, 0x6, 0xe,
+                                                    0x87, 0x1d, 0xf6, 0xaf, 0x1, 0xae, 0xd0, 0xf7,
+                                                    0x5b, 0xf1, 0x3, 0x37, 0x1d, 0x58, 0xfb, 0x4d,
+                                                    0xfb, 0x22, 0xd7, 0x2f, 0x2b, 0xa, 0x3d, 0x1d,
+                                                    0xe, 0x73, 0xa0, 0x76, 0xf8, 0x36, 0xab, 0xf7,
+                                                    0x61, 0xa7, 0x1, 0xf2, 0xdf, 0x3, 0x9f, 0x16,
+                                                    0xf7, 0x98, 0x9a, 0x6, 0x2f, 0x8d, 0x8a, 0xaf,
+                                                    0xc8, 0x1a, 0xf7, 0xc4, 0xf7, 0xe, 0xab, 0xfb,
+                                                    0xf, 0xf7, 0x8, 0x7, 0xb0, 0x90, 0xbf, 0xc2,
+                                                    0xa1, 0x98, 0x7a, 0x79, 0x97, 0x1e, 0x77, 0x98,
+                                                    0x97, 0x77, 0xa1, 0x1b, 0x9f, 0xa2, 0x98, 0xa8,
+                                                    0xad, 0x5f, 0xa6, 0x53, 0xfb, 0x48, 0x8b, 0xfb,
+                                                    0x45, 0x53, 0x1f, 0x38, 0x6b, 0xde, 0xfb, 0xc4,
+                                                    0x6, 0x3e, 0x7a, 0x78, 0x49, 0x88, 0x1e, 0xe,
+                                                    0xfb, 0x6e, 0xc4, 0xf7, 0x26, 0xd4, 0xe6, 0xa4,
+                                                    0xf7, 0x8c, 0xb2, 0x6e, 0xa7, 0x1, 0xa7, 0xd1,
+                                                    0x6e, 0xde, 0xf7, 0x45, 0xd8, 0xa6, 0xa7, 0x3,
+                                                    0xf7, 0x27, 0x89, 0x15, 0x6c, 0x66, 0x79, 0x77,
+                                                    0x6c, 0x1a, 0x6b, 0xa1, 0x64, 0xeb, 0xf7, 0x9,
+                                                    0xef, 0xb8, 0xbf, 0xb8, 0x5a, 0x8c, 0x41, 0x8e,
+                                                    0x1e, 0x2d, 0x8e, 0x76, 0x8a, 0x5b, 0x96, 0x8,
+                                                    0x90, 0xf7, 0xec, 0x15, 0x3b, 0xa6, 0x33, 0xd8,
+                                                    0xcf, 0x90, 0xcf, 0xbe, 0xbe, 0x7a, 0xe3, 0x36,
+                                                    0x67, 0x64, 0x75, 0x47, 0x1e, 0x71, 0xfb, 0xe9,
+                                                    0x15, 0x70, 0x98, 0x71, 0x97, 0xa7, 0x1a, 0x9d,
+                                                    0x8b, 0x96, 0xe4, 0xdb, 0x1e, 0x4f, 0xa6, 0x6a,
+                                                    0xb7, 0xc6, 0x1a, 0xf7, 0xf, 0xe3, 0xb7, 0xe0,
+                                                    0xae, 0xad, 0x83, 0x7c, 0xa6, 0x1e, 0x80, 0x9f,
+                                                    0x9e, 0x8c, 0x9b, 0x1b, 0xd8, 0x64, 0x38, 0x6,
+                                                    0x94, 0x74, 0x95, 0x77, 0x5a, 0x1a, 0xfb, 0x0,
+                                                    0x24, 0x64, 0x53, 0x1e, 0x7e, 0x68, 0x90, 0x85,
+                                                    0x1b, 0x77, 0x88, 0x63, 0x62, 0x78, 0x1a, 0x74,
+                                                    0xbc, 0x87, 0xa8, 0x1e, 0xf7, 0x15, 0x85, 0x5,
+                                                    0xf6, 0x86, 0x99, 0x41, 0x6f, 0x1a, 0xfb, 0x5,
+                                                    0xfb, 0x3a, 0x53, 0x31, 0x26, 0x3f, 0xb7, 0xc0,
+                                                    0xb9, 0xba, 0xb1, 0xbe, 0xb1, 0x1e, 0xe, 0xa0,
+                                                    0x76, 0xf8, 0x2a, 0xc1, 0xf7, 0x73, 0x77, 0x1,
+                                                    0xd4, 0xdf, 0xf7, 0x4e, 0xdf, 0x3, 0x94, 0x16,
+                                                    0xf7, 0x6c, 0x9a, 0x6, 0x5a, 0x90, 0x78, 0x9a,
+                                                    0xd8, 0x1a, 0xf7, 0x7b, 0x7, 0xbb, 0xb4, 0xb2,
+                                                    0x9a, 0xa8, 0x1b, 0xc2, 0xa1, 0x64, 0x48, 0x1f,
+                                                    0xfb, 0x50, 0x7, 0x3e, 0x78, 0x7c, 0x5a, 0x86,
+                                                    0x1e, 0x7c, 0xf7, 0x68, 0x9a, 0x7, 0x59, 0x94,
+                                                    0x81, 0x9a, 0xd4, 0x1a, 0xf7, 0x51, 0x7, 0xb3,
+                                                    0x8a, 0xf7, 0xb, 0xfb, 0xf, 0x4f, 0x5a, 0x6b,
+                                                    0x59, 0x68, 0x1e, 0x89, 0xf7, 0xc2, 0x6, 0x86,
+                                                    0x8e, 0x5b, 0x7a, 0x59, 0x7d, 0x5e, 0x7e, 0x19,
+                                                    0x71, 0x7, 0x8c, 0x8e, 0x96, 0x82, 0xa, 0x76,
+                                                    0x6d, 0x1f, 0xfc, 0x57, 0x7, 0x42, 0x81, 0x7a,
+                                                    0x55, 0x84, 0x1e, 0xe, 0x8f, 0xa, 0xf8, 0xd9,
+                                                    0xf1, 0x12, 0xd9, 0xf0, 0x37, 0xdf, 0x13, 0xe0,
+                                                    0x31, 0x1d, 0x57, 0x78, 0x54, 0x78, 0x57, 0x7a,
+                                                    0x19, 0x7c, 0x7, 0x8d, 0x98, 0x9c, 0x8d, 0x99,
+                                                    0x1b, 0x13, 0xd0, 0x9b, 0x9e, 0x80, 0x50, 0x1f,
+                                                    0xfb, 0x68, 0x7, 0x3d, 0x7a, 0x7b, 0x4d, 0x88,
+                                                    0x1e, 0x13, 0xe0, 0xc9, 0xf8, 0xfd, 0x64, 0x1d,
+                                                    0x3c, 0xfb, 0x6e, 0xad, 0xf9, 0x91, 0xf1, 0x12,
+                                                    0xf3, 0xf0, 0x2b, 0xdf, 0x13, 0xd0, 0xab, 0xf8,
+                                                    0x1a, 0x15, 0x8d, 0x9a, 0x98, 0x8d, 0x99, 0x1b,
+                                                    0x9b, 0x9e, 0x80, 0x50, 0x1f, 0xfc, 0x5, 0x7,
+                                                    0x39, 0x8b, 0x52, 0x59, 0x78, 0x80, 0x9b, 0x9b,
+                                                    0x7e, 0x1e, 0x99, 0x7f, 0x7e, 0x99, 0x76, 0x1b,
+                                                    0x78, 0x76, 0x7c, 0x74, 0x66, 0xb9, 0x78, 0xba,
+                                                    0xf7, 0x15, 0xb4, 0xf0, 0xf7, 0x9, 0x1f, 0x8c,
+                                                    0xf8, 0x5d, 0x85, 0x8e, 0x57, 0x77, 0x57, 0x79,
+                                                    0x57, 0x7b, 0x19, 0x13, 0xe0, 0xc7, 0xf7, 0x76,
+                                                    0x64, 0x1d, 0xa0, 0x76, 0xf8, 0x56, 0x77, 0xf7,
+                                                    0x91, 0x77, 0x1, 0xdd, 0xdf, 0x3, 0x92, 0x16,
+                                                    0xf7, 0x7e, 0x9a, 0x6, 0x77, 0x8c, 0x5, 0x6a,
+                                                    0x8d, 0x75, 0x9d, 0xb4, 0x1a, 0xf7, 0x3f, 0x8d,
+                                                    0x7, 0xf7, 0x1e, 0xfb, 0x4c, 0x5, 0x97, 0x7a,
+                                                    0x94, 0x82, 0x84, 0x1a, 0x7e, 0x7e, 0x88, 0x83,
+                                                    0x1e, 0x78, 0x7c, 0xf7, 0x6e, 0x9a, 0x6, 0x70,
+                                                    0x8d, 0x64, 0x92, 0x58, 0xcb, 0xfb, 0x2d, 0xf7,
+                                                    0x56, 0x18, 0xa8, 0xa6, 0x5, 0xf7, 0x12, 0xf7,
+                                                    0x1b, 0xa7, 0x8b, 0xc0, 0x1b, 0x9a, 0xfb, 0x60,
+                                                    0x7d, 0x7, 0xb5, 0x93, 0x83, 0x80, 0x82, 0x83,
+                                                    0x80, 0x7c, 0x7d, 0x1f, 0x63, 0x69, 0x50, 0x54,
+                                                    0x67, 0x6c, 0x89, 0x8d, 0x18, 0xf8, 0x34, 0x7,
+                                                    0x87, 0x8d, 0x56, 0x7a, 0x56, 0x7d, 0x5a, 0x6f,
+                                                    0x1d, 0x93, 0x94, 0x8c, 0x98, 0x1b, 0xb2, 0x91,
+                                                    0x71, 0x5e, 0x1f, 0xfc, 0x70, 0x7, 0x69, 0x83,
+                                                    0x79, 0x48, 0x80, 0x1e, 0xe, 0x8f, 0xa, 0xf9,
+                                                    0x3f, 0x77, 0x1, 0xed, 0xdf, 0x3, 0x9e, 0x16,
+                                                    0xf7, 0x82, 0x9a, 0x6, 0x51, 0x8e, 0x7a, 0x9d,
+                                                    0xc5, 0x1a, 0xf8, 0xdf, 0x5d, 0xa, 0xfc, 0x67,
+                                                    0x7, 0x54, 0x77, 0x74, 0x50, 0x84, 0x1d, 0xf8,
+                                                    0x39, 0xa0, 0x76, 0xf8, 0x2c, 0xbf, 0x1, 0xe1,
+                                                    0xdf, 0xf7, 0x4c, 0xdf, 0xf7, 0x4c, 0xdf, 0x14,
+                                                    0x38, 0x9b, 0x16, 0xf7, 0x72, 0x9a, 0x6, 0x68,
+                                                    0x8c, 0x6a, 0x98, 0xcb, 0x1a, 0xf7, 0x94, 0x7,
+                                                    0x90, 0xb9, 0xc1, 0xd0, 0xbf, 0x9c, 0x64, 0x49,
+                                                    0x1e, 0xfb, 0x63, 0x7, 0x4a, 0x74, 0x7e, 0x5e,
+                                                    0x88, 0x1e, 0x7c, 0xf7, 0x74, 0x9a, 0x7, 0x62,
+                                                    0x8c, 0x6c, 0x9c, 0xca, 0x1a, 0xf7, 0x8f, 0x7,
+                                                    0xad, 0xa1, 0xad, 0xa6, 0xc2, 0x1b, 0xd3, 0x8c,
+                                                    0x50, 0x58, 0x1f, 0xfb, 0x5d, 0x7, 0x4b, 0x7b,
+                                                    0x7f, 0x59, 0x85, 0x1e, 0x7c, 0xf7, 0x6f, 0x9a,
+                                                    0x7, 0x71, 0x8d, 0x5, 0x5f, 0x92, 0x8c, 0xac,
+                                                    0xb3, 0x1a, 0xf7, 0x4d, 0x7, 0xd5, 0x7d, 0xf3,
+                                                    0x23, 0x3c, 0x4e, 0x4f, 0x73, 0x76, 0x1e, 0xb5,
+                                                    0x80, 0x6c, 0xb5, 0x4a, 0x1b, 0x55, 0x62, 0x6b,
+                                                    0x5e, 0x50, 0x1f, 0xd6, 0x7, 0x84, 0x8d, 0x5d,
+                                                    0x7a, 0x59, 0x7c, 0x5c, 0x7e, 0x19, 0x7a, 0x7,
+                                                    0x8d, 0x93, 0x98, 0x53, 0x1d, 0x4c, 0x1f, 0xfb,
+                                                    0x87, 0x7, 0x48, 0x6d, 0x7f, 0x63, 0x8a, 0x1e,
+                                                    0xe, 0xa0, 0x76, 0xf8, 0x2a, 0xc2, 0x73, 0xa,
+                                                    0xa5, 0xbe, 0x1a, 0xf7, 0x91, 0x7e, 0xa, 0xfb,
+                                                    0x6e, 0x7, 0x50, 0x71, 0x7e, 0x82, 0x1d, 0xa4,
+                                                    0xba, 0x1a, 0xf7, 0x6f, 0x46, 0xa, 0xe, 0x7f,
+                                                    0xa7, 0xf8, 0x35, 0xa7, 0x1, 0xb8, 0xe5, 0xf7,
+                                                    0x82, 0xe5, 0x3, 0xa8, 0xf7, 0x7a, 0x15, 0xfb,
+                                                    0x1b, 0xe5, 0x22, 0x65, 0x1d, 0xf7, 0x1d, 0xee,
+                                                    0xf7, 0x25, 0x2d, 0xe4, 0xfb, 0x17, 0xfb, 0x1a,
+                                                    0x39, 0x20, 0xfb, 0xf, 0x1e, 0xe5, 0xa0, 0x15,
+                                                    0xf3, 0xca, 0xd8, 0xca, 0xe7, 0xb6, 0x37, 0x80,
+                                                    0xa, 0x39, 0x4c, 0x58, 0xfb, 0xc, 0x83, 0xf7,
+                                                    0x33, 0xd5, 0x1e, 0xe, 0x8e, 0x1d, 0x1, 0xd6,
+                                                    0xdf, 0xf7, 0x75, 0xe1, 0x3, 0xf7, 0x33, 0xac,
+                                                    0x15, 0x5f, 0x1d, 0x76, 0x1f, 0x89, 0x8d, 0x5,
+                                                    0xd4, 0x7, 0x85, 0x8d, 0x5b, 0x78, 0x5b, 0x7a,
+                                                    0x5b, 0x7c, 0x19, 0x7b, 0x7, 0x8c, 0x94, 0x95,
+                                                    0x8b, 0x94, 0x1b, 0xae, 0x8e, 0x7a, 0x63, 0x1f,
+                                                    0xfc, 0x5e, 0x7, 0x60, 0x87, 0x6c, 0x49, 0x86,
+                                                    0x1e, 0x7a, 0xf7, 0x86, 0x9d, 0x7, 0x43, 0x7b,
+                                                    0xa1, 0xc5, 0x1f, 0xf7, 0x63, 0x4, 0x5a, 0xa,
+                                                    0xfb, 0x58, 0x76, 0xf7, 0x63, 0xc8, 0xf8, 0x11,
+                                                    0xa7, 0x1, 0xa3, 0xe1, 0xf7, 0x7b, 0xdf, 0x3,
+                                                    0xf7, 0x90, 0xfb, 0x5c, 0x15, 0x7a, 0xf7, 0x80,
+                                                    0x99, 0x7, 0x5e, 0x95, 0x79, 0x9b, 0xc7, 0x1a,
+                                                    0xf8, 0xd1, 0x7, 0x84, 0x8f, 0x51, 0x68, 0x5,
+                                                    0xa1, 0x64, 0x74, 0x98, 0x58, 0x1b, 0xfb, 0x11,
+                                                    0x29, 0xfb, 0x2, 0xfb, 0x1e, 0xfb, 0x2b, 0xd6,
+                                                    0x44, 0xe4, 0xc8, 0xd1, 0xb5, 0xa9, 0x9c, 0x1f,
+                                                    0x90, 0xfb, 0x44, 0x6, 0x59, 0x7d, 0x6a, 0x40,
+                                                    0x88, 0x1e, 0xe4, 0xf7, 0xdb, 0x15, 0x8a, 0x6b,
+                                                    0x8b, 0x7b, 0x57, 0x78, 0x8, 0x84, 0x79, 0x7a,
+                                                    0x89, 0x7c, 0x1b, 0x32, 0x64, 0xea, 0xe7, 0xf7,
+                                                    0xd, 0xc1, 0xd4, 0xdc, 0xea, 0x8c, 0x44, 0x6f,
+                                                    0x1f, 0xe, 0x73, 0xa0, 0x76, 0xf8, 0x21, 0xca,
+                                                    0x55, 0xc1, 0x12, 0xd7, 0xdf, 0x13, 0xd0, 0x90,
+                                                    0x16, 0xf7, 0x84, 0x9a, 0x6, 0x58, 0x8d, 0x69,
+                                                    0x99, 0xd0, 0x1a, 0xf7, 0x6b, 0x7, 0xab, 0xb7,
+                                                    0xbd, 0xa3, 0x98, 0x94, 0x81, 0x82, 0x95, 0x1e,
+                                                    0x83, 0x95, 0x95, 0x83, 0x9c, 0x1b, 0x13, 0xb0,
+                                                    0xa3, 0x99, 0x9e, 0xa4, 0xac, 0x77, 0xa0, 0x69,
+                                                    0x65, 0x69, 0x77, 0x44, 0x5c, 0x1f, 0x89, 0xe4,
+                                                    0x6, 0x86, 0x8d, 0x5a, 0x77, 0x59, 0x79, 0x5a,
+                                                    0x7b, 0x19, 0x7b, 0x7, 0x8d, 0x94, 0x96, 0x53,
+                                                    0x1d, 0x50, 0x1f, 0xfb, 0x7e, 0x7, 0x4b, 0x7b,
+                                                    0x80, 0x54, 0x81, 0x1e, 0xe, 0xab, 0x7d, 0xa1,
+                                                    0xf8, 0x3c, 0xa2, 0x87, 0x77, 0x12, 0xc9, 0xc9,
+                                                    0xf7, 0x2e, 0xd1, 0x57, 0x9a, 0x13, 0xd8, 0xbe,
+                                                    0x81, 0x15, 0x99, 0x91, 0x5, 0x94, 0x91, 0x99,
+                                                    0x8e, 0x97, 0x1b, 0x9c, 0x8c, 0x9d, 0x84, 0xa1,
+                                                    0x86, 0x8, 0x87, 0x9a, 0x9b, 0x88, 0x9d, 0x1b,
+                                                    0xcb, 0xdc, 0xb5, 0xe2, 0xc7, 0x68, 0x66, 0xa,
+                                                    0x1e, 0x13, 0xd4, 0xb7, 0xb4, 0x76, 0x25, 0xa1,
+                                                    0x1f, 0x9a, 0x6, 0x13, 0xb4, 0xf7, 0x1d, 0x80,
+                                                    0x7, 0x87, 0x88, 0x7c, 0x84, 0x82, 0x1b, 0x81,
+                                                    0x80, 0x91, 0x91, 0x7b, 0x1f, 0x8f, 0x7f, 0x7d,
+                                                    0x7c, 0x1d, 0xc5, 0x6a, 0x5, 0x13, 0xd8, 0xab,
+                                                    0x79, 0x9f, 0x73, 0x6b, 0x1a, 0x52, 0x5c, 0x95,
+                                                    0xa, 0x7a, 0x6, 0xe, 0x3c, 0x81, 0xbf, 0xf8,
+                                                    0x2, 0xab, 0x1, 0xd1, 0xdf, 0x3, 0xf7, 0x9e,
+                                                    0xd8, 0x15, 0x7e, 0x80, 0x79, 0x75, 0x6b, 0x1b,
+                                                    0x58, 0x8b, 0xc6, 0xaa, 0x1f, 0xf7, 0xa8, 0xf0,
+                                                    0xab, 0x26, 0xf7, 0x12, 0x7, 0x93, 0x8b, 0x90,
+                                                    0x84, 0x1e, 0x66, 0x56, 0x7c, 0x6b, 0x65, 0x64,
+                                                    0x8, 0x75, 0x75, 0x75, 0x85, 0x7f, 0x1a, 0x88,
+                                                    0x8d, 0x88, 0x8d, 0x8a, 0x1e, 0xc0, 0xfb, 0xb7,
+                                                    0x6, 0x27, 0xb4, 0x70, 0xbe, 0xb9, 0xba, 0xac,
+                                                    0xb6, 0xa3, 0x1e, 0xe, 0x81, 0xc7, 0xf8, 0x24,
+                                                    0x90, 0xa, 0xf7, 0xe6, 0x84, 0x15, 0x8d, 0x89,
+                                                    0xba, 0x9c, 0xb1, 0x99, 0xc1, 0x99, 0x19, 0x32,
+                                                    0xa, 0xfb, 0x75, 0x52, 0xa, 0x7d, 0x2c, 0x1d,
+                                                    0x9d, 0xbb, 0x8f, 0xb2, 0xb2, 0x1e, 0xb6, 0xb6,
+                                                    0x5, 0xe, 0x92, 0x76, 0xf8, 0x64, 0x77, 0x1,
+                                                    0x9e, 0xf8, 0x47, 0x15, 0x9f, 0x8a, 0x9f, 0x7b,
+                                                    0x9a, 0x6d, 0xaf, 0x44, 0xeb, 0xfb, 0x72, 0xa3,
+                                                    0x4d, 0x8, 0x60, 0x9b, 0x8d, 0x87, 0x94, 0x1b,
+                                                    0x92, 0x94, 0xa2, 0xa6, 0x96, 0x1f, 0xf7, 0x14,
+                                                    0xf7, 0xcb, 0xa3, 0xc6, 0x92, 0xa5, 0xad, 0x8e,
+                                                    0x19, 0x9a, 0xfb, 0x1f, 0x7c, 0x7, 0xa4, 0x8a,
+                                                    0xa1, 0x78, 0x74, 0x1a, 0x67, 0x44, 0xfb, 0x26,
+                                                    0x69, 0x2b, 0x1e, 0x25, 0xf7, 0x8a, 0x5, 0x88,
+                                                    0x93, 0x85, 0x9a, 0x97, 0x1a, 0xa4, 0xa1, 0x98,
+                                                    0xa3, 0x8d, 0x1e, 0x9a, 0xfb, 0x58, 0x7, 0xe,
+                                                    0xf8, 0x1, 0x92, 0x76, 0xf8, 0x64, 0x77, 0x12,
+                                                    0xa0, 0xf7, 0x48, 0xf8, 0x6, 0xf7, 0xf, 0x17,
+                                                    0xa0, 0xf8, 0x47, 0x15, 0xa4, 0x89, 0x93, 0x74,
+                                                    0x9f, 0x5b, 0xf7, 0x1b, 0xfb, 0xe0, 0x18, 0x69,
+                                                    0x99, 0x90, 0x81, 0x92, 0x1b, 0x91, 0x90, 0x96,
+                                                    0xa7, 0x99, 0x1f, 0xf7, 0x4, 0xf7, 0x84, 0xe6,
+                                                    0xfb, 0x80, 0x5, 0x67, 0x99, 0x8d, 0x84, 0x93,
+                                                    0x1b, 0x93, 0x8f, 0x95, 0xb2, 0x9b, 0x1f, 0xf7,
+                                                    0x1e, 0xf7, 0xe4, 0x9a, 0xb0, 0x90, 0x9f, 0xa0,
+                                                    0x92, 0x19, 0x13, 0x70, 0x9a, 0xfb, 0xf, 0x7c,
+                                                    0x7, 0xa3, 0x86, 0x9f, 0x7d, 0x73, 0x1a, 0x7f,
+                                                    0x85, 0x70, 0x80, 0x72, 0x1e, 0x31, 0xfb, 0x68,
+                                                    0x3b, 0xf7, 0x6a, 0x5, 0x7c, 0xb2, 0x85, 0x8c,
+                                                    0x9d, 0x1a, 0xa8, 0xa4, 0x98, 0xac, 0x90, 0x1e,
+                                                    0x9a, 0xfb, 0x5f, 0x7c, 0x7, 0xb4, 0x86, 0x96,
+                                                    0x84, 0xb0, 0xfb, 0x5, 0x30, 0xfb, 0x5b, 0x18,
+                                                    0x5d, 0xf7, 0x14, 0x50, 0xf7, 0x9, 0xae, 0x1a,
+                                                    0xa7, 0xa2, 0x99, 0xa2, 0x8d, 0x1e, 0x9a, 0xfb,
+                                                    0x48, 0x7, 0xe, 0xa0, 0x76, 0xf8, 0x59, 0x77,
+                                                    0x12, 0x9c, 0xf7, 0x25, 0xf7, 0x8, 0xf7, 0x5d,
+                                                    0x17, 0x9c, 0x16, 0xf7, 0x25, 0x9a, 0x6, 0x7a,
+                                                    0x76, 0x95, 0x9d, 0x89, 0x1f, 0x96, 0x99, 0xa0,
+                                                    0x91, 0x94, 0x1e, 0x13, 0xf0, 0xda, 0xf7, 0x5,
+                                                    0xdc, 0xfb, 0x6, 0x5, 0x8f, 0x86, 0x97, 0x7f,
+                                                    0x7c, 0x1a, 0x76, 0x82, 0x7d, 0x6c, 0x8a, 0x1e,
+                                                    0x7c, 0xf7, 0x5d, 0x9a, 0x7, 0x7a, 0x8c, 0x70,
+                                                    0x96, 0x65, 0xc5, 0xfb, 0x14, 0xf7, 0x4e, 0x18,
+                                                    0xde, 0xf7, 0x2, 0x93, 0x98, 0xa9, 0xb3, 0xb6,
+                                                    0x8c, 0x19, 0x9a, 0xfb, 0x32, 0x7c, 0x7, 0x9c,
+                                                    0x8a, 0xa2, 0x80, 0x76, 0x1a, 0x80, 0x85, 0x82,
+                                                    0x4e, 0x33, 0x1e, 0x78, 0xa8, 0x62, 0xc8, 0x9d,
+                                                    0x1a, 0xa0, 0xa4, 0x97, 0x9d, 0x1e, 0x9a, 0xfb,
+                                                    0x63, 0x7c, 0x7, 0xac, 0x8c, 0x97, 0x81, 0xb4,
+                                                    0x4e, 0xe9, 0xfb, 0x1a, 0x18, 0xfb, 0x6, 0xfb,
+                                                    0x2f, 0x6b, 0x5d, 0x7d, 0x7f, 0x70, 0x88, 0x19,
+                                                    0xe, 0x96, 0xa, 0xf8, 0xca, 0x77, 0x12, 0x13,
+                                                    0xa0, 0xf7, 0x86, 0xa1, 0x15, 0x68, 0x85, 0x68,
+                                                    0xfb, 0xd, 0x57, 0x1b, 0x13, 0x60, 0x45, 0xa,
+                                                    0x9b, 0xb4, 0x9e, 0x4a, 0xa, 0x3d, 0xfb, 0x68,
+                                                    0x3b, 0xa, 0x8, 0xe, 0xe2, 0x61, 0xa9, 0xf8,
+                                                    0x46, 0xa9, 0x6a, 0xa, 0x7b, 0x6c, 0x21, 0x1b,
+                                                    0xfb, 0x14, 0x56, 0x1d, 0xe, 0x92, 0xa, 0x12,
+                                                    0xf7, 0x47, 0xd5, 0x47, 0xd5, 0x13, 0xe0, 0xef,
+                                                    0xf7, 0x8e, 0x15, 0x13, 0xd0, 0xd0, 0x78, 0x9b,
+                                                    0x5f, 0x4b, 0x98, 0xa, 0xfb, 0xc, 0xc9, 0x77,
+                                                    0xf2, 0x1e, 0x96, 0x7, 0x44, 0x9b, 0x77, 0xb5,
+                                                    0xd0, 0x1a, 0xf7, 0x38, 0x7, 0xd2, 0x7e, 0xb2,
+                                                    0x3d, 0x9c, 0x1e, 0x8d, 0x7, 0xd9, 0x9d, 0x98,
+                                                    0xb2, 0xd2, 0x1a, 0xf7, 0x38, 0x7, 0xd0, 0x9f,
+                                                    0xb5, 0xd2, 0x9b, 0x1e, 0x96, 0x7, 0x24, 0x4d,
+                                                    0x77, 0xfb, 0xb, 0x1f, 0xfb, 0x3b, 0x7, 0x4b,
+                                                    0x7b, 0x61, 0x46, 0x79, 0x1e, 0xe, 0xfb, 0x31,
+                                                    0xfb, 0x2a, 0x76, 0xf7, 0x46, 0x7a, 0x1d, 0xce,
+                                                    0xcd, 0x55, 0xb4, 0x3, 0xda, 0xfb, 0x3f, 0x15,
+                                                    0xb4, 0xf9, 0xe3, 0x62, 0x6, 0xe, 0x92, 0xa,
+                                                    0x1, 0xf7, 0x70, 0xd5, 0x3, 0xf7, 0x16, 0xfb,
+                                                    0x3e, 0x15, 0x80, 0x7, 0xf2, 0xc8, 0x9f, 0xf7,
+                                                    0xc, 0x1f, 0xf7, 0x38, 0x7, 0xcb, 0x9c, 0xb7,
+                                                    0xd0, 0x9e, 0x1e, 0x46, 0x9d, 0x7a, 0xb5, 0xcb,
+                                                    0x1a, 0xf7, 0x3b, 0x7, 0xf7, 0xb, 0x4e, 0x9f,
+                                                    0x24, 0x1e, 0x80, 0x7, 0xd2, 0x7b, 0x9e, 0x61,
+                                                    0x46, 0x98, 0xa, 0x44, 0x98, 0x64, 0xd9, 0x79,
+                                                    0x1e, 0x89, 0x7, 0x3d, 0x7a, 0x7e, 0x64, 0x44,
+                                                    0x98, 0xa, 0x46, 0x78, 0x61, 0x44, 0x7b, 0x1e,
+                                                    0xe, 0xf7, 0x4c, 0xf7, 0x4b, 0xcb, 0x97, 0xcb,
+                                                    0x1, 0xd7, 0xf7, 0x4b, 0x15, 0xae, 0x9b, 0xa3,
+                                                    0xb4, 0xb7, 0x1b, 0xba, 0xa7, 0x79, 0x79, 0xa6,
+                                                    0x1f, 0x77, 0xa8, 0xa9, 0x77, 0xc3, 0x1b, 0xc9,
+                                                    0xac, 0xbb, 0xb5, 0xa9, 0x1f, 0x67, 0xbd, 0x5,
+                                                    0x68, 0x74, 0x72, 0x62, 0x63, 0x1b, 0x6d, 0x6e,
+                                                    0x9e, 0x9e, 0x69, 0x1f, 0x9e, 0x69, 0x64, 0x9e,
+                                                    0x5c, 0x1b, 0x48, 0x67, 0x5b, 0x61, 0x75, 0x1f,
+                                                    0xe, 0x73, 0xfb, 0x59, 0x76, 0xf8, 0xd5, 0xf7,
+                                                    0x0, 0x1, 0xec, 0xf7, 0x0, 0x3, 0xf7, 0x23,
+                                                    0xf7, 0xac, 0x15, 0x98, 0x6, 0xa5, 0xfb, 0x5d,
+                                                    0xa2, 0xfb, 0x48, 0x73, 0x1a, 0x5a, 0x7f, 0x5f,
+                                                    0x5f, 0x61, 0x81, 0xb2, 0xbf, 0xa4, 0xa0, 0xf7,
+                                                    0x49, 0xa4, 0xf7, 0x5d, 0x1e, 0x5d, 0xf7, 0x19,
+                                                    0x15, 0x6d, 0xa3, 0x73, 0xa9, 0xa9, 0xa3, 0xa3,
+                                                    0xa9, 0xa9, 0x73, 0xa3, 0x6d, 0x6d, 0x73, 0x73,
+                                                    0x6d, 0x1e, 0xe, 0x87, 0xd4, 0x52, 0xbf, 0xf7,
+                                                    0xfc, 0xa9, 0x73, 0xa9, 0x12, 0xca, 0xd8, 0x13,
+                                                    0xa8, 0xf7, 0xa, 0xfb, 0x1e, 0x15, 0xad, 0x6,
+                                                    0xbc, 0xf7, 0x1e, 0x5, 0x86, 0x9d, 0x99, 0x87,
+                                                    0xa1, 0x1b, 0xe2, 0xc6, 0xc8, 0xf3, 0xba, 0x1f,
+                                                    0x7e, 0x93, 0x5, 0x13, 0x68, 0x45, 0x5d, 0x62,
+                                                    0x6d, 0x4d, 0x1b, 0x74, 0x7c, 0x90, 0x92, 0x78,
+                                                    0x1f, 0xf0, 0xf7, 0xb7, 0x5, 0x67, 0x9b, 0x9a,
+                                                    0x7b, 0xa8, 0x1b, 0xa2, 0x9d, 0x9e, 0xa5, 0xad,
+                                                    0x6b, 0xaf, 0x60, 0x99, 0x1f, 0xba, 0xf7, 0x1b,
+                                                    0x5, 0x68, 0x6, 0x5f, 0xfb, 0x10, 0x5, 0x13,
+                                                    0x98, 0x8e, 0x78, 0x7b, 0x8d, 0x7b, 0x1b, 0xfb,
+                                                    0x19, 0x34, 0xfb, 0x7, 0xfb, 0xe, 0x1f, 0x13,
+                                                    0x68, 0x3f, 0xac, 0x3c, 0xde, 0x53, 0x1e, 0xa8,
+                                                    0xe1, 0x15, 0x5c, 0xb1, 0x76, 0xbf, 0xce, 0x1a,
+                                                    0x13, 0x98, 0xf7, 0x19, 0xde, 0xb5, 0xbf, 0xa1,
+                                                    0x98, 0x87, 0x86, 0x98, 0x1e, 0xe, 0x83, 0xa7,
+                                                    0x6f, 0xdf, 0x37, 0xf7, 0x1e, 0xf7, 0x5a, 0xb8,
+                                                    0xf7, 0x31, 0xf7, 0x26, 0x70, 0xa6, 0x12, 0xf7,
+                                                    0xf, 0xe0, 0xf7, 0x2b, 0xe4, 0x13, 0x57, 0xf7,
+                                                    0x46, 0xc1, 0x15, 0x6c, 0xb7, 0xba, 0x6c, 0xbe,
+                                                    0x1b, 0xd7, 0xe9, 0xda, 0xcc, 0x90, 0x88, 0x8b,
+                                                    0x88, 0x1f, 0x76, 0x75, 0x4a, 0x2f, 0x1b, 0x6b,
+                                                    0x53, 0x92, 0xa7, 0x4d, 0x1f, 0xa2, 0xed, 0x8e,
+                                                    0xac, 0x89, 0xc6, 0x8a, 0xa6, 0x18, 0xf7, 0x18,
+                                                    0xb8, 0xfb, 0x1b, 0x6, 0x84, 0xc4, 0x87, 0xab,
+                                                    0xbe, 0x1a, 0xae, 0x93, 0xf0, 0xe2, 0x97, 0xb7,
+                                                    0x8b, 0x57, 0x1e, 0x13, 0x3b, 0x6a, 0x8b, 0x69,
+                                                    0xb3, 0xa4, 0xa3, 0x9e, 0xad, 0xb9, 0x5d, 0xba,
+                                                    0x37, 0x22, 0x31, 0x42, 0xfb, 0x37, 0x6b, 0x8e,
+                                                    0x7d, 0x8f, 0x76, 0x1e, 0x20, 0x5e, 0xf7, 0x0,
+                                                    0x6, 0x90, 0x60, 0x90, 0x69, 0x8f, 0x6e, 0x90,
+                                                    0x64, 0x8f, 0x6d, 0x86, 0x6f, 0x8, 0x8f, 0x7d,
+                                                    0x7d, 0x8c, 0x7d, 0x1b, 0x59, 0x5e, 0x72, 0x57,
+                                                    0x60, 0xae, 0x79, 0xab, 0xb9, 0xa5, 0xa9, 0xab,
+                                                    0xa6, 0x1f, 0xfb, 0x20, 0x8d, 0x15, 0xa8, 0xab,
+                                                    0x94, 0xa7, 0xa2, 0xa0, 0x83, 0x82, 0x1e, 0x13,
+                                                    0x9b, 0x81, 0x7b, 0x5c, 0x5b, 0x75, 0x79, 0x9a,
+                                                    0xa0, 0x1e, 0xe, 0xf7, 0x1d, 0xc4, 0xf7, 0xa4,
+                                                    0xc4, 0x12, 0xaf, 0xce, 0x5d, 0xc8, 0xf7, 0x9c,
+                                                    0xc8, 0x5d, 0xce, 0x13, 0xd4, 0xf7, 0xa, 0xf7,
+                                                    0xdf, 0x15, 0xd3, 0xc4, 0xca, 0xd7, 0x1e, 0x13,
+                                                    0xe8, 0xd6, 0xc3, 0x4c, 0x43, 0x41, 0x53, 0x4c,
+                                                    0x40, 0x1f, 0x13, 0xd4, 0x3f, 0x52, 0xca, 0xd5,
+                                                    0x1f, 0x47, 0xfb, 0x8a, 0x15, 0xe2, 0xe3, 0x5,
+                                                    0x74, 0xa5, 0xb6, 0x7e, 0xb6, 0x1b, 0xb7, 0xb7,
+                                                    0x97, 0xa3, 0xa5, 0x1f, 0xe4, 0x33, 0xb6, 0xb8,
+                                                    0x34, 0xe2, 0x5, 0x13, 0xe8, 0xa4, 0xa7, 0x95,
+                                                    0xbb, 0xb9, 0x1a, 0xb3, 0x7e, 0xb2, 0x75, 0xa4,
+                                                    0x1e, 0xe2, 0xe4, 0x60, 0xb6, 0x32, 0x34, 0x5,
+                                                    0xa3, 0x71, 0x5f, 0x96, 0x60, 0x1b, 0x60, 0x5f,
+                                                    0x7f, 0x74, 0x71, 0x1f, 0x34, 0xe2, 0x5e, 0x60,
+                                                    0xe3, 0x32, 0x5, 0x13, 0xd4, 0x74, 0x72, 0x7e,
+                                                    0x62, 0x60, 0x1a, 0x5e, 0x96, 0x5e, 0xa4, 0x70,
+                                                    0x1e, 0x33, 0x34, 0x5, 0xe, 0xa0, 0x76, 0xf7,
+                                                    0x4a, 0xb3, 0xe5, 0xb3, 0xf7, 0xca, 0x77, 0x1,
+                                                    0xf7, 0x52, 0xe0, 0x3, 0xf7, 0x3, 0x16, 0xf7,
+                                                    0x88, 0x9e, 0x6, 0x52, 0x8c, 0x74, 0xa3, 0xd6,
+                                                    0x1a, 0xca, 0xf7, 0x41, 0xb3, 0xfb, 0x41, 0xd7,
+                                                    0x7, 0x92, 0x99, 0x5, 0xf7, 0x3a, 0xb3, 0xfb,
+                                                    0x26, 0x6, 0xe7, 0xf7, 0x42, 0xad, 0xce, 0xaf,
+                                                    0xb4, 0xbb, 0x94, 0x19, 0x9e, 0xfb, 0x57, 0x78,
+                                                    0x7, 0xae, 0x8e, 0xa9, 0x77, 0x73, 0x1a, 0x7b,
+                                                    0x85, 0x7e, 0x83, 0x7c, 0x1e, 0xfb, 0x4, 0xfb,
+                                                    0x66, 0xfb, 0xa, 0xf7, 0x67, 0x5, 0x83, 0x9a,
+                                                    0x86, 0x9c, 0x97, 0x1a, 0xa0, 0x9d, 0x9f, 0xba,
+                                                    0x8a, 0x1e, 0x9e, 0xfb, 0x87, 0x78, 0x7, 0xbe,
+                                                    0x8a, 0xa0, 0x5f, 0xb9, 0x38, 0xea, 0xfb, 0x37,
+                                                    0x18, 0xfb, 0x24, 0x63, 0xf7, 0x3b, 0x6, 0x92,
+                                                    0x7d, 0x5, 0x3f, 0xfb, 0x42, 0x63, 0xf7, 0x42,
+                                                    0x4e, 0x7, 0x53, 0x83, 0x5f, 0x44, 0x89, 0x1e,
+                                                    0xe, 0xfb, 0x31, 0x92, 0x7a, 0x1d, 0xd9, 0xb7,
+                                                    0x3, 0xd9, 0xf8, 0x1d, 0x15, 0xb7, 0xf7, 0xaf,
+                                                    0x5f, 0x6, 0xfd, 0x46, 0x4, 0xb7, 0xf7, 0xa9,
+                                                    0x5f, 0x6, 0xe, 0xfb, 0x29, 0xa0, 0xf7, 0x74,
+                                                    0xa0, 0xf8, 0xd0, 0x77, 0x12, 0xcb, 0xc0, 0xf7,
+                                                    0x67, 0xed, 0x2b, 0xc3, 0x13, 0xf8, 0xf7, 0xbc,
+                                                    0xf7, 0x11, 0x15, 0xe1, 0x83, 0xb7, 0xca, 0xce,
+                                                    0x1a, 0xc6, 0x62, 0xc1, 0x5b, 0xb3, 0x1e, 0xfb,
+                                                    0x1d, 0xf7, 0x5, 0x5, 0x72, 0xa0, 0x82, 0xaa,
+                                                    0x9f, 0x1a, 0xa2, 0x9e, 0xba, 0xc7, 0xb9, 0xa1,
+                                                    0x72, 0x79, 0x87, 0x7f, 0x84, 0x81, 0x7f, 0x1e,
+                                                    0x85, 0x83, 0x85, 0x81, 0x7e, 0x1a, 0x7d, 0x94,
+                                                    0x6e, 0xb1, 0xae, 0x9b, 0xa3, 0xa9, 0x1e, 0x13,
+                                                    0xf4, 0xc5, 0x4e, 0xbc, 0x4b, 0x42, 0x46, 0x65,
+                                                    0x37, 0x48, 0xb5, 0x68, 0xc2, 0x5d, 0x1e, 0x89,
+                                                    0x89, 0x5, 0x38, 0x95, 0x57, 0x51, 0x41, 0x1a,
+                                                    0x5a, 0xa8, 0x51, 0xd0, 0x56, 0x1e, 0xf7, 0x26,
+                                                    0xfb, 0x4, 0x9b, 0x7b, 0x61, 0x1a, 0x59, 0x68,
+                                                    0x6e, 0x5a, 0x54, 0x78, 0xad, 0x96, 0x1e, 0x98,
+                                                    0xad, 0x95, 0xad, 0x1a, 0x9c, 0x7c, 0xa3, 0x6a,
+                                                    0x71, 0x6f, 0x79, 0x67, 0x52, 0xc8, 0x56, 0xda,
+                                                    0xec, 0xb8, 0xca, 0xca, 0xc3, 0x71, 0xac, 0x49,
+                                                    0xc3, 0x1e, 0xfb, 0x3f, 0xf7, 0x56, 0x15, 0xbb,
+                                                    0xb2, 0x9d, 0xa9, 0xc2, 0xf7, 0x13, 0xfb, 0x0,
+                                                    0x50, 0x5f, 0x69, 0x71, 0x66, 0x4c, 0xfb, 0x9,
+                                                    0xed, 0xd4, 0x1e, 0xe, 0x73, 0xf8, 0x9f, 0xef,
+                                                    0x1, 0x9d, 0xed, 0xf0, 0xed, 0x3, 0x9d, 0xf8,
+                                                    0xd1, 0x15, 0x6e, 0x1d, 0xf7, 0x5b, 0x16, 0x6e,
+                                                    0x1d, 0xe, 0xf8, 0x27, 0x7d, 0xb5, 0xf7, 0x2e,
+                                                    0x9f, 0xf7, 0x9f, 0x9f, 0xf7, 0x25, 0xb5, 0x1,
+                                                    0xb1, 0xc2, 0xf1, 0xd8, 0xf7, 0x97, 0x9b, 0xf7,
+                                                    0xc, 0xc2, 0x3, 0xb1, 0xf7, 0xde, 0x3e, 0xa,
+                                                    0x69, 0xa, 0xf8, 0x4a, 0x38, 0x15, 0x5d, 0x77,
+                                                    0x68, 0x63, 0x49, 0x1b, 0x25, 0x61, 0xd8, 0xf4,
+                                                    0x8c, 0x1f, 0xec, 0x8c, 0xb6, 0xd3, 0xe8, 0x1b,
+                                                    0xd9, 0xa7, 0x52, 0x61, 0x8f, 0x1f, 0x9c, 0xdb,
+                                                    0x6, 0xa9, 0x36, 0x94, 0x64, 0xfb, 0x2c, 0x4a,
+                                                    0xfb, 0x2, 0x38, 0xfb, 0x21, 0xea, 0x52, 0xf7,
+                                                    0x7, 0xcc, 0xb0, 0x95, 0xa5, 0xa8, 0x1e, 0x9b,
+                                                    0xd1, 0x5, 0xe, 0x3a, 0xf8, 0x33, 0x76, 0xf7,
+                                                    0x92, 0xa7, 0x12, 0x9b, 0xca, 0xd9, 0xd3, 0x17,
+                                                    0xf7, 0x32, 0xf8, 0xbb, 0x15, 0x48, 0x7, 0x8a,
+                                                    0x85, 0x8b, 0x84, 0x81, 0x82, 0x8, 0x88, 0x85,
+                                                    0x77, 0x79, 0x7d, 0x1b, 0x73, 0x7b, 0x9d, 0xa8,
+                                                    0x9e, 0xa2, 0xa1, 0xcf, 0xa1, 0x1f, 0x93, 0x24,
+                                                    0x15, 0x5f, 0x92, 0xa6, 0x81, 0x97, 0x1b, 0x96,
+                                                    0x9f, 0x8c, 0xa8, 0xa6, 0x1f, 0x9d, 0x7, 0x85,
+                                                    0x84, 0x82, 0x85, 0x7f, 0x1b, 0x7e, 0x8b, 0x97,
+                                                    0xa2, 0x1f, 0xf7, 0x7, 0x7, 0xac, 0x84, 0xca,
+                                                    0x2a, 0x40, 0x69, 0x68, 0x6b, 0x7d, 0x96, 0x7a,
+                                                    0x9f, 0x9f, 0x97, 0x98, 0x98, 0xa5, 0x89, 0x9d,
+                                                    0xb8, 0xa2, 0x97, 0x7a, 0x54, 0x1e, 0x2d, 0x69,
+                                                    0x50, 0x76, 0x4f, 0x1a, 0x13, 0x80, 0x5e, 0xb0,
+                                                    0x75, 0xae, 0xae, 0xae, 0x9f, 0xad, 0x9f, 0x1e,
+                                                    0xe, 0x79, 0xa, 0xb5, 0xf7, 0x77, 0x50, 0xa,
+                                                    0xa4, 0xaf, 0x92, 0x1a, 0x92, 0x89, 0x8f, 0x83,
+                                                    0x1e, 0x78, 0xfb, 0x51, 0x50, 0xa, 0xa5, 0xaf,
+                                                    0x92, 0x96, 0x1d, 0xf7, 0x63, 0xf7, 0x15, 0x76,
+                                                    0xf7, 0x68, 0xcd, 0x63, 0xb3, 0x12, 0xf8, 0x68,
+                                                    0xcd, 0x5e, 0xb8, 0x13, 0xd0, 0x13, 0xa8, 0xa9,
+                                                    0xf7, 0xee, 0x15, 0xf8, 0x5f, 0xfb, 0x82, 0xb8,
+                                                    0xf7, 0xaa, 0xfc, 0x8c, 0x6, 0xe, 0xf8, 0x27,
+                                                    0x7d, 0xb5, 0x7d, 0xf7, 0x49, 0xf7, 0xcd, 0xf7,
+                                                    0x43, 0x12, 0xb1, 0xc2, 0xf7, 0x43, 0xcb, 0xf7,
+                                                    0x4, 0xce, 0xf7, 0x30, 0xc2, 0x13, 0x7e, 0xf7,
+                                                    0x6f, 0xf7, 0x2c, 0x15, 0xf7, 0x36, 0x9a, 0x6,
+                                                    0x59, 0x90, 0x8c, 0x95, 0xb6, 0x1a, 0xda, 0xbb,
+                                                    0x7, 0x2d, 0xcb, 0xa4, 0x51, 0xab, 0x1b, 0xcb,
+                                                    0x93, 0x6, 0x78, 0x9a, 0x6c, 0xad, 0x71, 0xaf,
+                                                    0x52, 0xd0, 0x18, 0xb8, 0x9a, 0xad, 0xb1, 0xbf,
+                                                    0x1a, 0xca, 0x53, 0xb1, 0x50, 0x1e, 0xfb, 0x45,
+                                                    0x7c, 0x6, 0xa1, 0x87, 0xa6, 0x8b, 0x70, 0x1a,
+                                                    0xfb, 0x8d, 0x7, 0x60, 0x8c, 0x81, 0x59, 0x86,
+                                                    0x1e, 0xf7, 0x5, 0xf7, 0x30, 0x15, 0xf7, 0x46,
+                                                    0xb4, 0x7, 0xb2, 0xab, 0x6d, 0x52, 0x56, 0x77,
+                                                    0x65, 0x5a, 0x1f, 0xfb, 0xe5, 0x92, 0x3e, 0xa,
+                                                    0x1e, 0x13, 0xbe, 0x69, 0xa, 0xe, 0x73, 0xf8,
+                                                    0xb7, 0xc1, 0x1, 0x96, 0xf8, 0xb7, 0x15, 0xf7,
+                                                    0xcb, 0xc1, 0xfb, 0xcb, 0x6, 0xe, 0xb6, 0xf8,
+                                                    0x1a, 0xad, 0xf7, 0x6e, 0xad, 0x1, 0xc4, 0xb2,
+                                                    0xf7, 0x64, 0xb2, 0x3, 0xeb, 0xf8, 0xa9, 0x15,
+                                                    0xc5, 0xb9, 0xbe, 0xc5, 0xc5, 0xb9, 0x58, 0x51,
+                                                    0x51, 0x5d, 0x58, 0x51, 0x51, 0x5d, 0xbe, 0xc5,
+                                                    0x1e, 0x64, 0x16, 0x3b, 0xca, 0x4c, 0xdb, 0xdb,
+                                                    0xca, 0xca, 0xdb, 0xdb, 0x4c, 0xca, 0x3b, 0x3b,
+                                                    0x4c, 0x4c, 0x3b, 0x1e, 0xe, 0xf7, 0x63, 0x8b,
+                                                    0xcd, 0xc3, 0x77, 0xf7, 0x48, 0xcd, 0x54, 0xb6,
+                                                    0xf7, 0x3e, 0x77, 0x12, 0xf7, 0x8d, 0xcd, 0x55,
+                                                    0xb3, 0x13, 0xec, 0xa9, 0x16, 0xf8, 0x8c, 0xb5,
+                                                    0xfc, 0x8c, 0x6, 0x13, 0xea, 0xf7, 0x7b, 0xdb,
+                                                    0x15, 0xb3, 0x6, 0x13, 0xda, 0xf7, 0x3f, 0xf7,
+                                                    0x7d, 0xb6, 0xfb, 0x7d, 0xf7, 0x3e, 0x63, 0xfb,
+                                                    0x3e, 0xfb, 0x7b, 0x60, 0xf7, 0x7b, 0x7, 0xe,
+                                                    0x52, 0xf7, 0xa2, 0xcc, 0xf7, 0xaa, 0xca, 0x1,
+                                                    0xf7, 0x4d, 0xe7, 0x3, 0x90, 0xf7, 0xa2, 0x15,
+                                                    0xf7, 0x92, 0x56, 0xa, 0x67, 0x8b, 0x1d, 0xb4,
+                                                    0x7f, 0x1d, 0x28, 0x20, 0x5, 0xe, 0x52, 0xf7,
+                                                    0x9a, 0x85, 0x1d, 0x13, 0xd0, 0xdf, 0xf8, 0x60,
+                                                    0x77, 0xa, 0x79, 0x7c, 0x96, 0x95, 0x7d, 0x1e,
+                                                    0x94, 0x7e, 0x7e, 0x94, 0x7d, 0x63, 0xa, 0x13,
+                                                    0xe0, 0x4e, 0x1d, 0x92, 0x1d, 0xe8, 0xf8, 0x8f,
+                                                    0x24, 0xa, 0xfb, 0x59, 0x76, 0xf7, 0x64, 0xc9,
+                                                    0xf8, 0x22, 0x77, 0x12, 0xaf, 0xe7, 0x47, 0xab,
+                                                    0x6b, 0xe3, 0xf7, 0x56, 0xe3, 0x13, 0xea, 0xe7,
+                                                    0xc5, 0x15, 0x8d, 0x8d, 0x5, 0x4f, 0xab, 0xc1,
+                                                    0x81, 0xaa, 0x1b, 0xbe, 0xbf, 0xb9, 0xbe, 0xa8,
+                                                    0x1f, 0x8d, 0x6, 0x62, 0x9c, 0x53, 0xbf, 0xaf,
+                                                    0xa7, 0x95, 0xba, 0xad, 0x1e, 0x93, 0x7, 0x77,
+                                                    0x76, 0x7d, 0x83, 0x7c, 0x1b, 0x6b, 0x8b, 0xb5,
+                                                    0xa2, 0x1f, 0xf7, 0xfa, 0x33, 0xfb, 0xd9, 0x7,
+                                                    0x72, 0x7f, 0x60, 0x5b, 0x58, 0x1b, 0x13, 0xe6,
+                                                    0x4f, 0x6f, 0xb1, 0xc1, 0x1f, 0xf7, 0xc6, 0x33,
+                                                    0xfc, 0x20, 0x7, 0x13, 0xf2, 0x4d, 0x73, 0x3c,
+                                                    0x4f, 0x1a, 0x5c, 0x95, 0x73, 0xaf, 0xaf, 0x95,
+                                                    0xa3, 0xba, 0x1e, 0x13, 0xea, 0xc7, 0x6d, 0xda,
+                                                    0x85, 0xcd, 0x1e, 0xe, 0xeb, 0xfb, 0x57, 0x76,
+                                                    0xf9, 0xe7, 0xa6, 0x1, 0xf7, 0x7a, 0xaf, 0xe6,
+                                                    0xaf, 0x3, 0xf7, 0x7a, 0xfb, 0x6c, 0x15, 0xaf,
+                                                    0xf9, 0xe7, 0xe6, 0xfd, 0xe7, 0xaf, 0xf9, 0xe7,
+                                                    0xcb, 0xa6, 0xfb, 0x87, 0x6, 0xfb, 0x20, 0x3d,
+                                                    0x4f, 0xfb, 0x11, 0xfb, 0x11, 0xd9, 0x50, 0xf7,
+                                                    0x30, 0x1f, 0xe, 0x20, 0xf7, 0x70, 0x76, 0xf7,
+                                                    0x3, 0x77, 0x1, 0xd1, 0xf7, 0x3, 0x3, 0xd1,
+                                                    0xf7, 0x91, 0x15, 0x43, 0x1d, 0xe, 0x73, 0xfb,
+                                                    0x6b, 0xf7, 0x2d, 0xc9, 0x77, 0x1, 0xf7, 0x4e,
+                                                    0xd6, 0x3, 0xeb, 0x23, 0x15, 0x92, 0x86, 0x5,
+                                                    0x8f, 0x98, 0x9c, 0x8d, 0x9a, 0x1b, 0xa0, 0x9c,
+                                                    0x81, 0x75, 0x68, 0x70, 0x81, 0x6c, 0x76, 0x74,
+                                                    0x91, 0x91, 0x79, 0x1f, 0x7d, 0x6c, 0x5, 0x83,
+                                                    0xac, 0x9e, 0x83, 0xb5, 0x1b, 0xba, 0xcf, 0xb7,
+                                                    0xb2, 0xb8, 0x68, 0xa4, 0x60, 0x80, 0x7f, 0x8a,
+                                                    0x89, 0x80, 0x1f, 0xa4, 0xcc, 0x5, 0x68, 0x6,
+                                                    0xe, 0x52, 0xf7, 0xa2, 0xa3, 0xf8, 0x12, 0x77,
+                                                    0x1, 0xf7, 0x2, 0xdc, 0x3, 0xc4, 0xf7, 0xa2,
+                                                    0x35, 0xa, 0xfb, 0x86, 0x7, 0x69, 0x73, 0x80,
+                                                    0x6e, 0x89, 0x1e, 0xe, 0x5c, 0xf8, 0x1e, 0xac,
+                                                    0xf7, 0x6c, 0xac, 0x1, 0x91, 0xd4, 0xf7, 0x2c,
+                                                    0xd4, 0x3, 0x91, 0xf8, 0xa8, 0x15, 0x3f, 0xc6,
+                                                    0x4d, 0xdf, 0xf7, 0x1, 0xb9, 0xde, 0xcc, 0xdd,
+                                                    0x4d, 0xbf, 0x36, 0x2a, 0x55, 0x4a, 0x3c, 0x1e,
+                                                    0xd4, 0xa4, 0x15, 0xb7, 0xab, 0xb5, 0xb4, 0xbd,
+                                                    0xa8, 0x67, 0x3f, 0x4c, 0x62, 0x62, 0x6a, 0x47,
+                                                    0x81, 0xe3, 0xb5, 0x1e, 0xe, 0x79, 0xa, 0xf7,
+                                                    0x8b, 0xac, 0x15, 0x58, 0xa, 0x7d, 0x79, 0x5c,
+                                                    0x4d, 0x6a, 0x5d, 0x8, 0x78, 0x70, 0x7c, 0x75,
+                                                    0x86, 0x1a, 0x84, 0x8d, 0x87, 0x93, 0x1e, 0xfb,
+                                                    0x54, 0x16, 0x58, 0xa, 0x7e, 0x79, 0x5e, 0x52,
+                                                    0x6a, 0x5e, 0x8, 0x75, 0x6d, 0x7b, 0x73, 0x8f,
+                                                    0x1d, 0xf8, 0x1d, 0x92, 0x76, 0xae, 0x76, 0xe5,
+                                                    0xc4, 0xf7, 0xf, 0xa3, 0xf8, 0x12, 0x77, 0x12,
+                                                    0xe5, 0xdc, 0xf8, 0x3a, 0xd1, 0x13, 0x7e, 0x53,
+                                                    0xa, 0x13, 0xbe, 0xfc, 0x5b, 0xfb, 0x35, 0x68,
+                                                    0x1d, 0xfc, 0xbe, 0x47, 0x1d, 0xe, 0xf8, 0x1d,
+                                                    0x8b, 0xcc, 0x51, 0x76, 0xf7, 0xb0, 0xa3, 0xbc,
+                                                    0xca, 0xf7, 0xa2, 0x77, 0x12, 0xdf, 0xdc, 0xf8,
+                                                    0x6a, 0xe7, 0x13, 0x7e, 0xf0, 0x7d, 0x68, 0x1d,
+                                                    0xfc, 0x9f, 0x47, 0x1d, 0x13, 0xbe, 0xf8, 0x3d,
+                                                    0xfb, 0xba, 0x15, 0xf7, 0x91, 0x56, 0xa, 0x71,
+                                                    0x8b, 0x1d, 0xaa, 0x7f, 0x1d, 0x29, 0x20, 0x5,
+                                                    0xe, 0xf8, 0x1d, 0x92, 0x76, 0xf3, 0xc4, 0xf7,
+                                                    0x7, 0x85, 0x1d, 0xf7, 0xc2, 0xd1, 0x13, 0xf6,
+                                                    0x53, 0xa, 0xfc, 0x5b, 0xfb, 0x35, 0x68, 0x1d,
+                                                    0xfc, 0x8f, 0xfb, 0x6c, 0x77, 0xa, 0x7a, 0x7c,
+                                                    0x95, 0x95, 0x7d, 0x1e, 0x94, 0x7e, 0x7e, 0x95,
+                                                    0x7c, 0x63, 0xa, 0x13, 0xfa, 0x4e, 0x1d, 0xe2,
+                                                    0xfb, 0x6e, 0xa9, 0xf8, 0xb9, 0xf4, 0x12, 0xa9,
+                                                    0xe7, 0xac, 0xf4, 0x17, 0xf7, 0x5c, 0xf7, 0xba,
+                                                    0x15, 0x4e, 0x64, 0x5a, 0x63, 0x59, 0x1e, 0x5f,
+                                                    0x54, 0x5c, 0x53, 0x40, 0x1a, 0x25, 0xd2, 0x4b,
+                                                    0xf7, 0x4, 0xd0, 0xe9, 0xb6, 0xf0, 0xad, 0x81,
+                                                    0xa8, 0x63, 0x6f, 0x76, 0x73, 0x7a, 0x79, 0x94,
+                                                    0x7f, 0x95, 0x80, 0x1e, 0x94, 0x80, 0x95, 0x81,
+                                                    0x7e, 0x1a, 0x6a, 0x62, 0x6f, 0x61, 0x3e, 0x6a,
+                                                    0xce, 0xc7, 0x1e, 0x13, 0x50, 0xb3, 0x9e, 0xd0,
+                                                    0x9d, 0xb3, 0x1e, 0xa7, 0xcb, 0x5, 0x91, 0x99,
+                                                    0xa3, 0xd0, 0xc6, 0x1a, 0x4d, 0xf7, 0xb, 0x15,
+                                                    0x6e, 0xa2, 0x74, 0xa8, 0x1e, 0xa8, 0xa3, 0xa2,
+                                                    0xa8, 0x94, 0x1d, 0x1f, 0xe, 0xf8, 0x1, 0x99,
+                                                    0x76, 0xf7, 0x73, 0xb4, 0xf8, 0x35, 0x77, 0xf7,
+                                                    0x80, 0x77, 0x1, 0x54, 0xf9, 0x47, 0xfd, 0x2,
+                                                    0xf7, 0x5a, 0x3, 0x20, 0x1d, 0x59, 0xf8, 0x62,
+                                                    0x27, 0x1d, 0x5c, 0x1d, 0xf7, 0x80, 0x77, 0x1,
+                                                    0x4c, 0xf9, 0x47, 0xfb, 0x93, 0xf7, 0x93, 0x3,
+                                                    0x21, 0xa, 0x79, 0x5f, 0x6b, 0x2a, 0x1d, 0xfb,
+                                                    0x33, 0xf8, 0x62, 0x24, 0xa, 0x5c, 0x1d, 0xf7,
+                                                    0x7c, 0x77, 0x1, 0x54, 0xf9, 0x47, 0x3, 0x20,
+                                                    0x1d, 0xfb, 0x85, 0xf8, 0x62, 0x25, 0x1d, 0xe,
+                                                    0x5b, 0x1d, 0xf8, 0x7f, 0xf1, 0x5a, 0xbc, 0x12,
+                                                    0x90, 0xf9, 0x47, 0x13, 0xd0, 0x20, 0xa, 0x13,
+                                                    0x58, 0x77, 0x6, 0xfb, 0x64, 0xfc, 0x7f, 0x78,
+                                                    0x5f, 0x6c, 0x2a, 0x1d, 0xfb, 0x8f, 0xf8, 0x7b,
+                                                    0x83, 0x1d, 0x9b, 0xb3, 0xb0, 0x1b, 0xa4, 0xa1,
+                                                    0x80, 0x80, 0x9f, 0x1f, 0x13, 0xe0, 0x7c, 0xa5,
+                                                    0xa1, 0x7b, 0xa1, 0x1b, 0xd9, 0x9d, 0xcf, 0x65,
+                                                    0xa, 0x63, 0x7a, 0x6f, 0x81, 0x72, 0x1b, 0x7c,
+                                                    0x75, 0x98, 0x98, 0x73, 0x1f, 0x97, 0x75, 0x74,
+                                                    0x97, 0x77, 0x54, 0xa, 0x5c, 0x1d, 0xdd, 0xee,
+                                                    0x12, 0x8b, 0xf7, 0x5a, 0x99, 0xee, 0xef, 0xee,
+                                                    0x13, 0xfa, 0x20, 0x1d, 0x67, 0xf8, 0xa4, 0x15,
+                                                    0x6a, 0x1d, 0x13, 0xf6, 0xfb, 0x5b, 0x16, 0x6a,
+                                                    0x1d, 0xe, 0x5b, 0x1d, 0xf8, 0x6f, 0xf7, 0x3a,
+                                                    0x12, 0xf7, 0xb1, 0xf7, 0x18, 0xfb, 0x15, 0xf7,
+                                                    0x3a, 0x13, 0xe8, 0x20, 0x1d, 0xfb, 0x57, 0xf8,
+                                                    0xb1, 0x67, 0xa, 0xac, 0x16, 0xaf, 0xa9, 0x93,
+                                                    0xa, 0x6d, 0x67, 0x1e, 0x13, 0xf0, 0x67, 0x6d,
+                                                    0xa9, 0xaf, 0x1f, 0xe, 0xf8, 0xa8, 0x8b, 0xb1,
+                                                    0xf7, 0x72, 0xb2, 0xa9, 0xb0, 0xf7, 0x98, 0xaf,
+                                                    0x77, 0x9f, 0x12, 0x8b, 0xf7, 0x5b, 0xf7, 0x5b,
+                                                    0xee, 0xf7, 0x87, 0xa0, 0xab, 0xa2, 0x13, 0xf3,
+                                                    0x0, 0x13, 0xeb, 0x0, 0x8b, 0x4, 0xf7, 0x5b,
+                                                    0x9e, 0x6, 0x7e, 0x8d, 0x49, 0x89, 0xa0, 0xd8,
+                                                    0x93, 0xaa, 0xa5, 0xb7, 0xba, 0xe4, 0x8, 0xf7,
+                                                    0x44, 0xfb, 0x22, 0x6, 0x44, 0x7b, 0x78, 0x53,
+                                                    0x84, 0x1e, 0x7a, 0x89, 0x5, 0x78, 0xf8, 0x92,
+                                                    0x7, 0xb7, 0xf7, 0x3c, 0x5, 0x73, 0x6, 0xfb,
+                                                    0x2, 0x52, 0x68, 0x77, 0x22, 0x1b, 0x3f, 0x6,
+                                                    0x49, 0x88, 0x96, 0xcc, 0x1f, 0xf7, 0x6b, 0xf7,
+                                                    0x25, 0x7, 0xe2, 0x90, 0x5c, 0x56, 0x91, 0x1f,
+                                                    0xa0, 0xf7, 0x7e, 0x76, 0x6, 0x44, 0x85, 0x7c,
+                                                    0x71, 0xfb, 0x3, 0x1b, 0xfb, 0x3, 0xf7, 0x7a,
+                                                    0x6, 0xa8, 0x9b, 0x8c, 0x96, 0x1e, 0xe2, 0x6,
+                                                    0xf7, 0x16, 0xb4, 0x84, 0x29, 0x96, 0x1f, 0xa2,
+                                                    0xf7, 0x21, 0xfc, 0xc8, 0x6, 0x13, 0xf7, 0x80,
+                                                    0x77, 0x7, 0xc8, 0xa8, 0x80, 0x73, 0x83, 0x86,
+                                                    0x81, 0x87, 0x83, 0x1f, 0xfb, 0x89, 0xfc, 0x6e,
+                                                    0x68, 0x46, 0x79, 0x7e, 0x68, 0x85, 0x19, 0xf7,
+                                                    0x83, 0xf7, 0xac, 0x15, 0xf7, 0x30, 0xf7, 0xcd,
+                                                    0x5, 0x8e, 0xfb, 0xcd, 0x6, 0xe, 0xf7, 0xca,
+                                                    0xfb, 0x56, 0x76, 0xf7, 0x5d, 0xb7, 0xf8, 0xf2,
+                                                    0xb3, 0x1, 0xa7, 0xf7, 0x8, 0xf7, 0xa4, 0xd6,
+                                                    0xf5, 0xa2, 0x3, 0xf7, 0xae, 0x8e, 0xa, 0xcc,
+                                                    0x8c, 0xce, 0xa9, 0xbf, 0x1a, 0xc3, 0x54, 0xa2,
+                                                    0x52, 0x7f, 0x1e, 0xa0, 0xc1, 0xf7, 0x32, 0x9a,
+                                                    0xd5, 0xf6, 0x8c, 0x8d, 0x19, 0x79, 0x9d, 0x5,
+                                                    0x77, 0x1d, 0xf7, 0x24, 0xb7, 0xcb, 0xb2, 0xb1,
+                                                    0x1f, 0xb4, 0xb5, 0xc5, 0x9f, 0xbd, 0x1b, 0xf7,
+                                                    0xf, 0xd3, 0x31, 0x22, 0xa4, 0x1f, 0xa2, 0x6,
+                                                    0x82, 0xf7, 0x7f, 0x59, 0x1d, 0x1f, 0x8c, 0x6,
+                                                    0x66, 0x33, 0x92, 0x86, 0x5, 0xab, 0x94, 0xbe,
+                                                    0x8c, 0x86, 0xa, 0x5a, 0x1d, 0xf7, 0x78, 0x77,
+                                                    0x12, 0x7f, 0xa, 0x17, 0x97, 0x16, 0xf8, 0xb0,
+                                                    0x6, 0x13, 0xff, 0x80, 0x23, 0x1d, 0xf7, 0xdd,
+                                                    0xf9, 0x50, 0x27, 0x1d, 0x5a, 0x1d, 0xf7, 0x78,
+                                                    0x77, 0x1, 0x7f, 0xa, 0x3, 0xf7, 0x7c, 0xf9,
+                                                    0x63, 0x21, 0x1d, 0xfc, 0x3, 0xfd, 0xf7, 0x2c,
+                                                    0xa, 0x5a, 0x1d, 0xf7, 0x74, 0x77, 0x1, 0x7f,
+                                                    0xa, 0x3, 0xf7, 0x2a, 0x38, 0xa, 0xfb, 0x9a,
+                                                    0xfe, 0xa, 0x2c, 0xa, 0x7b, 0xa, 0xf7, 0xb5,
+                                                    0xb4, 0xf7, 0x94, 0xb1, 0xd3, 0xf0, 0x12, 0xee,
+                                                    0xf1, 0x5d, 0xf0, 0xee, 0xf0, 0x94, 0xa2, 0x13,
+                                                    0xfa, 0x97, 0x16, 0xf8, 0xb0, 0x6, 0x36, 0x1d,
+                                                    0x13, 0x7b, 0x26, 0xa, 0x13, 0x16, 0x3e, 0x7a,
+                                                    0xa, 0x13, 0xf6, 0xf7, 0x23, 0xf9, 0x91, 0x15,
+                                                    0x6c, 0x1d, 0xf7, 0x5c, 0x16, 0x6c, 0x1d, 0xe,
+                                                    0x73, 0x83, 0xa, 0xf7, 0x8c, 0x42, 0xa, 0xf7,
+                                                    0x4c, 0xf9, 0x50, 0x2d, 0xa, 0x89, 0x81, 0x1d,
+                                                    0x9d, 0x57, 0xa, 0x73, 0x83, 0xa, 0xf7, 0x8c,
+                                                    0x77, 0x1, 0xf7, 0x7, 0xf1, 0x3, 0xe8, 0xf9,
+                                                    0x63, 0x21, 0x1d, 0xfb, 0x72, 0xfd, 0xf7, 0x15,
+                                                    0xf7, 0xbf, 0x9e, 0x6, 0x41, 0x8d, 0x71, 0x60,
+                                                    0x1d, 0xa6, 0x9c, 0xd4, 0x8e, 0x1e, 0x9e, 0xfb,
+                                                    0xbf, 0x78, 0x7, 0x49, 0xa, 0xe, 0x73, 0x83,
+                                                    0xa, 0xf7, 0x88, 0x77, 0x1, 0xf7, 0x7, 0xf1,
+                                                    0x3, 0x96, 0x38, 0xa, 0xfb, 0x10, 0xfe, 0xa,
+                                                    0x15, 0xf7, 0xcb, 0x9e, 0x6, 0x41, 0x8d, 0x6c,
+                                                    0x60, 0x1d, 0xab, 0x9c, 0xd4, 0x8e, 0x1e, 0x9e,
+                                                    0xfb, 0xcb, 0x78, 0x7, 0xde, 0x87, 0xa0, 0x75,
+                                                    0x41, 0x89, 0x1d, 0x44, 0x78, 0x70, 0x36, 0x89,
+                                                    0x1e, 0xe, 0x73, 0xa0, 0x76, 0xf9, 0x17, 0x97,
+                                                    0xa, 0x12, 0xad, 0xed, 0x7a, 0xf1, 0x13, 0xd0,
+                                                    0x9d, 0x16, 0xf7, 0xbd, 0x9e, 0x6, 0x13, 0xc8,
+                                                    0x59, 0xa, 0x13, 0xb0, 0x9e, 0xfb, 0xbd, 0x7,
+                                                    0x13, 0xd0, 0x78, 0x7, 0x13, 0xc8, 0x49, 0xa,
+                                                    0xf9, 0x91, 0x4, 0x6d, 0x1d, 0xf7, 0x5b, 0x16,
+                                                    0x6d, 0x1d, 0xe, 0xf8, 0x1, 0x8b, 0xb0, 0xf7,
+                                                    0xaa, 0xb7, 0xf7, 0x9e, 0xb0, 0x1, 0xf3, 0xf1,
+                                                    0xf8, 0x6, 0x58, 0x1d, 0x96, 0x71, 0x41, 0x1f,
+                                                    0xfb, 0x4c, 0x34, 0x5f, 0xe2, 0xfb, 0x58, 0x7,
+                                                    0x45, 0x7f, 0x6d, 0x3f, 0x1e, 0xf7, 0x52, 0xf7,
+                                                    0xbc, 0x15, 0xf7, 0x26, 0xb7, 0xfb, 0x26, 0xf7,
+                                                    0x4b, 0x6, 0xbe, 0x8b, 0xab, 0x8b, 0xa, 0xfb,
+                                                    0xb7, 0xfb, 0x8a, 0x8b, 0x4b, 0x5b, 0x7f, 0x9f,
+                                                    0xc5, 0x1e, 0xe, 0xf8, 0x1, 0x95, 0x76, 0xab,
+                                                    0x76, 0xf7, 0x49, 0x77, 0xf8, 0x89, 0x77, 0xf1,
+                                                    0xf5, 0x12, 0xf7, 0x1, 0xb7, 0xf8, 0x33, 0xb7,
+                                                    0x13, 0x7e, 0x5f, 0xa, 0xf8, 0x10, 0x8d, 0x7,
+                                                    0x13, 0xbe, 0x3a, 0xa, 0x13, 0x7e, 0xf7, 0x4c,
+                                                    0xf9, 0x69, 0x4c, 0xa, 0x9d, 0x67, 0x1f, 0x97,
+                                                    0x74, 0x75, 0x91, 0x76, 0x54, 0xa, 0x30, 0x1d,
+                                                    0xf7, 0x8d, 0xf8, 0x10, 0x27, 0x1d, 0x30, 0x1d,
+                                                    0xf7, 0x20, 0xf8, 0x10, 0x24, 0xa, 0x5b, 0xa,
+                                                    0xf7, 0x66, 0x77, 0x74, 0xa, 0xf7, 0x62, 0x38,
+                                                    0xa, 0xfb, 0xbc, 0xfc, 0xb8, 0x29, 0x1d, 0xe,
+                                                    0x5b, 0xa, 0xcf, 0xf5, 0x85, 0xa, 0xf7, 0xde,
+                                                    0x70, 0xa, 0xfb, 0x17, 0x69, 0x1d, 0xf7, 0x17,
+                                                    0x61, 0x1d, 0xf7, 0x8, 0x61, 0xa, 0xfb, 0x8,
+                                                    0x44, 0x1d, 0xdc, 0xf1, 0xf1, 0xf7, 0x3, 0x3a,
+                                                    0x71, 0x1d, 0x32, 0x72, 0x1d, 0xe4, 0xf7, 0x70,
+                                                    0x1e, 0xbb, 0xf8, 0x31, 0x4c, 0xa, 0x91, 0x7f,
+                                                    0x1f, 0xa3, 0x5c, 0x75, 0x91, 0x76, 0x54, 0xa,
+                                                    0x5b, 0xa, 0xc6, 0xef, 0x7b, 0x1d, 0xca, 0xef,
+                                                    0xef, 0xef, 0xca, 0x9a, 0xa, 0xad, 0xf7, 0xe6,
+                                                    0x70, 0xa, 0xfb, 0x1f, 0x69, 0x1d, 0xf7, 0x10,
+                                                    0x61, 0x1d, 0xf7, 0xf, 0x34, 0xa, 0x33, 0x71,
+                                                    0x1d, 0x39, 0x5e, 0xa, 0xca, 0xf8, 0x52, 0x15,
+                                                    0x30, 0xa, 0xf7, 0x5c, 0x16, 0x30, 0xa, 0xe,
+                                                    0xf7, 0x63, 0xa8, 0x76, 0xac, 0x76, 0xf8, 0x71,
+                                                    0x77, 0x12, 0x13, 0xa0, 0xc5, 0xc3, 0x15, 0xa6,
+                                                    0x6f, 0xf7, 0x59, 0xf7, 0x59, 0x5, 0x13, 0x60,
+                                                    0xf7, 0x61, 0xfb, 0x61, 0xa7, 0xa6, 0xfb, 0x61,
+                                                    0xf7, 0x62, 0xf7, 0x59, 0xf7, 0x58, 0x6f, 0xa7,
+                                                    0xfb, 0x59, 0xfb, 0x59, 0xfb, 0x58, 0xf7, 0x59,
+                                                    0x70, 0x6e, 0xf7, 0x57, 0xfb, 0x57, 0x5, 0xe,
+                                                    0xf8, 0x1, 0x50, 0x76, 0xcd, 0xaf, 0xf8, 0xfe,
+                                                    0xaf, 0xc5, 0x77, 0x74, 0xa, 0xf7, 0x6f, 0xe3,
+                                                    0x15, 0xf7, 0xc8, 0xf8, 0x58, 0x5, 0xa8, 0x5a,
+                                                    0x9d, 0x41, 0x2e, 0x1a, 0xfb, 0x70, 0x25, 0x39,
+                                                    0xfb, 0x3, 0x57, 0x57, 0x9f, 0xb9, 0x65, 0x1e,
+                                                    0x72, 0xae, 0x15, 0x6e, 0xbc, 0x7a, 0xd9, 0xe6,
+                                                    0x1a, 0xf7, 0x78, 0xf7, 0x3, 0xd2, 0xf1, 0xbc,
+                                                    0xbf, 0x78, 0x5d, 0xb3, 0x1e, 0xfc, 0x52, 0xfd,
+                                                    0x23, 0x15, 0xbc, 0x6, 0xda, 0xf7, 0x8, 0x5,
+                                                    0x6a, 0xbe, 0xc8, 0x7a, 0xcc, 0x1b, 0xf7, 0x49,
+                                                    0xf7, 0x26, 0xf7, 0x10, 0xf7, 0x69, 0xf7, 0x11,
+                                                    0x5b, 0xed, 0x45, 0xc5, 0x1f, 0xe3, 0xf7, 0x16,
+                                                    0x5, 0x5a, 0x6, 0x43, 0x20, 0x5, 0xac, 0x56,
+                                                    0x4e, 0x9b, 0x4d, 0x1b, 0xfb, 0x38, 0xfb, 0x37,
+                                                    0x21, 0xfb, 0x7a, 0xfb, 0xb, 0xb8, 0x24, 0xd3,
+                                                    0x50, 0x1f, 0xe, 0x7c, 0xa, 0xf7, 0xfd, 0xb7,
+                                                    0x3, 0x99, 0xf9, 0x17, 0x15, 0xd7, 0x99, 0x71,
+                                                    0x41, 0x1f, 0xfb, 0xc6, 0x7, 0x4a, 0x8b, 0xfb,
+                                                    0x4e, 0xf7, 0x8c, 0xf7, 0x97, 0x8b, 0xf7, 0x47,
+                                                    0xe4, 0x1e, 0xf7, 0x8f, 0x7, 0xf4, 0x9c, 0xab,
+                                                    0xd8, 0x8c, 0x1e, 0x9e, 0xfb, 0x7c, 0x78, 0x7,
+                                                    0xd1, 0x8a, 0xa3, 0x6d, 0x20, 0x1a, 0xfb, 0x98,
+                                                    0x7, 0xfb, 0x11, 0x4f, 0x31, 0x98, 0x1d, 0xf7,
+                                                    0x22, 0xc8, 0x1e, 0xf7, 0xca, 0x7, 0xd2, 0x97,
+                                                    0xa7, 0xda, 0x8c, 0x1e, 0x88, 0xa, 0xf8, 0x13,
+                                                    0xc4, 0x3a, 0x1d, 0x73, 0x87, 0x8b, 0x7b, 0x1b,
+                                                    0x6c, 0x8a, 0x81, 0x1d, 0x9c, 0x57, 0xa, 0x7c,
+                                                    0xa, 0xf7, 0xf6, 0xb7, 0x3, 0xf8, 0x4, 0xf9,
+                                                    0x63, 0x21, 0x1d, 0xfc, 0x89, 0xfb, 0x74, 0x32,
+                                                    0x1d, 0x6e, 0xa, 0xf7, 0x88, 0x77, 0x1, 0xf3,
+                                                    0xf1, 0xf7, 0xf6, 0xb7, 0x3, 0xf7, 0x62, 0x38,
+                                                    0xa, 0xfb, 0xd0, 0xfb, 0x87, 0x32, 0x1d, 0xf8,
+                                                    0x1, 0x7d, 0xb7, 0xf8, 0xf9, 0x97, 0xa, 0xe9,
+                                                    0xee, 0x12, 0xf7, 0x13, 0xf1, 0x7a, 0xee, 0xf0,
+                                                    0xee, 0xb4, 0xb7, 0x13, 0xcb, 0x99, 0xf9, 0x17,
+                                                    0x2e, 0x1d, 0x13, 0xbb, 0x9e, 0xfb, 0x7c, 0x7,
+                                                    0x13, 0xcb, 0x50, 0x1d, 0x4f, 0x3f, 0xfb, 0x13,
+                                                    0x47, 0xa, 0x13, 0xbb, 0x88, 0xa, 0x13, 0xcb,
+                                                    0x13, 0xb7, 0xf7, 0x5a, 0xf7, 0xf, 0x4a, 0x1d,
+                                                    0xf8, 0x1, 0x83, 0xa, 0xf7, 0x8c, 0x72, 0xa,
+                                                    0xa8, 0xde, 0x1a, 0xf7, 0x3f, 0x7e, 0x1d, 0x4b,
+                                                    0x1d, 0x5e, 0x1d, 0xf7, 0x6, 0xf9, 0x50, 0x24,
+                                                    0xa, 0xf7, 0x5b, 0x93, 0x9e, 0xf7, 0x25, 0xb3,
+                                                    0xf7, 0x95, 0xb1, 0xf7, 0x34, 0x77, 0x6d, 0xa,
+                                                    0x98, 0xe9, 0x1a, 0xac, 0x66, 0x1d, 0xf7, 0x6,
+                                                    0x21, 0xcd, 0xfb, 0x2e, 0x1e, 0x3b, 0x6, 0x88,
+                                                    0xe7, 0x9a, 0x97, 0xda, 0x92, 0x8, 0x9e, 0xfb,
+                                                    0xa9, 0x78, 0x7, 0xd4, 0x84, 0x96, 0x7f, 0x44,
+                                                    0x1a, 0xfc, 0x3b, 0x8d, 0xa, 0xf7, 0x4a, 0x15,
+                                                    0xf7, 0x98, 0x7, 0xac, 0x96, 0x8b, 0xa9, 0xb7,
+                                                    0xf7, 0x26, 0x8a, 0x74, 0x1d, 0x82, 0xa8, 0x77,
+                                                    0x9f, 0xf9, 0x10, 0xa6, 0x12, 0xd4, 0xdf, 0xf7,
+                                                    0x45, 0xe2, 0x5c, 0xe9, 0x13, 0x78, 0x97, 0x16,
+                                                    0xf7, 0x25, 0xf8, 0xb9, 0x6, 0x9b, 0x8d, 0xe6,
+                                                    0xe2, 0xbb, 0xb3, 0x5f, 0x2d, 0x1e, 0xfb, 0x38,
+                                                    0xfb, 0x10, 0xc1, 0x69, 0x1a, 0x6e, 0xc4, 0xa5,
+                                                    0xbb, 0x65, 0x1e, 0x13, 0xb4, 0x9c, 0x7d, 0xb5,
+                                                    0x60, 0x23, 0x1a, 0x38, 0x82, 0x46, 0x54, 0x7a,
+                                                    0x85, 0x92, 0x99, 0x87, 0x1e, 0x89, 0x93, 0x8a,
+                                                    0x96, 0x8a, 0x97, 0x8, 0x9f, 0x89, 0x7c, 0x9f,
+                                                    0x72, 0x1b, 0x71, 0x78, 0x77, 0x6e, 0x75, 0x9c,
+                                                    0x59, 0xdd, 0xf7, 0x1, 0xcf, 0xef, 0xe6, 0xf7,
+                                                    0x21, 0xfb, 0x4, 0xbe, 0x46, 0x8d, 0x1f, 0x8d,
+                                                    0x7, 0x13, 0x78, 0xf7, 0x3, 0xbb, 0xa2, 0xb4,
+                                                    0xd0, 0x1a, 0xf6, 0x2c, 0xb3, 0x43, 0xfb, 0x48,
+                                                    0x8a, 0xfb, 0x3a, 0x4c, 0x1e, 0xfb, 0xfc, 0x7,
+                                                    0x4a, 0x73, 0x80, 0x66, 0x88, 0x1e, 0xe, 0x4f,
+                                                    0x1d, 0xf7, 0x6e, 0x77, 0x12, 0xb0, 0xe3, 0x39,
+                                                    0xe3, 0xf7, 0x30, 0xdc, 0x13, 0xda, 0x34, 0x1d,
+                                                    0x1e, 0x13, 0xd6, 0xfb, 0x8, 0x67, 0x44, 0x63,
+                                                    0x7b, 0x8c, 0x6f, 0xaa, 0xa5, 0xa4, 0x97, 0xa0,
+                                                    0x1f, 0x94, 0x80, 0xa4, 0x9a, 0x1a, 0x13, 0xba,
+                                                    0xaa, 0xb1, 0x37, 0xa, 0xcb, 0x89, 0xa, 0xbe,
+                                                    0xab, 0xa4, 0x1e, 0x6d, 0xf8, 0x46, 0x27, 0x1d,
+                                                    0x4f, 0x1d, 0xf7, 0x6e, 0x77, 0x1, 0xaa, 0xe3,
+                                                    0xf7, 0x3c, 0xdc, 0x3, 0x34, 0x1d, 0xfb, 0x8,
+                                                    0x4f, 0x44, 0x63, 0x7b, 0xa4, 0x6f, 0xaa, 0xa5,
+                                                    0x91, 0xa1, 0xa0, 0x1e, 0xb2, 0x7, 0xaa, 0xb9,
+                                                    0x37, 0xa, 0xb3, 0x66, 0xc1, 0xe9, 0xb1, 0xbe,
+                                                    0xab, 0xa4, 0x1e, 0xfb, 0x1f, 0xf8, 0x46, 0x15,
+                                                    0xf7, 0x27, 0xf7, 0x28, 0x5, 0xa2, 0xa2, 0x91,
+                                                    0x8b, 0x9a, 0x1b, 0xab, 0x8c, 0x6f, 0x87, 0x74,
+                                                    0x78, 0x7f, 0x80, 0x84, 0x1f, 0xfb, 0x2e, 0x2a,
+                                                    0x5, 0xe, 0x4f, 0x1d, 0xf7, 0x6a, 0x77, 0x84,
+                                                    0xa, 0xce, 0xf8, 0x8f, 0x25, 0x1d, 0xeb, 0xfc,
+                                                    0x2a, 0x29, 0xa, 0x4f, 0x1d, 0xd3, 0xf5, 0x84,
+                                                    0xa, 0xc4, 0xf8, 0xa8, 0x83, 0x1d, 0x96, 0xaf,
+                                                    0xb1, 0x1b, 0x97, 0x98, 0x84, 0x45, 0x1d, 0x74,
+                                                    0x94, 0x91, 0x7f, 0x1f, 0xa3, 0x5c, 0x77, 0x96,
+                                                    0x76, 0x1b, 0x48, 0x6d, 0x4d, 0x5f, 0x83, 0x1f,
+                                                    0xf7, 0x7a, 0xfb, 0x9c, 0x29, 0xa, 0x4f, 0x1d,
+                                                    0xcb, 0xee, 0x12, 0xb0, 0xe3, 0x46, 0xe3, 0x44,
+                                                    0xee, 0xf0, 0xea, 0x3a, 0xdc, 0x13, 0xd8, 0x80,
+                                                    0xf7, 0xb3, 0xf7, 0xa0, 0x28, 0x1d, 0x13, 0xd5,
+                                                    0x0, 0x3e, 0x1d, 0x13, 0xb8, 0x80, 0x3c, 0x1d,
+                                                    0x13, 0xd3, 0x0, 0xfb, 0x6b, 0xf8, 0x88, 0x4a,
+                                                    0x1d, 0xe2, 0x81, 0xc5, 0xf7, 0x95, 0xf7, 0x2b,
+                                                    0x77, 0xa3, 0xcd, 0xad, 0xf7, 0x17, 0xad, 0x12,
+                                                    0xc3, 0xe3, 0x64, 0xe3, 0x3d, 0xad, 0xf7, 0x7,
+                                                    0xdc, 0x98, 0xae, 0x13, 0xda, 0x40, 0xf7, 0xb3,
+                                                    0xf7, 0xa0, 0x24, 0x1d, 0x13, 0xdc, 0x80, 0x40,
+                                                    0xa, 0xeb, 0xfb, 0x29, 0xfb, 0x8, 0x5c, 0x48,
+                                                    0x57, 0x1d, 0x1e, 0x94, 0x86, 0x9a, 0x9a, 0x1a,
+                                                    0x13, 0xba, 0x40, 0xaa, 0xb1, 0x99, 0xac, 0xa9,
+                                                    0xba, 0x57, 0x43, 0x1e, 0x7b, 0x4f, 0xa, 0xbf,
+                                                    0x89, 0xa, 0xbd, 0xac, 0xb0, 0x1e, 0x13, 0xd9,
+                                                    0x40, 0xfb, 0x39, 0xf8, 0xae, 0x67, 0xa, 0xad,
+                                                    0x16, 0xaf, 0xa8, 0x93, 0xa, 0x6e, 0x67, 0x67,
+                                                    0x6e, 0xa8, 0xaf, 0x1e, 0xe, 0xf7, 0xca, 0x81,
+                                                    0xbb, 0x5b, 0xce, 0xf7, 0x70, 0xa9, 0x88, 0xf7,
+                                                    0x30, 0x73, 0xa3, 0x12, 0xb1, 0xe2, 0x4a, 0xe4,
+                                                    0xf7, 0x10, 0xdc, 0x13, 0x6d, 0xf7, 0xc6, 0xd4,
+                                                    0x15, 0x71, 0x9c, 0xa9, 0x52, 0xe1, 0x1b, 0xb1,
+                                                    0xe9, 0x98, 0xf7, 0x26, 0xc8, 0x1f, 0x7f, 0x90,
+                                                    0x5, 0x56, 0x6a, 0x59, 0x5f, 0x54, 0x1b, 0xfb,
+                                                    0x14, 0x8b, 0xf7, 0xd, 0xee, 0x1f, 0xf7, 0x9a,
+                                                    0x6, 0x13, 0x93, 0xbd, 0x7c, 0xf7, 0x19, 0xfb,
+                                                    0x22, 0x58, 0x6d, 0x7f, 0x6a, 0x62, 0x1e, 0xa0,
+                                                    0x73, 0x6e, 0xa3, 0x49, 0x1b, 0x35, 0x43, 0x5e,
+                                                    0x4d, 0x65, 0xa4, 0x80, 0x9c, 0xba, 0x8b, 0xb5,
+                                                    0xaf, 0x1f, 0x13, 0xad, 0xa8, 0x9e, 0xa4, 0xb8,
+                                                    0xcd, 0x89, 0x57, 0x24, 0x87, 0x1e, 0xfb, 0x35,
+                                                    0x4a, 0x41, 0x6d, 0x31, 0x1a, 0x61, 0xab, 0x4b,
+                                                    0xde, 0xee, 0x92, 0xb7, 0xb2, 0xba, 0x1e, 0x7e,
+                                                    0xa4, 0x15, 0x7d, 0x52, 0x5d, 0x64, 0x54, 0x7a,
+                                                    0xc2, 0xa5, 0xca, 0xa4, 0xa7, 0xf7, 0xf, 0xb6,
+                                                    0x1e, 0x8c, 0x57, 0x5, 0x8c, 0x44, 0x9d, 0x72,
+                                                    0x84, 0x1a, 0xc9, 0xf7, 0x65, 0x15, 0xb5, 0x8d,
+                                                    0x8f, 0xdd, 0xde, 0x1b, 0xd3, 0x90, 0x37, 0x63,
+                                                    0x1f, 0xe, 0xe2, 0xfb, 0x56, 0x76, 0xf7, 0x61,
+                                                    0xd3, 0xf7, 0x91, 0xf7, 0x25, 0x6e, 0xa8, 0x12,
+                                                    0xa4, 0xd8, 0xf7, 0x31, 0xd6, 0x13, 0xdc, 0xf7,
+                                                    0x11, 0x8e, 0xa, 0xcb, 0xcf, 0xaa, 0xbf, 0xc3,
+                                                    0x54, 0xa2, 0x52, 0x7f, 0x1f, 0xa1, 0xc5, 0xcd,
+                                                    0x95, 0xc2, 0xb8, 0xba, 0xee, 0x19, 0x63, 0x1d,
+                                                    0x90, 0x79, 0x6d, 0x93, 0x1f, 0x13, 0xec, 0x5f,
+                                                    0x97, 0x9c, 0x73, 0xa5, 0x1b, 0xa9, 0x9b, 0xa0,
+                                                    0xa2, 0xca, 0x33, 0xb1, 0x4e, 0xfb, 0x0, 0xfb,
+                                                    0x8, 0x38, 0xfb, 0x38, 0xfb, 0x30, 0xf3, 0x4a,
+                                                    0xda, 0x89, 0x1f, 0x65, 0x2e, 0x92, 0x86, 0x5,
+                                                    0xab, 0x94, 0xbd, 0x8d, 0x86, 0xa, 0xe2, 0x81,
+                                                    0xd0, 0xf7, 0x4f, 0xab, 0xf7, 0xd, 0xaf, 0xf7,
+                                                    0x87, 0x77, 0x12, 0xa3, 0xd0, 0xf7, 0x68, 0xf1,
+                                                    0x17, 0x26, 0x1d, 0x13, 0x7c, 0x3d, 0x1d, 0x5e,
+                                                    0xf7, 0x64, 0x27, 0x1d, 0x87, 0x1d, 0xf7, 0x11,
+                                                    0xaf, 0xf7, 0x6e, 0x77, 0x1, 0xac, 0xd0, 0xf7,
+                                                    0x46, 0xf1, 0x3, 0x28, 0xa, 0xfb, 0x6, 0xf7,
+                                                    0x64, 0x24, 0xa, 0x87, 0x1d, 0xf7, 0x11, 0xaf,
+                                                    0xf7, 0x6a, 0x77, 0x1, 0xa4, 0xd0, 0xf7, 0x65,
+                                                    0xf1, 0x3, 0x28, 0xa, 0xfb, 0x80, 0xf7, 0x64,
+                                                    0x25, 0x1d, 0xe, 0xe2, 0x81, 0xd0, 0xf7, 0x58,
+                                                    0xab, 0xf7, 0x1d, 0xaf, 0xca, 0xef, 0x12, 0xa4,
+                                                    0xd0, 0x77, 0xed, 0xf0, 0xed, 0x13, 0xfa, 0x28,
+                                                    0xa, 0x13, 0xf6, 0xfb, 0x79, 0xf7, 0xa6, 0x15,
+                                                    0x4b, 0xa, 0x8f, 0xa, 0xf9, 0x3a, 0x27, 0xa,
+                                                    0xf7, 0x33, 0xf8, 0x80, 0x27, 0x1d, 0x8f, 0xa,
+                                                    0xf9, 0x3a, 0x27, 0xa, 0xbd, 0xf8, 0x80, 0x24,
+                                                    0xa, 0x8f, 0xa, 0xf9, 0x36, 0x27, 0xa, 0x6b,
+                                                    0xf8, 0x80, 0x25, 0x1d, 0xe, 0x8f, 0xa, 0xf8,
+                                                    0xa0, 0xee, 0x1, 0x82, 0xed, 0x91, 0xdf, 0x96,
+                                                    0xed, 0x23, 0xa, 0x72, 0xf8, 0xc2, 0x15, 0x6b,
+                                                    0xa, 0xf7, 0x5b, 0x16, 0x6b, 0xa, 0xe, 0x71,
+                                                    0xa, 0xf7, 0x76, 0x77, 0x1, 0xa8, 0xe5, 0xf7,
+                                                    0x9a, 0xe5, 0x3, 0xf7, 0xb, 0xf7, 0xaa, 0x15,
+                                                    0xf1, 0xc3, 0xbf, 0xca, 0xd4, 0xd1, 0x3d, 0xfb,
+                                                    0x2f, 0xfb, 0x23, 0x48, 0x65, 0x58, 0xfb, 0xc,
+                                                    0x73, 0xf7, 0x4c, 0xd7, 0x1e, 0xf7, 0x89, 0xf7,
+                                                    0x11, 0x15, 0xb4, 0x60, 0x69, 0x9b, 0x61, 0x1b,
+                                                    0xfb, 0x19, 0x38, 0xfb, 0x1, 0xfb, 0x17, 0xfb,
+                                                    0x13, 0xe6, 0x24, 0x65, 0x1d, 0xf7, 0x32, 0xf7,
+                                                    0x1c, 0xf7, 0xb, 0x5e, 0xf7, 0xd, 0x2e, 0xd9,
+                                                    0x1f, 0xe6, 0xbb, 0x6a, 0xa9, 0x2c, 0x59, 0x62,
+                                                    0xa5, 0x57, 0xa5, 0x50, 0x8f, 0x19, 0x61, 0x75,
+                                                    0xbb, 0x84, 0xb8, 0x6d, 0xb3, 0x6e, 0x19, 0xfb,
+                                                    0xd, 0x4b, 0xac, 0x6d, 0xf7, 0xf, 0xcc, 0xbe,
+                                                    0x5a, 0xae, 0x54, 0x95, 0x4f, 0x19, 0xe, 0xa0,
+                                                    0x76, 0xf8, 0x29, 0xc2, 0xd6, 0xf2, 0x73, 0xa,
+                                                    0xb2, 0xb6, 0x1a, 0xf7, 0x8c, 0x7e, 0xa, 0xfb,
+                                                    0x5b, 0x7, 0x3f, 0x71, 0x7c, 0x82, 0x1d, 0xa7,
+                                                    0xce, 0x1a, 0xf7, 0x58, 0x46, 0xa, 0xd0, 0xf8,
+                                                    0x99, 0x15, 0xa8, 0x6, 0xb0, 0x8e, 0xac, 0x9e,
+                                                    0xa3, 0x1b, 0xa6, 0x9f, 0x79, 0x82, 0xa0, 0x1f,
+                                                    0x7e, 0xaa, 0xa2, 0x7e, 0x9e, 0x1b, 0xd9, 0x98,
+                                                    0xd0, 0x65, 0xa, 0x5e, 0x83, 0x7a, 0x80, 0x75,
+                                                    0x1b, 0x77, 0x72, 0x98, 0x95, 0x74, 0x1f, 0x9b,
+                                                    0x66, 0x76, 0x9c, 0x74, 0x54, 0xa, 0x71, 0xa,
+                                                    0xf7, 0x6e, 0x77, 0x1, 0xb9, 0xe5, 0xf7, 0x8a,
+                                                    0xe5, 0x3, 0x2f, 0x1d, 0xa6, 0x15, 0xf3, 0xc2,
+                                                    0xd4, 0xca, 0xe7, 0xbe, 0x34, 0x80, 0xa, 0x46,
+                                                    0x4f, 0x58, 0xfb, 0xc, 0x76, 0xf7, 0x37, 0xd5,
+                                                    0x1e, 0xf7, 0x3b, 0xf7, 0x90, 0x3b, 0x1d, 0x9e,
+                                                    0x74, 0x86, 0x94, 0xa, 0x9c, 0x57, 0xa, 0x71,
+                                                    0xa, 0xf7, 0x6e, 0x77, 0x1, 0xa8, 0xe5, 0xf7,
+                                                    0x99, 0xe5, 0x3, 0xa8, 0xf7, 0x7b, 0x15, 0xfb,
+                                                    0x1b, 0xe5, 0x21, 0x65, 0x1d, 0xf7, 0x1c, 0xee,
+                                                    0xf7, 0x25, 0x2d, 0xe5, 0xfb, 0x17, 0xfb, 0x1a,
+                                                    0x39, 0x21, 0xfb, 0xf, 0x1e, 0xe5, 0xad, 0x15,
+                                                    0xf3, 0xc9, 0xca, 0xca, 0xe7, 0xb7, 0x30, 0x80,
+                                                    0xa, 0x3b, 0x53, 0x58, 0xfb, 0xc, 0x81, 0xf7,
+                                                    0x41, 0xd5, 0x1e, 0xc5, 0xf7, 0x86, 0x24, 0xa,
+                                                    0x71, 0xa, 0xf7, 0x6a, 0x77, 0x4c, 0x1d, 0xa9,
+                                                    0x15, 0xf3, 0xc2, 0xd1, 0xca, 0xe7, 0xbe, 0x3a,
+                                                    0x80, 0xa, 0x44, 0x49, 0x58, 0xfb, 0xc, 0x78,
+                                                    0xf7, 0x3a, 0xd5, 0x1e, 0x73, 0xf7, 0x8d, 0x25,
+                                                    0x1d, 0xe, 0x71, 0xa, 0xd3, 0xf5, 0x4c, 0x1d,
+                                                    0xbb, 0x15, 0xf3, 0xc2, 0xbf, 0xca, 0xe7, 0xbe,
+                                                    0xfb, 0x1, 0x80, 0xa, 0x48, 0x65, 0x58, 0xfb,
+                                                    0xc, 0x74, 0xf7, 0x4c, 0xd5, 0x1e, 0x69, 0xf7,
+                                                    0x94, 0x15, 0xa8, 0x6, 0x91, 0x9c, 0x9b, 0xbb,
+                                                    0xaf, 0x7e, 0x8, 0x71, 0xd1, 0xb0, 0x71, 0x52,
+                                                    0x1d, 0x7a, 0x63, 0x7c, 0x7a, 0x71, 0x92, 0x8,
+                                                    0x9b, 0x51, 0x50, 0xad, 0x76, 0x54, 0xa, 0x71,
+                                                    0xa, 0xca, 0xef, 0x12, 0xa8, 0xe5, 0x79, 0xef,
+                                                    0xee, 0xef, 0x77, 0xe5, 0x13, 0xf2, 0x2f, 0x1d,
+                                                    0xa4, 0x15, 0xf3, 0xc2, 0xd6, 0xca, 0xe7, 0xbe,
+                                                    0x3d, 0x80, 0xa, 0x48, 0x46, 0x58, 0xfb, 0xc,
+                                                    0x74, 0xf7, 0x35, 0xd5, 0x1e, 0x13, 0xec, 0x79,
+                                                    0xf7, 0xd4, 0x15, 0x30, 0xa, 0xf7, 0x5b, 0x16,
+                                                    0x30, 0xa, 0xe, 0xf7, 0x63, 0x96, 0x76, 0xe1,
+                                                    0x77, 0xb9, 0xf7, 0xa, 0x8b, 0xcd, 0x55, 0xb6,
+                                                    0xf7, 0x85, 0x77, 0x12, 0xf7, 0x76, 0xf7, 0x5,
+                                                    0x27, 0xe1, 0x13, 0xee, 0xa9, 0xf7, 0x7c, 0x15,
+                                                    0xf8, 0x8c, 0xb6, 0xfc, 0x8c, 0x6, 0xf7, 0x90,
+                                                    0xfb, 0xb1, 0x15, 0x13, 0xf5, 0x6c, 0xa, 0xf8,
+                                                    0x4c, 0x4, 0x6c, 0xa, 0xe, 0x30, 0x76, 0xf1,
+                                                    0xa7, 0xf8, 0x32, 0xa7, 0xe6, 0x77, 0x1, 0xa8,
+                                                    0xe5, 0xf7, 0x99, 0xe5, 0x3, 0xf7, 0x47, 0xc7,
+                                                    0x15, 0xf7, 0x35, 0xf7, 0xc6, 0x5, 0xa5, 0x60,
+                                                    0x99, 0x4f, 0x4b, 0x1a, 0xfb, 0x23, 0x48, 0x65,
+                                                    0x58, 0x67, 0x70, 0x9b, 0xa5, 0x77, 0x1e, 0xfb,
+                                                    0x13, 0xfb, 0x40, 0x15, 0xb0, 0x6, 0xcc, 0xf7,
+                                                    0xf, 0x5, 0x7d, 0xa8, 0xaa, 0x84, 0xad, 0x1b,
+                                                    0xf7, 0x2c, 0xd1, 0xf7, 0x1f, 0xee, 0xe7, 0x66,
+                                                    0xcf, 0x4e, 0xb1, 0x1f, 0xcc, 0xf7, 0x11, 0x5,
+                                                    0x64, 0x6, 0x52, 0xfb, 0x1, 0x5, 0x97, 0x6e,
+                                                    0x6b, 0x91, 0x68, 0x1b, 0xfb, 0x1a, 0x39, 0xfb,
+                                                    0x1, 0xfb, 0xf, 0x36, 0xaf, 0x42, 0xc7, 0x61,
+                                                    0x1f, 0xac, 0xcb, 0x15, 0x6c, 0xc6, 0x83, 0xdd,
+                                                    0xb6, 0x1a, 0xf3, 0xc2, 0xbf, 0xca, 0xab, 0xa5,
+                                                    0x7e, 0x74, 0xa1, 0x1e, 0xe, 0x76, 0x1d, 0xf7,
+                                                    0xe6, 0xe1, 0x15, 0x2e, 0x7, 0x8d, 0x88, 0x87,
+                                                    0xa, 0x19, 0x22, 0xa, 0x57, 0xf8, 0x39, 0x27,
+                                                    0x1d, 0x76, 0x1d, 0xf7, 0x45, 0xf8, 0x8f, 0x21,
+                                                    0x1d, 0x9b, 0xfd, 0x2d, 0x25, 0xa, 0xe, 0x81,
+                                                    0xc7, 0xf8, 0x24, 0x77, 0xf7, 0x88, 0x90, 0xa,
+                                                    0xea, 0xf8, 0x8f, 0x25, 0x1d, 0xf7, 0xd, 0xfd,
+                                                    0x40, 0x25, 0xa, 0xe, 0x81, 0xc7, 0xf8, 0x13,
+                                                    0xf7, 0x52, 0x27, 0xef, 0x12, 0xd2, 0xdf, 0x55,
+                                                    0xef, 0xed, 0xef, 0x49, 0xdf, 0x13, 0xd2, 0xf7,
+                                                    0xe8, 0x81, 0x25, 0xa, 0x13, 0xac, 0xfb, 0x81,
+                                                    0xf8, 0xd8, 0x15, 0x30, 0xa, 0xf7, 0x5a, 0x16,
+                                                    0x30, 0xa, 0xe, 0x96, 0xa, 0xf8, 0xc2, 0x9a,
+                                                    0xf7, 0x71, 0x77, 0x12, 0xf7, 0xe8, 0xf7, 0x1b,
+                                                    0x13, 0x90, 0x40, 0x1d, 0x13, 0x78, 0x41, 0xa,
+                                                    0xfb, 0x28, 0xf7, 0x46, 0x24, 0xa, 0x8e, 0x1d,
+                                                    0xf7, 0x73, 0x77, 0x1, 0xd6, 0xdf, 0xf7, 0x75,
+                                                    0xe1, 0x3, 0x90, 0xfb, 0x5b, 0x15, 0x79, 0xf7,
+                                                    0x86, 0x9d, 0x7, 0x43, 0x7b, 0xa0, 0xcb, 0x1f,
+                                                    0xf7, 0x27, 0x7, 0x5f, 0x1d, 0x75, 0x1f, 0x89,
+                                                    0x8d, 0x5, 0x8c, 0xf7, 0xbb, 0x6, 0x86, 0x8e,
+                                                    0x6b, 0x1d, 0x76, 0x6d, 0x1f, 0xfd, 0x4a, 0x7,
+                                                    0x60, 0x87, 0x6c, 0x49, 0x87, 0x1e, 0xf7, 0x2e,
+                                                    0xf7, 0xb3, 0x15, 0x5a, 0xa, 0x96, 0xa, 0xf8,
+                                                    0xbb, 0xf7, 0x50, 0x27, 0xef, 0x12, 0xf1, 0xed,
+                                                    0xf0, 0xed, 0x13, 0xac, 0x40, 0x1d, 0x13, 0x6c,
+                                                    0x41, 0xa, 0xfb, 0x9b, 0xf7, 0x88, 0x15, 0x13,
+                                                    0x9c, 0x4b, 0xa, 0x8f, 0xa, 0xf8, 0x60, 0x27,
+                                                    0xa, 0xe, 0xf7, 0x92, 0x8b, 0x9e, 0xf9, 0x4,
+                                                    0x9e, 0x1, 0xee, 0x5d, 0x1d, 0x9b, 0xd4, 0x1f,
+                                                    0xf7, 0x40, 0x7, 0xf7, 0x2f, 0xe9, 0x5, 0xbc,
+                                                    0x7, 0xfb, 0x2f, 0x2c, 0x5, 0xf7, 0x50, 0x7,
+                                                    0xe1, 0x73, 0x1d, 0xfb, 0x88, 0x7, 0x34, 0x55,
+                                                    0x5, 0x5a, 0x7, 0xe2, 0xc0, 0x5, 0xfb, 0xb,
+                                                    0x7, 0x33, 0x7a, 0xa, 0xe, 0x8f, 0xa, 0xf9,
+                                                    0x3, 0x9b, 0xb7, 0x77, 0x1, 0xe1, 0xdf, 0x3,
+                                                    0x9e, 0x16, 0xf7, 0x84, 0x9a, 0x6, 0x51, 0x8e,
+                                                    0x78, 0x9d, 0xc5, 0x1a, 0xf7, 0xcd, 0x7, 0xd8,
+                                                    0xbf, 0x5, 0xb7, 0x7, 0x3e, 0x56, 0x5, 0xf7,
+                                                    0x7b, 0x5d, 0xa, 0xfb, 0x40, 0x7, 0x3c, 0x56,
+                                                    0x5, 0x5f, 0x7, 0xda, 0xbf, 0x5, 0xfb, 0x91,
+                                                    0x7, 0x57, 0x77, 0x74, 0x50, 0x84, 0x1d, 0xf8,
+                                                    0xa8, 0x85, 0xb0, 0x6c, 0xb2, 0xf7, 0xb6, 0xb0,
+                                                    0xf7, 0x9e, 0xa9, 0x6d, 0xaf, 0x6b, 0xaf, 0x12,
+                                                    0xa9, 0xf7, 0x4, 0xf7, 0xb5, 0xef, 0xf7, 0x7b,
+                                                    0xa1, 0x13, 0xa7, 0x0, 0xf8, 0xa7, 0xf7, 0xdd,
+                                                    0x15, 0xf7, 0x2c, 0x88, 0x8a, 0x81, 0xa4, 0x1f,
+                                                    0xab, 0x81, 0x9f, 0x6d, 0x90, 0x5a, 0x8, 0x13,
+                                                    0xa7, 0x80, 0xa1, 0xf7, 0x7e, 0x75, 0x6, 0x2a,
+                                                    0x7d, 0x85, 0x8b, 0xfb, 0x67, 0x1b, 0xf7, 0x80,
+                                                    0x7, 0x9e, 0x8f, 0x90, 0xf7, 0x4, 0xf7, 0x4,
+                                                    0xb8, 0x84, 0x29, 0x96, 0x1e, 0xa2, 0xf7, 0x21,
+                                                    0xfb, 0xda, 0x6, 0x64, 0x66, 0x8d, 0x8c, 0x6e,
+                                                    0x1f, 0x13, 0xab, 0x0, 0x8d, 0x6e, 0x77, 0x8c,
+                                                    0x84, 0x1b, 0xfb, 0x4a, 0xfb, 0x1f, 0x24, 0xfb,
+                                                    0x8f, 0xfb, 0x64, 0xf7, 0x18, 0xfb, 0x4, 0xf7,
+                                                    0x29, 0xa9, 0xa8, 0x8d, 0x8c, 0xa9, 0x1f, 0x13,
+                                                    0x67, 0x0, 0x8d, 0xa9, 0xaa, 0x8c, 0xa9, 0x1b,
+                                                    0xf7, 0xf2, 0x6, 0xb7, 0xf7, 0x3c, 0x5, 0x73,
+                                                    0x6, 0x52, 0xfb, 0x2, 0x5e, 0x7b, 0x5b, 0x89,
+                                                    0xfb, 0x10, 0x89, 0x18, 0x67, 0x77, 0x8d, 0xb7,
+                                                    0x1f, 0x27, 0xba, 0x15, 0x13, 0xb3, 0x0, 0x56,
+                                                    0x7d, 0x5c, 0x37, 0xfb, 0x23, 0x5b, 0xf7, 0x16,
+                                                    0xf7, 0x3d, 0xf7, 0x34, 0xbf, 0xf7, 0x22, 0xf7,
+                                                    0x1e, 0xe3, 0x96, 0x54, 0x59, 0x1e, 0xe, 0xf8,
+                                                    0x1, 0x81, 0xa5, 0x71, 0xce, 0xf7, 0x66, 0xa9,
+                                                    0xf7, 0x1a, 0xa8, 0x12, 0xa9, 0xe5, 0xf7, 0x73,
+                                                    0xd8, 0xf7, 0x33, 0xea, 0x13, 0x7e, 0xf8, 0x13,
+                                                    0xe0, 0x15, 0x4c, 0xa4, 0xb3, 0x6b, 0xcc, 0x1b,
+                                                    0xec, 0xbc, 0xdd, 0xce, 0xaa, 0x1f, 0x80, 0x91,
+                                                    0x5, 0x6e, 0x76, 0x60, 0x50, 0x4b, 0x1b, 0xfb,
+                                                    0xf, 0x85, 0xf7, 0x32, 0xbf, 0x89, 0x1f, 0xf7,
+                                                    0x92, 0x6, 0xf7, 0x36, 0xfb, 0xa, 0xaa, 0x62,
+                                                    0x40, 0x6a, 0x5e, 0x6c, 0x74, 0x1e, 0xd0, 0x54,
+                                                    0x4a, 0x92, 0x6e, 0x1b, 0xfb, 0x43, 0x6d, 0xfb,
+                                                    0x48, 0x50, 0xfb, 0x3e, 0xf7, 0x8, 0x4e, 0xe9,
+                                                    0xa3, 0xd5, 0x8f, 0xe6, 0xb8, 0x1f, 0xfb, 0x9b,
+                                                    0xf7, 0x58, 0x15, 0xf7, 0xc, 0xcc, 0xa9, 0xb5,
+                                                    0xf7, 0x1, 0x92, 0xfb, 0x3c, 0x52, 0x1e, 0x13,
+                                                    0xbe, 0xfb, 0x6, 0x71, 0x3f, 0x3d, 0xfb, 0x7,
+                                                    0x87, 0xf7, 0x4c, 0xdc, 0x1e, 0xf7, 0xbf, 0x9b,
+                                                    0x15, 0xa8, 0x8d, 0xf4, 0xdc, 0xbc, 0xa7, 0x50,
+                                                    0x5b, 0x1e, 0x70, 0x7, 0xe, 0xf7, 0x5b, 0x7d,
+                                                    0xaf, 0x7d, 0x76, 0xf9, 0x1c, 0xb4, 0xf7, 0x66,
+                                                    0x77, 0x12, 0xd2, 0xe1, 0xf7, 0x7d, 0xf0, 0x13,
+                                                    0x7c, 0xd3, 0x7e, 0x15, 0xa1, 0x6, 0x9b, 0x9f,
+                                                    0x9c, 0xa0, 0x1e, 0x13, 0xbc, 0xa9, 0xb2, 0x69,
+                                                    0xd7, 0x1b, 0xf7, 0x23, 0xcf, 0xeb, 0xe0, 0xf5,
+                                                    0x32, 0xc4, 0x35, 0xbd, 0x1f, 0x3a, 0xba, 0x3d,
+                                                    0xb5, 0xd4, 0x1a, 0xc9, 0xbe, 0xaa, 0xbd, 0xf4,
+                                                    0xcb, 0x31, 0x39, 0x9c, 0x1e, 0xa4, 0x6, 0x75,
+                                                    0x86, 0x1d, 0x72, 0x5f, 0xad, 0x4f, 0x55, 0xa,
+                                                    0x74, 0x6, 0x13, 0x7c, 0xf7, 0x61, 0xf8, 0x9c,
+                                                    0x31, 0xa, 0xab, 0x81, 0xa1, 0x90, 0x76, 0xf7,
+                                                    0x30, 0x77, 0xf7, 0xb0, 0xa2, 0x97, 0x77, 0xf7,
+                                                    0x87, 0x77, 0x12, 0xf7, 0xac, 0xd1, 0x13, 0x76,
+                                                    0xbf, 0x87, 0x15, 0x98, 0x6, 0x94, 0x91, 0x99,
+                                                    0x8e, 0x97, 0x1b, 0x9b, 0x8c, 0x9e, 0x84, 0xa0,
+                                                    0x86, 0x8, 0x13, 0xb6, 0x87, 0x9a, 0x9b, 0x88,
+                                                    0x9e, 0x1b, 0xcb, 0xde, 0xb5, 0xe2, 0xc7, 0x66,
+                                                    0x66, 0xa, 0xb7, 0xb8, 0x76, 0x25, 0xa1, 0x1e,
+                                                    0x9a, 0x6, 0x13, 0xae, 0x87, 0xf7, 0x1d, 0x5,
+                                                    0x80, 0x6, 0x87, 0x88, 0x7c, 0x84, 0x82, 0x1b,
+                                                    0x82, 0x80, 0x91, 0x91, 0x7c, 0x1f, 0x13, 0xb6,
+                                                    0x8f, 0x7f, 0x7b, 0x7c, 0x1d, 0xe5, 0x58, 0xa1,
+                                                    0x73, 0x6b, 0x1a, 0x52, 0x5a, 0x95, 0xa, 0x7b,
+                                                    0x6, 0x13, 0x76, 0xf7, 0x3, 0xf7, 0xf7, 0x31,
+                                                    0xa, 0x80, 0x1d, 0xf9, 0x17, 0x97, 0xa, 0xe8,
+                                                    0xef, 0x12, 0xf7, 0x69, 0xed, 0x8f, 0xf1, 0x82,
+                                                    0xed, 0x13, 0xcc, 0x68, 0xa, 0xa3, 0xdd, 0x1a,
+                                                    0xf7, 0x45, 0x7e, 0x1d, 0x13, 0x3c, 0x4b, 0x1d,
+                                                    0x7, 0x13, 0x4c, 0x5e, 0x1d, 0x8a, 0xf9, 0x92,
+                                                    0x15, 0x13, 0x9a, 0x6f, 0x9f, 0x35, 0x1d, 0x77,
+                                                    0x62, 0x1d, 0xf7, 0x5b, 0x16, 0x6f, 0x9f, 0x35,
+                                                    0x1d, 0x77, 0x62, 0x1d, 0xe, 0x7b, 0xa, 0x8b,
+                                                    0x77, 0xf8, 0xf2, 0xb1, 0xf7, 0x74, 0x77, 0x1,
+                                                    0xaa, 0xa5, 0xf8, 0x99, 0xa2, 0x3f, 0x1d, 0xf7,
+                                                    0x9d, 0xf9, 0x54, 0x31, 0xa, 0xe2, 0x8b, 0xa9,
+                                                    0xf8, 0x1a, 0xa9, 0xf7, 0x74, 0x77, 0x6a, 0xa,
+                                                    0x7a, 0x6c, 0x21, 0x1b, 0xfb, 0x13, 0x56, 0x1d,
+                                                    0xf7, 0x38, 0xf8, 0x80, 0x31, 0xa, 0xfb, 0x51,
+                                                    0xa3, 0xf8, 0xb1, 0xaa, 0xf7, 0x84, 0xa8, 0x1,
+                                                    0xeb, 0xf8, 0xc, 0x15, 0xf7, 0xd, 0x6, 0x63,
+                                                    0xfc, 0x3, 0x5, 0x38, 0x84, 0x79, 0x30, 0x50,
+                                                    0x1b, 0x80, 0x83, 0x91, 0x92, 0x1f, 0x95, 0x9a,
+                                                    0x96, 0x9e, 0x1a, 0xa2, 0x7d, 0x99, 0x75, 0x7e,
+                                                    0x6a, 0x83, 0x67, 0x65, 0xa8, 0x6b, 0xbd, 0xeb,
+                                                    0xba, 0xf1, 0xf7, 0x43, 0xac, 0x1e, 0x9a, 0xda,
+                                                    0x93, 0xe4, 0x9c, 0xf7, 0xc, 0x8, 0xf7, 0xc,
+                                                    0x6, 0x95, 0xaa, 0x5, 0xfb, 0x12, 0x6, 0xf7,
+                                                    0x18, 0x97, 0x99, 0xf7, 0x0, 0xcc, 0x1b, 0x96,
+                                                    0x96, 0x89, 0x80, 0x1f, 0x82, 0x7e, 0x7f, 0x7b,
+                                                    0x1a, 0x7f, 0x97, 0x75, 0xa4, 0xa3, 0xa2, 0x9c,
+                                                    0xa9, 0xa8, 0x6c, 0xb0, 0x57, 0xfb, 0x26, 0x6c,
+                                                    0xfb, 0x6f, 0x59, 0x84, 0x1e, 0xfb, 0x9, 0x6,
+                                                    0xe, 0x91, 0xa, 0x96, 0xf8, 0x8f, 0x2b, 0x1d,
+                                                    0xfb, 0xf, 0xf7, 0x3b, 0x5, 0x49, 0x6, 0xe,
+                                                    0x91, 0xa, 0xf7, 0x1b, 0xf8, 0x8f, 0x31, 0xa,
+                                                    0x73, 0xf8, 0x8f, 0xc0, 0xf3, 0x77, 0x1, 0xa5,
+                                                    0xf9, 0x2c, 0x15, 0x6e, 0x9b, 0xfb, 0x14, 0xf7,
+                                                    0xe, 0xf7, 0x14, 0x9a, 0xf7, 0x12, 0xaa, 0x1e,
+                                                    0x6e, 0x6, 0x4e, 0x82, 0x5c, 0x60, 0x53, 0x1b,
+                                                    0x4b, 0x66, 0xb6, 0xc8, 0x81, 0x1f, 0xe, 0x73,
+                                                    0xf8, 0x9f, 0xef, 0x1, 0xf7, 0xa, 0xed, 0x3,
+                                                    0xf7, 0xa, 0xf8, 0xd1, 0x15, 0x36, 0xa, 0xe,
+                                                    0x73, 0xf8, 0x94, 0xad, 0xf7, 0x17, 0xad, 0x12,
+                                                    0xce, 0xf7, 0x5b, 0x69, 0xad, 0x13, 0xe0, 0xce,
+                                                    0xf8, 0xf7, 0x15, 0x55, 0xb5, 0x5e, 0xc4, 0x79,
+                                                    0x1d, 0x53, 0x60, 0x5d, 0x55, 0x1e, 0xad, 0x8c,
+                                                    0x15, 0xa3, 0x9f, 0xb4, 0xb8, 0x1e, 0x13, 0xd0,
+                                                    0xb0, 0xa8, 0x6d, 0x67, 0x67, 0x6e, 0x6e, 0x65,
+                                                    0x5e, 0x78, 0xb4, 0xa4, 0x1f, 0xe, 0x73, 0xfb,
+                                                    0x24, 0x76, 0xf7, 0x39, 0x77, 0x1, 0xcb, 0xc0,
+                                                    0x3, 0xf7, 0xc, 0x16, 0x72, 0x7b, 0x6c, 0x61,
+                                                    0x64, 0x1a, 0x6d, 0xa0, 0x65, 0xc5, 0xb4, 0xbd,
+                                                    0xa9, 0xc2, 0x9a, 0x1e, 0x7b, 0x92, 0x5, 0x6c,
+                                                    0x81, 0x68, 0x7b, 0x6e, 0x1b, 0x73, 0x79, 0x99,
+                                                    0xa8, 0xab, 0xa8, 0xaa, 0x9d, 0x99, 0x1f, 0xe,
+                                                    0x73, 0xf8, 0xa8, 0xf5, 0x1, 0x8c, 0xf8, 0xa8,
+                                                    0x15, 0xa8, 0x6, 0x91, 0x9c, 0x98, 0xb9, 0xaf,
+                                                    0x7f, 0x8, 0x6c, 0xe5, 0x9f, 0x77, 0x52, 0x1d,
+                                                    0x7a, 0x63, 0x7c, 0x79, 0x71, 0x93, 0x8, 0xa2,
+                                                    0x43, 0x5e, 0xa6, 0x76, 0x54, 0xa, 0x73, 0xf8,
+                                                    0x8f, 0xf7, 0x3f, 0x1, 0x88, 0xf8, 0x8f, 0x15,
+                                                    0xb5, 0x6, 0xf7, 0x2c, 0x22, 0x1d, 0x94, 0xfb,
+                                                    0x28, 0x15, 0xb5, 0x6, 0xf7, 0x2c, 0x22, 0x1d,
+                                                    0xe, 0x8a, 0xa, 0xf8, 0x88, 0xb4, 0xfc, 0x88,
+                                                    0x6, 0xe, 0xf9, 0x17, 0x8a, 0xa, 0xfa, 0x7c,
+                                                    0xb4, 0xfe, 0x7c, 0x6, 0xe, 0x91, 0x1d, 0xf7,
+                                                    0x7, 0xf7, 0x1f, 0x3, 0xf7, 0x80, 0xf9, 0x25,
+                                                    0x15, 0x51, 0xa, 0x6b, 0x99, 0x71, 0x84, 0x87,
+                                                    0x88, 0x89, 0x86, 0x1e, 0x89, 0x87, 0x87, 0x8a,
+                                                    0x87, 0x64, 0xa, 0xe, 0x91, 0x1d, 0xda, 0xf7,
+                                                    0x1f, 0x3, 0xf5, 0xf8, 0x45, 0x15, 0x3c, 0xa,
+                                                    0xad, 0x7c, 0xa5, 0x92, 0x92, 0x91, 0x8c, 0x8e,
+                                                    0x1e, 0x54, 0x1d, 0x73, 0xfb, 0xc, 0x76, 0xf7,
+                                                    0x2d, 0x76, 0xa7, 0x76, 0xf3, 0x77, 0x12, 0xda,
+                                                    0xf7, 0x1f, 0x13, 0xd8, 0xec, 0xfb, 0xe, 0x15,
+                                                    0x94, 0x78, 0x5, 0x3c, 0xa, 0xad, 0x7e, 0xa5,
+                                                    0x92, 0x92, 0x5c, 0xa, 0xe2, 0xf8, 0x45, 0xf7,
+                                                    0x3, 0xf7, 0x18, 0x77, 0x1, 0xb6, 0x97, 0x1d,
+                                                    0x3, 0xf7, 0x38, 0xf9, 0x25, 0x15, 0x48, 0x1d,
+                                                    0xf7, 0x7c, 0x16, 0x48, 0x1d, 0xe, 0xe2, 0xf8,
+                                                    0x5a, 0x76, 0xf7, 0x18, 0xf7, 0x3, 0x1, 0xa9,
+                                                    0x97, 0x1d, 0x3, 0xc4, 0xf8, 0x45, 0x48, 0xa,
+                                                    0xf7, 0x85, 0x78, 0x48, 0xa, 0xe, 0xe2, 0xfb,
+                                                    0xc, 0x76, 0xf7, 0x18, 0xf7, 0x3, 0x38, 0x76,
+                                                    0x12, 0xb8, 0x97, 0x1d, 0x13, 0xd8, 0xca, 0xfb,
+                                                    0xe, 0x15, 0x94, 0x78, 0x5, 0x46, 0x1d, 0x13,
+                                                    0xb8, 0x33, 0xa, 0xf7, 0x7c, 0x16, 0x94, 0x78,
+                                                    0x5, 0xa9, 0x95, 0xdd, 0xcd, 0xd2, 0x1a, 0x13,
+                                                    0xd8, 0xde, 0x51, 0x98, 0x74, 0x72, 0x6a, 0x7c,
+                                                    0x60, 0x63, 0xae, 0x7e, 0xa5, 0x92, 0x91, 0x5c,
+                                                    0xa, 0xfb, 0x14, 0x76, 0xf8, 0xbd, 0xe2, 0xf7,
+                                                    0x4d, 0x77, 0x1, 0xf7, 0x84, 0xa2, 0x3, 0xf7,
+                                                    0x85, 0xfb, 0x29, 0x15, 0xa0, 0x6, 0x8c, 0xf7,
+                                                    0x23, 0x5, 0xf7, 0xf, 0xa0, 0xec, 0x9e, 0xb2,
+                                                    0x1e, 0x61, 0xb6, 0x8b, 0xeb, 0xb9, 0x1a, 0xb2,
+                                                    0x88, 0xa2, 0x84, 0x9c, 0x84, 0x8, 0x82, 0xa0,
+                                                    0x98, 0x83, 0xa4, 0x1b, 0x9d, 0xa4, 0x94, 0xae,
+                                                    0xaa, 0x74, 0x97, 0x79, 0x72, 0x7d, 0x81, 0x82,
+                                                    0x76, 0x1f, 0x79, 0x83, 0x75, 0x84, 0x63, 0x8a,
+                                                    0x8, 0xc2, 0x92, 0xaa, 0x93, 0xa1, 0x1e, 0x95,
+                                                    0xa5, 0x96, 0x98, 0xa5, 0x1a, 0xa4, 0x75, 0xa1,
+                                                    0x73, 0x71, 0x76, 0x75, 0x72, 0x71, 0x96, 0x7e,
+                                                    0x95, 0x71, 0x1e, 0x93, 0x75, 0x92, 0x6c, 0x54,
+                                                    0x1a, 0x5f, 0x8c, 0x73, 0x94, 0x78, 0x94, 0x8,
+                                                    0x93, 0x79, 0x7e, 0x93, 0x75, 0x1b, 0x79, 0x74,
+                                                    0x7f, 0x6c, 0x68, 0xa2, 0x82, 0x9d, 0xa1, 0x98,
+                                                    0x91, 0x92, 0x9c, 0x1f, 0x9e, 0x93, 0xa2, 0x95,
+                                                    0xb9, 0x8e, 0x8, 0x5d, 0x8b, 0x2b, 0x61, 0x60,
+                                                    0x1e, 0x9c, 0x64, 0xa2, 0x2a, 0x8d, 0xfb, 0xf,
+                                                    0x8, 0xe, 0xfb, 0x57, 0x76, 0xf7, 0x38, 0xe1,
+                                                    0x7e, 0x76, 0xf8, 0x50, 0xe1, 0xf7, 0x38, 0x77,
+                                                    0x12, 0xcf, 0xf7, 0x54, 0x4f, 0xef, 0x4f, 0x9f,
+                                                    0x77, 0xf7, 0x54, 0x13, 0xd9, 0x0, 0xf7, 0x84,
+                                                    0x16, 0x13, 0xda, 0x0, 0x76, 0xa, 0x13, 0xd9,
+                                                    0x0, 0xb7, 0xac, 0xad, 0xbc, 0x1b, 0x8c, 0x5d,
+                                                    0x62, 0x52, 0x63, 0x1a, 0x13, 0xdc, 0x0, 0x6d,
+                                                    0xa0, 0x72, 0xa8, 0xa8, 0xa0, 0xa4, 0xa9, 0x1e,
+                                                    0x13, 0xb9, 0x0, 0xb3, 0x62, 0xc4, 0x8c, 0xb9,
+                                                    0x1e, 0x78, 0x1d, 0x5f, 0x6a, 0x69, 0x5a, 0x1b,
+                                                    0x13, 0xdc, 0x0, 0x8f, 0xb3, 0x98, 0xa1, 0xa9,
+                                                    0xa0, 0x8, 0x67, 0xb6, 0x80, 0xc6, 0xc1, 0x1a,
+                                                    0xc1, 0x96, 0xc6, 0xaf, 0xb6, 0x1e, 0x13, 0xd9,
+                                                    0x0, 0x6d, 0xa0, 0x7e, 0xa1, 0x87, 0xb3, 0x8,
+                                                    0x13, 0xda, 0x0, 0x78, 0x1d, 0x13, 0xdc, 0x0,
+                                                    0x5f, 0x6a, 0x69, 0x5a, 0x1b, 0x8a, 0xb9, 0xb4,
+                                                    0xc4, 0xb3, 0x1a, 0x13, 0xd8, 0x80, 0xa9, 0x76,
+                                                    0xa4, 0x6e, 0x6e, 0x76, 0x72, 0x6d, 0x1e, 0x13,
+                                                    0xbc, 0x0, 0x63, 0xb4, 0x52, 0x8a, 0x5d, 0x1e,
+                                                    0x76, 0xa, 0xb7, 0xac, 0xad, 0xbc, 0x1b, 0x87,
+                                                    0x63, 0x7e, 0x75, 0x6d, 0x76, 0x8, 0x13, 0xd8,
+                                                    0x80, 0xaf, 0x60, 0x96, 0x50, 0x55, 0x1a, 0x55,
+                                                    0x80, 0x50, 0x67, 0x60, 0x1e, 0x13, 0xd9, 0x0,
+                                                    0xa9, 0x76, 0x98, 0x75, 0x8f, 0x63, 0x8, 0xe,
+                                                    0x84, 0xf7, 0x6d, 0x76, 0xf7, 0xa2, 0x77, 0x1,
+                                                    0xb3, 0xf7, 0xdf, 0x15, 0x40, 0xc7, 0x4f, 0xd6,
+                                                    0xd6, 0xc7, 0xc8, 0xd5, 0xd6, 0x4f, 0xc7, 0x40,
+                                                    0x3f, 0x50, 0x4f, 0x40, 0x1e, 0xe, 0xf9, 0x17,
+                                                    0x80, 0xf7, 0x3, 0x1, 0xf7, 0x3, 0xf7, 0x4,
+                                                    0xf7, 0x70, 0xf7, 0x5, 0xf7, 0x70, 0xf7, 0x4,
+                                                    0x14, 0x70, 0xf7, 0x3, 0xb6, 0x15, 0x65, 0xad,
+                                                    0x81, 0xa, 0x72, 0x99, 0xa, 0xf7, 0xe0, 0x16,
+                                                    0x65, 0xae, 0x81, 0xa, 0x71, 0x99, 0xa, 0xf7,
+                                                    0xe1, 0x16, 0x65, 0xae, 0x4d, 0x1d, 0x71, 0x99,
+                                                    0xa, 0xe, 0xf9, 0x17, 0x7f, 0xa8, 0x6f, 0x76,
+                                                    0xf7, 0xcd, 0xa7, 0x90, 0xa8, 0xf7, 0x9b, 0xa8,
+                                                    0x9c, 0x77, 0x12, 0xb2, 0xd4, 0xf7, 0x1f, 0xd4,
+                                                    0xb7, 0xd4, 0xf7, 0x1f, 0xd4, 0xa9, 0xd3, 0xf7,
+                                                    0x20, 0xd4, 0x13, 0x77, 0xf0, 0xf7, 0xe, 0x82,
+                                                    0x15, 0xaa, 0x74, 0xf8, 0x27, 0xf9, 0x29, 0x6b,
+                                                    0xa2, 0x5, 0x13, 0xbb, 0xf0, 0xfc, 0x79, 0xfb,
+                                                    0x57, 0x15, 0x3e, 0x8d, 0x1d, 0xed, 0x28, 0x1e,
+                                                    0x8a, 0x6, 0x28, 0x60, 0x29, 0x3b, 0x1f, 0xd4,
+                                                    0x8c, 0x15, 0xbe, 0x95, 0xec, 0xc7, 0x1e, 0x8c,
+                                                    0x6, 0xc8, 0x92, 0x28, 0x59, 0x5d, 0x84, 0x25,
+                                                    0x4e, 0x50, 0x7f, 0xf0, 0xbb, 0x1f, 0xf7, 0x94,
+                                                    0xfb, 0xb9, 0x15, 0x3d, 0xb6, 0x28, 0xef, 0xee,
+                                                    0xb6, 0xee, 0xd9, 0xda, 0x60, 0xee, 0x29, 0x1e,
+                                                    0x8a, 0x6, 0x27, 0x60, 0x28, 0x3c, 0x1f, 0xf7,
+                                                    0xcf, 0x16, 0x3d, 0x8d, 0x1d, 0xee, 0x28, 0x1e,
+                                                    0x8a, 0x6, 0x28, 0x60, 0x28, 0x3c, 0x1f, 0xfb,
+                                                    0x86, 0x8c, 0x15, 0xbd, 0x94, 0xed, 0xc8, 0x1e,
+                                                    0x8c, 0x6, 0xc8, 0x92, 0x27, 0x5a, 0x5d, 0x83,
+                                                    0x25, 0x4f, 0x4d, 0x82, 0xf0, 0xbb, 0x1f, 0xf7,
+                                                    0xce, 0x16, 0xbd, 0x96, 0xed, 0xc6, 0x1e, 0x8c,
+                                                    0x6, 0xc9, 0x92, 0x27, 0x5a, 0x5d, 0x83, 0x25,
+                                                    0x4e, 0x4e, 0x81, 0xef, 0xbc, 0x1f, 0xe, 0x73,
+                                                    0x79, 0xa, 0xca, 0xf7, 0x77, 0x42, 0x1d, 0x97,
+                                                    0x9b, 0xb1, 0xbc, 0xab, 0xb6, 0x8, 0xa5, 0xae,
+                                                    0xa0, 0xaa, 0x91, 0x96, 0x1d, 0x73, 0x79, 0xa,
+                                                    0xc6, 0xac, 0x15, 0xf7, 0x67, 0xf7, 0x51, 0x5,
+                                                    0xaa, 0x5e, 0xfb, 0x2d, 0xf7, 0x37, 0x51, 0x1d,
+                                                    0x7e, 0x7a, 0x61, 0x55, 0x6a, 0x5e, 0x8, 0x74,
+                                                    0x6b, 0x79, 0x71, 0x8f, 0x1d, 0xfb, 0x52, 0x92,
+                                                    0x7a, 0x1d, 0xfb, 0x3c, 0xf8, 0x87, 0x3, 0xfb,
+                                                    0xb, 0x7d, 0x15, 0xf8, 0x56, 0xf9, 0x46, 0x5,
+                                                    0x5d, 0x6, 0xfc, 0x59, 0xfd, 0x46, 0x5, 0xe,
+                                                    0xf8, 0x1, 0x8b, 0xc3, 0xf7, 0x57, 0xb3, 0xe4,
+                                                    0xb3, 0xf7, 0x6c, 0xb1, 0x1, 0xf7, 0x26, 0xf7,
+                                                    0x4, 0x2f, 0xf7, 0x4, 0xf8, 0x14, 0xa5, 0x3,
+                                                    0xf7, 0x3a, 0xf7, 0x8f, 0x15, 0xfb, 0x2a, 0x9a,
+                                                    0xf7, 0x1e, 0x26, 0xf7, 0x15, 0x1b, 0xf7, 0xb,
+                                                    0xdc, 0xc9, 0xd9, 0xc5, 0x1f, 0x77, 0x95, 0x5,
+                                                    0x5f, 0x56, 0x59, 0x59, 0x51, 0x1b, 0xfb, 0x6,
+                                                    0xfb, 0x18, 0xc8, 0xf7, 0x1a, 0x8a, 0x1f, 0xf7,
+                                                    0xc3, 0x6, 0x99, 0xb3, 0x5, 0xfb, 0xd2, 0x6,
+                                                    0x89, 0xab, 0x89, 0xa5, 0x8f, 0xaa, 0x8, 0xf7,
+                                                    0xe4, 0x6, 0x9a, 0xb3, 0x5, 0xfb, 0xee, 0x6,
+                                                    0xf7, 0x16, 0xf1, 0xe0, 0xf5, 0x8c, 0x1e, 0xf7,
+                                                    0x11, 0xba, 0x51, 0x2c, 0x1f, 0xa5, 0xf7, 0x26,
+                                                    0x6, 0xa4, 0x49, 0x64, 0x9f, 0x23, 0x1b, 0xfb,
+                                                    0x18, 0xfb, 0x7, 0x68, 0xfb, 0x6f, 0x4d, 0x1f,
+                                                    0xfb, 0xc, 0x6, 0x7c, 0x63, 0x5, 0xf7, 0x16,
+                                                    0x6, 0x88, 0x6d, 0x8a, 0x6e, 0x8d, 0x6d, 0x8,
+                                                    0xfb, 0x5, 0x6, 0x7c, 0x63, 0x5, 0xe, 0xf9,
+                                                    0x3, 0xf7, 0x96, 0x9f, 0x8a, 0x76, 0xf8, 0x16,
+                                                    0x9f, 0x12, 0xf7, 0x3b, 0xd2, 0xf7, 0x8e, 0xa5,
+                                                    0xf7, 0xd0, 0xd2, 0x13, 0xbc, 0xf7, 0x9, 0xf7,
+                                                    0x96, 0x15, 0xf7, 0x3f, 0x9f, 0x6, 0x57, 0x91,
+                                                    0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0xc0, 0xbd, 0x7,
+                                                    0xb4, 0x9c, 0x6c, 0x66, 0x94, 0x1f, 0x9f, 0xe3,
+                                                    0xfb, 0xed, 0x33, 0x9f, 0x6, 0xb0, 0x94, 0x9c,
+                                                    0xaa, 0xb5, 0x1b, 0xbc, 0xfb, 0xc0, 0x6, 0x5b,
+                                                    0x8d, 0x81, 0x57, 0x85, 0x1e, 0xf7, 0xd3, 0x77,
+                                                    0x15, 0xf7, 0x17, 0x9f, 0x6, 0x5e, 0x8f, 0x83,
+                                                    0xa6, 0xb7, 0x1a, 0xf7, 0x65, 0x8d, 0x7, 0x13,
+                                                    0x7c, 0xf7, 0x29, 0xfb, 0xc6, 0x5, 0x96, 0x6,
+                                                    0xf7, 0x2c, 0xf7, 0xc8, 0x5, 0x8d, 0xfb, 0x72,
+                                                    0x6, 0x13, 0xbc, 0x5b, 0x8e, 0x81, 0x57, 0x85,
+                                                    0x1e, 0x77, 0xf7, 0x3e, 0x9f, 0x7, 0x57, 0x91,
+                                                    0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0x89, 0x7, 0xae,
+                                                    0x97, 0x9d, 0xb7, 0x8d, 0x1e, 0x9f, 0x24, 0x7,
+                                                    0xfb, 0x34, 0xfb, 0xc9, 0xfb, 0x2e, 0xf7, 0xc9,
+                                                    0x5, 0xfb, 0xd, 0x77, 0x6, 0xa8, 0xa7, 0x77,
+                                                    0x6d, 0x97, 0x1f, 0xfb, 0x83, 0x7, 0x5f, 0x83,
+                                                    0x70, 0x5f, 0x84, 0x1d, 0xf7, 0x63, 0xf7, 0x70,
+                                                    0xcd, 0x12, 0x13, 0x80, 0xa9, 0xf7, 0x70, 0x15,
+                                                    0xf8, 0x8c, 0xba, 0xfc, 0x8c, 0x6, 0xe, 0x99,
+                                                    0x1d, 0xf8, 0x36, 0xab, 0xf7, 0x64, 0xa4, 0x1,
+                                                    0xee, 0xdf, 0xf7, 0x4f, 0xdf, 0x3, 0xaa, 0x16,
+                                                    0xf7, 0x71, 0x9a, 0x6, 0x48, 0x8e, 0x89, 0xb3,
+                                                    0xb3, 0x1a, 0xf7, 0xd4, 0x7, 0xa0, 0xf7, 0x9,
+                                                    0x89, 0x8a, 0x98, 0x1f, 0xac, 0x86, 0x8e, 0x80,
+                                                    0x65, 0x1a, 0xfb, 0x92, 0x7, 0x4f, 0x89, 0x6f,
+                                                    0x48, 0x87, 0x1e, 0x7c, 0xf7, 0x70, 0x9a, 0x7,
+                                                    0x58, 0x8f, 0x7b, 0x9f, 0xcf, 0x1a, 0xf7, 0x90,
+                                                    0x7, 0xa4, 0x8c, 0xb4, 0x8c, 0xab, 0x1e, 0x87,
+                                                    0x8e, 0x5, 0x85, 0x6a, 0x60, 0x87, 0x66, 0x1b,
+                                                    0xfb, 0x31, 0x6, 0x8a, 0xce, 0x8b, 0xba, 0x97,
+                                                    0xa9, 0x8, 0xa8, 0x97, 0xad, 0xae, 0xba, 0x1b,
+                                                    0xac, 0x9d, 0x7a, 0x78, 0x99, 0x1f, 0x74, 0x9c,
+                                                    0x97, 0x72, 0xa8, 0x1b, 0x9e, 0x9b, 0x9c, 0x9f,
+                                                    0xbf, 0x4e, 0x9f, 0x4a, 0xfb, 0x20, 0x42, 0x36,
+                                                    0xfb, 0x28, 0x86, 0x1f, 0x46, 0x6b, 0xcf, 0xfb,
+                                                    0xd5, 0x6, 0x51, 0x78, 0x74, 0x5a, 0x8a, 0x1e,
+                                                    0xe, 0x99, 0x1d, 0xf8, 0x36, 0xab, 0xf7, 0x62,
+                                                    0xa6, 0x1, 0xf0, 0xdf, 0xf7, 0x50, 0xdf, 0x3,
+                                                    0xab, 0x16, 0xf7, 0x74, 0x9a, 0x6, 0x61, 0x8f,
+                                                    0x6e, 0x9a, 0xc2, 0x1a, 0xf7, 0xdd, 0xf7, 0x50,
+                                                    0xfb, 0xd8, 0x7, 0x4d, 0x6a, 0x7d, 0x69, 0x88,
+                                                    0x1e, 0x7c, 0xf7, 0x6b, 0x9a, 0x7, 0x51, 0x8e,
+                                                    0x85, 0xa6, 0xb9, 0x1a, 0xf8, 0xe2, 0x7, 0x86,
+                                                    0x8d, 0x5, 0x8a, 0x7f, 0x5d, 0x73, 0x7d, 0x1b,
+                                                    0x7c, 0x7e, 0x94, 0x92, 0x76, 0x1f, 0x90, 0x7c,
+                                                    0x78, 0x8f, 0x71, 0x1b, 0x61, 0xfb, 0x11, 0x78,
+                                                    0xfb, 0x6a, 0x8a, 0x1f, 0x44, 0x6b, 0xd0, 0xfb,
+                                                    0xdd, 0x6, 0x69, 0x78, 0x67, 0x59, 0x87, 0x1e,
+                                                    0xf7, 0x2d, 0xf8, 0x47, 0x15, 0xe5, 0x89, 0x89,
+                                                    0xf7, 0x8, 0xd1, 0x1b, 0xa9, 0x96, 0x78, 0x79,
+                                                    0x97, 0x1f, 0x79, 0x97, 0x97, 0x7a, 0xa9, 0x1b,
+                                                    0x94, 0x8e, 0x8f, 0x8e, 0x8e, 0x1f, 0xfb, 0x21,
+                                                    0x7, 0xe, 0x7d, 0x99, 0xf8, 0x56, 0x95, 0xf7,
+                                                    0x5e, 0x99, 0x6, 0xfb, 0x6e, 0x8c, 0x7, 0x1e,
+                                                    0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xa7, 0xa,
+                                                    0xdf, 0xb, 0xa7, 0x93, 0x8d, 0x8e, 0xc, 0xc,
+                                                    0xdf, 0x91, 0x97, 0xc, 0xd, 0xf8, 0x88, 0x14,
+                                                    0xf7, 0xf9, 0x15, 0xb6, 0x13, 0x0, 0x7b, 0x2,
+                                                    0x0, 0x1, 0x0, 0x36, 0x0, 0x3f, 0x0, 0x4f,
+                                                    0x0, 0x69, 0x0, 0x6c, 0x0, 0x75, 0x0, 0x8f,
+                                                    0x0, 0x96, 0x0, 0x9b, 0x0, 0xa6, 0x0, 0xb1,
+                                                    0x0, 0xcc, 0x0, 0xd3, 0x0, 0xdc, 0x0, 0xee,
+                                                    0x0, 0xff, 0x1, 0x7, 0x1, 0x1b, 0x1, 0x30,
+                                                    0x1, 0x37, 0x1, 0x43, 0x1, 0x65, 0x1, 0x6e,
+                                                    0x1, 0x79, 0x1, 0x7e, 0x1, 0x89, 0x1, 0xbd,
+                                                    0x1, 0xda, 0x1, 0xe0, 0x1, 0xe7, 0x2, 0x1c,
+                                                    0x2, 0x29, 0x2, 0x34, 0x2, 0x3c, 0x2, 0x52,
+                                                    0x2, 0x5f, 0x2, 0x78, 0x2, 0x91, 0x2, 0xbb,
+                                                    0x2, 0xcc, 0x2, 0xd2, 0x2, 0xe0, 0x2, 0xf6,
+                                                    0x2, 0xfe, 0x3, 0xc, 0x3, 0x14, 0x3, 0x1e,
+                                                    0x3, 0x28, 0x3, 0x34, 0x3, 0x47, 0x3, 0x52,
+                                                    0x3, 0x74, 0x3, 0x7b, 0x3, 0x9b, 0x3, 0xba,
+                                                    0x3, 0xbe, 0x3, 0xcc, 0x3, 0xd7, 0x3, 0xf1,
+                                                    0x3, 0xf9, 0x3, 0xff, 0x4, 0x14, 0x4, 0x1b,
+                                                    0x4, 0x28, 0x4, 0x2f, 0x4, 0x36, 0x4, 0x3e,
+                                                    0x4, 0x53, 0x4, 0x5f, 0x4, 0x65, 0x4, 0x78,
+                                                    0x4, 0x85, 0x4, 0x90, 0x4, 0xa2, 0x4, 0xb4,
+                                                    0x4, 0xbd, 0x4, 0xcf, 0x4, 0xe1, 0x4, 0xe9,
+                                                    0x4, 0xef, 0x4, 0xf5, 0x4, 0xfb, 0x5, 0x4,
+                                                    0x5, 0x15, 0x5, 0x1c, 0x5, 0x26, 0x5, 0x35,
+                                                    0x5, 0x44, 0x5, 0x4d, 0x5, 0x54, 0x5, 0x5a,
+                                                    0x5, 0x5f, 0x5, 0x68, 0x5, 0x6b, 0x5, 0x78,
+                                                    0x5, 0x80, 0x5, 0x85, 0x5, 0x91, 0x5, 0x97,
+                                                    0x5, 0x9b, 0x5, 0xa6, 0x5, 0xaa, 0x5, 0xb3,
+                                                    0x5, 0xba, 0x5, 0xbf, 0x5, 0xc4, 0x5, 0xce,
+                                                    0x5, 0xd8, 0x5, 0xdf, 0x5, 0xe9, 0x5, 0xf3,
+                                                    0x5, 0xf7, 0x6, 0x0, 0x6, 0x9, 0x6, 0x12,
+                                                    0x6, 0x1b, 0x6, 0x23, 0x6, 0x2c, 0x6, 0x32,
+                                                    0x6, 0x38, 0x6, 0x3d, 0x6, 0x41, 0x6, 0x45,
+                                                    0x9a, 0x16, 0xf7, 0x5a, 0x9e, 0x6, 0x76, 0x5c,
+                                                    0x95, 0xb5, 0x96, 0x8e, 0x99, 0x90, 0x98, 0x1f,
+                                                    0xb9, 0xf6, 0x5, 0xf7, 0x9a, 0x6, 0xb4, 0x35,
+                                                    0x5, 0x91, 0x7d, 0x98, 0x6a, 0x7b, 0x1a, 0x66,
+                                                    0x6a, 0x80, 0x66, 0x1e, 0x78, 0xf7, 0x93, 0x9e,
+                                                    0x7, 0x5f, 0x8e, 0x7d, 0xa0, 0x6b, 0xd4, 0xfb,
+                                                    0x8d, 0xf8, 0xc2, 0x18, 0xb, 0x20, 0xa, 0x77,
+                                                    0x6, 0xfb, 0x64, 0xfc, 0x7f, 0xb, 0x32, 0xa,
+                                                    0xfb, 0x6b, 0x52, 0xa, 0x73, 0x2c, 0x1d, 0xbc,
+                                                    0xc7, 0xb9, 0xbd, 0xb2, 0x1e, 0xb, 0x3, 0x31,
+                                                    0x1d, 0xfb, 0x2f, 0x54, 0x5, 0x7c, 0x7, 0x8d,
+                                                    0x98, 0x98, 0x53, 0x1d, 0x50, 0x1f, 0xfb, 0x72,
+                                                    0x7, 0x3d, 0x7a, 0x7b, 0x4d, 0x88, 0x1e, 0xb,
+                                                    0x21, 0x1d, 0xe, 0x15, 0x87, 0xa, 0x8, 0x22,
+                                                    0xa, 0x2e, 0x7, 0xb, 0x6f, 0xa, 0x44, 0x80,
+                                                    0x77, 0x73, 0x32, 0x1b, 0xfb, 0x24, 0xf7, 0x46,
+                                                    0x6, 0xc2, 0x97, 0xa2, 0x33, 0x1d, 0x78, 0x6,
+                                                    0x60, 0xa, 0xfc, 0x3c, 0x7, 0xb, 0x77, 0x1,
+                                                    0xea, 0xdf, 0x23, 0xa, 0xb, 0x26, 0x1d, 0x3d,
+                                                    0x1d, 0xb, 0x28, 0x1d, 0x13, 0xd6, 0x3e, 0x1d,
+                                                    0x13, 0xba, 0x3c, 0x1d, 0xe, 0x8c, 0xfb, 0x57,
+                                                    0x15, 0x43, 0x90, 0xb5, 0x80, 0x2f, 0xa, 0xb,
+                                                    0xf7, 0x3, 0xf7, 0x24, 0xc5, 0xf7, 0x1c, 0xaa,
+                                                    0x95, 0x1f, 0x7b, 0x92, 0x5, 0x66, 0x74, 0x60,
+                                                    0x47, 0x32, 0x1b, 0x49, 0x3a, 0xaa, 0xf7, 0x45,
+                                                    0x7f, 0x1f, 0xb, 0x15, 0xf8, 0xb0, 0x6, 0x23,
+                                                    0x1d, 0xe, 0x3a, 0x1d, 0x72, 0x88, 0x8b, 0x7b,
+                                                    0x1b, 0x6c, 0xb, 0x7b, 0x8a, 0x8, 0xf7, 0x5d,
+                                                    0xf7, 0x82, 0x15, 0xf7, 0x7, 0xf7, 0xa7, 0xf7,
+                                                    0x8, 0xfb, 0xa7, 0x5, 0xb, 0x9d, 0x1b, 0x9b,
+                                                    0xaa, 0x8c, 0xbc, 0xb5, 0x1f, 0xa5, 0x7, 0x82,
+                                                    0x80, 0x7e, 0x81, 0x76, 0x1b, 0xb, 0x6f, 0xa1,
+                                                    0x35, 0x1d, 0x75, 0x62, 0x1d, 0xb, 0x15, 0xc9,
+                                                    0x6, 0xf7, 0x11, 0xf7, 0x3b, 0x5, 0x69, 0x6,
+                                                    0xfb, 0xe, 0x24, 0xfb, 0xd, 0xf2, 0x5, 0x69,
+                                                    0x6, 0xe, 0x99, 0x7, 0x4f, 0x89, 0x89, 0xa2,
+                                                    0xaf, 0x1a, 0xf7, 0xeb, 0xfb, 0x32, 0x7a, 0x7,
+                                                    0xd1, 0x89, 0x8f, 0x6c, 0x63, 0x1a, 0xb, 0x8c,
+                                                    0x8f, 0x8e, 0x8c, 0x38, 0x1d, 0xb, 0x61, 0xa,
+                                                    0xfb, 0x0, 0x44, 0x1d, 0xd4, 0xf1, 0xf1, 0xf7,
+                                                    0x3, 0xb, 0x15, 0xf7, 0x53, 0xa3, 0x6, 0x65,
+                                                    0x8d, 0x78, 0x9a, 0xa8, 0x1a, 0xf7, 0xe1, 0x7,
+                                                    0x7d, 0x8e, 0xfb, 0xa, 0x54, 0x5, 0x74, 0x7,
+                                                    0x98, 0xaf, 0x8b, 0x8b, 0x93, 0x1b, 0x92, 0x8b,
+                                                    0x7c, 0x7e, 0x1f, 0xb, 0x6f, 0xa0, 0x75, 0x9a,
+                                                    0x1d, 0xa1, 0x41, 0x1d, 0xb, 0x9d, 0xac, 0xa9,
+                                                    0xba, 0x80, 0x43, 0x1e, 0x4e, 0x4f, 0xa, 0xb,
+                                                    0xf9, 0x63, 0x25, 0x1d, 0xb, 0x92, 0x92, 0x86,
+                                                    0x82, 0x78, 0x7b, 0x5e, 0x49, 0x61, 0x1f, 0xb,
+                                                    0xf8, 0x4c, 0xfc, 0xb8, 0x5, 0x9c, 0xf8, 0x98,
+                                                    0x6, 0xf7, 0x9, 0xab, 0x99, 0xca, 0x92, 0x1e,
+                                                    0x9e, 0xfb, 0x7f, 0x78, 0x7, 0xcf, 0x86, 0xa7,
+                                                    0x79, 0xfb, 0x7, 0x1a, 0xfb, 0xd8, 0x89, 0x7,
+                                                    0xfc, 0x13, 0xf8, 0x75, 0x5, 0xfb, 0x3f, 0x78,
+                                                    0x6, 0xb3, 0x9b, 0x86, 0x59, 0xb4, 0x1f, 0xfc,
+                                                    0x43, 0x78, 0xa, 0xb, 0xfb, 0x7, 0xf7, 0x87,
+                                                    0x5, 0x88, 0x92, 0x84, 0x9b, 0x98, 0x1a, 0xa6,
+                                                    0xae, 0x96, 0xa2, 0x8c, 0x1e, 0x9a, 0xfb, 0x62,
+                                                    0x7d, 0x7, 0x98, 0x89, 0xa5, 0x7c, 0x97, 0x72,
+                                                    0xb, 0x3f, 0xa, 0x7c, 0x60, 0x63, 0xb, 0xa7,
+                                                    0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0xb, 0x15, 0xfb,
+                                                    0x53, 0xf7, 0x2a, 0xfb, 0x2d, 0xf7, 0x56, 0xf7,
+                                                    0x53, 0xf7, 0x29, 0xf7, 0x2d, 0xf7, 0x53, 0xf7,
+                                                    0x53, 0xfb, 0x29, 0xf7, 0x2f, 0xfb, 0x53, 0xfb,
+                                                    0x56, 0xfb, 0x2a, 0xfb, 0x2f, 0xfb, 0x53, 0x1e,
+                                                    0xc2, 0x16, 0xf7, 0x35, 0xf7, 0x12, 0xf7, 0x23,
+                                                    0xf7, 0x37, 0xf7, 0x34, 0xf7, 0x11, 0xfb, 0x22,
+                                                    0xfb, 0x36, 0xb, 0xa9, 0x95, 0xdd, 0xcd, 0xd2,
+                                                    0x1a, 0xde, 0x51, 0x98, 0x74, 0x72, 0x6a, 0xb,
+                                                    0x6e, 0x8b, 0xa8, 0xa8, 0x1f, 0xf7, 0x57, 0x7,
+                                                    0xc7, 0x8b, 0xb, 0x45, 0xa, 0x9a, 0xb4, 0x9f,
+                                                    0x4a, 0xa, 0xb, 0x77, 0x1, 0xf7, 0x7, 0xf1,
+                                                    0x3, 0x9d, 0x16, 0xf7, 0xbd, 0x9e, 0x6, 0x59,
+                                                    0xa, 0x9e, 0xfb, 0xbd, 0x78, 0x7, 0x49, 0xa,
+                                                    0xb, 0x6f, 0xa0, 0x76, 0xa7, 0xa7, 0xa1, 0xa0,
+                                                    0xa7, 0xa7, 0x75, 0x55, 0x1d, 0xb, 0xa0, 0x6,
+                                                    0x95, 0xc2, 0xa1, 0xf7, 0x3, 0xa7, 0x1a, 0xa6,
+                                                    0x74, 0xa3, 0x78, 0x77, 0x74, 0x73, 0x70, 0x6f,
+                                                    0xa1, 0xfb, 0x3, 0x95, 0x54, 0x1e, 0xb, 0x7e,
+                                                    0x6c, 0x9d, 0x70, 0x1b, 0x5d, 0x89, 0x65, 0x85,
+                                                    0x71, 0xa2, 0x6b, 0xbd, 0xd6, 0xb7, 0xcd, 0xf7,
+                                                    0x1a, 0xbe, 0x1f, 0xf7, 0x2e, 0xf8, 0x22, 0xb,
+                                                    0x7, 0xf7, 0xf, 0x44, 0xa6, 0x5d, 0x50, 0x65,
+                                                    0x68, 0x5d, 0x5a, 0x1e, 0xda, 0x7, 0x84, 0x8d,
+                                                    0x5d, 0x7a, 0x5c, 0x7c, 0x5e, 0x7e, 0x19, 0x7a,
+                                                    0x7, 0x8d, 0x8f, 0x96, 0x53, 0x1d, 0x4c, 0x1f,
+                                                    0xfb, 0x82, 0x7, 0x50, 0x7a, 0x74, 0x5c, 0x88,
+                                                    0x1e, 0xb, 0xfb, 0x42, 0x8b, 0xf7, 0x1f, 0xcb,
+                                                    0x1e, 0xf7, 0xca, 0x7, 0xd2, 0x97, 0xa2, 0xda,
+                                                    0x91, 0x1e, 0xb, 0x15, 0x46, 0x1d, 0x33, 0xa,
+                                                    0xb, 0xde, 0x87, 0x99, 0x75, 0x41, 0x89, 0x1d,
+                                                    0x44, 0x7f, 0x70, 0x36, 0x89, 0x1e, 0xb, 0x97,
+                                                    0x98, 0x8d, 0x19, 0x9a, 0xfb, 0x1b, 0x7c, 0x7,
+                                                    0xab, 0x8c, 0x9b, 0x77, 0x78, 0x1a, 0x82, 0x7e,
+                                                    0x6b, 0x81, 0x70, 0x1e, 0xb, 0x36, 0xa, 0xf7,
+                                                    0x5b, 0x16, 0x36, 0xa, 0xe, 0x83, 0x1d, 0x96,
+                                                    0xad, 0xb1, 0x1b, 0x97, 0x98, 0x86, 0x45, 0x1d,
+                                                    0x76, 0x99, 0xb, 0x2a, 0xa, 0x40, 0xa, 0xef,
+                                                    0xfb, 0x29, 0xb, 0x6, 0xf7, 0x3, 0xa5, 0x7b,
+                                                    0x32, 0x9a, 0x1f, 0xa4, 0xb, 0x7, 0xfb, 0x37,
+                                                    0x4b, 0x34, 0x69, 0x27, 0x1a, 0x48, 0xb, 0x42,
+                                                    0x1d, 0x96, 0x9a, 0xac, 0xb6, 0xa9, 0xb3, 0x8,
+                                                    0xa8, 0xb2, 0xb, 0x82, 0x9e, 0x5, 0x6d, 0x81,
+                                                    0x39, 0x49, 0x44, 0x1a, 0x38, 0xc5, 0x7e, 0xa2,
+                                                    0xa4, 0xac, 0x9a, 0xb6, 0xb3, 0xb, 0x7, 0x6a,
+                                                    0x84, 0x81, 0x82, 0x83, 0x1e, 0x75, 0x70, 0x6d,
+                                                    0xb, 0xf8, 0x31, 0xe5, 0x15, 0xf7, 0x48, 0x31,
+                                                    0xd1, 0xe5, 0xc2, 0xc4, 0x54, 0xf7, 0x96, 0x5c,
+                                                    0x6, 0xfb, 0x5f, 0xfb, 0x9e, 0x5, 0xb8, 0x93,
+                                                    0x15, 0xf7, 0x19, 0xf7, 0x44, 0x5, 0x8d, 0xfb,
+                                                    0x44, 0x6, 0xb, 0x1b, 0x48, 0x6d, 0x4d, 0x5f,
+                                                    0x7d, 0xa, 0x1b, 0x31, 0x30, 0x53, 0xfb, 0x6,
+                                                    0x28, 0xcb, 0x5f, 0xe7, 0x56, 0x1f, 0xf7, 0x27,
+                                                    0x35, 0x9b, 0x69, 0x52, 0x1a, 0x55, 0x63, 0x52,
+                                                    0x3b, 0xfb, 0x1b, 0x58, 0xf7, 0x16, 0xba, 0x78,
+                                                    0x1e, 0xb, 0x6, 0xb0, 0xe0, 0x7a, 0x92, 0x7c,
+                                                    0x73, 0x7f, 0x89, 0x73, 0x8a, 0x19, 0xfb, 0xd,
+                                                    0x6, 0xe1, 0xe0, 0x5, 0xa8, 0xa7, 0xc2, 0xc1,
+                                                    0xcd, 0x1a, 0xce, 0x52, 0xb4, 0x48, 0x40, 0x5a,
+                                                    0xb, 0x7d, 0x97, 0x7d, 0xa, 0xf7, 0x67, 0xf7,
+                                                    0x51, 0x5, 0xa9, 0x5d, 0xfb, 0x2c, 0xf7, 0x38,
+                                                    0x51, 0x1d, 0xb, 0x41, 0x8d, 0x73, 0x60, 0x1d,
+                                                    0xa4, 0x9c, 0xd4, 0x8e, 0x1e, 0xb, 0xf7, 0x8a,
+                                                    0x7, 0xb1, 0x91, 0xc3, 0xa7, 0xaf, 0x1b, 0xf7,
+                                                    0xe, 0x90, 0xfb, 0x36, 0x74, 0xfb, 0x42, 0x31,
+                                                    0x78, 0x6a, 0x54, 0x5c, 0xb6, 0xa2, 0x1f, 0xe,
+                                                    0xf8, 0x1, 0x7d, 0xaf, 0xf8, 0xfe, 0xaf, 0xb,
+                                                    0x88, 0x1d, 0x13, 0xb8, 0x54, 0x1d, 0x7, 0x87,
+                                                    0x8d, 0x56, 0x7a, 0x56, 0x7d, 0x56, 0x6f, 0x1d,
+                                                    0x97, 0x94, 0x8c, 0x98, 0x1b, 0xb2, 0x91, 0x7b,
+                                                    0x5e, 0x1f, 0xb, 0x72, 0x1d, 0xec, 0xf7, 0x70,
+                                                    0x1e, 0xb, 0x97, 0x16, 0xf7, 0x7f, 0x9e, 0x6,
+                                                    0x42, 0x8e, 0x76, 0xab, 0xf2, 0x1a, 0xb, 0xca,
+                                                    0x86, 0xa3, 0x7b, 0x3c, 0x1a, 0xb, 0xfb, 0x38,
+                                                    0xfb, 0x38, 0xfb, 0x37, 0xb, 0x97, 0x16, 0xf8,
+                                                    0xb0, 0x6, 0x39, 0x1d, 0xb, 0x1b, 0x75, 0x7e,
+                                                    0x78, 0x7a, 0x5b, 0xc8, 0x88, 0x9a, 0xf7, 0x29,
+                                                    0xbe, 0xdd, 0xbc, 0xd7, 0x56, 0xa9, 0x6a, 0x97,
+                                                    0x1f, 0xb, 0x1b, 0x84, 0x84, 0x90, 0x94, 0x9e,
+                                                    0x9b, 0xb8, 0xcd, 0xb5, 0x1f, 0xb, 0xad, 0x94,
+                                                    0x1f, 0x6e, 0x6, 0xb, 0xa7, 0x5a, 0xa9, 0x1f,
+                                                    0xfb, 0x0, 0xcb, 0x5, 0x66, 0xa1, 0x85, 0xa8,
+                                                    0x9f, 0x1a, 0xa5, 0xa0, 0xb2, 0xc2, 0xb, 0x15,
+                                                    0x54, 0xb7, 0x5f, 0xc2, 0x79, 0x1d, 0x54, 0x5f,
+                                                    0x5e, 0x54, 0x1e, 0xb, 0xf7, 0x6a, 0x16, 0xf7,
+                                                    0xc6, 0x9e, 0x6, 0x31, 0x8c, 0x7e, 0xb, 0xfb,
+                                                    0x34, 0xfb, 0x13, 0xfb, 0x22, 0xfb, 0x32, 0xfb,
+                                                    0x36, 0xfb, 0x13, 0xf7, 0x22, 0xf7, 0x34, 0x1e,
+                                                    0xb, 0x1, 0xc0, 0x9d, 0x3, 0xa6, 0x16, 0xf8,
+                                                    0xd, 0x6, 0x99, 0xf7, 0x1b, 0x79, 0x8f, 0x5,
+                                                    0x3d, 0x7b, 0xb, 0x6f, 0xa0, 0x76, 0x9a, 0x1d,
+                                                    0xa0, 0x41, 0x1d, 0xb, 0xa3, 0x9e, 0x9e, 0xa3,
+                                                    0xa3, 0x78, 0x9e, 0x73, 0x73, 0x78, 0x78, 0x73,
+                                                    0x73, 0x9e, 0x78, 0xa3, 0x1f, 0xb, 0x1, 0xef,
+                                                    0xf1, 0xf7, 0x7b, 0xf7, 0x1, 0x3, 0x9b, 0x16,
+                                                    0xf7, 0xac, 0x9e, 0x6, 0x3e, 0x8d, 0x7a, 0xb,
+                                                    0xf8, 0x1, 0x7d, 0xb7, 0xf9, 0xc, 0x77, 0xb,
+                                                    0xa2, 0xf7, 0x7c, 0x74, 0x6, 0xb, 0x15, 0xfb,
+                                                    0x69, 0xf7, 0x26, 0xb, 0x81, 0xa7, 0xf8, 0x32,
+                                                    0xa7, 0xb, 0x77, 0x1, 0xf7, 0xcf, 0xf1, 0x3,
+                                                    0x68, 0xa, 0xb, 0x1, 0xdb, 0xdf, 0xf7, 0x44,
+                                                    0xdf, 0x3, 0x9b, 0x16, 0xf7, 0x6a, 0x9a, 0x6,
+                                                    0x57, 0x8e, 0x7d, 0xb, 0x7b, 0x1d, 0xf8, 0x3e,
+                                                    0x9a, 0xa, 0xb, 0x5, 0x82, 0x98, 0x83, 0x9e,
+                                                    0x96, 0x1a, 0xa7, 0xa4, 0xb, 0x5a, 0x6a, 0xad,
+                                                    0x5f, 0x1b, 0x70, 0x78, 0x7a, 0x71, 0x71, 0x9e,
+                                                    0x7a, 0xa6, 0x1f, 0xb, 0x15, 0xa2, 0x8e, 0x5,
+                                                    0xc6, 0x88, 0xb7, 0x6a, 0x58, 0x1a, 0x72, 0x7e,
+                                                    0x62, 0x4f, 0xb, 0x7, 0xfb, 0x0, 0x76, 0x72,
+                                                    0x3f, 0x86, 0x1e, 0xb, 0xc1, 0x76, 0xf8, 0x13,
+                                                    0x77, 0x1, 0xb, 0x74, 0x78, 0x4b, 0x87, 0x1e,
+                                                    0xb, 0xf7, 0x92, 0x8b, 0xb1, 0xb, 0x6e, 0xa,
+                                                    0xf7, 0x8c, 0x77, 0x1, 0xf3, 0xf1, 0xb, 0x83,
+                                                    0x1f, 0xe, 0x7, 0xb0, 0xb1, 0xaa, 0x9f, 0xa9,
+                                                    0x1b, 0xc6, 0x9d, 0x67, 0x4e, 0x1f, 0xb, 0xee,
+                                                    0xf1, 0xf7, 0x9c, 0xa2, 0xac, 0xa4, 0xb, 0xfb,
+                                                    0x10, 0xfb, 0x23, 0xb, 0x7b, 0xa0, 0xa0, 0xaf,
+                                                    0x9c, 0xb0, 0xaa, 0x70, 0xa5, 0x6d, 0x6d, 0xb,
+                                                    0x8b, 0x91, 0x1b, 0xb7, 0x8b, 0xb, 0xa0, 0x8a,
+                                                    0x1d, 0xb, 0x12, 0xb0, 0xe3, 0x46, 0xe3, 0xf7,
+                                                    0x23, 0xdc, 0x13, 0xda, 0xb, 0x74, 0xa, 0xad,
+                                                    0xb, 0x65, 0x1a, 0x4f, 0x3e, 0x97, 0x60, 0x9a,
+                                                    0x1e, 0xe, 0xba, 0x9c, 0xb1, 0x9a, 0xc1, 0x99,
+                                                    0xb, 0x9e, 0xfb, 0xaf, 0x7, 0xb, 0x66, 0xc1,
+                                                    0xe9, 0x99, 0xb, 0xf7, 0x5d, 0xbc, 0x12, 0x13,
+                                                    0x80, 0xf7, 0x5d, 0x4, 0xb, 0xba, 0xf7, 0x66,
+                                                    0xf7, 0x5, 0xfb, 0x2, 0xfb, 0x4f, 0xb, 0xf7,
+                                                    0xb3, 0xf7, 0xa0, 0x70, 0x1d, 0xb, 0x7, 0x43,
+                                                    0x8b, 0x6a, 0x37, 0x85, 0x1e, 0xf7, 0x4e, 0xb,
+                                                    0xfb, 0x5b, 0x15, 0x80, 0xa0, 0xa7, 0x86, 0xa7,
+                                                    0x1b, 0xb, 0x3c, 0xa0, 0x76, 0xb, 0x77, 0x1,
+                                                    0xd2, 0xdf, 0xf7, 0x46, 0xdf, 0x3, 0xb, 0x73,
+                                                    0xf8, 0xa4, 0x76, 0xf7, 0x3b, 0x77, 0x1, 0xb,
+                                                    0xf7, 0xf, 0xfb, 0x34, 0x76, 0xf9, 0xf1, 0x77,
+                                                    0xb, 0xa9, 0xaf, 0xaf, 0xa9, 0x6d, 0x67, 0x67,
+                                                    0x6d, 0xb, 0x8f, 0x7b, 0x1b, 0x6c, 0x8a, 0x81,
+                                                    0x1d, 0xb, 0x7b, 0x69, 0x29, 0x78, 0xe2, 0xc0,
+                                                    0x7f, 0x1e, 0xb, 0xfb, 0x6e, 0xdf, 0x37, 0xf1,
+                                                    0xb, 0xf7, 0x54, 0xfb, 0x41, 0x77, 0xb, 0x1a,
+                                                    0xfb, 0x38, 0x7, 0xb, 0x72, 0x6b, 0x1e, 0xb,
+                                                    0xf7, 0x6, 0x3, 0xb
+                                                   };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c
new file mode 100644
index 0000000..ba879bd
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c
@@ -0,0 +1,2433 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifBoldFontData [19395] = {0x1,
+                                                        0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x13,
+                                                        0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
+                                                        0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,
+                                                        0x6c, 0x64, 0x0, 0x1, 0x1, 0x1, 0x26, 0xf8,
+                                                        0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2,
+                                                        0xf8, 0x1e, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x3c,
+                                                        0xfb, 0x8e, 0xfa, 0x7c, 0xfa, 0xd, 0x5, 0x1c,
+                                                        0x7, 0x67, 0xf, 0x1c, 0x8, 0xbe, 0x11, 0xaf,
+                                                        0x1c, 0x44, 0x8e, 0x12, 0x0, 0x4, 0x1, 0x1,
+                                                        0x5, 0x2f, 0x43, 0x52, 0x45, 0x75, 0x72, 0x6f,
+                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                        0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                        0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20,
+                                                        0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4f, 0x54,
+                                                        0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x43, 0x68,
+                                                        0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69,
+                                                        0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x7b, 0x2,
+                                                        0x0, 0x1, 0x0, 0xf, 0x0, 0x4f, 0x0, 0x54,
+                                                        0x0, 0x62, 0x0, 0x6d, 0x0, 0x78, 0x0, 0x96,
+                                                        0x0, 0xbb, 0x0, 0xbe, 0x0, 0xc7, 0x0, 0xd6,
+                                                        0x0, 0xdc, 0x0, 0xef, 0x0, 0xf8, 0x1, 0x5,
+                                                        0x1, 0x12, 0x1, 0x38, 0x1, 0x45, 0x1, 0x53,
+                                                        0x1, 0x5a, 0x1, 0x6b, 0x1, 0x73, 0x1, 0x7e,
+                                                        0x1, 0x87, 0x1, 0x8b, 0x1, 0x9b, 0x1, 0xa6,
+                                                        0x1, 0xab, 0x1, 0xb6, 0x1, 0xce, 0x1, 0xe8,
+                                                        0x1, 0xf3, 0x1, 0xfa, 0x2, 0x21, 0x2, 0x33,
+                                                        0x2, 0x38, 0x2, 0x41, 0x2, 0x4b, 0x2, 0x70,
+                                                        0x2, 0x94, 0x2, 0xa2, 0x2, 0xad, 0x2, 0xcf,
+                                                        0x2, 0xd5, 0x2, 0xe0, 0x2, 0xec, 0x2, 0xf2,
+                                                        0x3, 0x8, 0x3, 0x10, 0x3, 0x17, 0x3, 0x20,
+                                                        0x3, 0x29, 0x3, 0x30, 0x3, 0x37, 0x3, 0x3b,
+                                                        0x3, 0x48, 0x3, 0x53, 0x3, 0x61, 0x3, 0x79,
+                                                        0x3, 0x7f, 0x3, 0x87, 0x3, 0x8f, 0x3, 0x96,
+                                                        0x3, 0x9d, 0x3, 0xb2, 0x3, 0xb6, 0x3, 0xc0,
+                                                        0x3, 0xc6, 0x3, 0xcf, 0x3, 0xd5, 0x3, 0xdb,
+                                                        0x3, 0xef, 0x3, 0xfe, 0x4, 0x9, 0x4, 0x14,
+                                                        0x4, 0x1b, 0x4, 0x2d, 0x4, 0x35, 0x4, 0x41,
+                                                        0x4, 0x47, 0x4, 0x4d, 0x4, 0x5e, 0x4, 0x6f,
+                                                        0x4, 0x79, 0x4, 0x89, 0x4, 0x98, 0x4, 0xa5,
+                                                        0x4, 0xae, 0x4, 0xb3, 0x4, 0xb8, 0x4, 0xc6,
+                                                        0x4, 0xd4, 0x4, 0xe1, 0x4, 0xee, 0x4, 0xf1,
+                                                        0x4, 0xf5, 0x5, 0x1, 0x5, 0xb, 0x5, 0x11,
+                                                        0x5, 0x17, 0x5, 0x20, 0x5, 0x2b, 0x5, 0x36,
+                                                        0x5, 0x41, 0x5, 0x48, 0x5, 0x4d, 0x5, 0x51,
+                                                        0x5, 0x54, 0x5, 0x5e, 0x5, 0x68, 0x5, 0x72,
+                                                        0x5, 0x7c, 0x5, 0x86, 0x5, 0x90, 0x5, 0x9a,
+                                                        0x5, 0x9e, 0x5, 0xa7, 0x5, 0xb0, 0x5, 0xb9,
+                                                        0x5, 0xc0, 0x5, 0xc6, 0x5, 0xcb, 0x5, 0xcf,
+                                                        0x15, 0x3a, 0xa, 0x20, 0xa, 0x7f, 0x6d, 0x88,
+                                                        0x86, 0x55, 0x83, 0x19, 0x31, 0x1d, 0x3c, 0xa,
+                                                        0x71, 0x29, 0x1b, 0x4a, 0x78, 0x97, 0xb7, 0x1f,
+                                                        0xf7, 0x86, 0x7, 0xee, 0xb4, 0x6d, 0xfb, 0x11,
+                                                        0x97, 0x1f, 0xaf, 0xf7, 0xe6, 0x67, 0x6, 0xfb,
+                                                        0x10, 0x7c, 0x62, 0x72, 0x2b, 0x1b, 0xf7, 0x6d,
+                                                        0x7, 0xb6, 0x9d, 0x9e, 0xc2, 0xf7, 0x1b, 0xc8,
+                                                        0x72, 0xfb, 0x22, 0xa2, 0x1e, 0xae, 0xf7, 0x5d,
+                                                        0xfc, 0xd5, 0x53, 0x1d, 0xfc, 0x81, 0x7, 0x4d,
+                                                        0x6c, 0x9b, 0x52, 0x85, 0x1e, 0xb, 0x15, 0xc3,
+                                                        0x22, 0xa, 0xb, 0x32, 0x1d, 0x31, 0xa, 0x2d,
+                                                        0xb6, 0xfb, 0x3, 0xfb, 0x10, 0x51, 0x3a, 0x1d,
+                                                        0xb, 0x29, 0xa, 0x80, 0x7f, 0xa, 0x9a, 0x7c,
+                                                        0xa4, 0x7c, 0x1f, 0xb, 0x27, 0x1d, 0x69, 0x7,
+                                                        0xb4, 0x84, 0x93, 0x7f, 0x38, 0xa, 0xb, 0x3f,
+                                                        0xc9, 0x6c, 0xbb, 0xa3, 0xd1, 0x90, 0xcc, 0xcc,
+                                                        0x1e, 0x8a, 0xb7, 0x15, 0x7b, 0x7d, 0x74, 0x70,
+                                                        0x69, 0x1b, 0x67, 0x7c, 0xaf, 0xaa, 0xe2, 0xee,
+                                                        0xa8, 0xa2, 0x90, 0x1f, 0xb, 0x5e, 0x8c, 0x80,
+                                                        0x9d, 0xb2, 0x1a, 0xf7, 0xfc, 0xfb, 0x5d, 0x69,
+                                                        0x7, 0xad, 0x88, 0xa7, 0x8a, 0x54, 0x1a, 0xfb,
+                                                        0xa5, 0x7, 0x78, 0x78, 0x72, 0x72, 0x65, 0x1b,
+                                                        0x54, 0x8a, 0xb6, 0xa7, 0x1f, 0xf7, 0xe7, 0xfb,
+                                                        0x50, 0xb, 0x22, 0x1d, 0xe, 0x4e, 0xa, 0xed,
+                                                        0xf7, 0x4, 0x29, 0x2e, 0xa, 0xb, 0x67, 0xa8,
+                                                        0x74, 0xa, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, 0x61,
+                                                        0xa, 0x6e, 0x61, 0x1d, 0xb, 0x34, 0xa, 0x1f,
+                                                        0x39, 0x1d, 0xb, 0x64, 0x8f, 0x83, 0xa1, 0xaa,
+                                                        0x1a, 0xf8, 0x6, 0xfb, 0x54, 0x69, 0x7, 0xb1,
+                                                        0x84, 0x9a, 0x84, 0x5e, 0x1a, 0xb, 0x15, 0x2e,
+                                                        0x1d, 0xf7, 0x66, 0x16, 0x2e, 0x1d, 0xe, 0x67,
+                                                        0xa7, 0x6f, 0xaf, 0xaf, 0xa8, 0xa7, 0xaf, 0xaf,
+                                                        0x6e, 0x6f, 0x1d, 0xb, 0xf7, 0xeb, 0xbf, 0x15,
+                                                        0x4a, 0x7, 0xc4, 0x9e, 0x99, 0x8c, 0x28, 0xa,
+                                                        0xb, 0x33, 0xbc, 0x31, 0xef, 0xef, 0xbc, 0xe5,
+                                                        0xe3, 0xe3, 0x5a, 0xe5, 0x27, 0x27, 0x5a, 0x31,
+                                                        0x33, 0x1e, 0xf7, 0x6, 0x16, 0xd0, 0x8b, 0xe0,
+                                                        0xae, 0xae, 0x8b, 0x36, 0x46, 0x46, 0x8b, 0x36,
+                                                        0x68, 0x68, 0x8b, 0xe0, 0xd0, 0x1e, 0xb, 0xf7,
+                                                        0x48, 0xf7, 0x5d, 0x15, 0xe9, 0xf7, 0x87, 0xf0,
+                                                        0xfb, 0x87, 0x5, 0xe, 0x15, 0x6f, 0x91, 0x93,
+                                                        0x61, 0xd1, 0x1b, 0xb8, 0xb0, 0xa3, 0xac, 0xa7,
+                                                        0x1f, 0xb, 0xc0, 0xa9, 0xf7, 0x5, 0x3d, 0xa,
+                                                        0xb, 0x54, 0x8f, 0x63, 0x8e, 0xcb, 0x1a, 0xf8,
+                                                        0x64, 0x7, 0xcf, 0xbb, 0x8c, 0xba, 0x8d, 0x1e,
+                                                        0xae, 0xb, 0x5c, 0xa, 0xf7, 0x8b, 0x77, 0x27,
+                                                        0xa, 0xb, 0x94, 0x1a, 0x13, 0xbc, 0x3b, 0xa,
+                                                        0x13, 0x8c, 0x24, 0xa, 0xe, 0x2a, 0xa, 0x85,
+                                                        0x93, 0x85, 0x92, 0x94, 0x1a, 0xb, 0x16, 0x2a,
+                                                        0x1d, 0xe, 0x73, 0x99, 0x5, 0x74, 0x78, 0x68,
+                                                        0x5f, 0x50, 0x1b, 0x2c, 0x75, 0xf1, 0xe0, 0x88,
+                                                        0x1f, 0xb, 0x4e, 0x4c, 0x47, 0xc1, 0x8b, 0x97,
+                                                        0xbf, 0x9a, 0xb1, 0x9d, 0xb, 0x3b, 0xa, 0x24,
+                                                        0xa, 0xb, 0x65, 0x1d, 0xf7, 0x7f, 0x45, 0xa,
+                                                        0xfb, 0x25, 0x5f, 0x1d, 0xb, 0x9a, 0x1a, 0xa7,
+                                                        0x97, 0x91, 0xd0, 0x1e, 0xae, 0xfb, 0xe3, 0x68,
+                                                        0x7, 0xbe, 0x88, 0xa3, 0x60, 0x90, 0x82, 0xf7,
+                                                        0x4b, 0xfb, 0xd6, 0x18, 0xb, 0xfc, 0x31, 0x15,
+                                                        0xf7, 0x89, 0xa9, 0x6, 0x4b, 0x85, 0x9b, 0xb3,
+                                                        0x1f, 0xf7, 0xdb, 0x46, 0xa, 0xfb, 0x67, 0x7,
+                                                        0x65, 0x87, 0x74, 0x40, 0x8c, 0x1e, 0xb, 0x9f,
+                                                        0xa1, 0x92, 0x70, 0x53, 0x3a, 0x52, 0x6f, 0x78,
+                                                        0x1f, 0xb, 0x15, 0x2a, 0x1d, 0xf7, 0x66, 0x38,
+                                                        0x1d, 0x15, 0x2e, 0xca, 0x36, 0xf0, 0xf0, 0xca,
+                                                        0xe0, 0xe8, 0xe8, 0x4c, 0xe0, 0x26, 0x26, 0x4c,
+                                                        0x36, 0x2e, 0x1e, 0xf7, 0xe, 0x16, 0xbd, 0x8b,
+                                                        0xef, 0xb5, 0xb5, 0x8b, 0x27, 0x59, 0x59, 0x8b,
+                                                        0x27, 0x61, 0x61, 0x8b, 0xef, 0xbd, 0x1e, 0xb,
+                                                        0xfb, 0x14, 0xf7, 0x8c, 0x7b, 0x9a, 0x3d, 0x1d,
+                                                        0xfb, 0x1d, 0x7, 0x38, 0x73, 0x89, 0x46, 0x84,
+                                                        0x1e, 0xb, 0x33, 0x1d, 0x5d, 0x67, 0xb, 0xfb,
+                                                        0x22, 0x60, 0xfb, 0x13, 0x63, 0x23, 0x1a, 0xb,
+                                                        0x15, 0xb5, 0x6, 0x9d, 0x8c, 0x9b, 0xa8, 0xab,
+                                                        0x1b, 0xb, 0x1b, 0xfb, 0x52, 0x71, 0xfb, 0x1c,
+                                                        0x4e, 0x5d, 0x8b, 0x35, 0xf7, 0x3f, 0x39, 0x1f,
+                                                        0xf7, 0x18, 0x4c, 0xba, 0x73, 0x48, 0x1a, 0x7e,
+                                                        0x82, 0x28, 0xfb, 0xc, 0xfb, 0x13, 0x5f, 0xf7,
+                                                        0x5, 0xf0, 0x77, 0x1e, 0x64, 0x6, 0xb, 0xf7,
+                                                        0x4c, 0xcb, 0xf7, 0xd, 0xe3, 0xf7, 0x1, 0x3f,
+                                                        0xc5, 0x69, 0x9c, 0x1f, 0xfb, 0x7b, 0xf7, 0x7,
+                                                        0x78, 0xa1, 0xc1, 0x1a, 0xcc, 0xc2, 0xa9, 0xbf,
+                                                        0xf7, 0xa, 0xbd, 0xfb, 0x7, 0x45, 0x9d, 0x1e,
+                                                        0xb1, 0x6, 0xb, 0x1e, 0xad, 0xfb, 0x8e, 0x69,
+                                                        0x7, 0xa4, 0x87, 0x90, 0x8b, 0x97, 0x74, 0x8,
+                                                        0xb, 0xfb, 0x5f, 0x7d, 0xd3, 0xf7, 0x4f, 0xb0,
+                                                        0xf7, 0x34, 0xaa, 0xb, 0xa5, 0x9b, 0xb9, 0x1a,
+                                                        0xc3, 0x5c, 0xa3, 0x4d, 0x3e, 0x59, 0x56, 0x65,
+                                                        0x78, 0x1e, 0x9f, 0x84, 0x5, 0x9a, 0x95, 0xa2,
+                                                        0xae, 0xb1, 0x1b, 0xbb, 0xa0, 0x71, 0x68, 0x54,
+                                                        0x56, 0x7c, 0x6c, 0x82, 0x1f, 0xb, 0x54, 0xa,
+                                                        0xf8, 0x5a, 0x77, 0xb, 0x49, 0x1d, 0xf7, 0x84,
+                                                        0x77, 0x98, 0xa, 0x17, 0x4d, 0xa, 0xb, 0xad,
+                                                        0xfb, 0x2b, 0x69, 0x7, 0xa4, 0x8a, 0xa9, 0x8b,
+                                                        0x6b, 0x1a, 0xb, 0x8b, 0xae, 0xf8, 0xf2, 0xae,
+                                                        0xb, 0x96, 0x83, 0x5, 0xa7, 0x94, 0xb9, 0x87,
+                                                        0x66, 0x1a, 0x73, 0x1d, 0x1e, 0x7b, 0x66, 0x5,
+                                                        0x7b, 0xb4, 0xa1, 0x89, 0x97, 0x1b, 0xb, 0x1b,
+                                                        0x2f, 0x78, 0x31, 0x68, 0x84, 0x1f, 0xb, 0xf7,
+                                                        0x17, 0x78, 0xac, 0x93, 0x1d, 0xb, 0x12, 0xa4,
+                                                        0xf7, 0x26, 0xf7, 0xe, 0xf7, 0x1e, 0xb, 0x68,
+                                                        0x6, 0xb9, 0x88, 0xb5, 0x93, 0x49, 0x1a, 0xb,
+                                                        0x7a, 0x85, 0x81, 0x6b, 0x66, 0x1b, 0xb, 0x51,
+                                                        0xa, 0xf7, 0x8b, 0x72, 0xa, 0xb, 0x15, 0xc3,
+                                                        0x6, 0xb, 0x5a, 0xa, 0xf7, 0x68, 0xf7, 0xe9,
+                                                        0x79, 0x1d, 0xf7, 0x3f, 0x66, 0x1d, 0xb, 0x65,
+                                                        0x1d, 0xf7, 0x84, 0x45, 0xa, 0xfb, 0x2a, 0x5f,
+                                                        0x1d, 0xb, 0x5d, 0x90, 0x88, 0xa8, 0xa2, 0x1a,
+                                                        0xf7, 0x95, 0x7, 0x94, 0xb6, 0xbc, 0xb3, 0xb,
+                                                        0x1a, 0xe6, 0x3b, 0xa0, 0x63, 0x2f, 0x65, 0x33,
+                                                        0x69, 0x7e, 0x1e, 0xa3, 0x6, 0xbd, 0xa3, 0xae,
+                                                        0x8f, 0x9a, 0x1b, 0xcd, 0x96, 0x4f, 0x7a, 0xb,
+                                                        0xae, 0xfb, 0x70, 0x68, 0x7, 0xb, 0xae, 0xf7,
+                                                        0x45, 0xf7, 0xf6, 0xf7, 0x45, 0xb, 0xa4, 0xf7,
+                                                        0x27, 0xf7, 0x31, 0xf7, 0x27, 0xb, 0xfb, 0x55,
+                                                        0xfb, 0x55, 0xfb, 0x35, 0xb, 0xf7, 0x61, 0xf7,
+                                                        0x61, 0xf7, 0x29, 0xb, 0xae, 0x1, 0xf4, 0x7f,
+                                                        0x1d, 0x9e, 0x16, 0xf8, 0xd6, 0x6, 0xb4, 0xf7,
+                                                        0x77, 0x5, 0x6e, 0x6, 0xfb, 0x5, 0x5d, 0x53,
+                                                        0xb, 0x6e, 0x67, 0x1e, 0xb, 0x63, 0x1d, 0xb2,
+                                                        0x5c, 0x5b, 0x67, 0x63, 0x5e, 0x1e, 0xe, 0x15,
+                                                        0x5c, 0xaf, 0x64, 0x1d, 0xb, 0x66, 0xbb, 0xba,
+                                                        0xb1, 0xaf, 0xbb, 0xb9, 0x65, 0xb, 0xfb, 0x3f,
+                                                        0xfb, 0x3f, 0x85, 0xb, 0xf7, 0x20, 0xf7, 0x20,
+                                                        0xb0, 0xb, 0xb9, 0xb4, 0x63, 0xba, 0x1b, 0xa4,
+                                                        0xa5, 0xa2, 0xa6, 0xa6, 0x71, 0xa2, 0x72, 0x1f,
+                                                        0x5c, 0x62, 0x63, 0x5d, 0x1b, 0xb, 0x76, 0xf7,
+                                                        0x42, 0xf7, 0x35, 0x12, 0x99, 0x77, 0xa, 0xe1,
+                                                        0x77, 0xa, 0x13, 0xe8, 0xb, 0xf7, 0x4d, 0x16,
+                                                        0xf7, 0xef, 0xae, 0x6, 0x45, 0x92, 0x75, 0xb,
+                                                        0xf7, 0x7e, 0x66, 0x7, 0x72, 0x81, 0x82, 0x76,
+                                                        0x70, 0x1b, 0xb, 0xf7, 0xf, 0x98, 0x8, 0xa2,
+                                                        0x7, 0xb, 0x67, 0xa7, 0x6d, 0xaf, 0xaf, 0xa6,
+                                                        0xa9, 0xaf, 0xaf, 0x70, 0xa7, 0x67, 0x67, 0x6f,
+                                                        0x6f, 0x67, 0x1e, 0xb, 0x67, 0xa6, 0x81, 0x1d,
+                                                        0x70, 0x61, 0x1d, 0xb, 0x67, 0xa7, 0x74, 0xa,
+                                                        0xa6, 0xa8, 0xaf, 0xaf, 0x70, 0x6f, 0x1d, 0xb,
+                                                        0x61, 0xa, 0x6f, 0x61, 0x1d, 0xb, 0xfb, 0x17,
+                                                        0xfb, 0x1f, 0x34, 0xb, 0xa5, 0xf7, 0xe3, 0x15,
+                                                        0xfb, 0x5a, 0xf7, 0x2a, 0xfb, 0x30, 0xf7, 0x5a,
+                                                        0xf7, 0x5a, 0xf7, 0x29, 0xb, 0x9b, 0x16, 0xf7,
+                                                        0x77, 0xae, 0x6, 0x41, 0x93, 0x76, 0x8b, 0xd3,
+                                                        0x1a, 0xf8, 0x2d, 0x8d, 0x7, 0xb, 0x62, 0x5d,
+                                                        0x8b, 0x7f, 0x73, 0x7b, 0x92, 0x92, 0x78, 0xb,
+                                                        0x15, 0xf7, 0x35, 0x34, 0xe9, 0xe2, 0xb4, 0xcd,
+                                                        0x62, 0xf7, 0x98, 0x57, 0x6, 0x4f, 0x43, 0xb,
+                                                        0x99, 0x16, 0xf7, 0x87, 0xad, 0x6, 0x5d, 0x90,
+                                                        0x8a, 0xa8, 0xa2, 0x1a, 0xf7, 0xda, 0xb, 0xfc,
+                                                        0x95, 0x15, 0xcd, 0x6, 0xf8, 0x60, 0xf9, 0x48,
+                                                        0x5, 0x49, 0x6, 0xe, 0xa9, 0x30, 0xf1, 0x70,
+                                                        0xb4, 0x1f, 0xa9, 0xb1, 0xb, 0x15, 0xf7, 0x6,
+                                                        0x90, 0xb, 0x15, 0xf7, 0x26, 0xb0, 0xb, 0xfb,
+                                                        0x57, 0xfb, 0xa6, 0x15, 0x69, 0xf7, 0xa5, 0xaa,
+                                                        0x7, 0x5c, 0x8d, 0x6c, 0xb, 0x8f, 0x85, 0x80,
+                                                        0x79, 0x7e, 0x82, 0x80, 0x1e, 0xfb, 0x5f, 0xfb,
+                                                        0x38, 0x5, 0xb, 0xae, 0x78, 0x15, 0xb2, 0x6,
+                                                        0x9b, 0x8f, 0x90, 0x9d, 0xa0, 0x1b, 0x98, 0xb,
+                                                        0xc5, 0xbb, 0xba, 0xc6, 0xc5, 0x5b, 0xbc, 0x51,
+                                                        0x51, 0x5a, 0x5b, 0x50, 0xb, 0x2e, 0xa, 0xe,
+                                                        0xf7, 0x36, 0x3, 0xb, 0xfb, 0x30, 0xfb, 0x31,
+                                                        0xfb, 0xc, 0xf7, 0x1e, 0xf7, 0x38, 0x1e, 0xb,
+                                                        0x74, 0xa, 0xa7, 0xa8, 0xaf, 0xaf, 0x6f, 0x61,
+                                                        0xa, 0xb, 0x8b, 0xad, 0xf8, 0x8, 0xce, 0xb,
+                                                        0x76, 0xf7, 0x44, 0x77, 0x1, 0xb, 0xf7, 0x1f,
+                                                        0x13, 0xe0, 0x9b, 0x16, 0x99, 0xa, 0xb, 0xf7,
+                                                        0x1f, 0xf7, 0xe, 0xf7, 0x1f, 0xfb, 0xf, 0xf7,
+                                                        0x1f, 0xb, 0xf7, 0x8b, 0xf7, 0x41, 0x6c, 0xaa,
+                                                        0x12, 0xa4, 0xf7, 0x21, 0xb, 0xfb, 0x5f, 0xa0,
+                                                        0x76, 0xf7, 0xe8, 0x76, 0xf7, 0x2, 0xab, 0xb,
+                                                        0x89, 0xd3, 0xfb, 0x53, 0x69, 0x6, 0xb, 0xf7,
+                                                        0xeb, 0xbf, 0x15, 0xb, 0xd6, 0x8b, 0xae, 0xb,
+                                                        0x85, 0x1e, 0xe, 0xa1, 0x8a, 0x8a, 0xaf, 0xcb,
+                                                        0x1b, 0xf7, 0x40, 0xa2, 0xb, 0xfb, 0x91, 0xfb,
+                                                        0x2e, 0x76, 0xf9, 0xfd, 0x77, 0x1, 0xb, 0x6,
+                                                        0x84, 0x6c, 0x6f, 0x49, 0x54, 0x76, 0x69, 0x80,
+                                                        0xb, 0x55, 0x8b, 0x5a, 0xc3, 0x93, 0xc7, 0x8b,
+                                                        0xcb, 0xd3, 0xb, 0xd4, 0x90, 0x28, 0x37, 0x53,
+                                                        0x88, 0xfb, 0x1b, 0x39, 0xb, 0xfb, 0xce, 0xfb,
+                                                        0x29, 0xb6, 0xf9, 0x79, 0xb6, 0x1, 0xb, 0xfb,
+                                                        0xce, 0xfb, 0x27, 0x76, 0xf9, 0xf2, 0x77, 0x1,
+                                                        0xb, 0xf9, 0x18, 0xac, 0xb, 0x86, 0x84, 0x9d,
+                                                        0x1f, 0x81, 0xa5, 0xae, 0x7f, 0xb, 0xfb, 0xac,
+                                                        0x1f, 0xfb, 0xc5, 0x68, 0x6, 0xb2, 0xb, 0xfb,
+                                                        0x2b, 0x1b, 0x48, 0x75, 0x93, 0xbb, 0x1f, 0xb,
+                                                        0x7, 0x73, 0x80, 0x67, 0x63, 0x1e, 0xe, 0x76,
+                                                        0xf7, 0x4d, 0x77, 0x1, 0xb, 0xf7, 0x8b, 0x77,
+                                                        0x1, 0xb, 0xf7, 0x16, 0x12, 0xb, 0x1, 0x0,
+                                                        0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37,
+                                                        0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67,
+                                                        0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,
+                                                        0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,
+                                                        0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,
+                                                        0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,
+                                                        0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,
+                                                        0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,
+                                                        0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,
+                                                        0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,
+                                                        0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,
+                                                        0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,
+                                                        0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,
+                                                        0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,
+                                                        0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,
+                                                        0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,
+                                                        0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,
+                                                        0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,
+                                                        0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,
+                                                        0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,
+                                                        0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,
+                                                        0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0,
+                                                        0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90,
+                                                        0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0,
+                                                        0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2,
+                                                        0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb,
+                                                        0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0,
+                                                        0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0,
+                                                        0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2,
+                                                        0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0,
+                                                        0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0,
+                                                        0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0,
+                                                        0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0,
+                                                        0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0,
+                                                        0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84,
+                                                        0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0,
+                                                        0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0,
+                                                        0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75,
+                                                        0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0,
+                                                        0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0,
+                                                        0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63,
+                                                        0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0,
+                                                        0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2,
+                                                        0x0, 0x1, 0x0, 0x4, 0x0, 0x7, 0x0, 0x4b,
+                                                        0x0, 0x78, 0x0, 0xec, 0x1, 0x74, 0x1, 0xa0,
+                                                        0x2, 0x61, 0x2, 0x8c, 0x2, 0xba, 0x2, 0xea,
+                                                        0x3, 0xe4, 0x4, 0x10, 0x4, 0x3e, 0x4, 0x51,
+                                                        0x4, 0x59, 0x4, 0x74, 0x4, 0xc5, 0x4, 0xfb,
+                                                        0x5, 0x4c, 0x5, 0xb5, 0x5, 0xf3, 0x6, 0x51,
+                                                        0x6, 0xb4, 0x6, 0xda, 0x7, 0x5c, 0x7, 0xbb,
+                                                        0x7, 0xe1, 0x8, 0x28, 0x8, 0x45, 0x8, 0x67,
+                                                        0x8, 0x83, 0x8, 0xf4, 0x9, 0xad, 0x9, 0xcd,
+                                                        0xa, 0x4a, 0xa, 0xa9, 0xa, 0xee, 0xb, 0x4c,
+                                                        0xb, 0xab, 0xc, 0x23, 0xc, 0x8c, 0xc, 0x91,
+                                                        0xc, 0xe4, 0xd, 0x50, 0xd, 0x75, 0xd, 0xe6,
+                                                        0xe, 0x0, 0xe, 0x20, 0xe, 0x7d, 0xe, 0xd7,
+                                                        0xf, 0x50, 0xf, 0x78, 0xf, 0xbb, 0x10, 0x3,
+                                                        0x10, 0x46, 0x10, 0xc0, 0x11, 0x3d, 0x11, 0x5f,
+                                                        0x11, 0x65, 0x11, 0x86, 0x11, 0xa1, 0x11, 0xc2,
+                                                        0x11, 0xe3, 0x11, 0xef, 0x11, 0xf7, 0x12, 0x36,
+                                                        0x12, 0x9e, 0x12, 0xe2, 0x13, 0x49, 0x13, 0x76,
+                                                        0x13, 0xcc, 0x14, 0x91, 0x14, 0xc3, 0x14, 0xed,
+                                                        0x15, 0x50, 0x15, 0xb9, 0x15, 0xd7, 0x16, 0x64,
+                                                        0x16, 0xac, 0x16, 0xeb, 0x17, 0x23, 0x17, 0x85,
+                                                        0x17, 0xe0, 0x18, 0x63, 0x18, 0xac, 0x18, 0xbf,
+                                                        0x18, 0xef, 0x19, 0x6c, 0x19, 0xe6, 0x19, 0xfa,
+                                                        0x1a, 0x25, 0x1a, 0x74, 0x1a, 0x8f, 0x1a, 0xde,
+                                                        0x1b, 0x21, 0x1b, 0x70, 0x1b, 0xf8, 0x1c, 0xad,
+                                                        0x1d, 0x20, 0x1d, 0x9f, 0x1d, 0xc1, 0x1e, 0x93,
+                                                        0x1e, 0x9e, 0x1f, 0x19, 0x1f, 0x90, 0x1f, 0xc5,
+                                                        0x1f, 0xe5, 0x20, 0x79, 0x20, 0x8a, 0x20, 0xc2,
+                                                        0x20, 0xff, 0x21, 0x30, 0x21, 0x51, 0x21, 0x6d,
+                                                        0x21, 0xec, 0x22, 0x28, 0x22, 0x32, 0x22, 0x57,
+                                                        0x22, 0x80, 0x22, 0xb8, 0x22, 0xe4, 0x23, 0x18,
+                                                        0x23, 0x60, 0x23, 0x98, 0x24, 0xb, 0x24, 0x1d,
+                                                        0x24, 0x2f, 0x24, 0x41, 0x24, 0x7c, 0x24, 0x9f,
+                                                        0x24, 0xd9, 0x25, 0x78, 0x26, 0x6, 0x26, 0x12,
+                                                        0x26, 0x22, 0x26, 0x36, 0x26, 0x60, 0x26, 0x68,
+                                                        0x26, 0x6f, 0x26, 0x7c, 0x26, 0xae, 0x26, 0xfc,
+                                                        0x27, 0x35, 0x27, 0x57, 0x27, 0x6a, 0x27, 0x8a,
+                                                        0x27, 0xe6, 0x28, 0x5, 0x28, 0x35, 0x28, 0xa9,
+                                                        0x28, 0xba, 0x28, 0xce, 0x28, 0xe2, 0x29, 0x6,
+                                                        0x29, 0x3a, 0x29, 0xdd, 0x2a, 0x81, 0x2a, 0x9c,
+                                                        0x2a, 0xb8, 0x2a, 0xd8, 0x2b, 0x28, 0x2b, 0x46,
+                                                        0x2b, 0x8e, 0x2c, 0x43, 0x2c, 0x9f, 0x2c, 0xb4,
+                                                        0x2c, 0xca, 0x2c, 0xea, 0x2d, 0xf, 0x2d, 0x29,
+                                                        0x2d, 0x48, 0x2d, 0x6d, 0x2d, 0x90, 0x2e, 0x5,
+                                                        0x2e, 0x51, 0x2e, 0xa3, 0x2e, 0xb1, 0x2e, 0xbe,
+                                                        0x2e, 0xe9, 0x2f, 0x6, 0x2f, 0x38, 0x2f, 0xc3,
+                                                        0x2f, 0xde, 0x2f, 0xfe, 0x30, 0x15, 0x30, 0x3b,
+                                                        0x30, 0x78, 0x30, 0xa9, 0x30, 0xcd, 0x30, 0xd6,
+                                                        0x31, 0x14, 0x31, 0x46, 0x31, 0xe0, 0x32, 0x71,
+                                                        0x32, 0xa1, 0x33, 0x19, 0x33, 0x4f, 0x33, 0x61,
+                                                        0x33, 0x93, 0x34, 0x16, 0x34, 0x21, 0x34, 0x39,
+                                                        0x34, 0x64, 0x34, 0x85, 0x34, 0xcc, 0x35, 0x0,
+                                                        0x35, 0x39, 0x35, 0x52, 0x35, 0x60, 0x35, 0x70,
+                                                        0x35, 0x95, 0x35, 0xa1, 0x35, 0xb0, 0x35, 0xd9,
+                                                        0x35, 0xf3, 0x36, 0xc, 0x36, 0xb0, 0x37, 0x19,
+                                                        0x37, 0x38, 0x37, 0x5b, 0x37, 0x96, 0x37, 0xba,
+                                                        0x37, 0xdf, 0x37, 0xf8, 0x38, 0x86, 0x39, 0x2f,
+                                                        0x39, 0x3f, 0x39, 0xa5, 0x3a, 0x0, 0xfc, 0x21,
+                                                        0xe, 0xfc, 0x21, 0xe, 0xfb, 0xce, 0x7e, 0xf7,
+                                                        0x3d, 0xf8, 0xab, 0x77, 0x1, 0xdc, 0xf7, 0x3e,
+                                                        0x3, 0xdc, 0xd2, 0x15, 0x5c, 0xb0, 0x64, 0x1d,
+                                                        0xb2, 0x5c, 0x5b, 0x66, 0x63, 0x5e, 0x1e, 0xd1,
+                                                        0xf7, 0x37, 0x15, 0xa8, 0x6, 0x94, 0xe5, 0x96,
+                                                        0xc7, 0x96, 0xb7, 0x8, 0x9f, 0xdd, 0x9f, 0xa5,
+                                                        0xc2, 0x1a, 0xcb, 0x69, 0xaf, 0x58, 0x57, 0x6a,
+                                                        0x67, 0x4b, 0x54, 0x9f, 0x70, 0x9f, 0x38, 0x1e,
+                                                        0x96, 0x5f, 0x95, 0x4f, 0x94, 0x33, 0x8, 0xe,
+                                                        0x2f, 0xf8, 0x3d, 0x76, 0xf7, 0xb3, 0x77, 0x1,
+                                                        0xde, 0xf7, 0x15, 0xf7, 0x17, 0xf7, 0x15, 0x3,
+                                                        0xf7, 0x13, 0xf8, 0x28, 0x15, 0x6e, 0xa, 0x74,
+                                                        0xa6, 0xfb, 0xc, 0x9c, 0x43, 0x1e, 0xf7, 0x98,
+                                                        0x16, 0x6e, 0xa, 0x1e, 0x8a, 0x74, 0xa7, 0xfb,
+                                                        0xc, 0x9c, 0x43, 0x8, 0xe, 0xa0, 0x76, 0xf7,
+                                                        0x66, 0xcc, 0x4a, 0xd4, 0xf7, 0x20, 0xd4, 0x45,
+                                                        0xcb, 0xf7, 0x66, 0x77, 0x12, 0x13, 0xb4, 0xb5,
+                                                        0x16, 0xce, 0x6, 0xbb, 0xf7, 0x66, 0x5, 0xf7,
+                                                        0x21, 0x6, 0x5d, 0xfb, 0x66, 0x5, 0xce, 0x6,
+                                                        0xb9, 0xf7, 0x66, 0x5, 0xf0, 0x6, 0x13, 0xcc,
+                                                        0x8c, 0xcc, 0x5, 0x35, 0x6, 0xad, 0xf7, 0x2b,
+                                                        0x5, 0xdb, 0x6, 0x8c, 0xcb, 0x5, 0x47, 0x6,
+                                                        0xba, 0xf7, 0x66, 0x5, 0x49, 0x6, 0x5b, 0xfb,
+                                                        0x66, 0x5, 0xfb, 0x22, 0x6, 0xb9, 0xf7, 0x66,
+                                                        0x5, 0x49, 0x6, 0x5c, 0xfb, 0x66, 0x5, 0xfb,
+                                                        0xa, 0x6, 0x8a, 0x4b, 0x5, 0xf2, 0x6, 0x6b,
+                                                        0xfb, 0x2b, 0x5, 0x28, 0x6, 0x8a, 0x4a, 0x5,
+                                                        0xe1, 0x6, 0xdc, 0xcc, 0x15, 0xab, 0xf7, 0x2b,
+                                                        0x5, 0xf7, 0x25, 0x6, 0x69, 0xfb, 0x2b, 0x5,
+                                                        0xe, 0x3d, 0x76, 0xf9, 0xe5, 0x77, 0x12, 0xdc,
+                                                        0xea, 0xbc, 0xc3, 0xe9, 0xf7, 0x2, 0x17, 0xf7,
+                                                        0xa1, 0xa9, 0x15, 0xf7, 0x70, 0x7, 0xc5, 0x6a,
+                                                        0xae, 0x78, 0x51, 0x1a, 0x2e, 0x49, 0x7f, 0x70,
+                                                        0x86, 0x1e, 0xfb, 0x73, 0x98, 0x15, 0xd3, 0x6e,
+                                                        0xa7, 0x80, 0xcf, 0x88, 0x8, 0x28, 0xc2, 0xee,
+                                                        0x7, 0x13, 0x78, 0xf0, 0x9c, 0xf1, 0xaf, 0xf7,
+                                                        0x26, 0x1a, 0xf7, 0xe, 0x2c, 0xbd, 0xfb, 0x0,
+                                                        0xc2, 0x1e, 0xf7, 0x6b, 0x7, 0xeb, 0x7b, 0xa0,
+                                                        0x22, 0x96, 0x64, 0x8, 0xaa, 0xf7, 0x21, 0x6,
+                                                        0x6f, 0x9c, 0x68, 0xa0, 0x2b, 0x99, 0x8, 0xd7,
+                                                        0x54, 0x3d, 0x7, 0x37, 0x87, 0x26, 0x54, 0xfb,
+                                                        0x9, 0x1a, 0xfb, 0xd, 0xf7, 0x5, 0x50, 0xd2,
+                                                        0x68, 0x1e, 0xfb, 0x8f, 0x7, 0x54, 0x95, 0x5e,
+                                                        0xa8, 0x67, 0xf7, 0x14, 0x6c, 0x8d, 0x18, 0xf7,
+                                                        0x3b, 0xf7, 0x93, 0x15, 0x80, 0x8f, 0x3d, 0xa3,
+                                                        0xd2, 0x1a, 0xc9, 0xbb, 0x9f, 0xb4, 0x94, 0x1e,
+                                                        0xe, 0xf7, 0xf5, 0x7d, 0xb9, 0xf7, 0x9a, 0xb9,
+                                                        0x78, 0xbe, 0xf7, 0x97, 0xba, 0x99, 0x77, 0x1,
+                                                        0xf7, 0x10, 0xf7, 0x6, 0xf7, 0x56, 0xac, 0xd1,
+                                                        0xf7, 0x9, 0xf7, 0x54, 0xac, 0x3, 0xf8, 0xee,
+                                                        0xf7, 0x38, 0x41, 0x1d, 0xfd, 0x22, 0xf7, 0xe2,
+                                                        0x41, 0x1d, 0xb9, 0x76, 0x1d, 0xf7, 0x4e, 0x7b,
+                                                        0xd8, 0x3e, 0xf0, 0xf8, 0xd1, 0xac, 0x12, 0xc9,
+                                                        0xf7, 0x1f, 0xf7, 0xe, 0xf7, 0x24, 0x8b, 0xf0,
+                                                        0xd6, 0xf7, 0x24, 0x13, 0x7c, 0xf8, 0x6f, 0xd3,
+                                                        0x15, 0x5c, 0xb1, 0xc6, 0x62, 0xc9, 0x1b, 0xb0,
+                                                        0xad, 0x9d, 0xb1, 0xb1, 0x1f, 0x13, 0x7e, 0x9c,
+                                                        0x9c, 0xa5, 0xc0, 0x8c, 0x8c, 0x77, 0x97, 0x18,
+                                                        0x75, 0x7f, 0x77, 0x7b, 0x72, 0x1b, 0x5c, 0x6c,
+                                                        0xb0, 0xc1, 0x61, 0x1f, 0xc1, 0xd0, 0x96, 0x96,
+                                                        0xc2, 0xe4, 0x9c, 0xa6, 0x9a, 0x94, 0xb8, 0x8f,
+                                                        0x8, 0xad, 0xfb, 0x66, 0x69, 0x7, 0xbf, 0x85,
+                                                        0x99, 0x89, 0x66, 0x1a, 0x5b, 0x5f, 0x5f, 0x6b,
+                                                        0x64, 0x1e, 0xfb, 0x2b, 0xf7, 0x6a, 0x5, 0xcc,
+                                                        0xa1, 0xe2, 0xb6, 0xdd, 0x1a, 0xc1, 0x61, 0xce,
+                                                        0xfb, 0x12, 0xfb, 0x34, 0x25, 0xfb, 0x2c, 0xfb,
+                                                        0x2b, 0xf7, 0xc, 0x1e, 0x49, 0x6b, 0xfb, 0x16,
+                                                        0x4c, 0xfb, 0x17, 0x1a, 0xfb, 0xb, 0xea, 0x50,
+                                                        0xeb, 0xf1, 0xdc, 0xc5, 0xa9, 0xb2, 0x1e, 0x74,
+                                                        0xa7, 0x15, 0x13, 0xbc, 0x77, 0x70, 0x6b, 0x78,
+                                                        0x6c, 0x1b, 0x2d, 0x48, 0xf7, 0x17, 0xcf, 0xb7,
+                                                        0xa0, 0xa3, 0xc0, 0xa9, 0x1f, 0xe3, 0xfb, 0x18,
+                                                        0xbe, 0x3f, 0xb1, 0x59, 0x8, 0x54, 0xf7, 0xf4,
+                                                        0x15, 0x73, 0xa8, 0x59, 0xce, 0xbe, 0x1a, 0xbb,
+                                                        0xa7, 0x96, 0xa4, 0xc4, 0xad, 0x41, 0x59, 0x52,
+                                                        0x60, 0x7b, 0x70, 0x82, 0x1e, 0xe, 0xfc, 0x5,
+                                                        0xf8, 0x3d, 0x76, 0xf7, 0xb3, 0x77, 0x1, 0x5c,
+                                                        0xf7, 0x15, 0x3, 0xf7, 0xb, 0xf8, 0x28, 0x15,
+                                                        0xb4, 0x6, 0x9c, 0xd3, 0xa6, 0xf7, 0x4, 0xa2,
+                                                        0x1a, 0xb6, 0x72, 0xb0, 0x63, 0x63, 0x73, 0x66,
+                                                        0x60, 0x74, 0xa6, 0xfb, 0x4, 0x9c, 0x43, 0x1e,
+                                                        0xe, 0x92, 0x1d, 0xbf, 0xf7, 0x5, 0x3, 0xf7,
+                                                        0xc6, 0xfb, 0x20, 0x15, 0x2a, 0xc6, 0x59, 0xd3,
+                                                        0xf7, 0xa4, 0x1a, 0xf7, 0xc5, 0xcb, 0xb6, 0xde,
+                                                        0xc3, 0x1e, 0xa6, 0x7, 0x54, 0x72, 0xfb, 0x61,
+                                                        0xfb, 0x6, 0xfb, 0xb8, 0x1a, 0x39, 0xa7, 0xfb,
+                                                        0x74, 0xf7, 0x7c, 0xfb, 0x11, 0x1e, 0xe, 0x92,
+                                                        0x1d, 0xf7, 0x42, 0xf7, 0x5, 0x3, 0xa6, 0xfb,
+                                                        0x21, 0x15, 0x70, 0x7, 0xc2, 0xa4, 0xf7, 0x61,
+                                                        0xf7, 0x11, 0xf7, 0xb8, 0x1a, 0xdd, 0x6f, 0xf7,
+                                                        0x69, 0xfb, 0x7c, 0xf7, 0x11, 0x1e, 0x6f, 0x7,
+                                                        0xec, 0x50, 0xbd, 0x4e, 0xfb, 0xa4, 0x1a, 0xfb,
+                                                        0xc5, 0x4b, 0x55, 0x38, 0x53, 0x1e, 0xe, 0xf7,
+                                                        0xa8, 0x76, 0xf4, 0x76, 0xa3, 0x76, 0xf7, 0xf,
+                                                        0x76, 0xf7, 0x8b, 0x77, 0x12, 0xf7, 0x5d, 0xee,
+                                                        0x13, 0xbc, 0xf7, 0x85, 0xf8, 0x55, 0x15, 0x6f,
+                                                        0x88, 0x78, 0x86, 0x7d, 0x1e, 0x80, 0x6a, 0x76,
+                                                        0x85, 0x64, 0x1a, 0x69, 0xa2, 0x76, 0xa4, 0xa3,
+                                                        0xa6, 0xa0, 0xaa, 0x1e, 0x8a, 0xa8, 0x7b, 0x98,
+                                                        0x7e, 0xb3, 0x86, 0x9a, 0x87, 0x9f, 0x89, 0xa4,
+                                                        0x92, 0x90, 0x18, 0xa1, 0x80, 0x94, 0x85, 0x99,
+                                                        0x7a, 0x93, 0x81, 0x94, 0x7d, 0x9a, 0x76, 0x8,
+                                                        0x76, 0x99, 0xa1, 0x7f, 0x9e, 0x1b, 0xa5, 0xa2,
+                                                        0x9a, 0xac, 0xc6, 0x56, 0x7f, 0x4e, 0x97, 0x1f,
+                                                        0x79, 0x8f, 0x78, 0x90, 0x79, 0x95, 0x8, 0x93,
+                                                        0x7, 0xa2, 0x9b, 0x9e, 0x91, 0x9b, 0x8e, 0xa5,
+                                                        0x8f, 0xa0, 0x85, 0xa2, 0x94, 0x8, 0xa7, 0x95,
+                                                        0x98, 0xa1, 0xa0, 0x1a, 0xa4, 0x79, 0xa2, 0x6a,
+                                                        0x63, 0x86, 0x6d, 0x64, 0x6b, 0x1e, 0x7f, 0x7d,
+                                                        0x7a, 0x7b, 0x75, 0x7b, 0x83, 0x8e, 0x18, 0x88,
+                                                        0xb1, 0x94, 0xa0, 0x94, 0x9c, 0x8, 0x96, 0xa0,
+                                                        0x99, 0x99, 0xa8, 0x1a, 0xad, 0x71, 0x9f, 0x71,
+                                                        0x73, 0x73, 0x78, 0x6d, 0x6c, 0x9a, 0x7c, 0x97,
+                                                        0x73, 0x1e, 0x94, 0x7a, 0x90, 0x75, 0x67, 0x1a,
+                                                        0x84, 0x88, 0x6f, 0x98, 0x7d, 0x9c, 0x7f, 0x9b,
+                                                        0x19, 0xac, 0x73, 0x86, 0xac, 0x58, 0x1b, 0x7e,
+                                                        0x6c, 0x80, 0x66, 0x68, 0x9a, 0x81, 0xa5, 0x86,
+                                                        0x1f, 0x9d, 0x88, 0xa1, 0x8a, 0xa4, 0x87, 0x9f,
+                                                        0x87, 0xa0, 0x85, 0xa2, 0x80, 0x8a, 0x84, 0x18,
+                                                        0x73, 0x79, 0x78, 0x85, 0x7a, 0x89, 0x8, 0x89,
+                                                        0x7e, 0x7b, 0x8b, 0x7b, 0x1b, 0x6e, 0x6a, 0x7a,
+                                                        0x67, 0x89, 0x1f, 0x13, 0xdc, 0x71, 0x8a, 0xa1,
+                                                        0x71, 0xa6, 0x1b, 0xb6, 0x8f, 0xab, 0xb2, 0xac,
+                                                        0x1f, 0x97, 0x99, 0x9a, 0x9a, 0xa2, 0x9a, 0x8,
+                                                        0xe, 0x3e, 0xa0, 0x76, 0xf7, 0x74, 0xc6, 0xf7,
+                                                        0x73, 0x77, 0x12, 0xf7, 0x81, 0xe5, 0x3f, 0xcb,
+                                                        0x13, 0xf0, 0xac, 0xf7, 0x76, 0x15, 0x13, 0xe8,
+                                                        0xf7, 0x6e, 0xfb, 0x76, 0xcb, 0xf7, 0x76, 0xf7,
+                                                        0x72, 0xc6, 0xfb, 0x72, 0xf7, 0x71, 0x4b, 0xfb,
+                                                        0x71, 0xfb, 0x6e, 0x6, 0xe, 0xfc, 0x21, 0xfb,
+                                                        0x33, 0x83, 0xa, 0xb2, 0x77, 0xa, 0x13, 0xe0,
+                                                        0xb6, 0xfb, 0x34, 0x15, 0x97, 0x77, 0x5, 0xc0,
+                                                        0xa9, 0xf7, 0x7, 0x3d, 0xa, 0x5d, 0x67, 0x6d,
+                                                        0x57, 0x4c, 0xb9, 0x7b, 0xa7, 0x1e, 0x13, 0xd0,
+                                                        0x9f, 0xa1, 0x92, 0x70, 0x53, 0x37, 0x50, 0x6f,
+                                                        0x78, 0x1f, 0xe, 0xfb, 0xce, 0xf7, 0x3f, 0xf7,
+                                                        0x8, 0x1, 0xb7, 0xf7, 0x3f, 0x15, 0xf7, 0x87,
+                                                        0xf7, 0x8, 0xfb, 0x87, 0x6, 0xe, 0xfc, 0x21,
+                                                        0x7e, 0x93, 0xa, 0xd2, 0x62, 0x1d, 0xfc, 0x5,
+                                                        0x8d, 0x76, 0xf9, 0x4b, 0x77, 0xae, 0x77, 0x12,
+                                                        0x13, 0xc0, 0x84, 0x78, 0x15, 0xd3, 0x6, 0x13,
+                                                        0xa0, 0xf7, 0x78, 0xf9, 0x5a, 0x5, 0x3b, 0x6,
+                                                        0xe, 0x7e, 0xa7, 0xf9, 0x19, 0xa7, 0x1, 0xa3,
+                                                        0xf7, 0x32, 0xf7, 0x1c, 0xf7, 0x32, 0x3, 0xf7,
+                                                        0x4a, 0xf7, 0x72, 0x15, 0xf7, 0x79, 0x7, 0xde,
+                                                        0x8b, 0xf7, 0x12, 0xce, 0xbb, 0xa0, 0x51, 0xfb,
+                                                        0x2b, 0x1e, 0xfb, 0x79, 0x7, 0x3c, 0x8f, 0xfb,
+                                                        0x14, 0x43, 0x57, 0x7b, 0xcb, 0xf7, 0x23, 0x1e,
+                                                        0xfb, 0x32, 0xf7, 0x2, 0x15, 0xfb, 0x5d, 0xed,
+                                                        0xfb, 0x24, 0xf7, 0x14, 0xf7, 0x20, 0xe1, 0xf7,
+                                                        0x39, 0xf7, 0x48, 0xf7, 0x84, 0xfb, 0xe, 0xf7,
+                                                        0x8, 0x22, 0x26, 0xfb, 0x10, 0x23, 0xfb, 0x90,
+                                                        0x1e, 0xe, 0x8b, 0xad, 0xf9, 0x22, 0x77, 0x1,
+                                                        0xf7, 0x4e, 0xf7, 0x28, 0x3, 0xcc, 0x16, 0xf8,
+                                                        0xd, 0xad, 0x6, 0x28, 0x82, 0xa6, 0xce, 0x1f,
+                                                        0xf8, 0xc4, 0x7a, 0x7, 0xfb, 0x90, 0xfb, 0x1,
+                                                        0x5, 0x71, 0x7, 0x98, 0xad, 0xad, 0x97, 0x99,
+                                                        0x1b, 0xb2, 0x8b, 0x5f, 0x72, 0x1f, 0xfc, 0xb,
+                                                        0x7, 0x4d, 0x86, 0x65, 0xfb, 0x8, 0x1e, 0xe,
+                                                        0x8b, 0xf7, 0x19, 0xf8, 0x8, 0x76, 0xe5, 0xf7,
+                                                        0x6, 0x1, 0xf7, 0xc0, 0xf7, 0x1c, 0x3, 0x9c,
+                                                        0x16, 0xf8, 0x34, 0x6, 0xb8, 0xf7, 0x67, 0x5,
+                                                        0x69, 0x6, 0x47, 0x6f, 0x82, 0x81, 0x21, 0x1b,
+                                                        0xfb, 0x21, 0x6, 0xf7, 0xa8, 0xf7, 0x9b, 0x8b,
+                                                        0xd7, 0xa8, 0x1a, 0xf7, 0x2c, 0xfb, 0xf, 0xae,
+                                                        0x4d, 0xfb, 0x21, 0x50, 0xfb, 0x27, 0x52, 0x77,
+                                                        0x1e, 0xa7, 0x6, 0xdf, 0xb0, 0xc9, 0x91, 0xa2,
+                                                        0x1b, 0xf2, 0x9b, 0x27, 0x6f, 0xfb, 0xa, 0xfb,
+                                                        0xd, 0xfb, 0x18, 0xfb, 0x36, 0xfb, 0x41, 0x1f,
+                                                        0xe, 0x7d, 0xbd, 0x59, 0xf7, 0x28, 0xf8, 0x6d,
+                                                        0xdc, 0x12, 0xf7, 0xf6, 0xf7, 0x6, 0x13, 0xb0,
+                                                        0xf7, 0x2d, 0xf7, 0xf8, 0x15, 0xd7, 0x71, 0xf7,
+                                                        0x11, 0x61, 0xfb, 0x19, 0x1a, 0x31, 0x57, 0x6e,
+                                                        0x5b, 0x6d, 0x74, 0xa2, 0xa3, 0x72, 0x1e, 0x13,
+                                                        0x70, 0xa4, 0x71, 0x6e, 0xa5, 0x60, 0x1b, 0x6b,
+                                                        0x6d, 0x74, 0x6a, 0x4c, 0xd2, 0x6e, 0xdb, 0xf7,
+                                                        0x48, 0xf7, 0xd, 0xf7, 0xe, 0xf7, 0x20, 0xd6,
+                                                        0x60, 0xd3, 0x3c, 0xa8, 0x1f, 0xb7, 0xa6, 0xb2,
+                                                        0xa4, 0xd8, 0x1a, 0xe8, 0x43, 0xb5, 0x2b, 0xfb,
+                                                        0xa, 0x3e, 0x31, 0x4c, 0x6e, 0x1e, 0xa0, 0x7f,
+                                                        0x5, 0xa3, 0x9a, 0xae, 0xc7, 0xd0, 0x1b, 0xd4,
+                                                        0xac, 0x5f, 0x50, 0x30, 0x39, 0x72, 0x5b, 0x7c,
+                                                        0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x24, 0xf7, 0x3,
+                                                        0xf7, 0xcf, 0x76, 0xf7, 0x1f, 0x77, 0x1, 0xf7,
+                                                        0xa1, 0xf7, 0x23, 0x3, 0x9e, 0xf7, 0x24, 0x15,
+                                                        0xf7, 0x8c, 0xfb, 0x24, 0xf7, 0x25, 0xf7, 0x24,
+                                                        0xca, 0xf7, 0x3, 0x4c, 0xf8, 0x45, 0x31, 0x6,
+                                                        0x31, 0xfb, 0xe, 0xfb, 0x10, 0xfb, 0x3b, 0x32,
+                                                        0xfb, 0x22, 0x8, 0xb4, 0x89, 0x15, 0xf7, 0x63,
+                                                        0xf7, 0xba, 0x5, 0x8d, 0xfb, 0xba, 0x6, 0xe,
+                                                        0x83, 0xc8, 0x4e, 0xf7, 0x28, 0xf7, 0x53, 0xf7,
+                                                        0x1d, 0xdc, 0xf7, 0x13, 0x12, 0xf8, 0x9, 0xd9,
+                                                        0x13, 0xb8, 0xbe, 0xf7, 0xdf, 0x15, 0xd3, 0x86,
+                                                        0xd7, 0x86, 0xce, 0x6d, 0x8, 0xc0, 0x74, 0xc1,
+                                                        0x59, 0x4e, 0x1a, 0x39, 0x49, 0x75, 0x69, 0x6c,
+                                                        0x6d, 0xa0, 0xa0, 0x6d, 0x1e, 0x13, 0x78, 0xa1,
+                                                        0x6c, 0x6b, 0xa2, 0x68, 0x1b, 0x60, 0x78, 0x6b,
+                                                        0x6f, 0x52, 0xcd, 0x6c, 0xd8, 0xf7, 0x4a, 0xf3,
+                                                        0xf7, 0x2, 0xf7, 0x17, 0xed, 0x50, 0xca, 0x5e,
+                                                        0xa4, 0x1f, 0x48, 0xb1, 0x4d, 0x91, 0x30, 0x90,
+                                                        0xa1, 0xe6, 0x18, 0xf7, 0xaa, 0x6, 0xb6, 0xf7,
+                                                        0x13, 0x5, 0xfb, 0xd6, 0x6, 0xe, 0x7e, 0xa6,
+                                                        0xf7, 0xfe, 0xb8, 0xf7, 0x9f, 0x77, 0x1, 0xa7,
+                                                        0xf7, 0x31, 0xf7, 0x1e, 0xf7, 0x2c, 0x3, 0xf8,
+                                                        0x6a, 0xf9, 0x2a, 0x15, 0xa5, 0x7, 0xfb, 0xc0,
+                                                        0x6d, 0xfb, 0x22, 0xfb, 0x54, 0xfb, 0x4a, 0x1a,
+                                                        0xfb, 0x84, 0xf7, 0x1f, 0x52, 0xe5, 0xf7, 0x48,
+                                                        0xb1, 0xf7, 0x3e, 0xc1, 0xf7, 0x40, 0xfb, 0x4,
+                                                        0xb1, 0x46, 0x5b, 0x79, 0x84, 0x81, 0x73, 0x1e,
+                                                        0xb7, 0xf7, 0x4c, 0xf7, 0xe, 0xc1, 0xef, 0x9f,
+                                                        0x8, 0xfb, 0xa8, 0xfb, 0xbf, 0x15, 0x97, 0x96,
+                                                        0x9c, 0x8c, 0x9b, 0x1b, 0xd0, 0x9b, 0x3f, 0xfb,
+                                                        0x24, 0x3c, 0x8b, 0x4c, 0x4e, 0x4d, 0x7c, 0xc9,
+                                                        0xf7, 0x59, 0xac, 0x93, 0xc3, 0x8c, 0x8c, 0x1f,
+                                                        0xe, 0xa0, 0x76, 0xf8, 0x6f, 0x76, 0xe0, 0xf7,
+                                                        0x1d, 0x1, 0xf7, 0x27, 0x16, 0xea, 0x6, 0xf7,
+                                                        0x7f, 0xf9, 0x38, 0x5, 0xfc, 0x34, 0x6, 0x5f,
+                                                        0xfb, 0x72, 0x5, 0xae, 0x6, 0xe0, 0xa1, 0xbd,
+                                                        0x8b, 0xa5, 0x1b, 0xf7, 0x4f, 0x6, 0xe, 0x7e,
+                                                        0xab, 0xf9, 0x14, 0xa8, 0x12, 0xa7, 0xf7, 0xd,
+                                                        0xfb, 0x2, 0xf7, 0x15, 0xf7, 0x39, 0xf7, 0x1f,
+                                                        0xfb, 0x19, 0xf7, 0xb, 0x13, 0xd4, 0xf7, 0xbe,
+                                                        0xf8, 0x3a, 0x15, 0x81, 0x90, 0xfb, 0xc, 0xc5,
+                                                        0xe8, 0x1a, 0xb4, 0xb0, 0xb3, 0xbc, 0xd5, 0x96,
+                                                        0x44, 0x58, 0x4f, 0x79, 0x73, 0x74, 0x6c, 0x1e,
+                                                        0xfb, 0xc, 0x29, 0x15, 0x13, 0xe8, 0x48, 0x76,
+                                                        0x38, 0x64, 0xfb, 0x1, 0x1a, 0xfb, 0x2, 0xf0,
+                                                        0x51, 0xf7, 0x0, 0xf7, 0x23, 0xe7, 0xd9, 0xf7,
+                                                        0x11, 0xe8, 0x4b, 0xd1, 0x35, 0xbe, 0x1e, 0x13,
+                                                        0xd4, 0xc2, 0x9d, 0xdc, 0xa9, 0xe0, 0x1a, 0xc4,
+                                                        0x57, 0xe9, 0xfb, 0x2c, 0xfb, 0x34, 0x54, 0x36,
+                                                        0x2e, 0x38, 0xcb, 0x4e, 0xd6, 0x61, 0x1e, 0xa1,
+                                                        0x79, 0x15, 0x13, 0xe8, 0xcf, 0x5e, 0xcc, 0x60,
+                                                        0x39, 0x1a, 0x71, 0x84, 0x30, 0x32, 0x4a, 0x74,
+                                                        0xcd, 0xd3, 0xd4, 0xa0, 0xaa, 0xa9, 0xb8, 0x1e,
+                                                        0xe, 0x93, 0x76, 0xf7, 0x9f, 0xb8, 0xf7, 0xfe,
+                                                        0xa6, 0x1, 0xa5, 0xf7, 0x2c, 0xf7, 0x1e, 0xf7,
+                                                        0x31, 0x3, 0xaa, 0x7e, 0x15, 0xf7, 0xc0, 0xa9,
+                                                        0xf7, 0x22, 0xf7, 0x54, 0xf7, 0x4a, 0x1a, 0xf7,
+                                                        0x84, 0xfb, 0x1f, 0xc4, 0x31, 0xfb, 0x48, 0x65,
+                                                        0xfb, 0x3e, 0x55, 0xfb, 0x40, 0xf7, 0x4, 0x65,
+                                                        0xd0, 0xae, 0xa5, 0x8e, 0x9b, 0xaa, 0x1e, 0x58,
+                                                        0xfb, 0x51, 0xfb, 0x9, 0x58, 0x27, 0x77, 0x8,
+                                                        0xf7, 0xa8, 0xf7, 0xbf, 0x15, 0x83, 0x8a, 0x70,
+                                                        0x86, 0x7b, 0x1b, 0x46, 0x7b, 0xd7, 0xf7, 0x24,
+                                                        0xda, 0x90, 0xca, 0xc8, 0xc9, 0x95, 0x42, 0xfb,
+                                                        0x59, 0x74, 0x85, 0x63, 0x88, 0x7b, 0x1f, 0xe,
+                                                        0xfb, 0xce, 0x7e, 0xf7, 0x3a, 0xf7, 0x2f, 0xf7,
+                                                        0x38, 0x1, 0xdd, 0xf7, 0x3d, 0x3, 0xdd, 0xd2,
+                                                        0x63, 0x1d, 0xaf, 0x5c, 0x5b, 0x67, 0x66, 0x5e,
+                                                        0x1e, 0xf7, 0xd6, 0x4, 0x86, 0xa, 0xac, 0x5c,
+                                                        0x5b, 0x67, 0x69, 0x5e, 0x1e, 0xe, 0xfb, 0xce,
+                                                        0xfb, 0x33, 0x76, 0xf7, 0xe3, 0xf7, 0x2c, 0x8b,
+                                                        0xf7, 0x39, 0x12, 0xdd, 0xf7, 0x3d, 0x56, 0xcf,
+                                                        0x13, 0xe8, 0xe4, 0xfb, 0x32, 0x15, 0x96, 0x75,
+                                                        0x5, 0x33, 0x1d, 0x1e, 0x13, 0xf0, 0x5d, 0x67,
+                                                        0x6d, 0x57, 0x3c, 0xd2, 0x8b, 0x8e, 0x1f, 0x13,
+                                                        0xe8, 0xaf, 0x8d, 0x91, 0x80, 0x80, 0x1a, 0x53,
+                                                        0x3a, 0x52, 0x6f, 0x78, 0x1e, 0x13, 0xf0, 0x84,
+                                                        0xf8, 0xba, 0x15, 0x86, 0xa, 0xad, 0x5c, 0x5b,
+                                                        0x67, 0x68, 0x5e, 0x1e, 0xe, 0x95, 0xa, 0xf7,
+                                                        0x6b, 0x15, 0xf8, 0x90, 0xfb, 0x73, 0x5, 0xd4,
+                                                        0x7, 0xfc, 0x38, 0xf7, 0x53, 0xf8, 0x38, 0xf7,
+                                                        0x4d, 0x5, 0xd4, 0x7, 0xfc, 0x90, 0xfb, 0x73,
+                                                        0x5, 0xe, 0x3e, 0xf6, 0xdf, 0xf7, 0xe, 0xe1,
+                                                        0x47, 0xcf, 0x12, 0x13, 0xa0, 0xac, 0xf7, 0xdf,
+                                                        0x15, 0xf8, 0x8c, 0xcf, 0xfc, 0x8c, 0x6, 0xfb,
+                                                        0xb8, 0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xcc,
+                                                        0xfc, 0x8c, 0x7, 0xe, 0x95, 0xa, 0x83, 0x15,
+                                                        0xf8, 0x90, 0xf7, 0x73, 0x5, 0xd7, 0x7, 0xfc,
+                                                        0x90, 0xf7, 0x73, 0x5, 0x3f, 0x7, 0xf8, 0x37,
+                                                        0xfb, 0x4b, 0xfc, 0x37, 0xfb, 0x50, 0x5, 0xe,
+                                                        0x7e, 0xf7, 0x3d, 0xf8, 0x85, 0xaf, 0x12, 0xc4,
+                                                        0xf7, 0x17, 0x69, 0xf7, 0x3d, 0x70, 0xf7, 0x29,
+                                                        0x13, 0xe8, 0xf7, 0x73, 0xf7, 0x7b, 0x15, 0xa9,
+                                                        0x6, 0xe2, 0x9a, 0x90, 0xde, 0xbe, 0x1e, 0xc0,
+                                                        0xac, 0xb4, 0xbb, 0xcb, 0x1a, 0xf7, 0x33, 0xfb,
+                                                        0x37, 0x96, 0x6c, 0xfb, 0x38, 0x6d, 0x25, 0x62,
+                                                        0x68, 0x9e, 0x61, 0xbe, 0x9f, 0xb4, 0x97, 0xbf,
+                                                        0xa7, 0x7f, 0x97, 0x81, 0x96, 0x1e, 0x83, 0x93,
+                                                        0x84, 0x93, 0x98, 0x1a, 0xb0, 0xbd, 0x8e, 0x94,
+                                                        0xd9, 0x93, 0x2f, 0x61, 0x51, 0x7b, 0x65, 0x7a,
+                                                        0x6a, 0x1e, 0x71, 0x59, 0x6d, 0x65, 0x9b, 0x44,
+                                                        0x8, 0x13, 0xd0, 0x46, 0xfb, 0x34, 0x15, 0x5c,
+                                                        0xb0, 0x66, 0xbb, 0xb9, 0xb1, 0xaf, 0xbb, 0xb9,
+                                                        0x65, 0xb2, 0x5d, 0x5b, 0x66, 0x63, 0x5e, 0x1e,
+                                                        0xe, 0xf7, 0xaf, 0x6d, 0xb9, 0xf7, 0x13, 0xb0,
+                                                        0x66, 0xbb, 0xf7, 0xa2, 0xbb, 0xf7, 0x23, 0xb2,
+                                                        0x12, 0xeb, 0xe7, 0xf7, 0x25, 0xd8, 0xf8, 0x1,
+                                                        0xba, 0x13, 0xbf, 0xf8, 0x20, 0xf7, 0xac, 0x15,
+                                                        0xf7, 0xd, 0xe3, 0xd1, 0xbc, 0xa9, 0x99, 0x75,
+                                                        0x60, 0x1e, 0x13, 0xaf, 0xfb, 0x25, 0x7d, 0x4e,
+                                                        0x45, 0x5f, 0x1b, 0x69, 0x6f, 0xa8, 0xc7, 0x1f,
+                                                        0xf7, 0x23, 0x4b, 0x15, 0x7e, 0x8a, 0xa3, 0x4f,
+                                                        0xd0, 0x1b, 0xf7, 0xf, 0xcf, 0xf7, 0x1f, 0xf4,
+                                                        0xf7, 0x42, 0xfb, 0x28, 0xf7, 0x16, 0xfb, 0x52,
+                                                        0xfb, 0x5f, 0xfb, 0x41, 0xfb, 0x29, 0xfb, 0x72,
+                                                        0xfb, 0x1e, 0xf7, 0xa, 0xfb, 0x5d, 0xf7, 0xa1,
+                                                        0xdb, 0xd1, 0xa7, 0xab, 0xcd, 0x1f, 0x7e, 0xae,
+                                                        0x5, 0x70, 0x50, 0x55, 0x75, 0x30, 0x1b, 0xfb,
+                                                        0x41, 0xfb, 0xd, 0xf7, 0x25, 0xf7, 0x28, 0xf7,
+                                                        0x78, 0xf7, 0x1a, 0xf3, 0xf7, 0x2a, 0xf7, 0x4c,
+                                                        0xf6, 0xfb, 0x28, 0xfb, 0x9, 0x1f, 0x13, 0xdf,
+                                                        0x33, 0x59, 0xfb, 0xb, 0x3d, 0x60, 0x8f, 0xbc,
+                                                        0x9c, 0x8e, 0x1e, 0xcd, 0xf7, 0x98, 0x5, 0x44,
+                                                        0x6, 0x80, 0x63, 0x5, 0xa5, 0x7d, 0x80, 0xa6,
+                                                        0x5b, 0x1b, 0xfb, 0x1e, 0x4a, 0xfb, 0x36, 0x3e,
+                                                        0x1f, 0x13, 0x0, 0xfb, 0x4, 0xd1, 0x72, 0xa8,
+                                                        0x8c, 0x1e, 0xc8, 0x90, 0xba, 0xbd, 0x96, 0x9c,
+                                                        0x8, 0xe, 0x4b, 0x1d, 0x12, 0x94, 0xf7, 0x5f,
+                                                        0x65, 0x9a, 0x13, 0xf0, 0x94, 0x16, 0x3a, 0xa,
+                                                        0x13, 0xe8, 0x20, 0xa, 0x5, 0x13, 0xf0, 0x7f,
+                                                        0x6d, 0x88, 0x86, 0x55, 0x83, 0x8, 0x13, 0xe8,
+                                                        0x31, 0x1d, 0x9f, 0x8b, 0xb5, 0xf7, 0xc1, 0xa9,
+                                                        0xf7, 0x9b, 0xb3, 0x12, 0xf3, 0xf7, 0x34, 0xf7,
+                                                        0x30, 0xf7, 0x39, 0xfb, 0x1e, 0xf7, 0x40, 0x13,
+                                                        0xf4, 0xf7, 0x9c, 0xf7, 0xeb, 0x15, 0xa9, 0x6,
+                                                        0xcc, 0x88, 0xe3, 0x7c, 0xfb, 0x23, 0x1a, 0x4e,
+                                                        0x7e, 0x3c, 0xfb, 0x2, 0x61, 0x79, 0x9b, 0xb8,
+                                                        0x1e, 0xf7, 0xa2, 0x4, 0xf7, 0x63, 0x7, 0xa2,
+                                                        0x8c, 0x8c, 0xac, 0xbe, 0x1b, 0x13, 0xf8, 0xdc,
+                                                        0xa1, 0x59, 0x45, 0x25, 0x75, 0x62, 0xfb, 0x1a,
+                                                        0x1f, 0xfb, 0x8c, 0xfc, 0x9, 0x15, 0xf7, 0xd6,
+                                                        0x6, 0x13, 0xf4, 0xf7, 0x67, 0xd1, 0xed, 0xdf,
+                                                        0xf7, 0x6, 0x22, 0xc1, 0x37, 0x99, 0x1f, 0x8d,
+                                                        0x7, 0x13, 0xf8, 0xb5, 0x98, 0xf7, 0x5, 0xa5,
+                                                        0xf7, 0x3, 0x1a, 0xf7, 0x30, 0xfb, 0x60, 0x8f,
+                                                        0x53, 0x1e, 0xfb, 0xc9, 0x53, 0x1d, 0xfc, 0x71,
+                                                        0x7, 0x4e, 0x6b, 0x8a, 0x53, 0x8b, 0x1d, 0xd6,
+                                                        0x78, 0xbb, 0x7d, 0xa, 0xfb, 0x44, 0xf7, 0x45,
+                                                        0xf8, 0x2b, 0xae, 0x13, 0xe6, 0xf9, 0x25, 0xf7,
+                                                        0x2c, 0x15, 0x2e, 0x38, 0x38, 0x6d, 0x3d, 0x1b,
+                                                        0x13, 0xea, 0xfb, 0x28, 0x64, 0xf7, 0x46, 0xf7,
+                                                        0x11, 0xf7, 0x3d, 0xb4, 0xf7, 0x31, 0xf7, 0x26,
+                                                        0xf7, 0x6, 0xd3, 0xfb, 0x9, 0x34, 0xae, 0x1f,
+                                                        0xae, 0x6, 0x13, 0xd6, 0x6a, 0x1d, 0x83, 0x80,
+                                                        0x90, 0x92, 0x7c, 0x1f, 0x13, 0xe6, 0x99, 0x6c,
+                                                        0x5c, 0xa2, 0x4e, 0x1b, 0x13, 0xea, 0xfb, 0x66,
+                                                        0xfb, 0x2e, 0xfb, 0x30, 0xfb, 0x5f, 0xfb, 0x4f,
+                                                        0xf7, 0x17, 0xfb, 0x38, 0xf7, 0x7d, 0xf7, 0x14,
+                                                        0xd4, 0xca, 0xde, 0xd4, 0x1f, 0xe, 0x8a, 0x1d,
+                                                        0x68, 0xb8, 0xf8, 0xdf, 0xb7, 0x12, 0xec, 0xf7,
+                                                        0x36, 0xf7, 0x95, 0xf7, 0x42, 0x13, 0xb8, 0x99,
+                                                        0x16, 0xf7, 0xd0, 0x6, 0xf7, 0x90, 0xf7, 0x0,
+                                                        0xf7, 0x38, 0xf7, 0x4c, 0xf7, 0x2e, 0x30, 0xf7,
+                                                        0x42, 0x95, 0x1d, 0x87, 0xb7, 0x89, 0x4e, 0x1a,
+                                                        0xfc, 0x6d, 0x7, 0x66, 0x77, 0x6e, 0x4c, 0x1e,
+                                                        0xf7, 0x89, 0xcd, 0x15, 0xf8, 0x6d, 0x7, 0x8c,
+                                                        0x1d, 0xfb, 0x55, 0x30, 0x1f, 0x13, 0x78, 0x84,
+                                                        0xa, 0x1e, 0xe, 0x9f, 0x8b, 0xb4, 0xf7, 0xb4,
+                                                        0xad, 0xf7, 0xa1, 0xb7, 0x12, 0xf3, 0xf7, 0x36,
+                                                        0xf7, 0x36, 0xa5, 0xf7, 0x6, 0xa4, 0x17, 0x9b,
+                                                        0x16, 0x3c, 0xa, 0x7b, 0x29, 0x1b, 0x4a, 0x78,
+                                                        0x97, 0xb7, 0x1f, 0xf7, 0x7c, 0x7, 0xee, 0xbe,
+                                                        0x6d, 0xfb, 0x11, 0x97, 0x1f, 0xa5, 0xf7, 0xe6,
+                                                        0x71, 0x6, 0xfb, 0x10, 0x7c, 0x58, 0x72, 0x2b,
+                                                        0x1b, 0xf7, 0x63, 0x7, 0xb6, 0x9d, 0x9e, 0xc2,
+                                                        0xf7, 0x1b, 0xd2, 0x7c, 0xfb, 0x22, 0xa2, 0x1e,
+                                                        0xa4, 0xf7, 0x5d, 0xfc, 0xd5, 0x6, 0x13, 0x10,
+                                                        0x68, 0x7, 0xb9, 0x88, 0xb5, 0x89, 0x49, 0x1a,
+                                                        0xfc, 0x6d, 0x7, 0x4d, 0x6c, 0x91, 0x52, 0x8b,
+                                                        0x1d, 0x67, 0x8b, 0xae, 0xf7, 0xba, 0xad, 0xf7,
+                                                        0x19, 0x76, 0xc5, 0x76, 0xf7, 0xc, 0xb7, 0x1,
+                                                        0xf3, 0xf7, 0x36, 0xf7, 0x2d, 0xa4, 0xf7, 0x7,
+                                                        0xa3, 0x3, 0x9b, 0x16, 0xf7, 0xfc, 0xae, 0x6,
+                                                        0x45, 0x8e, 0x63, 0x83, 0xcd, 0x1a, 0xf7, 0x7d,
+                                                        0x7, 0xf7, 0x12, 0x9b, 0x42, 0x39, 0x96, 0x1f,
+                                                        0xa4, 0xf7, 0xe6, 0x72, 0x6, 0x3b, 0x7d, 0x7c,
+                                                        0x46, 0xfb, 0x10, 0x1b, 0xf7, 0x6d, 0x7, 0xb6,
+                                                        0x9d, 0x94, 0xc1, 0xf7, 0x40, 0xa6, 0x56, 0x23,
+                                                        0xa1, 0x1e, 0xa3, 0xf7, 0x5d, 0xfc, 0xcb, 0x68,
+                                                        0x6, 0xba, 0x88, 0xb4, 0x93, 0x49, 0x1a, 0xfc,
+                                                        0x78, 0x7, 0x4d, 0x6c, 0x92, 0x52, 0x8b, 0x1d,
+                                                        0xf7, 0x17, 0x78, 0xac, 0xf7, 0x82, 0xae, 0xf7,
+                                                        0x50, 0x76, 0xf7, 0x60, 0xac, 0x88, 0x77, 0x12,
+                                                        0xb0, 0xf7, 0x45, 0xf7, 0xbf, 0xf7, 0x30, 0x13,
+                                                        0xf6, 0xf8, 0x30, 0xf7, 0x90, 0x15, 0xd0, 0x87,
+                                                        0xab, 0x7d, 0x4b, 0x1a, 0x38, 0x7, 0x60, 0x7b,
+                                                        0x6d, 0x33, 0xfb, 0x51, 0x85, 0xf7, 0x8b, 0xd2,
+                                                        0xf7, 0x40, 0xb5, 0xf7, 0x2e, 0xf7, 0x25, 0xf7,
+                                                        0x6, 0xd3, 0xfb, 0x9, 0x34, 0xae, 0x1e, 0xae,
+                                                        0x6, 0x13, 0xee, 0x6a, 0x1d, 0x84, 0x81, 0x8f,
+                                                        0x90, 0x7f, 0x1f, 0x13, 0xf6, 0x99, 0x6c, 0x5b,
+                                                        0xa5, 0x4a, 0x1b, 0xfb, 0x6c, 0xfb, 0x28, 0xfb,
+                                                        0x36, 0xfb, 0x59, 0xfb, 0x42, 0xf7, 0xe, 0xfb,
+                                                        0x45, 0xf7, 0x8e, 0xe2, 0xf7, 0x11, 0xa7, 0xad,
+                                                        0xbb, 0x1f, 0xf7, 0x13, 0x7, 0xdd, 0xa3, 0x84,
+                                                        0xc9, 0x92, 0x1e, 0xae, 0xfb, 0xeb, 0x7, 0xe,
+                                                        0xf7, 0x17, 0xa0, 0x76, 0xf7, 0xda, 0xba, 0xf7,
+                                                        0xa0, 0xae, 0x1, 0xf5, 0xf7, 0x36, 0xf7, 0x85,
+                                                        0x7f, 0x1d, 0xa0, 0x16, 0xf7, 0xe5, 0xae, 0x6,
+                                                        0x56, 0x91, 0x66, 0x8f, 0xc8, 0x1a, 0xf7, 0x70,
+                                                        0xf7, 0x85, 0xfb, 0x70, 0x7, 0x4e, 0x66, 0x87,
+                                                        0x56, 0x85, 0x1e, 0x68, 0xf7, 0xe8, 0xae, 0x7,
+                                                        0x56, 0x92, 0x68, 0x8f, 0xc7, 0x1a, 0xf8, 0x64,
+                                                        0x7, 0xcc, 0xb8, 0x8e, 0xb6, 0x8e, 0x1e, 0xae,
+                                                        0xfb, 0xe8, 0x68, 0x7, 0xb7, 0x88, 0xb9, 0x89,
+                                                        0x49, 0x1a, 0xfb, 0x59, 0xfb, 0x85, 0xf7, 0x59,
+                                                        0x7, 0xcd, 0xb9, 0x8d, 0xb7, 0x8e, 0x1e, 0xae,
+                                                        0xfb, 0xe5, 0x68, 0x7, 0xb5, 0x87, 0xb6, 0x89,
+                                                        0x4a, 0x7e, 0xa, 0x50, 0x6b, 0x86, 0x56, 0x8b,
+                                                        0xa, 0x5c, 0xa, 0x27, 0xa, 0xe, 0x2b, 0xac,
+                                                        0xb7, 0xac, 0xf9, 0x7, 0xae, 0x1, 0x63, 0xf7,
+                                                        0x23, 0xf7, 0x11, 0x7f, 0x1d, 0xf7, 0x13, 0xf9,
+                                                        0x15, 0x15, 0xc4, 0x89, 0xb7, 0x7f, 0x47, 0x1a,
+                                                        0xfc, 0x5e, 0x7, 0x6c, 0x8b, 0x53, 0x4a, 0x6f,
+                                                        0x7b, 0x99, 0x9c, 0x9b, 0x94, 0x92, 0x93, 0x95,
+                                                        0x1e, 0x90, 0x92, 0x90, 0x94, 0x9b, 0x1a, 0xc2,
+                                                        0x59, 0x9f, 0x75, 0x6e, 0x61, 0x75, 0x54, 0x7a,
+                                                        0x95, 0xfb, 0x2, 0xf7, 0x2a, 0xf2, 0xf7, 0x10,
+                                                        0x9a, 0xf4, 0x1e, 0xf8, 0x5e, 0x7, 0xd0, 0xab,
+                                                        0x94, 0xc4, 0x8f, 0x1e, 0xae, 0xfb, 0xf4, 0x7,
+                                                        0xe, 0xf7, 0x17, 0x4e, 0x1d, 0x1, 0xf7, 0x9,
+                                                        0x7f, 0x1d, 0xa9, 0x16, 0xf7, 0xe5, 0xae, 0x6,
+                                                        0x56, 0x92, 0x68, 0x8f, 0xc7, 0x1a, 0xf7, 0x4e,
+                                                        0x7, 0xa6, 0xa4, 0xf7, 0x4a, 0xfb, 0x6d, 0xb5,
+                                                        0x59, 0x84, 0x7b, 0x31, 0x8c, 0x19, 0x68, 0xf7,
+                                                        0xe4, 0xae, 0x7, 0x77, 0x8c, 0x7d, 0x8d, 0x7c,
+                                                        0x9d, 0xfb, 0xc5, 0xf8, 0x4, 0x18, 0xf7, 0x3c,
+                                                        0xf7, 0x40, 0xbb, 0xb2, 0xf4, 0x91, 0x8, 0xae,
+                                                        0xfb, 0xb5, 0x68, 0x7, 0xf7, 0x0, 0x8a, 0x86,
+                                                        0x6a, 0x55, 0x55, 0xfb, 0x6d, 0xfb, 0x64, 0x18,
+                                                        0xf7, 0x6a, 0x7, 0xe1, 0xad, 0x83, 0xc2, 0x8f,
+                                                        0x1e, 0xae, 0xfb, 0xe6, 0x68, 0x7, 0xb9, 0x88,
+                                                        0xb4, 0x7e, 0x49, 0x1a, 0xfc, 0x59, 0x7, 0x4e,
+                                                        0x6b, 0x87, 0x54, 0x8b, 0x1d, 0x9f, 0x8b, 0xb4,
+                                                        0xf8, 0xec, 0x60, 0x1d, 0x42, 0x96, 0x1d, 0xf8,
+                                                        0x62, 0x7, 0xcf, 0xaa, 0x99, 0xd1, 0x1e, 0xae,
+                                                        0xfb, 0xf1, 0x68, 0x7, 0xb8, 0xb4, 0x7b, 0x49,
+                                                        0x1f, 0xfc, 0x62, 0x7, 0x4e, 0x61, 0x91, 0x5f,
+                                                        0x8b, 0xa, 0xf7, 0xbd, 0x8b, 0xae, 0xf8, 0xf3,
+                                                        0xae, 0x12, 0xb2, 0xf7, 0x17, 0x4a, 0xb5, 0xf8,
+                                                        0x8c, 0xf7, 0x2f, 0x13, 0xd8, 0x99, 0x16, 0xf7,
+                                                        0x7e, 0xae, 0x6, 0x38, 0x90, 0x79, 0x90, 0xd1,
+                                                        0x1a, 0xf8, 0x64, 0x8d, 0x7, 0x13, 0xe8, 0xf7,
+                                                        0x8e, 0xfc, 0xd7, 0x5, 0xa6, 0x6, 0xf7, 0x8e,
+                                                        0xf8, 0xe6, 0x5, 0x8d, 0xfc, 0x78, 0x6, 0x49,
+                                                        0x6e, 0x88, 0x4f, 0x85, 0x1e, 0x68, 0xf7, 0xe0,
+                                                        0xae, 0x7, 0x49, 0x94, 0x75, 0x7d, 0xdb, 0x1a,
+                                                        0xf8, 0x4b, 0x7, 0xe1, 0xab, 0x8d, 0xc3, 0x8f,
+                                                        0x1e, 0xae, 0xfb, 0x90, 0x7, 0x13, 0xd0, 0xfb,
+                                                        0x5c, 0xfc, 0x6c, 0xfb, 0x5c, 0xf8, 0x6c, 0x5,
+                                                        0xfb, 0x91, 0x68, 0x6, 0xd2, 0x86, 0x9d, 0x7d,
+                                                        0x57, 0x1a, 0xfc, 0x5b, 0x7, 0x51, 0x7e, 0x7c,
+                                                        0x3d, 0x8b, 0xa, 0xd6, 0x8e, 0x76, 0xb2, 0x76,
+                                                        0xf8, 0xb5, 0x76, 0xf7, 0x9, 0xae, 0x12, 0xf3,
+                                                        0xb7, 0xf8, 0x43, 0xb7, 0x13, 0x7c, 0x72, 0x1d,
+                                                        0x13, 0xbc, 0x37, 0xa, 0xe, 0x51, 0x1d, 0x1,
+                                                        0xae, 0xf7, 0x45, 0xf7, 0xf6, 0x48, 0xa, 0xfb,
+                                                        0x48, 0x78, 0xa, 0xfb, 0x7b, 0x3c, 0x1d, 0xf7,
+                                                        0x21, 0x5e, 0xa, 0xf7, 0x21, 0x5e, 0x1d, 0xfb,
+                                                        0x1d, 0xfb, 0x6e, 0x1e, 0xe, 0x67, 0xa0, 0x76,
+                                                        0xf7, 0xc3, 0xae, 0xf7, 0xb9, 0xb8, 0x1, 0xef,
+                                                        0xf7, 0x36, 0xf7, 0x3a, 0xf7, 0x40, 0x3, 0x9b,
+                                                        0x16, 0xf7, 0xe2, 0xae, 0x6, 0x46, 0x94, 0x78,
+                                                        0x83, 0xdc, 0x1a, 0xf7, 0x4e, 0x7, 0xf7, 0x3a,
+                                                        0xf7, 0x40, 0xb6, 0xf7, 0x23, 0xf7, 0x3d, 0xfb,
+                                                        0x4a, 0x9d, 0x3b, 0x1f, 0xfb, 0xd6, 0x68, 0x6,
+                                                        0xc0, 0x86, 0xaa, 0x86, 0x62, 0x1a, 0xfc, 0x6d,
+                                                        0x7, 0x31, 0x64, 0x93, 0x5e, 0x1e, 0xf7, 0x8a,
+                                                        0xf7, 0xc3, 0x15, 0xf7, 0x96, 0x7, 0xa1, 0x8c,
+                                                        0x98, 0x98, 0xad, 0x1b, 0xdd, 0xaf, 0x6f, 0xfb,
+                                                        0x6, 0xfb, 0x10, 0x5e, 0x6e, 0xfb, 0xd, 0x8d,
+                                                        0x1f, 0xe, 0xf7, 0x17, 0xfb, 0x44, 0xf7, 0x52,
+                                                        0x93, 0x1d, 0x5a, 0xa, 0xf7, 0xa5, 0x89, 0x15,
+                                                        0xfb, 0x1f, 0xf7, 0x5, 0xf5, 0x68, 0xe1, 0x1b,
+                                                        0xcd, 0xc1, 0x9f, 0x9a, 0xb1, 0x1f, 0x85, 0xa3,
+                                                        0x2d, 0x6d, 0x2f, 0xa4, 0x55, 0xf7, 0x8, 0x19,
+                                                        0xf7, 0x2b, 0xb2, 0xf1, 0xf7, 0x12, 0xf7, 0x42,
+                                                        0x1a, 0xf7, 0x6e, 0xfb, 0x35, 0xf7, 0x20, 0x5e,
+                                                        0x1d, 0xfb, 0x13, 0xfb, 0x7b, 0xfb, 0x14, 0xd8,
+                                                        0xfb, 0x33, 0xf7, 0x35, 0x5b, 0x1e, 0x4e, 0xf7,
+                                                        0xe3, 0x79, 0x1d, 0xf7, 0x47, 0x66, 0x1d, 0xfb,
+                                                        0x47, 0x78, 0xa, 0xfb, 0x7c, 0x65, 0x1d, 0xf7,
+                                                        0x7c, 0xe2, 0x1e, 0xe, 0xd6, 0xa0, 0x76, 0xf9,
+                                                        0xc, 0xb7, 0x68, 0xae, 0x12, 0xf7, 0x6, 0xf7,
+                                                        0x36, 0xf7, 0x4b, 0xf7, 0x3f, 0x13, 0xd8, 0xf7,
+                                                        0xa8, 0xf7, 0xed, 0x15, 0xf7, 0x89, 0x7, 0xaa,
+                                                        0x90, 0x8d, 0x96, 0xc2, 0x1b, 0xdb, 0xb4, 0x6a,
+                                                        0x26, 0xfb, 0x16, 0x57, 0x75, 0xfb, 0x17, 0x8a,
+                                                        0x1f, 0xfb, 0x8e, 0xfb, 0xed, 0x15, 0xf7, 0xe6,
+                                                        0xae, 0x6, 0x49, 0x94, 0x75, 0x8e, 0xdb, 0x1a,
+                                                        0xf7, 0x4e, 0xa6, 0x7, 0xf7, 0x63, 0xfb, 0xcd,
+                                                        0x5, 0xf7, 0x61, 0xae, 0x6, 0x7f, 0x77, 0x8c,
+                                                        0x9d, 0x7d, 0x1f, 0xfb, 0x58, 0xf7, 0xa7, 0x5,
+                                                        0xc1, 0x9c, 0xf2, 0xa8, 0xf7, 0xf, 0x1a, 0xf7,
+                                                        0x3c, 0xfb, 0x68, 0x95, 0x45, 0x1e, 0xfb, 0xd6,
+                                                        0x6, 0x13, 0xb8, 0x68, 0x7, 0xc4, 0x87, 0xaa,
+                                                        0x86, 0x60, 0x1a, 0xfc, 0x62, 0x7, 0x3a, 0x77,
+                                                        0x88, 0x47, 0x83, 0x1e, 0xe, 0x30, 0x78, 0xac,
+                                                        0xf9, 0x1a, 0xaa, 0x8c, 0x8e, 0xa, 0x13, 0xd8,
+                                                        0x7c, 0x1d, 0x97, 0x94, 0x1d, 0xc4, 0x1b, 0x47,
+                                                        0x1d, 0x13, 0xb8, 0x85, 0xa, 0x77, 0x75, 0x92,
+                                                        0x93, 0x73, 0x1f, 0x13, 0xd8, 0x94, 0x70, 0x6e,
+                                                        0x94, 0x6e, 0x46, 0x1d, 0xe, 0x9f, 0x8b, 0xae,
+                                                        0xf8, 0x61, 0x76, 0xf7, 0x3d, 0xab, 0x1, 0xf7,
+                                                        0x91, 0x7f, 0x1d, 0xf7, 0x30, 0x16, 0xf7, 0xf9,
+                                                        0xae, 0x6, 0x41, 0x90, 0x73, 0x8d, 0xe0, 0x1a,
+                                                        0xf8, 0x99, 0x7, 0xd0, 0x87, 0xf2, 0x86, 0x9f,
+                                                        0xfb, 0x34, 0x8, 0xa8, 0x6, 0x89, 0xf7, 0x5d,
+                                                        0x5, 0xfc, 0xef, 0xfb, 0x5d, 0xa8, 0x6, 0x9f,
+                                                        0xf7, 0x34, 0xf2, 0x90, 0xd1, 0x8f, 0x8, 0xfc,
+                                                        0x99, 0x7, 0x37, 0x73, 0x89, 0x42, 0x8b, 0x1d,
+                                                        0x6b, 0xa, 0x63, 0xa, 0x9b, 0xf9, 0x15, 0x15,
+                                                        0xc3, 0x85, 0xa5, 0x8c, 0x37, 0x1a, 0xfb, 0xdb,
+                                                        0x7, 0xfb, 0x4d, 0xf7, 0x1c, 0x50, 0xf7, 0x1c,
+                                                        0xf7, 0x26, 0xf6, 0xe6, 0xf7, 0x2d, 0x1e, 0xf7,
+                                                        0xdb, 0x7, 0xcd, 0xa2, 0x9a, 0x43, 0xa, 0x73,
+                                                        0x4e, 0x1a, 0xfb, 0xdb, 0x7, 0x4b, 0x89, 0xfb,
+                                                        0x17, 0xfb, 0x44, 0xfb, 0x24, 0x8b, 0xf7, 0x1e,
+                                                        0xc4, 0x1e, 0xf7, 0xdb, 0x7, 0xe3, 0xaa, 0x89,
+                                                        0xcd, 0x8e, 0x1e, 0xae, 0xfb, 0xe6, 0x7, 0xe,
+                                                        0xd6, 0x8e, 0x76, 0xf9, 0x27, 0xae, 0x1, 0xf7,
+                                                        0xf8, 0x79, 0x15, 0xa6, 0x6, 0xf7, 0x78, 0xf8,
+                                                        0xd5, 0xa1, 0xc3, 0x98, 0x9e, 0xc2, 0x92, 0x19,
+                                                        0xae, 0xfb, 0x69, 0x68, 0x7, 0xc4, 0x88, 0xa8,
+                                                        0x87, 0x64, 0x1a, 0xfb, 0x27, 0xfc, 0x18, 0x5,
+                                                        0xfb, 0x21, 0xf7, 0xe9, 0x77, 0xab, 0x9e, 0x1a,
+                                                        0xb1, 0xa2, 0x8b, 0xca, 0x8f, 0x1e, 0xae, 0xfb,
+                                                        0xe4, 0x68, 0x7, 0xb6, 0x84, 0x9a, 0x88, 0xa5,
+                                                        0x4f, 0x8, 0xe, 0xf7, 0xf5, 0x91, 0x76, 0xf8,
+                                                        0x7d, 0x76, 0xf7, 0x50, 0xae, 0x1, 0xf7, 0xc0,
+                                                        0x7c, 0x15, 0xa7, 0x6, 0xf7, 0x4a, 0xf8, 0x68,
+                                                        0x5, 0x92, 0x6, 0xf7, 0x3c, 0xfc, 0x68, 0x5,
+                                                        0xa6, 0x6, 0xf7, 0x5c, 0xf8, 0xe4, 0x97, 0xb0,
+                                                        0xa1, 0xa3, 0xae, 0x8e, 0x19, 0xae, 0xfb, 0x4a,
+                                                        0x68, 0x7, 0xad, 0x89, 0xae, 0x8a, 0x62, 0x1a,
+                                                        0xfb, 0xa, 0xfc, 0x8, 0x5, 0x89, 0x6, 0xfb,
+                                                        0x5, 0xf7, 0xf4, 0x83, 0x99, 0x97, 0x1a, 0xad,
+                                                        0xa8, 0x8c, 0xb6, 0x8e, 0x1e, 0xae, 0xfb, 0xcc,
+                                                        0x68, 0x7, 0xbb, 0x89, 0x96, 0x80, 0x98, 0x75,
+                                                        0xae, 0x35, 0x18, 0xfb, 0x9, 0xfb, 0xc5, 0x5,
+                                                        0x89, 0x6, 0xfb, 0xf, 0xf8, 0x8, 0x88, 0x8c,
+                                                        0x96, 0x1a, 0xb0, 0xa7, 0x8d, 0xaf, 0x8e, 0x1e,
+                                                        0xae, 0xfb, 0xba, 0x68, 0x7, 0xb5, 0x85, 0x95,
+                                                        0x81, 0x9c, 0x5b, 0x8, 0xe, 0xd6, 0x4e, 0x1d,
+                                                        0x1, 0x9b, 0xf9, 0x3f, 0x3, 0x9b, 0x16, 0xf7,
+                                                        0x8e, 0xae, 0x6, 0x68, 0x8e, 0x55, 0x8f, 0xae,
+                                                        0x1a, 0xf7, 0x20, 0xf7, 0x56, 0x5, 0xf7, 0x3,
+                                                        0xfb, 0x46, 0x96, 0x7b, 0x81, 0x1a, 0x70, 0x6f,
+                                                        0x89, 0x57, 0x88, 0x1e, 0x68, 0xf7, 0xe8, 0xae,
+                                                        0x7, 0x6f, 0x8d, 0x7b, 0x8d, 0x56, 0xdd, 0xfb,
+                                                        0x4a, 0xf7, 0xa5, 0x18, 0xf7, 0x32, 0xf7, 0x72,
+                                                        0x9e, 0x9c, 0xe6, 0x93, 0x8, 0xae, 0xfb, 0x8e,
+                                                        0x68, 0x7, 0xb7, 0x88, 0xa7, 0x8a, 0x6c, 0x1a,
+                                                        0x70, 0x8b, 0x95, 0xfb, 0x6, 0xfb, 0x32, 0x1e,
+                                                        0xfb, 0x1, 0xf7, 0x3c, 0x88, 0x87, 0x98, 0x1a,
+                                                        0xa8, 0x9f, 0x8b, 0xc6, 0x8f, 0x1e, 0xae, 0xfb,
+                                                        0xee, 0x68, 0x7, 0xb5, 0x89, 0x9c, 0x72, 0xa0,
+                                                        0x6c, 0xf7, 0x5a, 0xfb, 0xad, 0x18, 0xfb, 0x39,
+                                                        0xfb, 0x67, 0x62, 0x55, 0x5b, 0x8b, 0x72, 0x89,
+                                                        0x19, 0xe, 0xd6, 0x4e, 0x1d, 0x1, 0xf7, 0xaa,
+                                                        0xf7, 0x36, 0xf7, 0x1d, 0xf7, 0xe, 0x3, 0x69,
+                                                        0x1d, 0x8d, 0xde, 0x1a, 0xf7, 0x42, 0x66, 0xa,
+                                                        0xcf, 0x7f, 0x7a, 0x6e, 0xfb, 0x38, 0xfb, 0xa0,
+                                                        0x18, 0x42, 0x1d, 0xe, 0x8c, 0xa, 0x1, 0x39,
+                                                        0xa, 0xe, 0x91, 0x1d, 0xce, 0xf3, 0x3, 0xce,
+                                                        0xfb, 0x29, 0x15, 0xf7, 0x7e, 0xb6, 0x3b, 0x6,
+                                                        0x5a, 0x8a, 0xa0, 0xab, 0x1f, 0xf8, 0xfe, 0x7,
+                                                        0xc6, 0x96, 0x96, 0xc3, 0x1e, 0xca, 0xb6, 0xfb,
+                                                        0x7e, 0x6, 0xe, 0xfc, 0x5, 0xfb, 0xa, 0x76,
+                                                        0xf7, 0x21, 0x76, 0xf9, 0x5a, 0x77, 0x1, 0xf7,
+                                                        0x56, 0xfb, 0x1f, 0x15, 0xcf, 0x6, 0xfb, 0x4e,
+                                                        0xf9, 0xd2, 0x5, 0x44, 0x6, 0xe, 0x91, 0x1d,
+                                                        0xf7, 0x36, 0xf3, 0x3, 0xab, 0x21, 0x15, 0x60,
+                                                        0xf7, 0x7e, 0xf9, 0xcf, 0xfb, 0x7e, 0x60, 0xca,
+                                                        0x7, 0xc3, 0x96, 0x80, 0x50, 0x1f, 0xfc, 0xfe,
+                                                        0x7, 0x6a, 0x8b, 0x77, 0x59, 0x1e, 0xe, 0x49,
+                                                        0xf7, 0xe0, 0x76, 0xf8, 0x1, 0x77, 0x1, 0xd4,
+                                                        0xf7, 0xcb, 0x15, 0xe4, 0x6, 0xf7, 0x15, 0xf7,
+                                                        0xa0, 0xf7, 0x15, 0xfb, 0xa0, 0x5, 0xe4, 0x6,
+                                                        0xfb, 0x46, 0xf8, 0x1, 0x5, 0x3b, 0x6, 0xe,
+                                                        0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8,
+                                                        0x88, 0xbd, 0x7, 0xe, 0x90, 0xa, 0xf7, 0x52,
+                                                        0xf8, 0xa4, 0x26, 0xa, 0x7d, 0xd1, 0x5a, 0x50,
+                                                        0xa, 0x12, 0xa4, 0xf7, 0x26, 0xfb, 0x13, 0xf7,
+                                                        0x19, 0xf7, 0x8, 0xf7, 0x1e, 0x13, 0x66, 0xf7,
+                                                        0xba, 0xc3, 0x32, 0x1d, 0x13, 0x26, 0x31, 0xa,
+                                                        0x23, 0xb6, 0xfb, 0x3, 0xfb, 0x10, 0x5b, 0x3a,
+                                                        0x1d, 0x1e, 0xb2, 0x6d, 0x93, 0xa0, 0x1a, 0x13,
+                                                        0x5a, 0x9b, 0xac, 0x9f, 0xaf, 0xd5, 0x8f, 0x55,
+                                                        0x58, 0x1e, 0x53, 0x7, 0x44, 0x1d, 0x13, 0x8a,
+                                                        0x26, 0x1d, 0xe, 0x30, 0x7d, 0xab, 0x81, 0x76,
+                                                        0xf8, 0x44, 0xc1, 0xf7, 0x5f, 0x77, 0x12, 0xd3,
+                                                        0xf7, 0x1f, 0xf7, 0x37, 0xf7, 0x27, 0x13, 0x7c,
+                                                        0xd3, 0x7e, 0x15, 0x97, 0x6, 0xda, 0xc3, 0x5,
+                                                        0x13, 0xbc, 0x5e, 0xb9, 0xb2, 0x7f, 0xaa, 0x1b,
+                                                        0xf7, 0x39, 0xd8, 0xf7, 0x5, 0xf7, 0x13, 0xf7,
+                                                        0x17, 0x46, 0xf7, 0x8, 0xfb, 0xb, 0x46, 0x67,
+                                                        0x65, 0x79, 0x7a, 0x1f, 0xf7, 0x97, 0xfb, 0x56,
+                                                        0x69, 0x7, 0xaf, 0x84, 0x9e, 0x87, 0x5c, 0x1a,
+                                                        0x13, 0x7c, 0xf7, 0x1f, 0xfc, 0x7b, 0x15, 0xf7,
+                                                        0x9b, 0x7, 0xa1, 0x94, 0x9a, 0xb0, 0xb9, 0x1b,
+                                                        0xe2, 0x91, 0xfb, 0x1a, 0x50, 0x1f, 0x13, 0xbc,
+                                                        0xfb, 0x31, 0x68, 0x58, 0x4f, 0x54, 0x7e, 0xbe,
+                                                        0xa7, 0x1e, 0xe, 0xfb, 0x5f, 0x7d, 0xce, 0x86,
+                                                        0x1d, 0xf7, 0x12, 0xf7, 0x10, 0x13, 0xb8, 0xf8,
+                                                        0x30, 0xf7, 0x1, 0x15, 0x70, 0x73, 0x71, 0x6e,
+                                                        0x52, 0x1b, 0x3d, 0x4d, 0xb5, 0xf7, 0x20, 0x8c,
+                                                        0x1f, 0xf5, 0x8c, 0x91, 0xf0, 0xd9, 0x1b, 0x9a,
+                                                        0xa5, 0x82, 0x6d, 0x1f, 0x13, 0xd8, 0x8f, 0x1d,
+                                                        0x37, 0xb0, 0x44, 0x2d, 0xfb, 0x22, 0x62, 0xfb,
+                                                        0x59, 0xfb, 0x1f, 0xe1, 0xfb, 0x2, 0xf7, 0x14,
+                                                        0xda, 0xcd, 0xb3, 0xcc, 0xb9, 0x1e, 0xe, 0x30,
+                                                        0x7d, 0xc3, 0xf8, 0xb, 0xc3, 0xf7, 0x3d, 0xad,
+                                                        0x12, 0xa4, 0xf7, 0x28, 0xf7, 0x37, 0xf7, 0x1f,
+                                                        0x17, 0xf7, 0xe7, 0xbf, 0x15, 0x4a, 0x7, 0xc9,
+                                                        0x9c, 0x94, 0x8c, 0xf7, 0x10, 0x9a, 0x8, 0x13,
+                                                        0xf8, 0xac, 0x7, 0x52, 0x8d, 0x89, 0xa8, 0xa6,
+                                                        0x1a, 0xf8, 0xc9, 0xfb, 0x6b, 0x69, 0x7, 0xc2,
+                                                        0x87, 0xa0, 0x8a, 0x56, 0x1a, 0xfb, 0x41, 0x7,
+                                                        0xa5, 0x73, 0x69, 0xaf, 0x4f, 0x1b, 0x2d, 0x28,
+                                                        0x42, 0xfb, 0x42, 0xfb, 0x26, 0xe7, 0x2d, 0xde,
+                                                        0xd6, 0xa7, 0xa7, 0xb1, 0xaf, 0x1f, 0x13, 0xd8,
+                                                        0x88, 0xc7, 0x15, 0x80, 0x66, 0x50, 0x5d, 0x3b,
+                                                        0x8b, 0xf7, 0x12, 0xc5, 0xec, 0x99, 0xe9, 0xd2,
+                                                        0xc3, 0xa1, 0x4e, 0x8a, 0x1e, 0xe, 0x49, 0x1d,
+                                                        0x98, 0xa, 0x17, 0xf7, 0x38, 0xf7, 0xae, 0x15,
+                                                        0x13, 0xe0, 0xf7, 0x1e, 0xa9, 0xa1, 0xb0, 0xdb,
+                                                        0x7d, 0xfb, 0x6, 0x5d, 0x8c, 0x1e, 0xfb, 0x15,
+                                                        0x66, 0x15, 0xf7, 0x90, 0x6, 0x13, 0xf0, 0xc1,
+                                                        0x7b, 0xf7, 0x42, 0xfb, 0x42, 0x1e, 0x13, 0xd0,
+                                                        0x2b, 0x1d, 0xe, 0xfb, 0xce, 0x8b, 0xad, 0xf8,
+                                                        0x13, 0xb7, 0xcf, 0xf7, 0x36, 0x6c, 0xaa, 0x12,
+                                                        0xd2, 0xf7, 0x1f, 0x13, 0xd8, 0x99, 0x16, 0xf7,
+                                                        0xaa, 0xad, 0x6, 0x4a, 0x8d, 0x7a, 0x9a, 0xb6,
+                                                        0x1a, 0xf7, 0xd7, 0xe2, 0xb7, 0x34, 0xf7, 0xe,
+                                                        0x7, 0xa6, 0x86, 0xbd, 0xbb, 0x97, 0xa3, 0x88,
+                                                        0x7b, 0x1e, 0x7c, 0x75, 0x7b, 0x70, 0x1a, 0x13,
+                                                        0xe8, 0x77, 0x9c, 0x69, 0xb5, 0xb3, 0xa2, 0xa6,
+                                                        0xae, 0xd0, 0x40, 0xaa, 0x4e, 0xfb, 0x49, 0x8a,
+                                                        0xfb, 0x19, 0x2a, 0x1e, 0x52, 0x5f, 0xc4, 0xfb,
+                                                        0xd7, 0x6, 0x56, 0x74, 0x88, 0x69, 0x87, 0x1e,
+                                                        0xe, 0xfb, 0x62, 0xf7, 0x3a, 0xfb, 0x2d, 0xab,
+                                                        0xf7, 0x1, 0xf7, 0xb, 0xe2, 0xa7, 0xf7, 0x6c,
+                                                        0xc0, 0x82, 0xaa, 0x12, 0xa7, 0xe3, 0x3c, 0xf7,
+                                                        0x9, 0xfb, 0x9, 0xf7, 0x1d, 0xf7, 0x15, 0xf7,
+                                                        0x1b, 0x69, 0xda, 0x13, 0x7a, 0x20, 0xf7, 0xc,
+                                                        0x63, 0x15, 0x53, 0x86, 0x67, 0x71, 0x63, 0x1a,
+                                                        0x13, 0x79, 0x20, 0x53, 0xd5, 0x64, 0xf7, 0x10,
+                                                        0xf7, 0x11, 0xf7, 0x18, 0xa6, 0xf7, 0x10, 0xf7,
+                                                        0x3, 0xfb, 0x7, 0x95, 0x5a, 0x8c, 0x1e, 0x13,
+                                                        0x79, 0x40, 0xfb, 0x1f, 0x8d, 0x71, 0x8c, 0xad,
+                                                        0x1a, 0xa9, 0xb0, 0x9f, 0x9e, 0xec, 0x8b, 0x8b,
+                                                        0x94, 0xa8, 0x1e, 0xd3, 0xa2, 0xac, 0xc9, 0xc8,
+                                                        0x1a, 0xc7, 0x6d, 0x9e, 0x81, 0x95, 0x1e, 0x13,
+                                                        0x7a, 0x20, 0xdd, 0xc0, 0xfb, 0x17, 0x6, 0x13,
+                                                        0x94, 0xc0, 0x9b, 0x63, 0x67, 0x91, 0x67, 0x1b,
+                                                        0xfb, 0x1d, 0x49, 0x37, 0x3b, 0x43, 0xbb, 0x5a,
+                                                        0xd5, 0x70, 0x1f, 0x89, 0x7, 0x60, 0x7f, 0x41,
+                                                        0x64, 0x4c, 0x1a, 0x57, 0xac, 0x7c, 0xb8, 0x7b,
+                                                        0x1e, 0x13, 0x7a, 0x20, 0xaa, 0x7d, 0x15, 0xf7,
+                                                        0x41, 0x6, 0xbf, 0xa7, 0x7c, 0x67, 0x44, 0xfb,
+                                                        0x1e, 0x8b, 0x63, 0x7a, 0x2e, 0x8a, 0xcb, 0xa1,
+                                                        0x94, 0x9b, 0xa5, 0xa0, 0x1f, 0x13, 0x74, 0xc0,
+                                                        0xa2, 0xf7, 0xfd, 0x15, 0xca, 0x90, 0xd1, 0xc8,
+                                                        0xcd, 0x8b, 0x33, 0x5e, 0x52, 0x88, 0x45, 0x4c,
+                                                        0x50, 0x84, 0xc5, 0xd0, 0x1e, 0xe, 0x30, 0x82,
+                                                        0x1d, 0xf7, 0x5f, 0x77, 0x1, 0xbb, 0xf7, 0x1f,
+                                                        0xf7, 0x2c, 0x8a, 0xa, 0x9b, 0x41, 0xa, 0x8b,
+                                                        0xb3, 0x9c, 0x1f, 0x76, 0xa, 0x57, 0x60, 0x75,
+                                                        0x53, 0x5b, 0x1e, 0xf7, 0xad, 0xfb, 0x54, 0x69,
+                                                        0x7, 0xb2, 0x83, 0x99, 0x88, 0x5c, 0x1a, 0xfc,
+                                                        0x81, 0x7, 0x5a, 0x7a, 0x8a, 0x67, 0x8b, 0xa,
+                                                        0x5d, 0xa, 0x12, 0xb5, 0xf7, 0x2f, 0xfb, 0x1d,
+                                                        0xf7, 0x2f, 0xfb, 0x26, 0x84, 0x1d, 0x13, 0xc8,
+                                                        0x2d, 0xa, 0x13, 0xd0, 0xb7, 0xf8, 0xd7, 0x15,
+                                                        0x60, 0xab, 0x69, 0xb9, 0xb6, 0xad, 0xac, 0xb7,
+                                                        0xb6, 0x69, 0xae, 0x60, 0x5e, 0x6a, 0x67, 0x61,
+                                                        0x1e, 0xe, 0xfb, 0xce, 0xfb, 0x5f, 0xf7, 0x35,
+                                                        0xf8, 0xd6, 0xf7, 0x2f, 0x12, 0xea, 0xf7, 0x2c,
+                                                        0xfb, 0x27, 0xf7, 0x1f, 0x13, 0xd0, 0xc5, 0xf8,
+                                                        0x3f, 0x15, 0xae, 0x88, 0xa7, 0x8a, 0x54, 0x7e,
+                                                        0xa, 0x61, 0x83, 0x69, 0x63, 0x88, 0x6e, 0x8c,
+                                                        0x9b, 0x93, 0x92, 0x95, 0x91, 0x96, 0x1e, 0x90,
+                                                        0x94, 0x90, 0x95, 0x96, 0x1a, 0xa0, 0x79, 0xac,
+                                                        0x62, 0x61, 0x77, 0x6c, 0x6f, 0x41, 0xd6, 0x6f,
+                                                        0xc2, 0xf7, 0x4b, 0x8f, 0xf7, 0x28, 0xc4, 0x1e,
+                                                        0xf8, 0x5f, 0xfb, 0x5e, 0x7, 0x13, 0xe0, 0xbd,
+                                                        0xf7, 0x2c, 0x15, 0x60, 0xaa, 0x69, 0xb9, 0xb6,
+                                                        0xae, 0xac, 0xb7, 0xb6, 0x68, 0xae, 0x60, 0x5e,
+                                                        0x6b, 0x67, 0x61, 0x1e, 0xe, 0x30, 0x8b, 0xad,
+                                                        0xf8, 0x3f, 0x77, 0xf7, 0x7f, 0x77, 0x1, 0xd1,
+                                                        0x8a, 0xa, 0xa1, 0x16, 0x99, 0xa, 0x5b, 0x92,
+                                                        0x87, 0x94, 0xb7, 0x1a, 0xf3, 0x7, 0xa2, 0xa3,
+                                                        0x5, 0xf5, 0xfb, 0x1e, 0x98, 0x77, 0x80, 0x1a,
+                                                        0x7b, 0x6f, 0x88, 0x7d, 0x1e, 0x69, 0xf7, 0x7e,
+                                                        0xad, 0x7, 0x83, 0x84, 0x8c, 0x99, 0x81, 0x1f,
+                                                        0xfb, 0x56, 0xf7, 0x96, 0xa5, 0xaa, 0xc1, 0xb1,
+                                                        0xa1, 0x9d, 0x19, 0xa7, 0xa2, 0x9e, 0x8f, 0xb3,
+                                                        0x92, 0x8, 0xac, 0xfb, 0x6a, 0x6a, 0x7, 0xbb,
+                                                        0x84, 0x96, 0x89, 0x77, 0x1a, 0xfb, 0x29, 0xfb,
+                                                        0x2e, 0x5, 0xf8, 0x43, 0xfb, 0x4f, 0x69, 0x7,
+                                                        0xbb, 0x8b, 0x5c, 0x80, 0x1f, 0xfc, 0x7e, 0x7,
+                                                        0x73, 0x83, 0x67, 0x63, 0x1e, 0xe, 0xfc, 0x5,
+                                                        0x8b, 0xad, 0xf9, 0x16, 0x77, 0x12, 0xc1, 0xf7,
+                                                        0x1f, 0xfb, 0x12, 0x84, 0x1d, 0x13, 0xd0, 0x64,
+                                                        0x81, 0xaa, 0xa8, 0x1f, 0xf8, 0xda, 0x8d, 0xa,
+                                                        0xfc, 0x7e, 0x97, 0x1d, 0xf7, 0x4e, 0x82, 0x1d,
+                                                        0x4c, 0x76, 0xd3, 0x77, 0x12, 0xd2, 0xf7, 0x1f,
+                                                        0xf7, 0x1e, 0x53, 0xa, 0x14, 0xe, 0x13, 0xce,
+                                                        0x9b, 0x16, 0xf7, 0x84, 0xad, 0x6, 0x64, 0x8f,
+                                                        0x84, 0xa1, 0xaa, 0x1a, 0xf7, 0x95, 0x7, 0x93,
+                                                        0xb3, 0xbd, 0xb6, 0xc2, 0x8b, 0x58, 0x6b, 0x1e,
+                                                        0xfb, 0x7c, 0x7, 0x74, 0x8b, 0x6c, 0x5b, 0x88,
+                                                        0x1e, 0x69, 0xf7, 0x7e, 0xad, 0x7, 0x65, 0x8e,
+                                                        0x82, 0xa1, 0xab, 0x1a, 0xf7, 0x95, 0x7, 0x93,
+                                                        0xb5, 0xbd, 0xb5, 0xc1, 0x8b, 0x57, 0x6c, 0x1e,
+                                                        0xfb, 0x7c, 0x7, 0x73, 0x8b, 0x6c, 0x5a, 0x89,
+                                                        0x1e, 0x69, 0xf7, 0x82, 0xad, 0x7, 0x59, 0x8c,
+                                                        0x8b, 0xaa, 0xa4, 0x1a, 0xf7, 0x85, 0x7, 0xf7,
+                                                        0x2, 0x3c, 0xaa, 0x54, 0x51, 0x5e, 0x6f, 0x50,
+                                                        0x5e, 0x1e, 0xab, 0x7c, 0x72, 0xc2, 0x30, 0x1b,
+                                                        0x13, 0xbe, 0x37, 0x5f, 0x4f, 0x73, 0x7d, 0x1f,
+                                                        0x88, 0x1d, 0xa8, 0x87, 0xa5, 0x88, 0x57, 0x1a,
+                                                        0xfb, 0xa6, 0x7, 0x5a, 0x75, 0x86, 0x6a, 0x8b,
+                                                        0x1d, 0x30, 0x82, 0x1d, 0x4c, 0x76, 0xd3, 0x77,
+                                                        0x12, 0xcd, 0xf7, 0x1f, 0xfb, 0x17, 0x85, 0x1d,
+                                                        0x13, 0xca, 0xa0, 0x16, 0xf7, 0x85, 0xad, 0x6,
+                                                        0x13, 0xc6, 0x59, 0x1d, 0x1e, 0x13, 0xc9, 0xc1,
+                                                        0x8c, 0x54, 0x6f, 0x1f, 0x4f, 0xa, 0x8d, 0x8b,
+                                                        0xaa, 0xa3, 0x1a, 0x76, 0xa, 0x1e, 0x13, 0xba,
+                                                        0x36, 0x60, 0x4f, 0x73, 0x7d, 0x1f, 0x88, 0x1d,
+                                                        0x13, 0xc6, 0xb3, 0x85, 0x98, 0x83, 0x5e, 0x1a,
+                                                        0xfb, 0xa6, 0x7, 0x5a, 0x7a, 0x87, 0x67, 0x8b,
+                                                        0xa, 0x65, 0xa, 0x12, 0xa4, 0xf7, 0x27, 0xf7,
+                                                        0x25, 0xf7, 0x27, 0xfb, 0x1b, 0xf7, 0x27, 0x13,
+                                                        0xf0, 0xf7, 0x40, 0xf7, 0x7c, 0x78, 0x1d, 0xeb,
+                                                        0xd5, 0x1e, 0x13, 0xe8, 0xc8, 0x9c, 0x4d, 0x64,
+                                                        0xa, 0x39, 0x46, 0x3b, 0x8b, 0xf6, 0xf7, 0x0,
+                                                        0x1f, 0xfb, 0x27, 0x16, 0xfb, 0x16, 0xe2, 0xfb,
+                                                        0x8, 0x70, 0xa, 0xf6, 0x6f, 0xa, 0xf7, 0x0,
+                                                        0x70, 0x1d, 0xfb, 0x4, 0xfb, 0x15, 0x1e, 0xe,
+                                                        0x7c, 0xa, 0x7f, 0x77, 0x12, 0xd6, 0xf7, 0x1f,
+                                                        0xf7, 0xc, 0xf7, 0x28, 0x21, 0xf7, 0x28, 0x13,
+                                                        0xf6, 0x81, 0xa, 0x1e, 0x13, 0xf5, 0x90, 0x1d,
+                                                        0x54, 0x75, 0xc8, 0x8b, 0x1f, 0x7a, 0x1d, 0x89,
+                                                        0xc8, 0x58, 0xa, 0x7a, 0x1f, 0x89, 0x6, 0x13,
+                                                        0xee, 0xcd, 0xfb, 0x55, 0x69, 0x7, 0xb9, 0x85,
+                                                        0x95, 0x7c, 0x65, 0x1a, 0xfc, 0x75, 0x92, 0xa,
+                                                        0x30, 0xfb, 0x4c, 0x76, 0xf7, 0x53, 0xc1, 0xf8,
+                                                        0x25, 0xab, 0x1, 0xad, 0xf7, 0x26, 0xf7, 0x36,
+                                                        0x8a, 0xa, 0xf7, 0xea, 0xed, 0x15, 0x8d, 0x7a,
+                                                        0x51, 0x56, 0x1b, 0x49, 0x6f, 0xc7, 0xf7, 0x16,
+                                                        0xde, 0x91, 0xf7, 0x14, 0xde, 0xb9, 0xa6, 0x63,
+                                                        0x63, 0x1f, 0x42, 0xfc, 0xa7, 0x15, 0x68, 0xf7,
+                                                        0x9f, 0xad, 0x7, 0x67, 0x92, 0x78, 0x8e, 0xbb,
+                                                        0x1a, 0xf8, 0xde, 0x7c, 0x7, 0x3d, 0x52, 0x5,
+                                                        0xab, 0x67, 0x6c, 0xa4, 0x57, 0x1b, 0xfb, 0x2a,
+                                                        0x36, 0xfb, 0x11, 0xfb, 0xa, 0xfb, 0x3f, 0xe4,
+                                                        0x42, 0xef, 0xa8, 0xbc, 0x96, 0xb8, 0xb4, 0x1f,
+                                                        0xfb, 0x2f, 0x7, 0x5e, 0x79, 0x89, 0x54, 0x81,
+                                                        0x1e, 0xe, 0xfb, 0x5f, 0x8b, 0xad, 0xf7, 0xba,
+                                                        0xf7, 0x25, 0x45, 0x76, 0xa5, 0x76, 0xd5, 0x77,
+                                                        0x12, 0xde, 0xf7, 0x1f, 0x13, 0x9c, 0xa8, 0x16,
+                                                        0xf7, 0x9e, 0xad, 0x6, 0x4e, 0x8e, 0x7f, 0x92,
+                                                        0xbd, 0x1a, 0xf7, 0x5a, 0x7, 0xd4, 0xb7, 0xa1,
+                                                        0x9a, 0x9c, 0x93, 0x79, 0x7b, 0x98, 0x1e, 0x13,
+                                                        0xc4, 0x7e, 0x96, 0x99, 0x7f, 0xa5, 0x1b, 0xbd,
+                                                        0x99, 0xb4, 0xa5, 0xa3, 0x7c, 0xc1, 0x47, 0x1f,
+                                                        0x13, 0xac, 0x4a, 0x5e, 0x4f, 0x6c, 0x76, 0x1f,
+                                                        0x89, 0xda, 0xfb, 0x51, 0x73, 0x6, 0xa9, 0x87,
+                                                        0xa3, 0x86, 0x59, 0x1a, 0xfb, 0xb0, 0x7, 0x59,
+                                                        0x75, 0x87, 0x6b, 0x8b, 0x1d, 0xfb, 0x96, 0x7d,
+                                                        0xad, 0x7f, 0x76, 0xf7, 0xfc, 0x76, 0xf7, 0x6,
+                                                        0xac, 0x89, 0x77, 0x12, 0xa4, 0xef, 0xf7, 0x20,
+                                                        0xeb, 0x13, 0x76, 0xa4, 0x7e, 0x15, 0xae, 0x6,
+                                                        0x9f, 0x95, 0x91, 0x93, 0x96, 0x1b, 0x8d, 0x90,
+                                                        0x89, 0x88, 0x91, 0x1f, 0x13, 0xb6, 0x83, 0x9e,
+                                                        0xae, 0x7b, 0xb0, 0x1b, 0xe8, 0xd8, 0xc6, 0xea,
+                                                        0xdb, 0x52, 0xaf, 0x52, 0xa6, 0x1f, 0x4f, 0xa8,
+                                                        0x4d, 0x9e, 0xbf, 0x1a, 0xaa, 0xa4, 0xa5, 0xaf,
+                                                        0xc4, 0xb4, 0x60, 0x44, 0xa0, 0x1e, 0xae, 0x6,
+                                                        0x13, 0xae, 0xf7, 0x25, 0x6b, 0x7, 0x83, 0x88,
+                                                        0x87, 0x7f, 0x79, 0x1b, 0x83, 0x80, 0x8f, 0x90,
+                                                        0x7e, 0x1f, 0x13, 0xb6, 0x91, 0x7a, 0x75, 0x92,
+                                                        0x71, 0x1b, 0x2f, 0x46, 0x50, 0x33, 0x41, 0xc3,
+                                                        0x66, 0xc5, 0x6e, 0x1f, 0xc9, 0x6c, 0xcb, 0x76,
+                                                        0x5b, 0x1a, 0x6d, 0x73, 0x67, 0x59, 0xfb, 0x3,
+                                                        0x80, 0xf4, 0xa6, 0x85, 0x1e, 0x65, 0x6, 0xe,
+                                                        0xfb, 0xce, 0x7f, 0xd2, 0xf7, 0xfa, 0xb7, 0xf7,
+                                                        0x3d, 0x77, 0x12, 0xc0, 0xf7, 0x1f, 0xfb, 0xc,
+                                                        0xf7, 0x1f, 0x13, 0xf0, 0xf7, 0xc7, 0xf7, 0x3,
+                                                        0x15, 0x76, 0x80, 0x7a, 0x6c, 0x6e, 0x1b, 0x13,
+                                                        0xe8, 0x63, 0x8c, 0xa7, 0x9b, 0x1f, 0xf7, 0xce,
+                                                        0xe9, 0xb7, 0x2d, 0xf7, 0x3d, 0x72, 0x7, 0x47,
+                                                        0x2a, 0x5e, 0x5f, 0x56, 0x5e, 0x8, 0x70, 0xbf,
+                                                        0xfb, 0xce, 0x7, 0x76, 0x8c, 0x8f, 0x2d, 0xf7,
+                                                        0x0, 0x1b, 0xe5, 0xaf, 0xd0, 0xb6, 0xa0, 0x1f,
+                                                        0xe, 0x30, 0x7d, 0xcc, 0xf8, 0x2e, 0x77, 0x12,
+                                                        0xcc, 0x85, 0x1d, 0x13, 0xf0, 0x71, 0xa, 0x13,
+                                                        0xe8, 0x25, 0x1d, 0xe, 0x92, 0x76, 0xf8, 0x4d,
+                                                        0xad, 0x1, 0xa0, 0xf8, 0x64, 0x3, 0xf7, 0x85,
+                                                        0x7d, 0x15, 0xa5, 0x6, 0xf7, 0x34, 0xf8, 0x16,
+                                                        0x9f, 0xbd, 0x99, 0x8d, 0xa3, 0x8e, 0x19, 0x4d,
+                                                        0x1d, 0x38, 0xfb, 0x6d, 0x5, 0x33, 0xf7, 0x6c,
+                                                        0x8b, 0x8e, 0x8f, 0x1a, 0xa2, 0x9f, 0x8c, 0xac,
+                                                        0x8e, 0x48, 0x1d, 0xe, 0xd6, 0x92, 0x76, 0xf7,
+                                                        0xd8, 0x76, 0xf7, 0x40, 0x77, 0x1, 0xf8, 0xd0,
+                                                        0xf7, 0x1b, 0x3, 0xf7, 0x78, 0x7d, 0x15, 0xa3,
+                                                        0x6, 0xf7, 0xe, 0xf7, 0xc3, 0x5, 0x90, 0x6,
+                                                        0xef, 0xfb, 0xc3, 0x5, 0xa2, 0x6, 0xf7, 0x2f,
+                                                        0xf8, 0x1b, 0x9c, 0xb7, 0x99, 0x8d, 0x9e, 0x8f,
+                                                        0x19, 0xad, 0xfb, 0x1b, 0x69, 0x7, 0xa7, 0x88,
+                                                        0x9f, 0x89, 0x6b, 0x1a, 0x75, 0x58, 0xfb, 0x1,
+                                                        0x70, 0x3f, 0x1e, 0x89, 0x6, 0x79, 0xd9, 0x61,
+                                                        0xf7, 0xc, 0xa0, 0x1a, 0xa0, 0xa1, 0x8d, 0xa5,
+                                                        0x8d, 0x1e, 0xad, 0xfb, 0x7e, 0x69, 0x7, 0xa3,
+                                                        0x88, 0x96, 0x8b, 0x94, 0x76, 0x90, 0x7f, 0x91,
+                                                        0x81, 0x95, 0x69, 0x47, 0xfb, 0x3f, 0x18, 0x59,
+                                                        0xf7, 0x1a, 0x69, 0xcd, 0xa0, 0x1a, 0xa5, 0xa3,
+                                                        0x8d, 0x99, 0x8d, 0x1e, 0xad, 0xfb, 0x72, 0x69,
+                                                        0x7, 0xa5, 0x86, 0x90, 0x8e, 0xa5, 0x4a, 0x8,
+                                                        0xe, 0xa0, 0x76, 0xf8, 0x3f, 0xad, 0x1, 0x99,
+                                                        0xf8, 0x6a, 0x3, 0x99, 0x16, 0xf7, 0x3d, 0xad,
+                                                        0x6, 0x7a, 0x8c, 0x5b, 0x90, 0x9a, 0x9f, 0x8,
+                                                        0x9a, 0xa0, 0xcc, 0xe5, 0x8b, 0x1a, 0x8b, 0xc1,
+                                                        0x36, 0xa0, 0x6c, 0x1e, 0x94, 0x7e, 0x6b, 0x84,
+                                                        0x75, 0x8a, 0x8, 0x69, 0xf7, 0x85, 0xad, 0x7,
+                                                        0x7e, 0x8f, 0x83, 0x8e, 0x82, 0x98, 0xfb, 0x28,
+                                                        0xf7, 0x6e, 0x18, 0xf0, 0xf7, 0x8, 0x9d, 0xa2,
+                                                        0xa3, 0x97, 0xa7, 0x8f, 0x19, 0xad, 0xfb, 0x3c,
+                                                        0x69, 0x7, 0xb2, 0x88, 0x97, 0x8a, 0x76, 0x1a,
+                                                        0x7d, 0x8b, 0x95, 0x41, 0x2c, 0x1e, 0x7c, 0x9e,
+                                                        0x53, 0xcf, 0x9c, 0x1a, 0x9b, 0xa2, 0x8f, 0xa3,
+                                                        0x1e, 0xad, 0xfb, 0x8e, 0x69, 0x7, 0xa6, 0x87,
+                                                        0x93, 0x82, 0x9c, 0x71, 0xf7, 0x14, 0xfb, 0x4f,
+                                                        0x18, 0xfb, 0x17, 0xfb, 0x3f, 0x88, 0x94, 0x5f,
+                                                        0x86, 0x8, 0xe, 0xfb, 0x61, 0xf7, 0x23, 0xf8,
+                                                        0x9f, 0x77, 0x1, 0xf7, 0x80, 0x7e, 0x15, 0x79,
+                                                        0x56, 0x5, 0x75, 0x84, 0x2b, 0xa, 0xe, 0x87,
+                                                        0x1d, 0x1, 0xb1, 0xaf, 0x87, 0xa, 0x65, 0x8e,
+                                                        0x1d, 0x6b, 0x8b, 0x62, 0x8c, 0xf7, 0x7f, 0xf8,
+                                                        0x27, 0x18, 0xa5, 0xfc, 0xb, 0x7, 0x84, 0xfb,
+                                                        0x22, 0x5, 0xaf, 0x6, 0xa5, 0xf7, 0x1, 0xb0,
+                                                        0x8b, 0xf7, 0xa, 0x8c, 0xfb, 0x7e, 0xfc, 0x28,
+                                                        0x18, 0xe, 0x8d, 0x1d, 0xf7, 0x15, 0xf4, 0x3,
+                                                        0xa1, 0xf7, 0x99, 0x15, 0xe2, 0x78, 0x9f, 0x5e,
+                                                        0x49, 0x1a, 0xfb, 0x3f, 0x7, 0xfb, 0xd, 0xd9,
+                                                        0x7d, 0xf7, 0x19, 0x1e, 0x97, 0x7, 0x3a, 0x99,
+                                                        0x72, 0xb3, 0xd0, 0x1a, 0xf7, 0x3f, 0x7, 0xd2,
+                                                        0x7a, 0xb3, 0x2a, 0x9d, 0x1e, 0x8d, 0x7, 0xec,
+                                                        0x9d, 0x9c, 0xa5, 0xd2, 0x1a, 0xf7, 0x47, 0x7,
+                                                        0xd1, 0xa4, 0xb8, 0xdc, 0x9a, 0x1e, 0x97, 0x7,
+                                                        0xfb, 0x19, 0x3d, 0x77, 0xfb, 0xe, 0x1f, 0xfb,
+                                                        0x47, 0x7, 0x49, 0x77, 0x6c, 0x34, 0x78, 0x1e,
+                                                        0xe, 0xfc, 0x3f, 0xfb, 0x29, 0x76, 0xf7, 0x40,
+                                                        0x76, 0xf9, 0x5a, 0x77, 0x1, 0xcd, 0xe3, 0x3e,
+                                                        0xd0, 0x3, 0xd8, 0xfb, 0x3e, 0x15, 0xd0, 0xf9,
+                                                        0xf1, 0x46, 0x6, 0xe, 0x8d, 0x1d, 0xf7, 0x34,
+                                                        0xf4, 0x3, 0xc1, 0xfb, 0x37, 0x15, 0x7f, 0x7,
+                                                        0xf7, 0x19, 0xd9, 0x99, 0xf7, 0xe, 0x1f, 0xf7,
+                                                        0x3f, 0x7, 0xcd, 0x9f, 0xb8, 0xe2, 0x9e, 0x1e,
+                                                        0x34, 0x9e, 0x77, 0xaa, 0xcd, 0x1a, 0xf7, 0x47,
+                                                        0x7, 0xf7, 0xd, 0x3d, 0x9f, 0xfb, 0x19, 0x1e,
+                                                        0x7f, 0x7, 0xdc, 0x7d, 0xa4, 0x5d, 0x46, 0x1a,
+                                                        0xfb, 0x47, 0x7, 0x44, 0x9c, 0x71, 0xec, 0x79,
+                                                        0x1e, 0x89, 0x7, 0x2a, 0x79, 0x7a, 0x63, 0x44,
+                                                        0x1a, 0xfb, 0x3f, 0x7, 0x45, 0x72, 0x64, 0x3a,
+                                                        0x7c, 0x1e, 0xe, 0xfb, 0x13, 0xf7, 0x41, 0xf7,
+                                                        0x34, 0x1, 0xa8, 0xf8, 0x62, 0x3, 0xcc, 0xf7,
+                                                        0x41, 0x15, 0xae, 0x9b, 0xa3, 0xb0, 0xb7, 0x1b,
+                                                        0xb1, 0xaa, 0x7e, 0x7c, 0xa8, 0x1f, 0x78, 0xb1,
+                                                        0xae, 0x76, 0xb9, 0x1b, 0xc9, 0xac, 0xb7, 0xb5,
+                                                        0xa9, 0x1f, 0x67, 0xd1, 0x5, 0x68, 0x74, 0x72,
+                                                        0x66, 0x63, 0x1b, 0x6e, 0x68, 0x9b, 0x9b, 0x66,
+                                                        0x1f, 0x9d, 0x64, 0x63, 0x9d, 0x6a, 0x1b, 0x48,
+                                                        0x67, 0x5f, 0x61, 0x75, 0x1f, 0xe, 0xfb, 0xce,
+                                                        0xfb, 0x4a, 0x76, 0xf8, 0xab, 0xf7, 0x3d, 0x12,
+                                                        0xdd, 0xf7, 0x3d, 0x29, 0xa8, 0x13, 0xe0, 0xdd,
+                                                        0xf8, 0x35, 0x15, 0x5d, 0xb1, 0x64, 0xba, 0xbb,
+                                                        0xaf, 0xb3, 0xb8, 0xba, 0x67, 0xb0, 0x5b, 0x5c,
+                                                        0x65, 0x67, 0x5b, 0x1e, 0x13, 0xd0, 0xd2, 0xfb,
+                                                        0x37, 0x15, 0x84, 0x44, 0x83, 0x57, 0x82, 0x62,
+                                                        0x8, 0x75, 0x20, 0x73, 0x71, 0x4e, 0x1a, 0x4b,
+                                                        0xac, 0x68, 0xbe, 0xbf, 0xac, 0xae, 0xcb, 0xc8,
+                                                        0x73, 0xa4, 0x75, 0xf5, 0x1e, 0x82, 0xb4, 0x83,
+                                                        0xc0, 0x84, 0xd3, 0x8, 0xe, 0xfb, 0xb, 0x76,
+                                                        0xf7, 0x27, 0x76, 0xf7, 0xe3, 0x76, 0xf7, 0x22,
+                                                        0xaa, 0xf7, 0x7, 0x77, 0x1, 0xc0, 0xf7, 0x21,
+                                                        0xf7, 0x13, 0xf7, 0xf, 0x3, 0xf7, 0x75, 0xf7,
+                                                        0x14, 0x15, 0x77, 0xb1, 0x80, 0xbe, 0xc4, 0x1a,
+                                                        0xab, 0x90, 0xf7, 0x1c, 0xdb, 0x9c, 0xa4, 0x7f,
+                                                        0x6d, 0x1e, 0x88, 0x7, 0xfb, 0x53, 0xfc, 0xad,
+                                                        0x15, 0xb3, 0x6, 0xba, 0xf7, 0x19, 0x5, 0x86,
+                                                        0x9b, 0x9c, 0x89, 0x9d, 0x1b, 0xac, 0xe2, 0x8b,
+                                                        0xee, 0xd1, 0x1f, 0x79, 0x9d, 0x5, 0x74, 0x78,
+                                                        0x6f, 0x70, 0x4f, 0x1b, 0x6b, 0x70, 0x98, 0xa3,
+                                                        0x75, 0x1f, 0xdd, 0xf7, 0x7a, 0x5, 0x7d, 0x96,
+                                                        0x9c, 0x85, 0x9b, 0x1b, 0x8f, 0xc9, 0x8b, 0xcb,
+                                                        0xb4, 0x70, 0xa8, 0x67, 0x9d, 0x1f, 0xbb, 0xf7,
+                                                        0x1c, 0x5, 0x63, 0x6, 0x5f, 0xfb, 0xf, 0x5,
+                                                        0x90, 0x78, 0x77, 0x8e, 0x78, 0x1b, 0xfb, 0x2,
+                                                        0xfb, 0x10, 0x39, 0xfb, 0x3b, 0xfb, 0x7, 0xc3,
+                                                        0x42, 0xd3, 0x6c, 0x1f, 0xe, 0x7d, 0xaa, 0x6c,
+                                                        0xf7, 0x12, 0x23, 0x76, 0xf7, 0x17, 0xb9, 0xf7,
+                                                        0x24, 0xcc, 0xf7, 0x12, 0xf7, 0x4d, 0x6d, 0xa9,
+                                                        0x12, 0xa0, 0xab, 0xbf, 0xf7, 0x12, 0x13, 0x5b,
+                                                        0x80, 0xf7, 0x71, 0xbc, 0x15, 0x54, 0xc6, 0xad,
+                                                        0x83, 0xaa, 0x1b, 0xf7, 0x7, 0x96, 0xf7, 0xf,
+                                                        0xd5, 0x91, 0x1f, 0x74, 0x6, 0x60, 0x80, 0x7b,
+                                                        0x6f, 0x3f, 0x1b, 0x7f, 0x6c, 0x8d, 0x9f, 0x58,
+                                                        0x1f, 0xa2, 0xc6, 0x8a, 0xc5, 0x87, 0xc4, 0x8,
+                                                        0xf7, 0x1, 0xcc, 0xfb, 0x6, 0x6, 0x87, 0x9a,
+                                                        0x68, 0xf7, 0x3f, 0xa3, 0x1a, 0xac, 0x96, 0xb1,
+                                                        0xb8, 0xb7, 0x8b, 0x69, 0x7f, 0x1e, 0x13, 0x3d,
+                                                        0x80, 0x37, 0x89, 0xa4, 0x72, 0xad, 0x1b, 0xbf,
+                                                        0x9e, 0xad, 0xb1, 0x97, 0x8b, 0xf0, 0xfb, 0x2e,
+                                                        0xfb, 0x2d, 0x5c, 0xfb, 0xa, 0x3c, 0x65, 0x92,
+                                                        0x65, 0x92, 0x65, 0x1f, 0x3b, 0x4a, 0x6, 0x13,
+                                                        0x39, 0x0, 0xed, 0x6, 0x9b, 0x5d, 0xa3, 0x51,
+                                                        0x8c, 0x5c, 0x8, 0x8f, 0x7c, 0x80, 0x8e, 0x71,
+                                                        0x1b, 0x26, 0x87, 0x46, 0x70, 0x43, 0xcc, 0x82,
+                                                        0x9d, 0xd2, 0xa9, 0xb4, 0xa0, 0x9b, 0x1f, 0x63,
+                                                        0xb0, 0x15, 0x13, 0x9d, 0x80, 0x71, 0x84, 0x7e,
+                                                        0x60, 0x55, 0x1b, 0x7a, 0x66, 0x94, 0xb3, 0x99,
+                                                        0x93, 0xb1, 0xb8, 0xb2, 0x9e, 0x7a, 0x7c, 0x9c,
+                                                        0x1f, 0xe, 0xf7, 0x38, 0xd4, 0xf7, 0x5b, 0xd6,
+                                                        0x1, 0xd8, 0xe3, 0xf7, 0x31, 0xe3, 0x3, 0xf7,
+                                                        0x1c, 0xf7, 0xe6, 0x15, 0xca, 0xbb, 0xbf, 0xcc,
+                                                        0xce, 0xbb, 0x57, 0x4c, 0x4a, 0x5b, 0x52, 0x48,
+                                                        0x4a, 0x5b, 0xc4, 0xcc, 0x1e, 0x39, 0xfb, 0x8d,
+                                                        0x15, 0xe1, 0xe3, 0x5, 0x78, 0xa7, 0xb3, 0x7c,
+                                                        0xb4, 0x1b, 0xb6, 0xb3, 0x9a, 0x9e, 0xa7, 0x1f,
+                                                        0xe1, 0x33, 0xbf, 0xbf, 0x33, 0xe3, 0x5, 0xa0,
+                                                        0xa5, 0x97, 0xb3, 0xb6, 0x1a, 0xb6, 0x7d, 0xb1,
+                                                        0x78, 0xa7, 0x1e, 0xe3, 0xe3, 0x57, 0xbd, 0x35,
+                                                        0x35, 0x5, 0x9e, 0x6f, 0x65, 0x95, 0x5e, 0x1b,
+                                                        0x62, 0x63, 0x81, 0x78, 0x6f, 0x1f, 0x35, 0xe1,
+                                                        0x57, 0x59, 0xe3, 0x33, 0x5, 0x78, 0x71, 0x7c,
+                                                        0x63, 0x60, 0x1a, 0x60, 0x98, 0x65, 0xa0, 0x6f,
+                                                        0x1e, 0x33, 0x33, 0x5, 0xe, 0x8b, 0xae, 0xf7,
+                                                        0xb, 0xbd, 0xe8, 0xbd, 0xf7, 0xb9, 0xaf, 0x1,
+                                                        0xf7, 0x4d, 0xf7, 0x16, 0xe0, 0xf7, 0x13, 0x3,
+                                                        0xde, 0x16, 0xf7, 0xdf, 0xae, 0x6, 0x4b, 0x91,
+                                                        0x68, 0x8d, 0xdd, 0x1a, 0xb2, 0xf7, 0x1b, 0xbd,
+                                                        0xfb, 0x1b, 0xce, 0x7, 0x8f, 0x96, 0x5, 0xf7,
+                                                        0x17, 0xbd, 0xfb, 0x3, 0x6, 0xf7, 0x10, 0xf7,
+                                                        0x99, 0x9c, 0xac, 0xaa, 0x8d, 0x9b, 0x8d, 0x19,
+                                                        0xaf, 0xfb, 0x61, 0x67, 0x7, 0xb5, 0x89, 0xaf,
+                                                        0x8a, 0x64, 0x1a, 0x21, 0xfb, 0x92, 0x5, 0x89,
+                                                        0x6, 0x55, 0xf7, 0x2, 0x51, 0xf7, 0x14, 0xa5,
+                                                        0x1a, 0xa3, 0x9d, 0x93, 0xc6, 0x1e, 0xaf, 0xfb,
+                                                        0xc1, 0x67, 0x7, 0xb8, 0x89, 0xa3, 0x74, 0x99,
+                                                        0x6f, 0xf7, 0x2, 0xfb, 0x89, 0x18, 0x28, 0x59,
+                                                        0xf7, 0x10, 0x6, 0x96, 0x76, 0x5, 0x52, 0xfb,
+                                                        0x1b, 0x59, 0xf7, 0x1b, 0x64, 0x7, 0x39, 0x66,
+                                                        0x89, 0x4a, 0x8b, 0x1d, 0xfc, 0x3f, 0x8d, 0x76,
+                                                        0xf8, 0x5d, 0x76, 0xf7, 0xa6, 0x77, 0x1, 0xcd,
+                                                        0xe3, 0x3e, 0xce, 0x3, 0xd8, 0xf8, 0x35, 0x15,
+                                                        0xcd, 0xf7, 0xa6, 0x49, 0x6, 0xfd, 0x5a, 0x4,
+                                                        0xce, 0xf7, 0xae, 0x48, 0x6, 0xe, 0xfb, 0xf,
+                                                        0xa2, 0xf7, 0x93, 0xa4, 0xf7, 0x2d, 0x77, 0xea,
+                                                        0xa2, 0xf7, 0x6a, 0x77, 0x12, 0xb3, 0xd6, 0x56,
+                                                        0xd6, 0x5c, 0xf7, 0x14, 0xf7, 0x0, 0xe0, 0x13,
+                                                        0x8c, 0x80, 0xf7, 0xc5, 0xf7, 0x24, 0x15, 0xb8,
+                                                        0x8c, 0xe8, 0x8e, 0xf7, 0x6, 0xf7, 0x38, 0xfb,
+                                                        0xa2, 0xdc, 0xe4, 0x1a, 0xb9, 0xa7, 0xa5, 0xb4,
+                                                        0xb9, 0xa1, 0x7d, 0x84, 0x84, 0x80, 0x82, 0x80,
+                                                        0x81, 0x1e, 0x81, 0x82, 0x81, 0x7f, 0x7c, 0x1a,
+                                                        0x71, 0xa8, 0x6c, 0xac, 0x9a, 0xbb, 0x9a, 0xbf,
+                                                        0xa6, 0x67, 0xd0, 0xfb, 0x7, 0x1e, 0x13, 0xfc,
+                                                        0x80, 0x3f, 0x48, 0x59, 0x38, 0x51, 0xbb, 0x64,
+                                                        0xbd, 0x5f, 0x1f, 0x89, 0x89, 0x5, 0x13, 0xea,
+                                                        0x80, 0x62, 0x8e, 0x2a, 0x87, 0xfb, 0xf, 0x1a,
+                                                        0x3d, 0xb9, 0x6b, 0xf7, 0xe, 0x24, 0x1e, 0xd8,
+                                                        0x4d, 0x9c, 0x7c, 0x62, 0x1a, 0x65, 0x71, 0x6c,
+                                                        0x53, 0x51, 0x84, 0xa2, 0x91, 0x91, 0x94, 0x90,
+                                                        0x94, 0x91, 0x1e, 0x98, 0x93, 0x9a, 0x95, 0xa2,
+                                                        0x1a, 0x13, 0xf9, 0x80, 0xa1, 0x75, 0xac, 0x5f,
+                                                        0x5c, 0x7c, 0x5e, 0x79, 0x46, 0xe0, 0x6a, 0xc9,
+                                                        0x1e, 0x13, 0xfa, 0x80, 0xf6, 0xc7, 0xc6, 0xd0,
+                                                        0xc8, 0x61, 0xba, 0x52, 0xb1, 0x1f, 0xfb, 0x41,
+                                                        0xf7, 0x57, 0x15, 0xb8, 0xb1, 0x95, 0x9d, 0x1e,
+                                                        0x13, 0x8c, 0x80, 0xba, 0xe2, 0x33, 0x89, 0x8d,
+                                                        0x1f, 0xb1, 0x64, 0x90, 0x80, 0x70, 0x1a, 0x72,
+                                                        0x7d, 0x6a, 0x62, 0x6b, 0x6c, 0xa4, 0xa3, 0x6f,
+                                                        0x1e, 0x48, 0xc3, 0x75, 0x9f, 0xb8, 0x1a, 0xe,
+                                                        0xfb, 0xce, 0xf8, 0xad, 0xf7, 0x16, 0x1, 0x89,
+                                                        0x3f, 0xa, 0xe, 0xef, 0x78, 0xbf, 0xf7, 0x5,
+                                                        0xa2, 0xf7, 0xb0, 0x76, 0xe0, 0xa2, 0xf6, 0xbf,
+                                                        0x1, 0xae, 0xd2, 0xf7, 0x7, 0xf1, 0xf7, 0x4a,
+                                                        0x9e, 0xf7, 0x12, 0xd2, 0x3, 0x71, 0x1d, 0xf7,
+                                                        0x30, 0xf7, 0x5a, 0xf7, 0x5b, 0xfb, 0x29, 0xf7,
+                                                        0x31, 0x55, 0xa, 0xfb, 0x1f, 0xfb, 0x39, 0xfb,
+                                                        0x38, 0xfb, 0xc, 0xfb, 0x1e, 0x80, 0x1d, 0xf8,
+                                                        0x40, 0x3c, 0x15, 0x58, 0x74, 0x64, 0x63, 0x4f,
+                                                        0x1b, 0x2e, 0x6a, 0xd7, 0xf4, 0x8c, 0x1f, 0xef,
+                                                        0x8c, 0xb2, 0xd6, 0xdd, 0x1b, 0xd2, 0xa6, 0x5c,
+                                                        0x61, 0x95, 0x1f, 0x9e, 0xd3, 0x6, 0x94, 0x85,
+                                                        0x92, 0x7b, 0x90, 0x1e, 0x94, 0x70, 0x71, 0x95,
+                                                        0x57, 0x1b, 0xfb, 0x3b, 0x52, 0xfb, 0x5, 0x36,
+                                                        0xfb, 0x1e, 0xef, 0x49, 0xf7, 0x13, 0xba, 0xaa,
+                                                        0x99, 0x8f, 0x9e, 0x1f, 0x9c, 0x92, 0x95, 0x8e,
+                                                        0x8c, 0x97, 0x9b, 0xd5, 0x18, 0xe, 0xfb, 0xef,
+                                                        0xf8, 0x36, 0x76, 0xf7, 0xa0, 0xa2, 0x12, 0x8a,
+                                                        0xed, 0x36, 0xe0, 0xd6, 0xeb, 0x13, 0xd8, 0xf7,
+                                                        0x43, 0xf8, 0x4a, 0x15, 0x7b, 0x8f, 0x90, 0x72,
+                                                        0xb9, 0x1b, 0xa8, 0xa3, 0x99, 0x9f, 0x9d, 0x1f,
+                                                        0x81, 0x97, 0x5, 0x7a, 0x7a, 0x85, 0x9f, 0x8f,
+                                                        0x1a, 0xf7, 0x30, 0x7, 0xc4, 0x51, 0xa4, 0x43,
+                                                        0x36, 0x62, 0x67, 0x65, 0x62, 0xaf, 0x8b, 0x92,
+                                                        0xb0, 0x95, 0xa2, 0x96, 0x1e, 0x9e, 0x77, 0x90,
+                                                        0x98, 0x1a, 0x94, 0x9a, 0x97, 0xa3, 0xb8, 0x92,
+                                                        0x6b, 0x6d, 0x1e, 0x6d, 0x7, 0x13, 0xe8, 0x31,
+                                                        0x74, 0x37, 0x73, 0x4d, 0x1a, 0x13, 0xa8, 0x5a,
+                                                        0xb4, 0x79, 0xab, 0x9a, 0xb9, 0x8d, 0xb2, 0xb5,
+                                                        0x1e, 0x88, 0xa6, 0x15, 0x81, 0x84, 0x7c, 0x7b,
+                                                        0x75, 0x1b, 0x76, 0x81, 0xa1, 0x9d, 0xbf, 0xcb,
+                                                        0x9d, 0x96, 0x8e, 0x1f, 0xe, 0x82, 0xa, 0x1,
+                                                        0xf7, 0x6f, 0xf7, 0x92, 0x3, 0xa2, 0xf7, 0x75,
+                                                        0x88, 0xa, 0x82, 0x95, 0x9b, 0x7d, 0x96, 0x1b,
+                                                        0x91, 0x90, 0x8f, 0x99, 0x77, 0x1d, 0xe1, 0xf6,
+                                                        0xa8, 0x1a, 0x95, 0x88, 0x7b, 0x1d, 0xf7, 0x58,
+                                                        0x87, 0x88, 0xa, 0x82, 0x95, 0x9c, 0x7d, 0x96,
+                                                        0x1b, 0x91, 0x8f, 0x75, 0xa, 0x95, 0x86, 0x7b,
+                                                        0x1d, 0xe, 0x3e, 0xf7, 0x15, 0x76, 0xf7, 0x73,
+                                                        0xcf, 0x12, 0xf8, 0x54, 0xe6, 0x44, 0xd0, 0x13,
+                                                        0xe0, 0xac, 0xf7, 0xdf, 0x15, 0x13, 0xd0, 0xf8,
+                                                        0x47, 0xfb, 0x73, 0xd0, 0xf7, 0xb7, 0xfc, 0x8c,
+                                                        0x6, 0xe, 0xef, 0x78, 0xbf, 0x57, 0xf7, 0x52,
+                                                        0x7e, 0xf7, 0x51, 0x85, 0x76, 0xf7, 0xef, 0xbf,
+                                                        0x12, 0xa5, 0xd2, 0xf7, 0x3e, 0xdb, 0xe4, 0xe0,
+                                                        0xf7, 0x15, 0xd2, 0x13, 0xaf, 0x80, 0x71, 0x1d,
+                                                        0xf7, 0x34, 0xf7, 0x5a, 0xf7, 0x5b, 0xfb, 0x29,
+                                                        0xf7, 0x2d, 0x55, 0xa, 0xfb, 0x1b, 0xfb, 0x39,
+                                                        0xfb, 0x38, 0xfb, 0xc, 0xfb, 0x22, 0x80, 0x1d,
+                                                        0xf7, 0x2, 0xfb, 0x4a, 0x15, 0xf7, 0x40, 0x6,
+                                                        0x13, 0x5f, 0x80, 0x9d, 0x7, 0x5c, 0x8e, 0x8c,
+                                                        0x8f, 0xb0, 0x1a, 0xf4, 0xb0, 0x7, 0x13, 0xaf,
+                                                        0x80, 0x3a, 0xc0, 0xc9, 0x35, 0x88, 0x1b, 0xdc,
+                                                        0x96, 0x6, 0xfb, 0x14, 0xf7, 0x3b, 0x5, 0xbb,
+                                                        0x9b, 0xab, 0xb0, 0xba, 0x1a, 0xcf, 0x56, 0xac,
+                                                        0x4d, 0x1e, 0xfb, 0x55, 0x79, 0x6, 0xba, 0x89,
+                                                        0x8a, 0x87, 0x65, 0x1a, 0xfb, 0x93, 0x7, 0x13,
+                                                        0x5f, 0x80, 0x66, 0x8c, 0x87, 0x5c, 0x88, 0x1e,
+                                                        0x13, 0xaf, 0x80, 0xf7, 0x12, 0xf7, 0x3f, 0x15,
+                                                        0xf7, 0x3c, 0xaf, 0x7, 0xaf, 0xa4, 0x77, 0x50,
+                                                        0x5d, 0x7c, 0x60, 0x5c, 0x1f, 0xe, 0xfb, 0xce,
+                                                        0xf8, 0xc9, 0xd3, 0x1, 0x8c, 0xf8, 0xc9, 0x15,
+                                                        0xf7, 0xde, 0xd3, 0xfb, 0xde, 0x6, 0xe, 0xfb,
+                                                        0x8b, 0xf8, 0x26, 0xaf, 0xf7, 0x6a, 0xaf, 0x1,
+                                                        0xbb, 0xb4, 0xf7, 0x69, 0xb4, 0x3, 0xed, 0xf8,
+                                                        0xb5, 0x15, 0xc4, 0xb8, 0xbd, 0xc4, 0xc4, 0xb8,
+                                                        0x59, 0x52, 0x52, 0x5e, 0x59, 0x52, 0x52, 0x5e,
+                                                        0xbd, 0xc4, 0x1e, 0x62, 0x16, 0x3b, 0xca, 0x4c,
+                                                        0xdb, 0xdb, 0xca, 0xca, 0xdb, 0xdb, 0x4c, 0xca,
+                                                        0x3b, 0x3b, 0x4c, 0x4c, 0x3b, 0x1e, 0xe, 0x3e,
+                                                        0x8b, 0xe1, 0xf7, 0x51, 0xe3, 0x3b, 0xcd, 0xf7,
+                                                        0x31, 0x77, 0x12, 0xf7, 0x85, 0xe3, 0x3e, 0xcd,
+                                                        0x13, 0xd4, 0xf7, 0x90, 0xf7, 0x12, 0x15, 0xcd,
+                                                        0x6, 0x13, 0xb4, 0xf7, 0x31, 0xf7, 0x6f, 0xcd,
+                                                        0xfb, 0x6f, 0xf7, 0x31, 0x49, 0xfb, 0x31, 0xfb,
+                                                        0x6f, 0x49, 0xf7, 0x6f, 0x7, 0xfb, 0x6f, 0xfb,
+                                                        0xaf, 0x15, 0xf8, 0x8c, 0x6, 0x13, 0xd8, 0xcd,
+                                                        0xfc, 0x8c, 0x7, 0xe, 0xfb, 0xef, 0xf7, 0xa7,
+                                                        0xdb, 0xf7, 0x9d, 0xcf, 0x12, 0xf7, 0x4c, 0xe3,
+                                                        0x17, 0xf7, 0xa7, 0x4, 0xf7, 0xa2, 0x6, 0xa9,
+                                                        0xf7, 0x13, 0x5, 0x7b, 0x6, 0x62, 0x79, 0x85,
+                                                        0x85, 0x46, 0x1b, 0x2f, 0x6, 0xf7, 0x25, 0xed,
+                                                        0xa7, 0xe7, 0xaa, 0x5a, 0x1d, 0x1f, 0x44, 0x3c,
+                                                        0x3c, 0x22, 0x23, 0x1e, 0xe, 0xfb, 0xef, 0xf7,
+                                                        0xb5, 0x76, 0xf8, 0x8, 0xbb, 0x12, 0xf7, 0x44,
+                                                        0xea, 0x5a, 0xd6, 0x13, 0xd0, 0xe7, 0xf8, 0x7e,
+                                                        0x40, 0xa, 0x70, 0xb6, 0x56, 0x9d, 0x1e, 0x13,
+                                                        0x60, 0xa7, 0x9a, 0x4a, 0x1d, 0xe, 0x90, 0xa,
+                                                        0xe1, 0xf8, 0xa4, 0x56, 0x1d, 0xf7, 0x1e, 0xe1,
+                                                        0x5, 0xa3, 0x9a, 0x9f, 0x97, 0xa7, 0x1a, 0xaf,
+                                                        0x71, 0x93, 0x79, 0x81, 0x73, 0x89, 0x71, 0x74,
+                                                        0x1e, 0xe, 0x30, 0xfb, 0x4d, 0x76, 0xf9, 0x2f,
+                                                        0x77, 0x12, 0xac, 0xf7, 0x14, 0x2c, 0xf7, 0x1f,
+                                                        0xf7, 0x17, 0xf7, 0x1f, 0x13, 0xd8, 0xf7, 0x15,
+                                                        0x9d, 0x15, 0x8d, 0x8d, 0x5, 0x77, 0xa3, 0xab,
+                                                        0x7e, 0xb9, 0x1b, 0xb2, 0xaa, 0x9d, 0xad, 0xa5,
+                                                        0x1f, 0x64, 0xa0, 0xb1, 0x7e, 0xb6, 0x1b, 0xbd,
+                                                        0xa2, 0x9f, 0xa8, 0xab, 0x1f, 0xa3, 0x7, 0x82,
+                                                        0x86, 0x83, 0x89, 0x83, 0x8c, 0x8, 0x7c, 0x8d,
+                                                        0x76, 0x99, 0xaa, 0x1a, 0xf7, 0xfc, 0xfb, 0x1f,
+                                                        0xfb, 0xfb, 0x7, 0x7d, 0x77, 0x6a, 0x7e, 0x78,
+                                                        0x1b, 0x6f, 0x6c, 0x9f, 0xc1, 0x1f, 0xf7, 0xcc,
+                                                        0xfb, 0x1f, 0xfc, 0x9, 0x7, 0x56, 0x85, 0x62,
+                                                        0x83, 0x6a, 0x1e, 0x13, 0xe8, 0x82, 0x64, 0x81,
+                                                        0x70, 0x74, 0x1a, 0x5d, 0x9e, 0x6b, 0xbc, 0xb4,
+                                                        0x9e, 0xab, 0xb9, 0xa8, 0x7f, 0xa7, 0x82, 0xab,
+                                                        0x1e, 0x86, 0x9d, 0x87, 0x9e, 0x89, 0x9f, 0x8,
+                                                        0xe, 0x20, 0xfb, 0x54, 0x76, 0xf9, 0xd9, 0xb1,
+                                                        0x75, 0xa1, 0x12, 0xf7, 0x9a, 0xbc, 0xe3, 0xbc,
+                                                        0x13, 0xd8, 0xf7, 0x98, 0xfb, 0x69, 0x15, 0xbc,
+                                                        0xf9, 0xd9, 0xed, 0xfd, 0xd9, 0x6, 0x13, 0xb8,
+                                                        0xbc, 0xf9, 0x7a, 0x6, 0xe1, 0x97, 0xa4, 0xd3,
+                                                        0x1e, 0xa1, 0xfb, 0xb2, 0x7, 0xfb, 0x6, 0xfb,
+                                                        0x20, 0x67, 0xfb, 0x4e, 0xfb, 0x33, 0xf7, 0x6,
+                                                        0x44, 0xf7, 0x26, 0x1f, 0xe, 0xfc, 0x21, 0xf7,
+                                                        0x8c, 0x93, 0xa, 0xf7, 0xe0, 0x62, 0x1d, 0xfb,
+                                                        0xce, 0xfb, 0x59, 0x76, 0xf7, 0x6e, 0x77, 0x12,
+                                                        0xf7, 0x5d, 0xe8, 0x17, 0xf7, 0x33, 0x16, 0x60,
+                                                        0x2b, 0x4f, 0x1d, 0x13, 0x60, 0xb1, 0xf7, 0x5,
+                                                        0x8c, 0xdc, 0xc8, 0x4b, 0xa7, 0x52, 0x7a, 0x1f,
+                                                        0xa7, 0xcb, 0x5, 0xe, 0xfb, 0xef, 0xf7, 0xa7,
+                                                        0xa9, 0xbd, 0xa9, 0xf7, 0xc3, 0x77, 0x1, 0xf6,
+                                                        0xeb, 0x3, 0xa9, 0xf7, 0xf7, 0x15, 0xf7, 0x87,
+                                                        0xa9, 0x6, 0x4b, 0x85, 0x9b, 0xb3, 0x1f, 0xf7,
+                                                        0x8b, 0x46, 0xa, 0xfb, 0x17, 0x7, 0x65, 0x89,
+                                                        0x74, 0x40, 0x8c, 0x1e, 0xe, 0xfb, 0xd1, 0xf8,
+                                                        0x21, 0x9f, 0xf7, 0x8e, 0xa0, 0x1, 0x9d, 0xec,
+                                                        0xee, 0xed, 0x3, 0xf7, 0x7, 0xf8, 0xb2, 0x15,
+                                                        0xe7, 0x97, 0xac, 0xb1, 0xb1, 0x96, 0x6a, 0x2f,
+                                                        0x3e, 0x86, 0x5b, 0x5f, 0x5f, 0x85, 0xbb, 0xd8,
+                                                        0x1e, 0x2a, 0x16, 0x3b, 0xc5, 0x4a, 0xe4, 0xe4,
+                                                        0xc5, 0xcc, 0xdb, 0xde, 0x4e, 0xca, 0x35, 0x35,
+                                                        0x4e, 0x4c, 0x38, 0x1e, 0xe, 0x82, 0xa, 0x12,
+                                                        0xf7, 0x25, 0xf7, 0x1c, 0x17, 0xf7, 0x25, 0x91,
+                                                        0xa, 0x81, 0x91, 0x87, 0x91, 0x97, 0x9f, 0x9b,
+                                                        0x91, 0x92, 0x4c, 0xa, 0xf7, 0x58, 0x16, 0x6d,
+                                                        0x65, 0x35, 0x20, 0x6e, 0x1a, 0x80, 0x8f, 0x88,
+                                                        0x91, 0x96, 0x9d, 0x99, 0x93, 0x95, 0x4c, 0xa,
+                                                        0xe, 0xf2, 0x94, 0x76, 0xac, 0x76, 0xe2, 0xcd,
+                                                        0xf7, 0xe, 0xa9, 0xb4, 0x76, 0xf7, 0x1, 0x76,
+                                                        0xf7, 0xa7, 0x77, 0x12, 0xf6, 0xeb, 0xf8, 0x2a,
+                                                        0xe8, 0x13, 0x7f, 0x80, 0xf8, 0x53, 0xe2, 0x74,
+                                                        0x1d, 0x37, 0x23, 0x50, 0x38, 0x73, 0xa, 0x13,
+                                                        0xbf, 0x80, 0xfb, 0xc0, 0xfb, 0x39, 0x69, 0xa,
+                                                        0xfc, 0xdf, 0x3e, 0x1d, 0xe, 0xf2, 0x8b, 0xdb,
+                                                        0x44, 0x76, 0xf7, 0xb3, 0xa9, 0xb3, 0xcf, 0xf7,
+                                                        0xa7, 0x77, 0x12, 0xd3, 0xeb, 0xf8, 0x7f, 0xe3,
+                                                        0x13, 0x7e, 0xf7, 0x18, 0x7f, 0x69, 0xa, 0xfc,
+                                                        0xd8, 0x3e, 0x1d, 0x13, 0xbe, 0xf8, 0x76, 0xfb,
+                                                        0xc5, 0x15, 0xf7, 0xa2, 0x6, 0xa9, 0xf7, 0x13,
+                                                        0x5, 0x71, 0x6, 0x62, 0x79, 0x85, 0x85, 0x46,
+                                                        0x1b, 0x3f, 0x90, 0x6, 0xe8, 0xe2, 0x5, 0xd5,
+                                                        0xcd, 0x8b, 0xb8, 0x9d, 0x5a, 0x1d, 0x44, 0x3c,
+                                                        0x3c, 0x22, 0x23, 0x1f, 0xe, 0xf2, 0x94, 0x76,
+                                                        0xee, 0xcd, 0xf8, 0x7b, 0xbb, 0x12, 0xf7, 0x58,
+                                                        0xea, 0x5a, 0xd6, 0xf7, 0xae, 0xe8, 0x13, 0xec,
+                                                        0xf7, 0x40, 0x7f, 0x69, 0xa, 0xfc, 0x89, 0xfb,
+                                                        0x5a, 0x40, 0xa, 0x6f, 0xb6, 0x5b, 0x9b, 0x1e,
+                                                        0x8f, 0x7, 0x13, 0xf4, 0xa3, 0x98, 0x4a, 0x1d,
+                                                        0xf7, 0xd9, 0xfc, 0x31, 0x74, 0x1d, 0x35, 0x26,
+                                                        0x52, 0x35, 0x73, 0xa, 0xe, 0xfb, 0x5d, 0xaf,
+                                                        0xf8, 0x88, 0xf7, 0x3a, 0x12, 0xc2, 0xf7, 0x29,
+                                                        0x70, 0xf7, 0x3d, 0x69, 0xf7, 0x17, 0x13, 0xe8,
+                                                        0x13, 0xd0, 0xf7, 0x8b, 0xf7, 0x95, 0x15, 0x99,
+                                                        0x3e, 0x59, 0x6a, 0x56, 0x68, 0x8, 0x58, 0x6a,
+                                                        0x57, 0x68, 0x40, 0x1a, 0xfb, 0x33, 0xf7, 0x37,
+                                                        0x80, 0xaa, 0xf7, 0x38, 0xa9, 0xf1, 0xb4, 0xae,
+                                                        0x78, 0xb5, 0x58, 0x77, 0x62, 0x7f, 0x57, 0x70,
+                                                        0x96, 0x7f, 0x95, 0x80, 0x1e, 0x93, 0x82, 0x93,
+                                                        0x83, 0x7e, 0x1a, 0x66, 0x59, 0x88, 0x82, 0x3d,
+                                                        0x83, 0xe4, 0xb5, 0xcf, 0xa1, 0xb5, 0x9f, 0xb1,
+                                                        0x1e, 0xa2, 0xb6, 0xa4, 0xae, 0x7a, 0xcc, 0x8,
+                                                        0x13, 0xe8, 0x27, 0xf7, 0x37, 0x15, 0x5d, 0xb1,
+                                                        0x64, 0xb9, 0xbb, 0xb0, 0xb3, 0xb8, 0xba, 0x66,
+                                                        0xad, 0x5b, 0x5d, 0x65, 0x6a, 0x5b, 0x1e, 0xe,
+                                                        0x4b, 0x1d, 0xf7, 0x91, 0x77, 0x1, 0xf8, 0xe,
+                                                        0xf9, 0x76, 0x24, 0x1d, 0xfb, 0x77, 0xfd, 0xce,
+                                                        0x20, 0x1d, 0x4b, 0x1d, 0xf7, 0x91, 0x77, 0x1,
+                                                        0xf7, 0xa6, 0xf9, 0x76, 0x22, 0x1d, 0xfc, 0x26,
+                                                        0xfe, 0x13, 0x20, 0x1d, 0x4b, 0x1d, 0xf7, 0x88,
+                                                        0x77, 0x1, 0xf7, 0x4e, 0xf9, 0x76, 0x29, 0x1d,
+                                                        0xfb, 0xbf, 0xfe, 0x26, 0x20, 0x1d, 0x54, 0xa,
+                                                        0xf8, 0x9d, 0xd9, 0x80, 0xd9, 0x12, 0x13, 0xd0,
+                                                        0xf7, 0x40, 0xf9, 0x8b, 0x45, 0x1d, 0xa1, 0xa5,
+                                                        0x81, 0x80, 0xa3, 0x1f, 0x13, 0xe0, 0x7e, 0xa9,
+                                                        0xa8, 0x7c, 0xa1, 0x1b, 0x13, 0xd0, 0x44, 0xa,
+                                                        0x13, 0xe0, 0x54, 0x1d, 0x6b, 0x77, 0x96, 0x96,
+                                                        0x77, 0x1f, 0x13, 0xd0, 0x98, 0x74, 0x75, 0x99,
+                                                        0x69, 0x50, 0x1d, 0xfb, 0x37, 0xfd, 0x8b, 0x20,
+                                                        0x1d, 0x4b, 0x1d, 0xd8, 0xf7, 0x16, 0x1, 0xf7,
+                                                        0x4e, 0xf7, 0x13, 0x8b, 0xde, 0x8b, 0xf7, 0x13,
+                                                        0x14, 0xe, 0xf7, 0x4e, 0xf9, 0xc0, 0x15, 0x6e,
+                                                        0x1d, 0xf7, 0x66, 0x16, 0x6e, 0x1d, 0xfc, 0x17,
+                                                        0xfd, 0xc0, 0x20, 0x1d, 0x54, 0xa, 0xf8, 0x5f,
+                                                        0x77, 0xba, 0xbb, 0xf7, 0x15, 0xbb, 0x1, 0xf7,
+                                                        0x84, 0xbb, 0x8b, 0xf7, 0x9, 0x8b, 0xbb, 0x14,
+                                                        0x7, 0xf7, 0x84, 0xf9, 0xd0, 0x15, 0x4f, 0xbc,
+                                                        0x5d, 0xc5, 0x7d, 0x1d, 0x1e, 0xbb, 0x16, 0xac,
+                                                        0xa4, 0xa5, 0xac, 0xac, 0xa5, 0x71, 0x6a, 0x6a,
+                                                        0x71, 0x72, 0x6a, 0x6a, 0x72, 0xa4, 0xac, 0x1e,
+                                                        0xfb, 0xab, 0xfd, 0xd0, 0x20, 0x1d, 0xf7, 0xf5,
+                                                        0x8b, 0xae, 0x68, 0xb7, 0xf7, 0x97, 0xb3, 0x7f,
+                                                        0xab, 0xf7, 0xa0, 0xb8, 0x12, 0xf8, 0x44, 0xf7,
+                                                        0x34, 0x13, 0xac, 0x8f, 0x16, 0xf7, 0x62, 0xae,
+                                                        0x6, 0x59, 0x91, 0x66, 0x8f, 0xac, 0x1a, 0xf7,
+                                                        0xb, 0xf7, 0x75, 0x5, 0xf7, 0x52, 0xfb, 0x60,
+                                                        0x6, 0x64, 0x7d, 0x75, 0x41, 0x88, 0x1e, 0x68,
+                                                        0xf8, 0xca, 0x7, 0xb4, 0xf7, 0x67, 0x5, 0x74,
+                                                        0x6, 0x7e, 0x60, 0x44, 0x6b, 0x6c, 0x1e, 0x13,
+                                                        0x5c, 0x61, 0x5e, 0x62, 0x81, 0x21, 0x1b, 0x4f,
+                                                        0x82, 0x9e, 0xae, 0x1f, 0xf7, 0x7d, 0x7, 0xf7,
+                                                        0x16, 0x86, 0x8a, 0x56, 0x9b, 0x28, 0x8, 0xac,
+                                                        0xf7, 0xe6, 0x6a, 0x6, 0x6f, 0xfb, 0x14, 0x8b,
+                                                        0x81, 0xfb, 0x9, 0x80, 0x8, 0xf7, 0x82, 0x7,
+                                                        0x9e, 0x8b, 0x96, 0xdd, 0xf7, 0x44, 0x90, 0x49,
+                                                        0x31, 0x9e, 0x1e, 0xae, 0xf7, 0x5d, 0xfd, 0xe,
+                                                        0x6b, 0x6, 0xbf, 0x89, 0xae, 0x85, 0x6c, 0x1a,
+                                                        0xfb, 0xbc, 0xfc, 0xac, 0x5, 0x13, 0xac, 0x78,
+                                                        0x68, 0x84, 0x93, 0x67, 0x84, 0x8, 0xf7, 0x98,
+                                                        0xf7, 0xc8, 0x15, 0xf7, 0x35, 0xf7, 0xac, 0x5,
+                                                        0x92, 0xfb, 0xac, 0x6, 0xe, 0xd6, 0xfb, 0x59,
+                                                        0x76, 0xf7, 0x33, 0xb5, 0x8b, 0xb9, 0x7d, 0xa,
+                                                        0xf7, 0x57, 0xe8, 0x13, 0xfb, 0xf7, 0xc4, 0xfb,
+                                                        0x37, 0x15, 0x7b, 0x66, 0x5, 0x7b, 0xb4, 0xb1,
+                                                        0x89, 0x97, 0x1b, 0xb1, 0xec, 0x93, 0xdc, 0xbc,
+                                                        0x64, 0xa0, 0x58, 0x7e, 0x83, 0x89, 0x88, 0x81,
+                                                        0x1f, 0x9f, 0xb8, 0xf7, 0x11, 0x8c, 0xd8, 0xca,
+                                                        0xd3, 0xdd, 0x19, 0x6d, 0xa4, 0x5, 0x2e, 0x38,
+                                                        0x40, 0x6d, 0x3d, 0x1b, 0xfb, 0x2a, 0x5e, 0xf7,
+                                                        0x45, 0xf7, 0x12, 0xf7, 0x3d, 0xaa, 0xf7, 0x31,
+                                                        0xf7, 0x26, 0xf7, 0x6, 0xdd, 0xfb, 0x9, 0x34,
+                                                        0xae, 0x1f, 0xae, 0x6, 0x13, 0xf7, 0x6a, 0x1d,
+                                                        0x7b, 0x6c, 0x9d, 0x99, 0x61, 0x1f, 0x13, 0xfb,
+                                                        0x94, 0x70, 0x6b, 0x93, 0x68, 0x1b, 0xfb, 0x66,
+                                                        0xfb, 0x24, 0xfb, 0x30, 0xfb, 0x5f, 0xfb, 0x44,
+                                                        0xf7, 0x4, 0xfb, 0x30, 0xf7, 0x66, 0x7a, 0x1f,
+                                                        0x68, 0x3c, 0x96, 0x83, 0x5, 0x8d, 0x93, 0x92,
+                                                        0x8d, 0x98, 0x1b, 0xa5, 0x9f, 0x80, 0x72, 0x73,
+                                                        0x1d, 0x1f, 0xe, 0x55, 0x1d, 0x9b, 0x16, 0x21,
+                                                        0x1d, 0xf7, 0xf0, 0xf9, 0x53, 0x26, 0xa, 0x55,
+                                                        0x1d, 0xf7, 0x98, 0xf9, 0x76, 0x22, 0x1d, 0xfc,
+                                                        0x11, 0xfe, 0x13, 0x15, 0x21, 0x1d, 0xe, 0x51,
+                                                        0xa, 0xf7, 0x82, 0x72, 0xa, 0xf7, 0x40, 0xf9,
+                                                        0x76, 0x29, 0x1d, 0xfb, 0xaa, 0xfe, 0x26, 0x15,
+                                                        0x21, 0x1d, 0xe, 0x9f, 0x8b, 0xaa, 0xf7, 0xbe,
+                                                        0xad, 0xf7, 0xab, 0xad, 0xd2, 0x9a, 0x1d, 0xf3,
+                                                        0xf7, 0x36, 0x2c, 0xf7, 0x16, 0xda, 0xf7, 0x16,
+                                                        0x2f, 0xaf, 0x13, 0xf9, 0x9b, 0x16, 0x21, 0x1d,
+                                                        0x13, 0xf6, 0xf7, 0x2f, 0xf9, 0x9d, 0x15, 0x2a,
+                                                        0x1d, 0xf7, 0x65, 0x38, 0x1d, 0x35, 0x1d, 0xf7,
+                                                        0x5a, 0xf9, 0x53, 0x26, 0xa, 0x35, 0x1d, 0xe9,
+                                                        0xf9, 0x53, 0x28, 0x1d, 0x5c, 0xa, 0xf7, 0x82,
+                                                        0x77, 0x27, 0xa, 0x91, 0xf9, 0x53, 0x29, 0x1d,
+                                                        0xe, 0x5c, 0xa, 0xd2, 0x9a, 0x1d, 0x9f, 0xf7,
+                                                        0x1a, 0x62, 0xf7, 0x36, 0x62, 0xf7, 0x16, 0x13,
+                                                        0xf4, 0x9f, 0x16, 0xf7, 0xf2, 0xae, 0x6, 0x13,
+                                                        0xe8, 0x34, 0x1d, 0x7, 0x13, 0xf4, 0xfb, 0xf2,
+                                                        0x68, 0x6, 0x13, 0xe8, 0x4b, 0xa, 0x13, 0xf4,
+                                                        0x4d, 0x64, 0x87, 0x55, 0x86, 0x1e, 0x8f, 0xf9,
+                                                        0x9d, 0x40, 0x1d, 0x8a, 0x1d, 0xf7, 0xb7, 0xba,
+                                                        0xf7, 0xa1, 0xad, 0x1, 0xec, 0xf7, 0x36, 0xf7,
+                                                        0x95, 0xf7, 0x42, 0x3, 0xf7, 0x97, 0xf7, 0xda,
+                                                        0x15, 0xf7, 0x6, 0xba, 0xfb, 0x6, 0xf7, 0x67,
+                                                        0x6, 0x8c, 0x1d, 0xfb, 0x69, 0x30, 0x84, 0xa,
+                                                        0x1f, 0xfb, 0x89, 0x30, 0x15, 0xf7, 0xd0, 0x6,
+                                                        0xf7, 0x90, 0xf7, 0x0, 0xf7, 0x2e, 0xf7, 0x4c,
+                                                        0xf7, 0x2e, 0x30, 0xf7, 0x4c, 0x95, 0x1d, 0xb7,
+                                                        0x8f, 0x4e, 0x1f, 0xfb, 0x67, 0x30, 0x5c, 0xe6,
+                                                        0xfb, 0x7f, 0x7, 0x66, 0x77, 0x78, 0x4c, 0x1e,
+                                                        0xe, 0xd6, 0x8e, 0x76, 0xf9, 0x27, 0xae, 0xdc,
+                                                        0xd9, 0x12, 0xf2, 0xb7, 0xf8, 0x44, 0xb7, 0x17,
+                                                        0x72, 0x1d, 0x37, 0xa, 0xf7, 0x37, 0xf9, 0x68,
+                                                        0x45, 0x1d, 0x13, 0x30, 0xa8, 0xa2, 0x81, 0x80,
+                                                        0xa0, 0x1f, 0x7e, 0xa4, 0xa3, 0x7c, 0xaa, 0x1b,
+                                                        0x42, 0xa, 0x13, 0x10, 0x74, 0x76, 0x98, 0x98,
+                                                        0x72, 0x1f, 0x97, 0x74, 0x71, 0x96, 0x6a, 0x50,
+                                                        0x1d, 0xe, 0x51, 0x1d, 0xf7, 0x7c, 0x77, 0x57,
+                                                        0x1d, 0xfb, 0x48, 0x78, 0xa, 0xfb, 0x7b, 0x58,
+                                                        0x1d, 0xf7, 0x21, 0x5e, 0xa, 0xf7, 0x21, 0x5e,
+                                                        0x1d, 0xfb, 0x18, 0xfb, 0x6e, 0x1e, 0xf8, 0xe,
+                                                        0xf8, 0x21, 0x26, 0xa, 0x51, 0x1d, 0xf7, 0x7c,
+                                                        0x77, 0x1, 0xae, 0xf7, 0x45, 0xf7, 0xf6, 0x30,
+                                                        0xa, 0xf7, 0xa6, 0xf8, 0x26, 0x28, 0x1d, 0x51,
+                                                        0x1d, 0x57, 0x1d, 0xfb, 0x49, 0x78, 0xa, 0xfb,
+                                                        0x7a, 0x58, 0x1d, 0xf7, 0x20, 0x5e, 0xa, 0xf7,
+                                                        0x22, 0x5e, 0x1d, 0xfb, 0x18, 0xfb, 0x6e, 0x1e,
+                                                        0xf7, 0x4e, 0xf8, 0x21, 0x29, 0x1d, 0xe, 0x51,
+                                                        0x1d, 0xcd, 0xd9, 0x6e, 0xd9, 0x12, 0x5c, 0x1d,
+                                                        0x13, 0xdc, 0xf7, 0x68, 0xf7, 0xea, 0x79, 0x1d,
+                                                        0xf7, 0x3e, 0x66, 0x1d, 0xfb, 0x49, 0x78, 0xa,
+                                                        0xfb, 0x7a, 0x65, 0x1d, 0xf7, 0x85, 0x45, 0xa,
+                                                        0xfb, 0x2b, 0x5f, 0x1d, 0xf7, 0x20, 0x5e, 0xa,
+                                                        0xf7, 0x22, 0xfb, 0x55, 0x96, 0xa, 0x1e, 0xf7,
+                                                        0x3a, 0xf8, 0x35, 0x45, 0x1d, 0xa9, 0xa1, 0x80,
+                                                        0x80, 0xa1, 0x1f, 0x13, 0xec, 0x7e, 0xa4, 0xa2,
+                                                        0x7d, 0xaa, 0x1b, 0x13, 0xdc, 0x44, 0xa, 0x13,
+                                                        0xec, 0x54, 0x1d, 0x75, 0x76, 0x98, 0x97, 0x73,
+                                                        0x1f, 0x13, 0xdc, 0x97, 0x74, 0x70, 0x97, 0x69,
+                                                        0x50, 0x1d, 0xe, 0x51, 0x1d, 0xc3, 0xf7, 0x16,
+                                                        0x1, 0xae, 0xf7, 0x45, 0x94, 0xf7, 0x14, 0xdc,
+                                                        0xf7, 0x14, 0x93, 0x30, 0xa, 0xf7, 0x4e, 0xf8,
+                                                        0x70, 0x15, 0x6d, 0xa, 0xf7, 0x65, 0x16, 0x6d,
+                                                        0xa, 0xe, 0x3e, 0xb0, 0x76, 0xf8, 0x6e, 0x77,
+                                                        0x1, 0xbb, 0xca, 0x15, 0xb8, 0x5c, 0xf7, 0x54,
+                                                        0xf7, 0x56, 0xf7, 0x54, 0xfb, 0x56, 0xb8, 0xbb,
+                                                        0xfb, 0x54, 0xf7, 0x51, 0xf7, 0x54, 0xf7, 0x55,
+                                                        0x5b, 0xb7, 0xfb, 0x51, 0xfb, 0x52, 0xfb, 0x51,
+                                                        0xf7, 0x52, 0x5b, 0x5e, 0xf7, 0x53, 0xfb, 0x54,
+                                                        0x5, 0xe, 0xf7, 0x17, 0x56, 0x76, 0xc2, 0xac,
+                                                        0x93, 0x1d, 0xb9, 0x77, 0x5a, 0xa, 0xdc, 0x41,
+                                                        0x15, 0xbd, 0x6, 0xd2, 0xf3, 0x5, 0x6b, 0xc0,
+                                                        0xca, 0x7a, 0xd2, 0x1b, 0xf7, 0x61, 0xf7, 0x29,
+                                                        0xf7, 0x1f, 0xf7, 0x66, 0xf7, 0x12, 0x55, 0xf4,
+                                                        0x39, 0xc8, 0x1f, 0xd9, 0xf7, 0x7, 0x5, 0x59,
+                                                        0x6, 0x4c, 0x2e, 0x5, 0xaa, 0x56, 0x4c, 0x9b,
+                                                        0x48, 0x1b, 0x96, 0xa, 0xfb, 0xd, 0xbd, 0x21,
+                                                        0xdd, 0x4c, 0x1f, 0xce, 0xee, 0x15, 0x76, 0xcf,
+                                                        0x8a, 0xdc, 0xb5, 0x1a, 0xf7, 0x26, 0xb0, 0xf7,
+                                                        0x3e, 0xf7, 0x20, 0xca, 0xb4, 0x68, 0x55, 0xa6,
+                                                        0x1e, 0xfb, 0x9f, 0xfc, 0x65, 0x15, 0xf7, 0xb3,
+                                                        0xf8, 0x38, 0x5, 0x9e, 0x53, 0x92, 0x40, 0x4c,
+                                                        0x1a, 0x34, 0x85, 0xfb, 0x79, 0xfb, 0x3f, 0x46,
+                                                        0x61, 0xb1, 0xbf, 0x72, 0x1e, 0xe, 0x6b, 0xa,
+                                                        0xf7, 0x8b, 0x77, 0x63, 0xa, 0x9b, 0xf9, 0x15,
+                                                        0x21, 0xa, 0xf8, 0x20, 0xc9, 0x26, 0xa, 0x6b,
+                                                        0xa, 0xf7, 0x8b, 0x77, 0x63, 0xa, 0xf7, 0xc8,
+                                                        0xf9, 0x76, 0x22, 0x1d, 0xfc, 0x41, 0xfb, 0x92,
+                                                        0x21, 0xa, 0xe, 0x6b, 0xa, 0xf7, 0x82, 0x77,
+                                                        0x63, 0xa, 0xf7, 0x70, 0xf9, 0x76, 0x29, 0x1d,
+                                                        0xfb, 0xda, 0xfb, 0xa5, 0x21, 0xa, 0xe, 0x6b,
+                                                        0xa, 0xd2, 0x9a, 0x1d, 0xed, 0xf7, 0x33, 0x64,
+                                                        0xf7, 0x16, 0xc8, 0xf7, 0x16, 0x9c, 0xb7, 0x13,
+                                                        0xf6, 0x9b, 0xf9, 0x15, 0x21, 0xa, 0x13, 0xee,
+                                                        0xf7, 0x5e, 0xf7, 0x1c, 0x15, 0x2a, 0x1d, 0xf7,
+                                                        0x67, 0x38, 0x1d, 0xd6, 0x4e, 0x1d, 0xf7, 0x90,
+                                                        0x77, 0x1, 0xf7, 0xaa, 0x7f, 0x1d, 0x69, 0x1d,
+                                                        0x83, 0xde, 0x1a, 0xf7, 0x4c, 0x66, 0xa, 0xb8,
+                                                        0x89, 0x64, 0x1a, 0xfb, 0x32, 0xfb, 0xa0, 0x5,
+                                                        0xfb, 0x14, 0xf7, 0x82, 0x7b, 0xa4, 0x3d, 0x1d,
+                                                        0xfb, 0x27, 0x7, 0x38, 0x73, 0x93, 0x46, 0x84,
+                                                        0x1e, 0xf7, 0x3, 0xf9, 0x58, 0x28, 0x1d, 0x67,
+                                                        0x8f, 0x76, 0xb1, 0x76, 0xf7, 0x41, 0xae, 0x7d,
+                                                        0xae, 0xf7, 0xa6, 0xae, 0x68, 0xf7, 0x41, 0xfb,
+                                                        0x3d, 0xf7, 0x39, 0x8f, 0x77, 0x12, 0xef, 0xf7,
+                                                        0x36, 0xfb, 0x26, 0xf7, 0x36, 0xf7, 0x29, 0xf7,
+                                                        0x40, 0xfb, 0x3f, 0xf7, 0x40, 0x13, 0xa2, 0xa0,
+                                                        0xf7, 0x9a, 0xf7, 0x64, 0x15, 0xf7, 0x98, 0x7,
+                                                        0x13, 0x99, 0x60, 0xa1, 0x8c, 0x98, 0x98, 0xad,
+                                                        0x1b, 0x13, 0x92, 0x50, 0xdd, 0xaf, 0x6d, 0xfb,
+                                                        0x6, 0x1f, 0x13, 0xa2, 0xa0, 0xfb, 0x10, 0x5e,
+                                                        0x70, 0xfb, 0xd, 0x1e, 0x13, 0x52, 0x60, 0xfb,
+                                                        0x8a, 0xfb, 0x64, 0x15, 0xf7, 0xe2, 0xae, 0x6,
+                                                        0x13, 0x92, 0xa0, 0x46, 0x94, 0x78, 0x83, 0xdc,
+                                                        0x1a, 0x13, 0xa2, 0xa0, 0xc3, 0x7, 0x13, 0x92,
+                                                        0x50, 0xf7, 0x3c, 0x8a, 0xf7, 0x3e, 0xb8, 0xf7,
+                                                        0x25, 0x1a, 0x13, 0x99, 0x60, 0xdf, 0x60, 0xe7,
+                                                        0xfb, 0x79, 0x1e, 0x13, 0x99, 0xa0, 0x49, 0x97,
+                                                        0x6, 0xdc, 0x9e, 0x8b, 0xd0, 0x95, 0x1e, 0x13,
+                                                        0x94, 0x60, 0xae, 0xfb, 0xe2, 0x68, 0x7, 0x13,
+                                                        0x92, 0xa0, 0xc0, 0x86, 0xaa, 0x8a, 0x37, 0x1a,
+                                                        0xfc, 0x46, 0x7, 0x31, 0x70, 0x9e, 0x52, 0x80,
+                                                        0x1e, 0xe, 0x30, 0x7f, 0xae, 0x6e, 0xf7, 0x12,
+                                                        0x28, 0x76, 0xf8, 0x9, 0xad, 0xf7, 0x94, 0xa7,
+                                                        0x12, 0xd1, 0xf7, 0x1f, 0xf7, 0x16, 0xf7, 0x1d,
+                                                        0x22, 0xf7, 0x26, 0x13, 0x9e, 0x9e, 0x16, 0xad,
+                                                        0x7, 0x13, 0x5d, 0xb0, 0x91, 0x99, 0x91, 0xbe,
+                                                        0x1a, 0xf8, 0x2e, 0x7, 0xf4, 0xdd, 0xda, 0xf7,
+                                                        0x8, 0xf7, 0x31, 0xbe, 0x2a, 0x55, 0x3b, 0x4b,
+                                                        0x5a, 0x32, 0x7a, 0x1e, 0x89, 0x7, 0xf7, 0x1a,
+                                                        0x68, 0xc7, 0x53, 0xfb, 0x3, 0x1a, 0x36, 0x5b,
+                                                        0x51, 0x57, 0x68, 0x1e, 0x13, 0x9e, 0x7f, 0x83,
+                                                        0x7d, 0x84, 0x7d, 0x8a, 0x6e, 0x89, 0x18, 0x6e,
+                                                        0x6e, 0x94, 0x9e, 0x79, 0x1f, 0x13, 0x3e, 0x7f,
+                                                        0x98, 0x83, 0x9b, 0xa0, 0x1a, 0xa8, 0x9f, 0x9e,
+                                                        0xa7, 0xad, 0x97, 0x72, 0x75, 0x1e, 0x7f, 0x88,
+                                                        0x85, 0x81, 0x1a, 0x7d, 0x96, 0x88, 0x97, 0x1e,
+                                                        0xa4, 0x90, 0x88, 0xa4, 0x7e, 0xbb, 0x8, 0x85,
+                                                        0xa3, 0x8d, 0xa7, 0xab, 0x1a, 0xf7, 0x2e, 0x67,
+                                                        0xa5, 0x49, 0x8e, 0x1e, 0xad, 0x7, 0x13, 0x9d,
+                                                        0xd6, 0x91, 0x86, 0xb6, 0xdf, 0x1a, 0xed, 0x6d,
+                                                        0xa4, 0x62, 0x55, 0x87, 0x57, 0x72, 0x8a, 0x1e,
+                                                        0x13, 0x5e, 0xfc, 0xde, 0x7, 0xe, 0x92, 0x50,
+                                                        0xa, 0x52, 0x1d, 0x13, 0xd8, 0xf7, 0xba, 0xc3,
+                                                        0x2a, 0xa, 0x84, 0x93, 0x86, 0x92, 0x94, 0x1a,
+                                                        0x13, 0xb8, 0x3b, 0x1d, 0x71, 0xf7, 0xaf, 0x26,
+                                                        0xa, 0x92, 0x50, 0xa, 0xd7, 0x76, 0xf7, 0x4d,
+                                                        0x77, 0x52, 0x1d, 0x13, 0xde, 0xf7, 0x37, 0xf8,
+                                                        0xa4, 0x22, 0x1d, 0x85, 0xfd, 0x9, 0x37, 0x1d,
+                                                        0x13, 0xbe, 0x3b, 0x1d, 0xe, 0x92, 0x50, 0xa,
+                                                        0xf7, 0x7b, 0x77, 0x52, 0x1d, 0x13, 0xdc, 0xd6,
+                                                        0xf8, 0xa4, 0x29, 0x1d, 0xec, 0xfd, 0x1c, 0x23,
+                                                        0x1d, 0xa2, 0x81, 0x97, 0x82, 0x96, 0x1e, 0x85,
+                                                        0x92, 0x86, 0x91, 0x36, 0x1d, 0x92, 0x50, 0xa,
+                                                        0xd5, 0xd9, 0x6e, 0xd9, 0x52, 0x1d, 0x13, 0xce,
+                                                        0xc8, 0xf8, 0xb9, 0x45, 0x1d, 0xa7, 0xa2, 0x82,
+                                                        0x80, 0xa1, 0x1f, 0x13, 0xd6, 0x7d, 0xa7, 0xa5,
+                                                        0x7c, 0xa5, 0x1b, 0x13, 0xce, 0x44, 0xa, 0x13,
+                                                        0xd6, 0x54, 0x1d, 0x71, 0x73, 0x96, 0x97, 0x73,
+                                                        0x1f, 0x13, 0xce, 0x98, 0x71, 0x72, 0x98, 0x71,
+                                                        0x50, 0x1d, 0xf7, 0x7d, 0xfc, 0x81, 0x23, 0x1d,
+                                                        0xa2, 0x81, 0x98, 0x82, 0x95, 0x1e, 0x85, 0x92,
+                                                        0x86, 0x91, 0x94, 0x1a, 0x13, 0xb6, 0x3b, 0xa,
+                                                        0x13, 0x86, 0x24, 0xa, 0xe, 0x92, 0x50, 0xa,
+                                                        0xcb, 0xf7, 0x16, 0x52, 0x1d, 0x13, 0xdc, 0xd6,
+                                                        0x3f, 0xa, 0x94, 0xfc, 0xb6, 0x23, 0x1d, 0xa2,
+                                                        0x80, 0x97, 0x83, 0x95, 0x1e, 0x85, 0x92, 0x86,
+                                                        0x92, 0x36, 0x1d, 0x92, 0x76, 0xf7, 0xbb, 0xf7,
+                                                        0x54, 0xc1, 0xbb, 0x5b, 0xf7, 0x38, 0xfb, 0x8,
+                                                        0xf7, 0x8, 0x8b, 0xbc, 0x12, 0xa4, 0xf7, 0x26,
+                                                        0x69, 0xf7, 0x38, 0xfb, 0x8, 0xf7, 0x39, 0x13,
+                                                        0xd5, 0x0, 0xf7, 0x1d, 0x94, 0xa, 0x13, 0xee,
+                                                        0x80, 0x7d, 0x1d, 0x1f, 0xf7, 0x31, 0xfc, 0xd5,
+                                                        0x37, 0x1d, 0x3b, 0x1d, 0xfb, 0x0, 0xf8, 0x18,
+                                                        0x15, 0xab, 0xa5, 0xa5, 0xab, 0xab, 0xa5, 0x71,
+                                                        0x6b, 0x6b, 0x71, 0x71, 0x6b, 0x6b, 0x71, 0xa5,
+                                                        0xab, 0x1e, 0xe, 0xd6, 0x7d, 0xca, 0x4c, 0xd1,
+                                                        0xf7, 0x54, 0xb0, 0x8a, 0xf7, 0x51, 0x6b, 0xab,
+                                                        0x12, 0xac, 0xf7, 0x29, 0xfb, 0x18, 0xf7, 0x18,
+                                                        0xf7, 0x6, 0xf7, 0x1e, 0xf7, 0x1d, 0xf7, 0xd,
+                                                        0x13, 0x6d, 0x80, 0xf7, 0xe5, 0xd6, 0x15, 0x37,
+                                                        0xba, 0xcf, 0x86, 0xb0, 0x1b, 0xde, 0xce, 0xb1,
+                                                        0xe4, 0xc1, 0x1f, 0x76, 0x9a, 0x5, 0x72, 0x77,
+                                                        0x69, 0x5c, 0x42, 0x1b, 0xfb, 0x3, 0x8b, 0xf7,
+                                                        0xf, 0xb9, 0x1f, 0xa2, 0xf7, 0x96, 0x7, 0x13,
+                                                        0x93, 0x80, 0xf7, 0x41, 0x8c, 0xfb, 0x1, 0xbf,
+                                                        0x39, 0x1b, 0x4b, 0x65, 0x73, 0x70, 0x71, 0x1f,
+                                                        0xa0, 0x76, 0x66, 0xa9, 0x29, 0x1b, 0x27, 0x47,
+                                                        0x52, 0x47, 0x5f, 0xae, 0x77, 0xa8, 0xb8, 0xa2,
+                                                        0x9d, 0xb3, 0xa1, 0x83, 0x95, 0x84, 0x93, 0x1f,
+                                                        0x84, 0x92, 0x84, 0x91, 0x97, 0x1a, 0x13, 0xad,
+                                                        0x80, 0xa1, 0xaf, 0x97, 0xa8, 0xdb, 0x89, 0x57,
+                                                        0x6e, 0x1e, 0x3b, 0x7, 0xfb, 0x45, 0x52, 0x35,
+                                                        0x6f, 0x23, 0x1a, 0x46, 0xb6, 0x67, 0xd7, 0xe1,
+                                                        0xc6, 0xbc, 0xad, 0xad, 0x1e, 0x68, 0x97, 0x15,
+                                                        0x6c, 0x6e, 0x79, 0x8a, 0x78, 0x1b, 0x5e, 0x83,
+                                                        0xb7, 0xa7, 0xdb, 0xcb, 0xa7, 0xc2, 0x9e, 0x1f,
+                                                        0xf7, 0x1e, 0xb0, 0x15, 0xcb, 0x8b, 0xe9, 0xcf,
+                                                        0xbf, 0x9c, 0x67, 0x32, 0x1e, 0x6a, 0x7, 0xe,
+                                                        0xfb, 0x5f, 0xfb, 0x59, 0x76, 0xf7, 0x63, 0xcb,
+                                                        0x86, 0x1d, 0xea, 0xe8, 0x4e, 0xf7, 0x10, 0x13,
+                                                        0xdc, 0xf7, 0x44, 0x2b, 0x15, 0x4f, 0x1d, 0xb1,
+                                                        0xf7, 0x5, 0x8e, 0xda, 0xc7, 0x49, 0xa6, 0x54,
+                                                        0x7c, 0x1f, 0xa1, 0xbe, 0xd3, 0x8f, 0xc7, 0xb2,
+                                                        0xb6, 0xc8, 0x19, 0x79, 0x9d, 0x5, 0x70, 0x73,
+                                                        0x71, 0x6e, 0x52, 0x1b, 0x3d, 0x4e, 0xdc, 0xf7,
+                                                        0x20, 0xb8, 0x98, 0xf7, 0xf, 0xd9, 0x1f, 0x13,
+                                                        0xea, 0x9a, 0x9f, 0x82, 0x6d, 0x8f, 0x1d, 0x33,
+                                                        0xb0, 0x44, 0x1f, 0x13, 0x4a, 0x2d, 0xfb, 0x1e,
+                                                        0x4e, 0xfb, 0x59, 0xfb, 0x7, 0xd6, 0x27, 0xf7,
+                                                        0x6, 0x80, 0x1f, 0xe, 0x4c, 0x1d, 0x78, 0xfb,
+                                                        0x4, 0x5b, 0x94, 0x1e, 0xfb, 0x1c, 0x79, 0xa,
+                                                        0x13, 0xd8, 0x2b, 0x1d, 0xde, 0xf7, 0xaf, 0x26,
+                                                        0xa, 0x4c, 0x1d, 0x86, 0xfb, 0x9, 0x60, 0x8d,
+                                                        0x1e, 0xfb, 0x23, 0x80, 0xa, 0x1e, 0x13, 0xd8,
+                                                        0x2b, 0x1d, 0x76, 0xf7, 0xaf, 0x28, 0x1d, 0x49,
+                                                        0x1d, 0xd7, 0x83, 0x1d, 0xa4, 0x8a, 0xa, 0x4d,
+                                                        0xa, 0x82, 0xfb, 0x4, 0x5b, 0x92, 0x1e, 0xfb,
+                                                        0x24, 0x80, 0xa, 0x34, 0xa, 0x1e, 0x39, 0x1d,
+                                                        0xfb, 0x1, 0xf7, 0xaf, 0x29, 0x1d, 0xe, 0x49,
+                                                        0x1d, 0xcb, 0xf7, 0x16, 0x98, 0xa, 0x21, 0xf7,
+                                                        0x16, 0xdb, 0xf7, 0x16, 0x13, 0xfa, 0x4d, 0xa,
+                                                        0x7d, 0xfb, 0x4, 0x5b, 0x92, 0x1e, 0xfb, 0x1f,
+                                                        0x79, 0xa, 0x2b, 0x1d, 0x13, 0xf6, 0xfb, 0x3,
+                                                        0xf7, 0xf9, 0x40, 0x1d, 0x3e, 0xa, 0xfb, 0xa6,
+                                                        0x7, 0x5b, 0x7a, 0x88, 0x67, 0x82, 0x1e, 0xf7,
+                                                        0x1f, 0xf8, 0x82, 0x29, 0xa, 0x81, 0x7f, 0xa,
+                                                        0x99, 0x7c, 0xa4, 0x7c, 0x1f, 0xe, 0x3e, 0xa,
+                                                        0xfb, 0xa9, 0x7, 0x5b, 0x7a, 0x8b, 0x67, 0x82,
+                                                        0x1e, 0xae, 0xf8, 0x82, 0x56, 0x1d, 0xf7, 0x22,
+                                                        0xe3, 0x5, 0xa3, 0x9a, 0x9c, 0x95, 0xa7, 0x1a,
+                                                        0xaf, 0x6b, 0x2c, 0xa, 0xe, 0x5d, 0xa, 0xf7,
+                                                        0x0, 0x83, 0x1d, 0xd0, 0x8a, 0xa, 0x67, 0xf8,
+                                                        0xa4, 0x56, 0x1d, 0xf7, 0x3, 0xed, 0xf7, 0x5,
+                                                        0x29, 0x5, 0xc4, 0x6, 0xfb, 0x10, 0xf7, 0x44,
+                                                        0x5, 0x2f, 0x6, 0x46, 0xfd, 0x54, 0x15, 0x33,
+                                                        0xa, 0xe, 0xfc, 0x5, 0xa0, 0x76, 0xf8, 0xad,
+                                                        0x9a, 0x1d, 0x67, 0xf7, 0x13, 0x75, 0xf7, 0x1f,
+                                                        0x69, 0xf7, 0x13, 0x13, 0xd0, 0x49, 0xa, 0x13,
+                                                        0xe8, 0x57, 0xf8, 0xcd, 0x15, 0x6c, 0x1d, 0xf7,
+                                                        0x66, 0x16, 0x6c, 0x1d, 0xe, 0x65, 0xa, 0xf7,
+                                                        0x6e, 0x77, 0x12, 0x5d, 0x1d, 0xfb, 0x1c, 0xf7,
+                                                        0x27, 0x13, 0xf8, 0xf7, 0x40, 0xf7, 0x83, 0x78,
+                                                        0x1d, 0xe4, 0xd5, 0xc8, 0x9c, 0x5a, 0x64, 0xa,
+                                                        0x2c, 0x46, 0x3b, 0x8b, 0xf7, 0x6, 0xf7, 0x0,
+                                                        0x1e, 0x13, 0xf4, 0xf7, 0x3c, 0xf7, 0x55, 0x15,
+                                                        0xab, 0x73, 0x6b, 0x94, 0x6a, 0x1b, 0xfb, 0x1f,
+                                                        0x34, 0x22, 0xfb, 0x15, 0xfb, 0x16, 0xe2, 0xfb,
+                                                        0xf, 0xf7, 0x1f, 0x1f, 0x13, 0xf8, 0xf7, 0x1c,
+                                                        0xe4, 0xf6, 0xf7, 0x26, 0xf7, 0x36, 0x4e, 0xf7,
+                                                        0x2e, 0x3b, 0xc6, 0x1f, 0xe7, 0xba, 0x5a, 0xa9,
+                                                        0x31, 0x5d, 0x55, 0xa8, 0x51, 0x98, 0x5b, 0x8f,
+                                                        0x19, 0x5d, 0x72, 0xb8, 0x83, 0xb9, 0x78, 0xb5,
+                                                        0x6c, 0x19, 0xfb, 0x9, 0x50, 0xbb, 0x6c, 0xf7,
+                                                        0x2, 0xc3, 0xb1, 0x66, 0xa9, 0x5c, 0x9d, 0x54,
+                                                        0x19, 0xe, 0x30, 0x82, 0x1d, 0xd5, 0xd9, 0x6e,
+                                                        0xd9, 0x12, 0xd5, 0x53, 0xa, 0x13, 0xdc, 0xa0,
+                                                        0x41, 0xa, 0x8d, 0x8b, 0xaa, 0xa3, 0x1a, 0x76,
+                                                        0xa, 0x36, 0x60, 0x4f, 0x73, 0x7d, 0x1e, 0x88,
+                                                        0x1d, 0xb3, 0x85, 0x98, 0x83, 0x5e, 0x1a, 0xfb,
+                                                        0xa9, 0x7, 0x5a, 0x7a, 0x8a, 0x67, 0x84, 0x1e,
+                                                        0xd6, 0xf8, 0x97, 0x45, 0x1d, 0xa6, 0xa3, 0x80,
+                                                        0x80, 0xa3, 0x1f, 0x13, 0xec, 0x7e, 0xa6, 0xa5,
+                                                        0x7d, 0xa4, 0x1b, 0x13, 0x10, 0x42, 0xa, 0x6d,
+                                                        0x8f, 0xa, 0x6d, 0x50, 0x1d, 0xe, 0x65, 0xa,
+                                                        0xd7, 0x98, 0x1d, 0x5d, 0x1d, 0x3, 0xf7, 0x40,
+                                                        0xf7, 0x90, 0x78, 0x1d, 0xd7, 0xd5, 0xc8, 0x9c,
+                                                        0x5f, 0x64, 0xa, 0x27, 0x46, 0x3b, 0x8b, 0xf7,
+                                                        0x13, 0xf7, 0x0, 0x1e, 0xfb, 0x27, 0x75, 0x15,
+                                                        0xfb, 0x16, 0xe2, 0xfb, 0x6, 0x70, 0xa, 0xf7,
+                                                        0x4, 0x6f, 0xa, 0xf2, 0x70, 0x1d, 0xfb, 0x6,
+                                                        0xfb, 0x15, 0x1e, 0xf7, 0x8d, 0xf7, 0xbe, 0x56,
+                                                        0x1d, 0x49, 0xd7, 0x64, 0xbd, 0x70, 0xa6, 0x8,
+                                                        0xaa, 0x6c, 0x7c, 0x8c, 0x80, 0x1b, 0x65, 0x80,
+                                                        0x7f, 0xa, 0xa5, 0x75, 0xa4, 0x7b, 0x1f, 0xe,
+                                                        0x65, 0xa, 0xd7, 0x76, 0xf7, 0x4d, 0x32, 0xa,
+                                                        0xf7, 0x27, 0xf7, 0xbf, 0x28, 0x1d, 0x65, 0xa,
+                                                        0xd7, 0x76, 0xf7, 0x44, 0x32, 0xa, 0xc4, 0xf7,
+                                                        0xbf, 0x60, 0xa, 0x65, 0xa, 0xd5, 0xd9, 0x6e,
+                                                        0xd9, 0x12, 0x5d, 0x1d, 0x13, 0xdc, 0x25, 0xa,
+                                                        0xc0, 0xf7, 0xd4, 0x45, 0x1d, 0xa7, 0xa6, 0x7f,
+                                                        0x7f, 0xa4, 0x1f, 0x13, 0xec, 0x7f, 0xa4, 0xa3,
+                                                        0x7e, 0xa3, 0x1b, 0x13, 0x10, 0x42, 0xa, 0x6c,
+                                                        0x8f, 0xa, 0x6e, 0x50, 0x1d, 0xe, 0x65, 0xa,
+                                                        0xcc, 0xf7, 0x15, 0x12, 0xa4, 0xf7, 0x27, 0x30,
+                                                        0xf7, 0x15, 0xdc, 0xf7, 0x15, 0x30, 0xf7, 0x27,
+                                                        0x13, 0xf2, 0x25, 0xa, 0x13, 0xec, 0xc3, 0xf8,
+                                                        0x9, 0x2d, 0x1d, 0x3e, 0x6c, 0xef, 0x27, 0xf7,
+                                                        0x2a, 0xe5, 0xe2, 0x40, 0xcb, 0xef, 0xf7, 0x2c,
+                                                        0x27, 0xef, 0x12, 0xf7, 0x65, 0xf7, 0x2d, 0xfb,
+                                                        0x13, 0xef, 0x13, 0x5a, 0xad, 0xf7, 0x71, 0x15,
+                                                        0xf8, 0x8b, 0xcb, 0xfc, 0x8b, 0x6, 0x13, 0xa5,
+                                                        0xf7, 0x5d, 0xfb, 0x9e, 0x15, 0x6c, 0xa, 0xf8,
+                                                        0x68, 0x4, 0x6c, 0xa, 0xe, 0x44, 0x76, 0xd9,
+                                                        0xaa, 0xf7, 0xd9, 0x76, 0xf7, 0xd, 0xaa, 0xd7,
+                                                        0x77, 0x12, 0xa2, 0xf7, 0x27, 0xfb, 0x25, 0xf7,
+                                                        0x27, 0xf7, 0x31, 0xf7, 0x27, 0x13, 0xfd, 0xf7,
+                                                        0x41, 0xf7, 0x23, 0x15, 0x13, 0xfb, 0x8a, 0xa5,
+                                                        0x8b, 0xa4, 0xa9, 0x1a, 0xf7, 0x6, 0x90, 0xf3,
+                                                        0xd5, 0xad, 0x9f, 0x78, 0x62, 0x96, 0x1e, 0xfb,
+                                                        0x21, 0xfb, 0x83, 0x5, 0xfb, 0x21, 0xfb, 0x7f,
+                                                        0x15, 0xba, 0x6, 0xca, 0xf4, 0x5, 0x7a, 0xa9,
+                                                        0xb0, 0x81, 0xb3, 0x1b, 0xf7, 0x1c, 0xe4, 0xf4,
+                                                        0xf7, 0x19, 0xde, 0x69, 0xd7, 0x55, 0xb6, 0x1f,
+                                                        0xd4, 0xf7, 0xf, 0x5, 0x5d, 0x6, 0x4f, 0x26,
+                                                        0x5, 0x9b, 0x6e, 0x67, 0x94, 0x64, 0x1b, 0xfb,
+                                                        0x1f, 0x34, 0xfb, 0xc, 0xfb, 0x15, 0x3e, 0xaa,
+                                                        0x49, 0xc1, 0x5e, 0x1f, 0xd4, 0xb7, 0x15, 0xf7,
+                                                        0x22, 0xf7, 0x85, 0x5, 0x8d, 0x6, 0x8c, 0x72,
+                                                        0x8c, 0x67, 0x67, 0x1a, 0xfb, 0x13, 0x83, 0x3b,
+                                                        0x46, 0x64, 0x77, 0xa3, 0xb2, 0x81, 0x1e, 0xe,
+                                                        0x30, 0x7d, 0xcc, 0xf8, 0x2e, 0x77, 0xf7, 0x0,
+                                                        0x98, 0x1d, 0xcc, 0x53, 0xa, 0x3, 0x89, 0x1d,
+                                                        0x49, 0x89, 0xa, 0x8d, 0x28, 0xa, 0x5b, 0xf8,
+                                                        0x70, 0x26, 0xa, 0x30, 0x7d, 0xcc, 0xf8, 0x2e,
+                                                        0x77, 0xf7, 0x0, 0x98, 0x1d, 0xcc, 0x53, 0xa,
+                                                        0x3, 0x71, 0xa, 0x27, 0x1d, 0x6c, 0x7, 0xb4,
+                                                        0x84, 0x93, 0x7c, 0x38, 0xa, 0xfb, 0x2c, 0xf8,
+                                                        0x70, 0x28, 0x1d, 0x30, 0x7d, 0xcc, 0xf8, 0x2e,
+                                                        0x77, 0xf7, 0x0, 0x83, 0x1d, 0xcc, 0x53, 0xa,
+                                                        0x3, 0x2f, 0x1d, 0xfb, 0x84, 0xf8, 0x70, 0x29,
+                                                        0x1d, 0xe, 0x30, 0x7d, 0xcc, 0xf8, 0x7a, 0x9a,
+                                                        0x1d, 0xcc, 0xf7, 0x1f, 0x26, 0xf7, 0x13, 0xde,
+                                                        0xf7, 0x13, 0x29, 0xf7, 0x1f, 0x13, 0xe4, 0x2f,
+                                                        0x1d, 0x13, 0xd8, 0xfb, 0x84, 0xf8, 0xba, 0x15,
+                                                        0x6d, 0x1d, 0xf7, 0x66, 0x16, 0x6d, 0x1d, 0xe,
+                                                        0xfb, 0x61, 0xf7, 0x23, 0xf8, 0x9f, 0x77, 0xf7,
+                                                        0x0, 0x76, 0xf7, 0x4d, 0x77, 0x12, 0x9b, 0xf7,
+                                                        0xe, 0xfb, 0xe, 0xf8, 0x64, 0xfb, 0x2b, 0xf7,
+                                                        0x2b, 0x13, 0x8a, 0x13, 0x4, 0xf7, 0x80, 0x7e,
+                                                        0x15, 0x40, 0x72, 0x2f, 0xa, 0x5, 0x13, 0x72,
+                                                        0x9e, 0xbd, 0x9c, 0x8d, 0xa1, 0x8e, 0x8, 0x13,
+                                                        0x74, 0x4d, 0x1d, 0x13, 0xfa, 0x36, 0xa, 0xf7,
+                                                        0x4, 0xf7, 0x14, 0x28, 0x1d, 0x7c, 0xa, 0xf7,
+                                                        0x5f, 0x77, 0x1, 0xd6, 0xf7, 0x1f, 0xf7, 0x36,
+                                                        0xf7, 0x28, 0x3, 0x81, 0xa, 0x90, 0x1d, 0x6f,
+                                                        0x6a, 0xa0, 0xb3, 0x7b, 0x1e, 0x7a, 0x1d, 0x93,
+                                                        0xbe, 0x58, 0xa, 0x7c, 0x1f, 0x89, 0xf7, 0xad,
+                                                        0xfb, 0x56, 0x69, 0x6, 0xaf, 0x84, 0x9e, 0x87,
+                                                        0x5c, 0x1a, 0xfd, 0x4d, 0x92, 0xa, 0xfb, 0x61,
+                                                        0xf7, 0x23, 0xf8, 0xec, 0xf7, 0x15, 0x12, 0x9b,
+                                                        0xf7, 0x56, 0xfb, 0x15, 0xf7, 0x15, 0xdc, 0xf7,
+                                                        0x15, 0x13, 0xe8, 0xf7, 0x80, 0x7e, 0x15, 0x40,
+                                                        0x72, 0x2b, 0xa, 0x13, 0xd8, 0xa2, 0xf7, 0x5e,
+                                                        0x2d, 0x1d, 0x5d, 0xa, 0x1, 0xd0, 0x8a, 0xa,
+                                                        0x49, 0xa, 0xe, 0x9f, 0x8b, 0xaa, 0xf8, 0xf6,
+                                                        0x60, 0x1d, 0x38, 0x96, 0x1d, 0xf7, 0x59, 0x7,
+                                                        0xf7, 0xf, 0xd7, 0x5, 0xc8, 0x7, 0xfb, 0xf,
+                                                        0x3f, 0x5, 0xf7, 0x6a, 0x7, 0xc7, 0xaa, 0x9e,
+                                                        0xd1, 0x8e, 0x1e, 0xae, 0xfb, 0xf1, 0x68, 0x7,
+                                                        0xb8, 0x88, 0xb4, 0x7e, 0x49, 0x1a, 0xfb, 0xc9,
+                                                        0x7, 0x3a, 0x5a, 0x5, 0x4e, 0x7, 0xdc, 0xbc,
+                                                        0x5, 0x25, 0x7, 0x62, 0x6d, 0x87, 0x53, 0x8b,
+                                                        0xa, 0xfc, 0x5, 0x8b, 0xad, 0xf9, 0x16, 0x77,
+                                                        0x1, 0xce, 0x8a, 0xa, 0x9b, 0x16, 0x99, 0xa,
+                                                        0x64, 0x81, 0xaa, 0xa8, 0x1f, 0xf7, 0xd1, 0x7,
+                                                        0xec, 0xdb, 0x5, 0xbd, 0x7, 0x2a, 0x3b, 0x5,
+                                                        0xf7, 0x6b, 0x8d, 0xa, 0xfb, 0x68, 0x7, 0x32,
+                                                        0x43, 0x5, 0x59, 0x7, 0xe4, 0xd3, 0x5, 0xfb,
+                                                        0x78, 0x97, 0x1d, 0xf7, 0xf5, 0x8b, 0xa6, 0x70,
+                                                        0xae, 0x78, 0x76, 0xf7, 0xe6, 0xac, 0xf7, 0xa7,
+                                                        0xae, 0x73, 0xab, 0x12, 0xa1, 0xf7, 0x3e, 0xf7,
+                                                        0xac, 0xf7, 0x2f, 0x13, 0x97, 0xf8, 0x6c, 0xf7,
+                                                        0x68, 0x15, 0xfb, 0x14, 0x8b, 0x52, 0x21, 0x34,
+                                                        0x34, 0xa7, 0xf7, 0xa1, 0xf7, 0x9, 0x9f, 0xf7,
+                                                        0x67, 0xf7, 0x35, 0xee, 0x8b, 0x51, 0x30, 0x1e,
+                                                        0xf7, 0x2f, 0xfb, 0x3e, 0x15, 0xf7, 0xc, 0x93,
+                                                        0x46, 0x33, 0x98, 0x1f, 0xac, 0xf7, 0xe6, 0x6a,
+                                                        0x6, 0xfb, 0x2, 0x73, 0x8d, 0x65, 0xfb, 0xb,
+                                                        0x1b, 0xf7, 0x8d, 0x7, 0x13, 0x9b, 0xa3, 0x9b,
+                                                        0x8d, 0xc4, 0xf7, 0x43, 0x99, 0x42, 0x2e, 0x9a,
+                                                        0x1e, 0xaf, 0xf7, 0x5d, 0xfc, 0x30, 0x6, 0x13,
+                                                        0x37, 0x79, 0xfb, 0x4, 0x93, 0x79, 0x1b, 0xfb,
+                                                        0xc6, 0x57, 0xfb, 0x86, 0x2c, 0xfb, 0x79, 0xf7,
+                                                        0x19, 0xfb, 0xf, 0xf7, 0x5e, 0x1f, 0x13, 0x9b,
+                                                        0xc3, 0xa7, 0x90, 0xcf, 0x1b, 0xf8, 0x42, 0x6,
+                                                        0xb5, 0xf7, 0x67, 0x5, 0x70, 0x6, 0x13, 0x5b,
+                                                        0xfb, 0x33, 0x47, 0x2c, 0x7a, 0x2b, 0x1b, 0x47,
+                                                        0x8b, 0xa2, 0xa4, 0x1f, 0xe, 0xd6, 0x7d, 0xa9,
+                                                        0x6d, 0xd3, 0xf7, 0x4f, 0xb0, 0xf7, 0x36, 0xa8,
+                                                        0x12, 0xa1, 0xf7, 0x25, 0xf7, 0x1c, 0xf7, 0x1c,
+                                                        0xf7, 0x18, 0xf7, 0x11, 0x13, 0x7e, 0xf8, 0x50,
+                                                        0xf7, 0xae, 0x15, 0xe0, 0x8c, 0x8b, 0xd8, 0xc9,
+                                                        0x1b, 0xc4, 0x8f, 0x4e, 0x26, 0x8e, 0x1f, 0xfb,
+                                                        0x50, 0xfb, 0x8c, 0x15, 0x7a, 0x9a, 0xa5, 0x6c,
+                                                        0xda, 0x1b, 0xf6, 0xbe, 0xd4, 0xbd, 0xae, 0x1f,
+                                                        0x77, 0x9b, 0x5, 0x6a, 0x6e, 0x6e, 0x69, 0x4c,
+                                                        0x1b, 0xfb, 0x1, 0x87, 0xf7, 0xe, 0xcc, 0x8d,
+                                                        0x1f, 0xf7, 0x90, 0x6, 0xf7, 0xe, 0x89, 0x64,
+                                                        0xf5, 0xfb, 0x28, 0x1b, 0x4e, 0x5d, 0x6f, 0x76,
+                                                        0x70, 0x1f, 0x9b, 0x7b, 0x6a, 0xac, 0x38, 0x1b,
+                                                        0xfb, 0x19, 0x35, 0xfb, 0x2, 0xfb, 0x1c, 0xfb,
+                                                        0xd, 0xd9, 0xfb, 0xc, 0xf7, 0x21, 0xe2, 0xae,
+                                                        0xaa, 0x9c, 0x9f, 0x1f, 0x40, 0xf7, 0x7, 0x15,
+                                                        0x13, 0xbe, 0x4b, 0x7c, 0x46, 0x57, 0x5e, 0x6e,
+                                                        0x8b, 0xf7, 0x67, 0xf7, 0x3e, 0xa5, 0xba, 0xbb,
+                                                        0xc0, 0x99, 0x66, 0x2b, 0x1e, 0xe, 0x30, 0x78,
+                                                        0xac, 0xf8, 0x76, 0x76, 0xf7, 0x4d, 0xaa, 0xf7,
+                                                        0x73, 0x8e, 0xa, 0x17, 0x7c, 0x1d, 0x98, 0x94,
+                                                        0x1d, 0xc3, 0x1b, 0x13, 0xfc, 0x47, 0x1d, 0x13,
+                                                        0xbc, 0x85, 0xa, 0x80, 0x7d, 0x90, 0x91, 0x7b,
+                                                        0x1f, 0x95, 0x71, 0x68, 0x97, 0x5a, 0x46, 0x1d,
+                                                        0xf7, 0x59, 0xf8, 0x92, 0x35, 0xa, 0xfb, 0x96,
+                                                        0x7d, 0xad, 0x7f, 0x76, 0xf8, 0x59, 0xac, 0x12,
+                                                        0xa6, 0xef, 0xf7, 0x1e, 0xeb, 0x13, 0x78, 0xa4,
+                                                        0x7e, 0x15, 0xa4, 0x6, 0x9f, 0x95, 0x91, 0x93,
+                                                        0x96, 0x1b, 0x90, 0x9f, 0x82, 0x83, 0xa4, 0x1f,
+                                                        0x13, 0xb8, 0x85, 0x9f, 0xa4, 0x85, 0xa1, 0x1b,
+                                                        0xe8, 0xd5, 0xc6, 0xea, 0x1f, 0xf7, 0x38, 0xfb,
+                                                        0x7e, 0x74, 0xf1, 0x1a, 0xaa, 0xa2, 0xa5, 0xaf,
+                                                        0xc4, 0xbe, 0x60, 0x44, 0xa0, 0x1e, 0xa4, 0xf7,
+                                                        0x25, 0x75, 0x6, 0x83, 0x88, 0x87, 0x7f, 0x79,
+                                                        0x1b, 0x81, 0x7b, 0x91, 0x91, 0x77, 0x1f, 0x90,
+                                                        0x79, 0x76, 0x90, 0x75, 0x1b, 0x2f, 0x48, 0x50,
+                                                        0x33, 0x1f, 0xfb, 0x2e, 0xf7, 0x82, 0x91, 0x2f,
+                                                        0x1a, 0x6d, 0x76, 0x67, 0x59, 0xfb, 0x3, 0x73,
+                                                        0xf4, 0xa6, 0x85, 0x1e, 0x6f, 0x6, 0x13, 0x78,
+                                                        0xf7, 0xf, 0xf8, 0xc, 0x35, 0xa, 0xd6, 0x4e,
+                                                        0x1d, 0xd3, 0xf7, 0x15, 0x12, 0xf7, 0x68, 0xf7,
+                                                        0x15, 0x4c, 0xf7, 0x36, 0x79, 0xf7, 0x15, 0x13,
+                                                        0xe8, 0x69, 0x1d, 0x8d, 0xde, 0x1a, 0xf7, 0x42,
+                                                        0x7, 0xf7, 0x4b, 0xf7, 0xc1, 0x9f, 0xab, 0xb0,
+                                                        0x62, 0xa, 0xb0, 0x89, 0x64, 0x1a, 0xfb, 0x2a,
+                                                        0xfb, 0xa0, 0x5, 0x42, 0x1d, 0x13, 0xf4, 0xa6,
+                                                        0xf9, 0x9d, 0x2d, 0x1d, 0x8c, 0xa, 0xf7, 0x82,
+                                                        0x77, 0x1, 0xa7, 0xf8, 0xf2, 0x3, 0x39, 0xa,
+                                                        0xf7, 0x97, 0xf9, 0x66, 0x35, 0xa, 0x87, 0x1d,
+                                                        0xe3, 0x83, 0x1d, 0xb1, 0xa5, 0x87, 0xa, 0x6f,
+                                                        0x8e, 0x1d, 0x61, 0x8b, 0x62, 0x8c, 0xf7, 0x7b,
+                                                        0xf8, 0x27, 0x18, 0xa5, 0xfc, 0x7, 0x7, 0x84,
+                                                        0xfb, 0x22, 0x5, 0xa5, 0x6, 0xa5, 0xf7, 0x1,
+                                                        0xba, 0x8b, 0xf7, 0xa, 0x8c, 0xfb, 0x7e, 0xfc,
+                                                        0x25, 0x18, 0xf7, 0x2f, 0xf8, 0x88, 0x35, 0xa,
+                                                        0xfb, 0x1a, 0x76, 0xf8, 0xb9, 0xb9, 0xf7, 0x13,
+                                                        0xf7, 0x1f, 0x6d, 0xa9, 0x12, 0x8b, 0xf7, 0x0,
+                                                        0xd6, 0xf7, 0x1f, 0x13, 0xdc, 0xd5, 0xf8, 0x1e,
+                                                        0x15, 0xf7, 0x8, 0x6, 0x7e, 0xfc, 0x2a, 0x5,
+                                                        0x31, 0x88, 0x65, 0x74, 0x73, 0x1b, 0x7f, 0x81,
+                                                        0x93, 0x92, 0x1f, 0x98, 0x9d, 0x8d, 0xa5, 0x1a,
+                                                        0xad, 0x70, 0x9a, 0x70, 0x76, 0x6a, 0x7e, 0x5e,
+                                                        0x6a, 0xa0, 0x5f, 0xd3, 0x1e, 0x13, 0x54, 0xf7,
+                                                        0x1c, 0xc4, 0xf7, 0x23, 0xf7, 0x25, 0x9d, 0x1f,
+                                                        0x96, 0xe2, 0x8a, 0xc6, 0x93, 0xf7, 0x7, 0x8,
+                                                        0xf7, 0xe, 0xb9, 0xfb, 0xe, 0xe5, 0x6, 0xae,
+                                                        0x8b, 0xf7, 0x3, 0xcc, 0x9e, 0x8e, 0x7e, 0x89,
+                                                        0x1e, 0x85, 0x79, 0x77, 0x76, 0x1a, 0x13, 0xec,
+                                                        0x6f, 0xa5, 0x78, 0xa8, 0xa8, 0xa2, 0xa7, 0xab,
+                                                        0x1e, 0x13, 0x60, 0x9a, 0x7d, 0xcb, 0x2a, 0xfb,
+                                                        0x31, 0x73, 0xfb, 0x54, 0x41, 0x7f, 0x1e, 0xfb,
+                                                        0xc, 0x6, 0xe, 0xfb, 0xce, 0xf8, 0xb9, 0x83,
+                                                        0x1d, 0x89, 0xf8, 0xa4, 0x60, 0xa, 0xfb, 0xce,
+                                                        0xf8, 0xb9, 0x83, 0x1d, 0xf7, 0xc, 0xf8, 0xa4,
+                                                        0x52, 0xa, 0x51, 0x6, 0xfb, 0x3, 0x28, 0xfb,
+                                                        0x3, 0xee, 0x5, 0x52, 0x6, 0xe, 0xfb, 0xce,
+                                                        0xf8, 0xa4, 0xd7, 0x3f, 0xf7, 0x37, 0x12, 0x13,
+                                                        0x40, 0x9a, 0xf9, 0x47, 0x15, 0x21, 0xc5, 0x52,
+                                                        0xe8, 0xec, 0xc2, 0xca, 0xef, 0x1e, 0x5f, 0x6,
+                                                        0x13, 0x80, 0x6c, 0x83, 0x7c, 0x53, 0x37, 0x1b,
+                                                        0x13, 0x40, 0x30, 0x7f, 0xc6, 0xa7, 0x86, 0x1f,
+                                                        0xe, 0xfb, 0xce, 0xf8, 0xad, 0xf7, 0x16, 0x1,
+                                                        0xf2, 0xf7, 0x13, 0x3, 0xf2, 0xf8, 0xef, 0x15,
+                                                        0x66, 0xa6, 0x6e, 0xb0, 0xae, 0xa7, 0xa8, 0xb0,
+                                                        0xb0, 0x6f, 0xa6, 0x68, 0x67, 0x6f, 0x6f, 0x67,
+                                                        0x1e, 0xe, 0xfb, 0xce, 0xf8, 0xa3, 0xf7, 0x39,
+                                                        0xfb, 0x9, 0xf7, 0x9, 0xfb, 0x9, 0xf7, 0x39,
+                                                        0x12, 0xc7, 0xf7, 0x3a, 0xfb, 0x9, 0xf7, 0x9,
+                                                        0xfb, 0x9, 0xf7, 0x38, 0x13, 0x90, 0xc7, 0x94,
+                                                        0xa, 0x13, 0x24, 0xc5, 0xbb, 0xba, 0xc6, 0xc5,
+                                                        0x5c, 0xbc, 0x51, 0x1f, 0x13, 0x90, 0x51, 0x59,
+                                                        0x5b, 0x50, 0x1f, 0x13, 0x48, 0xbc, 0x16, 0x6b,
+                                                        0xa6, 0x71, 0xab, 0xab, 0xa5, 0xa5, 0xab, 0xab,
+                                                        0x71, 0xa6, 0x6b, 0x6b, 0x70, 0x70, 0x6b, 0x1e,
+                                                        0xe, 0xfb, 0xce, 0xfb, 0x41, 0xd0, 0xf7, 0x28,
+                                                        0x77, 0x1, 0xe5, 0xdf, 0x3, 0xf7, 0x31, 0xb7,
+                                                        0x15, 0x5b, 0x5f, 0x78, 0x5e, 0x5e, 0x1a, 0x46,
+                                                        0xd2, 0x7d, 0xb3, 0xad, 0xc9, 0xa6, 0xbb, 0xa1,
+                                                        0x1e, 0x75, 0xa1, 0x5, 0x7d, 0x75, 0x7e, 0x7d,
+                                                        0x74, 0x1b, 0x63, 0x72, 0x9d, 0xba, 0xa4, 0x98,
+                                                        0xb2, 0x8f, 0x9e, 0x1f, 0xe, 0xfb, 0xce, 0xf8,
+                                                        0xb7, 0xd9, 0x6e, 0xd9, 0x12, 0x13, 0x80, 0x7b,
+                                                        0xf8, 0xb7, 0x15, 0xb5, 0x6, 0x13, 0x40, 0x9d,
+                                                        0x8c, 0x9b, 0xaa, 0xab, 0x1b, 0xb5, 0xa4, 0x7b,
+                                                        0x7e, 0xa3, 0x1f, 0x80, 0x9e, 0x9d, 0x82, 0xa4,
+                                                        0x1b, 0x42, 0xa, 0x74, 0x74, 0x92, 0x94, 0x75,
+                                                        0x1f, 0x99, 0x68, 0x6c, 0x9e, 0x7a, 0x1b, 0x2f,
+                                                        0x78, 0x2f, 0x68, 0x84, 0x1f, 0xe, 0xfb, 0xce,
+                                                        0xf8, 0xa4, 0xf7, 0x4d, 0x1, 0x7e, 0xf8, 0xa4,
+                                                        0x15, 0xc0, 0x6, 0xf7, 0x25, 0x23, 0xa, 0xcc,
+                                                        0xfb, 0x31, 0x15, 0xc1, 0x22, 0xa, 0xe, 0xf7,
+                                                        0x49, 0xe5, 0x1, 0xf7, 0x49, 0x4, 0xf8, 0x88,
+                                                        0xca, 0xfc, 0x88, 0x6, 0xe, 0xf7, 0xf5, 0xf7,
+                                                        0x49, 0xe5, 0x1, 0xf7, 0x49, 0x4, 0xfa, 0x7c,
+                                                        0xc9, 0xfe, 0x7c, 0x6, 0xe, 0xfb, 0xce, 0xf8,
+                                                        0xd, 0x83, 0xa, 0xd1, 0xcf, 0x47, 0xf7, 0x4c,
+                                                        0x13, 0xd0, 0xf7, 0x8b, 0xf9, 0x31, 0x15, 0x5b,
+                                                        0xa, 0xa5, 0x4d, 0xd4, 0xb9, 0xb2, 0xa9, 0xbf,
+                                                        0xca, 0x5d, 0x9b, 0x6f, 0x1e, 0x13, 0xe0, 0x68,
+                                                        0xa, 0xe, 0xfb, 0xce, 0xf8, 0xd, 0x7b, 0xa,
+                                                        0xec, 0xf7, 0xf8, 0x15, 0x47, 0xa, 0xfb, 0xce,
+                                                        0xfb, 0x33, 0x7b, 0xa, 0xe1, 0xfb, 0x32, 0x15,
+                                                        0x96, 0x75, 0x5, 0x47, 0xa, 0xf7, 0xf8, 0xf7,
+                                                        0x35, 0xf7, 0x42, 0x77, 0x12, 0xab, 0xcf, 0x47,
+                                                        0xf7, 0x4c, 0xe1, 0xcf, 0x47, 0xf7, 0x4c, 0x13,
+                                                        0xd8, 0xf7, 0x65, 0xf9, 0x31, 0x15, 0x57, 0xa,
+                                                        0x13, 0xe4, 0x68, 0xa, 0xf7, 0xa2, 0x16, 0x57,
+                                                        0xa, 0x13, 0xe8, 0x68, 0xa, 0xe, 0xf8, 0xd,
+                                                        0x68, 0x1d, 0xf7, 0xc2, 0xf7, 0xf8, 0x15, 0x5f,
+                                                        0xa, 0x13, 0xe4, 0x3f, 0x1d, 0xfb, 0x97, 0x75,
+                                                        0x15, 0x5f, 0xa, 0x13, 0xd8, 0x3f, 0x1d, 0xe,
+                                                        0xfb, 0x33, 0x68, 0x1d, 0xf7, 0xb7, 0xfb, 0x32,
+                                                        0x15, 0x56, 0xa, 0x13, 0xe4, 0x3f, 0x1d, 0xfb,
+                                                        0xa2, 0x16, 0x56, 0xa, 0x13, 0xd8, 0x3f, 0x1d,
+                                                        0xe, 0xfb, 0x5, 0x76, 0xf8, 0xae, 0xf5, 0xf7,
+                                                        0x49, 0x77, 0x12, 0xf7, 0x56, 0xf7, 0x5, 0x46,
+                                                        0xa7, 0x13, 0xe8, 0xf7, 0x84, 0xfb, 0x1a, 0x15,
+                                                        0xa0, 0x6, 0x90, 0xf7, 0x2e, 0x90, 0xf7, 0x14,
+                                                        0xb4, 0xf6, 0x91, 0x98, 0x19, 0x8e, 0x91, 0x4d,
+                                                        0xa6, 0x8d, 0xf7, 0x25, 0x8, 0xa8, 0xa0, 0x83,
+                                                        0x83, 0x9d, 0x1f, 0x7f, 0xa4, 0x9f, 0x7d, 0xa7,
+                                                        0x1b, 0xaa, 0x9f, 0xa8, 0xa7, 0xa4, 0x7c, 0xa3,
+                                                        0x66, 0x71, 0x79, 0x7d, 0x7f, 0x6f, 0x1f, 0x7a,
+                                                        0x84, 0x76, 0x84, 0x6d, 0x87, 0x8a, 0xb3, 0x91,
+                                                        0xa4, 0x93, 0x9f, 0x8, 0x13, 0xf0, 0x99, 0xad,
+                                                        0x9e, 0x9b, 0xb1, 0x1a, 0xbb, 0x5f, 0x8f, 0x7e,
+                                                        0x61, 0x7d, 0x6a, 0x71, 0x67, 0xa0, 0x84, 0x98,
+                                                        0x62, 0x1e, 0x13, 0xe8, 0x91, 0x78, 0x8f, 0x72,
+                                                        0x65, 0x1a, 0x6d, 0x8d, 0x78, 0x92, 0x7b, 0x92,
+                                                        0x8, 0x98, 0x70, 0x7c, 0x9a, 0x6b, 0x1b, 0x66,
+                                                        0x7c, 0x72, 0x72, 0x6f, 0x9f, 0x6e, 0xaa, 0xae,
+                                                        0x96, 0x9a, 0x98, 0xa8, 0x1f, 0x9a, 0x92, 0x9f,
+                                                        0x91, 0xa9, 0x8d, 0x8, 0xfb, 0x26, 0x53, 0x72,
+                                                        0x8d, 0x85, 0x1e, 0x8e, 0x83, 0xb7, 0xfb, 0x5,
+                                                        0x8f, 0xfb, 0x14, 0x8, 0xe, 0xf7, 0x83, 0x8a,
+                                                        0x15, 0x87, 0x60, 0x63, 0x55, 0x63, 0x1a, 0x6b,
+                                                        0xa1, 0x6f, 0xac, 0xac, 0xa1, 0xa7, 0xab, 0xb3,
+                                                        0x63, 0xc1, 0x87, 0xb6, 0x1e, 0x67, 0x1d, 0x8e,
+                                                        0xad, 0xa0, 0xa9, 0xa7, 0x9e, 0x8, 0x5c, 0xaf,
+                                                        0x87, 0xb9, 0xbb, 0x1a, 0xbb, 0x8f, 0xb9, 0xba,
+                                                        0xaf, 0x1e, 0x6f, 0x9e, 0x76, 0xa9, 0x88, 0xad,
+                                                        0x8, 0x67, 0x1d, 0x8f, 0xb6, 0xb3, 0xc1, 0xb3,
+                                                        0x1a, 0xab, 0x75, 0xa7, 0x6a, 0x6a, 0x75, 0x6f,
+                                                        0x6b, 0x63, 0xb3, 0x55, 0x8f, 0x60, 0x1e, 0x67,
+                                                        0xa, 0x88, 0x69, 0x76, 0x6d, 0x6f, 0x78, 0x8,
+                                                        0xba, 0x67, 0x8f, 0x5d, 0x5b, 0x1a, 0x5b, 0x87,
+                                                        0x5d, 0x5c, 0x67, 0x1e, 0xa7, 0x78, 0xa0, 0x6d,
+                                                        0x8e, 0x69, 0x8, 0x67, 0xa, 0xe, 0xfb, 0xbd,
+                                                        0xf7, 0x6f, 0x76, 0xf7, 0xac, 0x77, 0x1, 0xae,
+                                                        0xf7, 0xe6, 0x15, 0x3c, 0xcb, 0x4e, 0xd7, 0xda,
+                                                        0xc8, 0xc8, 0xda, 0xd8, 0x4e, 0xca, 0x3c, 0x3f,
+                                                        0x4b, 0x4c, 0x3e, 0x1e, 0xe, 0xf7, 0xf5, 0x7e,
+                                                        0xf7, 0x3d, 0x1, 0xdd, 0xf7, 0x3d, 0xf7, 0x38,
+                                                        0xf7, 0x3d, 0xf7, 0x38, 0xf7, 0x3d, 0x14, 0x70,
+                                                        0xdd, 0xd4, 0x15, 0x4a, 0xa, 0xf7, 0xe1, 0x16,
+                                                        0x4a, 0xa, 0xf7, 0xe1, 0x16, 0x4a, 0xa, 0xe,
+                                                        0xf7, 0xf5, 0x7d, 0xa3, 0x87, 0x76, 0xf7, 0xe1,
+                                                        0xa3, 0x8a, 0x76, 0xb8, 0x76, 0xf7, 0xc8, 0xa3,
+                                                        0x8c, 0x77, 0x12, 0xa3, 0x97, 0xa, 0xa1, 0x97,
+                                                        0xa, 0xaf, 0x97, 0xa, 0x13, 0xad, 0xf8, 0xf7,
+                                                        0xec, 0xf7, 0x38, 0x15, 0x30, 0x1d, 0xf7, 0x70,
+                                                        0x16, 0x30, 0x1d, 0x13, 0x9d, 0xf8, 0xfd, 0x94,
+                                                        0xf7, 0xe2, 0x15, 0x30, 0x1d, 0x13, 0x6b, 0xf8,
+                                                        0x47, 0x76, 0x1d, 0xfb, 0xce, 0x82, 0xa, 0x1,
+                                                        0xbe, 0xf7, 0x75, 0x88, 0xa, 0x81, 0x95, 0x9b,
+                                                        0x7e, 0x96, 0x1b, 0x91, 0x90, 0x75, 0xa, 0x96,
+                                                        0x85, 0x8e, 0x85, 0x80, 0x79, 0x7e, 0x82, 0x81,
+                                                        0x1e, 0xfb, 0x5f, 0xfb, 0x38, 0x5, 0xe, 0xfb,
+                                                        0xce, 0x82, 0xa, 0x1, 0xf7, 0x26, 0x91, 0xa,
+                                                        0x80, 0x91, 0x88, 0x91, 0x96, 0x9d, 0x99, 0x93,
+                                                        0x95, 0x59, 0xa, 0x95, 0x81, 0x7b, 0x98, 0x80,
+                                                        0x1b, 0x84, 0x87, 0x86, 0x7e, 0x6d, 0xe6, 0x25,
+                                                        0xa6, 0x62, 0x1f, 0xe, 0xfc, 0x74, 0x94, 0x76,
+                                                        0xf9, 0x50, 0x77, 0x1, 0xfb, 0x2, 0x7f, 0x15,
+                                                        0xf8, 0x4b, 0xf9, 0x50, 0x5, 0x53, 0x6, 0xfc,
+                                                        0x4d, 0xfd, 0x50, 0x5, 0xe, 0xd6, 0x8b, 0xe7,
+                                                        0xf7, 0x3e, 0xb3, 0xe4, 0xb3, 0xe3, 0x76, 0xf7,
+                                                        0x34, 0xab, 0x1, 0xf6, 0xf7, 0x3b, 0x3, 0x94,
+                                                        0xf7, 0x9a, 0x15, 0xed, 0x6, 0xfb, 0x2a, 0x9a,
+                                                        0xf7, 0x31, 0xfb, 0x4, 0xf7, 0x15, 0x1b, 0xf7,
+                                                        0xb, 0xf3, 0xc0, 0xe2, 0xc5, 0x1f, 0x77, 0x95,
+                                                        0x5, 0x64, 0x51, 0x4c, 0x78, 0x51, 0x1b, 0xfb,
+                                                        0x6, 0x2c, 0xca, 0xf6, 0x84, 0x1f, 0xf7, 0xb8,
+                                                        0x6, 0x99, 0xb3, 0x5, 0xfb, 0xc7, 0x6, 0x8a,
+                                                        0x9c, 0x8a, 0x9a, 0x9a, 0x1a, 0x99, 0x8b, 0x98,
+                                                        0x8d, 0x9a, 0x1e, 0xf7, 0xd9, 0x6, 0x9a, 0xb3,
+                                                        0x5, 0xfb, 0xe3, 0x6, 0xf7, 0x20, 0x98, 0xc0,
+                                                        0xe2, 0xf5, 0x1b, 0xf7, 0x11, 0xc8, 0x4a, 0x2c,
+                                                        0x96, 0x1f, 0xa5, 0xf7, 0x26, 0x6, 0xa4, 0x49,
+                                                        0x4b, 0xa0, 0x23, 0x1b, 0xfb, 0x18, 0xfb, 0x1a,
+                                                        0x75, 0xfb, 0x81, 0x4d, 0x1f, 0x34, 0x6, 0x7c,
+                                                        0x63, 0x5, 0xeb, 0x6, 0x8a, 0x7d, 0x8a, 0x7c,
+                                                        0x7d, 0x1a, 0x7c, 0x8b, 0x7c, 0x8c, 0x7b, 0x1e,
+                                                        0x3b, 0x6, 0xe, 0xf7, 0xf5, 0xf7, 0xa4, 0xac,
+                                                        0x7e, 0x76, 0xf8, 0x8, 0xac, 0x73, 0xa3, 0x12,
+                                                        0xf7, 0x32, 0xe8, 0xf7, 0x8a, 0xa8, 0xf7, 0xc4,
+                                                        0xe8, 0x13, 0x9e, 0xf7, 0x0, 0xf7, 0xa4, 0x15,
+                                                        0xf7, 0x56, 0xac, 0x6, 0x57, 0x8f, 0x8c, 0x8f,
+                                                        0xb3, 0x1a, 0xf7, 0xbf, 0xb9, 0x7, 0xb3, 0x9d,
+                                                        0x6e, 0x68, 0x93, 0x1f, 0xa2, 0xe3, 0xfb, 0xfe,
+                                                        0x33, 0xa2, 0x6, 0xae, 0x93, 0x9c, 0xa8, 0xb3,
+                                                        0x1b, 0xb9, 0xfb, 0xbf, 0x6, 0x63, 0x8c, 0x87,
+                                                        0x58, 0x87, 0x1e, 0xf7, 0xe5, 0x6a, 0x15, 0xf7,
+                                                        0x19, 0xac, 0x6, 0x5c, 0x8e, 0x86, 0x91, 0xbd,
+                                                        0x1a, 0xf7, 0x5b, 0x8d, 0x7, 0x13, 0x6e, 0xf7,
+                                                        0x20, 0xfb, 0xb8, 0x5, 0x98, 0x6, 0xf7, 0x27,
+                                                        0xf7, 0xba, 0x5, 0x8d, 0xfb, 0x68, 0x6, 0x13,
+                                                        0xae, 0x63, 0x8d, 0x87, 0x57, 0x87, 0x1e, 0x6a,
+                                                        0xf7, 0x56, 0xac, 0x7, 0x57, 0x8f, 0x8c, 0x8f,
+                                                        0xb3, 0x1a, 0xf7, 0x86, 0x7, 0xab, 0x92, 0x99,
+                                                        0xba, 0x8d, 0x1e, 0xac, 0xfb, 0xa, 0x7, 0xfb,
+                                                        0x2b, 0xfb, 0xb5, 0xfb, 0x22, 0xf7, 0xb5, 0x5,
+                                                        0xfb, 0x1f, 0x6a, 0x6, 0xa8, 0xa6, 0x81, 0x6b,
+                                                        0x99, 0x1f, 0xfb, 0x81, 0x7, 0x59, 0x86, 0x85,
+                                                        0x5c, 0x88, 0x1e, 0xe, 0x3e, 0xf7, 0x65, 0xcb,
+                                                        0x1, 0xac, 0xf7, 0x65, 0x15, 0xf8, 0x8c, 0xcb,
+                                                        0xfc, 0x8c, 0x6, 0xe, 0x30, 0x8b, 0xad, 0xf8,
+                                                        0x13, 0xb7, 0xf7, 0x5c, 0xa9, 0x12, 0xd2, 0xf7,
+                                                        0x1f, 0xf7, 0x1e, 0xf7, 0x10, 0xfb, 0x10, 0xf7,
+                                                        0x1f, 0x13, 0xf8, 0x75, 0x1d, 0xf3, 0x7, 0xa9,
+                                                        0x8f, 0x7e, 0x76, 0x1f, 0xfb, 0xb8, 0x7, 0x73,
+                                                        0x8a, 0x6e, 0x5d, 0x87, 0x6a, 0xa, 0x13, 0xf4,
+                                                        0x65, 0x8c, 0x80, 0x9f, 0xaf, 0x1a, 0xf8, 0x12,
+                                                        0x7, 0x86, 0x56, 0x49, 0x84, 0x57, 0x1b, 0x21,
+                                                        0x6, 0xf7, 0x15, 0x88, 0xd2, 0xe0, 0xb7, 0x9b,
+                                                        0x78, 0x82, 0x1e, 0x87, 0x82, 0x7f, 0x73, 0x1a,
+                                                        0x5c, 0xbc, 0x84, 0x99, 0x1e, 0x13, 0xf8, 0x90,
+                                                        0xc8, 0x8c, 0xc7, 0xdf, 0xfb, 0x3a, 0x92, 0x7d,
+                                                        0xfb, 0x6c, 0x87, 0xfb, 0x38, 0x49, 0x8a, 0x7a,
+                                                        0xa, 0xe, 0x30, 0xa0, 0x76, 0xf8, 0x35, 0xb7,
+                                                        0xf7, 0x59, 0xac, 0x8a, 0x77, 0x12, 0xd2, 0x53,
+                                                        0xa, 0x13, 0xdc, 0x75, 0x1d, 0xf7, 0x1e, 0xfb,
+                                                        0xda, 0x7, 0x78, 0x8a, 0x6b, 0x5d, 0x85, 0x6a,
+                                                        0xa, 0x59, 0x8f, 0x8c, 0xb6, 0x95, 0x1a, 0xf8,
+                                                        0xeb, 0x78, 0x7, 0x5c, 0x6d, 0x5, 0x13, 0xec,
+                                                        0xaa, 0x47, 0x4e, 0x8b, 0x87, 0x1b, 0xfb, 0x52,
+                                                        0x72, 0xfb, 0x1a, 0x2b, 0x89, 0x7a, 0xa, 0xf7,
+                                                        0x58, 0xf8, 0x3f, 0x15, 0xc9, 0x7, 0xc6, 0x87,
+                                                        0xd7, 0xdd, 0xae, 0x9c, 0x84, 0x7b, 0x1e, 0x83,
+                                                        0x7e, 0x79, 0x7d, 0x1a, 0x78, 0x97, 0x7c, 0x94,
+                                                        0x89, 0x1e, 0x29, 0x7, 0xe, 0x78, 0x9e, 0xf8,
+                                                        0x61, 0x97, 0xf7, 0x5f, 0x9a, 0x6, 0xf7, 0xa0,
+                                                        0x92, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc,
+                                                        0x9, 0xb5, 0xa, 0xf7, 0x1d, 0xb, 0x8c, 0xc,
+                                                        0xe, 0xf8, 0x88, 0x14, 0xf9, 0x1b, 0x15, 0xaf,
+                                                        0x13, 0x0, 0x7a, 0x2, 0x0, 0x1, 0x0, 0x2d,
+                                                        0x0, 0x6e, 0x0, 0x74, 0x0, 0x81, 0x0, 0x86,
+                                                        0x0, 0xb2, 0x0, 0xb5, 0x0, 0xcf, 0x0, 0xd4,
+                                                        0x0, 0xe3, 0x0, 0xec, 0x0, 0xfa, 0x1, 0x3,
+                                                        0x1, 0xf, 0x1, 0x1a, 0x1, 0x40, 0x1, 0x58,
+                                                        0x1, 0x66, 0x1, 0x6e, 0x1, 0x73, 0x1, 0x84,
+                                                        0x1, 0x92, 0x1, 0xa5, 0x1, 0xdc, 0x1, 0xec,
+                                                        0x2, 0x21, 0x2, 0x2c, 0x2, 0x38, 0x2, 0x46,
+                                                        0x2, 0x4f, 0x2, 0x5f, 0x2, 0x88, 0x2, 0xb0,
+                                                        0x2, 0xbf, 0x2, 0xc4, 0x2, 0xcd, 0x2, 0xd6,
+                                                        0x2, 0xe0, 0x2, 0xf4, 0x2, 0xfb, 0x3, 0x9,
+                                                        0x3, 0xe, 0x3, 0x20, 0x3, 0x28, 0x3, 0x3b,
+                                                        0x3, 0x47, 0x3, 0x4c, 0x3, 0x58, 0x3, 0x60,
+                                                        0x3, 0x6f, 0x3, 0x78, 0x3, 0x7f, 0x3, 0x85,
+                                                        0x3, 0x9f, 0x3, 0xac, 0x3, 0xbb, 0x3, 0xd4,
+                                                        0x3, 0xe2, 0x3, 0xe7, 0x3, 0xf4, 0x3, 0xf9,
+                                                        0x4, 0x1, 0x4, 0x8, 0x4, 0x12, 0x4, 0x1a,
+                                                        0x4, 0x1e, 0x4, 0x27, 0x4, 0x30, 0x4, 0x36,
+                                                        0x4, 0x3c, 0x4, 0x47, 0x4, 0x5b, 0x4, 0x66,
+                                                        0x4, 0x71, 0x4, 0x78, 0x4, 0x7f, 0x4, 0x91,
+                                                        0x4, 0x9a, 0x4, 0xac, 0x4, 0xb2, 0x4, 0xb8,
+                                                        0x4, 0xc1, 0x4, 0xcb, 0x4, 0xdb, 0x4, 0xdf,
+                                                        0x4, 0xe8, 0x4, 0xf1, 0x4, 0xf6, 0x4, 0xfb,
+                                                        0x5, 0x9, 0x5, 0x17, 0x5, 0x1f, 0x5, 0x2c,
+                                                        0x5, 0x39, 0x5, 0x3e, 0x5, 0x42, 0x5, 0x4e,
+                                                        0x5, 0x5a, 0x5, 0x60, 0x5, 0x66, 0x5, 0x71,
+                                                        0x5, 0x7c, 0x5, 0x87, 0x5, 0x92, 0x5, 0x99,
+                                                        0x5, 0x9e, 0x5, 0xa2, 0x5, 0xa5, 0x5, 0xaf,
+                                                        0x5, 0xb9, 0x5, 0xc3, 0x5, 0xcd, 0x5, 0xd4,
+                                                        0x5, 0xde, 0x5, 0xe5, 0x5, 0xee, 0x5, 0xf7,
+                                                        0x6, 0x0, 0x6, 0x9, 0x6, 0xf, 0x6, 0x14,
+                                                        0x6, 0x19, 0x9b, 0x9b, 0xaa, 0xa7, 0xd3, 0x1e,
+                                                        0xf7, 0x75, 0x6, 0x99, 0x6b, 0xab, 0x4b, 0x70,
+                                                        0x1a, 0x6a, 0x79, 0x8a, 0x4d, 0x86, 0x1e, 0x68,
+                                                        0xf7, 0xd8, 0xae, 0x7, 0x5b, 0x89, 0x87, 0x95,
+                                                        0x7e, 0xaa, 0xfb, 0x9f, 0xf8, 0xfc, 0x18, 0x6f,
+                                                        0x6, 0xfb, 0x8f, 0xfc, 0xf8, 0xb, 0x15, 0xc3,
+                                                        0x85, 0xa5, 0x96, 0x37, 0x1a, 0xfb, 0xe5, 0x7,
+                                                        0xfb, 0x4d, 0xf7, 0x30, 0x50, 0xf7, 0x1c, 0xf7,
+                                                        0x36, 0xd2, 0xdd, 0xf7, 0x36, 0x1e, 0xf7, 0xe5,
+                                                        0x7, 0xcd, 0xa2, 0x90, 0x43, 0xa, 0x7d, 0x4e,
+                                                        0x1a, 0xfb, 0xe5, 0x7, 0x4b, 0x7e, 0xfb, 0x17,
+                                                        0xfb, 0x44, 0xfb, 0x24, 0x96, 0xf7, 0x1e, 0xc4,
+                                                        0x1e, 0xf7, 0xe5, 0x7, 0xe3, 0xaa, 0x7f, 0xcd,
+                                                        0x8e, 0x1e, 0xae, 0xfb, 0xe6, 0x7, 0xb, 0x6,
+                                                        0xf7, 0x22, 0x23, 0xa, 0xb, 0xe3, 0x5, 0xa3,
+                                                        0x9a, 0x9b, 0x95, 0xa7, 0x1a, 0xaf, 0x6c, 0x2c,
+                                                        0xa, 0xb, 0x44, 0x1d, 0x26, 0x1d, 0xb, 0xf7,
+                                                        0x40, 0xf7, 0x79, 0x78, 0x1d, 0xee, 0xd5, 0xc8,
+                                                        0x9c, 0x50, 0x64, 0xa, 0x36, 0x46, 0x3b, 0x8b,
+                                                        0xf3, 0xf7, 0x0, 0x1e, 0xfb, 0x27, 0x16, 0xfb,
+                                                        0x16, 0xe2, 0xfb, 0x5, 0x70, 0xa, 0xf7, 0x2,
+                                                        0x6f, 0xa, 0xf4, 0x70, 0x1d, 0xfb, 0x7, 0xfb,
+                                                        0x15, 0x1e, 0xb, 0x24, 0x1d, 0xe, 0x1, 0xf7,
+                                                        0x5, 0x7f, 0x1d, 0x9f, 0x16, 0xf7, 0xf2, 0xae,
+                                                        0x6, 0x34, 0x1d, 0xfb, 0xf2, 0x68, 0x7, 0x4b,
+                                                        0xa, 0x4d, 0x64, 0x87, 0x55, 0x86, 0x1e, 0xb,
+                                                        0x6b, 0x1d, 0x25, 0x1d, 0xb, 0x56, 0x1d, 0xfb,
+                                                        0x1d, 0xf7, 0x31, 0x5, 0x98, 0x80, 0x77, 0x9a,
+                                                        0x76, 0x1b, 0x65, 0xb, 0x23, 0x1d, 0xa1, 0x81,
+                                                        0x97, 0x83, 0x95, 0x1e, 0xb, 0x2f, 0xa, 0x9e,
+                                                        0xbd, 0x9c, 0x8d, 0xa1, 0x8e, 0x19, 0x4d, 0x1d,
+                                                        0x36, 0xa, 0xb, 0x93, 0x79, 0x81, 0x78, 0x89,
+                                                        0x71, 0x74, 0x1e, 0xb, 0x2c, 0x1d, 0xfb, 0xa9,
+                                                        0x7, 0x5b, 0x7a, 0x8b, 0x67, 0x82, 0x1e, 0xb,
+                                                        0x5, 0xc4, 0x6, 0xfb, 0xf, 0xf7, 0x44, 0x5,
+                                                        0x2f, 0x6, 0xb, 0x72, 0x4f, 0x69, 0x1b, 0x7f,
+                                                        0x86, 0x97, 0x90, 0x1f, 0x8f, 0x8e, 0x90, 0x94,
+                                                        0x1a, 0x9d, 0x80, 0xac, 0x5e, 0x4f, 0x85, 0x58,
+                                                        0x7d, 0x6b, 0xa6, 0x5d, 0xcc, 0xe9, 0xa0, 0xc4,
+                                                        0xf7, 0x19, 0xbd, 0x1e, 0xf7, 0x29, 0xf8, 0x17,
+                                                        0xb, 0x48, 0xa, 0xfb, 0x44, 0x78, 0xa, 0xfb,
+                                                        0x7f, 0x3c, 0x1d, 0xf7, 0x25, 0x5e, 0xa, 0xf7,
+                                                        0x1d, 0x5e, 0x1d, 0xfb, 0x1d, 0xfb, 0x6e, 0x1e,
+                                                        0xb, 0x7c, 0xa0, 0x5, 0x6c, 0x6c, 0x80, 0xb1,
+                                                        0x8f, 0x1a, 0xf7, 0x99, 0x7, 0xe9, 0xb, 0x77,
+                                                        0x1, 0x5d, 0x1d, 0x3, 0x25, 0xa, 0xb, 0x99,
+                                                        0xa, 0x2d, 0xa, 0xb, 0xfb, 0x7, 0x30, 0x2d,
+                                                        0xfb, 0x28, 0xfb, 0x3f, 0xf1, 0x41, 0xf0, 0xdb,
+                                                        0xc4, 0xab, 0xe8, 0xc8, 0xb, 0x52, 0xa, 0x52,
+                                                        0x6, 0xfb, 0x4, 0x28, 0xfb, 0x4, 0xee, 0x5,
+                                                        0x53, 0x6, 0xe, 0x3c, 0xfb, 0x77, 0x5, 0x3a,
+                                                        0xf7, 0x63, 0x80, 0x9b, 0x95, 0x1a, 0xa3, 0xa6,
+                                                        0x8c, 0xa5, 0x8d, 0x48, 0x1d, 0xb, 0xf8, 0x51,
+                                                        0xfc, 0xb2, 0x5, 0xa7, 0xf8, 0xce, 0x6, 0xbb,
+                                                        0x91, 0xab, 0xd3, 0x94, 0x1e, 0xae, 0xfb, 0x6b,
+                                                        0x68, 0x7, 0xdc, 0x85, 0x97, 0x74, 0x4f, 0x1a,
+                                                        0xfb, 0xc3, 0x89, 0x7, 0xfb, 0xef, 0xf8, 0x3f,
+                                                        0x5, 0xfb, 0x67, 0x72, 0x6, 0x98, 0x9b, 0x88,
+                                                        0x46, 0xc3, 0x1f, 0xfc, 0x64, 0x7, 0x49, 0x6f,
+                                                        0x84, 0x4f, 0x84, 0x1e, 0xb, 0x63, 0x1a, 0xfb,
+                                                        0x8a, 0x7, 0x44, 0xad, 0x4a, 0xf1, 0xce, 0xb9,
+                                                        0xb4, 0xa4, 0xa8, 0x1e, 0xb, 0xa7, 0x16, 0xf8,
+                                                        0xd8, 0x6, 0xa5, 0xf7, 0x85, 0x5, 0x67, 0x6,
+                                                        0x57, 0xfb, 0x66, 0x29, 0x8c, 0xfb, 0x73, 0x8e,
+                                                        0xf8, 0xf, 0xf9, 0x5, 0x18, 0x9b, 0xfc, 0xa0,
+                                                        0x7, 0x76, 0xfb, 0x62, 0x5, 0xb1, 0x6, 0x9d,
+                                                        0xbe, 0x9d, 0xdd, 0xd6, 0xa2, 0xac, 0x95, 0x8b,
+                                                        0x8b, 0xf7, 0x3d, 0x90, 0xfc, 0x12, 0xfd, 0x5,
+                                                        0x18, 0xb, 0xf7, 0x5f, 0xae, 0x6, 0x69, 0x8d,
+                                                        0x5b, 0x8e, 0xb1, 0x1a, 0xb, 0x9b, 0xb6, 0x9f,
+                                                        0xaf, 0xd5, 0x85, 0x55, 0x58, 0x1e, 0x53, 0x7,
+                                                        0xb, 0xf8, 0xdd, 0x6, 0xb3, 0xf7, 0x64, 0x5,
+                                                        0x6f, 0x6, 0xfb, 0x2b, 0x4c, 0x25, 0xb, 0xcc,
+                                                        0xf7, 0x12, 0x1a, 0xbf, 0x6e, 0xc9, 0x42, 0xb,
+                                                        0x5d, 0xa, 0xf7, 0x0, 0x98, 0x1d, 0xd0, 0x8a,
+                                                        0xa, 0x9b, 0x16, 0x99, 0xa, 0x2c, 0x1d, 0xb,
+                                                        0xf8, 0xee, 0x15, 0x72, 0x9f, 0x63, 0xb6, 0xb0,
+                                                        0xa6, 0xa8, 0xae, 0xaf, 0x6e, 0xa9, 0x68, 0x61,
+                                                        0x76, 0x63, 0x72, 0x1e, 0xf7, 0x66, 0x16, 0x72,
+                                                        0x9e, 0x63, 0xb6, 0xb0, 0xa7, 0xa8, 0xae, 0xaf,
+                                                        0x6d, 0xa9, 0x68, 0x61, 0x77, 0x63, 0x72, 0x1e,
+                                                        0xb, 0x15, 0xbc, 0x7b, 0xdc, 0x72, 0x3b, 0x1a,
+                                                        0x5b, 0x6a, 0x7a, 0x6b, 0x76, 0x7c, 0x9b, 0x9a,
+                                                        0x7a, 0x1e, 0x99, 0x7b, 0x78, 0x99, 0x71, 0x1b,
+                                                        0x76, 0x85, 0x78, 0x7d, 0x77, 0x1a, 0x55, 0xe4,
+                                                        0x8a, 0x94, 0xf7, 0x9, 0xda, 0xd4, 0xdf, 0xb8,
+                                                        0xb, 0x16, 0xf7, 0x85, 0xad, 0x6, 0x59, 0x1d,
+                                                        0xc1, 0x8c, 0x54, 0x6f, 0x1e, 0x4f, 0xa, 0xb,
+                                                        0x44, 0xa, 0x54, 0x1d, 0xb, 0xc2, 0x93, 0x1e,
+                                                        0x5b, 0x1d, 0xe1, 0x87, 0x97, 0xb, 0xe4, 0xa2,
+                                                        0xe7, 0xae, 0x94, 0x1f, 0x60, 0x6, 0xb, 0xe2,
+                                                        0x1e, 0xfb, 0x45, 0x16, 0xfb, 0x66, 0xf7, 0x29,
+                                                        0xb, 0x80, 0x7, 0xfb, 0x38, 0x4a, 0x5, 0x76,
+                                                        0x7, 0x93, 0xa1, 0xa1, 0x92, 0x95, 0x1b, 0xa4,
+                                                        0x8b, 0x71, 0x7c, 0x1f, 0xb, 0x5f, 0xa, 0x13,
+                                                        0xd0, 0x3f, 0x1d, 0xe, 0xf7, 0x45, 0x3, 0xf7,
+                                                        0x68, 0xf7, 0xe4, 0x79, 0x1d, 0xf7, 0x44, 0x66,
+                                                        0x1d, 0xb, 0x9b, 0x16, 0x33, 0xa, 0xb, 0x5c,
+                                                        0xaf, 0x64, 0xbb, 0xba, 0xb1, 0xb1, 0xbb, 0xb9,
+                                                        0x65, 0xb0, 0x5c, 0x5b, 0x67, 0x65, 0x5e, 0x1e,
+                                                        0xb, 0xb9, 0x88, 0xba, 0x89, 0x49, 0x7e, 0xa,
+                                                        0xb, 0x59, 0xa, 0x94, 0x81, 0x7b, 0x99, 0x80,
+                                                        0x1b, 0x85, 0x86, 0x87, 0x7d, 0x6d, 0xe6, 0x25,
+                                                        0xa6, 0x62, 0x1f, 0xb, 0xf7, 0x38, 0xf7, 0xae,
+                                                        0x15, 0xf7, 0x1e, 0xad, 0xa1, 0xb0, 0xdb, 0xb,
+                                                        0x56, 0x1d, 0xf7, 0x4, 0xb, 0xfb, 0x7c, 0x7,
+                                                        0x66, 0x7d, 0x7a, 0x6a, 0x88, 0x6a, 0xa, 0x5a,
+                                                        0xb, 0x76, 0xf7, 0xbb, 0xf7, 0x54, 0x6b, 0xab,
+                                                        0xb, 0x9f, 0x8b, 0xaa, 0xf7, 0xbe, 0xad, 0xf7,
+                                                        0x19, 0x76, 0xc5, 0x76, 0xf7, 0x16, 0xad, 0xb,
+                                                        0x15, 0xe7, 0x6, 0xf7, 0xf, 0xf7, 0x44, 0x5,
+                                                        0xb, 0xf7, 0x1f, 0xf7, 0x1e, 0xf7, 0x1f, 0xb,
+                                                        0x8a, 0x1d, 0xf7, 0x36, 0xb2, 0xb, 0xfb, 0x5a,
+                                                        0xfb, 0x5a, 0xfb, 0x2a, 0xfb, 0x31, 0xfb, 0x5b,
+                                                        0x1e, 0xd2, 0x16, 0xf7, 0x39, 0xf7, 0xc, 0xf7,
+                                                        0x1f, 0xf7, 0x31, 0xf7, 0x31, 0xf7, 0xb, 0xb,
+                                                        0x96, 0x75, 0x5, 0x43, 0x1d, 0x6e, 0x57, 0x4c,
+                                                        0xb9, 0x7a, 0xa7, 0x1e, 0xb, 0x5b, 0xa, 0xa8,
+                                                        0x4d, 0xd4, 0xb9, 0xaf, 0xa9, 0xbf, 0xca, 0x5d,
+                                                        0x9b, 0x6f, 0x1e, 0xb, 0x1a, 0xf7, 0x34, 0x7,
+                                                        0x6a, 0xad, 0xa7, 0x70, 0xc3, 0x1b, 0xf1, 0xe5,
+                                                        0xdc, 0xf7, 0x39, 0xf7, 0x36, 0x28, 0xd9, 0x37,
+                                                        0x3b, 0x6d, 0x5e, 0x6a, 0xb, 0x1e, 0xf7, 0x5f,
+                                                        0xf7, 0x38, 0x5, 0x8f, 0x7, 0xfb, 0x62, 0xf7,
+                                                        0x3a, 0x5, 0xb, 0x1, 0x5c, 0x1d, 0x3, 0xb,
+                                                        0x80, 0xa1, 0x5, 0x56, 0x6d, 0xfb, 0x5, 0x4a,
+                                                        0xfb, 0x12, 0x1a, 0x57, 0xb, 0xfb, 0x96, 0x4e,
+                                                        0x1d, 0xb, 0xfc, 0x5, 0xa0, 0x76, 0xf8, 0x61,
+                                                        0x77, 0xb, 0xf7, 0x66, 0xf7, 0x6e, 0xfb, 0x35,
+                                                        0xb, 0x43, 0x1d, 0x6d, 0x57, 0x4c, 0xb9, 0x7b,
+                                                        0xa7, 0x1e, 0xb, 0x4e, 0xa, 0xf1, 0xf7, 0x4,
+                                                        0x25, 0x7e, 0x1d, 0xa8, 0x67, 0x67, 0xb, 0x8f,
+                                                        0x9e, 0x8e, 0x19, 0x5b, 0x1d, 0xba, 0x88, 0xb,
+                                                        0x1, 0xed, 0xf7, 0x33, 0xf7, 0xd6, 0xb7, 0x3,
+                                                        0xb, 0xfb, 0x2e, 0xfb, 0x13, 0x83, 0xb, 0x7d,
+                                                        0xaa, 0xf8, 0x3d, 0xaa, 0xb, 0x7, 0xf7, 0x53,
+                                                        0xf7, 0xc1, 0x9f, 0xab, 0xa8, 0x62, 0xa, 0xb,
+                                                        0x5d, 0x62, 0xb3, 0x5c, 0x1b, 0x72, 0x71, 0x74,
+                                                        0x70, 0x70, 0xa5, 0x74, 0xa4, 0x1f, 0xba, 0xb4,
+                                                        0xb3, 0xb9, 0x1b, 0xb, 0x77, 0x75, 0x84, 0xa6,
+                                                        0xc3, 0xdc, 0xc4, 0xa7, 0x9e, 0x1f, 0xb, 0x15,
+                                                        0xc5, 0x6, 0xf8, 0x4b, 0xf9, 0x50, 0x5, 0x53,
+                                                        0x6, 0xb, 0x1e, 0x69, 0xf7, 0x7f, 0xad, 0x7,
+                                                        0xb, 0xd6, 0x78, 0xbc, 0xf8, 0xf7, 0xae, 0xb,
+                                                        0x6f, 0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7,
+                                                        0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f,
+                                                        0x1e, 0xb, 0x67, 0xa7, 0x81, 0x1d, 0x6f, 0x6e,
+                                                        0x67, 0x1e, 0xb, 0xb4, 0x6, 0x9c, 0xd3, 0xa6,
+                                                        0xf7, 0xc, 0xa2, 0x1a, 0xb6, 0x72, 0xa8, 0x63,
+                                                        0x63, 0x73, 0x6e, 0x60, 0xb, 0xf7, 0x19, 0xf7,
+                                                        0x1f, 0x2d, 0xb, 0xf7, 0x1f, 0xf7, 0x1c, 0xe4,
+                                                        0xb, 0x89, 0x1d, 0x4a, 0x89, 0xa, 0x8c, 0x6b,
+                                                        0x1d, 0xb, 0x77, 0x1, 0xf3, 0xf7, 0x36, 0xf7,
+                                                        0x2c, 0xaf, 0x3, 0xb, 0x8, 0xa6, 0x8c, 0x15,
+                                                        0xf7, 0x19, 0xf7, 0x3e, 0x5, 0x8d, 0xfb, 0x40,
+                                                        0xfb, 0x1b, 0x6, 0xb, 0x6e, 0xaf, 0xaf, 0xb,
+                                                        0x90, 0x98, 0x77, 0x1d, 0xe3, 0xf6, 0xa8, 0x1a,
+                                                        0xb, 0xf7, 0x7c, 0x7, 0xf7, 0x2, 0x3c, 0xb3,
+                                                        0x54, 0xb, 0xf7, 0x4c, 0x47, 0xcf, 0xb, 0xfb,
+                                                        0x26, 0x34, 0x85, 0xb, 0x66, 0x15, 0xf7, 0x90,
+                                                        0x6, 0xc1, 0x88, 0x7e, 0xf7, 0x42, 0xfb, 0x42,
+                                                        0x1b, 0xb, 0x1f, 0x52, 0x5f, 0xc4, 0xfb, 0xd7,
+                                                        0x6, 0x57, 0x76, 0x88, 0x67, 0x86, 0x1e, 0xb,
+                                                        0x83, 0xa, 0xda, 0x77, 0xa, 0x13, 0xe0, 0xb,
+                                                        0x30, 0xfb, 0x4c, 0x76, 0xf7, 0x54, 0xc2, 0xf8,
+                                                        0xa, 0x76, 0xa0, 0xc4, 0xb, 0xf8, 0x52, 0x76,
+                                                        0xf7, 0x60, 0xac, 0x88, 0x77, 0x12, 0xbc, 0xf7,
+                                                        0x45, 0xb, 0x1a, 0xfc, 0x64, 0x7, 0xb, 0x6d,
+                                                        0x7d, 0x74, 0xb, 0x66, 0x15, 0xf7, 0x95, 0x6,
+                                                        0xc1, 0x76, 0xf7, 0x42, 0xfb, 0x42, 0xb, 0xf7,
+                                                        0x6a, 0xf2, 0x15, 0xf7, 0x87, 0x7, 0x99, 0xb2,
+                                                        0xc3, 0xb8, 0xb, 0xc4, 0x76, 0xf8, 0xf, 0x77,
+                                                        0xb, 0x76, 0xf7, 0xe3, 0x77, 0x12, 0xb, 0xfb,
+                                                        0x83, 0x33, 0x4b, 0xfb, 0x4, 0x5b, 0x82, 0x9b,
+                                                        0xb3, 0xb, 0xf7, 0x6d, 0x63, 0x7, 0x78, 0x86,
+                                                        0x86, 0x7c, 0x74, 0x1b, 0xb, 0x5c, 0xaf, 0x65,
+                                                        0xbb, 0xba, 0xb1, 0xb0, 0xbb, 0xb9, 0x65, 0xb,
+                                                        0x3, 0xa0, 0x16, 0xf8, 0x13, 0x6, 0x9b, 0xf7,
+                                                        0x34, 0x5, 0xb, 0x15, 0xf7, 0x62, 0xfb, 0x3a,
+                                                        0x5, 0xb, 0x7, 0xc4, 0x9e, 0x99, 0xb, 0xf7,
+                                                        0x1f, 0x3, 0xb, 0x84, 0x1e, 0xe, 0x9f, 0x8b,
+                                                        0xae, 0xf8, 0x47, 0x77, 0xf7, 0x53, 0xae, 0xb,
+                                                        0xfb, 0x52, 0x69, 0x7, 0xbc, 0x8d, 0x5c, 0x80,
+                                                        0x1f, 0xb, 0x77, 0x12, 0xb7, 0xf7, 0x1, 0xf7,
+                                                        0x85, 0xf7, 0xb, 0xb, 0x74, 0x93, 0x95, 0x78,
+                                                        0x1f, 0x99, 0x6f, 0x76, 0x9c, 0xb, 0xfb, 0xce,
+                                                        0xf8, 0xb9, 0x98, 0x1d, 0xb, 0xf7, 0x74, 0x15,
+                                                        0x6d, 0x65, 0x33, 0x20, 0x6e, 0x1a, 0xb, 0x7,
+                                                        0x62, 0x81, 0x81, 0x5d, 0x8b, 0xa, 0xf7, 0x3d,
+                                                        0x1, 0xb4, 0xf7, 0x3d, 0x3, 0xb4, 0xb, 0xf9,
+                                                        0xd, 0x15, 0x4f, 0xbc, 0x5d, 0xc5, 0x1e, 0xb,
+                                                        0x3e, 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xaa,
+                                                        0xb, 0xfb, 0x55, 0xfb, 0x35, 0xfb, 0x17, 0xfb,
+                                                        0x6e, 0xb, 0xf7, 0x6, 0xd1, 0xf7, 0x6, 0xb,
+                                                        0x12, 0xa4, 0xf7, 0x1f, 0xb, 0xf7, 0x83, 0xad,
+                                                        0x6, 0xb
+                                                       };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c
new file mode 100644
index 0000000..63f8696
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c
@@ -0,0 +1,2600 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifBoldItalicFontData [20733] = {0x1,
+                                                              0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x19,
+                                                              0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
+                                                              0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,
+                                                              0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63,
+                                                              0x0, 0x1, 0x1, 0x1, 0x29, 0xf8, 0x10, 0x0,
+                                                              0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e,
+                                                              0x3, 0xf8, 0x14, 0x4, 0x7d, 0xc, 0x2, 0xfb,
+                                                              0x5c, 0xfb, 0x8e, 0xfa, 0x6e, 0xf9, 0xf9, 0x5,
+                                                              0x1c, 0x6, 0xf6, 0xf, 0x1c, 0x8, 0x4d, 0x11,
+                                                              0xb7, 0x1c, 0x4a, 0x64, 0x12, 0x0, 0x4, 0x1,
+                                                              0x1, 0x5, 0x2f, 0x4a, 0x59, 0x45, 0x75, 0x72,
+                                                              0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                              0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                              0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d,
+                                                              0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4f,
+                                                              0x54, 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x20,
+                                                              0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68,
+                                                              0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69,
+                                                              0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x71, 0x2,
+                                                              0x0, 0x1, 0x0, 0xf, 0x0, 0x18, 0x0, 0x1d,
+                                                              0x0, 0x30, 0x0, 0x43, 0x0, 0x50, 0x0, 0x5a,
+                                                              0x0, 0x61, 0x0, 0x6d, 0x0, 0x84, 0x0, 0x87,
+                                                              0x0, 0xc2, 0x0, 0xe0, 0x0, 0xe3, 0x0, 0xf7,
+                                                              0x1, 0xa, 0x1, 0x17, 0x1, 0x1f, 0x1, 0x32,
+                                                              0x1, 0x39, 0x1, 0x4a, 0x1, 0x6f, 0x1, 0x76,
+                                                              0x1, 0x89, 0x1, 0xab, 0x1, 0xb8, 0x1, 0xed,
+                                                              0x1, 0xf4, 0x1, 0xfe, 0x2, 0xe, 0x2, 0x1e,
+                                                              0x2, 0x26, 0x2, 0x35, 0x2, 0x47, 0x2, 0x59,
+                                                              0x2, 0x5f, 0x2, 0x6c, 0x2, 0x75, 0x2, 0x7e,
+                                                              0x2, 0x8d, 0x2, 0x96, 0x2, 0xa4, 0x2, 0xb2,
+                                                              0x2, 0xbd, 0x2, 0xca, 0x2, 0xd3, 0x2, 0xdb,
+                                                              0x2, 0xfb, 0x3, 0x5, 0x3, 0xb, 0x3, 0x12,
+                                                              0x3, 0x2e, 0x3, 0x36, 0x3, 0x3e, 0x3, 0x44,
+                                                              0x3, 0x4b, 0x3, 0x52, 0x3, 0x6c, 0x3, 0x7a,
+                                                              0x3, 0x80, 0x3, 0x84, 0x3, 0x8b, 0x3, 0xa1,
+                                                              0x3, 0xa4, 0x3, 0xad, 0x3, 0xb9, 0x3, 0xbf,
+                                                              0x3, 0xd3, 0x3, 0xe7, 0x3, 0xee, 0x3, 0xf3,
+                                                              0x4, 0x5, 0x4, 0xd, 0x4, 0x12, 0x4, 0x23,
+                                                              0x4, 0x30, 0x4, 0x34, 0x4, 0x39, 0x4, 0x49,
+                                                              0x4, 0x59, 0x4, 0x68, 0x4, 0x71, 0x4, 0x78,
+                                                              0x4, 0x7e, 0x4, 0x83, 0x4, 0x88, 0x4, 0x96,
+                                                              0x4, 0xa3, 0x4, 0xaa, 0x4, 0xb7, 0x4, 0xbf,
+                                                              0x4, 0xc4, 0x4, 0xd0, 0x4, 0xd6, 0x4, 0xd9,
+                                                              0x4, 0xdf, 0x4, 0xea, 0x4, 0xf5, 0x4, 0xfd,
+                                                              0x5, 0x2, 0x5, 0xc, 0x5, 0x16, 0x5, 0x20,
+                                                              0x5, 0x2a, 0x5, 0x2e, 0x5, 0x37, 0x5, 0x40,
+                                                              0x5, 0x49, 0x5, 0x4d, 0x5, 0x53, 0x5, 0x57,
+                                                              0x5, 0x5d, 0x5, 0x62, 0x66, 0xa9, 0x6d, 0xb0,
+                                                              0xb0, 0xa9, 0xa9, 0x36, 0x1d, 0x6d, 0x6d, 0x66,
+                                                              0x1e, 0xb, 0xe2, 0x5, 0xa2, 0x98, 0x9b, 0x96,
+                                                              0x25, 0x1d, 0xb, 0x15, 0xbc, 0x21, 0xa, 0xb,
+                                                              0x5c, 0x79, 0x9c, 0xa2, 0x90, 0x8d, 0x91, 0x8e,
+                                                              0x90, 0x3f, 0xa, 0x5c, 0x69, 0x85, 0x5e, 0x88,
+                                                              0x2c, 0xa, 0xb, 0x15, 0xf7, 0x58, 0xae, 0x6,
+                                                              0x23, 0x1d, 0xf7, 0x78, 0xf7, 0x69, 0x15, 0xf7,
+                                                              0x28, 0xf7, 0x87, 0x74, 0x1d, 0xe, 0xa2, 0x1a,
+                                                              0xab, 0x6f, 0x9a, 0x76, 0x75, 0x76, 0x74, 0x70,
+                                                              0x71, 0x1e, 0xb, 0xf7, 0x27, 0x5, 0x98, 0x80,
+                                                              0x79, 0xa0, 0x30, 0x1d, 0xb, 0x7b, 0xa, 0xfb,
+                                                              0x3, 0x26, 0x1d, 0xb, 0x44, 0xa, 0xfb, 0x3,
+                                                              0x8e, 0x7a, 0x4a, 0x6f, 0xa, 0x27, 0xa, 0xb,
+                                                              0x15, 0xc9, 0x8b, 0x60, 0x6b, 0x1f, 0x5d, 0x2e,
+                                                              0xfb, 0xa5, 0x38, 0xa, 0xcd, 0xf7, 0x78, 0xb3,
+                                                              0xf7, 0x1f, 0x97, 0x84, 0x55, 0xa, 0xb, 0x27,
+                                                              0x1d, 0xe, 0x15, 0x43, 0xb2, 0x51, 0xd7, 0xf7,
+                                                              0x6, 0xd9, 0xf7, 0xf, 0xf3, 0xd6, 0x63, 0xc3,
+                                                              0x3d, 0xfb, 0x0, 0x3a, 0xfb, 0xe, 0x21, 0x1e,
+                                                              0xf7, 0x9, 0xe3, 0x15, 0xac, 0x95, 0xa0, 0xdc,
+                                                              0xb6, 0x1b, 0xa4, 0x92, 0x74, 0x76, 0x6b, 0x6f,
+                                                              0x32, 0x81, 0x69, 0x1f, 0x6c, 0x82, 0x79, 0x3f,
+                                                              0x61, 0x1b, 0x75, 0x81, 0x9e, 0x9e, 0xac, 0xa2,
+                                                              0xe2, 0x95, 0xad, 0x1f, 0xb, 0xf7, 0xb2, 0xf7,
+                                                              0x2f, 0x15, 0x8d, 0x8a, 0x5, 0x81, 0x6d, 0x7f,
+                                                              0x69, 0x60, 0x1a, 0x53, 0xbf, 0x8b, 0x9a, 0xdf,
+                                                              0xc3, 0xea, 0xad, 0x9e, 0x1e, 0x76, 0x98, 0x5,
+                                                              0x7f, 0x8d, 0xb, 0x2b, 0xa, 0xe, 0x83, 0x6e,
+                                                              0x86, 0x79, 0x7b, 0x1a, 0x57, 0xbb, 0x7d, 0x9e,
+                                                              0xc8, 0xc4, 0xd5, 0xbf, 0xac, 0x1e, 0x76, 0x9a,
+                                                              0x5, 0xb, 0xfb, 0x5a, 0xfb, 0x27, 0x6a, 0x95,
+                                                              0x2a, 0xee, 0xde, 0xbe, 0xde, 0xb7, 0xa5, 0x1f,
+                                                              0xfb, 0x26, 0x8c, 0x15, 0xb, 0x70, 0x1b, 0x70,
+                                                              0x79, 0x73, 0x76, 0x76, 0xa0, 0x7a, 0x98, 0x82,
+                                                              0x1f, 0xb, 0x40, 0x1d, 0x83, 0x96, 0x89, 0x43,
+                                                              0xa, 0xb, 0xab, 0xc8, 0xf7, 0x67, 0xb2, 0xf7,
+                                                              0x23, 0x1f, 0x47, 0x7b, 0x2d, 0x82, 0x63, 0x88,
+                                                              0x8, 0x70, 0x7, 0xa8, 0xb, 0x65, 0x1d, 0xf7,
+                                                              0x71, 0x25, 0xa, 0xb, 0x74, 0x3d, 0xfb, 0x8e,
+                                                              0x5f, 0x1a, 0x73, 0x96, 0x60, 0xc5, 0xd5, 0xb5,
+                                                              0xc5, 0xd9, 0xbe, 0x1e, 0xb, 0xf7, 0x85, 0xf7,
+                                                              0x5, 0x15, 0x70, 0xf7, 0x2f, 0x6b, 0xf7, 0x27,
+                                                              0x78, 0xba, 0x66, 0x81, 0x55, 0x82, 0x51, 0x86,
+                                                              0x8, 0x70, 0x7, 0xb2, 0x95, 0x8b, 0xfb, 0x2c,
+                                                              0xad, 0x1f, 0x93, 0x67, 0xb0, 0xfb, 0x48, 0x5a,
+                                                              0x1a, 0xb, 0xb0, 0xb0, 0x6d, 0xa9, 0x66, 0x66,
+                                                              0xb, 0xf8, 0xbe, 0x6, 0xc6, 0xf7, 0x56, 0x72,
+                                                              0x90, 0x5, 0xfb, 0x12, 0x46, 0xfb, 0x4, 0x62,
+                                                              0xfb, 0xc, 0x1b, 0xb, 0x1b, 0x63, 0x7e, 0x66,
+                                                              0x79, 0x70, 0xa1, 0x6a, 0xb0, 0xee, 0xe3, 0xeb,
+                                                              0xf7, 0x3d, 0xf1, 0x1f, 0x94, 0x9a, 0xf7, 0x15,
+                                                              0xf7, 0x64, 0xf7, 0x9, 0x1a, 0xac, 0x6d, 0xa8,
+                                                              0x6a, 0x6b, 0x73, 0x6c, 0x72, 0xb, 0x83, 0xba,
+                                                              0x2b, 0xf8, 0xe4, 0x18, 0x72, 0x6, 0xfc, 0x8,
+                                                              0xfc, 0xe4, 0xb, 0xf7, 0x3f, 0xf7, 0x2d, 0x15,
+                                                              0xe7, 0xe2, 0xf8, 0x28, 0xf7, 0x4c, 0xf3, 0x8c,
+                                                              0x20, 0x76, 0xfb, 0x8, 0x2d, 0xfc, 0x19, 0xfb,
+                                                              0x46, 0x50, 0x5e, 0xb0, 0x55, 0x1d, 0xd2, 0xfb,
+                                                              0x17, 0xf7, 0x3b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7,
+                                                              0x9b, 0xf7, 0x56, 0xf7, 0x42, 0xfb, 0x19, 0xd1,
+                                                              0x5d, 0x1d, 0xfb, 0x78, 0xfb, 0x89, 0x1e, 0xb,
+                                                              0x5, 0xbe, 0x6, 0x35, 0x4e, 0xa, 0xb, 0x6c,
+                                                              0x1d, 0x53, 0x55, 0x73, 0x1b, 0x85, 0x32, 0xa,
+                                                              0xb, 0x1b, 0xe2, 0xa1, 0xdf, 0xae, 0x94, 0x1f,
+                                                              0x62, 0x6, 0x78, 0x82, 0x81, 0x74, 0x69, 0x1b,
+                                                              0xb, 0x1f, 0xdd, 0xf7, 0xb6, 0x9c, 0xcb, 0xa5,
+                                                              0x90, 0xbe, 0x8e, 0x19, 0xae, 0xfb, 0xcb, 0x7,
+                                                              0xb, 0x1b, 0x85, 0x88, 0x90, 0x94, 0x28, 0x1d,
+                                                              0xb, 0x3c, 0x41, 0x1f, 0xa6, 0x86, 0xb6, 0xf7,
+                                                              0x52, 0x5, 0xfc, 0xb0, 0x68, 0x6, 0xc9, 0xb,
+                                                              0x71, 0x9e, 0x61, 0xba, 0xb2, 0xa9, 0xa9, 0xaf,
+                                                              0xb0, 0x6c, 0xaa, 0x65, 0x5e, 0x76, 0x61, 0x73,
+                                                              0x1e, 0xb, 0x65, 0xa8, 0x6e, 0xb1, 0xb1, 0xa9,
+                                                              0xa8, 0xb1, 0xb1, 0x6d, 0xa9, 0x65, 0x65, 0x6e,
+                                                              0x6d, 0x65, 0x1e, 0xb, 0x15, 0x62, 0xa9, 0x45,
+                                                              0x1d, 0xb, 0xe9, 0xf7, 0xc8, 0x7d, 0x8a, 0x21,
+                                                              0x74, 0x32, 0x87, 0x6d, 0xa, 0xad, 0xb, 0x6a,
+                                                              0xb7, 0xb4, 0xac, 0xab, 0xb5, 0xb4, 0x6a, 0xb,
+                                                              0x15, 0x42, 0x1d, 0xf7, 0x68, 0x16, 0x42, 0x1d,
+                                                              0xe, 0x89, 0x7f, 0x1f, 0xfb, 0x14, 0xfc, 0x5e,
+                                                              0x7b, 0x52, 0x76, 0x82, 0x60, 0x85, 0x19, 0xb,
+                                                              0x1f, 0xd0, 0xf7, 0x9, 0x5, 0xf7, 0x6b, 0x6,
+                                                              0xb, 0xf7, 0x77, 0x70, 0xa, 0x8e, 0x88, 0x90,
+                                                              0x9d, 0xb6, 0xb4, 0x9b, 0x4a, 0xa, 0xb, 0x1f,
+                                                              0x51, 0xfb, 0x65, 0x5, 0x21, 0x6e, 0x64, 0xfb,
+                                                              0x1e, 0xfb, 0x23, 0x1b, 0xb, 0x65, 0xfb, 0x32,
+                                                              0xfb, 0x15, 0xfb, 0x3c, 0xfb, 0x2e, 0x1e, 0xb,
+                                                              0x15, 0xdd, 0x6, 0xf7, 0x36, 0xf7, 0x42, 0x5,
+                                                              0x53, 0x6, 0xfb, 0x1b, 0xb, 0x1, 0xf7, 0x6c,
+                                                              0xf7, 0x21, 0x15, 0x72, 0x88, 0xb, 0x88, 0xf7,
+                                                              0xb, 0xf7, 0x62, 0xf7, 0xb, 0xb, 0x2a, 0x7d,
+                                                              0x71, 0x92, 0xab, 0x1f, 0x7f, 0x57, 0x15, 0x7b,
+                                                              0xaa, 0x98, 0x85, 0xa4, 0x1b, 0xf7, 0x22, 0xf7,
+                                                              0x1a, 0xf7, 0x56, 0xf7, 0x2f, 0xe7, 0x58, 0xad,
+                                                              0x4f, 0x60, 0x54, 0x70, 0x3c, 0xb, 0xf7, 0x21,
+                                                              0xf7, 0x4a, 0x15, 0xf7, 0x55, 0xa9, 0xcb, 0xb,
+                                                              0x56, 0xa, 0xf8, 0x47, 0x77, 0xb, 0x1, 0x4e,
+                                                              0x1d, 0x3, 0xf7, 0x8, 0xb, 0x58, 0x8b, 0xab,
+                                                              0xf8, 0xee, 0xae, 0x1, 0x75, 0x16, 0xf8, 0xbd,
+                                                              0x6, 0xc6, 0xf7, 0x56, 0x73, 0x90, 0x5, 0xfb,
+                                                              0x11, 0x46, 0xfb, 0x4, 0x61, 0xfb, 0xc, 0x1b,
+                                                              0xb, 0x1b, 0x29, 0x78, 0xfb, 0x8, 0x89, 0x1f,
+                                                              0xe, 0xef, 0x1e, 0xfb, 0x24, 0xc4, 0x15, 0x2a,
+                                                              0xb, 0xb1, 0x90, 0x19, 0x61, 0xa, 0xb, 0x19,
+                                                              0xae, 0xfb, 0x64, 0x68, 0x7, 0xb, 0x7e, 0xd2,
+                                                              0x58, 0x76, 0xf8, 0x46, 0xb, 0x1, 0xf7, 0xd5,
+                                                              0xf7, 0x11, 0x3, 0xf7, 0x5, 0xc8, 0x15, 0xa4,
+                                                              0xbd, 0xf7, 0x42, 0xa2, 0xbb, 0x1e, 0xb1, 0x9d,
+                                                              0xb1, 0xb8, 0xb2, 0x1b, 0xa1, 0x9d, 0xb, 0x77,
+                                                              0x1, 0xf7, 0x77, 0xf9, 0x67, 0x5b, 0xa, 0xea,
+                                                              0xe3, 0x2c, 0x3b, 0x1d, 0xb, 0x58, 0x1d, 0xb0,
+                                                              0x90, 0x77, 0xb, 0x77, 0x52, 0x1d, 0xb, 0xfb,
+                                                              0x1, 0xfb, 0x6f, 0xfb, 0x5f, 0xb, 0x15, 0xf7,
+                                                              0x82, 0x6, 0xbe, 0xf7, 0x6, 0x5, 0x7b, 0x6,
+                                                              0x69, 0x75, 0x7b, 0x80, 0x57, 0x1b, 0x34, 0x8d,
+                                                              0x6, 0xf7, 0xf, 0xb, 0x26, 0x1d, 0xe, 0x4c,
+                                                              0x1d, 0x26, 0x30, 0xf0, 0x5, 0x59, 0x6, 0xe,
+                                                              0x15, 0xc5, 0x6, 0xf8, 0x47, 0xf9, 0x48, 0x5,
+                                                              0x8d, 0x51, 0x7, 0xb, 0xf7, 0x19, 0x1a, 0xdb,
+                                                              0x50, 0xb, 0xce, 0xaa, 0x97, 0xad, 0xa4, 0x1a,
+                                                              0xc3, 0x54, 0xa5, 0x61, 0x47, 0x62, 0x62, 0x64,
+                                                              0x71, 0x1e, 0x99, 0x7e, 0x5, 0xb, 0x1f, 0x3b,
+                                                              0xfb, 0xb3, 0xfb, 0x6b, 0xf8, 0x65, 0x5, 0xfb,
+                                                              0x57, 0x68, 0x6, 0xc0, 0x86, 0x96, 0x8f, 0x9e,
+                                                              0x5f, 0xb, 0xc7, 0x79, 0xad, 0xf9, 0xd, 0xad,
+                                                              0xb, 0xfc, 0x14, 0x97, 0x76, 0xb, 0x1f, 0xb1,
+                                                              0x70, 0x7e, 0x94, 0x79, 0x1b, 0x73, 0x7e, 0x79,
+                                                              0x70, 0x84, 0x90, 0x64, 0xdd, 0xf0, 0xe4, 0xb,
+                                                              0xfb, 0x6e, 0x7e, 0xcb, 0xf8, 0xe, 0xac, 0xb,
+                                                              0xf8, 0x1a, 0x62, 0xa, 0xb, 0x1e, 0xae, 0xfb,
+                                                              0xaf, 0x68, 0x7, 0xbb, 0x84, 0x92, 0x8a, 0x9d,
+                                                              0x54, 0xe3, 0xfb, 0x96, 0x18, 0xb, 0x19, 0xf7,
+                                                              0x78, 0xf7, 0x69, 0x15, 0xf7, 0x28, 0xf7, 0x87,
+                                                              0x74, 0x1d, 0xe, 0x77, 0x4d, 0x1d, 0xb, 0xf7,
+                                                              0x30, 0x35, 0xe1, 0xb, 0xef, 0xf7, 0xde, 0x5e,
+                                                              0x82, 0x66, 0x83, 0x2c, 0x7d, 0x19, 0x89, 0x76,
+                                                              0x5, 0xa8, 0xb3, 0xb, 0x15, 0xcb, 0xf7, 0x83,
+                                                              0x5, 0xa0, 0x8f, 0x91, 0xa2, 0xb2, 0x1b, 0xe0,
+                                                              0x8b, 0x23, 0x76, 0xb, 0xa7, 0x88, 0x5, 0xa3,
+                                                              0x94, 0x98, 0xb0, 0xb4, 0x1b, 0xf7, 0x25, 0x6,
+                                                              0xfb, 0xb8, 0xb, 0x15, 0xc1, 0x54, 0xc4, 0x51,
+                                                              0xbc, 0x56, 0x8, 0xb, 0xc0, 0x76, 0xf8, 0x13,
+                                                              0x77, 0x1, 0xb, 0x9b, 0xb5, 0x1b, 0xf7, 0x51,
+                                                              0xb, 0xb0, 0xfb, 0x87, 0x5, 0xb, 0xf7, 0xbc,
+                                                              0xae, 0x6, 0xb, 0x4a, 0xc1, 0x8b, 0x9b, 0xd9,
+                                                              0xba, 0xd8, 0xc1, 0xab, 0x1e, 0x75, 0x98, 0x5,
+                                                              0xb, 0x7d, 0x4e, 0x83, 0x41, 0x83, 0x6d, 0xa,
+                                                              0xad, 0x8c, 0xa8, 0x8b, 0x69, 0xb, 0x28, 0x30,
+                                                              0xee, 0x5, 0x59, 0x6, 0xe, 0xfb, 0x6e, 0xfb,
+                                                              0x61, 0xf7, 0x7, 0xf7, 0x5f, 0x77, 0xf8, 0x5,
+                                                              0x77, 0xb, 0x1a, 0xc3, 0xee, 0xbe, 0x9e, 0x95,
+                                                              0x1e, 0xb, 0xf7, 0x0, 0xa5, 0xa1, 0xb, 0x1a,
+                                                              0x86, 0x8b, 0x85, 0x89, 0x85, 0x1e, 0xfb, 0x19,
+                                                              0xfc, 0x65, 0xb, 0x45, 0x1d, 0xac, 0x62, 0x60,
+                                                              0xb, 0x3b, 0x1d, 0xe, 0xfb, 0xdd, 0xf8, 0xad,
+                                                              0x76, 0xb, 0x5, 0xb4, 0x96, 0xab, 0x88, 0x9a,
+                                                              0x1b, 0xf7, 0x35, 0x8c, 0xb, 0x1f, 0xab, 0x85,
+                                                              0xbe, 0xf7, 0x7e, 0x5, 0x6d, 0x6, 0x7b, 0xb,
+                                                              0x6d, 0xa, 0xac, 0xa9, 0x8d, 0x68, 0x1f, 0xe,
+                                                              0xf7, 0xb, 0x40, 0xd6, 0xb, 0x69, 0xa9, 0x79,
+                                                              0xa6, 0xb1, 0xa4, 0xa6, 0xb8, 0xb7, 0xb, 0x77,
+                                                              0x12, 0xf1, 0xf7, 0xd, 0xf7, 0x10, 0xf7, 0xd,
+                                                              0xb, 0xe3, 0x8b, 0xf7, 0x29, 0xfb, 0x22, 0x76,
+                                                              0xf1, 0xc8, 0xb, 0xfb, 0x61, 0xb0, 0xf7, 0x2f,
+                                                              0xae, 0xf8, 0x5, 0xd2, 0xb, 0x1b, 0x85, 0x87,
+                                                              0xb, 0x21, 0x97, 0x76, 0xa9, 0x76, 0xf8, 0x1a,
+                                                              0xd3, 0xb, 0x83, 0x93, 0x1b, 0x90, 0x8f, 0x8f,
+                                                              0x97, 0x1f, 0xb, 0xc7, 0x8b, 0xae, 0x6e, 0x76,
+                                                              0xf9, 0x1d, 0xae, 0xb, 0x83, 0x1d, 0x12, 0xb,
+                                                              0x76, 0xf9, 0x53, 0x77, 0x1, 0xb, 0x15, 0x75,
+                                                              0x1d, 0xb, 0x7e, 0xa8, 0xf8, 0x33, 0xa8, 0xb,
+                                                              0xa5, 0xaf, 0xa1, 0xa4, 0xb, 0x1, 0x0, 0x1,
+                                                              0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37, 0x0,
+                                                              0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67, 0x0,
+                                                              0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x66,
+                                                              0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0,
+                                                              0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0,
+                                                              0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0, 0xa1,
+                                                              0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0, 0x0,
+                                                              0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98, 0x0,
+                                                              0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0, 0x85,
+                                                              0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0, 0x0,
+                                                              0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0,
+                                                              0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0, 0xae,
+                                                              0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0, 0x0,
+                                                              0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0,
+                                                              0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2,
+                                                              0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2, 0x0,
+                                                              0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe, 0x0,
+                                                              0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd,
+                                                              0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0, 0x0,
+                                                              0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0,
+                                                              0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0, 0xcb,
+                                                              0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0, 0x0,
+                                                              0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90, 0x0,
+                                                              0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xcf,
+                                                              0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2, 0x0,
+                                                              0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0,
+                                                              0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0, 0xda,
+                                                              0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0, 0x0,
+                                                              0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2, 0x0,
+                                                              0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x91,
+                                                              0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0, 0x0,
+                                                              0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0, 0x0,
+                                                              0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0, 0xe4,
+                                                              0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0, 0x0,
+                                                              0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, 0x0,
+                                                              0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x86,
+                                                              0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0,
+                                                              0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75, 0x0,
+                                                              0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x76,
+                                                              0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0, 0x0,
+                                                              0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63, 0x0,
+                                                              0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0, 0xa6,
+                                                              0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2, 0x0,
+                                                              0x1, 0x0, 0x4, 0x0, 0x7, 0x0, 0x5e, 0x0,
+                                                              0x9d, 0x1, 0x14, 0x1, 0xa9, 0x1, 0xe3, 0x2,
+                                                              0xb8, 0x2, 0xe4, 0x3, 0x17, 0x3, 0x49, 0x4,
+                                                              0x25, 0x4, 0x51, 0x4, 0x80, 0x4, 0x96, 0x4,
+                                                              0xa4, 0x4, 0xb9, 0x5, 0x3, 0x5, 0x44, 0x5,
+                                                              0x9a, 0x6, 0x2, 0x6, 0x47, 0x6, 0x98, 0x7,
+                                                              0x2, 0x7, 0x2e, 0x7, 0xae, 0x8, 0xe, 0x8,
+                                                              0x3a, 0x8, 0x8b, 0x8, 0xaf, 0x8, 0xd1, 0x8,
+                                                              0xf2, 0x9, 0x57, 0xa, 0x11, 0xa, 0x3b, 0xa,
+                                                              0xc1, 0xb, 0x17, 0xb, 0x57, 0xb, 0x76, 0xb,
+                                                              0xd9, 0xc, 0x5a, 0xc, 0xda, 0xd, 0x15, 0xd,
+                                                              0x74, 0xd, 0xed, 0xe, 0x14, 0xe, 0x94, 0xe,
+                                                              0xd1, 0xf, 0x14, 0xf, 0x6c, 0x10, 0x7, 0x10,
+                                                              0x7e, 0x10, 0xff, 0x11, 0x41, 0x11, 0x8c, 0x11,
+                                                              0xdb, 0x12, 0x59, 0x12, 0xd5, 0x13, 0x19, 0x13,
+                                                              0x1f, 0x13, 0x4d, 0x13, 0x64, 0x13, 0x95, 0x13,
+                                                              0xb6, 0x13, 0xc2, 0x13, 0xe4, 0x14, 0x1c, 0x14,
+                                                              0x6d, 0x14, 0xbc, 0x15, 0x38, 0x15, 0x70, 0x15,
+                                                              0xee, 0x16, 0x9b, 0x16, 0xff, 0x17, 0x1e, 0x17,
+                                                              0x72, 0x17, 0xd0, 0x18, 0x0, 0x18, 0xa0, 0x18,
+                                                              0xd3, 0x19, 0x10, 0x19, 0x45, 0x19, 0xb2, 0x19,
+                                                              0xfd, 0x1a, 0x64, 0x1a, 0xab, 0x1a, 0xd9, 0x1b,
+                                                              0x2d, 0x1b, 0xa5, 0x1c, 0x31, 0x1c, 0x53, 0x1c,
+                                                              0x97, 0x1c, 0xf5, 0x1d, 0x10, 0x1d, 0x6a, 0x1d,
+                                                              0xb5, 0x1e, 0x3, 0x1e, 0x79, 0x1f, 0x31, 0x1f,
+                                                              0xa7, 0x20, 0x30, 0x20, 0x5f, 0x21, 0x28, 0x21,
+                                                              0x42, 0x21, 0xdf, 0x22, 0x4d, 0x22, 0x81, 0x22,
+                                                              0xa0, 0x23, 0x55, 0x23, 0x69, 0x23, 0x9c, 0x23,
+                                                              0xdb, 0x23, 0xff, 0x24, 0x32, 0x24, 0x44, 0x24,
+                                                              0xc7, 0x25, 0x10, 0x25, 0x20, 0x25, 0x57, 0x25,
+                                                              0x90, 0x25, 0xca, 0x25, 0xf4, 0x26, 0x2e, 0x26,
+                                                              0x79, 0x26, 0xd3, 0x27, 0x34, 0x27, 0x51, 0x27,
+                                                              0x63, 0x27, 0x6f, 0x27, 0xcc, 0x27, 0xf5, 0x28,
+                                                              0x20, 0x28, 0xc6, 0x29, 0x5d, 0x29, 0x9b, 0x29,
+                                                              0xdf, 0x2a, 0x7, 0x2a, 0x36, 0x2a, 0x58, 0x2a,
+                                                              0x87, 0x2a, 0xab, 0x2a, 0xd1, 0x2b, 0x29, 0x2b,
+                                                              0x84, 0x2b, 0x8c, 0x2b, 0x94, 0x2b, 0xa5, 0x2b,
+                                                              0xd2, 0x2b, 0xf5, 0x2c, 0x25, 0x2c, 0xa4, 0x2c,
+                                                              0xcc, 0x2c, 0xf7, 0x2d, 0x24, 0x2d, 0x59, 0x2d,
+                                                              0x9f, 0x2e, 0x13, 0x2e, 0xb5, 0x2e, 0xde, 0x2e,
+                                                              0xf5, 0x2f, 0xb, 0x2f, 0x45, 0x2f, 0x67, 0x2f,
+                                                              0xd1, 0x30, 0x8a, 0x31, 0xe, 0x31, 0x1b, 0x31,
+                                                              0x24, 0x31, 0x3c, 0x31, 0x5f, 0x31, 0x6e, 0x31,
+                                                              0x82, 0x31, 0xa2, 0x31, 0xcb, 0x32, 0x31, 0x32,
+                                                              0x85, 0x32, 0x94, 0x32, 0xba, 0x32, 0xc7, 0x32,
+                                                              0xf4, 0x33, 0x15, 0x33, 0x47, 0x33, 0xbe, 0x33,
+                                                              0xdc, 0x33, 0xf0, 0x34, 0x6, 0x34, 0x22, 0x34,
+                                                              0x4d, 0x34, 0x7f, 0x34, 0xbb, 0x34, 0xc2, 0x35,
+                                                              0x4, 0x35, 0x50, 0x36, 0x3, 0x36, 0x9a, 0x37,
+                                                              0x2f, 0x37, 0x9c, 0x38, 0xb, 0x38, 0x19, 0x38,
+                                                              0x65, 0x38, 0xee, 0x38, 0xfe, 0x39, 0xa, 0x39,
+                                                              0x35, 0x39, 0x49, 0x39, 0x70, 0x39, 0xa3, 0x39,
+                                                              0xf1, 0x3a, 0x9, 0x3a, 0x1a, 0x3a, 0x2c, 0x3a,
+                                                              0x59, 0x3a, 0x7f, 0x3a, 0xa9, 0x3a, 0xe2, 0x3b,
+                                                              0x1b, 0x3b, 0x5b, 0x3b, 0xfb, 0x3c, 0xdb, 0x3c,
+                                                              0xfc, 0x3d, 0x34, 0x3d, 0x67, 0x3d, 0x7c, 0x3d,
+                                                              0x90, 0x3d, 0xaa, 0x3e, 0x30, 0x3e, 0xd6, 0x3e,
+                                                              0xe8, 0x3f, 0x9b, 0x40, 0x47, 0xfc, 0x30, 0xe,
+                                                              0xfc, 0x30, 0xe, 0xfb, 0xa5, 0x72, 0xf7, 0x24,
+                                                              0xfb, 0x18, 0xf7, 0x24, 0xf8, 0xb0, 0x77, 0xac,
+                                                              0x77, 0x12, 0xce, 0xf7, 0x28, 0x13, 0xa8, 0xf7,
+                                                              0x3b, 0xf7, 0x68, 0x15, 0xa8, 0x83, 0xd2, 0xf7,
+                                                              0x39, 0xd8, 0xf7, 0x2f, 0x97, 0xa9, 0x19, 0x93,
+                                                              0xa0, 0x91, 0xa0, 0x9d, 0x1a, 0x13, 0x98, 0xb4,
+                                                              0x71, 0xa8, 0x6b, 0x50, 0x6b, 0x38, 0x61, 0x85,
+                                                              0x1e, 0x7a, 0xfb, 0x7, 0x80, 0xfb, 0x15, 0x77,
+                                                              0x24, 0x8, 0x27, 0xfb, 0x2f, 0x15, 0x13, 0x68,
+                                                              0x64, 0xa8, 0x6c, 0xb7, 0xb8, 0xa9, 0xad, 0xaf,
+                                                              0xb1, 0x6a, 0xaf, 0x60, 0x6a, 0x64, 0x70, 0x5c,
+                                                              0x1e, 0xe, 0x20, 0xf8, 0x37, 0x76, 0xf7, 0xb3,
+                                                              0x77, 0x1, 0xf7, 0x1c, 0xf8, 0x22, 0x15, 0xb3,
+                                                              0x6, 0xde, 0xf7, 0x4e, 0x5, 0x91, 0x99, 0x90,
+                                                              0x9f, 0x9e, 0x1a, 0xa4, 0x7e, 0xa2, 0x66, 0x65,
+                                                              0x70, 0x68, 0x65, 0x88, 0x1e, 0xf7, 0x90, 0xfb,
+                                                              0x6a, 0x15, 0xb1, 0x6, 0xe0, 0xf7, 0x4e, 0x5,
+                                                              0x91, 0x98, 0x8e, 0x9d, 0x9c, 0x1a, 0xa6, 0x7b,
+                                                              0xa5, 0x6b, 0x65, 0x70, 0x68, 0x65, 0x88, 0x1e,
+                                                              0xe, 0xa0, 0x76, 0xf7, 0x66, 0xca, 0x4c, 0xd4,
+                                                              0xf7, 0x1a, 0xd4, 0x4c, 0xca, 0xf7, 0x66, 0x77,
+                                                              0x12, 0x13, 0xb4, 0x75, 0x16, 0xe0, 0xf7, 0x66,
+                                                              0x5, 0x2b, 0x6, 0x9f, 0xca, 0x5, 0xf1, 0x6,
+                                                              0xcb, 0xf7, 0x2e, 0x5, 0x25, 0x6, 0x9f, 0xca,
+                                                              0x5, 0xf7, 0x3, 0x6, 0xdc, 0xf7, 0x66, 0x5,
+                                                              0xd0, 0x6, 0x3b, 0xfb, 0x66, 0x5, 0xf7, 0x14,
+                                                              0x6, 0xdc, 0xf7, 0x66, 0x5, 0xd1, 0x6, 0x3b,
+                                                              0xfb, 0x66, 0x5, 0xdd, 0x6, 0x77, 0x4c, 0x5,
+                                                              0x30, 0x6, 0x13, 0xcc, 0x4b, 0xfb, 0x2e, 0x5,
+                                                              0xe6, 0x6, 0x77, 0x4c, 0x5, 0x2a, 0x6, 0x36,
+                                                              0xfb, 0x66, 0x5, 0x44, 0x6, 0xe0, 0xf7, 0x66,
+                                                              0x5, 0xfb, 0x14, 0x6, 0x36, 0xfb, 0x66, 0x5,
+                                                              0xf7, 0x3, 0xf7, 0xa5, 0x15, 0xf7, 0x14, 0x6,
+                                                              0xcb, 0xf7, 0x2e, 0x5, 0xfb, 0x14, 0x6, 0xe,
+                                                              0x3c, 0x76, 0xf0, 0xaa, 0xf8, 0xf1, 0xac, 0xca,
+                                                              0x77, 0x1, 0xda, 0xee, 0xf7, 0x25, 0xf7, 0x1,
+                                                              0x3, 0xf7, 0x13, 0x92, 0x15, 0x62, 0x96, 0x62,
+                                                              0x93, 0x4a, 0xc7, 0xb5, 0xf7, 0x22, 0x18, 0xa1,
+                                                              0x85, 0x8e, 0x2e, 0x98, 0x57, 0xd8, 0x68, 0x19,
+                                                              0xd5, 0xf7, 0x99, 0x5, 0x20, 0xd8, 0x72, 0xdd,
+                                                              0xc7, 0x1a, 0xe7, 0xcf, 0xc3, 0xf7, 0x19, 0x96,
+                                                              0x94, 0x8a, 0x8a, 0x98, 0x1e, 0x9d, 0xcc, 0x5,
+                                                              0xbd, 0x6, 0x77, 0x43, 0xb5, 0x86, 0xcc, 0x69,
+                                                              0xa8, 0x73, 0x19, 0x61, 0xfb, 0x19, 0x76, 0x90,
+                                                              0x8e, 0xb8, 0x8d, 0xe1, 0x33, 0xa3, 0x19, 0x50,
+                                                              0xfb, 0x79, 0x5, 0xdb, 0x46, 0xc7, 0x46, 0x32,
+                                                              0x1a, 0xfb, 0x1, 0x22, 0x50, 0xfb, 0x29, 0x1e,
+                                                              0x6f, 0x26, 0x5, 0x57, 0x6, 0xf7, 0x2a, 0xf8,
+                                                              0x9e, 0x15, 0xc2, 0xf7, 0x69, 0x5, 0x8e, 0x84,
+                                                              0x8d, 0x8a, 0x7c, 0x1b, 0x45, 0x68, 0x48, 0x5b,
+                                                              0x68, 0x9a, 0x71, 0xc2, 0x64, 0x1f, 0x4d, 0xfc,
+                                                              0x1a, 0x15, 0xe2, 0xbd, 0xc5, 0xda, 0xc6, 0x68,
+                                                              0x9c, 0x68, 0xa8, 0x1f, 0xe, 0xf7, 0x3f, 0x7d,
+                                                              0xa5, 0x85, 0x76, 0xf7, 0xe3, 0xa1, 0xf7, 0xc8,
+                                                              0xa5, 0x8c, 0x77, 0x12, 0xf7, 0x0, 0xdf, 0xf7,
+                                                              0x20, 0xdf, 0xc9, 0xdf, 0xf7, 0x20, 0xdf, 0x13,
+                                                              0xb7, 0x80, 0xf8, 0xe4, 0x7d, 0x3b, 0xa, 0xfc,
+                                                              0x9, 0xf7, 0xc8, 0x3b, 0xa, 0x13, 0x6f, 0x80,
+                                                              0xf8, 0xba, 0xf7, 0xdf, 0x15, 0x4f, 0x6, 0xfc,
+                                                              0xe9, 0xfd, 0x48, 0x5, 0xc7, 0x6, 0xe, 0xf7,
+                                                              0x8, 0x79, 0xd1, 0x45, 0xdc, 0x4e, 0x76, 0xca,
+                                                              0xaf, 0xc0, 0xaf, 0xf8, 0x74, 0xac, 0x12, 0xa5,
+                                                              0xf7, 0x19, 0xd6, 0xf7, 0xd, 0xf7, 0xe, 0xdb,
+                                                              0x75, 0xa1, 0x13, 0x3f, 0x80, 0xf8, 0x1a, 0xb7,
+                                                              0x15, 0x13, 0x4f, 0x80, 0x73, 0xa3, 0xb6, 0x65,
+                                                              0xd4, 0x1b, 0x13, 0x3f, 0x80, 0xe3, 0xb9, 0xc4,
+                                                              0xb4, 0xae, 0x1f, 0x71, 0xa0, 0x5, 0x13, 0x4f,
+                                                              0x40, 0x70, 0x7f, 0x75, 0x80, 0x72, 0x1b, 0x5c,
+                                                              0x52, 0xac, 0xb0, 0x73, 0x1f, 0xe3, 0xf7, 0xa,
+                                                              0x8a, 0x81, 0xa3, 0xa6, 0xb4, 0xba, 0x9b, 0x8e,
+                                                              0xb0, 0x93, 0x8, 0xae, 0xfb, 0x68, 0x68, 0x7,
+                                                              0xa6, 0x86, 0xa8, 0x89, 0x6a, 0x1a, 0x68, 0x61,
+                                                              0x61, 0x6b, 0x63, 0x1e, 0x6e, 0xb5, 0x5c, 0xf3,
+                                                              0x81, 0xdc, 0x8, 0xb8, 0x9e, 0xf7, 0x1d, 0xc0,
+                                                              0xf0, 0x1a, 0xc2, 0x5d, 0xc5, 0x2e, 0xfb, 0xb,
+                                                              0x4a, 0x2b, 0xfb, 0x2, 0x6a, 0x91, 0x6b, 0x90,
+                                                              0x70, 0x1e, 0xfb, 0x5, 0x4d, 0xfb, 0x13, 0x75,
+                                                              0xfb, 0x24, 0x1a, 0x13, 0x3f, 0x80, 0xfb, 0x30,
+                                                              0xf7, 0x23, 0x78, 0xb7, 0xb8, 0xd9, 0x92, 0xc3,
+                                                              0xd6, 0x1e, 0x6f, 0xaf, 0x15, 0x13, 0x8f, 0x80,
+                                                              0x80, 0x74, 0x6c, 0x7a, 0x60, 0x1b, 0x30, 0x67,
+                                                              0xdd, 0xc0, 0xe8, 0xc3, 0xac, 0xc6, 0xa9, 0x1f,
+                                                              0x13, 0x3f, 0x80, 0xab, 0xfb, 0x21, 0xb8, 0x43,
+                                                              0xab, 0x59, 0x8, 0x8f, 0xf7, 0xf6, 0x15, 0x84,
+                                                              0xb6, 0x87, 0xa5, 0xa3, 0x1a, 0xc8, 0x92, 0xc8,
+                                                              0xc3, 0xb4, 0x9d, 0x5b, 0x6b, 0x66, 0x78, 0x59,
+                                                              0x2f, 0x5b, 0x1e, 0xe, 0xfc, 0x14, 0xf8, 0x37,
+                                                              0x76, 0xf7, 0xb3, 0x77, 0x1, 0xf7, 0x21, 0xf7,
+                                                              0xb, 0x3, 0xf7, 0x3b, 0xf8, 0x22, 0x15, 0xe4,
+                                                              0xf7, 0x4e, 0x5, 0x92, 0x98, 0x90, 0x9c, 0x9e,
+                                                              0x1a, 0xa6, 0x7f, 0xa4, 0x64, 0x64, 0x71, 0x69,
+                                                              0x64, 0x88, 0x1e, 0x76, 0xfb, 0x6a, 0x5, 0xe,
+                                                              0x84, 0xa, 0xa7, 0xe9, 0x3, 0xf7, 0x3e, 0xfb,
+                                                              0x47, 0x15, 0xa2, 0x9a, 0x5, 0x70, 0xbb, 0x5f,
+                                                              0xf7, 0x26, 0xf7, 0x15, 0x1a, 0xf7, 0xd0, 0xf7,
+                                                              0x26, 0xf7, 0xe, 0xd7, 0xcf, 0x1e, 0x79, 0x9f,
+                                                              0x5, 0xfb, 0x9f, 0xfb, 0x4c, 0x6c, 0xfb, 0x6a,
+                                                              0xfb, 0x14, 0x1a, 0xfb, 0x51, 0xf0, 0x2f, 0xb4,
+                                                              0x52, 0x1e, 0xe, 0x84, 0xa, 0xf7, 0x45, 0xe9,
+                                                              0x3, 0x5f, 0xfb, 0x33, 0x15, 0xf7, 0x1f, 0xf7,
+                                                              0x1c, 0xdd, 0xf7, 0x2, 0xf7, 0x65, 0x1a, 0xdf,
+                                                              0x82, 0xf7, 0x57, 0x4c, 0xea, 0x1e, 0xa2, 0x9a,
+                                                              0x5, 0xdf, 0x22, 0xc6, 0xfb, 0x19, 0xfb, 0x2b,
+                                                              0x1a, 0xfb, 0x5e, 0xfb, 0xb, 0xfb, 0x30, 0xfb,
+                                                              0x47, 0xfb, 0x9, 0x1e, 0xe, 0xf7, 0xa2, 0x76,
+                                                              0xdf, 0xf7, 0x0, 0xc1, 0xf5, 0xdf, 0x77, 0x1,
+                                                              0xf7, 0x69, 0xee, 0xe9, 0xbd, 0x3, 0xf7, 0x87,
+                                                              0xf8, 0x54, 0x15, 0x6e, 0x78, 0x7c, 0x77, 0x7c,
+                                                              0x7a, 0x8, 0x76, 0x7b, 0x77, 0x65, 0x6b, 0x1b,
+                                                              0x72, 0x72, 0x9b, 0xaa, 0xbc, 0xaa, 0x92, 0xc7,
+                                                              0x8e, 0x1f, 0xab, 0x8e, 0xaa, 0x8e, 0x9a, 0x9e,
+                                                              0x8, 0x94, 0x7, 0x7b, 0x96, 0x63, 0x94, 0x72,
+                                                              0x8e, 0x8, 0x57, 0x93, 0x66, 0x87, 0xbd, 0x1a,
+                                                              0xa7, 0x97, 0xa2, 0xb6, 0xa7, 0x98, 0x6f, 0x71,
+                                                              0xa0, 0x1e, 0xa4, 0x6c, 0xa4, 0x70, 0x98, 0x8a,
+                                                              0x92, 0x90, 0x18, 0xb4, 0x81, 0xa0, 0x80, 0x9e,
+                                                              0x1e, 0x80, 0x9e, 0x82, 0x9a, 0xa3, 0x1a, 0xa3,
+                                                              0x97, 0xa8, 0xb0, 0xa7, 0xa0, 0x75, 0x6c, 0x74,
+                                                              0x82, 0x7d, 0x80, 0x78, 0x1e, 0x80, 0x78, 0x82,
+                                                              0x75, 0x60, 0x1a, 0x97, 0x86, 0xaa, 0xa0, 0x99,
+                                                              0x9f, 0x9b, 0xa2, 0x19, 0xa8, 0x9f, 0x96, 0xa0,
+                                                              0xac, 0x1b, 0xae, 0x9a, 0x6c, 0x7b, 0x5b, 0x5c,
+                                                              0x83, 0x5e, 0x88, 0x1f, 0x70, 0x8a, 0x6e, 0x85,
+                                                              0x76, 0x7b, 0x8, 0x81, 0x7, 0x9c, 0x7f, 0xa1,
+                                                              0x84, 0xaf, 0x88, 0x8, 0xb7, 0x88, 0xbd, 0x7d,
+                                                              0x63, 0x1a, 0x5f, 0x5e, 0x86, 0x86, 0x6c, 0x7f,
+                                                              0xa0, 0xb0, 0x70, 0x1e, 0x78, 0xa4, 0x7f, 0x9d,
+                                                              0x70, 0x98, 0x83, 0x85, 0x18, 0x68, 0x93, 0x76,
+                                                              0x93, 0x78, 0x1e, 0x97, 0x70, 0x95, 0x7e, 0x73,
+                                                              0x1a, 0x6f, 0x7b, 0x71, 0x6c, 0x72, 0x72, 0x99,
+                                                              0xb4, 0x8a, 0x1e, 0x8a, 0xa2, 0x99, 0x9a, 0x96,
+                                                              0xa2, 0x8, 0x94, 0x9e, 0x95, 0xa3, 0xaf, 0x1a,
+                                                              0xe, 0x2f, 0xa0, 0x76, 0xf7, 0x70, 0xcc, 0xf7,
+                                                              0x71, 0x77, 0x12, 0xf7, 0x83, 0xe5, 0x3b, 0xcb,
+                                                              0x13, 0xf0, 0xac, 0xf7, 0x70, 0x15, 0x13, 0xe8,
+                                                              0xf7, 0x6c, 0xfb, 0x70, 0xcb, 0xf7, 0x70, 0xf7,
+                                                              0x74, 0xcc, 0xfb, 0x74, 0xf7, 0x71, 0x4b, 0xfb,
+                                                              0x71, 0xfb, 0x6c, 0x6, 0xe, 0xfc, 0x30, 0xfb,
+                                                              0x35, 0x62, 0xa, 0x7f, 0x6d, 0x1d, 0x13, 0xd0,
+                                                              0x4f, 0x81, 0xa, 0xdf, 0x62, 0x1d, 0x9a, 0x70,
+                                                              0x1e, 0x13, 0xe0, 0x62, 0x6e, 0x6c, 0x61, 0x6d,
+                                                              0x9a, 0x7d, 0x9b, 0x7f, 0x1f, 0x13, 0xd0, 0x9e,
+                                                              0x7e, 0x9f, 0x81, 0x75, 0x1a, 0x53, 0x28, 0x57,
+                                                              0x78, 0x81, 0x1e, 0xe, 0xfb, 0xdd, 0xf7, 0x3a,
+                                                              0xf7, 0x8, 0x1, 0x8d, 0xf7, 0x3a, 0x15, 0xf7,
+                                                              0x88, 0x6, 0xa4, 0xf7, 0x8, 0x5, 0xfb, 0x87,
+                                                              0x6, 0xe, 0xfc, 0x30, 0x7e, 0xf7, 0x28, 0x1,
+                                                              0x82, 0xf7, 0x28, 0x3, 0x82, 0xc8, 0x3c, 0xa,
+                                                              0xfc, 0x14, 0x8e, 0x8d, 0x1d, 0x8d, 0x79, 0x15,
+                                                              0xf7, 0xe8, 0xf9, 0x53, 0x5, 0x45, 0x6, 0xfb,
+                                                              0xe4, 0xfd, 0x53, 0x5, 0xe, 0x7d, 0xa8, 0xf9,
+                                                              0x13, 0xa8, 0x1, 0xf8, 0xa, 0xf2, 0x3, 0x9c,
+                                                              0xf7, 0x63, 0x15, 0x30, 0xa4, 0xfb, 0x16, 0xf7,
+                                                              0x13, 0xf7, 0x38, 0xf7, 0x24, 0xf7, 0x82, 0xf7,
+                                                              0x7e, 0xf7, 0x15, 0x4b, 0xeb, 0x32, 0xfb, 0x47,
+                                                              0xfb, 0x14, 0xfb, 0xa2, 0xfb, 0x62, 0x1e, 0xf7,
+                                                              0x4c, 0xf7, 0x81, 0x15, 0xd5, 0xa2, 0xb6, 0xf7,
+                                                              0x1c, 0xc4, 0x1b, 0xb0, 0x98, 0x6b, 0x5a, 0x47,
+                                                              0x32, 0xfc, 0x7e, 0xfb, 0x8, 0xfb, 0xb, 0xf7,
+                                                              0x25, 0xf8, 0x2d, 0x9f, 0x91, 0x1f, 0xe, 0x8b,
+                                                              0xac, 0xf9, 0x1e, 0x77, 0x1, 0x90, 0x16, 0xf7,
+                                                              0xed, 0xac, 0x6, 0x53, 0x60, 0x8e, 0xa9, 0x8f,
+                                                              0x8c, 0x8f, 0x8c, 0x90, 0x1f, 0xf7, 0x3a, 0xf8,
+                                                              0xf0, 0x49, 0x7b, 0x52, 0x7d, 0xfb, 0x27, 0x75,
+                                                              0x19, 0x89, 0x74, 0x5, 0x8e, 0x9f, 0xa6, 0x8d,
+                                                              0x9f, 0x1b, 0x93, 0xae, 0x8a, 0x74, 0x88, 0x8b,
+                                                              0x87, 0x8a, 0x87, 0x1f, 0xfb, 0x18, 0xfc, 0x87,
+                                                              0x80, 0x61, 0x4c, 0x88, 0x5e, 0x8a, 0x19, 0xe,
+                                                              0x8b, 0xf7, 0x3, 0xdb, 0x77, 0xf8, 0x3a, 0xe5,
+                                                              0x1, 0xf7, 0xcc, 0xf7, 0x1a, 0x3, 0x70, 0x16,
+                                                              0xf8, 0x3, 0x6, 0xda, 0xf7, 0x53, 0x5, 0x72,
+                                                              0x6, 0x4d, 0x69, 0x73, 0x79, 0x3a, 0x1b, 0xfb,
+                                                              0x29, 0x6, 0xf7, 0x58, 0xf7, 0x3b, 0x5, 0xcf,
+                                                              0xc5, 0xd7, 0xd5, 0xda, 0x1a, 0xf7, 0x11, 0x51,
+                                                              0xd0, 0x22, 0xfb, 0x11, 0x49, 0x22, 0x50, 0x6f,
+                                                              0x1e, 0xa1, 0x7f, 0x5, 0xa0, 0x99, 0xb6, 0xcc,
+                                                              0xd7, 0x1b, 0xe8, 0x8b, 0x36, 0x78, 0x3e, 0x59,
+                                                              0x3f, 0x52, 0x45, 0x1f, 0x5a, 0x50, 0x8b, 0x8b,
+                                                              0xfb, 0x4b, 0xfb, 0x4b, 0x8, 0xe, 0x7e, 0xb3,
+                                                              0xeb, 0x77, 0xf8, 0x91, 0xd2, 0x12, 0xf7, 0xb1,
+                                                              0xf7, 0xf, 0x34, 0xf7, 0x15, 0x13, 0xf0, 0xf7,
+                                                              0x14, 0xf7, 0xef, 0x15, 0xef, 0xc4, 0x66, 0x27,
+                                                              0x2e, 0x58, 0x31, 0x51, 0x68, 0x76, 0xa4, 0xa4,
+                                                              0x77, 0x1f, 0xa2, 0x78, 0x7b, 0xa2, 0x74, 0x1b,
+                                                              0x7a, 0x63, 0x84, 0x56, 0x80, 0x92, 0x4a, 0xf7,
+                                                              0x14, 0xf7, 0x30, 0xf7, 0x18, 0xec, 0xf7, 0x12,
+                                                              0xf0, 0x6a, 0xc1, 0x5f, 0xab, 0x1f, 0x13, 0xe8,
+                                                              0xf1, 0xbe, 0x9c, 0xb7, 0xb5, 0x1a, 0xe7, 0x3a,
+                                                              0xc4, 0x4a, 0x23, 0x4c, 0x46, 0x4b, 0x63, 0x1e,
+                                                              0xa0, 0x7e, 0x5, 0xae, 0xa6, 0xa6, 0xb3, 0xcb,
+                                                              0x1b, 0xc9, 0xa2, 0x65, 0x63, 0xfb, 0x9, 0xfb,
+                                                              0x25, 0x63, 0x5f, 0x83, 0x1f, 0xe, 0xa0, 0x76,
+                                                              0xf7, 0x2a, 0xed, 0xf8, 0x47, 0x77, 0x1, 0xf7,
+                                                              0x50, 0xf7, 0x14, 0xf7, 0xd, 0xcd, 0x3, 0xf7,
+                                                              0x79, 0xf7, 0x2a, 0x15, 0x62, 0xfb, 0x2a, 0x5,
+                                                              0xf7, 0x14, 0x6, 0xb5, 0xf7, 0x2a, 0x5, 0xcf,
+                                                              0x6, 0xa6, 0xed, 0x5, 0x46, 0x6, 0xf7, 0xb,
+                                                              0xf8, 0x47, 0x5, 0x49, 0x6, 0xfc, 0x3c, 0xfc,
+                                                              0x40, 0x6f, 0x22, 0x5, 0xf7, 0xef, 0xf8, 0xb,
+                                                              0x15, 0x8d, 0x89, 0x3d, 0xfb, 0xa7, 0x5, 0xfb,
+                                                              0x5f, 0x6, 0xe, 0x7e, 0xb3, 0x63, 0xf7, 0x1c,
+                                                              0xf7, 0x8d, 0xf7, 0x4, 0xd7, 0xf7, 0x1, 0x12,
+                                                              0xf7, 0xc7, 0xf4, 0x13, 0xb8, 0xd4, 0xf8, 0x8,
+                                                              0x15, 0xf7, 0x2a, 0xdf, 0x38, 0x25, 0x40, 0x52,
+                                                              0x36, 0x3d, 0x6d, 0x7f, 0xa6, 0xa4, 0x7b, 0x1f,
+                                                              0x13, 0x78, 0xa2, 0x7d, 0x7a, 0xa0, 0x68, 0x1b,
+                                                              0x6f, 0x6c, 0x7b, 0x5f, 0x6d, 0xac, 0x5d, 0xeb,
+                                                              0xf7, 0x29, 0xf7, 0x25, 0xed, 0xf7, 0x3c, 0xe6,
+                                                              0x22, 0xf7, 0x20, 0xfb, 0x24, 0x1f, 0xad, 0xd7,
+                                                              0x5, 0xf7, 0x92, 0x6, 0xaf, 0xf7, 0x1, 0x5,
+                                                              0xfb, 0xaf, 0x6, 0xe, 0x7c, 0xab, 0xf8, 0x1,
+                                                              0xb2, 0xf7, 0x96, 0x77, 0x1, 0xa2, 0xf7, 0x4,
+                                                              0xf7, 0x34, 0xf7, 0x10, 0x3, 0xf7, 0x7b, 0xf8,
+                                                              0x2d, 0x15, 0xbb, 0xee, 0xdd, 0xe8, 0xf7, 0x28,
+                                                              0xc1, 0x85, 0xa3, 0x18, 0xfb, 0xdd, 0x5b, 0xfb,
+                                                              0x2b, 0xfb, 0x8c, 0xfb, 0x4a, 0x1a, 0x3f, 0x9f,
+                                                              0xfb, 0x20, 0xf7, 0x32, 0xf7, 0xf, 0xf7, 0xb,
+                                                              0xf7, 0x1, 0xf7, 0x30, 0xf7, 0x10, 0x4b, 0xba,
+                                                              0x4a, 0x6e, 0x6d, 0x88, 0x82, 0x73, 0x1e, 0x2b,
+                                                              0xfb, 0xce, 0x15, 0xc7, 0xa1, 0xd8, 0xa0, 0xc6,
+                                                              0x1e, 0xde, 0xab, 0x8d, 0x93, 0xb7, 0x1b, 0xca,
+                                                              0x8b, 0x58, 0x77, 0x3f, 0x59, 0xfb, 0x1c, 0x88,
+                                                              0x80, 0x1f, 0x5c, 0x79, 0x72, 0x73, 0x6c, 0x1b,
+                                                              0x53, 0x8a, 0xc0, 0xa4, 0x1f, 0xe, 0xa0, 0x76,
+                                                              0xf8, 0xc0, 0xf7, 0x5, 0x1, 0xde, 0xf8, 0x68,
+                                                              0x3, 0xf7, 0x24, 0x16, 0xf8, 0x11, 0xf9, 0x31,
+                                                              0x5, 0xfc, 0x11, 0x6, 0x34, 0xfb, 0x52, 0x5,
+                                                              0xa5, 0x6, 0xc8, 0xae, 0xa3, 0x9b, 0xf7, 0x1,
+                                                              0x1b, 0xf7, 0xf, 0x6, 0xfb, 0xd6, 0xfc, 0xc0,
+                                                              0x5, 0xe, 0x7e, 0xa9, 0xf9, 0xd, 0xac, 0x12,
+                                                              0x8e, 0xec, 0x94, 0xf7, 0x3, 0xe1, 0xf7, 0x5,
+                                                              0x67, 0xe8, 0x13, 0xf8, 0xf7, 0x4b, 0xf7, 0xe8,
+                                                              0x15, 0x59, 0x7a, 0xfb, 0x16, 0x5e, 0xfb, 0x14,
+                                                              0x1a, 0x6b, 0x9b, 0xfb, 0x17, 0xf7, 0x49, 0xf7,
+                                                              0x9, 0xf1, 0xdd, 0xf7, 0x11, 0xe5, 0x50, 0xca,
+                                                              0x70, 0xa8, 0x1e, 0x90, 0x7, 0x13, 0xf4, 0xd8,
+                                                              0xaa, 0xcd, 0xb6, 0xe2, 0x1a, 0xf7, 0x1, 0xfb,
+                                                              0xc, 0xab, 0x55, 0xfb, 0x2, 0x38, 0x39, 0x43,
+                                                              0x3e, 0xb4, 0x43, 0xac, 0x68, 0x1e, 0xa5, 0x73,
+                                                              0x15, 0x13, 0xf8, 0xd7, 0x31, 0xa0, 0x71, 0x4f,
+                                                              0x1a, 0x4c, 0x65, 0x4a, 0x47, 0x39, 0x79, 0xd7,
+                                                              0xb7, 0xea, 0xbe, 0xbd, 0xc5, 0xb2, 0x1e, 0xf0,
+                                                              0xdd, 0x15, 0x5b, 0xb8, 0x61, 0xb7, 0xc8, 0x1a,
+                                                              0xb5, 0xa2, 0xc2, 0xc6, 0x1e, 0x13, 0xf4, 0xba,
+                                                              0xad, 0x65, 0x45, 0x4b, 0x65, 0x65, 0x68, 0x66,
+                                                              0x1f, 0xe, 0x96, 0x76, 0xf7, 0x93, 0x77, 0xf8,
+                                                              0x3e, 0xab, 0x1, 0xf7, 0x45, 0xf7, 0xf8, 0x15,
+                                                              0xa0, 0x9e, 0xf7, 0x1c, 0xaf, 0xd1, 0x1e, 0xb2,
+                                                              0x9f, 0xa6, 0xa8, 0xad, 0x1b, 0xbe, 0x8a, 0x5c,
+                                                              0x6e, 0x88, 0x88, 0x2e, 0x63, 0x25, 0x1f, 0x37,
+                                                              0x6b, 0x7c, 0x86, 0x6c, 0x1b, 0x7c, 0x59, 0x8c,
+                                                              0xce, 0x1f, 0xfb, 0x4b, 0xfc, 0x2, 0x15, 0xf7,
+                                                              0xfc, 0xbe, 0xf7, 0xd, 0xf7, 0xa7, 0xf7, 0x2a,
+                                                              0x1a, 0xf7, 0x18, 0x57, 0xe0, 0xfb, 0x2, 0xfb,
+                                                              0x41, 0x34, 0xfb, 0x2f, 0xfb, 0x8, 0x28, 0xc7,
+                                                              0x47, 0xe6, 0xa6, 0x9b, 0x91, 0x93, 0x9d, 0x1e,
+                                                              0x55, 0xfb, 0x9, 0x21, 0x2c, 0xfb, 0x9, 0x6b,
+                                                              0x8, 0xe, 0xfb, 0xdd, 0x7e, 0xf7, 0x26, 0xf7,
+                                                              0x47, 0xf7, 0x27, 0x12, 0xa2, 0xf7, 0x28, 0x54,
+                                                              0xf7, 0x28, 0x13, 0xe0, 0xa2, 0xc8, 0x43, 0x1d,
+                                                              0xaa, 0x62, 0x60, 0x6c, 0x6b, 0x63, 0x1e, 0x13,
+                                                              0xd0, 0xe8, 0xf7, 0xd9, 0x43, 0x1d, 0xab, 0x62,
+                                                              0x60, 0x6c, 0x6a, 0x63, 0x1e, 0xe, 0xfb, 0xdd,
+                                                              0xfb, 0x36, 0x76, 0xf7, 0xd0, 0x77, 0xf7, 0x5b,
+                                                              0xf7, 0x27, 0x1, 0xa2, 0x6d, 0x1d, 0x4c, 0xf7,
+                                                              0x28, 0x3, 0x72, 0xfb, 0x33, 0x15, 0x9e, 0x96,
+                                                              0xee, 0xbc, 0xc4, 0x1a, 0xa2, 0x79, 0x93, 0x78,
+                                                              0x98, 0x1e, 0x7a, 0x97, 0x7b, 0x99, 0xaa, 0x1a,
+                                                              0xb6, 0xa8, 0xaa, 0xb4, 0xa7, 0xc5, 0x7a, 0x3c,
+                                                              0xfb, 0x18, 0xfb, 0x44, 0x37, 0x7c, 0x87, 0x1e,
+                                                              0xf7, 0x14, 0xf8, 0xcd, 0x15, 0xb3, 0xaa, 0xac,
+                                                              0xb6, 0xb4, 0xac, 0x6b, 0x62, 0x60, 0x6a, 0x6c,
+                                                              0x62, 0x5f, 0x6d, 0xac, 0xb4, 0x1e, 0xe, 0x2f,
+                                                              0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xaa, 0xf8,
+                                                              0x90, 0x3, 0xf8, 0x7d, 0x83, 0x15, 0xcf, 0x7,
+                                                              0xfc, 0x6, 0xf7, 0x55, 0xf8, 0x38, 0xf7, 0x55,
+                                                              0x5, 0xcf, 0x7, 0xfc, 0x90, 0xfb, 0x7d, 0x5,
+                                                              0x53, 0x7, 0xe, 0x2f, 0xf1, 0xe5, 0xdd, 0xe4,
+                                                              0x67, 0xcf, 0x12, 0x13, 0xa0, 0xde, 0xf7, 0xdf,
+                                                              0x15, 0xf8, 0x5a, 0xcf, 0xfc, 0x5a, 0x6, 0x59,
+                                                              0xfb, 0xb8, 0x15, 0xf8, 0x5a, 0x6, 0x13, 0xc0,
+                                                              0xcc, 0xfc, 0x5a, 0x7, 0xe, 0x2f, 0x98, 0x76,
+                                                              0xf8, 0x9e, 0x77, 0x1, 0xf8, 0xaf, 0xf7, 0x75,
+                                                              0x15, 0xc3, 0x7, 0xfc, 0x5e, 0xf7, 0x7d, 0x5,
+                                                              0x47, 0x7, 0xf8, 0x6, 0xfb, 0x55, 0xfc, 0x38,
+                                                              0xfb, 0x55, 0x5, 0x47, 0x7, 0xe, 0x7e, 0xf7,
+                                                              0x28, 0xf7, 0xf5, 0xf7, 0x58, 0x6c, 0xaa, 0x12,
+                                                              0xda, 0xf7, 0x28, 0xfb, 0x0, 0xf7, 0xe, 0xf1,
+                                                              0xf7, 0x13, 0x13, 0xcc, 0xf7, 0x3b, 0xf7, 0x6b,
+                                                              0x15, 0xa8, 0x84, 0xa3, 0xc6, 0x9a, 0xaa, 0xb6,
+                                                              0xa7, 0x19, 0xf7, 0x19, 0xe2, 0xc6, 0xbc, 0xd9,
+                                                              0x1a, 0xba, 0x65, 0xec, 0xfb, 0x29, 0xfb, 0x1,
+                                                              0x54, 0x4d, 0x47, 0x67, 0xa5, 0x6d, 0xae, 0xab,
+                                                              0xa8, 0xa4, 0xad, 0x9f, 0x83, 0x98, 0x83, 0x95,
+                                                              0x1e, 0x84, 0x94, 0x85, 0x92, 0x94, 0x1a, 0x13,
+                                                              0xb4, 0xa0, 0xb6, 0x9c, 0xa7, 0xaa, 0xa8, 0x7b,
+                                                              0x49, 0x55, 0x71, 0x59, 0x3c, 0x2e, 0x1e, 0x4e,
+                                                              0x3f, 0x84, 0x59, 0x88, 0x6a, 0x8, 0x33, 0xfb,
+                                                              0x2e, 0x3c, 0xa, 0xf7, 0x3e, 0x79, 0xb9, 0xf7,
+                                                              0x6, 0xb0, 0x66, 0xbb, 0x5c, 0x77, 0xe7, 0x77,
+                                                              0xf7, 0xa4, 0xbb, 0xf7, 0x17, 0xb2, 0x12, 0xca,
+                                                              0xe6, 0xf7, 0xa, 0xd7, 0xf8, 0xc, 0xb9, 0x13,
+                                                              0xaf, 0xc0, 0xf7, 0xf0, 0xf7, 0xaa, 0x15, 0xf7,
+                                                              0xc, 0xe3, 0xd0, 0xbb, 0xa8, 0x9a, 0x75, 0x60,
+                                                              0xfb, 0x22, 0x40, 0x45, 0x5f, 0x6a, 0x6f, 0xa7,
+                                                              0xc7, 0x1e, 0xf7, 0x22, 0x4c, 0x15, 0x7e, 0xa2,
+                                                              0x4f, 0xcf, 0xf7, 0xd, 0xcf, 0xf7, 0x1e, 0xf3,
+                                                              0xf7, 0x40, 0xfb, 0x27, 0xf7, 0x15, 0xfb, 0x50,
+                                                              0xfb, 0x5c, 0xfb, 0x40, 0xfb, 0x28, 0xfb, 0x70,
+                                                              0xfb, 0x1d, 0xf7, 0x8, 0xfb, 0x5a, 0xf7, 0x9e,
+                                                              0xdb, 0xd1, 0xa7, 0xaa, 0xcc, 0x1e, 0x7e, 0xae,
+                                                              0x5, 0x70, 0x50, 0x57, 0x76, 0x30, 0x1b, 0xfb,
+                                                              0x3f, 0xfb, 0xc, 0xf7, 0x25, 0xf7, 0x24, 0xf7,
+                                                              0x77, 0xf7, 0x19, 0xf1, 0xf7, 0x28, 0xf7, 0x4b,
+                                                              0xf5, 0xfb, 0x26, 0xfb, 0x8, 0x1f, 0x13, 0xcf,
+                                                              0xc0, 0x34, 0x59, 0xfb, 0xa, 0x3e, 0x6c, 0x85,
+                                                              0xa4, 0x9f, 0x92, 0x8c, 0x91, 0x8c, 0x92, 0x1e,
+                                                              0xcc, 0xf7, 0x95, 0x5, 0x44, 0x6, 0x80, 0x65,
+                                                              0x5, 0xa4, 0x7d, 0x81, 0xa6, 0x5b, 0x1b, 0xfb,
+                                                              0x1d, 0x4b, 0xfb, 0x35, 0x3f, 0x1f, 0x13, 0x9f,
+                                                              0xc0, 0xfb, 0x3, 0xd0, 0x73, 0xa8, 0xc7, 0xba,
+                                                              0xc3, 0x9b, 0x96, 0x1e, 0xe, 0x51, 0x1d, 0x1,
+                                                              0x40, 0xf9, 0x28, 0x3, 0xf7, 0x15, 0x16, 0xae,
+                                                              0x7, 0x5f, 0x76, 0x9e, 0x9f, 0x90, 0x8d, 0x90,
+                                                              0x8e, 0x92, 0x3f, 0xa, 0x5b, 0x69, 0x83, 0x5e,
+                                                              0x2c, 0xa, 0x68, 0x7, 0xf8, 0xc, 0xf8, 0x7f,
+                                                              0x15, 0x74, 0x1d, 0xfb, 0x4d, 0x6, 0xe, 0x90,
+                                                              0x8b, 0xab, 0xf7, 0xc6, 0xa9, 0xf7, 0xa1, 0xae,
+                                                              0x12, 0xf8, 0x3e, 0xf7, 0x2d, 0x25, 0xea, 0x2c,
+                                                              0xf7, 0x27, 0x13, 0xf0, 0x73, 0x16, 0xf7, 0xaf,
+                                                              0x6, 0xf7, 0x27, 0xf7, 0x3a, 0xbe, 0xf7, 0x31,
+                                                              0xf1, 0x38, 0xa7, 0x58, 0x9b, 0x1f, 0x8d, 0x7,
+                                                              0x13, 0xe4, 0xcd, 0x9b, 0xf7, 0xc, 0xaf, 0xf7,
+                                                              0xd, 0x1a, 0xf7, 0x1f, 0xfb, 0x45, 0x8c, 0x50,
+                                                              0x1e, 0xfb, 0xa4, 0x68, 0x6, 0xb5, 0xaa, 0x86,
+                                                              0x63, 0x1f, 0xfb, 0x19, 0xfc, 0x76, 0x7a, 0x4d,
+                                                              0x6f, 0x86, 0x68, 0x86, 0x19, 0xf7, 0xb9, 0xf7,
+                                                              0xc3, 0x15, 0x13, 0xf0, 0xd3, 0xd9, 0x76, 0xfb,
+                                                              0x1, 0x5f, 0x72, 0xfb, 0x18, 0xfb, 0x1b, 0x65,
+                                                              0x74, 0x95, 0xa4, 0x93, 0x8c, 0x93, 0x8f, 0x96,
+                                                              0x1f, 0xd5, 0xf7, 0xa6, 0x15, 0xc8, 0xf7, 0x75,
+                                                              0x5, 0x9f, 0x90, 0x91, 0xa3, 0xb1, 0x1b, 0x13,
+                                                              0xe8, 0xd1, 0x9f, 0x55, 0x55, 0xfb, 0x38, 0xfb,
+                                                              0xc, 0x8e, 0x3b, 0x1f, 0xe, 0x90, 0x79, 0xc0,
+                                                              0xf8, 0xfb, 0xae, 0x1, 0xab, 0xf7, 0x2e, 0x3,
+                                                              0xf8, 0xb6, 0xf7, 0x2d, 0x15, 0x2f, 0x42, 0x4b,
+                                                              0x71, 0x3c, 0x1b, 0x7d, 0xfb, 0x16, 0x9f, 0xf7,
+                                                              0x47, 0xf7, 0x45, 0xf3, 0xf7, 0x83, 0xf7, 0x35,
+                                                              0xe3, 0xc5, 0x49, 0x32, 0x7f, 0x8a, 0x7e, 0x89,
+                                                              0x7e, 0x81, 0x1d, 0x81, 0x83, 0x7e, 0x75, 0x1b,
+                                                              0x82, 0x7f, 0x8f, 0x90, 0x7c, 0x1f, 0x94, 0x70,
+                                                              0x65, 0x96, 0x54, 0x1b, 0xfb, 0x87, 0xfb, 0x44,
+                                                              0xfb, 0x79, 0xfb, 0x72, 0xfb, 0x49, 0xf7, 0x22,
+                                                              0x44, 0xf7, 0x16, 0xf7, 0x16, 0xe6, 0xd3, 0xd8,
+                                                              0xbe, 0x1f, 0xe, 0xc7, 0x8b, 0xad, 0xf8, 0xf0,
+                                                              0xaa, 0x1, 0xf8, 0xae, 0xf7, 0x27, 0x3, 0xf7,
+                                                              0x52, 0xf7, 0x12, 0x15, 0xf7, 0x14, 0xf8, 0x6e,
+                                                              0x80, 0x1d, 0xfb, 0x2c, 0x2c, 0x25, 0x60, 0xfb,
+                                                              0x93, 0xfb, 0x97, 0x61, 0x7d, 0x99, 0xa3, 0x9a,
+                                                              0x8f, 0x9d, 0x77, 0xa, 0x8c, 0xf7, 0x13, 0xf7,
+                                                              0x73, 0x5d, 0xa, 0x77, 0x83, 0x72, 0xfb, 0xa,
+                                                              0xfc, 0x37, 0x1e, 0x75, 0x3d, 0x6b, 0x83, 0x6a,
+                                                              0x86, 0x8, 0xe, 0x51, 0xa, 0x1, 0x70, 0x16,
+                                                              0x37, 0x1d, 0x55, 0x7d, 0x95, 0x9c, 0x98, 0x93,
+                                                              0x9b, 0x90, 0x9e, 0x7e, 0xa, 0xf7, 0x4, 0xab,
+                                                              0x6f, 0x4c, 0x7e, 0x89, 0x7d, 0x89, 0x7b, 0x2a,
+                                                              0xa, 0xe, 0x90, 0xa0, 0x76, 0xf7, 0xe6, 0xab,
+                                                              0xf7, 0x9f, 0xab, 0x1, 0x7e, 0x16, 0xf7, 0xbb,
+                                                              0x6, 0x90, 0xae, 0x5, 0x5d, 0x71, 0x96, 0xa2,
+                                                              0x8e, 0x8b, 0x8f, 0x8c, 0x8f, 0x1f, 0xcb, 0xf7,
+                                                              0x96, 0x5, 0xf7, 0x2, 0xa6, 0x6c, 0x4e, 0x7e,
+                                                              0x89, 0x7d, 0x89, 0x7c, 0x4c, 0xa, 0x5, 0x37,
+                                                              0x5f, 0x7f, 0x75, 0xfb, 0x22, 0x1b, 0xc8, 0xf7,
+                                                              0x73, 0x5, 0xab, 0x94, 0x96, 0x97, 0xb2, 0x1b,
+                                                              0xf7, 0x49, 0x8b, 0x36, 0x47, 0x1f, 0xa6, 0x86,
+                                                              0xb6, 0xf7, 0x52, 0x5, 0xfc, 0xa9, 0x68, 0x6,
+                                                              0xbd, 0x85, 0xa4, 0x87, 0x7a, 0x8b, 0xa, 0x85,
+                                                              0x1e, 0xfb, 0x14, 0xfc, 0x94, 0x82, 0x67, 0x6c,
+                                                              0x89, 0x63, 0x84, 0x19, 0xe, 0xc7, 0x79, 0xb1,
+                                                              0xf7, 0xa6, 0xaf, 0xf7, 0xd3, 0xaf, 0x1, 0xa0,
+                                                              0xf7, 0x30, 0x3, 0xf8, 0x37, 0xf7, 0xba, 0x15,
+                                                              0xb9, 0x87, 0xaa, 0x88, 0x65, 0x1a, 0x84, 0x8a,
+                                                              0x81, 0x89, 0x81, 0x1e, 0x84, 0x68, 0x60, 0xfb,
+                                                              0x10, 0x87, 0x84, 0x8, 0x74, 0x7d, 0x60, 0x7e,
+                                                              0x5f, 0x1b, 0x6a, 0xfb, 0x14, 0xbd, 0xf7, 0x3f,
+                                                              0xf7, 0x67, 0xf4, 0xf7, 0x59, 0xf7, 0x34, 0xf7,
+                                                              0x3, 0xbb, 0x3b, 0x26, 0x1f, 0xa8, 0x87, 0xbe,
+                                                              0xf7, 0x71, 0x5, 0x6c, 0x6, 0x81, 0x86, 0x82,
+                                                              0x77, 0x6f, 0x1b, 0x7e, 0x80, 0x90, 0x90, 0x7c,
+                                                              0x1f, 0x94, 0x73, 0x68, 0x96, 0x47, 0x1b, 0xfb,
+                                                              0x99, 0xfb, 0x34, 0xfb, 0x88, 0xfb, 0x5c, 0xfb,
+                                                              0x45, 0xf7, 0x1c, 0x39, 0xf7, 0x39, 0xd7, 0xf7,
+                                                              0x7, 0xa4, 0xa4, 0xc1, 0x1f, 0x97, 0x94, 0xbb,
+                                                              0xf7, 0x49, 0x9d, 0xd0, 0x93, 0x8a, 0xc0, 0x8f,
+                                                              0x19, 0xaf, 0xfb, 0xb3, 0x7, 0xe, 0xf7, 0x8,
+                                                              0x8b, 0xae, 0xf7, 0xba, 0xb7, 0xf7, 0x99, 0xae,
+                                                              0x1, 0x73, 0x16, 0x75, 0x1d, 0x5e, 0x8e, 0x6e,
+                                                              0x95, 0xa5, 0x1a, 0x8f, 0x8c, 0x8f, 0x8c, 0x90,
+                                                              0x1e, 0xcd, 0xf7, 0x86, 0x5, 0xf7, 0x83, 0x6,
+                                                              0x4c, 0xfb, 0x86, 0x83, 0x6b, 0x79, 0x7a, 0x3f,
+                                                              0x88, 0x19, 0x68, 0xf7, 0xd1, 0xae, 0x7, 0x69,
+                                                              0x8c, 0x64, 0x97, 0xa7, 0x1a, 0x8e, 0x8b, 0x8f,
+                                                              0x8c, 0x8f, 0x1e, 0xf7, 0x19, 0xf8, 0x79, 0x9b,
+                                                              0xc9, 0xa4, 0x85, 0xb3, 0x91, 0x19, 0x61, 0xa,
+                                                              0xc0, 0x83, 0xa1, 0x7b, 0x74, 0x1a, 0x86, 0x8a,
+                                                              0x86, 0x8a, 0x86, 0x1e, 0x52, 0xfb, 0x5b, 0x5,
+                                                              0xfb, 0x83, 0x6, 0xc1, 0xf7, 0x5b, 0x9b, 0xc7,
+                                                              0xa8, 0x8b, 0xc3, 0x8d, 0x82, 0xa, 0xbe, 0x84,
+                                                              0xa3, 0x7b, 0x74, 0x1a, 0x86, 0x8a, 0x86, 0x8a,
+                                                              0x85, 0x1e, 0xfb, 0x18, 0xfc, 0x79, 0x80, 0x62,
+                                                              0x6a, 0x86, 0x66, 0x85, 0x19, 0xe, 0xfb, 0xa5,
+                                                              0xa0, 0x76, 0xf9, 0xe, 0xae, 0x1, 0x6b, 0x16,
+                                                              0x75, 0x1d, 0x60, 0x8d, 0x6e, 0x9b, 0xa4, 0x1a,
+                                                              0x90, 0x8b, 0x90, 0x8c, 0x90, 0x1e, 0xf7, 0x21,
+                                                              0xf8, 0x77, 0x9a, 0xbe, 0x9e, 0x8d, 0x56, 0x1d,
+                                                              0xc5, 0x86, 0xa0, 0x75, 0x88, 0x7a, 0x8a, 0x86,
+                                                              0x8a, 0x86, 0x8a, 0x87, 0xfb, 0x18, 0xfc, 0x77,
+                                                              0x18, 0x80, 0x61, 0x70, 0x81, 0x60, 0x85, 0x8,
+                                                              0xe, 0x45, 0xf7, 0x3f, 0xf8, 0xcc, 0x77, 0x12,
+                                                              0x5d, 0xf7, 0x13, 0xfb, 0x13, 0xf8, 0xce, 0x13,
+                                                              0xe0, 0xf7, 0x77, 0xf9, 0xe, 0x15, 0xbd, 0x84,
+                                                              0xa4, 0x7c, 0x73, 0x8b, 0xa, 0x84, 0x1e, 0x22,
+                                                              0xfc, 0x2d, 0x5, 0xfb, 0xb, 0x6b, 0x5d, 0x61,
+                                                              0x73, 0x1b, 0x81, 0x86, 0x92, 0x99, 0x98, 0x8f,
+                                                              0x8f, 0x92, 0x92, 0x1f, 0x92, 0x92, 0x90, 0x92,
+                                                              0x9e, 0x1a, 0xaf, 0x6e, 0xa5, 0x68, 0x68, 0x6f,
+                                                              0x6f, 0x60, 0x4e, 0xd1, 0x64, 0xdc, 0xf7, 0x18,
+                                                              0xbe, 0xe5, 0xf1, 0xa6, 0x1e, 0xf7, 0x0, 0xf8,
+                                                              0x2d, 0x5, 0x13, 0xd0, 0x9e, 0xc4, 0x9a, 0x88,
+                                                              0xba, 0x93, 0x8, 0xae, 0xfb, 0xbd, 0x7, 0xe,
+                                                              0x90, 0xa0, 0x76, 0xf9, 0x31, 0x77, 0x1, 0x76,
+                                                              0x16, 0xf7, 0xb5, 0xae, 0x6, 0x64, 0x70, 0x98,
+                                                              0xad, 0x90, 0x8c, 0x90, 0x8c, 0x91, 0x1f, 0xcb,
+                                                              0xf7, 0x79, 0x93, 0x89, 0x5, 0xf7, 0x1, 0xfb,
+                                                              0x7d, 0x97, 0x74, 0x88, 0x1a, 0x74, 0x84, 0x8a,
+                                                              0x51, 0x84, 0x1e, 0x68, 0xf7, 0xac, 0xae, 0x7,
+                                                              0x71, 0x8e, 0x74, 0x8d, 0x7d, 0xa9, 0xfb, 0x31,
+                                                              0xf7, 0xdc, 0x18, 0xf7, 0x6c, 0xf7, 0x50, 0xb8,
+                                                              0xb5, 0x98, 0x8c, 0xaf, 0x90, 0x19, 0xae, 0xfb,
+                                                              0x67, 0x68, 0x7, 0xb2, 0x87, 0x9c, 0x89, 0x75,
+                                                              0x1a, 0x72, 0xfb, 0x78, 0xfb, 0x44, 0x64, 0x54,
+                                                              0x1e, 0x86, 0x8c, 0xc7, 0xf7, 0x71, 0x9b, 0xc5,
+                                                              0xa7, 0x8b, 0xbd, 0x8f, 0x19, 0xae, 0xfb, 0xca,
+                                                              0x68, 0x7, 0xbd, 0x84, 0xa4, 0x7c, 0x74, 0x7c,
+                                                              0x1d, 0x79, 0x4b, 0x70, 0x88, 0x68, 0x86, 0x19,
+                                                              0xe, 0x53, 0x1d, 0x55, 0x7e, 0x96, 0x9d, 0x94,
+                                                              0x8f, 0x96, 0x8e, 0x98, 0x1f, 0xf7, 0x15, 0xf8,
+                                                              0x72, 0x9b, 0xc7, 0xa8, 0x8a, 0xc3, 0x8e, 0x82,
+                                                              0xa, 0xbf, 0x84, 0xa2, 0x7b, 0x75, 0x7c, 0x1d,
+                                                              0x7b, 0x52, 0x76, 0x82, 0x60, 0x85, 0x19, 0xe,
+                                                              0xf7, 0x77, 0x8b, 0xae, 0x71, 0x76, 0xf7, 0x60,
+                                                              0x77, 0xf8, 0x85, 0x77, 0x12, 0x13, 0xb0, 0x6e,
+                                                              0x16, 0xf7, 0x63, 0xae, 0x6, 0x50, 0x79, 0xa3,
+                                                              0xac, 0xa5, 0x93, 0xab, 0x93, 0xa7, 0x1f, 0xef,
+                                                              0xf8, 0x0, 0x5, 0x8d, 0x6, 0x13, 0x70, 0xcd,
+                                                              0xfc, 0xbe, 0x5, 0xa7, 0x6, 0xf8, 0x7, 0xf8,
+                                                              0xca, 0x8d, 0x89, 0xfb, 0xf, 0xfc, 0x47, 0x5,
+                                                              0x13, 0xb0, 0x7b, 0x50, 0x6f, 0x78, 0x53, 0x87,
+                                                              0x8, 0x68, 0xf7, 0xcc, 0xae, 0x7, 0x55, 0x7a,
+                                                              0x96, 0xa0, 0x98, 0x8f, 0x9c, 0x90, 0x9f, 0x1f,
+                                                              0xf7, 0xf, 0xf8, 0x51, 0x9b, 0xc9, 0xa4, 0x8f,
+                                                              0xb3, 0x91, 0x19, 0xae, 0xfb, 0x68, 0x7, 0xfb,
+                                                              0xc8, 0xfc, 0x71, 0x6f, 0xa, 0x55, 0xf8, 0x71,
+                                                              0x5, 0xfb, 0x71, 0x68, 0x6, 0xc0, 0x89, 0x9e,
+                                                              0x89, 0x6c, 0x1a, 0xfb, 0xc, 0xfc, 0x39, 0x63,
+                                                              0xfb, 0x1e, 0x7f, 0x92, 0x5a, 0x7f, 0x19, 0xe,
+                                                              0x8b, 0x1d, 0x12, 0x13, 0xa0, 0x70, 0x16, 0xf7,
+                                                              0x64, 0xae, 0x6, 0x51, 0x79, 0x9d, 0xb0, 0x9a,
+                                                              0x8e, 0x9b, 0x90, 0x9c, 0x1f, 0xf4, 0xf8, 0x20,
+                                                              0x5, 0x13, 0x60, 0x59, 0xa, 0x8d, 0x96, 0x94,
+                                                              0x8a, 0x93, 0x1b, 0xaf, 0x97, 0x72, 0x6b, 0x6f,
+                                                              0x85, 0x6a, 0x83, 0x71, 0x64, 0x1d, 0xfb, 0x12,
+                                                              0xfc, 0x57, 0x18, 0x13, 0xa0, 0x6d, 0x21, 0x80,
+                                                              0x9b, 0x55, 0x7e, 0x8, 0xe, 0xc7, 0x79, 0xad,
+                                                              0xf9, 0xf, 0xad, 0x1, 0x4d, 0xa, 0x3, 0xf7,
+                                                              0x3f, 0xf7, 0x2a, 0x15, 0xe7, 0xe0, 0xf8, 0x2d,
+                                                              0xf7, 0x4c, 0xf3, 0x8e, 0x21, 0x76, 0xfb, 0x8,
+                                                              0x2f, 0xfc, 0x1c, 0xfb, 0x46, 0x50, 0x5c, 0xad,
+                                                              0x55, 0x1d, 0xd4, 0xfb, 0x14, 0xf7, 0x3b, 0xf7,
+                                                              0x8d, 0xf7, 0x43, 0xf7, 0x9e, 0xf7, 0x56, 0xf7,
+                                                              0x42, 0xfb, 0x1b, 0xd0, 0xfb, 0x1, 0xfb, 0x6f,
+                                                              0xfb, 0x5d, 0xfb, 0x7d, 0xfb, 0x89, 0x1e, 0xe,
+                                                              0x58, 0xa0, 0x76, 0xf7, 0xd6, 0xab, 0xf7, 0xaf,
+                                                              0xab, 0x1, 0xf8, 0x67, 0xf7, 0x26, 0x3, 0xf7,
+                                                              0xa1, 0xf7, 0xf6, 0x6f, 0x1d, 0x23, 0x54, 0x55,
+                                                              0xfb, 0x23, 0x1f, 0xfb, 0xbc, 0xfb, 0xf6, 0x15,
+                                                              0xf7, 0xba, 0xae, 0x6, 0x5a, 0x78, 0xa3, 0xb2,
+                                                              0x97, 0x8e, 0x98, 0x8e, 0x99, 0x1f, 0xc1, 0xf7,
+                                                              0x4d, 0x5, 0xf7, 0x27, 0xf7, 0x63, 0xa4, 0xf7,
+                                                              0x39, 0xf7, 0x12, 0x20, 0xaa, 0x21, 0x1f, 0xfb,
+                                                              0xb3, 0x68, 0x6, 0xbe, 0x84, 0xa3, 0x88, 0x79,
+                                                              0x8b, 0xa, 0x86, 0x1e, 0xfb, 0xf, 0xfc, 0x5b,
+                                                              0x7a, 0x4d, 0x6a, 0x6a, 0x63, 0x84, 0x19, 0xe,
+                                                              0xc7, 0xfb, 0x64, 0xe8, 0x5d, 0xf7, 0x46, 0x69,
+                                                              0xad, 0xf9, 0xe, 0xad, 0x12, 0x4d, 0xa, 0x13,
+                                                              0x5c, 0xf7, 0x3f, 0xf7, 0x2a, 0x15, 0xe7, 0xe2,
+                                                              0xf8, 0x2d, 0xf7, 0x4c, 0xf3, 0x8c, 0x23, 0x76,
+                                                              0xfb, 0x8, 0x2d, 0xfc, 0x1d, 0xfb, 0x46, 0x50,
+                                                              0x5e, 0xac, 0xef, 0x1e, 0xfb, 0x23, 0xfb, 0xcf,
+                                                              0x15, 0x99, 0x73, 0x5, 0xa2, 0xc4, 0xad, 0x90,
+                                                              0xa0, 0x1b, 0xbe, 0xae, 0x7b, 0x7e, 0xb6, 0x1f,
+                                                              0x13, 0xbc, 0x81, 0xab, 0xaf, 0x83, 0xbc, 0x1b,
+                                                              0xf7, 0x20, 0xd2, 0xe3, 0xc8, 0xb7, 0x1f, 0x76,
+                                                              0x9e, 0x5, 0x58, 0x6b, 0x51, 0x73, 0x4e, 0x1b,
+                                                              0x6e, 0x6c, 0x8e, 0x94, 0x70, 0x1f, 0x57, 0x9b,
+                                                              0x5e, 0x93, 0x69, 0x8f, 0x8, 0x66, 0x90, 0x75,
+                                                              0x8c, 0x8f, 0x1a, 0x90, 0xaa, 0xa8, 0x9a, 0x99,
+                                                              0x1e, 0xf7, 0x86, 0xf7, 0x59, 0xf7, 0x91, 0xf7,
+                                                              0x64, 0xf7, 0x42, 0xfb, 0x19, 0xce, 0x5d, 0x1d,
+                                                              0xfb, 0x7d, 0xfb, 0x89, 0x38, 0xbc, 0x27, 0xf7,
+                                                              0x5, 0x6c, 0x1f, 0x95, 0x87, 0x8b, 0x8b, 0x8f,
+                                                              0x86, 0x88, 0x85, 0x8b, 0x8b, 0xfb, 0x40, 0xfb,
+                                                              0x23, 0x8, 0xe, 0x90, 0xa0, 0x76, 0xf9, 0x11,
+                                                              0xab, 0x1, 0xf8, 0x6c, 0xf7, 0x2b, 0x3, 0xf7,
+                                                              0xa5, 0xf7, 0xff, 0x15, 0xc7, 0xf7, 0x7a, 0x5,
+                                                              0xa2, 0x90, 0x92, 0xa0, 0xac, 0x1b, 0xcb, 0xa9,
+                                                              0x56, 0x4f, 0x25, 0x3b, 0x50, 0xfb, 0xb, 0x1f,
+                                                              0xfb, 0xc2, 0xfb, 0xff, 0x8e, 0x1d, 0x66, 0x71,
+                                                              0x8e, 0xb0, 0x94, 0x8d, 0x95, 0x8e, 0x98, 0x1f,
+                                                              0xc2, 0xf7, 0x74, 0x5, 0xa8, 0x6, 0xf6, 0xfb,
+                                                              0xdf, 0x5, 0xf7, 0x5e, 0xae, 0x6, 0x5b, 0x90,
+                                                              0x79, 0x8d, 0x75, 0xcc, 0x38, 0xf7, 0x80, 0x18,
+                                                              0xf7, 0x17, 0xa0, 0xc8, 0xdf, 0xd7, 0x1a, 0xf7,
+                                                              0x25, 0xfb, 0x44, 0x8b, 0x4f, 0x1e, 0xfb, 0xa8,
+                                                              0x68, 0x6, 0xbf, 0x84, 0xa2, 0x82, 0x77, 0x1a,
+                                                              0x87, 0x8a, 0x87, 0x8a, 0x84, 0x1e, 0xfb, 0x19,
+                                                              0xfc, 0x70, 0x7b, 0x52, 0x77, 0x81, 0x5f, 0x86,
+                                                              0x19, 0xe, 0x21, 0x79, 0xad, 0xf9, 0xe, 0xae,
+                                                              0x87, 0x85, 0x1d, 0x13, 0xd8, 0x8d, 0x79, 0x15,
+                                                              0xa9, 0x6, 0xa2, 0x96, 0x8f, 0x97, 0xa4, 0x1b,
+                                                              0x98, 0x9a, 0x84, 0x83, 0xa2, 0x1f, 0x82, 0xa6,
+                                                              0xaa, 0x80, 0xb4, 0x1b, 0xf7, 0x30, 0xe5, 0xf7,
+                                                              0x0, 0xf7, 0x18, 0xd3, 0x54, 0xc2, 0x51, 0xb8,
+                                                              0x1f, 0x4b, 0xbe, 0x47, 0xb6, 0xc2, 0x1a, 0x97,
+                                                              0x84, 0xea, 0xf1, 0xf7, 0x6, 0xa6, 0xfb, 0x2,
+                                                              0x53, 0x1e, 0xa6, 0x87, 0x5, 0x13, 0xb8, 0xb3,
+                                                              0xf7, 0x5d, 0x5, 0x6d, 0x6, 0x72, 0x7e, 0x70,
+                                                              0x8a, 0x87, 0x1b, 0x7c, 0x7a, 0x92, 0x92, 0x74,
+                                                              0x1f, 0x13, 0xd8, 0x93, 0x74, 0x70, 0x93, 0x6e,
+                                                              0x1b, 0xfb, 0x19, 0x38, 0x2b, 0x26, 0x3b, 0xc8,
+                                                              0x5e, 0xc8, 0x63, 0x1f, 0xc8, 0x63, 0xc9, 0x66,
+                                                              0x4b, 0x1a, 0x77, 0x7e, 0xfb, 0x26, 0xfb, 0x4,
+                                                              0x61, 0xfb, 0x5, 0x9b, 0xf7, 0x40, 0x1e, 0x6e,
+                                                              0x8d, 0x5, 0xe, 0x58, 0x58, 0xa, 0x1, 0xbd,
+                                                              0x16, 0xf7, 0xdf, 0x6, 0x8d, 0xae, 0x5, 0x51,
+                                                              0x76, 0x91, 0xa9, 0x94, 0x8e, 0x97, 0x8f, 0x9a,
+                                                              0x1f, 0xf7, 0x1e, 0xf8, 0xa3, 0x5, 0xc0, 0xe0,
+                                                              0x85, 0xfb, 0x29, 0x1f, 0xa6, 0x89, 0xaf, 0xf7,
+                                                              0x54, 0x5, 0xfc, 0xbb, 0x6, 0x65, 0xfb, 0x3f,
+                                                              0xa4, 0x84, 0x5, 0xf1, 0xbe, 0xd2, 0xb4, 0xea,
+                                                              0x1b, 0xfb, 0x26, 0xfc, 0xa3, 0x78, 0x46, 0x62,
+                                                              0x86, 0x5e, 0x8d, 0x19, 0xe, 0xc7, 0x79, 0xc3,
+                                                              0xf8, 0xe9, 0xad, 0x1, 0xce, 0xf7, 0x1e, 0x3,
+                                                              0xed, 0xf9, 0xe, 0x15, 0xc9, 0x83, 0x96, 0x6b,
+                                                              0x6b, 0x5d, 0x23, 0xfb, 0xa8, 0x38, 0xa, 0xe1,
+                                                              0xf7, 0xbb, 0x99, 0xbc, 0x9d, 0x9b, 0x55, 0xa,
+                                                              0x8c, 0x93, 0x93, 0x8b, 0x92, 0x1b, 0xba, 0x98,
+                                                              0x68, 0x72, 0x85, 0x8a, 0x85, 0x8a, 0x86, 0x1f,
+                                                              0x3b, 0xfb, 0xbb, 0x5, 0x21, 0x6f, 0x65, 0xfb,
+                                                              0xb, 0xfb, 0x23, 0x1b, 0x28, 0x73, 0xb7, 0xc5,
+                                                              0xb3, 0x9b, 0xbb, 0x97, 0xb7, 0x3e, 0x1d, 0xe,
+                                                              0x90, 0x87, 0x76, 0xf7, 0x53, 0x77, 0xb2, 0x77,
+                                                              0xf8, 0x5c, 0xae, 0x12, 0xd3, 0xf9, 0x1e, 0x13,
+                                                              0xd8, 0x13, 0xb8, 0xf7, 0x7b, 0x79, 0x15, 0xab,
+                                                              0x6, 0xf8, 0x1d, 0xf8, 0xf8, 0x91, 0x94, 0x9b,
+                                                              0x9f, 0xb0, 0x96, 0x19, 0xae, 0xfb, 0x54, 0x68,
+                                                              0x7, 0xba, 0x87, 0x9d, 0x8a, 0x6c, 0x1a, 0xfb,
+                                                              0x8b, 0xfc, 0x31, 0x6f, 0xa, 0x58, 0xf8, 0x18,
+                                                              0x5, 0x8a, 0x96, 0x8b, 0x94, 0x92, 0x1a, 0xa7,
+                                                              0xa7, 0x8d, 0xbb, 0x8f, 0x1e, 0x61, 0xa, 0xc7,
+                                                              0x89, 0x93, 0x82, 0x94, 0x51, 0x8, 0xe, 0xf7,
+                                                              0x77, 0x8e, 0x76, 0xf7, 0x8b, 0x77, 0xf8, 0x3d,
+                                                              0xae, 0x1, 0xf7, 0x70, 0x79, 0x15, 0xa8, 0x6,
+                                                              0xf7, 0x7b, 0xf8, 0x7a, 0x5, 0x8d, 0x6, 0xc6,
+                                                              0xfc, 0x7a, 0x5, 0xa8, 0x6, 0xf7, 0xa8, 0xf8,
+                                                              0xcf, 0xab, 0xcb, 0xaa, 0x98, 0xaa, 0x90, 0x19,
+                                                              0xad, 0xfb, 0x4f, 0x68, 0x7, 0xb8, 0x8e, 0x9d,
+                                                              0x81, 0x74, 0x1a, 0x7d, 0x86, 0x7a, 0x81, 0x77,
+                                                              0x1e, 0xfb, 0x2e, 0xfb, 0xd8, 0x6f, 0xa, 0x6a,
+                                                              0xf7, 0xb8, 0x5, 0x88, 0xa4, 0x89, 0xa0, 0x9e,
+                                                              0x1a, 0xaa, 0x99, 0x9b, 0xbb, 0x8c, 0x1e, 0xae,
+                                                              0xfb, 0xa1, 0x69, 0x7, 0xbe, 0x83, 0x9f, 0x92,
+                                                              0x2a, 0x1a, 0xfb, 0x28, 0xfb, 0xc8, 0x6f, 0xa,
+                                                              0x64, 0xf7, 0xe0, 0x5, 0x8a, 0x94, 0x8b, 0x93,
+                                                              0x92, 0x1a, 0xb0, 0xa8, 0x94, 0xab, 0x8e, 0x1e,
+                                                              0xae, 0xfb, 0xa9, 0x69, 0x7, 0xcb, 0x80, 0x8d,
+                                                              0x94, 0x96, 0x43, 0x8, 0xe, 0x90, 0x58, 0xa,
+                                                              0x1, 0x73, 0x16, 0xf7, 0x6a, 0xae, 0x6, 0x74,
+                                                              0x8d, 0x57, 0x90, 0xae, 0x1a, 0xf7, 0x42, 0xf7,
+                                                              0x4f, 0x5, 0x95, 0x63, 0xba, 0x20, 0x60, 0x1a,
+                                                              0x69, 0x6b, 0x89, 0x67, 0x88, 0x1e, 0x68, 0xf7,
+                                                              0xc8, 0xae, 0x7, 0x3f, 0x92, 0x7e, 0xa2, 0x70,
+                                                              0xe1, 0x41, 0xf7, 0x77, 0x18, 0xf7, 0x5b, 0xf7,
+                                                              0x57, 0xbf, 0xc1, 0xa3, 0x8e, 0xa2, 0x8f, 0x19,
+                                                              0xae, 0xfb, 0x5f, 0x68, 0x7, 0xac, 0x88, 0xa6,
+                                                              0x7b, 0x7b, 0x1a, 0x87, 0x8a, 0x87, 0x87, 0x87,
+                                                              0x1e, 0xfb, 0x38, 0xfb, 0x3a, 0x5, 0x7c, 0xbf,
+                                                              0x67, 0xda, 0x9e, 0x1a, 0xad, 0x9a, 0xa2, 0xc6,
+                                                              0x91, 0x1e, 0xae, 0xfb, 0xc5, 0x68, 0x7, 0xbf,
+                                                              0x86, 0xa3, 0x83, 0x9a, 0x59, 0xdf, 0xfb, 0x9a,
+                                                              0x18, 0x4f, 0x4c, 0xfb, 0x3, 0xfb, 0xc, 0x47,
+                                                              0x50, 0x75, 0x78, 0x84, 0x87, 0x6c, 0x82, 0x8,
+                                                              0xe, 0x58, 0x58, 0xa, 0x1, 0xd4, 0x16, 0xf7,
+                                                              0xd6, 0xae, 0x6, 0x5d, 0x8d, 0x6c, 0x8c, 0xb4,
+                                                              0x1a, 0xc7, 0xf7, 0x79, 0x6a, 0xa, 0xc4, 0x88,
+                                                              0xa3, 0x80, 0x78, 0x1a, 0x81, 0x87, 0x7f, 0x81,
+                                                              0x7e, 0x1e, 0xfb, 0x2f, 0xfb, 0x6a, 0x48, 0xf7,
+                                                              0x5c, 0x8d, 0x83, 0x81, 0xa5, 0x19, 0x87, 0x95,
+                                                              0x88, 0x96, 0x92, 0x1a, 0xa6, 0xa8, 0x94, 0xb9,
+                                                              0x6a, 0x1d, 0x4f, 0xfb, 0x62, 0x79, 0x4b, 0x72,
+                                                              0x88, 0x51, 0x86, 0x19, 0xe, 0x58, 0x58, 0xa,
+                                                              0x3e, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x33, 0xb8,
+                                                              0xf9, 0x7b, 0xb8, 0x1, 0x66, 0xfb, 0x33, 0x15,
+                                                              0xf7, 0x6f, 0x6, 0x92, 0xb8, 0x5, 0x3b, 0x6,
+                                                              0x7f, 0x76, 0x8b, 0xa3, 0x1f, 0xf7, 0x32, 0xf9,
+                                                              0x24, 0x5, 0xc6, 0x99, 0x8a, 0x8f, 0xb0, 0x1b,
+                                                              0xd2, 0x6, 0x92, 0xb8, 0x5, 0xfb, 0x5c, 0x6,
+                                                              0xe, 0xfc, 0x14, 0xfb, 0x1c, 0x76, 0xf7, 0x34,
+                                                              0x8d, 0x1d, 0xf7, 0x1e, 0xfb, 0x31, 0x15, 0xc6,
+                                                              0x6, 0x32, 0xf9, 0xde, 0x5, 0x50, 0x6, 0xe,
+                                                              0xfb, 0xdd, 0xfb, 0x31, 0xb8, 0xf9, 0x79, 0xb8,
+                                                              0x1, 0x64, 0xfb, 0x4, 0x15, 0x84, 0x5e, 0x5,
+                                                              0xf7, 0x5b, 0x6, 0xf7, 0x5c, 0xf9, 0xd3, 0x5,
+                                                              0xfb, 0x70, 0x6, 0x84, 0x5e, 0x5, 0xd9, 0x6,
+                                                              0x96, 0xa3, 0x88, 0x75, 0x1f, 0xfb, 0x31, 0xfd,
+                                                              0x21, 0x5, 0x51, 0x7d, 0x89, 0x86, 0x66, 0x1b,
+                                                              0xe, 0x2f, 0xf7, 0xd9, 0x76, 0xf8, 0x1, 0x77,
+                                                              0x1, 0xce, 0xf7, 0xc4, 0x15, 0xe4, 0x6, 0xf7,
+                                                              0x15, 0xf7, 0xa1, 0xf7, 0x15, 0xfb, 0xa1, 0x5,
+                                                              0xe4, 0x6, 0xfb, 0x46, 0xf8, 0x1, 0x5, 0x3b,
+                                                              0x6, 0xe, 0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4,
+                                                              0x59, 0xf8, 0x88, 0xbd, 0x7, 0xe, 0x7f, 0x1d,
+                                                              0xf7, 0x49, 0x77, 0x1, 0xf7, 0x90, 0xf8, 0x98,
+                                                              0x7b, 0xa, 0xfb, 0x3, 0xf7, 0x27, 0x5, 0x98,
+                                                              0x80, 0x7a, 0xa0, 0x70, 0x1b, 0x70, 0x78, 0x75,
+                                                              0x76, 0x76, 0xa0, 0x78, 0x98, 0x82, 0x1f, 0xe,
+                                                              0x58, 0x1d, 0xb5, 0x85, 0x77, 0x74, 0xa, 0x13,
+                                                              0x68, 0xf7, 0x8e, 0xf7, 0x7, 0x15, 0x2e, 0x1d,
+                                                              0x13, 0x98, 0x71, 0xa, 0x90, 0x94, 0x44, 0xa,
+                                                              0x5, 0xfb, 0x3, 0x6, 0x7a, 0x4d, 0x6f, 0xa,
+                                                              0x13, 0xa8, 0xa4, 0x87, 0x8a, 0xb6, 0x4f, 0x1b,
+                                                              0xfb, 0xe, 0xfb, 0x33, 0x2f, 0x1d, 0xcc, 0xd5,
+                                                              0xf7, 0x84, 0xdf, 0x94, 0xad, 0x39, 0xa, 0xe,
+                                                              0x7e, 0xac, 0xf8, 0xa, 0xcf, 0xf7, 0x81, 0x77,
+                                                              0x1, 0xf7, 0xd3, 0xf7, 0x11, 0x3, 0xf7, 0x5a,
+                                                              0xf8, 0xc, 0x15, 0x89, 0x8d, 0xe3, 0xf7, 0xd5,
+                                                              0x42, 0x77, 0x1d, 0x65, 0xfb, 0x2d, 0xfc, 0x83,
+                                                              0x6e, 0x1a, 0x77, 0xc1, 0x63, 0xe0, 0xf7, 0x3b,
+                                                              0xf7, 0x2c, 0xf7, 0x3e, 0xf7, 0x3d, 0xd9, 0x5b,
+                                                              0xc5, 0x4d, 0x4c, 0x64, 0x63, 0x5d, 0x69, 0x1e,
+                                                              0x32, 0xfb, 0xd9, 0x15, 0x8c, 0xc7, 0xf7, 0xea,
+                                                              0xf3, 0xb9, 0x8b, 0x58, 0x7a, 0x36, 0x4a, 0xfb,
+                                                              0x71, 0xfb, 0x5, 0x86, 0x70, 0x8b, 0xaa, 0x1e,
+                                                              0xe, 0xfb, 0x6e, 0x7e, 0xcb, 0xf7, 0x8f, 0xf7,
+                                                              0x34, 0x6a, 0xac, 0x12, 0x86, 0xf7, 0x14, 0x13,
+                                                              0xb0, 0xf7, 0xd2, 0xf7, 0x21, 0x15, 0x51, 0x63,
+                                                              0x66, 0x6b, 0x5e, 0x1b, 0x6e, 0x5f, 0x95, 0xdb,
+                                                              0xd2, 0xc7, 0xf7, 0x6d, 0xe2, 0x94, 0x99, 0x87,
+                                                              0x7e, 0x83, 0x85, 0x83, 0x85, 0x81, 0x1f, 0x86,
+                                                              0x82, 0x87, 0x81, 0x7e, 0x1a, 0x13, 0xd0, 0x84,
+                                                              0x1d, 0x67, 0xb7, 0x3c, 0xfb, 0x1e, 0xfb, 0x24,
+                                                              0xfb, 0x3c, 0xfb, 0x2d, 0xfb, 0x3, 0xde, 0x60,
+                                                              0xcd, 0xf5, 0xbe, 0xd3, 0xcb, 0xb8, 0x1e, 0xe,
+                                                              0x7e, 0xd3, 0x5a, 0x76, 0xf8, 0x43, 0xb5, 0xf7,
+                                                              0x81, 0x77, 0x12, 0x76, 0xf7, 0x10, 0x13, 0x78,
+                                                              0xf7, 0x8e, 0xf7, 0x7, 0x15, 0x84, 0x6c, 0x88,
+                                                              0x79, 0x7b, 0x1a, 0x4e, 0xc0, 0x8b, 0x92, 0xd1,
+                                                              0xc2, 0xe2, 0xb2, 0xa3, 0x1e, 0x75, 0x9b, 0x5,
+                                                              0x84, 0x90, 0x55, 0x4b, 0x76, 0x1b, 0x86, 0x88,
+                                                              0x8f, 0x94, 0x1f, 0xf7, 0x3c, 0xf9, 0x6, 0x68,
+                                                              0x83, 0x5d, 0x80, 0xfb, 0x14, 0x81, 0x6d, 0xa,
+                                                              0xb6, 0x9e, 0x85, 0x73, 0x7c, 0x72, 0x35, 0x75,
+                                                              0x38, 0x1f, 0x99, 0x7d, 0x83, 0x9e, 0x60, 0x1b,
+                                                              0xfb, 0x8, 0xfb, 0x37, 0xfb, 0x55, 0xfb, 0x2f,
+                                                              0x1f, 0x13, 0xb8, 0x5f, 0xa2, 0x38, 0xde, 0xe1,
+                                                              0xbb, 0xd9, 0xbc, 0xa8, 0x1e, 0xfb, 0x25, 0x16,
+                                                              0xd1, 0xcf, 0xf7, 0x80, 0xe2, 0xb0, 0x98, 0x5d,
+                                                              0x85, 0x6e, 0x47, 0xfb, 0xac, 0x2c, 0x63, 0x89,
+                                                              0xbd, 0x90, 0x1e, 0xe, 0xfb, 0x6e, 0x7e, 0xcb,
+                                                              0xf8, 0x21, 0xac, 0x1, 0x90, 0xf7, 0x16, 0xf7,
+                                                              0x3f, 0xe7, 0x3, 0x50, 0x1d, 0xf7, 0x7, 0xc2,
+                                                              0x1a, 0xd3, 0x47, 0x93, 0x68, 0xfb, 0x37, 0xfb,
+                                                              0x13, 0xfb, 0x55, 0xfb, 0x1c, 0xfb, 0x4, 0xdf,
+                                                              0x69, 0x35, 0xa, 0x8e, 0xda, 0x9e, 0x8d, 0x97,
+                                                              0x3d, 0xa, 0x65, 0x82, 0x57, 0x70, 0x3a, 0xfb,
+                                                              0x17, 0x68, 0x1f, 0xe, 0xfb, 0xdd, 0xfb, 0x61,
+                                                              0xaa, 0xf8, 0xd9, 0xb5, 0xf7, 0x70, 0xa8, 0x1,
+                                                              0xb2, 0xf8, 0x2b, 0x15, 0xd4, 0x6, 0x76, 0x3b,
+                                                              0x63, 0xfb, 0x57, 0x70, 0xfb, 0x9, 0x8, 0xfb,
+                                                              0x1c, 0x6e, 0x7c, 0x56, 0x5b, 0x1b, 0x80, 0x86,
+                                                              0x90, 0x92, 0x8e, 0x8f, 0x90, 0x8f, 0x92, 0x1f,
+                                                              0x8f, 0x92, 0x8f, 0x93, 0x96, 0x1a, 0xaf, 0x66,
+                                                              0x98, 0x7e, 0x74, 0x6f, 0x79, 0x6c, 0x4f, 0xb8,
+                                                              0x73, 0xbf, 0xf7, 0x43, 0xb3, 0xf7, 0x67, 0xf8,
+                                                              0x25, 0xe1, 0x1e, 0xe5, 0x6, 0x94, 0xb5, 0x5,
+                                                              0x2f, 0x6, 0xf7, 0x3, 0xa6, 0xaa, 0xf7, 0x1,
+                                                              0xbe, 0x1b, 0x93, 0x94, 0x88, 0x80, 0x88, 0x87,
+                                                              0x87, 0x87, 0x84, 0x1f, 0x87, 0x84, 0x87, 0x83,
+                                                              0x80, 0x1a, 0x6e, 0xa0, 0x76, 0xa6, 0xa3, 0xa7,
+                                                              0x99, 0xb2, 0x9f, 0x81, 0xc7, 0x33, 0xfb, 0x12,
+                                                              0x49, 0xfb, 0x5, 0xfb, 0x1c, 0x68, 0x1e, 0x42,
+                                                              0x6, 0xe, 0xfb, 0x5f, 0xad, 0xf7, 0x4c, 0x76,
+                                                              0xf7, 0x33, 0xaa, 0x74, 0x77, 0xf7, 0xb6, 0xaa,
+                                                              0x12, 0x57, 0xe2, 0xf7, 0x7b, 0xf7, 0x1, 0x40,
+                                                              0xf7, 0x9, 0x13, 0xde, 0xd9, 0x93, 0x15, 0x89,
+                                                              0x7, 0x4c, 0x7b, 0x48, 0x7a, 0x42, 0x1a, 0x3f,
+                                                              0xf3, 0x70, 0xdb, 0xf7, 0x3f, 0xd3, 0xda, 0xd0,
+                                                              0xda, 0x44, 0xa6, 0x3d, 0xa0, 0x1e, 0x30, 0xa6,
+                                                              0x7e, 0x97, 0x9b, 0x1a, 0x96, 0x99, 0xa2, 0x98,
+                                                              0x1e, 0x13, 0xed, 0x92, 0x92, 0x8a, 0x88, 0x92,
+                                                              0x1f, 0x88, 0x93, 0x93, 0x8a, 0x96, 0x1b, 0xf7,
+                                                              0x1, 0xf7, 0x3, 0xcc, 0xf7, 0x4, 0x9f, 0x89,
+                                                              0x93, 0x87, 0x9a, 0x1f, 0xce, 0xc3, 0xfb, 0x3,
+                                                              0x6, 0x9e, 0x73, 0x67, 0x99, 0x5b, 0x1b, 0xfb,
+                                                              0x28, 0x3f, 0x25, 0x3e, 0x54, 0xa8, 0x64, 0xbe,
+                                                              0x78, 0x1f, 0x4b, 0x68, 0x6b, 0x79, 0x5e, 0x1a,
+                                                              0x60, 0xb7, 0x7b, 0x9a, 0x86, 0x1e, 0x13, 0xee,
+                                                              0xae, 0x7d, 0x15, 0xa7, 0xf7, 0x11, 0x63, 0x56,
+                                                              0x4f, 0x32, 0x81, 0x5e, 0x40, 0x75, 0xab, 0xb0,
+                                                              0xbe, 0xd4, 0xb6, 0x90, 0x1f, 0xb1, 0xf7, 0x92,
+                                                              0x15, 0x13, 0xed, 0xac, 0xa7, 0xf7, 0x2a, 0xd6,
+                                                              0xaf, 0x95, 0x68, 0x70, 0x5b, 0x68, 0xfb, 0x1d,
+                                                              0x45, 0x5f, 0x8b, 0xb9, 0x9d, 0x1e, 0xe, 0x89,
+                                                              0x1d, 0xf7, 0x81, 0x77, 0x12, 0x13, 0x70, 0x7e,
+                                                              0x83, 0xa, 0xa4, 0xe3, 0xae, 0xf7, 0xa, 0xb4,
+                                                              0xc9, 0x8, 0xb6, 0xa7, 0xbe, 0xda, 0xb5, 0x1b,
+                                                              0x9e, 0x8f, 0x7c, 0x83, 0x7d, 0x70, 0x44, 0x73,
+                                                              0x41, 0x1f, 0x78, 0x4f, 0x79, 0x4e, 0x68, 0x1a,
+                                                              0x13, 0xb0, 0x6a, 0xa1, 0x6f, 0xb6, 0xdd, 0xb8,
+                                                              0xd3, 0xcb, 0xb4, 0x1e, 0x75, 0x9a, 0x5, 0x77,
+                                                              0x88, 0x53, 0x4d, 0x8f, 0xa, 0x90, 0x96, 0x90,
+                                                              0xa0, 0xc5, 0xa1, 0xcb, 0x1f, 0xa3, 0xd0, 0xa3,
+                                                              0xd6, 0x9f, 0x1a, 0xda, 0x53, 0x9b, 0x75, 0x59,
+                                                              0x50, 0x6f, 0xfb, 0x26, 0x29, 0x1e, 0x89, 0x8c,
+                                                              0xf5, 0xf8, 0x2e, 0x40, 0x7c, 0x53, 0x83, 0x3e,
+                                                              0x84, 0x82, 0x1d, 0x66, 0x1d, 0xf8, 0xc3, 0xf7,
+                                                              0x1a, 0x4d, 0x1d, 0x53, 0x55, 0x73, 0x88, 0x1d,
+                                                              0x8f, 0x95, 0x32, 0x1d, 0xa9, 0x8b, 0x6b, 0x1f,
+                                                              0x34, 0x1d, 0xfb, 0x2, 0xf8, 0x7f, 0x15, 0x41,
+                                                              0x1d, 0xe, 0xfc, 0x14, 0xfb, 0x4e, 0x76, 0xf9,
+                                                              0x89, 0xf7, 0x1a, 0x1, 0xaa, 0xf8, 0x2b, 0x15,
+                                                              0xbb, 0x99, 0x85, 0x72, 0x1f, 0x23, 0xfc, 0x39,
+                                                              0x5, 0x36, 0x75, 0x7c, 0x5d, 0x67, 0x1b, 0x81,
+                                                              0x7f, 0x92, 0x90, 0x8f, 0x8e, 0x90, 0x8f, 0x90,
+                                                              0x1f, 0x8f, 0x91, 0x8f, 0x91, 0x97, 0x1a, 0xb3,
+                                                              0x65, 0x94, 0x80, 0x73, 0x72, 0x76, 0x6b, 0x6f,
+                                                              0xa0, 0x5a, 0xe0, 0xe4, 0xd6, 0xc9, 0xf7, 0x3d,
+                                                              0xb7, 0x1e, 0xf7, 0x6, 0xf8, 0x4a, 0x45, 0x7c,
+                                                              0x7b, 0x89, 0xfb, 0xe, 0x80, 0x19, 0xf7, 0x5,
+                                                              0xf7, 0x4c, 0x15, 0x41, 0x1d, 0xe, 0x83, 0xd2,
+                                                              0x61, 0x76, 0xf8, 0x55, 0x77, 0xf7, 0xa2, 0x77,
+                                                              0x12, 0x13, 0x70, 0x74, 0x16, 0xf7, 0xe, 0x6,
+                                                              0xbd, 0xf7, 0x50, 0xb2, 0xa6, 0x5, 0x13, 0xb0,
+                                                              0xfb, 0xe, 0xa1, 0xa3, 0x26, 0xd9, 0x1b, 0xd0,
+                                                              0xb5, 0xdb, 0xb7, 0xa3, 0x1f, 0x75, 0x96, 0x5,
+                                                              0x76, 0x7f, 0x74, 0x60, 0x71, 0x1b, 0x69, 0x7d,
+                                                              0xd3, 0xf7, 0x32, 0x6c, 0x1f, 0xca, 0xc2, 0xd7,
+                                                              0xce, 0xa2, 0x85, 0xaf, 0x90, 0x19, 0xae, 0xfb,
+                                                              0x63, 0x68, 0x7, 0xa5, 0xa4, 0x89, 0x74, 0x68,
+                                                              0xfb, 0xf, 0x39, 0x65, 0x6d, 0x1f, 0x89, 0x8d,
+                                                              0xf7, 0xe, 0xf8, 0x5b, 0x4c, 0x7f, 0x38, 0x7f,
+                                                              0x4d, 0x85, 0x82, 0x1d, 0x66, 0x1d, 0xf9, 0x58,
+                                                              0x6c, 0x1d, 0x54, 0x55, 0x73, 0x1b, 0x84, 0x87,
+                                                              0x8f, 0x95, 0x9f, 0x9b, 0xc5, 0x91, 0xa1, 0x1f,
+                                                              0xf7, 0x25, 0xf8, 0x9f, 0x7f, 0xa, 0xac, 0x8d,
+                                                              0x6c, 0x1f, 0x5c, 0xfb, 0x22, 0xfc, 0x54, 0x4f,
+                                                              0x1a, 0x7d, 0x8b, 0x56, 0xcf, 0xdb, 0xb7, 0xd0,
+                                                              0xce, 0xb7, 0x1e, 0xe, 0xf7, 0x8, 0x97, 0x76,
+                                                              0xa9, 0x76, 0xf8, 0x19, 0xd4, 0x12, 0x13, 0x60,
+                                                              0x7d, 0x83, 0xa, 0xf8, 0x0, 0xe8, 0xf7, 0x3,
+                                                              0xa4, 0x92, 0x1b, 0xb8, 0x4d, 0xfb, 0x2e, 0xfb,
+                                                              0x7f, 0x41, 0x1f, 0xf7, 0xc, 0x6, 0xbd, 0xf7,
+                                                              0x38, 0x99, 0xb8, 0xb0, 0xcb, 0x8e, 0x91, 0xde,
+                                                              0xf7, 0x5, 0xad, 0x8c, 0x8, 0x94, 0x91, 0x83,
+                                                              0x78, 0x7d, 0x6b, 0x38, 0x72, 0x3c, 0x1f, 0x7a,
+                                                              0x56, 0x7d, 0x57, 0x6e, 0x1a, 0x13, 0xa0, 0x4a,
+                                                              0xc0, 0x8b, 0x9c, 0xdb, 0xb9, 0xd9, 0xc0, 0xaa,
+                                                              0x1e, 0x75, 0x98, 0x5, 0x73, 0x88, 0x57, 0x58,
+                                                              0x76, 0x1b, 0x86, 0x87, 0x90, 0x94, 0x9d, 0x9f,
+                                                              0xc3, 0xa0, 0xc7, 0x1f, 0xa2, 0xce, 0xa4, 0xd4,
+                                                              0xae, 0x1a, 0xb7, 0x73, 0xae, 0x54, 0x39, 0x50,
+                                                              0x37, 0x3a, 0x58, 0x1e, 0x8a, 0x8d, 0x5, 0x94,
+                                                              0xa2, 0x99, 0xad, 0xb2, 0x1a, 0xce, 0x4e, 0x8b,
+                                                              0x86, 0x32, 0x4a, 0x27, 0x32, 0x51, 0x1e, 0x88,
+                                                              0x8d, 0xc7, 0xf7, 0x4e, 0x46, 0x7b, 0x72, 0x89,
+                                                              0x21, 0x82, 0x6d, 0xa, 0x9a, 0xb2, 0x8e, 0x6e,
+                                                              0x1f, 0x13, 0x60, 0x6a, 0x5e, 0xfb, 0x1f, 0x52,
+                                                              0xfb, 0x65, 0x1e, 0xe, 0x89, 0x1d, 0x12, 0x13,
+                                                              0x60, 0x78, 0xa, 0xaf, 0x6d, 0x2e, 0x30, 0x6d,
+                                                              0x1f, 0x77, 0x4f, 0x78, 0x50, 0x6c, 0x1a, 0x13,
+                                                              0xa0, 0x76, 0x1d, 0x6a, 0x81, 0x62, 0x61, 0x76,
+                                                              0x1b, 0x84, 0x86, 0x90, 0x97, 0x99, 0x9f, 0xc4,
+                                                              0xa0, 0xc9, 0x1f, 0xa1, 0xcd, 0xa3, 0xd4, 0xad,
+                                                              0x4f, 0xa, 0x13, 0x60, 0x88, 0xa, 0xe, 0x7e,
+                                                              0xa8, 0xf8, 0x35, 0xa8, 0x52, 0x1d, 0xe1, 0x15,
+                                                              0xcb, 0xbf, 0xf7, 0xaf, 0xf7, 0x0, 0xa5, 0x9f,
+                                                              0x7d, 0x59, 0x40, 0x4f, 0xfb, 0xaa, 0x2b, 0x57,
+                                                              0x8d, 0xbd, 0x9f, 0x1e, 0xfb, 0xb, 0xbd, 0x15,
+                                                              0x2b, 0xd7, 0x56, 0xdd, 0xf7, 0x34, 0xf7, 0x12,
+                                                              0xf7, 0x40, 0xf7, 0x29, 0xf7, 0x1a, 0xfb, 0x9,
+                                                              0x9f, 0x65, 0xfb, 0x32, 0xfb, 0x17, 0xfb, 0x40,
+                                                              0xfb, 0x2e, 0x1e, 0xe, 0x87, 0x1d, 0x59, 0x1d,
+                                                              0x78, 0x6b, 0x43, 0x44, 0xfb, 0x8a, 0x4f, 0x1d,
+                                                              0x57, 0x1f, 0x88, 0x8e, 0xad, 0xf2, 0x44, 0x7d,
+                                                              0x64, 0x87, 0x38, 0x81, 0x6d, 0xa, 0xaf, 0x9d,
+                                                              0x89, 0x72, 0x75, 0x4a, 0xfb, 0x85, 0x4f, 0xfb,
+                                                              0x8f, 0x1f, 0x69, 0x83, 0x6d, 0x87, 0xa, 0x6d,
+                                                              0x8d, 0xab, 0xa1, 0xa8, 0xe3, 0x93, 0xac, 0x1f,
+                                                              0xe, 0xfb, 0x61, 0xb0, 0xf7, 0x2f, 0xd3, 0xf7,
+                                                              0xfc, 0xb6, 0x7e, 0x77, 0x12, 0x8c, 0xf7, 0x11,
+                                                              0x13, 0xd8, 0xf3, 0xfb, 0x3c, 0x15, 0x66, 0xf7,
+                                                              0x9f, 0xb0, 0x7, 0x68, 0x6d, 0x8b, 0xa9, 0xa0,
+                                                              0xf7, 0x13, 0xf8, 0x37, 0xb1, 0xf7, 0x27, 0x1f,
+                                                              0xfb, 0x1, 0x6, 0x7d, 0x54, 0x6f, 0xa, 0x13,
+                                                              0xe8, 0xab, 0x86, 0x84, 0xaf, 0x4b, 0x1b, 0xfb,
+                                                              0x13, 0xfb, 0x22, 0xfb, 0x60, 0xfb, 0x11, 0x6a,
+                                                              0x8b, 0xfb, 0x5, 0xf4, 0xd4, 0xb8, 0xc5, 0xb9,
+                                                              0xa7, 0x1f, 0x8d, 0x89, 0x4f, 0xfb, 0x77, 0x83,
+                                                              0x6d, 0x6d, 0x8e, 0x57, 0x88, 0x19, 0xa1, 0xf7,
+                                                              0xc1, 0x15, 0xd6, 0xdc, 0xf7, 0x67, 0xdd, 0xa7,
+                                                              0x93, 0x70, 0x74, 0x54, 0x4a, 0xfb, 0x93, 0x2e,
+                                                              0x62, 0x8b, 0xbc, 0xa4, 0x1e, 0xe, 0xfb, 0xa5,
+                                                              0xa0, 0x76, 0xf8, 0x62, 0x77, 0x1, 0x76, 0x83,
+                                                              0xa, 0xab, 0xe8, 0x95, 0xbb, 0xa5, 0xce, 0x8,
+                                                              0xc0, 0xa1, 0xbf, 0xef, 0xa7, 0x1b, 0x91, 0x91,
+                                                              0x83, 0x83, 0x92, 0x1f, 0x81, 0x94, 0x98, 0x7f,
+                                                              0x9e, 0x1b, 0xaa, 0xa7, 0xa6, 0xb9, 0xcd, 0x55,
+                                                              0x8b, 0x87, 0x49, 0x50, 0xfb, 0xc, 0x51, 0x68,
+                                                              0x1f, 0xc3, 0xf7, 0x46, 0x48, 0x7a, 0x6c, 0x89,
+                                                              0x25, 0x82, 0x6d, 0xa, 0xaf, 0x9d, 0x89, 0x72,
+                                                              0x6b, 0x5a, 0xfb, 0x3c, 0x56, 0xfb, 0x48, 0x1f,
+                                                              0xe, 0xfb, 0xa5, 0x93, 0x76, 0xf8, 0x51, 0xac,
+                                                              0x87, 0x77, 0x12, 0x8e, 0xa6, 0xf7, 0x2d, 0xeb,
+                                                              0xa4, 0xa8, 0x13, 0xdc, 0x85, 0xa, 0x96, 0x95,
+                                                              0x87, 0x86, 0x97, 0x1f, 0x86, 0x9a, 0x9c, 0x85,
+                                                              0xa3, 0x1b, 0xcb, 0xe4, 0xb0, 0xec, 0xba, 0x6f,
+                                                              0xb6, 0x6c, 0xb3, 0x1f, 0x66, 0xbb, 0x62, 0xb5,
+                                                              0xad, 0x1a, 0x90, 0x87, 0xbc, 0xc0, 0xc6, 0xa4,
+                                                              0x46, 0x59, 0x93, 0x1e, 0xa6, 0x89, 0x5, 0x13,
+                                                              0xbc, 0x79, 0xa, 0x7b, 0x82, 0x91, 0x90, 0x80,
+                                                              0x1f, 0x91, 0x80, 0x7e, 0x90, 0x72, 0x1b, 0x4a,
+                                                              0x3c, 0x67, 0x32, 0x62, 0xaa, 0x5f, 0xab, 0x60,
+                                                              0x1f, 0xae, 0x5c, 0xb1, 0x5c, 0x60, 0x1a, 0x72,
+                                                              0x78, 0x6d, 0x65, 0x82, 0x43, 0x7c, 0xa, 0xe,
+                                                              0x66, 0x1d, 0xf8, 0x34, 0xb5, 0xf7, 0x25, 0x77,
+                                                              0x1, 0xf7, 0x5f, 0xf7, 0x21, 0x15, 0x79, 0x89,
+                                                              0x55, 0x4e, 0x72, 0x1b, 0x84, 0x87, 0x8f, 0x95,
+                                                              0xad, 0xc1, 0xf7, 0x43, 0xac, 0xf7, 0xe, 0x1f,
+                                                              0xde, 0xb5, 0x43, 0x6, 0xb2, 0xf7, 0x25, 0x5,
+                                                              0x68, 0x6, 0x47, 0x21, 0x3f, 0x6c, 0x64, 0x7c,
+                                                              0x8, 0x68, 0xbe, 0x7, 0x5f, 0xfb, 0x32, 0x5b,
+                                                              0xfb, 0x2a, 0x62, 0x1a, 0x84, 0x8b, 0x4f, 0xd3,
+                                                              0xd9, 0xbc, 0xd9, 0xc5, 0xb0, 0x1e, 0xe, 0x64,
+                                                              0xa, 0xac, 0x77, 0x12, 0x13, 0xc0, 0x2c, 0x1d,
+                                                              0x56, 0x4d, 0x73, 0x1b, 0x84, 0x87, 0x91, 0x98,
+                                                              0x31, 0xa, 0x63, 0xa0, 0xc2, 0xaf, 0x96, 0x1f,
+                                                              0x13, 0xa0, 0x44, 0x1d, 0xa1, 0x88, 0x71, 0x6e,
+                                                              0x78, 0x50, 0x79, 0x4f, 0x1f, 0x78, 0x4d, 0x78,
+                                                              0x4b, 0x68, 0x47, 0xa, 0xe, 0xfb, 0x6e, 0x93,
+                                                              0x76, 0xf8, 0x6f, 0x77, 0x1, 0xda, 0xf7, 0xf,
+                                                              0xdd, 0xf7, 0x9, 0x3, 0xe0, 0x7e, 0x15, 0xa5,
+                                                              0x6, 0xf7, 0x3e, 0xf7, 0x32, 0xf7, 0xc, 0xf7,
+                                                              0x29, 0xef, 0x1a, 0xb6, 0x68, 0xa4, 0x6f, 0x73,
+                                                              0x6d, 0x73, 0x6a, 0x76, 0x95, 0x7d, 0x95, 0x7f,
+                                                              0x1e, 0x97, 0x7d, 0x97, 0x80, 0x79, 0x1a, 0x6f,
+                                                              0x75, 0x60, 0x23, 0xfb, 0x8, 0x1e, 0xf7, 0x4e,
+                                                              0x82, 0xcf, 0x75, 0xdb, 0x1e, 0x4f, 0x7c, 0x63,
+                                                              0x86, 0x54, 0x83, 0x8, 0x70, 0x7, 0xaa, 0xa5,
+                                                              0x87, 0x6a, 0x1f, 0x86, 0x8c, 0x85, 0x84, 0x1a,
+                                                              0xe, 0x90, 0x93, 0x76, 0xf7, 0x5f, 0x77, 0xf7,
+                                                              0xb8, 0x77, 0x1, 0xe0, 0xf7, 0xb, 0xf7, 0xe2,
+                                                              0xd7, 0x3, 0xea, 0x7e, 0x15, 0xa6, 0x6, 0xda,
+                                                              0xf7, 0xd, 0xdb, 0xf7, 0x22, 0x94, 0x9e, 0x8,
+                                                              0x8d, 0x6, 0x8f, 0x5d, 0x9c, 0xfb, 0x67, 0x8d,
+                                                              0x72, 0x8, 0xa6, 0x6, 0xb5, 0xb7, 0xf7, 0x7a,
+                                                              0xf7, 0x85, 0xf7, 0x11, 0x1a, 0xb9, 0x66, 0x9e,
+                                                              0x73, 0x6a, 0x74, 0x6b, 0x70, 0x77, 0x95, 0x7d,
+                                                              0x95, 0x7d, 0x1e, 0x95, 0x7d, 0x96, 0x7d, 0x79,
+                                                              0x1a, 0x62, 0x37, 0x2a, 0x68, 0x62, 0x1e, 0x6b,
+                                                              0xf7, 0xe0, 0x5, 0x70, 0x6, 0x52, 0x30, 0x5d,
+                                                              0x31, 0x58, 0x30, 0x8, 0x89, 0x6, 0xf7, 0x12,
+                                                              0x7e, 0xd3, 0x77, 0xd5, 0x1e, 0x5e, 0x82, 0x5d,
+                                                              0x81, 0x4b, 0x82, 0x8, 0x70, 0x7, 0xab, 0xa5,
+                                                              0x8b, 0x69, 0x1f, 0x85, 0x8c, 0x84, 0x83, 0x1a,
+                                                              0xe, 0x93, 0x76, 0xe9, 0x77, 0xb4, 0x77, 0xf8,
+                                                              0x10, 0x77, 0x1, 0xf7, 0x41, 0xf7, 0x22, 0x15,
+                                                              0xfb, 0xa, 0x9f, 0xab, 0x66, 0xba, 0x1b, 0xcd,
+                                                              0xc4, 0xdf, 0xb1, 0xa5, 0x1f, 0x76, 0x99, 0x5,
+                                                              0x68, 0x76, 0x75, 0x75, 0x78, 0x1b, 0x78, 0x7c,
+                                                              0x99, 0xb0, 0x83, 0x1f, 0x6b, 0xf7, 0x30, 0x5,
+                                                              0x9f, 0x99, 0xb6, 0xd6, 0xae, 0x1b, 0x97, 0x92,
+                                                              0x86, 0x86, 0x93, 0x1f, 0x86, 0x92, 0x93, 0x86,
+                                                              0x99, 0x1b, 0xac, 0xa3, 0xa5, 0xa5, 0xa3, 0x74,
+                                                              0xb1, 0x6a, 0x57, 0x69, 0x6a, 0x22, 0x41, 0x1f,
+                                                              0x7b, 0xd9, 0x82, 0xab, 0x77, 0xa7, 0xfb, 0x3b,
+                                                              0x73, 0x18, 0x70, 0x7, 0x8c, 0x95, 0x98, 0x8c,
+                                                              0x96, 0x1b, 0x9e, 0xa4, 0x8b, 0x48, 0x98, 0x1f,
+                                                              0xa9, 0xfb, 0x2e, 0x5, 0x34, 0x55, 0x7c, 0x73,
+                                                              0x75, 0x1b, 0x7f, 0x85, 0x91, 0x91, 0x81, 0x1f,
+                                                              0x8f, 0x83, 0x81, 0x90, 0x7b, 0x1b, 0x68, 0x77,
+                                                              0x6c, 0x73, 0x7b, 0x94, 0x5f, 0xc0, 0xc2, 0xcb,
+                                                              0xd4, 0xdd, 0xb1, 0x1f, 0xe, 0x79, 0x1d, 0x1,
+                                                              0xf7, 0xdc, 0xcb, 0x3, 0x45, 0xa, 0x95, 0x94,
+                                                              0x7c, 0x1e, 0x93, 0x7e, 0x7d, 0x93, 0x79, 0x38,
+                                                              0x1d, 0x6a, 0x99, 0x80, 0x99, 0x81, 0x1e, 0x98,
+                                                              0x82, 0x99, 0x83, 0x75, 0x7a, 0xa, 0xe, 0xfb,
+                                                              0xa5, 0x52, 0x76, 0xf8, 0x46, 0xe8, 0x1, 0x79,
+                                                              0x74, 0x15, 0xa7, 0xb1, 0x8b, 0x8b, 0x9a, 0x1b,
+                                                              0xa4, 0xa4, 0x79, 0x78, 0xa8, 0x1f, 0x75, 0xac,
+                                                              0xb2, 0x73, 0xc0, 0x76, 0xa, 0x7f, 0x8e, 0x83,
+                                                              0x8f, 0x85, 0x1f, 0x91, 0x82, 0x92, 0x86, 0x82,
+                                                              0x1a, 0x84, 0x83, 0x83, 0x7e, 0x6f, 0x81, 0xa6,
+                                                              0xac, 0x7a, 0x1e, 0x7a, 0xab, 0x72, 0xb1, 0x51,
+                                                              0xa2, 0x80, 0xa, 0xfb, 0x2b, 0x70, 0x1d, 0xfb,
+                                                              0xf9, 0x5, 0xe, 0x8a, 0xa, 0x12, 0xa7, 0xf3,
+                                                              0x60, 0xf1, 0x13, 0xe0, 0xf7, 0x69, 0xfb, 0x43,
+                                                              0x15, 0x47, 0x95, 0x7e, 0xad, 0xaf, 0x1a, 0x13,
+                                                              0xd0, 0xc5, 0xc6, 0xf7, 0x2f, 0xc0, 0x1a, 0xb7,
+                                                              0x77, 0x9b, 0x47, 0x9c, 0x1e, 0x8d, 0x7, 0xf1,
+                                                              0x9d, 0xa6, 0xa5, 0x9d, 0xd2, 0xb8, 0xf7, 0x47,
+                                                              0x18, 0x9d, 0xd1, 0xae, 0xb8, 0xe0, 0x9a, 0x8e,
+                                                              0x97, 0x18, 0xfb, 0x19, 0x37, 0x77, 0xfb, 0xe,
+                                                              0x6c, 0x1f, 0x5d, 0xfb, 0x47, 0x7a, 0x49, 0x6f,
+                                                              0x6c, 0x2f, 0x78, 0x19, 0xc4, 0x7d, 0xa6, 0x79,
+                                                              0x60, 0x1a, 0x13, 0xe0, 0x64, 0x4e, 0xfb, 0x41,
+                                                              0x52, 0x1a, 0x4b, 0xb2, 0x6f, 0xf7, 0x23, 0x1e,
+                                                              0xe, 0xfc, 0x4e, 0xfb, 0x3b, 0x76, 0xf7, 0x53,
+                                                              0x8d, 0x1d, 0xb0, 0xe3, 0x3, 0xf7, 0x5d, 0xf9,
+                                                              0x41, 0x15, 0xcf, 0x6, 0xfb, 0x79, 0xfd, 0xfd,
+                                                              0x5, 0x47, 0x6, 0xe, 0x8a, 0xa, 0x1, 0xf7,
+                                                              0x8, 0xf1, 0x6d, 0xf3, 0x3, 0xfb, 0x12, 0xfb,
+                                                              0x43, 0x15, 0xe0, 0x9b, 0xad, 0xb1, 0x9e, 0xd1,
+                                                              0xb8, 0xf7, 0x3f, 0x18, 0x9e, 0xd3, 0xa6, 0xb1,
+                                                              0xf0, 0x9e, 0x8, 0x8d, 0x7, 0x47, 0x9b, 0x77,
+                                                              0x9a, 0xb6, 0xc0, 0xc6, 0xf7, 0x2f, 0xc6, 0x1a,
+                                                              0xb0, 0x7e, 0xad, 0x47, 0x96, 0x1e, 0x8e, 0x97,
+                                                              0x5, 0xf7, 0x23, 0xb2, 0x6d, 0x4b, 0x1f, 0x52,
+                                                              0x4e, 0xfb, 0x3e, 0x63, 0x1a, 0x60, 0xa6, 0x7a,
+                                                              0xc4, 0x7c, 0x1e, 0x2e, 0x78, 0x71, 0x5e, 0x79,
+                                                              0x49, 0x5d, 0xfb, 0x3f, 0x18, 0xfb, 0xd, 0x6b,
+                                                              0x38, 0x7c, 0xfb, 0x19, 0x1b, 0xe, 0x2f, 0xf7,
+                                                              0x45, 0xdf, 0x48, 0x76, 0xa2, 0x76, 0xd1, 0xdf,
+                                                              0x8f, 0x77, 0x12, 0x13, 0x50, 0xef, 0xf7, 0x41,
+                                                              0x15, 0xae, 0x9b, 0xa3, 0xb0, 0xb7, 0x1b, 0xb4,
+                                                              0xac, 0x7c, 0x7b, 0xaa, 0x1f, 0x13, 0x88, 0x79,
+                                                              0xae, 0xad, 0x78, 0xb6, 0x1b, 0xc9, 0xac, 0xb7,
+                                                              0xb5, 0xa9, 0x1f, 0x67, 0xd1, 0x5, 0x68, 0x74,
+                                                              0x72, 0x66, 0x63, 0x1b, 0x6e, 0x68, 0x9b, 0x9b,
+                                                              0x67, 0x1f, 0x13, 0x30, 0x9d, 0x64, 0x63, 0x9d,
+                                                              0x69, 0x1b, 0x48, 0x67, 0x5f, 0x61, 0x75, 0x1f,
+                                                              0xe, 0xfb, 0xa5, 0xfb, 0x4c, 0x76, 0xf8, 0xbd,
+                                                              0xf7, 0x24, 0x1, 0x9e, 0xf7, 0x29, 0x95, 0xf7,
+                                                              0x24, 0x3, 0xf7, 0x55, 0xf7, 0xa7, 0x15, 0x4c,
+                                                              0xfb, 0x39, 0x3a, 0xfb, 0x2f, 0x7b, 0x6d, 0x8,
+                                                              0x82, 0x7a, 0x86, 0x7a, 0x7c, 0x1a, 0x5d, 0xac,
+                                                              0x68, 0xae, 0xc6, 0x9e, 0xc1, 0xb5, 0x8e, 0x1e,
+                                                              0x94, 0xf7, 0x7, 0xa4, 0xf7, 0x32, 0x9f, 0xf2,
+                                                              0x8, 0x5f, 0xf7, 0x2d, 0x15, 0x63, 0xab, 0x6b,
+                                                              0xb3, 0xb3, 0xab, 0xab, 0xb3, 0xb3, 0x6b, 0xab,
+                                                              0x63, 0x63, 0x6b, 0x6b, 0x63, 0x1e, 0xe, 0xfb,
+                                                              0xe, 0x76, 0xf7, 0x2b, 0x76, 0xf8, 0x4f, 0xac,
+                                                              0xf7, 0x5, 0x77, 0x1, 0x97, 0xf7, 0x13, 0x3,
+                                                              0xf7, 0x6a, 0xc4, 0x15, 0x63, 0x9c, 0x86, 0xbe,
+                                                              0xa5, 0x1a, 0xce, 0xca, 0xf7, 0x68, 0xde, 0xa0,
+                                                              0x8e, 0x82, 0x84, 0x1e, 0xfb, 0x29, 0xfc, 0x3f,
+                                                              0x15, 0x5d, 0xfb, 0x16, 0x5, 0xad, 0x6, 0xba,
+                                                              0xf7, 0x19, 0xdd, 0x98, 0xb6, 0xc8, 0xb5, 0xc6,
+                                                              0x19, 0x70, 0x9d, 0x6b, 0x5b, 0x64, 0x63, 0x5c,
+                                                              0x8a, 0x19, 0xe7, 0xf7, 0x9a, 0x5, 0x85, 0x92,
+                                                              0x97, 0x86, 0x9d, 0x1b, 0xaa, 0xab, 0xa5, 0xb5,
+                                                              0xab, 0x79, 0xa9, 0x68, 0x9c, 0x1f, 0xb8, 0xf7,
+                                                              0x12, 0x5, 0x68, 0x6, 0x62, 0xfb, 0x8, 0x5,
+                                                              0x8d, 0x81, 0x81, 0x8c, 0x7f, 0x1b, 0xfb, 0x1b,
+                                                              0xfb, 0x26, 0xfb, 0x2e, 0xfb, 0x32, 0xfb, 0xe,
+                                                              0xe9, 0x61, 0xc1, 0x1f, 0xe, 0x7f, 0xaa, 0x6c,
+                                                              0xf3, 0x23, 0xf7, 0x42, 0xfb, 0x2c, 0x76, 0xf7,
+                                                              0x17, 0x77, 0xc2, 0x77, 0xf7, 0x43, 0xc7, 0xf7,
+                                                              0xab, 0xad, 0x12, 0x6b, 0xa9, 0x13, 0x4f, 0x80,
+                                                              0xf7, 0x30, 0xbc, 0x15, 0x6e, 0xab, 0xb8, 0x6b,
+                                                              0xb8, 0x1b, 0xe7, 0xb9, 0xd0, 0xed, 0x9d, 0x1f,
+                                                              0x72, 0x6, 0x67, 0x7b, 0x7f, 0x70, 0x46, 0x1b,
+                                                              0x65, 0x4a, 0xa5, 0x91, 0x7c, 0x1f, 0xad, 0xc0,
+                                                              0xaa, 0xde, 0x95, 0xbd, 0x8, 0xf7, 0x7, 0x6,
+                                                              0x95, 0xc7, 0x5, 0xfb, 0x6, 0x6, 0xb2, 0xf7,
+                                                              0x5e, 0x5, 0xbc, 0x94, 0xa0, 0xa7, 0xaa, 0x1b,
+                                                              0xa7, 0x87, 0x73, 0x73, 0x86, 0x1f, 0x89, 0x82,
+                                                              0x8a, 0x82, 0x83, 0x1a, 0x67, 0xab, 0x7c, 0xa0,
+                                                              0xa7, 0xac, 0xa2, 0xb7, 0xcc, 0x4f, 0xa6, 0x58,
+                                                              0x67, 0xfb, 0x37, 0x7d, 0xfb, 0xbf, 0x59, 0x1e,
+                                                              0x22, 0x6, 0x81, 0x4f, 0x5, 0xf7, 0x1, 0x6,
+                                                              0x83, 0x56, 0x86, 0x4d, 0x85, 0x5c, 0x8, 0x13,
+                                                              0x23, 0x80, 0x93, 0x78, 0x7d, 0x91, 0x6b, 0x1b,
+                                                              0x5d, 0x5d, 0x6d, 0x50, 0x1f, 0x13, 0x1f, 0x80,
+                                                              0x5e, 0xaf, 0x64, 0xbe, 0xca, 0xa2, 0xaf, 0xa3,
+                                                              0x9a, 0x1e, 0x60, 0xb4, 0x15, 0x13, 0x8f, 0x80,
+                                                              0x6a, 0x85, 0x7b, 0x65, 0x66, 0x1b, 0x75, 0x69,
+                                                              0x99, 0xad, 0xb7, 0xaa, 0x94, 0x9f, 0xa9, 0xa0,
+                                                              0x79, 0x7f, 0x98, 0x1f, 0xe, 0xd2, 0x76, 0xdc,
+                                                              0xd5, 0xf7, 0x65, 0xd5, 0xd4, 0x77, 0x1, 0xd3,
+                                                              0xdb, 0xf7, 0x5d, 0xda, 0x3, 0xf7, 0x1c, 0xf7,
+                                                              0xcc, 0x15, 0xca, 0xbe, 0xbf, 0xcb, 0xcd, 0xba,
+                                                              0x55, 0x4c, 0x4a, 0x5b, 0x54, 0x48, 0x4a, 0x5b,
+                                                              0xc4, 0xcc, 0x1e, 0x39, 0xfb, 0x8e, 0x15, 0xe1,
+                                                              0xe3, 0x5, 0x78, 0xa7, 0xb3, 0x7c, 0xb6, 0x1b,
+                                                              0xb6, 0xb1, 0x9a, 0x9e, 0xa7, 0x1f, 0xe1, 0x33,
+                                                              0xbf, 0xbf, 0x34, 0xe3, 0x5, 0xa0, 0xa6, 0x96,
+                                                              0xb2, 0xb6, 0x1a, 0xb6, 0x7d, 0xb1, 0x78, 0xa7,
+                                                              0x1e, 0xe3, 0xe3, 0x57, 0xbd, 0x34, 0x35, 0x5,
+                                                              0x9e, 0x6e, 0x67, 0x95, 0x5f, 0x1b, 0x62, 0x62,
+                                                              0x81, 0x78, 0x6f, 0x1f, 0x35, 0xe1, 0x57, 0x59,
+                                                              0xe3, 0x33, 0x5, 0x78, 0x70, 0x7c, 0x64, 0x60,
+                                                              0x1a, 0x60, 0x98, 0x65, 0xa0, 0x6f, 0x1e, 0x33,
+                                                              0x33, 0x5, 0xe, 0x8b, 0xa4, 0xf7, 0x1f, 0xbd,
+                                                              0xd9, 0xbd, 0xf7, 0xc2, 0xa4, 0x1, 0xb9, 0x16,
+                                                              0xf7, 0xd6, 0xa4, 0x6, 0x59, 0x8d, 0x6c, 0x8c,
+                                                              0xb4, 0x1a, 0xa8, 0x98, 0xb6, 0x91, 0xa2, 0x1e,
+                                                              0xf7, 0x2c, 0x6, 0x99, 0xbd, 0x5, 0xfb, 0x2c,
+                                                              0x6, 0xa0, 0xd9, 0x5, 0xf7, 0x2a, 0x6, 0x98,
+                                                              0xbd, 0x5, 0xfb, 0x1b, 0x6, 0xf7, 0x30, 0xf7,
+                                                              0x7d, 0x90, 0x1d, 0xb8, 0x93, 0x19, 0xa4, 0xfb,
+                                                              0x5c, 0x72, 0x7, 0xc7, 0xa1, 0x7c, 0x79, 0x82,
+                                                              0x86, 0x80, 0x84, 0x80, 0x1f, 0xfb, 0x2b, 0xfb,
+                                                              0x80, 0x5, 0x74, 0xc1, 0x56, 0xf7, 0x54, 0x9d,
+                                                              0x1a, 0xa2, 0x97, 0x98, 0xca, 0x1e, 0xa4, 0xfb,
+                                                              0xac, 0x72, 0x7, 0xc0, 0x84, 0x8a, 0x92, 0xa1,
+                                                              0x64, 0xd8, 0xfb, 0x9b, 0x18, 0xfb, 0x11, 0x6,
+                                                              0x7d, 0x59, 0x5, 0xf7, 0x22, 0x6, 0x75, 0x3d,
+                                                              0x5, 0xfb, 0x21, 0x6, 0x7d, 0x59, 0x5, 0xf7,
+                                                              0x21, 0x6, 0x70, 0x2c, 0x7f, 0x62, 0x71, 0x8d,
+                                                              0x4c, 0x86, 0x19, 0xe, 0xfc, 0x4e, 0x3e, 0x76,
+                                                              0xf0, 0x76, 0xf7, 0x96, 0x77, 0xad, 0x77, 0xf8,
+                                                              0x57, 0x77, 0x12, 0xcd, 0xe3, 0x13, 0xdc, 0xf5,
+                                                              0xf7, 0xf5, 0x15, 0xcf, 0x6, 0xef, 0xf7, 0xe0,
+                                                              0x5, 0x43, 0x6, 0xfb, 0x78, 0xfd, 0xa3, 0x15,
+                                                              0xd4, 0x6, 0x13, 0xec, 0xeb, 0xf7, 0xe6, 0x5,
+                                                              0x47, 0x6, 0xe, 0xfb, 0xe, 0x76, 0xa2, 0x77,
+                                                              0xf7, 0x99, 0xa6, 0xf7, 0x90, 0xa4, 0xf7, 0x78,
+                                                              0xa1, 0x12, 0xaf, 0xf7, 0x6, 0x9d, 0xd1, 0xa9,
+                                                              0xd8, 0x9e, 0xd2, 0x13, 0x7f, 0x80, 0xf7, 0xb2,
+                                                              0xf7, 0xd, 0x15, 0x8d, 0x8f, 0x5, 0x88, 0x93,
+                                                              0x95, 0x8a, 0x97, 0x1b, 0xc6, 0xc5, 0xbc, 0xd6,
+                                                              0xca, 0x62, 0xc1, 0x78, 0xa3, 0x1f, 0x26, 0xf7,
+                                                              0xc, 0x67, 0xb5, 0xb4, 0x1a, 0xb0, 0xa3, 0xb0,
+                                                              0xc3, 0xaf, 0xa7, 0x7c, 0x7f, 0x82, 0x83, 0x87,
+                                                              0x83, 0x84, 0x1e, 0x80, 0x84, 0x82, 0x81, 0x77,
+                                                              0x1a, 0x70, 0xa3, 0x71, 0xaa, 0xa0, 0xb0, 0x99,
+                                                              0xbb, 0xb7, 0x62, 0xc0, 0x27, 0x37, 0x49, 0x55,
+                                                              0x3a, 0x4b, 0xb7, 0x56, 0x96, 0x80, 0x1e, 0x89,
+                                                              0x88, 0x5, 0x8f, 0x7e, 0x6d, 0x8d, 0x86, 0x1b,
+                                                              0xfb, 0x0, 0x6e, 0xfb, 0x2b, 0x28, 0xde, 0x1f,
+                                                              0xf7, 0x16, 0xfb, 0x34, 0x9e, 0x77, 0x63, 0x1a,
+                                                              0x4e, 0x4f, 0x7d, 0x70, 0x75, 0x5f, 0x95, 0x9d,
+                                                              0x96, 0x93, 0x8f, 0x94, 0x93, 0x1e, 0x94, 0x93,
+                                                              0x94, 0x94, 0xa2, 0x1a, 0xb4, 0x66, 0x95, 0x77,
+                                                              0x6f, 0x6e, 0x76, 0x64, 0x1e, 0x13, 0xbf, 0x80,
+                                                              0x52, 0xc4, 0x5b, 0xe3, 0xe2, 0xd8, 0xc4, 0xd8,
+                                                              0xc6, 0x64, 0xb9, 0x77, 0xa4, 0x1e, 0x3b, 0xec,
+                                                              0x15, 0x88, 0x8e, 0x4b, 0xcf, 0xbe, 0x1a, 0xb2,
+                                                              0xa5, 0xa0, 0xab, 0xc2, 0xf7, 0x4, 0xfb, 0x17,
+                                                              0x50, 0x60, 0x69, 0x78, 0x72, 0x6e, 0x7a, 0x97,
+                                                              0xc5, 0x56, 0x1e, 0xe, 0xfb, 0xdd, 0xf8, 0xa1,
+                                                              0xf7, 0x16, 0x1, 0xb8, 0xf7, 0x16, 0xdf, 0xf7,
+                                                              0x16, 0x3, 0xb8, 0xf8, 0xe2, 0x15, 0x4b, 0xa,
+                                                              0xf7, 0x68, 0x16, 0x4b, 0xa, 0xe, 0xe0, 0x79,
+                                                              0xb9, 0xf7, 0x4, 0xa2, 0xe2, 0x77, 0xf7, 0xb4,
+                                                              0x9f, 0xf0, 0xb9, 0x1, 0x9f, 0xc8, 0x58, 0xc8,
+                                                              0xe4, 0xe0, 0xf8, 0x1c, 0xc8, 0x3, 0xa9, 0xf7,
+                                                              0xe1, 0x15, 0xf7, 0x57, 0xf7, 0x2b, 0xf7, 0x31,
+                                                              0xf7, 0x55, 0xf7, 0x55, 0xf7, 0x2b, 0xfb, 0x31,
+                                                              0xfb, 0x58, 0xfb, 0x58, 0xfb, 0x2b, 0xfb, 0x2e,
+                                                              0xfb, 0x55, 0xfb, 0x55, 0xfb, 0x2b, 0xf7, 0x2f,
+                                                              0xf7, 0x58, 0x1e, 0xc8, 0x16, 0xfb, 0x38, 0xf7,
+                                                              0x12, 0xfb, 0x21, 0xf7, 0x31, 0xf7, 0x31, 0xf7,
+                                                              0x12, 0xf7, 0x20, 0xf7, 0x38, 0xf7, 0x38, 0xfb,
+                                                              0x12, 0xf7, 0x23, 0xfb, 0x31, 0xfb, 0x32, 0xfb,
+                                                              0x11, 0xfb, 0x23, 0xfb, 0x37, 0x1e, 0xf8, 0x59,
+                                                              0x38, 0x15, 0x7a, 0x43, 0x5, 0x70, 0x6e, 0x66,
+                                                              0x80, 0x48, 0x1b, 0xfb, 0xc, 0x2d, 0xc8, 0xf7,
+                                                              0x21, 0xe0, 0xc8, 0xf7, 0x3, 0xf7, 0x32, 0xc0,
+                                                              0xa5, 0x82, 0x82, 0xa6, 0x1f, 0x9a, 0x86, 0x92,
+                                                              0x84, 0x82, 0x1a, 0x44, 0x7a, 0x7, 0xb6, 0x83,
+                                                              0x70, 0xba, 0x3f, 0x1b, 0x2f, 0x61, 0x3e, 0x28,
+                                                              0x20, 0xa8, 0x43, 0xef, 0xcc, 0xba, 0xb2, 0xbb,
+                                                              0x9f, 0x1f, 0xe, 0xfc, 0x20, 0xf8, 0x24, 0xb8,
+                                                              0x72, 0x76, 0xf7, 0x97, 0xa6, 0x12, 0x9b, 0xd9,
+                                                              0x13, 0x70, 0xf7, 0x54, 0xf8, 0x6f, 0x15, 0x87,
+                                                              0x7b, 0x88, 0x81, 0x81, 0x1a, 0x6c, 0xaa, 0x82,
+                                                              0x97, 0xb3, 0xb0, 0xb8, 0xaa, 0xa0, 0x1e, 0x7e,
+                                                              0x94, 0x5, 0x7f, 0x85, 0x6f, 0x6e, 0x7f, 0x1b,
+                                                              0x88, 0x89, 0x8d, 0x91, 0xa1, 0x98, 0xb2, 0x94,
+                                                              0xa7, 0x1f, 0xb9, 0xf7, 0x20, 0x3f, 0x88, 0x81,
+                                                              0x6a, 0x6f, 0xa, 0x9a, 0x88, 0x84, 0xa5, 0x64,
+                                                              0x1b, 0x39, 0x2c, 0xfb, 0xb, 0x33, 0x1f, 0x13,
+                                                              0xb0, 0x77, 0x92, 0x51, 0xcc, 0xc1, 0xac, 0xbd,
+                                                              0xa6, 0x9a, 0x1e, 0x2b, 0x16, 0xb8, 0xc5, 0xf7,
+                                                              0x1c, 0xba, 0x94, 0x95, 0x7f, 0x7a, 0x63, 0x5e,
+                                                              0xfb, 0x24, 0x52, 0x88, 0x78, 0x8f, 0xa7, 0x1e,
+                                                              0xe, 0x72, 0x1d, 0x97, 0xf7, 0x6d, 0x71, 0x1d,
+                                                              0x81, 0x94, 0x96, 0x82, 0x93, 0x1b, 0x91, 0x8f,
+                                                              0x8e, 0x98, 0x1f, 0x41, 0x8d, 0xa, 0xe3, 0x5f,
+                                                              0xa, 0xf7, 0x4d, 0x82, 0x71, 0x1d, 0x80, 0x94,
+                                                              0x97, 0x8a, 0x1d, 0x41, 0x8d, 0xa, 0xe3, 0xdc,
+                                                              0xaf, 0x1a, 0x94, 0x88, 0x8e, 0x86, 0x79, 0x60,
+                                                              0x62, 0x7b, 0x6c, 0xa, 0xe, 0x53, 0xf7, 0x15,
+                                                              0x76, 0xf7, 0x5d, 0xce, 0x48, 0xe5, 0x1, 0xf8,
+                                                              0x65, 0xe5, 0x43, 0xd3, 0x3, 0xbe, 0xf7, 0xc9,
+                                                              0x15, 0xf8, 0x44, 0xfb, 0x5d, 0xd3, 0xf7, 0xa0,
+                                                              0xfc, 0x8c, 0x6, 0xe, 0xe0, 0x79, 0xb9, 0xf7,
+                                                              0xf, 0xf7, 0x4e, 0xf7, 0x3d, 0xa0, 0xf7, 0x4,
+                                                              0xb9, 0x1, 0xa9, 0xc8, 0xf7, 0x3a, 0xd2, 0xf7,
+                                                              0x1, 0xd4, 0xf7, 0x27, 0xc8, 0x3, 0xa9, 0xf7,
+                                                              0xe3, 0x15, 0xfb, 0x58, 0xf7, 0x2b, 0xfb, 0x31,
+                                                              0xf7, 0x55, 0xf7, 0x55, 0xf7, 0x2b, 0xf7, 0x2d,
+                                                              0xf7, 0x58, 0xf7, 0x58, 0xfb, 0x2b, 0xf7, 0x32,
+                                                              0xfb, 0x55, 0xfb, 0x55, 0xfb, 0x2b, 0xfb, 0x2f,
+                                                              0xfb, 0x57, 0x1e, 0xc8, 0x16, 0xf7, 0x38, 0xf7,
+                                                              0x11, 0xf7, 0x20, 0xf7, 0x32, 0xf7, 0x32, 0xf7,
+                                                              0x11, 0xfb, 0x24, 0xfb, 0x38, 0xfb, 0x38, 0xfb,
+                                                              0x11, 0xfb, 0x1f, 0xfb, 0x32, 0xfb, 0x31, 0xfb,
+                                                              0x12, 0xf7, 0x23, 0xf7, 0x38, 0x1e, 0xf7, 0xb,
+                                                              0xfb, 0x4c, 0x15, 0xf7, 0x3a, 0x9b, 0x6, 0x5a,
+                                                              0x90, 0x8c, 0x8c, 0xb5, 0x1a, 0xf1, 0xb7, 0x7,
+                                                              0x30, 0xc8, 0xc8, 0x40, 0x89, 0x1b, 0xd1, 0x6,
+                                                              0x77, 0xa5, 0x6e, 0xad, 0x37, 0xf7, 0x9, 0x8,
+                                                              0xbb, 0x9a, 0xac, 0xb3, 0xbd, 0x1a, 0xcc, 0x54,
+                                                              0xa8, 0x4d, 0x1e, 0xfb, 0x4b, 0x7b, 0x6, 0xbc,
+                                                              0x86, 0x89, 0x8a, 0x62, 0x1a, 0xfb, 0x8d, 0x7,
+                                                              0x61, 0x8d, 0x8a, 0x5a, 0x86, 0x1e, 0xf7, 0xa,
+                                                              0xf7, 0x3e, 0x15, 0xf7, 0x3d, 0xb3, 0x7, 0xb2,
+                                                              0xa9, 0x78, 0x51, 0x56, 0x77, 0x64, 0x5b, 0x1f,
+                                                              0xe, 0xfb, 0xdd, 0xf8, 0xbd, 0xd1, 0x1, 0xbe,
+                                                              0xf8, 0xbd, 0x15, 0xf7, 0xd8, 0x6, 0x9d, 0xd1,
+                                                              0x5, 0xfb, 0xd7, 0x6, 0xe, 0xfb, 0x9a, 0xf8,
+                                                              0x36, 0x76, 0xf7, 0xb2, 0x77, 0x1, 0xde, 0xf8,
+                                                              0xb2, 0x15, 0x3c, 0xcb, 0x49, 0xda, 0xda, 0xcb,
+                                                              0xc9, 0xda, 0xda, 0x4b, 0xcd, 0x3c, 0x3c, 0x4b,
+                                                              0x4d, 0x3c, 0x1e, 0xb1, 0x8a, 0x15, 0x51, 0xb9,
+                                                              0x5b, 0xc5, 0xc5, 0xba, 0xb7, 0xc5, 0xc5, 0x5c,
+                                                              0xbc, 0x51, 0x51, 0x5d, 0x5e, 0x51, 0x1e, 0xe,
+                                                              0x2f, 0x8b, 0xe4, 0xb2, 0x77, 0xf7, 0x36, 0xe4,
+                                                              0x3c, 0xc9, 0xf7, 0x38, 0x77, 0x12, 0xf7, 0x85,
+                                                              0xe3, 0x3e, 0xcc, 0x13, 0xea, 0xf7, 0x90, 0xf7,
+                                                              0x14, 0x15, 0xcc, 0x6, 0x13, 0xda, 0xf7, 0x2c,
+                                                              0xf7, 0x70, 0xc9, 0xfb, 0x70, 0xf7, 0x38, 0x4a,
+                                                              0xfb, 0x38, 0xfb, 0x6f, 0x4d, 0xf7, 0x6f, 0x7,
+                                                              0xfb, 0x6f, 0xfb, 0xac, 0x15, 0xf8, 0x8c, 0x6,
+                                                              0x13, 0xec, 0xcf, 0xfc, 0x8c, 0x7, 0xe, 0xfb,
+                                                              0xfe, 0xf7, 0xa6, 0xd0, 0xf7, 0xab, 0xc8, 0x1,
+                                                              0x8d, 0xf7, 0xa6, 0x5e, 0x1d, 0xef, 0x5, 0xb6,
+                                                              0xaa, 0xbc, 0xbd, 0x52, 0xa, 0x6d, 0x66, 0x61,
+                                                              0x1f, 0x6b, 0x68, 0x8b, 0x84, 0xfb, 0x8, 0xfb,
+                                                              0x2, 0x8, 0xe, 0xfb, 0xfe, 0xf7, 0xb2, 0x76,
+                                                              0xf8, 0x3, 0xbe, 0x12, 0xf7, 0x66, 0xdf, 0x4e,
+                                                              0xe3, 0x13, 0xe0, 0xf7, 0x2, 0xf8, 0x75, 0x15,
+                                                              0xcc, 0xae, 0x69, 0x4f, 0x69, 0x66, 0x4f, 0x69,
+                                                              0x81, 0x82, 0x8f, 0x97, 0x83, 0x67, 0x1d, 0xcf,
+                                                              0xe1, 0xbc, 0x74, 0xa3, 0x6e, 0x9e, 0x1f, 0x13,
+                                                              0xd0, 0x63, 0x1d, 0x69, 0xa, 0xe, 0x7f, 0x1d,
+                                                              0xf7, 0x49, 0x77, 0x1, 0xf7, 0x1f, 0xf8, 0x98,
+                                                              0x15, 0xbd, 0x6, 0xf7, 0x2b, 0x21, 0x1d, 0xe,
+                                                              0x35, 0xfb, 0x4e, 0x76, 0xf7, 0x63, 0xd1, 0x4d,
+                                                              0x76, 0xf7, 0x11, 0x77, 0xf7, 0xf9, 0x77, 0x12,
+                                                              0x4f, 0xf7, 0xb, 0x13, 0xdc, 0xf7, 0xaf, 0xf7,
+                                                              0x4, 0x15, 0x83, 0x6c, 0x89, 0x7c, 0x7a, 0x1a,
+                                                              0x6d, 0xa1, 0x6b, 0xb3, 0xda, 0xba, 0xd6, 0xc3,
+                                                              0xb5, 0x1e, 0x76, 0x9b, 0x5, 0x13, 0xbc, 0x71,
+                                                              0x80, 0x6b, 0x67, 0x79, 0x1b, 0x80, 0x85, 0x94,
+                                                              0xab, 0x93, 0x1f, 0xf3, 0xf7, 0xe4, 0x5, 0xfb,
+                                                              0x1b, 0x6, 0x58, 0xfb, 0x38, 0x5, 0xfb, 0xe,
+                                                              0x62, 0x42, 0x2e, 0x53, 0x1b, 0x6e, 0x95, 0xb7,
+                                                              0xa2, 0x91, 0x1f, 0xe8, 0xf7, 0xcc, 0x5, 0x13,
+                                                              0xdc, 0xfb, 0x1b, 0x6, 0xfb, 0x3, 0xfc, 0xb,
+                                                              0x5, 0x5f, 0xfb, 0x12, 0x81, 0x54, 0x64, 0x1a,
+                                                              0x60, 0xa0, 0x79, 0xa9, 0xb3, 0xa7, 0xae, 0xbd,
+                                                              0xb6, 0x87, 0xc0, 0x9c, 0xbd, 0x1e, 0x7a, 0xa2,
+                                                              0x94, 0x84, 0xae, 0x1b, 0xc0, 0xcd, 0xd2, 0xb4,
+                                                              0xa2, 0x1f, 0xe, 0xfb, 0x57, 0x76, 0xf9, 0xdc,
+                                                              0xb1, 0x12, 0xb2, 0xf7, 0x64, 0x42, 0xe4, 0xf7,
+                                                              0x2c, 0xe4, 0x13, 0xd8, 0xf7, 0x11, 0xfb, 0x6c,
+                                                              0x15, 0xbc, 0x6, 0xf7, 0x85, 0xf9, 0xdc, 0x5,
+                                                              0xe4, 0x6, 0xfb, 0x85, 0xfd, 0xdc, 0x5, 0xbc,
+                                                              0x6, 0xf7, 0x69, 0xf9, 0x7e, 0x5, 0xed, 0xa7,
+                                                              0x92, 0x9b, 0xe5, 0x1b, 0x90, 0x9d, 0x5, 0xfb,
+                                                              0xbd, 0x6, 0x13, 0xe8, 0xfb, 0x64, 0xfb, 0x3,
+                                                              0xfb, 0x30, 0xfb, 0x1c, 0xfb, 0x13, 0xf0, 0x6c,
+                                                              0xf6, 0x89, 0x1f, 0xe, 0xfc, 0x30, 0xf7, 0x95,
+                                                              0xf7, 0x28, 0x1, 0xbe, 0xf7, 0x28, 0x3, 0xbe,
+                                                              0xf7, 0xdf, 0x3c, 0xa, 0xfb, 0xdd, 0xfb, 0x6e,
+                                                              0xb4, 0x80, 0xd8, 0x49, 0xd8, 0xf4, 0x77, 0x12,
+                                                              0x13, 0x50, 0xb4, 0x90, 0x15, 0x49, 0x2a, 0x98,
+                                                              0x7f, 0x5, 0x13, 0xb0, 0x7d, 0xa, 0x72, 0x7c,
+                                                              0x6c, 0x6e, 0x7b, 0x86, 0xa, 0x9f, 0x79, 0xbf,
+                                                              0x1b, 0xc0, 0xe9, 0xa3, 0xca, 0xbf, 0x5e, 0x9e,
+                                                              0x67, 0x7d, 0x7e, 0x8b, 0x89, 0x83, 0x1f, 0xb8,
+                                                              0xce, 0x5, 0xe, 0xfb, 0xfe, 0xf7, 0xbb, 0x76,
+                                                              0xf7, 0x17, 0x76, 0xf7, 0xbf, 0x77, 0x1, 0xa9,
+                                                              0xf8, 0x14, 0x8c, 0xa, 0x62, 0x71, 0x91, 0xa0,
+                                                              0x93, 0x1f, 0x9d, 0xb9, 0xc7, 0xf7, 0x21, 0xa7,
+                                                              0xcd, 0x5e, 0x82, 0x66, 0x83, 0x2c, 0x7d, 0x89,
+                                                              0x76, 0x18, 0xa8, 0xb3, 0x93, 0x71, 0x7c, 0x45,
+                                                              0xfb, 0x1f, 0x7b, 0x6e, 0x1f, 0x70, 0x7d, 0x66,
+                                                              0x8b, 0x73, 0x1b, 0xe, 0xfb, 0xfe, 0xf8, 0x24,
+                                                              0x9f, 0xf7, 0x89, 0x9f, 0x1, 0xf7, 0x9e, 0xdc,
+                                                              0x3, 0xf7, 0x1d, 0xf8, 0x5f, 0x15, 0xb2, 0xae,
+                                                              0xf7, 0x3b, 0xd2, 0x95, 0x98, 0x85, 0x6d, 0x5e,
+                                                              0x64, 0xfb, 0x38, 0x4d, 0x6f, 0x8b, 0xa6, 0x97,
+                                                              0x1e, 0x3a, 0xa9, 0x15, 0x52, 0xbe, 0x6b, 0xc0,
+                                                              0xf3, 0xde, 0xf2, 0xe5, 0xdb, 0x3f, 0x97, 0x72,
+                                                              0x24, 0x34, 0x24, 0x2e, 0x1e, 0xe, 0x72, 0x1d,
+                                                              0xf7, 0xeb, 0x49, 0x1d, 0x95, 0x82, 0x80, 0x94,
+                                                              0x83, 0x88, 0x1d, 0x88, 0x7e, 0x1f, 0xfb, 0x4,
+                                                              0xfb, 0x40, 0x70, 0xa, 0x8f, 0x88, 0x90, 0x9d,
+                                                              0xb5, 0xb5, 0x9a, 0x4a, 0xa, 0x95, 0x82, 0x80,
+                                                              0x94, 0x83, 0x88, 0x1d, 0x88, 0x7e, 0x1f, 0xe,
+                                                              0x86, 0x1d, 0xf8, 0xa7, 0x77, 0xa2, 0x77, 0x12,
+                                                              0x13, 0x70, 0xf8, 0x11, 0xe3, 0x15, 0xf7, 0x33,
+                                                              0x6, 0x13, 0x90, 0x70, 0x33, 0x5, 0xe1, 0x6,
+                                                              0x13, 0x70, 0x48, 0xa, 0xfc, 0x39, 0xfb, 0x37,
+                                                              0x61, 0x1d, 0xfc, 0xc8, 0xfc, 0x2a, 0x8c, 0xa,
+                                                              0x5d, 0x7e, 0x92, 0xa2, 0x93, 0x8e, 0x95, 0x8e,
+                                                              0x97, 0x1f, 0x13, 0x88, 0x6e, 0x1d, 0x94, 0x70,
+                                                              0x6b, 0xa, 0xe3, 0x8b, 0xd0, 0x4d, 0x76, 0xf7,
+                                                              0x14, 0x77, 0xf7, 0x92, 0xc8, 0xf7, 0xa3, 0x77,
+                                                              0xa2, 0x77, 0x12, 0x13, 0x78, 0xf7, 0xd, 0x7d,
+                                                              0x61, 0x1d, 0x13, 0xb4, 0xfb, 0x24, 0xfd, 0x3c,
+                                                              0x5e, 0x1d, 0xee, 0x5, 0xb6, 0xaa, 0xbc, 0xbe,
+                                                              0x52, 0xa, 0x63, 0x66, 0x61, 0x1f, 0x6b, 0x68,
+                                                              0x8b, 0x8b, 0xfb, 0x8, 0xfb, 0x2, 0x8, 0xfc,
+                                                              0x39, 0xf7, 0x96, 0x8c, 0xa, 0x5f, 0x7c, 0x90,
+                                                              0xa0, 0x94, 0x8d, 0x96, 0x8f, 0x99, 0x1f, 0x6e,
+                                                              0x1d, 0x93, 0x71, 0x6b, 0xa, 0x86, 0x1d, 0xf7,
+                                                              0x8, 0x77, 0xf7, 0x80, 0xf7, 0x5b, 0x5b, 0xbb,
+                                                              0x8e, 0x77, 0x12, 0xf7, 0x5c, 0xdf, 0x4e, 0xe3,
+                                                              0x13, 0x79, 0x0, 0xf7, 0x21, 0x7d, 0x61, 0x1d,
+                                                              0xfc, 0x70, 0xfb, 0x5b, 0x15, 0xcc, 0xae, 0x69,
+                                                              0x4f, 0x5c, 0x6c, 0x61, 0x65, 0x7e, 0x80, 0x8f,
+                                                              0x92, 0x86, 0x67, 0x1d, 0xd1, 0xe1, 0xbc, 0x74,
+                                                              0xa1, 0x6e, 0x9e, 0x1f, 0x13, 0x92, 0x80, 0x63,
+                                                              0x1d, 0x13, 0x94, 0x80, 0x69, 0xa, 0x13, 0x79,
+                                                              0x0, 0xf7, 0xb0, 0xfc, 0x2b, 0x15, 0xf7, 0x33,
+                                                              0x6, 0x13, 0x99, 0x0, 0x70, 0x33, 0x5, 0xe1,
+                                                              0x6, 0x13, 0x79, 0x0, 0x48, 0xa, 0xe, 0xfb,
+                                                              0x61, 0xaa, 0x6c, 0xf7, 0x58, 0xf7, 0xf5, 0xf7,
+                                                              0x28, 0x12, 0xa9, 0xf7, 0x13, 0xf7, 0x8, 0xf7,
+                                                              0x28, 0x13, 0x78, 0xf7, 0xc4, 0xf7, 0xa3, 0x15,
+                                                              0x73, 0x50, 0x7c, 0x6c, 0x60, 0x6f, 0x8, 0xfb,
+                                                              0x19, 0x34, 0x50, 0x5a, 0x3d, 0x1a, 0x5c, 0xa8,
+                                                              0x2a, 0xf7, 0x29, 0xf7, 0x1, 0xcb, 0xc9, 0xcf,
+                                                              0xaf, 0x71, 0xa9, 0x68, 0x6b, 0x6e, 0x72, 0x69,
+                                                              0x78, 0x93, 0x7f, 0x92, 0x81, 0x1e, 0x92, 0x81,
+                                                              0x92, 0x83, 0x82, 0x1a, 0x13, 0xb8, 0x76, 0x6a,
+                                                              0x7a, 0x6f, 0x6c, 0x64, 0x9b, 0xcd, 0xc1, 0xa9,
+                                                              0xbd, 0xd6, 0xe8, 0x1e, 0xc8, 0xd7, 0x92, 0xbd,
+                                                              0x8e, 0xac, 0x8, 0x4f, 0xf7, 0x2e, 0x3c, 0xa,
+                                                              0x51, 0x1d, 0xf7, 0x85, 0x77, 0x1, 0xf8, 0x3c,
+                                                              0xf9, 0x67, 0x7b, 0xa, 0xfb, 0x2, 0xf7, 0x26,
+                                                              0x5, 0x98, 0x80, 0x78, 0xa1, 0x30, 0x1d, 0xfb,
+                                                              0xfa, 0xfd, 0xc0, 0x33, 0xa, 0x51, 0x1d, 0xf7,
+                                                              0x85, 0x77, 0x1, 0xf7, 0xcb, 0xf9, 0x67, 0x22,
+                                                              0x1d, 0xfc, 0x88, 0xfd, 0xea, 0x33, 0xa, 0x51,
+                                                              0x1d, 0xf7, 0x7e, 0x5a, 0x1d, 0xfc, 0x5a, 0xfe,
+                                                              0x15, 0x24, 0x1d, 0x56, 0xa, 0xf8, 0x4d, 0x77,
+                                                              0xd5, 0x83, 0x1d, 0x5e, 0xd6, 0x12, 0x13, 0xe4,
+                                                              0xf7, 0x93, 0xf9, 0x7c, 0x15, 0x13, 0xe8, 0x9e,
+                                                              0x93, 0x94, 0xa3, 0xac, 0x1b, 0xac, 0xa2, 0x84,
+                                                              0x80, 0xa0, 0x1f, 0x13, 0xf0, 0x7f, 0xa6, 0x9f,
+                                                              0x7d, 0xa6, 0x1b, 0xe1, 0xa3, 0xde, 0xaf, 0x93,
+                                                              0x1f, 0x62, 0x6, 0x78, 0x82, 0x82, 0x74, 0x68,
+                                                              0x1b, 0x7c, 0x73, 0x96, 0x96, 0x70, 0x1f, 0x96,
+                                                              0x70, 0x6f, 0x94, 0x70, 0x1b, 0x28, 0x79, 0xfb,
+                                                              0x7, 0x88, 0x1f, 0x35, 0xfd, 0x7c, 0x15, 0xae,
+                                                              0x7, 0x23, 0x1d, 0x68, 0x7, 0xf8, 0xc, 0xf8,
+                                                              0x7f, 0x15, 0x74, 0x1d, 0xfb, 0x4d, 0x6, 0xe,
+                                                              0x56, 0xa, 0xf8, 0x59, 0x77, 0xba, 0xf7, 0x1a,
+                                                              0xfb, 0xd, 0xf7, 0x1a, 0x12, 0xf7, 0x80, 0xf7,
+                                                              0x1a, 0xbd, 0xf7, 0x1a, 0x13, 0xee, 0xf7, 0x73,
+                                                              0xf9, 0xaf, 0x15, 0x13, 0xf6, 0x20, 0x1d, 0xf7,
+                                                              0x68, 0x2b, 0xa, 0xfc, 0x8a, 0xfd, 0xaf, 0x24,
+                                                              0x1d, 0x51, 0x1d, 0xb8, 0xbb, 0xf7, 0x1, 0xbc,
+                                                              0x1, 0xf7, 0xb0, 0xbb, 0xf7, 0x8, 0xbc, 0x3,
+                                                              0xf7, 0xb0, 0xf9, 0xc2, 0x15, 0x4f, 0xb9, 0x5d,
+                                                              0xc7, 0xc6, 0xbb, 0xba, 0xc6, 0xc6, 0x5b, 0xbb,
+                                                              0x50, 0x50, 0x5c, 0x5b, 0x5e, 0xa, 0xfc, 0x23,
+                                                              0xfd, 0xc2, 0x24, 0x1d, 0xf7, 0xae, 0x8b, 0xab,
+                                                              0xf7, 0x73, 0xb2, 0xb7, 0xab, 0xf7, 0x9f, 0xab,
+                                                              0x1, 0x4b, 0xab, 0x15, 0xac, 0x90, 0x8a, 0x8b,
+                                                              0xc3, 0xd3, 0xf8, 0x2, 0xf8, 0x5b, 0x18, 0x98,
+                                                              0x9b, 0x92, 0x99, 0x98, 0x1a, 0xa0, 0x6d, 0x93,
+                                                              0x58, 0x1e, 0xac, 0xf8, 0xe1, 0x7, 0x5e, 0xfb,
+                                                              0x52, 0x73, 0x90, 0x5, 0xf7, 0x14, 0x39, 0xa4,
+                                                              0x3c, 0x56, 0x87, 0x80, 0x76, 0x86, 0x1e, 0x4a,
+                                                              0xfb, 0x7f, 0xf0, 0x88, 0xc0, 0x98, 0xb3, 0xeb,
+                                                              0x19, 0xa5, 0x87, 0x42, 0xfb, 0xa5, 0x72, 0x90,
+                                                              0x98, 0xe9, 0x77, 0xb6, 0xfb, 0xf, 0x88, 0x19,
+                                                              0x4c, 0xfb, 0x85, 0x5, 0x89, 0x82, 0x8a, 0x83,
+                                                              0x85, 0x1a, 0x6f, 0x9d, 0x7d, 0xa7, 0xf7, 0x2b,
+                                                              0xcf, 0xba, 0xf7, 0xc, 0xd3, 0x1e, 0xa5, 0x88,
+                                                              0x50, 0xfb, 0x58, 0x5, 0xfc, 0xa3, 0xab, 0x6,
+                                                              0xba, 0x93, 0x9a, 0x90, 0x9b, 0xc5, 0xb9, 0xf7,
+                                                              0x2c, 0x18, 0xfb, 0x54, 0x6, 0xfb, 0x6, 0xfb,
+                                                              0x2a, 0x5, 0x82, 0x7e, 0x86, 0x80, 0x81, 0x1a,
+                                                              0x71, 0xa0, 0x7e, 0xb5, 0x1e, 0x6b, 0xfb, 0x57,
+                                                              0x7, 0xf8, 0x62, 0xf7, 0xba, 0x15, 0xe7, 0xf7,
+                                                              0xd7, 0x5, 0x7f, 0x6, 0xfb, 0x91, 0xfb, 0xd7,
+                                                              0x5, 0xe, 0x90, 0xfb, 0x6e, 0xb4, 0xf7, 0x6f,
+                                                              0x76, 0xae, 0xbf, 0xf8, 0xaf, 0xae, 0x1, 0xab,
+                                                              0xf7, 0x2e, 0xef, 0xb8, 0xf7, 0xa1, 0xab, 0x98,
+                                                              0xa9, 0x3, 0xf7, 0x7f, 0x2f, 0x15, 0x98, 0x7f,
+                                                              0x5, 0x8f, 0x94, 0x94, 0x8c, 0x93, 0x1b, 0xa8,
+                                                              0xa1, 0x72, 0x7f, 0x70, 0x74, 0x7d, 0x6c, 0x6e,
+                                                              0x7a, 0x91, 0x96, 0x74, 0x1f, 0x75, 0x6a, 0x5,
+                                                              0x83, 0x9b, 0xa3, 0x7a, 0xbe, 0x1b, 0xc0, 0xe7,
+                                                              0x9e, 0xca, 0xc3, 0x58, 0xa0, 0x65, 0x80, 0x82,
+                                                              0x8a, 0x89, 0x84, 0x1f, 0xaa, 0xb9, 0x5, 0xf7,
+                                                              0x9, 0xdb, 0xd6, 0xd3, 0xbb, 0x1f, 0x6d, 0xa1,
+                                                              0x5, 0x2e, 0x43, 0x49, 0x72, 0x3d, 0x1b, 0x7d,
+                                                              0xfb, 0x16, 0x8b, 0xf7, 0x47, 0xf7, 0x45, 0xf3,
+                                                              0xf7, 0x97, 0xf7, 0x35, 0xe3, 0xc5, 0x4d, 0x2a,
+                                                              0x7f, 0x8a, 0x80, 0x89, 0x80, 0x81, 0x1d, 0x80,
+                                                              0x85, 0x7e, 0x74, 0x1b, 0x7e, 0x77, 0x93, 0x93,
+                                                              0x6f, 0x1f, 0x92, 0x73, 0x6c, 0x91, 0x63, 0x1b,
+                                                              0xfb, 0x87, 0xfb, 0x44, 0xfb, 0x74, 0xfb, 0x71,
+                                                              0xfb, 0x40, 0xf7, 0x15, 0x36, 0xf7, 0x11, 0x1f,
+                                                              0xe, 0x51, 0xa, 0x73, 0xa, 0xf8, 0x3c, 0xf9,
+                                                              0x67, 0x27, 0x1d, 0xfb, 0xd2, 0xfd, 0xc0, 0x15,
+                                                              0x37, 0x1d, 0x57, 0x7b, 0x94, 0x9b, 0x98, 0x93,
+                                                              0x9c, 0x90, 0x9f, 0x7e, 0xa, 0xf7, 0x1, 0xae,
+                                                              0x71, 0x4f, 0x7d, 0x8a, 0x7b, 0x88, 0x79, 0x4c,
+                                                              0xa, 0x5, 0x3a, 0x60, 0x7c, 0x72, 0xfb, 0x27,
+                                                              0x1b, 0x65, 0xa, 0x93, 0x73, 0x1d, 0x8b, 0x40,
+                                                              0x1d, 0x85, 0x96, 0x87, 0x43, 0xa, 0xe, 0x51,
+                                                              0xa, 0x73, 0xa, 0xf7, 0xcb, 0xf9, 0x67, 0x15,
+                                                              0xbc, 0x6, 0xf7, 0x2b, 0xe1, 0x5, 0xa2, 0x98,
+                                                              0x9c, 0x97, 0x25, 0x1d, 0xfc, 0x60, 0xfd, 0xea,
+                                                              0x15, 0x37, 0x1d, 0x55, 0x7d, 0x95, 0x9c, 0x98,
+                                                              0x93, 0x9b, 0x90, 0x9e, 0x7e, 0xa, 0xf7, 0x3,
+                                                              0xac, 0x70, 0x4d, 0x7e, 0x89, 0x7c, 0x89, 0x7a,
+                                                              0x4c, 0xa, 0x60, 0x3a, 0x7c, 0x71, 0xfb, 0x27,
+                                                              0x8c, 0x19, 0x65, 0xa, 0x95, 0x73, 0x1d, 0x89,
+                                                              0x31, 0x1d, 0xe, 0x51, 0xa, 0xf7, 0x78, 0x5a,
+                                                              0x1d, 0xfc, 0x32, 0xfe, 0x15, 0x15, 0x37, 0x1d,
+                                                              0x56, 0x7c, 0x95, 0x9c, 0x98, 0x91, 0x9b, 0x90,
+                                                              0x9e, 0x1f, 0xca, 0xf7, 0x7b, 0x5, 0xf7, 0x6,
+                                                              0xa9, 0x6e, 0x49, 0x7f, 0x89, 0x7e, 0x89, 0x7d,
+                                                              0x2a, 0xa, 0xe, 0x51, 0xa, 0xc5, 0xf7, 0x1b,
+                                                              0x1, 0xf7, 0x86, 0xf7, 0x1b, 0xd8, 0xf7, 0x1b,
+                                                              0x3, 0x70, 0x16, 0x37, 0x1d, 0x56, 0x7c, 0x95,
+                                                              0x9b, 0x98, 0x93, 0x9b, 0x90, 0x9f, 0x7e, 0xa,
+                                                              0xf7, 0x3, 0xac, 0x70, 0x4d, 0x7e, 0x89, 0x7c,
+                                                              0x89, 0x7a, 0x2a, 0xa, 0xf7, 0xa1, 0xf9, 0x8b,
+                                                              0x46, 0x1d, 0x68, 0xa, 0x73, 0xa, 0x6b, 0x16,
+                                                              0x75, 0x1d, 0x4a, 0x7f, 0x9a, 0xa1, 0x97, 0x91,
+                                                              0x98, 0x8e, 0x95, 0x41, 0xa, 0xc6, 0x9b, 0x7e,
+                                                              0x7a, 0x7f, 0x86, 0x7c, 0x47, 0x1d, 0xf7, 0xe5,
+                                                              0xf9, 0x44, 0x2a, 0x1d, 0x68, 0xa, 0x73, 0xa,
+                                                              0xf7, 0x54, 0xf9, 0x67, 0x7b, 0xa, 0xf7, 0x1a,
+                                                              0xdc, 0x5, 0xa1, 0x98, 0x9e, 0x9c, 0x25, 0x1d,
+                                                              0xfb, 0xda, 0xfd, 0xea, 0x8e, 0x1d, 0x4e, 0x7b,
+                                                              0x98, 0x9f, 0x98, 0x91, 0x9a, 0x8e, 0x96, 0x41,
+                                                              0xa, 0xc6, 0x9b, 0x7f, 0x79, 0x7f, 0x86, 0x7c,
+                                                              0x47, 0x1d, 0xe, 0x68, 0xa, 0xf7, 0x78, 0x77,
+                                                              0x1, 0xf7, 0xb, 0xf9, 0x67, 0x15, 0xc4, 0x6,
+                                                              0xf4, 0xea, 0xe3, 0x2c, 0x3b, 0x1d, 0xfb, 0xb1,
+                                                              0xfe, 0x15, 0x8e, 0x1d, 0x4e, 0x7b, 0x98, 0x9f,
+                                                              0x98, 0x91, 0x9a, 0x8e, 0x96, 0x46, 0xa, 0x68,
+                                                              0xa, 0xc6, 0xf7, 0x1a, 0x1, 0xf2, 0xf7, 0x1b,
+                                                              0x3, 0xf2, 0xf9, 0xb0, 0x15, 0x41, 0x1d, 0xf7,
+                                                              0x63, 0x16, 0x41, 0x1d, 0xfb, 0xea, 0xfd, 0xb0,
+                                                              0x8e, 0x1d, 0x4a, 0x7f, 0x9a, 0xa1, 0x97, 0x91,
+                                                              0x98, 0x8e, 0x95, 0x46, 0xa, 0xc7, 0x8b, 0xad,
+                                                              0xf7, 0xbb, 0xb7, 0xf7, 0x9d, 0xaa, 0x1, 0xf8,
+                                                              0xbd, 0xf7, 0x27, 0x3, 0xf7, 0x98, 0xf7, 0xdd,
+                                                              0x15, 0xf7, 0xe, 0x6, 0x97, 0xb7, 0x5, 0xfb,
+                                                              0xe, 0x6, 0xc8, 0xf7, 0x77, 0x80, 0x1d, 0xfb,
+                                                              0x1d, 0x5b, 0x25, 0x60, 0xfb, 0xd1, 0xfb, 0x97,
+                                                              0x61, 0x7d, 0x9a, 0xa3, 0x9a, 0x8f, 0x9c, 0x77,
+                                                              0xa, 0x91, 0xf7, 0x13, 0xf7, 0x6e, 0x5d, 0xa,
+                                                              0x7e, 0x82, 0x75, 0x5a, 0xfb, 0x4a, 0x1e, 0x25,
+                                                              0x6, 0x7f, 0x5f, 0x5, 0xf1, 0x6, 0x86, 0x78,
+                                                              0x80, 0x5c, 0x67, 0xfb, 0xf, 0x6f, 0x2d, 0x6d,
+                                                              0x85, 0x6a, 0x86, 0x8, 0xe, 0x8b, 0x1d, 0xd5,
+                                                              0x8c, 0x1d, 0x13, 0xb0, 0x70, 0x16, 0xf7, 0x64,
+                                                              0xae, 0x6, 0x52, 0x77, 0x9e, 0xaf, 0xa7, 0x92,
+                                                              0xac, 0x93, 0xa6, 0x1f, 0xee, 0xf7, 0xf8, 0x5,
+                                                              0x13, 0x70, 0x59, 0xa, 0xc2, 0xa0, 0x78, 0x6a,
+                                                              0x6f, 0x85, 0x68, 0x83, 0x6f, 0x64, 0x1d, 0xfb,
+                                                              0xc, 0xfc, 0x2f, 0x18, 0x13, 0xa8, 0x63, 0xfb,
+                                                              0x1f, 0x80, 0x93, 0x59, 0x7f, 0x8, 0xf7, 0xb1,
+                                                              0xf9, 0x59, 0x50, 0xa, 0xa8, 0xa2, 0x7f, 0x80,
+                                                              0xa2, 0x1f, 0x13, 0xb0, 0x80, 0xa1, 0xa2, 0x81,
+                                                              0xaa, 0x3d, 0x1d, 0x7c, 0x73, 0x96, 0x96, 0x70,
+                                                              0x1f, 0x95, 0x71, 0x6e, 0x95, 0x70, 0x54, 0x1d,
+                                                              0x33, 0x1d, 0xf8, 0x3d, 0xf8, 0x96, 0x2a, 0x1d,
+                                                              0x33, 0x1d, 0xf7, 0xef, 0xf8, 0x96, 0x26, 0xa,
+                                                              0x65, 0x1d, 0xf7, 0x6a, 0x25, 0xa, 0xf7, 0x87,
+                                                              0xf8, 0x96, 0x5b, 0xa, 0xec, 0xe3, 0x2a, 0x7e,
+                                                              0x1d, 0x65, 0x1d, 0xc7, 0x8c, 0x1d, 0x4d, 0xa,
+                                                              0x13, 0xdc, 0x3a, 0x1d, 0xf7, 0x80, 0xf8, 0xaa,
+                                                              0x50, 0xa, 0xa4, 0xa2, 0x7f, 0x80, 0xa4, 0x1f,
+                                                              0x13, 0xec, 0x80, 0xa3, 0xa4, 0x81, 0xa8, 0x3d,
+                                                              0x1d, 0x7c, 0x72, 0x96, 0x96, 0x70, 0x1f, 0x95,
+                                                              0x71, 0x6f, 0x95, 0x70, 0x54, 0x1d, 0x65, 0x1d,
+                                                              0xb8, 0xf7, 0x1a, 0x12, 0xa6, 0xf7, 0x24, 0xf7,
+                                                              0xc, 0xf7, 0x1a, 0xd8, 0xf7, 0x1a, 0x32, 0xf7,
+                                                              0x24, 0x13, 0xfa, 0x3a, 0x1d, 0xf7, 0x9c, 0xf8,
+                                                              0xdd, 0x2e, 0xa, 0x13, 0xfc, 0xf7, 0x67, 0x2d,
+                                                              0x1d, 0x2f, 0xb0, 0x76, 0xf8, 0x6e, 0x77, 0x1,
+                                                              0xbb, 0xc7, 0x15, 0xb7, 0x5f, 0xf7, 0x54, 0xf7,
+                                                              0x54, 0xf7, 0x53, 0xfb, 0x54, 0xba, 0xba, 0xfb,
+                                                              0x55, 0xf7, 0x52, 0xf7, 0x55, 0xf7, 0x56, 0x59,
+                                                              0xb6, 0xfb, 0x50, 0xfb, 0x52, 0xfb, 0x52, 0xf7,
+                                                              0x52, 0x5d, 0x5c, 0xf7, 0x51, 0xfb, 0x51, 0x5,
+                                                              0xe, 0xc7, 0x23, 0x76, 0xf6, 0xad, 0xf9, 0xf,
+                                                              0xad, 0xda, 0x77, 0x1, 0x4d, 0xa, 0x3, 0xf7,
+                                                              0x4a, 0xd8, 0x15, 0x83, 0x9f, 0x88, 0xa2, 0xa9,
+                                                              0x1a, 0xeb, 0xe4, 0xf8, 0x29, 0xf7, 0x49, 0xa8,
+                                                              0xa0, 0x83, 0x7e, 0x9a, 0x1e, 0xfb, 0xbe, 0xfc,
+                                                              0xe4, 0x15, 0xf7, 0xd9, 0xf8, 0xbf, 0x5, 0x96,
+                                                              0x74, 0x8e, 0x6f, 0x79, 0x1a, 0xfb, 0x2, 0x2e,
+                                                              0xfc, 0x22, 0xfb, 0x47, 0x72, 0x74, 0x91, 0x9b,
+                                                              0x78, 0x1e, 0xfb, 0x23, 0xfb, 0x37, 0x15, 0xbb,
+                                                              0x6, 0xd1, 0xf7, 0xc, 0x5, 0x83, 0xa3, 0xa6,
+                                                              0x86, 0xaa, 0x1b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7,
+                                                              0xa0, 0xf7, 0x56, 0xf7, 0x2, 0x56, 0xce, 0x47,
+                                                              0xae, 0x1f, 0xca, 0xf7, 0x0, 0x5, 0x5a, 0x6,
+                                                              0x56, 0x2f, 0x5, 0x94, 0x70, 0x67, 0x8f, 0x70,
+                                                              0x1b, 0xfb, 0x6f, 0xfb, 0x57, 0xfb, 0x7d, 0xfb,
+                                                              0x89, 0x46, 0xaf, 0x36, 0xdc, 0x61, 0x1f, 0xe,
+                                                              0x72, 0xa, 0x73, 0xa, 0xb0, 0xf7, 0x1e, 0x3,
+                                                              0xed, 0xf9, 0xe, 0x29, 0x1d, 0xc3, 0x9e, 0x7a,
+                                                              0x68, 0x6e, 0x84, 0x68, 0x84, 0x70, 0x4a, 0x1d,
+                                                              0x2c, 0x6f, 0xb4, 0xc1, 0xb5, 0x9a, 0xbd, 0x98,
+                                                              0xba, 0x3e, 0x1d, 0xf7, 0xf6, 0xc1, 0x2a, 0x1d,
+                                                              0x72, 0xa, 0x73, 0xa, 0xce, 0xf7, 0x1e, 0x3,
+                                                              0xf8, 0x32, 0xf9, 0x67, 0x22, 0x1d, 0xfc, 0x4a,
+                                                              0xfb, 0x70, 0x29, 0x1d, 0xc3, 0x9e, 0x79, 0x68,
+                                                              0x6f, 0x84, 0x68, 0x84, 0x70, 0x4a, 0x1d, 0x2f,
+                                                              0x6c, 0xb1, 0xbf, 0xb6, 0x99, 0xbf, 0x99, 0xbc,
+                                                              0x3e, 0x1d, 0xe, 0x72, 0xa, 0xf7, 0x78, 0x77,
+                                                              0x1, 0xce, 0xf7, 0x1e, 0x3, 0xf7, 0xa2, 0xf9,
+                                                              0x67, 0x42, 0xa, 0xfb, 0xe0, 0xfb, 0x9b, 0x29,
+                                                              0x1d, 0xc0, 0xa1, 0x7b, 0x6b, 0x6e, 0x85, 0x66,
+                                                              0x83, 0x6e, 0x4a, 0x1d, 0x30, 0x6b, 0xb1, 0xbe,
+                                                              0xb6, 0x99, 0xc0, 0x99, 0xbc, 0x3e, 0x1d, 0xe,
+                                                              0x72, 0xa, 0xc6, 0xf7, 0x1a, 0x1, 0xf3, 0xf7,
+                                                              0x1e, 0xca, 0xf7, 0x1a, 0xba, 0xf7, 0x1a, 0x3,
+                                                              0xed, 0xf9, 0xe, 0x29, 0x1d, 0xc4, 0x9d, 0x78,
+                                                              0x67, 0x6f, 0x84, 0x6a, 0x84, 0x70, 0x4a, 0x1d,
+                                                              0x2d, 0x6e, 0xb3, 0xc1, 0xb5, 0x9a, 0xbe, 0x98,
+                                                              0xba, 0x3e, 0x1d, 0xf7, 0x63, 0xf7, 0x12, 0x2e,
+                                                              0xa, 0xf7, 0x69, 0x2d, 0x1d, 0x58, 0x58, 0xa,
+                                                              0x73, 0xa, 0xd4, 0x16, 0xf7, 0xd6, 0xae, 0x6,
+                                                              0x58, 0x70, 0x98, 0xab, 0x99, 0x8d, 0x9b, 0x92,
+                                                              0x9c, 0x1f, 0xbf, 0xf7, 0x49, 0x6a, 0xa, 0xc2,
+                                                              0xa6, 0x7e, 0x79, 0x81, 0x87, 0x7e, 0x80, 0x7c,
+                                                              0x1f, 0xfb, 0x2f, 0xfb, 0x69, 0x5, 0x4b, 0xf7,
+                                                              0x5c, 0x81, 0x82, 0xa7, 0x1a, 0xa2, 0x94, 0xb3,
+                                                              0xc5, 0x6a, 0x1d, 0x55, 0xfb, 0x4e, 0x79, 0x4b,
+                                                              0x6c, 0x74, 0x51, 0x86, 0x19, 0xf7, 0xb1, 0xf9,
+                                                              0x44, 0x26, 0xa, 0x58, 0x8b, 0xae, 0xf7, 0x27,
+                                                              0xab, 0xf7, 0xb4, 0xab, 0x6b, 0xf7, 0x3b, 0x12,
+                                                              0xf8, 0x3f, 0xf7, 0x26, 0x13, 0xe8, 0xf7, 0x79,
+                                                              0xf7, 0x6f, 0x6f, 0x1d, 0x33, 0x62, 0x40, 0x26,
+                                                              0x7a, 0x78, 0x8c, 0x8f, 0x77, 0x1f, 0xfb, 0x94,
+                                                              0xfb, 0x6f, 0x15, 0xf7, 0xba, 0xae, 0x6, 0x4c,
+                                                              0x7f, 0x9e, 0xa2, 0x94, 0x8d, 0x94, 0x8d, 0x93,
+                                                              0x1f, 0xa2, 0xdf, 0x5, 0x87, 0xb0, 0x9a, 0x8a,
+                                                              0xb4, 0x1b, 0xf7, 0x1a, 0xf7, 0x13, 0xce, 0xf7,
+                                                              0x14, 0xf7, 0x12, 0x20, 0xaa, 0x21, 0x1f, 0x5b,
+                                                              0x6, 0xa9, 0xe5, 0xa3, 0x8f, 0xb3, 0x91, 0x8,
+                                                              0x13, 0xd8, 0x8c, 0xae, 0x5, 0xfb, 0xba, 0x68,
+                                                              0x6, 0xbf, 0x9f, 0x7f, 0x77, 0x7c, 0x88, 0x78,
+                                                              0x85, 0x75, 0x1f, 0xfb, 0xf, 0xfc, 0x4b, 0x7a,
+                                                              0x4d, 0x74, 0x88, 0x63, 0x84, 0x19, 0xe, 0xfb,
+                                                              0x5c, 0xf7, 0x16, 0xca, 0xad, 0xf9, 0x1c, 0xa9,
+                                                              0x12, 0xf7, 0xcf, 0xf7, 0xc, 0x42, 0xf7, 0x3,
+                                                              0x13, 0xf0, 0xf7, 0x22, 0x9a, 0x15, 0x82, 0x98,
+                                                              0x96, 0x7e, 0xb6, 0x1b, 0xf7, 0xb, 0xf6, 0xf7,
+                                                              0x1a, 0xf7, 0x12, 0xe9, 0x4c, 0xb1, 0x3d, 0x98,
+                                                              0x1f, 0x8d, 0x7, 0x13, 0xe8, 0xca, 0xa2, 0xf7,
+                                                              0x8, 0xbf, 0xf7, 0x2, 0x1a, 0xd4, 0x4f, 0xba,
+                                                              0x36, 0xfb, 0x2e, 0x43, 0xfb, 0x33, 0xfb, 0x23,
+                                                              0x71, 0x1e, 0x49, 0xfb, 0xff, 0x6d, 0xfb, 0x1c,
+                                                              0x66, 0x5c, 0x8, 0x80, 0x82, 0x71, 0x7a, 0x7c,
+                                                              0x1b, 0x84, 0x87, 0x8f, 0x94, 0x96, 0x93, 0x8c,
+                                                              0x90, 0x95, 0x1f, 0x8d, 0x90, 0x8d, 0x91, 0x96,
+                                                              0x1a, 0xb0, 0x6b, 0x92, 0x7e, 0x55, 0x8b, 0x5c,
+                                                              0x83, 0x67, 0xaa, 0x64, 0xcc, 0xf7, 0xa, 0xcf,
+                                                              0xf7, 0xd, 0xf7, 0x49, 0xb4, 0x1e, 0xe6, 0xf8,
+                                                              0x2b, 0x5, 0xf7, 0x3, 0xa4, 0xa8, 0xc2, 0xb9,
+                                                              0x1b, 0xba, 0x8c, 0x47, 0x75, 0x4d, 0x79, 0x21,
+                                                              0x2b, 0x1f, 0x84, 0x6a, 0x5, 0x13, 0xf0, 0xb6,
+                                                              0x85, 0xaa, 0x5f, 0x3a, 0x1a, 0x5b, 0x6d, 0xfb,
+                                                              0x46, 0x3f, 0x7a, 0x78, 0x93, 0x9a, 0x80, 0x1e,
+                                                              0xe, 0x58, 0x1d, 0xb5, 0x85, 0x77, 0xf7, 0x99,
+                                                              0x34, 0xa, 0x6f, 0x81, 0x62, 0x62, 0x76, 0x1b,
+                                                              0x84, 0x86, 0x8f, 0x95, 0x44, 0xa, 0x5, 0xfb,
+                                                              0x1, 0x6, 0x78, 0x4d, 0x6f, 0xa, 0x13, 0xac,
+                                                              0x27, 0xa, 0x30, 0xa, 0xf7, 0x74, 0xf8, 0x25,
+                                                              0x2a, 0x1d, 0x5b, 0x1d, 0xf7, 0x93, 0x34, 0xa,
+                                                              0x6e, 0x80, 0x5f, 0x63, 0x77, 0x3f, 0x1d, 0x13,
+                                                              0xac, 0x30, 0xa, 0xf7, 0xd, 0xf8, 0x25, 0x26,
+                                                              0xa, 0x5b, 0x1d, 0xf7, 0x8c, 0x34, 0xa, 0x71,
+                                                              0xa, 0x8f, 0x95, 0x28, 0x1d, 0x13, 0xac, 0x30,
+                                                              0xa, 0xa1, 0xf8, 0x25, 0x42, 0xa, 0xe, 0x5b,
+                                                              0x1d, 0xe9, 0x8c, 0x1d, 0x76, 0xf7, 0xf, 0x13,
+                                                              0x6a, 0x28, 0xa, 0x13, 0x9a, 0x6e, 0x80, 0x5e,
+                                                              0x63, 0x78, 0x3f, 0x1d, 0x13, 0xa6, 0x30, 0xa,
+                                                              0xa9, 0xf8, 0x3a, 0x50, 0xa, 0xa5, 0xa2, 0x82,
+                                                              0x81, 0xa1, 0x1f, 0x13, 0xaa, 0x7f, 0xa6, 0xa6,
+                                                              0x7e, 0xa5, 0x3d, 0x1d, 0x7b, 0x71, 0x98, 0x96,
+                                                              0x6e, 0x1f, 0x95, 0x72, 0x70, 0x93, 0x72, 0x54,
+                                                              0x1d, 0x5b, 0x1d, 0xda, 0xf7, 0x1a, 0x74, 0xa,
+                                                              0xa6, 0x8e, 0xa, 0x13, 0x6f, 0x28, 0xa, 0x13,
+                                                              0x9f, 0x6e, 0x80, 0x5f, 0x63, 0x77, 0x3f, 0x1d,
+                                                              0x13, 0xaf, 0x30, 0xa, 0xa6, 0xf8, 0x6d, 0x2e,
+                                                              0xa, 0x3a, 0xa, 0x58, 0x1d, 0xb0, 0x66, 0xb5,
+                                                              0xc1, 0xbc, 0x5a, 0xf7, 0x39, 0xfb, 0x8, 0xf7,
+                                                              0x8, 0xfb, 0x8, 0xf7, 0x38, 0x5b, 0xbb, 0x74,
+                                                              0xa, 0xf7, 0x3, 0xf7, 0x37, 0xfb, 0x8, 0xf7,
+                                                              0x8, 0xfb, 0x8, 0xf7, 0x3a, 0x59, 0xbd, 0x13,
+                                                              0x64, 0xe4, 0x28, 0xa, 0x13, 0x99, 0x64, 0x71,
+                                                              0xa, 0x8f, 0x95, 0x28, 0x1d, 0x30, 0xa, 0xf7,
+                                                              0x3, 0xf8, 0x8f, 0x15, 0xc6, 0xba, 0xbb, 0xc6,
+                                                              0x1e, 0x13, 0xaa, 0xc8, 0xc6, 0xbb, 0x5b, 0x50,
+                                                              0x50, 0x5b, 0x5c, 0x50, 0x1f, 0x13, 0xa4, 0xe4,
+                                                              0x50, 0x5c, 0xba, 0xc6, 0x1f, 0x13, 0xaa, 0xd4,
+                                                              0xba, 0x8c, 0x15, 0x6b, 0xa5, 0x71, 0xab, 0xab,
+                                                              0xa5, 0xa5, 0xab, 0xab, 0x71, 0xa5, 0x6b, 0x6b,
+                                                              0x71, 0x71, 0x6b, 0x1e, 0xe, 0xc7, 0x7e, 0xca,
+                                                              0x4c, 0xd2, 0x5a, 0x76, 0xf7, 0xa, 0x77, 0xf7,
+                                                              0x14, 0x77, 0xf7, 0x75, 0xb3, 0x6d, 0xa9, 0x8e,
+                                                              0x77, 0x12, 0x86, 0xf7, 0x12, 0xf8, 0x62, 0xe5,
+                                                              0x13, 0x9c, 0xc0, 0xf7, 0xac, 0xf7, 0x8, 0x15,
+                                                              0x8d, 0x6, 0x5b, 0x94, 0x9a, 0x3a, 0xf7, 0x10,
+                                                              0x1b, 0xf7, 0x17, 0xc4, 0xf7, 0x19, 0x8d, 0x8c,
+                                                              0x1f, 0x6f, 0x9c, 0x5, 0x7a, 0x82, 0x60, 0x43,
+                                                              0x44, 0x1b, 0x51, 0x82, 0xc5, 0xa4, 0x9b, 0x8d,
+                                                              0x9c, 0x8e, 0x9a, 0x1f, 0xb2, 0x94, 0x5, 0xf7,
+                                                              0x35, 0xb0, 0xce, 0xd4, 0xd2, 0x1a, 0xc8, 0x60,
+                                                              0xa6, 0x53, 0x68, 0x63, 0x83, 0x56, 0x61, 0x1e,
+                                                              0x89, 0x8d, 0x9d, 0xc6, 0x5, 0x13, 0x39, 0xc0,
+                                                              0x28, 0x8e, 0x76, 0x4d, 0x5, 0x88, 0x6, 0xa5,
+                                                              0x82, 0x7f, 0xaf, 0x4d, 0x1b, 0xfb, 0x10, 0xfb,
+                                                              0x28, 0xfb, 0x5e, 0xfb, 0x21, 0x26, 0xc9, 0x6d,
+                                                              0xbe, 0xea, 0xbe, 0xdf, 0xb7, 0xa5, 0x1f, 0xfb,
+                                                              0x33, 0x8d, 0x15, 0x13, 0x5c, 0xc0, 0xe9, 0xe0,
+                                                              0xf7, 0x63, 0xd7, 0xb0, 0x99, 0x71, 0x66, 0x5a,
+                                                              0x49, 0xfb, 0x8d, 0x2b, 0x67, 0x7d, 0xa8, 0xaa,
+                                                              0x1e, 0xf7, 0xb8, 0xeb, 0x15, 0x90, 0x9c, 0x5,
+                                                              0x13, 0x9a, 0xc0, 0xc1, 0x9b, 0xb5, 0xf7, 0x24,
+                                                              0xd5, 0x1b, 0xac, 0x8b, 0x6f, 0x7d, 0xfb, 0xd,
+                                                              0xfb, 0x22, 0x57, 0x6f, 0x1f, 0xe, 0xfb, 0x6e,
+                                                              0xfb, 0x6e, 0xb4, 0xd8, 0xf7, 0x2b, 0xfb, 0x2,
+                                                              0x77, 0xe3, 0x76, 0xf7, 0xce, 0xf7, 0x34, 0x6a,
+                                                              0xac, 0x12, 0x73, 0xf7, 0x14, 0x13, 0xba, 0xf7,
+                                                              0x3, 0x7f, 0x15, 0x54, 0x3b, 0x98, 0x7f, 0x5,
+                                                              0x13, 0xca, 0x7d, 0xa, 0x74, 0x7c, 0x6c, 0x6e,
+                                                              0x79, 0x86, 0xa, 0xa1, 0x79, 0xbf, 0x1b, 0xc0,
+                                                              0xe7, 0x9e, 0xca, 0x1f, 0x13, 0xba, 0xc7, 0x49,
+                                                              0x9c, 0x73, 0x82, 0x83, 0x8a, 0x89, 0x82, 0x1e,
+                                                              0xae, 0xbf, 0xe0, 0x96, 0xcb, 0xcb, 0xb4, 0xc5,
+                                                              0x19, 0x6f, 0x9d, 0x5, 0x13, 0xc6, 0x51, 0x63,
+                                                              0x53, 0x6b, 0x5e, 0x1b, 0x6e, 0x5f, 0xaa, 0xdb,
+                                                              0xd2, 0xda, 0xf7, 0x58, 0xe2, 0x94, 0x99, 0x87,
+                                                              0x7e, 0x86, 0x88, 0x85, 0x87, 0x84, 0x1f, 0x85,
+                                                              0x81, 0x83, 0x7e, 0x7a, 0x1a, 0x13, 0xba, 0x84,
+                                                              0x1d, 0x60, 0xb7, 0x3c, 0xfb, 0x1e, 0xfb, 0x30,
+                                                              0xfb, 0x2e, 0xfb, 0x2d, 0x23, 0xd3, 0x4c, 0xca,
+                                                              0x1e, 0xe, 0x2f, 0xa, 0xf7, 0x2a, 0xf7, 0xc2,
+                                                              0x15, 0xb6, 0x6, 0xfb, 0x1, 0x5f, 0x1d, 0x2f,
+                                                              0xa, 0xbe, 0xf7, 0xc2, 0x15, 0xb8, 0x5a, 0xa,
+                                                              0x68, 0x1d, 0xf7, 0x78, 0x22, 0xa, 0x5b, 0xf7,
+                                                              0xc2, 0x15, 0xc0, 0x6, 0xf7, 0x17, 0xe8, 0xe4,
+                                                              0x2e, 0x5, 0xbd, 0x6, 0x35, 0x4e, 0xa, 0xe,
+                                                              0x68, 0x1d, 0xc7, 0xf7, 0x19, 0x12, 0x90, 0xf7,
+                                                              0x16, 0x69, 0xf7, 0x19, 0xd3, 0xe7, 0x2f, 0xf7,
+                                                              0x1d, 0x13, 0xf4, 0x20, 0xa, 0x13, 0xea, 0x5c,
+                                                              0xf8, 0xa, 0x15, 0x67, 0xa, 0xf7, 0x65, 0x16,
+                                                              0x67, 0xa, 0xe, 0x66, 0x1d, 0xf9, 0x56, 0x3c,
+                                                              0x1d, 0x74, 0xf8, 0x19, 0x7b, 0xa, 0xfb, 0x4,
+                                                              0x5f, 0x1d, 0x66, 0x1d, 0xf9, 0x56, 0x6c, 0x1d,
+                                                              0x52, 0x55, 0x8f, 0xa, 0x90, 0x94, 0x24, 0xa,
+                                                              0xfb, 0x12, 0xf8, 0x19, 0x26, 0xa, 0x66, 0x1d,
+                                                              0xf9, 0x4f, 0x6c, 0x1d, 0x54, 0x55, 0x73, 0x1b,
+                                                              0x84, 0x32, 0xa, 0xfb, 0x84, 0xf8, 0x19, 0x15,
+                                                              0xc4, 0x6, 0xf7, 0x16, 0xe8, 0xe4, 0x2e, 0x5,
+                                                              0xbe, 0x6, 0x34, 0x4e, 0xa, 0xe, 0x66, 0x1d,
+                                                              0xf8, 0xa6, 0xf7, 0x1a, 0x1, 0x9c, 0xf7, 0x1a,
+                                                              0xd6, 0xf7, 0x1a, 0x3, 0xf7, 0x6c, 0xf7, 0x21,
+                                                              0x15, 0x71, 0x88, 0x51, 0x56, 0x74, 0x1b, 0x85,
+                                                              0x88, 0x90, 0x94, 0x24, 0xa, 0xfb, 0x71, 0xf8,
+                                                              0x61, 0x2e, 0xa, 0xf7, 0x65, 0x2d, 0x1d, 0x7e,
+                                                              0xa8, 0xf8, 0x35, 0x6e, 0xa, 0xf7, 0x2e, 0x90,
+                                                              0xa, 0xf7, 0x6b, 0x7b, 0x1d, 0x7d, 0x59, 0x40,
+                                                              0x51, 0xfb, 0xaa, 0x2b, 0x57, 0x8b, 0xf7, 0xa,
+                                                              0x9f, 0x1e, 0xf7, 0x77, 0xf7, 0x9e, 0x15, 0xa9,
+                                                              0x7a, 0x6f, 0x97, 0x73, 0x1b, 0xfb, 0x28, 0xfb,
+                                                              0x15, 0xfb, 0x2e, 0xfb, 0x2e, 0x2b, 0xd9, 0x44,
+                                                              0xdd, 0xf7, 0x2f, 0xf7, 0x15, 0xf7, 0x45, 0xf7,
+                                                              0x6c, 0xe0, 0x66, 0xdd, 0x52, 0xc8, 0x1f, 0xf6,
+                                                              0xc3, 0x69, 0xab, 0x20, 0x52, 0x64, 0xab, 0x5d,
+                                                              0xa1, 0x5c, 0x91, 0x19, 0x5f, 0x70, 0xb1, 0x85,
+                                                              0xb5, 0x73, 0xaf, 0x68, 0x19, 0xfb, 0xe, 0x4b,
+                                                              0xac, 0x6c, 0xf7, 0xb, 0xc9, 0x5, 0xae, 0x5f,
+                                                              0xa6, 0x56, 0x56, 0x1a, 0xe, 0x21, 0x97, 0x76,
+                                                              0xa9, 0x76, 0xf8, 0x62, 0x77, 0xf7, 0x1e, 0xd6,
+                                                              0x12, 0x13, 0x70, 0x78, 0xa, 0x98, 0x97, 0x81,
+                                                              0x7f, 0x1f, 0x75, 0x33, 0xfb, 0x6f, 0x44, 0x1a,
+                                                              0x13, 0xb0, 0x76, 0x1d, 0x68, 0x80, 0x60, 0x63,
+                                                              0x77, 0x88, 0x1d, 0x91, 0x96, 0x1f, 0xa8, 0xe2,
+                                                              0xf7, 0x68, 0xcc, 0x4f, 0xa, 0x13, 0x70, 0x88,
+                                                              0xa, 0xf7, 0x2b, 0xf8, 0xad, 0x50, 0xa, 0xa9,
+                                                              0xa1, 0x81, 0x81, 0xa1, 0x1f, 0x7f, 0xa4, 0xa3,
+                                                              0x7f, 0xa7, 0x3d, 0x1d, 0x7c, 0x74, 0x95, 0x96,
+                                                              0x70, 0x1f, 0x95, 0x71, 0x6d, 0x96, 0x70, 0x54,
+                                                              0x1d, 0x7e, 0xa8, 0xf8, 0x33, 0xa8, 0xf7, 0x81,
+                                                              0x37, 0xa, 0xf7, 0xdd, 0xf8, 0xe, 0x2a, 0x1d,
+                                                              0x7e, 0xa8, 0xf8, 0x33, 0x6e, 0xa, 0xe3, 0x90,
+                                                              0xa, 0xf7, 0xab, 0x7b, 0x1d, 0x7f, 0x59, 0x40,
+                                                              0x51, 0xfb, 0xaa, 0x36, 0xa, 0xf7, 0x40, 0xf7,
+                                                              0x29, 0xf7, 0x1a, 0xfb, 0xb, 0x9d, 0x4b, 0x1d,
+                                                              0xf7, 0x76, 0xf8, 0xe, 0x26, 0xa, 0x8f, 0x1d,
+                                                              0xf7, 0x7a, 0x37, 0xa, 0xf7, 0x13, 0xf8, 0xe,
+                                                              0x42, 0xa, 0xe, 0x8f, 0x1d, 0xd7, 0x8c, 0x1d,
+                                                              0x4e, 0x1d, 0x13, 0xdc, 0x23, 0xa, 0xf7, 0x1b,
+                                                              0xf8, 0x23, 0x50, 0xa, 0xa9, 0xa0, 0x81, 0x80,
+                                                              0xa0, 0x1f, 0x13, 0xec, 0x80, 0xa2, 0xa2, 0x7f,
+                                                              0xac, 0x3d, 0x1d, 0x7c, 0x74, 0x95, 0x96, 0x71,
+                                                              0x1f, 0x95, 0x70, 0x6d, 0x96, 0x70, 0x54, 0x1d,
+                                                              0x8f, 0x1d, 0xc8, 0xf7, 0x1a, 0x12, 0x88, 0xf7,
+                                                              0xb, 0x93, 0xf7, 0x1a, 0xcb, 0xf7, 0xb, 0xfb,
+                                                              0x1, 0xf7, 0x1a, 0x13, 0xfc, 0x23, 0xa, 0xf7,
+                                                              0x13, 0xf8, 0x56, 0x2e, 0xa, 0x13, 0xfa, 0x3a,
+                                                              0xa, 0x2f, 0x6e, 0xef, 0x27, 0xf7, 0x28, 0xe7,
+                                                              0xe1, 0x36, 0xd0, 0xf5, 0xf7, 0x28, 0x27, 0xef,
+                                                              0x12, 0xf7, 0x67, 0xf7, 0x28, 0xfb, 0xc, 0xef,
+                                                              0x13, 0x5a, 0xac, 0xf7, 0x68, 0x15, 0xf8, 0x8c,
+                                                              0xd0, 0xfc, 0x8c, 0x6, 0x13, 0xa5, 0xf7, 0x62,
+                                                              0xfb, 0x98, 0x15, 0x66, 0xa, 0xf8, 0x64, 0x4,
+                                                              0x66, 0xa, 0xe, 0x29, 0x76, 0xf5, 0xa8, 0xcd,
+                                                              0x77, 0xf8, 0x8, 0xa8, 0xec, 0x5c, 0x1d, 0xe1,
+                                                              0x90, 0xa, 0xf7, 0xb0, 0xf7, 0x0, 0x98, 0x96,
+                                                              0x86, 0x81, 0x94, 0x1e, 0xfb, 0x51, 0xfb, 0xe5,
+                                                              0x6f, 0xa, 0x61, 0x40, 0x15, 0x43, 0xfb, 0x12,
+                                                              0x5, 0xb3, 0x6, 0xcb, 0xf7, 0x6, 0x5, 0x86,
+                                                              0x9b, 0x9d, 0x88, 0x9c, 0x1b, 0xf7, 0x34, 0xf7,
+                                                              0x10, 0xf7, 0x40, 0xf7, 0x29, 0xda, 0x62, 0xb2,
+                                                              0x62, 0x9d, 0x1f, 0xcc, 0xf7, 0x8, 0x5, 0x66,
+                                                              0x6, 0x50, 0x23, 0x5, 0x90, 0x79, 0x71, 0x8d,
+                                                              0x81, 0x1b, 0xfb, 0x32, 0xfb, 0xb, 0xfb, 0x41,
+                                                              0xfb, 0x2e, 0x4d, 0xab, 0x5f, 0xb8, 0x74, 0x1f,
+                                                              0xc1, 0xa6, 0x15, 0xf7, 0x55, 0xf7, 0xeb, 0x5,
+                                                              0x8c, 0x8a, 0x8b, 0x87, 0x88, 0x1a, 0x40, 0x51,
+                                                              0xfb, 0xaa, 0x2b, 0x77, 0x7f, 0x92, 0x96, 0x83,
+                                                              0x1e, 0xe, 0x64, 0xa, 0xf7, 0xa0, 0x77, 0x1,
+                                                              0x2c, 0x1d, 0x54, 0x4e, 0x8f, 0xa, 0x91, 0x97,
+                                                              0x31, 0xa, 0x79, 0x86, 0x97, 0x9a, 0x9e, 0x94,
+                                                              0xa4, 0x2d, 0xa, 0xcf, 0xf7, 0xfd, 0x2a, 0x1d,
+                                                              0x64, 0xa, 0xf7, 0xa0, 0x77, 0x1, 0x29, 0xa,
+                                                              0x96, 0x9b, 0x9e, 0x94, 0xa4, 0x2d, 0xa, 0x68,
+                                                              0xf7, 0xfd, 0x26, 0xa, 0x64, 0xa, 0xf7, 0x99,
+                                                              0x77, 0x1, 0x29, 0xa, 0x95, 0x9a, 0x9e, 0x94,
+                                                              0xa6, 0x2d, 0xa, 0xfb, 0x1a, 0xf7, 0xfd, 0x42,
+                                                              0xa, 0xe, 0x64, 0xa, 0xe7, 0xf7, 0x1a, 0x1,
+                                                              0xf7, 0x2c, 0x8e, 0xa, 0x3, 0x29, 0xa, 0x96,
+                                                              0x9a, 0x9e, 0x94, 0xa5, 0x2d, 0xa, 0xfb, 0x1a,
+                                                              0xf8, 0x45, 0x2e, 0xa, 0x3a, 0xa, 0x79, 0x1d,
+                                                              0xf7, 0x93, 0x77, 0x1, 0x35, 0x1d, 0x55, 0x4b,
+                                                              0x4a, 0x70, 0x7b, 0x7e, 0x93, 0x93, 0x7e, 0x1e,
+                                                              0x94, 0x7c, 0x7c, 0x95, 0x77, 0x38, 0x1d, 0x6f,
+                                                              0x96, 0x7e, 0x97, 0x82, 0x1e, 0x9a, 0x7f, 0x9c,
+                                                              0x85, 0x72, 0x7a, 0xa, 0x5b, 0xf8, 0x27, 0x26,
+                                                              0xa, 0x87, 0x1d, 0xf7, 0x81, 0x77, 0x59, 0x1d,
+                                                              0x74, 0x6b, 0x43, 0x44, 0xfb, 0x86, 0x4f, 0x1d,
+                                                              0x5a, 0x1f, 0x88, 0x8e, 0xea, 0xf7, 0xe8, 0x44,
+                                                              0x77, 0x1d, 0x1a, 0x7e, 0xfb, 0xe, 0xfc, 0x5e,
+                                                              0x4c, 0xfb, 0x88, 0x1e, 0x4d, 0x7b, 0x75, 0x87,
+                                                              0xa, 0x77, 0xa9, 0xab, 0xa1, 0x9e, 0xc7, 0x93,
+                                                              0xac, 0x1f, 0xe, 0xfb, 0x6e, 0xfb, 0x61, 0xf7,
+                                                              0x7, 0xf7, 0x65, 0x77, 0xf7, 0xff, 0x77, 0xda,
+                                                              0xf7, 0x1a, 0x12, 0xeb, 0x8e, 0xa, 0xfb, 0x2,
+                                                              0xcb, 0x13, 0xfa, 0x45, 0xa, 0x94, 0x94, 0x7d,
+                                                              0x1e, 0x94, 0x7d, 0x7e, 0x93, 0x78, 0x38, 0x1d,
+                                                              0x6c, 0x98, 0x7e, 0x98, 0x82, 0x1e, 0x99, 0x81,
+                                                              0x9a, 0x84, 0x74, 0x7a, 0xa, 0xfb, 0x27, 0xf8,
+                                                              0x6f, 0x2e, 0xa, 0x13, 0xfc, 0x3a, 0xa, 0x66,
+                                                              0x1d, 0xf8, 0x6b, 0x3c, 0x1d, 0xe, 0x53, 0x1d,
+                                                              0x56, 0x7d, 0x96, 0x9c, 0x94, 0x8e, 0x97, 0x8f,
+                                                              0x98, 0x1f, 0xbd, 0xf7, 0x4d, 0xf7, 0x28, 0xde,
+                                                              0xa0, 0xd1, 0xfb, 0x2a, 0x3a, 0xc7, 0xf7, 0x67,
+                                                              0x9c, 0xc7, 0xa7, 0x94, 0xc3, 0x8e, 0x82, 0xa,
+                                                              0xba, 0x84, 0xa3, 0x79, 0x74, 0x1a, 0x83, 0x8b,
+                                                              0x83, 0x89, 0x83, 0x1e, 0x3e, 0xfb, 0xa8, 0x27,
+                                                              0x56, 0x75, 0x45, 0xf3, 0xc3, 0x69, 0xfb, 0xe,
+                                                              0x7b, 0x52, 0x76, 0x8c, 0x60, 0x85, 0x19, 0xe,
+                                                              0x66, 0x1d, 0xf9, 0x58, 0x77, 0x1, 0xf7, 0x66,
+                                                              0xf7, 0x21, 0x15, 0x71, 0x88, 0x52, 0x56, 0x8f,
+                                                              0xa, 0x90, 0x94, 0x9f, 0x9b, 0xc5, 0x91, 0xa1,
+                                                              0x1f, 0xc4, 0xf7, 0x61, 0xe1, 0xba, 0x9e, 0xcf,
+                                                              0x35, 0x5c, 0xd0, 0xf7, 0x8e, 0x7f, 0xa, 0x8d,
+                                                              0xac, 0x8b, 0x6c, 0x1a, 0x76, 0x6f, 0x28, 0x71,
+                                                              0x2f, 0x1e, 0x3d, 0x60, 0x78, 0x45, 0xd8, 0xb6,
+                                                              0x5, 0x65, 0xfb, 0x1d, 0x6d, 0xfb, 0x1, 0x70,
+                                                              0x1a, 0x7d, 0x85, 0x56, 0xcf, 0xdb, 0xbd, 0xd0,
+                                                              0xce, 0xb7, 0x1e, 0xe, 0xf7, 0xae, 0x83, 0xab,
+                                                              0x73, 0xab, 0xf7, 0xc4, 0xad, 0xf7, 0x9f, 0xab,
+                                                              0x73, 0xab, 0x12, 0xa2, 0xf7, 0x21, 0x13, 0xb4,
+                                                              0xf8, 0xe1, 0xf7, 0xe4, 0x15, 0xde, 0x8a, 0xba,
+                                                              0x80, 0x48, 0x1a, 0x83, 0x88, 0x6b, 0x8a, 0x7d,
+                                                              0x1e, 0xa6, 0x86, 0xd3, 0xf7, 0xa4, 0x70, 0x8e,
+                                                              0x72, 0x54, 0x71, 0x5a, 0xfb, 0x1e, 0x8c, 0x19,
+                                                              0xc8, 0xf7, 0x70, 0x5, 0xac, 0x94, 0x8f, 0x99,
+                                                              0xb0, 0x1b, 0xf7, 0x44, 0x81, 0x30, 0x4d, 0x1f,
+                                                              0xa4, 0x85, 0xb9, 0xf7, 0x53, 0x5, 0xfb, 0xe3,
+                                                              0x6, 0x78, 0x6d, 0x8d, 0x8d, 0x71, 0x1f, 0x13,
+                                                              0xac, 0x8d, 0x70, 0x73, 0x8d, 0x82, 0x1b, 0xfb,
+                                                              0x24, 0xfb, 0xc9, 0xfb, 0x6, 0xfb, 0xe0, 0xfb,
+                                                              0xc, 0xeb, 0xfb, 0xb, 0xf7, 0x3c, 0x1f, 0xf7,
+                                                              0x35, 0x92, 0x5, 0x13, 0x74, 0xd5, 0x8c, 0x5,
+                                                              0xf7, 0xbc, 0x6, 0xc7, 0xf7, 0x56, 0x70, 0x90,
+                                                              0x5, 0x46, 0x67, 0x40, 0x29, 0xfb, 0x14, 0x1b,
+                                                              0x4c, 0x70, 0x8e, 0xa9, 0x92, 0x8c, 0x94, 0x8d,
+                                                              0x95, 0x1f, 0xfb, 0x19, 0xab, 0x15, 0x13, 0xac,
+                                                              0x4e, 0x7a, 0x73, 0x65, 0x4b, 0x1b, 0xfb, 0x4,
+                                                              0x80, 0xf2, 0xab, 0xf7, 0xe, 0xdf, 0xf7, 0xff,
+                                                              0xf7, 0x50, 0x8c, 0x1f, 0x9e, 0xc4, 0x8b, 0x4b,
+                                                              0x74, 0x81, 0x67, 0x89, 0x83, 0x1f, 0xe, 0xc7,
+                                                              0x7e, 0xa8, 0x6e, 0xca, 0xf8, 0x13, 0xa8, 0x12,
+                                                              0x91, 0xf7, 0x9, 0x13, 0x70, 0xf8, 0x39, 0xf7,
+                                                              0x6e, 0x15, 0xf7, 0x6a, 0xd2, 0xaf, 0x8b, 0xa3,
+                                                              0x1b, 0x9e, 0x9a, 0x7c, 0x70, 0x89, 0x8b, 0xfb,
+                                                              0x17, 0xfb, 0x39, 0x64, 0x1f, 0x20, 0xfb, 0x42,
+                                                              0x15, 0x5c, 0xb3, 0xb8, 0x81, 0xa7, 0x1b, 0xe6,
+                                                              0xc5, 0xbd, 0xe2, 0xb6, 0x1f, 0x6f, 0x9a, 0x5,
+                                                              0x58, 0x6a, 0x70, 0x65, 0x4f, 0x1b, 0x60, 0x75,
+                                                              0xb8, 0xbc, 0x98, 0x8e, 0x99, 0x90, 0x98, 0x1f,
+                                                              0xf1, 0xa2, 0xf7, 0x32, 0xb3, 0xf7, 0xd, 0x1a,
+                                                              0xd5, 0x50, 0x9f, 0x54, 0x49, 0x60, 0x69, 0x6f,
+                                                              0x68, 0x1e, 0xa4, 0x7a, 0x70, 0xb0, 0x42, 0x1b,
+                                                              0xfb, 0x49, 0xfb, 0x4, 0xfb, 0x5c, 0x22, 0xfb,
+                                                              0x39, 0xf7, 0x19, 0x86, 0xa5, 0xaf, 0xd0, 0x96,
+                                                              0xb9, 0xb7, 0x1f, 0xfb, 0x53, 0xc7, 0x15, 0xea,
+                                                              0xca, 0xf7, 0x1e, 0x8a, 0x87, 0x1e, 0xb9, 0x9f,
+                                                              0xa6, 0xc1, 0xbb, 0x1b, 0xc3, 0x8c, 0x56, 0x76,
+                                                              0x1f, 0x13, 0xb0, 0x56, 0x51, 0xfb, 0xb6, 0x28,
+                                                              0x5d, 0x80, 0xb1, 0xbd, 0x1e, 0xe, 0x21, 0x79,
+                                                              0xad, 0xf9, 0xe, 0xae, 0x87, 0x77, 0xf7, 0x80,
+                                                              0x85, 0x1d, 0x13, 0xdc, 0x8d, 0x79, 0x15, 0xa9,
+                                                              0x6, 0xa2, 0x95, 0x90, 0x97, 0xa4, 0x1b, 0x9c,
+                                                              0xa3, 0x7e, 0x81, 0xad, 0x1f, 0x84, 0xa1, 0xa6,
+                                                              0x86, 0xa9, 0x1b, 0xf7, 0x2f, 0xe2, 0xdb, 0xf7,
+                                                              0x18, 0xd9, 0x4d, 0xc8, 0x4d, 0xc2, 0x1f, 0x4e,
+                                                              0xc2, 0x4f, 0xbb, 0xbf, 0x1a, 0x96, 0x83, 0xeb,
+                                                              0xf1, 0xf7, 0x6, 0xa1, 0xfb, 0x2, 0x53, 0x91,
+                                                              0x1e, 0xa6, 0x87, 0x5, 0x13, 0xbc, 0xb3, 0xf7,
+                                                              0x5d, 0x5, 0x6d, 0x6, 0x71, 0x7f, 0x6f, 0x8b,
+                                                              0x87, 0x1b, 0x7b, 0x76, 0x93, 0x93, 0x73, 0x1f,
+                                                              0x13, 0xdc, 0x92, 0x75, 0x72, 0x92, 0x70, 0x1b,
+                                                              0xfb, 0x1a, 0x3a, 0x2b, 0x26, 0x3e, 0xc2, 0x57,
+                                                              0xc5, 0x5b, 0x1f, 0xcb, 0x56, 0xcf, 0x5b, 0x47,
+                                                              0x1a, 0x77, 0x82, 0x21, 0xfb, 0x4, 0x61, 0xfb,
+                                                              0x8, 0x9b, 0xf7, 0x40, 0x8a, 0x1e, 0x6e, 0x8d,
+                                                              0x5, 0xf7, 0x94, 0xf8, 0x99, 0x15, 0xdd, 0x6,
+                                                              0xf7, 0x2a, 0xf7, 0x42, 0x5, 0x53, 0x6, 0xfb,
+                                                              0xf, 0x78, 0x1d, 0xfb, 0xa5, 0x93, 0x76, 0xf8,
+                                                              0x4e, 0xac, 0x8a, 0x77, 0xf7, 0x8d, 0x77, 0x12,
+                                                              0xf7, 0x40, 0xf6, 0x13, 0xd8, 0x85, 0xa, 0x98,
+                                                              0x96, 0x85, 0x85, 0x9a, 0x1f, 0x87, 0x97, 0x99,
+                                                              0x87, 0x9e, 0x1b, 0xcb, 0xe9, 0xb0, 0xec, 0xba,
+                                                              0x6e, 0xb7, 0x6c, 0xb3, 0x1f, 0x66, 0xba, 0x63,
+                                                              0xb5, 0xad, 0x1a, 0x90, 0x85, 0xbc, 0xc0, 0xc6,
+                                                              0xa6, 0x46, 0x59, 0x93, 0x1e, 0xa6, 0x89, 0x5,
+                                                              0x13, 0xb8, 0x79, 0xa, 0x7a, 0x82, 0x90, 0x91,
+                                                              0x7f, 0x1f, 0x13, 0xd8, 0x90, 0x80, 0x7d, 0x91,
+                                                              0x73, 0x1b, 0x4a, 0x3e, 0x67, 0x32, 0x4e, 0xaa,
+                                                              0x65, 0xbc, 0x4c, 0x1f, 0xa4, 0x6b, 0x9f, 0x5e,
+                                                              0x69, 0x1a, 0x70, 0x7d, 0x77, 0x66, 0x82, 0x48,
+                                                              0x7c, 0xa, 0xf7, 0x6a, 0xf8, 0xa5, 0x60, 0x1d,
+                                                              0x58, 0x8b, 0xa4, 0xf8, 0xff, 0xa4, 0xc5, 0xf7,
+                                                              0x1b, 0x1, 0xf7, 0x74, 0xf7, 0x1b, 0xd8, 0xf7,
+                                                              0x1b, 0x3, 0xd4, 0x16, 0xf7, 0xd6, 0xa4, 0x6,
+                                                              0x64, 0x67, 0x95, 0xac, 0x93, 0x8d, 0x95, 0x8f,
+                                                              0x96, 0x1f, 0xbf, 0xf7, 0x67, 0xf7, 0x52, 0xf7,
+                                                              0x9f, 0x90, 0x1d, 0xb6, 0x93, 0x19, 0xa4, 0xfb,
+                                                              0x64, 0x72, 0x7, 0xbc, 0x89, 0x9f, 0x7c, 0x74,
+                                                              0x1a, 0x79, 0x80, 0x74, 0x7a, 0x72, 0x1e, 0xfb,
+                                                              0x15, 0xfb, 0x4e, 0x5, 0x4b, 0xf7, 0x5c, 0x7e,
+                                                              0x96, 0xa7, 0x1a, 0xa2, 0x97, 0xa9, 0xc5, 0x1e,
+                                                              0xa4, 0xfb, 0xaf, 0x72, 0x7, 0xbb, 0x84, 0x92,
+                                                              0x94, 0x9d, 0x54, 0xe3, 0xfb, 0xaa, 0x18, 0x4f,
+                                                              0xfb, 0x6c, 0x79, 0x4b, 0x72, 0x88, 0x51, 0x86,
+                                                              0x19, 0xf7, 0x2b, 0xf9, 0x95, 0x46, 0x1d, 0x58,
+                                                              0x58, 0xa, 0xf7, 0x78, 0x77, 0x3e, 0xa, 0xf7,
+                                                              0xd1, 0xf9, 0x40, 0x60, 0xa, 0xfb, 0xa5, 0x52,
+                                                              0x76, 0xf8, 0x43, 0xeb, 0xf7, 0x85, 0x77, 0x1,
+                                                              0x72, 0x75, 0x15, 0xa7, 0xb1, 0x92, 0x8a, 0x9a,
+                                                              0x1b, 0xa5, 0xa4, 0x78, 0x78, 0xa8, 0x1f, 0x75,
+                                                              0xac, 0xb2, 0x74, 0xbf, 0x76, 0xa, 0x7e, 0x8f,
+                                                              0x82, 0x8f, 0x85, 0x1f, 0x90, 0x83, 0x92, 0x86,
+                                                              0x83, 0x1a, 0x84, 0x83, 0x83, 0x7e, 0x71, 0x81,
+                                                              0xa2, 0xa8, 0x7c, 0x1e, 0x7a, 0xad, 0x73, 0xb5,
+                                                              0x4c, 0xa4, 0x80, 0xa, 0xfb, 0x2e, 0x70, 0x1d,
+                                                              0xfb, 0xf6, 0x5, 0xf7, 0x73, 0xf8, 0x99, 0x60,
+                                                              0xa, 0xfb, 0x30, 0xf7, 0x27, 0xf8, 0x29, 0xb7,
+                                                              0xf7, 0xb, 0xf7, 0x28, 0x6d, 0xa9, 0x12, 0xf8,
+                                                              0x3c, 0xf7, 0x5, 0x13, 0xd8, 0xd9, 0xf8, 0x20,
+                                                              0x15, 0xf4, 0x6, 0x3f, 0xfc, 0x22, 0x8f, 0x3d,
+                                                              0x55, 0x69, 0x8, 0x85, 0x82, 0x77, 0x85, 0x7c,
+                                                              0x1b, 0x81, 0x83, 0x8f, 0x94, 0x91, 0x94, 0x93,
+                                                              0x93, 0x96, 0x1f, 0x91, 0x93, 0x90, 0x95, 0x96,
+                                                              0x1a, 0x9c, 0x7e, 0xac, 0x64, 0x5c, 0x80, 0x62,
+                                                              0x7d, 0x48, 0xc0, 0x72, 0xc3, 0xf7, 0x7, 0xef,
+                                                              0xe5, 0xf7, 0xc8, 0xc1, 0x1e, 0xa6, 0xf7, 0x2e,
+                                                              0x5, 0xf7, 0x8, 0x6, 0x94, 0xb7, 0x5, 0xfb,
+                                                              0xa, 0x6, 0xf7, 0x1f, 0xa2, 0x9b, 0xed, 0xcc,
+                                                              0x1b, 0x97, 0x97, 0x86, 0x81, 0x86, 0x86, 0x86,
+                                                              0x85, 0x86, 0x1f, 0x83, 0x83, 0x81, 0x81, 0x77,
+                                                              0x1a, 0x13, 0xe8, 0x66, 0xaa, 0x7e, 0x9d, 0xcb,
+                                                              0x8b, 0xc0, 0x95, 0xba, 0x5c, 0xb1, 0x4f, 0xfb,
+                                                              0x41, 0x64, 0xfb, 0x54, 0x40, 0x72, 0x1e, 0x20,
+                                                              0x6, 0xe, 0x7f, 0x1d, 0xf7, 0x42, 0x77, 0x1,
+                                                              0xb3, 0xf8, 0x98, 0x5b, 0xa, 0xe6, 0xe3, 0x30,
+                                                              0x7e, 0x1d, 0x7f, 0x1d, 0xf7, 0x42, 0x77, 0x1,
+                                                              0xf7, 0x3b, 0xf8, 0x98, 0x60, 0x1d, 0xfb, 0xdd,
+                                                              0xf8, 0x98, 0xd3, 0x43, 0xf7, 0x36, 0x1, 0xd3,
+                                                              0xf9, 0x3a, 0x15, 0xb6, 0x6, 0x57, 0x90, 0xaa,
+                                                              0x65, 0xd3, 0x1b, 0xe5, 0x9e, 0xc3, 0xad, 0x9b,
+                                                              0x1f, 0xb2, 0x6, 0x85, 0x80, 0xfb, 0x30, 0xfb,
+                                                              0x37, 0xfb, 0x1f, 0x89, 0xf7, 0xa, 0xb7, 0x1e,
+                                                              0xe, 0xfb, 0xdd, 0xf8, 0xa1, 0xf7, 0x16, 0x1,
+                                                              0xf7, 0x57, 0xf7, 0x16, 0x3, 0xf7, 0x37, 0xf8,
+                                                              0xe2, 0x15, 0x4b, 0xa, 0xe, 0xfb, 0xdd, 0xf8,
+                                                              0x9d, 0xbc, 0xf7, 0xb, 0xbb, 0x1, 0xf7, 0x6,
+                                                              0xbb, 0xf7, 0x15, 0xbc, 0x3, 0xf7, 0x13, 0xf9,
+                                                              0x3, 0x15, 0x4f, 0xbb, 0x5c, 0xc6, 0xc5, 0xbb,
+                                                              0xbb, 0xc6, 0xc5, 0x5b, 0xbb, 0x51, 0x50, 0x5b,
+                                                              0x5c, 0x5e, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x41,
+                                                              0xd0, 0xf7, 0x28, 0x77, 0x1, 0x63, 0xdf, 0x3,
+                                                              0xa7, 0xb7, 0x15, 0x63, 0x5f, 0x6f, 0x5e, 0x5e,
+                                                              0x1a, 0x46, 0xd2, 0x7d, 0xb3, 0xad, 0xc9, 0xa6,
+                                                              0xbb, 0xa1, 0x1e, 0x71, 0x99, 0x5, 0x81, 0x79,
+                                                              0x7e, 0x81, 0x74, 0x1b, 0x63, 0x72, 0x9d, 0xba,
+                                                              0xa4, 0x98, 0xb2, 0x8f, 0x9e, 0x1f, 0xe, 0xfb,
+                                                              0xdd, 0xf8, 0xb2, 0xf6, 0x30, 0x76, 0xa6, 0x76,
+                                                              0xb0, 0xd6, 0x41, 0xcf, 0x12, 0x13, 0x30, 0x87,
+                                                              0xf8, 0xb3, 0x15, 0xaf, 0x6, 0x13, 0x48, 0x9c,
+                                                              0x92, 0x93, 0xa0, 0xa9, 0x1b, 0xa5, 0xa1, 0x82,
+                                                              0x81, 0x9f, 0x1f, 0x13, 0x80, 0x81, 0xa0, 0xa0,
+                                                              0x81, 0xa5, 0x1b, 0xd9, 0x9f, 0xd6, 0xab, 0x93,
+                                                              0x1f, 0x66, 0x6, 0x7a, 0x83, 0x82, 0x76, 0x6c,
+                                                              0x1b, 0x7e, 0x74, 0x95, 0x95, 0x72, 0x1f, 0x94,
+                                                              0x74, 0x72, 0x94, 0x73, 0x1b, 0x13, 0x30, 0x33,
+                                                              0x7a, 0x23, 0x89, 0x1f, 0xe, 0xfb, 0xdd, 0xf8,
+                                                              0x98, 0xf7, 0x49, 0x1, 0xd0, 0xf8, 0x98, 0x15,
+                                                              0xbb, 0x6, 0xf7, 0x2d, 0x21, 0x1d, 0xd0, 0xfb,
+                                                              0x17, 0x15, 0xba, 0x5a, 0xa, 0xf7, 0x46, 0xc7,
+                                                              0x4f, 0xe6, 0x1, 0x80, 0xf7, 0x46, 0x15, 0xf8,
+                                                              0x55, 0xc7, 0xfc, 0x55, 0x6, 0xe, 0xf7, 0xe6,
+                                                              0xf7, 0x46, 0xc8, 0x4e, 0xe6, 0x1, 0xf7, 0x46,
+                                                              0x4, 0xfa, 0x53, 0xc8, 0xfe, 0x53, 0x6, 0xe,
+                                                              0xfb, 0xdd, 0x69, 0x1d, 0xf7, 0x14, 0xe1, 0x35,
+                                                              0xf7, 0x30, 0x13, 0xe0, 0xf7, 0xe0, 0xf9, 0x29,
+                                                              0x15, 0x5c, 0xa, 0xc6, 0x7b, 0xa6, 0x1e, 0x13,
+                                                              0xd0, 0xb4, 0xa8, 0xab, 0xb5, 0xa9, 0x7c, 0x9a,
+                                                              0x7a, 0x97, 0x1f, 0x13, 0xe0, 0x79, 0x98, 0x77,
+                                                              0x94, 0xa1, 0x7a, 0x1d, 0xe, 0xfb, 0xdd, 0x69,
+                                                              0x1d, 0xf7, 0x26, 0x6d, 0x1d, 0x13, 0xd0, 0xf7,
+                                                              0x3, 0xf8, 0x5, 0x15, 0x49, 0xa, 0x13, 0xe0,
+                                                              0x62, 0x6e, 0x6b, 0x61, 0x6b, 0x9c, 0x7d, 0x9c,
+                                                              0x7f, 0x1f, 0x13, 0xd0, 0x9d, 0x7f, 0x9d, 0x81,
+                                                              0x89, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x35, 0x62,
+                                                              0xa, 0xb6, 0x6d, 0x1d, 0x13, 0xd0, 0x86, 0xfb,
+                                                              0x32, 0x15, 0x98, 0x73, 0x5, 0x49, 0xa, 0x13,
+                                                              0xe0, 0x62, 0x6e, 0x6b, 0x61, 0x6f, 0x98, 0x7c,
+                                                              0x9a, 0x80, 0x1f, 0x13, 0xd0, 0x9e, 0x7c, 0xa2,
+                                                              0x83, 0x73, 0x54, 0xa, 0xe, 0x69, 0x1d, 0xc0,
+                                                              0xe1, 0x35, 0xf7, 0x30, 0xef, 0xe1, 0x35, 0xf7,
+                                                              0x30, 0x13, 0xd8, 0xf7, 0x95, 0xf9, 0x29, 0x15,
+                                                              0x63, 0xa, 0xab, 0x79, 0x9a, 0x7a, 0x97, 0x1e,
+                                                              0x13, 0xe4, 0x79, 0x97, 0x7a, 0x94, 0xa0, 0x7a,
+                                                              0x1d, 0xf7, 0x94, 0x16, 0x63, 0xa, 0xa8, 0x7c,
+                                                              0x9a, 0x7b, 0x97, 0x1e, 0x13, 0xe8, 0x78, 0x99,
+                                                              0x77, 0x93, 0xa2, 0x7a, 0x1d, 0xe, 0x69, 0x1d,
+                                                              0xf0, 0x6d, 0x1d, 0xef, 0x6d, 0x1d, 0x13, 0xe4,
+                                                              0xf7, 0xd6, 0xf8, 0x5, 0x15, 0x40, 0xa, 0x6d,
+                                                              0x61, 0x6c, 0x9c, 0x7b, 0x9c, 0x7f, 0x1f, 0x13,
+                                                              0xd4, 0x9d, 0x7e, 0x9d, 0x81, 0x89, 0xa, 0xfb,
+                                                              0x87, 0x73, 0x15, 0x40, 0xa, 0x6d, 0x61, 0x6d,
+                                                              0x9a, 0x7c, 0x9b, 0x7f, 0x1f, 0x13, 0xd8, 0x9e,
+                                                              0x7d, 0x9f, 0x81, 0x75, 0x54, 0xa, 0xe, 0xfb,
+                                                              0x35, 0x62, 0xa, 0x82, 0x6d, 0x1d, 0xef, 0x6d,
+                                                              0x1d, 0x13, 0xe4, 0xf7, 0x5b, 0xfb, 0x32, 0x15,
+                                                              0x98, 0x73, 0x5, 0x40, 0xa, 0x6c, 0x61, 0x6a,
+                                                              0x9d, 0x7c, 0x9d, 0x7f, 0x1f, 0x13, 0xd4, 0x9c,
+                                                              0x7f, 0x9c, 0x82, 0x89, 0xa, 0xfb, 0x94, 0x16,
+                                                              0x98, 0x73, 0x5, 0x40, 0xa, 0x6c, 0x61, 0x6c,
+                                                              0x9b, 0x7c, 0x9c, 0x7f, 0x1f, 0x13, 0xd8, 0x9d,
+                                                              0x7e, 0x9e, 0x82, 0x75, 0x54, 0xa, 0xe, 0xfb,
+                                                              0x10, 0x76, 0xf8, 0xb7, 0xf3, 0x4c, 0xa3, 0xf7,
+                                                              0x6e, 0x77, 0x12, 0x13, 0xb0, 0xf7, 0x30, 0xfb,
+                                                              0x25, 0x15, 0xa2, 0x6, 0xb1, 0xf7, 0x1e, 0xb0,
+                                                              0xf7, 0x4d, 0xd0, 0xe6, 0x8, 0x81, 0x99, 0x7b,
+                                                              0xce, 0xbe, 0x1a, 0x9b, 0x8d, 0x9a, 0x8f, 0x96,
+                                                              0x1e, 0xa9, 0x8d, 0xa1, 0x84, 0x9d, 0x82, 0x8,
+                                                              0x13, 0xd0, 0x7f, 0xa2, 0x9d, 0x7c, 0xa2, 0x1b,
+                                                              0x95, 0xba, 0x90, 0xba, 0x90, 0x8b, 0xba, 0x54,
+                                                              0x73, 0x7a, 0x7e, 0x80, 0x73, 0x1f, 0x13, 0xb0,
+                                                              0x83, 0x7a, 0x77, 0x84, 0x6e, 0x1b, 0x8f, 0x9d,
+                                                              0x91, 0xac, 0x9e, 0xa2, 0x8, 0xa6, 0xad, 0x9f,
+                                                              0xa5, 0xa9, 0x1a, 0x9d, 0x80, 0xaf, 0x5d, 0x69,
+                                                              0x76, 0x73, 0x68, 0x6c, 0x96, 0x6f, 0x91, 0x71,
+                                                              0x1e, 0x90, 0x72, 0x8a, 0x73, 0x80, 0x72, 0x6a,
+                                                              0x8a, 0x75, 0x94, 0x78, 0x94, 0x8, 0x13, 0xd0,
+                                                              0x96, 0x76, 0x79, 0x96, 0x70, 0x1b, 0x81, 0x62,
+                                                              0x89, 0x57, 0x72, 0x9e, 0x74, 0xaa, 0xab, 0x9c,
+                                                              0x97, 0x96, 0x9f, 0x1f, 0x13, 0xb0, 0x9c, 0x94,
+                                                              0x9f, 0x93, 0xaa, 0x8a, 0x88, 0x67, 0x6c, 0x38,
+                                                              0x56, 0x5f, 0x95, 0xfb, 0xa, 0x18, 0xe, 0xfb,
+                                                              0x57, 0x76, 0xf7, 0x57, 0xf4, 0xf7, 0xb9, 0xf4,
+                                                              0xf7, 0x57, 0x77, 0x1, 0xd9, 0xf7, 0x12, 0xaf,
+                                                              0x9f, 0xaf, 0xf7, 0x12, 0x14, 0xe, 0xf7, 0x4a,
+                                                              0xa1, 0x15, 0x73, 0x40, 0x3b, 0x59, 0x51, 0x1a,
+                                                              0x6c, 0xa1, 0x73, 0xaa, 0xb9, 0xa6, 0xb8, 0xb5,
+                                                              0x1e, 0xad, 0x80, 0xac, 0xad, 0x1a, 0x9c, 0x8f,
+                                                              0x9c, 0x8e, 0x9b, 0x1e, 0x8a, 0xc1, 0xb8, 0x61,
+                                                              0xc0, 0x1b, 0xa9, 0xa1, 0xa2, 0xa8, 0xaa, 0x71,
+                                                              0xa1, 0x6e, 0x1f, 0x8c, 0x6c, 0x50, 0x5e, 0x58,
+                                                              0x1b, 0x9c, 0xbe, 0xab, 0xa3, 0xbb, 0xa0, 0x8,
+                                                              0x70, 0x9e, 0x79, 0xa1, 0xae, 0x1a, 0xc2, 0xb7,
+                                                              0xa7, 0xb6, 0x9e, 0x1e, 0x74, 0xa0, 0x7b, 0x9c,
+                                                              0xad, 0x1a, 0x97, 0x8d, 0x96, 0x8e, 0x97, 0x1e,
+                                                              0xb4, 0xcd, 0x58, 0x92, 0xad, 0x1f, 0xac, 0xa0,
+                                                              0x9e, 0xad, 0xac, 0x70, 0x9e, 0x6b, 0x5d, 0x67,
+                                                              0x5f, 0x8c, 0x5a, 0x1f, 0xa3, 0xd6, 0xdb, 0xbd,
+                                                              0xc5, 0x1a, 0xaa, 0x75, 0xa3, 0x6c, 0x5d, 0x70,
+                                                              0x5e, 0x61, 0x1e, 0x69, 0x96, 0x6a, 0x69, 0x1a,
+                                                              0x7a, 0x87, 0x7a, 0x88, 0x7b, 0x1e, 0x8c, 0x55,
+                                                              0x5e, 0xb5, 0x56, 0x1b, 0x6d, 0x75, 0x74, 0x6e,
+                                                              0x6c, 0xa5, 0x75, 0xa8, 0x1f, 0x8a, 0xaa, 0xc6,
+                                                              0xb8, 0xbe, 0x1b, 0x7a, 0x58, 0x6b, 0x73, 0x5b,
+                                                              0x76, 0x8, 0xa6, 0x78, 0x9d, 0x75, 0x68, 0x1a,
+                                                              0x54, 0x5f, 0x6f, 0x60, 0x78, 0x1e, 0xa2, 0x76,
+                                                              0x9b, 0x7a, 0x69, 0x1a, 0x7f, 0x89, 0x80, 0x88,
+                                                              0x7f, 0x1e, 0x62, 0x49, 0xbe, 0x84, 0x69, 0x1f,
+                                                              0x6a, 0x76, 0x78, 0x69, 0x6a, 0xa6, 0x78, 0xab,
+                                                              0xb9, 0xaf, 0xb7, 0x8a, 0xbc, 0x1f, 0xe, 0xfb,
+                                                              0xcc, 0xf7, 0x58, 0x76, 0xf7, 0xc4, 0x77, 0xcd,
+                                                              0x77, 0x1, 0xac, 0xf7, 0xe6, 0x15, 0x3c, 0xcb,
+                                                              0x4c, 0xd9, 0xd9, 0xca, 0xc9, 0xd9, 0xd9, 0x4a,
+                                                              0xcc, 0x3d, 0x3c, 0x4e, 0x4c, 0x3d, 0x1e, 0xe,
+                                                              0xf7, 0xe6, 0x7e, 0xf7, 0x28, 0x1, 0xb3, 0xf7,
+                                                              0x2a, 0xf7, 0x49, 0xf7, 0x2a, 0xf7, 0x49, 0xf7,
+                                                              0x2a, 0x14, 0x70, 0xb3, 0xc8, 0x15, 0x62, 0xab,
+                                                              0x7d, 0x1d, 0x6a, 0x69, 0x63, 0x1e, 0xf7, 0xdf,
+                                                              0x16, 0x62, 0xab, 0x7d, 0x1d, 0x6a, 0x69, 0x63,
+                                                              0x1e, 0xf7, 0xdf, 0x16, 0x62, 0xa9, 0x6a, 0xb7,
+                                                              0xb4, 0xae, 0xab, 0xb5, 0xb4, 0x68, 0x53, 0xa,
+                                                              0xf7, 0xe6, 0x7d, 0xa5, 0x85, 0x76, 0xf7, 0xe1,
+                                                              0xa5, 0xf7, 0xc6, 0xa5, 0x8c, 0x77, 0x12, 0x13,
+                                                              0xb0, 0xf7, 0xe6, 0xf7, 0x8, 0x2b, 0x1d, 0xf7,
+                                                              0x74, 0x33, 0x2b, 0x1d, 0xfd, 0x69, 0xf7, 0x88,
+                                                              0x2b, 0x1d, 0x13, 0x68, 0xfb, 0x30, 0xfc, 0xbb,
+                                                              0x15, 0xc7, 0x6, 0xf8, 0xe9, 0xf9, 0x48, 0x5,
+                                                              0x4f, 0x6, 0xe, 0xfb, 0xdd, 0x72, 0x1d, 0xab,
+                                                              0xf7, 0x6d, 0x71, 0x1d, 0x80, 0x95, 0x96, 0x8a,
+                                                              0x1d, 0x42, 0x8d, 0xa, 0xe2, 0x5f, 0xa, 0xe,
+                                                              0xfb, 0xdd, 0x72, 0x1d, 0xf7, 0x30, 0x49, 0x1d,
+                                                              0x96, 0x82, 0x7f, 0x93, 0x83, 0x1b, 0x86, 0x87,
+                                                              0x87, 0x7f, 0x1f, 0xe, 0xfc, 0x83, 0x92, 0x76,
+                                                              0xf9, 0x4d, 0x77, 0x1, 0xfb, 0x1, 0x7d, 0x15,
+                                                              0xf8, 0x45, 0xf9, 0x4b, 0x5, 0x8d, 0x4f, 0x7,
+                                                              0xfc, 0x45, 0xfd, 0x4d, 0x5, 0xe, 0x90, 0x8b,
+                                                              0xba, 0xf7, 0x60, 0xb4, 0xef, 0xb4, 0xf7, 0x69,
+                                                              0xb0, 0x1, 0xf7, 0x4, 0xf7, 0x26, 0xf7, 0xa7,
+                                                              0xae, 0x3, 0xb3, 0xf7, 0x8f, 0x15, 0xfb, 0x41,
+                                                              0xf7, 0x1a, 0x3d, 0xf7, 0x4, 0xf7, 0xb, 0xf7,
+                                                              0x16, 0xbb, 0xde, 0xc5, 0x1e, 0x6d, 0xa1, 0x5,
+                                                              0x53, 0x63, 0xfb, 0x2, 0x59, 0x57, 0x1b, 0xfb,
+                                                              0xe, 0x55, 0xc3, 0xf7, 0x28, 0x8c, 0x1f, 0xf7,
+                                                              0xbd, 0x6, 0x97, 0xb4, 0x5, 0xfb, 0xc5, 0x6,
+                                                              0xa5, 0x96, 0xb9, 0x94, 0xa7, 0x1e, 0xf7, 0xc1,
+                                                              0x6, 0x99, 0xb4, 0x5, 0xfb, 0xc2, 0x6, 0xd5,
+                                                              0x97, 0xe3, 0xf7, 0x1f, 0xf1, 0x1b, 0xf7, 0x6,
+                                                              0x91, 0x51, 0x2e, 0x1f, 0xae, 0xf7, 0x22, 0x6,
+                                                              0x9e, 0x63, 0x79, 0xa6, 0x2c, 0x1b, 0x52, 0xfb,
+                                                              0x77, 0x55, 0xfb, 0x58, 0x49, 0x1f, 0xfb, 0x17,
+                                                              0x6, 0x7e, 0x62, 0x5, 0xf7, 0x14, 0x6, 0x83,
+                                                              0x6e, 0x83, 0x61, 0x89, 0x6e, 0x8, 0x2a, 0x6,
+                                                              0x7e, 0x62, 0x5, 0xe, 0xf7, 0xe6, 0xf7, 0x9d,
+                                                              0xa0, 0x89, 0x76, 0xf8, 0x14, 0xa1, 0x12, 0xf7,
+                                                              0x3c, 0xd9, 0xf7, 0x8d, 0xa6, 0xf7, 0xcc, 0xd9,
+                                                              0x13, 0xbc, 0xf7, 0xa, 0xf7, 0x9d, 0x15, 0xf7,
+                                                              0x46, 0xa0, 0x6, 0x58, 0x90, 0x8c, 0x8c, 0xb9,
+                                                              0x1a, 0xf7, 0xc9, 0xbc, 0x7, 0xb3, 0x9d, 0x6d,
+                                                              0x67, 0x93, 0x1f, 0xa0, 0xe3, 0xfb, 0xf2, 0x33,
+                                                              0xa0, 0x6, 0xaf, 0x93, 0x9d, 0xa9, 0xb3, 0x1b,
+                                                              0xbc, 0xfb, 0xc9, 0x6, 0x5d, 0x8c, 0x8a, 0x58,
+                                                              0x86, 0x1e, 0xf7, 0xd9, 0x76, 0x15, 0xf7, 0x17,
+                                                              0xa0, 0x6, 0x5e, 0x8f, 0x84, 0x8c, 0xba, 0x1a,
+                                                              0xf7, 0x77, 0x8d, 0x7, 0x13, 0x7c, 0xf7, 0x26,
+                                                              0xfb, 0xc2, 0x5, 0x96, 0x6, 0xf7, 0x2b, 0xf7,
+                                                              0xc4, 0x5, 0x8d, 0xfb, 0x79, 0x6, 0x13, 0xbc,
+                                                              0x5d, 0x8d, 0x8a, 0x57, 0x86, 0x1e, 0x76, 0xf7,
+                                                              0x46, 0xa0, 0x7, 0x58, 0x90, 0x8c, 0x8c, 0xb9,
+                                                              0x1a, 0xf7, 0x95, 0x7, 0xad, 0x96, 0x9f, 0xb8,
+                                                              0x1e, 0x9f, 0xfb, 0x1, 0x7, 0xfb, 0x31, 0xfb,
+                                                              0xc2, 0xfb, 0x2a, 0xf7, 0xc2, 0x5, 0xfb, 0x13,
+                                                              0x77, 0x6, 0xa8, 0xa7, 0x76, 0x6c, 0x98, 0x1f,
+                                                              0xfb, 0x97, 0x7, 0x5c, 0x84, 0x8a, 0x5e, 0x87,
+                                                              0x1e, 0xe, 0x53, 0xf7, 0x65, 0xc9, 0x4d, 0xe3,
+                                                              0x1, 0xbe, 0xf7, 0x65, 0x15, 0xf8, 0x8c, 0xc9,
+                                                              0xfc, 0x8c, 0x6, 0xe, 0x21, 0xfb, 0x61, 0xad,
+                                                              0xf7, 0x4b, 0x76, 0xf8, 0x34, 0xb5, 0xf1, 0xf7,
+                                                              0x2c, 0x6d, 0xa9, 0x12, 0x13, 0xe8, 0x9c, 0xf8,
+                                                              0x2b, 0x15, 0xd6, 0x6, 0x2f, 0xfc, 0x2f, 0x5,
+                                                              0xfb, 0x19, 0x6d, 0x7e, 0x69, 0x5d, 0x1b, 0x79,
+                                                              0x8b, 0x91, 0x8e, 0x93, 0x92, 0x8e, 0x90, 0x92,
+                                                              0x1f, 0x8f, 0x90, 0x8e, 0x91, 0x96, 0x1a, 0xa9,
+                                                              0x73, 0x9e, 0x6e, 0x80, 0x67, 0x84, 0x59, 0x60,
+                                                              0xb6, 0x6b, 0xc2, 0xed, 0xdf, 0xf7, 0x13, 0xd5,
+                                                              0x9c, 0x1e, 0xf1, 0xf8, 0x2f, 0x5, 0xf7, 0x2a,
+                                                              0x6, 0x46, 0xfb, 0xa1, 0x5, 0x85, 0x74, 0x86,
+                                                              0x6f, 0x71, 0x1a, 0x65, 0x9b, 0x6b, 0xbc, 0xcc,
+                                                              0xb5, 0xb3, 0xeb, 0xc8, 0x1e, 0x75, 0x98, 0x5,
+                                                              0x7f, 0x83, 0x5f, 0x48, 0x74, 0x1b, 0x80, 0x87,
+                                                              0x94, 0x99, 0xa8, 0x9b, 0xbc, 0x8e, 0x99, 0x1f,
+                                                              0xd4, 0xf7, 0xaf, 0x5, 0x8a, 0x76, 0xfb, 0x1,
+                                                              0x82, 0x72, 0x1b, 0xfb, 0xa, 0x6, 0xf7, 0x23,
+                                                              0xb1, 0xaa, 0xdc, 0xee, 0x1b, 0xa4, 0x8b, 0x7f,
+                                                              0x86, 0x84, 0x82, 0x85, 0x85, 0x80, 0x1f, 0x87,
+                                                              0x84, 0x88, 0x83, 0x7f, 0x1a, 0x13, 0xf0, 0x71,
+                                                              0xa0, 0x6f, 0xb0, 0xa8, 0xa7, 0x9f, 0xb0, 0xc8,
+                                                              0x48, 0xad, 0x47, 0xfb, 0x4a, 0x5c, 0xfb, 0x1d,
+                                                              0xfb, 0x9, 0x63, 0x1e, 0x3f, 0x6, 0xe, 0x21,
+                                                              0xfb, 0x61, 0xae, 0xf7, 0x4a, 0x76, 0xf8, 0x34,
+                                                              0xb5, 0xf7, 0x76, 0xa8, 0x1, 0x9f, 0xf8, 0x2b,
+                                                              0x15, 0xd5, 0x6, 0x2f, 0xfc, 0x26, 0x5, 0xfb,
+                                                              0x3, 0x72, 0x7c, 0x4b, 0x61, 0x1b, 0x7a, 0x85,
+                                                              0x91, 0x91, 0x91, 0x90, 0x90, 0x8f, 0x92, 0x1f,
+                                                              0x8f, 0x91, 0x8e, 0x91, 0x96, 0x1a, 0xa5, 0x79,
+                                                              0x9f, 0x6f, 0x85, 0x5c, 0x8b, 0x57, 0x41, 0xd7,
+                                                              0x83, 0x9d, 0xf3, 0xd1, 0xba, 0xf7, 0x37, 0xab,
+                                                              0x1e, 0xee, 0xf8, 0x26, 0x5, 0xf7, 0x27, 0x6,
+                                                              0x3c, 0xfb, 0xd5, 0x5, 0x89, 0x81, 0x89, 0x80,
+                                                              0x81, 0x1a, 0x68, 0x9c, 0x6e, 0xc1, 0xd7, 0xb5,
+                                                              0xcc, 0xd1, 0xb8, 0x1e, 0x77, 0x96, 0x5, 0x7a,
+                                                              0x80, 0x64, 0x51, 0x72, 0x1b, 0x7d, 0x87, 0x93,
+                                                              0x95, 0x91, 0x8d, 0x92, 0x8d, 0x91, 0x1f, 0xf7,
+                                                              0x2b, 0xf8, 0xee, 0x28, 0x7f, 0x5, 0x87, 0x50,
+                                                              0x9a, 0x6c, 0x1b, 0xfb, 0x45, 0x61, 0xfb, 0x1d,
+                                                              0xfb, 0xa, 0x66, 0x1f, 0x41, 0x6, 0xf7, 0x53,
+                                                              0x16, 0xe3, 0xa0, 0xab, 0xf7, 0x1e, 0xe9, 0x1b,
+                                                              0xa2, 0x96, 0x7e, 0x85, 0x87, 0x84, 0x84, 0x85,
+                                                              0x81, 0x1f, 0x87, 0x84, 0x87, 0x82, 0x81, 0x1a,
+                                                              0x73, 0x98, 0x80, 0x93, 0x85, 0x1e, 0x6d, 0xfb,
+                                                              0xb, 0x5, 0xe, 0x79, 0x9d, 0xf8, 0x54, 0x99,
+                                                              0xf7, 0x63, 0x9b, 0x98, 0x91, 0x6, 0xfb, 0x62,
+                                                              0x8d, 0xf7, 0x60, 0x8b, 0xf7, 0x9c, 0x94, 0x7,
+                                                              0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xb4,
+                                                              0xa, 0xf7, 0xc, 0xb, 0x8c, 0xc, 0xe, 0xf8,
+                                                              0x88, 0x14, 0xf9, 0x2a, 0x15, 0xb7, 0x13, 0x0,
+                                                              0x71, 0x2, 0x0, 0x1, 0x0, 0x29, 0x0, 0x2f,
+                                                              0x0, 0x3b, 0x0, 0x58, 0x0, 0x61, 0x0, 0x9b,
+                                                              0x0, 0x9e, 0x0, 0xab, 0x0, 0xb6, 0x0, 0xc3,
+                                                              0x0, 0xd6, 0x0, 0xda, 0x0, 0xea, 0x0, 0xfb,
+                                                              0x0, 0xff, 0x1, 0x6, 0x1, 0x10, 0x1, 0x28,
+                                                              0x1, 0x2e, 0x1, 0x58, 0x1, 0x62, 0x1, 0x76,
+                                                              0x1, 0x89, 0x1, 0x96, 0x1, 0xa8, 0x1, 0xb5,
+                                                              0x1, 0xb9, 0x1, 0xf3, 0x1, 0xfd, 0x2, 0xd,
+                                                              0x2, 0x41, 0x2, 0x4a, 0x2, 0x51, 0x2, 0x5d,
+                                                              0x2, 0x65, 0x2, 0x73, 0x2, 0x7d, 0x2, 0x86,
+                                                              0x2, 0x92, 0x2, 0x9e, 0x2, 0xc4, 0x2, 0xcd,
+                                                              0x2, 0xe0, 0x2, 0xf2, 0x2, 0xfb, 0x3, 0x3,
+                                                              0x3, 0x9, 0x3, 0x28, 0x3, 0x32, 0x3, 0x3c,
+                                                              0x3, 0x58, 0x3, 0x60, 0x3, 0x68, 0x3, 0x6d,
+                                                              0x3, 0x74, 0x3, 0x7b, 0x3, 0x81, 0x3, 0x9a,
+                                                              0x3, 0x9d, 0x3, 0xa3, 0x3, 0xb0, 0x3, 0xc6,
+                                                              0x3, 0xdc, 0x3, 0xea, 0x3, 0xee, 0x3, 0xf4,
+                                                              0x3, 0xfa, 0x4, 0x4, 0x4, 0xb, 0x4, 0x12,
+                                                              0x4, 0x24, 0x4, 0x32, 0x4, 0x37, 0x4, 0x48,
+                                                              0x4, 0x53, 0x4, 0x62, 0x4, 0x6c, 0x4, 0x70,
+                                                              0x4, 0x76, 0x4, 0x7a, 0x4, 0x83, 0x4, 0x8b,
+                                                              0x4, 0x92, 0x4, 0x97, 0x4, 0x9c, 0x4, 0xa1,
+                                                              0x4, 0xaf, 0x4, 0xbd, 0x4, 0xc8, 0x4, 0xd5,
+                                                              0x4, 0xdd, 0x4, 0xe1, 0x4, 0xed, 0x4, 0xf9,
+                                                              0x4, 0xff, 0x5, 0x9, 0x5, 0x14, 0x5, 0x1d,
+                                                              0x5, 0x24, 0x5, 0x29, 0x5, 0x33, 0x5, 0x3d,
+                                                              0x5, 0x47, 0x5, 0x51, 0x5, 0x5a, 0x5, 0x5e,
+                                                              0x5, 0x67, 0x5, 0x6d, 0x5, 0x73, 0x5, 0x79,
+                                                              0x5, 0x7f, 0x5, 0x83, 0x5, 0x87, 0x50, 0x1d,
+                                                              0xf4, 0xc2, 0x1a, 0xd3, 0x47, 0x9d, 0x68, 0xfb,
+                                                              0x37, 0xfb, 0x13, 0xfb, 0x4b, 0xfb, 0x1c, 0xfb,
+                                                              0x4, 0xdf, 0x5f, 0x35, 0xa, 0x98, 0xda, 0x9e,
+                                                              0x8d, 0x8d, 0x3d, 0xa, 0x72, 0x82, 0x57, 0x70,
+                                                              0x2d, 0xfb, 0x17, 0x68, 0x1f, 0xb, 0x6, 0xf7,
+                                                              0x2c, 0x21, 0x1d, 0xb, 0x77, 0x1, 0x90, 0xf7,
+                                                              0x16, 0xf7, 0x3f, 0xe7, 0x3, 0x20, 0xa, 0xb,
+                                                              0xf7, 0x8, 0xe3, 0x90, 0xa, 0xf7, 0xab, 0x7b,
+                                                              0x1d, 0x7b, 0x59, 0x40, 0x51, 0xfb, 0xa6, 0x36,
+                                                              0xa, 0xf7, 0x3c, 0xf7, 0x29, 0xf7, 0x1a, 0xfb,
+                                                              0xb, 0xa1, 0x4b, 0x1d, 0xb, 0x32, 0x1d, 0x8c,
+                                                              0xa9, 0x8a, 0x6b, 0x34, 0x1d, 0xb, 0x77, 0x1,
+                                                              0x4d, 0xa, 0x3, 0xf7, 0x3f, 0xf7, 0x2c, 0x15,
+                                                              0xe7, 0xe2, 0xf8, 0x29, 0xf7, 0x4c, 0xf3, 0x8c,
+                                                              0x21, 0x76, 0xfb, 0x8, 0x2d, 0xfc, 0x1a, 0xfb,
+                                                              0x46, 0x50, 0x5e, 0xaf, 0x55, 0x1d, 0xd2, 0xfb,
+                                                              0x16, 0xf7, 0x3b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7,
+                                                              0x9c, 0xf7, 0x56, 0xf7, 0x42, 0xfb, 0x19, 0xd0,
+                                                              0x5d, 0x1d, 0xfb, 0x79, 0xfb, 0x89, 0x1e, 0xb,
+                                                              0x22, 0x1d, 0xe, 0xa4, 0x87, 0x80, 0xb6, 0x4f,
+                                                              0x1b, 0xfb, 0xe, 0xfb, 0x29, 0x2f, 0x1d, 0xb,
+                                                              0xf7, 0x8c, 0xf7, 0x6, 0x15, 0x8d, 0x8c, 0x5,
+                                                              0x2e, 0x1d, 0xb, 0x2c, 0x1d, 0x54, 0x4d, 0x8f,
+                                                              0xa, 0x91, 0x98, 0x31, 0xa, 0x79, 0x86, 0xb,
+                                                              0x4c, 0xa, 0x60, 0x3a, 0x7c, 0x71, 0xfb, 0x27,
+                                                              0x8c, 0x19, 0x65, 0xa, 0x93, 0x73, 0x1d, 0x8b,
+                                                              0x31, 0x1d, 0xb, 0x16, 0x20, 0x1d, 0xb, 0x57,
+                                                              0xa, 0x4e, 0x90, 0x7c, 0x8f, 0x39, 0x1d, 0x65,
+                                                              0x50, 0x7b, 0x97, 0x6e, 0x82, 0x19, 0xb, 0x91,
+                                                              0x9f, 0x1f, 0x44, 0x1d, 0x89, 0xa1, 0x8a, 0x71,
+                                                              0x51, 0x40, 0xfb, 0x4a, 0x46, 0x47, 0xa, 0xb,
+                                                              0x15, 0x20, 0x1d, 0xb, 0x68, 0x1d, 0xf7, 0x7f,
+                                                              0x22, 0xa, 0xb, 0xcc, 0xdb, 0xf7, 0x84, 0xdf,
+                                                              0x94, 0xa7, 0x39, 0xa, 0xb, 0xab, 0xde, 0xf7,
+                                                              0xa1, 0x9f, 0xd1, 0x1f, 0xfb, 0xa, 0x6, 0x6c,
+                                                              0x20, 0x74, 0x3c, 0x5e, 0x3a, 0x8, 0x73, 0x7e,
+                                                              0x4e, 0x2c, 0x63, 0x1b, 0xb, 0x87, 0x8f, 0x95,
+                                                              0x24, 0xa, 0xb, 0x15, 0xf7, 0x58, 0xae, 0x6,
+                                                              0x60, 0x75, 0x98, 0xa1, 0x92, 0x8c, 0x93, 0x8f,
+                                                              0x91, 0x48, 0x1d, 0x9a, 0x20, 0x8b, 0x95, 0x77,
+                                                              0x1a, 0x5a, 0x69, 0x84, 0x5e, 0x57, 0xa, 0x4d,
+                                                              0x91, 0x7d, 0x8e, 0x39, 0x1d, 0x67, 0x50, 0x78,
+                                                              0x95, 0x6f, 0x84, 0x6b, 0x1d, 0x77, 0x74, 0xa,
+                                                              0x13, 0x6c, 0x28, 0xa, 0x13, 0x9c, 0xb, 0xcd,
+                                                              0xf7, 0x0, 0xbf, 0xe2, 0xbe, 0xaa, 0x1e, 0x6e,
+                                                              0x9c, 0x5, 0x66, 0x72, 0x67, 0x55, 0x55, 0x1b,
+                                                              0x77, 0x5c, 0xb, 0x2b, 0x57, 0x8b, 0xbf, 0x9f,
+                                                              0x1e, 0xfb, 0xb, 0xbd, 0x15, 0x2b, 0xd9, 0x54,
+                                                              0xdd, 0xf7, 0x34, 0xf7, 0x10, 0xb, 0x77, 0x1,
+                                                              0x88, 0xf7, 0xb, 0xf7, 0x62, 0xf7, 0xb, 0x3,
+                                                              0x23, 0xa, 0xb, 0x35, 0x1a, 0xfb, 0xc, 0xf7,
+                                                              0x4, 0x57, 0xf6, 0xf7, 0x65, 0xb4, 0xf7, 0x22,
+                                                              0xf7, 0x1f, 0xb3, 0x1e, 0xb, 0x84, 0x61, 0x41,
+                                                              0x45, 0xfb, 0x83, 0x34, 0x7d, 0x6d, 0x96, 0xb9,
+                                                              0x1e, 0xb, 0xf7, 0x64, 0x2d, 0x1d, 0x15, 0xf7,
+                                                              0xa, 0xd7, 0xf7, 0x12, 0xf6, 0xd1, 0x5f, 0xc0,
+                                                              0x42, 0xfb, 0x8, 0x40, 0xfb, 0xc, 0x20, 0x44,
+                                                              0xb0, 0x51, 0xd8, 0x1f, 0x8e, 0xa5, 0x15, 0x72,
+                                                              0x83, 0x9c, 0xa1, 0xab, 0xa5, 0xe4, 0x95, 0xae,
+                                                              0x1f, 0xad, 0x95, 0x9b, 0xd6, 0xb8, 0x1b, 0xa0,
+                                                              0x97, 0x7b, 0x76, 0x65, 0x70, 0x36, 0x7f, 0x63,
+                                                              0x1f, 0x68, 0x81, 0x7f, 0x46, 0x5d, 0x1b, 0xb,
+                                                              0x15, 0x62, 0xa9, 0x7d, 0x1d, 0x6c, 0x69, 0x63,
+                                                              0x1e, 0xe, 0x8f, 0x9d, 0x1f, 0x92, 0xab, 0x15,
+                                                              0xd4, 0x9b, 0xbe, 0xf7, 0x22, 0xc9, 0x1b, 0xa8,
+                                                              0x8b, 0xb, 0x1, 0x80, 0x16, 0xf8, 0x8e, 0x6,
+                                                              0xc6, 0xf7, 0x56, 0x70, 0x90, 0x5, 0xfb, 0x18,
+                                                              0x4d, 0xfb, 0x1c, 0x6b, 0x24, 0x1b, 0x45, 0x6,
+                                                              0xf8, 0x46, 0xf8, 0xe7, 0x5, 0xb2, 0xfc, 0x68,
+                                                              0x7, 0x52, 0xfb, 0x46, 0xa7, 0x87, 0x5, 0xcd,
+                                                              0xba, 0xc8, 0xdc, 0xf7, 0x24, 0x1b, 0xd9, 0x6,
+                                                              0xfc, 0x46, 0xfc, 0xe7, 0x5, 0xb, 0x48, 0x1d,
+                                                              0x9b, 0x21, 0x8a, 0x94, 0x77, 0x1a, 0xb, 0x49,
+                                                              0xa, 0x13, 0xe8, 0x62, 0x6e, 0xb, 0x1f, 0xf7,
+                                                              0x14, 0xf8, 0x5b, 0x9c, 0xca, 0xa6, 0x8f, 0x56,
+                                                              0x1d, 0xb, 0x5b, 0xa, 0xe8, 0xe3, 0x2e, 0x3b,
+                                                              0x1d, 0xb, 0x6b, 0x1a, 0xfb, 0x19, 0xfc, 0x79,
+                                                              0x7a, 0x4d, 0x74, 0x88, 0x63, 0x84, 0x19, 0xb,
+                                                              0xaf, 0x9f, 0xcc, 0x99, 0xba, 0x1f, 0xd2, 0xf7,
+                                                              0x80, 0xb, 0x35, 0x1d, 0x53, 0x4b, 0x4c, 0x70,
+                                                              0x79, 0x7d, 0xb, 0x41, 0xa, 0xc7, 0x9a, 0x7e,
+                                                              0x79, 0x7f, 0x86, 0x7d, 0x47, 0x1d, 0xe, 0x1a,
+                                                              0x74, 0x8b, 0x54, 0xd8, 0xd7, 0xb5, 0xc5, 0xf5,
+                                                              0xd7, 0x1e, 0xb, 0xa7, 0xe3, 0x5, 0xb7, 0x6,
+                                                              0x9c, 0xc8, 0x5, 0x5e, 0x6, 0xd9, 0xf7, 0x99,
+                                                              0x5, 0x5d, 0x6, 0xfb, 0xaa, 0xfb, 0x93, 0x5,
+                                                              0xa7, 0x85, 0x15, 0xf7, 0x48, 0xf7, 0x3a, 0x8d,
+                                                              0x89, 0x5, 0x8c, 0x6, 0x58, 0xfb, 0x38, 0x5,
+                                                              0xb, 0x75, 0xa, 0xde, 0x62, 0x1d, 0x9b, 0x70,
+                                                              0x1e, 0xb, 0xa0, 0x1e, 0xbd, 0xaf, 0xdc, 0xc7,
+                                                              0xbd, 0xaf, 0x8, 0x94, 0x7, 0x55, 0xc2, 0x52,
+                                                              0xc5, 0x5a, 0xc0, 0x8, 0xb, 0x67, 0xa8, 0x6e,
+                                                              0xaf, 0xaf, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, 0xa8,
+                                                              0x67, 0x67, 0x6e, 0x6e, 0x67, 0x1e, 0xb, 0x1f,
+                                                              0xa7, 0x86, 0xd5, 0xf7, 0xa5, 0x6f, 0x8f, 0xb,
+                                                              0xa6, 0xf7, 0x24, 0xf8, 0xc, 0xf7, 0x24, 0xb,
+                                                              0xf7, 0x42, 0x5, 0x3a, 0x6, 0xb, 0x1a, 0xd8,
+                                                              0x57, 0x8d, 0x73, 0x34, 0x55, 0x38, 0x21, 0x43,
+                                                              0x1e, 0x88, 0x8d, 0xc7, 0xf7, 0x4e, 0x5, 0x79,
+                                                              0x3c, 0x28, 0x82, 0x75, 0x1b, 0x70, 0x7, 0xa6,
+                                                              0xa6, 0x8b, 0x71, 0x1f, 0xb, 0x15, 0xb3, 0x6,
+                                                              0x9e, 0x93, 0x94, 0xa3, 0xac, 0x1b, 0xb, 0x90,
+                                                              0x8b, 0xab, 0xf7, 0xc6, 0xab, 0xf7, 0x9f, 0xab,
+                                                              0xb, 0xc4, 0x1a, 0xba, 0x65, 0xc0, 0x47, 0x36,
+                                                              0x60, 0x4d, 0x67, 0x79, 0x1e, 0x9d, 0x80, 0x5,
+                                                              0x94, 0x94, 0xa5, 0xb2, 0xba, 0x1b, 0xc6, 0x8b,
+                                                              0x52, 0x7f, 0x67, 0x6a, 0xb, 0xac, 0x62, 0x60,
+                                                              0x6c, 0x69, 0x63, 0x1e, 0xe, 0x1a, 0x53, 0x28,
+                                                              0x58, 0x78, 0x81, 0x1e, 0xb, 0xbd, 0x96, 0x57,
+                                                              0x1d, 0xb, 0x90, 0x8b, 0xae, 0xf7, 0x41, 0xb3,
+                                                              0xb, 0x1e, 0x68, 0xf7, 0xc4, 0xae, 0x7, 0xb,
+                                                              0x8b, 0xae, 0xf8, 0xeb, 0xae, 0xb, 0xf7, 0x95,
+                                                              0xfc, 0xb9, 0x5, 0xa7, 0x6, 0xf7, 0x23, 0xf8,
+                                                              0x8e, 0xb2, 0xf7, 0x1e, 0x95, 0x83, 0xc0, 0x98,
+                                                              0x19, 0xae, 0xfb, 0x65, 0x68, 0x7, 0xb, 0x21,
+                                                              0xa, 0xe, 0x15, 0xc4, 0x6, 0xf7, 0x17, 0xb,
+                                                              0x7e, 0xa3, 0x5, 0x7c, 0x87, 0xfb, 0x44, 0x38,
+                                                              0xfb, 0x19, 0x1a, 0x3b, 0xb, 0xf7, 0x3b, 0x1a,
+                                                              0xf7, 0x48, 0xfb, 0x6, 0xed, 0xfb, 0x4f, 0x1e,
+                                                              0xfb, 0xb6, 0x68, 0x6, 0xc9, 0x82, 0x96, 0x89,
+                                                              0x6a, 0x1a, 0xb, 0x50, 0x1e, 0xbb, 0x16, 0xab,
+                                                              0xa5, 0xa5, 0xab, 0xab, 0xa5, 0x71, 0x6b, 0x6b,
+                                                              0x71, 0x71, 0x6b, 0x6b, 0x71, 0xa5, 0xab, 0x1e,
+                                                              0xb, 0xdc, 0xaf, 0x1a, 0x94, 0x87, 0x8e, 0x86,
+                                                              0x79, 0x61, 0x61, 0x7c, 0x6c, 0xa, 0xb, 0x4c,
+                                                              0x1d, 0x78, 0x1d, 0xae, 0xfb, 0xbe, 0x68, 0x7,
+                                                              0xb, 0x76, 0xf7, 0xd0, 0x77, 0x12, 0xb, 0x5c,
+                                                              0xa, 0xc3, 0x7b, 0xa6, 0xb4, 0xab, 0xab, 0xb5,
+                                                              0xb, 0x21, 0x82, 0xd3, 0xf8, 0x16, 0x77, 0xb,
+                                                              0xc8, 0xf7, 0x73, 0x5, 0xa7, 0x93, 0xb, 0x6f,
+                                                              0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7, 0xa7,
+                                                              0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f, 0x1e,
+                                                              0xb, 0x66, 0xa8, 0x6e, 0xb0, 0xb0, 0xa9, 0xa8,
+                                                              0x36, 0x1d, 0x6e, 0x6d, 0x66, 0x1e, 0xb, 0xfb,
+                                                              0xa5, 0x58, 0xa, 0xb, 0x9e, 0x9c, 0x9e, 0xa2,
+                                                              0xb4, 0x1b, 0xb3, 0x98, 0x6e, 0x74, 0x4c, 0x2f,
+                                                              0x7a, 0x6e, 0x86, 0x1f, 0xb, 0xf7, 0x52, 0xf7,
+                                                              0x95, 0x90, 0x1d, 0xb6, 0x93, 0x57, 0x1d, 0xb,
+                                                              0x7c, 0x59, 0xfb, 0x2c, 0x67, 0xfb, 0x6, 0x1f,
+                                                              0x65, 0x7b, 0x68, 0x8a, 0x73, 0x1b, 0xe, 0x76,
+                                                              0x1e, 0x59, 0x67, 0x3a, 0x4f, 0x59, 0x67, 0x8,
+                                                              0xb, 0x19, 0x70, 0x7, 0xb, 0xa8, 0xf7, 0x81,
+                                                              0x5c, 0x1d, 0xb, 0x5, 0x89, 0x6, 0xb, 0x15,
+                                                              0x50, 0x49, 0x34, 0x3a, 0x67, 0x1a, 0x82, 0xb,
+                                                              0x6f, 0x80, 0x60, 0x62, 0x77, 0x88, 0x1d, 0xb,
+                                                              0xc7, 0x79, 0xc3, 0xf8, 0xe8, 0xae, 0xb, 0xf7,
+                                                              0x7f, 0x77, 0x1, 0xb, 0x12, 0x76, 0xf7, 0xf,
+                                                              0xb, 0x9a, 0x8f, 0xf7, 0x44, 0xb, 0x1b, 0xd7,
+                                                              0xaa, 0xc3, 0xac, 0xb4, 0x67, 0x98, 0x79, 0x6f,
+                                                              0x76, 0x70, 0x74, 0xb, 0x91, 0xa0, 0x1f, 0xfb,
+                                                              0x80, 0xfb, 0x12, 0x15, 0xf7, 0xb2, 0x6, 0xf7,
+                                                              0xd2, 0xb, 0x85, 0x83, 0xa, 0xf7, 0xe8, 0xe3,
+                                                              0xf0, 0xbd, 0xa4, 0x1b, 0xb, 0xa2, 0xf7, 0x2d,
+                                                              0x5, 0x6e, 0x6, 0x7a, 0x81, 0x88, 0x87, 0x7c,
+                                                              0x1b, 0xb, 0x1a, 0x67, 0x62, 0x3c, 0x5f, 0x36,
+                                                              0x1e, 0xb, 0x15, 0xb8, 0x6, 0xb, 0x8b, 0xf7,
+                                                              0x19, 0x7c, 0x1e, 0x70, 0x8e, 0x75, 0xfb, 0x3a,
+                                                              0x5, 0xb, 0x8d, 0x93, 0x94, 0x8d, 0x99, 0x1b,
+                                                              0xb9, 0x8b, 0x6b, 0x87, 0x71, 0xb, 0x1f, 0xc8,
+                                                              0xf7, 0x7b, 0x5, 0xb, 0x3c, 0x7c, 0x59, 0x83,
+                                                              0x3b, 0x84, 0x6d, 0xa, 0xa9, 0xb, 0xf7, 0xad,
+                                                              0xf7, 0xe3, 0x18, 0x95, 0xfb, 0xcc, 0x7, 0x60,
+                                                              0xb, 0xfb, 0x32, 0x15, 0x98, 0x73, 0x5, 0x75,
+                                                              0xa, 0xb, 0x19, 0xae, 0xfb, 0xd1, 0x68, 0x7,
+                                                              0xb, 0x16, 0xf7, 0xd, 0x6, 0xb, 0xfb, 0xdd,
+                                                              0xfb, 0x32, 0x76, 0xf9, 0xf4, 0x77, 0x1, 0xb,
+                                                              0x93, 0x7e, 0x15, 0x9c, 0x90, 0x9f, 0x8e, 0x8f,
+                                                              0x1b, 0xb, 0x92, 0x95, 0x75, 0x1f, 0x75, 0x6a,
+                                                              0x5, 0x84, 0x9c, 0xb, 0x8b, 0x69, 0x1b, 0x66,
+                                                              0xf7, 0x8d, 0xb0, 0x7, 0x68, 0xb, 0x72, 0x58,
+                                                              0xfb, 0x39, 0x58, 0xfb, 0x53, 0x1e, 0xb, 0x76,
+                                                              0x54, 0xa, 0xb, 0xfb, 0xce, 0xfb, 0x3a, 0x76,
+                                                              0xf9, 0xfd, 0x77, 0xb, 0x1a, 0x87, 0x8a, 0x86,
+                                                              0x8a, 0xb, 0x15, 0xf7, 0x74, 0x9e, 0x6, 0xb,
+                                                              0xf7, 0x40, 0x5, 0xc6, 0xcd, 0xb, 0xf7, 0x1a,
+                                                              0xd5, 0xf7, 0x1a, 0xb, 0x74, 0x88, 0x1d, 0xb,
+                                                              0x15, 0xcb, 0xbd, 0xb
+                                                             };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c
new file mode 100644
index 0000000..26f7784
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c
@@ -0,0 +1,2662 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifItalicFontData [21227] = {0x1,
+                                                          0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x15,
+                                                          0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
+                                                          0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74,
+                                                          0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1,
+                                                          0x2a, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8,
+                                                          0x1d, 0x2, 0xf8, 0x1e, 0x3, 0xf8, 0x18, 0x4,
+                                                          0x1e, 0xe1, 0x5a, 0x4f, 0xc, 0x2, 0xfb, 0x3c,
+                                                          0xfb, 0x8e, 0xfa, 0x71, 0xf9, 0xf8, 0x5, 0xf7,
+                                                          0x3c, 0xf, 0xf8, 0x93, 0x11, 0xb0, 0x1c, 0x46,
+                                                          0xd6, 0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f,
+                                                          0x45, 0x54, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20,
+                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                          0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                          0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x65,
+                                                          0x72, 0x69, 0x66, 0x20, 0x4f, 0x54, 0x46, 0x20,
+                                                          0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68,
+                                                          0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69,
+                                                          0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, 0x1,
+                                                          0x0, 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9,
+                                                          0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0,
+                                                          0x67, 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0,
+                                                          0x0, 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa,
+                                                          0x0, 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0,
+                                                          0x97, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0,
+                                                          0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4,
+                                                          0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0,
+                                                          0x98, 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0,
+                                                          0x0, 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f,
+                                                          0x0, 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0,
+                                                          0x9b, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0,
+                                                          0x0, 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0,
+                                                          0x0, 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0,
+                                                          0x8a, 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0,
+                                                          0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6,
+                                                          0x2, 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0,
+                                                          0xbe, 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0,
+                                                          0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d,
+                                                          0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0,
+                                                          0xc5, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0,
+                                                          0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd,
+                                                          0x0, 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0,
+                                                          0x90, 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0,
+                                                          0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3,
+                                                          0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0,
+                                                          0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0,
+                                                          0x0, 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93,
+                                                          0x0, 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0,
+                                                          0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0,
+                                                          0x0, 0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92,
+                                                          0x0, 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0,
+                                                          0xc0, 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1,
+                                                          0x0, 0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e,
+                                                          0x0, 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0,
+                                                          0x84, 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0,
+                                                          0x0, 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89,
+                                                          0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0,
+                                                          0x75, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0,
+                                                          0x0, 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74,
+                                                          0x0, 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0,
+                                                          0x63, 0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0,
+                                                          0x0, 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6,
+                                                          0x2, 0x0, 0x1, 0x0, 0x3, 0x0, 0x5, 0x0,
+                                                          0x4a, 0x0, 0x82, 0x0, 0xf8, 0x1, 0x8c, 0x1,
+                                                          0xb7, 0x2, 0x73, 0x2, 0xa0, 0x2, 0xd9, 0x3,
+                                                          0x17, 0x3, 0xed, 0x4, 0x1a, 0x4, 0x49, 0x4,
+                                                          0x60, 0x4, 0x6d, 0x4, 0x88, 0x4, 0xcf, 0x5,
+                                                          0x1d, 0x5, 0x70, 0x5, 0xe3, 0x6, 0x2a, 0x6,
+                                                          0x7a, 0x6, 0xd3, 0x6, 0xff, 0x7, 0x7d, 0x7,
+                                                          0xe1, 0x7, 0xfe, 0x8, 0x46, 0x8, 0x71, 0x8,
+                                                          0x95, 0x8, 0xb5, 0x9, 0x2c, 0x9, 0xe6, 0xa,
+                                                          0x2e, 0xa, 0xb6, 0xa, 0xe4, 0xb, 0x2e, 0xb,
+                                                          0x8c, 0xb, 0xf5, 0xc, 0x6e, 0xc, 0xf7, 0xd,
+                                                          0x30, 0xd, 0x87, 0xe, 0xb, 0xe, 0x3a, 0xe,
+                                                          0xb5, 0xf, 0x1f, 0xf, 0x62, 0xf, 0xc8, 0x10,
+                                                          0x4c, 0x10, 0xc6, 0x11, 0x2, 0x11, 0x4d, 0x11,
+                                                          0xa6, 0x11, 0xf6, 0x12, 0x75, 0x12, 0xf6, 0x13,
+                                                          0x4f, 0x13, 0x59, 0x13, 0x85, 0x13, 0xa3, 0x13,
+                                                          0xd2, 0x13, 0xf9, 0x14, 0xa, 0x14, 0x26, 0x14,
+                                                          0x63, 0x14, 0xd3, 0x15, 0x11, 0x15, 0x9e, 0x15,
+                                                          0xea, 0x16, 0x6e, 0x17, 0x1a, 0x17, 0x8e, 0x17,
+                                                          0xc6, 0x18, 0x33, 0x18, 0xa9, 0x18, 0xe1, 0x19,
+                                                          0x85, 0x19, 0xab, 0x19, 0xea, 0x1a, 0x2a, 0x1a,
+                                                          0x95, 0x1a, 0xf1, 0x1b, 0x53, 0x1b, 0xb1, 0x1b,
+                                                          0xef, 0x1c, 0x56, 0x1c, 0xf1, 0x1d, 0x95, 0x1d,
+                                                          0xd7, 0x1e, 0x19, 0x1e, 0x75, 0x1e, 0x8b, 0x1e,
+                                                          0xe9, 0x1f, 0x36, 0x1f, 0x81, 0x1f, 0xf7, 0x20,
+                                                          0x99, 0x21, 0xc, 0x21, 0xa1, 0x21, 0xc0, 0x22,
+                                                          0x97, 0x22, 0xa5, 0x23, 0x4c, 0x23, 0xc3, 0x24,
+                                                          0x4, 0x24, 0x25, 0x25, 0x13, 0x25, 0x2a, 0x25,
+                                                          0x62, 0x25, 0x9a, 0x25, 0xb6, 0x25, 0xfd, 0x26,
+                                                          0x1c, 0x26, 0x98, 0x26, 0xd0, 0x26, 0xdf, 0x27,
+                                                          0x21, 0x27, 0x73, 0x27, 0xb1, 0x27, 0xc4, 0x28,
+                                                          0x1c, 0x28, 0x88, 0x28, 0xd1, 0x29, 0x31, 0x29,
+                                                          0x65, 0x29, 0x8c, 0x29, 0xc3, 0x29, 0xfd, 0x2a,
+                                                          0x29, 0x2a, 0x89, 0x2b, 0x2f, 0x2b, 0x91, 0x2b,
+                                                          0xd0, 0x2b, 0xf3, 0x2c, 0x12, 0x2c, 0x33, 0x2c,
+                                                          0x40, 0x2c, 0x5e, 0x2c, 0x74, 0x2c, 0x89, 0x2c,
+                                                          0xec, 0x2d, 0x85, 0x2d, 0x96, 0x2d, 0xa9, 0x2d,
+                                                          0xc2, 0x2d, 0xfd, 0x2e, 0x1f, 0x2e, 0x61, 0x2e,
+                                                          0xdd, 0x2f, 0x5, 0x2f, 0x1c, 0x2f, 0x2f, 0x2f,
+                                                          0x5c, 0x2f, 0xc8, 0x30, 0x43, 0x30, 0xfb, 0x31,
+                                                          0x9, 0x31, 0x1b, 0x31, 0x35, 0x31, 0x5d, 0x31,
+                                                          0x74, 0x31, 0xbd, 0x32, 0x62, 0x32, 0xd5, 0x32,
+                                                          0xf4, 0x33, 0x2c, 0x33, 0x50, 0x33, 0x73, 0x33,
+                                                          0x92, 0x33, 0xaf, 0x33, 0xbe, 0x33, 0xdb, 0x34,
+                                                          0x4f, 0x34, 0x8b, 0x34, 0xa6, 0x34, 0xc0, 0x34,
+                                                          0xda, 0x35, 0x13, 0x35, 0x33, 0x35, 0x64, 0x35,
+                                                          0xd5, 0x35, 0xf0, 0x35, 0xfe, 0x36, 0x24, 0x36,
+                                                          0x49, 0x36, 0x95, 0x36, 0xe0, 0x37, 0x3e, 0x37,
+                                                          0x54, 0x37, 0x93, 0x37, 0xdd, 0x38, 0x99, 0x39,
+                                                          0x38, 0x39, 0x7d, 0x39, 0xe5, 0x3a, 0x66, 0x3a,
+                                                          0x78, 0x3a, 0xc8, 0x3b, 0x4c, 0x3b, 0x67, 0x3b,
+                                                          0x83, 0x3b, 0xad, 0x3b, 0xbd, 0x3c, 0xf, 0x3c,
+                                                          0x41, 0x3c, 0x5e, 0x3c, 0x7e, 0x3c, 0x92, 0x3c,
+                                                          0xa8, 0x3c, 0xcd, 0x3c, 0xfd, 0x3d, 0x1e, 0x3d,
+                                                          0x60, 0x3d, 0x99, 0x3d, 0xd2, 0x3e, 0x75, 0x3f,
+                                                          0x4e, 0x3f, 0x7a, 0x3f, 0xb5, 0x3f, 0xed, 0x40,
+                                                          0xb, 0x40, 0x27, 0x40, 0x3c, 0x40, 0xba, 0x41,
+                                                          0x60, 0x41, 0x6d, 0x42, 0x36, 0x43, 0x7, 0x20,
+                                                          0xe, 0x20, 0xe, 0x73, 0x8e, 0xf4, 0xf8, 0xc3,
+                                                          0x77, 0x12, 0xb2, 0xf4, 0x17, 0xf7, 0xc, 0xf7,
+                                                          0x49, 0x15, 0x9c, 0x87, 0xc5, 0xf7, 0x32, 0xbe,
+                                                          0xf7, 0x8, 0xb7, 0xf7, 0x10, 0x19, 0x92, 0x9f,
+                                                          0x90, 0x9b, 0x9a, 0x1a, 0xa6, 0x6e, 0x99, 0x7c,
+                                                          0x1e, 0x13, 0xa0, 0x71, 0x77, 0x6d, 0x64, 0x82,
+                                                          0x1f, 0x6f, 0xfb, 0x10, 0x76, 0xfb, 0x18, 0x69,
+                                                          0xfb, 0x35, 0x8, 0x3a, 0xfb, 0x20, 0x15, 0x6e,
+                                                          0xa2, 0x85, 0xa, 0x74, 0x73, 0x6e, 0x1e, 0xe,
+                                                          0xca, 0xf8, 0x4e, 0x76, 0xf7, 0x89, 0x77, 0x1,
+                                                          0xf7, 0x24, 0xa0, 0xf7, 0x32, 0xa0, 0x3, 0xf7,
+                                                          0xd7, 0xf8, 0x39, 0x15, 0xa0, 0x6, 0xa8, 0xd0,
+                                                          0xc6, 0xf6, 0xac, 0x1a, 0x9c, 0x7f, 0x9e, 0x76,
+                                                          0x77, 0x71, 0xbc, 0xa, 0xfb, 0x47, 0x16, 0xa0,
+                                                          0x6, 0xa7, 0xcc, 0xc1, 0xee, 0xbb, 0x1a, 0x9a,
+                                                          0x81, 0x9d, 0x7a, 0x72, 0x76, 0xbc, 0xa, 0xe,
+                                                          0xa0, 0x76, 0xf7, 0x5f, 0xb2, 0x64, 0xc1, 0xf7,
+                                                          0x2d, 0xc1, 0x63, 0xb3, 0xf7, 0x68, 0x77, 0x12,
+                                                          0xe9, 0xf8, 0x64, 0x13, 0xb6, 0x9c, 0x16, 0xb3,
+                                                          0x6, 0xd6, 0xf7, 0x5f, 0x5, 0xf7, 0x42, 0x6,
+                                                          0x40, 0xfb, 0x5f, 0x5, 0xb2, 0x6, 0xd7, 0xf7,
+                                                          0x5f, 0x5, 0xf4, 0x6, 0x13, 0xce, 0x96, 0xb2,
+                                                          0x5, 0x26, 0x6, 0xce, 0xf7, 0x4a, 0x5, 0xf0,
+                                                          0x6, 0x96, 0xb3, 0x5, 0x2b, 0x6, 0xdb, 0xf7,
+                                                          0x68, 0x5, 0x62, 0x6, 0x3b, 0xfb, 0x68, 0x5,
+                                                          0xfb, 0x41, 0x6, 0xda, 0xf7, 0x68, 0x5, 0x66,
+                                                          0x6, 0x3b, 0xfb, 0x68, 0x5, 0x22, 0x6, 0x80,
+                                                          0x63, 0x5, 0xee, 0x6, 0x49, 0xfb, 0x4a, 0x5,
+                                                          0x2b, 0x6, 0x80, 0x64, 0x5, 0xe7, 0x6, 0xc1,
+                                                          0xb2, 0x15, 0xce, 0xf7, 0x4a, 0x5, 0xf7, 0x42,
+                                                          0x6, 0x47, 0xfb, 0x4a, 0x5, 0xe, 0x47, 0x76,
+                                                          0xf5, 0x76, 0xa4, 0x76, 0xf9, 0x15, 0xa6, 0xb9,
+                                                          0x77, 0x12, 0xa2, 0xd9, 0xf7, 0xab, 0xd6, 0x13,
+                                                          0xde, 0xf7, 0xae, 0xf8, 0x38, 0x15, 0x61, 0xa9,
+                                                          0x64, 0xab, 0xc1, 0x1a, 0xd5, 0xc5, 0xaa, 0xd8,
+                                                          0x1e, 0xfb, 0x7, 0xfc, 0xfc, 0x15, 0xcf, 0xf7,
+                                                          0xad, 0x5, 0xc2, 0x5d, 0xaf, 0x6d, 0x48, 0x1a,
+                                                          0xfb, 0x14, 0xfb, 0x14, 0x81, 0x6c, 0x1e, 0xfb,
+                                                          0x52, 0xb5, 0x15, 0x97, 0x80, 0xbf, 0x65, 0xe1,
+                                                          0x7b, 0x75, 0x30, 0x18, 0xae, 0x6, 0x13, 0xbe,
+                                                          0xa0, 0xe4, 0x5, 0x13, 0x5e, 0xf7, 0x56, 0xb9,
+                                                          0xf6, 0xe4, 0xdb, 0x5e, 0xb9, 0x2a, 0xd5, 0x1f,
+                                                          0xc3, 0xf7, 0x81, 0x5, 0xad, 0x7d, 0xbe, 0x76,
+                                                          0x29, 0x1a, 0x9a, 0x89, 0xa7, 0xf7, 0x6, 0x60,
+                                                          0xaa, 0x50, 0x9b, 0x78, 0x8f, 0x19, 0x9b, 0xcf,
+                                                          0x5, 0x69, 0x6, 0x7a, 0x4c, 0x5, 0x13, 0x44,
+                                                          0xfb, 0xe, 0x2b, 0x58, 0xfb, 0x0, 0x44, 0xcc,
+                                                          0x4d, 0xd1, 0x5c, 0x1f, 0x46, 0xfb, 0xbd, 0x2a,
+                                                          0xa1, 0x82, 0xcc, 0x82, 0xd5, 0x19, 0x7b, 0x88,
+                                                          0x5, 0xe, 0xf8, 0x70, 0xb0, 0xa, 0xd5, 0xd0,
+                                                          0xa, 0xf7, 0x1e, 0xd0, 0xa, 0x13, 0xb7, 0x80,
+                                                          0xf8, 0x97, 0xf7, 0x9, 0x30, 0xa, 0xfc, 0x8b,
+                                                          0xf8, 0x11, 0x30, 0xa, 0x13, 0x6f, 0x80, 0x54,
+                                                          0xfc, 0x33, 0x15, 0xba, 0x6, 0xf9, 0x48, 0xf9,
+                                                          0x48, 0x5, 0x5c, 0x6, 0xe, 0xf8, 0x39, 0x79,
+                                                          0xbc, 0x5b, 0xbc, 0xf8, 0x1, 0xaa, 0xf7, 0x62,
+                                                          0xab, 0x12, 0xd7, 0xe9, 0xf7, 0x2e, 0xdc, 0xf7,
+                                                          0x4, 0xd0, 0x13, 0x7e, 0xf8, 0x5d, 0xc8, 0x15,
+                                                          0x13, 0xbe, 0x6d, 0xa3, 0xb3, 0x5a, 0xd5, 0x1b,
+                                                          0xbe, 0xb6, 0xa5, 0xb5, 0xad, 0x1f, 0x80, 0x96,
+                                                          0x5, 0x7f, 0x7b, 0x76, 0x79, 0x69, 0x1b, 0x62,
+                                                          0x60, 0xa6, 0xce, 0x66, 0x1f, 0xc2, 0xd2, 0xa8,
+                                                          0xbe, 0x9a, 0x9f, 0x8, 0xb0, 0xa6, 0x9f, 0xa8,
+                                                          0xbc, 0x1b, 0x9c, 0xfb, 0x4d, 0x78, 0x7, 0xaa,
+                                                          0x95, 0x7b, 0x70, 0x61, 0x71, 0x6a, 0x5f, 0x56,
+                                                          0x1f, 0x60, 0xcd, 0x6b, 0xf7, 0xb, 0x7f, 0xbf,
+                                                          0x8, 0xc7, 0xa9, 0xf7, 0x4, 0xc3, 0xe6, 0x1a,
+                                                          0xbb, 0x61, 0xb7, 0x50, 0x30, 0x45, 0x3b, 0xfb,
+                                                          0x11, 0x7e, 0x8c, 0x82, 0x91, 0x4e, 0x1e, 0xfb,
+                                                          0x17, 0x52, 0xfb, 0x10, 0x55, 0xfb, 0x15, 0x1a,
+                                                          0xfb, 0x1a, 0xf7, 0x14, 0x75, 0xbd, 0xdb, 0xb3,
+                                                          0xa5, 0xc0, 0xde, 0x1e, 0x78, 0xa8, 0x15, 0x61,
+                                                          0x5d, 0x52, 0x7d, 0x68, 0x1b, 0x48, 0x4c, 0xba,
+                                                          0xe1, 0xf7, 0x9, 0xf7, 0x36, 0xc8, 0x8c, 0x1f,
+                                                          0x9f, 0x45, 0xb2, 0xfb, 0x13, 0xb9, 0x51, 0x8,
+                                                          0x6f, 0xf7, 0xe6, 0x15, 0x88, 0xa5, 0x89, 0x9c,
+                                                          0xaf, 0x1a, 0xc2, 0x94, 0xd3, 0xc4, 0x9b, 0xa9,
+                                                          0x8b, 0x53, 0x38, 0x5c, 0x6e, 0x4f, 0x65, 0x1e,
+                                                          0xe, 0xfb, 0x23, 0xf8, 0x4e, 0x76, 0xf7, 0x89,
+                                                          0x77, 0x1, 0xf7, 0x18, 0xa0, 0x3, 0xf7, 0x18,
+                                                          0xf8, 0x39, 0x15, 0xa0, 0x6, 0xb4, 0xe3, 0xba,
+                                                          0xe5, 0xa8, 0x1a, 0x9c, 0x80, 0xa0, 0x75, 0x77,
+                                                          0x71, 0x7e, 0x72, 0x84, 0x1e, 0x82, 0x6b, 0x82,
+                                                          0xfb, 0xc, 0x86, 0x54, 0x8, 0xe, 0x73, 0xfb,
+                                                          0x34, 0x76, 0xf9, 0xe6, 0x77, 0x1, 0xb5, 0xd2,
+                                                          0x3, 0xf7, 0x21, 0xfb, 0x49, 0x15, 0x9d, 0x91,
+                                                          0x5, 0x4c, 0xf7, 0x9, 0x9c, 0xf7, 0x53, 0xc4,
+                                                          0x1a, 0xf7, 0x21, 0xeb, 0xf7, 0x7c, 0xf5, 0xe6,
+                                                          0x1e, 0x7e, 0x9a, 0x5, 0xfb, 0x4a, 0xfb, 0x2f,
+                                                          0x3d, 0xfb, 0x30, 0xfb, 0x39, 0x1a, 0x4b, 0x90,
+                                                          0xfb, 0x2a, 0xe9, 0xfb, 0x34, 0x1e, 0xe, 0x73,
+                                                          0xfb, 0x36, 0x76, 0xf9, 0xe8, 0x77, 0x12, 0xf7,
+                                                          0x6d, 0xd3, 0x17, 0x9b, 0xfb, 0x39, 0x15, 0x98,
+                                                          0x7c, 0x5, 0x13, 0x60, 0xf7, 0x28, 0xf7, 0xb,
+                                                          0xf7, 0x4, 0xf7, 0x3a, 0xf7, 0x51, 0x1a, 0xf7,
+                                                          0x16, 0x70, 0xf7, 0x14, 0x43, 0xf7, 0x9, 0x1e,
+                                                          0x78, 0x86, 0xbd, 0x2b, 0x98, 0xfb, 0x1b, 0x7a,
+                                                          0xfb, 0x1f, 0x19, 0x75, 0xfb, 0x47, 0x43, 0xfb,
+                                                          0x4a, 0x20, 0x29, 0x8, 0xe, 0xf7, 0x37, 0xf7,
+                                                          0x9, 0x66, 0x76, 0xf8, 0x10, 0x76, 0xe0, 0x77,
+                                                          0xa6, 0x77, 0x12, 0xf7, 0xc1, 0x9d, 0x13, 0xac,
+                                                          0xf7, 0xc0, 0xf8, 0x52, 0x15, 0x8c, 0x73, 0x8c,
+                                                          0x71, 0x84, 0x73, 0x8, 0x82, 0x6c, 0x7e, 0x6f,
+                                                          0x7c, 0x1a, 0x13, 0x6c, 0x72, 0x9d, 0x79, 0x9d,
+                                                          0x9d, 0x9e, 0x9c, 0xa6, 0x8c, 0x1e, 0x8c, 0xa1,
+                                                          0x7e, 0x99, 0x82, 0xb0, 0x8, 0x87, 0x9d, 0x88,
+                                                          0xa2, 0xac, 0x1a, 0xa2, 0x7e, 0x9c, 0x7e, 0x99,
+                                                          0x7f, 0x8, 0x65, 0xb6, 0x92, 0x6c, 0xab, 0x1b,
+                                                          0x9d, 0x9e, 0x9a, 0xa3, 0xb1, 0x62, 0x87, 0x4c,
+                                                          0x9e, 0x1f, 0x79, 0x90, 0x76, 0x97, 0x76, 0x96,
+                                                          0xa3, 0x9d, 0xa3, 0x94, 0xa0, 0x91, 0x8, 0xc3,
+                                                          0x9c, 0xb2, 0x82, 0xbb, 0x1a, 0x9e, 0x7a, 0x9a,
+                                                          0x78, 0x6f, 0x7b, 0x6f, 0x6f, 0x70, 0x1e, 0x70,
+                                                          0x70, 0x66, 0x71, 0x89, 0x1b, 0xb0, 0x8e, 0xa9,
+                                                          0x90, 0x98, 0x1e, 0x95, 0xa7, 0x94, 0xa1, 0xa0,
+                                                          0x1a, 0x13, 0xb4, 0xa7, 0x7a, 0x99, 0x7a, 0x79,
+                                                          0x78, 0x7b, 0x70, 0x76, 0x95, 0x7a, 0x93, 0x6a,
+                                                          0x1e, 0x8f, 0x78, 0x8f, 0x73, 0x6a, 0x1a, 0x6f,
+                                                          0x9b, 0x78, 0x9a, 0x7c, 0x99, 0x8, 0xae, 0x66,
+                                                          0x83, 0xa4, 0x6b, 0x1b, 0x74, 0x80, 0x77, 0x7d,
+                                                          0x5e, 0xb3, 0x90, 0xc2, 0x7c, 0x1f, 0x9d, 0x86,
+                                                          0x9f, 0x84, 0xac, 0x78, 0x70, 0x79, 0x71, 0x81,
+                                                          0x74, 0x85, 0x8, 0x56, 0x7d, 0x66, 0x8f, 0x5f,
+                                                          0x1a, 0x81, 0x96, 0x74, 0xa3, 0xa8, 0x9c, 0xa7,
+                                                          0xa8, 0xa5, 0x1e, 0xa4, 0xa6, 0xa7, 0x97, 0x97,
+                                                          0x95, 0x8, 0xe, 0xf7, 0xd2, 0xa0, 0x76, 0xf7,
+                                                          0x86, 0xb4, 0xf7, 0x73, 0x77, 0x12, 0xf7, 0xc5,
+                                                          0xcd, 0x53, 0xb5, 0x13, 0xf0, 0xe1, 0xf7, 0x86,
+                                                          0x15, 0x13, 0xe8, 0xf7, 0x79, 0xfb, 0x86, 0xb5,
+                                                          0xf7, 0x86, 0xf7, 0x7d, 0xb4, 0xfb, 0x7d, 0xf7,
+                                                          0x73, 0x61, 0xfb, 0x73, 0xfb, 0x79, 0x6, 0xe,
+                                                          0x20, 0xfb, 0x0, 0x76, 0xf7, 0x7a, 0x77, 0x12,
+                                                          0xa2, 0xc0, 0xa, 0x13, 0xe0, 0x87, 0xfb, 0x4,
+                                                          0x15, 0x94, 0x7a, 0x5, 0xc8, 0xa, 0x83, 0x5e,
+                                                          0x7f, 0x61, 0x75, 0x97, 0x81, 0x97, 0x83, 0x1e,
+                                                          0x13, 0xd0, 0x97, 0x83, 0x97, 0x84, 0x7a, 0x1a,
+                                                          0x66, 0x54, 0x66, 0x77, 0x7e, 0x1e, 0xe, 0x73,
+                                                          0xf7, 0x54, 0xca, 0x1, 0xbc, 0xf7, 0x7d, 0x3,
+                                                          0xbc, 0xf7, 0x54, 0x15, 0xf7, 0x6e, 0x6, 0x9a,
+                                                          0xca, 0x5, 0xfb, 0x6d, 0x6, 0xe, 0x20, 0x80,
+                                                          0xf7, 0x3, 0x1, 0xa6, 0xf7, 0x3, 0x3, 0xa6,
+                                                          0xb7, 0x84, 0xa, 0x3c, 0x8e, 0x76, 0xf9, 0x40,
+                                                          0x77, 0x1, 0x77, 0xf8, 0xb, 0x3, 0x77, 0x79,
+                                                          0x15, 0xf8, 0x2a, 0xf9, 0x40, 0x5, 0x5f, 0x6,
+                                                          0xfc, 0x2b, 0xfd, 0x40, 0x5, 0xe, 0x84, 0xa7,
+                                                          0xf9, 0x7, 0xa7, 0x1, 0xab, 0xda, 0xf7, 0xc7,
+                                                          0xda, 0x3, 0xf7, 0x3, 0xf7, 0x30, 0x15, 0xec,
+                                                          0xd3, 0xf8, 0x1f, 0xf7, 0x29, 0xe1, 0x8b, 0x25,
+                                                          0x6d, 0xfb, 0x43, 0x35, 0xfb, 0xd4, 0xfb, 0x1a,
+                                                          0x6b, 0x54, 0x9e, 0xf7, 0x8, 0x1e, 0x3c, 0xbb,
+                                                          0x15, 0x23, 0xc4, 0x20, 0xf3, 0xf7, 0x3c, 0xf7,
+                                                          0x1c, 0xf7, 0x7c, 0xf7, 0x5a, 0xed, 0x70, 0xf7,
+                                                          0x2f, 0xfb, 0x19, 0xfb, 0x1f, 0xfb, 0x3a, 0xfb,
+                                                          0x5e, 0xfb, 0xa2, 0x1e, 0xe, 0xa0, 0x76, 0xf9,
+                                                          0x38, 0x77, 0x1, 0xbc, 0xf7, 0xf8, 0x3, 0xbc,
+                                                          0x16, 0xf7, 0xab, 0x9a, 0x6, 0x5e, 0x6c, 0x96,
+                                                          0xaf, 0x8f, 0x8b, 0x8f, 0x8c, 0x90, 0x1f, 0xf7,
+                                                          0x2a, 0xf8, 0xc9, 0x5, 0x8e, 0x95, 0x8e, 0x98,
+                                                          0x92, 0x1a, 0x8f, 0x8a, 0x8d, 0x88, 0x83, 0xfb,
+                                                          0x1f, 0x6d, 0x83, 0x5c, 0x1e, 0x7c, 0x7, 0x8c,
+                                                          0xa1, 0x9e, 0x8c, 0x99, 0x1b, 0xa7, 0x97, 0x80,
+                                                          0x76, 0x83, 0x87, 0x7d, 0x88, 0x80, 0x1f, 0xfb,
+                                                          0x1a, 0xfc, 0x76, 0x5, 0x5e, 0x7e, 0x52, 0x79,
+                                                          0x5d, 0x1b, 0xe, 0x8b, 0xd7, 0xf8, 0xa3, 0xd4,
+                                                          0x1, 0xf8, 0x2, 0xe1, 0x3, 0x97, 0x16, 0xf7,
+                                                          0xf7, 0x6, 0xbd, 0xf7, 0x18, 0x7a, 0x92, 0x5,
+                                                          0x67, 0x7a, 0x71, 0x70, 0x49, 0x1b, 0xfb, 0x48,
+                                                          0x90, 0x6, 0xf7, 0x54, 0xf7, 0x54, 0x5, 0xf7,
+                                                          0x10, 0xf7, 0x10, 0xa4, 0xb8, 0xce, 0x1a, 0xd6,
+                                                          0x53, 0xe7, 0x21, 0x72, 0xfb, 0x17, 0x87, 0xfb,
+                                                          0x30, 0x55, 0x1e, 0xa0, 0x84, 0x5, 0xa4, 0x99,
+                                                          0xb1, 0xd0, 0xe5, 0x1b, 0xd8, 0xb9, 0x4f, 0x4d,
+                                                          0x6a, 0x87, 0x51, 0xfb, 0x20, 0xfb, 0x29, 0x1f,
+                                                          0xfb, 0x66, 0xfb, 0x6d, 0x5, 0xe, 0x84, 0xb1,
+                                                          0x65, 0xf7, 0x0, 0xf7, 0x98, 0x9b, 0xf7, 0x95,
+                                                          0xb5, 0x12, 0xf7, 0xee, 0xdb, 0x5b, 0xe2, 0x13,
+                                                          0x98, 0xf7, 0x20, 0xf7, 0xfd, 0x15, 0xec, 0x92,
+                                                          0xe3, 0x66, 0xfb, 0x20, 0x1a, 0xfb, 0x12, 0x2d,
+                                                          0x69, 0x69, 0x6f, 0x76, 0x9c, 0x9c, 0x76, 0x1e,
+                                                          0x13, 0x74, 0x9d, 0x76, 0x76, 0x9d, 0x74, 0x1b,
+                                                          0x66, 0x81, 0x6f, 0x76, 0x5e, 0xc2, 0x7d, 0xc6,
+                                                          0x1f, 0x13, 0x34, 0xf7, 0x4d, 0xe6, 0xf7, 0x22,
+                                                          0xf7, 0x3, 0xf7, 0x2, 0x46, 0xa9, 0x71, 0x97,
+                                                          0x1f, 0x8e, 0x7, 0xf4, 0xb2, 0xbd, 0xae, 0xd7,
+                                                          0x1a, 0xde, 0x43, 0xb5, 0x41, 0x52, 0x40, 0x5f,
+                                                          0x4f, 0x72, 0x1e, 0x9b, 0x86, 0x5, 0x9f, 0x9a,
+                                                          0xae, 0xba, 0xca, 0x1b, 0xb1, 0xbc, 0x73, 0x48,
+                                                          0xfb, 0x0, 0xfb, 0x1f, 0x5f, 0x27, 0x7d, 0x1f,
+                                                          0xe, 0xa0, 0x76, 0xf7, 0x3c, 0xca, 0xf8, 0x51,
+                                                          0x77, 0x12, 0x8c, 0xf8, 0x72, 0x17, 0xcc, 0xf7,
+                                                          0x7b, 0x15, 0x8f, 0x7, 0xf7, 0xc4, 0xf7, 0xdc,
+                                                          0x5, 0x8f, 0x6, 0x13, 0xf0, 0x28, 0xfb, 0xe0,
+                                                          0x5, 0xfb, 0xa5, 0x4c, 0x15, 0xf7, 0x97, 0x6,
+                                                          0x5d, 0xfb, 0x3c, 0x5, 0xda, 0x6, 0xb6, 0xf7,
+                                                          0x3a, 0x5, 0xef, 0x6, 0x99, 0xcc, 0x5, 0x2c,
+                                                          0x6, 0x13, 0x30, 0xf7, 0x10, 0xf8, 0x51, 0x5,
+                                                          0x62, 0x6, 0xfc, 0x35, 0xfc, 0x4d, 0x5, 0xe,
+                                                          0x84, 0xb5, 0xf8, 0xc4, 0xd2, 0x1, 0xf7, 0xf2,
+                                                          0xd0, 0x3, 0xf7, 0x17, 0xf8, 0x3b, 0x15, 0xf7,
+                                                          0x8, 0x72, 0xf2, 0x7f, 0xfb, 0x2d, 0x1a, 0x34,
+                                                          0x42, 0xfb, 0x3, 0x29, 0x6f, 0x77, 0x9a, 0x99,
+                                                          0x78, 0x1e, 0x98, 0x79, 0x7a, 0x98, 0x75, 0x1b,
+                                                          0x78, 0x76, 0x7f, 0x6e, 0x6f, 0xa9, 0x6f, 0xd3,
+                                                          0xf7, 0x57, 0xf6, 0xf7, 0x2e, 0xf7, 0x14, 0xf7,
+                                                          0x1a, 0x31, 0xc9, 0xfb, 0x16, 0xa5, 0x1f, 0xb2,
+                                                          0xed, 0x5, 0xf7, 0x7a, 0x6, 0xa2, 0xd2, 0x5,
+                                                          0xfb, 0x94, 0x6, 0x23, 0xfb, 0x78, 0x5, 0xe,
+                                                          0x84, 0xa5, 0xf8, 0x11, 0xaf, 0xf7, 0x8e, 0x77,
+                                                          0x1, 0xac, 0xd7, 0xf7, 0x9b, 0xe4, 0x3, 0xf7,
+                                                          0x5b, 0xf8, 0x4a, 0x15, 0xbd, 0xa3, 0xf7, 0xe,
+                                                          0xf7, 0x4a, 0xf7, 0x44, 0x1b, 0x8a, 0x9b, 0x5,
+                                                          0xfb, 0xc5, 0xfb, 0x4d, 0xfb, 0xa2, 0xfb, 0x62,
+                                                          0xfb, 0x38, 0xee, 0x56, 0xdc, 0xf7, 0x3e, 0xdc,
+                                                          0xf7, 0x3d, 0xf0, 0xf7, 0x22, 0x26, 0xbf, 0x47,
+                                                          0x6c, 0x6d, 0x83, 0x7e, 0x6f, 0x1f, 0x2a, 0xfb,
+                                                          0xab, 0x15, 0x9b, 0x95, 0xf7, 0x8c, 0xf7, 0x1e,
+                                                          0xd7, 0xb5, 0x51, 0x39, 0x31, 0x55, 0xfb, 0x40,
+                                                          0xfb, 0x6, 0x29, 0x8b, 0xf7, 0x4, 0xa5, 0x1e,
+                                                          0xe, 0x98, 0x76, 0xf8, 0xed, 0xd4, 0x1, 0xd6,
+                                                          0xf8, 0x5c, 0x3, 0xda, 0x83, 0x15, 0xd1, 0x6,
+                                                          0xf8, 0x18, 0xf9, 0x2c, 0x85, 0x95, 0x5, 0xfc,
+                                                          0xb, 0x6, 0x3a, 0xfb, 0x1c, 0x99, 0x82, 0x5,
+                                                          0xb3, 0xad, 0xb0, 0xab, 0xd3, 0x1b, 0xf7, 0x68,
+                                                          0x6, 0x8d, 0x88, 0x5, 0xe, 0x84, 0xa1, 0xf9,
+                                                          0x12, 0xa2, 0x12, 0xa9, 0xcf, 0xb3, 0xd9, 0xf7,
+                                                          0x2d, 0xd6, 0x78, 0xcf, 0x13, 0xf8, 0xf7, 0x75,
+                                                          0xf7, 0xfc, 0x15, 0x73, 0x84, 0xfb, 0x3f, 0x58,
+                                                          0xfb, 0x25, 0x1a, 0x6d, 0xa0, 0xfb, 0x1a, 0xf7,
+                                                          0x47, 0xf7, 0x1a, 0xdb, 0xe1, 0xe1, 0xd9, 0x63,
+                                                          0xcb, 0x40, 0xd6, 0x1e, 0x13, 0xf4, 0xc2, 0x9d,
+                                                          0xf7, 0x1, 0xb1, 0xec, 0x1a, 0xf7, 0x2, 0xfb,
+                                                          0x0, 0xaa, 0x49, 0x2d, 0x34, 0x5a, 0x24, 0x57,
+                                                          0xa5, 0x5c, 0xc8, 0x4a, 0x1e, 0xa1, 0x7b, 0x15,
+                                                          0x13, 0xf8, 0xec, 0x27, 0xa4, 0x6e, 0x4a, 0x1a,
+                                                          0x2b, 0x3d, 0x64, 0x55, 0x35, 0x56, 0xc7, 0xda,
+                                                          0xf7, 0x13, 0xf7, 0xf, 0xc2, 0xa5, 0x93, 0x1e,
+                                                          0xcb, 0xc2, 0x15, 0x2c, 0xe1, 0x8b, 0xaa, 0xa5,
+                                                          0x1a, 0xce, 0xb1, 0xb7, 0xcb, 0x1e, 0x13, 0xf4,
+                                                          0xdc, 0xa5, 0x48, 0x5b, 0x38, 0x50, 0x6d, 0x54,
+                                                          0x71, 0x1f, 0xe, 0x8f, 0x76, 0xf7, 0x93, 0xb9,
+                                                          0xf8, 0x2, 0xa5, 0x1, 0xd0, 0xe3, 0xf7, 0x98,
+                                                          0xd6, 0x3, 0xa2, 0x8c, 0x15, 0x79, 0x7, 0xf7,
+                                                          0x2e, 0xf7, 0xcf, 0xf7, 0x42, 0xf7, 0xbd, 0xf7,
+                                                          0x28, 0x3b, 0xd5, 0x24, 0xfb, 0x9, 0xfb, 0xf,
+                                                          0xfb, 0x10, 0xfb, 0x1d, 0xfb, 0xb, 0xcd, 0x3e,
+                                                          0xe0, 0xb7, 0xb7, 0x9e, 0xa5, 0xb3, 0x1f, 0x8f,
+                                                          0x89, 0x5, 0x51, 0x80, 0xfb, 0x54, 0xfb, 0x5f,
+                                                          0xfb, 0x12, 0x1b, 0xf7, 0x1a, 0xf8, 0x2f, 0x15,
+                                                          0xe8, 0xbb, 0xf7, 0x25, 0xf7, 0x5, 0xee, 0x8b,
+                                                          0xfb, 0x0, 0x64, 0x70, 0x7b, 0xfb, 0x4, 0x72,
+                                                          0x64, 0x1e, 0x60, 0x6f, 0x53, 0x7a, 0x6c, 0x1b,
+                                                          0x27, 0x87, 0xf7, 0x7, 0xab, 0x1f, 0xe, 0x73,
+                                                          0x80, 0xf7, 0x2, 0xf7, 0x7c, 0xf7, 0x2, 0x12,
+                                                          0xbd, 0xf7, 0x2, 0x82, 0xf7, 0x2, 0x13, 0xe0,
+                                                          0xbd, 0xb7, 0x8a, 0xa, 0x13, 0xd0, 0xf0, 0xf7,
+                                                          0xea, 0x8a, 0xa, 0xe, 0x73, 0xf7, 0xdd, 0xf7,
+                                                          0x4, 0x12, 0xf7, 0x29, 0xf7, 0x4, 0xfb, 0x3,
+                                                          0xf7, 0x3, 0x13, 0xa0, 0xa6, 0xfb, 0x4, 0x15,
+                                                          0x94, 0x7a, 0x5, 0x13, 0xc0, 0xc8, 0xa, 0x76,
+                                                          0x6c, 0x7c, 0x61, 0x73, 0x99, 0x83, 0x98, 0x83,
+                                                          0x1e, 0x95, 0x84, 0x95, 0x84, 0x7c, 0x1a, 0x66,
+                                                          0x54, 0x66, 0x77, 0x7e, 0x1e, 0xf7, 0xe, 0xf8,
+                                                          0x85, 0x15, 0x6c, 0xa4, 0x72, 0xaa, 0xaa, 0xa4,
+                                                          0xa4, 0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, 0x72,
+                                                          0x72, 0x6c, 0x1e, 0xe, 0xf7, 0xd2, 0x98, 0x76,
+                                                          0xb9, 0x76, 0xf8, 0x85, 0x77, 0x1, 0xf7, 0x33,
+                                                          0xf8, 0x59, 0x3, 0xdf, 0xf7, 0x88, 0x15, 0xf8,
+                                                          0x90, 0xfb, 0x90, 0x5, 0xb5, 0x7, 0xfc, 0x4e,
+                                                          0xf7, 0x6f, 0xf8, 0x4e, 0xf7, 0x6f, 0x5, 0xb5,
+                                                          0x7, 0xfc, 0x90, 0xfb, 0x90, 0x5, 0xe, 0xf7,
+                                                          0xd2, 0xf7, 0xc, 0xce, 0xf7, 0x18, 0xce, 0x63,
+                                                          0xb3, 0x12, 0x13, 0xa0, 0xe1, 0xf7, 0xee, 0x15,
+                                                          0xf8, 0x8c, 0xb3, 0xfc, 0x8c, 0x6, 0xfb, 0x9e,
+                                                          0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xb0, 0xfc,
+                                                          0x8c, 0x7, 0xe, 0xf7, 0xd2, 0x98, 0x76, 0xf8,
+                                                          0x9e, 0x77, 0x1, 0xdf, 0x83, 0x15, 0xb5, 0x7,
+                                                          0xf8, 0x4e, 0xf7, 0x6f, 0xfc, 0x4e, 0xf7, 0x6f,
+                                                          0x5, 0xb5, 0x7, 0xf8, 0x90, 0xfb, 0x90, 0x5,
+                                                          0x79, 0x7, 0xe, 0x7f, 0xf3, 0xf8, 0xba, 0xa1,
+                                                          0x12, 0xf7, 0x18, 0xf3, 0x57, 0xcb, 0xf7, 0x2a,
+                                                          0xd5, 0x13, 0xd8, 0xf7, 0x5b, 0xf7, 0x44, 0x15,
+                                                          0x9c, 0x89, 0x5, 0xd3, 0xdb, 0xd6, 0xb5, 0xac,
+                                                          0x1e, 0xbf, 0xb4, 0xdd, 0xc1, 0xe3, 0x1a, 0xd5,
+                                                          0x54, 0xc0, 0x2b, 0x44, 0x49, 0x64, 0x44, 0x6e,
+                                                          0xa1, 0x77, 0xa3, 0x95, 0xac, 0x94, 0xa9, 0x96,
+                                                          0x85, 0x92, 0x85, 0x92, 0x1e, 0x85, 0x92, 0x84,
+                                                          0x92, 0x97, 0x1a, 0xba, 0xcc, 0x8b, 0x90, 0xd4,
+                                                          0x92, 0x50, 0x72, 0x44, 0x62, 0x5e, 0x5b, 0x58,
+                                                          0x1e, 0x57, 0x55, 0x51, 0x34, 0x41, 0x1a, 0x13,
+                                                          0xe8, 0x48, 0xfb, 0x1c, 0x15, 0x13, 0xd8, 0x6e,
+                                                          0xa2, 0x74, 0xa8, 0x1e, 0x13, 0xe8, 0xa8, 0xa2,
+                                                          0xa2, 0xa8, 0x1f, 0x13, 0xd8, 0xa8, 0x74, 0xa2,
+                                                          0x6e, 0x1e, 0x13, 0xe8, 0x6e, 0x74, 0x74, 0x6e,
+                                                          0x1f, 0xe, 0xf8, 0xc7, 0x79, 0xb2, 0xed, 0xac,
+                                                          0x7d, 0xb6, 0xf7, 0xb3, 0xb7, 0xf7, 0xf, 0xaa,
+                                                          0x12, 0xf7, 0xa, 0xde, 0xf7, 0xc, 0xd2, 0xf8,
+                                                          0xa, 0xb3, 0x13, 0xbf, 0xf8, 0x1c, 0xf7, 0x9c,
+                                                          0x15, 0xf7, 0xc, 0xe3, 0xd3, 0xbb, 0x1e, 0x13,
+                                                          0xaf, 0xa8, 0x98, 0x75, 0x61, 0x1f, 0x2a, 0x8c,
+                                                          0x40, 0xfb, 0x6, 0x61, 0x1b, 0x68, 0x70, 0xa3,
+                                                          0xc6, 0x1f, 0xf7, 0x21, 0x53, 0x15, 0x7f, 0x8a,
+                                                          0xa2, 0x51, 0xcd, 0x1b, 0xf7, 0xa, 0xce, 0xf7,
+                                                          0x1b, 0xf0, 0xf7, 0x3b, 0xfb, 0x23, 0xf7, 0x11,
+                                                          0xfb, 0x4b, 0xfb, 0x58, 0xfb, 0x3a, 0xfb, 0x24,
+                                                          0xfb, 0x69, 0xfb, 0x19, 0xf7, 0x5, 0xfb, 0x56,
+                                                          0xf7, 0x97, 0xd8, 0xd9, 0xab, 0xa9, 0xca, 0x1f,
+                                                          0x7f, 0xa8, 0x5, 0x71, 0x52, 0x4d, 0x71, 0x33,
+                                                          0x1b, 0xfb, 0x41, 0xfb, 0x7, 0xf7, 0x1c, 0xf7,
+                                                          0x21, 0xf7, 0x71, 0xf7, 0x13, 0xf7, 0x8, 0xf7,
+                                                          0x2c, 0xf7, 0x4a, 0xf3, 0xfb, 0x29, 0xfb, 0x5,
+                                                          0x1f, 0x13, 0xdf, 0x35, 0x5b, 0xfb, 0x8, 0x39,
+                                                          0x5f, 0x90, 0xbb, 0x9a, 0x8f, 0x1e, 0xcc, 0xf7,
+                                                          0x9a, 0x5, 0x46, 0x6, 0x81, 0x5c, 0x5, 0xa2,
+                                                          0x7e, 0x80, 0xa7, 0x5c, 0x1b, 0xfb, 0x19, 0x4d,
+                                                          0xfb, 0x3c, 0x45, 0x1f, 0x13, 0x0, 0xfb, 0x5,
+                                                          0xcf, 0x81, 0xa6, 0x1e, 0xc5, 0x8a, 0xb8, 0xc0,
+                                                          0x97, 0x9c, 0x8, 0xe, 0x5a, 0xa, 0x1, 0x58,
+                                                          0xf7, 0x4f, 0xf7, 0x98, 0xf7, 0x3c, 0x3, 0x58,
+                                                          0x16, 0x9b, 0xa, 0x5d, 0x7e, 0x9e, 0xa5, 0xa8,
+                                                          0x91, 0x91, 0xd2, 0xf7, 0x16, 0x1f, 0xf7, 0x70,
+                                                          0x6, 0xa1, 0xfb, 0x12, 0x8b, 0x74, 0x8a, 0x1a,
+                                                          0x63, 0x71, 0x77, 0x57, 0x1e, 0x7b, 0xf7, 0x8a,
+                                                          0x9b, 0x7, 0x51, 0x87, 0xa6, 0xc8, 0x80, 0x1f,
+                                                          0x2a, 0xf8, 0xc8, 0x5, 0x71, 0x6, 0xfb, 0xd9,
+                                                          0xfc, 0xb7, 0x5, 0x59, 0x6e, 0x70, 0x54, 0x65,
+                                                          0x1b, 0x45, 0xa, 0xe, 0xf7, 0x92, 0x86, 0xa9,
+                                                          0x72, 0xa9, 0xf7, 0xc1, 0xab, 0xf7, 0x98, 0xa9,
+                                                          0x12, 0xf7, 0x51, 0xf0, 0xf7, 0x21, 0xf7, 0x0,
+                                                          0x57, 0xf0, 0x13, 0x7c, 0x83, 0x16, 0xf7, 0xae,
+                                                          0x6, 0xf7, 0x14, 0xf7, 0x1d, 0xc9, 0xf7, 0x1d,
+                                                          0xed, 0x45, 0xa9, 0x56, 0xa2, 0x1f, 0x8d, 0x7,
+                                                          0x13, 0xba, 0xe9, 0x9e, 0xd9, 0xb6, 0xe5, 0x1a,
+                                                          0xf7, 0x7, 0x2b, 0xad, 0x23, 0x1e, 0xfb, 0x96,
+                                                          0x7b, 0x6, 0xdf, 0x81, 0x51, 0x52, 0x7c, 0x1f,
+                                                          0xfb, 0x5, 0xfc, 0x47, 0x7f, 0x5d, 0x67, 0x73,
+                                                          0x67, 0x8a, 0x19, 0x13, 0x7c, 0xf7, 0x4a, 0xd0,
+                                                          0x15, 0x9e, 0xbc, 0xf7, 0x37, 0x9a, 0xcb, 0x1e,
+                                                          0xf7, 0x3a, 0xa6, 0x5e, 0x3d, 0x28, 0x52, 0x3c,
+                                                          0xfb, 0x21, 0x6e, 0x6d, 0x9c, 0xb1, 0x1f, 0xd5,
+                                                          0xf7, 0xaa, 0x15, 0xb5, 0xf7, 0x33, 0x5, 0xeb,
+                                                          0xa2, 0x83, 0x90, 0xd1, 0x1b, 0x13, 0xba, 0xd6,
+                                                          0xb0, 0x67, 0x47, 0xfb, 0x20, 0xfb, 0xd, 0x7b,
+                                                          0xfb, 0xa, 0x1f, 0xe, 0xf7, 0xca, 0x79, 0xb8,
+                                                          0xd4, 0xa, 0x13, 0xb0, 0xf9, 0x20, 0xf8, 0x65,
+                                                          0x15, 0xb8, 0xa, 0x7e, 0x74, 0x93, 0x92, 0x6d,
+                                                          0x1f, 0x13, 0xd0, 0x90, 0x75, 0x70, 0x8f, 0x6c,
+                                                          0xd5, 0xa, 0xfb, 0x5c, 0xf7, 0x26, 0x45, 0xf7,
+                                                          0x8, 0xf7, 0x26, 0xe4, 0xf4, 0xb7, 0xb0, 0x6f,
+                                                          0xa, 0xe, 0xf8, 0x1, 0x8b, 0xa9, 0xf8, 0xe5,
+                                                          0xa9, 0x12, 0xf8, 0xe1, 0xf7, 0x3, 0x17, 0xb1,
+                                                          0xa, 0x1f, 0x13, 0xe0, 0xf4, 0x4d, 0xf7, 0x35,
+                                                          0xfb, 0x7a, 0x1e, 0xfb, 0xaa, 0x7b, 0x6, 0xe3,
+                                                          0x7e, 0x45, 0x59, 0x7d, 0x1f, 0xfb, 0x7, 0xfc,
+                                                          0x35, 0x5, 0x4d, 0x7a, 0x70, 0x75, 0x63, 0x1b,
+                                                          0xf7, 0x5f, 0xf7, 0x30, 0x15, 0xf7, 0x4, 0xf8,
+                                                          0x30, 0x5, 0x99, 0x8f, 0x95, 0xa4, 0xc4, 0xb2,
+                                                          0xa, 0x59, 0x79, 0x9d, 0xa5, 0xa6, 0x97, 0xaf,
+                                                          0x95, 0xae, 0x1f, 0xe, 0xf7, 0x92, 0x8b, 0xac,
+                                                          0xf7, 0xb9, 0xac, 0x6c, 0xe9, 0xa, 0x12, 0x8a,
+                                                          0xf9, 0xf, 0x13, 0xd8, 0x8b, 0xa, 0x74, 0x62,
+                                                          0x92, 0xb4, 0x90, 0x8b, 0x96, 0x8d, 0x92, 0x1f,
+                                                          0x13, 0xb8, 0x8e, 0x96, 0x85, 0x79, 0xcb, 0xf7,
+                                                          0x7b, 0x8, 0xf7, 0x37, 0x8b, 0x7d, 0x63, 0x40,
+                                                          0xa, 0x85, 0x80, 0xfb, 0x35, 0x1b, 0xb7, 0xf7,
+                                                          0x37, 0x5, 0xce, 0x9d, 0x81, 0xa8, 0xe9, 0x1b,
+                                                          0xf7, 0x3e, 0x9a, 0x6f, 0x67, 0x7c, 0x8b, 0x79,
+                                                          0x89, 0x76, 0x63, 0xa, 0xc2, 0x9c, 0x70, 0x75,
+                                                          0x77, 0x87, 0x74, 0x84, 0x74, 0x1f, 0xfb, 0x7,
+                                                          0xfc, 0x3a, 0x5, 0x47, 0x79, 0x64, 0x7b, 0x70,
+                                                          0x1b, 0xe, 0x7d, 0xa, 0xf7, 0xdc, 0xe9, 0xa,
+                                                          0x1, 0xf7, 0x64, 0xee, 0x3, 0x93, 0x16, 0xf7,
+                                                          0x90, 0x9b, 0x6, 0x49, 0x8a, 0x80, 0xb6, 0x9a,
+                                                          0xc4, 0xc4, 0xf7, 0x69, 0x18, 0xe3, 0xd1, 0x95,
+                                                          0x4f, 0x76, 0x86, 0x74, 0x88, 0x7d, 0x1f, 0x9c,
+                                                          0x86, 0xd7, 0xf7, 0x7e, 0x79, 0x90, 0x5, 0x2c,
+                                                          0x5d, 0x7a, 0x8d, 0xfb, 0x2d, 0x1b, 0xb6, 0xf7,
+                                                          0x35, 0x5, 0xe4, 0xa3, 0x8b, 0x94, 0xdb, 0x1b,
+                                                          0xf7, 0x28, 0xaf, 0x7e, 0x4c, 0x7d, 0x89, 0x7d,
+                                                          0x8a, 0x7d, 0x1f, 0xa0, 0x89, 0xab, 0xf7, 0x2d,
+                                                          0x5, 0xfc, 0x86, 0x7b, 0x6, 0xc2, 0x9b, 0x75,
+                                                          0x6d, 0x78, 0x87, 0x74, 0x85, 0x76, 0x1f, 0xfb,
+                                                          0x1, 0xfc, 0x2a, 0x75, 0x3a, 0x87, 0x84, 0x4a,
+                                                          0x7f, 0x19, 0xe, 0xb6, 0xa, 0xb0, 0xf8, 0xf9,
+                                                          0xad, 0x1, 0xbf, 0xf7, 0x2, 0x3, 0xf8, 0x5c,
+                                                          0xf7, 0xc3, 0x15, 0xb9, 0xa0, 0x71, 0x69, 0x85,
+                                                          0x8b, 0x84, 0x8a, 0x84, 0x1f, 0x88, 0x7b, 0x76,
+                                                          0xfb, 0x17, 0x6e, 0x74, 0x8, 0x74, 0x6e, 0x72,
+                                                          0x80, 0x58, 0x1b, 0xfb, 0x3e, 0x6b, 0xf7, 0x10,
+                                                          0xd9, 0xf7, 0x38, 0xed, 0xf7, 0x8b, 0xf7, 0x5d,
+                                                          0xd2, 0xf7, 0x1, 0x6a, 0xfb, 0x17, 0x1f, 0x9d,
+                                                          0x88, 0xbc, 0xf7, 0x59, 0x7c, 0x8f, 0x5, 0x7d,
+                                                          0x81, 0x7d, 0x77, 0x64, 0x1b, 0x7c, 0x70, 0x96,
+                                                          0x95, 0x67, 0x1f, 0x92, 0x70, 0x6b, 0x91, 0x67,
+                                                          0x1b, 0xfb, 0x6a, 0xfb, 0x53, 0xfb, 0x59, 0xfb,
+                                                          0x79, 0x60, 0xa8, 0xfb, 0x6b, 0xf7, 0x9c, 0xd4,
+                                                          0xe9, 0xa1, 0xb3, 0xcb, 0x1f, 0xb8, 0xf7, 0x45,
+                                                          0x5, 0xcb, 0x9c, 0xaa, 0x9d, 0xc0, 0x1b, 0x9b,
+                                                          0xfb, 0x9e, 0x7, 0xe, 0xf8, 0x1, 0xa0, 0x76,
+                                                          0xf7, 0xb9, 0xb5, 0xf7, 0xd2, 0x77, 0x12, 0x83,
+                                                          0xf7, 0x8a, 0xfb, 0x8a, 0xf9, 0x9b, 0xfb, 0x8b,
+                                                          0xf7, 0x8b, 0x13, 0xf4, 0x83, 0x16, 0xf7, 0x8a,
+                                                          0x9b, 0x6, 0x68, 0x6d, 0x9a, 0xb1, 0x92, 0x8c,
+                                                          0x92, 0x8d, 0x94, 0x1f, 0x13, 0xe8, 0xc7, 0xf7,
+                                                          0x7e, 0x5, 0xf7, 0xb1, 0x6, 0x50, 0xfb, 0x76,
+                                                          0x5, 0x4b, 0x79, 0x55, 0x77, 0x68, 0x1b, 0xe6,
+                                                          0xa, 0x64, 0x6b, 0x9b, 0xb4, 0x92, 0x8c, 0x93,
+                                                          0x8d, 0x93, 0x1f, 0xf7, 0x3, 0xf8, 0x3c, 0x5,
+                                                          0xf7, 0x7, 0xa9, 0xaa, 0x8d, 0xae, 0x1b, 0x93,
+                                                          0xa, 0xbb, 0x9b, 0x73, 0x6c, 0x78, 0x87, 0x76,
+                                                          0x85, 0x77, 0x1f, 0x62, 0xfb, 0x2e, 0x5, 0xfb,
+                                                          0xb1, 0x6, 0xb5, 0xf7, 0x2e, 0x5, 0xf7, 0x5,
+                                                          0xaa, 0xbf, 0x8d, 0xa9, 0x1b, 0xc4, 0xa, 0xc1,
+                                                          0x9d, 0x74, 0x6c, 0x78, 0x86, 0x76, 0x85, 0x76,
+                                                          0x1f, 0xfb, 0x4, 0xfc, 0x3a, 0x5, 0x4d, 0x7a,
+                                                          0x67, 0x75, 0x69, 0x1b, 0xe, 0x73, 0xcb, 0xa,
+                                                          0x83, 0xf8, 0x1c, 0x3, 0x83, 0x16, 0xf7, 0x88,
+                                                          0x9b, 0x6, 0x59, 0x7d, 0xa4, 0xaa, 0x9e, 0x90,
+                                                          0xa0, 0x90, 0x9d, 0x1f, 0xf7, 0x1, 0xf8, 0x1c,
+                                                          0x5, 0xec, 0xa6, 0xa2, 0x9d, 0xb6, 0x1b, 0x93,
+                                                          0xa, 0xb9, 0x9d, 0x76, 0x72, 0x76, 0x88, 0x72,
+                                                          0x85, 0x74, 0x1f, 0x20, 0xfc, 0x1c, 0x5, 0x28,
+                                                          0x70, 0x78, 0x7c, 0x5c, 0x1b, 0xe, 0xe2, 0x79,
+                                                          0xaa, 0x6c, 0xf7, 0x22, 0xf8, 0xa5, 0x77, 0x12,
+                                                          0x85, 0xe8, 0x13, 0xb0, 0xf7, 0x81, 0xf9, 0x11,
+                                                          0x15, 0xc3, 0x9d, 0x76, 0x6d, 0x78, 0x86, 0x74,
+                                                          0x85, 0x75, 0x1f, 0xfb, 0x15, 0xfc, 0x5b, 0x5,
+                                                          0x77, 0x85, 0x82, 0x69, 0x69, 0x1b, 0x6a, 0x88,
+                                                          0xa1, 0xa2, 0x8c, 0x1f, 0x91, 0x8c, 0x92, 0x91,
+                                                          0x1a, 0x13, 0x70, 0xa4, 0x75, 0xa1, 0x71, 0x6e,
+                                                          0x7a, 0x74, 0x6c, 0x4e, 0xc7, 0x70, 0xc0, 0xf7,
+                                                          0x17, 0xb2, 0xf3, 0xf5, 0xa8, 0x1e, 0xea, 0xf7,
+                                                          0xde, 0x5, 0xd9, 0xa2, 0x99, 0xb0, 0xc0, 0x1b,
+                                                          0x9b, 0xfb, 0x92, 0x7, 0xe, 0xf7, 0xca, 0xa0,
+                                                          0x76, 0xf7, 0xe6, 0xb0, 0xf7, 0xaa, 0x77, 0x1,
+                                                          0x92, 0xf9, 0x5f, 0x3, 0x92, 0x16, 0xf7, 0x8c,
+                                                          0x9b, 0x6, 0x52, 0x7e, 0x9d, 0xaa, 0x9a, 0x91,
+                                                          0x9e, 0x91, 0xa0, 0x1f, 0xc7, 0xf7, 0x6f, 0x93,
+                                                          0x8a, 0xf7, 0x7, 0xfb, 0x5a, 0x5, 0x9a, 0x70,
+                                                          0x9f, 0x6c, 0x73, 0x1a, 0x73, 0x7b, 0x79, 0x53,
+                                                          0x1e, 0x7b, 0xf7, 0xa7, 0x9b, 0x7, 0x5d, 0x74,
+                                                          0x92, 0xbc, 0x6f, 0x1f, 0xfb, 0x42, 0xf7, 0xc3,
+                                                          0xf7, 0xc0, 0xf7, 0x76, 0x5, 0x90, 0x92, 0xb2,
+                                                          0xaa, 0xa8, 0x1b, 0x9b, 0xfb, 0x72, 0x7b, 0x7,
+                                                          0xbc, 0x97, 0x83, 0x7a, 0x72, 0x3f, 0x4b, 0x47,
+                                                          0x5b, 0x1f, 0xfb, 0x24, 0x26, 0x85, 0x8c, 0xb7,
+                                                          0xf7, 0x31, 0x5, 0xe0, 0xa3, 0xa5, 0x9f, 0xc5,
+                                                          0x1b, 0xc4, 0xa, 0xc3, 0xa0, 0x7b, 0x70, 0x7a,
+                                                          0x87, 0x76, 0x84, 0x73, 0x1f, 0xfb, 0x7, 0xfc,
+                                                          0x2f, 0x5, 0x38, 0x74, 0x81, 0x75, 0x52, 0x1b,
+                                                          0xe, 0x6e, 0xa, 0x58, 0x59, 0x8b, 0xb2, 0x8f,
+                                                          0x8b, 0x90, 0x8d, 0x91, 0x1f, 0xf7, 0xd, 0xf8,
+                                                          0x4f, 0x5, 0xcd, 0x9d, 0xa5, 0xb1, 0xcd, 0x1b,
+                                                          0xc4, 0xa, 0xc7, 0x9c, 0x79, 0x6e, 0x7b, 0x86,
+                                                          0x77, 0x85, 0x75, 0x1f, 0xfb, 0xf, 0xfc, 0x4e,
+                                                          0x5, 0x4d, 0x7a, 0x6a, 0x7f, 0x6c, 0x1b, 0xe,
+                                                          0xf8, 0x70, 0xcb, 0xa, 0x79, 0xfa, 0xf, 0xfd,
+                                                          0x61, 0xf7, 0x49, 0xf7, 0x20, 0xf7, 0xa5, 0x3,
+                                                          0x79, 0xe4, 0xa, 0x55, 0x7d, 0xa4, 0xab, 0xa1,
+                                                          0x93, 0xa6, 0x92, 0xa3, 0x1f, 0xf5, 0xf8, 0x1a,
+                                                          0x5, 0x8f, 0x6, 0xc7, 0xfc, 0xac, 0x5, 0x9c,
+                                                          0x6, 0xf8, 0x8, 0xf8, 0xbd, 0x5, 0x8e, 0x6,
+                                                          0xfb, 0xc, 0xfc, 0x45, 0x5, 0x57, 0x7d, 0x86,
+                                                          0x57, 0x32, 0x1b, 0xe6, 0xa, 0x4d, 0x7a, 0x9d,
+                                                          0xa6, 0x9c, 0x92, 0x9f, 0x91, 0xa1, 0x1f, 0xf7,
+                                                          0xf, 0xf8, 0x4f, 0x5, 0xca, 0x9c, 0xa8, 0x96,
+                                                          0xaf, 0x1b, 0x9b, 0xfb, 0x3b, 0x7, 0xfb, 0xe1,
+                                                          0xfc, 0x7d, 0x5, 0x88, 0x6, 0x54, 0xf8, 0x7d,
+                                                          0x5, 0xfb, 0x49, 0x7b, 0x6, 0xc2, 0x9e, 0x79,
+                                                          0x76, 0x82, 0x80, 0x6c, 0x80, 0x63, 0x1f, 0x21,
+                                                          0xfc, 0x8, 0x5, 0xfb, 0x8, 0x6a, 0x6b, 0x7d,
+                                                          0x6a, 0x1b, 0xe, 0xf7, 0xca, 0x91, 0x76, 0xaf,
+                                                          0x76, 0xf7, 0x32, 0x77, 0xf8, 0x97, 0x77, 0x12,
+                                                          0xf7, 0x5a, 0xaa, 0x13, 0x78, 0x77, 0xe4, 0xa,
+                                                          0x54, 0x7b, 0xa1, 0xaa, 0xa9, 0x9a, 0xb0, 0x93,
+                                                          0xaa, 0x1f, 0xee, 0xf7, 0xfe, 0x5, 0x8f, 0x6,
+                                                          0x13, 0xb8, 0xf7, 0x78, 0xfc, 0xb4, 0x5, 0x9d,
+                                                          0x6, 0xf7, 0x24, 0xf8, 0x8b, 0x5, 0xf7, 0xd,
+                                                          0xae, 0xa0, 0xa7, 0xbb, 0x1b, 0xeb, 0xa, 0x7b,
+                                                          0x7, 0xc3, 0x9a, 0x77, 0x6d, 0x79, 0x7c, 0x5e,
+                                                          0x81, 0x67, 0x1f, 0x33, 0xfb, 0xde, 0x5, 0x88,
+                                                          0x6, 0xfb, 0x62, 0xf8, 0x83, 0x5, 0xfb, 0x35,
+                                                          0x7b, 0x6, 0xb4, 0xa7, 0x78, 0x66, 0x9c, 0x1f,
+                                                          0xfb, 0xb, 0xfc, 0x35, 0x5, 0xfb, 0x16, 0x66,
+                                                          0x75, 0x79, 0x5f, 0x1b, 0xe, 0xbf, 0xa, 0x90,
+                                                          0xa, 0xc7, 0xf7, 0x73, 0x15, 0xfb, 0x52, 0xf7,
+                                                          0x1f, 0x58, 0xe0, 0xf7, 0x74, 0xf7, 0x53, 0xf7,
+                                                          0x86, 0xf7, 0x5d, 0xf7, 0x3c, 0x24, 0xd4, 0xfb,
+                                                          0xc, 0xfb, 0x47, 0xfb, 0x81, 0xfb, 0x72, 0xfb,
+                                                          0x71, 0x1e, 0xf4, 0x5d, 0x15, 0xf7, 0x16, 0xf7,
+                                                          0x1, 0xf7, 0xda, 0xf7, 0x5a, 0xea, 0xa6, 0x47,
+                                                          0x30, 0xfb, 0xe, 0x30, 0xfb, 0xe5, 0xfb, 0x5f,
+                                                          0xfb, 0x16, 0x86, 0xf7, 0x1f, 0xa2, 0x1e, 0xe,
+                                                          0x7d, 0xa, 0xf7, 0xc5, 0xaf, 0xf7, 0xae, 0xa9,
+                                                          0x1, 0xf8, 0x8a, 0xf2, 0x3, 0x8b, 0x4, 0xf7,
+                                                          0x89, 0x9b, 0x6, 0x59, 0x7d, 0x9d, 0xaa, 0x9d,
+                                                          0x91, 0xa1, 0x92, 0xa4, 0x1f, 0xbb, 0xf7, 0x4b,
+                                                          0x5, 0x86, 0xa1, 0x99, 0x88, 0xd1, 0x1b, 0xf7,
+                                                          0x5c, 0xc4, 0xf7, 0xe, 0xd5, 0xf7, 0x2b, 0xfb,
+                                                          0x3b, 0x8c, 0x5f, 0x1f, 0xfb, 0x8c, 0x7b, 0x6,
+                                                          0xc0, 0x9c, 0x79, 0x70, 0x76, 0x83, 0x6f, 0x83,
+                                                          0x6f, 0x1f, 0x22, 0xfc, 0x14, 0x5, 0x4b, 0x79,
+                                                          0x7e, 0x58, 0x4b, 0x1b, 0xf7, 0x8f, 0xf7, 0xdf,
+                                                          0xd8, 0xa, 0x9b, 0xa9, 0x1b, 0xf7, 0x2, 0xa9,
+                                                          0x61, 0x41, 0xfb, 0x1f, 0x28, 0x70, 0x3a, 0x70,
+                                                          0x72, 0x8e, 0x8e, 0x78, 0x1f, 0xe, 0xf8, 0x1,
+                                                          0xfb, 0x4a, 0xcf, 0x73, 0xf7, 0x2f, 0x6a, 0xac,
+                                                          0xf8, 0xfc, 0xac, 0x12, 0x86, 0xa, 0x13, 0x5c,
+                                                          0xc6, 0xfb, 0x2e, 0x15, 0x95, 0x7c, 0x5, 0xa4,
+                                                          0xb2, 0xac, 0x91, 0xaa, 0x1b, 0xad, 0xac, 0x7e,
+                                                          0x80, 0xb2, 0x1f, 0x13, 0xbc, 0x81, 0xae, 0xb3,
+                                                          0x81, 0xbc, 0x1b, 0xba, 0xf7, 0x28, 0xa5, 0xf6,
+                                                          0xd2, 0x1f, 0x7c, 0x96, 0x5, 0x62, 0x63, 0x4f,
+                                                          0x68, 0x26, 0x1b, 0x75, 0x72, 0x91, 0x92, 0x6f,
+                                                          0x1f, 0x13, 0x3c, 0x5a, 0x98, 0x53, 0x9c, 0x55,
+                                                          0x89, 0xc8, 0xc4, 0x18, 0xae, 0xa, 0xf7, 0x82,
+                                                          0x4f, 0xa, 0xfb, 0x66, 0xfb, 0x71, 0xfb, 0x35,
+                                                          0xeb, 0x44, 0xdb, 0x7c, 0x1f, 0x2a, 0x36, 0x82,
+                                                          0x85, 0x44, 0x58, 0x8, 0xf5, 0xf7, 0xeb, 0x15,
+                                                          0xf7, 0x16, 0xef, 0xf7, 0xce, 0xf7, 0x5a, 0xea,
+                                                          0xaf, 0x45, 0x30, 0xfb, 0xe, 0x2b, 0xfb, 0xe1,
+                                                          0xfb, 0x5f, 0xfb, 0x16, 0x8b, 0xf7, 0x29, 0xa2,
+                                                          0x1e, 0xe, 0x7d, 0xa, 0xf7, 0xe1, 0xa7, 0xf7,
+                                                          0x9a, 0xa9, 0x1, 0xf8, 0x77, 0xf4, 0x3, 0x7e,
+                                                          0x16, 0xf7, 0x88, 0x9b, 0x6, 0x5b, 0x78, 0x98,
+                                                          0xaa, 0x9a, 0x8f, 0xa0, 0x92, 0xa3, 0x1f, 0xc3,
+                                                          0xf7, 0x65, 0xcc, 0x86, 0xf7, 0xf, 0xfb, 0xd8,
+                                                          0x5, 0xf7, 0x28, 0x9b, 0x6, 0x57, 0x74, 0xbb,
+                                                          0xae, 0x7e, 0x1f, 0x33, 0xf7, 0x7e, 0x5, 0xc1,
+                                                          0xf7, 0x23, 0xc4, 0xf7, 0xb, 0xf7, 0x24, 0xfb,
+                                                          0x40, 0x8b, 0x67, 0x1f, 0xfb, 0x8c, 0x7b, 0x6,
+                                                          0xbe, 0x9f, 0x7b, 0x72, 0x79, 0x85, 0x74, 0x85,
+                                                          0x74, 0x1f, 0xfb, 0x7, 0xfc, 0x30, 0x5, 0x4c,
+                                                          0x79, 0x80, 0x62, 0x4f, 0x1b, 0xf7, 0x94, 0xf7,
+                                                          0xf2, 0x15, 0xcc, 0xf7, 0x79, 0x5, 0x9d, 0x92,
+                                                          0x8f, 0x95, 0xb8, 0x1b, 0xc4, 0xc9, 0x74, 0x35,
+                                                          0x40, 0x66, 0x3d, 0xfb, 0x24, 0x70, 0x83, 0x8c,
+                                                          0x8f, 0x73, 0x1f, 0xe, 0x79, 0xae, 0x76, 0xae,
+                                                          0x72, 0x76, 0xf9, 0x1c, 0xac, 0x8c, 0x77, 0x12,
+                                                          0x13, 0x30, 0xb9, 0xa, 0x9c, 0x84, 0x83, 0x9f,
+                                                          0x1f, 0x13, 0x90, 0x81, 0xa4, 0xa8, 0x80, 0xb1,
+                                                          0x6d, 0xa, 0x13, 0x48, 0xb3, 0xf7, 0x5b, 0x5,
+                                                          0x74, 0x6, 0x79, 0x7f, 0x78, 0x83, 0x74, 0x1b,
+                                                          0x73, 0x7b, 0x94, 0x92, 0x72, 0x1f, 0x13, 0x90,
+                                                          0x90, 0x7b, 0x77, 0x8f, 0x70, 0x64, 0xa, 0xe,
+                                                          0xf7, 0x5b, 0xa0, 0x76, 0xf8, 0xfe, 0xae, 0x1,
+                                                          0xcc, 0x16, 0xf7, 0xb6, 0x9b, 0x6, 0x49, 0x77,
+                                                          0x9e, 0xac, 0x9c, 0x91, 0xa0, 0x92, 0xa3, 0x1f,
+                                                          0xf7, 0x1a, 0xf8, 0x7c, 0x5, 0xf7, 0x12, 0xac,
+                                                          0x85, 0x3c, 0x7f, 0x8a, 0x7d, 0x89, 0x7c, 0x1f,
+                                                          0x9c, 0x89, 0xb7, 0xf7, 0x37, 0x5, 0xfc, 0xa8,
+                                                          0x6, 0x61, 0xfb, 0x2e, 0x9d, 0x87, 0x5, 0xf7,
+                                                          0xf, 0xc5, 0xbd, 0x8b, 0xf7, 0x16, 0x1b, 0xfb,
+                                                          0x17, 0xfc, 0x7c, 0x5, 0x49, 0x79, 0x60, 0x5b,
+                                                          0x51, 0x1b, 0xe, 0xaa, 0xa, 0x77, 0x1, 0xf1,
+                                                          0xe5, 0xf8, 0xa, 0xf7, 0x5b, 0x3, 0xf7, 0x13,
+                                                          0xf9, 0x11, 0x15, 0xbe, 0xa2, 0x7b, 0x67, 0x1f,
+                                                          0x59, 0x28, 0xfb, 0xaf, 0x7c, 0xa, 0xf7, 0x3d,
+                                                          0xc5, 0xf7, 0x0, 0xf7, 0x29, 0xb7, 0x1e, 0xee,
+                                                          0xf7, 0xe3, 0x5, 0x9d, 0x90, 0xa7, 0xb8, 0xba,
+                                                          0x1b, 0xeb, 0xa, 0x7b, 0x7, 0xae, 0xaa, 0x7a,
+                                                          0x5f, 0x79, 0x3d, 0xfb, 0xb2, 0x83, 0x6c, 0x1f,
+                                                          0x26, 0x6f, 0x56, 0xfb, 0x9, 0xfb, 0x1a, 0x1b,
+                                                          0x4b, 0x40, 0xab, 0xe4, 0xc1, 0xef, 0xf7, 0xea,
+                                                          0x9a, 0xb8, 0x1f, 0xaf, 0x97, 0xb0, 0x9b, 0xb7,
+                                                          0x1b, 0xd2, 0xa, 0xe, 0xf7, 0x92, 0x8e, 0x76,
+                                                          0xf9, 0x33, 0x77, 0x1, 0xd7, 0xf8, 0xf8, 0x3,
+                                                          0xf7, 0x84, 0x79, 0x15, 0x9e, 0x6, 0xf7, 0xca,
+                                                          0xf8, 0x94, 0x5, 0x95, 0x91, 0xca, 0xf7, 0x19,
+                                                          0xbd, 0x1b, 0x9b, 0xfb, 0x4e, 0x7b, 0x7, 0xb4,
+                                                          0x9c, 0x75, 0x79, 0x69, 0x6e, 0x5b, 0x7d, 0x73,
+                                                          0x1f, 0xfb, 0x62, 0xfb, 0xf8, 0x5, 0x86, 0x6,
+                                                          0x4e, 0xf7, 0xfb, 0x5, 0x87, 0xa1, 0x85, 0xa6,
+                                                          0xa3, 0x1a, 0xb1, 0x9c, 0xab, 0xcc, 0x1e, 0x9b,
+                                                          0xfb, 0x85, 0x7b, 0x7, 0xbc, 0x8e, 0x75, 0xfb,
+                                                          0xf, 0x9f, 0x1f, 0xe, 0xf8, 0x70, 0x8e, 0x76,
+                                                          0xf9, 0x33, 0x77, 0x1, 0xd2, 0xf9, 0xd7, 0x3,
+                                                          0xf7, 0x68, 0x79, 0x15, 0x9e, 0x6, 0xf7, 0x72,
+                                                          0xf8, 0x5a, 0x5, 0x90, 0x6, 0xbd, 0xfc, 0x5a,
+                                                          0x5, 0x9f, 0x6, 0xf7, 0xc0, 0xf8, 0xd1, 0x5,
+                                                          0xbf, 0xa6, 0xa9, 0xa9, 0xa0, 0x1b, 0x9b, 0xfb,
+                                                          0x4d, 0x7b, 0x7, 0xbe, 0x99, 0x73, 0x75, 0x79,
+                                                          0x84, 0x7a, 0x89, 0x87, 0x1f, 0xfb, 0x58, 0xfc,
+                                                          0x15, 0x5, 0x88, 0x6, 0x5c, 0xf8, 0x24, 0x5,
+                                                          0x8f, 0x8b, 0x90, 0x8f, 0x1a, 0xaa, 0xb2, 0xa5,
+                                                          0xae, 0x1e, 0x9b, 0xfb, 0x82, 0x7b, 0x7, 0xc7,
+                                                          0x97, 0x74, 0x5e, 0x90, 0x1f, 0x92, 0x50, 0xfb,
+                                                          0x3e, 0xfb, 0xeb, 0x5, 0x88, 0x6, 0x87, 0xa9,
+                                                          0x61, 0xf7, 0xfd, 0x5, 0x8a, 0x93, 0x8b, 0x92,
+                                                          0x91, 0x1a, 0xb4, 0xb8, 0x9c, 0xaa, 0x1e, 0x9b,
+                                                          0xfb, 0x80, 0x7b, 0x7, 0xc1, 0x98, 0x5f, 0x69,
+                                                          0x8f, 0x1f, 0xe, 0xf7, 0x92, 0xcb, 0xa, 0x6e,
+                                                          0xf9, 0x40, 0x3, 0x6e, 0x16, 0xf7, 0x6a, 0x9b,
+                                                          0x6, 0x61, 0x75, 0x9a, 0xa0, 0x98, 0x91, 0x9a,
+                                                          0x99, 0x9c, 0x1f, 0xf7, 0x2b, 0xf7, 0x40, 0xd3,
+                                                          0xfb, 0x47, 0x5, 0x8f, 0x81, 0x8d, 0x81, 0x82,
+                                                          0x1a, 0x73, 0x79, 0x76, 0x51, 0x1e, 0xe6, 0xa,
+                                                          0x60, 0x67, 0x95, 0xcb, 0x72, 0x1f, 0x25, 0xf7,
+                                                          0x96, 0xf7, 0x4d, 0xf7, 0x68, 0x5, 0xbe, 0xb8,
+                                                          0xc0, 0xa5, 0x96, 0x1b, 0x9b, 0xfb, 0x64, 0x7b,
+                                                          0x7, 0xb4, 0x9e, 0x7d, 0x78, 0x7e, 0x85, 0x7b,
+                                                          0x7e, 0x7c, 0x1f, 0xfb, 0x25, 0xfb, 0x3b, 0x50,
+                                                          0xf7, 0x27, 0x5, 0x82, 0xa0, 0x86, 0x9e, 0x9b,
+                                                          0x1a, 0xa4, 0xa1, 0x9b, 0xbb, 0x1e, 0x9b, 0xfb,
+                                                          0x9c, 0x7b, 0x7, 0xc2, 0xa2, 0x76, 0x3f, 0xa9,
+                                                          0x1f, 0xe5, 0xfb, 0x77, 0xfb, 0x32, 0xfb, 0x4c,
+                                                          0x7d, 0x7c, 0x7a, 0x7a, 0x19, 0x53, 0x53, 0x62,
+                                                          0x72, 0x7a, 0x1b, 0xe, 0xf7, 0x5b, 0xcb, 0xa,
+                                                          0xcf, 0xa, 0x58, 0x6d, 0x99, 0xb3, 0x94, 0x8c,
+                                                          0x95, 0x8e, 0x97, 0x1f, 0xc1, 0xf7, 0x61, 0xf7,
+                                                          0x6f, 0xf7, 0xa2, 0x5, 0xb3, 0xab, 0xa9, 0xa0,
+                                                          0x93, 0x1b, 0xe8, 0xa, 0xaa, 0xa7, 0x7d, 0x72,
+                                                          0x83, 0x89, 0x83, 0x87, 0x81, 0x1f, 0x7a, 0x64,
+                                                          0xfb, 0x2, 0xfb, 0x16, 0x5e, 0x53, 0x73, 0xe7,
+                                                          0x6a, 0xf5, 0x85, 0xa5, 0x8, 0x89, 0x92, 0x8b,
+                                                          0x90, 0x91, 0x1a, 0xaa, 0xaf, 0x9c, 0xad, 0xcd,
+                                                          0xa, 0xaf, 0xa3, 0x82, 0x52, 0x9b, 0x1f, 0xd8,
+                                                          0xfb, 0xa1, 0x52, 0xfb, 0x5e, 0x5, 0x49, 0x78,
+                                                          0x55, 0x79, 0x67, 0x1b, 0xe, 0xf7, 0x5b, 0x8b,
+                                                          0xaf, 0xf8, 0xd9, 0xaf, 0x50, 0xa, 0xe, 0xe1,
+                                                          0xa, 0xa0, 0xf8, 0x6, 0x3, 0xa0, 0xfb, 0x2d,
+                                                          0x15, 0xf7, 0x50, 0x6, 0x92, 0xa6, 0x5, 0x5d,
+                                                          0x6, 0x6b, 0x68, 0x92, 0xb5, 0x97, 0x1f, 0xf7,
+                                                          0x34, 0xf9, 0x3a, 0x5, 0xa6, 0x91, 0xa3, 0x93,
+                                                          0xa6, 0x1b, 0xbf, 0x6, 0x92, 0xa6, 0x5, 0xfb,
+                                                          0x41, 0x6, 0xe, 0x3c, 0xfb, 0x13, 0x76, 0xf7,
+                                                          0x20, 0x76, 0xf9, 0x4b, 0x77, 0x1, 0x54, 0xf8,
+                                                          0xb, 0x3, 0xf7, 0x6b, 0xfb, 0x28, 0x15, 0xad,
+                                                          0x6, 0xfb, 0x41, 0xf9, 0xc2, 0x5, 0x66, 0x6,
+                                                          0xe, 0xe1, 0xa, 0x97, 0xf8, 0x6, 0x3, 0x9e,
+                                                          0xfb, 0x12, 0x15, 0x84, 0x70, 0x5, 0xf7, 0x41,
+                                                          0x6, 0xf7, 0x59, 0xf9, 0xc4, 0x5, 0xfb, 0x51,
+                                                          0x6, 0x84, 0x70, 0x5, 0xba, 0x6, 0xaa, 0xad,
+                                                          0x86, 0x60, 0x81, 0x1f, 0xfb, 0x35, 0xfd, 0x3a,
+                                                          0x5, 0x79, 0x87, 0x7d, 0x79, 0x65, 0x1b, 0xe,
+                                                          0xcc, 0xf9, 0x2e, 0x77, 0xa2, 0x76, 0x12, 0xf7,
+                                                          0x49, 0xf7, 0x41, 0x13, 0x60, 0xf7, 0xc1, 0x4,
+                                                          0x13, 0xa0, 0xcf, 0x6, 0xf7, 0x23, 0xf7, 0xb2,
+                                                          0xf7, 0x23, 0xfb, 0xb2, 0x5, 0xcf, 0x6, 0xfb,
+                                                          0x49, 0xf8, 0x1, 0x5, 0x4f, 0x6, 0xe, 0xfb,
+                                                          0x11, 0xbd, 0x1, 0x94, 0x40, 0x15, 0x82, 0x59,
+                                                          0x5, 0xf8, 0x80, 0x6, 0x93, 0xbd, 0x5, 0xe,
+                                                          0x73, 0xf8, 0x95, 0x76, 0xf7, 0x40, 0x77, 0x1,
+                                                          0xf7, 0xac, 0xf8, 0x80, 0xb7, 0xa, 0xfb, 0x3,
+                                                          0xf7, 0x22, 0xc5, 0xa, 0x79, 0x92, 0x56, 0xa,
+                                                          0x9e, 0x7a, 0x80, 0xa, 0x80, 0xbc, 0xf8, 0x11,
+                                                          0xa1, 0x12, 0x9c, 0xdf, 0xf7, 0x58, 0xd4, 0x8b,
+                                                          0x99, 0x17, 0xf7, 0xd2, 0xf7, 0x1f, 0x61, 0xa,
+                                                          0x70, 0xb5, 0xb6, 0xad, 0xb0, 0xd5, 0xc7, 0x1e,
+                                                          0x13, 0xf8, 0x38, 0xa, 0x45, 0x8a, 0x7a, 0x4f,
+                                                          0x5, 0x89, 0x6, 0xa7, 0x6d, 0xaf, 0x5f, 0xa,
+                                                          0x36, 0xa, 0xa8, 0xa1, 0x6e, 0x5b, 0x29, 0x2f,
+                                                          0xfb, 0x62, 0x21, 0x70, 0x6a, 0x9d, 0xc0, 0x1e,
+                                                          0xe, 0x80, 0xa2, 0x7f, 0xa2, 0xf8, 0x5, 0xbc,
+                                                          0x91, 0xbc, 0xf7, 0x4f, 0x77, 0x12, 0xa2, 0xe1,
+                                                          0xf7, 0xab, 0xe0, 0x13, 0x7e, 0xf7, 0x1, 0xb8,
+                                                          0x15, 0xf4, 0xeb, 0xf7, 0x86, 0xf7, 0x2, 0xca,
+                                                          0x95, 0x55, 0x6c, 0x1e, 0x13, 0xbe, 0x37, 0x2c,
+                                                          0xfb, 0x67, 0xfb, 0x1d, 0x5c, 0x8b, 0xa5, 0x92,
+                                                          0x1e, 0x8c, 0xf8, 0xea, 0x15, 0xb8, 0x9c, 0x7e,
+                                                          0x76, 0x7b, 0x85, 0x75, 0x84, 0x73, 0x1f, 0xfb,
+                                                          0x1c, 0xfc, 0x89, 0x5, 0x87, 0x7, 0x75, 0xd8,
+                                                          0x6c, 0xc0, 0xf7, 0x2d, 0xf7, 0x3b, 0xf7, 0x41,
+                                                          0xf7, 0x32, 0xd4, 0x5a, 0xbb, 0x45, 0x31, 0x50,
+                                                          0x38, 0x57, 0x6a, 0x1e, 0x89, 0x8c, 0xad, 0xf7,
+                                                          0x5, 0xb5, 0xf7, 0x44, 0xa1, 0xdd, 0x19, 0x86,
+                                                          0x90, 0x57, 0x81, 0x58, 0x84, 0x59, 0x85, 0x19,
+                                                          0xe, 0xe2, 0x80, 0xaf, 0xf8, 0x1f, 0xa0, 0x1,
+                                                          0xa9, 0xe1, 0xf7, 0x72, 0xe2, 0x3, 0xf7, 0xf2,
+                                                          0xf5, 0x15, 0x63, 0x67, 0x5c, 0x62, 0x4f, 0x1b,
+                                                          0x4e, 0x6d, 0xb8, 0xd8, 0xeb, 0xd0, 0xdb, 0xa,
+                                                          0x84, 0x89, 0x85, 0x88, 0x84, 0x1f, 0x87, 0x80,
+                                                          0x85, 0x7f, 0x7b, 0xa3, 0xa, 0xfb, 0x1e, 0xfb,
+                                                          0x2d, 0xfb, 0x21, 0xfb, 0x19, 0xde, 0x72, 0xcc,
+                                                          0xf4, 0xc5, 0xd6, 0xab, 0xa4, 0x1e, 0xe, 0x7f,
+                                                          0xbb, 0x6f, 0x76, 0xf8, 0x8a, 0xa2, 0xd3, 0x77,
+                                                          0x12, 0x9a, 0xe2, 0x13, 0xb8, 0xf1, 0xf7, 0x3,
+                                                          0x15, 0xe6, 0xea, 0xf7, 0x69, 0xf7, 0x4, 0xba,
+                                                          0x8b, 0x62, 0x74, 0xfb, 0x10, 0x29, 0xfb, 0x53,
+                                                          0x2c, 0x4e, 0x8b, 0xc5, 0x9c, 0x1e, 0xf7, 0x59,
+                                                          0x8e, 0x15, 0x83, 0x68, 0x87, 0x74, 0x74, 0x1a,
+                                                          0x13, 0x78, 0x76, 0x93, 0x72, 0xb2, 0xac, 0xcc,
+                                                          0xba, 0xce, 0xb6, 0x1e, 0x7f, 0x95, 0x5, 0x5b,
+                                                          0x61, 0x77, 0x74, 0x77, 0x1b, 0x81, 0x83, 0x92,
+                                                          0x9a, 0x9b, 0xf7, 0xd, 0xf8, 0x3e, 0xb6, 0xf7,
+                                                          0x42, 0x1f, 0x86, 0x90, 0x58, 0x80, 0x58, 0x84,
+                                                          0x58, 0x86, 0x19, 0x7a, 0x7, 0xb3, 0x9a, 0x7c,
+                                                          0x72, 0x79, 0x85, 0x74, 0x84, 0x72, 0x1f, 0x65,
+                                                          0xfb, 0x29, 0x89, 0x89, 0x5, 0xa1, 0x87, 0x84,
+                                                          0xa9, 0x53, 0x1b, 0x13, 0x38, 0xfb, 0xb, 0xfb,
+                                                          0x3e, 0xfb, 0x48, 0xfb, 0x2b, 0x1f, 0x13, 0xb8,
+                                                          0x57, 0xa0, 0x48, 0xde, 0xbd, 0xc3, 0x9d, 0xf7,
+                                                          0x2, 0xd3, 0x1e, 0xe, 0xe2, 0x80, 0xb8, 0xf8,
+                                                          0x14, 0xa2, 0x12, 0xaa, 0xe2, 0xf7, 0x78, 0xcd,
+                                                          0x17, 0xf7, 0x17, 0xf7, 0x5a, 0x15, 0xa0, 0xc1,
+                                                          0x5, 0xe5, 0xae, 0xd1, 0xd7, 0xc1, 0x1b, 0xa4,
+                                                          0x95, 0x6e, 0x76, 0x83, 0x82, 0xfb, 0xc, 0xfb,
+                                                          0x62, 0x61, 0x1f, 0x84, 0x75, 0x15, 0xf7, 0x52,
+                                                          0xa0, 0xed, 0xe2, 0xda, 0x1a, 0xb7, 0x6c, 0xad,
+                                                          0x58, 0x1e, 0x13, 0xa0, 0xfb, 0x21, 0xfb, 0x32,
+                                                          0x5c, 0xa, 0x1f, 0x73, 0xa, 0x61, 0x57, 0xa2,
+                                                          0xcf, 0x9f, 0x8c, 0x95, 0x90, 0xa0, 0x1f, 0xe,
+                                                          0x3c, 0xfb, 0x63, 0xa0, 0xf8, 0xd0, 0xab, 0xf7,
+                                                          0x82, 0xa1, 0x12, 0xf7, 0xed, 0xda, 0x13, 0xe0,
+                                                          0xa9, 0xf8, 0x16, 0x15, 0xe5, 0x6, 0x38, 0xfc,
+                                                          0x2e, 0x5, 0x63, 0x83, 0x71, 0xfb, 0xe, 0x4b,
+                                                          0x1b, 0x7f, 0x84, 0x93, 0x93, 0x8f, 0x8c, 0x8e,
+                                                          0x8d, 0x8e, 0x1f, 0x8e, 0x8f, 0x8e, 0x8f, 0x95,
+                                                          0x1a, 0xa4, 0x71, 0x97, 0x7d, 0x68, 0x8a, 0x63,
+                                                          0x88, 0x1e, 0x13, 0xf0, 0x65, 0xb7, 0x76, 0xad,
+                                                          0xf7, 0x9, 0xc4, 0xf7, 0x35, 0xf7, 0xe, 0xa6,
+                                                          0x1e, 0xce, 0xf7, 0xca, 0x5, 0xf7, 0x1, 0x6,
+                                                          0x91, 0xab, 0x5, 0xfb, 0x0, 0x6, 0xbe, 0x94,
+                                                          0xae, 0xf7, 0x4f, 0xdd, 0x1b, 0x98, 0x95, 0x87,
+                                                          0x83, 0x86, 0x89, 0x88, 0x89, 0x88, 0x1f, 0x88,
+                                                          0x87, 0x88, 0x85, 0x7f, 0x1a, 0x80, 0x91, 0x70,
+                                                          0xab, 0xa2, 0x9d, 0x9f, 0x9f, 0x9f, 0x7b, 0xb8,
+                                                          0x43, 0xfb, 0x12, 0x54, 0xfb, 0x43, 0x36, 0x71,
+                                                          0x1e, 0x2f, 0x6, 0xe, 0xfb, 0x52, 0xa1, 0xf7,
+                                                          0xd3, 0xa0, 0xf7, 0x8b, 0xa1, 0x12, 0x93, 0xcc,
+                                                          0xa2, 0xd9, 0xf7, 0x2b, 0xc7, 0x6a, 0xda, 0x13,
+                                                          0xfc, 0xf7, 0x11, 0xb2, 0x15, 0x37, 0x54, 0x6a,
+                                                          0x75, 0x52, 0x1a, 0x54, 0xc0, 0x53, 0xf7, 0x1,
+                                                          0xf7, 0x1d, 0xd9, 0xc8, 0xe0, 0xc6, 0x64, 0xaa,
+                                                          0x5f, 0x9f, 0x1e, 0x4f, 0xa6, 0x45, 0x93, 0xa9,
+                                                          0x1a, 0x98, 0xa1, 0xa6, 0x99, 0x1e, 0x98, 0x99,
+                                                          0x87, 0x98, 0x1b, 0x13, 0xfa, 0xe3, 0xea, 0xdd,
+                                                          0xd5, 0x9f, 0x88, 0x9f, 0x85, 0x9e, 0x1f, 0xbd,
+                                                          0x6, 0x13, 0xa8, 0xb2, 0x4e, 0x7, 0x7c, 0x60,
+                                                          0xaf, 0x50, 0x1b, 0x39, 0xfb, 0x8, 0x51, 0xfb,
+                                                          0x4, 0x46, 0xb6, 0x73, 0xaf, 0x7b, 0x1f, 0x69,
+                                                          0x74, 0x60, 0x6e, 0x6c, 0x1a, 0x78, 0x9a, 0x7f,
+                                                          0x97, 0x82, 0x1e, 0xa1, 0x80, 0x15, 0x92, 0x8e,
+                                                          0xed, 0x63, 0x9d, 0x82, 0x8, 0x13, 0xfc, 0x9e,
+                                                          0x82, 0xaf, 0x7a, 0x5e, 0x1a, 0x59, 0x5a, 0x5e,
+                                                          0x31, 0x7c, 0x2a, 0x9a, 0xdd, 0x8a, 0x1e, 0xb1,
+                                                          0x99, 0xbf, 0xc7, 0xa4, 0x1e, 0xa6, 0xf7, 0x72,
+                                                          0x15, 0x13, 0xa0, 0xce, 0xb7, 0xf1, 0xd8, 0x1e,
+                                                          0x13, 0xfa, 0xb5, 0x9a, 0x6e, 0x64, 0x38, 0x59,
+                                                          0x2b, 0x49, 0x5e, 0x7a, 0xac, 0xb8, 0x1f, 0xe,
+                                                          0xbe, 0xa, 0xf7, 0x86, 0x77, 0x12, 0xf8, 0x6,
+                                                          0xd9, 0x13, 0x70, 0x9e, 0x16, 0xd6, 0x6, 0xac,
+                                                          0xf7, 0x12, 0x99, 0xc2, 0xb9, 0xcf, 0x8, 0xa7,
+                                                          0x9e, 0xe0, 0xf7, 0x5, 0xbd, 0x1b, 0x9b, 0x98,
+                                                          0x81, 0x7a, 0x1f, 0x7e, 0x39, 0xfb, 0xb3, 0x71,
+                                                          0x1a, 0x13, 0xb0, 0x70, 0x98, 0x78, 0xab, 0xcd,
+                                                          0xb6, 0xc9, 0xbf, 0xaf, 0x1e, 0x13, 0x10, 0x7e,
+                                                          0x97, 0x5, 0x5b, 0x65, 0x73, 0x6c, 0x77, 0x1b,
+                                                          0x83, 0x83, 0x92, 0x97, 0x1f, 0x13, 0x38, 0xa0,
+                                                          0xdc, 0xf7, 0x94, 0xae, 0x1a, 0xcc, 0x5d, 0x92,
+                                                          0x75, 0x31, 0x25, 0xfb, 0x2e, 0x59, 0x6c, 0x1e,
+                                                          0x89, 0x8d, 0xf7, 0xa, 0xf8, 0x4b, 0x86, 0x90,
+                                                          0x57, 0x7f, 0x56, 0x82, 0x57, 0x85, 0x19, 0x7b,
+                                                          0x7, 0xb7, 0x9c, 0x94, 0x4f, 0x81, 0x7a, 0x51,
+                                                          0x83, 0x6d, 0x1f, 0xe, 0xd7, 0xa, 0xf8, 0xc4,
+                                                          0xf4, 0x12, 0xbc, 0xd6, 0xb0, 0xf2, 0x17, 0xf7,
+                                                          0x72, 0xf7, 0x6, 0x4a, 0xa, 0xe7, 0xf7, 0xe4,
+                                                          0x1f, 0x88, 0x8d, 0x5, 0x84, 0x64, 0x32, 0x79,
+                                                          0x6b, 0x1b, 0x13, 0xf0, 0x7b, 0x7, 0xc2, 0x8f,
+                                                          0x7c, 0x76, 0x1f, 0x6f, 0x40, 0x4b, 0xa, 0x41,
+                                                          0xf8, 0x86, 0x15, 0x6e, 0xa0, 0x85, 0xa, 0x76,
+                                                          0x73, 0x6e, 0x1e, 0xe, 0x3c, 0xfb, 0x63, 0xa2,
+                                                          0x74, 0xf2, 0xf9, 0x24, 0xf1, 0x12, 0xfb, 0x10,
+                                                          0xdc, 0xf7, 0x6d, 0xf1, 0x13, 0xb8, 0xd4, 0xf8,
+                                                          0x24, 0x15, 0xc7, 0x8c, 0x99, 0x8c, 0x61, 0x1a,
+                                                          0x33, 0xfb, 0xff, 0x5, 0x3e, 0x78, 0x72, 0x23,
+                                                          0x58, 0x1b, 0x82, 0x80, 0x8c, 0x95, 0x91, 0x8e,
+                                                          0x8e, 0x8e, 0x8f, 0x1f, 0x8e, 0x8f, 0x8f, 0x90,
+                                                          0x96, 0x1a, 0x13, 0x78, 0xa0, 0x77, 0x9a, 0x77,
+                                                          0x66, 0x87, 0x68, 0x87, 0x5a, 0xb8, 0x7c, 0xac,
+                                                          0xe4, 0xc5, 0xd6, 0xf7, 0x34, 0xb4, 0x1e, 0xf3,
+                                                          0xf8, 0x2f, 0x88, 0x8d, 0x5, 0x84, 0x64, 0x2b,
+                                                          0x79, 0x68, 0x1b, 0xf0, 0xf7, 0x4f, 0x15, 0x6f,
+                                                          0xa2, 0x74, 0xa7, 0xa7, 0xa2, 0xa2, 0xa7, 0xa7,
+                                                          0x74, 0xa2, 0x6f, 0x6f, 0x74, 0x74, 0x6f, 0x1e,
+                                                          0xe, 0xe2, 0x95, 0x76, 0xab, 0x76, 0xf9, 0x24,
+                                                          0x77, 0xba, 0x77, 0x12, 0x99, 0xf8, 0x53, 0x13,
+                                                          0x70, 0x99, 0x16, 0xd6, 0x6, 0xbb, 0xf7, 0x48,
+                                                          0xb5, 0xab, 0x95, 0x6d, 0xb1, 0x33, 0x97, 0x74,
+                                                          0x19, 0x13, 0xb0, 0x50, 0xa9, 0x9d, 0x74, 0xaa,
+                                                          0x1b, 0xb7, 0xa8, 0xb0, 0xd3, 0xb1, 0x1f, 0x7c,
+                                                          0x96, 0x5, 0x59, 0x6e, 0x81, 0x79, 0x75, 0x1b,
+                                                          0x71, 0x78, 0xb9, 0xf7, 0x3f, 0x43, 0x1f, 0xf7,
+                                                          0xe, 0xf7, 0x1e, 0xb5, 0xab, 0xb8, 0x1b, 0x13,
+                                                          0x38, 0x9b, 0xfb, 0x4b, 0x7b, 0x7, 0xa6, 0xa7,
+                                                          0x8b, 0x78, 0x6c, 0xfb, 0x14, 0x2b, 0x54, 0x60,
+                                                          0x1f, 0x89, 0x8d, 0xf7, 0xb, 0xf8, 0x59, 0x86,
+                                                          0x90, 0x5, 0x7f, 0x57, 0x36, 0x7c, 0x78, 0x1b,
+                                                          0x13, 0x0, 0x7b, 0x7, 0xa5, 0xb2, 0x82, 0x71,
+                                                          0x7c, 0x73, 0x3a, 0x82, 0x67, 0x1f, 0xe, 0x3c,
+                                                          0x8f, 0x76, 0xf9, 0x35, 0x77, 0xba, 0x77, 0x12,
+                                                          0xb4, 0xd8, 0x17, 0xf7, 0x78, 0xd3, 0xa, 0x7c,
+                                                          0x8b, 0x99, 0x91, 0x96, 0x93, 0xa6, 0x8d, 0x94,
+                                                          0x1f, 0xf7, 0x2b, 0xf8, 0xd7, 0x86, 0x90, 0x5,
+                                                          0x7f, 0x57, 0x3d, 0x7c, 0x71, 0x1b, 0x13, 0x90,
+                                                          0x7b, 0x7, 0xa5, 0xb1, 0x82, 0x71, 0x1f, 0x76,
+                                                          0xfb, 0x21, 0xfc, 0x94, 0x76, 0xb5, 0xa, 0xf8,
+                                                          0x1, 0x97, 0x76, 0xa9, 0x76, 0xf8, 0x19, 0xbf,
+                                                          0x12, 0x13, 0x60, 0x97, 0x16, 0xd6, 0x6, 0xb0,
+                                                          0xf7, 0xe, 0x9f, 0xcd, 0xb3, 0xc7, 0x8, 0xb3,
+                                                          0xa6, 0xd7, 0xf0, 0xb8, 0x1b, 0x94, 0x98, 0x8b,
+                                                          0x70, 0x78, 0x46, 0xfb, 0x8a, 0x71, 0x2a, 0x1f,
+                                                          0xd6, 0x6, 0xa8, 0xf7, 0x5, 0x9c, 0xca, 0xbb,
+                                                          0xd7, 0x8, 0xbc, 0xaa, 0xd3, 0xe3, 0xb4, 0x1b,
+                                                          0x97, 0x94, 0x83, 0x7c, 0x1f, 0x77, 0x3d, 0xfb,
+                                                          0xab, 0x70, 0x1a, 0x13, 0xa0, 0x7d, 0x8b, 0x68,
+                                                          0xb5, 0xc3, 0xbd, 0xc3, 0xc5, 0xb4, 0x1e, 0x7c,
+                                                          0x97, 0x5, 0x5c, 0x65, 0x71, 0x6b, 0x78, 0x1b,
+                                                          0x7f, 0x88, 0x8e, 0x9c, 0x1f, 0x99, 0xdc, 0xf7,
+                                                          0xa0, 0xad, 0x1a, 0xb3, 0x74, 0xa6, 0x67, 0x49,
+                                                          0x3a, 0x33, 0xfb, 0x8, 0x45, 0x1e, 0x89, 0x8d,
+                                                          0x5, 0x99, 0xb3, 0xa2, 0xde, 0x99, 0x1a, 0xb5,
+                                                          0x76, 0xa2, 0x65, 0x37, 0x24, 0xfb, 0x2f, 0x5a,
+                                                          0x6d, 0x1e, 0x89, 0x8d, 0xc3, 0xf7, 0x5a, 0x88,
+                                                          0x8f, 0x56, 0x80, 0x56, 0x81, 0x55, 0x81, 0x19,
+                                                          0x13, 0x0, 0x7b, 0x7, 0xbc, 0x96, 0x75, 0x75,
+                                                          0x1f, 0x13, 0x60, 0x75, 0x3d, 0xfb, 0x9a, 0x7b,
+                                                          0x49, 0x1e, 0xe, 0xbe, 0xa, 0x12, 0xf7, 0xfd,
+                                                          0xdc, 0x13, 0x70, 0x89, 0xa, 0x13, 0x90, 0xc3,
+                                                          0xa, 0x13, 0xb0, 0x51, 0xa, 0x13, 0x0, 0x7b,
+                                                          0x7, 0xc1, 0x93, 0x76, 0x7c, 0x1f, 0x13, 0x70,
+                                                          0x76, 0x4a, 0xfb, 0x74, 0x6c, 0xfb, 0x5, 0x1e,
+                                                          0xe, 0x80, 0xa0, 0xf8, 0x2e, 0xa0, 0x92, 0xa,
+                                                          0xa6, 0xf7, 0x1b, 0x15, 0x38, 0xba, 0x4c, 0xf5,
+                                                          0xf7, 0x2d, 0xf7, 0x1b, 0xf7, 0x47, 0xf7, 0xf,
+                                                          0xcd, 0x6a, 0xdf, 0xfb, 0x8, 0xfb, 0x26, 0xfb,
+                                                          0x26, 0xfb, 0x33, 0xfb, 0x27, 0x1e, 0xdf, 0x6d,
+                                                          0x15, 0xf7, 0xa, 0xe4, 0xf7, 0x59, 0xf7, 0x4,
+                                                          0xbb, 0xa3, 0x5d, 0x57, 0x20, 0x3e, 0xfb, 0x61,
+                                                          0xfb, 0x6, 0x59, 0x6b, 0xb1, 0xc4, 0x1e, 0xe,
+                                                          0xfb, 0x48, 0x76, 0xf7, 0x67, 0x76, 0xf8, 0x2d,
+                                                          0xb6, 0x48, 0xa, 0x73, 0x1f, 0x89, 0x8d, 0xa6,
+                                                          0xe8, 0x5, 0x96, 0x8e, 0x88, 0x8d, 0x88, 0x1b,
+                                                          0xfb, 0x2f, 0x75, 0x5, 0x13, 0x80, 0x8d, 0x7b,
+                                                          0x5, 0xb9, 0x9e, 0x81, 0x79, 0x76, 0x29, 0xfb,
+                                                          0xfe, 0x70, 0xfb, 0x4, 0x1f, 0x6b, 0x83, 0x81,
+                                                          0xda, 0xa, 0x61, 0x75, 0x8b, 0xd1, 0x94, 0x1f,
+                                                          0x8e, 0x9f, 0x9b, 0xd3, 0x94, 0xad, 0x8, 0xe,
+                                                          0xfb, 0x50, 0x76, 0xf7, 0x5a, 0xc0, 0xf8, 0xd,
+                                                          0xa1, 0x1, 0xa4, 0xe1, 0xf7, 0xa1, 0x99, 0x3,
+                                                          0xf7, 0x2a, 0xfb, 0x55, 0x15, 0x7b, 0xf7, 0x85,
+                                                          0x9d, 0x7, 0x6e, 0x5c, 0x9a, 0xb5, 0x97, 0x1f,
+                                                          0xf7, 0x30, 0xf8, 0xc4, 0x5, 0x42, 0x6, 0x7d,
+                                                          0x5f, 0x5, 0x89, 0x6, 0xa5, 0x85, 0x7b, 0xac,
+                                                          0x53, 0x1b, 0xfb, 0x16, 0xfb, 0x35, 0xfb, 0x52,
+                                                          0xfb, 0x1d, 0x47, 0xa5, 0x52, 0xd8, 0xe4, 0xc5,
+                                                          0xdc, 0xd8, 0xc0, 0x1f, 0x8d, 0x89, 0x3b, 0xfb,
+                                                          0xa7, 0x5, 0x5e, 0x7d, 0x6c, 0x79, 0x54, 0x1b,
+                                                          0x64, 0xf7, 0xc9, 0x15, 0xf7, 0x8, 0xf7, 0x8,
+                                                          0xf7, 0x4f, 0xe8, 0xaa, 0xa8, 0x76, 0x5e, 0x29,
+                                                          0xfb, 0x0, 0xfb, 0x69, 0x22, 0x68, 0x76, 0xaa,
+                                                          0xb6, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf8, 0x4d,
+                                                          0x77, 0x1, 0xb8, 0xf8, 0x3, 0x3, 0xb8, 0x16,
+                                                          0xd7, 0x6, 0xb4, 0xf7, 0x19, 0x99, 0xb8, 0xb1,
+                                                          0xd3, 0x8, 0x9a, 0x93, 0xc7, 0xf7, 0x3, 0xaa,
+                                                          0x1b, 0x97, 0x8d, 0x83, 0x82, 0x8f, 0x1f, 0x82,
+                                                          0x90, 0x92, 0x81, 0xa1, 0x1b, 0x96, 0xaf, 0x8b,
+                                                          0xbf, 0xad, 0x72, 0x9a, 0x74, 0x4c, 0x39, 0xfb,
+                                                          0x6, 0x46, 0x70, 0x1f, 0x83, 0x77, 0x89, 0x8d,
+                                                          0xbc, 0xf7, 0x5b, 0x88, 0x8d, 0x5, 0x84, 0x5b,
+                                                          0x2f, 0x77, 0x7c, 0x1b, 0x7a, 0x7, 0x8d, 0x96,
+                                                          0x96, 0x8e, 0x96, 0x1b, 0xa3, 0x94, 0x7a, 0x73,
+                                                          0x73, 0x83, 0x6d, 0x84, 0x72, 0x1f, 0xe, 0xab,
+                                                          0x80, 0xa0, 0x89, 0x76, 0xf8, 0x43, 0xa2, 0x8c,
+                                                          0x77, 0x12, 0xf7, 0x1, 0xd4, 0xb9, 0xd7, 0x13,
+                                                          0x6c, 0xc2, 0xa, 0x9a, 0x9a, 0x86, 0x86, 0x9a,
+                                                          0x1f, 0x13, 0xac, 0x86, 0x9a, 0x99, 0x87, 0x9a,
+                                                          0x1b, 0xc3, 0xe8, 0xa4, 0xf7, 0x1, 0xb3, 0x70,
+                                                          0xb5, 0x6e, 0xb2, 0x1f, 0x6b, 0xb6, 0x69, 0xb3,
+                                                          0xac, 0x1a, 0xbc, 0xab, 0x94, 0xa1, 0xcc, 0xa8,
+                                                          0x49, 0x5a, 0x1e, 0x9b, 0x6, 0x13, 0x9c, 0xbb,
+                                                          0xa, 0x7d, 0x82, 0x8e, 0x8f, 0x80, 0x1f, 0x13,
+                                                          0xac, 0x90, 0x7e, 0x7d, 0x90, 0x73, 0x1b, 0x21,
+                                                          0x7d, 0x3b, 0x6c, 0x65, 0xa8, 0x60, 0xa9, 0x61,
+                                                          0x1f, 0xa9, 0x61, 0xa9, 0x62, 0x6a, 0xb4, 0xa,
+                                                          0xe, 0xd7, 0xa, 0xf8, 0x20, 0xab, 0xf7, 0x15,
+                                                          0x77, 0x1, 0xb0, 0xf7, 0x97, 0x3, 0xf7, 0x6a,
+                                                          0xf7, 0x9, 0x15, 0x6b, 0x72, 0x68, 0x5c, 0x77,
+                                                          0x1b, 0x86, 0x80, 0x8e, 0x97, 0x97, 0xa6, 0xeb,
+                                                          0xc7, 0xf7, 0x74, 0x1f, 0xe1, 0x6, 0x90, 0xab,
+                                                          0x5, 0x39, 0x6, 0xa9, 0xf7, 0x6, 0x5, 0x93,
+                                                          0x8d, 0x89, 0x92, 0x84, 0x1b, 0x82, 0x87, 0x84,
+                                                          0x86, 0x87, 0x1f, 0x6f, 0x68, 0x58, 0x53, 0x6b,
+                                                          0x7a, 0x8, 0x6b, 0x7a, 0x75, 0x91, 0x6d, 0x1a,
+                                                          0xd6, 0x6, 0x45, 0xfb, 0x9c, 0x5, 0x87, 0x7b,
+                                                          0x78, 0x4e, 0x7c, 0x1a, 0x6d, 0xa7, 0x81, 0x9f,
+                                                          0xbf, 0xb2, 0xb7, 0xd8, 0xbe, 0x1e, 0xe, 0x82,
+                                                          0xbe, 0x6b, 0x76, 0xf8, 0x58, 0xa9, 0xa, 0xd9,
+                                                          0x13, 0xa0, 0xf7, 0xe0, 0xf7, 0x77, 0x15, 0x13,
+                                                          0xb8, 0x4d, 0xa, 0x72, 0xa, 0x80, 0x8a, 0x96,
+                                                          0x90, 0x9a, 0x99, 0xb7, 0x90, 0x9f, 0x42, 0xa,
+                                                          0x84, 0x7c, 0x8f, 0x9e, 0x97, 0xaa, 0xf7, 0xc,
+                                                          0xc8, 0xf7, 0x86, 0x1f, 0x88, 0x8d, 0x5, 0x7f,
+                                                          0x59, 0x37, 0x7c, 0x7b, 0x1b, 0x13, 0x50, 0x5d,
+                                                          0xa, 0x13, 0x60, 0xa6, 0xa, 0xe2, 0x8e, 0x76,
+                                                          0xf8, 0x5f, 0x77, 0x12, 0xf7, 0x1c, 0xd2, 0xf7,
+                                                          0x3c, 0xbe, 0x17, 0xf7, 0x63, 0xd1, 0x15, 0x8a,
+                                                          0xc9, 0x83, 0xf7, 0x32, 0x69, 0xf7, 0x17, 0x8,
+                                                          0x9e, 0x86, 0x8a, 0x8c, 0x81, 0x87, 0xfb, 0x1,
+                                                          0x72, 0x7d, 0x1b, 0x7e, 0x7, 0xbc, 0xa2, 0x9e,
+                                                          0xfb, 0x4, 0xa0, 0x1f, 0x9b, 0x34, 0x91, 0xfb,
+                                                          0x4a, 0x6e, 0x1a, 0x7a, 0x8b, 0x7e, 0x94, 0x1e,
+                                                          0x13, 0x50, 0x9a, 0x9d, 0x9f, 0xd2, 0xcd, 0x1f,
+                                                          0xac, 0xae, 0xf7, 0x29, 0xf7, 0x46, 0xe7, 0x1a,
+                                                          0xb0, 0x73, 0xa5, 0x6a, 0x77, 0x7b, 0x7d, 0x7c,
+                                                          0x73, 0x93, 0x80, 0x94, 0x83, 0x1e, 0x97, 0x80,
+                                                          0x98, 0x85, 0x75, 0x1a, 0x59, 0x3b, 0xfb, 0xb,
+                                                          0x52, 0x50, 0x1e, 0xe, 0xf7, 0xca, 0x8e, 0x76,
+                                                          0xf8, 0x5e, 0x77, 0xa0, 0x77, 0x12, 0xf7, 0xd,
+                                                          0xd2, 0xf7, 0x38, 0xca, 0xf7, 0x49, 0xbb, 0x13,
+                                                          0xbc, 0xf7, 0x52, 0xf7, 0x15, 0x15, 0x9d, 0x84,
+                                                          0xf7, 0x13, 0x79, 0xf0, 0x1e, 0xc1, 0x81, 0x85,
+                                                          0x97, 0x85, 0x82, 0x29, 0x73, 0x77, 0x1b, 0x7d,
+                                                          0x7, 0xc4, 0x9c, 0x8e, 0x30, 0x94, 0x1f, 0x90,
+                                                          0x54, 0x9c, 0x3f, 0xfb, 0x2f, 0x1a, 0x7d, 0x8c,
+                                                          0x8a, 0x6a, 0x98, 0x1b, 0x9a, 0x92, 0xa0, 0xf7,
+                                                          0x40, 0xec, 0x1f, 0xb8, 0xda, 0xa3, 0xb5, 0x9d,
+                                                          0xab, 0x8, 0x8d, 0x6, 0xa8, 0xfb, 0xd0, 0x5,
+                                                          0x7b, 0x8c, 0x8b, 0x7d, 0x96, 0x1b, 0x96, 0x98,
+                                                          0x9e, 0xbb, 0xb3, 0x1f, 0xb9, 0xc1, 0xf7, 0x2f,
+                                                          0xf7, 0x57, 0xe2, 0x1a, 0xa8, 0x7b, 0xa6, 0x66,
+                                                          0x6e, 0x82, 0x79, 0x7a, 0x7a, 0x96, 0x82, 0x96,
+                                                          0x81, 0x1e, 0x96, 0x81, 0x95, 0x81, 0x79, 0x1a,
+                                                          0x57, 0x3e, 0x2a, 0x33, 0xfb, 0x1, 0x1e, 0x6b,
+                                                          0xf7, 0xfb, 0x5, 0x13, 0xdc, 0x8d, 0x8a, 0x8b,
+                                                          0x90, 0x84, 0x1b, 0x85, 0x88, 0x87, 0x86, 0x88,
+                                                          0x1f, 0xfb, 0x53, 0xfb, 0xc2, 0x5, 0xe, 0xe2,
+                                                          0x80, 0xc2, 0xf8, 0x21, 0x77, 0x1, 0x70, 0xf8,
+                                                          0x6e, 0x3, 0xf7, 0x62, 0xf7, 0x44, 0x15, 0xa9,
+                                                          0xfb, 0xc, 0x5, 0x56, 0x98, 0x9a, 0x7d, 0xa8,
+                                                          0x1b, 0xa2, 0xa8, 0x8b, 0xf7, 0x6, 0xd2, 0x1f,
+                                                          0x7d, 0x93, 0x5, 0x6d, 0x70, 0x77, 0x66, 0x76,
+                                                          0x1b, 0x77, 0x84, 0xa4, 0x9b, 0x87, 0x1f, 0x85,
+                                                          0xa4, 0x69, 0xf7, 0x1c, 0x9d, 0x1a, 0x8b, 0xcf,
+                                                          0xf7, 0xd, 0xa8, 0x96, 0x92, 0x87, 0x87, 0x92,
+                                                          0x1e, 0x87, 0x93, 0x93, 0x86, 0x97, 0x1b, 0xa3,
+                                                          0x95, 0x9e, 0x9d, 0xa3, 0x75, 0x97, 0x78, 0x57,
+                                                          0x5c, 0x4e, 0x39, 0x57, 0x1f, 0x80, 0xc2, 0x5,
+                                                          0xe3, 0x79, 0x7c, 0x8b, 0x75, 0x1b, 0x6b, 0x49,
+                                                          0x73, 0x82, 0x70, 0x1f, 0x8f, 0x7c, 0x5, 0x93,
+                                                          0xab, 0x99, 0x8e, 0x94, 0x1b, 0xa6, 0x97, 0x73,
+                                                          0x6c, 0x94, 0x1f, 0x8c, 0x86, 0xa5, 0xfb, 0xf,
+                                                          0x82, 0x1a, 0xfb, 0x17, 0x31, 0x71, 0x69, 0x7a,
+                                                          0x1b, 0x82, 0x82, 0x90, 0x90, 0x81, 0x1f, 0x90,
+                                                          0x82, 0x81, 0x8f, 0x80, 0x1b, 0x75, 0x7f, 0x79,
+                                                          0x7b, 0x73, 0x9b, 0x78, 0xac, 0xaa, 0x97, 0x96,
+                                                          0x9e, 0x9c, 0x1f, 0xad, 0xb0, 0xb5, 0xc1, 0xbb,
+                                                          0xcd, 0x8, 0xe, 0xe2, 0xfb, 0x4d, 0x76, 0xf9,
+                                                          0x1b, 0x77, 0x12, 0xf8, 0x1d, 0xc7, 0xa, 0xcf,
+                                                          0x7e, 0x5d, 0xf7, 0x11, 0x7e, 0x7e, 0xfb, 0x12,
+                                                          0x73, 0x86, 0x1b, 0x13, 0xe0, 0x98, 0xa, 0x9f,
+                                                          0x4c, 0xe2, 0xa, 0xae, 0xfb, 0x2f, 0x7a, 0xa,
+                                                          0x83, 0x85, 0x90, 0x91, 0x83, 0x1f, 0x93, 0x81,
+                                                          0x7f, 0x94, 0x7a, 0x96, 0xa, 0x70, 0xa, 0x76,
+                                                          0x96, 0x83, 0x97, 0x83, 0x1f, 0x9a, 0x82, 0x9b,
+                                                          0x84, 0x74, 0xa7, 0xa, 0xe, 0xab, 0x4f, 0x76,
+                                                          0xf8, 0x55, 0xc7, 0x1, 0xba, 0xa, 0xb1, 0xb2,
+                                                          0x71, 0x74, 0xb2, 0x1f, 0x78, 0xac, 0xad, 0x79,
+                                                          0xad, 0xaf, 0xa, 0x81, 0x8e, 0x83, 0x8e, 0x85,
+                                                          0x1f, 0x8f, 0x83, 0x8f, 0x85, 0x85, 0x1a, 0x7e,
+                                                          0x7b, 0x88, 0x7f, 0x81, 0x74, 0x8b, 0xac, 0x75,
+                                                          0x1e, 0xce, 0x5f, 0x50, 0xac, 0x6b, 0x1b, 0xf7,
+                                                          0xb6, 0xf7, 0xec, 0x5, 0xca, 0xa, 0x8e, 0x94,
+                                                          0xc3, 0xdd, 0x1e, 0xf7, 0x1c, 0x6, 0xe, 0xdd,
+                                                          0xa, 0xbe, 0xd6, 0x82, 0xd6, 0x13, 0xe0, 0xf7,
+                                                          0x47, 0xfb, 0x3a, 0x15, 0x6b, 0x93, 0x76, 0x9b,
+                                                          0xb9, 0x1a, 0x13, 0xd0, 0xb3, 0xcd, 0xf7, 0x61,
+                                                          0xb4, 0x1a, 0xb3, 0x69, 0x9b, 0x78, 0x93, 0x1e,
+                                                          0x8c, 0x8d, 0xcf, 0x9c, 0xa2, 0xb2, 0x9e, 0xd3,
+                                                          0x19, 0xb8, 0xf7, 0x3c, 0x5, 0xe6, 0xa3, 0xc0,
+                                                          0xac, 0xab, 0x1b, 0x8e, 0x96, 0x5, 0x2f, 0x50,
+                                                          0x7c, 0xfb, 0xc, 0x69, 0x1f, 0x5a, 0xfb, 0x3e,
+                                                          0x79, 0x4b, 0x77, 0x5e, 0x45, 0x79, 0x19, 0xb6,
+                                                          0x7d, 0x94, 0x78, 0x6d, 0x1a, 0x13, 0xe0, 0x52,
+                                                          0x49, 0xfb, 0x49, 0x5a, 0x1a, 0x54, 0xaa, 0x70,
+                                                          0xe9, 0x1e, 0xe, 0x39, 0xfb, 0x27, 0x76, 0xf7,
+                                                          0x3f, 0xe0, 0xa, 0x9a, 0xfb, 0x3c, 0x15, 0xb6,
+                                                          0x6, 0xf7, 0x6c, 0xf9, 0xd6, 0x5, 0x62, 0x6,
+                                                          0xe, 0xdd, 0xa, 0xf7, 0xa6, 0xd6, 0x42, 0xd6,
+                                                          0x13, 0xd0, 0x87, 0xfb, 0x3a, 0x15, 0x88, 0x80,
+                                                          0x5, 0xe7, 0xc9, 0x9a, 0xf7, 0xc, 0xac, 0x1f,
+                                                          0xba, 0xf7, 0x3e, 0x9c, 0xcb, 0xa0, 0xb8, 0xd1,
+                                                          0x9d, 0x19, 0x60, 0x99, 0x82, 0x9e, 0xa9, 0x1a,
+                                                          0x13, 0xe0, 0xc4, 0xcd, 0xf7, 0x49, 0xbc, 0x1a,
+                                                          0xc2, 0x6c, 0xa6, 0x2d, 0x1e, 0x88, 0x80, 0x5,
+                                                          0xa1, 0xaa, 0x73, 0x5d, 0x1f, 0x13, 0xd0, 0x63,
+                                                          0x49, 0xfb, 0x61, 0x62, 0x1a, 0x63, 0xad, 0x7b,
+                                                          0x9e, 0x83, 0x1e, 0x8a, 0x89, 0x47, 0x7a, 0x74,
+                                                          0x64, 0x78, 0x43, 0x19, 0x5e, 0xfb, 0x3c, 0x5,
+                                                          0x31, 0x73, 0x56, 0x69, 0x6b, 0x1b, 0xe, 0xf7,
+                                                          0x4c, 0xf7, 0x4f, 0xcb, 0x5c, 0x76, 0xd3, 0xcb,
+                                                          0x8f, 0x77, 0x12, 0xb3, 0xf8, 0x62, 0x13, 0x68,
+                                                          0xd7, 0xf7, 0x4b, 0x15, 0xae, 0x9b, 0xa3, 0xb0,
+                                                          0xb7, 0x1b, 0xb9, 0xa9, 0x7d, 0x7b, 0xa7, 0x1f,
+                                                          0x13, 0x98, 0x79, 0xac, 0xa9, 0x77, 0xbd, 0x1b,
+                                                          0xc9, 0xac, 0xb7, 0xb5, 0xa9, 0x1f, 0x67, 0xbd,
+                                                          0x5, 0x68, 0x74, 0x72, 0x66, 0x63, 0x1b, 0x69,
+                                                          0x6c, 0x99, 0x9b, 0x6c, 0x1f, 0x13, 0x68, 0x9d,
+                                                          0x67, 0x66, 0x9f, 0x5f, 0x1b, 0x48, 0x67, 0x5f,
+                                                          0x61, 0x75, 0x1f, 0xe, 0xab, 0xfb, 0x4c, 0x76,
+                                                          0xf8, 0xd0, 0xf5, 0x1, 0xf7, 0x6c, 0xf5, 0x3,
+                                                          0xf7, 0x6c, 0xf8, 0x38, 0x15, 0x6e, 0xa3, 0x73,
+                                                          0xa8, 0xa8, 0xa3, 0xa3, 0xa8, 0xa8, 0x73, 0xa3,
+                                                          0x6e, 0x6e, 0x73, 0x73, 0x6e, 0x1e, 0x94, 0xfb,
+                                                          0x1a, 0x15, 0x51, 0xfb, 0x32, 0x58, 0xfb, 0xa,
+                                                          0x5f, 0xfb, 0x10, 0x8, 0x84, 0x78, 0x85, 0x7d,
+                                                          0x7c, 0x1a, 0x75, 0x9e, 0x76, 0x9d, 0xb5, 0x95,
+                                                          0x9c, 0xc0, 0x96, 0x1e, 0xa5, 0xf7, 0x10, 0xa2,
+                                                          0xf7, 0x18, 0xad, 0xf7, 0x35, 0x8, 0xe, 0x81,
+                                                          0xae, 0x80, 0x76, 0xf8, 0x3c, 0xa2, 0x12, 0xd8,
+                                                          0xe1, 0x13, 0xb0, 0xf7, 0x1d, 0xfb, 0x23, 0xb7,
+                                                          0xa, 0xba, 0xf7, 0x19, 0x5, 0xf7, 0x16, 0xb5,
+                                                          0xdb, 0xa5, 0xa5, 0x1f, 0x7b, 0x95, 0x5, 0x64,
+                                                          0x69, 0x57, 0x61, 0x57, 0x1b, 0x13, 0x70, 0x81,
+                                                          0x80, 0x8c, 0x8e, 0x81, 0x1f, 0xf7, 0x1d, 0xf8,
+                                                          0x1b, 0x5, 0x9c, 0x9d, 0x85, 0x7d, 0x82, 0x87,
+                                                          0x82, 0x87, 0x81, 0x1f, 0x88, 0x82, 0x87, 0x81,
+                                                          0x7f, 0x97, 0xa, 0xa9, 0x74, 0xbd, 0x3e, 0x1e,
+                                                          0xb5, 0xf7, 0xc, 0x5, 0x6d, 0x6, 0x61, 0xfb,
+                                                          0xc, 0x5, 0x13, 0x50, 0xfb, 0x12, 0xfb, 0x1f,
+                                                          0xfb, 0x32, 0xfb, 0x1b, 0x1f, 0x13, 0x70, 0xfb,
+                                                          0x6, 0xd3, 0x63, 0xaf, 0x1e, 0x9c, 0xbb, 0x15,
+                                                          0x71, 0x9e, 0x7e, 0xaf, 0xbe, 0x1a, 0xf2, 0xe2,
+                                                          0xf7, 0x3b, 0xdf, 0x1e, 0xe, 0x7b, 0xa1, 0x7f,
+                                                          0xd3, 0xa9, 0xa7, 0xf7, 0x61, 0xb5, 0xf7, 0xa2,
+                                                          0xa8, 0x12, 0x13, 0xb8, 0xf7, 0x34, 0xf7, 0x7,
+                                                          0x15, 0x96, 0x63, 0x8b, 0x8b, 0x76, 0x1b, 0x49,
+                                                          0x74, 0x5f, 0x79, 0x59, 0xa7, 0x77, 0xb2, 0xb7,
+                                                          0xa7, 0xaf, 0xa6, 0xa1, 0x1f, 0x4e, 0xd6, 0xb3,
+                                                          0x89, 0xaa, 0x1b, 0xf3, 0xad, 0xe5, 0x92, 0x8d,
+                                                          0x1f, 0x80, 0x94, 0x5, 0x13, 0x78, 0x70, 0x66,
+                                                          0x66, 0x84, 0x68, 0x1b, 0x56, 0x55, 0x9d, 0x9f,
+                                                          0x6a, 0x1f, 0xb8, 0xec, 0x91, 0xa4, 0xa4, 0xf2,
+                                                          0x8, 0xf7, 0x12, 0x6, 0x92, 0xb5, 0x5, 0xfb,
+                                                          0xf, 0x6, 0x9d, 0xed, 0x96, 0xc9, 0xa3, 0xc2,
+                                                          0x8, 0xa1, 0x95, 0x9b, 0xac, 0xb4, 0x1b, 0xa2,
+                                                          0x97, 0x7e, 0x6c, 0x8f, 0x1f, 0x6d, 0x8e, 0x93,
+                                                          0x7d, 0xa4, 0x1b, 0x9e, 0x9f, 0x93, 0xad, 0xb1,
+                                                          0x6b, 0xb0, 0x50, 0xfb, 0x3e, 0x56, 0xfb, 0x76,
+                                                          0x42, 0x82, 0x1f, 0xfb, 0x2, 0x6, 0x82, 0x61,
+                                                          0x5, 0xf7, 0x5, 0x6, 0x61, 0xfb, 0x94, 0x15,
+                                                          0x13, 0xb8, 0x6c, 0x83, 0x67, 0x71, 0x73, 0x1b,
+                                                          0x69, 0x7f, 0xa0, 0x9b, 0x90, 0x8e, 0xb3, 0xbd,
+                                                          0xa5, 0x99, 0x81, 0x7c, 0xa0, 0x1f, 0xe, 0xf7,
+                                                          0x18, 0xc4, 0xf7, 0xa4, 0xc4, 0x1, 0xc4, 0xc8,
+                                                          0xf7, 0x9c, 0xc8, 0x3, 0xf7, 0xa, 0xf7, 0xda,
+                                                          0x15, 0xd3, 0xc4, 0xca, 0xd7, 0xd6, 0xc3, 0x4c,
+                                                          0x43, 0x41, 0x53, 0x4c, 0x40, 0x3f, 0x52, 0xca,
+                                                          0xd5, 0x1e, 0x47, 0xfb, 0x8a, 0x15, 0xe2, 0xe3,
+                                                          0x5, 0x73, 0xa5, 0xb9, 0x7f, 0xb7, 0x1b, 0xb6,
+                                                          0xb5, 0x97, 0xa3, 0xa4, 0x1f, 0xe4, 0x33, 0xb6,
+                                                          0xb8, 0x34, 0xe2, 0x5, 0xa2, 0xa6, 0x97, 0xb6,
+                                                          0xb6, 0x1a, 0xb6, 0x80, 0xb6, 0x73, 0xa6, 0x1e,
+                                                          0xe2, 0xe4, 0x60, 0xb6, 0x32, 0x34, 0x5, 0xa3,
+                                                          0x71, 0x5f, 0x96, 0x60, 0x1b, 0x60, 0x5f, 0x7f,
+                                                          0x74, 0x71, 0x1f, 0x34, 0xe2, 0x5e, 0x60, 0xe3,
+                                                          0x32, 0x5, 0x73, 0x71, 0x7f, 0x5f, 0x5f, 0x1a,
+                                                          0x60, 0x97, 0x60, 0xa3, 0x71, 0x1e, 0x33, 0x34,
+                                                          0x5, 0xe, 0xa0, 0x76, 0xf7, 0x4a, 0xb3, 0xe5,
+                                                          0xb3, 0xf7, 0xc1, 0x77, 0x1, 0xbf, 0x16, 0xf7,
+                                                          0xb1, 0x9b, 0x6, 0x53, 0x6a, 0xa0, 0xb7, 0x91,
+                                                          0x8c, 0x91, 0x8d, 0x91, 0x1f, 0x92, 0xa7, 0x8f,
+                                                          0x96, 0x99, 0xb7, 0x8, 0xf7, 0x48, 0x6, 0x97,
+                                                          0xb3, 0x5, 0xfb, 0x48, 0x6, 0xa3, 0xdd, 0x91,
+                                                          0x93, 0x5, 0xf7, 0x3e, 0x6, 0x97, 0xb3, 0x5,
+                                                          0xfb, 0x2b, 0x6, 0xf7, 0x32, 0xf7, 0x74, 0x5,
+                                                          0xb3, 0xab, 0xaa, 0xa0, 0x95, 0x1b, 0xe8, 0xa,
+                                                          0xa8, 0xab, 0x7c, 0x74, 0x84, 0x89, 0x83, 0x87,
+                                                          0x83, 0x1f, 0x77, 0x64, 0x35, 0xfb, 0x1a, 0x5c,
+                                                          0x53, 0x72, 0xe7, 0x61, 0xf5, 0x86, 0xa5, 0x8,
+                                                          0x89, 0x95, 0x8a, 0x94, 0x93, 0x1a, 0xaa, 0x9f,
+                                                          0x93, 0xbf, 0xcd, 0xa, 0xa3, 0xb7, 0x8d, 0x47,
+                                                          0x9f, 0x1f, 0xd4, 0xfb, 0x6f, 0x5, 0xfb, 0x20,
+                                                          0x6, 0x7f, 0x63, 0x5, 0xf7, 0x37, 0x6, 0x8e,
+                                                          0x81, 0x74, 0x3b, 0x5, 0xfb, 0x38, 0x6, 0x7f,
+                                                          0x63, 0x5, 0xf7, 0x39, 0x6, 0x73, 0x39, 0x5,
+                                                          0x48, 0x77, 0x50, 0x7a, 0x6a, 0x1b, 0xe, 0x39,
+                                                          0x8e, 0xe0, 0xa, 0xf7, 0x36, 0xf8, 0x1c, 0x15,
+                                                          0xb3, 0x6, 0xdd, 0xf7, 0xa6, 0x5, 0x65, 0x6,
+                                                          0xfb, 0x5d, 0xfd, 0x40, 0x15, 0xb5, 0x6, 0xd5,
+                                                          0xf7, 0x93, 0x5, 0x5e, 0x6, 0xe, 0xfb, 0x29,
+                                                          0xa0, 0xf7, 0x78, 0xa0, 0xf7, 0x9f, 0xa0, 0xe8,
+                                                          0xf7, 0x38, 0x7c, 0xa0, 0x12, 0xc0, 0xf2, 0x49,
+                                                          0xc4, 0xb0, 0xc8, 0xb5, 0xc5, 0xab, 0xc5, 0x13,
+                                                          0xed, 0xc0, 0xf7, 0xae, 0xf3, 0x15, 0x8d, 0x8e,
+                                                          0x5, 0x86, 0x96, 0x90, 0x89, 0xa0, 0x1b, 0xcf,
+                                                          0xb9, 0xc2, 0xd1, 0xc5, 0x70, 0xb3, 0x7d, 0x9c,
+                                                          0x1f, 0xfb, 0xf, 0xf7, 0x2a, 0x5, 0x7c, 0x9e,
+                                                          0x80, 0xa3, 0xa7, 0x1a, 0xca, 0xba, 0xa0, 0xbb,
+                                                          0xac, 0xa3, 0x7c, 0x7b, 0x81, 0x80, 0x82, 0x82,
+                                                          0x7f, 0x1e, 0x83, 0x81, 0x85, 0x80, 0x7b, 0x1a,
+                                                          0x13, 0xf3, 0xc0, 0x79, 0x98, 0x71, 0xac, 0xb6,
+                                                          0x94, 0xb7, 0xa0, 0xc0, 0x5c, 0xb9, 0x38, 0x41,
+                                                          0x42, 0x61, 0x37, 0x5e, 0xa3, 0x60, 0xb6, 0x58,
+                                                          0x1e, 0x89, 0x88, 0x5, 0x95, 0x76, 0x70, 0x8c,
+                                                          0x86, 0x1b, 0x55, 0x57, 0x5a, 0x3d, 0x60, 0xa4,
+                                                          0x56, 0xb9, 0x56, 0x1f, 0xd7, 0x34, 0x5, 0xb6,
+                                                          0x5a, 0x92, 0x76, 0x6f, 0x1a, 0x5a, 0x66, 0x63,
+                                                          0x47, 0x67, 0x6b, 0x9e, 0x9c, 0x95, 0x95, 0x92,
+                                                          0x95, 0x94, 0x1e, 0x13, 0xed, 0xc0, 0x96, 0x95,
+                                                          0x96, 0x97, 0xa4, 0x1a, 0xad, 0x73, 0x95, 0x75,
+                                                          0x52, 0x8b, 0x51, 0x80, 0x5c, 0xba, 0x51, 0xe7,
+                                                          0xd5, 0xda, 0xbe, 0xdf, 0xbe, 0x76, 0xa5, 0x61,
+                                                          0xc1, 0x1e, 0x13, 0xeb, 0xc0, 0xfb, 0x1b, 0xf7,
+                                                          0x6e, 0x15, 0xb5, 0xae, 0xa3, 0xa9, 0xa9, 0xa6,
+                                                          0x80, 0x4a, 0xbe, 0x1e, 0xbf, 0x49, 0x90, 0x6e,
+                                                          0x71, 0x1a, 0x58, 0x5f, 0x78, 0x75, 0x52, 0x20,
+                                                          0xf7, 0x17, 0xd1, 0x1e, 0xe, 0x73, 0xf8, 0x90,
+                                                          0xed, 0x1, 0xf6, 0xc6, 0xa, 0x3, 0xf6, 0xf8,
+                                                          0xc1, 0x23, 0xa, 0xf8, 0x27, 0x79, 0xb5, 0xf7,
+                                                          0x4, 0x9f, 0xf7, 0xef, 0x9f, 0xf0, 0xb5, 0x1,
+                                                          0xb4, 0xc2, 0xea, 0xd8, 0xf7, 0x89, 0x9b, 0xf7,
+                                                          0x1b, 0xc2, 0x3, 0xb4, 0xf7, 0xd7, 0x15, 0xfb,
+                                                          0x51, 0xf7, 0x29, 0xfb, 0x2c, 0xf7, 0x54, 0xf7,
+                                                          0x52, 0xf7, 0x27, 0xf7, 0x2c, 0xf7, 0x51, 0xf7,
+                                                          0x51, 0xfb, 0x27, 0xf7, 0x2e, 0xfb, 0x52, 0xfb,
+                                                          0x54, 0xfb, 0x29, 0xfb, 0x2e, 0xfb, 0x51, 0x1e,
+                                                          0xc2, 0x16, 0xf7, 0x33, 0xf7, 0x11, 0xf7, 0x22,
+                                                          0xf7, 0x35, 0xf7, 0x32, 0xf7, 0x10, 0xfb, 0x21,
+                                                          0xfb, 0x34, 0xfb, 0x33, 0xfb, 0x11, 0xfb, 0x20,
+                                                          0xfb, 0x31, 0xfb, 0x34, 0xfb, 0x12, 0xf7, 0x20,
+                                                          0xf7, 0x33, 0x1e, 0xf8, 0x47, 0x42, 0x15, 0x5e,
+                                                          0x78, 0x66, 0x5a, 0x49, 0x1b, 0x26, 0x62, 0xd7,
+                                                          0xf3, 0x8c, 0x1f, 0xeb, 0x8c, 0xb5, 0xd2, 0xe8,
+                                                          0x1b, 0xd8, 0xa6, 0x5d, 0x61, 0x90, 0x1f, 0x9b,
+                                                          0xd0, 0x6, 0x93, 0x86, 0x93, 0x7b, 0x90, 0x1e,
+                                                          0x93, 0x71, 0x72, 0x95, 0x59, 0x1b, 0xfb, 0x2a,
+                                                          0x49, 0xfb, 0x1, 0x39, 0xfb, 0x20, 0xea, 0x53,
+                                                          0xf7, 0x6, 0xb9, 0xb2, 0x95, 0x92, 0x9e, 0x1f,
+                                                          0x9b, 0x8f, 0x94, 0x8e, 0x8c, 0x97, 0x9c, 0xd9,
+                                                          0x18, 0xe, 0x3a, 0xf8, 0x2a, 0xad, 0xf7, 0x80,
+                                                          0x77, 0x12, 0xb5, 0xd4, 0xf7, 0x26, 0xaf, 0x13,
+                                                          0xe0, 0xf7, 0x87, 0xf8, 0x7a, 0x15, 0x80, 0x70,
+                                                          0x88, 0x7e, 0x7d, 0x1a, 0x81, 0x90, 0x7b, 0xa6,
+                                                          0xa7, 0xa1, 0xa1, 0xb7, 0xb2, 0x1e, 0x13, 0x70,
+                                                          0x84, 0x95, 0x5, 0x6f, 0x71, 0x7e, 0x80, 0x84,
+                                                          0x1b, 0x86, 0x8e, 0x9a, 0x99, 0x8e, 0x1f, 0x13,
+                                                          0xe0, 0x90, 0xa9, 0xba, 0xf7, 0x3a, 0x8d, 0x92,
+                                                          0x56, 0x8a, 0x18, 0x7f, 0x64, 0x5, 0x89, 0x6,
+                                                          0x9b, 0x89, 0x7a, 0xa4, 0x65, 0x1b, 0x35, 0x27,
+                                                          0xfb, 0x3, 0x33, 0x79, 0x92, 0x56, 0xd1, 0xb8,
+                                                          0xac, 0x9d, 0xca, 0xb7, 0x1f, 0xfb, 0x12, 0x89,
+                                                          0x15, 0xbd, 0xcc, 0xf7, 0xf, 0xd2, 0x98, 0x90,
+                                                          0x81, 0x64, 0x87, 0x1e, 0x5a, 0x86, 0x57, 0xfb,
+                                                          0xc, 0x4a, 0x1b, 0x83, 0x77, 0x95, 0xae, 0x1f,
+                                                          0xe, 0xce, 0xa, 0xc0, 0xf7, 0x6c, 0x68, 0xa,
+                                                          0x93, 0x78, 0xbb, 0x75, 0xbd, 0x1f, 0x81, 0xa2,
+                                                          0x80, 0xa3, 0x81, 0x9e, 0xa1, 0xa2, 0x9e, 0x9f,
+                                                          0x9b, 0x9c, 0x8, 0xd6, 0xdc, 0x99, 0xa2, 0x99,
+                                                          0x69, 0xa, 0xf7, 0x36, 0x82, 0x68, 0xa, 0x93,
+                                                          0x76, 0xc2, 0x73, 0xc0, 0x1f, 0x82, 0x9f, 0x82,
+                                                          0x9e, 0x82, 0x9c, 0xa2, 0xa3, 0x9f, 0xa0, 0x9c,
+                                                          0x9d, 0x8, 0xd4, 0xd9, 0x98, 0xa2, 0x99, 0x69,
+                                                          0xa, 0xe, 0xf7, 0xd2, 0xf7, 0x15, 0x76, 0xf7,
+                                                          0x84, 0xb1, 0x12, 0xf8, 0x92, 0xcf, 0x6d, 0xb5,
+                                                          0x13, 0xe0, 0xe1, 0xf7, 0xf0, 0x15, 0x13, 0xd0,
+                                                          0xf8, 0x62, 0xfb, 0x84, 0xb5, 0xf7, 0xaa, 0xfc,
+                                                          0x8c, 0x6, 0xe, 0xf8, 0x27, 0x79, 0xb5, 0xf7,
+                                                          0xe, 0x9a, 0x7c, 0xf7, 0x35, 0xfb, 0x35, 0xf7,
+                                                          0x47, 0xfb, 0x3e, 0xf7, 0x3e, 0xf7, 0x3b, 0xf7,
+                                                          0x42, 0x51, 0xb5, 0x71, 0xb5, 0x12, 0xb4, 0xc2,
+                                                          0x5f, 0xc2, 0xf7, 0x36, 0xcb, 0xf3, 0xce, 0x4e,
+                                                          0xce, 0xf7, 0x2e, 0xc2, 0x13, 0x92, 0x74, 0xf7,
+                                                          0xe1, 0xf7, 0xd9, 0x15, 0x13, 0x94, 0x74, 0xf7,
+                                                          0x3b, 0xb4, 0x7, 0x13, 0x92, 0x6c, 0xb1, 0xaa,
+                                                          0x78, 0x52, 0x56, 0x78, 0x65, 0x5a, 0x1f, 0x13,
+                                                          0x92, 0xb4, 0xfb, 0xe2, 0x16, 0xfb, 0x51, 0xf7,
+                                                          0x29, 0xfb, 0x2e, 0xf7, 0x54, 0xf7, 0x52, 0xf7,
+                                                          0x27, 0xf7, 0x2f, 0xf7, 0x51, 0x1e, 0x13, 0x91,
+                                                          0x74, 0xf7, 0x51, 0xfb, 0x27, 0xf7, 0x2b, 0xfb,
+                                                          0x52, 0x1e, 0x13, 0x92, 0xb4, 0xfb, 0x54, 0xfb,
+                                                          0x29, 0xfb, 0x2c, 0xfb, 0x51, 0x1f, 0xc2, 0x16,
+                                                          0x13, 0x91, 0x74, 0xf7, 0x33, 0xf7, 0x11, 0xf7,
+                                                          0x20, 0xf7, 0x35, 0xf7, 0x32, 0xf7, 0x10, 0xfb,
+                                                          0x1e, 0xfb, 0x34, 0xfb, 0x33, 0xfb, 0x11, 0xfb,
+                                                          0x23, 0xfb, 0x31, 0x1e, 0x13, 0x92, 0xb4, 0xfb,
+                                                          0x34, 0xfb, 0x12, 0xf7, 0x22, 0xf7, 0x33, 0x1f,
+                                                          0xf7, 0x11, 0xfb, 0x47, 0x15, 0xf7, 0x34, 0x6,
+                                                          0x13, 0xc2, 0x74, 0x9a, 0x7, 0x59, 0x90, 0x8d,
+                                                          0x8b, 0xb6, 0x1a, 0x13, 0xa2, 0x74, 0xed, 0xba,
+                                                          0x7, 0x2e, 0xca, 0xa4, 0x47, 0xab, 0x1b, 0xca,
+                                                          0x6, 0x13, 0x8a, 0x74, 0x94, 0x7, 0x78, 0x99,
+                                                          0x6d, 0xad, 0x71, 0xaf, 0x52, 0xd9, 0x18, 0x13,
+                                                          0xc2, 0x6c, 0xb8, 0x9a, 0xad, 0xb1, 0xbe, 0x1a,
+                                                          0xc9, 0x54, 0xa7, 0x50, 0x1e, 0xfb, 0x43, 0x7c,
+                                                          0x6, 0xbc, 0x86, 0x8a, 0x8c, 0x5f, 0x1a, 0xfb,
+                                                          0x83, 0x7, 0x60, 0x8c, 0x8b, 0x5a, 0x86, 0x1e,
+                                                          0xe, 0x73, 0xf8, 0xa8, 0xbe, 0x1, 0xee, 0xf7,
+                                                          0xcc, 0x3, 0xee, 0xf8, 0xa8, 0x15, 0xf7, 0xbf,
+                                                          0x6, 0x98, 0xbe, 0x5, 0xfb, 0xbf, 0x6, 0xe,
+                                                          0xb6, 0xf8, 0x1a, 0xad, 0xf7, 0x6e, 0xad, 0x1,
+                                                          0xf0, 0xb2, 0xf7, 0x64, 0xb2, 0x3, 0xf7, 0x20,
+                                                          0xf8, 0xab, 0x15, 0xc5, 0xb9, 0xbc, 0xc5, 0xc5,
+                                                          0xb9, 0x5c, 0x51, 0x51, 0x5d, 0x54, 0x51, 0x51,
+                                                          0x5d, 0xc0, 0xc5, 0x1e, 0x64, 0x16, 0x3b, 0xca,
+                                                          0x4a, 0xdb, 0xdb, 0xca, 0xce, 0xdb, 0xdb, 0x4c,
+                                                          0xc6, 0x3b, 0x3b, 0x4c, 0x4e, 0x3b, 0x1e, 0xe,
+                                                          0xf7, 0xd2, 0x8b, 0xce, 0xf7, 0x69, 0xcf, 0x54,
+                                                          0xb8, 0xf7, 0x3c, 0x77, 0x12, 0xf7, 0xc5, 0xcf,
+                                                          0x53, 0xb6, 0x13, 0xd8, 0xe1, 0x16, 0xf8, 0x8c,
+                                                          0xb5, 0xfc, 0x8c, 0x6, 0x13, 0xb8, 0xf7, 0x8f,
+                                                          0x4, 0x13, 0xb4, 0xf7, 0x7b, 0xfb, 0x3f, 0xb6,
+                                                          0xf7, 0x3f, 0xf7, 0x7a, 0xb8, 0xfb, 0x7a, 0xf7,
+                                                          0x3c, 0x60, 0xfb, 0x3c, 0xfb, 0x7b, 0x6, 0xe,
+                                                          0x52, 0xf7, 0xa3, 0xc0, 0xf7, 0xc1, 0xbe, 0x1,
+                                                          0xac, 0xf7, 0xa3, 0xc1, 0xa, 0x77, 0x7e, 0x60,
+                                                          0x1b, 0x29, 0x95, 0xa, 0xc2, 0x46, 0x79, 0x36,
+                                                          0x89, 0x75, 0xa, 0xe, 0x52, 0xf7, 0xa0, 0xb2,
+                                                          0x64, 0xd8, 0xf7, 0x24, 0x94, 0x82, 0xf7, 0x4f,
+                                                          0x6b, 0xab, 0x12, 0xf7, 0x82, 0xca, 0x6e, 0xce,
+                                                          0x13, 0x54, 0xf7, 0x11, 0xf8, 0x7d, 0x15, 0xc3,
+                                                          0xc4, 0x79, 0x37, 0x47, 0x4e, 0x77, 0x75, 0x7c,
+                                                          0x84, 0x95, 0x95, 0x83, 0x1f, 0x98, 0x81, 0x80,
+                                                          0x98, 0x70, 0x1b, 0x13, 0xac, 0x6c, 0x88, 0xa5,
+                                                          0xa, 0x7b, 0x93, 0x1f, 0x87, 0x8d, 0x5, 0x13,
+                                                          0x6a, 0xc9, 0xa, 0x66, 0x5a, 0x72, 0x67, 0x7b,
+                                                          0x1e, 0x83, 0xa, 0x73, 0xf8, 0x97, 0x76, 0xf7,
+                                                          0x3e, 0x77, 0x1, 0xf7, 0x48, 0xad, 0xa, 0xf7,
+                                                          0x33, 0xeb, 0x9f, 0xa, 0x9d, 0x9c, 0x9a, 0x1a,
+                                                          0x9d, 0x7d, 0x9c, 0x76, 0x80, 0x76, 0x7d, 0x9d,
+                                                          0xa, 0xe, 0xfb, 0x50, 0x76, 0xf7, 0x5b, 0xc2,
+                                                          0xf8, 0x13, 0x77, 0x1, 0x6d, 0xf4, 0xf7, 0x99,
+                                                          0xde, 0x3, 0xd9, 0xc7, 0x15, 0x4f, 0x9d, 0xbf,
+                                                          0x81, 0xaa, 0x1b, 0xbe, 0xcc, 0xb9, 0xbe, 0xb2,
+                                                          0x1f, 0x8d, 0x6, 0x89, 0x81, 0x85, 0x77, 0x81,
+                                                          0x1a, 0x68, 0x9d, 0x75, 0xaf, 0xaf, 0xa9, 0x95,
+                                                          0xba, 0xb7, 0x1e, 0x8e, 0x94, 0x5, 0x76, 0x71,
+                                                          0x7b, 0x86, 0x7c, 0x1b, 0x67, 0x98, 0xb4, 0xa0,
+                                                          0x8f, 0x1f, 0xd9, 0xf7, 0xe4, 0x5, 0x33, 0x6,
+                                                          0x47, 0xfb, 0xc3, 0x5, 0x72, 0x7a, 0x53, 0x54,
+                                                          0x58, 0x1b, 0x4f, 0x77, 0xb8, 0xc1, 0x96, 0x1f,
+                                                          0xce, 0xf7, 0xb0, 0x5, 0x33, 0x6, 0x36, 0xfc,
+                                                          0xa, 0x84, 0x6b, 0x7f, 0x68, 0x7c, 0x6a, 0x19,
+                                                          0x7d, 0x6c, 0x73, 0x66, 0x5a, 0x1a, 0x72, 0x91,
+                                                          0x76, 0xa7, 0xcb, 0x92, 0xf7, 0x0, 0xaf, 0xb4,
+                                                          0x87, 0xb4, 0x8f, 0xb6, 0x1e, 0xe, 0xf7, 0x3a,
+                                                          0xfb, 0x57, 0x76, 0xf9, 0xe7, 0xa6, 0x1, 0xf7,
+                                                          0x17, 0xfb, 0x6c, 0x15, 0xaf, 0x6, 0xf7, 0x88,
+                                                          0xf9, 0xe7, 0x5, 0xe6, 0x6, 0xfb, 0x88, 0xfd,
+                                                          0xe7, 0x5, 0xae, 0x6, 0xf7, 0x88, 0xf9, 0xe7,
+                                                          0x5, 0xcc, 0x6, 0x93, 0xa6, 0x5, 0xfb, 0x7a,
+                                                          0x6, 0xfb, 0x8a, 0x5c, 0xfb, 0x44, 0x4c, 0xfb,
+                                                          0x4, 0xed, 0x7a, 0xe7, 0x1f, 0xe, 0x20, 0xf7,
+                                                          0x5b, 0xf7, 0x3, 0x1, 0xd1, 0xf7, 0x3, 0x3,
+                                                          0xd1, 0xf7, 0x92, 0x84, 0xa, 0x73, 0xfb, 0x6d,
+                                                          0xaf, 0xf7, 0x49, 0x77, 0x1, 0xf7, 0x0, 0xd5,
+                                                          0x3, 0xdc, 0x16, 0x4c, 0x21, 0x94, 0x83, 0x5,
+                                                          0x91, 0x96, 0x9b, 0x8e, 0x99, 0x1b, 0xa0, 0x9e,
+                                                          0x81, 0x74, 0x6f, 0x6b, 0x7c, 0x68, 0x78, 0x77,
+                                                          0x8f, 0x95, 0x7c, 0x1f, 0x7a, 0x6e, 0x5, 0x7e,
+                                                          0xa3, 0xaf, 0x83, 0xaf, 0x1b, 0xc6, 0xc4, 0xa2,
+                                                          0xcb, 0xb5, 0x67, 0xa4, 0x64, 0x80, 0x80, 0x8b,
+                                                          0x88, 0x81, 0x1f, 0xb7, 0xcd, 0x5, 0xe, 0x52,
+                                                          0xf7, 0xa3, 0x9b, 0xf7, 0x6, 0x76, 0xf7, 0xbc,
+                                                          0x77, 0x1, 0xb6, 0xf7, 0x7f, 0x3, 0xb6, 0xf7,
+                                                          0xa3, 0x15, 0xf7, 0x49, 0x9b, 0x6, 0x68, 0x7e,
+                                                          0x96, 0x9b, 0x9c, 0x96, 0xa4, 0x96, 0xae, 0x1f,
+                                                          0xdd, 0xf7, 0x9c, 0x5, 0x8e, 0x92, 0x8c, 0x90,
+                                                          0x8f, 0x1a, 0x8e, 0x89, 0x8d, 0x87, 0x83, 0x2e,
+                                                          0x78, 0x88, 0x6e, 0x1e, 0x78, 0x7, 0x8c, 0x9b,
+                                                          0x97, 0x8b, 0x93, 0x1b, 0x97, 0x91, 0x86, 0x82,
+                                                          0x83, 0x8a, 0x81, 0x88, 0x84, 0x1f, 0x4c, 0xfb,
+                                                          0x63, 0x73, 0x3b, 0x83, 0x84, 0x4f, 0x7b, 0x19,
+                                                          0xe, 0x5c, 0xf7, 0xb9, 0xa3, 0xe4, 0xa3, 0xf7,
+                                                          0x5d, 0xa1, 0x8c, 0xa1, 0x1, 0xce, 0xd4, 0xf7,
+                                                          0x29, 0xd4, 0x3, 0xce, 0xf8, 0x82, 0x15, 0xe3,
+                                                          0xe8, 0xe9, 0xef, 0xd8, 0xa4, 0x59, 0x63, 0x40,
+                                                          0x34, 0x22, 0x23, 0x43, 0x6b, 0xb0, 0xbe, 0x1e,
+                                                          0xd4, 0x81, 0x15, 0x6c, 0x97, 0x74, 0xa7, 0xcf,
+                                                          0xb4, 0xf7, 0xb, 0xbe, 0xa6, 0x84, 0xa6, 0x70,
+                                                          0x48, 0x5b, 0xfb, 0x4, 0x51, 0x1e, 0xe, 0xce,
+                                                          0xa, 0xc2, 0xf8, 0x1c, 0x3, 0xf7, 0xff, 0xf7,
+                                                          0x73, 0x15, 0x49, 0xa, 0xfb, 0x36, 0x16, 0x49,
+                                                          0xa, 0xe, 0xd9, 0xa, 0xf7, 0x10, 0x9b, 0xf8,
+                                                          0x19, 0x77, 0x12, 0xac, 0xf9, 0x53, 0x13, 0x68,
+                                                          0x67, 0xa, 0x13, 0xbc, 0x94, 0xa, 0x13, 0xa8,
+                                                          0xfb, 0xb2, 0xfb, 0x31, 0x8c, 0xa, 0xfc, 0xc9,
+                                                          0xfc, 0x29, 0x15, 0xf7, 0x49, 0x6, 0x13, 0x10,
+                                                          0x9b, 0x7, 0x13, 0x1c, 0x71, 0x74, 0x95, 0x9d,
+                                                          0x8d, 0x8b, 0x8d, 0xf4, 0xf7, 0xe4, 0x1f, 0x8d,
+                                                          0x92, 0x8d, 0x8f, 0x8f, 0x1a, 0x8e, 0x8a, 0x8e,
+                                                          0x86, 0xdc, 0xa, 0x8c, 0x9c, 0x97, 0x8b, 0x93,
+                                                          0x1b, 0xa7, 0x80, 0x72, 0x7d, 0x87, 0x1f, 0x32,
+                                                          0xfb, 0xa7, 0x85, 0x78, 0x71, 0x7f, 0x69, 0x87,
+                                                          0x19, 0xe, 0xf8, 0x1d, 0x8b, 0xc0, 0x61, 0x76,
+                                                          0xf8, 0x0, 0xbf, 0xf7, 0xa2, 0x77, 0x12, 0xad,
+                                                          0xf7, 0x83, 0xfb, 0x24, 0xbe, 0xf8, 0x8c, 0xcc,
+                                                          0x13, 0x76, 0xf7, 0x15, 0x81, 0x8c, 0xa, 0x13,
+                                                          0xba, 0xfb, 0x12, 0xfd, 0x38, 0xc1, 0xa, 0x81,
+                                                          0x7e, 0x60, 0x1b, 0xfb, 0x0, 0x95, 0xa, 0xc3,
+                                                          0x46, 0x79, 0x36, 0x88, 0x75, 0xa, 0xfc, 0x3c,
+                                                          0xf7, 0x91, 0x15, 0xf7, 0x48, 0x6, 0x13, 0x0,
+                                                          0x9b, 0x7, 0x13, 0x18, 0x72, 0x6e, 0x96, 0x9b,
+                                                          0x90, 0x1f, 0xc8, 0xf7, 0x5d, 0xba, 0xf7, 0x2d,
+                                                          0x88, 0x1a, 0x8e, 0x8d, 0x93, 0x84, 0xdc, 0xa,
+                                                          0xb0, 0x8c, 0x5, 0x99, 0x8f, 0x86, 0x82, 0x7e,
+                                                          0x89, 0x88, 0x2f, 0xfb, 0xb0, 0x1f, 0x85, 0x78,
+                                                          0x72, 0x7f, 0x69, 0x87, 0x8, 0xe, 0xd9, 0xa,
+                                                          0xf7, 0xea, 0xf7, 0x4f, 0x12, 0xf7, 0x6e, 0xca,
+                                                          0x6e, 0xce, 0x13, 0x78, 0x67, 0xa, 0x94, 0xa,
+                                                          0x13, 0xb8, 0xfb, 0xb1, 0xfb, 0x31, 0x8c, 0xa,
+                                                          0xfc, 0x82, 0xfb, 0x4f, 0x15, 0xc3, 0xc4, 0x7e,
+                                                          0x32, 0x47, 0x4e, 0x77, 0x75, 0x7a, 0x7f, 0x98,
+                                                          0x97, 0x7f, 0x1f, 0x96, 0x80, 0x80, 0x95, 0x7d,
+                                                          0x1b, 0x68, 0x8b, 0xa5, 0xa, 0x77, 0x95, 0x1f,
+                                                          0x13, 0x74, 0xc9, 0xa, 0x1e, 0x13, 0x4, 0x66,
+                                                          0x5a, 0x72, 0x67, 0x7b, 0x1f, 0x83, 0xa, 0xfb,
+                                                          0x88, 0xa1, 0x12, 0xa5, 0xd5, 0xf7, 0x2c, 0xcb,
+                                                          0x55, 0xf5, 0x13, 0xe0, 0xf7, 0xb0, 0xf7, 0xb1,
+                                                          0x15, 0x73, 0x26, 0x54, 0x5f, 0x60, 0x68, 0x8,
+                                                          0x26, 0x39, 0x6a, 0x6c, 0x45, 0x1a, 0x41, 0xc2,
+                                                          0x56, 0xeb, 0x1e, 0xd2, 0xcd, 0xb2, 0xd2, 0xa8,
+                                                          0x7c, 0xa7, 0x73, 0x81, 0x6d, 0x86, 0x6d, 0x80,
+                                                          0x8f, 0x81, 0x8f, 0x81, 0x1f, 0x8f, 0x81, 0x8e,
+                                                          0x81, 0x7f, 0x1a, 0x5c, 0x4a, 0x8b, 0x86, 0x42,
+                                                          0x84, 0xc6, 0xa4, 0xd6, 0xba, 0xba, 0xbc, 0xc1,
+                                                          0x1e, 0xba, 0xbf, 0xbb, 0xc6, 0x93, 0xea, 0x8,
+                                                          0x13, 0xd0, 0x64, 0xf7, 0x1b, 0x15, 0x6e, 0xa3,
+                                                          0x85, 0xa, 0x73, 0x73, 0x6e, 0x1e, 0xe, 0x88,
+                                                          0xa, 0x58, 0x16, 0x9b, 0xa, 0x5f, 0x7d, 0xa0,
+                                                          0xa3, 0x9d, 0x93, 0xa8, 0xcf, 0xf7, 0xa, 0x1f,
+                                                          0xf7, 0x70, 0x6, 0xa2, 0xfb, 0x18, 0x8b, 0x82,
+                                                          0x82, 0x1a, 0x66, 0x74, 0x74, 0x53, 0x27, 0xa,
+                                                          0xc7, 0xf8, 0x4e, 0xb7, 0xa, 0xfb, 0x3, 0xf7,
+                                                          0x27, 0xc5, 0xa, 0x79, 0x8d, 0x56, 0xa, 0x9e,
+                                                          0x7f, 0x80, 0xa, 0x88, 0xa, 0xf7, 0xd3, 0xf9,
+                                                          0x56, 0x7f, 0xa, 0xfc, 0xa3, 0xfd, 0xf1, 0xe7,
+                                                          0xa, 0x64, 0x78, 0x9f, 0xa3, 0x9e, 0x94, 0xa2,
+                                                          0x96, 0xa0, 0x81, 0xa, 0xa1, 0xfb, 0x11, 0x8c,
+                                                          0x83, 0x82, 0x1a, 0x61, 0x78, 0x71, 0x4f, 0x27,
+                                                          0xa, 0xe, 0x5a, 0xa, 0xf7, 0x75, 0x77, 0x1,
+                                                          0x58, 0xf8, 0xfb, 0x3, 0xf7, 0x7f, 0x46, 0xa,
+                                                          0xfc, 0x4f, 0xfd, 0xfd, 0xe7, 0xa, 0x63, 0x79,
+                                                          0x9f, 0xa4, 0x9e, 0x94, 0xa1, 0x96, 0xa0, 0x81,
+                                                          0xa, 0xa3, 0xfb, 0x16, 0x8a, 0x82, 0x83, 0x1a,
+                                                          0x67, 0x71, 0x70, 0x56, 0x35, 0xa, 0x82, 0x68,
+                                                          0x7c, 0x19, 0xf7, 0x76, 0xf7, 0x8b, 0x4c, 0xa,
+                                                          0xe, 0x5a, 0xa, 0xdf, 0xac, 0xa, 0x13, 0xf4,
+                                                          0xf7, 0x83, 0xf9, 0x6d, 0x65, 0xa, 0x73, 0x97,
+                                                          0x96, 0x71, 0x1f, 0x13, 0xe8, 0x95, 0x73, 0x72,
+                                                          0x95, 0x71, 0x6c, 0xa, 0xfb, 0xb6, 0xfd, 0x6d,
+                                                          0xe7, 0xa, 0x64, 0x78, 0x9d, 0xa4, 0x9e, 0x94,
+                                                          0xa3, 0x96, 0xa0, 0x81, 0xa, 0xa1, 0xfb, 0x12,
+                                                          0x8c, 0x81, 0x84, 0x1a, 0x61, 0x70, 0x72, 0x57,
+                                                          0x27, 0xa, 0xe, 0x5a, 0xa, 0xd3, 0xed, 0x1,
+                                                          0xf7, 0x8a, 0xc6, 0xa, 0x3, 0x58, 0x16, 0x9b,
+                                                          0xa, 0x65, 0x77, 0xa0, 0x9f, 0xa3, 0x94, 0x9f,
+                                                          0x96, 0xa1, 0x81, 0xa, 0xa1, 0xfb, 0xf, 0x8c,
+                                                          0x7f, 0x84, 0x1a, 0x60, 0x72, 0x72, 0x55, 0x27,
+                                                          0xa, 0xfb, 0xf, 0xf8, 0x8f, 0x23, 0xa, 0x5a,
+                                                          0xa, 0xae, 0xf7, 0x3a, 0xab, 0xa, 0xf7, 0x39,
+                                                          0x12, 0x58, 0xf7, 0x4f, 0xf7, 0x28, 0xad, 0x69,
+                                                          0xf7, 0x39, 0xab, 0xa, 0xf7, 0x3a, 0x13, 0xf2,
+                                                          0x80, 0xf7, 0xb0, 0xf9, 0xa3, 0x15, 0x54, 0xb8,
+                                                          0x5e, 0xc2, 0x1e, 0x13, 0xe7, 0x20, 0xc2, 0xb8,
+                                                          0xb8, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0x1f, 0x13,
+                                                          0xf2, 0x80, 0x54, 0x5e, 0x5e, 0x54, 0x1f, 0xad,
+                                                          0x16, 0xb3, 0xa, 0x13, 0xeb, 0x40, 0xe5, 0xa,
+                                                          0xfc, 0x5, 0xfd, 0xa3, 0xe7, 0xa, 0x65, 0x77,
+                                                          0xa0, 0x9f, 0xa3, 0x94, 0x9f, 0x96, 0xa1, 0x81,
+                                                          0xa, 0xa1, 0xfb, 0xf, 0x8c, 0x7f, 0x84, 0x1a,
+                                                          0x60, 0x72, 0x72, 0x55, 0x27, 0xa, 0xe, 0xf8,
+                                                          0xa8, 0x8b, 0xac, 0xf7, 0x5d, 0xb0, 0xc4, 0xe9,
+                                                          0xa, 0x1, 0xf9, 0x88, 0x9d, 0x3, 0x70, 0x16,
+                                                          0x9b, 0xa, 0x6e, 0x6a, 0x9b, 0xa2, 0xb2, 0xe4,
+                                                          0xe8, 0xad, 0xba, 0x1f, 0xf7, 0x52, 0x6, 0x5d,
+                                                          0xfb, 0x34, 0x7f, 0x63, 0x7b, 0x7f, 0x54, 0x85,
+                                                          0x19, 0x7b, 0xf8, 0x86, 0x7, 0xcb, 0xf7, 0x38,
+                                                          0x79, 0x90, 0x5, 0xfb, 0x3, 0x42, 0x49, 0x72,
+                                                          0xfb, 0x21, 0x1b, 0x6d, 0x6, 0x65, 0x81, 0x9f,
+                                                          0x9f, 0x9d, 0xba, 0xf7, 0x36, 0xa0, 0xd6, 0x1f,
+                                                          0xb3, 0x6, 0xeb, 0xa1, 0x84, 0x5d, 0x7b, 0x88,
+                                                          0x7a, 0x88, 0x7b, 0x1f, 0x9c, 0x87, 0xd0, 0xf7,
+                                                          0x7c, 0x79, 0x8f, 0x5, 0x2e, 0x60, 0x7c, 0x87,
+                                                          0xfb, 0x2d, 0x1b, 0xc8, 0xf7, 0x72, 0x5, 0xb0,
+                                                          0x95, 0x94, 0x8b, 0xc7, 0x1b, 0xf7, 0x4e, 0x81,
+                                                          0x76, 0x2a, 0x1f, 0x9c, 0x89, 0xac, 0xf7, 0x2d,
+                                                          0x5, 0xfc, 0x99, 0x7c, 0x6, 0xbd, 0x87, 0x99,
+                                                          0x8a, 0x72, 0x1a, 0x7d, 0x7a, 0x78, 0x7c, 0x79,
+                                                          0x1e, 0xfc, 0x16, 0xfc, 0x77, 0x71, 0x6b, 0x7a,
+                                                          0x77, 0x73, 0x85, 0x19, 0xf7, 0xa8, 0xf7, 0x93,
+                                                          0x15, 0xf7, 0x97, 0xf7, 0xde, 0x5, 0x91, 0x6,
+                                                          0x2f, 0xfb, 0xde, 0x5, 0xe, 0xf7, 0xca, 0xfb,
+                                                          0x58, 0x76, 0xf7, 0x5d, 0xb6, 0xd4, 0xa, 0x13,
+                                                          0xe8, 0xf7, 0x90, 0x21, 0x15, 0x93, 0x83, 0x5,
+                                                          0x91, 0x97, 0x9b, 0x8e, 0x9a, 0x1b, 0xa1, 0x9e,
+                                                          0x81, 0x74, 0x6e, 0x67, 0x7d, 0x67, 0x7a, 0x79,
+                                                          0xde, 0xa, 0xa3, 0xb0, 0x83, 0xaf, 0x1b, 0xc5,
+                                                          0xc4, 0xa3, 0xca, 0xb5, 0x67, 0xa4, 0x64, 0x80,
+                                                          0x81, 0x8b, 0x88, 0x80, 0x1f, 0xac, 0xbd, 0x5,
+                                                          0xf7, 0x1d, 0xde, 0xf4, 0xb5, 0xaf, 0x6f, 0xa,
+                                                          0x9d, 0x88, 0x5, 0x13, 0xd8, 0xb8, 0xa, 0x7f,
+                                                          0x76, 0x92, 0x91, 0x70, 0x1f, 0x13, 0xe8, 0x91,
+                                                          0x73, 0x6e, 0x90, 0x6a, 0xd5, 0xa, 0xfb, 0x4f,
+                                                          0xf7, 0x14, 0x3a, 0xf7, 0x5, 0x1f, 0xe, 0x8d,
+                                                          0xa, 0xf7, 0x73, 0x77, 0x1, 0xf8, 0x24, 0x9f,
+                                                          0xf7, 0x36, 0xa0, 0x3, 0x8b, 0xa, 0x68, 0x6d,
+                                                          0x98, 0xb2, 0x90, 0x8c, 0x90, 0x8c, 0x91, 0x1f,
+                                                          0x8d, 0x97, 0x99, 0x3c, 0xa, 0x7f, 0x80, 0xfb,
+                                                          0x2f, 0x74, 0xa, 0xf7, 0x50, 0x86, 0x76, 0x2a,
+                                                          0x41, 0xa, 0xf8, 0x42, 0xf9, 0x44, 0xb7, 0xa,
+                                                          0xfb, 0x1, 0xf7, 0x22, 0xc5, 0xa, 0x77, 0x92,
+                                                          0x56, 0xa, 0xa0, 0x7a, 0x80, 0xa, 0x8d, 0xa,
+                                                          0xf7, 0x73, 0x77, 0x1, 0xf8, 0xda, 0xa0, 0x3,
+                                                          0xf7, 0xdd, 0xf9, 0x56, 0x9e, 0xa, 0xf7, 0x38,
+                                                          0xf0, 0x9f, 0xa, 0x98, 0x97, 0x47, 0xa, 0x7c,
+                                                          0x82, 0x9d, 0xa, 0xfc, 0x79, 0xfd, 0xf1, 0x34,
+                                                          0xa, 0xf7, 0x92, 0x8b, 0xac, 0xf7, 0xbb, 0xac,
+                                                          0xf7, 0x99, 0xac, 0x89, 0xbe, 0xd1, 0xa, 0xf8,
+                                                          0x24, 0x9f, 0xf7, 0x36, 0xa0, 0x3, 0xf7, 0x98,
+                                                          0x46, 0xa, 0xfc, 0x36, 0xfd, 0xfd, 0x34, 0xa,
+                                                          0x8d, 0xa, 0xce, 0xed, 0x1, 0xf7, 0x9e, 0xc6,
+                                                          0xa, 0x3, 0x8a, 0x16, 0x32, 0xa, 0x7f, 0x80,
+                                                          0xfb, 0x2f, 0x74, 0xa, 0xf7, 0x50, 0x86, 0x76,
+                                                          0x2a, 0x41, 0xa, 0xf7, 0x9f, 0xf9, 0x85, 0x23,
+                                                          0xa, 0x73, 0x99, 0xa, 0x83, 0x16, 0x2a, 0xa,
+                                                          0xf7, 0xbe, 0xf9, 0x44, 0x77, 0xa, 0x73, 0x99,
+                                                          0xa, 0xf7, 0x66, 0xf9, 0x56, 0x9e, 0xa, 0xf7,
+                                                          0x21, 0xee, 0x9f, 0xa, 0x9b, 0x99, 0x47, 0xa,
+                                                          0x79, 0x80, 0x9d, 0xa, 0xfb, 0xf2, 0xfd, 0xef,
+                                                          0x15, 0x2a, 0xa, 0xe, 0x73, 0x9a, 0xa, 0xbe,
+                                                          0xd1, 0xa, 0x83, 0xf8, 0x45, 0x3, 0xf7, 0x17,
+                                                          0x46, 0xa, 0xfb, 0xbc, 0xfd, 0xfd, 0x15, 0x2a,
+                                                          0xa, 0xe, 0x73, 0x87, 0xa, 0xe2, 0xed, 0x1,
+                                                          0xf7, 0x1d, 0xc6, 0xa, 0x3, 0x83, 0x16, 0x2a,
+                                                          0xa, 0xf7, 0x25, 0xf9, 0x85, 0x23, 0xa, 0xf8,
+                                                          0x1, 0x8b, 0xa9, 0xf7, 0xbc, 0xb5, 0xf7, 0x93,
+                                                          0xa9, 0x1, 0xf7, 0x58, 0xee, 0xf7, 0xba, 0xf7,
+                                                          0x3, 0x3, 0xb1, 0xa, 0xf4, 0x4d, 0xf7, 0x35,
+                                                          0xfb, 0x7a, 0x1f, 0xfb, 0xaa, 0x7b, 0x6, 0xc4,
+                                                          0x9d, 0x76, 0x6d, 0x7a, 0x87, 0x79, 0x86, 0x78,
+                                                          0x1f, 0x5d, 0xfb, 0x38, 0x5, 0x31, 0x6, 0x7f,
+                                                          0x61, 0x5, 0xe5, 0x6, 0x5d, 0xfb, 0x38, 0x5,
+                                                          0x26, 0x6f, 0x86, 0x5e, 0x48, 0x1b, 0xf7, 0x8a,
+                                                          0xf7, 0xca, 0x15, 0xf7, 0x2d, 0x6, 0x97, 0xb5,
+                                                          0x5, 0xfb, 0x2d, 0x6, 0xb8, 0xf7, 0x39, 0x5,
+                                                          0xc1, 0x9a, 0x8e, 0xaf, 0xcc, 0xb2, 0xa, 0x55,
+                                                          0x7a, 0x9b, 0xa5, 0xa2, 0x97, 0xaa, 0x95, 0xaf,
+                                                          0x1f, 0xe, 0xf7, 0xca, 0x91, 0x76, 0xaf, 0x76,
+                                                          0xf9, 0x1e, 0xf7, 0x2f, 0xfb, 0x2c, 0x77, 0xee,
+                                                          0xc7, 0x56, 0xf2, 0x85, 0x77, 0x12, 0x13, 0x62,
+                                                          0x77, 0xe4, 0xa, 0x56, 0x7c, 0xa0, 0xab, 0x9c,
+                                                          0x90, 0x9e, 0x91, 0xa1, 0x1f, 0xf7, 0x0, 0xf8,
+                                                          0x26, 0x5, 0x8f, 0x6, 0x13, 0xa2, 0xf7, 0x78,
+                                                          0xfc, 0xb4, 0x5, 0x9d, 0x6, 0xf7, 0x2c, 0xf8,
+                                                          0xad, 0xa2, 0xdb, 0x9c, 0xa2, 0xc3, 0x97, 0x19,
+                                                          0x13, 0x5a, 0xeb, 0xa, 0x7, 0x13, 0x62, 0x7b,
+                                                          0x7, 0xbd, 0x9b, 0x74, 0x6d, 0x78, 0x87, 0x76,
+                                                          0x85, 0x77, 0x1f, 0x29, 0xfc, 0x2, 0x5, 0x88,
+                                                          0x6, 0x13, 0x5a, 0xfb, 0x62, 0xf8, 0x83, 0x5,
+                                                          0xfb, 0x35, 0x6, 0x13, 0x62, 0x7b, 0x7, 0xbb,
+                                                          0xa0, 0x78, 0x66, 0x9c, 0x1f, 0xfb, 0x13, 0xfc,
+                                                          0x57, 0x76, 0x3f, 0x78, 0x6d, 0x54, 0x83, 0x19,
+                                                          0xf7, 0xbd, 0xf9, 0x5d, 0x60, 0xa, 0x9d, 0xa9,
+                                                          0x7f, 0x80, 0xa8, 0x1f, 0x13, 0x5a, 0x80, 0xa7,
+                                                          0xa6, 0x81, 0x71, 0xa, 0x77, 0x74, 0x96, 0x96,
+                                                          0x71, 0x1f, 0x13, 0x54, 0x95, 0x73, 0x71, 0x96,
+                                                          0x71, 0xd6, 0xa, 0xbf, 0xa, 0xf7, 0x66, 0xa8,
+                                                          0xa, 0xc7, 0xf7, 0x77, 0x24, 0xa, 0xf7, 0xd4,
+                                                          0xf8, 0x71, 0x77, 0xa, 0xbf, 0xa, 0xf7, 0x66,
+                                                          0xa8, 0xa, 0xf8, 0x33, 0xf9, 0x56, 0x5e, 0xa,
+                                                          0xfc, 0x95, 0xfd, 0xe, 0x24, 0xa, 0xe, 0xb6,
+                                                          0xa, 0xac, 0xf8, 0xf7, 0xb1, 0x6c, 0xac, 0x8b,
+                                                          0xb1, 0xf7, 0x3d, 0xa8, 0xa, 0xf7, 0xd5, 0x46,
+                                                          0xa, 0xfc, 0x36, 0xfd, 0x1a, 0x24, 0xa, 0xe,
+                                                          0xb6, 0xa, 0xac, 0xf8, 0xff, 0xac, 0xd0, 0xf2,
+                                                          0x88, 0x77, 0x12, 0x86, 0xa, 0x13, 0xec, 0xf7,
+                                                          0xcf, 0xf9, 0x6d, 0x60, 0xa, 0x9c, 0xa6, 0x81,
+                                                          0x81, 0xa6, 0x1f, 0x7f, 0xa9, 0xa9, 0x7f, 0x9e,
+                                                          0x1b, 0x13, 0xdc, 0x43, 0xa, 0x78, 0x74, 0x96,
+                                                          0x96, 0x72, 0x1f, 0x13, 0xec, 0x96, 0x73, 0x70,
+                                                          0x95, 0x70, 0x6c, 0xa, 0xfb, 0x93, 0xfc, 0x8a,
+                                                          0x24, 0xa, 0xe, 0xb6, 0xa, 0xac, 0xf8, 0xb8,
+                                                          0xac, 0xf7, 0x14, 0xed, 0x12, 0xc7, 0xf4, 0xf8,
+                                                          0x8, 0xed, 0x62, 0xf4, 0x13, 0xf4, 0xc7, 0xf7,
+                                                          0x77, 0x24, 0xa, 0xf7, 0x40, 0xf8, 0xb2, 0x58,
+                                                          0xa, 0x13, 0xf8, 0x25, 0xa, 0xf7, 0xd2, 0xa8,
+                                                          0x76, 0xb4, 0x76, 0xf8, 0x56, 0x77, 0xb2, 0x77,
+                                                          0x12, 0xf7, 0x1e, 0xf8, 0x26, 0x13, 0x98, 0xf7,
+                                                          0x8, 0xc4, 0x15, 0xa7, 0x70, 0xf7, 0x57, 0xf7,
+                                                          0x53, 0x5, 0x13, 0x58, 0xf7, 0x57, 0xfb, 0x55,
+                                                          0xa7, 0xa8, 0xfb, 0x57, 0xf7, 0x56, 0xf7, 0x5c,
+                                                          0xf7, 0x5a, 0x5, 0x13, 0xa8, 0x6e, 0xa8, 0xfb,
+                                                          0x5b, 0xfb, 0x5a, 0xfb, 0x58, 0xf7, 0x58, 0x70,
+                                                          0x6e, 0xf7, 0x56, 0xfb, 0x58, 0x5, 0xe, 0xf8,
+                                                          0x1, 0x37, 0x76, 0xe2, 0xac, 0xf8, 0xfe, 0xac,
+                                                          0xc3, 0xa8, 0xa, 0xf7, 0x52, 0xd5, 0x15, 0x72,
+                                                          0xba, 0x8b, 0xe5, 0x98, 0x1a, 0xf7, 0x12, 0xf7,
+                                                          0x16, 0xf7, 0xaf, 0xf7, 0x3c, 0xaf, 0xa7, 0x81,
+                                                          0x7b, 0x9e, 0x1e, 0xfb, 0xdf, 0xfc, 0xc7, 0x15,
+                                                          0xf7, 0xf7, 0xf8, 0xa6, 0x5, 0x9d, 0x6f, 0x91,
+                                                          0x39, 0x62, 0x1a, 0xfb, 0x1, 0xfb, 0xe, 0xfb,
+                                                          0xbf, 0xfb, 0x44, 0x65, 0x71, 0x97, 0x9c, 0x7a,
+                                                          0x1e, 0xfb, 0x26, 0xfb, 0x29, 0x15, 0xb7, 0x6,
+                                                          0xd5, 0xf7, 0x0, 0x5, 0x7e, 0xa9, 0xad, 0x83,
+                                                          0xa7, 0x1b, 0xae, 0xa, 0xf7, 0x84, 0xf7, 0x5d,
+                                                          0xed, 0x65, 0xcd, 0x53, 0xb2, 0x1f, 0xcb, 0xeb,
+                                                          0x5, 0x5f, 0x6, 0x57, 0x3d, 0x5, 0x9a, 0x6a,
+                                                          0x67, 0x92, 0x66, 0x1b, 0xfb, 0x47, 0xfb, 0x78,
+                                                          0xfb, 0x6e, 0xfb, 0x71, 0x21, 0xb5, 0x4b, 0xc0,
+                                                          0x68, 0x1f, 0xe, 0xaa, 0xa, 0x77, 0xf7, 0x83,
+                                                          0x77, 0xa3, 0x77, 0x12, 0xcc, 0xa, 0x13, 0xec,
+                                                          0xf7, 0x13, 0xf9, 0x11, 0x29, 0xa, 0xf8, 0x4,
+                                                          0xbe, 0xb7, 0xa, 0x20, 0xf7, 0x22, 0x5, 0x13,
+                                                          0xdc, 0xa2, 0x79, 0x75, 0x92, 0x56, 0xa, 0xa2,
+                                                          0x7a, 0x80, 0xa, 0xaa, 0xa, 0x77, 0xf7, 0x87,
+                                                          0x77, 0x1, 0xcc, 0xa, 0x3, 0xf8, 0x33, 0xf9,
+                                                          0x56, 0x5e, 0xa, 0xfc, 0x52, 0xfb, 0x74, 0x29,
+                                                          0xa, 0xe, 0xaa, 0xa, 0xbe, 0xd1, 0xa, 0xcc,
+                                                          0xa, 0x3, 0xf7, 0xc6, 0x46, 0xa, 0xfb, 0xe4,
+                                                          0xfb, 0x80, 0x29, 0xa, 0xe, 0xb6, 0xa, 0xb4,
+                                                          0xf8, 0xfa, 0xdf, 0xa, 0xf1, 0xe5, 0xf7, 0x48,
+                                                          0xc6, 0xa, 0x13, 0xce, 0xf7, 0x13, 0xf9, 0x11,
+                                                          0x3a, 0xa, 0x13, 0xbe, 0xeb, 0xa, 0x7, 0x13,
+                                                          0xce, 0x37, 0xa, 0x13, 0xbe, 0xd2, 0xa, 0x13,
+                                                          0xce, 0xf7, 0x89, 0xf7, 0x8, 0x15, 0x13, 0xbe,
+                                                          0x21, 0xa, 0xf7, 0x5b, 0x99, 0xa, 0xcf, 0xa,
+                                                          0x59, 0x69, 0x9c, 0xba, 0x92, 0x8c, 0x91, 0x8d,
+                                                          0x93, 0x1f, 0x91, 0xa7, 0x92, 0xa1, 0xb8, 0xf7,
+                                                          0x2f, 0xf7, 0x6f, 0xf7, 0xa2, 0x18, 0xab, 0xb3,
+                                                          0x96, 0x93, 0xa6, 0x98, 0x8, 0xe8, 0xa, 0xab,
+                                                          0xac, 0x86, 0x67, 0x62, 0xfb, 0x1f, 0xfb, 0x2c,
+                                                          0x5e, 0x53, 0x1f, 0x73, 0xe7, 0x6c, 0xf5, 0x85,
+                                                          0xa5, 0x8, 0x89, 0x95, 0x8b, 0x93, 0x92, 0x1a,
+                                                          0xa4, 0xaa, 0x98, 0xb0, 0x8e, 0xcd, 0xa, 0xa9,
+                                                          0xa7, 0x88, 0x4c, 0x9d, 0x1f, 0xd8, 0xfb, 0xa1,
+                                                          0x51, 0xfb, 0x5e, 0x5, 0x49, 0x78, 0x57, 0x79,
+                                                          0x66, 0x1b, 0xf7, 0xa6, 0xf9, 0x46, 0x9e, 0xa,
+                                                          0xf7, 0x3f, 0xf5, 0x9f, 0xa, 0x91, 0x92, 0x47,
+                                                          0xa, 0x83, 0x87, 0x9d, 0xa, 0xe, 0x7d, 0xa,
+                                                          0xf7, 0x3e, 0xb0, 0xf7, 0xad, 0xa9, 0x6d, 0xf7,
+                                                          0x39, 0x12, 0xf8, 0x66, 0xf2, 0x13, 0xe8, 0x8b,
+                                                          0x4, 0xf7, 0x89, 0x9b, 0x6, 0x55, 0x7e, 0x9d,
+                                                          0xa5, 0x96, 0x8e, 0x98, 0x8f, 0x99, 0x1f, 0xa0,
+                                                          0xdd, 0x5, 0x84, 0xae, 0xad, 0x88, 0xab, 0x1b,
+                                                          0xf7, 0x2d, 0xf7, 0x1, 0xdb, 0xf7, 0x8, 0xf7,
+                                                          0x2b, 0xfb, 0x3b, 0x8c, 0x5f, 0x1f, 0x53, 0x6,
+                                                          0x99, 0xc9, 0x94, 0xaf, 0xa6, 0x9b, 0xab, 0x90,
+                                                          0x19, 0x13, 0xd8, 0x9b, 0xfb, 0x82, 0x7b, 0x7,
+                                                          0xb5, 0x86, 0xa5, 0x7e, 0x66, 0x1a, 0x7d, 0x83,
+                                                          0x6d, 0x85, 0x74, 0x1e, 0xfb, 0x7, 0xfc, 0x33,
+                                                          0x79, 0x4b, 0x7b, 0x7f, 0x58, 0x83, 0x19, 0xf7,
+                                                          0x6b, 0xf7, 0x57, 0xd8, 0xa, 0x9c, 0xa9, 0x1b,
+                                                          0xf7, 0x2, 0xa9, 0x60, 0x41, 0xfb, 0x1f, 0x30,
+                                                          0x72, 0x38, 0x6f, 0x70, 0x8d, 0x8d, 0x75, 0x1f,
+                                                          0xe, 0xfb, 0x63, 0xa3, 0x73, 0xf3, 0xdb, 0xa1,
+                                                          0xf9, 0x25, 0xa2, 0x12, 0xf8, 0x3, 0xe2, 0x62,
+                                                          0xdb, 0x13, 0xb4, 0xa2, 0x87, 0x15, 0x2c, 0x76,
+                                                          0x75, 0x37, 0x4c, 0x1b, 0x7d, 0x87, 0x8f, 0x90,
+                                                          0x8e, 0x8e, 0x8f, 0x8e, 0x92, 0x1f, 0x8e, 0x91,
+                                                          0x8e, 0x93, 0x92, 0x1a, 0x13, 0x74, 0x94, 0x84,
+                                                          0xa6, 0x6c, 0x74, 0x79, 0x80, 0x6a, 0x65, 0xaf,
+                                                          0x75, 0xb5, 0xf7, 0xe, 0xbf, 0xf7, 0x44, 0xb6,
+                                                          0x96, 0x1e, 0xf7, 0x3, 0xf8, 0x3e, 0x5, 0xb5,
+                                                          0x96, 0xb9, 0xf7, 0x44, 0xe1, 0x1b, 0xb4, 0xa2,
+                                                          0x70, 0x5b, 0x4d, 0x7b, 0x3f, 0x4b, 0x6b, 0x1f,
+                                                          0x74, 0x80, 0x7a, 0x89, 0x7f, 0x8a, 0x8, 0x7c,
+                                                          0x8a, 0x85, 0x8d, 0x7c, 0x1a, 0x80, 0x95, 0x89,
+                                                          0x99, 0x8a, 0x1e, 0x13, 0xb8, 0xab, 0x88, 0xbe,
+                                                          0x89, 0xfb, 0x1, 0x1a, 0x40, 0x61, 0xfb, 0x49,
+                                                          0x3a, 0x7e, 0x86, 0x94, 0x8f, 0x91, 0x8f, 0x8f,
+                                                          0x8e, 0x92, 0x1e, 0x8e, 0x90, 0x8d, 0x91, 0x95,
+                                                          0x1a, 0xa0, 0x7f, 0x9e, 0x71, 0x73, 0x77, 0x7b,
+                                                          0x6d, 0x58, 0xba, 0x7b, 0xaa, 0xf7, 0x28, 0xd3,
+                                                          0xf7, 0x4b, 0xd6, 0xdc, 0x5e, 0xc6, 0x3c, 0x91,
+                                                          0x1e, 0x8e, 0x7, 0x13, 0xb4, 0xc9, 0xa1, 0xf0,
+                                                          0xb2, 0xf3, 0x1a, 0xc7, 0x64, 0xd1, 0x28, 0xfb,
+                                                          0x22, 0x48, 0xfb, 0x20, 0xfb, 0x74, 0x58, 0x1e,
+                                                          0xe, 0xa1, 0xa, 0x33, 0xa, 0x13, 0xb8, 0x28,
+                                                          0xa, 0xf7, 0x9b, 0xf8, 0x13, 0x78, 0xa, 0xa1,
+                                                          0xa, 0xf7, 0x9c, 0xf8, 0x82, 0x7f, 0xa, 0x24,
+                                                          0xfc, 0x92, 0x22, 0xa, 0x13, 0xb8, 0x28, 0xa,
+                                                          0xe, 0x76, 0xa, 0x8b, 0xbe, 0xf7, 0x3d, 0x77,
+                                                          0x12, 0x9c, 0xdf, 0x13, 0x7c, 0xf7, 0x43, 0x55,
+                                                          0xa, 0x7d, 0xfc, 0x9e, 0x22, 0xa, 0x13, 0xbc,
+                                                          0x28, 0xa, 0xe, 0x76, 0xa, 0xda, 0xac, 0xa,
+                                                          0x9c, 0xdf, 0x13, 0xb6, 0xf7, 0x4c, 0xf8, 0x99,
+                                                          0x65, 0xa, 0x74, 0x97, 0x96, 0x71, 0x1f, 0x13,
+                                                          0x6a, 0x95, 0x73, 0x71, 0x95, 0x71, 0x6c, 0xa,
+                                                          0xf7, 0x1a, 0xfc, 0xe, 0x22, 0xa, 0x13, 0xb6,
+                                                          0x28, 0xa, 0xe, 0x76, 0xa, 0xce, 0xed, 0x12,
+                                                          0x9c, 0xdf, 0xe5, 0xc6, 0xa, 0x13, 0x7e, 0x33,
+                                                          0xa, 0x13, 0xbe, 0x28, 0xa, 0xe5, 0xf8, 0x54,
+                                                          0x23, 0xa, 0x76, 0xa, 0xbe, 0xac, 0x8b, 0xf7,
+                                                          0x17, 0xfb, 0x17, 0xf7, 0x3a, 0x12, 0x9c, 0xdf,
+                                                          0xf7, 0x1f, 0xf7, 0x38, 0xab, 0xa, 0xf7, 0x3a,
+                                                          0x13, 0x76, 0x40, 0x33, 0xa, 0x13, 0xb7, 0x0,
+                                                          0x28, 0xa, 0xf7, 0x1f, 0xf8, 0x76, 0x15, 0x54,
+                                                          0xb7, 0x5f, 0xc2, 0x1e, 0x13, 0xb6, 0x40, 0xc2,
+                                                          0xb8, 0xb7, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0x1f,
+                                                          0x13, 0xb7, 0x0, 0x54, 0x5f, 0x5e, 0x54, 0x1f,
+                                                          0xac, 0x8a, 0x15, 0xb3, 0xa, 0x13, 0xba, 0x80,
+                                                          0xe5, 0xa, 0xe, 0xf7, 0xca, 0x80, 0xbd, 0xf8,
+                                                          0xd, 0xa4, 0x77, 0x9f, 0x12, 0xa2, 0xe1, 0xf7,
+                                                          0x53, 0xe3, 0xf7, 0x4e, 0xcd, 0x13, 0xbc, 0xf7,
+                                                          0xba, 0xf7, 0x20, 0x15, 0x90, 0x6, 0x89, 0x83,
+                                                          0x8a, 0x85, 0x82, 0x1a, 0x49, 0xab, 0x4d, 0xd9,
+                                                          0xeb, 0xe5, 0xf1, 0x95, 0x91, 0x1e, 0x81, 0x97,
+                                                          0x5, 0x48, 0x48, 0x58, 0x81, 0x76, 0x1b, 0x42,
+                                                          0x8b, 0xd6, 0xa8, 0xa3, 0x8c, 0x8d, 0x90, 0xa1,
+                                                          0x1f, 0xf7, 0xa, 0xad, 0xf7, 0x20, 0xb2, 0xf1,
+                                                          0x1a, 0xc7, 0x50, 0x9d, 0x75, 0x64, 0x62, 0x76,
+                                                          0x64, 0x65, 0x1e, 0x89, 0x8d, 0x9f, 0xc3, 0x44,
+                                                          0x89, 0x78, 0x60, 0x5, 0xa3, 0x80, 0x81, 0xa2,
+                                                          0x5b, 0x1b, 0xfb, 0x12, 0xfb, 0x2b, 0xfb, 0x6a,
+                                                          0xfb, 0x18, 0x5c, 0x9a, 0x50, 0xd3, 0xd7, 0xc6,
+                                                          0xda, 0xd3, 0xbc, 0x1f, 0xfb, 0x4d, 0x67, 0x15,
+                                                          0xed, 0xee, 0xf7, 0x6f, 0xe9, 0x99, 0xad, 0x88,
+                                                          0x54, 0x27, 0x20, 0xfb, 0x74, 0x29, 0x1e, 0x13,
+                                                          0x58, 0x69, 0x89, 0xaa, 0xad, 0x1f, 0xf7, 0xab,
+                                                          0xf7, 0x1, 0x15, 0xf7, 0x1d, 0xb5, 0xc7, 0xcd,
+                                                          0xbb, 0x1b, 0x13, 0xc, 0x9b, 0x9f, 0x7c, 0x6b,
+                                                          0x56, 0x59, 0x40, 0xfb, 0x1c, 0x6f, 0x1f, 0xe,
+                                                          0xe2, 0xfb, 0x6d, 0xaf, 0xdc, 0xad, 0xc3, 0xae,
+                                                          0xf8, 0x1f, 0xa0, 0x1, 0xa5, 0xe1, 0xd7, 0xd5,
+                                                          0xd7, 0xe2, 0x3, 0xf0, 0x28, 0x15, 0x94, 0x83,
+                                                          0x5, 0x91, 0x95, 0x98, 0x8c, 0x97, 0x1b, 0xa1,
+                                                          0xa0, 0x7e, 0x72, 0x6e, 0x69, 0x7d, 0x67, 0x79,
+                                                          0x78, 0xde, 0xa, 0xa2, 0xaf, 0x83, 0xaf, 0x1b,
+                                                          0xc6, 0xc5, 0xa2, 0xcb, 0xb4, 0x69, 0xa5, 0x65,
+                                                          0x7f, 0x7f, 0x8b, 0x88, 0x80, 0x1f, 0xb1, 0xc3,
+                                                          0xeb, 0x91, 0xc0, 0xd1, 0xa3, 0xa9, 0x19, 0x7b,
+                                                          0x95, 0x5, 0x63, 0x67, 0x5c, 0x62, 0x4f, 0x1b,
+                                                          0x4e, 0x69, 0xb8, 0xd8, 0xeb, 0xd4, 0xdb, 0xa,
+                                                          0x81, 0x86, 0x82, 0x87, 0x80, 0x1f, 0x88, 0x83,
+                                                          0x88, 0x81, 0x80, 0xa3, 0xa, 0xfb, 0x22, 0xfb,
+                                                          0x2d, 0xfb, 0x21, 0xfb, 0xa, 0xd0, 0x6a, 0xc7,
+                                                          0x85, 0x1e, 0xe, 0xe2, 0x80, 0xb8, 0xf7, 0xfc,
+                                                          0xa2, 0x8c, 0xa2, 0xf7, 0x73, 0x77, 0x1, 0xaa,
+                                                          0xe0, 0x3, 0xf7, 0x17, 0xf7, 0x5a, 0x15, 0x9c,
+                                                          0xb7, 0x5, 0x2d, 0xa, 0xf7, 0x68, 0xf7, 0xd0,
+                                                          0x78, 0xa, 0xe2, 0x80, 0xb8, 0xf8, 0xd, 0xa2,
+                                                          0xf7, 0x7a, 0x77, 0x12, 0xaa, 0xe0, 0xf7, 0x7b,
+                                                          0xcc, 0x17, 0xf7, 0x80, 0xad, 0xa, 0xf7, 0x3a,
+                                                          0xee, 0x9f, 0xa, 0x96, 0x99, 0x47, 0xa, 0x7e,
+                                                          0x80, 0x9d, 0xa, 0xfb, 0x9a, 0xfc, 0x55, 0x15,
+                                                          0x9c, 0xb7, 0x5, 0x3d, 0xa, 0x13, 0xd0, 0xb7,
+                                                          0x70, 0xad, 0x58, 0x1e, 0x5b, 0xa, 0x1f, 0x54,
+                                                          0xa, 0xe, 0xe2, 0x80, 0xb8, 0xf7, 0xf3, 0xa2,
+                                                          0x95, 0xa2, 0x8b, 0xbe, 0xf3, 0xcc, 0x8b, 0x77,
+                                                          0x1, 0xaa, 0xe0, 0xf7, 0x7b, 0xcc, 0x3, 0xf7,
+                                                          0x27, 0x55, 0xa, 0xfb, 0x41, 0xfc, 0x63, 0x15,
+                                                          0x9c, 0xb7, 0x5, 0x2d, 0xa, 0xe, 0xe2, 0x80,
+                                                          0xb8, 0xf8, 0xd, 0xa2, 0x7b, 0xa2, 0xce, 0xed,
+                                                          0x12, 0xaa, 0xe0, 0xb0, 0xc6, 0xa, 0x13, 0xde,
+                                                          0xf7, 0x17, 0xf7, 0x5a, 0x15, 0x9c, 0xb7, 0x5,
+                                                          0x13, 0xbe, 0x2d, 0xa, 0xa8, 0xf8, 0x11, 0x23,
+                                                          0xa, 0xd7, 0xa, 0xf9, 0x37, 0xe3, 0xa, 0xf7,
+                                                          0x72, 0xf7, 0x6, 0x2c, 0xa, 0x9d, 0xf8, 0x19,
+                                                          0xb7, 0xa, 0xfb, 0x3, 0xf7, 0x23, 0xc5, 0xa,
+                                                          0x79, 0x91, 0x56, 0xa, 0x9e, 0x7b, 0x80, 0xa,
+                                                          0xd7, 0xa, 0xf9, 0x37, 0xe3, 0xa, 0xf7, 0x18,
+                                                          0xad, 0xa, 0xf7, 0x3a, 0xef, 0x9f, 0xa, 0x97,
+                                                          0x98, 0x47, 0xa, 0x7d, 0x81, 0x9d, 0xa, 0x48,
+                                                          0xfc, 0xaa, 0x2c, 0xa, 0xe, 0xd7, 0xa, 0xf9,
+                                                          0x34, 0xe3, 0xa, 0xad, 0x55, 0xa, 0xaa, 0xfc,
+                                                          0xb7, 0x2c, 0xa, 0xe, 0xd7, 0xa, 0xf8, 0x9b,
+                                                          0xed, 0x1, 0xbc, 0xf2, 0xf2, 0xed, 0x3, 0xf7,
+                                                          0x72, 0xf7, 0x6, 0x2c, 0xa, 0xfb, 0x49, 0xf8,
+                                                          0x5a, 0x58, 0xa, 0xf7, 0x5d, 0x16, 0x20, 0xa,
+                                                          0xe, 0x80, 0xa0, 0xf7, 0x46, 0xa0, 0xf8, 0x6e,
+                                                          0x77, 0x12, 0xa6, 0xdf, 0xf7, 0xa5, 0xde, 0x17,
+                                                          0xf7, 0x3, 0xf2, 0x15, 0xf7, 0xa, 0xe6, 0xf7,
+                                                          0x5b, 0xf7, 0x4, 0xbb, 0xa1, 0x5f, 0x57, 0x20,
+                                                          0x3c, 0xfb, 0x63, 0xfb, 0x6, 0x59, 0x6d, 0xaf,
+                                                          0xc4, 0x1e, 0xf7, 0xaf, 0xf7, 0xb5, 0x15, 0xa9,
+                                                          0x7d, 0x6a, 0x9e, 0x66, 0x1b, 0xfb, 0x1b, 0xfb,
+                                                          0x28, 0xfb, 0x35, 0xfb, 0x27, 0x38, 0xb8, 0x4e,
+                                                          0xf5, 0xf7, 0x2d, 0xf7, 0x1c, 0xf7, 0x43, 0xf7,
+                                                          0x5c, 0xec, 0x67, 0xce, 0x59, 0xc1, 0x1f, 0xf0,
+                                                          0xb8, 0x6b, 0xa7, 0x28, 0x60, 0x64, 0xac, 0x5b,
+                                                          0xa9, 0x63, 0x93, 0x19, 0x68, 0x7a, 0xaf, 0x7d,
+                                                          0xb3, 0x6b, 0xab, 0x6c, 0x19, 0xfb, 0xf, 0x55,
+                                                          0xac, 0x6e, 0xf7, 0x9, 0xbe, 0xaf, 0x5e, 0xa6,
+                                                          0x5a, 0x94, 0x45, 0x19, 0xe, 0xbe, 0xa, 0xda,
+                                                          0xac, 0xa, 0xf7, 0xfd, 0xdc, 0x13, 0x6a, 0x89,
+                                                          0xa, 0xc3, 0xa, 0x13, 0xaa, 0x51, 0xa, 0x7b,
+                                                          0x7, 0xc1, 0x92, 0x76, 0x7c, 0x1f, 0x13, 0x76,
+                                                          0x76, 0x4b, 0xfb, 0x74, 0x6c, 0xfb, 0x5, 0x1e,
+                                                          0xf7, 0x1b, 0xa2, 0xa, 0xa7, 0x1f, 0x80, 0xa8,
+                                                          0x57, 0xa, 0x77, 0x72, 0x98, 0x96, 0x70, 0x1f,
+                                                          0x13, 0x6a, 0x95, 0x74, 0x72, 0x94, 0x72, 0xd6,
+                                                          0xa, 0xa4, 0xa, 0xa6, 0xf7, 0x19, 0x26, 0xa,
+                                                          0xf7, 0x91, 0xf7, 0xfc, 0xb7, 0xa, 0xfb, 0x5,
+                                                          0xf7, 0x26, 0xc5, 0xa, 0x7b, 0x8e, 0x56, 0xa,
+                                                          0x9c, 0x7e, 0x80, 0xa, 0xa4, 0xa, 0xf7, 0x9c,
+                                                          0xad, 0xa, 0xf7, 0x33, 0xed, 0x9f, 0xa, 0x9d,
+                                                          0x9a, 0x47, 0xa, 0x77, 0x7f, 0x9d, 0xa, 0xfc,
+                                                          0x17, 0xfc, 0x95, 0x26, 0xa, 0xe, 0x80, 0xa0,
+                                                          0xf8, 0x18, 0xa0, 0x8c, 0xa0, 0x8b, 0xbe, 0xf3,
+                                                          0xcc, 0x8b, 0x77, 0x92, 0xa, 0xf7, 0x39, 0x55,
+                                                          0xa, 0xfb, 0xbb, 0xfc, 0xa4, 0x26, 0xa, 0xe,
+                                                          0x80, 0xa0, 0xf8, 0x21, 0xa0, 0xe7, 0xac, 0xa,
+                                                          0xa6, 0xdf, 0xf7, 0xa5, 0xdf, 0x13, 0xee, 0xf7,
+                                                          0x3d, 0xf8, 0x99, 0x60, 0xa, 0x9c, 0xa6, 0x81,
+                                                          0x80, 0xa7, 0x1f, 0x80, 0xa8, 0xa9, 0x7f, 0x9e,
+                                                          0x1b, 0x43, 0xa, 0x77, 0x74, 0x97, 0x96, 0x71,
+                                                          0x1f, 0x13, 0xd6, 0x95, 0x73, 0x71, 0x95, 0x71,
+                                                          0x6c, 0xa, 0xfb, 0x22, 0xfc, 0x14, 0x26, 0xa,
+                                                          0xe, 0x80, 0xa0, 0xf8, 0x25, 0xa0, 0xd7, 0xed,
+                                                          0x12, 0xa6, 0xdf, 0xdb, 0xed, 0xea, 0xdf, 0x3e,
+                                                          0xed, 0x13, 0xfc, 0xa6, 0xf7, 0x19, 0x26, 0xa,
+                                                          0xdb, 0xf8, 0x3d, 0x58, 0xa, 0x13, 0xfa, 0x25,
+                                                          0xa, 0xf7, 0xd2, 0x80, 0xf7, 0x3, 0xf7, 0xc,
+                                                          0xcd, 0x53, 0xb9, 0xf7, 0x16, 0xf7, 0x3, 0x12,
+                                                          0xf7, 0xaf, 0xf7, 0x3, 0x23, 0xe1, 0x13, 0xb8,
+                                                          0xe1, 0xf7, 0x7a, 0x15, 0xf8, 0x8c, 0xb9, 0xfc,
+                                                          0x8c, 0x6, 0xf7, 0x8b, 0xf7, 0x2f, 0x15, 0x13,
+                                                          0xd4, 0x8e, 0xa, 0x8d, 0xfc, 0x4e, 0x15, 0x8e,
+                                                          0xa, 0xe, 0x82, 0xa2, 0xf8, 0x28, 0xa1, 0x12,
+                                                          0xa7, 0xdf, 0xf7, 0xa5, 0xdf, 0x17, 0xf7, 0x20,
+                                                          0xa8, 0x15, 0x78, 0x9c, 0x82, 0x97, 0xd7, 0x1a,
+                                                          0xd9, 0xd8, 0xf7, 0x62, 0xf7, 0x1f, 0x1e, 0xfb,
+                                                          0x35, 0xfc, 0x28, 0x15, 0xf7, 0x52, 0xf8, 0x1c,
+                                                          0x5, 0xaa, 0x67, 0x88, 0x71, 0x58, 0x1a, 0x7c,
+                                                          0x64, 0xfb, 0x9c, 0xfb, 0x47, 0x1e, 0x60, 0x79,
+                                                          0x15, 0x4b, 0xfb, 0x17, 0x5, 0xae, 0x6, 0x13,
+                                                          0xf0, 0xc8, 0xf7, 0x12, 0x5, 0x13, 0x50, 0xf7,
+                                                          0x61, 0xf7, 0x0, 0xf7, 0x54, 0xf7, 0x0, 0xcf,
+                                                          0x6f, 0xc6, 0x44, 0x9c, 0x1f, 0xc5, 0xf7, 0xb,
+                                                          0x5, 0x69, 0x6, 0x54, 0xfb, 0x6, 0x5, 0x13,
+                                                          0x20, 0xfb, 0x3b, 0xfb, 0x24, 0xfb, 0x34, 0xfb,
+                                                          0x25, 0x1f, 0x13, 0x0, 0x53, 0xa1, 0x4c, 0xd5,
+                                                          0x77, 0x1e, 0xe, 0xa0, 0xa, 0xf7, 0xdd, 0xf7,
+                                                          0x77, 0x3b, 0xa, 0xae, 0xf7, 0x9d, 0xb7, 0xa,
+                                                          0xfb, 0x4, 0xf7, 0x25, 0xc5, 0xa, 0x7a, 0x8f,
+                                                          0x56, 0xa, 0x9d, 0x7d, 0x80, 0xa, 0xa0, 0xa,
+                                                          0xf7, 0x92, 0xf8, 0x82, 0x7e, 0xa, 0x3b, 0xfc,
+                                                          0x38, 0x3b, 0xa, 0xe, 0x82, 0xba, 0x6f, 0x76,
+                                                          0xf8, 0x4f, 0xc7, 0xf7, 0x3d, 0xa9, 0xa, 0xe5,
+                                                          0x13, 0xb0, 0xf7, 0x39, 0xf8, 0x80, 0x15, 0xb2,
+                                                          0x6, 0x13, 0xbc, 0x39, 0xa, 0x92, 0xfc, 0x46,
+                                                          0x53, 0xa, 0x13, 0xac, 0x2e, 0xa, 0x13, 0x70,
+                                                          0xa6, 0xa, 0x82, 0xba, 0x6f, 0x76, 0xf8, 0x9b,
+                                                          0xed, 0x12, 0xb5, 0xd8, 0xc9, 0xc6, 0xa, 0x13,
+                                                          0xac, 0xf7, 0xdd, 0xf7, 0x77, 0x53, 0xa, 0x13,
+                                                          0xbc, 0x2b, 0xa, 0x13, 0x7c, 0x5d, 0xa, 0x62,
+                                                          0xa, 0xfb, 0x28, 0xf7, 0xde, 0x23, 0xa, 0xe2,
+                                                          0xfb, 0x62, 0xb8, 0xf8, 0xee, 0x77, 0xf7, 0x87,
+                                                          0x77, 0x12, 0xf8, 0x16, 0xc7, 0xa, 0xdb, 0x7c,
+                                                          0x5f, 0xf7, 0x5, 0x7e, 0x1b, 0x79, 0x3d, 0x7b,
+                                                          0x83, 0x5b, 0x1f, 0x98, 0xa, 0x9e, 0x4f, 0xe2,
+                                                          0xa, 0xaf, 0xfb, 0x32, 0x7a, 0xa, 0x84, 0x84,
+                                                          0x8f, 0x91, 0x84, 0x1f, 0x93, 0x81, 0x7f, 0x95,
+                                                          0x79, 0x96, 0xa, 0x1f, 0x13, 0x70, 0x70, 0xa,
+                                                          0x73, 0x99, 0x82, 0x99, 0x83, 0x1f, 0x98, 0x83,
+                                                          0x98, 0x84, 0x77, 0xa7, 0xa, 0x6f, 0xf8, 0x3a,
+                                                          0x7e, 0xa, 0xe, 0xfb, 0x4c, 0x76, 0xf7, 0x6b,
+                                                          0x76, 0xf8, 0x2d, 0xb6, 0xf7, 0x86, 0x77, 0x48,
+                                                          0xa, 0x77, 0x1f, 0x89, 0x8d, 0x91, 0x9c, 0xdd,
+                                                          0xf7, 0xce, 0x8e, 0x97, 0x19, 0x13, 0x90, 0x86,
+                                                          0x90, 0x58, 0x81, 0x58, 0x84, 0x59, 0x85, 0x19,
+                                                          0x7a, 0x7, 0xba, 0x9a, 0x7d, 0x75, 0x7a, 0x84,
+                                                          0x76, 0x85, 0x75, 0x1f, 0x6a, 0xfb, 0x9, 0xfb,
+                                                          0xf, 0xfc, 0x64, 0x76, 0x35, 0x8, 0x6b, 0x83,
+                                                          0x82, 0xda, 0xa, 0x74, 0x66, 0x90, 0xb9, 0x9e,
+                                                          0xa4, 0xe5, 0x93, 0xaf, 0x1f, 0xe, 0xe2, 0xfb,
+                                                          0x4d, 0x76, 0xf9, 0x1b, 0x77, 0xe2, 0xed, 0x12,
+                                                          0xf7, 0x23, 0xc6, 0xa, 0x54, 0xb3, 0x13, 0xf4,
+                                                          0xf7, 0x9c, 0xd3, 0x15, 0x6a, 0xf7, 0x3f, 0x5,
+                                                          0xd6, 0x7d, 0x5e, 0xf7, 0xf, 0x7e, 0x1b, 0x79,
+                                                          0x8a, 0x3d, 0x7c, 0x5b, 0x83, 0x8, 0x13, 0xb8,
+                                                          0x98, 0xa, 0x9f, 0x43, 0xe2, 0xa, 0xae, 0xfb,
+                                                          0x26, 0x7a, 0xa, 0x82, 0x83, 0x93, 0x92, 0x81,
+                                                          0x1f, 0x92, 0x82, 0x80, 0x91, 0x7d, 0x96, 0xa,
+                                                          0x1f, 0x13, 0x74, 0x70, 0xa, 0x75, 0x97, 0x83,
+                                                          0x98, 0x83, 0x1f, 0x99, 0x82, 0x9a, 0x84, 0x75,
+                                                          0xa7, 0xa, 0xfb, 0xd, 0xf8, 0x79, 0x58, 0xa,
+                                                          0x13, 0xf8, 0x25, 0xa, 0xd7, 0xa, 0xf8, 0x58,
+                                                          0xe3, 0xa, 0xf7, 0x72, 0xf7, 0x6, 0x3f, 0xa,
+                                                          0x64, 0x84, 0x38, 0x7b, 0x65, 0x89, 0x19, 0x3e,
+                                                          0xa, 0xe, 0x6e, 0xa, 0x54, 0x5e, 0x8b, 0xb7,
+                                                          0xac, 0xac, 0xe4, 0xab, 0xf7, 0x11, 0x1f, 0xf7,
+                                                          0x22, 0xde, 0x99, 0xbc, 0xfb, 0x23, 0x36, 0xb9,
+                                                          0xf7, 0x31, 0xaa, 0xf5, 0x9b, 0x82, 0xc8, 0x94,
+                                                          0x19, 0xc4, 0xa, 0xc3, 0x9f, 0x78, 0x6e, 0x7b,
+                                                          0x87, 0x77, 0x85, 0x76, 0x1f, 0x4f, 0xfb, 0x6a,
+                                                          0x28, 0x50, 0x7e, 0x5b, 0xee, 0xc6, 0x5c, 0xfb,
+                                                          0x3e, 0x7a, 0x4d, 0x79, 0x7e, 0x5a, 0x82, 0x19,
+                                                          0xe, 0xd7, 0xa, 0xf9, 0x4a, 0x77, 0x1, 0xb0,
+                                                          0xd7, 0x3, 0xf7, 0x74, 0xd3, 0xa, 0x7e, 0x88,
+                                                          0x95, 0x97, 0x9c, 0x94, 0xa0, 0x8d, 0x92, 0x1f,
+                                                          0xd5, 0xf7, 0xaf, 0xec, 0xbd, 0x97, 0xb9, 0x2a,
+                                                          0x59, 0xcc, 0xf7, 0x8e, 0x86, 0x90, 0x57, 0x7f,
+                                                          0x57, 0x82, 0x57, 0x85, 0x19, 0x7b, 0x7, 0xa5,
+                                                          0xb2, 0x82, 0x71, 0x81, 0x6f, 0xfb, 0x0, 0x6e,
+                                                          0xfb, 0x1, 0x1f, 0x43, 0x67, 0x7f, 0x5d, 0xd3,
+                                                          0xaf, 0x5, 0x62, 0xfb, 0x28, 0x6b, 0xfb, 0xf,
+                                                          0x81, 0xb5, 0xa, 0xf8, 0xdf, 0x83, 0xab, 0x73,
+                                                          0xac, 0xf7, 0xbb, 0xe9, 0xa, 0x78, 0xab, 0x12,
+                                                          0xbc, 0xf7, 0x0, 0x13, 0xb4, 0xf9, 0x84, 0xf7,
+                                                          0x74, 0x15, 0x9f, 0x89, 0xcd, 0xf7, 0x7a, 0x79,
+                                                          0x8f, 0x5, 0x37, 0x64, 0x7b, 0x80, 0xfb, 0x39,
+                                                          0x1b, 0xcb, 0xf7, 0x77, 0x5, 0x9a, 0x8f, 0x91,
+                                                          0x9c, 0xa6, 0x1b, 0xeb, 0x6, 0xf7, 0xc, 0x8b,
+                                                          0x69, 0x38, 0x1f, 0x9b, 0x6, 0xaa, 0xf7, 0x2a,
+                                                          0x5, 0xfc, 0x5, 0x6, 0x7b, 0x71, 0x8f, 0x8e,
+                                                          0x6f, 0x1f, 0x13, 0xac, 0x8f, 0x6e, 0x6d, 0x8d,
+                                                          0x73, 0x1b, 0xfb, 0x5e, 0xfb, 0x53, 0xfb, 0x5e,
+                                                          0xfb, 0x88, 0xfb, 0x14, 0xf0, 0x27, 0xf7, 0xc,
+                                                          0xb2, 0xae, 0x8d, 0x8d, 0xad, 0x1f, 0x13, 0x74,
+                                                          0x8d, 0xae, 0xae, 0x8d, 0xb3, 0x1b, 0xf7, 0xee,
+                                                          0x6, 0xcc, 0xf7, 0x3a, 0x7b, 0x91, 0x5, 0x49,
+                                                          0x5b, 0x56, 0x42, 0xfb, 0x37, 0x1b, 0x46, 0x71,
+                                                          0x8d, 0xae, 0x99, 0x95, 0xad, 0x90, 0x9f, 0x1f,
+                                                          0xbf, 0xf7, 0x52, 0x5, 0xf7, 0x1f, 0xa7, 0x7a,
+                                                          0x5e, 0x1f, 0x87, 0x71, 0x8f, 0xa0, 0x85, 0x66,
+                                                          0x8, 0xfb, 0xba, 0x72, 0x15, 0x13, 0xac, 0xfb,
+                                                          0x3, 0x6d, 0x72, 0x4b, 0x21, 0x1b, 0xfb, 0x1f,
+                                                          0x8a, 0xf7, 0x20, 0xb6, 0xf7, 0x45, 0xf7, 0x7,
+                                                          0xf7, 0x8e, 0xf7, 0x42, 0xca, 0xb5, 0x6c, 0x58,
+                                                          0x7a, 0x7e, 0x62, 0x84, 0x70, 0x1f, 0xe, 0xf7,
+                                                          0xca, 0x7f, 0xa0, 0x76, 0xb5, 0x77, 0x76, 0xf8,
+                                                          0x41, 0xa2, 0x12, 0x9f, 0xde, 0x13, 0x58, 0xf7,
+                                                          0xc3, 0xc3, 0x15, 0x62, 0x9e, 0xb3, 0x70, 0xb8,
+                                                          0x1b, 0xe0, 0xd6, 0xcf, 0xb1, 0xb0, 0x1f, 0x80,
+                                                          0x96, 0x5, 0x5f, 0x52, 0x63, 0x6c, 0x59, 0x1b,
+                                                          0x79, 0x54, 0x99, 0xcf, 0xa0, 0x8d, 0xaf, 0x94,
+                                                          0x99, 0x1f, 0x93, 0x97, 0xf0, 0x8a, 0xe5, 0xcc,
+                                                          0x8, 0xb7, 0xab, 0x9e, 0xb6, 0xa6, 0x1a, 0x92,
+                                                          0x85, 0xd4, 0x49, 0x61, 0x5c, 0x86, 0x40, 0x3c,
+                                                          0x1e, 0x93, 0x89, 0x73, 0xd3, 0x32, 0x1b, 0xfb,
+                                                          0xe, 0xfb, 0x29, 0xfb, 0x37, 0xfb, 0x1e, 0x1f,
+                                                          0x13, 0x38, 0xfb, 0x3, 0xdf, 0x63, 0xc2, 0xd5,
+                                                          0xae, 0xac, 0xad, 0xae, 0x1e, 0xfb, 0x5c, 0xc1,
+                                                          0x15, 0xf7, 0x5, 0xe1, 0xf7, 0x57, 0xe6, 0xc3,
+                                                          0x92, 0x61, 0x6e, 0x1e, 0x13, 0x98, 0x66, 0x5a,
+                                                          0xfb, 0xc1, 0xfb, 0xe, 0x46, 0x8b, 0xd6, 0xa5,
+                                                          0x1e, 0xf7, 0xb2, 0xea, 0x15, 0xf7, 0x8, 0xa9,
+                                                          0xd7, 0xea, 0xc1, 0x1b, 0xa2, 0x93, 0x70, 0x74,
+                                                          0x7a, 0x83, 0x5c, 0x54, 0x60, 0x1f, 0x6a, 0x72,
+                                                          0x73, 0x84, 0x44, 0x75, 0x8, 0xe, 0x79, 0xae,
+                                                          0x80, 0x76, 0xf9, 0x1c, 0xac, 0x8c, 0x77, 0x12,
+                                                          0xbe, 0x9f, 0xc7, 0xe3, 0x13, 0x6c, 0xb9, 0xa,
+                                                          0x9a, 0x85, 0x83, 0x9e, 0x1f, 0x13, 0xac, 0x81,
+                                                          0xa4, 0xaa, 0x7f, 0xb2, 0x6d, 0xa, 0x13, 0x9c,
+                                                          0xb3, 0xf7, 0x5b, 0x5, 0x74, 0x6, 0x78, 0x80,
+                                                          0x7a, 0x85, 0x78, 0x1b, 0x78, 0x75, 0x91, 0x91,
+                                                          0x7a, 0x1f, 0x13, 0xac, 0x91, 0x79, 0x7d, 0x91,
+                                                          0x5e, 0x64, 0xa, 0x13, 0x6c, 0xf7, 0x98, 0xf8,
+                                                          0x84, 0x52, 0xa, 0xab, 0x93, 0x76, 0xf8, 0x43,
+                                                          0xa2, 0xf7, 0x70, 0x77, 0x12, 0xf7, 0x1, 0xd4,
+                                                          0x8b, 0xf7, 0x28, 0x25, 0xd7, 0x13, 0xf4, 0xc2,
+                                                          0xa, 0x99, 0x9a, 0x87, 0x86, 0x99, 0x1f, 0x86,
+                                                          0x9a, 0x9b, 0x86, 0x9a, 0x1b, 0xc3, 0xe8, 0xa4,
+                                                          0xf7, 0x1, 0xb5, 0x6d, 0xb6, 0x6d, 0xb3, 0x1f,
+                                                          0x6c, 0xb4, 0x6c, 0xb2, 0xab, 0x1a, 0xbc, 0xab,
+                                                          0x94, 0xa1, 0x1e, 0x13, 0xf8, 0xcc, 0xa8, 0x51,
+                                                          0x52, 0x1f, 0x9b, 0x6, 0xbb, 0xa, 0x7b, 0x80,
+                                                          0x90, 0x90, 0x7e, 0x1f, 0x8f, 0x80, 0x7e, 0x8e,
+                                                          0x76, 0x1b, 0x21, 0x7d, 0x3b, 0x6c, 0x63, 0xab,
+                                                          0x5d, 0xaa, 0x60, 0x1f, 0x13, 0xf4, 0xa8, 0x63,
+                                                          0xa6, 0x65, 0x6b, 0xb4, 0xa, 0xf7, 0x65, 0xf7,
+                                                          0xee, 0x52, 0xa, 0xf7, 0x5b, 0xa0, 0x76, 0xf9,
+                                                          0x11, 0xdf, 0xa, 0xf7, 0x8d, 0xc6, 0xa, 0x13,
+                                                          0xcc, 0xcf, 0xa, 0x51, 0x8f, 0x6c, 0x90, 0xb6,
+                                                          0x1a, 0x94, 0x8d, 0x96, 0x8f, 0x98, 0x1e, 0xc7,
+                                                          0xf7, 0x61, 0xf7, 0x6f, 0xf7, 0xa2, 0xab, 0xb3,
+                                                          0x96, 0x93, 0xa6, 0x98, 0x19, 0x13, 0xbc, 0x9b,
+                                                          0xfb, 0x51, 0x7, 0x13, 0xcc, 0x7b, 0x7, 0xb3,
+                                                          0x87, 0xa6, 0x86, 0x73, 0x1a, 0x84, 0x89, 0x83,
+                                                          0x87, 0x80, 0x1e, 0x7c, 0x64, 0xfb, 0xc, 0xfb,
+                                                          0x1c, 0x5e, 0x53, 0x73, 0xe7, 0x6e, 0xf0, 0x83,
+                                                          0xad, 0x8, 0x88, 0x96, 0x8b, 0x94, 0x93, 0x1a,
+                                                          0xa4, 0xa3, 0x95, 0xb8, 0x1e, 0x13, 0xbc, 0x9b,
+                                                          0xfb, 0x83, 0x7, 0x13, 0xcc, 0x7b, 0x7, 0xbf,
+                                                          0x83, 0x93, 0x8a, 0x9b, 0x52, 0xd8, 0xfb, 0xa1,
+                                                          0x18, 0x4b, 0xfb, 0x5e, 0x78, 0x49, 0x67, 0x7d,
+                                                          0x5c, 0x87, 0x19, 0xf7, 0x3f, 0xf9, 0x85, 0x15,
+                                                          0x13, 0xbc, 0x21, 0xa, 0xf7, 0x5b, 0x8b, 0xaf,
+                                                          0xf8, 0xd9, 0xaf, 0xf7, 0x70, 0x77, 0x50, 0xa,
+                                                          0xf7, 0xe3, 0xf9, 0x46, 0x52, 0xa, 0xab, 0x54,
+                                                          0x76, 0xf8, 0x50, 0xc7, 0xf7, 0x7d, 0x77, 0x12,
+                                                          0xf7, 0xd8, 0xd0, 0x17, 0xba, 0xa, 0xac, 0xac,
+                                                          0x79, 0x77, 0xac, 0x1f, 0x74, 0xb2, 0xb2, 0x72,
+                                                          0xb3, 0xaf, 0xa, 0x82, 0x8d, 0x85, 0x8e, 0x85,
+                                                          0x1f, 0x8f, 0x82, 0x90, 0x84, 0x84, 0x1a, 0x7e,
+                                                          0x7b, 0x88, 0x7f, 0x81, 0x78, 0x8b, 0xac, 0x71,
+                                                          0x1e, 0x57, 0xce, 0x7a, 0x9e, 0x49, 0x99, 0xf7,
+                                                          0xb6, 0xf7, 0xec, 0x18, 0xca, 0xa, 0xc3, 0xa1,
+                                                          0xaa, 0x8e, 0xb1, 0x1b, 0xf7, 0x1c, 0x6, 0x13,
+                                                          0xa0, 0x38, 0xf7, 0x10, 0x52, 0xa, 0xfb, 0x4a,
+                                                          0xa2, 0xf8, 0xa7, 0xa9, 0xf7, 0x8f, 0xa8, 0x1,
+                                                          0xa4, 0xdf, 0xf7, 0xd1, 0xdc, 0x3, 0xf7, 0xe,
+                                                          0xf8, 0x8, 0x15, 0xf7, 0x4, 0x6, 0x67, 0xfb,
+                                                          0xe1, 0x5, 0xfb, 0x8, 0x7e, 0x80, 0x39, 0x4f,
+                                                          0x1b, 0x85, 0x7e, 0x8f, 0x97, 0x91, 0x8f, 0x90,
+                                                          0x8e, 0x91, 0x1f, 0x8f, 0x91, 0x8e, 0x92, 0x93,
+                                                          0x1a, 0x9c, 0x7c, 0xa0, 0x73, 0x85, 0x64, 0x89,
+                                                          0x5a, 0x6d, 0xa4, 0x69, 0xc2, 0xf7, 0x18, 0xb0,
+                                                          0xf7, 0x72, 0xb2, 0x90, 0x1e, 0xb2, 0xf7, 0xb9,
+                                                          0x5, 0xf7, 0xe, 0x6, 0x92, 0xa9, 0x5, 0xfb,
+                                                          0x12, 0x6, 0xf7, 0x34, 0x9f, 0x99, 0xe6, 0xcc,
+                                                          0x1b, 0x97, 0x92, 0x84, 0x85, 0x85, 0x88, 0x85,
+                                                          0x87, 0x85, 0x1f, 0x88, 0x86, 0x88, 0x86, 0x84,
+                                                          0x1a, 0x72, 0xa2, 0x7d, 0x9c, 0xa5, 0x9a, 0xa0,
+                                                          0xa5, 0xbe, 0x59, 0x9d, 0x6d, 0xfb, 0x2, 0x50,
+                                                          0xfb, 0x20, 0xfb, 0x20, 0x77, 0x1e, 0xfb, 0x1,
+                                                          0x6, 0xe, 0x73, 0xf8, 0x95, 0x76, 0xd1, 0xa,
+                                                          0xe6, 0xf8, 0x80, 0x15, 0xb4, 0x6, 0xf7, 0x16,
+                                                          0xf3, 0xe0, 0x23, 0x5, 0xb1, 0x6, 0x33, 0xf7,
+                                                          0x3d, 0x5, 0x5a, 0x6, 0xe, 0x73, 0xf8, 0x95,
+                                                          0x76, 0xd1, 0xa, 0xf7, 0xd, 0xf7, 0xc5, 0x3,
+                                                          0xf7, 0x6d, 0xf8, 0x80, 0x7b, 0xa, 0x66, 0x6,
+                                                          0xfb, 0x1e, 0x22, 0x2f, 0xf4, 0x5, 0x65, 0x6,
+                                                          0xe, 0x73, 0xf8, 0x80, 0xc3, 0xf1, 0x77, 0x1,
+                                                          0xf7, 0x9, 0xa9, 0x3, 0xf7, 0x9, 0xf9, 0x1e,
+                                                          0x15, 0x61, 0x8c, 0xfb, 0x8, 0xf7, 0x19, 0xe1,
+                                                          0xce, 0xd2, 0xe2, 0x99, 0x1e, 0x6d, 0x6, 0x87,
+                                                          0x8a, 0x6b, 0x29, 0x28, 0x1b, 0x28, 0x81, 0xe1,
+                                                          0x9b, 0x1f, 0xe, 0x73, 0xf8, 0x90, 0xed, 0x1,
+                                                          0xf7, 0x63, 0xed, 0x3, 0xf7, 0x63, 0xf8, 0xc1,
+                                                          0x58, 0xa, 0xe, 0x73, 0xf8, 0x80, 0xad, 0x69,
+                                                          0xf7, 0x39, 0xab, 0xa, 0xf7, 0x39, 0x12, 0xf7,
+                                                          0x2f, 0xae, 0x68, 0xf7, 0x3b, 0xfb, 0x18, 0xf7,
+                                                          0x18, 0xfb, 0x18, 0xf7, 0x39, 0x6a, 0xac, 0x13,
+                                                          0xa4, 0x80, 0xf7, 0x2f, 0xf8, 0xe3, 0x15, 0x54,
+                                                          0xb7, 0x5f, 0xc2, 0x1e, 0x13, 0x99, 0x0, 0xc2,
+                                                          0xb9, 0xb7, 0xc2, 0xc2, 0x5d, 0xb8, 0x54, 0x1f,
+                                                          0x13, 0x44, 0x80, 0x54, 0x5f, 0x5e, 0x54, 0x1f,
+                                                          0xae, 0x16, 0xaf, 0xa8, 0xa9, 0xaf, 0xaf, 0xaa,
+                                                          0x6d, 0x67, 0x67, 0x6c, 0x6e, 0x67, 0x1e, 0x13,
+                                                          0xaa, 0x80, 0xe5, 0xa, 0xe, 0x73, 0xfb, 0x3d,
+                                                          0xb7, 0xf7, 0x39, 0x77, 0x1, 0x77, 0xc5, 0x3,
+                                                          0xc5, 0xb3, 0x15, 0x6e, 0x71, 0x5a, 0x44, 0x62,
+                                                          0x1a, 0x59, 0xa3, 0x76, 0xaa, 0xbb, 0xe8, 0xb2,
+                                                          0xb4, 0xa3, 0x1e, 0x75, 0x9c, 0x5, 0x6f, 0x76,
+                                                          0x43, 0x72, 0x74, 0x1b, 0x7d, 0x81, 0x94, 0x9f,
+                                                          0xb3, 0xa2, 0xc5, 0xa5, 0xb1, 0x1f, 0xe, 0x73,
+                                                          0xf8, 0x9c, 0xf2, 0x12, 0xef, 0xa2, 0xa, 0xa8,
+                                                          0x1f, 0x13, 0x80, 0x80, 0xa7, 0x57, 0xa, 0x78,
+                                                          0x75, 0x95, 0x96, 0x72, 0x1f, 0x96, 0x72, 0x70,
+                                                          0x96, 0x70, 0xd6, 0xa, 0x73, 0xf8, 0x82, 0xf7,
+                                                          0x3e, 0x1, 0xe8, 0xf8, 0x1d, 0x3, 0xe8, 0xad,
+                                                          0xa, 0xf7, 0x36, 0xee, 0x9f, 0xa, 0x9a, 0x99,
+                                                          0x47, 0xa, 0x7a, 0x80, 0x9d, 0xa, 0x9c, 0xfb,
+                                                          0x2d, 0x5e, 0xa, 0xe, 0xf7, 0x59, 0xad, 0x69,
+                                                          0xb9, 0x1, 0x85, 0xf7, 0x59, 0x15, 0xf8, 0x89,
+                                                          0x6, 0x95, 0xad, 0x5, 0xfc, 0x89, 0x6, 0xe,
+                                                          0xf8, 0xa8, 0xf7, 0x59, 0xb1, 0x65, 0xb9, 0x1,
+                                                          0x85, 0xf7, 0x59, 0x15, 0xfa, 0xd, 0x6, 0x96,
+                                                          0xb1, 0x5, 0xfe, 0xd, 0x6, 0xe, 0x73, 0x91,
+                                                          0xa, 0xf7, 0x3f, 0xcb, 0x4b, 0xf7, 0x5, 0x13,
+                                                          0xd0, 0xf7, 0xca, 0xf9, 0x1d, 0x15, 0x79, 0xa,
+                                                          0xb9, 0x93, 0xb5, 0xa0, 0x80, 0x96, 0x7f, 0x95,
+                                                          0x1e, 0x13, 0xe0, 0x7e, 0x96, 0x7e, 0x93, 0x9d,
+                                                          0xbd, 0xa, 0xe, 0x73, 0x91, 0xa, 0xf7, 0x44,
+                                                          0xf7, 0x6, 0x4b, 0xcb, 0x13, 0xe0, 0xf7, 0x34,
+                                                          0xf8, 0x48, 0x15, 0xea, 0xa, 0xc8, 0x9c, 0xa,
+                                                          0xaa, 0x69, 0x83, 0x5c, 0x84, 0x61, 0x76, 0x96,
+                                                          0x81, 0x97, 0x81, 0x1e, 0x13, 0xd0, 0x98, 0x80,
+                                                          0x99, 0x82, 0x79, 0x1a, 0x66, 0x54, 0x68, 0x77,
+                                                          0x7e, 0x1e, 0xe, 0x73, 0xfb, 0x15, 0xf7, 0x7a,
+                                                          0x12, 0xd2, 0xc0, 0xa, 0x13, 0xc0, 0xb7, 0xfb,
+                                                          0x4, 0x15, 0x6b, 0xa, 0x74, 0x98, 0x7f, 0x98,
+                                                          0x81, 0x1e, 0x13, 0xa0, 0x96, 0x82, 0x96, 0x82,
+                                                          0x7b, 0x82, 0xa, 0xe, 0xf7, 0x5b, 0x91, 0xa,
+                                                          0xf7, 0x3a, 0xcb, 0x4b, 0xf7, 0x4, 0xec, 0xcb,
+                                                          0x4b, 0xf7, 0x4, 0x13, 0xd4, 0xf7, 0xc5, 0xf9,
+                                                          0x1d, 0x15, 0x79, 0xa, 0xb8, 0x93, 0xb5, 0xa2,
+                                                          0x7e, 0x97, 0x7e, 0x95, 0x1e, 0x13, 0xe4, 0x80,
+                                                          0x94, 0x80, 0x94, 0x9b, 0xbd, 0xa, 0xf7, 0x65,
+                                                          0x16, 0x79, 0xa, 0xb8, 0x93, 0xb5, 0xa3, 0x7d,
+                                                          0x96, 0x7e, 0x96, 0x1e, 0x13, 0xd8, 0x80, 0x94,
+                                                          0x81, 0x93, 0x9b, 0xbd, 0xa, 0xe, 0xf7, 0x5b,
+                                                          0x91, 0xa, 0xf7, 0x46, 0xc0, 0xa, 0xec, 0xc0,
+                                                          0xa, 0x13, 0xe4, 0xf7, 0x34, 0xf8, 0x48, 0x15,
+                                                          0x59, 0xa, 0x75, 0x96, 0x80, 0x97, 0x81, 0x1e,
+                                                          0x13, 0xd8, 0x97, 0x81, 0x98, 0x82, 0x7a, 0x82,
+                                                          0xa, 0xf7, 0x6e, 0x7a, 0x15, 0x59, 0xa, 0x77,
+                                                          0x94, 0x80, 0x96, 0x82, 0x1e, 0x13, 0xd4, 0x98,
+                                                          0x80, 0x9a, 0x82, 0x78, 0x82, 0xa, 0xe, 0xf7,
+                                                          0x5b, 0xfb, 0x15, 0xf7, 0x7a, 0x12, 0xdf, 0xc0,
+                                                          0xa, 0xec, 0xc0, 0xa, 0x13, 0xd0, 0xc4, 0xfb,
+                                                          0x4, 0x15, 0x6b, 0xa, 0x75, 0x97, 0x7f, 0x97,
+                                                          0x81, 0x1e, 0x13, 0xb0, 0x97, 0x81, 0x97, 0x83,
+                                                          0x7a, 0x82, 0xa, 0xf7, 0x65, 0x16, 0x6b, 0xa,
+                                                          0x73, 0x99, 0x80, 0x98, 0x80, 0x1e, 0x13, 0xa8,
+                                                          0x96, 0x82, 0x95, 0x83, 0x7b, 0x82, 0xa, 0xe,
+                                                          0xf8, 0x3e, 0xa0, 0xf7, 0x6f, 0x77, 0x12, 0xf7,
+                                                          0xb2, 0xe4, 0x17, 0xf7, 0x31, 0xfb, 0x33, 0x15,
+                                                          0xa1, 0x6, 0xbb, 0xf7, 0x66, 0x97, 0xc1, 0xb2,
+                                                          0xf7, 0x1, 0xa9, 0xb7, 0x19, 0x81, 0x8e, 0x85,
+                                                          0xb5, 0xb7, 0x1a, 0xa7, 0x8e, 0xa9, 0x91, 0xa0,
+                                                          0x1e, 0xbc, 0xa7, 0x82, 0x82, 0xa0, 0x1f, 0x84,
+                                                          0x9c, 0x97, 0x85, 0x9a, 0x1b, 0xa8, 0x9b, 0xa0,
+                                                          0xa0, 0x1f, 0x13, 0xe0, 0x9f, 0x7c, 0x9f, 0x6c,
+                                                          0x72, 0x7e, 0x84, 0x83, 0x7a, 0x1e, 0x84, 0x7a,
+                                                          0x75, 0x83, 0x5f, 0x1b, 0x96, 0xc3, 0x9d, 0xa7,
+                                                          0x9a, 0x9f, 0x8, 0x9a, 0x9f, 0x97, 0x98, 0xa5,
+                                                          0x1a, 0xb0, 0x77, 0x9e, 0x76, 0x74, 0x72, 0x77,
+                                                          0x67, 0x7a, 0x8e, 0x7f, 0x8d, 0x7e, 0x1e, 0x8d,
+                                                          0x81, 0x8d, 0x7f, 0x7c, 0x1a, 0x78, 0x88, 0x6f,
+                                                          0x84, 0x66, 0x1e, 0x60, 0x75, 0x92, 0x93, 0x79,
+                                                          0x1f, 0x92, 0x7a, 0x7e, 0x93, 0x72, 0x1b, 0x6c,
+                                                          0x7c, 0x77, 0x77, 0x76, 0x9b, 0x76, 0xa8, 0x9c,
+                                                          0x99, 0x93, 0x93, 0x9e, 0x1f, 0x93, 0x9e, 0xa4,
+                                                          0x92, 0xb3, 0x1b, 0x7f, 0x45, 0x73, 0x55, 0x65,
+                                                          0x63, 0x99, 0xfb, 0x20, 0x76, 0x56, 0x61, 0xfb,
+                                                          0x78, 0x8, 0xe, 0xfb, 0x57, 0x76, 0xf7, 0x3e,
+                                                          0xd3, 0x74, 0x76, 0xb2, 0x76, 0xf8, 0x58, 0xd3,
+                                                          0xf7, 0x3e, 0x77, 0x12, 0xd8, 0xe0, 0xf7, 0x39,
+                                                          0xe0, 0x13, 0x9f, 0xf7, 0x30, 0x79, 0x15, 0x7b,
+                                                          0x5b, 0x4c, 0x4a, 0x5b, 0x1a, 0x79, 0x99, 0x78,
+                                                          0x9e, 0xaa, 0xa0, 0xa3, 0xdb, 0xab, 0x8e, 0xab,
+                                                          0x94, 0xa9, 0x1e, 0xc2, 0xb8, 0x6f, 0xaf, 0x1b,
+                                                          0xa0, 0x9e, 0x9a, 0xa0, 0x9f, 0x78, 0x9b, 0x78,
+                                                          0x1f, 0x66, 0x67, 0x71, 0x50, 0x1b, 0x9b, 0xb3,
+                                                          0x9e, 0xb5, 0xb0, 0xa4, 0x8, 0x84, 0x9d, 0x88,
+                                                          0x9d, 0x9e, 0x1a, 0xd0, 0xb3, 0xee, 0xc3, 0xb4,
+                                                          0x1e, 0x7f, 0x9e, 0x85, 0x9a, 0xa2, 0x1a, 0x9c,
+                                                          0x8f, 0x9c, 0x8f, 0x9b, 0x1e, 0xc9, 0xb1, 0x71,
+                                                          0xae, 0x1b, 0x9f, 0x9f, 0x9a, 0xa0, 0x9e, 0x77,
+                                                          0x9c, 0x79, 0x1f, 0x66, 0x5b, 0x6f, 0x5c, 0x1b,
+                                                          0x9b, 0xbb, 0xca, 0xcc, 0xbb, 0x1a, 0x9d, 0x7d,
+                                                          0x9e, 0x78, 0x6c, 0x76, 0x73, 0x3b, 0x1e, 0x13,
+                                                          0xcf, 0x6b, 0x88, 0x6b, 0x82, 0x6d, 0x1e, 0x54,
+                                                          0x5e, 0xa7, 0x67, 0x1b, 0x76, 0x78, 0x7c, 0x76,
+                                                          0x1f, 0x13, 0xaf, 0x77, 0x9e, 0x7b, 0x9e, 0x1e,
+                                                          0xb0, 0xaf, 0xa5, 0xc6, 0x1b, 0x7b, 0x63, 0x78,
+                                                          0x61, 0x66, 0x72, 0x8, 0x92, 0x79, 0x8e, 0x79,
+                                                          0x78, 0x1a, 0x46, 0x63, 0x28, 0x53, 0x62, 0x1e,
+                                                          0x13, 0xcf, 0x97, 0x78, 0x91, 0x7c, 0x74, 0x1a,
+                                                          0x7a, 0x87, 0x7a, 0x87, 0x7b, 0x1e, 0x4d, 0x65,
+                                                          0xa5, 0x68, 0x1b, 0x13, 0x9f, 0x77, 0x77, 0x7c,
+                                                          0x76, 0x78, 0x9f, 0x7a, 0x9d, 0x1f, 0xb0, 0xbb,
+                                                          0xa7, 0xba, 0x1b, 0xe, 0x84, 0xf7, 0x68, 0x76,
+                                                          0xad, 0x76, 0xf7, 0x87, 0x77, 0xad, 0x77, 0x12,
+                                                          0xbe, 0xf7, 0x8a, 0x13, 0x98, 0xc0, 0xf7, 0xdb,
+                                                          0x15, 0x13, 0x58, 0x47, 0xc1, 0x54, 0xcf, 0xce,
+                                                          0xc1, 0xc3, 0xce, 0x1e, 0x13, 0xa8, 0xce, 0x55,
+                                                          0xc0, 0x47, 0x47, 0x56, 0x56, 0x48, 0x1e, 0xe,
+                                                          0xf8, 0xa8, 0x80, 0xef, 0x12, 0xc4, 0xf7, 0x3,
+                                                          0x35, 0xef, 0xf7, 0x3b, 0xef, 0x2c, 0xf7, 0x3,
+                                                          0xf7, 0x2c, 0xef, 0x49, 0xf7, 0x3, 0x13, 0xaa,
+                                                          0xdd, 0xb2, 0x15, 0x8f, 0xa, 0x13, 0xd2, 0xf7,
+                                                          0x9f, 0x16, 0x8f, 0xa, 0x13, 0xcc, 0xf7, 0xa0,
+                                                          0x16, 0x6f, 0xa0, 0x75, 0xa7, 0xa7, 0xa2, 0xa1,
+                                                          0xa7, 0xa7, 0x74, 0xa1, 0x6f, 0x6f, 0x76, 0x75,
+                                                          0x6f, 0x1e, 0xe, 0xf9, 0x17, 0xb0, 0xa, 0xcb,
+                                                          0xd0, 0xa, 0x75, 0xd0, 0xa, 0xb1, 0xd0, 0xa,
+                                                          0x13, 0xb5, 0xe0, 0xf9, 0x42, 0xf7, 0x9, 0x30,
+                                                          0xa, 0xfc, 0x27, 0xbc, 0x30, 0xa, 0xfb, 0xeb,
+                                                          0xf8, 0x11, 0x6a, 0xa, 0x1e, 0x13, 0xb6, 0xe0,
+                                                          0x2f, 0xa, 0x13, 0x6e, 0xe0, 0x53, 0xfc, 0x33,
+                                                          0x15, 0xb5, 0x6, 0xf8, 0xad, 0xf9, 0x48, 0x5,
+                                                          0x61, 0x6, 0xe, 0x73, 0xb0, 0xf8, 0x2, 0x1,
+                                                          0xbe, 0xf7, 0x7a, 0x3, 0xbe, 0xf7, 0x6c, 0x68,
+                                                          0xa, 0x96, 0x63, 0xef, 0x6c, 0xc8, 0x1f, 0xf7,
+                                                          0x12, 0xf7, 0x16, 0x9e, 0xaa, 0x9c, 0x69, 0xa,
+                                                          0xe, 0x73, 0xce, 0xa, 0xc7, 0xf7, 0x72, 0x3,
+                                                          0xf7, 0x5a, 0xf7, 0x73, 0x15, 0xfb, 0x12, 0xfb,
+                                                          0x16, 0x77, 0x6c, 0x7a, 0x44, 0xa, 0x80, 0xb4,
+                                                          0x27, 0xaa, 0x4e, 0x1f, 0xe, 0xfb, 0x52, 0x96,
+                                                          0x76, 0xf9, 0x42, 0x77, 0x1, 0x82, 0x81, 0x15,
+                                                          0xb7, 0x6, 0xf7, 0x36, 0xf9, 0x42, 0x5, 0x5c,
+                                                          0x6, 0xe, 0x8b, 0xb8, 0xf7, 0x65, 0xb1, 0xe1,
+                                                          0xb1, 0xf7, 0x6b, 0xb0, 0x1, 0xf7, 0x4e, 0xf7,
+                                                          0x1, 0xf7, 0x8a, 0xa2, 0x3, 0xce, 0xf7, 0x92,
+                                                          0x15, 0xfb, 0x41, 0xf4, 0x3a, 0xf6, 0xf6, 0xf7,
+                                                          0x12, 0xba, 0xdf, 0xbf, 0x1e, 0x7a, 0x94, 0x5,
+                                                          0x53, 0x63, 0x26, 0x64, 0x57, 0x1b, 0xfb, 0x13,
+                                                          0x58, 0xbf, 0xf7, 0x31, 0x1f, 0xf7, 0xac, 0x6,
+                                                          0x97, 0xb1, 0x5, 0xfb, 0xb7, 0x6, 0xa5, 0x94,
+                                                          0xab, 0x94, 0xa7, 0x1e, 0xf7, 0xb5, 0x6, 0x99,
+                                                          0xb1, 0x5, 0xfb, 0xb5, 0x6, 0xd5, 0x97, 0xe2,
+                                                          0xf7, 0x21, 0xf1, 0x1b, 0xf7, 0x6, 0x91, 0x52,
+                                                          0x2e, 0x1f, 0xa2, 0xf7, 0x22, 0x6, 0x9e, 0x63,
+                                                          0x79, 0xa5, 0x2c, 0x1b, 0x52, 0xfb, 0x44, 0x53,
+                                                          0xfb, 0x58, 0x49, 0x1f, 0x28, 0x6, 0x7e, 0x65,
+                                                          0x5, 0xeb, 0x6, 0x83, 0x6e, 0x83, 0x6f, 0x89,
+                                                          0x6e, 0x8, 0x4a, 0x6, 0x7e, 0x65, 0x5, 0xe,
+                                                          0xf9, 0x3, 0xf7, 0x8d, 0x9f, 0x8a, 0x76, 0xf8,
+                                                          0x16, 0x9f, 0x12, 0xf7, 0x3b, 0xd2, 0xf7, 0x8e,
+                                                          0xa5, 0xf7, 0xd0, 0xd2, 0x13, 0xbc, 0xf7, 0x9,
+                                                          0xf7, 0x8d, 0x15, 0xf7, 0x3f, 0x9f, 0x6, 0x57,
+                                                          0x91, 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0xc0, 0xbd,
+                                                          0x7, 0xb4, 0x9c, 0x6c, 0x66, 0x94, 0x1f, 0x9f,
+                                                          0xe3, 0xfb, 0xed, 0x33, 0x9f, 0x6, 0xb0, 0x94,
+                                                          0x9c, 0xaa, 0xb5, 0x1b, 0xbc, 0xfb, 0xc0, 0x6,
+                                                          0x5b, 0x8d, 0x81, 0x57, 0x85, 0x1e, 0xf7, 0xd3,
+                                                          0x77, 0x15, 0xf7, 0x17, 0x9f, 0x6, 0x5e, 0x8f,
+                                                          0x83, 0xa6, 0xb7, 0x1a, 0xf7, 0x65, 0x8d, 0x7,
+                                                          0x13, 0x7c, 0xf7, 0x29, 0xfb, 0xc6, 0x5, 0x96,
+                                                          0x6, 0xf7, 0x2c, 0xf7, 0xc8, 0x5, 0x8d, 0xfb,
+                                                          0x72, 0x6, 0x13, 0xbc, 0x5b, 0x8e, 0x81, 0x57,
+                                                          0x85, 0x1e, 0x77, 0xf7, 0x3e, 0x9f, 0x7, 0x57,
+                                                          0x91, 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0x89, 0x7,
+                                                          0xae, 0x97, 0x9d, 0xb7, 0x8d, 0x1e, 0x9f, 0x24,
+                                                          0x7, 0xfb, 0x34, 0xfb, 0xc9, 0xfb, 0x2e, 0xf7,
+                                                          0xc9, 0x5, 0xfb, 0xd, 0x77, 0x6, 0xa8, 0xa7,
+                                                          0x77, 0x6d, 0x97, 0x1f, 0xfb, 0x83, 0x7, 0x5f,
+                                                          0x83, 0x70, 0x5f, 0x87, 0x1e, 0xe, 0xf7, 0xd2,
+                                                          0xe1, 0xf7, 0x70, 0x15, 0xf8, 0x96, 0xb5, 0xfc,
+                                                          0x96, 0x6, 0xe, 0xfb, 0x63, 0xa3, 0x73, 0xf7,
+                                                          0x4, 0xf3, 0x76, 0xf8, 0x2c, 0xab, 0xf7, 0x7b,
+                                                          0xa1, 0x12, 0x13, 0xb8, 0xb8, 0xf8, 0x20, 0x15,
+                                                          0xe2, 0x6, 0x81, 0x75, 0x53, 0xfb, 0xb3, 0x74,
+                                                          0xfb, 0x3, 0x8, 0x55, 0x80, 0x70, 0x22, 0x54,
+                                                          0x1b, 0x77, 0x87, 0x8e, 0x95, 0x90, 0x8e, 0x92,
+                                                          0x8e, 0x93, 0x1f, 0x13, 0x78, 0x8d, 0x91, 0x8c,
+                                                          0x91, 0x91, 0x1a, 0x98, 0x82, 0xa3, 0x70, 0x70,
+                                                          0x7e, 0x68, 0x7c, 0x7a, 0x98, 0x5e, 0xcc, 0xf7,
+                                                          0x9, 0xc3, 0xf7, 0x34, 0xf7, 0xf, 0xa7, 0x1e,
+                                                          0xd3, 0xf7, 0xd4, 0x5, 0xf7, 0x2f, 0x6, 0x97,
+                                                          0x8f, 0x87, 0x86, 0x88, 0x8b, 0x87, 0x8a, 0x88,
+                                                          0x1f, 0x6e, 0x20, 0x53, 0xfb, 0x52, 0x66, 0x1a,
+                                                          0x6c, 0x9d, 0x77, 0xaa, 0xb8, 0xb7, 0xb9, 0xc6,
+                                                          0xb5, 0x1e, 0x7b, 0x94, 0x5, 0x78, 0x7b, 0x61,
+                                                          0x59, 0x78, 0x1b, 0x86, 0x84, 0x8d, 0x94, 0x9a,
+                                                          0xe3, 0xf7, 0xce, 0x92, 0xa7, 0x1f, 0x90, 0x9e,
+                                                          0x8c, 0x91, 0x8a, 0x8e, 0x86, 0x8e, 0x18, 0x85,
+                                                          0x80, 0x89, 0x89, 0x7b, 0x1f, 0x89, 0x7b, 0x75,
+                                                          0x89, 0x6f, 0x1b, 0xfb, 0x2a, 0x6, 0xf7, 0x16,
+                                                          0xb0, 0xa7, 0xf0, 0xea, 0x1b, 0x9f, 0x9a, 0x86,
+                                                          0x80, 0x86, 0x88, 0x87, 0x88, 0x85, 0x1f, 0x88,
+                                                          0x85, 0x87, 0x83, 0x7d, 0x1a, 0x70, 0x9b, 0x7d,
+                                                          0xa0, 0x9f, 0xa5, 0x99, 0xb2, 0xba, 0x55, 0xa1,
+                                                          0x5d, 0xfb, 0x37, 0x58, 0xfb, 0x31, 0x2b, 0x6f,
+                                                          0x1e, 0x34, 0x6, 0xe, 0xfb, 0x60, 0xa4, 0xf7,
+                                                          0x53, 0x76, 0xf8, 0x29, 0xab, 0xf7, 0x7c, 0xa1,
+                                                          0x12, 0xfb, 0x21, 0xd3, 0x17, 0xf7, 0x6c, 0xf8,
+                                                          0x40, 0x15, 0xd2, 0x9d, 0xb0, 0xf7, 0x35, 0xf7,
+                                                          0x1, 0x1b, 0x13, 0xf8, 0xa9, 0x97, 0x7d, 0x82,
+                                                          0x1f, 0x86, 0x7f, 0x81, 0x7d, 0x1a, 0x85, 0x8d,
+                                                          0x86, 0x8e, 0x85, 0x1e, 0x8e, 0x85, 0x8e, 0x84,
+                                                          0x89, 0x85, 0x67, 0xfb, 0x24, 0x18, 0xfb, 0xea,
+                                                          0x6b, 0x15, 0xe4, 0x6, 0x87, 0x79, 0x5f, 0xfb,
+                                                          0x69, 0x64, 0xfb, 0x4e, 0x8, 0x4e, 0x7e, 0x70,
+                                                          0x2a, 0x57, 0x1b, 0x75, 0x88, 0x8f, 0x94, 0x90,
+                                                          0x8e, 0x92, 0x8d, 0x92, 0x1f, 0x8d, 0x91, 0x8d,
+                                                          0x91, 0x92, 0x1a, 0x9e, 0x7c, 0x9c, 0x77, 0x6b,
+                                                          0x82, 0x6c, 0x77, 0x7e, 0x94, 0x5b, 0xd1, 0xea,
+                                                          0xce, 0xf7, 0x3, 0xf7, 0x47, 0xb3, 0x1e, 0xd0,
+                                                          0xf7, 0xca, 0x5, 0xf7, 0x3a, 0x6, 0x7a, 0x35,
+                                                          0x4c, 0xfb, 0x67, 0x53, 0x1a, 0x6a, 0x9e, 0x78,
+                                                          0xa7, 0xad, 0xb0, 0x9c, 0xe3, 0xc9, 0x1e, 0x7b,
+                                                          0x94, 0x5, 0x70, 0x74, 0x67, 0x61, 0x79, 0x1b,
+                                                          0x86, 0x84, 0x8d, 0x95, 0x1f, 0x13, 0x30, 0xa1,
+                                                          0xf7, 0x1d, 0xf8, 0xc0, 0x94, 0xac, 0x1e, 0x8c,
+                                                          0x90, 0x8c, 0x90, 0x8f, 0x1a, 0x90, 0x89, 0x8f,
+                                                          0x88, 0x87, 0x85, 0x88, 0x89, 0x84, 0x1e, 0x88,
+                                                          0x84, 0x84, 0x88, 0x83, 0x1b, 0x83, 0x7d, 0x8e,
+                                                          0x8e, 0x7b, 0x1f, 0x8d, 0x7b, 0x7a, 0x8e, 0x7d,
+                                                          0x1b, 0xfb, 0x2e, 0x4a, 0xfb, 0x1e, 0xfb, 0x8,
+                                                          0x6b, 0x1f, 0x30, 0x6, 0xe, 0x79, 0x9d, 0xf8,
+                                                          0x3f, 0x98, 0xf7, 0x68, 0x9c, 0x91, 0x92, 0x6,
+                                                          0xfb, 0x64, 0x8f, 0xf8, 0x6c, 0x8d, 0x7, 0x1e,
+                                                          0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xaa, 0xa,
+                                                          0xd6, 0xb, 0xf8, 0x88, 0x14, 0xf7, 0xf9, 0x15,
+                                                          0xb0, 0x13, 0x0, 0xcd, 0x2, 0x0, 0x1, 0x0,
+                                                          0x13, 0x0, 0x17, 0x0, 0x31, 0x0, 0x34, 0x0,
+                                                          0x61, 0x0, 0x67, 0x0, 0x9c, 0x0, 0xa5, 0x0,
+                                                          0xb6, 0x0, 0xbf, 0x0, 0xf3, 0x1, 0xf, 0x1,
+                                                          0x1b, 0x1, 0x27, 0x1, 0x2c, 0x1, 0x4e, 0x1,
+                                                          0x53, 0x1, 0x59, 0x1, 0x6b, 0x1, 0x72, 0x1,
+                                                          0x88, 0x1, 0xa2, 0x1, 0xb8, 0x1, 0xdf, 0x1,
+                                                          0xf3, 0x2, 0x2, 0x2, 0x21, 0x2, 0x2a, 0x2,
+                                                          0x37, 0x2, 0x57, 0x2, 0x63, 0x2, 0x6e, 0x2,
+                                                          0x85, 0x2, 0x99, 0x2, 0xae, 0x2, 0xbd, 0x2,
+                                                          0xe3, 0x2, 0xea, 0x2, 0xef, 0x2, 0xf7, 0x3,
+                                                          0x37, 0x3, 0x53, 0x3, 0x62, 0x3, 0x71, 0x3,
+                                                          0x7e, 0x3, 0x8f, 0x3, 0xa0, 0x3, 0xae, 0x3,
+                                                          0xe7, 0x4, 0x1f, 0x4, 0x2c, 0x4, 0x32, 0x4,
+                                                          0x3f, 0x4, 0x44, 0x4, 0x4c, 0x4, 0x51, 0x4,
+                                                          0x55, 0x4, 0x61, 0x4, 0x6a, 0x4, 0x71, 0x4,
+                                                          0x7f, 0x4, 0x8d, 0x4, 0x9d, 0x4, 0xa7, 0x4,
+                                                          0xb1, 0x4, 0xbb, 0x4, 0xc8, 0x4, 0xd4, 0x4,
+                                                          0xf9, 0x5, 0x3, 0x5, 0xa, 0x5, 0x2d, 0x5,
+                                                          0x40, 0x5, 0x53, 0x5, 0x5e, 0x5, 0x64, 0x5,
+                                                          0x6c, 0x5, 0x8c, 0x5, 0xac, 0x5, 0xcc, 0x5,
+                                                          0xdd, 0x5, 0xe2, 0x5, 0xec, 0x5, 0xf6, 0x6,
+                                                          0x2, 0x6, 0x1e, 0x6, 0x26, 0x6, 0x36, 0x6,
+                                                          0x46, 0x6, 0x55, 0x6, 0x64, 0x6, 0x6d, 0x6,
+                                                          0x76, 0x6, 0x7b, 0x6, 0x8b, 0x6, 0x9b, 0x6,
+                                                          0x9f, 0x6, 0xa7, 0x6, 0xaf, 0x6, 0xc3, 0x6,
+                                                          0xd6, 0x6, 0xe2, 0x6, 0xe8, 0x6, 0xec, 0x6,
+                                                          0xf7, 0x7, 0xa, 0x7, 0x1d, 0x7, 0x22, 0x7,
+                                                          0x2d, 0x7, 0x36, 0x7, 0x48, 0x7, 0x5a, 0x7,
+                                                          0x5f, 0x7, 0x67, 0x7, 0x6f, 0x7, 0x75, 0x7,
+                                                          0x86, 0x7, 0x97, 0x7, 0xa1, 0x7, 0xab, 0x7,
+                                                          0xb5, 0x7, 0xbc, 0x7, 0xc1, 0x7, 0xc6, 0x7,
+                                                          0xcb, 0x7, 0xcf, 0x7, 0xd3, 0x7, 0xd7, 0x7,
+                                                          0xe3, 0x7, 0xee, 0x7, 0xf3, 0x7, 0xfc, 0x8,
+                                                          0x7, 0x8, 0x16, 0x8, 0x19, 0x8, 0x22, 0x8,
+                                                          0x26, 0x8, 0x2d, 0x8, 0x33, 0x8, 0x3a, 0x8,
+                                                          0x41, 0x8, 0x46, 0x8, 0x4b, 0x8, 0x59, 0x8,
+                                                          0x67, 0x8, 0x75, 0x8, 0x83, 0x8, 0x91, 0x8,
+                                                          0x9f, 0x8, 0xab, 0x8, 0xaf, 0x8, 0xb3, 0x8,
+                                                          0xc0, 0x8, 0xcd, 0x8, 0xda, 0x8, 0xe7, 0x8,
+                                                          0xf4, 0x8, 0xfc, 0x9, 0x4, 0x9, 0xb, 0x9,
+                                                          0x10, 0x9, 0x1c, 0x9, 0x28, 0x9, 0x34, 0x9,
+                                                          0x3a, 0x9, 0x3e, 0x9, 0x42, 0x9, 0x4d, 0x9,
+                                                          0x55, 0x9, 0x60, 0x9, 0x6b, 0x9, 0x6f, 0x9,
+                                                          0x76, 0x9, 0x7d, 0x9, 0x84, 0x9, 0x8b, 0x9,
+                                                          0x90, 0x9, 0x95, 0x9, 0x9a, 0x9, 0xa4, 0x9,
+                                                          0xae, 0x9, 0xb8, 0x9, 0xbb, 0x9, 0xbf, 0x9,
+                                                          0xc8, 0x9, 0xd1, 0x9, 0xda, 0x9, 0xe3, 0x9,
+                                                          0xec, 0x9, 0xf5, 0x9, 0xfe, 0xa, 0x7, 0xa,
+                                                          0x10, 0xa, 0x19, 0xa, 0x1f, 0xa, 0x25, 0xa,
+                                                          0x2b, 0xa, 0x31, 0xa, 0x37, 0xa, 0x3b, 0xa,
+                                                          0x41, 0xa, 0x46, 0xa, 0x4a, 0xa, 0x4e, 0xa,
+                                                          0x52, 0x70, 0xa1, 0x75, 0xa6, 0xa6, 0xa1, 0xa1,
+                                                          0xa6, 0xa6, 0x75, 0xa1, 0x70, 0x70, 0x75, 0x75,
+                                                          0x70, 0x1e, 0xb, 0x20, 0xa, 0x25, 0xa, 0x61,
+                                                          0xa, 0x71, 0xb5, 0xb6, 0xad, 0xaf, 0xd5, 0xc7,
+                                                          0x1e, 0x38, 0xa, 0x47, 0x87, 0x7b, 0x52, 0x5,
+                                                          0x89, 0x6, 0xa4, 0x6a, 0xb2, 0x5f, 0xa, 0x1e,
+                                                          0xb, 0x15, 0x21, 0xa, 0x15, 0xfb, 0x52, 0xf7,
+                                                          0x1a, 0x54, 0xe0, 0xae, 0xa, 0xf7, 0x84, 0x4f,
+                                                          0xa, 0xfb, 0x6e, 0xfb, 0x71, 0x1e, 0xf4, 0x16,
+                                                          0xd8, 0xeb, 0xf7, 0xdd, 0xf7, 0x5e, 0xef, 0xaa,
+                                                          0x48, 0xfb, 0x17, 0x2e, 0x2b, 0xfb, 0xdb, 0xfb,
+                                                          0x5f, 0xfb, 0x16, 0x8b, 0xf7, 0x1a, 0xd9, 0x1e,
+                                                          0xb, 0xf7, 0x5c, 0x16, 0x20, 0xa, 0xe, 0x15,
+                                                          0x38, 0xb8, 0x4e, 0xf5, 0xf7, 0x2d, 0xf7, 0x1d,
+                                                          0xf7, 0x49, 0xf7, 0xf, 0xcd, 0x6c, 0xdd, 0xfb,
+                                                          0x8, 0xfb, 0x26, 0xfb, 0x28, 0xfb, 0x35, 0xfb,
+                                                          0x27, 0x1e, 0xdf, 0x8a, 0x15, 0xc9, 0xe6, 0xf7,
+                                                          0x76, 0xf7, 0x4, 0xb8, 0xa4, 0x7d, 0xfb, 0x5,
+                                                          0x5a, 0x3c, 0xfb, 0x7e, 0xfb, 0x6, 0x59, 0x6d,
+                                                          0xaa, 0xe6, 0x1e, 0xb, 0x35, 0xa, 0x83, 0x68,
+                                                          0x7c, 0x19, 0x45, 0xa, 0xb, 0x36, 0xa, 0xaa,
+                                                          0xa2, 0x7c, 0x4d, 0x2e, 0x2c, 0xfb, 0x67, 0x21,
+                                                          0x70, 0x6a, 0x9d, 0xc0, 0x1e, 0xb, 0x3a, 0xa,
+                                                          0xeb, 0xa, 0x37, 0xa, 0xd2, 0xa, 0xb, 0xf7,
+                                                          0x88, 0x9b, 0x6, 0x58, 0x8f, 0x7c, 0xa1, 0xa6,
+                                                          0x1a, 0x9e, 0x92, 0xa1, 0x90, 0x9f, 0x1e, 0xf5,
+                                                          0xf8, 0x1b, 0xa3, 0xe1, 0x90, 0xa0, 0xce, 0x94,
+                                                          0x19, 0x93, 0xa, 0xbc, 0x85, 0x9c, 0x76, 0x6f,
+                                                          0x1a, 0x79, 0x87, 0x76, 0x85, 0x76, 0x1e, 0xfb,
+                                                          0x0, 0xfc, 0x1b, 0x73, 0x36, 0x87, 0x77, 0x4a,
+                                                          0x81, 0x19, 0xb, 0x72, 0xa, 0x70, 0xa8, 0xd8,
+                                                          0x9d, 0x90, 0x42, 0xa, 0x79, 0x87, 0x9a, 0x97,
+                                                          0x8d, 0x8c, 0x94, 0xe6, 0xf7, 0xfb, 0x1f, 0x56,
+                                                          0x81, 0x59, 0x82, 0x59, 0x85, 0x8, 0xb, 0x3f,
+                                                          0xa, 0x5, 0x84, 0x64, 0x2c, 0x79, 0x71, 0x1b,
+                                                          0x3e, 0xa, 0xb, 0x3d, 0xa, 0xb7, 0x70, 0xad,
+                                                          0x58, 0x5b, 0xa, 0x1e, 0x54, 0xa, 0xb, 0x2b,
+                                                          0xa, 0x5d, 0xa, 0xb, 0xe5, 0x4d, 0xb9, 0x58,
+                                                          0xfb, 0x1, 0x3a, 0xfb, 0x11, 0x27, 0x1e, 0xc9,
+                                                          0x5a, 0x15, 0xd1, 0xc0, 0xf7, 0x4c, 0xd6, 0xb5,
+                                                          0x94, 0x65, 0x6f, 0x4e, 0x56, 0xfb, 0x4f, 0x3e,
+                                                          0x6a, 0x7b, 0xa9, 0xa9, 0x1e, 0xb, 0x6a, 0xa,
+                                                          0x2f, 0xa, 0xb, 0x15, 0xb2, 0x6, 0x39, 0xa,
+                                                          0xb, 0x4e, 0xa, 0x69, 0x6c, 0x97, 0xb0, 0x91,
+                                                          0x8b, 0x91, 0x8d, 0x92, 0x1f, 0x8e, 0x97, 0x98,
+                                                          0x3c, 0xa, 0xb, 0xf7, 0xd2, 0xf7, 0x1f, 0x22,
+                                                          0xa, 0xb, 0x15, 0x32, 0xa, 0x7e, 0x80, 0xfb,
+                                                          0x2e, 0x74, 0xa, 0xf7, 0x2f, 0xa9, 0x7d, 0x4f,
+                                                          0x7e, 0x8a, 0x7d, 0x8a, 0x7a, 0x41, 0xa, 0xe,
+                                                          0x1e, 0x7b, 0xf7, 0x8a, 0x9b, 0x7, 0x51, 0x90,
+                                                          0x86, 0xa0, 0x7f, 0xd1, 0x2c, 0xf8, 0xc0, 0x18,
+                                                          0x71, 0x6, 0xfb, 0xce, 0xfc, 0xb3, 0x5a, 0x35,
+                                                          0x76, 0xb, 0x6e, 0x8e, 0x32, 0xef, 0xc7, 0xc0,
+                                                          0xa9, 0xf7, 0xe, 0xde, 0x1e, 0xfb, 0x6b, 0x6b,
+                                                          0x15, 0xe5, 0xe5, 0xf7, 0x70, 0xf7, 0x9, 0xb,
+                                                          0x7b, 0x7, 0xb1, 0xa9, 0x7a, 0x5f, 0x79, 0x2f,
+                                                          0xfb, 0xd6, 0x82, 0x6c, 0x1f, 0x5f, 0x7e, 0x58,
+                                                          0xfb, 0x1e, 0xfb, 0x1e, 0x1b, 0x4b, 0x40, 0xab,
+                                                          0xe4, 0xc1, 0xf4, 0xf7, 0xe8, 0x97, 0xb9, 0x1f,
+                                                          0xa9, 0x93, 0xa4, 0xa2, 0xc5, 0x1b, 0xb, 0x7f,
+                                                          0x95, 0x5, 0x5f, 0x5e, 0x77, 0x72, 0x7c, 0xec,
+                                                          0xa, 0x91, 0x92, 0xaa, 0xe7, 0xf7, 0xe9, 0x8e,
+                                                          0x97, 0x1f, 0xb, 0xf7, 0x1d, 0xf3, 0xdd, 0x23,
+                                                          0x5, 0xaf, 0x6, 0x33, 0xf7, 0x3d, 0x5, 0x5a,
+                                                          0x6, 0xb, 0x15, 0xc5, 0x86, 0x9c, 0x7f, 0x67,
+                                                          0x59, 0x27, 0xfb, 0xae, 0x7c, 0xa, 0xf7, 0x2d,
+                                                          0xd2, 0xe3, 0xf7, 0x19, 0xb2, 0x1e, 0xf5, 0xf8,
+                                                          0x7, 0x95, 0xae, 0x97, 0x9c, 0xc6, 0x96, 0x19,
+                                                          0xb, 0x53, 0xa, 0x2e, 0xa, 0x13, 0x78, 0x62,
+                                                          0xa, 0xb, 0xb4, 0xb9, 0xf7, 0x42, 0x8, 0xf7,
+                                                          0x37, 0x8b, 0x86, 0x5a, 0x40, 0xa, 0xb, 0xe5,
+                                                          0xae, 0xd9, 0xe1, 0xc1, 0x1b, 0x9e, 0x98, 0x84,
+                                                          0x64, 0x83, 0x81, 0xfb, 0x10, 0xfb, 0x62, 0x61,
+                                                          0x1f, 0x84, 0x75, 0x15, 0xa7, 0x8f, 0x5, 0xf7,
+                                                          0x36, 0xa2, 0xed, 0xdc, 0xda, 0x1a, 0xb, 0x7b,
+                                                          0x7, 0xc2, 0x90, 0x7c, 0x76, 0x1f, 0x6f, 0x3f,
+                                                          0x4b, 0xa, 0xb, 0x4a, 0xa, 0x8f, 0x99, 0x1f,
+                                                          0xe3, 0xf7, 0xd6, 0x88, 0x8d, 0xb, 0x7b, 0x88,
+                                                          0x7b, 0x87, 0x7c, 0x1f, 0x9f, 0x86, 0xcf, 0xf7,
+                                                          0x7c, 0x79, 0x8f, 0x81, 0x75, 0x82, 0x78, 0x82,
+                                                          0x7d, 0x19, 0x6c, 0x75, 0xb, 0x63, 0xa, 0xdb,
+                                                          0x8f, 0x5d, 0x50, 0x79, 0x1f, 0xfb, 0x9, 0xfc,
+                                                          0x40, 0x7a, 0x4d, 0x76, 0x7a, 0x5a, 0x82, 0x19,
+                                                          0xb, 0x1f, 0xda, 0xf7, 0xbf, 0x5, 0x41, 0x6,
+                                                          0x64, 0x20, 0x75, 0x4c, 0x5a, 0x41, 0x8, 0x57,
+                                                          0x69, 0x4c, 0x2d, 0x60, 0x1b, 0xb, 0xb8, 0xb3,
+                                                          0xb0, 0xce, 0x96, 0x1f, 0x6f, 0x6, 0x76, 0x84,
+                                                          0x83, 0x74, 0x65, 0x1b, 0xb, 0x1a, 0x86, 0x8d,
+                                                          0x88, 0x91, 0x94, 0xd0, 0xc9, 0xa7, 0xab, 0x1e,
+                                                          0xaa, 0xa6, 0xbf, 0xb1, 0xa8, 0xa2, 0x8, 0x94,
+                                                          0x7, 0x84, 0x97, 0x5f, 0xc1, 0x7b, 0x9d, 0x8,
+                                                          0x9c, 0x7c, 0x56, 0xd9, 0x7e, 0x1b, 0x83, 0x8b,
+                                                          0x85, 0x89, 0xb, 0xf7, 0x76, 0xf7, 0x8a, 0x4c,
+                                                          0xa, 0xb, 0xf9, 0x54, 0x31, 0xa, 0xb, 0x9a,
+                                                          0x1a, 0x9d, 0x7c, 0x9c, 0x76, 0x80, 0xb, 0x12,
+                                                          0xf8, 0xf, 0xe5, 0x17, 0xf7, 0x9, 0xb8, 0x15,
+                                                          0xb2, 0xb3, 0xf7, 0x1c, 0xa4, 0xcb, 0x1e, 0xcf,
+                                                          0xa5, 0xc5, 0xb9, 0xba, 0x1b, 0xcc, 0x8c, 0x51,
+                                                          0x70, 0xfb, 0xb, 0x31, 0xfb, 0x4e, 0xfb, 0xe,
+                                                          0x72, 0x72, 0x96, 0xa5, 0x1f, 0x7d, 0x64, 0x15,
+                                                          0x7f, 0xa2, 0x9f, 0x86, 0xa4, 0x1b, 0xf7, 0x1e,
+                                                          0xf7, 0x34, 0xf7, 0x3a, 0xf7, 0x2f, 0xd3, 0x6d,
+                                                          0xc6, 0x32, 0x39, 0x52, 0x42, 0x68, 0xb, 0x75,
+                                                          0x74, 0x78, 0x77, 0x7b, 0x7a, 0x8, 0x40, 0x3a,
+                                                          0x7d, 0x74, 0x7d, 0x44, 0xa, 0x84, 0x9d, 0x5a,
+                                                          0xa1, 0x5a, 0x1f, 0x95, 0x73, 0x97, 0x74, 0x95,
+                                                          0x77, 0x8, 0xb, 0x15, 0x51, 0x62, 0x6e, 0x77,
+                                                          0x7f, 0x1b, 0x82, 0x84, 0x93, 0x92, 0x97, 0x97,
+                                                          0xb3, 0xb, 0xfb, 0x82, 0x5c, 0x1a, 0x79, 0x8b,
+                                                          0x5f, 0xba, 0xc3, 0xb7, 0xc2, 0xc6, 0xb2, 0x1e,
+                                                          0xb, 0x15, 0xf7, 0x29, 0xf7, 0x97, 0x5, 0x8c,
+                                                          0x6, 0xb7, 0xfb, 0x97, 0x5, 0xb, 0x74, 0x39,
+                                                          0x77, 0x37, 0x79, 0x1a, 0x7c, 0x8d, 0x66, 0xb8,
+                                                          0xbd, 0xa5, 0xa5, 0xe6, 0xca, 0x1e, 0xb, 0xf8,
+                                                          0x8f, 0x6, 0xc9, 0xf7, 0x36, 0x7b, 0x93, 0x5,
+                                                          0x28, 0x44, 0x60, 0x65, 0xfb, 0x55, 0x1b, 0xb,
+                                                          0xf7, 0x5d, 0xf7, 0x3c, 0xfb, 0x4, 0xd6, 0xfb,
+                                                          0xc, 0xfb, 0x47, 0xfb, 0x78, 0xb, 0x1, 0x85,
+                                                          0xf8, 0xf8, 0x3, 0x85, 0x16, 0xf8, 0x8d, 0x6,
+                                                          0xc1, 0xf7, 0x3c, 0x78, 0x8e, 0x5, 0x24, 0x5a,
+                                                          0x5c, 0x6b, 0xfb, 0x38, 0x1b, 0xfb, 0x2b, 0x6,
+                                                          0xf8, 0x77, 0xf8, 0xef, 0x5, 0x99, 0xfc, 0x7a,
+                                                          0x7, 0x5d, 0xfb, 0x26, 0x9e, 0x86, 0x5, 0xd0,
+                                                          0xad, 0xab, 0xb9, 0xf7, 0x2d, 0x1b, 0xf7, 0x35,
+                                                          0x6, 0xfc, 0x73, 0xfc, 0xef, 0x5, 0xb, 0x6e,
+                                                          0x8d, 0x6d, 0xb9, 0xc1, 0xae, 0xb9, 0xce, 0xbd,
+                                                          0x1e, 0x7d, 0x98, 0x5, 0x5c, 0x66, 0x72, 0x6b,
+                                                          0x77, 0x1b, 0x89, 0x7d, 0x8d, 0x9a, 0x1f, 0xa9,
+                                                          0xdb, 0xf7, 0x8b, 0xb6, 0x1a, 0xb5, 0x74, 0xa3,
+                                                          0x5d, 0x38, 0x2f, 0xfb, 0x1f, 0x41, 0x5c, 0x1e,
+                                                          0x89, 0x8d, 0xcb, 0xf7, 0x65, 0x88, 0x8d, 0x55,
+                                                          0x80, 0x55, 0x81, 0x55, 0x81, 0x19, 0xb, 0x7b,
+                                                          0xa, 0x67, 0x6, 0xfb, 0x22, 0x22, 0x31, 0xf4,
+                                                          0x5, 0x66, 0x6, 0xe, 0x15, 0x8e, 0x6, 0x4d,
+                                                          0xa, 0xb, 0x73, 0xa, 0x57, 0x5f, 0xb4, 0xc8,
+                                                          0x98, 0x8e, 0x98, 0x90, 0x99, 0x1f, 0xb, 0xf8,
+                                                          0x80, 0x31, 0xa, 0xb, 0x84, 0x1b, 0x75, 0x7d,
+                                                          0x7c, 0x77, 0x7a, 0xb, 0xa7, 0x80, 0x71, 0xa,
+                                                          0xb, 0x15, 0x20, 0xa, 0xb, 0xea, 0xa, 0xc7,
+                                                          0x9c, 0xa, 0xab, 0x69, 0x83, 0x5e, 0x83, 0x61,
+                                                          0xb, 0x7d, 0xa, 0xf7, 0x76, 0xaf, 0xf8, 0x2a,
+                                                          0x77, 0xb, 0xfb, 0x21, 0xfb, 0x36, 0x5c, 0xa,
+                                                          0xb, 0xfb, 0x3c, 0xfb, 0x23, 0x4c, 0xab, 0x3d,
+                                                          0xf4, 0xef, 0xe6, 0xe7, 0x9b, 0x96, 0xb, 0x7d,
+                                                          0x7, 0xb4, 0x9b, 0x81, 0x6e, 0x1f, 0x70, 0x42,
+                                                          0xfb, 0x86, 0x5f, 0x1a, 0xb, 0x9e, 0xa, 0xf7,
+                                                          0x3b, 0xf0, 0x9f, 0xa, 0x95, 0x97, 0x47, 0xa,
+                                                          0x7f, 0x82, 0x9d, 0xa, 0xb, 0x60, 0xfb, 0x19,
+                                                          0xfb, 0x2d, 0xfb, 0x4f, 0xfb, 0x27, 0xb, 0x15,
+                                                          0xa8, 0x6, 0xa7, 0x92, 0x9c, 0x9e, 0xa7, 0x1b,
+                                                          0xb, 0x15, 0x7b, 0x4e, 0x86, 0x75, 0x74, 0x1a,
+                                                          0x7a, 0x8b, 0xb, 0x5f, 0x9e, 0x7c, 0xaf, 0xe5,
+                                                          0xd5, 0xf7, 0x11, 0xf7, 0x5, 0xcf, 0x1e, 0xb,
+                                                          0x1f, 0xa0, 0x89, 0xaa, 0xf7, 0x2d, 0x5, 0xfc,
+                                                          0x85, 0x7b, 0x6, 0xb, 0x1b, 0x2e, 0x3c, 0x48,
+                                                          0x2a, 0x4a, 0x90, 0x80, 0xf7, 0x1e, 0xfb, 0x27,
+                                                          0x1f, 0xac, 0x68, 0xb0, 0x6c, 0x4b, 0x1a, 0x59,
+                                                          0x68, 0x39, 0x2d, 0x31, 0x53, 0xda, 0xe4, 0x93,
+                                                          0x8c, 0x90, 0x8c, 0x93, 0x1e, 0x77, 0x8d, 0x5,
+                                                          0xb, 0x66, 0xa, 0xa8, 0x1f, 0x80, 0xa7, 0x57,
+                                                          0xa, 0x77, 0xb, 0x60, 0xa, 0x9d, 0xa8, 0x80,
+                                                          0x80, 0xb, 0xf8, 0x64, 0xf7, 0x27, 0x15, 0xf7,
+                                                          0x4c, 0xf7, 0x49, 0x8d, 0x89, 0x8c, 0x8c, 0x51,
+                                                          0xfb, 0x48, 0x5, 0xfb, 0x45, 0x61, 0x15, 0xf7,
+                                                          0x3c, 0x6, 0x6b, 0x22, 0x5, 0xca, 0x6, 0xa9,
+                                                          0xf3, 0x5, 0xc5, 0x6, 0xb, 0x15, 0x92, 0x7f,
+                                                          0xb7, 0x55, 0x9b, 0x79, 0x8, 0x7a, 0x9a, 0xc0,
+                                                          0x3d, 0x98, 0x1b, 0x93, 0x8b, 0x91, 0x8d, 0xb,
+                                                          0x1a, 0x90, 0x89, 0x8e, 0x85, 0x82, 0x46, 0x4d,
+                                                          0x6f, 0x6b, 0x1e, 0x6c, 0x70, 0x57, 0x65, 0x6e,
+                                                          0x74, 0x8, 0xb, 0x15, 0x45, 0xb9, 0x50, 0xd4,
+                                                          0xde, 0xf0, 0xed, 0xf7, 0xc, 0xb, 0x94, 0x7a,
+                                                          0x5, 0x59, 0xa, 0xb, 0x1b, 0x41, 0x7a, 0x47,
+                                                          0x65, 0x81, 0x1f, 0xb, 0x1b, 0xf7, 0x19, 0xd1,
+                                                          0xf3, 0xe9, 0xcd, 0x77, 0xb3, 0x2e, 0xe6, 0x1f,
+                                                          0x35, 0xe1, 0x7e, 0xa2, 0xba, 0x1a, 0xce, 0xbe,
+                                                          0xac, 0xc2, 0xf7, 0xd, 0x8f, 0x22, 0x52, 0x1e,
+                                                          0x9d, 0x88, 0x5, 0xb, 0xf7, 0x5b, 0x8b, 0xaf,
+                                                          0xf8, 0xfd, 0x77, 0x1, 0x83, 0xf8, 0xcb, 0x3,
+                                                          0x83, 0x16, 0xf8, 0x91, 0x6, 0xc5, 0xf7, 0x47,
+                                                          0x77, 0x91, 0x5, 0xfb, 0x26, 0x49, 0x3a, 0x88,
+                                                          0xfb, 0xd, 0x1b, 0xb, 0x1f, 0x7a, 0x99, 0x5,
+                                                          0x5c, 0x5b, 0x45, 0x44, 0xfb, 0x5, 0x1b, 0xfb,
+                                                          0xb, 0x54, 0xde, 0xf7, 0x17, 0xf7, 0x27, 0xf1,
+                                                          0xf7, 0x86, 0xf7, 0x5c, 0xf7, 0x23, 0x96, 0xfb,
+                                                          0x1a, 0x6f, 0x1f, 0xb, 0xf7, 0xb, 0xf7, 0xac,
+                                                          0xf8, 0x66, 0xf7, 0xb, 0xaf, 0x77, 0xa5, 0x66,
+                                                          0x71, 0x80, 0x76, 0x7d, 0xb, 0x9d, 0x1b, 0x43,
+                                                          0xa, 0xb, 0x7d, 0x94, 0x5, 0x5f, 0x68, 0x6f,
+                                                          0x68, 0x78, 0x1b, 0xb, 0x7f, 0x97, 0x5, 0x62,
+                                                          0x59, 0x61, 0x69, 0x55, 0x1b, 0xb, 0x1b, 0xbc,
+                                                          0xf7, 0x40, 0x5, 0xd5, 0xa0, 0x82, 0x98, 0xe0,
+                                                          0x1b, 0xb, 0x2d, 0x68, 0x1e, 0x98, 0x83, 0x5,
+                                                          0x96, 0x94, 0xa4, 0xb5, 0xc5, 0x1b, 0xba, 0xa8,
+                                                          0x67, 0x6d, 0x7c, 0x8a, 0x67, 0x2f, 0x32, 0x1f,
+                                                          0xfb, 0x19, 0xfb, 0x16, 0x5, 0xb, 0x80, 0xbc,
+                                                          0x70, 0x76, 0xf8, 0x41, 0xa1, 0xb, 0xb7, 0xa,
+                                                          0xfb, 0x2, 0xf7, 0x22, 0xc5, 0xa, 0x78, 0x92,
+                                                          0x56, 0xa, 0x9f, 0x7a, 0x80, 0xa, 0xb7, 0xa,
+                                                          0xfb, 0x2, 0xf7, 0x23, 0xc5, 0xa, 0x78, 0x91,
+                                                          0x56, 0xa, 0x9f, 0x7b, 0x80, 0xa, 0x82, 0x9c,
+                                                          0x5, 0x52, 0x6f, 0x42, 0x4f, 0x48, 0x1a, 0x60,
+                                                          0xa4, 0x6b, 0xad, 0x93, 0xb, 0x65, 0x1a, 0x70,
+                                                          0x61, 0x5a, 0x72, 0x6e, 0x1e, 0x63, 0x69, 0x7e,
+                                                          0x82, 0x7b, 0x1b, 0xb, 0x15, 0xb9, 0x6, 0xf7,
+                                                          0x37, 0xf7, 0x3d, 0x5, 0xb, 0x26, 0x1a, 0xfb,
+                                                          0x6, 0xf7, 0x3, 0x54, 0xf1, 0xb, 0xf7, 0x92,
+                                                          0xa0, 0x76, 0xb, 0x9e, 0xa, 0xf7, 0x38, 0xee,
+                                                          0x9f, 0xa, 0x98, 0x99, 0x47, 0xa, 0x7c, 0x80,
+                                                          0x9d, 0xa, 0xb, 0x9e, 0xa, 0xf7, 0x3a, 0xf0,
+                                                          0x9f, 0xa, 0x96, 0x97, 0x47, 0xa, 0x7e, 0x82,
+                                                          0x9d, 0xa, 0xb, 0x90, 0x87, 0x1f, 0xe, 0x1f,
+                                                          0xc3, 0xf2, 0x5, 0xf7, 0x70, 0x6, 0xb, 0x1a,
+                                                          0x66, 0x54, 0x69, 0x77, 0x7e, 0x1e, 0xb, 0x95,
+                                                          0x84, 0x5, 0x94, 0x95, 0xa2, 0xa6, 0xb4, 0x1b,
+                                                          0x9d, 0xaa, 0x7e, 0x63, 0x51, 0x31, 0x71, 0x52,
+                                                          0x82, 0x1f, 0xe, 0x15, 0x6c, 0xa3, 0x73, 0xaa,
+                                                          0xaa, 0xa4, 0xa3, 0xaa, 0xaa, 0x72, 0xa4, 0x6c,
+                                                          0x6c, 0x73, 0x72, 0x6c, 0x1e, 0xe, 0x74, 0xa8,
+                                                          0xa8, 0xa3, 0xa2, 0xa8, 0xa8, 0x73, 0xa3, 0x6e,
+                                                          0x6e, 0xb, 0xc7, 0xf4, 0xf8, 0x41, 0xf4, 0xb,
+                                                          0x9a, 0xa, 0x77, 0xb, 0x5a, 0xa, 0xf7, 0x78,
+                                                          0x77, 0x1, 0x58, 0xf8, 0xfb, 0x3, 0xb, 0x99,
+                                                          0x16, 0xd6, 0x6, 0xb4, 0xf7, 0x1c, 0x99, 0xb6,
+                                                          0xb8, 0xd0, 0x8, 0xc3, 0xb0, 0xc9, 0xe1, 0xbb,
+                                                          0x1b, 0xb, 0x15, 0x6d, 0xa4, 0x72, 0xa9, 0xa9,
+                                                          0xa4, 0xa4, 0xa9, 0xa9, 0x72, 0xa4, 0x6d, 0x6d,
+                                                          0x72, 0x72, 0x6d, 0x1e, 0xb, 0x8a, 0x16, 0x4e,
+                                                          0xa, 0xb, 0x15, 0xbe, 0x6, 0xf8, 0x5b, 0xf9,
+                                                          0x42, 0x5, 0x58, 0x6, 0xb, 0xf7, 0x92, 0x8b,
+                                                          0xac, 0xf7, 0xbb, 0xe9, 0xa, 0xb, 0xa3, 0x9e,
+                                                          0x9e, 0xa3, 0xa3, 0x78, 0x9e, 0x73, 0x73, 0x78,
+                                                          0x78, 0x73, 0x73, 0x9e, 0x78, 0xa3, 0x1f, 0xb,
+                                                          0x6f, 0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7,
+                                                          0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f,
+                                                          0x1e, 0xb, 0x1, 0x86, 0xa, 0x3, 0xb, 0xf8,
+                                                          0x5d, 0x76, 0xf7, 0x7a, 0x77, 0x12, 0xb, 0x1,
+                                                          0xa6, 0xdf, 0xf7, 0xa5, 0xdf, 0x3, 0xb, 0x9b,
+                                                          0xfb, 0x8b, 0x7b, 0x7, 0xb, 0x94, 0xb6, 0x5,
+                                                          0x54, 0x6, 0xda, 0xf7, 0x97, 0x5, 0x67, 0x6,
+                                                          0xfb, 0xa3, 0xfb, 0x97, 0x5, 0xb, 0x6, 0x89,
+                                                          0x90, 0xf7, 0x6, 0xf7, 0x2, 0x5, 0xdb, 0xd8,
+                                                          0x9e, 0xa3, 0xb3, 0x1a, 0xb4, 0x64, 0xb, 0x1b,
+                                                          0x76, 0x7a, 0x7a, 0x76, 0x61, 0xb6, 0x88, 0x93,
+                                                          0xb, 0x1a, 0x74, 0x9a, 0x7d, 0xa4, 0xa4, 0xa1,
+                                                          0xa7, 0xa7, 0xb, 0x7a, 0x7, 0x8e, 0x97, 0x92,
+                                                          0x8c, 0x9a, 0x1b, 0xc4, 0xb, 0x87, 0xa, 0xf7,
+                                                          0x87, 0x77, 0x1, 0xb, 0xa0, 0x76, 0xf9, 0x21,
+                                                          0xb, 0xf7, 0x4f, 0x9b, 0x6, 0xb, 0xce, 0x1a,
+                                                          0xb6, 0x72, 0xb, 0x85, 0x85, 0x1e, 0xb, 0x15,
+                                                          0xae, 0x6, 0xb, 0x5, 0x96, 0x92, 0xb, 0x82,
+                                                          0xba, 0x6f, 0x76, 0xf9, 0x37, 0xa9, 0xa, 0xe5,
+                                                          0x13, 0xb8, 0xb, 0x76, 0xa, 0xf7, 0x73, 0x77,
+                                                          0x12, 0x9c, 0xdf, 0x13, 0x78, 0xb, 0xf8, 0x99,
+                                                          0x66, 0xa, 0xb, 0x97, 0xa, 0xaa, 0x72, 0xbd,
+                                                          0x37, 0xfb, 0x28, 0xb, 0x80, 0xa0, 0xf8, 0x2e,
+                                                          0xa0, 0xf7, 0x73, 0x77, 0x92, 0xa, 0xb, 0x72,
+                                                          0x7e, 0x6c, 0xaf, 0x83, 0xb2, 0xf7, 0x10, 0xc6,
+                                                          0xe0, 0xce, 0xcd, 0x60, 0x9c, 0xb, 0x62, 0xa,
+                                                          0xe, 0x1a, 0x56, 0x3c, 0xfb, 0x1b, 0x60, 0x45,
+                                                          0x1e, 0xb, 0x77, 0x90, 0xa, 0xb, 0x77, 0x12,
+                                                          0xb5, 0xd8, 0xf7, 0x3e, 0xb, 0xb6, 0xa, 0xb4,
+                                                          0xf9, 0xa, 0xb, 0xfb, 0x17, 0xf7, 0x17, 0xfb,
+                                                          0x17, 0xb, 0xc7, 0x4f, 0xf2, 0x8c, 0x77, 0x12,
+                                                          0xb, 0xf8, 0x82, 0x9e, 0xa, 0xb, 0xf7, 0x74,
+                                                          0xf7, 0x58, 0xb, 0x1b, 0xbe, 0xb6, 0xb0, 0xb1,
+                                                          0xab, 0x72, 0x90, 0x82, 0x74, 0x7f, 0x7d, 0x7a,
+                                                          0xb, 0x7f, 0x9f, 0x89, 0x76, 0xf7, 0xe5, 0x9f,
+                                                          0xf7, 0xcc, 0x9f, 0x8e, 0x77, 0x12, 0xb, 0x83,
+                                                          0x16, 0xf7, 0x91, 0x6, 0xf7, 0xba, 0xf7, 0x35,
+                                                          0xf7, 0x4d, 0xf7, 0x5e, 0xb, 0x1b, 0xf7, 0x45,
+                                                          0xad, 0xfb, 0xf, 0x26, 0x4e, 0x6a, 0xfb, 0xc8,
+                                                          0xfb, 0xcf, 0xb, 0xaf, 0xa8, 0xa9, 0xaf, 0xaf,
+                                                          0xa9, 0x6d, 0x67, 0x67, 0x6d, 0x6e, 0x67, 0x1e,
+                                                          0xb, 0x1a, 0x6a, 0x7b, 0x5b, 0x53, 0x3a, 0x7b,
+                                                          0xe7, 0xb7, 0x84, 0x1e, 0x7b, 0x6, 0xb, 0x1a,
+                                                          0x6f, 0x8f, 0x69, 0xb7, 0xc9, 0xb2, 0xbb, 0xd8,
+                                                          0xbe, 0x1e, 0xe, 0xf8, 0x1, 0x79, 0xb, 0x15,
+                                                          0xaa, 0x6, 0xb, 0xb0, 0xf7, 0x5b, 0x5, 0x76,
+                                                          0x6, 0x81, 0x86, 0x7b, 0x7f, 0x6e, 0x1b, 0xb,
+                                                          0x9c, 0x7c, 0x15, 0x9d, 0x6, 0x98, 0x8f, 0x9c,
+                                                          0x9f, 0xa7, 0x1b, 0x9a, 0xb, 0x89, 0x87, 0x15,
+                                                          0x94, 0x82, 0x5, 0x96, 0x98, 0x9a, 0x92, 0x9c,
+                                                          0x1b, 0xb, 0x9f, 0xf7, 0x1f, 0x5, 0x7d, 0x6,
+                                                          0x83, 0x86, 0x7b, 0x81, 0x7a, 0x1b, 0xb, 0x7d,
+                                                          0x72, 0x84, 0x1e, 0x82, 0x6b, 0x82, 0xfb, 0xb,
+                                                          0x86, 0x54, 0x8, 0xb, 0x1a, 0xb0, 0xc2, 0xad,
+                                                          0x9f, 0x98, 0x1e, 0xb, 0x97, 0x76, 0xa9, 0x76,
+                                                          0xf8, 0x1a, 0xbe, 0xb, 0xb6, 0xa, 0xac, 0xf8,
+                                                          0xfe, 0xac, 0xb, 0xf7, 0x4, 0x4b, 0xcb, 0xb,
+                                                          0x15, 0xf7, 0x7b, 0x6, 0xac, 0xda, 0x80, 0x93,
+                                                          0x5, 0x76, 0x7f, 0xb, 0x9b, 0x7e, 0x15, 0x9b,
+                                                          0x6, 0x96, 0x91, 0x99, 0x95, 0x99, 0x1b, 0xb,
+                                                          0x9e, 0x91, 0x7d, 0x79, 0x1f, 0x63, 0x41, 0xfb,
+                                                          0x88, 0x73, 0x1a, 0xb, 0x9b, 0xfb, 0xa5, 0x7b,
+                                                          0x7, 0xb, 0x5, 0xa2, 0x79, 0xb, 0xed, 0xf1,
+                                                          0xed, 0xb, 0xb3, 0x17, 0xf7, 0x9c, 0xd3, 0x15,
+                                                          0x6a, 0xf7, 0x44, 0x5, 0xb, 0xea, 0xa, 0xca,
+                                                          0x9c, 0xa, 0xa8, 0x69, 0xb, 0xcf, 0xa2, 0xac,
+                                                          0xa0, 0xb9, 0x1a, 0xbc, 0x59, 0xa3, 0x5b, 0xb,
+                                                          0x96, 0xfb, 0xb0, 0x7, 0x6c, 0xfb, 0x7, 0x9b,
+                                                          0x87, 0x5, 0xb, 0x87, 0xa, 0x1, 0xb, 0xf1,
+                                                          0xe5, 0xf8, 0x4e, 0xf7, 0x17, 0xb, 0x1e, 0x9b,
+                                                          0xfb, 0x83, 0x7b, 0x7, 0xb, 0xc5, 0x76, 0xf8,
+                                                          0x2, 0x77, 0x1, 0xb, 0xd9, 0x16, 0xf7, 0xb5,
+                                                          0x9b, 0x6, 0xb, 0xc9, 0xf7, 0x47, 0xc9, 0xb,
+                                                          0xf7, 0x3d, 0x77, 0x1, 0xb, 0x9b, 0xfb, 0xa5,
+                                                          0x7, 0xb, 0xf7, 0xf, 0x15, 0x4c, 0x5a, 0x76,
+                                                          0x6f, 0x72, 0x1b, 0xb, 0xf8, 0xef, 0xaf, 0x89,
+                                                          0x77, 0x12, 0xcd, 0xf7, 0x4, 0xb, 0x1b, 0xfb,
+                                                          0x79, 0xfb, 0x45, 0xfb, 0x71, 0xfb, 0x55, 0xb,
+                                                          0x6c, 0xa, 0xe, 0x3c, 0x95, 0x76, 0xb, 0x15,
+                                                          0xd2, 0xf7, 0x8c, 0x5, 0x97, 0x8e, 0x92, 0xb,
+                                                          0xf8, 0x1d, 0x96, 0x76, 0xaa, 0x76, 0xf4, 0xb5,
+                                                          0xb, 0x66, 0x56, 0x1b, 0x7b, 0xf7, 0x61, 0x9a,
+                                                          0x7, 0xb, 0xf7, 0x45, 0xf7, 0x16, 0x9d, 0x9f,
+                                                          0x86, 0x7c, 0xb, 0x82, 0x30, 0x79, 0x87, 0x6d,
+                                                          0x1e, 0x78, 0x7, 0xb, 0xb6, 0xfb, 0x30, 0x76,
+                                                          0xf9, 0xf4, 0x77, 0x12, 0xb, 0x90, 0x94, 0x7d,
+                                                          0x1f, 0x7a, 0x6e, 0x5, 0x7e, 0xb, 0xf7, 0x49,
+                                                          0xfb, 0x39, 0x77, 0xe2, 0xed, 0x12, 0xb, 0x76,
+                                                          0xf9, 0x40, 0x77, 0x1, 0xf4, 0xcd, 0x3, 0xb,
+                                                          0xab, 0xfb, 0x2d, 0xa6, 0xf9, 0x8e, 0xa6, 0x1,
+                                                          0xb, 0x30, 0xa7, 0x1f, 0x9b, 0x55, 0xb, 0x77,
+                                                          0x1, 0xbc, 0xd6, 0x3, 0xb, 0x16, 0xf7, 0x5a,
+                                                          0x9b, 0x6, 0xb, 0x67, 0x6e, 0xa8, 0xaf, 0x1f,
+                                                          0xb, 0x7b, 0xf7, 0xa5, 0x9b, 0x7, 0xb, 0x15,
+                                                          0x9b, 0xa, 0xb, 0x9b, 0xfb, 0x51, 0x7b, 0x7,
+                                                          0xb, 0xac, 0xf7, 0x97, 0xac, 0xb, 0xc4, 0xa7,
+                                                          0xd4, 0xb, 0x9b, 0xfb, 0x5b, 0xb, 0x1b, 0x83,
+                                                          0x85, 0xb
+                                                         };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c
new file mode 100644
index 0000000..44062cd
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c
@@ -0,0 +1,7097 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifMMFontData [113417] = {
+    0x80, 0x01, 0xD6, 0x29, 0x00, 0x00, 0x25, 0x21, 0x50, 0x53, 0x2D, 0x41, 0x64, 0x6F, 0x62, 0x65,
+    0x46, 0x6F, 0x6E, 0x74, 0x2D, 0x31, 0x2E, 0x30, 0x3A, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53,
+    0x65, 0x72, 0x69, 0x66, 0x4D, 0x4D, 0x20, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x0D, 0x25,
+    0x25, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x54,
+    0x75, 0x65, 0x20, 0x4F, 0x63, 0x74, 0x20, 0x33, 0x31, 0x20, 0x30, 0x31, 0x3A, 0x33, 0x34, 0x3A,
+    0x32, 0x32, 0x20, 0x32, 0x30, 0x30, 0x36, 0x0D, 0x25, 0x25, 0x56, 0x4D, 0x75, 0x73, 0x61, 0x67,
+    0x65, 0x3A, 0x20, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30,
+    0x0D, 0x31, 0x37, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F,
+    0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74,
+    0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x76, 0x65, 0x72, 0x73,
+    0x69, 0x6F, 0x6E, 0x20, 0x28, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x29, 0x20, 0x72, 0x65,
+    0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x4E, 0x6F, 0x74, 0x69,
+    0x63, 0x65, 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+    0x20, 0x20, 0x20, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65,
+    0x66, 0x0D, 0x2F, 0x46, 0x75, 0x6C, 0x6C, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72,
+    0x6f, 0x6d, 0x65, 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61,
+    0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x61, 0x6D, 0x69, 0x6C,
+    0x79, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x65, 0x72,
+    0x69, 0x66, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20,
+    0x64, 0x65, 0x66, 0x0D, 0x2F, 0x49, 0x74, 0x61, 0x6C, 0x69, 0x63, 0x41, 0x6E, 0x67, 0x6C, 0x65,
+    0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x69, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50,
+    0x69, 0x74, 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,
+    0x55, 0x6E, 0x64, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F,
+    0x6E, 0x20, 0x2D, 0x31, 0x30, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E, 0x64, 0x65,
+    0x72, 0x6C, 0x69, 0x6E, 0x65, 0x54, 0x68, 0x69, 0x63, 0x6B, 0x6E, 0x65, 0x73, 0x73, 0x20, 0x35,
+    0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x41,
+    0x6C, 0x6C, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66,
+    0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x50, 0x6F, 0x73,
+    0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x5B, 0x5B, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31,
+    0x20, 0x30, 0x20, 0x5D, 0x5B, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x31, 0x20, 0x5D,
+    0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69,
+    0x67, 0x6E, 0x4D, 0x61, 0x70, 0x20, 0x5B, 0x5B, 0x5B, 0x31, 0x31, 0x30, 0x20, 0x30, 0x20, 0x5D,
+    0x5B, 0x37, 0x39, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5B, 0x5B, 0x31, 0x30, 0x30, 0x20, 0x30,
+    0x20, 0x5D, 0x5B, 0x39, 0x30, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5D, 0x20, 0x64, 0x65, 0x66,
+    0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65, 0x73,
+    0x20, 0x5B, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2F, 0x57, 0x69, 0x64, 0x74, 0x68,
+    0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F,
+    0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56,
+    0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x5B, 0x30, 0x2E, 0x32, 0x37, 0x30, 0x32, 0x20, 0x30, 0x2E,
+    0x31, 0x30, 0x34, 0x38, 0x20, 0x30, 0x2E, 0x34, 0x35, 0x30, 0x34, 0x20, 0x30, 0x2E, 0x31, 0x37,
+    0x34, 0x36, 0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61,
+    0x6D, 0x65, 0x20, 0x2F, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x66, 0x4D, 0x4D,
+    0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x32,
+    0x35, 0x36, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x0D, 0x30, 0x20, 0x31, 0x20, 0x32, 0x35, 0x35,
+    0x20, 0x7B, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F,
+    0x2E, 0x6E, 0x6F, 0x74, 0x64, 0x65, 0x66, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x66, 0x6F,
+    0x72, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x32, 0x20, 0x2F, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C,
+    0x61, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x34, 0x20, 0x2F, 0x71,
+    0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x33, 0x35, 0x20, 0x2F, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6E, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x36, 0x20, 0x2F, 0x64, 0x6F, 0x6C, 0x6C, 0x61,
+    0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65,
+    0x72, 0x63, 0x65, 0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x38,
+    0x20, 0x2F, 0x61, 0x6D, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x33, 0x39, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69, 0x6E,
+    0x67, 0x6C, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x30, 0x20, 0x2F,
+    0x70, 0x61, 0x72, 0x65, 0x6E, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x34, 0x31, 0x20, 0x2F, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x72, 0x69, 0x67, 0x68, 0x74,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x32, 0x20, 0x2F, 0x61, 0x73, 0x74,
+    0x65, 0x72, 0x69, 0x73, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x33,
+    0x20, 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34,
+    0x34, 0x20, 0x2F, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x34, 0x35, 0x20, 0x2F, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x34, 0x36, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x37, 0x20, 0x2F, 0x73, 0x6C, 0x61, 0x73, 0x68,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x38, 0x20, 0x2F, 0x7A, 0x65, 0x72,
+    0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x39, 0x20, 0x2F, 0x6F, 0x6E,
+    0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x30, 0x20, 0x2F, 0x74, 0x77,
+    0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x31, 0x20, 0x2F, 0x74, 0x68,
+    0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x32, 0x20, 0x2F,
+    0x66, 0x6F, 0x75, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x33, 0x20,
+    0x2F, 0x66, 0x69, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x34,
+    0x20, 0x2F, 0x73, 0x69, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x35,
+    0x20, 0x2F, 0x73, 0x65, 0x76, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x35, 0x36, 0x20, 0x2F, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x35, 0x37, 0x20, 0x2F, 0x6E, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x35, 0x38, 0x20, 0x2F, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x39, 0x20, 0x2F, 0x73, 0x65, 0x6D, 0x69, 0x63, 0x6F, 0x6C,
+    0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x30, 0x20, 0x2F, 0x6C,
+    0x65, 0x73, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x31, 0x20, 0x2F,
+    0x65, 0x71, 0x75, 0x61, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x32,
+    0x20, 0x2F, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x36, 0x33, 0x20, 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x34, 0x20, 0x2F, 0x61, 0x74, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x35, 0x20, 0x2F, 0x41, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x36, 0x36, 0x20, 0x2F, 0x42, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x36, 0x37, 0x20, 0x2F, 0x43, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x36, 0x38, 0x20, 0x2F, 0x44, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x39,
+    0x20, 0x2F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x30, 0x20, 0x2F,
+    0x46, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x31, 0x20, 0x2F, 0x47, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x32, 0x20, 0x2F, 0x48, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x33, 0x20, 0x2F, 0x49, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x37, 0x34, 0x20, 0x2F, 0x4A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x37, 0x35, 0x20, 0x2F, 0x4B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x37, 0x36, 0x20, 0x2F, 0x4C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x37,
+    0x20, 0x2F, 0x4D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x38, 0x20, 0x2F,
+    0x4E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x39, 0x20, 0x2F, 0x4F, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x30, 0x20, 0x2F, 0x50, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x31, 0x20, 0x2F, 0x51, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x38, 0x32, 0x20, 0x2F, 0x52, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x38, 0x33, 0x20, 0x2F, 0x53, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x38, 0x34, 0x20, 0x2F, 0x54, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x35,
+    0x20, 0x2F, 0x55, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x36, 0x20, 0x2F,
+    0x56, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x37, 0x20, 0x2F, 0x57, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x38, 0x20, 0x2F, 0x58, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x39, 0x20, 0x2F, 0x59, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x39, 0x30, 0x20, 0x2F, 0x5A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x39, 0x31, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x6C, 0x65, 0x66,
+    0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x32, 0x20, 0x2F, 0x62, 0x61,
+    0x63, 0x6B, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x39, 0x33, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x34, 0x20, 0x2F, 0x61, 0x73, 0x63,
+    0x69, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x39, 0x35, 0x20, 0x2F, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6F, 0x72, 0x65, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x36, 0x20, 0x2F, 0x67, 0x72, 0x61, 0x76,
+    0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x37, 0x20, 0x2F, 0x61, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x38, 0x20, 0x2F, 0x62, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x39, 0x20, 0x2F, 0x63, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x30, 0x20, 0x2F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x30, 0x31, 0x20, 0x2F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x30, 0x32, 0x20, 0x2F, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x31, 0x30, 0x33, 0x20, 0x2F, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x31, 0x30, 0x34, 0x20, 0x2F, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x30, 0x35, 0x20, 0x2F, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30,
+    0x36, 0x20, 0x2F, 0x6A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x37,
+    0x20, 0x2F, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x38, 0x20,
+    0x2F, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x39, 0x20, 0x2F,
+    0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x30, 0x20, 0x2F, 0x6E,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x31, 0x20, 0x2F, 0x6F, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x32, 0x20, 0x2F, 0x70, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x33, 0x20, 0x2F, 0x71, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x34, 0x20, 0x2F, 0x72, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x35, 0x20, 0x2F, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x36, 0x20, 0x2F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x31, 0x37, 0x20, 0x2F, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x31, 0x38, 0x20, 0x2F, 0x76, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x31, 0x31, 0x39, 0x20, 0x2F, 0x77, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x31, 0x32, 0x30, 0x20, 0x2F, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x32, 0x31, 0x20, 0x2F, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32,
+    0x32, 0x20, 0x2F, 0x7A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x33,
+    0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x34, 0x20, 0x2F, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x35, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72,
+    0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x36,
+    0x20, 0x2F, 0x61, 0x73, 0x63, 0x69, 0x69, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x38, 0x20, 0x2F, 0x45, 0x75, 0x72, 0x6F, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x30, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74,
+    0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x33, 0x31, 0x20, 0x2F, 0x66, 0x6C, 0x6F, 0x72, 0x69, 0x6E, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x32, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74,
+    0x65, 0x64, 0x62, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x31, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x6C, 0x6C, 0x69, 0x70, 0x73, 0x69, 0x73, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x34, 0x20, 0x2F, 0x64, 0x61, 0x67, 0x67,
+    0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x35, 0x20, 0x2F,
+    0x64, 0x61, 0x67, 0x67, 0x65, 0x72, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x33, 0x36, 0x20, 0x2F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65,
+    0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x37, 0x20, 0x2F, 0x70,
+    0x65, 0x72, 0x74, 0x68, 0x6F, 0x75, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x33, 0x38, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x39, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C,
+    0x73, 0x69, 0x6E, 0x67, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x34, 0x30, 0x20, 0x2F, 0x4F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x34, 0x35, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x6C, 0x65, 0x66, 0x74,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x36, 0x20, 0x2F, 0x71, 0x75,
+    0x6F, 0x74, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x31, 0x34, 0x37, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x6C, 0x65,
+    0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x38, 0x20, 0x2F,
+    0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x39, 0x20, 0x2F, 0x62, 0x75, 0x6C, 0x6C, 0x65,
+    0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x30, 0x20, 0x2F, 0x65,
+    0x6E, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35,
+    0x31, 0x20, 0x2F, 0x65, 0x6D, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x35, 0x32, 0x20, 0x2F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x33, 0x20, 0x2F, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6D,
+    0x61, 0x72, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x34, 0x20,
+    0x2F, 0x73, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x31, 0x35, 0x35, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x72, 0x69,
+    0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x36, 0x20,
+    0x2F, 0x6F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x39, 0x20,
+    0x2F, 0x59, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x64, 0x6F,
+    0x77, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x32, 0x20, 0x2F,
+    0x63, 0x65, 0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x33,
+    0x20, 0x2F, 0x73, 0x74, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x36, 0x34, 0x20, 0x2F, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x35, 0x20, 0x2F, 0x79, 0x65,
+    0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x36, 0x20, 0x2F, 0x62,
+    0x72, 0x6F, 0x6B, 0x65, 0x6E, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x31, 0x36, 0x37, 0x20, 0x2F, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x38, 0x20, 0x2F, 0x64, 0x69, 0x65, 0x72, 0x65,
+    0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x39, 0x20,
+    0x2F, 0x63, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x37, 0x30, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x66, 0x65, 0x6D, 0x69, 0x6E,
+    0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x31, 0x20,
+    0x2F, 0x67, 0x75, 0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x32, 0x20, 0x2F, 0x6C, 0x6F, 0x67, 0x69,
+    0x63, 0x61, 0x6C, 0x6E, 0x6F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x37, 0x34, 0x20, 0x2F, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x35, 0x20, 0x2F, 0x6D, 0x61, 0x63, 0x72,
+    0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x36, 0x20, 0x2F,
+    0x64, 0x65, 0x67, 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x37, 0x37, 0x20, 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x6D, 0x69, 0x6E, 0x75, 0x73, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x38, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x73, 0x75,
+    0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+    0x37, 0x39, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6F,
+    0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x30, 0x20, 0x2F, 0x61,
+    0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x31,
+    0x20, 0x2F, 0x6D, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x32,
+    0x20, 0x2F, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x33, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x63,
+    0x65, 0x6E, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x31, 0x38, 0x34, 0x20, 0x2F, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x35, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x73, 0x75, 0x70,
+    0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38,
+    0x36, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x6D, 0x61, 0x73, 0x63, 0x75, 0x6C, 0x69, 0x6E, 0x65, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x37, 0x20, 0x2F, 0x67, 0x75, 0x69,
+    0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x38, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x71, 0x75, 0x61, 0x72,
+    0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x39, 0x20,
+    0x2F, 0x6F, 0x6E, 0x65, 0x68, 0x61, 0x6C, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x31, 0x39, 0x30, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74,
+    0x65, 0x72, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x31, 0x20,
+    0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x64, 0x6F, 0x77, 0x6E, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x32, 0x20, 0x2F, 0x41, 0x67, 0x72, 0x61, 0x76,
+    0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x33, 0x20, 0x2F, 0x41,
+    0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39,
+    0x34, 0x20, 0x2F, 0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x35, 0x20, 0x2F, 0x41, 0x74, 0x69, 0x6C,
+    0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x36, 0x20, 0x2F,
+    0x41, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x31, 0x39, 0x37, 0x20, 0x2F, 0x41, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x38, 0x20, 0x2F, 0x41, 0x45, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x39, 0x20, 0x2F, 0x43, 0x63, 0x65, 0x64, 0x69, 0x6C,
+    0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x30, 0x20, 0x2F,
+    0x45, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+    0x30, 0x31, 0x20, 0x2F, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x32, 0x30, 0x32, 0x20, 0x2F, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66,
+    0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x33, 0x20,
+    0x2F, 0x45, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x32, 0x30, 0x34, 0x20, 0x2F, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x35, 0x20, 0x2F, 0x49, 0x61, 0x63, 0x75,
+    0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x36, 0x20, 0x2F,
+    0x49, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x37, 0x20, 0x2F, 0x49, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73,
+    0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x38, 0x20, 0x2F,
+    0x45, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x39, 0x20,
+    0x2F, 0x4E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x32, 0x31, 0x30, 0x20, 0x2F, 0x4F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+    0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x31, 0x20, 0x2F, 0x4F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x32, 0x20, 0x2F, 0x4F, 0x63, 0x69,
+    0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x32, 0x31, 0x33, 0x20, 0x2F, 0x4F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x34, 0x20, 0x2F, 0x4F, 0x64, 0x69, 0x65, 0x72, 0x65,
+    0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x35, 0x20,
+    0x2F, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x32, 0x31, 0x36, 0x20, 0x2F, 0x4F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x37, 0x20, 0x2F, 0x55, 0x67, 0x72, 0x61, 0x76,
+    0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x38, 0x20, 0x2F, 0x55,
+    0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31,
+    0x39, 0x20, 0x2F, 0x55, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x30, 0x20, 0x2F, 0x55, 0x64, 0x69, 0x65,
+    0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32,
+    0x31, 0x20, 0x2F, 0x59, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x32, 0x32, 0x32, 0x20, 0x2F, 0x54, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x33, 0x20, 0x2F, 0x67, 0x65, 0x72, 0x6D, 0x61, 0x6E,
+    0x64, 0x62, 0x6C, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x34,
+    0x20, 0x2F, 0x61, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+    0x20, 0x32, 0x32, 0x35, 0x20, 0x2F, 0x61, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x36, 0x20, 0x2F, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75,
+    0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32,
+    0x37, 0x20, 0x2F, 0x61, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x32, 0x32, 0x38, 0x20, 0x2F, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x39, 0x20, 0x2F, 0x61, 0x72,
+    0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x30, 0x20,
+    0x2F, 0x61, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x31, 0x20,
+    0x2F, 0x63, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x32, 0x33, 0x32, 0x20, 0x2F, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75,
+    0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x61, 0x63, 0x75, 0x74,
+    0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x34, 0x20, 0x2F, 0x65,
+    0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x32, 0x33, 0x35, 0x20, 0x2F, 0x65, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69,
+    0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x36, 0x20, 0x2F, 0x69,
+    0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33,
+    0x37, 0x20, 0x2F, 0x69, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x32, 0x33, 0x38, 0x20, 0x2F, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C,
+    0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x39, 0x20, 0x2F,
+    0x69, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x32, 0x34, 0x30, 0x20, 0x2F, 0x65, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x32, 0x34, 0x31, 0x20, 0x2F, 0x6E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x32, 0x20, 0x2F, 0x6F, 0x67, 0x72, 0x61,
+    0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x33, 0x20, 0x2F,
+    0x6F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+    0x34, 0x34, 0x20, 0x2F, 0x6F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20,
+    0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x35, 0x20, 0x2F, 0x6F, 0x74, 0x69,
+    0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x36, 0x20,
+    0x2F, 0x6F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x32, 0x34, 0x37, 0x20, 0x2F, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x38, 0x20, 0x2F, 0x6F, 0x73, 0x6C, 0x61,
+    0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x39, 0x20, 0x2F,
+    0x75, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+    0x35, 0x30, 0x20, 0x2F, 0x75, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x32, 0x35, 0x31, 0x20, 0x2F, 0x75, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66,
+    0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x32, 0x20,
+    0x2F, 0x75, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x32, 0x35, 0x33, 0x20, 0x2F, 0x79, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70,
+    0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x34, 0x20, 0x2F, 0x74, 0x68, 0x6F, 0x72,
+    0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x35, 0x20, 0x2F, 0x79,
+    0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x72, 0x65, 0x61,
+    0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x61, 0x69, 0x6E, 0x74,
+    0x54, 0x79, 0x70, 0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74,
+    0x54, 0x79, 0x70, 0x65, 0x20, 0x31, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x42, 0x6C, 0x65,
+    0x6E, 0x64, 0x20, 0x7B, 0x20, 0x30, 0x2E, 0x31, 0x30, 0x34, 0x38, 0x20, 0x6D, 0x75, 0x6C, 0x20,
+    0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x34, 0x35, 0x30, 0x34, 0x20, 0x6D, 0x75, 0x6C, 0x20,
+    0x61, 0x64, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x31, 0x37, 0x34, 0x36, 0x20,
+    0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x62, 0x69,
+    0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4D, 0x61, 0x74, 0x72,
+    0x69, 0x78, 0x20, 0x5B, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30,
+    0x20, 0x30, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30,
+    0x20, 0x5D, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D,
+    0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x2D, 0x31, 0x35, 0x37, 0x20,
+    0x2D, 0x32, 0x35, 0x37, 0x20, 0x31, 0x31, 0x39, 0x34, 0x20, 0x38, 0x37, 0x32, 0x7D, 0x20, 0x72,
+    0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65,
+    0x6E, 0x64, 0x20, 0x33, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65,
+    0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x7B,
+    0x20, 0x2D, 0x31, 0x33, 0x35, 0x20, 0x2D, 0x32, 0x33, 0x36, 0x20, 0x2D, 0x31, 0x33, 0x35, 0x20,
+    0x2D, 0x32, 0x30, 0x31, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32,
+    0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x7D, 0x20, 0x7B,
+    0x20, 0x35, 0x38, 0x32, 0x20, 0x31, 0x32, 0x31, 0x37, 0x20, 0x31, 0x32, 0x37, 0x34, 0x20, 0x31,
+    0x39, 0x32, 0x32, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20,
+    0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20, 0x7D, 0x7D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,
+    0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20,
+    0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x25, 0x20, 0x43, 0x6F,
+    0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x30,
+    0x2D, 0x31, 0x39, 0x39, 0x34, 0x20, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x53, 0x79, 0x73, 0x74,
+    0x65, 0x6D, 0x73, 0x20, 0x49, 0x6E, 0x63, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x65, 0x64,
+    0x0D, 0x25, 0x20, 0x41, 0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65,
+    0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2E, 0x0D, 0x2F, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64,
+    0x69, 0x63, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20,
+    0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20,
+    0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x74, 0x72, 0x75, 0x65,
+    0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65,
+    0x64, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73,
+    0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20,
+    0x64, 0x75, 0x70, 0x0D, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64,
+    0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61,
+    0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x67, 0x65,
+    0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x6F, 0x70, 0x65, 0x72,
+    0x61, 0x74, 0x6F, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F,
+    0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x65,
+    0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65,
+    0x67, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6E, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70,
+    0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x31, 0x31, 0x20, 0x6C, 0x74,
+    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+    0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66,
+    0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E,
+    0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x31, 0x31, 0x20, 0x70, 0x6F, 0x70,
+    0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65,
+    0x78, 0x63, 0x68, 0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F,
+    0x72, 0x20, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x71, 0x0D,
+    0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x61,
+    0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x31, 0x20, 0x73, 0x75,
+    0x62, 0x20, 0x61, 0x62, 0x73, 0x20, 0x2E, 0x30, 0x30, 0x31, 0x20, 0x67, 0x74, 0x20, 0x7D, 0x0D,
+    0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+    0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F,
+    0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74,
+    0x20, 0x2F, 0x72, 0x61, 0x6E, 0x67, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74,
+    0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74,
+    0x68, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66,
+    0x61, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x46, 0x49, 0x44, 0x20, 0x2F, 0x55, 0x6E, 0x69,
+    0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20,
+    0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20,
+    0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+    0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,
+    0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x2F, 0x58, 0x55, 0x49, 0x44,
+    0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B, 0x0D,
+    0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x32,
+    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x75,
+    0x62, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63,
+    0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72,
+    0x61, 0x79, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69,
+    0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x6D, 0x75, 0x6C,
+    0x20, 0x63, 0x76, 0x69, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20,
+    0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61,
+    0x6C, 0x6C, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x65, 0x78, 0x63,
+    0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F,
+    0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70,
+    0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+    0x7B, 0x20, 0x2F, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74,
+    0x49, 0x6E, 0x66, 0x6F, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x6F, 0x61,
+    0x64, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+    0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C,
+    0x73, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F,
+    0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+    0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D,
+    0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65,
+    0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72,
+    0x61, 0x6C, 0x6C, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20,
+    0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74,
+    0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x2F, 0x24, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x5B, 0x0D, 0x65,
+    0x78, 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20,
+    0x2D, 0x31, 0x20, 0x31, 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64,
+    0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x33, 0x20, 0x2D, 0x31, 0x20, 0x72,
+    0x6F, 0x6C, 0x6C, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+    0x30, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64,
+    0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20,
+    0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x2F, 0x70,
+    0x6F, 0x70, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C,
+    0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20,
+    0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+    0x7B, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x34, 0x20, 0x31,
+    0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x33, 0x20, 0x31, 0x20, 0x72,
+    0x6F, 0x6C, 0x6C, 0x20, 0x2F, 0x6D, 0x75, 0x6C, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20,
+    0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+    0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C,
+    0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69,
+    0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20,
+    0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20,
+    0x66, 0x6F, 0x72, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C,
+    0x6F, 0x61, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x5D, 0x20, 0x63, 0x76, 0x78, 0x20, 0x64,
+    0x65, 0x66, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67,
+    0x74, 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E,
+    0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64,
+    0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69,
+    0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65,
+    0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x30, 0x20, 0x30, 0x20,
+    0x31, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68,
+    0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69,
+    0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78,
+    0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x67, 0x65, 0x74, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x0D, 0x7D, 0x20, 0x66, 0x6F,
+    0x72, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79,
+    0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61,
+    0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70,
+    0x61, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65,
+    0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64,
+    0x65, 0x78, 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x20, 0x65, 0x71,
+    0x20, 0x7B, 0x0D, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31,
+    0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+    0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E,
+    0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x7B, 0x20, 0x32,
+    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20,
+    0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66,
+    0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x69,
+    0x6E, 0x64, 0x65, 0x78, 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x54,
+    0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x20, 0x67, 0x65, 0x74, 0x20, 0x67, 0x74, 0x20,
+    0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x7B, 0x20, 0x6C, 0x65, 0x6E,
+    0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67,
+    0x74, 0x68, 0x20, 0x6E, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73,
+    0x65, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x7B, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65,
+    0x67, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x2F, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63,
+    0x68, 0x20, 0x6F, 0x72, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C,
+    0x6C, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x0D, 0x32, 0x20, 0x63,
+    0x6F, 0x70, 0x79, 0x20, 0x38, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68,
+    0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x35, 0x20, 0x69, 0x6E,
+    0x64, 0x65, 0x78, 0x20, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63,
+    0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65,
+    0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64,
+    0x65, 0x78, 0x20, 0x78, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x78, 0x20,
+    0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+    0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x20, 0x65,
+    0x78, 0x63, 0x68, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65,
+    0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74,
+    0x79, 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79,
+    0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B,
+    0x65, 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F,
+    0x72, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+    0x20, 0x36, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x0D,
+    0x39, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x39, 0x20, 0x69,
+    0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D,
+    0x20, 0x69, 0x66, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x33, 0x20, 0x31, 0x20,
+    0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65,
+    0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70,
+    0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79,
+    0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x53, 0x74,
+    0x65, 0x6D, 0x53, 0x6E, 0x61, 0x70, 0x48, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x2F, 0x53, 0x74, 0x65, 0x6D, 0x53, 0x6E, 0x61, 0x70, 0x56, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72,
+    0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20,
+    0x73, 0x75, 0x62, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B,
+    0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x64,
+    0x75, 0x70, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+    0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33,
+    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20,
+    0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20,
+    0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+    0x30, 0x20, 0x70, 0x75, 0x74, 0x20, 0x30, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x6C, 0x65, 0x20,
+    0x7B, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20,
+    0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65,
+    0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74,
+    0x0D, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20,
+    0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x78, 0x63, 0x68,
+    0x20, 0x70, 0x75, 0x74, 0x0D, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20,
+    0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6C, 0x74, 0x20,
+    0x7B, 0x20, 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69,
+    0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+    0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20,
+    0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x30,
+    0x20, 0x67, 0x74, 0x20, 0x7B, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20,
+    0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64,
+    0x75, 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74,
+    0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x69, 0x6E,
+    0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66,
+    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x0D,
+    0x7B, 0x20, 0x2F, 0x64, 0x69, 0x63, 0x74, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B,
+    0x20, 0x36, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C,
+    0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65,
+    0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65,
+    0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20,
+    0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63,
+    0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20,
+    0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20,
+    0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C,
+    0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+    0x20, 0x7D, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x42,
+    0x6C, 0x65, 0x6E, 0x64, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65,
+    0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E,
+    0x64, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x2F, 0x24, 0x66,
+    0x62, 0x66, 0x20, 0x7B, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+    0x72, 0x79, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x33,
+    0x20, 0x61, 0x64, 0x64, 0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x6B, 0x6E, 0x6F,
+    0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B,
+    0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20,
+    0x7B, 0x0D, 0x5D, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E,
+    0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64,
+    0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F,
+    0x64, 0x69, 0x6E, 0x67, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74,
+    0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x67, 0x65, 0x74, 0x20, 0x70,
+    0x75, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20,
+    0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F,
+    0x6E, 0x74, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x6C, 0x65, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20,
+    0x67, 0x65, 0x74, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x65, 0x74,
+    0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x20,
+    0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66,
+    0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x4E, 0x6F, 0x72, 0x6D, 0x61,
+    0x6C, 0x69, 0x7A, 0x65, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72,
+    0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x31, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20,
+    0x36, 0x38, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x30, 0x30,
+    0x20, 0x73, 0x75, 0x62, 0x20, 0x38, 0x30, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x7D, 0x20, 0x62,
+    0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74,
+    0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x31,
+    0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x32,
+    0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33,
+    0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+    0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75,
+    0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69,
+    0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+    0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20,
+    0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75,
+    0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70,
+    0x6F, 0x70, 0x20, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24,
+    0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E,
+    0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x73, 0x61,
+    0x76, 0x65, 0x20, 0x7B, 0x20, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x7D, 0x20, 0x7B,
+    0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B,
+    0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+    0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x77,
+    0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20,
+    0x7D, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+    0x73, 0x65, 0x0D, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65,
+    0x72, 0x65, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65,
+    0x6D, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B,
+    0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B,
+    0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65,
+    0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20,
+    0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66,
+    0x65, 0x6C, 0x73, 0x65, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x0D,
+    0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74,
+    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D,
+    0x7D, 0x20, 0x7B, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72, 0x72,
+    0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x73, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7D,
+    0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,
+    0x65, 0x20, 0x7B, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65,
+    0x64, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65,
+    0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C,
+    0x73, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D,
+    0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20,
+    0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,
+    0x65, 0x0D, 0x2F, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E,
+    0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20,
+    0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65,
+    0x63, 0x0D, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20,
+    0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70,
+    0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65,
+    0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70,
+    0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64,
+    0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72,
+    0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77,
+    0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F,
+    0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68,
+    0x20, 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67,
+    0x65, 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73,
+    0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+    0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67,
+    0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70,
+    0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69,
+    0x6E, 0x67, 0x20, 0x63, 0x76, 0x73, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63,
+    0x68, 0x20, 0x7B, 0x0D, 0x63, 0x76, 0x6E, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20,
+    0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78,
+    0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x53, 0x68,
+    0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72,
+    0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x6F, 0x72, 0x20,
+    0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C,
+    0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x37, 0x20, 0x61, 0x64, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69,
+    0x6E, 0x67, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x28, 0x25, 0x66, 0x6F, 0x6E, 0x74, 0x25,
+    0x29, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x64, 0x75,
+    0x70, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x65, 0x78, 0x63, 0x68,
+    0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69,
+    0x6E, 0x67, 0x20, 0x63, 0x76, 0x73, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76,
+    0x61, 0x6C, 0x0D, 0x7B, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x7D, 0x20, 0x73, 0x74,
+    0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73,
+    0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+    0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20,
+    0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D, 0x24, 0x6D, 0x6D, 0x66,
+    0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x62,
+    0x65, 0x67, 0x69, 0x6E, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x5B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+    0x7B, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x7B,
+    0x20, 0x63, 0x76, 0x72, 0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B,
+    0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63,
+    0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+    0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x69, 0x74,
+    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70,
+    0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F,
+    0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x6E,
+    0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73,
+    0x54, 0x79, 0x70, 0x65, 0x73, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F,
+    0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+    0x63, 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x32, 0x20, 0x73, 0x75,
+    0x62, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20,
+    0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+    0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C,
+    0x69, 0x7A, 0x65, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D,
+    0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63,
+    0x74, 0x6F, 0x72, 0x0D, 0x5D, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63,
+    0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64,
+    0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78,
+    0x63, 0x68, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x65, 0x78, 0x63,
+    0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74,
+    0x20, 0x7D, 0x20, 0x7B, 0x20, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B,
+    0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66,
+    0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x6E, 0x64,
+    0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+    0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66,
+    0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B,
+    0x20, 0x70, 0x6F, 0x70, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66,
+    0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+    0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64,
+    0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x53,
+    0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+    0x72, 0x79, 0x20, 0x64, 0x75, 0x70, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70,
+    0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x64, 0x69, 0x63,
+    0x74, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D,
+    0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x65, 0x63,
+    0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E,
+    0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E,
+    0x74, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x65, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x80, 0x02, 0x0B, 0x8F,
+    0x01, 0x00, 0xE8, 0xDC, 0x61, 0x72, 0x80, 0x71, 0xAB, 0xD4, 0xD5, 0xBC, 0xD2, 0x30, 0xC4, 0xE1,
+    0x86, 0xDC, 0xE0, 0x96, 0x54, 0x1C, 0x9C, 0x1F, 0x2E, 0x58, 0x69, 0x40, 0x4E, 0x33, 0xF9, 0xCE,
+    0xFF, 0x7D, 0x2F, 0xBF, 0xEF, 0x5F, 0x26, 0xC7, 0xE1, 0x84, 0x89, 0x54, 0xC7, 0x07, 0x55, 0x24,
+    0x4E, 0x73, 0x41, 0xB8, 0x26, 0x97, 0xE2, 0xE8, 0xEA, 0x9C, 0xE9, 0x13, 0x1D, 0x00, 0x55, 0x78,
+    0xAB, 0x3D, 0xE1, 0x9F, 0xA9, 0xF2, 0xFA, 0xFF, 0x3B, 0xEB, 0x53, 0x17, 0x4A, 0x8E, 0x2F, 0x33,
+    0xE9, 0xDB, 0xE0, 0x38, 0x63, 0x42, 0xF4, 0x0E, 0x5D, 0xF2, 0x5B, 0x7A, 0x88, 0x22, 0xEE, 0x2B,
+    0x6C, 0xDC, 0xAC, 0x58, 0xA9, 0x8F, 0x9B, 0x04, 0x71, 0x44, 0xE3, 0xF6, 0xE7, 0x4A, 0xB6, 0x0C,
+    0x00, 0xE4, 0x42, 0xE8, 0x30, 0xB1, 0x30, 0x30, 0x8A, 0x3F, 0x0E, 0xDF, 0x2C, 0xE6, 0x62, 0x35,
+    0xF9, 0x21, 0x6D, 0x42, 0x0F, 0x23, 0xAC, 0xED, 0xEC, 0x60, 0xA8, 0x8A, 0x73, 0x77, 0x14, 0x62,
+    0xE1, 0xB2, 0x04, 0x04, 0x29, 0x5D, 0x49, 0xBA, 0x8A, 0x8B, 0xCB, 0xF2, 0x04, 0x2A, 0x8D, 0xEB,
+    0x9A, 0x65, 0xBA, 0xF1, 0xC8, 0x24, 0x2F, 0x7E, 0x90, 0xD9, 0x49, 0x63, 0x23, 0x73, 0xF8, 0x43,
+    0x8F, 0xC1, 0xE7, 0x37, 0x37, 0x0B, 0x91, 0x15, 0x08, 0x9D, 0xA7, 0x90, 0xA8, 0x28, 0x50, 0xB6,
+    0x91, 0xE6, 0xE8, 0x3B, 0x37, 0x22, 0xC0, 0x07, 0x14, 0xDC, 0xBC, 0xEA, 0xA1, 0xDC, 0x3D, 0x22,
+    0x98, 0x3B, 0x35, 0x61, 0x6A, 0xD7, 0xF1, 0x03, 0x35, 0x0B, 0x4A, 0x40, 0xB2, 0xAA, 0xE5, 0x0E,
+    0xF0, 0x94, 0x6C, 0x77, 0xC5, 0x67, 0x73, 0x0D, 0x0D, 0xE6, 0x76, 0xA6, 0x95, 0x13, 0x0A, 0xBE,
+    0xC8, 0xC7, 0xB8, 0xC4, 0x6B, 0xFA, 0xBC, 0xDA, 0xDD, 0x88, 0x2C, 0x74, 0x58, 0x58, 0x9B, 0x2B,
+    0xEA, 0x87, 0xE1, 0x23, 0x2C, 0x60, 0x58, 0x0C, 0x62, 0x35, 0xB7, 0xD7, 0xE8, 0xC6, 0x6A, 0x2A,
+    0x72, 0x90, 0x1F, 0x3D, 0x0D, 0x76, 0x59, 0x30, 0x0E, 0x7E, 0x04, 0xFF, 0xDE, 0x4A, 0xA6, 0xD8,
+    0x88, 0x25, 0x75, 0x76, 0x30, 0xCF, 0x8C, 0x9E, 0x8E, 0xA4, 0x14, 0x10, 0x7F, 0x2F, 0xC4, 0xA8,
+    0x0F, 0xCA, 0xAF, 0xCB, 0x54, 0x39, 0x87, 0x1A, 0x81, 0x71, 0xFB, 0xA5, 0x08, 0x17, 0x4F, 0x53,
+    0xB8, 0xEC, 0xE2, 0xD3, 0xBF, 0xBD, 0xBA, 0x93, 0x75, 0xFF, 0x8F, 0xB9, 0x66, 0x12, 0x02, 0x21,
+    0x87, 0x6D, 0xB0, 0xDC, 0x2D, 0x37, 0x22, 0xB7, 0x88, 0xB4, 0xD3, 0x8F, 0x8B, 0x24, 0xEF, 0x76,
+    0xF3, 0xB4, 0x91, 0x58, 0x95, 0xFF, 0x41, 0xD8, 0xFA, 0xFA, 0xD8, 0xE8, 0x68, 0xA9, 0xA8, 0x5B,
+    0x59, 0x2C, 0xF0, 0x30, 0xA1, 0xD0, 0x44, 0x8A, 0x81, 0xF5, 0xE6, 0x92, 0x1E, 0xAE, 0xE8, 0x26,
+    0xA4, 0xD9, 0xB7, 0x05, 0x5A, 0x9C, 0xA1, 0xC7, 0x98, 0xAA, 0xFA, 0x25, 0x91, 0x11, 0x4D, 0x61,
+    0xCB, 0x50, 0x2E, 0xFC, 0xFC, 0x44, 0x63, 0x02, 0x08, 0xCB, 0xA9, 0x17, 0x10, 0x3B, 0xC3, 0xA1,
+    0x2A, 0x60, 0xB1, 0x79, 0x84, 0x95, 0x83, 0xD0, 0xB1, 0xF1, 0xDC, 0x9F, 0xBE, 0xB2, 0xBC, 0x90,
+    0xD1, 0xE4, 0xF2, 0x42, 0xD5, 0x08, 0x0B, 0xD4, 0xB1, 0x4C, 0x73, 0x8D, 0x0C, 0xD1, 0x69, 0xC8,
+    0x1E, 0xB6, 0x84, 0x5F, 0xD9, 0x2D, 0xAB, 0x2A, 0x6B, 0xBB, 0x48, 0x3F, 0xB6, 0xFB, 0x08, 0x2F,
+    0x57, 0x11, 0xAB, 0x42, 0x54, 0xC9, 0xD7, 0xB1, 0xF8, 0x28, 0xBA, 0xCD, 0x68, 0xF9, 0x0D, 0xE0,
+    0xD1, 0x26, 0xCE, 0xA0, 0x24, 0x56, 0x63, 0xB7, 0xA1, 0xC6, 0x85, 0xD8, 0x55, 0x18, 0x60, 0x25,
+    0x55, 0x0B, 0xC6, 0x9B, 0xC4, 0x28, 0x0C, 0x37, 0xE0, 0x9A, 0x74, 0x52, 0x0D, 0x76, 0x5F, 0x41,
+    0xDC, 0xEA, 0xD8, 0x35, 0x1A, 0xB7, 0x49, 0xC3, 0x5C, 0x6D, 0xD0, 0x83, 0x7A, 0x4F, 0xC1, 0xCB,
+    0x12, 0xAB, 0x27, 0x4B, 0xCF, 0x7F, 0xF8, 0x01, 0xC1, 0x8D, 0x13, 0x34, 0x62, 0xFF, 0xE0, 0x5C,
+    0x56, 0xCE, 0x4E, 0x3D, 0x34, 0x37, 0xAC, 0xFB, 0xB0, 0x3E, 0x05, 0xA6, 0x2B, 0xF6, 0x2C, 0xA2,
+    0x46, 0x65, 0x6A, 0xAF, 0x3E, 0xD6, 0x5A, 0x92, 0x22, 0xFF, 0x51, 0xF3, 0x19, 0x27, 0x39, 0xB3,
+    0x32, 0x7F, 0x94, 0x7A, 0x6B, 0x56, 0xF8, 0xB8, 0xA5, 0x70, 0xB1, 0x3F, 0x15, 0x15, 0xF6, 0x61,
+    0x4B, 0x88, 0xB0, 0x12, 0xE0, 0x4F, 0x6F, 0xE9, 0xCB, 0x2C, 0x72, 0x01, 0xB1, 0xDB, 0x85, 0x78,
+    0x3C, 0x0F, 0xD2, 0x3B, 0x54, 0x8E, 0x29, 0x21, 0x66, 0xBA, 0x80, 0xC6, 0x05, 0x5E, 0xD1, 0xD9,
+    0x93, 0xCD, 0x63, 0xA0, 0x95, 0xBB, 0x26, 0xA3, 0x36, 0x12, 0x2D, 0x1C, 0xE4, 0xEA, 0x98, 0xE6,
+    0xDC, 0x9F, 0xD6, 0x61, 0xF8, 0x71, 0x14, 0xFE, 0xF8, 0x10, 0xB9, 0x24, 0x36, 0xF9, 0xB3, 0x6C,
+    0x0F, 0xC3, 0x28, 0x46, 0x43, 0x19, 0xAF, 0xA7, 0xB1, 0xEC, 0x4A, 0x88, 0x7C, 0xE7, 0x85, 0x81,
+    0x23, 0x69, 0xF3, 0x21, 0x90, 0xEB, 0x3D, 0xB1, 0x73, 0x4A, 0xB2, 0xF2, 0x55, 0x30, 0xF8, 0x02,
+    0x79, 0x76, 0x1D, 0xFB, 0x0A, 0x40, 0x06, 0x61, 0xCC, 0xCB, 0x47, 0x94, 0x1A, 0x74, 0x70, 0x8F,
+    0x1B, 0x93, 0x16, 0x24, 0xAA, 0x32, 0xD4, 0xB0, 0xEE, 0xCA, 0xEE, 0x0D, 0x27, 0x71, 0x0D, 0xE8,
+    0xCC, 0xD7, 0x2A, 0x28, 0xA5, 0xC4, 0xD8, 0xDD, 0x0B, 0x16, 0x74, 0xF7, 0xE3, 0x61, 0x06, 0x37,
+    0x24, 0x1C, 0x00, 0x14, 0x0C, 0x32, 0x7F, 0x88, 0x75, 0xF9, 0x9B, 0xFA, 0x3B, 0xCA, 0xF6, 0x51,
+    0xD2, 0xAB, 0xD5, 0x3F, 0x21, 0xCD, 0x51, 0x3D, 0x3D, 0xB4, 0x81, 0xF9, 0x33, 0x79, 0xE9, 0x62,
+    0x9F, 0x93, 0x5F, 0xA8, 0x77, 0x26, 0x75, 0x01, 0x40, 0xD3, 0xE3, 0xBD, 0x68, 0x8D, 0x1B, 0xCC,
+    0xE7, 0x79, 0xB2, 0x3E, 0x61, 0xB6, 0x00, 0xF0, 0x0A, 0x58, 0xF2, 0xC1, 0x4C, 0x5A, 0xA4, 0x86,
+    0xD4, 0xCA, 0xCB, 0x15, 0xCC, 0xD1, 0x16, 0x74, 0x70, 0xF3, 0xCB, 0xBA, 0x0E, 0x8A, 0xDB, 0xEB,
+    0x4F, 0x3D, 0x0C, 0x3C, 0xFE, 0x40, 0x7D, 0x46, 0xC0, 0x0E, 0x0E, 0x18, 0x64, 0x69, 0xAB, 0xEF,
+    0x00, 0x68, 0x83, 0x95, 0xFF, 0x32, 0xF3, 0x13, 0x78, 0x8C, 0x1E, 0xF9, 0xA8, 0xE8, 0x2D, 0x5F,
+    0x04, 0xB8, 0x15, 0x22, 0x76, 0xDD, 0x46, 0xCF, 0x69, 0xA4, 0xCE, 0x5B, 0x20, 0x77, 0xA0, 0x22,
+    0x24, 0xE5, 0xDE, 0xB8, 0xF3, 0x44, 0x5B, 0xC9, 0xEF, 0x47, 0xFD, 0x3A, 0x02, 0xAF, 0x31, 0x6C,
+    0x02, 0x4A, 0x02, 0x3C, 0x65, 0x5A, 0x0B, 0x63, 0xB0, 0x11, 0xBB, 0x07, 0x3C, 0xFC, 0xFA, 0xAD,
+    0x93, 0x46, 0x11, 0x6D, 0x68, 0xFF, 0xB7, 0xC7, 0x58, 0x2F, 0x7C, 0x23, 0x62, 0xD7, 0xD9, 0xF9,
+    0x7A, 0x8A, 0xD3, 0x11, 0x58, 0xAC, 0x43, 0x0D, 0xA0, 0x77, 0x8D, 0x88, 0xD5, 0x34, 0xD1, 0xB9,
+    0x2E, 0x4A, 0x8C, 0xDC, 0xA0, 0x71, 0xB9, 0xB2, 0x18, 0xC5, 0x74, 0x1E, 0x48, 0x9E, 0x70, 0x0A,
+    0x7E, 0x9B, 0x71, 0xFA, 0xC7, 0x4D, 0x3C, 0x6E, 0x19, 0x88, 0xF0, 0xE2, 0xA5, 0x99, 0x3D, 0x85,
+    0xBB, 0xE1, 0xDA, 0x82, 0x7B, 0xA9, 0xBA, 0x59, 0x0E, 0x03, 0x26, 0x3B, 0x83, 0xC8, 0x81, 0x36,
+    0x70, 0xA4, 0x11, 0x97, 0x97, 0xB6, 0x47, 0x7D, 0x81, 0x02, 0x45, 0x1C, 0x76, 0x33, 0x98, 0x84,
+    0xFE, 0xFE, 0x65, 0xDE, 0x37, 0x31, 0xE7, 0xD9, 0x6F, 0xDC, 0xAC, 0xC1, 0x1C, 0x1F, 0xA4, 0x08,
+    0x98, 0x47, 0xD3, 0x53, 0xF9, 0x24, 0x6E, 0x26, 0x99, 0x7C, 0xF2, 0xCF, 0x2A, 0xC8, 0xCC, 0xAD,
+    0x17, 0x09, 0xE3, 0x1B, 0x66, 0xAC, 0x24, 0x6F, 0xE0, 0x88, 0x14, 0xC4, 0x8A, 0xF2, 0xFA, 0x93,
+    0xE9, 0x48, 0xB5, 0xA4, 0x52, 0xF9, 0xDE, 0x54, 0xF5, 0xF4, 0x20, 0x95, 0x45, 0xCE, 0x37, 0x2E,
+    0x9E, 0x0A, 0xC7, 0x89, 0xF2, 0x00, 0x64, 0x6D, 0xBC, 0xAF, 0x9F, 0x52, 0xBC, 0xA0, 0x17, 0xE3,
+    0x20, 0x42, 0xAB, 0xBF, 0xFB, 0x2A, 0x7F, 0x51, 0xAC, 0xCC, 0x40, 0xEF, 0x6D, 0xF2, 0xBC, 0x3D,
+    0xE2, 0xDC, 0x99, 0x0C, 0x2D, 0xBC, 0x47, 0x1D, 0x98, 0x02, 0x0B, 0xB2, 0xE2, 0xA2, 0x03, 0x47,
+    0x3C, 0x17, 0x69, 0xD6, 0x09, 0xA4, 0x8B, 0x9F, 0x63, 0x40, 0xD8, 0x5F, 0x67, 0xB3, 0x95, 0x28,
+    0x16, 0xAF, 0x67, 0x97, 0x3A, 0x67, 0x29, 0x67, 0x3C, 0xF1, 0x9D, 0x24, 0x34, 0xE3, 0x47, 0x14,
+    0xC6, 0x94, 0xA0, 0x1F, 0xB7, 0x64, 0x9D, 0x7E, 0x38, 0xB8, 0x70, 0xD2, 0x4A, 0x74, 0x54, 0xA4,
+    0x64, 0x34, 0x27, 0x3B, 0xB7, 0x98, 0x18, 0x07, 0x1F, 0x4E, 0x00, 0x86, 0x91, 0x6A, 0x71, 0x09,
+    0x72, 0x6B, 0x42, 0x4F, 0x11, 0x62, 0xDC, 0x0B, 0x15, 0x0C, 0x74, 0x0B, 0x6D, 0xFF, 0xC2, 0x28,
+    0x98, 0x97, 0x33, 0x65, 0xD6, 0xBB, 0x83, 0x4E, 0x4B, 0xE2, 0xCF, 0x7E, 0x98, 0x4B, 0xAD, 0x55,
+    0xF2, 0x1A, 0xEF, 0x15, 0x05, 0xA6, 0xB6, 0xF4, 0xDD, 0x97, 0xAA, 0x81, 0x6D, 0x84, 0x86, 0x17,
+    0xA0, 0xA5, 0x1D, 0xC3, 0x8C, 0xEA, 0x28, 0xCE, 0x69, 0xCC, 0x56, 0x15, 0xFA, 0xD3, 0xEC, 0x12,
+    0xCD, 0x8A, 0x98, 0xD5, 0x13, 0xE9, 0x72, 0xBF, 0x01, 0xCE, 0xBA, 0xF7, 0xCA, 0x85, 0x8C, 0x64,
+    0x55, 0x60, 0xBA, 0x61, 0xF0, 0xDE, 0x97, 0xD9, 0x15, 0xCF, 0xE2, 0x9C, 0xA3, 0x9A, 0x5F, 0x9F,
+    0xFE, 0xD3, 0xC7, 0x5A, 0xF4, 0x44, 0x69, 0x7F, 0x63, 0x41, 0x97, 0x33, 0xD7, 0x41, 0xDF, 0x9B,
+    0x3F, 0x03, 0x23, 0x4A, 0x84, 0x7B, 0x4E, 0xB9, 0x94, 0x3D, 0xBD, 0x32, 0x56, 0x1C, 0x47, 0x7A,
+    0xF0, 0xED, 0x9D, 0x99, 0x24, 0x09, 0xC6, 0x50, 0xC0, 0x98, 0xEA, 0xFE, 0x70, 0x8B, 0xDF, 0xB8,
+    0x5E, 0x7D, 0x64, 0x2C, 0xDC, 0xB5, 0x5F, 0xCA, 0xF6, 0x7B, 0x02, 0x88, 0xA2, 0x82, 0xD2, 0x14,
+    0x0E, 0xA4, 0x14, 0x3B, 0x4A, 0x95, 0x14, 0x5E, 0xD9, 0xFB, 0x47, 0x5F, 0x36, 0x9F, 0x85, 0xC2,
+    0x94, 0x15, 0xB9, 0xC0, 0x01, 0x08, 0x86, 0x75, 0x1E, 0x88, 0x2D, 0x5A, 0x39, 0xC1, 0xDE, 0xC1,
+    0x8B, 0x32, 0xC4, 0xE7, 0x19, 0xA6, 0xFE, 0xFC, 0x62, 0xE9, 0xCF, 0x3E, 0x11, 0xD1, 0x5E, 0x24,
+    0x66, 0x23, 0x5B, 0x8F, 0x42, 0x83, 0xD6, 0x3E, 0x2A, 0xE5, 0xF2, 0xE3, 0x6A, 0x69, 0x40, 0xBE,
+    0xD4, 0xFA, 0x83, 0xC6, 0xE8, 0x2B, 0x35, 0xFE, 0x1A, 0xD1, 0xF3, 0x37, 0x9A, 0x88, 0xA0, 0xC9,
+    0x55, 0x13, 0x4B, 0xC0, 0xEC, 0x45, 0xD7, 0x48, 0x16, 0x28, 0x99, 0xE4, 0x3B, 0x77, 0xF2, 0xB9,
+    0x27, 0x34, 0x4F, 0xAB, 0x18, 0x87, 0x63, 0xE5, 0xF5, 0x68, 0x57, 0x9D, 0x5C, 0xAD, 0x53, 0xD7,
+    0x25, 0xB3, 0x99, 0x5D, 0x70, 0xE0, 0xF6, 0x72, 0xBE, 0xD9, 0x5E, 0x82, 0xFB, 0xD0, 0x72, 0xF5,
+    0x6E, 0x86, 0xEF, 0x7C, 0xD8, 0x23, 0x1E, 0x85, 0x20, 0x7C, 0xEA, 0x2C, 0x8E, 0x09, 0x2A, 0x9B,
+    0x73, 0x62, 0xD3, 0x96, 0xAA, 0xE0, 0x45, 0x1E, 0x63, 0x57, 0xB7, 0x6A, 0xB7, 0xB8, 0xFE, 0x01,
+    0x85, 0x93, 0xEB, 0x7B, 0x25, 0x41, 0xE5, 0x7D, 0xE5, 0x20, 0x50, 0x15, 0x92, 0x06, 0xFE, 0xFA,
+    0x3F, 0x93, 0x16, 0xC5, 0x6F, 0x4A, 0xDF, 0xB3, 0xB9, 0x43, 0x17, 0x32, 0xAF, 0x81, 0x3B, 0x61,
+    0x19, 0xDE, 0xCD, 0xBB, 0x7E, 0x24, 0x74, 0xDD, 0xEB, 0xAE, 0xEA, 0x64, 0x34, 0x59, 0x30, 0x31,
+    0x84, 0x15, 0x77, 0x30, 0x0A, 0xB6, 0x5D, 0xD9, 0x3A, 0x47, 0xD2, 0x9D, 0xA9, 0x57, 0x6F, 0x1D,
+    0x3E, 0x47, 0x82, 0xAD, 0x80, 0x4C, 0x11, 0x64, 0x4A, 0xA5, 0x28, 0xAE, 0xD3, 0x52, 0x13, 0x23,
+    0xEF, 0x74, 0x9D, 0x05, 0xBD, 0xCA, 0x9D, 0xAF, 0x69, 0x55, 0xE8, 0x96, 0xDB, 0x35, 0x52, 0x75,
+    0x0D, 0x7A, 0x19, 0x3E, 0xE9, 0x11, 0xF1, 0x84, 0x5E, 0xB5, 0x1F, 0xD8, 0xF4, 0xA3, 0x25, 0x2A,
+    0x7F, 0xAF, 0x44, 0xD0, 0xAC, 0x7F, 0x9C, 0x87, 0xB1, 0x11, 0x48, 0x69, 0x9F, 0x3C, 0x60, 0xC4,
+    0x38, 0x40, 0xBF, 0x43, 0xA2, 0xE4, 0x37, 0xC3, 0x7E, 0xB1, 0x51, 0x82, 0x93, 0xFE, 0x7F, 0xD1,
+    0x30, 0xD8, 0xBF, 0xD8, 0x6D, 0x7A, 0xE8, 0x38, 0xFA, 0xE5, 0x4B, 0x42, 0x2C, 0x24, 0xF3, 0xA1,
+    0x7D, 0xE3, 0xE7, 0x9A, 0x6B, 0x53, 0x3C, 0xAC, 0x00, 0x6A, 0xB5, 0xF9, 0x10, 0xD5, 0x3D, 0x11,
+    0xE4, 0x1D, 0x51, 0xA2, 0x40, 0xC4, 0x48, 0xDC, 0x1C, 0x30, 0xA8, 0x1F, 0x89, 0xE2, 0x53, 0x25,
+    0xF2, 0xDA, 0xE3, 0xA4, 0xD6, 0xBB, 0x72, 0x5A, 0x0F, 0x3F, 0x98, 0xE4, 0x27, 0xF2, 0xC6, 0x82,
+    0x5B, 0x64, 0x8A, 0x3D, 0x29, 0x9A, 0xBF, 0x6A, 0x0D, 0x61, 0xA1, 0xCF, 0x4F, 0x00, 0xE0, 0xE2,
+    0x9A, 0x45, 0xF7, 0xDB, 0x38, 0x0D, 0x38, 0x7C, 0x98, 0x20, 0xB6, 0xA8, 0x00, 0xFE, 0xB5, 0xCD,
+    0xBB, 0xC2, 0x8A, 0xDF, 0xA3, 0x23, 0x87, 0x77, 0x7F, 0x33, 0x36, 0xB2, 0xC3, 0x90, 0xAA, 0x49,
+    0x92, 0x71, 0xEB, 0xFE, 0xCD, 0x32, 0xD1, 0xAB, 0x22, 0xB3, 0xC6, 0x4B, 0x12, 0x7E, 0x53, 0xAA,
+    0xCF, 0xC7, 0x01, 0xDA, 0x38, 0x2A, 0x0A, 0x54, 0xFC, 0x88, 0x41, 0x15, 0x04, 0x27, 0x02, 0x8C,
+    0x0F, 0x6D, 0xC2, 0xCF, 0xDA, 0xF8, 0x3C, 0xF7, 0x58, 0xE2, 0x70, 0x1A, 0x7E, 0xBE, 0x39, 0xEE,
+    0xC2, 0x7A, 0xD5, 0x52, 0x4B, 0x62, 0x84, 0xDE, 0x91, 0x46, 0xDC, 0x3A, 0x67, 0x4A, 0xE6, 0x4D,
+    0x82, 0xFA, 0x60, 0xE2, 0x34, 0x26, 0x1A, 0xD8, 0x0D, 0xA1, 0x57, 0x62, 0x04, 0x38, 0x52, 0x4D,
+    0xA6, 0x8B, 0xC2, 0x0E, 0xCE, 0x26, 0x28, 0x31, 0x53, 0xC6, 0x63, 0x5A, 0x75, 0x45, 0x65, 0xDA,
+    0x4B, 0x8D, 0x77, 0xB0, 0x06, 0x28, 0x36, 0x43, 0x1D, 0xA3, 0xC7, 0x33, 0x28, 0x8D, 0x70, 0xB5,
+    0x0D, 0x24, 0x25, 0x50, 0xA2, 0xEB, 0x50, 0x61, 0x98, 0x3D, 0x8C, 0xCD, 0xDC, 0x17, 0x3F, 0xE4,
+    0xDD, 0x46, 0x3A, 0xD0, 0xA6, 0x78, 0xD7, 0x85, 0x63, 0xC8, 0x3A, 0x54, 0xDB, 0xD5, 0xB9, 0x7C,
+    0x4B, 0xFD, 0x1E, 0xA2, 0xBD, 0x97, 0x22, 0x09, 0x06, 0x8F, 0xA5, 0x49, 0x06, 0x29, 0x71, 0x13,
+    0x69, 0xCE, 0xEC, 0x75, 0xE9, 0x93, 0x58, 0x80, 0x05, 0xFF, 0xBF, 0x1D, 0x48, 0xCE, 0x34, 0xDC,
+    0x03, 0x40, 0xB9, 0x6F, 0x40, 0x94, 0x2C, 0x30, 0xD0, 0x6F, 0x35, 0xC0, 0x46, 0xE5, 0xD1, 0xFF,
+    0x44, 0x83, 0x2C, 0x6D, 0x6C, 0xB2, 0x04, 0xD8, 0xB0, 0x1E, 0x2C, 0xF8, 0x71, 0xA4, 0xA1, 0x60,
+    0x23, 0x8F, 0x19, 0xF7, 0x58, 0x29, 0x42, 0x9F, 0x24, 0x18, 0x2B, 0xD3, 0xF0, 0x31, 0x45, 0xB1,
+    0xA3, 0x5E, 0xA1, 0xC9, 0x52, 0xEE, 0xE6, 0xF5, 0x0A, 0xBB, 0xEB, 0x6B, 0x09, 0xE9, 0xA7, 0x84,
+    0xB6, 0x1C, 0xE3, 0xA3, 0x0B, 0x7E, 0x8A, 0x0B, 0xD0, 0x4C, 0xE9, 0x50, 0x45, 0x34, 0x21, 0x1B,
+    0x55, 0x0E, 0x12, 0x1A, 0x74, 0xDE, 0x28, 0xEB, 0x20, 0x66, 0x13, 0xBB, 0xEA, 0xC7, 0xDA, 0xCF,
+    0xB4, 0x16, 0x57, 0x65, 0x0A, 0xAD, 0x98, 0xF7, 0x03, 0x1E, 0xF5, 0xD9, 0xFC, 0x3E, 0x59, 0xEC,
+    0x7A, 0x2B, 0x46, 0xC0, 0x13, 0x19, 0xD8, 0xFD, 0xF7, 0x0D, 0x61, 0xFC, 0x41, 0x2A, 0x5C, 0xC7,
+    0x84, 0x95, 0xEF, 0x31, 0x9F, 0x1F, 0x84, 0x53, 0x7E, 0xA8, 0x37, 0x04, 0x1D, 0x1D, 0x08, 0xD5,
+    0xE5, 0x4B, 0x0C, 0x06, 0xCC, 0x14, 0x19, 0xA9, 0x4D, 0x75, 0x06, 0x49, 0x48, 0xC9, 0xDB, 0x3F,
+    0x1B, 0xB1, 0x0D, 0x19, 0x71, 0xEB, 0x13, 0xE1, 0x26, 0xAF, 0xC0, 0xD9, 0x87, 0xC3, 0xD8, 0x68,
+    0x8A, 0x3C, 0x96, 0x6B, 0xDE, 0x94, 0x3D, 0x60, 0x0B, 0x24, 0x8F, 0x0C, 0xE1, 0xA3, 0xA7, 0x05,
+    0x40, 0xB7, 0x24, 0x35, 0x82, 0x45, 0xA0, 0xE0, 0x26, 0xD2, 0xFA, 0xAB, 0x59, 0x33, 0x4E, 0x95,
+    0xD2, 0xFA, 0x72, 0x82, 0x2C, 0x00, 0x2F, 0xE0, 0xE5, 0x49, 0x16, 0x30, 0x0C, 0x3A, 0xC1, 0xDC,
+    0x11, 0x70, 0x59, 0xF9, 0x98, 0x81, 0xBB, 0x9F, 0x60, 0xEB, 0xB0, 0xAD, 0x5B, 0x65, 0x7A, 0xC4,
+    0x3E, 0xE7, 0x6A, 0x3D, 0xD2, 0x7D, 0x02, 0xD3, 0xA8, 0x98, 0xE5, 0xF1, 0xF5, 0xE1, 0xCF, 0xFA,
+    0x71, 0x50, 0xAA, 0x8A, 0xB1, 0x43, 0xDC, 0x3A, 0x0E, 0xC2, 0x77, 0xF3, 0x95, 0x39, 0x82, 0x1D,
+    0x4D, 0x88, 0xFD, 0xA6, 0x55, 0x02, 0x5C, 0x80, 0x1E, 0x84, 0x91, 0x5C, 0x7D, 0x63, 0x36, 0x42,
+    0x68, 0xA8, 0x15, 0x72, 0x40, 0xC0, 0xF5, 0x52, 0xC8, 0x9B, 0xB8, 0xAD, 0x00, 0xCB, 0x4B, 0x0A,
+    0x87, 0x54, 0x96, 0x48, 0x47, 0x7D, 0x39, 0xCA, 0x1D, 0xF0, 0x83, 0x63, 0x9A, 0x7F, 0xE9, 0xB5,
+    0x5A, 0x11, 0x2F, 0x94, 0x30, 0x9F, 0x1D, 0xD6, 0xD5, 0x98, 0xCB, 0x80, 0x7B, 0x82, 0x2B, 0xC0,
+    0xA0, 0x73, 0xBD, 0x17, 0x33, 0xE4, 0x3B, 0xE0, 0xE5, 0x20, 0x59, 0xE6, 0x94, 0xF8, 0xD5, 0x41,
+    0x21, 0x2D, 0xAD, 0xF0, 0x10, 0x08, 0x79, 0x60, 0x2F, 0x7E, 0x26, 0x82, 0xE8, 0xA2, 0x41, 0x79,
+    0xE7, 0xF6, 0x06, 0xC0, 0xB2, 0x59, 0xF9, 0x5B, 0x1B, 0x20, 0x12, 0xA0, 0xF5, 0xD8, 0x0F, 0x1F,
+    0xA6, 0x96, 0x0A, 0x69, 0x3B, 0x2B, 0xD1, 0x95, 0x18, 0x7F, 0xA4, 0x1B, 0x4B, 0xE4, 0x82, 0xDA,
+    0x50, 0x41, 0xA6, 0x30, 0x0D, 0xC0, 0x68, 0xEC, 0xA9, 0x43, 0x2E, 0x17, 0x13, 0x0B, 0x21, 0x00,
+    0x42, 0xF5, 0xCE, 0x2F, 0x10, 0x81, 0x3D, 0x6F, 0xDB, 0xDE, 0x81, 0xD1, 0x10, 0xDE, 0x4E, 0x02,
+    0x98, 0x85, 0x29, 0x81, 0x59, 0xC4, 0x24, 0x82, 0x25, 0xF0, 0x3D, 0x93, 0xB3, 0x08, 0xC9, 0xC5,
+    0x3D, 0xA1, 0x97, 0xAE, 0x2D, 0xE3, 0x93, 0xAC, 0xBB, 0xB2, 0x06, 0xC6, 0x54, 0x58, 0x1C, 0x9A,
+    0x37, 0x6B, 0xDE, 0xEA, 0x63, 0xDE, 0x3F, 0x07, 0x76, 0xFF, 0x8E, 0x41, 0x4D, 0x2E, 0x04, 0x54,
+    0x7D, 0xDF, 0x7F, 0x26, 0x6A, 0xD2, 0x5D, 0xBB, 0x19, 0x5F, 0x2B, 0x09, 0xF4, 0x15, 0x7D, 0x5E,
+    0xB5, 0x48, 0xEE, 0xF1, 0x17, 0xC0, 0x32, 0xE6, 0x14, 0x2C, 0x2D, 0xF3, 0xDD, 0xDA, 0xFD, 0xC5,
+    0x2D, 0x05, 0xB3, 0x7D, 0x69, 0x42, 0xF4, 0x4F, 0xDC, 0xEE, 0x27, 0x6C, 0x10, 0x59, 0xCB, 0x63,
+    0xF6, 0xE9, 0xC2, 0x3B, 0x8A, 0xD0, 0xA8, 0x10, 0x70, 0xF1, 0x35, 0x2B, 0x3D, 0x8E, 0xAE, 0xBD,
+    0xD3, 0xB7, 0xE2, 0x9E, 0x3A, 0xD7, 0xBD, 0xF5, 0x38, 0x32, 0x90, 0x4F, 0xE2, 0x42, 0xB7, 0x73,
+    0xE0, 0xFE, 0x83, 0xEA, 0x25, 0x87, 0xFB, 0xB7, 0xE7, 0x31, 0x66, 0xEB, 0xAA, 0xCC, 0x40, 0x4F,
+    0x35, 0x18, 0x21, 0xFF, 0x31, 0x3C, 0x61, 0x8C, 0xEC, 0xB4, 0x20, 0xD0, 0xFE, 0x1C, 0x81, 0x53,
+    0xB0, 0x6F, 0x76, 0xF7, 0x0F, 0x7F, 0x51, 0x51, 0x40, 0xAE, 0x35, 0x84, 0x84, 0xA9, 0x35, 0x9C,
+    0xC0, 0x3C, 0x0D, 0x7E, 0x73, 0x5B, 0xA7, 0xE6, 0x28, 0x62, 0x6C, 0x53, 0x68, 0x2D, 0x72, 0xA1,
+    0x0F, 0x63, 0xCB, 0x79, 0x79, 0xE5, 0xA5, 0x24, 0xCF, 0x6A, 0x60, 0x6C, 0x0E, 0xF3, 0x52, 0x5B,
+    0xDF, 0xA4, 0x26, 0x7C, 0xC2, 0xF3, 0xD1, 0x20, 0x8A, 0x8C, 0x80, 0x04, 0x77, 0xCE, 0x0C, 0xE0,
+    0xA3, 0x8C, 0xE5, 0xC2, 0xDE, 0x60, 0xC1, 0x35, 0x18, 0xA8, 0x94, 0xCF, 0xEA, 0x81, 0xD8, 0xE9,
+    0x22, 0x93, 0xDB, 0x7A, 0xAA, 0x51, 0xAD, 0xE5, 0x44, 0x6B, 0x31, 0xFF, 0x04, 0xE1, 0xB6, 0xE3,
+    0x55, 0xFA, 0xEF, 0x17, 0xE7, 0x94, 0x37, 0xDF, 0x89, 0xD5, 0x29, 0x07, 0x96, 0xC7, 0x76, 0xE5,
+    0x21, 0xD7, 0xE2, 0xB3, 0xA4, 0x77, 0x6F, 0xE4, 0x1E, 0xAD, 0x03, 0x64, 0xF5, 0x38, 0x33, 0xC5,
+    0x74, 0x2E, 0xA1, 0xF1, 0xBB, 0xAF, 0x1B, 0x24, 0x8B, 0xEE, 0x46, 0x86, 0x25, 0xAD, 0x95, 0x5E,
+    0x28, 0x1F, 0xE9, 0x2C, 0xCD, 0xC9, 0x85, 0xFC, 0x5B, 0x74, 0x3F, 0xF3, 0xF9, 0x2B, 0x5C, 0x23,
+    0x5C, 0xD0, 0xBA, 0xBA, 0x7E, 0x8C, 0xA0, 0xA9, 0x56, 0xA0, 0x55, 0xA5, 0x36, 0x7D, 0xB8, 0x8B,
+    0xA6, 0x46, 0x62, 0x1C, 0x1E, 0x7E, 0x7C, 0xE3, 0xC3, 0xEA, 0x33, 0x8E, 0x28, 0x9A, 0xA8, 0xB6,
+    0x8E, 0xC3, 0xA4, 0x0F, 0x4A, 0x23, 0xFF, 0x6F, 0x3B, 0x2A, 0xBE, 0x65, 0x97, 0x10, 0x30, 0x12,
+    0xC0, 0xA6, 0x3A, 0x34, 0xE3, 0x6C, 0xA8, 0x11, 0xED, 0x78, 0x60, 0xE2, 0xAE, 0xC8, 0x2E, 0xE3,
+    0xEA, 0xB9, 0x3E, 0xAB, 0xBD, 0x15, 0x49, 0x9C, 0x75, 0xD7, 0x49, 0xE3, 0x5C, 0xE9, 0xA2, 0x8A,
+    0x0C, 0xBE, 0x74, 0x81, 0x1D, 0xE0, 0xCA, 0x12, 0x3E, 0x8A, 0x23, 0xF2, 0x7B, 0x5D, 0xF0, 0xF7,
+    0x0E, 0x1B, 0x73, 0xF6, 0x5E, 0x8C, 0xE0, 0x8E, 0x57, 0xD5, 0x01, 0x56, 0x5E, 0x3B, 0x7C, 0xC8,
+    0xF7, 0xE4, 0x61, 0x70, 0x5D, 0x4F, 0xC3, 0x01, 0x26, 0x2A, 0x71, 0x26, 0x50, 0x9B, 0x65, 0xA1,
+    0x49, 0xBE, 0x50, 0x4C, 0x44, 0x3C, 0x5B, 0x09, 0x3B, 0x39, 0x32, 0x34, 0x82, 0x3B, 0xBF, 0x74,
+    0x6B, 0x37, 0x59, 0xF4, 0x13, 0x21, 0x30, 0x86, 0x6D, 0x94, 0xDE, 0x2F, 0x5F, 0x69, 0x07, 0x32,
+    0xFF, 0x14, 0x88, 0x46, 0xA4, 0xB1, 0x9E, 0x69, 0x5A, 0xB7, 0x91, 0x41, 0x2A, 0x62, 0x3C, 0x81,
+    0xE1, 0x4A, 0x47, 0x9D, 0x61, 0xB2, 0x46, 0x2D, 0x04, 0x3F, 0xD9, 0x57, 0xF2, 0xAB, 0xC9, 0x4F,
+    0xB3, 0xCE, 0x11, 0x2A, 0x77, 0x76, 0x49, 0x1B, 0x7E, 0x1D, 0xB7, 0xB3, 0x1D, 0xB7, 0x84, 0x5A,
+    0xC5, 0xCC, 0x1F, 0x9C, 0x82, 0x6D, 0xE0, 0x62, 0x03, 0xEE, 0xA9, 0x9A, 0x05, 0x26, 0x0A, 0xEB,
+    0x0D, 0x55, 0x01, 0x59, 0x71, 0x10, 0xB9, 0x53, 0x20, 0x65, 0x7B, 0x42, 0x90, 0x37, 0x36, 0x5A,
+    0xC2, 0xBA, 0x91, 0x20, 0xE0, 0x89, 0xA9, 0x65, 0x2D, 0x67, 0x83, 0x5D, 0x5A, 0xB9, 0x6B, 0x27,
+    0x13, 0x51, 0xA8, 0x00, 0x9E, 0x98, 0xE9, 0x62, 0xD1, 0x55, 0x7D, 0x37, 0x1E, 0xB5, 0xA3, 0x17,
+    0x9B, 0x45, 0xD8, 0x60, 0x02, 0xAC, 0xFC, 0x2B, 0xA9, 0xAC, 0x66, 0x79, 0xF9, 0x0C, 0xBC, 0xD4,
+    0x50, 0x15, 0x8B, 0x48, 0xB1, 0x6A, 0xB4, 0xED, 0xB7, 0xFE, 0xE8, 0x9E, 0x3B, 0xE3, 0x1C, 0xA5,
+    0x21, 0x15, 0x06, 0x66, 0x2F, 0xBB, 0x05, 0x33, 0xE4, 0x5A, 0x17, 0x5D, 0xF7, 0xB9, 0x2F, 0x3A,
+    0x2B, 0x83, 0xFF, 0xAC, 0xB6, 0x65, 0x92, 0xEF, 0x6E, 0x1C, 0x8A, 0x6C, 0x72, 0x52, 0x32, 0xA6,
+    0x5A, 0x16, 0x75, 0xEE, 0xA9, 0x95, 0x84, 0x33, 0x34, 0x5E, 0x71, 0x66, 0x40, 0xB9, 0xFF, 0x8B,
+    0xD5, 0x50, 0x81, 0xAF, 0x27, 0xC8, 0x58, 0xEE, 0x0D, 0xE7, 0x6D, 0xEB, 0x24, 0xA2, 0x3F, 0xDA,
+    0x1A, 0xD4, 0xBE, 0x3B, 0x02, 0x7B, 0x1C, 0x5A, 0xAF, 0x1D, 0xE3, 0x4B, 0x9F, 0xBC, 0x78, 0x5B,
+    0x0B, 0x91, 0x73, 0x78, 0x64, 0xD9, 0x77, 0xC7, 0x6E, 0x4B, 0x94, 0x5F, 0xE9, 0x8D, 0x8F, 0x49,
+    0xDC, 0x48, 0xEE, 0x58, 0x86, 0x04, 0x63, 0xEB, 0x0D, 0x39, 0x31, 0x81, 0xB4, 0xA8, 0x16, 0xB3,
+    0x7F, 0x60, 0x7F, 0x94, 0xEE, 0x06, 0x53, 0x38, 0x10, 0x0F, 0x93, 0x7F, 0x12, 0x1F, 0x76, 0x28,
+    0xA7, 0x3E, 0x46, 0x10, 0x8C, 0x28, 0x53, 0xCF, 0x9F, 0x83, 0x7F, 0x0C, 0xD8, 0xD6, 0x52, 0xF3,
+    0xE8, 0xD2, 0x21, 0xA6, 0x4A, 0xEE, 0x8B, 0xF7, 0x5B, 0x19, 0x90, 0x6D, 0x35, 0x83, 0xAF, 0x3F,
+    0x49, 0x71, 0xB1, 0x3E, 0xD1, 0x98, 0x60, 0x77, 0x05, 0x36, 0xA5, 0xFF, 0x82, 0x37, 0x14, 0x49,
+    0x62, 0x98, 0xB3, 0x05, 0xF5, 0xAC, 0xE2, 0xCC, 0x47, 0x09, 0x94, 0x8A, 0x59, 0x00, 0x23, 0xF4,
+    0x6D, 0x08, 0xE2, 0xAD, 0x7A, 0xF0, 0xCC, 0x97, 0x68, 0xF7, 0x21, 0x5C, 0x43, 0xD4, 0x1F, 0x16,
+    0x1A, 0xC6, 0x65, 0xFE, 0x96, 0xB4, 0x7C, 0x2C, 0x79, 0x9E, 0xEC, 0xD4, 0x96, 0xAF, 0x0E, 0x35,
+    0x24, 0x06, 0x03, 0x8E, 0x9A, 0x4E, 0xA5, 0xA7, 0xCD, 0x35, 0x32, 0xD2, 0x30, 0x15, 0xAC, 0xED,
+    0xDF, 0xF1, 0x83, 0x39, 0x17, 0xBB, 0x9B, 0x90, 0xED, 0xFB, 0x64, 0xE9, 0x55, 0x09, 0x49, 0x86,
+    0x7A, 0x9A, 0x43, 0x13, 0xB1, 0xD2, 0xC7, 0xC7, 0xC6, 0xA1, 0x99, 0xC8, 0x51, 0x4A, 0x5F, 0x9D,
+    0x6F, 0xA6, 0xCD, 0x97, 0x30, 0xE9, 0x55, 0x0B, 0x6F, 0x0F, 0x4A, 0x43, 0x6E, 0x71, 0xE6, 0xCF,
+    0x3A, 0x7C, 0xC9, 0x78, 0x70, 0xFE, 0xBD, 0x0A, 0x00, 0xEC, 0xA6, 0x7F, 0x83, 0xFA, 0xBE, 0xD4,
+    0xDF, 0xB0, 0x86, 0x41, 0x12, 0x53, 0x1B, 0x4F, 0x7C, 0x1E, 0x60, 0x2A, 0xC1, 0x20, 0x7A, 0x00,
+    0xED, 0x6C, 0x66, 0x23, 0x1F, 0x79, 0xC3, 0x3E, 0x01, 0x74, 0xA7, 0x60, 0x7D, 0x1F, 0x29, 0x93,
+    0x03, 0xF0, 0x64, 0xF6, 0x6F, 0x56, 0x8E, 0x75, 0x57, 0x25, 0x70, 0xDC, 0xD2, 0xD2, 0x28, 0x37,
+    0xA8, 0x05, 0x9B, 0xB0, 0xAD, 0x1A, 0x2D, 0x86, 0xA9, 0x50, 0xB8, 0xE3, 0xF6, 0xA2, 0x3E, 0x17,
+    0x5B, 0x78, 0x65, 0xC0, 0x61, 0x95, 0x0E, 0x27, 0x39, 0x72, 0x6A, 0x9E, 0xCB, 0x8E, 0xAD, 0xEC,
+    0x0C, 0xFC, 0xDB, 0x9A, 0x9A, 0x12, 0x31, 0x16, 0x68, 0x4F, 0x83, 0x79, 0x11, 0x3D, 0x75, 0xED,
+    0x2D, 0xEA, 0x92, 0x8E, 0xDE, 0xAC, 0x07, 0x55, 0xF1, 0xE4, 0x30, 0x6C, 0xFC, 0x5C, 0x88, 0x1F,
+    0x77, 0x94, 0xC8, 0x87, 0x73, 0xB2, 0xB6, 0x9F, 0x2A, 0x05, 0x71, 0xDE, 0x8E, 0xF2, 0xEB, 0x3A,
+    0xDB, 0xBE, 0x46, 0xFA, 0x11, 0xA1, 0xCA, 0x1A, 0xB3, 0x65, 0xAC, 0x42, 0x85, 0xD5, 0x0B, 0x23,
+    0x57, 0xA5, 0x53, 0xE9, 0x58, 0x30, 0xE0, 0xF9, 0x23, 0xF0, 0x75, 0x2A, 0xF5, 0x2B, 0x9A, 0x25,
+    0x96, 0xD7, 0x1E, 0x71, 0x31, 0xC7, 0xA7, 0xB0, 0x6B, 0x3F, 0x26, 0xF8, 0x8D, 0xF9, 0x1E, 0x15,
+    0x83, 0xB8, 0xFF, 0xC6, 0xAA, 0xA6, 0x42, 0xAC, 0x90, 0x82, 0xA2, 0x50, 0x7F, 0x1F, 0xC3, 0x99,
+    0xDC, 0x27, 0xD7, 0xAA, 0x65, 0x13, 0x08, 0xA2, 0x66, 0x51, 0x7D, 0xC7, 0x7E, 0xAE, 0x1A, 0x33,
+    0x2B, 0x72, 0xF3, 0xF4, 0x25, 0xD9, 0xEE, 0xF1, 0x07, 0x0F, 0xC3, 0x87, 0xDF, 0x2B, 0x0C, 0xC8,
+    0x4D, 0x2E, 0xEB, 0xA3, 0x93, 0xB2, 0xBB, 0xAA, 0x61, 0xE1, 0x71, 0x0D, 0x53, 0xE2, 0xF5, 0x7E,
+    0xF7, 0x08, 0x06, 0xAD, 0x3E, 0xE7, 0xA6, 0xB9, 0x3B, 0xC9, 0x68, 0x5D, 0xB8, 0x7D, 0xC1, 0x31,
+    0x9B, 0x70, 0xC2, 0x2B, 0x57, 0x26, 0x54, 0x67, 0x3D, 0x14, 0x26, 0xCF, 0xB0, 0xEC, 0xD6, 0x00,
+    0xE3, 0x3F, 0x26, 0xCA, 0xEF, 0xB8, 0x1A, 0xFD, 0xE4, 0x06, 0xE9, 0x41, 0xF2, 0xAD, 0x2E, 0x16,
+    0x11, 0x0A, 0x98, 0x4B, 0x01, 0x67, 0x76, 0x99, 0xAE, 0x58, 0xF4, 0xAD, 0xC2, 0xC8, 0x56, 0x26,
+    0x50, 0xB2, 0x77, 0x4B, 0x32, 0x71, 0x16, 0x13, 0xC7, 0xAE, 0xE3, 0xDE, 0x1C, 0x6D, 0x54, 0x4C,
+    0x89, 0xA4, 0x81, 0x18, 0x53, 0xC3, 0x01, 0xCD, 0xCF, 0x85, 0xFB, 0x3A, 0x97, 0xD5, 0x25, 0x56,
+    0x39, 0x89, 0xEF, 0x52, 0xBB, 0x02, 0xC8, 0x23, 0xDD, 0x04, 0x36, 0x85, 0xA2, 0x33, 0xE4, 0x4F,
+    0x41, 0xC8, 0xE9, 0x8B, 0xCE, 0xD5, 0xB0, 0xDB, 0xF3, 0xB4, 0xC3, 0x7C, 0x70, 0x29, 0x0F, 0xB6,
+    0x3C, 0xB1, 0xD3, 0x0C, 0xD5, 0x06, 0x56, 0x2E, 0x57, 0xD1, 0x90, 0xAB, 0x5D, 0xE8, 0xE6, 0xD6,
+    0x94, 0x58, 0xE2, 0xA8, 0x92, 0x42, 0xF8, 0xD4, 0xD7, 0x2F, 0x1F, 0x16, 0x92, 0x0C, 0xD5, 0x8E,
+    0x69, 0x98, 0xA9, 0x48, 0xA1, 0x6E, 0x94, 0x8C, 0x66, 0x30, 0xA3, 0x52, 0x50, 0x7A, 0x29, 0x96,
+    0xB0, 0x2B, 0x16, 0x3E, 0x2C, 0x56, 0xA4, 0x9F, 0x85, 0x96, 0x56, 0x25, 0x98, 0x56, 0xAA, 0xFB,
+    0xEE, 0x4A, 0x31, 0xD9, 0xD7, 0xB3, 0x37, 0xE4, 0x1D, 0x49, 0x3D, 0xA7, 0xF7, 0x93, 0x31, 0x6D,
+    0x99, 0x24, 0xE5, 0x30, 0x8F, 0xB4, 0x89, 0x56, 0x1F, 0xB7, 0x09, 0x4F, 0x71, 0xDB, 0x4D, 0x02,
+    0x40, 0x7B, 0xEA, 0x75, 0x38, 0x2C, 0xCD, 0xE2, 0x9F, 0x60, 0xC8, 0x4A, 0x84, 0x2F, 0x9D, 0xFF,
+    0x75, 0xED, 0x32, 0xBA, 0xB7, 0xF4, 0xC8, 0x0E, 0xCF, 0xC5, 0x31, 0x8A, 0xA0, 0xF7, 0xC9, 0x07,
+    0x54, 0x44, 0x90, 0xC1, 0x1C, 0x46, 0x49, 0xEE, 0x33, 0x0E, 0xB4, 0x87, 0x4B, 0x9E, 0x3C, 0xF0,
+    0xAD, 0x0B, 0xA5, 0xA4, 0x28, 0x43, 0xE6, 0x34, 0xD3, 0xD0, 0xF4, 0x88, 0x1E, 0xDE, 0x6E, 0x50,
+    0x81, 0x0E, 0x24, 0xE5, 0x87, 0xA4, 0xAB, 0x67, 0xD1, 0x91, 0xD2, 0xB8, 0x57, 0xA6, 0x86, 0x4A,
+    0x47, 0x45, 0x39, 0x6B, 0x1E, 0x2B, 0xCF, 0xCD, 0xE2, 0x1B, 0xBF, 0x75, 0xC2, 0xD4, 0x5A, 0x68,
+    0x8F, 0xC6, 0xDC, 0x64, 0xBB, 0xBE, 0x71, 0x38, 0x9D, 0x4B, 0xBE, 0x4E, 0xF6, 0x2D, 0xAC, 0x5D,
+    0x23, 0x6B, 0xC3, 0x96, 0x51, 0x4D, 0x10, 0x70, 0x83, 0xCA, 0x69, 0x91, 0x52, 0x3E, 0x46, 0x03,
+    0x93, 0xC3, 0xE0, 0x10, 0xDF, 0x24, 0x7F, 0x9B, 0x86, 0xD6, 0x5B, 0x95, 0xD4, 0xCF, 0xED, 0x14,
+    0xCD, 0x53, 0x82, 0x97, 0x6C, 0x81, 0x9C, 0x3F, 0x6B, 0xFA, 0x9B, 0x44, 0x1B, 0x29, 0xCA, 0x66,
+    0xD9, 0x22, 0xB1, 0xDE, 0xFE, 0x3A, 0xE2, 0x0C, 0xD5, 0x62, 0xDB, 0x00, 0x12, 0x59, 0x74, 0xE6,
+    0x8C, 0x22, 0x7B, 0x11, 0x7F, 0x59, 0xB3, 0x0A, 0x2C, 0x76, 0x5F, 0x71, 0x31, 0xA2, 0xD8, 0x42,
+    0x28, 0xF3, 0x24, 0xC5, 0xF6, 0x85, 0x60, 0x32, 0xC1, 0x91, 0xD7, 0x95, 0x61, 0x70, 0x51, 0x9A,
+    0x4E, 0x62, 0x8A, 0xCF, 0xBD, 0x98, 0x00, 0xA0, 0x12, 0xB5, 0xB6, 0x90, 0xC7, 0x6E, 0xC3, 0x4A,
+    0x8E, 0x2F, 0x50, 0xAD, 0xC0, 0x26, 0x12, 0xF4, 0x68, 0x1D, 0x51, 0x72, 0x14, 0x06, 0xB7, 0x7A,
+    0xCA, 0x37, 0x8F, 0x39, 0x01, 0x76, 0xE5, 0xE4, 0xF1, 0xCA, 0xDA, 0x6A, 0x6B, 0x7C, 0x7D, 0xD9,
+    0xA9, 0x39, 0xBB, 0x50, 0x79, 0x02, 0xD6, 0xA1, 0x12, 0xE7, 0xE6, 0x9A, 0x1B, 0xF4, 0x89, 0x48,
+    0x29, 0x88, 0xA7, 0xC8, 0xE9, 0xEF, 0xB1, 0x28, 0x18, 0x22, 0x4B, 0x6A, 0x96, 0xAF, 0x06, 0x3B,
+    0xE0, 0x8E, 0x9B, 0x2C, 0xC1, 0x7B, 0xD9, 0x87, 0x72, 0xA5, 0xC8, 0xFE, 0x30, 0x9C, 0x24, 0x79,
+    0xAD, 0x04, 0xBB, 0x38, 0xA9, 0xB8, 0x29, 0x01, 0x41, 0xC3, 0x40, 0xD9, 0xE6, 0xE4, 0xD3, 0x97,
+    0xE2, 0x42, 0xBF, 0x79, 0x59, 0x7B, 0xAF, 0x31, 0x0C, 0xF3, 0xD1, 0x72, 0xA4, 0x9D, 0x36, 0xD9,
+    0xDB, 0x0C, 0x0F, 0xCC, 0x3A, 0x8C, 0xAF, 0x71, 0xB7, 0x46, 0x2F, 0x26, 0x7D, 0x1E, 0x25, 0xC9,
+    0x8E, 0xA3, 0x9B, 0xCF, 0x7F, 0xC4, 0x96, 0xB6, 0xC7, 0x05, 0x62, 0x08, 0x49, 0x3C, 0xFC, 0x24,
+    0xAA, 0x16, 0xEB, 0x3C, 0xE6, 0x04, 0x57, 0xD1, 0xA3, 0x81, 0x6E, 0xD4, 0x64, 0xF5, 0xC6, 0x24,
+    0x06, 0x9E, 0xA4, 0x76, 0x3E, 0x62, 0x31, 0x54, 0xC8, 0xC7, 0xAA, 0x31, 0xC6, 0xF0, 0x71, 0x1B,
+    0xE7, 0x08, 0xFF, 0x3A, 0x7A, 0xD3, 0x51, 0x5A, 0xE8, 0xA6, 0xD4, 0xAA, 0x6E, 0x20, 0x37, 0x28,
+    0x0D, 0x0A, 0xCC, 0x25, 0x6C, 0x1E, 0x76, 0x8C, 0xC5, 0xCA, 0xDA, 0x6C, 0x24, 0x17, 0xD4, 0xB0,
+    0x45, 0x3E, 0xD7, 0x25, 0xB8, 0x03, 0xED, 0xA2, 0xDA, 0x82, 0x08, 0x8F, 0x10, 0x3F, 0x13, 0x43,
+    0x07, 0x3F, 0x8C, 0xF9, 0xE5, 0xD5, 0xB0, 0x35, 0x01, 0x13, 0x61, 0x38, 0x97, 0xCA, 0xB4, 0xFE,
+    0x1B, 0x1F, 0x44, 0xEC, 0xFB, 0xAB, 0x07, 0xB6, 0x3F, 0x21, 0x80, 0x6A, 0x8D, 0xBA, 0x8A, 0x1D,
+    0xEA, 0xEF, 0xA0, 0xEB, 0xBC, 0x26, 0x37, 0x4F, 0xA6, 0x16, 0xF8, 0xA2, 0x90, 0x3E, 0xF7, 0x06,
+    0xD8, 0x4C, 0x21, 0x94, 0x2C, 0x5F, 0x49, 0x05, 0x12, 0xF8, 0xA8, 0xA5, 0x14, 0x40, 0xBE, 0x40,
+    0x01, 0xF5, 0x23, 0xE1, 0xEE, 0xF6, 0x5B, 0xC0, 0xE6, 0x76, 0xEF, 0x1D, 0x05, 0xA8, 0x77, 0xF2,
+    0x5D, 0x91, 0xBA, 0x62, 0xB8, 0xDD, 0xF0, 0xFC, 0x5B, 0xA9, 0xB2, 0x25, 0xDD, 0x0E, 0x08, 0xFA,
+    0xE8, 0x5C, 0xCA, 0x43, 0x0D, 0xD0, 0x65, 0x08, 0x23, 0xA7, 0x2A, 0x2C, 0xE6, 0x6F, 0xB6, 0x0A,
+    0xE7, 0xED, 0x86, 0x80, 0x50, 0x94, 0x58, 0x0D, 0x11, 0x57, 0xED, 0xB9, 0xD5, 0x7C, 0x33, 0xCD,
+    0x44, 0x9A, 0x17, 0xFB, 0x74, 0xF3, 0xB1, 0x2D, 0x9F, 0x38, 0x5E, 0x6A, 0x9A, 0xAE, 0x5F, 0x7B,
+    0xAD, 0x4F, 0x9C, 0x8E, 0x1E, 0x3A, 0x75, 0x4F, 0x30, 0xCF, 0xF7, 0x1C, 0x82, 0x34, 0xC6, 0x3E,
+    0xE7, 0x5B, 0x8B, 0x2C, 0xD8, 0xFE, 0xDB, 0x33, 0x27, 0xBB, 0x2E, 0x24, 0xB0, 0xDA, 0x74, 0xD3,
+    0x94, 0x85, 0x78, 0x36, 0x40, 0x2D, 0xEE, 0x40, 0x4A, 0xED, 0x00, 0x4C, 0xDB, 0xF9, 0x49, 0x2F,
+    0xEC, 0x03, 0x99, 0x63, 0xDD, 0x9E, 0xB7, 0xA3, 0x3B, 0xE1, 0xF2, 0x0E, 0x5D, 0x58, 0xD8, 0x33,
+    0xE9, 0xE4, 0x0A, 0xD2, 0x83, 0xA0, 0x3F, 0x80, 0x9A, 0x01, 0xC5, 0x8D, 0xF3, 0x14, 0xC8, 0x0F,
+    0xE4, 0xB8, 0xAD, 0xCD, 0x3E, 0x50, 0x43, 0x17, 0xC1, 0x58, 0x8D, 0x64, 0x03, 0xB1, 0xE5, 0x42,
+    0xC8, 0x34, 0x6A, 0xFB, 0x74, 0x18, 0xA0, 0xD9, 0x3D, 0x01, 0xD7, 0x2F, 0x51, 0x0F, 0xD8, 0x29,
+    0x74, 0xB1, 0xF8, 0x99, 0xCA, 0x74, 0xB2, 0xF1, 0xB6, 0x7B, 0x53, 0x10, 0xCE, 0x73, 0xF6, 0x32,
+    0x3F, 0x05, 0x6E, 0xC7, 0xAD, 0x27, 0x34, 0xD4, 0xB9, 0x1D, 0x34, 0x5D, 0xEC, 0x88, 0x46, 0x22,
+    0x90, 0x94, 0xAF, 0x1A, 0x51, 0x33, 0x10, 0xB7, 0xBF, 0xBE, 0x0A, 0xCD, 0x1E, 0xE8, 0x95, 0x78,
+    0x61, 0x17, 0x63, 0x8F, 0x3A, 0xE2, 0x30, 0x59, 0x3F, 0xBF, 0xD8, 0xA3, 0x85, 0xEF, 0x3D, 0x1D,
+    0xD2, 0x4F, 0x7B, 0xB3, 0xD7, 0x14, 0x91, 0x65, 0xC2, 0x3A, 0x66, 0xBC, 0xFF, 0xFD, 0xC2, 0x12,
+    0x4A, 0xAF, 0xC4, 0xCC, 0x78, 0x1F, 0xA1, 0xAB, 0x54, 0xB7, 0xDB, 0x3B, 0x07, 0x45, 0x09, 0x93,
+    0x45, 0x40, 0x2F, 0xA0, 0x68, 0x73, 0x54, 0x27, 0x96, 0xB4, 0x2E, 0x88, 0xC2, 0xF7, 0x98, 0x9E,
+    0xCA, 0xBF, 0xF4, 0xEC, 0x0A, 0xB6, 0x8F, 0x33, 0x08, 0x5C, 0x91, 0x1B, 0x9F, 0x55, 0xDF, 0xF9,
+    0x04, 0x5D, 0xF0, 0x3A, 0xE1, 0xFF, 0x93, 0x3A, 0xA7, 0xBB, 0x24, 0x75, 0xA3, 0x0D, 0x95, 0x7D,
+    0x66, 0x11, 0x4D, 0x0C, 0xCD, 0x8A, 0x98, 0xA3, 0xC4, 0x38, 0x88, 0x00, 0xD3, 0x7F, 0xA8, 0x7D,
+    0xE6, 0x14, 0xF0, 0xA5, 0xF2, 0x5E, 0xA0, 0xE2, 0xD4, 0x3E, 0xFA, 0x00, 0xD4, 0x5D, 0x01, 0x5D,
+    0x55, 0xF9, 0xA4, 0xC8, 0x49, 0x59, 0x16, 0xFA, 0xC5, 0x51, 0x15, 0xDC, 0xC3, 0x1E, 0xD5, 0xED,
+    0xE4, 0xBB, 0x14, 0xA0, 0xF3, 0x68, 0xD5, 0x60, 0xE0, 0x42, 0xB4, 0x30, 0x82, 0xD8, 0xD6, 0x3E,
+    0xEC, 0xE7, 0xAD, 0x3C, 0x69, 0x61, 0x28, 0x8E, 0x8C, 0x04, 0xF1, 0xA0, 0x1E, 0xBD, 0xDF, 0xBE,
+    0xFD, 0xAE, 0xD9, 0x65, 0x66, 0x33, 0x0F, 0xB0, 0x8D, 0xE9, 0x46, 0xFD, 0xD5, 0xF9, 0x20, 0x18,
+    0x7F, 0xF7, 0x20, 0x3F, 0xE2, 0x7A, 0x38, 0x14, 0xBB, 0x1A, 0xC3, 0xCA, 0xAB, 0x56, 0x5B, 0x17,
+    0x1B, 0x1A, 0xC3, 0x00, 0x97, 0x69, 0x9B, 0x5D, 0xBD, 0x4D, 0x22, 0x77, 0x36, 0x65, 0xD7, 0x04,
+    0x8F, 0x5B, 0x76, 0xB2, 0x6B, 0x23, 0x52, 0xA2, 0x02, 0xC4, 0x98, 0x16, 0xE3, 0xF7, 0x2B, 0xFC,
+    0x36, 0x94, 0x91, 0x0B, 0x0B, 0x82, 0x7F, 0xC6, 0x70, 0x8C, 0x80, 0x36, 0x48, 0x4F, 0x8C, 0x15,
+    0xB9, 0x06, 0x4C, 0x0B, 0x79, 0xA0, 0x37, 0x7D, 0x18, 0xBB, 0x83, 0x8C, 0xA6, 0xF0, 0x02, 0x7D,
+    0xAE, 0xD1, 0x8D, 0xF7, 0x11, 0x14, 0x69, 0x2D, 0xEE, 0x85, 0x47, 0x52, 0x44, 0x95, 0xD8, 0x8B,
+    0x91, 0x04, 0x1A, 0x0D, 0x0A, 0xE9, 0x61, 0x35, 0x14, 0xB7, 0x3D, 0x77, 0xD3, 0x7B, 0x97, 0xE2,
+    0x54, 0x37, 0xCD, 0x77, 0x49, 0x52, 0x2B, 0xF5, 0x0A, 0xA2, 0xCD, 0x9A, 0x51, 0x17, 0x7F, 0xD2,
+    0x9D, 0x65, 0x0F, 0x0F, 0x54, 0xEC, 0x00, 0x71, 0x89, 0x5B, 0xAC, 0x7C, 0x59, 0x55, 0xA3, 0xEA,
+    0x27, 0xF1, 0x47, 0x79, 0xF5, 0xDD, 0x0F, 0xD9, 0x14, 0xDB, 0x00, 0xE1, 0xA2, 0x4D, 0x92, 0xDA,
+    0x0B, 0xEF, 0x41, 0x29, 0x1E, 0xFB, 0x37, 0xAC, 0x08, 0x5D, 0xB7, 0x75, 0x7B, 0x63, 0xC9, 0x47,
+    0x0B, 0x13, 0x66, 0x39, 0xA1, 0x58, 0x82, 0xA3, 0x8D, 0x8B, 0xAF, 0xF9, 0x21, 0x84, 0xE1, 0xBD,
+    0x49, 0xD4, 0xF4, 0x43, 0x7F, 0x9A, 0xCF, 0x59, 0xF2, 0xA5, 0x2C, 0x4D, 0x85, 0xB5, 0xFD, 0x95,
+    0xE8, 0x45, 0xD2, 0xE8, 0x8A, 0xE4, 0xA9, 0x41, 0x6B, 0x99, 0xBE, 0x0D, 0xF1, 0xB2, 0x57, 0x61,
+    0x7B, 0x6D, 0x09, 0x53, 0x26, 0xCC, 0x28, 0x2C, 0x82, 0x08, 0xFB, 0xDC, 0xA9, 0x8A, 0xEC, 0x76,
+    0xE3, 0x4D, 0xDE, 0xAC, 0x3E, 0x54, 0xAC, 0xC7, 0x50, 0x92, 0x8A, 0x19, 0x3A, 0xF3, 0xFA, 0xF0,
+    0xC1, 0x7E, 0xEE, 0x69, 0x0E, 0xB5, 0x35, 0x9D, 0x93, 0x4B, 0xAE, 0xA9, 0x97, 0x09, 0x34, 0x9B,
+    0x8E, 0x3C, 0xB4, 0x2A, 0x1D, 0x59, 0xF9, 0x1C, 0x82, 0x25, 0x14, 0xCB, 0xC4, 0x89, 0xA5, 0xD5,
+    0x62, 0xD9, 0xC4, 0xD5, 0xFF, 0xF5, 0xFF, 0x9A, 0xA8, 0x05, 0x95, 0xE1, 0xAC, 0xAF, 0x61, 0x1B,
+    0x57, 0x77, 0xB0, 0x2C, 0x68, 0xE6, 0x3F, 0x1B, 0x63, 0xFF, 0xC3, 0x33, 0x04, 0x8A, 0x0B, 0x54,
+    0x7D, 0x36, 0xAE, 0xAE, 0x3F, 0xD3, 0xA6, 0x83, 0x65, 0xA4, 0xFE, 0x3C, 0x29, 0xDB, 0x81, 0x99,
+    0xF9, 0x7A, 0x9B, 0xBB, 0xA7, 0x86, 0x6B, 0xDF, 0x67, 0x08, 0x23, 0x88, 0x62, 0xE3, 0x08, 0x5C,
+    0x23, 0x73, 0x0C, 0x01, 0x96, 0xB0, 0x99, 0xC0, 0x8D, 0xD5, 0xDB, 0xCE, 0x4C, 0x1F, 0xE4, 0xFD,
+    0x19, 0x2E, 0xD7, 0x20, 0x81, 0x4E, 0x22, 0x4E, 0xAD, 0x02, 0x86, 0x1C, 0xEF, 0x2C, 0xEC, 0xCF,
+    0xD0, 0x7E, 0xFB, 0x02, 0xE1, 0xE1, 0xFD, 0xE5, 0xB9, 0xBC, 0xE5, 0x12, 0xA3, 0xCA, 0xE8, 0x88,
+    0x45, 0x03, 0x15, 0x0E, 0xA0, 0xC2, 0x1A, 0xB7, 0x13, 0xB3, 0x52, 0x3C, 0x87, 0x18, 0x95, 0x3F,
+    0x56, 0x9C, 0x31, 0x52, 0x2A, 0x5D, 0x57, 0xD3, 0xA1, 0x41, 0x2B, 0x82, 0x11, 0x23, 0xC2, 0x4D,
+    0xE8, 0xE5, 0xC3, 0xBA, 0x59, 0x6B, 0x32, 0xBE, 0x22, 0x37, 0xB8, 0xC9, 0x11, 0x88, 0x5C, 0x7E,
+    0x94, 0x5F, 0xDA, 0xB5, 0xC5, 0xAB, 0xA8, 0xD7, 0x98, 0x2E, 0x4A, 0xBC, 0x5B, 0xD0, 0x7D, 0x3E,
+    0xA3, 0x43, 0xE8, 0xAB, 0x9F, 0xA7, 0x44, 0x02, 0x07, 0xE9, 0x78, 0x50, 0xB4, 0x0A, 0xE9, 0x5D,
+    0xDB, 0x23, 0x1E, 0x1D, 0x0A, 0xCB, 0x95, 0xE2, 0xDB, 0xCC, 0x42, 0x40, 0x52, 0x6C, 0x5C, 0xF6,
+    0xBD, 0x80, 0x51, 0x4C, 0x56, 0x54, 0xB6, 0xC9, 0xB2, 0x9F, 0x70, 0x66, 0xE6, 0x48, 0xD5, 0xC3,
+    0x7D, 0x94, 0x73, 0xAA, 0x50, 0x10, 0x3D, 0x53, 0x04, 0x85, 0xC1, 0x4E, 0x77, 0x3A, 0x90, 0x3B,
+    0xBA, 0x9F, 0x37, 0x80, 0xDA, 0xF2, 0x0B, 0xB1, 0xBC, 0x30, 0x94, 0xC6, 0xB7, 0x39, 0x8D, 0xDD,
+    0x32, 0xA2, 0x71, 0x83, 0x74, 0xE8, 0x1F, 0xB6, 0x92, 0xD5, 0xBE, 0xE6, 0x4B, 0x9F, 0xC5, 0x40,
+    0x5A, 0x23, 0xDB, 0x3C, 0xB0, 0xAF, 0x14, 0x47, 0x9F, 0x66, 0x53, 0x0D, 0x3E, 0x43, 0x5D, 0xF3,
+    0xE6, 0x18, 0x03, 0x47, 0xE3, 0x1A, 0xF5, 0x96, 0x53, 0xCA, 0xFE, 0x1B, 0x07, 0x88, 0xBD, 0x6D,
+    0xE4, 0xF1, 0x86, 0x43, 0xEE, 0x09, 0x6E, 0x3A, 0x81, 0xB7, 0x6B, 0x56, 0x6B, 0x04, 0x25, 0x57,
+    0x79, 0x5E, 0xD3, 0xAB, 0xA1, 0xBB, 0x60, 0xB8, 0x4A, 0xDB, 0x09, 0xFA, 0x3F, 0x1A, 0x3F, 0x05,
+    0x1A, 0xDA, 0xFA, 0x5E, 0xB8, 0x55, 0xDB, 0xDC, 0xD7, 0x0A, 0x10, 0x89, 0xAF, 0x70, 0xA3, 0x70,
+    0xC6, 0xDA, 0xB6, 0x8C, 0x04, 0x27, 0xD8, 0xEF, 0x44, 0x55, 0x8F, 0x07, 0xAF, 0xD5, 0x22, 0xDA,
+    0x3D, 0x67, 0x9C, 0xC8, 0xE8, 0x2D, 0xE1, 0xF7, 0x2D, 0xFE, 0xFE, 0xA9, 0x27, 0x43, 0xAA, 0xB8,
+    0x81, 0x78, 0xBC, 0x7F, 0x77, 0xBC, 0xC8, 0x83, 0x0D, 0xF8, 0x8D, 0x81, 0xD8, 0xD4, 0x1E, 0xB9,
+    0x5C, 0x91, 0x19, 0x41, 0x13, 0xA5, 0x44, 0xC8, 0x60, 0x1F, 0x08, 0xDF, 0x5E, 0xFA, 0xB1, 0xEA,
+    0x46, 0x01, 0x1E, 0xE2, 0x6D, 0x63, 0xF8, 0x7E, 0xD6, 0xBB, 0x17, 0xC9, 0x80, 0x76, 0x40, 0x87,
+    0xCF, 0x1A, 0x69, 0x53, 0x40, 0xA4, 0x44, 0xA1, 0x56, 0xD1, 0x28, 0x5F, 0x60, 0x12, 0x7A, 0xBD,
+    0x02, 0xE3, 0xE1, 0xFF, 0xA4, 0xCB, 0xA0, 0x1E, 0xDC, 0x5C, 0x6C, 0xDB, 0xF7, 0x05, 0x55, 0xC0,
+    0xE5, 0xAB, 0x57, 0xF8, 0xB4, 0xFF, 0x20, 0xD9, 0x3D, 0xEB, 0x02, 0x1C, 0x67, 0x31, 0xC7, 0xB4,
+    0x2D, 0x5C, 0x4A, 0x9F, 0xF1, 0x18, 0x97, 0x27, 0x5B, 0x1A, 0x72, 0xDD, 0x6A, 0x8E, 0x29, 0xBB,
+    0x26, 0xE8, 0x3E, 0xCB, 0xF6, 0x48, 0x19, 0xC1, 0xD2, 0x18, 0x28, 0x92, 0xCA, 0x30, 0xE6, 0x59,
+    0xBB, 0x34, 0xE4, 0x4C, 0x3B, 0xD8, 0x7D, 0x06, 0xA0, 0xD8, 0x85, 0xD6, 0x06, 0x1F, 0xE9, 0x04,
+    0x27, 0x78, 0x8F, 0xCA, 0xFC, 0x56, 0x68, 0xE4, 0xA5, 0x25, 0xE0, 0x4C, 0xA0, 0xBC, 0x36, 0xED,
+    0xBF, 0xAD, 0xC3, 0xA0, 0x2E, 0x83, 0xB3, 0x79, 0x80, 0x4F, 0xC2, 0x80, 0x93, 0xC7, 0xC4, 0x8C,
+    0xFE, 0x64, 0xEC, 0xFE, 0x24, 0xF1, 0x5C, 0xC5, 0x51, 0x51, 0x13, 0xC0, 0x5E, 0x61, 0x61, 0x5D,
+    0x5C, 0xAB, 0x50, 0x72, 0x79, 0x91, 0xA3, 0xB6, 0x17, 0x8D, 0x2F, 0xB5, 0xA7, 0x3B, 0x19, 0x8A,
+    0x5E, 0x14, 0x13, 0xE4, 0xDC, 0x8E, 0x92, 0xE1, 0x51, 0xFF, 0x98, 0xC5, 0xAC, 0xA2, 0x5F, 0xC0,
+    0xA5, 0x46, 0x77, 0x64, 0x9F, 0xD8, 0x82, 0x0D, 0x54, 0x3A, 0xD7, 0x77, 0xC9, 0xBE, 0x0E, 0xF6,
+    0x05, 0xF0, 0x17, 0xF1, 0x1E, 0xBF, 0x00, 0x57, 0xAE, 0xAA, 0xE8, 0xB3, 0xEE, 0xF8, 0x2B, 0x4A,
+    0x02, 0x79, 0xC0, 0x3C, 0xF8, 0x7A, 0x56, 0xA8, 0x69, 0xFF, 0x64, 0x7C, 0x02, 0x76, 0x26, 0x93,
+    0x95, 0x02, 0xD9, 0x1E, 0xA6, 0x6A, 0x69, 0x3C, 0x00, 0x78, 0x8D, 0x71, 0x7C, 0x83, 0xD0, 0x38,
+    0xD7, 0x65, 0x94, 0xBD, 0xD3, 0x7B, 0xF0, 0xC3, 0x26, 0x96, 0x27, 0x23, 0xCA, 0xC0, 0x33, 0x74,
+    0xE1, 0x6D, 0x3E, 0x61, 0xF8, 0xF8, 0x49, 0x0B, 0x79, 0x90, 0x90, 0xCA, 0xD4, 0x5B, 0x7D, 0x9B,
+    0x75, 0xF9, 0x08, 0x36, 0x8B, 0x2E, 0xA5, 0x50, 0xB8, 0x7E, 0x3A, 0xED, 0x09, 0xED, 0x0C, 0x1C,
+    0xB8, 0xDD, 0x5E, 0x13, 0x0A, 0x0B, 0x5C, 0xFB, 0x75, 0x41, 0x98, 0x2B, 0xC9, 0xAB, 0xC9, 0x14,
+    0xDA, 0xFE, 0x34, 0x72, 0xB9, 0x7C, 0x86, 0x89, 0x0E, 0x2E, 0x58, 0xC3, 0xC1, 0xD5, 0x2B, 0x66,
+    0x26, 0xD2, 0xBF, 0xBF, 0x96, 0x33, 0x30, 0xCE, 0x5D, 0x87, 0x02, 0xE2, 0x20, 0x71, 0xEC, 0x24,
+    0xAD, 0x40, 0xFE, 0xEF, 0x52, 0xD1, 0x84, 0x72, 0xCD, 0xCD, 0x3C, 0xDB, 0xA7, 0x94, 0x0F, 0xAD,
+    0x4C, 0x67, 0x3F, 0x13, 0x16, 0x4B, 0x6B, 0x26, 0x92, 0x3F, 0xB2, 0xAE, 0xA4, 0x5F, 0xBB, 0x65,
+    0x0B, 0x13, 0xE2, 0xB9, 0x87, 0xA7, 0xB2, 0x14, 0xC0, 0x2A, 0x66, 0x5B, 0x99, 0x6C, 0xC6, 0x98,
+    0xC2, 0xB6, 0x1B, 0x05, 0x14, 0xD6, 0xC9, 0x5B, 0x33, 0xE1, 0x14, 0x35, 0x82, 0xF9, 0x50, 0xF6,
+    0xFD, 0xA0, 0x15, 0x6D, 0xB1, 0x59, 0x4A, 0x51, 0x9D, 0x81, 0xD4, 0x1C, 0xE2, 0x31, 0xDD, 0xD0,
+    0xFF, 0xC8, 0x9A, 0x7B, 0x9F, 0xED, 0xD4, 0x33, 0xDF, 0xBA, 0x58, 0x9E, 0x36, 0xC1, 0x69, 0xA2,
+    0xE2, 0x93, 0xC7, 0x21, 0x8D, 0x07, 0xFD, 0xA2, 0x37, 0xA9, 0xDC, 0x28, 0x7F, 0x16, 0xA1, 0x0E,
+    0x00, 0x5E, 0x0D, 0x01, 0xCB, 0x36, 0x97, 0xD5, 0xC1, 0xF2, 0x93, 0xC7, 0x8A, 0xAE, 0xA7, 0xE6,
+    0xBE, 0x0B, 0xA8, 0x3E, 0xA2, 0x26, 0xDF, 0x62, 0x13, 0xEF, 0xB8, 0x9A, 0xDA, 0xD4, 0x4D, 0xD0,
+    0x78, 0x02, 0x54, 0x78, 0xEE, 0x5A, 0x6F, 0xAB, 0xD2, 0x6D, 0x94, 0xBC, 0xE9, 0xD3, 0x71, 0x3B,
+    0x59, 0x73, 0xBE, 0x32, 0x7E, 0x7C, 0x69, 0x5C, 0xFC, 0xA3, 0x86, 0x86, 0x59, 0x83, 0x34, 0xD8,
+    0xC9, 0x66, 0x8C, 0xEB, 0x56, 0xE0, 0xD0, 0xC2, 0xD1, 0x08, 0x35, 0xAB, 0x6F, 0x04, 0xAA, 0xB4,
+    0x5C, 0x4D, 0x41, 0x71, 0x0A, 0xB8, 0x3E, 0x8C, 0xAF, 0x73, 0xF0, 0xF7, 0xD2, 0x28, 0x2A, 0x20,
+    0xD6, 0xC6, 0x21, 0x2E, 0xB8, 0xF3, 0xDE, 0x84, 0xFD, 0x1C, 0x10, 0x36, 0x3A, 0x3B, 0x27, 0x97,
+    0x93, 0xBB, 0x0F, 0xBE, 0x4E, 0xD4, 0x44, 0xA1, 0x3F, 0x53, 0x30, 0x68, 0x58, 0xA5, 0xF9, 0x27,
+    0xF5, 0xFF, 0x3F, 0xC1, 0x9D, 0x89, 0x57, 0xE8, 0xF9, 0x3E, 0x66, 0x82, 0x57, 0x7B, 0x00, 0xD6,
+    0x46, 0x6E, 0x42, 0x98, 0x6D, 0xCB, 0x99, 0x71, 0x74, 0xB9, 0x2A, 0x65, 0x54, 0xCE, 0xDD, 0x10,
+    0xD3, 0xBB, 0xA6, 0x4D, 0xCA, 0x3B, 0x4E, 0x4D, 0x5C, 0xF8, 0x80, 0x45, 0xED, 0x0D, 0xBB, 0x1F,
+    0xC8, 0xDD, 0x69, 0x33, 0x13, 0x6D, 0x47, 0x3F, 0x29, 0x51, 0x1C, 0xF9, 0xD9, 0x95, 0x64, 0x29,
+    0x5C, 0xEC, 0x7A, 0x8B, 0x14, 0x07, 0xA0, 0x43, 0x1E, 0x5B, 0x7A, 0x5E, 0xDA, 0x7B, 0xA7, 0xC9,
+    0x7B, 0xDC, 0x72, 0xF5, 0x90, 0xF2, 0x7D, 0xF9, 0x59, 0xE2, 0xE3, 0x74, 0xEE, 0x8B, 0xBC, 0x87,
+    0x15, 0x24, 0x6D, 0x5C, 0x39, 0xA6, 0xE2, 0x1E, 0xA9, 0x4D, 0xB7, 0x39, 0x39, 0x75, 0x50, 0xF9,
+    0x05, 0x88, 0xD2, 0xB5, 0x7C, 0xDB, 0x9A, 0x4D, 0x75, 0x52, 0xAB, 0x45, 0x2F, 0x0B, 0x77, 0x11,
+    0xEF, 0xE6, 0x22, 0x86, 0xA9, 0xB7, 0x14, 0x08, 0xA9, 0xB2, 0x52, 0x54, 0x2F, 0x01, 0x32, 0x89,
+    0x3C, 0xBE, 0xC2, 0xF6, 0x7D, 0x34, 0xBE, 0xD1, 0xDB, 0xE3, 0x74, 0x6F, 0x9B, 0x59, 0xF9, 0x86,
+    0x0F, 0xE1, 0xA8, 0x7F, 0x64, 0x2D, 0xE0, 0x73, 0x9A, 0xCF, 0xB3, 0xF7, 0x7C, 0x7D, 0xE7, 0xF4,
+    0xFB, 0x70, 0xF4, 0xFF, 0x82, 0x13, 0x31, 0x47, 0x66, 0xAC, 0x93, 0x3C, 0x5E, 0x59, 0x1B, 0xEE,
+    0xEE, 0x63, 0x39, 0xF6, 0xED, 0x97, 0xAC, 0x17, 0x63, 0x90, 0xF2, 0x99, 0xCB, 0xC1, 0x8C, 0x37,
+    0x42, 0xE1, 0x58, 0xF1, 0x91, 0xCA, 0x9E, 0x43, 0x01, 0x17, 0xA4, 0xD5, 0xDB, 0x48, 0x26, 0x2B,
+    0xB9, 0x91, 0xE0, 0x42, 0xC0, 0xB2, 0x9C, 0x55, 0xD6, 0x0B, 0xF2, 0xC4, 0x03, 0x3B, 0x8B, 0xD2,
+    0x42, 0xFB, 0xDD, 0xDD, 0xB8, 0x22, 0x01, 0x10, 0xC4, 0xE9, 0xA8, 0x88, 0xA4, 0x98, 0x5A, 0xBF,
+    0x20, 0xEB, 0x6B, 0x0D, 0x6C, 0xB5, 0x2C, 0x82, 0xA8, 0xC5, 0xE4, 0xC2, 0x38, 0x77, 0x5E, 0x43,
+    0x73, 0x75, 0x03, 0x6D, 0xDC, 0xD3, 0xE4, 0x01, 0xFD, 0x5A, 0x25, 0xD7, 0xF2, 0x7F, 0xC7, 0xF7,
+    0x53, 0x94, 0x32, 0x11, 0xA1, 0x70, 0x46, 0x61, 0x33, 0x39, 0x73, 0xFB, 0xB9, 0x93, 0xD1, 0x59,
+    0x92, 0xE8, 0xCB, 0x4A, 0x17, 0xB9, 0xB8, 0x75, 0xA8, 0xCC, 0x14, 0xD9, 0xD6, 0x4D, 0xF7, 0x71,
+    0xB6, 0x3D, 0xDC, 0x56, 0x1E, 0x5D, 0x53, 0x83, 0xEE, 0xEA, 0x5C, 0xCE, 0xA0, 0xDC, 0x73, 0x4D,
+    0xE5, 0x6D, 0x1D, 0x8C, 0x6B, 0xE1, 0xD9, 0x27, 0xAE, 0x70, 0x61, 0xEE, 0x8C, 0x3B, 0x83, 0x6A,
+    0x94, 0x70, 0x28, 0xB1, 0x83, 0x03, 0x6E, 0x0A, 0xE9, 0xA7, 0x15, 0x42, 0x6F, 0x11, 0x95, 0x1D,
+    0x05, 0x63, 0x20, 0xA8, 0xFA, 0x9A, 0x4F, 0x9B, 0xCD, 0xAF, 0xDA, 0xA2, 0x76, 0x12, 0x41, 0xB1,
+    0x38, 0xCC, 0x43, 0xFB, 0x88, 0xB7, 0xB4, 0xAB, 0xC0, 0x60, 0x13, 0xC3, 0x8D, 0x98, 0x67, 0x51,
+    0x35, 0xCE, 0x91, 0x8D, 0xF6, 0x06, 0xA1, 0xE5, 0xB3, 0x36, 0x1C, 0xE2, 0xEA, 0x58, 0x75, 0x7A,
+    0xD1, 0x5A, 0xF2, 0xE6, 0x97, 0x17, 0x82, 0x07, 0x8D, 0xBD, 0x73, 0xF0, 0x2B, 0x23, 0x37, 0xDA,
+    0xF7, 0xE0, 0xCE, 0xF0, 0xFB, 0x52, 0xA5, 0x4E, 0x62, 0xF7, 0xDF, 0xC6, 0x07, 0x56, 0xF0, 0x4B,
+    0x75, 0xD2, 0x05, 0xC2, 0xD8, 0xE2, 0x60, 0xDE, 0x02, 0x21, 0x65, 0x68, 0x38, 0x5E, 0xA4, 0x4A,
+    0x91, 0x51, 0x12, 0x71, 0xA4, 0x32, 0x52, 0xFD, 0x34, 0x5C, 0xC4, 0x0D, 0x38, 0x66, 0x22, 0xC5,
+    0xD5, 0x28, 0xD2, 0xB2, 0x4A, 0x76, 0x9A, 0x04, 0xAD, 0x90, 0x34, 0xCF, 0x44, 0x56, 0xF0, 0x10,
+    0x04, 0x16, 0x25, 0x3C, 0x05, 0x6F, 0x3D, 0xBD, 0xDC, 0x56, 0x15, 0xE8, 0x51, 0xC4, 0xB3, 0x7E,
+    0xB6, 0xBC, 0x00, 0x20, 0xEA, 0x21, 0x9D, 0x9B, 0x8F, 0xBB, 0x76, 0x70, 0x16, 0x45, 0x23, 0xDE,
+    0xC3, 0xA5, 0xB7, 0x18, 0x2E, 0x93, 0x5B, 0x65, 0x53, 0x35, 0xDC, 0xED, 0x55, 0x01, 0x89, 0xA6,
+    0x2A, 0x26, 0xDE, 0x31, 0x68, 0x6D, 0x65, 0xA3, 0x40, 0xB0, 0xC9, 0xC9, 0x83, 0xEF, 0xB5, 0x95,
+    0x98, 0xC5, 0xD6, 0x35, 0xE7, 0x25, 0x79, 0x5E, 0xFE, 0x5F, 0x5F, 0x32, 0x5F, 0xF8, 0x19, 0x41,
+    0xB8, 0x97, 0x73, 0xEE, 0xAC, 0x6A, 0x8F, 0x7C, 0x48, 0xEC, 0x02, 0x48, 0x17, 0x0C, 0x60, 0x87,
+    0x9A, 0x4E, 0xC5, 0xAE, 0x3C, 0xA5, 0xBE, 0x18, 0x34, 0xC6, 0xDF, 0x79, 0x1B, 0x3D, 0x4E, 0xEC,
+    0x98, 0xE5, 0x59, 0x1B, 0xAC, 0xBF, 0xC3, 0x4A, 0xF4, 0x84, 0x97, 0x21, 0xCA, 0xA2, 0xB3, 0xF3,
+    0xE4, 0x2B, 0x78, 0xB9, 0x51, 0x43, 0x2A, 0x1C, 0x47, 0xC1, 0x54, 0x3B, 0x0A, 0x75, 0x16, 0x58,
+    0x6E, 0x7B, 0x73, 0xBF, 0xAD, 0xEA, 0xD6, 0x86, 0xF9, 0x1B, 0x06, 0x5B, 0x1C, 0x34, 0xC0, 0xEE,
+    0x41, 0x05, 0xB1, 0x8D, 0xE6, 0x2B, 0x61, 0xB1, 0x24, 0x17, 0x89, 0xB1, 0x43, 0xCF, 0xAE, 0xC0,
+    0x21, 0x76, 0x23, 0xC7, 0xA5, 0xE7, 0xDE, 0x44, 0x9F, 0x12, 0x8B, 0x6C, 0xBC, 0x19, 0x82, 0xCA,
+    0x23, 0x39, 0x9E, 0xEC, 0x4E, 0xCE, 0x0F, 0x01, 0x51, 0x0D, 0xFE, 0x62, 0x9E, 0x80, 0xF4, 0x69,
+    0xB3, 0x7A, 0xBC, 0x63, 0x96, 0x60, 0xD3, 0xEA, 0xFB, 0xC4, 0xEE, 0x1B, 0x34, 0x86, 0xA0, 0x7C,
+    0x2C, 0xAE, 0x6D, 0x71, 0x30, 0x59, 0x22, 0x2C, 0x24, 0xE3, 0x7B, 0x46, 0x7D, 0x18, 0xE1, 0xBA,
+    0x5D, 0xC0, 0x15, 0x67, 0x0A, 0x04, 0x62, 0xC1, 0x8C, 0x5C, 0xC5, 0x2E, 0x19, 0xB3, 0x8A, 0x41,
+    0xBE, 0x2A, 0x76, 0x22, 0x8C, 0x76, 0xA2, 0x45, 0xDB, 0xB7, 0x7E, 0x1D, 0xB0, 0x76, 0x37, 0x59,
+    0xDC, 0x22, 0x47, 0x7D, 0xAB, 0x34, 0x4D, 0x5F, 0x41, 0xCE, 0x89, 0x5D, 0x84, 0xF1, 0xBE, 0x90,
+    0x25, 0xD3, 0xAC, 0xEE, 0x9F, 0x2A, 0x1E, 0x5C, 0xE2, 0x19, 0x76, 0x6F, 0xA2, 0x5C, 0x28, 0xAC,
+    0x99, 0xBD, 0x59, 0x86, 0x08, 0x36, 0x0C, 0xB8, 0x3E, 0xD1, 0x98, 0x5D, 0x62, 0x94, 0x8F, 0xB1,
+    0xA3, 0xE4, 0xFD, 0x56, 0x09, 0x95, 0xCB, 0xFD, 0x79, 0x7C, 0x6A, 0x78, 0x81, 0x19, 0x3C, 0x34,
+    0x8A, 0x3B, 0x47, 0x10, 0x48, 0xBC, 0x22, 0x3D, 0xEB, 0x6A, 0xE7, 0x2E, 0xB0, 0xE1, 0x42, 0x55,
+    0xE4, 0x2D, 0x98, 0xD1, 0x7B, 0x9C, 0xD2, 0x5E, 0x6F, 0x52, 0x33, 0x1E, 0xBB, 0x62, 0xBA, 0xB8,
+    0xFB, 0x2B, 0x52, 0xE1, 0x3D, 0xA0, 0xB4, 0xDD, 0x05, 0xAC, 0xA6, 0xDC, 0x3A, 0x07, 0x0F, 0xB0,
+    0x78, 0x5E, 0x93, 0xDE, 0xBD, 0x2A, 0x34, 0x92, 0xE0, 0xF0, 0xBC, 0x32, 0xB1, 0xEC, 0xAE, 0xD6,
+    0x10, 0x37, 0x48, 0x89, 0x50, 0x74, 0x24, 0xEF, 0xC2, 0x5A, 0xFA, 0xF1, 0xCA, 0x5D, 0x12, 0xF9,
+    0x00, 0xCE, 0x95, 0xA5, 0x9A, 0xC1, 0x38, 0x42, 0x27, 0xE6, 0xD3, 0xD6, 0xE1, 0x20, 0xDE, 0x6E,
+    0x96, 0x1D, 0x1A, 0x02, 0xC3, 0x0E, 0x10, 0x3E, 0x55, 0x27, 0x78, 0xFA, 0xA1, 0x2B, 0x25, 0x6D,
+    0x30, 0x97, 0xA5, 0xA6, 0xA0, 0x9D, 0xDE, 0x12, 0x2B, 0xDA, 0x82, 0xF9, 0xE9, 0xF5, 0x4F, 0xB9,
+    0x30, 0x44, 0x57, 0x92, 0xC7, 0x64, 0xFE, 0x77, 0xF7, 0x0A, 0x4C, 0xC0, 0x96, 0xDD, 0x79, 0xFD,
+    0xCC, 0xE7, 0xFE, 0x6A, 0x8F, 0x69, 0x34, 0x37, 0xB4, 0x41, 0xAA, 0x72, 0x74, 0xC6, 0xDA, 0xCD,
+    0x7E, 0x72, 0x14, 0x92, 0x2D, 0xA1, 0x77, 0xAD, 0x1C, 0xDF, 0x99, 0x79, 0x6C, 0xEE, 0xDA, 0x0F,
+    0x4C, 0x45, 0x93, 0x52, 0xC9, 0x83, 0x07, 0x57, 0x1A, 0xE2, 0xE0, 0xE6, 0x3F, 0x91, 0x7F, 0x72,
+    0x0E, 0x2F, 0xC9, 0x21, 0x09, 0xB6, 0x66, 0xEA, 0xB2, 0x8D, 0xFB, 0x3E, 0xD2, 0x7C, 0xA4, 0xB5,
+    0xE9, 0xFF, 0x35, 0xFB, 0x1A, 0x92, 0x81, 0xEA, 0x1D, 0x08, 0x01, 0x6F, 0x7E, 0x02, 0x55, 0x5E,
+    0x11, 0x51, 0xD1, 0x37, 0x35, 0xD7, 0x96, 0xAD, 0xAC, 0xE4, 0x73, 0x3B, 0x63, 0x1A, 0x57, 0xCB,
+    0xF8, 0xF7, 0x84, 0xC5, 0x10, 0x84, 0x1F, 0x30, 0x4E, 0x8E, 0xDA, 0xA0, 0xBE, 0xD1, 0x38, 0xC5,
+    0x7B, 0x08, 0x3C, 0x9D, 0xA3, 0x09, 0x9F, 0x64, 0xE4, 0x12, 0xBA, 0x54, 0x45, 0x2D, 0x32, 0x2A,
+    0x14, 0xCC, 0x75, 0xF5, 0xE0, 0xEB, 0x05, 0x87, 0x9B, 0xE4, 0x83, 0x52, 0x67, 0xC4, 0xB7, 0x9E,
+    0x97, 0x38, 0xC7, 0x35, 0x7F, 0xF6, 0x34, 0x08, 0x3F, 0x12, 0x65, 0x88, 0x57, 0x8E, 0x60, 0x76,
+    0xCB, 0x00, 0x4D, 0xF4, 0x88, 0x12, 0xF6, 0x3C, 0x2E, 0xA1, 0x8F, 0xD8, 0xA8, 0x29, 0x3B, 0xB0,
+    0xE9, 0x5C, 0x32, 0x36, 0x9C, 0xAF, 0x90, 0x9F, 0x72, 0xA2, 0x96, 0x65, 0x17, 0x61, 0x06, 0x63,
+    0x2B, 0x9E, 0x57, 0xA6, 0xA7, 0x1E, 0xB7, 0xD9, 0xEB, 0xC2, 0x2A, 0x64, 0xA3, 0x0B, 0x2A, 0x9A,
+    0x9B, 0x87, 0x13, 0x25, 0x2C, 0x7C, 0xED, 0x8F, 0x21, 0x04, 0x13, 0x4A, 0xF1, 0xB9, 0xD2, 0x0D,
+    0xAF, 0x95, 0x85, 0x77, 0x0C, 0x94, 0x77, 0xAF, 0x03, 0xA6, 0xA7, 0x3B, 0x06, 0xDF, 0x61, 0x08,
+    0x36, 0x01, 0x49, 0x6D, 0x7F, 0x34, 0x4F, 0x56, 0x17, 0x50, 0xB5, 0xB4, 0xE7, 0xE7, 0xAE, 0xF5,
+    0x61, 0xB5, 0xEB, 0xFD, 0x40, 0x15, 0x37, 0x9C, 0xF0, 0xA0, 0x47, 0x89, 0x45, 0x2B, 0x16, 0x49,
+    0x98, 0xD0, 0xF7, 0x7F, 0x7A, 0xBC, 0x60, 0xA1, 0xBD, 0x7A, 0xB1, 0x75, 0xBD, 0x55, 0xD6, 0x2D,
+    0x19, 0x5A, 0x51, 0x09, 0xA6, 0xA5, 0x19, 0x98, 0xC2, 0xA3, 0xA0, 0x40, 0x4F, 0x1A, 0x23, 0x04,
+    0x55, 0x46, 0xA7, 0x1E, 0xE8, 0x33, 0xE1, 0x90, 0x13, 0x74, 0x74, 0x15, 0xA1, 0xCE, 0x47, 0x9C,
+    0x62, 0x7D, 0x46, 0x3E, 0xE6, 0x2A, 0x51, 0xC4, 0x12, 0xB3, 0x6B, 0x4A, 0x1A, 0xBD, 0xE1, 0x10,
+    0x8D, 0x64, 0x8A, 0xA8, 0x1D, 0x5F, 0x2E, 0x2F, 0x2F, 0x34, 0xD3, 0xEF, 0x48, 0x1C, 0x5E, 0xAE,
+    0xA1, 0x53, 0xDB, 0xD5, 0x56, 0x8D, 0xD2, 0x10, 0xDB, 0x1B, 0x6A, 0x64, 0x86, 0x44, 0x27, 0xC5,
+    0xD0, 0xE0, 0xD0, 0x94, 0x6F, 0xDC, 0x5A, 0x0D, 0x60, 0x93, 0xFA, 0x54, 0x65, 0xE0, 0xA8, 0x14,
+    0xDB, 0xDF, 0x9F, 0x7B, 0xBB, 0xFA, 0xF7, 0xD5, 0x49, 0x7E, 0xB1, 0x38, 0x2F, 0x49, 0x02, 0xF6,
+    0x15, 0xB7, 0x6F, 0x25, 0xFA, 0xDB, 0xE4, 0x1A, 0xB9, 0xCF, 0x5F, 0xA1, 0x6C, 0x7D, 0x71, 0xED,
+    0xCC, 0xAB, 0x76, 0x4E, 0xE2, 0xC8, 0x44, 0x1A, 0xF9, 0xAA, 0x63, 0x51, 0xA0, 0x47, 0xE9, 0x62,
+    0xAD, 0x48, 0x25, 0x15, 0xBD, 0x6B, 0xA8, 0xF2, 0x69, 0x10, 0x0A, 0xA9, 0x56, 0xCA, 0xCA, 0xF4,
+    0xCD, 0x7D, 0x55, 0x09, 0xDB, 0x3C, 0x34, 0x9B, 0xED, 0x3A, 0x3A, 0xF9, 0xA4, 0xB2, 0xF4, 0xCE,
+    0xD5, 0x46, 0x77, 0x34, 0xA3, 0x96, 0xA8, 0x0E, 0xA1, 0xB5, 0xD3, 0x69, 0x68, 0xF5, 0xB3, 0x17,
+    0x99, 0x30, 0xBE, 0x03, 0xB0, 0x89, 0x1D, 0x75, 0xA4, 0xF7, 0x79, 0xF6, 0x7D, 0xA0, 0x24, 0xCD,
+    0xE0, 0x0A, 0x92, 0x4D, 0xE4, 0xF7, 0x28, 0xE7, 0x52, 0x0C, 0x28, 0x62, 0xBA, 0x24, 0xD6, 0xA4,
+    0x02, 0xFF, 0xD1, 0x6B, 0xDE, 0x0C, 0xB9, 0xA1, 0xBC, 0xBD, 0x2C, 0x7D, 0xF6, 0xFF, 0x2C, 0x8D,
+    0x83, 0x08, 0x62, 0xC5, 0x6B, 0x9F, 0x11, 0xA2, 0x7D, 0xB7, 0x90, 0x38, 0x08, 0xB9, 0xDC, 0x46,
+    0xA3, 0xD1, 0xD1, 0xE5, 0x36, 0xC3, 0xEE, 0x5F, 0x82, 0x63, 0x4E, 0x66, 0x30, 0x38, 0xC8, 0x40,
+    0x2E, 0xB8, 0x82, 0xAE, 0x95, 0xCF, 0x45, 0x1A, 0xF9, 0x2A, 0x85, 0x9C, 0x66, 0x96, 0x7D, 0x69,
+    0xC5, 0xE7, 0x13, 0xD6, 0x86, 0x39, 0x14, 0xE3, 0x1B, 0xBF, 0x78, 0x5B, 0xFB, 0x6A, 0x88, 0x1A,
+    0xCA, 0x21, 0x6C, 0xE3, 0x80, 0xCE, 0x61, 0x3F, 0x13, 0x7A, 0xFD, 0x16, 0x4F, 0x32, 0xE0, 0xB8,
+    0x76, 0x6D, 0x1D, 0x46, 0xB9, 0xF4, 0xA1, 0x05, 0x53, 0x5E, 0x96, 0x42, 0xF3, 0xF5, 0xA6, 0xAF,
+    0x87, 0x78, 0xCF, 0x3D, 0x84, 0xB1, 0xFC, 0x97, 0x1F, 0x86, 0x79, 0x1E, 0xCE, 0xEF, 0x21, 0x13,
+    0x5F, 0xD3, 0x23, 0xD3, 0x52, 0xE7, 0x31, 0x37, 0x40, 0x08, 0xB7, 0x6C, 0x50, 0xCA, 0x82, 0xB5,
+    0x47, 0x04, 0x98, 0x5F, 0x28, 0xAA, 0x39, 0x76, 0xFA, 0x18, 0xAD, 0x08, 0x57, 0x9F, 0xFE, 0x7B,
+    0x6F, 0x2B, 0x46, 0x83, 0x6C, 0xDE, 0x90, 0xCB, 0x41, 0x40, 0x22, 0x24, 0x4B, 0x82, 0x23, 0x72,
+    0xC0, 0x28, 0x79, 0xAC, 0xE8, 0xF5, 0x96, 0xC2, 0xC1, 0x76, 0x6C, 0x5B, 0xBA, 0xFB, 0x60, 0x12,
+    0xA1, 0xF1, 0x59, 0xE9, 0x70, 0x97, 0x5C, 0xD3, 0x6D, 0x3C, 0xC2, 0x18, 0xA4, 0x30, 0x37, 0xF0,
+    0xAC, 0x92, 0xB3, 0xC3, 0x1F, 0xAA, 0x73, 0x03, 0x0A, 0x9F, 0x01, 0x5F, 0x4C, 0x68, 0x3A, 0xA5,
+    0xB0, 0xB9, 0xBB, 0x87, 0xA4, 0x76, 0x9B, 0x36, 0xD0, 0x35, 0x68, 0x26, 0xEE, 0x76, 0x82, 0xDA,
+    0x81, 0x16, 0xFB, 0x82, 0xD2, 0x9D, 0xCD, 0x4F, 0x3A, 0xAD, 0xA3, 0xC2, 0xBD, 0x9E, 0x60, 0x39,
+    0x30, 0x1B, 0x9D, 0x4F, 0xAD, 0x0C, 0x88, 0x54, 0x57, 0x64, 0xFD, 0xBB, 0x63, 0x37, 0x7A, 0xB0,
+    0x7E, 0x4C, 0x69, 0x4C, 0x6D, 0x78, 0x84, 0x69, 0x59, 0xF2, 0xAF, 0xFD, 0x76, 0x67, 0x0D, 0x1A,
+    0x40, 0xB4, 0x4A, 0xE7, 0xDB, 0x9D, 0xD7, 0xD8, 0x66, 0xC7, 0x8D, 0xAD, 0x4C, 0xE2, 0x9D, 0x1A,
+    0x63, 0xA2, 0x56, 0xD9, 0x40, 0x6D, 0x7B, 0xE0, 0x0F, 0x78, 0xAA, 0x88, 0xA7, 0xA8, 0x62, 0xE3,
+    0x7E, 0xE9, 0x8C, 0x65, 0xB5, 0x56, 0x2A, 0x1E, 0x5C, 0xDF, 0xC4, 0x3C, 0xC3, 0x5D, 0x46, 0x00,
+    0xF1, 0x8A, 0x0B, 0x7C, 0x58, 0x94, 0xA4, 0x5B, 0xAA, 0x3A, 0x72, 0x0D, 0xE9, 0x59, 0x99, 0x87,
+    0x06, 0xE8, 0xC9, 0x4F, 0xC5, 0x54, 0x10, 0x00, 0xAE, 0x45, 0xCF, 0xE7, 0x81, 0xE5, 0xC4, 0x85,
+    0x70, 0xD6, 0xD9, 0x60, 0x9D, 0x19, 0x5F, 0xC9, 0xBE, 0x3D, 0xB7, 0x24, 0xB4, 0x7B, 0x08, 0xFB,
+    0xA4, 0x9E, 0x36, 0x26, 0xA0, 0xF2, 0x86, 0xE9, 0x67, 0x10, 0xF6, 0x8E, 0xE9, 0xEB, 0xA3, 0xB3,
+    0x75, 0x83, 0x38, 0xA7, 0x45, 0x81, 0xF0, 0xF3, 0x62, 0x18, 0x02, 0xF1, 0x95, 0x8C, 0xEA, 0x39,
+    0xD2, 0xB7, 0x11, 0xC0, 0x06, 0x11, 0x07, 0x42, 0x54, 0xE5, 0x2B, 0xC8, 0xD5, 0x8C, 0x08, 0x25,
+    0xE1, 0xD0, 0x8D, 0x7E, 0x61, 0x28, 0x79, 0x6A, 0x2B, 0x33, 0xD9, 0xE9, 0x6B, 0x04, 0x95, 0x1E,
+    0xE0, 0xA1, 0xA4, 0x32, 0x71, 0x0E, 0xCD, 0xCB, 0x80, 0xB8, 0x38, 0x79, 0xF0, 0x9E, 0x58, 0x5E,
+    0xF6, 0x35, 0xCC, 0xC5, 0xB9, 0xC7, 0x73, 0xCF, 0x13, 0xEA, 0x77, 0x18, 0xD4, 0x37, 0x46, 0x1B,
+    0x66, 0xED, 0x68, 0xEA, 0x1B, 0x38, 0xCF, 0xAD, 0x64, 0x28, 0x1C, 0x04, 0x81, 0x52, 0x03, 0x8F,
+    0xC7, 0x45, 0xAE, 0x52, 0xD4, 0x23, 0x27, 0xDB, 0x2C, 0x98, 0xE8, 0x74, 0xE6, 0xA7, 0x1E, 0x6E,
+    0x31, 0x10, 0xF5, 0xBB, 0x1A, 0xA0, 0x5F, 0x6C, 0xAE, 0x38, 0xD7, 0xC6, 0xA2, 0x77, 0x6A, 0x47,
+    0x92, 0xC5, 0xC3, 0xE3, 0x12, 0xCE, 0x9A, 0xCB, 0x1F, 0x75, 0xED, 0x1C, 0x16, 0x30, 0xB8, 0xCC,
+    0x4E, 0xB1, 0xA5, 0xCE, 0x85, 0xD3, 0x2E, 0xC1, 0x13, 0x3D, 0x32, 0xBE, 0xBB, 0x22, 0x77, 0x9B,
+    0x13, 0x10, 0x2C, 0x53, 0x96, 0x24, 0x02, 0xA1, 0x6B, 0xB1, 0xEF, 0xC8, 0xE9, 0xF0, 0x2A, 0x87,
+    0xEF, 0xE3, 0xBF, 0xD8, 0xB3, 0x16, 0xC2, 0x6C, 0xFE, 0xC2, 0xAC, 0x91, 0x28, 0x4F, 0x31, 0xA8,
+    0xAF, 0x51, 0x1C, 0xB7, 0x37, 0xA7, 0x6E, 0x77, 0x37, 0x78, 0x2B, 0x74, 0x78, 0xEF, 0x09, 0x9B,
+    0x55, 0x30, 0x4E, 0x23, 0xFE, 0xCE, 0x62, 0xCE, 0x92, 0x38, 0x49, 0x6F, 0x5D, 0xDD, 0xCD, 0x09,
+    0x9E, 0xEB, 0xC5, 0xCC, 0x9B, 0xC2, 0xE4, 0xBF, 0x12, 0x47, 0xFA, 0xA5, 0xB6, 0x89, 0x09, 0x25,
+    0xDA, 0x33, 0x3A, 0xFD, 0x77, 0xB2, 0x7A, 0xB3, 0x77, 0xC1, 0x88, 0x88, 0x8E, 0xC5, 0x81, 0xA6,
+    0x5E, 0x69, 0xE1, 0xA4, 0xB0, 0x4A, 0x99, 0x59, 0xA0, 0xC7, 0x11, 0x9E, 0xBC, 0x63, 0x62, 0x43,
+    0xC0, 0x2C, 0x33, 0x63, 0x6B, 0x51, 0xCE, 0xDC, 0x15, 0x8C, 0x59, 0x46, 0x6D, 0x91, 0x98, 0x1B,
+    0x59, 0xA5, 0x48, 0xF1, 0x04, 0x8E, 0x06, 0xA6, 0x5D, 0x30, 0xB6, 0xAF, 0xBF, 0x84, 0x78, 0x06,
+    0x8B, 0x79, 0x69, 0xB5, 0x19, 0x5A, 0x85, 0xD6, 0xF4, 0x6B, 0xD4, 0x0D, 0x80, 0xDB, 0xCF, 0xC6,
+    0xCA, 0xE1, 0x48, 0x3C, 0x97, 0x19, 0x5E, 0x4B, 0xE6, 0x5C, 0x6D, 0xAF, 0xA0, 0xBE, 0xF6, 0x50,
+    0x4C, 0xE2, 0x58, 0xDD, 0xE7, 0xCD, 0x28, 0x70, 0x54, 0x3B, 0x50, 0x97, 0x20, 0xB1, 0x19, 0xF2,
+    0x09, 0x0B, 0xBB, 0xCF, 0x35, 0xDA, 0x36, 0xAB, 0x12, 0xBA, 0xAF, 0xFF, 0xF4, 0x6C, 0x87, 0xA7,
+    0xB9, 0x7C, 0x02, 0xB7, 0xC7, 0x16, 0x7E, 0x3E, 0xF1, 0x33, 0x9E, 0x60, 0x9C, 0x3F, 0xCC, 0xAC,
+    0x01, 0x4C, 0x13, 0xF0, 0x43, 0xBF, 0x21, 0x60, 0xE9, 0xBA, 0x34, 0x2B, 0x08, 0xD2, 0xFE, 0x0F,
+    0x73, 0x52, 0xAE, 0xA2, 0x54, 0x51, 0x90, 0xD2, 0x9E, 0xE9, 0x62, 0xAC, 0x37, 0x39, 0x2A, 0xAD,
+    0x0A, 0x1C, 0xFE, 0x09, 0x30, 0xDD, 0x9C, 0x2F, 0x52, 0xFD, 0x8F, 0x41, 0xF9, 0xCE, 0xAE, 0xB8,
+    0x66, 0xB6, 0x44, 0x1A, 0x82, 0x53, 0x33, 0x48, 0xA6, 0x8D, 0xEF, 0xE8, 0x80, 0xC3, 0x0E, 0xD7,
+    0x80, 0xC6, 0x13, 0x1F, 0x4C, 0x99, 0x43, 0x56, 0x45, 0x35, 0x54, 0x33, 0x68, 0x1F, 0xEF, 0x7F,
+    0xB2, 0xB1, 0xF5, 0x7E, 0x7E, 0x08, 0xDE, 0xD2, 0x5B, 0x52, 0x89, 0x20, 0xDF, 0xD9, 0x5A, 0x64,
+    0x71, 0x37, 0x79, 0x98, 0x69, 0x10, 0xF6, 0xA2, 0x5F, 0xBE, 0x71, 0x35, 0xE0, 0x88, 0x74, 0x7A,
+    0xB5, 0x81, 0x2E, 0x4E, 0x71, 0x7F, 0x5A, 0x3A, 0x8A, 0xCE, 0xBE, 0xC5, 0x40, 0x8F, 0xC5, 0x2E,
+    0xA5, 0x9A, 0x4D, 0x74, 0xE4, 0x73, 0xC7, 0x96, 0x97, 0x84, 0x7E, 0x90, 0x44, 0x83, 0x24, 0xEE,
+    0x83, 0x42, 0xA3, 0xCC, 0x1C, 0x7A, 0x4D, 0x27, 0x0B, 0x80, 0xD0, 0xA4, 0xAC, 0x9B, 0x1E, 0xCB,
+    0xFC, 0x7F, 0x12, 0x31, 0x41, 0x3D, 0x06, 0x4A, 0xBC, 0xF6, 0x22, 0xF1, 0xC8, 0xF0, 0x9C, 0x1A,
+    0x8D, 0x96, 0x5A, 0xA7, 0xB4, 0x6B, 0x45, 0xBC, 0x4D, 0x32, 0xC1, 0x9C, 0xC6, 0xA0, 0xCE, 0xED,
+    0x7B, 0x97, 0x59, 0x7F, 0x42, 0x32, 0x22, 0xA3, 0x18, 0xFD, 0x65, 0xBC, 0x2C, 0xC3, 0xEA, 0xE8,
+    0xBD, 0xC1, 0xFF, 0xE1, 0x20, 0xAB, 0xC0, 0x6A, 0xDA, 0xF9, 0x3A, 0x85, 0x79, 0x7A, 0x10, 0xB9,
+    0xA0, 0x7A, 0xAA, 0xAD, 0xF1, 0x8D, 0x67, 0x8F, 0x59, 0xE0, 0x10, 0x4A, 0x62, 0xA7, 0xD1, 0x8D,
+    0xF9, 0x26, 0xBE, 0x00, 0x42, 0x81, 0xA0, 0x1F, 0xFF, 0xCE, 0xAE, 0xAF, 0x1C, 0x56, 0x92, 0x48,
+    0x65, 0xE7, 0x2A, 0xC6, 0xE2, 0x78, 0xDE, 0xA2, 0x87, 0x5C, 0x89, 0x3E, 0x38, 0xC4, 0x30, 0xB4,
+    0x07, 0x75, 0x7A, 0x01, 0x76, 0xCD, 0x95, 0xD2, 0xA1, 0x4C, 0x37, 0xB5, 0xA5, 0x2B, 0xE5, 0x09,
+    0x8B, 0x45, 0x5C, 0x77, 0x9F, 0xE8, 0xAB, 0xB9, 0xD6, 0xB0, 0x91, 0x57, 0xA6, 0x9E, 0x5D, 0x01,
+    0xB5, 0xE2, 0xE5, 0x11, 0xC5, 0x77, 0xC1, 0x11, 0x54, 0x97, 0x45, 0x4F, 0x8E, 0x75, 0xB4, 0xA3,
+    0xD7, 0xF4, 0x0F, 0xCC, 0x69, 0xAA, 0xB2, 0xAC, 0xB4, 0x92, 0xD4, 0x66, 0xB8, 0xA1, 0x91, 0xA2,
+    0x74, 0xEF, 0xBE, 0x1D, 0xDF, 0xBD, 0xF9, 0x26, 0x34, 0x1D, 0x71, 0x7C, 0x54, 0x14, 0x42, 0x40,
+    0x94, 0x4B, 0xA2, 0xF2, 0x1C, 0xD6, 0x86, 0x32, 0x22, 0x64, 0xE4, 0x13, 0x8D, 0x6A, 0xA2, 0x1C,
+    0xB0, 0x3F, 0x78, 0xA9, 0x56, 0x61, 0xFB, 0x56, 0xEE, 0x3D, 0x26, 0x2A, 0x1C, 0x7E, 0x4D, 0x22,
+    0xD4, 0xFA, 0xA6, 0xBA, 0x7E, 0x2D, 0x9B, 0x6C, 0xF7, 0x64, 0x20, 0xCA, 0xD6, 0x89, 0x49, 0x92,
+    0xFF, 0x2A, 0xBB, 0xA8, 0x8A, 0xE5, 0x90, 0xEA, 0x20, 0x07, 0xFF, 0xE7, 0xF5, 0xD6, 0x96, 0x77,
+    0xE2, 0xEB, 0xC4, 0xD2, 0x51, 0x19, 0x74, 0x83, 0xE2, 0xA3, 0xC2, 0x77, 0xF9, 0x2E, 0x73, 0x95,
+    0x86, 0x76, 0x82, 0x6F, 0xB6, 0x4A, 0x0B, 0x6A, 0x95, 0xCA, 0xDD, 0x7F, 0x66, 0x17, 0x09, 0xE1,
+    0xD9, 0xD1, 0xA0, 0xE7, 0x25, 0x64, 0xCB, 0xB6, 0x9A, 0x0F, 0x33, 0x0F, 0xFB, 0xB3, 0x52, 0x78,
+    0x00, 0x4E, 0xFB, 0xFF, 0xC9, 0x55, 0x2A, 0x66, 0x8B, 0xC7, 0x9B, 0x4B, 0x94, 0xFB, 0x5E, 0x77,
+    0x54, 0x08, 0x94, 0xC3, 0x7C, 0xFB, 0x63, 0xF0, 0x7C, 0x7C, 0xD5, 0xC4, 0xE2, 0xAE, 0x9F, 0x8E,
+    0x7F, 0xA2, 0x43, 0x10, 0x6E, 0x1C, 0x9C, 0xC7, 0x62, 0x1E, 0x58, 0x87, 0xFE, 0x80, 0x0F, 0x53,
+    0x40, 0x1E, 0xC9, 0xA5, 0xE1, 0xCD, 0xFC, 0x65, 0x75, 0x5B, 0xC8, 0x4B, 0x18, 0x0C, 0x71, 0x70,
+    0xF6, 0x0E, 0x70, 0xE6, 0x9C, 0xE0, 0xF3, 0xFE, 0x2A, 0xA2, 0x58, 0x23, 0x80, 0x85, 0xAD, 0xA0,
+    0x65, 0xA2, 0x62, 0xB6, 0xB5, 0x0A, 0x78, 0x3E, 0xF9, 0x46, 0x85, 0x22, 0xA5, 0xBD, 0x63, 0xB3,
+    0x56, 0x75, 0x99, 0xD6, 0x87, 0xFB, 0x6A, 0xB6, 0xB1, 0x02, 0x3B, 0xB1, 0x10, 0x32, 0x19, 0x71,
+    0x32, 0xD4, 0x12, 0xFB, 0x49, 0xBC, 0x51, 0x09, 0xC7, 0x2F, 0xFF, 0xB8, 0xA2, 0xE3, 0x1D, 0xCA,
+    0x74, 0xC1, 0x41, 0xC3, 0xEF, 0x3F, 0xDC, 0x4D, 0x40, 0xEA, 0xF7, 0xBB, 0x05, 0x91, 0x11, 0x78,
+    0x99, 0xB4, 0xA4, 0xD9, 0x39, 0x17, 0x87, 0xDF, 0x25, 0xDB, 0xE0, 0x73, 0xA6, 0xE9, 0x3D, 0x27,
+    0x44, 0xCD, 0x4F, 0xB1, 0x8E, 0x1A, 0x90, 0x94, 0x07, 0xC9, 0x3E, 0x93, 0x46, 0xDB, 0x05, 0x06,
+    0xF8, 0x64, 0x5D, 0x78, 0xBF, 0x7D, 0x73, 0x59, 0x69, 0x5C, 0x6C, 0x1A, 0xE1, 0x86, 0x9E, 0x69,
+    0x3C, 0x3B, 0x51, 0x09, 0xE6, 0x43, 0xD3, 0x2B, 0xA8, 0x47, 0x37, 0xAE, 0x9C, 0xBA, 0x6C, 0x3C,
+    0x2C, 0x46, 0x60, 0x24, 0x69, 0xE8, 0xCE, 0xF5, 0x40, 0xCA, 0x72, 0x7E, 0x2E, 0xAA, 0x6F, 0x60,
+    0x7E, 0x79, 0x53, 0xFC, 0x09, 0x30, 0x3E, 0x2D, 0x60, 0x21, 0xBA, 0x68, 0x54, 0x49, 0x91, 0x76,
+    0x53, 0x60, 0x23, 0xE5, 0xC8, 0x9B, 0xA4, 0x4C, 0x64, 0xD5, 0x02, 0x46, 0x95, 0xD9, 0x72, 0x3C,
+    0x30, 0xE8, 0xF1, 0x53, 0x53, 0xC7, 0x8E, 0x90, 0xF4, 0x34, 0xF3, 0x0C, 0x3F, 0x72, 0xCA, 0x1D,
+    0x75, 0x72, 0xBE, 0x46, 0x8A, 0xC0, 0xD3, 0x06, 0x93, 0x72, 0xB0, 0xBF, 0xD0, 0x77, 0x99, 0x06,
+    0x7B, 0xDF, 0x6F, 0x10, 0xFB, 0xC6, 0x1D, 0x55, 0x66, 0x2F, 0x81, 0x83, 0x72, 0x3F, 0x30, 0x60,
+    0xFA, 0x34, 0xE9, 0xCF, 0xB3, 0x0F, 0x95, 0xBD, 0xE4, 0x9F, 0xDF, 0x53, 0x6E, 0x00, 0xC9, 0x07,
+    0x7E, 0x9B, 0x79, 0xBD, 0xD2, 0xE2, 0x77, 0x80, 0xB4, 0xF3, 0x9A, 0x46, 0x20, 0x8C, 0x21, 0x0A,
+    0xEA, 0xFE, 0x07, 0x61, 0x58, 0xB8, 0x38, 0x47, 0xF5, 0x75, 0x5B, 0x33, 0x78, 0x9E, 0x66, 0xDF,
+    0x30, 0xAD, 0xD8, 0xED, 0x5D, 0x73, 0x75, 0x6D, 0x4E, 0x63, 0x8B, 0x35, 0x4F, 0xCA, 0x75, 0x58,
+    0xDB, 0xEA, 0x2A, 0xE2, 0xB1, 0xE1, 0x15, 0x6C, 0x69, 0x46, 0xC8, 0xD9, 0x67, 0x15, 0x4B, 0xCE,
+    0xB4, 0x04, 0x9B, 0x9D, 0xCA, 0xB7, 0x5E, 0x4B, 0xA3, 0x6C, 0xD1, 0xFF, 0x4A, 0x71, 0x71, 0x9C,
+    0x11, 0x87, 0x5E, 0x9E, 0x5D, 0xA9, 0x05, 0x1F, 0xD8, 0x96, 0xA9, 0x3F, 0xFA, 0xEB, 0x0A, 0x91,
+    0x44, 0xDD, 0xCF, 0x93, 0xD5, 0x0A, 0x80, 0x9C, 0xA8, 0xCB, 0x2A, 0x7F, 0x03, 0x45, 0x43, 0xA7,
+    0xC3, 0x59, 0xFF, 0xFC, 0xFF, 0x44, 0x24, 0xB1, 0x02, 0xBB, 0x42, 0xCF, 0x45, 0xC9, 0xF4, 0xAE,
+    0x23, 0x5D, 0xB2, 0x0B, 0xDE, 0xAD, 0x7E, 0xD6, 0x1C, 0x75, 0xFE, 0x90, 0xCF, 0x49, 0xB1, 0x51,
+    0x36, 0x3A, 0x48, 0xD2, 0xCE, 0xAA, 0x40, 0x2D, 0xE9, 0x70, 0x85, 0xCC, 0x66, 0xB5, 0x2A, 0x85,
+    0xA2, 0x1E, 0x18, 0x18, 0xA7, 0x6A, 0x89, 0x39, 0x1E, 0x56, 0x7E, 0xA7, 0xC7, 0x9F, 0x9B, 0xFA,
+    0x58, 0x4A, 0x08, 0x0E, 0x78, 0x81, 0x84, 0xB3, 0x66, 0xA4, 0x8B, 0x20, 0xF2, 0xB0, 0x48, 0xA4,
+    0xE4, 0xA1, 0xC2, 0x05, 0xB7, 0x19, 0xFE, 0x71, 0xEF, 0xCB, 0x30, 0x8C, 0xC2, 0x3B, 0xE4, 0x78,
+    0x1C, 0x92, 0x51, 0x96, 0xC1, 0x89, 0xA3, 0x71, 0x9A, 0x6D, 0xF5, 0x35, 0xA6, 0xEE, 0x71, 0xE2,
+    0x12, 0x55, 0x88, 0x61, 0x10, 0x50, 0x47, 0x53, 0x3D, 0xBA, 0x0F, 0x6A, 0xE9, 0x5C, 0x8B, 0x0F,
+    0x8B, 0xAC, 0xCD, 0x20, 0xAE, 0x5B, 0x9A, 0x80, 0xB4, 0x9C, 0x27, 0x5D, 0x47, 0xD6, 0x03, 0xFE,
+    0x68, 0x38, 0xBC, 0x34, 0x1B, 0xFD, 0x62, 0xCF, 0x9A, 0xC0, 0xC9, 0x7C, 0xAB, 0xF5, 0x85, 0x1D,
+    0x81, 0x41, 0x6D, 0xB3, 0x62, 0x72, 0x4A, 0x6F, 0xDD, 0xA8, 0xB4, 0xAE, 0xEA, 0xE0, 0xED, 0x57,
+    0x82, 0x0A, 0x7E, 0xD1, 0x3B, 0x7E, 0xA5, 0x43, 0x9E, 0x5F, 0x73, 0x92, 0xEF, 0xAA, 0xC5, 0xAB,
+    0xA9, 0x07, 0xD5, 0xB5, 0x32, 0x9E, 0xD3, 0x66, 0xA3, 0x98, 0xDC, 0xF5, 0x12, 0xB6, 0x89, 0xE0,
+    0x58, 0xE3, 0x26, 0x62, 0xDC, 0xA2, 0xB9, 0x58, 0x7C, 0x42, 0xA7, 0xFB, 0x9E, 0x12, 0xD9, 0x50,
+    0x55, 0xFD, 0x64, 0xC7, 0xFC, 0xA1, 0x12, 0x98, 0x43, 0xEE, 0x62, 0xBC, 0x75, 0x3B, 0x5D, 0xE1,
+    0xFF, 0xAF, 0x29, 0x4D, 0x81, 0x6A, 0xB2, 0x13, 0x2D, 0xE9, 0x9C, 0x65, 0x90, 0x1A, 0xBE, 0x06,
+    0x69, 0x9D, 0xC7, 0xF5, 0x98, 0xEB, 0xA4, 0x13, 0x67, 0xDD, 0xA4, 0x7E, 0x23, 0x56, 0x92, 0x31,
+    0x62, 0xA3, 0xDD, 0x7B, 0xB9, 0x1C, 0xD1, 0x0E, 0xEF, 0x1A, 0xB5, 0x94, 0xF4, 0x10, 0xD4, 0x21,
+    0x76, 0x14, 0xC1, 0x2D, 0x5C, 0x2F, 0x71, 0x86, 0x94, 0x84, 0x41, 0x6A, 0x1F, 0xA2, 0x75, 0xFF,
+    0x34, 0x0B, 0xCA, 0xD4, 0x11, 0x7F, 0xB7, 0xD0, 0xAB, 0x7E, 0xB9, 0x13, 0x26, 0x1B, 0x60, 0x48,
+    0x62, 0x2A, 0xF7, 0x18, 0x24, 0xDF, 0x51, 0x6B, 0x34, 0x61, 0x99, 0x27, 0x03, 0x95, 0x6C, 0xAA,
+    0x81, 0xFA, 0x94, 0xAB, 0x9E, 0x34, 0xA5, 0xC5, 0x8C, 0xA6, 0x6A, 0x43, 0x2D, 0x5F, 0x99, 0xE5,
+    0x00, 0xE5, 0x51, 0x71, 0x19, 0xA6, 0xF5, 0x36, 0x1E, 0x21, 0xF2, 0x26, 0xE4, 0x7A, 0x18, 0x76,
+    0x10, 0xE9, 0xE0, 0x9E, 0x54, 0x2D, 0xFA, 0x83, 0x9F, 0x41, 0x7C, 0x0E, 0xA7, 0xC9, 0xDD, 0x58,
+    0x73, 0x18, 0xCB, 0x26, 0x60, 0xE8, 0x90, 0xC1, 0x4D, 0x0B, 0x01, 0x01, 0xD8, 0x57, 0xED, 0x78,
+    0xF9, 0x28, 0x0D, 0xA7, 0x1F, 0x66, 0x99, 0x0A, 0x17, 0x8C, 0xA7, 0xC1, 0xD2, 0x51, 0x4C, 0x2E,
+    0x7C, 0x3F, 0xE0, 0x2F, 0x66, 0x6D, 0x68, 0x2B, 0xE0, 0x17, 0x2F, 0x21, 0xE5, 0x4A, 0xD9, 0x46,
+    0x39, 0xA4, 0xD5, 0x2E, 0xF7, 0x6F, 0xAD, 0xA9, 0x13, 0xAE, 0x97, 0xF3, 0xFC, 0xCE, 0xDA, 0x4C,
+    0x35, 0xF1, 0x19, 0xCC, 0x27, 0xA4, 0x5C, 0xF9, 0xDD, 0x19, 0x84, 0xF2, 0x35, 0xDD, 0x3D, 0x7A,
+    0xD0, 0x9F, 0xA5, 0x81, 0xFB, 0x66, 0x6E, 0x71, 0x83, 0x88, 0x47, 0xA5, 0xF7, 0xE8, 0x19, 0x5B,
+    0x93, 0xE0, 0x1A, 0xE4, 0xED, 0x56, 0xC5, 0xCC, 0x8D, 0xCB, 0x50, 0x41, 0x0B, 0xEA, 0x2D, 0x2F,
+    0xBA, 0x8A, 0xA3, 0x64, 0x46, 0x5F, 0x27, 0x22, 0x17, 0xD9, 0xCC, 0xD6, 0xAD, 0x32, 0xE6, 0x19,
+    0x35, 0xD2, 0x3C, 0x54, 0xB5, 0x14, 0xC8, 0x3C, 0x65, 0x9F, 0xA4, 0x2A, 0x44, 0xBA, 0xF3, 0xE5,
+    0xBA, 0x10, 0x3B, 0xD6, 0x67, 0xFB, 0x94, 0x99, 0x9A, 0xD7, 0x37, 0x96, 0xC6, 0x6B, 0xD7, 0xBA,
+    0x58, 0x82, 0xED, 0x49, 0xD8, 0x6A, 0x58, 0xDB, 0x04, 0x78, 0x62, 0x8D, 0x30, 0xCA, 0xA0, 0xB8,
+    0xDE, 0xCD, 0x06, 0x7D, 0xF3, 0xE8, 0xF8, 0x54, 0xD7, 0xD4, 0x8D, 0xFB, 0xD0, 0xB9, 0x08, 0xE3,
+    0xCE, 0x81, 0x7C, 0xCF, 0x71, 0x41, 0x03, 0x1B, 0x9A, 0xED, 0x5C, 0x71, 0xB5, 0x7B, 0x56, 0xDC,
+    0x0B, 0x1F, 0xF1, 0xAF, 0x55, 0xE2, 0x37, 0x44, 0x42, 0x69, 0x27, 0xDB, 0xCE, 0x5E, 0xC1, 0x8A,
+    0x20, 0x30, 0xBD, 0x7F, 0x71, 0x2C, 0x1A, 0x26, 0x7C, 0xF8, 0xEF, 0x72, 0x6B, 0x87, 0xB7, 0x13,
+    0x9B, 0x39, 0xBC, 0xBD, 0x67, 0xEC, 0x54, 0xA9, 0xB0, 0x5C, 0x11, 0xC3, 0x60, 0xA7, 0x2F, 0x6D,
+    0xBC, 0xEB, 0x99, 0x82, 0x47, 0xEE, 0xD4, 0xEE, 0x85, 0xA5, 0xF6, 0xEB, 0x59, 0xA1, 0xC0, 0x0E,
+    0xC1, 0x1C, 0x1B, 0x9F, 0xC7, 0xAD, 0xF1, 0x1C, 0x35, 0x77, 0x06, 0x42, 0xD7, 0xB2, 0x98, 0x0D,
+    0x86, 0xF1, 0x71, 0x93, 0xED, 0x29, 0x10, 0xC1, 0x64, 0xA1, 0x0D, 0x5F, 0x21, 0x8E, 0x9B, 0x7B,
+    0x16, 0xF8, 0xAA, 0x6E, 0x39, 0x38, 0x71, 0xB0, 0xDA, 0x6F, 0xF7, 0x74, 0xBD, 0xAB, 0xF2, 0x4C,
+    0xB2, 0x9E, 0x1E, 0x1D, 0xB0, 0x75, 0x97, 0xD3, 0x22, 0x03, 0x3D, 0xB9, 0x24, 0x16, 0x16, 0x88,
+    0x95, 0x17, 0x9D, 0x67, 0x19, 0xC1, 0x6F, 0x40, 0xC2, 0x61, 0x52, 0xC8, 0x27, 0x39, 0x75, 0xE5,
+    0x93, 0xD5, 0x71, 0x89, 0x3E, 0x79, 0x08, 0x49, 0x4B, 0x02, 0xD9, 0x8D, 0xD8, 0x5B, 0x19, 0x35,
+    0x34, 0x5F, 0x32, 0x68, 0x0A, 0xBA, 0xEA, 0x9C, 0xB3, 0x21, 0x25, 0x29, 0x3F, 0xA5, 0x11, 0xF8,
+    0x78, 0xA9, 0x6E, 0xED, 0x7E, 0x20, 0xC3, 0xA5, 0xC7, 0x56, 0xCE, 0x29, 0x4E, 0xC0, 0xA5, 0x04,
+    0x73, 0x2A, 0xE3, 0x22, 0xF8, 0x30, 0xE5, 0x1D, 0x0C, 0x76, 0x00, 0xF6, 0x8F, 0xEC, 0x70, 0x65,
+    0x18, 0x64, 0xCD, 0x20, 0x37, 0x35, 0x43, 0xA2, 0xF0, 0x67, 0x2D, 0xDE, 0x49, 0xE3, 0x7A, 0x66,
+    0x5A, 0x01, 0x87, 0x31, 0xD8, 0x77, 0x85, 0x39, 0x6D, 0xBC, 0x5A, 0xF3, 0x8B, 0x5C, 0x7C, 0x8F,
+    0xD8, 0x6A, 0x98, 0xE6, 0x8C, 0x80, 0x3A, 0x44, 0x9B, 0x44, 0xFC, 0xA1, 0x13, 0xF9, 0xA6, 0x26,
+    0x1D, 0xC2, 0xF8, 0x49, 0x98, 0x97, 0x49, 0xEF, 0x28, 0x55, 0x0A, 0x0B, 0x0B, 0x3E, 0x12, 0x20,
+    0x3E, 0x25, 0x57, 0xC0, 0xB4, 0xB1, 0xD8, 0x87, 0x33, 0xB7, 0xB4, 0xD8, 0x99, 0x86, 0x85, 0xB1,
+    0xCD, 0xB0, 0x36, 0xC1, 0xFD, 0x1D, 0x6E, 0x5E, 0x6C, 0x65, 0x28, 0x34, 0x13, 0x2C, 0x65, 0x91,
+    0x98, 0x46, 0xCF, 0x26, 0x66, 0x06, 0x35, 0x10, 0xE4, 0x82, 0x89, 0x2E, 0xE2, 0x62, 0x6C, 0xAA,
+    0x2B, 0x97, 0xAC, 0x23, 0x67, 0x50, 0xE1, 0x88, 0xE2, 0xC2, 0x02, 0xCC, 0x8C, 0x93, 0xAC, 0x46,
+    0xB1, 0x0D, 0x4B, 0x63, 0x53, 0xC6, 0x75, 0x17, 0xA7, 0x68, 0x98, 0xA5, 0x8D, 0x44, 0x48, 0x9D,
+    0x7C, 0xEB, 0x78, 0x05, 0x93, 0x30, 0x6E, 0x17, 0xDF, 0x1C, 0x35, 0xED, 0x6A, 0x7A, 0x52, 0x31,
+    0x27, 0x2F, 0x82, 0xDD, 0x8D, 0x46, 0x18, 0xCE, 0xFF, 0x13, 0xF6, 0x62, 0x3E, 0xB1, 0xBC, 0xE5,
+    0xF7, 0x8E, 0xA2, 0x04, 0x22, 0x3D, 0xFC, 0xA7, 0x0D, 0xCE, 0x94, 0x2C, 0x48, 0xA2, 0x78, 0x7F,
+    0x22, 0xBF, 0x08, 0x69, 0xDE, 0x89, 0x5F, 0x56, 0xE4, 0x88, 0xDB, 0xA1, 0x07, 0xD6, 0x6E, 0xCE,
+    0x50, 0xF0, 0xEE, 0x31, 0x52, 0x69, 0xD3, 0x85, 0x22, 0x96, 0x91, 0xA4, 0x71, 0xA5, 0xB8, 0x7C,
+    0x0A, 0x8D, 0x59, 0x1F, 0x48, 0x2A, 0xFA, 0xDC, 0x94, 0x6E, 0x31, 0x92, 0x80, 0x4A, 0x05, 0xE4,
+    0x00, 0x02, 0x19, 0x23, 0xDD, 0xA6, 0x10, 0x03, 0x6B, 0x3D, 0xC2, 0xAE, 0x3C, 0x84, 0x44, 0x84,
+    0x9B, 0xC9, 0x7F, 0x6D, 0xA1, 0xBE, 0xE8, 0xE9, 0x8E, 0x43, 0x17, 0x18, 0x85, 0x14, 0x6C, 0x3E,
+    0xB2, 0xB8, 0x83, 0xFF, 0xA8, 0xE0, 0xF3, 0x9C, 0xA4, 0x74, 0xA2, 0x7D, 0x82, 0x58, 0xAB, 0x0B,
+    0xD2, 0xC8, 0x07, 0x29, 0x8D, 0x66, 0xCD, 0x86, 0xFC, 0xF0, 0x71, 0x7A, 0x6A, 0xF4, 0xC4, 0xD7,
+    0xEA, 0x34, 0xB8, 0xF7, 0xCC, 0xF7, 0x8F, 0x27, 0xB1, 0xA7, 0x3D, 0x33, 0xFE, 0x2F, 0xA1, 0x80,
+    0x59, 0xE9, 0x0A, 0xF5, 0x3B, 0xEB, 0x84, 0x65, 0x36, 0xCC, 0x16, 0x49, 0xD8, 0xCE, 0x64, 0x22,
+    0x12, 0xDA, 0x04, 0x20, 0x16, 0x85, 0x82, 0xC3, 0x5D, 0x17, 0xE2, 0x01, 0xFB, 0xB9, 0x83, 0x52,
+    0x52, 0x50, 0x3B, 0x70, 0x07, 0x87, 0xD5, 0x2E, 0xC1, 0x09, 0x06, 0x3B, 0xCD, 0x5A, 0xF8, 0x93,
+    0xA0, 0xD6, 0x67, 0x72, 0xD3, 0x0A, 0x24, 0xB8, 0x4D, 0x98, 0xE9, 0xB4, 0x3F, 0xDA, 0xB5, 0xA4,
+    0x32, 0x7D, 0x8B, 0x27, 0xF3, 0xA0, 0x81, 0x73, 0x18, 0x2A, 0xE0, 0x5B, 0x09, 0x5F, 0x0D, 0xE6,
+    0xE9, 0x30, 0x7F, 0x00, 0x33, 0xE5, 0xE3, 0x2B, 0x05, 0x5D, 0x29, 0x9B, 0xA2, 0x90, 0xEE, 0x09,
+    0x04, 0x62, 0x07, 0x34, 0x8D, 0x95, 0x00, 0x17, 0x56, 0x88, 0x05, 0xD2, 0x8E, 0x3F, 0x49, 0x74,
+    0xD7, 0x59, 0x69, 0x93, 0xE2, 0x8C, 0xA1, 0xC9, 0x0D, 0xE7, 0x3B, 0x51, 0xB8, 0xE4, 0xA8, 0x77,
+    0x58, 0x7A, 0xC2, 0xC7, 0x56, 0x01, 0x0C, 0x0D, 0x5C, 0x1F, 0x00, 0x4D, 0x36, 0x74, 0x2A, 0xA1,
+    0xD8, 0x00, 0xC2, 0xAC, 0x61, 0xAC, 0xAC, 0xC8, 0xA4, 0x0F, 0xE5, 0x8C, 0xCF, 0x9C, 0x2F, 0x93,
+    0x1A, 0x4A, 0xD9, 0x96, 0x87, 0x31, 0x42, 0x5C, 0x59, 0x16, 0x89, 0xC4, 0xD5, 0x80, 0x0F, 0xD1,
+    0x2E, 0x43, 0x4E, 0x8A, 0xEE, 0x55, 0x49, 0x32, 0x14, 0x31, 0xD4, 0x5E, 0x58, 0x4E, 0xE9, 0x9A,
+    0xE3, 0xC2, 0x7C, 0x0E, 0x62, 0xFF, 0xD4, 0x93, 0xFA, 0xF3, 0x16, 0x7D, 0x35, 0xF8, 0x7A, 0x1D,
+    0x2E, 0x4C, 0x14, 0xEC, 0xE8, 0xFB, 0x2A, 0x77, 0x1D, 0x78, 0xCB, 0xE0, 0xC8, 0x50, 0xEB, 0x90,
+    0x87, 0xEE, 0xA4, 0xFC, 0xB4, 0x1B, 0x10, 0x11, 0x45, 0x95, 0x26, 0x4F, 0xCD, 0xDC, 0x3E, 0x16,
+    0x53, 0xBB, 0x84, 0x5C, 0x97, 0x5D, 0x72, 0xBB, 0x96, 0xD1, 0x72, 0x08, 0x0E, 0xAB, 0xA2, 0x40,
+    0x61, 0x84, 0x4F, 0x09, 0x1A, 0x53, 0xD8, 0x32, 0xEB, 0x48, 0xEC, 0x72, 0x6E, 0x5D, 0x59, 0x48,
+    0x69, 0x57, 0xD4, 0x0F, 0xA9, 0xA0, 0x19, 0x4F, 0x3C, 0xBB, 0x5C, 0x97, 0xF4, 0xF1, 0x48, 0x10,
+    0x4D, 0xC1, 0x74, 0xCB, 0x61, 0x4F, 0xDE, 0x8E, 0x04, 0x28, 0xF2, 0xFC, 0x43, 0xDD, 0x7D, 0x1A,
+    0x30, 0xA5, 0xED, 0xF8, 0x01, 0x70, 0x73, 0xAE, 0x5F, 0x40, 0xA6, 0x83, 0xF0, 0x59, 0xE2, 0xFB,
+    0xE3, 0x43, 0xA2, 0x54, 0x7A, 0x9E, 0xE2, 0xED, 0xF1, 0xD4, 0x82, 0x14, 0xB3, 0x89, 0x5A, 0xAE,
+    0xAB, 0x83, 0x37, 0x73, 0x14, 0xE0, 0x48, 0x37, 0x38, 0xA2, 0x2B, 0x6D, 0x26, 0x9A, 0xD7, 0x40,
+    0x6E, 0x29, 0xB4, 0x1A, 0xD4, 0x82, 0x07, 0x16, 0xC0, 0x0C, 0xAE, 0x4A, 0xA5, 0xB3, 0x08, 0xBD,
+    0x3C, 0x78, 0xC9, 0x67, 0x3E, 0x3D, 0x85, 0x38, 0xC4, 0x49, 0x03, 0x1C, 0xE6, 0x92, 0x77, 0x5D,
+    0xD3, 0xEC, 0x54, 0x7D, 0x18, 0x1F, 0x05, 0xF3, 0xBB, 0x7D, 0xD2, 0xBC, 0xB8, 0x4D, 0xD0, 0x6E,
+    0xD5, 0x0A, 0x52, 0x4F, 0x7A, 0x29, 0x4A, 0x2C, 0xDC, 0x61, 0x5D, 0x44, 0xEA, 0xD7, 0x89, 0x4D,
+    0x89, 0xB0, 0x0D, 0x44, 0xC9, 0x4E, 0xCF, 0xD9, 0xE2, 0xFA, 0xC8, 0xA3, 0xB8, 0x2A, 0x2D, 0x3D,
+    0x26, 0x63, 0x0D, 0xB5, 0x28, 0x2A, 0xA0, 0x2D, 0x2F, 0xC5, 0x7B, 0xE8, 0xC4, 0x59, 0x7C, 0xEA,
+    0xFC, 0x2E, 0x3F, 0xE1, 0x73, 0xF1, 0x38, 0xA6, 0xC0, 0x3E, 0x78, 0x69, 0xF6, 0x77, 0x64, 0x16,
+    0x52, 0x3A, 0x0D, 0x1F, 0x33, 0x3E, 0xE6, 0x68, 0x9B, 0x32, 0x5E, 0xD6, 0x04, 0xB1, 0x86, 0x0D,
+    0x61, 0x44, 0xB9, 0xF4, 0x2F, 0xFC, 0x53, 0x78, 0xFA, 0xB9, 0x2E, 0x37, 0x42, 0x41, 0xC1, 0x2E,
+    0x3D, 0xBF, 0xA9, 0x2C, 0x6D, 0x49, 0x44, 0x0D, 0x7D, 0x0C, 0xD1, 0x91, 0xFF, 0xE7, 0x02, 0x6C,
+    0x20, 0xB8, 0xE3, 0xF5, 0xD7, 0x3F, 0x6A, 0x5A, 0xFB, 0xA9, 0x24, 0x38, 0x06, 0x15, 0x22, 0xAE,
+    0xFA, 0x4C, 0xCD, 0x94, 0xDC, 0x1C, 0x3D, 0x74, 0x15, 0x88, 0x3E, 0xD3, 0x40, 0x8D, 0x5E, 0xA1,
+    0xD5, 0x4B, 0x25, 0x5F, 0xE6, 0x06, 0x91, 0x69, 0x1A, 0xB9, 0x70, 0x79, 0x0B, 0x67, 0xAD, 0xF9,
+    0xB8, 0x0E, 0xCC, 0x6F, 0x2A, 0x3A, 0x89, 0x14, 0x48, 0x07, 0x69, 0x43, 0x4E, 0xAA, 0x21, 0xB0,
+    0x55, 0xDC, 0xC1, 0x9F, 0x36, 0x39, 0x29, 0x36, 0x4B, 0x33, 0x84, 0x35, 0x1D, 0x13, 0xF5, 0x4F,
+    0x46, 0x65, 0x30, 0xD9, 0xFB, 0xC9, 0x43, 0xAB, 0x54, 0x27, 0x77, 0x4F, 0xC7, 0x70, 0x35, 0x75,
+    0xBF, 0xF5, 0x69, 0x65, 0x93, 0xB8, 0x27, 0x07, 0x12, 0x6F, 0x34, 0xE5, 0x6F, 0x31, 0x80, 0xD5,
+    0xCD, 0x0D, 0x26, 0x2E, 0xC7, 0xB3, 0xF4, 0x62, 0x79, 0x5C, 0x20, 0x97, 0xB5, 0x17, 0x46, 0x8A,
+    0xFE, 0xC4, 0x11, 0xBC, 0x7E, 0x6C, 0xFF, 0xF5, 0x5D, 0x08, 0x9F, 0xE8, 0x5A, 0x6D, 0x79, 0x22,
+    0x0F, 0xFD, 0x0A, 0xB6, 0x76, 0xC7, 0x28, 0x43, 0x61, 0x74, 0x69, 0x7B, 0x82, 0xCF, 0x3A, 0xB2,
+    0xC7, 0x56, 0x51, 0x6D, 0xE3, 0x6C, 0x5A, 0x7C, 0x38, 0x52, 0xAF, 0x56, 0x71, 0xBD, 0x1E, 0xB6,
+    0x4D, 0x77, 0x43, 0xD9, 0x76, 0x9B, 0xF7, 0xD2, 0x5E, 0xD5, 0xAF, 0x39, 0xAA, 0x14, 0x74, 0xAF,
+    0xB1, 0x15, 0x5C, 0xA9, 0x11, 0x3C, 0x62, 0xA9, 0xA7, 0x92, 0xB6, 0x4F, 0x95, 0xCD, 0x26, 0x1A,
+    0x75, 0x23, 0x4F, 0x55, 0x29, 0x7E, 0x5E, 0xDC, 0x04, 0x57, 0x70, 0xC4, 0x4D, 0xEB, 0x7F, 0x51,
+    0xB7, 0x99, 0x0D, 0x20, 0x92, 0xA4, 0xC8, 0x88, 0x7B, 0x6D, 0xB4, 0xC8, 0x1C, 0x19, 0x36, 0xC7,
+    0xD2, 0xFA, 0xC1, 0x9B, 0x92, 0x16, 0x79, 0xAD, 0x88, 0x9A, 0xCB, 0x31, 0xA4, 0x92, 0xA8, 0xBC,
+    0xF5, 0x46, 0xE3, 0x71, 0xC4, 0xE8, 0x63, 0xF5, 0x89, 0x68, 0x2A, 0x21, 0x41, 0x46, 0x81, 0x7A,
+    0x99, 0xAC, 0x04, 0xDD, 0x18, 0x91, 0x4E, 0x3D, 0x02, 0x06, 0x8B, 0x8A, 0x6F, 0x47, 0x3A, 0xA5,
+    0xD5, 0x75, 0xE0, 0x8E, 0x81, 0xB8, 0x36, 0x3D, 0xA0, 0x35, 0x20, 0x5F, 0x0B, 0x96, 0x8E, 0xD8,
+    0x1D, 0x56, 0x2F, 0x14, 0x81, 0xE1, 0x40, 0x30, 0x79, 0x84, 0x7D, 0x49, 0x83, 0x71, 0xBA, 0xDC,
+    0x14, 0x0B, 0x64, 0xFC, 0x52, 0xD8, 0xBE, 0x3F, 0x35, 0x74, 0x4C, 0x64, 0x15, 0x8D, 0x84, 0xF4,
+    0xB5, 0x9D, 0xF9, 0x14, 0x35, 0xC9, 0x71, 0x69, 0x1C, 0x1A, 0x5D, 0x99, 0xA4, 0x41, 0xFF, 0x3B,
+    0x98, 0x30, 0x64, 0xCE, 0xF3, 0xB3, 0xA9, 0xF7, 0xF0, 0xAA, 0xB2, 0x73, 0xF2, 0x29, 0x01, 0x95,
+    0x6C, 0xF8, 0x14, 0x21, 0x1B, 0x6E, 0x58, 0xD4, 0x9E, 0x7A, 0x62, 0x82, 0xB7, 0xD7, 0xB3, 0xEE,
+    0xEB, 0x3F, 0x3D, 0x3D, 0x52, 0x9F, 0xA9, 0x15, 0x5D, 0xB4, 0xB0, 0x6D, 0x17, 0xC8, 0x5C, 0x5F,
+    0xF7, 0x55, 0xB1, 0xA9, 0xA5, 0x25, 0xEF, 0x89, 0xE2, 0x7F, 0xBA, 0xAA, 0xDD, 0x40, 0x54, 0x6F,
+    0x6E, 0x86, 0x27, 0x24, 0x3B, 0x18, 0x49, 0xE6, 0xD3, 0x6B, 0xDD, 0x44, 0xC0, 0x94, 0xB0, 0x1D,
+    0x32, 0xDE, 0x5B, 0x3E, 0xEA, 0x72, 0xB4, 0x01, 0xA1, 0xE4, 0x58, 0x52, 0x26, 0xD7, 0x6F, 0xC7,
+    0x86, 0x7A, 0xB7, 0x41, 0xC2, 0xB0, 0x55, 0x55, 0x8F, 0x1F, 0xA2, 0x43, 0x60, 0x2E, 0x5A, 0x53,
+    0xBF, 0xA8, 0xAC, 0xD6, 0x63, 0xA8, 0x0E, 0x2A, 0xA0, 0x4F, 0x8A, 0xF3, 0xF9, 0xF6, 0x1C, 0xC1,
+    0x1A, 0x0A, 0x3D, 0x16, 0x2F, 0xF5, 0x8A, 0x6F, 0xEF, 0x41, 0x08, 0xAA, 0x5C, 0xFE, 0xFF, 0x4A,
+    0xFE, 0x9D, 0x36, 0x1B, 0xDE, 0x4C, 0x36, 0x9E, 0x57, 0x0F, 0x4C, 0xD7, 0xFC, 0x8B, 0x03, 0x7E,
+    0xFB, 0x59, 0x34, 0xBB, 0x1C, 0x8D, 0xCF, 0x59, 0x9D, 0x4C, 0xA4, 0x26, 0xD3, 0x68, 0x35, 0xCE,
+    0x80, 0xCD, 0xDB, 0x6D, 0xE0, 0x02, 0x5A, 0xAE, 0x64, 0xD9, 0x9E, 0x44, 0x74, 0x08, 0x71, 0x5E,
+    0x6D, 0x95, 0x0A, 0x60, 0x75, 0xAA, 0xA7, 0xB5, 0xD7, 0x75, 0x5E, 0xD3, 0x05, 0xA3, 0x50, 0xA1,
+    0x32, 0x13, 0x8C, 0x29, 0x81, 0x45, 0x7A, 0x38, 0x61, 0xB5, 0xD0, 0x4C, 0xB5, 0x95, 0xD7, 0x92,
+    0x58, 0x8C, 0xF8, 0x0B, 0x9D, 0x7C, 0x33, 0x35, 0xAE, 0x8E, 0x69, 0x48, 0x0F, 0x03, 0x75, 0x81,
+    0x78, 0xE8, 0x91, 0x0D, 0xEF, 0x84, 0x91, 0x53, 0xF1, 0xE6, 0xED, 0xC1, 0xD7, 0x1D, 0xD3, 0xE0,
+    0x73, 0x9E, 0x94, 0xD5, 0x68, 0xE9, 0xBD, 0x13, 0xA6, 0x22, 0x76, 0x19, 0x5F, 0x2D, 0xAC, 0xF9,
+    0xD6, 0x06, 0x88, 0x1E, 0x5B, 0xA5, 0x00, 0x67, 0x6F, 0x0D, 0xD2, 0xF3, 0x5D, 0x8D, 0x06, 0x90,
+    0xD1, 0xF7, 0xBE, 0x39, 0x19, 0xD5, 0x9E, 0x60, 0x6B, 0xD4, 0x51, 0xE6, 0x46, 0xB2, 0x96, 0xC4,
+    0x01, 0xC3, 0xD2, 0xA5, 0x3D, 0xCD, 0x4F, 0x9C, 0xBD, 0x3D, 0xC3, 0x0F, 0x1E, 0x94, 0xA8, 0xFD,
+    0x26, 0xA9, 0x9C, 0x4C, 0xA4, 0xF8, 0xBC, 0xD8, 0xB1, 0xC7, 0xFE, 0x5F, 0x8B, 0xF2, 0x60, 0x37,
+    0x6D, 0xF9, 0x62, 0xEF, 0xAE, 0xAD, 0x19, 0x69, 0xAF, 0x20, 0x26, 0x41, 0x60, 0xEC, 0x8D, 0x32,
+    0x6B, 0x3B, 0xA3, 0xA2, 0x67, 0xB0, 0x6D, 0xA3, 0x48, 0x8A, 0xAA, 0x03, 0xD3, 0xE4, 0xE7, 0x76,
+    0xA0, 0x8C, 0xBE, 0x53, 0xF3, 0x2E, 0x96, 0x1A, 0xEB, 0x1E, 0x38, 0x47, 0x29, 0x64, 0x8F, 0xDB,
+    0x15, 0xAA, 0xFF, 0xE6, 0xC0, 0x16, 0x22, 0xD8, 0x95, 0x36, 0x56, 0x28, 0x5B, 0x90, 0x0C, 0x8C,
+    0xF3, 0x03, 0x01, 0xA3, 0x53, 0x17, 0x62, 0x0C, 0xB6, 0xDC, 0x65, 0xE4, 0x70, 0x49, 0xD2, 0x76,
+    0x85, 0x47, 0x90, 0x8B, 0x84, 0xF4, 0x00, 0x13, 0x0A, 0xB6, 0x3F, 0xF4, 0x3E, 0x67, 0x1A, 0x11,
+    0xFF, 0xA5, 0x28, 0x0F, 0x1E, 0x0C, 0xD5, 0xE9, 0x99, 0x3E, 0x09, 0xB5, 0x0B, 0x87, 0x9B, 0xF1,
+    0xB2, 0x8D, 0xFD, 0x24, 0x95, 0x43, 0x52, 0x1D, 0x38, 0xA7, 0x1B, 0x98, 0x38, 0xEC, 0x68, 0x7C,
+    0x69, 0x45, 0x17, 0x21, 0x63, 0x85, 0x16, 0xF8, 0xCE, 0x10, 0xA4, 0xE1, 0xCE, 0xD8, 0x1A, 0x82,
+    0x6E, 0xC7, 0x06, 0xD4, 0xB0, 0x58, 0x09, 0x22, 0x95, 0x84, 0x0E, 0xD6, 0x2E, 0x06, 0x74, 0x07,
+    0x5D, 0x01, 0x8B, 0x88, 0x8D, 0x66, 0xF4, 0x0D, 0x36, 0x52, 0x41, 0xCD, 0xE6, 0x17, 0xBF, 0xF2,
+    0x37, 0x50, 0x68, 0x3A, 0x5C, 0x7D, 0x4F, 0xD5, 0xE0, 0xE7, 0xB3, 0x24, 0xD3, 0x2A, 0x07, 0x18,
+    0x9F, 0x53, 0x8D, 0x52, 0xD6, 0x98, 0x26, 0x30, 0xA5, 0x43, 0x04, 0x7C, 0xB1, 0xF3, 0x93, 0xE2,
+    0xE6, 0x21, 0x1B, 0x94, 0xDA, 0xEE, 0x29, 0xB1, 0xDB, 0x07, 0x3D, 0x9F, 0x9B, 0x14, 0x8F, 0x4E,
+    0x9D, 0xCB, 0xCE, 0xA9, 0x5C, 0x60, 0xB1, 0xC0, 0x4C, 0xB7, 0x89, 0xBA, 0xD2, 0x14, 0xEE, 0x94,
+    0xBC, 0xD4, 0x5D, 0x90, 0x3B, 0xC6, 0xC5, 0x7C, 0xCB, 0x13, 0xB9, 0xDE, 0xA0, 0x06, 0x37, 0x94,
+    0x73, 0xBC, 0xC8, 0xA0, 0xDB, 0xE3, 0x51, 0xD3, 0x36, 0xB5, 0x4E, 0x4F, 0xA0, 0xB0, 0x74, 0x38,
+    0x76, 0xBC, 0x8A, 0x98, 0x4B, 0xFA, 0x00, 0x4F, 0x89, 0xA5, 0x59, 0x92, 0xC4, 0xAD, 0x35, 0x67,
+    0x68, 0xE5, 0x7D, 0xDD, 0x5E, 0x1C, 0x50, 0x35, 0x4E, 0xE1, 0xEB, 0x9C, 0x1A, 0xD2, 0x4C, 0x98,
+    0x25, 0x2A, 0x43, 0x7E, 0x7C, 0x64, 0x45, 0x1B, 0x19, 0x97, 0xDE, 0xD0, 0xCB, 0x24, 0x5C, 0x40,
+    0x95, 0x46, 0x0A, 0xEC, 0x14, 0x59, 0x55, 0x10, 0x12, 0x23, 0x1C, 0xF9, 0x9E, 0xB5, 0xEF, 0xEA,
+    0x6E, 0xE4, 0x6B, 0xF7, 0xDD, 0x95, 0xD2, 0x8F, 0x96, 0xBA, 0xDA, 0x04, 0x87, 0x47, 0x5B, 0x2A,
+    0xB6, 0x71, 0x2C, 0xE3, 0xCA, 0xC6, 0x94, 0xC0, 0xA0, 0xB8, 0x17, 0x78, 0x0A, 0xFE, 0xB9, 0x1E,
+    0xB3, 0xCB, 0x21, 0x7E, 0x90, 0x01, 0xB2, 0xBD, 0xEE, 0x81, 0xD0, 0x05, 0xDE, 0xC2, 0xFB, 0x6E,
+    0x94, 0xDC, 0x22, 0xA0, 0x0F, 0x8A, 0xD5, 0xB5, 0x56, 0xA5, 0xB4, 0x39, 0xCD, 0x1E, 0xDB, 0x5A,
+    0xF2, 0x92, 0xA8, 0x7B, 0x1F, 0xDC, 0x44, 0xE7, 0xFF, 0xE3, 0x59, 0x69, 0x2D, 0x5E, 0x45, 0x53,
+    0x99, 0xB6, 0xC2, 0x15, 0x21, 0x65, 0x32, 0x43, 0xFC, 0xAD, 0x6D, 0x91, 0xC9, 0x09, 0x82, 0x6B,
+    0x2C, 0xA8, 0x0A, 0xE8, 0x4A, 0xD7, 0x19, 0x06, 0x53, 0x9A, 0x00, 0x0A, 0x9E, 0x25, 0xA6, 0x6E,
+    0xE0, 0x98, 0xC2, 0xC9, 0xD4, 0x98, 0x32, 0xE4, 0xEE, 0x37, 0x5D, 0x1F, 0x10, 0x22, 0xCD, 0x91,
+    0xBD, 0x7B, 0xDA, 0x27, 0xB5, 0x06, 0x5A, 0x9E, 0x27, 0x6C, 0xBA, 0x53, 0x20, 0x13, 0xA3, 0x2E,
+    0xAC, 0x05, 0x9A, 0x3C, 0xD1, 0xEB, 0xA2, 0xE8, 0x7F, 0x4E, 0xB0, 0xE6, 0x5A, 0x73, 0x6B, 0x5D,
+    0x37, 0x80, 0x66, 0xD3, 0x50, 0x21, 0xA6, 0x9E, 0x43, 0x15, 0x15, 0x77, 0xC7, 0x0B, 0x30, 0x16,
+    0xB6, 0x8D, 0x38, 0x93, 0x53, 0xF5, 0x68, 0xF4, 0x34, 0x07, 0xD1, 0xBD, 0x10, 0xDE, 0xDD, 0x4E,
+    0x87, 0x32, 0xB6, 0xB4, 0x37, 0xD1, 0xBB, 0x8A, 0xD2, 0x4B, 0xBF, 0x04, 0x73, 0x3A, 0x36, 0x5C,
+    0x87, 0xF7, 0x0B, 0x41, 0x11, 0xF6, 0x27, 0x2C, 0xB6, 0xC2, 0x8B, 0xBE, 0x6E, 0x5D, 0x17, 0xA6,
+    0xEC, 0x74, 0xDF, 0xE4, 0x88, 0xDD, 0x9E, 0xEF, 0xFD, 0x2B, 0x25, 0xD9, 0x3B, 0x42, 0xB1, 0x2F,
+    0x21, 0xE4, 0x29, 0xC8, 0x69, 0x48, 0xC8, 0xB8, 0xB3, 0x8C, 0x2B, 0x4F, 0x31, 0xB9, 0x0C, 0xB2,
+    0xE1, 0xE9, 0xE1, 0xF4, 0x7C, 0xE9, 0x78, 0x1F, 0xFF, 0xB7, 0x6D, 0xF9, 0x01, 0xF5, 0xDA, 0xCB,
+    0x37, 0x20, 0xAE, 0x29, 0xED, 0xC7, 0x93, 0x25, 0xB7, 0x10, 0x47, 0x1E, 0x07, 0x8A, 0x82, 0xDC,
+    0xB9, 0x93, 0x39, 0xA0, 0xD8, 0x24, 0x5F, 0xA2, 0x8C, 0xE5, 0xB0, 0xAC, 0x8C, 0x63, 0x09, 0x50,
+    0x49, 0x04, 0x27, 0xD5, 0x2B, 0xA5, 0xA1, 0x8C, 0x86, 0x8B, 0x3D, 0x19, 0xC6, 0x39, 0x88, 0xB8,
+    0xB4, 0x2B, 0x4C, 0x5D, 0x6B, 0x9C, 0x36, 0xA6, 0x7A, 0x1A, 0xA7, 0x71, 0xE8, 0x97, 0x78, 0x1C,
+    0x03, 0xDA, 0x0D, 0xA3, 0xE9, 0xF6, 0x5F, 0x63, 0x2E, 0x9B, 0x6C, 0x86, 0xB9, 0x7C, 0x3D, 0xD2,
+    0xC9, 0x90, 0xCA, 0x5F, 0x48, 0x5E, 0x1C, 0x11, 0x88, 0xCA, 0xBF, 0x79, 0xB5, 0xBF, 0x2D, 0xED,
+    0xFE, 0x4D, 0xC6, 0x2C, 0xFB, 0x8E, 0x0E, 0x42, 0x53, 0x8C, 0xB2, 0x07, 0x92, 0xFF, 0xEC, 0x6B,
+    0xAA, 0xC5, 0xAE, 0x25, 0x09, 0xEA, 0xBB, 0x82, 0x5E, 0x86, 0x63, 0xD2, 0xF5, 0x59, 0x8F, 0x26,
+    0xF5, 0x98, 0x17, 0xE4, 0x6A, 0x89, 0x28, 0x2B, 0xF5, 0x8A, 0x5E, 0x96, 0x1C, 0x8D, 0xBE, 0x30,
+    0x47, 0xE6, 0x75, 0x84, 0x79, 0xFE, 0xF1, 0x35, 0xDD, 0x70, 0x7E, 0xCA, 0xC9, 0x1F, 0xD8, 0x03,
+    0x26, 0xEA, 0x48, 0x39, 0x68, 0xFF, 0x34, 0x8B, 0x58, 0xC6, 0x7C, 0x68, 0x54, 0x1A, 0x03, 0x17,
+    0x55, 0x23, 0xF9, 0xA8, 0x66, 0x04, 0x6A, 0xB4, 0x3C, 0xA9, 0xDB, 0x46, 0x5C, 0x48, 0xEB, 0xB2,
+    0x0D, 0x74, 0x67, 0x30, 0xD6, 0x2D, 0xFF, 0x30, 0x6D, 0xB5, 0x66, 0x66, 0x7C, 0xE2, 0x8B, 0xB0,
+    0xB6, 0x08, 0xFE, 0x2F, 0x05, 0xC4, 0x26, 0x33, 0x1F, 0x40, 0xC3, 0x07, 0x04, 0xAE, 0xFC, 0xC1,
+    0x23, 0xE5, 0x31, 0xEA, 0x16, 0x63, 0xB5, 0x9C, 0xD8, 0x2D, 0xC1, 0xCE, 0x46, 0xBC, 0x4C, 0x88,
+    0x7C, 0xBC, 0x86, 0xC5, 0x89, 0x69, 0x93, 0x13, 0x97, 0x0C, 0x05, 0xF3, 0x7C, 0x9D, 0x23, 0xC2,
+    0x81, 0x2C, 0xB9, 0x98, 0x05, 0x3D, 0x1B, 0x67, 0xDA, 0x50, 0x04, 0xD4, 0x79, 0x8A, 0x97, 0x63,
+    0xE5, 0xAF, 0xA4, 0xFD, 0x3D, 0x4D, 0x17, 0x3D, 0x8B, 0x9C, 0xA8, 0xEF, 0xA1, 0x42, 0x62, 0xFE,
+    0xD0, 0xD3, 0x86, 0xBE, 0x8D, 0xCB, 0x54, 0x02, 0xCD, 0x4D, 0xBF, 0xA9, 0xC2, 0x74, 0xBC, 0x4C,
+    0x82, 0x5A, 0x0A, 0xF9, 0xC6, 0x6C, 0xD1, 0x59, 0x2B, 0x8F, 0xED, 0x51, 0xAF, 0xA6, 0x17, 0x4A,
+    0xBB, 0xBD, 0xE4, 0x1B, 0xA2, 0x40, 0xC9, 0xAB, 0x7F, 0xE0, 0x59, 0x19, 0x98, 0xCE, 0x84, 0x51,
+    0x35, 0x3F, 0x49, 0x0E, 0x9F, 0x13, 0xD3, 0x43, 0xAF, 0x98, 0xD7, 0x8A, 0x8E, 0x2E, 0x88, 0x02,
+    0x4C, 0x17, 0x08, 0x9F, 0xFD, 0x4C, 0xF7, 0x9F, 0x38, 0x74, 0x4E, 0x39, 0xCF, 0x93, 0xC3, 0x0A,
+    0xB2, 0x9B, 0xBF, 0xE4, 0xAE, 0xA5, 0x6D, 0x7F, 0x1A, 0x62, 0x16, 0x05, 0x9C, 0x10, 0xF4, 0x81,
+    0x6F, 0xA7, 0xDF, 0xE8, 0x95, 0xC8, 0x88, 0x8A, 0x11, 0xEB, 0x56, 0xC6, 0x27, 0xE0, 0x92, 0x45,
+    0x87, 0x6F, 0x63, 0x11, 0x1B, 0x5C, 0xD8, 0x4E, 0x13, 0xAA, 0xB5, 0x04, 0x15, 0xCD, 0xF6, 0x66,
+    0x1C, 0x7C, 0x62, 0x3A, 0x6F, 0x73, 0xCF, 0x8B, 0xAB, 0x3A, 0x42, 0x5E, 0x1F, 0x58, 0x3E, 0xF2,
+    0x4C, 0xAF, 0xCB, 0x7A, 0x0E, 0x0C, 0xAB, 0xED, 0x04, 0xF6, 0xC2, 0x91, 0xAC, 0x8D, 0x30, 0xF1,
+    0x2A, 0x43, 0x53, 0x02, 0x5C, 0xF5, 0x92, 0x21, 0x50, 0x56, 0x2E, 0x38, 0x7C, 0x6E, 0x48, 0xDE,
+    0x81, 0x0E, 0x41, 0x3B, 0xA0, 0x74, 0xFC, 0x63, 0xC3, 0x3D, 0x8E, 0xC9, 0x28, 0xA2, 0xA0, 0x57,
+    0x4A, 0xDC, 0xB5, 0xAA, 0x1E, 0x86, 0xA2, 0x6C, 0x55, 0xF7, 0xC9, 0x1F, 0x28, 0x6B, 0xB5, 0xD6,
+    0x98, 0x25, 0x32, 0xE0, 0xA5, 0x29, 0xC8, 0xA6, 0xFE, 0x95, 0xC0, 0xA5, 0xFE, 0x82, 0x32, 0xD5,
+    0xC0, 0xFE, 0x63, 0x37, 0xBD, 0x57, 0x42, 0x53, 0xF6, 0xF9, 0x6A, 0x2C, 0x88, 0x71, 0xDC, 0xB5,
+    0x28, 0xF0, 0x18, 0x7E, 0x45, 0xF0, 0xB2, 0x19, 0x15, 0x1C, 0x2D, 0x1A, 0xD2, 0xF4, 0xAD, 0xDB,
+    0xAF, 0x23, 0x07, 0xA1, 0x3F, 0xDE, 0x97, 0xA5, 0x1A, 0xD2, 0x7E, 0x61, 0x8D, 0x23, 0x49, 0xC6,
+    0x22, 0x0E, 0xE0, 0xD9, 0x40, 0xC5, 0xE2, 0xD7, 0x0C, 0xDC, 0xD1, 0x50, 0x45, 0xC3, 0x74, 0x64,
+    0xD4, 0xCC, 0x11, 0xEC, 0x1F, 0x5E, 0x7E, 0x67, 0x76, 0x73, 0x3E, 0x55, 0x43, 0x44, 0x31, 0x1B,
+    0xBD, 0xF3, 0xA9, 0x7C, 0x72, 0xCE, 0x83, 0x2E, 0x5D, 0x2B, 0xF6, 0x2C, 0xA5, 0xB2, 0xC6, 0xB1,
+    0x71, 0x1E, 0xEA, 0x33, 0xF1, 0x83, 0x2A, 0x21, 0x65, 0x13, 0xFE, 0xA0, 0x21, 0xB7, 0x44, 0x07,
+    0x04, 0xF1, 0x46, 0x1D, 0xEF, 0x71, 0x80, 0x27, 0x42, 0x5F, 0x90, 0x55, 0x54, 0x84, 0x60, 0x37,
+    0xCF, 0xFB, 0xFA, 0x36, 0x4D, 0x92, 0x63, 0x82, 0x3D, 0xE8, 0xC2, 0x09, 0xE7, 0xBE, 0xC3, 0x7D,
+    0x4C, 0x17, 0xF1, 0x5C, 0x0F, 0xB6, 0x57, 0x25, 0x5D, 0xC0, 0x0C, 0x63, 0xE1, 0xF2, 0x9F, 0x69,
+    0xD6, 0x35, 0x73, 0xDC, 0xB3, 0x1D, 0xDA, 0x72, 0x5E, 0xB7, 0x12, 0x3B, 0x43, 0xF7, 0xB4, 0xCC,
+    0x48, 0xAC, 0xE2, 0xB3, 0xFB, 0x15, 0x91, 0x03, 0xFB, 0xDF, 0x2A, 0x4D, 0x70, 0x88, 0x75, 0x02,
+    0x18, 0x53, 0xF9, 0x9F, 0xC1, 0x9C, 0x0C, 0x5B, 0x5A, 0x59, 0x1B, 0x5F, 0x4A, 0xE5, 0x39, 0x20,
+    0xAD, 0x28, 0xC7, 0x80, 0x77, 0x13, 0x8E, 0x61, 0xBD, 0xE8, 0x80, 0x37, 0x41, 0x6E, 0xE7, 0x75,
+    0xCA, 0x41, 0xC6, 0xA9, 0xCC, 0x1C, 0xAF, 0xFF, 0x97, 0xCC, 0xFE, 0xF2, 0xED, 0x85, 0xD8, 0xB1,
+    0x4F, 0xF3, 0x7A, 0xE7, 0xF9, 0x18, 0x41, 0xD7, 0x49, 0xA2, 0x1B, 0xBC, 0xE2, 0x89, 0x93, 0x54,
+    0x5A, 0xF1, 0x5E, 0xA3, 0x66, 0x51, 0x8C, 0x66, 0x7A, 0xF7, 0x44, 0xD7, 0xFD, 0x90, 0xF1, 0xEE,
+    0x3E, 0xF6, 0x0E, 0xA5, 0xE9, 0xDB, 0xD0, 0xDB, 0x58, 0xA7, 0x45, 0xA9, 0x34, 0xD8, 0x44, 0xA3,
+    0x65, 0x29, 0xCB, 0x61, 0x8E, 0xAD, 0x7F, 0x95, 0xBA, 0x71, 0xFB, 0xB6, 0x93, 0x5F, 0x6F, 0xFC,
+    0xC1, 0xAA, 0xE6, 0x9F, 0x73, 0x55, 0x69, 0xE7, 0x35, 0x12, 0xCA, 0x26, 0x56, 0x39, 0x79, 0xFB,
+    0xAB, 0x53, 0x00, 0xF0, 0x8F, 0x72, 0xBF, 0x2D, 0x30, 0x05, 0x67, 0x65, 0x4B, 0xD3, 0x6A, 0xF7,
+    0x8B, 0x79, 0x41, 0xFA, 0x89, 0x2A, 0xDB, 0x0C, 0xA1, 0x10, 0xFC, 0x3A, 0x12, 0x63, 0x55, 0xB0,
+    0x3A, 0xB5, 0x30, 0xDB, 0x08, 0x76, 0xAF, 0xF6, 0x1A, 0xD9, 0xAE, 0x51, 0x81, 0xE3, 0x84, 0x90,
+    0x70, 0x2C, 0x1B, 0xA7, 0x75, 0xA3, 0x44, 0xD2, 0x9B, 0x71, 0x7C, 0x39, 0x0E, 0x1E, 0x32, 0x7D,
+    0x6B, 0x40, 0x90, 0xEE, 0xEF, 0x85, 0xB3, 0x21, 0x86, 0x2B, 0xE7, 0x53, 0x70, 0x7B, 0xB4, 0xE2,
+    0x2D, 0xBE, 0x1F, 0x61, 0xEA, 0x7D, 0x31, 0x4E, 0x07, 0xB6, 0xD3, 0x20, 0x82, 0x2F, 0x7E, 0xEA,
+    0x63, 0x8E, 0x31, 0xD8, 0xCE, 0x3C, 0x50, 0x58, 0x58, 0x99, 0x3D, 0x77, 0x18, 0x6C, 0xF6, 0x64,
+    0xB2, 0xB8, 0xBF, 0x39, 0xE0, 0x2C, 0x47, 0xAF, 0xBC, 0xDF, 0xC9, 0xE3, 0x4A, 0x92, 0xB3, 0xAB,
+    0x28, 0x4C, 0x07, 0x32, 0x53, 0xDC, 0x33, 0x25, 0xC8, 0xD6, 0xAC, 0xE9, 0xFF, 0x17, 0xF1, 0x63,
+    0xD6, 0x03, 0x6A, 0x81, 0xEE, 0x3F, 0xDA, 0xAE, 0xD1, 0x5D, 0xAD, 0x92, 0x51, 0x99, 0xA8, 0x5C,
+    0xDA, 0x47, 0x3A, 0xDB, 0x94, 0x9D, 0x89, 0xA2, 0x24, 0x88, 0xB0, 0xBB, 0x22, 0x46, 0x8F, 0x03,
+    0xB0, 0x9C, 0xB9, 0xDE, 0xD6, 0xCA, 0xEA, 0xDE, 0x6B, 0x97, 0xA9, 0xB0, 0xB3, 0xDB, 0xA6, 0x5E,
+    0xAD, 0xEC, 0x12, 0x23, 0x04, 0x4D, 0x7B, 0xF2, 0x7C, 0x0A, 0xE2, 0xB3, 0xA0, 0x81, 0x58, 0x8F,
+    0xC0, 0xA6, 0xE9, 0xDF, 0x7F, 0xA7, 0x89, 0x6E, 0x2D, 0x68, 0x23, 0xF1, 0x29, 0xB7, 0xD7, 0xDC,
+    0x63, 0x4A, 0xCB, 0x83, 0x24, 0xC0, 0xE4, 0x54, 0x5C, 0x67, 0x12, 0xB3, 0xFB, 0x6A, 0x1E, 0x37,
+    0xE0, 0xBE, 0x85, 0xDA, 0x7C, 0xB4, 0x8B, 0xEC, 0xE8, 0xBB, 0x08, 0x84, 0xD9, 0x90, 0x4B, 0x56,
+    0xFA, 0x2F, 0xA2, 0x36, 0xC8, 0x97, 0xFC, 0x3E, 0xC0, 0x9C, 0x28, 0x5D, 0xFD, 0x54, 0xD8, 0x53,
+    0x7D, 0x41, 0x4F, 0x15, 0x09, 0xA6, 0x3F, 0xAF, 0x13, 0x31, 0xE6, 0xE8, 0x45, 0x8C, 0x64, 0xFC,
+    0xF6, 0x53, 0x1C, 0x2B, 0x25, 0xDF, 0x15, 0x93, 0x06, 0xE1, 0x32, 0x45, 0x9A, 0x29, 0x6B, 0xD5,
+    0x11, 0x27, 0xA7, 0x2E, 0x98, 0xA8, 0x30, 0xD7, 0x93, 0x37, 0xDE, 0xFE, 0xC2, 0xE7, 0xC0, 0xAE,
+    0x5E, 0x26, 0x04, 0xA4, 0x57, 0x7A, 0x3F, 0xD7, 0x0E, 0xB6, 0x27, 0xE1, 0xCF, 0xBA, 0x27, 0xC3,
+    0x84, 0xFE, 0xD5, 0x4A, 0x87, 0xF0, 0xB5, 0x1C, 0x44, 0x3E, 0x17, 0xC9, 0x99, 0x8F, 0x85, 0xE6,
+    0xDA, 0x41, 0x94, 0xAB, 0x71, 0xC9, 0x0B, 0x9E, 0xA8, 0xF0, 0x5A, 0x01, 0x14, 0x8E, 0x15, 0x05,
+    0xB7, 0xE0, 0x90, 0xDD, 0x33, 0x9E, 0x82, 0x3B, 0x14, 0x57, 0xBD, 0xD1, 0xC7, 0xC1, 0x6D, 0xDE,
+    0x3F, 0x4B, 0x4E, 0xD6, 0xF4, 0x49, 0xED, 0xAF, 0x6C, 0x6C, 0xE3, 0x51, 0x0E, 0xDF, 0x15, 0xAF,
+    0xCD, 0x7F, 0xBF, 0x64, 0xF4, 0x66, 0x0F, 0x25, 0x86, 0xDA, 0xEF, 0xDF, 0xBB, 0x75, 0x92, 0xAD,
+    0x70, 0x42, 0x1E, 0xC7, 0x23, 0x2C, 0xC1, 0x49, 0x4B, 0x9B, 0xAC, 0x7C, 0x3C, 0x7D, 0xFA, 0xA2,
+    0x80, 0xCC, 0x0E, 0xDC, 0xD2, 0xAD, 0xDA, 0xBD, 0xF2, 0xFB, 0xAD, 0xCA, 0x96, 0x68, 0x19, 0xAE,
+    0x7E, 0xDB, 0x43, 0xF3, 0xEF, 0x52, 0x3F, 0x95, 0x3E, 0x5C, 0x9A, 0x9E, 0x54, 0x8F, 0x47, 0x27,
+    0xEC, 0xC1, 0xBF, 0x31, 0x7A, 0xDB, 0x6B, 0xBE, 0x40, 0x98, 0x8A, 0x33, 0xD8, 0x42, 0x97, 0x0C,
+    0x51, 0x3B, 0xD7, 0xB1, 0x95, 0xF8, 0xEF, 0x3B, 0xC8, 0xD8, 0x4C, 0x94, 0x0D, 0xDE, 0xC4, 0x09,
+    0x77, 0x52, 0x6E, 0xF2, 0xEF, 0x50, 0x9A, 0x83, 0x48, 0x6D, 0x69, 0x91, 0x33, 0x1A, 0x56, 0x98,
+    0xC0, 0x12, 0x86, 0xA8, 0xE3, 0xDE, 0x2E, 0xE9, 0x43, 0xB3, 0x7A, 0x71, 0x40, 0xFA, 0x34, 0xF7,
+    0xA6, 0xC3, 0x2F, 0xBB, 0x16, 0x6B, 0x91, 0x01, 0x58, 0xB0, 0x8D, 0x7A, 0x54, 0x62, 0x59, 0x3E,
+    0xC3, 0x2F, 0x3D, 0x48, 0xFB, 0x6C, 0x85, 0xD3, 0xD7, 0xB0, 0xFD, 0x4E, 0xCA, 0x3A, 0xEE, 0x37,
+    0xFF, 0xA1, 0xA8, 0xB0, 0x8F, 0xF8, 0x3F, 0xC7, 0x88, 0x07, 0x30, 0x1C, 0x81, 0x56, 0x63, 0xC2,
+    0x97, 0x05, 0x8C, 0x7A, 0x01, 0xBF, 0x14, 0x50, 0xA7, 0x87, 0x9A, 0x86, 0x79, 0x59, 0x45, 0x0F,
+    0x78, 0xD4, 0x0D, 0x1E, 0x3B, 0xE0, 0xF1, 0x14, 0x11, 0x55, 0x04, 0xE8, 0x10, 0x34, 0xDC, 0xF8,
+    0x3C, 0x12, 0xC5, 0x93, 0x64, 0x47, 0x70, 0x84, 0x89, 0x5F, 0xAF, 0xC3, 0x6B, 0xB2, 0x89, 0xAE,
+    0xED, 0xF6, 0x6A, 0x55, 0xC5, 0x50, 0xC5, 0xDE, 0x02, 0x70, 0xF9, 0x03, 0x67, 0xA4, 0x82, 0xDE,
+    0x0D, 0x38, 0x18, 0xDF, 0x5D, 0x24, 0x8D, 0x00, 0x8A, 0xF5, 0xA3, 0x01, 0xC6, 0xE3, 0xA6, 0x17,
+    0x16, 0xB9, 0xA1, 0x8E, 0x9C, 0x08, 0x9B, 0x2A, 0x20, 0x22, 0x69, 0x50, 0x91, 0x10, 0x98, 0x2C,
+    0x19, 0x94, 0xE6, 0xE9, 0x2C, 0x0F, 0xDD, 0x0A, 0x5A, 0xF8, 0xAD, 0xE5, 0xBE, 0x65, 0x3C, 0xD3,
+    0x75, 0x1C, 0x75, 0x77, 0xC2, 0xF7, 0x23, 0x7E, 0x6E, 0x62, 0xAF, 0xD2, 0x5F, 0x00, 0xFC, 0xD0,
+    0xF9, 0xF1, 0xCF, 0x7E, 0x11, 0xE6, 0xF5, 0x7E, 0xC0, 0x46, 0xCA, 0xEF, 0x1C, 0x5F, 0x62, 0x2F,
+    0x6D, 0xF9, 0xF4, 0x88, 0x64, 0xD2, 0xE0, 0x1F, 0x04, 0x33, 0xB9, 0xBA, 0x99, 0xC9, 0x9E, 0xD9,
+    0x48, 0x11, 0x6B, 0x2C, 0x35, 0x79, 0x36, 0x40, 0xDF, 0xB8, 0x3C, 0x2F, 0xAA, 0x35, 0x91, 0x43,
+    0xD2, 0x23, 0x8F, 0x1E, 0x24, 0x4E, 0x29, 0xA8, 0x9F, 0x3F, 0xF9, 0xF4, 0x5E, 0xAC, 0xBF, 0x39,
+    0xE2, 0x7F, 0x12, 0x4C, 0x95, 0xBC, 0xCE, 0x61, 0xF3, 0xEF, 0xD0, 0x30, 0x60, 0x6B, 0xFD, 0xD6,
+    0xF8, 0x15, 0x25, 0x56, 0x57, 0xC2, 0xF5, 0x84, 0xE4, 0xDF, 0xE8, 0x28, 0xBF, 0x81, 0x98, 0x5D,
+    0xFA, 0x28, 0x66, 0xF5, 0xD5, 0x43, 0x71, 0x17, 0xBF, 0x19, 0xA2, 0x5F, 0xB6, 0xDB, 0x14, 0x93,
+    0xBC, 0x30, 0xC4, 0x3E, 0x11, 0x01, 0xC5, 0x04, 0x30, 0x90, 0xBE, 0xA5, 0x85, 0xC4, 0x1B, 0xAD,
+    0x68, 0xCA, 0xBB, 0x7B, 0x8B, 0x45, 0x29, 0xF4, 0xA3, 0xCE, 0x72, 0x36, 0x79, 0x1B, 0xE6, 0x4D,
+    0xD7, 0x52, 0xBA, 0xD7, 0x2E, 0x61, 0x97, 0xDB, 0x5B, 0xA5, 0x47, 0x1F, 0x6F, 0xE0, 0x29, 0x25,
+    0xBC, 0xA1, 0xCF, 0x17, 0xC5, 0x32, 0xAA, 0x2B, 0xB2, 0x52, 0x89, 0x32, 0xCB, 0xFB, 0x1A, 0xCE,
+    0x4A, 0x2B, 0x98, 0x7F, 0xB5, 0x9B, 0x72, 0x42, 0x08, 0xB4, 0x52, 0x83, 0xB5, 0x98, 0x9D, 0xA0,
+    0x04, 0x50, 0x3B, 0xFD, 0x4B, 0x18, 0xAF, 0x9D, 0xE0, 0x70, 0xE7, 0x0B, 0x84, 0x09, 0x93, 0x51,
+    0x35, 0xE1, 0xC0, 0xB2, 0xD3, 0xE1, 0x66, 0x17, 0xB1, 0xDC, 0xE4, 0x1D, 0xBF, 0xE6, 0x76, 0x53,
+    0x1B, 0x05, 0xB2, 0x47, 0x02, 0x0B, 0xAB, 0x70, 0x52, 0x1B, 0x1C, 0x5B, 0xAF, 0x84, 0x0F, 0x12,
+    0xCD, 0xB9, 0x3F, 0xB9, 0x15, 0xC6, 0x56, 0xBB, 0xD7, 0x80, 0xBB, 0x94, 0xFB, 0xFB, 0x7C, 0xB9,
+    0xCF, 0xBC, 0x0E, 0xCB, 0xA8, 0x7E, 0x4A, 0xF3, 0xBA, 0x73, 0xCD, 0x9E, 0x14, 0x0D, 0x12, 0x17,
+    0x91, 0xF6, 0xF4, 0x9D, 0x14, 0x13, 0x91, 0x8E, 0x6D, 0x62, 0xF3, 0x27, 0xA1, 0x01, 0x85, 0xD2,
+    0x7A, 0xF5, 0x60, 0x13, 0xEE, 0xDC, 0x75, 0xF9, 0xFF, 0x23, 0x2D, 0xFE, 0xE7, 0x69, 0x40, 0x8B,
+    0x0A, 0xA8, 0xFF, 0x86, 0x2A, 0x6D, 0x0D, 0xD3, 0x9D, 0x14, 0xA3, 0xDF, 0xB8, 0x1C, 0x44, 0xE9,
+    0x7E, 0x9D, 0x73, 0x6B, 0x0C, 0xF2, 0x0F, 0x45, 0xA5, 0xCF, 0x46, 0xDA, 0xDC, 0xF6, 0x24, 0xC6,
+    0x72, 0xD0, 0x91, 0x6E, 0x38, 0x76, 0x1F, 0xA7, 0xF9, 0x8F, 0x9A, 0xFC, 0x16, 0x1E, 0xF7, 0x6A,
+    0x82, 0x49, 0x1C, 0xC0, 0xDE, 0x8A, 0xDA, 0x62, 0x86, 0x06, 0x6C, 0xF6, 0x8E, 0xA3, 0xE1, 0x65,
+    0x32, 0x7B, 0x65, 0x00, 0x99, 0xEA, 0xAF, 0x86, 0x03, 0xDE, 0xCE, 0xF9, 0xE6, 0xAE, 0x16, 0x2D,
+    0x9D, 0x90, 0xB4, 0x63, 0x96, 0xA6, 0x7E, 0xEE, 0x06, 0xE7, 0x69, 0x84, 0x40, 0xDE, 0x94, 0x20,
+    0x7C, 0xCF, 0x37, 0x21, 0x6E, 0x3D, 0xB0, 0xED, 0x9C, 0x9E, 0xAE, 0x56, 0x5D, 0xD7, 0x54, 0x51,
+    0x80, 0xA7, 0xCB, 0xB8, 0xC2, 0x02, 0x45, 0xF3, 0x5B, 0x15, 0xA6, 0xEC, 0x5A, 0x10, 0xB2, 0xCC,
+    0xC6, 0x4D, 0xCD, 0xE5, 0xF5, 0xB5, 0x86, 0xC3, 0x73, 0x00, 0xDB, 0x5B, 0xE7, 0x0E, 0xF8, 0x51,
+    0x05, 0x4B, 0x93, 0xB3, 0xD0, 0x78, 0x12, 0x1E, 0x86, 0xCD, 0xBB, 0xE4, 0x80, 0xF7, 0x72, 0xF5,
+    0xC7, 0x95, 0xF5, 0x62, 0xFA, 0x27, 0x9B, 0x9A, 0x24, 0xDD, 0x7E, 0xE3, 0xCE, 0x7C, 0x96, 0x13,
+    0x29, 0xD2, 0xCD, 0xB5, 0x31, 0xD8, 0x8D, 0xE9, 0x8D, 0x12, 0xD5, 0x49, 0x76, 0xFD, 0xCC, 0xCC,
+    0x8B, 0x30, 0x6D, 0x7D, 0x33, 0xC1, 0x0B, 0x0B, 0xC8, 0xD3, 0xA2, 0x3A, 0x98, 0xAB, 0x20, 0x50,
+    0x25, 0x44, 0xC4, 0x34, 0xC0, 0x82, 0x64, 0x94, 0x44, 0x19, 0x33, 0xCB, 0x18, 0x5A, 0x7B, 0x33,
+    0x38, 0xED, 0xC6, 0x5F, 0xD4, 0x85, 0xD1, 0x1D, 0xDD, 0x1C, 0xD7, 0x43, 0xFF, 0x67, 0x28, 0xD2,
+    0xC1, 0x8E, 0x3D, 0x19, 0x21, 0xC1, 0x8D, 0x00, 0xCE, 0x0C, 0x2C, 0x83, 0x89, 0x11, 0x14, 0xC1,
+    0x59, 0x29, 0x63, 0x2D, 0xC6, 0x46, 0xD0, 0x52, 0xFB, 0x02, 0xEC, 0xF3, 0x9C, 0xF2, 0x64, 0xB4,
+    0x37, 0x99, 0x5C, 0xF6, 0x57, 0xC9, 0x4A, 0x51, 0x18, 0x08, 0x6E, 0x8B, 0x9D, 0xEB, 0xA5, 0x8F,
+    0xE4, 0x85, 0x29, 0x4C, 0x5F, 0xD8, 0x41, 0x2A, 0x62, 0xAB, 0x25, 0x42, 0xEE, 0x90, 0x64, 0x8E,
+    0x93, 0x64, 0x87, 0x49, 0x98, 0x7C, 0x0E, 0xDF, 0xAC, 0xC5, 0x79, 0x2D, 0xC8, 0x53, 0x45, 0x2B,
+    0xCF, 0x2F, 0x0B, 0xB6, 0x5B, 0x4C, 0x45, 0x38, 0x96, 0xE3, 0x70, 0x91, 0x8E, 0xAC, 0x51, 0x67,
+    0xA2, 0xDB, 0x83, 0x55, 0x4C, 0x9D, 0xEB, 0x49, 0xE4, 0x37, 0x68, 0x9B, 0x58, 0xDC, 0x4B, 0xEC,
+    0xB5, 0xC4, 0xDC, 0x13, 0xB1, 0x54, 0x92, 0xA5, 0x67, 0x75, 0x98, 0x43, 0x71, 0x27, 0xFF, 0xA5,
+    0x6E, 0xE3, 0x12, 0x8C, 0xF6, 0xCB, 0x18, 0x21, 0x7C, 0x0A, 0x4B, 0xB3, 0xA5, 0xF4, 0xEA, 0x09,
+    0x2C, 0x1C, 0x57, 0xBF, 0x8F, 0xA6, 0x94, 0xDD, 0x19, 0x35, 0x4F, 0x17, 0xA7, 0x55, 0x45, 0xBD,
+    0xC8, 0x32, 0x72, 0x9E, 0x05, 0xD6, 0xBA, 0x3C, 0x60, 0x2E, 0xE6, 0x83, 0x12, 0xC4, 0xE2, 0x80,
+    0x03, 0xDE, 0xBB, 0x88, 0xFB, 0x7F, 0xAD, 0x3B, 0x9C, 0xD8, 0xD0, 0x8E, 0x4C, 0x52, 0x4D, 0x7A,
+    0xB8, 0x89, 0xB0, 0xBC, 0x7F, 0x94, 0x81, 0xBB, 0x6C, 0xE7, 0x5E, 0x1C, 0xFA, 0x69, 0x81, 0xB6,
+    0x46, 0xC2, 0x3B, 0x70, 0xB8, 0x02, 0xA9, 0x9F, 0x17, 0x0F, 0xF2, 0x31, 0x17, 0x82, 0xFF, 0x17,
+    0x02, 0xB9, 0x14, 0xBB, 0xE7, 0x1B, 0x1B, 0x4B, 0x92, 0x14, 0xE4, 0xE7, 0x6D, 0x6D, 0x73, 0xB8,
+    0xCB, 0x5D, 0x92, 0x27, 0x7D, 0xDA, 0x00, 0x69, 0x70, 0x15, 0x3C, 0x0F, 0xF0, 0xDE, 0x5F, 0xCD,
+    0x1A, 0x17, 0x86, 0x2A, 0x58, 0xB5, 0x4B, 0x3E, 0xAB, 0x4D, 0x8D, 0x75, 0x4D, 0x40, 0x7F, 0x84,
+    0x1D, 0x19, 0x17, 0x1E, 0x41, 0x4C, 0xB9, 0xEF, 0x61, 0x46, 0x80, 0xAD, 0x5D, 0xDB, 0x01, 0x1E,
+    0x73, 0xED, 0x42, 0xDD, 0x35, 0x07, 0x8B, 0xD0, 0xEC, 0x2E, 0x77, 0x35, 0xB8, 0xFC, 0x2E, 0xE5,
+    0x8D, 0x30, 0x96, 0x0D, 0x88, 0x7F, 0x52, 0xE7, 0x6B, 0x11, 0xF0, 0xD2, 0x6A, 0x6F, 0x89, 0x66,
+    0x3F, 0x3A, 0x94, 0x98, 0x64, 0x0F, 0x0E, 0x77, 0xF2, 0x04, 0x96, 0xD9, 0xAA, 0x36, 0x0B, 0x39,
+    0xEE, 0x1F, 0x1D, 0x10, 0x23, 0xD0, 0xFA, 0x0B, 0xE1, 0x88, 0xED, 0x97, 0x73, 0xFF, 0xCC, 0xC8,
+    0xD6, 0x49, 0x4A, 0x24, 0xC1, 0x49, 0x78, 0x25, 0x7A, 0x26, 0xD4, 0x6A, 0x9E, 0x4C, 0x98, 0xFA,
+    0x90, 0xB4, 0xD4, 0x07, 0xA4, 0xD2, 0x5E, 0x8B, 0x6D, 0xB1, 0x03, 0xBD, 0xCE, 0x13, 0x3B, 0x3E,
+    0x78, 0x4F, 0xFE, 0xCB, 0xB6, 0x53, 0xB7, 0x27, 0xAA, 0xC4, 0x35, 0xCD, 0xD8, 0xD9, 0x96, 0x78,
+    0x9A, 0x1D, 0xE5, 0x97, 0xAC, 0xBE, 0x31, 0x8A, 0x77, 0x65, 0x67, 0x61, 0x3A, 0xF0, 0x0E, 0x04,
+    0x54, 0x1C, 0xE4, 0x5F, 0xED, 0x06, 0xBA, 0xFB, 0x34, 0x59, 0xB2, 0x91, 0x33, 0xED, 0xF4, 0x52,
+    0xFE, 0x42, 0xFB, 0xAE, 0xEF, 0x46, 0xE5, 0x01, 0x95, 0x6F, 0xB7, 0xE6, 0x8A, 0xEE, 0x45, 0xE5,
+    0xAF, 0x13, 0x8B, 0x76, 0x74, 0xC3, 0x31, 0x36, 0xD2, 0x84, 0x1C, 0xA9, 0x4D, 0xF1, 0x1E, 0xA7,
+    0x97, 0xF4, 0x4B, 0xD6, 0xA2, 0xF8, 0x90, 0x31, 0x2F, 0xCC, 0x70, 0x9F, 0x59, 0x98, 0x6F, 0x8F,
+    0x6F, 0x81, 0x44, 0x01, 0x70, 0x25, 0x6B, 0x6A, 0x86, 0xF9, 0x76, 0x87, 0x37, 0xDB, 0x23, 0x5A,
+    0xE1, 0x1B, 0x83, 0x8C, 0x87, 0x2C, 0x21, 0xC2, 0x8B, 0x76, 0x37, 0x1A, 0x5D, 0x96, 0xFB, 0x5B,
+    0x9E, 0xF7, 0xA3, 0xFD, 0x11, 0x8F, 0x87, 0x0A, 0xD5, 0xE2, 0x13, 0x33, 0xCC, 0x02, 0xB5, 0x9B,
+    0x31, 0x7F, 0x50, 0x4B, 0xED, 0x88, 0x74, 0xCF, 0x0A, 0x04, 0x2C, 0x92, 0xE2, 0xE7, 0x79, 0x00,
+    0x68, 0xFF, 0xC2, 0x5B, 0xA5, 0x76, 0x40, 0xD0, 0x63, 0x53, 0x39, 0x24, 0x48, 0xB2, 0x9F, 0x34,
+    0x76, 0xD1, 0x68, 0x75, 0x47, 0x0E, 0x51, 0x90, 0x01, 0x53, 0x05, 0x3E, 0x88, 0xE8, 0x1A, 0x10,
+    0x85, 0x52, 0x2D, 0x57, 0x12, 0x17, 0x83, 0x4D, 0x11, 0xBB, 0x63, 0x0E, 0x59, 0x61, 0xCA, 0xAC,
+    0x3F, 0xE0, 0x18, 0x04, 0x68, 0xDC, 0x7D, 0xC7, 0xD8, 0xF2, 0x5D, 0xB6, 0x7C, 0x86, 0x0C, 0x03,
+    0xD6, 0x7E, 0xA6, 0x2C, 0x01, 0x5F, 0x7E, 0xFF, 0x9B, 0x0C, 0x26, 0xA9, 0x9C, 0x5D, 0x9D, 0x00,
+    0xCD, 0x59, 0x4C, 0x3A, 0xD6, 0x82, 0x85, 0x8B, 0x65, 0x41, 0x85, 0x40, 0xE0, 0xE9, 0x0B, 0x93,
+    0xE5, 0x32, 0x24, 0xDB, 0x94, 0x74, 0x94, 0x07, 0x47, 0x1B, 0x01, 0x6E, 0x4B, 0x5D, 0x26, 0x31,
+    0x42, 0xBE, 0x38, 0x08, 0x2B, 0x19, 0xC1, 0x51, 0xCC, 0x51, 0xFC, 0x62, 0xFE, 0x09, 0x08, 0xD3,
+    0x58, 0x6C, 0x8A, 0x2D, 0x35, 0xDE, 0x82, 0xD6, 0x4F, 0xEB, 0x65, 0x9F, 0xA1, 0xC9, 0xC3, 0x7A,
+    0x70, 0x9F, 0xAA, 0xF3, 0x97, 0xF3, 0xE9, 0xFC, 0x3B, 0x84, 0x1D, 0xE5, 0x35, 0xA0, 0x05, 0xEE,
+    0xAB, 0x78, 0xDB, 0xF0, 0xAD, 0xEC, 0x1E, 0xE9, 0x86, 0x96, 0x46, 0x45, 0x44, 0xD5, 0x28, 0x7D,
+    0x83, 0xB0, 0x83, 0x69, 0xBC, 0x60, 0x5E, 0x14, 0x28, 0xCA, 0xA7, 0x3C, 0xEF, 0xDE, 0x74, 0x89,
+    0x6D, 0xBF, 0x1B, 0x8F, 0x59, 0x8E, 0x96, 0xD5, 0xCE, 0x19, 0x41, 0x92, 0x88, 0x2A, 0xE8, 0x1B,
+    0x1D, 0x9E, 0xC1, 0x34, 0x2C, 0x3E, 0x3F, 0xBC, 0x4F, 0x72, 0x61, 0x44, 0x21, 0xCA, 0x08, 0x26,
+    0x0D, 0x28, 0xDC, 0x3D, 0x6F, 0x33, 0x49, 0xE6, 0x8B, 0xE6, 0xDD, 0x09, 0x6B, 0x29, 0x8B, 0xAB,
+    0xF6, 0x2C, 0x23, 0x7E, 0x2B, 0x51, 0x63, 0x0F, 0x97, 0x25, 0xA1, 0x3C, 0x76, 0x39, 0x3B, 0xFB,
+    0x75, 0x62, 0xA4, 0xF5, 0xC6, 0x72, 0x5E, 0xBF, 0x38, 0xA1, 0x8D, 0xB3, 0x31, 0x0E, 0x02, 0x7A,
+    0x42, 0xDB, 0x92, 0xD0, 0x44, 0x85, 0x8F, 0x6E, 0x7B, 0xCA, 0xD4, 0xE1, 0x8B, 0xC9, 0x6A, 0xC2,
+    0x20, 0xF7, 0x67, 0x00, 0x39, 0xDA, 0xAA, 0xF9, 0x54, 0x77, 0xDB, 0x54, 0x76, 0x7B, 0x15, 0xBF,
+    0xE3, 0x8F, 0x7E, 0x75, 0x09, 0x50, 0x1D, 0x8A, 0x82, 0x91, 0xCA, 0x7E, 0xF3, 0x11, 0xB8, 0x1B,
+    0xA7, 0x11, 0x0F, 0x29, 0xA4, 0x32, 0xB7, 0xB4, 0x66, 0x5A, 0xCE, 0xC3, 0x70, 0xCA, 0x19, 0xF1,
+    0x75, 0x32, 0x18, 0xCD, 0x11, 0xCD, 0x29, 0x6F, 0x7D, 0x9D, 0x56, 0x17, 0x6F, 0xB2, 0x82, 0x75,
+    0x9B, 0xE5, 0x60, 0x5F, 0x98, 0xAF, 0x2A, 0x9A, 0xBA, 0x97, 0x90, 0xC5, 0x99, 0x73, 0xC0, 0xFD,
+    0x70, 0xA3, 0x14, 0xF7, 0xD8, 0xAF, 0xA4, 0x1C, 0xEC, 0x04, 0x27, 0xD5, 0xCB, 0x95, 0xAB, 0x1E,
+    0x1D, 0x01, 0x33, 0xDA, 0xC1, 0xF3, 0xF3, 0x14, 0x0E, 0xE9, 0x40, 0xCA, 0x8D, 0x16, 0xAF, 0x61,
+    0x4C, 0x5B, 0x98, 0x11, 0xFE, 0x39, 0x84, 0x08, 0x29, 0x0B, 0x3C, 0xD1, 0xC6, 0x80, 0xAB, 0x8B,
+    0x61, 0xD3, 0x36, 0x84, 0xAC, 0xBE, 0xD0, 0xC5, 0x5D, 0xD8, 0x7B, 0x9B, 0xF0, 0x72, 0xC0, 0x0C,
+    0xFD, 0x57, 0x57, 0x75, 0x31, 0x0D, 0x7D, 0x6E, 0xA4, 0xE8, 0xDC, 0x15, 0x73, 0x22, 0x00, 0x25,
+    0xCB, 0xCA, 0x54, 0x5A, 0xB3, 0x1D, 0x27, 0x52, 0xE5, 0xF8, 0xEA, 0xA5, 0xE7, 0x3E, 0x25, 0x8B,
+    0x58, 0x23, 0x93, 0xB6, 0x90, 0x62, 0x32, 0xD9, 0xAA, 0xEC, 0x37, 0xB6, 0xC3, 0xA0, 0x92, 0xE4,
+    0xFB, 0xFF, 0xB3, 0xF4, 0xBF, 0x90, 0x58, 0x51, 0x9F, 0xAC, 0xFD, 0xA7, 0x7B, 0xEA, 0x47, 0x67,
+    0x5B, 0x5D, 0x1A, 0x1D, 0xED, 0xC8, 0x80, 0x19, 0x86, 0x97, 0x7D, 0x8E, 0x70, 0x1E, 0x5B, 0xF1,
+    0x04, 0x21, 0xA0, 0x41, 0xBE, 0x6A, 0x6E, 0x0D, 0x31, 0x62, 0xB7, 0xE9, 0x9F, 0xCF, 0x09, 0xC2,
+    0xC0, 0xC0, 0xA8, 0xE2, 0x9A, 0x01, 0xDB, 0x0C, 0x8B, 0xC3, 0x04, 0xD3, 0xE6, 0xAE, 0x51, 0xCD,
+    0xA8, 0x75, 0x51, 0xC9, 0x85, 0x87, 0x38, 0x5B, 0x6F, 0xD6, 0x7C, 0x2C, 0x56, 0x7B, 0xE3, 0x90,
+    0x72, 0xC4, 0x17, 0x4D, 0x61, 0xE8, 0x82, 0x04, 0xB4, 0x54, 0x27, 0xA1, 0xEA, 0x75, 0xB7, 0x3A,
+    0xA7, 0x51, 0x43, 0xB4, 0x0C, 0xC8, 0xFB, 0x7D, 0xBD, 0x47, 0x43, 0xDC, 0xE1, 0x60, 0x09, 0x94,
+    0xF1, 0xDA, 0x45, 0x6F, 0x57, 0xFB, 0x66, 0xEF, 0xA4, 0x14, 0x6F, 0x7A, 0xAD, 0xAA, 0xE2, 0x85,
+    0x3D, 0xC5, 0xF5, 0x14, 0xEB, 0x7B, 0x68, 0xAE, 0x41, 0xDF, 0xB6, 0xDD, 0x83, 0x14, 0x83, 0xAF,
+    0x54, 0xF8, 0x34, 0xEA, 0x01, 0x61, 0x8D, 0x9B, 0xCC, 0xE9, 0xDB, 0x81, 0x68, 0xC2, 0x6F, 0xD2,
+    0xAB, 0xF9, 0xF2, 0xC0, 0xF1, 0x29, 0x7A, 0x47, 0x4F, 0x52, 0x51, 0xDB, 0xDA, 0x1C, 0xD3, 0x5C,
+    0xE8, 0x2A, 0x68, 0xFF, 0x99, 0xD1, 0x6D, 0xE8, 0xA1, 0x90, 0x17, 0x1A, 0x2C, 0x7D, 0xB3, 0x1D,
+    0x8E, 0xF6, 0x84, 0xE2, 0x3F, 0x1A, 0xD0, 0x3D, 0xE8, 0x51, 0x7B, 0xEA, 0x3E, 0xFF, 0x2B, 0x25,
+    0xB7, 0x27, 0x3D, 0xA0, 0x2E, 0x10, 0xD8, 0x1C, 0x99, 0xA4, 0xE0, 0x78, 0xA3, 0x30, 0x8E, 0x1E,
+    0xD2, 0xE4, 0xA1, 0x08, 0x0E, 0x9F, 0x60, 0x22, 0xDE, 0xB3, 0x8C, 0x0F, 0xAE, 0x97, 0x21, 0x35,
+    0xDC, 0x8E, 0x0D, 0x65, 0x99, 0xFA, 0xAC, 0x46, 0x79, 0x97, 0xEC, 0x58, 0x7E, 0x42, 0x45, 0x58,
+    0x33, 0xAF, 0x2D, 0xE4, 0x45, 0x9F, 0x54, 0x93, 0x34, 0xCB, 0xAD, 0x10, 0xD6, 0x61, 0x33, 0xB8,
+    0x5B, 0xCF, 0xB3, 0xF4, 0x68, 0x16, 0xA5, 0x98, 0x54, 0x75, 0x95, 0x8C, 0xCD, 0xCF, 0x74, 0x29,
+    0x7F, 0xB5, 0xF7, 0xC9, 0x56, 0x6E, 0x5B, 0xFF, 0xEA, 0xCB, 0x8A, 0x53, 0x1E, 0x78, 0xA3, 0x25,
+    0x68, 0x15, 0xE4, 0xD3, 0xC4, 0xDF, 0x93, 0x6E, 0xC8, 0xAA, 0x53, 0xFA, 0x3C, 0x60, 0xAC, 0x0D,
+    0xA2, 0x01, 0xF6, 0x36, 0x1E, 0x80, 0x61, 0xE1, 0x89, 0x29, 0xDC, 0x0B, 0xC4, 0x0D, 0xB7, 0x8A,
+    0xD2, 0xB2, 0x7C, 0xAD, 0x47, 0xB5, 0xE0, 0x1F, 0x48, 0x21, 0x55, 0xAA, 0x5F, 0x7D, 0x85, 0x48,
+    0xE8, 0xD6, 0x19, 0xBE, 0xE6, 0x9C, 0x61, 0x8F, 0x89, 0x35, 0x49, 0x6D, 0x2E, 0x8B, 0x46, 0x1B,
+    0xCB, 0xD8, 0x06, 0x83, 0x8B, 0x70, 0xED, 0x66, 0x17, 0xAD, 0x2C, 0xF6, 0xC8, 0xF3, 0x1E, 0xE2,
+    0xCA, 0xDA, 0x04, 0xAA, 0xD4, 0xA0, 0xA6, 0x8B, 0xCC, 0x19, 0xF1, 0x87, 0x93, 0x3A, 0x69, 0xEE,
+    0x82, 0x75, 0x71, 0x8B, 0x8E, 0xFD, 0x39, 0x4A, 0x9D, 0x95, 0x07, 0x80, 0x4E, 0xF6, 0x25, 0xFA,
+    0x9C, 0x68, 0xF1, 0xA6, 0x84, 0x28, 0x8C, 0x47, 0xFB, 0xCC, 0xE5, 0x7A, 0x2B, 0xAC, 0x3B, 0x58,
+    0xEE, 0x51, 0x31, 0x18, 0x6F, 0xFD, 0x5A, 0xE4, 0xFE, 0x80, 0x75, 0x92, 0x67, 0xF1, 0xF9, 0x78,
+    0x73, 0xF1, 0x52, 0x4E, 0x9F, 0xFE, 0xA7, 0x18, 0x99, 0x48, 0x74, 0xE3, 0x94, 0x70, 0x1A, 0x9F,
+    0xCD, 0x15, 0x31, 0xB3, 0x68, 0x4C, 0xFA, 0xED, 0x44, 0xC2, 0x8D, 0x71, 0xC0, 0xC2, 0x1B, 0x39,
+    0x97, 0xE2, 0xFF, 0xA5, 0x4E, 0x07, 0xF1, 0xA7, 0xFF, 0xBF, 0x85, 0x79, 0x00, 0x29, 0x62, 0xB7,
+    0x0F, 0xF9, 0x6A, 0xE5, 0xFE, 0x09, 0xE2, 0x2B, 0x76, 0x74, 0xF6, 0x40, 0xBE, 0x64, 0xE9, 0xD4,
+    0x27, 0x74, 0x6F, 0xEC, 0xDD, 0xBC, 0x53, 0xCD, 0x9F, 0x16, 0x6B, 0x92, 0xAE, 0x59, 0x9E, 0x74,
+    0x72, 0x18, 0xA5, 0x68, 0xE0, 0xA0, 0xAE, 0x06, 0xDB, 0xC4, 0xE5, 0x34, 0x37, 0x87, 0xAD, 0x80,
+    0x2B, 0x0F, 0x84, 0x37, 0x99, 0x96, 0x9D, 0xEF, 0x87, 0x3C, 0xED, 0x7A, 0xD9, 0xAA, 0xB8, 0xC8,
+    0x7A, 0xD4, 0xD0, 0x2A, 0xD7, 0xDA, 0xEC, 0x0B, 0x85, 0x8A, 0x93, 0x84, 0x38, 0x2D, 0x3F, 0x6B,
+    0xE1, 0x8A, 0x88, 0x5D, 0x4C, 0x26, 0x69, 0xF5, 0x43, 0x55, 0xB1, 0x32, 0xB2, 0x78, 0x67, 0x39,
+    0xC3, 0x64, 0x4A, 0x6A, 0x5B, 0xA3, 0x7A, 0xBC, 0x8A, 0x0A, 0x76, 0xDB, 0x69, 0x09, 0x66, 0x2C,
+    0x2F, 0xD9, 0x30, 0x0B, 0x4E, 0xB0, 0x71, 0x5E, 0xDE, 0x48, 0x58, 0x6A, 0x10, 0x6B, 0xB1, 0x6D,
+    0xF8, 0xB3, 0xF9, 0xD9, 0x24, 0x43, 0x0C, 0xB9, 0xAE, 0xB7, 0x9B, 0x76, 0x3A, 0xB3, 0xF1, 0x68,
+    0x0A, 0xD4, 0xE5, 0xEC, 0x30, 0x8D, 0x19, 0xD0, 0x19, 0x42, 0x42, 0xF4, 0xD2, 0xF0, 0x3D, 0x40,
+    0x4E, 0xF0, 0x52, 0x8C, 0x9D, 0x77, 0xE4, 0x5B, 0x04, 0x12, 0x4C, 0x08, 0xC3, 0xF6, 0x9A, 0x58,
+    0x20, 0x40, 0x4B, 0x06, 0x8B, 0x1C, 0xD6, 0x0E, 0x7D, 0x2C, 0x8A, 0x9F, 0xEC, 0x25, 0xF0, 0x66,
+    0x91, 0x34, 0xBE, 0xB9, 0x27, 0x02, 0xFE, 0x9C, 0x1C, 0x3D, 0x8A, 0xD9, 0x0C, 0x64, 0x98, 0xE1,
+    0x2C, 0x9F, 0x25, 0xE9, 0x0A, 0xB7, 0xA4, 0xE7, 0xE1, 0x59, 0x51, 0x2A, 0xC0, 0xBF, 0x63, 0x80,
+    0xEE, 0x71, 0x25, 0xD2, 0xCA, 0x3E, 0x23, 0xA2, 0x0A, 0x5D, 0x53, 0xD5, 0x38, 0xC6, 0x7E, 0xB2,
+    0xD6, 0xA1, 0xB0, 0x1F, 0xD0, 0xDA, 0xA7, 0x59, 0x33, 0xF4, 0x43, 0x0A, 0x9E, 0xCB, 0x95, 0x5C,
+    0x52, 0xD5, 0x34, 0x9E, 0x52, 0xAC, 0xC1, 0x36, 0x84, 0x1F, 0x62, 0x1D, 0x86, 0xD6, 0xBD, 0x56,
+    0x9F, 0xCC, 0xAF, 0x30, 0xC0, 0x39, 0x28, 0x22, 0xDB, 0xDA, 0xD5, 0x4C, 0x4F, 0x1B, 0x36, 0x1D,
+    0x1D, 0xAC, 0xF4, 0x98, 0xF5, 0x46, 0x94, 0x32, 0x80, 0x2B, 0xF8, 0x14, 0xF0, 0x68, 0x91, 0x1E,
+    0xF6, 0x72, 0x1C, 0x4A, 0xF9, 0xD6, 0xC2, 0xA6, 0x3A, 0x85, 0xE9, 0xE1, 0x76, 0xB5, 0xA0, 0xEA,
+    0x46, 0x6A, 0x2C, 0xF8, 0x8B, 0x8D, 0x0C, 0xD0, 0x1F, 0x4F, 0xD9, 0x38, 0x5B, 0xFE, 0x6E, 0x59,
+    0xA3, 0xB8, 0xA4, 0x68, 0xED, 0x03, 0x4A, 0x06, 0xD3, 0xC1, 0xCD, 0x02, 0x95, 0x24, 0x5C, 0x3D,
+    0x3B, 0xEC, 0x5A, 0x1C, 0x46, 0xD6, 0x1B, 0xA5, 0x42, 0xFD, 0x2E, 0xE7, 0xEA, 0x42, 0x98, 0x42,
+    0x53, 0xB5, 0xD9, 0xCE, 0x53, 0xC1, 0x8F, 0x83, 0x4D, 0xB2, 0xB6, 0x9F, 0x8F, 0xB1, 0x88, 0x4D,
+    0x45, 0x3D, 0x08, 0x01, 0x9A, 0x28, 0x7B, 0x10, 0x97, 0x6C, 0x76, 0x44, 0xE1, 0x07, 0x04, 0x51,
+    0x0E, 0x4A, 0xC7, 0x98, 0xED, 0x86, 0x17, 0x69, 0x90, 0x14, 0xA9, 0xD8, 0xB7, 0x07, 0x28, 0x4A,
+    0x77, 0x0B, 0xF9, 0x3F, 0x27, 0x4F, 0xCF, 0xA9, 0xDA, 0xCE, 0xC4, 0xDA, 0x30, 0x09, 0x56, 0x64,
+    0x55, 0xCE, 0xD6, 0xEA, 0xE4, 0x85, 0x92, 0x95, 0x3E, 0x12, 0x5B, 0xF4, 0x21, 0x91, 0xCB, 0xD9,
+    0xFB, 0xB7, 0x38, 0xBB, 0x1D, 0xFB, 0xAD, 0xE9, 0x55, 0x40, 0x9D, 0xF3, 0x30, 0xC5, 0xA4, 0x9E,
+    0x02, 0xA8, 0x9B, 0x6E, 0x30, 0x07, 0x32, 0x16, 0xD9, 0xEB, 0x85, 0x55, 0xC8, 0x38, 0xBC, 0x84,
+    0x9A, 0x9D, 0x61, 0x1C, 0x0D, 0xF5, 0x07, 0x06, 0xC8, 0x0B, 0x73, 0xC1, 0xB8, 0xD2, 0x84, 0xC2,
+    0xAF, 0xCA, 0xB2, 0x88, 0x0A, 0xE4, 0x79, 0x84, 0x5C, 0x8B, 0xF7, 0xB6, 0xC4, 0x47, 0x92, 0xC9,
+    0xC1, 0xBD, 0xF6, 0x84, 0x78, 0xC2, 0x74, 0xC3, 0xF8, 0x3C, 0x3F, 0xD6, 0x0E, 0x02, 0x5D, 0x22,
+    0x42, 0x7D, 0xD3, 0xB8, 0xE9, 0xBB, 0x91, 0x36, 0x32, 0x81, 0xDD, 0x89, 0xCD, 0x41, 0x00, 0x37,
+    0x4F, 0xA1, 0x48, 0x03, 0x2F, 0x3D, 0x54, 0x38, 0x17, 0x7C, 0x51, 0x40, 0x9A, 0x41, 0x57, 0x3C,
+    0xF4, 0x5E, 0x0D, 0xF6, 0xA4, 0xE4, 0xA2, 0x97, 0x30, 0x71, 0x40, 0xC3, 0x20, 0x88, 0xEE, 0x95,
+    0x7A, 0xB9, 0x03, 0x9D, 0x54, 0x10, 0xD1, 0x5B, 0xBC, 0x6D, 0x79, 0xFE, 0xF4, 0x44, 0x9C, 0xCB,
+    0x1E, 0xAF, 0x0C, 0x6B, 0xB7, 0x17, 0x60, 0x91, 0x46, 0x1F, 0x9A, 0xA9, 0xD8, 0x84, 0x0D, 0x49,
+    0x60, 0x4A, 0x48, 0xDD, 0x73, 0x1E, 0xDD, 0x17, 0xAD, 0xB8, 0x3C, 0x8A, 0xB3, 0xD3, 0x4C, 0x3C,
+    0x97, 0xE3, 0xD0, 0x0A, 0x8D, 0x83, 0x7E, 0x3F, 0xE2, 0x03, 0xD1, 0xD3, 0x93, 0xA3, 0xFF, 0x3B,
+    0x12, 0x65, 0x36, 0xF3, 0x27, 0xC1, 0x05, 0x27, 0xA2, 0x03, 0x71, 0x7C, 0xBD, 0xEC, 0xDB, 0xE4,
+    0x3B, 0x33, 0x5F, 0x93, 0xB5, 0x41, 0xAC, 0xF8, 0x6D, 0xD7, 0xCB, 0x06, 0x33, 0x9A, 0x25, 0x2E,
+    0xF6, 0x2F, 0xF4, 0x34, 0x6F, 0x5A, 0x05, 0xDD, 0x04, 0x95, 0x33, 0x67, 0x45, 0xD8, 0xD5, 0xD5,
+    0xEA, 0xC8, 0x2F, 0x9B, 0xC3, 0xBE, 0xED, 0xCA, 0xC0, 0xCF, 0xB6, 0xFC, 0x7C, 0x88, 0x37, 0x1A,
+    0x7D, 0xDA, 0x9B, 0x0E, 0xFC, 0x30, 0xD9, 0x17, 0xF3, 0x4C, 0x14, 0xF3, 0xDA, 0xF2, 0xCF, 0xCD,
+    0x8A, 0x46, 0x23, 0xDA, 0x76, 0xC5, 0xF9, 0x06, 0xB9, 0x79, 0xD3, 0x1A, 0xD2, 0xA8, 0x11, 0x03,
+    0x5D, 0x79, 0xA9, 0xA0, 0x93, 0x15, 0xC8, 0x27, 0xC2, 0xD9, 0x7F, 0x78, 0x3E, 0x84, 0xD4, 0x37,
+    0x38, 0x52, 0x97, 0xD8, 0x58, 0x67, 0x6A, 0x13, 0x00, 0x00, 0x20, 0xFB, 0xF2, 0xBD, 0x52, 0x71,
+    0xE6, 0x1C, 0x6C, 0x99, 0xF6, 0xDE, 0x72, 0x89, 0xCC, 0x92, 0x57, 0x13, 0x52, 0x04, 0x88, 0xE7,
+    0xA5, 0xBC, 0x36, 0x46, 0x3C, 0x03, 0x59, 0xFE, 0x86, 0x99, 0xBC, 0x40, 0x70, 0xE9, 0xF1, 0xAA,
+    0xCC, 0x4E, 0x16, 0xD2, 0x4B, 0x55, 0xC0, 0x42, 0x43, 0x3D, 0xF1, 0x1A, 0x38, 0xB9, 0x4F, 0x9E,
+    0x31, 0x4E, 0x86, 0x08, 0x57, 0x95, 0x2D, 0xFB, 0xD7, 0x12, 0xC4, 0x11, 0xC0, 0x5D, 0x00, 0xD0,
+    0xB5, 0x8D, 0xEA, 0x8F, 0x66, 0xD3, 0x00, 0x17, 0x80, 0x1A, 0x54, 0x0F, 0xDE, 0x75, 0x40, 0xD5,
+    0x1B, 0x64, 0x89, 0x96, 0xF9, 0x9A, 0x0D, 0x70, 0x26, 0x50, 0x31, 0x3A, 0x3C, 0x0F, 0x5E, 0xC8,
+    0xA3, 0xB8, 0x5D, 0x72, 0xDC, 0xBA, 0xB2, 0xEF, 0x58, 0x89, 0x52, 0x55, 0xF7, 0x9A, 0x17, 0xE7,
+    0x43, 0xC2, 0x0F, 0x3A, 0x16, 0x75, 0xEB, 0x48, 0x87, 0x2A, 0xF8, 0x0E, 0xBA, 0xBB, 0x0D, 0xA2,
+    0x6C, 0x37, 0x71, 0x50, 0xA4, 0xB8, 0x3F, 0x77, 0x2A, 0xDE, 0x12, 0x1B, 0x87, 0x39, 0x91, 0x40,
+    0xA9, 0x62, 0x93, 0x87, 0x59, 0x8F, 0x1F, 0x9E, 0x27, 0xD6, 0x5F, 0xA9, 0x45, 0x67, 0xBC, 0x8C,
+    0xE2, 0x84, 0x4C, 0x28, 0x0A, 0x7D, 0xBF, 0xC0, 0x08, 0x1C, 0x72, 0x87, 0x93, 0xC4, 0xA5, 0x88,
+    0xFF, 0xD9, 0x29, 0x62, 0xC9, 0x2F, 0x9D, 0x96, 0x44, 0x77, 0xC1, 0x9E, 0xF4, 0xDF, 0x37, 0x5D,
+    0x05, 0x2F, 0xD8, 0x4A, 0x46, 0x5D, 0xB2, 0x0C, 0xBE, 0x28, 0xA4, 0x15, 0x6B, 0xC0, 0xE4, 0x9A,
+    0xFB, 0xAE, 0xCB, 0x1F, 0x14, 0x3F, 0x63, 0x65, 0x24, 0xD2, 0x49, 0x49, 0x90, 0x31, 0xBF, 0x6F,
+    0x4F, 0x83, 0xE0, 0xDB, 0xF0, 0x0A, 0xA0, 0x7E, 0x45, 0x7F, 0x15, 0x86, 0x4A, 0x00, 0x06, 0x52,
+    0xCE, 0x94, 0x81, 0x55, 0x48, 0x99, 0xF8, 0x2C, 0xD5, 0x18, 0x98, 0xF5, 0xB7, 0x5C, 0x71, 0x11,
+    0x19, 0xAB, 0x7D, 0xAD, 0x35, 0x61, 0x2B, 0x00, 0x00, 0x80, 0xF0, 0x33, 0xF2, 0x4A, 0x77, 0x44,
+    0xF2, 0x79, 0xA5, 0xE1, 0x53, 0xEE, 0x84, 0x18, 0x8C, 0x1F, 0x43, 0xA5, 0xF6, 0xA7, 0x3E, 0x73,
+    0x89, 0x42, 0x9B, 0x45, 0xA6, 0x23, 0x09, 0x8B, 0x28, 0x02, 0xF4, 0x52, 0xBA, 0x2D, 0x9A, 0x3A,
+    0xBC, 0x50, 0x8A, 0x6D, 0xD4, 0x0D, 0x19, 0xAC, 0x7F, 0x04, 0x99, 0xFC, 0x5C, 0x15, 0xD7, 0x30,
+    0x9E, 0xDE, 0xCB, 0x61, 0x89, 0x54, 0x37, 0x6A, 0x9E, 0x21, 0x62, 0x5E, 0x28, 0x4E, 0xCE, 0x41,
+    0x7D, 0x50, 0xFC, 0x99, 0xB0, 0x43, 0x86, 0x4A, 0xAD, 0x2C, 0x1C, 0xFC, 0x36, 0xF4, 0x16, 0x8A,
+    0x23, 0x88, 0xB8, 0x32, 0xB0, 0x53, 0x3F, 0x50, 0xDB, 0x04, 0x20, 0x91, 0x9C, 0xA9, 0x71, 0x57,
+    0xAB, 0x89, 0xE7, 0xA0, 0xAF, 0x65, 0xE4, 0xDF, 0x19, 0x7D, 0x1C, 0x95, 0xEB, 0x76, 0x9A, 0x1E,
+    0x89, 0xEE, 0x44, 0x2D, 0xCA, 0xAF, 0x63, 0x32, 0x1B, 0xA6, 0x0C, 0x0A, 0xA0, 0x9D, 0x75, 0xFB,
+    0x98, 0x68, 0x44, 0xC7, 0x31, 0x4E, 0xA4, 0x39, 0xE4, 0x74, 0xD6, 0xBB, 0xE4, 0x21, 0x6F, 0xAD,
+    0x57, 0x54, 0x2C, 0x9F, 0x35, 0x01, 0xF1, 0x0A, 0xE1, 0x07, 0xF5, 0x61, 0x60, 0x0C, 0xF8, 0x9B,
+    0x85, 0xE9, 0xC4, 0xBB, 0xBD, 0xEC, 0x45, 0x5B, 0xDD, 0x0B, 0xED, 0x0F, 0x55, 0x54, 0x7B, 0x50,
+    0xDB, 0xC7, 0xAC, 0x05, 0x16, 0x5E, 0x55, 0x9C, 0x83, 0xB2, 0x6D, 0x95, 0x59, 0x3B, 0xCA, 0xB5,
+    0x1B, 0x81, 0x4D, 0xC6, 0xC3, 0x8B, 0x20, 0x95, 0x5C, 0xE6, 0x03, 0xBF, 0xF8, 0xA7, 0x16, 0x8B,
+    0x49, 0x63, 0xDD, 0x71, 0x15, 0x8B, 0x66, 0xA2, 0xAB, 0x47, 0x06, 0x74, 0xB5, 0xA8, 0xC4, 0x49,
+    0x31, 0x4F, 0xFF, 0x08, 0x08, 0xB2, 0x2F, 0x9E, 0x6D, 0x13, 0xDD, 0xCB, 0x53, 0xB0, 0x47, 0x61,
+    0x49, 0x47, 0x10, 0xFF, 0x87, 0xB0, 0x10, 0xD9, 0x21, 0xBD, 0x0F, 0x03, 0x98, 0x3B, 0x07, 0xC5,
+    0xC4, 0x65, 0x39, 0x76, 0xCC, 0x44, 0x60, 0xCC, 0x79, 0x7B, 0x56, 0x37, 0xFE, 0x31, 0xBB, 0xFB,
+    0x88, 0x82, 0xCD, 0xA4, 0xA0, 0xED, 0x2F, 0x0A, 0xF8, 0x74, 0x4A, 0x6F, 0xC3, 0xB9, 0x11, 0x76,
+    0x0A, 0xEA, 0x0F, 0x1C, 0xFC, 0x6A, 0x49, 0x6A, 0x39, 0x32, 0xF8, 0x5C, 0x40, 0x1A, 0xA5, 0xED,
+    0x72, 0x58, 0x6B, 0xD6, 0xA3, 0x53, 0x11, 0x82, 0xB8, 0x78, 0x85, 0x38, 0xD8, 0xFD, 0x18, 0x8B,
+    0xDF, 0x0E, 0x62, 0xAF, 0x6B, 0xE4, 0x5F, 0x43, 0x55, 0x53, 0xB7, 0xAA, 0x43, 0x33, 0x89, 0xA8,
+    0x67, 0x6E, 0xD8, 0x0A, 0xCC, 0x1F, 0x89, 0xDA, 0xA4, 0x16, 0xA2, 0xE0, 0xBA, 0xF5, 0x20, 0x10,
+    0x05, 0x42, 0x00, 0xAD, 0x39, 0x49, 0xE9, 0x3D, 0x0A, 0xDF, 0x7E, 0x65, 0x14, 0xAF, 0xA8, 0x5E,
+    0xD9, 0xC2, 0x16, 0x4F, 0x07, 0x18, 0xA0, 0xAD, 0x2C, 0xD8, 0x19, 0x6D, 0x11, 0x93, 0x63, 0xD7,
+    0x6D, 0x05, 0xA9, 0xDB, 0xBA, 0x02, 0xC8, 0x10, 0x6A, 0xA5, 0x4F, 0x35, 0xC4, 0x35, 0x74, 0xC5,
+    0xBF, 0x40, 0x71, 0x92, 0xDB, 0x26, 0xB6, 0xEB, 0xD8, 0x17, 0x34, 0x95, 0xEE, 0x3A, 0xF6, 0x30,
+    0x48, 0x6C, 0xAD, 0x88, 0x82, 0x22, 0x48, 0x9B, 0xA3, 0xDE, 0x5A, 0x47, 0xEB, 0x80, 0x4C, 0x70,
+    0xFF, 0x7B, 0x7C, 0xD9, 0xD7, 0x7E, 0x08, 0x74, 0x8F, 0xC5, 0x14, 0xBC, 0xC0, 0x4B, 0xF2, 0x3F,
+    0xFF, 0x52, 0xBC, 0x23, 0xFB, 0x30, 0xA9, 0x2E, 0x7A, 0x93, 0x16, 0x73, 0x99, 0xF4, 0xE5, 0xB7,
+    0x5F, 0x01, 0xDD, 0x96, 0x1A, 0xDB, 0x36, 0x74, 0xBE, 0xD4, 0xAB, 0xE2, 0x16, 0x24, 0xB2, 0x0E,
+    0x36, 0x46, 0x36, 0x8C, 0x92, 0xB7, 0x79, 0x5E, 0x83, 0x37, 0x6A, 0x1A, 0x15, 0xCE, 0x6D, 0x61,
+    0xEA, 0x9D, 0xE6, 0x65, 0x27, 0xD7, 0xB3, 0xF4, 0x6D, 0x55, 0xB8, 0xC0, 0x42, 0x4C, 0xE8, 0x36,
+    0x1A, 0x0A, 0x21, 0x68, 0xB3, 0x17, 0xB1, 0xEA, 0x8D, 0x5C, 0x50, 0xBE, 0xC4, 0x49, 0xC5, 0x7D,
+    0x19, 0x83, 0xF8, 0x02, 0x78, 0xAE, 0x3A, 0x5A, 0xB9, 0xA3, 0xA2, 0x0E, 0xCC, 0x10, 0x36, 0x49,
+    0x84, 0x44, 0xA3, 0xFE, 0x5B, 0x56, 0x5C, 0x13, 0x43, 0xDD, 0x90, 0x29, 0x67, 0x9B, 0x3E, 0xD3,
+    0x9B, 0x68, 0xA7, 0xAE, 0x52, 0x9C, 0x38, 0xF8, 0xF1, 0x10, 0xB7, 0x19, 0x75, 0x43, 0x27, 0x75,
+    0x7F, 0x32, 0x40, 0x40, 0xDB, 0xD2, 0x71, 0x35, 0x45, 0x6C, 0x5B, 0x47, 0x84, 0x57, 0x49, 0x75,
+    0xEB, 0x75, 0xDE, 0x93, 0xB2, 0xA7, 0x99, 0x65, 0xB1, 0x34, 0xA7, 0xB7, 0x67, 0x21, 0x95, 0x56,
+    0x28, 0xF4, 0x16, 0xF6, 0xA5, 0x86, 0x04, 0x65, 0x44, 0x48, 0xDE, 0x02, 0xE4, 0x08, 0x6F, 0x57,
+    0xA3, 0xE1, 0x45, 0x68, 0xC2, 0x9C, 0x96, 0xFD, 0xCB, 0x5B, 0x1D, 0xDF, 0xB5, 0x52, 0xAC, 0xB4,
+    0xE4, 0x2D, 0x33, 0x76, 0x3C, 0x55, 0x8A, 0xD7, 0xD9, 0x65, 0xBD, 0x44, 0x27, 0x4F, 0x7B, 0x48,
+    0x05, 0xD5, 0x3D, 0xB8, 0x87, 0x7E, 0x49, 0xE6, 0x99, 0x12, 0x27, 0xDA, 0x8E, 0xC9, 0x49, 0x4F,
+    0xFC, 0x61, 0xD4, 0x8C, 0x63, 0xD1, 0x25, 0x8B, 0x09, 0xA1, 0x21, 0x96, 0xDC, 0xFF, 0x7A, 0x5F,
+    0x99, 0xBE, 0xBC, 0x04, 0x0B, 0xD1, 0x0E, 0x44, 0xCE, 0x2C, 0xA1, 0x3C, 0x8F, 0x49, 0xD9, 0xA1,
+    0xD4, 0x4D, 0x8E, 0x2B, 0x3E, 0xB4, 0x2F, 0x59, 0xDB, 0x71, 0x8A, 0xA5, 0x85, 0xD8, 0x31, 0x6A,
+    0xD3, 0xEE, 0xBD, 0x32, 0x9D, 0xCA, 0x55, 0x19, 0x6A, 0x7F, 0x43, 0xE0, 0x5B, 0x91, 0x14, 0x4B,
+    0x0C, 0xD2, 0xA1, 0xDA, 0xE8, 0x73, 0xF1, 0x24, 0xB9, 0xEA, 0x69, 0x77, 0xE4, 0x2A, 0x7D, 0xC4,
+    0xD2, 0xB0, 0x7F, 0xAB, 0x28, 0xB1, 0xD0, 0x34, 0xF1, 0x89, 0x18, 0x57, 0xB0, 0x65, 0x50, 0x3D,
+    0x5E, 0x81, 0xE5, 0xEE, 0xBF, 0xD1, 0x58, 0x1E, 0xC6, 0xA1, 0xCF, 0xD7, 0x31, 0x4A, 0x5D, 0x78,
+    0xC6, 0xED, 0x7F, 0xCC, 0xC4, 0xBD, 0xFB, 0x6D, 0xF6, 0xEE, 0x26, 0xF7, 0xA6, 0xBE, 0x08, 0x6A,
+    0xAD, 0x03, 0x24, 0xE0, 0x79, 0x24, 0xD0, 0xC1, 0xE9, 0x9A, 0xAF, 0x94, 0x3F, 0x10, 0x2E, 0xC8,
+    0x93, 0x34, 0x08, 0x70, 0xFF, 0x2F, 0x32, 0x66, 0xAF, 0x19, 0xFD, 0xFE, 0xEC, 0x24, 0x44, 0x79,
+    0x30, 0x41, 0x21, 0x49, 0xC0, 0xEF, 0x30, 0x59, 0xC5, 0x5B, 0xBA, 0x04, 0xAB, 0x03, 0x2F, 0x50,
+    0x55, 0xF5, 0x48, 0x9F, 0x46, 0x98, 0xF3, 0xC1, 0xDC, 0xFE, 0x8F, 0xE9, 0x59, 0x9F, 0x49, 0xB6,
+    0x6D, 0x53, 0x9F, 0x05, 0x3E, 0xED, 0xCE, 0xAE, 0x4F, 0xE8, 0x38, 0xE6, 0x0F, 0x55, 0x96, 0xD2,
+    0x53, 0x72, 0x6C, 0x80, 0x78, 0xFB, 0x7C, 0xDD, 0xD0, 0x2E, 0x23, 0x1B, 0x65, 0x08, 0xF2, 0x76,
+    0x7C, 0x34, 0x6A, 0xDC, 0xA0, 0xFB, 0xEC, 0xDF, 0x45, 0x1C, 0x53, 0x6B, 0xFD, 0x2C, 0x96, 0x3D,
+    0xF4, 0x29, 0x4C, 0xF8, 0x92, 0x9E, 0xC4, 0x6B, 0x97, 0xCD, 0x16, 0x4D, 0xAB, 0xBC, 0x12, 0xED,
+    0x32, 0x8C, 0xAA, 0x94, 0xEC, 0x3E, 0xF2, 0xEC, 0x24, 0x35, 0xD0, 0x97, 0xC9, 0x1E, 0x4C, 0x57,
+    0xF3, 0xC5, 0x3D, 0xE9, 0x11, 0x6B, 0xB0, 0x66, 0xB4, 0x45, 0xE4, 0x4C, 0xE3, 0x5C, 0xFA, 0x24,
+    0x0F, 0x70, 0x09, 0xB5, 0xF5, 0x5B, 0x80, 0xBD, 0x0B, 0x14, 0xB4, 0xF5, 0x9B, 0x51, 0x10, 0x6D,
+    0xB8, 0x29, 0x6F, 0x74, 0x89, 0x89, 0x0E, 0x26, 0x08, 0xBF, 0x3E, 0xC2, 0xD5, 0x30, 0x1D, 0xAC,
+    0x33, 0x19, 0x10, 0x32, 0x5E, 0xCB, 0x9A, 0x50, 0x52, 0xB4, 0x8F, 0xC8, 0xA1, 0x44, 0xB8, 0x2E,
+    0x8B, 0x0D, 0x67, 0x1E, 0x8F, 0x31, 0x03, 0x99, 0x96, 0xB2, 0x76, 0xF2, 0xC7, 0xDF, 0xC3, 0x55,
+    0x52, 0xE3, 0x17, 0xF1, 0xDF, 0x75, 0x60, 0xB0, 0x48, 0xF8, 0xC1, 0xDC, 0xB2, 0xFC, 0x8A, 0x17,
+    0x6A, 0xED, 0x58, 0x33, 0x02, 0x24, 0x07, 0x86, 0xD4, 0xC0, 0xD9, 0x96, 0x3E, 0x05, 0x10, 0x78,
+    0x5D, 0x69, 0x56, 0x7F, 0x1D, 0x08, 0x20, 0x49, 0x6E, 0x4F, 0x2A, 0x0B, 0xE6, 0xFD, 0x1E, 0x32,
+    0x08, 0x07, 0x62, 0xA7, 0x9C, 0xD5, 0x34, 0xF0, 0x37, 0x13, 0x8E, 0x43, 0x10, 0x9D, 0xF9, 0x51,
+    0x38, 0xBB, 0x5F, 0x61, 0x0A, 0x18, 0xD4, 0xA4, 0xFB, 0x60, 0x93, 0xED, 0x0A, 0x6F, 0x99, 0x89,
+    0xD6, 0x63, 0x5C, 0x15, 0x6F, 0x93, 0xD8, 0xB1, 0xF2, 0x95, 0x11, 0xDE, 0x20, 0xA2, 0xEE, 0x1E,
+    0x84, 0xDA, 0x3F, 0xF1, 0xE6, 0x10, 0xA4, 0xA8, 0x2F, 0xF1, 0x6E, 0x2A, 0x07, 0x4D, 0x8D, 0xE6,
+    0x39, 0x96, 0x8A, 0xCC, 0x00, 0x33, 0x3F, 0x0C, 0x77, 0x5F, 0x2A, 0x85, 0x25, 0x29, 0x1E, 0xF6,
+    0x65, 0x0F, 0x2D, 0x5E, 0x05, 0xBF, 0x3C, 0x0E, 0x0A, 0x17, 0x98, 0xB8, 0xA4, 0x49, 0x28, 0xA9,
+    0x3B, 0xED, 0xCE, 0xF3, 0x7E, 0xB6, 0x38, 0x66, 0x0A, 0x31, 0x42, 0xC7, 0x2E, 0x40, 0x63, 0x16,
+    0xA7, 0x80, 0xE8, 0x19, 0x3A, 0x61, 0xC7, 0x84, 0xBE, 0x89, 0x59, 0xD0, 0x23, 0xD9, 0xAA, 0x84,
+    0x2A, 0x26, 0x53, 0x32, 0x0D, 0x6B, 0xBC, 0xBF, 0xAD, 0xE1, 0x03, 0x5F, 0x4A, 0xC7, 0x5F, 0x03,
+    0x88, 0x0B, 0x8F, 0x7A, 0x53, 0xF8, 0xCC, 0x92, 0xAD, 0x57, 0x04, 0xD8, 0xC9, 0x9F, 0x51, 0xB7,
+    0x9C, 0x6A, 0xAB, 0x45, 0x27, 0x0F, 0xC6, 0x21, 0xBE, 0x01, 0x43, 0x8F, 0x0C, 0x54, 0xDD, 0xAF,
+    0xF6, 0xFB, 0x32, 0xA3, 0x95, 0xCC, 0x09, 0xBC, 0x98, 0xAD, 0xEF, 0xA8, 0xC5, 0x3F, 0x47, 0xF7,
+    0x46, 0xBF, 0x2C, 0xF6, 0x05, 0xFB, 0xC8, 0xE8, 0x56, 0x2C, 0x50, 0x89, 0xDF, 0x14, 0x67, 0xE0,
+    0xD4, 0x41, 0x12, 0x82, 0xD1, 0x94, 0x75, 0x00, 0x3E, 0xF9, 0x4F, 0xCB, 0x20, 0x9A, 0x62, 0x16,
+    0xB4, 0x50, 0xB6, 0x63, 0x3A, 0x9C, 0x91, 0x3C, 0xBC, 0x0F, 0x6A, 0xB0, 0xE5, 0x2E, 0xD7, 0xEA,
+    0xE7, 0x85, 0xA3, 0xD9, 0xB0, 0xAB, 0x8C, 0x83, 0x69, 0x62, 0x43, 0x56, 0x1E, 0xDD, 0xA1, 0x55,
+    0x86, 0x7F, 0x1F, 0xCB, 0x1F, 0xA4, 0xF2, 0x57, 0xCE, 0xB0, 0xA2, 0x1D, 0xFA, 0x17, 0x43, 0x46,
+    0xF7, 0xFD, 0xA3, 0x72, 0xFC, 0x5C, 0xBC, 0x96, 0xA9, 0xB3, 0x39, 0xB9, 0x54, 0xD3, 0x75, 0x11,
+    0x78, 0xAD, 0x05, 0x61, 0x0A, 0xB6, 0x7E, 0x94, 0xCB, 0x36, 0x2F, 0x00, 0xEA, 0xCA, 0xEA, 0x5F,
+    0x09, 0xE8, 0xDF, 0x98, 0xA0, 0xFE, 0x8B, 0x9A, 0xCB, 0x5E, 0xFC, 0x4E, 0xD8, 0x30, 0x91, 0x97,
+    0x95, 0x92, 0x9E, 0x55, 0xAB, 0x45, 0x4A, 0x0F, 0xDD, 0xFF, 0x73, 0x4E, 0x0C, 0xC3, 0x62, 0x13,
+    0x3A, 0xC9, 0xB5, 0xEF, 0x85, 0xD1, 0x4D, 0xB3, 0x7B, 0xD5, 0xA5, 0x33, 0xAF, 0x9D, 0xBC, 0x47,
+    0xE3, 0x1E, 0xC8, 0x97, 0xF4, 0xAF, 0xE0, 0x96, 0x82, 0x8D, 0x3E, 0xD9, 0xBE, 0x1E, 0xDB, 0x04,
+    0xA6, 0x38, 0xE7, 0x6F, 0x8F, 0xC1, 0xC7, 0x67, 0x0F, 0x50, 0x42, 0xCE, 0x1F, 0x42, 0xCA, 0x2C,
+    0x52, 0xA0, 0xEC, 0xB2, 0x02, 0x56, 0x37, 0x3B, 0x95, 0x70, 0x0F, 0x03, 0x33, 0x61, 0xE7, 0xDD,
+    0x6A, 0x0A, 0x0A, 0x27, 0x8C, 0x0E, 0x18, 0xF0, 0x39, 0x83, 0x87, 0x12, 0x18, 0x2B, 0x53, 0xF4,
+    0x41, 0x01, 0x52, 0xCF, 0xC7, 0xBE, 0x4A, 0x1B, 0x3B, 0x77, 0xCD, 0xF2, 0xE1, 0x4D, 0xC5, 0x78,
+    0x4E, 0x93, 0x9B, 0xBD, 0xD6, 0xFA, 0xBF, 0x60, 0x48, 0x76, 0x19, 0x3F, 0x22, 0xAB, 0xA8, 0x84,
+    0xA0, 0xA7, 0x9E, 0x40, 0xE3, 0xA4, 0x86, 0xF1, 0x4F, 0x35, 0x7F, 0xE9, 0xAD, 0x6F, 0x43, 0x62,
+    0x4E, 0x9B, 0x91, 0xD7, 0x3B, 0x6C, 0x1A, 0x51, 0x67, 0xDB, 0x18, 0x51, 0x9C, 0x8E, 0xB0, 0xB2,
+    0xE2, 0x45, 0xB5, 0x48, 0x11, 0x03, 0x5C, 0xF3, 0x3A, 0xCD, 0x43, 0x14, 0x40, 0xFC, 0x72, 0x8E,
+    0x44, 0xF0, 0xE6, 0xF7, 0x69, 0xD3, 0xC2, 0xF9, 0x5A, 0xC7, 0x68, 0xB3, 0xA0, 0x74, 0x94, 0x12,
+    0xEA, 0x5F, 0xF4, 0x93, 0x2A, 0x9B, 0x71, 0xF5, 0x19, 0x87, 0x98, 0xC2, 0x04, 0xC0, 0x52, 0xC7,
+    0x2C, 0x26, 0xC1, 0x93, 0xDD, 0xB1, 0xB2, 0xA8, 0x68, 0xF7, 0xE3, 0xCE, 0x20, 0x8E, 0x02, 0xBF,
+    0x05, 0x08, 0xBD, 0x53, 0xD1, 0x31, 0x30, 0xD7, 0xF2, 0x7B, 0x15, 0xCB, 0x10, 0x47, 0x7B, 0x66,
+    0xEE, 0x63, 0x44, 0x21, 0xAD, 0xD7, 0xDC, 0xD9, 0x61, 0xCB, 0xC7, 0x71, 0x87, 0x06, 0xEB, 0xE0,
+    0x6B, 0x7D, 0x4E, 0x01, 0x05, 0x0A, 0xDC, 0x8F, 0xF0, 0x40, 0xA7, 0xDF, 0x18, 0xD6, 0x71, 0x2C,
+    0x2E, 0x81, 0x05, 0x95, 0x48, 0x26, 0x52, 0xBB, 0x9F, 0x7D, 0xD0, 0x51, 0x28, 0xA5, 0x7F, 0x9F,
+    0xC5, 0x38, 0x39, 0x3A, 0xDE, 0x1E, 0x53, 0x2F, 0x08, 0x19, 0xE0, 0x56, 0x83, 0x28, 0xB2, 0x5C,
+    0xB4, 0xEF, 0x35, 0x90, 0xE0, 0xE0, 0x54, 0xCC, 0xE6, 0xA7, 0xB4, 0x83, 0x5E, 0xC0, 0xC4, 0xBE,
+    0x46, 0x33, 0x14, 0xB1, 0x09, 0xBB, 0xD2, 0xB3, 0xDB, 0xE9, 0xAC, 0x62, 0xEF, 0x52, 0x42, 0x82,
+    0x5D, 0x99, 0x8E, 0xFD, 0x28, 0xA8, 0xB6, 0xAA, 0xC6, 0x68, 0x58, 0xDF, 0x87, 0x10, 0x32, 0xD9,
+    0xB1, 0xA7, 0x49, 0x76, 0x2D, 0x40, 0xDD, 0x6D, 0xB3, 0x67, 0x4C, 0x59, 0xC4, 0x5C, 0x66, 0x74,
+    0xBE, 0x13, 0xC5, 0x19, 0x92, 0x23, 0x3F, 0x81, 0x74, 0xB1, 0x9A, 0x65, 0x5D, 0xDD, 0x24, 0x7E,
+    0x6F, 0x3B, 0xF1, 0x45, 0x56, 0x9D, 0x66, 0xB2, 0x8B, 0xD6, 0x89, 0xE3, 0xF7, 0xD7, 0xDD, 0x44,
+    0x6F, 0x41, 0x52, 0x43, 0x66, 0xE0, 0xB1, 0x18, 0x37, 0xFE, 0xE4, 0x95, 0x26, 0x71, 0x29, 0x7D,
+    0xC5, 0x7A, 0x4A, 0x6B, 0xB0, 0xB1, 0x3B, 0xF2, 0xFA, 0x67, 0x1D, 0x57, 0xBE, 0x51, 0xF0, 0x76,
+    0x37, 0x45, 0x65, 0xF3, 0x30, 0x75, 0x0C, 0x26, 0xD5, 0x6E, 0x7A, 0xBD, 0xB5, 0x31, 0xE7, 0x30,
+    0x14, 0x50, 0x64, 0xB8, 0x3C, 0x89, 0x43, 0xF1, 0x32, 0x7C, 0x45, 0xE3, 0xD8, 0x52, 0xF2, 0x00,
+    0xD4, 0x8D, 0x76, 0xD4, 0xE6, 0x4C, 0x6D, 0x98, 0x7D, 0x56, 0x37, 0x15, 0x1B, 0x0F, 0x75, 0x66,
+    0x88, 0x29, 0xDF, 0xFB, 0xBF, 0x99, 0x51, 0x46, 0xDA, 0x20, 0xB4, 0xD1, 0xB8, 0x0D, 0xE1, 0xA8,
+    0x82, 0x2C, 0x69, 0x7C, 0x93, 0xE7, 0x51, 0x3E, 0x0F, 0x25, 0xDE, 0x25, 0x2F, 0x8D, 0x28, 0x4C,
+    0xAF, 0x35, 0x4F, 0x1C, 0x6B, 0x4B, 0x43, 0xC9, 0x82, 0xAA, 0x5C, 0x31, 0xF6, 0x4D, 0x9F, 0x3B,
+    0x17, 0x25, 0x21, 0x0D, 0xE4, 0x81, 0x49, 0xD3, 0x02, 0xED, 0xEE, 0x73, 0xCD, 0x54, 0xBD, 0xF1,
+    0x0E, 0x31, 0x5E, 0x49, 0x13, 0xFE, 0xAA, 0xFF, 0x5D, 0x77, 0x65, 0x3D, 0x9A, 0x62, 0xDE, 0x52,
+    0x4F, 0x4E, 0x5C, 0xA6, 0xA2, 0xEA, 0xA0, 0x85, 0x69, 0x6F, 0x64, 0x30, 0x71, 0xD7, 0xE0, 0x5F,
+    0xF0, 0xDF, 0xB7, 0xFC, 0x93, 0x08, 0xDA, 0x58, 0xAA, 0x53, 0x10, 0x3E, 0x2F, 0x47, 0x48, 0x11,
+    0xC7, 0x02, 0xB1, 0xB0, 0x25, 0x46, 0x83, 0x88, 0x5D, 0xF8, 0xBB, 0x43, 0x00, 0x91, 0x84, 0x8E,
+    0x80, 0xF1, 0xE8, 0xE8, 0x90, 0xE4, 0xC8, 0x4A, 0x11, 0xA0, 0x92, 0xAA, 0x7E, 0xA5, 0xCA, 0xA7,
+    0xB6, 0x22, 0x9A, 0xB1, 0x55, 0x8E, 0x6D, 0xE5, 0x47, 0xD6, 0x2E, 0x58, 0x42, 0xCB, 0xC4, 0x19,
+    0xB5, 0xFF, 0xAB, 0xB1, 0x8F, 0x2A, 0x81, 0x94, 0x19, 0x91, 0xDA, 0x3A, 0x3C, 0xBB, 0x74, 0x8E,
+    0x84, 0x07, 0xD3, 0x3B, 0x6A, 0x5E, 0xD0, 0x4D, 0xD1, 0xA0, 0xD6, 0x5B, 0x32, 0x7F, 0x92, 0xCC,
+    0x5E, 0xDF, 0xCE, 0x88, 0xCD, 0x2B, 0x6A, 0x4B, 0x3D, 0x68, 0x75, 0x7A, 0xB0, 0xF1, 0x36, 0x1B,
+    0xCA, 0x96, 0xFB, 0xE3, 0x77, 0x9B, 0x38, 0x83, 0x2E, 0xDD, 0x4C, 0x53, 0x35, 0x85, 0xC2, 0xE3,
+    0xCF, 0xA2, 0xF3, 0x85, 0x44, 0xA1, 0xB2, 0x9B, 0x0F, 0xE9, 0x2A, 0x82, 0xD5, 0xB3, 0xC3, 0xF1,
+    0x2B, 0xE8, 0x1B, 0x2C, 0xFF, 0x7D, 0x3C, 0xC9, 0x24, 0x24, 0x35, 0xC8, 0x43, 0x10, 0x2A, 0x92,
+    0x53, 0x29, 0x1D, 0x71, 0xB8, 0xFD, 0x7E, 0x18, 0x9B, 0xBA, 0x5F, 0x43, 0x9F, 0x8C, 0x35, 0xB6,
+    0x0D, 0x93, 0xC1, 0xA7, 0xB9, 0x2A, 0x05, 0xEB, 0x59, 0xB4, 0xA1, 0x94, 0x6C, 0x8B, 0xD3, 0x82,
+    0xD3, 0xFF, 0xA7, 0x36, 0x8C, 0x79, 0x8D, 0xB9, 0x11, 0x04, 0x78, 0x49, 0xA8, 0xBE, 0x76, 0x7C,
+    0xAE, 0x9C, 0xD8, 0x26, 0x4C, 0x12, 0x07, 0x45, 0xE3, 0x39, 0x7A, 0xED, 0xFD, 0x1E, 0xC1, 0xC2,
+    0xBB, 0x90, 0xB2, 0xA7, 0x7A, 0xDC, 0x65, 0x4E, 0x99, 0x73, 0x80, 0xF8, 0x9B, 0x6F, 0x93, 0x76,
+    0x18, 0x7D, 0x69, 0x75, 0xA9, 0xB0, 0x42, 0xD9, 0xEB, 0x21, 0xF5, 0x0B, 0x33, 0x47, 0xDD, 0xB4,
+    0xC1, 0x36, 0xDA, 0x6B, 0x82, 0xE1, 0x5B, 0x21, 0xA1, 0xB7, 0x8A, 0x29, 0x73, 0x64, 0x06, 0xC9,
+    0x0A, 0x67, 0x82, 0xCD, 0xD2, 0xC9, 0x5C, 0x62, 0x75, 0x03, 0x1A, 0xD7, 0x32, 0xFE, 0x84, 0x4E,
+    0xB6, 0xCF, 0x97, 0x0D, 0x6C, 0x12, 0x0A, 0x57, 0xC3, 0xF2, 0x87, 0x6C, 0x1D, 0x05, 0x39, 0x0C,
+    0xC9, 0xDB, 0xA8, 0xE5, 0x2E, 0x6A, 0xE0, 0xAB, 0xD1, 0x1C, 0xCC, 0x16, 0xFE, 0xB7, 0x49, 0x3C,
+    0xC0, 0xCB, 0x43, 0x63, 0x74, 0x89, 0xD8, 0xB6, 0xC0, 0x69, 0x80, 0xF4, 0x8E, 0x84, 0xE0, 0x10,
+    0x61, 0x3E, 0xF4, 0x04, 0xB5, 0x04, 0x37, 0xA4, 0x23, 0x33, 0xD8, 0x3C, 0x35, 0x26, 0xC9, 0xF6,
+    0x06, 0x85, 0x5B, 0xC2, 0x8F, 0x53, 0xBA, 0x46, 0xDE, 0x4C, 0x7A, 0xCD, 0x8F, 0xF9, 0x31, 0x8A,
+    0x21, 0xD9, 0xDF, 0x0C, 0x2A, 0xC4, 0xF0, 0x1F, 0xF1, 0x37, 0xD1, 0x1F, 0xA5, 0x21, 0x27, 0xE8,
+    0x2B, 0xA6, 0xB6, 0x89, 0x34, 0xF4, 0xF3, 0x7C, 0x24, 0x0E, 0xA6, 0xDB, 0xB3, 0x9D, 0x60, 0x29,
+    0x3A, 0xC7, 0xD6, 0xAE, 0xE7, 0x95, 0xBF, 0x30, 0x11, 0xA4, 0x77, 0xCC, 0x7C, 0xE7, 0x96, 0x7E,
+    0xAC, 0xFC, 0xFA, 0xFD, 0x41, 0xAA, 0x0C, 0x6C, 0x53, 0x56, 0xB6, 0x55, 0x7E, 0xC3, 0xB4, 0x82,
+    0x4B, 0xC0, 0x4A, 0xFE, 0xF7, 0x5F, 0xD1, 0xAB, 0xD8, 0x89, 0x00, 0x44, 0xAA, 0xB1, 0x62, 0xEF,
+    0xD6, 0x7F, 0x1B, 0x7B, 0x22, 0x48, 0xEA, 0x00, 0x53, 0x49, 0xA7, 0xCD, 0xA6, 0x7B, 0x61, 0xE3,
+    0xDD, 0xFC, 0xBF, 0xB7, 0xB0, 0xCB, 0xAE, 0xAC, 0xDE, 0x9B, 0x98, 0xC8, 0x86, 0x7C, 0xB2, 0xFB,
+    0xED, 0x75, 0xA4, 0x30, 0xBF, 0x8A, 0x52, 0x95, 0x7E, 0xCF, 0x4B, 0x28, 0xF2, 0xA2, 0x2F, 0xB9,
+    0xA2, 0x24, 0x93, 0xA3, 0x84, 0xCB, 0x2C, 0xC0, 0x7D, 0x2F, 0x6E, 0x35, 0x33, 0x1B, 0x0F, 0x6E,
+    0xFF, 0x32, 0x92, 0x09, 0x17, 0x31, 0xE4, 0xFC, 0x2C, 0x6A, 0x93, 0x1B, 0xFA, 0xA4, 0x87, 0x04,
+    0x9D, 0x1E, 0xCC, 0xC1, 0xD4, 0x40, 0x83, 0x21, 0xB3, 0x5F, 0x3F, 0x68, 0x9C, 0x37, 0x68, 0x47,
+    0x6A, 0x21, 0x98, 0xBC, 0x95, 0x50, 0xBE, 0xF7, 0xD4, 0x72, 0x20, 0x70, 0x12, 0x4F, 0xCB, 0x77,
+    0xBF, 0x68, 0x5A, 0xCE, 0xB5, 0x13, 0xC6, 0x25, 0x30, 0x75, 0xA4, 0xF6, 0xE9, 0xDC, 0xF5, 0xC2,
+    0xB0, 0x57, 0x55, 0xC3, 0x69, 0xE5, 0xF1, 0xB9, 0xAE, 0x55, 0x69, 0x56, 0x5A, 0xBC, 0xCE, 0x0F,
+    0x11, 0x32, 0x2A, 0xE9, 0x7E, 0x40, 0x40, 0xCC, 0xDD, 0x04, 0x62, 0x8B, 0x3B, 0x57, 0xE5, 0x45,
+    0xCB, 0xEE, 0xF0, 0x3D, 0x6A, 0xAC, 0xDD, 0x83, 0x7C, 0x2F, 0x66, 0x9A, 0x6C, 0x3B, 0xD1, 0x80,
+    0x85, 0xE6, 0xE7, 0xEA, 0xE0, 0x89, 0x19, 0x0E, 0x5A, 0xDE, 0x7E, 0x8F, 0x6C, 0x05, 0xB3, 0xA5,
+    0x89, 0x08, 0x45, 0x60, 0xA5, 0xE0, 0xB8, 0xD1, 0x7D, 0x45, 0xB6, 0x23, 0x19, 0x84, 0x6A, 0xC2,
+    0x33, 0xD2, 0xD8, 0x9A, 0x87, 0xD0, 0xF4, 0xED, 0x06, 0x11, 0x08, 0xF1, 0xF2, 0x92, 0xA5, 0x4D,
+    0xF6, 0xE7, 0xBF, 0x8E, 0x3D, 0x01, 0x60, 0x50, 0xC0, 0x4F, 0xBB, 0x37, 0xAA, 0x8E, 0xE4, 0x81,
+    0x9F, 0xBD, 0xDD, 0xA0, 0xA1, 0x00, 0xD8, 0x5C, 0x55, 0xB0, 0xCF, 0x39, 0xEF, 0xA0, 0xE1, 0x4F,
+    0xA7, 0x5D, 0x46, 0x85, 0x11, 0x98, 0x8F, 0x9E, 0xEB, 0x16, 0x0D, 0xF7, 0x0F, 0xEE, 0x9F, 0xBD,
+    0x22, 0x87, 0x0B, 0x10, 0x0B, 0x9E, 0x4D, 0xC1, 0x5F, 0x82, 0xFA, 0xED, 0xCC, 0xAC, 0xB4, 0x62,
+    0xCA, 0x57, 0x8B, 0xE7, 0x60, 0x5B, 0xCF, 0x9B, 0x78, 0xFB, 0x8D, 0x10, 0xCD, 0x33, 0x68, 0x19,
+    0x25, 0x00, 0xCB, 0xD1, 0x13, 0xB4, 0xA3, 0x21, 0x07, 0x5C, 0xED, 0xC5, 0xBB, 0xFA, 0x60, 0x8C,
+    0xB7, 0xD4, 0x41, 0x39, 0x2D, 0x9E, 0x69, 0x3E, 0xC8, 0x25, 0x34, 0xA4, 0x5B, 0x52, 0xB3, 0xBD,
+    0x33, 0xC9, 0x74, 0x7B, 0x7D, 0x46, 0x61, 0x9D, 0x9F, 0x28, 0xBC, 0xE6, 0x53, 0xD3, 0xEA, 0x5E,
+    0xEF, 0xE3, 0x2E, 0xE8, 0x76, 0x68, 0x75, 0x80, 0x98, 0x78, 0x9F, 0x20, 0xF8, 0x50, 0xB7, 0xA1,
+    0x88, 0x0C, 0x0B, 0xD6, 0xF4, 0x84, 0x7C, 0xA5, 0x7D, 0xEE, 0xBB, 0xD6, 0x47, 0x30, 0x89, 0x5C,
+    0xF6, 0xF3, 0x9F, 0x83, 0x56, 0xB5, 0x47, 0xCD, 0x9F, 0xD6, 0x50, 0x7A, 0xD2, 0xE5, 0x3C, 0x36,
+    0x36, 0xBE, 0xBB, 0xAD, 0xB5, 0xDE, 0x92, 0x9F, 0xAF, 0x06, 0x5E, 0x3E, 0x36, 0xB9, 0xC2, 0x53,
+    0xCA, 0x35, 0x21, 0x3E, 0x4F, 0x83, 0x4C, 0x6B, 0x5E, 0x80, 0x98, 0x05, 0x49, 0xE7, 0x17, 0xC6,
+    0x6E, 0x29, 0x41, 0xF1, 0x51, 0xB6, 0xDF, 0x97, 0x9C, 0x37, 0xEB, 0xD1, 0x28, 0x57, 0xDD, 0xD5,
+    0x64, 0x93, 0x31, 0x80, 0x67, 0x67, 0x4B, 0xF3, 0x08, 0x38, 0x6D, 0x8A, 0x0D, 0x50, 0x5D, 0x22,
+    0x03, 0xF2, 0x5F, 0x79, 0x98, 0x87, 0x2D, 0x2D, 0x32, 0x91, 0xD9, 0x7C, 0x07, 0x8B, 0xA5, 0x83,
+    0xC0, 0x89, 0xE1, 0x9D, 0x78, 0xF5, 0xB8, 0x88, 0x5F, 0xF6, 0x5C, 0x35, 0x13, 0x2B, 0x07, 0xEA,
+    0xAB, 0xED, 0x98, 0x1D, 0xC2, 0x51, 0x56, 0x41, 0x90, 0xA3, 0x0D, 0xB5, 0x96, 0xCB, 0x34, 0x1C,
+    0x6E, 0x43, 0x8F, 0xBF, 0xB5, 0x6F, 0x5D, 0x5E, 0x94, 0x99, 0xC1, 0xD9, 0x12, 0x0F, 0x1D, 0x1E,
+    0x16, 0x01, 0xA7, 0x71, 0xB1, 0xF5, 0x49, 0xE3, 0x77, 0x3D, 0x02, 0xCF, 0xE2, 0x7C, 0x96, 0x77,
+    0x8B, 0xA8, 0x01, 0xFD, 0xC0, 0xB5, 0x58, 0x6E, 0xA2, 0x57, 0xFF, 0x31, 0x20, 0x5D, 0x90, 0x59,
+    0x55, 0x42, 0xB5, 0x5E, 0x8F, 0x4C, 0x23, 0x55, 0x23, 0x21, 0x4A, 0x79, 0x30, 0x9C, 0xF8, 0xB8,
+    0xD4, 0x5F, 0x23, 0x66, 0xF4, 0x01, 0x96, 0x43, 0xF8, 0x2A, 0x20, 0xFD, 0x04, 0x7E, 0xE4, 0xC3,
+    0x4B, 0xC3, 0x57, 0x85, 0x61, 0x15, 0x44, 0x7D, 0x8B, 0xDC, 0x29, 0xA4, 0xDB, 0xE6, 0x2D, 0xCC,
+    0x3E, 0x12, 0x03, 0xEB, 0xC3, 0xB9, 0xDC, 0xE0, 0x13, 0x74, 0x41, 0x2B, 0xF6, 0xEF, 0x67, 0xDD,
+    0x1D, 0xEE, 0x8B, 0x07, 0x30, 0x68, 0xF8, 0x56, 0x64, 0x2B, 0x4E, 0xB1, 0x19, 0xE3, 0xE7, 0xBE,
+    0x72, 0xD9, 0x50, 0x69, 0x3C, 0x21, 0xDA, 0xEE, 0x63, 0x89, 0x5D, 0xB3, 0x79, 0xD8, 0xEF, 0x26,
+    0xE2, 0x1F, 0x66, 0x17, 0x4C, 0x70, 0xCF, 0xDF, 0xC0, 0x9F, 0xE9, 0x8F, 0xA2, 0x88, 0xDB, 0xD2,
+    0x7F, 0xDF, 0x32, 0xEA, 0xEF, 0x83, 0x4F, 0xC3, 0x6F, 0x7F, 0x0D, 0x4F, 0x63, 0x00, 0xBA, 0xDD,
+    0x60, 0x37, 0x21, 0x02, 0xAF, 0x99, 0xE6, 0xDC, 0x12, 0xF5, 0x4F, 0xCE, 0x9A, 0xC2, 0x19, 0xB9,
+    0xB2, 0x9E, 0x87, 0x83, 0xA8, 0x06, 0x56, 0x7D, 0xB7, 0x7F, 0x73, 0x38, 0xDC, 0xE9, 0xC7, 0x75,
+    0x63, 0xCA, 0x3C, 0x07, 0x06, 0x6A, 0x9E, 0x97, 0x14, 0x2E, 0xED, 0x40, 0x58, 0x3D, 0x9F, 0x52,
+    0x8F, 0x52, 0x40, 0x3A, 0x2A, 0xBB, 0x3B, 0xE1, 0x8B, 0xEA, 0xD4, 0xCD, 0xC0, 0xE9, 0x68, 0x15,
+    0x53, 0x93, 0x59, 0xC1, 0x3A, 0x50, 0xD6, 0x98, 0xF5, 0x4E, 0xBC, 0x87, 0x3E, 0x3A, 0x2E, 0xB0,
+    0x03, 0x88, 0x40, 0x5B, 0x6A, 0x9B, 0x6D, 0x3D, 0xCB, 0x6C, 0x1B, 0x0A, 0xAA, 0x7F, 0xBC, 0xE1,
+    0x56, 0xF0, 0x62, 0x09, 0xC4, 0x04, 0xFB, 0xE2, 0x61, 0xAA, 0xDE, 0x73, 0xF3, 0x37, 0xA9, 0x49,
+    0x98, 0x29, 0x05, 0x67, 0x7C, 0xB8, 0x78, 0xFE, 0xD6, 0xF8, 0xBF, 0x59, 0xD4, 0xF5, 0x20, 0x37,
+    0xCC, 0x4C, 0x5A, 0xC5, 0x26, 0x17, 0x34, 0x8D, 0xB0, 0x30, 0x79, 0x92, 0x64, 0xAD, 0xFB, 0x6D,
+    0x73, 0xD9, 0xD2, 0x5D, 0x4C, 0x52, 0x86, 0xB2, 0x4A, 0xE5, 0xDE, 0xF0, 0x58, 0x72, 0xE5, 0xB5,
+    0xC3, 0x83, 0xD4, 0xFC, 0x7E, 0x2F, 0x2D, 0xAD, 0x90, 0x36, 0xCC, 0xD6, 0x49, 0x93, 0xFE, 0xA0,
+    0x7A, 0xED, 0x8B, 0x85, 0x73, 0x65, 0x1A, 0xAD, 0xB2, 0xD5, 0xA1, 0x86, 0x8A, 0x43, 0x81, 0xD9,
+    0x4F, 0xA0, 0x09, 0x4B, 0xBF, 0x2C, 0xBB, 0x12, 0x5C, 0xFF, 0xB6, 0x56, 0x26, 0x83, 0x98, 0x7A,
+    0x31, 0x10, 0x72, 0x8F, 0x4F, 0x38, 0x75, 0xA4, 0x5D, 0xC3, 0x49, 0x88, 0x0B, 0x15, 0x86, 0x2D,
+    0x30, 0x2F, 0x8B, 0xAD, 0xC2, 0x5B, 0xBE, 0xC7, 0x79, 0x04, 0x6A, 0x36, 0x2F, 0xD8, 0x27, 0xE2,
+    0xD9, 0x58, 0x2A, 0x0A, 0xA2, 0x14, 0xCB, 0x59, 0x0F, 0xDC, 0x3C, 0x7D, 0x57, 0x0F, 0x47, 0x53,
+    0x1E, 0x3E, 0x99, 0x6E, 0xF6, 0x3B, 0xE8, 0xCF, 0xE3, 0x13, 0x57, 0x14, 0xF5, 0x7C, 0x2F, 0x8B,
+    0xD8, 0x83, 0x3B, 0x1A, 0x7D, 0x15, 0x0A, 0x8A, 0x67, 0x0F, 0x18, 0x21, 0x09, 0x8E, 0xE7, 0x4E,
+    0xC2, 0x66, 0xF9, 0x53, 0x82, 0x24, 0x58, 0xF8, 0x3E, 0x41, 0x34, 0x71, 0x8E, 0x99, 0x87, 0x27,
+    0xB9, 0x1F, 0x8A, 0xAD, 0x56, 0x56, 0x2D, 0x49, 0x00, 0xA4, 0xB2, 0x89, 0xFB, 0x8F, 0x50, 0x11,
+    0xEB, 0x17, 0x6A, 0x51, 0x39, 0xD0, 0x23, 0x1F, 0x76, 0xD6, 0xF8, 0x41, 0x5B, 0x09, 0xDF, 0xEA,
+    0x8B, 0x4E, 0x86, 0x56, 0x12, 0x56, 0x99, 0x8D, 0x1D, 0xC2, 0x15, 0x7C, 0x3C, 0x27, 0xAB, 0x6A,
+    0x48, 0x5A, 0x14, 0x25, 0x1E, 0x69, 0x91, 0x03, 0x26, 0xF3, 0x87, 0xA5, 0x66, 0x14, 0x9E, 0xEA,
+    0x78, 0xC7, 0xEC, 0x9B, 0x0A, 0x40, 0x56, 0x94, 0x78, 0x5A, 0x9D, 0x99, 0xAD, 0xD3, 0xFB, 0xC9,
+    0x5D, 0xCE, 0x05, 0xAC, 0x6E, 0x95, 0x57, 0x6C, 0x4E, 0x04, 0xB5, 0xE4, 0x3B, 0xEF, 0x82, 0x70,
+    0x1B, 0xC4, 0x38, 0x63, 0x0C, 0x66, 0x47, 0xB9, 0xDF, 0x4B, 0xF5, 0xB1, 0xAC, 0xB9, 0xB2, 0xB5,
+    0xF1, 0xF2, 0xE0, 0x67, 0x39, 0x62, 0x1C, 0x0A, 0x4F, 0x10, 0xFA, 0xDA, 0xEC, 0x5A, 0xBD, 0x55,
+    0x82, 0xB9, 0x5F, 0xB9, 0x1C, 0x7B, 0xC3, 0x88, 0x7F, 0xB6, 0x4A, 0x41, 0xA2, 0x02, 0xF2, 0x3E,
+    0xE0, 0x0F, 0x1C, 0xD6, 0xC9, 0xB5, 0x6F, 0xFB, 0xD7, 0x16, 0x49, 0xB2, 0x14, 0xC9, 0x2C, 0x2B,
+    0xC6, 0x45, 0x19, 0x84, 0x17, 0x87, 0xE1, 0xDC, 0x49, 0x48, 0x0B, 0x65, 0x47, 0x2B, 0xFE, 0x7C,
+    0x75, 0x30, 0xFA, 0xB9, 0x40, 0x1C, 0xC2, 0xA2, 0x10, 0x43, 0xDE, 0x5E, 0xF1, 0x4D, 0xCE, 0x56,
+    0xA9, 0x59, 0x5C, 0x7C, 0x37, 0x9A, 0x17, 0x8A, 0xEA, 0x2D, 0xFF, 0x32, 0xF7, 0xB7, 0x01, 0xEE,
+    0xB6, 0xC6, 0xA1, 0xD7, 0xBB, 0x79, 0x88, 0x2B, 0xC6, 0x52, 0x7E, 0xCD, 0x75, 0x19, 0x88, 0xAB,
+    0x51, 0x67, 0xFC, 0x5C, 0x11, 0x79, 0x49, 0x66, 0xE8, 0xE6, 0x48, 0x6B, 0x79, 0x0E, 0x35, 0x93,
+    0x1E, 0xD4, 0x1E, 0xD7, 0xC8, 0x7A, 0xCE, 0x24, 0xF5, 0x01, 0x69, 0x16, 0xC1, 0xFB, 0x8B, 0x36,
+    0x9E, 0x4F, 0x42, 0x0D, 0x7C, 0xB5, 0x8E, 0xDA, 0x2A, 0x07, 0x7D, 0xFF, 0xB3, 0x19, 0xB6, 0x33,
+    0xF4, 0x2B, 0x25, 0xED, 0x7E, 0x21, 0xA2, 0x9A, 0x26, 0x0E, 0x0A, 0xE0, 0x98, 0x1F, 0xAD, 0x79,
+    0xA6, 0x4C, 0xF6, 0x2D, 0xD1, 0xE2, 0x2C, 0x4B, 0xEA, 0xAB, 0x5E, 0xEB, 0x9E, 0xB0, 0xF4, 0xB5,
+    0xFC, 0xCC, 0x68, 0xFF, 0x35, 0x1D, 0xBF, 0xEE, 0x3B, 0x22, 0xC1, 0x95, 0x4C, 0x39, 0x55, 0xE8,
+    0xEA, 0x80, 0xD4, 0x9E, 0x9C, 0x8D, 0xFF, 0x22, 0x60, 0xC6, 0x56, 0x96, 0x86, 0x47, 0x3C, 0xA5,
+    0xB8, 0xD5, 0x35, 0x97, 0xF7, 0x35, 0xC7, 0x08, 0x47, 0xE1, 0xAD, 0xC5, 0x28, 0x54, 0xCE, 0xF3,
+    0xA9, 0x6A, 0x08, 0x38, 0xE9, 0x42, 0x6A, 0x2E, 0xC5, 0xC0, 0xA0, 0xA4, 0x62, 0x7D, 0xE0, 0x6F,
+    0x56, 0x25, 0xEE, 0x90, 0xD9, 0x17, 0x05, 0x1A, 0x0C, 0xAB, 0xD3, 0xD2, 0xBA, 0xDE, 0xAB, 0xBA,
+    0x8F, 0x85, 0x3E, 0xAF, 0x2E, 0xA1, 0x53, 0x02, 0x8A, 0x55, 0x91, 0x88, 0xB8, 0x92, 0x3E, 0x11,
+    0xEF, 0xB4, 0x2B, 0x81, 0xE3, 0xCD, 0x0D, 0xEB, 0xC2, 0x5E, 0x34, 0xCB, 0x27, 0x56, 0x79, 0x69,
+    0xD8, 0x3A, 0xC3, 0x91, 0x94, 0x47, 0xE9, 0xFC, 0x98, 0xA6, 0x74, 0x7E, 0xBE, 0x8D, 0x09, 0xB6,
+    0x5C, 0x46, 0xA4, 0xD1, 0x7B, 0xF8, 0x78, 0x33, 0x88, 0xEF, 0xD6, 0x56, 0x66, 0x8B, 0x27, 0xB3,
+    0x55, 0x27, 0xCB, 0xF5, 0xD1, 0x25, 0x15, 0x97, 0x70, 0x13, 0x09, 0x72, 0xEB, 0xE1, 0xD3, 0xF9,
+    0x89, 0x75, 0x27, 0xF5, 0xA3, 0xA3, 0x00, 0xD6, 0x11, 0x1B, 0x09, 0xF9, 0xB9, 0x0B, 0x8C, 0xBA,
+    0x40, 0xC0, 0x3F, 0x87, 0xCF, 0xC5, 0xAB, 0xB0, 0x50, 0x99, 0x72, 0x5E, 0xF6, 0x73, 0x48, 0xE8,
+    0x0B, 0x4C, 0xDE, 0x49, 0xC0, 0xD7, 0x73, 0x21, 0x21, 0x2C, 0x22, 0x4D, 0x9D, 0xF9, 0x48, 0xA0,
+    0x84, 0x1B, 0xCC, 0x34, 0x2F, 0x1C, 0x58, 0x7E, 0xC4, 0x75, 0xB5, 0x75, 0x28, 0xBC, 0xF8, 0x9C,
+    0x5D, 0xEA, 0x3C, 0x94, 0xF3, 0x5F, 0x0A, 0x90, 0x4C, 0x64, 0xE4, 0xC2, 0x70, 0x69, 0x79, 0xC4,
+    0x28, 0xDF, 0x94, 0x10, 0x43, 0x6F, 0xAD, 0x9A, 0xCC, 0xF3, 0x74, 0x28, 0xBA, 0xDB, 0x8F, 0xE5,
+    0x5D, 0x1F, 0x2D, 0xDB, 0x0A, 0x99, 0x36, 0xA4, 0x50, 0x93, 0x53, 0xAC, 0x37, 0x71, 0x59, 0x64,
+    0xFC, 0xD1, 0x89, 0x4F, 0x9E, 0x3A, 0xDC, 0x2C, 0xBB, 0x78, 0x1F, 0x19, 0x63, 0xD7, 0xB2, 0x55,
+    0xF8, 0x96, 0xFC, 0x19, 0xA6, 0x46, 0xC5, 0xFB, 0xCC, 0x69, 0x97, 0xD4, 0x08, 0x3F, 0xD3, 0xB7,
+    0x27, 0xD0, 0x52, 0x48, 0x0D, 0x42, 0xE3, 0x49, 0xFE, 0xDE, 0x4C, 0x04, 0x3F, 0x81, 0x48, 0x44,
+    0x88, 0x29, 0x38, 0x11, 0x2A, 0x1F, 0x2B, 0x33, 0x13, 0x0F, 0x0F, 0x44, 0xAC, 0xEB, 0xBA, 0xE1,
+    0x83, 0x15, 0x83, 0x52, 0x50, 0xD2, 0x80, 0x28, 0xED, 0x76, 0xE3, 0x59, 0xC8, 0xC1, 0x8C, 0x41,
+    0x22, 0xBC, 0xD9, 0x5F, 0x50, 0x40, 0xFF, 0x5F, 0x66, 0x69, 0x1B, 0xD5, 0x47, 0x76, 0x44, 0xC0,
+    0x85, 0xB5, 0x55, 0x70, 0x13, 0xAC, 0xEE, 0x11, 0x61, 0xAC, 0xFE, 0x1A, 0xA7, 0x43, 0xA9, 0x6D,
+    0xB7, 0x94, 0x50, 0x81, 0x8D, 0xBE, 0xCC, 0xCE, 0xED, 0x62, 0xC4, 0x1B, 0x97, 0xFD, 0x10, 0x14,
+    0xE6, 0x0E, 0x11, 0x16, 0x95, 0x6A, 0x5E, 0x0F, 0x87, 0x88, 0x72, 0xA7, 0x32, 0x9A, 0x05, 0xA2,
+    0xC0, 0xD3, 0x23, 0x0C, 0xC0, 0x34, 0x93, 0x80, 0x51, 0x40, 0x9A, 0x25, 0x4D, 0x5D, 0x70, 0x87,
+    0x4C, 0xCE, 0x45, 0xE2, 0x2D, 0x42, 0x5A, 0x36, 0x5A, 0x2A, 0x69, 0xF2, 0x81, 0xA0, 0x90, 0xFF,
+    0xEB, 0xB5, 0x5A, 0x6B, 0xB5, 0x9F, 0x15, 0x6A, 0x0A, 0x39, 0xF0, 0x3A, 0x3F, 0xA7, 0x8F, 0xF5,
+    0x1B, 0x81, 0xA9, 0x7F, 0xDF, 0x49, 0xEA, 0xC3, 0x6B, 0xC5, 0xC3, 0x23, 0xE5, 0x08, 0x8D, 0xFC,
+    0xDE, 0x55, 0xEA, 0x65, 0xBE, 0x6E, 0x19, 0xB5, 0xAC, 0xD1, 0xE3, 0xC8, 0x70, 0x41, 0x40, 0x29,
+    0xCC, 0xE1, 0xEA, 0x47, 0xC9, 0xB4, 0xB4, 0x86, 0x4C, 0xCC, 0x50, 0x54, 0x46, 0xC1, 0x5A, 0xC0,
+    0x23, 0xEE, 0xF0, 0x4E, 0x7C, 0xEA, 0x5C, 0x22, 0x3D, 0x6E, 0x0C, 0xA2, 0x34, 0x11, 0x69, 0x89,
+    0x5A, 0x95, 0xEB, 0x2A, 0x75, 0x13, 0x81, 0x8A, 0x14, 0xD0, 0x9F, 0x78, 0x90, 0x3F, 0xBC, 0xE6,
+    0x64, 0x82, 0x7B, 0xF3, 0x5E, 0x40, 0x11, 0x1B, 0xF9, 0x21, 0x6A, 0x8F, 0x8B, 0x63, 0xCB, 0xD7,
+    0x1E, 0x02, 0x05, 0xC6, 0x69, 0xAF, 0x0C, 0x3B, 0xAE, 0x7B, 0x53, 0x6F, 0x5B, 0x99, 0x1D, 0x46,
+    0x81, 0x99, 0xF2, 0xC6, 0xEE, 0xDB, 0x2E, 0x23, 0xC3, 0xBB, 0x44, 0xB2, 0xD3, 0xC5, 0x6D, 0x96,
+    0xBA, 0x7F, 0x70, 0x78, 0xC2, 0x31, 0xD8, 0xF5, 0x40, 0xD8, 0xB0, 0x2A, 0x48, 0x09, 0xB5, 0x91,
+    0x77, 0x35, 0x9B, 0x2E, 0x87, 0xEF, 0x9E, 0x37, 0xA3, 0x2B, 0x68, 0xC4, 0xA2, 0x01, 0x48, 0x51,
+    0x5C, 0xEF, 0xE7, 0x47, 0x97, 0x55, 0x85, 0x24, 0xCE, 0x8C, 0x20, 0xFF, 0x9D, 0x7E, 0x4D, 0x09,
+    0xC3, 0xDE, 0x50, 0xDA, 0x52, 0x41, 0xCE, 0x75, 0x57, 0x2C, 0xDC, 0x45, 0x21, 0x33, 0xFB, 0x8C,
+    0x72, 0xA4, 0x03, 0xF1, 0xEB, 0x86, 0x0D, 0x61, 0xA7, 0x95, 0xA4, 0xE7, 0xAD, 0x5A, 0x89, 0xCB,
+    0x99, 0x02, 0xA1, 0xE9, 0x16, 0x64, 0x84, 0x18, 0xF6, 0x0F, 0x0E, 0x25, 0x45, 0x22, 0x5C, 0x56,
+    0x59, 0x6D, 0x61, 0xAD, 0xC0, 0x05, 0x9A, 0x40, 0xD3, 0xCE, 0xE7, 0xA3, 0x92, 0x38, 0x3A, 0xEF,
+    0xA9, 0xE0, 0x08, 0x35, 0x6D, 0x5B, 0x38, 0x40, 0x15, 0x6D, 0xE0, 0x4A, 0x43, 0x4B, 0x63, 0xDA,
+    0x6A, 0x07, 0x7E, 0xB1, 0xCD, 0x12, 0xDC, 0x05, 0xA2, 0x23, 0x57, 0x28, 0x7A, 0x0D, 0xB4, 0x89,
+    0xBD, 0xA3, 0xDB, 0xF4, 0x70, 0x8B, 0x12, 0xFC, 0xD0, 0x75, 0x40, 0x7D, 0x92, 0x8C, 0x5C, 0xD7,
+    0xA7, 0xE4, 0x6D, 0x7B, 0x92, 0x89, 0x0C, 0xF4, 0xFA, 0xE5, 0x49, 0x15, 0x80, 0x68, 0x88, 0x25,
+    0xC5, 0x93, 0xAF, 0x78, 0x8E, 0x92, 0x31, 0xE8, 0xBA, 0x9B, 0xEC, 0x93, 0x2E, 0x06, 0xBC, 0x87,
+    0x30, 0x6E, 0x6F, 0x42, 0x31, 0xC6, 0xCD, 0xEA, 0xE2, 0x43, 0xDF, 0xA6, 0x2C, 0xFE, 0x05, 0x4E,
+    0x63, 0xD6, 0x63, 0xD8, 0x46, 0x56, 0xD8, 0xB2, 0x6E, 0x4F, 0xDC, 0xF5, 0x23, 0xDE, 0x49, 0xAD,
+    0xE8, 0x2D, 0x00, 0xEA, 0xAD, 0xE6, 0xE4, 0x4A, 0x48, 0x78, 0x20, 0xCC, 0xC0, 0x47, 0x22, 0xB4,
+    0xB3, 0xB8, 0xAF, 0x71, 0x1D, 0x89, 0x68, 0xD6, 0x18, 0x70, 0x34, 0xAD, 0xFF, 0x99, 0xB3, 0x41,
+    0xD4, 0x6B, 0x93, 0xB5, 0x47, 0x54, 0xB3, 0x7D, 0xF5, 0x5F, 0xA3, 0x6E, 0x54, 0x1A, 0x59, 0x11,
+    0x53, 0x83, 0xAC, 0x23, 0xC2, 0x1F, 0x39, 0x64, 0x11, 0x67, 0x11, 0xBF, 0x50, 0xDB, 0x5D, 0x1D,
+    0x74, 0x48, 0xDC, 0xF3, 0xBE, 0x55, 0xAA, 0x53, 0xDB, 0xC8, 0x5C, 0x79, 0xEA, 0xB3, 0x28, 0x7A,
+    0xB6, 0xDB, 0x71, 0x7F, 0xD7, 0xCF, 0x39, 0x77, 0xFD, 0xCE, 0x8B, 0x9F, 0x1A, 0x27, 0x14, 0x3C,
+    0x78, 0x58, 0x18, 0xE5, 0x93, 0xDD, 0x81, 0x24, 0xF8, 0xFE, 0x97, 0x3C, 0xA8, 0x8F, 0xFE, 0x6C,
+    0xA1, 0xDB, 0xE2, 0xCF, 0x59, 0x9B, 0x28, 0xC2, 0xAB, 0x59, 0x13, 0x98, 0xDD, 0x2F, 0x03, 0xD0,
+    0x05, 0x93, 0x72, 0x97, 0x07, 0xA0, 0xBC, 0xC3, 0x8B, 0x47, 0xDF, 0x55, 0x1C, 0x0E, 0x70, 0x6D,
+    0xEF, 0x48, 0x0E, 0x33, 0x0D, 0x5F, 0x05, 0xF5, 0x98, 0xAC, 0xE3, 0xEE, 0x8F, 0x9D, 0xBD, 0x84,
+    0xB7, 0x9C, 0x8C, 0x06, 0x60, 0x86, 0xB1, 0xDE, 0x80, 0xB3, 0xAC, 0xD7, 0xE8, 0x35, 0xDC, 0x51,
+    0x57, 0x8F, 0xE8, 0x7A, 0xC8, 0xC2, 0x46, 0x3A, 0x22, 0x4D, 0x15, 0x6B, 0x9E, 0x0A, 0xB3, 0xFF,
+    0x11, 0xD9, 0x2D, 0xE0, 0x5A, 0x32, 0xBB, 0x0D, 0x72, 0x0F, 0x8B, 0xB2, 0xD9, 0x86, 0x2D, 0x5F,
+    0x57, 0x92, 0xBF, 0xAF, 0x00, 0x5C, 0xE2, 0x54, 0x91, 0x51, 0x22, 0xA9, 0x3A, 0x48, 0x9F, 0x8E,
+    0xF0, 0xA8, 0x04, 0x1F, 0xD3, 0x58, 0x00, 0xB3, 0xDC, 0x7B, 0x99, 0x74, 0x18, 0x12, 0x44, 0x35,
+    0x65, 0x1A, 0x1E, 0x95, 0xCC, 0x73, 0x53, 0xBB, 0xFC, 0x90, 0x07, 0x68, 0x2B, 0x46, 0x69, 0xF2,
+    0x68, 0x6E, 0x62, 0x31, 0x5B, 0x11, 0x10, 0x9C, 0x18, 0x70, 0x29, 0x0D, 0x1A, 0x88, 0xD8, 0xA5,
+    0xC6, 0x2C, 0xAA, 0xB7, 0x80, 0xC6, 0x36, 0xB0, 0x4E, 0x3C, 0x68, 0x74, 0xB8, 0xFE, 0xF6, 0x82,
+    0x5D, 0x74, 0x71, 0xBE, 0xD1, 0x3C, 0xE0, 0x2D, 0x20, 0x3A, 0x36, 0xA9, 0x87, 0x76, 0xAA, 0x16,
+    0xB7, 0x6F, 0xB8, 0x66, 0x05, 0xEB, 0x63, 0x15, 0xB6, 0xDE, 0x01, 0x49, 0xF5, 0x01, 0x37, 0xF0,
+    0x98, 0x11, 0xC9, 0x43, 0x5D, 0xCB, 0x04, 0x48, 0x75, 0xD4, 0x73, 0x97, 0xE6, 0xD5, 0xEF, 0x97,
+    0x8C, 0xF7, 0x37, 0xC8, 0xDA, 0xAB, 0x53, 0x12, 0x44, 0xF5, 0x72, 0xE7, 0x58, 0xBD, 0x2A, 0x65,
+    0xE5, 0x79, 0x8D, 0xA5, 0x50, 0xBF, 0x3E, 0x3B, 0x36, 0x9D, 0x48, 0x73, 0xA0, 0x17, 0x4C, 0x8E,
+    0x82, 0x98, 0xD0, 0xFD, 0xB1, 0xDB, 0x16, 0xBE, 0x05, 0x70, 0xBE, 0xEF, 0x43, 0x8A, 0xE8, 0xB8,
+    0x79, 0x83, 0xBC, 0x3B, 0x23, 0x94, 0xAD, 0xA8, 0xD9, 0x98, 0x74, 0x4C, 0x91, 0x48, 0x22, 0x96,
+    0x7D, 0x0E, 0x78, 0xF9, 0x35, 0xC0, 0xAE, 0xFD, 0x0A, 0xB0, 0xF0, 0x6C, 0xA7, 0x51, 0x4D, 0x44,
+    0xD9, 0xBD, 0x84, 0x76, 0x48, 0x4A, 0x66, 0x41, 0x55, 0xA6, 0xBE, 0xA4, 0xA2, 0x3E, 0xDE, 0xA0,
+    0xE4, 0x6F, 0xB9, 0xB2, 0xED, 0x74, 0xE2, 0x36, 0x2F, 0x54, 0x64, 0x9C, 0x41, 0xE6, 0xE3, 0xC8,
+    0x35, 0x23, 0xD5, 0x61, 0x0E, 0x03, 0xCA, 0xFA, 0x17, 0xED, 0x05, 0x69, 0x9C, 0x7A, 0x58, 0x4D,
+    0x16, 0x34, 0x15, 0xA3, 0x5B, 0x0C, 0x87, 0x0F, 0x02, 0xD2, 0xB3, 0xAF, 0x00, 0xC2, 0x1D, 0x39,
+    0x87, 0x21, 0xF3, 0x9F, 0x96, 0xD2, 0xA1, 0x8C, 0xBE, 0xFB, 0xF4, 0xAB, 0x0B, 0x65, 0x3A, 0xF9,
+    0xB7, 0x00, 0x91, 0x53, 0xE6, 0xF8, 0x9E, 0xD3, 0x65, 0xFE, 0xEB, 0x00, 0x6D, 0x15, 0x00, 0x7A,
+    0x4D, 0xE8, 0xD2, 0xF9, 0xB7, 0xBC, 0x41, 0xBC, 0x90, 0x29, 0xEF, 0x72, 0xAE, 0x38, 0xE8, 0x25,
+    0x77, 0xEC, 0x55, 0xFF, 0x1D, 0x71, 0x79, 0x8E, 0x7F, 0x32, 0x87, 0x39, 0x46, 0x58, 0x06, 0x19,
+    0xBB, 0xC0, 0x77, 0x5A, 0x3E, 0xB5, 0xE2, 0x35, 0x7C, 0x24, 0xB5, 0xCC, 0x68, 0xA3, 0x2C, 0xC2,
+    0xF4, 0x48, 0x39, 0x21, 0x25, 0x46, 0xE1, 0x2B, 0x08, 0x8D, 0x5E, 0xDC, 0x85, 0x4E, 0x03, 0x59,
+    0x21, 0x42, 0x2C, 0x0F, 0x65, 0xC8, 0xF9, 0x27, 0x7C, 0x28, 0x0A, 0xAF, 0x2E, 0x88, 0x88, 0x0E,
+    0xB7, 0xB7, 0xB7, 0x01, 0xCA, 0xD8, 0x19, 0xC8, 0x43, 0xE5, 0xCD, 0xBB, 0xBE, 0xC2, 0x74, 0xDE,
+    0x1F, 0xBA, 0x0B, 0x4C, 0x40, 0x30, 0xEA, 0xC4, 0x76, 0xE7, 0x30, 0xE9, 0xDA, 0x19, 0x30, 0x33,
+    0x86, 0xD8, 0xC7, 0x47, 0xB3, 0xBB, 0x7A, 0x0D, 0x5F, 0xF1, 0x44, 0x8A, 0xE5, 0x2F, 0x86, 0xC9,
+    0xCF, 0x5A, 0xF5, 0x12, 0xA1, 0xC8, 0x7B, 0x5F, 0x83, 0x98, 0x96, 0x2D, 0x6A, 0x99, 0xE8, 0xE5,
+    0xD7, 0x4E, 0x6D, 0x0A, 0x51, 0xCA, 0x90, 0x8F, 0x17, 0x4A, 0x02, 0x94, 0xAF, 0xBC, 0xB9, 0x64,
+    0x2A, 0xFD, 0x29, 0x84, 0x40, 0x53, 0x71, 0xD6, 0x85, 0xEF, 0x26, 0xD4, 0x33, 0x6C, 0x18, 0x8C,
+    0x4F, 0x4A, 0xFB, 0xA9, 0xAC, 0x24, 0x63, 0xED, 0x61, 0x20, 0x9C, 0x3A, 0xF0, 0xCF, 0x60, 0xDB,
+    0xA2, 0xB8, 0xB7, 0x61, 0xB7, 0x0E, 0x68, 0xC3, 0xCB, 0x08, 0x69, 0xA2, 0x08, 0x7B, 0xB4, 0xCB,
+    0xBA, 0x4A, 0x89, 0x26, 0x38, 0xED, 0x8D, 0x7B, 0x56, 0x27, 0xE1, 0x00, 0xB9, 0x18, 0x7F, 0xDC,
+    0x42, 0x7C, 0x0D, 0xD6, 0x58, 0x93, 0xC9, 0x6F, 0x56, 0x22, 0x9A, 0x8C, 0x80, 0x19, 0xBA, 0x0F,
+    0xE0, 0x52, 0x22, 0x1D, 0x98, 0xA7, 0x98, 0x85, 0xCE, 0x21, 0xE2, 0x6E, 0x70, 0x9E, 0x4F, 0xE5,
+    0x04, 0x35, 0xEA, 0x66, 0x88, 0x22, 0x63, 0xB9, 0x17, 0x1A, 0xFA, 0x56, 0x35, 0x06, 0xB4, 0x27,
+    0x2C, 0x8F, 0xE3, 0x13, 0x47, 0xCC, 0xA8, 0xC6, 0x46, 0x54, 0x57, 0xD8, 0x70, 0xFF, 0x86, 0x4C,
+    0xB3, 0xF2, 0x0E, 0x29, 0x5E, 0xD8, 0x88, 0x4C, 0x5A, 0x16, 0x1A, 0x79, 0x41, 0x87, 0x70, 0x52,
+    0x1E, 0xBA, 0x02, 0xCC, 0xA3, 0xC9, 0xEF, 0x53, 0x12, 0x56, 0x6D, 0x55, 0xBF, 0x8B, 0xAF, 0xFD,
+    0x12, 0xE0, 0x2D, 0x27, 0x83, 0x9F, 0x8E, 0x2E, 0x1B, 0x7A, 0x22, 0x6D, 0xF9, 0x59, 0xF9, 0x63,
+    0x7F, 0xB0, 0xBF, 0x05, 0x97, 0x78, 0x2E, 0x67, 0xC3, 0xA8, 0x4B, 0x16, 0xCB, 0x72, 0x47, 0xFD,
+    0x0C, 0x0F, 0xAE, 0xC9, 0xB4, 0xB6, 0xE8, 0x99, 0xAA, 0xA3, 0x60, 0xF4, 0xD2, 0x07, 0xF5, 0x82,
+    0xDA, 0x7B, 0xE6, 0x6E, 0xCC, 0x85, 0xD3, 0x2E, 0xC1, 0x13, 0x3D, 0x32, 0xBE, 0xBB, 0x25, 0xA5,
+    0x2E, 0x00, 0xAA, 0x28, 0x63, 0x2B, 0x61, 0x3E, 0x7F, 0x34, 0xA0, 0x83, 0xCE, 0xEC, 0x44, 0x72,
+    0x29, 0x1F, 0x81, 0x62, 0x8A, 0xED, 0x9D, 0x5F, 0xFD, 0xFE, 0x14, 0x52, 0x9C, 0xFC, 0xB4, 0x04,
+    0x70, 0x0A, 0x27, 0x7E, 0x94, 0x69, 0x13, 0x80, 0x97, 0xCC, 0xD2, 0x69, 0xDD, 0xD1, 0x38, 0xFA,
+    0x51, 0x88, 0xC0, 0x9D, 0xB6, 0x14, 0xE3, 0x20, 0xEB, 0x69, 0x62, 0xF4, 0xB7, 0x07, 0xF2, 0x6F,
+    0xFE, 0xDA, 0xE3, 0xF9, 0x7A, 0x64, 0x70, 0xAD, 0x11, 0x10, 0x54, 0x6B, 0x9F, 0x8B, 0x48, 0x9C,
+    0x19, 0x27, 0x83, 0x20, 0x29, 0x3E, 0x7C, 0x57, 0x0E, 0x6E, 0x4F, 0x0B, 0xB7, 0xB2, 0x6D, 0x61,
+    0x52, 0xE0, 0xE5, 0x67, 0xDB, 0xF9, 0x96, 0xBA, 0xF2, 0xA6, 0x4D, 0x2A, 0x98, 0xDF, 0x2F, 0x03,
+    0xD1, 0x78, 0xB4, 0xF9, 0x08, 0x2A, 0x7C, 0xBA, 0xD6, 0x53, 0x57, 0x6A, 0x2C, 0x8D, 0xF4, 0xDC,
+    0xA9, 0x05, 0x00, 0xA6, 0x8C, 0xFB, 0xFF, 0x45, 0x13, 0xF4, 0xE8, 0xBD, 0xB5, 0xF4, 0x1D, 0xF7,
+    0x5F, 0x32, 0xC8, 0x30, 0x1F, 0xD5, 0x0A, 0xC7, 0xA4, 0x28, 0x06, 0xFF, 0x44, 0x18, 0x43, 0x1A,
+    0x8C, 0x63, 0x81, 0x2B, 0x16, 0x4C, 0xE4, 0xB0, 0xF4, 0x9A, 0x49, 0x09, 0x7B, 0x8B, 0x6F, 0x93,
+    0x2E, 0xEC, 0x8C, 0x4F, 0x71, 0x01, 0xFF, 0x54, 0x90, 0x1B, 0x6C, 0xF1, 0x9B, 0xB1, 0x06, 0xDA,
+    0xFC, 0xD4, 0xD6, 0xFB, 0x10, 0xDA, 0x46, 0x8C, 0x0E, 0xAF, 0xF8, 0x19, 0xC0, 0x35, 0xA5, 0xD2,
+    0x74, 0xFD, 0x25, 0xEF, 0xDD, 0x2E, 0x9C, 0x0B, 0xE1, 0x17, 0xD5, 0x0C, 0xFB, 0xC1, 0xA8, 0xE6,
+    0x4A, 0x44, 0x0A, 0xF2, 0x48, 0xA2, 0x07, 0x42, 0x3C, 0x36, 0xC5, 0xD7, 0x45, 0x9D, 0xDB, 0xA6,
+    0x4B, 0x30, 0xC1, 0x3A, 0xB0, 0x31, 0x88, 0x0E, 0xB1, 0x38, 0x4E, 0x34, 0xF9, 0x33, 0xE2, 0x8A,
+    0x0B, 0xF7, 0x7C, 0xF1, 0xE3, 0x07, 0x5A, 0xA0, 0x63, 0x12, 0x22, 0xFD, 0x44, 0x8A, 0xE7, 0x35,
+    0xF7, 0x24, 0xAD, 0x6F, 0xBA, 0xC1, 0xA3, 0x2F, 0x6C, 0x58, 0xF3, 0xD3, 0x13, 0x4D, 0x21, 0x0A,
+    0xA1, 0x1C, 0x54, 0xAA, 0x5E, 0x35, 0xEF, 0x00, 0x48, 0xE8, 0xDE, 0x56, 0xA4, 0xFF, 0xBB, 0xD9,
+    0xF9, 0xA7, 0x0D, 0x83, 0x08, 0x8B, 0x41, 0xDC, 0x63, 0xA4, 0x40, 0x62, 0x46, 0xAD, 0x57, 0x49,
+    0x43, 0x67, 0x6D, 0x43, 0x23, 0x19, 0x7E, 0x17, 0xF6, 0xEF, 0xDE, 0x07, 0xF2, 0x5D, 0x11, 0x78,
+    0x42, 0x8D, 0x11, 0xEF, 0x9F, 0x4A, 0xA6, 0xCE, 0x95, 0x92, 0x34, 0x20, 0x02, 0x95, 0xB9, 0xA8,
+    0x16, 0xF5, 0x5E, 0x2F, 0x7C, 0xF8, 0xE2, 0x07, 0xB8, 0xF4, 0x07, 0x30, 0x1C, 0x77, 0xD3, 0x46,
+    0x11, 0x07, 0x8D, 0x6D, 0x69, 0x87, 0xB4, 0x91, 0xCB, 0x72, 0x8E, 0x2D, 0xAD, 0x0E, 0xCD, 0x97,
+    0x8C, 0xA4, 0x0D, 0x05, 0x93, 0xAF, 0x42, 0xDE, 0x74, 0xF8, 0x97, 0x3B, 0x7F, 0xBF, 0x4D, 0x6A,
+    0x12, 0xE4, 0xE2, 0xF2, 0xAF, 0x6D, 0x1F, 0x31, 0xCA, 0x81, 0x33, 0x2F, 0x42, 0x42, 0xCE, 0x48,
+    0x31, 0xD9, 0x09, 0x2A, 0x70, 0xDF, 0x75, 0xE3, 0x9C, 0x42, 0xEF, 0x8A, 0xB1, 0x96, 0x6B, 0xA1,
+    0xBC, 0x2C, 0x84, 0x77, 0xE9, 0x3D, 0x13, 0x3C, 0x04, 0x9F, 0xC8, 0x70, 0xC3, 0x26, 0xF0, 0xE3,
+    0xC5, 0x04, 0xD3, 0xEA, 0x02, 0x10, 0x7E, 0xD2, 0xB5, 0x32, 0x87, 0x8D, 0x02, 0xA8, 0x1B, 0x19,
+    0x7D, 0x6A, 0x54, 0x45, 0x62, 0x06, 0xD3, 0x28, 0x32, 0xAC, 0x2A, 0x1E, 0xA1, 0xC3, 0x56, 0x96,
+    0xCB, 0xA4, 0x3A, 0x6F, 0xCB, 0x2B, 0xBC, 0xCF, 0x7F, 0x75, 0xE9, 0x05, 0x12, 0x24, 0xC0, 0xD4,
+    0x97, 0xAB, 0xCF, 0x4D, 0x38, 0x23, 0x87, 0xE6, 0x3D, 0x22, 0xE6, 0x3D, 0xE1, 0xE7, 0x45, 0xF6,
+    0x62, 0xF3, 0xAB, 0x9B, 0x0C, 0x11, 0x23, 0x57, 0x56, 0x57, 0xB7, 0xD8, 0x58, 0x37, 0x5A, 0x8C,
+    0x1F, 0x31, 0xA8, 0x29, 0x1A, 0x04, 0xE2, 0xA7, 0x4A, 0xC7, 0x27, 0xCC, 0x39, 0x0E, 0xEF, 0x7F,
+    0xD4, 0xE1, 0x46, 0xCD, 0xCC, 0x96, 0x22, 0xBC, 0x0E, 0xDD, 0xDF, 0xCA, 0xDB, 0x77, 0x65, 0x49,
+    0x7C, 0x2F, 0x2C, 0xC0, 0x94, 0x05, 0x71, 0xC2, 0x23, 0x5E, 0x74, 0xC3, 0x4E, 0x59, 0xA9, 0xE2,
+    0xD1, 0x0F, 0x2B, 0x68, 0x5E, 0x6C, 0x6B, 0x3C, 0xD4, 0x7C, 0x42, 0xE4, 0x26, 0x79, 0xAE, 0xFB,
+    0x14, 0x65, 0x56, 0x75, 0x6F, 0xA6, 0x70, 0xB9, 0x2E, 0x28, 0x94, 0xF1, 0xD2, 0xE3, 0xDA, 0x1C,
+    0x4B, 0xF2, 0x71, 0x8A, 0xED, 0xE6, 0x20, 0x1C, 0xF4, 0xEE, 0x63, 0xBB, 0x74, 0x73, 0x61, 0xD9,
+    0x55, 0x84, 0xED, 0xD9, 0x59, 0x1B, 0x47, 0x8B, 0xE5, 0xEF, 0xBF, 0xA5, 0x78, 0xB4, 0x99, 0x7E,
+    0xF3, 0x31, 0x59, 0x2A, 0xC8, 0x23, 0xB9, 0x0A, 0x81, 0xE2, 0x4C, 0x8A, 0x97, 0xBC, 0x74, 0x08,
+    0xE4, 0x35, 0x2D, 0xD1, 0x3C, 0xBA, 0xF2, 0x20, 0x51, 0x76, 0xF8, 0xFD, 0x20, 0x5D, 0xD2, 0x63,
+    0x7D, 0xA3, 0xEF, 0x7D, 0x56, 0x46, 0x44, 0x86, 0x29, 0x70, 0xC3, 0x5F, 0x1B, 0xC6, 0x3D, 0x42,
+    0xD3, 0x69, 0x78, 0x5C, 0xD3, 0xD4, 0x79, 0x3B, 0x0B, 0x81, 0x48, 0x00, 0xAA, 0xEA, 0x4C, 0x95,
+    0x56, 0x20, 0xE8, 0xB1, 0xB6, 0xE9, 0xA7, 0xD6, 0x0F, 0x4F, 0x5B, 0xB1, 0xC3, 0xCD, 0xF6, 0x43,
+    0x83, 0x6C, 0x4C, 0xA3, 0x17, 0x58, 0xAB, 0x06, 0x68, 0xBB, 0x14, 0x50, 0x07, 0xBC, 0x7B, 0x75,
+    0x9B, 0x5F, 0x96, 0xC6, 0x79, 0xFF, 0x3C, 0x6A, 0x05, 0x5B, 0xA4, 0x63, 0xA3, 0x93, 0x6F, 0x6F,
+    0x87, 0xE8, 0xAF, 0x44, 0x48, 0x02, 0x49, 0x4C, 0xED, 0x8C, 0x3A, 0x51, 0x50, 0x43, 0x6F, 0xE6,
+    0x2A, 0x5E, 0x47, 0x25, 0x05, 0xFB, 0x68, 0x17, 0x2D, 0x90, 0xEB, 0xE2, 0x76, 0xAB, 0x6B, 0x99,
+    0xB3, 0x84, 0x59, 0xD0, 0xFD, 0x6A, 0x60, 0x6E, 0x4F, 0x46, 0xA0, 0x37, 0xE7, 0x06, 0xB6, 0x15,
+    0xC9, 0x00, 0xEC, 0x00, 0x38, 0x0A, 0x8F, 0x81, 0xDB, 0xAB, 0xBA, 0xE7, 0xD3, 0x88, 0xF0, 0x1B,
+    0x5D, 0xE9, 0x41, 0xAC, 0xA0, 0xBC, 0x47, 0x93, 0x73, 0x04, 0x72, 0x88, 0x63, 0x91, 0xD8, 0x60,
+    0x82, 0xAA, 0x2D, 0x49, 0xA4, 0xFF, 0xFF, 0x0C, 0xCF, 0x16, 0x73, 0x74, 0xFE, 0x5F, 0x72, 0x90,
+    0x8C, 0x5E, 0x82, 0x2D, 0x6E, 0xDA, 0x8B, 0x30, 0xA6, 0x39, 0xFB, 0x2A, 0x92, 0xC5, 0x0D, 0x49,
+    0x3A, 0x59, 0x3E, 0x0D, 0xA7, 0xBB, 0x0B, 0x28, 0x46, 0x99, 0x6E, 0x7E, 0x6C, 0xD7, 0x6B, 0x89,
+    0x8D, 0x1A, 0x85, 0x1D, 0x7E, 0x1A, 0xE8, 0xC8, 0xEF, 0x8F, 0xDD, 0x00, 0xF8, 0x4F, 0xAE, 0x12,
+    0xF6, 0x88, 0x91, 0x36, 0xF9, 0xDB, 0x09, 0xDD, 0xF7, 0xD5, 0xB3, 0xC8, 0x90, 0x0C, 0xC4, 0xB0,
+    0x45, 0xD2, 0x96, 0xBF, 0x61, 0xE3, 0xD8, 0xD1, 0x4F, 0xDB, 0x1B, 0xF6, 0xA8, 0x0D, 0x40, 0xF0,
+    0xEF, 0x23, 0x26, 0x2F, 0x25, 0xAB, 0x0E, 0x15, 0xB6, 0x90, 0x1F, 0xA3, 0x6B, 0xEE, 0x93, 0xD4,
+    0x57, 0xA7, 0x78, 0x39, 0xB4, 0x79, 0x2B, 0x9E, 0xE7, 0xFA, 0x2E, 0x1D, 0xAA, 0x41, 0xEB, 0x87,
+    0x99, 0x4E, 0x78, 0x42, 0x47, 0x9D, 0x43, 0x80, 0x9F, 0x56, 0x13, 0x5E, 0x3D, 0x95, 0xF8, 0xB4,
+    0x76, 0x9F, 0x72, 0x83, 0x81, 0xB1, 0x74, 0xDE, 0x43, 0xBE, 0x91, 0x57, 0x71, 0x90, 0x3C, 0xA0,
+    0x1F, 0xA0, 0x87, 0x07, 0x47, 0xDF, 0x5C, 0xFD, 0x21, 0xD6, 0x64, 0x4C, 0x72, 0xFB, 0xCE, 0x21,
+    0xC5, 0x89, 0x23, 0x0B, 0xAE, 0x75, 0x72, 0x73, 0xA6, 0xA6, 0xB3, 0xCE, 0x9C, 0xB1, 0xAF, 0xAB,
+    0xDF, 0x06, 0x55, 0x5F, 0x0C, 0x1D, 0x6D, 0x13, 0xD1, 0xD2, 0xF0, 0x54, 0x00, 0xAE, 0xA6, 0x51,
+    0xF2, 0x8B, 0x50, 0xF5, 0x5D, 0x76, 0xC9, 0x4D, 0x55, 0x3C, 0x6F, 0xC7, 0xCB, 0xD1, 0x43, 0xEB,
+    0x52, 0xCE, 0x84, 0x00, 0x90, 0xEB, 0xBD, 0x54, 0xC9, 0x04, 0x3B, 0x4B, 0xA9, 0x5D, 0x53, 0x0D,
+    0xB6, 0x13, 0x55, 0xD4, 0x36, 0xEB, 0x71, 0x23, 0x00, 0x98, 0xB3, 0xB9, 0x73, 0x8B, 0x0B, 0xD3,
+    0xB9, 0x67, 0x50, 0x28, 0xBC, 0xCC, 0x16, 0xD5, 0xDE, 0x72, 0x5B, 0x75, 0x7B, 0x12, 0xF6, 0x3C,
+    0x94, 0xAE, 0x3E, 0xEF, 0x44, 0x3B, 0x9E, 0x8F, 0x80, 0x1C, 0x18, 0x5F, 0x9B, 0x43, 0x4F, 0xF5,
+    0xB1, 0xD7, 0x8A, 0x42, 0xA0, 0x51, 0x74, 0x86, 0x0F, 0x31, 0x18, 0x6C, 0x47, 0xF8, 0xB9, 0x97,
+    0x0F, 0x4B, 0x47, 0x18, 0xF6, 0x5C, 0x70, 0x49, 0xBF, 0xF5, 0x00, 0x08, 0xC6, 0xD7, 0x04, 0x79,
+    0xE2, 0xE5, 0x05, 0xAA, 0x00, 0x4A, 0xE0, 0xA8, 0x62, 0xDC, 0xD7, 0x17, 0x7C, 0x8D, 0x17, 0x14,
+    0x0A, 0x16, 0x3B, 0x0B, 0x70, 0x50, 0xF0, 0xB8, 0x1A, 0xE0, 0xB9, 0x8C, 0x04, 0xF0, 0xEB, 0xB1,
+    0xCB, 0x15, 0x3C, 0xF6, 0xCE, 0xED, 0x40, 0xA2, 0x40, 0x36, 0x3A, 0xF0, 0xA8, 0x21, 0xF9, 0x31,
+    0x49, 0x8A, 0xC8, 0x1D, 0x57, 0x63, 0xC3, 0x4E, 0x98, 0x3E, 0x2A, 0x0C, 0x41, 0xD9, 0x01, 0xF6,
+    0xB5, 0xB4, 0xCD, 0x5C, 0xCE, 0x1A, 0x04, 0x81, 0xC4, 0x66, 0x38, 0xAA, 0x06, 0xC9, 0xDA, 0x42,
+    0x8F, 0x26, 0x7D, 0xB3, 0x51, 0x43, 0x94, 0x1A, 0xC6, 0x8E, 0x2C, 0x78, 0xC4, 0x4E, 0x88, 0x40,
+    0xF3, 0x38, 0x47, 0x4E, 0x0F, 0xA4, 0x29, 0xBC, 0xC2, 0x02, 0x1F, 0x58, 0x44, 0xF4, 0x1B, 0x8D,
+    0x2B, 0x82, 0x15, 0x92, 0x80, 0xA2, 0x65, 0xBD, 0x50, 0x93, 0xC5, 0xF9, 0xEF, 0x18, 0x83, 0x45,
+    0x51, 0x4A, 0x5C, 0xCC, 0x9C, 0x69, 0xF6, 0x96, 0x9E, 0xC0, 0x14, 0x2A, 0x48, 0x72, 0xBD, 0xEE,
+    0x93, 0x4B, 0x50, 0xFF, 0xF4, 0x60, 0x62, 0x33, 0xE2, 0x0B, 0xD3, 0x63, 0xFE, 0xE6, 0xE5, 0xE9,
+    0xB0, 0x1A, 0x25, 0x7F, 0x5B, 0xDC, 0xF7, 0xA0, 0x9A, 0x5B, 0x61, 0x76, 0x61, 0x5D, 0x1F, 0xE3,
+    0x24, 0x02, 0x11, 0x28, 0x97, 0x0E, 0xCB, 0x95, 0x08, 0x1B, 0xD1, 0xA8, 0xD9, 0xE7, 0x91, 0xC6,
+    0x47, 0x38, 0x10, 0xEC, 0x33, 0xE0, 0x45, 0xF4, 0xE8, 0xAF, 0xBD, 0xCB, 0x5C, 0x32, 0x38, 0x3D,
+    0x49, 0xC6, 0x36, 0x62, 0xE3, 0x7D, 0x94, 0xC4, 0x05, 0xAF, 0x47, 0x0B, 0x01, 0x72, 0xF1, 0x76,
+    0x2B, 0x7C, 0xCC, 0x62, 0xB2, 0xF4, 0xD4, 0xE0, 0x10, 0x02, 0x1D, 0xFD, 0x3B, 0xE3, 0x0F, 0x46,
+    0x45, 0x18, 0x11, 0xF5, 0xBF, 0x15, 0xEB, 0xC7, 0xA4, 0x15, 0x96, 0x53, 0x02, 0xC1, 0xCD, 0xB0,
+    0xC0, 0xD4, 0xE7, 0xBC, 0x47, 0x7F, 0xE3, 0xAD, 0x1F, 0x4A, 0xFF, 0x36, 0xB2, 0x83, 0x5D, 0x1B,
+    0xF1, 0x2C, 0xE9, 0xE5, 0xDA, 0x17, 0x0F, 0x6C, 0x68, 0x55, 0x23, 0xEC, 0x28, 0x4C, 0x2B, 0xC3,
+    0xC3, 0xC2, 0x26, 0x9D, 0xF0, 0x61, 0x8C, 0xDC, 0xD6, 0xDB, 0xDB, 0x3E, 0xF0, 0x37, 0x67, 0xBC,
+    0x67, 0xFA, 0xCD, 0x17, 0xBC, 0xBA, 0xAC, 0x05, 0xA1, 0x50, 0x41, 0x0B, 0x18, 0x97, 0xE9, 0x7B,
+    0xE9, 0xE5, 0xA5, 0x70, 0x14, 0x24, 0x7B, 0x75, 0x74, 0xCD, 0x9C, 0x9B, 0xA6, 0xC3, 0x6B, 0x10,
+    0x7F, 0x9C, 0x6F, 0x8A, 0xE6, 0xDD, 0x30, 0xB0, 0x70, 0x7E, 0x46, 0xB5, 0xC5, 0xDE, 0x97, 0xE0,
+    0x65, 0x64, 0x64, 0x3E, 0xAD, 0xA3, 0xA8, 0x0A, 0x69, 0xC7, 0x37, 0x5E, 0xCE, 0x17, 0xFD, 0x2B,
+    0x0C, 0xAE, 0x04, 0xDE, 0xFB, 0x6A, 0x96, 0xD1, 0x6C, 0x32, 0x00, 0xC8, 0xBD, 0x4B, 0xB6, 0x9A,
+    0xC5, 0xF7, 0xDA, 0xBC, 0xED, 0xA7, 0x11, 0x0D, 0x91, 0x75, 0xC3, 0xFF, 0x7A, 0xC9, 0x06, 0x18,
+    0x1C, 0x31, 0x92, 0xC2, 0x49, 0x7B, 0xB4, 0xC6, 0xF8, 0xA3, 0x42, 0xC0, 0x37, 0xBE, 0xAD, 0x3C,
+    0x06, 0xF5, 0x73, 0x62, 0xBF, 0xDE, 0x08, 0x77, 0x29, 0x52, 0x2E, 0x28, 0x57, 0xBF, 0xF9, 0x98,
+    0xFA, 0xC3, 0x9F, 0xC4, 0xF4, 0xB2, 0xC2, 0x99, 0x4E, 0x45, 0x33, 0x50, 0xB4, 0x9A, 0x65, 0xC9,
+    0xFB, 0x40, 0xC2, 0x77, 0xAC, 0xC8, 0x87, 0x1C, 0x9F, 0x7F, 0xD9, 0x1C, 0xE7, 0xC1, 0x04, 0x44,
+    0xAB, 0xFA, 0x47, 0x5D, 0xE4, 0x89, 0x2D, 0xCF, 0x52, 0xC1, 0x24, 0x30, 0x3D, 0xAD, 0x1B, 0x25,
+    0x34, 0xAF, 0x76, 0xBA, 0xE0, 0x26, 0xF2, 0x63, 0xD0, 0x68, 0xFA, 0x18, 0x07, 0xA4, 0x39, 0xEE,
+    0xF2, 0xF0, 0xEC, 0xDD, 0xB4, 0x95, 0x4E, 0xBF, 0x46, 0x31, 0x39, 0xC7, 0x1D, 0xB6, 0xCB, 0x5F,
+    0xA2, 0xA2, 0x62, 0x83, 0x11, 0xA5, 0xE9, 0xED, 0x92, 0xC2, 0xD8, 0x5B, 0x64, 0xD9, 0x65, 0xFE,
+    0x18, 0xE8, 0xB1, 0xBD, 0xAD, 0xF2, 0xF9, 0xD0, 0x1D, 0xCB, 0x71, 0xDC, 0x49, 0x3F, 0x4F, 0xD9,
+    0x9E, 0x17, 0x7F, 0xF6, 0x46, 0xA0, 0xFF, 0x99, 0x17, 0xA2, 0xE6, 0xEB, 0xDE, 0xB7, 0xAF, 0x26,
+    0x4C, 0xFD, 0xDA, 0xE1, 0xFB, 0xEF, 0xAA, 0xC5, 0x2F, 0xF9, 0x31, 0x5C, 0xF6, 0x91, 0x70, 0xDA,
+    0x66, 0xED, 0xB3, 0x51, 0x72, 0x95, 0x29, 0x22, 0xA5, 0xE2, 0x82, 0x0C, 0x43, 0xFE, 0x92, 0xFF,
+    0x72, 0xA8, 0xD9, 0xF5, 0x6F, 0xCF, 0x63, 0xFC, 0x75, 0xD2, 0x33, 0x47, 0xAD, 0x01, 0x87, 0xC2,
+    0xE6, 0xDE, 0xBB, 0xB9, 0xCF, 0xE2, 0x17, 0x50, 0x3A, 0x68, 0x31, 0xD1, 0xB6, 0xC9, 0x3F, 0x43,
+    0x25, 0xBC, 0xB5, 0xF3, 0xC9, 0xF9, 0xF3, 0xB3, 0x11, 0x5E, 0xF6, 0xE0, 0xBF, 0xAF, 0x1B, 0x90,
+    0xA3, 0x61, 0xA3, 0x36, 0xFB, 0xBF, 0x0E, 0x62, 0xDF, 0xCC, 0x9B, 0x51, 0x59, 0xFE, 0xA4, 0xFA,
+    0xD1, 0x3A, 0x4B, 0xA5, 0x9A, 0xA8, 0x21, 0x01, 0x1D, 0x52, 0xAF, 0xBE, 0x74, 0x2D, 0x8B, 0x91,
+    0x91, 0x98, 0xC9, 0xD1, 0x9C, 0x5B, 0x38, 0x12, 0x00, 0x2B, 0x12, 0x6F, 0x92, 0x7A, 0xC7, 0x45,
+    0x16, 0xB8, 0xA7, 0xB3, 0x9F, 0x46, 0xF9, 0xAE, 0xBD, 0x13, 0xFB, 0xDD, 0xDB, 0x86, 0x8A, 0x94,
+    0xFB, 0x10, 0x3B, 0xA3, 0x4D, 0x4C, 0x4D, 0xDD, 0xC2, 0x38, 0x22, 0x58, 0xC4, 0x34, 0xCE, 0x58,
+    0x78, 0x89, 0x7B, 0x77, 0x28, 0x30, 0xD6, 0xC7, 0x44, 0x04, 0x52, 0x7A, 0x19, 0x1E, 0xF1, 0xFD,
+    0xD3, 0x77, 0x5F, 0x50, 0x0D, 0xAE, 0xAE, 0xEF, 0x59, 0x06, 0xF4, 0x3D, 0x18, 0x43, 0x38, 0x51,
+    0xD6, 0x3D, 0xC5, 0x23, 0x04, 0x1F, 0x5B, 0x25, 0x4C, 0x74, 0xB0, 0xC6, 0xEB, 0x76, 0xBA, 0xE8,
+    0xB1, 0xA7, 0x44, 0xE2, 0x5C, 0xD4, 0x18, 0x1D, 0x34, 0x8D, 0xA8, 0x05, 0x25, 0x03, 0xA2, 0xD7,
+    0xA3, 0x3F, 0x50, 0x07, 0x52, 0x09, 0x2D, 0x88, 0xFC, 0x2C, 0xF3, 0xAF, 0xB4, 0x89, 0x6A, 0xA0,
+    0x27, 0x5F, 0xD3, 0x2B, 0x63, 0x8D, 0xD9, 0x60, 0x1B, 0xD3, 0x35, 0x18, 0x61, 0x93, 0xF6, 0x82,
+    0xD8, 0xBC, 0x9F, 0x90, 0xB6, 0xB1, 0xCF, 0xFD, 0x3B, 0xD4, 0xA8, 0x07, 0x0D, 0x76, 0xF1, 0x44,
+    0x4F, 0x45, 0x10, 0x4C, 0xFB, 0x92, 0x1A, 0x56, 0x48, 0x87, 0x15, 0x7B, 0x55, 0x3D, 0x10, 0xCE,
+    0xD8, 0x07, 0x3A, 0x79, 0x72, 0x17, 0x5C, 0xF2, 0x9C, 0x84, 0xE1, 0x72, 0x36, 0x2A, 0xEB, 0xBB,
+    0xEE, 0x3E, 0xC8, 0x1F, 0x33, 0x2F, 0x53, 0xDF, 0x6B, 0xE8, 0x3E, 0x0A, 0x5C, 0x32, 0x36, 0x81,
+    0x77, 0x4A, 0xD6, 0xD0, 0xA8, 0x14, 0xBB, 0x32, 0xDC, 0x8B, 0x55, 0xB2, 0xEF, 0xD4, 0xE8, 0xCA,
+    0xFF, 0x50, 0xDC, 0xBD, 0x55, 0xB5, 0x5E, 0xBE, 0x1B, 0x74, 0x8A, 0x57, 0x5B, 0xBC, 0xCC, 0x2F,
+    0xF6, 0x72, 0x0C, 0xAF, 0x9F, 0x2A, 0x96, 0xBE, 0xDC, 0xBC, 0xFC, 0x3A, 0xA8, 0xDF, 0x3E, 0x2E,
+    0x78, 0xA7, 0xD8, 0xA0, 0x2A, 0x95, 0x70, 0x24, 0xBC, 0x6C, 0x1A, 0xFA, 0xAA, 0xE6, 0xE1, 0x38,
+    0xE4, 0x8A, 0xD8, 0x63, 0x03, 0x82, 0x3C, 0xFB, 0xA6, 0x9E, 0xB9, 0x69, 0xF6, 0x04, 0x60, 0x37,
+    0x0B, 0xBC, 0xEF, 0x85, 0x70, 0xD4, 0xCB, 0xBE, 0x3E, 0xD3, 0xF2, 0x81, 0x37, 0x45, 0x1A, 0x94,
+    0xB4, 0x02, 0xD9, 0xA2, 0xC8, 0x1D, 0x92, 0xE0, 0x5C, 0xA4, 0x5D, 0x43, 0xA5, 0xFA, 0x1D, 0xD3,
+    0x18, 0x14, 0x0B, 0x18, 0x86, 0x74, 0x8E, 0x16, 0xB3, 0x65, 0xD3, 0x24, 0x45, 0x71, 0xA9, 0x28,
+    0x46, 0x25, 0x68, 0x21, 0x94, 0x8D, 0xDB, 0xCA, 0x13, 0x3C, 0x0C, 0xB1, 0xBB, 0xF2, 0x6E, 0xC2,
+    0x2D, 0x67, 0xBA, 0x0D, 0xA9, 0x5B, 0x3A, 0xD7, 0x45, 0xDC, 0x68, 0x94, 0x41, 0x30, 0xC1, 0xAD,
+    0x0C, 0xEF, 0x7E, 0xB1, 0x66, 0x1E, 0xEE, 0x0E, 0x23, 0xC0, 0x6B, 0x08, 0xF0, 0x3E, 0xD0, 0xA8,
+    0xEF, 0x60, 0x34, 0xA7, 0xDB, 0x9A, 0x3C, 0xD5, 0xEE, 0x02, 0x4C, 0x3E, 0x1C, 0x94, 0x75, 0x8E,
+    0x95, 0xD2, 0x91, 0xCD, 0xF0, 0x20, 0x49, 0xBC, 0x6A, 0xBC, 0x26, 0x0C, 0x40, 0x55, 0x4F, 0xE4,
+    0x29, 0xC7, 0x2D, 0xB0, 0x55, 0x28, 0xB1, 0xB2, 0x99, 0x2A, 0x87, 0x4A, 0x19, 0x58, 0x7D, 0xEE,
+    0x24, 0xE7, 0xEE, 0xA6, 0x6A, 0xBE, 0xE1, 0x96, 0xBB, 0x80, 0xF0, 0x1B, 0x55, 0x71, 0x02, 0x9D,
+    0xCA, 0x8A, 0x51, 0xE4, 0x1D, 0x34, 0x6C, 0x1D, 0x22, 0x91, 0x3C, 0x19, 0xBC, 0x31, 0x59, 0xA0,
+    0xD4, 0x82, 0x96, 0xAE, 0xE9, 0x2B, 0x24, 0x8E, 0xF4, 0x97, 0x3B, 0xF0, 0x06, 0xC3, 0x60, 0x18,
+    0x0A, 0x46, 0xA3, 0x69, 0xA3, 0x9B, 0x35, 0xA8, 0x04, 0xBC, 0x5B, 0x60, 0xE5, 0xF5, 0x10, 0x22,
+    0x03, 0x59, 0x12, 0x09, 0x1B, 0x28, 0x6B, 0xC4, 0xF1, 0x82, 0xB1, 0x72, 0x43, 0x8B, 0x0A, 0x27,
+    0x84, 0x7A, 0x38, 0x72, 0x64, 0xFD, 0x74, 0x39, 0x02, 0xB6, 0x19, 0xE2, 0xDD, 0x28, 0x85, 0x61,
+    0xDE, 0x4F, 0x15, 0x0B, 0x90, 0xE3, 0x83, 0xB5, 0x82, 0xC6, 0xB9, 0xA6, 0xFD, 0x6B, 0x8A, 0xB1,
+    0x9E, 0xEB, 0xA9, 0xFC, 0xAA, 0x10, 0xC9, 0x4D, 0x06, 0xAB, 0x53, 0x06, 0x2F, 0xF5, 0x7A, 0x94,
+    0xFB, 0x45, 0x14, 0x52, 0x1D, 0xFD, 0xCD, 0x2C, 0xC7, 0x7B, 0x6D, 0x89, 0xCB, 0x50, 0xC4, 0x6D,
+    0x89, 0x9D, 0x66, 0x66, 0xFA, 0x17, 0xD7, 0x03, 0xB4, 0x62, 0xAA, 0x6F, 0xEC, 0xB9, 0x33, 0xF1,
+    0x2A, 0x7E, 0x53, 0x2C, 0x86, 0x41, 0xF2, 0x73, 0xE1, 0xC6, 0xFB, 0x6E, 0x0F, 0x5B, 0x31, 0x66,
+    0xB3, 0x6C, 0x89, 0xC7, 0x49, 0x26, 0xE6, 0x1B, 0x22, 0xB1, 0x01, 0xC8, 0x00, 0x1D, 0xFF, 0xAF,
+    0x3C, 0x5F, 0x48, 0xB3, 0x59, 0xCC, 0xAE, 0x96, 0x36, 0x30, 0xCB, 0xBF, 0x64, 0xEB, 0x7D, 0xC1,
+    0xF0, 0x36, 0xA8, 0x0D, 0xD1, 0x5D, 0xAB, 0x31, 0x89, 0x8E, 0x40, 0x1D, 0xED, 0x84, 0xC9, 0x08,
+    0x73, 0xB4, 0xFE, 0x20, 0xEF, 0x15, 0x25, 0xD1, 0xF8, 0xAA, 0x24, 0xF9, 0xCE, 0xEC, 0x2B, 0x38,
+    0x30, 0x98, 0x97, 0x7A, 0x43, 0xEE, 0xFC, 0xCE, 0x1C, 0x90, 0x87, 0x48, 0x7D, 0x7F, 0x97, 0xDF,
+    0x72, 0x18, 0x16, 0xD7, 0xD3, 0xD7, 0x65, 0xA1, 0xB5, 0xEC, 0xC2, 0xFC, 0x95, 0xC0, 0x34, 0x34,
+    0x51, 0x15, 0xE5, 0x72, 0xDC, 0x9A, 0x56, 0x67, 0x01, 0xF8, 0x9C, 0x96, 0x12, 0x9E, 0xF4, 0xBD,
+    0x5B, 0xBE, 0x17, 0xC2, 0xC2, 0x32, 0x6A, 0x0A, 0xD2, 0x4A, 0x0C, 0xF6, 0xAC, 0x33, 0x64, 0x48,
+    0xE7, 0x36, 0x20, 0x99, 0x4A, 0xCA, 0xF2, 0xFC, 0xC7, 0x88, 0x34, 0x68, 0x15, 0xFC, 0x28, 0x2E,
+    0xAC, 0xD2, 0x9E, 0xEE, 0x39, 0x7A, 0xC9, 0xB4, 0x88, 0x64, 0xEA, 0x1F, 0x21, 0xA2, 0x5C, 0x5F,
+    0x29, 0xD1, 0x5B, 0xE9, 0x7E, 0x76, 0x24, 0x7A, 0x05, 0x00, 0xCF, 0x49, 0x0D, 0x51, 0x28, 0x65,
+    0x07, 0x82, 0xC2, 0x9E, 0x13, 0xED, 0x4A, 0x86, 0xB6, 0xCA, 0x78, 0x15, 0xF0, 0x2C, 0x7A, 0xE5,
+    0x00, 0xF5, 0x74, 0xFF, 0x2E, 0x50, 0x85, 0xE0, 0x72, 0xCA, 0xB1, 0x41, 0xC2, 0x88, 0x7F, 0x37,
+    0x9F, 0x46, 0xB2, 0x1F, 0x20, 0x69, 0x7B, 0x1B, 0x44, 0xF6, 0x56, 0xD7, 0xDB, 0xDB, 0x58, 0x5D,
+    0xF0, 0xDB, 0x11, 0x2B, 0x6E, 0x31, 0xE0, 0x95, 0x8C, 0xAC, 0x64, 0x7A, 0xDE, 0x40, 0x6B, 0xA4,
+    0x78, 0x7A, 0xC1, 0xAB, 0x6A, 0x03, 0x4F, 0x88, 0x96, 0x0E, 0xF1, 0x14, 0x6B, 0x66, 0xB7, 0x9F,
+    0x51, 0x25, 0x4F, 0x9A, 0x25, 0x19, 0xBA, 0xE2, 0x31, 0xC5, 0x6D, 0xB0, 0x11, 0x28, 0x1D, 0xAF,
+    0x8B, 0xEB, 0x75, 0x69, 0x85, 0xB9, 0x27, 0x47, 0xB1, 0x84, 0x35, 0x19, 0xC6, 0xEB, 0xE9, 0x4E,
+    0x3F, 0x61, 0xFD, 0xA4, 0xEE, 0xD2, 0xC0, 0x31, 0xEC, 0x22, 0x56, 0xE5, 0xB7, 0x22, 0x76, 0x34,
+    0x2A, 0x75, 0xC1, 0x5D, 0x76, 0x7A, 0xFE, 0x4D, 0x48, 0x17, 0x53, 0xEA, 0xCD, 0x13, 0x09, 0xFF,
+    0x04, 0x9D, 0xB1, 0x11, 0x70, 0xAF, 0x9B, 0x15, 0x1B, 0xB6, 0x81, 0xD4, 0xF6, 0x38, 0x72, 0x65,
+    0xF5, 0xFB, 0x01, 0xF5, 0xB0, 0xD0, 0xBA, 0xCA, 0xF0, 0x8E, 0x94, 0x81, 0xB1, 0x39, 0xBD, 0x7F,
+    0x3A, 0x33, 0x89, 0x04, 0xE5, 0x96, 0x7E, 0xF6, 0xFC, 0x48, 0xE5, 0x96, 0xCF, 0x05, 0xAE, 0x8F,
+    0x3E, 0xDE, 0x30, 0x92, 0xB8, 0xE0, 0x20, 0x1B, 0x86, 0xC3, 0x12, 0xA8, 0xCA, 0xD8, 0xF3, 0xF5,
+    0xBF, 0x55, 0x0D, 0x8B, 0x20, 0xC8, 0x96, 0xB8, 0x8E, 0x47, 0xCB, 0xC8, 0xE2, 0x73, 0xF9, 0x1A,
+    0xFD, 0x07, 0x90, 0x71, 0xDB, 0xC4, 0xAF, 0xCE, 0xB4, 0xB6, 0x3A, 0x53, 0xCB, 0x1F, 0xCC, 0x67,
+    0xE9, 0x9E, 0xD2, 0x82, 0x1F, 0xE0, 0x46, 0x46, 0xF8, 0xE6, 0x22, 0x01, 0xE7, 0x54, 0x66, 0xB3,
+    0x66, 0x2E, 0xE3, 0x2B, 0x7E, 0x78, 0x6C, 0x68, 0x81, 0xDC, 0x9E, 0x6F, 0xCA, 0xD3, 0x25, 0x94,
+    0x30, 0x84, 0x4F, 0x32, 0xD5, 0x37, 0x21, 0x2C, 0xF6, 0xCE, 0x85, 0x83, 0x21, 0x6F, 0xC9, 0x09,
+    0xE5, 0x0A, 0xE4, 0x8C, 0x22, 0x66, 0xB9, 0x50, 0xFB, 0xE6, 0x97, 0xCF, 0x74, 0x8A, 0xC7, 0x67,
+    0xCB, 0x38, 0xDA, 0x85, 0x47, 0x8B, 0xF0, 0x64, 0xF3, 0xFF, 0xA4, 0x91, 0x05, 0x7C, 0xE8, 0xED,
+    0x6F, 0x9F, 0x93, 0x3E, 0x18, 0xA2, 0x4C, 0x68, 0x0C, 0x62, 0xEB, 0x6D, 0x3A, 0x45, 0x52, 0xBF,
+    0x05, 0xC1, 0xB8, 0xB5, 0x0C, 0xBB, 0xCB, 0xF7, 0xA5, 0x88, 0xB4, 0x94, 0x00, 0x77, 0x92, 0x9D,
+    0xA3, 0xFB, 0xC2, 0x04, 0x11, 0x4F, 0x8F, 0xA2, 0x22, 0xFB, 0xEC, 0x71, 0xCA, 0x5E, 0x3A, 0xC2,
+    0x42, 0x1C, 0x2B, 0x74, 0xCE, 0x9E, 0x46, 0xF7, 0xEF, 0x48, 0x24, 0xCF, 0xBA, 0xE1, 0x0A, 0x92,
+    0xC9, 0x59, 0xF5, 0x10, 0xD7, 0x25, 0x6E, 0xAB, 0x9B, 0xAB, 0xD4, 0xC6, 0x16, 0x98, 0x5B, 0x31,
+    0x87, 0x39, 0x21, 0xA9, 0x09, 0x7F, 0x47, 0x0B, 0xF4, 0xFB, 0xA9, 0xFE, 0x60, 0x07, 0x1A, 0x31,
+    0xEC, 0x48, 0x64, 0x0D, 0x73, 0x71, 0xDF, 0x78, 0xE6, 0xB1, 0x76, 0xD9, 0xE1, 0x4C, 0xCF, 0x80,
+    0xBD, 0x58, 0x96, 0xAF, 0x3D, 0x3D, 0x82, 0x7B, 0xC0, 0x16, 0xD7, 0xD7, 0x8C, 0xBC, 0x5F, 0x91,
+    0x30, 0xA3, 0x6C, 0x5D, 0x25, 0xCF, 0xAC, 0xA6, 0xEC, 0xCF, 0x42, 0x41, 0x05, 0xA4, 0x74, 0x2E,
+    0x82, 0xBA, 0x21, 0x42, 0x95, 0xDF, 0xF2, 0xD6, 0x29, 0x5B, 0x04, 0xBD, 0x47, 0x8E, 0x47, 0xBA,
+    0x3F, 0x99, 0x20, 0x4D, 0x74, 0x56, 0xD6, 0x43, 0x42, 0xC4, 0x36, 0x7D, 0x24, 0xE3, 0xC9, 0xD8,
+    0x66, 0xAB, 0x3D, 0x62, 0xE2, 0xA9, 0x51, 0x3C, 0x9F, 0x1A, 0xA7, 0x6C, 0x7F, 0x4D, 0xC9, 0xEB,
+    0x21, 0x66, 0xBB, 0x46, 0xA4, 0x97, 0x5E, 0x6D, 0xAD, 0xD4, 0x6F, 0xFB, 0xB1, 0xC6, 0x6F, 0x51,
+    0x2F, 0x0A, 0x9A, 0x97, 0x8E, 0xBB, 0x80, 0xD7, 0x16, 0x70, 0xC4, 0x98, 0xEE, 0xB9, 0x69, 0x48,
+    0x49, 0xA2, 0xBB, 0x93, 0x8B, 0xE6, 0x10, 0xCB, 0xC3, 0x8D, 0x57, 0x17, 0x0A, 0xFE, 0x1B, 0xB5,
+    0x40, 0x06, 0x7D, 0xE4, 0x89, 0x76, 0x13, 0x01, 0xB1, 0x2E, 0x01, 0xD7, 0x20, 0x1D, 0x5B, 0xE9,
+    0x5C, 0x11, 0x24, 0x78, 0xF5, 0x9F, 0x02, 0xF8, 0x8B, 0xA9, 0x0B, 0x22, 0x42, 0x66, 0x1A, 0xFE,
+    0x15, 0xF7, 0x51, 0x93, 0xB7, 0xDB, 0x00, 0x52, 0x0A, 0xF0, 0x4A, 0xA8, 0xE1, 0xDF, 0xCE, 0x88,
+    0xBF, 0x47, 0x47, 0x73, 0x48, 0x19, 0x89, 0x3B, 0xDD, 0xD2, 0x82, 0x14, 0xB4, 0x70, 0xF6, 0xF2,
+    0xC1, 0x4D, 0x8B, 0x47, 0x74, 0x12, 0xC1, 0x42, 0x69, 0xE1, 0xFD, 0x25, 0x6F, 0x62, 0xF6, 0x41,
+    0xF8, 0x60, 0x83, 0xB8, 0x91, 0x06, 0x09, 0x5D, 0x90, 0x2E, 0x52, 0xB3, 0xFC, 0x34, 0x86, 0xD7,
+    0xC8, 0x27, 0x94, 0xA4, 0xB9, 0x32, 0x7E, 0xA0, 0xA4, 0xB4, 0xE5, 0x2F, 0x14, 0x37, 0x7B, 0xFA,
+    0x9C, 0x15, 0xD0, 0xE2, 0x13, 0x4C, 0x62, 0x24, 0xE8, 0x0C, 0xDC, 0x52, 0x10, 0xC3, 0xCE, 0x6F,
+    0xE5, 0x21, 0x57, 0xF3, 0x17, 0xD0, 0x0F, 0x67, 0x9D, 0x58, 0xEA, 0x84, 0x13, 0x9E, 0xE3, 0xEA,
+    0xF6, 0xBC, 0x5C, 0x40, 0xCE, 0xCC, 0xAA, 0xE8, 0x5B, 0x41, 0x86, 0x68, 0xD7, 0xC3, 0x3B, 0x66,
+    0xFB, 0x6B, 0xC1, 0xAE, 0x72, 0x29, 0xE6, 0x6C, 0x2A, 0x71, 0xB4, 0xC5, 0x4F, 0x69, 0xBA, 0x40,
+    0x80, 0x58, 0x08, 0x4F, 0x8D, 0xE5, 0x69, 0x44, 0x1B, 0xC0, 0x3D, 0x97, 0xAB, 0x7D, 0x23, 0xF3,
+    0x79, 0x40, 0x1A, 0x9D, 0x04, 0x98, 0x31, 0x6A, 0x5E, 0x6C, 0x59, 0x17, 0xEA, 0x34, 0xEC, 0x29,
+    0xA2, 0x7D, 0xC9, 0x2B, 0x5B, 0x76, 0x9C, 0x15, 0x22, 0x67, 0x6C, 0x08, 0x33, 0x41, 0xC5, 0x46,
+    0xA7, 0xA6, 0x0E, 0xEB, 0xFB, 0x92, 0x17, 0x41, 0xAF, 0x3B, 0x22, 0x96, 0xDE, 0x35, 0xD6, 0xB6,
+    0x7C, 0xEF, 0x6B, 0xF6, 0x10, 0xFC, 0xE7, 0xBC, 0x38, 0xE2, 0xB7, 0xA6, 0x93, 0x1F, 0x12, 0x86,
+    0xF7, 0x1F, 0xBE, 0x41, 0x42, 0xCC, 0xDB, 0xF8, 0x52, 0xCB, 0xFD, 0xFF, 0x40, 0xC1, 0x38, 0x50,
+    0x6F, 0x72, 0x77, 0x2B, 0xB1, 0x27, 0xCD, 0x9A, 0x0F, 0x6B, 0x5D, 0x1E, 0xE7, 0x9A, 0xB9, 0xA4,
+    0xA2, 0xC3, 0x8C, 0x2D, 0x73, 0xC1, 0xF9, 0x6B, 0x5E, 0x08, 0xD8, 0x8B, 0x1E, 0x05, 0x0A, 0x04,
+    0xBD, 0x29, 0xE2, 0x57, 0x52, 0xF7, 0x21, 0xEE, 0x10, 0x36, 0x7E, 0x90, 0x09, 0x08, 0xA3, 0x44,
+    0xE1, 0xCA, 0xCF, 0x59, 0x53, 0xDB, 0x6E, 0x65, 0x28, 0xEE, 0xF3, 0x60, 0xCB, 0x47, 0x83, 0x18,
+    0xDC, 0x05, 0xAD, 0xCC, 0x04, 0x09, 0x91, 0x05, 0xAE, 0x96, 0x2F, 0x10, 0x0E, 0x50, 0x0C, 0xF0,
+    0x57, 0xA8, 0xEE, 0x81, 0x89, 0x4C, 0x9B, 0x72, 0x13, 0xA1, 0xB9, 0x5A, 0x9E, 0x31, 0xB2, 0xA9,
+    0x80, 0xA8, 0x51, 0xEA, 0x7E, 0x59, 0xA7, 0xB9, 0x7C, 0xBE, 0x82, 0x13, 0xC7, 0x30, 0xAE, 0xF9,
+    0xF5, 0x22, 0x15, 0xE1, 0xC6, 0xC2, 0x06, 0xD9, 0xC9, 0xD9, 0xF4, 0x4C, 0xBF, 0x0A, 0x02, 0xD3,
+    0x4C, 0x38, 0x28, 0x60, 0x52, 0xB9, 0xF7, 0x3C, 0xD9, 0x1C, 0x28, 0x98, 0x89, 0xAC, 0xBD, 0x81,
+    0x17, 0x5E, 0x59, 0xF5, 0x55, 0xC7, 0xED, 0x58, 0x1F, 0x29, 0xE7, 0x57, 0xC1, 0x27, 0x0A, 0x7E,
+    0x67, 0x00, 0x56, 0xD5, 0x93, 0x99, 0xA6, 0x8E, 0x7D, 0xB1, 0xA0, 0x17, 0x98, 0x88, 0xA8, 0x9D,
+    0x2D, 0x27, 0x6B, 0x0C, 0x59, 0x5C, 0x0B, 0x3C, 0x6A, 0x3B, 0xFD, 0x44, 0x37, 0x18, 0xAA, 0x49,
+    0xE7, 0xA1, 0xC1, 0x24, 0xCD, 0xB6, 0xA6, 0x2C, 0x4D, 0x38, 0x1D, 0x3A, 0x0B, 0xA6, 0x42, 0x84,
+    0x48, 0x63, 0xCB, 0x5A, 0x74, 0xBF, 0x62, 0x3B, 0x5E, 0x55, 0x94, 0xC7, 0x52, 0x7D, 0xD1, 0xA6,
+    0xFE, 0x3B, 0x1A, 0xE8, 0x80, 0x3D, 0x57, 0x9E, 0x03, 0xE4, 0xA7, 0xB0, 0x52, 0x84, 0x42, 0xC4,
+    0x95, 0x63, 0xC9, 0xD2, 0x6E, 0xA9, 0x51, 0xE8, 0x51, 0x9C, 0xFB, 0x67, 0xD1, 0xF6, 0x37, 0xC2,
+    0x56, 0x64, 0x95, 0x70, 0x07, 0x23, 0x0C, 0x79, 0x4C, 0x20, 0x52, 0x94, 0x68, 0x9B, 0xC3, 0x64,
+    0x7A, 0xBC, 0xF6, 0x54, 0x97, 0xF0, 0xEB, 0x0F, 0x71, 0x8E, 0x69, 0x85, 0xCC, 0x2F, 0x2B, 0x2F,
+    0xCF, 0x8D, 0xEA, 0x1A, 0x04, 0x37, 0x47, 0xDA, 0xFE, 0xCF, 0xD2, 0x5E, 0xA8, 0xE7, 0x03, 0x21,
+    0xBA, 0xFE, 0x88, 0x21, 0x33, 0x17, 0xE3, 0x78, 0xB0, 0xE4, 0x71, 0x47, 0x1A, 0x88, 0x9B, 0x4F,
+    0x5F, 0x38, 0xF8, 0x0F, 0x8F, 0x82, 0x04, 0x72, 0xDC, 0x1E, 0x7B, 0xB6, 0x90, 0x55, 0x19, 0xDE,
+    0xD7, 0x0E, 0xE6, 0xED, 0xEE, 0x9A, 0x47, 0x5A, 0x63, 0xC4, 0xE6, 0x2A, 0x09, 0xB0, 0xC4, 0x0A,
+    0xBA, 0x70, 0xF8, 0x18, 0x0F, 0xE1, 0x87, 0xAD, 0x41, 0xCE, 0xB9, 0x4B, 0x6E, 0xF1, 0x0B, 0x04,
+    0xAC, 0x6A, 0x4F, 0x09, 0x40, 0xDE, 0x60, 0xF2, 0x10, 0xC7, 0xD8, 0x11, 0xFB, 0x58, 0x4D, 0x8C,
+    0x6F, 0xD9, 0xF7, 0xA5, 0xC3, 0x13, 0x16, 0x39, 0x25, 0x5A, 0x01, 0xE5, 0x92, 0x06, 0x8A, 0x4A,
+    0x89, 0xB5, 0x43, 0x7A, 0x39, 0xC2, 0x12, 0xCD, 0x45, 0x8B, 0x8E, 0x59, 0x1C, 0x4F, 0x72, 0xA6,
+    0xEE, 0xA4, 0x88, 0x6F, 0x04, 0xE8, 0x68, 0xD1, 0xDC, 0x90, 0x41, 0x28, 0x8C, 0x2B, 0xC9, 0xF1,
+    0x92, 0x08, 0xAC, 0x7F, 0x7E, 0xEE, 0x7A, 0x3F, 0x54, 0xFB, 0x45, 0x7F, 0x73, 0xF6, 0xE5, 0xE2,
+    0xE4, 0x8C, 0x05, 0xA4, 0xAF, 0x63, 0x86, 0xB4, 0xA5, 0x6B, 0x33, 0x19, 0x00, 0x79, 0xB0, 0x73,
+    0x2C, 0x89, 0xFC, 0x81, 0xDF, 0x7E, 0x5C, 0x59, 0x02, 0xF2, 0xFA, 0x52, 0x9C, 0x1E, 0xD4, 0xE5,
+    0x56, 0x90, 0x56, 0x23, 0x3A, 0x7A, 0xFD, 0x6F, 0xB4, 0x98, 0x8D, 0x47, 0xD7, 0x4D, 0x84, 0xB9,
+    0x2A, 0x09, 0xF2, 0x6C, 0xAB, 0x1C, 0x70, 0xD1, 0x01, 0xD5, 0x63, 0xF0, 0xDF, 0x3F, 0xCD, 0x27,
+    0x94, 0x36, 0xB8, 0xE8, 0xB9, 0xAF, 0xB7, 0xDD, 0x41, 0xE1, 0x43, 0xC7, 0xE4, 0xF5, 0xA8, 0xB7,
+    0xF4, 0x59, 0x91, 0x84, 0x96, 0x0A, 0x6E, 0x13, 0xA8, 0x43, 0x1C, 0xC1, 0x4A, 0xB6, 0x52, 0x6E,
+    0x36, 0x21, 0x02, 0x18, 0x15, 0xB1, 0x65, 0xA5, 0xE1, 0x0F, 0xA5, 0x0C, 0xE1, 0xFF, 0xE2, 0x10,
+    0xCC, 0xBB, 0xBD, 0x33, 0x91, 0x73, 0x7D, 0xA0, 0x16, 0x23, 0x39, 0x9B, 0x36, 0xCF, 0x94, 0x2F,
+    0x7C, 0xA0, 0x63, 0xE8, 0x3C, 0xB8, 0xBE, 0xC5, 0x03, 0x3D, 0x1A, 0x3D, 0x97, 0x10, 0x7F, 0x79,
+    0x7F, 0xCA, 0x94, 0x77, 0x30, 0x1A, 0x5B, 0x3A, 0xF1, 0xAF, 0xF1, 0xF4, 0x4F, 0x69, 0xA8, 0x0C,
+    0x7B, 0x87, 0xED, 0x30, 0x99, 0xEE, 0xEE, 0xD5, 0xEF, 0x29, 0x1B, 0xB9, 0xC0, 0x4C, 0xF6, 0x46,
+    0x46, 0xD9, 0x12, 0x9E, 0x73, 0xF6, 0x5C, 0x8F, 0x12, 0x14, 0xF1, 0xFC, 0x4C, 0x49, 0xE6, 0xDF,
+    0xCD, 0x92, 0x82, 0xDC, 0xD6, 0xF1, 0x2D, 0x04, 0x27, 0x94, 0x55, 0xF5, 0x7E, 0xC5, 0x81, 0x4B,
+    0x84, 0xB8, 0x6F, 0x43, 0xD4, 0x4E, 0x58, 0x44, 0x66, 0x31, 0xC8, 0xB4, 0xD4, 0x64, 0x37, 0x72,
+    0xAA, 0x46, 0xD0, 0x7A, 0x49, 0x94, 0xEA, 0x1E, 0xF6, 0xED, 0x31, 0xE2, 0xCF, 0xD0, 0x12, 0x53,
+    0x5F, 0xC4, 0xA9, 0xF4, 0x79, 0xD5, 0xB2, 0x2E, 0xD2, 0x7C, 0xC9, 0x12, 0xDE, 0xFA, 0xED, 0x9E,
+    0x6B, 0xFB, 0x08, 0xBE, 0x61, 0x53, 0x96, 0x1A, 0xB8, 0x71, 0x2C, 0x5E, 0xE5, 0xF8, 0xAE, 0x68,
+    0xF5, 0x39, 0x11, 0x53, 0xDD, 0x30, 0x4F, 0x49, 0xCB, 0x5E, 0x9C, 0x20, 0x2B, 0x99, 0x77, 0x8F,
+    0xA8, 0x46, 0x5F, 0xD2, 0xBB, 0x31, 0x8E, 0x2C, 0x84, 0x60, 0x63, 0xEB, 0xE9, 0x0C, 0x20, 0x98,
+    0xAA, 0x58, 0xF5, 0x75, 0xA0, 0x2E, 0xB2, 0x65, 0x79, 0xA2, 0xB9, 0xAB, 0xD9, 0xE8, 0xA6, 0xF3,
+    0x1B, 0x34, 0x37, 0x75, 0xA4, 0xFF, 0x00, 0xF8, 0xA6, 0xF6, 0x26, 0xA4, 0xFF, 0x63, 0x14, 0xB9,
+    0xA5, 0xD0, 0x12, 0x45, 0x08, 0x8C, 0x6E, 0x78, 0x0C, 0xC5, 0x75, 0xB8, 0xEC, 0x77, 0x73, 0xEA,
+    0x87, 0x6F, 0xAD, 0x4D, 0x98, 0xCD, 0xC7, 0xA5, 0x20, 0xC3, 0x4E, 0x31, 0x79, 0x16, 0xB0, 0x2A,
+    0x9A, 0x84, 0x02, 0xAA, 0x00, 0x60, 0xBB, 0x58, 0x84, 0xC6, 0x95, 0xF3, 0xF4, 0x6C, 0xEB, 0xD8,
+    0xEC, 0x1A, 0xC3, 0x92, 0xD6, 0x09, 0x58, 0x56, 0xDB, 0x64, 0xF9, 0x00, 0x1A, 0x45, 0xF4, 0x2F,
+    0x65, 0x71, 0x8C, 0xD0, 0x9B, 0xFA, 0x0B, 0x7E, 0xDF, 0x29, 0xF1, 0x91, 0xD5, 0x33, 0xF2, 0x46,
+    0xC3, 0xBD, 0x30, 0xF8, 0x7E, 0x5A, 0xA7, 0x6A, 0x19, 0x88, 0xC3, 0xE3, 0x5B, 0x37, 0xA9, 0x4C,
+    0x4F, 0xB3, 0xBD, 0xB8, 0x65, 0x57, 0xCB, 0xBE, 0x79, 0x82, 0x88, 0xDA, 0xB5, 0xAA, 0x9A, 0xD3,
+    0x05, 0xFA, 0x7A, 0x7B, 0xC0, 0xB9, 0x33, 0xD0, 0xCE, 0x34, 0xEF, 0x43, 0x41, 0x36, 0x23, 0xD4,
+    0x9C, 0x1F, 0x35, 0x70, 0xC4, 0x18, 0x87, 0x51, 0x7B, 0x9C, 0x8E, 0x24, 0x7C, 0x73, 0x9F, 0x6D,
+    0xD6, 0x4B, 0xFA, 0x22, 0x1F, 0x99, 0x2E, 0x1F, 0xEE, 0x13, 0xB4, 0xA3, 0xE8, 0xCE, 0xF6, 0xF3,
+    0x00, 0x9B, 0xE3, 0xDD, 0x0F, 0x8A, 0xCB, 0xC5, 0x49, 0xB1, 0xCA, 0x3F, 0x83, 0x96, 0xB4, 0xA3,
+    0x37, 0x72, 0x43, 0xAD, 0x2A, 0x79, 0xAF, 0x7F, 0x56, 0x18, 0xB3, 0x95, 0xA2, 0x3B, 0x15, 0x8A,
+    0x82, 0xFC, 0xED, 0xD1, 0xA1, 0x81, 0x44, 0x23, 0x88, 0x39, 0x89, 0xD8, 0x11, 0x8F, 0xAC, 0x62,
+    0xCB, 0xC9, 0x9F, 0x88, 0x3C, 0xDD, 0xE8, 0x4B, 0xB4, 0xF4, 0x99, 0xC7, 0x9E, 0xD9, 0xB7, 0xBC,
+    0x5B, 0x81, 0xD9, 0x0C, 0x1C, 0xA2, 0x8B, 0x36, 0x3C, 0xE2, 0xA9, 0xD4, 0x81, 0x2D, 0x5D, 0x72,
+    0x5A, 0xBF, 0xB2, 0x62, 0x8E, 0x48, 0x74, 0x56, 0xB8, 0xB9, 0x48, 0x04, 0x53, 0xCA, 0x0F, 0x20,
+    0x4E, 0x28, 0xD4, 0x0B, 0xC8, 0xE0, 0x3F, 0x09, 0xC5, 0x8F, 0x19, 0x99, 0xB3, 0x5F, 0xC4, 0xC7,
+    0x5A, 0x65, 0xD6, 0x1F, 0x27, 0xB0, 0xD2, 0x28, 0x03, 0x7B, 0xAB, 0x62, 0x6C, 0xAA, 0x78, 0xA0,
+    0x15, 0x00, 0xE8, 0x0E, 0xA8, 0x28, 0xAF, 0x1B, 0xCD, 0x1E, 0x5B, 0x09, 0x0E, 0x47, 0x10, 0xA8,
+    0x67, 0x32, 0x1D, 0x05, 0x7D, 0xBB, 0x57, 0x81, 0x2B, 0xDB, 0x4B, 0x6A, 0x4F, 0xBF, 0x9E, 0x51,
+    0x45, 0xC3, 0xCC, 0x70, 0xC6, 0x9E, 0x70, 0x30, 0x82, 0x65, 0xCE, 0x23, 0xCD, 0x6A, 0x4F, 0x3B,
+    0xA5, 0x58, 0x69, 0xFE, 0x37, 0x27, 0xE6, 0x03, 0x0C, 0x99, 0x8D, 0x31, 0xF5, 0xC0, 0xC8, 0xAC,
+    0x73, 0xCC, 0x48, 0x86, 0xC6, 0x4B, 0xC4, 0xE8, 0x13, 0x0A, 0xEE, 0xC0, 0x18, 0xC8, 0xE3, 0x01,
+    0x9B, 0x2B, 0xB5, 0x64, 0x06, 0xA9, 0xB6, 0xFD, 0xC4, 0xC1, 0x5D, 0x42, 0x49, 0xEC, 0x83, 0x53,
+    0x61, 0xAF, 0x7A, 0x8D, 0x8C, 0x1F, 0x7C, 0xBE, 0xE5, 0xA1, 0x2B, 0x8E, 0x20, 0x31, 0x4F, 0x37,
+    0x6A, 0x88, 0xF8, 0xBF, 0x0C, 0xD9, 0xBA, 0x1B, 0xCB, 0xC7, 0x23, 0x81, 0x85, 0x47, 0x93, 0xD0,
+    0xC0, 0x03, 0xBE, 0x2E, 0x3D, 0x89, 0xE3, 0x75, 0xAB, 0x5B, 0x32, 0x65, 0x83, 0x40, 0xBF, 0x16,
+    0xA9, 0x25, 0xE5, 0x4A, 0xFD, 0x86, 0xD2, 0x5F, 0xA0, 0xCF, 0x1F, 0xFF, 0x63, 0xFF, 0x75, 0x2B,
+    0xAF, 0x1A, 0x0B, 0x3A, 0x03, 0xE3, 0x2D, 0x04, 0x57, 0xDF, 0x56, 0x6D, 0x83, 0x61, 0x81, 0xC5,
+    0xDB, 0x51, 0xDA, 0x70, 0x0B, 0x5D, 0x5B, 0x21, 0xB6, 0xF4, 0x20, 0x0E, 0x44, 0xFD, 0x7D, 0xA0,
+    0xD8, 0x5A, 0xF4, 0x16, 0xF1, 0x69, 0x11, 0x6B, 0x13, 0x8F, 0xB3, 0xEC, 0x1E, 0x0C, 0x7D, 0x63,
+    0xBF, 0x96, 0xDD, 0xA2, 0x80, 0x8F, 0xE7, 0x47, 0x57, 0x4B, 0xCA, 0xE5, 0xF1, 0xB2, 0x66, 0xB5,
+    0xDC, 0x27, 0x75, 0x72, 0x49, 0x0C, 0x1E, 0x69, 0x6D, 0x3E, 0x31, 0xC4, 0x36, 0xCA, 0x3C, 0xE9,
+    0x5B, 0xC5, 0xDA, 0x4E, 0x28, 0xBA, 0x12, 0x39, 0x40, 0x9E, 0x92, 0x3E, 0x77, 0x60, 0xC7, 0xDF,
+    0x0F, 0xE7, 0xDC, 0x3B, 0x97, 0x39, 0xAF, 0x24, 0x49, 0xBA, 0xB0, 0xA2, 0x44, 0x04, 0x20, 0x3C,
+    0xE6, 0x40, 0x87, 0x30, 0xC2, 0x27, 0x23, 0x69, 0x4F, 0xDE, 0x13, 0x94, 0x09, 0x15, 0xDB, 0x39,
+    0xDC, 0x04, 0x07, 0xE3, 0x1B, 0x0E, 0xAA, 0x80, 0x0D, 0xA7, 0x58, 0x87, 0xDC, 0x0C, 0xC0, 0xDE,
+    0x43, 0x81, 0x70, 0x55, 0x11, 0xC8, 0x69, 0x42, 0xA2, 0x72, 0x35, 0xC4, 0xB9, 0x51, 0x2A, 0xD9,
+    0x19, 0xEE, 0x68, 0xE1, 0x86, 0x02, 0x58, 0x24, 0x8D, 0xE0, 0xF8, 0x0D, 0x19, 0x21, 0x24, 0xF7,
+    0x23, 0x3D, 0x07, 0xA0, 0x52, 0xE3, 0xE4, 0x98, 0xA3, 0xFD, 0x25, 0x0C, 0x48, 0x26, 0xC2, 0x97,
+    0xEB, 0x73, 0xFB, 0x00, 0x95, 0xF9, 0x12, 0x45, 0xD9, 0xA8, 0x41, 0xFE, 0xF0, 0xD7, 0x18, 0x7E,
+    0x6E, 0x9A, 0xFA, 0x78, 0x15, 0xA6, 0x54, 0xB0, 0x3A, 0x8A, 0xFA, 0x8F, 0xD1, 0xE5, 0x22, 0xB9,
+    0x19, 0x40, 0xC1, 0x19, 0xBA, 0x6B, 0xD5, 0x04, 0x67, 0x4E, 0x1C, 0xDA, 0x81, 0x16, 0x22, 0xE8,
+    0xB4, 0x7C, 0x99, 0xB7, 0xDD, 0x6E, 0x19, 0x16, 0xAE, 0x11, 0x58, 0xE4, 0x03, 0xA1, 0xA2, 0x6C,
+    0xDF, 0xF3, 0x1A, 0x88, 0x4B, 0xAF, 0x3F, 0xA2, 0xB0, 0x54, 0xE7, 0x68, 0xE1, 0x3B, 0xB7, 0x2F,
+    0xFC, 0xB3, 0xE6, 0x80, 0x6F, 0x2B, 0x82, 0x7E, 0x15, 0x6E, 0x61, 0xD3, 0x5F, 0x25, 0xBB, 0xE2,
+    0xF4, 0x41, 0xD1, 0xEB, 0x47, 0x8E, 0x50, 0x0F, 0x8E, 0x04, 0x80, 0xB5, 0xA7, 0x9E, 0xBB, 0x55,
+    0x03, 0x69, 0x11, 0x98, 0xAD, 0x64, 0x4E, 0x65, 0x9C, 0xB2, 0x17, 0x2E, 0x0A, 0xD6, 0x4C, 0xD9,
+    0x55, 0xF1, 0x12, 0x08, 0xB4, 0xB4, 0x4C, 0xDE, 0xE1, 0x27, 0x15, 0x66, 0x28, 0x27, 0x8E, 0xDE,
+    0xCE, 0xF0, 0x86, 0x28, 0x2B, 0x11, 0x0B, 0x45, 0x27, 0x31, 0xE3, 0x3D, 0x01, 0x71, 0xBD, 0x20,
+    0x4F, 0xE4, 0x03, 0xBB, 0xFA, 0x1B, 0x63, 0x63, 0x62, 0x4F, 0x0C, 0x9D, 0x47, 0x27, 0x97, 0x0B,
+    0x0A, 0x53, 0x4E, 0x08, 0xDA, 0x55, 0xDD, 0x27, 0xEB, 0x7D, 0x3B, 0x04, 0x2E, 0x29, 0x8E, 0x40,
+    0x2F, 0x6B, 0xCC, 0x05, 0xA8, 0x2A, 0x9E, 0x33, 0xF5, 0xB3, 0x82, 0x07, 0x8D, 0x2B, 0x16, 0xA1,
+    0x8B, 0x6F, 0xB9, 0x06, 0x67, 0x8A, 0x4B, 0x9B, 0x7F, 0x92, 0x21, 0x66, 0x5F, 0x83, 0x57, 0x81,
+    0xD1, 0x71, 0x02, 0x7C, 0x9E, 0xA1, 0xFB, 0x69, 0xF7, 0x7F, 0x57, 0xA7, 0x49, 0xB3, 0x86, 0xA2,
+    0x21, 0x9C, 0x71, 0xB8, 0x39, 0x45, 0x12, 0x42, 0x41, 0xA4, 0xF3, 0x89, 0x80, 0xF5, 0x13, 0x2F,
+    0x79, 0xDB, 0xA0, 0x0E, 0xED, 0x9A, 0x6A, 0xA0, 0x4C, 0x09, 0xC9, 0x92, 0xAC, 0x10, 0x2F, 0x10,
+    0xDF, 0xE8, 0xCB, 0x1D, 0x0F, 0x0D, 0xE1, 0x2E, 0x62, 0x99, 0xAC, 0xCB, 0x52, 0xD2, 0x1B, 0xAF,
+    0xB6, 0xB0, 0x78, 0xE0, 0x31, 0xDC, 0x6D, 0xBE, 0x7A, 0xF9, 0x02, 0xE1, 0x48, 0xE5, 0x14, 0xD8,
+    0x90, 0x9C, 0xE6, 0xE3, 0xF6, 0x6D, 0x7B, 0xF3, 0xDB, 0x60, 0x00, 0x39, 0x38, 0xAB, 0xE7, 0x17,
+    0xE9, 0x15, 0xC6, 0x3A, 0x7D, 0x40, 0xDF, 0xD9, 0x02, 0xDC, 0x83, 0x50, 0x76, 0xB0, 0x12, 0x16,
+    0x11, 0x57, 0x1D, 0xC1, 0x22, 0xBC, 0x88, 0x46, 0xCB, 0x13, 0x5D, 0x8F, 0x8F, 0xED, 0xCD, 0xAE,
+    0x15, 0xC0, 0x2D, 0xB0, 0x2C, 0xDA, 0xD7, 0x38, 0x35, 0x29, 0x2D, 0xF5, 0x0E, 0xF0, 0xD5, 0x96,
+    0x74, 0x80, 0x96, 0xAB, 0x83, 0xAA, 0xA8, 0xA1, 0x55, 0xB4, 0x90, 0x35, 0x0F, 0x4F, 0x19, 0xF8,
+    0x52, 0x8A, 0x81, 0x4A, 0xDB, 0x5F, 0x34, 0x25, 0xF9, 0xBB, 0x48, 0x8B, 0x66, 0x18, 0x64, 0x32,
+    0xC2, 0xAE, 0x44, 0x8E, 0x7F, 0xB1, 0x7F, 0x3F, 0x09, 0x83, 0xB4, 0x21, 0xEF, 0xF6, 0x70, 0xF8,
+    0xEB, 0xE6, 0x6A, 0xFB, 0x0B, 0x46, 0x23, 0x05, 0xE8, 0x6D, 0x2B, 0x82, 0x87, 0x89, 0xA6, 0x6D,
+    0x53, 0x86, 0xD6, 0xAC, 0x0C, 0xD3, 0x6C, 0x3A, 0x77, 0x4F, 0x7F, 0xDD, 0x61, 0x47, 0x5C, 0x17,
+    0x02, 0x79, 0x49, 0x15, 0xCC, 0xE7, 0x33, 0xF8, 0x01, 0x51, 0x64, 0x43, 0xD7, 0x00, 0x29, 0x15,
+    0x69, 0xD2, 0xDA, 0xF6, 0x66, 0xE1, 0x65, 0xCA, 0x40, 0xB5, 0x8A, 0xE1, 0x0B, 0x1D, 0x54, 0x17,
+    0xF6, 0x95, 0xD1, 0xFB, 0x21, 0xD9, 0x4B, 0x34, 0xD8, 0x0D, 0x44, 0xB7, 0xEF, 0x5A, 0x94, 0xFC,
+    0xED, 0x74, 0x01, 0xED, 0x7B, 0x70, 0x52, 0x8D, 0xC9, 0xF2, 0x33, 0x61, 0x74, 0x83, 0xC5, 0x4D,
+    0x72, 0x53, 0xFA, 0x68, 0xCA, 0xA3, 0x85, 0xEF, 0x8A, 0x7E, 0xEF, 0xEC, 0xF8, 0xAA, 0x22, 0x2D,
+    0x53, 0xB2, 0xA5, 0xCE, 0x74, 0x3D, 0xF1, 0x87, 0xCE, 0xE7, 0xA0, 0xAE, 0xA6, 0x68, 0xB1, 0xA4,
+    0xE1, 0x3F, 0x60, 0xBC, 0x9A, 0x05, 0xFF, 0x1F, 0xA4, 0x12, 0x7F, 0xC5, 0xE7, 0x86, 0x18, 0x8A,
+    0x64, 0x94, 0xDB, 0xFC, 0xB2, 0x4C, 0xFB, 0x3E, 0x2A, 0xB0, 0xC5, 0x88, 0xFC, 0x00, 0x6A, 0x5E,
+    0x33, 0x81, 0xD4, 0x40, 0x12, 0x44, 0xB0, 0x24, 0xA9, 0xE6, 0xFB, 0x95, 0xEF, 0x56, 0xF2, 0x4B,
+    0xF0, 0x46, 0x8B, 0xBF, 0xE6, 0x8F, 0x77, 0x90, 0x0E, 0x3B, 0xDA, 0xCD, 0xDC, 0x6F, 0x78, 0x25,
+    0x37, 0x23, 0x55, 0x3A, 0xBA, 0x35, 0x74, 0x41, 0x31, 0xE0, 0x34, 0xFF, 0x89, 0x14, 0x92, 0xCD,
+    0x65, 0x6E, 0x22, 0x00, 0x6C, 0xFE, 0x1E, 0x73, 0x5C, 0x59, 0xC6, 0x88, 0x32, 0xFA, 0xC4, 0x9D,
+    0x8F, 0xF0, 0x54, 0x6F, 0x64, 0xBC, 0x13, 0x44, 0x94, 0x04, 0x92, 0xDE, 0x30, 0xCA, 0x9E, 0xE8,
+    0x20, 0x3A, 0x03, 0x43, 0xFD, 0xE1, 0x6B, 0x17, 0x09, 0xCC, 0xEC, 0x62, 0x3B, 0x10, 0x8E, 0x79,
+    0x64, 0x15, 0x6C, 0x01, 0x09, 0x0F, 0x0D, 0x8E, 0x79, 0xBC, 0xD4, 0xE3, 0x01, 0x2C, 0xAF, 0x0C,
+    0xF9, 0x5F, 0x53, 0xB8, 0xB0, 0x7E, 0x6D, 0xB9, 0x8D, 0x29, 0xC9, 0x3F, 0x1E, 0x82, 0xB8, 0xF0,
+    0xEB, 0xDD, 0x6A, 0xB4, 0xB4, 0xAE, 0x74, 0xC6, 0x0B, 0x45, 0x12, 0xEC, 0x9D, 0xDD, 0x79, 0x94,
+    0xC1, 0x2D, 0x4D, 0x3C, 0x25, 0x75, 0xA6, 0x2E, 0x7A, 0x52, 0xE1, 0x31, 0xA4, 0xDD, 0x4E, 0x1B,
+    0xBC, 0x54, 0x83, 0x50, 0x27, 0xA1, 0xF9, 0xB0, 0xFF, 0xA1, 0x58, 0x71, 0xAD, 0x72, 0x05, 0xAB,
+    0x90, 0xEC, 0x99, 0x63, 0x69, 0x7F, 0x81, 0xF3, 0xED, 0x31, 0x76, 0x52, 0x6C, 0x5D, 0x56, 0xFA,
+    0x74, 0x29, 0xFA, 0x40, 0xD7, 0x78, 0x75, 0x29, 0x66, 0x28, 0x46, 0xB2, 0x01, 0xF6, 0xAE, 0x63,
+    0x37, 0xA5, 0xF9, 0x9F, 0x0F, 0x08, 0x65, 0x27, 0x7D, 0x68, 0xB7, 0x28, 0xD6, 0x5F, 0x04, 0x5F,
+    0xA8, 0x3F, 0x0D, 0x0B, 0x4E, 0x4B, 0x60, 0x7D, 0xCA, 0xA4, 0x2A, 0x20, 0x5C, 0xD3, 0x0B, 0x58,
+    0xFF, 0x65, 0x6F, 0xCF, 0x5A, 0x75, 0x1A, 0xB7, 0x75, 0x62, 0x0E, 0xBF, 0xFA, 0xD0, 0xBF, 0xB9,
+    0x14, 0xE9, 0x56, 0xE7, 0x2C, 0x3D, 0x2C, 0x7C, 0x5D, 0x7E, 0xA8, 0x4B, 0x7F, 0x6B, 0x94, 0x84,
+    0x17, 0x8C, 0x90, 0x24, 0x06, 0xFD, 0xE0, 0xCE, 0xD7, 0x03, 0xAB, 0x29, 0x9A, 0xCE, 0x09, 0xAB,
+    0xF0, 0x83, 0x20, 0x19, 0xC4, 0x08, 0xB5, 0x74, 0x45, 0x5C, 0xDB, 0x99, 0xF5, 0x3D, 0x2A, 0x9F,
+    0x6A, 0xB6, 0x70, 0xBD, 0x6D, 0x9C, 0x8A, 0xF2, 0x18, 0x64, 0x13, 0x5D, 0x92, 0x09, 0x78, 0xD6,
+    0x04, 0x2A, 0xFB, 0x75, 0xF7, 0x0D, 0xDE, 0x95, 0x81, 0x52, 0xB3, 0x69, 0xF0, 0x0F, 0x84, 0xA2,
+    0xED, 0x02, 0xB5, 0x79, 0x98, 0x51, 0x66, 0x0B, 0xBD, 0x72, 0x6F, 0xAA, 0xFE, 0xAA, 0x1B, 0x03,
+    0x4B, 0x3D, 0x24, 0x52, 0xCA, 0x81, 0x78, 0xFE, 0x91, 0xAF, 0x33, 0x90, 0x1D, 0x42, 0x9B, 0x1F,
+    0xE0, 0x26, 0x39, 0x09, 0x2B, 0xBF, 0x41, 0xDD, 0xB4, 0x99, 0xF6, 0x39, 0x29, 0x5A, 0xF6, 0x20,
+    0x46, 0xB2, 0x4C, 0x89, 0xF6, 0x87, 0xF0, 0x91, 0x2E, 0x3C, 0xE0, 0x91, 0x1E, 0x4F, 0x4E, 0x3E,
+    0x49, 0xAB, 0x79, 0x55, 0xA5, 0x7D, 0xE7, 0xAA, 0x35, 0x31, 0x1B, 0xB1, 0x6F, 0x76, 0x30, 0xBC,
+    0xC6, 0x3E, 0x6C, 0x9B, 0xAB, 0x99, 0x82, 0xB5, 0xA2, 0x37, 0xBD, 0xAC, 0x37, 0x39, 0xAB, 0xA9,
+    0xCC, 0xD9, 0x65, 0xC6, 0x3D, 0x5E, 0x8B, 0x08, 0x0B, 0x0E, 0xAE, 0xA8, 0x44, 0xFC, 0x30, 0x26,
+    0x92, 0x3A, 0xAB, 0x9E, 0xB5, 0x16, 0x85, 0xD8, 0xDA, 0x4E, 0x54, 0x36, 0x69, 0x8E, 0x4D, 0xB6,
+    0x61, 0x83, 0xAF, 0x46, 0x5F, 0x17, 0x71, 0xF2, 0x7C, 0xD2, 0x53, 0xD0, 0xD7, 0xC3, 0x52, 0x6A,
+    0x8A, 0x18, 0x40, 0xB6, 0x00, 0xD7, 0x0F, 0x41, 0x0B, 0xC1, 0xC5, 0xC0, 0xA6, 0x98, 0x59, 0x7C,
+    0x45, 0x19, 0x11, 0xDA, 0x2C, 0xE3, 0xCE, 0x56, 0x9E, 0xBF, 0x85, 0xCE, 0xFA, 0xE5, 0x68, 0x66,
+    0x06, 0xE6, 0x57, 0x58, 0x76, 0xAD, 0xB6, 0xC7, 0xFE, 0x2E, 0x2F, 0xA1, 0x62, 0x7D, 0x8C, 0xB9,
+    0xC6, 0xBC, 0xF9, 0x0A, 0x84, 0x1A, 0xB7, 0xF6, 0x5C, 0x75, 0x00, 0x1F, 0xA0, 0x6B, 0xF9, 0x54,
+    0x51, 0xB6, 0xBD, 0xA4, 0xC3, 0xDF, 0x25, 0x07, 0x93, 0x33, 0x6B, 0x8C, 0x7E, 0x7C, 0xC8, 0x16,
+    0x78, 0x1A, 0xDA, 0xCA, 0x48, 0x4A, 0x7C, 0x61, 0xAD, 0xEE, 0x08, 0x51, 0xCB, 0xE4, 0x99, 0xB2,
+    0x2A, 0x02, 0x6F, 0x0D, 0x86, 0x1C, 0xC1, 0xD5, 0x0C, 0x55, 0x91, 0xDE, 0x77, 0xF2, 0xE2, 0x96,
+    0xEF, 0xD7, 0x39, 0x08, 0x42, 0x22, 0x6D, 0x2B, 0xA0, 0xE4, 0xA1, 0x38, 0x86, 0x4F, 0xE4, 0x1A,
+    0xF2, 0x30, 0xCB, 0xD9, 0x38, 0x1E, 0xF0, 0x27, 0xAA, 0x1A, 0xA3, 0xD6, 0x2B, 0xC8, 0xE8, 0x5E,
+    0x31, 0xBF, 0xEB, 0x3A, 0x68, 0xF2, 0x98, 0x94, 0xA0, 0x8A, 0x6E, 0x07, 0x2A, 0x81, 0xE7, 0x01,
+    0xD3, 0x7C, 0xD8, 0x58, 0x19, 0x96, 0x53, 0xA8, 0x3C, 0x71, 0x0E, 0x4C, 0xFB, 0x24, 0x7D, 0x63,
+    0x47, 0x61, 0x90, 0x94, 0x71, 0x18, 0x38, 0x35, 0x80, 0x03, 0x41, 0xD4, 0x3E, 0xA9, 0x27, 0xAE,
+    0xB7, 0x0B, 0x9A, 0xD1, 0xDB, 0xC5, 0x1F, 0x38, 0x88, 0x73, 0xD2, 0x3C, 0xB0, 0x72, 0x60, 0x5C,
+    0xFD, 0xF9, 0xD3, 0x3F, 0x90, 0x89, 0x2B, 0xE2, 0x6C, 0x08, 0x4E, 0xB6, 0x4E, 0xF1, 0x4F, 0x5D,
+    0x82, 0x3C, 0xC6, 0x08, 0x96, 0xA3, 0xEB, 0xFF, 0xEC, 0xF4, 0xC5, 0xB1, 0xC7, 0x1B, 0xF3, 0x5E,
+    0x67, 0x6F, 0x11, 0xA3, 0xAC, 0x18, 0xF8, 0xF3, 0x0F, 0x6A, 0x64, 0x02, 0x4F, 0xE2, 0xE4, 0x3A,
+    0x2A, 0x20, 0x28, 0x5B, 0x5E, 0xAC, 0x83, 0x8C, 0xA3, 0xF1, 0x67, 0x0D, 0xBA, 0x8E, 0xEC, 0x25,
+    0xDE, 0x7D, 0xEF, 0xCF, 0x2C, 0x06, 0x74, 0x9F, 0x9A, 0x38, 0x70, 0x8D, 0xD0, 0x3E, 0xEA, 0x90,
+    0x5E, 0xD1, 0xAE, 0xDB, 0x03, 0xC7, 0x8A, 0xEF, 0x55, 0x54, 0x34, 0xB2, 0x15, 0x6F, 0x17, 0x60,
+    0x31, 0xE4, 0x32, 0x27, 0xF3, 0x82, 0xAE, 0xFB, 0x9E, 0x6E, 0x25, 0x4A, 0x96, 0xFE, 0x23, 0x4E,
+    0xFB, 0x46, 0xFC, 0xB8, 0x02, 0xAB, 0xD4, 0xD3, 0x1F, 0x0B, 0x23, 0x72, 0x10, 0xAD, 0x6F, 0x13,
+    0x56, 0xB4, 0x95, 0x20, 0xD3, 0x5A, 0x48, 0xE0, 0xC4, 0xBB, 0x96, 0x4C, 0x52, 0xEA, 0x25, 0x9F,
+    0xAE, 0xFE, 0x49, 0x3A, 0xA2, 0x54, 0x98, 0x53, 0x06, 0xD3, 0x1A, 0xC2, 0x6C, 0x5A, 0x6D, 0xD7,
+    0x28, 0xDE, 0x54, 0xDC, 0xCC, 0x2D, 0x42, 0x48, 0x3D, 0x33, 0xA7, 0x9E, 0xEE, 0x9E, 0xAE, 0xAC,
+    0x4D, 0x8B, 0x0D, 0x98, 0x03, 0xF0, 0x4D, 0xF9, 0x40, 0x62, 0x12, 0x38, 0x34, 0xA4, 0x81, 0xA3,
+    0x51, 0xA2, 0xDB, 0x76, 0xDD, 0x33, 0xEA, 0x6B, 0xB1, 0x54, 0x6F, 0xCF, 0x42, 0x6C, 0xAB, 0x9D,
+    0x15, 0x93, 0x3A, 0x0C, 0xEA, 0xD0, 0x0B, 0xBB, 0x77, 0xB1, 0xA0, 0x23, 0xDA, 0x15, 0x10, 0xA9,
+    0x3E, 0xE6, 0x2F, 0x52, 0x41, 0x57, 0xA8, 0x86, 0xEB, 0x43, 0x96, 0x63, 0x8D, 0x98, 0xE2, 0xE3,
+    0x8F, 0x2B, 0xA3, 0xB4, 0xAD, 0x2D, 0xDE, 0x72, 0xF0, 0x08, 0xBB, 0x19, 0x42, 0xFB, 0xA4, 0x56,
+    0x13, 0xEF, 0xF5, 0xE0, 0x6D, 0x2F, 0x9D, 0x87, 0x81, 0x2C, 0xCB, 0xC9, 0x72, 0x21, 0x27, 0xB5,
+    0x23, 0xB2, 0x9F, 0xC4, 0x0F, 0x4E, 0xBA, 0x9C, 0xF4, 0x86, 0xBE, 0xC7, 0x9C, 0xF9, 0x53, 0xA7,
+    0xE1, 0x99, 0xB0, 0xF0, 0xF9, 0x35, 0x47, 0x00, 0xB9, 0xC4, 0xED, 0x11, 0x21, 0x5A, 0x48, 0xAE,
+    0x71, 0xC7, 0xD3, 0xFC, 0x78, 0xBB, 0x69, 0xEA, 0x9A, 0xEA, 0x60, 0x2A, 0x8D, 0xE8, 0x16, 0x33,
+    0x80, 0x2F, 0x38, 0xEF, 0x9E, 0x09, 0x18, 0x2D, 0xCF, 0x0F, 0xD5, 0x23, 0x8A, 0xF2, 0xE0, 0x2E,
+    0x68, 0x97, 0x4F, 0x24, 0xCE, 0xD9, 0xD8, 0xC4, 0xAE, 0xCC, 0x97, 0x56, 0x01, 0x0A, 0x2B, 0x3A,
+    0x42, 0x6D, 0xB4, 0x04, 0xA2, 0x4A, 0x78, 0x77, 0x9F, 0xC2, 0x1E, 0x25, 0x2C, 0x2F, 0x69, 0xC1,
+    0x3D, 0x4C, 0xB2, 0x8C, 0x9A, 0x02, 0xB8, 0x20, 0x4E, 0xBD, 0x7B, 0x65, 0xFC, 0x7A, 0xDE, 0x24,
+    0x30, 0x2A, 0xF2, 0x79, 0xD1, 0x5E, 0x45, 0x7D, 0x6D, 0x6B, 0x93, 0xDC, 0xF3, 0x2A, 0xF4, 0x40,
+    0x6B, 0xE0, 0x08, 0x09, 0xD0, 0x2E, 0x9A, 0xCA, 0x64, 0x42, 0x63, 0xF7, 0x7B, 0x8D, 0x16, 0x49,
+    0x8F, 0x02, 0xEB, 0x22, 0xCB, 0x8B, 0xB3, 0xE1, 0x3F, 0x10, 0x89, 0xAE, 0x02, 0x72, 0xA0, 0x1A,
+    0x5E, 0xE4, 0xDD, 0x82, 0x72, 0x50, 0x6A, 0x05, 0xAB, 0x2A, 0xFE, 0xCA, 0x27, 0x4F, 0xF7, 0xC6,
+    0xBE, 0xDE, 0xC4, 0x7D, 0x0F, 0xF4, 0x5C, 0x38, 0x50, 0xDC, 0x37, 0xF3, 0x13, 0xCA, 0x54, 0x56,
+    0x30, 0x2F, 0xFF, 0xB1, 0xBC, 0xD1, 0xED, 0x19, 0xA4, 0xFC, 0x84, 0xB0, 0x9E, 0xC3, 0x5A, 0xA7,
+    0x63, 0x43, 0x7C, 0x8A, 0x06, 0x4D, 0x04, 0x72, 0x16, 0x6B, 0x22, 0xA6, 0x74, 0x0E, 0x12, 0x47,
+    0x5E, 0xA1, 0x74, 0x72, 0xEE, 0x65, 0x95, 0x8E, 0x30, 0x6B, 0xBF, 0x92, 0xE6, 0x3E, 0xA0, 0xB8,
+    0x86, 0x55, 0x54, 0xC8, 0x0A, 0x20, 0xA9, 0xE9, 0xAE, 0x5B, 0x47, 0x2E, 0xCE, 0x0A, 0xD5, 0x4B,
+    0xAF, 0x22, 0xA0, 0x23, 0x3E, 0x4E, 0x77, 0xA7, 0x64, 0x01, 0x15, 0x47, 0x28, 0x6A, 0xD1, 0x90,
+    0xCD, 0x32, 0x74, 0x7A, 0x02, 0x80, 0xEA, 0x91, 0x2E, 0x6B, 0x22, 0x52, 0x68, 0xC2, 0x40, 0x19,
+    0xCE, 0xB7, 0x9A, 0xA2, 0xB3, 0x8A, 0xF5, 0xD8, 0xD8, 0x7B, 0x3E, 0x23, 0xA9, 0x33, 0x56, 0x06,
+    0x1C, 0x74, 0x73, 0x93, 0x3E, 0x97, 0x5C, 0x41, 0x4D, 0x3F, 0xFF, 0x97, 0xD8, 0x94, 0x29, 0xAF,
+    0x06, 0xD9, 0xC3, 0xF1, 0xD6, 0x8D, 0xA7, 0xEE, 0xAA, 0x26, 0xF7, 0x4F, 0x43, 0x5E, 0x60, 0x8D,
+    0x0B, 0xD5, 0xAA, 0xD9, 0x89, 0x79, 0x04, 0x7B, 0xC3, 0x90, 0x1A, 0xDF, 0xA7, 0xB1, 0xBA, 0xC5,
+    0xCA, 0xAB, 0x0C, 0xB8, 0xE8, 0xF0, 0x45, 0xDC, 0x85, 0xB5, 0x3B, 0xAC, 0xA7, 0xB2, 0x5C, 0x25,
+    0x52, 0x90, 0x0D, 0x4C, 0xEF, 0xFF, 0x06, 0x0F, 0xEE, 0x0F, 0x8A, 0xE9, 0x93, 0x60, 0x3D, 0x8D,
+    0x47, 0xC7, 0x55, 0xD9, 0x23, 0xAF, 0x77, 0xDB, 0x01, 0x69, 0xBA, 0x3D, 0x9B, 0x62, 0x74, 0x44,
+    0x8E, 0x65, 0x40, 0x66, 0x3E, 0xDF, 0x54, 0x45, 0x8F, 0xF5, 0xA8, 0x8F, 0xD6, 0x51, 0x42, 0xDE,
+    0x9D, 0x02, 0xDB, 0x90, 0xD3, 0x93, 0x8C, 0xE0, 0x0E, 0xFA, 0x11, 0xCF, 0xA9, 0xBD, 0x94, 0xDA,
+    0x0F, 0x94, 0x33, 0xF7, 0xA8, 0x80, 0x62, 0x61, 0xAC, 0xE6, 0x1E, 0xC6, 0x80, 0x55, 0x9D, 0x7C,
+    0x5B, 0xB8, 0xB3, 0x67, 0xBB, 0x69, 0xA6, 0x6D, 0xE1, 0x42, 0xD6, 0x81, 0x4E, 0x13, 0x68, 0xC0,
+    0x6B, 0x01, 0xE8, 0x0F, 0xFB, 0xD4, 0x07, 0x08, 0xC7, 0x33, 0xAB, 0x3A, 0x68, 0x23, 0x14, 0x86,
+    0xC7, 0x76, 0x13, 0xD5, 0x38, 0xF6, 0x4C, 0x91, 0x3E, 0x4F, 0x10, 0xC3, 0x7A, 0xD0, 0x9B, 0xF6,
+    0x58, 0x42, 0xD5, 0x12, 0x5A, 0xCE, 0x58, 0x1A, 0xB0, 0xBF, 0x27, 0x96, 0xFA, 0xE5, 0x8C, 0x43,
+    0xF7, 0xDE, 0xBD, 0x5F, 0xE3, 0x79, 0x69, 0xDC, 0x57, 0xA5, 0x12, 0x27, 0x77, 0x61, 0x5E, 0x97,
+    0xD4, 0x6F, 0xF6, 0x6E, 0x5B, 0x46, 0x98, 0x8F, 0x06, 0xC9, 0x58, 0xAB, 0x2D, 0x02, 0x8C, 0x93,
+    0x61, 0x7F, 0xDF, 0x14, 0xB1, 0xEC, 0xFD, 0x97, 0xFE, 0x80, 0xD5, 0xCA, 0x08, 0x57, 0x23, 0x9F,
+    0x49, 0x3A, 0xE3, 0x56, 0xD8, 0x5A, 0x3C, 0x52, 0x5A, 0x4B, 0xC0, 0x8C, 0xB3, 0x79, 0xD7, 0xC4,
+    0xFD, 0x48, 0xF3, 0xEA, 0x4C, 0x40, 0xF9, 0x36, 0x15, 0x47, 0x3B, 0x14, 0x48, 0x51, 0xF0, 0xC6,
+    0xBB, 0x30, 0xBB, 0x80, 0xA3, 0x5C, 0x6F, 0xBD, 0xA1, 0x4E, 0xEC, 0x71, 0x52, 0x44, 0x98, 0xB2,
+    0x82, 0x49, 0x2D, 0xEB, 0x61, 0x22, 0xEE, 0xFC, 0x60, 0xCB, 0x01, 0x53, 0xAA, 0xFD, 0x9A, 0xC8,
+    0x1B, 0xE9, 0xE4, 0x8C, 0x2C, 0x3C, 0xC8, 0x0A, 0x82, 0xCA, 0x3C, 0x92, 0xB5, 0x96, 0xDA, 0xF1,
+    0x41, 0x76, 0x8D, 0x19, 0xED, 0x3B, 0xEE, 0x44, 0xB0, 0xD2, 0xB3, 0xE9, 0xD5, 0x8E, 0xD5, 0x70,
+    0x67, 0x72, 0xD0, 0x33, 0x2B, 0xFC, 0x50, 0x83, 0x1A, 0x72, 0xAE, 0xFE, 0xF0, 0x87, 0x07, 0xD7,
+    0x19, 0x97, 0xDB, 0x95, 0xEF, 0xDD, 0xBB, 0xEC, 0x3F, 0xC8, 0x08, 0xBB, 0x87, 0x5C, 0xB2, 0x51,
+    0x3F, 0xEE, 0x27, 0xF4, 0xA8, 0x2C, 0x6C, 0x3B, 0x0C, 0xB9, 0x7C, 0xFB, 0x75, 0xA3, 0xAE, 0x1C,
+    0xFD, 0x1F, 0x99, 0xF2, 0x5F, 0x30, 0x16, 0x0B, 0x24, 0xB7, 0x02, 0xE5, 0xDD, 0x59, 0x8E, 0x98,
+    0x92, 0x1E, 0xDB, 0x6C, 0x6E, 0xCF, 0x51, 0x81, 0xE0, 0xF5, 0x32, 0xAD, 0x5F, 0xCC, 0xA1, 0x91,
+    0x5F, 0x2E, 0xAC, 0xA0, 0xB1, 0x9B, 0x2F, 0xAF, 0x7E, 0x8E, 0x30, 0x76, 0x82, 0xE3, 0x74, 0x01,
+    0x2C, 0x2C, 0xB3, 0xB3, 0xAD, 0xC3, 0x3B, 0x2C, 0x45, 0xB3, 0x40, 0x97, 0x4B, 0xEB, 0xFD, 0xC6,
+    0x55, 0xD9, 0x66, 0x0A, 0x4F, 0x3F, 0xB4, 0xE6, 0x01, 0x68, 0x9F, 0x20, 0xEC, 0x97, 0xBE, 0x6C,
+    0x09, 0xFF, 0x26, 0x09, 0x3D, 0x66, 0x0F, 0x19, 0x2C, 0xAF, 0xBD, 0xA2, 0xF4, 0xEA, 0xD1, 0xF6,
+    0x37, 0x64, 0x8A, 0x9E, 0x9A, 0x79, 0xFC, 0x20, 0xEC, 0x5B, 0x58, 0x74, 0x8A, 0xD7, 0x78, 0x8E,
+    0x1F, 0xBF, 0xEC, 0x78, 0xC0, 0x65, 0xE8, 0xD8, 0x4A, 0x72, 0xEB, 0x13, 0x4C, 0xD8, 0xE9, 0x7B,
+    0xEC, 0x48, 0x00, 0x33, 0x69, 0x92, 0xDC, 0xE9, 0xBE, 0xE5, 0xC7, 0xCE, 0x56, 0x2E, 0x9B, 0xD3,
+    0x4D, 0xFD, 0xE7, 0x68, 0xE1, 0xCE, 0x18, 0x8D, 0xD0, 0x92, 0x39, 0xE1, 0x69, 0x83, 0x55, 0x54,
+    0x62, 0xE8, 0x26, 0x8B, 0xAB, 0xA0, 0xAC, 0xB2, 0xFD, 0xB2, 0xBB, 0xB0, 0xD4, 0x1B, 0xC8, 0x2F,
+    0xA8, 0x9E, 0x9B, 0x24, 0x56, 0xB8, 0x6E, 0xEE, 0x2F, 0x36, 0x2E, 0xD4, 0x2B, 0x9A, 0x2C, 0x00,
+    0xE1, 0x18, 0x67, 0xD6, 0x13, 0x35, 0xF2, 0x8F, 0x77, 0x88, 0x36, 0x40, 0x1F, 0x7B, 0x18, 0x6C,
+    0x2B, 0xE6, 0x0E, 0x26, 0x30, 0x98, 0x71, 0x20, 0xE1, 0xA5, 0xF4, 0x94, 0x36, 0xEF, 0x73, 0x52,
+    0x59, 0xF2, 0x87, 0x67, 0xFD, 0xBA, 0x55, 0x40, 0xBE, 0x3B, 0x3B, 0x25, 0x89, 0x40, 0x73, 0xBA,
+    0x60, 0xAF, 0x50, 0xBE, 0xEA, 0xC3, 0x31, 0x34, 0x32, 0x71, 0xE4, 0xEC, 0x0E, 0x24, 0x9D, 0x46,
+    0x56, 0x33, 0xC7, 0x01, 0x94, 0xA5, 0x51, 0xD1, 0xC6, 0xDB, 0xCA, 0x26, 0x8D, 0x89, 0xAF, 0xA9,
+    0x89, 0x7F, 0x26, 0xFB, 0x67, 0x92, 0x73, 0x39, 0x1A, 0x1A, 0x1C, 0x4E, 0xEB, 0x72, 0x68, 0x92,
+    0x9F, 0x71, 0x35, 0x13, 0x38, 0x36, 0xF8, 0x0D, 0xBF, 0x95, 0x9F, 0x35, 0x00, 0x79, 0x47, 0x41,
+    0x62, 0x23, 0xBA, 0xF4, 0xCA, 0xC6, 0x12, 0x7C, 0x96, 0x9D, 0xB8, 0x40, 0x4F, 0x7E, 0x31, 0x01,
+    0x1E, 0xC7, 0xFD, 0x49, 0xB9, 0xC2, 0x2B, 0x35, 0x24, 0x2A, 0x13, 0x89, 0x62, 0x63, 0xBA, 0x6C,
+    0xA8, 0x93, 0x6D, 0x99, 0xED, 0x9C, 0xE9, 0xB0, 0xF1, 0x8C, 0x9D, 0xA9, 0xEF, 0xDE, 0xF0, 0x92,
+    0x1A, 0x3B, 0xA9, 0x94, 0x38, 0x87, 0xA2, 0x53, 0x65, 0x31, 0xAE, 0x0C, 0x96, 0x64, 0xAC, 0xC8,
+    0xF8, 0x03, 0x65, 0x59, 0x5A, 0xAF, 0xD7, 0x8B, 0x0B, 0x31, 0xD9, 0x3A, 0x2F, 0x1C, 0xE3, 0x49,
+    0xF3, 0xFA, 0x80, 0x9D, 0x34, 0x0D, 0xC0, 0xCE, 0xBB, 0x6E, 0x90, 0x6E, 0xA5, 0xA7, 0x0D, 0xB4,
+    0xB8, 0x04, 0x6A, 0xD6, 0x0C, 0x95, 0x79, 0x9E, 0x27, 0x43, 0xDD, 0xD1, 0x8E, 0x8F, 0xE0, 0x19,
+    0xB5, 0xBF, 0xD9, 0x25, 0xEE, 0xBB, 0x3E, 0x79, 0x0D, 0x9E, 0x0B, 0x03, 0x3D, 0x09, 0x9C, 0xF1,
+    0x02, 0x0A, 0x81, 0x7B, 0xCE, 0x95, 0x44, 0x99, 0x72, 0xC5, 0x18, 0x4B, 0xD4, 0x9E, 0x5E, 0x8B,
+    0x2D, 0x5F, 0x1E, 0x13, 0xF1, 0x95, 0xCA, 0x37, 0x75, 0x49, 0x7D, 0x3A, 0x1A, 0x22, 0x02, 0xAC,
+    0x3E, 0xFE, 0x62, 0xF9, 0x59, 0xB7, 0x11, 0x82, 0xB6, 0x55, 0x82, 0xC7, 0x13, 0xB7, 0x83, 0x8C,
+    0x1E, 0x90, 0xB4, 0x3D, 0x9B, 0x57, 0xE7, 0x1F, 0x4E, 0xB1, 0x70, 0xF4, 0x9E, 0x06, 0x3B, 0x97,
+    0xF4, 0xC1, 0xBA, 0x3D, 0xAD, 0x50, 0x01, 0x21, 0xBB, 0x0F, 0xE1, 0x60, 0x49, 0x25, 0x5A, 0x0F,
+    0xA3, 0x24, 0x33, 0x97, 0xA4, 0xA2, 0x8D, 0xFE, 0x9E, 0x17, 0x7D, 0x42, 0x3D, 0x40, 0xBB, 0xE5,
+    0xFB, 0xB2, 0xCA, 0x2C, 0x93, 0x38, 0x13, 0xEA, 0x5C, 0xEB, 0x53, 0xFD, 0xFE, 0xD1, 0x2C, 0xB8,
+    0xF6, 0xE2, 0x0C, 0xDF, 0xFA, 0x93, 0x2C, 0x25, 0x5C, 0x63, 0x07, 0x27, 0x11, 0x4E, 0x5E, 0xFA,
+    0xD0, 0x9D, 0x2E, 0xE3, 0x85, 0xA8, 0xC5, 0x8B, 0x7B, 0xFE, 0xA0, 0x9C, 0xFE, 0xFE, 0xE5, 0x69,
+    0xD8, 0x59, 0xAA, 0x52, 0x40, 0x71, 0x6B, 0x1D, 0x51, 0xDA, 0x13, 0x48, 0xEC, 0xCE, 0x1E, 0x2A,
+    0xE5, 0x70, 0x66, 0xB1, 0x1F, 0xA6, 0x65, 0x3E, 0x99, 0x8E, 0x4B, 0x4D, 0x7C, 0x75, 0xB1, 0x46,
+    0x51, 0x07, 0x6E, 0x31, 0x7E, 0xE7, 0x5D, 0xE7, 0x66, 0xA6, 0x6F, 0x65, 0x4E, 0xBD, 0xEF, 0x1E,
+    0xEC, 0x90, 0x36, 0xFA, 0xDB, 0x73, 0x5F, 0x54, 0x68, 0x9A, 0xFD, 0xD9, 0x3D, 0xF0, 0xDC, 0xD5,
+    0xA3, 0xBF, 0x45, 0xBD, 0x24, 0x7D, 0xB5, 0xC4, 0xC5, 0x63, 0x5F, 0xBC, 0x4C, 0x19, 0x1A, 0xA3,
+    0x84, 0x71, 0xBD, 0x63, 0x8B, 0x85, 0x71, 0x30, 0x2C, 0x00, 0x76, 0x90, 0xDB, 0x44, 0xFC, 0x86,
+    0x40, 0x10, 0x4C, 0x4F, 0x9E, 0xFB, 0xC9, 0xF3, 0x61, 0xED, 0x6A, 0x37, 0x7F, 0x76, 0x1E, 0x8D,
+    0xB2, 0x30, 0x2B, 0xC1, 0x9F, 0x00, 0xF0, 0x54, 0x60, 0x13, 0x74, 0x87, 0x83, 0x90, 0xCD, 0xF3,
+    0x78, 0xD7, 0x84, 0xA2, 0xCA, 0x47, 0x7F, 0x10, 0xD8, 0xC5, 0xEA, 0xA4, 0xA7, 0x53, 0x47, 0xEF,
+    0x43, 0x44, 0xA4, 0xEB, 0xD4, 0x73, 0xB9, 0x08, 0xB1, 0x06, 0xD5, 0xD1, 0xF5, 0x9D, 0x92, 0x2C,
+    0xA2, 0x6C, 0x69, 0x68, 0xF6, 0xD2, 0xEF, 0x35, 0x1F, 0x91, 0xC8, 0x8F, 0x78, 0xF5, 0x2D, 0xB4,
+    0x83, 0x2C, 0x97, 0x3F, 0xF3, 0x51, 0x42, 0xE7, 0x8C, 0xE0, 0xDC, 0x01, 0x34, 0x66, 0x05, 0x9A,
+    0x61, 0x6E, 0x90, 0x5F, 0x0C, 0xCD, 0xC9, 0x74, 0x8F, 0x5B, 0xA0, 0x40, 0xB6, 0xAF, 0x48, 0xAA,
+    0xD9, 0xFA, 0x06, 0x6D, 0xCE, 0x4E, 0x0E, 0x62, 0x8E, 0xF3, 0x23, 0xEB, 0xF5, 0xE5, 0x22, 0x50,
+    0x74, 0x06, 0x05, 0xA3, 0x00, 0xD7, 0x5C, 0x5E, 0x68, 0x1B, 0x0F, 0xB1, 0x38, 0xB0, 0x46, 0xE1,
+    0x7B, 0xB7, 0xA1, 0x0F, 0x7B, 0x9A, 0xC2, 0xA3, 0x78, 0x03, 0xD5, 0xA7, 0x93, 0xB1, 0x76, 0xE8,
+    0xB5, 0x32, 0x8E, 0x5A, 0x2E, 0xA3, 0xCC, 0xC7, 0x6B, 0xAD, 0x88, 0xB1, 0x7C, 0x68, 0xC8, 0x1A,
+    0x09, 0xAC, 0x19, 0xA1, 0x7F, 0x00, 0xB1, 0xC2, 0xAB, 0x1F, 0x81, 0x29, 0x7A, 0x5C, 0xF1, 0x55,
+    0xF9, 0x96, 0x52, 0x5E, 0x8C, 0x57, 0x65, 0xDA, 0x5B, 0xC6, 0x0E, 0xB1, 0xC6, 0x0F, 0x50, 0x9C,
+    0x61, 0x20, 0x7A, 0x62, 0x68, 0x53, 0x4E, 0xF9, 0x40, 0xA4, 0xD4, 0x66, 0xF8, 0xC7, 0x0B, 0xE6,
+    0x09, 0xA6, 0xBD, 0xBF, 0xA3, 0x57, 0x5E, 0xD6, 0xA1, 0x84, 0x49, 0x05, 0x54, 0x69, 0xC7, 0xA4,
+    0x67, 0x08, 0x37, 0x3A, 0xD3, 0xD3, 0x43, 0x8E, 0xD3, 0xD1, 0xBF, 0xBD, 0x6A, 0x8D, 0x3A, 0x14,
+    0x76, 0x6F, 0x04, 0xDE, 0x69, 0x0D, 0xD5, 0x07, 0xF4, 0xEA, 0x36, 0x28, 0x9E, 0x54, 0x47, 0x25,
+    0x7D, 0x02, 0x54, 0x53, 0xFC, 0x68, 0x72, 0x77, 0xE4, 0x9E, 0x6B, 0xF7, 0xAC, 0xD2, 0xBF, 0xA7,
+    0xC5, 0x3C, 0xF6, 0x99, 0xEB, 0xC7, 0xA3, 0x11, 0x33, 0xB6, 0xB6, 0x62, 0x4A, 0x3B, 0x93, 0xC2,
+    0xF6, 0xC7, 0xF1, 0x7B, 0x3F, 0x6D, 0x2D, 0x12, 0x4B, 0x46, 0xC3, 0xC2, 0xC7, 0x5F, 0xDE, 0xC0,
+    0xFD, 0x5E, 0xCD, 0x3B, 0xD1, 0x4C, 0x41, 0x77, 0x0A, 0x77, 0x3A, 0xA8, 0xB1, 0xEF, 0x02, 0x49,
+    0x54, 0xA2, 0x3B, 0xA7, 0x79, 0xEF, 0x2B, 0x56, 0x32, 0x7E, 0x81, 0x71, 0xA6, 0x99, 0x53, 0x8D,
+    0xBF, 0x07, 0x9A, 0x4B, 0x70, 0x7F, 0x1D, 0x84, 0x99, 0xCE, 0x0C, 0x4F, 0x7A, 0x99, 0xBA, 0x94,
+    0x52, 0xFE, 0x06, 0xDE, 0x2A, 0xF1, 0xDF, 0x75, 0x45, 0x38, 0x25, 0xD9, 0xC4, 0x6A, 0xF1, 0x5B,
+    0x2B, 0xA3, 0x50, 0x00, 0x68, 0xE7, 0x9C, 0xBC, 0x90, 0xDB, 0x38, 0xF7, 0xEC, 0xBD, 0xDB, 0x1B,
+    0x77, 0xFF, 0xF8, 0xB8, 0xDB, 0xE8, 0xE5, 0x7F, 0x71, 0xF1, 0x9B, 0x83, 0x98, 0xF3, 0xE2, 0x4E,
+    0xA6, 0xBD, 0xE7, 0xD7, 0xD2, 0xBF, 0xB1, 0x89, 0x54, 0x3D, 0x36, 0xF0, 0x4E, 0x85, 0x5F, 0x14,
+    0xE3, 0x58, 0x5B, 0x24, 0x86, 0x75, 0x8D, 0x98, 0x0C, 0xBA, 0x5D, 0x26, 0x62, 0xC4, 0xC2, 0x84,
+    0xA6, 0xF9, 0x9B, 0x42, 0x0F, 0xA1, 0x8D, 0x39, 0xF1, 0x67, 0xCE, 0xE7, 0xB8, 0x70, 0x24, 0xB8,
+    0xE6, 0x82, 0xE8, 0xC7, 0xF6, 0x7B, 0xFE, 0xD8, 0x38, 0xCF, 0x1D, 0x0D, 0xEA, 0x7D, 0xBB, 0x65,
+    0x61, 0x9B, 0xFA, 0xA2, 0xB8, 0xA7, 0x9B, 0xAD, 0x76, 0x0B, 0x93, 0x00, 0x5E, 0x43, 0x10, 0x4A,
+    0x5F, 0x22, 0xCA, 0x74, 0x8E, 0xEC, 0x2B, 0xB4, 0x68, 0x44, 0x2C, 0x95, 0x4A, 0xDA, 0xDA, 0xC5,
+    0xBE, 0x8B, 0xFF, 0x4C, 0xC2, 0x0A, 0x74, 0xE0, 0x6E, 0x45, 0xBD, 0xD5, 0x0A, 0x50, 0xB1, 0x33,
+    0x8D, 0x57, 0xE8, 0xF0, 0x78, 0x6D, 0x05, 0x2B, 0x9C, 0x56, 0xC7, 0xB7, 0xE4, 0x66, 0xB8, 0x72,
+    0x90, 0x92, 0xC0, 0x07, 0x7B, 0x18, 0xB1, 0x14, 0x6A, 0x64, 0xEE, 0xC1, 0x9F, 0x0D, 0xB4, 0x1D,
+    0xE7, 0xF1, 0x17, 0x49, 0xB1, 0x84, 0xD9, 0x26, 0xA5, 0x9A, 0xFA, 0xF1, 0xA3, 0x55, 0xC2, 0xAA,
+    0xF5, 0xBE, 0x49, 0xF6, 0x6C, 0x67, 0x93, 0x04, 0x0A, 0xE3, 0xC0, 0xA1, 0x72, 0x8B, 0xE7, 0x05,
+    0xEA, 0x70, 0xEF, 0x27, 0xF4, 0xC0, 0xE3, 0xBE, 0x57, 0xA3, 0x66, 0xAF, 0x83, 0x04, 0x0E, 0xAD,
+    0x08, 0x77, 0x1F, 0xA4, 0x1C, 0xA5, 0xF5, 0xED, 0x03, 0xB4, 0x0E, 0xDA, 0xEC, 0xFD, 0x9D, 0x8B,
+    0x81, 0x5C, 0xDF, 0xAE, 0x5D, 0xEC, 0x08, 0x94, 0x78, 0xA4, 0x0F, 0x1A, 0x75, 0x0B, 0x32, 0xE2,
+    0x9F, 0x0B, 0xDF, 0xD4, 0x5D, 0xFE, 0xF8, 0x43, 0x5E, 0xC5, 0xC0, 0x8C, 0xBC, 0xAB, 0xDE, 0x33,
+    0x38, 0xA0, 0x76, 0x86, 0x94, 0xF0, 0xF0, 0x40, 0xD4, 0x3F, 0x82, 0xED, 0x3F, 0x2C, 0x5A, 0x6F,
+    0xB3, 0xE9, 0x4C, 0x5D, 0xE5, 0xAB, 0xD5, 0xAB, 0x89, 0x9D, 0x0A, 0x37, 0x9F, 0xC0, 0x84, 0xF6,
+    0x81, 0xB7, 0x9B, 0x5C, 0x1A, 0xC4, 0x40, 0x06, 0x29, 0xC6, 0x62, 0xCE, 0x07, 0x1B, 0x13, 0xBA,
+    0x81, 0xDF, 0xEE, 0xF9, 0xD3, 0xE7, 0xC1, 0x9A, 0x7C, 0x43, 0x0E, 0x83, 0xB0, 0x4E, 0xCD, 0x8E,
+    0xB4, 0x34, 0xBF, 0xEF, 0x74, 0x4D, 0xE0, 0xF4, 0xB3, 0x25, 0x93, 0xAC, 0xCE, 0x20, 0x7B, 0x22,
+    0x6E, 0xAA, 0x75, 0x14, 0xCA, 0xA8, 0x09, 0x2A, 0xCE, 0xE0, 0x57, 0x5E, 0x3A, 0xCA, 0xF5, 0x11,
+    0x5D, 0xC6, 0x08, 0x6D, 0xB1, 0xD8, 0x4C, 0x90, 0x4A, 0x5A, 0x4B, 0x1F, 0x98, 0xD6, 0x87, 0xF2,
+    0xD5, 0x82, 0x86, 0x16, 0xA5, 0x01, 0xEA, 0xFC, 0x78, 0xF3, 0xF9, 0xE2, 0x3C, 0x74, 0xC4, 0xFC,
+    0x9B, 0x8D, 0x2C, 0x36, 0x87, 0xE6, 0x57, 0x8C, 0x5D, 0xEA, 0x8F, 0x96, 0x85, 0x9A, 0xEF, 0x18,
+    0x34, 0x36, 0xC0, 0x46, 0x7C, 0x77, 0xD6, 0xBF, 0x25, 0xA2, 0xE7, 0x95, 0xFA, 0x82, 0xDD, 0x11,
+    0x2B, 0xAC, 0x9D, 0xB8, 0x7B, 0x21, 0xB7, 0x51, 0xFC, 0x21, 0x24, 0xA5, 0x20, 0xD4, 0x89, 0xF0,
+    0xFF, 0x31, 0x1B, 0x3E, 0x29, 0x10, 0x00, 0xFA, 0xEA, 0x6E, 0xA7, 0xA0, 0x4E, 0x1E, 0x21, 0xDF,
+    0x7F, 0x84, 0x16, 0x77, 0x8B, 0xF1, 0xFE, 0xAB, 0x4E, 0xBD, 0xF4, 0xA1, 0x2B, 0xA3, 0x8B, 0x7A,
+    0x46, 0xF2, 0xD3, 0x92, 0x23, 0xBB, 0x23, 0x30, 0x10, 0x7A, 0x69, 0x38, 0x6C, 0xBA, 0xF3, 0xBD,
+    0xDF, 0xF6, 0xCE, 0xC7, 0x9A, 0xA7, 0x20, 0xB8, 0xE9, 0xE6, 0x14, 0xEE, 0xFD, 0x3E, 0x89, 0xF8,
+    0x93, 0x6F, 0x7B, 0xDE, 0xD9, 0xB4, 0x3A, 0xED, 0xA9, 0x4B, 0x05, 0x2E, 0x4F, 0xE4, 0x07, 0x0F,
+    0x45, 0x3F, 0x95, 0x62, 0x6C, 0x4B, 0x23, 0xA3, 0xBF, 0x74, 0x13, 0x16, 0xFD, 0x88, 0xDB, 0xF8,
+    0xC6, 0xB1, 0xA6, 0x72, 0x20, 0xCC, 0xE2, 0x67, 0x92, 0x30, 0xE0, 0x2C, 0xAF, 0xDA, 0xD9, 0x27,
+    0x92, 0x01, 0x97, 0xAB, 0xBE, 0xCB, 0x2C, 0x0D, 0x01, 0x67, 0x3F, 0xE3, 0x7A, 0x5B, 0xE0, 0x06,
+    0x08, 0xB3, 0x25, 0x4E, 0x78, 0x80, 0x76, 0x67, 0xFB, 0x4C, 0xD0, 0x5E, 0xFD, 0x5A, 0x64, 0xD7,
+    0x0C, 0x09, 0xC2, 0x21, 0x57, 0x06, 0x63, 0x5A, 0x59, 0x2E, 0xF1, 0x3F, 0x09, 0x0D, 0x60, 0xDF,
+    0xED, 0xDA, 0xA7, 0x75, 0x70, 0xB7, 0xD7, 0x0A, 0x66, 0x2D, 0xAC, 0xB8, 0x2F, 0xA3, 0x96, 0x19,
+    0xB0, 0x5B, 0x29, 0x9C, 0x6E, 0x50, 0xC0, 0x00, 0x14, 0xC5, 0x3B, 0xA3, 0x6C, 0x3A, 0x6A, 0xAB,
+    0x97, 0x96, 0x47, 0x72, 0xE7, 0x21, 0x74, 0x8F, 0xD9, 0xB4, 0xCE, 0xDC, 0x81, 0x6E, 0x48, 0x96,
+    0x59, 0xB7, 0xC9, 0xF3, 0x99, 0xD0, 0x8D, 0x10, 0x3B, 0x69, 0xD0, 0xF5, 0xA7, 0x31, 0x9D, 0xA8,
+    0x36, 0x63, 0xB6, 0xBC, 0x8A, 0xC9, 0x03, 0x3A, 0xCC, 0xDC, 0xFA, 0x9A, 0xAB, 0x47, 0xC4, 0x19,
+    0x83, 0xD6, 0xD3, 0x1F, 0x6E, 0x60, 0xD9, 0xCC, 0x98, 0xE5, 0x53, 0xC6, 0xC3, 0xE8, 0xA7, 0xF3,
+    0xB9, 0xF1, 0xAC, 0xA9, 0xB9, 0x05, 0x47, 0x46, 0x21, 0x3F, 0x0C, 0xCC, 0x60, 0x5C, 0xF8, 0x9E,
+    0xA8, 0x42, 0x5D, 0xD9, 0xC8, 0xF3, 0x9E, 0x75, 0xAD, 0x22, 0x68, 0x67, 0x37, 0xF2, 0x8F, 0xD1,
+    0x7C, 0x5D, 0x07, 0xD8, 0x69, 0x6C, 0x34, 0xF0, 0x7E, 0x71, 0x47, 0x29, 0xA1, 0x8D, 0x07, 0x3F,
+    0x60, 0x75, 0xC8, 0x16, 0xEF, 0x11, 0xE3, 0xFD, 0x48, 0x35, 0xED, 0xCA, 0x2C, 0x37, 0xCF, 0xEA,
+    0x37, 0x6D, 0xA0, 0xFF, 0x7A, 0x46, 0x15, 0x41, 0x6B, 0xE3, 0x40, 0x6F, 0x27, 0x02, 0xA4, 0x2B,
+    0x34, 0x0B, 0x07, 0xE3, 0x69, 0x4E, 0xF3, 0xF3, 0xAC, 0x4A, 0xA7, 0xE4, 0xBB, 0x4E, 0x8E, 0xAF,
+    0xC0, 0x76, 0x9B, 0xD3, 0xB1, 0x93, 0xF3, 0x87, 0x38, 0x7B, 0x0B, 0x84, 0xFA, 0xDA, 0x85, 0x32,
+    0x06, 0x7C, 0xFD, 0x2E, 0xF0, 0x90, 0x31, 0xAE, 0x3E, 0x9B, 0xBF, 0x0A, 0xDF, 0xA4, 0xA9, 0x3B,
+    0x43, 0x16, 0x31, 0x04, 0xD6, 0x2F, 0x9F, 0x7A, 0x79, 0xD5, 0x79, 0x5D, 0x1C, 0x4A, 0x6A, 0x19,
+    0x2A, 0xD0, 0x05, 0x69, 0xFE, 0xAC, 0x78, 0x41, 0xE7, 0xEA, 0xE7, 0xDD, 0x23, 0xA7, 0x7C, 0x59,
+    0x7F, 0x6B, 0xDA, 0x30, 0x77, 0x16, 0xE8, 0x02, 0x3D, 0xB4, 0x4D, 0xB3, 0xCC, 0x41, 0x56, 0x05,
+    0x1F, 0xD7, 0x07, 0x0B, 0x5B, 0x30, 0x6C, 0x45, 0x7E, 0x41, 0xE4, 0x79, 0x0B, 0x5A, 0x17, 0xF5,
+    0xD6, 0x30, 0x9E, 0xAC, 0x2F, 0x6F, 0x99, 0x18, 0x4E, 0x11, 0x39, 0xF4, 0x29, 0x55, 0x82, 0x08,
+    0xF8, 0x2D, 0xE6, 0x06, 0xE8, 0x2D, 0x62, 0xD5, 0x66, 0xB4, 0x5E, 0x62, 0x96, 0x16, 0xA6, 0xD8,
+    0x69, 0x04, 0x23, 0x35, 0xD0, 0x4F, 0xA0, 0x7F, 0xC5, 0xE4, 0x49, 0x6C, 0x64, 0x4A, 0xD8, 0xC3,
+    0x4D, 0x51, 0xBC, 0x49, 0x12, 0x76, 0x8A, 0xEC, 0xB2, 0x03, 0x93, 0xB8, 0x2D, 0x42, 0x91, 0x09,
+    0xAE, 0xC2, 0x50, 0xD2, 0x72, 0x3A, 0x11, 0x26, 0xF8, 0x43, 0x2A, 0xD5, 0x13, 0x4E, 0x4D, 0x1E,
+    0x28, 0xE5, 0xAF, 0xCC, 0xCE, 0x6D, 0x4A, 0x06, 0xB4, 0x2E, 0xF7, 0x40, 0x89, 0x33, 0x61, 0x11,
+    0x7A, 0x4C, 0x75, 0xC5, 0x7D, 0x2E, 0xDB, 0x1D, 0xE7, 0xA0, 0xD7, 0x96, 0xDD, 0x37, 0xF3, 0x48,
+    0x62, 0xBB, 0xAF, 0xB2, 0x2C, 0x56, 0x99, 0x20, 0x45, 0x1A, 0x20, 0x96, 0x6F, 0x5E, 0x74, 0x7B,
+    0x04, 0xDA, 0x67, 0x05, 0x0F, 0x4D, 0xFC, 0x7E, 0xE0, 0x65, 0x13, 0xDB, 0x06, 0x5E, 0x50, 0x93,
+    0xA4, 0xA2, 0x1D, 0x10, 0x7D, 0x61, 0x25, 0x3D, 0x19, 0xCD, 0xC9, 0x51, 0xE2, 0xF1, 0x6A, 0xBC,
+    0xCF, 0x7D, 0xB3, 0x0F, 0x77, 0x98, 0x7A, 0x09, 0x9C, 0x40, 0x03, 0x48, 0x17, 0xE2, 0x75, 0x10,
+    0x59, 0xAC, 0x9F, 0x4A, 0xEC, 0x63, 0x0F, 0xD9, 0x3A, 0x75, 0x0D, 0xCD, 0xD4, 0x4E, 0x7F, 0xA5,
+    0xE3, 0xFB, 0xA3, 0x5E, 0x0A, 0x6E, 0xD2, 0xD8, 0x05, 0x3D, 0x84, 0x20, 0x5E, 0xCE, 0xBE, 0xFC,
+    0x9A, 0x29, 0x85, 0x08, 0xD6, 0x07, 0x07, 0x4B, 0x01, 0x60, 0x07, 0xE7, 0xF5, 0x83, 0x9E, 0x35,
+    0x12, 0xEF, 0xDD, 0xA6, 0x97, 0x51, 0xD1, 0x39, 0x11, 0x22, 0x45, 0xB0, 0x5D, 0xCA, 0x29, 0x69,
+    0x12, 0xE3, 0x0C, 0xA7, 0x41, 0x57, 0x99, 0xF2, 0xD9, 0x05, 0xAD, 0x87, 0xDE, 0xC7, 0x2C, 0xB3,
+    0x2B, 0x63, 0x87, 0x9F, 0xC5, 0xEE, 0xAB, 0xF5, 0x2A, 0xF1, 0x9B, 0x54, 0xB6, 0x54, 0xC0, 0x41,
+    0x88, 0x6E, 0x54, 0x63, 0x85, 0xD3, 0xFB, 0xED, 0xAD, 0x45, 0xEE, 0x91, 0xD3, 0x65, 0x4E, 0x5D,
+    0xF7, 0xE1, 0xF9, 0x56, 0x29, 0x12, 0x9D, 0x3C, 0xFE, 0x91, 0x76, 0xBE, 0x49, 0xD5, 0x62, 0x61,
+    0x24, 0x4F, 0x5C, 0x6B, 0x9A, 0xFC, 0xD2, 0x31, 0x98, 0x24, 0xA5, 0x5A, 0x7A, 0x98, 0xF5, 0x0B,
+    0xFE, 0xD4, 0x44, 0xF1, 0xE2, 0x88, 0xE7, 0x00, 0xA7, 0x56, 0xD6, 0xC9, 0xC8, 0x0C, 0x66, 0x20,
+    0xCC, 0x92, 0x3B, 0x8A, 0x50, 0x65, 0x09, 0x61, 0x54, 0x06, 0xA3, 0x7D, 0x73, 0xFB, 0x9E, 0x45,
+    0xD8, 0x67, 0x0F, 0x79, 0xF6, 0xF9, 0xAB, 0x72, 0x61, 0xA0, 0x36, 0xE2, 0x95, 0x32, 0x58, 0xE6,
+    0x47, 0xA6, 0x53, 0x27, 0x68, 0x36, 0xB5, 0x4B, 0x59, 0x61, 0x08, 0xEA, 0xE9, 0xE8, 0x0A, 0x24,
+    0xFD, 0x96, 0x5A, 0x02, 0xDB, 0xC2, 0xB4, 0x88, 0xF2, 0x15, 0x3C, 0xDC, 0xEF, 0x51, 0x34, 0x43,
+    0xD2, 0xF4, 0x9D, 0x9E, 0xD4, 0x5C, 0x98, 0x5B, 0xB2, 0xB8, 0x70, 0x39, 0x26, 0x5E, 0x8D, 0xAD,
+    0x9B, 0x37, 0x18, 0xB9, 0x74, 0xAC, 0xC6, 0xD0, 0x07, 0x1D, 0x13, 0x20, 0x66, 0x36, 0x28, 0x52,
+    0x62, 0xD9, 0x36, 0x54, 0xAE, 0x14, 0xF4, 0x62, 0x50, 0xA5, 0x96, 0x9B, 0xBE, 0xB8, 0x33, 0xFB,
+    0xD3, 0xDC, 0xB3, 0x74, 0x90, 0x2B, 0x3B, 0xAC, 0x27, 0xD8, 0x83, 0x8E, 0xF9, 0x6D, 0x35, 0x42,
+    0xD5, 0x60, 0x46, 0x33, 0x93, 0xF8, 0xB4, 0x77, 0xB0, 0xBF, 0xCD, 0xAE, 0x33, 0x9C, 0x8A, 0x7A,
+    0x06, 0x33, 0x05, 0x0C, 0x27, 0x61, 0x30, 0x31, 0x13, 0xD3, 0x15, 0xB1, 0x7C, 0x23, 0x22, 0x99,
+    0xFF, 0x47, 0xB4, 0xA2, 0x1D, 0x39, 0x9A, 0xE1, 0x52, 0xCC, 0x1A, 0x53, 0xF3, 0xA4, 0xE7, 0x2A,
+    0x4A, 0x12, 0xE5, 0xA4, 0x8D, 0x0D, 0xC4, 0xA6, 0xFE, 0x4F, 0x45, 0x2D, 0x2C, 0xA2, 0x64, 0x39,
+    0x41, 0xA5, 0xC0, 0xB7, 0x84, 0xA5, 0x98, 0x67, 0x2A, 0xA9, 0x2D, 0x7B, 0xAF, 0x8E, 0xDC, 0xE3,
+    0x58, 0xAA, 0x17, 0x5B, 0xC3, 0x69, 0xE7, 0x88, 0x64, 0xB8, 0x72, 0x5A, 0xA5, 0xCD, 0x07, 0x27,
+    0x1B, 0xC3, 0x37, 0x99, 0x9B, 0x57, 0xE7, 0x1F, 0x32, 0xED, 0xB5, 0xD6, 0x39, 0x5C, 0x40, 0x03,
+    0x6A, 0x20, 0x51, 0xC3, 0x4E, 0x39, 0x9C, 0x5F, 0x75, 0x2B, 0xFF, 0xCA, 0xA1, 0x43, 0x83, 0xC3,
+    0xA8, 0x5F, 0x0E, 0xC5, 0xBD, 0x88, 0xE6, 0xA9, 0x89, 0x07, 0x60, 0xA1, 0x21, 0x76, 0xF7, 0xBE,
+    0x65, 0xBC, 0x31, 0x59, 0x88, 0x00, 0xE5, 0xA7, 0xE3, 0x7A, 0x61, 0xE6, 0x87, 0x5C, 0x4E, 0xD1,
+    0x29, 0xDE, 0xD6, 0x4B, 0xCF, 0x64, 0x93, 0x31, 0xE9, 0x72, 0x91, 0x9F, 0xB3, 0x1E, 0x6E, 0x98,
+    0x1D, 0xF5, 0x8F, 0xFA, 0xFD, 0x7C, 0xA1, 0x16, 0x39, 0x76, 0x15, 0x52, 0x99, 0x40, 0x5A, 0x2E,
+    0x40, 0x71, 0x06, 0x53, 0xA9, 0x85, 0x98, 0x67, 0x5D, 0x38, 0x45, 0x50, 0xAF, 0xA3, 0x27, 0x46,
+    0x12, 0xCF, 0x79, 0xC9, 0x20, 0x39, 0xE9, 0x37, 0xBE, 0xD1, 0xC3, 0x8A, 0xFA, 0x7E, 0x6D, 0x34,
+    0x79, 0x64, 0x9F, 0x57, 0x78, 0xF1, 0xD2, 0x61, 0x2E, 0xD4, 0x80, 0x3B, 0xF3, 0x13, 0x9E, 0x05,
+    0x18, 0x0A, 0x5C, 0x7B, 0x2E, 0xAA, 0xB8, 0xA6, 0xCB, 0x11, 0x85, 0x48, 0xBA, 0x78, 0x7B, 0x3A,
+    0x8E, 0x1A, 0x91, 0xB7, 0x97, 0x61, 0xB5, 0x8E, 0xEB, 0xD4, 0x46, 0xE1, 0x68, 0x2E, 0x66, 0xC6,
+    0x8F, 0xF3, 0xCA, 0x29, 0x5B, 0x7E, 0xAA, 0x22, 0x71, 0xCA, 0x8A, 0xBB, 0xD5, 0x0D, 0x14, 0xA5,
+    0x98, 0xD7, 0x63, 0x60, 0xC2, 0x9A, 0x30, 0xD6, 0x5A, 0xE8, 0xCC, 0xFA, 0xCC, 0x06, 0x08, 0x63,
+    0x1E, 0x16, 0x4C, 0x3D, 0xF5, 0x68, 0xDD, 0xDC, 0xE2, 0xFB, 0xDE, 0x3F, 0x90, 0xD6, 0x7B, 0xC5,
+    0x09, 0xF7, 0x34, 0x5A, 0x23, 0xA0, 0x45, 0x88, 0x5C, 0x86, 0xA6, 0x12, 0x70, 0x1D, 0xF4, 0x3D,
+    0xAE, 0xFC, 0x44, 0xA7, 0xB2, 0xBE, 0x3F, 0xEA, 0xC0, 0xA2, 0x28, 0x6C, 0x91, 0xA3, 0xB7, 0xE9,
+    0xF6, 0x8F, 0x60, 0x29, 0xDA, 0x89, 0xF5, 0x95, 0x85, 0x2C, 0x4D, 0x09, 0xDF, 0x54, 0xC8, 0x96,
+    0xB5, 0xD4, 0x18, 0xA8, 0xCC, 0xCD, 0x3F, 0xDF, 0x70, 0x2B, 0xD9, 0x28, 0xBC, 0x51, 0x44, 0x02,
+    0x11, 0xE9, 0x5D, 0xDB, 0xF0, 0x25, 0x68, 0xD3, 0x2F, 0x7E, 0x17, 0x0B, 0x76, 0x31, 0xF9, 0x8E,
+    0x46, 0x5B, 0x22, 0xB9, 0xB3, 0xBF, 0xDE, 0x24, 0x06, 0x28, 0x37, 0x2A, 0xB6, 0x3D, 0xBA, 0x4D,
+    0xD8, 0x8F, 0xE0, 0x5D, 0x39, 0x52, 0xA0, 0x2F, 0xE1, 0xDD, 0x8B, 0x91, 0x84, 0xC2, 0xDA, 0x38,
+    0x2D, 0x61, 0xE0, 0x31, 0x03, 0x8D, 0xE5, 0xCF, 0xDC, 0x74, 0x88, 0x7C, 0x0C, 0xF6, 0x89, 0x99,
+    0x73, 0xD1, 0x7C, 0x06, 0xC1, 0x4B, 0xDE, 0xC0, 0x66, 0x53, 0xB5, 0xA8, 0x2E, 0xF7, 0x03, 0xE6,
+    0x88, 0x8D, 0xC3, 0x46, 0x0C, 0xCA, 0xE3, 0x03, 0xA3, 0xEE, 0xA9, 0x4C, 0x3F, 0xAF, 0x81, 0x06,
+    0x2C, 0xAF, 0x0D, 0x43, 0x2C, 0xF4, 0x9B, 0x42, 0xC0, 0x7B, 0x8B, 0xE5, 0x89, 0xB7, 0x43, 0xA2,
+    0xBD, 0x4E, 0x98, 0x47, 0x74, 0x1B, 0x80, 0xC3, 0x91, 0x47, 0x11, 0xAA, 0xC0, 0x60, 0x8D, 0x11,
+    0xFA, 0x5D, 0xC7, 0x1C, 0x3A, 0x3D, 0xE3, 0xA4, 0x2A, 0xBE, 0x4A, 0xF1, 0x30, 0xD8, 0xCC, 0x66,
+    0x14, 0x8D, 0xE1, 0xEF, 0xB5, 0xCE, 0xE7, 0x65, 0xDB, 0xCC, 0xDF, 0xE9, 0x68, 0x61, 0x2C, 0x20,
+    0x49, 0x5B, 0xD5, 0x8D, 0x67, 0xAA, 0x32, 0xDF, 0x12, 0x37, 0x53, 0x3E, 0x84, 0x25, 0xAB, 0x3C,
+    0x00, 0xD7, 0x71, 0x87, 0x69, 0xEC, 0x73, 0x62, 0xED, 0x4D, 0x74, 0x1E, 0x1E, 0x28, 0x99, 0x4A,
+    0x92, 0x48, 0x88, 0x61, 0x2E, 0x5B, 0x67, 0x0F, 0xA6, 0x43, 0xA7, 0x7F, 0xE9, 0xC5, 0x87, 0xB5,
+    0x00, 0xE7, 0xE8, 0xF4, 0x9A, 0x51, 0x6A, 0xA6, 0xFE, 0xCD, 0x49, 0xED, 0x63, 0x3C, 0x2D, 0x41,
+    0x31, 0xD0, 0x6D, 0x3E, 0xCA, 0x31, 0x10, 0x0B, 0x8C, 0xB0, 0x84, 0xF9, 0x55, 0x23, 0x3E, 0x18,
+    0x48, 0x7B, 0x93, 0xBF, 0x34, 0x9F, 0x2D, 0x20, 0x24, 0x5A, 0x40, 0x4C, 0xDF, 0x97, 0xAB, 0xB9,
+    0xF1, 0x54, 0xCF, 0x35, 0x13, 0xE8, 0x60, 0x74, 0x21, 0x64, 0xB1, 0xFE, 0xE2, 0x85, 0xD4, 0x4D,
+    0x4A, 0xA0, 0x74, 0xDD, 0xC2, 0x03, 0xD7, 0x61, 0x4C, 0x77, 0x0F, 0x38, 0xFE, 0x43, 0xEB, 0xDE,
+    0xEE, 0x32, 0x4D, 0x79, 0x50, 0xE6, 0x02, 0x2B, 0x97, 0x4C, 0xAA, 0x46, 0x31, 0x3A, 0x8D, 0xBD,
+    0x7F, 0x54, 0x86, 0x0A, 0x51, 0x5D, 0x3D, 0x59, 0xBB, 0x7B, 0x07, 0x99, 0x0F, 0xF0, 0x63, 0xAD,
+    0x39, 0x0B, 0x99, 0xDC, 0x18, 0x2F, 0x01, 0x26, 0x1F, 0x29, 0xF1, 0x81, 0xD9, 0x46, 0x68, 0x13,
+    0xC8, 0xE8, 0xC6, 0xE7, 0x7C, 0x66, 0x72, 0xDF, 0x31, 0xEA, 0x13, 0xDF, 0x3E, 0x88, 0xF7, 0x35,
+    0xC0, 0x27, 0xF1, 0xC8, 0x04, 0x55, 0x8D, 0xC2, 0xB3, 0x87, 0x98, 0x51, 0x54, 0x46, 0x0C, 0x63,
+    0xBE, 0xD0, 0xBA, 0x4D, 0x6F, 0x1C, 0xDF, 0xD4, 0xB1, 0x76, 0xCA, 0xB2, 0x85, 0xFE, 0x65, 0xE6,
+    0xC0, 0x0D, 0x56, 0xBA, 0x2D, 0x99, 0xFC, 0x9B, 0x6D, 0xC2, 0xFE, 0x28, 0x53, 0xED, 0xE0, 0xF7,
+    0x20, 0x4D, 0xD7, 0x4D, 0xF6, 0x5D, 0xC6, 0x50, 0x8D, 0xC1, 0x19, 0xC7, 0x12, 0xF5, 0x53, 0xE0,
+    0xE8, 0x07, 0xA5, 0x4E, 0x18, 0xF7, 0x5F, 0xFE, 0x48, 0x00, 0x12, 0x5F, 0x23, 0x4B, 0x80, 0x0D,
+    0x43, 0x11, 0xCA, 0xAC, 0xFF, 0x1F, 0xB5, 0x3C, 0x43, 0x23, 0x7D, 0x86, 0xB3, 0x58, 0x40, 0xF4,
+    0x42, 0xC1, 0xFB, 0x28, 0xFD, 0x89, 0x6B, 0x9C, 0x41, 0xE5, 0x60, 0xCA, 0x14, 0x76, 0xAB, 0x35,
+    0x09, 0x74, 0xF0, 0x89, 0xBB, 0x47, 0x3C, 0xBC, 0xED, 0x90, 0x5C, 0x75, 0xFE, 0x24, 0xD9, 0x41,
+    0x93, 0xE1, 0x98, 0x8D, 0xA7, 0x71, 0xDF, 0x54, 0x4C, 0x62, 0x02, 0x7C, 0x20, 0x9E, 0xDB, 0x59,
+    0xBB, 0x90, 0x89, 0x2C, 0x4D, 0x8E, 0x21, 0x25, 0x5E, 0x6C, 0xD8, 0x2F, 0x4D, 0x03, 0x92, 0xDF,
+    0xE0, 0xD3, 0x57, 0xAA, 0x12, 0xA1, 0x84, 0x88, 0x65, 0x25, 0x4B, 0xD6, 0xA1, 0x5C, 0x9F, 0xC0,
+    0x6E, 0xCE, 0xD8, 0x49, 0xF6, 0x54, 0x22, 0x99, 0xDD, 0x69, 0x3D, 0x97, 0x57, 0x71, 0xB1, 0x8D,
+    0x94, 0xA2, 0x3A, 0x53, 0x6C, 0xEB, 0xB7, 0x90, 0xEC, 0x4F, 0x9C, 0x35, 0xCC, 0x7B, 0xE1, 0xFD,
+    0x54, 0xE2, 0xE8, 0xBD, 0x97, 0xDE, 0x5C, 0xE6, 0x2E, 0xEA, 0x1B, 0x72, 0xFF, 0x30, 0xD5, 0x6F,
+    0x94, 0x60, 0x42, 0x52, 0xA7, 0x71, 0xE2, 0xEA, 0xA9, 0xDC, 0xD0, 0xC4, 0x5A, 0x01, 0x70, 0xFA,
+    0x04, 0x85, 0x45, 0x30, 0xFF, 0x23, 0x0B, 0x38, 0xFB, 0xBA, 0x63, 0xAB, 0xA4, 0x50, 0x8F, 0x6A,
+    0x73, 0xAC, 0xFE, 0x33, 0x95, 0x23, 0x1C, 0xD8, 0x5F, 0xEF, 0x71, 0xCD, 0x73, 0xC2, 0x84, 0x9E,
+    0x7D, 0x81, 0x3B, 0xAE, 0x4D, 0xA8, 0xB7, 0xA8, 0xE8, 0xF5, 0x1A, 0xF0, 0x02, 0x8E, 0x1C, 0x5E,
+    0x3F, 0x06, 0xDD, 0x2B, 0xC8, 0x38, 0x07, 0x29, 0xAF, 0x80, 0xDB, 0x9E, 0xCD, 0x8A, 0x9F, 0x96,
+    0xB4, 0x3A, 0x94, 0x53, 0x2F, 0xDA, 0xD8, 0x54, 0x88, 0x73, 0x63, 0x46, 0x73, 0x95, 0xE2, 0xD8,
+    0xC5, 0x32, 0x06, 0xE7, 0x7C, 0xB4, 0xC7, 0x04, 0x6B, 0x66, 0xE0, 0x18, 0xCD, 0x57, 0x45, 0x5D,
+    0x62, 0x8A, 0x39, 0x4C, 0x5F, 0x6E, 0x2F, 0xFC, 0x73, 0xFA, 0x9E, 0xBB, 0x23, 0x9E, 0xCB, 0x56,
+    0x15, 0x6D, 0xF1, 0xDD, 0x98, 0x1E, 0x33, 0x8E, 0xCA, 0xB7, 0x63, 0x3B, 0x62, 0x69, 0x7B, 0x68,
+    0x71, 0xDB, 0x80, 0xA1, 0xD3, 0x9E, 0xBB, 0xC9, 0x0E, 0x90, 0x4F, 0xFA, 0x61, 0xFC, 0xA3, 0xE1,
+    0xFA, 0xC3, 0x1F, 0x69, 0xC8, 0x4D, 0xBF, 0xB0, 0x1F, 0x0C, 0xB2, 0x37, 0x28, 0xEC, 0xF1, 0xF7,
+    0x42, 0x80, 0xD4, 0x9B, 0x40, 0x7D, 0xDA, 0x8B, 0x07, 0x60, 0x18, 0x26, 0x5C, 0x42, 0x1B, 0x05,
+    0x81, 0x8B, 0xD0, 0xA1, 0x72, 0x3D, 0xCD, 0x44, 0x66, 0xD4, 0xFD, 0x10, 0xDF, 0x78, 0x4D, 0xF0,
+    0x61, 0x00, 0x05, 0xC1, 0xEC, 0xF0, 0xE8, 0x73, 0x58, 0xDE, 0xCF, 0x97, 0xAF, 0x57, 0xFC, 0x07,
+    0x0B, 0x06, 0x0F, 0xBB, 0xCD, 0x0F, 0x62, 0x0E, 0x38, 0x80, 0x93, 0x86, 0x95, 0x17, 0x52, 0x22,
+    0xAE, 0x1A, 0x3B, 0x55, 0x42, 0xCE, 0xF3, 0xF0, 0xFD, 0x34, 0x2F, 0x7E, 0x57, 0x71, 0xAF, 0x45,
+    0x59, 0x3E, 0x65, 0x4C, 0xA6, 0x04, 0x3A, 0x19, 0x94, 0x00, 0xD4, 0xEE, 0xBB, 0x3F, 0x09, 0x86,
+    0x57, 0x51, 0xD6, 0x71, 0x03, 0xA9, 0xDB, 0x56, 0xED, 0x94, 0x8D, 0x75, 0xBB, 0x5A, 0x8D, 0x35,
+    0xBA, 0xEC, 0xDF, 0x13, 0x7A, 0xAF, 0x1D, 0x19, 0xBE, 0x2E, 0x60, 0xB8, 0xED, 0x0A, 0xEA, 0x26,
+    0xA3, 0x48, 0xF4, 0x8A, 0x71, 0x05, 0x35, 0x5A, 0x54, 0x74, 0xAA, 0xA9, 0x15, 0x93, 0xEF, 0x0E,
+    0x81, 0x23, 0xE9, 0x4E, 0xD1, 0x4E, 0x88, 0xC2, 0x1D, 0xE6, 0x5C, 0xC4, 0x54, 0x2B, 0xAE, 0xB4,
+    0xF0, 0xF0, 0x4C, 0x86, 0xBA, 0xB1, 0xDD, 0x00, 0xEC, 0xF6, 0x7E, 0x6F, 0x3F, 0x45, 0xA7, 0xA7,
+    0x09, 0x58, 0x49, 0x22, 0xBC, 0xB4, 0x0C, 0x33, 0x21, 0xD6, 0x07, 0x44, 0x3C, 0xBA, 0xFE, 0xF8,
+    0xF8, 0x2B, 0xAE, 0x33, 0x5B, 0xE7, 0xF9, 0x67, 0x68, 0xE3, 0xED, 0x40, 0x28, 0xF5, 0xFD, 0x5C,
+    0xE5, 0x25, 0x20, 0x04, 0x29, 0x9B, 0xC1, 0xDD, 0x51, 0xEC, 0x57, 0x56, 0x16, 0xA7, 0x4C, 0x3D,
+    0x80, 0xAE, 0x62, 0xFE, 0xBB, 0x2D, 0x17, 0x51, 0x00, 0x01, 0x79, 0x53, 0xD7, 0x70, 0xFA, 0x89,
+    0xEB, 0xB5, 0x37, 0x92, 0x03, 0x9C, 0x88, 0xC0, 0xA6, 0x62, 0x14, 0xB2, 0x0D, 0x22, 0xC8, 0xDC,
+    0x43, 0x17, 0xF8, 0x72, 0xFE, 0x0B, 0x88, 0xD6, 0x96, 0x7A, 0xB5, 0xF3, 0xC4, 0x6F, 0xEF, 0xA5,
+    0x87, 0xB7, 0x8A, 0xAD, 0x46, 0xCD, 0xFF, 0xF2, 0x38, 0x14, 0xD8, 0xD4, 0xD4, 0xC5, 0x9A, 0x5D,
+    0x38, 0x3D, 0x44, 0x53, 0xF3, 0x43, 0x79, 0x3F, 0xCD, 0xC2, 0x93, 0xB5, 0x34, 0x4F, 0x5E, 0xFA,
+    0x4D, 0x64, 0x61, 0x39, 0x0A, 0xDC, 0x8D, 0xB5, 0xD3, 0x82, 0xFD, 0x53, 0xAD, 0x9B, 0xC6, 0x79,
+    0x24, 0x09, 0x91, 0x8F, 0x61, 0x25, 0x07, 0x21, 0x97, 0x73, 0x98, 0x98, 0xB5, 0x46, 0xD1, 0xFB,
+    0xCE, 0x91, 0xF4, 0xC6, 0x39, 0xC7, 0xBE, 0xBF, 0x65, 0x97, 0x59, 0x27, 0x08, 0xDA, 0x30, 0x7D,
+    0x05, 0x6D, 0x04, 0xD8, 0xA2, 0xDA, 0x52, 0xFA, 0xC2, 0x6B, 0x37, 0x21, 0xEC, 0x03, 0xEE, 0x4D,
+    0x89, 0xA7, 0x81, 0x54, 0x1A, 0xB0, 0x2B, 0x3E, 0xA7, 0xE0, 0x54, 0xF6, 0x5A, 0xD6, 0x4E, 0xA2,
+    0x23, 0x1D, 0x1E, 0xE2, 0x46, 0x89, 0x20, 0xB5, 0x63, 0x44, 0xF1, 0xF5, 0x50, 0x6E, 0x5E, 0xD1,
+    0x6A, 0x34, 0xA8, 0xA1, 0xE8, 0xC4, 0x17, 0xE8, 0x4F, 0xC8, 0x2E, 0x64, 0x37, 0xC6, 0xEC, 0xDC,
+    0x65, 0x88, 0x38, 0x4A, 0xBF, 0x61, 0xC0, 0x8D, 0xC6, 0xEE, 0xFA, 0x77, 0x66, 0xE5, 0xD1, 0x0C,
+    0x92, 0xC8, 0xD8, 0xE9, 0x9B, 0xD6, 0x96, 0xB9, 0x93, 0x86, 0xB7, 0x40, 0x02, 0x7F, 0xD5, 0x5D,
+    0x63, 0x53, 0x59, 0xCF, 0xBB, 0xD1, 0xE9, 0x3D, 0xF1, 0x2C, 0xC0, 0xAE, 0xAD, 0xFC, 0x66, 0xC2,
+    0x0E, 0x13, 0x76, 0x2B, 0xA6, 0xB0, 0xDB, 0x31, 0x89, 0x7D, 0xFE, 0x79, 0xAA, 0x49, 0xB1, 0x9A,
+    0xC1, 0xF0, 0x39, 0x05, 0x08, 0x1C, 0x1F, 0xFC, 0xA8, 0xDC, 0x19, 0x3F, 0xDA, 0x26, 0x09, 0x11,
+    0x7D, 0xAD, 0x8D, 0x55, 0xC3, 0x53, 0x61, 0x17, 0x74, 0x21, 0x7B, 0x0E, 0xFC, 0xBF, 0xB5, 0x5B,
+    0xDC, 0x2B, 0x8F, 0x05, 0x40, 0x31, 0x05, 0xB9, 0xF5, 0x9E, 0x25, 0x3D, 0x92, 0x4E, 0xDD, 0x8B,
+    0x41, 0x63, 0xC1, 0x7A, 0x48, 0xCA, 0x8A, 0xE2, 0xA4, 0xFA, 0xB0, 0x81, 0x2F, 0x2A, 0x57, 0x8D,
+    0x18, 0xE3, 0x34, 0xCD, 0x3F, 0x16, 0x7D, 0x69, 0x4E, 0x27, 0x84, 0x62, 0xDD, 0x0C, 0x37, 0x81,
+    0x79, 0xB0, 0x79, 0x38, 0x46, 0xEF, 0x8B, 0xA7, 0x2A, 0xC1, 0xCA, 0x67, 0xB6, 0xF7, 0x8B, 0xB9,
+    0x77, 0x93, 0x8F, 0x55, 0x76, 0x10, 0x1C, 0x27, 0x92, 0x94, 0xCA, 0x67, 0xD1, 0xD4, 0xB8, 0x96,
+    0xEF, 0xD1, 0xD2, 0x32, 0xF4, 0xD7, 0x86, 0x9C, 0xBE, 0xBA, 0x8E, 0x05, 0xDA, 0x4B, 0x3D, 0x4A,
+    0x7E, 0x09, 0xE8, 0x0C, 0xE7, 0x53, 0xCB, 0x16, 0xA1, 0x9E, 0x56, 0xCD, 0xD8, 0x6C, 0x14, 0x4C,
+    0x19, 0x01, 0xEE, 0x5E, 0x03, 0x34, 0xB0, 0x3E, 0x30, 0x6E, 0x97, 0x75, 0x7F, 0x2B, 0xF2, 0xBA,
+    0xB1, 0x84, 0x76, 0x79, 0xC7, 0x6E, 0x46, 0x79, 0xC1, 0x3B, 0x2F, 0x18, 0x18, 0xDF, 0xBC, 0xAE,
+    0xFC, 0x1D, 0xE2, 0xB6, 0x77, 0x72, 0x5D, 0x04, 0x1E, 0x46, 0x20, 0xFF, 0x78, 0x9A, 0x64, 0xF9,
+    0xE8, 0x36, 0x19, 0x19, 0xBC, 0xF6, 0x54, 0x84, 0xAA, 0x8F, 0xB9, 0x7E, 0x06, 0x40, 0xF6, 0x96,
+    0x0A, 0xD9, 0x01, 0x1B, 0x6C, 0xCC, 0x0D, 0x63, 0x9C, 0x0A, 0x13, 0xF0, 0xC6, 0x16, 0x4D, 0xC2,
+    0x9F, 0xAF, 0x6B, 0x07, 0x96, 0x94, 0x69, 0x5A, 0x90, 0x43, 0x51, 0xAE, 0xD3, 0x90, 0x10, 0x66,
+    0xEE, 0x94, 0xA1, 0x6C, 0x42, 0x9F, 0x67, 0x1C, 0x85, 0x86, 0xBC, 0x81, 0xF7, 0x88, 0x30, 0xB8,
+    0xCA, 0x47, 0xA2, 0x08, 0xC1, 0x99, 0x9A, 0x86, 0x79, 0x51, 0x12, 0xCD, 0xE1, 0x69, 0xAE, 0xD2,
+    0x2C, 0xF8, 0x81, 0x92, 0x68, 0x3B, 0xDB, 0xDA, 0xFA, 0x98, 0x29, 0x84, 0x1C, 0xF0, 0xFD, 0xA1,
+    0xDA, 0x90, 0x6D, 0xB3, 0x78, 0xD2, 0x04, 0x1D, 0xD1, 0x9B, 0xBF, 0x0C, 0x15, 0x36, 0x9D, 0xC6,
+    0xB4, 0x4D, 0xB5, 0x93, 0xD9, 0xDF, 0xBC, 0x3A, 0x16, 0x2A, 0x07, 0x3C, 0xB0, 0x43, 0x95, 0x6E,
+    0x1E, 0x65, 0x09, 0x8D, 0x0D, 0x34, 0x45, 0x0E, 0xD9, 0x3E, 0x52, 0x69, 0x91, 0xC1, 0x90, 0xCA,
+    0x8E, 0x33, 0x02, 0xD3, 0x54, 0xB5, 0x61, 0xE8, 0xC6, 0x53, 0x01, 0x49, 0x4D, 0x0B, 0xAC, 0x3A,
+    0x95, 0x1B, 0x70, 0x43, 0x62, 0x6B, 0xD8, 0x37, 0x6C, 0xE7, 0xAE, 0x94, 0xE5, 0xE0, 0x1D, 0xE8,
+    0x1B, 0xC1, 0x52, 0x2A, 0x6B, 0x50, 0x32, 0xDE, 0xF7, 0xF8, 0xCE, 0x49, 0x3E, 0xE5, 0x74, 0x29,
+    0x33, 0x75, 0xF0, 0x63, 0x8A, 0x40, 0xE3, 0x13, 0x8F, 0xEB, 0x08, 0x24, 0xB2, 0x5A, 0x7A, 0xA9,
+    0xD0, 0x1F, 0xCE, 0x8A, 0x84, 0xBA, 0x8C, 0x4F, 0x10, 0x78, 0xAE, 0x64, 0xC3, 0xC3, 0x9A, 0x88,
+    0x59, 0xD2, 0xCD, 0x6E, 0xC2, 0xBC, 0x71, 0xEF, 0xDF, 0xAA, 0xD4, 0x52, 0xF9, 0x1B, 0xCC, 0x17,
+    0x51, 0x46, 0x7E, 0xB6, 0x0F, 0x77, 0x25, 0x3F, 0x23, 0x3B, 0xD9, 0xA7, 0x82, 0x6A, 0xB4, 0x12,
+    0x30, 0x96, 0x27, 0x47, 0x9D, 0x70, 0xD6, 0xE9, 0x86, 0xFA, 0xBD, 0x9D, 0x96, 0xE3, 0x30, 0x0C,
+    0x1E, 0xBD, 0xD9, 0xEA, 0x1E, 0x50, 0x18, 0x7F, 0x7E, 0xBE, 0xAE, 0x8E, 0x11, 0xEA, 0xDE, 0x17,
+    0x97, 0x9D, 0x60, 0x2B, 0xA2, 0x44, 0x1B, 0xCE, 0xC5, 0x3E, 0x68, 0x88, 0x1B, 0xDE, 0x0E, 0xFB,
+    0xD2, 0xDA, 0x30, 0x1E, 0x75, 0x70, 0x84, 0x19, 0xBD, 0x50, 0x8C, 0x9B, 0x46, 0x7F, 0xF4, 0x27,
+    0x19, 0xBF, 0x5C, 0xFC, 0xE3, 0xCF, 0x18, 0x9D, 0xD1, 0x32, 0x39, 0x28, 0x1E, 0xCD, 0x47, 0xD4,
+    0x38, 0xB1, 0xF8, 0x06, 0x4B, 0xC7, 0x45, 0x0B, 0x09, 0xA4, 0xE2, 0xF1, 0xC4, 0xA9, 0x00, 0xEA,
+    0x44, 0xF5, 0x75, 0xCA, 0x9F, 0xD1, 0x3F, 0xCE, 0x4D, 0xD0, 0x42, 0x79, 0x95, 0x76, 0xD9, 0x7C,
+    0xEF, 0x0A, 0xC6, 0x31, 0x82, 0xCC, 0xEA, 0x59, 0x4B, 0x43, 0xD5, 0xB6, 0x1D, 0x05, 0x5E, 0x59,
+    0xA7, 0x21, 0x45, 0x0D, 0x65, 0x57, 0x38, 0x76, 0x22, 0x39, 0x8A, 0x5D, 0xC8, 0x94, 0xE0, 0x51,
+    0x19, 0x68, 0x1E, 0x58, 0x5F, 0xB0, 0xBA, 0xC3, 0x55, 0xB4, 0x86, 0x18, 0x24, 0xDE, 0x2C, 0x8E,
+    0xE2, 0xB6, 0x67, 0x04, 0xD0, 0x3B, 0x84, 0x22, 0x50, 0xDB, 0x04, 0x1E, 0xE0, 0x17, 0x5F, 0xF0,
+    0xC7, 0xFE, 0x02, 0x17, 0xD0, 0x0C, 0x9D, 0x49, 0x00, 0x54, 0x79, 0xA0, 0xD0, 0x9B, 0xBF, 0xC2,
+    0xCE, 0x5E, 0xCC, 0xDE, 0x65, 0xF4, 0x62, 0x72, 0x7D, 0x33, 0x08, 0xF9, 0x26, 0x22, 0x84, 0xEE,
+    0xC8, 0x35, 0xD7, 0x42, 0x31, 0x8F, 0x5C, 0x23, 0xAA, 0x37, 0xC1, 0x79, 0xB0, 0xAD, 0x1E, 0x3A,
+    0xE3, 0x1C, 0x16, 0x49, 0x4D, 0xEA, 0xB0, 0x0A, 0x06, 0xD3, 0x56, 0x33, 0xD6, 0xDE, 0x3E, 0xF3,
+    0x64, 0xE2, 0xB6, 0xF2, 0xAC, 0xA5, 0x41, 0xDD, 0x8E, 0xDA, 0x3E, 0x56, 0x91, 0x66, 0x1B, 0x80,
+    0xC3, 0x2D, 0xAB, 0x84, 0xC6, 0xBF, 0xDD, 0x10, 0x36, 0x21, 0x65, 0xE5, 0xBE, 0x2B, 0x54, 0xCC,
+    0x6F, 0xE0, 0x70, 0xE5, 0x7A, 0x73, 0xC7, 0xF9, 0x8F, 0xB2, 0xEC, 0x1E, 0xD6, 0x5E, 0x55, 0x74,
+    0xC5, 0x19, 0x9D, 0x40, 0x13, 0x7C, 0xD4, 0x85, 0x10, 0xD5, 0x1D, 0x8C, 0x8F, 0x27, 0x68, 0xBC,
+    0x76, 0x9E, 0x14, 0xFF, 0x5D, 0xEA, 0x8B, 0xCB, 0x16, 0xBE, 0x4F, 0xFB, 0x02, 0xAC, 0x97, 0x0F,
+    0x3E, 0xBD, 0xD0, 0x1A, 0xCB, 0x93, 0xD8, 0x98, 0xBD, 0x15, 0x26, 0x91, 0xB9, 0xD0, 0xC6, 0x8D,
+    0x6B, 0x91, 0x82, 0x4A, 0x10, 0x77, 0xFA, 0x04, 0x60, 0xCC, 0xEB, 0x76, 0x15, 0x5D, 0x96, 0xE6,
+    0x16, 0x19, 0x73, 0xD2, 0xB9, 0xDD, 0x25, 0xF7, 0xFB, 0xFD, 0x7A, 0xEC, 0x1D, 0xA4, 0x5D, 0x3E,
+    0xAE, 0xBA, 0xEB, 0x84, 0x1D, 0x73, 0xD4, 0xE4, 0xB5, 0xBC, 0x0D, 0x79, 0xC5, 0xF6, 0xA3, 0xE9,
+    0x02, 0x64, 0x96, 0x65, 0x7A, 0x23, 0xDE, 0xFD, 0xEE, 0x22, 0x24, 0xFD, 0x1A, 0x39, 0x37, 0xD0,
+    0x51, 0xEB, 0x35, 0x3D, 0x30, 0x90, 0xE4, 0x70, 0x6A, 0x58, 0xB7, 0x9A, 0xE6, 0xB0, 0xAE, 0x7C,
+    0x64, 0x61, 0x42, 0x74, 0x0C, 0xF3, 0x9D, 0xCC, 0x40, 0x92, 0x23, 0xC1, 0x25, 0x2E, 0x07, 0x0E,
+    0x76, 0x0C, 0x4C, 0x3C, 0xA4, 0x2A, 0xE7, 0x1A, 0x91, 0xDE, 0x15, 0xF0, 0xF4, 0x08, 0x95, 0x77,
+    0x58, 0x4B, 0xF2, 0x45, 0xBE, 0x7C, 0xE4, 0x51, 0x57, 0x24, 0x92, 0x8D, 0x5F, 0x50, 0xA6, 0x77,
+    0xFA, 0x9E, 0xB4, 0xA2, 0xF9, 0xBA, 0x31, 0x37, 0xD8, 0x2D, 0xAF, 0xCB, 0x47, 0x98, 0xB3, 0x68,
+    0xA0, 0xB7, 0xCA, 0x2F, 0x79, 0xBA, 0xB7, 0x8D, 0x53, 0xB3, 0xAB, 0xDC, 0x4E, 0x47, 0x2F, 0x35,
+    0x4B, 0xC7, 0xAA, 0x64, 0x49, 0x9B, 0xB2, 0x92, 0x85, 0x43, 0x10, 0xE6, 0x84, 0x8B, 0xF5, 0xAE,
+    0x77, 0x28, 0x30, 0x46, 0xF4, 0xFC, 0xEE, 0x46, 0x78, 0x71, 0xE1, 0xDA, 0xAA, 0x33, 0x23, 0x98,
+    0x5E, 0xF0, 0xA5, 0x41, 0x75, 0x4B, 0xC9, 0xBD, 0x4B, 0x91, 0x38, 0xEF, 0x5B, 0x5D, 0x29, 0x9F,
+    0xAE, 0x95, 0x5F, 0xDB, 0x60, 0xDD, 0xB9, 0xBE, 0x4D, 0x7D, 0xA0, 0xA4, 0xAC, 0x9F, 0x65, 0x6A,
+    0xFA, 0x81, 0x01, 0xCF, 0x8F, 0xE2, 0x2C, 0x27, 0x64, 0x3A, 0x4D, 0x23, 0xC7, 0x7B, 0x4F, 0xCF,
+    0xA1, 0xDC, 0x0E, 0x21, 0x82, 0x2B, 0xD8, 0x51, 0x8B, 0x35, 0x81, 0x87, 0x9F, 0xFD, 0x05, 0xC5,
+    0x17, 0xAF, 0x99, 0x3D, 0x2B, 0x28, 0x2D, 0x82, 0x3A, 0x13, 0x68, 0x31, 0x21, 0x66, 0x53, 0xDB,
+    0x07, 0x45, 0xBD, 0x24, 0x52, 0xAA, 0xC6, 0xD4, 0x70, 0x24, 0xB1, 0x67, 0x9A, 0x94, 0xEA, 0xF0,
+    0x6B, 0x67, 0x99, 0xDD, 0x4F, 0x11, 0x73, 0xD2, 0x04, 0xBE, 0xB5, 0x77, 0xFB, 0xA2, 0x31, 0xCC,
+    0xD4, 0x1E, 0x91, 0x02, 0xD2, 0x62, 0xF6, 0xB1, 0x32, 0x36, 0x12, 0xF8, 0x4D, 0x1D, 0x47, 0x10,
+    0xA8, 0x65, 0x34, 0x71, 0x48, 0x9E, 0x22, 0x2B, 0xA2, 0x4F, 0xF9, 0x2B, 0xEB, 0x0F, 0x31, 0x80,
+    0x7E, 0xCA, 0x4A, 0xCF, 0x37, 0x08, 0x21, 0x1D, 0xBA, 0xD9, 0x32, 0x14, 0x3E, 0xEF, 0x6C, 0xFE,
+    0xB7, 0xA3, 0x56, 0x07, 0x62, 0x50, 0xA5, 0x23, 0xB4, 0x45, 0x9C, 0x51, 0xDF, 0xEB, 0x93, 0x1D,
+    0x4E, 0xFF, 0x29, 0xB2, 0x50, 0xF0, 0x2A, 0xEF, 0xEE, 0x73, 0x9B, 0x51, 0x69, 0x34, 0xAE, 0xF7,
+    0x4A, 0x4C, 0x06, 0x9D, 0x20, 0xC7, 0x12, 0x3F, 0x31, 0xBB, 0xBC, 0xD3, 0x27, 0xA9, 0x89, 0xC7,
+    0x42, 0x1F, 0x2E, 0x60, 0xEC, 0x29, 0x0D, 0x11, 0x88, 0xFC, 0xB4, 0x31, 0x08, 0xDD, 0x69, 0x15,
+    0xF1, 0x64, 0x25, 0x52, 0x46, 0x07, 0xAE, 0x35, 0xAA, 0x46, 0x89, 0x3A, 0xEA, 0x7F, 0xDC, 0x69,
+    0x9F, 0xD6, 0xF1, 0x3C, 0xDC, 0x6D, 0x00, 0x09, 0x95, 0x9D, 0x72, 0x50, 0xE7, 0xD7, 0xAC, 0x7D,
+    0x3D, 0xFD, 0x1D, 0x06, 0x38, 0xAD, 0xD7, 0x7A, 0xEC, 0x06, 0x0F, 0x2F, 0x3F, 0x4F, 0xD2, 0xC2,
+    0xAA, 0x30, 0x92, 0x18, 0x93, 0xE0, 0x65, 0xD9, 0xD8, 0x01, 0x48, 0xFD, 0xC1, 0xA3, 0xE4, 0xBD,
+    0x21, 0x05, 0x45, 0xA0, 0xCD, 0xDC, 0x87, 0x29, 0x6E, 0xE1, 0x77, 0x98, 0x4D, 0x09, 0x79, 0xB2,
+    0x62, 0x51, 0x73, 0x7B, 0x61, 0x14, 0x1D, 0x41, 0xA0, 0x92, 0xB9, 0x6E, 0x32, 0xA7, 0xD1, 0x68,
+    0xFB, 0x6D, 0x4C, 0x88, 0x3D, 0x7A, 0x54, 0x85, 0x49, 0x7C, 0x24, 0xD9, 0xFF, 0xC7, 0x07, 0x9C,
+    0xEF, 0xF6, 0x16, 0x6A, 0xB6, 0x1B, 0xB4, 0x23, 0x71, 0x40, 0x3B, 0x0F, 0xE6, 0xC6, 0x35, 0x6E,
+    0x3B, 0xC7, 0x8F, 0xCE, 0x08, 0xFF, 0x6A, 0x94, 0xCB, 0xB9, 0xA5, 0x21, 0x30, 0xAC, 0xE1, 0xE6,
+    0xB1, 0xDB, 0x31, 0x84, 0xB3, 0x5A, 0x41, 0x9F, 0x10, 0x21, 0x68, 0xCF, 0xED, 0x6B, 0xB4, 0xCF,
+    0xAB, 0x6E, 0xA2, 0x05, 0xF1, 0xF1, 0xEC, 0xE8, 0x29, 0xF4, 0xD9, 0x95, 0x61, 0xC2, 0x2A, 0xCC,
+    0xFE, 0x9B, 0x8D, 0x5B, 0x94, 0x60, 0x96, 0x51, 0x02, 0x3D, 0xB4, 0x0F, 0xC6, 0x51, 0x05, 0x7F,
+    0xFB, 0x4E, 0x4D, 0x21, 0x38, 0xBF, 0xDD, 0x2E, 0x2A, 0xB0, 0x85, 0xC8, 0x16, 0xB9, 0x78, 0xAB,
+    0xE1, 0xA0, 0x54, 0x0E, 0x19, 0x86, 0xCD, 0x39, 0xBF, 0x73, 0x38, 0xFF, 0xD3, 0x2F, 0xF9, 0xEB,
+    0x21, 0xB7, 0x9F, 0x96, 0x8C, 0x15, 0x44, 0x06, 0xEE, 0x04, 0x04, 0xAD, 0x3C, 0xCA, 0x2D, 0xB6,
+    0xAF, 0x8F, 0x6B, 0x11, 0xE4, 0x12, 0x46, 0x2A, 0x4A, 0x9B, 0x2F, 0x8F, 0x66, 0xEB, 0x2B, 0xA1,
+    0xF7, 0x65, 0x92, 0x14, 0x78, 0xF9, 0xA4, 0x5A, 0x8A, 0x33, 0x92, 0x87, 0x75, 0x9F, 0x0A, 0x27,
+    0x53, 0xC8, 0xB1, 0xD5, 0xAB, 0xA2, 0x56, 0xB7, 0x8D, 0xA4, 0xA7, 0x2F, 0x95, 0xA8, 0xC5, 0xC6,
+    0xB0, 0xBE, 0xAF, 0x68, 0x99, 0x2D, 0x86, 0x01, 0x31, 0x6A, 0x7A, 0xE3, 0xDD, 0x87, 0x03, 0x31,
+    0x57, 0x33, 0x31, 0x49, 0x12, 0x90, 0xEB, 0x1A, 0x3C, 0x67, 0x2C, 0x60, 0xB8, 0xC4, 0x2C, 0x6A,
+    0xD2, 0x1C, 0xF5, 0x0E, 0x2E, 0x71, 0x1A, 0x14, 0x25, 0xE0, 0xAA, 0xE2, 0xD7, 0xB7, 0x9D, 0xCE,
+    0xDA, 0x12, 0x0C, 0x9D, 0x85, 0x37, 0x0E, 0xF3, 0x8B, 0x9D, 0xBF, 0xE7, 0xFB, 0xAC, 0x5D, 0x3D,
+    0x00, 0x72, 0x4C, 0xB9, 0xEE, 0x7B, 0xF7, 0xA6, 0xC9, 0xD4, 0xE6, 0x27, 0x24, 0x31, 0xD0, 0x56,
+    0x58, 0x4B, 0x00, 0x02, 0xA0, 0x2A, 0xDA, 0xBB, 0x23, 0x43, 0x87, 0x8F, 0xC0, 0xB4, 0x87, 0x6F,
+    0xD4, 0xF8, 0x0F, 0x38, 0x6E, 0x82, 0xFC, 0xE2, 0x1E, 0xD5, 0x96, 0x05, 0xD1, 0x1A, 0x95, 0x1B,
+    0xE6, 0xC1, 0xF0, 0xA1, 0x8A, 0x0F, 0xF0, 0xD4, 0x2D, 0x03, 0x5D, 0x2F, 0xCD, 0xF4, 0x0A, 0xFF,
+    0xBB, 0xD2, 0x79, 0x06, 0xAA, 0x65, 0xF1, 0x4D, 0x8E, 0x6E, 0x24, 0x08, 0x6D, 0xA5, 0x66, 0x84,
+    0x28, 0x25, 0xE2, 0xC1, 0xA8, 0xFB, 0x6F, 0x2E, 0x99, 0xC1, 0xA8, 0x99, 0x16, 0xF8, 0xCD, 0x5F,
+    0xF5, 0x41, 0xFB, 0xD1, 0xC7, 0xA6, 0xF4, 0x2F, 0x4A, 0xAE, 0x36, 0xF8, 0x9D, 0x23, 0x62, 0x5C,
+    0x3C, 0x62, 0xD4, 0xF5, 0x52, 0x46, 0xDE, 0x28, 0xB5, 0x7D, 0xFD, 0x25, 0xB4, 0x51, 0x70, 0xB3,
+    0x5D, 0x56, 0x92, 0x51, 0x8C, 0x4B, 0x69, 0xE8, 0x34, 0x66, 0x41, 0x4E, 0x22, 0x72, 0x82, 0x1A,
+    0xEB, 0xDE, 0x59, 0x5B, 0x3C, 0x0E, 0x66, 0x7F, 0xB6, 0xC8, 0x07, 0x2F, 0x82, 0x89, 0xDA, 0xC4,
+    0x8E, 0xC4, 0x70, 0xA1, 0xEA, 0xD3, 0xA9, 0x28, 0xFE, 0x9B, 0xCA, 0xE8, 0x89, 0xD1, 0xE0, 0xC6,
+    0x36, 0x91, 0x09, 0x98, 0x4F, 0x28, 0x9B, 0x10, 0x4B, 0x89, 0xDB, 0xC4, 0xCA, 0x60, 0x57, 0xA0,
+    0x0F, 0x04, 0x3F, 0x1B, 0x75, 0xAE, 0x5A, 0x9F, 0x0A, 0xFB, 0xCC, 0x6F, 0x46, 0xE8, 0xC1, 0xB0,
+    0x98, 0x1D, 0x6B, 0xC3, 0x3C, 0xEA, 0x83, 0x5E, 0xBF, 0x21, 0x5E, 0x28, 0x3C, 0x8E, 0xF4, 0x6B,
+    0xAA, 0x3F, 0x0E, 0xBC, 0xB5, 0xAD, 0x65, 0xEF, 0xA3, 0xB1, 0x73, 0x3C, 0x55, 0x52, 0xB6, 0xBC,
+    0x5E, 0xA4, 0xC6, 0x27, 0x88, 0xEB, 0x34, 0xB1, 0x61, 0x5F, 0x03, 0x20, 0x66, 0x95, 0x9B, 0xC6,
+    0x94, 0xC1, 0x65, 0xAA, 0x8E, 0x4E, 0x41, 0xB4, 0xB2, 0x45, 0x04, 0x42, 0xA0, 0xC3, 0xB1, 0xD2,
+    0x46, 0x0A, 0xFE, 0x4A, 0xDD, 0xC3, 0xC0, 0x01, 0x6A, 0x3F, 0xAF, 0xF5, 0xDE, 0x92, 0xC3, 0xF0,
+    0xEC, 0xDF, 0x69, 0xEC, 0x25, 0x1F, 0x43, 0x4E, 0x87, 0x80, 0xF9, 0xD7, 0x54, 0x92, 0x8E, 0x02,
+    0xCC, 0xF0, 0x46, 0x79, 0x9C, 0x2A, 0x5F, 0xCF, 0x24, 0x3F, 0x7F, 0xD3, 0x2F, 0xBE, 0x71, 0x51,
+    0xCD, 0xAC, 0x73, 0xD5, 0x60, 0x44, 0x7E, 0x96, 0xE6, 0x5F, 0xFD, 0x08, 0x46, 0x17, 0x10, 0x3A,
+    0x71, 0xF6, 0x8E, 0xAF, 0x6E, 0xFC, 0x4E, 0x05, 0xD1, 0x43, 0xC0, 0xF1, 0x77, 0xEE, 0x02, 0x94,
+    0x8D, 0x84, 0x32, 0xB5, 0x7E, 0x40, 0x3F, 0xF9, 0x74, 0xF1, 0x5B, 0xCC, 0xDA, 0xB5, 0x48, 0xEC,
+    0x5A, 0xEC, 0xC0, 0x1D, 0x50, 0x9D, 0x86, 0x6F, 0xBF, 0x42, 0xAE, 0xEE, 0x93, 0x46, 0xEF, 0xEC,
+    0x0F, 0xFE, 0x13, 0x37, 0x7D, 0xD3, 0xF4, 0xAF, 0x7F, 0x6F, 0x62, 0x61, 0xA3, 0x1A, 0xD1, 0xEF,
+    0x8D, 0xCF, 0x9E, 0xE3, 0x46, 0x8A, 0x9F, 0x35, 0x3A, 0xB4, 0xBC, 0xA7, 0x9F, 0x3F, 0x90, 0x16,
+    0x66, 0xBB, 0x6B, 0x5B, 0x47, 0xF9, 0xD5, 0x80, 0x53, 0x26, 0x69, 0x0F, 0x0E, 0x5D, 0xAD, 0x3E,
+    0x42, 0x75, 0xD1, 0x65, 0x62, 0xDD, 0xBB, 0xBB, 0x0F, 0x2B, 0x11, 0xCC, 0xEE, 0x1D, 0x47, 0x2E,
+    0xD7, 0x83, 0x71, 0xCE, 0x24, 0x1C, 0xA4, 0xC3, 0xA1, 0x0C, 0x9F, 0x99, 0x51, 0x59, 0x39, 0x8F,
+    0x24, 0xDA, 0x16, 0xA1, 0x1A, 0xE3, 0x69, 0x07, 0x27, 0x5B, 0xAA, 0xA7, 0x24, 0xA2, 0xEB, 0x2B,
+    0x49, 0x29, 0x21, 0xA0, 0xA3, 0xC9, 0x0D, 0xC7, 0xB5, 0x0D, 0xDF, 0xA3, 0xED, 0xD8, 0x37, 0x97,
+    0x47, 0x56, 0xAB, 0x6E, 0x8C, 0x64, 0xE3, 0xDC, 0x2F, 0x1C, 0x0F, 0x44, 0x71, 0x23, 0xF7, 0x59,
+    0x26, 0xAB, 0xDA, 0x8C, 0x7D, 0x5A, 0x80, 0x15, 0x2D, 0xA0, 0x92, 0x5C, 0x6A, 0x8F, 0x07, 0x88,
+    0x14, 0xED, 0xAE, 0x56, 0x35, 0xF4, 0x3E, 0xBF, 0x69, 0x84, 0xE0, 0xAE, 0x60, 0xB9, 0xF6, 0x8A,
+    0x2B, 0x53, 0x22, 0xCE, 0x1C, 0x95, 0x85, 0xBC, 0xEC, 0xE4, 0xE3, 0xE2, 0x96, 0xC0, 0xCF, 0xA5,
+    0x5D, 0x25, 0x0C, 0x85, 0x51, 0x2A, 0xC5, 0x38, 0x25, 0x97, 0xDC, 0x7C, 0x14, 0x39, 0x1F, 0xB4,
+    0x3C, 0xBF, 0x65, 0x0F, 0x41, 0xD1, 0xE5, 0x81, 0xCA, 0xF3, 0xB7, 0x1C, 0xC5, 0xC4, 0xC0, 0xB8,
+    0xBB, 0xCE, 0x39, 0x7C, 0x2E, 0x1F, 0x27, 0xAD, 0x16, 0x8A, 0x69, 0x69, 0x1D, 0x3B, 0x89, 0x4E,
+    0xC3, 0x28, 0x1C, 0x1B, 0x47, 0x98, 0xA3, 0xDB, 0xC9, 0x69, 0x6E, 0x11, 0xD6, 0xA0, 0x08, 0x74,
+    0x8B, 0x37, 0x4B, 0x66, 0x7A, 0x12, 0x70, 0x35, 0x84, 0x38, 0x27, 0x8F, 0xAC, 0xC9, 0xFF, 0xFC,
+    0xC2, 0x1A, 0x0F, 0x58, 0x8E, 0x7E, 0xF1, 0xCD, 0x73, 0x74, 0x09, 0x57, 0x24, 0xBC, 0xA3, 0x0B,
+    0xBD, 0x6D, 0x8E, 0x63, 0x09, 0x15, 0xBD, 0x7F, 0x09, 0xDA, 0xE1, 0x06, 0x34, 0x0B, 0x74, 0xB8,
+    0xB8, 0x9D, 0x8A, 0xFA, 0x4E, 0x1E, 0xF4, 0x6A, 0x8C, 0x4C, 0xD6, 0x34, 0x3F, 0x82, 0xD2, 0x84,
+    0xD5, 0xDA, 0x2D, 0xDB, 0xCD, 0x9F, 0x2A, 0x1D, 0xE8, 0x24, 0x43, 0xEC, 0x94, 0xCF, 0x51, 0xBF,
+    0x48, 0x50, 0xC5, 0x71, 0x73, 0x78, 0x35, 0xD9, 0x98, 0x1E, 0xCF, 0x96, 0x02, 0x74, 0x29, 0xE9,
+    0x30, 0x02, 0x5B, 0xEC, 0x66, 0xD8, 0xD0, 0xB6, 0x4D, 0x33, 0x3F, 0x2A, 0xF4, 0x2A, 0xC6, 0xAD,
+    0x82, 0x9A, 0x1D, 0x62, 0xE2, 0xDA, 0x05, 0xE7, 0x8C, 0x69, 0xCB, 0xB4, 0xB8, 0xD9, 0xEB, 0x7D,
+    0x49, 0xD6, 0x5E, 0xDD, 0xA5, 0x85, 0xB5, 0x3F, 0x08, 0xEB, 0x33, 0xA6, 0x2D, 0x68, 0x17, 0xF2,
+    0x20, 0x3D, 0xEC, 0xAC, 0x71, 0x8C, 0x51, 0x7A, 0x20, 0x05, 0x63, 0xF3, 0x7A, 0x98, 0x4A, 0x26,
+    0x2E, 0xEC, 0xD1, 0x9B, 0x50, 0x7D, 0xEB, 0x37, 0xD3, 0xD9, 0x21, 0x6B, 0x97, 0x06, 0x9F, 0x10,
+    0x0A, 0x8B, 0x56, 0x6D, 0x7B, 0x78, 0x9D, 0xF6, 0x89, 0x8B, 0xDF, 0x7B, 0x21, 0xF0, 0x55, 0x85,
+    0xF8, 0x23, 0xAB, 0xEA, 0x5A, 0xF8, 0x0C, 0xB8, 0xB9, 0x13, 0xDA, 0xCC, 0x0A, 0x35, 0x21, 0xAF,
+    0x78, 0x87, 0x33, 0x78, 0x89, 0x39, 0x1E, 0x15, 0xD7, 0x14, 0x49, 0xC9, 0x14, 0x60, 0x39, 0xAC,
+    0x4C, 0x76, 0x64, 0xD7, 0xCF, 0x8A, 0x4A, 0xDA, 0xF7, 0x20, 0xCD, 0x46, 0xB4, 0x3B, 0x20, 0x60,
+    0x43, 0x6B, 0x52, 0xD9, 0x20, 0x10, 0x8A, 0xF9, 0xF7, 0x34, 0xDA, 0x5E, 0xCF, 0xD1, 0xCC, 0x60,
+    0x31, 0xF8, 0xE5, 0x5C, 0xF5, 0xC8, 0xCB, 0x3C, 0xF6, 0x63, 0xD4, 0x26, 0xA1, 0x41, 0x71, 0xCD,
+    0x73, 0x97, 0xBF, 0x27, 0x2A, 0x2C, 0x0C, 0x75, 0x6D, 0x4A, 0xA0, 0x8A, 0x0D, 0x02, 0x53, 0xBA,
+    0x72, 0xA3, 0xE0, 0xE6, 0x1A, 0x85, 0xC5, 0xD7, 0xF1, 0x49, 0x4F, 0x24, 0x16, 0x35, 0x3F, 0x0C,
+    0x2B, 0xCE, 0x9C, 0x35, 0x0F, 0x23, 0xA3, 0x7C, 0xCE, 0xC8, 0xED, 0x34, 0x2C, 0xCC, 0x33, 0x0A,
+    0x73, 0xA3, 0x58, 0x53, 0x78, 0x55, 0xD1, 0xC2, 0x08, 0xCA, 0x03, 0xBE, 0x6E, 0x1D, 0x9C, 0xD2,
+    0x67, 0x71, 0x4D, 0x77, 0x9A, 0x63, 0xA1, 0x7C, 0x31, 0x11, 0x3D, 0xDE, 0xE0, 0xDC, 0x0D, 0x06,
+    0xDD, 0xAF, 0x16, 0x65, 0xF6, 0xF0, 0x27, 0x28, 0x9A, 0xBA, 0xED, 0xE2, 0xC2, 0x27, 0x2B, 0x74,
+    0x2D, 0xF8, 0x6E, 0xE1, 0x0C, 0xB2, 0xC7, 0xBF, 0xD3, 0x0A, 0x94, 0x0E, 0x3A, 0xE1, 0x04, 0x34,
+    0x97, 0xA7, 0x7E, 0x01, 0xA0, 0x31, 0x89, 0x86, 0x05, 0x28, 0x84, 0x0C, 0x3E, 0xB5, 0x22, 0x26,
+    0x6E, 0x52, 0xFD, 0x3B, 0x39, 0x5B, 0xB7, 0xEC, 0x49, 0x50, 0x21, 0xA6, 0x58, 0x20, 0x50, 0x11,
+    0x5D, 0x9E, 0xFF, 0xF5, 0x93, 0x74, 0x39, 0x24, 0xBD, 0xBA, 0x5A, 0xB5, 0x4E, 0x35, 0xEB, 0x13,
+    0x31, 0x04, 0x3D, 0xAD, 0xBE, 0xBB, 0x43, 0x24, 0xC1, 0x8F, 0x2A, 0x43, 0x6D, 0x85, 0x6C, 0x8E,
+    0x78, 0x6A, 0x7F, 0xE3, 0x5C, 0xE4, 0xC1, 0x4A, 0x68, 0x46, 0xC4, 0xA4, 0xEB, 0x8A, 0xB0, 0xFB,
+    0x02, 0xE9, 0x76, 0x49, 0x0C, 0x90, 0x3F, 0x4F, 0x79, 0x39, 0xA9, 0x93, 0x61, 0x66, 0x4F, 0x60,
+    0x8A, 0x5C, 0x91, 0xCC, 0x2D, 0x2D, 0x43, 0xCD, 0x38, 0xE7, 0x6B, 0xE1, 0xA5, 0xA9, 0x53, 0xC9,
+    0x0E, 0xBB, 0x36, 0x10, 0x2C, 0xDF, 0x2E, 0xB5, 0xD1, 0x81, 0xCC, 0x4F, 0xAF, 0x77, 0x21, 0xFC,
+    0xA8, 0xFB, 0x78, 0x3D, 0xF0, 0x16, 0x76, 0xCF, 0x97, 0x67, 0xE8, 0x2B, 0x29, 0x00, 0x93, 0xAF,
+    0x60, 0x66, 0x38, 0x0C, 0x4A, 0xED, 0xAA, 0xA7, 0x89, 0x3F, 0xE8, 0x40, 0x9D, 0x02, 0xA7, 0xB7,
+    0x95, 0x51, 0xBE, 0x57, 0x45, 0xC5, 0x7E, 0x1E, 0xAD, 0x09, 0x6C, 0xD9, 0x81, 0x56, 0xA2, 0x92,
+    0x72, 0x17, 0xD2, 0x86, 0x62, 0x7A, 0x62, 0x0A, 0xAE, 0xEC, 0x0D, 0x27, 0x35, 0x40, 0xFA, 0xAE,
+    0x78, 0xEA, 0x70, 0xD4, 0xF0, 0xDA, 0xCD, 0x87, 0xF5, 0x9D, 0x5F, 0x83, 0xCB, 0x3B, 0x07, 0x52,
+    0xD0, 0xA2, 0xB4, 0x22, 0x8E, 0xDF, 0xAA, 0xF6, 0xAB, 0x31, 0x91, 0x90, 0xBE, 0x21, 0xF9, 0x7D,
+    0x87, 0x23, 0x1C, 0x59, 0x00, 0x05, 0xF5, 0x4F, 0x9B, 0xBB, 0x6D, 0x50, 0x7E, 0x56, 0x6B, 0x3E,
+    0xAE, 0x9B, 0x6F, 0xAB, 0x88, 0xEC, 0xAE, 0x0F, 0x6C, 0x89, 0xAB, 0x26, 0x6B, 0x5A, 0xD9, 0x6D,
+    0xF1, 0x23, 0x9E, 0xB3, 0xEB, 0x97, 0x08, 0xF0, 0x0E, 0x5C, 0x80, 0x00, 0xCD, 0x7A, 0x4F, 0x64,
+    0xF9, 0x1A, 0x80, 0x0D, 0xFA, 0x3D, 0x42, 0x71, 0x39, 0x83, 0x15, 0x8A, 0xFF, 0x91, 0x9F, 0x80,
+    0x0F, 0x67, 0xAA, 0xBB, 0xB0, 0x67, 0x45, 0x30, 0xDD, 0x86, 0x8C, 0x1D, 0xF7, 0x7A, 0xB3, 0x28,
+    0xA1, 0xD6, 0x56, 0x63, 0xD2, 0x75, 0x10, 0xF0, 0x77, 0x53, 0x1A, 0x95, 0x9A, 0x49, 0xD7, 0x3E,
+    0xAA, 0x24, 0x92, 0x02, 0x92, 0xF5, 0x7D, 0x2F, 0x8F, 0x24, 0x36, 0x11, 0x59, 0xCF, 0x62, 0xA6,
+    0x69, 0xCD, 0xB5, 0x66, 0x75, 0x20, 0x16, 0x41, 0xC1, 0x4F, 0xE5, 0x81, 0xC4, 0xC2, 0x91, 0x69,
+    0xC0, 0xF1, 0xA3, 0x01, 0x6B, 0xA9, 0x0F, 0x55, 0x2D, 0x29, 0xD7, 0x1D, 0xDD, 0x7D, 0x9E, 0xCF,
+    0xF5, 0x05, 0xFA, 0x7C, 0x1F, 0x8B, 0xC9, 0xCA, 0x34, 0x66, 0xEF, 0x3C, 0x24, 0x9A, 0xAE, 0xCF,
+    0xCB, 0x12, 0xB1, 0xE5, 0x59, 0xD9, 0x30, 0x90, 0xB3, 0xA7, 0xE9, 0x38, 0x9A, 0x73, 0x1C, 0xDE,
+    0xBE, 0x62, 0x77, 0x5E, 0x75, 0xBF, 0x37, 0x39, 0x27, 0xBA, 0x91, 0xEB, 0xED, 0xAB, 0xB5, 0xCE,
+    0x8E, 0x6E, 0xBD, 0xD4, 0x64, 0x64, 0x47, 0x16, 0x14, 0x98, 0xC6, 0xF0, 0xB6, 0x4A, 0xE8, 0xB7,
+    0x67, 0x86, 0xC5, 0xCB, 0xCE, 0xB1, 0x7B, 0xC0, 0xDE, 0x87, 0xF7, 0x8E, 0xE7, 0x21, 0x3A, 0x86,
+    0xB5, 0x9C, 0x38, 0xBA, 0x60, 0x98, 0xFA, 0x93, 0xBA, 0x63, 0xE3, 0x0F, 0x74, 0xB1, 0x6B, 0x39,
+    0x68, 0xB6, 0x53, 0xB1, 0x8A, 0xBB, 0x76, 0x65, 0x74, 0x1D, 0x99, 0xBA, 0x01, 0x8A, 0xE3, 0x7C,
+    0xC0, 0x73, 0x2A, 0x98, 0x13, 0x0E, 0x22, 0xB4, 0xF6, 0xC4, 0xF9, 0x89, 0xAF, 0x9B, 0x52, 0x6F,
+    0x28, 0xEC, 0x8E, 0x13, 0xC4, 0xD4, 0x97, 0x74, 0x2E, 0xDB, 0x6F, 0xA8, 0x41, 0xE3, 0xDC, 0x6A,
+    0xE4, 0xB8, 0x18, 0x2C, 0x19, 0x59, 0xE1, 0x45, 0xC5, 0xED, 0x8F, 0xCA, 0x24, 0x2A, 0x3F, 0xAD,
+    0xDA, 0x98, 0xC1, 0x70, 0x7F, 0xF3, 0x87, 0xE1, 0xB8, 0xBC, 0xF5, 0xFB, 0x29, 0x7B, 0x12, 0x26,
+    0x22, 0x1A, 0x5B, 0x59, 0x21, 0x21, 0x79, 0x30, 0xA7, 0x69, 0x13, 0xD9, 0x9E, 0x62, 0x02, 0x77,
+    0x84, 0xB9, 0x87, 0xD3, 0xCB, 0x0E, 0xB0, 0x73, 0x58, 0x21, 0xFE, 0x18, 0x6A, 0x92, 0x94, 0x30,
+    0xEC, 0x06, 0x11, 0xB9, 0xC8, 0x99, 0x6B, 0xE9, 0xFE, 0x44, 0x9D, 0x04, 0xBA, 0xC9, 0x92, 0x7E,
+    0x46, 0x7B, 0x81, 0x4A, 0x70, 0x79, 0x56, 0x7F, 0x39, 0x96, 0x58, 0xC6, 0x35, 0x8A, 0x8F, 0x98,
+    0x47, 0xF8, 0xD9, 0x16, 0x81, 0xC1, 0x79, 0x43, 0x08, 0xF9, 0x4A, 0xC7, 0xBA, 0x31, 0xCA, 0xC3,
+    0x0D, 0xEA, 0x71, 0x40, 0x42, 0x2E, 0x29, 0xF2, 0xB1, 0x96, 0xFB, 0xC0, 0x98, 0x3B, 0x2F, 0xB2,
+    0x8D, 0x82, 0xBA, 0xB0, 0x8D, 0x3D, 0x78, 0x10, 0xF2, 0x33, 0x55, 0xD2, 0x02, 0x98, 0x3A, 0xF3,
+    0x43, 0x8F, 0x8D, 0x27, 0xD0, 0x1B, 0x50, 0x04, 0xB2, 0xA8, 0x42, 0x36, 0xE7, 0xD9, 0x2B, 0x4A,
+    0x33, 0x9E, 0xBF, 0x46, 0x12, 0x17, 0x82, 0x89, 0xEA, 0xAA, 0x35, 0x7F, 0x3C, 0x6B, 0xEC, 0xC2,
+    0x84, 0x33, 0xAB, 0x10, 0x25, 0x59, 0x0F, 0x2B, 0x90, 0x3F, 0xF4, 0x2A, 0x97, 0x6F, 0xD5, 0x6C,
+    0xE3, 0x08, 0x07, 0xA9, 0xFC, 0x84, 0x7B, 0x51, 0x2F, 0x23, 0x2A, 0x6E, 0xF1, 0x0F, 0xEF, 0x48,
+    0x9F, 0x66, 0x8F, 0x5C, 0x9A, 0x21, 0x84, 0xD7, 0xB1, 0x14, 0x82, 0xA2, 0xE4, 0xE6, 0x72, 0x56,
+    0x46, 0xCB, 0x26, 0x2F, 0xE2, 0x6D, 0x5B, 0x07, 0xA6, 0xF3, 0x94, 0x24, 0x24, 0x58, 0x45, 0xF4,
+    0xB4, 0x54, 0x90, 0xFF, 0x59, 0x17, 0x04, 0xC8, 0x9A, 0x4D, 0x82, 0xEF, 0x24, 0xBB, 0x2C, 0x11,
+    0x9F, 0x2D, 0xD4, 0xE5, 0x0A, 0x2A, 0xF0, 0x94, 0x64, 0x48, 0xFF, 0xB4, 0x7D, 0x01, 0x42, 0xBE,
+    0x8F, 0xB2, 0x2F, 0x2A, 0x0A, 0x17, 0xB0, 0xA2, 0x0B, 0x5E, 0x32, 0x05, 0x2A, 0x0A, 0xE5, 0xF6,
+    0x3D, 0xA8, 0x12, 0xBD, 0x5C, 0x4F, 0x59, 0x76, 0xAB, 0x9C, 0x89, 0x98, 0xFD, 0xCE, 0x0B, 0xA1,
+    0x62, 0x4D, 0x3A, 0x16, 0xA5, 0x80, 0x62, 0x8B, 0x52, 0xD4, 0x2A, 0x8E, 0xC0, 0x17, 0xE3, 0x42,
+    0xA6, 0x70, 0x40, 0x6B, 0xE8, 0xE7, 0xD7, 0xA7, 0x43, 0x12, 0xF6, 0xB3, 0x7A, 0xE2, 0xFE, 0x42,
+    0xB0, 0xAF, 0x33, 0x56, 0x10, 0xB1, 0x69, 0x3D, 0x7B, 0x7F, 0xDE, 0xC6, 0xE1, 0x0F, 0xCC, 0x5B,
+    0xF9, 0x53, 0x08, 0x80, 0x05, 0x33, 0xD8, 0x09, 0x7B, 0x87, 0x71, 0xE0, 0xF5, 0xCA, 0xB5, 0xFB,
+    0xB4, 0x3C, 0x4A, 0x6B, 0x10, 0xBA, 0xA6, 0xE6, 0x69, 0xD6, 0x8E, 0x8C, 0x5B, 0x33, 0x07, 0xE8,
+    0x22, 0xB9, 0xF8, 0x3C, 0xEF, 0xE0, 0xDA, 0x06, 0x54, 0xCB, 0x14, 0xDB, 0x2B, 0x50, 0x92, 0xB2,
+    0x5C, 0xB8, 0xCB, 0xB6, 0x40, 0xB1, 0x91, 0xD4, 0xD7, 0xF9, 0xC2, 0x08, 0x77, 0xC9, 0xB7, 0x00,
+    0x9B, 0x32, 0x20, 0xC4, 0x08, 0x39, 0xEE, 0xD6, 0x32, 0xB8, 0x63, 0x0F, 0x1A, 0x73, 0x33, 0x73,
+    0xE1, 0xFB, 0x0E, 0x94, 0x75, 0xCE, 0x37, 0xA4, 0xAF, 0xBC, 0x39, 0xAB, 0x25, 0x35, 0xA7, 0xDF,
+    0xC2, 0x9B, 0xF5, 0xD7, 0x52, 0x44, 0xDE, 0x21, 0x50, 0x5F, 0x3E, 0xA6, 0x37, 0x9E, 0x91, 0x56,
+    0x12, 0x82, 0xCB, 0xA0, 0xAE, 0x6F, 0xA8, 0x81, 0x0C, 0x3B, 0xC0, 0x4C, 0xEE, 0x47, 0x57, 0x79,
+    0xC1, 0x49, 0x4B, 0x7A, 0x92, 0xC7, 0x95, 0xA4, 0xD6, 0x3E, 0x25, 0xE5, 0xCF, 0x55, 0x65, 0x10,
+    0x52, 0x58, 0xEA, 0x4F, 0xFC, 0x34, 0xB1, 0x0E, 0x0E, 0x2E, 0x45, 0x4C, 0xD7, 0xB7, 0x92, 0xC4,
+    0x70, 0xE5, 0x33, 0xA1, 0x22, 0x49, 0x04, 0xF8, 0xAF, 0x5E, 0x6D, 0x4B, 0xDE, 0x76, 0xCD, 0x50,
+    0x40, 0xFB, 0xFD, 0x7B, 0xC3, 0xF2, 0xEA, 0x4B, 0xEA, 0xA7, 0x66, 0x44, 0x2B, 0x4D, 0x0C, 0xA3,
+    0xC4, 0xAA, 0x9C, 0x50, 0x36, 0x5A, 0x4D, 0xB7, 0x04, 0x81, 0x5C, 0xBD, 0x40, 0x62, 0x12, 0x6A,
+    0x4C, 0x13, 0x35, 0x4E, 0x47, 0x16, 0xD9, 0x43, 0xE5, 0x8A, 0x44, 0x6D, 0x49, 0x71, 0x30, 0xA9,
+    0x4C, 0xDE, 0x31, 0x1E, 0x2A, 0xE1, 0xDB, 0xBF, 0x1F, 0xB6, 0x7C, 0x36, 0xAA, 0x0F, 0x02, 0xBA,
+    0x85, 0x87, 0xFC, 0x47, 0x90, 0x34, 0xD5, 0x13, 0x9E, 0x09, 0x2B, 0xC3, 0xEC, 0x83, 0x80, 0x9D,
+    0xFE, 0x3D, 0x18, 0xBA, 0xFB, 0x51, 0x8D, 0x79, 0xF6, 0xFA, 0x38, 0x48, 0x60, 0x14, 0xCC, 0x60,
+    0x81, 0x57, 0xEE, 0xA5, 0x04, 0x1B, 0x4A, 0x0E, 0x43, 0x15, 0x00, 0x57, 0xE2, 0x0A, 0xBC, 0xF4,
+    0x14, 0x3B, 0x96, 0x95, 0xF3, 0xFC, 0x4E, 0x13, 0x6F, 0x0D, 0x63, 0x85, 0xD0, 0xB0, 0x3B, 0xCA,
+    0x0A, 0x80, 0x3D, 0x11, 0xD1, 0x7A, 0xCF, 0xB2, 0x0B, 0xE1, 0x67, 0xDD, 0x45, 0x9B, 0xEC, 0x30,
+    0xD5, 0xE3, 0x06, 0xB3, 0x94, 0xBB, 0xCB, 0x32, 0xBA, 0x17, 0xDF, 0x5F, 0x1F, 0x38, 0xAF, 0xC6,
+    0xA9, 0xB5, 0x7F, 0xF6, 0x85, 0xC2, 0x99, 0x33, 0x0A, 0x3F, 0x7D, 0xB2, 0x72, 0x7D, 0xF7, 0xF4,
+    0x1B, 0x11, 0xA1, 0x7D, 0xF7, 0x3D, 0x7F, 0x0F, 0xFA, 0xB1, 0xEE, 0x6C, 0xAD, 0xA9, 0xE7, 0x43,
+    0x5D, 0xFE, 0xC9, 0x32, 0xF6, 0xF1, 0x97, 0xE7, 0x87, 0x17, 0x85, 0xB9, 0xBC, 0xC1, 0xD5, 0x2F,
+    0xC4, 0x5A, 0xBE, 0x03, 0xC3, 0x49, 0xAB, 0x9D, 0x40, 0xFA, 0xE1, 0xBD, 0x1E, 0x44, 0xE8, 0x8A,
+    0x6E, 0x98, 0x99, 0x4C, 0xC6, 0x2B, 0xE0, 0x18, 0x26, 0x83, 0xCA, 0x08, 0x0B, 0xDD, 0x69, 0xD1,
+    0x33, 0xD5, 0x8F, 0xAD, 0xBD, 0x86, 0xFE, 0xC3, 0x0C, 0xC3, 0x99, 0x3D, 0x4B, 0xB0, 0x0C, 0x75,
+    0x17, 0x89, 0x6E, 0x70, 0x0C, 0x23, 0xA9, 0x99, 0xD9, 0x59, 0x07, 0x7D, 0x30, 0xFC, 0xC5, 0x98,
+    0xD0, 0xFF, 0x5D, 0x10, 0x99, 0xF4, 0xB7, 0xC5, 0x56, 0xE8, 0xA7, 0x0D, 0x02, 0xB4, 0x04, 0xFB,
+    0x9E, 0x9C, 0x8B, 0x0C, 0x03, 0x57, 0x48, 0x73, 0x51, 0x9A, 0x8E, 0xB6, 0xB9, 0x15, 0x57, 0xFD,
+    0x52, 0x1E, 0x27, 0x87, 0x68, 0xCF, 0x1C, 0x2B, 0x18, 0x2D, 0xDA, 0x00, 0x2F, 0x71, 0xB8, 0x66,
+    0x35, 0x3F, 0x50, 0xC0, 0xBC, 0xF6, 0xF1, 0x0E, 0xD0, 0xAC, 0x1C, 0xFC, 0xAD, 0x7C, 0xD9, 0x36,
+    0x3F, 0x20, 0xC1, 0x96, 0x83, 0xB1, 0x14, 0xAB, 0xC7, 0xD5, 0x0A, 0xF4, 0x41, 0x65, 0x7D, 0x4C,
+    0x8D, 0x03, 0xB0, 0x4C, 0x3E, 0x16, 0x6B, 0xB7, 0xF7, 0x16, 0x6B, 0x2A, 0x82, 0x27, 0x5A, 0x1A,
+    0x60, 0xFF, 0x21, 0x47, 0x0E, 0xF9, 0x66, 0x78, 0x3D, 0x27, 0xE7, 0x22, 0x93, 0x3C, 0x39, 0x9D,
+    0xA1, 0xC1, 0x89, 0x6D, 0x16, 0xCF, 0x12, 0x43, 0x24, 0x9A, 0x40, 0x7A, 0x5A, 0xBA, 0xA5, 0xD2,
+    0x1A, 0x9E, 0x71, 0x1F, 0x22, 0x33, 0x22, 0xA5, 0xEA, 0xA0, 0xF9, 0x88, 0x55, 0x05, 0x8D, 0xD9,
+    0x0A, 0x45, 0x21, 0x9F, 0xA2, 0xD7, 0x0B, 0xE1, 0xC1, 0x3E, 0xDF, 0x89, 0xDE, 0x24, 0xF9, 0x3F,
+    0x9B, 0x1E, 0xA6, 0xB9, 0x94, 0x67, 0x4D, 0xFB, 0x9E, 0x27, 0xA4, 0x6F, 0xF5, 0xCE, 0xEB, 0x97,
+    0xDA, 0xB4, 0x8A, 0xFB, 0xF2, 0xAD, 0xD2, 0x2C, 0x0A, 0x76, 0xF2, 0xA7, 0x13, 0x0B, 0x47, 0xE2,
+    0xF7, 0xDA, 0x56, 0xDF, 0x83, 0x86, 0x59, 0xE5, 0x22, 0x58, 0x2F, 0x9E, 0x9F, 0x51, 0xDF, 0xA5,
+    0x35, 0xB1, 0xC1, 0xC6, 0xCE, 0xAF, 0x2C, 0xF7, 0x5F, 0xE1, 0x39, 0x6A, 0x87, 0x67, 0xB6, 0x86,
+    0xC7, 0x24, 0x93, 0xEA, 0x78, 0x80, 0xDD, 0x66, 0x96, 0x40, 0x4E, 0xD7, 0x72, 0x14, 0x8F, 0x8E,
+    0x2B, 0x62, 0x72, 0x07, 0x2F, 0x14, 0x9B, 0x3D, 0x7A, 0xB4, 0x90, 0x10, 0xF2, 0xDC, 0x1A, 0x0F,
+    0x68, 0xAC, 0x00, 0x21, 0xA0, 0xF7, 0xE3, 0x31, 0x6F, 0xC8, 0x62, 0xDD, 0x16, 0x13, 0xDB, 0x5A,
+    0x28, 0x56, 0xE5, 0x2A, 0x1D, 0x74, 0x7E, 0x9E, 0x33, 0xC2, 0xE2, 0x96, 0x2C, 0x88, 0xF5, 0xA4,
+    0x46, 0x43, 0xE5, 0x90, 0x67, 0xE2, 0xC9, 0xF4, 0xB9, 0xC6, 0x44, 0xAB, 0xA2, 0x90, 0x22, 0xD2,
+    0x7D, 0xF7, 0x23, 0x5F, 0xF7, 0x98, 0x09, 0x2A, 0xB1, 0xF5, 0xDC, 0x63, 0x50, 0x68, 0xB5, 0x07,
+    0x22, 0x82, 0x59, 0x44, 0x34, 0x7B, 0x8C, 0x0A, 0x15, 0x16, 0x45, 0x9F, 0xAE, 0x25, 0x10, 0x94,
+    0xB7, 0xC5, 0x4A, 0xDC, 0x42, 0x1C, 0x8A, 0xBC, 0x79, 0xD3, 0xB3, 0xA7, 0x57, 0x70, 0x52, 0xAB,
+    0x0A, 0x17, 0x3B, 0x8B, 0xAE, 0x4B, 0x6D, 0x7C, 0x4D, 0x94, 0x30, 0x12, 0xAC, 0x9F, 0xF0, 0x2C,
+    0xB7, 0x84, 0x4F, 0xAF, 0x54, 0x9E, 0x2A, 0x0B, 0x76, 0x65, 0xEB, 0x4C, 0x09, 0x26, 0x51, 0xAC,
+    0x85, 0xC2, 0xD3, 0x27, 0xE8, 0x90, 0xB1, 0xBD, 0x70, 0x00, 0xBB, 0xBE, 0x32, 0x8A, 0x06, 0x90,
+    0xB6, 0x7A, 0x28, 0x8C, 0x18, 0xE0, 0xA7, 0x0A, 0x93, 0x4E, 0x3B, 0x91, 0x63, 0xB8, 0xF8, 0xCD,
+    0x8D, 0xFD, 0x9C, 0x80, 0x22, 0x11, 0x60, 0x16, 0x47, 0xAE, 0x63, 0xD2, 0xEA, 0x1E, 0xF6, 0x09,
+    0x1E, 0x8A, 0x9B, 0xB5, 0x77, 0xE4, 0x66, 0x2D, 0x04, 0x89, 0xD8, 0xB6, 0xAB, 0x68, 0x70, 0x67,
+    0x4D, 0x15, 0x70, 0x6F, 0x1C, 0xB0, 0xC0, 0x23, 0x27, 0xDB, 0xCA, 0x5A, 0x10, 0x34, 0x5A, 0x6C,
+    0x2F, 0x89, 0x27, 0x45, 0x8D, 0xF4, 0xCD, 0x38, 0x28, 0x9B, 0x5C, 0x66, 0xD4, 0x8F, 0x23, 0x08,
+    0xF9, 0x8F, 0x60, 0x58, 0x56, 0x92, 0xBB, 0xC2, 0x8F, 0x6E, 0xC8, 0x15, 0x92, 0x92, 0x33, 0xAD,
+    0xB4, 0x50, 0x7C, 0x31, 0x3D, 0x77, 0x9D, 0xCF, 0x01, 0x9E, 0x08, 0xA1, 0x63, 0xEE, 0x3B, 0xDD,
+    0x79, 0x67, 0x61, 0xF0, 0xB3, 0x90, 0x00, 0x5F, 0x70, 0x58, 0x85, 0x97, 0xED, 0x1F, 0x5C, 0x67,
+    0x96, 0x45, 0x31, 0xC5, 0xCF, 0xDC, 0x00, 0x48, 0x34, 0xDF, 0x0B, 0x5B, 0xFB, 0xC0, 0xB3, 0x3F,
+    0x72, 0xFF, 0x0D, 0x05, 0x4E, 0x4D, 0x42, 0x6F, 0x65, 0x75, 0x1B, 0xB5, 0xCA, 0xB5, 0xA6, 0x67,
+    0x18, 0x77, 0x51, 0x21, 0x4D, 0x0B, 0xC3, 0x6B, 0xB7, 0x70, 0x78, 0x81, 0xCC, 0xB1, 0xD8, 0xCD,
+    0xFA, 0xA4, 0x40, 0x80, 0xEF, 0x90, 0xE6, 0x64, 0x4C, 0x7E, 0xC7, 0x5F, 0x90, 0xF1, 0xA0, 0x66,
+    0x7C, 0x06, 0x4F, 0xF9, 0xD3, 0x96, 0x31, 0x96, 0x4B, 0x91, 0x8B, 0x94, 0x45, 0x59, 0xCB, 0xE1,
+    0x5F, 0x45, 0xBD, 0xDD, 0x29, 0xED, 0x2D, 0xFE, 0xDD, 0x58, 0xBC, 0xED, 0x4A, 0x8B, 0xEE, 0xF5,
+    0xEA, 0x9B, 0xDC, 0xCE, 0x55, 0xB6, 0x9A, 0x3E, 0xE0, 0xD0, 0xE0, 0x1E, 0xDE, 0xB4, 0x33, 0xF1,
+    0xA5, 0x1B, 0x07, 0x2B, 0x5F, 0xA2, 0x59, 0x28, 0xD7, 0xC3, 0x3B, 0x52, 0xBF, 0x4C, 0x2E, 0xD7,
+    0x88, 0x22, 0x77, 0xD9, 0x51, 0x27, 0x08, 0xA4, 0xC7, 0xF3, 0x5B, 0xF2, 0x7B, 0x6D, 0x34, 0x6E,
+    0x81, 0x53, 0xB2, 0xB8, 0x0F, 0xDE, 0x51, 0x75, 0x20, 0x36, 0x1E, 0x86, 0xB5, 0x1D, 0xCF, 0xCA,
+    0x5D, 0xEF, 0x00, 0x3E, 0x68, 0xD6, 0x8C, 0x09, 0xE6, 0x12, 0x2D, 0x97, 0x24, 0xFD, 0x6A, 0xB1,
+    0xD5, 0x13, 0x18, 0x1A, 0xBF, 0x8D, 0xE5, 0x38, 0x7E, 0x57, 0x47, 0x09, 0xEC, 0xA9, 0xDF, 0x97,
+    0xDA, 0x8C, 0x91, 0x2F, 0x29, 0x2D, 0xAC, 0x8B, 0xCA, 0xC7, 0x03, 0xD8, 0x68, 0xF9, 0x77, 0x2E,
+    0x9F, 0x5F, 0xCE, 0xD8, 0xA4, 0x39, 0x0E, 0x64, 0xB8, 0xD8, 0x21, 0x7D, 0xCE, 0x68, 0xA5, 0xD5,
+    0x38, 0x79, 0x9F, 0x90, 0x49, 0x33, 0x72, 0x05, 0x72, 0x4C, 0x76, 0x83, 0x35, 0xFC, 0x1A, 0xE2,
+    0xF4, 0x60, 0xC8, 0xA8, 0x54, 0xC3, 0xC1, 0x4D, 0x17, 0xFD, 0xAE, 0xA9, 0xA9, 0x20, 0xFE, 0xF9,
+    0x25, 0x4A, 0xE3, 0x22, 0xDC, 0x7D, 0xE0, 0xFC, 0x47, 0xF7, 0xA6, 0xF3, 0x3F, 0xCE, 0xC8, 0x2E,
+    0x8B, 0xCE, 0xFA, 0x46, 0x8D, 0x38, 0x4B, 0x3C, 0xB6, 0x23, 0xA9, 0x2E, 0x53, 0xD9, 0xC3, 0x60,
+    0x60, 0xFF, 0x10, 0xC7, 0x38, 0x54, 0x5C, 0xBD, 0x3E, 0xB1, 0x52, 0x2C, 0x30, 0xB3, 0x6D, 0x14,
+    0x5B, 0x4D, 0xAD, 0x68, 0x9E, 0xD6, 0x0A, 0x91, 0xFD, 0x40, 0x69, 0xE1, 0xB3, 0x76, 0x21, 0x9D,
+    0x5D, 0x97, 0x9F, 0x01, 0x11, 0x55, 0x9A, 0x82, 0x57, 0x1D, 0xD6, 0x55, 0xE7, 0x20, 0x5E, 0x12,
+    0x0A, 0xD9, 0xA8, 0x26, 0xB9, 0x1B, 0x0A, 0xE5, 0xB0, 0x25, 0x79, 0xB2, 0x94, 0x9F, 0x43, 0xA6,
+    0xBA, 0x29, 0x7E, 0x61, 0x4C, 0x48, 0xEA, 0xBE, 0xC1, 0x5D, 0xE8, 0xF0, 0xEB, 0x4B, 0xE1, 0xF5,
+    0x4B, 0x2D, 0xD3, 0xAA, 0x1C, 0x51, 0x00, 0x15, 0x16, 0x64, 0xFC, 0xC3, 0x2B, 0xF0, 0x91, 0xBC,
+    0xF9, 0xDB, 0xE9, 0x88, 0x70, 0xD3, 0x56, 0x47, 0xA3, 0x65, 0xA3, 0x34, 0x74, 0xD8, 0x97, 0x14,
+    0x7B, 0xA5, 0x1E, 0x12, 0xD7, 0xA6, 0x88, 0x00, 0x91, 0x49, 0xFE, 0xD8, 0xF1, 0x0F, 0x59, 0xE3,
+    0xED, 0x5D, 0x8E, 0x39, 0x0D, 0x10, 0xB5, 0x42, 0x31, 0x31, 0x6A, 0x7A, 0x56, 0xD0, 0x25, 0xB6,
+    0x47, 0x7D, 0xBB, 0xCE, 0x47, 0x0A, 0xA7, 0xFF, 0xB9, 0xCB, 0xED, 0x79, 0xFF, 0xFE, 0x16, 0x0C,
+    0x5F, 0xC4, 0xAF, 0x31, 0x2C, 0xAB, 0x23, 0xA9, 0xBB, 0x2E, 0x9B, 0x09, 0xFA, 0x52, 0xC6, 0x80,
+    0xF8, 0xB7, 0x3A, 0xFD, 0xD2, 0xAC, 0xBF, 0x87, 0x77, 0x3B, 0x71, 0x25, 0xCA, 0xDB, 0xC7, 0xE9,
+    0x90, 0xCC, 0x98, 0x42, 0x36, 0xCE, 0xF5, 0x9F, 0x3D, 0x52, 0xDD, 0xE8, 0xB3, 0xFB, 0x46, 0x94,
+    0xAE, 0x17, 0xC8, 0xA4, 0x84, 0xF7, 0xA7, 0xD3, 0xBD, 0x31, 0xCE, 0x90, 0xAF, 0xE7, 0x88, 0x59,
+    0x06, 0x68, 0x7F, 0x05, 0xEB, 0x93, 0xDC, 0x17, 0x41, 0x1C, 0xE0, 0x8B, 0x08, 0x98, 0xCE, 0x45,
+    0xF2, 0xE5, 0x8C, 0xF7, 0xBA, 0xBB, 0x2B, 0x0D, 0x2D, 0x78, 0xC7, 0x37, 0xB2, 0xDD, 0xE9, 0x86,
+    0x75, 0x96, 0xB7, 0xB6, 0x90, 0x14, 0x0E, 0xB8, 0x65, 0x74, 0xC9, 0x4A, 0xA7, 0x7B, 0x39, 0x88,
+    0x61, 0x02, 0x24, 0x55, 0x21, 0x14, 0x9B, 0x29, 0xC3, 0xB1, 0x37, 0xE3, 0x48, 0xCE, 0xAE, 0x42,
+    0x07, 0x2C, 0x08, 0xC8, 0x6E, 0xCE, 0x6F, 0xF6, 0x40, 0x40, 0xBD, 0xC2, 0xC9, 0x76, 0x7B, 0x11,
+    0xF7, 0x81, 0xD9, 0xE7, 0x6D, 0x4B, 0x1B, 0xDB, 0x9E, 0x13, 0x30, 0xDB, 0x55, 0xBB, 0x84, 0xE7,
+    0x0F, 0xBA, 0x13, 0x72, 0x04, 0xBE, 0x94, 0x13, 0xB4, 0xA8, 0xF4, 0x23, 0x89, 0x20, 0x1D, 0x5A,
+    0xC2, 0x23, 0xCF, 0x41, 0x38, 0xCD, 0xFF, 0x93, 0x76, 0x7D, 0xF6, 0x95, 0x5A, 0x3C, 0x27, 0x27,
+    0xEC, 0x79, 0xA8, 0xF7, 0x41, 0x5C, 0xA4, 0xD7, 0x37, 0x09, 0x6E, 0xBD, 0x1D, 0x2C, 0x59, 0xFE,
+    0xD7, 0x6B, 0x73, 0xC1, 0x1F, 0x97, 0x5F, 0x9F, 0x1E, 0xDE, 0x23, 0x9D, 0xFF, 0xE2, 0x83, 0x52,
+    0x9E, 0xB0, 0x80, 0x2D, 0x2E, 0xE4, 0x99, 0xB1, 0x02, 0x28, 0x69, 0xEB, 0x0B, 0x5E, 0xD0, 0xEA,
+    0xB4, 0x77, 0x96, 0xBD, 0x79, 0xE9, 0xCB, 0x1B, 0xBD, 0x4D, 0x39, 0x83, 0x4E, 0x2D, 0x62, 0x94,
+    0xB2, 0x29, 0xFC, 0x9E, 0xC3, 0x18, 0x60, 0x8C, 0xE0, 0x60, 0x40, 0x10, 0x97, 0x16, 0xAB, 0x3A,
+    0x85, 0x2D, 0xD5, 0x80, 0x0C, 0xDA, 0xB7, 0x41, 0xE4, 0x6A, 0x07, 0x75, 0xC5, 0x43, 0x49, 0x6B,
+    0xBB, 0xA6, 0x12, 0x84, 0xBF, 0xDD, 0x4D, 0x76, 0xC8, 0x0F, 0xEC, 0xC1, 0x1B, 0xFE, 0x24, 0x67,
+    0x37, 0x08, 0x42, 0xA5, 0x61, 0x60, 0xC9, 0x2B, 0x32, 0x25, 0x88, 0xB4, 0x99, 0x68, 0x40, 0xAD,
+    0x68, 0x49, 0xD5, 0x61, 0xF9, 0xBA, 0x5A, 0xDD, 0xB1, 0x47, 0xB1, 0xA9, 0x61, 0x38, 0x87, 0xC4,
+    0x86, 0x88, 0x0B, 0x7B, 0xA8, 0xCD, 0xB0, 0x35, 0x62, 0xA2, 0xDA, 0x7A, 0x3C, 0x85, 0x00, 0x66,
+    0x79, 0x74, 0xFF, 0x79, 0x6F, 0x6C, 0x4B, 0x21, 0x65, 0x7E, 0x2F, 0xFF, 0x8A, 0xD8, 0xE8, 0x69,
+    0x3D, 0x3D, 0xF5, 0xB8, 0xEF, 0x8B, 0x6D, 0xE8, 0x6F, 0x69, 0x2F, 0x8B, 0x49, 0xD8, 0x10, 0xF5,
+    0x42, 0xB9, 0xA6, 0x2A, 0xC8, 0xB2, 0xE7, 0x6A, 0x20, 0x84, 0x89, 0x07, 0xA0, 0xFF, 0xC8, 0x0D,
+    0x8D, 0xEE, 0xB6, 0xED, 0x7B, 0x03, 0x46, 0x36, 0xC7, 0x69, 0x8A, 0x18, 0x88, 0x5C, 0xBB, 0xA9,
+    0xC0, 0x40, 0x49, 0x16, 0xB4, 0x85, 0x50, 0x88, 0x3D, 0x50, 0x7C, 0x50, 0x3B, 0x12, 0x19, 0xEB,
+    0x9E, 0x1F, 0x44, 0x11, 0x8B, 0x1C, 0xF0, 0xCF, 0xE1, 0x76, 0xA4, 0xAB, 0x4F, 0x2E, 0x46, 0x43,
+    0xA4, 0xB2, 0x6E, 0x79, 0x4A, 0x89, 0x19, 0x70, 0xD8, 0xBE, 0xF5, 0x8D, 0xAA, 0x5B, 0x23, 0xB8,
+    0xBA, 0xFB, 0xE6, 0xA7, 0xF1, 0xE8, 0xA3, 0xF8, 0xE7, 0x2D, 0x7F, 0x3B, 0x7D, 0x89, 0x48, 0x99,
+    0xAC, 0x5A, 0xC0, 0x5B, 0xCD, 0xE3, 0xC1, 0x65, 0x52, 0xB0, 0xA5, 0xFC, 0x5C, 0xA2, 0xEB, 0xFB,
+    0x61, 0x04, 0xE2, 0xC9, 0xD6, 0x24, 0x27, 0x12, 0x2F, 0x3A, 0x9E, 0xE6, 0x97, 0x87, 0x19, 0x4F,
+    0xBB, 0x09, 0x80, 0x4A, 0xAD, 0x9B, 0x18, 0x8E, 0x43, 0x91, 0xAF, 0x2C, 0x54, 0xE8, 0xDB, 0xB8,
+    0x0C, 0x11, 0xC7, 0x29, 0xE7, 0x76, 0xCF, 0xAA, 0xCC, 0x83, 0x77, 0x4E, 0xE6, 0x4D, 0x78, 0xFD,
+    0x1C, 0x14, 0xCA, 0x1F, 0x0F, 0xA3, 0x70, 0xDB, 0x33, 0x44, 0xF2, 0x34, 0x3F, 0xDB, 0x5E, 0x1F,
+    0x9B, 0x25, 0x47, 0x44, 0x5F, 0x04, 0xCD, 0xBA, 0x79, 0x2A, 0x21, 0xD0, 0x8B, 0x71, 0xF8, 0x9F,
+    0x16, 0x6D, 0xEE, 0x1A, 0xE9, 0x6C, 0x52, 0xDB, 0x8D, 0x17, 0x28, 0xAD, 0xFD, 0xEF, 0x7B, 0xAC,
+    0x53, 0x6B, 0xED, 0x11, 0x04, 0x83, 0xFD, 0x96, 0x2E, 0xB2, 0x31, 0xC6, 0x0C, 0x13, 0x4C, 0x20,
+    0x58, 0x19, 0xDE, 0x2F, 0x8C, 0xF1, 0x63, 0x48, 0x8C, 0x3A, 0xE9, 0xF8, 0x81, 0x75, 0x0D, 0x10,
+    0x1E, 0x74, 0xA5, 0x7E, 0xF7, 0xC3, 0x11, 0xFB, 0x20, 0xF0, 0xF9, 0x72, 0x7B, 0x8B, 0xF4, 0x3C,
+    0xCC, 0x54, 0x5F, 0xA6, 0xEF, 0xA8, 0x03, 0xB3, 0x7E, 0x72, 0xEB, 0xA0, 0x93, 0x67, 0xAC, 0x38,
+    0x9F, 0xD6, 0xEF, 0x16, 0x1D, 0x33, 0x4B, 0xC5, 0x80, 0x60, 0x70, 0xF1, 0xF8, 0x10, 0x91, 0x2D,
+    0xA7, 0x04, 0xDD, 0x0A, 0xEB, 0xEC, 0x2F, 0xA3, 0xB9, 0x4B, 0x79, 0x96, 0x3C, 0xA4, 0xE8, 0x47,
+    0xA5, 0xDA, 0xE2, 0x65, 0x94, 0xEA, 0xAA, 0x32, 0x78, 0xBD, 0x6F, 0xA2, 0x78, 0x7D, 0x15, 0x7D,
+    0xC3, 0xE8, 0x28, 0x91, 0xE4, 0x3C, 0x91, 0x3C, 0xC1, 0x42, 0xEA, 0x0A, 0x51, 0x3E, 0x40, 0x4B,
+    0xAF, 0xB5, 0xBF, 0x56, 0x42, 0xDE, 0x98, 0xE5, 0xC5, 0xB7, 0xF5, 0x14, 0x22, 0xDB, 0xA6, 0xA4,
+    0x7E, 0x88, 0xEA, 0xD1, 0x2F, 0x57, 0xD0, 0x3D, 0x17, 0x41, 0x7D, 0xD8, 0x4C, 0x3D, 0x49, 0xC4,
+    0xF3, 0x0D, 0xC4, 0x80, 0xBE, 0x6C, 0x1A, 0x26, 0xEB, 0xBF, 0xF6, 0x95, 0xE7, 0x9A, 0x44, 0x41,
+    0x90, 0x1F, 0xD1, 0x70, 0x7B, 0x65, 0xA1, 0x0F, 0xA3, 0xAA, 0xB5, 0xF1, 0xC0, 0x3D, 0x31, 0x92,
+    0xA7, 0x2F, 0xB4, 0x72, 0xAB, 0x7A, 0x61, 0xB5, 0x37, 0xBF, 0xC2, 0xE5, 0x41, 0xBA, 0x75, 0x5D,
+    0xB3, 0x59, 0xFA, 0x96, 0x04, 0x59, 0x2B, 0x96, 0x10, 0x79, 0x66, 0x76, 0xF7, 0x71, 0xCB, 0x37,
+    0xF7, 0x60, 0x19, 0x59, 0x21, 0x5F, 0xEE, 0x8B, 0x2D, 0x91, 0x3D, 0xEB, 0x57, 0x65, 0xB4, 0x09,
+    0x09, 0x38, 0xEB, 0x70, 0x96, 0x43, 0x87, 0x80, 0x07, 0x9F, 0x0B, 0x09, 0x03, 0xF8, 0x5F, 0xF4,
+    0x5A, 0x53, 0x60, 0x86, 0x48, 0x8A, 0xB3, 0xB6, 0x34, 0xE0, 0xFC, 0xE5, 0x95, 0x12, 0xE7, 0x7C,
+    0xE9, 0x14, 0x56, 0x2D, 0x8D, 0x9C, 0xA8, 0x6F, 0x2F, 0x65, 0x29, 0xBC, 0xC2, 0xEB, 0xA8, 0xD2,
+    0xA9, 0xD3, 0x3E, 0x7E, 0xED, 0x28, 0x9C, 0xFD, 0x15, 0x5D, 0x64, 0x21, 0x30, 0xAB, 0xD3, 0x0C,
+    0x0D, 0x63, 0x5B, 0xC5, 0xBE, 0x03, 0xB1, 0x03, 0x7E, 0x7E, 0xE5, 0xCC, 0x0C, 0x1C, 0xB8, 0x74,
+    0x57, 0x58, 0x0E, 0xA1, 0xBE, 0xA7, 0x90, 0x3B, 0x9B, 0x98, 0xB2, 0xC0, 0xF3, 0x97, 0x41, 0xBD,
+    0x1F, 0xD7, 0x31, 0x42, 0xB6, 0xFF, 0x6D, 0x4B, 0xEC, 0x4D, 0x98, 0x15, 0x71, 0x46, 0x4C, 0x14,
+    0x7B, 0x59, 0xE2, 0x88, 0xE4, 0x4E, 0xF2, 0x74, 0x6F, 0x64, 0x4A, 0xEE, 0x46, 0x46, 0x4F, 0xC6,
+    0xF5, 0x3C, 0x12, 0xC8, 0xBE, 0x8C, 0x55, 0x19, 0xC5, 0xC0, 0x9F, 0x31, 0xC4, 0xDA, 0xCB, 0x3C,
+    0xF3, 0xC6, 0x42, 0xBC, 0x3B, 0x96, 0x62, 0xB9, 0x77, 0x54, 0x41, 0xE6, 0x74, 0x82, 0xBA, 0xCB,
+    0x32, 0x7A, 0x8D, 0x05, 0xBF, 0x3C, 0x4A, 0x97, 0x2A, 0xF7, 0xEC, 0xCF, 0xA0, 0x3E, 0x5A, 0xDC,
+    0x41, 0x23, 0xB0, 0xB8, 0x56, 0x55, 0xD8, 0xC2, 0xA7, 0x3F, 0x32, 0x37, 0xD3, 0x6F, 0x01, 0xA2,
+    0x0E, 0x26, 0xD7, 0xB5, 0xA0, 0xA5, 0x34, 0x22, 0x47, 0xFD, 0xD1, 0x52, 0xF3, 0xE1, 0xE0, 0xAB,
+    0xF9, 0xD0, 0x8E, 0x7C, 0x42, 0x1D, 0x11, 0xEA, 0xA4, 0xCE, 0x38, 0x68, 0xDE, 0xBC, 0xBA, 0x6A,
+    0x50, 0x91, 0x54, 0x86, 0x0E, 0x98, 0xAA, 0x2C, 0x57, 0x5C, 0x2A, 0x70, 0x57, 0x58, 0x6A, 0xD1,
+    0x9C, 0xB9, 0xEB, 0x5E, 0xD2, 0x35, 0xD9, 0xC5, 0x2A, 0x6B, 0x0C, 0x60, 0x39, 0xE4, 0x4C, 0xCD,
+    0xF0, 0xFB, 0xF7, 0x52, 0x86, 0x48, 0xCF, 0x27, 0xB4, 0x9A, 0xC7, 0x20, 0xB2, 0xDD, 0x5E, 0x7D,
+    0x4F, 0x2B, 0xC5, 0x96, 0xC5, 0xAE, 0x65, 0x26, 0xD9, 0x18, 0xC6, 0xBE, 0x59, 0xFF, 0x85, 0x51,
+    0x6D, 0xE6, 0x4E, 0xED, 0x25, 0x7D, 0x8D, 0x86, 0xDD, 0xB9, 0x06, 0x7A, 0x76, 0x66, 0x68, 0x42,
+    0x13, 0x6F, 0xC8, 0x7D, 0xF8, 0x9E, 0x9B, 0x51, 0xFD, 0xEE, 0x2F, 0xF5, 0x19, 0x5E, 0x14, 0x4E,
+    0xFB, 0x69, 0x68, 0xE6, 0x9D, 0xB7, 0xD5, 0x31, 0xBB, 0xB4, 0x96, 0x4F, 0x25, 0x86, 0x25, 0xDA,
+    0x98, 0xC7, 0x3A, 0xD6, 0x10, 0xD0, 0xD4, 0x52, 0x5C, 0x5E, 0x4E, 0xFD, 0xE5, 0x04, 0x6E, 0x37,
+    0xDE, 0x84, 0x55, 0x6A, 0xB4, 0xAA, 0xC3, 0x50, 0xCB, 0x36, 0x3D, 0x0F, 0x68, 0x26, 0x2D, 0xA0,
+    0xBB, 0xC3, 0x58, 0x85, 0x37, 0xC3, 0xD5, 0xC2, 0x13, 0x17, 0x15, 0x59, 0x77, 0x4D, 0xEE, 0x44,
+    0xC2, 0x1E, 0x37, 0x10, 0x44, 0xC3, 0xCD, 0xB5, 0x9C, 0xD7, 0xE2, 0x82, 0xA9, 0x77, 0x83, 0x83,
+    0xCC, 0xB8, 0xC1, 0xB0, 0xD5, 0x2D, 0xE2, 0xC2, 0x0D, 0x1A, 0x40, 0xCE, 0xBF, 0x57, 0x33, 0x19,
+    0xFF, 0xB7, 0x9C, 0xC2, 0xAF, 0x3B, 0x7A, 0x51, 0x16, 0x0B, 0x6C, 0xB1, 0x89, 0x49, 0x7D, 0x11,
+    0x78, 0x79, 0x99, 0xAF, 0x68, 0xB9, 0xB7, 0xA8, 0xC2, 0x8C, 0xD4, 0x54, 0x2A, 0xCB, 0xC1, 0xFA,
+    0xBA, 0x23, 0x18, 0x44, 0xFB, 0xF4, 0x0D, 0xA9, 0xBD, 0x93, 0x33, 0x55, 0x85, 0xC6, 0xD9, 0xE9,
+    0xCA, 0x48, 0x4C, 0xBF, 0xA8, 0xA2, 0x19, 0x9C, 0x38, 0xFD, 0x3E, 0xA6, 0x83, 0x9A, 0xFC, 0x94,
+    0xF7, 0xF7, 0xCC, 0xD5, 0x61, 0xED, 0x3C, 0x02, 0x8B, 0xF4, 0x4E, 0xAF, 0x8A, 0x34, 0xEA, 0x30,
+    0x4F, 0x65, 0x1A, 0x79, 0x8B, 0x64, 0xAB, 0x9D, 0x3C, 0x90, 0x6B, 0x1D, 0x17, 0x9A, 0x05, 0x9D,
+    0x11, 0xF6, 0xC1, 0x45, 0x86, 0x87, 0xC0, 0x79, 0xAB, 0x5D, 0x9B, 0x1F, 0xAA, 0x80, 0x7F, 0x7C,
+    0x4C, 0xAD, 0x26, 0x47, 0x9B, 0xB8, 0x59, 0x79, 0x18, 0x61, 0xC7, 0x29, 0x28, 0xCA, 0xB5, 0xC4,
+    0x5E, 0x18, 0xA4, 0x02, 0x91, 0x9C, 0xBB, 0x63, 0xBB, 0xBA, 0xCE, 0xBC, 0xC4, 0xB8, 0x65, 0xDA,
+    0xC4, 0x33, 0xB2, 0x44, 0xDC, 0x26, 0xB9, 0x91, 0x34, 0xA4, 0x69, 0x03, 0x4B, 0x55, 0x12, 0xAB,
+    0x5E, 0x20, 0x49, 0xFB, 0x3F, 0xA4, 0x68, 0x23, 0x0F, 0xDF, 0xB6, 0xA1, 0x56, 0x98, 0xDD, 0x8B,
+    0xE7, 0x33, 0xFD, 0x5C, 0x80, 0x69, 0x6E, 0x2E, 0x81, 0xD4, 0x4A, 0x8F, 0x1A, 0xD2, 0x88, 0x8C,
+    0x1A, 0xB7, 0x41, 0xB4, 0x93, 0x82, 0x4B, 0xC9, 0xED, 0xF0, 0xC7, 0x2F, 0x4B, 0xA4, 0xB3, 0xD5,
+    0x70, 0x47, 0x3A, 0x6F, 0xBD, 0x45, 0x85, 0x4D, 0x91, 0xDA, 0x28, 0x83, 0x6C, 0xDF, 0x24, 0xD5,
+    0xFC, 0x4A, 0xE2, 0xFD, 0xD5, 0xC2, 0x5F, 0xC3, 0x69, 0xF4, 0x2A, 0x19, 0xD2, 0x2B, 0x13, 0xC3,
+    0x57, 0x0D, 0x29, 0xD6, 0x6D, 0xB1, 0x1B, 0xA8, 0x38, 0x72, 0xBC, 0x09, 0x4E, 0x6B, 0x22, 0xF0,
+    0x89, 0x6C, 0x19, 0x7A, 0x61, 0x0C, 0xC8, 0xE5, 0xCD, 0x7A, 0xA8, 0x44, 0x15, 0xCF, 0x9A, 0x43,
+    0xA7, 0xF4, 0x75, 0x0B, 0xD1, 0x60, 0x57, 0xF6, 0xF9, 0xE5, 0x18, 0xE8, 0x80, 0xCE, 0x07, 0x17,
+    0x17, 0x25, 0x1E, 0xA1, 0x15, 0x8C, 0x77, 0x14, 0x4F, 0x4C, 0xA0, 0x22, 0x85, 0x13, 0x5F, 0x54,
+    0x28, 0x98, 0x23, 0x5A, 0x95, 0xC1, 0xFB, 0x1F, 0x69, 0x4D, 0xD3, 0x4C, 0x48, 0xAC, 0xD1, 0xF1,
+    0xC6, 0x24, 0xFE, 0x02, 0x15, 0xFE, 0x00, 0x22, 0x14, 0x4A, 0x67, 0x5E, 0xD3, 0xE4, 0x36, 0x6B,
+    0x04, 0xCA, 0x98, 0xDA, 0x97, 0x9E, 0x52, 0x9E, 0xE5, 0x94, 0xAA, 0x87, 0xEE, 0xCB, 0x08, 0xC8,
+    0xA7, 0x24, 0x46, 0xF2, 0x23, 0x62, 0xD1, 0x9C, 0xA7, 0x7F, 0xCC, 0x93, 0xC1, 0x58, 0xFF, 0xA8,
+    0x17, 0xAF, 0x56, 0x28, 0x1D, 0x9F, 0xFB, 0x28, 0x95, 0xBE, 0x48, 0x30, 0xBB, 0xD4, 0x0B, 0x3F,
+    0xF3, 0x53, 0x34, 0xFC, 0x50, 0x5F, 0x90, 0x89, 0x28, 0xFE, 0x4C, 0x7E, 0x08, 0xF9, 0x0C, 0x53,
+    0xD8, 0x16, 0xF7, 0x44, 0x88, 0x17, 0xFD, 0xFD, 0x21, 0x0D, 0x52, 0xBF, 0xD8, 0x74, 0xD8, 0xCF,
+    0x7E, 0xB8, 0x70, 0x8B, 0xA9, 0xBB, 0x5A, 0xC9, 0x75, 0xF2, 0xC0, 0xD3, 0xC5, 0xE0, 0x61, 0x7B,
+    0xEF, 0xA5, 0x51, 0x70, 0x37, 0xA1, 0xB8, 0x09, 0xAC, 0xF0, 0xF7, 0x43, 0xD5, 0xE8, 0xB5, 0x7C,
+    0xE5, 0xE7, 0x97, 0xC8, 0x20, 0x88, 0x53, 0xA3, 0x8F, 0x2F, 0x6B, 0xB4, 0xD2, 0xF9, 0x88, 0xDE,
+    0x15, 0xE3, 0x88, 0xA6, 0x94, 0xC3, 0x51, 0xCE, 0xFF, 0x2F, 0xF5, 0x59, 0xB8, 0xB4, 0x49, 0x6A,
+    0xAE, 0x6E, 0x8B, 0x63, 0x7B, 0x08, 0xB0, 0xD7, 0x00, 0x3A, 0xF6, 0xBF, 0x55, 0x63, 0xB1, 0x09,
+    0x24, 0x14, 0x39, 0x56, 0x62, 0x18, 0x33, 0x64, 0x64, 0xEF, 0xAA, 0xA8, 0xC9, 0x38, 0x2A, 0xA2,
+    0x70, 0x4A, 0x61, 0x66, 0x6F, 0xD7, 0x73, 0xF7, 0xF0, 0x8B, 0x34, 0xC4, 0x92, 0xD1, 0x63, 0xFC,
+    0x05, 0xC6, 0xD4, 0xE4, 0x9B, 0x8F, 0x4E, 0x2A, 0x58, 0x2A, 0xA7, 0x7C, 0x47, 0x34, 0x01, 0xF3,
+    0x5D, 0x0F, 0x99, 0xF3, 0x21, 0x86, 0xB7, 0x52, 0x8F, 0x06, 0x60, 0x1D, 0xC6, 0xBB, 0xC4, 0x5A,
+    0x8F, 0x9B, 0x5E, 0x43, 0x4A, 0xA4, 0x2C, 0x1A, 0xAD, 0xB8, 0x74, 0x79, 0x2C, 0x2D, 0x3A, 0x31,
+    0x21, 0x7F, 0x63, 0x91, 0x0C, 0xED, 0xFF, 0x33, 0xF4, 0x2D, 0x19, 0xB6, 0x83, 0xD3, 0x33, 0x7B,
+    0xE7, 0x9C, 0xF1, 0x8E, 0xAF, 0x57, 0x91, 0x81, 0x3A, 0x86, 0x1D, 0xA8, 0xC4, 0x58, 0x78, 0xA8,
+    0xE8, 0x34, 0xB9, 0xE6, 0x57, 0x89, 0x4E, 0xD3, 0x72, 0xD3, 0xD2, 0x09, 0x8C, 0xF1, 0x5B, 0xFB,
+    0x64, 0xDB, 0xA5, 0x32, 0x17, 0x99, 0x65, 0x08, 0x31, 0xAD, 0x89, 0x64, 0x60, 0x60, 0xB8, 0xFE,
+    0x77, 0xE5, 0x33, 0x80, 0xF8, 0x41, 0x75, 0xF0, 0xAE, 0x04, 0xB3, 0x49, 0x6C, 0x24, 0x33, 0xC8,
+    0x7A, 0x09, 0x43, 0x6D, 0x0F, 0x88, 0xE6, 0xCD, 0x35, 0xA8, 0xF2, 0xBD, 0xEA, 0x39, 0xA6, 0x46,
+    0xB5, 0x21, 0xD4, 0xC0, 0xF5, 0x91, 0xDD, 0x9C, 0x58, 0x68, 0x04, 0x99, 0x58, 0x1C, 0xC2, 0x03,
+    0xED, 0x1D, 0xCA, 0x93, 0xBA, 0x18, 0x1D, 0xDD, 0xB4, 0xBB, 0xE2, 0x1E, 0x38, 0x59, 0x04, 0x5E,
+    0x8E, 0xFF, 0x80, 0xEC, 0xBB, 0x57, 0xE4, 0xA8, 0x9F, 0x4D, 0xC3, 0xE5, 0x15, 0x71, 0x57, 0xDD,
+    0x02, 0xB2, 0x67, 0x50, 0xD2, 0xDB, 0x95, 0xFF, 0x03, 0x2C, 0xDE, 0xE3, 0x78, 0x4F, 0xFE, 0xA9,
+    0xAC, 0xE7, 0xE9, 0xC9, 0xA6, 0xB0, 0xCF, 0x98, 0x5E, 0xF7, 0xD7, 0x2C, 0x92, 0x78, 0x44, 0xB9,
+    0xA0, 0x1A, 0xA4, 0x17, 0xA3, 0x50, 0x5E, 0x7E, 0x1A, 0x9F, 0x18, 0x3C, 0x53, 0x8A, 0xFC, 0x9C,
+    0xF1, 0x58, 0x5D, 0xA3, 0xD5, 0x18, 0x6C, 0xC7, 0x55, 0x2F, 0x46, 0x5D, 0xFB, 0x33, 0x75, 0x50,
+    0x0A, 0x28, 0x37, 0x99, 0xBD, 0x06, 0xAD, 0x14, 0x84, 0xB5, 0x9D, 0xDF, 0x04, 0x3F, 0x33, 0x28,
+    0x1F, 0xD8, 0x57, 0xB7, 0x6A, 0x90, 0x18, 0xC7, 0xA6, 0x1B, 0x56, 0xD1, 0xBF, 0x22, 0x4E, 0x33,
+    0x6A, 0x7F, 0x94, 0xB8, 0xA6, 0x0C, 0xA0, 0xE0, 0x7C, 0xD1, 0xEE, 0xDA, 0xFF, 0xE0, 0x9B, 0x41,
+    0x75, 0xD7, 0xCA, 0x96, 0x01, 0xA9, 0xAA, 0xAD, 0x75, 0x54, 0xBA, 0x86, 0x14, 0xF1, 0x84, 0x66,
+    0xC3, 0xC8, 0x66, 0x71, 0x63, 0x0D, 0x4A, 0x2C, 0x85, 0x4E, 0xD7, 0x6F, 0x9A, 0x59, 0x51, 0x8A,
+    0xB6, 0xAF, 0xF5, 0x5F, 0x18, 0xA2, 0x49, 0xD0, 0x34, 0xD4, 0x51, 0xF9, 0x8D, 0xA3, 0x91, 0x59,
+    0x7C, 0x87, 0x9D, 0x31, 0x14, 0xE0, 0xF0, 0x08, 0x95, 0x2C, 0x61, 0xCC, 0x53, 0xE2, 0x15, 0x9D,
+    0xEE, 0xA1, 0xC2, 0xDE, 0x2B, 0x53, 0xB6, 0x21, 0x88, 0xE0, 0x5B, 0x77, 0x1F, 0x50, 0xEF, 0xFA,
+    0xAA, 0x48, 0xCF, 0x97, 0x40, 0x3B, 0xC1, 0x82, 0x34, 0x6D, 0xAB, 0xB4, 0xAD, 0x5A, 0xE3, 0x99,
+    0x78, 0xB6, 0xBD, 0x16, 0x34, 0x32, 0xC9, 0xA2, 0xC2, 0xA1, 0xAB, 0xB3, 0xFA, 0xA6, 0x62, 0x7D,
+    0xB5, 0xF7, 0x89, 0xAD, 0x9A, 0xA9, 0x7E, 0x1C, 0x7F, 0x9C, 0x64, 0x30, 0x47, 0x9B, 0x6E, 0x48,
+    0x62, 0x2C, 0xDE, 0x9A, 0xAF, 0x2A, 0xE2, 0xF1, 0x7B, 0xEA, 0xA2, 0xAA, 0x75, 0x3C, 0xB5, 0xB2,
+    0xC5, 0x2F, 0x0F, 0x50, 0x36, 0x15, 0x12, 0x71, 0x48, 0x2A, 0xD2, 0x73, 0x02, 0xB3, 0xA8, 0xBE,
+    0x24, 0x18, 0x79, 0xB0, 0xE0, 0x06, 0x07, 0x13, 0xE5, 0xF6, 0x32, 0x96, 0x9C, 0x88, 0x6B, 0xF0,
+    0xFB, 0xA9, 0x04, 0x52, 0x18, 0x41, 0x91, 0x5D, 0x4C, 0xDC, 0x96, 0x35, 0x45, 0x85, 0x1D, 0x1C,
+    0xDF, 0x28, 0xCA, 0x07, 0xC5, 0x27, 0x47, 0xF7, 0x30, 0x6D, 0xDF, 0x28, 0x12, 0xCA, 0x28, 0x31,
+    0x71, 0x77, 0xCC, 0x35, 0x0A, 0x2E, 0x81, 0xEE, 0xD2, 0x6F, 0x01, 0x95, 0x5A, 0x97, 0x44, 0xCA,
+    0x18, 0x69, 0xD9, 0xA0, 0xC8, 0x88, 0xF3, 0x2B, 0x7A, 0x7F, 0xFD, 0x5F, 0xA6, 0x42, 0x3D, 0x1A,
+    0x36, 0x78, 0x4D, 0x1B, 0x56, 0x8F, 0x3A, 0xCB, 0x65, 0x77, 0x9E, 0x78, 0x03, 0xDE, 0xA9, 0xE6,
+    0x0D, 0x06, 0xF6, 0x43, 0xC6, 0x94, 0xCB, 0x37, 0xEA, 0xC1, 0x97, 0x01, 0x69, 0x41, 0x6D, 0x55,
+    0x7C, 0xC8, 0x9C, 0xD1, 0x4A, 0x66, 0x9E, 0x90, 0x03, 0xCA, 0x29, 0x53, 0x68, 0x0F, 0x69, 0x6C,
+    0x7D, 0xEB, 0xAD, 0xD9, 0x1A, 0xA4, 0x46, 0xB4, 0x92, 0x9C, 0x42, 0x0E, 0x9F, 0x81, 0x29, 0xA2,
+    0xDF, 0xB0, 0x2C, 0x4C, 0x32, 0xA2, 0x57, 0x25, 0x01, 0xB1, 0x9C, 0x12, 0x53, 0xC7, 0xF0, 0x0A,
+    0x60, 0xA6, 0x51, 0xC9, 0x8F, 0xB4, 0x52, 0x20, 0x8A, 0x61, 0x17, 0x76, 0xA3, 0x85, 0xB9, 0x51,
+    0x02, 0x0A, 0x2D, 0x81, 0x07, 0x90, 0x56, 0x96, 0xA7, 0xF9, 0x5A, 0x36, 0x6E, 0x2A, 0xA8, 0x7E,
+    0xC1, 0xD8, 0x23, 0x0E, 0x81, 0xBA, 0x85, 0xDD, 0x60, 0x61, 0x28, 0xEF, 0x93, 0x4E, 0x12, 0x9B,
+    0x1A, 0x0B, 0xC7, 0xEB, 0x7C, 0xE0, 0xEF, 0x24, 0xA1, 0x0A, 0x7D, 0x98, 0xB8, 0x55, 0xF9, 0x88,
+    0x42, 0xA2, 0x69, 0xC5, 0x8C, 0x24, 0xE1, 0xA1, 0xA4, 0xDE, 0x34, 0x6E, 0x08, 0xFD, 0x1F, 0x25,
+    0x0C, 0x94, 0xEF, 0x08, 0x62, 0x63, 0x75, 0x08, 0x3E, 0x71, 0xAF, 0xA6, 0xFA, 0x5D, 0x8E, 0xA8,
+    0x37, 0x00, 0xB7, 0xDF, 0x4A, 0x4D, 0x6E, 0x92, 0x0A, 0x45, 0x02, 0xF8, 0xF0, 0x08, 0x77, 0x38,
+    0x0C, 0x2B, 0xAE, 0x15, 0xF8, 0x40, 0x6C, 0x40, 0xCC, 0x08, 0x76, 0xB4, 0xD5, 0x92, 0x59, 0x49,
+    0xA0, 0x98, 0xEC, 0x65, 0xCE, 0xCC, 0xAF, 0x8B, 0xC4, 0xA9, 0xE8, 0x2B, 0x23, 0x90, 0xC0, 0x19,
+    0x12, 0x15, 0x23, 0xCE, 0xD4, 0x80, 0x22, 0x82, 0x30, 0x6A, 0x50, 0xFA, 0x6D, 0x3A, 0xBD, 0x4B,
+    0xE1, 0x5B, 0x1A, 0x07, 0x88, 0x4E, 0xD0, 0x42, 0xA6, 0xFD, 0x5E, 0x3C, 0x7F, 0x53, 0x20, 0xDD,
+    0x9C, 0x46, 0xEA, 0xE8, 0x8D, 0x6F, 0x17, 0x57, 0x41, 0x59, 0xEA, 0x27, 0xC7, 0x70, 0xFB, 0x12,
+    0x2D, 0x6C, 0xF7, 0xEF, 0xA7, 0x6A, 0x5C, 0x15, 0x09, 0xE3, 0x63, 0xF1, 0x5B, 0xB8, 0xE4, 0x69,
+    0x92, 0x7C, 0x13, 0x90, 0xBB, 0xA3, 0xE8, 0xF0, 0xC9, 0xF3, 0xD5, 0x27, 0xB7, 0xC4, 0x2B, 0xEB,
+    0x66, 0x19, 0x36, 0x9B, 0x88, 0x88, 0xFD, 0xBA, 0x0F, 0x2E, 0x66, 0x98, 0x94, 0x3C, 0x6F, 0x09,
+    0x0B, 0x89, 0x35, 0x3A, 0x8A, 0x8A, 0x7B, 0xA5, 0x1F, 0x9B, 0x9D, 0x53, 0x67, 0xEE, 0xBC, 0x8C,
+    0x63, 0x83, 0x11, 0x31, 0x87, 0x24, 0x36, 0xBA, 0x7F, 0xC5, 0xA2, 0x06, 0x33, 0x10, 0x79, 0xEC,
+    0x01, 0x89, 0x48, 0x96, 0x2A, 0xC9, 0x25, 0x0F, 0xF3, 0x92, 0x1E, 0x52, 0x93, 0xCD, 0x65, 0x71,
+    0x2B, 0x98, 0xE7, 0xC8, 0x29, 0xA3, 0x21, 0x43, 0xF0, 0x37, 0x3C, 0x36, 0x8E, 0x7F, 0xDC, 0x95,
+    0xA1, 0x56, 0xA1, 0x20, 0xA1, 0xBC, 0x5C, 0x30, 0xDE, 0x52, 0x54, 0xC8, 0x73, 0xCE, 0xA6, 0x30,
+    0x44, 0x0F, 0x3F, 0xA0, 0x7B, 0x7E, 0x11, 0x66, 0x2E, 0xD6, 0xD8, 0x85, 0x5B, 0x56, 0xC1, 0xD3,
+    0xEE, 0xF1, 0x7E, 0xBA, 0x08, 0xF1, 0xA4, 0x49, 0xB3, 0x0C, 0x41, 0xA3, 0xFC, 0xAF, 0xA6, 0x9E,
+    0x90, 0x25, 0x44, 0xC2, 0x36, 0x64, 0x74, 0x38, 0xC9, 0xBC, 0xA5, 0xE8, 0x36, 0x2E, 0x84, 0xCD,
+    0xEA, 0x22, 0x8A, 0x09, 0x94, 0xB2, 0x38, 0x67, 0xC3, 0xBD, 0x7C, 0x79, 0x12, 0x3D, 0xE2, 0xA0,
+    0x0A, 0x1F, 0xCE, 0xE7, 0x1D, 0x7A, 0xB5, 0x2B, 0x4E, 0x62, 0x82, 0x37, 0xEC, 0xFB, 0x7B, 0x05,
+    0xAC, 0xE5, 0x10, 0x60, 0x8B, 0x09, 0x7D, 0xC8, 0x16, 0xE0, 0xFA, 0x78, 0x35, 0x13, 0xF6, 0x8D,
+    0xB0, 0x39, 0x5F, 0xC8, 0xF4, 0x08, 0xCF, 0x0D, 0xA9, 0xA1, 0xC6, 0xE0, 0xDC, 0x0A, 0x4D, 0x54,
+    0x6C, 0x47, 0x16, 0xFD, 0x61, 0x08, 0xD3, 0x90, 0xC3, 0x4A, 0xD2, 0xE0, 0x7E, 0xE9, 0xB1, 0x62,
+    0xBD, 0x15, 0x61, 0xB8, 0x6A, 0xF2, 0x76, 0x66, 0xBB, 0x5C, 0xB6, 0x87, 0x40, 0x8B, 0xFF, 0x90,
+    0x1F, 0xB7, 0x63, 0xF3, 0x73, 0xF4, 0xE9, 0xEB, 0x96, 0xA9, 0x73, 0xA5, 0xF5, 0x94, 0x5E, 0x16,
+    0x9B, 0xB1, 0x9F, 0x2F, 0x6B, 0x9D, 0x13, 0x6F, 0x01, 0xD6, 0xB6, 0x74, 0xA7, 0x86, 0x19, 0x82,
+    0x6F, 0x50, 0x1A, 0x44, 0x5D, 0x47, 0xC5, 0xC5, 0x66, 0xEF, 0x24, 0xE3, 0xA8, 0x16, 0xD3, 0xEB,
+    0x2B, 0x06, 0x54, 0xDB, 0x9B, 0x1F, 0xFE, 0x8D, 0x03, 0x1C, 0x63, 0x4C, 0xFA, 0x7E, 0xB8, 0x5A,
+    0xA3, 0x50, 0x2D, 0xE1, 0x04, 0xE1, 0x15, 0x31, 0xF7, 0xB3, 0x23, 0xD7, 0x0E, 0x78, 0x42, 0x4D,
+    0x28, 0x1F, 0xF2, 0x9D, 0xFC, 0x4A, 0xEC, 0xA1, 0xF2, 0x6E, 0x40, 0xA2, 0xD9, 0xEC, 0x67, 0xDB,
+    0x81, 0x7C, 0xEA, 0x72, 0x38, 0xAF, 0xA2, 0x06, 0xCC, 0xAB, 0x22, 0xFA, 0x5C, 0xF9, 0xB7, 0x9D,
+    0xE5, 0x35, 0x11, 0xE8, 0xB3, 0x01, 0xFB, 0xEF, 0xE8, 0xE4, 0x08, 0x36, 0xDB, 0xB3, 0x83, 0x8D,
+    0xD0, 0xA9, 0xFD, 0xFB, 0x8A, 0x28, 0x60, 0xD3, 0xDC, 0x72, 0x52, 0x40, 0x97, 0x53, 0xBB, 0xA2,
+    0xAF, 0x6F, 0x04, 0x2B, 0xBE, 0x8E, 0x16, 0x2D, 0x0E, 0x7C, 0x2A, 0xEB, 0xC1, 0xC8, 0x6E, 0x96,
+    0x29, 0x1F, 0x64, 0x26, 0xFF, 0x89, 0xF3, 0x2D, 0xF2, 0x26, 0xF0, 0x74, 0x0F, 0x4D, 0x7F, 0x2F,
+    0x61, 0x3C, 0xE9, 0x03, 0x43, 0x82, 0x24, 0x2F, 0x80, 0x42, 0x5D, 0xBE, 0xFA, 0x13, 0x06, 0x0F,
+    0xA8, 0x82, 0x44, 0x04, 0x97, 0xC4, 0x21, 0x21, 0x4C, 0x4D, 0xB4, 0x37, 0xB3, 0x5D, 0xD8, 0xF7,
+    0xDB, 0xC3, 0xC6, 0x21, 0x98, 0xF3, 0x11, 0x7A, 0x8D, 0xD9, 0xE3, 0xD9, 0x7F, 0xF6, 0xED, 0x44,
+    0xCC, 0xCB, 0x2A, 0x2D, 0x22, 0x3C, 0x23, 0x64, 0x25, 0xA0, 0xCC, 0xDE, 0x99, 0x01, 0xE8, 0xCB,
+    0xB4, 0xE6, 0x4D, 0xEB, 0x57, 0xEC, 0xDA, 0xB3, 0x9A, 0x7E, 0xF5, 0xCC, 0x9B, 0x9D, 0x3A, 0xC8,
+    0xD4, 0xA9, 0x39, 0x7D, 0x6A, 0x63, 0xC7, 0x48, 0xFF, 0x8E, 0x36, 0x81, 0x8C, 0x2B, 0x8F, 0x1E,
+    0x52, 0x42, 0xEE, 0x1C, 0xBB, 0xB9, 0xE9, 0xC5, 0xB9, 0x27, 0x47, 0xA7, 0x92, 0x39, 0x01, 0x3E,
+    0x35, 0xA9, 0x6C, 0x47, 0x55, 0x46, 0x07, 0x28, 0x82, 0x5C, 0x0A, 0xC7, 0x07, 0x6A, 0xE0, 0x57,
+    0x9F, 0x3C, 0x08, 0xDA, 0xA2, 0x5E, 0xE8, 0xA1, 0xBC, 0xB2, 0x4F, 0xD1, 0xB0, 0x2E, 0x71, 0xC2,
+    0xAC, 0xA4, 0xF1, 0x8B, 0xE1, 0xF8, 0x30, 0xD6, 0x48, 0xBC, 0x79, 0x74, 0xF6, 0xC3, 0x3F, 0x83,
+    0x75, 0xC4, 0xC5, 0x20, 0xED, 0x01, 0xB6, 0xA9, 0x3B, 0x22, 0xC0, 0x1F, 0xC2, 0x49, 0xF0, 0xA9,
+    0x5F, 0x53, 0x6D, 0x6D, 0xB8, 0xE1, 0x6D, 0x9E, 0xE8, 0xD5, 0x45, 0x34, 0x69, 0x87, 0xF8, 0x42,
+    0x78, 0x1A, 0xD0, 0x07, 0x6A, 0xC6, 0x9E, 0x56, 0xEB, 0xA6, 0xF6, 0x71, 0x88, 0x80, 0x3A, 0xDD,
+    0xDC, 0xC4, 0x8E, 0xA3, 0x74, 0x6D, 0x10, 0xBA, 0x26, 0x98, 0xE1, 0x68, 0x49, 0x6A, 0x86, 0x0F,
+    0x62, 0xA5, 0x75, 0x83, 0xD9, 0x5A, 0xD6, 0x34, 0x81, 0x65, 0x17, 0xA9, 0xD2, 0xF0, 0x35, 0x35,
+    0x27, 0x9D, 0x81, 0x72, 0xAE, 0xA4, 0xC0, 0xFE, 0x09, 0x95, 0xFA, 0x3D, 0x78, 0xEA, 0x3D, 0xA5,
+    0xA9, 0xB6, 0x4B, 0x91, 0xBA, 0x31, 0x44, 0xCD, 0xD6, 0x94, 0x7A, 0x38, 0x40, 0x75, 0xD6, 0x4C,
+    0x6F, 0x30, 0x8A, 0x8E, 0xF6, 0x75, 0x50, 0x70, 0x17, 0x28, 0xED, 0x0B, 0xDF, 0xEB, 0x8B, 0x94,
+    0x05, 0x9B, 0x85, 0x7A, 0xAA, 0xE7, 0x76, 0xE4, 0x5D, 0x9D, 0x2A, 0x02, 0x9A, 0x96, 0x70, 0xA4,
+    0xC5, 0x4D, 0x90, 0x18, 0x5D, 0x31, 0x2E, 0x49, 0xFF, 0xA9, 0xBE, 0x9D, 0x9E, 0x7F, 0x6E, 0x0A,
+    0x08, 0x04, 0x83, 0x43, 0xA1, 0x5B, 0x44, 0xA4, 0xAC, 0x66, 0xE1, 0x5A, 0xA3, 0x70, 0xED, 0x00,
+    0x84, 0x53, 0x0E, 0x52, 0x22, 0x29, 0x3D, 0x14, 0x9D, 0x9C, 0x1C, 0xBC, 0x0A, 0x19, 0xC0, 0x7B,
+    0xED, 0xBC, 0x4D, 0x15, 0x8B, 0xEC, 0x99, 0xF7, 0x68, 0x76, 0xCD, 0x3C, 0x11, 0x57, 0x28, 0x49,
+    0xF1, 0x0F, 0x7F, 0x74, 0x24, 0x40, 0x05, 0x98, 0xFF, 0xF4, 0xE7, 0xB7, 0x84, 0xDB, 0x55, 0x09,
+    0xD6, 0x0B, 0xE4, 0x5B, 0xF9, 0xFF, 0xB1, 0x2E, 0x25, 0x00, 0x3C, 0x9A, 0xEE, 0x1B, 0x24, 0x07,
+    0x3C, 0xE1, 0xA9, 0xB1, 0x90, 0x44, 0x73, 0x1E, 0xD1, 0xFA, 0x00, 0x35, 0xF5, 0x79, 0xAB, 0xDE,
+    0xB3, 0x5E, 0x62, 0x56, 0x0B, 0xCC, 0xA3, 0x49, 0x67, 0x44, 0x79, 0x85, 0x3A, 0x5D, 0x2B, 0x9D,
+    0xA3, 0x57, 0x44, 0x97, 0x2A, 0x50, 0x34, 0xA9, 0x2F, 0x20, 0xE7, 0x58, 0x49, 0xF9, 0x54, 0x8F,
+    0x9B, 0xE1, 0xCC, 0x44, 0xC2, 0x27, 0xBE, 0x60, 0xDD, 0x6E, 0x4D, 0xFB, 0xA8, 0xB7, 0x5E, 0xFA,
+    0xBF, 0xDE, 0xF2, 0xB2, 0xDE, 0xF9, 0x55, 0x40, 0xD3, 0xB7, 0x63, 0x56, 0x74, 0x2D, 0x12, 0x37,
+    0x2D, 0xD6, 0x7E, 0x84, 0x63, 0x3E, 0xAD, 0x44, 0x69, 0x58, 0x8D, 0xEE, 0x9A, 0xA2, 0xF7, 0xFD,
+    0x90, 0x05, 0xD3, 0x52, 0x2C, 0x53, 0xFF, 0xA0, 0xC3, 0x42, 0xE9, 0x6E, 0x61, 0x68, 0xE9, 0x88,
+    0x39, 0x35, 0xD7, 0xA0, 0x03, 0xDA, 0x49, 0x0E, 0x9C, 0x03, 0xE4, 0x87, 0x95, 0xA5, 0xD9, 0xD6,
+    0x29, 0xA2, 0xFB, 0x63, 0x9E, 0xDE, 0x7C, 0x9E, 0x1E, 0xAF, 0x86, 0xC8, 0xD0, 0x27, 0x5E, 0xE1,
+    0xD3, 0xC6, 0x3A, 0x60, 0xD8, 0x43, 0xD7, 0xDC, 0xFB, 0xC5, 0x72, 0xBF, 0xCF, 0xBD, 0x3A, 0x16,
+    0xEF, 0x79, 0xC6, 0x3E, 0xB4, 0x27, 0x4C, 0x60, 0x2B, 0x4C, 0xAF, 0x44, 0x26, 0x1E, 0xAB, 0xEC,
+    0xB2, 0xCE, 0xD6, 0xD1, 0x71, 0xFE, 0x8A, 0xE2, 0xA5, 0x6C, 0x53, 0x89, 0x84, 0x08, 0x8E, 0x79,
+    0x41, 0xE7, 0xBB, 0x36, 0x8F, 0xFA, 0x81, 0xED, 0x6D, 0x7B, 0x4F, 0x4B, 0x52, 0xC9, 0x03, 0x83,
+    0x65, 0xC4, 0xF3, 0x28, 0xC3, 0x44, 0x25, 0x85, 0x5D, 0x6D, 0x07, 0x38, 0xDE, 0xC3, 0x33, 0x6E,
+    0x09, 0x16, 0x64, 0x3F, 0x2F, 0x8A, 0x22, 0x53, 0xEE, 0xDB, 0x1B, 0xF1, 0x41, 0xD2, 0xE5, 0x26,
+    0xD2, 0xD5, 0x9F, 0x2B, 0x1E, 0x78, 0xFE, 0x81, 0x03, 0x68, 0x79, 0x7C, 0xEB, 0x3E, 0x71, 0xF0,
+    0x64, 0x28, 0xA0, 0x3E, 0x54, 0x44, 0x2B, 0x56, 0x21, 0x11, 0xD6, 0xD7, 0x35, 0xB3, 0xFD, 0xC1,
+    0xE5, 0xE6, 0x10, 0xB3, 0xCC, 0xD5, 0x24, 0x25, 0xE0, 0xF6, 0x1A, 0x0F, 0xF9, 0xD5, 0x34, 0x72,
+    0x26, 0xD1, 0x9F, 0xFA, 0xFA, 0x41, 0x1C, 0x22, 0x97, 0x99, 0x16, 0x41, 0xA8, 0xDC, 0x3B, 0x59,
+    0xC6, 0xB1, 0x9E, 0xB6, 0x10, 0xD1, 0xD3, 0x36, 0xC8, 0x12, 0x73, 0x4D, 0x7D, 0xD0, 0xFE, 0xF5,
+    0x82, 0x0A, 0x4A, 0x20, 0x5C, 0xE1, 0x7F, 0x19, 0xFD, 0x1B, 0x34, 0x14, 0xE1, 0x8A, 0xDB, 0x01,
+    0x9B, 0xF8, 0x68, 0x78, 0x2E, 0x9B, 0x6A, 0x3C, 0xF5, 0x86, 0x67, 0xF7, 0x6D, 0x92, 0xF3, 0xD6,
+    0x00, 0x77, 0x6B, 0x5F, 0x60, 0x16, 0xE6, 0x41, 0xAB, 0xF6, 0x51, 0xC5, 0x0D, 0xF0, 0x96, 0x13,
+    0xBB, 0x14, 0x82, 0x44, 0xD1, 0xCC, 0x86, 0xDE, 0xC1, 0x51, 0x88, 0xE3, 0x72, 0x02, 0x5B, 0x41,
+    0xA2, 0x43, 0x0E, 0xEC, 0x3B, 0xEE, 0xAB, 0xB7, 0xEE, 0xAC, 0xCA, 0x84, 0x71, 0x3F, 0x9F, 0xB7,
+    0x59, 0x4F, 0x7B, 0x2C, 0x76, 0x10, 0xF1, 0xF8, 0xDC, 0x88, 0x8D, 0x03, 0x76, 0x6D, 0x1D, 0x4B,
+    0x98, 0x08, 0x74, 0x1D, 0x2E, 0xD5, 0xFC, 0xF3, 0x68, 0x27, 0xB3, 0xA1, 0x89, 0x26, 0x5E, 0x8D,
+    0x5C, 0xE4, 0x86, 0x9B, 0x10, 0xF0, 0x86, 0xC3, 0xE0, 0x76, 0xFF, 0x8B, 0x8C, 0x39, 0x32, 0x4E,
+    0xF8, 0xF3, 0x86, 0xE6, 0x0C, 0x6A, 0x00, 0xEB, 0x7F, 0xBD, 0xDE, 0x7F, 0x0C, 0x80, 0xBA, 0x8B,
+    0xEA, 0x8D, 0x20, 0xCB, 0x86, 0x81, 0x1B, 0x44, 0x49, 0x65, 0xD1, 0xFA, 0x12, 0xD8, 0x1B, 0xD7,
+    0x6D, 0xA7, 0xF6, 0x53, 0x19, 0x8D, 0x9A, 0x04, 0x34, 0xB2, 0x15, 0xDD, 0xE7, 0x46, 0x75, 0xAA,
+    0x90, 0xEC, 0x41, 0x9C, 0x93, 0xBA, 0xFD, 0xFE, 0x08, 0xFD, 0x86, 0x73, 0x7C, 0x93, 0xB6, 0xD0,
+    0x3E, 0x16, 0x82, 0x05, 0x01, 0xC4, 0xBE, 0x9C, 0x24, 0x05, 0x94, 0x53, 0x25, 0xBD, 0x67, 0x48,
+    0x7C, 0x66, 0xDC, 0xB6, 0x9D, 0x28, 0x26, 0x22, 0xFA, 0x5D, 0xF6, 0x39, 0x31, 0x1D, 0xDA, 0xAA,
+    0x1A, 0x04, 0x40, 0x33, 0x67, 0xA5, 0x97, 0x48, 0xB1, 0x06, 0xFB, 0x9A, 0xEC, 0xF0, 0x04, 0x5F,
+    0x11, 0x26, 0x23, 0x93, 0x90, 0x48, 0x72, 0x92, 0xBD, 0xB8, 0xA6, 0xD1, 0xEE, 0x70, 0xFD, 0xB8,
+    0x53, 0x91, 0x62, 0xC1, 0x48, 0x0D, 0x70, 0xBB, 0xCD, 0xD4, 0xC3, 0xA1, 0x3D, 0x24, 0x42, 0x59,
+    0xD6, 0x3B, 0xA0, 0xD0, 0xAC, 0x89, 0x07, 0x45, 0x66, 0xC9, 0x1D, 0xBF, 0x66, 0xC4, 0xF9, 0x5D,
+    0x90, 0x3D, 0x84, 0x10, 0x62, 0x21, 0x37, 0x78, 0x8D, 0x27, 0xF2, 0x01, 0xA8, 0xD0, 0x2E, 0x81,
+    0xA0, 0xDB, 0x8D, 0x89, 0x78, 0x10, 0xBB, 0x49, 0x60, 0xA0, 0x50, 0x11, 0x6B, 0x04, 0xF3, 0x2E,
+    0x41, 0xBF, 0x00, 0xC4, 0xFA, 0xA8, 0x3B, 0x93, 0x9C, 0x90, 0x29, 0xD6, 0xBD, 0xC4, 0xE9, 0x26,
+    0xE2, 0xDB, 0xE8, 0x7E, 0xD6, 0xA7, 0xE7, 0x55, 0x61, 0x5E, 0x46, 0x82, 0x32, 0x8D, 0xD4, 0x96,
+    0xF5, 0x6B, 0xB3, 0x1D, 0x18, 0xA9, 0xAA, 0x8A, 0x22, 0x49, 0xF7, 0xB7, 0x36, 0xF7, 0xD0, 0x96,
+    0x2E, 0xC6, 0x73, 0x99, 0x93, 0x63, 0x12, 0x18, 0xF3, 0x82, 0x50, 0xE1, 0x96, 0x1B, 0x7E, 0xA9,
+    0x29, 0xFF, 0xFA, 0x75, 0x07, 0x82, 0x7D, 0x94, 0x4C, 0x2D, 0xCC, 0x06, 0xAD, 0x41, 0xF3, 0xB5,
+    0xF3, 0x6E, 0xAD, 0x8A, 0xDD, 0x7B, 0x7F, 0xE4, 0x7D, 0x58, 0xA8, 0x6D, 0x7C, 0xED, 0x9C, 0x1B,
+    0x63, 0x94, 0xD6, 0x81, 0x43, 0x1B, 0x8C, 0x1B, 0x7F, 0xB9, 0x1C, 0xB4, 0xD5, 0xB7, 0xBD, 0xED,
+    0xAA, 0x8D, 0xE4, 0x06, 0xE8, 0x88, 0xDB, 0xB5, 0xCB, 0xE9, 0xA5, 0x30, 0xA6, 0xD9, 0xA0, 0x99,
+    0x5F, 0x53, 0xC5, 0x9E, 0x4E, 0x29, 0xBB, 0xE5, 0xC5, 0xA4, 0xD9, 0x99, 0x86, 0xF1, 0x11, 0xE1,
+    0x4A, 0x5D, 0xCB, 0xD4, 0xF4, 0xBC, 0x66, 0x87, 0x33, 0x93, 0x76, 0xBC, 0x10, 0x4E, 0xC1, 0xB3,
+    0x0B, 0x00, 0xF5, 0x0C, 0x57, 0x9A, 0xC5, 0x30, 0x45, 0xCC, 0xDE, 0x08, 0xF0, 0x1C, 0x4C, 0x6D,
+    0xA9, 0xD8, 0x6C, 0x65, 0x7A, 0xC5, 0x0A, 0xE2, 0x0A, 0x47, 0xB4, 0x2F, 0x82, 0x0A, 0x8B, 0x12,
+    0xF5, 0xF5, 0xC4, 0x08, 0x17, 0x89, 0x4B, 0xEB, 0x11, 0x9E, 0x1F, 0x2E, 0x2A, 0x24, 0xDF, 0x15,
+    0xC0, 0x1B, 0x04, 0xCE, 0x07, 0x10, 0xB5, 0x26, 0x81, 0xC4, 0x4C, 0xA5, 0x14, 0x5B, 0x17, 0x57,
+    0x38, 0x61, 0xF9, 0x2A, 0x25, 0x0E, 0x51, 0x15, 0x5B, 0xEB, 0x85, 0xFE, 0xAA, 0x3E, 0xB6, 0x10,
+    0x6E, 0x20, 0xAF, 0xAC, 0xFA, 0xE7, 0x86, 0xFF, 0x96, 0xA9, 0xB3, 0xB7, 0x86, 0xAC, 0x2C, 0x53,
+    0xD9, 0x0A, 0x7A, 0x01, 0xE1, 0x58, 0xBD, 0x8C, 0x7C, 0xB0, 0x7F, 0xBB, 0x70, 0x9B, 0xE1, 0x9A,
+    0xB8, 0x0E, 0x5D, 0xC9, 0x5D, 0x90, 0xBE, 0x2F, 0x94, 0xCE, 0x2E, 0x28, 0xFB, 0x09, 0xF8, 0xC0,
+    0x11, 0x31, 0x2F, 0xE2, 0xFF, 0xE1, 0x63, 0xE8, 0x58, 0xB9, 0x4D, 0x27, 0x02, 0x7A, 0x05, 0xF0,
+    0x61, 0x70, 0x34, 0xAA, 0xB6, 0xCC, 0xA1, 0xB8, 0xC3, 0x53, 0xAE, 0x1B, 0x0D, 0xB6, 0x2B, 0x3D,
+    0x84, 0x5A, 0xC4, 0x12, 0xDF, 0x6C, 0x60, 0x73, 0x28, 0xE1, 0x07, 0xFF, 0x2C, 0x04, 0xE8, 0xF1,
+    0x86, 0xCE, 0x38, 0x1E, 0xDE, 0x06, 0x14, 0x59, 0x2A, 0x91, 0x24, 0x6C, 0x72, 0x7A, 0xB6, 0x2A,
+    0x1A, 0x74, 0xB6, 0x5F, 0x88, 0xE3, 0xC0, 0xC9, 0x28, 0xDE, 0xE5, 0x4B, 0x08, 0x7F, 0xD1, 0x75,
+    0x2D, 0xF6, 0x9E, 0x91, 0x8D, 0xF0, 0x79, 0x6A, 0x0C, 0xA2, 0x19, 0xD4, 0xDE, 0xE6, 0x45, 0xFC,
+    0x66, 0xA0, 0xB8, 0x24, 0x1D, 0x88, 0xDD, 0x31, 0x2C, 0x99, 0x02, 0x86, 0xC7, 0xF7, 0xA9, 0xFF,
+    0x19, 0x61, 0x2E, 0xFA, 0xCE, 0xD2, 0x46, 0xD5, 0x89, 0xD1, 0xBC, 0x3E, 0x03, 0x21, 0x13, 0x14,
+    0x65, 0x1C, 0x15, 0x54, 0xAB, 0x22, 0xA0, 0x52, 0xEA, 0xEC, 0xB5, 0x8D, 0x7B, 0xC7, 0xFC, 0x9A,
+    0x1C, 0x30, 0x1D, 0x50, 0x6A, 0xB6, 0xA4, 0x0F, 0x57, 0xE4, 0x6B, 0xBD, 0x69, 0x79, 0xF8, 0x75,
+    0x43, 0xBE, 0xDC, 0x5C, 0xAD, 0xC0, 0xB8, 0xEF, 0xF1, 0x57, 0xB7, 0xEE, 0xAB, 0xBA, 0x94, 0xBD,
+    0xEE, 0x62, 0x0C, 0x99, 0xC8, 0xC1, 0x7C, 0x07, 0xCE, 0xE0, 0x51, 0x34, 0x67, 0x8D, 0xFD, 0x89,
+    0x7E, 0xFD, 0x56, 0xBC, 0xD1, 0x3E, 0x4C, 0x30, 0x11, 0xA4, 0x2C, 0x4E, 0x98, 0xA3, 0xAC, 0xD4,
+    0x34, 0xE4, 0xD2, 0x30, 0xA5, 0xC6, 0xD5, 0xBE, 0xE9, 0x93, 0x20, 0x2E, 0xD0, 0xD3, 0x27, 0x6C,
+    0x18, 0xB3, 0xE4, 0x38, 0x09, 0x93, 0x49, 0xE7, 0xB3, 0x25, 0xDF, 0x5F, 0x80, 0x36, 0xC4, 0x74,
+    0x03, 0x3B, 0x12, 0x0C, 0x4E, 0xA3, 0x79, 0x42, 0x15, 0xC8, 0x7D, 0xE3, 0xCD, 0xED, 0x30, 0x3F,
+    0x23, 0x11, 0x15, 0x37, 0xB5, 0x03, 0x04, 0x1D, 0xD3, 0x9E, 0x6B, 0x68, 0x78, 0xE7, 0xBF, 0xB6,
+    0x3D, 0x89, 0x21, 0xF9, 0xAA, 0xC4, 0xD7, 0x54, 0x17, 0xD6, 0xF3, 0x3E, 0xDC, 0xE9, 0xB3, 0x87,
+    0xA0, 0x3B, 0x6A, 0x54, 0xB0, 0x6D, 0x9E, 0xB0, 0xC2, 0x48, 0xA7, 0xE9, 0x29, 0xEB, 0xDF, 0x88,
+    0xE6, 0x9F, 0x4B, 0x83, 0xAF, 0x29, 0x4F, 0x30, 0x62, 0x37, 0xC5, 0x23, 0xFB, 0x19, 0x08, 0x1D,
+    0xFF, 0xA3, 0x19, 0xB2, 0xEB, 0xBF, 0x68, 0x88, 0xBC, 0x1F, 0x9A, 0xE5, 0x2A, 0x24, 0x46, 0xC0,
+    0x87, 0x82, 0x7F, 0x49, 0x7F, 0x71, 0x50, 0x69, 0xD6, 0x57, 0x27, 0x58, 0x64, 0xFD, 0x06, 0xB8,
+    0x05, 0x5D, 0x74, 0xD0, 0x33, 0xFC, 0x5A, 0x34, 0x6F, 0x1E, 0xB3, 0x0E, 0xFE, 0x6B, 0x27, 0xCE,
+    0x3A, 0x51, 0x2D, 0xF5, 0x48, 0x4C, 0x27, 0x36, 0x26, 0x87, 0xE7, 0x3B, 0xB6, 0x64, 0x95, 0x5C,
+    0x73, 0x3D, 0xD4, 0x2C, 0x4C, 0x03, 0x02, 0x9F, 0x0E, 0xBD, 0xF0, 0xA3, 0x4C, 0xE6, 0xC9, 0xE1,
+    0xBE, 0x4C, 0x1A, 0xBD, 0xE8, 0x39, 0x75, 0xEC, 0xAA, 0x0A, 0x3D, 0xED, 0x77, 0x57, 0x44, 0x92,
+    0xF3, 0xE6, 0x86, 0xFA, 0x11, 0x75, 0x7C, 0xA2, 0x1A, 0xF3, 0x36, 0x95, 0xA5, 0xE4, 0xAB, 0x77,
+    0x8A, 0xA5, 0xCF, 0x72, 0xAB, 0x7B, 0xBC, 0xB7, 0x4F, 0x9A, 0xB3, 0xD6, 0xE6, 0xA7, 0x76, 0x8E,
+    0x44, 0xD3, 0x4B, 0x2D, 0xC7, 0xC9, 0xCA, 0x1C, 0xE4, 0x94, 0x86, 0x60, 0xF9, 0x9E, 0xEC, 0xA9,
+    0xD8, 0x47, 0xF1, 0xAB, 0xD7, 0x08, 0x89, 0x63, 0xA4, 0x1D, 0x6C, 0xC7, 0xCC, 0x62, 0xB5, 0xC6,
+    0x92, 0x1C, 0x12, 0x49, 0x3E, 0x35, 0x01, 0x44, 0x64, 0x3F, 0xEC, 0x73, 0x79, 0x88, 0xC2, 0x57,
+    0x34, 0x41, 0x49, 0x9D, 0xF6, 0xE9, 0x4D, 0xCC, 0xE1, 0x96, 0xCF, 0x21, 0xA6, 0xFA, 0x9E, 0x1C,
+    0xDC, 0x6A, 0x0A, 0x97, 0x46, 0x9A, 0x4B, 0x97, 0x7C, 0x24, 0x10, 0x85, 0x83, 0xE7, 0x17, 0x36,
+    0xB9, 0xE6, 0x5D, 0xA0, 0x56, 0xAD, 0xBE, 0xB5, 0x8B, 0x30, 0xD0, 0xC0, 0x67, 0x0E, 0x7D, 0x85,
+    0xD1, 0x8A, 0x3B, 0x9F, 0xF4, 0x63, 0x67, 0xC1, 0x37, 0xEC, 0xFF, 0x5F, 0x61, 0x4A, 0x98, 0xDC,
+    0xF4, 0x01, 0x59, 0x5F, 0xBC, 0xF0, 0x7D, 0x3A, 0xD3, 0x2F, 0x19, 0x4F, 0xB1, 0x85, 0x18, 0x3D,
+    0x4F, 0x99, 0xA0, 0x61, 0x3B, 0x7C, 0x56, 0x56, 0x00, 0x5C, 0x4E, 0xD9, 0x49, 0x66, 0xDF, 0xF5,
+    0x28, 0xA3, 0x83, 0x9E, 0xAA, 0xC7, 0x6D, 0xE1, 0xF6, 0xEB, 0x7D, 0x61, 0xFF, 0xFA, 0xDC, 0x26,
+    0x46, 0x69, 0x66, 0x77, 0x2B, 0x68, 0xA9, 0x63, 0xD0, 0x55, 0xA1, 0xFF, 0xFB, 0xC6, 0x87, 0xF1,
+    0x01, 0x83, 0x4D, 0x1D, 0xD6, 0x26, 0x51, 0x36, 0x7F, 0x85, 0x73, 0xF7, 0x77, 0xD5, 0x03, 0xCF,
+    0x76, 0x40, 0xA9, 0xDC, 0x7C, 0x03, 0xFE, 0x59, 0x8C, 0xF7, 0x93, 0x64, 0x7A, 0x0E, 0xA3, 0xB6,
+    0x6B, 0xAD, 0xBD, 0xD3, 0xB0, 0x43, 0xC6, 0xCA, 0x9D, 0x10, 0x04, 0x96, 0xB1, 0xCE, 0xEF, 0x1B,
+    0x8D, 0xE2, 0x67, 0x20, 0x4F, 0x96, 0x2E, 0x6C, 0x6D, 0x21, 0xEC, 0x74, 0x0F, 0x23, 0xAE, 0x60,
+    0x92, 0xB6, 0x19, 0x51, 0xFF, 0x96, 0xA9, 0xC5, 0xF1, 0x04, 0x50, 0x02, 0xCE, 0xB1, 0x5E, 0x83,
+    0x06, 0x5C, 0x41, 0xB5, 0x2E, 0xBE, 0xDE, 0xB7, 0x39, 0x4C, 0x22, 0xBB, 0x92, 0x4C, 0x74, 0x76,
+    0x9C, 0xDD, 0xE8, 0xF4, 0xDF, 0xFF, 0xD3, 0x8F, 0x4D, 0xE8, 0xAF, 0xEA, 0xA1, 0xEC, 0x02, 0x32,
+    0x37, 0xF0, 0xD5, 0xA4, 0x0A, 0x4C, 0x1C, 0x60, 0xE6, 0x95, 0x84, 0x9C, 0xF8, 0xC0, 0x16, 0x7B,
+    0x88, 0xE6, 0x97, 0x82, 0x0C, 0x6A, 0xEC, 0xE5, 0x8C, 0x9B, 0xFF, 0x96, 0x6D, 0xD5, 0x04, 0xE7,
+    0x59, 0xD0, 0xB0, 0xCE, 0x6F, 0x9D, 0xBB, 0x7E, 0x09, 0x82, 0xDD, 0xC0, 0xE5, 0x37, 0xB9, 0x07,
+    0xF0, 0x6E, 0xBA, 0x8C, 0x19, 0x77, 0xA4, 0x21, 0xCB, 0xE1, 0xFA, 0x14, 0xC2, 0x68, 0xBF, 0x86,
+    0xC0, 0xEE, 0xB3, 0xED, 0x17, 0x8D, 0x99, 0x70, 0x01, 0x61, 0xBF, 0x92, 0x18, 0xA9, 0x2C, 0xEE,
+    0x94, 0xB4, 0x88, 0x35, 0x21, 0x56, 0xD1, 0x02, 0xA8, 0xC4, 0x12, 0x34, 0x69, 0x7E, 0x1A, 0xFC,
+    0x64, 0x66, 0x32, 0x8E, 0xA4, 0x1C, 0xB9, 0xDD, 0x37, 0xF0, 0x52, 0xC6, 0x76, 0x5A, 0xEA, 0x4F,
+    0x49, 0xD3, 0x1C, 0x83, 0x90, 0x96, 0x35, 0x67, 0x65, 0x38, 0x86, 0xE2, 0x45, 0xA9, 0xC4, 0x07,
+    0x59, 0xAE, 0xCC, 0xD5, 0xDD, 0x88, 0xDE, 0xF2, 0x52, 0xD9, 0x88, 0x02, 0x10, 0x13, 0x62, 0x8C,
+    0x5A, 0x32, 0x76, 0x80, 0x31, 0xD0, 0xF2, 0x91, 0x22, 0x51, 0x26, 0x3C, 0xD6, 0xA4, 0x1A, 0x61,
+    0x5A, 0xB2, 0x7D, 0xE7, 0xCD, 0x71, 0x0B, 0x28, 0xB2, 0x3F, 0xA6, 0x38, 0xDC, 0xD9, 0x61, 0xD0,
+    0xE5, 0xC8, 0x0F, 0xF1, 0xC9, 0x04, 0x09, 0x4A, 0x9F, 0x91, 0x7C, 0xEA, 0x88, 0x74, 0xC0, 0x32,
+    0xB2, 0xCE, 0xBB, 0xA7, 0xE1, 0x95, 0x4E, 0xEF, 0xA0, 0x6F, 0xE0, 0x75, 0xC3, 0x9F, 0x44, 0x02,
+    0xF1, 0x06, 0x0B, 0xFD, 0xC8, 0x11, 0x0B, 0xCB, 0xCF, 0x19, 0xE1, 0x64, 0xDE, 0x8D, 0xEE, 0x97,
+    0x37, 0x48, 0x5F, 0xF6, 0xE7, 0xCE, 0x5C, 0x7A, 0xB7, 0xC6, 0xAB, 0x4F, 0x9A, 0x33, 0x2C, 0xBF,
+    0x7A, 0x2F, 0xEE, 0x28, 0x90, 0xD6, 0x6E, 0x8A, 0x6D, 0xE0, 0xDE, 0x0E, 0x2B, 0x2B, 0xE1, 0x36,
+    0xBA, 0xD6, 0xE7, 0x1A, 0x3C, 0x2F, 0x34, 0xF3, 0x39, 0xE2, 0x22, 0x33, 0x91, 0xEB, 0xFF, 0x1C,
+    0x00, 0x09, 0x82, 0xFE, 0xAB, 0x1E, 0x1F, 0x40, 0x5E, 0x05, 0xF5, 0x6B, 0xCD, 0x52, 0xAB, 0xEA,
+    0x52, 0x91, 0x23, 0x26, 0x91, 0x6F, 0xEF, 0xA3, 0x46, 0x70, 0xD9, 0x00, 0x79, 0xE6, 0x06, 0x2F,
+    0x31, 0x2A, 0x35, 0x5F, 0x29, 0xDA, 0x7A, 0xF6, 0xE2, 0x5B, 0xFA, 0x50, 0x5F, 0x27, 0xD9, 0x5E,
+    0x3D, 0x72, 0x2C, 0xE5, 0x6F, 0x6C, 0xFA, 0x73, 0x2D, 0x5C, 0x02, 0xFF, 0x64, 0xF7, 0xBB, 0xC0,
+    0x4D, 0x72, 0xCD, 0x3A, 0x68, 0xA8, 0xD0, 0xD4, 0xB4, 0x36, 0x25, 0x4D, 0xD2, 0xF2, 0x72, 0x2E,
+    0x29, 0x6A, 0x5C, 0xAE, 0x53, 0x36, 0x26, 0x24, 0x2D, 0x40, 0x7B, 0xE2, 0x95, 0xB1, 0x38, 0xCC,
+    0x98, 0xC3, 0xCA, 0xFD, 0xD2, 0x14, 0x20, 0x67, 0x69, 0xFE, 0xA8, 0x3F, 0xE7, 0xA4, 0xF5, 0x12,
+    0x72, 0x45, 0x35, 0x09, 0xFB, 0x41, 0x5E, 0xF7, 0x14, 0xC7, 0x6B, 0xF6, 0x14, 0x1B, 0x3D, 0xB6,
+    0x30, 0xE2, 0x9E, 0xDA, 0xCE, 0x71, 0xF1, 0x7E, 0xAB, 0xD6, 0xE3, 0xFE, 0x81, 0xFB, 0x0B, 0x46,
+    0xDB, 0x92, 0xBF, 0x0C, 0x78, 0x48, 0x26, 0xD7, 0x06, 0xD2, 0x25, 0x24, 0x07, 0x94, 0xBD, 0x4B,
+    0x1F, 0xC4, 0x97, 0x13, 0x45, 0xD3, 0x34, 0x7C, 0x6B, 0x6F, 0x2A, 0xD7, 0x4B, 0x2C, 0xF3, 0x4D,
+    0x30, 0x8E, 0x6F, 0x08, 0x59, 0x23, 0xAD, 0x3C, 0xE0, 0xF8, 0xF1, 0xC5, 0x6D, 0xF2, 0xB2, 0x8C,
+    0x1B, 0xB4, 0x0D, 0x06, 0xAE, 0xBC, 0x9A, 0x26, 0xE8, 0x1B, 0xB1, 0x69, 0x57, 0xE9, 0x61, 0x9A,
+    0xDF, 0xF2, 0xEA, 0x46, 0xC8, 0x1D, 0x49, 0xA1, 0x0F, 0x7A, 0x0D, 0xFC, 0xC7, 0x45, 0xC5, 0x8B,
+    0xBC, 0xF7, 0x0B, 0x7E, 0x27, 0x60, 0x42, 0xD5, 0x5C, 0x7F, 0x99, 0x77, 0x57, 0x3A, 0x9F, 0x7B,
+    0xC2, 0xE1, 0xDF, 0x96, 0xD4, 0x70, 0x25, 0x5A, 0xBB, 0xC0, 0xEC, 0xB4, 0xC6, 0x93, 0x21, 0x29,
+    0x96, 0xEC, 0x47, 0x41, 0x6C, 0xE3, 0x60, 0xFC, 0x40, 0x7F, 0x47, 0x1D, 0x8A, 0x19, 0x2C, 0xE9,
+    0x10, 0x1B, 0x3B, 0x1A, 0x35, 0x29, 0xE4, 0xA6, 0xBC, 0x6B, 0x35, 0x37, 0xF5, 0x39, 0xCD, 0x03,
+    0x4E, 0x9A, 0x88, 0xF8, 0x88, 0xE1, 0x20, 0x6A, 0xA2, 0x77, 0xD0, 0xF0, 0x82, 0x3E, 0x23, 0x95,
+    0x1C, 0x72, 0x06, 0xF6, 0x08, 0x0A, 0x79, 0x0C, 0x96, 0x0B, 0x6A, 0x19, 0x13, 0x66, 0x3F, 0xA3,
+    0xC4, 0xBB, 0x63, 0x21, 0x8E, 0x83, 0xF9, 0x61, 0x82, 0xC5, 0x0E, 0x47, 0x79, 0x9C, 0x09, 0x7C,
+    0xD2, 0xEE, 0x52, 0x06, 0xDA, 0xAF, 0x4A, 0x69, 0xAA, 0x8C, 0xA1, 0x74, 0x33, 0x7E, 0x58, 0x0A,
+    0x5C, 0xA9, 0x08, 0x8A, 0x9F, 0x89, 0x3D, 0x72, 0xC4, 0x6B, 0x26, 0xED, 0xCB, 0x46, 0xFA, 0x0A,
+    0x5C, 0x6E, 0x3C, 0x66, 0x36, 0xC7, 0x5B, 0xEF, 0xCE, 0x59, 0x9F, 0xF1, 0x41, 0xED, 0xA5, 0x70,
+    0x97, 0xF4, 0xD7, 0xB5, 0x56, 0xFC, 0xBC, 0x50, 0xB6, 0xB4, 0x61, 0xED, 0x8E, 0x5E, 0xF0, 0x50,
+    0xF0, 0x96, 0xF7, 0x81, 0xAD, 0xE2, 0x8C, 0xA7, 0xB8, 0xC7, 0x17, 0xD5, 0x0C, 0x80, 0xB7, 0x7B,
+    0xA4, 0xD9, 0x89, 0x04, 0xF2, 0x7B, 0xF8, 0x89, 0x8F, 0x58, 0x8B, 0x88, 0xEF, 0x6E, 0x9A, 0xCB,
+    0x67, 0xBA, 0x32, 0xA7, 0x68, 0x92, 0x0A, 0xD7, 0xC9, 0xB9, 0x8B, 0xE6, 0x44, 0x0C, 0x38, 0x39,
+    0x14, 0xBF, 0x0C, 0xE4, 0x68, 0x13, 0xB2, 0x2A, 0x0D, 0x2E, 0xA8, 0x53, 0x46, 0x3D, 0xF5, 0xC6,
+    0x67, 0x8B, 0x2C, 0x50, 0x94, 0xD5, 0x4A, 0xB3, 0xDA, 0xB0, 0x1F, 0xDD, 0x17, 0xED, 0xF9, 0xF5,
+    0xDB, 0x1F, 0x96, 0x33, 0xE9, 0x81, 0x28, 0x86, 0x04, 0xAA, 0x0E, 0xEF, 0x8B, 0x6D, 0xE0, 0xA2,
+    0x26, 0x34, 0xFF, 0x6D, 0xFE, 0x57, 0xB1, 0x0A, 0xE7, 0xE5, 0x7D, 0xD4, 0x13, 0xEF, 0xC8, 0xDC,
+    0xFE, 0xFA, 0x0A, 0xF7, 0x34, 0x75, 0x37, 0xDC, 0xA3, 0x96, 0xDA, 0x18, 0x75, 0xA3, 0x2D, 0x93,
+    0xD4, 0x2F, 0xD7, 0xDE, 0x4B, 0xA2, 0x9C, 0x6A, 0x15, 0x36, 0xC5, 0x1F, 0x69, 0x82, 0x0C, 0x65,
+    0x8C, 0x5E, 0x96, 0x07, 0xF7, 0x5D, 0x7B, 0x22, 0x7C, 0xAB, 0x0D, 0x91, 0xD7, 0xAC, 0xB4, 0x9F,
+    0x46, 0x82, 0x81, 0xF8, 0xCC, 0xA6, 0x88, 0x6D, 0xEA, 0x36, 0xB3, 0x0B, 0xA7, 0xC8, 0xB6, 0xBD,
+    0xC8, 0x74, 0x26, 0x09, 0x57, 0xE4, 0xBD, 0x39, 0x86, 0xD9, 0xED, 0x2A, 0xA9, 0x77, 0x6B, 0xD3,
+    0x77, 0xF9, 0x92, 0xEB, 0x1C, 0xF1, 0xB8, 0x97, 0xBD, 0x8E, 0xCB, 0xCB, 0xF7, 0x1A, 0xBC, 0x12,
+    0x98, 0x79, 0x56, 0xD4, 0x0D, 0x31, 0xDE, 0xBF, 0xB9, 0x12, 0x82, 0xA2, 0x69, 0x7A, 0x55, 0x23,
+    0x73, 0xF6, 0xF8, 0xA6, 0x12, 0xCC, 0x51, 0x65, 0xD4, 0x00, 0xDF, 0x46, 0xA0, 0x37, 0xB8, 0x1C,
+    0x39, 0xD8, 0x73, 0x66, 0xCB, 0x5F, 0xAE, 0x69, 0x3D, 0xFF, 0x9B, 0x13, 0x33, 0xCF, 0xE0, 0x15,
+    0xD6, 0x78, 0x6B, 0xF1, 0x0F, 0x77, 0xEF, 0x33, 0x64, 0x1C, 0xD8, 0x60, 0x2A, 0xC6, 0x62, 0xFB,
+    0xC9, 0x84, 0x10, 0xC2, 0x76, 0x24, 0x4C, 0x6F, 0xAF, 0x23, 0x68, 0x3C, 0x71, 0xB1, 0x80, 0x71,
+    0x0C, 0x86, 0xE0, 0x15, 0xBF, 0xC0, 0xAA, 0xB0, 0x18, 0x61, 0x48, 0x93, 0xFD, 0xAD, 0xC8, 0xC4,
+    0x23, 0x18, 0x87, 0x21, 0x10, 0x55, 0x7A, 0x35, 0xCC, 0x08, 0xBE, 0x2E, 0xE2, 0xA5, 0x99, 0xAB,
+    0x55, 0x90, 0x42, 0x19, 0x6E, 0x62, 0x79, 0x4A, 0xE5, 0xE3, 0x70, 0xED, 0x91, 0x3F, 0x85, 0x02,
+    0xB4, 0x0B, 0xF4, 0x84, 0x89, 0x6D, 0x95, 0xA4, 0x2A, 0x8A, 0x9E, 0x53, 0xCE, 0x5D, 0xCA, 0xE7,
+    0x58, 0xB2, 0xB0, 0x40, 0x15, 0x5B, 0xA8, 0x79, 0x02, 0xB5, 0x0F, 0xCA, 0x19, 0x8A, 0x3F, 0x2B,
+    0xA4, 0xE8, 0x66, 0x1D, 0x70, 0x95, 0xF7, 0xE7, 0x4B, 0x1B, 0x37, 0x18, 0xFB, 0x4F, 0xEF, 0x93,
+    0xDE, 0xCB, 0x2F, 0x5E, 0xD3, 0xA4, 0x56, 0x95, 0xA7, 0x0F, 0x89, 0xB8, 0xE2, 0xC5, 0x35, 0xE0,
+    0x88, 0xD4, 0x30, 0x05, 0x56, 0xCC, 0x9F, 0x6B, 0x58, 0xA3, 0x12, 0x98, 0x91, 0x99, 0xD8, 0x9B,
+    0x10, 0xFA, 0xF5, 0x58, 0xD6, 0xD1, 0x7A, 0xBF, 0x16, 0x6E, 0x45, 0x74, 0xF1, 0x7A, 0xC5, 0x08,
+    0x35, 0x5E, 0xB2, 0x89, 0x93, 0xFA, 0x30, 0xE0, 0x13, 0x94, 0xA1, 0x45, 0xDF, 0x24, 0x59, 0x3B,
+    0xE7, 0xBA, 0x15, 0x5E, 0x32, 0x49, 0x37, 0x25, 0xC2, 0x32, 0x07, 0x05, 0x5D, 0x35, 0x9C, 0x8E,
+    0x8A, 0x53, 0x56, 0xF7, 0x53, 0xCD, 0xE5, 0x9D, 0xEF, 0x1E, 0x49, 0xC3, 0x24, 0x67, 0x96, 0x1C,
+    0x94, 0xDF, 0x8F, 0x98, 0x1F, 0x8A, 0xF6, 0x8E, 0x8F, 0xED, 0xFD, 0xEE, 0x4E, 0xBC, 0x00, 0xE8,
+    0x95, 0x53, 0xEF, 0x11, 0xD6, 0x65, 0xD0, 0x52, 0xDC, 0x08, 0x7C, 0xB0, 0x32, 0x01, 0xBF, 0xB3,
+    0x1D, 0x0F, 0x62, 0x32, 0xA3, 0x7D, 0x18, 0x9E, 0x9E, 0x19, 0x9B, 0xF6, 0x68, 0xFF, 0x63, 0xB3,
+    0x97, 0x61, 0xD6, 0x31, 0xFF, 0x42, 0x7A, 0xE8, 0xCA, 0x87, 0xFA, 0xD7, 0xF0, 0x6C, 0x3C, 0x13,
+    0x6B, 0x3E, 0x31, 0x10, 0xA9, 0x55, 0x46, 0x64, 0xAA, 0xF6, 0xA0, 0x3A, 0x16, 0x28, 0xBE, 0x71,
+    0xDE, 0xE0, 0x44, 0x78, 0x5B, 0xE6, 0xF6, 0xAB, 0x2F, 0x9B, 0xE7, 0x61, 0x0A, 0xA4, 0x04, 0x2D,
+    0xFD, 0xFB, 0x2E, 0x5D, 0xD7, 0x36, 0xC8, 0x30, 0xA8, 0x93, 0xD8, 0x17, 0x4F, 0x8F, 0x4D, 0x8C,
+    0x98, 0x57, 0x8C, 0x6F, 0x46, 0x57, 0xA0, 0x4A, 0x1A, 0xDB, 0xE7, 0x3F, 0x96, 0xC7, 0x56, 0x41,
+    0x0D, 0x55, 0x5B, 0x3F, 0x67, 0xD2, 0xAB, 0xEC, 0x4A, 0x66, 0x67, 0x9A, 0xF2, 0x2D, 0x63, 0xC4,
+    0xB6, 0x50, 0x86, 0xB7, 0x70, 0xAA, 0x19, 0x05, 0x9A, 0xA5, 0x3E, 0x7B, 0x89, 0x64, 0xF9, 0x97,
+    0x0C, 0xDB, 0x3D, 0x99, 0x92, 0xF0, 0x9A, 0x5C, 0x63, 0x46, 0x6E, 0x57, 0x15, 0xF2, 0xC1, 0x24,
+    0x09, 0xB0, 0x94, 0xB6, 0x22, 0xA0, 0x23, 0x32, 0x53, 0x9B, 0x24, 0x4B, 0xC7, 0x83, 0x6D, 0xA9,
+    0xDB, 0x1E, 0x1A, 0xBD, 0x56, 0xB7, 0x13, 0xD8, 0x92, 0x2E, 0x0C, 0x17, 0xA5, 0xEF, 0x4B, 0x53,
+    0x36, 0xC9, 0xC4, 0xE8, 0xFA, 0x4D, 0xD8, 0xA1, 0x81, 0xE5, 0x9C, 0xE8, 0x65, 0x62, 0xEF, 0x65,
+    0xA6, 0xA9, 0x1C, 0xBA, 0x33, 0xE2, 0x3F, 0xE7, 0xB7, 0xD6, 0x1A, 0x07, 0xBE, 0x5D, 0xF6, 0x5C,
+    0x3E, 0xC4, 0x40, 0xF7, 0x3F, 0x8A, 0xE0, 0x77, 0xC0, 0x61, 0x73, 0x86, 0x26, 0x2D, 0x71, 0x54,
+    0x51, 0xE5, 0x57, 0x5E, 0xB7, 0x46, 0x57, 0x2A, 0xD3, 0x22, 0x90, 0x2E, 0x3E, 0x75, 0xF8, 0x87,
+    0xB1, 0xD2, 0x29, 0xC2, 0xDD, 0x93, 0x94, 0xD2, 0x5E, 0xAC, 0xCC, 0x90, 0xD2, 0xD8, 0x2E, 0xD3,
+    0x9B, 0xE5, 0x10, 0x5B, 0xE5, 0x7F, 0x8E, 0x34, 0x64, 0x97, 0xB9, 0xA0, 0x7E, 0xD9, 0x0E, 0x7F,
+    0xB4, 0x6B, 0x0C, 0xE7, 0x31, 0xA4, 0x35, 0x46, 0x82, 0x7B, 0xDB, 0x6F, 0x0C, 0x7D, 0xE7, 0x21,
+    0x37, 0x10, 0x54, 0x03, 0x0E, 0x83, 0x77, 0xCB, 0xD9, 0xBB, 0x23, 0x87, 0xF3, 0xA0, 0x68, 0x06,
+    0x67, 0xF0, 0x0A, 0x6B, 0xE5, 0x98, 0x05, 0x06, 0xB1, 0xDC, 0xB7, 0xE8, 0xDC, 0x7B, 0x2D, 0x9A,
+    0xF7, 0x1E, 0x53, 0xBE, 0xBB, 0x9D, 0x90, 0xD0, 0x80, 0xA3, 0x02, 0x53, 0xDD, 0x3B, 0x97, 0xF2,
+    0xC9, 0x1A, 0x5A, 0xAB, 0x9F, 0x53, 0xFB, 0xED, 0x1C, 0x44, 0xEA, 0x13, 0xE6, 0xFF, 0x03, 0xB1,
+    0xAB, 0x21, 0x94, 0x7A, 0x58, 0x5F, 0x2E, 0x0C, 0xFF, 0xC1, 0x6A, 0xA8, 0xD6, 0xE3, 0x11, 0xC6,
+    0x9C, 0x88, 0xE5, 0xEB, 0x90, 0x50, 0x6F, 0x34, 0x59, 0x63, 0xD6, 0xAC, 0xFB, 0x1C, 0x70, 0xEC,
+    0x7E, 0x50, 0xA6, 0xD3, 0x7E, 0xF5, 0x98, 0x4B, 0x26, 0xEE, 0x0B, 0xB4, 0x04, 0xF6, 0x72, 0x77,
+    0x4A, 0x72, 0x70, 0xE3, 0x8B, 0xE2, 0x55, 0xD2, 0x31, 0x39, 0xF8, 0xB6, 0x8D, 0x97, 0x57, 0x54,
+    0xAE, 0x02, 0xC8, 0x00, 0x65, 0x49, 0xF7, 0xF2, 0x88, 0xD1, 0x07, 0x46, 0x58, 0x7A, 0x52, 0x66,
+    0x32, 0xE4, 0xF4, 0x4B, 0xD8, 0xFA, 0xFB, 0x1D, 0xF5, 0xAF, 0x61, 0x60, 0x52, 0x4D, 0x87, 0xC3,
+    0xBB, 0x71, 0x60, 0x42, 0x1D, 0xA3, 0x8C, 0x59, 0xF3, 0x48, 0xB7, 0x9D, 0x7E, 0xE3, 0xC5, 0x91,
+    0x20, 0xDE, 0x82, 0xFD, 0xA3, 0xDE, 0xFF, 0x0B, 0x12, 0x6C, 0x9A, 0xD4, 0x37, 0x97, 0xA1, 0x10,
+    0x2C, 0x1A, 0x84, 0x1A, 0x65, 0xE0, 0xBB, 0xED, 0x31, 0xD9, 0x9E, 0x63, 0x48, 0x3F, 0x73, 0xCD,
+    0x9D, 0x9C, 0x1A, 0x89, 0x01, 0x89, 0x95, 0xA0, 0x01, 0xFF, 0x15, 0x2E, 0xFD, 0x5B, 0xB7, 0x56,
+    0x54, 0x9B, 0x1A, 0xD9, 0xD8, 0x6B, 0x4D, 0x2B, 0xEE, 0x65, 0x82, 0xF4, 0x18, 0xC0, 0x8F, 0x92,
+    0x0F, 0xA9, 0x85, 0x36, 0xE0, 0xFF, 0x5C, 0x67, 0xBC, 0x1C, 0x4C, 0x04, 0x00, 0x1A, 0xFF, 0x33,
+    0xF3, 0x3C, 0xB9, 0x01, 0x85, 0xF5, 0x9C, 0x42, 0x48, 0x98, 0xD1, 0x1C, 0x12, 0x12, 0x36, 0x69,
+    0x9F, 0x00, 0x9D, 0x91, 0x55, 0xF2, 0x3B, 0x3C, 0x65, 0x1F, 0x08, 0x56, 0x48, 0x57, 0x6B, 0xE3,
+    0x88, 0xED, 0x2A, 0x13, 0x48, 0xC4, 0x2C, 0xD5, 0x46, 0x54, 0x8A, 0xBC, 0x1C, 0x4B, 0xCF, 0x27,
+    0x88, 0xC9, 0x74, 0xCF, 0xD5, 0x82, 0x76, 0x57, 0x76, 0x83, 0x2C, 0xA6, 0x4E, 0xD6, 0xEB, 0xD0,
+    0xEB, 0x8C, 0x0D, 0x04, 0xD6, 0xAD, 0x88, 0xE3, 0x7C, 0x3C, 0x9C, 0xB1, 0xCA, 0x4E, 0xEF, 0x8A,
+    0x57, 0x3B, 0x6C, 0x68, 0x2C, 0xEE, 0xA9, 0xEA, 0x71, 0xBB, 0x84, 0x2A, 0xCF, 0x68, 0xBE, 0x7F,
+    0x16, 0x77, 0x4A, 0x6D, 0x2F, 0x9B, 0x23, 0xA7, 0x65, 0x1D, 0x3A, 0x43, 0xE1, 0xEA, 0xF8, 0x0B,
+    0x4E, 0xA7, 0x6A, 0x9C, 0x68, 0x65, 0x80, 0x34, 0xBF, 0x92, 0x35, 0x52, 0x47, 0xA3, 0xD1, 0x19,
+    0x54, 0xD4, 0x61, 0xB2, 0x59, 0xCB, 0x98, 0x01, 0x2A, 0x03, 0xA3, 0x26, 0x13, 0xF4, 0x8D, 0x2E,
+    0xA5, 0xF5, 0x89, 0xA1, 0x27, 0x5F, 0x08, 0x9E, 0xDF, 0x24, 0xB6, 0x1F, 0x88, 0x0F, 0xA9, 0xA7,
+    0x3F, 0x8B, 0x14, 0xD6, 0xAE, 0x50, 0x43, 0x73, 0x7F, 0xE5, 0x47, 0xFA, 0xF6, 0xA8, 0xC6, 0x85,
+    0x03, 0x20, 0x5C, 0x91, 0x13, 0xB4, 0xDF, 0xD0, 0xDE, 0xD5, 0xA3, 0x7A, 0x6F, 0x85, 0xE4, 0x92,
+    0x9B, 0xED, 0x3D, 0xE9, 0x03, 0x08, 0x45, 0x21, 0x12, 0x0E, 0x5A, 0xEB, 0x12, 0xDF, 0x07, 0x71,
+    0xD4, 0x96, 0x06, 0x0A, 0xCA, 0xA5, 0x2D, 0x7C, 0x6D, 0xC8, 0x23, 0xAD, 0xB9, 0x7C, 0xCB, 0x0A,
+    0xEA, 0x29, 0x77, 0x8C, 0x5E, 0x9D, 0xE2, 0x64, 0xFE, 0x41, 0x89, 0x3A, 0xEA, 0x26, 0x6F, 0x2C,
+    0x1C, 0x73, 0x72, 0x9A, 0xA7, 0x46, 0x69, 0xC6, 0x4D, 0x0B, 0x7F, 0x30, 0x33, 0x1C, 0x73, 0x8D,
+    0x46, 0xC0, 0xA2, 0xD6, 0x4C, 0x8E, 0x99, 0xB2, 0x0D, 0xC8, 0xD6, 0x41, 0x05, 0xAE, 0x29, 0xB2,
+    0xEE, 0x1C, 0x58, 0x2E, 0xBB, 0xE3, 0xC1, 0x79, 0x40, 0x3F, 0xA7, 0x15, 0xC9, 0xBB, 0xA7, 0xE4,
+    0xAF, 0x7E, 0xB3, 0x43, 0x5F, 0xF8, 0xD0, 0x78, 0x01, 0x68, 0x46, 0xFA, 0x82, 0x03, 0x77, 0x72,
+    0x21, 0x9A, 0x51, 0x1D, 0x5D, 0xB5, 0xC5, 0x29, 0x5D, 0x75, 0xC6, 0x3B, 0x6B, 0x68, 0x7B, 0x6F,
+    0xF3, 0xD2, 0x9D, 0xE4, 0x8E, 0x69, 0xA2, 0x63, 0x8B, 0xEE, 0xFF, 0xB5, 0x1A, 0xBF, 0xFE, 0xFD,
+    0x59, 0x18, 0x4D, 0xFC, 0x86, 0xEB, 0x9A, 0xBF, 0x52, 0xC7, 0x4B, 0x77, 0x15, 0x2A, 0xF7, 0x20,
+    0x37, 0xFE, 0x70, 0x43, 0xE7, 0x26, 0x91, 0xC9, 0xF8, 0x17, 0xA3, 0x96, 0xAD, 0x52, 0xFC, 0x42,
+    0xCB, 0x0D, 0x2D, 0x16, 0xC7, 0x23, 0xE2, 0x1A, 0x54, 0x8D, 0xF1, 0xAD, 0x1F, 0xAB, 0x7A, 0x10,
+    0x72, 0x2D, 0x3A, 0xD6, 0xF4, 0x93, 0x50, 0x5F, 0xF0, 0x90, 0xD0, 0x5D, 0xE6, 0xC7, 0x8C, 0x22,
+    0xA8, 0xAE, 0x9A, 0x87, 0x35, 0x4D, 0x1D, 0x66, 0x2C, 0x2C, 0x4C, 0x6F, 0x8F, 0x6B, 0x10, 0xE9,
+    0x66, 0xB2, 0xA6, 0xE9, 0x92, 0xCF, 0xC7, 0x6A, 0x87, 0xA3, 0x5F, 0x13, 0x1A, 0x36, 0x69, 0x6A,
+    0x94, 0xA4, 0xCA, 0xB8, 0xB2, 0xD1, 0xFC, 0x97, 0x62, 0x14, 0x50, 0x2B, 0xD6, 0xEA, 0x9B, 0xDC,
+    0xE2, 0xD6, 0xC9, 0x17, 0x7B, 0xD7, 0xAF, 0x0E, 0x62, 0x66, 0x5E, 0x67, 0x58, 0xE4, 0x09, 0x68,
+    0x63, 0x26, 0xF0, 0x23, 0x3A, 0x18, 0xAE, 0x4E, 0xAE, 0x03, 0x6D, 0xA0, 0xBA, 0xB4, 0xE5, 0x20,
+    0x0B, 0x8B, 0xB0, 0x0E, 0xC1, 0x09, 0x5F, 0xAA, 0xD7, 0x2B, 0xD2, 0x3E, 0xCD, 0xE6, 0xBE, 0xFE,
+    0x11, 0x11, 0x4B, 0x55, 0x01, 0xEF, 0x0C, 0xFF, 0xF4, 0x4A, 0xBC, 0x87, 0x0F, 0x76, 0x73, 0x5E,
+    0xCD, 0x4B, 0x3D, 0xA9, 0xAF, 0x3E, 0x96, 0x8D, 0x49, 0xDC, 0x16, 0x18, 0x76, 0x8C, 0x93, 0xB2,
+    0x6F, 0x72, 0x8F, 0xE0, 0xBD, 0xF5, 0xFA, 0x01, 0xEF, 0x2F, 0x47, 0xD9, 0x6C, 0xAE, 0xE2, 0x37,
+    0xA2, 0x45, 0x1F, 0xFB, 0xA2, 0xB4, 0xAF, 0x74, 0xFC, 0xE3, 0x6A, 0xC8, 0x4C, 0x9E, 0xAA, 0xFE,
+    0x86, 0x23, 0xE7, 0xFD, 0x51, 0x32, 0x25, 0xAE, 0x57, 0xAB, 0xE2, 0x44, 0xEE, 0x6A, 0x1B, 0x61,
+    0x0F, 0x0E, 0x8C, 0xA0, 0x87, 0x1B, 0x5F, 0x66, 0x2E, 0x97, 0x11, 0x29, 0xBD, 0x7D, 0xD9, 0x40,
+    0x92, 0x7B, 0xF8, 0x1D, 0xCB, 0x97, 0xE8, 0x7B, 0xE8, 0x5C, 0x07, 0x61, 0x19, 0xD6, 0xEE, 0x99,
+    0xD1, 0xBE, 0x36, 0x1F, 0x42, 0xF7, 0x33, 0x94, 0x01, 0xA4, 0xE0, 0x0C, 0x99, 0x1F, 0x21, 0x31,
+    0x5A, 0xF9, 0xA1, 0x98, 0xFD, 0x85, 0x44, 0xBB, 0x82, 0xB7, 0x9D, 0xE9, 0x4F, 0x4A, 0xD9, 0xBC,
+    0x8D, 0xDD, 0x2E, 0xF6, 0x75, 0x38, 0xC0, 0x12, 0x36, 0xA8, 0x1F, 0x57, 0x37, 0x9F, 0x64, 0xB3,
+    0xF3, 0xFA, 0x5B, 0xA9, 0x81, 0x8B, 0x5E, 0x25, 0x34, 0x38, 0x28, 0x74, 0x4E, 0x58, 0xA1, 0x6C,
+    0xC2, 0x57, 0x58, 0x40, 0x22, 0x3E, 0xE8, 0x48, 0xBA, 0x6F, 0x4F, 0xC9, 0xC5, 0x06, 0x4D, 0x12,
+    0xDC, 0x48, 0x68, 0xDB, 0xC2, 0x6A, 0x20, 0xA2, 0x99, 0x4E, 0x08, 0x05, 0xB2, 0x8E, 0xB1, 0x61,
+    0x2E, 0x25, 0x67, 0x27, 0x69, 0xB9, 0x04, 0xDB, 0x3A, 0x73, 0xEC, 0xA0, 0xB7, 0x73, 0x88, 0x7E,
+    0x25, 0x4B, 0x33, 0x3B, 0xAC, 0x7F, 0x11, 0x12, 0x3A, 0x49, 0xB5, 0x3A, 0x36, 0x39, 0xD3, 0xCA,
+    0x02, 0xA0, 0xE4, 0xD8, 0x12, 0x5C, 0x98, 0x29, 0x57, 0x69, 0x39, 0x8E, 0x35, 0x12, 0x07, 0x83,
+    0xFE, 0x77, 0xD8, 0x30, 0xB4, 0x34, 0xD2, 0xE6, 0xB1, 0x9A, 0xFF, 0xAC, 0xFC, 0x0D, 0x3B, 0x8A,
+    0x18, 0x1F, 0xF4, 0xE8, 0xBF, 0xE8, 0xE4, 0x26, 0xE5, 0x07, 0xB0, 0xB2, 0x2B, 0xCB, 0x14, 0xFA,
+    0x53, 0x39, 0x64, 0x43, 0xCB, 0x3D, 0xFC, 0x61, 0x90, 0x3A, 0xF6, 0xE8, 0x7B, 0x13, 0xCD, 0x6E,
+    0xA9, 0xA5, 0x66, 0xD0, 0x9E, 0xE2, 0x50, 0xC6, 0xCF, 0xFC, 0x03, 0xB1, 0xD5, 0x7D, 0x0A, 0x62,
+    0x7F, 0xE2, 0x3D, 0x9F, 0x0F, 0x9F, 0x29, 0x99, 0x65, 0x13, 0x69, 0xF2, 0x85, 0x58, 0x07, 0x1D,
+    0x00, 0x66, 0x9D, 0x4B, 0xA8, 0xC9, 0x07, 0x1A, 0x8F, 0x3E, 0xD7, 0x81, 0xA6, 0xDB, 0xE9, 0x32,
+    0xB3, 0xD4, 0x29, 0x6D, 0xB8, 0xBA, 0x41, 0x0F, 0x51, 0xCB, 0x50, 0x74, 0x48, 0x07, 0x97, 0x27,
+    0xC9, 0x23, 0x3C, 0xBD, 0x5B, 0x0F, 0x46, 0x04, 0x38, 0xB5, 0xC0, 0xB6, 0x20, 0x03, 0xFA, 0x56,
+    0x52, 0x9E, 0x27, 0xAC, 0xF1, 0xE7, 0x32, 0x25, 0x72, 0xFC, 0xAB, 0xE5, 0x1F, 0xF0, 0x55, 0x7D,
+    0xED, 0xB8, 0x28, 0x96, 0x47, 0xED, 0x86, 0x45, 0xC9, 0xBA, 0xD1, 0xF6, 0xFA, 0xFC, 0xC6, 0xF6,
+    0x67, 0x45, 0xC4, 0xA9, 0x25, 0xDE, 0xC7, 0x3F, 0x8A, 0xD8, 0x31, 0x3C, 0xB6, 0xE4, 0x0D, 0x7B,
+    0xBE, 0x89, 0x5A, 0x69, 0x80, 0xEB, 0x62, 0xDE, 0xAF, 0x02, 0x6E, 0xD1, 0x4B, 0x2C, 0x7B, 0xCD,
+    0x4D, 0xF1, 0xDF, 0x58, 0x82, 0xD0, 0xE6, 0x6F, 0xB7, 0x45, 0x8E, 0xDF, 0xE6, 0x30, 0x84, 0xC4,
+    0x5D, 0x26, 0xC0, 0x4C, 0x39, 0xC5, 0x2C, 0x99, 0x34, 0x13, 0xF5, 0x32, 0xA3, 0xEE, 0xCF, 0x54,
+    0x5C, 0x58, 0x2B, 0x5D, 0x54, 0xEF, 0xFA, 0x11, 0xC4, 0xBB, 0x1F, 0x34, 0x7C, 0xE6, 0x2F, 0xE4,
+    0xA9, 0xD3, 0x95, 0x8B, 0x58, 0xC7, 0xB5, 0xE2, 0x27, 0xCE, 0xF0, 0xF8, 0xD1, 0x9E, 0x0F, 0x88,
+    0x93, 0x3D, 0x90, 0x0D, 0x15, 0x9A, 0xC3, 0xEA, 0x91, 0xF5, 0xF6, 0xE4, 0x3E, 0x89, 0x01, 0x8A,
+    0x4E, 0x6F, 0xE3, 0x21, 0xB1, 0x93, 0x04, 0x36, 0x30, 0x22, 0x7B, 0x92, 0x7F, 0xCF, 0x06, 0x6B,
+    0xA5, 0x60, 0x8E, 0x15, 0x77, 0x8F, 0x7E, 0x9E, 0xB1, 0xE6, 0xFA, 0x30, 0x4D, 0xD1, 0xC7, 0x20,
+    0xEA, 0xAF, 0xD5, 0xB2, 0x58, 0xD3, 0xAA, 0x74, 0xBC, 0xDD, 0x10, 0x6F, 0x54, 0xFF, 0x15, 0xD4,
+    0xB0, 0x20, 0xD5, 0xDC, 0xF3, 0x89, 0x28, 0x04, 0x4C, 0x69, 0x7E, 0xE9, 0xBF, 0xE5, 0x83, 0x33,
+    0x81, 0x69, 0xE4, 0xB8, 0x46, 0xD8, 0x26, 0x24, 0x51, 0xEE, 0x5B, 0x1D, 0x8E, 0xA0, 0x2B, 0xA2,
+    0xD6, 0x6B, 0x4C, 0x7F, 0xA3, 0xDA, 0xDF, 0x64, 0x4B, 0x79, 0xF8, 0xEA, 0x0D, 0x53, 0x20, 0xB6,
+    0x67, 0xE4, 0x9F, 0xB5, 0xB6, 0x63, 0x1D, 0x6E, 0xDA, 0x91, 0x1C, 0x9C, 0xE1, 0x96, 0x0D, 0x67,
+    0xD4, 0xFE, 0xE9, 0x80, 0xEA, 0x43, 0xF3, 0x6C, 0x7F, 0x9D, 0x1E, 0xCB, 0x9A, 0xB0, 0x29, 0x60,
+    0x68, 0x8C, 0xB9, 0x1B, 0x23, 0x8E, 0x87, 0xBD, 0x27, 0x1A, 0x93, 0xCB, 0xD5, 0x3B, 0x8F, 0x9B,
+    0xF7, 0x5F, 0xF8, 0x5D, 0xA0, 0x90, 0xC8, 0xEC, 0xDB, 0x2E, 0xCC, 0xBB, 0xDA, 0x4A, 0x8E, 0x7E,
+    0xD9, 0x80, 0xC9, 0x7C, 0xEA, 0x17, 0x31, 0x51, 0x0E, 0xB0, 0x3E, 0xC2, 0x45, 0x40, 0x70, 0x7B,
+    0xA4, 0x1B, 0x26, 0x9C, 0xC4, 0x35, 0x38, 0x24, 0x21, 0x6A, 0x33, 0x57, 0x10, 0x7B, 0xE1, 0x00,
+    0x51, 0x24, 0x22, 0x46, 0xC1, 0x95, 0x0F, 0x9C, 0xC1, 0x38, 0x48, 0xD5, 0x19, 0x09, 0x75, 0xBA,
+    0x85, 0x8A, 0x7B, 0x55, 0xD5, 0x8C, 0xD3, 0x51, 0x4D, 0x9B, 0x49, 0xCD, 0xA4, 0xCB, 0x14, 0x11,
+    0xBF, 0x78, 0x52, 0xB1, 0x58, 0x28, 0x50, 0x9B, 0x81, 0x9C, 0xB4, 0x6D, 0xD1, 0xE4, 0x67, 0xED,
+    0x13, 0x47, 0xE9, 0xC4, 0xDE, 0xB2, 0xC2, 0x38, 0x06, 0x58, 0x40, 0x20, 0x85, 0x80, 0x81, 0xF2,
+    0x7A, 0xCF, 0xFC, 0x22, 0x31, 0x27, 0x31, 0x0A, 0x3C, 0xF5, 0xAE, 0xBE, 0x8D, 0xDD, 0x94, 0x80,
+    0x25, 0x73, 0xC5, 0xFD, 0xEB, 0xFA, 0x0C, 0xA8, 0x25, 0x2D, 0xD5, 0x48, 0xF3, 0x48, 0x59, 0x84,
+    0x4C, 0x71, 0x8D, 0x28, 0xA1, 0x7A, 0x19, 0xF7, 0x45, 0xAA, 0x83, 0x15, 0xEA, 0x40, 0x8F, 0x0F,
+    0x90, 0xEF, 0x1F, 0x4E, 0x81, 0xAB, 0xEB, 0x03, 0x4F, 0xD4, 0x59, 0xC5, 0xFB, 0x1E, 0xFA, 0x3E,
+    0x44, 0xB5, 0x48, 0xE2, 0x71, 0x88, 0x18, 0xF3, 0x73, 0x5F, 0xF3, 0x9B, 0x7B, 0xBF, 0x18, 0x17,
+    0xEB, 0x48, 0x5A, 0x5C, 0xCE, 0x54, 0xDA, 0x84, 0xE8, 0xDC, 0x9C, 0x03, 0xC1, 0xD6, 0x70, 0xBF,
+    0x5F, 0x3F, 0xC2, 0x3E, 0x05, 0x73, 0x82, 0x2C, 0xB0, 0x19, 0xCF, 0xDC, 0x7D, 0xD8, 0xF4, 0x27,
+    0x1B, 0xBE, 0x28, 0x9A, 0x0C, 0x22, 0x90, 0x94, 0x60, 0x5A, 0x30, 0x1A, 0xBA, 0xD3, 0x2D, 0xEE,
+    0xFF, 0x1A, 0x7A, 0x4C, 0xC9, 0x7C, 0xB4, 0x4C, 0xB1, 0x88, 0xB9, 0xF9, 0xFC, 0xE7, 0x62, 0x0F,
+    0x54, 0xBC, 0x7A, 0x4E, 0xA6, 0xC6, 0x73, 0xE2, 0x4D, 0x49, 0x59, 0x8B, 0x2A, 0x69, 0x0A, 0x62,
+    0x1D, 0xA4, 0x6B, 0x9C, 0x90, 0x80, 0x82, 0x02, 0x29, 0xBD, 0xF4, 0x04, 0x3A, 0x52, 0x27, 0x85,
+    0x16, 0x81, 0xB5, 0xB9, 0x4E, 0xB5, 0xA4, 0xD7, 0x3B, 0x22, 0x02, 0x71, 0x87, 0xF5, 0x42, 0x8D,
+    0x95, 0x13, 0xF2, 0xB5, 0xD2, 0xDE, 0xC6, 0xC4, 0xD8, 0xB9, 0x09, 0x3D, 0x89, 0x7E, 0xFD, 0x71,
+    0x96, 0x0B, 0x2C, 0xBF, 0xD2, 0xDC, 0x12, 0xE3, 0xE8, 0xD3, 0x4B, 0xE2, 0xA8, 0x99, 0x7A, 0x0E,
+    0xAA, 0xD8, 0x89, 0x34, 0x6B, 0x8B, 0xF9, 0x56, 0x12, 0x23, 0x5C, 0x80, 0xCC, 0x85, 0x13, 0x0D,
+    0x9F, 0x4D, 0xBA, 0xBB, 0x66, 0xE4, 0x44, 0x6D, 0x37, 0xF2, 0x26, 0x57, 0x4C, 0x21, 0xE1, 0x99,
+    0x96, 0xEE, 0x61, 0x80, 0xC3, 0x22, 0x51, 0x2A, 0xD8, 0x70, 0x4B, 0x10, 0x0B, 0x03, 0xF9, 0x13,
+    0x72, 0x5E, 0xD8, 0x85, 0x81, 0x33, 0x66, 0x97, 0x7D, 0xAC, 0x18, 0x08, 0xE8, 0x24, 0xC1, 0x6C,
+    0x5F, 0xD6, 0xA3, 0x99, 0xC6, 0x50, 0x54, 0x61, 0x90, 0xF0, 0x3B, 0xBF, 0xF3, 0x12, 0x74, 0x8C,
+    0x24, 0x38, 0xEB, 0xC5, 0x7A, 0xF1, 0x14, 0x33, 0x59, 0x8E, 0x57, 0x0F, 0x66, 0xF7, 0x9C, 0xC2,
+    0xE5, 0x2A, 0x39, 0x88, 0xE6, 0x5F, 0x5C, 0x80, 0xD9, 0xDB, 0x1D, 0x80, 0xF5, 0xCF, 0xA9, 0xFC,
+    0x2F, 0x81, 0x37, 0x11, 0x90, 0x8D, 0x91, 0xD7, 0x7A, 0x76, 0x18, 0x31, 0x80, 0x97, 0xA1, 0x24,
+    0xB2, 0x86, 0x7F, 0x01, 0x28, 0xB2, 0xA0, 0x78, 0x4F, 0x30, 0xCA, 0x37, 0xC4, 0xFC, 0xCA, 0xC2,
+    0xC4, 0xE1, 0xD0, 0x62, 0x9E, 0x11, 0x00, 0x12, 0x29, 0xD2, 0x1A, 0x5B, 0x7D, 0x50, 0x69, 0xBF,
+    0x32, 0xA3, 0xFF, 0x13, 0x26, 0x30, 0x6D, 0xB7, 0xB2, 0x26, 0xAC, 0xE4, 0x74, 0x94, 0x92, 0xA0,
+    0xFB, 0x8F, 0xF4, 0xB0, 0x9D, 0xAA, 0xA4, 0x00, 0x7F, 0x3B, 0xCC, 0xC9, 0xD4, 0x67, 0xCA, 0xAD,
+    0xB7, 0xB8, 0xB9, 0xD4, 0x01, 0x27, 0x6C, 0x8E, 0x8F, 0x16, 0x41, 0x13, 0xE5, 0xB5, 0x81, 0x3A,
+    0x29, 0x3C, 0x21, 0x16, 0x3E, 0x49, 0x8B, 0x15, 0x59, 0x21, 0x8B, 0x14, 0xAB, 0x53, 0x58, 0x8A,
+    0xC6, 0x02, 0x15, 0x41, 0x38, 0x9A, 0x25, 0x45, 0xBC, 0xF7, 0x84, 0x0B, 0xD7, 0x2F, 0x98, 0x4D,
+    0xBA, 0x56, 0x9F, 0x3C, 0x0D, 0x86, 0x1F, 0xDC, 0x40, 0x2D, 0x31, 0xA9, 0xB0, 0xBE, 0x84, 0x51,
+    0x58, 0xEC, 0x2F, 0xFB, 0x4E, 0x36, 0x09, 0xAE, 0x5A, 0x7E, 0xAA, 0x1D, 0xFC, 0xF5, 0x91, 0x9A,
+    0x28, 0xA2, 0x58, 0x3B, 0xB6, 0x9D, 0xB5, 0x12, 0xB7, 0x70, 0x7D, 0x64, 0x52, 0xB3, 0xC4, 0x07,
+    0xFA, 0x3A, 0xAA, 0x85, 0xA4, 0x1A, 0x4E, 0x47, 0xB0, 0xD0, 0x44, 0x75, 0x77, 0xA2, 0xFB, 0xB3,
+    0xE3, 0x27, 0x55, 0xD0, 0x1F, 0x3C, 0x9E, 0x2A, 0xB9, 0x41, 0x1D, 0x50, 0x98, 0x7E, 0xE9, 0xC9,
+    0xA7, 0x3C, 0x0B, 0xB1, 0x96, 0x74, 0xFC, 0xDB, 0xB6, 0x35, 0xAC, 0xD3, 0x89, 0xCA, 0x3B, 0x79,
+    0x32, 0x81, 0x70, 0x5C, 0xEE, 0x35, 0x79, 0x55, 0xDC, 0x77, 0x85, 0x01, 0x68, 0xE7, 0xA4, 0xB9,
+    0x9E, 0xDA, 0x55, 0xA1, 0xDF, 0x9A, 0xF5, 0xEA, 0xF0, 0xE1, 0x4F, 0x59, 0xB4, 0x13, 0xD7, 0xAC,
+    0x12, 0xF5, 0x06, 0xA2, 0x82, 0x01, 0xA1, 0xB5, 0x04, 0x9B, 0x00, 0x62, 0x11, 0xEF, 0xF9, 0x82,
+    0x8E, 0x00, 0x4D, 0x0C, 0x16, 0x4C, 0x0C, 0x80, 0xC7, 0x33, 0xCB, 0x0A, 0x43, 0xC3, 0x90, 0x47,
+    0x79, 0xCD, 0xEA, 0x96, 0xDC, 0xDE, 0x7C, 0xB9, 0x1D, 0x0C, 0xB1, 0xBC, 0x0F, 0x8B, 0x76, 0xE5,
+    0xBD, 0xD0, 0x59, 0x76, 0x08, 0x79, 0xE4, 0xF3, 0xE1, 0xB3, 0x12, 0xF1, 0x94, 0x14, 0x79, 0xBF,
+    0xAC, 0x22, 0x4E, 0x57, 0x7B, 0xCB, 0x5B, 0xBF, 0xE4, 0x9D, 0x16, 0x18, 0xA2, 0xB3, 0x2D, 0x04,
+    0x3A, 0x11, 0xC9, 0x18, 0x6D, 0xCC, 0x99, 0xB5, 0xB5, 0x36, 0xF5, 0x49, 0x4B, 0xEC, 0x60, 0x3E,
+    0x22, 0x9A, 0x73, 0x60, 0x91, 0x2F, 0x4F, 0x70, 0xB7, 0xA4, 0x48, 0x61, 0xCB, 0x0D, 0x17, 0x84,
+    0x61, 0xF1, 0xAD, 0x7F, 0xEE, 0xEC, 0x72, 0x18, 0x60, 0x6D, 0xAC, 0xEE, 0xDB, 0xC1, 0xC2, 0x81,
+    0xF1, 0x03, 0x74, 0xA2, 0x5A, 0xA9, 0xC8, 0x0E, 0x52, 0x85, 0xDD, 0x1D, 0x12, 0xBE, 0x1C, 0xC4,
+    0x58, 0x0F, 0x62, 0xEE, 0x17, 0xD4, 0xF5, 0x7F, 0xDB, 0xF4, 0x1B, 0xDF, 0x2D, 0x18, 0x6D, 0x0B,
+    0x47, 0xDB, 0xFF, 0xAF, 0x70, 0xE6, 0xA1, 0x52, 0x60, 0x9E, 0xFC, 0x83, 0xCC, 0x76, 0xB3, 0xAF,
+    0xED, 0x23, 0x21, 0xBB, 0x7D, 0xBE, 0x7E, 0x59, 0x7F, 0x3A, 0x22, 0x10, 0x8F, 0x43, 0x4E, 0x65,
+    0xC6, 0xBC, 0xEB, 0xE0, 0x63, 0x82, 0x78, 0xB8, 0xD5, 0xD0, 0xE7, 0xDA, 0x44, 0xF2, 0x1A, 0xBD,
+    0x75, 0x46, 0xF7, 0x2A, 0xFE, 0x5F, 0x2A, 0x95, 0xB3, 0x4F, 0x51, 0xC2, 0xD1, 0x24, 0xEA, 0x88,
+    0x06, 0x88, 0x8E, 0xCB, 0x33, 0xA8, 0x71, 0xC3, 0x89, 0x4E, 0xD4, 0x25, 0xBC, 0x87, 0x1C, 0x05,
+    0x87, 0x74, 0xF5, 0x99, 0x90, 0x58, 0xA1, 0x2E, 0x14, 0x13, 0x25, 0xD6, 0xCB, 0x5C, 0xE5, 0xA8,
+    0x46, 0xA6, 0x71, 0x68, 0x72, 0x66, 0x48, 0xD8, 0x92, 0x8F, 0x75, 0xAC, 0xB7, 0x14, 0x32, 0x42,
+    0xB9, 0x9D, 0x57, 0xF9, 0xD2, 0x8E, 0x85, 0x27, 0x92, 0xA8, 0xCC, 0x1A, 0x26, 0x33, 0x76, 0x06,
+    0x1A, 0xB6, 0x27, 0x56, 0x5D, 0x8E, 0xDC, 0x1F, 0xFC, 0xBA, 0x3F, 0x6A, 0x67, 0xFF, 0x9B, 0x14,
+    0xFF, 0x90, 0xE7, 0x8E, 0xED, 0x2D, 0x8B, 0x5E, 0x22, 0x84, 0xA2, 0x06, 0x8F, 0xFD, 0x25, 0x02,
+    0xFD, 0x3D, 0x92, 0x41, 0xE5, 0x49, 0x2D, 0x43, 0x6A, 0x9B, 0x1E, 0xA5, 0x46, 0xC9, 0xA9, 0xDC,
+    0x2D, 0x8E, 0x75, 0xE2, 0x1B, 0x8D, 0x8F, 0x23, 0x59, 0x2E, 0x21, 0x5D, 0x3C, 0x0A, 0x41, 0xC5,
+    0x27, 0xD2, 0x76, 0x9A, 0xCA, 0x7D, 0xAC, 0x65, 0x31, 0xC8, 0xAD, 0xB6, 0xBD, 0x19, 0x88, 0x08,
+    0x7A, 0x91, 0x74, 0xAD, 0x23, 0x14, 0x60, 0xC3, 0x93, 0xCE, 0xF2, 0x10, 0xCF, 0xE3, 0xF1, 0xF7,
+    0x3F, 0xD2, 0x1F, 0xD1, 0x91, 0x9B, 0x9C, 0xE9, 0xB9, 0xD7, 0xE5, 0xFA, 0x8F, 0xAD, 0xB1, 0x95,
+    0x03, 0x28, 0xB4, 0x20, 0x46, 0xA2, 0xBD, 0x23, 0x1A, 0x32, 0xB0, 0x23, 0x65, 0x54, 0x93, 0x87,
+    0x4F, 0xF1, 0x3A, 0xA7, 0x8A, 0xD5, 0x0F, 0x59, 0xC7, 0xD6, 0x7E, 0xBE, 0x6B, 0xFB, 0x66, 0x8A,
+    0x1E, 0x48, 0xD3, 0xCB, 0xC3, 0x78, 0xBC, 0x2A, 0x07, 0x57, 0x66, 0xD4, 0x83, 0x95, 0xE1, 0x67,
+    0xDA, 0xE8, 0x0D, 0x68, 0x86, 0xE8, 0xF7, 0xBF, 0x05, 0x4F, 0xB0, 0x41, 0x0C, 0xE6, 0x72, 0x9C,
+    0xB4, 0xBF, 0x93, 0x59, 0xE5, 0x97, 0xAC, 0x7B, 0xB0, 0x93, 0x0E, 0xEC, 0xE6, 0xC2, 0xC1, 0x0E,
+    0x06, 0x81, 0x69, 0xF6, 0x27, 0xE4, 0xCA, 0x2D, 0xE0, 0x76, 0x9E, 0x0A, 0x03, 0xE3, 0x60, 0xD1,
+    0xAB, 0x4C, 0x63, 0xCC, 0x03, 0x7E, 0xBC, 0x4A, 0x58, 0x74, 0x94, 0xEF, 0x96, 0xB7, 0x33, 0xE8,
+    0x80, 0x56, 0xBD, 0xEC, 0x3F, 0xD6, 0x75, 0x6F, 0xF6, 0xFE, 0x85, 0x0B, 0x0A, 0x30, 0x30, 0xBE,
+    0x0D, 0x7F, 0x5B, 0x15, 0xD2, 0x0B, 0x7D, 0xA3, 0x2B, 0xB7, 0xE7, 0xE9, 0x17, 0x4C, 0x94, 0xE1,
+    0x70, 0xED, 0xF7, 0x40, 0x94, 0x3B, 0x3A, 0xCA, 0xCE, 0xF5, 0xB2, 0xF3, 0x8A, 0x69, 0x61, 0x57,
+    0x5F, 0x64, 0xC5, 0xBC, 0x0F, 0x78, 0x15, 0x9C, 0xF8, 0x30, 0x3A, 0xA4, 0xC2, 0xD8, 0x35, 0xA8,
+    0x1B, 0xFA, 0x65, 0xAE, 0x78, 0x2A, 0x2B, 0x0E, 0x8C, 0xF7, 0x7E, 0x81, 0x43, 0x0E, 0x15, 0x05,
+    0xC6, 0x76, 0x7B, 0x29, 0xA6, 0x26, 0xDE, 0xA0, 0xF0, 0x38, 0x39, 0x8B, 0x33, 0x8D, 0x38, 0xD6,
+    0x84, 0x69, 0x55, 0xF6, 0x5A, 0x6E, 0xBE, 0x7E, 0x18, 0x41, 0x4A, 0x4D, 0xF5, 0x7A, 0x86, 0x8B,
+    0xCE, 0x48, 0xDD, 0xF5, 0x80, 0xEE, 0x57, 0x05, 0x99, 0x97, 0xA9, 0xCE, 0x26, 0x68, 0x20, 0xA4,
+    0x9C, 0x84, 0x00, 0x88, 0x0A, 0x7F, 0x7B, 0x74, 0x12, 0xE6, 0x60, 0xF7, 0xD9, 0xE7, 0xB4, 0x46,
+    0x59, 0x1A, 0x84, 0x1E, 0x08, 0x20, 0x2E, 0x74, 0x51, 0xAE, 0x95, 0xD7, 0x77, 0x5A, 0x6A, 0x9B,
+    0x0B, 0xFF, 0xB5, 0x5D, 0x65, 0xDC, 0x35, 0x6E, 0x00, 0xAF, 0x01, 0x73, 0x41, 0x82, 0x92, 0x29,
+    0x9B, 0x67, 0x38, 0x86, 0xE4, 0x1A, 0x2A, 0xDA, 0xBF, 0x23, 0xEC, 0x17, 0x97, 0x13, 0x1B, 0x32,
+    0x58, 0x31, 0x2F, 0x4E, 0x6D, 0x8E, 0x39, 0x99, 0x7B, 0x9D, 0xEB, 0xBE, 0x47, 0xC5, 0x22, 0x81,
+    0x64, 0xAE, 0x0B, 0x0D, 0xBC, 0x33, 0x6C, 0x0B, 0x30, 0xDE, 0xD0, 0xA4, 0x8D, 0xB2, 0x9E, 0xFB,
+    0x02, 0x6C, 0xDC, 0xD3, 0x3E, 0xCF, 0xD6, 0x49, 0x76, 0x22, 0xF2, 0x21, 0x76, 0x26, 0xDE, 0x32,
+    0x65, 0xAC, 0x1E, 0x68, 0x2F, 0xC5, 0xF3, 0x78, 0x07, 0x15, 0x08, 0xAF, 0x74, 0xD0, 0x81, 0x13,
+    0x45, 0xAB, 0x14, 0xD4, 0x59, 0x46, 0x24, 0x9F, 0x75, 0x12, 0x0E, 0xBB, 0xDC, 0x6E, 0x4D, 0x44,
+    0xD3, 0x28, 0x2D, 0x64, 0xA8, 0xD6, 0x71, 0xE2, 0xE0, 0x8B, 0xD2, 0xF4, 0xBD, 0xFC, 0x97, 0x30,
+    0x0C, 0xAC, 0x52, 0x3A, 0x06, 0xE6, 0x3A, 0x24, 0x09, 0xF5, 0xEE, 0xDB, 0x6C, 0x0A, 0x34, 0xCC,
+    0xF4, 0xEF, 0x97, 0x39, 0x4B, 0x0E, 0x51, 0xC4, 0x3F, 0x04, 0xC6, 0x79, 0xFC, 0xFC, 0x2C, 0x66,
+    0x7C, 0x74, 0x9C, 0xF6, 0x42, 0x98, 0x57, 0xE2, 0x78, 0x24, 0x72, 0x0A, 0xF2, 0x3B, 0x82, 0x22,
+    0xE6, 0x33, 0x80, 0xBC, 0x9A, 0xF5, 0x0D, 0x59, 0x5D, 0xEC, 0x04, 0xD1, 0x63, 0x37, 0x61, 0xB6,
+    0xBA, 0x30, 0x50, 0x1D, 0xC8, 0x3B, 0xF9, 0x41, 0xC1, 0x4A, 0x70, 0xEF, 0x01, 0x8C, 0xFD, 0x8C,
+    0xCF, 0xE3, 0xE1, 0x00, 0x94, 0xA0, 0xB7, 0xE8, 0xFA, 0xB9, 0x29, 0x36, 0xFD, 0x8B, 0x39, 0x86,
+    0x32, 0x48, 0xE6, 0xA1, 0x3B, 0x2C, 0xB7, 0xDB, 0xF3, 0x81, 0xAA, 0x06, 0x45, 0x7F, 0x2F, 0x2B,
+    0x82, 0xC7, 0xEB, 0x4A, 0x24, 0x35, 0x4F, 0x77, 0x9E, 0xCE, 0xF1, 0xDE, 0x01, 0xCB, 0x43, 0x5B,
+    0x39, 0x3F, 0x48, 0xDF, 0xEB, 0x6E, 0x16, 0xFA, 0x3B, 0x9D, 0x76, 0x7E, 0xEA, 0xB6, 0x1B, 0x49,
+    0x21, 0x35, 0x3C, 0xEC, 0x9B, 0x22, 0x65, 0x23, 0x8C, 0x1C, 0xA5, 0xF2, 0xD9, 0xA1, 0x9C, 0xE0,
+    0x5D, 0x9A, 0xFC, 0xE0, 0x6B, 0x78, 0x45, 0xEF, 0xBC, 0xCC, 0x8A, 0x7C, 0xE0, 0x70, 0xDB, 0xD6,
+    0xB1, 0x9A, 0xB3, 0x9D, 0x45, 0x3B, 0x9D, 0xE0, 0x23, 0x82, 0xF6, 0x9D, 0x6F, 0x0C, 0xF5, 0x7D,
+    0xB7, 0x41, 0x51, 0x4C, 0x02, 0xB7, 0x8D, 0xB5, 0x30, 0x9F, 0xF8, 0xD7, 0x50, 0x72, 0xF8, 0xAD,
+    0x2A, 0x54, 0x0F, 0xF9, 0x2D, 0x08, 0x1C, 0x32, 0x3C, 0xEE, 0xB3, 0x06, 0x73, 0x2B, 0x27, 0xEC,
+    0x81, 0xB6, 0x73, 0xC2, 0xAE, 0xF0, 0xE0, 0x16, 0x58, 0x55, 0x56, 0xC1, 0x0E, 0x89, 0xC2, 0xA7,
+    0xCA, 0xFD, 0x9A, 0x02, 0xC6, 0xB7, 0x68, 0xBD, 0x10, 0xFF, 0x82, 0x81, 0x58, 0x77, 0x9F, 0x55,
+    0x62, 0xC9, 0x80, 0xE9, 0x68, 0xE4, 0xBE, 0x8B, 0xDD, 0xAC, 0x28, 0xF8, 0xE5, 0xC6, 0xC4, 0x6C,
+    0x77, 0xA3, 0x4F, 0xB4, 0x3F, 0xDC, 0x64, 0x70, 0xF8, 0x32, 0x87, 0x19, 0x97, 0x2F, 0xEE, 0x04,
+    0xE1, 0x92, 0x4E, 0x73, 0x28, 0x6F, 0x1B, 0x62, 0xCD, 0xD6, 0xD9, 0x7C, 0x6C, 0x5D, 0x09, 0x1F,
+    0x9C, 0x0A, 0x72, 0x6D, 0xE7, 0x78, 0xA4, 0xA8, 0xEE, 0xF0, 0xA1, 0x3B, 0x03, 0x9E, 0xDF, 0x19,
+    0x46, 0xD7, 0x0B, 0x8F, 0x1B, 0xCC, 0x9C, 0xD6, 0x3A, 0xB6, 0x98, 0x42, 0x4C, 0x7C, 0xD4, 0x59,
+    0xC4, 0xBD, 0x86, 0x9E, 0x79, 0x01, 0x05, 0x7C, 0xA7, 0xC4, 0xD5, 0xC4, 0xA4, 0xD7, 0xB2, 0x8A,
+    0x15, 0x3C, 0x08, 0x12, 0xFF, 0x0E, 0xF1, 0x20, 0x9A, 0x5C, 0x57, 0x2A, 0xDE, 0xF2, 0x21, 0xA7,
+    0xFB, 0xF2, 0xA7, 0xE9, 0x37, 0xA8, 0x73, 0x45, 0xE8, 0xD4, 0xAC, 0x2F, 0x06, 0xC8, 0x6E, 0x04,
+    0xDE, 0xF7, 0xE2, 0xF6, 0xD1, 0xA3, 0xC0, 0x7B, 0xD9, 0x77, 0xEF, 0x53, 0x74, 0xEA, 0xBE, 0x23,
+    0xD2, 0x7E, 0xF0, 0xF0, 0x56, 0xAC, 0x95, 0x80, 0xF3, 0x53, 0xEE, 0x47, 0x1D, 0x76, 0x30, 0x21,
+    0xC8, 0xAD, 0x46, 0x73, 0x8B, 0x1F, 0x4A, 0xB1, 0x48, 0x4F, 0xE7, 0x3B, 0x92, 0xC0, 0xA7, 0x68,
+    0xF3, 0x53, 0xC7, 0xD4, 0x51, 0xA8, 0xF6, 0xC9, 0x85, 0xAD, 0xBF, 0xB9, 0x6A, 0x31, 0x0E, 0x0C,
+    0x7E, 0x64, 0x6F, 0x50, 0x99, 0x31, 0xE4, 0x13, 0xA6, 0xBF, 0xEA, 0xFF, 0x09, 0x1A, 0xA7, 0xD8,
+    0xD6, 0x42, 0xA7, 0x62, 0x4F, 0xAC, 0x87, 0x4B, 0xBA, 0xB7, 0xBE, 0x50, 0x5A, 0x09, 0x43, 0xD7,
+    0x4F, 0x9B, 0x27, 0x05, 0x78, 0xEB, 0xB2, 0x16, 0x6C, 0xCA, 0x18, 0x41, 0x58, 0xF2, 0x24, 0xF9,
+    0xED, 0xBB, 0xF6, 0x96, 0x2F, 0xF3, 0xCB, 0x4A, 0xE9, 0xF8, 0x25, 0x4A, 0x6E, 0x8E, 0x32, 0xB6,
+    0x51, 0x17, 0x29, 0x98, 0x9B, 0x41, 0xE7, 0x23, 0x80, 0xEA, 0x17, 0x84, 0xAB, 0xF1, 0x94, 0x81,
+    0xFE, 0xB4, 0x30, 0xA8, 0xF8, 0x59, 0x33, 0x28, 0xAE, 0xF5, 0x24, 0x20, 0x7E, 0x78, 0x54, 0x7C,
+    0xD5, 0xE9, 0xBA, 0xC1, 0x12, 0xA2, 0x71, 0xD6, 0x1D, 0x5E, 0xE2, 0x5B, 0xF3, 0x26, 0xAA, 0x0B,
+    0x96, 0x68, 0x46, 0x63, 0x1D, 0x71, 0x38, 0x8C, 0xB4, 0x29, 0x18, 0x92, 0x22, 0x6A, 0x0A, 0x67,
+    0x70, 0xC2, 0x14, 0xEC, 0x4F, 0x0F, 0x3B, 0x43, 0x27, 0x6F, 0xF5, 0x1B, 0xE0, 0x7B, 0xEB, 0x35,
+    0x3A, 0x6F, 0x7C, 0xA5, 0x9C, 0xBC, 0x17, 0x2D, 0xF5, 0xC0, 0x7D, 0x67, 0xE2, 0xF1, 0x0D, 0x00,
+    0x04, 0xD4, 0x68, 0x9F, 0xB8, 0x48, 0xFE, 0xB6, 0xA8, 0x6F, 0xFD, 0xCB, 0x34, 0x94, 0xFA, 0x2D,
+    0xFA, 0x46, 0x3E, 0x11, 0x2D, 0xF5, 0xBB, 0x2B, 0xD2, 0x92, 0x92, 0x0E, 0x37, 0xEB, 0x7E, 0x84,
+    0xF9, 0xFD, 0x3B, 0x22, 0xD3, 0xCD, 0xFC, 0x46, 0xEF, 0x21, 0x35, 0x91, 0x19, 0xCF, 0x1F, 0xE0,
+    0xFE, 0x5C, 0x1A, 0x49, 0x38, 0x95, 0xE0, 0x40, 0x1D, 0x4A, 0xB8, 0xB7, 0xBB, 0xB8, 0x52, 0x08,
+    0x37, 0x72, 0xE4, 0xF6, 0xE8, 0x42, 0x0A, 0xAB, 0x1E, 0xF0, 0x74, 0x7B, 0xFB, 0x9E, 0x94, 0x4C,
+    0x87, 0xF5, 0xEE, 0x0D, 0x9E, 0x07, 0x10, 0x79, 0x0C, 0x02, 0xA7, 0xE6, 0x4A, 0xBF, 0xAB, 0xAD,
+    0x71, 0x5F, 0x31, 0xE1, 0xD5, 0x39, 0x1E, 0x72, 0x53, 0x93, 0xA4, 0x38, 0xB4, 0x04, 0x79, 0xA3,
+    0x72, 0xCD, 0xBC, 0x29, 0x3E, 0x9F, 0x63, 0xF4, 0x87, 0xB5, 0xB8, 0x99, 0xFC, 0x4E, 0x9D, 0xD2,
+    0xD9, 0x6F, 0xD5, 0x16, 0x1D, 0x01, 0xF8, 0x43, 0x22, 0x6B, 0xF9, 0xF8, 0xF8, 0x7E, 0x03, 0xD1,
+    0xF0, 0xC9, 0x8B, 0x97, 0x78, 0x12, 0xF1, 0xE8, 0x23, 0x88, 0x53, 0xD3, 0x73, 0x8D, 0x8D, 0x5D,
+    0x64, 0x7F, 0xD8, 0x5E, 0x15, 0xA6, 0x4E, 0x31, 0xE5, 0x8F, 0x1E, 0x7C, 0x8F, 0xC7, 0x60, 0x86,
+    0x2B, 0x4F, 0x69, 0x0E, 0x2C, 0x39, 0x8B, 0xFC, 0xF4, 0x5C, 0xF4, 0x0A, 0x63, 0x4E, 0xE5, 0xCA,
+    0x46, 0x6B, 0x15, 0xF3, 0x9B, 0x7E, 0xBB, 0xD9, 0xA1, 0x87, 0x50, 0x36, 0x23, 0xEF, 0x37, 0x88,
+    0xE3, 0x89, 0xAB, 0x5F, 0x0A, 0x07, 0xB4, 0x5F, 0xF8, 0x45, 0xBB, 0xE8, 0x12, 0x10, 0xE8, 0x95,
+    0xB6, 0x13, 0xEF, 0x51, 0xA2, 0x24, 0x12, 0x7F, 0x6D, 0x05, 0x0E, 0x94, 0xF9, 0x92, 0xB8, 0x2E,
+    0x64, 0x40, 0xDC, 0xDA, 0xDC, 0xDE, 0x82, 0x81, 0x9C, 0xE0, 0x0A, 0x27, 0xC6, 0x06, 0xB5, 0x01,
+    0xBF, 0x36, 0x76, 0xF8, 0xB1, 0xE5, 0x3C, 0x42, 0xC3, 0x07, 0xE7, 0xBD, 0xFC, 0x7B, 0xFD, 0x70,
+    0x4C, 0x17, 0x8F, 0x21, 0x9B, 0xBA, 0x06, 0xFC, 0x34, 0x56, 0xDD, 0x23, 0x7E, 0x2C, 0x8D, 0xF8,
+    0x99, 0xD6, 0x69, 0xDA, 0x75, 0x42, 0x84, 0x43, 0xDB, 0x51, 0x12, 0xA0, 0x78, 0xEC, 0x95, 0x87,
+    0x86, 0x84, 0xC9, 0x21, 0xEF, 0x8C, 0x0D, 0xEA, 0xBC, 0xE7, 0x5A, 0x23, 0x01, 0xB1, 0xBD, 0x6A,
+    0x23, 0x49, 0x1C, 0x42, 0xED, 0x39, 0x5D, 0x26, 0xEF, 0x54, 0x36, 0x5E, 0xE8, 0xA8, 0xB0, 0xC9,
+    0xF2, 0x39, 0xD0, 0x49, 0x10, 0x89, 0x2A, 0xF3, 0x4F, 0x3B, 0x3F, 0xF3, 0x6F, 0x98, 0xC0, 0xA2,
+    0x37, 0xC5, 0x98, 0xCB, 0x7A, 0xE6, 0x78, 0x11, 0x15, 0x97, 0x77, 0x7D, 0x34, 0xE5, 0x67, 0x61,
+    0x8B, 0xC7, 0x2B, 0xA2, 0xE8, 0x67, 0x3F, 0xBA, 0xD6, 0xEC, 0xC1, 0x5B, 0xF7, 0x4E, 0x70, 0xC3,
+    0x1A, 0x98, 0x20, 0x05, 0xBA, 0x2D, 0x2B, 0x79, 0xB8, 0x10, 0xA3, 0x74, 0xC9, 0x50, 0xEC, 0x90,
+    0x3C, 0xA9, 0xF8, 0xF7, 0xF9, 0x9F, 0xF9, 0xE1, 0x8E, 0x92, 0x40, 0xEE, 0x62, 0xCE, 0x36, 0x70,
+    0x90, 0xAA, 0x3D, 0x17, 0xDF, 0x78, 0x8D, 0x49, 0xC1, 0x77, 0x9F, 0xF0, 0xBC, 0x8A, 0xF6, 0x06,
+    0x90, 0xF5, 0x13, 0x51, 0xA7, 0x1B, 0xB8, 0x7B, 0x15, 0xAE, 0xBA, 0x54, 0x90, 0xCA, 0x01, 0x0C,
+    0xB0, 0x82, 0xF1, 0xA6, 0x36, 0x0E, 0x1F, 0x40, 0x38, 0x19, 0xE5, 0x3D, 0x22, 0x12, 0x0A, 0xB7,
+    0x17, 0x5D, 0x47, 0x46, 0x85, 0xE9, 0x40, 0xC3, 0x90, 0x6D, 0xAE, 0xBE, 0x95, 0xCA, 0xA1, 0x00,
+    0x47, 0x6C, 0x6E, 0xCE, 0xBF, 0xAB, 0x0A, 0x9B, 0x73, 0x86, 0x4C, 0x64, 0x73, 0x7D, 0xF4, 0x01,
+    0xCF, 0x4F, 0x4F, 0xBD, 0xFB, 0xC5, 0x37, 0xC1, 0x95, 0xAC, 0xCE, 0x58, 0x0A, 0x58, 0x26, 0x67,
+    0xF2, 0x0B, 0x10, 0x13, 0xC5, 0x8D, 0x72, 0xAC, 0xCE, 0xC2, 0x7B, 0x74, 0xB6, 0x4A, 0xB6, 0x0A,
+    0x8B, 0xD9, 0x27, 0x3A, 0x3D, 0x15, 0x42, 0xA4, 0xF5, 0xC3, 0x04, 0x91, 0x64, 0x05, 0xF1, 0x44,
+    0x27, 0x9D, 0xBE, 0xB6, 0x24, 0xDA, 0x68, 0x7B, 0xDB, 0x5C, 0xF7, 0x02, 0x72, 0xF4, 0xBC, 0x88,
+    0xF6, 0x8A, 0xE1, 0x45, 0xE8, 0x9D, 0x06, 0x5F, 0x37, 0x61, 0xF5, 0xD4, 0xE8, 0x37, 0xAA, 0xE7,
+    0x79, 0xAA, 0x7C, 0x21, 0x93, 0x0C, 0x66, 0x95, 0x63, 0xE8, 0x25, 0xAD, 0xCB, 0xBD, 0x29, 0x96,
+    0x7A, 0x87, 0x76, 0x18, 0xC4, 0x97, 0x74, 0x24, 0xF4, 0x00, 0x00, 0x0E, 0x7E, 0xB1, 0xAD, 0x5D,
+    0xF1, 0x63, 0x3C, 0xF0, 0xA3, 0x21, 0x91, 0x04, 0x15, 0x5C, 0xCD, 0xEC, 0xA3, 0xDC, 0x39, 0x7A,
+    0x85, 0x12, 0xFC, 0x4C, 0x7B, 0xF6, 0x01, 0x9D, 0xBC, 0x64, 0x31, 0x27, 0xFB, 0x20, 0x69, 0xB2,
+    0x95, 0x8A, 0xB8, 0x53, 0x15, 0x0D, 0xE8, 0x12, 0x44, 0xA5, 0x96, 0x91, 0x19, 0xA1, 0xB5, 0x77,
+    0xA2, 0xD2, 0x91, 0x63, 0xB2, 0x3B, 0x8C, 0x29, 0x5A, 0x77, 0xCB, 0x9A, 0x82, 0x17, 0x7C, 0xEB,
+    0x9A, 0x8D, 0x1D, 0x38, 0xFD, 0x0D, 0x33, 0x62, 0xD3, 0xF1, 0x90, 0xA1, 0x41, 0x90, 0x85, 0x10,
+    0x28, 0x1C, 0x73, 0x77, 0xD6, 0x64, 0xAE, 0xDE, 0x21, 0x5D, 0xE6, 0xD0, 0xBE, 0x59, 0xA8, 0x04,
+    0xB1, 0xF1, 0x70, 0xA3, 0xDA, 0xD6, 0xB0, 0xBC, 0x7F, 0x3D, 0x60, 0x91, 0x38, 0xA3, 0xC9, 0xC1,
+    0xBE, 0xA0, 0xD6, 0x4A, 0x8E, 0x33, 0xF6, 0x1A, 0x99, 0x20, 0xBF, 0xFC, 0x38, 0x9F, 0xD6, 0x66,
+    0x6A, 0x61, 0xF7, 0xB0, 0x09, 0xC3, 0xB2, 0xD3, 0xC1, 0xA1, 0xB3, 0xB4, 0x6A, 0xE3, 0x94, 0xF5,
+    0x92, 0xD3, 0xC0, 0xB6, 0x12, 0x53, 0x7A, 0xAC, 0x1E, 0x69, 0x58, 0x3B, 0x1C, 0x0F, 0x69, 0x9E,
+    0x0E, 0xAA, 0xF4, 0xF2, 0x12, 0xAE, 0x66, 0x3B, 0x40, 0x4A, 0xC3, 0x19, 0x15, 0xDA, 0x08, 0x58,
+    0x73, 0x1A, 0x9D, 0x18, 0xAD, 0xA7, 0xA3, 0x66, 0xD1, 0x5D, 0x9A, 0x36, 0x4E, 0xF0, 0xA5, 0x69,
+    0x33, 0xD0, 0x8A, 0x11, 0x2E, 0xBA, 0x33, 0xCB, 0xBE, 0x4F, 0x63, 0x9D, 0x97, 0x50, 0x26, 0x96,
+    0x8F, 0x6F, 0x4D, 0x30, 0x80, 0x72, 0x28, 0x5E, 0xA8, 0x74, 0x8E, 0x42, 0x9D, 0x15, 0xDA, 0xAC,
+    0x36, 0x74, 0x91, 0xFA, 0x29, 0x8F, 0x54, 0xF5, 0x06, 0xCC, 0x80, 0x78, 0xED, 0x76, 0xDA, 0x3D,
+    0x86, 0x9D, 0x9D, 0x3D, 0xA4, 0xA4, 0x7E, 0x9A, 0x80, 0xCC, 0x90, 0x7C, 0x90, 0x14, 0x8D, 0x33,
+    0x30, 0x8B, 0xCB, 0x17, 0x36, 0xBB, 0xAF, 0xA7, 0xE6, 0x7C, 0xA3, 0xE1, 0x7D, 0xB0, 0xA1, 0x9A,
+    0xA6, 0x28, 0xFE, 0x13, 0xA3, 0xFF, 0xE5, 0xE9, 0xC9, 0xBD, 0x1E, 0xEF, 0x2C, 0xB6, 0xFE, 0x6F,
+    0x6E, 0xDD, 0x94, 0xAB, 0x1C, 0xCE, 0x6E, 0x2A, 0x30, 0x08, 0x82, 0xD3, 0xD1, 0xFB, 0xE3, 0xC8,
+    0x63, 0x25, 0xB2, 0xF6, 0x67, 0x1D, 0x72, 0x57, 0x8B, 0xEE, 0x9F, 0x56, 0x2F, 0x16, 0x3E, 0x9B,
+    0xEC, 0x27, 0xDE, 0x2E, 0x84, 0x97, 0x67, 0xA9, 0x69, 0x0D, 0xC5, 0x59, 0xC3, 0xC8, 0x74, 0xEE,
+    0x04, 0x89, 0xEF, 0xF6, 0x4B, 0xB9, 0xA2, 0xE5, 0x82, 0x78, 0x1F, 0x49, 0xDB, 0x02, 0xC6, 0x56,
+    0x4B, 0xD6, 0x25, 0xDB, 0xBD, 0xF9, 0x9C, 0xFD, 0x2E, 0xF3, 0x05, 0x5A, 0x73, 0x69, 0x2A, 0xE9,
+    0x62, 0xD2, 0x10, 0x82, 0x9D, 0xC8, 0x6C, 0xDC, 0xC6, 0xF2, 0x18, 0x17, 0xEB, 0x2F, 0x91, 0xDC,
+    0x30, 0x55, 0xDF, 0xD8, 0x7C, 0xA4, 0x79, 0xE0, 0xC5, 0x37, 0x9D, 0x23, 0xD5, 0xDF, 0xA4, 0xF2,
+    0x1B, 0x60, 0xB6, 0xC7, 0x6F, 0x20, 0x5C, 0xFC, 0xF2, 0x6D, 0x01, 0x75, 0xFB, 0x50, 0x01, 0x5D,
+    0x24, 0x48, 0x53, 0xBF, 0x27, 0x99, 0x73, 0x3A, 0x47, 0xD4, 0xDD, 0xBF, 0xE7, 0x41, 0xD3, 0x15,
+    0x09, 0x21, 0x29, 0xDA, 0xFE, 0x6A, 0x8E, 0x20, 0xB8, 0x86, 0xC1, 0x8D, 0x54, 0x74, 0xC7, 0xD6,
+    0x66, 0xA7, 0xE5, 0x67, 0xB9, 0xE8, 0x0A, 0x74, 0x3A, 0xF9, 0x4D, 0xAF, 0x54, 0x2D, 0xF0, 0x44,
+    0x79, 0x04, 0x01, 0x54, 0x49, 0xF9, 0x04, 0x2A, 0xEF, 0xDD, 0x50, 0x19, 0xF6, 0x56, 0x0A, 0x34,
+    0x58, 0x20, 0x90, 0x23, 0x94, 0x70, 0x43, 0xBC, 0xF3, 0x1E, 0xC0, 0x7D, 0xB5, 0xBD, 0xF0, 0xBF,
+    0xC9, 0x1F, 0x93, 0x17, 0x1D, 0x56, 0xDF, 0xA0, 0x42, 0x9C, 0xAA, 0x31, 0xD1, 0xE0, 0x74, 0x0D,
+    0x42, 0x02, 0x3B, 0x06, 0xF6, 0xC5, 0xA8, 0xBB, 0x17, 0x5C, 0xCD, 0x56, 0x71, 0x9E, 0xAA, 0x1E,
+    0xE8, 0x96, 0x4E, 0x0D, 0x55, 0x4E, 0xA0, 0x9E, 0xDC, 0x30, 0x3E, 0x58, 0xD3, 0x62, 0xB6, 0xAB,
+    0x3B, 0xCF, 0x4D, 0x2B, 0x4A, 0x17, 0x25, 0xFB, 0xCA, 0x5E, 0x0A, 0x3B, 0x82, 0x36, 0xCC, 0x6D,
+    0x5D, 0x64, 0x86, 0x5C, 0x73, 0x1E, 0x86, 0xDC, 0x32, 0x5F, 0xF5, 0x2A, 0x2D, 0x58, 0x89, 0xDA,
+    0x23, 0x1A, 0xAB, 0x0A, 0x6E, 0x5F, 0xD3, 0x84, 0x33, 0x33, 0xC7, 0xFD, 0x42, 0xE9, 0xD3, 0xBD,
+    0x56, 0xE3, 0x70, 0x8A, 0xBA, 0x95, 0xAF, 0xF6, 0x0A, 0xA6, 0x22, 0x50, 0x3B, 0xCB, 0x1A, 0xE8,
+    0x88, 0xDF, 0xD3, 0xE8, 0x94, 0x8C, 0xBF, 0xC7, 0x32, 0x4C, 0x31, 0x0F, 0x1E, 0x14, 0x95, 0x9C,
+    0x2E, 0x08, 0x5B, 0x8B, 0x63, 0x62, 0x51, 0x5B, 0xAB, 0x8B, 0x81, 0x6E, 0xA2, 0x9B, 0xE3, 0x56,
+    0x9B, 0x78, 0x44, 0x09, 0xCC, 0xD4, 0x69, 0xC4, 0xF0, 0x4F, 0x7D, 0xA9, 0x1B, 0xE1, 0xD7, 0xFB,
+    0xD4, 0x44, 0x3F, 0xFF, 0x3E, 0xDB, 0xEC, 0xB7, 0x52, 0x91, 0x0E, 0xE6, 0xF7, 0xEF, 0x2F, 0x32,
+    0x15, 0xC5, 0x25, 0xA6, 0x10, 0xDF, 0xD2, 0x2F, 0x5E, 0xD0, 0x50, 0x28, 0x47, 0xA2, 0x93, 0x37,
+    0x42, 0x33, 0xC2, 0x3E, 0x2E, 0x1C, 0x1A, 0x52, 0xE5, 0x2C, 0x71, 0x6C, 0xB5, 0x4A, 0x78, 0xD2,
+    0x60, 0xDE, 0x9D, 0x26, 0x8E, 0xAA, 0x3C, 0x31, 0xFA, 0x55, 0x78, 0x41, 0xD1, 0xBC, 0x9D, 0x19,
+    0x85, 0x8B, 0x4C, 0xF9, 0x10, 0x95, 0x0E, 0x43, 0x8A, 0x34, 0x66, 0x4A, 0x5A, 0x4D, 0xD9, 0x4A,
+    0xD6, 0x19, 0x23, 0xC9, 0x67, 0x6A, 0x81, 0x36, 0x87, 0xC2, 0x79, 0x89, 0xE7, 0x17, 0x90, 0x7E,
+    0x5B, 0x61, 0x49, 0xD8, 0x05, 0xA0, 0x4F, 0x08, 0x9A, 0x77, 0x53, 0x6D, 0x8C, 0xD5, 0x36, 0x4F,
+    0xE7, 0x4E, 0x56, 0xB4, 0xE1, 0xC0, 0x53, 0xD3, 0xB8, 0xBE, 0xB7, 0x90, 0xCA, 0xFE, 0xB9, 0x80,
+    0x0E, 0x13, 0xB2, 0x7C, 0x8F, 0x66, 0x40, 0xCC, 0x8B, 0xB0, 0x7C, 0x32, 0x89, 0xDE, 0x2C, 0x5D,
+    0x6A, 0xC5, 0xE9, 0x4B, 0x36, 0x38, 0xCD, 0x51, 0xE2, 0x97, 0x9F, 0x12, 0x45, 0x92, 0x68, 0x38,
+    0xED, 0x62, 0x6A, 0xB6, 0x9A, 0x36, 0x82, 0x72, 0x43, 0x58, 0x0F, 0xA9, 0xB0, 0x4F, 0x12, 0xC9,
+    0x32, 0x2C, 0xC0, 0xAF, 0xF6, 0xE5, 0x4D, 0x48, 0xBF, 0xDD, 0xEC, 0xDB, 0x28, 0xC9, 0xD3, 0x5B,
+    0xE3, 0xFC, 0x7E, 0xAD, 0x76, 0x28, 0xD4, 0x23, 0x71, 0x85, 0xA5, 0x22, 0xE9, 0x93, 0x5E, 0x43,
+    0xB5, 0x0F, 0xAE, 0xDF, 0x8B, 0x51, 0x41, 0x86, 0xC3, 0x55, 0xE4, 0x68, 0x43, 0x27, 0x7C, 0x0C,
+    0x8F, 0x7F, 0xA0, 0x5A, 0x7A, 0xD7, 0x88, 0xC3, 0x8E, 0xF8, 0xC0, 0xF3, 0xB3, 0xC9, 0x15, 0x34,
+    0x80, 0x16, 0x34, 0x13, 0x17, 0x6A, 0xD1, 0x59, 0x03, 0x94, 0x59, 0x7B, 0xA0, 0xE8, 0xE0, 0xA4,
+    0x16, 0xFC, 0x76, 0xF0, 0x7C, 0x5A, 0x00, 0x01, 0x50, 0xE8, 0x56, 0xEF, 0x18, 0xC8, 0xDA, 0xBC,
+    0xCD, 0xB8, 0x92, 0xB8, 0x22, 0xE3, 0xB5, 0x16, 0x05, 0x25, 0xE7, 0x65, 0x3D, 0x1C, 0x0F, 0x23,
+    0xC5, 0x24, 0x16, 0x9E, 0x75, 0xCC, 0xF0, 0xF9, 0x19, 0x47, 0x83, 0xA0, 0x42, 0xBC, 0x36, 0x99,
+    0x76, 0xE0, 0x27, 0xA9, 0xDB, 0x4A, 0x6E, 0x50, 0x22, 0x99, 0x4D, 0xDF, 0x43, 0x69, 0xA3, 0x95,
+    0x48, 0x97, 0xC7, 0xC5, 0x4F, 0x1B, 0x2A, 0x32, 0xBA, 0x9F, 0xB9, 0x2D, 0x1D, 0xE3, 0x6E, 0x46,
+    0x1F, 0xBD, 0x7A, 0x4F, 0x2A, 0x07, 0xB4, 0xA2, 0xC2, 0x31, 0xA9, 0x93, 0xE9, 0x98, 0x39, 0x93,
+    0x89, 0x51, 0x82, 0x10, 0x99, 0xD5, 0x65, 0x25, 0x27, 0x37, 0xB1, 0x7E, 0x98, 0x50, 0xEC, 0xA7,
+    0x29, 0xE0, 0xBE, 0xA4, 0x0C, 0xD5, 0x9B, 0x3D, 0xAD, 0x02, 0x4D, 0x81, 0x93, 0x0F, 0xA4, 0xD7,
+    0xF4, 0x48, 0xCC, 0x4E, 0xF6, 0x6F, 0xF3, 0x5C, 0xF6, 0x5A, 0x2E, 0x05, 0xFA, 0xFB, 0x04, 0x8D,
+    0x95, 0x29, 0x94, 0x03, 0x34, 0xF2, 0x33, 0xD9, 0x5B, 0x47, 0x96, 0x6C, 0x0C, 0xE6, 0x8E, 0xF2,
+    0xD1, 0xF2, 0x83, 0x6A, 0xF2, 0x95, 0x4C, 0xBF, 0x46, 0xB4, 0x42, 0x95, 0xDA, 0x59, 0xBE, 0x32,
+    0x2F, 0xFB, 0x7A, 0x33, 0xA0, 0x09, 0xB6, 0x34, 0x49, 0x4B, 0xA7, 0x9B, 0xF6, 0x56, 0xA9, 0xB7,
+    0x5A, 0x98, 0xCD, 0x74, 0xF9, 0xBB, 0xD9, 0x1A, 0x46, 0x87, 0x5D, 0xA4, 0x81, 0x25, 0xB9, 0x9E,
+    0x58, 0xF7, 0xBE, 0x19, 0x6E, 0x84, 0x50, 0x7D, 0x94, 0x3B, 0x57, 0x0A, 0x05, 0x81, 0x42, 0x2F,
+    0x42, 0x90, 0x9B, 0xF1, 0xA7, 0x66, 0xD0, 0xD4, 0xF6, 0xD0, 0xB7, 0xE0, 0xDF, 0x2D, 0x6D, 0x60,
+    0x11, 0xBE, 0xC8, 0xB3, 0x65, 0xEB, 0x71, 0x33, 0x74, 0xAD, 0xD0, 0x3B, 0x5D, 0x06, 0x79, 0x9B,
+    0xD8, 0x03, 0xB7, 0x28, 0xEC, 0x2D, 0x3F, 0x82, 0xE5, 0xD4, 0x73, 0x01, 0xE8, 0x51, 0xD5, 0x04,
+    0x46, 0x0D, 0xA9, 0x48, 0x83, 0x75, 0x88, 0x87, 0x4F, 0xA3, 0xC5, 0xCC, 0x0E, 0x39, 0x46, 0x9E,
+    0xE8, 0xC7, 0x7C, 0xC2, 0xA1, 0xEA, 0x89, 0x08, 0xE4, 0x37, 0xAC, 0xC6, 0x2B, 0x50, 0x7D, 0x78,
+    0x4F, 0x72, 0xC8, 0x96, 0xDC, 0x48, 0xB0, 0xEF, 0x69, 0x70, 0xDF, 0x85, 0x0A, 0xE8, 0xEF, 0x14,
+    0xF9, 0x8C, 0xFE, 0x9E, 0xB1, 0xA4, 0x9B, 0x58, 0xC1, 0x77, 0x5E, 0x88, 0x3D, 0xB1, 0x39, 0xC9,
+    0xE1, 0x8B, 0x4C, 0x16, 0xC2, 0x10, 0xD7, 0x4D, 0x11, 0x11, 0x3E, 0xD9, 0x60, 0xD1, 0xAB, 0x18,
+    0x9D, 0x85, 0x8E, 0xFF, 0xFA, 0xB6, 0x09, 0x2B, 0xD2, 0x9A, 0xFD, 0x6F, 0x5C, 0x05, 0x51, 0x04,
+    0x03, 0x25, 0x38, 0x12, 0xCD, 0xF1, 0x0B, 0x10, 0x28, 0x8A, 0x09, 0x2E, 0x2C, 0x38, 0x43, 0x19,
+    0x40, 0xF8, 0x45, 0xFF, 0x80, 0x5D, 0xD4, 0xDB, 0x52, 0x2C, 0x51, 0x77, 0xD7, 0xB1, 0xFF, 0xED,
+    0x06, 0x99, 0x56, 0x48, 0x53, 0x40, 0xF7, 0x80, 0xFB, 0x9C, 0x0E, 0x6F, 0x1D, 0x25, 0xAA, 0x4C,
+    0x8E, 0x91, 0xE7, 0xC5, 0x0A, 0xDB, 0x3F, 0xEA, 0x48, 0xB9, 0xB2, 0xFA, 0x39, 0x46, 0x9E, 0x3A,
+    0xC3, 0xDC, 0x15, 0xF9, 0xCF, 0x8C, 0xA7, 0x14, 0xFD, 0x16, 0x11, 0x69, 0xC7, 0xD9, 0x2B, 0x00,
+    0xBA, 0xE7, 0x47, 0xB5, 0xF3, 0x74, 0x14, 0x11, 0xC5, 0x29, 0x5F, 0xA0, 0xF2, 0x0B, 0xB5, 0x45,
+    0xEB, 0x88, 0x96, 0x1F, 0x26, 0xCC, 0x47, 0xD7, 0x5A, 0x96, 0x1A, 0xB5, 0xD7, 0x66, 0x98, 0xD0,
+    0x65, 0xDC, 0xE2, 0x15, 0xAF, 0xAC, 0x7E, 0x60, 0xBE, 0x9E, 0x2D, 0xB5, 0x9B, 0xD9, 0x19, 0x36,
+    0x53, 0x2F, 0xE4, 0x40, 0xD7, 0xDC, 0x82, 0x16, 0x8B, 0x99, 0x1B, 0xB3, 0x5C, 0xBB, 0x6A, 0x3F,
+    0x90, 0xE4, 0xF8, 0x57, 0xDE, 0x9E, 0x63, 0xFD, 0x78, 0x4F, 0x0A, 0x26, 0x73, 0x0E, 0xD9, 0x47,
+    0x8B, 0x52, 0xBF, 0x77, 0x75, 0x15, 0xD2, 0x70, 0xDC, 0x4B, 0x47, 0x1D, 0x6A, 0x7A, 0x5F, 0xFE,
+    0x64, 0x89, 0xAB, 0xA1, 0x95, 0x8F, 0x27, 0xD1, 0xAD, 0x5C, 0x6D, 0xAB, 0xAF, 0x53, 0xA5, 0x7E,
+    0xFC, 0x14, 0x02, 0xE0, 0xEA, 0x14, 0x60, 0x71, 0x20, 0xB5, 0x2B, 0x33, 0x47, 0xE8, 0x05, 0x82,
+    0x4B, 0x85, 0xE3, 0xFE, 0x9D, 0x21, 0x95, 0x7F, 0x18, 0x11, 0xB4, 0x0D, 0x7F, 0xB6, 0xAB, 0xF4,
+    0xF4, 0xE7, 0x43, 0x20, 0x50, 0x28, 0x72, 0x8B, 0x11, 0x83, 0xA5, 0xB6, 0x1E, 0x94, 0xF9, 0x25,
+    0x94, 0x2B, 0xBC, 0xD6, 0x55, 0x41, 0xE4, 0xF0, 0xD9, 0xF5, 0x4D, 0x30, 0x4A, 0xD4, 0x9D, 0x3B,
+    0x23, 0xE3, 0x95, 0x2E, 0xB6, 0x60, 0x0D, 0xAD, 0x28, 0xE5, 0xF9, 0x6E, 0x6A, 0x74, 0xB5, 0x6C,
+    0x88, 0x59, 0x87, 0x30, 0x4A, 0x54, 0xE0, 0x80, 0xAA, 0x1E, 0x76, 0x02, 0x16, 0x55, 0xC5, 0xF2,
+    0xC8, 0x38, 0xE3, 0x22, 0x12, 0x7A, 0x16, 0x51, 0xDB, 0x5B, 0x38, 0xF3, 0xE0, 0xC1, 0x45, 0x56,
+    0x6A, 0xD3, 0xD3, 0x25, 0x59, 0x9A, 0x7A, 0x1F, 0x8A, 0xF4, 0xAF, 0x98, 0x4E, 0xC8, 0x1D, 0x6A,
+    0x7E, 0x34, 0x4B, 0xD7, 0x85, 0x2F, 0xBB, 0x0F, 0x7B, 0xD4, 0x76, 0x44, 0x83, 0x8A, 0x76, 0x01,
+    0x39, 0xAE, 0x88, 0xA5, 0xB0, 0xFC, 0xBF, 0xEA, 0xD1, 0xFD, 0x44, 0x25, 0x72, 0xD9, 0xBC, 0x3F,
+    0xD9, 0xC1, 0x29, 0x44, 0x22, 0x0E, 0x6A, 0x49, 0xE1, 0x32, 0x23, 0xB3, 0x45, 0x80, 0x81, 0x9C,
+    0x38, 0x88, 0xE7, 0x27, 0x66, 0x09, 0x90, 0xF2, 0xBD, 0x3C, 0x4B, 0x10, 0x98, 0x52, 0x4D, 0x81,
+    0x26, 0x25, 0xD3, 0xE3, 0x66, 0x00, 0x27, 0x39, 0xBF, 0x6A, 0x40, 0x1D, 0x8F, 0x6F, 0x21, 0x16,
+    0x22, 0x73, 0x1E, 0x9E, 0x11, 0xFF, 0xB8, 0xC9, 0x9A, 0x56, 0x35, 0x14, 0x78, 0xBD, 0x1F, 0x7B,
+    0x89, 0x47, 0xB6, 0x6A, 0x51, 0xBC, 0x08, 0x9F, 0x3D, 0xCF, 0x1C, 0xC5, 0x2C, 0x82, 0x88, 0x72,
+    0xCC, 0x35, 0x9B, 0xD7, 0x31, 0xFE, 0xAE, 0x40, 0x2D, 0xBF, 0x21, 0xC3, 0xF1, 0xA8, 0x39, 0xC0,
+    0x59, 0xB4, 0x29, 0x7C, 0x5D, 0x5C, 0x0A, 0x7C, 0xD6, 0xA2, 0xB9, 0x5A, 0x69, 0x3A, 0xF2, 0xA5,
+    0xB5, 0x40, 0x5D, 0x84, 0x1E, 0x8A, 0x93, 0x2B, 0x75, 0x8C, 0xF0, 0x7F, 0x57, 0x12, 0xB6, 0xF9,
+    0xBB, 0xBE, 0x28, 0x20, 0x4B, 0xB1, 0xA8, 0x90, 0xE6, 0x6A, 0xE9, 0xB3, 0xB2, 0x14, 0xCE, 0xA0,
+    0xCD, 0x9B, 0xD2, 0x8D, 0xEB, 0x34, 0xB2, 0x71, 0x86, 0x96, 0xFB, 0x88, 0x5E, 0x9F, 0x0D, 0xE6,
+    0x99, 0x87, 0xAB, 0xAA, 0xF4, 0xEA, 0xD3, 0xFE, 0xCE, 0x6D, 0x2C, 0x93, 0x8A, 0x06, 0x16, 0x47,
+    0xBB, 0xFF, 0xE0, 0xC5, 0x31, 0xF1, 0x46, 0x31, 0xB4, 0x6D, 0xFE, 0x9A, 0x62, 0xC0, 0xD9, 0x17,
+    0xC2, 0x38, 0x18, 0x5C, 0xBA, 0x00, 0xCE, 0x10, 0x89, 0x96, 0x36, 0x82, 0x95, 0xD4, 0x76, 0x90,
+    0x7D, 0x5D, 0x79, 0x59, 0x20, 0x63, 0xA4, 0x5F, 0x10, 0x5C, 0x08, 0xF4, 0x53, 0x39, 0xC7, 0x16,
+    0xB7, 0xE7, 0x37, 0xC6, 0x67, 0x2D, 0x75, 0xA9, 0x86, 0x96, 0x3D, 0x55, 0x45, 0xFE, 0xFA, 0xC4,
+    0xFE, 0x66, 0xEA, 0x53, 0xD3, 0x3C, 0x40, 0xA1, 0x96, 0x31, 0x0F, 0x2C, 0x56, 0x82, 0xF5, 0xAD,
+    0x4B, 0x56, 0x1A, 0x04, 0x5E, 0xC0, 0x92, 0xED, 0x74, 0xF1, 0x9D, 0x11, 0x0F, 0x8F, 0x69, 0x90,
+    0x53, 0x78, 0x71, 0x0D, 0x8A, 0x6C, 0x8E, 0xB0, 0xA2, 0x33, 0x38, 0x7E, 0x18, 0xC5, 0x28, 0xEE,
+    0x4F, 0xE5, 0x57, 0xC5, 0x5E, 0x42, 0xDE, 0xA8, 0xB7, 0x77, 0xE5, 0x5D, 0xDD, 0xD9, 0xFE, 0xFF,
+    0x69, 0xF6, 0x0A, 0xBF, 0xE1, 0x22, 0xEC, 0x09, 0xF3, 0x05, 0x61, 0x31, 0x71, 0x31, 0x06, 0x36,
+    0x76, 0x34, 0xB4, 0x5B, 0x46, 0x4C, 0x7F, 0x26, 0x0F, 0x97, 0x75, 0x34, 0x75, 0x2B, 0x88, 0x1B,
+    0xEC, 0xF7, 0x65, 0xF7, 0x92, 0x30, 0x04, 0xBA, 0x56, 0xBE, 0x44, 0xF8, 0x0C, 0x3A, 0x27, 0xD9,
+    0xE1, 0x70, 0x10, 0x18, 0xE8, 0xE0, 0xB5, 0xC6, 0x1E, 0x0E, 0x11, 0x7C, 0xB8, 0x7C, 0x3E, 0xD1,
+    0xDD, 0xEB, 0xA4, 0x14, 0x2F, 0xC1, 0xAB, 0x77, 0x0E, 0x51, 0x23, 0xCC, 0x5E, 0x34, 0x19, 0xC9,
+    0xBD, 0x81, 0x96, 0x00, 0xD6, 0xE9, 0xAA, 0x82, 0xD3, 0xE6, 0x00, 0x09, 0x3E, 0xC0, 0xB6, 0x4F,
+    0xF1, 0x39, 0x00, 0xF0, 0xD6, 0xB1, 0x7A, 0xA2, 0xD3, 0xD6, 0x08, 0x65, 0xE5, 0x4A, 0x84, 0xDA,
+    0x85, 0x17, 0xAC, 0x17, 0x03, 0x35, 0x07, 0x8F, 0xF9, 0xB3, 0xCC, 0xC9, 0x3E, 0xF9, 0x4E, 0xA4,
+    0x30, 0xE3, 0xC9, 0x96, 0x8B, 0x6B, 0x53, 0x4E, 0x11, 0xAF, 0x53, 0xAC, 0x92, 0x8E, 0xCC, 0xFE,
+    0xCA, 0x12, 0x7F, 0x92, 0x0A, 0x62, 0x7A, 0x38, 0xCA, 0xAA, 0x89, 0x0C, 0x00, 0x91, 0xA1, 0x9F,
+    0x96, 0x13, 0x2B, 0x46, 0x0E, 0x59, 0xC0, 0xF3, 0x49, 0xDC, 0xF0, 0xFA, 0xBF, 0x4D, 0xE7, 0xF3,
+    0x0A, 0x82, 0x12, 0x05, 0xDE, 0xA5, 0xA9, 0x8B, 0x67, 0xD0, 0xF5, 0x0B, 0xEE, 0xA1, 0x73, 0x8F,
+    0xCC, 0x47, 0x67, 0x7E, 0x83, 0x79, 0x56, 0x19, 0x49, 0x5B, 0xE0, 0x30, 0x5F, 0xE6, 0xCB, 0x6E,
+    0xEC, 0x69, 0x31, 0xB8, 0x87, 0x6E, 0xC0, 0xEA, 0x76, 0x79, 0x3A, 0x1A, 0x05, 0x8B, 0xD3, 0xB1,
+    0x56, 0x57, 0x13, 0xDF, 0x3A, 0x6F, 0x38, 0xFF, 0x3A, 0xFB, 0x59, 0x35, 0x37, 0xFA, 0x93, 0xBB,
+    0xA3, 0x13, 0x69, 0xC1, 0xCA, 0x3B, 0x9C, 0x73, 0x51, 0x81, 0x38, 0x57, 0x12, 0x55, 0xA7, 0x7F,
+    0x27, 0x87, 0x8B, 0x4A, 0x0C, 0x7F, 0x2D, 0x6C, 0x6E, 0xED, 0x69, 0xDD, 0xC3, 0x29, 0xDA, 0x67,
+    0xDF, 0x2E, 0x9B, 0x3D, 0xB1, 0xA7, 0xFA, 0x1E, 0xF0, 0x09, 0xE2, 0x69, 0x4A, 0x97, 0xE0, 0x63,
+    0x92, 0x16, 0xF1, 0x7C, 0x70, 0x50, 0x72, 0xFE, 0x96, 0x94, 0xE4, 0xAB, 0x5A, 0xCA, 0xEB, 0x69,
+    0x3C, 0x12, 0xE5, 0x1A, 0xB8, 0x2C, 0x8C, 0x24, 0xA2, 0xF3, 0x2A, 0xFF, 0xA0, 0xEC, 0xE8, 0xDE,
+    0xAF, 0x4C, 0xA0, 0xEB, 0x4D, 0x13, 0x77, 0x19, 0x23, 0xE3, 0xE2, 0x72, 0xC3, 0xD4, 0x3A, 0x70,
+    0x1D, 0xA7, 0xE0, 0x92, 0x38, 0x98, 0x68, 0xBB, 0x82, 0x98, 0xC7, 0x30, 0x38, 0x50, 0x2A, 0xDF,
+    0xAF, 0x9C, 0x7F, 0xAB, 0x8A, 0xBB, 0x98, 0x6A, 0x48, 0x4A, 0xE4, 0x29, 0x3F, 0x5A, 0xBE, 0x7D,
+    0x3D, 0xC8, 0xCB, 0x13, 0x9E, 0x9D, 0x86, 0xC5, 0x96, 0x1C, 0xB4, 0xD6, 0xBF, 0x32, 0xE2, 0x4D,
+    0x1B, 0x86, 0x1A, 0xFA, 0xD0, 0xFB, 0x25, 0xA2, 0xBA, 0x6F, 0xEE, 0x36, 0xF6, 0x24, 0xEC, 0x7D,
+    0x8E, 0x96, 0xA4, 0x95, 0x4B, 0x3F, 0x5D, 0x1F, 0x11, 0x9B, 0xAD, 0x4B, 0xC5, 0x5C, 0x87, 0x58,
+    0xA4, 0x56, 0xEB, 0xEA, 0x99, 0xC3, 0x85, 0x11, 0x01, 0x7B, 0xFD, 0x39, 0x33, 0xB9, 0xD7, 0xDC,
+    0x26, 0x99, 0xCD, 0xB7, 0x7E, 0x7E, 0x60, 0xE7, 0x44, 0x29, 0x6C, 0x0C, 0xFB, 0x13, 0x71, 0x2B,
+    0x5C, 0x13, 0x88, 0xFD, 0xB9, 0xF4, 0x53, 0x20, 0xD6, 0xBB, 0xEF, 0xF0, 0xDB, 0x53, 0x4A, 0xD0,
+    0x1B, 0xF3, 0x6F, 0xDB, 0x8E, 0xF6, 0xB0, 0x46, 0x5C, 0x2A, 0xAD, 0xFB, 0x27, 0x52, 0xE5, 0xFD,
+    0x3D, 0x9B, 0x56, 0x9F, 0x47, 0xBA, 0xA9, 0xB7, 0xAA, 0x5C, 0xB2, 0xFD, 0x4F, 0xA8, 0xAD, 0xA9,
+    0xDB, 0xB2, 0x34, 0xE5, 0x86, 0xCB, 0x5F, 0xE7, 0x65, 0xEE, 0x92, 0x9D, 0x3E, 0x35, 0x42, 0x35,
+    0x48, 0x03, 0x52, 0x31, 0x71, 0xCE, 0x72, 0xEC, 0x1F, 0x88, 0xCE, 0xDC, 0xB2, 0x38, 0x32, 0xEA,
+    0x1B, 0x71, 0x22, 0xFC, 0x14, 0x53, 0xD8, 0x2E, 0x6B, 0xF3, 0xDB, 0xF9, 0x3F, 0x01, 0xDC, 0xEF,
+    0xFE, 0x74, 0xE4, 0xE1, 0x7B, 0x55, 0x21, 0xB5, 0x40, 0x78, 0x87, 0x76, 0xFC, 0xFA, 0x36, 0x25,
+    0x45, 0xB9, 0x47, 0x2A, 0x65, 0x56, 0x75, 0x8E, 0xDC, 0x6E, 0x27, 0x2D, 0x43, 0x82, 0xCC, 0x76,
+    0xA0, 0x48, 0x33, 0x88, 0x5B, 0x58, 0xF3, 0x83, 0x6D, 0x8C, 0x1E, 0xFC, 0xA3, 0x1A, 0xAC, 0x74,
+    0xB4, 0x38, 0x47, 0xCA, 0x20, 0x06, 0x14, 0xAB, 0x5A, 0xBD, 0x5E, 0x38, 0x5A, 0x1E, 0x88, 0xC7,
+    0xF9, 0x69, 0x7D, 0xBF, 0x91, 0x2C, 0x51, 0x18, 0x95, 0xF6, 0x19, 0x98, 0x79, 0xFC, 0x69, 0xFD,
+    0xF7, 0xA9, 0x21, 0xA1, 0xD4, 0xBF, 0xC5, 0x21, 0xF5, 0xBA, 0xD2, 0x9B, 0xF8, 0xA5, 0x40, 0x57,
+    0xD1, 0x10, 0x47, 0x0F, 0x93, 0x50, 0x0F, 0x5D, 0x97, 0x96, 0x14, 0x2B, 0x71, 0x63, 0x88, 0xEC,
+    0xA1, 0x92, 0xF0, 0x76, 0x86, 0x5C, 0xCC, 0x37, 0x86, 0x04, 0xD2, 0xB0, 0xDD, 0x53, 0x82, 0xD6,
+    0x28, 0xCC, 0x05, 0x60, 0xE1, 0x3F, 0x27, 0xD2, 0x1C, 0x80, 0x68, 0xAA, 0xA9, 0x16, 0xCD, 0xF5,
+    0x82, 0x55, 0x11, 0xDD, 0x05, 0x2D, 0x56, 0x9F, 0xC9, 0x92, 0xA2, 0xB8, 0xDF, 0xD9, 0x32, 0x28,
+    0xD4, 0xE9, 0xEA, 0x7E, 0x93, 0x5D, 0x33, 0x96, 0x77, 0x81, 0xCF, 0x63, 0xE2, 0xC5, 0xC4, 0x41,
+    0x89, 0x0A, 0x64, 0xCC, 0x68, 0xD3, 0x3A, 0x80, 0x1A, 0xAC, 0x36, 0xDC, 0x50, 0x95, 0x5B, 0x8A,
+    0xE7, 0x24, 0xAD, 0x65, 0xC9, 0x86, 0x2A, 0xC2, 0x0C, 0x48, 0xB0, 0xDD, 0x33, 0x53, 0x1F, 0x08,
+    0x35, 0x9B, 0x91, 0x52, 0xBB, 0xA8, 0x85, 0xE2, 0xA9, 0x0D, 0x22, 0x80, 0x1D, 0xCA, 0x57, 0xA5,
+    0x52, 0xE4, 0xDA, 0x10, 0x7C, 0x31, 0xDB, 0xAA, 0x27, 0x98, 0x85, 0xB7, 0xC7, 0x4E, 0xFC, 0x9D,
+    0x39, 0x8A, 0x10, 0x30, 0x78, 0x4B, 0xB3, 0x3C, 0xAF, 0xAB, 0xE7, 0xD9, 0xBB, 0xB4, 0x11, 0x3E,
+    0x59, 0x32, 0x2A, 0xD8, 0x89, 0xD8, 0xF5, 0xEB, 0x45, 0xFC, 0xEF, 0x8B, 0x78, 0xCF, 0x10, 0x1B,
+    0xCF, 0x4A, 0x2C, 0x24, 0x57, 0xED, 0x82, 0x2E, 0x4B, 0xC9, 0x1A, 0xC8, 0x1C, 0xD0, 0x5D, 0xE1,
+    0x87, 0x6E, 0xEA, 0xED, 0xD9, 0x0D, 0xC9, 0x1C, 0x59, 0x14, 0x85, 0xFB, 0x60, 0xFE, 0x62, 0x06,
+    0x4A, 0xB9, 0x0F, 0x0E, 0x83, 0xFE, 0x14, 0x1A, 0x7F, 0x6F, 0xFB, 0xC0, 0xBF, 0x76, 0x02, 0x3C,
+    0xAB, 0x58, 0x86, 0xB0, 0xDA, 0x69, 0xE7, 0xFD, 0x2B, 0x4C, 0x47, 0x66, 0xAB, 0xAB, 0xFF, 0x5D,
+    0xA0, 0xF2, 0x95, 0x47, 0xC8, 0x23, 0xB8, 0x58, 0xA2, 0x74, 0x9D, 0x65, 0x6D, 0x3F, 0xC9, 0xD9,
+    0xC0, 0xE9, 0x8A, 0x62, 0x0A, 0x6E, 0x1F, 0xE7, 0xD2, 0x86, 0x97, 0x26, 0xA4, 0x0A, 0x9C, 0x54,
+    0x44, 0xC8, 0x8C, 0x4E, 0x3B, 0xA9, 0xE6, 0x97, 0xBE, 0xBE, 0x16, 0x09, 0xE3, 0xC7, 0xCA, 0x68,
+    0x47, 0x24, 0x80, 0x22, 0x27, 0x0D, 0xC7, 0xE4, 0x11, 0x68, 0xD2, 0x1A, 0x79, 0x61, 0x89, 0x59,
+    0xD5, 0xA3, 0x99, 0xDF, 0x9C, 0x5B, 0x10, 0x58, 0x36, 0x6D, 0xDE, 0x9F, 0xB5, 0xC2, 0xF2, 0x9F,
+    0x68, 0x99, 0x95, 0xD1, 0x79, 0x08, 0x8F, 0xE4, 0xEC, 0x82, 0x7D, 0x70, 0xCF, 0xEA, 0x77, 0x00,
+    0x0A, 0x0A, 0xE6, 0x39, 0x45, 0x96, 0xB6, 0xA1, 0xC0, 0xA3, 0xAA, 0x64, 0xF8, 0x3B, 0xD2, 0xF7,
+    0x5C, 0xAD, 0xC0, 0x62, 0x93, 0xDA, 0xAE, 0x08, 0x5F, 0xB5, 0x10, 0x7F, 0x14, 0xB6, 0x91, 0xC3,
+    0xEC, 0xBB, 0x0F, 0x18, 0x4B, 0x88, 0xBE, 0xFF, 0xA2, 0xF1, 0x02, 0x48, 0x03, 0x6C, 0x6A, 0x5C,
+    0xAE, 0x7F, 0xBB, 0xA3, 0x02, 0x25, 0x6E, 0x13, 0x9B, 0x64, 0x8C, 0x6B, 0x3D, 0xC1, 0xC6, 0xC7,
+    0xB6, 0xA8, 0xF2, 0x85, 0x12, 0x87, 0xEA, 0xE0, 0x07, 0x3A, 0xEE, 0x2F, 0xC2, 0x68, 0xB8, 0x05,
+    0xB5, 0x55, 0x15, 0xDF, 0x21, 0x78, 0x9D, 0x21, 0x80, 0xE8, 0x91, 0xA4, 0x97, 0x1C, 0x08, 0xDB,
+    0x68, 0xA8, 0xEF, 0x25, 0x00, 0xEE, 0xAC, 0xD7, 0x87, 0x26, 0xD6, 0x27, 0xB8, 0xE5, 0x85, 0x79,
+    0x3F, 0xA4, 0xE9, 0xC8, 0x51, 0x44, 0xAF, 0xAE, 0x32, 0x08, 0x57, 0x1D, 0xC6, 0xB7, 0x4D, 0x43,
+    0xDC, 0x3D, 0x27, 0xD4, 0x34, 0x53, 0xEA, 0x1A, 0xFA, 0x57, 0x11, 0x04, 0xC1, 0x70, 0x7D, 0x88,
+    0x9B, 0x35, 0xAA, 0xBE, 0x23, 0xD4, 0x10, 0xFB, 0xEA, 0x9C, 0x4A, 0xBC, 0xA5, 0xC0, 0x4E, 0xE1,
+    0x2C, 0x30, 0x15, 0x1B, 0xA6, 0xFA, 0x7C, 0x27, 0x78, 0xA3, 0x2B, 0xF7, 0x90, 0x20, 0x4B, 0xB2,
+    0xBD, 0xEE, 0x11, 0xD1, 0x53, 0xEB, 0xBC, 0x33, 0xAD, 0x87, 0xD5, 0x15, 0x6B, 0x69, 0xFD, 0x20,
+    0x3E, 0x74, 0xF3, 0x9D, 0x24, 0x9A, 0xC7, 0x39, 0xEB, 0xD2, 0x81, 0x24, 0x7A, 0x75, 0x20, 0x20,
+    0xA3, 0x2B, 0xB6, 0x59, 0x62, 0x54, 0xE4, 0x6F, 0x03, 0x41, 0xCD, 0x3A, 0x13, 0x69, 0x5C, 0xDA,
+    0xD6, 0xE1, 0x64, 0x14, 0x4F, 0x05, 0x03, 0x04, 0x4F, 0x1A, 0x38, 0xF8, 0x40, 0x9E, 0xA1, 0x38,
+    0xDA, 0x20, 0xB5, 0x54, 0xC6, 0x0D, 0x1D, 0x58, 0xE4, 0x45, 0x10, 0xF5, 0x9C, 0xA6, 0xA4, 0x90,
+    0x64, 0x35, 0xE6, 0xF0, 0xFE, 0x58, 0x47, 0xC6, 0x84, 0xA6, 0x69, 0x62, 0xCC, 0xFA, 0x50, 0xFA,
+    0xAC, 0x24, 0x5E, 0x72, 0xCF, 0x4C, 0xAF, 0xCF, 0xF1, 0x12, 0xB8, 0x62, 0xA0, 0xF1, 0xB6, 0x36,
+    0xF7, 0x3E, 0xD5, 0x3F, 0x2B, 0xD5, 0xC3, 0x57, 0xE7, 0x84, 0x9E, 0xCE, 0x48, 0x21, 0x90, 0x09,
+    0x5D, 0x62, 0xBB, 0xDC, 0x5A, 0x93, 0x20, 0x6D, 0xF3, 0x8F, 0x9C, 0x51, 0x97, 0x74, 0xC7, 0x55,
+    0x08, 0xD9, 0x42, 0x11, 0x70, 0x55, 0x08, 0x96, 0x2D, 0xC2, 0x5C, 0x0B, 0x02, 0x6D, 0xFC, 0x3A,
+    0xCD, 0x21, 0xF2, 0x72, 0xD6, 0x78, 0x3B, 0xD5, 0x52, 0xC9, 0xE9, 0x94, 0x51, 0x2F, 0xBA, 0x27,
+    0x99, 0x6B, 0xF1, 0xF2, 0xFA, 0xBF, 0x15, 0x68, 0xD1, 0xC6, 0x8A, 0x86, 0x3A, 0x51, 0x45, 0xB2,
+    0xE9, 0x5D, 0xD1, 0x82, 0xC3, 0x32, 0x28, 0xD3, 0x8B, 0xFB, 0x90, 0x6D, 0x96, 0x9E, 0x65, 0x07,
+    0xE1, 0x05, 0x28, 0x52, 0xE6, 0x93, 0x93, 0x4B, 0xB1, 0x44, 0xE1, 0xD5, 0xB5, 0x65, 0x1D, 0x1D,
+    0x5C, 0xFA, 0xB0, 0xCA, 0xC3, 0x9D, 0xCD, 0xAC, 0x11, 0xFF, 0x81, 0x44, 0x91, 0xB0, 0x1C, 0xC8,
+    0x6F, 0x21, 0xC2, 0x61, 0x95, 0x61, 0x49, 0x19, 0x3F, 0x67, 0x9A, 0xC0, 0x7F, 0xEE, 0xCF, 0xE8,
+    0x5E, 0x75, 0x03, 0x56, 0x4D, 0x24, 0x61, 0xF9, 0xD8, 0x98, 0xA1, 0x2B, 0xD1, 0x8C, 0x40, 0x9B,
+    0xDC, 0xB6, 0x5C, 0xC0, 0xD6, 0x84, 0x67, 0x2E, 0x00, 0x2A, 0x89, 0xCE, 0x0A, 0x6D, 0x06, 0x23,
+    0x64, 0x10, 0xD5, 0xD2, 0x17, 0xC5, 0xF9, 0x98, 0xEE, 0xE6, 0xFC, 0x16, 0x6B, 0x0E, 0xAD, 0x40,
+    0x4D, 0x2D, 0x78, 0x9C, 0x75, 0x60, 0xDD, 0x55, 0x5B, 0x9F, 0xDF, 0xE0, 0x70, 0x2A, 0x72, 0xF3,
+    0x10, 0x31, 0x0F, 0xB9, 0xA6, 0xDC, 0x3E, 0x0C, 0x9D, 0x20, 0x91, 0xA6, 0x0F, 0x4E, 0x49, 0x0D,
+    0x3D, 0x2C, 0x2D, 0x33, 0x32, 0x31, 0x1E, 0xF6, 0x89, 0xD6, 0x66, 0xF0, 0x98, 0x1E, 0x11, 0x36,
+    0xE2, 0xF2, 0xDE, 0x09, 0x5F, 0x7B, 0x29, 0xA2, 0x51, 0x47, 0xA6, 0xAC, 0x2B, 0xE2, 0x5A, 0xAE,
+    0x7F, 0x38, 0xA5, 0xF6, 0xFE, 0x61, 0x42, 0x70, 0xB9, 0xCC, 0xCC, 0xD7, 0x23, 0x0F, 0xBF, 0xCC,
+    0x87, 0x48, 0x31, 0x38, 0x1B, 0x7A, 0x4B, 0x9E, 0xEB, 0x1F, 0x3D, 0x16, 0x55, 0xFA, 0xDB, 0xC2,
+    0xA0, 0xFF, 0xDC, 0x34, 0x4B, 0x0D, 0x3C, 0x33, 0x55, 0x87, 0x7E, 0x73, 0xCD, 0x66, 0x8A, 0x5D,
+    0x3F, 0xE4, 0xFE, 0xF1, 0x56, 0xFE, 0xB1, 0xB1, 0x09, 0x4E, 0x1D, 0xA5, 0xEE, 0xD5, 0x6D, 0x9F,
+    0xA3, 0xA9, 0xCB, 0x16, 0xE4, 0x62, 0x87, 0x1F, 0xB5, 0x88, 0xFB, 0x2B, 0x77, 0xA0, 0xB8, 0x9D,
+    0x51, 0x1F, 0x88, 0x60, 0x45, 0x69, 0x2A, 0x46, 0x1E, 0x7B, 0x7F, 0x63, 0x98, 0x59, 0x8A, 0x75,
+    0x6C, 0x4E, 0xFE, 0xFD, 0xC1, 0xCB, 0x68, 0x10, 0x71, 0x38, 0x8F, 0x1A, 0x50, 0xF5, 0x4A, 0xE3,
+    0x82, 0x28, 0x46, 0x4A, 0x72, 0x0A, 0x86, 0xF9, 0xE0, 0xF4, 0x7E, 0xCB, 0x3A, 0xB5, 0x6C, 0x6A,
+    0x6B, 0x14, 0x1B, 0x0E, 0xAD, 0x60, 0xCE, 0x39, 0x8F, 0x62, 0x3F, 0x2A, 0x33, 0xBC, 0xF3, 0x03,
+    0x90, 0x40, 0x3B, 0x5E, 0x30, 0x77, 0xE0, 0xA4, 0xAA, 0x5D, 0xC3, 0xCF, 0x43, 0x0F, 0xF7, 0x1C,
+    0x4E, 0x60, 0x87, 0x82, 0xB6, 0x5A, 0xF3, 0x35, 0x17, 0x48, 0xFB, 0x8F, 0x34, 0xCB, 0xED, 0x6F,
+    0xFC, 0xB8, 0x73, 0xBB, 0x09, 0xCE, 0x07, 0x89, 0x58, 0xEB, 0xC4, 0x82, 0x67, 0x45, 0xAD, 0xCA,
+    0xD9, 0x49, 0xE4, 0x00, 0xAA, 0x5A, 0xED, 0x61, 0xA6, 0x49, 0x1A, 0xB6, 0xC8, 0x09, 0xDE, 0xAA,
+    0x65, 0x1A, 0x0C, 0xF5, 0xDF, 0xA9, 0x2B, 0xB6, 0x91, 0xE9, 0xF0, 0x08, 0x2A, 0xBB, 0x4A, 0x04,
+    0x30, 0x0C, 0x71, 0x64, 0xE2, 0xCF, 0xF3, 0xD4, 0x1E, 0x99, 0x9A, 0x2B, 0x11, 0x5D, 0x29, 0x61,
+    0xC6, 0x2C, 0xC1, 0xA7, 0x05, 0xE8, 0x9B, 0xD0, 0xE4, 0xD2, 0x56, 0x96, 0x5E, 0xA9, 0x25, 0x96,
+    0x25, 0xBC, 0xBC, 0x12, 0xE5, 0x50, 0x47, 0x4C, 0x8D, 0xBF, 0xA6, 0xDA, 0x0A, 0x88, 0x70, 0x2F,
+    0x74, 0x2D, 0xE9, 0xCD, 0xD8, 0xF6, 0xD9, 0x76, 0x37, 0x9A, 0x1F, 0x1D, 0x3D, 0x10, 0xBA, 0xD0,
+    0x3C, 0x13, 0x56, 0x73, 0x79, 0x97, 0xB9, 0x55, 0x9D, 0x8B, 0xF3, 0xD5, 0x87, 0x0B, 0x1D, 0x97,
+    0x53, 0xD0, 0xF9, 0xA9, 0x76, 0x3B, 0xDE, 0x18, 0x3C, 0xE8, 0xF0, 0x81, 0x13, 0x16, 0x5A, 0x7D,
+    0x59, 0xF1, 0x9E, 0xE3, 0xC5, 0xBA, 0xFC, 0xB7, 0x7E, 0x5F, 0x05, 0xF4, 0x38, 0x6C, 0xA1, 0x09,
+    0xAA, 0x15, 0x4C, 0xC5, 0xF6, 0xE7, 0x25, 0x72, 0xC4, 0xAA, 0x82, 0xFE, 0xEB, 0x3F, 0xBC, 0x6B,
+    0x26, 0xB2, 0xAD, 0x85, 0x83, 0xFB, 0xFA, 0xD9, 0x2D, 0x78, 0x50, 0xBE, 0xF6, 0x70, 0xB4, 0x8A,
+    0xDB, 0x71, 0xA2, 0x60, 0x80, 0x7A, 0x91, 0xB2, 0x74, 0x54, 0x81, 0xB5, 0xF7, 0x48, 0x77, 0x96,
+    0x05, 0xD6, 0x34, 0xC1, 0x06, 0x0E, 0x35, 0x20, 0x39, 0x28, 0x2D, 0x57, 0xC1, 0x75, 0xA2, 0x26,
+    0x0B, 0xEB, 0x59, 0x12, 0x07, 0x46, 0x35, 0x1B, 0x7D, 0x2A, 0x5B, 0x0D, 0x19, 0x1A, 0xBD, 0x09,
+    0x5D, 0xEF, 0x7A, 0x79, 0x7F, 0xB1, 0xD6, 0x45, 0x00, 0xC3, 0x3E, 0xB2, 0xA9, 0x03, 0x19, 0x43,
+    0xC3, 0x53, 0x73, 0x24, 0xA2, 0xEC, 0x9B, 0x88, 0x09, 0xF4, 0x5C, 0xB5, 0xC0, 0x69, 0x00, 0xB6,
+    0xB4, 0x80, 0xDE, 0x9A, 0x7A, 0x85, 0x1D, 0xA7, 0x85, 0x81, 0x3D, 0x83, 0x41, 0x85, 0xA5, 0x32,
+    0x7B, 0x7D, 0x47, 0xEB, 0x35, 0x07, 0x3C, 0xED, 0xBC, 0x6B, 0xEF, 0xB0, 0x1A, 0x6F, 0x33, 0x0A,
+    0x2C, 0xBA, 0x54, 0xF8, 0xEE, 0xA9, 0xB4, 0x2A, 0x17, 0x8A, 0x1E, 0x6C, 0x58, 0xFB, 0x09, 0xF0,
+    0x76, 0x0F, 0x03, 0xD3, 0x34, 0xC1, 0xC2, 0xA1, 0xCD, 0x96, 0x21, 0xFC, 0x9C, 0x21, 0x3D, 0xB6,
+    0xA2, 0xD1, 0xA2, 0x0F, 0x24, 0xF6, 0x33, 0xB4, 0xB4, 0x36, 0xCA, 0x12, 0x25, 0x52, 0x85, 0x5B,
+    0x07, 0x82, 0xAF, 0xB8, 0x8B, 0xB1, 0x36, 0x67, 0x32, 0xAF, 0x51, 0x74, 0xDE, 0x15, 0x9B, 0xE7,
+    0xD9, 0x6D, 0x2C, 0xEA, 0xDE, 0x68, 0x99, 0x66, 0x31, 0x87, 0x7D, 0xEA, 0xA8, 0x4D, 0xF4, 0x06,
+    0xB5, 0x28, 0xD8, 0x93, 0xB8, 0x38, 0xB3, 0x2D, 0xA2, 0xA8, 0xCD, 0x03, 0x96, 0x61, 0xD1, 0x7B,
+    0x49, 0x11, 0xE8, 0xEE, 0x25, 0xCE, 0x44, 0xA7, 0x77, 0xED, 0x72, 0xA3, 0xF4, 0xA7, 0xCB, 0x2D,
+    0x9D, 0xC5, 0xBA, 0x89, 0xBD, 0x9A, 0xC0, 0x84, 0xDD, 0x14, 0x09, 0x1C, 0x11, 0x17, 0x4F, 0x99,
+    0x23, 0xDA, 0xD2, 0xD4, 0x68, 0x4E, 0x7B, 0xFC, 0x85, 0x24, 0xE7, 0x1A, 0x79, 0xA5, 0x91, 0x9E,
+    0xD8, 0xBB, 0x0E, 0xFA, 0xC4, 0x99, 0x31, 0xFB, 0x02, 0x4C, 0x15, 0xEC, 0x38, 0x6E, 0xBC, 0xF8,
+    0xA1, 0xCB, 0xAD, 0x8D, 0x12, 0x66, 0x91, 0x61, 0xAF, 0xA8, 0x01, 0x86, 0xF7, 0x8A, 0x54, 0x30,
+    0x40, 0xDE, 0x3F, 0x83, 0xA4, 0x9C, 0x43, 0x98, 0x50, 0x21, 0x12, 0xB3, 0x20, 0x53, 0xE5, 0x46,
+    0x82, 0x7E, 0xDF, 0x59, 0x1E, 0x19, 0x0C, 0x2B, 0xFF, 0x77, 0x92, 0x25, 0xF4, 0x31, 0xDA, 0x82,
+    0xDA, 0x3A, 0x73, 0xF8, 0x2E, 0x83, 0x30, 0xBF, 0x1E, 0x47, 0x46, 0x2C, 0x62, 0xBA, 0xA7, 0x95,
+    0x5D, 0xE2, 0xB8, 0x7A, 0xE2, 0x3F, 0xD9, 0x6C, 0xEF, 0xC8, 0x47, 0xA7, 0x19, 0x60, 0x56, 0xC0,
+    0x8F, 0xB4, 0x8E, 0x1F, 0x33, 0xAD, 0x2A, 0x08, 0xDA, 0x53, 0x52, 0x2D, 0x86, 0x14, 0x6A, 0xB5,
+    0x94, 0xD0, 0xFC, 0xEE, 0xE6, 0xDD, 0x76, 0xC6, 0x91, 0xCA, 0x3D, 0x00, 0xA4, 0x63, 0x3A, 0x38,
+    0xE4, 0x79, 0xDE, 0x44, 0x48, 0x41, 0x50, 0x9C, 0x1A, 0xCB, 0x15, 0x68, 0xD5, 0xE5, 0xE8, 0x00,
+    0x69, 0x3E, 0x2B, 0x82, 0x3B, 0x3D, 0x0A, 0x8F, 0x8B, 0xBE, 0x98, 0x08, 0xD9, 0x66, 0xC3, 0xF2,
+    0xC9, 0x6E, 0xDF, 0xD0, 0xDC, 0xB1, 0x24, 0x91, 0xA8, 0x70, 0xFA, 0xD2, 0xD7, 0x43, 0x25, 0xE1,
+    0x04, 0xDA, 0xED, 0x5D, 0xBF, 0xD0, 0x1A, 0x8B, 0xBD, 0x22, 0xA1, 0xEC, 0x90, 0x76, 0xBF, 0x07,
+    0xE2, 0xA5, 0xB4, 0x4D, 0xEA, 0x39, 0xDA, 0x95, 0x2F, 0xE0, 0x77, 0x23, 0x07, 0x48, 0x28, 0x57,
+    0x35, 0xD7, 0x30, 0xC0, 0xB2, 0xFC, 0x6E, 0x2B, 0x2F, 0xF3, 0x44, 0x9C, 0xD8, 0xBF, 0xD9, 0x44,
+    0x2D, 0x92, 0xDF, 0x51, 0x7A, 0x6E, 0xBB, 0x69, 0xC9, 0xA8, 0xC2, 0x27, 0x15, 0x8F, 0x88, 0xE3,
+    0xFD, 0x96, 0xD4, 0x1D, 0x1A, 0xF9, 0xB7, 0x2C, 0x54, 0xE5, 0xA6, 0x4B, 0xBC, 0xC3, 0x89, 0xFD,
+    0x09, 0xAB, 0xB9, 0xB2, 0xC2, 0xF1, 0xB6, 0x9E, 0xFA, 0x2E, 0xF1, 0x6A, 0x2A, 0x3F, 0x3A, 0xDC,
+    0x21, 0x66, 0x76, 0xB5, 0x7C, 0xEA, 0xE5, 0xE0, 0xD9, 0xA9, 0x14, 0x92, 0xD6, 0x0D, 0x04, 0xB4,
+    0x04, 0x8A, 0xF6, 0xF1, 0x85, 0x69, 0xF4, 0x1F, 0x8D, 0xBC, 0x6A, 0x9B, 0x7F, 0x0D, 0x7C, 0xC7,
+    0x4C, 0x26, 0x60, 0x4F, 0xB0, 0x08, 0x5D, 0x15, 0x72, 0x02, 0x2E, 0xD1, 0xF1, 0xD1, 0xED, 0x8F,
+    0x0A, 0x8B, 0x8A, 0xD1, 0x18, 0x18, 0x77, 0x40, 0x40, 0x35, 0x2B, 0xDB, 0x28, 0x9B, 0x0B, 0x32,
+    0xBF, 0x17, 0x54, 0x3B, 0xF5, 0xEF, 0xED, 0x6A, 0x6C, 0x4D, 0x8C, 0x27, 0xF5, 0x36, 0xD2, 0x97,
+    0x20, 0x3E, 0x72, 0x50, 0x91, 0x79, 0x93, 0x53, 0x53, 0xA3, 0x50, 0xD3, 0x09, 0xAF, 0x36, 0x90,
+    0x0A, 0xAA, 0xE6, 0x19, 0x05, 0x5D, 0x5D, 0x6D, 0x04, 0x9A, 0x08, 0x7A, 0xD9, 0x06, 0x9C, 0x03,
+    0xD9, 0x12, 0xFA, 0x36, 0x10, 0xEB, 0x9C, 0x4C, 0x74, 0xEC, 0x69, 0x36, 0xB3, 0x8A, 0x0C, 0x22,
+    0xA6, 0xB3, 0xF1, 0xAE, 0x70, 0x8B, 0xA8, 0x38, 0x08, 0x0F, 0x42, 0x40, 0x89, 0x6D, 0x09, 0xEC,
+    0x71, 0x44, 0x8F, 0xD1, 0xC7, 0xCB, 0x8F, 0x4C, 0xEC, 0xC8, 0x5B, 0x7D, 0xB1, 0x77, 0x36, 0x66,
+    0xA6, 0xDF, 0x29, 0x2B, 0x2F, 0x5E, 0x8D, 0x3D, 0xE6, 0x38, 0xC1, 0x32, 0x0B, 0x64, 0x90, 0xB1,
+    0xA7, 0x03, 0x4A, 0x41, 0x94, 0xE6, 0xFF, 0x37, 0x1E, 0x75, 0xD4, 0x1C, 0x71, 0x63, 0xB4, 0x64,
+    0x9B, 0x1B, 0x4C, 0x7B, 0xFB, 0x16, 0x95, 0x95, 0xDB, 0xB6, 0x08, 0x93, 0x9B, 0x7B, 0x86, 0xA0,
+    0x53, 0x24, 0x40, 0x7F, 0x2F, 0xF0, 0x86, 0xE4, 0x89, 0x02, 0x88, 0xBA, 0x25, 0xE9, 0xD9, 0x46,
+    0x08, 0x1C, 0xBD, 0x73, 0x81, 0xBB, 0x48, 0x55, 0x65, 0x46, 0x9D, 0x06, 0x75, 0x99, 0x75, 0x7A,
+    0x06, 0x3E, 0x4B, 0x25, 0x8D, 0x7B, 0x78, 0x81, 0xC6, 0x98, 0xAA, 0x20, 0x22, 0x8B, 0x74, 0x6B,
+    0x01, 0x1E, 0x7A, 0x36, 0x39, 0xC7, 0x53, 0x09, 0x53, 0x92, 0xF0, 0x1A, 0x49, 0x2E, 0x91, 0x26,
+    0x02, 0xEB, 0x14, 0xEE, 0x8D, 0x48, 0xC1, 0x79, 0x01, 0x1B, 0x03, 0x33, 0x7B, 0xD1, 0xAE, 0x99,
+    0xD9, 0xDE, 0x17, 0xAB, 0xBE, 0xA8, 0x38, 0xAD, 0x8B, 0x82, 0x60, 0x4E, 0xF3, 0xF0, 0xB2, 0xFB,
+    0x51, 0x14, 0x57, 0x9A, 0xE3, 0xDC, 0xB0, 0x5C, 0x66, 0xDD, 0xFE, 0x2A, 0x5A, 0x10, 0x23, 0x2F,
+    0xBA, 0x07, 0x3C, 0x48, 0x37, 0x6A, 0x29, 0xA5, 0x6C, 0xC5, 0x1E, 0xCF, 0x36, 0x1C, 0x0B, 0x4B,
+    0x1F, 0x39, 0x8C, 0xAF, 0x16, 0x50, 0xEB, 0x42, 0x30, 0x5F, 0x23, 0x74, 0x85, 0x94, 0xFA, 0x69,
+    0x53, 0x95, 0xF8, 0xAF, 0x78, 0xDD, 0x88, 0x82, 0xC6, 0xEA, 0xBB, 0xB1, 0xAF, 0x12, 0xE8, 0x97,
+    0x9A, 0xBB, 0x70, 0x8C, 0x5D, 0x0B, 0x89, 0xB1, 0x86, 0x2F, 0x7C, 0x8B, 0x59, 0x57, 0x2D, 0xC9,
+    0xC8, 0x8A, 0xDC, 0xA1, 0xCD, 0xE1, 0x5D, 0x15, 0x2E, 0x6C, 0x9C, 0xAA, 0x22, 0x0A, 0x93, 0x6B,
+    0x8B, 0x9A, 0xDF, 0xE7, 0xBE, 0xD9, 0x29, 0x02, 0x09, 0x8A, 0x7B, 0x14, 0xA4, 0x86, 0xF2, 0x50,
+    0xFC, 0x64, 0xAA, 0x69, 0xC8, 0x8B, 0xB7, 0xA9, 0x55, 0xFB, 0x1F, 0xD4, 0x35, 0x91, 0xCE, 0x81,
+    0xBC, 0xC6, 0x54, 0x2A, 0x86, 0x2F, 0x02, 0x90, 0xB7, 0x01, 0x15, 0x31, 0x69, 0x67, 0x18, 0xA0,
+    0x2B, 0x90, 0x3A, 0xA9, 0xA1, 0x38, 0xDD, 0xA7, 0x42, 0x92, 0xE8, 0x71, 0xCE, 0x32, 0x18, 0x73,
+    0xCB, 0x1D, 0xC3, 0xA2, 0xF8, 0x1C, 0x6B, 0x60, 0xED, 0xCA, 0x0F, 0xF6, 0xB5, 0x80, 0x7A, 0x7A,
+    0x33, 0x6D, 0xD1, 0x6D, 0xD1, 0x8C, 0xD1, 0x58, 0x3E, 0xA7, 0x7A, 0x95, 0x30, 0x65, 0xBD, 0x07,
+    0x15, 0xC1, 0xFC, 0xFF, 0x41, 0x93, 0x5F, 0x7C, 0x7F, 0x30, 0x66, 0x52, 0x44, 0x16, 0x39, 0x6D,
+    0x42, 0x9D, 0x0D, 0xF1, 0x72, 0x69, 0x11, 0x53, 0xC3, 0xA0, 0x9B, 0x89, 0xB6, 0xE4, 0x8C, 0x4B,
+    0x87, 0x80, 0x9A, 0xB4, 0x3E, 0x33, 0x8D, 0xAB, 0x81, 0x15, 0x05, 0x19, 0x87, 0xB1, 0xDA, 0x05,
+    0x4B, 0x60, 0xBA, 0x1D, 0xE7, 0x3B, 0x7E, 0x42, 0xAB, 0x5A, 0xD0, 0x21, 0x30, 0xB5, 0x78, 0xB5,
+    0xC0, 0x8F, 0x83, 0x39, 0x7A, 0x7A, 0xAF, 0x4F, 0x9B, 0xCC, 0xD9, 0xDA, 0x01, 0x9C, 0xFE, 0xAD,
+    0xAB, 0xE7, 0xF7, 0x2F, 0xC1, 0xE6, 0x32, 0xC4, 0x9F, 0xCD, 0x10, 0xF2, 0xA5, 0x0F, 0xDD, 0x54,
+    0x98, 0xEA, 0x57, 0x7C, 0x43, 0x39, 0xAA, 0x95, 0x83, 0x7E, 0x1B, 0x34, 0x3A, 0x29, 0xF7, 0x07,
+    0xC0, 0x8B, 0xAF, 0x48, 0x71, 0xED, 0xEA, 0x7F, 0x73, 0xD6, 0x0E, 0x6D, 0x96, 0xC3, 0x0F, 0x9F,
+    0xA9, 0x5C, 0x98, 0x00, 0x16, 0xC4, 0xC6, 0x72, 0xEF, 0x00, 0x27, 0x01, 0x31, 0x75, 0x18, 0x28,
+    0x75, 0xE5, 0xCB, 0x4D, 0x9E, 0x25, 0xCD, 0x72, 0xD8, 0xAA, 0x1B, 0x0B, 0x35, 0x6A, 0xDC, 0x0A,
+    0x11, 0x85, 0x01, 0x7B, 0x94, 0x29, 0xA8, 0x41, 0x29, 0xD4, 0xCE, 0xBE, 0x7B, 0x14, 0x45, 0x52,
+    0x56, 0xEB, 0x4E, 0x45, 0x14, 0x62, 0x87, 0xA4, 0x29, 0x24, 0xF6, 0xF8, 0x70, 0x77, 0x29, 0x6A,
+    0xB6, 0x56, 0x46, 0x20, 0x5A, 0x9C, 0x45, 0x3A, 0x54, 0x6B, 0xF8, 0x2B, 0x4A, 0xCA, 0x8E, 0xBB,
+    0x97, 0x15, 0xAC, 0x6B, 0x60, 0x34, 0x73, 0x6F, 0x26, 0xEA, 0x1F, 0x1F, 0x8C, 0x10, 0x40, 0x46,
+    0x10, 0x09, 0x16, 0x37, 0x26, 0x86, 0xB1, 0xCF, 0x29, 0x28, 0x9F, 0x14, 0x75, 0x6C, 0xEE, 0x7F,
+    0x92, 0xFB, 0x95, 0xD6, 0xFA, 0x8F, 0x13, 0x75, 0x37, 0xA5, 0xCC, 0x8A, 0x8E, 0xD0, 0x50, 0x9D,
+    0x80, 0x3B, 0xD8, 0x1E, 0x5A, 0xA4, 0x66, 0xA9, 0x5D, 0xC7, 0xB2, 0x25, 0x3D, 0xCB, 0x36, 0x82,
+    0x36, 0x9F, 0xCD, 0x11, 0x07, 0x6B, 0x94, 0xED, 0x1D, 0xB2, 0x5A, 0xD8, 0x39, 0xEE, 0xC9, 0x5F,
+    0x5A, 0xDC, 0x2D, 0xDE, 0x75, 0x9D, 0x3C, 0x6E, 0xA0, 0xD3, 0x61, 0x96, 0x08, 0x44, 0x37, 0x31,
+    0x62, 0xDB, 0xC1, 0xEC, 0x72, 0x7A, 0xDF, 0x29, 0xD7, 0x94, 0x10, 0x42, 0xA0, 0x77, 0xC4, 0x3E,
+    0xA2, 0x6D, 0x4D, 0x0D, 0x3F, 0xFA, 0x9A, 0x3B, 0x3D, 0x7D, 0x86, 0xD1, 0x91, 0x96, 0x3F, 0x6C,
+    0x9C, 0xEF, 0x83, 0xE7, 0x31, 0xC9, 0xEB, 0x7B, 0xDA, 0x82, 0x7A, 0xAA, 0xF9, 0xD7, 0xB2, 0x55,
+    0x39, 0xE8, 0xF4, 0xEC, 0x06, 0xE8, 0x1C, 0x22, 0x68, 0x18, 0x10, 0x8F, 0xF9, 0x13, 0x0C, 0x0E,
+    0xEC, 0x26, 0xDB, 0x0D, 0x03, 0xE1, 0x24, 0xC1, 0x97, 0xDB, 0x13, 0xA1, 0x2C, 0xFC, 0x61, 0x32,
+    0xC6, 0x1B, 0xFB, 0x4F, 0x7C, 0x18, 0xD4, 0x85, 0x1E, 0x14, 0xEE, 0x45, 0x1A, 0x0C, 0xA3, 0xD0,
+    0x2A, 0x8F, 0x44, 0x10, 0x7F, 0x32, 0xC3, 0x6E, 0xF9, 0x57, 0x6D, 0x59, 0x49, 0xAA, 0xD0, 0x5D,
+    0xBA, 0xB7, 0xA5, 0x28, 0xD3, 0xE9, 0x1E, 0x99, 0xB1, 0x46, 0x4B, 0xF5, 0x8D, 0x4A, 0xE1, 0x11,
+    0xAF, 0x9F, 0xBE, 0x3A, 0x21, 0xE1, 0x3F, 0x8F, 0x83, 0xF0, 0x2F, 0x30, 0xB6, 0x59, 0x4F, 0x03,
+    0x17, 0xDA, 0x32, 0x7F, 0x01, 0x0F, 0x58, 0xB1, 0xAC, 0x04, 0xA5, 0xC3, 0x4D, 0x5C, 0x13, 0xFD,
+    0x14, 0x58, 0x8D, 0xEE, 0x78, 0x82, 0xBD, 0xD4, 0xFE, 0xA3, 0x7F, 0xDC, 0x78, 0x44, 0x07, 0x3A,
+    0x4A, 0x64, 0x31, 0x1A, 0x7F, 0xBD, 0x5E, 0x7D, 0x20, 0x99, 0x3B, 0xE3, 0x2B, 0x99, 0x89, 0xDA,
+    0xEA, 0x73, 0x13, 0x5E, 0x53, 0x5C, 0x93, 0x93, 0xE9, 0x8B, 0xEA, 0x7E, 0xB5, 0xAA, 0xDD, 0xA0,
+    0x63, 0x0C, 0xB1, 0x2F, 0x2C, 0xD7, 0xAA, 0x13, 0x51, 0x5D, 0xA8, 0x5C, 0x97, 0x9A, 0x9B, 0xF2,
+    0x70, 0x0D, 0xA6, 0x1C, 0x6E, 0xD1, 0xA5, 0xBA, 0xB8, 0x62, 0x78, 0x00, 0xB1, 0xE5, 0x5D, 0xB5,
+    0x9F, 0xD0, 0x0C, 0x06, 0x51, 0x9E, 0x41, 0xF0, 0xE3, 0xBA, 0x46, 0x39, 0x83, 0x39, 0xAF, 0x7A,
+    0xDF, 0x5C, 0x0E, 0xDB, 0xE4, 0xEB, 0x4C, 0x0E, 0x99, 0xC3, 0xD7, 0x95, 0x31, 0xBF, 0xDB, 0x2D,
+    0xB1, 0x21, 0xA8, 0xDD, 0xB6, 0xB8, 0xAE, 0x08, 0x0A, 0x71, 0x23, 0xF9, 0xE1, 0x57, 0xAD, 0xB8,
+    0x19, 0xBA, 0x39, 0xB6, 0x65, 0xAC, 0xC3, 0x42, 0x6F, 0xB9, 0x4A, 0xD9, 0xB5, 0xB9, 0xA9, 0x1E,
+    0xE5, 0xA7, 0x3F, 0xE6, 0x40, 0x63, 0x02, 0x2F, 0xF2, 0x01, 0x0D, 0x07, 0xA1, 0x2F, 0xC3, 0x65,
+    0xC0, 0x58, 0x2D, 0x21, 0xBC, 0x4C, 0x6E, 0x51, 0xF4, 0xB0, 0xF4, 0x87, 0x79, 0xA5, 0x74, 0x08,
+    0xF7, 0xFB, 0xF6, 0xF9, 0x13, 0x49, 0x11, 0xBC, 0x36, 0x14, 0x87, 0x20, 0x06, 0x74, 0xBA, 0x1E,
+    0xCF, 0x92, 0xBC, 0xC3, 0x26, 0x6D, 0xD9, 0x05, 0xC6, 0x08, 0x91, 0x97, 0x8F, 0x0F, 0xC1, 0x9A,
+    0x3A, 0x91, 0x9C, 0x5F, 0xBE, 0x51, 0x9D, 0x01, 0xA4, 0xF3, 0xAA, 0x26, 0x5E, 0x25, 0xDE, 0xF2,
+    0x01, 0x6B, 0x84, 0x85, 0x46, 0xBF, 0x8C, 0xCB, 0xBC, 0x24, 0x39, 0x88, 0xB7, 0x2E, 0x5B, 0xD4,
+    0x36, 0x12, 0xD4, 0xFD, 0xAE, 0x81, 0xA3, 0x9E, 0xD6, 0xE8, 0xA2, 0x40, 0xBD, 0x22, 0xBA, 0x0D,
+    0x51, 0x8C, 0x67, 0xBC, 0x54, 0x13, 0x3C, 0x1D, 0x05, 0x20, 0xA8, 0x9D, 0x61, 0x0A, 0x74, 0x73,
+    0x99, 0x5E, 0xBD, 0xB3, 0x10, 0xD9, 0xC7, 0x7C, 0x58, 0x24, 0xF5, 0x9F, 0xFA, 0x13, 0x35, 0x83,
+    0x1A, 0x14, 0x13, 0x7B, 0x3B, 0xB6, 0xF5, 0x16, 0xB2, 0x75, 0xC2, 0x9E, 0x41, 0x83, 0xC5, 0x68,
+    0x8C, 0xDF, 0xFC, 0xC1, 0x2E, 0xAC, 0xFC, 0x08, 0x1C, 0xE5, 0x2D, 0x15, 0x0D, 0xB8, 0xE2, 0x3F,
+    0xD7, 0xA1, 0x46, 0x9E, 0xCB, 0x46, 0x4A, 0x4A, 0x71, 0x88, 0x4E, 0x61, 0x0F, 0x82, 0x34, 0xF0,
+    0xC5, 0xEA, 0xD0, 0x08, 0x9A, 0xCF, 0xAE, 0x93, 0xEB, 0x69, 0x06, 0x2D, 0x96, 0x1F, 0x96, 0x70,
+    0xDE, 0x1A, 0x87, 0xA0, 0x24, 0x7E, 0x1F, 0x8E, 0x9C, 0xDB, 0x77, 0xC1, 0x95, 0xDC, 0xDE, 0x9E,
+    0xE7, 0xEE, 0x85, 0xD9, 0xB4, 0xEC, 0xD5, 0x2A, 0xDF, 0xF7, 0xCD, 0xA6, 0x2B, 0x81, 0xFA, 0xE6,
+    0x10, 0xB1, 0x3B, 0x03, 0x23, 0xE0, 0xBD, 0xA1, 0xA4, 0x7F, 0x89, 0x69, 0x55, 0x78, 0x14, 0xB1,
+    0x86, 0x07, 0x6E, 0xB0, 0xB2, 0xB3, 0x96, 0xFD, 0xA0, 0x03, 0x00, 0xC1, 0xF5, 0x60, 0xAA, 0x62,
+    0xD4, 0xB2, 0xC7, 0xA3, 0x9E, 0x25, 0xF5, 0xF5, 0xB3, 0x85, 0x1D, 0xD2, 0x47, 0xDB, 0xF3, 0x1E,
+    0x70, 0x85, 0xAC, 0x30, 0x02, 0x87, 0xF4, 0xEB, 0xB8, 0x99, 0xFB, 0x65, 0xAA, 0x56, 0x3F, 0xDC,
+    0x5C, 0x52, 0x2C, 0x2A, 0xDE, 0x23, 0xEA, 0xE7, 0xD0, 0x20, 0x9C, 0xF3, 0x9A, 0xA9, 0x16, 0x4C,
+    0xCE, 0x29, 0x87, 0x08, 0x52, 0xA4, 0x5D, 0x3A, 0x4C, 0xC6, 0x2C, 0x13, 0x16, 0x94, 0x3E, 0x14,
+    0x5B, 0x50, 0x92, 0x34, 0xC2, 0x64, 0x7A, 0x95, 0x89, 0x5C, 0xCA, 0x82, 0xF8, 0x59, 0x7B, 0x27,
+    0xAA, 0x0F, 0x64, 0x45, 0xBB, 0xFA, 0x61, 0x30, 0x30, 0x57, 0x6E, 0x3A, 0x69, 0x1A, 0x8F, 0x3E,
+    0xB7, 0x63, 0xCB, 0x86, 0xF6, 0xE2, 0xC6, 0xDF, 0xFB, 0xE5, 0xB7, 0xEA, 0x3B, 0xF5, 0x28, 0x31,
+    0x6C, 0x44, 0x54, 0xD3, 0xEC, 0x37, 0x77, 0xB9, 0xF7, 0x08, 0xF1, 0x05, 0xDA, 0x16, 0xB8, 0x95,
+    0x69, 0x5E, 0x84, 0x49, 0x31, 0xC5, 0xEC, 0x06, 0x30, 0x82, 0x52, 0xC2, 0x46, 0xB2, 0xE3, 0x47,
+    0xE6, 0x60, 0x12, 0x1C, 0x96, 0xDC, 0xBB, 0x08, 0x60, 0x4A, 0xC3, 0x01, 0x4D, 0xBC, 0x1A, 0x4E,
+    0xF8, 0x3C, 0x06, 0x66, 0xF0, 0x78, 0xB9, 0x6D, 0x04, 0x66, 0x60, 0xDF, 0x7E, 0x5F, 0x2C, 0x07,
+    0x2A, 0x5A, 0x4F, 0x13, 0x59, 0x40, 0x26, 0x6F, 0xC6, 0x4A, 0x37, 0xE9, 0x5E, 0x58, 0x41, 0xEF,
+    0xCD, 0xCE, 0x89, 0xAD, 0xAB, 0x72, 0xEF, 0x16, 0x8B, 0x7D, 0x66, 0x1A, 0x98, 0xFC, 0x8B, 0xC2,
+    0xF7, 0xFD, 0xC3, 0xF9, 0x51, 0xCF, 0x26, 0x06, 0xC6, 0x28, 0x2C, 0x2E, 0x8D, 0x53, 0xBE, 0xD8,
+    0xA7, 0x26, 0xC3, 0xD6, 0xD8, 0x05, 0xCD, 0x19, 0xCC, 0xA3, 0x23, 0x14, 0x74, 0xC2, 0x97, 0x01,
+    0x1C, 0x0B, 0x96, 0x22, 0xE2, 0x94, 0x23, 0xD8, 0xC2, 0x1B, 0xF7, 0x03, 0xB5, 0x1E, 0x35, 0x2C,
+    0x9A, 0x9B, 0xCC, 0x7A, 0x1F, 0x04, 0x52, 0x26, 0x69, 0xD7, 0x6A, 0x21, 0xEA, 0xA8, 0x3A, 0x62,
+    0x51, 0xA2, 0x02, 0xB2, 0x37, 0x13, 0xC0, 0x57, 0xCC, 0x1D, 0xC4, 0xFF, 0xE6, 0x90, 0xC1, 0x86,
+    0x20, 0x5B, 0x03, 0xED, 0x6F, 0x32, 0x77, 0x9A, 0x86, 0xB1, 0x1C, 0x89, 0xFB, 0x9B, 0x2B, 0xF4,
+    0x86, 0xE9, 0xB9, 0xF0, 0x39, 0xF9, 0x85, 0x51, 0x0C, 0x62, 0x95, 0x01, 0x28, 0xD7, 0x6F, 0xB7,
+    0xBF, 0xC7, 0x2F, 0x2F, 0xF8, 0xAC, 0x31, 0xD1, 0xF8, 0x5D, 0x37, 0xDC, 0xBE, 0x98, 0x2D, 0x76,
+    0xC4, 0x9C, 0x20, 0xDA, 0xB6, 0xF3, 0xC3, 0xC0, 0x31, 0x14, 0xBF, 0x2B, 0x87, 0x00, 0x66, 0x4A,
+    0xE2, 0x50, 0x49, 0x84, 0x1E, 0x97, 0x85, 0xB8, 0xED, 0x33, 0x2B, 0xF8, 0x59, 0xC9, 0x03, 0x3F,
+    0x5A, 0x28, 0xA7, 0xB8, 0xFB, 0x9F, 0x2E, 0x44, 0xFA, 0x2E, 0x6D, 0xFF, 0x40, 0x9E, 0x21, 0xE4,
+    0x05, 0xB6, 0x31, 0x76, 0xAE, 0xDB, 0x76, 0x96, 0x88, 0x4D, 0x96, 0xCE, 0x1E, 0xD4, 0x22, 0x91,
+    0xE4, 0xA8, 0x91, 0x5B, 0xED, 0xA4, 0x03, 0x10, 0x06, 0x8C, 0x24, 0xE4, 0xC4, 0x80, 0x16, 0x4D,
+    0x50, 0xAF, 0xC1, 0x64, 0x4A, 0xA4, 0xB9, 0x79, 0xE3, 0x37, 0x38, 0x7D, 0x8A, 0x85, 0x90, 0xB7,
+    0x1C, 0x7D, 0x24, 0x26, 0x7F, 0x5F, 0x0C, 0x9D, 0xB3, 0x2D, 0x4D, 0xB0, 0xEE, 0xAC, 0x95, 0x8F,
+    0x2E, 0x5A, 0xA2, 0x78, 0x7D, 0x0D, 0xDA, 0x99, 0x47, 0x93, 0x13, 0xF9, 0x0C, 0xFF, 0x5E, 0x71,
+    0x99, 0x8D, 0xE3, 0x21, 0x03, 0x44, 0xF7, 0x4D, 0x61, 0xD0, 0x1D, 0x47, 0xCB, 0x3D, 0x57, 0x4D,
+    0x43, 0x3C, 0x01, 0xBB, 0x33, 0xC2, 0x04, 0x91, 0x66, 0xC9, 0xA1, 0xF2, 0x18, 0x47, 0x0D, 0x60,
+    0x61, 0x9F, 0xA7, 0x27, 0x99, 0xB5, 0x27, 0x88, 0x60, 0x2B, 0x8D, 0x3C, 0x8F, 0xD5, 0x53, 0xDD,
+    0x64, 0xC5, 0x14, 0xB3, 0x77, 0x5C, 0xDE, 0xA9, 0x91, 0x2E, 0x23, 0x83, 0x24, 0xE3, 0xE6, 0x38,
+    0xC5, 0xCB, 0x9B, 0x4E, 0xC4, 0xEE, 0x3D, 0x7D, 0x58, 0x6C, 0x60, 0x16, 0x97, 0xBC, 0xF6, 0x47,
+    0x77, 0x83, 0xCE, 0xF1, 0xA9, 0x8F, 0xDA, 0xFF, 0xB3, 0xE4, 0x52, 0x50, 0x67, 0xBA, 0x13, 0x2A,
+    0xAB, 0xB4, 0x32, 0xC0, 0x4C, 0xAE, 0xBC, 0x92, 0x3C, 0x65, 0x97, 0xA4, 0xD8, 0x10, 0xDF, 0x60,
+    0x95, 0xCA, 0x74, 0x17, 0x3F, 0x8A, 0xC5, 0x2A, 0x9F, 0xAF, 0xDB, 0xA4, 0x3C, 0x77, 0x01, 0xA6,
+    0x02, 0x66, 0x0C, 0x15, 0x0F, 0x00, 0x90, 0xBD, 0x9B, 0x77, 0x53, 0xFD, 0x93, 0x44, 0x6F, 0x86,
+    0x50, 0x54, 0x11, 0x40, 0xBE, 0x72, 0xD2, 0xE5, 0x4B, 0xA4, 0x13, 0x88, 0x0D, 0xAA, 0x87, 0xFB,
+    0xED, 0x6E, 0x66, 0x59, 0xFB, 0xB8, 0xA0, 0xFE, 0xD1, 0x08, 0x27, 0x07, 0xC4, 0x31, 0x31, 0x8C,
+    0x6F, 0xE2, 0x0B, 0x23, 0x95, 0x96, 0xF6, 0x3B, 0xD9, 0xD4, 0xB6, 0x5D, 0x84, 0xC2, 0xC4, 0x23,
+    0xE9, 0xF2, 0xB6, 0x96, 0x9E, 0xD0, 0x4A, 0xE2, 0x2D, 0xAB, 0xBB, 0xB0, 0xAA, 0xEC, 0xFE, 0x67,
+    0x3A, 0xF9, 0x1A, 0xA8, 0x30, 0xDA, 0x9A, 0x17, 0xD5, 0x46, 0xCC, 0xBA, 0xF7, 0xDA, 0x8E, 0x54,
+    0x49, 0x58, 0xBE, 0x9C, 0x3B, 0x7E, 0x4E, 0xE4, 0x06, 0x8E, 0x32, 0xB4, 0x7A, 0xEA, 0xF8, 0x40,
+    0x78, 0xD4, 0x62, 0xBD, 0xAC, 0xA7, 0x9F, 0x0B, 0x27, 0xC4, 0x90, 0xA1, 0xDF, 0x15, 0x64, 0xBA,
+    0xEC, 0xCB, 0x69, 0xF7, 0xBF, 0xE6, 0x0D, 0x89, 0x6E, 0x5D, 0x62, 0x5D, 0xEA, 0x04, 0x37, 0x1B,
+    0x40, 0x04, 0x37, 0x3B, 0xD0, 0xC6, 0xE0, 0xFC, 0x63, 0xA6, 0xA1, 0xC8, 0xAB, 0x45, 0xA4, 0xFD,
+    0x05, 0xFA, 0x57, 0x01, 0x5F, 0x34, 0x76, 0x0B, 0xCF, 0xB0, 0xD3, 0xFD, 0xED, 0x66, 0xAC, 0xFB,
+    0x63, 0x89, 0x53, 0x46, 0x61, 0xFF, 0x22, 0x64, 0xEB, 0x20, 0x60, 0x02, 0x0B, 0x78, 0xA4, 0xEC,
+    0xF9, 0x1D, 0x34, 0xAB, 0x98, 0x33, 0xB7, 0x76, 0x4D, 0xDA, 0x4C, 0x33, 0x57, 0xD6, 0x23, 0x84,
+    0x25, 0x76, 0x4A, 0x0B, 0xDD, 0xC5, 0xCD, 0x8B, 0xFF, 0xB8, 0x22, 0x37, 0x16, 0xAB, 0xCE, 0xDD,
+    0x92, 0xDB, 0xD1, 0x12, 0xB3, 0x52, 0xD0, 0xE5, 0x4E, 0xBE, 0x69, 0xA8, 0xDF, 0x2F, 0xAF, 0x22,
+    0x29, 0xD0, 0x28, 0xD3, 0x80, 0xA1, 0x39, 0x57, 0x88, 0x17, 0xBA, 0x63, 0x75, 0xD7, 0xB9, 0x05,
+    0xBC, 0x4E, 0x60, 0x02, 0xAC, 0x84, 0x96, 0xD9, 0x23, 0x1E, 0xE3, 0xDA, 0xD6, 0x74, 0xC2, 0xCD,
+    0xA4, 0x22, 0x65, 0x82, 0x50, 0x10, 0xFE, 0x76, 0xF5, 0xE7, 0x61, 0x0D, 0x86, 0xD9, 0x8D, 0x56,
+    0x10, 0x43, 0x9C, 0xFE, 0x05, 0x3A, 0x51, 0x93, 0x81, 0x74, 0xD2, 0x11, 0x10, 0x82, 0xFC, 0x4C,
+    0xA1, 0x83, 0x64, 0x21, 0x4B, 0xEB, 0xA9, 0x8E, 0x9A, 0xB8, 0xAB, 0x95, 0x15, 0x96, 0x9D, 0x49,
+    0x9D, 0xFE, 0xEC, 0xC8, 0xC3, 0x6B, 0xBB, 0x4C, 0x8E, 0x75, 0xBB, 0x8C, 0x42, 0x76, 0x18, 0x8E,
+    0x6F, 0xE0, 0xD6, 0x7C, 0x19, 0xDA, 0x08, 0xD7, 0xE1, 0x73, 0x6C, 0x18, 0x1B, 0x90, 0xCF, 0x6E,
+    0x18, 0xE4, 0x61, 0xC7, 0x1B, 0xE3, 0x93, 0x22, 0x80, 0xB0, 0xE6, 0x66, 0xA0, 0xF7, 0x06, 0xA9,
+    0x1E, 0xD8, 0x62, 0xC5, 0xE3, 0x52, 0x59, 0xF1, 0x71, 0x2A, 0x3C, 0xC0, 0xBC, 0x37, 0xF4, 0x51,
+    0x8C, 0x81, 0xB4, 0x65, 0x95, 0x4A, 0x9D, 0xB5, 0xDF, 0x59, 0x2A, 0x06, 0xA6, 0xB1, 0x05, 0xCE,
+    0xF3, 0x24, 0x7A, 0x59, 0x37, 0x76, 0x79, 0xAB, 0x84, 0x23, 0xF9, 0x5C, 0xFD, 0x48, 0xA3, 0xED,
+    0x75, 0xB8, 0x58, 0x2F, 0x8A, 0xE7, 0xAD, 0x71, 0x94, 0x62, 0x27, 0x1C, 0xAC, 0x5F, 0xE3, 0x92,
+    0x12, 0x6F, 0xAE, 0xAC, 0x12, 0xDA, 0xA9, 0x02, 0x45, 0xD7, 0x62, 0x53, 0xE0, 0xB8, 0xB9, 0xA8,
+    0x02, 0xD7, 0xED, 0xA9, 0x26, 0x8C, 0x8F, 0x82, 0x78, 0x93, 0x8D, 0x1E, 0x8F, 0x8D, 0xEC, 0x89,
+    0xBA, 0x37, 0x6A, 0x35, 0x21, 0x61, 0xD9, 0xE1, 0x52, 0x95, 0x46, 0xD5, 0x3A, 0xDF, 0x8B, 0xBD,
+    0x9F, 0x36, 0x71, 0x95, 0x09, 0x28, 0x88, 0xB1, 0xF0, 0x70, 0xC2, 0x01, 0xA1, 0x4E, 0x0A, 0xF8,
+    0xF2, 0x25, 0x1C, 0x60, 0x3C, 0xA3, 0xA0, 0xFB, 0x5C, 0x3E, 0xF4, 0x11, 0xCC, 0x54, 0xDA, 0xD7,
+    0x80, 0x80, 0xCC, 0xC2, 0xB0, 0x81, 0xDF, 0xC8, 0x1C, 0x96, 0x01, 0x95, 0x17, 0x4E, 0x01, 0x7E,
+    0x76, 0xF4, 0x1C, 0x61, 0x98, 0x58, 0x2A, 0xBD, 0x04, 0x7E, 0x14, 0x8A, 0x88, 0x77, 0xB6, 0xAD,
+    0x05, 0x54, 0xC7, 0xDA, 0xDD, 0x08, 0xBA, 0x5C, 0x9F, 0xC8, 0x3C, 0x87, 0x24, 0xB5, 0xA0, 0x53,
+    0xC7, 0xBD, 0x92, 0x77, 0x5F, 0xE8, 0x22, 0x34, 0x27, 0x98, 0x10, 0xD7, 0x4B, 0x76, 0x77, 0x26,
+    0x2D, 0xD0, 0x24, 0x03, 0x8E, 0x15, 0x57, 0xF2, 0xC6, 0xED, 0x39, 0xB7, 0xAD, 0xE9, 0xFA, 0x14,
+    0xED, 0xCF, 0x50, 0x9E, 0x8D, 0xAC, 0x87, 0x4B, 0x26, 0x28, 0xE4, 0x02, 0xBE, 0x24, 0x6A, 0x39,
+    0x17, 0xBE, 0x9B, 0x79, 0xB7, 0x7E, 0xDF, 0xA6, 0x6E, 0x7B, 0x52, 0xE6, 0x1C, 0xD2, 0xAD, 0xCE,
+    0x30, 0xB9, 0x91, 0xE7, 0x64, 0x8B, 0xBD, 0x1E, 0x8E, 0x40, 0xE3, 0x69, 0xA6, 0xD4, 0xB2, 0x18,
+    0x42, 0x53, 0x6C, 0xE6, 0x1C, 0x69, 0xF9, 0x26, 0x84, 0x4E, 0x6F, 0x16, 0xD5, 0x39, 0xB5, 0x4C,
+    0x86, 0xC9, 0x0D, 0x07, 0x6D, 0x25, 0x61, 0x9E, 0x7D, 0xDA, 0xB7, 0x13, 0x73, 0x7B, 0xC6, 0xF9,
+    0xF8, 0x25, 0x9D, 0x44, 0xA6, 0x70, 0xFE, 0x5F, 0xC0, 0xFA, 0x64, 0xEE, 0x85, 0x6D, 0xA5, 0x0C,
+    0x28, 0x68, 0x8C, 0x17, 0xCE, 0x3E, 0x38, 0x86, 0x83, 0x24, 0x97, 0xA3, 0xC2, 0x54, 0xF9, 0x3C,
+    0xE7, 0x3A, 0xE8, 0xBC, 0x6D, 0xB8, 0x17, 0x7D, 0xF0, 0x6C, 0xEF, 0xFB, 0xBB, 0xC9, 0xD7, 0x5B,
+    0xBF, 0xBB, 0x99, 0x83, 0x94, 0x29, 0xE9, 0x9F, 0xFC, 0x6D, 0xD7, 0xA8, 0x6C, 0x62, 0x42, 0x18,
+    0x95, 0x2D, 0x44, 0xFF, 0xB4, 0x48, 0x30, 0x88, 0x29, 0x25, 0x41, 0x83, 0x0F, 0xAE, 0x9D, 0xE3,
+    0xEC, 0xB2, 0x18, 0x0F, 0xBF, 0x4F, 0x11, 0x1F, 0xDA, 0xF2, 0xEC, 0x54, 0xE3, 0xCF, 0xE9, 0xAD,
+    0x4A, 0x7E, 0xF0, 0xDE, 0xD4, 0x65, 0x21, 0x6F, 0x3A, 0xA8, 0x2E, 0xD5, 0x02, 0x39, 0x11, 0x4C,
+    0xA5, 0x0A, 0xF1, 0xE4, 0x04, 0xFE, 0xC7, 0xFA, 0xE2, 0x2B, 0x74, 0xD3, 0xBD, 0xB2, 0x8D, 0xAB,
+    0x18, 0x6B, 0x22, 0x3B, 0x79, 0x67, 0x88, 0x0F, 0x05, 0xB2, 0xA5, 0x26, 0x9B, 0x5A, 0x4E, 0x96,
+    0xBE, 0xE4, 0x60, 0x9F, 0xD5, 0x8C, 0x0F, 0x81, 0x12, 0xEE, 0x5E, 0xAA, 0x63, 0x10, 0x0C, 0x87,
+    0x42, 0x73, 0xA7, 0x16, 0x97, 0x7D, 0x8A, 0x3E, 0x6C, 0xAC, 0xB8, 0xAF, 0x70, 0xC2, 0xCA, 0x95,
+    0xD5, 0x01, 0x9A, 0x3B, 0xB0, 0x36, 0xBF, 0xEE, 0xF9, 0x7D, 0x0B, 0xA1, 0x21, 0xA6, 0x6D, 0x85,
+    0x12, 0xB1, 0xCF, 0x14, 0xE8, 0xCC, 0xFC, 0xC3, 0xA2, 0x1A, 0x09, 0x28, 0x48, 0xEB, 0xA8, 0xB2,
+    0x8B, 0x4D, 0x17, 0xCD, 0x5C, 0x47, 0x70, 0xB9, 0x82, 0xB0, 0xFF, 0xEA, 0xE8, 0x3F, 0x64, 0xDB,
+    0x9A, 0x0E, 0xFC, 0xED, 0x1D, 0xD2, 0xDE, 0x03, 0x92, 0x91, 0x17, 0xF1, 0x6F, 0x38, 0x14, 0xEC,
+    0x79, 0x14, 0xCF, 0xA0, 0x2B, 0x63, 0x65, 0x84, 0x28, 0xD3, 0xB8, 0x77, 0x4C, 0x0B, 0x55, 0x4D,
+    0xF5, 0x89, 0xEF, 0xE7, 0x41, 0xC1, 0x5F, 0x18, 0xAE, 0x06, 0x7F, 0xA9, 0x37, 0x84, 0x34, 0x6F,
+    0x7C, 0xC3, 0x9B, 0x96, 0x68, 0x88, 0x91, 0x99, 0x35, 0x2B, 0xFF, 0x62, 0xD8, 0xC5, 0xE0, 0x4D,
+    0x40, 0x79, 0x1D, 0x18, 0x30, 0x58, 0x4B, 0xF9, 0x48, 0xA7, 0x27, 0x02, 0xF5, 0x67, 0xB3, 0x17,
+    0x4C, 0x22, 0x46, 0x2B, 0x39, 0x20, 0x79, 0x22, 0xE9, 0x25, 0x13, 0x1D, 0x28, 0x20, 0x3E, 0xDA,
+    0x49, 0x53, 0xA6, 0x3D, 0x7F, 0x70, 0x7B, 0xA6, 0x75, 0xA9, 0x45, 0xEB, 0x3B, 0x8F, 0xFE, 0x36,
+    0xAD, 0xBA, 0xBE, 0x5B, 0x5A, 0x5B, 0x9E, 0x2A, 0xEA, 0x28, 0xFE, 0xD5, 0x2D, 0x4A, 0x89, 0x7B,
+    0x6C, 0xBE, 0xF6, 0xEF, 0x19, 0xCD, 0xA1, 0x90, 0xD1, 0x44, 0x10, 0x58, 0x58, 0xD8, 0x39, 0x53,
+    0x13, 0xA9, 0xBF, 0x02, 0xBC, 0x7A, 0xD3, 0xBC, 0xD1, 0x61, 0xA4, 0xCC, 0x64, 0x0C, 0xF3, 0x51,
+    0x7C, 0x8B, 0x03, 0x67, 0xBC, 0xA4, 0x0C, 0x20, 0x5C, 0xD5, 0xF1, 0xCA, 0xF3, 0x7B, 0x93, 0x5D,
+    0x1D, 0x5B, 0x2C, 0xF2, 0x92, 0x3D, 0xF5, 0x0B, 0x90, 0x4C, 0x0C, 0xB6, 0x1C, 0x4D, 0x8D, 0x15,
+    0x9C, 0x9B, 0x46, 0xDC, 0xC0, 0x7D, 0x01, 0x92, 0x2B, 0x7D, 0xED, 0xCA, 0x27, 0xF3, 0xA2, 0x0F,
+    0x46, 0x62, 0x09, 0xEA, 0x4B, 0xB1, 0x70, 0x6C, 0x24, 0x96, 0x93, 0xFB, 0xA5, 0x95, 0xD6, 0xF6,
+    0xDD, 0x04, 0x39, 0x05, 0x58, 0x5C, 0xAC, 0xE2, 0x12, 0xAC, 0x9C, 0x7F, 0x69, 0xBB, 0x0D, 0xD1,
+    0xD8, 0xE7, 0x26, 0x6D, 0x32, 0xCF, 0xB7, 0x12, 0xC5, 0x21, 0x49, 0x64, 0xCC, 0x31, 0x72, 0x33,
+    0x8E, 0x2F, 0xC5, 0x9F, 0x4C, 0x92, 0x5E, 0xDB, 0x03, 0x8F, 0x1F, 0x2A, 0xBB, 0xA6, 0x9C, 0xA0,
+    0x1F, 0xC2, 0x89, 0xB1, 0xA6, 0x70, 0x32, 0x17, 0x74, 0x35, 0x14, 0xE2, 0xF8, 0x83, 0x9D, 0x1E,
+    0x04, 0xD7, 0x05, 0x34, 0x8E, 0xAE, 0xA8, 0x0A, 0x34, 0x74, 0xA7, 0x42, 0x1B, 0x1F, 0x90, 0x31,
+    0xA7, 0x9A, 0xFA, 0xC7, 0xD3, 0x6C, 0x45, 0xBA, 0x49, 0x3C, 0x4E, 0xBA, 0x85, 0xFC, 0x0B, 0x8A,
+    0x89, 0xEF, 0x6A, 0xD2, 0x88, 0xF1, 0xA9, 0xA4, 0x55, 0x54, 0xA0, 0x38, 0x4D, 0xEC, 0x1B, 0x9D,
+    0x70, 0x7F, 0x98, 0x9E, 0xE0, 0x7E, 0xC0, 0x4F, 0xD3, 0xA5, 0xC5, 0x78, 0x86, 0xDD, 0x92, 0xB5,
+    0x8A, 0xA5, 0xFB, 0x75, 0x64, 0x06, 0x66, 0xAF, 0x06, 0xF2, 0xEF, 0x7C, 0x82, 0x61, 0xE3, 0x81,
+    0x64, 0xBC, 0x53, 0x03, 0x8B, 0x62, 0x61, 0xE7, 0xFD, 0x75, 0x3A, 0x63, 0x9C, 0x03, 0x84, 0x00,
+    0xA0, 0x90, 0x27, 0xAA, 0xF3, 0xA7, 0xF8, 0xB4, 0xB5, 0xF5, 0xC7, 0x22, 0xDE, 0x35, 0x95, 0x3A,
+    0x35, 0xE6, 0x6D, 0x89, 0x58, 0x0D, 0xBC, 0xC2, 0xC6, 0x97, 0xB1, 0xD4, 0xA6, 0xF0, 0x65, 0x66,
+    0x7F, 0x19, 0xAF, 0x50, 0x88, 0xB9, 0x58, 0x8C, 0xC2, 0xED, 0x6E, 0x4A, 0xF8, 0xB3, 0xC7, 0x06,
+    0x1A, 0xCF, 0x92, 0xC4, 0x98, 0x43, 0x27, 0x0D, 0xA2, 0x01, 0x5B, 0x85, 0x98, 0x8C, 0x9C, 0x5E,
+    0x82, 0x19, 0xA8, 0x4E, 0xA8, 0x60, 0xB1, 0xEE, 0x14, 0x73, 0xC7, 0x70, 0xA9, 0x6E, 0x2A, 0x39,
+    0x4F, 0xF6, 0x4C, 0x77, 0x1F, 0xB3, 0x7A, 0x4B, 0xAB, 0xA8, 0x14, 0x8D, 0xF2, 0xC5, 0xBC, 0xE2,
+    0xF1, 0x7E, 0xB8, 0xC3, 0x6B, 0xA2, 0xF5, 0x61, 0x79, 0x93, 0x98, 0xBB, 0x13, 0x5F, 0x7F, 0x62,
+    0xAE, 0x74, 0xC6, 0xF8, 0x23, 0x4F, 0xA6, 0x41, 0x0D, 0x23, 0xF6, 0x3F, 0xF5, 0x23, 0xD9, 0xE4,
+    0xCC, 0x87, 0xA5, 0x3E, 0xF8, 0xCC, 0xBC, 0x4F, 0x8F, 0xC8, 0x5C, 0xC8, 0x7D, 0xC1, 0xC4, 0x23,
+    0x66, 0x62, 0xA5, 0x75, 0xC7, 0x44, 0x15, 0x84, 0xC3, 0xFC, 0x16, 0x81, 0x7F, 0xE5, 0x0C, 0xDA,
+    0xAC, 0xD8, 0x53, 0x71, 0x5D, 0xBE, 0x91, 0xB8, 0xFC, 0x3B, 0x8F, 0x88, 0x2D, 0x67, 0xA4, 0x1D,
+    0x9F, 0xFB, 0x12, 0xD7, 0x1D, 0xF0, 0x6C, 0x2F, 0x2D, 0xA3, 0x36, 0x97, 0x1A, 0xA5, 0x5D, 0xE7,
+    0x18, 0x21, 0x31, 0xFB, 0xAB, 0x1E, 0x75, 0x41, 0x70, 0x4C, 0xC4, 0xBB, 0x01, 0x7B, 0x72, 0x51,
+    0xAE, 0x0B, 0xB3, 0x59, 0x6D, 0xA4, 0x1F, 0xCB, 0x69, 0x7C, 0x72, 0x28, 0xF6, 0x85, 0xC2, 0xA1,
+    0x88, 0x4A, 0x82, 0xEA, 0xCF, 0xBA, 0x87, 0xB7, 0x13, 0x5B, 0xD0, 0xFC, 0x5E, 0x77, 0x4F, 0x3D,
+    0x92, 0x9E, 0x3F, 0xB0, 0xE0, 0xDC, 0x9B, 0xB8, 0x67, 0x13, 0xCE, 0x5D, 0x2F, 0xE8, 0x96, 0xF6,
+    0x18, 0x24, 0x52, 0x87, 0x6E, 0x46, 0x51, 0x80, 0x37, 0x56, 0xE2, 0xE2, 0x3D, 0x33, 0x82, 0x31,
+    0xEF, 0x0E, 0xA2, 0xB2, 0x56, 0xF9, 0x3F, 0xBA, 0x22, 0x26, 0x96, 0x3E, 0x3D, 0xE6, 0x35, 0x8E,
+    0x24, 0x19, 0x7D, 0x0E, 0x0B, 0x10, 0x4C, 0xFE, 0x74, 0x59, 0x32, 0x9C, 0x65, 0xA7, 0xB1, 0xEF,
+    0x08, 0xF8, 0x07, 0x1C, 0x11, 0x52, 0xC0, 0x8F, 0xE3, 0x93, 0x9E, 0x53, 0x23, 0x13, 0xA6, 0x3E,
+    0xB3, 0xB1, 0x20, 0x24, 0xB6, 0xE1, 0x22, 0xD1, 0xED, 0x36, 0xD3, 0x5C, 0x18, 0xC4, 0xE4, 0x09,
+    0x7F, 0x60, 0x45, 0x9D, 0xCE, 0xAE, 0xDF, 0xE2, 0xD4, 0xC6, 0xBA, 0x53, 0x6B, 0x97, 0xAD, 0x2B,
+    0x60, 0x54, 0x60, 0x22, 0x3C, 0x4C, 0x25, 0x2C, 0x87, 0xF9, 0x64, 0x51, 0x60, 0x2E, 0xE1, 0x90,
+    0xAE, 0xCC, 0x70, 0xC1, 0xCA, 0x62, 0x07, 0xEF, 0x63, 0x40, 0x80, 0x7B, 0xC2, 0x35, 0x56, 0xC6,
+    0xB8, 0x12, 0x0E, 0x34, 0xF4, 0x54, 0x28, 0x53, 0x52, 0xD4, 0x4F, 0x0F, 0x98, 0x78, 0x74, 0x9A,
+    0x4A, 0x1E, 0x77, 0x31, 0x4D, 0xAB, 0x7D, 0xDD, 0x07, 0x4E, 0x57, 0x24, 0xAE, 0x3F, 0xF1, 0x30,
+    0x19, 0xA8, 0x2E, 0x66, 0xB1, 0x4D, 0x30, 0x5B, 0x28, 0xB4, 0x9F, 0x48, 0xFF, 0x59, 0x19, 0xED,
+    0xA1, 0x47, 0x5F, 0xBF, 0xC0, 0x6C, 0x50, 0xCA, 0x7C, 0xF3, 0x01, 0x40, 0xAE, 0xD2, 0x06, 0x29,
+    0x68, 0xAF, 0xDA, 0xD5, 0x42, 0x5B, 0x75, 0xA3, 0xD0, 0xC1, 0x95, 0x6D, 0xB5, 0xB5, 0x1C, 0x63,
+    0x7D, 0x3F, 0x8F, 0x37, 0x84, 0x67, 0x69, 0xF9, 0xF4, 0x17, 0x03, 0xAB, 0xD8, 0x79, 0x0B, 0x8F,
+    0xB8, 0x78, 0x6C, 0x7B, 0xE6, 0x43, 0xA4, 0x87, 0x39, 0x3E, 0x57, 0xC6, 0x69, 0x13, 0x41, 0x8A,
+    0x14, 0x53, 0xBD, 0x1B, 0x44, 0x51, 0x96, 0x87, 0x4A, 0xEB, 0xD4, 0xCB, 0xE1, 0x65, 0x4A, 0x2F,
+    0xF6, 0xAC, 0x8A, 0x58, 0x94, 0x87, 0xC0, 0xB8, 0x19, 0x7F, 0x88, 0xC2, 0xDE, 0x9A, 0x8E, 0x57,
+    0xD7, 0xD5, 0xDB, 0x92, 0x8C, 0x16, 0xB7, 0x85, 0x93, 0xE1, 0x7E, 0x16, 0x80, 0x23, 0x2B, 0x5C,
+    0x83, 0x63, 0xB0, 0xDD, 0x82, 0xDB, 0x21, 0x17, 0x22, 0x51, 0x35, 0xE3, 0x22, 0x36, 0x2B, 0xDA,
+    0x5E, 0xE5, 0x48, 0xEA, 0xC5, 0x23, 0x05, 0x8E, 0xD1, 0xFF, 0xE6, 0x81, 0xC5, 0x0B, 0xE1, 0x06,
+    0x0E, 0xD0, 0x2C, 0xA6, 0x43, 0xF3, 0x89, 0x5A, 0x67, 0xBD, 0x33, 0xE6, 0xC8, 0x5E, 0xAC, 0x83,
+    0xB5, 0xDC, 0x0E, 0x98, 0xAB, 0x32, 0x5A, 0x25, 0xFD, 0xE4, 0x77, 0x48, 0x11, 0xE6, 0x81, 0x22,
+    0x26, 0x2C, 0x95, 0x3E, 0xDB, 0x5E, 0x74, 0x6C, 0x5E, 0x3B, 0x58, 0x09, 0x89, 0x3F, 0x4A, 0xB8,
+    0xAF, 0x53, 0xE2, 0x45, 0x3B, 0x63, 0xB5, 0xEE, 0x15, 0xDF, 0x0B, 0x3E, 0x29, 0xF1, 0xAF, 0x54,
+    0x69, 0xB2, 0x89, 0xF3, 0x42, 0x92, 0x14, 0xF0, 0xC0, 0xC5, 0x25, 0x7F, 0xDF, 0x42, 0xDE, 0xC1,
+    0x29, 0x60, 0x1A, 0x62, 0xFB, 0x0C, 0xF8, 0xC6, 0x57, 0x8B, 0x1E, 0x82, 0x06, 0x35, 0xA9, 0x06,
+    0x41, 0xAC, 0x76, 0x7E, 0x8C, 0x84, 0xE2, 0xF9, 0x18, 0x69, 0xC4, 0xD2, 0xB7, 0xB1, 0xBE, 0xDB,
+    0x83, 0x92, 0xA8, 0x7F, 0x32, 0xC7, 0xF4, 0x08, 0xE0, 0x26, 0xBE, 0x2D, 0x6B, 0x76, 0x9D, 0x68,
+    0xE3, 0x4B, 0xC9, 0x1A, 0x0A, 0xE4, 0x77, 0x19, 0xB8, 0xB2, 0xBE, 0x46, 0x2A, 0x3C, 0x76, 0xB7,
+    0x54, 0x6F, 0x41, 0x59, 0x21, 0x7A, 0xA6, 0x44, 0xCE, 0x74, 0xA9, 0xD4, 0x13, 0x47, 0xD1, 0x55,
+    0xA0, 0xF0, 0x85, 0x20, 0x80, 0xDF, 0x4E, 0x7D, 0xF4, 0xB2, 0xBE, 0x75, 0x9A, 0xA2, 0x10, 0xC2,
+    0xFD, 0xB1, 0xB9, 0x8E, 0x14, 0x80, 0xB6, 0x5B, 0x8A, 0x6A, 0x81, 0x37, 0x8C, 0x03, 0x51, 0x85,
+    0x25, 0xD7, 0x85, 0x6A, 0xC8, 0x0A, 0x1F, 0x24, 0xB6, 0x2C, 0xB0, 0x1A, 0x20, 0x23, 0xCB, 0xB5,
+    0xF8, 0x19, 0x88, 0x63, 0x67, 0xB7, 0xCD, 0x5B, 0x4F, 0x3C, 0xAA, 0xE6, 0x90, 0xCC, 0x6A, 0xDD,
+    0xE0, 0x51, 0x29, 0x22, 0xFF, 0x17, 0x53, 0x62, 0x40, 0xF4, 0xB6, 0x5F, 0x55, 0x65, 0x67, 0x79,
+    0x5B, 0x98, 0xA3, 0x58, 0x35, 0xB2, 0x21, 0xDB, 0x0C, 0x6C, 0x20, 0x07, 0x3A, 0x58, 0xE5, 0x96,
+    0x7F, 0xB9, 0x1F, 0x31, 0x7A, 0x8A, 0x64, 0xA8, 0x06, 0xAA, 0x56, 0x55, 0x2D, 0x0B, 0x8B, 0x71,
+    0x78, 0x8B, 0x9F, 0xC1, 0x12, 0x54, 0x00, 0x5E, 0x2E, 0x76, 0x98, 0x99, 0x77, 0xE3, 0x4D, 0x08,
+    0x47, 0xC2, 0xF1, 0xFB, 0xF9, 0xE1, 0x8D, 0x40, 0x71, 0x67, 0xF9, 0x15, 0x34, 0xED, 0x10, 0x63,
+    0x63, 0xA2, 0x2A, 0x59, 0x0B, 0x3E, 0xA2, 0xB6, 0xC2, 0x03, 0x19, 0x8B, 0x7C, 0x76, 0x17, 0xEF,
+    0x6B, 0xE3, 0x1F, 0xBF, 0x32, 0xDC, 0xF4, 0x2E, 0x69, 0x15, 0x54, 0x40, 0x78, 0x97, 0x13, 0x2D,
+    0xB5, 0x7D, 0x18, 0x91, 0x40, 0x84, 0x8F, 0x92, 0x44, 0x32, 0x42, 0x9F, 0xD1, 0x2D, 0xEA, 0x82,
+    0x48, 0x39, 0x49, 0x19, 0x07, 0xC6, 0x32, 0x9F, 0xD5, 0x87, 0x80, 0x92, 0x78, 0xDA, 0x9A, 0x93,
+    0x90, 0x71, 0xDD, 0xC4, 0x6D, 0xC3, 0x74, 0xA6, 0xC9, 0x88, 0x98, 0xFF, 0x8A, 0x81, 0x50, 0xAC,
+    0x73, 0x49, 0x0A, 0x75, 0x27, 0x02, 0xAF, 0x81, 0xB8, 0xAD, 0x83, 0xA9, 0x08, 0x29, 0xF0, 0x78,
+    0x4A, 0x32, 0xDB, 0x10, 0xA4, 0x5E, 0xFA, 0x3B, 0x49, 0xBD, 0xA5, 0xE1, 0xE6, 0x0B, 0xDB, 0x6F,
+    0x31, 0x18, 0xDC, 0xA7, 0x63, 0xD0, 0xBA, 0xC7, 0xA3, 0x0A, 0x88, 0x76, 0xA8, 0x6C, 0x4B, 0xBE,
+    0x3A, 0xD6, 0x81, 0x20, 0xEF, 0xD4, 0x36, 0x4C, 0x2E, 0xBD, 0x22, 0x56, 0x5E, 0xE9, 0xBB, 0x25,
+    0x75, 0x54, 0x33, 0xF6, 0x1B, 0x7F, 0xD8, 0x95, 0x49, 0x9B, 0xB1, 0x30, 0x3E, 0x6F, 0x17, 0x91,
+    0x42, 0x82, 0x42, 0x81, 0x16, 0x56, 0xCF, 0x2D, 0xC2, 0x34, 0x6C, 0x38, 0xA0, 0x42, 0x14, 0x7A,
+    0x13, 0x9D, 0x38, 0xC1, 0x6D, 0x3A, 0x3D, 0x0E, 0x24, 0x2C, 0x23, 0xE3, 0xBC, 0x36, 0x2A, 0x97,
+    0x05, 0x9E, 0x31, 0x9A, 0xF2, 0x88, 0x84, 0xA2, 0x28, 0xB8, 0xB3, 0x40, 0x3E, 0xE8, 0x5F, 0x44,
+    0x32, 0x7E, 0xD7, 0x64, 0xFE, 0x37, 0x51, 0x32, 0xD1, 0x59, 0x4E, 0xB8, 0x98, 0xC4, 0x87, 0x50,
+    0xB0, 0x0C, 0xAD, 0xE8, 0x98, 0x20, 0xA2, 0xAA, 0xFC, 0x94, 0xCF, 0x87, 0xFB, 0x60, 0xDB, 0xBF,
+    0x93, 0x7E, 0xBD, 0x5F, 0x13, 0x6C, 0xC9, 0x06, 0x34, 0xD5, 0x8A, 0xED, 0x5D, 0xAC, 0x77, 0xC9,
+    0x84, 0xD5, 0x05, 0x61, 0x71, 0x4E, 0x69, 0xE1, 0xC6, 0xFD, 0x12, 0x3F, 0x37, 0x3F, 0xEE, 0x1D,
+    0x93, 0x6E, 0xF3, 0x32, 0x18, 0x26, 0x87, 0x2A, 0x7C, 0x0F, 0x75, 0x1A, 0x06, 0x61, 0x76, 0x22,
+    0x18, 0x39, 0x24, 0x49, 0xA7, 0xF7, 0x81, 0x51, 0x1E, 0x8F, 0x86, 0x76, 0xE3, 0xF2, 0xF0, 0xCF,
+    0x8B, 0xB1, 0x5E, 0xFA, 0xA7, 0xF3, 0x0F, 0x63, 0x6B, 0x4D, 0x0B, 0x71, 0x3A, 0xAB, 0x60, 0x76,
+    0x01, 0xA5, 0x28, 0x4D, 0xB4, 0xBF, 0xDB, 0x8E, 0x2B, 0xE1, 0xD6, 0xE6, 0xC8, 0x8F, 0xE6, 0x79,
+    0xD6, 0x19, 0xD9, 0x3A, 0x6F, 0x0C, 0xDC, 0xC0, 0x31, 0x61, 0x70, 0x21, 0xE4, 0xFA, 0x43, 0x43,
+    0x03, 0xFC, 0x88, 0xA8, 0x77, 0xCA, 0xE6, 0x79, 0x59, 0x84, 0x5D, 0x2B, 0x0A, 0xB7, 0x13, 0x1B,
+    0x2C, 0xEC, 0xDD, 0x8A, 0x26, 0xE9, 0xB3, 0x69, 0x4F, 0x72, 0xCB, 0x82, 0x2E, 0x54, 0x00, 0xD1,
+    0x19, 0xA5, 0x0F, 0xB2, 0x5F, 0xCA, 0x3C, 0xB6, 0x5F, 0x8B, 0xC8, 0xD4, 0x21, 0xCF, 0x26, 0x83,
+    0x5A, 0xD2, 0xCA, 0xFF, 0x26, 0x46, 0x5E, 0xE8, 0x2C, 0x0F, 0xA7, 0xBA, 0x8E, 0xCD, 0xBB, 0xB0,
+    0x70, 0x78, 0xA2, 0xF4, 0x8F, 0x9D, 0x0F, 0x23, 0x29, 0xF4, 0xBC, 0xFC, 0x54, 0x22, 0x00, 0x7B,
+    0x88, 0x0F, 0x87, 0x08, 0xF2, 0x37, 0x3E, 0x07, 0x4E, 0xEF, 0xF3, 0x4F, 0x96, 0x7B, 0xB3, 0xA4,
+    0x1D, 0x45, 0x3D, 0x88, 0x5D, 0xC2, 0xA8, 0xFA, 0x71, 0xBE, 0xA6, 0x1F, 0x7E, 0x77, 0xD5, 0x48,
+    0x23, 0x73, 0x1C, 0x62, 0xF5, 0x98, 0x8E, 0xB7, 0x67, 0xB1, 0xC8, 0xFA, 0xD7, 0xCB, 0x08, 0x0A,
+    0x64, 0x57, 0x93, 0x7E, 0x8E, 0xF2, 0x20, 0xAA, 0xB5, 0x06, 0x8D, 0x12, 0xE2, 0xB8, 0x4D, 0xFC,
+    0xC8, 0x23, 0xAB, 0x61, 0x05, 0xE4, 0x46, 0x87, 0x15, 0x25, 0x23, 0x43, 0x15, 0x32, 0x63, 0x9E,
+    0x79, 0xFA, 0xBE, 0x10, 0x2B, 0xA3, 0x49, 0xA0, 0x80, 0xB0, 0x3F, 0x50, 0x68, 0xF5, 0xC0, 0x7C,
+    0x55, 0xA2, 0x58, 0x92, 0xD4, 0xF3, 0xA0, 0xEE, 0x83, 0x33, 0x71, 0xE6, 0xAB, 0x77, 0x44, 0x25,
+    0x5D, 0xBF, 0x57, 0x91, 0x25, 0x14, 0x0C, 0x5D, 0x07, 0xA0, 0x8F, 0x82, 0x9C, 0xA8, 0x33, 0x05,
+    0x25, 0x5F, 0x6B, 0x20, 0xB1, 0x92, 0xDC, 0x4E, 0xDA, 0x6D, 0xC4, 0x85, 0xE7, 0xDE, 0x00, 0xAD,
+    0x0E, 0x45, 0x9A, 0x3E, 0xBF, 0x1E, 0x7B, 0xF1, 0x94, 0x11, 0x77, 0xCE, 0xE2, 0xF0, 0x7B, 0x9A,
+    0x85, 0x46, 0x98, 0x27, 0x44, 0xCC, 0xC7, 0x3F, 0x2D, 0x6F, 0xE2, 0xD3, 0xDF, 0x6E, 0x6D, 0x74,
+    0xFD, 0xC0, 0xEF, 0x8C, 0xA3, 0x71, 0xEA, 0xA4, 0x56, 0x59, 0x57, 0x23, 0x78, 0x87, 0x16, 0x8C,
+    0x1E, 0x63, 0x9C, 0xE2, 0xA7, 0x28, 0x2A, 0x64, 0xC0, 0x97, 0x34, 0xB0, 0xD5, 0x78, 0x4C, 0xC3,
+    0xB2, 0x5D, 0x9B, 0x89, 0x3F, 0xD3, 0x7E, 0xD2, 0x8A, 0x78, 0x8C, 0x1A, 0x82, 0xB2, 0xA5, 0xFD,
+    0x37, 0xE6, 0x64, 0x32, 0xF0, 0xC9, 0xDE, 0xAF, 0xA6, 0xBD, 0xB9, 0xDD, 0xE1, 0xF6, 0x2D, 0xC1,
+    0x17, 0x15, 0xF1, 0x73, 0xA4, 0x4C, 0x65, 0x11, 0x92, 0xDC, 0x61, 0xFD, 0x0C, 0x60, 0x49, 0x43,
+    0x54, 0xAC, 0xC9, 0xD7, 0xD5, 0x85, 0x09, 0xD4, 0x57, 0x74, 0x18, 0xD6, 0x53, 0xEB, 0x26, 0xAE,
+    0x13, 0xCE, 0x0C, 0x6F, 0x7C, 0x11, 0x90, 0x02, 0xB9, 0x46, 0xB8, 0xEC, 0x25, 0x31, 0xE2, 0xBA,
+    0xD4, 0xE4, 0x19, 0x1F, 0xF8, 0xB9, 0x6D, 0xA6, 0x7A, 0xE8, 0x03, 0x9A, 0x94, 0x9F, 0x26, 0x3B,
+    0xE0, 0x1A, 0x32, 0xAD, 0x73, 0x3C, 0xB7, 0xE4, 0x32, 0x6F, 0x51, 0x3B, 0x3D, 0x83, 0x86, 0xD7,
+    0x62, 0x6D, 0xF8, 0xDF, 0x5C, 0xB2, 0x59, 0x92, 0xAE, 0x52, 0xA7, 0xFE, 0xA9, 0x9B, 0x0F, 0xD8,
+    0x5C, 0xCA, 0x50, 0xC3, 0xD7, 0x7C, 0x8E, 0x80, 0x1E, 0xCE, 0xC9, 0x8E, 0x6B, 0x7A, 0x4F, 0x1B,
+    0x3A, 0x1E, 0x91, 0x18, 0x4C, 0x01, 0x50, 0x47, 0x54, 0x65, 0xF2, 0x72, 0xA1, 0x83, 0xE2, 0x86,
+    0x9B, 0x93, 0x07, 0x75, 0xE4, 0x33, 0x47, 0xB5, 0xBD, 0x42, 0xB2, 0x30, 0x6B, 0x69, 0x1F, 0xE9,
+    0xB3, 0x58, 0x91, 0x95, 0x7B, 0xED, 0xC3, 0xF2, 0x46, 0x28, 0xB5, 0x18, 0x21, 0x27, 0x57, 0xF2,
+    0x39, 0xE6, 0x8A, 0x28, 0xA7, 0x7D, 0xFB, 0x01, 0xF2, 0x7B, 0x56, 0x5A, 0xC4, 0x85, 0x5A, 0x41,
+    0x96, 0xF7, 0xF7, 0xC5, 0x91, 0xA4, 0x89, 0x9A, 0x09, 0x91, 0xBB, 0xE9, 0x29, 0x92, 0x7F, 0xE6,
+    0x5B, 0x94, 0x8E, 0x93, 0x43, 0x90, 0x53, 0x0F, 0x10, 0xD7, 0x7E, 0x04, 0x28, 0xB7, 0xF7, 0x14,
+    0xB3, 0x42, 0x5E, 0xDF, 0xB5, 0xAA, 0xE4, 0xF7, 0xED, 0x98, 0x43, 0xC6, 0x8C, 0xFA, 0x7C, 0xB0,
+    0x71, 0xB1, 0xE9, 0x64, 0x65, 0xBB, 0x58, 0xCC, 0x73, 0x5F, 0x6A, 0x5A, 0x86, 0x2D, 0x2E, 0x89,
+    0xB4, 0x5A, 0xFE, 0x16, 0x5B, 0x64, 0x56, 0x27, 0x38, 0xC2, 0x1D, 0x1C, 0xF0, 0xC5, 0x0B, 0x80,
+    0x8D, 0x6F, 0x2E, 0x0C, 0x7B, 0x56, 0xEF, 0x23, 0xE5, 0xFC, 0xD2, 0x55, 0xF6, 0x9C, 0xF7, 0x5F,
+    0xB5, 0xEC, 0xB7, 0xEE, 0xC4, 0xEC, 0xFE, 0xD6, 0xAA, 0xEC, 0x24, 0xB8, 0xB7, 0x98, 0x8D, 0x0B,
+    0x12, 0x36, 0xAC, 0x5B, 0x3E, 0x87, 0x29, 0x21, 0x9C, 0xFD, 0x84, 0xFD, 0xF5, 0x10, 0xA4, 0xE8,
+    0x1C, 0x4F, 0x16, 0x45, 0xBF, 0xC9, 0x18, 0x9F, 0xDE, 0xF1, 0x96, 0x64, 0x58, 0x61, 0xF1, 0x41,
+    0x82, 0xE2, 0xDA, 0xA3, 0xE4, 0x86, 0x0F, 0xB7, 0xCA, 0x17, 0x17, 0x2A, 0x7D, 0xAC, 0x9F, 0xB3,
+    0x8E, 0x65, 0x63, 0x80, 0x64, 0x8E, 0x6F, 0xDB, 0xD4, 0x05, 0x65, 0xEE, 0x13, 0x1C, 0xE6, 0x51,
+    0x53, 0x01, 0xA1, 0xE2, 0xA1, 0x3E, 0x46, 0x82, 0xBB, 0x4A, 0x7E, 0xC1, 0x4A, 0x12, 0xBB, 0x56,
+    0xA2, 0x2F, 0x81, 0xC0, 0x0F, 0x47, 0x7F, 0xA1, 0xD9, 0x8F, 0x21, 0xC5, 0x48, 0x34, 0xF0, 0x7F,
+    0x07, 0xE8, 0xB4, 0x0C, 0x37, 0xEA, 0x4A, 0x76, 0x5E, 0x98, 0xA0, 0x87, 0x08, 0xC1, 0x51, 0x3D,
+    0xED, 0xC6, 0xA2, 0x75, 0x90, 0xB4, 0x23, 0xFC, 0x3E, 0x36, 0x4A, 0x9A, 0xEA, 0x25, 0x1F, 0x62,
+    0x41, 0x69, 0xCC, 0x8C, 0xB0, 0xB7, 0xAA, 0x6B, 0x67, 0xC9, 0x85, 0x7F, 0x92, 0xC0, 0x7A, 0x30,
+    0x18, 0x35, 0xCD, 0xFD, 0x85, 0xC4, 0x70, 0x23, 0x75, 0x45, 0x67, 0x79, 0xAB, 0xFE, 0x83, 0x4B,
+    0xC9, 0x09, 0x78, 0xF1, 0x7F, 0xFA, 0xCC, 0xF2, 0x0A, 0x03, 0x0E, 0x43, 0x9A, 0xD1, 0xBF, 0x53,
+    0xA8, 0x1E, 0x0F, 0x75, 0xC9, 0x14, 0x54, 0x07, 0x6D, 0xCD, 0xC7, 0xB3, 0x5D, 0x14, 0x87, 0x29,
+    0x0C, 0x43, 0xED, 0x91, 0xE3, 0x0A, 0xD0, 0x6F, 0xAE, 0x3B, 0xB5, 0xA8, 0x29, 0x3C, 0xA5, 0x5E,
+    0x0A, 0x51, 0xB4, 0x7F, 0x3D, 0x15, 0xCC, 0x1A, 0x35, 0xFB, 0xA4, 0x70, 0xDC, 0x4B, 0x98, 0xD4,
+    0xBF, 0x28, 0xE6, 0x29, 0x42, 0x60, 0x71, 0xA7, 0xAE, 0x02, 0xC0, 0xE4, 0xEE, 0x61, 0x48, 0x07,
+    0x84, 0x87, 0xAD, 0x5E, 0x70, 0xA8, 0x03, 0x30, 0x81, 0xE3, 0xE3, 0x53, 0x28, 0xFC, 0x06, 0xF8,
+    0x37, 0x19, 0x69, 0xA1, 0xD2, 0x7A, 0xDB, 0x91, 0xAD, 0xB2, 0x8E, 0x51, 0xE1, 0xC0, 0x0A, 0xEE,
+    0x70, 0x3B, 0xB7, 0x37, 0x96, 0x07, 0xBC, 0x66, 0x3B, 0x10, 0x6F, 0x18, 0xCC, 0xA8, 0x8F, 0xDD,
+    0x6C, 0x30, 0x18, 0xEF, 0x96, 0x09, 0xE5, 0x89, 0x47, 0x8E, 0xBA, 0x57, 0x8D, 0x8F, 0x63, 0x8A,
+    0xAB, 0x30, 0xA0, 0x45, 0x1C, 0x4C, 0x0D, 0xB0, 0x72, 0x09, 0x0A, 0xC8, 0x56, 0xD8, 0x45, 0x71,
+    0xD3, 0xB8, 0x03, 0xD3, 0xCD, 0x9E, 0x86, 0x53, 0xA5, 0xD5, 0x58, 0xA5, 0x03, 0xE3, 0xFC, 0x5E,
+    0x1C, 0x63, 0x65, 0xE9, 0x70, 0x53, 0xF4, 0x99, 0x71, 0x7A, 0x76, 0x2C, 0x2C, 0x38, 0xBE, 0x5A,
+    0x20, 0xFF, 0xC0, 0x25, 0x16, 0x46, 0xA8, 0x65, 0x9B, 0xE0, 0xB1, 0x10, 0x7D, 0xB2, 0x90, 0xBC,
+    0xE4, 0xB5, 0x22, 0xC7, 0xD6, 0x8A, 0xBB, 0x19, 0x9F, 0xCD, 0x11, 0x62, 0x82, 0xFC, 0x8D, 0x36,
+    0xE2, 0x08, 0xF0, 0xDD, 0x68, 0x60, 0x48, 0x09, 0x1F, 0xF0, 0xC5, 0x54, 0xE9, 0x47, 0x7D, 0x79,
+    0xE6, 0xC4, 0xC1, 0xF1, 0xFF, 0x2D, 0x5C, 0xA3, 0xFD, 0xF2, 0xB1, 0xA7, 0x89, 0xB7, 0xB9, 0x7C,
+    0x44, 0x28, 0xE5, 0x82, 0x36, 0x4D, 0x48, 0x34, 0x01, 0x5B, 0x43, 0x36, 0x2D, 0x05, 0x93, 0xEE,
+    0xF5, 0x92, 0x73, 0xDF, 0xA6, 0xBA, 0x3D, 0x5B, 0x96, 0x49, 0x73, 0xDF, 0x70, 0x9B, 0x7A, 0x70,
+    0x5C, 0x30, 0x14, 0xB8, 0xB7, 0x46, 0xE0, 0xD7, 0xFF, 0x5C, 0x8E, 0x27, 0x39, 0x0E, 0xEE, 0x99,
+    0x2F, 0x08, 0x1E, 0x95, 0xD4, 0x70, 0xB0, 0xC4, 0x28, 0x83, 0x78, 0x92, 0x93, 0x46, 0xB9, 0xF9,
+    0xFF, 0x8C, 0x16, 0xA9, 0x63, 0x71, 0xAF, 0xBD, 0x84, 0x1A, 0x25, 0xBE, 0xE8, 0xE3, 0xB2, 0x33,
+    0x51, 0xB9, 0xB6, 0x0E, 0x12, 0xB8, 0xA7, 0x6E, 0x28, 0xBC, 0xA3, 0x66, 0x24, 0x49, 0x4D, 0x45,
+    0xA4, 0x5C, 0xCD, 0x4D, 0x2E, 0x17, 0xFB, 0xC0, 0xB5, 0xA7, 0x55, 0x34, 0x08, 0xD7, 0xC7, 0x54,
+    0x0A, 0xFE, 0xE6, 0x98, 0x85, 0x6D, 0xAF, 0x42, 0x79, 0xED, 0x0A, 0xFA, 0xCF, 0xD3, 0xE2, 0x7C,
+    0xB8, 0x24, 0xA5, 0xE1, 0x01, 0xA5, 0x94, 0x55, 0x61, 0xA0, 0x49, 0x1B, 0x7C, 0x71, 0xA8, 0x96,
+    0x5A, 0x4C, 0xF5, 0xC5, 0x1E, 0x8D, 0xD9, 0x2E, 0xBE, 0xC4, 0x13, 0x27, 0xD0, 0xC0, 0x67, 0xA7,
+    0x77, 0x86, 0x61, 0xAE, 0x7E, 0x69, 0x53, 0xB4, 0x70, 0xC6, 0x1E, 0x62, 0x1A, 0x8B, 0xB3, 0x0A,
+    0xC5, 0xDF, 0xF4, 0xFA, 0xEB, 0xC5, 0x50, 0x7E, 0xDE, 0xD5, 0x15, 0xB1, 0x2E, 0x09, 0x75, 0xD7,
+    0x9E, 0xB1, 0x58, 0x76, 0x2F, 0xFE, 0x86, 0x0A, 0xC2, 0x10, 0x1D, 0x84, 0xDF, 0x94, 0x11, 0xD0,
+    0x86, 0x06, 0xFA, 0x9E, 0x00, 0xF0, 0x27, 0x51, 0x00, 0x43, 0xAF, 0xEA, 0x13, 0x4E, 0xC8, 0x48,
+    0x5A, 0x57, 0xDB, 0x5C, 0x20, 0xDC, 0xF3, 0x7D, 0x2B, 0x77, 0x35, 0x20, 0xBD, 0x17, 0x0C, 0x3A,
+    0x2C, 0x3B, 0x58, 0x7D, 0x9D, 0x40, 0xA0, 0xDF, 0xD5, 0xBA, 0x84, 0xA2, 0x9E, 0x4C, 0x87, 0xA5,
+    0xF9, 0xED, 0xEA, 0xEB, 0x98, 0x0D, 0x81, 0xD9, 0xCB, 0xE3, 0xD5, 0xA0, 0xF7, 0xFF, 0x2A, 0x28,
+    0xE9, 0x6F, 0x08, 0xE4, 0xBA, 0x76, 0x16, 0x0A, 0xF5, 0x3C, 0x01, 0x11, 0xB3, 0xBA, 0x4C, 0x7E,
+    0xC3, 0x1F, 0x0B, 0x91, 0x62, 0x82, 0xDD, 0x29, 0x7C, 0x60, 0x5F, 0x56, 0xE5, 0x48, 0x7D, 0xB8,
+    0x4A, 0xC7, 0x1F, 0x7D, 0xD5, 0xB7, 0x17, 0x9F, 0x91, 0xDD, 0xE3, 0xE0, 0x04, 0x14, 0xF3, 0x4C,
+    0xD2, 0xB3, 0xC3, 0xAC, 0x7F, 0x63, 0x67, 0xFA, 0x1B, 0x14, 0x0E, 0x2A, 0x8C, 0x82, 0xD8, 0x49,
+    0x8B, 0x24, 0x4B, 0xF3, 0x21, 0x86, 0x06, 0x91, 0xC9, 0x81, 0xF9, 0x84, 0xC6, 0x2B, 0x12, 0xCF,
+    0x95, 0x32, 0x7A, 0xFD, 0x9C, 0x1C, 0xFC, 0x3B, 0x3B, 0x06, 0xBA, 0x2C, 0x45, 0x88, 0xDA, 0x5B,
+    0x5D, 0x90, 0xDC, 0x07, 0xBD, 0xEC, 0xAF, 0xB2, 0x06, 0x98, 0x05, 0xAC, 0x1D, 0x41, 0xA1, 0xD5,
+    0x76, 0x9D, 0x7B, 0x59, 0x82, 0x9C, 0x46, 0x02, 0xF4, 0x03, 0xB4, 0xFB, 0x70, 0x48, 0x73, 0xB2,
+    0x4C, 0x8B, 0xA6, 0xDB, 0x11, 0xC5, 0x7E, 0xFE, 0x23, 0x4E, 0xC2, 0x2B, 0x0F, 0x95, 0x51, 0x2A,
+    0x3B, 0x46, 0x1C, 0xB7, 0xBF, 0x51, 0xF0, 0xA4, 0xF8, 0xAD, 0x16, 0x96, 0xAA, 0x6D, 0xBE, 0xFE,
+    0x45, 0x46, 0xEF, 0x8B, 0x96, 0xED, 0xE1, 0xE5, 0xB5, 0xEF, 0x22, 0x8C, 0xBA, 0x3A, 0xB0, 0x2F,
+    0x9A, 0x34, 0x16, 0x52, 0x56, 0x5A, 0x36, 0x8B, 0x50, 0x89, 0xBD, 0xC0, 0xFE, 0xAE, 0x2B, 0xBB,
+    0x53, 0xAE, 0x76, 0x8D, 0xB6, 0x91, 0x9D, 0x32, 0x18, 0xF5, 0xD7, 0x1A, 0xE5, 0x04, 0x05, 0xFD,
+    0xDC, 0x5B, 0x67, 0xBE, 0x34, 0x05, 0x03, 0x90, 0xD5, 0xBF, 0xAA, 0x35, 0x8D, 0xB7, 0x63, 0x76,
+    0xC9, 0x98, 0x2B, 0x99, 0xD6, 0x5A, 0xB4, 0x39, 0x4A, 0xAA, 0xDF, 0xEC, 0x82, 0x83, 0xC6, 0x80,
+    0xA1, 0x86, 0x74, 0xC8, 0x8E, 0x37, 0xAB, 0x7A, 0xC2, 0x35, 0x99, 0x62, 0xAD, 0x30, 0xD2, 0x4E,
+    0x30, 0xA4, 0x3F, 0xC6, 0x16, 0x9C, 0xBF, 0xD5, 0x5C, 0x08, 0xF8, 0xF4, 0x35, 0x20, 0x86, 0xF4,
+    0x0C, 0x12, 0x56, 0xD4, 0xDB, 0x73, 0xDB, 0x82, 0x30, 0x73, 0xD2, 0x60, 0xCF, 0xF7, 0xA8, 0xF6,
+    0xC8, 0x71, 0xB2, 0x6E, 0xC3, 0x65, 0x05, 0x07, 0x6C, 0x9C, 0x3F, 0xD7, 0xC9, 0x6E, 0x09, 0xFF,
+    0x9E, 0xF0, 0x68, 0xB6, 0xE0, 0xDB, 0x6A, 0x1F, 0xE9, 0xBC, 0x8C, 0xC1, 0xEB, 0xC5, 0x2A, 0x8B,
+    0x99, 0x23, 0xFC, 0x35, 0xAF, 0xC1, 0x4A, 0xD8, 0x62, 0x28, 0x95, 0x4C, 0xD5, 0x93, 0x21, 0xBC,
+    0x19, 0x52, 0xA0, 0x71, 0x3C, 0x2B, 0x3F, 0x88, 0x68, 0xA0, 0xE0, 0x16, 0x10, 0x85, 0xCA, 0xDB,
+    0x45, 0x96, 0xBD, 0x44, 0xB3, 0x24, 0xE2, 0xCB, 0xE6, 0xE7, 0xC9, 0xDD, 0x7A, 0x78, 0x9B, 0x7C,
+    0x1E, 0x28, 0x2B, 0xC2, 0x2B, 0x53, 0x12, 0xB2, 0xD7, 0xB8, 0x59, 0x41, 0x19, 0x3D, 0xF9, 0x6F,
+    0x34, 0xDB, 0x76, 0x43, 0x8C, 0x21, 0x2A, 0xC2, 0xAB, 0x4B, 0x0D, 0xC5, 0x0A, 0x92, 0x41, 0xD2,
+    0xD2, 0xEB, 0x40, 0x7C, 0x14, 0x5D, 0x73, 0x3D, 0x6C, 0x42, 0xAC, 0xF1, 0xC8, 0x37, 0xCD, 0xC3,
+    0xC0, 0xDD, 0xC0, 0x42, 0x35, 0x6A, 0x99, 0xF3, 0x7F, 0x63, 0xE1, 0x17, 0xB5, 0x8F, 0xC3, 0x2C,
+    0xF5, 0x67, 0x4A, 0x96, 0x25, 0xDD, 0xC9, 0x06, 0x3A, 0x86, 0x3C, 0x2B, 0x23, 0x04, 0xB0, 0x53,
+    0x3C, 0x82, 0xDD, 0x7E, 0xAE, 0x1A, 0xF4, 0x76, 0x65, 0x57, 0xF1, 0x7F, 0xBC, 0x5C, 0xFC, 0xB0,
+    0xBB, 0x04, 0x13, 0x9B, 0x81, 0x9C, 0x70, 0x87, 0xFE, 0x6C, 0xC2, 0x9B, 0x88, 0x83, 0x3C, 0x4D,
+    0x43, 0x0B, 0x64, 0xE3, 0x8C, 0x79, 0x25, 0x5D, 0xF7, 0x20, 0xCF, 0xAB, 0x65, 0xC3, 0x9F, 0x17,
+    0xDA, 0x5A, 0x6F, 0x02, 0x81, 0xEC, 0x8A, 0x20, 0x56, 0x09, 0x31, 0xE2, 0x0E, 0x80, 0x68, 0xE5,
+    0xA7, 0xFF, 0x70, 0x92, 0x68, 0x09, 0x70, 0x93, 0x98, 0xD1, 0x73, 0xD4, 0x47, 0xA2, 0xD3, 0x91,
+    0x00, 0xAB, 0xF0, 0x35, 0xD1, 0xBE, 0xB8, 0xC9, 0x9E, 0x82, 0x39, 0x17, 0x2E, 0xB7, 0x8B, 0x0C,
+    0x7B, 0xAF, 0x84, 0x5C, 0xB5, 0x0A, 0xCE, 0x31, 0x30, 0xE7, 0x38, 0x06, 0xAA, 0x10, 0x48, 0x2C,
+    0xA8, 0xE1, 0xBD, 0xBD, 0xEE, 0x3D, 0xDA, 0x11, 0xA0, 0x0C, 0x07, 0xFA, 0xD0, 0x5B, 0xA5, 0x91,
+    0xE5, 0x1D, 0x54, 0x6A, 0xBF, 0x53, 0x56, 0x55, 0x11, 0xC9, 0x5C, 0x89, 0xFE, 0x72, 0x5A, 0xA7,
+    0x15, 0x9C, 0xBB, 0x37, 0x4E, 0x18, 0x89, 0xED, 0xF2, 0x82, 0x83, 0xF1, 0x5B, 0x9D, 0x27, 0x3D,
+    0xCF, 0xF3, 0x0B, 0x0C, 0xCB, 0x53, 0xF3, 0x13, 0xA8, 0xA1, 0x5A, 0x0E, 0xB2, 0x21, 0x8B, 0x16,
+    0xD7, 0x5E, 0xAE, 0xD2, 0x7B, 0x3A, 0x2A, 0xCD, 0x23, 0x14, 0x0F, 0xE7, 0x0D, 0x81, 0x82, 0xF2,
+    0x41, 0x8B, 0x77, 0x53, 0x16, 0xAE, 0xC7, 0xDF, 0xF7, 0xD1, 0x91, 0x8B, 0x73, 0xA5, 0x0E, 0x9F,
+    0xC3, 0xBF, 0x2C, 0xC3, 0xE4, 0xB7, 0x60, 0x60, 0xF7, 0xCA, 0x95, 0x6D, 0xFA, 0x4F, 0x66, 0xC2,
+    0x98, 0xA0, 0x72, 0xC9, 0x0C, 0x9E, 0x6B, 0xFD, 0x5D, 0x14, 0x8B, 0x9E, 0x7F, 0xA1, 0x20, 0x48,
+    0x99, 0x09, 0xDC, 0xAA, 0xAB, 0xB4, 0x46, 0x10, 0xAB, 0x1B, 0x77, 0x98, 0x2F, 0x7D, 0xE0, 0xD4,
+    0x18, 0x64, 0x4A, 0x5C, 0xBA, 0x23, 0x3C, 0x7E, 0x2F, 0x96, 0x13, 0xC6, 0x4D, 0x38, 0xED, 0xCE,
+    0x4D, 0xB3, 0x02, 0x23, 0xAE, 0x9E, 0xD8, 0x8A, 0xC0, 0x17, 0x39, 0x91, 0x75, 0x33, 0x6A, 0xA9,
+    0x75, 0x12, 0xE3, 0x65, 0x19, 0x30, 0x98, 0x00, 0x4D, 0x82, 0xDB, 0xA3, 0xA2, 0xE7, 0x11, 0x51,
+    0x7A, 0xA1, 0xFE, 0xD2, 0x4E, 0xEA, 0xBB, 0xCD, 0xA1, 0x29, 0xB0, 0xB3, 0x63, 0x23, 0x54, 0x11,
+    0x0B, 0xF3, 0xBD, 0x82, 0xA4, 0x60, 0xC2, 0xFE, 0xE9, 0x5C, 0xD7, 0xB5, 0xDA, 0x7D, 0x6C, 0x3D,
+    0x57, 0xD1, 0xF9, 0x90, 0x03, 0x0B, 0xE8, 0xC1, 0x20, 0xEE, 0x46, 0x68, 0x18, 0x95, 0x66, 0x3C,
+    0x01, 0x2A, 0xE8, 0x84, 0xC1, 0x26, 0x3B, 0x15, 0xBB, 0x20, 0x5E, 0x3B, 0x57, 0x0E, 0x59, 0xEA,
+    0x1C, 0xD3, 0x6C, 0xC7, 0x35, 0xE7, 0x23, 0xFE, 0x40, 0x37, 0x84, 0x2D, 0x70, 0x0F, 0xE9, 0x2F,
+    0xB2, 0x22, 0xEA, 0xB9, 0xB6, 0x93, 0xDC, 0x67, 0xE1, 0xFB, 0x0E, 0x34, 0x91, 0x35, 0x76, 0x52,
+    0x03, 0x27, 0x79, 0x42, 0x55, 0x1D, 0x5B, 0x8D, 0xAA, 0x17, 0x5C, 0x64, 0x3D, 0x8D, 0xA1, 0x04,
+    0xBE, 0x3E, 0x6D, 0x92, 0x6E, 0xE6, 0x2C, 0x0B, 0x6E, 0x9B, 0x8A, 0x5D, 0x18, 0x05, 0xB8, 0xE4,
+    0x18, 0x6E, 0x9E, 0x90, 0x74, 0xD3, 0x1D, 0x33, 0x4D, 0x72, 0xF5, 0x99, 0xE3, 0x2B, 0x2A, 0x0C,
+    0x11, 0x5C, 0x94, 0xB7, 0x66, 0xCC, 0xAC, 0xF1, 0x0D, 0x8D, 0x20, 0xC5, 0x75, 0x20, 0x4C, 0x0A,
+    0xB8, 0xBA, 0xCD, 0x0F, 0xD9, 0xF1, 0x59, 0x6E, 0xC8, 0x63, 0x5C, 0x9E, 0xE5, 0xBB, 0x85, 0x93,
+    0xFE, 0x1F, 0xD9, 0x8C, 0x89, 0xB4, 0x7E, 0xD8, 0xB5, 0xC6, 0x62, 0x03, 0xD1, 0xAB, 0x5F, 0xD2,
+    0xB4, 0x47, 0xC0, 0xC5, 0xC9, 0x75, 0x14, 0x91, 0x37, 0xFE, 0x3B, 0x78, 0x1F, 0x56, 0x87, 0x13,
+    0xF4, 0xCC, 0x3A, 0xBD, 0x2C, 0xC1, 0x61, 0xF5, 0xAB, 0x3A, 0xE8, 0x9C, 0x97, 0xCA, 0xAA, 0xA3,
+    0x12, 0xC4, 0x70, 0x8F, 0x32, 0xDD, 0xEA, 0xE8, 0xF8, 0x8A, 0x03, 0x65, 0x89, 0x99, 0x53, 0x45,
+    0x28, 0xF3, 0xA8, 0xF3, 0x14, 0x80, 0xB4, 0xD6, 0x44, 0xD4, 0x02, 0xEE, 0x9C, 0x58, 0x46, 0xC1,
+    0x4F, 0xEE, 0xFA, 0xCD, 0x63, 0x4D, 0x87, 0xE6, 0x22, 0x9F, 0xF9, 0xDA, 0x77, 0xD0, 0x51, 0xAA,
+    0x1F, 0x2A, 0x2F, 0x48, 0x66, 0x55, 0xE0, 0x2A, 0x5F, 0xEC, 0x12, 0xA6, 0x14, 0xAD, 0x7D, 0xDD,
+    0xC2, 0x7B, 0x3E, 0xE9, 0x8F, 0x2C, 0xB8, 0x60, 0x7E, 0x03, 0x76, 0x28, 0x7C, 0x22, 0x18, 0x6B,
+    0x53, 0x39, 0x21, 0x6A, 0xB2, 0x05, 0x75, 0x58, 0xB7, 0xB1, 0x49, 0x1B, 0x11, 0x1D, 0xD6, 0xFA,
+    0xC8, 0x01, 0x77, 0x12, 0x16, 0x17, 0xB8, 0x71, 0xC2, 0x6F, 0x12, 0xE0, 0xFA, 0xBF, 0x7A, 0xB3,
+    0xE3, 0xDB, 0xB6, 0x19, 0x78, 0xAF, 0x25, 0x18, 0x4F, 0x7A, 0x21, 0x63, 0xF6, 0x68, 0x33, 0xCC,
+    0xD9, 0x12, 0x4A, 0x36, 0x73, 0x3D, 0x7C, 0xA4, 0x6E, 0x5E, 0xFD, 0x5E, 0x0D, 0x45, 0xDF, 0x68,
+    0x66, 0xC6, 0x3F, 0x42, 0xEF, 0xD5, 0x0A, 0x7D, 0x41, 0x3E, 0x1B, 0x4E, 0x3F, 0x93, 0x4F, 0xAA,
+    0x0B, 0xB4, 0x34, 0x67, 0xEC, 0xEF, 0x23, 0x6B, 0x87, 0x8A, 0xF9, 0x66, 0x48, 0x19, 0xF5, 0x92,
+    0x57, 0xA8, 0x60, 0x53, 0xC3, 0x37, 0xF3, 0x61, 0x82, 0x42, 0xC3, 0x09, 0x95, 0xBE, 0xE9, 0x1F,
+    0xBA, 0x1F, 0x01, 0xB6, 0x37, 0xC7, 0xD9, 0x65, 0xAF, 0x2D, 0xB4, 0x42, 0x22, 0xC0, 0x54, 0x1A,
+    0x3B, 0x13, 0x07, 0x30, 0x94, 0x15, 0x01, 0x17, 0x21, 0x36, 0x3A, 0x4F, 0xC3, 0x76, 0xC4, 0xA9,
+    0x64, 0x0D, 0xE0, 0x4F, 0x93, 0xCD, 0x5D, 0x7D, 0xD4, 0xB6, 0xDE, 0xAC, 0x9C, 0xB6, 0x79, 0x3B,
+    0xCE, 0x49, 0x35, 0x21, 0xE2, 0x20, 0xC2, 0x36, 0x9E, 0xCF, 0x51, 0x4D, 0x1D, 0x41, 0x32, 0x05,
+    0xB0, 0x45, 0x85, 0xEF, 0x68, 0x94, 0xE2, 0x56, 0x61, 0x7A, 0x08, 0xE7, 0x46, 0x3E, 0xBA, 0xEC,
+    0x9E, 0x82, 0x17, 0x1B, 0xE4, 0xE1, 0x32, 0xCD, 0x9C, 0xF8, 0xC1, 0xE5, 0x1C, 0x9E, 0x84, 0xBB,
+    0x20, 0x71, 0xF5, 0x6F, 0x0B, 0x55, 0x6F, 0x4C, 0x96, 0x28, 0x08, 0x6E, 0x5D, 0xF2, 0xFE, 0xF9,
+    0xE2, 0xBB, 0xEF, 0x58, 0xFC, 0x34, 0xEF, 0xD6, 0xF5, 0xB2, 0x77, 0x5F, 0x62, 0x4F, 0x8F, 0x32,
+    0xD7, 0xAD, 0x14, 0x07, 0xFC, 0xAB, 0x53, 0x06, 0xC9, 0x65, 0x8A, 0x0F, 0xDA, 0xDF, 0x4F, 0xA4,
+    0x88, 0x45, 0xFC, 0x17, 0x74, 0x1C, 0xE0, 0x9F, 0xBC, 0x91, 0xF3, 0x7A, 0x9D, 0xE8, 0x92, 0xD6,
+    0x3C, 0x8E, 0x71, 0x65, 0x34, 0x64, 0x4B, 0xAE, 0x41, 0x04, 0x37, 0x3E, 0xE3, 0x79, 0xA1, 0xD4,
+    0x4F, 0x89, 0xE8, 0x3C, 0x1C, 0x36, 0x41, 0x66, 0x14, 0xA4, 0xCF, 0xC5, 0x38, 0x59, 0xE6, 0x8C,
+    0x75, 0xE7, 0x6F, 0x3B, 0x20, 0x11, 0x41, 0x55, 0x28, 0x67, 0x12, 0xD5, 0x67, 0x81, 0xC5, 0x76,
+    0x02, 0xC3, 0xC7, 0x03, 0x1C, 0xC0, 0x2E, 0xDC, 0x7E, 0xD9, 0xAD, 0x24, 0xE0, 0x7A, 0x07, 0x8D,
+    0xC7, 0xE5, 0x2B, 0x27, 0x13, 0xAC, 0x76, 0x46, 0x93, 0x4B, 0x3B, 0x1C, 0xC7, 0xD2, 0x9E, 0xEF,
+    0x32, 0xEA, 0x3A, 0x43, 0xDC, 0x79, 0xD6, 0xE8, 0x52, 0x89, 0xAB, 0xEE, 0x9F, 0x22, 0xAA, 0x02,
+    0xD7, 0x08, 0xE2, 0x50, 0x94, 0x16, 0x09, 0x49, 0x5C, 0x70, 0x61, 0x97, 0xEA, 0x99, 0x42, 0xAC,
+    0xFB, 0x97, 0xFA, 0x35, 0xA1, 0x80, 0xFD, 0x06, 0x44, 0xA3, 0x6F, 0xFC, 0x39, 0x7A, 0xA2, 0x37,
+    0x87, 0x3B, 0x72, 0xC2, 0x7A, 0x2A, 0xBA, 0x54, 0x6B, 0xF9, 0xFA, 0x75, 0x46, 0xE6, 0x1B, 0x3C,
+    0xE7, 0x21, 0xA0, 0xDE, 0xC1, 0x26, 0xC7, 0x3F, 0x8C, 0xA1, 0x8A, 0xC5, 0xBD, 0x7D, 0xC6, 0x70,
+    0xF7, 0xB6, 0x6B, 0x84, 0xCB, 0x20, 0x4B, 0x34, 0x4D, 0x50, 0xA5, 0xD8, 0xF3, 0x50, 0xF2, 0xE7,
+    0xE0, 0xE0, 0x32, 0x07, 0x5F, 0xF6, 0x86, 0x06, 0x9D, 0x31, 0x7A, 0xB0, 0x63, 0xB7, 0xB3, 0x04,
+    0x5B, 0x31, 0xA6, 0x9B, 0x29, 0x27, 0x96, 0xB1, 0x5A, 0x41, 0x09, 0xE3, 0x13, 0x39, 0x8E, 0x0C,
+    0x94, 0xFF, 0xD2, 0x2D, 0x8F, 0x91, 0x73, 0x43, 0xC7, 0xFA, 0x65, 0x56, 0x70, 0x94, 0x0B, 0x5F,
+    0xA3, 0xD1, 0xCB, 0x4C, 0x95, 0x5F, 0x64, 0x8D, 0xD2, 0x7C, 0x68, 0xBA, 0x31, 0x0D, 0x1C, 0x55,
+    0xB6, 0x2F, 0x96, 0xB7, 0xB1, 0x79, 0xDE, 0x50, 0xB5, 0x8D, 0x4C, 0xC4, 0xD5, 0x3A, 0xE2, 0x13,
+    0x80, 0x37, 0x68, 0x51, 0xDA, 0x33, 0x70, 0x95, 0x49, 0x57, 0xB5, 0x3F, 0x3F, 0x2F, 0xDA, 0xC5,
+    0xE3, 0x63, 0x95, 0x63, 0x29, 0x96, 0x4A, 0xED, 0xB5, 0x2F, 0x7D, 0xC2, 0xCC, 0x4C, 0x87, 0xDE,
+    0x49, 0xE2, 0xCA, 0x46, 0x60, 0x38, 0x31, 0xB4, 0x65, 0x86, 0x3F, 0x91, 0x61, 0x8C, 0x11, 0x0F,
+    0xAF, 0x6F, 0xED, 0xED, 0x4B, 0x9F, 0x32, 0xAB, 0x7A, 0xBB, 0x83, 0xCD, 0xE9, 0x36, 0x58, 0x7E,
+    0x3D, 0xCD, 0xD1, 0x00, 0x41, 0x80, 0x41, 0x14, 0xD3, 0xF1, 0xEA, 0x24, 0xF2, 0xD7, 0x79, 0x71,
+    0x71, 0x0B, 0x24, 0x5E, 0x2B, 0xA8, 0x15, 0xCA, 0x20, 0x35, 0xF5, 0x8B, 0xED, 0xC6, 0xD7, 0x7B,
+    0xAB, 0xF5, 0x74, 0x7E, 0x55, 0xEE, 0xCC, 0x92, 0xF0, 0xBB, 0x0D, 0xE4, 0xF7, 0xD9, 0xD4, 0x74,
+    0x89, 0x87, 0xF2, 0xE2, 0xAA, 0x73, 0xDF, 0xCD, 0x5C, 0xE1, 0x0D, 0xF1, 0xDA, 0xA9, 0x62, 0x33,
+    0x20, 0x61, 0x5B, 0xC4, 0x17, 0x8A, 0xDA, 0xA3, 0xD1, 0xA7, 0xB1, 0x27, 0xA1, 0xD7, 0x41, 0x02,
+    0x06, 0x4A, 0x18, 0xC7, 0xDE, 0x2B, 0xD2, 0xF9, 0xD2, 0x16, 0x43, 0x4B, 0x02, 0x0E, 0xD6, 0x2F,
+    0x16, 0x28, 0xCA, 0x9C, 0x19, 0xAE, 0x27, 0x61, 0xC8, 0x09, 0xD6, 0xAE, 0x89, 0x90, 0x52, 0x04,
+    0xC2, 0x17, 0x7D, 0x3D, 0x41, 0x18, 0x20, 0x70, 0xB4, 0xBA, 0x83, 0x51, 0xE1, 0xF0, 0x23, 0x7E,
+    0x9B, 0x4B, 0x56, 0xC7, 0x9F, 0x3D, 0x0D, 0xE6, 0x92, 0xED, 0xC0, 0xAD, 0x46, 0xC3, 0x35, 0x94,
+    0xFB, 0xDB, 0x3C, 0xB3, 0x95, 0x9C, 0xFD, 0xA2, 0x9E, 0x23, 0x49, 0xA6, 0xDC, 0xA0, 0x63, 0xC3,
+    0x5D, 0x37, 0xF1, 0x9C, 0x57, 0xE7, 0x58, 0xD5, 0x28, 0xC4, 0x73, 0x2B, 0xE3, 0xBF, 0x14, 0xD3,
+    0x83, 0xEC, 0x49, 0x03, 0x42, 0xD1, 0x3F, 0xE6, 0x22, 0xEE, 0xC5, 0x23, 0x50, 0x64, 0x5F, 0xA6,
+    0x9F, 0x92, 0x5A, 0x69, 0xC5, 0x7D, 0x76, 0x81, 0xB9, 0x0F, 0x43, 0x24, 0x94, 0x20, 0xF1, 0x51,
+    0xF7, 0x30, 0xF7, 0x6A, 0x3A, 0x73, 0xEF, 0x5B, 0x39, 0xD8, 0x75, 0x0F, 0x78, 0xFB, 0x7A, 0xFD,
+    0xEB, 0x80, 0xE8, 0xF0, 0x98, 0x4C, 0xE2, 0xDE, 0xA9, 0x5F, 0x75, 0x36, 0x62, 0x3F, 0x7B, 0x66,
+    0xF1, 0xA8, 0xA7, 0x55, 0xD4, 0x6C, 0x03, 0xE8, 0xFF, 0xD6, 0xBB, 0x50, 0x0E, 0x38, 0xFB, 0xD5,
+    0xD9, 0xB2, 0x4B, 0xFD, 0xC5, 0x05, 0x08, 0x88, 0xBC, 0x90, 0x47, 0x15, 0xE1, 0x92, 0x04, 0x18,
+    0x06, 0x4B, 0x13, 0x12, 0x12, 0xCE, 0xF6, 0xA4, 0x9A, 0xBC, 0x1B, 0x60, 0x9E, 0x49, 0xBA, 0xC5,
+    0x56, 0x9D, 0x47, 0x21, 0x5F, 0xE5, 0x19, 0xFC, 0x71, 0xCB, 0x8D, 0x6F, 0x9E, 0x91, 0x18, 0x6F,
+    0x6E, 0xF8, 0x07, 0xE9, 0x6C, 0xB3, 0x6B, 0x94, 0x2C, 0xCF, 0xAC, 0x5F, 0x1C, 0x1A, 0xA1, 0xD7,
+    0x8F, 0x9A, 0x1B, 0x49, 0x28, 0x22, 0xEA, 0x52, 0xDE, 0x0D, 0xB5, 0xF9, 0x0E, 0x08, 0xA4, 0x78,
+    0x3B, 0x7F, 0x31, 0x1C, 0x75, 0x91, 0x0A, 0xC4, 0x35, 0x68, 0x0D, 0xDF, 0x00, 0xEB, 0x31, 0x0C,
+    0x84, 0x62, 0xEC, 0xAF, 0x82, 0xAD, 0x52, 0xA2, 0xE2, 0x1F, 0xFE, 0xAC, 0xBE, 0x4D, 0xFB, 0xCE,
+    0x0C, 0x82, 0xE5, 0x4A, 0x4D, 0xD8, 0x98, 0x57, 0xFD, 0xE6, 0x83, 0x21, 0x95, 0x25, 0xF3, 0xAD,
+    0x2E, 0xAD, 0x69, 0xB9, 0x4E, 0x1E, 0x4A, 0x29, 0xF0, 0x75, 0xB2, 0xE2, 0x05, 0x7A, 0x4E, 0xF2,
+    0x7D, 0x1A, 0xFB, 0x03, 0xB4, 0xEE, 0xA2, 0x69, 0x44, 0x42, 0x5C, 0x96, 0xFB, 0xE9, 0xC7, 0x42,
+    0x74, 0x7A, 0x2F, 0xDE, 0xCC, 0xA4, 0x5C, 0x29, 0xA9, 0x8C, 0xB6, 0x18, 0xBD, 0x0F, 0xB5, 0xB4,
+    0x79, 0x63, 0x87, 0xAA, 0x60, 0xCA, 0xE9, 0x7C, 0x6A, 0xA9, 0x94, 0x0F, 0x7A, 0x5B, 0xEB, 0x4D,
+    0x14, 0x27, 0xC5, 0x27, 0xDB, 0x98, 0x7A, 0xB4, 0x6A, 0x79, 0xCB, 0x27, 0xEB, 0x6E, 0x51, 0x9E,
+    0x6C, 0x55, 0xFC, 0x40, 0xAF, 0xBF, 0x2F, 0x66, 0xED, 0xE1, 0xB0, 0x46, 0x29, 0xCE, 0x04, 0x92,
+    0xF1, 0xF2, 0x9C, 0xA4, 0x9D, 0x0C, 0xFC, 0x85, 0x57, 0xC4, 0x1D, 0x85, 0x28, 0x8A, 0xFD, 0xA7,
+    0xF1, 0x3E, 0x24, 0x10, 0x90, 0xBE, 0x97, 0xCE, 0x15, 0x78, 0x7C, 0x46, 0x13, 0xB2, 0x5E, 0x42,
+    0x4D, 0x67, 0x5D, 0x1F, 0x71, 0x7A, 0xB0, 0xAD, 0xB8, 0xAA, 0x8E, 0xA2, 0x8E, 0x1E, 0x3F, 0xD1,
+    0x7C, 0xE4, 0x66, 0xCA, 0x06, 0xD7, 0xC8, 0xDC, 0x9B, 0xC5, 0x87, 0x11, 0x99, 0x8D, 0xEF, 0xE9,
+    0xDA, 0xB3, 0x2F, 0x20, 0x8D, 0x9F, 0xB0, 0x4B, 0xF8, 0xDE, 0x68, 0xC5, 0x88, 0xC2, 0x5D, 0x84,
+    0xB9, 0xB5, 0x90, 0x7A, 0x41, 0x0C, 0x31, 0x33, 0x55, 0x9D, 0xD6, 0xBE, 0x86, 0x15, 0xA9, 0xE3,
+    0xFD, 0xB0, 0xB9, 0x79, 0xF8, 0x5C, 0xF4, 0x4B, 0x49, 0x74, 0x27, 0x81, 0xC1, 0xEC, 0xB4, 0x2B,
+    0x91, 0x7E, 0xF3, 0xC2, 0x9D, 0x62, 0x35, 0x49, 0xF4, 0xE3, 0x8E, 0x4D, 0xEE, 0x44, 0xB7, 0xE2,
+    0x20, 0xB1, 0x38, 0xC5, 0x30, 0xFD, 0x01, 0x6C, 0xCC, 0x6E, 0x76, 0xF9, 0x6C, 0x27, 0xD1, 0x0F,
+    0x67, 0x04, 0xCF, 0xF1, 0x00, 0xB5, 0x6A, 0xD4, 0xCD, 0x58, 0x76, 0xAF, 0x1C, 0xFF, 0x74, 0xD7,
+    0xA7, 0x77, 0x45, 0xCD, 0x33, 0x4E, 0x45, 0xBD, 0xCC, 0x38, 0x5C, 0x6C, 0xF7, 0x7C, 0xF7, 0x2B,
+    0xCF, 0x45, 0x2C, 0xC4, 0x73, 0xB1, 0x2D, 0x2B, 0xE6, 0x06, 0x0F, 0x4B, 0xAB, 0x48, 0x1E, 0xF2,
+    0x58, 0x0C, 0x8B, 0x47, 0x4D, 0x81, 0x32, 0x23, 0x7F, 0x7D, 0x2F, 0xF4, 0x80, 0x43, 0x3E, 0x8A,
+    0xDC, 0x5D, 0x1F, 0x27, 0xE6, 0xA2, 0xDC, 0xC8, 0xB6, 0xF7, 0x63, 0x0E, 0x6D, 0xEB, 0xE8, 0x16,
+    0x52, 0x69, 0x97, 0xF2, 0x61, 0x7B, 0x2C, 0x8A, 0x15, 0xD8, 0xE1, 0xE9, 0x28, 0xFF, 0x54, 0x92,
+    0xF3, 0xCB, 0x72, 0x72, 0xB5, 0x23, 0x48, 0xE9, 0x52, 0xA3, 0xC7, 0x3B, 0x1D, 0x05, 0x90, 0x26,
+    0x10, 0xA4, 0x42, 0x9B, 0xA5, 0xAF, 0x7F, 0x99, 0x3B, 0x5A, 0x70, 0xA4, 0x6C, 0xF8, 0xB5, 0xC3,
+    0x42, 0x46, 0x47, 0xEA, 0x62, 0xA0, 0x8F, 0x34, 0x5F, 0x5F, 0x0A, 0x88, 0xB9, 0x19, 0x47, 0xFD,
+    0x94, 0x04, 0x05, 0x7C, 0x8B, 0x65, 0xC4, 0x1D, 0xD2, 0xFC, 0xDD, 0x0E, 0x3A, 0x92, 0x8B, 0xE0,
+    0xCE, 0xBD, 0xF9, 0x1B, 0xFB, 0x91, 0xD3, 0x90, 0x80, 0x08, 0x6B, 0x94, 0x20, 0xCC, 0xC8, 0xC9,
+    0xF9, 0x60, 0x28, 0x7D, 0x6F, 0xDA, 0x5E, 0x64, 0xE0, 0x1C, 0x5F, 0xE9, 0xB8, 0xC3, 0x33, 0x18,
+    0xA5, 0x60, 0xE4, 0xE1, 0x45, 0x1B, 0xEE, 0x20, 0xFF, 0x40, 0x52, 0xFB, 0x3F, 0xD2, 0x03, 0x0A,
+    0x71, 0xD2, 0xCE, 0xC5, 0x84, 0x98, 0x21, 0xE1, 0xF8, 0x13, 0xD6, 0x78, 0x21, 0x75, 0x3C, 0x22,
+    0x1A, 0xCC, 0x67, 0x12, 0x9B, 0x31, 0x06, 0xB7, 0x5E, 0xE6, 0x4B, 0xC2, 0x7E, 0x12, 0xCA, 0x6D,
+    0xD6, 0x95, 0x67, 0xDC, 0xF1, 0x7C, 0xC8, 0xAD, 0x95, 0x53, 0x25, 0x7B, 0x16, 0xD3, 0x0B, 0xE4,
+    0xF4, 0x17, 0x86, 0xC6, 0xA1, 0x2B, 0x28, 0xA9, 0x02, 0x1D, 0x48, 0x14, 0x42, 0x0A, 0x76, 0x95,
+    0x3D, 0xC4, 0x2D, 0x77, 0x5A, 0x67, 0x6F, 0xDB, 0x81, 0xA4, 0xA4, 0x74, 0x19, 0xA0, 0xFC, 0x2F,
+    0x9D, 0x26, 0x4D, 0x44, 0x44, 0xDD, 0xAE, 0xCB, 0x85, 0xBC, 0x21, 0xBB, 0xFC, 0xDF, 0xDB, 0x54,
+    0xAA, 0x21, 0x95, 0x0C, 0xFF, 0x2C, 0x17, 0x37, 0x5A, 0xFC, 0x4A, 0x39, 0x34, 0xED, 0xE4, 0x71,
+    0x84, 0x5C, 0x28, 0xEB, 0x0A, 0x25, 0x16, 0xA4, 0xA1, 0x8B, 0x63, 0xB0, 0xFB, 0x26, 0xF3, 0xD1,
+    0x37, 0x0E, 0x52, 0xF9, 0x77, 0x3D, 0xAA, 0x66, 0xC7, 0xB9, 0xED, 0x84, 0x88, 0xFE, 0xEF, 0x33,
+    0x5A, 0x61, 0x87, 0x03, 0x2A, 0x83, 0xDB, 0x4C, 0x73, 0xBE, 0xF9, 0x6A, 0x04, 0x3F, 0xEC, 0x6E,
+    0xCC, 0x5D, 0xA5, 0x8F, 0xA1, 0xCB, 0x53, 0x86, 0x80, 0xC4, 0x21, 0xBA, 0xC2, 0x2D, 0x65, 0xE7,
+    0xE2, 0x35, 0x97, 0x2C, 0xA6, 0xE2, 0x09, 0x76, 0x10, 0xA2, 0xC0, 0x30, 0xDF, 0x9A, 0xDC, 0x38,
+    0x06, 0x3D, 0x05, 0x26, 0x16, 0x4D, 0xA8, 0xA9, 0x1E, 0x07, 0x1D, 0x62, 0x6C, 0xA5, 0xCC, 0xEB,
+    0x05, 0x21, 0x64, 0xD4, 0x3E, 0x4B, 0xB3, 0x96, 0x14, 0x75, 0xFC, 0x5C, 0xCA, 0xDB, 0x1F, 0xDC,
+    0x41, 0x9D, 0x60, 0x05, 0xF8, 0x89, 0xC9, 0x7E, 0x3B, 0x74, 0x75, 0x49, 0x34, 0x3A, 0x74, 0x79,
+    0xDF, 0x16, 0x3D, 0x6F, 0xA1, 0xF3, 0x26, 0x29, 0x61, 0x5F, 0xBB, 0xEB, 0x62, 0x42, 0x3A, 0x7F,
+    0x2F, 0xC5, 0x19, 0xD6, 0x77, 0x9E, 0x1D, 0xF5, 0x15, 0x71, 0x6F, 0x74, 0x1E, 0xE5, 0xBA, 0x08,
+    0x21, 0x07, 0x64, 0x9F, 0x78, 0x5A, 0x11, 0x20, 0xFB, 0x43, 0x4F, 0x4A, 0xFD, 0x6A, 0x2F, 0xB7,
+    0x66, 0x7A, 0xA5, 0x27, 0xF7, 0x6F, 0x05, 0x85, 0xCC, 0xC2, 0xC5, 0xDE, 0x18, 0x43, 0xB9, 0x9F,
+    0x84, 0xBA, 0x09, 0x1A, 0x0E, 0x7E, 0xBE, 0xBA, 0xE4, 0xD6, 0x1E, 0x9E, 0x83, 0x7D, 0x1D, 0xED,
+    0xDE, 0x4D, 0x96, 0x91, 0x50, 0x2D, 0x54, 0x46, 0x98, 0xC5, 0xE2, 0xE6, 0xE7, 0x6F, 0xB4, 0x06,
+    0xF0, 0x56, 0x4C, 0x2B, 0xB1, 0xEC, 0xC4, 0x98, 0x87, 0x76, 0x00, 0xF8, 0x47, 0x70, 0x4F, 0x13,
+    0x2C, 0xDE, 0x79, 0x9B, 0xB5, 0x90, 0xFA, 0xC3, 0xAA, 0x0D, 0xB6, 0xCC, 0x37, 0xB2, 0x5D, 0xB7,
+    0x8B, 0x19, 0x96, 0x20, 0xFF, 0x0C, 0x21, 0x23, 0x41, 0xA8, 0x15, 0x3F, 0x03, 0x01, 0x57, 0xA2,
+    0x7F, 0xF1, 0xE6, 0x4B, 0x50, 0xC3, 0xD6, 0xF3, 0xEF, 0xE0, 0x7A, 0xEE, 0x76, 0xA0, 0x67, 0x22,
+    0x09, 0x45, 0x91, 0x07, 0x87, 0x1E, 0xC6, 0x2A, 0x13, 0x45, 0x10, 0x0E, 0x72, 0x9E, 0xFB, 0xA0,
+    0x9C, 0xA4, 0xA3, 0xE7, 0x17, 0xC5, 0x90, 0x30, 0x42, 0x87, 0x1B, 0x3A, 0xC0, 0xD9, 0xA7, 0x9A,
+    0xEE, 0xDE, 0x42, 0xFE, 0x96, 0xD3, 0x7A, 0x3E, 0xBE, 0xAF, 0xE9, 0xCD, 0xEF, 0xA6, 0xD9, 0xC6,
+    0x0E, 0x2C, 0xA9, 0xC1, 0x6B, 0x99, 0x11, 0xC2, 0x91, 0x45, 0x0B, 0xC4, 0xD0, 0xC3, 0xD7, 0xF9,
+    0x0B, 0x9A, 0x1E, 0x2E, 0xC7, 0x01, 0x22, 0x6A, 0x75, 0x50, 0x89, 0x79, 0x07, 0x21, 0x8C, 0xF9,
+    0xA6, 0x15, 0x95, 0xC0, 0xE3, 0xFC, 0x20, 0x65, 0x36, 0x2D, 0x5F, 0xAE, 0xFE, 0xCE, 0x97, 0x71,
+    0xF5, 0x3A, 0xBD, 0xCB, 0xA1, 0x9F, 0x46, 0xA6, 0x3A, 0xA7, 0x7A, 0x26, 0xA2, 0xDE, 0x36, 0x19,
+    0x15, 0xDE, 0x17, 0x7E, 0xD7, 0x5E, 0x4A, 0xEE, 0xE2, 0xC9, 0x53, 0x25, 0x77, 0xC3, 0x18, 0xBB,
+    0xB4, 0xAA, 0x43, 0xFD, 0x5C, 0x21, 0x8A, 0x37, 0xDB, 0x1C, 0x3D, 0x36, 0x2E, 0x6D, 0xEA, 0x61,
+    0x72, 0x9E, 0xF1, 0x6F, 0xD1, 0x14, 0xF6, 0x29, 0x4E, 0xFD, 0xFD, 0x3D, 0x4D, 0xB9, 0x25, 0x4B,
+    0x38, 0xA2, 0x00, 0xEB, 0x14, 0xBA, 0xEE, 0xB1, 0x03, 0x84, 0x98, 0xF4, 0xCF, 0x05, 0x9E, 0x1C,
+    0x7A, 0x8F, 0xAE, 0x85, 0x76, 0x57, 0xF4, 0x8E, 0x16, 0x06, 0x35, 0x77, 0xBB, 0x90, 0x41, 0x9E,
+    0xCB, 0x52, 0x97, 0xCA, 0xC1, 0x7F, 0xA9, 0x01, 0x8B, 0x7D, 0xC4, 0xB8, 0xD9, 0xDC, 0x01, 0x3D,
+    0x58, 0xF8, 0x10, 0xD1, 0xDF, 0x1A, 0x6A, 0x27, 0xE2, 0x65, 0x47, 0x1A, 0xC3, 0x8C, 0xDB, 0xE4,
+    0xC5, 0x5C, 0x72, 0x0D, 0xAB, 0x84, 0x71, 0x54, 0xE2, 0x0F, 0xBB, 0xDE, 0xE0, 0x1F, 0xB1, 0x70,
+    0x08, 0x09, 0x6B, 0x43, 0x72, 0x76, 0x71, 0x7C, 0xA5, 0x87, 0x65, 0x11, 0x7F, 0xA3, 0x17, 0x93,
+    0x1C, 0x88, 0x4C, 0x6D, 0x9E, 0x36, 0x17, 0x37, 0x7F, 0x18, 0xDE, 0x6B, 0xC9, 0xEF, 0x04, 0x95,
+    0xE6, 0x0A, 0x20, 0xEF, 0x30, 0x53, 0xED, 0x09, 0x1F, 0x08, 0xA3, 0x42, 0x1B, 0xA5, 0x5F, 0x21,
+    0x9D, 0xFF, 0xE1, 0x13, 0x23, 0xC9, 0x36, 0xB4, 0x43, 0x1F, 0x34, 0x2A, 0x18, 0xC5, 0x26, 0x42,
+    0xCB, 0xFB, 0xF3, 0x67, 0xA8, 0x5E, 0xF6, 0x14, 0x50, 0x68, 0xA6, 0xF9, 0x6D, 0x78, 0xB5, 0xF3,
+    0x8A, 0x14, 0xE3, 0xFE, 0xB5, 0x7C, 0x88, 0x11, 0x56, 0xDA, 0x9A, 0x62, 0x30, 0x46, 0x34, 0xFB,
+    0x9D, 0x99, 0xE0, 0xA6, 0xB2, 0x2F, 0xA6, 0xF3, 0x7F, 0x2D, 0xAC, 0x71, 0x29, 0x0A, 0x3D, 0x86,
+    0xB0, 0x75, 0x97, 0xA4, 0xC3, 0x28, 0x9D, 0x6D, 0x0F, 0xA1, 0x3A, 0xB1, 0xC7, 0xEB, 0xC5, 0x3D,
+    0x38, 0xE5, 0xED, 0xA6, 0xD9, 0xDF, 0x25, 0x38, 0x81, 0xBC, 0xBA, 0x73, 0x80, 0x09, 0xED, 0x98,
+    0x59, 0xB9, 0xD9, 0x71, 0xD1, 0xD8, 0x6B, 0xF7, 0x08, 0xF8, 0x8E, 0x0A, 0xD2, 0x57, 0x66, 0xEA,
+    0x02, 0x5F, 0x8B, 0xF3, 0xAD, 0x62, 0xCA, 0x25, 0x83, 0xD3, 0xA4, 0x0C, 0x3A, 0x68, 0x8E, 0xFC,
+    0x8A, 0xDE, 0xD8, 0x42, 0x47, 0x6C, 0x38, 0x57, 0xE6, 0xD2, 0x6B, 0x42, 0xDD, 0x68, 0x8E, 0xBA,
+    0xCD, 0xC7, 0xFB, 0x1C, 0x72, 0x6E, 0xE8, 0x2C, 0x16, 0xCF, 0xB1, 0xEB, 0x1F, 0x07, 0xF4, 0xEB,
+    0x56, 0x44, 0xD2, 0xA5, 0xC8, 0xCB, 0x97, 0xD5, 0x71, 0xA1, 0xAE, 0x11, 0x38, 0x2F, 0x2E, 0xB8,
+    0x06, 0x80, 0x73, 0xA2, 0x82, 0xC6, 0x0F, 0x24, 0x58, 0xD9, 0xDB, 0x5A, 0x1A, 0xAC, 0xCA, 0xCA,
+    0x6C, 0xB3, 0x74, 0x59, 0x4A, 0xBC, 0x42, 0x80, 0x8D, 0x2A, 0xF7, 0x5E, 0x12, 0x7F, 0x01, 0x01,
+    0x6B, 0xF4, 0x0B, 0xFE, 0x83, 0xD1, 0xC9, 0x9C, 0x11, 0xFE, 0x7C, 0x18, 0xBD, 0xF0, 0xB9, 0x93,
+    0xEA, 0x5E, 0x6F, 0x95, 0xA1, 0x06, 0x90, 0xA2, 0xEA, 0xAD, 0xA5, 0x87, 0x23, 0x78, 0x9A, 0x20,
+    0x50, 0xAF, 0x38, 0x17, 0x6D, 0x14, 0xBB, 0x68, 0x5C, 0xCB, 0x6E, 0xC7, 0xD3, 0x11, 0x81, 0x43,
+    0xD5, 0xE5, 0x87, 0xE4, 0x4E, 0xFB, 0xEE, 0x3E, 0x3A, 0x6D, 0xEC, 0x79, 0xE5, 0x90, 0x68, 0xCB,
+    0xF7, 0x01, 0xFF, 0x26, 0x3B, 0x82, 0xB1, 0x67, 0x04, 0xB7, 0x32, 0x52, 0xA0, 0xFF, 0x60, 0x97,
+    0x8D, 0xA9, 0x8C, 0xDC, 0xF3, 0x37, 0xE1, 0x87, 0x1F, 0x95, 0xAD, 0x16, 0x69, 0x4B, 0xF2, 0x26,
+    0xE4, 0x79, 0x1C, 0x3C, 0xA8, 0x87, 0x4D, 0x9D, 0x0D, 0xB2, 0x01, 0x29, 0x22, 0xB6, 0x20, 0x8B,
+    0x66, 0x8A, 0x1A, 0x09, 0xF4, 0xE1, 0xAF, 0x52, 0xBA, 0x63, 0xA9, 0x35, 0xD1, 0x1D, 0x4B, 0xDD,
+    0xBE, 0x30, 0x11, 0x4E, 0xFE, 0xCD, 0x57, 0x54, 0xFA, 0x39, 0xB4, 0x8C, 0x2B, 0x0D, 0x83, 0x36,
+    0x18, 0x81, 0xE5, 0xBA, 0x18, 0xDF, 0x41, 0x5F, 0x21, 0x25, 0xCE, 0x47, 0x11, 0x56, 0x20, 0x5D,
+    0x72, 0xFA, 0x54, 0x1E, 0xF5, 0x0A, 0x31, 0x92, 0x85, 0x95, 0x26, 0x11, 0x26, 0x24, 0x67, 0x84,
+    0x1A, 0xA2, 0x71, 0xFB, 0xAE, 0x7E, 0xAE, 0x27, 0xB5, 0x64, 0xF0, 0xF3, 0x40, 0x55, 0x7D, 0xDB,
+    0xF3, 0x28, 0x62, 0xDD, 0xF0, 0xFA, 0x41, 0xD7, 0xCA, 0x38, 0x73, 0x25, 0xD9, 0x13, 0x3E, 0xCB,
+    0xC2, 0x49, 0x79, 0x10, 0xE9, 0x43, 0xCD, 0xEA, 0x78, 0x6C, 0x61, 0x36, 0x87, 0xF3, 0x37, 0x80,
+    0x08, 0x3C, 0x5B, 0x41, 0x1A, 0x59, 0x3E, 0xA0, 0x2D, 0x07, 0x03, 0x9B, 0xEE, 0x47, 0xEC, 0xB4,
+    0xB8, 0xB5, 0x5C, 0x5F, 0x70, 0xAB, 0x04, 0x12, 0xF7, 0x5A, 0x89, 0xB7, 0x00, 0x6A, 0x2A, 0x37,
+    0x14, 0x56, 0xA8, 0x03, 0x45, 0x38, 0xBB, 0xC5, 0x70, 0xAB, 0x4B, 0xBE, 0x6D, 0xEA, 0xA6, 0x27,
+    0x1F, 0x19, 0x5A, 0x02, 0x12, 0xE0, 0x9E, 0x83, 0xD9, 0x78, 0x27, 0x34, 0x6B, 0x81, 0x2A, 0x82,
+    0x73, 0x80, 0x06, 0x7E, 0x9C, 0xE2, 0xFB, 0x6E, 0x12, 0xAE, 0xA6, 0x7E, 0x8D, 0xBF, 0xAC, 0x5A,
+    0x6C, 0x49, 0x81, 0xE7, 0x03, 0x8C, 0x3C, 0x05, 0x01, 0x61, 0x96, 0xD8, 0x05, 0x62, 0xFA, 0x36,
+    0xBC, 0x26, 0x8E, 0xB3, 0x2D, 0x49, 0x80, 0x6B, 0x4D, 0xF1, 0x63, 0x42, 0x56, 0x53, 0xA8, 0x8E,
+    0x63, 0xB2, 0xCF, 0x38, 0x31, 0xF0, 0x56, 0x6D, 0x58, 0x6A, 0xEB, 0x59, 0x07, 0x27, 0x08, 0x1D,
+    0x64, 0xE2, 0x5A, 0x69, 0xBE, 0x47, 0xE8, 0xCA, 0xEE, 0x66, 0x3D, 0x95, 0xE3, 0x00, 0x24, 0xAF,
+    0xEA, 0xF6, 0xE8, 0x30, 0xB2, 0x24, 0x85, 0x30, 0x28, 0xFB, 0x46, 0x7A, 0xDC, 0xC1, 0x11, 0xF6,
+    0xBE, 0xBB, 0x12, 0x92, 0x9E, 0x7A, 0x85, 0x24, 0x25, 0xF1, 0xFB, 0xDE, 0xD1, 0x1E, 0x46, 0xCE,
+    0x4D, 0xCC, 0xB4, 0x5D, 0xD2, 0x41, 0x7F, 0x47, 0x92, 0x1A, 0xAE, 0xB3, 0xB5, 0x26, 0x96, 0xB2,
+    0x38, 0x92, 0x33, 0x67, 0x52, 0x3D, 0xA9, 0x3C, 0xA0, 0x46, 0x43, 0xE8, 0xEE, 0x22, 0x82, 0xD7,
+    0xEC, 0xBC, 0x79, 0x9E, 0x0F, 0x47, 0x20, 0x32, 0x48, 0x7E, 0x79, 0x2C, 0x82, 0xD7, 0x57, 0x31,
+    0xD8, 0xE8, 0xEC, 0x4D, 0x44, 0x7E, 0x92, 0xB8, 0xA2, 0xE3, 0xC5, 0x09, 0x6C, 0x13, 0xFF, 0xF0,
+    0x35, 0x12, 0x63, 0x46, 0x46, 0x35, 0x3F, 0xC7, 0x7C, 0xB8, 0xEA, 0xA7, 0x96, 0x9D, 0x19, 0xAC,
+    0x72, 0x44, 0xA5, 0xBC, 0x41, 0xD0, 0x4D, 0xA2, 0xD7, 0x00, 0x19, 0xFF, 0xD7, 0x3F, 0x09, 0xEB,
+    0x58, 0xAC, 0x81, 0x9D, 0xBB, 0x80, 0x74, 0xFA, 0x2E, 0xBC, 0x6D, 0xE6, 0xEB, 0x91, 0x80, 0x5F,
+    0x67, 0x03, 0x14, 0x54, 0x65, 0x0A, 0x7D, 0x6C, 0xC1, 0xC9, 0xC0, 0xF4, 0xE0, 0x7B, 0x6A, 0x45,
+    0xCF, 0x13, 0x3E, 0x37, 0x07, 0x03, 0x42, 0xCA, 0xE0, 0xA2, 0xD1, 0x00, 0x00, 0x10, 0xDE, 0xE5,
+    0x81, 0x9A, 0xD0, 0x14, 0xF7, 0x98, 0xA5, 0xE1, 0xD3, 0x84, 0xAC, 0x70, 0xC6, 0x75, 0xB4, 0x27,
+    0xF5, 0xEB, 0x08, 0x4C, 0x64, 0xC1, 0x74, 0x45, 0xB1, 0x30, 0x48, 0xE4, 0xAA, 0x99, 0xBD, 0xC0,
+    0x27, 0xDE, 0x54, 0xA4, 0xC4, 0xFE, 0xDF, 0x69, 0xF2, 0x46, 0xF8, 0x7E, 0x79, 0x99, 0xFE, 0xD1,
+    0x4A, 0x77, 0x6C, 0xFA, 0x13, 0x2C, 0xD3, 0x9B, 0x45, 0x2F, 0x86, 0x0F, 0xB6, 0xAA, 0x76, 0x42,
+    0xE7, 0x11, 0x3D, 0xE9, 0x52, 0xC1, 0x3B, 0x17, 0x66, 0x60, 0x1C, 0x67, 0xA9, 0xF0, 0x83, 0xFF,
+    0x80, 0x59, 0x4F, 0xAA, 0xC7, 0xE7, 0x95, 0x81, 0xA0, 0xEE, 0x5D, 0x3D, 0x36, 0xA6, 0x0B, 0x81,
+    0xFD, 0xD0, 0xF3, 0xE7, 0x76, 0x7C, 0x11, 0xB4, 0x4F, 0x62, 0xD6, 0x3A, 0x1E, 0x5D, 0xED, 0x91,
+    0xB3, 0x55, 0x2D, 0x83, 0xD3, 0xF4, 0xC9, 0x52, 0x59, 0x6B, 0xD2, 0xCA, 0x22, 0xC4, 0x8D, 0x74,
+    0xEC, 0x15, 0x47, 0x03, 0x0B, 0xDD, 0x1E, 0x83, 0x6A, 0xD7, 0x3C, 0x6F, 0x57, 0x67, 0x6B, 0x77,
+    0x8D, 0x67, 0x98, 0x88, 0x5D, 0x3C, 0x4C, 0x52, 0x6B, 0xC5, 0x8F, 0x82, 0x10, 0x18, 0x13, 0x3F,
+    0xD4, 0x65, 0x18, 0xFC, 0xFA, 0xD7, 0x97, 0xFD, 0x89, 0xC4, 0x82, 0x4E, 0xB6, 0x40, 0xC0, 0x62,
+    0x60, 0xB9, 0x95, 0xAB, 0x86, 0xB8, 0xE1, 0x10, 0xBD, 0xB3, 0xEC, 0x58, 0xDF, 0x13, 0xF4, 0x4D,
+    0x0A, 0x1D, 0xB8, 0x78, 0x2C, 0x0D, 0x70, 0xC2, 0xF9, 0xB8, 0x78, 0x10, 0x0E, 0x4D, 0xC6, 0x7B,
+    0xED, 0x1D, 0xBF, 0x64, 0x4E, 0xBC, 0xEA, 0x0A, 0x61, 0x49, 0xCE, 0x20, 0xD1, 0x21, 0x31, 0xEC,
+    0x30, 0xF9, 0x34, 0x94, 0x46, 0xF0, 0xFF, 0x4E, 0xFE, 0xB8, 0x6D, 0x78, 0xA5, 0x2C, 0x95, 0xDD,
+    0x45, 0x1E, 0x73, 0xA1, 0xC1, 0x7B, 0x60, 0xBD, 0x62, 0x2F, 0x31, 0x59, 0x6D, 0x3D, 0x00, 0x09,
+    0x0D, 0x2A, 0xA4, 0x86, 0xF3, 0x5A, 0x12, 0xAA, 0x50, 0x72, 0x8F, 0xA6, 0x96, 0xFD, 0x27, 0xA5,
+    0x52, 0xE3, 0xD1, 0x87, 0x8C, 0x00, 0xAE, 0xF9, 0x98, 0x98, 0x05, 0xD6, 0x89, 0x54, 0x71, 0x7E,
+    0x8F, 0xA7, 0xFE, 0x40, 0xAB, 0xEE, 0x04, 0xE2, 0xB2, 0xB5, 0x89, 0xFD, 0x38, 0xF0, 0xF9, 0x63,
+    0xAD, 0xBA, 0x2F, 0xF2, 0xF2, 0xC4, 0x7B, 0xF4, 0xE4, 0x10, 0x25, 0x8C, 0xBD, 0x6A, 0xF3, 0x23,
+    0x4B, 0xAE, 0xB1, 0x9B, 0x83, 0xF4, 0x1D, 0x12, 0x54, 0x72, 0xB5, 0xD4, 0xA0, 0xED, 0x4F, 0xA0,
+    0xBB, 0xBD, 0xEF, 0x4E, 0xC7, 0xDC, 0x5F, 0x04, 0x8B, 0x4F, 0x28, 0x02, 0x6D, 0x57, 0xE5, 0xD1,
+    0x44, 0x86, 0x26, 0xBB, 0x8E, 0x20, 0xC2, 0xCD, 0xD2, 0x1E, 0x49, 0x0E, 0x71, 0x36, 0xD8, 0x38,
+    0x7F, 0x18, 0x08, 0x16, 0x98, 0x13, 0x84, 0x39, 0x1C, 0x17, 0xED, 0x52, 0xE8, 0x43, 0x48, 0x44,
+    0x00, 0x7C, 0x9C, 0xE8, 0x80, 0xF3, 0x71, 0xD0, 0x2D, 0xF8, 0x6D, 0xFF, 0x6E, 0x0B, 0xF5, 0x86,
+    0xE8, 0x68, 0x25, 0x90, 0xC2, 0x04, 0x0C, 0x30, 0x6B, 0x31, 0x3E, 0x71, 0x51, 0x98, 0xD6, 0xD8,
+    0x50, 0xB4, 0xAA, 0xDF, 0x02, 0x0C, 0x78, 0x8F, 0x5E, 0x29, 0x02, 0xC8, 0xB5, 0xAD, 0x43, 0x9E,
+    0x59, 0x7D, 0xF1, 0xBB, 0x1E, 0xCC, 0xA0, 0x78, 0x53, 0xB1, 0x1C, 0x77, 0xAC, 0x55, 0xE1, 0x8C,
+    0xE3, 0x65, 0x27, 0x06, 0x79, 0x61, 0x95, 0x9D, 0x93, 0x05, 0xBA, 0x35, 0xCF, 0xAA, 0x96, 0x4F,
+    0x9A, 0xD1, 0x4C, 0x71, 0x27, 0xC4, 0x06, 0x5A, 0xBD, 0x39, 0x26, 0x87, 0x5F, 0x3C, 0x61, 0x94,
+    0xB9, 0x55, 0x48, 0x03, 0x06, 0x47, 0x8F, 0x81, 0x88, 0x19, 0x63, 0xE9, 0x3D, 0x8E, 0x6C, 0x5F,
+    0x72, 0xDE, 0x48, 0x1B, 0xFF, 0x8C, 0xEC, 0x2B, 0xF1, 0x75, 0x64, 0x03, 0xE7, 0xA3, 0xB4, 0xCC,
+    0x19, 0x44, 0x42, 0x96, 0x5C, 0xC4, 0x17, 0x6C, 0x7A, 0x20, 0xFF, 0xE3, 0xD5, 0x2C, 0xB6, 0x5C,
+    0x27, 0x97, 0xB3, 0x5B, 0x7B, 0xBC, 0x65, 0x76, 0xB5, 0xFD, 0x05, 0xD2, 0xA3, 0xC5, 0x79, 0x77,
+    0xBF, 0x77, 0x00, 0x7D, 0xA0, 0x0E, 0x53, 0x15, 0x2B, 0xC1, 0xB7, 0x40, 0xEA, 0xBC, 0x37, 0xE0,
+    0x52, 0x28, 0xAE, 0x03, 0x4D, 0x3E, 0x95, 0x03, 0x61, 0x2B, 0x5C, 0x7D, 0x6E, 0x51, 0xCA, 0x49,
+    0x37, 0xA2, 0xCF, 0xEA, 0x4C, 0x4B, 0x4D, 0x43, 0xCD, 0xF7, 0xBC, 0xCE, 0xEE, 0x4D, 0xE2, 0x96,
+    0x6D, 0xD6, 0xE2, 0x82, 0x92, 0xFE, 0x4C, 0x3E, 0x97, 0xD5, 0xDA, 0x45, 0xA3, 0xB0, 0xE0, 0x8C,
+    0x7E, 0x45, 0xF7, 0xE5, 0x9E, 0xB5, 0xA0, 0x63, 0xE6, 0xC4, 0x0C, 0x02, 0x91, 0x17, 0x4A, 0xC2,
+    0xD3, 0xB1, 0xDB, 0x85, 0xD1, 0x90, 0x7F, 0x21, 0x4B, 0x8E, 0xEA, 0x13, 0x55, 0xEE, 0xD5, 0xA2,
+    0xA6, 0xB9, 0x09, 0x96, 0xA2, 0xF8, 0xCB, 0xCE, 0xC4, 0x3B, 0x1C, 0x05, 0xEB, 0x00, 0x13, 0xFC,
+    0xFC, 0x9F, 0xC0, 0xCD, 0x2C, 0xB0, 0xC5, 0x8F, 0x38, 0xD7, 0xAB, 0xE4, 0x86, 0xB4, 0xA3, 0x78,
+    0x1F, 0x36, 0x22, 0xD2, 0x81, 0x6A, 0xBD, 0xA0, 0x9F, 0x61, 0x92, 0xF8, 0x6A, 0x27, 0x75, 0x72,
+    0x06, 0x16, 0x66, 0x76, 0x90, 0x93, 0x29, 0xBD, 0xEB, 0x9D, 0xA5, 0x81, 0xEF, 0xEB, 0x69, 0x93,
+    0x8E, 0xE8, 0x17, 0x8F, 0x42, 0x0A, 0x4D, 0xA0, 0x2D, 0x20, 0xB3, 0x1F, 0x6A, 0xDB, 0x22, 0xE9,
+    0x24, 0x64, 0x52, 0x06, 0x65, 0xA5, 0xC5, 0x82, 0x59, 0x47, 0xF4, 0xE9, 0xB9, 0xA3, 0xB1, 0x02,
+    0xFC, 0x60, 0x8B, 0x42, 0xF5, 0x23, 0xD8, 0xD8, 0x35, 0x70, 0x38, 0xEB, 0x5D, 0x15, 0xEF, 0xD6,
+    0xD3, 0x75, 0x80, 0x6E, 0xBA, 0x2E, 0xD6, 0x11, 0x54, 0x6E, 0x24, 0xC1, 0xC7, 0x7A, 0xE1, 0xCB,
+    0xAE, 0x62, 0x27, 0x48, 0xB7, 0x9C, 0xA7, 0x9E, 0x15, 0xFD, 0xDE, 0xC0, 0xBE, 0xBB, 0xC2, 0x2E,
+    0x4A, 0x5C, 0xD4, 0x81, 0xC0, 0x93, 0x58, 0x00, 0x9C, 0xFB, 0x36, 0x27, 0xD7, 0x72, 0x46, 0x9D,
+    0xAC, 0xEF, 0xD8, 0x14, 0x1C, 0x58, 0xC0, 0x4E, 0xD4, 0x16, 0xE1, 0x58, 0x56, 0x25, 0xA9, 0x38,
+    0xCF, 0x06, 0xAA, 0xA3, 0x4F, 0x52, 0x70, 0x09, 0x41, 0x44, 0xD0, 0x98, 0x73, 0xED, 0x18, 0xB4,
+    0xDB, 0x07, 0xC9, 0xB7, 0xBB, 0x5A, 0xD6, 0x08, 0xE5, 0x89, 0x19, 0xD8, 0x1A, 0xB6, 0x84, 0x72,
+    0x1B, 0xEA, 0x14, 0x78, 0x96, 0xB4, 0x2D, 0x61, 0x20, 0x8D, 0x9A, 0xD2, 0x87, 0x23, 0x18, 0x7A,
+    0xA3, 0x70, 0x4D, 0xA6, 0xBB, 0xEE, 0x99, 0x78, 0xD8, 0x94, 0xF1, 0x35, 0x91, 0x45, 0xDB, 0x2A,
+    0x8A, 0xDD, 0x8F, 0xC5, 0x05, 0x17, 0xB6, 0x69, 0x4E, 0xD2, 0xF0, 0x16, 0x09, 0x14, 0x65, 0xE0,
+    0x76, 0x6B, 0x33, 0xE8, 0x4D, 0xDF, 0xAF, 0x5A, 0x0C, 0xF6, 0xB0, 0x29, 0xEF, 0xB9, 0x85, 0x96,
+    0x16, 0xED, 0x03, 0x45, 0xFA, 0x6F, 0x03, 0x64, 0x62, 0x6D, 0x32, 0x75, 0x82, 0x32, 0x14, 0x23,
+    0x5A, 0x85, 0xFF, 0xFE, 0x65, 0x52, 0xBC, 0xAD, 0x99, 0xC2, 0xDA, 0x8B, 0x86, 0xC0, 0x2E, 0x78,
+    0x38, 0xDF, 0x5E, 0x83, 0xDE, 0xE0, 0x72, 0xD5, 0x91, 0x6B, 0xDB, 0xDF, 0x7F, 0xA7, 0x8B, 0xA4,
+    0x5B, 0x10, 0x93, 0x4D, 0xA4, 0xB4, 0x22, 0xC1, 0xB3, 0xBE, 0x8B, 0x56, 0x82, 0xB9, 0x33, 0x85,
+    0x01, 0xFA, 0xF5, 0x95, 0x9D, 0x0C, 0xBC, 0xD4, 0xB0, 0x2F, 0x94, 0xD9, 0x2E, 0xDA, 0xB9, 0x49,
+    0xC5, 0x53, 0xA2, 0xE9, 0x4D, 0x81, 0xDE, 0xC0, 0xF8, 0x01, 0x60, 0xEA, 0xAA, 0x57, 0x66, 0xA5,
+    0x5D, 0x4B, 0x6D, 0xEC, 0x85, 0xBF, 0x10, 0x18, 0x43, 0xD1, 0xD7, 0xA2, 0xBA, 0x72, 0x09, 0x63,
+    0x71, 0xB2, 0xA2, 0x14, 0x52, 0x94, 0xFD, 0x40, 0xA6, 0x89, 0x1B, 0xD5, 0x16, 0x7D, 0xB1, 0x22,
+    0x00, 0xF7, 0x62, 0x12, 0x5E, 0xBB, 0xA1, 0x03, 0x6C, 0x3D, 0x32, 0x1C, 0xD8, 0x3A, 0xB5, 0x24,
+    0xF6, 0x64, 0x67, 0xCD, 0x47, 0xEB, 0x6A, 0xFB, 0x94, 0xCE, 0xA6, 0xF4, 0x9D, 0x2B, 0xBD, 0x50,
+    0x2A, 0x53, 0x63, 0xEF, 0x7B, 0x94, 0x68, 0x26, 0xE2, 0xD8, 0x13, 0x5A, 0xD2, 0xE3, 0x1D, 0x01,
+    0xE4, 0xB8, 0x3C, 0x42, 0x07, 0x3B, 0x14, 0x01, 0xEB, 0x18, 0xBF, 0x39, 0xD9, 0xC4, 0xD6, 0x41,
+    0xB2, 0xE7, 0xCD, 0x02, 0x86, 0x8B, 0xA7, 0x77, 0x5D, 0xC9, 0x5C, 0xC0, 0xBE, 0xDE, 0x3D, 0x67,
+    0xA3, 0xD7, 0xDA, 0xB5, 0x88, 0x39, 0xEA, 0x9D, 0x7A, 0xF7, 0x99, 0x3E, 0xDE, 0xF9, 0x36, 0x1E,
+    0xBB, 0xAB, 0x61, 0x8C, 0xB2, 0xB9, 0x61, 0x18, 0x7D, 0x4A, 0x32, 0x7E, 0xCC, 0x71, 0xBC, 0xC6,
+    0xAA, 0xDE, 0x08, 0xFF, 0xEE, 0x44, 0x4B, 0xD7, 0xC1, 0xDB, 0xCE, 0xFE, 0x89, 0x56, 0x03, 0xDA,
+    0x3A, 0xF5, 0xD3, 0x9D, 0x39, 0x63, 0x92, 0x33, 0x50, 0x13, 0x8B, 0x7B, 0x5A, 0xC0, 0x79, 0xED,
+    0x40, 0xAD, 0x1B, 0x53, 0x50, 0x74, 0x0A, 0xA0, 0xA7, 0x5D, 0x5B, 0x61, 0x85, 0x93, 0x8A, 0xB9,
+    0xA9, 0x2C, 0x0F, 0xA2, 0xBD, 0x7A, 0x33, 0xF3, 0xD6, 0xD6, 0x64, 0x60, 0xCF, 0x12, 0x88, 0x08,
+    0x13, 0x0B, 0xC2, 0x76, 0xEC, 0x4B, 0x75, 0x74, 0xCC, 0x60, 0xF8, 0x9E, 0xAD, 0x40, 0xFD, 0x5E,
+    0x58, 0x2D, 0x08, 0xB7, 0x6C, 0xB6, 0x27, 0x73, 0x4B, 0x31, 0x03, 0x1D, 0x7A, 0xC5, 0x59, 0x67,
+    0x1F, 0x5C, 0xDE, 0x08, 0x24, 0x0D, 0xB9, 0x33, 0x97, 0x51, 0xC6, 0xC3, 0x13, 0xE0, 0xFC, 0x45,
+    0xDA, 0x5F, 0xFC, 0xA9, 0x8E, 0x71, 0x54, 0x1C, 0x3A, 0x4D, 0xFB, 0x7B, 0x06, 0xFB, 0x65, 0xB1,
+    0x27, 0x0B, 0x8C, 0xAF, 0xF2, 0xA0, 0x12, 0xA6, 0xD7, 0xAC, 0x27, 0xC1, 0x55, 0xE7, 0x17, 0x81,
+    0xFD, 0xA2, 0xF8, 0xC3, 0x17, 0x55, 0x9B, 0x00, 0xFE, 0x91, 0xA9, 0xDC, 0xDE, 0xB0, 0xD7, 0x5D,
+    0x2A, 0xE8, 0x87, 0xF2, 0x1B, 0x28, 0x19, 0x20, 0x63, 0x9E, 0xD8, 0x7E, 0x85, 0xF3, 0x87, 0x0D,
+    0xAF, 0x35, 0xA5, 0x9F, 0x3B, 0xE7, 0x44, 0x8D, 0x63, 0xDE, 0xEB, 0x7E, 0xC7, 0xD2, 0x0F, 0x09,
+    0x30, 0xE3, 0xE2, 0x7B, 0xEA, 0x74, 0xAD, 0x46, 0x7D, 0xB4, 0xB8, 0x0C, 0xF1, 0xD3, 0xFA, 0x07,
+    0xF3, 0xDD, 0xC5, 0xB1, 0x00, 0xF2, 0xD6, 0xBD, 0x4B, 0xBD, 0xAC, 0xC8, 0xBB, 0xA7, 0xD4, 0x53,
+    0xDE, 0x73, 0x0D, 0xED, 0xFB, 0x84, 0x4C, 0x82, 0x47, 0x0D, 0x2D, 0x9D, 0x2B, 0x0C, 0x4A, 0x4D,
+    0x4B, 0xD4, 0x3A, 0x4D, 0x64, 0x27, 0xD8, 0x59, 0x27, 0xD3, 0x41, 0x73, 0xA5, 0xCB, 0xF5, 0x31,
+    0xA2, 0x88, 0x99, 0x79, 0xFB, 0x2B, 0x9A, 0xBA, 0x68, 0x88, 0x35, 0x12, 0x15, 0x11, 0xF6, 0xEA,
+    0x9A, 0x1B, 0x2A, 0xE1, 0x95, 0x5B, 0x15, 0xAB, 0x79, 0xE2, 0x5A, 0x4A, 0x6E, 0xE2, 0xF7, 0x63,
+    0x74, 0x52, 0xB5, 0x9B, 0xA9, 0x58, 0x5D, 0x78, 0xAB, 0x61, 0x40, 0xA5, 0x6F, 0x99, 0x80, 0x06,
+    0xCA, 0x73, 0x82, 0x78, 0x64, 0x8F, 0xE4, 0xA7, 0x2F, 0x9F, 0x6D, 0x50, 0x80, 0x11, 0xF4, 0xE9,
+    0xE3, 0x63, 0x2A, 0x96, 0x0C, 0xFC, 0x3C, 0xE0, 0xAA, 0xF7, 0x05, 0x55, 0x28, 0xB0, 0x76, 0x24,
+    0x87, 0xDA, 0x29, 0x28, 0x05, 0xA9, 0x61, 0x0B, 0x66, 0x3C, 0xA0, 0x51, 0x5E, 0xCE, 0xF5, 0x80,
+    0x0F, 0x1C, 0x90, 0xDD, 0x56, 0x52, 0x07, 0xDF, 0xB4, 0xE6, 0x92, 0x4A, 0x57, 0x97, 0x71, 0xAB,
+    0x58, 0xF3, 0x03, 0x43, 0x99, 0x49, 0x1A, 0xFC, 0x96, 0x29, 0x31, 0x15, 0x30, 0x6D, 0xCA, 0x92,
+    0x39, 0x68, 0xF6, 0xAE, 0xDE, 0x56, 0x74, 0x53, 0xC5, 0xCA, 0xBE, 0x09, 0x0C, 0x88, 0xEE, 0xEC,
+    0xE9, 0xE8, 0xD0, 0x6A, 0x55, 0x6A, 0xB2, 0xDF, 0x41, 0x79, 0xC8, 0x44, 0xD1, 0x2B, 0x6B, 0x5F,
+    0xB4, 0x27, 0x02, 0xFE, 0x9E, 0x70, 0x48, 0xE9, 0xE8, 0x9B, 0x44, 0x5D, 0x19, 0xB7, 0x24, 0x47,
+    0x42, 0x0D, 0x1D, 0xA9, 0x26, 0x07, 0x70, 0xC4, 0x36, 0x6A, 0x03, 0xA2, 0xBD, 0x60, 0x65, 0x9A,
+    0x92, 0x6F, 0x0A, 0x1B, 0xE6, 0x36, 0x7B, 0xA4, 0x55, 0x79, 0xBF, 0x7B, 0x27, 0xBE, 0x6D, 0x67,
+    0x01, 0x6D, 0xB7, 0x49, 0x7C, 0x3F, 0x99, 0x1B, 0x4E, 0xFB, 0x32, 0x3A, 0xE5, 0x76, 0x0B, 0x96,
+    0xC6, 0x55, 0xC5, 0x90, 0x5F, 0x80, 0x19, 0x77, 0xAD, 0xB1, 0x5F, 0x6C, 0x75, 0x41, 0x1E, 0x07,
+    0x58, 0x6F, 0x6D, 0xB5, 0xDA, 0x2E, 0x3E, 0x2B, 0x76, 0xAA, 0x4D, 0xF5, 0x3F, 0x9A, 0x56, 0x31,
+    0x53, 0x74, 0x1F, 0xA6, 0xC3, 0x97, 0xAE, 0x8A, 0x3E, 0x8B, 0x76, 0xE1, 0x2C, 0x77, 0x6C, 0x70,
+    0xEC, 0xBB, 0xD5, 0xA5, 0xA7, 0x30, 0x4B, 0xE8, 0xA6, 0x29, 0xAC, 0xE6, 0x6F, 0x8E, 0xC7, 0xFF,
+    0xBA, 0xD9, 0xCB, 0x62, 0xE8, 0x2E, 0xD7, 0xCF, 0xA3, 0x02, 0xD4, 0x55, 0x88, 0x2D, 0x12, 0x9D,
+    0x6A, 0x19, 0x50, 0xB4, 0x98, 0xFA, 0x29, 0xF5, 0x2E, 0xFF, 0xF2, 0xD4, 0xAD, 0x04, 0x85, 0xF4,
+    0xB6, 0x22, 0x56, 0x03, 0x50, 0x3F, 0x96, 0x5D, 0xDE, 0xCD, 0x0D, 0xB3, 0xC5, 0xFB, 0xDB, 0xAC,
+    0x7F, 0xBD, 0xC1, 0xB6, 0xD0, 0x20, 0xCF, 0x30, 0x5E, 0x62, 0xD6, 0xF9, 0x44, 0x19, 0xF3, 0x96,
+    0x0D, 0x72, 0xF8, 0xFB, 0x71, 0xB1, 0x9D, 0xA7, 0x77, 0x6E, 0xDD, 0xD2, 0x1B, 0xD9, 0x39, 0xAB,
+    0x10, 0x26, 0x18, 0xB8, 0x56, 0x92, 0x6E, 0x9B, 0xC2, 0x3D, 0x9B, 0x94, 0x88, 0x9E, 0x2B, 0x4D,
+    0x79, 0xF6, 0x8D, 0xC6, 0x23, 0x0B, 0x8D, 0xF4, 0xB3, 0x00, 0x8C, 0xD4, 0x4F, 0xE1, 0xA1, 0x2B,
+    0x9F, 0xE7, 0x3D, 0xE9, 0x04, 0x65, 0xD4, 0x21, 0x87, 0x44, 0xDB, 0x00, 0x30, 0x23, 0x7A, 0x94,
+    0xC1, 0xE7, 0x4B, 0xC4, 0xA0, 0xA6, 0x90, 0x20, 0x99, 0xE6, 0x98, 0x48, 0x67, 0xB6, 0x49, 0x90,
+    0x20, 0xB4, 0xA0, 0xA8, 0x90, 0x1E, 0x1B, 0x49, 0x50, 0x41, 0x7B, 0xC5, 0x02, 0xF3, 0xFF, 0xB1,
+    0x6D, 0x39, 0x79, 0x1C, 0x3C, 0x5E, 0xC7, 0x98, 0x1F, 0xD9, 0x52, 0x49, 0x75, 0x59, 0x01, 0x1A,
+    0xC1, 0x82, 0xBD, 0xDB, 0x1A, 0x86, 0xD8, 0x9F, 0x12, 0x93, 0xD2, 0x80, 0x13, 0xDE, 0x79, 0x3D,
+    0xB6, 0xEB, 0xC5, 0x47, 0x75, 0x24, 0xE3, 0x70, 0x8E, 0x20, 0xBE, 0x78, 0x26, 0x15, 0xBD, 0xD4,
+    0x5B, 0x9D, 0x6D, 0x7B, 0x02, 0x80, 0x73, 0x44, 0xA2, 0xC7, 0x22, 0x8D, 0xAD, 0x19, 0xD0, 0x38,
+    0x2B, 0xEA, 0x4F, 0xDE, 0x68, 0x84, 0x3C, 0x77, 0x6B, 0xA2, 0x6C, 0x9A, 0x56, 0x13, 0x75, 0x66,
+    0x8A, 0x91, 0x87, 0xDA, 0xC4, 0x24, 0xE6, 0xC5, 0x14, 0xE7, 0x91, 0x0B, 0x40, 0xBD, 0x7D, 0x8A,
+    0x3A, 0x0D, 0x39, 0xB5, 0x65, 0x1A, 0xF6, 0x0F, 0x79, 0x4D, 0xED, 0x07, 0x8F, 0xE4, 0x48, 0xA3,
+    0x7A, 0xE8, 0x9F, 0x09, 0x5B, 0x9E, 0x30, 0x46, 0xA8, 0x63, 0x89, 0x9E, 0xAF, 0xD1, 0x8F, 0xBE,
+    0x53, 0x20, 0x07, 0xDE, 0x54, 0x8B, 0x8B, 0x98, 0xED, 0x76, 0xD7, 0x3A, 0xE9, 0x40, 0xEC, 0x27,
+    0x64, 0xDC, 0x66, 0xD4, 0x32, 0x22, 0x43, 0x7E, 0xE0, 0x3E, 0xF8, 0x15, 0xAB, 0xDE, 0xAA, 0xC4,
+    0x13, 0x7F, 0x56, 0x4E, 0x57, 0xC8, 0x69, 0x27, 0xD4, 0xC6, 0x6B, 0x72, 0x71, 0xB8, 0xA4, 0x7A,
+    0x2F, 0x82, 0x7D, 0xEE, 0x0C, 0x21, 0xCE, 0xDF, 0xA5, 0x56, 0x01, 0xFC, 0xD2, 0xE7, 0x48, 0x35,
+    0xD6, 0x8C, 0x87, 0xEF, 0xD8, 0xE1, 0xDC, 0xFC, 0x60, 0x1D, 0xD7, 0x81, 0xE5, 0xE2, 0x83, 0x83,
+    0xF7, 0x14, 0xDA, 0xC8, 0x64, 0xA1, 0xDC, 0xBF, 0x6A, 0x0D, 0xB4, 0x5D, 0xCB, 0x1E, 0xDF, 0xA7,
+    0xE7, 0x37, 0xDE, 0xCD, 0x35, 0x27, 0xAF, 0x18, 0xD3, 0xB3, 0xC5, 0xF1, 0x69, 0x57, 0xCD, 0xE4,
+    0x64, 0x07, 0x50, 0x08, 0x80, 0x80, 0x6A, 0x2F, 0xD3, 0x1E, 0xA8, 0xC9, 0xA7, 0x6C, 0xFD, 0xA1,
+    0x91, 0xF3, 0x06, 0x12, 0x97, 0x56, 0x9E, 0x37, 0x6A, 0x3D, 0x30, 0x0E, 0x0D, 0x88, 0x1D, 0x47,
+    0xCC, 0x95, 0x53, 0xAA, 0xF4, 0xDC, 0x11, 0x9C, 0xD5, 0xBA, 0xDA, 0xA6, 0xAC, 0xE3, 0xC6, 0x14,
+    0x54, 0x75, 0xA9, 0x22, 0x31, 0x0E, 0x58, 0x6B, 0xF6, 0x3E, 0x42, 0x54, 0x81, 0xF1, 0x26, 0x60,
+    0x42, 0x7E, 0xD7, 0x15, 0x7C, 0x1A, 0xB3, 0x48, 0x74, 0x7E, 0x2A, 0xBC, 0x32, 0xEA, 0x37, 0x98,
+    0x56, 0x7C, 0x06, 0x44, 0xD3, 0xC6, 0x91, 0x8D, 0x8A, 0xA0, 0xF6, 0x8E, 0x84, 0x11, 0xC1, 0xEB,
+    0x9A, 0x39, 0x1A, 0xF2, 0xA7, 0x78, 0x17, 0x21, 0x3B, 0xBF, 0x32, 0x5B, 0x9C, 0x61, 0x6A, 0xDD,
+    0x96, 0x55, 0x62, 0x38, 0x57, 0x6F, 0xA8, 0x7A, 0xB3, 0x44, 0x85, 0x6C, 0x4B, 0x06, 0xD6, 0x8E,
+    0xAF, 0x6F, 0x30, 0x03, 0xBA, 0x88, 0xE4, 0x2A, 0x61, 0x58, 0x33, 0x34, 0xC9, 0xBF, 0x52, 0xC4,
+    0x11, 0x71, 0xD1, 0x65, 0xEC, 0x07, 0x40, 0x92, 0x4A, 0x39, 0x4A, 0xF1, 0x6A, 0x37, 0x25, 0x82,
+    0x91, 0x4A, 0x68, 0x98, 0xAA, 0x25, 0xDC, 0xD4, 0xCB, 0x51, 0x15, 0x46, 0xE4, 0xF0, 0x06, 0xA1,
+    0x5B, 0x7F, 0xCA, 0xC9, 0xC9, 0xD7, 0x91, 0xF3, 0x9F, 0x0E, 0xC0, 0x69, 0x37, 0x48, 0x81, 0x0C,
+    0xF4, 0x15, 0x51, 0x9E, 0xE3, 0x73, 0xAC, 0xDF, 0x57, 0x49, 0x2A, 0xF6, 0x98, 0x72, 0x5C, 0x43,
+    0x2A, 0x63, 0x40, 0x94, 0xF1, 0xB4, 0x0B, 0xBD, 0x79, 0x67, 0xB8, 0xAB, 0xAE, 0xD4, 0x9C, 0xFA,
+    0x2F, 0x64, 0x0D, 0x33, 0xB7, 0x7F, 0x9E, 0xC4, 0xB7, 0xE6, 0xCB, 0x5E, 0x61, 0x60, 0x29, 0x6D,
+    0xB7, 0xC9, 0xCA, 0x7D, 0xE2, 0x43, 0x1E, 0x95, 0x04, 0xE1, 0xA9, 0x6B, 0xBD, 0x5F, 0xB2, 0xBF,
+    0x07, 0x1C, 0xFF, 0x30, 0x74, 0x9A, 0xBC, 0xC4, 0xD5, 0x5C, 0x00, 0x32, 0x76, 0xA6, 0xDD, 0x25,
+    0x3D, 0x53, 0xD0, 0x38, 0x34, 0x53, 0x7B, 0xD6, 0xBF, 0x0E, 0x84, 0xA0, 0x96, 0xF9, 0x8A, 0x82,
+    0x8D, 0x94, 0x60, 0x57, 0xE2, 0x54, 0xBE, 0x44, 0x96, 0xF7, 0x86, 0xF5, 0x39, 0x0D, 0x05, 0xA7,
+    0xB6, 0x74, 0xA5, 0x41, 0xB3, 0x0A, 0xB0, 0x5D, 0x91, 0xCB, 0x85, 0x79, 0x83, 0x4B, 0xC6, 0x55,
+    0x57, 0x68, 0x8C, 0x91, 0x2F, 0x2A, 0xB8, 0x4A, 0x08, 0x82, 0x1F, 0xEC, 0x9A, 0x68, 0x11, 0x4C,
+    0x22, 0x2C, 0x90, 0x86, 0x7E, 0xA5, 0x71, 0x46, 0xB5, 0xE0, 0x2B, 0x3F, 0x21, 0x8E, 0xCD, 0x41,
+    0xA3, 0x96, 0xA5, 0x9E, 0x88, 0x9D, 0xC0, 0x06, 0x64, 0x4A, 0x4B, 0x3A, 0xD4, 0xA1, 0xE7, 0x16,
+    0xD4, 0x3E, 0x57, 0xD2, 0x0C, 0xDA, 0xE1, 0x34, 0xD8, 0xD6, 0x58, 0xF7, 0x86, 0xBD, 0xF6, 0xC4,
+    0xBC, 0xDA, 0x21, 0x74, 0xCA, 0x8A, 0xA6, 0xAA, 0x30, 0xEF, 0x25, 0x1F, 0x32, 0x7B, 0x49, 0xA6,
+    0xEF, 0x9B, 0x95, 0x51, 0x83, 0x34, 0xB8, 0xB8, 0x3E, 0xCE, 0xF6, 0x85, 0x21, 0x3F, 0xE2, 0x93,
+    0x5E, 0x52, 0xBF, 0x8D, 0xE7, 0xDD, 0xCE, 0xDF, 0x0B, 0x99, 0xB4, 0xB3, 0x89, 0x31, 0x70, 0xAE,
+    0x82, 0x4D, 0xF5, 0xD1, 0x31, 0xF7, 0x04, 0xB2, 0x8A, 0x6A, 0xD8, 0xAD, 0x36, 0x50, 0x7D, 0x5B,
+    0xD5, 0xD1, 0x26, 0x07, 0xB0, 0x40, 0xF0, 0x93, 0x4C, 0x17, 0xCD, 0x3F, 0xC3, 0x65, 0x95, 0x25,
+    0xF4, 0x58, 0x12, 0xEE, 0xAA, 0xE6, 0x86, 0xAB, 0x92, 0x90, 0x18, 0xCD, 0xBD, 0x9A, 0x98, 0xFB,
+    0x64, 0x17, 0x61, 0xF7, 0x04, 0x8B, 0x26, 0xD6, 0x13, 0xA2, 0x0C, 0x7C, 0xB7, 0x98, 0x35, 0xD0,
+    0x47, 0x2C, 0x44, 0xB0, 0xA6, 0x5E, 0x96, 0xAE, 0x60, 0x54, 0x15, 0x1C, 0x1F, 0xEF, 0x95, 0x2A,
+    0x7F, 0xF5, 0x11, 0x8B, 0xD2, 0xFA, 0x9D, 0x2B, 0x80, 0xD7, 0xA3, 0x0E, 0x25, 0xFD, 0x61, 0xA1,
+    0x59, 0xEF, 0xFA, 0xC6, 0x7D, 0x8C, 0xE2, 0x0E, 0xD5, 0x3B, 0x7F, 0x0A, 0x9B, 0x07, 0x66, 0x2A,
+    0x10, 0xF7, 0x58, 0x97, 0x78, 0xB5, 0x9E, 0x8C, 0x17, 0x10, 0x36, 0x8F, 0x7E, 0xB5, 0x62, 0xDD,
+    0xBA, 0x53, 0x62, 0x20, 0x86, 0x69, 0x0B, 0x44, 0xDF, 0x3A, 0xEA, 0x0B, 0xB6, 0xD8, 0xDD, 0x3E,
+    0x0F, 0x0D, 0xD0, 0x37, 0xDC, 0x2D, 0xD7, 0xEF, 0xB6, 0xD7, 0x4E, 0x2B, 0xFE, 0xA1, 0x4B, 0xDC,
+    0xC2, 0x69, 0xEA, 0x04, 0x79, 0x6E, 0xC2, 0xD4, 0xD6, 0xC7, 0x3D, 0x21, 0x7C, 0xBD, 0x12, 0x4C,
+    0x3A, 0x0F, 0xA6, 0xB9, 0xA8, 0x64, 0xF0, 0x13, 0x24, 0x9C, 0xD9, 0xC8, 0x97, 0xBB, 0xAD, 0x31,
+    0x3D, 0x74, 0x6C, 0x6D, 0x62, 0xE7, 0x4E, 0x54, 0xC9, 0xEA, 0x0C, 0x65, 0xA5, 0xF8, 0x4A, 0xC1,
+    0x7C, 0x26, 0x6B, 0x3F, 0x71, 0x06, 0xA8, 0xE6, 0xD5, 0x41, 0xCF, 0xD3, 0xFB, 0x6C, 0x88, 0xBC,
+    0x82, 0xE1, 0x4D, 0x5F, 0x3C, 0x48, 0x61, 0xB4, 0xA1, 0x17, 0x43, 0x18, 0x8E, 0xA3, 0xD2, 0xDE,
+    0xF5, 0x11, 0xE7, 0x6F, 0xBA, 0x9D, 0x00, 0x8E, 0x59, 0x6D, 0xC5, 0x1C, 0x59, 0x38, 0xD5, 0x3D,
+    0x1F, 0xB9, 0x20, 0xDA, 0x91, 0xF3, 0xA6, 0x79, 0x91, 0xD4, 0x6A, 0x96, 0xB6, 0xDE, 0xF6, 0xD9,
+    0xB7, 0x43, 0xD9, 0x14, 0x03, 0x61, 0x69, 0x6B, 0xF1, 0x96, 0x91, 0x5B, 0xA6, 0x47, 0xA5, 0x87,
+    0x07, 0x5C, 0xB7, 0x33, 0xE1, 0x35, 0xFA, 0x71, 0x0B, 0xF0, 0x15, 0x96, 0x1D, 0xA7, 0x01, 0x88,
+    0xEC, 0x94, 0xC5, 0xD1, 0x62, 0x53, 0x0F, 0xD9, 0x37, 0x88, 0x7B, 0x83, 0x9F, 0x59, 0x19, 0xB6,
+    0xC3, 0x6F, 0x98, 0xF7, 0x40, 0x34, 0x10, 0x84, 0xB3, 0x66, 0x72, 0x4E, 0x9B, 0x5B, 0xD5, 0xCE,
+    0x84, 0x47, 0x6C, 0xBB, 0x89, 0xC0, 0xD7, 0x07, 0x11, 0x20, 0xD8, 0x2E, 0x27, 0x52, 0x3C, 0x33,
+    0x9E, 0xC9, 0x9F, 0x9F, 0x4A, 0x5F, 0x73, 0xC9, 0xBE, 0xC9, 0x63, 0xD9, 0xF1, 0xDA, 0xE6, 0x3B,
+    0x09, 0xC0, 0xAA, 0x55, 0xD1, 0xA6, 0x31, 0xF6, 0xB4, 0x3D, 0xED, 0x79, 0x56, 0xE8, 0xB9, 0x04,
+    0xC6, 0x5D, 0x10, 0x81, 0x86, 0xB8, 0xD4, 0x32, 0xF8, 0x7B, 0xC4, 0x9C, 0x89, 0x68, 0x26, 0x8C,
+    0xA1, 0xC2, 0x40, 0x34, 0x4B, 0xAD, 0x06, 0xC9, 0x31, 0xD1, 0xDD, 0xE6, 0xB8, 0x77, 0x82, 0xA4,
+    0xFE, 0x8F, 0x74, 0x69, 0x8E, 0xFF, 0x33, 0xB8, 0xAE, 0x29, 0x99, 0x92, 0x37, 0x8B, 0x82, 0x73,
+    0x51, 0xE3, 0x0D, 0x5A, 0x88, 0xBE, 0x20, 0x12, 0x7E, 0x04, 0x1A, 0xDA, 0x76, 0x79, 0x34, 0x15,
+    0xA3, 0x52, 0x5D, 0x77, 0x90, 0x41, 0xFD, 0x32, 0xA5, 0x43, 0x27, 0x03, 0xEC, 0xD6, 0x05, 0x49,
+    0x6E, 0x0F, 0x21, 0xD2, 0xBD, 0x5E, 0x2C, 0x46, 0x8C, 0x07, 0xAB, 0x64, 0xA3, 0x00, 0x52, 0x6F,
+    0x65, 0x87, 0x91, 0x2A, 0x88, 0x3F, 0x93, 0x5C, 0xC6, 0x2F, 0xD2, 0xF6, 0x7E, 0x6D, 0x48, 0xC8,
+    0x7E, 0x29, 0x37, 0x3E, 0xA5, 0xA6, 0x04, 0x3B, 0x55, 0x65, 0xB5, 0x9B, 0x49, 0x72, 0x9C, 0xB7,
+    0xE6, 0xC4, 0x6D, 0x6A, 0xBD, 0x71, 0x60, 0x6B, 0xBD, 0x60, 0x2E, 0x43, 0xFE, 0x84, 0x88, 0xD8,
+    0x8C, 0x81, 0xD1, 0xB0, 0x8F, 0xAA, 0xA0, 0x91, 0x9B, 0x1E, 0xE2, 0xA7, 0x1D, 0x56, 0x89, 0x72,
+    0xE7, 0xD3, 0xE1, 0x58, 0x4E, 0x07, 0x30, 0x75, 0xDE, 0xCD, 0x00, 0xD2, 0xF6, 0xFB, 0x2D, 0x5D,
+    0xAA, 0x29, 0xF7, 0xEB, 0x84, 0x16, 0x28, 0x17, 0xEB, 0xC9, 0x6D, 0x18, 0xE9, 0x22, 0xF2, 0xED,
+    0x11, 0xBC, 0xDC, 0x33, 0x91, 0x01, 0xC9, 0x6F, 0x96, 0xD1, 0x89, 0xEB, 0xEF, 0x47, 0x55, 0x93,
+    0xF1, 0x94, 0x2D, 0xDE, 0x40, 0x2B, 0x9E, 0xDB, 0x02, 0x9E, 0xB8, 0xA9, 0x7E, 0x9D, 0xB6, 0xBF,
+    0x96, 0x87, 0x3F, 0x07, 0x8D, 0x43, 0x58, 0x70, 0x92, 0xB8, 0x41, 0x7A, 0x05, 0x3F, 0x1F, 0xA7,
+    0x0B, 0x5B, 0x29, 0xB1, 0x6C, 0x76, 0xB3, 0x44, 0x6C, 0x6F, 0x82, 0x74, 0x10, 0xAB, 0xF0, 0x29,
+    0x20, 0x6D, 0x00, 0x1E, 0x42, 0x89, 0x8B, 0x79, 0x4B, 0x6A, 0xF0, 0x9D, 0x5E, 0x1C, 0x05, 0x7B,
+    0x2B, 0x57, 0xB3, 0x45, 0xBF, 0x5A, 0x72, 0x46, 0x01, 0xFB, 0xF6, 0x03, 0x14, 0xBB, 0x1A, 0x1C,
+    0x62, 0xCA, 0x9B, 0x40, 0xB9, 0xAE, 0x48, 0x4A, 0xC9, 0x0E, 0x0A, 0x26, 0x85, 0x2C, 0x01, 0x92,
+    0x3F, 0xE1, 0x22, 0x3B, 0xBC, 0x25, 0xF6, 0x08, 0xB7, 0x7E, 0x94, 0x45, 0x18, 0x9B, 0x48, 0xEE,
+    0x5E, 0xD0, 0xC6, 0x74, 0x34, 0xAF, 0x6E, 0x66, 0xBC, 0x0C, 0xAA, 0x6D, 0xD6, 0x1A, 0xC1, 0x0F,
+    0xAC, 0xF6, 0x97, 0x20, 0xCF, 0xF3, 0x9A, 0x78, 0xCA, 0x1B, 0x9F, 0x25, 0x52, 0x3D, 0xA9, 0x35,
+    0x0D, 0xEA, 0x12, 0xCF, 0x0C, 0x32, 0x53, 0x5A, 0x55, 0x4B, 0x99, 0x05, 0x80, 0x56, 0xB6, 0xE2,
+    0x59, 0xC8, 0x37, 0x0F, 0x4C, 0x79, 0xEF, 0xE5, 0xE0, 0x41, 0x0A, 0x4C, 0x1E, 0x5F, 0x85, 0x90,
+    0xC7, 0x66, 0x28, 0xAB, 0xD7, 0xF1, 0x91, 0x60, 0xE7, 0x77, 0x28, 0x01, 0x7C, 0xA8, 0x2A, 0x23,
+    0x84, 0x76, 0x91, 0xAA, 0x65, 0xA4, 0xFF, 0xEC, 0xA2, 0x02, 0x36, 0x9A, 0x43, 0x18, 0xAA, 0x0F,
+    0x81, 0x26, 0x8F, 0x8B, 0x9C, 0x46, 0x2C, 0x53, 0x63, 0x01, 0x5C, 0x44, 0x4B, 0xBC, 0x28, 0xEA,
+    0x2F, 0x4E, 0x57, 0x72, 0x35, 0xA3, 0x85, 0x4F, 0x27, 0x22, 0xB5, 0x92, 0x5F, 0x5B, 0xD0, 0x78,
+    0x49, 0xAF, 0x42, 0x1F, 0x0B, 0x19, 0x9E, 0x17, 0xB0, 0xA6, 0xFB, 0x2F, 0xD7, 0x82, 0x60, 0x11,
+    0xB6, 0x63, 0x4C, 0x65, 0x44, 0xD1, 0xB4, 0x9A, 0xDA, 0x7A, 0xF8, 0x6E, 0xA5, 0xAE, 0x55, 0x32,
+    0x46, 0xDD, 0xE5, 0xB8, 0xC3, 0xC6, 0xDC, 0xC4, 0x49, 0x2C, 0x35, 0x2A, 0x2F, 0xFE, 0x85, 0xEE,
+    0xD0, 0xD7, 0x5E, 0xF1, 0xD9, 0xE9, 0x23, 0xCB, 0x96, 0xAE, 0x30, 0x22, 0x54, 0x80, 0x93, 0x9A,
+    0xD5, 0x7C, 0x0A, 0xF9, 0x47, 0x1F, 0x02, 0x80, 0x21, 0xFF, 0x53, 0x39, 0xC6, 0xB7, 0x73, 0xDE,
+    0x4B, 0x03, 0xC8, 0xB7, 0xBF, 0x34, 0x0F, 0xCB, 0x37, 0xD1, 0x5F, 0x53, 0x5F, 0x05, 0x62, 0x2D,
+    0x62, 0xC4, 0xB6, 0xED, 0x82, 0xC3, 0x19, 0x09, 0xFD, 0xC8, 0x93, 0xAB, 0x63, 0xB2, 0xA5, 0x6B,
+    0x97, 0x82, 0x37, 0x29, 0xBF, 0x97, 0x54, 0xFE, 0x9B, 0x32, 0xFD, 0x51, 0xE9, 0x14, 0xE1, 0x74,
+    0x07, 0x2B, 0xFA, 0x39, 0x1C, 0x6A, 0x5B, 0xA3, 0x5B, 0x7E, 0xB6, 0xD9, 0x66, 0x82, 0x0D, 0xF9,
+    0xD7, 0x9C, 0x64, 0xE8, 0x2A, 0x73, 0x98, 0x95, 0x31, 0xCF, 0xAE, 0xBE, 0x6D, 0x57, 0x69, 0x34,
+    0x4E, 0x58, 0x0A, 0xD1, 0x5A, 0x94, 0x8F, 0xFE, 0xF5, 0xD6, 0x4E, 0x73, 0xC0, 0x96, 0x4E, 0xFD,
+    0x21, 0x25, 0xC4, 0xB6, 0x11, 0xFA, 0xA7, 0x41, 0x7E, 0xB2, 0xFC, 0x42, 0x14, 0x16, 0x90, 0xC9,
+    0x74, 0x5D, 0x4A, 0x25, 0x73, 0xE1, 0x63, 0x7E, 0x81, 0xF9, 0x3F, 0x8E, 0x24, 0x4C, 0x61, 0x02,
+    0xD5, 0xF8, 0xB2, 0x2E, 0xF3, 0x80, 0x79, 0xBF, 0x13, 0xA0, 0x38, 0xC7, 0x0E, 0x4E, 0x2C, 0x22,
+    0x46, 0x0E, 0x29, 0xEE, 0x2A, 0x8C, 0xDD, 0x86, 0x33, 0xB7, 0xF0, 0xCC, 0x0F, 0x13, 0x7E, 0x03,
+    0x07, 0xB3, 0x3E, 0x97, 0xC5, 0x6F, 0xDC, 0xFF, 0x96, 0x23, 0xCB, 0x69, 0x8B, 0x86, 0x94, 0x6D,
+    0x86, 0xEF, 0x2F, 0x5C, 0x31, 0x7F, 0xF7, 0x22, 0x96, 0x61, 0x88, 0x75, 0x3C, 0x76, 0x97, 0x12,
+    0x1A, 0xEF, 0x70, 0x7D, 0x6A, 0x17, 0xF5, 0xB1, 0xB5, 0x68, 0x50, 0x91, 0xDD, 0x88, 0x0F, 0xCB,
+    0x33, 0x73, 0xB9, 0xBF, 0xC6, 0x65, 0xAE, 0x15, 0x6B, 0x20, 0xCF, 0x8A, 0xDF, 0xDF, 0x5D, 0xAD,
+    0xE8, 0x45, 0x69, 0x7D, 0x1C, 0x1B, 0xF2, 0xAC, 0xCD, 0x9D, 0x9F, 0xB8, 0x6D, 0x57, 0x16, 0x92,
+    0xCC, 0x1A, 0xF2, 0xC2, 0x62, 0xEE, 0xE2, 0x71, 0x2D, 0x58, 0xAB, 0xB7, 0x60, 0x4D, 0xDB, 0xEF,
+    0x88, 0xC2, 0x2B, 0x39, 0x8B, 0x4C, 0x0F, 0xEF, 0xEB, 0x86, 0x16, 0x34, 0x49, 0x9E, 0x1E, 0x24,
+    0xFC, 0xE9, 0x77, 0x2A, 0xD2, 0x75, 0x76, 0x96, 0x24, 0xD3, 0x33, 0x4D, 0x8B, 0xDD, 0x92, 0xBE,
+    0xBF, 0xE5, 0xB0, 0x12, 0x92, 0x0C, 0x89, 0xD8, 0x73, 0xE2, 0xA6, 0xD7, 0xF3, 0x15, 0x59, 0x76,
+    0x9F, 0x3B, 0x10, 0xC1, 0xA4, 0x9B, 0x64, 0xC8, 0x4B, 0xD4, 0xEE, 0x63, 0xA7, 0xF7, 0xE9, 0xB4,
+    0x43, 0x50, 0xC4, 0x7B, 0xE1, 0x7A, 0x53, 0x6D, 0xC8, 0x17, 0x82, 0x31, 0xE4, 0x53, 0xF3, 0x20,
+    0xF0, 0xE9, 0x78, 0xAF, 0x8F, 0x95, 0x96, 0xA8, 0xE9, 0x0E, 0xFE, 0x10, 0x51, 0x8E, 0xF1, 0x64,
+    0x89, 0x2B, 0x0B, 0xE1, 0xCE, 0xA1, 0xA9, 0xCA, 0xF0, 0xD4, 0xD3, 0xAA, 0x49, 0xE3, 0x68, 0x76,
+    0xDE, 0x20, 0x77, 0xCB, 0x92, 0x60, 0x36, 0x66, 0x82, 0x06, 0x6D, 0xDF, 0x11, 0xF7, 0xA3, 0x07,
+    0x43, 0x18, 0x48, 0x89, 0x40, 0x19, 0x72, 0xAD, 0xF5, 0x06, 0x0B, 0x61, 0x87, 0xD9, 0x48, 0x17,
+    0x8A, 0x0D, 0xC8, 0x6C, 0xD9, 0xC9, 0x9D, 0xEE, 0x08, 0x16, 0x1F, 0x0D, 0x88, 0xB5, 0xEF, 0x5B,
+    0x2F, 0x40, 0xAE, 0x71, 0x0F, 0x02, 0x96, 0xAF, 0x2C, 0xC8, 0x8E, 0x86, 0x64, 0x58, 0xF1, 0x7C,
+    0xE9, 0x86, 0xDB, 0xCF, 0x57, 0x5E, 0xF9, 0x57, 0x7E, 0x85, 0xAE, 0x8B, 0x6A, 0x1E, 0x9B, 0x2B,
+    0x0D, 0xE2, 0x07, 0xDE, 0x42, 0x76, 0x79, 0x72, 0x25, 0xBB, 0xD6, 0xDA, 0xD8, 0x8D, 0xE4, 0x34,
+    0xF6, 0xC6, 0xBB, 0x00, 0x62, 0x22, 0x4D, 0x0F, 0x90, 0xD1, 0x35, 0x20, 0x6B, 0x3C, 0x43, 0xB2,
+    0xBF, 0xED, 0xCA, 0x5D, 0xC2, 0x0F, 0x5A, 0x94, 0x87, 0xE3, 0x61, 0x94, 0x85, 0xE4, 0x24, 0x63,
+    0xEF, 0x8C, 0xD9, 0x7B, 0xEE, 0x24, 0x5C, 0x51, 0x4A, 0xF1, 0x6B, 0xEB, 0xD6, 0x5A, 0x0F, 0xCE,
+    0x3B, 0x29, 0xAE, 0x86, 0xAA, 0xFF, 0xEC, 0x66, 0x54, 0x45, 0xA4, 0x86, 0xD1, 0x3F, 0x2C, 0xEF,
+    0xF1, 0x71, 0x33, 0x4E, 0xB8, 0x16, 0x1A, 0xB2, 0x18, 0x6E, 0xCD, 0xBA, 0x59, 0xDB, 0x52, 0xE8,
+    0x49, 0x78, 0x75, 0x5C, 0x9F, 0x97, 0xB7, 0x00, 0x57, 0x11, 0xB1, 0x9D, 0x99, 0x0C, 0xA2, 0x54,
+    0xDD, 0x0A, 0x03, 0xF5, 0xAA, 0x0D, 0xBF, 0x47, 0x2D, 0xC0, 0x41, 0x3A, 0x29, 0x0A, 0xA5, 0x8C,
+    0x77, 0x38, 0xA5, 0x4F, 0xE9, 0x9C, 0x7E, 0x23, 0x7E, 0xEF, 0x8F, 0xB3, 0x45, 0x96, 0xA5, 0xDC,
+    0xAC, 0x1A, 0x44, 0xEE, 0xE4, 0x1C, 0x17, 0x01, 0x7E, 0x26, 0x9D, 0xA0, 0x90, 0xD8, 0x4F, 0x5A,
+    0x14, 0x99, 0x46, 0x51, 0x1F, 0x29, 0xFA, 0xE2, 0xB6, 0xEB, 0x71, 0x1A, 0xF4, 0xE2, 0x59, 0x32,
+    0x18, 0x66, 0x31, 0x73, 0x58, 0x23, 0xF3, 0xDC, 0xCB, 0x73, 0xBF, 0x04, 0xB5, 0xBD, 0xAD, 0x4D,
+    0x67, 0x96, 0x84, 0xFA, 0x60, 0x48, 0x97, 0x32, 0xED, 0x55, 0xB1, 0x90, 0xD3, 0x15, 0xFA, 0xD9,
+    0xE4, 0x9E, 0x65, 0x72, 0x8D, 0xC5, 0x16, 0x99, 0xC9, 0xE7, 0xF7, 0x29, 0xAD, 0xF7, 0xDB, 0x4C,
+    0x0A, 0xD0, 0x40, 0xBE, 0x26, 0xF4, 0xC3, 0x89, 0x70, 0xE1, 0x82, 0xF1, 0x95, 0xB3, 0xB8, 0x64,
+    0xE4, 0xBA, 0x2E, 0x4C, 0x4A, 0x93, 0x41, 0x21, 0xF1, 0xBD, 0x2C, 0x8E, 0x15, 0xFC, 0xC2, 0x33,
+    0x9E, 0x76, 0xAD, 0xCE, 0x93, 0xED, 0x4D, 0x04, 0x27, 0x71, 0xDB, 0x21, 0x0A, 0xDE, 0x48, 0xAD,
+    0x43, 0x6F, 0xF7, 0x97, 0x7B, 0xBC, 0xCD, 0x5A, 0xDE, 0x60, 0x07, 0x07, 0x2A, 0x83, 0xF4, 0x25,
+    0x6A, 0xD1, 0xBF, 0xB2, 0x3B, 0xF7, 0x4E, 0x46, 0xB0, 0x34, 0xC2, 0x93, 0x45, 0xB9, 0xE6, 0x32,
+    0x8E, 0x75, 0x67, 0x12, 0x06, 0x46, 0x7B, 0xB1, 0xD6, 0xEC, 0x91, 0x73, 0x87, 0x99, 0x3E, 0x9E,
+    0xBB, 0xAC, 0x0C, 0x94, 0xCC, 0xBD, 0x33, 0xCF, 0x27, 0x65, 0x70, 0x18, 0x49, 0x27, 0xD9, 0xAF,
+    0x17, 0x43, 0x16, 0x99, 0xD3, 0x0A, 0xB9, 0xE9, 0xD6, 0x4A, 0xDE, 0x9C, 0x9C, 0x3F, 0xE8, 0x25,
+    0xB8, 0xB9, 0xAE, 0xB6, 0x5B, 0xD5, 0x9E, 0x5E, 0x41, 0x41, 0xDE, 0xC8, 0x8E, 0xE3, 0xEC, 0x88,
+    0xE8, 0xD6, 0x09, 0x16, 0xAB, 0x5C, 0x93, 0xC5, 0xAC, 0xA8, 0x70, 0x14, 0x8B, 0x9D, 0x87, 0x27,
+    0xC9, 0x07, 0x83, 0x94, 0xD3, 0xBD, 0x38, 0xF8, 0x92, 0xB9, 0xB0, 0xFB, 0xC2, 0xCF, 0x69, 0x0A,
+    0x6E, 0x39, 0xB4, 0x11, 0xD7, 0x54, 0xCF, 0x2C, 0x87, 0x94, 0x7E, 0xD8, 0x6D, 0xED, 0x54, 0xDF,
+    0xBA, 0xF6, 0x57, 0x2E, 0xE6, 0x5B, 0x26, 0x3E, 0xD2, 0xA3, 0xE6, 0xB3, 0x9B, 0x75, 0xD5, 0xBD,
+    0x76, 0x9E, 0xE5, 0x82, 0xA8, 0x4A, 0x2B, 0xC5, 0x45, 0x80, 0xC5, 0x55, 0x0A, 0x72, 0x78, 0x58,
+    0x3E, 0x88, 0x9D, 0x7D, 0x7C, 0x23, 0xE8, 0xCD, 0x1C, 0xAF, 0x7C, 0x43, 0xB1, 0xE0, 0x19, 0x96,
+    0x5C, 0xBC, 0xF7, 0x2A, 0x60, 0xF2, 0x50, 0x54, 0xCC, 0xE7, 0xF4, 0xD7, 0x2D, 0xDF, 0x03, 0xBB,
+    0x77, 0xCE, 0x9C, 0xB3, 0x9F, 0xC0, 0xBC, 0xC3, 0xBB, 0x47, 0xC6, 0xAE, 0x1A, 0x0A, 0x57, 0x52,
+    0xA5, 0x75, 0xB5, 0x32, 0x62, 0x9A, 0x11, 0xD6, 0x45, 0x03, 0xFC, 0xAA, 0x43, 0x55, 0x4D, 0xDC,
+    0xE8, 0x0F, 0xBC, 0x46, 0x5B, 0x57, 0x37, 0x9F, 0xD4, 0x5E, 0xFC, 0xD4, 0x7A, 0x1B, 0x67, 0xB7,
+    0x2A, 0xBE, 0x6A, 0x58, 0xF6, 0x21, 0x20, 0x29, 0x90, 0xC9, 0xB1, 0x25, 0x05, 0xF2, 0x95, 0x5F,
+    0xA2, 0x3E, 0x39, 0xFC, 0xF0, 0x08, 0x61, 0xE5, 0xB2, 0x9A, 0xFB, 0xE0, 0x9D, 0x40, 0x5D, 0xE4,
+    0x2D, 0x62, 0x37, 0x8E, 0x02, 0x5A, 0xA1, 0xD5, 0x63, 0x9A, 0xE2, 0x77, 0x46, 0xC6, 0xD1, 0x10,
+    0xAA, 0x46, 0x1D, 0x22, 0x46, 0x2F, 0xE9, 0x95, 0xF4, 0xD5, 0x69, 0xE6, 0x70, 0xDC, 0x09, 0x4E,
+    0x0D, 0xA6, 0xD6, 0x16, 0x97, 0xD1, 0x4C, 0xD3, 0xD7, 0x0B, 0x4C, 0x97, 0x66, 0xC0, 0x3F, 0x91,
+    0xB0, 0x9E, 0x2F, 0x00, 0xF1, 0x10, 0x78, 0x50, 0x9F, 0xC6, 0x38, 0xC5, 0x46, 0xB0, 0x45, 0x53,
+    0x4F, 0x01, 0x7C, 0x46, 0xB2, 0x85, 0xBE, 0x89, 0xB3, 0x99, 0x33, 0xCB, 0x84, 0x07, 0x45, 0x40,
+    0x16, 0x0E, 0x2F, 0xE7, 0x5D, 0x0E, 0xFE, 0xF7, 0x68, 0xF3, 0x70, 0xED, 0x8C, 0x82, 0x2F, 0x48,
+    0x65, 0xD2, 0xCD, 0x3E, 0x65, 0xC3, 0xCD, 0x7A, 0x3D, 0xAD, 0xA0, 0xB4, 0x29, 0x57, 0x26, 0xF1,
+    0xFF, 0xA1, 0x92, 0x9F, 0x64, 0xAF, 0x1D, 0xB4, 0xF1, 0xDD, 0x4F, 0xC8, 0x1C, 0x1A, 0x8A, 0x26,
+    0x3D, 0xBC, 0xC8, 0x57, 0x92, 0xDB, 0xAA, 0x5D, 0x5B, 0x7F, 0x77, 0xC5, 0x47, 0x02, 0x34, 0x25,
+    0x60, 0xC5, 0x7B, 0x8C, 0x84, 0x30, 0x9D, 0xF2, 0x8A, 0x14, 0x6D, 0x55, 0x14, 0xA4, 0xA2, 0x56,
+    0xFC, 0x26, 0x9F, 0x1B, 0x66, 0xCC, 0x5F, 0x69, 0xF5, 0x9B, 0x43, 0xA0, 0xFC, 0x84, 0x00, 0x1F,
+    0x85, 0x6A, 0x9C, 0x23, 0x99, 0x6F, 0xF1, 0xFC, 0x8E, 0x07, 0xC4, 0x62, 0x73, 0xEA, 0xFD, 0x7F,
+    0x92, 0x28, 0xE1, 0xC1, 0x51, 0x5B, 0xDC, 0x2D, 0xB1, 0x88, 0xE5, 0x8C, 0x69, 0x18, 0xF3, 0xD7,
+    0xFF, 0x76, 0x35, 0x83, 0x0A, 0x54, 0x59, 0x22, 0x31, 0x83, 0x26, 0xB8, 0x5F, 0x26, 0xA7, 0x73,
+    0x50, 0xB1, 0xB7, 0x53, 0x82, 0x2C, 0x15, 0x65, 0xDF, 0xF9, 0x5E, 0x2A, 0x9A, 0x7E, 0x19, 0xEE,
+    0xBE, 0xDE, 0xA8, 0xB2, 0x82, 0x58, 0x06, 0xE1, 0xD1, 0xAB, 0xE6, 0x15, 0x7A, 0x31, 0x1B, 0x4B,
+    0xF6, 0xEE, 0x49, 0x25, 0xB3, 0x68, 0xFE, 0x25, 0x6C, 0x46, 0x9B, 0x88, 0xFA, 0x4C, 0xFC, 0x90,
+    0xA5, 0x6B, 0x40, 0x07, 0xDB, 0xA5, 0xE5, 0x97, 0x20, 0xD5, 0xE3, 0x0A, 0xC9, 0xB8, 0x55, 0xDD,
+    0x9B, 0xBA, 0x11, 0x06, 0x4C, 0x3D, 0x34, 0x09, 0xD1, 0xAA, 0x87, 0x5B, 0x95, 0xDD, 0xF9, 0x5D,
+    0x7E, 0x53, 0xE3, 0x31, 0x46, 0xAB, 0x33, 0x12, 0x0B, 0xB8, 0xEB, 0x4C, 0x2F, 0x95, 0x0D, 0x39,
+    0xD5, 0xB4, 0xED, 0x96, 0xCE, 0xC0, 0x5A, 0xA3, 0x16, 0xB8, 0x9A, 0x68, 0xDC, 0xE9, 0x3B, 0xC6,
+    0x36, 0x75, 0x8C, 0x8E, 0x25, 0x97, 0xF7, 0x81, 0xC2, 0xAC, 0x3F, 0x5E, 0x6B, 0x4C, 0x7E, 0x95,
+    0xAE, 0xD1, 0x50, 0x91, 0x15, 0x67, 0x8E, 0xC8, 0xF2, 0x81, 0x8A, 0x6B, 0xBF, 0x4B, 0xC6, 0xAF,
+    0xCD, 0x04, 0xCC, 0x16, 0xA2, 0x43, 0x7A, 0x78, 0x56, 0xC1, 0x7E, 0xC8, 0xBE, 0x91, 0x9D, 0x7B,
+    0x9C, 0xAC, 0x7E, 0x18, 0xFA, 0xEB, 0xAD, 0x1F, 0x28, 0xE0, 0x61, 0x81, 0xC3, 0xD3, 0x24, 0x78,
+    0x08, 0xE6, 0xD5, 0x91, 0x83, 0x36, 0xA4, 0x1A, 0xB8, 0xCF, 0x93, 0x4F, 0x26, 0x6C, 0xC1, 0x7F,
+    0x48, 0x93, 0xD2, 0xD6, 0xC2, 0x33, 0x5C, 0x9D, 0x3F, 0x84, 0x7C, 0xD7, 0x8B, 0xBC, 0x9A, 0xDC,
+    0x46, 0x84, 0xCC, 0x72, 0xF7, 0x7C, 0xEE, 0xA8, 0x37, 0x54, 0x77, 0xD8, 0x21, 0x44, 0xA3, 0x3A,
+    0xBD, 0xCF, 0x65, 0xF3, 0xDB, 0xD0, 0x6F, 0xCA, 0x19, 0xCD, 0xAC, 0xBD, 0x66, 0x92, 0x89, 0xDF,
+    0x2B, 0xFE, 0x8D, 0x28, 0xBA, 0x79, 0x5B, 0xBF, 0x66, 0x67, 0x05, 0xE9, 0xA6, 0xFD, 0x56, 0xD6,
+    0x63, 0x8A, 0x23, 0x01, 0x24, 0x5A, 0x6D, 0x43, 0xCD, 0x26, 0x13, 0x2E, 0x48, 0x46, 0x01, 0x20,
+    0x52, 0x5A, 0xD8, 0x34, 0x75, 0xF5, 0x4E, 0x63, 0x56, 0x17, 0x35, 0x10, 0x29, 0x4B, 0xDD, 0x0B,
+    0xA5, 0xAF, 0x95, 0x92, 0xEE, 0x11, 0x99, 0xD2, 0xEA, 0x30, 0x80, 0x16, 0xB3, 0xF8, 0x96, 0x24,
+    0xED, 0x98, 0x5F, 0x4F, 0x02, 0xBB, 0x69, 0xDD, 0x30, 0x1C, 0xBE, 0x3F, 0x1B, 0x33, 0x2A, 0xA7,
+    0x83, 0xD7, 0x0E, 0x3D, 0x49, 0x58, 0xEF, 0x61, 0x0D, 0x1C, 0x6B, 0x1B, 0x41, 0xB7, 0xB3, 0x64,
+    0xF9, 0xE1, 0x1F, 0xF2, 0x4B, 0xC8, 0xED, 0xC7, 0xEE, 0x3A, 0xCB, 0xCD, 0x18, 0x40, 0x28, 0x2F,
+    0x1C, 0x41, 0x02, 0x31, 0x7A, 0xC3, 0x71, 0x75, 0x21, 0x49, 0x65, 0x6D, 0x32, 0xAC, 0x06, 0x42,
+    0x11, 0x96, 0xB2, 0xEC, 0xD9, 0x5D, 0xD3, 0xB4, 0xB1, 0x21, 0xFF, 0x98, 0x9F, 0xD6, 0x77, 0x70,
+    0x6B, 0xA4, 0x6E, 0x45, 0x69, 0x8C, 0xDB, 0x77, 0x92, 0x80, 0xF3, 0x82, 0x95, 0x2E, 0x73, 0xA6,
+    0x7E, 0xAA, 0x6F, 0xE2, 0x78, 0x82, 0x9E, 0x78, 0x3C, 0xB7, 0x5A, 0x90, 0xA0, 0xE8, 0xB4, 0x5D,
+    0x7A, 0xA8, 0xCE, 0xAC, 0xBA, 0x00, 0xEA, 0x0F, 0xDF, 0x6B, 0x75, 0x4C, 0x0D, 0x1C, 0x30, 0x7F,
+    0x6E, 0xFA, 0x03, 0xDC, 0x6B, 0x48, 0xE0, 0x74, 0xD9, 0xB9, 0x67, 0x9D, 0x0B, 0x55, 0xD3, 0xFE,
+    0x68, 0x79, 0xF7, 0x10, 0x7F, 0x9E, 0xE1, 0xB9, 0x60, 0xE7, 0x54, 0x13, 0x67, 0x2C, 0x04, 0x48,
+    0xDF, 0xD9, 0x85, 0x2C, 0xFF, 0x1E, 0x01, 0x61, 0x0F, 0x74, 0x2C, 0x21, 0x69, 0x3F, 0xE6, 0x7A,
+    0xF3, 0xD7, 0xE6, 0xD3, 0xBF, 0x77, 0x83, 0xC8, 0xF5, 0x5D, 0xF4, 0x4D, 0xC6, 0x0B, 0xEC, 0x46,
+    0x39, 0xDA, 0xBD, 0x39, 0x51, 0xB9, 0xF2, 0xC3, 0x48, 0x41, 0xDA, 0x1E, 0x2F, 0xD8, 0xFB, 0x7F,
+    0x9E, 0x9C, 0x10, 0xF1, 0xB2, 0x2A, 0x14, 0xD1, 0x3C, 0x38, 0x0F, 0x21, 0x9D, 0xAF, 0x64, 0x95,
+    0x46, 0x6A, 0xD2, 0x28, 0x14, 0x16, 0xF0, 0x28, 0x43, 0xC9, 0x81, 0x1D, 0x1E, 0xB7, 0x0D, 0x84,
+    0x8B, 0x30, 0xFD, 0xE3, 0xBB, 0x46, 0x5E, 0xFD, 0xEA, 0x0A, 0x9E, 0x02, 0x3F, 0x5E, 0xE5, 0x00,
+    0x97, 0xFB, 0x0D, 0xEA, 0xF8, 0x66, 0x7F, 0xB3, 0x6D, 0x2E, 0xFD, 0xC8, 0x15, 0x97, 0xE0, 0xDB,
+    0x44, 0x59, 0xBC, 0x32, 0xB7, 0x70, 0x61, 0x88, 0xC9, 0x81, 0x21, 0xA4, 0x82, 0x8D, 0x27, 0x67,
+    0x33, 0x31, 0xE5, 0x6B, 0x94, 0x26, 0xB9, 0xC3, 0xB8, 0x45, 0x69, 0x5D, 0x0B, 0xD2, 0xB1, 0x3A,
+    0x03, 0x40, 0x8B, 0x06, 0x79, 0x76, 0x63, 0x24, 0x61, 0xB9, 0x26, 0x64, 0x14, 0xC3, 0x9C, 0x9A,
+    0xFA, 0xD9, 0xBF, 0x7B, 0x6A, 0xB3, 0x2B, 0x9C, 0x9A, 0x8D, 0x9A, 0x11, 0x9B, 0xF7, 0x9D, 0xD2,
+    0xF8, 0xE4, 0x74, 0x6D, 0x5E, 0x12, 0xD9, 0xC2, 0xE3, 0x7D, 0xDE, 0xDA, 0x57, 0xD6, 0xEF, 0x9A,
+    0xB1, 0x13, 0xF0, 0xC5, 0x99, 0x5B, 0x88, 0xE2, 0x9B, 0xDF, 0x3B, 0x62, 0x9F, 0x3C, 0x10, 0x38,
+    0x91, 0xFA, 0x97, 0x82, 0x44, 0x36, 0x65, 0x8C, 0xA2, 0x47, 0x9B, 0x10, 0x12, 0x96, 0xA1, 0x4E,
+    0x0E, 0x57, 0x42, 0x62, 0xF4, 0xE6, 0xAF, 0x23, 0xC0, 0xB4, 0xA0, 0x49, 0x5A, 0x33, 0xA9, 0x4D,
+    0xB1, 0xB0, 0x5B, 0x0C, 0x6A, 0x67, 0x47, 0xFB, 0x03, 0x7C, 0x1F, 0x15, 0xA1, 0x72, 0x99, 0xBE,
+    0x84, 0x58, 0x68, 0x36, 0x13, 0x34, 0x0C, 0x20, 0x11, 0xDB, 0x68, 0x30, 0x9F, 0xEA, 0x05, 0x99,
+    0xDC, 0x30, 0xF3, 0xA7, 0xA9, 0x3C, 0x7D, 0xA8, 0x3C, 0x0D, 0x43, 0xCB, 0xCC, 0xA5, 0x40, 0xCF,
+    0x0F, 0xF4, 0x34, 0x91, 0x79, 0x36, 0xB8, 0x4D, 0x25, 0x3E, 0xF7, 0x69, 0xC7, 0x31, 0x9D, 0x45,
+    0xEC, 0x3C, 0x3D, 0x99, 0x13, 0x54, 0x19, 0x3D, 0xDD, 0x2B, 0xE9, 0x6B, 0xE0, 0xCE, 0xB7, 0xBF,
+    0x8F, 0x47, 0x0F, 0x1A, 0x43, 0x14, 0x4C, 0xAB, 0xD4, 0xEE, 0xAC, 0x55, 0x0C, 0x4D, 0x7E, 0xA5,
+    0x40, 0xE9, 0xD0, 0x0A, 0xC0, 0xCD, 0xB8, 0xB4, 0x31, 0x63, 0xEB, 0x78, 0xE9, 0x32, 0x19, 0xE3,
+    0xFB, 0xA4, 0xCF, 0x48, 0x39, 0x92, 0xA5, 0xAA, 0xA0, 0x4E, 0xA1, 0xF3, 0x2E, 0x1A, 0x59, 0x62,
+    0xA4, 0xC0, 0x7B, 0xAC, 0xCA, 0xAD, 0x52, 0xA4, 0xB7, 0x6F, 0x4B, 0x67, 0x5E, 0x5E, 0x2A, 0xE0,
+    0xEC, 0x9B, 0xA7, 0xD6, 0x65, 0xD4, 0x60, 0xF3, 0x48, 0xDF, 0x45, 0xF3, 0xFD, 0xB5, 0x0F, 0xC9,
+    0xE6, 0x10, 0x78, 0x4D, 0xAD, 0x30, 0xD1, 0x07, 0xEA, 0x38, 0x6A, 0xE3, 0x3B, 0x10, 0x99, 0x1A,
+    0xA6, 0xDE, 0x2D, 0x9D, 0x1D, 0xCE, 0x5D, 0x26, 0x76, 0x25, 0x87, 0x43, 0xA1, 0xBD, 0xE9, 0xA9,
+    0xB8, 0xA0, 0x1E, 0x88, 0x1A, 0x6A, 0x99, 0x79, 0x01, 0x32, 0x3A, 0x4C, 0x3B, 0xC1, 0xB5, 0x18,
+    0x72, 0x32, 0x0F, 0x7B, 0x91, 0x38, 0x66, 0x8A, 0x16, 0x12, 0xAF, 0xBE, 0x5F, 0x73, 0xA3, 0x0A,
+    0x1D, 0x97, 0x35, 0x87, 0x53, 0x27, 0xB6, 0x5B, 0x43, 0x12, 0xB4, 0xEC, 0xF0, 0x2F, 0x16, 0x59,
+    0x6E, 0x11, 0x2C, 0x20, 0x11, 0xAB, 0x84, 0x2B, 0x7F, 0x9C, 0x82, 0x19, 0x5D, 0xD3, 0x9A, 0x18,
+    0xA2, 0xFF, 0x38, 0x7A, 0x07, 0xD3, 0xBE, 0x23, 0x5C, 0x33, 0x00, 0x99, 0xFE, 0xE0, 0xFC, 0xC0,
+    0x35, 0x05, 0x89, 0xFF, 0x58, 0x93, 0x20, 0x41, 0xDC, 0xD0, 0x27, 0x31, 0xA0, 0xD5, 0xAC, 0xBF,
+    0x78, 0x87, 0x23, 0x33, 0xBF, 0x52, 0xE2, 0xDB, 0x24, 0xB8, 0x83, 0xE1, 0x26, 0x42, 0x8C, 0x1D,
+    0xD4, 0xD4, 0xFC, 0xE3, 0x34, 0xF4, 0x5D, 0x98, 0x17, 0xA1, 0xC4, 0x2A, 0x48, 0x3C, 0x4E, 0x89,
+    0x7D, 0x03, 0x38, 0xE3, 0x13, 0x66, 0xD4, 0x76, 0xB2, 0x93, 0xD2, 0x9C, 0x75, 0x3F, 0xD3, 0x91,
+    0x34, 0xAF, 0x61, 0x55, 0x1D, 0xE8, 0x4C, 0x2F, 0x59, 0x2A, 0x64, 0x05, 0xB9, 0x1D, 0xC1, 0x0B,
+    0x1F, 0x4B, 0xFF, 0x83, 0xAB, 0xBE, 0xB7, 0xB5, 0xF2, 0x23, 0x78, 0xD1, 0xA3, 0x81, 0x8F, 0xF2,
+    0x7C, 0xC6, 0xE7, 0x9F, 0x29, 0xD2, 0x81, 0xFE, 0x50, 0x1C, 0xE7, 0xEF, 0xBF, 0x7F, 0x1C, 0x2A,
+    0x3F, 0x1A, 0x7C, 0x5E, 0xF7, 0xF5, 0x1B, 0x11, 0x8D, 0xB1, 0xF3, 0xC7, 0xE3, 0x38, 0x43, 0x56,
+    0x1A, 0x1E, 0x26, 0xE6, 0xD4, 0x15, 0x84, 0x03, 0x04, 0x49, 0xBD, 0xA0, 0xC0, 0x21, 0xC8, 0x8E,
+    0xC9, 0x96, 0x9B, 0xFA, 0xCA, 0x98, 0xAE, 0x2F, 0xE2, 0x9A, 0x9B, 0xEC, 0x29, 0x8F, 0xF2, 0x04,
+    0xEA, 0x94, 0xB9, 0x70, 0xED, 0xB1, 0x4E, 0x2B, 0x5C, 0x65, 0x00, 0x79, 0x41, 0x53, 0x4B, 0x9D,
+    0xFA, 0x90, 0x22, 0x52, 0x76, 0x51, 0xEC, 0xC2, 0x50, 0xCC, 0x6C, 0xA1, 0x5B, 0x4A, 0xAC, 0x58,
+    0x8F, 0x97, 0x0D, 0xFE, 0xE5, 0x3C, 0x24, 0x34, 0xDC, 0xF2, 0x7A, 0x81, 0xA7, 0x9D, 0x3D, 0x28,
+    0x87, 0xCF, 0xF3, 0xD2, 0x51, 0x0D, 0xF1, 0x5C, 0x01, 0xD5, 0x58, 0x72, 0x33, 0xD7, 0x48, 0x4A,
+    0x75, 0xF5, 0x1A, 0x10, 0xF1, 0x12, 0x76, 0x70, 0xD2, 0x0E, 0x3A, 0x9B, 0x09, 0x23, 0x66, 0xED,
+    0x15, 0xB7, 0xEB, 0x5D, 0xEF, 0x66, 0xEB, 0x8F, 0xAF, 0xD7, 0xDC, 0xF6, 0x5E, 0xA5, 0xED, 0xA8,
+    0x77, 0xE2, 0xC0, 0xF6, 0x19, 0xFE, 0x38, 0xEC, 0x2D, 0xCC, 0x82, 0xC6, 0x21, 0x22, 0x69, 0x67,
+    0xE4, 0x86, 0x26, 0x0E, 0xCC, 0x88, 0x55, 0x6A, 0x17, 0xC6, 0xD0, 0x5F, 0x1C, 0x68, 0x72, 0x08,
+    0x2D, 0x8B, 0xB7, 0xD7, 0xAF, 0x85, 0x0C, 0xC5, 0x9F, 0x4F, 0x6D, 0x0B, 0x34, 0xA2, 0x8D, 0x6D,
+    0x92, 0x31, 0x6C, 0x92, 0x91, 0xFE, 0x3F, 0xC0, 0xA5, 0x4A, 0x58, 0xA7, 0x23, 0x06, 0xA7, 0xE3,
+    0xAF, 0xC6, 0xF5, 0x4C, 0x9D, 0x2A, 0x74, 0x4D, 0xAA, 0xD3, 0xA5, 0xD9, 0xB9, 0x4D, 0xDE, 0x2F,
+    0xA4, 0x69, 0x24, 0x56, 0x5F, 0xCA, 0x0F, 0x43, 0x1E, 0x58, 0xD4, 0x70, 0xD9, 0x11, 0x53, 0xE7,
+    0xB6, 0x9E, 0x8F, 0x06, 0xCA, 0xBF, 0x20, 0x59, 0xE9, 0x51, 0xAE, 0xBA, 0x68, 0x30, 0xDE, 0x5E,
+    0x9C, 0x4D, 0x0A, 0xD1, 0xF7, 0xFB, 0x1E, 0xEF, 0xE3, 0x71, 0xFC, 0x9E, 0x12, 0x96, 0xEF, 0xB7,
+    0xC1, 0xD5, 0x44, 0x48, 0x5E, 0x44, 0x32, 0xED, 0x52, 0xFA, 0x18, 0xA1, 0xAE, 0x6F, 0xCD, 0xDB,
+    0x83, 0x38, 0x8E, 0xD0, 0xEC, 0x8E, 0x3A, 0xEF, 0x43, 0x03, 0xF2, 0x68, 0x14, 0xE2, 0xD3, 0x7D,
+    0xF8, 0x2E, 0x23, 0xBC, 0x54, 0x52, 0x60, 0xE4, 0x89, 0xED, 0x87, 0x78, 0x21, 0x07, 0xF8, 0x24,
+    0x12, 0x1E, 0x99, 0x21, 0x36, 0x3F, 0x6B, 0xB1, 0xE5, 0x62, 0x46, 0x82, 0xC9, 0x44, 0x67, 0x33,
+    0x3E, 0x38, 0x62, 0x02, 0xA0, 0x48, 0x1B, 0xD7, 0xBD, 0x21, 0xAB, 0x2E, 0x62, 0x9E, 0x35, 0x8E,
+    0x3E, 0xDA, 0x2D, 0xA4, 0xDC, 0x7E, 0x43, 0x57, 0x45, 0x13, 0xD4, 0x62, 0x45, 0xAB, 0x95, 0x57,
+    0x4C, 0x56, 0x4C, 0xAD, 0x5F, 0xBF, 0xA0, 0x24, 0x23, 0x53, 0x71, 0xE5, 0xA1, 0x5C, 0x6C, 0xD3,
+    0xFD, 0xE6, 0x43, 0xFD, 0x28, 0x86, 0xA6, 0x63, 0xA7, 0x73, 0x35, 0xF0, 0xFD, 0xFF, 0xC7, 0x7B,
+    0x16, 0x38, 0x73, 0x9C, 0xFC, 0x65, 0x50, 0x94, 0x2D, 0x57, 0xE5, 0xDD, 0x8C, 0x3B, 0x68, 0x81,
+    0xEA, 0x90, 0xA5, 0x3F, 0xC2, 0x2F, 0x9C, 0xD6, 0x9F, 0xBA, 0x01, 0xD7, 0x8E, 0xA1, 0x71, 0xE2,
+    0xA5, 0x2A, 0x6A, 0xA5, 0xFA, 0xE1, 0x6F, 0x44, 0x13, 0x56, 0x16, 0x3A, 0x1A, 0xBA, 0xBE, 0x5D,
+    0xA6, 0xFA, 0x73, 0xEB, 0x05, 0xE0, 0x88, 0x8A, 0xEB, 0x5A, 0x50, 0xF5, 0xFC, 0x86, 0xA2, 0x35,
+    0x41, 0x03, 0x72, 0x92, 0x4A, 0x8F, 0x73, 0xF0, 0x05, 0x2A, 0xA4, 0x8C, 0x5C, 0x46, 0xEB, 0xE9,
+    0xE3, 0x3C, 0x6F, 0xB2, 0x23, 0x6B, 0xA0, 0x77, 0xED, 0xA9, 0x95, 0x5C, 0x50, 0xA3, 0x01, 0xB0,
+    0x8D, 0xE9, 0x5B, 0x5C, 0x0B, 0x91, 0xF5, 0x32, 0x9D, 0x52, 0xA1, 0x45, 0x21, 0x45, 0x4A, 0xEA,
+    0x42, 0x8A, 0x7A, 0x91, 0xA0, 0x34, 0x95, 0x85, 0xEC, 0x84, 0x21, 0xEB, 0x9E, 0x6C, 0xC8, 0xE5,
+    0x5C, 0x5F, 0xAF, 0x0C, 0xC8, 0x17, 0xC8, 0x87, 0x3C, 0x10, 0xD2, 0x20, 0x03, 0x08, 0xD3, 0x3E,
+    0xC6, 0x70, 0x33, 0xFE, 0x9E, 0x11, 0x85, 0xDC, 0xB2, 0xD6, 0xEA, 0x83, 0xD2, 0xE2, 0x41, 0x1E,
+    0x70, 0x0E, 0xED, 0xE5, 0x64, 0xBC, 0x83, 0x6F, 0x1F, 0xEF, 0xC4, 0xFE, 0x20, 0x99, 0x87, 0xF6,
+    0x76, 0x76, 0x4B, 0xC2, 0xEF, 0x9C, 0xA9, 0xED, 0x33, 0xF8, 0x6A, 0x64, 0x83, 0x76, 0xAE, 0x5D,
+    0x48, 0xAA, 0x08, 0x64, 0x95, 0xB8, 0x8F, 0x33, 0xB3, 0x88, 0x07, 0x55, 0xDB, 0x6C, 0xA5, 0x1E,
+    0x3B, 0xCA, 0x76, 0xDC, 0x0D, 0x85, 0x02, 0xA2, 0xEC, 0xB5, 0x0F, 0xC4, 0x52, 0x11, 0x57, 0xF5,
+    0x2D, 0x8D, 0xFB, 0x3C, 0x49, 0xC7, 0x59, 0x68, 0x3A, 0x62, 0xC9, 0x28, 0xCD, 0x81, 0x98, 0x10,
+    0xB0, 0x71, 0x3B, 0x96, 0xB9, 0xC2, 0x16, 0x14, 0x88, 0xCC, 0x56, 0x1A, 0xD2, 0x78, 0xBC, 0x53,
+    0x4A, 0xA8, 0x27, 0xDE, 0x8A, 0x5B, 0xEF, 0x58, 0x97, 0x95, 0x02, 0xF3, 0x76, 0xC1, 0xA2, 0x01,
+    0xB8, 0xD2, 0xB8, 0xAC, 0xC5, 0xB3, 0x36, 0x33, 0x7C, 0x1A, 0xCA, 0x06, 0x4C, 0x09, 0xBC, 0x3C,
+    0x0B, 0x0A, 0xD8, 0xAC, 0x74, 0x25, 0xA4, 0x91, 0xDB, 0x13, 0xE5, 0x2B, 0x09, 0xC7, 0x3D, 0x99,
+    0xFB, 0x4F, 0xFF, 0xB4, 0x9C, 0x9E, 0x89, 0xF8, 0xD3, 0xAC, 0xCF, 0x37, 0xEA, 0x3F, 0xAC, 0x3E,
+    0x8F, 0x7E, 0xFD, 0x66, 0x97, 0xF1, 0x8A, 0x94, 0xE0, 0x36, 0x2A, 0x48, 0x1C, 0xA9, 0x5B, 0x1E,
+    0x4D, 0xCC, 0xB0, 0xF6, 0xA6, 0x26, 0x2E, 0x6D, 0x29, 0x6E, 0x89, 0x30, 0x6C, 0x2B, 0xA3, 0x04,
+    0xD4, 0x8F, 0x8C, 0xCB, 0xA7, 0xA2, 0x05, 0x94, 0x93, 0xE9, 0x9B, 0x03, 0x18, 0x91, 0x76, 0x25,
+    0x42, 0xF6, 0xC1, 0xE1, 0xE8, 0x6B, 0x56, 0xEF, 0x61, 0xED, 0xDB, 0xF7, 0xD6, 0xD3, 0x50, 0xB1,
+    0x59, 0xAE, 0x79, 0x22, 0xEB, 0xCC, 0x39, 0x3E, 0x10, 0xD7, 0x21, 0x04, 0x7D, 0xEF, 0x96, 0x73,
+    0xBC, 0x6C, 0xE5, 0x0D, 0x15, 0x8A, 0x94, 0x07, 0x14, 0x96, 0x86, 0x31, 0x68, 0xD6, 0xC0, 0xE7,
+    0xE5, 0xEE, 0x6C, 0x77, 0xBD, 0x9E, 0xD9, 0x27, 0xE7, 0x68, 0x1E, 0x57, 0x1A, 0x0D, 0x01, 0xDD,
+    0x3B, 0xAF, 0x85, 0x5A, 0xA3, 0x49, 0x4A, 0xCB, 0x1D, 0x2E, 0xC4, 0xFE, 0x39, 0x50, 0x36, 0x5C,
+    0xF8, 0xE4, 0xC4, 0x0D, 0x6A, 0x84, 0xCC, 0xC1, 0x5C, 0xF1, 0x72, 0x34, 0x1B, 0xAE, 0x8E, 0xFB,
+    0x45, 0x23, 0xBE, 0xC5, 0x4B, 0xAE, 0xC2, 0xC9, 0x74, 0xF5, 0x83, 0x84, 0x26, 0x7A, 0xFA, 0x8D,
+    0xFF, 0x34, 0x68, 0xDE, 0x39, 0xB3, 0xDB, 0x15, 0xDB, 0x13, 0xC2, 0x59, 0xDE, 0x5F, 0x78, 0xD2,
+    0x04, 0x1D, 0x3A, 0x45, 0x7B, 0xCD, 0xB5, 0xC4, 0x51, 0xCF, 0x8F, 0xAD, 0x2E, 0x61, 0x23, 0xEC,
+    0x66, 0x37, 0x2D, 0x4A, 0xB3, 0xD4, 0xCA, 0x8C, 0x37, 0x3F, 0xAE, 0x15, 0x3F, 0xBE, 0xE7, 0x5E,
+    0x2D, 0xAD, 0x95, 0x30, 0xFB, 0x35, 0x42, 0xC9, 0xFB, 0xF1, 0x5A, 0xD0, 0x20, 0x3A, 0x06, 0xF5,
+    0x1D, 0x2D, 0xDB, 0xAC, 0x4C, 0xEB, 0x02, 0xF0, 0x11, 0x4D, 0xC9, 0x24, 0x46, 0x5E, 0x1A, 0xAA,
+    0x24, 0xE8, 0x0B, 0xAC, 0x83, 0xAD, 0x12, 0x9D, 0xD1, 0x79, 0xBC, 0xE0, 0xF7, 0x56, 0x21, 0x90,
+    0x71, 0x7D, 0x6D, 0x36, 0x59, 0xC3, 0xF8, 0x4C, 0x60, 0xBF, 0x0B, 0xF4, 0x29, 0x60, 0x65, 0xF3,
+    0xC7, 0x48, 0xAC, 0x8F, 0x7C, 0x5D, 0x4B, 0xF8, 0x75, 0x5E, 0x94, 0x97, 0x1C, 0x02, 0x70, 0xED,
+    0xA3, 0xC4, 0x22, 0xB6, 0x10, 0xFA, 0x74, 0x00, 0x8C, 0x73, 0x6C, 0xC7, 0xB2, 0xFA, 0x6E, 0x0F,
+    0x42, 0x8B, 0xF5, 0xB7, 0xF0, 0xE9, 0x29, 0xE8, 0x48, 0xB3, 0x1C, 0xD2, 0xAB, 0xA1, 0xA5, 0x8B,
+    0x1C, 0x43, 0x44, 0xEF, 0xE9, 0x95, 0xC8, 0xA6, 0xE9, 0x48, 0x8C, 0x73, 0xFA, 0x6C, 0x9C, 0xC4,
+    0xAE, 0x2B, 0xB3, 0xC9, 0x11, 0x06, 0x20, 0xA9, 0x00, 0xFB, 0x50, 0x1D, 0x73, 0x68, 0xD5, 0xC0,
+    0x4D, 0x38, 0x4C, 0xAA, 0x93, 0xC0, 0x24, 0x25, 0xE0, 0x55, 0x0C, 0x6F, 0xE8, 0xA2, 0x66, 0x3C,
+    0xE0, 0x5E, 0x5C, 0x2F, 0xBC, 0x27, 0x66, 0x99, 0x0E, 0xF6, 0xFE, 0xCF, 0x14, 0x19, 0x0E, 0x9D,
+    0x75, 0xCF, 0xE9, 0x29, 0xC1, 0x77, 0x26, 0xF5, 0x78, 0xA5, 0x4E, 0x7D, 0x7F, 0x3F, 0x33, 0x11,
+    0x5F, 0x26, 0xCD, 0xCB, 0x5B, 0x47, 0xD4, 0x37, 0x4C, 0xBA, 0x38, 0x59, 0x23, 0x80, 0x84, 0xEF,
+    0x3C, 0xCC, 0xD6, 0xA9, 0x71, 0xA3, 0xFE, 0x5B, 0xD5, 0x3B, 0x21, 0x52, 0xC2, 0xD6, 0x1B, 0x71,
+    0x3B, 0x06, 0x55, 0x5C, 0x1B, 0x77, 0xAB, 0x80, 0x0B, 0x17, 0xCB, 0x14, 0x72, 0x87, 0xFB, 0x81,
+    0xD4, 0xFB, 0xB7, 0xD0, 0x84, 0x65, 0x9B, 0x6F, 0x2B, 0xD5, 0x7A, 0x12, 0xA8, 0x2A, 0xBE, 0xA5,
+    0xE7, 0xE2, 0x8F, 0x05, 0x1A, 0x54, 0x10, 0xAA, 0x72, 0x34, 0xF6, 0xE9, 0x08, 0x6B, 0xB4, 0xFC,
+    0x69, 0xAF, 0x26, 0x5F, 0xC5, 0x72, 0x61, 0x96, 0x3A, 0xD6, 0xE4, 0x5B, 0xBA, 0xCB, 0x0C, 0xD1,
+    0xAE, 0xF8, 0x19, 0xFA, 0xB6, 0xCF, 0x0C, 0xCC, 0xFC, 0xCD, 0x82, 0x15, 0xAC, 0x36, 0x04, 0x80,
+    0x75, 0x3D, 0x8D, 0xF9, 0x36, 0x57, 0x4F, 0x7C, 0x55, 0x60, 0xE0, 0x2F, 0xB4, 0x89, 0x9E, 0x77,
+    0xED, 0xCB, 0x19, 0x96, 0xB4, 0xC0, 0x5E, 0xBE, 0x4E, 0xEF, 0xB9, 0xA7, 0xCB, 0x92, 0x68, 0x74,
+    0xF0, 0x9A, 0x38, 0xE1, 0x15, 0x67, 0x64, 0xE0, 0x70, 0x08, 0x36, 0xED, 0xC4, 0x47, 0x11, 0xD6,
+    0x79, 0x5E, 0x12, 0x4A, 0x50, 0xD8, 0xFE, 0x7D, 0x09, 0x67, 0x11, 0x53, 0x2B, 0x2E, 0x6F, 0x5B,
+    0x91, 0xF5, 0x1A, 0xAA, 0x0C, 0x0C, 0x50, 0x45, 0x0B, 0x94, 0x01, 0x16, 0xB7, 0x83, 0x9A, 0xF6,
+    0xCC, 0x45, 0x79, 0x7C, 0xD0, 0x9C, 0xFD, 0x66, 0xB1, 0xBD, 0xCF, 0x70, 0xBC, 0x77, 0xF4, 0xA2,
+    0xEE, 0x6F, 0x13, 0x28, 0x48, 0x39, 0x81, 0xCB, 0x80, 0x52, 0xED, 0x49, 0xEE, 0x54, 0xFD, 0x59,
+    0x27, 0x51, 0x68, 0x8E, 0xFA, 0x46, 0x89, 0x9A, 0xCF, 0x48, 0x45, 0x9F, 0xA5, 0x6F, 0x16, 0x6C,
+    0x3C, 0x36, 0x41, 0xF7, 0x06, 0xAA, 0x3A, 0x7D, 0xFF, 0x4E, 0x37, 0xE6, 0x7D, 0x83, 0x9F, 0xDE,
+    0x6E, 0xBC, 0x7C, 0x95, 0xEF, 0x93, 0x82, 0x42, 0x43, 0xAA, 0xC2, 0x85, 0xBA, 0x7E, 0x9C, 0xB6,
+    0xD4, 0xE1, 0x11, 0xB2, 0x44, 0xDC, 0xFF, 0xC7, 0x5C, 0x92, 0xCE, 0xC0, 0xBC, 0xA7, 0xB2, 0x41,
+    0x75, 0x05, 0x4F, 0x00, 0xB9, 0x23, 0xF2, 0xCA, 0xE9, 0x65, 0x23, 0x24, 0x49, 0xA4, 0x15, 0x8E,
+    0x10, 0xB1, 0xC1, 0x2F, 0xCA, 0xB4, 0xAF, 0x86, 0xF7, 0x80, 0x3D, 0xF2, 0xC1, 0x5A, 0x42, 0x2F,
+    0xC7, 0x39, 0xFD, 0x06, 0x74, 0xEF, 0x15, 0xEB, 0xE0, 0x24, 0x8F, 0x7B, 0xEE, 0xE0, 0xE4, 0x1D,
+    0x5F, 0x2A, 0x88, 0xDC, 0x9E, 0xB5, 0xA9, 0x9F, 0xDE, 0x73, 0x2C, 0x7A, 0xF3, 0x9B, 0x32, 0xF3,
+    0xF4, 0x5F, 0x3C, 0x5E, 0xBE, 0xBA, 0xA0, 0xEA, 0xB6, 0x0B, 0x00, 0x10, 0xE5, 0xBA, 0x6C, 0x62,
+    0x26, 0x27, 0x62, 0x3B, 0x48, 0x5C, 0x60, 0xEE, 0xEB, 0xFA, 0xEE, 0xB1, 0x6C, 0x0A, 0x46, 0xF3,
+    0x1E, 0xED, 0xA3, 0x1B, 0xF3, 0x60, 0x02, 0xF3, 0x60, 0x6A, 0x1A, 0x8A, 0x33, 0x70, 0x13, 0x7C,
+    0x5F, 0xC6, 0xEF, 0x8A, 0x15, 0xCB, 0xC1, 0x44, 0xDD, 0xEF, 0x73, 0x9D, 0x01, 0x70, 0xAF, 0xAA,
+    0x60, 0x34, 0xB4, 0x2D, 0x4B, 0xA1, 0xBB, 0x5B, 0xF2, 0x54, 0x0F, 0x10, 0xDD, 0xA4, 0xBB, 0xA4,
+    0xE5, 0xC4, 0x3D, 0xAE, 0xEF, 0x70, 0xF9, 0xED, 0x9A, 0x60, 0x2E, 0x22, 0xAB, 0xF5, 0xA8, 0x8A,
+    0xEA, 0x62, 0x05, 0x2A, 0x32, 0x31, 0x29, 0xDE, 0x4C, 0x8E, 0x8C, 0x6C, 0x4B, 0x70, 0xB0, 0x9C,
+    0x0A, 0x95, 0x52, 0xC6, 0x90, 0x0D, 0x2A, 0xAA, 0xAC, 0x07, 0x54, 0xCE, 0xFE, 0xF6, 0x95, 0xBB,
+    0xCD, 0xF3, 0xE4, 0x69, 0xC7, 0x44, 0x75, 0x63, 0x72, 0x84, 0x0E, 0xD5, 0x13, 0xE4, 0xFA, 0x48,
+    0xC1, 0x42, 0xD5, 0x5F, 0x6B, 0x88, 0x3D, 0x8E, 0x09, 0x67, 0x42, 0x61, 0x69, 0x72, 0xEE, 0xE3,
+    0xDF, 0x37, 0x75, 0x30, 0xCE, 0x9D, 0xE3, 0x0C, 0xF9, 0x16, 0x0C, 0xD2, 0x6F, 0x3C, 0x69, 0x8D,
+    0x8F, 0x1D, 0x78, 0x1C, 0x8B, 0x3A, 0x6C, 0xDF, 0x28, 0x5E, 0x76, 0x79, 0x89, 0x75, 0x82, 0xB7,
+    0x46, 0x97, 0xB3, 0xF2, 0x60, 0x98, 0x96, 0x5E, 0x5C, 0x24, 0x35, 0xA7, 0x0B, 0xA7, 0xB6, 0x96,
+    0x80, 0xD3, 0x9C, 0x38, 0xE2, 0xF3, 0x9B, 0x76, 0x86, 0x68, 0xC9, 0xA4, 0x08, 0x46, 0x8D, 0x1D,
+    0x5C, 0xF7, 0x68, 0x62, 0xBC, 0x6B, 0x7B, 0x1C, 0xE5, 0x72, 0x94, 0x4A, 0xAF, 0x2C, 0x74, 0x4D,
+    0x9A, 0x05, 0x90, 0xA6, 0xD9, 0x2C, 0xDF, 0x20, 0x2A, 0xE9, 0x0D, 0x8B, 0xDD, 0xD9, 0x97, 0x1D,
+    0x30, 0x8B, 0xC0, 0x23, 0xCD, 0x1E, 0xF4, 0x3C, 0x06, 0xA2, 0xDC, 0xE9, 0x13, 0xDA, 0xC7, 0x82,
+    0xC0, 0x5F, 0x08, 0x12, 0x7C, 0xEE, 0x7A, 0x3D, 0x95, 0xE9, 0xCB, 0xA2, 0xBC, 0xA0, 0x55, 0x18,
+    0x49, 0x83, 0x86, 0x62, 0xCF, 0x8F, 0xA6, 0xF1, 0x14, 0xAA, 0x0A, 0x5A, 0xE1, 0x96, 0xF7, 0x13,
+    0x0C, 0xC1, 0x09, 0xFD, 0xBF, 0x84, 0xEE, 0x6D, 0x0A, 0x34, 0x73, 0x88, 0xD8, 0x54, 0x61, 0x9A,
+    0x1F, 0x2B, 0x34, 0x36, 0x44, 0x34, 0x41, 0x7F, 0x09, 0x8F, 0x08, 0x08, 0x40, 0xA1, 0x70, 0x24,
+    0x30, 0x23, 0x02, 0x2D, 0x76, 0x39, 0xC0, 0xCA, 0xF1, 0xAC, 0xA2, 0xFA, 0x09, 0x07, 0xE0, 0x5D,
+    0xE2, 0x44, 0x0C, 0x2C, 0xAB, 0x77, 0x4C, 0xE7, 0x7E, 0xFA, 0xAB, 0xF3, 0x43, 0xAF, 0x6F, 0x5D,
+    0xC1, 0xE3, 0x81, 0x28, 0x9A, 0x47, 0xD4, 0xE5, 0x4B, 0x04, 0x0A, 0x47, 0xFD, 0xF6, 0x31, 0x6D,
+    0x54, 0xAD, 0x3B, 0x19, 0xF7, 0x28, 0x1D, 0x42, 0x7C, 0x3A, 0x4C, 0xCC, 0xB3, 0x66, 0xE2, 0x9F,
+    0x8C, 0x18, 0x0F, 0x77, 0xC4, 0xA3, 0xF4, 0x22, 0x75, 0x83, 0x65, 0xFB, 0x4F, 0x02, 0x71, 0xE6,
+    0x4A, 0x2D, 0x2F, 0xE2, 0x46, 0xB4, 0x0C, 0x39, 0x29, 0xAB, 0xC7, 0x3E, 0x38, 0xC3, 0x0B, 0xA5,
+    0xE8, 0xB5, 0xE6, 0x0E, 0xEC, 0x77, 0x7C, 0xD0, 0xBF, 0x2F, 0xB1, 0x27, 0x4F, 0x56, 0x73, 0xCA,
+    0x70, 0xA5, 0x35, 0x71, 0x4A, 0x42, 0xA5, 0x37, 0x0A, 0xA7, 0xAD, 0x27, 0x18, 0x02, 0x8C, 0x4B,
+    0x3A, 0xB1, 0x6D, 0x17, 0xC1, 0x81, 0x76, 0x70, 0x8D, 0xAC, 0xAD, 0x4A, 0xDD, 0x3D, 0x27, 0x18,
+    0x66, 0x63, 0x3A, 0x0D, 0xFC, 0xA2, 0x9F, 0xC5, 0x2E, 0x29, 0xD9, 0xA5, 0x0C, 0x4C, 0xA3, 0x6F,
+    0xA9, 0x3F, 0xFF, 0xB5, 0x83, 0x6B, 0x00, 0x93, 0x57, 0x39, 0x26, 0x6D, 0x40, 0x81, 0x89, 0x4A,
+    0xAE, 0x55, 0x06, 0x58, 0x75, 0x6F, 0x49, 0xC2, 0xFF, 0xA0, 0x92, 0x7B, 0xB6, 0x60, 0x80, 0x72,
+    0x52, 0xE5, 0x8D, 0x33, 0xC0, 0xB6, 0x3F, 0xF2, 0x2A, 0x81, 0x11, 0x8F, 0xF5, 0xA2, 0x98, 0x84,
+    0x59, 0x7C, 0xA8, 0xD5, 0x9C, 0xDE, 0x69, 0x4C, 0x67, 0xD9, 0xFB, 0xBC, 0x68, 0x29, 0x92, 0x25,
+    0x7D, 0xFD, 0x01, 0x8D, 0x60, 0xBC, 0xAE, 0x34, 0x00, 0x77, 0x06, 0x99, 0xD2, 0x9B, 0xFD, 0x69,
+    0xD5, 0x56, 0x00, 0xB0, 0x76, 0x71, 0x38, 0xCE, 0xBE, 0xAE, 0xA2, 0xA4, 0x8C, 0xA4, 0xE6, 0x78,
+    0x9E, 0x96, 0x2F, 0x92, 0xF3, 0x13, 0x22, 0x50, 0xE9, 0x0F, 0xB2, 0x0F, 0x31, 0x4E, 0xC7, 0x2E,
+    0xF0, 0x70, 0x21, 0x33, 0x41, 0xCA, 0xFA, 0xF0, 0x4D, 0xF8, 0xCD, 0x1E, 0x41, 0x42, 0xED, 0xAA,
+    0xA0, 0x49, 0x30, 0x2D, 0xBA, 0x1E, 0x11, 0x09, 0x14, 0x0E, 0x39, 0x32, 0x32, 0x22, 0x48, 0x93,
+    0xCF, 0x1A, 0xF8, 0xC1, 0x91, 0x6A, 0x0B, 0xCC, 0x76, 0x98, 0xD1, 0x2B, 0x9A, 0x40, 0xBF, 0x12,
+    0xD6, 0xFF, 0x20, 0x7E, 0x54, 0xB8, 0x4E, 0x65, 0xEB, 0xB3, 0x46, 0xD1, 0x44, 0x6A, 0x80, 0x19,
+    0x72, 0xFD, 0x39, 0x11, 0xD7, 0x7A, 0x7C, 0x03, 0x7D, 0x76, 0xE0, 0xB2, 0x30, 0x02, 0xAA, 0xEC,
+    0x29, 0xA7, 0x90, 0x08, 0xC8, 0x16, 0x12, 0xA0, 0x30, 0x2C, 0xA1, 0x4E, 0xC1, 0x7C, 0x5F, 0xB7,
+    0x5A, 0x17, 0xF7, 0xA7, 0xFC, 0xFA, 0xCB, 0x5D, 0xC2, 0xDC, 0x2C, 0x86, 0xF7, 0xCD, 0x2A, 0x0A,
+    0xA7, 0x22, 0x47, 0x48, 0xC2, 0x75, 0x1E, 0x24, 0xC6, 0x26, 0x98, 0x84, 0x15, 0xAD, 0xB9, 0xBA,
+    0xC9, 0xAF, 0x7D, 0xA2, 0x5D, 0xDD, 0x8E, 0xE0, 0xEE, 0xEF, 0x74, 0xCE, 0x3F, 0xBC, 0xFC, 0xA0,
+    0x26, 0x09, 0x15, 0x30, 0xEC, 0x3B, 0xBB, 0x0A, 0xC4, 0x43, 0x9F, 0x27, 0x90, 0x1F, 0xCC, 0x2D,
+    0x8B, 0x7F, 0xDA, 0x51, 0xCB, 0xF7, 0x27, 0xAC, 0xE5, 0xD7, 0x7D, 0xAA, 0xB0, 0xD9, 0x7C, 0xBF,
+    0x17, 0xD0, 0x42, 0x57, 0xC0, 0xF9, 0xE3, 0xF0, 0x0E, 0x7B, 0x5F, 0xE4, 0x4B, 0xA0, 0xC1, 0xEE,
+    0xF1, 0xF2, 0xEB, 0x33, 0xDA, 0x25, 0xFB, 0x08, 0xAE, 0x6F, 0x4B, 0xFB, 0x5E, 0x98, 0x91, 0xD7,
+    0x91, 0x9A, 0x62, 0x76, 0xC6, 0x51, 0xAA, 0x64, 0x6A, 0xF2, 0xCD, 0xAD, 0x24, 0x42, 0x87, 0x05,
+    0xD3, 0x39, 0xE1, 0xC5, 0xA8, 0x30, 0x79, 0xD8, 0xC0, 0x03, 0x42, 0x84, 0x5A, 0x75, 0xB4, 0x8C,
+    0x0D, 0xE3, 0xB4, 0xCB, 0x00, 0xFD, 0x51, 0xDC, 0xE1, 0xA8, 0xDE, 0xE7, 0x33, 0x6D, 0x74, 0x62,
+    0x2A, 0xAE, 0x99, 0x79, 0x9E, 0xFC, 0x0E, 0x19, 0x35, 0xDD, 0xA1, 0x75, 0xE4, 0x2B, 0x0C, 0xC5,
+    0x37, 0xCB, 0x70, 0x3E, 0x00, 0x0B, 0x28, 0x37, 0x03, 0x23, 0x4D, 0xF0, 0x85, 0xFB, 0xF5, 0x3B,
+    0x8D, 0xC1, 0xB9, 0xB2, 0x7D, 0x15, 0x4C, 0xC0, 0x86, 0x78, 0x74, 0x01, 0xDB, 0xB0, 0xC3, 0x01,
+    0x25, 0x4D, 0x56, 0x70, 0x60, 0x66, 0xCC, 0xC0, 0x1A, 0xD7, 0x77, 0x90, 0x42, 0xDE, 0xE1, 0x09,
+    0xA9, 0x14, 0xB8, 0xB9, 0x78, 0xAF, 0x64, 0x1F, 0x50, 0x02, 0xF9, 0xAF, 0x2C, 0x43, 0x9A, 0xF3,
+    0xD9, 0x00, 0x56, 0x81, 0xC9, 0xC6, 0xC8, 0xAF, 0x1D, 0x49, 0x5A, 0xC5, 0xFB, 0x80, 0xF6, 0x3E,
+    0xD1, 0x03, 0x5B, 0x8B, 0xF4, 0xFA, 0x8B, 0x81, 0xB8, 0x87, 0xD3, 0xEE, 0x40, 0x17, 0xB0, 0x39,
+    0xE5, 0x20, 0xF4, 0x96, 0xEE, 0x8E, 0xA3, 0x71, 0xCE, 0x05, 0xD4, 0x3C, 0x71, 0x46, 0x91, 0xEA,
+    0x89, 0xC5, 0x9F, 0xD3, 0x07, 0x77, 0x1E, 0x1C, 0x4B, 0x28, 0xA1, 0xA4, 0x5F, 0xE3, 0xC3, 0x9A,
+    0xF5, 0x2A, 0xF8, 0xC3, 0x68, 0x4C, 0x76, 0x7B, 0x8B, 0x62, 0x49, 0x8C, 0x7C, 0x31, 0x9D, 0x41,
+    0x07, 0x29, 0xE9, 0xD9, 0xF1, 0x58, 0x6F, 0x20, 0x31, 0x06, 0x45, 0xEA, 0xAB, 0x5E, 0x94, 0x21,
+    0xEC, 0xB2, 0xC0, 0xA9, 0xD3, 0x23, 0x54, 0x09, 0x32, 0x95, 0xF7, 0x50, 0x41, 0x13, 0x7E, 0x9D,
+    0x7C, 0xEB, 0xB8, 0x49, 0x87, 0xD2, 0xF9, 0x55, 0xDC, 0xE5, 0x57, 0x5E, 0x45, 0x3C, 0xA0, 0xE7,
+    0xF2, 0x70, 0x2B, 0x7A, 0x08, 0x38, 0x1D, 0xCC, 0x34, 0x55, 0xF3, 0x79, 0x99, 0xD8, 0x3A, 0x6C,
+    0xEA, 0xFD, 0x18, 0xE6, 0xA8, 0x8C, 0x22, 0xE6, 0x24, 0x02, 0xC6, 0x71, 0xFE, 0x09, 0x01, 0x63,
+    0xD9, 0x13, 0xD6, 0x82, 0xE7, 0x86, 0x9C, 0x08, 0xDC, 0xC5, 0x2A, 0x83, 0x13, 0x3A, 0x03, 0x52,
+    0x25, 0x71, 0x8B, 0x9E, 0xB5, 0xCC, 0x08, 0x05, 0x98, 0xBC, 0xFF, 0xF0, 0xB8, 0x22, 0xF1, 0x87,
+    0x6B, 0xE7, 0x0A, 0xB0, 0xF1, 0x77, 0xAC, 0x70, 0xA5, 0x34, 0x22, 0x46, 0xD0, 0x53, 0xB5, 0xE8,
+    0x77, 0x04, 0x9D, 0x90, 0x8D, 0xE8, 0x57, 0x47, 0x5D, 0xE7, 0x91, 0x41, 0xA5, 0x2B, 0xD2, 0xF0,
+    0xBE, 0x7B, 0xFE, 0x03, 0xF4, 0x81, 0x73, 0x2F, 0xA4, 0x39, 0x21, 0x3D, 0x24, 0x35, 0xAE, 0xCE,
+    0xE3, 0x9C, 0x36, 0x5B, 0x45, 0xC4, 0xA0, 0xD4, 0x46, 0x02, 0x38, 0xF7, 0x9E, 0xC3, 0x11, 0x01,
+    0x31, 0xB8, 0xAC, 0xE8, 0xFC, 0xDB, 0xC5, 0xB4, 0xC4, 0xD5, 0x2A, 0xFB, 0x0D, 0xF7, 0x29, 0xB5,
+    0xCC, 0xE7, 0xD1, 0xF5, 0x1F, 0x53, 0xDF, 0xD7, 0x7D, 0x71, 0xED, 0x0C, 0xB4, 0xDA, 0xFE, 0xA5,
+    0x28, 0x5D, 0x5A, 0x4D, 0x54, 0x9D, 0x04, 0x40, 0x92, 0xBD, 0xC4, 0xD7, 0x38, 0x4B, 0xBC, 0xF5,
+    0x1F, 0x58, 0xAE, 0xD8, 0x0D, 0xA6, 0x92, 0xE8, 0xEF, 0x43, 0xEF, 0xDF, 0x0F, 0xCD, 0x22, 0xFA,
+    0x61, 0x24, 0x77, 0x6A, 0x60, 0x8D, 0x42, 0xFA, 0x8A, 0x0D, 0x6C, 0x47, 0xDB, 0xC2, 0x57, 0x9F,
+    0x12, 0x0E, 0x32, 0xD4, 0x12, 0xD7, 0x05, 0x1F, 0xDF, 0x7A, 0xEC, 0xE2, 0x79, 0xEB, 0xC4, 0x8B,
+    0xC4, 0x71, 0x47, 0xB8, 0xE2, 0xA6, 0xF7, 0x55, 0x7D, 0x6D, 0xC7, 0x93, 0xDB, 0x11, 0xED, 0x70,
+    0xDE, 0xCD, 0xD9, 0x87, 0x14, 0xDA, 0x69, 0x00, 0x63, 0xFF, 0x5E, 0x0F, 0x9A, 0x38, 0xE7, 0xA2,
+    0x2F, 0xA6, 0x38, 0x0E, 0xA8, 0x88, 0x38, 0xD4, 0xF5, 0xF3, 0x26, 0x27, 0x33, 0x2A, 0xF0, 0xA1,
+    0xC8, 0x01, 0x7E, 0xF3, 0xB1, 0xEB, 0x59, 0xCE, 0x3F, 0xE0, 0xC4, 0x86, 0x25, 0xDD, 0xCA, 0x55,
+    0x58, 0x4F, 0x4B, 0x4F, 0x5D, 0x8A, 0x01, 0xAB, 0x82, 0x3E, 0x48, 0x9F, 0x14, 0x4B, 0x9E, 0x05,
+    0x6C, 0x3E, 0xEE, 0xF6, 0x84, 0x59, 0x76, 0x56, 0x69, 0x10, 0x6B, 0x4B, 0x79, 0xB6, 0x90, 0x0F,
+    0x2E, 0x04, 0x45, 0x5C, 0x5A, 0x35, 0x7C, 0x4A, 0x8D, 0xEA, 0xC3, 0xA8, 0x35, 0xD2, 0xCD, 0x0B,
+    0xE1, 0x37, 0xF3, 0x83, 0xCB, 0x65, 0x8B, 0x65, 0x73, 0xEC, 0xA9, 0x80, 0x11, 0xA2, 0xA5, 0x97,
+    0x83, 0xC2, 0x0D, 0xF0, 0x23, 0x27, 0x6C, 0xA7, 0xFE, 0xD3, 0x01, 0x1A, 0x1A, 0x60, 0x1C, 0x82,
+    0x09, 0xE6, 0xB7, 0x7E, 0xE3, 0xE5, 0x9E, 0xF3, 0xEC, 0x7F, 0x76, 0x23, 0xCD, 0xF5, 0xCD, 0xA7,
+    0x21, 0xD5, 0xCF, 0x7C, 0x56, 0x56, 0x1E, 0xF2, 0x25, 0x36, 0x81, 0x81, 0xE8, 0x33, 0x39, 0xFC,
+    0x93, 0xE7, 0xC8, 0x4A, 0x39, 0xB5, 0x1C, 0x86, 0x13, 0xC9, 0xD2, 0xAA, 0xC6, 0x31, 0x46, 0xDE,
+    0xEF, 0x35, 0x26, 0x5A, 0x09, 0x42, 0x0F, 0x24, 0xA5, 0x6A, 0x82, 0x84, 0x17, 0x95, 0x35, 0x7C,
+    0xB7, 0x99, 0x60, 0x6E, 0x54, 0xE1, 0x43, 0xDC, 0xDD, 0x2A, 0x17, 0x06, 0xB9, 0xF2, 0x34, 0xAE,
+    0xDB, 0xE9, 0xF3, 0xAB, 0x6C, 0xAA, 0x1A, 0x5E, 0x65, 0xCF, 0x45, 0x3B, 0xB2, 0x6C, 0x47, 0xE5,
+    0x26, 0x7B, 0x43, 0xD0, 0x58, 0x0A, 0x74, 0xE3, 0xEC, 0xDD, 0x7C, 0xB8, 0x3B, 0xE6, 0xCC, 0x72,
+    0xD3, 0x35, 0x63, 0xB5, 0x26, 0x7A, 0xBE, 0x71, 0x21, 0x82, 0x75, 0x35, 0x20, 0x11, 0x7F, 0x1D,
+    0xFE, 0xD4, 0x19, 0xD0, 0xB7, 0xC1, 0xF3, 0xF4, 0xE6, 0x9A, 0xE0, 0x7D, 0x02, 0x60, 0xF0, 0xC8,
+    0x41, 0xC9, 0x36, 0x14, 0xDE, 0xF5, 0x03, 0x91, 0xE6, 0xFE, 0xAD, 0x1F, 0x50, 0xA7, 0x95, 0xFB,
+    0x09, 0x26, 0x21, 0x23, 0xA4, 0xF8, 0x84, 0xD2, 0xAB, 0x02, 0x88, 0x62, 0xDD, 0xB9, 0x7A, 0x57,
+    0xF0, 0x57, 0x92, 0x6E, 0xA5, 0xDD, 0x6D, 0xCF, 0xEF, 0x30, 0x0B, 0xC3, 0xD3, 0xE1, 0xDF, 0xB4,
+    0x39, 0x35, 0x73, 0x19, 0xED, 0xAE, 0x1A, 0x8A, 0x0D, 0xC8, 0x31, 0x94, 0x3C, 0xB5, 0xEF, 0x2C,
+    0x67, 0xBA, 0xFD, 0x34, 0x13, 0x95, 0x5B, 0x00, 0x0B, 0xDF, 0x23, 0xBC, 0x7D, 0xDE, 0x1C, 0x30,
+    0x72, 0x81, 0x9C, 0x34, 0xB7, 0x60, 0x0E, 0x4C, 0x96, 0x64, 0x5C, 0x93, 0x61, 0x53, 0x12, 0x20,
+    0xD3, 0xA2, 0xBB, 0x9F, 0x1F, 0x26, 0x7F, 0xD5, 0xD7, 0xDE, 0x4C, 0x20, 0x8F, 0x1D, 0x43, 0xAB,
+    0x2C, 0x7F, 0x50, 0xED, 0x9C, 0x7C, 0x2B, 0x44, 0x2C, 0x22, 0xBF, 0xD6, 0x56, 0xB2, 0x56, 0xE4,
+    0x74, 0x8A, 0x78, 0x5F, 0x21, 0xB9, 0xD2, 0xDB, 0x9D, 0x7D, 0x42, 0x54, 0x92, 0x8F, 0x55, 0x9E,
+    0x85, 0xE8, 0x28, 0x92, 0xF0, 0x27, 0x77, 0xCF, 0xFD, 0xE0, 0xB6, 0x2F, 0xBD, 0xC6, 0x4B, 0x8E,
+    0x3E, 0x90, 0xBB, 0x52, 0xED, 0xF6, 0xAA, 0x22, 0x6F, 0x50, 0xDF, 0xFC, 0x65, 0x7B, 0x0D, 0xE9,
+    0x27, 0x03, 0x7E, 0x4A, 0x38, 0xDD, 0x0E, 0x7A, 0x27, 0x66, 0x65, 0xDF, 0xD4, 0xDC, 0x62, 0x41,
+    0x4F, 0xBE, 0x74, 0xBB, 0xCE, 0x45, 0x98, 0xBC, 0x78, 0xC4, 0x58, 0xCB, 0x8B, 0xD7, 0x6E, 0xDE,
+    0x47, 0xE7, 0x62, 0xE5, 0xE4, 0x83, 0xC4, 0x88, 0x07, 0xE8, 0x59, 0xA8, 0x45, 0x66, 0xE7, 0x2E,
+    0xC0, 0xC6, 0x34, 0x56, 0x9B, 0x6E, 0xC8, 0x7A, 0x79, 0xE1, 0x67, 0x1A, 0x02, 0x00, 0xC9, 0x0D,
+    0x4F, 0xFE, 0x10, 0x39, 0x18, 0x01, 0xF4, 0xB9, 0x07, 0x10, 0x72, 0xC7, 0xCF, 0x39, 0xE4, 0xFE,
+    0x7C, 0x90, 0x2E, 0x29, 0x27, 0x7E, 0x6A, 0x64, 0x8E, 0xC6, 0x52, 0x49, 0x00, 0x15, 0x54, 0xFB,
+    0x17, 0x73, 0x19, 0x22, 0x24, 0x47, 0x9C, 0x90, 0xA3, 0xC2, 0x16, 0xAC, 0x33, 0x93, 0x1B, 0x3F,
+    0x3D, 0x7C, 0xC2, 0xB1, 0x73, 0xC4, 0xD4, 0xB5, 0xB3, 0xE0, 0x3D, 0x10, 0x8C, 0x1C, 0x93, 0xE0,
+    0xAC, 0x24, 0xB0, 0xBE, 0x45, 0xF3, 0xE6, 0x44, 0xD8, 0xEB, 0x82, 0x6D, 0x13, 0x73, 0x71, 0x2A,
+    0x56, 0xD6, 0x7C, 0x25, 0xFB, 0xD6, 0xC2, 0xE9, 0xB0, 0x8A, 0xE9, 0xEB, 0x1D, 0xA5, 0x6F, 0x19,
+    0xDD, 0x66, 0x6C, 0x24, 0xCF, 0x44, 0x06, 0x12, 0xF3, 0xC0, 0xAE, 0x21, 0x8B, 0xA1, 0xDF, 0x04,
+    0xC2, 0x1B, 0xF1, 0xA7, 0x3C, 0xF3, 0x68, 0xB9, 0xB2, 0xAF, 0x8C, 0x24, 0xBF, 0x75, 0x72, 0x60,
+    0x18, 0x06, 0x1C, 0x3F, 0x26, 0x4D, 0x3B, 0x1B, 0xFD, 0x76, 0xC6, 0x91, 0xB0, 0xB6, 0xD2, 0x5F,
+    0x67, 0xFA, 0x7D, 0xFF, 0xEC, 0xC7, 0x93, 0x7A, 0x15, 0x4F, 0xE1, 0x1C, 0x46, 0x71, 0x1E, 0x96,
+    0xBE, 0xAD, 0x2F, 0x31, 0x28, 0x71, 0xCB, 0x04, 0x21, 0xFA, 0x47, 0xB4, 0x4D, 0x8B, 0xEC, 0xD0,
+    0x78, 0xA1, 0x2B, 0x1B, 0x39, 0xDB, 0x41, 0x27, 0x14, 0x28, 0xE2, 0xA8, 0xFE, 0xAC, 0x68, 0x47,
+    0xFD, 0x7B, 0x4F, 0xE0, 0xA2, 0xC8, 0x7E, 0x83, 0x86, 0xBD, 0x73, 0x03, 0x18, 0x37, 0xDB, 0x46,
+    0x1F, 0x6B, 0x17, 0x19, 0x11, 0x0C, 0xA2, 0x14, 0x8B, 0x75, 0xB8, 0xB9, 0xEB, 0xC9, 0xD6, 0x0E,
+    0x8D, 0x78, 0x62, 0xEB, 0x51, 0x9F, 0xE7, 0xAE, 0x96, 0x83, 0x50, 0x75, 0x36, 0xF6, 0x7F, 0x30,
+    0x9B, 0x52, 0x57, 0x5B, 0x4D, 0xBC, 0x95, 0x70, 0xCA, 0x2C, 0x8E, 0x3F, 0x59, 0xE0, 0x1C, 0x21,
+    0x3F, 0x81, 0x07, 0x5B, 0x0D, 0xEB, 0x35, 0xA3, 0x04, 0x10, 0x48, 0xE8, 0x1D, 0x82, 0xEB, 0x3C,
+    0x5A, 0xCF, 0xA7, 0x96, 0x6C, 0x04, 0x80, 0x38, 0x94, 0x8A, 0x5A, 0x20, 0xDD, 0xE0, 0x84, 0x23,
+    0xEB, 0x88, 0x31, 0x1E, 0x75, 0xD5, 0x1B, 0x35, 0xE0, 0xE6, 0x79, 0xDF, 0x97, 0xCF, 0x5D, 0x9A,
+    0xDA, 0x22, 0x55, 0xD3, 0x37, 0xDC, 0x09, 0x4D, 0xE4, 0x06, 0x00, 0x4F, 0xA1, 0xD3, 0x8D, 0xFA,
+    0xDF, 0x99, 0x67, 0x10, 0x46, 0x61, 0x1D, 0x54, 0x73, 0x7D, 0x5F, 0xF6, 0x5C, 0x38, 0x67, 0xB4,
+    0x31, 0x59, 0xFF, 0xD2, 0x09, 0x28, 0x2F, 0x7C, 0x2A, 0x95, 0xA2, 0x10, 0x55, 0xED, 0xE3, 0xBA,
+    0x9D, 0x8F, 0x34, 0xB8, 0xC0, 0xC8, 0x25, 0x4D, 0xF2, 0x1C, 0x50, 0x2A, 0x60, 0xF7, 0x0D, 0x1D,
+    0x29, 0xD3, 0x26, 0xF9, 0x88, 0xDD, 0xA2, 0x62, 0x1E, 0x9E, 0x84, 0xC3, 0xB9, 0x5A, 0xAD, 0x5F,
+    0xA9, 0xAA, 0xC9, 0x00, 0xDA, 0xCD, 0x89, 0xB5, 0x33, 0xEB, 0x3B, 0x02, 0xBC, 0x86, 0xD5, 0x46,
+    0x95, 0x43, 0xC7, 0xD7, 0x5E, 0x19, 0x99, 0xD7, 0xB5, 0x5F, 0x9D, 0x60, 0x11, 0x84, 0xA0, 0xDB,
+    0x24, 0x13, 0xBD, 0x88, 0xAC, 0xBE, 0x04, 0x0E, 0x43, 0xF0, 0x6F, 0x2D, 0x28, 0xBF, 0x23, 0xA0,
+    0x27, 0xF4, 0xDF, 0xA5, 0xAD, 0x51, 0x77, 0xE3, 0x17, 0x8A, 0x4C, 0x74, 0x32, 0x70, 0x91, 0x39,
+    0xB2, 0xE6, 0xA8, 0x55, 0x87, 0xF5, 0xDD, 0x6D, 0xA6, 0x7B, 0x53, 0x1F, 0xFF, 0xFD, 0xB2, 0x97,
+    0x59, 0x8E, 0x5F, 0xB3, 0x54, 0xDB, 0xF7, 0x5C, 0x57, 0x4E, 0xDD, 0xF6, 0x36, 0x23, 0xBF, 0xBE,
+    0xB9, 0xD0, 0x2C, 0x9E, 0xDA, 0x4B, 0x33, 0x38, 0x5A, 0x25, 0xED, 0xFE, 0x00, 0x08, 0xE5, 0x64,
+    0xC3, 0x95, 0x00, 0xAA, 0x96, 0xD3, 0xA9, 0x39, 0xB8, 0xE4, 0x47, 0x72, 0x6C, 0xEB, 0x1A, 0x93,
+    0x37, 0x9E, 0xD6, 0x1E, 0x5C, 0x6D, 0xDB, 0x74, 0x42, 0x16, 0x95, 0x44, 0x7E, 0x3B, 0xAE, 0xBC,
+    0x02, 0x15, 0x93, 0xB9, 0x07, 0xBF, 0xFD, 0x4B, 0xD2, 0x94, 0xF2, 0x35, 0xFD, 0xA1, 0x44, 0x37,
+    0x74, 0xFB, 0x45, 0x46, 0x83, 0x39, 0x1D, 0xA8, 0xE9, 0xE8, 0x9C, 0x67, 0x55, 0xEC, 0x2C, 0x59,
+    0xF8, 0x3E, 0x6A, 0x54, 0x75, 0x23, 0x1F, 0x90, 0xCE, 0x6A, 0xAA, 0x5C, 0x80, 0x93, 0x6E, 0x6D,
+    0x2C, 0xC3, 0x5A, 0xF2, 0xA2, 0x93, 0x97, 0xAA, 0x7F, 0xAA, 0x76, 0x0B, 0x59, 0x6D, 0x39, 0x38,
+    0x32, 0x00, 0xA1, 0xF5, 0x39, 0x94, 0x60, 0x9D, 0xD3, 0xE6, 0xF8, 0xF8, 0x14, 0xC4, 0x6D, 0x47,
+    0x21, 0x66, 0x43, 0xE4, 0xCB, 0x07, 0x0D, 0xBD, 0xD9, 0x55, 0xDD, 0x03, 0x75, 0x90, 0x91, 0x38,
+    0x3F, 0x32, 0xE6, 0x73, 0x34, 0xC9, 0xC0, 0x87, 0x3A, 0xC5, 0x62, 0x25, 0x1D, 0x74, 0xB8, 0x0D,
+    0xA5, 0xED, 0xAF, 0x20, 0xC1, 0x0D, 0xA6, 0x2C, 0x78, 0xC2, 0x46, 0xEA, 0x05, 0xDE, 0x06, 0x47,
+    0x8D, 0xE2, 0x42, 0x1B, 0x4F, 0x44, 0xEE, 0x83, 0x1A, 0xD7, 0x66, 0x49, 0xBE, 0xD0, 0x8C, 0x58,
+    0x73, 0xF1, 0x9F, 0x97, 0x74, 0x11, 0xA6, 0x4A, 0x07, 0xDA, 0xA5, 0x75, 0x3D, 0x4A, 0x0F, 0x0D,
+    0x06, 0x56, 0xB2, 0x5F, 0x5A, 0x8E, 0x2A, 0x1C, 0x38, 0x72, 0xBF, 0xC4, 0xD1, 0x06, 0x55, 0xB2,
+    0x73, 0xC0, 0x9D, 0x5F, 0x2F, 0x9B, 0x07, 0x17, 0xA7, 0x44, 0xA0, 0x0A, 0x0E, 0xE4, 0x72, 0xB7,
+    0x70, 0x2E, 0x1E, 0x82, 0x76, 0x63, 0xB5, 0xC1, 0x8F, 0x03, 0x6C, 0xEE, 0x80, 0x3C, 0x86, 0xE1,
+    0x8E, 0x56, 0xD7, 0x14, 0x37, 0x77, 0x93, 0x9C, 0xB6, 0xE0, 0xFC, 0x49, 0x64, 0x56, 0x77, 0xAE,
+    0x4E, 0xB0, 0x28, 0xBA, 0x5B, 0x49, 0x5A, 0xB8, 0x83, 0xD8, 0x6B, 0xE5, 0x41, 0x7A, 0x65, 0x8C,
+    0xC1, 0x71, 0xDD, 0x97, 0x01, 0xA8, 0x9A, 0xAD, 0xC8, 0x43, 0xAB, 0xA6, 0xDC, 0x71, 0xD7, 0x9A,
+    0xCB, 0x99, 0x5F, 0xCA, 0x4D, 0x75, 0xC7, 0xE4, 0x20, 0x0A, 0x12, 0xE5, 0x45, 0x64, 0x19, 0x7E,
+    0x32, 0x50, 0x67, 0x22, 0x5C, 0x88, 0xA4, 0xAB, 0x30, 0x97, 0x42, 0xF7, 0xE6, 0x17, 0x35, 0xD5,
+    0xFE, 0xF3, 0x51, 0xD3, 0x6F, 0x2A, 0xB6, 0x01, 0x9B, 0x80, 0x4F, 0x86, 0x1F, 0xA7, 0x2B, 0xF5,
+    0x84, 0xD9, 0xBB, 0x0E, 0xE6, 0x2A, 0x05, 0x22, 0xBE, 0xFF, 0x21, 0xCD, 0xFD, 0xCD, 0x85, 0x62,
+    0xAC, 0xC3, 0xC1, 0x99, 0xDD, 0x8F, 0xDB, 0xCD, 0xDC, 0xD5, 0xA7, 0x08, 0x75, 0x9B, 0x3F, 0x44,
+    0xB9, 0x91, 0xE9, 0xF0, 0x56, 0x59, 0x33, 0x9F, 0xC3, 0xBD, 0x08, 0x04, 0x17, 0x93, 0x3C, 0x41,
+    0x66, 0x14, 0x20, 0x44, 0x01, 0x46, 0xEB, 0x05, 0x10, 0xBF, 0x6A, 0xAF, 0x4E, 0x44, 0x8C, 0xE1,
+    0xBB, 0xB9, 0x86, 0x64, 0x64, 0xB4, 0xDE, 0x7C, 0x17, 0x92, 0xD3, 0x9B, 0x98, 0x23, 0xAA, 0x8C,
+    0x15, 0xE8, 0xBC, 0xEC, 0xDA, 0x58, 0x3D, 0x8F, 0x53, 0x66, 0x66, 0xA1, 0x87, 0xD1, 0x75, 0x56,
+    0xFD, 0x9F, 0x6C, 0x72, 0x65, 0xDF, 0x2D, 0x48, 0x58, 0x44, 0xD4, 0x6D, 0xD4, 0x47, 0xFD, 0x4C,
+    0xF1, 0xBA, 0x76, 0x55, 0xD5, 0x35, 0x76, 0x97, 0x1D, 0x25, 0x8B, 0x20, 0xEA, 0x70, 0x6B, 0x7B,
+    0x8A, 0x44, 0xA0, 0xC6, 0x04, 0x14, 0xD1, 0x91, 0x50, 0x5E, 0x8E, 0xDC, 0xBC, 0xF9, 0xEA, 0xC2,
+    0xF7, 0x08, 0x0B, 0x20, 0x46, 0x8F, 0x44, 0x2F, 0xD8, 0xAF, 0x16, 0xD8, 0x9A, 0xEA, 0x7A, 0x93,
+    0x22, 0xAB, 0x3D, 0x6B, 0x82, 0x81, 0x3D, 0xE8, 0x3B, 0x33, 0xA4, 0x2E, 0x6D, 0x4B, 0x24, 0xFD,
+    0x00, 0x9C, 0xA6, 0x6F, 0x84, 0xC0, 0xE8, 0xDE, 0x66, 0x8C, 0xDF, 0x10, 0xE0, 0x13, 0xF1, 0x6C,
+    0xC6, 0x2E, 0x29, 0xD9, 0xB3, 0x77, 0xB4, 0x5E, 0xFB, 0xE9, 0x10, 0x89, 0xC5, 0x23, 0x36, 0x1C,
+    0x59, 0xD8, 0xE4, 0x78, 0x45, 0x00, 0xCB, 0xC8, 0x31, 0xE1, 0x5A, 0x78, 0x6E, 0x05, 0x56, 0x82,
+    0xF0, 0x66, 0x4A, 0x40, 0xA4, 0x49, 0xA8, 0x3A, 0xF0, 0x32, 0x55, 0xAD, 0x21, 0xE8, 0x56, 0xDB,
+    0x4C, 0xB5, 0xD4, 0x45, 0x89, 0x57, 0x53, 0xFC, 0x65, 0x23, 0xA7, 0xF0, 0x78, 0x61, 0xC6, 0x4A,
+    0x32, 0x1F, 0x95, 0xAE, 0x69, 0x46, 0x28, 0xBF, 0xB4, 0x88, 0xD7, 0x18, 0xF6, 0xD3, 0xBE, 0xD4,
+    0x00, 0x8C, 0x44, 0x17, 0xDC, 0xA1, 0x65, 0x06, 0xF4, 0xE4, 0x9D, 0x51, 0x40, 0x49, 0x30, 0xD1,
+    0x5A, 0x09, 0xE6, 0xBD, 0x2A, 0x16, 0x47, 0xDD, 0x14, 0x68, 0xF4, 0xED, 0xEB, 0xD5, 0xF2, 0xF5,
+    0xF3, 0x1C, 0xEC, 0xCF, 0x89, 0x10, 0x9C, 0xDF, 0x26, 0x4C, 0xD7, 0x50, 0xE6, 0x0F, 0x8B, 0x64,
+    0x86, 0x36, 0x05, 0x35, 0x6C, 0xED, 0x80, 0x9E, 0x68, 0x1E, 0x44, 0x1D, 0xF7, 0x4C, 0xD9, 0xC2,
+    0xEB, 0x81, 0x6A, 0xB3, 0xA0, 0xE4, 0xFC, 0x06, 0x84, 0x5B, 0xFE, 0x8A, 0x82, 0xE4, 0xD0, 0x20,
+    0x11, 0x78, 0x0F, 0xD5, 0xDC, 0x4B, 0x6F, 0xCA, 0xCE, 0x2B, 0xB4, 0x0A, 0x67, 0x1A, 0x19, 0x19,
+    0xA0, 0x06, 0x5C, 0x56, 0xC1, 0x45, 0xA7, 0x3E, 0xDC, 0xD2, 0x41, 0x59, 0x75, 0x59, 0x7E, 0xCB,
+    0xB7, 0x0B, 0x9C, 0x44, 0xA8, 0x81, 0x6C, 0xF7, 0x89, 0x49, 0x67, 0x11, 0xCF, 0xB8, 0x0D, 0x44,
+    0x87, 0x97, 0x97, 0xDC, 0x44, 0xF8, 0x37, 0x93, 0xE4, 0x14, 0xAC, 0xF7, 0xB1, 0x64, 0xA4, 0x2C,
+    0xDF, 0xC5, 0x04, 0xB1, 0x99, 0x9B, 0x6F, 0x85, 0x7F, 0x77, 0x11, 0xF6, 0x70, 0x6A, 0xF6, 0xE4,
+    0x54, 0xE7, 0xEC, 0xBC, 0x29, 0xE8, 0x11, 0x0A, 0x24, 0x8F, 0xB6, 0xC7, 0xE8, 0x76, 0x65, 0x54,
+    0x05, 0x54, 0x80, 0x46, 0x4D, 0xA9, 0x8A, 0xF8, 0x6E, 0x46, 0x01, 0x7B, 0xD6, 0x42, 0x74, 0x54,
+    0x43, 0xE9, 0xC7, 0xE5, 0x1E, 0xAB, 0x28, 0x66, 0xF7, 0x0A, 0xF0, 0x86, 0x71, 0x7B, 0x05, 0x50,
+    0xDF, 0xAB, 0x7D, 0x19, 0x04, 0x5D, 0x48, 0x31, 0xD2, 0xE1, 0x75, 0x3C, 0xFF, 0xDB, 0x4A, 0xC1,
+    0xAA, 0x63, 0xEE, 0x2C, 0xF9, 0x79, 0x11, 0x1E, 0x09, 0xCF, 0x86, 0x86, 0x0B, 0x4E, 0xD1, 0x94,
+    0x13, 0x3F, 0x29, 0xE5, 0x81, 0xA8, 0x12, 0x41, 0xF3, 0xF3, 0x83, 0x2B, 0x2F, 0xF4, 0x18, 0x10,
+    0x43, 0x16, 0x95, 0xD7, 0xF8, 0x3E, 0x32, 0x9E, 0x2E, 0x93, 0x08, 0xE3, 0x80, 0xD0, 0x52, 0xDD,
+    0x68, 0x71, 0x82, 0x2A, 0x16, 0x02, 0xBF, 0xE1, 0x45, 0x93, 0x2A, 0x98, 0x49, 0x87, 0x2A, 0x3C,
+    0xDF, 0xA0, 0xCD, 0x4C, 0x64, 0x8A, 0xAE, 0xBC, 0x39, 0x71, 0xF8, 0xBA, 0xE6, 0xAB, 0x21, 0x60,
+    0x34, 0x74, 0x54, 0x99, 0xCD, 0x9F, 0x94, 0xB6, 0xE7, 0x62, 0x3A, 0xB7, 0x4D, 0xCB, 0x27, 0xE4,
+    0xC8, 0x92, 0xF5, 0x45, 0x6E, 0x32, 0x91, 0x15, 0x8C, 0x4E, 0x10, 0x76, 0x1A, 0x93, 0x2C, 0x4E,
+    0xBD, 0xDA, 0x27, 0x3F, 0x99, 0xAA, 0xB7, 0x3D, 0xF0, 0xFB, 0x34, 0xB2, 0xD2, 0x7A, 0x23, 0xBA,
+    0xCF, 0xF4, 0xDE, 0xDB, 0xCC, 0x8C, 0xB1, 0x2D, 0x4A, 0xD6, 0xCA, 0xC0, 0xD8, 0x70, 0x58, 0xBC,
+    0x9E, 0x22, 0x92, 0xAB, 0xD8, 0xFB, 0xE7, 0xBC, 0xEB, 0x81, 0xB3, 0x77, 0x70, 0x31, 0x86, 0xE1,
+    0x79, 0xD8, 0x52, 0xD0, 0x6D, 0x39, 0x14, 0x78, 0x73, 0x52, 0x96, 0xE5, 0xBC, 0x2E, 0x42, 0x90,
+    0x43, 0x2D, 0x81, 0x31, 0x01, 0xE1, 0xA4, 0x59, 0x83, 0x6E, 0xB5, 0x02, 0x8F, 0x53, 0xD0, 0x04,
+    0x82, 0x0B, 0x60, 0xF0, 0xC6, 0x5F, 0xE4, 0x07, 0x6C, 0x8E, 0xF3, 0xC9, 0x15, 0x15, 0x38, 0xB6,
+    0x1A, 0x17, 0x0A, 0x52, 0xEF, 0xEF, 0xDC, 0x03, 0x4E, 0x62, 0x5E, 0xF6, 0x7E, 0xAD, 0xCA, 0x52,
+    0xA6, 0xBC, 0x21, 0xC9, 0x0A, 0x15, 0xAB, 0xA6, 0xDF, 0x6C, 0xB1, 0xF9, 0xC6, 0xF3, 0x53, 0x3B,
+    0xA9, 0x87, 0x06, 0x62, 0x18, 0xBA, 0x06, 0x23, 0xC8, 0xA8, 0x72, 0xC7, 0x89, 0x1E, 0x1D, 0xEC,
+    0x5E, 0x46, 0xB9, 0xBE, 0x38, 0x04, 0x0B, 0x29, 0x69, 0x60, 0x97, 0x2E, 0x6F, 0x6A, 0x7F, 0x7A,
+    0xDD, 0x9C, 0x4A, 0x60, 0x2D, 0x19, 0x16, 0x1A, 0xD6, 0x25, 0xAB, 0x17, 0x44, 0x5E, 0x51, 0x5B,
+    0xC3, 0x4D, 0x36, 0xC0, 0xEE, 0xA3, 0x8B, 0x10, 0x78, 0x4D, 0xC3, 0x00, 0xB5, 0x07, 0x19, 0xA4,
+    0xC0, 0x3C, 0x99, 0x4B, 0x70, 0x48, 0xBB, 0x53, 0xFB, 0x21, 0x4D, 0x9B, 0x2B, 0x4C, 0x75, 0x6D,
+    0x0B, 0x86, 0x49, 0x27, 0x76, 0x61, 0x1D, 0xBB, 0x8C, 0x9F, 0xCB, 0x3B, 0xF6, 0x2F, 0x63, 0x64,
+    0x65, 0x2C, 0x38, 0x9E, 0xE7, 0x12, 0x85, 0xA7, 0x29, 0x48, 0xE9, 0xC6, 0xDB, 0x2D, 0xA6, 0x54,
+    0x5A, 0xD5, 0xE0, 0xB6, 0x77, 0xA1, 0x78, 0x84, 0x52, 0xD7, 0xC1, 0x5B, 0x9D, 0x0D, 0x8A, 0x70,
+    0x3E, 0x72, 0x6A, 0x5D, 0x63, 0x0D, 0xEF, 0x97, 0x68, 0x78, 0x1F, 0x35, 0xDA, 0x98, 0x6E, 0x25,
+    0x05, 0xCC, 0xF3, 0xC0, 0x1E, 0x4F, 0xD2, 0x29, 0xE4, 0x26, 0xC2, 0x32, 0xE6, 0xA0, 0x65, 0xFE,
+    0x3E, 0xDB, 0x71, 0xAB, 0x85, 0x79, 0xAB, 0xC9, 0x8D, 0xD1, 0x8A, 0xF2, 0xA2, 0x62, 0xE7, 0x4F,
+    0xC5, 0xCD, 0x09, 0x94, 0xFD, 0xF0, 0x0E, 0xA2, 0x3D, 0x98, 0x8E, 0x65, 0x35, 0x5F, 0xC8, 0xD5,
+    0xCC, 0xE2, 0xED, 0x3B, 0x50, 0xB5, 0x52, 0x57, 0xB1, 0x04, 0xA1, 0x6E, 0x48, 0x58, 0xE5, 0x61,
+    0x75, 0x8D, 0xD2, 0x34, 0x21, 0x62, 0xC3, 0xD2, 0x0C, 0x51, 0xF1, 0x2B, 0xD4, 0xF7, 0xA7, 0x04,
+    0xE7, 0x22, 0x7B, 0xC0, 0xF0, 0x14, 0xFF, 0x3F, 0xAD, 0x46, 0xED, 0xF3, 0xC1, 0xC6, 0x4D, 0xE7,
+    0x95, 0x86, 0x60, 0xE3, 0x6E, 0x01, 0xE8, 0x96, 0xEF, 0x85, 0xF3, 0xC0, 0x8C, 0xF1, 0x7D, 0x70,
+    0x4E, 0x69, 0x5C, 0x06, 0xD0, 0xF9, 0x71, 0x0D, 0x9C, 0x6F, 0x5F, 0xC9, 0xFC, 0x27, 0x32, 0x13,
+    0x0A, 0xA2, 0x79, 0x31, 0x91, 0x19, 0xFE, 0x50, 0xA5, 0x49, 0xC5, 0x39, 0x9E, 0x7C, 0xD6, 0x89,
+    0xF9, 0x85, 0x1D, 0x08, 0x1A, 0xD1, 0xF1, 0xA5, 0x9C, 0x35, 0xE9, 0x24, 0x12, 0xDC, 0x15, 0x89,
+    0x30, 0xB9, 0x99, 0xEF, 0x54, 0x79, 0xCC, 0x68, 0x78, 0xFE, 0x77, 0xDE, 0x51, 0xAD, 0x89, 0x7A,
+    0x4C, 0x31, 0x29, 0x1D, 0x70, 0x45, 0x80, 0xC6, 0x7D, 0xA4, 0xFD, 0xE4, 0x86, 0xA0, 0xA2, 0x4A,
+    0x31, 0x17, 0xA9, 0xD0, 0x08, 0xCC, 0xF9, 0xEF, 0x3C, 0x71, 0x1A, 0xEE, 0xFA, 0x94, 0x83, 0x1D,
+    0x2B, 0xEF, 0x19, 0x00, 0xD0, 0x43, 0xB8, 0x10, 0x35, 0x63, 0x06, 0x9D, 0xA8, 0xFC, 0xF9, 0xC3,
+    0x07, 0x39, 0x48, 0x0E, 0x86, 0x95, 0x80, 0xD2, 0x9E, 0xB0, 0x9E, 0x89, 0x96, 0x2D, 0x58, 0x5D,
+    0xD6, 0x88, 0x77, 0xEB, 0x64, 0xC0, 0xA2, 0xB6, 0xCD, 0x96, 0x7D, 0xE2, 0xC8, 0x21, 0x93, 0x65,
+    0x51, 0xF1, 0x17, 0xAE, 0xB7, 0xF8, 0xBF, 0x90, 0x54, 0x40, 0xE0, 0x9C, 0xD0, 0xDE, 0xD7, 0xFC,
+    0x18, 0x55, 0x6B, 0x58, 0x0C, 0x17, 0xC7, 0xA3, 0x06, 0x93, 0x9B, 0x2F, 0x68, 0x7E, 0x7D, 0x0F,
+    0x0C, 0xC8, 0x6F, 0xC5, 0xDB, 0x37, 0xA1, 0x46, 0xE4, 0xDA, 0x1E, 0x66, 0x06, 0xF3, 0x24, 0xB0,
+    0x05, 0xA2, 0x16, 0x76, 0x2D, 0xA4, 0xA2, 0x27, 0x18, 0x56, 0x63, 0x92, 0xD8, 0xED, 0x9D, 0xA7,
+    0x3A, 0xC0, 0xA8, 0xFE, 0x24, 0x0F, 0x06, 0xC4, 0x05, 0x74, 0xA5, 0x31, 0xA0, 0x42, 0xFC, 0x59,
+    0xD0, 0xC3, 0x79, 0x6E, 0x1D, 0x6E, 0x35, 0xFC, 0xBB, 0x58, 0x20, 0x0D, 0x5B, 0xA6, 0xAF, 0xBD,
+    0x07, 0x81, 0xBC, 0xBE, 0x52, 0x37, 0x20, 0x4C, 0x0D, 0x6A, 0x28, 0xE6, 0x12, 0x3D, 0x0B, 0x84,
+    0xE1, 0xBE, 0x4F, 0x93, 0x56, 0x5A, 0xCB, 0x82, 0x23, 0x8C, 0xF1, 0xF9, 0xB1, 0xEB, 0xAC, 0x5C,
+    0x88, 0xB4, 0xC0, 0xF8, 0x6A, 0x78, 0x40, 0x13, 0x43, 0xA3, 0xB9, 0xE3, 0x65, 0xE8, 0xAA, 0x0A,
+    0xC3, 0xCB, 0x19, 0x9A, 0x7B, 0x76, 0xBA, 0x2A, 0xBF, 0x48, 0xAF, 0xFA, 0x9A, 0xFD, 0x69, 0x46,
+    0x27, 0x7F, 0x34, 0xF8, 0x9F, 0x89, 0x87, 0xB8, 0x5E, 0x34, 0xCE, 0x40, 0x9E, 0xE7, 0x0E, 0xC1,
+    0x29, 0x27, 0x5F, 0xD4, 0xEB, 0x5F, 0x3A, 0xD3, 0x20, 0xD7, 0xCC, 0x4B, 0x04, 0x22, 0xD5, 0x48,
+    0x3B, 0x87, 0x7E, 0x80, 0x31, 0xD0, 0xCF, 0xEB, 0x9E, 0xAB, 0xAE, 0xF0, 0x98, 0x5B, 0x50, 0xC3,
+    0xED, 0x5A, 0xF9, 0xF8, 0xC6, 0xA2, 0xF9, 0x6E, 0x32, 0x22, 0x46, 0x74, 0x01, 0x55, 0xE2, 0x40,
+    0xA2, 0x0D, 0x15, 0xEA, 0x4B, 0x67, 0x9A, 0x61, 0x5E, 0x10, 0x40, 0x43, 0xE8, 0xDF, 0x81, 0xB3,
+    0x4C, 0x0C, 0x27, 0x1F, 0x04, 0x74, 0x5F, 0x49, 0x3E, 0x81, 0x6F, 0x52, 0xC8, 0x4A, 0xD7, 0x0F,
+    0xD8, 0xCB, 0x6F, 0x0B, 0x76, 0xBE, 0xB2, 0x64, 0xE0, 0x02, 0x08, 0xC6, 0x9E, 0x17, 0xDC, 0x37,
+    0x76, 0xD4, 0x94, 0xE4, 0xAC, 0xA0, 0x7A, 0x06, 0x4A, 0x48, 0x30, 0x16, 0x54, 0x5B, 0xB8, 0x03,
+    0x4D, 0x83, 0x67, 0x56, 0x2F, 0x37, 0xFD, 0xC7, 0xC3, 0x60, 0xCC, 0xF9, 0x9D, 0x71, 0x9F, 0x0F,
+    0xE4, 0xDE, 0x4F, 0xE1, 0xE0, 0x4A, 0xF5, 0xEB, 0xB1, 0x19, 0x92, 0xDF, 0x20, 0x9D, 0x7E, 0x99,
+    0x0A, 0x06, 0xB6, 0x90, 0x25, 0x3A, 0x6E, 0x21, 0x10, 0x8F, 0x71, 0xAF, 0x7B, 0x26, 0xB3, 0x48,
+    0x85, 0x1E, 0x37, 0x14, 0x16, 0x6C, 0x71, 0x2A, 0xED, 0x0A, 0x73, 0xFB, 0x9B, 0x8B, 0x30, 0xC6,
+    0x6B, 0xE5, 0xCD, 0x29, 0x4B, 0xE3, 0x16, 0xC7, 0x8B, 0x97, 0x24, 0xE6, 0xD6, 0x5D, 0x4C, 0x66,
+    0xAE, 0xE6, 0x28, 0xC3, 0x79, 0x93, 0xE5, 0x38, 0xE9, 0x83, 0x9C, 0x3B, 0xAC, 0x90, 0x8F, 0x7C,
+    0x73, 0x4E, 0xA7, 0xC9, 0x56, 0x39, 0x75, 0x20, 0xE1, 0x94, 0x4A, 0x34, 0x99, 0xF1, 0x6D, 0x47,
+    0xD5, 0x51, 0x24, 0x0A, 0xD3, 0x3B, 0xB6, 0x4F, 0x87, 0xD2, 0x8C, 0x3E, 0xAE, 0xCD, 0xC0, 0xBA,
+    0xCA, 0x51, 0xAC, 0x56, 0xBD, 0xB5, 0xAA, 0xAC, 0xA4, 0xB0, 0xC5, 0x7E, 0xD8, 0x7B, 0x50, 0xC2,
+    0x8B, 0x0F, 0xCE, 0x14, 0xEB, 0xB6, 0x0C, 0x0A, 0x0F, 0x2D, 0xE0, 0xFF, 0x8D, 0x3C, 0xCE, 0x0E,
+    0x98, 0xF3, 0x97, 0x44, 0x28, 0xE8, 0x6C, 0x0B, 0x90, 0x7F, 0xAB, 0xD1, 0xB6, 0xA2, 0xDE, 0x7F,
+    0x49, 0x30, 0x52, 0x45, 0x90, 0x8F, 0xB2, 0x3E, 0x50, 0x3E, 0x24, 0x72, 0x11, 0xB8, 0xB6, 0x20,
+    0x69, 0xC1, 0x85, 0x54, 0xD4, 0x33, 0x46, 0xEC, 0x99, 0xDD, 0x21, 0xB9, 0x37, 0x2A, 0x81, 0xD0,
+    0xC2, 0xC8, 0x19, 0xEC, 0x95, 0x7B, 0x5E, 0xC5, 0xBC, 0x08, 0x53, 0x36, 0xD9, 0xE1, 0x51, 0x50,
+    0xD3, 0x7B, 0xB2, 0xDA, 0xF9, 0x33, 0x92, 0xBF, 0x17, 0x28, 0xF4, 0x1C, 0x5E, 0x35, 0x4C, 0x74,
+    0xD4, 0x82, 0xFA, 0xBA, 0xBE, 0x89, 0x81, 0x44, 0x10, 0xBE, 0x9D, 0x2E, 0xBA, 0x40, 0xF0, 0x83,
+    0xE3, 0x42, 0xF4, 0x5F, 0x4D, 0x2A, 0xFD, 0xC5, 0x5D, 0xF1, 0xCE, 0x83, 0x20, 0xD6, 0xEF, 0xBF,
+    0xB1, 0xBB, 0xC4, 0xC7, 0x53, 0x69, 0x10, 0x80, 0x65, 0x73, 0xBF, 0xCE, 0x0A, 0x41, 0x03, 0xEF,
+    0x4A, 0xB4, 0xA7, 0x23, 0x7D, 0x6C, 0xE8, 0x5F, 0x2F, 0x44, 0x96, 0xD9, 0xD3, 0x10, 0xA5, 0xF7,
+    0xAA, 0x5C, 0x18, 0xA0, 0x31, 0x00, 0xB9, 0xB2, 0xD9, 0x12, 0x1C, 0x4B, 0x22, 0x66, 0xCF, 0xED,
+    0xB8, 0xC3, 0xF7, 0xE6, 0x1A, 0xF5, 0xCE, 0xA4, 0xEB, 0xED, 0x69, 0xE8, 0x38, 0xA0, 0x9F, 0x47,
+    0x3E, 0x4C, 0x51, 0xDC, 0xFB, 0x4B, 0x34, 0xBC, 0xFA, 0xD4, 0x52, 0xFC, 0x11, 0x6F, 0xBA, 0x3E,
+    0x06, 0x82, 0x4B, 0x06, 0x8F, 0x8A, 0x66, 0x2C, 0xAE, 0x9B, 0x5F, 0x1D, 0x74, 0x46, 0xBF, 0x9B,
+    0xB3, 0x94, 0x7A, 0xE2, 0xEE, 0x68, 0xB4, 0x91, 0x37, 0x44, 0x8A, 0xF6, 0x2C, 0xC5, 0x99, 0x7E,
+    0x68, 0x3A, 0xED, 0x2E, 0x05, 0x0B, 0xBF, 0xCB, 0x99, 0x31, 0xBC, 0xBD, 0x96, 0x26, 0x2F, 0x11,
+    0xA3, 0xEC, 0x67, 0x3D, 0xBF, 0x08, 0x02, 0xAB, 0x12, 0x43, 0x39, 0x60, 0xCE, 0xCF, 0x35, 0xE8,
+    0x88, 0xC6, 0x57, 0xA4, 0x7A, 0x35, 0x80, 0x48, 0x3C, 0x6C, 0xC9, 0x9B, 0xDA, 0xE5, 0xB3, 0x48,
+    0x51, 0x92, 0x7B, 0x8B, 0x45, 0xFB, 0x5F, 0x88, 0xDB, 0x95, 0x73, 0xC2, 0x43, 0xD2, 0x92, 0xA3,
+    0x34, 0x0F, 0xCB, 0x83, 0x90, 0x78, 0xE6, 0x7A, 0x45, 0x9C, 0xEA, 0xD5, 0x03, 0xCC, 0xEB, 0xB3,
+    0x74, 0xE2, 0x0E, 0x9A, 0xB5, 0xFB, 0xF2, 0x48, 0x5C, 0x3E, 0xB1, 0x67, 0x0C, 0xB8, 0x6C, 0x36,
+    0x08, 0x84, 0xC6, 0x4C, 0x82, 0x98, 0xE4, 0xD8, 0x1D, 0x58, 0x15, 0xAC, 0xC4, 0x41, 0xF7, 0x9D,
+    0x08, 0x64, 0x4A, 0xE9, 0x74, 0x7E, 0x3B, 0x91, 0xC1, 0xE3, 0x9A, 0x0E, 0x81, 0x5C, 0xD1, 0x5C,
+    0x7A, 0x95, 0x02, 0xD4, 0x28, 0x30, 0xD4, 0xE0, 0xAE, 0xB8, 0xF1, 0x7B, 0xCF, 0xAC, 0x50, 0x90,
+    0xEF, 0x8F, 0x18, 0xD1, 0x9A, 0x19, 0x6F, 0x41, 0x65, 0xCB, 0x28, 0xBD, 0x9C, 0xB6, 0x27, 0x65,
+    0x8B, 0xB5, 0xB8, 0x08, 0xC7, 0x41, 0xBC, 0xF2, 0x63, 0x6D, 0x9C, 0xD7, 0x69, 0x03, 0xBF, 0xB0,
+    0x7B, 0x04, 0xCC, 0xFD, 0x74, 0xA0, 0xBD, 0x81, 0x08, 0x86, 0x4F, 0x42, 0x25, 0xD2, 0x4A, 0x66,
+    0x49, 0x3E, 0xD0, 0x7A, 0x3D, 0x54, 0xCB, 0x50, 0x94, 0xF3, 0x7F, 0x3A, 0xF2, 0x91, 0xE6, 0x5E,
+    0x11, 0xC6, 0xA4, 0x76, 0x97, 0xC3, 0x6C, 0x21, 0x0E, 0xB6, 0xBA, 0x10, 0x4A, 0xE3, 0xDC, 0xDC,
+    0x43, 0x3B, 0xF0, 0x0B, 0x47, 0x65, 0xB9, 0xD7, 0x0B, 0x32, 0xFD, 0xF5, 0x51, 0x03, 0xEA, 0x8C,
+    0x01, 0x65, 0xC4, 0x6B, 0x25, 0xF1, 0xC2, 0x3A, 0x09, 0x65, 0x1D, 0x58, 0xDE, 0xF4, 0x2B, 0xC7,
+    0x67, 0x30, 0x04, 0x08, 0x0A, 0x7A, 0x3A, 0x4B, 0xE4, 0xE7, 0xE8, 0xBE, 0xFF, 0x05, 0x42, 0xFC,
+    0xE0, 0x1F, 0xAE, 0xA8, 0x75, 0xBA, 0xE9, 0xDC, 0x8C, 0xBD, 0x30, 0xB8, 0x1D, 0x04, 0x57, 0xD3,
+    0x93, 0x1A, 0x43, 0x93, 0xFE, 0x5D, 0x6A, 0x28, 0xBE, 0xE0, 0x39, 0xB2, 0xCC, 0xF0, 0x7D, 0x06,
+    0x4C, 0x95, 0xFC, 0x62, 0xC7, 0x05, 0xEB, 0x16, 0x88, 0x2B, 0x0E, 0x96, 0xF1, 0xC7, 0x43, 0xC2,
+    0xB7, 0xE9, 0x2F, 0xEC, 0xA0, 0x5C, 0x9A, 0xD7, 0x26, 0x64, 0x69, 0xDB, 0x13, 0x25, 0xD8, 0x43,
+    0xE0, 0x5B, 0x0B, 0xA1, 0xE4, 0xB0, 0xF2, 0x4E, 0x6A, 0x9C, 0xF4, 0x7B, 0x9E, 0xE3, 0xB7, 0xD4,
+    0xC6, 0x10, 0xF2, 0x37, 0x45, 0x8A, 0x6B, 0x97, 0x28, 0x2E, 0x0E, 0xA0, 0x93, 0x13, 0xF7, 0x0B,
+    0x8A, 0xB9, 0x9F, 0xC0, 0xE4, 0x4A, 0xED, 0xE1, 0x79, 0x32, 0x31, 0x97, 0x2B, 0xB7, 0x09, 0xB5,
+    0xB9, 0xE3, 0x57, 0x56, 0x5F, 0x81, 0x28, 0x85, 0xAA, 0xF8, 0x69, 0x77, 0x40, 0x74, 0xD6, 0x4B,
+    0x7A, 0xAC, 0xD5, 0x2D, 0x74, 0xB4, 0x67, 0x89, 0xE1, 0xF1, 0xD9, 0x1F, 0xB8, 0xDC, 0xDF, 0x0D,
+    0x8D, 0xA6, 0xA7, 0x8D, 0xF1, 0x59, 0x30, 0xD6, 0x00, 0x26, 0xD1, 0x21, 0x2E, 0xE7, 0xB7, 0x91,
+    0x2E, 0xA9, 0xF6, 0xD0, 0x5A, 0xB6, 0x8A, 0x34, 0x59, 0x92, 0x9E, 0x37, 0x1E, 0xD9, 0x38, 0x2A,
+    0xAE, 0x12, 0xD4, 0x95, 0x8B, 0xE8, 0xA7, 0x5D, 0x8C, 0x92, 0xA1, 0x8A, 0x4D, 0x9E, 0x64, 0x20,
+    0xA2, 0x7E, 0xCC, 0x39, 0x50, 0xA4, 0x01, 0xEC, 0xA7, 0xF5, 0x6D, 0x88, 0x8E, 0xB6, 0xCE, 0xA4,
+    0x58, 0xAA, 0xFB, 0xCA, 0xC5, 0x67, 0x26, 0x07, 0xBB, 0xEC, 0xFB, 0x73, 0x5D, 0x48, 0x9B, 0x49,
+    0xFE, 0x99, 0x25, 0x6D, 0x82, 0x1F, 0x6E, 0x6E, 0x1E, 0x21, 0xBF, 0x94, 0x52, 0xB7, 0xAC, 0x8E,
+    0x74, 0x22, 0x10, 0x27, 0x14, 0x6F, 0xDC, 0x80, 0xBD, 0xB3, 0xD6, 0xAD, 0x1F, 0x17, 0x59, 0x6B,
+    0x42, 0x68, 0xBD, 0x37, 0xCF, 0xC6, 0x46, 0x11, 0x64, 0x9E, 0xEB, 0xF5, 0xCD, 0xA2, 0x5F, 0x3F,
+    0xC8, 0x0E, 0x1F, 0xCC, 0xFA, 0xE0, 0x59, 0xC4, 0x82, 0x8B, 0x8E, 0xC4, 0x8C, 0x96, 0x56, 0xF5,
+    0x16, 0x2A, 0x53, 0x0E, 0x36, 0xC9, 0x61, 0x34, 0x3F, 0x0F, 0x73, 0xC3, 0xD9, 0x0C, 0x3B, 0x74,
+    0xD5, 0x97, 0x3F, 0x2D, 0x1B, 0xCF, 0x1F, 0xD2, 0xFC, 0xFF, 0xBC, 0xFB, 0x9E, 0xE7, 0x5D, 0x30,
+    0x5D, 0x9C, 0x66, 0x06, 0x26, 0xD3, 0x0A, 0x4E, 0x4C, 0x45, 0xA8, 0xE6, 0x23, 0x0A, 0xE1, 0x3A,
+    0x31, 0x39, 0xC0, 0x01, 0x9D, 0x19, 0xD3, 0x2A, 0x28, 0xD7, 0x43, 0x40, 0x38, 0xC5, 0xA9, 0xCC,
+    0x80, 0x71, 0xAF, 0xDC, 0xEF, 0x4E, 0x85, 0xC0, 0xBE, 0x56, 0xC1, 0x54, 0xA6, 0xDE, 0x30, 0xE4,
+    0xF9, 0xD0, 0x1B, 0x40, 0x6A, 0x61, 0x2B, 0x5C, 0x2B, 0xF6, 0x16, 0x99, 0xD7, 0x62, 0xC2, 0x59,
+    0x81, 0x87, 0xFB, 0x93, 0x45, 0xEE, 0x38, 0xB8, 0xE7, 0xDD, 0x37, 0xC0, 0x76, 0xC9, 0x0D, 0x17,
+    0x06, 0x34, 0xD3, 0xB3, 0x6E, 0x88, 0x26, 0x99, 0x48, 0x0E, 0x67, 0x46, 0xE3, 0xE4, 0x22, 0x97,
+    0xFA, 0xD3, 0xC3, 0x66, 0xD1, 0x08, 0x17, 0x93, 0xDD, 0xC9, 0xC6, 0x41, 0xC7, 0x12, 0x4F, 0x83,
+    0xB8, 0xCC, 0x60, 0xA0, 0x24, 0xB7, 0x17, 0x16, 0x31, 0xC6, 0x42, 0xEB, 0xEC, 0x48, 0xE1, 0xEB,
+    0x75, 0x54, 0x75, 0xE8, 0x01, 0xF6, 0x42, 0x67, 0xF1, 0x46, 0xF7, 0xB7, 0x2A, 0x22, 0x88, 0x20,
+    0xAC, 0xCF, 0xA3, 0x27, 0x36, 0x38, 0xD0, 0x70, 0x99, 0xD5, 0x63, 0xA3, 0xF7, 0x05, 0x25, 0x52,
+    0x82, 0x04, 0x02, 0xED, 0xBD, 0x13, 0x9F, 0xCE, 0x89, 0xD0, 0x6E, 0xE2, 0x85, 0xBB, 0xEC, 0x7B,
+    0xFA, 0x6C, 0x88, 0x4B, 0x57, 0xD4, 0xC7, 0xCA, 0x5A, 0x01, 0x6A, 0x6C, 0xD9, 0x75, 0x1E, 0x89,
+    0x26, 0xFA, 0x4A, 0x0E, 0x1F, 0x2B, 0xA9, 0x97, 0xDB, 0x19, 0x4E, 0xD4, 0x55, 0x5C, 0x3D, 0xF2,
+    0xDB, 0xD7, 0x5B, 0x60, 0x9E, 0x12, 0x4A, 0x62, 0x45, 0xE7, 0xBB, 0x0E, 0xEF, 0x67, 0x99, 0x68,
+    0xAA, 0x0E, 0x2B, 0x49, 0x82, 0x8D, 0x7E, 0x4C, 0xA4, 0x78, 0x08, 0xC3, 0xAE, 0x79, 0xF4, 0x39,
+    0xC1, 0xEC, 0x00, 0xB4, 0x9D, 0x7C, 0x40, 0xFC, 0x6B, 0xBC, 0x16, 0xDB, 0xD8, 0xC4, 0x48, 0x5B,
+    0x63, 0x16, 0xF6, 0xCE, 0xAA, 0x99, 0xC8, 0xF2, 0x87, 0x2A, 0x05, 0xAD, 0x31, 0xB8, 0xA0, 0x1D,
+    0xA0, 0xA2, 0x03, 0x0C, 0x54, 0xD5, 0x7B, 0x0C, 0xBF, 0x35, 0x70, 0x57, 0xCD, 0xE3, 0xB0, 0x57,
+    0xE8, 0xBE, 0x7A, 0x95, 0xDF, 0xDF, 0xAB, 0x11, 0x55, 0x86, 0xA3, 0x27, 0x6E, 0x0B, 0x7B, 0xF0,
+    0xAD, 0x2E, 0xEE, 0xF8, 0xD6, 0x10, 0xC8, 0x4D, 0x68, 0xCE, 0xA7, 0x86, 0xFC, 0x45, 0xC1, 0x1E,
+    0x4E, 0x56, 0x61, 0x1E, 0xE8, 0x2C, 0xCA, 0x0D, 0x51, 0xD2, 0x2C, 0xC3, 0x7E, 0xCF, 0xB3, 0x96,
+    0x1B, 0xEA, 0xD6, 0x0B, 0x2D, 0x86, 0xDD, 0x8C, 0xAA, 0xAF, 0x1B, 0x4C, 0x4A, 0xA7, 0xA1, 0x53,
+    0x5F, 0x8D, 0xB6, 0x0A, 0x3F, 0x5C, 0xA8, 0x23, 0x33, 0xCB, 0x92, 0xEA, 0x1A, 0xEF, 0xBD, 0x2F,
+    0x89, 0xA1, 0x5C, 0x73, 0x3D, 0xDE, 0x51, 0x64, 0xC5, 0x52, 0xA7, 0x92, 0xBC, 0x1D, 0xCA, 0xBA,
+    0xC8, 0xFC, 0x2C, 0x1A, 0x69, 0x44, 0x71, 0xFE, 0xAB, 0x2A, 0x2E, 0xBB, 0x02, 0x92, 0xED, 0x90,
+    0x01, 0xBC, 0x44, 0x7F, 0x6F, 0x76, 0x1E, 0x30, 0xDC, 0x4D, 0x3D, 0xBC, 0x01, 0xD1, 0x1E, 0xE5,
+    0x71, 0x0E, 0xA6, 0x7D, 0xE1, 0xD5, 0xA6, 0x08, 0xA6, 0x66, 0x9F, 0x0F, 0xAC, 0x11, 0x96, 0x66,
+    0x13, 0x03, 0x9F, 0x4C, 0x0E, 0x8A, 0x2A, 0x4C, 0x39, 0xF0, 0xC6, 0x8E, 0x41, 0x9B, 0x23, 0xDD,
+    0xDB, 0x7B, 0x94, 0x71, 0x6C, 0x78, 0x1B, 0xA6, 0xC1, 0xA8, 0x9B, 0xA5, 0x86, 0x0E, 0x02, 0x97,
+    0x72, 0x2F, 0xE8, 0xE0, 0x01, 0x64, 0x39, 0x8C, 0x6C, 0x4F, 0x64, 0x24, 0x34, 0x81, 0x33, 0x6D,
+    0xC6, 0x56, 0x60, 0x23, 0x8C, 0xB1, 0xA3, 0x11, 0x94, 0x37, 0xEF, 0xE4, 0x3E, 0x4D, 0xAF, 0x61,
+    0x2C, 0xF8, 0x86, 0x03, 0xFB, 0x25, 0xA3, 0x0F, 0xFA, 0x04, 0x3F, 0x72, 0x10, 0xF1, 0xE6, 0x71,
+    0x13, 0x8A, 0xD7, 0xD3, 0x04, 0x92, 0x46, 0x4A, 0x31, 0xAB, 0x5A, 0x1D, 0x16, 0x68, 0x77, 0x26,
+    0x9C, 0x28, 0x86, 0x27, 0xD9, 0x60, 0xCA, 0x74, 0x41, 0x90, 0xB6, 0x0C, 0x91, 0xB1, 0x1E, 0x82,
+    0xD9, 0x81, 0x63, 0x00, 0x2A, 0xA0, 0x07, 0x74, 0x62, 0x3B, 0xBD, 0x5B, 0x9C, 0xA0, 0x6E, 0xE0,
+    0x55, 0x9B, 0x0A, 0x60, 0x84, 0x92, 0x7E, 0xB1, 0xF1, 0xFC, 0x36, 0x97, 0xF8, 0x92, 0xAF, 0x3B,
+    0xD1, 0x2A, 0xBF, 0x4E, 0xFD, 0x68, 0xC2, 0xF5, 0x89, 0xED, 0xE8, 0x4A, 0x44, 0xA0, 0x66, 0x50,
+    0xDF, 0x4F, 0x6B, 0x9D, 0x1C, 0x98, 0xA4, 0xF4, 0x22, 0x9F, 0x51, 0x17, 0x46, 0x4F, 0xFC, 0x07,
+    0xAD, 0xE6, 0x24, 0xF9, 0x5F, 0x9F, 0x56, 0x49, 0x6A, 0x15, 0x39, 0xCA, 0x68, 0x98, 0xAF, 0xF1,
+    0x3F, 0xFB, 0x60, 0x36, 0xDC, 0xB7, 0xD4, 0x27, 0x1F, 0x98, 0xDD, 0x6B, 0x21, 0x72, 0x1C, 0x4F,
+    0x4C, 0x93, 0xC4, 0x01, 0xA4, 0x9C, 0xB7, 0x02, 0xC3, 0xFE, 0xCA, 0xC0, 0x8D, 0xD5, 0xBA, 0x09,
+    0xB9, 0xAF, 0x1C, 0xB0, 0x08, 0x09, 0x36, 0x70, 0x91, 0x08, 0xF5, 0x1B, 0x14, 0xE9, 0x81, 0xB1,
+    0xD1, 0xA0, 0x94, 0x4C, 0x73, 0x46, 0xBB, 0x7C, 0xFA, 0xB9, 0xE7, 0x31, 0x94, 0xFD, 0xCE, 0x97,
+    0xDB, 0x52, 0x32, 0x11, 0x72, 0xD7, 0x1C, 0xDE, 0x97, 0xBE, 0x19, 0xD9, 0xCB, 0xCC, 0xEF, 0x0F,
+    0x2C, 0x90, 0xEA, 0xED, 0x1F, 0x07, 0x10, 0xD4, 0x4E, 0xDF, 0x3F, 0x92, 0x29, 0x57, 0x22, 0x7A,
+    0x18, 0xB0, 0xE1, 0xDE, 0x76, 0x61, 0xF3, 0xBA, 0x84, 0xD4, 0x7D, 0x9C, 0x92, 0x7B, 0x0B, 0xC2,
+    0x7F, 0x6A, 0xF5, 0x5E, 0x77, 0xD6, 0xBB, 0xF5, 0x23, 0x1D, 0xCE, 0x52, 0xFA, 0x21, 0x33, 0xD1,
+    0x33, 0x38, 0x65, 0x34, 0xCE, 0x8C, 0x25, 0x9D, 0xF4, 0x95, 0xF1, 0x71, 0x17, 0xE6, 0x08, 0x96,
+    0xEA, 0x54, 0xA1, 0xA1, 0xEB, 0xFD, 0x90, 0xAE, 0x63, 0x42, 0xC0, 0x8B, 0x57, 0xD4, 0x64, 0xDF,
+    0xB9, 0xF1, 0xB2, 0x8A, 0xAD, 0x42, 0x64, 0x99, 0xF4, 0x3E, 0x72, 0xDB, 0xE1, 0x18, 0xF2, 0x28,
+    0x0A, 0xDD, 0xB9, 0x8D, 0x66, 0xC2, 0xB1, 0x02, 0xDC, 0xAB, 0x31, 0x2E, 0x42, 0xC8, 0x7A, 0xC0,
+    0xD2, 0x82, 0x7B, 0x2E, 0xBA, 0x25, 0x07, 0x51, 0xB6, 0xC2, 0xDC, 0x75, 0x84, 0x5B, 0xB5, 0x43,
+    0x36, 0x37, 0x26, 0x8B, 0x89, 0x77, 0x50, 0xC3, 0x49, 0xC0, 0xA1, 0x41, 0xDC, 0xAA, 0x84, 0x32,
+    0x4E, 0x77, 0xE5, 0xC3, 0xF2, 0x2E, 0xD8, 0xA0, 0x29, 0x64, 0xAA, 0x4A, 0x43, 0x90, 0xBA, 0xB1,
+    0x84, 0xFB, 0x9D, 0x40, 0x82, 0x97, 0x01, 0xFE, 0x22, 0x40, 0x54, 0x06, 0x68, 0x9A, 0x9E, 0xB6,
+    0x29, 0x21, 0xFB, 0x9F, 0xD4, 0x3A, 0x23, 0xDC, 0xAC, 0xB6, 0x7F, 0x19, 0xC8, 0x01, 0x12, 0x40,
+    0xDB, 0xFB, 0xA1, 0x93, 0xAD, 0xD2, 0x03, 0xFA, 0xB3, 0xA1, 0x47, 0x49, 0x8E, 0x8E, 0xA2, 0xF8,
+    0xDA, 0xB8, 0xDA, 0xF8, 0x55, 0x2E, 0x8D, 0x91, 0x8E, 0x8C, 0x03, 0x1C, 0x6D, 0x9F, 0x09, 0x41,
+    0x4B, 0x0A, 0x20, 0xDF, 0x6C, 0x1E, 0x07, 0x33, 0x39, 0xDC, 0xFE, 0x4F, 0xD1, 0xC9, 0xFE, 0xC1,
+    0x44, 0x38, 0x95, 0x88, 0xE6, 0xAA, 0x20, 0x43, 0x3A, 0x23, 0xBB, 0x05, 0x47, 0x34, 0x26, 0x19,
+    0xD0, 0x9F, 0x7B, 0x3F, 0x6D, 0x10, 0x36, 0xBD, 0xC1, 0x96, 0x4B, 0xB2, 0x2B, 0x25, 0x36, 0xD3,
+    0x79, 0x74, 0x1D, 0xDD, 0x88, 0x8D, 0x05, 0x4A, 0xF1, 0xA6, 0xC6, 0x62, 0xE7, 0x28, 0x06, 0xD7,
+    0x34, 0x73, 0x2F, 0xB8, 0xDE, 0x3C, 0xB3, 0xAA, 0x69, 0xBD, 0xDA, 0x1A, 0x30, 0xE8, 0x59, 0x44,
+    0x81, 0xCB, 0xCF, 0xAA, 0xE0, 0xD0, 0x1B, 0x7C, 0xC6, 0x0E, 0xD7, 0x24, 0x12, 0xA9, 0x86, 0xB7,
+    0xC3, 0x73, 0xA4, 0x87, 0x35, 0xC5, 0x6D, 0x44, 0x41, 0x30, 0xC0, 0x53, 0xF3, 0x15, 0x12, 0x12,
+    0xEA, 0xA0, 0x50, 0x95, 0xA4, 0x8A, 0xC3, 0x4B, 0xB1, 0xC1, 0xA8, 0xB6, 0x20, 0x63, 0x00, 0x8B,
+    0x77, 0x29, 0x30, 0x51, 0x60, 0x87, 0x7C, 0x0E, 0x80, 0x3C, 0x7A, 0xB3, 0x56, 0x82, 0x99, 0xEC,
+    0xA2, 0x9D, 0x87, 0xE0, 0x8A, 0x7B, 0xF9, 0x88, 0x74, 0xEF, 0xE6, 0x95, 0xC4, 0x58, 0xFD, 0x85,
+    0xAF, 0xBD, 0x16, 0xFD, 0xAD, 0x5D, 0x5F, 0xFB, 0xE7, 0xCC, 0xD0, 0x50, 0x59, 0x80, 0x2B, 0x12,
+    0x2F, 0xB2, 0x2E, 0xC0, 0xEB, 0x6C, 0xF9, 0xE9, 0x95, 0xA7, 0x7E, 0xD5, 0xBD, 0x07, 0x68, 0xFB,
+    0x09, 0xF3, 0xF9, 0x6F, 0xF2, 0xE1, 0x40, 0x78, 0x9D, 0xD1, 0xA4, 0x85, 0xFF, 0x8F, 0x2E, 0x85,
+    0x87, 0xF2, 0xAA, 0x77, 0xD8, 0xFC, 0xF9, 0x96, 0x74, 0xB0, 0xB4, 0x1E, 0x3C, 0x2C, 0x17, 0x63,
+    0x3B, 0x03, 0xF0, 0xF0, 0xC9, 0x29, 0x57, 0x11, 0x81, 0xF8, 0x1B, 0x68, 0x03, 0x40, 0x53, 0x0C,
+    0x75, 0x4C, 0x93, 0x6D, 0xC4, 0x5D, 0x40, 0xD0, 0x91, 0xAC, 0xA1, 0x6E, 0x5F, 0xDD, 0x0F, 0x51,
+    0xB8, 0x77, 0x2D, 0x0E, 0x71, 0x45, 0x53, 0x2A, 0x10, 0x83, 0x4A, 0xFA, 0x1B, 0xE7, 0x51, 0x8E,
+    0xE0, 0xDF, 0x54, 0xBF, 0xBF, 0xA8, 0x6E, 0xC2, 0xA9, 0x15, 0x1D, 0x15, 0x15, 0x21, 0x9A, 0x9F,
+    0x72, 0x00, 0x0C, 0xB3, 0xD6, 0xF6, 0xF6, 0x25, 0x73, 0xE6, 0x27, 0xFD, 0x24, 0xF4, 0x06, 0x63,
+    0x21, 0x40, 0x0F, 0x38, 0x24, 0xDC, 0x78, 0x7A, 0x5A, 0x60, 0x50, 0xA6, 0xAD, 0x1D, 0x02, 0x27,
+    0x60, 0xC5, 0x2B, 0x11, 0x6B, 0xD3, 0x44, 0x52, 0x25, 0xAC, 0x90, 0x8C, 0x8E, 0xBD, 0x77, 0xC7,
+    0xB7, 0x14, 0x8D, 0xDB, 0xF4, 0xBD, 0xD0, 0xED, 0x4F, 0x76, 0xFE, 0x0C, 0x5E, 0x81, 0x63, 0x49,
+    0xDD, 0x27, 0x79, 0xD3, 0xEF, 0x12, 0x64, 0xD5, 0x84, 0x99, 0xA4, 0x16, 0x25, 0xC6, 0xE2, 0xAC,
+    0xD5, 0xC4, 0x8C, 0xBA, 0x42, 0x12, 0x21, 0x96, 0x53, 0xFF, 0xC2, 0xCB, 0x12, 0x98, 0xEB, 0xEC,
+    0x0E, 0x72, 0xE3, 0x4A, 0x15, 0x5F, 0x61, 0xAF, 0xA4, 0x60, 0x43, 0x3F, 0x79, 0x17, 0xC6, 0xCF,
+    0x9B, 0x48, 0x4C, 0x49, 0x74, 0xC6, 0x64, 0x92, 0x6C, 0x41, 0xD4, 0xBB, 0xB9, 0x9D, 0x17, 0xA1,
+    0x68, 0xF1, 0x6E, 0xD5, 0x5E, 0xD6, 0xD9, 0xF6, 0xDA, 0xD8, 0x36, 0xC1, 0x3E, 0xC2, 0xF2, 0x85,
+    0xBC, 0x9B, 0x05, 0xE0, 0xD5, 0x15, 0xCF, 0x00, 0xBC, 0xD1, 0x1F, 0xCE, 0x50, 0x47, 0x37, 0xFE,
+    0x57, 0x7A, 0xCB, 0x1C, 0x2E, 0x36, 0x79, 0xC4, 0xDC, 0x1C, 0x11, 0x84, 0xDF, 0xD0, 0xF2, 0x7A,
+    0x02, 0xDD, 0x37, 0x5E, 0xD0, 0x4A, 0x11, 0x0D, 0x59, 0x8F, 0xDD, 0xEB, 0xF6, 0x1D, 0xE6, 0x0D,
+    0x58, 0x18, 0x7D, 0xD4, 0x4D, 0x3D, 0x1B, 0xD5, 0x13, 0xB1, 0xD4, 0xBB, 0x50, 0x56, 0x29, 0xB1,
+    0x78, 0xCA, 0xC9, 0xC3, 0xA4, 0x10, 0x67, 0xFA, 0x48, 0x13, 0x12, 0xAB, 0xB5, 0xDA, 0x45, 0x72,
+    0x6A, 0x41, 0x11, 0x6B, 0xA9, 0xBF, 0x93, 0xFA, 0x47, 0x6D, 0x46, 0xE4, 0xAE, 0x58, 0xED, 0x5D,
+    0xF3, 0x38, 0x57, 0xED, 0x49, 0xB7, 0x6A, 0x15, 0xC9, 0xBA, 0x05, 0xF2, 0xA5, 0x9D, 0xC0, 0x0A,
+    0x31, 0x02, 0xC4, 0x70, 0x33, 0x4E, 0x5D, 0x29, 0x02, 0x5B, 0x99, 0xEF, 0x2A, 0x1B, 0xD6, 0x90,
+    0xA9, 0xF1, 0x9A, 0x52, 0x09, 0xD4, 0xFD, 0xF7, 0x5F, 0x50, 0xA1, 0x78, 0xD5, 0xA0, 0x69, 0xBE,
+    0xD7, 0x61, 0x5E, 0x97, 0x16, 0x33, 0xBD, 0x25, 0x2B, 0x9F, 0x25, 0x49, 0x6C, 0x9B, 0x5B, 0xB7,
+    0x8A, 0x9F, 0x54, 0x46, 0x2C, 0x3F, 0xC9, 0xFA, 0xB8, 0xD0, 0xA3, 0x35, 0xBB, 0xF1, 0x7D, 0x4A,
+    0x74, 0xEC, 0x6F, 0xD3, 0x14, 0xB3, 0x5E, 0x92, 0xFB, 0xF2, 0xE8, 0x41, 0x0A, 0xD2, 0x33, 0xF0,
+    0x73, 0x5B, 0x36, 0x9A, 0x70, 0x97, 0x6E, 0x60, 0x54, 0xFD, 0x27, 0x79, 0xC0, 0x4B, 0x1C, 0x86,
+    0x22, 0xAA, 0xA0, 0x14, 0x9D, 0xF6, 0x79, 0x3A, 0xC3, 0x5C, 0xC4, 0xAC, 0xB2, 0xBC, 0x4D, 0xCC,
+    0xDC, 0xE0, 0x48, 0xB7, 0x8E, 0xBD, 0x49, 0x08, 0x15, 0xB2, 0xA7, 0x05, 0xF9, 0x15, 0x18, 0x79,
+    0xF1, 0x5F, 0xEA, 0xB8, 0x53, 0x5B, 0xA2, 0xD8, 0x7E, 0xA7, 0x0A, 0x28, 0x1B, 0x0E, 0x21, 0x10,
+    0x02, 0xB9, 0xAA, 0x62, 0x1E, 0x17, 0x12, 0x31, 0x8A, 0x60, 0x70, 0x90, 0x66, 0xFF, 0x83, 0x3F,
+    0x39, 0x97, 0x75, 0xE3, 0x8D, 0x51, 0xA8, 0x0A, 0xA4, 0x9C, 0x1F, 0x73, 0x91, 0x8F, 0x8A, 0x9D,
+    0x17, 0x7C, 0x43, 0x33, 0x1C, 0xE8, 0x29, 0x73, 0xA2, 0x3D, 0x2C, 0x43, 0x07, 0x9B, 0x6D, 0xB2,
+    0x7F, 0x4E, 0x16, 0x6D, 0x94, 0x5D, 0x3F, 0xC4, 0x0E, 0xEF, 0xEB, 0x0F, 0x71, 0x04, 0x2F, 0x99,
+    0xCD, 0x50, 0x81, 0x23, 0x2A, 0x9C, 0xB0, 0x74, 0x63, 0x94, 0x8E, 0x41, 0x29, 0x93, 0x2B, 0x20,
+    0x8B, 0xC8, 0x75, 0x34, 0xEB, 0x11, 0x4C, 0x4F, 0xDA, 0x1A, 0x8B, 0xE5, 0x87, 0xA6, 0xB0, 0x57,
+    0xE2, 0x3F, 0x58, 0x68, 0xA3, 0xC0, 0x2E, 0x48, 0x92, 0x4B, 0x9A, 0xE1, 0xFD, 0xF3, 0x22, 0x66,
+    0x8B, 0xF6, 0xCA, 0x10, 0xBA, 0x83, 0x0C, 0x50, 0x68, 0x73, 0xD0, 0x21, 0x06, 0x2E, 0xAD, 0x68,
+    0x2F, 0x11, 0x1E, 0x31, 0x38, 0x8D, 0xCF, 0x3E, 0xD7, 0x68, 0x08, 0xE3, 0xD2, 0x47, 0x7B, 0x71,
+    0x68, 0xF6, 0x4F, 0x11, 0x36, 0x97, 0xD9, 0x2A, 0xCF, 0x87, 0x0A, 0xCB, 0x5E, 0xE7, 0x1C, 0x1B,
+    0x02, 0x7F, 0x58, 0x4F, 0x16, 0x3E, 0x5E, 0x28, 0x9E, 0xB4, 0x3B, 0x20, 0x5C, 0x9B, 0x6D, 0x25,
+    0x4B, 0x72, 0xE1, 0xA5, 0x38, 0xC1, 0x7F, 0x69, 0x0A, 0x60, 0x42, 0xAB, 0x24, 0x86, 0x09, 0xAA,
+    0x5D, 0x9E, 0x65, 0xF8, 0xC7, 0x6A, 0xCD, 0x31, 0x14, 0xBC, 0xC0, 0x45, 0x80, 0x68, 0x09, 0xA2,
+    0x77, 0xD6, 0x4B, 0x95, 0xD4, 0xF4, 0x58, 0xF0, 0xAB, 0x2F, 0x79, 0x77, 0x59, 0x74, 0x38, 0xD5,
+    0x69, 0xB8, 0x77, 0x32, 0x92, 0x2A, 0x49, 0x96, 0xBE, 0x40, 0x31, 0x4F, 0xC5, 0xCD, 0x9B, 0xA1,
+    0xD6, 0xB9, 0xCE, 0xF6, 0x4B, 0x01, 0x87, 0xE1, 0x0E, 0x55, 0x40, 0x13, 0xE5, 0x42, 0x01, 0xC8,
+    0x78, 0x90, 0x6F, 0xA9, 0x5B, 0x65, 0x79, 0xA0, 0x84, 0x85, 0x3B, 0x42, 0x73, 0x2D, 0x7C, 0xBA,
+    0x2B, 0x7F, 0x19, 0xEB, 0x8D, 0x9D, 0x82, 0xA6, 0xE5, 0x10, 0x0A, 0x5A, 0xAB, 0xA1, 0x1B, 0xD8,
+    0x87, 0xAB, 0xC5, 0x70, 0x78, 0xC1, 0xBC, 0xF6, 0x5C, 0xFC, 0x60, 0x69, 0x5A, 0xD7, 0xE1, 0x20,
+    0x50, 0xCB, 0xDD, 0x55, 0x1E, 0x80, 0x1F, 0x0A, 0x97, 0x65, 0x86, 0x02, 0xD4, 0x6C, 0x2E, 0x08,
+    0xB8, 0xB0, 0x26, 0x78, 0xB9, 0xB3, 0x6D, 0x57, 0x9E, 0x21, 0x37, 0x01, 0xDB, 0xEF, 0x49, 0x4D,
+    0x66, 0xE0, 0x7C, 0xCB, 0xCC, 0xD9, 0xAC, 0xEE, 0xF2, 0xCE, 0xA5, 0x8E, 0x15, 0x4F, 0x1C, 0x83,
+    0x3C, 0xC8, 0xD0, 0x88, 0x7E, 0x66, 0xCE, 0xA9, 0xBA, 0x32, 0x97, 0x15, 0x5F, 0x8B, 0xBC, 0x9E,
+    0x1C, 0x14, 0x55, 0x9A, 0xBC, 0x4E, 0x4A, 0x6B, 0xB0, 0xE0, 0xF0, 0xDB, 0x3A, 0x64, 0x14, 0x75,
+    0xAC, 0x14, 0x36, 0xE8, 0x6A, 0xB0, 0x3D, 0x7E, 0xD9, 0xB4, 0x2B, 0x1F, 0xE9, 0x50, 0xB1, 0x7C,
+    0x18, 0x05, 0xA6, 0xE2, 0x44, 0xF3, 0xCE, 0xE6, 0x4C, 0x21, 0x9E, 0x69, 0xAA, 0x22, 0x7E, 0xE2,
+    0x35, 0x76, 0x3A, 0xAE, 0x6E, 0x4E, 0x72, 0x25, 0xB5, 0x4D, 0xA4, 0xF7, 0x47, 0x82, 0x9C, 0xD5,
+    0xA0, 0x08, 0x53, 0x17, 0x74, 0xB5, 0xB4, 0xA2, 0x6F, 0x10, 0x40, 0x62, 0x47, 0xB9, 0xCE, 0x00,
+    0xC8, 0x68, 0x94, 0x9F, 0xD6, 0x7C, 0x0D, 0xD5, 0xB7, 0x8A, 0x13, 0xDE, 0x8C, 0x5B, 0x0B, 0x33,
+    0xB7, 0x15, 0xD5, 0x43, 0xAE, 0xC0, 0x87, 0x0A, 0x13, 0xF3, 0xB5, 0x1C, 0x00, 0xC7, 0xA4, 0x36,
+    0x05, 0xE4, 0xFF, 0xE2, 0x18, 0x6E, 0xF5, 0xF9, 0x0D, 0xDE, 0xDA, 0x4D, 0xC6, 0x1B, 0x0D, 0x89,
+    0xD7, 0xD5, 0x5E, 0x84, 0xDA, 0xC2, 0xAF, 0x42, 0x2D, 0x89, 0xD3, 0x69, 0x38, 0x25, 0xDB, 0xE0,
+    0xC3, 0x17, 0xCF, 0x3A, 0xB1, 0x8F, 0x60, 0x74, 0xC4, 0x3C, 0x20, 0x1B, 0xE3, 0x0C, 0x91, 0x93,
+    0xDC, 0xCB, 0x39, 0x45, 0x0E, 0xB3, 0x78, 0x52, 0xBF, 0x6A, 0x79, 0x10, 0x93, 0x67, 0x25, 0x87,
+    0xD7, 0xA6, 0x55, 0xEB, 0xC0, 0xE2, 0x04, 0x43, 0xF9, 0x25, 0x3B, 0x10, 0x95, 0xEF, 0xD5, 0x34,
+    0xB0, 0xA6, 0x67, 0x24, 0x26, 0x94, 0x71, 0x4C, 0xA5, 0x7F, 0x4E, 0xAC, 0xA7, 0x58, 0x89, 0xA1,
+    0x47, 0x47, 0x76, 0x17, 0xC0, 0x79, 0x21, 0xFE, 0x53, 0xB8, 0x55, 0xC3, 0x73, 0xF7, 0x07, 0x4C,
+    0x76, 0xEE, 0x45, 0x92, 0x72, 0x75, 0x07, 0xAE, 0x18, 0x44, 0xC0, 0x96, 0x20, 0x9F, 0xE6, 0x54,
+    0x04, 0xEE, 0x16, 0xBA, 0x4B, 0x29, 0xA9, 0x27, 0x35, 0xBE, 0x58, 0xA6, 0x32, 0x00, 0xEE, 0x7C,
+    0x8D, 0x3F, 0x4D, 0xB2, 0x1D, 0xB2, 0x0C, 0x6D, 0xC9, 0xFE, 0x26, 0x92, 0xCF, 0x50, 0xD8, 0x0F,
+    0x27, 0x00, 0xDA, 0x4A, 0xB6, 0xD5, 0xD7, 0x03, 0x8E, 0x09, 0xCA, 0x9D, 0xA8, 0xC0, 0x95, 0x6D,
+    0x7E, 0xC8, 0x36, 0x43, 0x9C, 0x41, 0x30, 0x92, 0xC6, 0x97, 0x0D, 0x6C, 0x87, 0x9F, 0xBC, 0x41,
+    0x72, 0x83, 0x6F, 0x7E, 0xCA, 0x29, 0x9B, 0x9B, 0x43, 0x7F, 0x1A, 0x1B, 0xE3, 0xEF, 0x48, 0x3B,
+    0x22, 0x3F, 0x18, 0xDA, 0x3B, 0xE6, 0xE0, 0x10, 0xCA, 0xD4, 0x0E, 0xAF, 0x56, 0xD4, 0x17, 0x20,
+    0xD8, 0x80, 0xB7, 0xCF, 0xB1, 0xE5, 0x3B, 0xE8, 0x9A, 0x5F, 0xD0, 0x16, 0x44, 0xEE, 0x3A, 0x8B,
+    0xB3, 0x23, 0x75, 0x1F, 0xBD, 0xDF, 0xE1, 0xF0, 0xFD, 0xB9, 0xEB, 0x21, 0x49, 0x16, 0x00, 0xEE,
+    0xFD, 0x87, 0x45, 0x97, 0x45, 0x68, 0xDA, 0x57, 0x01, 0x60, 0x33, 0x1A, 0x01, 0x43, 0xB2, 0x1C,
+    0xB7, 0xA6, 0xCD, 0x67, 0xFD, 0x38, 0x00, 0x44, 0x04, 0xFD, 0xA4, 0x35, 0x63, 0x58, 0x79, 0x47,
+    0x6A, 0x1B, 0x6F, 0x65, 0x7A, 0x49, 0x2E, 0xA4, 0xCE, 0xEE, 0x44, 0x78, 0xA7, 0xCB, 0x0C, 0xF1,
+    0x9E, 0x8B, 0x3E, 0xC8, 0x4E, 0xDA, 0x4F, 0x90, 0xF6, 0xA6, 0x38, 0x1C, 0x14, 0x64, 0x21, 0x16,
+    0x7C, 0x09, 0xAA, 0x52, 0x03, 0xC7, 0xBE, 0x62, 0x9E, 0xBD, 0xC6, 0x3F, 0x6A, 0x0A, 0x79, 0x24,
+    0xFD, 0x00, 0xDF, 0xCB, 0x9E, 0xC9, 0x8D, 0x56, 0xC6, 0x58, 0x81, 0x78, 0xCD, 0xA6, 0x36, 0x63,
+    0xE4, 0x78, 0x2F, 0xC8, 0xAF, 0x6E, 0xD5, 0xB4, 0xDD, 0x31, 0xE4, 0x84, 0x33, 0x4E, 0x6F, 0x4D,
+    0xE1, 0xD2, 0x87, 0x2A, 0xE3, 0xBA, 0x11, 0xBC, 0x0A, 0x4E, 0x28, 0xC9, 0x8B, 0x50, 0x6E, 0xCF,
+    0x55, 0x06, 0x63, 0x89, 0x6B, 0x45, 0x83, 0x36, 0x08, 0xA2, 0x67, 0x61, 0xBB, 0x72, 0x2F, 0xD1,
+    0xA4, 0x45, 0xD7, 0x1C, 0x1A, 0x76, 0x47, 0x43, 0xED, 0x72, 0xA7, 0x68, 0x2F, 0xEA, 0xCB, 0x04,
+    0xD0, 0x70, 0x00, 0xE9, 0xB5, 0xCA, 0xF0, 0x47, 0x5E, 0x5C, 0x28, 0x5E, 0x03, 0x88, 0xB4, 0xD6,
+    0x52, 0x6A, 0xFE, 0xFF, 0x88, 0x9C, 0x2B, 0x32, 0xD1, 0x3D, 0x9E, 0x4F, 0xD3, 0xD4, 0xA7, 0xE1,
+    0xB6, 0xB9, 0x89, 0xE7, 0xE2, 0xF7, 0xBC, 0x57, 0xD7, 0xC4, 0x20, 0xFB, 0x91, 0xC0, 0x87, 0x5E,
+    0xC4, 0x4F, 0xB7, 0x0B, 0xD4, 0x34, 0x30, 0xAC, 0x02, 0x1F, 0xC7, 0x7A, 0xBE, 0x64, 0x25, 0x34,
+    0x92, 0x12, 0x22, 0x66, 0xB5, 0x81, 0x7F, 0x6E, 0x89, 0xA6, 0x49, 0x07, 0xFA, 0xA6, 0x14, 0x80,
+    0x7A, 0x5D, 0x4D, 0x06, 0x9D, 0x57, 0x17, 0x82, 0x1B, 0x70, 0xBE, 0xFA, 0x50, 0x1A, 0x5E, 0x7B,
+    0x48, 0x11, 0xF8, 0x2F, 0xFD, 0xC0, 0xE4, 0x75, 0x57, 0xCD, 0x81, 0x57, 0xDA, 0x84, 0x1A, 0x92,
+    0x18, 0x40, 0x8A, 0xC3, 0x66, 0xCC, 0xE0, 0x93, 0x8A, 0x19, 0x30, 0x2F, 0xD5, 0x9A, 0xAD, 0x24,
+    0x8A, 0x39, 0x03, 0x45, 0xCF, 0x8E, 0xF9, 0x8C, 0x8D, 0xE1, 0x29, 0x2D, 0xDD, 0xB6, 0xA0, 0x33,
+    0xCD, 0x75, 0x99, 0x27, 0xBA, 0x20, 0x10, 0x6C, 0xEE, 0xC5, 0xFE, 0xDB, 0x86, 0x53, 0xD6, 0xCE,
+    0x48, 0x24, 0xEF, 0xB3, 0x27, 0x99, 0xFC, 0x51, 0x25, 0x52, 0x76, 0x6F, 0xCD, 0x75, 0x68, 0x7E,
+    0xD2, 0xC8, 0xB7, 0x82, 0x55, 0x5D, 0x2F, 0x30, 0xD0, 0xBF, 0x0C, 0xC6, 0xD6, 0xAB, 0xC8, 0x3A,
+    0x48, 0x76, 0x26, 0x24, 0x08, 0xBF, 0x44, 0xA2, 0x27, 0xC8, 0x3F, 0xE7, 0xD8, 0xBB, 0xD5, 0xED,
+    0x5D, 0xE4, 0xFE, 0x94, 0x9F, 0xE0, 0x13, 0xFC, 0x1B, 0xB8, 0x0D, 0xED, 0x68, 0x33, 0xE5, 0x38,
+    0xFC, 0x7C, 0x05, 0xB1, 0x74, 0xEA, 0x8E, 0xA2, 0x2F, 0x53, 0x5B, 0x9D, 0xD3, 0x53, 0x55, 0x18,
+    0x01, 0x4C, 0xFE, 0x84, 0x00, 0xF7, 0x66, 0x11, 0x4E, 0xEF, 0x45, 0xF1, 0xAE, 0xCF, 0x6B, 0x5C,
+    0x40, 0x76, 0x8B, 0xE3, 0xE0, 0x3F, 0x10, 0x14, 0x07, 0x22, 0x9C, 0xBD, 0xE0, 0xFF, 0x56, 0x2F,
+    0x62, 0xEA, 0x50, 0x50, 0xF6, 0x73, 0xA9, 0x2D, 0x3D, 0xED, 0x2B, 0x1A, 0x10, 0xB8, 0xAC, 0x07,
+    0x69, 0xB0, 0x7D, 0x42, 0x9A, 0x58, 0x18, 0xA9, 0x87, 0x04, 0x63, 0xE0, 0x64, 0x81, 0x9B, 0x17,
+    0xB1, 0x42, 0x36, 0x00, 0xA1, 0xA9, 0x1C, 0x9F, 0x03, 0xC2, 0x6E, 0xB8, 0x40, 0xC4, 0xB1, 0x40,
+    0xDB, 0x45, 0xD3, 0x47, 0xB6, 0x1A, 0x55, 0xB0, 0x91, 0x6B, 0xAE, 0xE4, 0x8C, 0x75, 0x9F, 0x6A,
+    0x1F, 0xFA, 0xD2, 0x4B, 0x7B, 0x34, 0xE3, 0xAC, 0x77, 0x66, 0x1E, 0x88, 0x2A, 0x89, 0x2E, 0x19,
+    0xF3, 0x21, 0xC5, 0xEA, 0x09, 0x99, 0xB2, 0x30, 0x9F, 0xA5, 0x6B, 0x75, 0xF0, 0xE8, 0xCB, 0x9F,
+    0xB0, 0x3E, 0x17, 0x59, 0x10, 0xDD, 0x0B, 0xA7, 0x97, 0xB4, 0x7E, 0x68, 0x26, 0x46, 0xE8, 0xA4,
+    0x88, 0x4B, 0x0C, 0xE8, 0x5F, 0x4A, 0x2F, 0x67, 0xFE, 0x70, 0x33, 0xA4, 0x55, 0x35, 0xC3, 0x85,
+    0x20, 0xBC, 0x12, 0x18, 0x85, 0x6B, 0x8D, 0x53, 0x70, 0x1F, 0xF3, 0x8E, 0x1A, 0x56, 0x6F, 0x2E,
+    0xAD, 0xC9, 0x67, 0x00, 0x28, 0x11, 0x72, 0x2D, 0xAF, 0x8D, 0x45, 0xC3, 0x86, 0xC7, 0xE9, 0xA8,
+    0xC0, 0xBB, 0x26, 0x97, 0xD5, 0xE4, 0xB7, 0xCF, 0x57, 0x01, 0x00, 0x1E, 0xBF, 0x11, 0xE2, 0xE4,
+    0x1E, 0x4D, 0xB6, 0x52, 0xC6, 0x69, 0xDE, 0xA0, 0x3A, 0xD6, 0x97, 0x38, 0x63, 0x39, 0x60, 0x17,
+    0xAC, 0xD6, 0xED, 0xFB, 0x10, 0xA9, 0xE0, 0x5E, 0x6D, 0x43, 0xC2, 0x24, 0xA8, 0xAC, 0xB8, 0xC5,
+    0xE1, 0xF5, 0xBD, 0x4B, 0x89, 0x47, 0x50, 0x9F, 0x02, 0xB4, 0x40, 0xB1, 0xFA, 0xCD, 0x48, 0x52,
+    0x68, 0xE5, 0x25, 0xE0, 0x74, 0xA2, 0x64, 0xC4, 0x7B, 0xE5, 0xF1, 0x61, 0x21, 0xA6, 0x39, 0x42,
+    0x26, 0xC1, 0x87, 0x1F, 0x6F, 0x3D, 0x68, 0x96, 0xC4, 0x74, 0xCD, 0x5E, 0xEE, 0x43, 0x6F, 0x99,
+    0x91, 0x1D, 0x30, 0x97, 0xBA, 0x7E, 0xA5, 0xA6, 0x08, 0x3B, 0x8D, 0x40, 0x61, 0xAF, 0x1B, 0xA2,
+    0x37, 0x63, 0x48, 0xD1, 0x70, 0xF6, 0xFC, 0x6A, 0xDF, 0x09, 0x82, 0x4E, 0x00, 0xD6, 0xAA, 0x31,
+    0x76, 0x98, 0x24, 0x78, 0xE3, 0x18, 0x91, 0xF6, 0x88, 0x3E, 0xA8, 0x54, 0xA1, 0x3F, 0xAD, 0xE1,
+    0x67, 0xCE, 0x3E, 0x9E, 0x82, 0x62, 0x99, 0x18, 0xF8, 0x40, 0x60, 0x22, 0x92, 0x55, 0xF6, 0xA1,
+    0x6D, 0x80, 0x69, 0xB9, 0x77, 0x40, 0xBA, 0xAC, 0x3C, 0x31, 0x32, 0xAA, 0xE8, 0x09, 0x26, 0x64,
+    0x2B, 0xE7, 0x6D, 0x19, 0x31, 0xF3, 0x88, 0xFF, 0x45, 0xF2, 0xA9, 0xD7, 0xBF, 0xDA, 0x50, 0x33,
+    0xD7, 0x83, 0x55, 0x08, 0xCA, 0xFE, 0xF6, 0x3B, 0x2A, 0x5A, 0xC4, 0xBD, 0x26, 0x35, 0xF5, 0x9D,
+    0xE8, 0xA8, 0xFE, 0x9C, 0x43, 0x0F, 0x2C, 0xFD, 0x33, 0x81, 0x08, 0x11, 0x4D, 0xE6, 0x5B, 0xB1,
+    0x96, 0xE7, 0x3A, 0x83, 0xCB, 0xEF, 0x18, 0xDE, 0xF8, 0x5B, 0x09, 0x4D, 0x61, 0x3D, 0xB5, 0xB7,
+    0xE4, 0xC9, 0x73, 0xFE, 0x5C, 0xD3, 0x57, 0x4F, 0x46, 0x6F, 0x42, 0x56, 0x85, 0xC1, 0x4A, 0x8A,
+    0xD8, 0x61, 0xA3, 0x15, 0x49, 0x66, 0xA6, 0x1C, 0xC0, 0x1F, 0xB7, 0xA9, 0x88, 0x06, 0xA4, 0x2F,
+    0xE4, 0x9A, 0xCC, 0x38, 0xE0, 0x90, 0x64, 0xB6, 0x0F, 0xE5, 0xAE, 0xB5, 0x87, 0x64, 0x1C, 0x42,
+    0x5C, 0x11, 0x01, 0xB5, 0xC2, 0x90, 0x3D, 0xAB, 0x26, 0x4B, 0x2A, 0x67, 0x9F, 0x5B, 0x5B, 0xE3,
+    0x21, 0xA0, 0xB9, 0x7D, 0x64, 0xD3, 0xF8, 0xB3, 0x77, 0x91, 0x2D, 0x34, 0x78, 0x8E, 0xB8, 0x1D,
+    0x30, 0x4B, 0xE1, 0x31, 0xFE, 0x3D, 0xE6, 0xAB, 0xDA, 0xA6, 0xB4, 0xDF, 0xB0, 0x67, 0x25, 0x57,
+    0x4A, 0x30, 0x8F, 0x86, 0x58, 0x13, 0xE6, 0xEA, 0xEE, 0x91, 0x86, 0xD2, 0x0D, 0xCD, 0x19, 0xDC,
+    0x26, 0x18, 0x86, 0x52, 0xD2, 0x77, 0x79, 0x31, 0xDA, 0xF9, 0x9A, 0xCA, 0x7B, 0xBE, 0xF6, 0x96,
+    0x61, 0xAE, 0x32, 0xC8, 0x68, 0x17, 0xFF, 0xB8, 0xF4, 0xF5, 0xE5, 0xA4, 0x20, 0xC9, 0x44, 0x8A,
+    0xD6, 0x8D, 0xB0, 0x0D, 0x3D, 0x2B, 0x47, 0x4B, 0xA5, 0x49, 0x37, 0x11, 0x18, 0x2C, 0x94, 0x37,
+    0xEB, 0x7D, 0xD6, 0x49, 0x59, 0xFD, 0x75, 0xC7, 0x6C, 0x11, 0x83, 0xBD, 0x92, 0xF4, 0xA0, 0xFD,
+    0x5D, 0x2D, 0x24, 0x42, 0x8D, 0x3E, 0x96, 0xDA, 0x4B, 0xCD, 0x85, 0xDA, 0xF4, 0x11, 0x27, 0x0F,
+    0x5B, 0xE1, 0xB4, 0x62, 0x51, 0xC6, 0x04, 0x22, 0xCD, 0x8D, 0x3D, 0x26, 0x59, 0xC9, 0xF3, 0xBF,
+    0xBD, 0x07, 0xEB, 0x3D, 0xDD, 0x41, 0x3A, 0xAE, 0x35, 0xB6, 0x9C, 0x76, 0xE6, 0xE9, 0x5E, 0x98,
+    0xF6, 0x9F, 0x9B, 0x6D, 0x9A, 0x0F, 0xF3, 0xA2, 0x5E, 0xD0, 0x37, 0x0F, 0xA7, 0xB9, 0xC1, 0xC2,
+    0xFF, 0x26, 0x59, 0x51, 0xC6, 0x27, 0x15, 0x25, 0xFD, 0x8E, 0xA0, 0xAA, 0x72, 0xD4, 0xA8, 0x13,
+    0x61, 0xE0, 0x4C, 0xD0, 0xD2, 0xCA, 0xA8, 0x85, 0x98, 0x95, 0x26, 0x68, 0x7A, 0x1D, 0xBC, 0x6D,
+    0x87, 0xF8, 0x8C, 0xEC, 0x31, 0xA7, 0x8E, 0x98, 0x1C, 0xEC, 0x51, 0xCA, 0xF7, 0x38, 0x5A, 0x03,
+    0xF1, 0x7B, 0x84, 0x9D, 0x96, 0x75, 0x30, 0x96, 0x92, 0xDD, 0x4F, 0xCD, 0xD8, 0x00, 0xA0, 0xAB,
+    0x7B, 0x52, 0x42, 0x2F, 0x0A, 0x9F, 0x28, 0x18, 0x12, 0xD7, 0x47, 0xF5, 0x83, 0xB4, 0x27, 0xA6,
+    0x5D, 0x8C, 0xB1, 0xD7, 0xC2, 0xB5, 0x3F, 0xCC, 0x31, 0xCA, 0x7C, 0xB5, 0xB5, 0x37, 0xAA, 0xCB,
+    0xA5, 0x8A, 0x2D, 0x21, 0x72, 0x24, 0xCE, 0xD6, 0x05, 0xDA, 0x32, 0x2A, 0xA9, 0x92, 0x57, 0x07,
+    0x24, 0x7C, 0x53, 0x92, 0xBA, 0x4A, 0x3D, 0xF8, 0xA9, 0xCB, 0xEC, 0x7A, 0x34, 0x4A, 0xFD, 0x2E,
+    0x3D, 0x22, 0xA1, 0x8B, 0xC4, 0x8B, 0x39, 0x8F, 0x11, 0x8E, 0x75, 0x85, 0xB3, 0x1C, 0xB3, 0x2E,
+    0x5B, 0xF6, 0xF7, 0x03, 0x88, 0x11, 0x14, 0x7A, 0x42, 0xDA, 0x25, 0x0C, 0xAD, 0x88, 0xE7, 0xC9,
+    0xE6, 0x90, 0x65, 0x13, 0x2B, 0x40, 0x20, 0xC3, 0x03, 0xCC, 0x38, 0x71, 0x5C, 0x32, 0x54, 0xFE,
+    0x42, 0x2A, 0xC8, 0x4D, 0xDB, 0x4F, 0x0F, 0x9D, 0x53, 0xEA, 0xBE, 0xA8, 0x84, 0x87, 0x63, 0x8F,
+    0xC7, 0xC5, 0xC7, 0xD9, 0x41, 0xDF, 0x53, 0x72, 0x50, 0x61, 0x9A, 0x81, 0x6B, 0x70, 0x6F, 0xE4,
+    0x98, 0xBB, 0x46, 0xEF, 0x24, 0xA6, 0xA0, 0xCB, 0x49, 0x05, 0x13, 0xA6, 0xC2, 0x1F, 0x2D, 0x1A,
+    0x2B, 0xBD, 0xA9, 0x97, 0xB4, 0xEC, 0x6C, 0x0C, 0x1C, 0xA1, 0x9E, 0xDB, 0x5E, 0x55, 0x95, 0xE0,
+    0xE1, 0xC5, 0x4E, 0x97, 0x89, 0x69, 0xDA, 0xB6, 0x5C, 0xAA, 0xF2, 0x96, 0x28, 0x7A, 0xCB, 0xA9,
+    0xCE, 0x46, 0x5E, 0x07, 0xFE, 0x73, 0x4F, 0x2C, 0x46, 0xAF, 0xFB, 0x2F, 0xC5, 0xD1, 0xB6, 0xB2,
+    0x85, 0x65, 0x1C, 0x7F, 0x72, 0xBC, 0xF9, 0x51, 0x1B, 0x02, 0xAE, 0x6A, 0x46, 0xB5, 0x39, 0x1A,
+    0x8D, 0x34, 0x84, 0x40, 0xE5, 0x1B, 0x91, 0x11, 0xE9, 0x42, 0x44, 0x56, 0x64, 0x01, 0xF5, 0xC0,
+    0x7D, 0x64, 0x37, 0x72, 0xA4, 0x7A, 0xE5, 0xD6, 0x19, 0xA6, 0xDB, 0x78, 0x23, 0x47, 0x68, 0xE5,
+    0x8D, 0x7D, 0x8C, 0xE5, 0x63, 0xF3, 0x3E, 0x07, 0xEE, 0x4E, 0x8D, 0xF1, 0x56, 0x37, 0xA4, 0x27,
+    0xDC, 0x67, 0x45, 0x84, 0x41, 0x89, 0xD2, 0x77, 0x67, 0x3C, 0x76, 0x27, 0x6B, 0x8B, 0xD2, 0x65,
+    0x6A, 0x65, 0x2B, 0xB1, 0xA6, 0x73, 0x3F, 0xD2, 0xC6, 0x78, 0x5D, 0xF9, 0xDA, 0xBD, 0x8B, 0x9F,
+    0xC0, 0x5B, 0xF2, 0xF4, 0xA6, 0x46, 0xF4, 0x5A, 0xCD, 0xDC, 0x40, 0x0E, 0x48, 0x28, 0xA2, 0x98,
+    0x87, 0xE7, 0x4F, 0x46, 0xD4, 0x6E, 0xFB, 0x6F, 0x11, 0xC5, 0x85, 0xCF, 0xDF, 0xA9, 0xBB, 0xE1,
+    0x61, 0x80, 0x41, 0xFC, 0x69, 0x8F, 0xD7, 0xDD, 0xD9, 0x8B, 0x63, 0xE2, 0x60, 0x1A, 0x0A, 0xFF,
+    0x56, 0x85, 0x6C, 0x4C, 0x0D, 0x19, 0x9E, 0xE1, 0xCB, 0xF3, 0xEB, 0x9C, 0xBF, 0x11, 0x4A, 0x0B,
+    0x23, 0xFD, 0x88, 0x93, 0x1A, 0x8B, 0xA2, 0x68, 0xD2, 0x07, 0x90, 0x11, 0xC6, 0x3D, 0xEF, 0x2C,
+    0x3C, 0x02, 0x41, 0x1F, 0x41, 0x93, 0x2B, 0x83, 0xAB, 0x2D, 0x35, 0xA4, 0x6E, 0xD7, 0x36, 0x51,
+    0x09, 0x7C, 0x23, 0x4F, 0xAD, 0xF8, 0x38, 0xF0, 0x1D, 0x98, 0x2E, 0xEA, 0x20, 0xAF, 0x10, 0x9B,
+    0x03, 0x96, 0xE0, 0x68, 0xCB, 0x01, 0xC2, 0xAF, 0x4B, 0x70, 0xB0, 0x6F, 0xB6, 0xBC, 0x71, 0xA8,
+    0x57, 0x32, 0x26, 0x98, 0x23, 0xAD, 0xC6, 0x07, 0xE8, 0xDF, 0xB6, 0xC8, 0x83, 0xF6, 0x17, 0xFD,
+    0x4C, 0xDA, 0xB7, 0x1D, 0xA4, 0x92, 0xCE, 0xAD, 0x4B, 0xB8, 0xD2, 0xBB, 0xC4, 0x2E, 0x9C, 0xE3,
+    0x40, 0x31, 0xF1, 0xF8, 0x1A, 0xC7, 0x55, 0x99, 0x08, 0xAE, 0xFF, 0xD1, 0x39, 0x74, 0x4F, 0x87,
+    0x6A, 0x26, 0xBC, 0x36, 0x5D, 0x2C, 0x25, 0x53, 0x0B, 0x18, 0x15, 0x7F, 0xA3, 0x2A, 0x45, 0xC4,
+    0x9A, 0xE2, 0xEF, 0xDC, 0xDC, 0xF1, 0x9D, 0xE9, 0x5E, 0xD9, 0xD5, 0x54, 0x89, 0x6D, 0x5A, 0xCE,
+    0x8D, 0x22, 0x16, 0xF1, 0xD7, 0x36, 0xB9, 0x9A, 0xB0, 0xF4, 0xCD, 0xEF, 0xE6, 0x0C, 0x3A, 0x5D,
+    0x09, 0x22, 0xF6, 0x45, 0xD7, 0x02, 0x55, 0x01, 0x02, 0x7A, 0x4F, 0xBB, 0x22, 0x6A, 0x87, 0x66,
+    0x62, 0xD0, 0x1D, 0x54, 0x72, 0xB2, 0xD8, 0x0A, 0x7E, 0x60, 0xC1, 0x1D, 0x68, 0xEA, 0xFB, 0x6A,
+    0xE3, 0x5F, 0x97, 0xC5, 0xFD, 0xEB, 0x08, 0x2C, 0x50, 0x96, 0xB8, 0xC1, 0x9D, 0x5E, 0x1E, 0x3E,
+    0x46, 0xA6, 0x49, 0x57, 0xC8, 0xBD, 0xB1, 0xD6, 0xD5, 0x21, 0x2A, 0x03, 0x84, 0x65, 0x24, 0x11,
+    0xB0, 0xF0, 0x0F, 0xF4, 0x04, 0x52, 0x43, 0xBA, 0xEA, 0x93, 0xBA, 0x9F, 0x34, 0x26, 0x1F, 0xD7,
+    0x1F, 0x7B, 0xC0, 0x30, 0x01, 0x69, 0x68, 0x9B, 0x21, 0x13, 0xA5, 0xD4, 0x87, 0x30, 0xDC, 0xEB,
+    0x35, 0x39, 0x76, 0x35, 0xB9, 0xE3, 0xDF, 0xCD, 0xB5, 0xE5, 0x89, 0xEA, 0x54, 0x1F, 0x3E, 0xDB,
+    0x90, 0xCF, 0x5C, 0x4A, 0x96, 0x97, 0x32, 0x3F, 0x6F, 0xB4, 0xE5, 0x28, 0xDF, 0xE4, 0xCA, 0xB1,
+    0x1B, 0x78, 0x65, 0x2C, 0x99, 0x3D, 0x77, 0x32, 0x5F, 0x6C, 0x6D, 0xD3, 0x53, 0x67, 0x15, 0x39,
+    0xFD, 0xE1, 0x2A, 0xB0, 0x48, 0x24, 0x4D, 0x36, 0x4D, 0x90, 0x9F, 0xF3, 0x1D, 0x4F, 0x9D, 0x3B,
+    0xBE, 0x64, 0xFE, 0xF0, 0xF2, 0xAE, 0x31, 0xB2, 0xBE, 0x35, 0x8E, 0x34, 0xD6, 0x56, 0xAB, 0xF2,
+    0x45, 0xC4, 0x37, 0x65, 0xA0, 0x08, 0x66, 0x5D, 0x9F, 0x0D, 0x96, 0x0B, 0x58, 0xC2, 0x18, 0x00,
+    0x43, 0xBA, 0xC4, 0xFE, 0xD3, 0x6C, 0x96, 0x78, 0xAE, 0x10, 0x2D, 0x86, 0x4D, 0x8F, 0x87, 0x44,
+    0xCF, 0x8E, 0x1D, 0x23, 0x00, 0x8D, 0x8A, 0x91, 0x28, 0xDE, 0x13, 0xF1, 0x2B, 0xBC, 0x75, 0x32,
+    0xB3, 0x50, 0xDB, 0xD3, 0x5A, 0xA5, 0x2A, 0x28, 0x82, 0x70, 0x4B, 0xF9, 0x77, 0x70, 0xC5, 0x5D,
+    0x4A, 0x52, 0x43, 0x4C, 0x1D, 0x6E, 0xB5, 0x6A, 0x41, 0x65, 0xFF, 0xF2, 0x67, 0xC2, 0x86, 0x85,
+    0x0C, 0x95, 0x25, 0xAB, 0x61, 0x3E, 0x79, 0x0A, 0x2F, 0x3F, 0xBB, 0x4A, 0xC7, 0x33, 0xEE, 0x2E,
+    0x04, 0xD6, 0x44, 0xCE, 0x40, 0xB9, 0xFA, 0xF4, 0x8A, 0x7B, 0xA2, 0xE0, 0x43, 0xFE, 0x80, 0x88,
+    0xA5, 0xB1, 0x47, 0x51, 0xFF, 0x48, 0xE4, 0x13, 0xA1, 0x6D, 0x6D, 0x1E, 0x4F, 0x14, 0x5C, 0x32,
+    0x05, 0x73, 0x4E, 0x1B, 0x9E, 0xB2, 0xEB, 0xF1, 0xC7, 0x42, 0x84, 0x3A, 0xAA, 0xE0, 0x6D, 0xEC,
+    0x3E, 0x79, 0x60, 0x00, 0x36, 0x01, 0x2F, 0xBC, 0xB7, 0x82, 0x03, 0x6D, 0x26, 0x6F, 0x28, 0x6E,
+    0x4C, 0xB7, 0xD7, 0x93, 0xCB, 0xF2, 0xFC, 0x58, 0x2B, 0x3F, 0x5A, 0x2F, 0x88, 0x36, 0xCB, 0x7A,
+    0xEF, 0xF2, 0xC6, 0x63, 0xC1, 0x60, 0x20, 0x71, 0x1F, 0xE4, 0xA6, 0x8A, 0x14, 0x16, 0x7D, 0x9F,
+    0xD3, 0x83, 0x8D, 0x0C, 0x8D, 0xC4, 0x8A, 0x5D, 0x1F, 0xE2, 0x05, 0x07, 0xC7, 0x1D, 0x2B, 0x4F,
+    0xAF, 0x20, 0x33, 0x60, 0x43, 0x6D, 0x60, 0x5F, 0xEC, 0x57, 0x2F, 0xF5, 0x8A, 0xC4, 0xC7, 0x8E,
+    0x2B, 0x6B, 0xE8, 0xF0, 0xA2, 0x4E, 0x66, 0xBA, 0x55, 0xEF, 0x67, 0x78, 0x20, 0x70, 0x1D, 0x57,
+    0x25, 0x1C, 0xC8, 0x0C, 0x7F, 0x1D, 0x88, 0x4D, 0x28, 0xCE, 0x90, 0xDE, 0xE5, 0xBE, 0x9B, 0xCC,
+    0x28, 0x38, 0x52, 0xA5, 0xB4, 0xE0, 0x86, 0x7F, 0x73, 0x22, 0x75, 0x9D, 0xCA, 0x1F, 0xCB, 0x31,
+    0x35, 0xC7, 0x55, 0xA7, 0xD2, 0xCD, 0x56, 0xC7, 0x22, 0xA6, 0xD3, 0x37, 0x02, 0x2E, 0xBE, 0x08,
+    0x00, 0x26, 0x9A, 0x99, 0x62, 0x46, 0x1B, 0x25, 0xED, 0x6A, 0xD5, 0x61, 0x20, 0xB9, 0xDD, 0xF7,
+    0xBE, 0xDD, 0x64, 0x5D, 0x61, 0xE5, 0x2F, 0x87, 0x81, 0x47, 0x7E, 0xC2, 0x7D, 0x45, 0xB7, 0x2A,
+    0x0C, 0xB0, 0x0C, 0x5F, 0x4C, 0x93, 0x02, 0xEE, 0x96, 0x55, 0xAF, 0x7C, 0x06, 0xA8, 0x74, 0x64,
+    0x61, 0x6A, 0xA1, 0x41, 0x69, 0x55, 0x63, 0x15, 0x5B, 0x50, 0xA9, 0x8A, 0xC5, 0x02, 0x3E, 0x5E,
+    0xFF, 0x4D, 0xD7, 0xE4, 0xE0, 0x88, 0xFE, 0xB5, 0x53, 0x72, 0xA0, 0x52, 0xCE, 0x3C, 0x25, 0x98,
+    0xFF, 0x05, 0xFC, 0xE4, 0x0C, 0x57, 0xE7, 0x4C, 0xD0, 0xEB, 0x1B, 0x4C, 0xEC, 0x89, 0xCE, 0x88,
+    0x15, 0x6A, 0x9B, 0x7B, 0xDD, 0x0C, 0x53, 0x72, 0x0D, 0x0C, 0xD2, 0xE0, 0x6E, 0x20, 0xF5, 0x30,
+    0xCE, 0xD2, 0xF6, 0x11, 0x0D, 0xCC, 0x85, 0x4C, 0x9A, 0xD3, 0xBF, 0xF2, 0x39, 0xFF, 0x26, 0x4F,
+    0x4D, 0xAE, 0x25, 0x4A, 0x72, 0xD9, 0x22, 0x8B, 0xE1, 0x07, 0xA9, 0xBD, 0x53, 0x45, 0x7C, 0xEB,
+    0xFE, 0x56, 0xAE, 0x01, 0x7F, 0x12, 0x4E, 0x18, 0xE7, 0x96, 0xB1, 0x0E, 0x9C, 0x89, 0xA8, 0xB4,
+    0x1C, 0xDA, 0x3E, 0xFE, 0x8C, 0x1C, 0xEF, 0xB4, 0x50, 0xE5, 0x46, 0x1B, 0x56, 0xCE, 0x01, 0x53,
+    0xB2, 0x6D, 0xB0, 0xD0, 0x8E, 0x08, 0x89, 0x2A, 0x5B, 0xC8, 0xFC, 0x9B, 0x6B, 0x4B, 0x6D, 0xDC,
+    0x2E, 0x2E, 0x74, 0xAB, 0xE1, 0xAE, 0xA6, 0x74, 0x8F, 0x31, 0x74, 0x5F, 0x34, 0x45, 0xE4, 0x88,
+    0xCE, 0x66, 0x24, 0xE9, 0x93, 0x68, 0x76, 0xD6, 0xB9, 0x10, 0xA9, 0xBA, 0x6A, 0x3A, 0xCD, 0xB8,
+    0x95, 0x44, 0x7D, 0x75, 0x13, 0x64, 0x7B, 0xD2, 0x29, 0xB9, 0x3A, 0x75, 0x98, 0x26, 0xFC, 0x2B,
+    0x46, 0x8A, 0xFD, 0x5C, 0x2B, 0xB5, 0x6C, 0x48, 0x20, 0x5F, 0xAA, 0x09, 0xAD, 0xBA, 0x7B, 0xE3,
+    0x13, 0x55, 0x3D, 0xBD, 0x43, 0xEA, 0xC7, 0xA7, 0x3E, 0xDD, 0xF3, 0xEB, 0xBB, 0x7D, 0xFE, 0x2A,
+    0x9B, 0xC4, 0xFB, 0x44, 0x1D, 0xD1, 0x72, 0x33, 0x88, 0x65, 0xFE, 0xE7, 0xD1, 0xD7, 0x55, 0xDC,
+    0x2F, 0x17, 0xC0, 0x8A, 0xE2, 0xDA, 0x5E, 0xA4, 0x68, 0x9C, 0xA2, 0x5C, 0xA0, 0xE7, 0x1F, 0x02,
+    0xFB, 0xC3, 0xEE, 0x63, 0xB7, 0xBD, 0x29, 0xEF, 0xCB, 0xA5, 0x47, 0x5A, 0x79, 0x4D, 0x5E, 0x9D,
+    0x44, 0x5A, 0xF9, 0xC6, 0xDE, 0x0A, 0x71, 0x58, 0xB6, 0xA0, 0x02, 0xE5, 0xAA, 0x62, 0x15, 0xF4,
+    0x39, 0x28, 0x9A, 0xF8, 0x59, 0xF1, 0x92, 0x17, 0x45, 0x27, 0x6A, 0x1D, 0x11, 0x3E, 0x08, 0xA2,
+    0xCD, 0x31, 0x0E, 0xEE, 0xD4, 0xFC, 0xF9, 0x3C, 0x1F, 0x87, 0x00, 0xE2, 0x5F, 0xB8, 0x35, 0xBB,
+    0xC5, 0x97, 0x32, 0xCE, 0x7F, 0x1D, 0xD6, 0x05, 0xEE, 0xD7, 0x0D, 0xB9, 0x3C, 0x6B, 0xAF, 0x23,
+    0x0B, 0x86, 0x3C, 0x40, 0x66, 0xCD, 0x65, 0x8A, 0xF8, 0xEB, 0x6B, 0xAB, 0x2F, 0x98, 0x6C, 0x40,
+    0x8E, 0x54, 0x90, 0xB5, 0x1C, 0x79, 0x7B, 0x83, 0x12, 0xA4, 0x0B, 0x20, 0xD5, 0x95, 0x30, 0x2C,
+    0x8A, 0x6E, 0x94, 0xD2, 0xAB, 0x78, 0xF5, 0x71, 0x38, 0x4F, 0xB2, 0x93, 0x50, 0xDB, 0x16, 0x94,
+    0xC4, 0xA9, 0x7D, 0x9D, 0x2F, 0x48, 0x98, 0xEB, 0x74, 0xE2, 0xD7, 0x97, 0x91, 0xBC, 0xF8, 0x90,
+    0xAF, 0x74, 0x71, 0x38, 0x94, 0xFE, 0xA6, 0xC7, 0x89, 0x63, 0x0D, 0x9B, 0xF1, 0x81, 0x28, 0x4A,
+    0x75, 0x85, 0x53, 0x83, 0x34, 0x99, 0xE6, 0xF4, 0xAA, 0xF4, 0xF0, 0x1D, 0x92, 0xBE, 0x12, 0x8E,
+    0x20, 0xBF, 0xCA, 0x41, 0x30, 0x08, 0x9B, 0x47, 0xD0, 0x23, 0x45, 0x67, 0x38, 0x2B, 0x0F, 0xD3,
+    0xBA, 0x59, 0xEB, 0x7C, 0x39, 0xCF, 0xA8, 0xB7, 0xA9, 0xEF, 0xF4, 0xC7, 0xD9, 0x1B, 0x5B, 0xC4,
+    0xC3, 0xA3, 0x92, 0xA2, 0xF9, 0x1F, 0xC1, 0x99, 0x57, 0xE6, 0xD8, 0x22, 0xF8, 0xA5, 0xC8, 0x4B,
+    0xCE, 0xAD, 0xBD, 0x19, 0x71, 0xC3, 0x1A, 0xEB, 0x25, 0xFD, 0xA7, 0x7F, 0xA8, 0x7A, 0xEC, 0x54,
+    0x0A, 0x97, 0x3E, 0x85, 0x29, 0xAF, 0x85, 0xDE, 0x14, 0x10, 0x3C, 0xBD, 0x66, 0xBE, 0x59, 0xE4,
+    0x71, 0xD8, 0x7E, 0xEA, 0xF6, 0x8A, 0x8F, 0xF1, 0x3A, 0x03, 0x41, 0x99, 0x27, 0x45, 0xB6, 0x05,
+    0x2F, 0x6B, 0x11, 0x61, 0xB4, 0x40, 0x40, 0x3A, 0xD2, 0xE9, 0x90, 0xDD, 0x0C, 0x19, 0x3B, 0x01,
+    0xF2, 0xA4, 0xF5, 0x3B, 0x9C, 0x18, 0x32, 0x26, 0xCB, 0xDB, 0x20, 0x5B, 0xE2, 0x43, 0x70, 0xCB,
+    0x37, 0xA6, 0xEC, 0x34, 0x85, 0x33, 0xD6, 0x8B, 0x1F, 0x5F, 0x10, 0xCC, 0x86, 0xAB, 0x04, 0x31,
+    0x5D, 0x07, 0xD6, 0x7C, 0x5F, 0x71, 0x08, 0xAC, 0x3F, 0x08, 0xC6, 0xCF, 0xAC, 0x50, 0xCF, 0xA2,
+    0xFC, 0xDB, 0x02, 0x01, 0xD5, 0x33, 0x9E, 0x57, 0xDC, 0x88, 0xBC, 0x51, 0x71, 0x95, 0x9A, 0x86,
+    0x99, 0xBB, 0xFC, 0x5A, 0x3C, 0xB8, 0xC0, 0xA5, 0x12, 0xA4, 0x26, 0x55, 0xE7, 0x8A, 0xD0, 0x6F,
+    0x2C, 0x52, 0x21, 0xA4, 0x0A, 0xBE, 0xC9, 0xA7, 0x87, 0x4B, 0xBD, 0x47, 0x44, 0xFA, 0x7A, 0xE5,
+    0xDF, 0x07, 0x54, 0xC8, 0xA3, 0xF3, 0x73, 0x28, 0xE5, 0x52, 0x36, 0x04, 0x42, 0xAB, 0x9C, 0x6E,
+    0x80, 0x5B, 0x44, 0xF0, 0xA7, 0xC6, 0x00, 0xC3, 0x69, 0x14, 0xE9, 0x01, 0xD2, 0xE4, 0x69, 0x7D,
+    0x32, 0xAC, 0x78, 0x70, 0x76, 0x81, 0x9A, 0x19, 0x7D, 0x80, 0x82, 0xB5, 0xCE, 0x11, 0xBD, 0xF1,
+    0x15, 0x36, 0x49, 0xB1, 0x84, 0xCB, 0x15, 0x46, 0x87, 0xF4, 0x83, 0x3D, 0x82, 0x9A, 0x84, 0xB7,
+    0x86, 0x47, 0x06, 0x72, 0xE9, 0xE5, 0xFE, 0x4C, 0x11, 0xAE, 0xD1, 0x0D, 0xA7, 0xBE, 0xFD, 0xE2,
+    0xF7, 0xAD, 0xC2, 0x47, 0xA5, 0x72, 0x4A, 0x96, 0x38, 0xCC, 0x6B, 0xE7, 0x94, 0xA3, 0x91, 0x6B,
+    0x3D, 0x20, 0x86, 0xA4, 0x70, 0x84, 0xDB, 0x35, 0x78, 0xC9, 0x50, 0x89, 0x57, 0xE6, 0xB1, 0xA7,
+    0x60, 0xD7, 0x89, 0x13, 0x8C, 0x04, 0xEC, 0x19, 0x40, 0x0C, 0xFB, 0x5D, 0x73, 0xAB, 0x2B, 0x58,
+    0xEF, 0xD2, 0x9C, 0x2C, 0x8F, 0x11, 0x5F, 0x86, 0x43, 0xD3, 0x68, 0xE3, 0x7C, 0xB6, 0x6B, 0xEF,
+    0x88, 0xC6, 0x64, 0x69, 0x32, 0x0C, 0x86, 0x30, 0xCC, 0x25, 0x0B, 0x5A, 0x74, 0x64, 0x5C, 0xCC,
+    0xAC, 0xEF, 0x61, 0xFD, 0x06, 0xEE, 0x95, 0xC6, 0xEB, 0xB8, 0xD1, 0x46, 0x7B, 0x50, 0xD1, 0x1D,
+    0x82, 0x4C, 0xE5, 0xA2, 0xB2, 0xAC, 0x24, 0x49, 0xE0, 0xFB, 0x14, 0x29, 0xC9, 0x39, 0x93, 0x9C,
+    0x35, 0x61, 0xD4, 0x29, 0xD3, 0x1A, 0x21, 0x6C, 0xD4, 0x89, 0x84, 0x47, 0xF6, 0xE2, 0x00, 0x3A,
+    0x40, 0xB2, 0xC1, 0x39, 0xFE, 0x79, 0x18, 0xC8, 0x5A, 0x41, 0x1C, 0xAD, 0x8A, 0xB6, 0x79, 0x3F,
+    0x32, 0xFD, 0x8F, 0x3E, 0x57, 0x22, 0x5F, 0xDE, 0xE0, 0x90, 0x9B, 0xB7, 0xF7, 0x80, 0xA2, 0x42,
+    0x33, 0x4E, 0x64, 0xD2, 0xB4, 0x25, 0x77, 0x62, 0xA2, 0x48, 0x80, 0x06, 0x17, 0xBB, 0xC8, 0x04,
+    0x35, 0x94, 0x1A, 0xD7, 0x64, 0xA4, 0xE6, 0xB6, 0xE6, 0x43, 0x30, 0x46, 0x78, 0xB6, 0x98, 0x1B,
+    0x0F, 0x90, 0xE6, 0xF7, 0x9A, 0x6A, 0xEC, 0x96, 0x7F, 0x46, 0xD8, 0x1E, 0x62, 0xA6, 0x56, 0x54,
+    0x63, 0x44, 0x62, 0x18, 0x75, 0x61, 0xB4, 0x11, 0x0F, 0x6D, 0x5E, 0xE3, 0x45, 0xD4, 0x80, 0xC1,
+    0xAF, 0x98, 0xF6, 0x48, 0x15, 0xDF, 0xD5, 0x3C, 0xD3, 0xE9, 0xD2, 0x17, 0x7E, 0x1A, 0x18, 0x3A,
+    0xA1, 0xFF, 0xF0, 0x46, 0x9C, 0x48, 0xBA, 0x72, 0xFF, 0x21, 0x66, 0x63, 0x8D, 0xB7, 0xA5, 0x17,
+    0x42, 0x4F, 0x2E, 0xCA, 0xEA, 0x8E, 0xD9, 0x6F, 0xBD, 0x4B, 0x80, 0x4C, 0x73, 0x4F, 0x85, 0x3D,
+    0x0B, 0x80, 0x32, 0x1A, 0xAD, 0x93, 0x83, 0x82, 0x0B, 0xA6, 0x5E, 0x76, 0x5B, 0x60, 0x51, 0x81,
+    0x53, 0x9D, 0x82, 0x5F, 0x65, 0xAD, 0x93, 0x80, 0x81, 0x2C, 0x8A, 0x0B, 0x7D, 0x58, 0x67, 0xE5,
+    0xAD, 0xB9, 0x94, 0xF7, 0x11, 0x58, 0xE9, 0x7D, 0xE0, 0xC6, 0x92, 0xC9, 0x7D, 0x4C, 0xDC, 0x4C,
+    0x88, 0x22, 0x31, 0x68, 0xC3, 0x37, 0xE3, 0x1E, 0xE5, 0xA4, 0x6B, 0x41, 0xEA, 0x9D, 0xE8, 0xFC,
+    0xF1, 0xF3, 0x78, 0xF4, 0x54, 0x40, 0x53, 0x9D, 0x7D, 0x4C, 0x70, 0x56, 0xBE, 0xB0, 0x74, 0x67,
+    0xAC, 0x7D, 0xE0, 0x4F, 0x67, 0x28, 0x71, 0xDD, 0xCE, 0x78, 0xDB, 0xB5, 0xFF, 0x54, 0x22, 0xBD,
+    0x89, 0x74, 0x38, 0x14, 0x1A, 0x10, 0x2C, 0xDF, 0x30, 0x24, 0xB0, 0xC1, 0x85, 0x09, 0x4D, 0xB5,
+    0xE2, 0x02, 0x5E, 0x85, 0x9E, 0x6E, 0x6A, 0xB7, 0xE0, 0x6C, 0xF3, 0x91, 0x42, 0xE7, 0x08, 0x07,
+    0x95, 0x00, 0xD9, 0x7F, 0x2C, 0xD0, 0xA1, 0x2A, 0xB1, 0x52, 0x18, 0x62, 0x57, 0x51, 0xA0, 0xF2,
+    0xC9, 0x8B, 0xAA, 0x01, 0x08, 0x74, 0xA6, 0x7C, 0x60, 0x3D, 0x3C, 0x4B, 0xED, 0x45, 0xFE, 0xCE,
+    0x00, 0x9E, 0x6E, 0x99, 0xDA, 0x0B, 0xC6, 0xB6, 0xC5, 0xCF, 0xAA, 0x03, 0xEE, 0x7F, 0x41, 0xAE,
+    0x83, 0xAB, 0x23, 0xAA, 0x67, 0x1E, 0x20, 0x42, 0x55, 0x54, 0x95, 0xAE, 0xAE, 0x82, 0x2A, 0x3F,
+    0xAA, 0x14, 0x66, 0xF4, 0xAB, 0x01, 0xAD, 0x5F, 0xA7, 0x76, 0xFA, 0x21, 0xF4, 0x82, 0x22, 0x67,
+    0x8F, 0xDC, 0xA2, 0x1A, 0xBC, 0x01, 0x75, 0x8D, 0x66, 0x8C, 0xD5, 0x46, 0x90, 0x4D, 0xD8, 0xC0,
+    0xBC, 0x0F, 0x61, 0xB2, 0xE9, 0xE2, 0xD0, 0x32, 0x27, 0x4B, 0x39, 0x43, 0x50, 0xD0, 0xF7, 0xF2,
+    0x32, 0x24, 0xE8, 0x32, 0x19, 0x31, 0x57, 0x04, 0x5B, 0xAB, 0x54, 0xC7, 0x44, 0x6B, 0x5F, 0x6C,
+    0x14, 0xB2, 0x83, 0xA2, 0xEC, 0x5F, 0x04, 0x8A, 0x78, 0x0D, 0xF8, 0x8F, 0x61, 0xFA, 0x32, 0xC9,
+    0xB4, 0x60, 0xCC, 0xCB, 0x35, 0x92, 0xB3, 0x23, 0x29, 0x28, 0x4D, 0x48, 0x6C, 0x00, 0x9F, 0xF9,
+    0x8D, 0x26, 0x44, 0xC9, 0x0B, 0xB2, 0x73, 0x94, 0xF3, 0x7A, 0x9C, 0x4E, 0x7E, 0xC3, 0xB7, 0x7E,
+    0x87, 0x98, 0x18, 0x83, 0x35, 0x93, 0xDD, 0x35, 0xF7, 0xD1, 0x3D, 0xF1, 0x40, 0x48, 0x89, 0xAC,
+    0xEE, 0x98, 0xE7, 0x5A, 0x77, 0xED, 0x3A, 0xED, 0x5A, 0xE7, 0x38, 0x74, 0xF7, 0xD6, 0xB6, 0x40,
+    0x76, 0xAE, 0xBD, 0x99, 0x93, 0x02, 0xB3, 0xFF, 0xDE, 0x14, 0x70, 0xC3, 0xBF, 0x77, 0x00, 0x4F,
+    0xC6, 0x7E, 0x7A, 0x1E, 0x39, 0xD3, 0x00, 0xDC, 0xC2, 0x35, 0x01, 0x25, 0x8C, 0x9C, 0x34, 0x79,
+    0xA0, 0x47, 0xD4, 0xD4, 0x3B, 0xFF, 0x89, 0x7D, 0x79, 0x8B, 0xBF, 0x9A, 0x64, 0x4E, 0xB7, 0xE5,
+    0x79, 0x31, 0xB8, 0x45, 0x03, 0xD0, 0xCC, 0xA6, 0xE5, 0x22, 0xBC, 0xF1, 0x40, 0x24, 0xBA, 0xF6,
+    0x2B, 0xE0, 0x21, 0xE3, 0xA5, 0x4D, 0xBE, 0xBB, 0x45, 0x12, 0x5A, 0x10, 0x1B, 0x28, 0xC2, 0xD6,
+    0x85, 0xBE, 0xBD, 0xD0, 0xDD, 0xA3, 0xA0, 0x7B, 0x2F, 0x98, 0xE2, 0x9D, 0x62, 0xB1, 0xB6, 0xE2,
+    0x1E, 0x1D, 0x7E, 0x69, 0x6F, 0x39, 0x92, 0xF2, 0x97, 0x3D, 0x02, 0xE1, 0x17, 0x25, 0x03, 0x63,
+    0x20, 0x39, 0xEF, 0xBD, 0x56, 0xFD, 0x66, 0xD5, 0x40, 0x31, 0x9A, 0xA7, 0x45, 0x00, 0xD0, 0x01,
+    0x60, 0x30, 0xA2, 0xD5, 0x6C, 0x5A, 0x56, 0x67, 0x11, 0x57, 0xC8, 0x09, 0x9D, 0x96, 0xB0, 0xD1,
+    0x88, 0x9F, 0xE7, 0xE3, 0xAC, 0xD0, 0x0C, 0x39, 0x13, 0xB8, 0xF5, 0xFA, 0xDB, 0xFE, 0x5C, 0x52,
+    0x4A, 0x8D, 0xA2, 0x8C, 0xA8, 0x7E, 0xAB, 0xEC, 0x22, 0x7F, 0x23, 0x04, 0x16, 0x0E, 0x8F, 0x99,
+    0xD7, 0x83, 0x13, 0xDF, 0x40, 0x3F, 0xB7, 0xF1, 0xA9, 0x2A, 0x04, 0x62, 0xD3, 0xC1, 0x2F, 0x4B,
+    0x5D, 0xE8, 0xB8, 0x0E, 0xD2, 0x46, 0xF3, 0x13, 0x92, 0x9A, 0x63, 0x03, 0x54, 0xEC, 0x9E, 0xD3,
+    0x30, 0x00, 0x03, 0x8A, 0x77, 0x8B, 0xCD, 0x8C, 0x3D, 0x6B, 0x9E, 0xBB, 0x72, 0x7B, 0xB8, 0x72,
+    0xB9, 0xCD, 0x98, 0x69, 0xFB, 0x20, 0xB8, 0xC5, 0x3F, 0xA0, 0x9C, 0xD1, 0x29, 0x89, 0xE0, 0x55,
+    0xDF, 0x87, 0x5D, 0x90, 0x28, 0x99, 0xE6, 0x39, 0x63, 0x6A, 0x19, 0xE8, 0x0D, 0x50, 0xB1, 0x2C,
+    0xF3, 0x31, 0xC1, 0x68, 0x23, 0xE3, 0x70, 0xFF, 0x7E, 0x1F, 0x4D, 0xF5, 0xC5, 0x90, 0xE9, 0x81,
+    0x17, 0x66, 0x17, 0x40, 0x44, 0xDF, 0x2F, 0x63, 0x50, 0x82, 0x72, 0x87, 0x23, 0x93, 0x6B, 0x7E,
+    0xAD, 0x53, 0x6F, 0xD7, 0x78, 0x31, 0x25, 0x9F, 0x9E, 0xC3, 0xC9, 0x42, 0x18, 0x40, 0xE9, 0x4C,
+    0xFC, 0xAA, 0xC7, 0xF5, 0x51, 0x93, 0x24, 0xE2, 0xFD, 0x69, 0x72, 0x68, 0xE1, 0x8D, 0x59, 0x42,
+    0x1A, 0x14, 0x48, 0x6A, 0xDD, 0x59, 0xC3, 0xA7, 0x34, 0x73, 0x37, 0xAE, 0x82, 0xB9, 0xEB, 0x46,
+    0xD2, 0xB6, 0x31, 0xB4, 0x3E, 0x82, 0x49, 0x4B, 0x0F, 0x13, 0xB5, 0x98, 0x47, 0x26, 0xD4, 0x45,
+    0x8C, 0xE2, 0x04, 0xD4, 0xC6, 0x8B, 0x7B, 0x7D, 0x0E, 0x7D, 0x3C, 0x63, 0x39, 0xD7, 0xDF, 0xB2,
+    0x68, 0x34, 0xD4, 0xB4, 0x70, 0x6A, 0x98, 0x15, 0xDF, 0x16, 0xEF, 0xAF, 0x1E, 0xC5, 0x1F, 0x5C,
+    0x3D, 0x85, 0x74, 0xC6, 0xCF, 0x44, 0x01, 0xD3, 0xC3, 0x61, 0x93, 0xBF, 0x23, 0x9F, 0x99, 0x44,
+    0x54, 0x2A, 0x32, 0xB9, 0x75, 0x21, 0x1B, 0x2C, 0xE1, 0xFB, 0xFF, 0xAF, 0x62, 0x6F, 0x86, 0x23,
+    0xFE, 0xCD, 0x68, 0x38, 0xB6, 0xAC, 0x49, 0xF6, 0x4A, 0x0C, 0xA1, 0xF5, 0x19, 0xD1, 0x5A, 0xA8,
+    0xF0, 0xB4, 0x9B, 0x4E, 0x0F, 0x6B, 0x65, 0x46, 0x44, 0x16, 0x2F, 0x7E, 0x6E, 0xDC, 0x5F, 0x5E,
+    0x6F, 0x31, 0x99, 0x43, 0xA0, 0x27, 0xBD, 0x2A, 0x58, 0x6E, 0xB2, 0x82, 0x29, 0x78, 0xED, 0xA6,
+    0x83, 0x4D, 0x1B, 0xCD, 0x9C, 0x0F, 0xE5, 0xE7, 0x1A, 0xE4, 0x63, 0xD6, 0x6A, 0xD5, 0x03, 0x39,
+    0xB8, 0x48, 0x77, 0x80, 0xF7, 0xF3, 0xFE, 0x64, 0x8B, 0x98, 0x72, 0xBE, 0x31, 0x28, 0xF0, 0x48,
+    0x2A, 0x65, 0x37, 0xDA, 0xD1, 0x9A, 0x18, 0x37, 0xBB, 0x23, 0x59, 0xB3, 0x24, 0x75, 0xF7, 0xF5,
+    0x79, 0x4E, 0xF0, 0xCA, 0x85, 0x13, 0x3C, 0x93, 0xD0, 0xC6, 0xD9, 0xEA, 0xAE, 0xDF, 0x7E, 0xAC,
+    0xE4, 0xAB, 0x88, 0x0E, 0x78, 0x80, 0x1D, 0x26, 0x2A, 0x5C, 0x95, 0x23, 0x6B, 0x70, 0x99, 0x6C,
+    0x15, 0xC4, 0x86, 0xC0, 0x29, 0x9D, 0x55, 0xE4, 0xC1, 0x84, 0x37, 0x6B, 0xA7, 0x26, 0x82, 0xCC,
+    0x9C, 0xDA, 0xEB, 0x54, 0x17, 0x67, 0xD3, 0x74, 0x4B, 0x4F, 0x7C, 0x63, 0x4D, 0xE7, 0xE4, 0x93,
+    0x34, 0xDB, 0xDE, 0x9D, 0x17, 0x28, 0x06, 0xEA, 0x09, 0x2A, 0x63, 0x8D, 0x1A, 0x32, 0xD8, 0xC9,
+    0x66, 0xE2, 0x77, 0xE6, 0x19, 0x59, 0x44, 0x13, 0x2A, 0x7E, 0x4E, 0xF4, 0x5A, 0xC7, 0xBB, 0x43,
+    0xDC, 0xC8, 0x6A, 0x56, 0x5D, 0x2F, 0x55, 0xFD, 0x7E, 0x5A, 0x37, 0x1F, 0x99, 0xE3, 0xF8, 0xEC,
+    0x50, 0x0B, 0xE3, 0x94, 0xC4, 0xF5, 0xCD, 0xC1, 0x03, 0x96, 0x76, 0xB3, 0x34, 0x01, 0xF9, 0x5C,
+    0xE6, 0xC9, 0x99, 0x40, 0xB7, 0xCD, 0x5C, 0xF8, 0xE6, 0xF7, 0x3F, 0x7B, 0x13, 0x19, 0x22, 0x02,
+    0xEF, 0x59, 0x45, 0x48, 0x61, 0x2B, 0xED, 0xCD, 0xB5, 0x90, 0x2C, 0xD0, 0x49, 0xB4, 0x39, 0x76,
+    0x51, 0xBE, 0x51, 0xD7, 0x3D, 0xD7, 0xDD, 0x55, 0x98, 0xC5, 0x0F, 0xBD, 0xF6, 0xE0, 0x96, 0xAA,
+    0xB8, 0x19, 0x97, 0x7F, 0x35, 0x2C, 0x50, 0x69, 0xE8, 0xEE, 0x6A, 0x2F, 0x00, 0x18, 0x65, 0x1B,
+    0xD6, 0xB8, 0x2A, 0xC3, 0x0A, 0x37, 0xEA, 0x7E, 0x95, 0x8B, 0x60, 0xA5, 0x2E, 0xC0, 0x55, 0x24,
+    0x3B, 0x3D, 0xB1, 0x40, 0x22, 0x8A, 0x56, 0xAB, 0x04, 0x6B, 0x31, 0x0E, 0xB6, 0xD7, 0x17, 0xF1,
+    0xEA, 0x9B, 0x91, 0x0E, 0xEE, 0xCE, 0x0A, 0xFE, 0x37, 0x46, 0xAC, 0x15, 0xF9, 0x60, 0xFF, 0x73,
+    0x54, 0xC9, 0xE1, 0x8C, 0x42, 0xFA, 0x39, 0x51, 0xD4, 0x77, 0xAC, 0x62, 0xF3, 0x15, 0x8D, 0xC5,
+    0xEC, 0x46, 0x75, 0x97, 0x50, 0xED, 0x10, 0xF5, 0xC7, 0x81, 0xEC, 0x1D, 0x7C, 0x40, 0x7B, 0x9F,
+    0x4F, 0x37, 0xA4, 0xED, 0x3C, 0x35, 0x68, 0xDB, 0xDB, 0x7F, 0xF2, 0xF3, 0xDC, 0x39, 0xA0, 0x40,
+    0xE8, 0x17, 0x9C, 0xD8, 0x26, 0x92, 0xF2, 0x57, 0x5E, 0xE7, 0x56, 0xDA, 0x4F, 0x3F, 0x4C, 0xF4,
+    0x90, 0x4A, 0x89, 0x33, 0x49, 0xBB, 0x99, 0xE9, 0xCA, 0x6F, 0x5F, 0x51, 0xAE, 0xFF, 0x83, 0x90,
+    0x83, 0x53, 0xFF, 0x00, 0x7F, 0x2F, 0x84, 0xD7, 0xD8, 0xE8, 0xB1, 0xAB, 0xF9, 0x56, 0x65, 0x93,
+    0xA7, 0xC2, 0xB4, 0xD7, 0x6B, 0xB4, 0xCF, 0x65, 0xC8, 0xCA, 0x20, 0x15, 0x91, 0x74, 0x30, 0x4D,
+    0x72, 0x5B, 0xBD, 0x70, 0xC5, 0x8B, 0xD3, 0xC7, 0xD4, 0x7B, 0xFB, 0xDF, 0x6B, 0x7B, 0x19, 0x6B,
+    0x8B, 0x83, 0x47, 0x83, 0xC6, 0x44, 0xBA, 0xA8, 0xEA, 0xB8, 0x38, 0x67, 0x6B, 0x58, 0xF3, 0x4E,
+    0xC8, 0xA8, 0xF4, 0xDD, 0x30, 0xDD, 0x59, 0x4D, 0x55, 0x27, 0x1E, 0x14, 0x3A, 0x71, 0xD5, 0xFD,
+    0x59, 0x0B, 0xC2, 0x17, 0x2F, 0x08, 0x53, 0x27, 0x07, 0xEE, 0xA0, 0xC6, 0xE9, 0xF8, 0x31, 0xDD,
+    0x97, 0xC4, 0xAD, 0xC1, 0x9A, 0x60, 0x5C, 0xE4, 0x27, 0x0A, 0x03, 0x35, 0x10, 0x9C, 0xE8, 0x70,
+    0xE3, 0xF3, 0xD8, 0xE6, 0x72, 0xA5, 0x31, 0xC6, 0xFE, 0x46, 0xA8, 0x46, 0x6E, 0x74, 0x90, 0xD6,
+    0x8F, 0x27, 0x3C, 0x39, 0x24, 0x5E, 0x31, 0x3C, 0xCC, 0x9A, 0xDD, 0xFE, 0xE9, 0xDA, 0x84, 0xE8,
+    0xA1, 0xCC, 0x4B, 0xE1, 0x1B, 0xAA, 0x7D, 0xF6, 0x7C, 0xA8, 0x4C, 0xD5, 0xFC, 0x3C, 0x4C, 0xFC,
+    0x62, 0x32, 0xAE, 0x5D, 0xBA, 0x65, 0xDC, 0xC3, 0x1D, 0x8C, 0x9D, 0x0E, 0x2A, 0x46, 0x64, 0x8D,
+    0xCD, 0x6E, 0xBC, 0x86, 0x16, 0x15, 0xA2, 0x26, 0xD1, 0x3E, 0x5F, 0x0A, 0x81, 0x86, 0x0F, 0xE8,
+    0xA1, 0x28, 0xA3, 0x5F, 0xFF, 0xE4, 0x68, 0x2C, 0xE6, 0x30, 0x16, 0xB8, 0x2E, 0xCD, 0x41, 0x52,
+    0xE3, 0x81, 0xFB, 0x1D, 0x1C, 0xA2, 0x17, 0xC3, 0xF1, 0x24, 0x02, 0x94, 0xB9, 0x59, 0xEC, 0x4A,
+    0x6D, 0xE3, 0x27, 0x18, 0x2C, 0xDA, 0x75, 0x17, 0x42, 0xAA, 0xF7, 0x61, 0x50, 0x29, 0x8C, 0x0A,
+    0xCA, 0x8E, 0xCA, 0x59, 0x82, 0x1F, 0x1D, 0x0B, 0x00, 0x36, 0xE4, 0x78, 0x25, 0x01, 0xF7, 0xFB,
+    0x0E, 0x65, 0x4E, 0x07, 0x5E, 0xD8, 0x23, 0xC6, 0x49, 0x76, 0x06, 0x0B, 0xA5, 0xC2, 0x30, 0x55,
+    0x82, 0xF6, 0x60, 0x69, 0xAE, 0x1B, 0x37, 0xC1, 0x02, 0xE8, 0x23, 0x9B, 0x15, 0x70, 0x7B, 0xF8,
+    0xF9, 0x5E, 0x50, 0x69, 0x2F, 0x28, 0x7E, 0xDB, 0x35, 0x2F, 0x6C, 0x87, 0xCC, 0xFD, 0x23, 0x1A,
+    0x3B, 0x32, 0x9C, 0xFC, 0xE2, 0x6A, 0x24, 0x2A, 0x0C, 0x5E, 0x4D, 0x19, 0x7E, 0xDA, 0xCA, 0x95,
+    0x61, 0xE1, 0xC6, 0x60, 0x4E, 0x62, 0xCB, 0x6A, 0x09, 0x83, 0x02, 0xEF, 0xC8, 0x7E, 0x36, 0x79,
+    0x14, 0x24, 0x35, 0x01, 0xCF, 0xCB, 0x95, 0xF5, 0x08, 0x5E, 0x0A, 0x46, 0xD2, 0x5B, 0x46, 0x43,
+    0x54, 0x3B, 0x4F, 0x96, 0xD5, 0x53, 0x81, 0x8D, 0x0E, 0xDE, 0x7A, 0x94, 0xB8, 0x09, 0x11, 0x47,
+    0x8F, 0x38, 0xFE, 0x47, 0x00, 0xFA, 0x76, 0x73, 0x96, 0xDA, 0x1C, 0x55, 0xE9, 0x9E, 0x73, 0x1E,
+    0x75, 0xCF, 0x7A, 0x4D, 0xB0, 0x44, 0x6E, 0x2A, 0x6D, 0x98, 0x2B, 0x39, 0xDC, 0xBA, 0x17, 0x50,
+    0x06, 0xEA, 0xA6, 0x62, 0x33, 0xD9, 0xD2, 0x66, 0x78, 0x05, 0xE5, 0x52, 0x2B, 0x9F, 0x34, 0xAE,
+    0xDF, 0xE9, 0x9D, 0x44, 0xBA, 0x93, 0xD8, 0x29, 0x02, 0xC6, 0xED, 0x5A, 0x59, 0x0A, 0xD0, 0xD9,
+    0x6D, 0xBE, 0x97, 0x25, 0x5E, 0xDA, 0x95, 0x44, 0xCE, 0x73, 0xFD, 0xE5, 0x98, 0xFD, 0x75, 0x38,
+    0x88, 0x1E, 0x42, 0x2A, 0x3F, 0x65, 0x96, 0x7C, 0xF1, 0x86, 0x51, 0xBE, 0x51, 0xB1, 0x1E, 0xD1,
+    0x76, 0x64, 0x08, 0x85, 0x49, 0xD7, 0xDD, 0xDD, 0xD4, 0xFA, 0xFE, 0xCA, 0x67, 0xDB, 0x36, 0x90,
+    0x07, 0xEB, 0x86, 0xF6, 0x07, 0x7A, 0x21, 0xDB, 0xEE, 0x57, 0x24, 0x55, 0x87, 0x2C, 0xD2, 0xA4,
+    0xEE, 0x45, 0x51, 0xE8, 0x05, 0xD1, 0x24, 0x08, 0xD0, 0x3B, 0x7D, 0xCA, 0x0E, 0x5D, 0x03, 0x57,
+    0x44, 0xF7, 0x76, 0x0A, 0xCD, 0x20, 0x9B, 0x93, 0xE0, 0x7D, 0x86, 0x3E, 0x48, 0x8D, 0xF0, 0x4C,
+    0x28, 0x32, 0x77, 0xD8, 0xA3, 0x48, 0xA0, 0x93, 0x36, 0x05, 0xA0, 0x19, 0xF2, 0x98, 0x6C, 0x17,
+    0x5E, 0x2C, 0x5E, 0xE4, 0xAD, 0x36, 0x96, 0x10, 0x1B, 0xE5, 0xB7, 0x6B, 0x84, 0x0C, 0xED, 0xE3,
+    0xDC, 0x4B, 0xA4, 0xE7, 0x0A, 0xDA, 0xD4, 0xE7, 0xD9, 0x1E, 0xEE, 0xF9, 0xD5, 0x06, 0xAF, 0x3F,
+    0x51, 0x1D, 0x98, 0x42, 0x77, 0x11, 0x02, 0x57, 0x10, 0x3C, 0x5C, 0x98, 0xDA, 0x7D, 0x64, 0x6B,
+    0xEC, 0x6B, 0x51, 0xFB, 0x77, 0x31, 0x79, 0xCE, 0x9C, 0x58, 0x03, 0xEA, 0x2A, 0xDF, 0x92, 0x5D,
+    0xED, 0x0F, 0x20, 0xCC, 0x0A, 0x70, 0x42, 0x94, 0x37, 0xFA, 0xDF, 0xA1, 0xAF, 0x70, 0x1B, 0x0E,
+    0x80, 0x5B, 0x3E, 0xA9, 0xBF, 0x0F, 0x2B, 0x5D, 0xD8, 0x2F, 0xEF, 0xF9, 0xF3, 0x53, 0xC5, 0xE7,
+    0x93, 0x87, 0x49, 0x54, 0xE4, 0x48, 0x74, 0xD2, 0xDC, 0x2A, 0x9A, 0xE2, 0x18, 0x61, 0xD7, 0xAC,
+    0x4C, 0x1A, 0x2E, 0x72, 0x83, 0x8D, 0xDA, 0xCE, 0x16, 0xD1, 0x3F, 0x90, 0x62, 0xCA, 0xA7, 0x06,
+    0x22, 0x66, 0xF3, 0x67, 0xB0, 0xA3, 0xD4, 0xDD, 0xB1, 0xA4, 0xF3, 0x22, 0xB3, 0x02, 0x4D, 0xD4,
+    0x2C, 0x84, 0xF5, 0x75, 0x87, 0x7D, 0x56, 0x04, 0xC1, 0xC1, 0x62, 0x12, 0x59, 0xCF, 0x04, 0xA4,
+    0x20, 0x1F, 0xF5, 0xC5, 0x8D, 0xB6, 0x88, 0x54, 0x61, 0xF3, 0x5A, 0x88, 0x3F, 0x6E, 0x5C, 0xE9,
+    0x8B, 0x81, 0x56, 0xE6, 0x10, 0xC7, 0xED, 0x5F, 0x03, 0x67, 0x3E, 0x2E, 0xBD, 0x6A, 0xC3, 0x4D,
+    0x33, 0xB7, 0xD4, 0x87, 0x46, 0x0B, 0x27, 0x86, 0xFC, 0x65, 0x6F, 0xDF, 0x5A, 0x3D, 0x77, 0x49,
+    0x5A, 0xFB, 0x3A, 0x81, 0xCE, 0xA1, 0xAC, 0x02, 0x18, 0x7E, 0x5B, 0x58, 0x75, 0xFB, 0x64, 0x7C,
+    0xAA, 0x50, 0xE6, 0xE6, 0xA2, 0x7E, 0xFC, 0xC7, 0x67, 0x25, 0x5D, 0xE5, 0x24, 0x28, 0x1F, 0x3B,
+    0xE6, 0x31, 0x6D, 0x43, 0x93, 0xD3, 0xC4, 0xB4, 0x6F, 0x89, 0x02, 0x9B, 0x54, 0xC7, 0x6B, 0x97,
+    0xD3, 0x85, 0x06, 0xE1, 0x4E, 0x15, 0xD2, 0xE8, 0xF3, 0x94, 0x37, 0x40, 0x30, 0x2C, 0xA0, 0x25,
+    0x77, 0xA8, 0xC0, 0x23, 0x3F, 0x5F, 0x55, 0x71, 0x21, 0xD3, 0x33, 0x0B, 0x7A, 0x2F, 0xDF, 0xB9,
+    0x39, 0x0D, 0xAE, 0x65, 0xCF, 0x53, 0x9C, 0x82, 0xA2, 0xE5, 0x40, 0xF9, 0xF6, 0xDF, 0xBA, 0x33,
+    0x96, 0xF3, 0x55, 0x25, 0x35, 0x9E, 0x5F, 0x9B, 0x25, 0x39, 0x94, 0x2F, 0x03, 0xA6, 0x28, 0xB0,
+    0x6A, 0xFF, 0xFA, 0x14, 0xD6, 0xE7, 0x02, 0x07, 0x8F, 0x1A, 0xC4, 0xF0, 0x51, 0x34, 0x3D, 0xD3,
+    0xDF, 0xCB, 0x57, 0xC3, 0xF5, 0x04, 0xE2, 0x4C, 0x58, 0x18, 0xA5, 0xE2, 0x39, 0xB4, 0xA3, 0xE2,
+    0xE6, 0x25, 0xC5, 0xAC, 0xFD, 0x75, 0xB2, 0x2B, 0x5B, 0x93, 0xC5, 0xFF, 0x56, 0xDB, 0xAA, 0x6E,
+    0xCC, 0x18, 0x98, 0x90, 0x8A, 0x2C, 0x85, 0x84, 0xE7, 0xCF, 0xB0, 0xC5, 0x18, 0x1F, 0x59, 0xC7,
+    0xA4, 0xCE, 0xAD, 0xB2, 0x04, 0x41, 0xBD, 0x56, 0xD3, 0x12, 0xD5, 0x0A, 0x19, 0x83, 0x6D, 0xED,
+    0x87, 0xB0, 0xAB, 0xAE, 0x8F, 0x79, 0xE5, 0x51, 0x30, 0xE9, 0x90, 0xBB, 0x91, 0x38, 0x2A, 0x17,
+    0xDE, 0x3F, 0x53, 0x54, 0x34, 0x1E, 0x3F, 0x20, 0xE1, 0xA5, 0x17, 0xD5, 0xCD, 0x64, 0x62, 0x1C,
+    0x60, 0xD2, 0xFC, 0xC1, 0x86, 0xA1, 0x55, 0x62, 0x29, 0x58, 0x33, 0xD6, 0x1D, 0x3F, 0xD2, 0x70,
+    0xD6, 0x79, 0x09, 0x35, 0x23, 0x6B, 0xEA, 0x8E, 0x80, 0xEB, 0x43, 0xAF, 0xBF, 0x86, 0xE8, 0xD6,
+    0xBB, 0x1F, 0x75, 0x7A, 0x43, 0xAC, 0xC7, 0x84, 0x85, 0xAD, 0xE1, 0x72, 0x4A, 0xF8, 0x97, 0xBE,
+    0xC6, 0x11, 0xCD, 0xAD, 0x99, 0xAE, 0xD4, 0x78, 0x4F, 0xFA, 0x76, 0x5F, 0x95, 0xEF, 0x0E, 0x0C,
+    0x86, 0x2F, 0x45, 0x6F, 0xB0, 0xED, 0x35, 0x87, 0x55, 0x79, 0x0B, 0x39, 0x0E, 0x13, 0x4A, 0x67,
+    0x9A, 0xC5, 0x27, 0xC7, 0x5C, 0x99, 0x84, 0x75, 0xE6, 0xD1, 0x66, 0x2F, 0x2F, 0x47, 0xA9, 0xE6,
+    0xDD, 0x9C, 0xCF, 0x10, 0x64, 0x33, 0xDE, 0xBB, 0x35, 0x54, 0x9F, 0xBB, 0x40, 0x1B, 0xF1, 0x53,
+    0x48, 0xA1, 0x68, 0x42, 0x39, 0x92, 0x52, 0xAE, 0xAC, 0xA5, 0x6E, 0xA4, 0x09, 0x96, 0x1A, 0xE8,
+    0x88, 0x59, 0x38, 0xF3, 0xCA, 0x72, 0x52, 0xCC, 0xB0, 0x4F, 0x2B, 0x86, 0xA9, 0xA9, 0x7D, 0xBF,
+    0x6F, 0x6A, 0x07, 0x89, 0x52, 0x99, 0xF8, 0x06, 0xE5, 0x28, 0xC5, 0x74, 0xEC, 0x81, 0xE1, 0xE8,
+    0x25, 0x66, 0xD7, 0x7F, 0xEA, 0x51, 0x56, 0xF7, 0xA8, 0x06, 0x44, 0xE9, 0xE0, 0x2F, 0x33, 0x19,
+    0x4A, 0xD1, 0xCD, 0x92, 0x19, 0x2A, 0x1F, 0x03, 0x07, 0xD1, 0x46, 0x05, 0x0D, 0x64, 0x23, 0xEC,
+    0x4D, 0x4E, 0x03, 0x2A, 0xED, 0xA5, 0xF4, 0x9F, 0xC3, 0x93, 0xAB, 0xA3, 0xE2, 0x8C, 0x3F, 0xC4,
+    0xA5, 0xE1, 0x47, 0x0D, 0x1A, 0x37, 0x52, 0x9D, 0x45, 0x96, 0xE2, 0x4D, 0x7F, 0xFD, 0x06, 0x28,
+    0xE3, 0xEE, 0xE4, 0x57, 0x5D, 0x7B, 0x72, 0xA7, 0x8A, 0xCE, 0x77, 0x26, 0xCF, 0x98, 0x06, 0x31,
+    0xB7, 0x28, 0x73, 0x1D, 0xA3, 0x4F, 0xB5, 0x01, 0xE5, 0x4C, 0x14, 0xAD, 0xDB, 0x3F, 0xE6, 0xD1,
+    0xDA, 0xF7, 0x58, 0xBC, 0x54, 0x76, 0x9E, 0x99, 0xD4, 0xFC, 0x7F, 0xE9, 0x6D, 0xF9, 0xAE, 0xC2,
+    0x7B, 0x45, 0x32, 0x7D, 0x29, 0x22, 0xB2, 0xF3, 0x7D, 0x08, 0x37, 0x49, 0x0C, 0xB7, 0xC4, 0x0E,
+    0xE7, 0x6C, 0x1E, 0xA7, 0xBE, 0x75, 0x4E, 0x4C, 0x1A, 0xBD, 0x2F, 0xC6, 0x70, 0xD7, 0x38, 0xAE,
+    0x61, 0x3C, 0x01, 0xEB, 0x07, 0x25, 0xEA, 0x45, 0x21, 0x06, 0x99, 0xBF, 0xD0, 0xAC, 0xD1, 0xDB,
+    0x69, 0xF4, 0x64, 0x9F, 0xEB, 0xB3, 0xCF, 0xD8, 0xB1, 0x90, 0xAA, 0xAF, 0x80, 0x50, 0xA0, 0x92,
+    0xBA, 0x7E, 0xA2, 0x7B, 0x2D, 0x13, 0x7E, 0x9F, 0x4F, 0xFD, 0x0F, 0x40, 0xEC, 0x2D, 0x0E, 0x85,
+    0xB7, 0xDA, 0x01, 0x64, 0x95, 0x95, 0x66, 0x91, 0x15, 0x3F, 0x09, 0x77, 0xAC, 0xBF, 0x0D, 0x6F,
+    0x7C, 0xC1, 0xB7, 0x5F, 0xBD, 0xDA, 0xE9, 0xF7, 0xCC, 0x83, 0x17, 0x3B, 0x14, 0x20, 0x81, 0xE5,
+    0x9A, 0xA5, 0x4A, 0x40, 0xD7, 0x4A, 0x7A, 0x94, 0xE1, 0x6F, 0x3B, 0x27, 0xEA, 0x13, 0x7E, 0x5E,
+    0xE7, 0x4D, 0x96, 0xF1, 0x47, 0x8F, 0xD4, 0x79, 0x3D, 0x98, 0xD7, 0xCD, 0x3C, 0x35, 0x3A, 0x3F,
+    0x54, 0x3A, 0x48, 0x73, 0x66, 0xC3, 0xFD, 0x11, 0x87, 0x76, 0x0C, 0xF0, 0xC5, 0x08, 0x97, 0xA6,
+    0xC5, 0x88, 0x3F, 0x4F, 0xC7, 0x32, 0x72, 0x5C, 0xD4, 0x17, 0x8D, 0x45, 0x91, 0x62, 0xB2, 0xC3,
+    0x4A, 0xA4, 0x58, 0x88, 0x5C, 0x9C, 0xB5, 0x72, 0xFE, 0xE9, 0xB7, 0x73, 0x55, 0x7B, 0xD5, 0x91,
+    0x66, 0x02, 0x4C, 0xF7, 0x11, 0x77, 0x9D, 0x68, 0x4E, 0x1A, 0xC5, 0x6B, 0xB9, 0x0A, 0xC3, 0x7F,
+    0xB0, 0x48, 0x87, 0xC4, 0xC9, 0x29, 0x73, 0x1A, 0x25, 0xDA, 0x46, 0x3E, 0x10, 0x02, 0x9A, 0xCE,
+    0x23, 0xD9, 0x77, 0xC6, 0x0D, 0xA3, 0xD5, 0xF8, 0x6B, 0xE2, 0x10, 0x90, 0x01, 0xE7, 0xF7, 0xAF,
+    0x35, 0x59, 0x8D, 0x1D, 0xA7, 0x3B, 0xD2, 0x5A, 0x33, 0x33, 0xAF, 0xB0, 0xAC, 0xD1, 0x2A, 0x43,
+    0x79, 0x13, 0x5C, 0x2A, 0x55, 0x37, 0x52, 0xA1, 0x69, 0x17, 0x7F, 0xE9, 0x7C, 0xD7, 0x6D, 0x43,
+    0x57, 0xC3, 0x1B, 0x2E, 0x5D, 0xA0, 0x5B, 0x3D, 0x75, 0x4E, 0xF4, 0xA1, 0x24, 0xDE, 0x50, 0x18,
+    0x90, 0xB9, 0x89, 0xF1, 0x47, 0x4C, 0x61, 0xDB, 0xD8, 0xF0, 0x66, 0xD6, 0x1F, 0xB3, 0x9F, 0x91,
+    0x4D, 0x91, 0xFD, 0x6E, 0xB9, 0x4B, 0x47, 0xC9, 0xF6, 0x48, 0x07, 0xFB, 0xC6, 0x64, 0x48, 0x33,
+    0x5F, 0x92, 0x19, 0x22, 0xB7, 0x69, 0xE2, 0x9D, 0x69, 0x02, 0xE7, 0x47, 0x97, 0xAC, 0x52, 0xAA,
+    0xB6, 0x50, 0xC7, 0x9B, 0x16, 0x29, 0x15, 0x1F, 0x12, 0x46, 0xE0, 0xC0, 0x3F, 0xA9, 0xB0, 0x30,
+    0x47, 0xE7, 0x6F, 0x73, 0x62, 0xB0, 0xD6, 0x50, 0x20, 0x40, 0x47, 0x4C, 0x5D, 0x5C, 0xA1, 0xBA,
+    0x05, 0x8E, 0x06, 0x22, 0xEA, 0xDF, 0x4C, 0x52, 0xFE, 0x21, 0x72, 0x6B, 0xD4, 0xB1, 0xEF, 0x38,
+    0x74, 0xF5, 0xB3, 0x4D, 0x38, 0x91, 0x5F, 0x21, 0x74, 0x4B, 0x18, 0x27, 0xBD, 0x70, 0x4A, 0x6A,
+    0xBD, 0x62, 0x2A, 0xEE, 0xCE, 0xAE, 0x6B, 0x23, 0xA2, 0x97, 0x7E, 0x06, 0x24, 0xAE, 0x09, 0xD6,
+    0xC3, 0xEE, 0x10, 0x6D, 0x8D, 0x04, 0xF2, 0xAE, 0x09, 0x10, 0xB0, 0x54, 0xD0, 0x1C, 0x84, 0x55,
+    0xCF, 0xED, 0xFD, 0xB8, 0xDE, 0xF5, 0xA4, 0x5B, 0xFA, 0x7D, 0x7C, 0xAC, 0xC0, 0x85, 0x48, 0xB2,
+    0x05, 0x45, 0x05, 0x36, 0xDD, 0x9A, 0xD9, 0x43, 0x75, 0x94, 0xAF, 0xD5, 0xDF, 0x70, 0xE4, 0x7D,
+    0x37, 0x49, 0x0E, 0xE6, 0xD1, 0xC2, 0x1A, 0xBD, 0xCD, 0xC6, 0xD8, 0xC5, 0xAA, 0xD8, 0x90, 0x6E,
+    0xD7, 0x5D, 0xA4, 0x6B, 0x19, 0xB1, 0x7A, 0x18, 0xF1, 0x29, 0x4D, 0x20, 0xF7, 0x7A, 0x7F, 0x7C,
+    0xE6, 0x8A, 0x54, 0x05, 0xB7, 0xA0, 0xD9, 0x32, 0xDB, 0x53, 0xF6, 0x48, 0x65, 0x89, 0x86, 0x5B,
+    0x85, 0x7F, 0x11, 0x61, 0x0A, 0x99, 0xBE, 0x01, 0x56, 0xA3, 0xA7, 0x3A, 0xE6, 0xAB, 0xDF, 0x6B,
+    0xB4, 0x11, 0x24, 0xFC, 0x36, 0x30, 0x8C, 0x85, 0x06, 0xFB, 0x0C, 0xB9, 0xB2, 0x50, 0x51, 0xF8,
+    0xDD, 0x3B, 0xB3, 0xC7, 0x4E, 0x7A, 0x4A, 0x8E, 0x42, 0x01, 0xCB, 0xA9, 0xE5, 0x21, 0xD5, 0xDF,
+    0x8E, 0x59, 0x53, 0x82, 0xA8, 0xA0, 0x25, 0x9F, 0xCE, 0x99, 0x17, 0x9F, 0xC6, 0xD7, 0xDB, 0x67,
+    0xA7, 0x72, 0xC8, 0x22, 0x43, 0x32, 0x8E, 0x75, 0xE7, 0x29, 0xAC, 0x7A, 0x0A, 0x95, 0xC3, 0x32,
+    0xA9, 0x56, 0xE6, 0xD7, 0xFE, 0x29, 0xC1, 0x5C, 0x02, 0xB6, 0xD7, 0x16, 0x06, 0xC7, 0x86, 0x33,
+    0x68, 0x41, 0x64, 0xAE, 0x1D, 0xD6, 0xEC, 0x9F, 0x4D, 0x2A, 0x79, 0x01, 0xDB, 0x48, 0x52, 0xB7,
+    0x62, 0x36, 0x2B, 0x47, 0x2C, 0x0C, 0x9F, 0x10, 0xB0, 0x16, 0x34, 0x13, 0xAA, 0xF8, 0x18, 0xC5,
+    0xAA, 0xAF, 0x57, 0x03, 0xC9, 0x48, 0xE4, 0x75, 0x94, 0xCB, 0xDA, 0xC2, 0xDF, 0xDE, 0x92, 0x23,
+    0x1E, 0x07, 0xF8, 0x04, 0xFC, 0x90, 0x34, 0xCE, 0xC3, 0x9C, 0x87, 0xBF, 0xA6, 0x45, 0x1B, 0xFC,
+    0x73, 0x2B, 0xF8, 0x4E, 0x96, 0x82, 0xDA, 0xE8, 0x98, 0x87, 0x0D, 0x37, 0xCD, 0xD1, 0x3E, 0x31,
+    0x15, 0x72, 0x87, 0x3B, 0x67, 0xAF, 0x5D, 0x0B, 0x88, 0xFF, 0x44, 0xC1, 0xAB, 0xD1, 0x1E, 0x5F,
+    0xE6, 0x8B, 0xAD, 0x0F, 0x95, 0xFC, 0x9F, 0x8F, 0x91, 0xED, 0x36, 0xE2, 0xD6, 0x2E, 0xC3, 0x2D,
+    0x9E, 0x80, 0x6A, 0x78, 0x4A, 0xCA, 0x04, 0xCD, 0x64, 0x73, 0x7A, 0x81, 0x2D, 0x45, 0x53, 0xC8,
+    0xED, 0x68, 0x74, 0x36, 0x85, 0x83, 0xD9, 0x6F, 0x8C, 0xAF, 0xEC, 0xE5, 0xC1, 0xF1, 0x65, 0x0C,
+    0x45, 0xB4, 0xE7, 0xD1, 0xF8, 0x3C, 0xAA, 0xF3, 0x1E, 0xC7, 0x99, 0x78, 0x13, 0xC9, 0x55, 0x2B,
+    0xA8, 0x5C, 0x24, 0xE2, 0xDF, 0x43, 0x46, 0x09, 0xAD, 0xAB, 0x1D, 0xED, 0xAA, 0xE0, 0xE6, 0x09,
+    0xE2, 0x52, 0xE0, 0x5E, 0x78, 0xF8, 0x26, 0x88, 0x66, 0xB9, 0x98, 0x68, 0x52, 0x7A, 0xB4, 0xDF,
+    0x34, 0xAA, 0xF6, 0x1A, 0x4C, 0x3D, 0x36, 0x8D, 0xB7, 0x05, 0x5B, 0x0B, 0x00, 0xF8, 0x3B, 0xDD,
+    0x95, 0xB7, 0x47, 0x3A, 0xB0, 0x5A, 0x0A, 0xA8, 0x85, 0x17, 0xCB, 0x4E, 0x92, 0x47, 0x72, 0x92,
+    0x73, 0x6A, 0xAB, 0xB5, 0x7D, 0x99, 0xBC, 0x8B, 0xAC, 0x1B, 0xE8, 0x1A, 0xE6, 0x32, 0x11, 0x79,
+    0x2C, 0x6B, 0x88, 0x56, 0x70, 0x41, 0xED, 0xC3, 0x7E, 0x0A, 0xA8, 0xDF, 0xCA, 0xA8, 0xD4, 0x3E,
+    0x1A, 0xE0, 0x9E, 0x6D, 0x7C, 0xBD, 0x32, 0xB1, 0x7F, 0x7D, 0x32, 0x18, 0x4D, 0x18, 0x5E, 0xF3,
+    0x19, 0x30, 0xCA, 0x8C, 0x66, 0xB5, 0x77, 0x57, 0x5B, 0x98, 0x8F, 0x6D, 0x6B, 0x2D, 0x8D, 0xC4,
+    0x0B, 0x76, 0xE0, 0x37, 0x42, 0x02, 0xC4, 0x61, 0xFE, 0x43, 0x5F, 0x41, 0xA7, 0x40, 0x64, 0x45,
+    0xD6, 0x09, 0x99, 0x3F, 0x95, 0x73, 0x0D, 0x9F, 0xC4, 0xBE, 0x22, 0x2A, 0xE5, 0x4C, 0xAD, 0x32,
+    0xC2, 0xF3, 0x49, 0xC4, 0xCF, 0x9C, 0xD1, 0x63, 0x3E, 0xBA, 0xD3, 0x9B, 0x24, 0x2F, 0x52, 0xF3,
+    0xBA, 0x21, 0x2E, 0xEC, 0xDF, 0x8D, 0xAD, 0x3F, 0xF3, 0xE1, 0x23, 0x8C, 0x0D, 0x76, 0xDD, 0xCB,
+    0x36, 0xB9, 0x7A, 0x13, 0x78, 0xB2, 0x6D, 0xDB, 0x16, 0xAD, 0x2A, 0x94, 0xAC, 0xF9, 0x86, 0x8B,
+    0x2D, 0x75, 0x33, 0x86, 0x43, 0x18, 0xCF, 0x65, 0x4F, 0x08, 0x22, 0x88, 0x6E, 0x38, 0xBF, 0xF7,
+    0x12, 0x3F, 0x8A, 0xC3, 0x49, 0xA0, 0xC6, 0x03, 0xAB, 0x1C, 0xD5, 0x3D, 0xA2, 0x43, 0xFF, 0x93,
+    0xD4, 0x80, 0xDA, 0xDC, 0x77, 0x6D, 0xF8, 0xE1, 0xD3, 0x88, 0xA4, 0xCF, 0x82, 0xE0, 0x08, 0xB2,
+    0x6E, 0x98, 0xBA, 0x6C, 0x0A, 0x84, 0xA0, 0x94, 0x51, 0xFE, 0x17, 0x96, 0xF1, 0xBC, 0xD0, 0xFB,
+    0x6B, 0x50, 0x13, 0xA6, 0x8E, 0x42, 0xFA, 0x01, 0x8C, 0xF4, 0x04, 0x02, 0xB1, 0xA8, 0x53, 0x5D,
+    0x9B, 0x15, 0x48, 0xC3, 0x81, 0xCB, 0xAF, 0x4B, 0x4E, 0x61, 0xB6, 0x86, 0x5C, 0xB1, 0x83, 0x44,
+    0x5C, 0xB9, 0x3F, 0x31, 0x84, 0xEF, 0x75, 0x20, 0x66, 0x4C, 0x77, 0x66, 0x73, 0x04, 0x45, 0xB8,
+    0xE7, 0xBD, 0x14, 0xF9, 0x93, 0xC7, 0x17, 0x60, 0xE5, 0x63, 0xAE, 0x6A, 0xD6, 0x99, 0xCD, 0x10,
+    0x4F, 0x6B, 0xC1, 0x44, 0x63, 0x37, 0x79, 0x9C, 0x9C, 0xAA, 0xBC, 0x64, 0x19, 0x61, 0xB5, 0xC1,
+    0x52, 0x09, 0x6E, 0x6B, 0x6B, 0x90, 0x8B, 0xA6, 0x23, 0xDC, 0xE4, 0xE1, 0xB4, 0x82, 0x47, 0x11,
+    0x86, 0x9B, 0x9F, 0xE0, 0x24, 0xC0, 0x19, 0xAE, 0x7D, 0x9A, 0x8C, 0x49, 0x6C, 0x42, 0x6D, 0x4E,
+    0x1F, 0xC7, 0x66, 0x20, 0x19, 0xCA, 0xA0, 0xF0, 0x44, 0x1A, 0x61, 0x1E, 0x67, 0x58, 0x4B, 0xA4,
+    0x15, 0x8F, 0x26, 0x2C, 0xAC, 0xE8, 0xBA, 0x1D, 0x33, 0x77, 0x22, 0x83, 0xBB, 0xE1, 0x18, 0xBD,
+    0x45, 0x1A, 0xB4, 0x9F, 0x4F, 0x1F, 0x80, 0xE8, 0x99, 0x14, 0xB2, 0x1C, 0x1E, 0x4E, 0xBB, 0x04,
+    0xD6, 0x57, 0x50, 0x6F, 0x79, 0x60, 0xAA, 0xC1, 0xFD, 0x5D, 0xC7, 0x72, 0xA7, 0xBC, 0xD0, 0x29,
+    0x29, 0x32, 0xD9, 0xDF, 0x9D, 0xF4, 0xC6, 0xF6, 0x54, 0x67, 0xF4, 0x16, 0x3C, 0xB7, 0xA9, 0x06,
+    0x9D, 0xDC, 0xD9, 0x69, 0x4C, 0xD7, 0xC2, 0x8B, 0xF7, 0x7E, 0xAD, 0x7E, 0xD8, 0xC7, 0x23, 0x90,
+    0x1F, 0xD6, 0xC4, 0xD3, 0xBB, 0xD4, 0x57, 0x35, 0xF6, 0xD3, 0x52, 0x32, 0x18, 0x20, 0xEC, 0x33,
+    0x97, 0x01, 0xB5, 0x91, 0x7C, 0xCF, 0xB4, 0x6B, 0x55, 0x0C, 0x5C, 0x73, 0xE9, 0x8D, 0x9E, 0xDD,
+    0xCF, 0xF8, 0xDF, 0xB8, 0x21, 0x13, 0x62, 0x2B, 0x66, 0x6E, 0x76, 0x03, 0x04, 0x75, 0xAA, 0x56,
+    0xDF, 0x91, 0x5F, 0x26, 0x9B, 0xF9, 0x72, 0x25, 0x81, 0x63, 0x5B, 0xFE, 0xE4, 0x2A, 0x8E, 0x14,
+    0x03, 0xFD, 0x8D, 0x23, 0x35, 0x82, 0x64, 0x70, 0x30, 0x91, 0x3F, 0xBB, 0x19, 0x2C, 0x04, 0x9E,
+    0x44, 0xDC, 0x79, 0x9A, 0x7B, 0x69, 0x52, 0x08, 0xC3, 0x9E, 0x2A, 0xB9, 0x02, 0xD4, 0x19, 0xF2,
+    0x3A, 0x4A, 0x4C, 0x47, 0x08, 0x38, 0x4B, 0x2E, 0x75, 0xF8, 0x86, 0x7C, 0x09, 0x72, 0xEC, 0xB2,
+    0xAC, 0x9C, 0xEC, 0x42, 0x5C, 0x61, 0x7F, 0xD8, 0x24, 0x05, 0x88, 0x55, 0x3D, 0xB7, 0x79, 0x90,
+    0x73, 0x7D, 0x0A, 0x10, 0xF5, 0xB3, 0x5C, 0xC8, 0x8D, 0x5E, 0x59, 0x51, 0xD2, 0xDB, 0x4E, 0x5D,
+    0x4B, 0x39, 0x16, 0x14, 0xF2, 0xA2, 0x75, 0x28, 0x66, 0x45, 0xBF, 0x73, 0x60, 0xD3, 0xFD, 0x53,
+    0xDA, 0x8D, 0x5C, 0x94, 0x2E, 0x91, 0x14, 0xE2, 0xAA, 0xEF, 0x93, 0x82, 0x68, 0x0A, 0x69, 0x1F,
+    0xE2, 0x10, 0x26, 0xEB, 0x69, 0xD6, 0x35, 0x9B, 0x62, 0x05, 0x97, 0x7D, 0x04, 0x6D, 0x6C, 0x22,
+    0x3E, 0x7C, 0xAB, 0x13, 0xC0, 0xEF, 0x4C, 0xE1, 0x96, 0x5B, 0xB7, 0xA3, 0x80, 0xC2, 0x89, 0x1A,
+    0x2F, 0x47, 0x0B, 0xD9, 0x76, 0x6C, 0xD3, 0x03, 0x08, 0xA3, 0x8E, 0x9B, 0xAE, 0xA1, 0x55, 0x73,
+    0x7B, 0x9F, 0xAE, 0x40, 0xB6, 0x0C, 0x0A, 0x8A, 0x83, 0x7A, 0x88, 0x6B, 0x3E, 0xD7, 0x98, 0x7F,
+    0x43, 0x40, 0x01, 0xE4, 0x3A, 0xFF, 0x26, 0xEC, 0x91, 0x68, 0x71, 0xD8, 0x84, 0x18, 0xC1, 0xD5,
+    0xAB, 0xA2, 0xBB, 0xCC, 0xEA, 0x43, 0x79, 0x73, 0x97, 0x4C, 0x9B, 0x03, 0xD0, 0x10, 0x7C, 0x09,
+    0x84, 0x32, 0x04, 0x0A, 0x35, 0xA6, 0x29, 0xAB, 0x6E, 0x26, 0x9A, 0xCF, 0x49, 0x8F, 0x15, 0xC2,
+    0xAC, 0x56, 0xD6, 0x82, 0xB9, 0x3C, 0xD2, 0xDD, 0x68, 0xB7, 0x43, 0xBC, 0xBC, 0xFD, 0xA4, 0xC5,
+    0xCE, 0x5C, 0xC0, 0xD3, 0x93, 0xD6, 0x40, 0xAF, 0xDA, 0x23, 0x55, 0x83, 0x3A, 0xE6, 0x6C, 0x64,
+    0xA0, 0x37, 0xC0, 0x47, 0xBA, 0xAA, 0x62, 0x79, 0x56, 0x85, 0x55, 0xC1, 0xEA, 0x80, 0xD5, 0x3C,
+    0xBB, 0x9F, 0x89, 0xEA, 0x45, 0xFC, 0x59, 0x6C, 0x26, 0xF0, 0x07, 0x72, 0x31, 0xCC, 0x5F, 0x8F,
+    0xA5, 0x61, 0x20, 0x16, 0x55, 0x4D, 0x87, 0x72, 0x13, 0xE6, 0xA9, 0xB3, 0xAF, 0xBD, 0x42, 0x08,
+    0x39, 0xD5, 0xCF, 0x81, 0xCA, 0x5E, 0xD0, 0xAB, 0x77, 0xB0, 0x05, 0x7E, 0x73, 0x87, 0xFE, 0xF4,
+    0xA7, 0x7F, 0x00, 0xBE, 0xF9, 0x67, 0x83, 0x64, 0x61, 0x19, 0x4F, 0x23, 0x21, 0xD9, 0x37, 0xB7,
+    0x54, 0xD3, 0x2F, 0x0C, 0x39, 0xD2, 0xA4, 0x78, 0xFD, 0x3C, 0x9F, 0x5C, 0xC5, 0x16, 0x55, 0x9B,
+    0xBB, 0x96, 0x72, 0x13, 0x1D, 0xCC, 0xAF, 0xB4, 0xC1, 0xEB, 0x7D, 0xF9, 0xA1, 0x37, 0x93, 0x13,
+    0xC3, 0xDB, 0x58, 0xF8, 0x7C, 0xFB, 0x2E, 0x91, 0x7B, 0x6D, 0x21, 0xE2, 0xCE, 0xB1, 0xAF, 0x8A,
+    0x55, 0x25, 0x5A, 0x08, 0x35, 0xAD, 0xF6, 0x1E, 0x54, 0x56, 0xB9, 0x52, 0xA8, 0x9F, 0x9F, 0x06,
+    0x9B, 0x30, 0x7B, 0x5F, 0x25, 0x13, 0x7C, 0xD4, 0xA7, 0x56, 0xE3, 0x48, 0x55, 0x40, 0xB8, 0x3E,
+    0x11, 0x7B, 0x81, 0x89, 0x2E, 0x40, 0x76, 0x1D, 0x4C, 0x30, 0xCF, 0xBE, 0xA6, 0x66, 0x25, 0x69,
+    0x9B, 0xE7, 0x85, 0x36, 0x71, 0x45, 0xD4, 0x54, 0x24, 0x3B, 0x2D, 0x16, 0x9B, 0xD6, 0xE6, 0x91,
+    0x13, 0x53, 0x6E, 0x56, 0x21, 0xB6, 0x3C, 0x12, 0x23, 0x20, 0xC9, 0xB7, 0xDD, 0xF1, 0x04, 0x1C,
+    0x49, 0x58, 0x44, 0x97, 0x4A, 0x21, 0x36, 0x0C, 0x7D, 0xDE, 0x3F, 0x2F, 0xE6, 0x8E, 0x05, 0x42,
+    0x28, 0x2A, 0xA5, 0x0F, 0xF1, 0x31, 0x7B, 0x9A, 0x1B, 0x36, 0x40, 0x48, 0xC3, 0xC4, 0x59, 0x8F,
+    0xFF, 0x82, 0x2F, 0xE2, 0x75, 0xEF, 0x54, 0x39, 0x31, 0xC8, 0x5F, 0xD2, 0xDA, 0x74, 0x50, 0x47,
+    0x45, 0x16, 0xC9, 0xF8, 0x2B, 0xAE, 0x07, 0x6B, 0x18, 0xF6, 0x22, 0x1F, 0xF4, 0x39, 0x6D, 0x13,
+    0x83, 0x0C, 0xCB, 0xF3, 0x12, 0x1B, 0xB4, 0x27, 0xB6, 0xB1, 0x67, 0x79, 0x29, 0xD7, 0xAF, 0x00,
+    0xF1, 0xE4, 0x14, 0xB4, 0xA1, 0x95, 0x54, 0x47, 0x19, 0x7B, 0xB0, 0xF6, 0x81, 0x42, 0x94, 0xE4,
+    0xD3, 0xA3, 0x9D, 0x74, 0xE5, 0x93, 0xEE, 0x02, 0x5A, 0x44, 0x9F, 0x25, 0xCB, 0xB2, 0x8E, 0xEE,
+    0xD8, 0xE7, 0x02, 0x5D, 0x83, 0x94, 0x68, 0xDD, 0xA4, 0x3E, 0x6A, 0x86, 0xE6, 0x2E, 0xFC, 0x1C,
+    0xC5, 0xAE, 0x91, 0x7D, 0x34, 0x12, 0xD5, 0x10, 0xD8, 0x4E, 0x34, 0x18, 0x6B, 0x72, 0x0D, 0x8F,
+    0x28, 0x17, 0xE2, 0x81, 0xD6, 0xE4, 0x70, 0xBB, 0x20, 0x0C, 0xE9, 0xA9, 0x65, 0xEC, 0xDC, 0x80,
+    0x41, 0x13, 0xB4, 0x53, 0x67, 0x1F, 0xF4, 0xB0, 0xA6, 0x4D, 0xB1, 0x43, 0x29, 0x00, 0xAD, 0x51,
+    0xE8, 0x4C, 0x6A, 0x62, 0x8B, 0xB9, 0xEE, 0x05, 0x53, 0xE5, 0xBE, 0xCC, 0xDD, 0x08, 0xA9, 0x89,
+    0x84, 0x04, 0xF3, 0xC4, 0xA9, 0x4E, 0x40, 0x18, 0xE4, 0xF8, 0xEC, 0xB0, 0xF4, 0x7B, 0x69, 0x6D,
+    0xD1, 0xB3, 0x5F, 0x53, 0x85, 0x14, 0xF5, 0xC9, 0xBE, 0x9D, 0x8E, 0x7B, 0x9A, 0x8C, 0x77, 0xA2,
+    0xD6, 0x97, 0xA3, 0x35, 0x48, 0x47, 0x93, 0x5C, 0x2D, 0xB7, 0xBA, 0x80, 0xC0, 0xB5, 0xD5, 0x24,
+    0x40, 0xA8, 0xB6, 0xA6, 0x4E, 0x4C, 0x4C, 0xE8, 0x60, 0xE4, 0xF7, 0xDC, 0x24, 0xD9, 0x0F, 0x3C,
+    0xC7, 0x86, 0xC9, 0xEB, 0xEA, 0xD9, 0xDC, 0x12, 0x50, 0x30, 0xB2, 0x7D, 0x28, 0x2E, 0x9D, 0x7C,
+    0xC3, 0x72, 0x6D, 0x22, 0x40, 0x81, 0x1A, 0x5B, 0xED, 0x16, 0xDD, 0x6D, 0x15, 0x83, 0xD1, 0xC6,
+    0x35, 0xBD, 0x11, 0x1F, 0x0F, 0x60, 0x89, 0x22, 0xCD, 0x63, 0x39, 0x42, 0x2B, 0x05, 0xE5, 0x40,
+    0x89, 0xC3, 0x64, 0xBC, 0xB2, 0x7B, 0x1E, 0xBF, 0x37, 0x68, 0x0A, 0x82, 0xD8, 0x71, 0x10, 0xE7,
+    0xD3, 0xEB, 0xF9, 0x24, 0xBD, 0x5F, 0x62, 0x7F, 0xAA, 0xF0, 0x5B, 0xE5, 0x75, 0xCB, 0x84, 0xA4,
+    0x66, 0x78, 0x80, 0xE4, 0xD5, 0x04, 0x02, 0xE4, 0xE6, 0x79, 0x67, 0xC2, 0x79, 0x92, 0x3C, 0x32,
+    0x8C, 0xB6, 0x1D, 0x21, 0xDB, 0xB8, 0x91, 0x88, 0x76, 0xBD, 0x20, 0x30, 0x8A, 0x87, 0x49, 0x7F,
+    0x54, 0x32, 0x95, 0x3D, 0x1F, 0x44, 0xDE, 0xA0, 0xE6, 0x4D, 0x00, 0xE9, 0x1F, 0x12, 0x49, 0x2A,
+    0x73, 0x58, 0x55, 0xB2, 0x22, 0x36, 0x46, 0x37, 0x6E, 0x89, 0xCF, 0x8E, 0x17, 0x91, 0x8C, 0xD3,
+    0xAE, 0x40, 0x75, 0x66, 0xAA, 0xAD, 0x37, 0x77, 0x00, 0x9B, 0x56, 0x98, 0x52, 0x1F, 0x41, 0x01,
+    0x60, 0x6A, 0x3D, 0xB1, 0x07, 0x5F, 0x57, 0x72, 0xE6, 0x69, 0x0B, 0x93, 0xE7, 0x1B, 0xB1, 0x54,
+    0x26, 0xB0, 0x52, 0xA1, 0xB1, 0x0A, 0x1A, 0x59, 0xBD, 0xA5, 0x70, 0x98, 0x21, 0xCD, 0x09, 0x35,
+    0x1A, 0x29, 0x03, 0x10, 0xAC, 0x40, 0x90, 0x47, 0xFB, 0xA3, 0x07, 0xB4, 0x43, 0xCC, 0x37, 0x14,
+    0xC9, 0xA8, 0xD4, 0x5A, 0xD0, 0x70, 0xF9, 0x85, 0xAC, 0xF3, 0xFA, 0xA5, 0x5A, 0x9A, 0xF1, 0xC3,
+    0x54, 0xDC, 0xE1, 0x00, 0x2D, 0xD6, 0xCF, 0x7A, 0x02, 0x87, 0x8B, 0x49, 0x6C, 0x19, 0xF4, 0x68,
+    0xDE, 0x5F, 0x11, 0x91, 0xF1, 0x7A, 0xF2, 0x34, 0xA5, 0xDF, 0x42, 0x01, 0x2E, 0x2F, 0x12, 0x91,
+    0xA9, 0x5E, 0x23, 0x6E, 0xFC, 0x1C, 0x96, 0xFA, 0xE8, 0xBB, 0x4A, 0x42, 0x7F, 0xB7, 0xEE, 0x12,
+    0x3C, 0x25, 0xDB, 0x7B, 0x95, 0xED, 0xF6, 0xAB, 0xBC, 0x59, 0xE4, 0xF3, 0x15, 0x71, 0xAB, 0xAB,
+    0x1B, 0x27, 0x6B, 0x48, 0x44, 0x52, 0xC3, 0xA3, 0xB0, 0xC1, 0x49, 0xCE, 0x74, 0xD9, 0x9D, 0xC8,
+    0xAC, 0x71, 0xB5, 0xB9, 0x1B, 0xA6, 0xD3, 0xF9, 0x84, 0x30, 0xAE, 0x9E, 0x69, 0x31, 0xB8, 0xB4,
+    0x64, 0xE8, 0xD9, 0x47, 0xBD, 0x63, 0xB5, 0x25, 0x30, 0x1A, 0xD7, 0xB2, 0xC0, 0xBD, 0x75, 0x30,
+    0x55, 0x02, 0x5B, 0xC6, 0xE6, 0x63, 0x69, 0x65, 0xAF, 0xE7, 0x7B, 0xAB, 0x5D, 0xA6, 0xA5, 0xC4,
+    0xAF, 0xDE, 0xAC, 0x67, 0x1E, 0x7F, 0x73, 0x55, 0x2C, 0x33, 0x25, 0x83, 0x24, 0x3F, 0xB0, 0x48,
+    0xFC, 0x08, 0xB9, 0x60, 0xBB, 0xFB, 0x3D, 0xFD, 0xA3, 0xF6, 0xF2, 0x1B, 0x89, 0x82, 0x87, 0xD1,
+    0x10, 0xE5, 0xBD, 0xEF, 0x16, 0xA7, 0x3F, 0x15, 0x32, 0x11, 0x50, 0xB9, 0x7D, 0x77, 0x15, 0x0F,
+    0xBA, 0xFE, 0x76, 0x0A, 0x4F, 0xF2, 0xA0, 0xFB, 0x2D, 0xF1, 0xCE, 0x5E, 0xE7, 0x50, 0x6A, 0xA0,
+    0xB2, 0xB4, 0xEE, 0x2B, 0xD5, 0x3B, 0x03, 0x07, 0xB0, 0x40, 0x4A, 0x26, 0xF4, 0x3E, 0x1F, 0xC4,
+    0x58, 0x80, 0x8A, 0x3B, 0x00, 0x52, 0x2B, 0x53, 0xBF, 0xD4, 0x8F, 0xEE, 0x6D, 0xA4, 0x0D, 0xF7,
+    0x82, 0xF8, 0x53, 0xDA, 0xF6, 0x53, 0xAF, 0xF8, 0xD2, 0xD8, 0xFB, 0x1F, 0x2D, 0x98, 0x87, 0xDA,
+    0x19, 0xAC, 0x48, 0x6B, 0xEA, 0xDE, 0x08, 0xA6, 0x13, 0x37, 0x1B, 0x2C, 0x15, 0x60, 0xB2, 0xDB,
+    0x28, 0x0E, 0x2E, 0xA3, 0x4A, 0xB1, 0xF2, 0x5C, 0x48, 0x69, 0x46, 0xFA, 0x08, 0x9F, 0xE9, 0x65,
+    0x2F, 0x3A, 0x29, 0xB0, 0x88, 0xB5, 0x13, 0x44, 0x41, 0x92, 0x30, 0x74, 0x9C, 0x9C, 0xD8, 0xC8,
+    0xB1, 0x59, 0x42, 0x67, 0xAC, 0xC8, 0x0D, 0xFF, 0x8E, 0x52, 0x4C, 0xED, 0x86, 0xFF, 0x4E, 0x45,
+    0xBE, 0xC4, 0xAF, 0x32, 0xE4, 0xBC, 0x41, 0xC5, 0xDC, 0x3F, 0x71, 0x8C, 0x2C, 0xAD, 0x78, 0x7E,
+    0x79, 0x47, 0xB2, 0x02, 0xA6, 0x11, 0xDE, 0x0F, 0x5D, 0xAD, 0xFE, 0x8D, 0x6B, 0x09, 0xEA, 0x28,
+    0x4B, 0xB1, 0x9F, 0xD3, 0x09, 0x4A, 0x77, 0x52, 0x58, 0xA2, 0x31, 0xC1, 0x48, 0xF1, 0x35, 0x48,
+    0x46, 0x93, 0xDB, 0x22, 0xFD, 0x06, 0x49, 0xEB, 0x22, 0xE8, 0xB3, 0x9C, 0xCF, 0x40, 0x8B, 0xC7,
+    0x35, 0x07, 0xBD, 0x2C, 0x21, 0xFB, 0x15, 0x53, 0x38, 0x0B, 0x61, 0x10, 0x75, 0x11, 0x17, 0x1F,
+    0xE1, 0x76, 0x10, 0x53, 0x66, 0x2E, 0x36, 0x65, 0xF6, 0x62, 0x19, 0xAC, 0x68, 0x63, 0x1D, 0x17,
+    0x6C, 0x49, 0x6C, 0xA8, 0x40, 0x49, 0xFC, 0xBA, 0x63, 0x25, 0x5E, 0x79, 0x07, 0x10, 0xC3, 0x3C,
+    0xC5, 0x81, 0x14, 0xBB, 0xCD, 0xC3, 0x63, 0x36, 0x9F, 0xB9, 0x68, 0x54, 0x8D, 0x31, 0x66, 0xC8,
+    0xF7, 0x4A, 0xA0, 0x68, 0x8A, 0xCC, 0xE2, 0xB8, 0x50, 0x88, 0x7B, 0xFF, 0x38, 0xE0, 0x8B, 0x90,
+    0x0C, 0x98, 0xF1, 0xC5, 0x5F, 0xFA, 0x2A, 0x37, 0x6A, 0x3C, 0x39, 0xC0, 0xF1, 0x29, 0x0F, 0xC1,
+    0xA6, 0xCE, 0xCC, 0x98, 0xD7, 0x9C, 0xAE, 0x71, 0xAB, 0xFE, 0xA1, 0xC6, 0x0E, 0xF7, 0xE7, 0x60,
+    0x9B, 0x63, 0x50, 0x00, 0x8B, 0x1A, 0xC4, 0xF2, 0xDB, 0xFF, 0xCB, 0xC8, 0xDC, 0x23, 0x49, 0xA9,
+    0xFB, 0xF3, 0x1A, 0x09, 0xA5, 0x27, 0xD5, 0x18, 0x4C, 0x84, 0x2E, 0x6E, 0x56, 0x39, 0x3F, 0xD3,
+    0x08, 0xDE, 0x76, 0x90, 0xC1, 0x43, 0x33, 0x32, 0xF8, 0x76, 0x59, 0x48, 0x14, 0xCD, 0x2E, 0x19,
+    0xDF, 0x8B, 0x72, 0xAF, 0xB2, 0x2F, 0xD9, 0x5C, 0x5C, 0x87, 0x8C, 0x3A, 0x66, 0x86, 0xBD, 0xEA,
+    0x82, 0xFC, 0x36, 0xFA, 0x05, 0xE8, 0xE0, 0x07, 0x53, 0xD8, 0x68, 0xD4, 0x86, 0x3A, 0xA4, 0x64,
+    0xD5, 0x13, 0x16, 0x3F, 0x9B, 0x1D, 0x60, 0x3A, 0x46, 0xAF, 0x99, 0x89, 0xBF, 0x1A, 0xD2, 0x45,
+    0xF8, 0xD7, 0x86, 0x6E, 0x0C, 0x3A, 0xCD, 0x69, 0x05, 0x1A, 0x07, 0x7D, 0x52, 0x96, 0xE1, 0xB6,
+    0x84, 0xE9, 0x63, 0x5B, 0x3D, 0xEE, 0xF6, 0xDC, 0x8A, 0xE2, 0xDC, 0xFA, 0xDD, 0xD6, 0x5F, 0xA3,
+    0x17, 0xD3, 0xE6, 0x3C, 0xC6, 0xEE, 0x7C, 0x84, 0x6F, 0x82, 0x9A, 0x01, 0xF7, 0xC4, 0x71, 0x69,
+    0x0B, 0x56, 0xEB, 0x48, 0xB3, 0x09, 0x23, 0x05, 0x26, 0x47, 0xD5, 0x8B, 0x2D, 0x8B, 0x91, 0x73,
+    0xF8, 0x14, 0xAC, 0xE6, 0xEE, 0xB3, 0x40, 0x6D, 0x43, 0x70, 0x18, 0x8A, 0xA4, 0xA9, 0x9A, 0x66,
+    0x77, 0x85, 0x7E, 0x0F, 0x48, 0x24, 0x0B, 0xF1, 0x15, 0xEF, 0xBB, 0x25, 0xB8, 0x44, 0x43, 0x8E,
+    0x91, 0x29, 0x74, 0x43, 0xEC, 0xF9, 0x31, 0x48, 0x97, 0xFC, 0xDF, 0x5A, 0xA9, 0x3B, 0x50, 0xAB,
+    0x9E, 0xE5, 0x93, 0xF3, 0x39, 0xD8, 0x4E, 0xAB, 0x7F, 0xAD, 0x2E, 0x83, 0x7F, 0x85, 0x46, 0x24,
+    0xE7, 0x76, 0xF4, 0x64, 0xFF, 0x6A, 0xDA, 0x79, 0x2F, 0x49, 0x16, 0xD8, 0xF1, 0x54, 0xD6, 0x37,
+    0xCB, 0x50, 0x13, 0xA0, 0xB2, 0x4E, 0xDC, 0x1E, 0xF0, 0x59, 0xB4, 0x4F, 0xB4, 0x9B, 0x6D, 0x17,
+    0xA1, 0x4C, 0x25, 0x24, 0x71, 0x3C, 0x06, 0x6D, 0xEE, 0x35, 0x8D, 0xA7, 0x6E, 0x1C, 0x59, 0x17,
+    0x7A, 0xA5, 0xB4, 0x14, 0x9F, 0x12, 0x8D, 0xE0, 0xC1, 0xEE, 0xAA, 0xE5, 0xF6, 0x9D, 0x2F, 0x81,
+    0x75, 0x9F, 0xCC, 0xE4, 0xE1, 0x87, 0x85, 0x65, 0x86, 0x08, 0xD4, 0xC2, 0xC5, 0xE1, 0x87, 0x4C,
+    0x76, 0x25, 0xFC, 0x9F, 0x70, 0x08, 0x5C, 0x69, 0xB2, 0xEF, 0xDD, 0x2E, 0x41, 0xAF, 0x8E, 0x8A,
+    0x51, 0x0F, 0x1E, 0x7D, 0xD2, 0x24, 0x8C, 0x70, 0x4D, 0xB9, 0x22, 0x8B, 0x39, 0x51, 0xEF, 0xCB,
+    0x19, 0x16, 0xDC, 0x38, 0xF2, 0x95, 0xE6, 0x39, 0xD0, 0x2A, 0x59, 0x2D, 0xD0, 0xFA, 0xC3, 0x7E,
+    0xC7, 0x43, 0xF1, 0x74, 0x11, 0x1D, 0x4D, 0xA2, 0x35, 0x35, 0xCA, 0x97, 0x05, 0x02, 0x2B, 0xA2,
+    0x82, 0x23, 0x36, 0xEF, 0xFC, 0xEC, 0xA9, 0x0A, 0x1B, 0xCA, 0x55, 0x77, 0x11, 0xAC, 0x3F, 0xCC,
+    0xA7, 0xF5, 0x12, 0x1D, 0x7C, 0x4C, 0xA3, 0xF9, 0x14, 0x85, 0x1D, 0x8E, 0x5E, 0xD3, 0x49, 0x52,
+    0x9D, 0x37, 0x6D, 0x8E, 0x35, 0x8C, 0xA9, 0xFE, 0x37, 0x23, 0x56, 0xB8, 0x05, 0x65, 0x54, 0x07,
+    0xF2, 0xC6, 0xED, 0x70, 0x10, 0xA1, 0x97, 0x77, 0xD4, 0xD7, 0x77, 0x50, 0x50, 0x16, 0x8C, 0x6E,
+    0x45, 0xED, 0x9D, 0xB4, 0xF3, 0xE5, 0x82, 0x37, 0x99, 0x67, 0x53, 0x68, 0xC6, 0x22, 0x33, 0xFD,
+    0x0C, 0xAD, 0x18, 0x24, 0x76, 0x06, 0x26, 0x5D, 0x9B, 0x14, 0xF6, 0xCC, 0xB8, 0x48, 0x7E, 0x85,
+    0x15, 0x35, 0xC7, 0x16, 0x1F, 0xE5, 0x3A, 0x41, 0x9B, 0xB6, 0xA8, 0x64, 0x48, 0x57, 0x32, 0x60,
+    0x91, 0xE5, 0xC1, 0x41, 0xEC, 0x4C, 0x97, 0xEF, 0xD4, 0xF8, 0x84, 0x41, 0x61, 0x47, 0x17, 0x08,
+    0x96, 0xC3, 0xBB, 0xF3, 0xB7, 0x2C, 0xF6, 0xB9, 0xA1, 0x89, 0x78, 0x79, 0x73, 0x89, 0x4C, 0x07,
+    0x34, 0x4E, 0x75, 0x88, 0xA8, 0x18, 0x54, 0x3C, 0xF3, 0x8F, 0xED, 0x04, 0xE7, 0x86, 0xD7, 0x8B,
+    0xED, 0x34, 0x6B, 0xCF, 0x29, 0x1F, 0x7A, 0x54, 0x7E, 0x8A, 0xE1, 0x81, 0x4C, 0xEE, 0xEA, 0x23,
+    0x7B, 0x3F, 0x16, 0x24, 0x71, 0x9D, 0x97, 0xF8, 0x5B, 0xD0, 0x73, 0x86, 0xFA, 0x21, 0x27, 0x3E,
+    0x73, 0x1F, 0x0C, 0x36, 0x87, 0x56, 0x2F, 0x21, 0x10, 0x38, 0xFD, 0x14, 0xB4, 0x1E, 0xAB, 0x3B,
+    0xC1, 0x54, 0xE2, 0xDB, 0xB5, 0x76, 0xF2, 0x61, 0x14, 0xBA, 0x19, 0x23, 0x7C, 0x53, 0x30, 0xC8,
+    0x0C, 0x62, 0x61, 0x93, 0x41, 0x83, 0x1C, 0xA7, 0x2D, 0x15, 0xD5, 0x67, 0x95, 0xEE, 0xBD, 0xDB,
+    0x27, 0x31, 0x16, 0x81, 0xC9, 0x3A, 0x78, 0xFC, 0xB2, 0x26, 0x10, 0x3F, 0xCA, 0x89, 0x11, 0xB0,
+    0x03, 0xE1, 0xB9, 0x7E, 0xDE, 0x0C, 0x34, 0xD1, 0xAA, 0x72, 0x34, 0x90, 0xD8, 0x62, 0x74, 0xAE,
+    0xA7, 0x63, 0x96, 0xCD, 0xBA, 0x58, 0x60, 0x6E, 0xD1, 0x6C, 0x6B, 0xAE, 0xB2, 0x15, 0x7E, 0x12,
+    0x1A, 0x29, 0x03, 0x2E, 0x28, 0x98, 0x59, 0x52, 0xE2, 0x94, 0xAC, 0x18, 0x00, 0x1B, 0x2D, 0xCC,
+    0xE0, 0xDC, 0x71, 0xA0, 0x97, 0xAF, 0xA1, 0xD3, 0x9D, 0xA6, 0xEE, 0x62, 0xB4, 0x51, 0xBE, 0xE9,
+    0xF0, 0x23, 0xBD, 0x5A, 0xED, 0x16, 0xEC, 0x01, 0x70, 0x8F, 0x39, 0xF2, 0xF9, 0xD8, 0x6D, 0x54,
+    0x6A, 0xD3, 0x70, 0x7B, 0xE4, 0x6E, 0x1D, 0x40, 0xF4, 0x4A, 0x04, 0xA6, 0x3A, 0x2B, 0x76, 0x62,
+    0x7F, 0x04, 0xC2, 0x0B, 0xB0, 0xAC, 0xB6, 0xE1, 0x85, 0x8A, 0xD5, 0x35, 0xCA, 0xDF, 0xDE, 0x8A,
+    0x57, 0x34, 0x51, 0xD0, 0x44, 0xC0, 0xBB, 0x51, 0x16, 0x44, 0x3F, 0xC7, 0xC4, 0x10, 0x3B, 0x06,
+    0xB2, 0xB7, 0xA1, 0xF4, 0x9C, 0x2F, 0xFA, 0xD3, 0x46, 0x51, 0xC3, 0x25, 0x9A, 0x94, 0xB8, 0x78,
+    0xE3, 0x3B, 0x63, 0x64, 0x61, 0xF6, 0x1D, 0x4C, 0x9C, 0xFF, 0x68, 0x18, 0xCC, 0x51, 0xD0, 0xC3,
+    0x0B, 0x67, 0x0D, 0xED, 0x78, 0xF4, 0xD7, 0x26, 0x41, 0x0C, 0xEE, 0xB7, 0x35, 0x72, 0xDA, 0x39,
+    0x3D, 0x20, 0x35, 0xF0, 0xC8, 0xF2, 0x6A, 0x29, 0xE3, 0x03, 0x90, 0x80, 0xE7, 0x76, 0xBA, 0x78,
+    0x5E, 0x5C, 0x9A, 0x35, 0x05, 0x9C, 0x2E, 0xB8, 0xA8, 0x86, 0x2F, 0xD3, 0xEA, 0x37, 0x7D, 0xED,
+    0x66, 0xA8, 0x4E, 0xEF, 0xA3, 0xBF, 0x3F, 0x85, 0x21, 0x94, 0x59, 0x23, 0x3A, 0xB5, 0x42, 0x6D,
+    0x95, 0x3D, 0x9A, 0xE2, 0x2A, 0x08, 0xC9, 0xD5, 0x6D, 0xC3, 0x6C, 0x09, 0x09, 0xAC, 0x48, 0x4A,
+    0x7A, 0x46, 0xB7, 0x34, 0x03, 0xF0, 0x8A, 0x33, 0x3E, 0xAE, 0x27, 0xFD, 0x2D, 0xF8, 0xAB, 0xE4,
+    0x82, 0x81, 0x93, 0x65, 0x4E, 0xC2, 0x0D, 0x6D, 0xD0, 0xEA, 0xDF, 0x8D, 0xA5, 0xD6, 0xA1, 0x45,
+    0x7F, 0x08, 0xE1, 0x93, 0x7E, 0x87, 0x50, 0x84, 0xDE, 0x7D, 0x03, 0x9F, 0x3C, 0xD9, 0x81, 0x31,
+    0x1B, 0x1E, 0xA1, 0x82, 0x17, 0x76, 0xE4, 0x3F, 0x45, 0xC9, 0x2E, 0x8E, 0x72, 0xE3, 0x43, 0xF1,
+    0x84, 0xF2, 0xFC, 0x0B, 0x8E, 0x6E, 0xB4, 0x5F, 0x10, 0xF2, 0x3E, 0xC0, 0x7D, 0x57, 0xC2, 0x3E,
+    0xE9, 0x15, 0x4F, 0xC8, 0x0B, 0x65, 0x53, 0xBB, 0xD9, 0x50, 0xA2, 0x5C, 0xCB, 0x11, 0x14, 0x77,
+    0xDF, 0x2A, 0x18, 0x43, 0x3E, 0xE0, 0x1D, 0x30, 0x6E, 0xF3, 0xFE, 0xB7, 0x3D, 0x7B, 0x22, 0x7A,
+    0x73, 0xF4, 0x62, 0xBA, 0x82, 0x51, 0x5D, 0x42, 0x0B, 0x27, 0x0E, 0x13, 0x27, 0xB4, 0xB5, 0xB4,
+    0x29, 0xDA, 0x94, 0xB3, 0x99, 0x9B, 0x3B, 0x37, 0x6E, 0xB2, 0x28, 0x26, 0x52, 0xCF, 0x5C, 0xCB,
+    0x74, 0x95, 0x30, 0x50, 0x48, 0xC9, 0xAD, 0xEE, 0x8B, 0xC6, 0x72, 0x55, 0xEC, 0x28, 0x14, 0x00,
+    0x78, 0xC4, 0x42, 0x61, 0xBF, 0x96, 0x81, 0x06, 0xFA, 0x45, 0x4F, 0xC0, 0x1F, 0xC0, 0x4F, 0xCA,
+    0xEE, 0xBC, 0xCC, 0xF5, 0xAA, 0xC4, 0x78, 0x0A, 0x16, 0xF5, 0xD2, 0x65, 0x6D, 0xCD, 0x74, 0x2D,
+    0x87, 0x93, 0xBC, 0x51, 0x02, 0x68, 0xE0, 0x72, 0xE0, 0x5F, 0x98, 0x1E, 0x7D, 0x2B, 0x9F, 0xCD,
+    0x1D, 0xC7, 0x20, 0x34, 0xF5, 0x95, 0x82, 0x7A, 0x04, 0x80, 0x35, 0x96, 0x88, 0xB8, 0x1C, 0x26,
+    0x16, 0x62, 0xD9, 0x32, 0x91, 0xD0, 0x0F, 0x87, 0x23, 0x4E, 0x44, 0x25, 0x7C, 0x2A, 0xD4, 0x8E,
+    0x43, 0x0B, 0xEC, 0xA4, 0xD0, 0x92, 0x46, 0xEE, 0xB1, 0xC3, 0xC4, 0x61, 0xE5, 0xA9, 0x90, 0x0D,
+    0x03, 0x00, 0xBD, 0xA5, 0xEB, 0x81, 0xB0, 0x2B, 0xAB, 0xEF, 0x5F, 0x70, 0x6A, 0x80, 0x2F, 0xA1,
+    0xDC, 0xB3, 0x47, 0x7F, 0xF4, 0x8A, 0x41, 0xB2, 0x94, 0xEA, 0x06, 0x91, 0x92, 0x1D, 0xEF, 0x4A,
+    0xF1, 0x81, 0xAE, 0x8E, 0xA6, 0xE8, 0x7B, 0xC1, 0x46, 0xDD, 0x33, 0xBE, 0x14, 0x1C, 0x24, 0x27,
+    0xD8, 0xE0, 0xE7, 0x69, 0x9E, 0xFC, 0x53, 0x7E, 0x40, 0x2C, 0x13, 0xA7, 0xD6, 0x5A, 0x82, 0xD6,
+    0xFF, 0x09, 0xA8, 0x6B, 0xB1, 0x60, 0x82, 0x0A, 0xDD, 0x90, 0x1C, 0xE4, 0x6A, 0xA3, 0x18, 0xFB,
+    0x66, 0xD4, 0x4F, 0x9B, 0x28, 0xB2, 0x5B, 0xE7, 0x73, 0xCA, 0x33, 0x2F, 0x75, 0x57, 0x9B, 0xEA,
+    0x36, 0x03, 0xC4, 0x06, 0x22, 0x4D, 0xDE, 0x30, 0x57, 0x4C, 0x7C, 0x90, 0xE5, 0xCF, 0x88, 0x39,
+    0xF5, 0x19, 0x18, 0x18, 0x2A, 0x1A, 0x16, 0x11, 0xD8, 0x49, 0xCF, 0x5A, 0x4A, 0x51, 0x1B, 0x78,
+    0x1D, 0xF1, 0x65, 0xB2, 0x7C, 0xC7, 0xD4, 0xF1, 0xB1, 0x3D, 0xA3, 0x5C, 0x0A, 0xB5, 0x3E, 0x72,
+    0x4B, 0xE3, 0x28, 0xEA, 0xC9, 0x73, 0x9F, 0x36, 0xC1, 0x50, 0x4F, 0x19, 0x33, 0x47, 0xAB, 0x46,
+    0x71, 0x60, 0x0E, 0xE8, 0x1D, 0xD2, 0xDB, 0xD3, 0xD8, 0xF3, 0xA9, 0xD7, 0xE5, 0x25, 0x2B, 0xA2,
+    0x75, 0x36, 0x77, 0x55, 0x00, 0x8E, 0x67, 0xF1, 0xF9, 0xDE, 0x38, 0x45, 0x24, 0x84, 0x01, 0x15,
+    0xA6, 0xD2, 0x30, 0x91, 0x71, 0xE3, 0xA6, 0xA7, 0xF4, 0x52, 0x77, 0x76, 0x74, 0xC8, 0x43, 0x76,
+    0x3E, 0xBF, 0x61, 0xB1, 0xBD, 0x1C, 0x68, 0x10, 0x8B, 0x69, 0xCD, 0x90, 0x1C, 0x2D, 0x76, 0xD4,
+    0x4B, 0x3F, 0xF4, 0x3F, 0xC0, 0x8F, 0xB2, 0x13, 0x2D, 0x07, 0xC0, 0x9A, 0x03, 0x74, 0x11, 0x0A,
+    0xAA, 0x74, 0x61, 0xB7, 0x5F, 0x64, 0xE8, 0x0D, 0xE7, 0x57, 0x4C, 0x46, 0x36, 0xAE, 0x54, 0x71,
+    0xFD, 0x02, 0xD1, 0x6E, 0x18, 0x06, 0xCA, 0x74, 0x7F, 0xA8, 0xF4, 0xDF, 0x1A, 0x37, 0xF2, 0xD6,
+    0x43, 0xD3, 0xF5, 0x70, 0x22, 0xFD, 0x78, 0x24, 0x65, 0xF1, 0x90, 0x79, 0xE2, 0x12, 0x31, 0xBD,
+    0xAA, 0xFF, 0xA1, 0x89, 0x05, 0xBE, 0xAE, 0xCA, 0x1A, 0x4B, 0x9A, 0x6D, 0x24, 0xF3, 0xDF, 0x4E,
+    0xB2, 0xB9, 0x71, 0x10, 0x96, 0xCD, 0xA5, 0xEB, 0x99, 0xDA, 0x5D, 0xB1, 0xF4, 0x50, 0x30, 0x8F,
+    0x51, 0x6F, 0xDF, 0xF5, 0x7F, 0xB5, 0x8B, 0xD9, 0x58, 0xD2, 0x0C, 0x72, 0x00, 0xB2, 0x32, 0x62,
+    0x18, 0x78, 0xBD, 0x8A, 0x2B, 0x07, 0xB4, 0x5E, 0x4E, 0xB5, 0x1B, 0xE4, 0x4D, 0xD4, 0x59, 0x29,
+    0x8E, 0xAA, 0x97, 0x71, 0x66, 0x7F, 0x9E, 0x3B, 0x57, 0xE0, 0x35, 0x03, 0x6B, 0xF7, 0x12, 0x3C,
+    0x5A, 0xAD, 0x1A, 0xF1, 0xC6, 0xC9, 0x5A, 0xF0, 0x1D, 0x25, 0x15, 0xE4, 0x3B, 0x45, 0x88, 0x70,
+    0x77, 0x7F, 0x33, 0xC0, 0xA7, 0x50, 0x6F, 0x22, 0x9B, 0xB6, 0xAF, 0x35, 0xF4, 0xC1, 0xEC, 0xEC,
+    0xF7, 0x7B, 0x59, 0x45, 0x2E, 0x8C, 0x45, 0x94, 0xCF, 0xF2, 0x64, 0xD4, 0x99, 0x78, 0xB6, 0xD3,
+    0x20, 0x42, 0x49, 0xF4, 0x8E, 0xC4, 0x4E, 0xC9, 0x63, 0x10, 0xE7, 0x57, 0xA8, 0x33, 0xBB, 0xE3,
+    0xF2, 0xDF, 0x38, 0x24, 0xF4, 0xC5, 0xEA, 0x86, 0xAF, 0xB7, 0xB1, 0x34, 0x46, 0x74, 0xAD, 0x96,
+    0x84, 0x5F, 0x44, 0x16, 0xE2, 0x54, 0xCA, 0x6A, 0x93, 0xE1, 0x59, 0xBD, 0x56, 0xCF, 0x8C, 0x3A,
+    0x3C, 0x1B, 0xAB, 0xBE, 0x6A, 0x0E, 0xCA, 0x56, 0x20, 0x1C, 0xDE, 0xDF, 0x0A, 0x5D, 0x7F, 0x55,
+    0xF9, 0x9E, 0x21, 0x9D, 0x98, 0x37, 0xFD, 0xFE, 0xE7, 0xD7, 0xDC, 0x87, 0xD1, 0xC5, 0x60, 0xF5,
+    0x91, 0xD9, 0x10, 0x95, 0x6C, 0x24, 0x5B, 0x0F, 0x59, 0x54, 0x4D, 0x04, 0xE8, 0xF8, 0x33, 0x94,
+    0x1D, 0x00, 0x72, 0xCE, 0x6B, 0xCD, 0x90, 0xC7, 0x6A, 0x9F, 0xF4, 0xE7, 0x5B, 0x67, 0x52, 0xBB,
+    0xB6, 0x58, 0x19, 0xBB, 0xD5, 0x09, 0x0B, 0x8C, 0x30, 0xBE, 0x21, 0xDA, 0xCB, 0xE7, 0x67, 0xDC,
+    0x24, 0x00, 0xDD, 0x1A, 0x43, 0x13, 0x71, 0x44, 0x11, 0xA1, 0xA5, 0x9D, 0x9E, 0xD1, 0x19, 0xE4,
+    0x9D, 0x59, 0x2D, 0xF9, 0x9F, 0x8D, 0x2D, 0x09, 0x01, 0x32, 0x35, 0xC7, 0x2E, 0x12, 0x15, 0x84,
+    0x88, 0x9F, 0xA7, 0xA2, 0x48, 0x72, 0xA6, 0xB2, 0xE0, 0x81, 0x8A, 0xB1, 0x07, 0x21, 0x5D, 0x9D,
+    0x74, 0x1D, 0x3D, 0x98, 0x24, 0x1E, 0x4C, 0x45, 0xBD, 0x45, 0x3F, 0x1E, 0x31, 0x5D, 0xBE, 0x8C,
+    0x4F, 0xDD, 0x1D, 0x0C, 0xA7, 0xFC, 0x5C, 0xA3, 0x20, 0x13, 0x71, 0x9F, 0xB8, 0x0E, 0x50, 0xFA,
+    0x27, 0x5A, 0xA0, 0x91, 0x28, 0xCA, 0xDF, 0x43, 0x39, 0x18, 0xA2, 0x9F, 0x60, 0xAB, 0xEC, 0x2B,
+    0x89, 0x03, 0x03, 0x58, 0xB0, 0xA0, 0x76, 0x46, 0xBB, 0x2A, 0x37, 0xEF, 0xD9, 0xD7, 0xDD, 0x93,
+    0x40, 0x0A, 0x13, 0x7E, 0xF6, 0x84, 0xB7, 0x34, 0x10, 0xB2, 0x31, 0x83, 0x09, 0x66, 0x78, 0xA1,
+    0x60, 0xD5, 0x30, 0xC4, 0x82, 0xD4, 0x2E, 0x6D, 0xFD, 0x8B, 0x01, 0x84, 0x91, 0x78, 0x4A, 0x4E,
+    0x2A, 0x85, 0x82, 0xC9, 0x92, 0x0D, 0x28, 0x32, 0x26, 0xE5, 0x25, 0x35, 0x09, 0x79, 0x04, 0xA5,
+    0xE4, 0xFA, 0x35, 0xE0, 0xB3, 0x87, 0x8B, 0x18, 0x02, 0xED, 0xEC, 0x7B, 0x34, 0x56, 0xAE, 0x6C,
+    0x00, 0x3C, 0x8F, 0xEF, 0xA6, 0x06, 0xFC, 0xBD, 0xD9, 0x35, 0x47, 0x79, 0x0F, 0xB4, 0x49, 0x7D,
+    0x9A, 0x1B, 0xB9, 0xEE, 0xB4, 0xFB, 0xDA, 0xAA, 0xCD, 0xEF, 0xA1, 0xD6, 0xD4, 0xCA, 0x7F, 0xE8,
+    0x1D, 0x91, 0x72, 0x83, 0xB6, 0x4B, 0x86, 0xE4, 0xEC, 0x27, 0xD9, 0xEF, 0xDC, 0x0D, 0xA0, 0x25,
+    0xE8, 0xD8, 0xEA, 0xC0, 0xD1, 0x5C, 0x58, 0x00, 0xFD, 0x31, 0x48, 0x69, 0xD7, 0x09, 0xFD, 0xD4,
+    0x1A, 0x8D, 0x5B, 0xE7, 0xA6, 0xE1, 0x9A, 0xF6, 0x1A, 0x03, 0xF9, 0x2D, 0x2E, 0x42, 0xC9, 0x93,
+    0xCA, 0x31, 0xAA, 0xF1, 0xBB, 0x52, 0xCF, 0x20, 0x01, 0x67, 0xE0, 0x7D, 0x80, 0x69, 0xBA, 0x81,
+    0xF5, 0x3A, 0x55, 0x40, 0x4E, 0x4F, 0x9B, 0xDD, 0x0F, 0xF9, 0x20, 0xB8, 0x4A, 0x16, 0x58, 0x21,
+    0x6D, 0x71, 0x42, 0x78, 0xC4, 0x25, 0x3D, 0x6F, 0x9C, 0xC5, 0xE1, 0x2B, 0x39, 0xE0, 0x52, 0x07,
+    0x4A, 0xFF, 0x62, 0x2C, 0xD2, 0xAB, 0xF3, 0x5B, 0x20, 0xB3, 0x85, 0x44, 0x24, 0x84, 0x8C, 0x3C,
+    0x38, 0x09, 0x9A, 0x3A, 0x4E, 0xAF, 0xBC, 0xAB, 0x6E, 0x0D, 0x60, 0x30, 0xBA, 0x04, 0xAA, 0x74,
+    0x93, 0x15, 0x14, 0xB8, 0xD4, 0x20, 0xD6, 0x2F, 0x2B, 0x23, 0x7F, 0x03, 0xC1, 0x3F, 0xF0, 0xE2,
+    0xBA, 0x77, 0x9C, 0xF3, 0x83, 0xE5, 0x61, 0x11, 0xA2, 0x77, 0x9D, 0xB8, 0x65, 0xB5, 0x87, 0xC2,
+    0xFD, 0xEA, 0x9E, 0x6E, 0xBA, 0x5D, 0x5E, 0x76, 0x46, 0x49, 0x4E, 0x5A, 0x5F, 0x4C, 0x96, 0xB1,
+    0x5F, 0x6A, 0xE5, 0xA2, 0xC2, 0xDB, 0xC6, 0x66, 0x92, 0xD7, 0xD4, 0x80, 0x6F, 0x63, 0x01, 0x1C,
+    0x0D, 0x13, 0xB5, 0xA9, 0x72, 0x8B, 0x6B, 0xA6, 0xF0, 0x98, 0xE4, 0xC6, 0xF8, 0x46, 0x23, 0x61,
+    0x1E, 0x4C, 0xFD, 0xFF, 0x3E, 0x4C, 0x78, 0xE8, 0x49, 0xCE, 0xA6, 0xD0, 0x5C, 0x2B, 0x85, 0x7D,
+    0xB4, 0xF5, 0x7D, 0x71, 0x1C, 0x89, 0x57, 0x42, 0x6A, 0x7A, 0x71, 0x44, 0x75, 0x01, 0x90, 0xC3,
+    0xBF, 0x95, 0x7B, 0x0A, 0x4E, 0x01, 0x0A, 0x52, 0xF4, 0xA0, 0x21, 0x94, 0x7C, 0xEB, 0xA9, 0xEB,
+    0xAD, 0x1B, 0xBE, 0x78, 0x98, 0x04, 0xC4, 0x26, 0x20, 0x73, 0x5F, 0xB5, 0x45, 0x6C, 0xE2, 0xC7,
+    0x04, 0xD2, 0xEB, 0x67, 0xE5, 0x8F, 0x2F, 0xA0, 0x66, 0x4C, 0xBD, 0x36, 0x2C, 0xFE, 0x8E, 0x40,
+    0x46, 0xB6, 0xAB, 0x2F, 0xCF, 0x1F, 0xA1, 0x3E, 0xBF, 0x96, 0x61, 0x74, 0x68, 0xD6, 0x82, 0x1D,
+    0x12, 0xD5, 0xFD, 0xB9, 0x45, 0xDA, 0x8D, 0x2B, 0x76, 0xDE, 0x9C, 0x65, 0xA0, 0x2D, 0x76, 0x2F,
+    0x49, 0x2E, 0xEC, 0x27, 0xD4, 0x40, 0x26, 0xA3, 0x06, 0x01, 0x2E, 0x60, 0x04, 0x94, 0x43, 0xA4,
+    0x79, 0x5D, 0xEA, 0xD8, 0xD1, 0x5B, 0x95, 0xF2, 0x2E, 0x13, 0x17, 0x9E, 0xED, 0x7A, 0x7E, 0x83,
+    0x86, 0xDF, 0xD1, 0xD4, 0xE9, 0x00, 0x55, 0x8D, 0xCA, 0x4F, 0x18, 0x74, 0x4E, 0x5E, 0x7C, 0xAC,
+    0xE9, 0x4A, 0x25, 0xA7, 0x3A, 0x84, 0x43, 0xF5, 0x77, 0x74, 0x1E, 0xDC, 0x32, 0xDB, 0x50, 0xCF,
+    0xF8, 0xAC, 0x01, 0x37, 0x33, 0x59, 0xBE, 0xF5, 0xC2, 0x98, 0xE7, 0x09, 0x29, 0xE3, 0x6E, 0xBC,
+    0x22, 0x1D, 0x20, 0x06, 0x89, 0x90, 0x95, 0xCC, 0xC7, 0x3F, 0x2B, 0x48, 0x5F, 0x23, 0x0B, 0xCB,
+    0xD5, 0xA2, 0x4E, 0x52, 0x5A, 0x1E, 0x1A, 0x4C, 0x51, 0x75, 0x67, 0x33, 0xD6, 0xF1, 0xBE, 0x9B,
+    0x8D, 0x31, 0x0F, 0xBA, 0x2A, 0x67, 0x58, 0xF5, 0x62, 0xC3, 0x80, 0x48, 0x89, 0x5C, 0x3F, 0x81,
+    0xFF, 0x27, 0x6E, 0x0B, 0x79, 0x6A, 0xD0, 0x33, 0xD6, 0x2D, 0x6A, 0xF1, 0x36, 0xCC, 0x96, 0x6C,
+    0xA6, 0x6D, 0xA0, 0x92, 0x04, 0x5B, 0x27, 0xC9, 0x05, 0x1D, 0xCA, 0xB2, 0x8D, 0x4F, 0x20, 0xB6,
+    0xEA, 0xE4, 0x57, 0xAE, 0xAF, 0x77, 0xF7, 0xA8, 0xA5, 0xCD, 0xFF, 0x5C, 0xB9, 0x7F, 0x29, 0x98,
+    0x2C, 0x5E, 0xDA, 0x69, 0x3E, 0x99, 0x21, 0x25, 0x49, 0x1F, 0xEA, 0xD4, 0x91, 0x63, 0x89, 0xB8,
+    0xEC, 0xCF, 0x8B, 0x1D, 0xF6, 0x33, 0x3C, 0x29, 0x26, 0xEF, 0xAC, 0x81, 0x12, 0xC5, 0x1B, 0x44,
+    0xAC, 0x18, 0x90, 0x20, 0xBB, 0x03, 0x5B, 0x3F, 0x3E, 0xD3, 0xD3, 0xC5, 0x47, 0xAF, 0x7F, 0x44,
+    0x9E, 0x32, 0xC5, 0x06, 0xE9, 0xB6, 0x7D, 0xB3, 0xA1, 0xF6, 0x77, 0x29, 0x7F, 0xA9, 0xA9, 0x10,
+    0x20, 0xCE, 0x2E, 0x18, 0xC8, 0xAA, 0x68, 0x65, 0x64, 0x11, 0x57, 0x4F, 0xE9, 0xA2, 0xE3, 0xD1,
+    0xEA, 0x03, 0x40, 0xAC, 0x68, 0x04, 0xC8, 0x36, 0x69, 0xE9, 0xB5, 0x6D, 0x77, 0x93, 0xFA, 0xD6,
+    0xB8, 0xA5, 0x71, 0x63, 0x70, 0xE8, 0xA0, 0x27, 0x39, 0xD7, 0x33, 0x52, 0x76, 0x59, 0xF1, 0xEF,
+    0xE2, 0x76, 0x83, 0xC5, 0x4D, 0xC5, 0xA3, 0xF2, 0x10, 0x4C, 0xB3, 0x35, 0x6E, 0x12, 0x5B, 0x26,
+    0x7C, 0x4A, 0x8B, 0xFB, 0x02, 0x2B, 0xBE, 0xF4, 0x0A, 0x91, 0xF5, 0x7C, 0x82, 0x08, 0x62, 0x70,
+    0xD8, 0xA4, 0x29, 0xE0, 0xF8, 0x97, 0x19, 0x1D, 0x06, 0xD3, 0x46, 0x90, 0xEB, 0xB5, 0x89, 0x5B,
+    0x6C, 0x50, 0xB5, 0xB6, 0x70, 0x58, 0xA0, 0x30, 0x05, 0xF5, 0x40, 0x51, 0x4E, 0x30, 0xDF, 0x64,
+    0x6F, 0x7A, 0x4E, 0x54, 0x64, 0xE3, 0x20, 0xD3, 0x93, 0xE3, 0x79, 0x28, 0x39, 0xB1, 0x18, 0xDF,
+    0xCC, 0xF1, 0x98, 0xD1, 0x2D, 0x86, 0x34, 0x84, 0xA1, 0x83, 0x4A, 0xE5, 0xA9, 0x61, 0x6B, 0x09,
+    0xA2, 0x3B, 0xCE, 0x5E, 0xF7, 0x6B, 0xFF, 0xC2, 0x20, 0xFC, 0xF3, 0xAC, 0x2E, 0x7C, 0x63, 0x55,
+    0x11, 0x24, 0xEE, 0xE3, 0x51, 0xE6, 0x18, 0xB0, 0xD6, 0x6E, 0x85, 0xF5, 0xE5, 0x00, 0x91, 0x21,
+    0xD4, 0x88, 0xF1, 0x50, 0x31, 0x39, 0x0A, 0x08, 0x23, 0xA9, 0x01, 0xB3, 0xEF, 0xE8, 0xAF, 0xDF,
+    0xAE, 0x2B, 0xAF, 0xF9, 0x0D, 0xE2, 0x4D, 0x00, 0xE3, 0x5B, 0x56, 0x80, 0x90, 0xB8, 0xD4, 0x76,
+    0xEA, 0x14, 0x68, 0x40, 0x53, 0x9A, 0x3B, 0x82, 0xFC, 0x63, 0x9F, 0x9A, 0x4C, 0xFF, 0xE3, 0x10,
+    0x49, 0xCB, 0xA8, 0x1D, 0x59, 0x98, 0x3F, 0x4C, 0xDD, 0x2C, 0xB2, 0x8D, 0x11, 0xB5, 0x23, 0xF4,
+    0x90, 0x87, 0xE3, 0x85, 0x24, 0xD4, 0x0A, 0xE9, 0x79, 0xBB, 0x1F, 0x56, 0xC3, 0x62, 0x35, 0xDF,
+    0xE0, 0xAA, 0x51, 0x02, 0x93, 0xAE, 0x11, 0x21, 0xCF, 0xE4, 0xF3, 0x84, 0x08, 0x64, 0x06, 0x8B,
+    0x8A, 0x32, 0xB0, 0xF0, 0xC5, 0xD3, 0x5E, 0x1E, 0xF1, 0x69, 0x48, 0x46, 0xEC, 0x61, 0xA2, 0x7F,
+    0x28, 0xB6, 0xF8, 0xC9, 0x78, 0x35, 0x9B, 0x4D, 0x8C, 0xFE, 0xB7, 0xC9, 0xBC, 0xE9, 0x6E, 0x17,
+    0xCB, 0xFB, 0x00, 0x91, 0xE8, 0x27, 0x77, 0x7C, 0x96, 0xD6, 0xAF, 0x8D, 0xE4, 0x18, 0x8F, 0xEB,
+    0x7B, 0x9F, 0x01, 0x9C, 0x2E, 0x77, 0xF5, 0x40, 0x7C, 0x6D, 0x85, 0xA5, 0x17, 0x8F, 0x40, 0xB7,
+    0x9D, 0xBB, 0x68, 0x96, 0x22, 0x17, 0x0A, 0x75, 0xA3, 0x1D, 0x07, 0xE4, 0x93, 0x8A, 0xBB, 0xAD,
+    0x7E, 0x2E, 0xAA, 0x21, 0xDA, 0x62, 0xBF, 0xE8, 0xBB, 0x28, 0xB2, 0xCE, 0xE3, 0x0F, 0xCB, 0x3C,
+    0x2C, 0x4A, 0x3D, 0xAA, 0xFC, 0x4B, 0xB5, 0x6A, 0x04, 0x05, 0xA4, 0x63, 0x98, 0xD8, 0xA2, 0x5E,
+    0x96, 0xD5, 0x52, 0x7B, 0xCB, 0xED, 0xA3, 0x72, 0x3E, 0x2A, 0x3F, 0xE2, 0x79, 0x3D, 0xFE, 0x8A,
+    0xA0, 0xD4, 0x32, 0x60, 0x10, 0xBE, 0xF2, 0xE5, 0xF9, 0x03, 0xE2, 0x66, 0x76, 0x7A, 0x48, 0xEF,
+    0x33, 0x63, 0xA0, 0x93, 0x99, 0x28, 0x97, 0x40, 0xB9, 0xAD, 0xEC, 0xB4, 0xD7, 0x98, 0x9D, 0x87,
+    0x6A, 0x6C, 0x9D, 0xD5, 0xF6, 0xAA, 0x64, 0xE4, 0xD6, 0x73, 0x92, 0xA9, 0xC2, 0xB4, 0x80, 0x0F,
+    0x58, 0x7B, 0x01, 0x17, 0xAD, 0x7C, 0x3E, 0x5C, 0xDE, 0x7D, 0x77, 0xF2, 0x35, 0x4E, 0x6F, 0x0D,
+    0xE1, 0x4E, 0xAD, 0x4E, 0x82, 0x36, 0x87, 0x89, 0x43, 0x13, 0x50, 0x08, 0x22, 0x3D, 0x14, 0x3D,
+    0x85, 0x50, 0xBC, 0x17, 0x18, 0x66, 0xE1, 0x85, 0xEF, 0xCA, 0xF1, 0x12, 0x9B, 0xA1, 0xC0, 0x95,
+    0x14, 0x2E, 0x2C, 0xB6, 0x1B, 0x25, 0x9F, 0x4C, 0xF2, 0x49, 0xAE, 0x8A, 0xD4, 0xE7, 0x1A, 0x05,
+    0xFB, 0x6F, 0x75, 0x42, 0xC6, 0x14, 0xD8, 0xE5, 0x03, 0x04, 0x80, 0xEB, 0x58, 0x8F, 0x92, 0xAF,
+    0xD1, 0x15, 0x00, 0x63, 0xB7, 0xFF, 0xF8, 0xD7, 0xE3, 0xC0, 0x37, 0xEF, 0x68, 0xF9, 0xC8, 0x5A,
+    0x03, 0x6D, 0x4A, 0x56, 0xAE, 0xDF, 0x8E, 0xBD, 0x52, 0x5F, 0x7D, 0x22, 0x4A, 0xFA, 0xFE, 0xA2,
+    0x3F, 0xCE, 0x45, 0xD8, 0x41, 0x94, 0x70, 0x21, 0x48, 0xF7, 0x95, 0xE5, 0xE4, 0x22, 0x52, 0x7E,
+    0x15, 0xAE, 0xC7, 0x34, 0xA8, 0xF9, 0x15, 0x4B, 0x15, 0x11, 0x19, 0x19, 0xDC, 0x4A, 0x3D, 0x3D,
+    0x33, 0x79, 0x0E, 0x8A, 0x34, 0x11, 0xEB, 0x4A, 0x8B, 0xAF, 0x0F, 0xE8, 0xBA, 0x3E, 0x94, 0xA6,
+    0x2C, 0xF8, 0xF8, 0xA9, 0xD1, 0xE7, 0x3A, 0x3D, 0x44, 0xC8, 0x08, 0x47, 0x5E, 0xD8, 0xF1, 0x6C,
+    0xCD, 0x8C, 0x60, 0xD7, 0xF6, 0xA5, 0x57, 0xF2, 0x0C, 0xD6, 0x9E, 0x0C, 0x90, 0xCB, 0xAE, 0xC0,
+    0xC1, 0x62, 0xD4, 0xC6, 0x6C, 0x7F, 0xED, 0x38, 0x23, 0x48, 0x0B, 0x53, 0x64, 0xBE, 0xD2, 0x6C,
+    0xE2, 0xAB, 0x71, 0x9E, 0x51, 0x87, 0xBF, 0x54, 0xC1, 0x36, 0xC0, 0x5B, 0x0E, 0xD0, 0x63, 0xE9,
+    0x1C, 0x0C, 0x07, 0x3B, 0xAE, 0xEE, 0xA5, 0x51, 0x1E, 0xE6, 0x8E, 0x01, 0x1E, 0x59, 0xEA, 0x6C,
+    0x25, 0x63, 0x33, 0x08, 0x08, 0x2C, 0x21, 0xF5, 0xEA, 0x01, 0x56, 0x44, 0x7D, 0xE0, 0x85, 0x1C,
+    0xD5, 0x4D, 0x8D, 0xC2, 0xB7, 0xEE, 0x54, 0x51, 0xCA, 0x8B, 0xA6, 0xCF, 0x47, 0x85, 0x02, 0x29,
+    0xDD, 0x60, 0x42, 0xE4, 0x17, 0x8E, 0x42, 0x5D, 0xFF, 0x10, 0x91, 0x25, 0x46, 0x93, 0x6B, 0xDA,
+    0xAD, 0xDA, 0x01, 0x0F, 0x31, 0x85, 0x53, 0x9E, 0x7A, 0x3C, 0x14, 0xF5, 0xF0, 0xA4, 0x12, 0x9B,
+    0xED, 0xC7, 0x83, 0x73, 0xA4, 0x6B, 0xC8, 0xAA, 0x7B, 0xD4, 0x64, 0xF7, 0xF5, 0xD3, 0x07, 0x2F,
+    0x41, 0x8B, 0x09, 0xBF, 0xC7, 0xBD, 0x00, 0x2A, 0xBC, 0xBA, 0xFC, 0x9A, 0xE2, 0x58, 0x64, 0xFD,
+    0xE1, 0x60, 0x4E, 0x3C, 0x60, 0xE3, 0x84, 0xCD, 0xD3, 0xAE, 0xB4, 0x0D, 0xF8, 0xA3, 0xAA, 0x74,
+    0xE1, 0x42, 0x18, 0x56, 0xA6, 0x72, 0x65, 0xD1, 0x14, 0xCC, 0xFE, 0x1F, 0xD0, 0x91, 0x84, 0xA1,
+    0x6A, 0x33, 0x76, 0x97, 0x5B, 0x72, 0x3F, 0xB3, 0xB8, 0xDF, 0xD9, 0x3E, 0x1D, 0x1E, 0xFD, 0x35,
+    0xDF, 0x4B, 0xD7, 0x50, 0xE7, 0x2D, 0x1B, 0xC8, 0xCA, 0xB3, 0x89, 0xE4, 0x56, 0xA9, 0x81, 0x4A,
+    0xED, 0x96, 0xE3, 0x0C, 0xE5, 0x9F, 0x60, 0xF5, 0xB4, 0x9A, 0xCD, 0xAD, 0xBA, 0x63, 0x8B, 0x54,
+    0x39, 0xD0, 0x0A, 0xE9, 0x98, 0x5E, 0xC1, 0xC9, 0x40, 0xB7, 0xA4, 0x10, 0x32, 0x7D, 0x9E, 0x00,
+    0x68, 0x69, 0xB8, 0x23, 0xDF, 0xBE, 0xC0, 0x45, 0x33, 0xF1, 0x8E, 0x27, 0xED, 0xA1, 0xD9, 0x38,
+    0x74, 0xF2, 0x8A, 0xBE, 0x85, 0x1E, 0xF0, 0x5B, 0x1A, 0x34, 0x93, 0x72, 0xDE, 0x37, 0xD7, 0x83,
+    0xEB, 0x7B, 0x28, 0x5E, 0x14, 0x2A, 0xBC, 0xC7, 0xE2, 0xB3, 0x06, 0x29, 0x76, 0x37, 0xD3, 0xC4,
+    0x47, 0x8A, 0xDB, 0xC7, 0x30, 0x02, 0x66, 0xC9, 0x53, 0x5E, 0xBA, 0xDB, 0x07, 0x60, 0x0D, 0x6B,
+    0x54, 0xCB, 0x0C, 0xC1, 0x27, 0x54, 0xDE, 0x12, 0xED, 0x7D, 0x8E, 0x76, 0xCD, 0x57, 0x52, 0x88,
+    0xF0, 0x16, 0x9C, 0x80, 0xE1, 0x00, 0x50, 0x95, 0x61, 0x8E, 0x55, 0xEE, 0xE1, 0xC9, 0x8F, 0xD4,
+    0x1C, 0x74, 0xDD, 0x85, 0xCB, 0xE5, 0x7C, 0x8B, 0x24, 0x4C, 0x4B, 0xDA, 0x16, 0x98, 0xA0, 0x70,
+    0x58, 0x13, 0x5D, 0x05, 0x0C, 0x3F, 0x61, 0xE3, 0x14, 0xE2, 0xEF, 0x92, 0xC8, 0x3A, 0xDA, 0xFF,
+    0x0E, 0x1A, 0xB3, 0x7D, 0x02, 0x43, 0xDD, 0xE5, 0xE3, 0x8C, 0xE9, 0xFC, 0xD1, 0x66, 0xA2, 0x8E,
+    0x4D, 0x81, 0xA4, 0x4C, 0xBF, 0x4D, 0x9B, 0x67, 0x53, 0x63, 0x11, 0x86, 0x78, 0x54, 0xF0, 0x9E,
+    0x70, 0x56, 0x1C, 0x5F, 0xBA, 0xC9, 0x1C, 0xAB, 0xC8, 0x39, 0x8B, 0xC9, 0xE4, 0xB1, 0x07, 0xEA,
+    0xB5, 0xD4, 0x75, 0xF2, 0x91, 0x83, 0x1C, 0x2F, 0x73, 0xEC, 0xFB, 0x56, 0x68, 0xA1, 0xC8, 0xAC,
+    0xCA, 0x20, 0x3F, 0x6A, 0xE9, 0xBF, 0xC1, 0x1D, 0x00, 0xBC, 0x23, 0x1F, 0x1E, 0xF8, 0xC3, 0x08,
+    0xBD, 0x66, 0xA5, 0xF6, 0x5D, 0x77, 0xD5, 0x5A, 0x6D, 0x04, 0xEB, 0x76, 0x9E, 0xDB, 0x0C, 0x8C,
+    0x28, 0x9F, 0xCC, 0x4E, 0x77, 0xFC, 0x00, 0x36, 0xEC, 0xCE, 0x4B, 0x72, 0x06, 0xD1, 0x73, 0x1A,
+    0xD8, 0x91, 0x45, 0x55, 0xB8, 0xA7, 0x8C, 0x40, 0xCA, 0xF7, 0xCF, 0x39, 0x6A, 0x74, 0x63, 0xD3,
+    0x71, 0x76, 0xA4, 0x59, 0xB8, 0x8C, 0xB5, 0x4E, 0xCA, 0x12, 0x35, 0xB5, 0x87, 0x9F, 0xA9, 0x94,
+    0x07, 0x67, 0x4D, 0xF0, 0xDF, 0x97, 0x0F, 0x53, 0x68, 0xCC, 0x67, 0x26, 0xF8, 0xF5, 0xBE, 0xAD,
+    0x1E, 0x95, 0xD0, 0x90, 0x88, 0x27, 0xA8, 0x3D, 0x4F, 0xA1, 0x58, 0xDE, 0x8F, 0xBC, 0x36, 0x2F,
+    0x36, 0x0B, 0x38, 0x9A, 0x51, 0x95, 0xA2, 0xE5, 0x8F, 0xC5, 0x1D, 0xE4, 0x2E, 0x27, 0x9D, 0xEA,
+    0x43, 0xD7, 0x07, 0x02, 0x0B, 0x26, 0x85, 0xD3, 0xEC, 0xA3, 0x67, 0xA9, 0xC3, 0x23, 0xFA, 0x46,
+    0x5F, 0x9C, 0x64, 0xD5, 0xCC, 0x7D, 0x75, 0xE3, 0x51, 0x32, 0x31, 0x1F, 0x51, 0x99, 0xF0, 0x57,
+    0x30, 0xC9, 0x22, 0xA0, 0x2B, 0xA3, 0xA7, 0x7A, 0x26, 0x21, 0x91, 0xD1, 0x75, 0xD4, 0xB7, 0x0B,
+    0xC5, 0x96, 0x71, 0x66, 0x2D, 0x5E, 0xDA, 0x71, 0x48, 0xEA, 0xAC, 0x97, 0x8B, 0x23, 0xD5, 0x49,
+    0xC2, 0x66, 0x1D, 0x62, 0xFC, 0x06, 0x17, 0xA1, 0xEC, 0x71, 0x17, 0xA0, 0x3B, 0xE3, 0xF0, 0xF7,
+    0x0D, 0xCB, 0x84, 0xB6, 0x7C, 0xC0, 0x42, 0x0E, 0xB8, 0xA3, 0x8C, 0x31, 0x4A, 0x9A, 0xAA, 0x97,
+    0xFC, 0x67, 0xB1, 0x75, 0xC6, 0x51, 0xFC, 0x28, 0x69, 0xD0, 0x43, 0x28, 0x54, 0xB9, 0xAE, 0xBE,
+    0x44, 0x7A, 0x18, 0x36, 0x39, 0x26, 0x46, 0x29, 0x33, 0x0E, 0x15, 0xAF, 0x03, 0x21, 0x07, 0x87,
+    0xDE, 0x30, 0xE3, 0xE5, 0xDA, 0x34, 0x81, 0xE5, 0xE2, 0xCD, 0x6B, 0xEE, 0xEF, 0x95, 0xD3, 0x2C,
+    0x7B, 0x31, 0x15, 0x56, 0xB4, 0x77, 0xDA, 0x40, 0xFD, 0x59, 0xB9, 0xDF, 0xEC, 0x39, 0x2B, 0x6C,
+    0x18, 0x7E, 0xCA, 0x99, 0x5E, 0x55, 0xF2, 0x61, 0x45, 0x74, 0x2C, 0x50, 0xB7, 0x42, 0x31, 0xD9,
+    0x58, 0xAE, 0x75, 0x17, 0x4D, 0xFA, 0xF1, 0x18, 0x26, 0x6B, 0x2C, 0xD9, 0xE8, 0x98, 0x75, 0xE7,
+    0x8A, 0xC9, 0x07, 0x63, 0x6D, 0x55, 0xFD, 0xEE, 0x2D, 0x24, 0x4D, 0x0F, 0x11, 0x7C, 0x0B, 0x48,
+    0x99, 0xC0, 0x06, 0x83, 0xC3, 0xF5, 0x90, 0xBD, 0x12, 0xE7, 0xC6, 0x86, 0x16, 0x8A, 0x63, 0xD7,
+    0xF8, 0x1E, 0x54, 0xCD, 0x06, 0x20, 0x4C, 0x5C, 0xC6, 0x15, 0x76, 0x56, 0xE0, 0xE1, 0xDD, 0xE4,
+    0xC1, 0x63, 0x75, 0x53, 0xBC, 0xE1, 0x8C, 0xBF, 0x26, 0x41, 0xF9, 0xA9, 0xCC, 0xEE, 0x69, 0xEA,
+    0x7D, 0x0E, 0x9F, 0xF2, 0x70, 0x0C, 0x4A, 0xD0, 0x2D, 0x17, 0x47, 0xB0, 0x66, 0xD4, 0xDF, 0x9A,
+    0xDC, 0xAD, 0x94, 0xE6, 0x66, 0x3F, 0x0D, 0x57, 0xB3, 0xAD, 0x90, 0xD0, 0xD7, 0x72, 0x3D, 0x1E,
+    0x9C, 0xAF, 0x1A, 0x46, 0x20, 0x8B, 0x48, 0xEA, 0x3A, 0x10, 0x42, 0x32, 0x3D, 0xB9, 0xEB, 0x61,
+    0x47, 0x29, 0x61, 0xED, 0xB6, 0x8C, 0x1D, 0x9E, 0xD4, 0x00, 0x34, 0xD9, 0xAB, 0x16, 0x16, 0x84,
+    0xAF, 0xC5, 0x79, 0x37, 0xE4, 0xC9, 0xBE, 0x91, 0x57, 0x4F, 0xFE, 0x87, 0xF7, 0x47, 0x62, 0x99,
+    0x4F, 0xFA, 0xAE, 0x51, 0x68, 0x1A, 0xE2, 0x90, 0xB5, 0x62, 0x21, 0xE4, 0x06, 0x14, 0x3D, 0xB5,
+    0xC2, 0x34, 0xB0, 0xF3, 0x6B, 0x0D, 0xF7, 0x0F, 0x3C, 0x54, 0xD6, 0x2B, 0xCF, 0xD8, 0xD1, 0x9B,
+    0x54, 0x8B, 0x93, 0xBB, 0x15, 0xF1, 0xC5, 0x9F, 0x24, 0x53, 0x02, 0x94, 0xDE, 0x66, 0x4F, 0x2F,
+    0x77, 0xF6, 0xE4, 0x4C, 0x58, 0x19, 0xBB, 0x08, 0x0A, 0x9B, 0xAC, 0x4C, 0xA5, 0xAC, 0x4A, 0x66,
+    0x72, 0x01, 0x45, 0x41, 0xDA, 0x86, 0xF9, 0x7C, 0x0A, 0x8E, 0xA6, 0xFD, 0x10, 0x18, 0x4F, 0x2F,
+    0xEA, 0x5A, 0xD9, 0x79, 0xD2, 0xD8, 0x3F, 0x02, 0x11, 0x5F, 0x43, 0x79, 0x3A, 0x40, 0x75, 0x6C,
+    0xFC, 0x3A, 0x24, 0xEB, 0xBF, 0xD2, 0xC0, 0xF3, 0xD0, 0xD1, 0x21, 0xA9, 0x84, 0xFB, 0x9D, 0xA3,
+    0xF1, 0x0F, 0x57, 0xAE, 0x99, 0xCB, 0x3B, 0xBC, 0x55, 0x88, 0xE6, 0xE1, 0x7D, 0xC6, 0xDB, 0xA9,
+    0x35, 0x59, 0x11, 0x26, 0x05, 0x0E, 0x8E, 0x5D, 0xBE, 0xF1, 0x32, 0x5A, 0xBF, 0xBE, 0xE8, 0x07,
+    0xB8, 0x80, 0x61, 0x70, 0xEA, 0x8C, 0x05, 0xC0, 0x4D, 0xBF, 0xE9, 0x63, 0xA1, 0x11, 0xFC, 0x0A,
+    0x4B, 0x6D, 0x03, 0x11, 0x86, 0x7A, 0x69, 0x49, 0x15, 0xDA, 0x23, 0x67, 0xC5, 0x51, 0x3A, 0x5A,
+    0xAD, 0xCA, 0xAC, 0xF7, 0xD7, 0x6C, 0x0E, 0x2D, 0xC5, 0x88, 0xD9, 0x95, 0x48, 0x58, 0x70, 0x37,
+    0xBE, 0x8E, 0xBC, 0xF6, 0x14, 0x4C, 0xA0, 0x13, 0x9C, 0x8D, 0x58, 0x9F, 0x02, 0xAB, 0x65, 0xCA,
+    0x66, 0x73, 0x84, 0x3B, 0xC6, 0xD5, 0x43, 0x9E, 0x1C, 0xCE, 0xA0, 0x00, 0x59, 0xEC, 0x4A, 0xC0,
+    0x9D, 0x31, 0x5A, 0xB2, 0x0A, 0x86, 0x23, 0x2A, 0xCD, 0xCF, 0x18, 0x96, 0xE2, 0xE5, 0xFF, 0x36,
+    0xBC, 0x66, 0x8A, 0xA7, 0x8A, 0xE0, 0xF4, 0x06, 0x39, 0x7C, 0xCF, 0x21, 0xEE, 0x17, 0x39, 0x87,
+    0x74, 0xA0, 0x73, 0x38, 0xA9, 0x90, 0x6C, 0xC2, 0x1B, 0xF0, 0x69, 0xD8, 0xBF, 0x6E, 0x44, 0x6F,
+    0x77, 0x75, 0x1E, 0x45, 0xB5, 0x65, 0xAD, 0xDF, 0x56, 0x66, 0xFD, 0xA0, 0x59, 0x85, 0xC5, 0x06,
+    0x0C, 0xBF, 0xD5, 0x17, 0xA1, 0x48, 0x99, 0x63, 0xEE, 0xF0, 0x7D, 0xAE, 0x3A, 0x7C, 0x6A, 0x7C,
+    0xB4, 0xDA, 0xDB, 0x1A, 0xED, 0x70, 0xF9, 0x4D, 0xD2, 0xA4, 0x09, 0xE4, 0xFA, 0x4B, 0x95, 0xDD,
+    0x95, 0x7B, 0x3D, 0xD1, 0x52, 0xDB, 0x59, 0x68, 0xFF, 0xE5, 0x13, 0x39, 0xE5, 0x01, 0x12, 0x7F,
+    0x9A, 0x0E, 0xFF, 0x35, 0x75, 0x6A, 0x56, 0xEA, 0x66, 0x91, 0xF7, 0x3E, 0x71, 0x86, 0x6C, 0xC3,
+    0x11, 0x1B, 0x04, 0x4C, 0x98, 0x13, 0xA1, 0x35, 0x23, 0x96, 0xC9, 0x8C, 0xFB, 0x43, 0x96, 0x4B,
+    0xC0, 0x1F, 0x30, 0x95, 0xAA, 0x8B, 0x27, 0x16, 0x6C, 0x91, 0x0D, 0x62, 0xAB, 0x87, 0x1A, 0xDA,
+    0x61, 0xB1, 0x2E, 0xBC, 0x19, 0xA8, 0xF0, 0x32, 0xD7, 0x06, 0x6F, 0x82, 0xFD, 0x5F, 0xF1, 0x08,
+    0x5E, 0x97, 0x83, 0xEF, 0xB0, 0x91, 0xC2, 0xE6, 0x37, 0x47, 0xFC, 0xD1, 0xE7, 0x6C, 0xC1, 0x1A,
+    0xAF, 0x91, 0xDF, 0x5C, 0x2D, 0x1B, 0xBC, 0x6A, 0x10, 0xAC, 0xAE, 0x2C, 0x34, 0xCD, 0xD2, 0x6B,
+    0x15, 0x07, 0xEA, 0xD0, 0x6C, 0x3E, 0x19, 0x14, 0xEF, 0x35, 0xA4, 0x2B, 0x17, 0xF8, 0x2F, 0x48,
+    0x0D, 0x5C, 0x70, 0xE2, 0xFF, 0x94, 0x2B, 0x59, 0x3C, 0xDE, 0x2F, 0x14, 0x84, 0x5F, 0x0F, 0xF3,
+    0xA0, 0xFC, 0x40, 0xBE, 0xFA, 0xAE, 0x97, 0xC7, 0xC6, 0xF3, 0xB5, 0xC2, 0x50, 0xBB, 0xA3, 0xB8,
+    0xC1, 0x7D, 0x6B, 0xE9, 0x87, 0x98, 0x8B, 0xBE, 0x19, 0xA5, 0xAC, 0xB1, 0x8D, 0x6C, 0x67, 0x94,
+    0x95, 0x7C, 0x60, 0xCC, 0x0B, 0x75, 0x24, 0xB9, 0x54, 0x7D, 0xD4, 0x4D, 0x9B, 0xF2, 0xA6, 0xFB,
+    0xC0, 0x78, 0x38, 0x90, 0x19, 0x5A, 0x62, 0x85, 0x3A, 0x34, 0xD8, 0xCD, 0xA1, 0xA5, 0xD9, 0xC0,
+    0xC5, 0xB3, 0x6E, 0x26, 0x13, 0xCF, 0x7C, 0xC1, 0x50, 0x6D, 0x80, 0xCE, 0xF9, 0xA7, 0xFE, 0x2F,
+    0x14, 0x53, 0x03, 0x0E, 0xFE, 0xB4, 0xA2, 0x75, 0x0A, 0xB4, 0xD9, 0xDB, 0xEA, 0xBC, 0xF1, 0xB0,
+    0x8E, 0xE5, 0x33, 0x49, 0x16, 0xCD, 0x3B, 0x7C, 0x3B, 0x31, 0x51, 0x8D, 0xF2, 0x12, 0xDB, 0x09,
+    0xA7, 0x06, 0x7E, 0x66, 0x09, 0x77, 0xA2, 0x3E, 0xB9, 0xA2, 0xA2, 0xEE, 0xFB, 0x9E, 0x84, 0xF1,
+    0x77, 0x28, 0xB1, 0x02, 0xF4, 0xE9, 0x74, 0x56, 0x3D, 0x6F, 0x83, 0x2F, 0xDE, 0x50, 0x4F, 0xAA,
+    0x2C, 0xC9, 0x8A, 0x71, 0x45, 0xE1, 0x79, 0x4D, 0x9B, 0xC0, 0xC0, 0x8B, 0x33, 0x7D, 0x3F, 0x07,
+    0x2B, 0x4C, 0x16, 0x4F, 0xD1, 0xFB, 0x28, 0xB8, 0x7B, 0xF2, 0x4F, 0xA8, 0x56, 0x84, 0xDF, 0x61,
+    0xEC, 0x1F, 0x4D, 0x95, 0xC5, 0xD7, 0x90, 0x4D, 0x38, 0x35, 0xE5, 0x96, 0xBA, 0x6D, 0x31, 0xAE,
+    0xE7, 0xAC, 0xE6, 0xDD, 0x05, 0x5E, 0xD4, 0xF5, 0x47, 0x5B, 0xEA, 0xA3, 0x36, 0x7C, 0x58, 0x04,
+    0x41, 0x3C, 0xEC, 0xC6, 0x70, 0x59, 0xEC, 0x4D, 0xE3, 0x80, 0x59, 0x6D, 0xA1, 0x3A, 0x31, 0xA1,
+    0x50, 0xB7, 0x10, 0xC0, 0xC4, 0x47, 0x87, 0xAB, 0xEA, 0x4B, 0xFD, 0xF6, 0x5C, 0xA8, 0x62, 0x40,
+    0x3E, 0x89, 0x1D, 0xE1, 0x9B, 0x04, 0x1F, 0x22, 0x2B, 0xAF, 0x0B, 0xFC, 0xD1, 0x64, 0x4B, 0xCE,
+    0xC4, 0xF9, 0x19, 0xF4, 0x21, 0x95, 0xBA, 0xC0, 0x77, 0x4B, 0xFC, 0x15, 0xC7, 0x6F, 0xF7, 0x70,
+    0x8E, 0xE2, 0xDF, 0xFE, 0x48, 0xA9, 0x17, 0xA2, 0xAB, 0xA5, 0xFC, 0x2A, 0x72, 0x08, 0xFF, 0xBC,
+    0x56, 0xFC, 0xAF, 0xFF, 0x47, 0xEC, 0xCE, 0x29, 0x17, 0xAE, 0x2D, 0xB3, 0xB3, 0x5F, 0x93, 0x9D,
+    0x57, 0x2A, 0xF4, 0xDE, 0xDD, 0xE4, 0xE6, 0x43, 0x73, 0xCA, 0x00, 0x16, 0xB8, 0xD7, 0x15, 0x67,
+    0xEB, 0x33, 0x6C, 0xCE, 0x0C, 0xFA, 0x8F, 0xF1, 0x08, 0x6E, 0xC0, 0x3F, 0xAF, 0x30, 0x9F, 0x2A,
+    0x98, 0x4C, 0x03, 0x1C, 0x88, 0x7D, 0xBF, 0x7A, 0xB1, 0xAE, 0x51, 0x69, 0x6D, 0xE9, 0x67, 0x8F,
+    0x73, 0x3A, 0xB9, 0x58, 0x9B, 0xB0, 0xE6, 0x14, 0xB2, 0x04, 0x57, 0x85, 0x6E, 0x09, 0x84, 0x53,
+    0x1F, 0x6D, 0xAA, 0xD1, 0x42, 0xCA, 0xFA, 0x8D, 0xB5, 0xAA, 0xD6, 0xDC, 0x9A, 0xC1, 0x90, 0x69,
+    0x5A, 0xB7, 0xB8, 0x75, 0xD4, 0xD8, 0x5E, 0x2B, 0x5E, 0xB5, 0x73, 0x4B, 0x42, 0x2D, 0x5C, 0x4C,
+    0x58, 0x9E, 0xF1, 0xE0, 0x18, 0x51, 0x5B, 0x68, 0xEA, 0x4E, 0x92, 0x98, 0x62, 0x6C, 0xF8, 0x68,
+    0xA8, 0x92, 0x48, 0x8E, 0x2B, 0x11, 0xC7, 0xC5, 0x8E, 0x3A, 0x3C, 0xFF, 0xB3, 0x93, 0x32, 0xA8,
+    0x55, 0x94, 0x0E, 0xA1, 0x78, 0x7E, 0x3D, 0xD2, 0xF0, 0xA2, 0x27, 0x1B, 0x8F, 0x14, 0x73, 0x0B,
+    0xE7, 0xC9, 0xBE, 0xE5, 0x49, 0xCF, 0x26, 0xE2, 0xC0, 0x5E, 0x51, 0xE5, 0xAC, 0x32, 0x45, 0x37,
+    0x6A, 0x4C, 0xF9, 0xCC, 0x6C, 0x0A, 0x0B, 0xEE, 0x1C, 0x5B, 0x7D, 0xE8, 0xDF, 0x83, 0x96, 0x0E,
+    0x7D, 0x6E, 0x87, 0x2D, 0x4A, 0xA8, 0x00, 0x7C, 0xE9, 0xE2, 0x1A, 0xE7, 0x9E, 0x9D, 0x09, 0x99,
+    0xA5, 0xB6, 0x46, 0x4D, 0xDE, 0xD7, 0xA9, 0x9B, 0x13, 0xA5, 0xC9, 0xB1, 0x6E, 0xDC, 0xF6, 0x42,
+    0x20, 0x08, 0x86, 0xFE, 0x8A, 0x3E, 0x42, 0x42, 0x33, 0x0B, 0x54, 0xD1, 0xB9, 0x97, 0x86, 0x03,
+    0xC9, 0xA7, 0x20, 0x0B, 0x09, 0x46, 0x0C, 0xCF, 0x6B, 0x7B, 0x74, 0x95, 0xFE, 0xC0, 0x24, 0x8D,
+    0x12, 0xBD, 0xC9, 0x60, 0x48, 0x2F, 0x02, 0x77, 0x5C, 0x5F, 0x86, 0xA9, 0x39, 0xB3, 0x7C, 0x77,
+    0x10, 0xCE, 0xE9, 0xB4, 0x61, 0x63, 0x63, 0x39, 0x86, 0x89, 0x97, 0x4A, 0xD3, 0x16, 0x51, 0x1F,
+    0x8E, 0xFC, 0xF0, 0x51, 0xF4, 0x5D, 0x62, 0x73, 0xF3, 0x47, 0x82, 0x04, 0xF0, 0xD8, 0xD8, 0xD5,
+    0x16, 0x63, 0x96, 0xBE, 0xF5, 0xB5, 0x4A, 0x70, 0xCB, 0x8B, 0x23, 0xF5, 0xB0, 0xEE, 0x0F, 0xFA,
+    0xC7, 0x9A, 0xA5, 0xB1, 0x6B, 0x39, 0x53, 0x90, 0xAF, 0xF8, 0x9F, 0xCC, 0x99, 0xE4, 0x65, 0x7A,
+    0x69, 0xBD, 0x2B, 0x1F, 0x27, 0x3F, 0x87, 0x69, 0x2D, 0x1E, 0x9F, 0xC2, 0x96, 0xE9, 0x64, 0xEC,
+    0xF8, 0x34, 0x30, 0xA1, 0xC3, 0xAF, 0x77, 0x55, 0x42, 0x30, 0xA7, 0x8E, 0x35, 0x12, 0xBF, 0x1C,
+    0xA3, 0x1F, 0x74, 0x43, 0x41, 0xD5, 0x35, 0xC9, 0x02, 0x6E, 0xB9, 0x3C, 0x12, 0x6D, 0x23, 0x3B,
+    0xD6, 0xCB, 0x2D, 0x01, 0xCA, 0x96, 0xCB, 0x36, 0xCD, 0x65, 0x81, 0x04, 0xDA, 0x83, 0xB2, 0x8E,
+    0x32, 0xB7, 0x85, 0xAE, 0x7F, 0xC2, 0x2F, 0x05, 0xFE, 0x0C, 0x29, 0x9D, 0x21, 0x8D, 0x9E, 0xED,
+    0x9A, 0x45, 0xCD, 0xD6, 0xC1, 0xC5, 0x22, 0xAF, 0x4B, 0xFD, 0xED, 0xEE, 0x34, 0xA4, 0xD7, 0x51,
+    0xFE, 0x05, 0x20, 0xE0, 0x25, 0xBF, 0x4D, 0xCE, 0xCE, 0x8B, 0xC6, 0xBA, 0xF2, 0x8C, 0x13, 0xF2,
+    0xA5, 0x50, 0xC9, 0xC7, 0x69, 0x64, 0xA7, 0x9F, 0x42, 0xD4, 0x82, 0xA8, 0x1A, 0x65, 0x36, 0xBD,
+    0xF8, 0x42, 0x98, 0x41, 0x76, 0x32, 0x34, 0x19, 0x1C, 0xC9, 0x3E, 0x08, 0x43, 0xB2, 0x1F, 0xE4,
+    0x3B, 0x17, 0x75, 0x8F, 0x6A, 0x66, 0xFA, 0xF0, 0x63, 0xC5, 0xA0, 0x96, 0x0B, 0x9C, 0xB8, 0xA1,
+    0x76, 0xDE, 0xEC, 0xB2, 0x8B, 0x28, 0xC0, 0xAC, 0x99, 0x7E, 0x4B, 0x36, 0x50, 0xD1, 0xBC, 0xE6,
+    0xBA, 0xEE, 0x8B, 0x4C, 0x5A, 0xD7, 0xD4, 0x59, 0x4B, 0xE2, 0x96, 0xC5, 0x29, 0xFC, 0xE2, 0x22,
+    0xE1, 0x90, 0x64, 0x4F, 0xBA, 0x52, 0x20, 0x11, 0x96, 0x5B, 0x1D, 0x92, 0xC9, 0x6F, 0x32, 0x8E,
+    0x2D, 0x21, 0xEC, 0xA0, 0xDE, 0x49, 0xBA, 0x44, 0xB7, 0x86, 0xCE, 0xA8, 0x5D, 0xB0, 0xB2, 0x80,
+    0x14, 0x64, 0x2E, 0xA0, 0x3D, 0xB2, 0x17, 0xE2, 0xD3, 0x83, 0x09, 0x30, 0x26, 0x32, 0x90, 0x8D,
+    0x41, 0x1F, 0x18, 0x47, 0xC0, 0xC2, 0x35, 0x47, 0xA1, 0xE5, 0x83, 0x68, 0x96, 0x4E, 0x84, 0x9C,
+    0x2F, 0x0E, 0x64, 0xBA, 0x07, 0x18, 0x50, 0xFE, 0x1B, 0xF2, 0xD7, 0xED, 0x05, 0x3A, 0x1A, 0xE8,
+    0xC9, 0x89, 0xCE, 0xC0, 0x45, 0x19, 0xB4, 0x3F, 0x98, 0x08, 0xAB, 0x2D, 0x32, 0xE8, 0x36, 0x58,
+    0x14, 0xBA, 0xF1, 0x28, 0x37, 0x4D, 0xA0, 0x51, 0x53, 0xA6, 0xAE, 0xDA, 0x5D, 0xF0, 0xEC, 0x51,
+    0xDA, 0x22, 0xDB, 0xEB, 0x6A, 0x79, 0xC6, 0x63, 0x3B, 0x03, 0x1A, 0xF7, 0x8F, 0x87, 0xBB, 0x7B,
+    0x85, 0x56, 0x5E, 0x99, 0xCD, 0xFA, 0x4A, 0x6C, 0x13, 0xCF, 0x55, 0x8E, 0x90, 0xE7, 0xB1, 0x6B,
+    0x73, 0xF3, 0x44, 0xAF, 0xDB, 0x05, 0xAB, 0x6B, 0xEF, 0x34, 0x56, 0xF8, 0xAC, 0x76, 0xC4, 0xD0,
+    0xF7, 0xE9, 0x12, 0xF6, 0xF1, 0x7B, 0xB9, 0x27, 0x4D, 0xF6, 0xBF, 0x3A, 0xC9, 0x25, 0xD1, 0x08,
+    0xF0, 0xE1, 0x0F, 0xF0, 0x0E, 0x1D, 0xBC, 0x31, 0x09, 0x2A, 0x58, 0x37, 0xC1, 0x25, 0x45, 0x7E,
+    0x9D, 0x15, 0xEA, 0x53, 0x8B, 0xE9, 0x27, 0x7C, 0xB1, 0xEC, 0x0A, 0xC0, 0x36, 0x64, 0xBB, 0xC3,
+    0x2F, 0xB7, 0xD3, 0x95, 0x24, 0x7D, 0xEA, 0x35, 0x42, 0xDF, 0x48, 0xF5, 0x23, 0x2E, 0xF1, 0x7F,
+    0xE8, 0x4A, 0x4E, 0x7B, 0x38, 0xB5, 0xD8, 0x13, 0xE4, 0x73, 0x31, 0x50, 0x9D, 0x21, 0xE1, 0xD9,
+    0xDC, 0xF5, 0x87, 0x6F, 0xC1, 0xBC, 0x9F, 0xF5, 0x1A, 0xEB, 0x61, 0x92, 0xD8, 0x10, 0x88, 0x2B,
+    0xC7, 0x48, 0x3E, 0xC6, 0x2E, 0x9B, 0xF4, 0x20, 0x4D, 0x10, 0x5C, 0x45, 0xA2, 0x82, 0x87, 0xBE,
+    0x96, 0x54, 0xEA, 0xE7, 0x53, 0xDC, 0x35, 0x36, 0xAD, 0x48, 0x98, 0xD8, 0xD2, 0x37, 0x0A, 0x82,
+    0xF7, 0x55, 0x8C, 0x28, 0x01, 0x68, 0x9C, 0x8E, 0xE0, 0x44, 0x2A, 0xD5, 0x09, 0x95, 0x8F, 0x2D,
+    0xD7, 0xE7, 0x26, 0xB9, 0xDC, 0x7D, 0x00, 0x0B, 0x5A, 0xDB, 0x30, 0xDC, 0x58, 0x3F, 0x53, 0x6D,
+    0x14, 0xBA, 0x5C, 0x4B, 0x3E, 0xB1, 0x7F, 0x3C, 0xF8, 0x2E, 0x49, 0xB3, 0x7F, 0x05, 0x44, 0xC6,
+    0x44, 0x5D, 0x83, 0xFC, 0xD7, 0x15, 0x3F, 0xA3, 0x55, 0x60, 0x15, 0x13, 0x38, 0xBD, 0x9C, 0x3B,
+    0xFE, 0xF3, 0x68, 0x06, 0xD8, 0xF1, 0x7C, 0x19, 0xB4, 0x01, 0xAB, 0x5C, 0x81, 0xBC, 0x69, 0xAD,
+    0xF5, 0xB2, 0xF6, 0x58, 0xFB, 0x03, 0xE3, 0x79, 0xE5, 0xC3, 0x63, 0xDB, 0x23, 0xA5, 0xD8, 0xE9,
+    0x32, 0xCE, 0xA0, 0x56, 0xD6, 0xFD, 0x53, 0xA0, 0xA5, 0xB4, 0x1D, 0xE9, 0x44, 0x19, 0x27, 0xEE,
+    0x3C, 0xE7, 0x5D, 0x11, 0x14, 0x7B, 0x56, 0xEA, 0x16, 0xB8, 0x2A, 0x4B, 0x7E, 0x7C, 0x6D, 0x7D,
+    0xD1, 0x8F, 0x72, 0xFB, 0x75, 0x8F, 0x12, 0x5C, 0x6D, 0x1C, 0xBF, 0x40, 0xD7, 0x8E, 0x30, 0x09,
+    0xAB, 0xAE, 0xB3, 0x7D, 0x34, 0x23, 0xCD, 0xA8, 0x69, 0xB7, 0xD7, 0x78, 0x75, 0x14, 0x82, 0xD5,
+    0x36, 0x12, 0x9B, 0x70, 0x3E, 0x94, 0xE7, 0xA5, 0x2E, 0xF4, 0x44, 0x48, 0x82, 0x47, 0xCF, 0xE9,
+    0xA1, 0x21, 0x28, 0x60, 0x4C, 0x60, 0x4A, 0xDB, 0xC6, 0x25, 0x0B, 0xF3, 0x5B, 0x5C, 0x34, 0x7B,
+    0x6B, 0x8F, 0x1D, 0x6C, 0xCD, 0xA5, 0x03, 0x62, 0x24, 0xB5, 0x4E, 0x8F, 0x1B, 0x80, 0x61, 0x19,
+    0x52, 0x95, 0xC8, 0x46, 0xEF, 0x57, 0xB6, 0x8F, 0x0C, 0xE3, 0xA1, 0xD6, 0x08, 0x16, 0xC8, 0x20,
+    0x3C, 0x13, 0x93, 0x42, 0xDE, 0xE4, 0xE2, 0x28, 0xAC, 0x62, 0xA4, 0xCC, 0x28, 0x83, 0xB0, 0xF9,
+    0xEB, 0xD8, 0x51, 0xA9, 0x13, 0x3C, 0x53, 0x73, 0x7A, 0x9D, 0xB5, 0xC4, 0xFA, 0xC8, 0x0D, 0xB8,
+    0x66, 0x15, 0x8E, 0x65, 0x79, 0x08, 0xC9, 0x6E, 0x65, 0xC5, 0x09, 0x9B, 0x20, 0x7D, 0xC0, 0xBE,
+    0xCC, 0xC3, 0x60, 0xA5, 0x10, 0xBD, 0xC9, 0x50, 0xCE, 0xE2, 0xAF, 0x16, 0xD7, 0xE0, 0xAC, 0x17,
+    0x78, 0x35, 0x2A, 0x0A, 0xAF, 0x4C, 0x2C, 0x78, 0x78, 0x3E, 0xF4, 0x7A, 0xB2, 0x63, 0xD4, 0xBD,
+    0x4B, 0xC2, 0x8C, 0x0C, 0x5C, 0x57, 0xBA, 0x90, 0x5C, 0x2D, 0xDB, 0x79, 0xCE, 0x4B, 0x83, 0xB6,
+    0x3C, 0xB0, 0x7B, 0xFA, 0x7B, 0x05, 0xAD, 0x0B, 0xA0, 0xF5, 0xBD, 0x24, 0x42, 0x69, 0x2D, 0xE4,
+    0x9B, 0x67, 0xB9, 0xBD, 0x6E, 0x18, 0x61, 0xE6, 0x30, 0x62, 0x01, 0xBB, 0x88, 0xB6, 0xC2, 0x6A,
+    0x09, 0x87, 0x2C, 0xB9, 0xC6, 0x11, 0x54, 0xC5, 0x19, 0xA3, 0xBC, 0x54, 0xDD, 0x2C, 0x13, 0xDD,
+    0xA1, 0xD2, 0x4D, 0x79, 0x2A, 0xE0, 0x89, 0xB0, 0x3B, 0xC1, 0xF4, 0xB8, 0xCC, 0x7A, 0xF8, 0x90,
+    0xC2, 0xEF, 0x2F, 0x1E, 0xEC, 0xBB, 0xDC, 0x8A, 0x82, 0x9E, 0x94, 0x04, 0x30, 0x1E, 0x33, 0x66,
+    0x8F, 0x22, 0x47, 0xE4, 0x80, 0x6A, 0x70, 0x87, 0x47, 0x95, 0x5D, 0x7F, 0x10, 0x66, 0x7D, 0x94,
+    0xDB, 0xB2, 0xD2, 0xA6, 0x10, 0xE0, 0xBE, 0x01, 0xB2, 0x5A, 0xB2, 0x66, 0x01, 0xA2, 0xA1, 0x4E,
+    0xB5, 0xD5, 0xBE, 0x52, 0x88, 0x11, 0xB0, 0x45, 0xB6, 0xA4, 0x0B, 0xEE, 0x50, 0x45, 0x0C, 0x9D,
+    0x3F, 0xA3, 0x4C, 0xEC, 0x63, 0x6D, 0x99, 0x6C, 0x30, 0x7F, 0xB1, 0x27, 0x38, 0xB7, 0xBC, 0x41,
+    0x49, 0x08, 0x7E, 0xBE, 0x84, 0x9C, 0x3C, 0x5C, 0xBA, 0x19, 0xA3, 0x00, 0xB1, 0x1F, 0xD4, 0x1B,
+    0x80, 0x9D, 0xA2, 0xFC, 0xCA, 0x70, 0xFF, 0x15, 0x02, 0x60, 0x69, 0x12, 0x64, 0x40, 0x1D, 0xF1,
+    0x65, 0x12, 0x52, 0x64, 0x3A, 0xAC, 0x44, 0xE2, 0x9D, 0xE3, 0x8C, 0x50, 0xD5, 0x59, 0x7E, 0x1A,
+    0xE0, 0x26, 0x72, 0xB5, 0x52, 0xB4, 0x79, 0xB9, 0x93, 0x41, 0xA2, 0xC9, 0x5D, 0x9E, 0x65, 0x70,
+    0x83, 0x2D, 0x3A, 0x93, 0xE4, 0xDE, 0xC3, 0x40, 0x35, 0xA2, 0x86, 0x3D, 0x9D, 0x0A, 0x9E, 0x11,
+    0xEA, 0x81, 0xDB, 0x3B, 0x99, 0xCB, 0x46, 0xD3, 0x6B, 0x49, 0xB6, 0xDA, 0xE8, 0xF1, 0xB5, 0xA4,
+    0x52, 0x15, 0x39, 0xAE, 0xBF, 0xA7, 0xDB, 0xEE, 0xDF, 0x41, 0x24, 0x98, 0xED, 0xF3, 0x0D, 0x12,
+    0xBE, 0x59, 0x4E, 0x09, 0xF8, 0x50, 0xDE, 0xE2, 0x36, 0x9A, 0x12, 0xC4, 0x12, 0xF2, 0xF1, 0xF8,
+    0x58, 0xC8, 0x86, 0x14, 0xE1, 0x39, 0x3B, 0x9A, 0xFB, 0x46, 0x7B, 0x98, 0x0D, 0x26, 0xBC, 0xA3,
+    0x54, 0xEA, 0x01, 0x72, 0x68, 0x73, 0x2F, 0xD5, 0x08, 0x3B, 0xF3, 0x7B, 0x7A, 0x9F, 0xDB, 0x29,
+    0x11, 0x3B, 0xF0, 0x07, 0x4C, 0x46, 0x10, 0xDF, 0xA0, 0x9D, 0x0A, 0xD8, 0x08, 0x1A, 0x7B, 0xD1,
+    0xE1, 0x9A, 0x83, 0x77, 0x1A, 0x2F, 0x1A, 0x16, 0x77, 0x22, 0x75, 0x98, 0xED, 0x70, 0x40, 0x54,
+    0x9A, 0x15, 0x56, 0x32, 0x93, 0xC9, 0xA2, 0xD1, 0x48, 0x54, 0x8F, 0xEF, 0x07, 0x43, 0x4D, 0x9E,
+    0xC7, 0x07, 0x32, 0x6C, 0x6E, 0xAC, 0x79, 0x8C, 0x6E, 0x1A, 0x48, 0x99, 0xBC, 0x6A, 0x0D, 0x19,
+    0x47, 0x5B, 0x1C, 0x3E, 0x18, 0xCA, 0x54, 0x6A, 0x7F, 0xA4, 0xAB, 0xD3, 0x2B, 0x86, 0xD1, 0x1B,
+    0x32, 0xCB, 0x8C, 0x12, 0x1C, 0x0D, 0x28, 0x52, 0xD1, 0x02, 0x47, 0x22, 0xD2, 0xD4, 0x79, 0xDD,
+    0xB9, 0x8C, 0x49, 0xD0, 0x26, 0x94, 0xAE, 0x0E, 0xC1, 0xA3, 0x27, 0x6F, 0x87, 0x5D, 0x30, 0xED,
+    0xFB, 0x30, 0x13, 0x23, 0x9C, 0xC3, 0x10, 0x5D, 0x8F, 0x8A, 0x9D, 0xD8, 0x91, 0xC2, 0xA5, 0x70,
+    0x8C, 0xC4, 0x56, 0xD0, 0x43, 0xE7, 0xAB, 0x40, 0xD4, 0x8F, 0xBE, 0x1B, 0xE4, 0xD5, 0xD2, 0xC5,
+    0x83, 0x8C, 0x27, 0xE9, 0x3B, 0x4F, 0xDB, 0xF4, 0x79, 0xCA, 0x91, 0x89, 0xF3, 0x78, 0xEB, 0x40,
+    0x25, 0x80, 0x73, 0xB6, 0x49, 0x8F, 0x76, 0x74, 0x70, 0xD4, 0x70, 0xDC, 0x77, 0x2F, 0xDD, 0xC2,
+    0x1B, 0x12, 0xB1, 0xA1, 0x3F, 0xC5, 0xAC, 0x70, 0x22, 0x1F, 0xB4, 0x8E, 0x36, 0xC2, 0x5E, 0x93,
+    0x51, 0x42, 0x93, 0xEB, 0x26, 0x13, 0xDC, 0x38, 0x03, 0x68, 0xF6, 0xE1, 0x77, 0x3C, 0x81, 0x07,
+    0xD4, 0x55, 0x70, 0x56, 0x25, 0x0A, 0x08, 0x36, 0x6F, 0x99, 0xFE, 0x12, 0xDC, 0xA1, 0x35, 0x19,
+    0x30, 0xAA, 0x84, 0xB5, 0xE6, 0xF6, 0x23, 0x81, 0xC4, 0x7D, 0x95, 0x35, 0x4C, 0xD5, 0xFA, 0x12,
+    0xB4, 0x09, 0x20, 0x00, 0x5C, 0x15, 0xB2, 0xDD, 0x8B, 0x77, 0x2F, 0x97, 0xDD, 0xFD, 0x4E, 0xEF,
+    0x20, 0x3F, 0x0F, 0x0C, 0xA6, 0xE3, 0x40, 0x12, 0xA3, 0xD1, 0x18, 0x0F, 0x88, 0x16, 0x97, 0x48,
+    0x6B, 0x76, 0x10, 0xE8, 0x4A, 0x91, 0xA4, 0x9C, 0x05, 0x88, 0xA8, 0xC7, 0x2B, 0x3A, 0xAB, 0x87,
+    0xE1, 0x51, 0x21, 0xE5, 0x7B, 0xD4, 0x78, 0xB7, 0x4C, 0x35, 0x7C, 0x0A, 0x27, 0x63, 0xA8, 0x15,
+    0xCF, 0xB8, 0xEE, 0x00, 0x5C, 0xD5, 0x9F, 0x40, 0x5B, 0x8A, 0xEC, 0xA3, 0xFA, 0x64, 0x73, 0xE2,
+    0x8E, 0x5E, 0x1F, 0x69, 0x0C, 0xD4, 0x0A, 0x95, 0x2E, 0x62, 0xD6, 0xB1, 0x7B, 0x51, 0x3E, 0x54,
+    0x7C, 0x51, 0x00, 0xF2, 0xF0, 0x49, 0xD2, 0xB2, 0x13, 0xF6, 0x1E, 0x37, 0xC4, 0xE8, 0x2A, 0xC2,
+    0x5D, 0x50, 0xCE, 0x31, 0xDD, 0x4F, 0x5E, 0x94, 0x8A, 0x33, 0xF3, 0x52, 0xDC, 0x9E, 0xBE, 0x1B,
+    0xE9, 0xA2, 0x97, 0xF4, 0x4A, 0xC0, 0xCA, 0x26, 0x24, 0x2B, 0x94, 0xA3, 0xBF, 0x41, 0xD5, 0x1E,
+    0x06, 0xFC, 0x74, 0x34, 0xCA, 0x2A, 0x61, 0x3C, 0xB2, 0x22, 0xD9, 0x24, 0xF9, 0x8C, 0x37, 0x3E,
+    0x48, 0x1D, 0xAA, 0xBE, 0x9F, 0x0F, 0x93, 0x14, 0x94, 0x3A, 0x44, 0x7F, 0x47, 0x7A, 0x1D, 0x07,
+    0x33, 0x4F, 0x86, 0x39, 0xF3, 0xD5, 0x23, 0xAF, 0x83, 0xF0, 0xCC, 0xFA, 0xDA, 0x86, 0x5F, 0x6B,
+    0x28, 0x77, 0xF2, 0x28, 0x78, 0xFF, 0x7B, 0xB9, 0xB9, 0x9B, 0xF7, 0x45, 0x46, 0x86, 0x12, 0xED,
+    0xB0, 0x93, 0x89, 0x7B, 0xFF, 0xE8, 0x93, 0xB7, 0xAD, 0x08, 0xBC, 0xB2, 0xE9, 0x53, 0xFB, 0x78,
+    0xD6, 0xAD, 0xB3, 0x0D, 0x9F, 0xEC, 0x97, 0x49, 0xA6, 0x43, 0xAB, 0xBE, 0x5E, 0xF9, 0x9D, 0xA0,
+    0xAE, 0x1D, 0x7C, 0x05, 0xB7, 0x2B, 0x60, 0x3A, 0x61, 0xE3, 0x69, 0xA8, 0xBA, 0x6F, 0xD5, 0x9E,
+    0x23, 0x8E, 0x0C, 0x99, 0x03, 0x24, 0xE9, 0xDC, 0x52, 0xC5, 0x74, 0xE9, 0x14, 0x1F, 0x71, 0x5C,
+    0x91, 0x61, 0x6D, 0x2F, 0xB2, 0xA8, 0xCE, 0x88, 0xBE, 0x8E, 0x73, 0x44, 0xF4, 0x53, 0x9B, 0x19,
+    0x0A, 0xEC, 0xBE, 0x54, 0xF6, 0x31, 0x00, 0x91, 0xE9, 0x39, 0x72, 0x0E, 0x07, 0x6A, 0xE9, 0x46,
+    0x5E, 0xF8, 0xF8, 0x3B, 0x30, 0x60, 0x8E, 0xD0, 0xBC, 0x05, 0x1E, 0xF5, 0xEE, 0x33, 0x6A, 0xFA,
+    0x54, 0xCD, 0x4E, 0x8B, 0xCF, 0xEC, 0xD9, 0x9F, 0x53, 0x3A, 0xEF, 0x21, 0xC3, 0x6F, 0x09, 0xF8,
+    0x67, 0xFD, 0x3E, 0x70, 0xE6, 0x6F, 0x63, 0x99, 0xE5, 0x4F, 0xD6, 0x70, 0xED, 0xFB, 0x3B, 0xD9,
+    0xFF, 0xAA, 0x30, 0x5C, 0xBE, 0xB2, 0x28, 0x78, 0xE4, 0xB5, 0x26, 0x82, 0x03, 0x86, 0xB9, 0xDB,
+    0x9D, 0xBD, 0x99, 0xD8, 0xF2, 0x70, 0x9C, 0x9D, 0x6C, 0x81, 0xFC, 0xF8, 0x2B, 0x5E, 0xD4, 0x85,
+    0x95, 0x62, 0xEB, 0xFA, 0xEB, 0x5A, 0x09, 0xC6, 0x14, 0x51, 0xE2, 0x43, 0x62, 0xE9, 0x69, 0x31,
+    0xB1, 0x7B, 0x8F, 0xA6, 0x4D, 0x76, 0xD5, 0x8C, 0xF1, 0xB2, 0xD5, 0x07, 0x17, 0x21, 0x64, 0x23,
+    0xCA, 0x68, 0xF8, 0x60, 0xFF, 0x15, 0x7D, 0xB8, 0xCE, 0xBA, 0xF3, 0x92, 0x77, 0x04, 0x2F, 0x38,
+    0x99, 0x1A, 0xF7, 0x91, 0xC9, 0x0C, 0x99, 0x0F, 0x3A, 0x58, 0x7D, 0x31, 0x01, 0xCB, 0x10, 0xBD,
+    0xC0, 0xAD, 0x4D, 0x37, 0x6C, 0x87, 0x3E, 0x9B, 0x4B, 0xE2, 0x68, 0x72, 0x8C, 0x40, 0xED, 0x6F,
+    0xD6, 0xC1, 0x8B, 0xA0, 0x82, 0xA7, 0x72, 0x73, 0x79, 0x8A, 0xC9, 0xFB, 0x57, 0xEE, 0xFA, 0x5D,
+    0x15, 0x53, 0x2F, 0x81, 0x66, 0x7E, 0xC1, 0x4E, 0xEF, 0x23, 0xC2, 0xB5, 0x76, 0x61, 0xC1, 0xAC,
+    0x55, 0x01, 0x72, 0xB6, 0x2E, 0xC9, 0x56, 0x30, 0x73, 0x77, 0xFE, 0x6F, 0x0F, 0x4F, 0xD4, 0xA3,
+    0xA0, 0x51, 0xC1, 0xEC, 0xE9, 0xF8, 0x16, 0x7A, 0x22, 0x9F, 0x55, 0xDA, 0xA9, 0xC0, 0x31, 0x84,
+    0xC0, 0x3F, 0x3A, 0x57, 0x9D, 0x41, 0x9B, 0x4A, 0x5E, 0x84, 0x19, 0xE5, 0x93, 0xC8, 0xAE, 0xFA,
+    0x91, 0xD8, 0xB8, 0x98, 0x67, 0xB2, 0x8C, 0x37, 0x4B, 0x4C, 0xAA, 0xF9, 0x7C, 0xCD, 0x67, 0x50,
+    0xB2, 0x83, 0x19, 0x88, 0x89, 0xE9, 0xD1, 0xD1, 0x29, 0xA8, 0x9C, 0x94, 0x24, 0x65, 0x1D, 0xF4,
+    0x67, 0x9A, 0xF3, 0x91, 0xB2, 0x3B, 0xAB, 0x94, 0xE9, 0x8C, 0x16, 0xD6, 0x58, 0x17, 0x18, 0x72,
+    0xB2, 0xBD, 0xCD, 0x1B, 0x4B, 0x8A, 0x32, 0x70, 0xDC, 0xFC, 0x97, 0x54, 0x73, 0x25, 0x74, 0x9B,
+    0xF3, 0x90, 0x0C, 0x04, 0xDD, 0x7C, 0x1A, 0xA8, 0xD7, 0x33, 0xCD, 0xE6, 0x88, 0xAF, 0x8E, 0x96,
+    0xD1, 0xE9, 0xFF, 0xCE, 0xEE, 0x3C, 0x1A, 0x42, 0xA5, 0xB2, 0x56, 0xB3, 0x99, 0xA3, 0x8E, 0xED,
+    0x2D, 0xE7, 0xAE, 0xB0, 0x2E, 0x3C, 0xC6, 0x7C, 0xAA, 0xA3, 0x3F, 0xC7, 0xD2, 0x79, 0x04, 0x98,
+    0x9A, 0xC0, 0xA4, 0x6A, 0xDC, 0x64, 0x49, 0x24, 0x4F, 0x8B, 0xFA, 0x86, 0x45, 0x17, 0xE8, 0x7E,
+    0xF5, 0xD3, 0x8A, 0x56, 0x76, 0xBF, 0x95, 0x50, 0xE2, 0x4A, 0xE1, 0x3F, 0xF2, 0x50, 0x5E, 0x8F,
+    0x99, 0x2C, 0xE7, 0xB9, 0x10, 0x6C, 0x99, 0x7C, 0x39, 0x6C, 0xA3, 0x39, 0xAB, 0x0B, 0xF0, 0x84,
+    0x82, 0x7C, 0xD6, 0x59, 0x21, 0x5B, 0x85, 0xFD, 0xFC, 0xF9, 0x15, 0xC2, 0x35, 0x02, 0x52, 0xD2,
+    0x16, 0x20, 0x3B, 0x6F, 0x27, 0xFB, 0x7F, 0x11, 0xBF, 0x05, 0xA1, 0xF1, 0x7C, 0xA1, 0x73, 0x34,
+    0xFD, 0x40, 0x3D, 0xF0, 0x36, 0xEE, 0xC8, 0x4B, 0xC7, 0x4F, 0x35, 0x04, 0x1C, 0x69, 0x49, 0x65,
+    0x0B, 0xCD, 0x4E, 0x3B, 0xED, 0x5C, 0xA6, 0x42, 0x11, 0xB8, 0xFC, 0x8F, 0xA9, 0x44, 0x04, 0x55,
+    0x19, 0x12, 0xA8, 0xAC, 0xE0, 0x4F, 0x13, 0xB5, 0xA0, 0xBA, 0xAD, 0xFA, 0x84, 0x5E, 0x11, 0x95,
+    0x4B, 0xC1, 0x19, 0x57, 0x45, 0x3E, 0x3C, 0x46, 0x92, 0x0C, 0xAD, 0x54, 0xD2, 0xDD, 0x47, 0x6F,
+    0xF0, 0x77, 0x0E, 0xAD, 0xD2, 0x5D, 0xEF, 0x39, 0xF3, 0x67, 0xD7, 0x8D, 0x31, 0x3C, 0xCD, 0x5B,
+    0xB0, 0x3A, 0x47, 0x4C, 0xD1, 0x16, 0xBB, 0xB2, 0xDA, 0x65, 0xF0, 0x9B, 0x82, 0x75, 0x3B, 0xF7,
+    0x46, 0xD3, 0x12, 0xBA, 0xFD, 0x04, 0x9D, 0x2E, 0x8A, 0x3E, 0x75, 0x88, 0x9A, 0xC7, 0xF3, 0x20,
+    0x6B, 0x9E, 0xD7, 0xD3, 0xD3, 0x39, 0x75, 0xF9, 0x76, 0x47, 0xB0, 0xEB, 0xD1, 0x3E, 0xEA, 0xD9,
+    0xF4, 0x7F, 0x0B, 0x6C, 0xF6, 0x8B, 0x04, 0xD3, 0x6F, 0x1F, 0x6D, 0x30, 0xA0, 0xA3, 0x09, 0x45,
+    0x57, 0x6E, 0xE2, 0x3A, 0x0E, 0xE7, 0x07, 0x98, 0x24, 0xED, 0xCB, 0x6D, 0x73, 0xB9, 0x4E, 0x09,
+    0xE7, 0xA9, 0xDD, 0xF7, 0x28, 0xBE, 0xA6, 0x94, 0x4E, 0x58, 0x92, 0x88, 0x74, 0x91, 0x85, 0x20,
+    0x3C, 0x78, 0xBB, 0xA4, 0x13, 0x65, 0xA6, 0x82, 0x2A, 0xCF, 0x1F, 0x2F, 0x43, 0x78, 0x43, 0x36,
+    0x32, 0x8B, 0x99, 0xE9, 0x7E, 0xC3, 0x73, 0x39, 0x3E, 0xC3, 0xFF, 0x42, 0x29, 0x76, 0xD7, 0x99,
+    0x3B, 0x7A, 0x0A, 0xCF, 0x7F, 0x40, 0xB7, 0x54, 0x92, 0x23, 0x18, 0x64, 0xD8, 0xD1, 0x12, 0xC4,
+    0x91, 0xBF, 0xA1, 0x90, 0x5E, 0x03, 0xB3, 0x1D, 0xC5, 0xF4, 0xD7, 0xC7, 0x9A, 0x6C, 0x87, 0x90,
+    0xB8, 0xD2, 0x0C, 0x66, 0x04, 0x20, 0x73, 0xA9, 0x6A, 0x73, 0xD4, 0xC5, 0x76, 0x5A, 0xBA, 0x4D,
+    0xD1, 0x56, 0xFA, 0x99, 0xF6, 0x32, 0x90, 0x5E, 0xFD, 0x19, 0xA4, 0xCD, 0x85, 0x1F, 0x13, 0x39,
+    0x0D, 0x2D, 0x6B, 0x01, 0xA4, 0x48, 0x59, 0x0F, 0x6E, 0x4B, 0xC2, 0xD4, 0xF4, 0x03, 0x71, 0x92,
+    0x91, 0x0E, 0xCD, 0x5B, 0x0A, 0x48, 0xB4, 0xA2, 0x1A, 0xA4, 0xF1, 0x93, 0x6F, 0x1B, 0x90, 0x33,
+    0xCF, 0x05, 0xF5, 0xB4, 0x0D, 0x7F, 0xE3, 0x88, 0xD7, 0x8F, 0xB6, 0x34, 0xBD, 0xEC, 0x0B, 0xA2,
+    0x45, 0xCA, 0x3B, 0xFD, 0xB2, 0x74, 0x10, 0xC0, 0x16, 0x03, 0x77, 0x1B, 0x0C, 0xBC, 0xFB, 0x36,
+    0x93, 0x8A, 0x95, 0x52, 0x14, 0x4A, 0x52, 0x42, 0x4E, 0x8C, 0x5E, 0x59, 0xEC, 0x68, 0xC7, 0xCE,
+    0x8F, 0xFB, 0x15, 0x10, 0xA1, 0xDB, 0xA2, 0x6A, 0x6D, 0x49, 0x65, 0x3C, 0x7C, 0x71, 0xE9, 0x91,
+    0xD5, 0x25, 0x08, 0x19, 0x66, 0xFD, 0x67, 0xF7, 0xC3, 0x4C, 0x1A, 0x4D, 0x6E, 0x31, 0xA0, 0x2A,
+    0x49, 0x57, 0x97, 0xB0, 0x8E, 0xB4, 0xB6, 0x0D, 0xCE, 0xA5, 0x26, 0x52, 0x6C, 0xA3, 0xB3, 0x0E,
+    0xC6, 0x1E, 0x28, 0xA6, 0x4B, 0xEF, 0x20, 0xD1, 0x58, 0x86, 0x64, 0xEF, 0x49, 0x40, 0x62, 0x43,
+    0x58, 0x2A, 0x65, 0x5D, 0x8C, 0x91, 0xFE, 0xDB, 0x85, 0x2D, 0x9D, 0x66, 0x0B, 0x5B, 0xDF, 0xCA,
+    0xFC, 0xA4, 0x35, 0x01, 0xA4, 0x0C, 0x3E, 0x82, 0xF6, 0xD0, 0xB6, 0xEB, 0x38, 0x6F, 0x6F, 0xD6,
+    0xB0, 0x6D, 0xD5, 0xC8, 0x37, 0x2D, 0xD4, 0x3F, 0x7F, 0xA9, 0xCD, 0x95, 0xD0, 0xE0, 0xBA, 0x56,
+    0xF2, 0xF5, 0x2F, 0x38, 0xDA, 0x23, 0x3C, 0x62, 0xC1, 0x96, 0xAC, 0xE4, 0xA5, 0xAB, 0xD3, 0xE4,
+    0x42, 0xD6, 0x06, 0x7D, 0x2F, 0x64, 0xBC, 0x8E, 0xD7, 0x49, 0xF1, 0xA8, 0x08, 0xC0, 0xD4, 0xED,
+    0x10, 0x53, 0x99, 0x3F, 0x7E, 0x66, 0xC8, 0x24, 0xDB, 0x12, 0x1E, 0x15, 0x30, 0x8E, 0x76, 0xD7,
+    0xCD, 0x65, 0xD4, 0x97, 0xCB, 0xC7, 0xDD, 0x89, 0x1E, 0x28, 0x7B, 0x08, 0xED, 0x16, 0xBD, 0x78,
+    0x21, 0x5A, 0xBD, 0x37, 0x98, 0xD8, 0xE3, 0x81, 0x6B, 0x5C, 0x96, 0x51, 0x45, 0x95, 0xED, 0x2A,
+    0x53, 0x4B, 0xDB, 0x96, 0x66, 0xB4, 0xBF, 0x54, 0x55, 0xBC, 0x82, 0xB0, 0x31, 0x75, 0xA0, 0xA7,
+    0x5F, 0x4D, 0xED, 0x89, 0xBB, 0x47, 0x87, 0x40, 0x68, 0xCA, 0x74, 0x3A, 0xD9, 0x3A, 0xC3, 0x10,
+    0xBA, 0x18, 0xAF, 0xC7, 0x67, 0x0A, 0x86, 0x31, 0x08, 0xE6, 0x8A, 0xD6, 0x0C, 0xD6, 0xDE, 0xB6,
+    0x4A, 0xD7, 0x99, 0xC6, 0x28, 0xBF, 0xD2, 0x82, 0xF6, 0x8C, 0xFA, 0xC9, 0x0F, 0x81, 0x1A, 0x9B,
+    0xD1, 0xE5, 0x7C, 0x3B, 0x31, 0x30, 0x14, 0x27, 0x23, 0x69, 0xD6, 0x3E, 0xB2, 0x94, 0x0A, 0xC4,
+    0xD0, 0x6F, 0x98, 0x4A, 0x42, 0xE5, 0x81, 0x51, 0x00, 0xD4, 0x46, 0x1F, 0x6A, 0x96, 0x3B, 0xB1,
+    0x03, 0x2F, 0x81, 0x2B, 0xD8, 0xC8, 0x79, 0xCF, 0x3E, 0x3F, 0x53, 0xDC, 0x88, 0x1A, 0xF8, 0xAF,
+    0x1C, 0xF5, 0x71, 0x0A, 0xCF, 0xE2, 0x06, 0x29, 0x76, 0xBD, 0xAA, 0x55, 0x9E, 0x87, 0x72, 0x47,
+    0x7C, 0x74, 0x36, 0x17, 0xC7, 0xDF, 0x90, 0xA4, 0x92, 0x2C, 0x72, 0x17, 0x4B, 0xAB, 0x41, 0x7B,
+    0xA2, 0xEC, 0x60, 0x0A, 0xB9, 0x25, 0xAF, 0xAC, 0x0F, 0x66, 0x60, 0x92, 0xC1, 0xA8, 0x5F, 0xD4,
+    0x67, 0x3F, 0x9D, 0xF4, 0x63, 0x3A, 0x28, 0x21, 0x2A, 0x8C, 0x4A, 0x4E, 0x89, 0x0B, 0x23, 0x46,
+    0x81, 0x8D, 0xC1, 0xE0, 0x0F, 0x87, 0x60, 0xFA, 0xA1, 0xC1, 0x71, 0x1F, 0x10, 0x37, 0xDA, 0xCC,
+    0x65, 0xF5, 0xA0, 0x33, 0x84, 0x84, 0x36, 0x0A, 0xED, 0x28, 0x3F, 0x5A, 0xBE, 0x76, 0x95, 0xB6,
+    0xA4, 0xBA, 0xE3, 0x92, 0xF8, 0x4B, 0x55, 0x78, 0x23, 0xBF, 0xAD, 0x7B, 0x39, 0x72, 0xAF, 0xE8,
+    0xAC, 0xEE, 0x27, 0x69, 0x0E, 0x8C, 0x57, 0x29, 0x08, 0xDA, 0xCB, 0x35, 0x07, 0x6D, 0xA4, 0x66,
+    0xC5, 0xF6, 0xF0, 0x73, 0x3A, 0xDC, 0xD3, 0x08, 0x79, 0x9A, 0x28, 0xCC, 0xD0, 0xCC, 0x45, 0x7C,
+    0xED, 0x82, 0x5A, 0x14, 0x29, 0xEF, 0x7E, 0x1E, 0x80, 0x42, 0x5E, 0x36, 0xD3, 0x21, 0x48, 0x8C,
+    0xE6, 0xBA, 0x91, 0x42, 0x54, 0xC6, 0xCF, 0x36, 0x4D, 0x68, 0xE5, 0xC3, 0x18, 0xEF, 0xCE, 0x92,
+    0x47, 0xE7, 0x2E, 0x8F, 0xB1, 0x67, 0x88, 0xC6, 0xB4, 0xB3, 0x98, 0xF8, 0x44, 0x51, 0x6D, 0x44,
+    0xC5, 0x11, 0xFB, 0x2E, 0xA5, 0x67, 0x48, 0xDE, 0xED, 0x7E, 0x9C, 0x6F, 0x53, 0x5D, 0xA0, 0xFF,
+    0x9F, 0x4D, 0x2E, 0x3F, 0xB6, 0x0D, 0x61, 0x41, 0x35, 0xB7, 0x0B, 0x28, 0x8F, 0x6A, 0x29, 0xD5,
+    0xFC, 0x25, 0x42, 0xBF, 0x04, 0x0E, 0xA7, 0xC0, 0xE9, 0xD4, 0xD0, 0x99, 0x26, 0x0C, 0x3B, 0xEE,
+    0xE0, 0x66, 0xFB, 0x66, 0x0E, 0xEC, 0x37, 0x13, 0xE2, 0xD8, 0x2F, 0x90, 0x6B, 0x0D, 0x4E, 0x9C,
+    0x14, 0xCB, 0xBA, 0xF0, 0xD6, 0x49, 0x55, 0xAB, 0xFE, 0x96, 0x74, 0x48, 0x07, 0xA2, 0x0B, 0x6F,
+    0x91, 0x0B, 0x7D, 0x75, 0x60, 0xB9, 0x11, 0x1B, 0x8F, 0x48, 0x6D, 0x66, 0xED, 0xDD, 0xCC, 0x83,
+    0x57, 0x1A, 0x2B, 0x81, 0x7F, 0xC5, 0x7B, 0x3B, 0x16, 0x92, 0x93, 0x6C, 0xC7, 0xB2, 0xC5, 0x48,
+    0xAE, 0xB2, 0x2E, 0x4C, 0x22, 0xE8, 0xF9, 0xD4, 0x91, 0x95, 0xA9, 0xA1, 0x97, 0x48, 0x80, 0x4D,
+    0x4D, 0x5E, 0xEF, 0x3E, 0x87, 0xD5, 0x3C, 0xF7, 0xDF, 0xFA, 0x36, 0x4A, 0xC4, 0x72, 0x0C, 0x2E,
+    0x0E, 0xA2, 0xC6, 0x61, 0xB1, 0x3D, 0xEC, 0x5A, 0x6C, 0x9D, 0x16, 0x81, 0x13, 0x61, 0x8E, 0x7E,
+    0x28, 0xA0, 0x3D, 0xEB, 0x8E, 0x97, 0x59, 0x0E, 0x24, 0xCF, 0x5B, 0x4D, 0x98, 0xDE, 0x01, 0xC9,
+    0x48, 0x97, 0x8F, 0x1C, 0xCC, 0xF9, 0x6B, 0xA8, 0xC0, 0x44, 0x73, 0xEB, 0x06, 0x17, 0xB2, 0x8D,
+    0xA5, 0xD4, 0x25, 0x87, 0x0E, 0xE2, 0x6E, 0x0D, 0x99, 0x7E, 0xCE, 0x06, 0x83, 0x99, 0x3A, 0x8C,
+    0xE6, 0xC7, 0x99, 0xAC, 0x3C, 0xF3, 0x0C, 0x50, 0x8F, 0xA7, 0xB2, 0x2B, 0x3C, 0xCA, 0x56, 0x06,
+    0x63, 0xA0, 0x9A, 0xB6, 0xF8, 0x84, 0x43, 0x03, 0x04, 0x07, 0x8A, 0xEC, 0x43, 0xA1, 0x3E, 0x5F,
+    0xE2, 0x2A, 0x50, 0x02, 0xBA, 0x62, 0xDA, 0x77, 0x7A, 0xC9, 0x06, 0x50, 0xF5, 0xEE, 0xE0, 0xD0,
+    0x85, 0xDA, 0x15, 0x54, 0x36, 0x83, 0x44, 0xC5, 0x14, 0xBD, 0x98, 0xB4, 0x37, 0x27, 0x56, 0x4B,
+    0xB2, 0x19, 0x59, 0xEB, 0xD5, 0x95, 0x27, 0xAD, 0x94, 0x2F, 0x36, 0x8D, 0x61, 0x26, 0x95, 0xEF,
+    0x4B, 0x05, 0x9E, 0x22, 0xDB, 0x76, 0x06, 0x67, 0xA0, 0x0D, 0x28, 0x90, 0x5D, 0x6D, 0xFF, 0xA6,
+    0x2F, 0x2F, 0x8F, 0x1F, 0x72, 0xEA, 0x88, 0x79, 0xE2, 0xC8, 0x8B, 0xA1, 0x19, 0xC3, 0x09, 0xA3,
+    0x21, 0x93, 0xB4, 0x74, 0xB1, 0xDF, 0x53, 0x78, 0x08, 0x25, 0x01, 0xC6, 0x83, 0x2D, 0x17, 0xD4,
+    0x6C, 0x44, 0x1C, 0xAE, 0xFD, 0x3D, 0xE8, 0xF0, 0xA7, 0x93, 0x59, 0x3B, 0x96, 0x01, 0x5F, 0xC1,
+    0xA4, 0x5F, 0x82, 0xA7, 0x1D, 0x9C, 0xB9, 0x60, 0x00, 0xF4, 0x02, 0x9A, 0xD0, 0xCF, 0xA7, 0x8F,
+    0x25, 0x9E, 0x21, 0xD7, 0x47, 0x9A, 0x18, 0x9E, 0x7F, 0x39, 0x1A, 0x7E, 0x5E, 0x52, 0x44, 0x11,
+    0x1A, 0xF0, 0xD6, 0x4D, 0x3E, 0x98, 0x2D, 0x88, 0x45, 0xDA, 0xC4, 0xBF, 0x51, 0x9F, 0x34, 0xC0,
+    0xEA, 0x0E, 0xD1, 0x32, 0xCD, 0xB9, 0x7E, 0x16, 0x01, 0xF2, 0xD4, 0x81, 0x9E, 0x40, 0xC9, 0xBA,
+    0xC0, 0x93, 0xFB, 0x88, 0x14, 0x8E, 0x79, 0x2F, 0x85, 0x54, 0x12, 0x29, 0x54, 0x8E, 0x4F, 0x72,
+    0x6C, 0x3F, 0x0D, 0xB6, 0xD4, 0x27, 0x91, 0xCE, 0xAC, 0xC7, 0x7B, 0x9A, 0x77, 0xEA, 0xCB, 0xBE,
+    0x0C, 0x53, 0xCB, 0x2E, 0x8E, 0x45, 0x3E, 0xC0, 0x95, 0x76, 0x35, 0x96, 0xF0, 0xAF, 0xA1, 0x91,
+    0x7E, 0x64, 0xE8, 0x82, 0xA2, 0x27, 0x3F, 0x90, 0xC6, 0xE3, 0x78, 0x75, 0xC6, 0x32, 0x3B, 0xDD,
+    0x91, 0xE4, 0x7C, 0xFD, 0x18, 0x16, 0xAC, 0xEF, 0x93, 0xEF, 0x76, 0xC4, 0x4C, 0xC8, 0x1F, 0x61,
+    0xEF, 0xD0, 0x40, 0x0D, 0xD9, 0x9B, 0x13, 0xB8, 0xAA, 0x6E, 0xFC, 0x9F, 0x1D, 0x5E, 0x7C, 0x7F,
+    0xB6, 0x2B, 0xCA, 0x06, 0xF6, 0xDA, 0x06, 0xE0, 0x94, 0x81, 0x8C, 0x49, 0x75, 0xD6, 0x8A, 0xA3,
+    0xC0, 0x7A, 0x59, 0xCE, 0xFC, 0x85, 0xB4, 0xCA, 0xE5, 0xA3, 0x58, 0x64, 0x31, 0xA8, 0x41, 0x2D,
+    0xF4, 0xCD, 0x56, 0x10, 0x2A, 0x18, 0x4C, 0x15, 0xBE, 0xD5, 0x1B, 0xAC, 0xC7, 0x68, 0xB4, 0x3C,
+    0x60, 0x4D, 0xD0, 0xC2, 0x7A, 0xE4, 0xE1, 0x59, 0x84, 0x95, 0x5D, 0x0C, 0x1D, 0x74, 0x4E, 0x5A,
+    0xCC, 0xBB, 0x85, 0xAA, 0xFC, 0x91, 0x81, 0x50, 0xFC, 0x05, 0xC7, 0x77, 0xC5, 0xE3, 0xCE, 0x70,
+    0xA1, 0x35, 0xBD, 0xAF, 0x9C, 0x17, 0xB3, 0x52, 0xD0, 0xE1, 0xC4, 0x6B, 0x12, 0x00, 0x4E, 0xA3,
+    0x2E, 0xC2, 0x45, 0xB3, 0x85, 0x1E, 0xBF, 0x4C, 0x1C, 0xC5, 0x49, 0x7A, 0xB4, 0x9D, 0xCB, 0xB9,
+    0x2D, 0x93, 0xAF, 0xB3, 0x98, 0x30, 0xA1, 0x17, 0x93, 0x31, 0xE8, 0x79, 0xBE, 0xFB, 0xE3, 0xF6,
+    0x8E, 0x8F, 0xBE, 0x11, 0x43, 0xCB, 0x06, 0x38, 0xDD, 0x33, 0x5A, 0x27, 0x77, 0xF7, 0x59, 0xF9,
+    0x12, 0x8E, 0x9E, 0xAA, 0xA6, 0x99, 0x54, 0x9C, 0x26, 0xD8, 0x55, 0x39, 0x8C, 0xD0, 0x62, 0xC7,
+    0x2B, 0xE7, 0xAD, 0x43, 0xDC, 0xFA, 0xA4, 0xB7, 0xB3, 0xB2, 0xEE, 0xDB, 0xC1, 0x1F, 0x37, 0x44,
+    0x89, 0x30, 0xBC, 0xE6, 0x6A, 0x17, 0xEC, 0x31, 0xBB, 0x52, 0x52, 0x36, 0x99, 0x49, 0x45, 0x59,
+    0x6A, 0x55, 0xD0, 0xC6, 0x5C, 0xAD, 0x1B, 0xE6, 0x2F, 0x1B, 0x71, 0x6A, 0x3D, 0x78, 0x3C, 0xFD,
+    0x63, 0x6F, 0x41, 0x6B, 0x4D, 0xA7, 0x83, 0x65, 0x01, 0xFF, 0x82, 0x0E, 0x0E, 0x04, 0xFC, 0x8B,
+    0x24, 0xD1, 0x65, 0x3B, 0xF0, 0x61, 0x78, 0x2A, 0x43, 0x4A, 0xD5, 0xDE, 0xE2, 0x7E, 0x41, 0x15,
+    0x76, 0x08, 0xB8, 0x9B, 0x24, 0x2D, 0x2A, 0xD9, 0x3C, 0xA7, 0x17, 0x47, 0xF7, 0x88, 0xA0, 0xCF,
+    0xDD, 0x5B, 0x08, 0xB6, 0x05, 0x25, 0x54, 0x80, 0x93, 0x83, 0x9E, 0x8D, 0xE1, 0x1F, 0xE6, 0x8E,
+    0x08, 0x4C, 0x06, 0x26, 0xE2, 0x0B, 0xE5, 0xEE, 0xDD, 0x4D, 0xAB, 0xD0, 0x43, 0x15, 0x95, 0x66,
+    0x8F, 0xB6, 0xF8, 0x54, 0xF2, 0xF5, 0x9F, 0x79, 0xB5, 0x08, 0x2E, 0x94, 0x8D, 0x1F, 0x00, 0x86,
+    0xEF, 0xF2, 0xB7, 0x1C, 0x9A, 0x01, 0xA9, 0x00, 0xE2, 0x61, 0x39, 0x47, 0x52, 0xF1, 0x25, 0xA6,
+    0xA2, 0xCC, 0x82, 0xB4, 0xE1, 0x93, 0xBE, 0xC4, 0xBF, 0x2E, 0xBA, 0x02, 0x5D, 0x65, 0x09, 0x50,
+    0x2F, 0x36, 0x58, 0x82, 0x49, 0x9C, 0xC3, 0x78, 0xD8, 0x1D, 0xD5, 0xBC, 0xE8, 0x18, 0xA7, 0xD8,
+    0x9C, 0xB0, 0x15, 0x7D, 0xF9, 0xE1, 0x58, 0xD3, 0x59, 0xEA, 0x13, 0xEC, 0x9F, 0xD7, 0xF3, 0x35,
+    0x90, 0xF7, 0x29, 0xC0, 0x21, 0x7C, 0x55, 0xD4, 0x11, 0x48, 0xF7, 0x6F, 0x6A, 0x00, 0xC5, 0x25,
+    0xE5, 0x00, 0x64, 0xC4, 0xB0, 0x31, 0xE5, 0xF2, 0x03, 0x92, 0x9A, 0x07, 0x47, 0x5E, 0xA0, 0x94,
+    0x65, 0xAF, 0x5A, 0xB6, 0xFC, 0x4B, 0x48, 0xB6, 0x4A, 0xCF, 0x4D, 0xCA, 0x8C, 0x16, 0x77, 0x6C,
+    0xF7, 0x99, 0xBD, 0xCC, 0x1E, 0x40, 0x55, 0xE2, 0xAA, 0xCB, 0xBF, 0xCC, 0x74, 0x92, 0xA2, 0x8A,
+    0x64, 0xC3, 0xE6, 0x17, 0x60, 0x10, 0x72, 0xD1, 0xA0, 0x62, 0xD3, 0x06, 0xCF, 0x12, 0xAD, 0xE6,
+    0xBE, 0xC4, 0x76, 0xD7, 0x34, 0x8E, 0xA7, 0xB4, 0x76, 0xD5, 0x9D, 0xC3, 0xA1, 0x4A, 0xCE, 0xA9,
+    0xC0, 0x4F, 0x70, 0x15, 0x91, 0xAD, 0x41, 0x23, 0x44, 0xB8, 0x65, 0x8C, 0x44, 0x49, 0x4F, 0xB8,
+    0xBE, 0x45, 0x49, 0xA5, 0xAF, 0x02, 0x66, 0x71, 0x58, 0xB6, 0x8D, 0x40, 0xAD, 0x4F, 0x89, 0xF4,
+    0x6F, 0x25, 0x14, 0xB0, 0x62, 0x9A, 0xA6, 0xE8, 0x72, 0x01, 0x66, 0x02, 0xC9, 0xF2, 0xCE, 0xCA,
+    0xBD, 0xA1, 0x3A, 0x12, 0xE4, 0xD4, 0x3A, 0x4B, 0x40, 0xC6, 0xB6, 0x29, 0x00, 0xC9, 0x92, 0x04,
+    0x3B, 0xBC, 0xA9, 0x2E, 0xAD, 0x63, 0x7C, 0xC5, 0x84, 0xAE, 0x3D, 0x91, 0x64, 0x28, 0xB1, 0xA2,
+    0xA7, 0x7E, 0x67, 0xD5, 0xBF, 0x8B, 0x00, 0x23, 0x37, 0x87, 0x57, 0x83, 0xA8, 0x2C, 0x13, 0x12,
+    0x5A, 0x86, 0x67, 0x79, 0x3A, 0xF7, 0xFA, 0x2B, 0xCB, 0xC2, 0xB6, 0x20, 0xF0, 0xD2, 0x3F, 0x39,
+    0x1B, 0x23, 0xA2, 0x11, 0x74, 0x9C, 0xA2, 0x8E, 0x91, 0x4E, 0x70, 0xB3, 0xE1, 0x85, 0x18, 0xC6,
+    0x16, 0x4B, 0x25, 0x93, 0xF1, 0x76, 0x74, 0x4C, 0xA8, 0x9C, 0x81, 0x73, 0xE4, 0x97, 0x54, 0x2A,
+    0x74, 0x45, 0xD7, 0x3A, 0x80, 0x36, 0x43, 0x68, 0x91, 0xAE, 0x99, 0x3B, 0xE6, 0x64, 0x28, 0xC1,
+    0xFD, 0xE6, 0xD3, 0xFA, 0xCE, 0xE2, 0x63, 0xA2, 0x27, 0xA0, 0x50, 0x83, 0x9E, 0x90, 0xE9, 0x47,
+    0x95, 0x27, 0x20, 0x6F, 0x82, 0x4A, 0x88, 0x46, 0xBB, 0xC6, 0xBA, 0x55, 0x72, 0xA8, 0xBD, 0x21,
+    0xD7, 0xE7, 0xFC, 0xC2, 0xCF, 0x30, 0x43, 0x09, 0x80, 0x15, 0xDC, 0x61, 0xFA, 0xE3, 0x46, 0x03,
+    0xD6, 0x28, 0x05, 0xC4, 0x24, 0xD3, 0xC6, 0x90, 0x36, 0x4B, 0x58, 0xE0, 0x32, 0x3A, 0x6B, 0xDD,
+    0x95, 0xEF, 0x4A, 0xDB, 0x72, 0x8A, 0x85, 0xFD, 0x1B, 0x72, 0x48, 0xAF, 0xE1, 0x75, 0x0B, 0xAF,
+    0x65, 0xAA, 0xDC, 0xD1, 0xBA, 0xB5, 0x6F, 0x15, 0x95, 0xE6, 0x2B, 0x9B, 0x78, 0xE3, 0xCF, 0xB8,
+    0xB6, 0x1D, 0xE6, 0xB9, 0xB9, 0xA5, 0x20, 0x53, 0xC4, 0x50, 0xDC, 0xD2, 0x4A, 0x4D, 0x80, 0x44,
+    0xF5, 0xFD, 0x68, 0xB0, 0x78, 0x75, 0x79, 0x08, 0x19, 0xCE, 0x4C, 0xA1, 0x85, 0x51, 0xFA, 0xCB,
+    0xB6, 0xE6, 0x4B, 0x81, 0x42, 0x5D, 0xEA, 0xF3, 0x97, 0xC6, 0x68, 0xD1, 0x56, 0x51, 0x52, 0x48,
+    0x3D, 0x61, 0xD2, 0x1C, 0x0D, 0x68, 0x4A, 0xC4, 0xDE, 0x06, 0x04, 0x34, 0x1C, 0xE4, 0xD1, 0x36,
+    0xED, 0x6D, 0xA7, 0x70, 0x38, 0x89, 0x64, 0x34, 0xC3, 0xBB, 0x93, 0xA2, 0x75, 0xE6, 0x39, 0xF7,
+    0x97, 0x1C, 0xBD, 0x8F, 0xD1, 0xAF, 0x4C, 0x98, 0xF4, 0x7D, 0xD7, 0x71, 0xEE, 0x50, 0x78, 0x72,
+    0x86, 0xB0, 0xD4, 0xB9, 0xD0, 0xCB, 0x5B, 0xB1, 0x50, 0x55, 0xFC, 0xC2, 0xB3, 0x0B, 0x2F, 0xAF,
+    0x54, 0x32, 0x7C, 0x77, 0x6E, 0xC8, 0x2A, 0x57, 0xBB, 0x99, 0x8E, 0xB3, 0x93, 0x37, 0x11, 0xFE,
+    0x23, 0x2C, 0x4B, 0x33, 0x48, 0x9D, 0x13, 0x05, 0xD9, 0x90, 0xF3, 0x4D, 0xBB, 0x3C, 0x3C, 0xBE,
+    0xF2, 0x29, 0x6A, 0xFB, 0xC9, 0x77, 0x21, 0x64, 0x3A, 0xA7, 0xA4, 0x8D, 0xC8, 0x62, 0x4D, 0xE7,
+    0x97, 0x96, 0x2D, 0x88, 0xF7, 0xF1, 0x0D, 0x99, 0x35, 0x09, 0x2B, 0x34, 0xAF, 0x19, 0xB4, 0xBC,
+    0x0C, 0xBA, 0x35, 0x13, 0x9F, 0x85, 0x27, 0x98, 0xD7, 0x5A, 0x98, 0x76, 0x41, 0x3D, 0xE3, 0xDC,
+    0xB1, 0x57, 0x2F, 0x84, 0xA7, 0xAC, 0x60, 0x28, 0x0A, 0x41, 0xCA, 0xA1, 0xB6, 0xB4, 0x68, 0xA9,
+    0x4F, 0xC8, 0xDA, 0x4A, 0x43, 0x89, 0x25, 0x36, 0xC9, 0xCF, 0x6E, 0x3F, 0x04, 0x73, 0xCB, 0xE7,
+    0x9E, 0x2A, 0xB6, 0x04, 0xFF, 0x9F, 0x4B, 0x42, 0x7D, 0x2D, 0x74, 0xAC, 0x3D, 0x6D, 0x78, 0xC7,
+    0xA5, 0x34, 0x9C, 0xD2, 0x8A, 0x09, 0x06, 0xF0, 0x80, 0xA9, 0x69, 0x60, 0xEC, 0x52, 0x70, 0x6B,
+    0x34, 0x0C, 0x7E, 0xAF, 0x17, 0xA7, 0x48, 0x5E, 0xAF, 0x85, 0xF7, 0x29, 0xE4, 0x33, 0x54, 0xA2,
+    0x44, 0x8B, 0xA0, 0x30, 0xF0, 0xAA, 0xE5, 0xAD, 0x87, 0x5E, 0xF6, 0xA8, 0x67, 0xBA, 0x4A, 0x4E,
+    0xA8, 0x85, 0xED, 0x50, 0x2C, 0x4D, 0xBA, 0xC2, 0x89, 0x2F, 0x39, 0x64, 0x62, 0x9F, 0x4B, 0x8E,
+    0x60, 0x5B, 0x2C, 0x5F, 0x4A, 0xFA, 0x65, 0xB3, 0xCD, 0x52, 0x93, 0x43, 0xC1, 0x71, 0x3E, 0xE7,
+    0xFB, 0x78, 0xAD, 0x32, 0xEC, 0xF0, 0xB8, 0x2C, 0x72, 0xEF, 0xD8, 0x37, 0xCA, 0x80, 0xFB, 0x4F,
+    0x2C, 0x18, 0xF4, 0x6D, 0x88, 0x5E, 0xCB, 0x07, 0xB7, 0xB3, 0x9C, 0x05, 0x58, 0x84, 0x71, 0xB1,
+    0xE1, 0x11, 0xD4, 0xC9, 0x63, 0xAE, 0x23, 0x82, 0xEB, 0xF9, 0x48, 0x97, 0xCA, 0x26, 0x30, 0xC2,
+    0xF1, 0x37, 0x8E, 0xE6, 0x53, 0x08, 0x16, 0x5E, 0x2A, 0x24, 0x95, 0xFB, 0x92, 0x68, 0xF5, 0xFC,
+    0x34, 0x70, 0x98, 0x6E, 0x2C, 0x54, 0x97, 0x81, 0x11, 0xFC, 0x95, 0xEF, 0xCA, 0xD3, 0xBF, 0xC3,
+    0xB5, 0xB5, 0xC0, 0xC7, 0xCE, 0xF3, 0x22, 0x8C, 0x9F, 0xD7, 0xC7, 0xA2, 0xFC, 0x95, 0xEE, 0x69,
+    0x94, 0x20, 0x16, 0x5B, 0x55, 0xA4, 0x48, 0x66, 0x2A, 0x70, 0x91, 0xD5, 0x61, 0x32, 0xBB, 0x34,
+    0x61, 0x13, 0x00, 0x59, 0xEA, 0xB7, 0xDE, 0xAE, 0xE0, 0xA2, 0xEF, 0x3B, 0xF0, 0x1C, 0xA9, 0xC2,
+    0xFC, 0x02, 0xE3, 0x69, 0x8E, 0xBA, 0xED, 0xAD, 0xBA, 0x37, 0x52, 0x71, 0x4E, 0x8A, 0xC3, 0xA1,
+    0x77, 0xA8, 0xDF, 0xA5, 0x3E, 0x95, 0xF7, 0xEE, 0xEF, 0xD7, 0xBE, 0x46, 0x4F, 0x65, 0x7A, 0xB5,
+    0x8C, 0xBB, 0xB7, 0x45, 0xB9, 0x36, 0xA2, 0xD1, 0x44, 0xBE, 0x10, 0x8F, 0x9F, 0x29, 0xDF, 0xFC,
+    0x4E, 0xC0, 0x69, 0x49, 0x8E, 0x05, 0x07, 0x7D, 0x9E, 0xA2, 0x0B, 0x6E, 0x92, 0x47, 0x18, 0x99,
+    0xF2, 0xF7, 0x62, 0x5C, 0x38, 0xD9, 0xE6, 0x92, 0x82, 0x37, 0x44, 0xB7, 0xAB, 0x8B, 0x7D, 0xB5,
+    0x4D, 0x3E, 0xA4, 0xF3, 0x8F, 0x6B, 0x0B, 0x8B, 0x60, 0xDD, 0x55, 0x2D, 0x9E, 0xB7, 0xF8, 0x79,
+    0x9B, 0xCA, 0x8F, 0x76, 0x78, 0x7B, 0x1B, 0xE7, 0xDB, 0x55, 0xBA, 0x71, 0x0B, 0x7F, 0x7D, 0xEC,
+    0xF4, 0x2A, 0x7D, 0x7E, 0xA6, 0xD5, 0xE6, 0x7C, 0x50, 0x6E, 0x11, 0x3A, 0x00, 0x33, 0xA5, 0xB7,
+    0xF1, 0x40, 0xF5, 0xDE, 0x62, 0xD5, 0xC9, 0x18, 0x76, 0x70, 0x7C, 0x09, 0x5A, 0x88, 0x2F, 0x0F,
+    0x5C, 0xC9, 0x80, 0xB1, 0xEA, 0x55, 0x05, 0x4F, 0x7E, 0x51, 0x25, 0xF8, 0x82, 0x76, 0xF6, 0x0B,
+    0x5E, 0xC5, 0x7E, 0xCE, 0xB8, 0x59, 0x2B, 0x2C, 0x8B, 0x0B, 0x43, 0xDC, 0xC7, 0x74, 0x96, 0x13,
+    0xBA, 0x34, 0xD7, 0x69, 0x11, 0x6C, 0x01, 0x4E, 0xC2, 0x8A, 0xD7, 0x38, 0x10, 0x20, 0xB8, 0xAB,
+    0x20, 0xA1, 0xA7, 0x10, 0x20, 0xD3, 0x61, 0x07, 0x01, 0x5C, 0x48, 0x89, 0x87, 0x93, 0xFE, 0x36,
+    0x05, 0x28, 0x52, 0x07, 0x35, 0xF0, 0x05, 0x75, 0x0D, 0x26, 0x95, 0x77, 0xEC, 0x41, 0x99, 0xBF,
+    0xEB, 0xC4, 0xD8, 0xD1, 0x0A, 0x08, 0x78, 0xC6, 0x6A, 0xEA, 0x52, 0x05, 0x1D, 0x45, 0x5D, 0x87,
+    0x80, 0x94, 0x42, 0xD9, 0x5A, 0x1F, 0xBA, 0xAE, 0x11, 0x86, 0xA1, 0xCC, 0xF9, 0xBA, 0x29, 0xE4,
+    0xF2, 0x07, 0x91, 0xF1, 0xDF, 0x17, 0x61, 0x56, 0xF5, 0xEC, 0x19, 0xCC, 0x1F, 0xB0, 0xF5, 0x22,
+    0x9F, 0xD1, 0x06, 0x93, 0x6B, 0xE5, 0x98, 0xF6, 0xBE, 0xE1, 0x3C, 0x0E, 0x62, 0xF5, 0x77, 0xF6,
+    0x27, 0x7E, 0xDB, 0xB2, 0x96, 0x13, 0xCE, 0x0E, 0x43, 0x41, 0x14, 0x52, 0x35, 0xAF, 0x63, 0x36,
+    0xAE, 0x97, 0x2E, 0xB0, 0x22, 0xCA, 0xC1, 0xEC, 0xC9, 0x98, 0x93, 0xBD, 0xCD, 0x8E, 0x90, 0x6B,
+    0x12, 0x30, 0x1D, 0xAA, 0x6C, 0xB4, 0xEF, 0x3B, 0x0D, 0x24, 0xBE, 0x28, 0xB0, 0xD1, 0xAD, 0x06,
+    0xDA, 0x82, 0x16, 0x0F, 0xB2, 0xD4, 0xDB, 0x2A, 0xAC, 0x7B, 0x94, 0x62, 0xF3, 0x3F, 0x29, 0xA6,
+    0xF3, 0x6F, 0xC5, 0xD6, 0xBB, 0x81, 0x53, 0xAB, 0x86, 0xE5, 0xA5, 0x63, 0x02, 0xDA, 0xF3, 0x88,
+    0x8E, 0xBF, 0xB5, 0x56, 0x1A, 0x79, 0x4D, 0x39, 0xCA, 0xDB, 0xC9, 0xD4, 0x78, 0xFD, 0x4C, 0xDB,
+    0x03, 0x10, 0x84, 0x83, 0xAD, 0x4A, 0x13, 0xCF, 0xB8, 0xD7, 0x58, 0x34, 0x51, 0xD8, 0x13, 0x25,
+    0x99, 0x46, 0x9E, 0xD6, 0xD7, 0xDB, 0xE6, 0x2F, 0x6F, 0xAC, 0x12, 0xF1, 0x08, 0xB1, 0x07, 0xB9,
+    0x73, 0x61, 0xDB, 0x68, 0xAE, 0x3A, 0xC3, 0xBC, 0x74, 0x02, 0xD3, 0x55, 0x8F, 0x69, 0x8A, 0x2E,
+    0x51, 0x84, 0xEA, 0x19, 0x6B, 0xA9, 0x52, 0xC7, 0x06, 0x47, 0x79, 0xFB, 0xD0, 0x98, 0xC6, 0x7D,
+    0xF2, 0xBA, 0xF6, 0xE4, 0xEC, 0x10, 0x69, 0xE0, 0xB8, 0x52, 0x2C, 0x7F, 0xB8, 0x9C, 0x4F, 0xB2,
+    0x5A, 0x48, 0x39, 0x05, 0x81, 0xA8, 0x5E, 0x91, 0xD6, 0xFA, 0x84, 0xC9, 0xE6, 0x12, 0xC6, 0x09,
+    0x44, 0x3A, 0x69, 0xE9, 0x9C, 0x20, 0x9C, 0x4B, 0x6E, 0x39, 0xC8, 0x0A, 0xC8, 0x65, 0x28, 0x96,
+    0xA6, 0x6F, 0x3B, 0x07, 0x5E, 0xB0, 0xF1, 0x91, 0x27, 0x99, 0x38, 0x23, 0xF9, 0x0B, 0xF1, 0xE1,
+    0xC6, 0x01, 0xFB, 0x64, 0xA1, 0x41, 0x4D, 0x49, 0xEA, 0xC6, 0x35, 0xF4, 0x6A, 0x73, 0xE9, 0x9E,
+    0x6A, 0x2F, 0xA0, 0x00, 0x06, 0xF7, 0xF6, 0x8C, 0xD7, 0x3D, 0x7A, 0xC5, 0xEF, 0xBD, 0x91, 0xFD,
+    0x76, 0x8D, 0x78, 0xAA, 0x2D, 0x14, 0x0F, 0x01, 0xC8, 0x70, 0x96, 0xF9, 0x8F, 0x83, 0x61, 0xC7,
+    0xE4, 0xB2, 0xA6, 0x52, 0xBB, 0xE5, 0x1B, 0x49, 0x16, 0xCC, 0xBE, 0xD7, 0xAF, 0x76, 0xA7, 0x38,
+    0x44, 0x4D, 0xF2, 0xAC, 0x23, 0xD2, 0x50, 0x2C, 0xE7, 0x4E, 0xDC, 0xBA, 0xFD, 0xCB, 0x0C, 0x8A,
+    0xEA, 0xE7, 0x7A, 0x00, 0xEE, 0x14, 0xAB, 0xC9, 0x52, 0xCE, 0xA4, 0x38, 0x40, 0xE0, 0x75, 0x5E,
+    0x33, 0xCA, 0xA5, 0x20, 0xB7, 0x5D, 0xF9, 0x09, 0x1A, 0xA8, 0xBD, 0xBE, 0x34, 0xBF, 0xD8, 0x12,
+    0xF9, 0xF0, 0xC2, 0x63, 0xEE, 0xFF, 0xA9, 0xBF, 0x5C, 0xD7, 0xD3, 0x3A, 0x40, 0xEC, 0xE6, 0x32,
+    0x86, 0xA7, 0xA7, 0x0B, 0xA8, 0x87, 0x7A, 0x3E, 0x5E, 0x53, 0x4B, 0x85, 0x53, 0xFA, 0x9F, 0xA2,
+    0xAB, 0xC7, 0x88, 0x16, 0x77, 0x4D, 0x35, 0x06, 0xFE, 0xDA, 0x4A, 0x47, 0x4F, 0x1C, 0x7C, 0xFF,
+    0x4C, 0xB2, 0x84, 0x2D, 0x4F, 0x51, 0x7F, 0x65, 0x4E, 0x1C, 0xA7, 0x92, 0xE6, 0xCD, 0x80, 0x0A,
+    0xA3, 0xE8, 0xB8, 0x7A, 0x42, 0xBC, 0x3A, 0x09, 0xEC, 0xE4, 0x7D, 0x2F, 0xBC, 0x27, 0x2A, 0xBD,
+    0x8C, 0x6E, 0xE4, 0x48, 0x54, 0x73, 0x6D, 0x1F, 0x15, 0xCD, 0x37, 0x39, 0x64, 0x12, 0xE3, 0xE4,
+    0x49, 0x35, 0xCA, 0x83, 0x84, 0xE3, 0xE2, 0x58, 0xEB, 0xEB, 0x8D, 0xC7, 0x3B, 0x9E, 0xB0, 0xD4,
+    0x74, 0xF9, 0xC9, 0x09, 0x58, 0x15, 0xC4, 0x43, 0x18, 0x1E, 0x1D, 0x6D, 0xE2, 0xB1, 0xE7, 0x2A,
+    0x50, 0xC6, 0x4F, 0x32, 0x39, 0xAE, 0xC8, 0x9E, 0x6C, 0xFF, 0xF7, 0xD2, 0xD9, 0xA6, 0x13, 0x85,
+    0x82, 0xA2, 0xF7, 0x0A, 0xF7, 0x2E, 0x52, 0x96, 0x41, 0xCE, 0x84, 0x1E, 0x54, 0x53, 0x4A, 0x63,
+    0x34, 0xA2, 0x56, 0x3A, 0xD1, 0xAF, 0x52, 0xDF, 0x33, 0x39, 0x37, 0xBD, 0x78, 0x52, 0x01, 0x95,
+    0x52, 0xA1, 0x39, 0xE0, 0xEB, 0x33, 0xC5, 0x05, 0x5B, 0x02, 0xB7, 0xFE, 0xA7, 0x89, 0x7F, 0xE2,
+    0x30, 0x27, 0xF4, 0xD4, 0xBF, 0x07, 0x44, 0xF8, 0x6A, 0x56, 0x82, 0xE1, 0x87, 0xE1, 0xFB, 0xBA,
+    0x06, 0xD1, 0x75, 0xBB, 0x32, 0x69, 0x61, 0x6B, 0x45, 0x68, 0x87, 0x2C, 0x4C, 0xF2, 0xBE, 0xAD,
+    0x27, 0xB7, 0x7B, 0x9E, 0xB2, 0x24, 0x15, 0x44, 0x89, 0x2D, 0x2A, 0xF2, 0x10, 0xE5, 0x0D, 0x60,
+    0x44, 0xC8, 0x25, 0x03, 0xAD, 0xC9, 0x64, 0xAA, 0xD6, 0x90, 0x05, 0x14, 0xD7, 0xFE, 0xBF, 0x3B,
+    0x0F, 0xD8, 0x76, 0xD9, 0x76, 0x24, 0xE8, 0xA5, 0xF1, 0x0C, 0xAA, 0x78, 0x4D, 0xF1, 0x43, 0x8A,
+    0x5E, 0x8B, 0x40, 0xC2, 0x15, 0xD9, 0x3E, 0x29, 0x75, 0x8F, 0x8D, 0x63, 0x32, 0x4B, 0xC4, 0xFD,
+    0x4F, 0x7C, 0x9C, 0x33, 0x6A, 0x21, 0x17, 0xE6, 0xF7, 0xA5, 0x03, 0x3D, 0x68, 0x3E, 0xC9, 0x2A,
+    0x46, 0xCB, 0xB1, 0x5F, 0x69, 0x67, 0xDC, 0x28, 0xD7, 0xA9, 0x0D, 0x08, 0xAA, 0x55, 0x9B, 0xB1,
+    0x52, 0x7B, 0x20, 0x28, 0xC2, 0x67, 0x77, 0xBA, 0xB1, 0xC4, 0x81, 0x70, 0x5E, 0xDD, 0x46, 0x89,
+    0x16, 0xC9, 0x16, 0x5E, 0x79, 0x16, 0xEC, 0x7C, 0x5C, 0x5B, 0x6B, 0x15, 0x74, 0x28, 0xE4, 0xB7,
+    0xFC, 0x59, 0xB7, 0x22, 0xB7, 0x5C, 0x8D, 0x7A, 0xB2, 0x4F, 0xE4, 0x29, 0x2D, 0xD1, 0x10, 0xBF,
+    0xCA, 0x92, 0x90, 0x85, 0x51, 0x76, 0x48, 0x1D, 0x4F, 0x7B, 0x40, 0xC1, 0xB2, 0xED, 0x91, 0x20,
+    0x96, 0xD3, 0xD4, 0x46, 0x10, 0xD0, 0xA6, 0xF4, 0x3F, 0x0B, 0x7D, 0x6D, 0x6C, 0x04, 0xC9, 0x94,
+    0x23, 0x97, 0x2F, 0xBD, 0x75, 0x06, 0x68, 0x85, 0xCB, 0x2D, 0xFD, 0xA9, 0xD1, 0xD5, 0xD2, 0x98,
+    0x60, 0x74, 0xC8, 0x1D, 0xAD, 0x8A, 0x21, 0xD3, 0x54, 0x8F, 0x20, 0xBE, 0x06, 0x3D, 0x34, 0xE4,
+    0x95, 0x78, 0x55, 0x8E, 0x70, 0xC5, 0xB5, 0x3B, 0x68, 0x58, 0x2F, 0xC2, 0x16, 0xEC, 0x7F, 0x85,
+    0xC0, 0x05, 0x28, 0xB7, 0xBF, 0x33, 0x3F, 0x0D, 0x83, 0xC7, 0x93, 0x36, 0x97, 0x24, 0x18, 0x0A,
+    0x43, 0x28, 0xFF, 0x90, 0xA1, 0x38, 0xF5, 0xCE, 0x27, 0xCA, 0xD7, 0x47, 0x46, 0xBD, 0x40, 0x7A,
+    0xF2, 0x49, 0x2D, 0x56, 0x1B, 0xAD, 0xDA, 0x00, 0x51, 0x74, 0x44, 0xA3, 0x09, 0x25, 0xE7, 0xB9,
+    0x13, 0xA8, 0x51, 0xED, 0xED, 0xDB, 0xB1, 0x54, 0xFB, 0x5F, 0x38, 0x30, 0x0D, 0x4B, 0x4B, 0x92,
+    0xB5, 0x2B, 0x45, 0x5E, 0x41, 0xFB, 0x27, 0xC4, 0x17, 0xDF, 0x82, 0x3D, 0x9C, 0xD3, 0xF9, 0x8A,
+    0x0E, 0x4A, 0x2F, 0xA1, 0x4D, 0xF4, 0x7C, 0x26, 0xFB, 0x8A, 0xA9, 0xBC, 0xB3, 0xE8, 0x3D, 0x11,
+    0x5A, 0x2B, 0x9D, 0x7D, 0xDA, 0xE7, 0x85, 0x19, 0x9F, 0x78, 0x70, 0x5A, 0x5C, 0xDE, 0x88, 0x40,
+    0x8C, 0x09, 0x5A, 0x0A, 0x2E, 0x0C, 0x6E, 0xF2, 0xFA, 0x9A, 0x00, 0xAC, 0x2A, 0x29, 0xB1, 0x30,
+    0xB1, 0x19, 0x0A, 0x1E, 0x01, 0x6C, 0x02, 0x2F, 0x6F, 0x1D, 0xDF, 0x77, 0x45, 0xF6, 0x81, 0x1F,
+    0xBC, 0x2D, 0x55, 0x2D, 0x31, 0xC9, 0x34, 0x9A, 0xE3, 0x04, 0xC7, 0xD1, 0x1D, 0xA2, 0xE1, 0x5D,
+    0xD4, 0xFF, 0x2F, 0xD5, 0x74, 0x1B, 0xAF, 0x49, 0xA3, 0x2A, 0xE2, 0x31, 0x8D, 0x7E, 0x3B, 0x21,
+    0x64, 0x54, 0x8D, 0x52, 0x64, 0x58, 0x96, 0xFF, 0x83, 0x4F, 0x43, 0xA8, 0x4A, 0xDD, 0xB0, 0xFE,
+    0xC7, 0x4F, 0x8C, 0xDD, 0xA3, 0x02, 0x30, 0xCA, 0xC2, 0xB2, 0x59, 0x17, 0x5D, 0xB3, 0xD7, 0x0A,
+    0x66, 0x4D, 0xF6, 0x7B, 0x38, 0xA2, 0x67, 0xDA, 0x37, 0x3C, 0x69, 0xF0, 0x89, 0xE5, 0x57, 0xBA,
+    0xAF, 0x7C, 0x0C, 0x64, 0x3A, 0x5B, 0x8D, 0xD5, 0x33, 0xE4, 0xBC, 0xFD, 0x45, 0x44, 0x04, 0x23,
+    0xDB, 0x03, 0x3D, 0xCD, 0xA1, 0xA8, 0x6A, 0xE6, 0x9E, 0xDB, 0x1D, 0xBF, 0x10, 0xBB, 0x32, 0xD8,
+    0x6A, 0x47, 0xDB, 0x83, 0x24, 0xE4, 0x1B, 0x4C, 0xC3, 0xDE, 0x5B, 0x3D, 0xD5, 0x1E, 0x69, 0x51,
+    0xA3, 0x94, 0xFF, 0x97, 0x54, 0x44, 0xDF, 0x20, 0x41, 0xD8, 0xE2, 0xFE, 0x72, 0xC7, 0x0B, 0x99,
+    0x0B, 0x1D, 0x49, 0x09, 0xA9, 0xBE, 0xE4, 0x66, 0xD1, 0x16, 0x49, 0x8A, 0xE9, 0xBD, 0x7D, 0xEF,
+    0xCF, 0xE2, 0x69, 0x2A, 0x51, 0x28, 0xCC, 0xD6, 0x80, 0xC7, 0xCE, 0x9C, 0x9E, 0x20, 0x1D, 0x42,
+    0x00, 0x5F, 0x3C, 0xCC, 0x0B, 0x10, 0x40, 0xE3, 0x7A, 0xB6, 0x2A, 0x34, 0xB6, 0x44, 0x50, 0x6F,
+    0x9B, 0x6E, 0xC5, 0xE5, 0xE1, 0x94, 0x0D, 0x0C, 0x9B, 0xF7, 0x35, 0x91, 0xFD, 0xCE, 0x65, 0x1A,
+    0x79, 0xE1, 0x20, 0x69, 0xAD, 0xB4, 0x92, 0xC2, 0x58, 0x85, 0xF9, 0x45, 0x1C, 0x98, 0x46, 0xC7,
+    0x23, 0xA4, 0xDD, 0x81, 0x7C, 0x93, 0x81, 0x55, 0x1D, 0x47, 0x7B, 0x23, 0x18, 0xB4, 0x7D, 0xFF,
+    0x03, 0xA5, 0xE0, 0x78, 0xE3, 0x57, 0xA3, 0x17, 0xB3, 0xB1, 0x01, 0x88, 0x03, 0xA9, 0x10, 0x0B,
+    0x35, 0xFE, 0x67, 0xFA, 0x67, 0x6F, 0xD3, 0xF5, 0x25, 0xCB, 0x75, 0xA0, 0x4F, 0x39, 0xD6, 0x5B,
+    0xD0, 0x65, 0xD7, 0xA8, 0x77, 0xBB, 0xD8, 0x60, 0xAF, 0x2B, 0x9D, 0x37, 0x19, 0xFA, 0x83, 0xF8,
+    0x52, 0x57, 0xDA, 0x2D, 0xEF, 0xBC, 0x17, 0xAA, 0xC6, 0x97, 0xF4, 0xC5, 0xEF, 0x16, 0x81, 0xA7,
+    0xBF, 0x27, 0x49, 0xEA, 0x7A, 0x23, 0x6F, 0x31, 0x6D, 0x62, 0x5B, 0xB6, 0xF3, 0x61, 0xE1, 0xFA,
+    0x87, 0x72, 0xE8, 0xE1, 0x0C, 0x89, 0x6B, 0x53, 0xF0, 0x7F, 0x09, 0x9D, 0x7E, 0x1D, 0x8C, 0x02,
+    0xFE, 0x29, 0xAA, 0xBD, 0x6C, 0xB1, 0x68, 0x67, 0xCC, 0xA6, 0xEA, 0xAE, 0xA9, 0x84, 0xDD, 0xC4,
+    0x44, 0xF7, 0x2E, 0x22, 0x8C, 0xA5, 0x07, 0xE7, 0xEE, 0xE5, 0xC6, 0xB5, 0xF3, 0x5A, 0x41, 0xD4,
+    0x02, 0x2A, 0xE6, 0x1E, 0x79, 0x5C, 0x4B, 0x1B, 0xED, 0x9F, 0x2A, 0xBA, 0xB6, 0x0E, 0x9B, 0xAB,
+    0x83, 0x2D, 0xF0, 0x84, 0x35, 0x83, 0xA2, 0xF4, 0x2C, 0xB6, 0x2F, 0x4C, 0xE9, 0x8B, 0xF6, 0xA4,
+    0x5C, 0x8A, 0xEC, 0x01, 0x9A, 0x2E, 0x80, 0xC0, 0x6C, 0x5B, 0xAC, 0x92, 0x07, 0xAB, 0x93, 0x2D,
+    0x5D, 0x77, 0x7A, 0xA3, 0xA1, 0xDB, 0x8F, 0x05, 0x51, 0xD9, 0x92, 0x98, 0x1E, 0xD1, 0x23, 0x01,
+    0xEC, 0x7E, 0xB7, 0xB8, 0x4F, 0xA7, 0xCD, 0xCC, 0x5F, 0x76, 0x64, 0xDD, 0x06, 0xA9, 0xC9, 0x98,
+    0xD2, 0x3C, 0xB8, 0x06, 0x4B, 0x79, 0x28, 0x9E, 0x14, 0x10, 0xFB, 0x39, 0xDC, 0xF9, 0xE1, 0xE5,
+    0x27, 0xFB, 0x89, 0x8C, 0x66, 0xB6, 0xFE, 0xC1, 0x13, 0x0F, 0x7C, 0xAA, 0x6A, 0x02, 0x45, 0xB1,
+    0x18, 0xD8, 0x3A, 0x2C, 0x94, 0x09, 0x8B, 0x66, 0xED, 0xE9, 0xD7, 0x5E, 0xA2, 0x48, 0x01, 0x8D,
+    0x8D, 0xC7, 0x05, 0x6A, 0xD3, 0x67, 0x07, 0xFC, 0x22, 0x28, 0xE8, 0x0F, 0xCD, 0xFF, 0x12, 0xD5,
+    0xED, 0x64, 0x3F, 0xE5, 0x89, 0x08, 0x41, 0x2C, 0x49, 0x4D, 0x07, 0x7D, 0xF8, 0x2C, 0x28, 0xB5,
+    0x2F, 0xCB, 0xF6, 0xC0, 0x68, 0xDB, 0x0E, 0xFF, 0x92, 0x06, 0xCC, 0x15, 0x17, 0xDD, 0xA7, 0xF4,
+    0xA9, 0x7C, 0x49, 0xFF, 0x91, 0x8B, 0xBE, 0xA5, 0xDC, 0x43, 0x5B, 0xD9, 0x17, 0x17, 0x4A, 0xBC,
+    0x27, 0xAC, 0x90, 0xC4, 0xC7, 0x68, 0x9F, 0x84, 0x29, 0x4E, 0x52, 0xF4, 0x6D, 0x29, 0x30, 0xA7,
+    0xB4, 0x87, 0x42, 0x4F, 0x93, 0x1D, 0x71, 0x7A, 0xC4, 0x97, 0x7C, 0xEB, 0xB1, 0x55, 0xDA, 0x95,
+    0xA5, 0x48, 0xC8, 0xA3, 0xFF, 0x2E, 0xE0, 0x2F, 0x5B, 0xE1, 0xA3, 0x2A, 0x93, 0x2A, 0x34, 0x30,
+    0x19, 0x63, 0x45, 0xB1, 0x7D, 0x68, 0x95, 0x23, 0xCD, 0xE1, 0x79, 0x1B, 0x4D, 0x10, 0x45, 0x0C,
+    0x9B, 0xF3, 0x7A, 0x13, 0x78, 0xC1, 0x06, 0x09, 0x7E, 0x24, 0xAE, 0xDE, 0xB7, 0xE0, 0x91, 0x12,
+    0x4C, 0x0C, 0xA3, 0x0F, 0xA9, 0xFE, 0xB5, 0x2E, 0x13, 0x16, 0x87, 0x9F, 0x89, 0xBD, 0x33, 0x72,
+    0xF9, 0x34, 0xBC, 0x50, 0xA3, 0x60, 0x49, 0xED, 0x65, 0x04, 0xD3, 0xB7, 0x94, 0x95, 0x8D, 0xFA,
+    0xE9, 0xE5, 0x8C, 0x6F, 0x72, 0xEB, 0xE6, 0x21, 0x77, 0x6E, 0xCE, 0x77, 0xEE, 0xFC, 0xDA, 0x4E,
+    0x93, 0xDA, 0x1E, 0xCD, 0xA3, 0xB0, 0xB1, 0x40, 0x37, 0xC8, 0x7B, 0x3E, 0xFF, 0x8D, 0x99, 0xAF,
+    0xB7, 0x79, 0x18, 0x6D, 0xF6, 0xB0, 0x7E, 0xA1, 0xFD, 0x0F, 0x55, 0x98, 0x65, 0xCD, 0x74, 0x64,
+    0x4C, 0x97, 0x63, 0x48, 0xC1, 0x0C, 0x24, 0xBE, 0xC9, 0x92, 0x8E, 0x8F, 0x15, 0x66, 0x0A, 0x02,
+    0x13, 0xC2, 0x5B, 0x9F, 0xB2, 0x03, 0xD1, 0xC3, 0x0A, 0xCE, 0x56, 0x6E, 0x26, 0xD1, 0x55, 0x4E,
+    0xFA, 0xE9, 0xCB, 0x48, 0xA5, 0x74, 0xCC, 0x59, 0x54, 0x92, 0x40, 0x15, 0x07, 0x5D, 0x92, 0xAD,
+    0xCF, 0x7C, 0x75, 0x2D, 0x0C, 0xEE, 0x5B, 0x75, 0x99, 0xB5, 0x66, 0x9B, 0xC6, 0x62, 0xAC, 0x84,
+    0xC8, 0x69, 0x53, 0xA3, 0xD3, 0xAC, 0x64, 0x1F, 0x3C, 0x6B, 0xD4, 0xB8, 0x57, 0x79, 0x20, 0xDB,
+    0x28, 0xD8, 0x0B, 0xB0, 0x40, 0x72, 0x76, 0x40, 0x51, 0xEC, 0xBC, 0x36, 0x4A, 0xC7, 0x01, 0x55,
+    0x1D, 0x76, 0xE8, 0xB3, 0xF6, 0x5B, 0x38, 0x9A, 0x01, 0xFE, 0x00, 0xE0, 0x5B, 0xF6, 0x3F, 0x5D,
+    0xC2, 0x55, 0x0E, 0x1A, 0xB6, 0xC1, 0x88, 0x43, 0xB9, 0xB8, 0xE5, 0xDA, 0xF9, 0x6D, 0xBC, 0x96,
+    0x3F, 0xC5, 0xB3, 0xC2, 0x14, 0xFF, 0xB8, 0x24, 0x70, 0x4D, 0x8F, 0xF2, 0x65, 0xD9, 0x52, 0xE2,
+    0x6F, 0x95, 0x47, 0x0F, 0xEF, 0xD3, 0xBD, 0xF0, 0x93, 0xF6, 0x77, 0x7C, 0x4B, 0xDD, 0x09, 0xA1,
+    0x9D, 0x14, 0xB7, 0x09, 0x75, 0x5A, 0xD5, 0xE7, 0xCD, 0xB4, 0x4E, 0xC9, 0xB2, 0xCC, 0xEB, 0xA7,
+    0x13, 0x8D, 0xF1, 0xBE, 0x7B, 0xF1, 0x3C, 0x03, 0xDC, 0xAE, 0x73, 0x50, 0xC1, 0x79, 0xDC, 0x1E,
+    0xC1, 0x3A, 0xD1, 0x23, 0x9D, 0xF1, 0xF3, 0x87, 0x18, 0x5B, 0x97, 0x09, 0x53, 0xF2, 0x61, 0x89,
+    0x2D, 0xD7, 0x20, 0x3F, 0x40, 0x85, 0x83, 0x1F, 0x69, 0xB0, 0xF7, 0x07, 0x48, 0x50, 0x2D, 0x2D,
+    0xEF, 0xA8, 0x1A, 0x9F, 0x0B, 0xC1, 0xA5, 0x3C, 0xAD, 0x43, 0x59, 0x8A, 0xAA, 0x64, 0x6C, 0x60,
+    0x50, 0x67, 0x3B, 0x52, 0x61, 0x3D, 0x8B, 0x7B, 0xA5, 0x2D, 0x04, 0x7E, 0xE5, 0xEB, 0xE7, 0x79,
+    0x69, 0xD1, 0x05, 0xAE, 0xA2, 0x20, 0x7A, 0xC7, 0x68, 0x8A, 0xCA, 0xBE, 0xBF, 0x27, 0x0C, 0xB3,
+    0x49, 0x05, 0x16, 0x83, 0x7F, 0x29, 0x87, 0x1E, 0x58, 0x94, 0x76, 0xEA, 0xEA, 0xC5, 0x43, 0x3B,
+    0xB3, 0x17, 0xB6, 0x41, 0x3C, 0x59, 0x03, 0x20, 0x83, 0x78, 0x57, 0xD8, 0x9A, 0x69, 0x2C, 0xEE,
+    0x27, 0xCC, 0xC1, 0xAA, 0x7F, 0x52, 0x3A, 0x81, 0x04, 0xC3, 0xCD, 0x64, 0xC0, 0xAF, 0xCF, 0xF8,
+    0xB2, 0x34, 0x8A, 0x94, 0xBD, 0xF7, 0x83, 0x0D, 0x16, 0xE7, 0xB0, 0x47, 0xA2, 0xFA, 0xD6, 0xA7,
+    0x3E, 0xDF, 0xE1, 0x3A, 0xBA, 0x87, 0xA7, 0xF3, 0x8C, 0x5B, 0xB2, 0x28, 0x88, 0x4A, 0x13, 0x69,
+    0x1C, 0xEF, 0x07, 0xAE, 0xC4, 0xCE, 0x95, 0x0D, 0x49, 0x1E, 0x11, 0x96, 0x79, 0x72, 0xEB, 0xA5,
+    0x3E, 0x86, 0x6B, 0x80, 0xF8, 0xE2, 0xAF, 0x28, 0x70, 0x22, 0xE0, 0x07, 0x98, 0xD9, 0xE5, 0x0A,
+    0x45, 0xD1, 0x9A, 0xD9, 0x86, 0x85, 0xEE, 0x92, 0xCC, 0x9B, 0x3A, 0xB6, 0xFE, 0x3F, 0x17, 0x59,
+    0x53, 0xE1, 0xDA, 0xF0, 0x7A, 0x3B, 0x28, 0xD6, 0x28, 0xFD, 0xA2, 0xE6, 0x49, 0xBA, 0x68, 0x99,
+    0x32, 0x89, 0x73, 0xB1, 0x87, 0xA8, 0x3E, 0x84, 0x70, 0xE9, 0xD4, 0x22, 0x24, 0x89, 0x20, 0x01,
+    0xAF, 0x1B, 0xD9, 0xB5, 0x51, 0xA6, 0xFB, 0x67, 0x26, 0x9A, 0x89, 0x47, 0x85, 0x52, 0xB6, 0x0B,
+    0xD4, 0x6B, 0xEE, 0xF4, 0xEF, 0x44, 0xD8, 0x27, 0x74, 0xBA, 0x1E, 0x3C, 0x45, 0x68, 0xFF, 0x93,
+    0xDE, 0x4F, 0x03, 0xA7, 0xC1, 0xB9, 0x11, 0xD3, 0x27, 0xEB, 0x78, 0x40, 0x68, 0xF5, 0x1D, 0x78,
+    0xE9, 0x24, 0x47, 0x3E, 0x80, 0x87, 0xF7, 0xE1, 0x87, 0xDA, 0xA0, 0xE3, 0x79, 0xA6, 0x61, 0x80,
+    0xFD, 0x1A, 0xEB, 0x03, 0x7F, 0xE9, 0x50, 0x00, 0xD3, 0x1E, 0xBC, 0x6D, 0x65, 0xA2, 0xD5, 0x09,
+    0x53, 0x3E, 0x60, 0x54, 0x6D, 0xD0, 0x2E, 0x01, 0x04, 0xA6, 0x13, 0xEE, 0xC0, 0x72, 0x8A, 0x66,
+    0x09, 0x91, 0x56, 0x84, 0x40, 0xFC, 0x8D, 0x35, 0x01, 0xE2, 0x13, 0x76, 0x4E, 0x63, 0xCE, 0xE8,
+    0xF0, 0xD9, 0x0F, 0x09, 0xBA, 0x19, 0x44, 0x4B, 0x44, 0x79, 0xAB, 0xF5, 0xE2, 0x48, 0x92, 0x3F,
+    0xD9, 0x16, 0x57, 0xCA, 0x94, 0x82, 0x9E, 0xFE, 0x02, 0x24, 0x93, 0xAE, 0xF2, 0xF3, 0x2B, 0xCE,
+    0x0A, 0x17, 0x91, 0x5D, 0x90, 0x97, 0x74, 0x13, 0x59, 0x8B, 0x16, 0xB4, 0x65, 0xD2, 0xFF, 0x5C,
+    0x91, 0x35, 0xB8, 0x6D, 0xA0, 0xEA, 0xCB, 0x07, 0xD2, 0x88, 0x6E, 0x8C, 0xF1, 0xC3, 0x9C, 0x6E,
+    0x25, 0xDC, 0xC4, 0x16, 0x73, 0x2B, 0xEA, 0x87, 0xAC, 0x60, 0x7B, 0x0D, 0x50, 0xFF, 0xE8, 0x24,
+    0xB2, 0x77, 0xEF, 0xFD, 0x5D, 0x93, 0x16, 0x62, 0xF5, 0x47, 0x17, 0x5B, 0x3E, 0x0B, 0x55, 0x93,
+    0xCD, 0x04, 0xCD, 0xB2, 0x51, 0xFC, 0x78, 0x0A, 0x4E, 0xAD, 0x07, 0x46, 0xC3, 0x66, 0xE5, 0xA6,
+    0xB7, 0xE4, 0xE2, 0x71, 0x99, 0xA8, 0x44, 0x5B, 0xD6, 0x3D, 0x63, 0x7A, 0x3A, 0x4F, 0x15, 0x6E,
+    0x3E, 0x07, 0x23, 0xDB, 0xBF, 0xD6, 0x78, 0x2B, 0x51, 0x73, 0xCF, 0x48, 0xB3, 0x2C, 0x6A, 0xB6,
+    0x8A, 0x3D, 0x5D, 0x25, 0xA7, 0x70, 0x8D, 0x5A, 0x44, 0x2D, 0x1B, 0x24, 0x4C, 0x27, 0xAA, 0x02,
+    0xE3, 0x57, 0x79, 0xA1, 0x74, 0x0F, 0x73, 0x5F, 0xD2, 0x09, 0x64, 0xE7, 0x26, 0xE6, 0xC3, 0xA4,
+    0x15, 0x90, 0x12, 0x68, 0x54, 0x4A, 0xAF, 0xA5, 0x01, 0x0C, 0x10, 0x1D, 0x22, 0xF3, 0x79, 0xAF,
+    0xED, 0xA4, 0x68, 0x58, 0x4B, 0x97, 0x6F, 0xE9, 0x2B, 0x59, 0x4B, 0x61, 0x91, 0x87, 0x0D, 0x33,
+    0x2C, 0x75, 0xAA, 0x19, 0x93, 0x81, 0xC1, 0xD0, 0x5D, 0xA6, 0xA4, 0xE4, 0x85, 0x1C, 0xBC, 0x32,
+    0xA7, 0xB5, 0x36, 0x3F, 0x26, 0x57, 0xAB, 0xAA, 0xEC, 0x9F, 0xC8, 0x74, 0x08, 0x83, 0x4B, 0x09,
+    0xE1, 0x22, 0x94, 0xD5, 0xD8, 0xB4, 0xAA, 0x90, 0xFD, 0x34, 0x14, 0x27, 0xCA, 0x6B, 0x9A, 0x5A,
+    0x30, 0x2D, 0x75, 0x6D, 0x01, 0x6D, 0x17, 0xCB, 0xEF, 0xA6, 0x3F, 0x36, 0xE2, 0xB2, 0x6B, 0x81,
+    0x3E, 0xAF, 0x8C, 0x92, 0x70, 0x43, 0xA1, 0x1D, 0x09, 0x61, 0x71, 0x6B, 0x0E, 0x53, 0x0F, 0x6B,
+    0x00, 0x32, 0xAC, 0x78, 0xCC, 0x2D, 0xC9, 0x42, 0x0C, 0x70, 0x3F, 0xDF, 0x52, 0x5C, 0xD4, 0x43,
+    0xC7, 0xAC, 0x1C, 0x17, 0xE2, 0xC0, 0x75, 0x8B, 0xF8, 0xC8, 0xD2, 0xE1, 0x69, 0xB1, 0x86, 0x07,
+    0x82, 0x37, 0xB9, 0x4A, 0x5F, 0xC6, 0x4F, 0x95, 0x86, 0x1B, 0x6D, 0x2B, 0xEB, 0x21, 0xD2, 0x84,
+    0xD6, 0x4B, 0xFA, 0xBF, 0x54, 0x41, 0x34, 0xA8, 0x5C, 0x86, 0x23, 0x3A, 0x3D, 0xB6, 0x0C, 0x97,
+    0x28, 0x8B, 0xBB, 0xE8, 0xF6, 0xC0, 0x68, 0xE5, 0x83, 0x21, 0x60, 0xF0, 0xE8, 0x8D, 0x80, 0xFA,
+    0x1F, 0xAC, 0x32, 0xC6, 0x1D, 0x17, 0xD2, 0x3E, 0x57, 0xEB, 0x81, 0x68, 0x28, 0x0B, 0x36, 0x6F,
+    0x3C, 0x08, 0xA3, 0xEB, 0xEE, 0xF0, 0x25, 0x24, 0xB2, 0x70, 0xC5, 0x62, 0xA9, 0xC8, 0x48, 0xDC,
+    0xA1, 0x02, 0x49, 0x0E, 0xE8, 0x19, 0xBE, 0xFC, 0x8C, 0x8E, 0xC4, 0xBE, 0x9D, 0x6A, 0xDB, 0x70,
+    0xDC, 0x78, 0xE1, 0xD4, 0xD1, 0xA4, 0xC8, 0x57, 0x3E, 0xC7, 0x40, 0xA6, 0xF0, 0xA9, 0x83, 0x12,
+    0x76, 0x52, 0x4D, 0xB0, 0xBB, 0xBA, 0xE4, 0x85, 0x93, 0xBF, 0x6D, 0x71, 0x2C, 0x18, 0x57, 0xDE,
+    0x57, 0x24, 0x8E, 0x33, 0xD7, 0xF9, 0x36, 0xE6, 0x3B, 0x63, 0x3B, 0x71, 0xB6, 0xF5, 0x9C, 0x4D,
+    0x2C, 0xC3, 0x55, 0x7B, 0xDB, 0xD9, 0x1F, 0x7D, 0xC7, 0x2B, 0x4E, 0x65, 0x3C, 0xD4, 0xFD, 0xEC,
+    0x01, 0xA6, 0xD8, 0xDB, 0x4F, 0x0A, 0x76, 0xF2, 0x3E, 0x3E, 0x16, 0xB5, 0xE9, 0xBB, 0xE7, 0x8B,
+    0xDF, 0x8D, 0x60, 0x80, 0x79, 0xB5, 0xC6, 0x79, 0x1E, 0x9A, 0xDB, 0x53, 0xB4, 0x80, 0x6C, 0x9C,
+    0xC9, 0x97, 0x7C, 0x0E, 0xAF, 0x41, 0xF9, 0x4C, 0x5E, 0xA4, 0xA4, 0x46, 0x85, 0xF2, 0x9A, 0xAE,
+    0xFE, 0xC5, 0xB0, 0xB7, 0x16, 0x07, 0x03, 0x89, 0x27, 0x3F, 0x53, 0x92, 0x3E, 0x85, 0xE3, 0x23,
+    0xE4, 0x72, 0x1F, 0xD7, 0x77, 0xCF, 0x3E, 0x57, 0xB3, 0x1F, 0xD8, 0x5D, 0x0C, 0xE2, 0xD1, 0xD6,
+    0xCF, 0x20, 0xB0, 0xE1, 0x80, 0x38, 0xF6, 0xEF, 0x91, 0xD3, 0xD7, 0x2E, 0xDE, 0xA3, 0xEA, 0x77,
+    0x44, 0xAF, 0xDC, 0x9A, 0x13, 0x19, 0x75, 0x28, 0x85, 0x61, 0xE5, 0x40, 0x8C, 0xE3, 0xF9, 0x5A,
+    0xEC, 0x2A, 0x5C, 0x29, 0x12, 0x7B, 0x13, 0xBC, 0x21, 0x4D, 0x79, 0xF8, 0xEF, 0xD4, 0xEB, 0xA2,
+    0x95, 0x43, 0xC5, 0xB5, 0x9E, 0x5B, 0x11, 0xAB, 0xE1, 0x9E, 0xB3, 0x76, 0xFF, 0x05, 0xD5, 0x42,
+    0x4F, 0x92, 0x47, 0x58, 0x7A, 0xE2, 0x4D, 0x58, 0x8F, 0x95, 0xC4, 0xDC, 0xC3, 0xD4, 0x4A, 0x78,
+    0x8A, 0xB7, 0x9B, 0x5D, 0x2D, 0x51, 0xFA, 0x4B, 0x10, 0x7B, 0x92, 0xF0, 0x66, 0xEC, 0x7C, 0x01,
+    0xCA, 0xEE, 0x5F, 0xB8, 0x45, 0x78, 0x54, 0x87, 0xB8, 0xDF, 0xDE, 0x80, 0xE8, 0xAD, 0x3A, 0xB7,
+    0xA6, 0xB2, 0x60, 0xC4, 0xA0, 0xE0, 0x42, 0x13, 0x38, 0xED, 0xFF, 0xB4, 0x77, 0xA8, 0xF4, 0xE7,
+    0xF7, 0xE8, 0x71, 0xAE, 0x93, 0x3D, 0xA0, 0xCE, 0xB5, 0x55, 0xC9, 0x5F, 0xE0, 0x65, 0x4F, 0x2C,
+    0xD6, 0x31, 0x7B, 0x61, 0x8E, 0x45, 0x00, 0x02, 0x97, 0x4F, 0x0F, 0xB9, 0x05, 0x03, 0xC4, 0xC2,
+    0xBE, 0x3C, 0x4C, 0x2C, 0xB5, 0x04, 0x22, 0x7F, 0x7E, 0x16, 0x3E, 0xC1, 0xC7, 0xBD, 0x6A, 0xEB,
+    0x10, 0xA6, 0x15, 0x78, 0x6C, 0x66, 0x55, 0x7D, 0xFA, 0xE0, 0x2B, 0xD0, 0x88, 0xAB, 0x80, 0x71,
+    0x6D, 0x2B, 0xD9, 0xC3, 0x39, 0x7A, 0x6F, 0x39, 0xCC, 0xC0, 0x17, 0x73, 0xC8, 0x58, 0x21, 0x63,
+    0xF5, 0x7F, 0x99, 0xF7, 0xC7, 0x46, 0xFC, 0x2B, 0xE3, 0x3B, 0x66, 0x73, 0x0E, 0x90, 0x4A, 0xC3,
+    0x48, 0xCE, 0xDB, 0x39, 0x46, 0xF9, 0xE9, 0x7B, 0x33, 0xCD, 0x9B, 0x8B, 0x3E, 0x21, 0x55, 0x35,
+    0xAE, 0x71, 0xFE, 0xA4, 0x2E, 0xC9, 0xC8, 0xA0, 0x1E, 0x97, 0x10, 0x6A, 0x29, 0x95, 0xFC, 0xCD,
+    0xE0, 0xEC, 0x37, 0x95, 0xFA, 0x61, 0xB5, 0x62, 0x5C, 0xC5, 0xEA, 0xDF, 0x8D, 0xA7, 0xC2, 0xF7,
+    0x4A, 0xC9, 0x34, 0x15, 0xA4, 0x8C, 0x63, 0xA5, 0x16, 0x25, 0x4F, 0xA9, 0x89, 0xD7, 0x2D, 0x77,
+    0x0D, 0x5E, 0xC1, 0x32, 0x2A, 0x86, 0x55, 0x80, 0x97, 0xD1, 0x8C, 0x98, 0x04, 0x5A, 0x89, 0xC9,
+    0xD1, 0x5F, 0x00, 0x5E, 0x29, 0x2C, 0xEB, 0x17, 0x96, 0x6A, 0xEB, 0x9A, 0xEA, 0x5F, 0x2D, 0x99,
+    0x3D, 0x47, 0xCD, 0xFA, 0xA7, 0x8B, 0xFA, 0xB8, 0x16, 0x1A, 0xE7, 0x07, 0x85, 0x47, 0xB6, 0x3F,
+    0xBD, 0x96, 0x4C, 0xD2, 0xE8, 0xBE, 0x78, 0xE0, 0xFE, 0xF8, 0xD7, 0x9F, 0x05, 0xC2, 0xDF, 0x2F,
+    0x1D, 0x8C, 0xDC, 0xDF, 0x4C, 0x36, 0x06, 0xF5, 0xD3, 0xAD, 0xFC, 0x82, 0xB3, 0x7D, 0x47, 0xE3,
+    0xE6, 0x26, 0xD7, 0xA8, 0xC1, 0xA8, 0xD7, 0x73, 0x55, 0x0D, 0x99, 0x81, 0xE8, 0x97, 0x84, 0x22,
+    0x5D, 0x93, 0x7B, 0x83, 0xE3, 0x27, 0xEA, 0x60, 0x03, 0x2E, 0xC9, 0x71, 0xBB, 0x31, 0xF1, 0x4A,
+    0x4D, 0xEA, 0x5B, 0xAD, 0x29, 0x37, 0xAA, 0x4F, 0x6D, 0xEC, 0xBB, 0x00, 0x6A, 0xD9, 0x98, 0xDB,
+    0x08, 0x72, 0x8A, 0x94, 0xC8, 0x9C, 0x03, 0xC5, 0x02, 0x54, 0x46, 0xB5, 0x1E, 0x25, 0xD1, 0x50,
+    0x3C, 0x3E, 0xE0, 0x55, 0x89, 0x28, 0xC0, 0xE3, 0x08, 0x1A, 0x26, 0x9C, 0x4D, 0x74, 0x57, 0x09,
+    0x34, 0xB3, 0x2D, 0x21, 0xA0, 0x4E, 0x9B, 0xB2, 0x93, 0xC0, 0x7A, 0x52, 0xAC, 0x0D, 0x2B, 0xAA,
+    0x5F, 0xCF, 0x9E, 0x94, 0x88, 0x0D, 0xCB, 0x30, 0x74, 0xC7, 0x6B, 0x78, 0x5E, 0xEE, 0x24, 0xC4,
+    0xA8, 0x0B, 0x84, 0x2D, 0xD7, 0xEC, 0x31, 0xA8, 0xE3, 0x62, 0xC8, 0x43, 0x6A, 0x12, 0x0E, 0x46,
+    0xEE, 0x86, 0x33, 0x4B, 0xF9, 0xA6, 0x52, 0x96, 0x6D, 0xA1, 0xD2, 0x1C, 0x50, 0xEC, 0xEE, 0x53,
+    0xE8, 0x7E, 0xD4, 0xE1, 0x41, 0x76, 0x6E, 0xF7, 0x66, 0x89, 0x46, 0xA6, 0xC9, 0x06, 0x32, 0xCC,
+    0x13, 0x23, 0x80, 0xE8, 0x3E, 0x93, 0x52, 0x05, 0x78, 0x1A, 0x02, 0xAA, 0x5C, 0x11, 0xD7, 0xF0,
+    0x39, 0x77, 0x06, 0x4F, 0xB3, 0x4B, 0x8E, 0x9D, 0x84, 0x00, 0x3A, 0xEE, 0x03, 0xFD, 0x48, 0xBA,
+    0xA7, 0x23, 0x59, 0xBE, 0x43, 0x7B, 0x2F, 0xA0, 0x23, 0x6F, 0x9A, 0xE9, 0xB0, 0xC2, 0x84, 0x1A,
+    0x9F, 0x5A, 0x39, 0x22, 0xB6, 0x78, 0x21, 0x86, 0xDD, 0xEC, 0x37, 0x24, 0x1C, 0xB1, 0xD8, 0x7C,
+    0x88, 0xAB, 0xC3, 0x9F, 0xA1, 0x3C, 0xBA, 0xF8, 0x1C, 0x43, 0x41, 0xB2, 0x12, 0x3C, 0x16, 0x38,
+    0xD6, 0x58, 0xFF, 0xBF, 0x73, 0xEA, 0xFE, 0x63, 0xE0, 0x36, 0xA4, 0xE7, 0x38, 0xA2, 0xA5, 0xB2,
+    0xEF, 0xE0, 0x7B, 0x32, 0xCC, 0x34, 0x0A, 0x32, 0x23, 0x14, 0xCE, 0xE9, 0xDC, 0xC7, 0xF1, 0x85,
+    0x79, 0x19, 0x4B, 0xC2, 0x39, 0xC8, 0x57, 0x2A, 0xDD, 0x19, 0x6D, 0x10, 0xC9, 0x3E, 0x39, 0x13,
+    0x5A, 0xC3, 0x33, 0xC5, 0xB1, 0x6D, 0xD8, 0x8B, 0x35, 0x14, 0x9C, 0x67, 0xE6, 0x58, 0xC9, 0x0C,
+    0xE6, 0xC7, 0x59, 0xCA, 0xA7, 0xB6, 0x10, 0x8B, 0x44, 0x2D, 0x8D, 0x12, 0xC3, 0xC3, 0xEE, 0x58,
+    0xB9, 0xFA, 0x60, 0xBD, 0xAB, 0x29, 0xD4, 0xB9, 0x86, 0xA1, 0x2D, 0x8F, 0x62, 0xE4, 0x19, 0x9A,
+    0x71, 0xC2, 0xF4, 0xA5, 0x93, 0x04, 0xBB, 0x8D, 0x64, 0xB5, 0x40, 0x8C, 0x8B, 0xA6, 0x52, 0xCE,
+    0xE3, 0x95, 0x53, 0xEA, 0x14, 0x21, 0x7C, 0x64, 0xCE, 0xCA, 0x69, 0xE9, 0x3F, 0xD9, 0xB7, 0xD4,
+    0xB3, 0xB3, 0xC2, 0x82, 0x64, 0xA2, 0x23, 0xC6, 0xE6, 0x8A, 0x5F, 0xFE, 0xFA, 0x06, 0xE6, 0x5F,
+    0xA2, 0x82, 0x3B, 0x4E, 0x89, 0xAA, 0xCF, 0xCB, 0x18, 0xA1, 0x69, 0x65, 0x93, 0xA8, 0x19, 0xC7,
+    0x78, 0x6F, 0x94, 0x9A, 0x2F, 0x1F, 0x5B, 0x47, 0x30, 0x06, 0xBE, 0x59, 0x5D, 0x84, 0xDB, 0xDF,
+    0xAC, 0xAF, 0x91, 0x8A, 0x39, 0x28, 0xB4, 0xA1, 0x68, 0x2D, 0x4F, 0x39, 0x64, 0xC3, 0x92, 0xB7,
+    0x31, 0x38, 0xAE, 0x87, 0xD1, 0xCD, 0xB8, 0x11, 0xD4, 0xF6, 0xEA, 0x06, 0xB6, 0xB2, 0x22, 0xE8,
+    0x46, 0x7C, 0xB3, 0xC4, 0x93, 0xD1, 0x19, 0x2D, 0xEE, 0x9B, 0xAC, 0x1E, 0x9C, 0xEE, 0x6C, 0x85,
+    0x6F, 0x35, 0xAC, 0x97, 0x3E, 0x97, 0xD0, 0x50, 0x38, 0x59, 0xF8, 0x5E, 0xB0, 0x3D, 0xAA, 0x9E,
+    0x8F, 0x78, 0x51, 0x04, 0xE0, 0x01, 0x8C, 0xF3, 0xE3, 0x9F, 0x59, 0x11, 0x7D, 0x5F, 0xC9, 0xDB,
+    0xA3, 0x99, 0xA6, 0xE2, 0x65, 0x90, 0x75, 0xDD, 0xEC, 0x59, 0x60, 0x19, 0x70, 0x66, 0x12, 0x0B,
+    0x27, 0x26, 0xC2, 0x3B, 0x5B, 0xDB, 0x6F, 0x11, 0x39, 0x08, 0xDC, 0xF4, 0x14, 0x51, 0x06, 0xFE,
+    0x9B, 0xDB, 0x22, 0x25, 0x1E, 0x25, 0x43, 0x8D, 0xD5, 0xD0, 0xFB, 0x68, 0xF3, 0x65, 0xEA, 0x97,
+    0x20, 0xDD, 0x60, 0x7B, 0xB4, 0xE0, 0x90, 0x24, 0x62, 0xF6, 0x84, 0xF0, 0x47, 0xD6, 0xB9, 0xE3,
+    0xB8, 0x16, 0x6A, 0xDB, 0xA7, 0xF7, 0xFD, 0xFC, 0x74, 0x1F, 0x8C, 0xFD, 0x88, 0x4A, 0xE9, 0xEE,
+    0xFE, 0xCC, 0xE5, 0xA0, 0x2C, 0x1D, 0xAE, 0xD0, 0xF3, 0x56, 0xBE, 0xD8, 0x45, 0xC4, 0x44, 0xEA,
+    0xD7, 0x71, 0x34, 0x7C, 0x2A, 0x0A, 0x3F, 0xD1, 0xA8, 0xCA, 0xF1, 0x7E, 0x9C, 0x39, 0x6B, 0x51,
+    0xBD, 0xDB, 0x56, 0x87, 0xAC, 0xDF, 0x31, 0xF9, 0xC0, 0x73, 0xDB, 0xBC, 0x0D, 0x1D, 0xD7, 0x8B,
+    0xBB, 0x50, 0x3B, 0xE7, 0xB5, 0xE9, 0x6A, 0x3B, 0x83, 0xF8, 0x27, 0xE8, 0x7C, 0xD1, 0x8D, 0x14,
+    0xDD, 0x5A, 0xDF, 0xD1, 0xBE, 0xBA, 0xFD, 0x3E, 0xF8, 0xA4, 0x8A, 0xED, 0xAD, 0x82, 0xFD, 0x28,
+    0x3F, 0x46, 0x1C, 0x56, 0x71, 0x71, 0x71, 0xFB, 0x1F, 0xEB, 0xE6, 0x72, 0x10, 0x40, 0xDB, 0xA3,
+    0x40, 0xEA, 0x06, 0x63, 0x74, 0xE7, 0xC3, 0xA9, 0xE4, 0x07, 0xFD, 0xA8, 0x5C, 0x83, 0x16, 0x69,
+    0xB4, 0x6A, 0xAE, 0x85, 0xFC, 0x32, 0xDF, 0x59, 0x71, 0xBB, 0x7A, 0xC1, 0xC2, 0x0E, 0xC0, 0x5A,
+    0xA1, 0x1F, 0x88, 0x6E, 0xF4, 0x79, 0xF2, 0x4F, 0xA5, 0x84, 0x8B, 0xA7, 0x39, 0xCC, 0x6D, 0x44,
+    0x33, 0xD8, 0x1A, 0x9B, 0xAD, 0x8F, 0x12, 0x49, 0x63, 0x93, 0xBB, 0x70, 0xA7, 0x9D, 0x4A, 0x69,
+    0xDC, 0x18, 0x09, 0xB8, 0xED, 0xB1, 0x50, 0x13, 0x59, 0xEA, 0xDC, 0x7B, 0xBF, 0x7F, 0x83, 0x4F,
+    0xC7, 0xFA, 0x3B, 0x44, 0xEF, 0xF9, 0x4C, 0xE9, 0x72, 0x70, 0xD7, 0x27, 0xEC, 0x80, 0x18, 0x2A,
+    0x45, 0x71, 0x87, 0x99, 0x9F, 0xE0, 0x74, 0x3E, 0xE0, 0xE1, 0xCD, 0xF6, 0x76, 0xD9, 0x82, 0x6D,
+    0xF5, 0x01, 0x9C, 0x33, 0x19, 0xB7, 0x0A, 0x1E, 0x07, 0xC7, 0x11, 0x4B, 0xC2, 0x64, 0x16, 0x14,
+    0x9F, 0xE6, 0xD2, 0x65, 0x64, 0x9E, 0xCA, 0x29, 0xB9, 0xC1, 0xA1, 0x64, 0x4A, 0x39, 0x36, 0xD7,
+    0xED, 0xC4, 0xCA, 0x4D, 0x93, 0xB7, 0xE7, 0x52, 0x6E, 0xC4, 0x2A, 0x89, 0x16, 0x14, 0xC2, 0x26,
+    0xF9, 0xD6, 0x69, 0xA6, 0x8B, 0x52, 0x04, 0xA3, 0xF9, 0xB5, 0x34, 0x97, 0x98, 0x0F, 0x77, 0x01,
+    0x02, 0xD7, 0x3D, 0x75, 0x08, 0xE7, 0x90, 0x1B, 0x0A, 0xA4, 0x1D, 0x27, 0xBB, 0xC3, 0xF5, 0x9A,
+    0x3A, 0x75, 0xC2, 0x85, 0x12, 0x98, 0x59, 0x90, 0x92, 0x99, 0x15, 0x73, 0xA2, 0x1D, 0x8A, 0xC0,
+    0x68, 0x39, 0x69, 0x93, 0x2C, 0xCF, 0xE1, 0x43, 0x99, 0xD6, 0x68, 0xEB, 0xBD, 0xB1, 0xF2, 0xA4,
+    0xB4, 0x84, 0x78, 0x62, 0xCA, 0xF7, 0xE3, 0xC8, 0x5B, 0x12, 0x92, 0xA4, 0x93, 0xAA, 0x04, 0x07,
+    0x45, 0x26, 0x09, 0x77, 0x6E, 0x30, 0x47, 0x26, 0x9D, 0x24, 0x8B, 0xED, 0xDC, 0xFB, 0xFF, 0x23,
+    0x3A, 0xFD, 0x6B, 0xCB, 0xA0, 0x88, 0x08, 0x76, 0x66, 0x0A, 0xF9, 0x7B, 0x4F, 0xE2, 0x23, 0x5C,
+    0x4E, 0xE9, 0x16, 0x29, 0xA0, 0x9E, 0xE2, 0x7B, 0xB7, 0xD6, 0xDB, 0xD9, 0xC5, 0xCF, 0x68, 0x4A,
+    0x9F, 0x08, 0x22, 0xA0, 0xEC, 0xF2, 0x3F, 0x95, 0xAE, 0x25, 0x95, 0xED, 0x10, 0x6F, 0x35, 0x1A,
+    0xCA, 0x58, 0xB2, 0xC6, 0x72, 0xA1, 0x03, 0x7E, 0x58, 0x70, 0x59, 0x24, 0x6A, 0x39, 0x00, 0x8B,
+    0x4A, 0x27, 0xBC, 0xB9, 0x00, 0x92, 0x6A, 0xA5, 0xC8, 0x1D, 0xBA, 0xFB, 0x24, 0x7F, 0x91, 0x3D,
+    0xF3, 0x4D, 0x7D, 0xB5, 0xF8, 0xB8, 0x76, 0x27, 0x0A, 0x50, 0x10, 0x98, 0xD3, 0xFE, 0xD8, 0xCD,
+    0x55, 0xDD, 0xC3, 0x70, 0x38, 0x23, 0x75, 0x44, 0xA1, 0x16, 0x01, 0xC4, 0xFB, 0x7A, 0x31, 0xBD,
+    0xC1, 0x1B, 0x51, 0x7F, 0xAB, 0xC0, 0xAE, 0x0C, 0x43, 0xA5, 0x07, 0x35, 0x88, 0xAF, 0x8D, 0x5F,
+    0xF6, 0xE0, 0xFA, 0x6C, 0x83, 0x05, 0xEC, 0xFC, 0x85, 0xDD, 0x66, 0x11, 0x64, 0x77, 0xE7, 0xCA,
+    0xF4, 0xE5, 0xC8, 0x11, 0xC2, 0xAE, 0x06, 0x94, 0x40, 0xF7, 0xA4, 0x00, 0x6F, 0xDD, 0x99, 0xBD,
+    0x3A, 0xA3, 0x69, 0x5B, 0xFF, 0x09, 0xC8, 0xC7, 0xF5, 0xFD, 0xA7, 0xE3, 0x6D, 0x0D, 0x81, 0xC4,
+    0x70, 0xA1, 0x86, 0x35, 0xEF, 0x76, 0x58, 0x4F, 0xD8, 0x91, 0xD2, 0x34, 0xF6, 0x48, 0x86, 0x20,
+    0x95, 0xA2, 0x39, 0xDD, 0x4A, 0x63, 0xC4, 0xFD, 0xAC, 0x12, 0x61, 0xCC, 0xF9, 0x08, 0x15, 0x17,
+    0x4D, 0x94, 0x9B, 0x03, 0xFF, 0x27, 0x06, 0xDC, 0x2A, 0x6B, 0xC6, 0x45, 0x8C, 0xBE, 0x6B, 0x2E,
+    0x21, 0x9A, 0xDE, 0xBE, 0x17, 0x3A, 0x91, 0xA8, 0xA4, 0x09, 0x94, 0x70, 0x22, 0x62, 0x06, 0xDD,
+    0x65, 0x5E, 0x81, 0x8C, 0xB0, 0x2D, 0xA7, 0xA6, 0x6B, 0xD9, 0x9C, 0x75, 0xA1, 0x4C, 0x55, 0x96,
+    0x67, 0x6C, 0xF7, 0xFB, 0x34, 0xA6, 0x4C, 0x53, 0x10, 0x5A, 0xDB, 0x54, 0x7E, 0xAC, 0x67, 0xEA,
+    0x12, 0xF0, 0x29, 0x2A, 0x49, 0x89, 0xFF, 0xC5, 0xF3, 0xD4, 0x1D, 0xBA, 0xFB, 0xEF, 0xCE, 0xA3,
+    0x58, 0x33, 0x7C, 0xFA, 0xC0, 0x30, 0x45, 0x70, 0x15, 0xB0, 0xDE, 0x85, 0xD7, 0x66, 0xCA, 0x00,
+    0x87, 0x93, 0x85, 0x6B, 0xD0, 0x2E, 0x94, 0x80, 0x30, 0x24, 0x69, 0xC5, 0xD9, 0xD8, 0x00, 0xA7,
+    0xBF, 0x4E, 0xF7, 0x5C, 0xDE, 0x10, 0xBE, 0x0A, 0xAE, 0xDA, 0x8D, 0xFD, 0xCB, 0xD0, 0xAF, 0x6F,
+    0xBB, 0xD2, 0xEB, 0xEB, 0x05, 0xA4, 0xF7, 0x3B, 0x0B, 0xC1, 0x0E, 0x50, 0xE4, 0x80, 0x65, 0xF6,
+    0xEE, 0x78, 0xDB, 0xFA, 0xCD, 0x96, 0xDA, 0xB7, 0x47, 0xDD, 0x95, 0x0D, 0xEC, 0x65, 0x4F, 0x2A,
+    0x51, 0x8A, 0xC6, 0xA9, 0x25, 0xCE, 0x3D, 0x2D, 0xC2, 0x06, 0xB9, 0x26, 0xE1, 0x68, 0xA4, 0x68,
+    0x23, 0xB9, 0x0B, 0x12, 0x7D, 0x79, 0xD3, 0x48, 0x0E, 0xA6, 0x2A, 0x2B, 0xA3, 0x23, 0x64, 0x10,
+    0xBA, 0xA3, 0x92, 0x83, 0xF0, 0x91, 0xB9, 0xF7, 0x12, 0x4A, 0x08, 0xFA, 0xE3, 0x10, 0xAE, 0x69,
+    0xDD, 0x93, 0x1C, 0xC6, 0xCC, 0x32, 0x78, 0x85, 0x15, 0x84, 0xBE, 0x0E, 0x9B, 0x21, 0xB0, 0xE7,
+    0x0B, 0xC0, 0x25, 0xCA, 0xE3, 0xA3, 0xC0, 0x6A, 0x96, 0xC4, 0x98, 0x51, 0x9B, 0xF6, 0x5B, 0x09,
+    0xAD, 0x67, 0x03, 0xA1, 0x4A, 0x51, 0x1B, 0xC0, 0x4B, 0x0B, 0x1C, 0x23, 0x0A, 0x2B, 0xBA, 0x9F,
+    0xAE, 0x74, 0xED, 0xFA, 0xA1, 0xC4, 0x30, 0xAB, 0x00, 0xED, 0x7A, 0x17, 0xCC, 0x15, 0xC5, 0xBF,
+    0xCC, 0x49, 0x41, 0x97, 0x3D, 0xBE, 0x2A, 0xE7, 0xED, 0x33, 0x02, 0x5B, 0x42, 0xF3, 0x18, 0x10,
+    0xD3, 0xD5, 0x27, 0x08, 0x4A, 0xFD, 0xFB, 0xA5, 0x19, 0x43, 0xE6, 0x38, 0x26, 0xAA, 0xC3, 0xE6,
+    0x7B, 0xF1, 0xD5, 0x02, 0x96, 0x27, 0x86, 0xAC, 0x38, 0x86, 0x4E, 0xD0, 0x8B, 0xD7, 0x2B, 0xCC,
+    0x97, 0x96, 0x24, 0x6D, 0x66, 0x7D, 0x2B, 0xC8, 0xF7, 0x49, 0xEA, 0x26, 0x74, 0xED, 0x29, 0x50,
+    0x03, 0x72, 0x2E, 0x3D, 0x52, 0x3D, 0x1C, 0x63, 0x38, 0x67, 0x47, 0x3B, 0x07, 0xF8, 0x5C, 0x54,
+    0x98, 0x0A, 0xEA, 0xB9, 0x0E, 0xB7, 0x7E, 0x78, 0xF6, 0xD5, 0x8E, 0xC1, 0x1C, 0x36, 0x2A, 0x17,
+    0x17, 0x0A, 0x3E, 0x90, 0xA4, 0x77, 0x27, 0x47, 0xBA, 0xC9, 0x03, 0x6A, 0x3C, 0x88, 0x17, 0xF5,
+    0xEC, 0x7A, 0x94, 0x3D, 0xD3, 0x06, 0x00, 0xEE, 0xB2, 0x31, 0x36, 0xB5, 0xCA, 0x53, 0x52, 0xC9,
+    0x4C, 0xA6, 0x54, 0x12, 0xC6, 0x58, 0xB7, 0x2F, 0xD1, 0xD1, 0xF5, 0x8A, 0x96, 0x3E, 0x44, 0x61,
+    0x4B, 0xA0, 0x9D, 0xF1, 0x54, 0x4A, 0xE7, 0x27, 0x8B, 0x02, 0x8B, 0x8E, 0xC3, 0xF2, 0xAF, 0x01,
+    0xDE, 0x38, 0xE9, 0x7A, 0x15, 0xAE, 0x0D, 0xA2, 0xF2, 0x43, 0x2C, 0x2D, 0x2E, 0xCD, 0xD9, 0x61,
+    0x72, 0xD2, 0x34, 0x7E, 0x07, 0x2C, 0x2A, 0x00, 0x2D, 0x56, 0x6A, 0x9C, 0xFF, 0x13, 0xBE, 0xF2,
+    0x60, 0xCD, 0xBA, 0xFA, 0xB5, 0xBA, 0x95, 0x7F, 0x3B, 0xE1, 0x6F, 0x86, 0x83, 0xAF, 0x52, 0xD3,
+    0x86, 0xBE, 0xDF, 0x71, 0xFD, 0x39, 0x1B, 0x49, 0x23, 0xE8, 0x82, 0x3D, 0x98, 0xE7, 0x6A, 0x7E,
+    0xE4, 0x76, 0xB0, 0x2C, 0xBD, 0xAE, 0x26, 0xC5, 0xB5, 0x6F, 0x9A, 0xA2, 0x7E, 0x95, 0x84, 0x2A,
+    0x74, 0x4A, 0xEC, 0x70, 0x4D, 0xC1, 0xA9, 0xEB, 0x30, 0xD9, 0xAE, 0x8D, 0x7A, 0xA3, 0xF7, 0x5F,
+    0x3F, 0xDE, 0xC2, 0xCD, 0x8B, 0xB0, 0xD6, 0xD0, 0xC5, 0x71, 0x7C, 0xC7, 0xF9, 0x97, 0x98, 0x51,
+    0x52, 0x7E, 0x0D, 0x50, 0xB4, 0xC9, 0x29, 0x79, 0x65, 0xC8, 0x43, 0x7B, 0x46, 0x9B, 0x57, 0xF8,
+    0x74, 0xF7, 0x8B, 0x58, 0xE8, 0xB3, 0x22, 0x43, 0xEB, 0x06, 0xCD, 0xED, 0x0C, 0xC9, 0x86, 0x2B,
+    0x5E, 0xF9, 0xBA, 0xF5, 0xA3, 0x01, 0x46, 0xE5, 0xE7, 0x99, 0x17, 0x83, 0xA2, 0x4F, 0x2C, 0xEA,
+    0x9B, 0x12, 0xDB, 0xC9, 0x0B, 0x51, 0x79, 0x65, 0x6F, 0x3A, 0xC6, 0x1D, 0x35, 0x3B, 0xCB, 0xC2,
+    0xA1, 0x27, 0xA0, 0xE0, 0xC8, 0xCB, 0xBF, 0xA0, 0x7E, 0x9D, 0x7B, 0x8A, 0x6F, 0x38, 0x1D, 0x6A,
+    0xDA, 0x14, 0xF6, 0x00, 0xA4, 0xEA, 0x18, 0x71, 0x48, 0x3D, 0x05, 0x03, 0x42, 0x42, 0xE7, 0x50,
+    0x3C, 0x3F, 0x21, 0x2F, 0x7C, 0x18, 0x65, 0x3F, 0xDE, 0xDC, 0x65, 0x9D, 0xB2, 0x8E, 0x92, 0xA1,
+    0xC7, 0x0B, 0xAD, 0x3C, 0x22, 0x3C, 0x07, 0x62, 0x1D, 0x3C, 0x8F, 0x57, 0xF0, 0x50, 0x21, 0x5C,
+    0xC2, 0x6A, 0xA9, 0x72, 0x3B, 0x9F, 0xB0, 0x51, 0xEF, 0x1F, 0x5C, 0x83, 0x27, 0x1F, 0xAA, 0x81,
+    0x50, 0xDC, 0xB2, 0x80, 0x94, 0xE2, 0x69, 0x66, 0x4B, 0x7E, 0xBD, 0xCA, 0x8B, 0x5F, 0xD0, 0xE8,
+    0x69, 0x63, 0x6D, 0xE4, 0xDA, 0xF7, 0x83, 0x45, 0xCB, 0xFC, 0x33, 0xDB, 0x43, 0x99, 0x7E, 0x41,
+    0x86, 0x3F, 0x95, 0xDC, 0xB2, 0x58, 0x8F, 0x8E, 0x7F, 0xAA, 0xC8, 0x37, 0x80, 0x08, 0x1C, 0xAE,
+    0x22, 0x03, 0xF1, 0x98, 0x73, 0x47, 0x75, 0x38, 0x5B, 0x1F, 0x99, 0x70, 0xE4, 0x48, 0x15, 0x48,
+    0xCE, 0x24, 0x15, 0xE4, 0x0B, 0xCA, 0x01, 0x8E, 0x8B, 0xE7, 0x9B, 0x4E, 0x5B, 0x56, 0x11, 0x14,
+    0x31, 0x78, 0x8F, 0xA9, 0x9A, 0xDA, 0x41, 0x52, 0x21, 0xBB, 0x34, 0x10, 0x74, 0x55, 0x87, 0x4B,
+    0x7A, 0x65, 0xBA, 0x53, 0xFB, 0x06, 0xB3, 0x82, 0x3F, 0xEC, 0x43, 0x84, 0xF4, 0xC9, 0xAF, 0x11,
+    0x7F, 0x25, 0x7A, 0x7A, 0x2F, 0x33, 0x93, 0x10, 0x9B, 0x7D, 0xA0, 0xAB, 0x35, 0x54, 0x61, 0x85,
+    0x3A, 0x08, 0x6B, 0x38, 0x45, 0x35, 0xCB, 0xAC, 0x71, 0x07, 0x43, 0x5C, 0x38, 0x79, 0x28, 0xFB,
+    0x9E, 0x30, 0xDC, 0x69, 0xBE, 0x28, 0x25, 0x52, 0x1A, 0xCF, 0x0C, 0x67, 0x9E, 0x20, 0xF9, 0x18,
+    0xE2, 0x48, 0x4B, 0xD3, 0x2D, 0x78, 0xF5, 0xFC, 0xB0, 0xCF, 0x03, 0xC8, 0x9B, 0x4D, 0x82, 0xF5,
+    0xEE, 0x4A, 0x87, 0x45, 0xEC, 0x49, 0x32, 0x59, 0x15, 0x32, 0xEC, 0x63, 0x0B, 0x44, 0x9F, 0x03,
+    0xAD, 0x0C, 0x4B, 0xC4, 0xCE, 0x74, 0xF0, 0xBA, 0x8D, 0xE6, 0x4A, 0xBC, 0x69, 0xB7, 0xF5, 0xAE,
+    0xCB, 0x54, 0x43, 0xE8, 0x5A, 0x61, 0xF9, 0x4D, 0x04, 0xAA, 0xCE, 0x99, 0xF4, 0x67, 0x60, 0x63,
+    0x70, 0x3A, 0x98, 0x3C, 0x42, 0x48, 0x38, 0x9B, 0x90, 0xB4, 0x2F, 0xD7, 0xE1, 0xCF, 0x15, 0x63,
+    0x1F, 0x9C, 0xDC, 0x3C, 0x1A, 0xE7, 0x43, 0x2A, 0x54, 0xE7, 0x95, 0x16, 0x12, 0xE9, 0x93, 0xAE,
+    0x89, 0x21, 0x0B, 0xAD, 0xFB, 0x05, 0x50, 0x5A, 0x70, 0x02, 0xD0, 0xCC, 0xDA, 0x66, 0x25, 0x68,
+    0x11, 0x1F, 0x42, 0x07, 0x10, 0x56, 0x47, 0xCC, 0xA2, 0x3A, 0xAA, 0x44, 0x5B, 0x10, 0xA0, 0x0F,
+    0x25, 0x44, 0x70, 0x3E, 0x72, 0x3A, 0x58, 0x7C, 0x82, 0x03, 0x3B, 0x8B, 0xFF, 0x5E, 0x6C, 0x06,
+    0x5A, 0xFC, 0x23, 0x1B, 0x78, 0xD1, 0xCE, 0xC6, 0xC0, 0x3A, 0xAA, 0x07, 0x0F, 0xC0, 0xAC, 0xB7,
+    0x88, 0x31, 0x31, 0x9A, 0x67, 0x3C, 0xDA, 0x7F, 0xE6, 0x48, 0xAB, 0xE8, 0x30, 0xC0, 0xB4, 0xBF,
+    0x0B, 0x14, 0x97, 0x81, 0x8F, 0x5E, 0x65, 0x5D, 0xC9, 0x80, 0xDC, 0x85, 0x76, 0x84, 0x90, 0x7B,
+    0xC0, 0x2E, 0x59, 0x03, 0xB2, 0x19, 0x2C, 0x5B, 0x98, 0xA7, 0xA9, 0xDC, 0xE9, 0x4A, 0x02, 0xE3,
+    0x80, 0x0D, 0x08, 0x57, 0x03, 0x1D, 0xBB, 0xB0, 0x88, 0x32, 0xCA, 0xF0, 0x4C, 0xD3, 0xF9, 0xBD,
+    0x25, 0x56, 0x86, 0xBC, 0x99, 0x92, 0xFC, 0xAE, 0x66, 0xF2, 0x9B, 0x43, 0xF9, 0xCF, 0xEE, 0xD4,
+    0xEF, 0xF9, 0xFE, 0xB6, 0x26, 0x5D, 0x47, 0x07, 0x94, 0x1F, 0xE9, 0xD9, 0xA0, 0x78, 0xF9, 0x57,
+    0x26, 0x6E, 0xF9, 0xEB, 0x02, 0x01, 0x9E, 0xB0, 0x75, 0x43, 0x0C, 0x6D, 0x82, 0x54, 0xFC, 0xE2,
+    0xFA, 0x1B, 0x3C, 0x31, 0x64, 0xD5, 0x66, 0x22, 0x45, 0x1F, 0x35, 0x74, 0x8A, 0x70, 0x9A, 0xD8,
+    0xEC, 0xE8, 0x44, 0x0C, 0x9D, 0x10, 0xFD, 0x5A, 0xB3, 0x53, 0x21, 0x6A, 0x64, 0xD5, 0x15, 0x6A,
+    0x96, 0x48, 0x1A, 0xA3, 0x4E, 0x97, 0xB8, 0xCF, 0xB2, 0xA3, 0x14, 0x23, 0x83, 0xC1, 0x1A, 0x07,
+    0x6B, 0x89, 0x64, 0x16, 0x02, 0x9B, 0x04, 0x17, 0xA4, 0xE3, 0xF3, 0xDB, 0x1C, 0x8F, 0x9E, 0x0D,
+    0x0A, 0x6D, 0xB4, 0xA2, 0xA7, 0x76, 0x49, 0xBB, 0xBA, 0x79, 0x2D, 0x6F, 0xCE, 0xD9, 0x5C, 0x24,
+    0xC7, 0xDD, 0xF1, 0x22, 0xCC, 0x7D, 0xDF, 0xED, 0x97, 0x93, 0x60, 0xDD, 0x0B, 0x99, 0xBD, 0x58,
+    0x0B, 0x06, 0x77, 0x91, 0x82, 0x1F, 0xE2, 0xFE, 0xCF, 0x14, 0xF8, 0x51, 0x12, 0x2B, 0xBE, 0xFF,
+    0x68, 0xE7, 0xD9, 0xA5, 0xA4, 0x2E, 0xD5, 0xAA, 0xE2, 0xFA, 0x80, 0x58, 0xAC, 0xD1, 0x6C, 0xDD,
+    0xB6, 0x40, 0xB6, 0xCE, 0x39, 0x6B, 0x95, 0x5C, 0xFF, 0x46, 0x7D, 0x2F, 0x03, 0xCA, 0xE1, 0x92,
+    0x5E, 0x2D, 0xD5, 0x58, 0x56, 0x82, 0xE1, 0x7D, 0x13, 0x21, 0xB0, 0x76, 0x1A, 0x92, 0xDE, 0x77,
+    0xB4, 0x05, 0xD0, 0xBC, 0xC9, 0xE3, 0xCE, 0xD2, 0xB9, 0x2B, 0x70, 0xBD, 0xF4, 0x79, 0x3C, 0xFA,
+    0xF3, 0x91, 0x51, 0xAA, 0xF4, 0xF0, 0x14, 0x0C, 0x4E, 0xD1, 0x66, 0x60, 0x90, 0x16, 0x5B, 0xEF,
+    0x34, 0xE8, 0xB1, 0x5A, 0x2B, 0x8E, 0x2C, 0x11, 0x39, 0x2D, 0x37, 0x43, 0x4F, 0xA3, 0x9C, 0x0B,
+    0x19, 0x19, 0x3D, 0x30, 0xCA, 0x51, 0x07, 0x67, 0x5A, 0xD2, 0xE0, 0x1D, 0x6C, 0xDD, 0xB2, 0xF8,
+    0x9E, 0x32, 0x07, 0x7A, 0x33, 0x26, 0x2F, 0x3A, 0x71, 0x25, 0xB0, 0x26, 0xDF, 0xAB, 0xEE, 0xCC,
+    0xAD, 0xA9, 0x46, 0x40, 0x65, 0xD6, 0x51, 0xD2, 0x12, 0x5D, 0x27, 0x4F, 0xBB, 0x95, 0x51, 0x87,
+    0x55, 0xB2, 0xF7, 0xEB, 0x89, 0x65, 0xDF, 0xCA, 0xDF, 0xA2, 0x55, 0xAD, 0xA0, 0x19, 0x6A, 0xE5,
+    0x88, 0x0A, 0xCE, 0x24, 0xA2, 0xA7, 0xEB, 0x0C, 0x29, 0xDC, 0x24, 0x09, 0x93, 0x99, 0x50, 0x2C,
+    0xB7, 0x0F, 0x21, 0xB7, 0x71, 0xF6, 0x8B, 0x3F, 0x69, 0x0C, 0x32, 0xA1, 0x18, 0x3A, 0x81, 0xEE,
+    0x42, 0x67, 0x82, 0x5E, 0xE1, 0x7B, 0x1C, 0x6F, 0x57, 0xA9, 0x60, 0x38, 0x53, 0x42, 0x04, 0x65,
+    0x21, 0x31, 0x8B, 0xB8, 0xEA, 0x9F, 0x0D, 0xA6, 0xAE, 0xD8, 0x4D, 0x9B, 0xCB, 0x36, 0x53, 0xC4,
+    0x60, 0x2F, 0x84, 0x0E, 0x64, 0xBF, 0xCE, 0x08, 0x89, 0xD0, 0x2B, 0xB9, 0xE3, 0x87, 0xEC, 0x10,
+    0xA8, 0x61, 0x70, 0xF7, 0xE5, 0x23, 0xAA, 0x2E, 0x7A, 0x70, 0x64, 0x5D, 0x04, 0xD6, 0xC6, 0xA2,
+    0xA9, 0x3B, 0x79, 0xD6, 0x9A, 0x9A, 0x15, 0x39, 0xDF, 0xF4, 0x4A, 0x2A, 0xE0, 0x2C, 0x67, 0xC7,
+    0x01, 0xF3, 0x02, 0x6B, 0xE4, 0xF4, 0xE0, 0x77, 0x17, 0xA2, 0xEC, 0x93, 0xD3, 0x61, 0x49, 0xB4,
+    0xAC, 0x52, 0x3A, 0x84, 0xFA, 0x3E, 0x2C, 0xD8, 0xAB, 0xD9, 0xE6, 0xDD, 0x59, 0x1C, 0x1E, 0x41,
+    0x97, 0xEF, 0x29, 0x13, 0xF2, 0x2D, 0x1D, 0x21, 0x5F, 0x6F, 0x16, 0xF2, 0x7C, 0x72, 0x69, 0xB6,
+    0x93, 0xC9, 0xE5, 0x7A, 0x1B, 0x4E, 0x10, 0x78, 0x6C, 0x79, 0x4B, 0x23, 0x73, 0x02, 0x9B, 0xF2,
+    0xE0, 0xC3, 0xDB, 0x58, 0xF3, 0x23, 0x37, 0xC9, 0x06, 0x20, 0xF1, 0x08, 0x34, 0x47, 0x91, 0xB0,
+    0x8E, 0xF3, 0xFF, 0xFE, 0x83, 0x4A, 0x97, 0xA4, 0x55, 0x22, 0x55, 0xF3, 0x9F, 0x41, 0x7F, 0xE1,
+    0xF5, 0xE3, 0x42, 0xAE, 0x54, 0xF0, 0x83, 0x68, 0x08, 0x09, 0x2C, 0x95, 0x6C, 0x23, 0x11, 0x7E,
+    0x9F, 0x7D, 0x53, 0x78, 0xA1, 0x6B, 0x02, 0x14, 0x8C, 0xDD, 0xF2, 0x34, 0x35, 0x7D, 0xF7, 0xCB,
+    0xEF, 0x68, 0x04, 0x07, 0x2C, 0xC2, 0x36, 0x1E, 0x15, 0x17, 0x15, 0x6B, 0x74, 0x56, 0xC4, 0x12,
+    0xB7, 0xBF, 0xC8, 0xDB, 0x66, 0xF2, 0x88, 0xFA, 0xEB, 0xD3, 0xA3, 0x99, 0xBE, 0xD3, 0x21, 0x35,
+    0x05, 0xED, 0x73, 0x9A, 0xA0, 0x14, 0x3C, 0x24, 0x0A, 0xDF, 0x97, 0x0F, 0x1B, 0xA2, 0x9A, 0xB0,
+    0x0F, 0x01, 0xAD, 0x1D, 0x87, 0xED, 0x21, 0x8F, 0x2F, 0xA8, 0x4D, 0xFD, 0x02, 0x5E, 0x4B, 0xEA,
+    0xAD, 0x44, 0x2D, 0x58, 0xB4, 0xC8, 0x8F, 0x40, 0x38, 0x9D, 0x93, 0x3D, 0x32, 0x28, 0x6C, 0x50,
+    0xE2, 0x10, 0xC1, 0x7C, 0xDD, 0x10, 0x08, 0x22, 0xB1, 0x1C, 0xB2, 0x2C, 0xA2, 0x33, 0xB5, 0x91,
+    0x55, 0x3C, 0xDA, 0xAA, 0xF2, 0xDA, 0xBF, 0x97, 0xA8, 0xB0, 0x81, 0x21, 0xD8, 0x5E, 0xBE, 0xCE,
+    0x21, 0x55, 0xD7, 0xBE, 0xC0, 0xAF, 0xDE, 0xF3, 0xB7, 0x5E, 0xDB, 0x98, 0x40, 0x71, 0x8D, 0xB0,
+    0xDD, 0xAB, 0x7D, 0xEB, 0x68, 0x9C, 0xAD, 0x24, 0xA6, 0xE1, 0xB0, 0x90, 0x79, 0xAC, 0xEB, 0xD4,
+    0x9D, 0x69, 0x09, 0xE8, 0xE1, 0x7E, 0xFD, 0xE5, 0xAD, 0x59, 0xD2, 0x3A, 0xBD, 0x83, 0x96, 0xC8,
+    0x04, 0xF4, 0x8E, 0x55, 0x56, 0xBC, 0x95, 0xC9, 0x0D, 0x9E, 0xC6, 0x6F, 0xA3, 0x4F, 0x68, 0xD2,
+    0x78, 0x16, 0x57, 0x5D, 0x09, 0xE0, 0x61, 0xC5, 0xAD, 0x3F, 0xD1, 0xE0, 0xFA, 0xE8, 0x1D, 0x77,
+    0x70, 0x42, 0xF7, 0x53, 0x47, 0xAA, 0xBB, 0x7D, 0xF3, 0xBA, 0xC9, 0x26, 0xB2, 0xC9, 0xC3, 0x0A,
+    0x17, 0x4C, 0x2A, 0x1B, 0xB6, 0x12, 0x32, 0x54, 0x9A, 0xB1, 0xEA, 0xC7, 0xB5, 0x28, 0x5F, 0x59,
+    0xD9, 0x19, 0x4E, 0xFF, 0x0D, 0xB1, 0x67, 0x40, 0xD3, 0x76, 0xA7, 0x0A, 0x94, 0xD9, 0x75, 0x71,
+    0xCE, 0x6E, 0xE5, 0xFB, 0xD8, 0x9F, 0xB6, 0x5F, 0x91, 0x74, 0x68, 0x9F, 0x7C, 0xA3, 0x99, 0x3A,
+    0xD9, 0x0C, 0x83, 0x64, 0xFB, 0x7E, 0xB2, 0x9B, 0x1A, 0x5F, 0xDA, 0x85, 0xB5, 0xB9, 0x4C, 0xB1,
+    0x72, 0xA2, 0x1B, 0x92, 0x20, 0x7A, 0x77, 0xD3, 0x41, 0x8E, 0x1B, 0xF1, 0xC3, 0x5A, 0x6B, 0xF0,
+    0x66, 0x16, 0x94, 0x1F, 0x57, 0x5A, 0xC1, 0x16, 0xB3, 0xF9, 0xE9, 0xFA, 0x0C, 0x28, 0xC5, 0x32,
+    0x6F, 0x04, 0xF1, 0xAF, 0x66, 0x9F, 0xF8, 0x72, 0xD6, 0x91, 0x5F, 0x4C, 0xE9, 0x9A, 0xA8, 0x38,
+    0x47, 0x6C, 0x8C, 0x00, 0xB4, 0x47, 0x20, 0x41, 0x68, 0x12, 0x54, 0x51, 0x1A, 0x56, 0x66, 0x56,
+    0x4B, 0xC3, 0x59, 0xC7, 0x9C, 0x49, 0x74, 0x06, 0xAB, 0x45, 0x1D, 0x7B, 0x01, 0xA0, 0xF5, 0x34,
+    0x9E, 0xE3, 0xAD, 0x5B, 0x3A, 0x12, 0x33, 0x3E, 0x03, 0xB7, 0xA6, 0x92, 0x62, 0x11, 0x75, 0x5D,
+    0xE4, 0xB9, 0x78, 0x43, 0xCC, 0x4D, 0xF7, 0x03, 0x0C, 0x5A, 0xED, 0x74, 0x55, 0x96, 0x91, 0x29,
+    0xFA, 0xBA, 0xC6, 0x38, 0xCB, 0x22, 0xF2, 0x90, 0x6B, 0x7B, 0x3D, 0xFF, 0xEF, 0x94, 0x29, 0x59,
+    0x33, 0x8B, 0x60, 0x66, 0xE7, 0x32, 0xFD, 0x6B, 0xE1, 0x19, 0x68, 0x2F, 0xD3, 0x71, 0xA0, 0x70,
+    0xE9, 0xAF, 0xE6, 0x25, 0x4E, 0xE8, 0x46, 0x08, 0x1C, 0xF1, 0xE3, 0x60, 0x75, 0x63, 0xF2, 0xAC,
+    0xAE, 0x25, 0x45, 0x6E, 0xB7, 0x43, 0x71, 0xFD, 0xF9, 0x0B, 0x34, 0x2F, 0xDA, 0xBD, 0x6B, 0x27,
+    0x68, 0x0D, 0x27, 0x8D, 0xDE, 0xC7, 0x7C, 0x8D, 0x24, 0xC4, 0xCB, 0x9B, 0xED, 0x80, 0x01, 0x14,
+    0x02, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+    0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72,
+    0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x0D, 0x80, 0x03,
+};
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c b/core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c
new file mode 100644
index 0000000..18cde34
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c
@@ -0,0 +1,2099 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSymbolFontData [16729] = {0x1,
+                                                     0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xf,
+                                                     0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x79, 0x6d,
+                                                     0x62, 0x6f, 0x6c, 0x4f, 0x54, 0x46, 0x0, 0x1,
+                                                     0x1, 0x1, 0x26, 0xf8, 0x10, 0x0, 0xf8, 0xad,
+                                                     0x1, 0xf8, 0xae, 0x2, 0xf8, 0xae, 0x3, 0xf8,
+                                                     0x18, 0x4, 0xfb, 0x48, 0xfb, 0xba, 0xfa, 0xd6,
+                                                     0xfa, 0x86, 0x5, 0x1c, 0x6, 0x3d, 0xf, 0x1c,
+                                                     0x6, 0x89, 0x11, 0xab, 0x1c, 0x3e, 0xa2, 0x12,
+                                                     0x0, 0x94, 0x2, 0x0, 0x1, 0x0, 0x6, 0x0,
+                                                     0xa, 0x0, 0xf, 0x0, 0x16, 0x0, 0x1a, 0x0,
+                                                     0x1d, 0x0, 0x22, 0x0, 0x26, 0x0, 0x2b, 0x0,
+                                                     0x31, 0x0, 0x33, 0x0, 0x35, 0x0, 0x37, 0x0,
+                                                     0x3e, 0x0, 0x40, 0x0, 0x43, 0x0, 0x48, 0x0,
+                                                     0x4b, 0x0, 0x52, 0x0, 0x55, 0x0, 0x58, 0x0,
+                                                     0x5b, 0x0, 0x60, 0x0, 0x64, 0x0, 0x69, 0x0,
+                                                     0x6e, 0x0, 0x75, 0x0, 0x79, 0x0, 0x7c, 0x0,
+                                                     0x81, 0x0, 0x85, 0x0, 0x8a, 0x0, 0x90, 0x0,
+                                                     0x92, 0x0, 0x94, 0x0, 0x9b, 0x0, 0x9d, 0x0,
+                                                     0xa0, 0x0, 0xa6, 0x0, 0xab, 0x0, 0xae, 0x0,
+                                                     0xb5, 0x0, 0xb8, 0x0, 0xbb, 0x0, 0xbe, 0x0,
+                                                     0xc3, 0x0, 0xc9, 0x0, 0xd1, 0x0, 0xd5, 0x0,
+                                                     0xdb, 0x0, 0xe1, 0x0, 0xe7, 0x0, 0xeb, 0x0,
+                                                     0xf3, 0x0, 0xfe, 0x1, 0x6, 0x1, 0xb, 0x1,
+                                                     0x10, 0x1, 0x19, 0x1, 0x20, 0x1, 0x2a, 0x1,
+                                                     0x33, 0x1, 0x3c, 0x1, 0x4a, 0x1, 0x56, 0x1,
+                                                     0x60, 0x1, 0x6d, 0x1, 0x79, 0x1, 0x85, 0x1,
+                                                     0x8e, 0x1, 0x99, 0x1, 0xa4, 0x1, 0xac, 0x1,
+                                                     0xb1, 0x1, 0xb9, 0x1, 0xc0, 0x1, 0xca, 0x1,
+                                                     0xd2, 0x1, 0xd9, 0x1, 0xe2, 0x1, 0xee, 0x1,
+                                                     0xf5, 0x2, 0x1, 0x2, 0x9, 0x2, 0xe, 0x2,
+                                                     0x18, 0x2, 0x21, 0x2, 0x2d, 0x2, 0x32, 0x2,
+                                                     0x3a, 0x2, 0x43, 0x2, 0x4a, 0x2, 0x53, 0x2,
+                                                     0x5e, 0x2, 0x66, 0x2, 0x71, 0x2, 0x7a, 0x2,
+                                                     0x86, 0x2, 0x92, 0x2, 0xa0, 0x2, 0xa9, 0x2,
+                                                     0xb5, 0x2, 0xc3, 0x2, 0xcd, 0x2, 0xdb, 0x2,
+                                                     0xe8, 0x2, 0xef, 0x2, 0xf9, 0x3, 0x3, 0x3,
+                                                     0xc, 0x3, 0x16, 0x3, 0x1d, 0x3, 0x22, 0x3,
+                                                     0x26, 0x3, 0x2b, 0x3, 0x32, 0x3, 0x40, 0x3,
+                                                     0x4d, 0x3, 0x5b, 0x3, 0x64, 0x3, 0x6f, 0x3,
+                                                     0x7b, 0x3, 0x87, 0x3, 0x94, 0x3, 0xa1, 0x3,
+                                                     0xac, 0x3, 0xb7, 0x3, 0xc2, 0x3, 0xcf, 0x3,
+                                                     0xdc, 0x3, 0xe9, 0x3, 0xf4, 0x4, 0x0, 0x4,
+                                                     0xb, 0x4, 0x12, 0x4, 0x1c, 0x4, 0x28, 0x4,
+                                                     0x34, 0x4, 0x40, 0x4, 0x4e, 0x4, 0x5c, 0x4,
+                                                     0x6a, 0x4, 0x76, 0x4, 0x83, 0x4, 0x8f, 0x4,
+                                                     0x94, 0x4, 0xbe, 0x4, 0xce, 0x41, 0x6c, 0x70,
+                                                     0x68, 0x61, 0x42, 0x65, 0x74, 0x61, 0x47, 0x61,
+                                                     0x6d, 0x6d, 0x61, 0x45, 0x70, 0x73, 0x69, 0x6c,
+                                                     0x6f, 0x6e, 0x5a, 0x65, 0x74, 0x61, 0x45, 0x74,
+                                                     0x61, 0x54, 0x68, 0x65, 0x74, 0x61, 0x49, 0x6f,
+                                                     0x74, 0x61, 0x4b, 0x61, 0x70, 0x70, 0x61, 0x4c,
+                                                     0x61, 0x6d, 0x62, 0x64, 0x61, 0x4d, 0x75, 0x4e,
+                                                     0x75, 0x58, 0x69, 0x4f, 0x6d, 0x69, 0x63, 0x72,
+                                                     0x6f, 0x6e, 0x50, 0x69, 0x52, 0x68, 0x6f, 0x53,
+                                                     0x69, 0x67, 0x6d, 0x61, 0x54, 0x61, 0x75, 0x55,
+                                                     0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x50, 0x68,
+                                                     0x69, 0x43, 0x68, 0x69, 0x50, 0x73, 0x69, 0x61,
+                                                     0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x61,
+                                                     0x67, 0x61, 0x6d, 0x6d, 0x61, 0x64, 0x65, 0x6c,
+                                                     0x74, 0x61, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f,
+                                                     0x6e, 0x7a, 0x65, 0x74, 0x61, 0x65, 0x74, 0x61,
+                                                     0x74, 0x68, 0x65, 0x74, 0x61, 0x69, 0x6f, 0x74,
+                                                     0x61, 0x6b, 0x61, 0x70, 0x70, 0x61, 0x6c, 0x61,
+                                                     0x6d, 0x62, 0x64, 0x61, 0x6e, 0x75, 0x78, 0x69,
+                                                     0x6f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x70,
+                                                     0x69, 0x72, 0x68, 0x6f, 0x73, 0x69, 0x67, 0x6d,
+                                                     0x61, 0x31, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x74,
+                                                     0x61, 0x75, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f,
+                                                     0x6e, 0x70, 0x68, 0x69, 0x63, 0x68, 0x69, 0x70,
+                                                     0x73, 0x69, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x74,
+                                                     0x68, 0x65, 0x74, 0x61, 0x31, 0x55, 0x70, 0x73,
+                                                     0x69, 0x6c, 0x6f, 0x6e, 0x31, 0x70, 0x68, 0x69,
+                                                     0x31, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x31, 0x6d,
+                                                     0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x65, 0x63,
+                                                     0x6f, 0x6e, 0x64, 0x45, 0x75, 0x72, 0x6f, 0x49,
+                                                     0x66, 0x72, 0x61, 0x6b, 0x74, 0x75, 0x72, 0x77,
+                                                     0x65, 0x69, 0x65, 0x72, 0x73, 0x74, 0x72, 0x61,
+                                                     0x73, 0x73, 0x52, 0x66, 0x72, 0x61, 0x6b, 0x74,
+                                                     0x75, 0x72, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x61,
+                                                     0x6c, 0x65, 0x70, 0x68, 0x61, 0x72, 0x72, 0x6f,
+                                                     0x77, 0x6c, 0x65, 0x66, 0x74, 0x61, 0x72, 0x72,
+                                                     0x6f, 0x77, 0x75, 0x70, 0x61, 0x72, 0x72, 0x6f,
+                                                     0x77, 0x72, 0x69, 0x67, 0x68, 0x74, 0x61, 0x72,
+                                                     0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, 0x61,
+                                                     0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68,
+                                                     0x63, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65,
+                                                     0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x61, 0x72,
+                                                     0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x6c, 0x65,
+                                                     0x66, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64,
+                                                     0x62, 0x6c, 0x75, 0x70, 0x61, 0x72, 0x72, 0x6f,
+                                                     0x77, 0x64, 0x62, 0x6c, 0x72, 0x69, 0x67, 0x68,
+                                                     0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62,
+                                                     0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72,
+                                                     0x6f, 0x77, 0x64, 0x62, 0x6c, 0x62, 0x6f, 0x74,
+                                                     0x68, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
+                                                     0x61, 0x6c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61,
+                                                     0x6c, 0x64, 0x69, 0x66, 0x66, 0x65, 0x78, 0x69,
+                                                     0x73, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c,
+                                                     0x65, 0x6d, 0x70, 0x74, 0x79, 0x73, 0x65, 0x74,
+                                                     0x44, 0x65, 0x6c, 0x74, 0x61, 0x67, 0x72, 0x61,
+                                                     0x64, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65,
+                                                     0x6d, 0x65, 0x6e, 0x74, 0x6e, 0x6f, 0x74, 0x65,
+                                                     0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x75,
+                                                     0x63, 0x68, 0x74, 0x68, 0x61, 0x74, 0x70, 0x72,
+                                                     0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x75, 0x6d,
+                                                     0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x73,
+                                                     0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x6d, 0x61,
+                                                     0x74, 0x68, 0x72, 0x61, 0x64, 0x69, 0x63, 0x61,
+                                                     0x6c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74,
+                                                     0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x66,
+                                                     0x69, 0x6e, 0x69, 0x74, 0x79, 0x61, 0x6e, 0x67,
+                                                     0x6c, 0x65, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61,
+                                                     0x6c, 0x61, 0x6e, 0x64, 0x6c, 0x6f, 0x67, 0x69,
+                                                     0x63, 0x61, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x74,
+                                                     0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f,
+                                                     0x6e, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x69, 0x6e,
+                                                     0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x74, 0x68,
+                                                     0x65, 0x72, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x73,
+                                                     0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x63, 0x6f,
+                                                     0x6e, 0x67, 0x72, 0x75, 0x65, 0x6e, 0x74, 0x61,
+                                                     0x70, 0x70, 0x72, 0x6f, 0x78, 0x65, 0x71, 0x75,
+                                                     0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x65, 0x71, 0x75,
+                                                     0x61, 0x6c, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61,
+                                                     0x6c, 0x65, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x73,
+                                                     0x73, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x67, 0x72,
+                                                     0x65, 0x61, 0x74, 0x65, 0x72, 0x65, 0x71, 0x75,
+                                                     0x61, 0x6c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+                                                     0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x70, 0x72,
+                                                     0x6f, 0x70, 0x65, 0x72, 0x73, 0x75, 0x70, 0x65,
+                                                     0x72, 0x73, 0x65, 0x74, 0x6e, 0x6f, 0x74, 0x73,
+                                                     0x75, 0x62, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66,
+                                                     0x6c, 0x65, 0x78, 0x73, 0x75, 0x62, 0x73, 0x65,
+                                                     0x74, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x78, 0x73,
+                                                     0x75, 0x70, 0x65, 0x72, 0x73, 0x65, 0x74, 0x63,
+                                                     0x69, 0x72, 0x63, 0x6c, 0x65, 0x70, 0x6c, 0x75,
+                                                     0x73, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x6d,
+                                                     0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x70,
+                                                     0x65, 0x72, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x63,
+                                                     0x75, 0x6c, 0x61, 0x72, 0x64, 0x6f, 0x74, 0x6d,
+                                                     0x61, 0x74, 0x68, 0x69, 0x6e, 0x74, 0x65, 0x67,
+                                                     0x72, 0x61, 0x6c, 0x74, 0x70, 0x69, 0x6e, 0x74,
+                                                     0x65, 0x67, 0x72, 0x61, 0x6c, 0x62, 0x74, 0x61,
+                                                     0x6e, 0x67, 0x6c, 0x65, 0x6c, 0x65, 0x66, 0x74,
+                                                     0x61, 0x6e, 0x67, 0x6c, 0x65, 0x72, 0x69, 0x67,
+                                                     0x68, 0x74, 0x6c, 0x6f, 0x7a, 0x65, 0x6e, 0x67,
+                                                     0x65, 0x73, 0x70, 0x61, 0x64, 0x65, 0x63, 0x6c,
+                                                     0x75, 0x62, 0x68, 0x65, 0x61, 0x72, 0x74, 0x64,
+                                                     0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x63, 0x6f,
+                                                     0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73,
+                                                     0x65, 0x72, 0x69, 0x66, 0x72, 0x65, 0x67, 0x69,
+                                                     0x73, 0x74, 0x65, 0x72, 0x73, 0x65, 0x72, 0x69,
+                                                     0x66, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61,
+                                                     0x72, 0x6b, 0x73, 0x65, 0x72, 0x69, 0x66, 0x72,
+                                                     0x61, 0x64, 0x69, 0x63, 0x61, 0x6c, 0x65, 0x78,
+                                                     0x61, 0x72, 0x72, 0x6f, 0x77, 0x76, 0x65, 0x72,
+                                                     0x74, 0x65, 0x78, 0x61, 0x72, 0x72, 0x6f, 0x77,
+                                                     0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x78, 0x72,
+                                                     0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73,
+                                                     0x61, 0x6e, 0x73, 0x63, 0x6f, 0x70, 0x79, 0x72,
+                                                     0x69, 0x67, 0x68, 0x74, 0x73, 0x61, 0x6e, 0x73,
+                                                     0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72,
+                                                     0x6b, 0x73, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72,
+                                                     0x65, 0x6e, 0x6c, 0x65, 0x66, 0x74, 0x74, 0x70,
+                                                     0x70, 0x61, 0x72, 0x65, 0x6e, 0x6c, 0x65, 0x66,
+                                                     0x74, 0x65, 0x78, 0x70, 0x61, 0x72, 0x65, 0x6e,
+                                                     0x6c, 0x65, 0x66, 0x74, 0x62, 0x74, 0x62, 0x72,
+                                                     0x61, 0x63, 0x6b, 0x65, 0x74, 0x6c, 0x65, 0x66,
+                                                     0x74, 0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x6b,
+                                                     0x65, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x65, 0x78,
+                                                     0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x6c,
+                                                     0x65, 0x66, 0x74, 0x62, 0x74, 0x62, 0x72, 0x61,
+                                                     0x63, 0x65, 0x6c, 0x65, 0x66, 0x74, 0x74, 0x70,
+                                                     0x62, 0x72, 0x61, 0x63, 0x65, 0x6c, 0x65, 0x66,
+                                                     0x74, 0x6d, 0x69, 0x64, 0x62, 0x72, 0x61, 0x63,
+                                                     0x65, 0x6c, 0x65, 0x66, 0x74, 0x62, 0x74, 0x62,
+                                                     0x72, 0x61, 0x63, 0x65, 0x65, 0x78, 0x69, 0x6e,
+                                                     0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x65, 0x78,
+                                                     0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67,
+                                                     0x68, 0x74, 0x74, 0x70, 0x70, 0x61, 0x72, 0x65,
+                                                     0x6e, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78,
+                                                     0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67,
+                                                     0x68, 0x74, 0x62, 0x74, 0x62, 0x72, 0x61, 0x63,
+                                                     0x6b, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74,
+                                                     0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65,
+                                                     0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78,
+                                                     0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x72,
+                                                     0x69, 0x67, 0x68, 0x74, 0x62, 0x74, 0x62, 0x72,
+                                                     0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74,
+                                                     0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72,
+                                                     0x69, 0x67, 0x68, 0x74, 0x6d, 0x69, 0x64, 0x62,
+                                                     0x72, 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68,
+                                                     0x74, 0x62, 0x74, 0x61, 0x70, 0x70, 0x6c, 0x65,
+                                                     0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                     0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                     0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                     0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                     0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+                                                     0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20,
+                                                     0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x4f,
+                                                     0x54, 0x46, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1,
+                                                     0x0, 0x4, 0x0, 0x0, 0x6, 0x1, 0x0, 0x9,
+                                                     0x1, 0x0, 0xc, 0x1, 0x0, 0xf, 0x11, 0x0,
+                                                     0x3c, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x40, 0x0,
+                                                     0x0, 0x5c, 0x2, 0x0, 0x97, 0x0, 0x0, 0xa1,
+                                                     0x0, 0x0, 0x9c, 0x0, 0x0, 0x98, 0x0, 0x0,
+                                                     0xa8, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x65, 0x0,
+                                                     0x1, 0x87, 0x31, 0x0, 0x74, 0x0, 0x0, 0x79,
+                                                     0x0, 0x1, 0xb9, 0x1, 0x0, 0x63, 0x0, 0x1,
+                                                     0xbb, 0x1b, 0x0, 0xa6, 0x0, 0x1, 0xd7, 0x41,
+                                                     0x0, 0xbf, 0x2, 0x0, 0x1, 0x0, 0x4, 0x0,
+                                                     0x7, 0x0, 0x3b, 0x0, 0xad, 0x1, 0x68, 0x2,
+                                                     0x26, 0x2, 0x5c, 0x2, 0x8f, 0x2, 0xb0, 0x3,
+                                                     0x4, 0x3, 0x13, 0x3, 0x27, 0x3, 0x73, 0x3,
+                                                     0xa3, 0x3, 0xf5, 0x4, 0x65, 0x4, 0x99, 0x4,
+                                                     0xf2, 0x5, 0x53, 0x5, 0x7a, 0x5, 0xf1, 0x6,
+                                                     0x56, 0x6, 0x6d, 0x6, 0xd9, 0x6, 0xf0, 0x7,
+                                                     0x3, 0x7, 0x1c, 0x7, 0x79, 0x7, 0x9a, 0x7,
+                                                     0xbc, 0x7, 0xcc, 0x8, 0x17, 0x8, 0x2d, 0x8,
+                                                     0x79, 0x8, 0x91, 0x8, 0xc9, 0x8, 0xf8, 0x9,
+                                                     0x6e, 0x9, 0x9d, 0x9, 0xbd, 0xa, 0x3c, 0xa,
+                                                     0xa0, 0xb, 0xa, 0xb, 0x4c, 0xb, 0xa9, 0xb,
+                                                     0xe8, 0xc, 0x18, 0xc, 0xb5, 0xc, 0xc4, 0xd,
+                                                     0x1e, 0xd, 0x6f, 0xd, 0xca, 0xe, 0x11, 0xe,
+                                                     0x88, 0xe, 0xdd, 0xf, 0x1c, 0xf, 0x69, 0xf,
+                                                     0xa5, 0xf, 0xde, 0x10, 0x2e, 0x10, 0xab, 0x11,
+                                                     0x40, 0x11, 0xab, 0x12, 0x1a, 0x12, 0xa8, 0x13,
+                                                     0x2, 0x13, 0x87, 0x14, 0xa, 0x14, 0x90, 0x14,
+                                                     0xf6, 0x15, 0x4d, 0x15, 0x89, 0x16, 0x4, 0x16,
+                                                     0x61, 0x16, 0xac, 0x17, 0x62, 0x17, 0xa8, 0x18,
+                                                     0x10, 0x18, 0x71, 0x18, 0xe3, 0x19, 0x2e, 0x19,
+                                                     0x80, 0x19, 0xe3, 0x1a, 0x47, 0x1a, 0xa3, 0x1b,
+                                                     0x18, 0x1b, 0x93, 0x1c, 0x24, 0x1c, 0x85, 0x1c,
+                                                     0xf2, 0x1d, 0x87, 0x1d, 0xab, 0x1d, 0xd0, 0x1d,
+                                                     0xf2, 0x1e, 0x1f, 0x1e, 0x38, 0x1e, 0xc3, 0x1f,
+                                                     0x58, 0x20, 0xc, 0x20, 0xe9, 0x21, 0x72, 0x22,
+                                                     0x1a, 0x22, 0x4b, 0x22, 0x79, 0x22, 0xa5, 0x22,
+                                                     0xd4, 0x23, 0x31, 0x23, 0x53, 0x23, 0x96, 0x23,
+                                                     0xd5, 0x24, 0xf, 0x24, 0x4e, 0x24, 0xad, 0x24,
+                                                     0xde, 0x25, 0x46, 0x25, 0x6b, 0x25, 0xea, 0x26,
+                                                     0xe, 0x26, 0x33, 0x26, 0x74, 0x26, 0xe6, 0x27,
+                                                     0x31, 0x27, 0x80, 0x27, 0xd8, 0x27, 0xe3, 0x28,
+                                                     0xf3, 0x29, 0x16, 0x29, 0x88, 0x29, 0xf3, 0x2a,
+                                                     0xa, 0x2a, 0x26, 0x2a, 0x49, 0x2a, 0x7f, 0x2a,
+                                                     0xb5, 0x2b, 0xc, 0x2b, 0x54, 0x2b, 0xa0, 0x2b,
+                                                     0xfb, 0x2c, 0x46, 0x2c, 0x84, 0x2c, 0xa1, 0x2c,
+                                                     0xb3, 0x2c, 0xc8, 0x2c, 0xfa, 0x2d, 0x24, 0x2d,
+                                                     0x7a, 0x2d, 0xb6, 0x2d, 0xef, 0x2e, 0x31, 0x2e,
+                                                     0x7d, 0x2e, 0x98, 0x2e, 0xb7, 0x2e, 0xf1, 0x2f,
+                                                     0x2d, 0x2f, 0x45, 0x2f, 0x5f, 0x2f, 0x95, 0x2f,
+                                                     0xff, 0x30, 0x8e, 0x30, 0xda, 0x30, 0xf9, 0x31,
+                                                     0x55, 0x31, 0xeb, 0x32, 0x87, 0x32, 0x99, 0x32,
+                                                     0xab, 0x32, 0xc0, 0x33, 0x45, 0x33, 0x92, 0x33,
+                                                     0xdb, 0x34, 0x6, 0x34, 0x12, 0x34, 0x3a, 0x34,
+                                                     0x57, 0x34, 0x68, 0x34, 0x84, 0x34, 0xa7, 0x34,
+                                                     0xd5, 0x34, 0xf4, 0x34, 0xfb, 0x35, 0xe, 0x35,
+                                                     0x35, 0x35, 0x43, 0x35, 0x6b, 0x35, 0x8a, 0x35,
+                                                     0x9e, 0x35, 0xbb, 0x35, 0xd7, 0x36, 0x5, 0x36,
+                                                     0x21, 0x36, 0x97, 0xfc, 0x45, 0xe, 0xfc, 0x45,
+                                                     0xe, 0xfb, 0xf2, 0x7a, 0xf7, 0x4, 0xf8, 0xd5,
+                                                     0x77, 0x1, 0xf7, 0x14, 0xf7, 0x4, 0x3, 0xf7,
+                                                     0x42, 0xf7, 0x64, 0x15, 0x7f, 0x8c, 0x90, 0x85,
+                                                     0x8f, 0x1b, 0x8f, 0x8f, 0x91, 0x97, 0x8d, 0x1f,
+                                                     0xb0, 0xf7, 0xb8, 0x94, 0xc1, 0xb6, 0x1a, 0xcb,
+                                                     0x69, 0x96, 0x75, 0x75, 0x69, 0x81, 0x4a, 0x1e,
+                                                     0xfc, 0xc2, 0x4, 0x22, 0xa, 0xfb, 0x4b, 0x90,
+                                                     0x76, 0xf7, 0x64, 0xb9, 0xf7, 0x4a, 0xb9, 0xf7,
+                                                     0x63, 0x77, 0x1, 0x9f, 0xf8, 0x61, 0x3, 0xe9,
+                                                     0x7b, 0x15, 0xba, 0x6, 0xa8, 0xf7, 0x64, 0x5,
+                                                     0xf7, 0x10, 0x6, 0x6f, 0xfb, 0x64, 0x5, 0xba,
+                                                     0x6, 0xa7, 0xf7, 0x64, 0x5, 0xf3, 0x6, 0x91,
+                                                     0xb9, 0x5, 0x24, 0x6, 0xa3, 0xf7, 0x4a, 0x5,
+                                                     0xf2, 0x6, 0x91, 0xb9, 0x5, 0x25, 0x6, 0xa7,
+                                                     0xf7, 0x63, 0x5, 0x5c, 0x6, 0x6f, 0xfb, 0x63,
+                                                     0x5, 0xfb, 0x11, 0x6, 0xa8, 0xf7, 0x63, 0x5,
+                                                     0x5c, 0x6, 0x6e, 0xfb, 0x63, 0x5, 0x27, 0x6,
+                                                     0x85, 0x5d, 0x5, 0xef, 0x6, 0x72, 0xfb, 0x4a,
+                                                     0x5, 0x24, 0x6, 0x85, 0x5d, 0x5, 0xf2, 0x6,
+                                                     0xc0, 0xb9, 0x15, 0xa4, 0xf7, 0x4a, 0x5, 0xf7,
+                                                     0x10, 0x6, 0x73, 0xfb, 0x4a, 0x5, 0xe, 0xf7,
+                                                     0x2a, 0x5d, 0xb1, 0xf7, 0xa6, 0xbc, 0x7c, 0xb1,
+                                                     0xf7, 0x70, 0xa7, 0xd0, 0x77, 0x12, 0xca, 0xdc,
+                                                     0xf7, 0x70, 0xa8, 0xb7, 0xd6, 0xf7, 0x79, 0xaa,
+                                                     0x13, 0xdf, 0x80, 0xf7, 0x3f, 0x67, 0x15, 0xc2,
+                                                     0x6, 0xf8, 0x4d, 0xf9, 0x47, 0x5, 0x54, 0x6,
+                                                     0x66, 0x82, 0x33, 0x6b, 0x5c, 0x1b, 0x53, 0x8a,
+                                                     0x6c, 0xa4, 0x83, 0x8f, 0x8, 0xa0, 0x71, 0x79,
+                                                     0x9f, 0x63, 0x1b, 0xfb, 0x4, 0xfb, 0x6, 0xfb,
+                                                     0x23, 0xfb, 0x19, 0x40, 0xb9, 0x65, 0xc7, 0xf7,
+                                                     0x1a, 0xe4, 0xf7, 0x25, 0xef, 0x8c, 0x1f, 0xa0,
+                                                     0x8b, 0xa0, 0x88, 0x9f, 0x1e, 0x9c, 0x81, 0xaa,
+                                                     0x85, 0xac, 0x8c, 0xb0, 0x8c, 0xb3, 0x93, 0xa4,
+                                                     0x9b, 0x8, 0xfb, 0x69, 0x87, 0x15, 0x8d, 0x76,
+                                                     0x8d, 0x80, 0x6f, 0x1a, 0x3a, 0x45, 0xfb, 0xf,
+                                                     0x27, 0x66, 0x7e, 0xb3, 0xad, 0xe3, 0xda, 0xf7,
+                                                     0x14, 0xcd, 0x95, 0x1e, 0x9b, 0x7e, 0xac, 0x7d,
+                                                     0xa1, 0x82, 0x8, 0xd8, 0xfc, 0x7e, 0x15, 0x3b,
+                                                     0xbc, 0x5e, 0xd8, 0xf7, 0xc, 0xe4, 0xf7, 0x2a,
+                                                     0xf2, 0x1e, 0x13, 0xbf, 0x80, 0xc2, 0x76, 0xcd,
+                                                     0x35, 0xfb, 0x18, 0x2b, 0xfb, 0x20, 0xfb, 0x1,
+                                                     0x1e, 0xd6, 0x80, 0x15, 0xe8, 0xdf, 0xf7, 0x16,
+                                                     0xd3, 0x8a, 0x1e, 0xc6, 0x99, 0x5c, 0x60, 0x38,
+                                                     0x38, 0xfb, 0x11, 0x26, 0x6c, 0x7d, 0xb0, 0xb2,
+                                                     0x1f, 0xe, 0xea, 0x79, 0xc6, 0x50, 0xd6, 0xf7,
+                                                     0xed, 0x9d, 0xf7, 0x5d, 0xb3, 0x12, 0xb4, 0xe8,
+                                                     0xc9, 0xd7, 0x8b, 0xf7, 0x38, 0x8b, 0xbd, 0x13,
+                                                     0x7f, 0xf8, 0x3e, 0xdd, 0x15, 0x76, 0xa0, 0xd2,
+                                                     0x3c, 0xdb, 0x1b, 0x13, 0xbf, 0xdb, 0xb2, 0xb4,
+                                                     0xd8, 0xac, 0x1f, 0x7b, 0x99, 0x5, 0x66, 0x61,
+                                                     0x64, 0x77, 0x73, 0x1b, 0x4f, 0x56, 0xc2, 0xaa,
+                                                     0x6c, 0x1f, 0xcc, 0xd7, 0x9f, 0xb7, 0xb2, 0xc8,
+                                                     0x8, 0xaf, 0xa2, 0xa3, 0xb5, 0xbd, 0x1b, 0x9d,
+                                                     0xfb, 0x67, 0x79, 0x7, 0xae, 0xa2, 0x7d, 0x71,
+                                                     0x52, 0x48, 0xfb, 0xa, 0x75, 0x7b, 0x1f, 0x4d,
+                                                     0xd3, 0x60, 0xd6, 0x69, 0xc9, 0x8, 0xe2, 0xb1,
+                                                     0xd5, 0xab, 0xe8, 0x1a, 0xc9, 0x4d, 0xc3, 0x49,
+                                                     0x27, 0x4d, 0x54, 0x24, 0x1e, 0x13, 0x9f, 0x56,
+                                                     0x9e, 0x6f, 0x9c, 0x5b, 0x1e, 0xfb, 0x2, 0x44,
+                                                     0x3a, 0x5f, 0xfb, 0xd, 0x1a, 0xfb, 0x0, 0xe2,
+                                                     0x5b, 0xe4, 0xf7, 0x11, 0xc2, 0xd0, 0xaa, 0xa8,
+                                                     0x1e, 0xfb, 0xd, 0xf7, 0xdc, 0x15, 0x7c, 0xb0,
+                                                     0x79, 0xbc, 0xb8, 0x1a, 0xb6, 0xb1, 0xb0, 0xba,
+                                                     0xaf, 0xb6, 0x6a, 0x52, 0x51, 0x3c, 0x6a, 0x57,
+                                                     0x6d, 0x1e, 0xe8, 0xfb, 0xc4, 0x15, 0x13, 0xbf,
+                                                     0x82, 0x83, 0x4e, 0x53, 0x48, 0x1b, 0x44, 0x52,
+                                                     0xc9, 0xda, 0xe4, 0xd2, 0xb1, 0xb4, 0xaa, 0x1f,
+                                                     0xba, 0x3b, 0xa2, 0x5b, 0xde, 0x24, 0x8, 0xe,
+                                                     0x50, 0xa, 0xc0, 0xdd, 0x3, 0xf7, 0xb6, 0xfb,
+                                                     0x53, 0x15, 0x95, 0x9c, 0x5, 0xfb, 0xe, 0xe6,
+                                                     0x60, 0xf7, 0x35, 0xf7, 0x3a, 0x1a, 0xf7, 0x40,
+                                                     0xad, 0xf7, 0x2f, 0xf7, 0x17, 0xe0, 0x1e, 0x81,
+                                                     0x9c, 0x5, 0xfb, 0x0, 0x72, 0xfb, 0x15, 0xfb,
+                                                     0x2a, 0xfb, 0x95, 0x1a, 0xfb, 0x7a, 0xf7, 0x22,
+                                                     0xfb, 0x48, 0xea, 0x75, 0x1e, 0xe, 0x50, 0xa,
+                                                     0xf7, 0x58, 0xdd, 0x3, 0xb4, 0xfb, 0x53, 0x15,
+                                                     0xea, 0xa1, 0xf7, 0x22, 0xf7, 0x48, 0xf7, 0x7a,
+                                                     0x1a, 0xf7, 0x95, 0xfb, 0x15, 0xf7, 0x2a, 0xfb,
+                                                     0x0, 0xa4, 0x1e, 0x81, 0x7a, 0x5, 0xf7, 0x17,
+                                                     0x36, 0xad, 0xfb, 0x2f, 0xfb, 0x40, 0x1a, 0xfb,
+                                                     0x3a, 0x60, 0xfb, 0x35, 0xfb, 0xe, 0x30, 0x1e,
+                                                     0xe, 0xf7, 0xbe, 0x8b, 0x1, 0xf7, 0x8b, 0xc2,
+                                                     0x3, 0x95, 0xf7, 0x87, 0x15, 0xf7, 0x81, 0xfb,
+                                                     0x87, 0xc2, 0xf7, 0x87, 0xf7, 0x81, 0xc2, 0xfb,
+                                                     0x81, 0xf7, 0x7f, 0x54, 0xfb, 0x7f, 0xfb, 0x81,
+                                                     0x6, 0xe, 0xfc, 0x45, 0xfb, 0x17, 0x76, 0xf7,
+                                                     0x24, 0xf7, 0x4, 0x22, 0xf4, 0x12, 0xc3, 0xf7,
+                                                     0x1e, 0x13, 0xd0, 0xc3, 0xb8, 0x15, 0x6b, 0x9e,
+                                                     0x76, 0xaf, 0x1e, 0x13, 0xb0, 0x97, 0x99, 0x93,
+                                                     0x8a, 0x93, 0x1f, 0x8f, 0x8a, 0x8d, 0x89, 0x84,
+                                                     0x1a, 0x54, 0x51, 0x62, 0x73, 0x79, 0x1e, 0x86,
+                                                     0x87, 0x83, 0x86, 0x84, 0x1a, 0x84, 0x90, 0x87,
+                                                     0x92, 0x8f, 0x92, 0x8c, 0x90, 0x92, 0x1e, 0x9c,
+                                                     0x95, 0xac, 0xa4, 0x9f, 0xa4, 0x8, 0xaf, 0xb9,
+                                                     0x8d, 0xb4, 0xa7, 0x1a, 0xba, 0x65, 0xa7, 0x67,
+                                                     0x5f, 0x77, 0x6c, 0x6f, 0x1e, 0xe, 0xfc, 0x45,
+                                                     0x7a, 0xf7, 0x4, 0x1, 0xd0, 0xf7, 0x4, 0x3,
+                                                     0xd0, 0xb2, 0x15, 0x22, 0xa, 0xfc, 0x29, 0x8e,
+                                                     0x76, 0xf9, 0x2c, 0x77, 0x1, 0x79, 0x4, 0xb7,
+                                                     0x6, 0xf7, 0x66, 0xf9, 0x2c, 0x5, 0x5f, 0x6,
+                                                     0xe, 0xfb, 0x4b, 0x7a, 0xab, 0xf9, 0x14, 0xa9,
+                                                     0x1, 0xa2, 0xee, 0xf7, 0x93, 0xe9, 0x3, 0xf7,
+                                                     0xe, 0xf7, 0xe3, 0x15, 0xd4, 0x8b, 0xf7, 0x8b,
+                                                     0xf7, 0x14, 0xf7, 0x14, 0x8a, 0xfb, 0x8b, 0x42,
+                                                     0x38, 0x8c, 0xfb, 0x81, 0xfb, 0x14, 0xfb, 0x14,
+                                                     0x8b, 0xf7, 0x7f, 0xe0, 0x1e, 0x28, 0x16, 0xfb,
+                                                     0x11, 0xb6, 0xfb, 0x77, 0xf7, 0x4c, 0xf7, 0x4c,
+                                                     0xb0, 0xf7, 0x77, 0xf7, 0x11, 0xf7, 0xf, 0x66,
+                                                     0xf7, 0x77, 0xfb, 0x4c, 0xfb, 0x4c, 0x60, 0xfb,
+                                                     0x77, 0xfb, 0xf, 0x1e, 0xe, 0xfb, 0x4b, 0x3b,
+                                                     0xa, 0xf7, 0x69, 0xdf, 0x3, 0xf7, 0x9, 0x16,
+                                                     0xf7, 0xa5, 0x9d, 0x6, 0x7e, 0x3b, 0x96, 0xd2,
+                                                     0x1f, 0xf8, 0xd1, 0x79, 0x7, 0xfb, 0x36, 0x32,
+                                                     0x5, 0x79, 0x7, 0xc4, 0xa0, 0x5, 0xa7, 0x95,
+                                                     0x96, 0x7e, 0x77, 0x1a, 0xfc, 0x64, 0x7, 0x44,
+                                                     0x38, 0x80, 0x7e, 0x1e, 0xe, 0xfb, 0x4b, 0x8b,
+                                                     0xd7, 0xf8, 0x1c, 0x9d, 0xf7, 0xc, 0xdb, 0x1,
+                                                     0xf7, 0xe0, 0xe5, 0x3, 0xa4, 0x16, 0xf8, 0x1d,
+                                                     0x6, 0xc4, 0xf7, 0x1d, 0x7e, 0x90, 0x5, 0x4c,
+                                                     0x64, 0x6e, 0x88, 0x64, 0x1b, 0xfb, 0x77, 0x6,
+                                                     0xf7, 0x58, 0xf7, 0x5c, 0xed, 0xf7, 0x6, 0xf5,
+                                                     0x1a, 0xf7, 0xd, 0x41, 0xd0, 0x22, 0x33, 0x2d,
+                                                     0x5a, 0xfb, 0x2b, 0x6d, 0x1e, 0xa0, 0x86, 0x5,
+                                                     0xc1, 0xa1, 0xa9, 0xd2, 0xe6, 0x1b, 0xf7, 0x7,
+                                                     0xa1, 0x30, 0x5c, 0x37, 0x5d, 0x34, 0x46, 0x40,
+                                                     0x1f, 0xfb, 0x54, 0xfb, 0x66, 0x5, 0xe, 0xfb,
+                                                     0x4b, 0x7a, 0xb2, 0xf8, 0xef, 0xc7, 0x12, 0xf7,
+                                                     0xcf, 0xdd, 0x65, 0xd7, 0x13, 0xd0, 0xf7, 0x25,
+                                                     0xf7, 0xe8, 0x15, 0xf1, 0x8c, 0xf7, 0x4, 0x5c,
+                                                     0xfb, 0x1, 0x1a, 0x37, 0x62, 0x3c, 0x2e, 0x6e,
+                                                     0x74, 0x97, 0x9c, 0x76, 0x1e, 0x9c, 0x76, 0x77,
+                                                     0x98, 0x74, 0x1b, 0x68, 0x7d, 0x7e, 0x6e, 0x58,
+                                                     0xf7, 0x10, 0x86, 0x9e, 0xf7, 0x20, 0xf7, 0x5,
+                                                     0xe5, 0xf7, 0x27, 0xf7, 0x16, 0x36, 0xb5, 0x5d,
+                                                     0x9b, 0x1f, 0x13, 0xe0, 0xcd, 0xb8, 0xa6, 0xb6,
+                                                     0xc1, 0x1a, 0xb4, 0x70, 0xe9, 0xfb, 0x15, 0x48,
+                                                     0x2c, 0x6b, 0xfb, 0x17, 0x63, 0x1e, 0x9a, 0x87,
+                                                     0x5, 0xa7, 0x9a, 0xbb, 0xda, 0xe6, 0x1b, 0xd5,
+                                                     0xac, 0x56, 0x58, 0x2f, 0x40, 0x5b, 0x2c, 0x71,
+                                                     0x1f, 0x86, 0x8b, 0x86, 0x86, 0x1a, 0xe, 0xfb,
+                                                     0x4b, 0xa0, 0x76, 0xf7, 0x33, 0xd1, 0xf8, 0x5c,
+                                                     0x77, 0x1, 0x9b, 0xb8, 0xf7, 0x81, 0xdf, 0x3,
+                                                     0x9b, 0xf7, 0x33, 0x15, 0xf7, 0xae, 0xfb, 0x33,
+                                                     0xdf, 0xf7, 0x33, 0xe2, 0xd1, 0x34, 0xf8, 0x5c,
+                                                     0x59, 0x6, 0xfb, 0xd0, 0xfc, 0x5b, 0x5, 0xb8,
+                                                     0x8a, 0x15, 0xf7, 0x81, 0xf7, 0xe4, 0x5, 0xfb,
+                                                     0xe4, 0x7, 0xe, 0xfb, 0x4b, 0x7a, 0xb3, 0xf8,
+                                                     0x1c, 0xe0, 0xe9, 0xda, 0x1, 0xf7, 0xf7, 0xd2,
+                                                     0x3, 0xc7, 0xf8, 0x33, 0x15, 0xf7, 0x7, 0x86,
+                                                     0xf7, 0x48, 0x59, 0xfb, 0x34, 0x1a, 0xfb, 0xe,
+                                                     0x42, 0x54, 0x4a, 0x70, 0x78, 0x9d, 0x9d, 0x77,
+                                                     0x1e, 0x9d, 0x78, 0x77, 0x9d, 0x6d, 0x1b, 0x6c,
+                                                     0x75, 0x7a, 0x6b, 0x57, 0xe5, 0x80, 0xbd, 0xf7,
+                                                     0x32, 0xee, 0xf7, 0x1, 0xf7, 0x19, 0xf7, 0x2d,
+                                                     0x30, 0xf7, 0x4, 0xfb, 0x57, 0x95, 0x1f, 0xaf,
+                                                     0xe9, 0x5, 0xf7, 0x79, 0x6, 0xb1, 0xe1, 0x7c,
+                                                     0x90, 0x5, 0x81, 0x81, 0x6e, 0x89, 0x64, 0x1b,
+                                                     0xfb, 0x48, 0x6, 0xe, 0xfb, 0x4b, 0x7d, 0xa7,
+                                                     0xf8, 0x4, 0xb9, 0xf7, 0x95, 0x77, 0x1, 0xad,
+                                                     0xe8, 0xf7, 0x8f, 0xe5, 0x3, 0xf8, 0x51, 0xf9,
+                                                     0x41, 0x15, 0xfb, 0x85, 0x82, 0xfb, 0x3e, 0xfb,
+                                                     0x4a, 0xfb, 0x5f, 0x1a, 0xfb, 0x66, 0xf1, 0x2c,
+                                                     0xf7, 0xa, 0xf7, 0x46, 0xaf, 0xf7, 0x33, 0xd4,
+                                                     0xf7, 0x1a, 0x3d, 0xd7, 0x22, 0x54, 0x74, 0x7f,
+                                                     0x6c, 0x52, 0x1e, 0xa0, 0xf7, 0xc, 0xee, 0xf7,
+                                                     0x1b, 0xf7, 0x48, 0xa7, 0x8, 0xfb, 0xce, 0xfb,
+                                                     0xdc, 0x15, 0xad, 0xaf, 0xaf, 0x93, 0xb0, 0x1b,
+                                                     0xf2, 0xa9, 0x27, 0x24, 0xfb, 0x5, 0x5d, 0x57,
+                                                     0x4c, 0x40, 0x48, 0xd5, 0xf7, 0x3c, 0xad, 0x8c,
+                                                     0xa5, 0x93, 0xa3, 0x1f, 0xe, 0xfb, 0x4b, 0x92,
+                                                     0x76, 0xf8, 0xe9, 0xe5, 0x1, 0xf7, 0x43, 0x7b,
+                                                     0x15, 0xc7, 0x6, 0xf7, 0x69, 0xf9, 0x25, 0x5,
+                                                     0xab, 0xfb, 0xff, 0x7, 0x4e, 0xfb, 0x34, 0xa1,
+                                                     0x82, 0x5, 0xb3, 0xa3, 0xa6, 0xb2, 0xc3, 0x1b,
+                                                     0xf7, 0x6d, 0x6, 0xe, 0xfb, 0x4b, 0x79, 0xab,
+                                                     0xf9, 0xe, 0xb0, 0x12, 0xc1, 0xd9, 0x45, 0xd1,
+                                                     0xf7, 0x72, 0xcc, 0x55, 0xd6, 0x13, 0xe4, 0xf7,
+                                                     0x63, 0xf7, 0xcd, 0x15, 0xf7, 0x4, 0x38, 0xb9,
+                                                     0x6d, 0x41, 0x1a, 0x45, 0x5d, 0x61, 0x4c, 0x3a,
+                                                     0x60, 0xcc, 0xd8, 0xe6, 0xb3, 0xb2, 0xae, 0xa6,
+                                                     0x1e, 0x6f, 0xa6, 0x15, 0x34, 0x4a, 0x65, 0x61,
+                                                     0x34, 0x1a, 0x3d, 0xcf, 0x35, 0xf7, 0x10, 0xf7,
+                                                     0x3a, 0xa7, 0xf7, 0x8, 0xbf, 0xce, 0x7c, 0xc8,
+                                                     0xfb, 0x16, 0xe1, 0x1e, 0x13, 0xd8, 0xc1, 0xb1,
+                                                     0xd1, 0xbc, 0xe7, 0x1a, 0xd7, 0x4c, 0xcd, 0xfb,
+                                                     0x5, 0x35, 0x2c, 0x55, 0x26, 0x3a, 0xab, 0x69,
+                                                     0xe0, 0x40, 0x1e, 0xde, 0xbd, 0x15, 0x68, 0xa1,
+                                                     0x30, 0xc4, 0xd9, 0x1a, 0xbb, 0xab, 0xc0, 0xd6,
+                                                     0xd8, 0xad, 0x55, 0x54, 0x33, 0x56, 0x66, 0x64,
+                                                     0x73, 0x1e, 0xe, 0xfb, 0x4b, 0x8e, 0x76, 0xf7,
+                                                     0x8d, 0xb6, 0xf8, 0xe, 0xac, 0x1, 0xaa, 0xe6,
+                                                     0xf7, 0x84, 0xed, 0x3, 0xc2, 0x8d, 0x15, 0x90,
+                                                     0x77, 0x5, 0xf7, 0x8e, 0x98, 0xf7, 0x2a, 0xf7,
+                                                     0x48, 0xf7, 0x75, 0x1a, 0xf7, 0x3b, 0x2a, 0xf7,
+                                                     0xa, 0xfb, 0xf, 0xfb, 0x16, 0x3c, 0xfb, 0x5,
+                                                     0xfb, 0x19, 0x39, 0xb8, 0xfb, 0x12, 0xf7, 0x1a,
+                                                     0xbd, 0xc0, 0x9d, 0xb0, 0xb7, 0x1e, 0x87, 0x70,
+                                                     0x54, 0xfb, 0x6d, 0xfb, 0x87, 0x63, 0x8, 0xf7,
+                                                     0xc3, 0xf7, 0xd8, 0x15, 0x69, 0x6a, 0x61, 0x79,
+                                                     0x6a, 0x1b, 0x21, 0x75, 0xf7, 0x13, 0xd7, 0xdd,
+                                                     0xa2, 0xe8, 0xdf, 0xf7, 0x17, 0x8d, 0xfb, 0x4f,
+                                                     0x4a, 0x76, 0x89, 0x69, 0x89, 0x78, 0x1f, 0xe,
+                                                     0xfc, 0x29, 0x7a, 0xf7, 0x4, 0xf7, 0x91, 0xf7,
+                                                     0x4, 0x1, 0xdc, 0xf7, 0x4, 0x3, 0xdc, 0xb2,
+                                                     0x37, 0xa, 0xf8, 0x1, 0x4, 0x22, 0xa, 0xfc,
+                                                     0x29, 0xfb, 0x17, 0x76, 0xf7, 0x3b, 0x76, 0xa6,
+                                                     0x76, 0xf7, 0xf0, 0xf7, 0x4, 0x12, 0xde, 0xf7,
+                                                     0x1e, 0xfb, 0x15, 0xf7, 0x4, 0x13, 0xd8, 0xde,
+                                                     0xb5, 0x15, 0x72, 0x9b, 0x74, 0xb0, 0x90, 0x91,
+                                                     0x8c, 0x8d, 0x90, 0x1e, 0x13, 0xb8, 0x8d, 0x91,
+                                                     0x91, 0x8c, 0x8f, 0x1b, 0x91, 0x8f, 0x87, 0x80,
+                                                     0x6f, 0x7b, 0x71, 0x7b, 0x7a, 0x1f, 0x7c, 0x7c,
+                                                     0x7a, 0x7f, 0x7f, 0x83, 0x8, 0x7e, 0x82, 0x85,
+                                                     0x88, 0x80, 0x1a, 0x86, 0x8d, 0x88, 0x91, 0x8e,
+                                                     0x8f, 0x8b, 0x8c, 0x90, 0x1e, 0x95, 0x8d, 0xb7,
+                                                     0xab, 0xa5, 0xaa, 0x8, 0xa8, 0xae, 0x94, 0xb7,
+                                                     0xab, 0x1a, 0xb2, 0x6a, 0xaf, 0x5d, 0x6a, 0x71,
+                                                     0x75, 0x67, 0x1e, 0x13, 0xd4, 0x94, 0xf7, 0xfe,
+                                                     0x15, 0x22, 0xa, 0xa0, 0x76, 0xf8, 0x9e, 0x77,
+                                                     0x1, 0xa5, 0xf7, 0x7a, 0x15, 0xf8, 0x85, 0xfb,
+                                                     0x7a, 0x5, 0xc9, 0x7, 0xfc, 0x45, 0xf7, 0x5b,
+                                                     0x3e, 0xa, 0xf7, 0x21, 0xc2, 0xf7, 0x1f, 0xc2,
+                                                     0x1, 0x96, 0xf7, 0xe3, 0x15, 0x3a, 0xa, 0xfb,
+                                                     0x8d, 0x4, 0x3a, 0xa, 0xe, 0xa0, 0x76, 0xf8,
+                                                     0x9e, 0x77, 0x1, 0xf8, 0x9f, 0xf7, 0x7a, 0x15,
+                                                     0x51, 0xa, 0xf8, 0x44, 0xfb, 0x5b, 0xfc, 0x44,
+                                                     0xfb, 0x5b, 0x5, 0x4d, 0x7, 0xe, 0xfb, 0x83,
+                                                     0x7a, 0xf7, 0x4, 0xf8, 0xc3, 0xab, 0x1, 0xf7,
+                                                     0x42, 0xf7, 0x4, 0xa6, 0xeb, 0x3, 0xf7, 0x74,
+                                                     0xf7, 0x3b, 0x15, 0xa0, 0x6, 0x98, 0xe7, 0xb1,
+                                                     0xc3, 0xad, 0xb3, 0x8, 0x9f, 0xa3, 0xc6, 0xd6,
+                                                     0xd6, 0x1a, 0xbd, 0x77, 0xf6, 0xfb, 0x32, 0xfb,
+                                                     0x5, 0x5b, 0x32, 0x4a, 0x69, 0x9f, 0x68, 0xa8,
+                                                     0xa1, 0x9b, 0x97, 0xa5, 0x9e, 0x80, 0x99, 0x81,
+                                                     0x9a, 0x1e, 0x82, 0x98, 0x82, 0x99, 0x9e, 0x1a,
+                                                     0xb2, 0xb9, 0x9f, 0xbe, 0xc1, 0xb7, 0x56, 0x41,
+                                                     0x4b, 0x76, 0x56, 0x75, 0x51, 0x1e, 0x77, 0x53,
+                                                     0x77, 0x48, 0x85, 0x4d, 0x8, 0x59, 0xfb, 0x14,
+                                                     0x15, 0x22, 0xa, 0x4e, 0xa, 0xe1, 0xd8, 0x3,
+                                                     0xe1, 0xfb, 0x2f, 0x15, 0xf7, 0x69, 0xa4, 0x3c,
+                                                     0x6, 0x64, 0x79, 0xa3, 0xb0, 0x1f, 0xf9, 0x25,
+                                                     0x7, 0xb0, 0x9d, 0xa3, 0xb2, 0x1e, 0xda, 0xa4,
+                                                     0xfb, 0x69, 0x6, 0xe, 0x4e, 0xa, 0xf7, 0x3d,
+                                                     0xd8, 0x3, 0xac, 0xfb, 0x16, 0x15, 0x72, 0xf7,
+                                                     0x69, 0xf9, 0xd1, 0xfb, 0x69, 0x72, 0xda, 0x7,
+                                                     0xb2, 0x9d, 0x73, 0x66, 0x1f, 0xfd, 0x25, 0x7,
+                                                     0x66, 0x79, 0x73, 0x64, 0x1e, 0xe, 0xfb, 0x4b,
+                                                     0xfb, 0x90, 0xb9, 0x1, 0x89, 0xfb, 0x62, 0x15,
+                                                     0x5d, 0xf8, 0x8c, 0xb9, 0x7, 0xe, 0x4d, 0xa,
+                                                     0xf7, 0x4e, 0xd6, 0x3, 0xc5, 0xf7, 0x7c, 0x15,
+                                                     0xc4, 0x7f, 0xd2, 0x8b, 0x27, 0x1a, 0xfb, 0x53,
+                                                     0x7, 0x39, 0xac, 0x6d, 0xd8, 0x1e, 0xf0, 0xa4,
+                                                     0x5a, 0x6, 0x52, 0x6d, 0xaa, 0xc3, 0x1f, 0xf7,
+                                                     0x53, 0x7, 0xdb, 0x28, 0xb4, 0x5b, 0x8e, 0x1e,
+                                                     0xb8, 0x93, 0xf1, 0xaf, 0xdd, 0x1a, 0xf7, 0x53,
+                                                     0x7, 0xc5, 0xa9, 0xa8, 0xc4, 0x1e, 0xbc, 0xa4,
+                                                     0x26, 0x6, 0x3f, 0x69, 0x71, 0x35, 0x1f, 0xfb,
+                                                     0x53, 0x7, 0x27, 0x44, 0x8b, 0x52, 0x7f, 0x1e,
+                                                     0xe, 0xfc, 0x77, 0xfb, 0x30, 0x76, 0xf9, 0xe6,
+                                                     0x77, 0x1, 0xcc, 0xd1, 0x3, 0xcc, 0xfb, 0x45,
+                                                     0x15, 0xd1, 0xf9, 0xe6, 0x45, 0x6, 0xe, 0x4d,
+                                                     0xa, 0xf7, 0x6b, 0xd6, 0x3, 0xda, 0xfb, 0x32,
+                                                     0x15, 0x72, 0xf0, 0x7, 0xd8, 0xac, 0xa7, 0xdf,
+                                                     0x1f, 0xf7, 0x53, 0x7, 0xef, 0xd2, 0x8b, 0xc4,
+                                                     0x97, 0x1e, 0xa5, 0x7, 0x52, 0x97, 0x44, 0x8b,
+                                                     0xef, 0x1a, 0xf7, 0x53, 0x7, 0xdd, 0x6b, 0xa9,
+                                                     0x3d, 0x1e, 0x26, 0x72, 0xbc, 0x6, 0xbd, 0xb0,
+                                                     0x74, 0x4b, 0x1f, 0xfb, 0x53, 0x7, 0x39, 0xf3,
+                                                     0x65, 0xb6, 0x83, 0x1e, 0x5e, 0x89, 0x25, 0x63,
+                                                     0x3b, 0x1a, 0xfb, 0x53, 0x7, 0x4b, 0x66, 0x74,
+                                                     0x59, 0x1e, 0xe, 0xa9, 0xf7, 0x7d, 0xc2, 0x1,
+                                                     0xf8, 0xf1, 0xc2, 0x3, 0xae, 0xf7, 0xb4, 0x15,
+                                                     0xf9, 0x5, 0xfb, 0xb4, 0x54, 0xf7, 0x7d, 0xfc,
+                                                     0xce, 0x6, 0xe, 0xfb, 0xaf, 0xf8, 0x15, 0xb4,
+                                                     0xf7, 0x6e, 0xb4, 0x1, 0xbd, 0xb6, 0xf7, 0x6b,
+                                                     0xb5, 0x3, 0xbd, 0xf8, 0xab, 0x15, 0x38, 0xce,
+                                                     0x48, 0xde, 0xdd, 0xcf, 0xce, 0xde, 0xdd, 0x47,
+                                                     0xcf, 0x39, 0x38, 0x48, 0x49, 0x37, 0x1e, 0xb6,
+                                                     0x16, 0xc7, 0xb9, 0xbc, 0xc7, 0xc8, 0xbb, 0x5a,
+                                                     0x4f, 0x4e, 0x5b, 0x5b, 0x4f, 0x4e, 0x5d, 0xbb,
+                                                     0xc8, 0x1e, 0xe, 0x8b, 0xc2, 0xf7, 0xbe, 0xc2,
+                                                     0xf7, 0x81, 0x77, 0x1, 0xf7, 0x8b, 0xc2, 0x3,
+                                                     0x95, 0xf7, 0xf5, 0x15, 0xf7, 0x81, 0xfb, 0x82,
+                                                     0xc2, 0xf7, 0x82, 0xf7, 0x81, 0xc2, 0xfb, 0x81,
+                                                     0xf7, 0x81, 0x54, 0xfb, 0x81, 0xfb, 0x81, 0x6,
+                                                     0xfc, 0x2c, 0x4, 0xf8, 0xa5, 0xc2, 0xfc, 0xa5,
+                                                     0x6, 0xe, 0x20, 0xfb, 0x5e, 0x76, 0xf7, 0x61,
+                                                     0xbd, 0x59, 0xd2, 0xf8, 0x53, 0x77, 0x12, 0xc8,
+                                                     0xe1, 0xf7, 0x63, 0xe1, 0x13, 0xdc, 0xec, 0xaa,
+                                                     0x15, 0x6c, 0x9c, 0xbd, 0x79, 0xb4, 0x1b, 0xca,
+                                                     0xd3, 0xd2, 0xb1, 0x9a, 0x1f, 0x52, 0x8c, 0xb8,
+                                                     0x57, 0xcf, 0x1b, 0xd1, 0xa7, 0xc6, 0xc7, 0x1f,
+                                                     0x77, 0x6, 0x72, 0x81, 0x80, 0x5f, 0x67, 0x1b,
+                                                     0x69, 0x7b, 0xbd, 0xad, 0x1f, 0xf8, 0x14, 0x35,
+                                                     0xfb, 0xfe, 0x7, 0x13, 0xbc, 0x5d, 0x6f, 0x62,
+                                                     0x64, 0x5c, 0x1b, 0x4a, 0x71, 0xbf, 0xc9, 0x1f,
+                                                     0xf7, 0xe1, 0x35, 0xfc, 0x80, 0x7, 0x73, 0x88,
+                                                     0x78, 0x87, 0x7b, 0x1e, 0x83, 0x6b, 0x7e, 0x72,
+                                                     0x63, 0x1a, 0x66, 0x9e, 0x65, 0xa8, 0xa6, 0x9e,
+                                                     0xb2, 0xb0, 0xb0, 0x7e, 0xa1, 0x82, 0xaf, 0x1e,
+                                                     0x87, 0x9b, 0x88, 0x9f, 0x8a, 0xa3, 0x8, 0xe,
+                                                     0xa8, 0x76, 0xf8, 0x98, 0x77, 0x1, 0x9c, 0xb8,
+                                                     0x15, 0xaf, 0x66, 0xf7, 0x72, 0xf7, 0x72, 0xf7,
+                                                     0x72, 0xfb, 0x72, 0xaf, 0xb0, 0xfb, 0x70, 0xf7,
+                                                     0x71, 0xf7, 0x70, 0xf7, 0x71, 0x68, 0xb0, 0xfb,
+                                                     0x73, 0xfb, 0x72, 0xfb, 0x72, 0xf7, 0x72, 0x67,
+                                                     0x66, 0xf7, 0x70, 0xfb, 0x71, 0x5, 0xe, 0xd2,
+                                                     0xf7, 0x4, 0xc0, 0xc2, 0xc0, 0xf7, 0x4, 0x1,
+                                                     0xf7, 0x68, 0xf7, 0x4, 0x14, 0xe0, 0x95, 0xf7,
+                                                     0x80, 0x15, 0x3a, 0xa, 0xf7, 0x5e, 0xf7, 0x1,
+                                                     0x37, 0xa, 0xfb, 0xa5, 0x4, 0x22, 0xa, 0xfb,
+                                                     0x4b, 0xf8, 0xa, 0xac, 0xf7, 0x91, 0xa5, 0x1,
+                                                     0x8d, 0xdf, 0xf7, 0xdc, 0xdb, 0x3, 0xf0, 0xf8,
+                                                     0xa, 0x15, 0xf7, 0x9, 0x6, 0x6d, 0xfb, 0xab,
+                                                     0x85, 0x4f, 0x84, 0x53, 0x8, 0x6a, 0x87, 0x76,
+                                                     0xfb, 0x5, 0x53, 0x1b, 0x82, 0x80, 0x8d, 0x90,
+                                                     0x1f, 0x9a, 0x97, 0x8b, 0xb0, 0x1a, 0x9f, 0x78,
+                                                     0x9e, 0x78, 0x76, 0x72, 0x7d, 0x65, 0x5a, 0xb6,
+                                                     0x74, 0xb5, 0x1e, 0xe8, 0x8c, 0xb0, 0xe6, 0x9c,
+                                                     0xd7, 0xa7, 0xf7, 0x1c, 0x9c, 0xf7, 0x16, 0xa2,
+                                                     0xf7, 0x19, 0x8, 0xf7, 0xe, 0x6, 0x95, 0xac,
+                                                     0x5, 0xfb, 0x14, 0x6, 0xf7, 0x3d, 0xa0, 0x9c,
+                                                     0xdf, 0xbe, 0x1b, 0x9b, 0x94, 0x87, 0x83, 0x1f,
+                                                     0x84, 0x85, 0x7b, 0x81, 0x1a, 0x76, 0x9c, 0x73,
+                                                     0xa4, 0xa5, 0x97, 0x9e, 0xa8, 0xb3, 0x67, 0xa7,
+                                                     0x6b, 0xfb, 0x26, 0x65, 0xfb, 0x30, 0xfb, 0xf,
+                                                     0x7b, 0x1e, 0xfb, 0x4, 0x6, 0xe, 0xb2, 0xa0,
+                                                     0x76, 0xf7, 0x6e, 0xb5, 0xf8, 0x31, 0x77, 0x1,
+                                                     0x8f, 0xf7, 0x13, 0xf8, 0x4, 0xf7, 0x4d, 0x3,
+                                                     0x8f, 0x16, 0xf7, 0x54, 0x9d, 0x6, 0x7c, 0x59,
+                                                     0x90, 0xb5, 0x94, 0x8d, 0x95, 0x8f, 0x97, 0x1f,
+                                                     0xbb, 0xf7, 0xe, 0x5, 0xf7, 0x97, 0x6, 0xbc,
+                                                     0xfb, 0xe, 0x5, 0x8f, 0x7f, 0x8d, 0x81, 0x82,
+                                                     0x1a, 0x61, 0x59, 0x86, 0x7c, 0x1e, 0x79, 0xf7,
+                                                     0x8e, 0x9d, 0x7, 0x5d, 0x7d, 0xaf, 0xb1, 0x7a,
+                                                     0x1f, 0xfb, 0x8f, 0xf8, 0xd9, 0x5, 0x71, 0x6,
+                                                     0xfb, 0x8d, 0xfc, 0xd9, 0x5, 0x67, 0x7b, 0x79,
+                                                     0x65, 0x60, 0x1b, 0xf7, 0x5c, 0xf7, 0x86, 0x15,
+                                                     0xf7, 0x5, 0xf7, 0xa0, 0xf7, 0x5, 0xfb, 0xa0,
+                                                     0x5, 0xe, 0x7b, 0x8b, 0xb5, 0xf7, 0xb2, 0xb5,
+                                                     0xf7, 0x98, 0xb6, 0x12, 0xf7, 0xb, 0xf3, 0xf7,
+                                                     0x81, 0xf2, 0x36, 0xf7, 0x6, 0x13, 0xf4, 0xa8,
+                                                     0x16, 0xf7, 0xe7, 0x6, 0xf7, 0x10, 0xef, 0xd5,
+                                                     0xf7, 0x2, 0xd6, 0x5d, 0xd0, 0xfb, 0x2, 0xa3,
+                                                     0x1f, 0x8d, 0x7, 0x13, 0xf8, 0xe3, 0xa5, 0xb2,
+                                                     0xbb, 0xd3, 0x1a, 0xf7, 0x32, 0xfb, 0x32, 0x9a,
+                                                     0x28, 0x33, 0xa, 0xf7, 0xf4, 0x15, 0x13, 0x78,
+                                                     0xf7, 0x8f, 0x7, 0x99, 0xd2, 0x86, 0x97, 0xf7,
+                                                     0xc, 0xad, 0x42, 0x4e, 0xfb, 0xd, 0xfb, 0xa,
+                                                     0x86, 0x63, 0x1e, 0x3c, 0x61, 0x15, 0xde, 0x6,
+                                                     0x13, 0xf4, 0xf1, 0xd1, 0x68, 0xfb, 0x9, 0x3a,
+                                                     0x4f, 0x56, 0x4b, 0x1f, 0x33, 0x6, 0x61, 0x8a,
+                                                     0xab, 0xa3, 0x1f, 0xe, 0x3b, 0xa0, 0x76, 0xf9,
+                                                     0x8, 0xb8, 0x77, 0x9f, 0x12, 0xf7, 0x11, 0xf3,
+                                                     0xf7, 0xf7, 0xa4, 0x13, 0xd0, 0xa3, 0x16, 0xf7,
+                                                     0xbb, 0x9d, 0x6, 0x2a, 0xa, 0x13, 0x58, 0xf8,
+                                                     0xac, 0xf7, 0x54, 0x7, 0xea, 0xcc, 0x6a, 0x37,
+                                                     0x8e, 0x1f, 0xa4, 0x6, 0x7a, 0xf7, 0x36, 0x5,
+                                                     0xfc, 0xcc, 0x6, 0x13, 0xb0, 0x77, 0x7, 0x9f,
+                                                     0x8a, 0xdc, 0x86, 0x23, 0x1a, 0xfc, 0x57, 0x7,
+                                                     0x54, 0x5d, 0x78, 0x54, 0x1e, 0xe, 0x43, 0x8b,
+                                                     0xb9, 0xf7, 0xb3, 0xb5, 0xf7, 0x8e, 0xbb, 0x79,
+                                                     0x9d, 0x12, 0xf7, 0xe, 0xf3, 0xf7, 0x96, 0xa2,
+                                                     0xa8, 0xa6, 0x13, 0xee, 0xab, 0x16, 0xf8, 0xa9,
+                                                     0x6, 0xb9, 0xf7, 0x3e, 0x5, 0x6c, 0x6, 0x58,
+                                                     0x73, 0x72, 0x42, 0x21, 0x1b, 0xfb, 0x33, 0x6,
+                                                     0x76, 0x78, 0x99, 0xae, 0x1f, 0xf7, 0x82, 0xf7,
+                                                     0x30, 0x7, 0xdb, 0xa1, 0x69, 0x4f, 0x1f, 0xa2,
+                                                     0xf7, 0x7a, 0x74, 0x6, 0x4f, 0x75, 0x69, 0x3b,
+                                                     0x1e, 0xfb, 0x30, 0xf7, 0x8e, 0xf7, 0x6b, 0x6,
+                                                     0xe1, 0x87, 0x55, 0x5d, 0x98, 0x1f, 0xa6, 0xf7,
+                                                     0x28, 0xfc, 0xa7, 0x6, 0x13, 0xdc, 0x79, 0x7,
+                                                     0x25, 0xa, 0xe, 0x43, 0x8b, 0xb5, 0xf8, 0xe1,
+                                                     0xb5, 0x1, 0xb7, 0xf8, 0xe4, 0x3, 0xb7, 0x16,
+                                                     0xf8, 0xcb, 0x6, 0xa4, 0xf7, 0x49, 0x5, 0x6e,
+                                                     0x6, 0x5c, 0x7d, 0x78, 0x2f, 0xfb, 0x1f, 0x1b,
+                                                     0xfb, 0x87, 0x6, 0xf8, 0x31, 0xf8, 0xf0, 0x5,
+                                                     0xa6, 0xfc, 0x9e, 0x7, 0x7c, 0xfb, 0x43, 0x5,
+                                                     0xa4, 0x6, 0xd1, 0x9f, 0x9a, 0xca, 0xf7, 0x12,
+                                                     0x1b, 0xf7, 0x6f, 0x6, 0xfc, 0x41, 0xfc, 0xf8,
+                                                     0x5, 0xe, 0xb2, 0xa0, 0x76, 0xf7, 0xd7, 0xb5,
+                                                     0xf7, 0xc8, 0x77, 0x1, 0xf7, 0x15, 0xf3, 0xf7,
+                                                     0xc2, 0xf3, 0x3, 0xb2, 0x24, 0xa, 0xf7, 0x7b,
+                                                     0xf7, 0xc2, 0xfb, 0x7b, 0x27, 0xa, 0x79, 0xf7,
+                                                     0xb0, 0x9d, 0x7, 0x2a, 0xa, 0xf8, 0x7d, 0x7,
+                                                     0x3c, 0xa, 0xfb, 0x6c, 0xfb, 0xc2, 0xf7, 0x6c,
+                                                     0x26, 0xa, 0xc5, 0x7a, 0xb2, 0xf7, 0xae, 0xce,
+                                                     0xf7, 0xa5, 0xb2, 0x1, 0xb4, 0xf7, 0x6, 0xf8,
+                                                     0x50, 0xf7, 0x8, 0x3, 0xb4, 0xf7, 0xe6, 0x15,
+                                                     0xfb, 0x42, 0xf7, 0x14, 0xfb, 0x49, 0xf7, 0x63,
+                                                     0xf7, 0x63, 0xf7, 0x18, 0xf7, 0x49, 0xf7, 0x42,
+                                                     0xf7, 0x3e, 0xfb, 0x1b, 0xf7, 0x43, 0xfb, 0x60,
+                                                     0xfb, 0x60, 0xfb, 0x17, 0xfb, 0x43, 0xfb, 0x3e,
+                                                     0x1e, 0xf7, 0x6, 0x16, 0xf7, 0x22, 0xbc, 0xf7,
+                                                     0x38, 0xf7, 0x40, 0xf7, 0x41, 0xbd, 0xfb, 0x38,
+                                                     0xfb, 0x22, 0xfb, 0x1a, 0x50, 0xfb, 0x4a, 0xfb,
+                                                     0x38, 0xfb, 0x3d, 0x57, 0xf7, 0x4a, 0xf7, 0x1a,
+                                                     0x1e, 0xd9, 0x35, 0x15, 0x9a, 0x8a, 0x5, 0xad,
+                                                     0x96, 0x9e, 0x9e, 0xb0, 0x1b, 0xf7, 0x12, 0x6,
+                                                     0xb0, 0x9e, 0x78, 0x69, 0x96, 0x1f, 0x9a, 0x8c,
+                                                     0x5, 0x87, 0xac, 0x89, 0xa7, 0xa4, 0x1a, 0xa4,
+                                                     0x8d, 0xa7, 0x8f, 0xab, 0x1e, 0x7c, 0x8c, 0x5,
+                                                     0x6a, 0x80, 0x78, 0x77, 0x66, 0x1b, 0xfb, 0x12,
+                                                     0x6, 0x66, 0x78, 0x9f, 0xac, 0x80, 0x1f, 0x7c,
+                                                     0x8a, 0x5, 0x8f, 0x6b, 0x8d, 0x6f, 0x72, 0x1a,
+                                                     0x72, 0x89, 0x6f, 0x87, 0x6a, 0x1e, 0xe, 0xfb,
+                                                     0xf2, 0x3b, 0xa, 0xf7, 0xe, 0xf3, 0x3, 0xab,
+                                                     0x24, 0xa, 0xf8, 0x7d, 0x26, 0xa, 0xb2, 0x3b,
+                                                     0xa, 0xf7, 0x11, 0xf3, 0xf7, 0x9a, 0xf7, 0x42,
+                                                     0x3, 0xae, 0x24, 0xa, 0xf7, 0x61, 0x7, 0xac,
+                                                     0xa9, 0xf7, 0x66, 0xfb, 0x81, 0x5, 0x9a, 0x79,
+                                                     0x93, 0x7d, 0x80, 0x1a, 0x77, 0x72, 0x82, 0x57,
+                                                     0x1e, 0x79, 0xf7, 0xc4, 0x9d, 0x7, 0x6a, 0x91,
+                                                     0x73, 0x88, 0x43, 0xdc, 0xfb, 0x95, 0xf7, 0xb6,
+                                                     0x18, 0xd5, 0xd0, 0xbd, 0xbb, 0xcd, 0xd0, 0x8,
+                                                     0xc5, 0xc6, 0xae, 0x9e, 0xb8, 0x1b, 0x9d, 0xfb,
+                                                     0x98, 0x79, 0x7, 0xbd, 0xaf, 0x81, 0x74, 0x80,
+                                                     0x84, 0x7c, 0x79, 0x79, 0x1f, 0x3f, 0x3d, 0x3d,
+                                                     0x43, 0x38, 0x47, 0x8, 0xf7, 0x71, 0x26, 0xa,
+                                                     0x8e, 0x8b, 0x9d, 0xf9, 0x28, 0x77, 0x1, 0x91,
+                                                     0xf7, 0x28, 0xf7, 0xdd, 0xf7, 0x59, 0x3, 0x91,
+                                                     0x16, 0xf7, 0x6b, 0x9d, 0x6, 0x6d, 0x66, 0x91,
+                                                     0xb4, 0x97, 0x8e, 0x9a, 0x92, 0x9e, 0x1f, 0xf7,
+                                                     0x26, 0xf8, 0x15, 0xf7, 0x36, 0xfc, 0x17, 0x5,
+                                                     0x91, 0x7c, 0x90, 0x75, 0x81, 0x1a, 0x5f, 0x51,
+                                                     0x8b, 0x7a, 0x1e, 0x79, 0xf7, 0xa4, 0x9d, 0x7,
+                                                     0x80, 0x53, 0xa1, 0xd0, 0x6d, 0x1f, 0xfb, 0x87,
+                                                     0xf8, 0xcd, 0x5, 0x83, 0x6, 0xfb, 0x6c, 0xfc,
+                                                     0xcb, 0x5, 0x52, 0x74, 0x46, 0x67, 0x79, 0x1b,
+                                                     0xe, 0xf7, 0x62, 0x3b, 0xa, 0xf7, 0xd, 0xbc,
+                                                     0xf8, 0x9f, 0xf3, 0x3, 0xa7, 0x16, 0xf7, 0x7c,
+                                                     0x9d, 0x6, 0x58, 0x64, 0xa6, 0xba, 0x1f, 0xf8,
+                                                     0x57, 0x7, 0xf7, 0x98, 0xfc, 0xb3, 0x5, 0x9d,
+                                                     0x6, 0xf7, 0x89, 0xf8, 0xd0, 0x5, 0xfc, 0x74,
+                                                     0x27, 0xa, 0x79, 0xf7, 0xb0, 0x9d, 0x7, 0x54,
+                                                     0x68, 0x94, 0xcc, 0x1f, 0xf8, 0x76, 0x7, 0xd2,
+                                                     0xc8, 0x95, 0xa8, 0x1e, 0x9d, 0xfb, 0x5c, 0x7,
+                                                     0xfb, 0x74, 0xfc, 0x92, 0xfb, 0x7e, 0xf8, 0x92,
+                                                     0x5, 0xfb, 0x5d, 0x79, 0x6, 0xda, 0x85, 0x99,
+                                                     0x65, 0x49, 0x1a, 0xfc, 0x59, 0x7, 0x5c, 0x61,
+                                                     0x70, 0x58, 0x1e, 0xe, 0xb2, 0x98, 0x76, 0xf9,
+                                                     0x3d, 0x77, 0x1, 0xf7, 0xb, 0xbc, 0xf8, 0x31,
+                                                     0xbc, 0x3, 0xa8, 0x83, 0x15, 0xf7, 0x79, 0x9d,
+                                                     0x6, 0x58, 0x64, 0xa6, 0xba, 0x1f, 0xf8, 0x5b,
+                                                     0x7, 0xf8, 0x4c, 0xfc, 0xb7, 0x5, 0xa1, 0xf8,
+                                                     0xe1, 0x6, 0x31, 0xa, 0xfb, 0x79, 0x45, 0xa,
+                                                     0xfc, 0x20, 0x7, 0xfc, 0x13, 0xf8, 0x7c, 0x5,
+                                                     0xfb, 0x3d, 0x79, 0x6, 0xbe, 0x94, 0x79, 0x69,
+                                                     0xa9, 0x1f, 0xfc, 0x9b, 0x7, 0x5c, 0x64, 0x70,
+                                                     0x58, 0x1e, 0xe, 0x65, 0x8b, 0xe8, 0xf7, 0x69,
+                                                     0xea, 0xf7, 0x4a, 0xe5, 0x1, 0xaf, 0x9d, 0xe8,
+                                                     0x9d, 0xf7, 0xc9, 0x9d, 0xe4, 0x9d, 0x3, 0xc7,
+                                                     0xf8, 0x9e, 0x15, 0x9b, 0x6, 0x9d, 0x8e, 0x8d,
+                                                     0xb6, 0xcd, 0x1b, 0xf7, 0xec, 0x6, 0xcd, 0x8e,
+                                                     0x60, 0x79, 0x8e, 0x1f, 0x9b, 0xf7, 0x2b, 0xfc,
+                                                     0x9b, 0x6, 0xe2, 0xfc, 0x3b, 0x15, 0x9d, 0x6,
+                                                     0xbb, 0x8e, 0xa3, 0x93, 0xae, 0x1b, 0xf7, 0x4d,
+                                                     0x6, 0xae, 0xa3, 0x83, 0x5b, 0x8e, 0x1f, 0x9d,
+                                                     0xf7, 0x63, 0x79, 0x6, 0x5b, 0x88, 0x73, 0x83,
+                                                     0x68, 0x1b, 0xfb, 0x4d, 0x6, 0x68, 0x73, 0x93,
+                                                     0xbb, 0x88, 0x1f, 0x79, 0x6, 0xfb, 0x3, 0xfc,
+                                                     0x5d, 0x15, 0xf8, 0xc7, 0xf7, 0x56, 0x79, 0x6,
+                                                     0x47, 0x82, 0x7b, 0x6a, 0x43, 0x1b, 0xfb, 0xdd,
+                                                     0x6, 0x43, 0x77, 0xac, 0xcf, 0x82, 0x1f, 0x79,
+                                                     0x6, 0xe, 0xb2, 0x7a, 0xb2, 0xf9, 0x4, 0xb2,
+                                                     0x1, 0xb4, 0xf7, 0x8, 0xf8, 0x4f, 0xf7, 0x7,
+                                                     0x3, 0xb4, 0xf7, 0xe4, 0x15, 0xfb, 0x42, 0xf7,
+                                                     0x16, 0xfb, 0x47, 0xf7, 0x63, 0xf7, 0x63, 0xf7,
+                                                     0x16, 0xf7, 0x47, 0xf7, 0x42, 0xf7, 0x3e, 0xfb,
+                                                     0x19, 0xf7, 0x47, 0xfb, 0x60, 0xfb, 0x60, 0xfb,
+                                                     0x19, 0xfb, 0x47, 0xfb, 0x3e, 0x1e, 0xf7, 0x8,
+                                                     0x16, 0xf7, 0x1b, 0xc6, 0xf7, 0x43, 0xf7, 0x36,
+                                                     0xf7, 0x3b, 0xc2, 0xfb, 0x3f, 0xfb, 0x20, 0xfb,
+                                                     0x1b, 0x53, 0xfb, 0x46, 0xfb, 0x3a, 0xfb, 0x3c,
+                                                     0x56, 0xf7, 0x48, 0xf7, 0x1a, 0x1e, 0xe, 0xe0,
+                                                     0xa0, 0x76, 0xf9, 0xc, 0xb4, 0x79, 0x9d, 0x12,
+                                                     0xf7, 0x7, 0xf2, 0xf7, 0xe1, 0xf2, 0x13, 0xd8,
+                                                     0xa4, 0x24, 0xa, 0x8a, 0xf8, 0xb0, 0x5, 0xf7,
+                                                     0xe1, 0xfc, 0xb0, 0x6, 0x28, 0xa, 0x79, 0xf7,
+                                                     0xb0, 0x9d, 0x7, 0x2a, 0xa, 0x8a, 0xf8, 0x6f,
+                                                     0x5, 0x13, 0xb8, 0xd4, 0xcc, 0x9a, 0xa5, 0x1e,
+                                                     0x9d, 0xfd, 0x64, 0x79, 0x7, 0xa5, 0xcb, 0x7c,
+                                                     0x42, 0x1f, 0xfc, 0x6f, 0x39, 0xa, 0xfb, 0x13,
+                                                     0xa0, 0x76, 0xf7, 0xc0, 0xb4, 0xf7, 0xb8, 0xb3,
+                                                     0x79, 0x9d, 0x12, 0xf7, 0xa, 0xf3, 0xf7, 0x6a,
+                                                     0xf6, 0x13, 0xdc, 0xa7, 0x24, 0xa, 0xf7, 0x64,
+                                                     0x7, 0xf7, 0xbe, 0x8a, 0xa2, 0xd5, 0xf7, 0xf,
+                                                     0x1a, 0xf7, 0x5, 0x6a, 0xcb, 0xfb, 0x61, 0x33,
+                                                     0xa, 0xf7, 0xe3, 0x15, 0xf7, 0x94, 0x7, 0x13,
+                                                     0xec, 0x9e, 0x9d, 0x90, 0x9c, 0x1e, 0xf7, 0x9,
+                                                     0x8c, 0xc9, 0x77, 0xfb, 0xa, 0x1a, 0xfb, 0x12,
+                                                     0x6b, 0x6e, 0xfb, 0x2d, 0x7f, 0x81, 0x92, 0x90,
+                                                     0x84, 0x1e, 0xe, 0x30, 0x8b, 0xe9, 0xf8, 0xa9,
+                                                     0xb9, 0x1, 0x90, 0x16, 0xf8, 0xb7, 0x6, 0xb0,
+                                                     0xf7, 0x61, 0x5, 0x77, 0x6, 0x2a, 0x6d, 0x5c,
+                                                     0x7d, 0x4b, 0x1b, 0xfb, 0xaf, 0x6, 0xf7, 0x80,
+                                                     0xf7, 0xa7, 0xfb, 0x5d, 0xf7, 0x96, 0x5, 0xf7,
+                                                     0x66, 0x6, 0xee, 0xa6, 0x48, 0x65, 0x95, 0x1f,
+                                                     0x9e, 0x6, 0x81, 0xf7, 0x2b, 0x5, 0xfc, 0x9a,
+                                                     0x6, 0xf7, 0xa1, 0xfb, 0xee, 0x5, 0xe, 0x43,
+                                                     0xa0, 0x76, 0xf9, 0xe, 0xb2, 0x1, 0xae, 0xa3,
+                                                     0xf7, 0x65, 0xf3, 0xf7, 0x65, 0xa2, 0x3, 0xf7,
+                                                     0x46, 0x24, 0xa, 0xf8, 0xb2, 0x7, 0xf7, 0xc,
+                                                     0x8c, 0xe5, 0x6f, 0x8a, 0x20, 0xa5, 0x8d, 0x18,
+                                                     0x86, 0xf7, 0x3f, 0x5, 0xfc, 0xc8, 0x6, 0x86,
+                                                     0xfb, 0x3f, 0xa5, 0x89, 0x8c, 0xf6, 0xdb, 0xa7,
+                                                     0xf7, 0x14, 0x8a, 0x19, 0xfc, 0xb2, 0x39, 0xa,
+                                                     0x92, 0x3b, 0xa, 0xf7, 0xba, 0xf3, 0x3, 0xf7,
+                                                     0x60, 0x24, 0xa, 0xf7, 0x60, 0x7, 0xf7, 0x4d,
+                                                     0xf7, 0xbe, 0x5, 0xca, 0xb2, 0xb0, 0x89, 0xae,
+                                                     0x1b, 0x9d, 0xfb, 0x7c, 0x79, 0x7, 0xbf, 0x9b,
+                                                     0x7f, 0x7c, 0x81, 0x84, 0x7e, 0x84, 0x80, 0x1f,
+                                                     0xfb, 0x20, 0xfb, 0x7b, 0xfb, 0x30, 0xf7, 0x83,
+                                                     0x5, 0x85, 0x95, 0x88, 0x94, 0x92, 0x1a, 0x9d,
+                                                     0xa5, 0x94, 0xbf, 0x1e, 0x9d, 0xfb, 0xbd, 0x79,
+                                                     0x7, 0xc0, 0xac, 0x64, 0x7b, 0x97, 0x1f, 0xf7,
+                                                     0x60, 0xfb, 0xc0, 0x5, 0xfb, 0x64, 0x39, 0xa,
+                                                     0xdb, 0x8b, 0x9d, 0xe2, 0xae, 0xf8, 0x21, 0xaa,
+                                                     0xe2, 0x9d, 0x1, 0xa5, 0xf7, 0xd, 0xf7, 0x4f,
+                                                     0xf1, 0xf7, 0x4f, 0xf7, 0xa, 0x3, 0xf7, 0x7c,
+                                                     0x16, 0xf7, 0xc6, 0x9d, 0x6, 0x32, 0x7e, 0xb4,
+                                                     0xb9, 0x1f, 0xf7, 0x21, 0x8a, 0xf7, 0x38, 0xd5,
+                                                     0xf7, 0x2d, 0x1a, 0xf7, 0x23, 0xfb, 0x2b, 0xe9,
+                                                     0xfb, 0x2e, 0x1e, 0xb9, 0x97, 0xb4, 0xe4, 0x1e,
+                                                     0x9d, 0xfb, 0xc4, 0x79, 0x7, 0xe4, 0x97, 0x62,
+                                                     0x5d, 0x1f, 0xfb, 0x37, 0xfb, 0x25, 0x2f, 0xfb,
+                                                     0x25, 0xfb, 0x2f, 0xf7, 0x35, 0x43, 0xf7, 0x27,
+                                                     0x8c, 0x1f, 0x5d, 0x7e, 0x62, 0x32, 0x1e, 0xf7,
+                                                     0x60, 0xf7, 0xe, 0x15, 0xf8, 0x21, 0x7, 0xf7,
+                                                     0x4, 0xd6, 0x31, 0xfb, 0x8, 0x3d, 0x5a, 0xfb,
+                                                     0x5, 0xfb, 0x1e, 0x1f, 0x25, 0x16, 0xfb, 0x1c,
+                                                     0x58, 0xf7, 0x4, 0xda, 0xf7, 0x1, 0xce, 0xeb,
+                                                     0xf7, 0xc, 0x8c, 0x1f, 0xe, 0xb2, 0xa0, 0x76,
+                                                     0xf9, 0x35, 0x77, 0x12, 0x82, 0xf7, 0x38, 0xfb,
+                                                     0x38, 0xf9, 0x5d, 0xfb, 0x46, 0xf7, 0x35, 0x13,
+                                                     0xe8, 0x82, 0x16, 0xf7, 0x7a, 0x9d, 0x6, 0x59,
+                                                     0x7b, 0x9f, 0xa0, 0x95, 0x90, 0x96, 0x92, 0x94,
+                                                     0x1f, 0xf7, 0x39, 0xf7, 0x5f, 0xf7, 0x21, 0xfb,
+                                                     0x67, 0x5, 0x91, 0x81, 0x8e, 0x82, 0x83, 0x1a,
+                                                     0x76, 0x72, 0x7c, 0x56, 0x1e, 0x79, 0x7, 0x13,
+                                                     0xd0, 0xf7, 0xc0, 0x9d, 0x6, 0x62, 0x5f, 0xb9,
+                                                     0x9b, 0x7f, 0x1f, 0xfb, 0x67, 0xf7, 0xbb, 0xf7,
+                                                     0x42, 0xf7, 0x65, 0x5, 0x13, 0xf0, 0xae, 0xa9,
+                                                     0xc7, 0xaf, 0xa6, 0x1b, 0x9d, 0xfb, 0x7c, 0x79,
+                                                     0x7, 0xc0, 0x9d, 0x7e, 0x7a, 0x7d, 0x83, 0x7c,
+                                                     0x82, 0x7f, 0x1f, 0xfb, 0x20, 0xfb, 0x3f, 0xfb,
+                                                     0xf, 0xf7, 0x47, 0x5, 0x84, 0x96, 0x89, 0x95,
+                                                     0x94, 0x1a, 0x9f, 0xa4, 0x98, 0xc0, 0x1e, 0x9d,
+                                                     0xfb, 0xc0, 0x79, 0x7, 0xb8, 0xb7, 0x5b, 0x7b,
+                                                     0x97, 0x1f, 0xf7, 0x51, 0xfb, 0x96, 0xfb, 0x5d,
+                                                     0xfb, 0x88, 0x5, 0x66, 0x6c, 0x51, 0x69, 0x73,
+                                                     0x1b, 0xe, 0xf7, 0x4, 0xa0, 0x76, 0xf7, 0xb6,
+                                                     0xb3, 0xf7, 0xd9, 0x9d, 0x96, 0x77, 0x12, 0xd2,
+                                                     0xf7, 0x7, 0xf7, 0x34, 0xf3, 0xf7, 0x34, 0xf7,
+                                                     0x7, 0x14, 0xe, 0x13, 0xde, 0xf7, 0x94, 0x24,
+                                                     0xa, 0xf7, 0x5a, 0x7, 0xf7, 0x1b, 0xf7, 0x20,
+                                                     0xad, 0xf7, 0x20, 0xf7, 0x5, 0x82, 0xe4, 0xcc,
+                                                     0x1f, 0x9d, 0x7, 0xfb, 0x19, 0x65, 0x3a, 0xfb,
+                                                     0x1b, 0xfb, 0x12, 0x29, 0x80, 0x4d, 0x8a, 0x1f,
+                                                     0xf7, 0x8f, 0x7, 0x13, 0xee, 0x3c, 0xa, 0xfb,
+                                                     0x8f, 0x7, 0x4d, 0x8c, 0x29, 0x96, 0xf7, 0x12,
+                                                     0x1a, 0x13, 0xde, 0xf7, 0x1e, 0x6c, 0xd9, 0xfb,
+                                                     0x20, 0x1e, 0x79, 0x7, 0xd2, 0x7c, 0x33, 0xfb,
+                                                     0x6, 0xfb, 0x21, 0xf7, 0x1f, 0x6a, 0xf7, 0x1c,
+                                                     0x1f, 0xfb, 0x5a, 0x39, 0xa, 0x57, 0x79, 0xad,
+                                                     0x69, 0xd1, 0xf8, 0x26, 0xb9, 0x12, 0xb4, 0xf5,
+                                                     0x13, 0x70, 0xf8, 0x4e, 0xf6, 0x15, 0x49, 0xae,
+                                                     0xa5, 0x50, 0xb7, 0x1b, 0xd4, 0x8d, 0xf7, 0x4,
+                                                     0xb6, 0x1f, 0x79, 0x6, 0x7d, 0x8c, 0x76, 0x44,
+                                                     0x6b, 0x1b, 0x69, 0x6b, 0xcb, 0xc1, 0x7d, 0x1f,
+                                                     0xf7, 0x7, 0xf7, 0xde, 0x5, 0x33, 0x6, 0x4b,
+                                                     0xfb, 0x53, 0x5, 0xdc, 0x7c, 0x55, 0xf7, 0x2,
+                                                     0xfb, 0x2, 0x1b, 0xfb, 0x22, 0x42, 0xfb, 0x0,
+                                                     0xfb, 0x13, 0xfb, 0x35, 0xaf, 0xfb, 0xe, 0xf7,
+                                                     0x3b, 0xea, 0xe1, 0xeb, 0xa8, 0x9c, 0x1f, 0x68,
+                                                     0xf7, 0x8, 0x15, 0x13, 0xb0, 0x20, 0x70, 0x40,
+                                                     0x27, 0x4f, 0x1b, 0x2b, 0x89, 0xf7, 0x42, 0xd4,
+                                                     0xf4, 0x92, 0xe1, 0xf3, 0xd1, 0xcc, 0xfb, 0x28,
+                                                     0x38, 0x99, 0x1f, 0xe, 0xfb, 0x5e, 0x76, 0xf7,
+                                                     0x61, 0xbb, 0xf8, 0x5, 0xc2, 0xf7, 0x91, 0xad,
+                                                     0x12, 0xd8, 0xd9, 0xf7, 0x61, 0xf2, 0x56, 0xf4,
+                                                     0x13, 0xfa, 0xf7, 0x32, 0xb0, 0x15, 0xbd, 0x65,
+                                                     0xc9, 0x79, 0xc6, 0x8c, 0x8, 0xe8, 0x8c, 0xe8,
+                                                     0xda, 0xf7, 0x1e, 0x1a, 0xf2, 0x55, 0xe1, 0x2f,
+                                                     0xb6, 0x1e, 0x13, 0xfc, 0xc8, 0xa2, 0xac, 0xc7,
+                                                     0xc8, 0x1a, 0xf7, 0x7, 0x34, 0xbd, 0xfb, 0x0,
+                                                     0x3c, 0xfb, 0x4, 0x51, 0x28, 0x1e, 0xfd, 0x23,
+                                                     0x7, 0x58, 0x80, 0x59, 0x86, 0x58, 0x1e, 0xe2,
+                                                     0x6, 0x8e, 0xa4, 0x90, 0xa4, 0xa4, 0x1a, 0x8a,
+                                                     0xf7, 0x85, 0x15, 0xf8, 0x8c, 0x7, 0xc7, 0xbc,
+                                                     0xbd, 0xc0, 0xd6, 0xa6, 0x4f, 0x49, 0x8c, 0x1e,
+                                                     0x5c, 0x8c, 0x7b, 0x3b, 0x65, 0x7a, 0x77, 0x91,
+                                                     0x74, 0x1b, 0x77, 0x78, 0x81, 0x74, 0x73, 0x9e,
+                                                     0x81, 0xa0, 0x1f, 0xa3, 0x9e, 0x91, 0x9f, 0x1b,
+                                                     0x13, 0xfa, 0xc0, 0xb9, 0xfb, 0x3a, 0x4b, 0x40,
+                                                     0x6a, 0x4b, 0x31, 0x59, 0x54, 0xa6, 0xaf, 0x70,
+                                                     0x1f, 0xe, 0xfb, 0xa4, 0xfb, 0x60, 0x76, 0xf9,
+                                                     0x1b, 0xd8, 0x1, 0x90, 0x9b, 0xf7, 0x32, 0xf7,
+                                                     0xb, 0x3, 0xf7, 0x83, 0xc7, 0x15, 0x78, 0x5a,
+                                                     0x62, 0x2b, 0x45, 0x1a, 0x63, 0x9e, 0x6d, 0xa7,
+                                                     0xbd, 0xa1, 0xca, 0xc1, 0xcf, 0x7c, 0xd4, 0x88,
+                                                     0xa4, 0x1e, 0xf7, 0x60, 0xf8, 0x4d, 0x5, 0x23,
+                                                     0x6, 0xfb, 0x5, 0xfb, 0xf9, 0x5, 0x89, 0x6,
+                                                     0xe8, 0x79, 0x6c, 0xf7, 0x9c, 0xfb, 0x0, 0x1b,
+                                                     0x4c, 0x65, 0x54, 0x3d, 0x8a, 0x1f, 0x74, 0x8b,
+                                                     0x77, 0x8a, 0x7b, 0x1e, 0x9b, 0x6, 0xb3, 0x8e,
+                                                     0x9a, 0xd6, 0xc0, 0x1b, 0xef, 0xad, 0xfb, 0x9f,
+                                                     0x2c, 0x98, 0x1f, 0xe, 0xfb, 0x51, 0x78, 0xba,
+                                                     0xf9, 0x34, 0xb3, 0x12, 0xb3, 0xee, 0x61, 0xbc,
+                                                     0xf7, 0x82, 0xec, 0x13, 0xe8, 0xf7, 0x93, 0xf8,
+                                                     0x53, 0x15, 0xfb, 0x2b, 0x68, 0x4b, 0x34, 0xfb,
+                                                     0x17, 0x1a, 0x25, 0xe7, 0xfb, 0x3, 0xf7, 0x18,
+                                                     0xf7, 0xb, 0xed, 0xf7, 0x0, 0xf7, 0x8, 0xf7,
+                                                     0xf, 0x54, 0xcf, 0x43, 0xc4, 0x1e, 0x13, 0xd8,
+                                                     0x21, 0xde, 0x25, 0xb9, 0xcf, 0x1a, 0xa7, 0xb1,
+                                                     0xa1, 0xad, 0xb2, 0xa4, 0x7b, 0x77, 0x9d, 0x1e,
+                                                     0x6b, 0xa9, 0x9a, 0x60, 0xb5, 0x1b, 0xa8, 0xa3,
+                                                     0x9c, 0xaa, 0xcf, 0xfb, 0xa, 0xae, 0x3d, 0x4b,
+                                                     0x38, 0x78, 0x40, 0x33, 0xf7, 0x2, 0x58, 0xbb,
+                                                     0x4f, 0x1f, 0xaa, 0x6e, 0x15, 0x97, 0x88, 0xe6,
+                                                     0x24, 0x86, 0xfb, 0x2, 0x8, 0x32, 0x87, 0x5f,
+                                                     0x36, 0x41, 0x1b, 0x66, 0x6d, 0xa4, 0xad, 0x77,
+                                                     0x1f, 0x13, 0xe8, 0x76, 0xae, 0x7c, 0xb7, 0xb1,
+                                                     0x1a, 0xef, 0xb0, 0xe0, 0xf7, 0x2, 0xa8, 0x1e,
+                                                     0xe, 0xfb, 0x88, 0x78, 0xb9, 0xf7, 0x58, 0xba,
+                                                     0x64, 0xbc, 0xf7, 0x4e, 0xaf, 0x12, 0xa1, 0xf3,
+                                                     0x30, 0xe6, 0x13, 0xb8, 0xf7, 0x19, 0xf7, 0x90,
+                                                     0x15, 0x65, 0x86, 0x42, 0x66, 0x30, 0x1a, 0x28,
+                                                     0xf7, 0x4, 0x64, 0xe6, 0xf7, 0x4, 0xe5, 0xa7,
+                                                     0xed, 0x1e, 0x71, 0x92, 0x5, 0x49, 0x77, 0x63,
+                                                     0x76, 0x4f, 0x1b, 0x4d, 0x8a, 0x2e, 0xa6, 0xdb,
+                                                     0x1a, 0xc5, 0xb0, 0xb3, 0xce, 0x1e, 0x13, 0xd8,
+                                                     0xa6, 0x97, 0x83, 0xb0, 0x1b, 0x9d, 0x9b, 0x94,
+                                                     0xa2, 0x1f, 0x13, 0xb8, 0x9d, 0x79, 0x92, 0x79,
+                                                     0x1e, 0x13, 0xd4, 0x67, 0x7c, 0x81, 0x6f, 0x1b,
+                                                     0x5a, 0x5a, 0xb1, 0xcf, 0xb2, 0xb3, 0xbe, 0xc0,
+                                                     0x1f, 0xaf, 0x8c, 0xab, 0x76, 0x92, 0x6e, 0x8,
+                                                     0x5c, 0x96, 0xa8, 0x86, 0x9e, 0x1b, 0xa4, 0x9c,
+                                                     0xa2, 0xa5, 0xc5, 0x30, 0xa9, 0x53, 0x37, 0xfb,
+                                                     0x16, 0x67, 0x20, 0x1f, 0x8c, 0x55, 0xb7, 0x69,
+                                                     0xc0, 0x78, 0x8, 0xe, 0xfb, 0x51, 0xfb, 0x75,
+                                                     0xef, 0xf7, 0x17, 0xed, 0xf9, 0x20, 0x77, 0x12,
+                                                     0xc7, 0xbb, 0x85, 0xc6, 0xf7, 0x9c, 0xb5, 0x13,
+                                                     0xf4, 0xf7, 0x59, 0xf8, 0xdc, 0x15, 0x3c, 0x33,
+                                                     0x51, 0xfb, 0x35, 0x2d, 0x1a, 0xfb, 0x54, 0xf7,
+                                                     0x0, 0x60, 0xf7, 0x44, 0xb8, 0xaf, 0x77, 0x62,
+                                                     0x70, 0x76, 0x43, 0x51, 0x98, 0x1e, 0x8e, 0x7c,
+                                                     0x68, 0x98, 0x72, 0x1b, 0x63, 0x7d, 0x6f, 0x77,
+                                                     0x63, 0xc0, 0x7f, 0xaa, 0xf1, 0xcb, 0xd9, 0xf7,
+                                                     0xd, 0xf7, 0x12, 0xfb, 0x13, 0x8f, 0xfb, 0x2,
+                                                     0xfb, 0x2, 0x7f, 0xec, 0xb7, 0xf7, 0x20, 0xce,
+                                                     0xf7, 0x2, 0xcc, 0xe2, 0x1f, 0xbe, 0x86, 0xf7,
+                                                     0x23, 0xbc, 0xc5, 0x1a, 0xab, 0x77, 0x9a, 0x73,
+                                                     0x4f, 0x27, 0x25, 0x7c, 0x7f, 0x1e, 0x13, 0xec,
+                                                     0x72, 0x8e, 0x6b, 0xa2, 0xae, 0x1a, 0xb2, 0xb5,
+                                                     0x9e, 0x96, 0x90, 0x1e, 0x89, 0x9d, 0x5, 0x67,
+                                                     0x41, 0x58, 0x5d, 0x72, 0xa1, 0x66, 0xd4, 0x7e,
+                                                     0x1f, 0xe, 0x3b, 0xfb, 0x49, 0x76, 0xf7, 0x73,
+                                                     0x76, 0xf8, 0x4f, 0xd2, 0x62, 0x76, 0x12, 0x8b,
+                                                     0x9d, 0xf2, 0xe0, 0xf7, 0x61, 0xe4, 0x13, 0xee,
+                                                     0xf7, 0xd, 0x16, 0xe0, 0xf7, 0xeb, 0x6, 0xb7,
+                                                     0x9e, 0xac, 0xc3, 0xbe, 0x1b, 0xc6, 0xb3, 0x74,
+                                                     0x41, 0x8e, 0x1f, 0x99, 0xfc, 0x5c, 0x8d, 0x56,
+                                                     0x92, 0x7c, 0x8f, 0x73, 0x19, 0xe4, 0x6, 0x82,
+                                                     0x9e, 0x84, 0xb7, 0x97, 0x1a, 0x80, 0xf8, 0x85,
+                                                     0x5, 0xda, 0x89, 0x5b, 0xcc, 0x39, 0x1b, 0x40,
+                                                     0x4f, 0x6f, 0x33, 0x6d, 0x1f, 0xbf, 0x8e, 0x6c,
+                                                     0xc3, 0x53, 0x1b, 0x36, 0x69, 0x39, 0x4b, 0x1f,
+                                                     0x9d, 0x6, 0x13, 0xde, 0xa9, 0x8c, 0xa0, 0xc9,
+                                                     0xae, 0x1b, 0xb3, 0x91, 0x52, 0x58, 0x1f, 0xe,
+                                                     0xfb, 0x36, 0x7a, 0xb1, 0xf7, 0xbb, 0xbf, 0xf7,
+                                                     0xb4, 0xad, 0x1, 0xb6, 0xf1, 0xf7, 0x86, 0xed,
+                                                     0x3, 0xf7, 0x9f, 0x7a, 0x15, 0xf7, 0x3f, 0xba,
+                                                     0xf7, 0x71, 0xf7, 0x1d, 0xf7, 0x24, 0x4f, 0xf7,
+                                                     0x61, 0xfb, 0x34, 0xfb, 0x35, 0x4e, 0xfb, 0x70,
+                                                     0xfb, 0x11, 0xfb, 0x18, 0xc5, 0xfb, 0x7a, 0xf7,
+                                                     0x3a, 0x1f, 0xfb, 0xe, 0xf8, 0x15, 0x15, 0xf7,
+                                                     0x1d, 0xae, 0xf7, 0x2b, 0xe1, 0xf0, 0x9e, 0xfb,
+                                                     0x49, 0x20, 0x8c, 0x1e, 0xfb, 0x85, 0x57, 0x15,
+                                                     0xf7, 0x84, 0x6, 0x32, 0x71, 0xfb, 0x62, 0x2e,
+                                                     0x2c, 0x71, 0xf7, 0x65, 0xe1, 0x1e, 0xe, 0xfb,
+                                                     0xf6, 0x7a, 0xbd, 0xf8, 0x6a, 0x77, 0x1, 0xe3,
+                                                     0xe0, 0x3, 0xf7, 0xd5, 0xf0, 0x15, 0x78, 0x6,
+                                                     0x6e, 0x89, 0x7e, 0x64, 0x61, 0x1b, 0x5a, 0x88,
+                                                     0xce, 0xae, 0x1f, 0xf8, 0x4, 0x7, 0x57, 0x78,
+                                                     0x6c, 0x7b, 0x31, 0x79, 0x8, 0x77, 0x7, 0xab,
+                                                     0xc3, 0x8f, 0xfb, 0x17, 0x1f, 0xfb, 0x78, 0x7,
+                                                     0x5f, 0xa7, 0x5b, 0xcd, 0xf5, 0x93, 0xe8, 0xa4,
+                                                     0x90, 0x1e, 0xe, 0xa0, 0x76, 0xf8, 0x41, 0xd3,
+                                                     0x48, 0xa0, 0x12, 0xf7, 0xb, 0xd6, 0x13, 0xd0,
+                                                     0xf7, 0xb, 0x16, 0xd6, 0xf7, 0x96, 0x6, 0xf7,
+                                                     0x2f, 0xfb, 0x55, 0x5, 0x92, 0x82, 0x90, 0x81,
+                                                     0x83, 0x1a, 0x80, 0x81, 0x82, 0x6f, 0x1e, 0x79,
+                                                     0xf7, 0x7f, 0x9d, 0x7, 0x50, 0x71, 0xaf, 0xb0,
+                                                     0x6c, 0x1f, 0xfb, 0x3c, 0xf7, 0x6a, 0xbe, 0xbe,
+                                                     0xaa, 0xa6, 0xab, 0xa6, 0x19, 0x99, 0x9c, 0x96,
+                                                     0x90, 0x95, 0x1b, 0x97, 0x8a, 0x95, 0x81, 0x9e,
+                                                     0x7e, 0x93, 0x84, 0x9b, 0x87, 0x9b, 0x8c, 0x8,
+                                                     0xa4, 0x8c, 0xa5, 0x98, 0xb0, 0x1a, 0xaf, 0x62,
+                                                     0x9e, 0x6a, 0x6f, 0x6d, 0x80, 0x7b, 0x78, 0x1e,
+                                                     0x41, 0x4f, 0x48, 0x49, 0x43, 0x4b, 0x8, 0x13,
+                                                     0x50, 0xf7, 0x6d, 0x7, 0x13, 0xb0, 0x39, 0x69,
+                                                     0x65, 0x82, 0x62, 0x88, 0x8, 0x76, 0x7, 0xae,
+                                                     0x8a, 0xbe, 0x85, 0x35, 0x1a, 0xe, 0x7a, 0xe2,
+                                                     0xf8, 0xe5, 0xd7, 0x1, 0xc6, 0x9e, 0xf7, 0x67,
+                                                     0xb1, 0xf7, 0x5e, 0x9e, 0x3, 0xa3, 0x7a, 0x15,
+                                                     0xe7, 0x6, 0xf7, 0x3f, 0xf8, 0x12, 0x5, 0x8d,
+                                                     0x6, 0xfb, 0x24, 0xaa, 0x89, 0xfb, 0x82, 0xf7,
+                                                     0xf, 0x1b, 0xe1, 0xa0, 0xf6, 0xd4, 0x1f, 0x78,
+                                                     0x6, 0x70, 0x8a, 0x77, 0x41, 0x57, 0x1b, 0x62,
+                                                     0x6e, 0xba, 0xb6, 0x7f, 0x1f, 0x5f, 0xf7, 0x30,
+                                                     0x65, 0xf7, 0x51, 0x60, 0xf7, 0x3a, 0x8, 0xb5,
+                                                     0x80, 0x6b, 0xad, 0x5a, 0x1b, 0x45, 0x6d, 0xfb,
+                                                     0x12, 0x56, 0x8d, 0x1f, 0x9e, 0x6, 0xa3, 0x8a,
+                                                     0xa3, 0xda, 0xc1, 0x1b, 0xbf, 0xaa, 0x2f, 0x42,
+                                                     0x9c, 0x1f, 0xe, 0xfb, 0x36, 0x90, 0x76, 0xf8,
+                                                     0x9f, 0x77, 0x1, 0xf7, 0x7c, 0x7b, 0x15, 0xb0,
+                                                     0x6, 0xa1, 0xb7, 0xe2, 0xf7, 0x44, 0xc1, 0xf7,
+                                                     0x2, 0x8, 0xa5, 0xc0, 0x9c, 0xb5, 0xb5, 0x1a,
+                                                     0xa6, 0x82, 0xa8, 0x5d, 0x58, 0x89, 0x50, 0x5a,
+                                                     0x94, 0x1e, 0x8f, 0x75, 0x8e, 0x7a, 0x7c, 0x1a,
+                                                     0x6d, 0x83, 0x74, 0x78, 0x66, 0x1e, 0x3f, 0xfb,
+                                                     0x2c, 0xfb, 0x32, 0xf8, 0x28, 0x51, 0x72, 0x88,
+                                                     0x8c, 0x45, 0x84, 0x19, 0x78, 0x7, 0xb4, 0x86,
+                                                     0xa4, 0x87, 0x99, 0x67, 0x8, 0xe, 0xfb, 0x52,
+                                                     0xfb, 0x5f, 0x76, 0xf7, 0x70, 0xeb, 0xf7, 0xb8,
+                                                     0xe7, 0xf7, 0xb6, 0x77, 0x12, 0xa6, 0xbc, 0x7f,
+                                                     0xc0, 0x74, 0xb2, 0xf7, 0xb3, 0xbc, 0x13, 0xfb,
+                                                     0xf7, 0x2d, 0xf8, 0x2e, 0x15, 0x42, 0x50, 0x56,
+                                                     0x53, 0x31, 0x1a, 0xfb, 0x43, 0xf7, 0x37, 0x69,
+                                                     0xf7, 0x28, 0xa7, 0xc1, 0x89, 0x51, 0x53, 0x64,
+                                                     0x6d, 0x68, 0x97, 0x1e, 0x6a, 0x96, 0x72, 0x90,
+                                                     0x79, 0x89, 0x8, 0x6d, 0x89, 0x7c, 0x7b, 0x6e,
+                                                     0x1a, 0x60, 0xc0, 0x81, 0xa6, 0xf4, 0xc6, 0xdc,
+                                                     0xf7, 0xd, 0xd7, 0x43, 0xb1, 0x3d, 0xfb, 0x3d,
+                                                     0x41, 0xc8, 0xce, 0xe1, 0xe1, 0xd5, 0xb2, 0x9b,
+                                                     0x1e, 0x85, 0x8c, 0xb8, 0x85, 0xbb, 0x1b, 0xc6,
+                                                     0xc1, 0x97, 0xb9, 0xa6, 0x6b, 0x92, 0x72, 0x51,
+                                                     0x39, 0x6c, 0x7c, 0x71, 0x1f, 0x64, 0xa3, 0x7e,
+                                                     0xac, 0xab, 0x1a, 0xb5, 0xa8, 0xb3, 0xaa, 0x98,
+                                                     0x1e, 0xad, 0x85, 0xf7, 0x19, 0xb0, 0xc0, 0x1a,
+                                                     0xa1, 0x7e, 0x9b, 0x6f, 0x5a, 0x45, 0x4f, 0x73,
+                                                     0x6e, 0x1e, 0x13, 0xf5, 0x6e, 0x8d, 0x72, 0x9c,
+                                                     0xa7, 0x1a, 0xac, 0x9e, 0x96, 0x97, 0x90, 0x1e,
+                                                     0x89, 0x9d, 0x5, 0x58, 0x6c, 0x6c, 0x62, 0x64,
+                                                     0xb6, 0x6e, 0xa9, 0x83, 0x1f, 0x13, 0xfb, 0x6f,
+                                                     0x6b, 0x7c, 0x68, 0x68, 0x1a, 0x66, 0x9d, 0x66,
+                                                     0xb4, 0x6b, 0x1e, 0xe, 0x78, 0xb7, 0xf8, 0x4f,
+                                                     0xaa, 0x1, 0xae, 0xea, 0xf7, 0xad, 0xe5, 0x3,
+                                                     0xae, 0xf7, 0x80, 0x15, 0xfb, 0xe, 0xef, 0xfb,
+                                                     0x19, 0xf7, 0x21, 0xf7, 0x23, 0xdd, 0xf7, 0x17,
+                                                     0xf7, 0x2a, 0xf7, 0x24, 0x20, 0xe8, 0xfb, 0x1b,
+                                                     0xfb, 0x1d, 0x34, 0xfb, 0x1b, 0xfb, 0x14, 0x1e,
+                                                     0xea, 0xaa, 0x15, 0xde, 0xa1, 0xf7, 0xa, 0xf0,
+                                                     0xf7, 0xd, 0xb0, 0xfb, 0x34, 0x29, 0x33, 0x68,
+                                                     0x2a, 0x30, 0xfb, 0x2, 0x5e, 0xf7, 0x28, 0xe9,
+                                                     0x1e, 0xe, 0x78, 0xe9, 0xf7, 0xda, 0xe1, 0x1,
+                                                     0x95, 0xf7, 0xdc, 0x15, 0x9c, 0x6, 0xc4, 0xab,
+                                                     0x9c, 0x9b, 0xa7, 0x1b, 0xc4, 0x6, 0x6e, 0xfb,
+                                                     0x6c, 0x8b, 0x6d, 0x7c, 0x73, 0x8, 0x77, 0x6b,
+                                                     0x64, 0x72, 0x63, 0x1a, 0x7d, 0x95, 0x64, 0xb8,
+                                                     0xb2, 0x9a, 0xa7, 0xb4, 0x94, 0x1e, 0x97, 0xc1,
+                                                     0x9d, 0xf7, 0x2, 0x9b, 0xf7, 0x4f, 0x8, 0xf7,
+                                                     0x5, 0x6, 0x7a, 0xfb, 0x35, 0x5, 0x3a, 0x82,
+                                                     0x87, 0xfb, 0x46, 0xf7, 0x9, 0x1b, 0xd3, 0xaf,
+                                                     0xd8, 0xf2, 0x1f, 0x76, 0x6, 0x76, 0x78, 0x4a,
+                                                     0x5c, 0x66, 0x75, 0xbf, 0xb2, 0xb1, 0x8b, 0xdb,
+                                                     0x97, 0xf7, 0x9, 0x1e, 0xf7, 0x1a, 0xe1, 0xfc,
+                                                     0x11, 0x6, 0x33, 0x63, 0xfb, 0x0, 0x58, 0x80,
+                                                     0x1f, 0xe, 0xfb, 0x65, 0x76, 0xf9, 0x36, 0xc2,
+                                                     0x1, 0xc6, 0xe3, 0xf7, 0x91, 0xe5, 0x3, 0xf7,
+                                                     0x27, 0xb3, 0x15, 0xb0, 0x69, 0xab, 0x6f, 0xca,
+                                                     0x8c, 0x8, 0xf7, 0x2b, 0x8d, 0xc7, 0xef, 0xf7,
+                                                     0x4a, 0x1a, 0xf7, 0x4f, 0x45, 0xbc, 0xfb, 0x2d,
+                                                     0xfb, 0x1c, 0x40, 0x26, 0xfb, 0xa, 0x8c, 0x1e,
+                                                     0x8f, 0xfc, 0x3b, 0x5, 0x6d, 0x87, 0x69, 0x84,
+                                                     0x74, 0x1e, 0xe2, 0x6, 0x95, 0xb3, 0x8b, 0xae,
+                                                     0xb3, 0x1a, 0x88, 0xf7, 0x70, 0x15, 0x85, 0xf7,
+                                                     0x7b, 0x5, 0xc2, 0x8a, 0xab, 0xc0, 0xc2, 0x1b,
+                                                     0xf7, 0x18, 0xb7, 0x4f, 0xfb, 0x22, 0xfb, 0x7,
+                                                     0x6d, 0x30, 0xfb, 0xd, 0x64, 0x5d, 0xa2, 0xb9,
+                                                     0x77, 0x1f, 0xe, 0xfb, 0x88, 0xfb, 0x68, 0x76,
+                                                     0xf7, 0x75, 0xf4, 0xf7, 0xbe, 0xf4, 0x3b, 0xdb,
+                                                     0x12, 0xb3, 0xb5, 0xf7, 0xd0, 0xb1, 0x13, 0xdc,
+                                                     0xb3, 0xf7, 0x66, 0x15, 0xfb, 0x15, 0xd4, 0x32,
+                                                     0xf7, 0x1b, 0xf7, 0xa, 0xab, 0x74, 0x62, 0x68,
+                                                     0x78, 0x66, 0x65, 0x8a, 0x1e, 0x7d, 0x7c, 0x90,
+                                                     0x91, 0x7b, 0x1f, 0x91, 0x7b, 0x7a, 0x92, 0x7b,
+                                                     0x1b, 0x72, 0x71, 0x78, 0x68, 0x6c, 0xaa, 0x70,
+                                                     0xbe, 0xd3, 0xe1, 0xd2, 0xf7, 0x5, 0xf1, 0x50,
+                                                     0xb7, 0x34, 0x20, 0x26, 0x88, 0xf7, 0x1f, 0xf1,
+                                                     0xca, 0xdf, 0xdc, 0x8c, 0x1f, 0x9f, 0xa0, 0x84,
+                                                     0x84, 0xa0, 0x1f, 0x13, 0xec, 0x85, 0x9c, 0x9c,
+                                                     0x86, 0x9a, 0x1b, 0xb9, 0xa9, 0x9c, 0xa7, 0xbe,
+                                                     0x52, 0x94, 0x62, 0xfb, 0x38, 0xfb, 0x3, 0xfb,
+                                                     0x14, 0xfb, 0x36, 0x1f, 0xe, 0x3b, 0x76, 0xb7,
+                                                     0xf8, 0x1b, 0xe1, 0x1, 0xa9, 0xf0, 0xf7, 0xc2,
+                                                     0xe9, 0x3, 0xf8, 0xe0, 0xf8, 0x32, 0x15, 0xe1,
+                                                     0xfb, 0x97, 0x7, 0xfb, 0x14, 0xfb, 0x3f, 0x42,
+                                                     0xfb, 0x31, 0xfb, 0x17, 0xd9, 0xfb, 0x34, 0xf7,
+                                                     0x43, 0xf7, 0x4e, 0xc5, 0xf7, 0xc, 0xec, 0xee,
+                                                     0x46, 0xd1, 0x34, 0xba, 0x1f, 0x8d, 0x7, 0x56,
+                                                     0x16, 0xe0, 0x40, 0xa9, 0x48, 0xfb, 0x0, 0x1a,
+                                                     0x3e, 0x60, 0x4b, 0x3b, 0x2b, 0x38, 0xf7, 0xd,
+                                                     0xf7, 0xa, 0xf1, 0xe7, 0xbd, 0xea, 0x1e, 0xe,
+                                                     0xfb, 0x88, 0x78, 0xe8, 0xf7, 0xe1, 0xe8, 0x1,
+                                                     0xf7, 0x4a, 0xd5, 0x3, 0xa7, 0xf7, 0xc1, 0x15,
+                                                     0xaf, 0x98, 0xb0, 0xd1, 0xad, 0x1b, 0xe6, 0x6,
+                                                     0x85, 0x56, 0x7c, 0xfb, 0x11, 0x28, 0x1a, 0x23,
+                                                     0xb5, 0x5e, 0xc6, 0xe8, 0x9d, 0xf7, 0x7, 0xcd,
+                                                     0x87, 0x1e, 0x79, 0x6, 0x84, 0x62, 0x7d, 0x5b,
+                                                     0x5d, 0x8c, 0x58, 0x8c, 0x81, 0xca, 0x8f, 0xbd,
+                                                     0x9b, 0xf7, 0x70, 0x18, 0xf7, 0x2e, 0x8a, 0x5,
+                                                     0xe8, 0xfb, 0x7f, 0x7, 0x66, 0x60, 0x7b, 0x6f,
+                                                     0x72, 0x1f, 0x6b, 0x67, 0x7c, 0x62, 0x76, 0x3d,
+                                                     0x8, 0xe, 0x20, 0x79, 0xbb, 0xf8, 0x71, 0x77,
+                                                     0x1, 0xf7, 0x21, 0xe1, 0xf7, 0x79, 0xda, 0x3,
+                                                     0x92, 0xf7, 0xee, 0x15, 0xa1, 0x6, 0x97, 0xac,
+                                                     0x9e, 0xbd, 0xaf, 0x8c, 0x8, 0x98, 0x96, 0x7b,
+                                                     0x7f, 0x8d, 0x1f, 0x92, 0x66, 0x97, 0xfb, 0x2,
+                                                     0x40, 0x1a, 0x26, 0xc7, 0x2a, 0xf7, 0xc, 0xf7,
+                                                     0x21, 0xd4, 0xf7, 0x9, 0xf7, 0x26, 0xf7, 0x3,
+                                                     0x65, 0xe2, 0xfb, 0x2c, 0xcb, 0x1e, 0x85, 0x7a,
+                                                     0x5, 0x9d, 0x89, 0xee, 0x4f, 0xfb, 0x47, 0x1a,
+                                                     0x28, 0x73, 0xfb, 0xc, 0x2f, 0x4b, 0x5a, 0xcb,
+                                                     0xd9, 0xc7, 0x82, 0xf7, 0x14, 0x81, 0xd3, 0x1e,
+                                                     0xbc, 0x84, 0x6e, 0xa5, 0x65, 0x1b, 0x38, 0x69,
+                                                     0x2f, 0x46, 0x81, 0x1f, 0xe, 0xfb, 0x36, 0xfb,
+                                                     0x5f, 0x76, 0xfa, 0x13, 0x77, 0x1, 0xa6, 0xe6,
+                                                     0xf7, 0x8, 0xbb, 0x5e, 0xb8, 0xf7, 0xc, 0xe3,
+                                                     0x3, 0xf7, 0x85, 0x7e, 0x15, 0x8d, 0xfb, 0x5b,
+                                                     0xb2, 0x7f, 0x5, 0xf7, 0x67, 0x7, 0xb5, 0xf7,
+                                                     0x3a, 0xaa, 0xf7, 0x7c, 0xf7, 0x46, 0xfb, 0x2a,
+                                                     0xd3, 0x51, 0x1f, 0xf7, 0x2e, 0x7, 0x5a, 0x9c,
+                                                     0x8d, 0xfb, 0x3f, 0x5, 0x68, 0xfb, 0x41, 0x63,
+                                                     0xfb, 0x70, 0xfb, 0x52, 0xf7, 0x24, 0x4c, 0xd1,
+                                                     0x1f, 0xb4, 0xb0, 0x15, 0xf8, 0x4c, 0x7, 0x9b,
+                                                     0xf3, 0x55, 0xfb, 0x3c, 0xfb, 0x48, 0x28, 0x67,
+                                                     0x76, 0x89, 0x1f, 0x61, 0x16, 0x72, 0x2a, 0xb8,
+                                                     0xf7, 0x40, 0xf7, 0x3e, 0xe9, 0xc0, 0xa2, 0x1f,
+                                                     0xe, 0xfb, 0x7b, 0xe3, 0xf8, 0xca, 0xd7, 0x1,
+                                                     0x98, 0xfb, 0x7b, 0x15, 0xf1, 0x6, 0xf7, 0x2e,
+                                                     0xf7, 0xae, 0x5, 0x8d, 0x6, 0x3a, 0x9a, 0xa1,
+                                                     0xfb, 0x5d, 0xe9, 0x1b, 0xe7, 0xa5, 0xf7, 0x1f,
+                                                     0xbf, 0x8d, 0x1f, 0x78, 0x6, 0x6f, 0x8a, 0x6c,
+                                                     0x40, 0x4e, 0x1b, 0x3c, 0x71, 0xf7, 0x5c, 0xb5,
+                                                     0x82, 0x1f, 0xf7, 0x76, 0xf8, 0x24, 0x5, 0x25,
+                                                     0x6, 0xfb, 0x2f, 0xfb, 0xa1, 0x5, 0xf7, 0x20,
+                                                     0x73, 0x79, 0xf7, 0x15, 0x25, 0x1b, 0x34, 0x7b,
+                                                     0xfb, 0x1f, 0x5a, 0x85, 0x1f, 0x9d, 0x6, 0xa8,
+                                                     0x90, 0xa3, 0xde, 0xbe, 0x1b, 0xdb, 0xa8, 0xfb,
+                                                     0x43, 0x46, 0x9e, 0x1f, 0xe, 0x8e, 0xfb, 0x63,
+                                                     0x76, 0xf9, 0x6c, 0x77, 0x1, 0xf7, 0xd9, 0xca,
+                                                     0x3, 0xf7, 0xd9, 0x70, 0x15, 0xfb, 0x5d, 0xca,
+                                                     0xf7, 0x5d, 0x7, 0xc0, 0x96, 0xcd, 0xa3, 0xba,
+                                                     0xca, 0xaa, 0xb5, 0xa3, 0xbe, 0x97, 0xf7, 0x81,
+                                                     0x8e, 0xc2, 0xaa, 0x8f, 0xb9, 0x95, 0x8, 0x9d,
+                                                     0x7, 0x97, 0x75, 0x69, 0x8b, 0x7f, 0x1b, 0xfb,
+                                                     0x17, 0x8b, 0xfb, 0x8b, 0xfb, 0x11, 0x7d, 0x1f,
+                                                     0x83, 0x3f, 0x57, 0x6d, 0x63, 0x81, 0x8, 0xf8,
+                                                     0x6f, 0x4c, 0xfc, 0x6f, 0x7, 0x63, 0x95, 0x57,
+                                                     0xa9, 0x83, 0xd7, 0x8, 0xf7, 0x11, 0x7e, 0x95,
+                                                     0xf7, 0x8b, 0xfb, 0x22, 0x1b, 0x7f, 0x69, 0x8b,
+                                                     0x7f, 0x75, 0x1f, 0x79, 0x7, 0xb9, 0x81, 0xaa,
+                                                     0x87, 0x8e, 0x54, 0x97, 0xfb, 0x81, 0xa3, 0x58,
+                                                     0xaa, 0x61, 0xba, 0x4c, 0xcd, 0x73, 0xc0, 0x80,
+                                                     0x8, 0xe, 0x8e, 0x7a, 0xb9, 0xf8, 0x6b, 0x77,
+                                                     0x1, 0xb5, 0xf2, 0xf7, 0x39, 0xf5, 0xf7, 0x38,
+                                                     0xf3, 0x3, 0xf7, 0xff, 0xd3, 0x15, 0x5c, 0xa9,
+                                                     0xc3, 0x61, 0xc5, 0x1b, 0xf7, 0x5, 0xcb, 0xf7,
+                                                     0x9, 0xf6, 0xf7, 0x2a, 0x36, 0xf7, 0x23, 0xfb,
+                                                     0x3e, 0x1f, 0x7a, 0x7, 0xf7, 0x7, 0x74, 0xaf,
+                                                     0xfb, 0x8, 0x26, 0x1a, 0x46, 0x83, 0xfb, 0x25,
+                                                     0x39, 0x41, 0x6b, 0xe2, 0xa4, 0x8e, 0x1e, 0x97,
+                                                     0x98, 0x9c, 0xd4, 0xce, 0x1a, 0xc9, 0x7f, 0xc4,
+                                                     0x62, 0x62, 0x7f, 0x52, 0x4d, 0x48, 0x9c, 0x42,
+                                                     0x97, 0x7e, 0x1e, 0x73, 0x8d, 0x6e, 0x33, 0x41,
+                                                     0x1b, 0x3d, 0x7c, 0xf7, 0x18, 0xd0, 0xf3, 0xab,
+                                                     0xf7, 0x11, 0xf7, 0xc, 0xa3, 0x1f, 0x9c, 0x7,
+                                                     0xfb, 0x3a, 0x32, 0xfb, 0x15, 0xfb, 0x26, 0xfb,
+                                                     0x2, 0xc6, 0xfb, 0x18, 0xf7, 0x10, 0xc3, 0xc0,
+                                                     0xb7, 0xb8, 0xa8, 0x1f, 0xe, 0x57, 0x79, 0xa7,
+                                                     0xf8, 0x15, 0xd1, 0xf7, 0x43, 0xb4, 0x12, 0xf7,
+                                                     0x1d, 0xdd, 0x48, 0xe5, 0x92, 0xad, 0xf7, 0x50,
+                                                     0xd9, 0x13, 0xee, 0x9d, 0xf7, 0xd6, 0x15, 0x90,
+                                                     0x89, 0x90, 0x8a, 0x90, 0x89, 0x8, 0xb1, 0xa1,
+                                                     0xa4, 0xb3, 0xaf, 0x1b, 0xa4, 0x94, 0x78, 0x77,
+                                                     0x8d, 0x1f, 0x13, 0xf6, 0x8f, 0x4f, 0x78, 0x42,
+                                                     0x4e, 0x1a, 0xfb, 0x6, 0xc4, 0x49, 0xf2, 0xf7,
+                                                     0x37, 0xe4, 0xf7, 0x28, 0xf7, 0x51, 0x1e, 0xd5,
+                                                     0x5d, 0x5, 0xc0, 0x7, 0x41, 0xb0, 0x5, 0xf2,
+                                                     0x66, 0xf7, 0x6b, 0xfb, 0x3a, 0x48, 0x6d, 0x60,
+                                                     0x55, 0xfb, 0xa, 0xf0, 0x56, 0xf7, 0xd, 0x49,
+                                                     0x1e, 0x37, 0x8c, 0x7e, 0xfb, 0x91, 0xfb, 0x26,
+                                                     0x1b, 0x47, 0x71, 0xc4, 0xcc, 0x1f, 0x13, 0xee,
+                                                     0xdb, 0xa2, 0xda, 0xdb, 0x1a, 0xbf, 0x62, 0xb5,
+                                                     0x5c, 0x53, 0x4c, 0x42, 0x45, 0x7a, 0x1e, 0xf8,
+                                                     0x58, 0xcf, 0x15, 0x63, 0x9f, 0xfb, 0x27, 0xcd,
+                                                     0xf0, 0x1a, 0xad, 0x9f, 0xa8, 0xb3, 0xf7, 0xa,
+                                                     0x94, 0xfb, 0x73, 0x70, 0x1e, 0xe, 0x4c, 0xa0,
+                                                     0x76, 0xf8, 0x8b, 0xf7, 0x4a, 0x66, 0xb0, 0x12,
+                                                     0xf7, 0x84, 0xf3, 0x13, 0xb0, 0xf7, 0x2b, 0x24,
+                                                     0xa, 0x8a, 0xf7, 0x6a, 0x5, 0xda, 0x91, 0xb1,
+                                                     0xf7, 0x9b, 0xf7, 0x4, 0x1b, 0x9d, 0x9a, 0x81,
+                                                     0x7d, 0x1f, 0x75, 0x65, 0x72, 0x6d, 0x1a, 0x13,
+                                                     0xd0, 0x6b, 0xa5, 0x7f, 0xa6, 0xad, 0xa7, 0xb4,
+                                                     0xb4, 0xcc, 0x6d, 0xae, 0x56, 0xfb, 0x1d, 0x58,
+                                                     0xfb, 0x2a, 0x2a, 0x76, 0x1e, 0xf7, 0x31, 0x7d,
+                                                     0xfb, 0x1d, 0xe1, 0xfb, 0x27, 0x1b, 0x7e, 0x82,
+                                                     0x83, 0x84, 0x87, 0x8f, 0x87, 0x92, 0x89, 0x1f,
+                                                     0xf7, 0x59, 0x5e, 0xac, 0x2e, 0x8c, 0xfb, 0x6b,
+                                                     0x8c, 0xfb, 0x67, 0x18, 0x28, 0xa, 0xe, 0x3b,
+                                                     0xfb, 0x5f, 0x76, 0xf7, 0x68, 0xb1, 0xf8, 0x21,
+                                                     0xd7, 0x1, 0xaf, 0xf4, 0xf7, 0x1a, 0xcc, 0xf7,
+                                                     0x27, 0xef, 0x3, 0xf7, 0xa9, 0x7f, 0x15, 0xfb,
+                                                     0x68, 0xca, 0xf7, 0x68, 0x7, 0xf7, 0x1b, 0x8a,
+                                                     0xf7, 0x4, 0xee, 0xf7, 0x27, 0x1a, 0xf7, 0x27,
+                                                     0x49, 0xf7, 0xb, 0xfb, 0x10, 0x26, 0x73, 0x48,
+                                                     0x3e, 0x8d, 0x1e, 0x8e, 0xfb, 0xdd, 0x5, 0x28,
+                                                     0x66, 0xf7, 0x7, 0xf0, 0xd7, 0x9b, 0xf7, 0x15,
+                                                     0xe6, 0xad, 0x1f, 0x9d, 0x7, 0xfb, 0x10, 0x33,
+                                                     0xfb, 0x1d, 0xfb, 0x10, 0xfb, 0x36, 0xf7, 0x4,
+                                                     0x32, 0xf7, 0x15, 0x8c, 0x1f, 0xca, 0xb1, 0x15,
+                                                     0xf7, 0xde, 0x7, 0xa5, 0x8c, 0x8a, 0xb4, 0xb7,
+                                                     0x1b, 0xd8, 0xa5, 0x28, 0x32, 0xfb, 0x8, 0x53,
+                                                     0x2e, 0x30, 0x1f, 0xe, 0xa9, 0x79, 0xb4, 0xf8,
+                                                     0x6f, 0xe0, 0x1, 0xae, 0xf5, 0xf7, 0x37, 0xec,
+                                                     0xf7, 0x40, 0xed, 0x3, 0xf7, 0xf8, 0xd0, 0x15,
+                                                     0x61, 0x9b, 0xbc, 0x5e, 0xd6, 0x1b, 0xf7, 0xc,
+                                                     0xc2, 0xf7, 0x1d, 0xf7, 0x11, 0xec, 0x3e, 0xf7,
+                                                     0x17, 0x24, 0xa5, 0x1f, 0xf7, 0x48, 0x8c, 0x5,
+                                                     0xdf, 0xfc, 0x9d, 0x7, 0x6b, 0x47, 0x66, 0x25,
+                                                     0x65, 0x1f, 0x9d, 0x87, 0xc6, 0xb7, 0xab, 0x94,
+                                                     0xe4, 0x92, 0x19, 0x26, 0x4e, 0x41, 0x36, 0xfb,
+                                                     0x6, 0x1a, 0xfb, 0x14, 0xb7, 0xfb, 0x16, 0xf7,
+                                                     0x1b, 0xc5, 0xca, 0xbb, 0xb2, 0xa0, 0x1e, 0x72,
+                                                     0xd4, 0x15, 0x62, 0x8d, 0x5e, 0x3d, 0x52, 0x1b,
+                                                     0x36, 0x86, 0xf7, 0x2c, 0xd1, 0xf7, 0xa, 0xc2,
+                                                     0xf0, 0xed, 0xad, 0x1f, 0xf7, 0x10, 0x6, 0xf0,
+                                                     0x6d, 0xc1, 0xfb, 0x9, 0x23, 0x1a, 0x3d, 0x8b,
+                                                     0xfb, 0x22, 0x30, 0x4e, 0x5e, 0xcf, 0xba, 0x8d,
+                                                     0x1e, 0x98, 0xc5, 0x95, 0xd1, 0xad, 0x1a, 0xab,
+                                                     0x8d, 0xdc, 0x5a, 0x57, 0x8e, 0x3f, 0x67, 0x8a,
+                                                     0x1e, 0x8a, 0x60, 0x95, 0x41, 0x9d, 0x5d, 0x8,
+                                                     0xe, 0xfb, 0x73, 0xf7, 0x1a, 0x76, 0xf7, 0xfc,
+                                                     0x77, 0x1, 0xbd, 0xf7, 0xfc, 0x3, 0xf7, 0x7a,
+                                                     0xf7, 0x5, 0x15, 0xee, 0xdc, 0xdb, 0xef, 0xee,
+                                                     0x3a, 0xdc, 0x28, 0x27, 0x3b, 0x3a, 0x28, 0x27,
+                                                     0xdb, 0x3b, 0xef, 0x1f, 0xe, 0xf7, 0xd1, 0x7a,
+                                                     0xf7, 0x4, 0x1, 0xf7, 0x3, 0xf7, 0x4, 0xf7,
+                                                     0x71, 0xf7, 0x4, 0xf7, 0x71, 0xf7, 0x4, 0x14,
+                                                     0x70, 0xf7, 0x3, 0xb1, 0x15, 0x29, 0xa, 0xf7,
+                                                     0xe1, 0x16, 0x29, 0xa, 0xf7, 0xe1, 0x16, 0x29,
+                                                     0xa, 0xe, 0xfc, 0x48, 0xf8, 0x74, 0x76, 0xf7,
+                                                     0xa8, 0x77, 0x1, 0xa9, 0xf8, 0x7d, 0x15, 0x38,
+                                                     0xa, 0x59, 0xa, 0x1e, 0xf7, 0x31, 0xf7, 0x5a,
+                                                     0x40, 0xa, 0x6d, 0xa1, 0x6c, 0x7b, 0x7d, 0x85,
+                                                     0x81, 0x87, 0x1e, 0xe, 0xfb, 0xa4, 0xf8, 0x74,
+                                                     0x76, 0xf7, 0xaa, 0x77, 0x1, 0xb9, 0xf8, 0x5f,
+                                                     0x15, 0x59, 0xa, 0x1f, 0xf7, 0x32, 0x36, 0xa,
+                                                     0x23, 0xfb, 0x7c, 0x5, 0x38, 0xa, 0x1e, 0xf7,
+                                                     0x54, 0x16, 0x59, 0xa, 0x1f, 0xf7, 0x31, 0x36,
+                                                     0xa, 0x24, 0xfb, 0x7c, 0x5, 0x38, 0xa, 0x1e,
+                                                     0xe, 0xfc, 0x98, 0x94, 0x76, 0xf9, 0x45, 0x77,
+                                                     0x1, 0xfb, 0x10, 0x7f, 0x15, 0xf8, 0x64, 0xf9,
+                                                     0x45, 0x5, 0x53, 0x6, 0xfc, 0x64, 0xfd, 0x45,
+                                                     0x5, 0xe, 0xce, 0x7f, 0xca, 0xf7, 0x54, 0xca,
+                                                     0xca, 0xca, 0xf7, 0x52, 0xca, 0x1, 0xf7, 0x7,
+                                                     0xce, 0x3, 0x9f, 0xf7, 0x87, 0x15, 0xf7, 0x0,
+                                                     0x6, 0xfb, 0x26, 0xb0, 0xf7, 0x1b, 0xfb, 0x1,
+                                                     0xf7, 0x39, 0x1b, 0xea, 0xd6, 0xb0, 0xb3, 0xbd,
+                                                     0x1f, 0xe5, 0x7, 0x4b, 0x57, 0x39, 0x63, 0x35,
+                                                     0x1b, 0xfb, 0x11, 0x25, 0xdb, 0xf7, 0x4, 0x64,
+                                                     0x1f, 0xf7, 0xf8, 0x6, 0xa9, 0xca, 0x5, 0xfc,
+                                                     0x25, 0x6, 0x8a, 0x96, 0x8a, 0x94, 0x95, 0x1a,
+                                                     0x95, 0x8c, 0x95, 0x8c, 0x98, 0x1e, 0xf8, 0x42,
+                                                     0x6, 0xa9, 0xca, 0x5, 0xfc, 0x51, 0x6, 0xf7,
+                                                     0x0, 0xad, 0xf6, 0xdd, 0xf7, 0x11, 0x1b, 0xe5,
+                                                     0xdc, 0x61, 0x4f, 0xbc, 0x1f, 0xa8, 0xc8, 0x5,
+                                                     0xcb, 0x4b, 0x31, 0xb3, 0x2c, 0x1b, 0xfb, 0x35,
+                                                     0xfb, 0x1f, 0x22, 0xfb, 0x28, 0x66, 0x1f, 0x3d,
+                                                     0x6, 0x6d, 0x4c, 0x5, 0xeb, 0x6, 0x8a, 0x7e,
+                                                     0x8b, 0x82, 0x81, 0x1a, 0x82, 0x8b, 0x82, 0x8c,
+                                                     0x7e, 0x1e, 0x49, 0x6, 0xe, 0x8e, 0x56, 0xde,
+                                                     0xad, 0xcf, 0xf7, 0x70, 0xa2, 0xf7, 0xa9, 0xe3,
+                                                     0x1, 0xc4, 0xb2, 0xf7, 0xac, 0xd1, 0xc3, 0xd7,
+                                                     0x3, 0xa5, 0xb7, 0x15, 0x98, 0xa6, 0x9b, 0x92,
+                                                     0x9b, 0x1b, 0x99, 0xc2, 0x6f, 0x6e, 0xc3, 0x1f,
+                                                     0x6d, 0xc5, 0xc6, 0x6d, 0x99, 0x1b, 0xac, 0xf7,
+                                                     0x60, 0xf7, 0x3e, 0xcd, 0xb0, 0x5d, 0xd0, 0x65,
+                                                     0xcf, 0x1f, 0x71, 0xba, 0x75, 0xb9, 0xaf, 0x1a,
+                                                     0x9f, 0xda, 0xe7, 0xb3, 0xc3, 0x1e, 0xb1, 0x42,
+                                                     0x25, 0xbb, 0x32, 0x1b, 0xfb, 0x5, 0xfb, 0x17,
+                                                     0x44, 0xfb, 0x14, 0xfb, 0x6, 0xef, 0x3f, 0xf7,
+                                                     0x0, 0x8c, 0x1f, 0x8d, 0xa2, 0x5, 0x41, 0x8a,
+                                                     0x2a, 0xcd, 0xdc, 0x1a, 0xdf, 0xd0, 0xb8, 0xdd,
+                                                     0x8d, 0x1e, 0xcd, 0x8d, 0xf1, 0x64, 0xbe, 0x71,
+                                                     0x8, 0x39, 0x23, 0x83, 0x75, 0x74, 0x1a, 0x63,
+                                                     0xa2, 0x5c, 0xa5, 0x5d, 0x1e, 0xae, 0x4d, 0xb5,
+                                                     0x4d, 0x5c, 0x1a, 0x5f, 0x4b, 0x4d, 0x5b, 0x77,
+                                                     0x57, 0xa7, 0xa6, 0x57, 0x1e, 0xa5, 0x59, 0x5c,
+                                                     0xa0, 0x77, 0x1b, 0x72, 0x2d, 0x50, 0x7f, 0x77,
+                                                     0x1f, 0xe, 0xf7, 0xc4, 0xfb, 0x67, 0xac, 0xf7,
+                                                     0x39, 0xaf, 0xf8, 0x4b, 0xb5, 0xd0, 0x77, 0x1,
+                                                     0xf7, 0x33, 0xab, 0x9e, 0xdb, 0xb8, 0xd3, 0xac,
+                                                     0xb9, 0xf7, 0xb2, 0xed, 0x3, 0xf7, 0x8c, 0xf7,
+                                                     0x10, 0x15, 0x67, 0x4b, 0x56, 0x50, 0x40, 0x1a,
+                                                     0x45, 0xa8, 0x48, 0xe5, 0xee, 0xa9, 0xdb, 0xd8,
+                                                     0xee, 0x64, 0xbf, 0x6a, 0xde, 0x1e, 0xef, 0xd6,
+                                                     0xf7, 0x5c, 0xf7, 0x4a, 0xf0, 0x1b, 0xb0, 0xa3,
+                                                     0x6b, 0x46, 0xfb, 0x26, 0x26, 0xfb, 0x54, 0x2f,
+                                                     0x48, 0x71, 0xac, 0xae, 0xa2, 0x9e, 0x91, 0x97,
+                                                     0x1f, 0xa7, 0x8c, 0xa0, 0xa7, 0xa3, 0x1a, 0xa3,
+                                                     0x76, 0x9e, 0x73, 0x8a, 0x1e, 0x5b, 0x8a, 0x6a,
+                                                     0x5e, 0x58, 0x1a, 0x43, 0xbe, 0x50, 0xe4, 0xf7,
+                                                     0x41, 0xf7, 0x9, 0xf7, 0x87, 0xf7, 0x6, 0xd9,
+                                                     0x5a, 0xdd, 0x33, 0xfb, 0x3e, 0xfb, 0x1f, 0xfb,
+                                                     0x50, 0x21, 0x25, 0x1e, 0x75, 0xb5, 0x81, 0xa6,
+                                                     0xa5, 0x1a, 0xda, 0xf7, 0x16, 0xf7, 0x1, 0xc9,
+                                                     0xcb, 0x1e, 0x82, 0x9b, 0x5, 0x27, 0x48, 0xfb,
+                                                     0x37, 0xfb, 0x8, 0xfb, 0x11, 0x1a, 0x8a, 0x56,
+                                                     0xa4, 0x58, 0x99, 0x66, 0x8, 0x9a, 0x6d, 0x15,
+                                                     0xc1, 0xfb, 0x0, 0x9d, 0x5d, 0x65, 0x1a, 0x63,
+                                                     0x7f, 0x63, 0x5c, 0x5c, 0x65, 0xb7, 0xcb, 0xbc,
+                                                     0xaf, 0xc5, 0xaf, 0xc4, 0x1e, 0xe, 0xf7, 0x4,
+                                                     0x91, 0x76, 0xc2, 0xdf, 0xf8, 0xa4, 0xdd, 0x52,
+                                                     0xc4, 0x12, 0xa5, 0xac, 0xf7, 0x24, 0xc0, 0xe5,
+                                                     0xe3, 0x13, 0xee, 0xd1, 0xac, 0x15, 0x92, 0x86,
+                                                     0x90, 0x86, 0x92, 0x86, 0x8, 0x9a, 0x9e, 0x9b,
+                                                     0x92, 0x97, 0x1b, 0xaa, 0xa7, 0x64, 0x7b, 0xa4,
+                                                     0x1f, 0xf7, 0x2c, 0xc3, 0xc8, 0xf7, 0x42, 0xf7,
+                                                     0x19, 0x1a, 0x13, 0xae, 0xd0, 0x8b, 0xe5, 0x7c,
+                                                     0xe3, 0x1e, 0xb6, 0xce, 0x98, 0x99, 0xa0, 0x1b,
+                                                     0xa2, 0xf3, 0x2a, 0x84, 0x92, 0x1f, 0xfb, 0x55,
+                                                     0xfb, 0x24, 0x96, 0x77, 0x5, 0xd3, 0x9e, 0x39,
+                                                     0x21, 0xfb, 0xd, 0x9a, 0x4c, 0xd3, 0x70, 0x1f,
+                                                     0xf7, 0x2, 0xe3, 0x7c, 0xa2, 0x5, 0x86, 0x7f,
+                                                     0x6f, 0x79, 0x7c, 0x1b, 0x69, 0x86, 0xb4, 0xed,
+                                                     0xef, 0x82, 0xf7, 0x1, 0x46, 0xa3, 0x1f, 0xf7,
+                                                     0x4a, 0xf7, 0x1f, 0x5, 0x13, 0x1e, 0xf7, 0x26,
+                                                     0xfb, 0x38, 0x8a, 0x8f, 0x7b, 0x1b, 0x79, 0xfb,
+                                                     0xe, 0x2f, 0x78, 0x71, 0x1f, 0xce, 0x76, 0x41,
+                                                     0xb7, 0x44, 0x1b, 0xfb, 0x1d, 0x3d, 0x47, 0xfb,
+                                                     0x11, 0x2e, 0xdd, 0x5b, 0xd3, 0x63, 0x1f, 0x9a,
+                                                     0x82, 0x93, 0x81, 0x81, 0x1a, 0x78, 0x77, 0x7f,
+                                                     0x85, 0x82, 0x1e, 0xa2, 0x7b, 0x5, 0xb6, 0xb8,
+                                                     0x98, 0xa0, 0x9e, 0x1a, 0xa9, 0x60, 0xa9, 0x5e,
+                                                     0xa6, 0x1e, 0x57, 0xa8, 0x52, 0xa9, 0xcc, 0x1a,
+                                                     0x13, 0xde, 0xc8, 0xd5, 0xb8, 0xc4, 0xf7, 0x1c,
+                                                     0x9e, 0xfb, 0x29, 0xfb, 0x1f, 0xfb, 0x15, 0x64,
+                                                     0xfb, 0x25, 0x60, 0x50, 0x1e, 0xc6, 0x35, 0x9d,
+                                                     0x94, 0x7a, 0x1b, 0x75, 0x88, 0x40, 0x36, 0x80,
+                                                     0x88, 0x8, 0xe, 0xe0, 0x8b, 0xf0, 0xf8, 0xbf,
+                                                     0xab, 0x12, 0xad, 0x9a, 0x91, 0xf7, 0x8, 0xf8,
+                                                     0x40, 0xf7, 0x9, 0x90, 0x9a, 0x17, 0xad, 0x16,
+                                                     0x13, 0xdc, 0xf7, 0xb8, 0x6, 0x7b, 0xf7, 0x2c,
+                                                     0x5, 0xfb, 0x1, 0xa9, 0x6d, 0xf7, 0xf, 0xf4,
+                                                     0x1a, 0xf7, 0x16, 0xdb, 0xf7, 0x8, 0xf7, 0x1a,
+                                                     0xf7, 0x20, 0xd5, 0xfb, 0x8, 0xfb, 0x1a, 0x27,
+                                                     0x65, 0xfb, 0x14, 0x26, 0x71, 0x1e, 0x7b, 0xfb,
+                                                     0x2c, 0x5, 0x13, 0xfc, 0xf7, 0xb8, 0xf7, 0x36,
+                                                     0x6, 0x13, 0xdc, 0x7c, 0x6, 0x5a, 0x7f, 0x75,
+                                                     0x7f, 0x61, 0x1b, 0xfb, 0x28, 0x6, 0x8d, 0xa7,
+                                                     0x5, 0xf7, 0x1e, 0xa1, 0xda, 0xf7, 0x18, 0xf7,
+                                                     0x10, 0x1a, 0xf7, 0x52, 0xfb, 0x3f, 0xe6, 0xfb,
+                                                     0x34, 0xfb, 0x33, 0xfb, 0x3e, 0x2f, 0xfb, 0x4d,
+                                                     0x8a, 0x1e, 0x8a, 0xfb, 0x12, 0xd6, 0xfb, 0x1b,
+                                                     0xf7, 0x22, 0x76, 0x8d, 0x6f, 0x18, 0x13, 0xa0,
+                                                     0xfb, 0x28, 0x6, 0x61, 0x75, 0x97, 0xbc, 0x7f,
+                                                     0x1f, 0x7c, 0x6, 0xe, 0xf7, 0x20, 0x8e, 0x76,
+                                                     0xb2, 0x76, 0xf8, 0x69, 0xf7, 0x18, 0xc4, 0x77,
+                                                     0x12, 0xf7, 0x43, 0xe6, 0x13, 0x78, 0xf7, 0x43,
+                                                     0x16, 0xf7, 0x47, 0x6, 0x9b, 0xb6, 0x86, 0x9e,
+                                                     0x99, 0x1a, 0xac, 0x6e, 0xb0, 0x70, 0xb1, 0x1e,
+                                                     0x75, 0xab, 0x76, 0xac, 0xac, 0x1a, 0xaa, 0xa6,
+                                                     0xa1, 0xa0, 0xa1, 0x1e, 0x13, 0xb8, 0xf7, 0x7c,
+                                                     0xfb, 0xa1, 0xbb, 0x4f, 0x97, 0x5d, 0x8, 0x9e,
+                                                     0x93, 0xaf, 0xab, 0xcd, 0x1a, 0xc3, 0x6a, 0xb1,
+                                                     0x6b, 0xac, 0x1e, 0x6b, 0xab, 0x6c, 0xa6, 0xac,
+                                                     0x1a, 0xd9, 0xd0, 0xe0, 0xc1, 0x7e, 0x1e, 0x90,
+                                                     0xe0, 0x5, 0xad, 0x86, 0x74, 0xa4, 0x6a, 0x1b,
+                                                     0x7a, 0x7d, 0x8b, 0x8c, 0x7f, 0x1f, 0x55, 0x8e,
+                                                     0x87, 0x96, 0x90, 0xb5, 0x8, 0x5c, 0x84, 0x76,
+                                                     0x54, 0x5b, 0x1a, 0x47, 0xcb, 0x7d, 0xc2, 0x8e,
+                                                     0x1e, 0x62, 0x5d, 0x7f, 0x61, 0x77, 0x5d, 0xfb,
+                                                     0x6c, 0xf7, 0x92, 0x79, 0x99, 0x83, 0xbb, 0x8,
+                                                     0x70, 0x82, 0x65, 0x5a, 0x60, 0x1a, 0x64, 0xd0,
+                                                     0x40, 0xb4, 0x5d, 0x1e, 0x4b, 0x4a, 0x5d, 0x6f,
+                                                     0x3e, 0x1a, 0x74, 0xa0, 0x71, 0x9b, 0x6a, 0x1e,
+                                                     0x95, 0x76, 0x94, 0x73, 0x6f, 0x1a, 0x6e, 0x67,
+                                                     0x8c, 0x77, 0x1e, 0xe, 0x46, 0xa, 0xab, 0xfa,
+                                                     0x22, 0x3, 0xab, 0xf7, 0x8c, 0x15, 0xe9, 0x31,
+                                                     0xd1, 0x45, 0xe2, 0x24, 0xae, 0xae, 0x18, 0x5b,
+                                                     0xc7, 0x2d, 0xf1, 0x64, 0xb1, 0x8, 0xf9, 0xb9,
+                                                     0xc3, 0xfd, 0xb9, 0x6, 0xb2, 0xb1, 0xe9, 0xf1,
+                                                     0xbb, 0xc7, 0x68, 0xae, 0x18, 0x34, 0x24, 0x45,
+                                                     0x45, 0x2d, 0x31, 0x8, 0xe, 0x3b, 0xa0, 0x76,
+                                                     0xfa, 0x22, 0x49, 0xa, 0xf7, 0xac, 0x16, 0xc3,
+                                                     0xf9, 0xb9, 0x6, 0xb1, 0x64, 0xf1, 0x2d, 0xc7,
+                                                     0x5b, 0xae, 0xae, 0x18, 0x24, 0xe2, 0x45, 0xd1,
+                                                     0x31, 0xe9, 0x31, 0x2d, 0x45, 0x45, 0x24, 0x34,
+                                                     0xae, 0x68, 0x18, 0xc7, 0xbb, 0xf1, 0xe9, 0xb1,
+                                                     0xb2, 0x8, 0xe, 0x46, 0xa, 0xbc, 0xf7, 0x70,
+                                                     0x15, 0xf9, 0xb9, 0x6, 0x64, 0x65, 0x2d, 0x25,
+                                                     0x5b, 0x4f, 0xae, 0x68, 0x18, 0xe2, 0xf2, 0xd1,
+                                                     0xd1, 0xe9, 0xe5, 0x2d, 0xe5, 0x45, 0xd1, 0x34,
+                                                     0xf2, 0x68, 0x68, 0x18, 0xbb, 0x4f, 0xe9, 0x25,
+                                                     0xb2, 0x65, 0x8, 0xfd, 0xb9, 0x6, 0xe, 0x3b,
+                                                     0x8a, 0x76, 0xfa, 0x22, 0x49, 0xa, 0xb8, 0xf7,
+                                                     0x79, 0x15, 0xf2, 0x34, 0xd1, 0x45, 0xe5, 0x2d,
+                                                     0xe5, 0xe9, 0xd1, 0xd1, 0xf2, 0xe2, 0x68, 0xae,
+                                                     0x18, 0x4f, 0x5b, 0x25, 0x2d, 0x65, 0x64, 0x8,
+                                                     0xf9, 0xb9, 0x53, 0xfd, 0xb9, 0x7, 0x65, 0xb2,
+                                                     0x25, 0xe9, 0x4f, 0xbb, 0x8, 0xe, 0xf7, 0xfb,
+                                                     0x91, 0x76, 0xf7, 0x81, 0xbf, 0xf7, 0x81, 0x77,
+                                                     0x1, 0xa3, 0xfa, 0x7c, 0x3, 0xa3, 0xf7, 0x8c,
+                                                     0x15, 0xf7, 0x7, 0x25, 0xc2, 0x48, 0xda, 0x2d,
+                                                     0xb0, 0xab, 0x18, 0x47, 0xea, 0x6f, 0xa0, 0x36,
+                                                     0xe4, 0x8, 0xf9, 0xaa, 0x6, 0x36, 0x32, 0x70,
+                                                     0x75, 0x46, 0x2d, 0xb0, 0x6b, 0x18, 0xda, 0xe9,
+                                                     0xc2, 0xce, 0xf7, 0x7, 0xf1, 0xfb, 0x7, 0xf1,
+                                                     0x54, 0xce, 0x3c, 0xe9, 0x66, 0x6b, 0x18, 0xd0,
+                                                     0x2e, 0xa5, 0x73, 0xe1, 0x33, 0x8, 0xfd, 0xaa,
+                                                     0x6, 0xe0, 0xe4, 0xa7, 0xa0, 0xcf, 0xea, 0x66,
+                                                     0xab, 0x18, 0x3c, 0x2d, 0x54, 0x48, 0xfb, 0x7,
+                                                     0x25, 0x8, 0xe, 0x72, 0x90, 0x76, 0xe9, 0xc2,
+                                                     0xf8, 0x84, 0x77, 0x1, 0xf8, 0xb7, 0xc2, 0x3,
+                                                     0x9a, 0xf5, 0x15, 0xf7, 0x3a, 0xfb, 0xe, 0x5,
+                                                     0xe9, 0xf8, 0x39, 0xf8, 0xbb, 0x54, 0xfc, 0x84,
+                                                     0xfc, 0x2, 0xe9, 0x7, 0xe, 0xf7, 0xc4, 0xeb,
+                                                     0xc0, 0xf7, 0x5c, 0xc0, 0xd9, 0xac, 0x8b, 0x77,
+                                                     0x1, 0xa9, 0xfa, 0x21, 0x3, 0xa9, 0xf7, 0x8d,
+                                                     0x15, 0xf7, 0xa, 0xfb, 0x3, 0xb4, 0x61, 0xe5,
+                                                     0xfb, 0x3, 0xb4, 0xac, 0x18, 0x4d, 0xd9, 0x5,
+                                                     0xf9, 0x3d, 0xc0, 0xfd, 0x65, 0x6, 0x23, 0xef,
+                                                     0xf3, 0xef, 0x5, 0xf9, 0x65, 0xc0, 0xfd, 0x3d,
+                                                     0x6, 0xc9, 0xd9, 0x62, 0xac, 0x31, 0xfb, 0x3,
+                                                     0x62, 0x61, 0xfb, 0xa, 0xfb, 0x3, 0x19, 0xe,
+                                                     0x3b, 0xa2, 0x76, 0xfa, 0x21, 0x77, 0x1, 0xf7,
+                                                     0x3e, 0xc0, 0xf7, 0x34, 0xc0, 0x3, 0xf7, 0x3e,
+                                                     0x8d, 0x15, 0xc0, 0xf9, 0x7c, 0x6, 0xdb, 0xdc,
+                                                     0xdb, 0x3a, 0x5, 0xfd, 0x7c, 0xc0, 0xf9, 0x4c,
+                                                     0x7, 0xed, 0x3e, 0xac, 0xb4, 0xfb, 0x3, 0xe5,
+                                                     0x61, 0xb4, 0xfb, 0x3, 0xf7, 0xa, 0x19, 0xfb,
+                                                     0x3, 0xfb, 0xa, 0x61, 0x62, 0xfb, 0x3, 0x31,
+                                                     0xac, 0x62, 0x18, 0xed, 0xd8, 0x5, 0xe, 0xf7,
+                                                     0xc4, 0xee, 0xc0, 0xf7, 0x51, 0xc0, 0x1, 0xb8,
+                                                     0xee, 0x15, 0xf9, 0x3d, 0x6, 0x48, 0x35, 0xb9,
+                                                     0x6a, 0xe5, 0xf7, 0x3, 0xb4, 0xb5, 0xf7, 0xa,
+                                                     0xf7, 0x3, 0x19, 0xfb, 0xa, 0xf7, 0x3, 0x62,
+                                                     0xb5, 0x31, 0xf7, 0x3, 0x5d, 0x6a, 0x18, 0xce,
+                                                     0x3a, 0x5, 0xfd, 0x3d, 0x56, 0xf9, 0x68, 0x6,
+                                                     0xf0, 0x2a, 0x26, 0x2f, 0x5, 0xfd, 0x68, 0x6,
+                                                     0xe, 0x3b, 0x8d, 0x76, 0xfa, 0x21, 0x77, 0x1,
+                                                     0xf7, 0x43, 0xc0, 0xf7, 0x34, 0xc0, 0x3, 0xb7,
+                                                     0xf7, 0x7a, 0x15, 0xf7, 0x3, 0x31, 0xb5, 0x62,
+                                                     0xf7, 0x3, 0xfb, 0xa, 0xf7, 0x3, 0xf7, 0xa,
+                                                     0xb5, 0xb4, 0xf7, 0x3, 0xe5, 0x6a, 0xb4, 0x18,
+                                                     0x29, 0x3e, 0x5, 0xf9, 0x4c, 0x56, 0xfd, 0x7c,
+                                                     0x7, 0x3b, 0x3a, 0x3b, 0xdc, 0x5, 0xf9, 0x7c,
+                                                     0x56, 0xfd, 0x4c, 0x7, 0x29, 0xd8, 0x5, 0xe,
+                                                     0xf7, 0xfb, 0xf7, 0x1, 0xbd, 0xf7, 0x40, 0xbd,
+                                                     0x1, 0xa6, 0xfa, 0x78, 0x3, 0xa6, 0xf7, 0x89,
+                                                     0x15, 0xf7, 0x8, 0x21, 0xb2, 0x61, 0xed, 0xfb,
+                                                     0x9, 0xb3, 0xad, 0x18, 0x3f, 0xea, 0x5, 0xf8,
+                                                     0xc6, 0x6, 0x3f, 0x2c, 0xb3, 0x69, 0xed, 0xf7,
+                                                     0x9, 0xb2, 0xb5, 0xf7, 0x8, 0xf5, 0x19, 0xfb,
+                                                     0x8, 0xf5, 0x64, 0xb5, 0x29, 0xf7, 0x9, 0x63,
+                                                     0x69, 0x18, 0xd7, 0x2c, 0x5, 0xfc, 0xc6, 0x6,
+                                                     0xd7, 0xea, 0x63, 0xad, 0x29, 0xfb, 0x9, 0x64,
+                                                     0x61, 0xfb, 0x8, 0x21, 0x19, 0xf7, 0x41, 0x35,
+                                                     0x15, 0x34, 0xe1, 0xe2, 0xe1, 0x5, 0xf9, 0x1f,
+                                                     0x6, 0xe2, 0x35, 0x34, 0x35, 0x5, 0xe, 0xa9,
+                                                     0xa0, 0x76, 0xf8, 0x5d, 0xc2, 0xf7, 0x55, 0x77,
+                                                     0x1, 0xf7, 0xdd, 0x16, 0xc6, 0x6, 0xf7, 0xb9,
+                                                     0xf9, 0x55, 0x5, 0x52, 0x6, 0x39, 0xfb, 0x55,
+                                                     0x5, 0xfc, 0x5, 0x6, 0x36, 0xf7, 0x55, 0x5,
+                                                     0x52, 0x6, 0xf7, 0xde, 0xfd, 0xf, 0x15, 0xfb,
+                                                     0x38, 0xf8, 0x17, 0x5, 0xf7, 0xd6, 0x6, 0xe,
+                                                     0xfb, 0x51, 0x77, 0xa8, 0xf8, 0x0, 0xb2, 0xf7,
+                                                     0xb2, 0xbb, 0x1, 0xa5, 0xe1, 0xf7, 0x9f, 0xde,
+                                                     0x3, 0xf8, 0xf, 0xf7, 0xec, 0x15, 0xbf, 0x48,
+                                                     0x6e, 0x9b, 0x50, 0x1b, 0xfb, 0xa, 0x3b, 0x27,
+                                                     0xfb, 0xe, 0xfb, 0x10, 0xdf, 0x35, 0xf6, 0xf7,
+                                                     0x56, 0xbe, 0xf7, 0xb4, 0xf7, 0x11, 0xf7, 0x30,
+                                                     0x48, 0xf7, 0x59, 0xfb, 0x59, 0x57, 0x58, 0x7b,
+                                                     0x7e, 0x6d, 0x1f, 0xb2, 0x59, 0x5, 0xa0, 0xb4,
+                                                     0xa4, 0x95, 0xd2, 0x1b, 0xf1, 0xb6, 0xfb, 0x36,
+                                                     0xfb, 0x54, 0x84, 0x1f, 0x83, 0x68, 0x15, 0x2b,
+                                                     0x77, 0x7a, 0xfb, 0x60, 0xfb, 0x1b, 0x1b, 0x40,
+                                                     0x7f, 0xea, 0xb7, 0xd9, 0xb1, 0xf7, 0x27, 0xf7,
+                                                     0x0, 0xc8, 0xaa, 0x62, 0x74, 0xa0, 0x1f, 0xe,
+                                                     0x8b, 0xc2, 0xf7, 0xb3, 0xc2, 0xf7, 0x93, 0xc2,
+                                                     0x1, 0xf8, 0x3b, 0xc2, 0x3, 0xa4, 0x16, 0xf8,
+                                                     0x59, 0xf9, 0x57, 0xfc, 0x59, 0x54, 0xf8, 0x22,
+                                                     0xfb, 0x93, 0xfb, 0xf6, 0x54, 0xf7, 0xf6, 0xfb,
+                                                     0xb3, 0xfc, 0x22, 0x6, 0xe, 0xf7, 0x20, 0x73,
+                                                     0xc0, 0xf9, 0x14, 0xbd, 0x1, 0xb2, 0xc3, 0xf9,
+                                                     0xb, 0xc2, 0x3, 0xf7, 0x6c, 0xf7, 0x0, 0x15,
+                                                     0xf8, 0x42, 0xf8, 0x56, 0x5, 0xba, 0x55, 0xac,
+                                                     0x40, 0x3c, 0x1a, 0xfb, 0x40, 0xfb, 0x20, 0xfb,
+                                                     0x29, 0xfb, 0x40, 0x3c, 0x48, 0xad, 0xb8, 0x57,
+                                                     0x1e, 0x66, 0xb1, 0x15, 0x73, 0xa8, 0x4f, 0xc5,
+                                                     0xf7, 0xe, 0x1a, 0xf7, 0x2e, 0xf7, 0x24, 0xf7,
+                                                     0x34, 0xf7, 0x3f, 0xd7, 0xd0, 0x6d, 0x5d, 0xc2,
+                                                     0x1e, 0xfc, 0xcb, 0xfc, 0xdc, 0x15, 0xac, 0x6a,
+                                                     0xee, 0xe5, 0x5, 0x53, 0xca, 0xde, 0x69, 0xe8,
+                                                     0x1b, 0xf7, 0x5f, 0xf7, 0x38, 0xf7, 0x3f, 0xf7,
+                                                     0x5f, 0xe8, 0x65, 0xe4, 0x51, 0xcc, 0x1f, 0xe4,
+                                                     0xe3, 0x67, 0xad, 0x33, 0x34, 0x5, 0xc2, 0x4b,
+                                                     0x37, 0xab, 0x2f, 0x1b, 0xfb, 0x5f, 0xfb, 0x3c,
+                                                     0xfb, 0x3f, 0xfb, 0x55, 0xfb, 0x10, 0xbc, 0x3b,
+                                                     0xbd, 0x5b, 0x1f, 0xe, 0x44, 0x8b, 0xbc, 0xf9,
+                                                     0x13, 0x77, 0x1, 0x91, 0xf8, 0xee, 0x3, 0x91,
+                                                     0x16, 0xf8, 0xee, 0x6, 0xfb, 0xc3, 0xf9, 0x44,
+                                                     0x5, 0xfb, 0x88, 0xfd, 0x13, 0x15, 0xf7, 0x6e,
+                                                     0xf8, 0x68, 0xf7, 0x5b, 0xfc, 0x68, 0x5, 0xe,
+                                                     0xa9, 0x8d, 0x76, 0xf9, 0x42, 0xbe, 0x1, 0xaf,
+                                                     0xf9, 0x19, 0x3, 0xf7, 0xe5, 0x78, 0x15, 0xf7,
+                                                     0xec, 0xf9, 0x75, 0x5, 0xfd, 0x19, 0x6, 0xf7,
+                                                     0xe9, 0xfc, 0xc0, 0x15, 0xfb, 0x62, 0xf8, 0x8d,
+                                                     0x5, 0xf8, 0x47, 0x6, 0xe, 0xa9, 0x8b, 0xc1,
+                                                     0xf7, 0x2d, 0xc1, 0xf7, 0x2d, 0xc1, 0x1, 0xb8,
+                                                     0xf8, 0x60, 0x14, 0xe0, 0xef, 0xf7, 0x63, 0x15,
+                                                     0xf8, 0x29, 0xc1, 0xfc, 0x29, 0x6, 0xe2, 0x95,
+                                                     0xd7, 0xcd, 0xdd, 0x1b, 0xf7, 0x81, 0xc1, 0xfb,
+                                                     0x81, 0x6, 0xfb, 0x2a, 0x42, 0xfb, 0xd, 0xfb,
+                                                     0x5, 0xfb, 0x6, 0xd7, 0xfb, 0xc, 0xf7, 0x27,
+                                                     0x1f, 0xf7, 0x81, 0xc1, 0xfb, 0x81, 0x6, 0x39,
+                                                     0x3f, 0xcd, 0xe2, 0x81, 0x1f, 0xe, 0xa9, 0x66,
+                                                     0x76, 0xc5, 0xc1, 0xf7, 0x2d, 0xc1, 0xf7, 0x2d,
+                                                     0xc1, 0xe2, 0x77, 0x1, 0xb8, 0xc2, 0x3, 0xe9,
+                                                     0x6a, 0x15, 0xb7, 0x72, 0xb8, 0xd8, 0x5, 0x80,
+                                                     0x9a, 0xa9, 0x83, 0xa1, 0x1b, 0xf7, 0x93, 0xc1,
+                                                     0xfb, 0x89, 0x6, 0x7f, 0x73, 0x8d, 0x95, 0x7c,
+                                                     0x1f, 0xdb, 0xf7, 0x21, 0x5, 0xf7, 0x6c, 0xc1,
+                                                     0xfb, 0x4e, 0x6, 0xe2, 0xf7, 0x2d, 0x5, 0xee,
+                                                     0xc1, 0x47, 0x6, 0xae, 0xc9, 0x5d, 0xa4, 0x5a,
+                                                     0x34, 0x5, 0xfb, 0x8, 0x6, 0x29, 0xfb, 0xa,
+                                                     0x2e, 0xfb, 0x1b, 0x38, 0xa7, 0x57, 0xcc, 0x4f,
+                                                     0x1f, 0x65, 0xf7, 0x6c, 0x15, 0xd2, 0x91, 0xd6,
+                                                     0xdf, 0xd5, 0x1b, 0xe8, 0x6, 0x32, 0xfb, 0x2f,
+                                                     0x5, 0x2e, 0xfb, 0x3b, 0x15, 0x6e, 0xa6, 0x70,
+                                                     0xb3, 0x83, 0xb9, 0x8, 0xf7, 0x14, 0x6, 0xe,
+                                                     0xfb, 0x88, 0x7a, 0xba, 0xf7, 0x4b, 0xc2, 0xf7,
+                                                     0x4a, 0xbd, 0x1, 0xf7, 0xd4, 0xe9, 0x3, 0xbb,
+                                                     0x8e, 0x15, 0x85, 0x9d, 0xab, 0x7d, 0xbe, 0x1b,
+                                                     0xf7, 0x22, 0xf7, 0xf, 0xf7, 0x1, 0xf7, 0x3d,
+                                                     0xe3, 0x50, 0xf7, 0x2b, 0xfb, 0x43, 0x6c, 0x69,
+                                                     0x88, 0x82, 0x64, 0x1f, 0x60, 0x7, 0x8e, 0x98,
+                                                     0x99, 0x8d, 0x98, 0x1b, 0xf0, 0xf2, 0x45, 0xfb,
+                                                     0x4, 0x1f, 0xfb, 0x5c, 0x54, 0xf7, 0x5a, 0x6,
+                                                     0x24, 0x2f, 0x3b, 0x25, 0x72, 0x71, 0x8f, 0x94,
+                                                     0x72, 0x1e, 0xe, 0xf7, 0x20, 0x26, 0xa2, 0xf9,
+                                                     0xba, 0xa2, 0x1, 0xf7, 0xe, 0xf7, 0x5, 0xf7,
+                                                     0xfa, 0xf7, 0x5, 0x3, 0xa4, 0x3d, 0x15, 0x74,
+                                                     0xf7, 0xc7, 0xa2, 0x7, 0x50, 0x65, 0xa0, 0xd1,
+                                                     0x1f, 0xf9, 0x43, 0xf7, 0xfa, 0xfd, 0x43, 0x7,
+                                                     0x45, 0x65, 0x76, 0x51, 0x1e, 0x74, 0xf7, 0xc6,
+                                                     0xa2, 0x7, 0x50, 0x65, 0xa0, 0xd1, 0x1f, 0xf8,
+                                                     0xf2, 0x7, 0xe8, 0xd0, 0x9b, 0xa7, 0x1e, 0xa2,
+                                                     0xfd, 0x9e, 0x74, 0x7, 0xa7, 0xd0, 0x7b, 0x2e,
+                                                     0x1f, 0xfc, 0xf2, 0x7, 0x45, 0x66, 0x76, 0x4f,
+                                                     0x1e, 0xe, 0xa9, 0x27, 0xf2, 0xf9, 0x4d, 0xb8,
+                                                     0x1, 0xf8, 0xef, 0x9f, 0x3, 0x99, 0xfb, 0x0,
+                                                     0x15, 0x9f, 0xa6, 0x93, 0x9f, 0x1b, 0xf8, 0x78,
+                                                     0x8e, 0x5, 0xa4, 0xaf, 0x84, 0x87, 0xa5, 0x1f,
+                                                     0x98, 0xf1, 0x90, 0x9f, 0xa4, 0xf1, 0x8, 0x74,
+                                                     0x6, 0x32, 0x68, 0x6b, 0x73, 0x3d, 0x1b, 0xfb,
+                                                     0xfd, 0x6, 0xf7, 0xba, 0xf7, 0xe7, 0xfb, 0xa5,
+                                                     0xf7, 0xfa, 0x5, 0xf7, 0x91, 0x6, 0xf7, 0x14,
+                                                     0x9a, 0x5a, 0x4a, 0x9f, 0x1f, 0x9f, 0x6, 0x85,
+                                                     0xf7, 0x33, 0x5, 0xfc, 0x85, 0x6, 0x69, 0x65,
+                                                     0x90, 0x8d, 0x69, 0x1f, 0xf7, 0xf1, 0xfc, 0x5a,
+                                                     0x5, 0xe, 0xf7, 0x7d, 0xc2, 0x1, 0x96, 0xf7,
+                                                     0x7d, 0x15, 0x42, 0xa, 0xe, 0xfb, 0x4b, 0xf7,
+                                                     0x2f, 0x76, 0xf7, 0x4f, 0xb9, 0x9e, 0xdb, 0xe0,
+                                                     0x77, 0x1, 0xf7, 0x81, 0x9d, 0x3, 0xcc, 0xf7,
+                                                     0x94, 0x15, 0x75, 0x9e, 0x7f, 0x9f, 0xa2, 0x93,
+                                                     0xa0, 0xa1, 0x9f, 0x1e, 0x9e, 0xa0, 0x97, 0x96,
+                                                     0xab, 0x9f, 0x8, 0x8e, 0x90, 0x92, 0x8c, 0x8d,
+                                                     0x1b, 0x91, 0x8a, 0x7f, 0x87, 0x76, 0x86, 0x7a,
+                                                     0x86, 0x7c, 0x1f, 0x83, 0x73, 0x80, 0x77, 0x6d,
+                                                     0x1a, 0x74, 0x96, 0x76, 0xa6, 0xa5, 0x95, 0xa2,
+                                                     0xa0, 0x8c, 0x1e, 0xa9, 0x81, 0x9f, 0x83, 0xa4,
+                                                     0x1e, 0x86, 0x9a, 0x87, 0x9b, 0xa0, 0x1a, 0x8f,
+                                                     0x89, 0x96, 0x91, 0x8e, 0x8e, 0x8a, 0x87, 0x92,
+                                                     0x1e, 0xa6, 0x7a, 0x9e, 0x7a, 0x98, 0x7e, 0x8,
+                                                     0x73, 0xa3, 0x99, 0x75, 0xa6, 0x1b, 0x9b, 0x99,
+                                                     0x97, 0xa1, 0xaa, 0x68, 0x94, 0x6e, 0x93, 0x1f,
+                                                     0x6f, 0x93, 0x6b, 0x93, 0x74, 0x97, 0x8, 0x84,
+                                                     0x8f, 0x85, 0x8e, 0x90, 0x1a, 0x8e, 0x8f, 0x8f,
+                                                     0x94, 0x90, 0x1e, 0xcd, 0xaa, 0x8d, 0x82, 0xb3,
+                                                     0x95, 0x8, 0x97, 0x8e, 0xa6, 0x98, 0xa3, 0x1a,
+                                                     0xa4, 0x7a, 0x97, 0x78, 0x6e, 0x79, 0x6b, 0x6f,
+                                                     0x70, 0x1e, 0x7f, 0x7f, 0x7a, 0x7f, 0x7d, 0x83,
+                                                     0x8, 0x88, 0x85, 0x86, 0x88, 0x88, 0x1b, 0x87,
+                                                     0x8a, 0x90, 0x98, 0xa6, 0x92, 0x9e, 0x92, 0x9f,
+                                                     0x1f, 0x91, 0x9c, 0x91, 0x9d, 0xa4, 0x1a, 0x9d,
+                                                     0x83, 0xa1, 0x70, 0x70, 0x83, 0x76, 0x79, 0x73,
+                                                     0x91, 0x79, 0x91, 0x78, 0x1e, 0x92, 0x77, 0x92,
+                                                     0x77, 0x71, 0x1a, 0x7f, 0x8a, 0x85, 0x87, 0x88,
+                                                     0x87, 0x8d, 0x8f, 0x84, 0x1e, 0x75, 0x96, 0x7d,
+                                                     0x97, 0x80, 0x96, 0x8, 0xa3, 0x75, 0x80, 0xae,
+                                                     0x6a, 0x1b, 0x73, 0x7b, 0x7a, 0x75, 0x71, 0x9f,
+                                                     0x83, 0xb3, 0x84, 0x1f, 0xa8, 0x86, 0x8b, 0x8d,
+                                                     0xc5, 0x70, 0x8, 0x96, 0x86, 0x90, 0x87, 0x88,
+                                                     0x1a, 0x88, 0x87, 0x87, 0x82, 0x86, 0x1e, 0x70,
+                                                     0x7b, 0x71, 0x84, 0x72, 0x86, 0x8, 0x6b, 0x86,
+                                                     0x63, 0x7f, 0x6c, 0x1a, 0xe, 0x65, 0xfa, 0x4f,
+                                                     0x1, 0x95, 0xf8, 0x8d, 0x3, 0xf8, 0x1, 0x65,
+                                                     0x15, 0xf7, 0x2a, 0xfa, 0x4a, 0x68, 0x90, 0xfb,
+                                                     0x13, 0xfd, 0xb2, 0xfb, 0x59, 0xf8, 0x31, 0xfb,
+                                                     0x26, 0x43, 0x9b, 0x6a, 0xeb, 0xba, 0x5, 0xe,
+                                                     0xa9, 0xf7, 0xf, 0xbe, 0xf7, 0x46, 0xbf, 0x1,
+                                                     0xa6, 0xc0, 0x3, 0xf8, 0x1, 0xf7, 0x81, 0x15,
+                                                     0x60, 0xb6, 0xda, 0x44, 0xd0, 0x1b, 0xad, 0xa8,
+                                                     0x9b, 0x9f, 0x9f, 0x1f, 0x6b, 0xad, 0x5, 0x7f,
+                                                     0x7d, 0x7b, 0x84, 0x7a, 0x1b, 0x5d, 0x59, 0xb2,
+                                                     0xc4, 0x50, 0x1f, 0xbc, 0xbf, 0xba, 0xb0, 0xb8,
+                                                     0x1b, 0xa0, 0x9f, 0x85, 0x7b, 0x9f, 0x1f, 0xa8,
+                                                     0xb1, 0x5, 0x93, 0x7e, 0x72, 0xa3, 0x63, 0x1b,
+                                                     0x37, 0x68, 0x64, 0x4e, 0x3f, 0x1f, 0xc6, 0x44,
+                                                     0x51, 0xb4, 0x47, 0x1b, 0x33, 0x55, 0x3f, 0x51,
+                                                     0x3e, 0xc3, 0x45, 0xde, 0xd6, 0xc7, 0xbf, 0xc9,
+                                                     0xcb, 0x1f, 0x62, 0xab, 0x15, 0x73, 0x7d, 0x3b,
+                                                     0x45, 0x4f, 0x1b, 0x56, 0x66, 0xc2, 0xb2, 0xa5,
+                                                     0xa3, 0xc4, 0xcf, 0xbe, 0xe1, 0x4c, 0x77, 0x9a,
+                                                     0x1f, 0xe, 0xa9, 0xf7, 0x10, 0xbe, 0xf7, 0x48,
+                                                     0xbc, 0x1, 0xa5, 0xbe, 0xf8, 0xc2, 0xc0, 0x3,
+                                                     0xf7, 0xf9, 0xf7, 0x80, 0x15, 0x76, 0xa3, 0xcf,
+                                                     0x30, 0xdf, 0x1b, 0xf4, 0xbd, 0xd2, 0xd5, 0xd1,
+                                                     0x4a, 0xcc, 0x31, 0x36, 0x67, 0x5a, 0x56, 0x54,
+                                                     0x1f, 0xc5, 0x4d, 0x61, 0xb7, 0x34, 0x1b, 0x42,
+                                                     0x8a, 0x48, 0x4f, 0x41, 0x1a, 0x41, 0xba, 0x44,
+                                                     0xe8, 0xf2, 0xcb, 0xe6, 0xa0, 0xa3, 0x1e, 0x69,
+                                                     0xac, 0x15, 0x58, 0x5d, 0x5a, 0x60, 0x4d, 0x1b,
+                                                     0x5c, 0x61, 0xae, 0xc6, 0xb0, 0xa6, 0xbc, 0xc9,
+                                                     0xbf, 0xb3, 0x6b, 0x55, 0xcc, 0x1f, 0xce, 0x16,
+                                                     0xc2, 0xca, 0xa1, 0xa8, 0xc5, 0x1b, 0xd6, 0xa6,
+                                                     0x51, 0x71, 0x49, 0x56, 0x6d, 0x5a, 0x61, 0x61,
+                                                     0xb2, 0xc4, 0x50, 0x1f, 0xe, 0xe0, 0x8b, 0xc2,
+                                                     0xf8, 0xfe, 0x77, 0x1, 0xa5, 0x16, 0xf9, 0x5c,
+                                                     0xc2, 0xfc, 0xd6, 0x6, 0xf8, 0xd6, 0xf8, 0xd9,
+                                                     0x62, 0xb0, 0x5, 0xe, 0x3b, 0xa0, 0x76, 0xf8,
+                                                     0x5a, 0x77, 0x1, 0xa2, 0x16, 0xcc, 0x6, 0xf7,
+                                                     0x6b, 0xf7, 0xf2, 0xf7, 0x6b, 0xfb, 0xf2, 0x5,
+                                                     0xcc, 0x6, 0xfb, 0xac, 0xf8, 0x5a, 0x5, 0xe,
+                                                     0x3b, 0xa0, 0x76, 0xf8, 0x71, 0x77, 0x1, 0xa9,
+                                                     0xf8, 0xb8, 0x3, 0xa9, 0xf8, 0x54, 0x15, 0xf7,
+                                                     0xa6, 0xfc, 0x54, 0xf7, 0xa6, 0xf8, 0x54, 0x5f,
+                                                     0xa8, 0xfb, 0x7a, 0xfc, 0xb, 0xfb, 0x7a, 0xf8,
+                                                     0xb, 0x5, 0xe, 0xe0, 0xa0, 0x76, 0xf8, 0x61,
+                                                     0xbb, 0x55, 0xa, 0x16, 0xc2, 0xf7, 0x51, 0x6,
+                                                     0xf7, 0x23, 0xf7, 0x27, 0xf7, 0x15, 0xf7, 0x24,
+                                                     0xf7, 0x32, 0xf7, 0x19, 0xfb, 0x27, 0xfb, 0x11,
+                                                     0x1e, 0xfb, 0x51, 0xc2, 0xf7, 0x51, 0x7, 0xf7,
+                                                     0x41, 0xfb, 0x2f, 0xf7, 0x27, 0xfb, 0x53, 0xfb,
+                                                     0x53, 0xfb, 0x2f, 0xfb, 0x27, 0xfb, 0x41, 0x1e,
+                                                     0xe, 0xe0, 0x7a, 0xba, 0xf8, 0x62, 0x77, 0x55,
+                                                     0xa, 0xf7, 0xc1, 0x15, 0xfb, 0x41, 0xf7, 0x2f,
+                                                     0xfb, 0x25, 0x4b, 0xa, 0xf7, 0x2f, 0xf7, 0x25,
+                                                     0xf7, 0x41, 0x1e, 0xf7, 0x53, 0x54, 0xfb, 0x52,
+                                                     0x7, 0xfb, 0x11, 0xfb, 0x19, 0xfb, 0x27, 0xfb,
+                                                     0x32, 0xfb, 0x24, 0xfb, 0x27, 0xf7, 0x15, 0xf7,
+                                                     0x23, 0x1e, 0xf7, 0x52, 0x54, 0x7, 0xe, 0xfc,
+                                                     0x2d, 0x20, 0xf7, 0x4, 0xf9, 0xb8, 0xf6, 0x1,
+                                                     0xf7, 0xc, 0xd1, 0x3, 0x8d, 0x58, 0x15, 0x6a,
+                                                     0xaa, 0x74, 0xae, 0xf7, 0x27, 0x6e, 0xf8, 0x5d,
+                                                     0xf7, 0x1e, 0x8f, 0x1e, 0xf7, 0x1c, 0x76, 0xf7,
+                                                     0x31, 0x8d, 0xb0, 0x1e, 0x95, 0x8c, 0x8e, 0x92,
+                                                     0x94, 0x9b, 0x9a, 0x71, 0xac, 0x1b, 0xa4, 0x9d,
+                                                     0x9d, 0xa6, 0xb2, 0x72, 0xa2, 0x67, 0xfb, 0xb,
+                                                     0x94, 0xfb, 0x8a, 0xfb, 0x27, 0x1f, 0x8a, 0xfb,
+                                                     0xca, 0x90, 0x2e, 0x8d, 0x41, 0x8, 0x5c, 0x8d,
+                                                     0x8a, 0x73, 0x7c, 0x7c, 0x7a, 0xa9, 0x71, 0x1b,
+                                                     0x6f, 0x73, 0x7e, 0x60, 0x1f, 0xe, 0xf7, 0x48,
+                                                     0x8b, 0xf7, 0x15, 0xf7, 0x6f, 0xf7, 0x16, 0x1,
+                                                     0xf7, 0x37, 0xf7, 0x15, 0xd6, 0xf7, 0x16, 0xd6,
+                                                     0xf7, 0x15, 0x14, 0x38, 0xf7, 0x37, 0xcc, 0x15,
+                                                     0x52, 0xa, 0x6f, 0xa7, 0x67, 0x67, 0x6e, 0x6f,
+                                                     0x67, 0x1e, 0xf8, 0x2d, 0x16, 0x52, 0xa, 0x6d,
+                                                     0xa7, 0x67, 0x67, 0x70, 0x6f, 0x67, 0x1e, 0xfb,
+                                                     0x61, 0xf7, 0xf0, 0x15, 0x67, 0xa8, 0x6e, 0xaf,
+                                                     0xaf, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, 0xa8, 0x67,
+                                                     0x67, 0x6e, 0x6e, 0x67, 0x1e, 0xe, 0xf7, 0x5f,
+                                                     0xbf, 0x8b, 0xbf, 0x12, 0x9c, 0xf8, 0x94, 0x17,
+                                                     0x13, 0x60, 0xbc, 0xf7, 0x5f, 0x15, 0xa9, 0xa6,
+                                                     0xaa, 0xa1, 0xb8, 0x1b, 0xa9, 0xaa, 0x7f, 0x7c,
+                                                     0xba, 0x1f, 0x7f, 0xb1, 0xc0, 0x7e, 0xba, 0x1b,
+                                                     0xa2, 0xa1, 0x92, 0x94, 0x9f, 0x1f, 0xaa, 0x9a,
+                                                     0xa5, 0xa0, 0x94, 0x9d, 0x6a, 0xad, 0x18, 0x7c,
+                                                     0x7d, 0x6f, 0x66, 0x53, 0x1b, 0x63, 0x5f, 0x96,
+                                                     0x98, 0x65, 0x1f, 0x13, 0xe0, 0x99, 0x63, 0x66,
+                                                     0x99, 0x5c, 0x1b, 0x40, 0x6a, 0x61, 0x73, 0x70,
+                                                     0x1f, 0xe, 0x8b, 0xc2, 0xf7, 0x15, 0xc2, 0xf7,
+                                                     0x1b, 0xba, 0x90, 0xbb, 0x12, 0x96, 0xf7, 0x4c,
+                                                     0x15, 0x3a, 0xa, 0xfb, 0x83, 0x4, 0x3a, 0xa,
+                                                     0x13, 0x30, 0xba, 0xf7, 0xcf, 0x15, 0xab, 0xa8,
+                                                     0xa2, 0xa3, 0xbe, 0x1b, 0xa5, 0xad, 0x84, 0x7b,
+                                                     0xb9, 0x1f, 0x13, 0x20, 0x78, 0xc0, 0xb4, 0x81,
+                                                     0xaf, 0x1b, 0xa4, 0xa1, 0x90, 0x96, 0xa2, 0x1f,
+                                                     0xb7, 0xa0, 0x96, 0xa4, 0x93, 0x9a, 0x66, 0xa3,
+                                                     0x18, 0x7b, 0x7d, 0x73, 0x65, 0x4b, 0x1b, 0x72,
+                                                     0x63, 0x94, 0x97, 0x6c, 0x1f, 0x13, 0x10, 0x66,
+                                                     0x99, 0x60, 0x9c, 0x5e, 0x8c, 0x8, 0x34, 0x5e,
+                                                     0x5d, 0x6b, 0x77, 0x1f, 0xe, 0xf7, 0x1b, 0xbe,
+                                                     0xf4, 0xbe, 0x12, 0x99, 0xf8, 0x96, 0x17, 0xb9,
+                                                     0xf7, 0xb7, 0x57, 0xa, 0xb3, 0x7b, 0x7d, 0xbc,
+                                                     0x1f, 0x80, 0xb0, 0xb6, 0x32, 0xa, 0x97, 0x98,
+                                                     0x65, 0x1f, 0x98, 0x63, 0x62, 0x99, 0x5c, 0x1b,
+                                                     0x40, 0x68, 0x63, 0x72, 0x6d, 0x1f, 0xab, 0xfb,
+                                                     0x56, 0x57, 0xa, 0xb5, 0x7b, 0x7d, 0xbc, 0x1f,
+                                                     0x13, 0xa0, 0x80, 0xb0, 0xb4, 0x32, 0xa, 0x98,
+                                                     0x98, 0x64, 0x1f, 0x98, 0x63, 0x63, 0x98, 0x5c,
+                                                     0x1b, 0x40, 0x68, 0x62, 0x72, 0x6d, 0x1f, 0xe,
+                                                     0x87, 0x76, 0xf7, 0x35, 0xc2, 0xf7, 0x1f, 0xc2,
+                                                     0xf7, 0x38, 0x77, 0x1, 0xe9, 0x16, 0xbd, 0x72,
+                                                     0xe6, 0xf7, 0x35, 0x5, 0xf7, 0xc5, 0xc2, 0xfb,
+                                                     0xa7, 0x6, 0xd8, 0xf7, 0x1f, 0x5, 0xf7, 0x5a,
+                                                     0xc2, 0xfb, 0x3c, 0x6, 0xd7, 0xf7, 0x1c, 0x5a,
+                                                     0xa7, 0x30, 0xfb, 0x38, 0x5, 0xfb, 0xb9, 0x54,
+                                                     0xf7, 0x9a, 0x6, 0x3e, 0xfb, 0x1f, 0x5, 0xfb,
+                                                     0x4d, 0x54, 0xf7, 0x2f, 0x6, 0xe, 0xdd, 0xc2,
+                                                     0xed, 0xc2, 0xed, 0xc2, 0x1, 0x99, 0xf8, 0xa0,
+                                                     0x14, 0xe0, 0x99, 0xf8, 0x18, 0x15, 0x42, 0xa,
+                                                     0xfb, 0x64, 0x4, 0x42, 0xa, 0xfb, 0x64, 0x4,
+                                                     0x42, 0xa, 0xe, 0x3d, 0xa, 0xf7, 0xb8, 0x4,
+                                                     0xf8, 0x85, 0xfb, 0x76, 0x5, 0xc9, 0x7, 0xfc,
+                                                     0x45, 0xf7, 0x57, 0x3e, 0xa, 0x3d, 0xa, 0xcd,
+                                                     0x4, 0xf8, 0x85, 0xf7, 0x76, 0x5, 0x51, 0xa,
+                                                     0xf8, 0x45, 0xfb, 0x5b, 0xfc, 0x45, 0xfb, 0x57,
+                                                     0x5, 0xe, 0xa9, 0x8b, 0x47, 0xa, 0xb1, 0xc5,
+                                                     0x3, 0xf9, 0x46, 0x16, 0xc2, 0xfc, 0x29, 0x7,
+                                                     0x21, 0x8c, 0x39, 0xe3, 0xe2, 0x1a, 0xf0, 0xe1,
+                                                     0xde, 0xf3, 0x1e, 0xf8, 0x27, 0xc2, 0xfc, 0x28,
+                                                     0x6, 0xfb, 0x33, 0x34, 0xfb, 0x11, 0xfb, 0x6,
+                                                     0x8a, 0x1f, 0xfb, 0x19, 0x8a, 0xf7, 0x6, 0x29,
+                                                     0xf7, 0x16, 0x1b, 0xe, 0xa9, 0x8b, 0x47, 0xa,
+                                                     0xf8, 0xfb, 0xc5, 0x3, 0xf8, 0x40, 0x16, 0xf7,
+                                                     0x16, 0xf7, 0x7, 0xed, 0xf7, 0x19, 0xf7, 0x6,
+                                                     0x31, 0xf7, 0x11, 0xfb, 0x33, 0x1f, 0xfc, 0x28,
+                                                     0x54, 0xf8, 0x27, 0x6, 0xf3, 0xe3, 0x38, 0x26,
+                                                     0x34, 0x37, 0x33, 0x21, 0x58, 0xa, 0xa9, 0x5a,
+                                                     0x76, 0xd1, 0xc2, 0xf7, 0xfb, 0xc2, 0xd2, 0x77,
+                                                     0x1, 0xaf, 0xc5, 0x3, 0xf7, 0x8d, 0x45, 0x15,
+                                                     0xc7, 0x6, 0xaf, 0xd1, 0x5, 0xf7, 0xed, 0xc2,
+                                                     0xfb, 0xd0, 0x6, 0xf7, 0x44, 0xf7, 0xfb, 0x5,
+                                                     0xf7, 0x20, 0xc2, 0xfb, 0x4, 0x6, 0xb0, 0xd2,
+                                                     0x5, 0x4f, 0x6, 0x67, 0x44, 0x5, 0xfb, 0x8a,
+                                                     0x6, 0xfb, 0x4, 0xfb, 0x11, 0x36, 0xfb, 0x2b,
+                                                     0xfb, 0x31, 0xf7, 0x11, 0x3f, 0xf7, 0x10, 0x8a,
+                                                     0x1f, 0xa7, 0xc2, 0x15, 0xfb, 0x14, 0x8c, 0x30,
+                                                     0xdc, 0xee, 0x1a, 0xe2, 0xd9, 0xe7, 0xf5, 0x1e,
+                                                     0xf7, 0x68, 0x6, 0xe, 0xa9, 0xfb, 0x11, 0xc2,
+                                                     0xd1, 0x47, 0xa, 0xb0, 0xc3, 0x3, 0xb0, 0x45,
+                                                     0x15, 0x54, 0xf9, 0x21, 0xc2, 0x7, 0xd1, 0x4,
+                                                     0xc2, 0xfc, 0x29, 0x7, 0xfb, 0x10, 0x8c, 0x46,
+                                                     0xee, 0x8c, 0xdc, 0x8, 0xf7, 0x0, 0x8c, 0xea,
+                                                     0xd2, 0xed, 0x1b, 0xf8, 0x27, 0xc2, 0xfc, 0x28,
+                                                     0x6, 0xfb, 0x40, 0x3e, 0xfb, 0x16, 0xfb, 0x1,
+                                                     0xfb, 0x19, 0xf3, 0x29, 0xf7, 0x21, 0x1f, 0xe,
+                                                     0xa9, 0xfb, 0x11, 0xc2, 0xd1, 0x47, 0xa, 0xf8,
+                                                     0xfd, 0xc3, 0x3, 0x9f, 0xfb, 0x11, 0x15, 0xf9,
+                                                     0x21, 0xc2, 0xfd, 0x21, 0x6, 0xf8, 0x2c, 0xd1,
+                                                     0x15, 0xf7, 0x21, 0xf3, 0xed, 0xf7, 0x19, 0xf7,
+                                                     0x1, 0x3e, 0xf7, 0x16, 0xfb, 0x40, 0x1f, 0xfc,
+                                                     0x28, 0x54, 0xf8, 0x27, 0x6, 0xed, 0xeb, 0x44,
+                                                     0xfb, 0x0, 0x3a, 0x47, 0x28, 0xfb, 0x10, 0x58,
+                                                     0xa, 0xe0, 0x7c, 0xc0, 0xf7, 0x9d, 0xc1, 0xf7,
+                                                     0x9d, 0xc0, 0x1, 0xb6, 0xc4, 0xf7, 0x99, 0xc1,
+                                                     0xf7, 0x9d, 0xc0, 0x14, 0xe0, 0xf7, 0x24, 0xf7,
+                                                     0xc3, 0x15, 0xf7, 0x6d, 0xfb, 0x71, 0xc1, 0xf7,
+                                                     0x71, 0xf7, 0x6e, 0xc1, 0xfb, 0x6e, 0xf7, 0x6f,
+                                                     0x55, 0xfb, 0x6f, 0xfb, 0x6d, 0x6, 0x5f, 0x70,
+                                                     0x15, 0xf7, 0x35, 0xf7, 0x13, 0x30, 0xa, 0xfb,
+                                                     0x13, 0xf7, 0x17, 0xf7, 0x35, 0x1e, 0x52, 0x16,
+                                                     0x21, 0xa, 0xe, 0xe0, 0x7a, 0xc0, 0xf8, 0xdc,
+                                                     0xc0, 0x1, 0xb6, 0xc0, 0xf8, 0xdc, 0xc0, 0x3,
+                                                     0xf7, 0x54, 0xf7, 0x3f, 0x15, 0xb2, 0x64, 0xf7,
+                                                     0x31, 0xf7, 0x32, 0xf7, 0x32, 0xfb, 0x33, 0xb2,
+                                                     0xb1, 0xfb, 0x32, 0xf7, 0x33, 0xf7, 0x30, 0xf7,
+                                                     0x30, 0x64, 0xb1, 0xfb, 0x30, 0xfb, 0x30, 0xfb,
+                                                     0x31, 0xf7, 0x32, 0x64, 0x64, 0xf7, 0x31, 0xfb,
+                                                     0x31, 0x5, 0xfb, 0xc6, 0x16, 0x21, 0xa, 0xc0,
+                                                     0x16, 0xf7, 0x35, 0xf7, 0x17, 0x30, 0xa, 0xfb,
+                                                     0x17, 0xf7, 0x17, 0xf7, 0x35, 0x1e, 0xe, 0x72,
+                                                     0x8b, 0xc2, 0xf8, 0xff, 0x77, 0x1, 0xf7, 0xc6,
+                                                     0xc2, 0x3, 0x9a, 0x16, 0xf9, 0x11, 0xc2, 0xfb,
+                                                     0xb7, 0xf8, 0xff, 0x54, 0xfc, 0xff, 0xfb, 0xb7,
+                                                     0x6, 0xe, 0xfc, 0x45, 0xf7, 0x66, 0xef, 0x1,
+                                                     0xd0, 0xef, 0x3, 0xd0, 0xf7, 0x98, 0x15, 0x6f,
+                                                     0xa1, 0x75, 0xa7, 0xa6, 0xa2, 0xa1, 0xa7, 0xa6,
+                                                     0x74, 0xa2, 0x70, 0x6f, 0x75, 0x74, 0x70, 0x1e,
+                                                     0xe, 0x8e, 0x4d, 0x76, 0xf9, 0xe9, 0xf7, 0x2b,
+                                                     0x1, 0xf7, 0xe0, 0xd1, 0x3, 0xf7, 0xe0, 0x38,
+                                                     0x15, 0xd1, 0xf8, 0x13, 0x6, 0xf8, 0x88, 0xf7,
+                                                     0x33, 0xd0, 0xae, 0x93, 0x92, 0x89, 0x89, 0x8f,
+                                                     0x1e, 0x82, 0x86, 0x80, 0x79, 0x78, 0x1a, 0x73,
+                                                     0x9d, 0x6e, 0xb1, 0xb7, 0x9f, 0xb3, 0xb2, 0xaf,
+                                                     0x68, 0xaf, 0x5e, 0x4f, 0xfb, 0x87, 0x59, 0xfc,
+                                                     0xd3, 0x1e, 0xe, 0x8e, 0x3a, 0xf7, 0x29, 0xf9,
+                                                     0xe9, 0x77, 0x1, 0xf7, 0xee, 0xd0, 0x3, 0xf7,
+                                                     0x1e, 0x70, 0x15, 0x94, 0x90, 0x96, 0x9d, 0x9e,
+                                                     0x1a, 0xa3, 0x79, 0xa8, 0x65, 0x5f, 0x78, 0x64,
+                                                     0x64, 0x67, 0xad, 0x68, 0xb8, 0xc7, 0xf7, 0x81,
+                                                     0xbb, 0xf8, 0xd3, 0x1e, 0xf8, 0xf, 0x46, 0xfc,
+                                                     0x13, 0x7, 0xfc, 0x88, 0xfb, 0x2e, 0x46, 0x68,
+                                                     0x83, 0x84, 0x8d, 0x8d, 0x87, 0x1e, 0xe, 0x4c,
+                                                     0xa, 0xa4, 0xf7, 0xa6, 0x15, 0xf7, 0x7a, 0xfc,
+                                                     0x6c, 0xbe, 0xa4, 0xfb, 0x6e, 0xf8, 0x53, 0xf7,
+                                                     0x6e, 0xf8, 0x54, 0x58, 0xa3, 0x5, 0xe, 0x4c,
+                                                     0xa, 0xd3, 0xfb, 0x5a, 0x15, 0xf7, 0x7a, 0xf8,
+                                                     0x6c, 0xfb, 0x7a, 0xf8, 0x6c, 0x58, 0x73, 0xf7,
+                                                     0x6e, 0xfc, 0x54, 0xfb, 0x6e, 0xfc, 0x53, 0x5,
+                                                     0xe, 0xfb, 0x51, 0xa0, 0x76, 0xf9, 0x7d, 0x77,
+                                                     0x1, 0x9d, 0xc7, 0xf7, 0xde, 0xc7, 0x3, 0xf7,
+                                                     0x68, 0x16, 0xc7, 0x6, 0xf7, 0x58, 0xf8, 0xd,
+                                                     0xfb, 0x58, 0xf8, 0x4, 0x5, 0x4f, 0x6, 0xfb,
+                                                     0x56, 0xfc, 0x4, 0x5, 0xf7, 0x74, 0xfb, 0xd6,
+                                                     0x15, 0xfb, 0x38, 0xf7, 0xd6, 0xf7, 0x38, 0xf7,
+                                                     0xce, 0xf7, 0x3a, 0xfb, 0xce, 0x5, 0xe, 0xd1,
+                                                     0x7c, 0x76, 0xf8, 0xdc, 0x77, 0x1, 0xf7, 0xec,
+                                                     0xc1, 0x3, 0xf7, 0xbb, 0x67, 0x15, 0xf7, 0x2c,
+                                                     0x6, 0x84, 0x95, 0x62, 0xac, 0x8a, 0xce, 0x8,
+                                                     0xaf, 0x8a, 0x94, 0xa0, 0x9d, 0x1b, 0x91, 0x8f,
+                                                     0x86, 0x81, 0x90, 0x1f, 0x5d, 0xa2, 0xa2, 0x5e,
+                                                     0xcc, 0x1b, 0xbb, 0xaa, 0xc4, 0xbb, 0xc0, 0x74,
+                                                     0xb2, 0x61, 0xc2, 0x1f, 0x2d, 0xf7, 0x10, 0x6f,
+                                                     0xae, 0x44, 0xf7, 0x4, 0x44, 0xfb, 0x4, 0x6f,
+                                                     0x68, 0x2d, 0xfb, 0x10, 0x8, 0x61, 0x54, 0x74,
+                                                     0x64, 0x56, 0x1a, 0x5f, 0xa1, 0x4c, 0xcb, 0xc8,
+                                                     0xa6, 0xc6, 0xb1, 0x9c, 0x1e, 0x92, 0x8e, 0x8f,
+                                                     0x90, 0x94, 0x1b, 0x98, 0x97, 0x77, 0x65, 0x8a,
+                                                     0x1f, 0x8a, 0x48, 0x62, 0x6a, 0x84, 0x81, 0x8,
+                                                     0xe, 0xd1, 0x86, 0x76, 0xf7, 0x3c, 0xf7, 0x17,
+                                                     0x12, 0xf7, 0xe5, 0xd2, 0x4f, 0xbd, 0x13, 0xd0,
+                                                     0xf7, 0xbf, 0x71, 0x15, 0xf7, 0x28, 0x6, 0x70,
+                                                     0xac, 0x75, 0x9f, 0xcd, 0x1a, 0xaa, 0x8e, 0x9e,
+                                                     0x99, 0x95, 0x9a, 0x7e, 0x6f, 0xa2, 0x1e, 0x6b,
+                                                     0xa6, 0xab, 0x81, 0xb2, 0x1b, 0xc5, 0xb4, 0xc7,
+                                                     0xc9, 0xd1, 0x67, 0xc6, 0x47, 0x5f, 0x5e, 0x6d,
+                                                     0x83, 0x7c, 0x1f, 0x13, 0xe0, 0x70, 0x7d, 0x7a,
+                                                     0x92, 0x9a, 0x1a, 0x92, 0x8f, 0x92, 0x90, 0x90,
+                                                     0x1e, 0x9d, 0x9e, 0xcd, 0xb0, 0xd1, 0x1a, 0xd9,
+                                                     0x4b, 0xa8, 0x4b, 0x4a, 0x4b, 0x6c, 0x38, 0x48,
+                                                     0xd1, 0x67, 0x9a, 0x7b, 0x1e, 0x90, 0x85, 0x8e,
+                                                     0x85, 0x84, 0x1a, 0x7c, 0x79, 0x86, 0x72, 0x97,
+                                                     0x1e, 0x93, 0x7c, 0x64, 0xa9, 0x5f, 0x1b, 0x46,
+                                                     0x62, 0x53, 0x46, 0x47, 0xb5, 0x50, 0xcc, 0xaf,
+                                                     0xa8, 0x98, 0xa9, 0xa5, 0x1f, 0xa7, 0xa4, 0x9b,
+                                                     0x97, 0x94, 0x1b, 0x13, 0xd0, 0x99, 0x8b, 0x71,
+                                                     0x74, 0x49, 0x74, 0x76, 0x71, 0x6b, 0x1f, 0xe,
+                                                     0xd1, 0x7f, 0x76, 0xf8, 0xc9, 0x77, 0x1, 0xf8,
+                                                     0xa, 0x6a, 0x15, 0xd9, 0xf7, 0x7, 0x9a, 0xa7,
+                                                     0xe6, 0xf7, 0x9, 0x8, 0xb4, 0xc0, 0xab, 0xc0,
+                                                     0xc4, 0x1a, 0xf7, 0x8, 0x43, 0xa5, 0x61, 0x5d,
+                                                     0x5d, 0x76, 0x48, 0x72, 0x1e, 0x78, 0x83, 0x88,
+                                                     0x75, 0x7c, 0x1b, 0x7c, 0x88, 0xa1, 0x9e, 0x83,
+                                                     0x1f, 0xce, 0x72, 0x5d, 0xa0, 0x5d, 0x1b, 0x61,
+                                                     0x43, 0x71, 0xfb, 0x8, 0x52, 0xab, 0x56, 0xb4,
+                                                     0x56, 0x1f, 0xe6, 0xfb, 0x9, 0x9a, 0x6f, 0xd9,
+                                                     0xfb, 0x7, 0x8, 0xe, 0xd1, 0x7c, 0x76, 0xf8,
+                                                     0xde, 0x77, 0x1, 0xf7, 0x22, 0xf8, 0x5e, 0x3,
+                                                     0xf7, 0x22, 0xf7, 0x95, 0x15, 0xf7, 0x7c, 0xfb,
+                                                     0xb9, 0xf7, 0x76, 0xf7, 0xb9, 0xfb, 0x76, 0xf7,
+                                                     0xb9, 0x5, 0xe, 0xf6, 0x7c, 0xb3, 0xf3, 0xb1,
+                                                     0xf7, 0xdb, 0xa5, 0xf7, 0x7, 0xb3, 0x1, 0xbe,
+                                                     0xb3, 0xf7, 0xa, 0xcc, 0xf7, 0x92, 0x9f, 0xf7,
+                                                     0x2d, 0xb3, 0x3, 0xf8, 0xaf, 0xf7, 0x70, 0x15,
+                                                     0x62, 0x59, 0x6a, 0x7f, 0x5e, 0x1b, 0x40, 0x4d,
+                                                     0xc7, 0xf1, 0xd5, 0xb8, 0xe6, 0xdc, 0xc6, 0xc6,
+                                                     0x6c, 0x42, 0x95, 0x1f, 0x9f, 0x6, 0x87, 0xf7,
+                                                     0x14, 0x5, 0x78, 0x6, 0x88, 0x7d, 0x7c, 0x86,
+                                                     0x79, 0x8f, 0x8, 0x90, 0x76, 0x6b, 0x97, 0x64,
+                                                     0x1b, 0x24, 0x36, 0x31, 0x23, 0xfb, 0x9, 0xdb,
+                                                     0x3b, 0xf7, 0xb, 0xd7, 0xb7, 0xbd, 0xa2, 0xa1,
+                                                     0x1f, 0xfc, 0x87, 0xf7, 0x14, 0x23, 0xa, 0xf6,
+                                                     0x7a, 0xb3, 0xf7, 0x18, 0x9d, 0xf7, 0x31, 0xa2,
+                                                     0xf7, 0x32, 0xa3, 0xed, 0xb3, 0x1, 0xbd, 0xb3,
+                                                     0xf7, 0x51, 0xcb, 0xf7, 0x17, 0xcf, 0xf7, 0x32,
+                                                     0xb3, 0x3, 0xbd, 0xf7, 0xdc, 0x4f, 0xa, 0xf7,
+                                                     0x52, 0xf7, 0x2f, 0xf7, 0x2e, 0xf7, 0x53, 0x48,
+                                                     0xa, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x52, 0x8c,
+                                                     0x2c, 0xa, 0x1e, 0xfb, 0x3d, 0x8a, 0xfb, 0x1c,
+                                                     0x43, 0xa, 0x1a, 0xf7, 0x20, 0xfb, 0x40, 0x15,
+                                                     0xf7, 0x34, 0x9d, 0x6, 0x75, 0x72, 0x9a, 0xa3,
+                                                     0x1f, 0xf7, 0xa, 0xa5, 0x7, 0xf7, 0x19, 0xfb,
+                                                     0x43, 0x5, 0xea, 0x9d, 0x6, 0x7e, 0x7f, 0x8b,
+                                                     0x99, 0x80, 0x1f, 0xfb, 0xc, 0xf7, 0x2c, 0x5,
+                                                     0xc5, 0x9c, 0xb6, 0xa2, 0xc9, 0x1a, 0xd8, 0x3b,
+                                                     0x9c, 0x4f, 0x1e, 0xfb, 0x3b, 0x79, 0x6, 0xb3,
+                                                     0x8f, 0x80, 0x6e, 0x1f, 0xfb, 0xa0, 0x7, 0x78,
+                                                     0x71, 0x7a, 0x74, 0x1e, 0xf7, 0x5, 0xf7, 0x48,
+                                                     0x15, 0xf7, 0x12, 0x7, 0x9c, 0x95, 0x9a, 0x95,
+                                                     0xcf, 0xb5, 0x79, 0x58, 0x8c, 0x1e, 0x39, 0x43,
+                                                     0x85, 0x50, 0x8a, 0x1e, 0xe, 0xf7, 0x63, 0xf7,
+                                                     0xce, 0x76, 0xf7, 0xf9, 0xa2, 0x79, 0x9d, 0x12,
+                                                     0x9d, 0x9d, 0xf7, 0x6, 0xc6, 0xf7, 0x6, 0x9d,
+                                                     0xdd, 0xa6, 0xf7, 0xbc, 0xc6, 0x13, 0xdf, 0xee,
+                                                     0xf7, 0xb9, 0x15, 0xf7, 0x34, 0x9d, 0x6, 0x6c,
+                                                     0x78, 0x9a, 0xa2, 0x1f, 0xf7, 0xc2, 0x7, 0xb0,
+                                                     0x8a, 0xc3, 0x89, 0xa2, 0x6e, 0x89, 0x5f, 0x19,
+                                                     0x9d, 0x8c, 0x88, 0xec, 0x5, 0xfb, 0xd1, 0x6,
+                                                     0x88, 0x2a, 0x9d, 0x8a, 0x89, 0xb7, 0xa2, 0xa8,
+                                                     0xc3, 0x8d, 0x19, 0xb0, 0x8c, 0x5, 0xfb, 0xc2,
+                                                     0x4a, 0xa, 0xf7, 0xa5, 0x79, 0x15, 0xf7, 0x15,
+                                                     0x9d, 0x6, 0x6c, 0x77, 0x9a, 0xa2, 0x1f, 0xf7,
+                                                     0x8f, 0x7, 0xf7, 0x24, 0xfb, 0xc7, 0x5, 0x9d,
+                                                     0x6, 0xf7, 0x1a, 0xf7, 0xd7, 0x5, 0xfb, 0x9f,
+                                                     0x4a, 0xa, 0x79, 0xf7, 0x34, 0x9d, 0x7, 0x6c,
+                                                     0x78, 0x9a, 0xa2, 0x1f, 0xf7, 0xad, 0x7, 0x13,
+                                                     0xbf, 0xa6, 0xa8, 0x89, 0xa0, 0x1e, 0x9d, 0xfb,
+                                                     0x5, 0x7, 0xfb, 0x12, 0xfb, 0xb4, 0xfb, 0x18,
+                                                     0xf7, 0xb4, 0x5, 0xfb, 0x6, 0x79, 0x6, 0xab,
+                                                     0xa0, 0x8e, 0x65, 0x1f, 0xfb, 0xa3, 0x4a, 0xa,
+                                                     0xe, 0xfb, 0x4b, 0xfa, 0x5, 0xaf, 0x1, 0xf8,
+                                                     0x74, 0xfa, 0x5, 0x15, 0xf8, 0xf6, 0xaf, 0xfc,
+                                                     0xf6, 0x6, 0xe, 0x3b, 0x28, 0x76, 0xfa, 0xfe,
+                                                     0x49, 0xa, 0xf7, 0xac, 0xfb, 0xc, 0x15, 0xc3,
+                                                     0xfa, 0xfe, 0x53, 0x6, 0xe, 0xf7, 0xd1, 0xf7,
+                                                     0x70, 0xc3, 0x1, 0x4f, 0xfa, 0xea, 0x3, 0x4f,
+                                                     0xf7, 0x70, 0x15, 0xfa, 0xea, 0xc3, 0xfe, 0xea,
+                                                     0x6, 0xe, 0xf6, 0x77, 0xb3, 0xf7, 0xb4, 0xb6,
+                                                     0xf7, 0x17, 0xb6, 0xf4, 0xb3, 0x1, 0xbd, 0xb3,
+                                                     0xf7, 0x44, 0xbc, 0xf7, 0x54, 0xb9, 0xf7, 0x27,
+                                                     0xb3, 0x3, 0xbd, 0xf7, 0xd9, 0x4f, 0xa, 0x1e,
+                                                     0xf7, 0x52, 0x8c, 0xf7, 0x2f, 0xf7, 0x2d, 0xf7,
+                                                     0x53, 0x1a, 0x48, 0xa, 0xfb, 0x2e, 0xfb, 0x2f,
+                                                     0xfb, 0x52, 0x2c, 0xa, 0xfb, 0x3d, 0xfb, 0x1c,
+                                                     0xf7, 0x1c, 0xf7, 0x3c, 0x1e, 0xf7, 0x44, 0xfb,
+                                                     0x50, 0x15, 0xbc, 0xf7, 0x40, 0xf7, 0x11, 0x6,
+                                                     0xd2, 0x82, 0x3c, 0x67, 0x8c, 0x1f, 0x8c, 0x6f,
+                                                     0x93, 0x89, 0x94, 0x79, 0x8, 0x9e, 0xa1, 0x8b,
+                                                     0x9e, 0x1b, 0x73, 0xa7, 0x87, 0xa3, 0xb0, 0x1a,
+                                                     0xbe, 0x7c, 0xa6, 0x6c, 0xa0, 0x1e, 0xb0, 0xa7,
+                                                     0x98, 0x9d, 0xbc, 0x1a, 0xe1, 0x4d, 0x96, 0x50,
+                                                     0x1e, 0xfb, 0x3e, 0x6, 0xbc, 0xfb, 0x42, 0x15,
+                                                     0xf7, 0x17, 0xf7, 0xe, 0x7, 0xa9, 0xb3, 0x83,
+                                                     0x4a, 0x5a, 0x66, 0x82, 0x6a, 0x1f, 0xe, 0xf6,
+                                                     0x7c, 0xb3, 0xef, 0xb9, 0xf7, 0xcc, 0xb6, 0xf7,
+                                                     0x1, 0xb3, 0x1, 0xbc, 0xb3, 0xf7, 0x1e, 0xbc,
+                                                     0xf7, 0x80, 0xb8, 0xf7, 0x22, 0xb3, 0x3, 0xf8,
+                                                     0x94, 0xf7, 0xa6, 0x15, 0x52, 0x59, 0x5d, 0x52,
+                                                     0x35, 0x60, 0xe5, 0xd6, 0xdd, 0xb7, 0xcc, 0xd8,
+                                                     0xce, 0xb3, 0x6f, 0x58, 0x8d, 0x1e, 0xbe, 0x6,
+                                                     0xe5, 0x89, 0x44, 0xab, 0x33, 0x1b, 0xfb, 0x0,
+                                                     0x4e, 0x33, 0x23, 0xfb, 0x4, 0xcd, 0x2a, 0xf7,
+                                                     0x4, 0xf7, 0x0, 0xb9, 0xe7, 0xc4, 0x1f, 0xfc,
+                                                     0x92, 0xc3, 0x23, 0xa, 0xf2, 0xf7, 0xce, 0x76,
+                                                     0xf7, 0xe5, 0xb6, 0x1, 0xf7, 0x16, 0xbc, 0xf7,
+                                                     0x50, 0xbc, 0xf7, 0x98, 0xbc, 0x3, 0xf7, 0x16,
+                                                     0xf7, 0xb9, 0x15, 0xbc, 0xf7, 0xe5, 0xf7, 0x11,
+                                                     0xb6, 0xfb, 0xbf, 0x60, 0xf7, 0x11, 0x6, 0xf7,
+                                                     0x81, 0xfb, 0xe5, 0x15, 0xbc, 0xf7, 0xc9, 0x6,
+                                                     0xf4, 0xfb, 0xc4, 0x5, 0xbd, 0x6, 0xf4, 0xf7,
+                                                     0xc4, 0x5, 0xfb, 0xc9, 0xbc, 0xf8, 0x10, 0x44,
+                                                     0x7, 0xfb, 0x0, 0xfb, 0xd2, 0xfb, 0x0, 0xf7,
+                                                     0xd2, 0x5, 0x44, 0x6, 0xe, 0xfb, 0xbf, 0xfb,
+                                                     0xb9, 0x1c, 0x4, 0xb9, 0x1, 0xa3, 0xdf, 0x3,
+                                                     0xa3, 0xfb, 0xb9, 0x15, 0xdf, 0xf8, 0x2e, 0x6,
+                                                     0xf7, 0xf3, 0xf5, 0xf7, 0xc9, 0xf7, 0x72, 0xf7,
+                                                     0x1f, 0x1e, 0x7e, 0x95, 0x5, 0xfb, 0x57, 0x2a,
+                                                     0xfb, 0x60, 0xfb, 0x62, 0xfc, 0x8e, 0x1a, 0xe,
+                                                     0xfb, 0xbf, 0xfa, 0x31, 0x8b, 0x1, 0xa3, 0xdf,
+                                                     0x3, 0xa3, 0x54, 0xa, 0x3f, 0xa, 0xa3, 0xdf,
+                                                     0x3, 0xf8, 0x41, 0xfb, 0xb9, 0x15, 0x92, 0x95,
+                                                     0x5, 0xfb, 0x72, 0xf7, 0x29, 0x21, 0xf7, 0xbf,
+                                                     0xf7, 0xf3, 0x1a, 0xf8, 0x2e, 0x37, 0xfc, 0x2e,
+                                                     0x7, 0xfc, 0x8e, 0xf7, 0x65, 0xfb, 0x58, 0xf7,
+                                                     0x57, 0x20, 0x1e, 0xe, 0xfb, 0xbf, 0xfa, 0x9,
+                                                     0xb4, 0x1, 0x8b, 0xd8, 0x3, 0x3b, 0x4, 0xd8,
+                                                     0xf9, 0xd2, 0x6, 0xf7, 0x11, 0x9b, 0x95, 0xf7,
+                                                     0x11, 0x1e, 0xf7, 0x17, 0xb4, 0xfb, 0xf1, 0x6,
+                                                     0xe, 0xfb, 0xbf, 0x3c, 0xfa, 0x80, 0x1, 0x8b,
+                                                     0xd8, 0x3, 0x3c, 0x4, 0xd8, 0xfa, 0x80, 0x3e,
+                                                     0x6, 0xe, 0xfb, 0xbf, 0x3b, 0xb4, 0x1, 0x8b,
+                                                     0xd8, 0x3, 0x3b, 0x4, 0xf7, 0xe8, 0xb4, 0xfb,
+                                                     0xe, 0x6, 0xfb, 0x11, 0x7b, 0x95, 0xf7, 0x11,
+                                                     0x1f, 0xf9, 0xd2, 0x3e, 0x7, 0xe, 0xfb, 0x51,
+                                                     0xfa, 0x13, 0xa9, 0x35, 0xa, 0xf7, 0xb0, 0x36,
+                                                     0x15, 0xf9, 0xc8, 0x7, 0xf7, 0x2, 0x91, 0xbd,
+                                                     0xdb, 0x1e, 0xd6, 0xa9, 0x40, 0x6, 0xfb, 0x2,
+                                                     0x58, 0x6e, 0xfb, 0x35, 0x1f, 0xfd, 0xc8, 0x7,
+                                                     0xe, 0x2d, 0xa, 0xf7, 0x7f, 0x6, 0xf7, 0x2d,
+                                                     0x4c, 0xde, 0xfb, 0x1c, 0xb2, 0x1e, 0xf7, 0x1c,
+                                                     0xb2, 0xca, 0xde, 0xf7, 0x2d, 0x1a, 0xf7, 0x7f,
+                                                     0x40, 0xfb, 0x7f, 0x7, 0x27, 0x67, 0xfb, 0x7,
+                                                     0xfb, 0x2d, 0x5e, 0x1e, 0x6d, 0x7, 0xf7, 0x2d,
+                                                     0x5e, 0xaf, 0xfb, 0x7, 0x27, 0x1a, 0xe, 0x53,
+                                                     0xa, 0xf7, 0x65, 0xfa, 0x3b, 0x15, 0xfd, 0xcc,
+                                                     0x7, 0xfb, 0x35, 0xb4, 0x72, 0xf7, 0x2, 0x1e,
+                                                     0xe0, 0xa9, 0x36, 0x6, 0x3b, 0x8f, 0xb9, 0xf7,
+                                                     0x2, 0x1f, 0xf9, 0xcc, 0x7, 0xe, 0x2d, 0xa,
+                                                     0xfa, 0x90, 0x40, 0x6, 0xe, 0x8e, 0x33, 0xfa,
+                                                     0xbb, 0x1, 0xf7, 0xc8, 0xd1, 0x3, 0xf7, 0xc8,
+                                                     0x33, 0x15, 0xd1, 0xfa, 0xbb, 0x45, 0x6, 0xe,
+                                                     0x3f, 0xa, 0xf8, 0x12, 0xdf, 0x3, 0xf8, 0x12,
+                                                     0xfb, 0xb9, 0x15, 0xdf, 0xf8, 0x38, 0x6, 0xf8,
+                                                     0x8e, 0xfb, 0x60, 0xf7, 0x58, 0xfb, 0x57, 0xec,
+                                                     0x1e, 0x7e, 0x81, 0x5, 0xf7, 0x72, 0xfb, 0x1f,
+                                                     0xf5, 0xfb, 0xbf, 0xfb, 0xf3, 0x1a, 0xe, 0xfb,
+                                                     0xbf, 0x36, 0xfa, 0x86, 0x1, 0xf8, 0x12, 0xdf,
+                                                     0x3, 0xf8, 0x12, 0x54, 0xa, 0x3f, 0xa, 0xf8,
+                                                     0x12, 0xdf, 0x3, 0xc1, 0xfb, 0xaf, 0x15, 0x98,
+                                                     0x81, 0x5, 0xf7, 0x57, 0xec, 0xf7, 0x60, 0xf7,
+                                                     0x5d, 0xf8, 0x8e, 0x1a, 0xf8, 0x33, 0x37, 0xfc,
+                                                     0x33, 0x7, 0xfb, 0xf3, 0x21, 0xfb, 0xc4, 0xfb,
+                                                     0x72, 0xfb, 0x1f, 0x1e, 0xe, 0xfb, 0xbf, 0xfa,
+                                                     0x9, 0xb4, 0x1, 0xf7, 0xb9, 0xd9, 0x3, 0xf7,
+                                                     0xb9, 0x3b, 0x15, 0xd9, 0xfa, 0x82, 0xfb, 0xf1,
+                                                     0x62, 0xf7, 0x1b, 0x6, 0xf7, 0x11, 0x96, 0x80,
+                                                     0xfb, 0x11, 0x1f, 0xe, 0xfb, 0xbf, 0x3c, 0xfa,
+                                                     0x80, 0x1, 0xf7, 0xba, 0xd8, 0x3, 0xf7, 0xba,
+                                                     0x3c, 0x15, 0xd8, 0xfa, 0x80, 0x3e, 0x6, 0xe,
+                                                     0xfb, 0xbf, 0x3b, 0xb4, 0x1, 0xf7, 0xba, 0xd8,
+                                                     0x3, 0xa1, 0x64, 0x15, 0x62, 0xf7, 0xf1, 0xfa,
+                                                     0x82, 0x3e, 0xfd, 0xcf, 0x7, 0xfb, 0x13, 0x79,
+                                                     0x80, 0xfb, 0x11, 0x1e, 0xe, 0xfb, 0x51, 0xfa,
+                                                     0x13, 0xa9, 0x2e, 0xa, 0xf9, 0xc8, 0x6, 0xf7,
+                                                     0x2c, 0x74, 0xb1, 0xfb, 0x19, 0x1e, 0x3b, 0x6d,
+                                                     0xdb, 0x6, 0xd1, 0x96, 0x5f, 0xfb, 0x8, 0x1f,
+                                                     0xe, 0x2d, 0xa, 0xf7, 0x80, 0x6, 0xef, 0xaf,
+                                                     0xf7, 0x6, 0xf7, 0x2d, 0xb8, 0x1e, 0xa9, 0x7,
+                                                     0xfb, 0x2d, 0xb8, 0x67, 0xf7, 0x6, 0xef, 0x1a,
+                                                     0xf7, 0x80, 0x40, 0xfb, 0x80, 0x7, 0xfb, 0x2d,
+                                                     0xca, 0x39, 0xf7, 0x1c, 0x64, 0x1e, 0xfb, 0x1c,
+                                                     0x64, 0x4c, 0x39, 0xfb, 0x2d, 0x1a, 0xe, 0x53,
+                                                     0xa, 0xbb, 0x5e, 0x15, 0x6d, 0xdb, 0x7, 0xf7,
+                                                     0x16, 0xa5, 0xb3, 0xf7, 0x2b, 0x1f, 0xf9, 0xc7,
+                                                     0x40, 0xfd, 0xc7, 0x7, 0xfb, 0x16, 0x80, 0x6c,
+                                                     0x45, 0x1e, 0xe, 0xf6, 0x9d, 0x76, 0xf8, 0xff,
+                                                     0xf7, 0x54, 0x1, 0xf9, 0x71, 0xf7, 0x69, 0x15,
+                                                     0x3f, 0xa0, 0x65, 0xd3, 0xd4, 0x1a, 0xce, 0xa9,
+                                                     0xcd, 0xca, 0xa9, 0x1e, 0xbf, 0x6e, 0x41, 0xa4,
+                                                     0x52, 0x1b, 0x6e, 0x76, 0x84, 0x83, 0x76, 0x1f,
+                                                     0x83, 0x76, 0x75, 0x83, 0x6e, 0x1b, 0x72, 0x75,
+                                                     0x93, 0x93, 0x76, 0x1f, 0x94, 0x74, 0x75, 0x94,
+                                                     0x70, 0x1b, 0xfb, 0x3, 0x25, 0x2b, 0xfb, 0x21,
+                                                     0xfb, 0x1a, 0xd2, 0xfb, 0x92, 0xf7, 0x37, 0xa5,
+                                                     0x9e, 0x96, 0x94, 0xa0, 0x1f, 0x92, 0x9b, 0x9b,
+                                                     0x91, 0xa0, 0x1b, 0xa1, 0x9b, 0x85, 0x85, 0x9a,
+                                                     0x1f, 0x82, 0xa1, 0x9d, 0x7f, 0xa7, 0x1b, 0xe1,
+                                                     0xb5, 0xe2, 0xf7, 0x15, 0xd6, 0x1f, 0xfb, 0xdb,
+                                                     0xf8, 0x27, 0x15, 0xe6, 0x88, 0xe5, 0xf0, 0x76,
+                                                     0xe9, 0x8, 0x3c, 0x35, 0x2b, 0x2b, 0x90, 0x1f,
+                                                     0xe, 0x78, 0x9e, 0xf8, 0x7b, 0x98, 0xf7, 0x41,
+                                                     0x9a, 0x6, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc,
+                                                     0x9, 0xe7, 0xa, 0xe0, 0xb, 0x9f, 0xd3, 0xc,
+                                                     0xc, 0xf8, 0xb9, 0x14, 0xf9, 0x3f, 0x15, 0xab,
+                                                     0x13, 0x0, 0x3a, 0x2, 0x0, 0x1, 0x0, 0x13,
+                                                     0x0, 0x2d, 0x0, 0x30, 0x0, 0x47, 0x0, 0x4f,
+                                                     0x0, 0x56, 0x0, 0x5d, 0x0, 0x61, 0x0, 0x67,
+                                                     0x0, 0x7c, 0x0, 0x82, 0x0, 0x8b, 0x0, 0xa6,
+                                                     0x0, 0xae, 0x0, 0xb4, 0x0, 0xba, 0x0, 0xc7,
+                                                     0x0, 0xce, 0x0, 0xe3, 0x0, 0xed, 0x0, 0xf6,
+                                                     0x0, 0xfc, 0x1, 0xa, 0x1, 0xe, 0x1, 0x19,
+                                                     0x1, 0x1c, 0x1, 0x23, 0x1, 0x2a, 0x1, 0x31,
+                                                     0x1, 0x40, 0x1, 0x4d, 0x1, 0x56, 0x1, 0x5f,
+                                                     0x1, 0x66, 0x1, 0x6d, 0x1, 0x72, 0x1, 0x77,
+                                                     0x1, 0x7c, 0x1, 0x88, 0x1, 0x8e, 0x1, 0x99,
+                                                     0x1, 0xa0, 0x1, 0xa7, 0x1, 0xac, 0x1, 0xb6,
+                                                     0x1, 0xc0, 0x1, 0xca, 0x1, 0xce, 0x1, 0xd8,
+                                                     0x1, 0xe2, 0x1, 0xec, 0x1, 0xf3, 0x1, 0xfb,
+                                                     0x2, 0x4, 0x2, 0x9, 0x2, 0x12, 0x2, 0x19,
+                                                     0x2, 0x1f, 0x6c, 0xa4, 0x72, 0xaa, 0xaa, 0xa4,
+                                                     0xa4, 0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, 0x72,
+                                                     0x72, 0x6c, 0x1e, 0xb, 0x2b, 0xa, 0xf7, 0x53,
+                                                     0xf7, 0x2e, 0xf7, 0x2e, 0x4b, 0xa, 0xfb, 0x2e,
+                                                     0xf7, 0x2e, 0xfb, 0x53, 0xfb, 0x53, 0xfb, 0x2e,
+                                                     0xfb, 0x2e, 0xfb, 0x53, 0x1e, 0xb, 0x20, 0xa,
+                                                     0xe, 0x15, 0x21, 0xa, 0xb3, 0x16, 0xf7, 0x3c,
+                                                     0xf7, 0x1d, 0x43, 0xa, 0xf7, 0x3c, 0xf7, 0x1d,
+                                                     0x34, 0xa, 0x34, 0xa, 0x43, 0xa, 0x1e, 0xe,
+                                                     0x16, 0xf7, 0xb0, 0x9d, 0x6, 0x2a, 0xa, 0xb,
+                                                     0x2f, 0xa, 0xfc, 0x7d, 0x27, 0xa, 0xb, 0x7,
+                                                     0x3c, 0xa, 0xfc, 0x7d, 0x39, 0xa, 0x7, 0x28,
+                                                     0xa, 0xb, 0x54, 0x68, 0x78, 0x54, 0x1e, 0xb,
+                                                     0x6d, 0xa4, 0x72, 0xaa, 0x1e, 0xa9, 0x8c, 0xa5,
+                                                     0xa3, 0xaa, 0x1a, 0xa9, 0x71, 0xa5, 0x6d, 0x6c,
+                                                     0x72, 0x71, 0x6c, 0x1e, 0xb, 0x54, 0x68, 0x9e,
+                                                     0xc2, 0x1f, 0xb, 0xfb, 0x53, 0xf7, 0x2e, 0xfb,
+                                                     0x2e, 0xf7, 0x53, 0xb, 0x1e, 0xb3, 0x8a, 0x15,
+                                                     0xf7, 0x3d, 0xf7, 0x1c, 0x43, 0xa, 0xf7, 0x3d,
+                                                     0xf7, 0x1d, 0xfb, 0x1d, 0xfb, 0x3c, 0xfb, 0x3d,
+                                                     0xfb, 0x1d, 0xfb, 0x1c, 0xfb, 0x3c, 0xb, 0xfb,
+                                                     0x51, 0x36, 0xfa, 0x90, 0x2e, 0xa, 0xb, 0x44,
+                                                     0xa, 0x36, 0x15, 0xd6, 0xb, 0xc2, 0xae, 0x78,
+                                                     0x54, 0x1f, 0xb, 0xf7, 0x17, 0xf7, 0x35, 0xf7,
+                                                     0x35, 0xf7, 0x17, 0x56, 0xa, 0x41, 0xa, 0xb,
+                                                     0xc2, 0xae, 0x9e, 0xc2, 0x1e, 0x9d, 0xb, 0x82,
+                                                     0xb9, 0x1b, 0xc5, 0xc7, 0xb4, 0xa8, 0x9a, 0x1f,
+                                                     0x68, 0xac, 0x5, 0x7c, 0x7d, 0x72, 0x66, 0x53,
+                                                     0x1b, 0x62, 0x66, 0xb, 0x1e, 0xfb, 0xa9, 0x79,
+                                                     0x6, 0x25, 0xa, 0xf7, 0x56, 0xb, 0xfb, 0x1d,
+                                                     0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1d, 0xb, 0x1,
+                                                     0xf7, 0x65, 0xd6, 0x3, 0xb, 0xf7, 0x5c, 0x40,
+                                                     0xa, 0x6f, 0xa1, 0x6c, 0x7b, 0x7b, 0x85, 0x81,
+                                                     0x87, 0x1e, 0xb, 0x15, 0x20, 0xa, 0xb, 0x88,
+                                                     0x85, 0x8b, 0x89, 0x8a, 0x1a, 0x7c, 0x9a, 0x85,
+                                                     0x96, 0xb, 0x27, 0xa, 0xe, 0xf8, 0xa2, 0xc2,
+                                                     0xfc, 0xa2, 0x6, 0xb, 0xa0, 0x76, 0xf9, 0x35,
+                                                     0x77, 0x1, 0xb, 0x31, 0xa, 0xfb, 0xb0, 0x45,
+                                                     0xa, 0xb, 0x8b, 0xc2, 0xf8, 0xdc, 0x77, 0x1,
+                                                     0xa8, 0x16, 0xf8, 0x85, 0xc2, 0xfc, 0x85, 0x6,
+                                                     0xb, 0xf8, 0x45, 0xf7, 0x5b, 0x5, 0xc9, 0x7,
+                                                     0xfc, 0x85, 0xfb, 0x7a, 0x5, 0xe, 0xfb, 0xbf,
+                                                     0xfb, 0xb9, 0x1c, 0x4, 0xc3, 0x1, 0xb, 0x5,
+                                                     0x8f, 0x8f, 0x8d, 0x95, 0x91, 0x1a, 0xa8, 0xb,
+                                                     0xfb, 0x17, 0xfb, 0x35, 0xfb, 0x35, 0xb, 0xf8,
+                                                     0xa0, 0xc2, 0xfc, 0xa0, 0x6, 0xb, 0xf7, 0x1d,
+                                                     0xf7, 0x3c, 0xb, 0x35, 0xa, 0xf7, 0x65, 0xb,
+                                                     0x79, 0x7, 0x2f, 0xa, 0xb, 0xf7, 0xc4, 0x91,
+                                                     0x76, 0xf7, 0x7f, 0xc3, 0xf7, 0x7f, 0x77, 0x1,
+                                                     0xb, 0xc2, 0xf7, 0xfc, 0xc2, 0x1, 0xb, 0xf7,
+                                                     0x52, 0xfb, 0x2f, 0xf7, 0x2f, 0xfb, 0x52, 0xfb,
+                                                     0x53, 0xb, 0x77, 0x1, 0xf7, 0xac, 0xc3, 0x3,
+                                                     0xb, 0x7, 0x74, 0x77, 0x7c, 0x6c, 0x1e, 0xb,
+                                                     0xf7, 0x53, 0xf7, 0x53, 0xb, 0xfb, 0xf6, 0xfb,
+                                                     0x45, 0x76, 0xfa, 0x44, 0x77, 0x1, 0xb, 0xfb,
+                                                     0x5f, 0xfb, 0x4b, 0xa4, 0xf9, 0xba, 0xa4, 0x1,
+                                                     0xb, 0xfb, 0xf2, 0xfb, 0x2f, 0xa4, 0xf9, 0x9f,
+                                                     0xa4, 0x1, 0xb, 0x15, 0x2b, 0xa, 0xb, 0xfb,
+                                                     0xf2, 0xfb, 0x3e, 0x76, 0xf9, 0xf4, 0x77, 0x1,
+                                                     0xb, 0xc9, 0x7, 0xfc, 0x85, 0xf7, 0x7a, 0x5,
+                                                     0x4d, 0x7, 0xb, 0x67, 0xa8, 0x6e, 0xaf, 0xaf,
+                                                     0xa7, 0xa8, 0xaf, 0xaf, 0xb, 0xfb, 0x51, 0x40,
+                                                     0xa9, 0x35, 0xa, 0xb, 0x36, 0x15, 0xdf, 0xfa,
+                                                     0x86, 0x37, 0x6, 0xe, 0x1, 0xb3, 0xc2, 0xf8,
+                                                     0xda, 0xc2, 0x3, 0xb3, 0xb, 0x41, 0xa, 0xfb,
+                                                     0x17, 0xb, 0x15, 0xa9, 0xa6, 0xaa, 0x9f, 0xb8,
+                                                     0x1b, 0xaa, 0xb, 0x8a, 0x1f, 0xfc, 0x29, 0x54,
+                                                     0x6, 0xe, 0x90, 0x90, 0x8f, 0x8e, 0x8d, 0xb
+                                                    };
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/foxitnames.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/foxitnames.h
new file mode 100644
index 0000000..c5ccbaf
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/foxitnames.h
@@ -0,0 +1,288 @@
+#ifndef _FX_FREETYPE_DONT_RENAME_
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+
+// To avoid any possible linking confliction, we rename all FreeType exported names
+
+#define FT_Init_FreeType FPDFAPI_FT_Init_FreeType
+#define FT_Done_FreeType FPDFAPI_FT_Done_FreeType
+#define FT_New_Face		FPDFAPI_FT_New_Face
+#define FT_Select_Charmap FPDFAPI_FT_Select_Charmap 
+#define FT_Done_Face FPDFAPI_FT_Done_Face 
+#define FT_Get_Charmap_Index FPDFAPI_FT_Get_Charmap_Index 
+#define FT_New_Memory_Face FPDFAPI_FT_New_Memory_Face 
+#define FT_MulDiv FPDFAPI_FT_MulDiv 
+#define FT_Vector_Transform FPDFAPI_FT_Vector_Transform 
+#define FT_Cos FPDFAPI_FT_Cos 
+#define FT_Sin FPDFAPI_FT_Sin 
+#define FT_Load_Glyph FPDFAPI_FT_Load_Glyph 
+#define FT_DivFix FPDFAPI_FT_DivFix 
+#define FT_Realloc FPDFAPI_FT_Realloc 
+#define FT_Alloc FPDFAPI_FT_Alloc 
+#define FT_Get_Char_Index FPDFAPI_FT_Get_Char_Index 
+#define FT_GlyphLoader_CheckPoints FPDFAPI_FT_GlyphLoader_CheckPoints 
+#define FT_GlyphLoader_Add FPDFAPI_FT_GlyphLoader_Add 
+#define FT_GlyphLoader_CheckSubGlyphs FPDFAPI_FT_GlyphLoader_CheckSubGlyphs 
+#define FT_Outline_Translate FPDFAPI_FT_Outline_Translate 
+#define FT_Outline_Transform FPDFAPI_FT_Outline_Transform 
+#define FT_Outline_Get_CBox FPDFAPI_FT_Outline_Get_CBox 
+#define FT_GlyphLoader_Rewind FPDFAPI_FT_GlyphLoader_Rewind 
+#define FT_GlyphLoader_CopyPoints FPDFAPI_FT_GlyphLoader_CopyPoints 
+#define FT_GlyphLoader_New FPDFAPI_FT_GlyphLoader_New 
+#define FT_GlyphLoader_CreateExtra FPDFAPI_FT_GlyphLoader_CreateExtra 
+#define FT_Free FPDFAPI_FT_Free 
+#define FT_Set_Charmap FPDFAPI_FT_Set_Charmap 
+#define FT_GlyphLoader_Done FPDFAPI_FT_GlyphLoader_Done 
+#define _debug_mem_dummy FPDFAPI__debug_mem_dummy 
+#define _debug_mem_dummy FPDFAPI__debug_mem_dummy 
+#define FT_QAlloc FPDFAPI_FT_QAlloc 
+#define FT_QRealloc FPDFAPI_FT_QRealloc 
+#define FT_List_Find FPDFAPI_FT_List_Find 
+#define FT_List_Add FPDFAPI_FT_List_Add 
+#define FT_List_Insert FPDFAPI_FT_List_Insert 
+#define FT_List_Remove FPDFAPI_FT_List_Remove 
+#define FT_List_Up FPDFAPI_FT_List_Up 
+#define FT_List_Iterate FPDFAPI_FT_List_Iterate 
+#define FT_List_Finalize FPDFAPI_FT_List_Finalize 
+#define ft_highpow2 FPDFAPI_ft_highpow2 
+#define FT_Stream_OpenMemory FPDFAPI_FT_Stream_OpenMemory 
+#define FT_Stream_Close FPDFAPI_FT_Stream_Close 
+#define FT_Stream_Seek FPDFAPI_FT_Stream_Seek 
+#define FT_Stream_Skip FPDFAPI_FT_Stream_Skip 
+#define FT_Stream_Pos FPDFAPI_FT_Stream_Pos 
+#define FT_Stream_ReadAt FPDFAPI_FT_Stream_ReadAt 
+#define FT_Stream_Read FPDFAPI_FT_Stream_Read 
+#define FT_Stream_TryRead FPDFAPI_FT_Stream_TryRead 
+#define FT_Stream_EnterFrame FPDFAPI_FT_Stream_EnterFrame 
+#define FT_Stream_ExtractFrame FPDFAPI_FT_Stream_ExtractFrame 
+#define FT_Stream_ReleaseFrame FPDFAPI_FT_Stream_ReleaseFrame 
+#define FT_Stream_ExitFrame FPDFAPI_FT_Stream_ExitFrame 
+#define FT_Stream_GetChar FPDFAPI_FT_Stream_GetChar 
+#define FT_Stream_GetShort FPDFAPI_FT_Stream_GetShort 
+#define FT_Stream_GetShortLE FPDFAPI_FT_Stream_GetShortLE 
+#define FT_Stream_GetOffset FPDFAPI_FT_Stream_GetOffset 
+#define FT_Stream_GetLong FPDFAPI_FT_Stream_GetLong 
+#define FT_Stream_GetLongLE FPDFAPI_FT_Stream_GetLongLE 
+#define FT_Stream_ReadChar FPDFAPI_FT_Stream_ReadChar 
+#define FT_Stream_ReadShort FPDFAPI_FT_Stream_ReadShort 
+#define FT_Stream_ReadShortLE FPDFAPI_FT_Stream_ReadShortLE 
+#define FT_Stream_ReadOffset FPDFAPI_FT_Stream_ReadOffset 
+#define FT_Stream_ReadLong FPDFAPI_FT_Stream_ReadLong 
+#define FT_Stream_ReadLongLE FPDFAPI_FT_Stream_ReadLongLE 
+#define FT_Stream_ReadFields FPDFAPI_FT_Stream_ReadFields 
+#define FT_RoundFix FPDFAPI_FT_RoundFix 
+#define FT_CeilFix FPDFAPI_FT_CeilFix 
+#define FT_FloorFix FPDFAPI_FT_FloorFix 
+#define FT_Sqrt32 FPDFAPI_FT_Sqrt32 
+#define FT_SqrtFixed FPDFAPI_FT_SqrtFixed 
+#define FT_Tan FPDFAPI_FT_Tan 
+#define FT_Atan2 FPDFAPI_FT_Atan2 
+#define FT_Vector_Unit FPDFAPI_FT_Vector_Unit 
+#define FT_Vector_Rotate FPDFAPI_FT_Vector_Rotate 
+#define FT_Vector_Length FPDFAPI_FT_Vector_Length 
+#define FT_Vector_Polarize FPDFAPI_FT_Vector_Polarize 
+#define FT_Vector_From_Polar FPDFAPI_FT_Vector_From_Polar 
+#define FT_Angle_Diff FPDFAPI_FT_Angle_Diff 
+#define FT_Outline_Decompose FPDFAPI_FT_Outline_Decompose 
+#define FT_Outline_Done_Internal FPDFAPI_FT_Outline_Done_Internal 
+#define FT_Outline_New_Internal FPDFAPI_FT_Outline_New_Internal 
+#define FT_Outline_New FPDFAPI_FT_Outline_New 
+#define FT_Outline_Check FPDFAPI_FT_Outline_Check 
+#define FT_Outline_Copy FPDFAPI_FT_Outline_Copy 
+#define FT_Outline_Done FPDFAPI_FT_Outline_Done 
+#define FT_Outline_Reverse FPDFAPI_FT_Outline_Reverse 
+#define FT_Set_Renderer FPDFAPI_FT_Set_Renderer 
+#define FT_Lookup_Renderer FPDFAPI_FT_Lookup_Renderer 
+#define FT_Outline_Render FPDFAPI_FT_Outline_Render 
+#define FT_Outline_Get_Bitmap FPDFAPI_FT_Outline_Get_Bitmap 
+#define FT_Outline_Get_Orientation FPDFAPI_FT_Outline_Get_Orientation 
+#define FT_Outline_Embolden FPDFAPI_FT_Outline_Embolden 
+#define FT_GlyphLoader_Reset FPDFAPI_FT_GlyphLoader_Reset 
+#define FT_GlyphLoader_Prepare FPDFAPI_FT_GlyphLoader_Prepare 
+#define ft_service_list_lookup FPDFAPI_ft_service_list_lookup 
+#define ft_validator_init FPDFAPI_ft_validator_init 
+#define ft_validator_run FPDFAPI_ft_validator_run 
+#define ft_validator_error FPDFAPI_ft_validator_error 
+#define FT_Stream_New FPDFAPI_FT_Stream_New 
+#define FT_Stream_Free FPDFAPI_FT_Stream_Free 
+#define ft_glyphslot_free_bitmap FPDFAPI_ft_glyphslot_free_bitmap 
+#define ft_glyphslot_set_bitmap FPDFAPI_ft_glyphslot_set_bitmap 
+#define FT_GlyphSlot_Own_Bitmap FPDFAPI_FT_GlyphSlot_Own_Bitmap
+#define ft_glyphslot_alloc_bitmap FPDFAPI_ft_glyphslot_alloc_bitmap 
+#define FT_New_GlyphSlot FPDFAPI_FT_New_GlyphSlot 
+#define FT_Done_GlyphSlot FPDFAPI_FT_Done_GlyphSlot 
+#define FT_Set_Transform FPDFAPI_FT_Set_Transform 
+#define FT_Render_Glyph_Internal FPDFAPI_FT_Render_Glyph_Internal 
+#define FT_Render_Glyph FPDFAPI_FT_Render_Glyph 
+#define FT_Load_Char FPDFAPI_FT_Load_Char 
+#define FT_New_Size FPDFAPI_FT_New_Size 
+#define FT_Open_Face FPDFAPI_FT_Open_Face 
+#define FT_Attach_Stream FPDFAPI_FT_Attach_Stream 
+#define FT_Attach_File FPDFAPI_FT_Attach_File 
+#define FT_Done_Size FPDFAPI_FT_Done_Size 
+#define FT_Set_Char_Size FPDFAPI_FT_Set_Char_Size 
+#define FT_Set_Pixel_Sizes FPDFAPI_FT_Set_Pixel_Sizes 
+#define FT_Get_Kerning FPDFAPI_FT_Get_Kerning 
+#define FT_CMap_Done FPDFAPI_FT_CMap_Done 
+#define FT_CMap_New FPDFAPI_FT_CMap_New 
+#define FT_Get_Next_Char FPDFAPI_FT_Get_Next_Char 
+#define FT_Get_First_Char FPDFAPI_FT_Get_First_Char 
+#define FT_Get_Name_Index FPDFAPI_FT_Get_Name_Index 
+#define FT_Get_Glyph_Name FPDFAPI_FT_Get_Glyph_Name 
+#define FT_Get_Postscript_Name FPDFAPI_FT_Get_Postscript_Name 
+#define FT_Get_Sfnt_Table FPDFAPI_FT_Get_Sfnt_Table 
+#define FT_Load_Sfnt_Table FPDFAPI_FT_Load_Sfnt_Table 
+#define FT_Sfnt_Table_Info FPDFAPI_FT_Sfnt_Table_Info 
+#define FT_Get_CMap_Language_ID FPDFAPI_FT_Get_CMap_Language_ID 
+#define FT_Activate_Size FPDFAPI_FT_Activate_Size 
+#define FT_Get_Renderer FPDFAPI_FT_Get_Renderer 
+#define FT_Remove_Module FPDFAPI_FT_Remove_Module 
+#define FT_Add_Module FPDFAPI_FT_Add_Module 
+#define FT_Get_Module FPDFAPI_FT_Get_Module 
+#define FT_Get_Module_Interface FPDFAPI_FT_Get_Module_Interface 
+#define ft_module_get_service FPDFAPI_ft_module_get_service 
+#define FT_New_Library FPDFAPI_FT_New_Library 
+#define FT_Library_Version FPDFAPI_FT_Library_Version 
+#define FT_Done_Library FPDFAPI_FT_Done_Library 
+#define FT_Set_Debug_Hook FPDFAPI_FT_Set_Debug_Hook 
+#define FT_Raccess_Get_HeaderInfo FPDFAPI_FT_Raccess_Get_HeaderInfo 
+#define FT_Raccess_Get_DataOffsets FPDFAPI_FT_Raccess_Get_DataOffsets 
+#define FT_Raccess_Guess FPDFAPI_FT_Raccess_Guess
+#define af_dummy_script_class FPDFAPI_af_dummy_script_class
+#define af_latin_script_class FPDFAPI_af_latin_script_class
+#define af_cjk_script_class FPDFAPI_af_cjk_script_class
+#define af_autofitter_service FPDFAPI_af_autofitter_service
+#define autofit_module_class FPDFAPI_autofit_module_class
+#define cff_cmap_encoding_class_rec FPDFAPI_cff_cmap_encoding_class_rec
+#define cff_cmap_unicode_class_rec FPDFAPI_cff_cmap_unicode_class_rec
+#define cff_driver_class FPDFAPI_cff_driver_class
+#define FT_Stream_Open FPDFAPI_FT_Stream_Open
+#define FT_New_Memory FPDFAPI_FT_New_Memory
+#define FT_Done_Memory FPDFAPI_FT_Done_Memory
+#define ft_mem_qalloc FPDFAPI_ft_mem_qalloc
+#define ft_mem_alloc FPDFAPI_ft_mem_alloc
+#define ft_mem_free FPDFAPI_ft_mem_free
+#define ft_mem_qrealloc FPDFAPI_ft_mem_qrealloc
+#define ft_mem_realloc FPDFAPI_ft_mem_realloc
+#define FT_Get_TrueType_Engine_Type FPDFAPI_FT_Get_TrueType_Engine_Type
+#define ft_stub_set_char_sizes FPDFAPI_ft_stub_set_char_sizes
+#define ft_stub_set_pixel_sizes FPDFAPI_ft_stub_set_pixel_sizes
+#define FT_Get_SubGlyph_Info FPDFAPI_FT_Get_SubGlyph_Info
+#define FT_Get_Sfnt_Name_Count FPDFAPI_FT_Get_Sfnt_Name_Count
+#define FT_Get_Sfnt_Name FPDFAPI_FT_Get_Sfnt_Name
+#define FT_Bitmap_New FPDFAPI_FT_Bitmap_New
+#define FT_Bitmap_Copy FPDFAPI_FT_Bitmap_Copy
+#define FT_Bitmap_Done FPDFAPI_FT_Bitmap_Done
+#define FT_Bitmap_Convert FPDFAPI_FT_Bitmap_Convert
+#define FT_Bitmap_Embolden FPDFAPI_FT_Bitmap_Embolden
+#define ft_bitmap_glyph_class FPDFAPI_ft_bitmap_glyph_class
+#define ft_outline_glyph_class FPDFAPI_ft_outline_glyph_class
+#define FT_Matrix_Multiply FPDFAPI_FT_Matrix_Multiply
+#define FT_Matrix_Invert FPDFAPI_FT_Matrix_Invert
+#define FT_Done_Glyph FPDFAPI_FT_Done_Glyph
+#define FT_Glyph_Copy FPDFAPI_FT_Glyph_Copy
+#define FT_Get_Glyph FPDFAPI_FT_Get_Glyph
+#define FT_Glyph_Transform FPDFAPI_FT_Glyph_Transform
+#define FT_Glyph_Get_CBox FPDFAPI_FT_Glyph_Get_CBox
+#define FT_Glyph_To_Bitmap FPDFAPI_FT_Glyph_To_Bitmap
+#define FT_Add_Default_Modules FPDFAPI_FT_Add_Default_Modules
+#define FT_Get_Multi_Master FPDFAPI_FT_Get_Multi_Master
+#define FT_Get_MM_Var FPDFAPI_FT_Get_MM_Var
+#define FT_Set_MM_Design_Coordinates FPDFAPI_FT_Set_MM_Design_Coordinates
+#define FT_Set_Var_Design_Coordinates FPDFAPI_FT_Set_Var_Design_Coordinates
+#define FT_Set_MM_Blend_Coordinates FPDFAPI_FT_Set_MM_Blend_Coordinates
+#define FT_Set_Var_Blend_Coordinates FPDFAPI_FT_Set_Var_Blend_Coordinates
+#define ps_table_funcs FPDFAPI_ps_table_funcs
+#define ps_parser_funcs FPDFAPI_ps_parser_funcs
+#define t1_builder_funcs FPDFAPI_t1_builder_funcs
+#define t1_decoder_funcs FPDFAPI_t1_decoder_funcs
+#define afm_parser_funcs FPDFAPI_afm_parser_funcs
+#define t1_cmap_classes FPDFAPI_t1_cmap_classes
+#define t1_cmap_standard_class_rec FPDFAPI_t1_cmap_standard_class_rec
+#define t1_cmap_expert_class_rec FPDFAPI_t1_cmap_expert_class_rec
+#define t1_cmap_custom_class_rec FPDFAPI_t1_cmap_custom_class_rec
+#define t1_cmap_unicode_class_rec FPDFAPI_t1_cmap_unicode_class_rec
+#define psaux_module_class FPDFAPI_psaux_module_class
+#define pshinter_module_class FPDFAPI_pshinter_module_class
+#define ps_hints_apply FPDFAPI_ps_hints_apply
+#define psnames_module_class FPDFAPI_psnames_module_class
+#define ft_raster1_renderer_class FPDFAPI_ft_raster1_renderer_class
+#define ft_standard_raster FPDFAPI_ft_standard_raster
+#define ft_raster5_renderer_class FPDFAPI_ft_raster5_renderer_class
+#define tt_cmap0_class_rec FPDFAPI_tt_cmap0_class_rec
+#define tt_cmap2_class_rec FPDFAPI_tt_cmap2_class_rec
+#define tt_cmap4_class_rec FPDFAPI_tt_cmap4_class_rec
+#define tt_cmap6_class_rec FPDFAPI_tt_cmap6_class_rec
+#define tt_cmap8_class_rec FPDFAPI_tt_cmap8_class_rec
+#define tt_cmap10_class_rec FPDFAPI_tt_cmap10_class_rec
+#define tt_cmap12_class_rec FPDFAPI_tt_cmap12_class_rec
+#define tt_cmap13_class_rec FPDFAPI_tt_cmap13_class_rec
+#define tt_cmap14_class_rec FPDFAPI_tt_cmap14_class_rec
+#define sfnt_module_class FPDFAPI_sfnt_module_class
+#define ft_grays_raster FPDFAPI_ft_grays_raster
+#define ft_smooth_renderer_class FPDFAPI_ft_smooth_renderer_class
+#define ft_smooth_lcd_renderer_class FPDFAPI_ft_smooth_lcd_renderer_class
+#define ft_smooth_lcdv_renderer_class FPDFAPI_ft_smooth_lcdv_renderer_class
+#define tt_default_graphics_state FPDFAPI_tt_default_graphics_state
+#define tt_driver_class FPDFAPI_tt_driver_class
+#define TT_RunIns FPDFAPI_TT_RunIns
+#define TT_New_Context FPDFAPI_TT_New_Context
+#define t1_driver_class FPDFAPI_t1_driver_class
+#define t1cid_driver_class FPDFAPI_t1cid_driver_class
+#define FT_Get_Track_Kerning FPDFAPI_FT_Get_Track_Kerning
+#define FT_Match_Size FPDFAPI_FT_Match_Size
+#define FT_MulDiv_No_Round FPDFAPI_FT_MulDiv_No_Round
+#define FT_Request_Metrics FPDFAPI_FT_Request_Metrics
+#define FT_Request_Size FPDFAPI_FT_Request_Size
+#define FT_Select_Metrics FPDFAPI_FT_Select_Metrics
+#define FT_Select_Size FPDFAPI_FT_Select_Size
+#define ft_synthesize_vertical_metrics FPDFAPI_ft_synthesize_vertical_metrics
+#define New_Profile FPDFAPI_New_Profile
+#define End_Profile FPDFAPI_End_Profile
+#define Insert_Y_Turn FPDFAPI_Insert_Y_Turn 
+#define Split_Conic FPDFAPI_Split_Conic  
+#define Split_Cubic FPDFAPI_Split_Cubic
+#define Line_Up FPDFAPI_Line_Up 
+#define Bezier_Up FPDFAPI_Bezier_Up 
+#define Bezier_Down FPDFAPI_Bezier_Down 
+#define Line_To FPDFAPI_Line_To
+#define Conic_To FPDFAPI_Conic_To 
+#define Cubic_To FPDFAPI_Cubic_To
+#define Decompose_Curve FPDFAPI_Decompose_Curve
+#define Convert_Glyph FPDFAPI_Convert_Glyph 
+#define Sort FPDFAPI_Sort 
+#define Vertical_Sweep_Init FPDFAPI_Vertical_Sweep_Init 
+#define Vertical_Sweep_Span FPDFAPI_Vertical_Sweep_Span 
+#define Vertical_Sweep_Drop FPDFAPI_Vertical_Sweep_Drop 
+#define Vertical_Sweep_Step FPDFAPI_Vertical_Sweep_Step 
+#define Horizontal_Sweep_Init FPDFAPI_Horizontal_Sweep_Init 
+#define Horizontal_Sweep_Span FPDFAPI_Horizontal_Sweep_Span 
+#define Horizontal_Sweep_Drop FPDFAPI_Horizontal_Sweep_Drop 
+#define Horizontal_Sweep_Step FPDFAPI_Horizontal_Sweep_Step 
+#define Draw_Sweep FPDFAPI_Draw_Sweep 
+#define Render_Single_Pass FPDFAPI_Render_Single_Pass 
+#define Render_Glyph FPDFAPI_Render_Glyph  
+#define Finalize_Profile_Table FPDFAPI_Finalize_Profile_Table 
+#define InsNew FPDFAPI_InsNew 
+#define DelOld FPDFAPI_DelOld
+#define FT_MulFix FPDFAPI_FT_MulFix
+#define FT_Matrix_Multiply_Scaled FPDFAPI_FT_Matrix_Multiply_Scaled
+#define FT_Vector_Transform_Scaled FPDFAPI_FT_Vector_Transform_Scaled
+#define ft_corner_orientation FPDFAPI_ft_corner_orientation
+#define ft_corner_is_flat FPDFAPI_ft_corner_is_flat
+#define FT_Get_CMap_Format FPDFAPI_FT_Get_CMap_Format
+#define ft_mem_strcpyn FPDFAPI_ft_mem_strcpyn
+#define ft_mem_dup FPDFAPI_ft_mem_dup
+#define ft_mem_strdup FPDFAPI_ft_mem_strdup
+#define FT_Face_GetCharVariantIsDefault FPDFAPI_FT_Face_GetCharVariantIsDefault
+#define FT_Face_GetCharsOfVariant FPDFAPI_FT_Face_GetCharsOfVariant
+#define FT_Face_GetVariantsOfChar FPDFAPI_FT_Face_GetVariantsOfChar
+#define FT_Face_GetVariantSelectors FPDFAPI_FT_Face_GetVariantSelectors
+#define FT_Face_GetCharVariantIndex FPDFAPI_FT_Face_GetCharVariantIndex
+#define FT_Get_Advances FPDFAPI_FT_Get_Advances
+#define FT_Get_Advance FPDFAPI_FT_Get_Advance
+#define FT_Library_SetLcdFilter FPDFAPI_FT_Library_SetLcdFilter
+ 
+#endif // !_FX_FREETYPE_DONT_RENAME_
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftconfig.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftconfig.h
new file mode 100644
index 0000000..b971d14
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftconfig.h
@@ -0,0 +1,599 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftconfig.h                                                             */
+/*                                                                         */
+/*    ANSI-specific configuration file (specification only).               */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006-2008, 2010-2011, 2013 by                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This header file contains a number of macro definitions that are used */
+  /* by the rest of the engine.  Most of the macros here are automatically */
+  /* determined at compile time, and you should not need to change it to   */
+  /* port FreeType, except to compile the library with a non-ANSI          */
+  /* compiler.                                                             */
+  /*                                                                       */
+  /* Note however that if some specific modifications are needed, we       */
+  /* advise you to place a modified copy in your build directory.          */
+  /*                                                                       */
+  /* The build directory is usually `freetype/builds/<system>', and        */
+  /* contains system-specific files that are always included first when    */
+  /* building the library.                                                 */
+  /*                                                                       */
+  /* This ANSI version should stay in `include/freetype/config'.           */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __FTCONFIG_H__
+#define __FTCONFIG_H__
+
+#include "../../ft2build.h"
+#include "ftoption.h"
+#include "ftstdlib.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*               PLATFORM-SPECIFIC CONFIGURATION MACROS                  */
+  /*                                                                       */
+  /* These macros can be toggled to suit a specific system.  The current   */
+  /* ones are defaults used to compile FreeType in an ANSI C environment   */
+  /* (16bit compilers are also supported).  Copy this file to your own     */
+  /* `freetype/builds/<system>' directory, and edit it to port the engine. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* There are systems (like the Texas Instruments 'C54x) where a `char' */
+  /* has 16 bits.  ANSI C says that sizeof(char) is always 1.  Since an  */
+  /* `int' has 16 bits also for this system, sizeof(int) gives 1 which   */
+  /* is probably unexpected.                                             */
+  /*                                                                     */
+  /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a      */
+  /* `char' type.                                                        */
+
+#ifndef FT_CHAR_BIT
+#define FT_CHAR_BIT  CHAR_BIT
+#endif
+
+
+  /* The size of an `int' type.  */
+#if                                 FT_UINT_MAX == 0xFFFFUL
+#define FT_SIZEOF_INT  (16 / FT_CHAR_BIT)
+#elif                               FT_UINT_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_INT  (32 / FT_CHAR_BIT)
+#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_INT  (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `int' type!"
+#endif
+
+  /* The size of a `long' type.  A five-byte `long' (as used e.g. on the */
+  /* DM642) is recognized but avoided.                                   */
+#if                                  FT_ULONG_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL
+#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_LONG  (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `long' type!"
+#endif
+
+
+  /* FT_UNUSED is a macro used to indicate that a given parameter is not  */
+  /* used -- this is only used to get rid of unpleasant compiler warnings */
+#ifndef FT_UNUSED
+#define FT_UNUSED( arg )  ( (arg) = (arg) )
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                     AUTOMATIC CONFIGURATION MACROS                    */
+  /*                                                                       */
+  /* These macros are computed from the ones defined above.  Don't touch   */
+  /* their definition, unless you know precisely what you are doing.  No   */
+  /* porter should need to mess with them.                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Mac support                                                           */
+  /*                                                                       */
+  /*   This is the only necessary change, so it is defined here instead    */
+  /*   providing a new configuration file.                                 */
+  /*                                                                       */
+#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
+  /* no Carbon frameworks for 64bit 10.4.x */
+  /* AvailabilityMacros.h is available since Mac OS X 10.2,        */
+  /* so guess the system version by maximum errno before inclusion */
+#include <errno.h>
+#ifdef ECANCELED /* defined since 10.2 */
+#include "AvailabilityMacros.h"
+#endif
+#if defined( __LP64__ ) && \
+    ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )
+#undef FT_MACINTOSH
+#endif
+
+#elif defined( __SC__ ) || defined( __MRC__ )
+  /* Classic MacOS compilers */
+#include "ConditionalMacros.h"
+#if TARGET_OS_MAC
+#define FT_MACINTOSH 1
+#endif
+
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    basic_types                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Int16                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for a 16bit signed integer type.                         */
+  /*                                                                       */
+  typedef signed short  FT_Int16;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UInt16                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for a 16bit unsigned integer type.                       */
+  /*                                                                       */
+  typedef unsigned short  FT_UInt16;
+
+  /* */
+
+
+  /* this #if 0 ... #endif clause is for documentation purposes */
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Int32                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for a 32bit signed integer type.  The size depends on    */
+  /*    the configuration.                                                 */
+  /*                                                                       */
+  typedef signed XXX  FT_Int32;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UInt32                                                          */
+  /*                                                                       */
+  /*    A typedef for a 32bit unsigned integer type.  The size depends on  */
+  /*    the configuration.                                                 */
+  /*                                                                       */
+  typedef unsigned XXX  FT_UInt32;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Int64                                                           */
+  /*                                                                       */
+  /*    A typedef for a 64bit signed integer type.  The size depends on    */
+  /*    the configuration.  Only defined if there is real 64bit support;   */
+  /*    otherwise, it gets emulated with a structure (if necessary).       */
+  /*                                                                       */
+  typedef signed XXX  FT_Int64;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UInt64                                                          */
+  /*                                                                       */
+  /*    A typedef for a 64bit unsigned integer type.  The size depends on  */
+  /*    the configuration.  Only defined if there is real 64bit support;   */
+  /*    otherwise, it gets emulated with a structure (if necessary).       */
+  /*                                                                       */
+  typedef unsigned XXX  FT_UInt64;
+
+  /* */
+
+#endif
+
+#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)
+
+  typedef signed int      FT_Int32;
+  typedef unsigned int    FT_UInt32;
+
+#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)
+
+  typedef signed long     FT_Int32;
+  typedef unsigned long   FT_UInt32;
+
+#else
+#error "no 32bit type found -- please check your configuration files"
+#endif
+
+
+  /* look up an integer type that is at least 32 bits */
+#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)
+
+  typedef int            FT_Fast;
+  typedef unsigned int   FT_UFast;
+
+#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)
+
+  typedef long           FT_Fast;
+  typedef unsigned long  FT_UFast;
+
+#endif
+
+
+  /* determine whether we have a 64-bit int type for platforms without */
+  /* Autoconf                                                          */
+#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
+
+  /* FT_LONG64 must be defined if a 64-bit type is available */
+#define FT_LONG64
+#define FT_INT64   long
+#define FT_UINT64  unsigned long
+
+#elif defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */
+
+  /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64   __int64
+#define FT_UINT64  unsigned __int64
+
+#elif defined( __BORLANDC__ )  /* Borland C++ */
+
+  /* XXXX: We should probably check the value of __BORLANDC__ in order */
+  /*       to test the compiler version.                               */
+
+  /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64   __int64
+#define FT_UINT64  unsigned __int64
+
+#elif defined( __WATCOMC__ )   /* Watcom C++ */
+
+  /* Watcom doesn't provide 64-bit data types */
+
+#elif defined( __MWERKS__ )    /* Metrowerks CodeWarrior */
+
+#define FT_LONG64
+#define FT_INT64   long long int
+#define FT_UINT64  unsigned long long int
+
+#elif defined( __GNUC__ )
+
+  /* GCC provides the `long long' type */
+#define FT_LONG64
+#define FT_INT64   long long int
+#define FT_UINT64  unsigned long long int
+
+#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A 64-bit data type will create compilation problems if you compile    */
+  /* in strict ANSI mode.  To avoid them, we disable its use if __STDC__   */
+  /* is defined.  You can however ignore this rule by defining the         */
+  /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro.                     */
+  /*                                                                       */
+#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )
+
+#ifdef __STDC__
+
+  /* undefine the 64-bit macros in strict ANSI compilation mode */
+#undef FT_LONG64
+#undef FT_INT64
+
+#endif /* __STDC__ */
+
+#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */
+
+#ifdef FT_LONG64
+  typedef FT_INT64   FT_Int64;
+  typedef FT_UINT64  FT_UInt64;
+#endif
+
+
+#define FT_BEGIN_STMNT  do {
+#define FT_END_STMNT    } while ( 0 )
+#define FT_DUMMY_STMNT  FT_BEGIN_STMNT FT_END_STMNT
+
+
+#ifndef  FT_CONFIG_OPTION_NO_ASSEMBLER
+  /* Provide assembler fragments for performance-critical functions. */
+  /* These must be defined `static __inline__' with GCC.             */
+
+  /**Johnson add !defined( __thumb__ )*/
+#if (defined( __CC_ARM ) || defined( __ARMCC__ ))&& !defined( __thumb__ )  /* RVCT */
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm
+
+  /* documentation is in freetype.h */
+
+  static __inline FT_Int32
+  FT_MulFix_arm( FT_Int32  a,
+                 FT_Int32  b )
+  {
+    register FT_Int32  t, t2;
+
+
+    __asm
+    {
+      smull t2, t,  b,  a           /* (lo=t2,hi=t) = a*b */
+      mov   a,  t,  asr #31         /* a   = (hi >> 31) */
+      add   a,  a,  #0x8000         /* a  += 0x8000 */
+      adds  t2, t2, a               /* t2 += a */
+      adc   t,  t,  #0              /* t  += carry */
+      mov   a,  t2, lsr #16         /* a   = t2 >> 16 */
+      orr   a,  a,  t,  lsl #16     /* a  |= t << 16 */
+    }
+    return a;
+  }
+
+#endif /* __CC_ARM || __ARMCC__ */
+
+
+#ifdef __GNUC__
+
+#if defined( __arm__ ) && !defined( __thumb__ )    && \
+    !( defined( __CC_ARM ) || defined( __ARMCC__ ) )
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm
+
+  /* documentation is in freetype.h */
+
+  static __inline__ FT_Int32
+  FT_MulFix_arm( FT_Int32  a,
+                 FT_Int32  b )
+  {
+    register FT_Int32  t, t2;
+
+
+    __asm__ __volatile__ (
+      "smull  %1, %2, %4, %3\n\t"       /* (lo=%1,hi=%2) = a*b */
+      "mov    %0, %2, asr #31\n\t"      /* %0  = (hi >> 31) */
+      "add    %0, %0, #0x8000\n\t"      /* %0 += 0x8000 */
+      "adds   %1, %1, %0\n\t"           /* %1 += %0 */
+      "adc    %2, %2, #0\n\t"           /* %2 += carry */
+      "mov    %0, %1, lsr #16\n\t"      /* %0  = %1 >> 16 */
+      "orr    %0, %0, %2, lsl #16\n\t"  /* %0 |= %2 << 16 */
+      : "=r"(a), "=&r"(t2), "=&r"(t)
+      : "r"(a), "r"(b)
+      : "cc" );
+    return a;
+  }
+
+#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */
+
+#if defined( __i386__ )
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
+
+  /* documentation is in freetype.h */
+
+  static __inline__ FT_Int32
+  FT_MulFix_i386( FT_Int32  a,
+                  FT_Int32  b )
+  {
+    register FT_Int32  result;
+
+
+    __asm__ __volatile__ (
+      "imul  %%edx\n"
+      "movl  %%edx, %%ecx\n"
+      "sarl  $31, %%ecx\n"
+      "addl  $0x8000, %%ecx\n"
+      "addl  %%ecx, %%eax\n"
+      "adcl  $0, %%edx\n"
+      "shrl  $16, %%eax\n"
+      "shll  $16, %%edx\n"
+      "addl  %%edx, %%eax\n"
+      : "=a"(result), "=d"(b)
+      : "a"(a), "d"(b)
+      : "%ecx", "cc" );
+    return result;
+  }
+
+#endif /* i386 */
+
+#endif /* __GNUC__ */
+
+
+#ifdef _MSC_VER /* Visual C++ */
+
+#ifdef _M_IX86
+
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
+
+  /* documentation is in freetype.h */
+
+  static __inline FT_Int32
+  FT_MulFix_i386( FT_Int32  a,
+                  FT_Int32  b )
+  {
+    register FT_Int32  result;
+
+    __asm
+    {
+      mov eax, a
+      mov edx, b
+      imul edx
+      mov ecx, edx
+      sar ecx, 31
+      add ecx, 8000h
+      add eax, ecx
+      adc edx, 0
+      shr eax, 16
+      shl edx, 16
+      add eax, edx
+      mov result, eax
+    }
+    return result;
+  }
+
+#endif /* _M_IX86 */
+
+#endif /* _MSC_VER */
+
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
+#ifdef FT_MULFIX_ASSEMBLER
+#define FT_MULFIX_INLINED  FT_MULFIX_ASSEMBLER
+#endif
+#endif
+
+
+#ifdef FT_MAKE_OPTION_SINGLE_OBJECT
+
+#define FT_LOCAL( x )      static  x
+#define FT_LOCAL_DEF( x )  static  x
+
+#else
+
+#ifdef __cplusplus
+#define FT_LOCAL( x )      extern "C"  x
+#define FT_LOCAL_DEF( x )  extern "C"  x
+#else
+#define FT_LOCAL( x )      extern  x
+#define FT_LOCAL_DEF( x )  x
+#endif
+
+#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
+
+
+#ifndef FT_BASE
+
+#ifdef __cplusplus
+#define FT_BASE( x )  extern "C"  x
+#else
+#define FT_BASE( x )  extern  x
+#endif
+
+#endif /* !FT_BASE */
+
+
+#ifndef FT_BASE_DEF
+
+#ifdef __cplusplus
+#define FT_BASE_DEF( x )  x
+#else
+#define FT_BASE_DEF( x )  x
+#endif
+
+#endif /* !FT_BASE_DEF */
+
+
+#ifndef FT_EXPORT
+
+#ifdef __cplusplus
+#define FT_EXPORT( x )  extern "C"  x
+#else
+#define FT_EXPORT( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT */
+
+
+#ifndef FT_EXPORT_DEF
+
+#ifdef __cplusplus
+#define FT_EXPORT_DEF( x )  extern "C"  x
+#else
+#define FT_EXPORT_DEF( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT_DEF */
+
+
+#ifndef FT_EXPORT_VAR
+
+#ifdef __cplusplus
+#define FT_EXPORT_VAR( x )  extern "C"  x
+#else
+#define FT_EXPORT_VAR( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT_VAR */
+
+  /* The following macros are needed to compile the library with a   */
+  /* C++ compiler and with 16bit compilers.                          */
+  /*                                                                 */
+
+  /* This is special.  Within C++, you must specify `extern "C"' for */
+  /* functions which are used via function pointers, and you also    */
+  /* must do that for structures which contain function pointers to  */
+  /* assure C linkage -- it's not possible to have (local) anonymous */
+  /* functions which are accessed by (global) function pointers.     */
+  /*                                                                 */
+  /*                                                                 */
+  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */
+  /*                                                                 */
+  /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
+  /* contains pointers to callback functions.                        */
+  /*                                                                 */
+  /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable   */
+  /* that contains pointers to callback functions.                   */
+  /*                                                                 */
+  /*                                                                 */
+  /* Some 16bit compilers have to redefine these macros to insert    */
+  /* the infamous `_cdecl' or `__fastcall' declarations.             */
+  /*                                                                 */
+#ifndef FT_CALLBACK_DEF
+#ifdef __cplusplus
+#define FT_CALLBACK_DEF( x )  extern "C"  x
+#else
+#define FT_CALLBACK_DEF( x )  static  x
+#endif
+#endif /* FT_CALLBACK_DEF */
+
+#ifndef FT_CALLBACK_TABLE
+#ifdef __cplusplus
+#define FT_CALLBACK_TABLE      extern "C"
+#define FT_CALLBACK_TABLE_DEF  extern "C"
+#else
+#define FT_CALLBACK_TABLE      extern
+#define FT_CALLBACK_TABLE_DEF  /* nothing */
+#endif
+#endif /* FT_CALLBACK_TABLE */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTCONFIG_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftheader.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftheader.h
new file mode 100644
index 0000000..d979104
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftheader.h
@@ -0,0 +1,832 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftheader.h                                                             */
+/*                                                                         */
+/*    Build macros of the FreeType 2 library.                              */
+/*                                                                         */
+/*  Copyright 1996-2008, 2010, 2012, 2013 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#ifndef __FT_HEADER_H__
+#define __FT_HEADER_H__
+
+
+  /*@***********************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_BEGIN_HEADER                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro is used in association with @FT_END_HEADER in header    */
+  /*    files to ensure that the declarations within are properly          */
+  /*    encapsulated in an `extern "C" { .. }' block when included from a  */
+  /*    C++ compiler.                                                      */
+  /*                                                                       */
+#ifdef __cplusplus
+#define FT_BEGIN_HEADER  extern "C" {
+#else
+#define FT_BEGIN_HEADER  /* nothing */
+#endif
+
+
+  /*@***********************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_END_HEADER                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro is used in association with @FT_BEGIN_HEADER in header  */
+  /*    files to ensure that the declarations within are properly          */
+  /*    encapsulated in an `extern "C" { .. }' block when included from a  */
+  /*    C++ compiler.                                                      */
+  /*                                                                       */
+#ifdef __cplusplus
+#define FT_END_HEADER  }
+#else
+#define FT_END_HEADER  /* nothing */
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Aliases for the FreeType 2 public and configuration files.            */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    header_file_macros                                                 */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Header File Macros                                                 */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Macro definitions used to #include specific header files.          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The following macros are defined to the name of specific           */
+  /*    FreeType~2 header files.  They can be used directly in #include    */
+  /*    statements as in:                                                  */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      #include "../freetype.h"                                           */
+  /*      #include "../ftmm.h"                                   */
+  /*      #include "../ftglyph.h"                                              */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    There are several reasons why we are now using macros to name      */
+  /*    public header files.  The first one is that such macros are not    */
+  /*    limited to the infamous 8.3~naming rule required by DOS (and       */
+  /*    `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h').   */
+  /*                                                                       */
+  /*    The second reason is that it allows for more flexibility in the    */
+  /*    way FreeType~2 is installed on a given system.                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* configuration files */
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CONFIG_CONFIG_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   FreeType~2 configuration data.
+   *
+   */
+#ifndef FT_CONFIG_CONFIG_H
+#define FT_CONFIG_CONFIG_H  <freetype/config/ftconfig.h>
+#endif
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CONFIG_STANDARD_LIBRARY_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   FreeType~2 interface to the standard C library functions.
+   *
+   */
+#ifndef FT_CONFIG_STANDARD_LIBRARY_H
+#define FT_CONFIG_STANDARD_LIBRARY_H  <freetype/config/ftstdlib.h>
+#endif
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CONFIG_OPTIONS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   FreeType~2 project-specific configuration options.
+   *
+   */
+#ifndef FT_CONFIG_OPTIONS_H
+#define FT_CONFIG_OPTIONS_H  <freetype/config/ftoption.h>
+#endif
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CONFIG_MODULES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   list of FreeType~2 modules that are statically linked to new library
+   *   instances in @FT_Init_FreeType.
+   *
+   */
+#ifndef FT_CONFIG_MODULES_H
+#define FT_CONFIG_MODULES_H  <freetype/config/ftmodule.h>
+#endif
+
+  /* */
+
+  /* public headers */
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_FREETYPE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   base FreeType~2 API.
+   *
+   */
+#define FT_FREETYPE_H  <freetype/freetype.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ERRORS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   list of FreeType~2 error codes (and messages).
+   *
+   *   It is included by @FT_FREETYPE_H.
+   *
+   */
+#define FT_ERRORS_H  <freetype/fterrors.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_MODULE_ERRORS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   list of FreeType~2 module error offsets (and messages).
+   *
+   */
+#define FT_MODULE_ERRORS_H  <freetype/ftmoderr.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SYSTEM_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 interface to low-level operations (i.e., memory management
+   *   and stream i/o).
+   *
+   *   It is included by @FT_FREETYPE_H.
+   *
+   */
+#define FT_SYSTEM_H  <freetype/ftsystem.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IMAGE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing type
+   *   definitions related to glyph images (i.e., bitmaps, outlines,
+   *   scan-converter parameters).
+   *
+   *   It is included by @FT_FREETYPE_H.
+   *
+   */
+#define FT_IMAGE_H  <freetype/ftimage.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TYPES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   basic data types defined by FreeType~2.
+   *
+   *   It is included by @FT_FREETYPE_H.
+   *
+   */
+#define FT_TYPES_H  <freetype/fttypes.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_LIST_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   list management API of FreeType~2.
+   *
+   *   (Most applications will never need to include this file.)
+   *
+   */
+#define FT_LIST_H  <freetype/ftlist.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_OUTLINE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   scalable outline management API of FreeType~2.
+   *
+   */
+#define FT_OUTLINE_H  <freetype/ftoutln.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SIZES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API which manages multiple @FT_Size objects per face.
+   *
+   */
+#define FT_SIZES_H  <freetype/ftsizes.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_MODULE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   module management API of FreeType~2.
+   *
+   */
+#define FT_MODULE_H  <freetype/ftmodapi.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_RENDER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   renderer module management API of FreeType~2.
+   *
+   */
+#define FT_RENDER_H  <freetype/ftrender.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_AUTOHINTER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   structures and macros related to the auto-hinting module.
+   *
+   */
+#define FT_AUTOHINTER_H  <freetype/ftautoh.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CFF_DRIVER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   structures and macros related to the CFF driver module.
+   *
+   */
+#define FT_CFF_DRIVER_H  <freetype/ftcffdrv.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRUETYPE_DRIVER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   structures and macros related to the TrueType driver module.
+   *
+   */
+#define FT_TRUETYPE_DRIVER_H  <freetype/ftttdrv.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TYPE1_TABLES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   types and API specific to the Type~1 format.
+   *
+   */
+#define FT_TYPE1_TABLES_H  <freetype/t1tables.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRUETYPE_IDS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   enumeration values which identify name strings, languages, encodings,
+   *   etc.  This file really contains a _large_ set of constant macro
+   *   definitions, taken from the TrueType and OpenType specifications.
+   *
+   */
+#define FT_TRUETYPE_IDS_H  <freetype/ttnameid.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRUETYPE_TABLES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   types and API specific to the TrueType (as well as OpenType) format.
+   *
+   */
+#define FT_TRUETYPE_TABLES_H  <freetype/tttables.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRUETYPE_TAGS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of TrueType four-byte `tags' which identify blocks in
+   *   SFNT-based font formats (i.e., TrueType and OpenType).
+   *
+   */
+#define FT_TRUETYPE_TAGS_H  <freetype/tttags.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_BDF_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which accesses BDF-specific strings from a
+   *   face.
+   *
+   */
+#define FT_BDF_H  <freetype/ftbdf.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CID_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which access CID font information from a
+   *   face.
+   *
+   */
+#define FT_CID_H  <freetype/ftcid.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_GZIP_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which supports gzip-compressed files.
+   *
+   */
+#define FT_GZIP_H  <freetype/ftgzip.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_LZW_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which supports LZW-compressed files.
+   *
+   */
+#define FT_LZW_H  <freetype/ftlzw.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_BZIP2_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which supports bzip2-compressed files.
+   *
+   */
+#define FT_BZIP2_H  <freetype/ftbzip2.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_WINFONTS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which supports Windows FNT files.
+   *
+   */
+#define FT_WINFONTS_H   <freetype/ftwinfnt.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_GLYPH_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API of the optional glyph management component.
+   *
+   */
+#define FT_GLYPH_H  <freetype/ftglyph.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_BITMAP_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API of the optional bitmap conversion component.
+   *
+   */
+#define FT_BITMAP_H  <freetype/ftbitmap.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_BBOX_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API of the optional exact bounding box computation routines.
+   *
+   */
+#define FT_BBOX_H  <freetype/ftbbox.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CACHE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API of the optional FreeType~2 cache sub-system.
+   *
+   */
+#define FT_CACHE_H  <freetype/ftcache.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CACHE_IMAGE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   `glyph image' API of the FreeType~2 cache sub-system.
+   *
+   *   It is used to define a cache for @FT_Glyph elements.  You can also
+   *   use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to
+   *   store small glyph bitmaps, as it will use less memory.
+   *
+   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all
+   *   glyph image-related cache declarations.
+   *
+   */
+#define FT_CACHE_IMAGE_H  FT_CACHE_H
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CACHE_SMALL_BITMAPS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   `small bitmaps' API of the FreeType~2 cache sub-system.
+   *
+   *   It is used to define a cache for small glyph bitmaps in a relatively
+   *   memory-efficient way.  You can also use the API defined in
+   *   @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images,
+   *   including scalable outlines.
+   *
+   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all
+   *   small bitmaps-related cache declarations.
+   *
+   */
+#define FT_CACHE_SMALL_BITMAPS_H  FT_CACHE_H
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CACHE_CHARMAP_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   `charmap' API of the FreeType~2 cache sub-system.
+   *
+   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all
+   *   charmap-based cache declarations.
+   *
+   */
+#define FT_CACHE_CHARMAP_H  FT_CACHE_H
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_MAC_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   Macintosh-specific FreeType~2 API.  The latter is used to access
+   *   fonts embedded in resource forks.
+   *
+   *   This header file must be explicitly included by client applications
+   *   compiled on the Mac (note that the base API still works though).
+   *
+   */
+#define FT_MAC_H  <freetype/ftmac.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_MULTIPLE_MASTERS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   optional multiple-masters management API of FreeType~2.
+   *
+   */
+#define FT_MULTIPLE_MASTERS_H  <freetype/ftmm.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SFNT_NAMES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   optional FreeType~2 API which accesses embedded `name' strings in
+   *   SFNT-based font formats (i.e., TrueType and OpenType).
+   *
+   */
+#define FT_SFNT_NAMES_H  <freetype/ftsnames.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_OPENTYPE_VALIDATE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   optional FreeType~2 API which validates OpenType tables (BASE, GDEF,
+   *   GPOS, GSUB, JSTF).
+   *
+   */
+#define FT_OPENTYPE_VALIDATE_H  <freetype/ftotval.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_GX_VALIDATE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat,
+   *   mort, morx, bsln, just, kern, opbd, trak, prop).
+   *
+   */
+#define FT_GX_VALIDATE_H  <freetype/ftgxval.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_PFR_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which accesses PFR-specific data.
+   *
+   */
+#define FT_PFR_H  <freetype/ftpfr.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_STROKER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which provides functions to stroke outline paths.
+   */
+#define FT_STROKER_H  <freetype/ftstroke.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SYNTHESIS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs artificial obliquing and emboldening.
+   */
+#define FT_SYNTHESIS_H  <freetype/ftsynth.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_XFREE86_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which provides functions specific to the XFree86 and
+   *   X.Org X11 servers.
+   */
+#define FT_XFREE86_H  <freetype/ftxf86.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRIGONOMETRY_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs trigonometric computations (e.g.,
+   *   cosines and arc tangents).
+   */
+#define FT_TRIGONOMETRY_H  <freetype/fttrigon.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_LCD_FILTER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs color filtering for subpixel rendering.
+   */
+#define FT_LCD_FILTER_H  <freetype/ftlcdfil.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_UNPATENTED_HINTING_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs color filtering for subpixel rendering.
+   */
+#define FT_UNPATENTED_HINTING_H  <freetype/ttunpat.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_INCREMENTAL_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs color filtering for subpixel rendering.
+   */
+#define FT_INCREMENTAL_H  <freetype/ftincrem.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_GASP_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which returns entries from the TrueType GASP table.
+   */
+#define FT_GASP_H  <freetype/ftgasp.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ADVANCES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which returns individual and ranged glyph advances.
+   */
+#define FT_ADVANCES_H  <freetype/ftadvanc.h>
+
+
+  /* */
+
+#define FT_ERROR_DEFINITIONS_H  <freetype/fterrdef.h>
+
+
+  /* The internals of the cache sub-system are no longer exposed.  We */
+  /* default to FT_CACHE_H at the moment just in case, but we know of */
+  /* no rogue client that uses them.                                  */
+  /*                                                                  */
+#define FT_CACHE_MANAGER_H           <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_MRU_H      <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_MANAGER_H  <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_CACHE_H    <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_GLYPH_H    <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_IMAGE_H    <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_SBITS_H    <freetype/ftcache.h>
+
+
+#define FT_INCREMENTAL_H          <freetype/ftincrem.h>
+
+#define FT_TRUETYPE_UNPATENTED_H  <freetype/ttunpat.h>
+
+
+  /*
+   * Include internal headers definitions from <freetype/internal/...>
+   * only when building the library.
+   */
+#ifdef FT2_BUILD_LIBRARY
+#define  FT_INTERNAL_INTERNAL_H  <freetype/internal/internal.h>
+#include "../internal/internal.h"
+#endif /* FT2_BUILD_LIBRARY */
+
+
+#endif /* __FT2_BUILD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftmodule.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftmodule.h
new file mode 100644
index 0000000..0d31ce6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftmodule.h
@@ -0,0 +1,32 @@
+/*
+ *  This file registers the FreeType modules compiled into the library.
+ *
+ *  If you use GNU make, this file IS NOT USED!  Instead, it is created in
+ *  the objects directory (normally `<topdir>/objs/') based on information
+ *  from `<topdir>/modules.cfg'.
+ *
+ *  Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile
+ *  FreeType without GNU make.
+ *
+ */
+
+//FT_USE_MODULE( FT_Module_Class, autofit_module_class )
+FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class )
+FT_USE_MODULE( FT_Module_Class, psaux_module_class )
+FT_USE_MODULE( FT_Module_Class, psnames_module_class )
+FT_USE_MODULE( FT_Module_Class, pshinter_module_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class )
+FT_USE_MODULE( FT_Module_Class, sfnt_module_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class )
+
+/* EOF */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftoption.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftoption.h
new file mode 100644
index 0000000..e16e3c1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftoption.h
@@ -0,0 +1,833 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftoption.h                                                             */
+/*                                                                         */
+/*    User-selectable configuration macros (specification only).           */
+/*                                                                         */
+/*  Copyright 1996-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTOPTION_H__
+#define __FTOPTION_H__
+
+
+#include "../../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                 USER-SELECTABLE CONFIGURATION MACROS                  */
+  /*                                                                       */
+  /* This file contains the default configuration macro definitions for    */
+  /* a standard build of the FreeType library.  There are three ways to    */
+  /* use this file to build project-specific versions of the library:      */
+  /*                                                                       */
+  /*  - You can modify this file by hand, but this is not recommended in   */
+  /*    cases where you would like to build several versions of the        */
+  /*    library from a single source directory.                            */
+  /*                                                                       */
+  /*  - You can put a copy of this file in your build directory, more      */
+  /*    precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD'   */
+  /*    is the name of a directory that is included _before_ the FreeType  */
+  /*    include path during compilation.                                   */
+  /*                                                                       */
+  /*    The default FreeType Makefiles and Jamfiles use the build          */
+  /*    directory `builds/<system>' by default, but you can easily change  */
+  /*    that for your own projects.                                        */
+  /*                                                                       */
+  /*  - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it    */
+  /*    slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to       */
+  /*    locate this file during the build.  For example,                   */
+  /*                                                                       */
+  /*      #define FT_CONFIG_OPTIONS_H  <myftoptions.h>                     */
+  /*      #include <freetype/config/ftheader.h>                            */
+  /*                                                                       */
+  /*    will use `$BUILD/myftoptions.h' instead of this file for macro     */
+  /*    definitions.                                                       */
+  /*                                                                       */
+  /*    Note also that you can similarly pre-define the macro              */
+  /*    FT_CONFIG_MODULES_H used to locate the file listing of the modules */
+  /*    that are statically linked to the library at compile time.  By     */
+  /*    default, this file is <freetype/config/ftmodule.h>.                */
+  /*                                                                       */
+  /*  We highly recommend using the third method whenever possible.        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /**** G E N E R A L   F R E E T Y P E   2   C O N F I G U R A T I O N ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Uncomment the line below if you want to activate sub-pixel rendering  */
+  /* (a.k.a. LCD rendering, or ClearType) in this build of the library.    */
+  /*                                                                       */
+  /* Note that this feature is covered by several Microsoft patents        */
+  /* and should not be activated in any default build of the library.      */
+  /*                                                                       */
+  /* This macro has no impact on the FreeType API, only on its             */
+  /* _implementation_.  For example, using FT_RENDER_MODE_LCD when calling */
+  /* FT_Render_Glyph still generates a bitmap that is 3 times wider than   */
+  /* the original size in case this macro isn't defined; however, each     */
+  /* triplet of subpixels has R=G=B.                                       */
+  /*                                                                       */
+  /* This is done to allow FreeType clients to run unmodified, forcing     */
+  /* them to display normal gray-level anti-aliased glyphs.                */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Many compilers provide a non-ANSI 64-bit data type that can be used   */
+  /* by FreeType to speed up some computations.  However, this will create */
+  /* some problems when compiling the library in strict ANSI mode.         */
+  /*                                                                       */
+  /* For this reason, the use of 64-bit integers is normally disabled when */
+  /* the __STDC__ macro is defined.  You can however disable this by       */
+  /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here.                 */
+  /*                                                                       */
+  /* For most compilers, this will only create compilation warnings when   */
+  /* building the library.                                                 */
+  /*                                                                       */
+  /* ObNote: The compiler-specific 64-bit integers are detected in the     */
+  /*         file `ftconfig.h' either statically or through the            */
+  /*         `configure' script on supported platforms.                    */
+  /*                                                                       */
+#undef FT_CONFIG_OPTION_FORCE_INT64
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* If this macro is defined, do not try to use an assembler version of   */
+  /* performance-critical functions (e.g. FT_MulFix).  You should only do  */
+  /* that to verify that the assembler function works properly, or to      */
+  /* execute benchmark tests of the various implementations.               */
+/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* If this macro is defined, try to use an inlined assembler version of  */
+  /* the `FT_MulFix' function, which is a `hotspot' when loading and       */
+  /* hinting glyphs, and which should be executed as fast as possible.     */
+  /*                                                                       */
+  /* Note that if your compiler or CPU is not supported, this will default */
+  /* to the standard and portable implementation found in `ftcalc.c'.      */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_INLINE_MULFIX
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* LZW-compressed file support.                                          */
+  /*                                                                       */
+  /*   FreeType now handles font files that have been compressed with the  */
+  /*   `compress' program.  This is mostly used to parse many of the PCF   */
+  /*   files that come with various X11 distributions.  The implementation */
+  /*   uses NetBSD's `zopen' to partially uncompress the file on the fly   */
+  /*   (see src/lzw/ftgzip.c).                                             */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.             */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_USE_LZW
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Gzip-compressed file support.                                         */
+  /*                                                                       */
+  /*   FreeType now handles font files that have been compressed with the  */
+  /*   `gzip' program.  This is mostly used to parse many of the PCF files */
+  /*   that come with XFree86.  The implementation uses `zlib' to          */
+  /*   partially uncompress the file on the fly (see src/gzip/ftgzip.c).   */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.  See also   */
+  /*   the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below.                       */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_USE_ZLIB
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ZLib library selection                                                */
+  /*                                                                       */
+  /*   This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined.  */
+  /*   It allows FreeType's `ftgzip' component to link to the system's     */
+  /*   installation of the ZLib library.  This is useful on systems like   */
+  /*   Unix or VMS where it generally is already available.                */
+  /*                                                                       */
+  /*   If you let it undefined, the component will use its own copy        */
+  /*   of the zlib sources instead.  These have been modified to be        */
+  /*   included directly within the component and *not* export external    */
+  /*   function names.  This allows you to link any program with FreeType  */
+  /*   _and_ ZLib without linking conflicts.                               */
+  /*                                                                       */
+  /*   Do not #undef this macro here since the build system might define   */
+  /*   it for certain configurations only.                                 */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Bzip2-compressed file support.                                        */
+  /*                                                                       */
+  /*   FreeType now handles font files that have been compressed with the  */
+  /*   `bzip2' program.  This is mostly used to parse many of the PCF      */
+  /*   files that come with XFree86.  The implementation uses `libbz2' to  */
+  /*   partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */
+  /*   Contrary to gzip, bzip2 currently is not included and need to use   */
+  /*   the system available bzip2 implementation.                          */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.             */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_USE_BZIP2 */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define to disable the use of file stream functions and types, FILE,   */
+  /* fopen() etc.  Enables the use of smaller system libraries on embedded */
+  /* systems that have multiple system libraries, some with or without     */
+  /* file stream support, in the cases where file stream support is not    */
+  /* necessary such as memory loading of font files.                       */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  PNG bitmap support.                                                  */
+  /*                                                                       */
+  /*   FreeType now handles loading color bitmap glyphs in the PNG format. */
+  /*   This requires help from the external libpng library.  Uncompressed  */
+  /*   color bitmaps do not need any external libraries and will be        */
+  /*   supported regardless of this configuration.                         */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.             */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_USE_PNG */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DLL export compilation                                                */
+  /*                                                                       */
+  /*   When compiling FreeType as a DLL, some systems/compilers need a     */
+  /*   special keyword in front OR after the return type of function       */
+  /*   declarations.                                                       */
+  /*                                                                       */
+  /*   Two macros are used within the FreeType source code to define       */
+  /*   exported library functions: FT_EXPORT and FT_EXPORT_DEF.            */
+  /*                                                                       */
+  /*     FT_EXPORT( return_type )                                          */
+  /*                                                                       */
+  /*       is used in a function declaration, as in                        */
+  /*                                                                       */
+  /*         FT_EXPORT( FT_Error )                                         */
+  /*         FT_Init_FreeType( FT_Library*  alibrary );                    */
+  /*                                                                       */
+  /*                                                                       */
+  /*     FT_EXPORT_DEF( return_type )                                      */
+  /*                                                                       */
+  /*       is used in a function definition, as in                         */
+  /*                                                                       */
+  /*         FT_EXPORT_DEF( FT_Error )                                     */
+  /*         FT_Init_FreeType( FT_Library*  alibrary )                     */
+  /*         {                                                             */
+  /*           ... some code ...                                           */
+  /*           return FT_Err_Ok;                                           */
+  /*         }                                                             */
+  /*                                                                       */
+  /*   You can provide your own implementation of FT_EXPORT and            */
+  /*   FT_EXPORT_DEF here if you want.  If you leave them undefined, they  */
+  /*   will be later automatically defined as `extern return_type' to      */
+  /*   allow normal compilation.                                           */
+  /*                                                                       */
+  /*   Do not #undef these macros here since the build system might define */
+  /*   them for certain configurations only.                               */
+  /*                                                                       */
+/* #define FT_EXPORT(x)      extern x */
+/* #define FT_EXPORT_DEF(x)  x */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Glyph Postscript Names handling                                       */
+  /*                                                                       */
+  /*   By default, FreeType 2 is compiled with the `psnames' module.  This */
+  /*   module is in charge of converting a glyph name string into a        */
+  /*   Unicode value, or return a Macintosh standard glyph name for the    */
+  /*   use with the TrueType `post' table.                                 */
+  /*                                                                       */
+  /*   Undefine this macro if you do not want `psnames' compiled in your   */
+  /*   build of FreeType.  This has the following effects:                 */
+  /*                                                                       */
+  /*   - The TrueType driver will provide its own set of glyph names,      */
+  /*     if you build it to support postscript names in the TrueType       */
+  /*     `post' table.                                                     */
+  /*                                                                       */
+  /*   - The Type 1 driver will not be able to synthesize a Unicode        */
+  /*     charmap out of the glyphs found in the fonts.                     */
+  /*                                                                       */
+  /*   You would normally undefine this configuration macro when building  */
+  /*   a version of FreeType that doesn't contain a Type 1 or CFF driver.  */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Postscript Names to Unicode Values support                            */
+  /*                                                                       */
+  /*   By default, FreeType 2 is built with the `PSNames' module compiled  */
+  /*   in.  Among other things, the module is used to convert a glyph name */
+  /*   into a Unicode value.  This is especially useful in order to        */
+  /*   synthesize on the fly a Unicode charmap from the CFF/Type 1 driver  */
+  /*   through a big table named the `Adobe Glyph List' (AGL).             */
+  /*                                                                       */
+  /*   Undefine this macro if you do not want the Adobe Glyph List         */
+  /*   compiled in your `PSNames' module.  The Type 1 driver will not be   */
+  /*   able to synthesize a Unicode charmap out of the glyphs found in the */
+  /*   fonts.                                                              */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Support for Mac fonts                                                 */
+  /*                                                                       */
+  /*   Define this macro if you want support for outline fonts in Mac      */
+  /*   format (mac dfont, mac resource, macbinary containing a mac         */
+  /*   resource) on non-Mac platforms.                                     */
+  /*                                                                       */
+  /*   Note that the `FOND' resource isn't checked.                        */
+  /*                                                                       */
+//#define FT_CONFIG_OPTION_MAC_FONTS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Guessing methods to access embedded resource forks                    */
+  /*                                                                       */
+  /*   Enable extra Mac fonts support on non-Mac platforms (e.g.           */
+  /*   GNU/Linux).                                                         */
+  /*                                                                       */
+  /*   Resource forks which include fonts data are stored sometimes in     */
+  /*   locations which users or developers don't expected.  In some cases, */
+  /*   resource forks start with some offset from the head of a file.  In  */
+  /*   other cases, the actual resource fork is stored in file different   */
+  /*   from what the user specifies.  If this option is activated,         */
+  /*   FreeType tries to guess whether such offsets or different file      */
+  /*   names must be used.                                                 */
+  /*                                                                       */
+  /*   Note that normal, direct access of resource forks is controlled via */
+  /*   the FT_CONFIG_OPTION_MAC_FONTS option.                              */
+  /*                                                                       */
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Allow the use of FT_Incremental_Interface to load typefaces that      */
+  /* contain no glyph data, but supply it via a callback function.         */
+  /* This is required by clients supporting document formats which         */
+  /* supply font data incrementally as the document is parsed, such        */
+  /* as the Ghostscript interpreter for the PostScript language.           */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_INCREMENTAL
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The size in bytes of the render pool used by the scan-line converter  */
+  /* to do all of its work.                                                */
+  /*                                                                       */
+  /* This must be greater than 4KByte if you use FreeType to rasterize     */
+  /* glyphs; otherwise, you may set it to zero to avoid unnecessary        */
+  /* allocation of the render pool.                                        */
+  /*                                                                       */
+#define FT_RENDER_POOL_SIZE  16384L
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FT_MAX_MODULES                                                        */
+  /*                                                                       */
+  /*   The maximum number of modules that can be registered in a single    */
+  /*   FreeType library object.  32 is the default.                        */
+  /*                                                                       */
+#define FT_MAX_MODULES  32
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Debug level                                                           */
+  /*                                                                       */
+  /*   FreeType can be compiled in debug or trace mode.  In debug mode,    */
+  /*   errors are reported through the `ftdebug' component.  In trace      */
+  /*   mode, additional messages are sent to the standard output during    */
+  /*   execution.                                                          */
+  /*                                                                       */
+  /*   Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode.     */
+  /*   Define FT_DEBUG_LEVEL_TRACE to build it in trace mode.              */
+  /*                                                                       */
+  /*   Don't define any of these macros to compile in `release' mode!      */
+  /*                                                                       */
+  /*   Do not #undef these macros here since the build system might define */
+  /*   them for certain configurations only.                               */
+  /*                                                                       */
+/* #define FT_DEBUG_LEVEL_ERROR */
+/* #define FT_DEBUG_LEVEL_TRACE */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Autofitter debugging                                                  */
+  /*                                                                       */
+  /*   If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to     */
+  /*   control the autofitter behaviour for debugging purposes with global */
+  /*   boolean variables (consequently, you should *never* enable this     */
+  /*   while compiling in `release' mode):                                 */
+  /*                                                                       */
+  /*     _af_debug_disable_horz_hints                                      */
+  /*     _af_debug_disable_vert_hints                                      */
+  /*     _af_debug_disable_blue_hints                                      */
+  /*                                                                       */
+  /*   Additionally, the following functions provide dumps of various      */
+  /*   internal autofit structures to stdout (using `printf'):             */
+  /*                                                                       */
+  /*     af_glyph_hints_dump_points                                        */
+  /*     af_glyph_hints_dump_segments                                      */
+  /*     af_glyph_hints_dump_edges                                         */
+  /*                                                                       */
+  /*   As an argument, they use another global variable:                   */
+  /*                                                                       */
+  /*     _af_debug_hints                                                   */
+  /*                                                                       */
+  /*   Please have a look at the `ftgrid' demo program to see how those    */
+  /*   variables and macros should be used.                                */
+  /*                                                                       */
+  /*   Do not #undef these macros here since the build system might define */
+  /*   them for certain configurations only.                               */
+  /*                                                                       */
+/* #define FT_DEBUG_AUTOFIT */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Memory Debugging                                                      */
+  /*                                                                       */
+  /*   FreeType now comes with an integrated memory debugger that is       */
+  /*   capable of detecting simple errors like memory leaks or double      */
+  /*   deletes.  To compile it within your build of the library, you       */
+  /*   should define FT_DEBUG_MEMORY here.                                 */
+  /*                                                                       */
+  /*   Note that the memory debugger is only activated at runtime when     */
+  /*   when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */
+  /*                                                                       */
+  /*   Do not #undef this macro here since the build system might define   */
+  /*   it for certain configurations only.                                 */
+  /*                                                                       */
+/* #define FT_DEBUG_MEMORY */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Module errors                                                         */
+  /*                                                                       */
+  /*   If this macro is set (which is _not_ the default), the higher byte  */
+  /*   of an error code gives the module in which the error has occurred,  */
+  /*   while the lower byte is the real error code.                        */
+  /*                                                                       */
+  /*   Setting this macro makes sense for debugging purposes only, since   */
+  /*   it would break source compatibility of certain programs that use    */
+  /*   FreeType 2.                                                         */
+  /*                                                                       */
+  /*   More details can be found in the files ftmoderr.h and fterrors.h.   */
+  /*                                                                       */
+#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Position Independent Code                                             */
+  /*                                                                       */
+  /*   If this macro is set (which is _not_ the default), FreeType2 will   */
+  /*   avoid creating constants that require address fixups.  Instead the  */
+  /*   constants will be moved into a struct and additional intialization  */
+  /*   code will be used.                                                  */
+  /*                                                                       */
+  /*   Setting this macro is needed for systems that prohibit address      */
+  /*   fixups, such as BREW.                                               */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_PIC */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****        S F N T   D R I V E R    C O N F I G U R A T I O N       ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support       */
+  /* embedded bitmaps in all formats using the SFNT module (namely         */
+  /* TrueType & OpenType).                                                 */
+  /*                                                                       */
+#undef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to    */
+  /* load and enumerate the glyph Postscript names in a TrueType or        */
+  /* OpenType file.                                                        */
+  /*                                                                       */
+  /* Note that when you do not compile the `PSNames' module by undefining  */
+  /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will   */
+  /* contain additional code used to read the PS Names table from a font.  */
+  /*                                                                       */
+  /* (By default, the module uses `PSNames' to extract glyph names.)       */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to       */
+  /* access the internal name table in a SFNT-based format like TrueType   */
+  /* or OpenType.  The name table contains various strings used to         */
+  /* describe the font, like family name, copyright, version, etc.  It     */
+  /* does not contain any glyph name though.                               */
+  /*                                                                       */
+  /* Accessing SFNT names is done through the functions declared in        */
+  /* `freetype/ftsnames.h'.                                                */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_SFNT_NAMES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TrueType CMap support                                                 */
+  /*                                                                       */
+  /*   Here you can fine-tune which TrueType CMap table format shall be    */
+  /*   supported.                                                          */
+#define TT_CONFIG_CMAP_FORMAT_0
+#define TT_CONFIG_CMAP_FORMAT_2
+#define TT_CONFIG_CMAP_FORMAT_4
+#define TT_CONFIG_CMAP_FORMAT_6
+#define TT_CONFIG_CMAP_FORMAT_8
+#define TT_CONFIG_CMAP_FORMAT_10
+#define TT_CONFIG_CMAP_FORMAT_12
+#define TT_CONFIG_CMAP_FORMAT_13
+#define TT_CONFIG_CMAP_FORMAT_14
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****    T R U E T Y P E   D R I V E R    C O N F I G U R A T I O N   ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile   */
+  /* a bytecode interpreter in the TrueType driver.                        */
+  /*                                                                       */
+  /* By undefining this, you will only compile the code necessary to load  */
+  /* TrueType glyphs without hinting.                                      */
+  /*                                                                       */
+  /*   Do not #undef this macro here, since the build system might         */
+  /*   define it for certain configurations only.                          */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile       */
+  /* EXPERIMENTAL subpixel hinting support into the TrueType driver.  This */
+  /* replaces the native TrueType hinting mechanism when anything but      */
+  /* FT_RENDER_MODE_MONO is requested.                                     */
+  /*                                                                       */
+  /* Enabling this causes the TrueType driver to ignore instructions under */
+  /* certain conditions.  This is done in accordance with the guide here,  */
+  /* with some minor differences:                                          */
+  /*                                                                       */
+  /*  http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
+  /*                                                                       */
+  /* By undefining this, you only compile the code necessary to hint       */
+  /* TrueType glyphs with native TT hinting.                               */
+  /*                                                                       */
+  /*   This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be    */
+  /*   defined.                                                            */
+  /*                                                                       */
+/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version  */
+  /* of the TrueType bytecode interpreter is used that doesn't implement   */
+  /* any of the patented opcodes and algorithms.  The patents related to   */
+  /* TrueType hinting have expired worldwide since May 2010; this option   */
+  /* is now deprecated.                                                    */
+  /*                                                                       */
+  /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored*  */
+  /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words,  */
+  /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or                */
+  /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time.    */
+  /*                                                                       */
+  /* This macro is only useful for a small number of font files (mostly    */
+  /* for Asian scripts) that require bytecode interpretation to properly   */
+  /* load glyphs.  For all other fonts, this produces unpleasant results,  */
+  /* thus the unpatented interpreter is never used to load glyphs from     */
+  /* TrueType fonts unless one of the following two options is used.       */
+  /*                                                                       */
+  /*   - The unpatented interpreter is explicitly activated by the user    */
+  /*     through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag         */
+  /*     when opening the FT_Face.                                         */
+  /*                                                                       */
+  /*   - FreeType detects that the FT_Face corresponds to one of the       */
+  /*     `trick' fonts (e.g., `Mingliu') it knows about.  The font engine  */
+  /*     contains a hard-coded list of font names and other matching       */
+  /*     parameters (see function `tt_face_init' in file                   */
+  /*     `src/truetype/ttobjs.c').                                         */
+  /*                                                                       */
+  /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */
+  /*                                                                       */
+  /*   {                                                                   */
+  /*     FT_Parameter  parameter;                                          */
+  /*     FT_Open_Args  open_args;                                          */
+  /*                                                                       */
+  /*                                                                       */
+  /*     parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING;                  */
+  /*                                                                       */
+  /*     open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;         */
+  /*     open_args.pathname   = my_font_pathname;                          */
+  /*     open_args.num_params = 1;                                         */
+  /*     open_args.params     = &parameter;                                */
+  /*                                                                       */
+  /*     error = FT_Open_Face( library, &open_args, index, &face );        */
+  /*     ...                                                               */
+  /*   }                                                                   */
+  /*                                                                       */
+/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType    */
+  /* bytecode interpreter with a huge switch statement, rather than a call */
+  /* table.  This results in smaller and faster code for a number of       */
+  /* architectures.                                                        */
+  /*                                                                       */
+  /* Note however that on some compiler/processor combinations, undefining */
+  /* this macro will generate faster, though larger, code.                 */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the        */
+  /* TrueType glyph loader to use Apple's definition of how to handle      */
+  /* component offsets in composite glyphs.                                */
+  /*                                                                       */
+  /* Apple and MS disagree on the default behavior of component offsets    */
+  /* in composites.  Apple says that they should be scaled by the scaling  */
+  /* factors in the transformation matrix (roughly, it's more complex)     */
+  /* while MS says they should not.  OpenType defines two bits in the      */
+  /* composite flags array which can be used to disambiguate, but old      */
+  /* fonts will not have them.                                             */
+  /*                                                                       */
+  /*   http://www.microsoft.com/typography/otspec/glyf.htm                 */
+  /*   http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html                 */
+  /*                                                                       */
+#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include         */
+  /* support for Apple's distortable font technology (fvar, gvar, cvar,    */
+  /* and avar tables).  This has many similarities to Type 1 Multiple      */
+  /* Masters support.                                                      */
+  /*                                                                       */
+#undef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_BDF if you want to include support for        */
+  /* an embedded `BDF ' table within SFNT-based bitmap formats.            */
+  /*                                                                       */
+#undef TT_CONFIG_OPTION_BDF
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****      T Y P E 1   D R I V E R    C O N F I G U R A T I O N       ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and       */
+  /* arrays in the Type 1 stream (see t1load.c).  A minimum of 4 is        */
+  /* required.                                                             */
+  /*                                                                       */
+#define T1_MAX_DICT_DEPTH  5
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */
+  /* calls during glyph loading.                                           */
+  /*                                                                       */
+#define T1_MAX_SUBRS_CALLS  16
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */
+  /* minimum of 16 is required.                                            */
+  /*                                                                       */
+  /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */
+  /*                                                                       */
+#define T1_MAX_CHARSTRINGS_OPERANDS  512
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define this configuration macro if you want to prevent the            */
+  /* compilation of `t1afm', which is in charge of reading Type 1 AFM      */
+  /* files into an existing face.  Note that if set, the T1 driver will be */
+  /* unable to produce kerning distances.                                  */
+  /*                                                                       */
+#undef T1_CONFIG_OPTION_NO_AFM
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define this configuration macro if you want to prevent the            */
+  /* compilation of the Multiple Masters font support in the Type 1        */
+  /* driver.                                                               */
+  /*                                                                       */
+#undef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****         C F F   D R I V E R    C O N F I G U R A T I O N        ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF       */
+  /* engine gets compiled into FreeType.  If defined, it is possible to    */
+  /* switch between the two engines using the `hinting-engine' property of */
+  /* the cff driver module.                                                */
+  /*                                                                       */
+/* #define CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****    A U T O F I T   M O D U L E    C O N F I G U R A T I O N     ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compile autofit module with CJK (Chinese, Japanese, Korean) script    */
+  /* support.                                                              */
+  /*                                                                       */
+#define AF_CONFIG_OPTION_CJK
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compile autofit module with Indic script support.                     */
+  /*                                                                       */
+#define AF_CONFIG_OPTION_INDIC
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compile autofit module with warp hinting.  The idea of the warping    */
+  /* code is to slightly scale and shift a glyph within a single dimension */
+  /* so that as much of its segments are aligned (more or less) on the     */
+  /* grid.  To find out the optimal scaling and shifting value, various    */
+  /* parameter combinations are tried and scored.                          */
+  /*                                                                       */
+  /* This experimental option is only active if the render mode is         */
+  /* FT_RENDER_MODE_LIGHT.                                                 */
+  /*                                                                       */
+/* #define AF_CONFIG_OPTION_USE_WARPER */
+
+  /* */
+
+
+  /*
+   *  This macro is obsolete.  Support has been removed in FreeType
+   *  version 2.5.
+   */
+/* #define FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+  /*
+   * This macro is defined if either unpatented or native TrueType
+   * hinting is requested by the definitions above.
+   */
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+#define  TT_USE_BYTECODE_INTERPRETER
+#undef   TT_CONFIG_OPTION_UNPATENTED_HINTING
+#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define  TT_USE_BYTECODE_INTERPRETER
+#endif
+
+FT_END_HEADER
+
+
+#endif /* __FTOPTION_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftstdlib.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftstdlib.h
new file mode 100644
index 0000000..b7cd237
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftstdlib.h
@@ -0,0 +1,174 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstdlib.h                                                             */
+/*                                                                         */
+/*    ANSI-specific library and header configuration file (specification   */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 2002-2007, 2009, 2011-2012 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to group all #includes to the ANSI C library that   */
+  /* FreeType normally requires.  It also defines macros to rename the     */
+  /* standard functions within the FreeType source code.                   */
+  /*                                                                       */
+  /* Load a file which defines __FTSTDLIB_H__ before this one to override  */
+  /* it.                                                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTSTDLIB_H__
+#define __FTSTDLIB_H__
+
+
+#include <stddef.h>
+
+#define ft_ptrdiff_t  ptrdiff_t
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                           integer limits                           */
+  /*                                                                    */
+  /* UINT_MAX and ULONG_MAX are used to automatically compute the size  */
+  /* of `int' and `long' in bytes at compile-time.  So far, this works  */
+  /* for all platforms the library has been tested on.                  */
+  /*                                                                    */
+  /* Note that on the extremely rare platforms that do not provide      */
+  /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some    */
+  /* old Crays where `int' is 36 bits), we do not make any guarantee    */
+  /* about the correct behaviour of FT2 with all fonts.                 */
+  /*                                                                    */
+  /* In these case, `ftconfig.h' will refuse to compile anyway with a   */
+  /* message like `couldn't find 32-bit type' or something similar.     */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#include <limits.h>
+
+#define FT_CHAR_BIT    CHAR_BIT
+#define FT_USHORT_MAX  USHRT_MAX
+#define FT_INT_MAX     INT_MAX
+#define FT_INT_MIN     INT_MIN
+#define FT_UINT_MAX    UINT_MAX
+#define FT_ULONG_MAX   ULONG_MAX
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                 character and string processing                    */
+  /*                                                                    */
+  /**********************************************************************/
+
+#include "../../../../../../../include/fxcrt/fx_system.h"
+#include <string.h>
+
+#define ft_memchr   FXSYS_memchr
+#define ft_memcmp   FXSYS_memcmp32
+#define ft_memcpy   FXSYS_memcpy32
+#define ft_memmove  FXSYS_memmove32
+#define ft_memset   FXSYS_memset8
+//#define ft_strcat   FXSYS_strcat
+#define ft_strcmp   FXSYS_strcmp
+#define ft_strcpy   FXSYS_strcpy
+#define ft_strlen   FXSYS_strlen
+#define ft_strncmp  FXSYS_strncmp
+#define ft_strncpy  FXSYS_strncpy
+#define ft_strrchr  FXSYS_strrchr
+#define ft_strstr   FXSYS_strstr
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                           file handling                            */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#include <stdio.h>
+
+#define FT_FILE     FXSYS_FILE
+#define ft_fclose   FXSYS_fclose
+#define ft_fopen    FXSYS_fopen
+#define ft_fread    FXSYS_fread
+#define ft_fseek    FXSYS_fseek
+#define ft_ftell    FXSYS_ftell
+#define ft_sprintf  FXSYS_sprintf
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                             sorting                                */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+//#include <stdlib.h>
+
+#define ft_qsort  FXSYS_qsort
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                        memory allocation                           */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#define ft_scalloc   calloc
+#define ft_sfree     free
+#define ft_smalloc   malloc
+#define ft_srealloc  realloc
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                          miscellaneous                             */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#define ft_atol   FXSYS_atoi
+#define ft_labs   labs
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                         execution control                          */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+//#include <setjmp.h>
+
+#define ft_jmp_buf     jmp_buf  /* note: this cannot be a typedef since */
+                                /*       jmp_buf is defined as a macro  */
+                                /*       on certain platforms           */
+
+#define ft_longjmp     longjmp
+#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */
+
+
+  /* the following is only used for debugging purposes, i.e., if */
+  /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined    */
+
+#include <stdarg.h>
+
+
+#endif /* __FTSTDLIB_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h
new file mode 100644
index 0000000..b6c7715
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h
@@ -0,0 +1,4016 @@
+/***************************************************************************/
+/*                                                                         */
+/*  freetype.h                                                             */
+/*                                                                         */
+/*    FreeType high-level API and common types (specification only).       */
+/*                                                                         */
+/*  Copyright 1996-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FREETYPE_H__
+#define __FREETYPE_H__
+
+
+#ifndef FT_FREETYPE_H
+#error "`ft2build.h' hasn't been included yet!"
+#error "Please always use macros to include FreeType header files."
+#error "Example:"
+#error "  #include <ft2build.h>"
+#error "  #include FT_FREETYPE_H"
+#endif
+
+
+#include "../ft2build.h"
+#include "config/ftconfig.h"
+#include "fttypes.h"
+#include "fterrors.h"
+
+
+FT_BEGIN_HEADER
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    user_allocation                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    User allocation                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    How client applications should allocate FreeType data structures.  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FreeType assumes that structures allocated by the user and passed  */
+  /*    as arguments are zeroed out except for the actual data.  In other  */
+  /*    words, it is recommended to use `calloc' (or variants of it)       */
+  /*    instead of `malloc' for allocation.                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /*                        B A S I C   T Y P E S                          */
+  /*                                                                       */
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    base_interface                                                     */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Base Interface                                                     */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    The FreeType~2 base font interface.                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section describes the public high-level API of FreeType~2.    */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_Library                                                         */
+  /*    FT_Face                                                            */
+  /*    FT_Size                                                            */
+  /*    FT_GlyphSlot                                                       */
+  /*    FT_CharMap                                                         */
+  /*    FT_Encoding                                                        */
+  /*                                                                       */
+  /*    FT_FaceRec                                                         */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_SCALABLE                                              */
+  /*    FT_FACE_FLAG_FIXED_SIZES                                           */
+  /*    FT_FACE_FLAG_FIXED_WIDTH                                           */
+  /*    FT_FACE_FLAG_HORIZONTAL                                            */
+  /*    FT_FACE_FLAG_VERTICAL                                              */
+  /*    FT_FACE_FLAG_SFNT                                                  */
+  /*    FT_FACE_FLAG_KERNING                                               */
+  /*    FT_FACE_FLAG_MULTIPLE_MASTERS                                      */
+  /*    FT_FACE_FLAG_GLYPH_NAMES                                           */
+  /*    FT_FACE_FLAG_EXTERNAL_STREAM                                       */
+  /*    FT_FACE_FLAG_FAST_GLYPHS                                           */
+  /*    FT_FACE_FLAG_HINTER                                                */
+  /*                                                                       */
+  /*    FT_STYLE_FLAG_BOLD                                                 */
+  /*    FT_STYLE_FLAG_ITALIC                                               */
+  /*                                                                       */
+  /*    FT_SizeRec                                                         */
+  /*    FT_Size_Metrics                                                    */
+  /*                                                                       */
+  /*    FT_GlyphSlotRec                                                    */
+  /*    FT_Glyph_Metrics                                                   */
+  /*    FT_SubGlyph                                                        */
+  /*                                                                       */
+  /*    FT_Bitmap_Size                                                     */
+  /*                                                                       */
+  /*    FT_Init_FreeType                                                   */
+  /*    FT_Done_FreeType                                                   */
+  /*                                                                       */
+  /*    FT_New_Face                                                        */
+  /*    FT_Done_Face                                                       */
+  /*    FT_New_Memory_Face                                                 */
+  /*    FT_Open_Face                                                       */
+  /*    FT_Open_Args                                                       */
+  /*    FT_Parameter                                                       */
+  /*    FT_Attach_File                                                     */
+  /*    FT_Attach_Stream                                                   */
+  /*                                                                       */
+  /*    FT_Set_Char_Size                                                   */
+  /*    FT_Set_Pixel_Sizes                                                 */
+  /*    FT_Request_Size                                                    */
+  /*    FT_Select_Size                                                     */
+  /*    FT_Size_Request_Type                                               */
+  /*    FT_Size_Request                                                    */
+  /*    FT_Set_Transform                                                   */
+  /*    FT_Load_Glyph                                                      */
+  /*    FT_Get_Char_Index                                                  */
+  /*    FT_Get_Name_Index                                                  */
+  /*    FT_Load_Char                                                       */
+  /*                                                                       */
+  /*    FT_OPEN_MEMORY                                                     */
+  /*    FT_OPEN_STREAM                                                     */
+  /*    FT_OPEN_PATHNAME                                                   */
+  /*    FT_OPEN_DRIVER                                                     */
+  /*    FT_OPEN_PARAMS                                                     */
+  /*                                                                       */
+  /*    FT_LOAD_DEFAULT                                                    */
+  /*    FT_LOAD_RENDER                                                     */
+  /*    FT_LOAD_MONOCHROME                                                 */
+  /*    FT_LOAD_LINEAR_DESIGN                                              */
+  /*    FT_LOAD_NO_SCALE                                                   */
+  /*    FT_LOAD_NO_HINTING                                                 */
+  /*    FT_LOAD_NO_BITMAP                                                  */
+  /*    FT_LOAD_CROP_BITMAP                                                */
+  /*                                                                       */
+  /*    FT_LOAD_VERTICAL_LAYOUT                                            */
+  /*    FT_LOAD_IGNORE_TRANSFORM                                           */
+  /*    FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH                                */
+  /*    FT_LOAD_FORCE_AUTOHINT                                             */
+  /*    FT_LOAD_NO_RECURSE                                                 */
+  /*    FT_LOAD_PEDANTIC                                                   */
+  /*                                                                       */
+  /*    FT_LOAD_TARGET_NORMAL                                              */
+  /*    FT_LOAD_TARGET_LIGHT                                               */
+  /*    FT_LOAD_TARGET_MONO                                                */
+  /*    FT_LOAD_TARGET_LCD                                                 */
+  /*    FT_LOAD_TARGET_LCD_V                                               */
+  /*                                                                       */
+  /*    FT_Render_Glyph                                                    */
+  /*    FT_Render_Mode                                                     */
+  /*    FT_Get_Kerning                                                     */
+  /*    FT_Kerning_Mode                                                    */
+  /*    FT_Get_Track_Kerning                                               */
+  /*    FT_Get_Glyph_Name                                                  */
+  /*    FT_Get_Postscript_Name                                             */
+  /*                                                                       */
+  /*    FT_CharMapRec                                                      */
+  /*    FT_Select_Charmap                                                  */
+  /*    FT_Set_Charmap                                                     */
+  /*    FT_Get_Charmap_Index                                               */
+  /*                                                                       */
+  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING                                    */
+  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING                             */
+  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING                              */
+  /*    FT_FSTYPE_EDITABLE_EMBEDDING                                       */
+  /*    FT_FSTYPE_NO_SUBSETTING                                            */
+  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY                                    */
+  /*                                                                       */
+  /*    FT_Get_FSType_Flags                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Glyph_Metrics                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model the metrics of a single glyph.  The      */
+  /*    values are expressed in 26.6 fractional pixel format; if the flag  */
+  /*    @FT_LOAD_NO_SCALE has been used while loading the glyph, values    */
+  /*    are expressed in font units instead.                               */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    width ::                                                           */
+  /*      The glyph's width.                                               */
+  /*                                                                       */
+  /*    height ::                                                          */
+  /*      The glyph's height.                                              */
+  /*                                                                       */
+  /*    horiBearingX ::                                                    */
+  /*      Left side bearing for horizontal layout.                         */
+  /*                                                                       */
+  /*    horiBearingY ::                                                    */
+  /*      Top side bearing for horizontal layout.                          */
+  /*                                                                       */
+  /*    horiAdvance ::                                                     */
+  /*      Advance width for horizontal layout.                             */
+  /*                                                                       */
+  /*    vertBearingX ::                                                    */
+  /*      Left side bearing for vertical layout.                           */
+  /*                                                                       */
+  /*    vertBearingY ::                                                    */
+  /*      Top side bearing for vertical layout.  Larger positive values    */
+  /*      mean further below the vertical glyph origin.                    */
+  /*                                                                       */
+  /*    vertAdvance ::                                                     */
+  /*      Advance height for vertical layout.  Positive values mean the    */
+  /*      glyph has a positive advance downward.                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If not disabled with @FT_LOAD_NO_HINTING, the values represent     */
+  /*    dimensions of the hinted glyph (in case hinting is applicable).    */
+  /*                                                                       */
+  /*    Stroking a glyph with an outside border does not increase          */
+  /*    `horiAdvance' or `vertAdvance'; you have to manually adjust these  */
+  /*    values to account for the added width and height.                  */
+  /*                                                                       */
+  typedef struct  FT_Glyph_Metrics_
+  {
+    FT_Pos  width;
+    FT_Pos  height;
+
+    FT_Pos  horiBearingX;
+    FT_Pos  horiBearingY;
+    FT_Pos  horiAdvance;
+
+    FT_Pos  vertBearingX;
+    FT_Pos  vertBearingY;
+    FT_Pos  vertAdvance;
+
+  } FT_Glyph_Metrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Bitmap_Size                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure models the metrics of a bitmap strike (i.e., a set  */
+  /*    of glyphs for a given point size and resolution) in a bitmap font. */
+  /*    It is used for the `available_sizes' field of @FT_Face.            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    height :: The vertical distance, in pixels, between two            */
+  /*              consecutive baselines.  It is always positive.           */
+  /*                                                                       */
+  /*    width  :: The average width, in pixels, of all glyphs in the       */
+  /*              strike.                                                  */
+  /*                                                                       */
+  /*    size   :: The nominal size of the strike in 26.6 fractional        */
+  /*              points.  This field is not very useful.                  */
+  /*                                                                       */
+  /*    x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional   */
+  /*              pixels.                                                  */
+  /*                                                                       */
+  /*    y_ppem :: The vertical ppem (nominal height) in 26.6 fractional    */
+  /*              pixels.                                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Windows FNT:                                                       */
+  /*      The nominal size given in a FNT font is not reliable.  Thus when */
+  /*      the driver finds it incorrect, it sets `size' to some calculated */
+  /*      values and sets `x_ppem' and `y_ppem' to the pixel width and     */
+  /*      height given in the font, respectively.                          */
+  /*                                                                       */
+  /*    TrueType embedded bitmaps:                                         */
+  /*      `size', `width', and `height' values are not contained in the    */
+  /*      bitmap strike itself.  They are computed from the global font    */
+  /*      parameters.                                                      */
+  /*                                                                       */
+  typedef struct  FT_Bitmap_Size_
+  {
+    FT_Short  height;
+    FT_Short  width;
+
+    FT_Pos    size;
+
+    FT_Pos    x_ppem;
+    FT_Pos    y_ppem;
+
+  } FT_Bitmap_Size;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /*                     O B J E C T   C L A S S E S                       */
+  /*                                                                       */
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Library                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a FreeType library instance.  Each `library' is        */
+  /*    completely independent from the others; it is the `root' of a set  */
+  /*    of objects like fonts, faces, sizes, etc.                          */
+  /*                                                                       */
+  /*    It also embeds a memory manager (see @FT_Memory), as well as a     */
+  /*    scan-line converter object (see @FT_Raster).                       */
+  /*                                                                       */
+  /*    In multi-threaded applications, make sure that the same FT_Library */
+  /*    object or any of its children doesn't get accessed in parallel.    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Library objects are normally created by @FT_Init_FreeType, and     */
+  /*    destroyed with @FT_Done_FreeType.  If you need reference-counting  */
+  /*    (cf. @FT_Reference_Library), use @FT_New_Library and               */
+  /*    @FT_Done_Library.                                                  */
+  /*                                                                       */
+  typedef struct FT_LibraryRec_  *FT_Library;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Module                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a given FreeType module object.  Each module can be a  */
+  /*    font driver, a renderer, or anything else that provides services   */
+  /*    to the formers.                                                    */
+  /*                                                                       */
+  typedef struct FT_ModuleRec_*  FT_Module;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Driver                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a given FreeType font driver object.  Each font driver */
+  /*    is a special module capable of creating faces from font files.     */
+  /*                                                                       */
+  typedef struct FT_DriverRec_*  FT_Driver;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Renderer                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a given FreeType renderer.  A renderer is a special    */
+  /*    module in charge of converting a glyph image to a bitmap, when     */
+  /*    necessary.  Each renderer supports a given glyph image format, and */
+  /*    one or more target surface depths.                                 */
+  /*                                                                       */
+  typedef struct FT_RendererRec_*  FT_Renderer;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Face                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a given typographic face object.  A face object models */
+  /*    a given typeface, in a given style.                                */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Each face object also owns a single @FT_GlyphSlot object, as well  */
+  /*    as one or more @FT_Size objects.                                   */
+  /*                                                                       */
+  /*    Use @FT_New_Face or @FT_Open_Face to create a new face object from */
+  /*    a given filepathname or a custom input stream.                     */
+  /*                                                                       */
+  /*    Use @FT_Done_Face to destroy it (along with its slot and sizes).   */
+  /*                                                                       */
+  /* <Also>                                                                */
+  /*    See @FT_FaceRec for the publicly accessible fields of a given face */
+  /*    object.                                                            */
+  /*                                                                       */
+  typedef struct FT_FaceRec_*  FT_Face;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Size                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an object used to model a face scaled to a given       */
+  /*    character size.                                                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Each @FT_Face has an _active_ @FT_Size object that is used by      */
+  /*    functions like @FT_Load_Glyph to determine the scaling             */
+  /*    transformation which is used to load and hint glyphs and metrics.  */
+  /*                                                                       */
+  /*    You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes,                */
+  /*    @FT_Request_Size or even @FT_Select_Size to change the content     */
+  /*    (i.e., the scaling values) of the active @FT_Size.                 */
+  /*                                                                       */
+  /*    You can use @FT_New_Size to create additional size objects for a   */
+  /*    given @FT_Face, but they won't be used by other functions until    */
+  /*    you activate it through @FT_Activate_Size.  Only one size can be   */
+  /*    activated at any given time per face.                              */
+  /*                                                                       */
+  /* <Also>                                                                */
+  /*    See @FT_SizeRec for the publicly accessible fields of a given size */
+  /*    object.                                                            */
+  /*                                                                       */
+  typedef struct FT_SizeRec_*  FT_Size;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_GlyphSlot                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a given `glyph slot'.  A slot is a container where it  */
+  /*    is possible to load any of the glyphs contained in its parent      */
+  /*    face.                                                              */
+  /*                                                                       */
+  /*    In other words, each time you call @FT_Load_Glyph or               */
+  /*    @FT_Load_Char, the slot's content is erased by the new glyph data, */
+  /*    i.e., the glyph's metrics, its image (bitmap or outline), and      */
+  /*    other control information.                                         */
+  /*                                                                       */
+  /* <Also>                                                                */
+  /*    See @FT_GlyphSlotRec for the publicly accessible glyph fields.     */
+  /*                                                                       */
+  typedef struct FT_GlyphSlotRec_*  FT_GlyphSlot;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_CharMap                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a given character map.  A charmap is used to translate */
+  /*    character codes in a given encoding into glyph indexes for its     */
+  /*    parent's face.  Some font formats may provide several charmaps per */
+  /*    font.                                                              */
+  /*                                                                       */
+  /*    Each face object owns zero or more charmaps, but only one of them  */
+  /*    can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char.   */
+  /*                                                                       */
+  /*    The list of available charmaps in a face is available through the  */
+  /*    `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec.   */
+  /*                                                                       */
+  /*    The currently active charmap is available as `face->charmap'.      */
+  /*    You should call @FT_Set_Charmap to change it.                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    When a new face is created (either through @FT_New_Face or         */
+  /*    @FT_Open_Face), the library looks for a Unicode charmap within     */
+  /*    the list and automatically activates it.                           */
+  /*                                                                       */
+  /* <Also>                                                                */
+  /*    See @FT_CharMapRec for the publicly accessible fields of a given   */
+  /*    character map.                                                     */
+  /*                                                                       */
+  typedef struct FT_CharMapRec_*  FT_CharMap;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_ENC_TAG                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro converts four-letter tags into an unsigned long.  It is */
+  /*    used to define `encoding' identifiers (see @FT_Encoding).          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */
+  /*    should redefine this macro in case of problems to something like   */
+  /*    this:                                                              */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      #define FT_ENC_TAG( value, a, b, c, d )  value                   */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    to get a simple enumeration without assigning special numbers.     */
+  /*                                                                       */
+
+#ifndef FT_ENC_TAG
+#define FT_ENC_TAG( value, a, b, c, d )         \
+          value = ( ( (FT_UInt32)(a) << 24 ) |  \
+                    ( (FT_UInt32)(b) << 16 ) |  \
+                    ( (FT_UInt32)(c) <<  8 ) |  \
+                      (FT_UInt32)(d)         )
+
+#endif /* FT_ENC_TAG */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Encoding                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration used to specify character sets supported by         */
+  /*    charmaps.  Used in the @FT_Select_Charmap API function.            */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Despite the name, this enumeration lists specific character        */
+  /*    repertories (i.e., charsets), and not text encoding methods (e.g., */
+  /*    UTF-8, UTF-16, etc.).                                              */
+  /*                                                                       */
+  /*    Other encodings might be defined in the future.                    */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_ENCODING_NONE ::                                                */
+  /*      The encoding value~0 is reserved.                                */
+  /*                                                                       */
+  /*    FT_ENCODING_UNICODE ::                                             */
+  /*      Corresponds to the Unicode character set.  This value covers     */
+  /*      all versions of the Unicode repertoire, including ASCII and      */
+  /*      Latin-1.  Most fonts include a Unicode charmap, but not all      */
+  /*      of them.                                                         */
+  /*                                                                       */
+  /*      For example, if you want to access Unicode value U+1F028 (and    */
+  /*      the font contains it), use value 0x1F028 as the input value for  */
+  /*      @FT_Get_Char_Index.                                              */
+  /*                                                                       */
+  /*    FT_ENCODING_MS_SYMBOL ::                                           */
+  /*      Corresponds to the Microsoft Symbol encoding, used to encode     */
+  /*      mathematical symbols in the 32..255 character code range.  For   */
+  /*      more information, see `http://www.ceviz.net/symbol.htm'.         */
+  /*                                                                       */
+  /*    FT_ENCODING_SJIS ::                                                */
+  /*      Corresponds to Japanese SJIS encoding.  More info at             */
+  /*      at `http://langsupport.japanreference.com/encoding.shtml'.       */
+  /*      See note on multi-byte encodings below.                          */
+  /*                                                                       */
+  /*    FT_ENCODING_GB2312 ::                                              */
+  /*      Corresponds to an encoding system for Simplified Chinese as used */
+  /*      used in mainland China.                                          */
+  /*                                                                       */
+  /*    FT_ENCODING_BIG5 ::                                                */
+  /*      Corresponds to an encoding system for Traditional Chinese as     */
+  /*      used in Taiwan and Hong Kong.                                    */
+  /*                                                                       */
+  /*    FT_ENCODING_WANSUNG ::                                             */
+  /*      Corresponds to the Korean encoding system known as Wansung.      */
+  /*      For more information see                                         */
+  /*      `http://www.microsoft.com/typography/unicode/949.txt'.           */
+  /*                                                                       */
+  /*    FT_ENCODING_JOHAB ::                                               */
+  /*      The Korean standard character set (KS~C 5601-1992), which        */
+  /*      corresponds to MS Windows code page 1361.  This character set    */
+  /*      includes all possible Hangeul character combinations.            */
+  /*                                                                       */
+  /*    FT_ENCODING_ADOBE_LATIN_1 ::                                       */
+  /*      Corresponds to a Latin-1 encoding as defined in a Type~1         */
+  /*      PostScript font.  It is limited to 256 character codes.          */
+  /*                                                                       */
+  /*    FT_ENCODING_ADOBE_STANDARD ::                                      */
+  /*      Corresponds to the Adobe Standard encoding, as found in Type~1,  */
+  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */
+  /*      codes.                                                           */
+  /*                                                                       */
+  /*    FT_ENCODING_ADOBE_EXPERT ::                                        */
+  /*      Corresponds to the Adobe Expert encoding, as found in Type~1,    */
+  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */
+  /*      codes.                                                           */
+  /*                                                                       */
+  /*    FT_ENCODING_ADOBE_CUSTOM ::                                        */
+  /*      Corresponds to a custom encoding, as found in Type~1, CFF, and   */
+  /*      OpenType/CFF fonts.  It is limited to 256 character codes.       */
+  /*                                                                       */
+  /*    FT_ENCODING_APPLE_ROMAN ::                                         */
+  /*      Corresponds to the 8-bit Apple roman encoding.  Many TrueType    */
+  /*      and OpenType fonts contain a charmap for this encoding, since    */
+  /*      older versions of Mac OS are able to use it.                     */
+  /*                                                                       */
+  /*    FT_ENCODING_OLD_LATIN_2 ::                                         */
+  /*      This value is deprecated and was never used nor reported by      */
+  /*      FreeType.  Don't use or test for it.                             */
+  /*                                                                       */
+  /*    FT_ENCODING_MS_SJIS ::                                             */
+  /*      Same as FT_ENCODING_SJIS.  Deprecated.                           */
+  /*                                                                       */
+  /*    FT_ENCODING_MS_GB2312 ::                                           */
+  /*      Same as FT_ENCODING_GB2312.  Deprecated.                         */
+  /*                                                                       */
+  /*    FT_ENCODING_MS_BIG5 ::                                             */
+  /*      Same as FT_ENCODING_BIG5.  Deprecated.                           */
+  /*                                                                       */
+  /*    FT_ENCODING_MS_WANSUNG ::                                          */
+  /*      Same as FT_ENCODING_WANSUNG.  Deprecated.                        */
+  /*                                                                       */
+  /*    FT_ENCODING_MS_JOHAB ::                                            */
+  /*      Same as FT_ENCODING_JOHAB.  Deprecated.                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    By default, FreeType automatically synthesizes a Unicode charmap   */
+  /*    for PostScript fonts, using their glyph names dictionaries.        */
+  /*    However, it also reports the encodings defined explicitly in the   */
+  /*    font file, for the cases when they are needed, with the Adobe      */
+  /*    values as well.                                                    */
+  /*                                                                       */
+  /*    FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap  */
+  /*    is neither Unicode nor ISO-8859-1 (otherwise it is set to          */
+  /*    FT_ENCODING_UNICODE).  Use @FT_Get_BDF_Charset_ID to find out      */
+  /*    which encoding is really present.  If, for example, the            */
+  /*    `cs_registry' field is `KOI8' and the `cs_encoding' field is `R',  */
+  /*    the font is encoded in KOI8-R.                                     */
+  /*                                                                       */
+  /*    FT_ENCODING_NONE is always set (with a single exception) by the    */
+  /*    winfonts driver.  Use @FT_Get_WinFNT_Header and examine the        */
+  /*    `charset' field of the @FT_WinFNT_HeaderRec structure to find out  */
+  /*    which encoding is really present.  For example,                    */
+  /*    @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for       */
+  /*    Russian).                                                          */
+  /*                                                                       */
+  /*    FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */
+  /*    and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to  */
+  /*    FT_ENCODING_APPLE_ROMAN).                                          */
+  /*                                                                       */
+  /*    If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function       */
+  /*    @FT_Get_CMap_Language_ID  to query the Mac language ID which may   */
+  /*    be needed to be able to distinguish Apple encoding variants.  See  */
+  /*                                                                       */
+  /*      http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT  */
+  /*                                                                       */
+  /*    to get an idea how to do that.  Basically, if the language ID      */
+  /*    is~0, don't use it, otherwise subtract 1 from the language ID.     */
+  /*    Then examine `encoding_id'.  If, for example, `encoding_id' is     */
+  /*    @TT_MAC_ID_ROMAN and the language ID (minus~1) is                  */
+  /*    `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman.        */
+  /*    @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi       */
+  /*    variant the Arabic encoding.                                       */
+  /*                                                                       */
+  typedef enum  FT_Encoding_
+  {
+    FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),
+
+    FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),
+    FT_ENC_TAG( FT_ENCODING_UNICODE,   'u', 'n', 'i', 'c' ),
+
+    FT_ENC_TAG( FT_ENCODING_SJIS,    's', 'j', 'i', 's' ),
+    FT_ENC_TAG( FT_ENCODING_GB2312,  'g', 'b', ' ', ' ' ),
+    FT_ENC_TAG( FT_ENCODING_BIG5,    'b', 'i', 'g', '5' ),
+    FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),
+    FT_ENC_TAG( FT_ENCODING_JOHAB,   'j', 'o', 'h', 'a' ),
+
+    /* for backwards compatibility */
+    FT_ENCODING_MS_SJIS    = FT_ENCODING_SJIS,
+    FT_ENCODING_MS_GB2312  = FT_ENCODING_GB2312,
+    FT_ENCODING_MS_BIG5    = FT_ENCODING_BIG5,
+    FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,
+    FT_ENCODING_MS_JOHAB   = FT_ENCODING_JOHAB,
+
+    FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),
+    FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT,   'A', 'D', 'B', 'E' ),
+    FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM,   'A', 'D', 'B', 'C' ),
+    FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1,  'l', 'a', 't', '1' ),
+
+    FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),
+
+    FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )
+
+  } FT_Encoding;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_encoding_xxx                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    These constants are deprecated; use the corresponding @FT_Encoding */
+  /*    values instead.                                                    */
+  /*                                                                       */
+#define ft_encoding_none            FT_ENCODING_NONE
+#define ft_encoding_unicode         FT_ENCODING_UNICODE
+#define ft_encoding_symbol          FT_ENCODING_MS_SYMBOL
+#define ft_encoding_latin_1         FT_ENCODING_ADOBE_LATIN_1
+#define ft_encoding_latin_2         FT_ENCODING_OLD_LATIN_2
+#define ft_encoding_sjis            FT_ENCODING_SJIS
+#define ft_encoding_gb2312          FT_ENCODING_GB2312
+#define ft_encoding_big5            FT_ENCODING_BIG5
+#define ft_encoding_wansung         FT_ENCODING_WANSUNG
+#define ft_encoding_johab           FT_ENCODING_JOHAB
+
+#define ft_encoding_adobe_standard  FT_ENCODING_ADOBE_STANDARD
+#define ft_encoding_adobe_expert    FT_ENCODING_ADOBE_EXPERT
+#define ft_encoding_adobe_custom    FT_ENCODING_ADOBE_CUSTOM
+#define ft_encoding_apple_roman     FT_ENCODING_APPLE_ROMAN
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_CharMapRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The base charmap structure.                                        */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    face        :: A handle to the parent face object.                 */
+  /*                                                                       */
+  /*    encoding    :: An @FT_Encoding tag identifying the charmap.  Use   */
+  /*                   this with @FT_Select_Charmap.                       */
+  /*                                                                       */
+  /*    platform_id :: An ID number describing the platform for the        */
+  /*                   following encoding ID.  This comes directly from    */
+  /*                   the TrueType specification and should be emulated   */
+  /*                   for other formats.                                  */
+  /*                                                                       */
+  /*    encoding_id :: A platform specific encoding number.  This also     */
+  /*                   comes from the TrueType specification and should be */
+  /*                   emulated similarly.                                 */
+  /*                                                                       */
+  typedef struct  FT_CharMapRec_
+  {
+    FT_Face      face;
+    FT_Encoding  encoding;
+    FT_UShort    platform_id;
+    FT_UShort    encoding_id;
+
+  } FT_CharMapRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /*                 B A S E   O B J E C T   C L A S S E S                 */
+  /*                                                                       */
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Face_Internal                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An opaque handle to an `FT_Face_InternalRec' structure, used to    */
+  /*    model private data of a given @FT_Face object.                     */
+  /*                                                                       */
+  /*    This structure might change between releases of FreeType~2 and is  */
+  /*    not generally available to client applications.                    */
+  /*                                                                       */
+  typedef struct FT_Face_InternalRec_*  FT_Face_Internal;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_FaceRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FreeType root face class structure.  A face object models a        */
+  /*    typeface in a font file.                                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_faces           :: The number of faces in the font file.  Some */
+  /*                           font formats can have multiple faces in     */
+  /*                           a font file.                                */
+  /*                                                                       */
+  /*    face_index          :: The index of the face in the font file.  It */
+  /*                           is set to~0 if there is only one face in    */
+  /*                           the font file.                              */
+  /*                                                                       */
+  /*    face_flags          :: A set of bit flags that give important      */
+  /*                           information about the face; see             */
+  /*                           @FT_FACE_FLAG_XXX for the details.          */
+  /*                                                                       */
+  /*    style_flags         :: A set of bit flags indicating the style of  */
+  /*                           the face; see @FT_STYLE_FLAG_XXX for the    */
+  /*                           details.                                    */
+  /*                                                                       */
+  /*    num_glyphs          :: The number of glyphs in the face.  If the   */
+  /*                           face is scalable and has sbits (see         */
+  /*                           `num_fixed_sizes'), it is set to the number */
+  /*                           of outline glyphs.                          */
+  /*                                                                       */
+  /*                           For CID-keyed fonts, this value gives the   */
+  /*                           highest CID used in the font.               */
+  /*                                                                       */
+  /*    family_name         :: The face's family name.  This is an ASCII   */
+  /*                           string, usually in English, which describes */
+  /*                           the typeface's family (like `Times New      */
+  /*                           Roman', `Bodoni', `Garamond', etc).  This   */
+  /*                           is a least common denominator used to list  */
+  /*                           fonts.  Some formats (TrueType & OpenType)  */
+  /*                           provide localized and Unicode versions of   */
+  /*                           this string.  Applications should use the   */
+  /*                           format specific interface to access them.   */
+  /*                           Can be NULL (e.g., in fonts embedded in a   */
+  /*                           PDF file).                                  */
+  /*                                                                       */
+  /*    style_name          :: The face's style name.  This is an ASCII    */
+  /*                           string, usually in English, which describes */
+  /*                           the typeface's style (like `Italic',        */
+  /*                           `Bold', `Condensed', etc).  Not all font    */
+  /*                           formats provide a style name, so this field */
+  /*                           is optional, and can be set to NULL.  As    */
+  /*                           for `family_name', some formats provide     */
+  /*                           localized and Unicode versions of this      */
+  /*                           string.  Applications should use the format */
+  /*                           specific interface to access them.          */
+  /*                                                                       */
+  /*    num_fixed_sizes     :: The number of bitmap strikes in the face.   */
+  /*                           Even if the face is scalable, there might   */
+  /*                           still be bitmap strikes, which are called   */
+  /*                           `sbits' in that case.                       */
+  /*                                                                       */
+  /*    available_sizes     :: An array of @FT_Bitmap_Size for all bitmap  */
+  /*                           strikes in the face.  It is set to NULL if  */
+  /*                           there is no bitmap strike.                  */
+  /*                                                                       */
+  /*    num_charmaps        :: The number of charmaps in the face.         */
+  /*                                                                       */
+  /*    charmaps            :: An array of the charmaps of the face.       */
+  /*                                                                       */
+  /*    generic             :: A field reserved for client uses.  See the  */
+  /*                           @FT_Generic type description.               */
+  /*                                                                       */
+  /*    bbox                :: The font bounding box.  Coordinates are     */
+  /*                           expressed in font units (see                */
+  /*                           `units_per_EM').  The box is large enough   */
+  /*                           to contain any glyph from the font.  Thus,  */
+  /*                           `bbox.yMax' can be seen as the `maximum     */
+  /*                           ascender', and `bbox.yMin' as the `minimum  */
+  /*                           descender'.  Only relevant for scalable     */
+  /*                           formats.                                    */
+  /*                                                                       */
+  /*                           Note that the bounding box might be off by  */
+  /*                           (at least) one pixel for hinted fonts.  See */
+  /*                           @FT_Size_Metrics for further discussion.    */
+  /*                                                                       */
+  /*    units_per_EM        :: The number of font units per EM square for  */
+  /*                           this face.  This is typically 2048 for      */
+  /*                           TrueType fonts, and 1000 for Type~1 fonts.  */
+  /*                           Only relevant for scalable formats.         */
+  /*                                                                       */
+  /*    ascender            :: The typographic ascender of the face,       */
+  /*                           expressed in font units.  For font formats  */
+  /*                           not having this information, it is set to   */
+  /*                           `bbox.yMax'.  Only relevant for scalable    */
+  /*                           formats.                                    */
+  /*                                                                       */
+  /*    descender           :: The typographic descender of the face,      */
+  /*                           expressed in font units.  For font formats  */
+  /*                           not having this information, it is set to   */
+  /*                           `bbox.yMin'.  Note that this field is       */
+  /*                           usually negative.  Only relevant for        */
+  /*                           scalable formats.                           */
+  /*                                                                       */
+  /*    height              :: This value is the vertical distance         */
+  /*                           between two consecutive baselines,          */
+  /*                           expressed in font units.  It is always      */
+  /*                           positive.  Only relevant for scalable       */
+  /*                           formats.                                    */
+  /*                                                                       */
+  /*                           If you want the global glyph height, use    */
+  /*                           `ascender - descender'.                     */
+  /*                                                                       */
+  /*    max_advance_width   :: The maximum advance width, in font units,   */
+  /*                           for all glyphs in this face.  This can be   */
+  /*                           used to make word wrapping computations     */
+  /*                           faster.  Only relevant for scalable         */
+  /*                           formats.                                    */
+  /*                                                                       */
+  /*    max_advance_height  :: The maximum advance height, in font units,  */
+  /*                           for all glyphs in this face.  This is only  */
+  /*                           relevant for vertical layouts, and is set   */
+  /*                           to `height' for fonts that do not provide   */
+  /*                           vertical metrics.  Only relevant for        */
+  /*                           scalable formats.                           */
+  /*                                                                       */
+  /*    underline_position  :: The position, in font units, of the         */
+  /*                           underline line for this face.  It is the    */
+  /*                           center of the underlining stem.  Only       */
+  /*                           relevant for scalable formats.              */
+  /*                                                                       */
+  /*    underline_thickness :: The thickness, in font units, of the        */
+  /*                           underline for this face.  Only relevant for */
+  /*                           scalable formats.                           */
+  /*                                                                       */
+  /*    glyph               :: The face's associated glyph slot(s).        */
+  /*                                                                       */
+  /*    size                :: The current active size for this face.      */
+  /*                                                                       */
+  /*    charmap             :: The current active charmap for this face.   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Fields may be changed after a call to @FT_Attach_File or           */
+  /*    @FT_Attach_Stream.                                                 */
+  /*                                                                       */
+  typedef struct  FT_FaceRec_
+  {
+    FT_Long           num_faces;
+    FT_Long           face_index;
+
+    FT_Long           face_flags;
+    FT_Long           style_flags;
+
+    FT_Long           num_glyphs;
+
+    FT_String*        family_name;
+    FT_String*        style_name;
+
+    FT_Int            num_fixed_sizes;
+    FT_Bitmap_Size*   available_sizes;
+
+    FT_Int            num_charmaps;
+    FT_CharMap*       charmaps;
+
+#ifdef	_FX_MANAGED_CODE_
+#define generic		generic_data
+#endif
+
+    FT_Generic        generic;
+
+    /*# The following member variables (down to `underline_thickness') */
+    /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size    */
+    /*# for bitmap fonts.                                              */
+    FT_BBox           bbox;
+
+    FT_UShort         units_per_EM;
+    FT_Short          ascender;
+    FT_Short          descender;
+    FT_Short          height;
+
+    FT_Short          max_advance_width;
+    FT_Short          max_advance_height;
+
+    FT_Short          underline_position;
+    FT_Short          underline_thickness;
+
+    FT_GlyphSlot      glyph;
+    FT_Size           size;
+    FT_CharMap        charmap;
+
+    /*@private begin */
+
+    FT_Driver         driver;
+    FT_Memory         memory;
+    FT_Stream         stream;
+
+    FT_ListRec        sizes_list;
+
+    FT_Generic        autohint;   /* face-specific auto-hinter data */
+    void*             extensions; /* unused                         */
+
+    FT_Face_Internal  internal;
+
+    /*@private end */
+
+  } FT_FaceRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_FACE_FLAG_XXX                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit flags used in the `face_flags' field of the          */
+  /*    @FT_FaceRec structure.  They inform client applications of         */
+  /*    properties of the corresponding face.                              */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_FACE_FLAG_SCALABLE ::                                           */
+  /*      Indicates that the face contains outline glyphs.  This doesn't   */
+  /*      prevent bitmap strikes, i.e., a face can have both this and      */
+  /*      and @FT_FACE_FLAG_FIXED_SIZES set.                               */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_FIXED_SIZES ::                                        */
+  /*      Indicates that the face contains bitmap strikes.  See also the   */
+  /*      `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec.   */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_FIXED_WIDTH ::                                        */
+  /*      Indicates that the face contains fixed-width characters (like    */
+  /*      Courier, Lucido, MonoType, etc.).                                */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_SFNT ::                                               */
+  /*      Indicates that the face uses the `sfnt' storage scheme.  For     */
+  /*      now, this means TrueType and OpenType.                           */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_HORIZONTAL ::                                         */
+  /*      Indicates that the face contains horizontal glyph metrics.  This */
+  /*      should be set for all common formats.                            */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_VERTICAL ::                                           */
+  /*      Indicates that the face contains vertical glyph metrics.  This   */
+  /*      is only available in some formats, not all of them.              */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_KERNING ::                                            */
+  /*      Indicates that the face contains kerning information.  If set,   */
+  /*      the kerning distance can be retrieved through the function       */
+  /*      @FT_Get_Kerning.  Otherwise the function always return the       */
+  /*      vector (0,0).  Note that FreeType doesn't handle kerning data    */
+  /*      from the `GPOS' table (as present in some OpenType fonts).       */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_FAST_GLYPHS ::                                        */
+  /*      THIS FLAG IS DEPRECATED.  DO NOT USE OR TEST IT.                 */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_MULTIPLE_MASTERS ::                                   */
+  /*      Indicates that the font contains multiple masters and is capable */
+  /*      of interpolating between them.  See the multiple-masters         */
+  /*      specific API for details.                                        */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_GLYPH_NAMES ::                                        */
+  /*      Indicates that the font contains glyph names that can be         */
+  /*      retrieved through @FT_Get_Glyph_Name.  Note that some TrueType   */
+  /*      fonts contain broken glyph name tables.  Use the function        */
+  /*      @FT_Has_PS_Glyph_Names when needed.                              */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_EXTERNAL_STREAM ::                                    */
+  /*      Used internally by FreeType to indicate that a face's stream was */
+  /*      provided by the client application and should not be destroyed   */
+  /*      when @FT_Done_Face is called.  Don't read or test this flag.     */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_HINTER ::                                             */
+  /*      Set if the font driver has a hinting machine of its own.  For    */
+  /*      example, with TrueType fonts, it makes sense to use data from    */
+  /*      the SFNT `gasp' table only if the native TrueType hinting engine */
+  /*      (with the bytecode interpreter) is available and active.         */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_CID_KEYED ::                                          */
+  /*      Set if the font is CID-keyed.  In that case, the font is not     */
+  /*      accessed by glyph indices but by CID values.  For subsetted      */
+  /*      CID-keyed fonts this has the consequence that not all index      */
+  /*      values are a valid argument to FT_Load_Glyph.  Only the CID      */
+  /*      values for which corresponding glyphs in the subsetted font      */
+  /*      exist make FT_Load_Glyph return successfully; in all other cases */
+  /*      you get an `FT_Err_Invalid_Argument' error.                      */
+  /*                                                                       */
+  /*      Note that CID-keyed fonts which are in an SFNT wrapper don't     */
+  /*      have this flag set since the glyphs are accessed in the normal   */
+  /*      way (using contiguous indices); the `CID-ness' isn't visible to  */
+  /*      the application.                                                 */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_TRICKY ::                                             */
+  /*      Set if the font is `tricky', this is, it always needs the        */
+  /*      font format's native hinting engine to get a reasonable result.  */
+  /*      A typical example is the Chinese font `mingli.ttf' which uses    */
+  /*      TrueType bytecode instructions to move and scale all of its      */
+  /*      subglyphs.                                                       */
+  /*                                                                       */
+  /*      It is not possible to autohint such fonts using                  */
+  /*      @FT_LOAD_FORCE_AUTOHINT; it will also ignore                     */
+  /*      @FT_LOAD_NO_HINTING.  You have to set both @FT_LOAD_NO_HINTING   */
+  /*      and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */
+  /*      probably never want this except for demonstration purposes.      */
+  /*                                                                       */
+  /*      Currently, there are about a dozen TrueType fonts in the list of */
+  /*      tricky fonts; they are hard-coded in file `ttobjs.c'.            */
+  /*                                                                       */
+#define FT_FACE_FLAG_SCALABLE          ( 1L <<  0 )
+#define FT_FACE_FLAG_FIXED_SIZES       ( 1L <<  1 )
+#define FT_FACE_FLAG_FIXED_WIDTH       ( 1L <<  2 )
+#define FT_FACE_FLAG_SFNT              ( 1L <<  3 )
+#define FT_FACE_FLAG_HORIZONTAL        ( 1L <<  4 )
+#define FT_FACE_FLAG_VERTICAL          ( 1L <<  5 )
+#define FT_FACE_FLAG_KERNING           ( 1L <<  6 )
+#define FT_FACE_FLAG_FAST_GLYPHS       ( 1L <<  7 )
+#define FT_FACE_FLAG_MULTIPLE_MASTERS  ( 1L <<  8 )
+#define FT_FACE_FLAG_GLYPH_NAMES       ( 1L <<  9 )
+#define FT_FACE_FLAG_EXTERNAL_STREAM   ( 1L << 10 )
+#define FT_FACE_FLAG_HINTER            ( 1L << 11 )
+#define FT_FACE_FLAG_CID_KEYED         ( 1L << 12 )
+#define FT_FACE_FLAG_TRICKY            ( 1L << 13 )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_HORIZONTAL( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains
+   *   horizontal metrics (this is true for all font formats though).
+   *
+   * @also:
+   *   @FT_HAS_VERTICAL can be used to check for vertical metrics.
+   *
+   */
+#define FT_HAS_HORIZONTAL( face ) \
+          ( face->face_flags & FT_FACE_FLAG_HORIZONTAL )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_VERTICAL( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains real
+   *   vertical metrics (and not only synthesized ones).
+   *
+   */
+#define FT_HAS_VERTICAL( face ) \
+          ( face->face_flags & FT_FACE_FLAG_VERTICAL )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_KERNING( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains kerning
+   *   data that can be accessed with @FT_Get_Kerning.
+   *
+   */
+#define FT_HAS_KERNING( face ) \
+          ( face->face_flags & FT_FACE_FLAG_KERNING )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IS_SCALABLE( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains a scalable
+   *   font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF,
+   *   and PFR font formats.
+   *
+   */
+#define FT_IS_SCALABLE( face ) \
+          ( face->face_flags & FT_FACE_FLAG_SCALABLE )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IS_SFNT( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains a font
+   *   whose format is based on the SFNT storage scheme.  This usually
+   *   means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded
+   *   bitmap fonts.
+   *
+   *   If this macro is true, all functions defined in @FT_SFNT_NAMES_H and
+   *   @FT_TRUETYPE_TABLES_H are available.
+   *
+   */
+#define FT_IS_SFNT( face ) \
+          ( face->face_flags & FT_FACE_FLAG_SFNT )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IS_FIXED_WIDTH( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains a font face
+   *   that contains fixed-width (or `monospace', `fixed-pitch', etc.)
+   *   glyphs.
+   *
+   */
+#define FT_IS_FIXED_WIDTH( face ) \
+          ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_FIXED_SIZES( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains some
+   *   embedded bitmaps.  See the `available_sizes' field of the
+   *   @FT_FaceRec structure.
+   *
+   */
+#define FT_HAS_FIXED_SIZES( face ) \
+          ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_FAST_GLYPHS( face )
+   *
+   * @description:
+   *   Deprecated.
+   *
+   */
+#define FT_HAS_FAST_GLYPHS( face )  0
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_GLYPH_NAMES( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains some glyph
+   *   names that can be accessed through @FT_Get_Glyph_Name.
+   *
+   */
+#define FT_HAS_GLYPH_NAMES( face ) \
+          ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_MULTIPLE_MASTERS( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains some
+   *   multiple masters.  The functions provided by @FT_MULTIPLE_MASTERS_H
+   *   are then available to choose the exact design you want.
+   *
+   */
+#define FT_HAS_MULTIPLE_MASTERS( face ) \
+          ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IS_CID_KEYED( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains a CID-keyed
+   *   font.  See the discussion of @FT_FACE_FLAG_CID_KEYED for more
+   *   details.
+   *
+   *   If this macro is true, all functions defined in @FT_CID_H are
+   *   available.
+   *
+   */
+#define FT_IS_CID_KEYED( face ) \
+          ( face->face_flags & FT_FACE_FLAG_CID_KEYED )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IS_TRICKY( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face represents a `tricky' font.
+   *   See the discussion of @FT_FACE_FLAG_TRICKY for more details.
+   *
+   */
+#define FT_IS_TRICKY( face ) \
+          ( face->face_flags & FT_FACE_FLAG_TRICKY )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Const>                                                               */
+  /*    FT_STYLE_FLAG_XXX                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit-flags used to indicate the style of a given face.    */
+  /*    These are used in the `style_flags' field of @FT_FaceRec.          */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_STYLE_FLAG_ITALIC ::                                            */
+  /*      Indicates that a given face style is italic or oblique.          */
+  /*                                                                       */
+  /*    FT_STYLE_FLAG_BOLD ::                                              */
+  /*      Indicates that a given face is bold.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The style information as provided by FreeType is very basic.  More */
+  /*    details are beyond the scope and should be done on a higher level  */
+  /*    (for example, by analyzing various fields of the `OS/2' table in   */
+  /*    SFNT based fonts).                                                 */
+  /*                                                                       */
+#define FT_STYLE_FLAG_ITALIC  ( 1 << 0 )
+#define FT_STYLE_FLAG_BOLD    ( 1 << 1 )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Size_Internal                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An opaque handle to an `FT_Size_InternalRec' structure, used to    */
+  /*    model private data of a given @FT_Size object.                     */
+  /*                                                                       */
+  typedef struct FT_Size_InternalRec_*  FT_Size_Internal;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Size_Metrics                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The size metrics structure gives the metrics of a size object.     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    x_ppem       :: The width of the scaled EM square in pixels, hence */
+  /*                    the term `ppem' (pixels per EM).  It is also       */
+  /*                    referred to as `nominal width'.                    */
+  /*                                                                       */
+  /*    y_ppem       :: The height of the scaled EM square in pixels,      */
+  /*                    hence the term `ppem' (pixels per EM).  It is also */
+  /*                    referred to as `nominal height'.                   */
+  /*                                                                       */
+  /*    x_scale      :: A 16.16 fractional scaling value used to convert   */
+  /*                    horizontal metrics from font units to 26.6         */
+  /*                    fractional pixels.  Only relevant for scalable     */
+  /*                    font formats.                                      */
+  /*                                                                       */
+  /*    y_scale      :: A 16.16 fractional scaling value used to convert   */
+  /*                    vertical metrics from font units to 26.6           */
+  /*                    fractional pixels.  Only relevant for scalable     */
+  /*                    font formats.                                      */
+  /*                                                                       */
+  /*    ascender     :: The ascender in 26.6 fractional pixels.  See       */
+  /*                    @FT_FaceRec for the details.                       */
+  /*                                                                       */
+  /*    descender    :: The descender in 26.6 fractional pixels.  See      */
+  /*                    @FT_FaceRec for the details.                       */
+  /*                                                                       */
+  /*    height       :: The height in 26.6 fractional pixels.  See         */
+  /*                    @FT_FaceRec for the details.                       */
+  /*                                                                       */
+  /*    max_advance  :: The maximum advance width in 26.6 fractional       */
+  /*                    pixels.  See @FT_FaceRec for the details.          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The scaling values, if relevant, are determined first during a     */
+  /*    size changing operation.  The remaining fields are then set by the */
+  /*    driver.  For scalable formats, they are usually set to scaled      */
+  /*    values of the corresponding fields in @FT_FaceRec.                 */
+  /*                                                                       */
+  /*    Note that due to glyph hinting, these values might not be exact    */
+  /*    for certain fonts.  Thus they must be treated as unreliable        */
+  /*    with an error margin of at least one pixel!                        */
+  /*                                                                       */
+  /*    Indeed, the only way to get the exact metrics is to render _all_   */
+  /*    glyphs.  As this would be a definite performance hit, it is up to  */
+  /*    client applications to perform such computations.                  */
+  /*                                                                       */
+  /*    The FT_Size_Metrics structure is valid for bitmap fonts also.      */
+  /*                                                                       */
+  typedef struct  FT_Size_Metrics_
+  {
+    FT_UShort  x_ppem;      /* horizontal pixels per EM               */
+    FT_UShort  y_ppem;      /* vertical pixels per EM                 */
+
+    FT_Fixed   x_scale;     /* scaling values used to convert font    */
+    FT_Fixed   y_scale;     /* units to 26.6 fractional pixels        */
+
+    FT_Pos     ascender;    /* ascender in 26.6 frac. pixels          */
+    FT_Pos     descender;   /* descender in 26.6 frac. pixels         */
+    FT_Pos     height;      /* text height in 26.6 frac. pixels       */
+    FT_Pos     max_advance; /* max horizontal advance, in 26.6 pixels */
+
+  } FT_Size_Metrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_SizeRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FreeType root size class structure.  A size object models a face   */
+  /*    object at a given size.                                            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    face    :: Handle to the parent face object.                       */
+  /*                                                                       */
+  /*    generic :: A typeless pointer, which is unused by the FreeType     */
+  /*               library or any of its drivers.  It can be used by       */
+  /*               client applications to link their own data to each size */
+  /*               object.                                                 */
+  /*                                                                       */
+  /*    metrics :: Metrics for this size object.  This field is read-only. */
+  /*                                                                       */
+  typedef struct  FT_SizeRec_
+  {
+    FT_Face           face;      /* parent face object              */
+    FT_Generic        generic;   /* generic pointer for client uses */
+    FT_Size_Metrics   metrics;   /* size metrics                    */
+    FT_Size_Internal  internal;
+
+  } FT_SizeRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_SubGlyph                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The subglyph structure is an internal object used to describe      */
+  /*    subglyphs (for example, in the case of composites).                */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The subglyph implementation is not part of the high-level API,     */
+  /*    hence the forward structure declaration.                           */
+  /*                                                                       */
+  /*    You can however retrieve subglyph information with                 */
+  /*    @FT_Get_SubGlyph_Info.                                             */
+  /*                                                                       */
+  typedef struct FT_SubGlyphRec_*  FT_SubGlyph;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Slot_Internal                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An opaque handle to an `FT_Slot_InternalRec' structure, used to    */
+  /*    model private data of a given @FT_GlyphSlot object.                */
+  /*                                                                       */
+  typedef struct FT_Slot_InternalRec_*  FT_Slot_Internal;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_GlyphSlotRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FreeType root glyph slot class structure.  A glyph slot is a       */
+  /*    container where individual glyphs can be loaded, be they in        */
+  /*    outline or bitmap format.                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    library           :: A handle to the FreeType library instance     */
+  /*                         this slot belongs to.                         */
+  /*                                                                       */
+  /*    face              :: A handle to the parent face object.           */
+  /*                                                                       */
+  /*    next              :: In some cases (like some font tools), several */
+  /*                         glyph slots per face object can be a good     */
+  /*                         thing.  As this is rare, the glyph slots are  */
+  /*                         listed through a direct, single-linked list   */
+  /*                         using its `next' field.                       */
+  /*                                                                       */
+  /*    generic           :: A typeless pointer which is unused by the     */
+  /*                         FreeType library or any of its drivers.  It   */
+  /*                         can be used by client applications to link    */
+  /*                         their own data to each glyph slot object.     */
+  /*                                                                       */
+  /*    metrics           :: The metrics of the last loaded glyph in the   */
+  /*                         slot.  The returned values depend on the last */
+  /*                         load flags (see the @FT_Load_Glyph API        */
+  /*                         function) and can be expressed either in 26.6 */
+  /*                         fractional pixels or font units.              */
+  /*                                                                       */
+  /*                         Note that even when the glyph image is        */
+  /*                         transformed, the metrics are not.             */
+  /*                                                                       */
+  /*    linearHoriAdvance :: The advance width of the unhinted glyph.      */
+  /*                         Its value is expressed in 16.16 fractional    */
+  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */
+  /*                         when loading the glyph.  This field can be    */
+  /*                         important to perform correct WYSIWYG layout.  */
+  /*                         Only relevant for outline glyphs.             */
+  /*                                                                       */
+  /*    linearVertAdvance :: The advance height of the unhinted glyph.     */
+  /*                         Its value is expressed in 16.16 fractional    */
+  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */
+  /*                         when loading the glyph.  This field can be    */
+  /*                         important to perform correct WYSIWYG layout.  */
+  /*                         Only relevant for outline glyphs.             */
+  /*                                                                       */
+  /*    advance           :: This shorthand is, depending on               */
+  /*                         @FT_LOAD_IGNORE_TRANSFORM, the transformed    */
+  /*                         advance width for the glyph (in 26.6          */
+  /*                         fractional pixel format).  As specified with  */
+  /*                         @FT_LOAD_VERTICAL_LAYOUT, it uses either the  */
+  /*                         `horiAdvance' or the `vertAdvance' value of   */
+  /*                         `metrics' field.                              */
+  /*                                                                       */
+  /*    format            :: This field indicates the format of the image  */
+  /*                         contained in the glyph slot.  Typically       */
+  /*                         @FT_GLYPH_FORMAT_BITMAP,                      */
+  /*                         @FT_GLYPH_FORMAT_OUTLINE, or                  */
+  /*                         @FT_GLYPH_FORMAT_COMPOSITE, but others are    */
+  /*                         possible.                                     */
+  /*                                                                       */
+  /*    bitmap            :: This field is used as a bitmap descriptor     */
+  /*                         when the slot format is                       */
+  /*                         @FT_GLYPH_FORMAT_BITMAP.  Note that the       */
+  /*                         address and content of the bitmap buffer can  */
+  /*                         change between calls of @FT_Load_Glyph and a  */
+  /*                         few other functions.                          */
+  /*                                                                       */
+  /*    bitmap_left       :: This is the bitmap's left bearing expressed   */
+  /*                         in integer pixels.  Of course, this is only   */
+  /*                         valid if the format is                        */
+  /*                         @FT_GLYPH_FORMAT_BITMAP.                      */
+  /*                                                                       */
+  /*    bitmap_top        :: This is the bitmap's top bearing expressed in */
+  /*                         integer pixels.  Remember that this is the    */
+  /*                         distance from the baseline to the top-most    */
+  /*                         glyph scanline, upwards y~coordinates being   */
+  /*                         *positive*.                                   */
+  /*                                                                       */
+  /*    outline           :: The outline descriptor for the current glyph  */
+  /*                         image if its format is                        */
+  /*                         @FT_GLYPH_FORMAT_OUTLINE.  Once a glyph is    */
+  /*                         loaded, `outline' can be transformed,         */
+  /*                         distorted, embolded, etc.  However, it must   */
+  /*                         not be freed.                                 */
+  /*                                                                       */
+  /*    num_subglyphs     :: The number of subglyphs in a composite glyph. */
+  /*                         This field is only valid for the composite    */
+  /*                         glyph format that should normally only be     */
+  /*                         loaded with the @FT_LOAD_NO_RECURSE flag.     */
+  /*                         For now this is internal to FreeType.         */
+  /*                                                                       */
+  /*    subglyphs         :: An array of subglyph descriptors for          */
+  /*                         composite glyphs.  There are `num_subglyphs'  */
+  /*                         elements in there.  Currently internal to     */
+  /*                         FreeType.                                     */
+  /*                                                                       */
+  /*    control_data      :: Certain font drivers can also return the      */
+  /*                         control data for a given glyph image (e.g.    */
+  /*                         TrueType bytecode, Type~1 charstrings, etc.). */
+  /*                         This field is a pointer to such data.         */
+  /*                                                                       */
+  /*    control_len       :: This is the length in bytes of the control    */
+  /*                         data.                                         */
+  /*                                                                       */
+  /*    other             :: Really wicked formats can use this pointer to */
+  /*                         present their own glyph image to client       */
+  /*                         applications.  Note that the application      */
+  /*                         needs to know about the image format.         */
+  /*                                                                       */
+  /*    lsb_delta         :: The difference between hinted and unhinted    */
+  /*                         left side bearing while autohinting is        */
+  /*                         active.  Zero otherwise.                      */
+  /*                                                                       */
+  /*    rsb_delta         :: The difference between hinted and unhinted    */
+  /*                         right side bearing while autohinting is       */
+  /*                         active.  Zero otherwise.                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If @FT_Load_Glyph is called with default flags (see                */
+  /*    @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in   */
+  /*    its native format (e.g., an outline glyph for TrueType and Type~1  */
+  /*    formats).                                                          */
+  /*                                                                       */
+  /*    This image can later be converted into a bitmap by calling         */
+  /*    @FT_Render_Glyph.  This function finds the current renderer for    */
+  /*    the native image's format, then invokes it.                        */
+  /*                                                                       */
+  /*    The renderer is in charge of transforming the native image through */
+  /*    the slot's face transformation fields, then converting it into a   */
+  /*    bitmap that is returned in `slot->bitmap'.                         */
+  /*                                                                       */
+  /*    Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */
+  /*    to specify the position of the bitmap relative to the current pen  */
+  /*    position (e.g., coordinates (0,0) on the baseline).  Of course,    */
+  /*    `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP.         */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Here a small pseudo code fragment which shows how to use           */
+  /*    `lsb_delta' and `rsb_delta':                                       */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      FT_Pos  origin_x       = 0;                                      */
+  /*      FT_Pos  prev_rsb_delta = 0;                                      */
+  /*                                                                       */
+  /*                                                                       */
+  /*      for all glyphs do                                                */
+  /*        <compute kern between current and previous glyph and add it to */
+  /*         `origin_x'>                                                   */
+  /*                                                                       */
+  /*        <load glyph with `FT_Load_Glyph'>                              */
+  /*                                                                       */
+  /*        if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 )           */
+  /*          origin_x -= 64;                                              */
+  /*        else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 )      */
+  /*          origin_x += 64;                                              */
+  /*                                                                       */
+  /*        prev_rsb_delta = face->glyph->rsb_delta;                       */
+  /*                                                                       */
+  /*        <save glyph image, or render glyph, or ...>                    */
+  /*                                                                       */
+  /*        origin_x += face->glyph->advance.x;                            */
+  /*      endfor                                                           */
+  /*    }                                                                  */
+  /*                                                                       */
+  typedef struct  FT_GlyphSlotRec_
+  {
+    FT_Library        library;
+    FT_Face           face;
+    FT_GlyphSlot      next;
+    FT_UInt           reserved;       /* retained for binary compatibility */
+    FT_Generic        generic;
+
+    FT_Glyph_Metrics  metrics;
+    FT_Fixed          linearHoriAdvance;
+    FT_Fixed          linearVertAdvance;
+    FT_Vector         advance;
+
+    FT_Glyph_Format   format;
+
+    FT_Bitmap         bitmap;
+    FT_Int            bitmap_left;
+    FT_Int            bitmap_top;
+
+    FT_Outline        outline;
+
+    FT_UInt           num_subglyphs;
+    FT_SubGlyph       subglyphs;
+
+    void*             control_data;
+    long              control_len;
+
+    FT_Pos            lsb_delta;
+    FT_Pos            rsb_delta;
+
+    void*             other;
+
+    FT_Slot_Internal  internal;
+
+  } FT_GlyphSlotRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /*                         F U N C T I O N S                             */
+  /*                                                                       */
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Init_FreeType                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a new FreeType library object.  The set of modules      */
+  /*    that are registered by this function is determined at build time.  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    alibrary :: A handle to a new library object.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    In case you want to provide your own memory allocating routines,   */
+  /*    use @FT_New_Library instead, followed by a call to                 */
+  /*    @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module).  */
+  /*                                                                       */
+  /*    For multi-threading applications each thread should have its own   */
+  /*    FT_Library object.                                                 */
+  /*                                                                       */
+  /*    If you need reference-counting (cf. @FT_Reference_Library), use    */
+  /*    @FT_New_Library and @FT_Done_Library.                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Init_FreeType( FT_Library  *alibrary );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_FreeType                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy a given FreeType library object and all of its children,   */
+  /*    including resources, drivers, faces, sizes, etc.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to the target library object.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Done_FreeType( FT_Library  library );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_OPEN_XXX                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit-field constants used within the `flags' field of the */
+  /*    @FT_Open_Args structure.                                           */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_OPEN_MEMORY   :: This is a memory-based stream.                 */
+  /*                                                                       */
+  /*    FT_OPEN_STREAM   :: Copy the stream from the `stream' field.       */
+  /*                                                                       */
+  /*    FT_OPEN_PATHNAME :: Create a new input stream from a C~path        */
+  /*                        name.                                          */
+  /*                                                                       */
+  /*    FT_OPEN_DRIVER   :: Use the `driver' field.                        */
+  /*                                                                       */
+  /*    FT_OPEN_PARAMS   :: Use the `num_params' and `params' fields.      */
+  /*                                                                       */
+  /*    ft_open_memory   :: Deprecated; use @FT_OPEN_MEMORY instead.       */
+  /*                                                                       */
+  /*    ft_open_stream   :: Deprecated; use @FT_OPEN_STREAM instead.       */
+  /*                                                                       */
+  /*    ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead.     */
+  /*                                                                       */
+  /*    ft_open_driver   :: Deprecated; use @FT_OPEN_DRIVER instead.       */
+  /*                                                                       */
+  /*    ft_open_params   :: Deprecated; use @FT_OPEN_PARAMS instead.       */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME'     */
+  /*    flags are mutually exclusive.                                      */
+  /*                                                                       */
+#define FT_OPEN_MEMORY    0x1
+#define FT_OPEN_STREAM    0x2
+#define FT_OPEN_PATHNAME  0x4
+#define FT_OPEN_DRIVER    0x8
+#define FT_OPEN_PARAMS    0x10
+
+#define ft_open_memory    FT_OPEN_MEMORY     /* deprecated */
+#define ft_open_stream    FT_OPEN_STREAM     /* deprecated */
+#define ft_open_pathname  FT_OPEN_PATHNAME   /* deprecated */
+#define ft_open_driver    FT_OPEN_DRIVER     /* deprecated */
+#define ft_open_params    FT_OPEN_PARAMS     /* deprecated */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Parameter                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to pass more or less generic parameters to */
+  /*    @FT_Open_Face.                                                     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    tag  :: A four-byte identification tag.                            */
+  /*                                                                       */
+  /*    data :: A pointer to the parameter data.                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The ID and function of parameters are driver-specific.  See the    */
+  /*    various FT_PARAM_TAG_XXX flags for more information.               */
+  /*                                                                       */
+  typedef struct  FT_Parameter_
+  {
+    FT_ULong    tag;
+    FT_Pointer  data;
+
+  } FT_Parameter;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Open_Args                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to indicate how to open a new font file or        */
+  /*    stream.  A pointer to such a structure can be used as a parameter  */
+  /*    for the functions @FT_Open_Face and @FT_Attach_Stream.             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    flags       :: A set of bit flags indicating how to use the        */
+  /*                   structure.                                          */
+  /*                                                                       */
+  /*    memory_base :: The first byte of the file in memory.               */
+  /*                                                                       */
+  /*    memory_size :: The size in bytes of the file in memory.            */
+  /*                                                                       */
+  /*    pathname    :: A pointer to an 8-bit file pathname.                */
+  /*                                                                       */
+  /*    stream      :: A handle to a source stream object.                 */
+  /*                                                                       */
+  /*    driver      :: This field is exclusively used by @FT_Open_Face;    */
+  /*                   it simply specifies the font driver to use to open  */
+  /*                   the face.  If set to~0, FreeType tries to load the  */
+  /*                   face with each one of the drivers in its list.      */
+  /*                                                                       */
+  /*    num_params  :: The number of extra parameters.                     */
+  /*                                                                       */
+  /*    params      :: Extra parameters passed to the font driver when     */
+  /*                   opening a new face.                                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream type is determined by the contents of `flags' which     */
+  /*    are tested in the following order by @FT_Open_Face:                */
+  /*                                                                       */
+  /*    If the `FT_OPEN_MEMORY' bit is set, assume that this is a          */
+  /*    memory file of `memory_size' bytes, located at `memory_address'.   */
+  /*    The data are are not copied, and the client is responsible for     */
+  /*    releasing and destroying them _after_ the corresponding call to    */
+  /*    @FT_Done_Face.                                                     */
+  /*                                                                       */
+  /*    Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a       */
+  /*    custom input stream `stream' is used.                              */
+  /*                                                                       */
+  /*    Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this  */
+  /*    is a normal file and use `pathname' to open it.                    */
+  /*                                                                       */
+  /*    If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to    */
+  /*    open the file with the driver whose handler is in `driver'.        */
+  /*                                                                       */
+  /*    If the `FT_OPEN_PARAMS' bit is set, the parameters given by        */
+  /*    `num_params' and `params' is used.  They are ignored otherwise.    */
+  /*                                                                       */
+  /*    Ideally, both the `pathname' and `params' fields should be tagged  */
+  /*    as `const'; this is missing for API backwards compatibility.  In   */
+  /*    other words, applications should treat them as read-only.          */
+  /*                                                                       */
+  typedef struct  FT_Open_Args_
+  {
+    FT_UInt         flags;
+    const FT_Byte*  memory_base;
+    FT_Long         memory_size;
+    FT_String*      pathname;
+    FT_Stream       stream;
+    FT_Module       driver;
+    FT_Int          num_params;
+    FT_Parameter*   params;
+
+  } FT_Open_Args;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function calls @FT_Open_Face to open a font by its pathname.  */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    pathname   :: A path to the font file.                             */
+  /*                                                                       */
+  /*    face_index :: The index of the face within the font.  The first    */
+  /*                  face has index~0.                                    */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.  If `face_index' is   */
+  /*                  greater than or equal to zero, it must be non-NULL.  */
+  /*                  See @FT_Open_Face for more details.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Use @FT_Done_Face to destroy the created @FT_Face object (along    */
+  /*    with its slot and sizes).                                          */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Face( FT_Library   library,
+               const char*  filepathname,
+               FT_Long      face_index,
+               FT_Face     *aface );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Memory_Face                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function calls @FT_Open_Face to open a font which has been    */
+  /*    loaded into memory.                                                */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    file_base  :: A pointer to the beginning of the font data.         */
+  /*                                                                       */
+  /*    file_size  :: The size of the memory chunk used by the font data.  */
+  /*                                                                       */
+  /*    face_index :: The index of the face within the font.  The first    */
+  /*                  face has index~0.                                    */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.  If `face_index' is   */
+  /*                  greater than or equal to zero, it must be non-NULL.  */
+  /*                  See @FT_Open_Face for more details.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You must not deallocate the memory before calling @FT_Done_Face.   */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Memory_Face( FT_Library      library,
+                      const FT_Byte*  file_base,
+                      FT_Long         file_size,
+                      FT_Long         face_index,
+                      FT_Face        *aface );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Open_Face                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a face object from a given resource described by            */
+  /*    @FT_Open_Args.                                                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    args       :: A pointer to an `FT_Open_Args' structure which must  */
+  /*                  be filled by the caller.                             */
+  /*                                                                       */
+  /*    face_index :: The index of the face within the font.  The first    */
+  /*                  face has index~0.                                    */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.  If `face_index' is   */
+  /*                  greater than or equal to zero, it must be non-NULL.  */
+  /*                  See note below.                                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Unlike FreeType 1.x, this function automatically creates a glyph   */
+  /*    slot for the face object which can be accessed directly through    */
+  /*    `face->glyph'.                                                     */
+  /*                                                                       */
+  /*    FT_Open_Face can be used to quickly check whether the font         */
+  /*    format of a given font resource is supported by FreeType.  If the  */
+  /*    `face_index' field is negative, the function's return value is~0   */
+  /*    if the font format is recognized, or non-zero otherwise;           */
+  /*    the function returns a more or less empty face handle in `*aface'  */
+  /*    (if `aface' isn't NULL).  The only useful field in this special    */
+  /*    case is `face->num_faces' which gives the number of faces within   */
+  /*    the font file.  After examination, the returned @FT_Face structure */
+  /*    should be deallocated with a call to @FT_Done_Face.                */
+  /*                                                                       */
+  /*    Each new face object created with this function also owns a        */
+  /*    default @FT_Size object, accessible as `face->size'.               */
+  /*                                                                       */
+  /*    One @FT_Library instance can have multiple face objects, this is,  */
+  /*    @FT_Open_Face and its siblings can be called multiple times using  */
+  /*    the same `library' argument.                                       */
+  /*                                                                       */
+  /*    See the discussion of reference counters in the description of     */
+  /*    @FT_Reference_Face.                                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Open_Face( FT_Library           library,
+                const FT_Open_Args*  args,
+                FT_Long              face_index,
+                FT_Face             *aface );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Attach_File                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function calls @FT_Attach_Stream to attach a file.            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face         :: The target face object.                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    filepathname :: The pathname.                                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Attach_File( FT_Face      face,
+                  const char*  filepathname );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Attach_Stream                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    `Attach' data to a face object.  Normally, this is used to read    */
+  /*    additional information for the face object.  For example, you can  */
+  /*    attach an AFM file that comes with a Type~1 font to get the        */
+  /*    kerning values and other metrics.                                  */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The target face object.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    parameters :: A pointer to @FT_Open_Args which must be filled by   */
+  /*                  the caller.                                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The meaning of the `attach' (i.e., what really happens when the    */
+  /*    new file is read) is not fixed by FreeType itself.  It really      */
+  /*    depends on the font format (and thus the font driver).             */
+  /*                                                                       */
+  /*    Client applications are expected to know what they are doing       */
+  /*    when invoking this function.  Most drivers simply do not implement */
+  /*    file attachments.                                                  */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Attach_Stream( FT_Face        face,
+                    FT_Open_Args*  parameters );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Reference_Face                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A counter gets initialized to~1 at the time an @FT_Face structure  */
+  /*    is created.  This function increments the counter.  @FT_Done_Face  */
+  /*    then only destroys a face if the counter is~1, otherwise it simply */
+  /*    decrements the counter.                                            */
+  /*                                                                       */
+  /*    This function helps in managing life-cycles of structures which    */
+  /*    reference @FT_Face objects.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to a target face object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.4.2                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Reference_Face( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Face                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discard a given face object, as well as all of its child slots and */
+  /*    sizes.                                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to a target face object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    See the discussion of reference counters in the description of     */
+  /*    @FT_Reference_Face.                                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Done_Face( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Select_Size                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Select a bitmap strike.                                            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face         :: A handle to a target face object.                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    strike_index :: The index of the bitmap strike in the              */
+  /*                    `available_sizes' field of @FT_FaceRec structure.  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Select_Size( FT_Face  face,
+                  FT_Int   strike_index );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Size_Request_Type                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration type that lists the supported size request types.   */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_SIZE_REQUEST_TYPE_NOMINAL ::                                    */
+  /*      The nominal size.  The `units_per_EM' field of @FT_FaceRec is    */
+  /*      used to determine both scaling values.                           */
+  /*                                                                       */
+  /*    FT_SIZE_REQUEST_TYPE_REAL_DIM ::                                   */
+  /*      The real dimension.  The sum of the the `ascender' and (minus    */
+  /*      of) the `descender' fields of @FT_FaceRec are used to determine  */
+  /*      both scaling values.                                             */
+  /*                                                                       */
+  /*    FT_SIZE_REQUEST_TYPE_BBOX ::                                       */
+  /*      The font bounding box.  The width and height of the `bbox' field */
+  /*      of @FT_FaceRec are used to determine the horizontal and vertical */
+  /*      scaling value, respectively.                                     */
+  /*                                                                       */
+  /*    FT_SIZE_REQUEST_TYPE_CELL ::                                       */
+  /*      The `max_advance_width' field of @FT_FaceRec is used to          */
+  /*      determine the horizontal scaling value; the vertical scaling     */
+  /*      value is determined the same way as                              */
+  /*      @FT_SIZE_REQUEST_TYPE_REAL_DIM does.  Finally, both scaling      */
+  /*      values are set to the smaller one.  This type is useful if you   */
+  /*      want to specify the font size for, say, a window of a given      */
+  /*      dimension and 80x24 cells.                                       */
+  /*                                                                       */
+  /*    FT_SIZE_REQUEST_TYPE_SCALES ::                                     */
+  /*      Specify the scaling values directly.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The above descriptions only apply to scalable formats.  For bitmap */
+  /*    formats, the behaviour is up to the driver.                        */
+  /*                                                                       */
+  /*    See the note section of @FT_Size_Metrics if you wonder how size    */
+  /*    requesting relates to scaling values.                              */
+  /*                                                                       */
+  typedef enum  FT_Size_Request_Type_
+  {
+    FT_SIZE_REQUEST_TYPE_NOMINAL,
+    FT_SIZE_REQUEST_TYPE_REAL_DIM,
+    FT_SIZE_REQUEST_TYPE_BBOX,
+    FT_SIZE_REQUEST_TYPE_CELL,
+    FT_SIZE_REQUEST_TYPE_SCALES,
+
+    FT_SIZE_REQUEST_TYPE_MAX
+
+  } FT_Size_Request_Type;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Size_RequestRec                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a size request.                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    type           :: See @FT_Size_Request_Type.                       */
+  /*                                                                       */
+  /*    width          :: The desired width.                               */
+  /*                                                                       */
+  /*    height         :: The desired height.                              */
+  /*                                                                       */
+  /*    horiResolution :: The horizontal resolution.  If set to zero,      */
+  /*                      `width' is treated as a 26.6 fractional pixel    */
+  /*                      value.                                           */
+  /*                                                                       */
+  /*    vertResolution :: The vertical resolution.  If set to zero,        */
+  /*                      `height' is treated as a 26.6 fractional pixel   */
+  /*                      value.                                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If `width' is zero, then the horizontal scaling value is set equal */
+  /*    to the vertical scaling value, and vice versa.                     */
+  /*                                                                       */
+  typedef struct  FT_Size_RequestRec_
+  {
+    FT_Size_Request_Type  type;
+    FT_Long               width;
+    FT_Long               height;
+    FT_UInt               horiResolution;
+    FT_UInt               vertResolution;
+
+  } FT_Size_RequestRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Size_Request                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a size request structure.                              */
+  /*                                                                       */
+  typedef struct FT_Size_RequestRec_  *FT_Size_Request;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Request_Size                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Resize the scale of the active @FT_Size object in a face.          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face :: A handle to a target face object.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    req  :: A pointer to a @FT_Size_RequestRec.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Although drivers may select the bitmap strike matching the         */
+  /*    request, you should not rely on this if you intend to select a     */
+  /*    particular bitmap strike.  Use @FT_Select_Size instead in that     */
+  /*    case.                                                              */
+  /*                                                                       */
+  /*    The relation between the requested size and the resulting glyph    */
+  /*    size is dependent entirely on how the size is defined in the       */
+  /*    source face.  The font designer chooses the final size of each     */
+  /*    glyph relative to this size.  For more information refer to        */
+  /*    `http://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'      */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Request_Size( FT_Face          face,
+                   FT_Size_Request  req );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Char_Size                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function calls @FT_Request_Size to request the nominal size   */
+  /*    (in points).                                                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face            :: A handle to a target face object.               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    char_width      :: The nominal width, in 26.6 fractional points.   */
+  /*                                                                       */
+  /*    char_height     :: The nominal height, in 26.6 fractional points.  */
+  /*                                                                       */
+  /*    horz_resolution :: The horizontal resolution in dpi.               */
+  /*                                                                       */
+  /*    vert_resolution :: The vertical resolution in dpi.                 */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If either the character width or height is zero, it is set equal   */
+  /*    to the other value.                                                */
+  /*                                                                       */
+  /*    If either the horizontal or vertical resolution is zero, it is set */
+  /*    equal to the other value.                                          */
+  /*                                                                       */
+  /*    A character width or height smaller than 1pt is set to 1pt; if     */
+  /*    both resolution values are zero, they are set to 72dpi.            */
+  /*                                                                       */
+  /*    Don't use this function if you are using the FreeType cache API.   */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Char_Size( FT_Face     face,
+                    FT_F26Dot6  char_width,
+                    FT_F26Dot6  char_height,
+                    FT_UInt     horz_resolution,
+                    FT_UInt     vert_resolution );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Pixel_Sizes                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function calls @FT_Request_Size to request the nominal size   */
+  /*    (in pixels).                                                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face         :: A handle to the target face object.                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    pixel_width  :: The nominal width, in pixels.                      */
+  /*                                                                       */
+  /*    pixel_height :: The nominal height, in pixels.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You should not rely on the resulting glyphs matching, or being     */
+  /*    constrained, to this pixel size.  Refer to @FT_Request_Size to     */
+  /*    understand how requested sizes relate to actual sizes.             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Pixel_Sizes( FT_Face  face,
+                      FT_UInt  pixel_width,
+                      FT_UInt  pixel_height );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Load_Glyph                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to load a single glyph into the glyph slot of a    */
+  /*    face object.                                                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face        :: A handle to the target face object where the glyph  */
+  /*                   is loaded.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    glyph_index :: The index of the glyph in the font file.  For       */
+  /*                   CID-keyed fonts (either in PS or in CFF format)     */
+  /*                   this argument specifies the CID value.              */
+  /*                                                                       */
+  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
+  /*                   @FT_LOAD_XXX constants can be used to control the   */
+  /*                   glyph loading process (e.g., whether the outline    */
+  /*                   should be scaled, whether to load bitmaps or not,   */
+  /*                   whether to hint the outline, etc).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The loaded glyph may be transformed.  See @FT_Set_Transform for    */
+  /*    the details.                                                       */
+  /*                                                                       */
+  /*    For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is        */
+  /*    returned for invalid CID values (this is, for CID values which     */
+  /*    don't have a corresponding glyph in the font).  See the discussion */
+  /*    of the @FT_FACE_FLAG_CID_KEYED flag for more details.              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Load_Glyph( FT_Face   face,
+                 FT_UInt   glyph_index,
+                 FT_Int32  load_flags );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Load_Char                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to load a single glyph into the glyph slot of a    */
+  /*    face object, according to its character code.                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face        :: A handle to a target face object where the glyph    */
+  /*                   is loaded.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    char_code   :: The glyph's character code, according to the        */
+  /*                   current charmap used in the face.                   */
+  /*                                                                       */
+  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
+  /*                   @FT_LOAD_XXX constants can be used to control the   */
+  /*                   glyph loading process (e.g., whether the outline    */
+  /*                   should be scaled, whether to load bitmaps or not,   */
+  /*                   whether to hint the outline, etc).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph.  */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Load_Char( FT_Face   face,
+                FT_ULong  char_code,
+                FT_Int32  load_flags );
+
+
+  /*************************************************************************
+   *
+   * @enum:
+   *   FT_LOAD_XXX
+   *
+   * @description:
+   *   A list of bit-field constants used with @FT_Load_Glyph to indicate
+   *   what kind of operations to perform during glyph loading.
+   *
+   * @values:
+   *   FT_LOAD_DEFAULT ::
+   *     Corresponding to~0, this value is used as the default glyph load
+   *     operation.  In this case, the following happens:
+   *
+   *     1. FreeType looks for a bitmap for the glyph corresponding to the
+   *        face's current size.  If one is found, the function returns.
+   *        The bitmap data can be accessed from the glyph slot (see note
+   *        below).
+   *
+   *     2. If no embedded bitmap is searched or found, FreeType looks for a
+   *        scalable outline.  If one is found, it is loaded from the font
+   *        file, scaled to device pixels, then `hinted' to the pixel grid
+   *        in order to optimize it.  The outline data can be accessed from
+   *        the glyph slot (see note below).
+   *
+   *     Note that by default, the glyph loader doesn't render outlines into
+   *     bitmaps.  The following flags are used to modify this default
+   *     behaviour to more specific and useful cases.
+   *
+   *   FT_LOAD_NO_SCALE ::
+   *     Don't scale the loaded outline glyph but keep it in font units.
+   *
+   *     This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and
+   *     unsets @FT_LOAD_RENDER.
+   *
+   *     If the font is `tricky' (see @FT_FACE_FLAG_TRICKY for more), using
+   *     FT_LOAD_NO_SCALE usually yields meaningless outlines because the
+   *     subglyphs must be scaled and positioned with hinting instructions.
+   *     This can be solved by loading the font without FT_LOAD_NO_SCALE and
+   *     setting the character size to `font->units_per_EM'.
+   *
+   *   FT_LOAD_NO_HINTING ::
+   *     Disable hinting.  This generally generates `blurrier' bitmap glyphs
+   *     when the glyph are rendered in any of the anti-aliased modes.  See
+   *     also the note below.
+   *
+   *     This flag is implied by @FT_LOAD_NO_SCALE.
+   *
+   *   FT_LOAD_RENDER ::
+   *     Call @FT_Render_Glyph after the glyph is loaded.  By default, the
+   *     glyph is rendered in @FT_RENDER_MODE_NORMAL mode.  This can be
+   *     overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME.
+   *
+   *     This flag is unset by @FT_LOAD_NO_SCALE.
+   *
+   *   FT_LOAD_NO_BITMAP ::
+   *     Ignore bitmap strikes when loading.  Bitmap-only fonts ignore this
+   *     flag.
+   *
+   *     @FT_LOAD_NO_SCALE always sets this flag.
+   *
+   *   FT_LOAD_VERTICAL_LAYOUT ::
+   *     Load the glyph for vertical text layout.  In particular, the
+   *     `advance' value in the @FT_GlyphSlotRec structure is set to the
+   *     `vertAdvance' value of the `metrics' field.
+   *
+   *     In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use
+   *     this flag currently.  Reason is that in this case vertical metrics
+   *     get synthesized, and those values are not always consistent across
+   *     various font formats.
+   *
+   *   FT_LOAD_FORCE_AUTOHINT ::
+   *     Indicates that the auto-hinter is preferred over the font's native
+   *     hinter.  See also the note below.
+   *
+   *   FT_LOAD_CROP_BITMAP ::
+   *     Indicates that the font driver should crop the loaded bitmap glyph
+   *     (i.e., remove all space around its black bits).  Not all drivers
+   *     implement this.
+   *
+   *   FT_LOAD_PEDANTIC ::
+   *     Indicates that the font driver should perform pedantic verifications
+   *     during glyph loading.  This is mostly used to detect broken glyphs
+   *     in fonts.  By default, FreeType tries to handle broken fonts also.
+   *
+   *     In particular, errors from the TrueType bytecode engine are not
+   *     passed to the application if this flag is not set; this might
+   *     result in partially hinted or distorted glyphs in case a glyph's
+   *     bytecode is buggy.
+   *
+   *   FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ::
+   *     Ignored.  Deprecated.
+   *
+   *   FT_LOAD_NO_RECURSE ::
+   *     This flag is only used internally.  It merely indicates that the
+   *     font driver should not load composite glyphs recursively.  Instead,
+   *     it should set the `num_subglyph' and `subglyphs' values of the
+   *     glyph slot accordingly, and set `glyph->format' to
+   *     @FT_GLYPH_FORMAT_COMPOSITE.
+   *
+   *     The description of sub-glyphs is not available to client
+   *     applications for now.
+   *
+   *     This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM.
+   *
+   *   FT_LOAD_IGNORE_TRANSFORM ::
+   *     Indicates that the transform matrix set by @FT_Set_Transform should
+   *     be ignored.
+   *
+   *   FT_LOAD_MONOCHROME ::
+   *     This flag is used with @FT_LOAD_RENDER to indicate that you want to
+   *     render an outline glyph to a 1-bit monochrome bitmap glyph, with
+   *     8~pixels packed into each byte of the bitmap data.
+   *
+   *     Note that this has no effect on the hinting algorithm used.  You
+   *     should rather use @FT_LOAD_TARGET_MONO so that the
+   *     monochrome-optimized hinting algorithm is used.
+   *
+   *   FT_LOAD_LINEAR_DESIGN ::
+   *     Indicates that the `linearHoriAdvance' and `linearVertAdvance'
+   *     fields of @FT_GlyphSlotRec should be kept in font units.  See
+   *     @FT_GlyphSlotRec for details.
+   *
+   *   FT_LOAD_NO_AUTOHINT ::
+   *     Disable auto-hinter.  See also the note below.
+   *
+   *   FT_LOAD_COLOR ::
+   *     This flag is used to request loading of color embedded-bitmap
+   *     images.  The resulting color bitmaps, if available, will have the
+   *     @FT_PIXEL_MODE_BGRA format.  When the flag is not used and color
+   *     bitmaps are found, they will be converted to 256-level gray
+   *     bitmaps transparently.  Those bitmaps will be in the
+   *     @FT_PIXEL_MODE_GRAY format.
+   *
+   * @note:
+   *   By default, hinting is enabled and the font's native hinter (see
+   *   @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter.  You can
+   *   disable hinting by setting @FT_LOAD_NO_HINTING or change the
+   *   precedence by setting @FT_LOAD_FORCE_AUTOHINT.  You can also set
+   *   @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be
+   *   used at all.
+   *
+   *   See the description of @FT_FACE_FLAG_TRICKY for a special exception
+   *   (affecting only a handful of Asian fonts).
+   *
+   *   Besides deciding which hinter to use, you can also decide which
+   *   hinting algorithm to use.  See @FT_LOAD_TARGET_XXX for details.
+   *
+   *   Note that the auto-hinter needs a valid Unicode cmap (either a native
+   *   one or synthesized by FreeType) for producing correct results.  If a
+   *   font provides an incorrect mapping (for example, assigning the
+   *   character code U+005A, LATIN CAPITAL LETTER Z, to a glyph depicting a
+   *   mathematical integral sign), the auto-hinter might produce useless
+   *   results.
+   *
+   */
+#define FT_LOAD_DEFAULT                      0x0
+#define FT_LOAD_NO_SCALE                     ( 1L << 0 )
+#define FT_LOAD_NO_HINTING                   ( 1L << 1 )
+#define FT_LOAD_RENDER                       ( 1L << 2 )
+#define FT_LOAD_NO_BITMAP                    ( 1L << 3 )
+#define FT_LOAD_VERTICAL_LAYOUT              ( 1L << 4 )
+#define FT_LOAD_FORCE_AUTOHINT               ( 1L << 5 )
+#define FT_LOAD_CROP_BITMAP                  ( 1L << 6 )
+#define FT_LOAD_PEDANTIC                     ( 1L << 7 )
+#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH  ( 1L << 9 )
+#define FT_LOAD_NO_RECURSE                   ( 1L << 10 )
+#define FT_LOAD_IGNORE_TRANSFORM             ( 1L << 11 )
+#define FT_LOAD_MONOCHROME                   ( 1L << 12 )
+#define FT_LOAD_LINEAR_DESIGN                ( 1L << 13 )
+#define FT_LOAD_NO_AUTOHINT                  ( 1L << 15 )
+  /* Bits 16..19 are used by `FT_LOAD_TARGET_' */
+#define FT_LOAD_COLOR                        ( 1L << 20 )
+
+  /* */
+
+  /* used internally only by certain font drivers! */
+#define FT_LOAD_ADVANCE_ONLY                 ( 1L << 8 )
+#define FT_LOAD_SBITS_ONLY                   ( 1L << 14 )
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   FT_LOAD_TARGET_XXX
+   *
+   * @description:
+   *   A list of values that are used to select a specific hinting algorithm
+   *   to use by the hinter.  You should OR one of these values to your
+   *   `load_flags' when calling @FT_Load_Glyph.
+   *
+   *   Note that font's native hinters may ignore the hinting algorithm you
+   *   have specified (e.g., the TrueType bytecode interpreter).  You can set
+   *   @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used.
+   *
+   *   Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it
+   *   always implies @FT_LOAD_FORCE_AUTOHINT.
+   *
+   * @values:
+   *   FT_LOAD_TARGET_NORMAL ::
+   *     This corresponds to the default hinting algorithm, optimized for
+   *     standard gray-level rendering.  For monochrome output, use
+   *     @FT_LOAD_TARGET_MONO instead.
+   *
+   *   FT_LOAD_TARGET_LIGHT ::
+   *     A lighter hinting algorithm for non-monochrome modes.  Many
+   *     generated glyphs are more fuzzy but better resemble its original
+   *     shape.  A bit like rendering on Mac OS~X.
+   *
+   *     As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT.
+   *
+   *   FT_LOAD_TARGET_MONO ::
+   *     Strong hinting algorithm that should only be used for monochrome
+   *     output.  The result is probably unpleasant if the glyph is rendered
+   *     in non-monochrome modes.
+   *
+   *   FT_LOAD_TARGET_LCD ::
+   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally
+   *     decimated LCD displays.
+   *
+   *   FT_LOAD_TARGET_LCD_V ::
+   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically
+   *     decimated LCD displays.
+   *
+   * @note:
+   *   You should use only _one_ of the FT_LOAD_TARGET_XXX values in your
+   *   `load_flags'.  They can't be ORed.
+   *
+   *   If @FT_LOAD_RENDER is also set, the glyph is rendered in the
+   *   corresponding mode (i.e., the mode which matches the used algorithm
+   *   best).  An exeption is FT_LOAD_TARGET_MONO since it implies
+   *   @FT_LOAD_MONOCHROME.
+   *
+   *   You can use a hinting algorithm that doesn't correspond to the same
+   *   rendering mode.  As an example, it is possible to use the `light'
+   *   hinting algorithm and have the results rendered in horizontal LCD
+   *   pixel mode, with code like
+   *
+   *     {
+   *       FT_Load_Glyph( face, glyph_index,
+   *                      load_flags | FT_LOAD_TARGET_LIGHT );
+   *
+   *       FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );
+   *     }
+   *
+   */
+#define FT_LOAD_TARGET_( x )   ( (FT_Int32)( (x) & 15 ) << 16 )
+
+#define FT_LOAD_TARGET_NORMAL  FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )
+#define FT_LOAD_TARGET_LIGHT   FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT  )
+#define FT_LOAD_TARGET_MONO    FT_LOAD_TARGET_( FT_RENDER_MODE_MONO   )
+#define FT_LOAD_TARGET_LCD     FT_LOAD_TARGET_( FT_RENDER_MODE_LCD    )
+#define FT_LOAD_TARGET_LCD_V   FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V  )
+
+
+  /**************************************************************************
+   *
+   * @macro:
+   *   FT_LOAD_TARGET_MODE
+   *
+   * @description:
+   *   Return the @FT_Render_Mode corresponding to a given
+   *   @FT_LOAD_TARGET_XXX value.
+   *
+   */
+#define FT_LOAD_TARGET_MODE( x )  ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Transform                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to set the transformation that is applied to glyph */
+  /*    images when they are loaded into a glyph slot through              */
+  /*    @FT_Load_Glyph.                                                    */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: A handle to the source face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    matrix :: A pointer to the transformation's 2x2 matrix.  Use~0 for */
+  /*              the identity matrix.                                     */
+  /*    delta  :: A pointer to the translation vector.  Use~0 for the null */
+  /*              vector.                                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The transformation is only applied to scalable image formats after */
+  /*    the glyph has been loaded.  It means that hinting is unaltered by  */
+  /*    the transformation and is performed on the character size given in */
+  /*    the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes.         */
+  /*                                                                       */
+  /*    Note that this also transforms the `face.glyph.advance' field, but */
+  /*    *not* the values in `face.glyph.metrics'.                          */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Set_Transform( FT_Face     face,
+                    FT_Matrix*  matrix,
+                    FT_Vector*  delta );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Render_Mode                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration type that lists the render modes supported by       */
+  /*    FreeType~2.  Each mode corresponds to a specific type of scanline  */
+  /*    conversion performed on the outline.                               */
+  /*                                                                       */
+  /*    For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode'     */
+  /*    field in the @FT_GlyphSlotRec structure gives the format of the    */
+  /*    returned bitmap.                                                   */
+  /*                                                                       */
+  /*    All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity.   */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_RENDER_MODE_NORMAL ::                                           */
+  /*      This is the default render mode; it corresponds to 8-bit         */
+  /*      anti-aliased bitmaps.                                            */
+  /*                                                                       */
+  /*    FT_RENDER_MODE_LIGHT ::                                            */
+  /*      This is equivalent to @FT_RENDER_MODE_NORMAL.  It is only        */
+  /*      defined as a separate value because render modes are also used   */
+  /*      indirectly to define hinting algorithm selectors.  See           */
+  /*      @FT_LOAD_TARGET_XXX for details.                                 */
+  /*                                                                       */
+  /*    FT_RENDER_MODE_MONO ::                                             */
+  /*      This mode corresponds to 1-bit bitmaps (with 2~levels of         */
+  /*      opacity).                                                        */
+  /*                                                                       */
+  /*    FT_RENDER_MODE_LCD ::                                              */
+  /*      This mode corresponds to horizontal RGB and BGR sub-pixel        */
+  /*      displays like LCD screens.  It produces 8-bit bitmaps that are   */
+  /*      3~times the width of the original glyph outline in pixels, and   */
+  /*      which use the @FT_PIXEL_MODE_LCD mode.                           */
+  /*                                                                       */
+  /*    FT_RENDER_MODE_LCD_V ::                                            */
+  /*      This mode corresponds to vertical RGB and BGR sub-pixel displays */
+  /*      (like PDA screens, rotated LCD displays, etc.).  It produces     */
+  /*      8-bit bitmaps that are 3~times the height of the original        */
+  /*      glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode.   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */
+  /*    filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */
+  /*    (not active in the default builds).  It is up to the caller to     */
+  /*    either call @FT_Library_SetLcdFilter (if available) or do the      */
+  /*    filtering itself.                                                  */
+  /*                                                                       */
+  /*    The selected render mode only affects vector glyphs of a font.     */
+  /*    Embedded bitmaps often have a different pixel mode like            */
+  /*    @FT_PIXEL_MODE_MONO.  You can use @FT_Bitmap_Convert to transform  */
+  /*    them into 8-bit pixmaps.                                           */
+  /*                                                                       */
+  typedef enum  FT_Render_Mode_
+  {
+    FT_RENDER_MODE_NORMAL = 0,
+    FT_RENDER_MODE_LIGHT,
+    FT_RENDER_MODE_MONO,
+    FT_RENDER_MODE_LCD,
+    FT_RENDER_MODE_LCD_V,
+
+    FT_RENDER_MODE_MAX
+
+  } FT_Render_Mode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_render_mode_xxx                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    These constants are deprecated.  Use the corresponding             */
+  /*    @FT_Render_Mode values instead.                                    */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL                */
+  /*    ft_render_mode_mono   :: see @FT_RENDER_MODE_MONO                  */
+  /*                                                                       */
+#define ft_render_mode_normal  FT_RENDER_MODE_NORMAL
+#define ft_render_mode_mono    FT_RENDER_MODE_MONO
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Render_Glyph                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Convert a given glyph image to a bitmap.  It does so by inspecting */
+  /*    the glyph image format, finding the relevant renderer, and         */
+  /*    invoking it.                                                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    slot        :: A handle to the glyph slot containing the image to  */
+  /*                   convert.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    render_mode :: This is the render mode used to render the glyph    */
+  /*                   image into a bitmap.  See @FT_Render_Mode for a     */
+  /*                   list of possible values.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Render_Glyph( FT_GlyphSlot    slot,
+                   FT_Render_Mode  render_mode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Kerning_Mode                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration used to specify which kerning values to return in   */
+  /*    @FT_Get_Kerning.                                                   */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_KERNING_DEFAULT  :: Return scaled and grid-fitted kerning       */
+  /*                           distances (value is~0).                     */
+  /*                                                                       */
+  /*    FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning    */
+  /*                           distances.                                  */
+  /*                                                                       */
+  /*    FT_KERNING_UNSCALED :: Return the kerning vector in original font  */
+  /*                           units.                                      */
+  /*                                                                       */
+  typedef enum  FT_Kerning_Mode_
+  {
+    FT_KERNING_DEFAULT  = 0,
+    FT_KERNING_UNFITTED,
+    FT_KERNING_UNSCALED
+
+  } FT_Kerning_Mode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Const>                                                               */
+  /*    ft_kerning_default                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This constant is deprecated.  Please use @FT_KERNING_DEFAULT       */
+  /*    instead.                                                           */
+  /*                                                                       */
+#define ft_kerning_default   FT_KERNING_DEFAULT
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Const>                                                               */
+  /*    ft_kerning_unfitted                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This constant is deprecated.  Please use @FT_KERNING_UNFITTED      */
+  /*    instead.                                                           */
+  /*                                                                       */
+#define ft_kerning_unfitted  FT_KERNING_UNFITTED
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Const>                                                               */
+  /*    ft_kerning_unscaled                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This constant is deprecated.  Please use @FT_KERNING_UNSCALED      */
+  /*    instead.                                                           */
+  /*                                                                       */
+#define ft_kerning_unscaled  FT_KERNING_UNSCALED
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Kerning                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the kerning vector between two glyphs of a same face.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to a source face object.                   */
+  /*                                                                       */
+  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
+  /*                                                                       */
+  /*    right_glyph :: The index of the right glyph in the kern pair.      */
+  /*                                                                       */
+  /*    kern_mode   :: See @FT_Kerning_Mode for more information.          */
+  /*                   Determines the scale and dimension of the returned  */
+  /*                   kerning vector.                                     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    akerning    :: The kerning vector.  This is either in font units   */
+  /*                   or in pixels (26.6 format) for scalable formats,    */
+  /*                   and in pixels for fixed-sizes formats.              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
+  /*    supported by this method.  Other layouts, or more sophisticated    */
+  /*    kernings, are out of the scope of this API function -- they can be */
+  /*    implemented through format-specific interfaces.                    */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Kerning( FT_Face     face,
+                  FT_UInt     left_glyph,
+                  FT_UInt     right_glyph,
+                  FT_UInt     kern_mode,
+                  FT_Vector  *akerning );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Track_Kerning                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the track kerning for a given face object at a given size.  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: A handle to a source face object.                    */
+  /*                                                                       */
+  /*    point_size :: The point size in 16.16 fractional points.           */
+  /*                                                                       */
+  /*    degree     :: The degree of tightness.  Increasingly negative      */
+  /*                  values represent tighter track kerning, while        */
+  /*                  increasingly positive values represent looser track  */
+  /*                  kerning.  Value zero means no track kerning.         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    akerning   :: The kerning in 16.16 fractional points, to be        */
+  /*                  uniformly applied between all glyphs.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Currently, only the Type~1 font driver supports track kerning,     */
+  /*    using data from AFM files (if attached with @FT_Attach_File or     */
+  /*    @FT_Attach_Stream).                                                */
+  /*                                                                       */
+  /*    Only very few AFM files come with track kerning data; please refer */
+  /*    to the Adobe's AFM specification for more details.                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Track_Kerning( FT_Face    face,
+                        FT_Fixed   point_size,
+                        FT_Int     degree,
+                        FT_Fixed*  akerning );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Glyph_Name                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the ASCII name of a given glyph in a face.  This only     */
+  /*    works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1.   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to a source face object.                   */
+  /*                                                                       */
+  /*    glyph_index :: The glyph index.                                    */
+  /*                                                                       */
+  /*    buffer_max  :: The maximum number of bytes available in the        */
+  /*                   buffer.                                             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    buffer      :: A pointer to a target buffer where the name is      */
+  /*                   copied to.                                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    An error is returned if the face doesn't provide glyph names or if */
+  /*    the glyph index is invalid.  In all cases of failure, the first    */
+  /*    byte of `buffer' is set to~0 to indicate an empty name.            */
+  /*                                                                       */
+  /*    The glyph name is truncated to fit within the buffer if it is too  */
+  /*    long.  The returned string is always zero-terminated.              */
+  /*                                                                       */
+  /*    Be aware that FreeType reorders glyph indices internally so that   */
+  /*    glyph index~0 always corresponds to the `missing glyph' (called    */
+  /*    `.notdef').                                                        */
+  /*                                                                       */
+  /*    This function is not compiled within the library if the config     */
+  /*    macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in              */
+  /*    `include/freetype/config/ftoptions.h'.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Glyph_Name( FT_Face     face,
+                     FT_UInt     glyph_index,
+                     FT_Pointer  buffer,
+                     FT_UInt     buffer_max );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Postscript_Name                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the ASCII PostScript name of a given face, if available.  */
+  /*    This only works with PostScript and TrueType fonts.                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source face object.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A pointer to the face's PostScript name.  NULL if unavailable.     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned pointer is owned by the face and is destroyed with    */
+  /*    it.                                                                */
+  /*                                                                       */
+  FT_EXPORT( const char* )
+  FT_Get_Postscript_Name( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Select_Charmap                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Select a given charmap by its encoding tag (as listed in           */
+  /*    `freetype.h').                                                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face     :: A handle to the source face object.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    encoding :: A handle to the selected encoding.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function returns an error if no charmap in the face           */
+  /*    corresponds to the encoding queried here.                          */
+  /*                                                                       */
+  /*    Because many fonts contain more than a single cmap for Unicode     */
+  /*    encoding, this function has some special code to select the one    */
+  /*    which covers Unicode best (`best' in the sense that a UCS-4 cmap   */
+  /*    is preferred to a UCS-2 cmap).  It is thus preferable to           */
+  /*    @FT_Set_Charmap in this case.                                      */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Select_Charmap( FT_Face      face,
+                     FT_Encoding  encoding );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Charmap                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Select a given charmap for character code to glyph index mapping.  */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face    :: A handle to the source face object.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    charmap :: A handle to the selected charmap.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function returns an error if the charmap is not part of       */
+  /*    the face (i.e., if it is not listed in the `face->charmaps'        */
+  /*    table).                                                            */
+  /*                                                                       */
+  /*    It also fails if a type~14 charmap is selected.                    */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Charmap( FT_Face     face,
+                  FT_CharMap  charmap );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Get_Charmap_Index
+   *
+   * @description:
+   *   Retrieve index of a given charmap.
+   *
+   * @input:
+   *   charmap ::
+   *     A handle to a charmap.
+   *
+   * @return:
+   *   The index into the array of character maps within the face to which
+   *   `charmap' belongs.  If an error occurs, -1 is returned.
+   *
+   */
+  FT_EXPORT( FT_Int )
+  FT_Get_Charmap_Index( FT_CharMap  charmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Char_Index                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the glyph index of a given character code.  This function   */
+  /*    uses a charmap object to do the mapping.                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the source face object.                    */
+  /*                                                                       */
+  /*    charcode :: The character code.                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The glyph index.  0~means `undefined character code'.              */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If you use FreeType to manipulate the contents of font files       */
+  /*    directly, be aware that the glyph index returned by this function  */
+  /*    doesn't always correspond to the internal indices used within the  */
+  /*    file.  This is done to ensure that value~0 always corresponds to   */
+  /*    the `missing glyph'.  If the first glyph is not named `.notdef',   */
+  /*    then for Type~1 and Type~42 fonts, `.notdef' will be moved into    */
+  /*    the glyph ID~0 position, and whatever was there will be moved to   */
+  /*    the position `.notdef' had.  For Type~1 fonts, if there is no      */
+  /*    `.notdef' glyph at all, then one will be created at index~0 and    */
+  /*    whatever was there will be moved to the last index -- Type~42      */
+  /*    fonts are considered invalid under this condition.                 */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt )
+  FT_Get_Char_Index( FT_Face   face,
+                     FT_ULong  charcode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_First_Char                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to return the first character code in the    */
+  /*    current charmap of a given face.  It also returns the              */
+  /*    corresponding glyph index.                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: A handle to the source face object.                     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    agindex :: Glyph index of first character code.  0~if charmap is   */
+  /*               empty.                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The charmap's first character code.                                */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You should use this function with @FT_Get_Next_Char to be able to  */
+  /*    parse all character codes available in a given charmap.  The code  */
+  /*    should look like this:                                             */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      FT_ULong  charcode;                                              */
+  /*      FT_UInt   gindex;                                                */
+  /*                                                                       */
+  /*                                                                       */
+  /*      charcode = FT_Get_First_Char( face, &gindex );                   */
+  /*      while ( gindex != 0 )                                            */
+  /*      {                                                                */
+  /*        ... do something with (charcode,gindex) pair ...               */
+  /*                                                                       */
+  /*        charcode = FT_Get_Next_Char( face, charcode, &gindex );        */
+  /*      }                                                                */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    Note that `*agindex' is set to~0 if the charmap is empty.  The     */
+  /*    result itself can be~0 in two cases: if the charmap is empty or    */
+  /*    if the value~0 is the first valid character code.                  */
+  /*                                                                       */
+  FT_EXPORT( FT_ULong )
+  FT_Get_First_Char( FT_Face   face,
+                     FT_UInt  *agindex );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Next_Char                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to return the next character code in the     */
+  /*    current charmap of a given face following the value `char_code',   */
+  /*    as well as the corresponding glyph index.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face      :: A handle to the source face object.                   */
+  /*    char_code :: The starting character code.                          */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    agindex   :: Glyph index of next character code.  0~if charmap     */
+  /*                 is empty.                                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The charmap's next character code.                                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You should use this function with @FT_Get_First_Char to walk       */
+  /*    over all character codes available in a given charmap.  See the    */
+  /*    note for this function for a simple code example.                  */
+  /*                                                                       */
+  /*    Note that `*agindex' is set to~0 when there are no more codes in   */
+  /*    the charmap.                                                       */
+  /*                                                                       */
+  FT_EXPORT( FT_ULong )
+  FT_Get_Next_Char( FT_Face    face,
+                    FT_ULong   char_code,
+                    FT_UInt   *agindex );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Name_Index                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the glyph index of a given glyph name.  This function uses  */
+  /*    driver specific objects to do the translation.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: A handle to the source face object.                  */
+  /*                                                                       */
+  /*    glyph_name :: The glyph name.                                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The glyph index.  0~means `undefined character code'.              */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt )
+  FT_Get_Name_Index( FT_Face     face,
+                     FT_String*  glyph_name );
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SUBGLYPH_FLAG_XXX
+   *
+   * @description:
+   *   A list of constants used to describe subglyphs.  Please refer to the
+   *   TrueType specification for the meaning of the various flags.
+   *
+   * @values:
+   *   FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::
+   *   FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ::
+   *   FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID ::
+   *   FT_SUBGLYPH_FLAG_SCALE ::
+   *   FT_SUBGLYPH_FLAG_XY_SCALE ::
+   *   FT_SUBGLYPH_FLAG_2X2 ::
+   *   FT_SUBGLYPH_FLAG_USE_MY_METRICS ::
+   *
+   */
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2
+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4
+#define FT_SUBGLYPH_FLAG_SCALE                   8
+#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40
+#define FT_SUBGLYPH_FLAG_2X2                  0x80
+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200
+
+
+  /*************************************************************************
+   *
+   * @func:
+   *   FT_Get_SubGlyph_Info
+   *
+   * @description:
+   *   Retrieve a description of a given subglyph.  Only use it if
+   *   `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is
+   *   returned otherwise.
+   *
+   * @input:
+   *   glyph ::
+   *     The source glyph slot.
+   *
+   *   sub_index ::
+   *     The index of the subglyph.  Must be less than
+   *     `glyph->num_subglyphs'.
+   *
+   * @output:
+   *   p_index ::
+   *     The glyph index of the subglyph.
+   *
+   *   p_flags ::
+   *     The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX.
+   *
+   *   p_arg1 ::
+   *     The subglyph's first argument (if any).
+   *
+   *   p_arg2 ::
+   *     The subglyph's second argument (if any).
+   *
+   *   p_transform ::
+   *     The subglyph transformation (if any).
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   The values of `*p_arg1', `*p_arg2', and `*p_transform' must be
+   *   interpreted depending on the flags returned in `*p_flags'.  See the
+   *   TrueType specification for details.
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,
+                        FT_UInt       sub_index,
+                        FT_Int       *p_index,
+                        FT_UInt      *p_flags,
+                        FT_Int       *p_arg1,
+                        FT_Int       *p_arg2,
+                        FT_Matrix    *p_transform );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_FSTYPE_XXX                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit flags used in the `fsType' field of the OS/2 table   */
+  /*    in a TrueType or OpenType font and the `FSType' entry in a         */
+  /*    PostScript font.  These bit flags are returned by                  */
+  /*    @FT_Get_FSType_Flags; they inform client applications of embedding */
+  /*    and subsetting restrictions associated with a font.                */
+  /*                                                                       */
+  /*    See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for  */
+  /*    more details.                                                      */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING ::                                 */
+  /*      Fonts with no fsType bit set may be embedded and permanently     */
+  /*      installed on the remote system by an application.                */
+  /*                                                                       */
+  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING ::                          */
+  /*      Fonts that have only this bit set must not be modified, embedded */
+  /*      or exchanged in any manner without first obtaining permission of */
+  /*      the font software copyright owner.                               */
+  /*                                                                       */
+  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING ::                           */
+  /*      If this bit is set, the font may be embedded and temporarily     */
+  /*      loaded on the remote system.  Documents containing Preview &     */
+  /*      Print fonts must be opened `read-only'; no edits can be applied  */
+  /*      to the document.                                                 */
+  /*                                                                       */
+  /*    FT_FSTYPE_EDITABLE_EMBEDDING ::                                    */
+  /*      If this bit is set, the font may be embedded but must only be    */
+  /*      installed temporarily on other systems.  In contrast to Preview  */
+  /*      & Print fonts, documents containing editable fonts may be opened */
+  /*      for reading, editing is permitted, and changes may be saved.     */
+  /*                                                                       */
+  /*    FT_FSTYPE_NO_SUBSETTING ::                                         */
+  /*      If this bit is set, the font may not be subsetted prior to       */
+  /*      embedding.                                                       */
+  /*                                                                       */
+  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY ::                                 */
+  /*      If this bit is set, only bitmaps contained in the font may be    */
+  /*      embedded; no outline data may be embedded.  If there are no      */
+  /*      bitmaps available in the font, then the font is unembeddable.    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    While the fsType flags can indicate that a font may be embedded, a */
+  /*    license with the font vendor may be separately required to use the */
+  /*    font in this way.                                                  */
+  /*                                                                       */
+#define FT_FSTYPE_INSTALLABLE_EMBEDDING         0x0000
+#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING  0x0002
+#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING   0x0004
+#define FT_FSTYPE_EDITABLE_EMBEDDING            0x0008
+#define FT_FSTYPE_NO_SUBSETTING                 0x0100
+#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY         0x0200
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_FSType_Flags                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the fsType flags for a font.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source face object.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The fsType flags, @FT_FSTYPE_XXX.                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Use this function rather than directly reading the `fs_type' field */
+  /*    in the @PS_FontInfoRec structure which is only guaranteed to       */
+  /*    return the correct results for Type~1 fonts.                       */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.8                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_UShort )
+  FT_Get_FSType_Flags( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    glyph_variants                                                     */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Glyph Variants                                                     */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    The FreeType~2 interface to Unicode Ideographic Variation          */
+  /*    Sequences (IVS), using the SFNT cmap format~14.                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Many CJK characters have variant forms.  They are a sort of grey   */
+  /*    area somewhere between being totally irrelevant and semantically   */
+  /*    distinct; for this reason, the Unicode consortium decided to       */
+  /*    introduce Ideographic Variation Sequences (IVS), consisting of a   */
+  /*    Unicode base character and one of 240 variant selectors            */
+  /*    (U+E0100-U+E01EF), instead of further extending the already huge   */
+  /*    code range for CJK characters.                                     */
+  /*                                                                       */
+  /*    An IVS is registered and unique; for further details please refer  */
+  /*    to Unicode Technical Standard #37, the Ideographic Variation       */
+  /*    Database:                                                          */
+  /*                                                                       */
+  /*      http://www.unicode.org/reports/tr37/                             */
+  /*                                                                       */
+  /*    To date (November 2012), the character with the most variants is   */
+  /*    U+9089, having 31 such IVS.                                        */
+  /*                                                                       */
+  /*    Adobe and MS decided to support IVS with a new cmap subtable       */
+  /*    (format~14).  It is an odd subtable because it is not a mapping of */
+  /*    input code points to glyphs, but contains lists of all variants    */
+  /*    supported by the font.                                             */
+  /*                                                                       */
+  /*    A variant may be either `default' or `non-default'.  A default     */
+  /*    variant is the one you will get for that code point if you look it */
+  /*    up in the standard Unicode cmap.  A non-default variant is a       */
+  /*    different glyph.                                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_GetCharVariantIndex                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the glyph index of a given character code as modified by    */
+  /*    the variation selector.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      A handle to the source face object.                              */
+  /*                                                                       */
+  /*    charcode ::                                                        */
+  /*      The character code point in Unicode.                             */
+  /*                                                                       */
+  /*    variantSelector ::                                                 */
+  /*      The Unicode code point of the variation selector.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The glyph index.  0~means either `undefined character code', or    */
+  /*    `undefined selector code', or `no variation selector cmap          */
+  /*    subtable', or `current CharMap is not Unicode'.                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If you use FreeType to manipulate the contents of font files       */
+  /*    directly, be aware that the glyph index returned by this function  */
+  /*    doesn't always correspond to the internal indices used within      */
+  /*    the file.  This is done to ensure that value~0 always corresponds  */
+  /*    to the `missing glyph'.                                            */
+  /*                                                                       */
+  /*    This function is only meaningful if                                */
+  /*      a) the font has a variation selector cmap sub table,             */
+  /*    and                                                                */
+  /*      b) the current charmap has a Unicode encoding.                   */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.6                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt )
+  FT_Face_GetCharVariantIndex( FT_Face   face,
+                               FT_ULong  charcode,
+                               FT_ULong  variantSelector );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_GetCharVariantIsDefault                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Check whether this variant of this Unicode character is the one to */
+  /*    be found in the `cmap'.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      A handle to the source face object.                              */
+  /*                                                                       */
+  /*    charcode ::                                                        */
+  /*      The character codepoint in Unicode.                              */
+  /*                                                                       */
+  /*    variantSelector ::                                                 */
+  /*      The Unicode codepoint of the variation selector.                 */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    1~if found in the standard (Unicode) cmap, 0~if found in the       */
+  /*    variation selector cmap, or -1 if it is not a variant.             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is only meaningful if the font has a variation       */
+  /*    selector cmap subtable.                                            */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.6                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Int )
+  FT_Face_GetCharVariantIsDefault( FT_Face   face,
+                                   FT_ULong  charcode,
+                                   FT_ULong  variantSelector );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_GetVariantSelectors                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a zero-terminated list of Unicode variant selectors found   */
+  /*    in the font.                                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      A handle to the source face object.                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A pointer to an array of selector code points, or NULL if there is */
+  /*    no valid variant selector cmap subtable.                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The last item in the array is~0; the array is owned by the         */
+  /*    @FT_Face object but can be overwritten or released on the next     */
+  /*    call to a FreeType function.                                       */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.6                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt32* )
+  FT_Face_GetVariantSelectors( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_GetVariantsOfChar                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a zero-terminated list of Unicode variant selectors found   */
+  /*    for the specified character code.                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      A handle to the source face object.                              */
+  /*                                                                       */
+  /*    charcode ::                                                        */
+  /*      The character codepoint in Unicode.                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A pointer to an array of variant selector code points which are    */
+  /*    active for the given character, or NULL if the corresponding list  */
+  /*    is empty.                                                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The last item in the array is~0; the array is owned by the         */
+  /*    @FT_Face object but can be overwritten or released on the next     */
+  /*    call to a FreeType function.                                       */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.6                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt32* )
+  FT_Face_GetVariantsOfChar( FT_Face   face,
+                             FT_ULong  charcode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_GetCharsOfVariant                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a zero-terminated list of Unicode character codes found for */
+  /*    the specified variant selector.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      A handle to the source face object.                              */
+  /*                                                                       */
+  /*    variantSelector ::                                                 */
+  /*      The variant selector code point in Unicode.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A list of all the code points which are specified by this selector */
+  /*    (both default and non-default codes are returned) or NULL if there */
+  /*    is no valid cmap or the variant selector is invalid.               */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The last item in the array is~0; the array is owned by the         */
+  /*    @FT_Face object but can be overwritten or released on the next     */
+  /*    call to a FreeType function.                                       */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.6                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt32* )
+  FT_Face_GetCharsOfVariant( FT_Face   face,
+                             FT_ULong  variantSelector );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    computations                                                       */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Computations                                                       */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Crunching fixed numbers and vectors.                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains various functions used to perform            */
+  /*    computations on 16.16 fixed-float numbers or 2d vectors.           */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_MulDiv                                                          */
+  /*    FT_MulFix                                                          */
+  /*    FT_DivFix                                                          */
+  /*    FT_RoundFix                                                        */
+  /*    FT_CeilFix                                                         */
+  /*    FT_FloorFix                                                        */
+  /*    FT_Vector_Transform                                                */
+  /*    FT_Matrix_Multiply                                                 */
+  /*    FT_Matrix_Invert                                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_MulDiv                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to perform the computation `(a*b)/c'   */
+  /*    with maximum accuracy (it uses a 64-bit intermediate integer       */
+  /*    whenever necessary).                                               */
+  /*                                                                       */
+  /*    This function isn't necessarily as fast as some processor specific */
+  /*    operations, but is at least completely portable.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The first multiplier.                                         */
+  /*    b :: The second multiplier.                                        */
+  /*    c :: The divisor.                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a*b)/c'.  This function never traps when trying to */
+  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */
+  /*    on the signs of `a' and `b'.                                       */
+  /*                                                                       */
+  FT_EXPORT( FT_Long )
+  FT_MulDiv( FT_Long  a,
+             FT_Long  b,
+             FT_Long  c );
+
+
+  /* */
+
+  /* The following #if 0 ... #endif is for the documentation formatter, */
+  /* hiding the internal `FT_MULFIX_INLINED' macro.                     */
+
+#if 0
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_MulFix                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to perform the computation             */
+  /*    `(a*b)/0x10000' with maximum accuracy.  Most of the time this is   */
+  /*    used to multiply a given value by a 16.16 fixed-point factor.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The first multiplier.                                         */
+  /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */
+  /*         possible (see note below).                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a*b)/0x10000'.                                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function has been optimized for the case where the absolute   */
+  /*    value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */
+  /*    As this happens mainly when scaling from notional units to         */
+  /*    fractional pixels in FreeType, it resulted in noticeable speed     */
+  /*    improvements between versions 2.x and 1.x.                         */
+  /*                                                                       */
+  /*    As a conclusion, always try to place a 16.16 factor as the         */
+  /*    _second_ argument of this function; this can make a great          */
+  /*    difference.                                                        */
+  /*                                                                       */
+  FT_EXPORT( FT_Long )
+  FT_MulFix( FT_Long  a,
+             FT_Long  b );
+
+  /* */
+#endif
+
+#ifdef FT_MULFIX_INLINED
+#define FPDFAPI_FT_MulFix( a, b )  FT_MULFIX_INLINED( a, b )
+#else
+  FT_EXPORT( FT_Long )
+  FT_MulFix( FT_Long  a,
+             FT_Long  b );
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_DivFix                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to perform the computation             */
+  /*    `(a*0x10000)/b' with maximum accuracy.  Most of the time, this is  */
+  /*    used to divide a given value by a 16.16 fixed-point factor.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The first multiplier.                                         */
+  /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */
+  /*         possible (see note below).                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a*0x10000)/b'.                                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The optimization for FT_DivFix() is simple: If (a~<<~16) fits in   */
+  /*    32~bits, then the division is computed directly.  Otherwise, we    */
+  /*    use a specialized version of @FT_MulDiv.                           */
+  /*                                                                       */
+  FT_EXPORT( FT_Long )
+  FT_DivFix( FT_Long  a,
+             FT_Long  b );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_RoundFix                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to round a 16.16 fixed number.         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The number to be rounded.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a + 0x8000) & -0x10000'.                           */
+  /*                                                                       */
+  FT_EXPORT( FT_Fixed )
+  FT_RoundFix( FT_Fixed  a );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_CeilFix                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to compute the ceiling function of a   */
+  /*    16.16 fixed number.                                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The number for which the ceiling function is to be computed.  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a + 0x10000 - 1) & -0x10000'.                      */
+  /*                                                                       */
+  FT_EXPORT( FT_Fixed )
+  FT_CeilFix( FT_Fixed  a );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_FloorFix                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to compute the floor function of a     */
+  /*    16.16 fixed number.                                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The number for which the floor function is to be computed.    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `a & -0x10000'.                                      */
+  /*                                                                       */
+  FT_EXPORT( FT_Fixed )
+  FT_FloorFix( FT_Fixed  a );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Vector_Transform                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Transform a single vector through a 2x2 matrix.                    */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    vector :: The target vector to transform.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    matrix :: A pointer to the source 2x2 matrix.                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The result is undefined if either `vector' or `matrix' is invalid. */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Vector_Transform( FT_Vector*        vec,
+                       const FT_Matrix*  matrix );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    version                                                            */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    FreeType Version                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Functions and macros related to FreeType versions.                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Note that those functions and macros are of limited use because    */
+  /*    even a new release of FreeType with only documentation changes     */
+  /*    increases the version number.                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @enum:
+   *   FREETYPE_XXX
+   *
+   * @description:
+   *   These three macros identify the FreeType source code version.
+   *   Use @FT_Library_Version to access them at runtime.
+   *
+   * @values:
+   *   FREETYPE_MAJOR :: The major version number.
+   *   FREETYPE_MINOR :: The minor version number.
+   *   FREETYPE_PATCH :: The patch level.
+   *
+   * @note:
+   *   The version number of FreeType if built as a dynamic link library
+   *   with the `libtool' package is _not_ controlled by these three
+   *   macros.
+   *
+   */
+#define FREETYPE_MAJOR  2
+#define FREETYPE_MINOR  5
+#define FREETYPE_PATCH  0
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Library_Version                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the version of the FreeType library being used.  This is    */
+  /*    useful when dynamically linking to the library, since one cannot   */
+  /*    use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and               */
+  /*    @FREETYPE_PATCH.                                                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A source library handle.                                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amajor  :: The major version number.                               */
+  /*                                                                       */
+  /*    aminor  :: The minor version number.                               */
+  /*                                                                       */
+  /*    apatch  :: The patch version number.                               */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The reason why this function takes a `library' argument is because */
+  /*    certain programs implement library initialization in a custom way  */
+  /*    that doesn't use @FT_Init_FreeType.                                */
+  /*                                                                       */
+  /*    In such cases, the library version might not be available before   */
+  /*    the library object has been created.                               */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Library_Version( FT_Library   library,
+                      FT_Int      *amajor,
+                      FT_Int      *aminor,
+                      FT_Int      *apatch );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_CheckTrueTypePatents                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parse all bytecode instructions of a TrueType font file to check   */
+  /*    whether any of the patented opcodes are used.  This is only useful */
+  /*    if you want to be able to use the unpatented hinter with           */
+  /*    fonts that do *not* use these opcodes.                             */
+  /*                                                                       */
+  /*    Note that this function parses *all* glyph instructions in the     */
+  /*    font file, which may be slow.                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A face handle.                                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    1~if this is a TrueType font that uses one of the patented         */
+  /*    opcodes, 0~otherwise.                                              */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Since May 2010, TrueType hinting is no longer patented.            */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.5                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Bool )
+  FT_Face_CheckTrueTypePatents( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_SetUnpatentedHinting                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Enable or disable the unpatented hinter for a given face.          */
+  /*    Only enable it if you have determined that the face doesn't        */
+  /*    use any patented opcodes (see @FT_Face_CheckTrueTypePatents).      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face  :: A face handle.                                            */
+  /*                                                                       */
+  /*    value :: New boolean setting.                                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The old setting value.  This will always be false if this is not   */
+  /*    an SFNT font, or if the unpatented hinter is not compiled in this  */
+  /*    instance of the library.                                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Since May 2010, TrueType hinting is no longer patented.            */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.5                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Bool )
+  FT_Face_SetUnpatentedHinting( FT_Face  face,
+                                FT_Bool  value );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FREETYPE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftadvanc.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftadvanc.h
new file mode 100644
index 0000000..0163ba1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftadvanc.h
@@ -0,0 +1,182 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftadvanc.h                                                             */
+/*                                                                         */
+/*    Quick computation of advance widths (specification only).            */
+/*                                                                         */
+/*  Copyright 2008, 2013 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTADVANC_H__
+#define __FTADVANC_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   quick_advance
+   *
+   * @title:
+   *   Quick retrieval of advance values
+   *
+   * @abstract:
+   *   Retrieve horizontal and vertical advance values without processing
+   *   glyph outlines, if possible.
+   *
+   * @description:
+   *   This section contains functions to quickly extract advance values
+   *   without handling glyph outlines, if possible.
+   */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Const>                                                               */
+  /*    FT_ADVANCE_FLAG_FAST_ONLY                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A bit-flag to be OR-ed with the `flags' parameter of the           */
+  /*    @FT_Get_Advance and @FT_Get_Advances functions.                    */
+  /*                                                                       */
+  /*    If set, it indicates that you want these functions to fail if the  */
+  /*    corresponding hinting mode or font driver doesn't allow for very   */
+  /*    quick advance computation.                                         */
+  /*                                                                       */
+  /*    Typically, glyphs which are either unscaled, unhinted, bitmapped,  */
+  /*    or light-hinted can have their advance width computed very         */
+  /*    quickly.                                                           */
+  /*                                                                       */
+  /*    Normal and bytecode hinted modes, which require loading, scaling,  */
+  /*    and hinting of the glyph outline, are extremely slow by            */
+  /*    comparison.                                                        */
+  /*                                                                       */
+#define FT_ADVANCE_FLAG_FAST_ONLY  0x20000000UL
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Advance                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the advance value of a given glyph outline in an          */
+  /*    @FT_Face.                                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: The source @FT_Face handle.                          */
+  /*                                                                       */
+  /*    gindex     :: The glyph index.                                     */
+  /*                                                                       */
+  /*    load_flags :: A set of bit flags similar to those used when        */
+  /*                  calling @FT_Load_Glyph, used to determine what kind  */
+  /*                  of advances you need.                                */
+  /* <Output>                                                              */
+  /*    padvance :: The advance value.  If scaling is performed (based on  */
+  /*                the value of `load_flags'), the advance value is in    */
+  /*                16.16 format.  Otherwise, it is in font units.         */
+  /*                                                                       */
+  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, this is the        */
+  /*                vertical advance corresponding to a vertical layout.   */
+  /*                Otherwise, it is the horizontal advance in a           */
+  /*                horizontal layout.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */
+  /*    if the corresponding font backend doesn't have a quick way to      */
+  /*    retrieve the advances.                                             */
+  /*                                                                       */
+  /*    A scaled advance is returned in 16.16 format but isn't transformed */
+  /*    by the affine transformation specified by @FT_Set_Transform.       */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Advance( FT_Face    face,
+                  FT_UInt    gindex,
+                  FT_Int32   load_flags,
+                  FT_Fixed  *padvance );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Advances                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the advance values of several glyph outlines in an        */
+  /*    @FT_Face.                                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: The source @FT_Face handle.                         */
+  /*                                                                       */
+  /*    start       :: The first glyph index.                              */
+  /*                                                                       */
+  /*    count       :: The number of advance values you want to retrieve.  */
+  /*                                                                       */
+  /*    load_flags  :: A set of bit flags similar to those used when       */
+  /*                   calling @FT_Load_Glyph.                             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    padvance :: The advance values.  This array, to be provided by the */
+  /*                caller, must contain at least `count' elements.        */
+  /*                                                                       */
+  /*                If scaling is performed (based on the value of         */
+  /*                `load_flags'), the advance values are in 16.16 format. */
+  /*                Otherwise, they are in font units.                     */
+  /*                                                                       */
+  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, these are the      */
+  /*                vertical advances corresponding to a vertical layout.  */
+  /*                Otherwise, they are the horizontal advances in a       */
+  /*                horizontal layout.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */
+  /*    if the corresponding font backend doesn't have a quick way to      */
+  /*    retrieve the advances.                                             */
+  /*                                                                       */
+  /*    Scaled advances are returned in 16.16 format but aren't            */
+  /*    transformed by the affine transformation specified by              */
+  /*    @FT_Set_Transform.                                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Advances( FT_Face    face,
+                   FT_UInt    start,
+                   FT_UInt    count,
+                   FT_Int32   load_flags,
+                   FT_Fixed  *padvances );
+
+/* */
+
+
+FT_END_HEADER
+
+#endif /* __FTADVANC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftautoh.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftautoh.h
new file mode 100644
index 0000000..6edd9f4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftautoh.h
@@ -0,0 +1,357 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftautoh.h                                                              */
+/*                                                                         */
+/*    FreeType API for controlling the auto-hinter (specification only).   */
+/*                                                                         */
+/*  Copyright 2012, 2013 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTAUTOH_H__
+#define __FTAUTOH_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   auto_hinter
+   *
+   * @title:
+   *   The auto-hinter
+   *
+   * @abstract:
+   *   Controlling the auto-hinting module.
+   *
+   * @description:
+   *   While FreeType's auto-hinter doesn't expose API functions by itself,
+   *   it is possible to control its behaviour with @FT_Property_Set and
+   *   @FT_Property_Get.  The following lists the available properties
+   *   together with the necessary macros and structures.
+   *
+   *   Note that the auto-hinter's module name is `autofitter' for
+   *   historical reasons.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   glyph-to-script-map
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   The auto-hinter provides various script modules to hint glyphs.
+   *   Examples of supported scripts are Latin or CJK.  Before a glyph is
+   *   auto-hinted, the Unicode character map of the font gets examined, and
+   *   the script is then determined based on Unicode character ranges, see
+   *   below.
+   *
+   *   OpenType fonts, however, often provide much more glyphs than
+   *   character codes (small caps, superscripts, ligatures, swashes, etc.),
+   *   to be controlled by so-called `features'.  Handling OpenType features
+   *   can be quite complicated and thus needs a separate library on top of
+   *   FreeType.
+   *
+   *   The mapping between glyph indices and scripts (in the auto-hinter
+   *   sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an
+   *   array with `num_glyphs' elements, as found in the font's @FT_Face
+   *   structure.  The `glyph-to-script-map' property returns a pointer to
+   *   this array which can be modified as needed.  Note that the
+   *   modification should happen before the first glyph gets processed by
+   *   the auto-hinter so that the global analysis of the font shapes
+   *   actually uses the modified mapping.
+   *
+   *   The following example code demonstrates how to access it (omitting
+   *   the error handling).
+   *
+   *   {
+   *     FT_Library                library;
+   *     FT_Face                   face;
+   *     FT_Prop_GlyphToScriptMap  prop;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *     FT_New_Face( library, "foo.ttf", 0, &face );
+   *
+   *     prop.face = face;
+   *
+   *     FT_Property_Get( library, "autofitter",
+   *                               "glyph-to-script-map", &prop );
+   *
+   *     // adjust `prop.map' as needed right here
+   *
+   *     FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
+   *   }
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   FT_AUTOHINTER_SCRIPT_XXX
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   A list of constants used for the @glyph-to-script-map property to
+   *   specify the script submodule the auto-hinter should use for hinting a
+   *   particular glyph.
+   *
+   * @values:
+   *   FT_AUTOHINTER_SCRIPT_NONE ::
+   *     Don't auto-hint this glyph.
+   *
+   *   FT_AUTOHINTER_SCRIPT_LATIN ::
+   *     Apply the latin auto-hinter.  For the auto-hinter, `latin' is a
+   *     very broad term, including Cyrillic and Greek also since characters
+   *     from those scripts share the same design constraints.
+   *
+   *     By default, characters from the following Unicode ranges are
+   *     assigned to this submodule.
+   *
+   *     {
+   *       U+0020 - U+007F  // Basic Latin (no control characters)
+   *       U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)
+   *       U+0100 - U+017F  // Latin Extended-A
+   *       U+0180 - U+024F  // Latin Extended-B
+   *       U+0250 - U+02AF  // IPA Extensions
+   *       U+02B0 - U+02FF  // Spacing Modifier Letters
+   *       U+0300 - U+036F  // Combining Diacritical Marks
+   *       U+0370 - U+03FF  // Greek and Coptic
+   *       U+0400 - U+04FF  // Cyrillic
+   *       U+0500 - U+052F  // Cyrillic Supplement
+   *       U+1D00 - U+1D7F  // Phonetic Extensions
+   *       U+1D80 - U+1DBF  // Phonetic Extensions Supplement
+   *       U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement
+   *       U+1E00 - U+1EFF  // Latin Extended Additional
+   *       U+1F00 - U+1FFF  // Greek Extended
+   *       U+2000 - U+206F  // General Punctuation
+   *       U+2070 - U+209F  // Superscripts and Subscripts
+   *       U+20A0 - U+20CF  // Currency Symbols
+   *       U+2150 - U+218F  // Number Forms
+   *       U+2460 - U+24FF  // Enclosed Alphanumerics
+   *       U+2C60 - U+2C7F  // Latin Extended-C
+   *       U+2DE0 - U+2DFF  // Cyrillic Extended-A
+   *       U+2E00 - U+2E7F  // Supplemental Punctuation
+   *       U+A640 - U+A69F  // Cyrillic Extended-B
+   *       U+A720 - U+A7FF  // Latin Extended-D
+   *       U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)
+   *      U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
+   *      U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
+   *     }
+   *
+   *   FT_AUTOHINTER_SCRIPT_CJK ::
+   *     Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old
+   *     Vietnamese, and some other scripts.
+   *
+   *     By default, characters from the following Unicode ranges are
+   *     assigned to this submodule.
+   *
+   *     {
+   *       U+1100 - U+11FF  // Hangul Jamo
+   *       U+2E80 - U+2EFF  // CJK Radicals Supplement
+   *       U+2F00 - U+2FDF  // Kangxi Radicals
+   *       U+2FF0 - U+2FFF  // Ideographic Description Characters
+   *       U+3000 - U+303F  // CJK Symbols and Punctuation
+   *       U+3040 - U+309F  // Hiragana
+   *       U+30A0 - U+30FF  // Katakana
+   *       U+3100 - U+312F  // Bopomofo
+   *       U+3130 - U+318F  // Hangul Compatibility Jamo
+   *       U+3190 - U+319F  // Kanbun
+   *       U+31A0 - U+31BF  // Bopomofo Extended
+   *       U+31C0 - U+31EF  // CJK Strokes
+   *       U+31F0 - U+31FF  // Katakana Phonetic Extensions
+   *       U+3200 - U+32FF  // Enclosed CJK Letters and Months
+   *       U+3300 - U+33FF  // CJK Compatibility
+   *       U+3400 - U+4DBF  // CJK Unified Ideographs Extension A
+   *       U+4DC0 - U+4DFF  // Yijing Hexagram Symbols
+   *       U+4E00 - U+9FFF  // CJK Unified Ideographs
+   *       U+A960 - U+A97F  // Hangul Jamo Extended-A
+   *       U+AC00 - U+D7AF  // Hangul Syllables
+   *       U+D7B0 - U+D7FF  // Hangul Jamo Extended-B
+   *       U+F900 - U+FAFF  // CJK Compatibility Ideographs
+   *       U+FE10 - U+FE1F  // Vertical forms
+   *       U+FE30 - U+FE4F  // CJK Compatibility Forms
+   *       U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms
+   *      U+1B000 - U+1B0FF // Kana Supplement
+   *      U+1D300 - U+1D35F // Tai Xuan Hing Symbols
+   *      U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
+   *      U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
+   *      U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
+   *      U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
+   *      U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
+   *     }
+   *
+   *   FT_AUTOHINTER_SCRIPT_INDIC ::
+   *     Apply the indic auto-hinter, covering all major scripts from the
+   *     Indian sub-continent and some other related scripts like Thai, Lao,
+   *     or Tibetan.
+   *
+   *     By default, characters from the following Unicode ranges are
+   *     assigned to this submodule.
+   *
+   *     {
+   *       U+0900 - U+0DFF  // Indic Range
+   *       U+0F00 - U+0FFF  // Tibetan
+   *       U+1900 - U+194F  // Limbu
+   *       U+1B80 - U+1BBF  // Sundanese
+   *       U+1C80 - U+1CDF  // Meetei Mayak
+   *       U+A800 - U+A82F  // Syloti Nagri
+   *      U+11800 - U+118DF // Sharada
+   *     }
+   *
+   *     Note that currently Indic support is rudimentary only, missing blue
+   *     zone support.
+   *
+   */
+#define FT_AUTOHINTER_SCRIPT_NONE   0
+#define FT_AUTOHINTER_SCRIPT_LATIN  1
+#define FT_AUTOHINTER_SCRIPT_CJK    2
+#define FT_AUTOHINTER_SCRIPT_INDIC  3
+
+
+  /**************************************************************************
+   *
+   * @struct:
+   *   FT_Prop_GlyphToScriptMap
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   The data exchange structure for the @glyph-to-script-map property.
+   *
+   */
+   typedef struct  FT_Prop_GlyphToScriptMap_
+   {
+     FT_Face   face;
+     FT_Byte*  map;
+
+   } FT_Prop_GlyphToScriptMap;
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   fallback-script
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   If no auto-hinter script module can be assigned to a glyph, a
+   *   fallback script gets assigned to it (see also the
+   *   @glyph-to-script-map property).  By default, this is
+   *   @FT_AUTOHINTER_SCRIPT_CJK.  Using the `fallback-script' property,
+   *   this fallback value can be changed.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "autofitter",
+   *                               "fallback-script", &fallback_script );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   It's important to use the right timing for changing this value: The
+   *   creation of the glyph-to-script map which eventually uses the
+   *   fallback script value gets triggered either by setting or reading a
+   *   face-specific property like @glyph-to-script-map, or by auto-hinting
+   *   any glyph from that face.  In particular, if you have already created
+   *   an @FT_Face structure but not loaded any glyph (using the
+   *   auto-hinter), a change of the fallback glyph will affect this face.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   increase-x-height
+   *
+   * @description:
+   *   For ppem values in the range 6~<= ppem <= `increase-x-height', round
+   *   up the font's x~height much more often than normally.  If the value
+   *   is set to~0, which is the default, this feature is switched off.  Use
+   *   this property to improve the legibility of small font sizes if
+   *   necessary.
+   *
+   *   {
+   *     FT_Library               library;
+   *     FT_Face                  face;
+   *     FT_Prop_IncreaseXHeight  prop;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *     FT_New_Face( library, "foo.ttf", 0, &face );
+   *     FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
+   *
+   *     prop.face  = face;
+   *     prop.limit = 14;
+   *
+   *     FT_Property_Set( library, "autofitter",
+   *                               "increase-x-height", &prop );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   Set this value right after calling @FT_Set_Char_Size, but before
+   *   loading any glyph (using the auto-hinter).
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @struct:
+   *   FT_Prop_IncreaseXHeight
+   *
+   * @description:
+   *   The data exchange structure for the @increase-x-height property.
+   *
+   */
+   typedef struct  FT_Prop_IncreaseXHeight_
+   {
+     FT_Face  face;
+     FT_UInt  limit;
+
+   } FT_Prop_IncreaseXHeight;
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTAUTOH_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbbox.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbbox.h
new file mode 100644
index 0000000..5f54246
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbbox.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbbox.h                                                               */
+/*                                                                         */
+/*    FreeType exact bbox computation (specification).                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2007, 2011 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This component has a _single_ role: to compute exact outline bounding */
+  /* boxes.                                                                */
+  /*                                                                       */
+  /* It is separated from the rest of the engine for various technical     */
+  /* reasons.  It may well be integrated in `ftoutln' later.               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTBBOX_H__
+#define __FTBBOX_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    outline_processing                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Get_BBox                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Compute the exact bounding box of an outline.  This is slower      */
+  /*    than computing the control box.  However, it uses an advanced      */
+  /*    algorithm which returns _very_ quickly when the two boxes          */
+  /*    coincide.  Otherwise, the outline Bézier arcs are traversed to     */
+  /*    extract their extrema.                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline :: A pointer to the source outline.                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    abbox   :: The outline's exact bounding box.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If the font is tricky and the glyph has been loaded with           */
+  /*    @FT_LOAD_NO_SCALE, the resulting BBox is meaningless.  To get      */
+  /*    reasonable values for the BBox it is necessary to load the glyph   */
+  /*    at a large ppem value (so that the hinting instructions can        */
+  /*    properly shift and scale the subglyphs), then extracting the BBox  */
+  /*    which can be eventually converted back to font units.              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Get_BBox( FT_Outline*  outline,
+                       FT_BBox     *abbox );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBBOX_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbdf.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbdf.h
new file mode 100644
index 0000000..c4721bc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbdf.h
@@ -0,0 +1,209 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbdf.h                                                                */
+/*                                                                         */
+/*    FreeType API for accessing BDF-specific strings (specification).     */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2006, 2009 by                              */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTBDF_H__
+#define __FTBDF_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    bdf_fonts                                                          */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    BDF and PCF Files                                                  */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    BDF and PCF specific API.                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of functions specific to BDF */
+  /*    and PCF fonts.                                                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /**********************************************************************
+   *
+   * @enum:
+   *    FT_PropertyType
+   *
+   * @description:
+   *    A list of BDF property types.
+   *
+   * @values:
+   *    BDF_PROPERTY_TYPE_NONE ::
+   *      Value~0 is used to indicate a missing property.
+   *
+   *    BDF_PROPERTY_TYPE_ATOM ::
+   *      Property is a string atom.
+   *
+   *    BDF_PROPERTY_TYPE_INTEGER ::
+   *      Property is a 32-bit signed integer.
+   *
+   *    BDF_PROPERTY_TYPE_CARDINAL ::
+   *      Property is a 32-bit unsigned integer.
+   */
+  typedef enum  BDF_PropertyType_
+  {
+    BDF_PROPERTY_TYPE_NONE     = 0,
+    BDF_PROPERTY_TYPE_ATOM     = 1,
+    BDF_PROPERTY_TYPE_INTEGER  = 2,
+    BDF_PROPERTY_TYPE_CARDINAL = 3
+
+  } BDF_PropertyType;
+
+
+  /**********************************************************************
+   *
+   * @type:
+   *    BDF_Property
+   *
+   * @description:
+   *    A handle to a @BDF_PropertyRec structure to model a given
+   *    BDF/PCF property.
+   */
+  typedef struct BDF_PropertyRec_*  BDF_Property;
+
+
+ /**********************************************************************
+  *
+  * @struct:
+  *    BDF_PropertyRec
+  *
+  * @description:
+  *    This structure models a given BDF/PCF property.
+  *
+  * @fields:
+  *    type ::
+  *      The property type.
+  *
+  *    u.atom ::
+  *      The atom string, if type is @BDF_PROPERTY_TYPE_ATOM.
+  *
+  *    u.integer ::
+  *      A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER.
+  *
+  *    u.cardinal ::
+  *      An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL.
+  */
+  typedef struct  BDF_PropertyRec_
+  {
+    BDF_PropertyType  type;
+    union {
+      const char*     atom;
+      FT_Int32        integer;
+      FT_UInt32       cardinal;
+
+    } u;
+
+  } BDF_PropertyRec;
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_BDF_Charset_ID
+  *
+  * @description:
+  *    Retrieve a BDF font character set identity, according to
+  *    the BDF specification.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  * @output:
+  *    acharset_encoding ::
+  *       Charset encoding, as a C~string, owned by the face.
+  *
+  *    acharset_registry ::
+  *       Charset registry, as a C~string, owned by the face.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   This function only works with BDF faces, returning an error otherwise.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_BDF_Charset_ID( FT_Face       face,
+                         const char*  *acharset_encoding,
+                         const char*  *acharset_registry );
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_BDF_Property
+  *
+  * @description:
+  *    Retrieve a BDF property from a BDF or PCF font file.
+  *
+  * @input:
+  *    face :: A handle to the input face.
+  *
+  *    name :: The property name.
+  *
+  * @output:
+  *    aproperty :: The property.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   This function works with BDF _and_ PCF fonts.  It returns an error
+  *   otherwise.  It also returns an error if the property is not in the
+  *   font.
+  *
+  *   A `property' is a either key-value pair within the STARTPROPERTIES
+  *   ... ENDPROPERTIES block of a BDF font or a key-value pair from the
+  *   `info->props' array within a `FontRec' structure of a PCF font.
+  *
+  *   Integer properties are always stored as `signed' within PCF fonts;
+  *   consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value
+  *   for BDF fonts only.
+  *
+  *   In case of error, `aproperty->type' is always set to
+  *   @BDF_PROPERTY_TYPE_NONE.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_BDF_Property( FT_Face           face,
+                       const char*       prop_name,
+                       BDF_PropertyRec  *aproperty );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTBDF_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbitmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbitmap.h
new file mode 100644
index 0000000..9640790
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbitmap.h
@@ -0,0 +1,227 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbitmap.h                                                             */
+/*                                                                         */
+/*    FreeType utility functions for bitmaps (specification).              */
+/*                                                                         */
+/*  Copyright 2004-2006, 2008, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTBITMAP_H__
+#define __FTBITMAP_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    bitmap_handling                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Bitmap Handling                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Handling FT_Bitmap objects.                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains functions for converting FT_Bitmap objects.  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_New                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a pointer to an @FT_Bitmap structure.                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    abitmap :: A pointer to the bitmap structure.                      */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Bitmap_New( FT_Bitmap  *abitmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_Copy                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Copy a bitmap into another one.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a library object.                           */
+  /*                                                                       */
+  /*    source  :: A handle to the source bitmap.                          */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    target  :: A handle to the target bitmap.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Copy( FT_Library        library,
+                  const FT_Bitmap  *source,
+                  FT_Bitmap        *target);
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_Embolden                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Embolden a bitmap.  The new bitmap will be about `xStrength'       */
+  /*    pixels wider and `yStrength' pixels higher.  The left and bottom   */
+  /*    borders are kept unchanged.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library   :: A handle to a library object.                         */
+  /*                                                                       */
+  /*    xStrength :: How strong the glyph is emboldened horizontally.      */
+  /*                 Expressed in 26.6 pixel format.                       */
+  /*                                                                       */
+  /*    yStrength :: How strong the glyph is emboldened vertically.        */
+  /*                 Expressed in 26.6 pixel format.                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    bitmap    :: A handle to the target bitmap.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The current implementation restricts `xStrength' to be less than   */
+  /*    or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO.      */
+  /*                                                                       */
+  /*    If you want to embolden the bitmap owned by a @FT_GlyphSlotRec,    */
+  /*    you should call @FT_GlyphSlot_Own_Bitmap on the slot first.        */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Embolden( FT_Library  library,
+                      FT_Bitmap*  bitmap,
+                      FT_Pos      xStrength,
+                      FT_Pos      yStrength );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_Convert                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp */
+  /*    to a bitmap object with depth 8bpp, making the number of used      */
+  /*    bytes line (a.k.a. the `pitch') a multiple of `alignment'.         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library   :: A handle to a library object.                         */
+  /*                                                                       */
+  /*    source    :: The source bitmap.                                    */
+  /*                                                                       */
+  /*    alignment :: The pitch of the bitmap is a multiple of this         */
+  /*                 parameter.  Common values are 1, 2, or 4.             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    target    :: The target bitmap.                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    It is possible to call @FT_Bitmap_Convert multiple times without   */
+  /*    calling @FT_Bitmap_Done (the memory is simply reallocated).        */
+  /*                                                                       */
+  /*    Use @FT_Bitmap_Done to finally remove the bitmap object.           */
+  /*                                                                       */
+  /*    The `library' argument is taken to have access to FreeType's       */
+  /*    memory handling functions.                                         */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Convert( FT_Library        library,
+                     const FT_Bitmap  *source,
+                     FT_Bitmap        *target,
+                     FT_Int            alignment );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_GlyphSlot_Own_Bitmap                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Make sure that a glyph slot owns `slot->bitmap'.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot :: The glyph slot.                                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is to be used in combination with                    */
+  /*    @FT_Bitmap_Embolden.                                               */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_Done                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy a bitmap object created with @FT_Bitmap_New.               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a library object.                           */
+  /*                                                                       */
+  /*    bitmap  :: The bitmap object to be freed.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `library' argument is taken to have access to FreeType's       */
+  /*    memory handling functions.                                         */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Done( FT_Library  library,
+                  FT_Bitmap  *bitmap );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBITMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbzip2.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbzip2.h
new file mode 100644
index 0000000..654b222
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbzip2.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbzip2.h                                                              */
+/*                                                                         */
+/*    Bzip2-compressed stream support.                                     */
+/*                                                                         */
+/*  Copyright 2010 by                                                      */
+/*  Joel Klinghed.                                                         */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTBZIP2_H__
+#define __FTBZIP2_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    bzip2                                                              */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    BZIP2 Streams                                                      */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Using bzip2-compressed font files.                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of Bzip2-specific functions. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+ /************************************************************************
+  *
+  * @function:
+  *   FT_Stream_OpenBzip2
+  *
+  * @description:
+  *   Open a new stream to parse bzip2-compressed font files.  This is
+  *   mainly used to support the compressed `*.pcf.bz2' fonts that come
+  *   with XFree86.
+  *
+  * @input:
+  *   stream ::
+  *     The target embedding stream.
+  *
+  *   source ::
+  *     The source stream.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   The source stream must be opened _before_ calling this function.
+  *
+  *   Calling the internal function `FT_Stream_Close' on the new stream will
+  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream
+  *   objects will be released to the heap.
+  *
+  *   The stream implementation is very basic and resets the decompression
+  *   process each time seeking backwards is needed within the stream.
+  *
+  *   In certain builds of the library, bzip2 compression recognition is
+  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.
+  *   This means that if no font driver is capable of handling the raw
+  *   compressed file, the library will try to open a bzip2 compressed stream
+  *   from it and re-open the face with it.
+  *
+  *   This function may return `FT_Err_Unimplemented_Feature' if your build
+  *   of FreeType was not compiled with bzip2 support.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Stream_OpenBzip2( FT_Stream  stream,
+                       FT_Stream  source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBZIP2_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcache.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcache.h
new file mode 100644
index 0000000..404b0fa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcache.h
@@ -0,0 +1,1057 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcache.h                                                              */
+/*                                                                         */
+/*    FreeType Cache subsystem (specification).                            */
+/*                                                                         */
+/*  Copyright 1996-2008, 2010, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCACHE_H__
+#define __FTCACHE_H__
+
+
+#include "../ft2build.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************
+   *
+   * <Section>
+   *    cache_subsystem
+   *
+   * <Title>
+   *    Cache Sub-System
+   *
+   * <Abstract>
+   *    How to cache face, size, and glyph data with FreeType~2.
+   *
+   * <Description>
+   *   This section describes the FreeType~2 cache sub-system, which is used
+   *   to limit the number of concurrently opened @FT_Face and @FT_Size
+   *   objects, as well as caching information like character maps and glyph
+   *   images while limiting their maximum memory usage.
+   *
+   *   Note that all types and functions begin with the `FTC_' prefix.
+   *
+   *   The cache is highly portable and thus doesn't know anything about the
+   *   fonts installed on your system, or how to access them.  This implies
+   *   the following scheme:
+   *
+   *   First, available or installed font faces are uniquely identified by
+   *   @FTC_FaceID values, provided to the cache by the client.  Note that
+   *   the cache only stores and compares these values, and doesn't try to
+   *   interpret them in any way.
+   *
+   *   Second, the cache calls, only when needed, a client-provided function
+   *   to convert an @FTC_FaceID into a new @FT_Face object.  The latter is
+   *   then completely managed by the cache, including its termination
+   *   through @FT_Done_Face.  To monitor termination of face objects, the
+   *   finalizer callback in the `generic' field of the @FT_Face object can
+   *   be used, which might also be used to store the @FTC_FaceID of the
+   *   face.
+   *
+   *   Clients are free to map face IDs to anything else.  The most simple
+   *   usage is to associate them to a (pathname,face_index) pair that is
+   *   used to call @FT_New_Face.  However, more complex schemes are also
+   *   possible.
+   *
+   *   Note that for the cache to work correctly, the face ID values must be
+   *   *persistent*, which means that the contents they point to should not
+   *   change at runtime, or that their value should not become invalid.
+   *
+   *   If this is unavoidable (e.g., when a font is uninstalled at runtime),
+   *   you should call @FTC_Manager_RemoveFaceID as soon as possible, to let
+   *   the cache get rid of any references to the old @FTC_FaceID it may
+   *   keep internally.  Failure to do so will lead to incorrect behaviour
+   *   or even crashes.
+   *
+   *   To use the cache, start with calling @FTC_Manager_New to create a new
+   *   @FTC_Manager object, which models a single cache instance.  You can
+   *   then look up @FT_Face and @FT_Size objects with
+   *   @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively.
+   *
+   *   If you want to use the charmap caching, call @FTC_CMapCache_New, then
+   *   later use @FTC_CMapCache_Lookup to perform the equivalent of
+   *   @FT_Get_Char_Index, only much faster.
+   *
+   *   If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then
+   *   later use @FTC_ImageCache_Lookup to retrieve the corresponding
+   *   @FT_Glyph objects from the cache.
+   *
+   *   If you need lots of small bitmaps, it is much more memory efficient
+   *   to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup.  This
+   *   returns @FTC_SBitRec structures, which are used to store small
+   *   bitmaps directly.  (A small bitmap is one whose metrics and
+   *   dimensions all fit into 8-bit integers).
+   *
+   *   We hope to also provide a kerning cache in the near future.
+   *
+   *
+   * <Order>
+   *   FTC_Manager
+   *   FTC_FaceID
+   *   FTC_Face_Requester
+   *
+   *   FTC_Manager_New
+   *   FTC_Manager_Reset
+   *   FTC_Manager_Done
+   *   FTC_Manager_LookupFace
+   *   FTC_Manager_LookupSize
+   *   FTC_Manager_RemoveFaceID
+   *
+   *   FTC_Node
+   *   FTC_Node_Unref
+   *
+   *   FTC_ImageCache
+   *   FTC_ImageCache_New
+   *   FTC_ImageCache_Lookup
+   *
+   *   FTC_SBit
+   *   FTC_SBitCache
+   *   FTC_SBitCache_New
+   *   FTC_SBitCache_Lookup
+   *
+   *   FTC_CMapCache
+   *   FTC_CMapCache_New
+   *   FTC_CMapCache_Lookup
+   *
+   *************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    BASIC TYPE DEFINITIONS                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @type: FTC_FaceID
+   *
+   * @description:
+   *   An opaque pointer type that is used to identity face objects.  The
+   *   contents of such objects is application-dependent.
+   *
+   *   These pointers are typically used to point to a user-defined
+   *   structure containing a font file path, and face index.
+   *
+   * @note:
+   *   Never use NULL as a valid @FTC_FaceID.
+   *
+   *   Face IDs are passed by the client to the cache manager, which calls,
+   *   when needed, the @FTC_Face_Requester to translate them into new
+   *   @FT_Face objects.
+   *
+   *   If the content of a given face ID changes at runtime, or if the value
+   *   becomes invalid (e.g., when uninstalling a font), you should
+   *   immediately call @FTC_Manager_RemoveFaceID before any other cache
+   *   function.
+   *
+   *   Failure to do so will result in incorrect behaviour or even
+   *   memory leaks and crashes.
+   */
+  typedef FT_Pointer  FTC_FaceID;
+
+
+  /************************************************************************
+   *
+   * @functype:
+   *   FTC_Face_Requester
+   *
+   * @description:
+   *   A callback function provided by client applications.  It is used by
+   *   the cache manager to translate a given @FTC_FaceID into a new valid
+   *   @FT_Face object, on demand.
+   *
+   * <Input>
+   *   face_id ::
+   *     The face ID to resolve.
+   *
+   *   library ::
+   *     A handle to a FreeType library object.
+   *
+   *   req_data ::
+   *     Application-provided request data (see note below).
+   *
+   * <Output>
+   *   aface ::
+   *     A new @FT_Face handle.
+   *
+   * <Return>
+   *   FreeType error code.  0~means success.
+   *
+   * <Note>
+   *   The third parameter `req_data' is the same as the one passed by the
+   *   client when @FTC_Manager_New is called.
+   *
+   *   The face requester should not perform funny things on the returned
+   *   face object, like creating a new @FT_Size for it, or setting a
+   *   transformation through @FT_Set_Transform!
+   */
+  typedef FT_Error
+  (*FTC_Face_Requester)( FTC_FaceID  face_id,
+                         FT_Library  library,
+                         FT_Pointer  request_data,
+                         FT_Face*    aface );
+
+ /* */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      CACHE MANAGER OBJECT                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_Manager                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This object corresponds to one instance of the cache-subsystem.    */
+  /*    It is used to cache one or more @FT_Face objects, along with       */
+  /*    corresponding @FT_Size objects.                                    */
+  /*                                                                       */
+  /*    The manager intentionally limits the total number of opened        */
+  /*    @FT_Face and @FT_Size objects to control memory usage.  See the    */
+  /*    `max_faces' and `max_sizes' parameters of @FTC_Manager_New.        */
+  /*                                                                       */
+  /*    The manager is also used to cache `nodes' of various types while   */
+  /*    limiting their total memory usage.                                 */
+  /*                                                                       */
+  /*    All limitations are enforced by keeping lists of managed objects   */
+  /*    in most-recently-used order, and flushing old nodes to make room   */
+  /*    for new ones.                                                      */
+  /*                                                                       */
+  typedef struct FTC_ManagerRec_*  FTC_Manager;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_Node                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An opaque handle to a cache node object.  Each cache node is       */
+  /*    reference-counted.  A node with a count of~0 might be flushed      */
+  /*    out of a full cache whenever a lookup request is performed.        */
+  /*                                                                       */
+  /*    If you look up nodes, you have the ability to `acquire' them,      */
+  /*    i.e., to increment their reference count.  This will prevent the   */
+  /*    node from being flushed out of the cache until you explicitly      */
+  /*    `release' it (see @FTC_Node_Unref).                                */
+  /*                                                                       */
+  /*    See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup.         */
+  /*                                                                       */
+  typedef struct FTC_NodeRec_*  FTC_Node;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_New                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new cache manager.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library   :: The parent FreeType library handle to use.            */
+  /*                                                                       */
+  /*    max_faces :: Maximum number of opened @FT_Face objects managed by  */
+  /*                 this cache instance.  Use~0 for defaults.             */
+  /*                                                                       */
+  /*    max_sizes :: Maximum number of opened @FT_Size objects managed by  */
+  /*                 this cache instance.  Use~0 for defaults.             */
+  /*                                                                       */
+  /*    max_bytes :: Maximum number of bytes to use for cached data nodes. */
+  /*                 Use~0 for defaults.  Note that this value does not    */
+  /*                 account for managed @FT_Face and @FT_Size objects.    */
+  /*                                                                       */
+  /*    requester :: An application-provided callback used to translate    */
+  /*                 face IDs into real @FT_Face objects.                  */
+  /*                                                                       */
+  /*    req_data  :: A generic pointer that is passed to the requester     */
+  /*                 each time it is called (see @FTC_Face_Requester).     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amanager  :: A handle to a new manager object.  0~in case of       */
+  /*                 failure.                                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_Manager_New( FT_Library          library,
+                   FT_UInt             max_faces,
+                   FT_UInt             max_sizes,
+                   FT_ULong            max_bytes,
+                   FTC_Face_Requester  requester,
+                   FT_Pointer          req_data,
+                   FTC_Manager        *amanager );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_Reset                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Empty a given cache manager.  This simply gets rid of all the      */
+  /*    currently cached @FT_Face and @FT_Size objects within the manager. */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    manager :: A handle to the manager.                                */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FTC_Manager_Reset( FTC_Manager  manager );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_Done                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy a given manager after emptying it.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: A handle to the target cache manager object.            */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FTC_Manager_Done( FTC_Manager  manager );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_LookupFace                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the @FT_Face object that corresponds to a given face ID   */
+  /*    through a cache manager.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: A handle to the cache manager.                          */
+  /*                                                                       */
+  /*    face_id :: The ID of the face object.                              */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aface   :: A handle to the face object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned @FT_Face object is always owned by the manager.  You  */
+  /*    should never try to discard it yourself.                           */
+  /*                                                                       */
+  /*    The @FT_Face object doesn't necessarily have a current size object */
+  /*    (i.e., face->size can be~0).  If you need a specific `font size',  */
+  /*    use @FTC_Manager_LookupSize instead.                               */
+  /*                                                                       */
+  /*    Never change the face's transformation matrix (i.e., never call    */
+  /*    the @FT_Set_Transform function) on a returned face!  If you need   */
+  /*    to transform glyphs, do it yourself after glyph loading.           */
+  /*                                                                       */
+  /*    When you perform a lookup, out-of-memory errors are detected       */
+  /*    _within_ the lookup and force incremental flushes of the cache     */
+  /*    until enough memory is released for the lookup to succeed.         */
+  /*                                                                       */
+  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */
+  /*    already been completely flushed, and still no memory was available */
+  /*    for the operation.                                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_Manager_LookupFace( FTC_Manager  manager,
+                          FTC_FaceID   face_id,
+                          FT_Face     *aface );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FTC_ScalerRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to describe a given character size in either      */
+  /*    pixels or points to the cache manager.  See                        */
+  /*    @FTC_Manager_LookupSize.                                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    face_id :: The source face ID.                                     */
+  /*                                                                       */
+  /*    width   :: The character width.                                    */
+  /*                                                                       */
+  /*    height  :: The character height.                                   */
+  /*                                                                       */
+  /*    pixel   :: A Boolean.  If 1, the `width' and `height' fields are   */
+  /*               interpreted as integer pixel character sizes.           */
+  /*               Otherwise, they are expressed as 1/64th of points.      */
+  /*                                                                       */
+  /*    x_res   :: Only used when `pixel' is value~0 to indicate the       */
+  /*               horizontal resolution in dpi.                           */
+  /*                                                                       */
+  /*    y_res   :: Only used when `pixel' is value~0 to indicate the       */
+  /*               vertical resolution in dpi.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This type is mainly used to retrieve @FT_Size objects through the  */
+  /*    cache manager.                                                     */
+  /*                                                                       */
+  typedef struct  FTC_ScalerRec_
+  {
+    FTC_FaceID  face_id;
+    FT_UInt     width;
+    FT_UInt     height;
+    FT_Int      pixel;
+    FT_UInt     x_res;
+    FT_UInt     y_res;
+
+  } FTC_ScalerRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FTC_Scaler                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an @FTC_ScalerRec structure.                           */
+  /*                                                                       */
+  typedef struct FTC_ScalerRec_*  FTC_Scaler;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_LookupSize                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the @FT_Size object that corresponds to a given           */
+  /*    @FTC_ScalerRec pointer through a cache manager.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: A handle to the cache manager.                          */
+  /*                                                                       */
+  /*    scaler  :: A scaler handle.                                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    asize   :: A handle to the size object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned @FT_Size object is always owned by the manager.  You  */
+  /*    should never try to discard it by yourself.                        */
+  /*                                                                       */
+  /*    You can access the parent @FT_Face object simply as `size->face'   */
+  /*    if you need it.  Note that this object is also owned by the        */
+  /*    manager.                                                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    When you perform a lookup, out-of-memory errors are detected       */
+  /*    _within_ the lookup and force incremental flushes of the cache     */
+  /*    until enough memory is released for the lookup to succeed.         */
+  /*                                                                       */
+  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */
+  /*    already been completely flushed, and still no memory is available  */
+  /*    for the operation.                                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_Manager_LookupSize( FTC_Manager  manager,
+                          FTC_Scaler   scaler,
+                          FT_Size     *asize );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Node_Unref                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Decrement a cache node's internal reference count.  When the count */
+  /*    reaches 0, it is not destroyed but becomes eligible for subsequent */
+  /*    cache flushes.                                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    node    :: The cache node handle.                                  */
+  /*                                                                       */
+  /*    manager :: The cache manager handle.                               */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FTC_Node_Unref( FTC_Node     node,
+                  FTC_Manager  manager );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FTC_Manager_RemoveFaceID
+   *
+   * @description:
+   *   A special function used to indicate to the cache manager that
+   *   a given @FTC_FaceID is no longer valid, either because its
+   *   content changed, or because it was deallocated or uninstalled.
+   *
+   * @input:
+   *   manager ::
+   *     The cache manager handle.
+   *
+   *   face_id ::
+   *     The @FTC_FaceID to be removed.
+   *
+   * @note:
+   *   This function flushes all nodes from the cache corresponding to this
+   *   `face_id', with the exception of nodes with a non-null reference
+   *   count.
+   *
+   *   Such nodes are however modified internally so as to never appear
+   *   in later lookups with the same `face_id' value, and to be immediately
+   *   destroyed when released by all their users.
+   *
+   */
+  FT_EXPORT( void )
+  FTC_Manager_RemoveFaceID( FTC_Manager  manager,
+                            FTC_FaceID   face_id );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    cache_subsystem                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FTC_CMapCache
+   *
+   * @description:
+   *   An opaque handle used to model a charmap cache.  This cache is to
+   *   hold character codes -> glyph indices mappings.
+   *
+   */
+  typedef struct FTC_CMapCacheRec_*  FTC_CMapCache;
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FTC_CMapCache_New
+   *
+   * @description:
+   *   Create a new charmap cache.
+   *
+   * @input:
+   *   manager ::
+   *     A handle to the cache manager.
+   *
+   * @output:
+   *   acache ::
+   *     A new cache handle.  NULL in case of error.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   Like all other caches, this one will be destroyed with the cache
+   *   manager.
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FTC_CMapCache_New( FTC_Manager     manager,
+                     FTC_CMapCache  *acache );
+
+
+  /************************************************************************
+   *
+   * @function:
+   *   FTC_CMapCache_Lookup
+   *
+   * @description:
+   *   Translate a character code into a glyph index, using the charmap
+   *   cache.
+   *
+   * @input:
+   *   cache ::
+   *     A charmap cache handle.
+   *
+   *   face_id ::
+   *     The source face ID.
+   *
+   *   cmap_index ::
+   *     The index of the charmap in the source face.  Any negative value
+   *     means to use the cache @FT_Face's default charmap.
+   *
+   *   char_code ::
+   *     The character code (in the corresponding charmap).
+   *
+   * @return:
+   *    Glyph index.  0~means `no glyph'.
+   *
+   */
+  FT_EXPORT( FT_UInt )
+  FTC_CMapCache_Lookup( FTC_CMapCache  cache,
+                        FTC_FaceID     face_id,
+                        FT_Int         cmap_index,
+                        FT_UInt32      char_code );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    cache_subsystem                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       IMAGE CACHE OBJECT                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   FTC_ImageTypeRec
+   *
+   * @description:
+   *   A structure used to model the type of images in a glyph cache.
+   *
+   * @fields:
+   *   face_id ::
+   *     The face ID.
+   *
+   *   width ::
+   *     The width in pixels.
+   *
+   *   height ::
+   *     The height in pixels.
+   *
+   *   flags ::
+   *     The load flags, as in @FT_Load_Glyph.
+   *
+   */
+  typedef struct  FTC_ImageTypeRec_
+  {
+    FTC_FaceID  face_id;
+    FT_Int      width;
+    FT_Int      height;
+    FT_Int32    flags;
+
+  } FTC_ImageTypeRec;
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FTC_ImageType
+   *
+   * @description:
+   *   A handle to an @FTC_ImageTypeRec structure.
+   *
+   */
+  typedef struct FTC_ImageTypeRec_*  FTC_ImageType;
+
+
+  /* */
+
+
+#define FTC_IMAGE_TYPE_COMPARE( d1, d2 )      \
+          ( (d1)->face_id == (d2)->face_id && \
+            (d1)->width   == (d2)->width   && \
+            (d1)->flags   == (d2)->flags   )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_ImageCache                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a glyph image cache object.  They are designed to      */
+  /*    hold many distinct glyph images while not exceeding a certain      */
+  /*    memory threshold.                                                  */
+  /*                                                                       */
+  typedef struct FTC_ImageCacheRec_*  FTC_ImageCache;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_ImageCache_New                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new glyph image cache.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: The parent manager for the image cache.                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acache  :: A handle to the new glyph image cache object.           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_ImageCache_New( FTC_Manager      manager,
+                      FTC_ImageCache  *acache );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_ImageCache_Lookup                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve a given glyph image from a glyph image cache.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    cache  :: A handle to the source glyph image cache.                */
+  /*                                                                       */
+  /*    type   :: A pointer to a glyph image type descriptor.              */
+  /*                                                                       */
+  /*    gindex :: The glyph index to retrieve.                             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aglyph :: The corresponding @FT_Glyph object.  0~in case of        */
+  /*              failure.                                                 */
+  /*                                                                       */
+  /*    anode  :: Used to return the address of of the corresponding cache */
+  /*              node after incrementing its reference count (see note    */
+  /*              below).                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned glyph is owned and managed by the glyph image cache.  */
+  /*    Never try to transform or discard it manually!  You can however    */
+  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */
+  /*                                                                       */
+  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
+  /*    node containing the glyph image, after increasing its reference    */
+  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */
+  /*    always be kept in the cache until you call @FTC_Node_Unref to      */
+  /*    `release' it.                                                      */
+  /*                                                                       */
+  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
+  /*    that the @FT_Glyph could be flushed out of the cache on the next   */
+  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
+  /*    is persistent!                                                     */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_ImageCache_Lookup( FTC_ImageCache  cache,
+                         FTC_ImageType   type,
+                         FT_UInt         gindex,
+                         FT_Glyph       *aglyph,
+                         FTC_Node       *anode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_ImageCache_LookupScaler                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec    */
+  /*    to specify the face ID and its size.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    cache      :: A handle to the source glyph image cache.            */
+  /*                                                                       */
+  /*    scaler     :: A pointer to a scaler descriptor.                    */
+  /*                                                                       */
+  /*    load_flags :: The corresponding load flags.                        */
+  /*                                                                       */
+  /*    gindex     :: The glyph index to retrieve.                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aglyph     :: The corresponding @FT_Glyph object.  0~in case of    */
+  /*                  failure.                                             */
+  /*                                                                       */
+  /*    anode      :: Used to return the address of of the corresponding   */
+  /*                  cache node after incrementing its reference count    */
+  /*                  (see note below).                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned glyph is owned and managed by the glyph image cache.  */
+  /*    Never try to transform or discard it manually!  You can however    */
+  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */
+  /*                                                                       */
+  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
+  /*    node containing the glyph image, after increasing its reference    */
+  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */
+  /*    always be kept in the cache until you call @FTC_Node_Unref to      */
+  /*    `release' it.                                                      */
+  /*                                                                       */
+  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
+  /*    that the @FT_Glyph could be flushed out of the cache on the next   */
+  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
+  /*    is persistent!                                                     */
+  /*                                                                       */
+  /*    Calls to @FT_Set_Char_Size and friends have no effect on cached    */
+  /*    glyphs; you should always use the FreeType cache API instead.      */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_ImageCache_LookupScaler( FTC_ImageCache  cache,
+                               FTC_Scaler      scaler,
+                               FT_ULong        load_flags,
+                               FT_UInt         gindex,
+                               FT_Glyph       *aglyph,
+                               FTC_Node       *anode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_SBit                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a small bitmap descriptor.  See the @FTC_SBitRec       */
+  /*    structure for details.                                             */
+  /*                                                                       */
+  typedef struct FTC_SBitRec_*  FTC_SBit;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FTC_SBitRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very compact structure used to describe a small glyph bitmap.    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    width     :: The bitmap width in pixels.                           */
+  /*                                                                       */
+  /*    height    :: The bitmap height in pixels.                          */
+  /*                                                                       */
+  /*    left      :: The horizontal distance from the pen position to the  */
+  /*                 left bitmap border (a.k.a. `left side bearing', or    */
+  /*                 `lsb').                                               */
+  /*                                                                       */
+  /*    top       :: The vertical distance from the pen position (on the   */
+  /*                 baseline) to the upper bitmap border (a.k.a. `top     */
+  /*                 side bearing').  The distance is positive for upwards */
+  /*                 y~coordinates.                                        */
+  /*                                                                       */
+  /*    format    :: The format of the glyph bitmap (monochrome or gray).  */
+  /*                                                                       */
+  /*    max_grays :: Maximum gray level value (in the range 1 to~255).     */
+  /*                                                                       */
+  /*    pitch     :: The number of bytes per bitmap line.  May be positive */
+  /*                 or negative.                                          */
+  /*                                                                       */
+  /*    xadvance  :: The horizontal advance width in pixels.               */
+  /*                                                                       */
+  /*    yadvance  :: The vertical advance height in pixels.                */
+  /*                                                                       */
+  /*    buffer    :: A pointer to the bitmap pixels.                       */
+  /*                                                                       */
+  typedef struct  FTC_SBitRec_
+  {
+    FT_Byte   width;
+    FT_Byte   height;
+    FT_Char   left;
+    FT_Char   top;
+
+    FT_Byte   format;
+    FT_Byte   max_grays;
+    FT_Short  pitch;
+    FT_Char   xadvance;
+    FT_Char   yadvance;
+
+    FT_Byte*  buffer;
+
+  } FTC_SBitRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_SBitCache                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a small bitmap cache.  These are special cache objects */
+  /*    used to store small glyph bitmaps (and anti-aliased pixmaps) in a  */
+  /*    much more efficient way than the traditional glyph image cache     */
+  /*    implemented by @FTC_ImageCache.                                    */
+  /*                                                                       */
+  typedef struct FTC_SBitCacheRec_*  FTC_SBitCache;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_SBitCache_New                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new cache to store small glyph bitmaps.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: A handle to the source cache manager.                   */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acache  :: A handle to the new sbit cache.  NULL in case of error. */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_SBitCache_New( FTC_Manager     manager,
+                     FTC_SBitCache  *acache );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_SBitCache_Lookup                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Look up a given small glyph bitmap in a given sbit cache and       */
+  /*    `lock' it to prevent its flushing from the cache until needed.     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    cache  :: A handle to the source sbit cache.                       */
+  /*                                                                       */
+  /*    type   :: A pointer to the glyph image type descriptor.            */
+  /*                                                                       */
+  /*    gindex :: The glyph index.                                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    sbit   :: A handle to a small bitmap descriptor.                   */
+  /*                                                                       */
+  /*    anode  :: Used to return the address of of the corresponding cache */
+  /*              node after incrementing its reference count (see note    */
+  /*              below).                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The small bitmap descriptor and its bit buffer are owned by the    */
+  /*    cache and should never be freed by the application.  They might    */
+  /*    as well disappear from memory on the next cache lookup, so don't   */
+  /*    treat them as persistent data.                                     */
+  /*                                                                       */
+  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */
+  /*    glyph bitmap.                                                      */
+  /*                                                                       */
+  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
+  /*    node containing the bitmap, after increasing its reference count.  */
+  /*    This ensures that the node (as well as the image) will always be   */
+  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */
+  /*                                                                       */
+  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
+  /*    that the bitmap could be flushed out of the cache on the next      */
+  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
+  /*    is persistent!                                                     */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_SBitCache_Lookup( FTC_SBitCache    cache,
+                        FTC_ImageType    type,
+                        FT_UInt          gindex,
+                        FTC_SBit        *sbit,
+                        FTC_Node        *anode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_SBitCache_LookupScaler                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec     */
+  /*    to specify the face ID and its size.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    cache      :: A handle to the source sbit cache.                   */
+  /*                                                                       */
+  /*    scaler     :: A pointer to the scaler descriptor.                  */
+  /*                                                                       */
+  /*    load_flags :: The corresponding load flags.                        */
+  /*                                                                       */
+  /*    gindex     :: The glyph index.                                     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    sbit       :: A handle to a small bitmap descriptor.               */
+  /*                                                                       */
+  /*    anode      :: Used to return the address of of the corresponding   */
+  /*                  cache node after incrementing its reference count    */
+  /*                  (see note below).                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The small bitmap descriptor and its bit buffer are owned by the    */
+  /*    cache and should never be freed by the application.  They might    */
+  /*    as well disappear from memory on the next cache lookup, so don't   */
+  /*    treat them as persistent data.                                     */
+  /*                                                                       */
+  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */
+  /*    glyph bitmap.                                                      */
+  /*                                                                       */
+  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
+  /*    node containing the bitmap, after increasing its reference count.  */
+  /*    This ensures that the node (as well as the image) will always be   */
+  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */
+  /*                                                                       */
+  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
+  /*    that the bitmap could be flushed out of the cache on the next      */
+  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
+  /*    is persistent!                                                     */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_SBitCache_LookupScaler( FTC_SBitCache  cache,
+                              FTC_Scaler     scaler,
+                              FT_ULong       load_flags,
+                              FT_UInt        gindex,
+                              FTC_SBit      *sbit,
+                              FTC_Node      *anode );
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCACHE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcffdrv.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcffdrv.h
new file mode 100644
index 0000000..3a37795
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcffdrv.h
@@ -0,0 +1,151 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcffdrv.h                                                             */
+/*                                                                         */
+/*    FreeType API for controlling the CFF driver (specification only).    */
+/*                                                                         */
+/*  Copyright 2013 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCFFDRV_H__
+#define __FTCFFDRV_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   cff_driver
+   *
+   * @title:
+   *   The CFF driver
+   *
+   * @abstract:
+   *   Controlling the CFF driver module.
+   *
+   * @description:
+   *   While FreeType's CFF driver doesn't expose API functions by itself,
+   *   it is possible to control its behaviour with @FT_Property_Set and
+   *   @FT_Property_Get.  The following lists the available properties
+   *   together with the necessary macros and structures.
+   *
+   *   The CFF driver's module name is `cff'.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   hinting-engine
+   *
+   * @description:
+   *   Thanks to Adobe, which contributed a new hinting (and parsing)
+   *   engine, an application can select between `freetype' and `adobe' if
+   *   compiled with CFF_CONFIG_OPTION_OLD_ENGINE.  If this configuration
+   *   macro isn't defined, `hinting-engine' does nothing.
+   *
+   *   The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is
+   *   defined, and `adobe' otherwise.
+   *
+   *   The following example code demonstrates how to select Adobe's hinting
+   *   engine (omitting the error handling).
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Face     face;
+   *     FT_UInt     hinting_engine = FT_CFF_HINTING_ADOBE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "cff",
+   *                               "hinting-engine", &hinting_engine );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   FT_CFF_HINTING_XXX
+   *
+   * @description:
+   *   A list of constants used for the @hinting-engine property to select
+   *   the hinting engine for CFF fonts.
+   *
+   * @values:
+   *   FT_CFF_HINTING_FREETYPE ::
+   *     Use the old FreeType hinting engine.
+   *
+   *   FT_CFF_HINTING_ADOBE ::
+   *     Use the hinting engine contributed by Adobe.
+   *
+   */
+#define FT_CFF_HINTING_FREETYPE  0
+#define FT_CFF_HINTING_ADOBE     1
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   no-stem-darkening
+   *
+   * @description:
+   *   By default, the Adobe CFF engine darkens stems at smaller sizes,
+   *   regardless of hinting, to enhance contrast.  Setting this property,
+   *   stem darkening gets switched off.
+   *
+   *   Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Face     face;
+   *     FT_Bool     no_stem_darkening = TRUE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "cff",
+   *                               "no-stem-darkening", &no_stem_darkening );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   */
+
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __FTCFFDRV_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftchapters.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftchapters.h
new file mode 100644
index 0000000..c55670d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftchapters.h
@@ -0,0 +1,120 @@
+/***************************************************************************/
+/*                                                                         */
+/* This file defines the structure of the FreeType reference.              */
+/* It is used by the python script which generates the HTML files.         */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    general_remarks                                                      */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    General Remarks                                                      */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    user_allocation                                                      */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    core_api                                                             */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Core API                                                             */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    version                                                              */
+/*    basic_types                                                          */
+/*    base_interface                                                       */
+/*    glyph_variants                                                       */
+/*    glyph_management                                                     */
+/*    mac_specific                                                         */
+/*    sizes_management                                                     */
+/*    header_file_macros                                                   */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    format_specific                                                      */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Format-Specific API                                                  */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    multiple_masters                                                     */
+/*    truetype_tables                                                      */
+/*    type1_tables                                                         */
+/*    sfnt_names                                                           */
+/*    bdf_fonts                                                            */
+/*    cid_fonts                                                            */
+/*    pfr_fonts                                                            */
+/*    winfnt_fonts                                                         */
+/*    font_formats                                                         */
+/*    gasp_table                                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    module_specific                                                      */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Controlling FreeType Modules                                         */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    auto_hinter                                                          */
+/*    cff_driver                                                           */
+/*    tt_driver                                                            */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    cache_subsystem                                                      */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Cache Sub-System                                                     */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    cache_subsystem                                                      */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    support_api                                                          */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Support API                                                          */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    computations                                                         */
+/*    list_processing                                                      */
+/*    outline_processing                                                   */
+/*    quick_advance                                                        */
+/*    bitmap_handling                                                      */
+/*    raster                                                               */
+/*    glyph_stroker                                                        */
+/*    system_interface                                                     */
+/*    module_management                                                    */
+/*    gzip                                                                 */
+/*    lzw                                                                  */
+/*    bzip2                                                                */
+/*    lcd_filtering                                                        */
+/*                                                                         */
+/***************************************************************************/
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcid.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcid.h
new file mode 100644
index 0000000..f595975
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcid.h
@@ -0,0 +1,166 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcid.h                                                                */
+/*                                                                         */
+/*    FreeType API for accessing CID font information (specification).     */
+/*                                                                         */
+/*  Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal.                  */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCID_H__
+#define __FTCID_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    cid_fonts                                                          */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    CID Fonts                                                          */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    CID-keyed font specific API.                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of CID-keyed font specific   */
+  /*    functions.                                                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Get_CID_Registry_Ordering_Supplement
+   *
+   * @description:
+   *    Retrieve the Registry/Ordering/Supplement triple (also known as the
+   *    "R/O/S") from a CID-keyed font.
+   *
+   * @input:
+   *    face ::
+   *       A handle to the input face.
+   *
+   * @output:
+   *    registry ::
+   *       The registry, as a C~string, owned by the face.
+   *
+   *    ordering ::
+   *       The ordering, as a C~string, owned by the face.
+   *
+   *    supplement ::
+   *       The supplement.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    This function only works with CID faces, returning an error
+   *    otherwise.
+   *
+   * @since:
+   *    2.3.6
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,
+                                           const char*  *registry,
+                                           const char*  *ordering,
+                                           FT_Int       *supplement);
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Get_CID_Is_Internally_CID_Keyed
+   *
+   * @description:
+   *    Retrieve the type of the input face, CID keyed or not.  In
+   *    constrast to the @FT_IS_CID_KEYED macro this function returns
+   *    successfully also for CID-keyed fonts in an SNFT wrapper.
+   *
+   * @input:
+   *    face ::
+   *       A handle to the input face.
+   *
+   * @output:
+   *    is_cid ::
+   *       The type of the face as an @FT_Bool.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    This function only works with CID faces and OpenType fonts,
+   *    returning an error otherwise.
+   *
+   * @since:
+   *    2.3.9
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,
+                                      FT_Bool  *is_cid );
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Get_CID_From_Glyph_Index
+   *
+   * @description:
+   *    Retrieve the CID of the input glyph index.
+   *
+   * @input:
+   *    face ::
+   *       A handle to the input face.
+   *
+   *    glyph_index ::
+   *       The input glyph index.
+   *
+   * @output:
+   *    cid ::
+   *       The CID as an @FT_UInt.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    This function only works with CID faces and OpenType fonts,
+   *    returning an error otherwise.
+   *
+   * @since:
+   *    2.3.9
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_CID_From_Glyph_Index( FT_Face   face,
+                               FT_UInt   glyph_index,
+                               FT_UInt  *cid );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCID_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrdef.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrdef.h
new file mode 100644
index 0000000..76c7b9e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrdef.h
@@ -0,0 +1,249 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fterrdef.h                                                             */
+/*                                                                         */
+/*    FreeType error codes (specification).                                */
+/*                                                                         */
+/*  Copyright 2002, 2004, 2006, 2007, 2010-2013 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                LIST OF ERROR CODES/MESSAGES             *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+  /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */
+  /* including this file.                                           */
+
+
+  /* generic errors */
+
+  FT_NOERRORDEF_( Ok,                                        0x00, \
+                  "no error" )
+
+  FT_ERRORDEF_( Cannot_Open_Resource,                        0x01, \
+                "cannot open resource" )
+  FT_ERRORDEF_( Unknown_File_Format,                         0x02, \
+                "unknown file format" )
+  FT_ERRORDEF_( Invalid_File_Format,                         0x03, \
+                "broken file" )
+  FT_ERRORDEF_( Invalid_Version,                             0x04, \
+                "invalid FreeType version" )
+  FT_ERRORDEF_( Lower_Module_Version,                        0x05, \
+                "module version is too low" )
+  FT_ERRORDEF_( Invalid_Argument,                            0x06, \
+                "invalid argument" )
+  FT_ERRORDEF_( Unimplemented_Feature,                       0x07, \
+                "unimplemented feature" )
+  FT_ERRORDEF_( Invalid_Table,                               0x08, \
+                "broken table" )
+  FT_ERRORDEF_( Invalid_Offset,                              0x09, \
+                "broken offset within table" )
+  FT_ERRORDEF_( Array_Too_Large,                             0x0A, \
+                "array allocation size too large" )
+  FT_ERRORDEF_( Missing_Module,                              0x0B, \
+                "missing module" )
+  FT_ERRORDEF_( Missing_Property,                            0x0C, \
+                "missing property" )
+
+  /* glyph/character errors */
+
+  FT_ERRORDEF_( Invalid_Glyph_Index,                         0x10, \
+                "invalid glyph index" )
+  FT_ERRORDEF_( Invalid_Character_Code,                      0x11, \
+                "invalid character code" )
+  FT_ERRORDEF_( Invalid_Glyph_Format,                        0x12, \
+                "unsupported glyph image format" )
+  FT_ERRORDEF_( Cannot_Render_Glyph,                         0x13, \
+                "cannot render this glyph format" )
+  FT_ERRORDEF_( Invalid_Outline,                             0x14, \
+                "invalid outline" )
+  FT_ERRORDEF_( Invalid_Composite,                           0x15, \
+                "invalid composite glyph" )
+  FT_ERRORDEF_( Too_Many_Hints,                              0x16, \
+                "too many hints" )
+  FT_ERRORDEF_( Invalid_Pixel_Size,                          0x17, \
+                "invalid pixel size" )
+
+  /* handle errors */
+
+  FT_ERRORDEF_( Invalid_Handle,                              0x20, \
+                "invalid object handle" )
+  FT_ERRORDEF_( Invalid_Library_Handle,                      0x21, \
+                "invalid library handle" )
+  FT_ERRORDEF_( Invalid_Driver_Handle,                       0x22, \
+                "invalid module handle" )
+  FT_ERRORDEF_( Invalid_Face_Handle,                         0x23, \
+                "invalid face handle" )
+  FT_ERRORDEF_( Invalid_Size_Handle,                         0x24, \
+                "invalid size handle" )
+  FT_ERRORDEF_( Invalid_Slot_Handle,                         0x25, \
+                "invalid glyph slot handle" )
+  FT_ERRORDEF_( Invalid_CharMap_Handle,                      0x26, \
+                "invalid charmap handle" )
+  FT_ERRORDEF_( Invalid_Cache_Handle,                        0x27, \
+                "invalid cache manager handle" )
+  FT_ERRORDEF_( Invalid_Stream_Handle,                       0x28, \
+                "invalid stream handle" )
+
+  /* driver errors */
+
+  FT_ERRORDEF_( Too_Many_Drivers,                            0x30, \
+                "too many modules" )
+  FT_ERRORDEF_( Too_Many_Extensions,                         0x31, \
+                "too many extensions" )
+
+  /* memory errors */
+
+  FT_ERRORDEF_( Out_Of_Memory,                               0x40, \
+                "out of memory" )
+  FT_ERRORDEF_( Unlisted_Object,                             0x41, \
+                "unlisted object" )
+
+  /* stream errors */
+
+  FT_ERRORDEF_( Cannot_Open_Stream,                          0x51, \
+                "cannot open stream" )
+  FT_ERRORDEF_( Invalid_Stream_Seek,                         0x52, \
+                "invalid stream seek" )
+  FT_ERRORDEF_( Invalid_Stream_Skip,                         0x53, \
+                "invalid stream skip" )
+  FT_ERRORDEF_( Invalid_Stream_Read,                         0x54, \
+                "invalid stream read" )
+  FT_ERRORDEF_( Invalid_Stream_Operation,                    0x55, \
+                "invalid stream operation" )
+  FT_ERRORDEF_( Invalid_Frame_Operation,                     0x56, \
+                "invalid frame operation" )
+  FT_ERRORDEF_( Nested_Frame_Access,                         0x57, \
+                "nested frame access" )
+  FT_ERRORDEF_( Invalid_Frame_Read,                          0x58, \
+                "invalid frame read" )
+
+  /* raster errors */
+
+  FT_ERRORDEF_( Raster_Uninitialized,                        0x60, \
+                "raster uninitialized" )
+  FT_ERRORDEF_( Raster_Corrupted,                            0x61, \
+                "raster corrupted" )
+  FT_ERRORDEF_( Raster_Overflow,                             0x62, \
+                "raster overflow" )
+  FT_ERRORDEF_( Raster_Negative_Height,                      0x63, \
+                "negative height while rastering" )
+
+  /* cache errors */
+
+  FT_ERRORDEF_( Too_Many_Caches,                             0x70, \
+                "too many registered caches" )
+
+  /* TrueType and SFNT errors */
+
+  FT_ERRORDEF_( Invalid_Opcode,                              0x80, \
+                "invalid opcode" )
+  FT_ERRORDEF_( Too_Few_Arguments,                           0x81, \
+                "too few arguments" )
+  FT_ERRORDEF_( Stack_Overflow,                              0x82, \
+                "stack overflow" )
+  FT_ERRORDEF_( Code_Overflow,                               0x83, \
+                "code overflow" )
+  FT_ERRORDEF_( Bad_Argument,                                0x84, \
+                "bad argument" )
+  FT_ERRORDEF_( Divide_By_Zero,                              0x85, \
+                "division by zero" )
+  FT_ERRORDEF_( Invalid_Reference,                           0x86, \
+                "invalid reference" )
+  FT_ERRORDEF_( Debug_OpCode,                                0x87, \
+                "found debug opcode" )
+  FT_ERRORDEF_( ENDF_In_Exec_Stream,                         0x88, \
+                "found ENDF opcode in execution stream" )
+  FT_ERRORDEF_( Nested_DEFS,                                 0x89, \
+                "nested DEFS" )
+  FT_ERRORDEF_( Invalid_CodeRange,                           0x8A, \
+                "invalid code range" )
+  FT_ERRORDEF_( Execution_Too_Long,                          0x8B, \
+                "execution context too long" )
+  FT_ERRORDEF_( Too_Many_Function_Defs,                      0x8C, \
+                "too many function definitions" )
+  FT_ERRORDEF_( Too_Many_Instruction_Defs,                   0x8D, \
+                "too many instruction definitions" )
+  FT_ERRORDEF_( Table_Missing,                               0x8E, \
+                "SFNT font table missing" )
+  FT_ERRORDEF_( Horiz_Header_Missing,                        0x8F, \
+                "horizontal header (hhea) table missing" )
+  FT_ERRORDEF_( Locations_Missing,                           0x90, \
+                "locations (loca) table missing" )
+  FT_ERRORDEF_( Name_Table_Missing,                          0x91, \
+                "name table missing" )
+  FT_ERRORDEF_( CMap_Table_Missing,                          0x92, \
+                "character map (cmap) table missing" )
+  FT_ERRORDEF_( Hmtx_Table_Missing,                          0x93, \
+                "horizontal metrics (hmtx) table missing" )
+  FT_ERRORDEF_( Post_Table_Missing,                          0x94, \
+                "PostScript (post) table missing" )
+  FT_ERRORDEF_( Invalid_Horiz_Metrics,                       0x95, \
+                "invalid horizontal metrics" )
+  FT_ERRORDEF_( Invalid_CharMap_Format,                      0x96, \
+                "invalid character map (cmap) format" )
+  FT_ERRORDEF_( Invalid_PPem,                                0x97, \
+                "invalid ppem value" )
+  FT_ERRORDEF_( Invalid_Vert_Metrics,                        0x98, \
+                "invalid vertical metrics" )
+  FT_ERRORDEF_( Could_Not_Find_Context,                      0x99, \
+                "could not find context" )
+  FT_ERRORDEF_( Invalid_Post_Table_Format,                   0x9A, \
+                "invalid PostScript (post) table format" )
+  FT_ERRORDEF_( Invalid_Post_Table,                          0x9B, \
+                "invalid PostScript (post) table" )
+
+  /* CFF, CID, and Type 1 errors */
+
+  FT_ERRORDEF_( Syntax_Error,                                0xA0, \
+                "opcode syntax error" )
+  FT_ERRORDEF_( Stack_Underflow,                             0xA1, \
+                "argument stack underflow" )
+  FT_ERRORDEF_( Ignore,                                      0xA2, \
+                "ignore" )
+  FT_ERRORDEF_( No_Unicode_Glyph_Name,                       0xA3, \
+                "no Unicode glyph name found" )
+  FT_ERRORDEF_( Glyph_Too_Big,                               0xA4, \
+                "glyph to big for hinting" )
+
+  /* BDF errors */
+
+  FT_ERRORDEF_( Missing_Startfont_Field,                     0xB0, \
+                "`STARTFONT' field missing" )
+  FT_ERRORDEF_( Missing_Font_Field,                          0xB1, \
+                "`FONT' field missing" )
+  FT_ERRORDEF_( Missing_Size_Field,                          0xB2, \
+                "`SIZE' field missing" )
+  FT_ERRORDEF_( Missing_Fontboundingbox_Field,               0xB3, \
+                "`FONTBOUNDINGBOX' field missing" )
+  FT_ERRORDEF_( Missing_Chars_Field,                         0xB4, \
+                "`CHARS' field missing" )
+  FT_ERRORDEF_( Missing_Startchar_Field,                     0xB5, \
+                "`STARTCHAR' field missing" )
+  FT_ERRORDEF_( Missing_Encoding_Field,                      0xB6, \
+                "`ENCODING' field missing" )
+  FT_ERRORDEF_( Missing_Bbx_Field,                           0xB7, \
+                "`BBX' field missing" )
+  FT_ERRORDEF_( Bbx_Too_Big,                                 0xB8, \
+                "`BBX' too big" )
+  FT_ERRORDEF_( Corrupted_Font_Header,                       0xB9, \
+                "Font header corrupted or missing fields" )
+  FT_ERRORDEF_( Corrupted_Font_Glyphs,                       0xBA, \
+                "Font glyphs corrupted or missing fields" )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrors.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrors.h
new file mode 100644
index 0000000..bd69d0f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrors.h
@@ -0,0 +1,198 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fterrors.h                                                             */
+/*                                                                         */
+/*    FreeType error code handling (specification).                        */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004, 2007, 2013 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This special header file is used to define the handling of FT2        */
+  /* enumeration constants.  It can also be used to generate error message */
+  /* strings with a small macro trick explained below.                     */
+  /*                                                                       */
+  /* I - Error Formats                                                     */
+  /* -----------------                                                     */
+  /*                                                                       */
+  /*   The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be   */
+  /*   defined in ftoption.h in order to make the higher byte indicate     */
+  /*   the module where the error has happened (this is not compatible     */
+  /*   with standard builds of FreeType 2).  See the file `ftmoderr.h' for */
+  /*   more details.                                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /* II - Error Message strings                                            */
+  /* --------------------------                                            */
+  /*                                                                       */
+  /*   The error definitions below are made through special macros that    */
+  /*   allow client applications to build a table of error message strings */
+  /*   if they need it.  The strings are not included in a normal build of */
+  /*   FreeType 2 to save space (most client applications do not use       */
+  /*   them).                                                              */
+  /*                                                                       */
+  /*   To do so, you have to define the following macros before including  */
+  /*   this file:                                                          */
+  /*                                                                       */
+  /*   FT_ERROR_START_LIST ::                                              */
+  /*     This macro is called before anything else to define the start of  */
+  /*     the error list.  It is followed by several FT_ERROR_DEF calls     */
+  /*     (see below).                                                      */
+  /*                                                                       */
+  /*   FT_ERROR_DEF( e, v, s ) ::                                          */
+  /*     This macro is called to define one single error.                  */
+  /*     `e' is the error code identifier (e.g. FT_Err_Invalid_Argument).  */
+  /*     `v' is the error numerical value.                                 */
+  /*     `s' is the corresponding error string.                            */
+  /*                                                                       */
+  /*   FT_ERROR_END_LIST ::                                                */
+  /*     This macro ends the list.                                         */
+  /*                                                                       */
+  /*   Additionally, you have to undefine __FTERRORS_H__ before #including */
+  /*   this file.                                                          */
+  /*                                                                       */
+  /*   Here is a simple example:                                           */
+  /*                                                                       */
+  /*     {                                                                 */
+  /*       #undef __FTERRORS_H__                                           */
+  /*       #define FT_ERRORDEF( e, v, s )  { e, s },                       */
+  /*       #define FT_ERROR_START_LIST     {                               */
+  /*       #define FT_ERROR_END_LIST       { 0, 0 } };                     */
+  /*                                                                       */
+  /*       const struct                                                    */
+  /*       {                                                               */
+  /*         int          err_code;                                        */
+  /*         const char*  err_msg;                                         */
+  /*       } ft_errors[] =                                                 */
+  /*                                                                       */
+  /*       #include "fterrors.h"                                            */
+  /*     }                                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTERRORS_H__
+#define __FTERRORS_H__
+
+
+  /* include module base error codes */
+#include "ftmoderr.h"
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                       SETUP MACROS                      *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#undef  FT_NEED_EXTERN_C
+
+
+  /* FT_ERR_PREFIX is used as a prefix for error identifiers. */
+  /* By default, we use `FT_Err_'.                            */
+  /*                                                          */
+#ifndef FT_ERR_PREFIX
+#define FT_ERR_PREFIX  FT_Err_
+#endif
+
+
+  /* FT_ERR_BASE is used as the base for module-specific errors. */
+  /*                                                             */
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+#ifndef FT_ERR_BASE
+#define FT_ERR_BASE  FT_Mod_Err_Base
+#endif
+
+#else
+
+#undef FT_ERR_BASE
+#define FT_ERR_BASE  0
+
+#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */
+
+
+  /* If FT_ERRORDEF is not defined, we need to define a simple */
+  /* enumeration type.                                         */
+  /*                                                           */
+#ifndef FT_ERRORDEF
+
+#define FT_ERRORDEF( e, v, s )  e = v,
+#define FT_ERROR_START_LIST     enum {
+#define FT_ERROR_END_LIST       FT_ERR_CAT( FT_ERR_PREFIX, Max ) };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+  extern "C" {
+#endif
+
+#endif /* !FT_ERRORDEF */
+
+
+  /* this macro is used to define an error */
+#define FT_ERRORDEF_( e, v, s )                                             \
+          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s )
+
+  /* this is only used for <module>_Err_Ok, which must be 0! */
+#define FT_NOERRORDEF_( e, v, s )                             \
+          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s )
+
+
+#ifdef FT_ERROR_START_LIST
+  FT_ERROR_START_LIST
+#endif
+
+
+  /* now include the error codes */
+#include "fterrdef.h"
+
+
+#ifdef FT_ERROR_END_LIST
+  FT_ERROR_END_LIST
+#endif
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                      SIMPLE CLEANUP                     *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+#ifdef FT_NEED_EXTERN_C
+  }
+#endif
+
+#undef FT_ERROR_START_LIST
+#undef FT_ERROR_END_LIST
+
+#undef FT_ERRORDEF
+#undef FT_ERRORDEF_
+#undef FT_NOERRORDEF_
+
+#undef FT_NEED_EXTERN_C
+#undef FT_ERR_BASE
+
+  /* FT_ERR_PREFIX is needed internally */
+#ifndef FT2_BUILD_LIBRARY
+#undef FT_ERR_PREFIX
+#endif
+
+#endif /* __FTERRORS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgasp.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgasp.h
new file mode 100644
index 0000000..ff0a34a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgasp.h
@@ -0,0 +1,128 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgasp.h                                                               */
+/*                                                                         */
+/*    Access of TrueType's `gasp' table (specification).                   */
+/*                                                                         */
+/*  Copyright 2007, 2008, 2011 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef _FT_GASP_H_
+#define _FT_GASP_H_
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+  /***************************************************************************
+   *
+   * @section:
+   *   gasp_table
+   *
+   * @title:
+   *   Gasp Table
+   *
+   * @abstract:
+   *   Retrieving TrueType `gasp' table entries.
+   *
+   * @description:
+   *   The function @FT_Get_Gasp can be used to query a TrueType or OpenType
+   *   font for specific entries in its `gasp' table, if any.  This is
+   *   mainly useful when implementing native TrueType hinting with the
+   *   bytecode interpreter to duplicate the Windows text rendering results.
+   */
+
+  /*************************************************************************
+   *
+   * @enum:
+   *   FT_GASP_XXX
+   *
+   * @description:
+   *   A list of values and/or bit-flags returned by the @FT_Get_Gasp
+   *   function.
+   *
+   * @values:
+   *   FT_GASP_NO_TABLE ::
+   *     This special value means that there is no GASP table in this face.
+   *     It is up to the client to decide what to do.
+   *
+   *   FT_GASP_DO_GRIDFIT ::
+   *     Grid-fitting and hinting should be performed at the specified ppem.
+   *     This *really* means TrueType bytecode interpretation.  If this bit
+   *     is not set, no hinting gets applied.
+   *
+   *   FT_GASP_DO_GRAY ::
+   *     Anti-aliased rendering should be performed at the specified ppem.
+   *     If not set, do monochrome rendering.
+   *
+   *   FT_GASP_SYMMETRIC_SMOOTHING ::
+   *     If set, smoothing along multiple axes must be used with ClearType.
+   *
+   *   FT_GASP_SYMMETRIC_GRIDFIT ::
+   *     Grid-fitting must be used with ClearType's symmetric smoothing.
+   *
+   * @note:
+   *   The bit-flags `FT_GASP_DO_GRIDFIT' and `FT_GASP_DO_GRAY' are to be
+   *   used for standard font rasterization only.  Independently of that,
+   *   `FT_GASP_SYMMETRIC_SMOOTHING' and `FT_GASP_SYMMETRIC_GRIDFIT' are to
+   *   be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT' and
+   *   `FT_GASP_DO_GRAY' are consequently ignored).
+   *
+   *   `ClearType' is Microsoft's implementation of LCD rendering, partly
+   *   protected by patents.
+   *
+   * @since:
+   *   2.3.0
+   */
+#define FT_GASP_NO_TABLE               -1
+#define FT_GASP_DO_GRIDFIT           0x01
+#define FT_GASP_DO_GRAY              0x02
+#define FT_GASP_SYMMETRIC_SMOOTHING  0x08
+#define FT_GASP_SYMMETRIC_GRIDFIT    0x10
+
+
+  /*************************************************************************
+   *
+   * @func:
+   *   FT_Get_Gasp
+   *
+   * @description:
+   *   Read the `gasp' table from a TrueType or OpenType font file and
+   *   return the entry corresponding to a given character pixel size.
+   *
+   * @input:
+   *   face :: The source face handle.
+   *   ppem :: The vertical character pixel size.
+   *
+   * @return:
+   *   Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no
+   *   `gasp' table in the face.
+   *
+   * @since:
+   *   2.3.0
+   */
+  FT_EXPORT( FT_Int )
+  FT_Get_Gasp( FT_Face  face,
+               FT_UInt  ppem );
+
+/* */
+
+#endif /* _FT_GASP_H_ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftglyph.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftglyph.h
new file mode 100644
index 0000000..ec2d9d8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftglyph.h
@@ -0,0 +1,620 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftglyph.h                                                              */
+/*                                                                         */
+/*    FreeType convenience functions to handle glyphs (specification).     */
+/*                                                                         */
+/*  Copyright 1996-2003, 2006, 2008, 2009, 2011 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file contains the definition of several convenience functions    */
+  /* that can be used by client applications to easily retrieve glyph      */
+  /* bitmaps and outlines from a given face.                               */
+  /*                                                                       */
+  /* These functions should be optional if you are writing a font server   */
+  /* or text layout engine on top of FreeType.  However, they are pretty   */
+  /* handy for many other simple uses of the library.                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTGLYPH_H__
+#define __FTGLYPH_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    glyph_management                                                   */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Glyph Management                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Generic interface to manage individual glyph data.                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains definitions used to manage glyph data        */
+  /*    through generic FT_Glyph objects.  Each of them can contain a      */
+  /*    bitmap, a vector outline, or even images in other formats.         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* forward declaration to a private type */
+  typedef struct FT_Glyph_Class_  FT_Glyph_Class;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Glyph                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Handle to an object used to model generic glyph images.  It is a   */
+  /*    pointer to the @FT_GlyphRec structure and can contain a glyph      */
+  /*    bitmap or pointer.                                                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Glyph objects are not owned by the library.  You must thus release */
+  /*    them manually (through @FT_Done_Glyph) _before_ calling            */
+  /*    @FT_Done_FreeType.                                                 */
+  /*                                                                       */
+  typedef struct FT_GlyphRec_*  FT_Glyph;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_GlyphRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The root glyph structure contains a given glyph image plus its     */
+  /*    advance width in 16.16 fixed-point format.                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    library :: A handle to the FreeType library object.                */
+  /*                                                                       */
+  /*    clazz   :: A pointer to the glyph's class.  Private.               */
+  /*                                                                       */
+  /*    format  :: The format of the glyph's image.                        */
+  /*                                                                       */
+  /*    advance :: A 16.16 vector that gives the glyph's advance width.    */
+  /*                                                                       */
+  typedef struct  FT_GlyphRec_
+  {
+    FT_Library             library;
+    const FT_Glyph_Class*  clazz;
+    FT_Glyph_Format        format;
+    FT_Vector              advance;
+
+  } FT_GlyphRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_BitmapGlyph                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an object used to model a bitmap glyph image.  This is */
+  /*    a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec.     */
+  /*                                                                       */
+  typedef struct FT_BitmapGlyphRec_*  FT_BitmapGlyph;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_BitmapGlyphRec                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used for bitmap glyph images.  This really is a        */
+  /*    `sub-class' of @FT_GlyphRec.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root   :: The root @FT_Glyph fields.                               */
+  /*                                                                       */
+  /*    left   :: The left-side bearing, i.e., the horizontal distance     */
+  /*              from the current pen position to the left border of the  */
+  /*              glyph bitmap.                                            */
+  /*                                                                       */
+  /*    top    :: The top-side bearing, i.e., the vertical distance from   */
+  /*              the current pen position to the top border of the glyph  */
+  /*              bitmap.  This distance is positive for upwards~y!        */
+  /*                                                                       */
+  /*    bitmap :: A descriptor for the bitmap.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have       */
+  /*    `glyph->format == FT_GLYPH_FORMAT_BITMAP'.  This lets you access   */
+  /*    the bitmap's contents easily.                                      */
+  /*                                                                       */
+  /*    The corresponding pixel buffer is always owned by @FT_BitmapGlyph  */
+  /*    and is thus created and destroyed with it.                         */
+  /*                                                                       */
+  typedef struct  FT_BitmapGlyphRec_
+  {
+    FT_GlyphRec  root;
+    FT_Int       left;
+    FT_Int       top;
+    FT_Bitmap    bitmap;
+
+  } FT_BitmapGlyphRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_OutlineGlyph                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an object used to model an outline glyph image.  This  */
+  /*    is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */
+  /*                                                                       */
+  typedef struct FT_OutlineGlyphRec_*  FT_OutlineGlyph;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_OutlineGlyphRec                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used for outline (vectorial) glyph images.  This       */
+  /*    really is a `sub-class' of @FT_GlyphRec.                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root    :: The root @FT_Glyph fields.                              */
+  /*                                                                       */
+  /*    outline :: A descriptor for the outline.                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have      */
+  /*    `glyph->format == FT_GLYPH_FORMAT_OUTLINE'.  This lets you access  */
+  /*    the outline's content easily.                                      */
+  /*                                                                       */
+  /*    As the outline is extracted from a glyph slot, its coordinates are */
+  /*    expressed normally in 26.6 pixels, unless the flag                 */
+  /*    @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */
+  /*                                                                       */
+  /*    The outline's tables are always owned by the object and are        */
+  /*    destroyed with it.                                                 */
+  /*                                                                       */
+  typedef struct  FT_OutlineGlyphRec_
+  {
+    FT_GlyphRec  root;
+    FT_Outline   outline;
+
+  } FT_OutlineGlyphRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Glyph                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to extract a glyph image from a slot.  Note that   */
+  /*    the created @FT_Glyph object must be released with @FT_Done_Glyph. */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot   :: A handle to the source glyph slot.                       */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aglyph :: A handle to the glyph object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Glyph( FT_GlyphSlot  slot,
+                FT_Glyph     *aglyph );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Glyph_Copy                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to copy a glyph image.  Note that the created      */
+  /*    @FT_Glyph object must be released with @FT_Done_Glyph.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    source :: A handle to the source glyph object.                     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    target :: A handle to the target glyph object.  0~in case of       */
+  /*              error.                                                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_Copy( FT_Glyph   source,
+                 FT_Glyph  *target );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Glyph_Transform                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Transform a glyph image if its format is scalable.                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    glyph  :: A handle to the target glyph object.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    matrix :: A pointer to a 2x2 matrix to apply.                      */
+  /*                                                                       */
+  /*    delta  :: A pointer to a 2d vector to apply.  Coordinates are      */
+  /*              expressed in 1/64th of a pixel.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code (if not 0, the glyph format is not scalable).  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The 2x2 transformation matrix is also applied to the glyph's       */
+  /*    advance vector.                                                    */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_Transform( FT_Glyph    glyph,
+                      FT_Matrix*  matrix,
+                      FT_Vector*  delta );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Glyph_BBox_Mode                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The mode how the values of @FT_Glyph_Get_CBox are returned.        */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_GLYPH_BBOX_UNSCALED ::                                          */
+  /*      Return unscaled font units.                                      */
+  /*                                                                       */
+  /*    FT_GLYPH_BBOX_SUBPIXELS ::                                         */
+  /*      Return unfitted 26.6 coordinates.                                */
+  /*                                                                       */
+  /*    FT_GLYPH_BBOX_GRIDFIT ::                                           */
+  /*      Return grid-fitted 26.6 coordinates.                             */
+  /*                                                                       */
+  /*    FT_GLYPH_BBOX_TRUNCATE ::                                          */
+  /*      Return coordinates in integer pixels.                            */
+  /*                                                                       */
+  /*    FT_GLYPH_BBOX_PIXELS ::                                            */
+  /*      Return grid-fitted pixel coordinates.                            */
+  /*                                                                       */
+  typedef enum  FT_Glyph_BBox_Mode_
+  {
+    FT_GLYPH_BBOX_UNSCALED  = 0,
+    FT_GLYPH_BBOX_SUBPIXELS = 0,
+    FT_GLYPH_BBOX_GRIDFIT   = 1,
+    FT_GLYPH_BBOX_TRUNCATE  = 2,
+    FT_GLYPH_BBOX_PIXELS    = 3
+
+  } FT_Glyph_BBox_Mode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_glyph_bbox_xxx                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    These constants are deprecated.  Use the corresponding             */
+  /*    @FT_Glyph_BBox_Mode values instead.                                */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*   ft_glyph_bbox_unscaled  :: See @FT_GLYPH_BBOX_UNSCALED.             */
+  /*   ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS.            */
+  /*   ft_glyph_bbox_gridfit   :: See @FT_GLYPH_BBOX_GRIDFIT.              */
+  /*   ft_glyph_bbox_truncate  :: See @FT_GLYPH_BBOX_TRUNCATE.             */
+  /*   ft_glyph_bbox_pixels    :: See @FT_GLYPH_BBOX_PIXELS.               */
+  /*                                                                       */
+#define ft_glyph_bbox_unscaled   FT_GLYPH_BBOX_UNSCALED
+#define ft_glyph_bbox_subpixels  FT_GLYPH_BBOX_SUBPIXELS
+#define ft_glyph_bbox_gridfit    FT_GLYPH_BBOX_GRIDFIT
+#define ft_glyph_bbox_truncate   FT_GLYPH_BBOX_TRUNCATE
+#define ft_glyph_bbox_pixels     FT_GLYPH_BBOX_PIXELS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Glyph_Get_CBox                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a glyph's `control box'.  The control box encloses all the  */
+  /*    outline's points, including Bézier control points.  Though it      */
+  /*    coincides with the exact bounding box for most glyphs, it can be   */
+  /*    slightly larger in some situations (like when rotating an outline  */
+  /*    which contains Bézier outside arcs).                               */
+  /*                                                                       */
+  /*    Computing the control box is very fast, while getting the bounding */
+  /*    box can take much more time as it needs to walk over all segments  */
+  /*    and arcs in the outline.  To get the latter, you can use the       */
+  /*    `ftbbox' component which is dedicated to this single task.         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    glyph :: A handle to the source glyph object.                      */
+  /*                                                                       */
+  /*    mode  :: The mode which indicates how to interpret the returned    */
+  /*             bounding box values.                                      */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acbox :: The glyph coordinate bounding box.  Coordinates are       */
+  /*             expressed in 1/64th of pixels if it is grid-fitted.       */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Coordinates are relative to the glyph origin, using the y~upwards  */
+  /*    convention.                                                        */
+  /*                                                                       */
+  /*    If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode'   */
+  /*    must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font        */
+  /*    units in 26.6 pixel format.  The value @FT_GLYPH_BBOX_SUBPIXELS    */
+  /*    is another name for this constant.                                 */
+  /*                                                                       */
+  /*    If the font is tricky and the glyph has been loaded with           */
+  /*    @FT_LOAD_NO_SCALE, the resulting CBox is meaningless.  To get      */
+  /*    reasonable values for the CBox it is necessary to load the glyph   */
+  /*    at a large ppem value (so that the hinting instructions can        */
+  /*    properly shift and scale the subglyphs), then extracting the CBox  */
+  /*    which can be eventually converted back to font units.              */
+  /*                                                                       */
+  /*    Note that the maximum coordinates are exclusive, which means that  */
+  /*    one can compute the width and height of the glyph image (be it in  */
+  /*    integer or 26.6 pixels) as:                                        */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      width  = bbox.xMax - bbox.xMin;                                  */
+  /*      height = bbox.yMax - bbox.yMin;                                  */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    Note also that for 26.6 coordinates, if `bbox_mode' is set to      */
+  /*    @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted,  */
+  /*    which corresponds to:                                              */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      bbox.xMin = FLOOR(bbox.xMin);                                    */
+  /*      bbox.yMin = FLOOR(bbox.yMin);                                    */
+  /*      bbox.xMax = CEILING(bbox.xMax);                                  */
+  /*      bbox.yMax = CEILING(bbox.yMax);                                  */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    To get the bbox in pixel coordinates, set `bbox_mode' to           */
+  /*    @FT_GLYPH_BBOX_TRUNCATE.                                           */
+  /*                                                                       */
+  /*    To get the bbox in grid-fitted pixel coordinates, set `bbox_mode'  */
+  /*    to @FT_GLYPH_BBOX_PIXELS.                                          */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Glyph_Get_CBox( FT_Glyph  glyph,
+                     FT_UInt   bbox_mode,
+                     FT_BBox  *acbox );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Glyph_To_Bitmap                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Convert a given glyph object to a bitmap glyph object.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    the_glyph   :: A pointer to a handle to the target glyph.          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    render_mode :: An enumeration that describes how the data is       */
+  /*                   rendered.                                           */
+  /*                                                                       */
+  /*    origin      :: A pointer to a vector used to translate the glyph   */
+  /*                   image before rendering.  Can be~0 (if no            */
+  /*                   translation).  The origin is expressed in           */
+  /*                   26.6 pixels.                                        */
+  /*                                                                       */
+  /*    destroy     :: A boolean that indicates that the original glyph    */
+  /*                   image should be destroyed by this function.  It is  */
+  /*                   never destroyed in case of error.                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function does nothing if the glyph format isn't scalable.     */
+  /*                                                                       */
+  /*    The glyph image is translated with the `origin' vector before      */
+  /*    rendering.                                                         */
+  /*                                                                       */
+  /*    The first parameter is a pointer to an @FT_Glyph handle, that will */
+  /*    be _replaced_ by this function (with newly allocated data).        */
+  /*    Typically, you would use (omitting error handling):                */
+  /*                                                                       */
+  /*                                                                       */
+  /*      {                                                                */
+  /*        FT_Glyph        glyph;                                         */
+  /*        FT_BitmapGlyph  glyph_bitmap;                                  */
+  /*                                                                       */
+  /*                                                                       */
+  /*        // load glyph                                                  */
+  /*        error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT );     */
+  /*                                                                       */
+  /*        // extract glyph image                                         */
+  /*        error = FT_Get_Glyph( face->glyph, &glyph );                   */
+  /*                                                                       */
+  /*        // convert to a bitmap (default render mode + destroying old)  */
+  /*        if ( glyph->format != FT_GLYPH_FORMAT_BITMAP )                 */
+  /*        {                                                              */
+  /*          error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL,   */
+  /*                                      0, 1 );                          */
+  /*          if ( error ) // `glyph' unchanged                            */
+  /*            ...                                                        */
+  /*        }                                                              */
+  /*                                                                       */
+  /*        // access bitmap content by typecasting                        */
+  /*        glyph_bitmap = (FT_BitmapGlyph)glyph;                          */
+  /*                                                                       */
+  /*        // do funny stuff with it, like blitting/drawing               */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        // discard glyph image (bitmap or not)                         */
+  /*        FT_Done_Glyph( glyph );                                        */
+  /*      }                                                                */
+  /*                                                                       */
+  /*                                                                       */
+  /*    Here another example, again without error handling:                */
+  /*                                                                       */
+  /*                                                                       */
+  /*      {                                                                */
+  /*        FT_Glyph  glyphs[MAX_GLYPHS]                                   */
+  /*                                                                       */
+  /*                                                                       */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */
+  /*          error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) ||       */
+  /*                  FT_Get_Glyph ( face->glyph, &glyph[idx] );           */
+  /*                                                                       */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */
+  /*        {                                                              */
+  /*          FT_Glyph  bitmap = glyphs[idx];                              */
+  /*                                                                       */
+  /*                                                                       */
+  /*          ...                                                          */
+  /*                                                                       */
+  /*          // after this call, `bitmap' no longer points into           */
+  /*          // the `glyphs' array (and the old value isn't destroyed)    */
+  /*          FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 );    */
+  /*                                                                       */
+  /*          ...                                                          */
+  /*                                                                       */
+  /*          FT_Done_Glyph( bitmap );                                     */
+  /*        }                                                              */
+  /*                                                                       */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */
+  /*          FT_Done_Glyph( glyphs[idx] );                                */
+  /*      }                                                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,
+                      FT_Render_Mode  render_mode,
+                      FT_Vector*      origin,
+                      FT_Bool         destroy );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Glyph                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy a given glyph.                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    glyph :: A handle to the target glyph object.                      */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Done_Glyph( FT_Glyph  glyph );
+
+  /* */
+
+
+  /* other helpful functions */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    computations                                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Matrix_Multiply                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Perform the matrix operation `b = a*b'.                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: A pointer to matrix `a'.                                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    b :: A pointer to matrix `b'.                                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The result is undefined if either `a' or `b' is zero.              */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Matrix_Multiply( const FT_Matrix*  a,
+                      FT_Matrix*        b );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Matrix_Invert                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Invert a 2x2 matrix.  Return an error if it can't be inverted.     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    matrix :: A pointer to the target matrix.  Remains untouched in    */
+  /*              case of error.                                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Matrix_Invert( FT_Matrix*  matrix );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGLYPH_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgxval.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgxval.h
new file mode 100644
index 0000000..763652a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgxval.h
@@ -0,0 +1,358 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgxval.h                                                              */
+/*                                                                         */
+/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006 by                                          */
+/*  Masatake YAMATO, Redhat K.K,                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTGXVAL_H__
+#define __FTGXVAL_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    gx_validation                                                      */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    TrueTypeGX/AAT Validation                                          */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    An API to validate TrueTypeGX/AAT tables.                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of functions to validate     */
+  /*    some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd,  */
+  /*    trak, prop, lcar).                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                                                                       */
+  /* Warning: Use FT_VALIDATE_XXX to validate a table.                     */
+  /*          Following definitions are for gxvalid developers.            */
+  /*                                                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define FT_VALIDATE_feat_INDEX     0
+#define FT_VALIDATE_mort_INDEX     1
+#define FT_VALIDATE_morx_INDEX     2
+#define FT_VALIDATE_bsln_INDEX     3
+#define FT_VALIDATE_just_INDEX     4
+#define FT_VALIDATE_kern_INDEX     5
+#define FT_VALIDATE_opbd_INDEX     6
+#define FT_VALIDATE_trak_INDEX     7
+#define FT_VALIDATE_prop_INDEX     8
+#define FT_VALIDATE_lcar_INDEX     9
+#define FT_VALIDATE_GX_LAST_INDEX  FT_VALIDATE_lcar_INDEX
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_VALIDATE_GX_LENGTH
+   *
+   * @description:
+   *   The number of tables checked in this module.  Use it as a parameter
+   *   for the `table-length' argument of function @FT_TrueTypeGX_Validate.
+   */
+#define FT_VALIDATE_GX_LENGTH     (FT_VALIDATE_GX_LAST_INDEX + 1)
+
+  /* */
+
+  /* Up to 0x1000 is used by otvalid.
+     Ox2xxx is reserved for feature OT extension. */
+#define FT_VALIDATE_GX_START 0x4000
+#define FT_VALIDATE_GX_BITFIELD( tag )                  \
+  ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )
+
+
+ /**********************************************************************
+  *
+  * @enum:
+  *    FT_VALIDATE_GXXXX
+  *
+  * @description:
+  *    A list of bit-field constants used with @FT_TrueTypeGX_Validate to
+  *    indicate which TrueTypeGX/AAT Type tables should be validated.
+  *
+  * @values:
+  *    FT_VALIDATE_feat ::
+  *      Validate `feat' table.
+  *
+  *    FT_VALIDATE_mort ::
+  *      Validate `mort' table.
+  *
+  *    FT_VALIDATE_morx ::
+  *      Validate `morx' table.
+  *
+  *    FT_VALIDATE_bsln ::
+  *      Validate `bsln' table.
+  *
+  *    FT_VALIDATE_just ::
+  *      Validate `just' table.
+  *
+  *    FT_VALIDATE_kern ::
+  *      Validate `kern' table.
+  *
+  *    FT_VALIDATE_opbd ::
+  *      Validate `opbd' table.
+  *
+  *    FT_VALIDATE_trak ::
+  *      Validate `trak' table.
+  *
+  *    FT_VALIDATE_prop ::
+  *      Validate `prop' table.
+  *
+  *    FT_VALIDATE_lcar ::
+  *      Validate `lcar' table.
+  *
+  *    FT_VALIDATE_GX ::
+  *      Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern,
+  *      opbd, trak, prop and lcar).
+  *
+  */
+
+#define FT_VALIDATE_feat  FT_VALIDATE_GX_BITFIELD( feat )
+#define FT_VALIDATE_mort  FT_VALIDATE_GX_BITFIELD( mort )
+#define FT_VALIDATE_morx  FT_VALIDATE_GX_BITFIELD( morx )
+#define FT_VALIDATE_bsln  FT_VALIDATE_GX_BITFIELD( bsln )
+#define FT_VALIDATE_just  FT_VALIDATE_GX_BITFIELD( just )
+#define FT_VALIDATE_kern  FT_VALIDATE_GX_BITFIELD( kern )
+#define FT_VALIDATE_opbd  FT_VALIDATE_GX_BITFIELD( opbd )
+#define FT_VALIDATE_trak  FT_VALIDATE_GX_BITFIELD( trak )
+#define FT_VALIDATE_prop  FT_VALIDATE_GX_BITFIELD( prop )
+#define FT_VALIDATE_lcar  FT_VALIDATE_GX_BITFIELD( lcar )
+
+#define FT_VALIDATE_GX  ( FT_VALIDATE_feat | \
+                          FT_VALIDATE_mort | \
+                          FT_VALIDATE_morx | \
+                          FT_VALIDATE_bsln | \
+                          FT_VALIDATE_just | \
+                          FT_VALIDATE_kern | \
+                          FT_VALIDATE_opbd | \
+                          FT_VALIDATE_trak | \
+                          FT_VALIDATE_prop | \
+                          FT_VALIDATE_lcar )
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_TrueTypeGX_Validate
+  *
+  * @description:
+  *    Validate various TrueTypeGX tables to assure that all offsets and
+  *    indices are valid.  The idea is that a higher-level library which
+  *    actually does the text layout can access those tables without
+  *    error checking (which can be quite time consuming).
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    validation_flags ::
+  *       A bit field which specifies the tables to be validated.  See
+  *       @FT_VALIDATE_GXXXX for possible values.
+  *
+  *    table_length ::
+  *       The size of the `tables' array.  Normally, @FT_VALIDATE_GX_LENGTH
+  *       should be passed.
+  *
+  * @output:
+  *    tables ::
+  *       The array where all validated sfnt tables are stored.
+  *       The array itself must be allocated by a client.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   This function only works with TrueTypeGX fonts, returning an error
+  *   otherwise.
+  *
+  *   After use, the application should deallocate the buffers pointed to by
+  *   each `tables' element, by calling @FT_TrueTypeGX_Free.  A NULL value
+  *   indicates that the table either doesn't exist in the font, the
+  *   application hasn't asked for validation, or the validator doesn't have
+  *   the ability to validate the sfnt table.
+  */
+  FT_EXPORT( FT_Error )
+  FT_TrueTypeGX_Validate( FT_Face   face,
+                          FT_UInt   validation_flags,
+                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
+                          FT_UInt   table_length );
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_TrueTypeGX_Free
+  *
+  * @description:
+  *    Free the buffer allocated by TrueTypeGX validator.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    table ::
+  *       The pointer to the buffer allocated by
+  *       @FT_TrueTypeGX_Validate.
+  *
+  * @note:
+  *   This function must be used to free the buffer allocated by
+  *   @FT_TrueTypeGX_Validate only.
+  */
+  FT_EXPORT( void )
+  FT_TrueTypeGX_Free( FT_Face   face,
+                      FT_Bytes  table );
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @enum:
+  *    FT_VALIDATE_CKERNXXX
+  *
+  * @description:
+  *    A list of bit-field constants used with @FT_ClassicKern_Validate
+  *    to indicate the classic kern dialect or dialects.  If the selected
+  *    type doesn't fit, @FT_ClassicKern_Validate regards the table as
+  *    invalid.
+  *
+  * @values:
+  *    FT_VALIDATE_MS ::
+  *      Handle the `kern' table as a classic Microsoft kern table.
+  *
+  *    FT_VALIDATE_APPLE ::
+  *      Handle the `kern' table as a classic Apple kern table.
+  *
+  *    FT_VALIDATE_CKERN ::
+  *      Handle the `kern' as either classic Apple or Microsoft kern table.
+  */
+#define FT_VALIDATE_MS     ( FT_VALIDATE_GX_START << 0 )
+#define FT_VALIDATE_APPLE  ( FT_VALIDATE_GX_START << 1 )
+
+#define FT_VALIDATE_CKERN  ( FT_VALIDATE_MS | FT_VALIDATE_APPLE )
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_ClassicKern_Validate
+  *
+  * @description:
+  *    Validate classic (16-bit format) kern table to assure that the offsets
+  *    and indices are valid.  The idea is that a higher-level library which
+  *    actually does the text layout can access those tables without error
+  *    checking (which can be quite time consuming).
+  *
+  *    The `kern' table validator in @FT_TrueTypeGX_Validate deals with both
+  *    the new 32-bit format and the classic 16-bit format, while
+  *    FT_ClassicKern_Validate only supports the classic 16-bit format.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    validation_flags ::
+  *       A bit field which specifies the dialect to be validated.  See
+  *       @FT_VALIDATE_CKERNXXX for possible values.
+  *
+  * @output:
+  *    ckern_table ::
+  *       A pointer to the kern table.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   After use, the application should deallocate the buffers pointed to by
+  *   `ckern_table', by calling @FT_ClassicKern_Free.  A NULL value
+  *   indicates that the table doesn't exist in the font.
+  */
+  FT_EXPORT( FT_Error )
+  FT_ClassicKern_Validate( FT_Face    face,
+                           FT_UInt    validation_flags,
+                           FT_Bytes  *ckern_table );
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_ClassicKern_Free
+  *
+  * @description:
+  *    Free the buffer allocated by classic Kern validator.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    table ::
+  *       The pointer to the buffer that is allocated by
+  *       @FT_ClassicKern_Validate.
+  *
+  * @note:
+  *   This function must be used to free the buffer allocated by
+  *   @FT_ClassicKern_Validate only.
+  */
+  FT_EXPORT( void )
+  FT_ClassicKern_Free( FT_Face   face,
+                       FT_Bytes  table );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGXVAL_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgzip.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgzip.h
new file mode 100644
index 0000000..87155a4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgzip.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgzip.h                                                               */
+/*                                                                         */
+/*    Gzip-compressed stream support.                                      */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2006 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTGZIP_H__
+#define __FTGZIP_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    gzip                                                               */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    GZIP Streams                                                       */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Using gzip-compressed font files.                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of Gzip-specific functions.  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+ /************************************************************************
+  *
+  * @function:
+  *   FT_Stream_OpenGzip
+  *
+  * @description:
+  *   Open a new stream to parse gzip-compressed font files.  This is
+  *   mainly used to support the compressed `*.pcf.gz' fonts that come
+  *   with XFree86.
+  *
+  * @input:
+  *   stream ::
+  *     The target embedding stream.
+  *
+  *   source ::
+  *     The source stream.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   The source stream must be opened _before_ calling this function.
+  *
+  *   Calling the internal function `FT_Stream_Close' on the new stream will
+  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream
+  *   objects will be released to the heap.
+  *
+  *   The stream implementation is very basic and resets the decompression
+  *   process each time seeking backwards is needed within the stream.
+  *
+  *   In certain builds of the library, gzip compression recognition is
+  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.
+  *   This means that if no font driver is capable of handling the raw
+  *   compressed file, the library will try to open a gzipped stream from
+  *   it and re-open the face with it.
+  *
+  *   This function may return `FT_Err_Unimplemented_Feature' if your build
+  *   of FreeType was not compiled with zlib support.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Stream_OpenGzip( FT_Stream  stream,
+                      FT_Stream  source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGZIP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftimage.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftimage.h
new file mode 100644
index 0000000..401cb38
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftimage.h
@@ -0,0 +1,1322 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftimage.h                                                              */
+/*                                                                         */
+/*    FreeType glyph image formats and default raster interface            */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 1996-2010, 2013 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Note: A `raster' is simply a scan-line converter, used to render      */
+  /*       FT_Outlines into FT_Bitmaps.                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTIMAGE_H__
+#define __FTIMAGE_H__
+
+
+  /* _STANDALONE_ is from ftgrays.c */
+#ifndef _STANDALONE_
+#include "../ft2build.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    basic_types                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Pos                                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The type FT_Pos is used to store vectorial coordinates.  Depending */
+  /*    on the context, these can represent distances in integer font      */
+  /*    units, or 16.16, or 26.6 fixed-point pixel coordinates.            */
+  /*                                                                       */
+  typedef signed long  FT_Pos;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Vector                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to store a 2D vector; coordinates are of   */
+  /*    the FT_Pos type.                                                   */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    x :: The horizontal coordinate.                                    */
+  /*    y :: The vertical coordinate.                                      */
+  /*                                                                       */
+  typedef struct  FT_Vector_
+  {
+    FT_Pos  x;
+    FT_Pos  y;
+
+  } FT_Vector;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_BBox                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold an outline's bounding box, i.e., the      */
+  /*    coordinates of its extrema in the horizontal and vertical          */
+  /*    directions.                                                        */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    xMin :: The horizontal minimum (left-most).                        */
+  /*                                                                       */
+  /*    yMin :: The vertical minimum (bottom-most).                        */
+  /*                                                                       */
+  /*    xMax :: The horizontal maximum (right-most).                       */
+  /*                                                                       */
+  /*    yMax :: The vertical maximum (top-most).                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The bounding box is specified with the coordinates of the lower    */
+  /*    left and the upper right corner.  In PostScript, those values are  */
+  /*    often called (llx,lly) and (urx,ury), respectively.                */
+  /*                                                                       */
+  /*    If `yMin' is negative, this value gives the glyph's descender.     */
+  /*    Otherwise, the glyph doesn't descend below the baseline.           */
+  /*    Similarly, if `ymax' is positive, this value gives the glyph's     */
+  /*    ascender.                                                          */
+  /*                                                                       */
+  /*    `xMin' gives the horizontal distance from the glyph's origin to    */
+  /*    the left edge of the glyph's bounding box.  If `xMin' is negative, */
+  /*    the glyph extends to the left of the origin.                       */
+  /*                                                                       */
+  typedef struct  FT_BBox_
+  {
+    FT_Pos  xMin, yMin;
+    FT_Pos  xMax, yMax;
+
+  } FT_BBox;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Pixel_Mode                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration type used to describe the format of pixels in a     */
+  /*    given bitmap.  Note that additional formats may be added in the    */
+  /*    future.                                                            */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_PIXEL_MODE_NONE ::                                              */
+  /*      Value~0 is reserved.                                             */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_MONO ::                                              */
+  /*      A monochrome bitmap, using 1~bit per pixel.  Note that pixels    */
+  /*      are stored in most-significant order (MSB), which means that     */
+  /*      the left-most pixel in a byte has value 128.                     */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_GRAY ::                                              */
+  /*      An 8-bit bitmap, generally used to represent anti-aliased glyph  */
+  /*      images.  Each pixel is stored in one byte.  Note that the number */
+  /*      of `gray' levels is stored in the `num_grays' field of the       */
+  /*      @FT_Bitmap structure (it generally is 256).                      */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_GRAY2 ::                                             */
+  /*      A 2-bit per pixel bitmap, used to represent embedded             */
+  /*      anti-aliased bitmaps in font files according to the OpenType     */
+  /*      specification.  We haven't found a single font using this        */
+  /*      format, however.                                                 */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_GRAY4 ::                                             */
+  /*      A 4-bit per pixel bitmap, representing embedded anti-aliased     */
+  /*      bitmaps in font files according to the OpenType specification.   */
+  /*      We haven't found a single font using this format, however.       */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_LCD ::                                               */
+  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */
+  /*      used for display on LCD displays; the bitmap is three times      */
+  /*      wider than the original glyph image.  See also                   */
+  /*      @FT_RENDER_MODE_LCD.                                             */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_LCD_V ::                                             */
+  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */
+  /*      used for display on rotated LCD displays; the bitmap is three    */
+  /*      times taller than the original glyph image.  See also            */
+  /*      @FT_RENDER_MODE_LCD_V.                                           */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_BGRA ::                                              */
+  /*      An image with four 8-bit channels per pixel, representing a      */
+  /*      color image (such as emoticons) with alpha channel.  For each    */
+  /*      pixel, the format is BGRA, which means, the blue channel comes   */
+  /*      first in memory.  The color channels are pre-multiplied and in   */
+  /*      the sRGB colorspace.  For example, full red at half-translucent  */
+  /*      opacity will be represented as `00,00,80,80', not `00,00,FF,80'. */
+  /*      See also @FT_LOAD_COLOR.                                         */
+  /*                                                                       */
+  typedef enum  FT_Pixel_Mode_
+  {
+    FT_PIXEL_MODE_NONE = 0,
+    FT_PIXEL_MODE_MONO,
+    FT_PIXEL_MODE_GRAY,
+    FT_PIXEL_MODE_GRAY2,
+    FT_PIXEL_MODE_GRAY4,
+    FT_PIXEL_MODE_LCD,
+    FT_PIXEL_MODE_LCD_V,
+    FT_PIXEL_MODE_BGRA,
+
+    FT_PIXEL_MODE_MAX      /* do not remove */
+
+  } FT_Pixel_Mode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_pixel_mode_xxx                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of deprecated constants.  Use the corresponding             */
+  /*    @FT_Pixel_Mode values instead.                                     */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    ft_pixel_mode_none  :: See @FT_PIXEL_MODE_NONE.                    */
+  /*    ft_pixel_mode_mono  :: See @FT_PIXEL_MODE_MONO.                    */
+  /*    ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY.                    */
+  /*    ft_pixel_mode_pal2  :: See @FT_PIXEL_MODE_GRAY2.                   */
+  /*    ft_pixel_mode_pal4  :: See @FT_PIXEL_MODE_GRAY4.                   */
+  /*                                                                       */
+#define ft_pixel_mode_none   FT_PIXEL_MODE_NONE
+#define ft_pixel_mode_mono   FT_PIXEL_MODE_MONO
+#define ft_pixel_mode_grays  FT_PIXEL_MODE_GRAY
+#define ft_pixel_mode_pal2   FT_PIXEL_MODE_GRAY2
+#define ft_pixel_mode_pal4   FT_PIXEL_MODE_GRAY4
+
+ /* */
+
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Palette_Mode                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT!                           */
+  /*                                                                       */
+  /*    An enumeration type to describe the format of a bitmap palette,    */
+  /*    used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8.               */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    ft_palette_mode_rgb  :: The palette is an array of 3-byte RGB      */
+  /*                            records.                                   */
+  /*                                                                       */
+  /*    ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA     */
+  /*                            records.                                   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by       */
+  /*    FreeType, these types are not handled by the library itself.       */
+  /*                                                                       */
+  typedef enum  FT_Palette_Mode_
+  {
+    ft_palette_mode_rgb = 0,
+    ft_palette_mode_rgba,
+
+    ft_palette_mode_max   /* do not remove */
+
+  } FT_Palette_Mode;
+
+  /* */
+
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Bitmap                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to describe a bitmap or pixmap to the raster.     */
+  /*    Note that we now manage pixmaps of various depths through the      */
+  /*    `pixel_mode' field.                                                */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    rows         :: The number of bitmap rows.                         */
+  /*                                                                       */
+  /*    width        :: The number of pixels in bitmap row.                */
+  /*                                                                       */
+  /*    pitch        :: The pitch's absolute value is the number of bytes  */
+  /*                    taken by one bitmap row, including padding.        */
+  /*                    However, the pitch is positive when the bitmap has */
+  /*                    a `down' flow, and negative when it has an `up'    */
+  /*                    flow.  In all cases, the pitch is an offset to add */
+  /*                    to a bitmap pointer in order to go down one row.   */
+  /*                                                                       */
+  /*                    Note that `padding' means the alignment of a       */
+  /*                    bitmap to a byte border, and FreeType functions    */
+  /*                    normally align to the smallest possible integer    */
+  /*                    value.                                             */
+  /*                                                                       */
+  /*                    For the B/W rasterizer, `pitch' is always an even  */
+  /*                    number.                                            */
+  /*                                                                       */
+  /*                    To change the pitch of a bitmap (say, to make it a */
+  /*                    multiple of 4), use @FT_Bitmap_Convert.            */
+  /*                    Alternatively, you might use callback functions to */
+  /*                    directly render to the application's surface; see  */
+  /*                    the file `example2.cpp' in the tutorial for a      */
+  /*                    demonstration.                                     */
+  /*                                                                       */
+  /*    buffer       :: A typeless pointer to the bitmap buffer.  This     */
+  /*                    value should be aligned on 32-bit boundaries in    */
+  /*                    most cases.                                        */
+  /*                                                                       */
+  /*    num_grays    :: This field is only used with                       */
+  /*                    @FT_PIXEL_MODE_GRAY; it gives the number of gray   */
+  /*                    levels used in the bitmap.                         */
+  /*                                                                       */
+  /*    pixel_mode   :: The pixel mode, i.e., how pixel bits are stored.   */
+  /*                    See @FT_Pixel_Mode for possible values.            */
+  /*                                                                       */
+  /*    palette_mode :: This field is intended for paletted pixel modes;   */
+  /*                    it indicates how the palette is stored.  Not       */
+  /*                    used currently.                                    */
+  /*                                                                       */
+  /*    palette      :: A typeless pointer to the bitmap palette; this     */
+  /*                    field is intended for paletted pixel modes.  Not   */
+  /*                    used currently.                                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*   For now, the only pixel modes supported by FreeType are mono and    */
+  /*   grays.  However, drivers might be added in the future to support    */
+  /*   more `colorful' options.                                            */
+  /*                                                                       */
+  typedef struct  FT_Bitmap_
+  {
+    int             rows;
+    int             width;
+    int             pitch;
+    unsigned char*  buffer;
+    short           num_grays;
+    char            pixel_mode;
+    char            palette_mode;
+    void*           palette;
+
+  } FT_Bitmap;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    outline_processing                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Outline                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure is used to describe an outline to the scan-line     */
+  /*    converter.                                                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    n_contours :: The number of contours in the outline.               */
+  /*                                                                       */
+  /*    n_points   :: The number of points in the outline.                 */
+  /*                                                                       */
+  /*    points     :: A pointer to an array of `n_points' @FT_Vector       */
+  /*                  elements, giving the outline's point coordinates.    */
+  /*                                                                       */
+  /*    tags       :: A pointer to an array of `n_points' chars, giving    */
+  /*                  each outline point's type.                           */
+  /*                                                                       */
+  /*                  If bit~0 is unset, the point is `off' the curve,     */
+  /*                  i.e., a Bézier control point, while it is `on' if    */
+  /*                  set.                                                 */
+  /*                                                                       */
+  /*                  Bit~1 is meaningful for `off' points only.  If set,  */
+  /*                  it indicates a third-order Bézier arc control point; */
+  /*                  and a second-order control point if unset.           */
+  /*                                                                       */
+  /*                  If bit~2 is set, bits 5-7 contain the drop-out mode  */
+  /*                  (as defined in the OpenType specification; the value */
+  /*                  is the same as the argument to the SCANMODE          */
+  /*                  instruction).                                        */
+  /*                                                                       */
+  /*                  Bits 3 and~4 are reserved for internal purposes.     */
+  /*                                                                       */
+  /*    contours   :: An array of `n_contours' shorts, giving the end      */
+  /*                  point of each contour within the outline.  For       */
+  /*                  example, the first contour is defined by the points  */
+  /*                  `0' to `contours[0]', the second one is defined by   */
+  /*                  the points `contours[0]+1' to `contours[1]', etc.    */
+  /*                                                                       */
+  /*    flags      :: A set of bit flags used to characterize the outline  */
+  /*                  and give hints to the scan-converter and hinter on   */
+  /*                  how to convert/grid-fit it.  See @FT_OUTLINE_FLAGS.  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The B/W rasterizer only checks bit~2 in the `tags' array for the   */
+  /*    first point of each contour.  The drop-out mode as given with      */
+  /*    @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and       */
+  /*    @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden.           */
+  /*                                                                       */
+  typedef struct  FT_Outline_
+  {
+    short       n_contours;      /* number of contours in glyph        */
+    short       n_points;        /* number of points in the glyph      */
+
+    FT_Vector*  points;          /* the outline's points               */
+    char*       tags;            /* the points flags                   */
+    short*      contours;        /* the contour end points             */
+
+    int         flags;           /* outline masks                      */
+
+  } FT_Outline;
+
+  /* Following limits must be consistent with */
+  /* FT_Outline.{n_contours,n_points}         */
+#define FT_OUTLINE_CONTOURS_MAX  SHRT_MAX
+#define FT_OUTLINE_POINTS_MAX    SHRT_MAX
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_OUTLINE_FLAGS                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit-field constants use for the flags in an outline's    */
+  /*    `flags' field.                                                     */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_OUTLINE_NONE ::                                                 */
+  /*      Value~0 is reserved.                                             */
+  /*                                                                       */
+  /*    FT_OUTLINE_OWNER ::                                                */
+  /*      If set, this flag indicates that the outline's field arrays      */
+  /*      (i.e., `points', `flags', and `contours') are `owned' by the     */
+  /*      outline object, and should thus be freed when it is destroyed.   */
+  /*                                                                       */
+  /*    FT_OUTLINE_EVEN_ODD_FILL ::                                        */
+  /*      By default, outlines are filled using the non-zero winding rule. */
+  /*      If set to 1, the outline will be filled using the even-odd fill  */
+  /*      rule (only works with the smooth rasterizer).                    */
+  /*                                                                       */
+  /*    FT_OUTLINE_REVERSE_FILL ::                                         */
+  /*      By default, outside contours of an outline are oriented in       */
+  /*      clock-wise direction, as defined in the TrueType specification.  */
+  /*      This flag is set if the outline uses the opposite direction      */
+  /*      (typically for Type~1 fonts).  This flag is ignored by the scan  */
+  /*      converter.                                                       */
+  /*                                                                       */
+  /*    FT_OUTLINE_IGNORE_DROPOUTS ::                                      */
+  /*      By default, the scan converter will try to detect drop-outs in   */
+  /*      an outline and correct the glyph bitmap to ensure consistent     */
+  /*      shape continuity.  If set, this flag hints the scan-line         */
+  /*      converter to ignore such cases.  See below for more information. */
+  /*                                                                       */
+  /*    FT_OUTLINE_SMART_DROPOUTS ::                                       */
+  /*      Select smart dropout control.  If unset, use simple dropout      */
+  /*      control.  Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See    */
+  /*      below for more information.                                      */
+  /*                                                                       */
+  /*    FT_OUTLINE_INCLUDE_STUBS ::                                        */
+  /*      If set, turn pixels on for `stubs', otherwise exclude them.      */
+  /*      Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See below for    */
+  /*      more information.                                                */
+  /*                                                                       */
+  /*    FT_OUTLINE_HIGH_PRECISION ::                                       */
+  /*      This flag indicates that the scan-line converter should try to   */
+  /*      convert this outline to bitmaps with the highest possible        */
+  /*      quality.  It is typically set for small character sizes.  Note   */
+  /*      that this is only a hint that might be completely ignored by a   */
+  /*      given scan-converter.                                            */
+  /*                                                                       */
+  /*    FT_OUTLINE_SINGLE_PASS ::                                          */
+  /*      This flag is set to force a given scan-converter to only use a   */
+  /*      single pass over the outline to render a bitmap glyph image.     */
+  /*      Normally, it is set for very large character sizes.  It is only  */
+  /*      a hint that might be completely ignored by a given               */
+  /*      scan-converter.                                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */
+  /*    and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth            */
+  /*    rasterizer.                                                        */
+  /*                                                                       */
+  /*    There exists a second mechanism to pass the drop-out mode to the   */
+  /*    B/W rasterizer; see the `tags' field in @FT_Outline.               */
+  /*                                                                       */
+  /*    Please refer to the description of the `SCANTYPE' instruction in   */
+  /*    the OpenType specification (in file `ttinst1.doc') how simple      */
+  /*    drop-outs, smart drop-outs, and stubs are defined.                 */
+  /*                                                                       */
+#define FT_OUTLINE_NONE             0x0
+#define FT_OUTLINE_OWNER            0x1
+#define FT_OUTLINE_EVEN_ODD_FILL    0x2
+#define FT_OUTLINE_REVERSE_FILL     0x4
+#define FT_OUTLINE_IGNORE_DROPOUTS  0x8
+#define FT_OUTLINE_SMART_DROPOUTS   0x10
+#define FT_OUTLINE_INCLUDE_STUBS    0x20
+
+#define FT_OUTLINE_HIGH_PRECISION   0x100
+#define FT_OUTLINE_SINGLE_PASS      0x200
+
+
+ /*************************************************************************
+  *
+  * @enum:
+  *   ft_outline_flags
+  *
+  * @description:
+  *   These constants are deprecated.  Please use the corresponding
+  *   @FT_OUTLINE_FLAGS values.
+  *
+  * @values:
+  *   ft_outline_none            :: See @FT_OUTLINE_NONE.
+  *   ft_outline_owner           :: See @FT_OUTLINE_OWNER.
+  *   ft_outline_even_odd_fill   :: See @FT_OUTLINE_EVEN_ODD_FILL.
+  *   ft_outline_reverse_fill    :: See @FT_OUTLINE_REVERSE_FILL.
+  *   ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS.
+  *   ft_outline_high_precision  :: See @FT_OUTLINE_HIGH_PRECISION.
+  *   ft_outline_single_pass     :: See @FT_OUTLINE_SINGLE_PASS.
+  */
+#define ft_outline_none             FT_OUTLINE_NONE
+#define ft_outline_owner            FT_OUTLINE_OWNER
+#define ft_outline_even_odd_fill    FT_OUTLINE_EVEN_ODD_FILL
+#define ft_outline_reverse_fill     FT_OUTLINE_REVERSE_FILL
+#define ft_outline_ignore_dropouts  FT_OUTLINE_IGNORE_DROPOUTS
+#define ft_outline_high_precision   FT_OUTLINE_HIGH_PRECISION
+#define ft_outline_single_pass      FT_OUTLINE_SINGLE_PASS
+
+  /* */
+
+#define FT_CURVE_TAG( flag )  ( flag & 3 )
+
+#define FT_CURVE_TAG_ON            1
+#define FT_CURVE_TAG_CONIC         0
+#define FT_CURVE_TAG_CUBIC         2
+
+#define FT_CURVE_TAG_HAS_SCANMODE  4
+
+#define FT_CURVE_TAG_TOUCH_X       8  /* reserved for the TrueType hinter */
+#define FT_CURVE_TAG_TOUCH_Y      16  /* reserved for the TrueType hinter */
+
+#define FT_CURVE_TAG_TOUCH_BOTH    ( FT_CURVE_TAG_TOUCH_X | \
+                                     FT_CURVE_TAG_TOUCH_Y )
+
+#define FT_Curve_Tag_On       FT_CURVE_TAG_ON
+#define FT_Curve_Tag_Conic    FT_CURVE_TAG_CONIC
+#define FT_Curve_Tag_Cubic    FT_CURVE_TAG_CUBIC
+#define FT_Curve_Tag_Touch_X  FT_CURVE_TAG_TOUCH_X
+#define FT_Curve_Tag_Touch_Y  FT_CURVE_TAG_TOUCH_Y
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Outline_MoveToFunc                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function pointer type used to describe the signature of a `move  */
+  /*    to' function during outline walking/decomposition.                 */
+  /*                                                                       */
+  /*    A `move to' is emitted to start a new contour in an outline.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    to   :: A pointer to the target point of the `move to'.            */
+  /*                                                                       */
+  /*    user :: A typeless pointer which is passed from the caller of the  */
+  /*            decomposition function.                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  typedef int
+  (*FT_Outline_MoveToFunc)( const FT_Vector*  to,
+                            void*             user );
+
+#define FT_Outline_MoveTo_Func  FT_Outline_MoveToFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Outline_LineToFunc                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function pointer type used to describe the signature of a `line  */
+  /*    to' function during outline walking/decomposition.                 */
+  /*                                                                       */
+  /*    A `line to' is emitted to indicate a segment in the outline.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    to   :: A pointer to the target point of the `line to'.            */
+  /*                                                                       */
+  /*    user :: A typeless pointer which is passed from the caller of the  */
+  /*            decomposition function.                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  typedef int
+  (*FT_Outline_LineToFunc)( const FT_Vector*  to,
+                            void*             user );
+
+#define FT_Outline_LineTo_Func  FT_Outline_LineToFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Outline_ConicToFunc                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function pointer type used to describe the signature of a `conic */
+  /*    to' function during outline walking or decomposition.              */
+  /*                                                                       */
+  /*    A `conic to' is emitted to indicate a second-order Bézier arc in   */
+  /*    the outline.                                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    control :: An intermediate control point between the last position */
+  /*               and the new target in `to'.                             */
+  /*                                                                       */
+  /*    to      :: A pointer to the target end point of the conic arc.     */
+  /*                                                                       */
+  /*    user    :: A typeless pointer which is passed from the caller of   */
+  /*               the decomposition function.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  typedef int
+  (*FT_Outline_ConicToFunc)( const FT_Vector*  control,
+                             const FT_Vector*  to,
+                             void*             user );
+
+#define FT_Outline_ConicTo_Func  FT_Outline_ConicToFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Outline_CubicToFunc                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function pointer type used to describe the signature of a `cubic */
+  /*    to' function during outline walking or decomposition.              */
+  /*                                                                       */
+  /*    A `cubic to' is emitted to indicate a third-order Bézier arc.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    control1 :: A pointer to the first Bézier control point.           */
+  /*                                                                       */
+  /*    control2 :: A pointer to the second Bézier control point.          */
+  /*                                                                       */
+  /*    to       :: A pointer to the target end point.                     */
+  /*                                                                       */
+  /*    user     :: A typeless pointer which is passed from the caller of  */
+  /*                the decomposition function.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  typedef int
+  (*FT_Outline_CubicToFunc)( const FT_Vector*  control1,
+                             const FT_Vector*  control2,
+                             const FT_Vector*  to,
+                             void*             user );
+
+#define FT_Outline_CubicTo_Func  FT_Outline_CubicToFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Outline_Funcs                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure to hold various function pointers used during outline  */
+  /*    decomposition in order to emit segments, conic, and cubic Béziers. */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    move_to  :: The `move to' emitter.                                 */
+  /*                                                                       */
+  /*    line_to  :: The segment emitter.                                   */
+  /*                                                                       */
+  /*    conic_to :: The second-order Bézier arc emitter.                   */
+  /*                                                                       */
+  /*    cubic_to :: The third-order Bézier arc emitter.                    */
+  /*                                                                       */
+  /*    shift    :: The shift that is applied to coordinates before they   */
+  /*                are sent to the emitter.                               */
+  /*                                                                       */
+  /*    delta    :: The delta that is applied to coordinates before they   */
+  /*                are sent to the emitter, but after the shift.          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The point coordinates sent to the emitters are the transformed     */
+  /*    version of the original coordinates (this is important for high    */
+  /*    accuracy during scan-conversion).  The transformation is simple:   */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      x' = (x << shift) - delta                                        */
+  /*      y' = (x << shift) - delta                                        */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    Set the values of `shift' and `delta' to~0 to get the original     */
+  /*    point coordinates.                                                 */
+  /*                                                                       */
+  typedef struct  FT_Outline_Funcs_
+  {
+    FT_Outline_MoveToFunc   move_to;
+    FT_Outline_LineToFunc   line_to;
+    FT_Outline_ConicToFunc  conic_to;
+    FT_Outline_CubicToFunc  cubic_to;
+
+    int                     shift;
+    FT_Pos                  delta;
+
+  } FT_Outline_Funcs;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    basic_types                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_IMAGE_TAG                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro converts four-letter tags to an unsigned long type.     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */
+  /*    should redefine this macro in case of problems to something like   */
+  /*    this:                                                              */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  value         */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    to get a simple enumeration without assigning special numbers.     */
+  /*                                                                       */
+#ifndef FT_IMAGE_TAG
+#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  \
+          value = ( ( (unsigned long)_x1 << 24 ) | \
+                    ( (unsigned long)_x2 << 16 ) | \
+                    ( (unsigned long)_x3 << 8  ) | \
+                      (unsigned long)_x4         )
+#endif /* FT_IMAGE_TAG */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Glyph_Format                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration type used to describe the format of a given glyph   */
+  /*    image.  Note that this version of FreeType only supports two image */
+  /*    formats, even though future font drivers will be able to register  */
+  /*    their own format.                                                  */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_GLYPH_FORMAT_NONE ::                                            */
+  /*      The value~0 is reserved.                                         */
+  /*                                                                       */
+  /*    FT_GLYPH_FORMAT_COMPOSITE ::                                       */
+  /*      The glyph image is a composite of several other images.  This    */
+  /*      format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to   */
+  /*      report compound glyphs (like accented characters).               */
+  /*                                                                       */
+  /*    FT_GLYPH_FORMAT_BITMAP ::                                          */
+  /*      The glyph image is a bitmap, and can be described as an          */
+  /*      @FT_Bitmap.  You generally need to access the `bitmap' field of  */
+  /*      the @FT_GlyphSlotRec structure to read it.                       */
+  /*                                                                       */
+  /*    FT_GLYPH_FORMAT_OUTLINE ::                                         */
+  /*      The glyph image is a vectorial outline made of line segments     */
+  /*      and Bézier arcs; it can be described as an @FT_Outline; you      */
+  /*      generally want to access the `outline' field of the              */
+  /*      @FT_GlyphSlotRec structure to read it.                           */
+  /*                                                                       */
+  /*    FT_GLYPH_FORMAT_PLOTTER ::                                         */
+  /*      The glyph image is a vectorial path with no inside and outside   */
+  /*      contours.  Some Type~1 fonts, like those in the Hershey family,  */
+  /*      contain glyphs in this format.  These are described as           */
+  /*      @FT_Outline, but FreeType isn't currently capable of rendering   */
+  /*      them correctly.                                                  */
+  /*                                                                       */
+  typedef enum  FT_Glyph_Format_
+  {
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ),
+
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ),
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP,    'b', 'i', 't', 's' ),
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE,   'o', 'u', 't', 'l' ),
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER,   'p', 'l', 'o', 't' )
+
+  } FT_Glyph_Format;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_glyph_format_xxx                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of deprecated constants.  Use the corresponding             */
+  /*    @FT_Glyph_Format values instead.                                   */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    ft_glyph_format_none      :: See @FT_GLYPH_FORMAT_NONE.            */
+  /*    ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE.       */
+  /*    ft_glyph_format_bitmap    :: See @FT_GLYPH_FORMAT_BITMAP.          */
+  /*    ft_glyph_format_outline   :: See @FT_GLYPH_FORMAT_OUTLINE.         */
+  /*    ft_glyph_format_plotter   :: See @FT_GLYPH_FORMAT_PLOTTER.         */
+  /*                                                                       */
+#define ft_glyph_format_none       FT_GLYPH_FORMAT_NONE
+#define ft_glyph_format_composite  FT_GLYPH_FORMAT_COMPOSITE
+#define ft_glyph_format_bitmap     FT_GLYPH_FORMAT_BITMAP
+#define ft_glyph_format_outline    FT_GLYPH_FORMAT_OUTLINE
+#define ft_glyph_format_plotter    FT_GLYPH_FORMAT_PLOTTER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****            R A S T E R   D E F I N I T I O N S                *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A raster is a scan converter, in charge of rendering an outline into  */
+  /* a a bitmap.  This section contains the public API for rasters.        */
+  /*                                                                       */
+  /* Note that in FreeType 2, all rasters are now encapsulated within      */
+  /* specific modules called `renderers'.  See `freetype/ftrender.h' for   */
+  /* more details on renderers.                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    raster                                                             */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Scanline Converter                                                 */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    How vectorial outlines are converted into bitmaps and pixmaps.     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains technical definitions.                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Raster                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle (pointer) to a raster object.  Each object can be used    */
+  /*    independently to convert an outline into a bitmap or pixmap.       */
+  /*                                                                       */
+  typedef struct FT_RasterRec_*  FT_Raster;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Span                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a single span of gray (or black) pixels  */
+  /*    when rendering a monochrome or anti-aliased bitmap.                */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    x        :: The span's horizontal start position.                  */
+  /*                                                                       */
+  /*    len      :: The span's length in pixels.                           */
+  /*                                                                       */
+  /*    coverage :: The span color/coverage, ranging from 0 (background)   */
+  /*                to 255 (foreground).  Only used for anti-aliased       */
+  /*                rendering.                                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This structure is used by the span drawing callback type named     */
+  /*    @FT_SpanFunc which takes the y~coordinate of the span as a         */
+  /*    a parameter.                                                       */
+  /*                                                                       */
+  /*    The coverage value is always between 0 and 255.  If you want less  */
+  /*    gray values, the callback function has to reduce them.             */
+  /*                                                                       */
+  typedef struct  FT_Span_
+  {
+    short           x;
+    unsigned short  len;
+    unsigned char   coverage;
+
+  } FT_Span;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_SpanFunc                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used as a call-back by the anti-aliased renderer in     */
+  /*    order to let client applications draw themselves the gray pixel    */
+  /*    spans on each scan line.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    y     :: The scanline's y~coordinate.                              */
+  /*                                                                       */
+  /*    count :: The number of spans to draw on this scanline.             */
+  /*                                                                       */
+  /*    spans :: A table of `count' spans to draw on the scanline.         */
+  /*                                                                       */
+  /*    user  :: User-supplied data that is passed to the callback.        */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This callback allows client applications to directly render the    */
+  /*    gray spans of the anti-aliased bitmap to any kind of surfaces.     */
+  /*                                                                       */
+  /*    This can be used to write anti-aliased outlines directly to a      */
+  /*    given background bitmap, and even perform translucency.            */
+  /*                                                                       */
+  /*    Note that the `count' field cannot be greater than a fixed value   */
+  /*    defined by the `FT_MAX_GRAY_SPANS' configuration macro in          */
+  /*    `ftoption.h'.  By default, this value is set to~32, which means    */
+  /*    that if there are more than 32~spans on a given scanline, the      */
+  /*    callback is called several times with the same `y' parameter in    */
+  /*    order to draw all callbacks.                                       */
+  /*                                                                       */
+  /*    Otherwise, the callback is only called once per scan-line, and     */
+  /*    only for those scanlines that do have `gray' pixels on them.       */
+  /*                                                                       */
+  typedef void
+  (*FT_SpanFunc)( int             y,
+                  int             count,
+                  const FT_Span*  spans,
+                  void*           user );
+
+#define FT_Raster_Span_Func  FT_SpanFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_BitTest_Func                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT.                           */
+  /*                                                                       */
+  /*    A function used as a call-back by the monochrome scan-converter    */
+  /*    to test whether a given target pixel is already set to the drawing */
+  /*    `color'.  These tests are crucial to implement drop-out control    */
+  /*    per-se the TrueType spec.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    y     :: The pixel's y~coordinate.                                 */
+  /*                                                                       */
+  /*    x     :: The pixel's x~coordinate.                                 */
+  /*                                                                       */
+  /*    user  :: User-supplied data that is passed to the callback.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   1~if the pixel is `set', 0~otherwise.                               */
+  /*                                                                       */
+  typedef int
+  (*FT_Raster_BitTest_Func)( int    y,
+                             int    x,
+                             void*  user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_BitSet_Func                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT.                           */
+  /*                                                                       */
+  /*    A function used as a call-back by the monochrome scan-converter    */
+  /*    to set an individual target pixel.  This is crucial to implement   */
+  /*    drop-out control according to the TrueType specification.          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    y     :: The pixel's y~coordinate.                                 */
+  /*                                                                       */
+  /*    x     :: The pixel's x~coordinate.                                 */
+  /*                                                                       */
+  /*    user  :: User-supplied data that is passed to the callback.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    1~if the pixel is `set', 0~otherwise.                              */
+  /*                                                                       */
+  typedef void
+  (*FT_Raster_BitSet_Func)( int    y,
+                            int    x,
+                            void*  user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_RASTER_FLAG_XXX                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit flag constants as used in the `flags' field of a     */
+  /*    @FT_Raster_Params structure.                                       */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_RASTER_FLAG_DEFAULT :: This value is 0.                         */
+  /*                                                                       */
+  /*    FT_RASTER_FLAG_AA      :: This flag is set to indicate that an     */
+  /*                              anti-aliased glyph image should be       */
+  /*                              generated.  Otherwise, it will be        */
+  /*                              monochrome (1-bit).                      */
+  /*                                                                       */
+  /*    FT_RASTER_FLAG_DIRECT  :: This flag is set to indicate direct      */
+  /*                              rendering.  In this mode, client         */
+  /*                              applications must provide their own span */
+  /*                              callback.  This lets them directly       */
+  /*                              draw or compose over an existing bitmap. */
+  /*                              If this bit is not set, the target       */
+  /*                              pixmap's buffer _must_ be zeroed before  */
+  /*                              rendering.                               */
+  /*                                                                       */
+  /*                              Note that for now, direct rendering is   */
+  /*                              only possible with anti-aliased glyphs.  */
+  /*                                                                       */
+  /*    FT_RASTER_FLAG_CLIP    :: This flag is only used in direct         */
+  /*                              rendering mode.  If set, the output will */
+  /*                              be clipped to a box specified in the     */
+  /*                              `clip_box' field of the                  */
+  /*                              @FT_Raster_Params structure.             */
+  /*                                                                       */
+  /*                              Note that by default, the glyph bitmap   */
+  /*                              is clipped to the target pixmap, except  */
+  /*                              in direct rendering mode where all spans */
+  /*                              are generated if no clipping box is set. */
+  /*                                                                       */
+#define FT_RASTER_FLAG_DEFAULT  0x0
+#define FT_RASTER_FLAG_AA       0x1
+#define FT_RASTER_FLAG_DIRECT   0x2
+#define FT_RASTER_FLAG_CLIP     0x4
+
+  /* deprecated */
+#define ft_raster_flag_default  FT_RASTER_FLAG_DEFAULT
+#define ft_raster_flag_aa       FT_RASTER_FLAG_AA
+#define ft_raster_flag_direct   FT_RASTER_FLAG_DIRECT
+#define ft_raster_flag_clip     FT_RASTER_FLAG_CLIP
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Raster_Params                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure to hold the arguments used by a raster's render        */
+  /*    function.                                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    target      :: The target bitmap.                                  */
+  /*                                                                       */
+  /*    source      :: A pointer to the source glyph image (e.g., an       */
+  /*                   @FT_Outline).                                       */
+  /*                                                                       */
+  /*    flags       :: The rendering flags.                                */
+  /*                                                                       */
+  /*    gray_spans  :: The gray span drawing callback.                     */
+  /*                                                                       */
+  /*    black_spans :: The black span drawing callback.  UNIMPLEMENTED!    */
+  /*                                                                       */
+  /*    bit_test    :: The bit test callback.  UNIMPLEMENTED!              */
+  /*                                                                       */
+  /*    bit_set     :: The bit set callback.  UNIMPLEMENTED!               */
+  /*                                                                       */
+  /*    user        :: User-supplied data that is passed to each drawing   */
+  /*                   callback.                                           */
+  /*                                                                       */
+  /*    clip_box    :: An optional clipping box.  It is only used in       */
+  /*                   direct rendering mode.  Note that coordinates here  */
+  /*                   should be expressed in _integer_ pixels (and not in */
+  /*                   26.6 fixed-point units).                            */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA    */
+  /*    bit flag is set in the `flags' field, otherwise a monochrome       */
+  /*    bitmap is generated.                                               */
+  /*                                                                       */
+  /*    If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the      */
+  /*    raster will call the `gray_spans' callback to draw gray pixel      */
+  /*    spans, in the case of an aa glyph bitmap, it will call             */
+  /*    `black_spans', and `bit_test' and `bit_set' in the case of a       */
+  /*    monochrome bitmap.  This allows direct composition over a          */
+  /*    pre-existing bitmap through user-provided callbacks to perform the */
+  /*    span drawing/composition.                                          */
+  /*                                                                       */
+  /*    Note that the `bit_test' and `bit_set' callbacks are required when */
+  /*    rendering a monochrome bitmap, as they are crucial to implement    */
+  /*    correct drop-out control as defined in the TrueType specification. */
+  /*                                                                       */
+  typedef struct  FT_Raster_Params_
+  {
+    const FT_Bitmap*        target;
+    const void*             source;
+    int                     flags;
+    FT_SpanFunc             gray_spans;
+    FT_SpanFunc             black_spans;  /* doesn't work! */
+    FT_Raster_BitTest_Func  bit_test;     /* doesn't work! */
+    FT_Raster_BitSet_Func   bit_set;      /* doesn't work! */
+    void*                   user;
+    FT_BBox                 clip_box;
+
+  } FT_Raster_Params;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_NewFunc                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to create a new raster object.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A handle to the memory allocator.                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    raster :: A handle to the new raster object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `memory' parameter is a typeless pointer in order to avoid     */
+  /*    un-wanted dependencies on the rest of the FreeType code.  In       */
+  /*    practice, it is an @FT_Memory object, i.e., a handle to the        */
+  /*    standard FreeType memory allocator.  However, this field can be    */
+  /*    completely ignored by a given raster implementation.               */
+  /*                                                                       */
+  typedef int
+  (*FT_Raster_NewFunc)( void*       memory,
+                        FT_Raster*  raster );
+
+#define FT_Raster_New_Func  FT_Raster_NewFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_DoneFunc                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to destroy a given raster object.                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    raster :: A handle to the raster object.                           */
+  /*                                                                       */
+  typedef void
+  (*FT_Raster_DoneFunc)( FT_Raster  raster );
+
+#define FT_Raster_Done_Func  FT_Raster_DoneFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_ResetFunc                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FreeType provides an area of memory called the `render pool',      */
+  /*    available to all registered rasters.  This pool can be freely used */
+  /*    during a given scan-conversion but is shared by all rasters.  Its  */
+  /*    content is thus transient.                                         */
+  /*                                                                       */
+  /*    This function is called each time the render pool changes, or just */
+  /*    after a new raster object is created.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    raster    :: A handle to the new raster object.                    */
+  /*                                                                       */
+  /*    pool_base :: The address in memory of the render pool.             */
+  /*                                                                       */
+  /*    pool_size :: The size in bytes of the render pool.                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Rasters can ignore the render pool and rely on dynamic memory      */
+  /*    allocation if they want to (a handle to the memory allocator is    */
+  /*    passed to the raster constructor).  However, this is not           */
+  /*    recommended for efficiency purposes.                               */
+  /*                                                                       */
+  typedef void
+  (*FT_Raster_ResetFunc)( FT_Raster       raster,
+                          unsigned char*  pool_base,
+                          unsigned long   pool_size );
+
+#define FT_Raster_Reset_Func  FT_Raster_ResetFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_SetModeFunc                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is a generic facility to change modes or attributes  */
+  /*    in a given raster.  This can be used for debugging purposes, or    */
+  /*    simply to allow implementation-specific `features' in a given      */
+  /*    raster module.                                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    raster :: A handle to the new raster object.                       */
+  /*                                                                       */
+  /*    mode   :: A 4-byte tag used to name the mode or property.          */
+  /*                                                                       */
+  /*    args   :: A pointer to the new mode/property to use.               */
+  /*                                                                       */
+  typedef int
+  (*FT_Raster_SetModeFunc)( FT_Raster      raster,
+                            unsigned long  mode,
+                            void*          args );
+
+#define FT_Raster_Set_Mode_Func  FT_Raster_SetModeFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_RenderFunc                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Invoke a given raster to scan-convert a given glyph image into a   */
+  /*    target bitmap.                                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    raster :: A handle to the raster object.                           */
+  /*                                                                       */
+  /*    params :: A pointer to an @FT_Raster_Params structure used to      */
+  /*              store the rendering parameters.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The exact format of the source image depends on the raster's glyph */
+  /*    format defined in its @FT_Raster_Funcs structure.  It can be an    */
+  /*    @FT_Outline or anything else in order to support a large array of  */
+  /*    glyph formats.                                                     */
+  /*                                                                       */
+  /*    Note also that the render function can fail and return a           */
+  /*    `FT_Err_Unimplemented_Feature' error code if the raster used does  */
+  /*    not support direct composition.                                    */
+  /*                                                                       */
+  /*    XXX: For now, the standard raster doesn't support direct           */
+  /*         composition but this should change for the final release (see */
+  /*         the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c'    */
+  /*         for examples of distinct implementations which support direct */
+  /*         composition).                                                 */
+  /*                                                                       */
+  typedef int
+  (*FT_Raster_RenderFunc)( FT_Raster                raster,
+                           const FT_Raster_Params*  params );
+
+#define FT_Raster_Render_Func  FT_Raster_RenderFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Raster_Funcs                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   A structure used to describe a given raster class to the library.   */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    glyph_format  :: The supported glyph format for this raster.       */
+  /*                                                                       */
+  /*    raster_new    :: The raster constructor.                           */
+  /*                                                                       */
+  /*    raster_reset  :: Used to reset the render pool within the raster.  */
+  /*                                                                       */
+  /*    raster_render :: A function to render a glyph into a given bitmap. */
+  /*                                                                       */
+  /*    raster_done   :: The raster destructor.                            */
+  /*                                                                       */
+  typedef struct  FT_Raster_Funcs_
+  {
+    FT_Glyph_Format        glyph_format;
+    FT_Raster_NewFunc      raster_new;
+    FT_Raster_ResetFunc    raster_reset;
+    FT_Raster_SetModeFunc  raster_set_mode;
+    FT_Raster_RenderFunc   raster_render;
+    FT_Raster_DoneFunc     raster_done;
+
+  } FT_Raster_Funcs;
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTIMAGE_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftincrem.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftincrem.h
new file mode 100644
index 0000000..3a3015e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftincrem.h
@@ -0,0 +1,353 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftincrem.h                                                             */
+/*                                                                         */
+/*    FreeType incremental loading (specification).                        */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2006, 2007, 2008, 2010 by                        */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTINCREM_H__
+#define __FTINCREM_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /***************************************************************************
+   *
+   * @section:
+   *    incremental
+   *
+   * @title:
+   *    Incremental Loading
+   *
+   * @abstract:
+   *    Custom Glyph Loading.
+   *
+   * @description:
+   *   This section contains various functions used to perform so-called
+   *   `incremental' glyph loading.  This is a mode where all glyphs loaded
+   *   from a given @FT_Face are provided by the client application,
+   *
+   *   Apart from that, all other tables are loaded normally from the font
+   *   file.  This mode is useful when FreeType is used within another
+   *   engine, e.g., a PostScript Imaging Processor.
+   *
+   *   To enable this mode, you must use @FT_Open_Face, passing an
+   *   @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an
+   *   @FT_Incremental_Interface value.  See the comments for
+   *   @FT_Incremental_InterfaceRec for an example.
+   *
+   */
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental
+   *
+   * @description:
+   *   An opaque type describing a user-provided object used to implement
+   *   `incremental' glyph loading within FreeType.  This is used to support
+   *   embedded fonts in certain environments (e.g., PostScript interpreters),
+   *   where the glyph data isn't in the font file, or must be overridden by
+   *   different values.
+   *
+   * @note:
+   *   It is up to client applications to create and implement @FT_Incremental
+   *   objects, as long as they provide implementations for the methods
+   *   @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc
+   *   and @FT_Incremental_GetGlyphMetricsFunc.
+   *
+   *   See the description of @FT_Incremental_InterfaceRec to understand how
+   *   to use incremental objects with FreeType.
+   *
+   */
+  typedef struct FT_IncrementalRec_*  FT_Incremental;
+
+
+  /***************************************************************************
+   *
+   * @struct:
+   *   FT_Incremental_MetricsRec
+   *
+   * @description:
+   *   A small structure used to contain the basic glyph metrics returned
+   *   by the @FT_Incremental_GetGlyphMetricsFunc method.
+   *
+   * @fields:
+   *   bearing_x ::
+   *     Left bearing, in font units.
+   *
+   *   bearing_y ::
+   *     Top bearing, in font units.
+   *
+   *   advance ::
+   *     Horizontal component of glyph advance, in font units.
+   *
+   *   advance_v ::
+   *     Vertical component of glyph advance, in font units.
+   *
+   * @note:
+   *   These correspond to horizontal or vertical metrics depending on the
+   *   value of the `vertical' argument to the function
+   *   @FT_Incremental_GetGlyphMetricsFunc.
+   *
+   */
+  typedef struct  FT_Incremental_MetricsRec_
+  {
+    FT_Long  bearing_x;
+    FT_Long  bearing_y;
+    FT_Long  advance;
+    FT_Long  advance_v;     /* since 2.3.12 */
+
+  } FT_Incremental_MetricsRec;
+
+
+  /***************************************************************************
+   *
+   * @struct:
+   *   FT_Incremental_Metrics
+   *
+   * @description:
+   *   A handle to an @FT_Incremental_MetricsRec structure.
+   *
+   */
+   typedef struct FT_Incremental_MetricsRec_*  FT_Incremental_Metrics;
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental_GetGlyphDataFunc
+   *
+   * @description:
+   *   A function called by FreeType to access a given glyph's data bytes
+   *   during @FT_Load_Glyph or @FT_Load_Char if incremental loading is
+   *   enabled.
+   *
+   *   Note that the format of the glyph's data bytes depends on the font
+   *   file format.  For TrueType, it must correspond to the raw bytes within
+   *   the `glyf' table.  For PostScript formats, it must correspond to the
+   *   *unencrypted* charstring bytes, without any `lenIV' header.  It is
+   *   undefined for any other format.
+   *
+   * @input:
+   *   incremental ::
+   *     Handle to an opaque @FT_Incremental handle provided by the client
+   *     application.
+   *
+   *   glyph_index ::
+   *     Index of relevant glyph.
+   *
+   * @output:
+   *   adata ::
+   *     A structure describing the returned glyph data bytes (which will be
+   *     accessed as a read-only byte block).
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   If this function returns successfully the method
+   *   @FT_Incremental_FreeGlyphDataFunc will be called later to release
+   *   the data bytes.
+   *
+   *   Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for
+   *   compound glyphs.
+   *
+   */
+  typedef FT_Error
+  (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental  incremental,
+                                      FT_UInt         glyph_index,
+                                      FT_Data*        adata );
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental_FreeGlyphDataFunc
+   *
+   * @description:
+   *   A function used to release the glyph data bytes returned by a
+   *   successful call to @FT_Incremental_GetGlyphDataFunc.
+   *
+   * @input:
+   *   incremental ::
+   *     A handle to an opaque @FT_Incremental handle provided by the client
+   *     application.
+   *
+   *   data ::
+   *     A structure describing the glyph data bytes (which will be accessed
+   *     as a read-only byte block).
+   *
+   */
+  typedef void
+  (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental  incremental,
+                                       FT_Data*        data );
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental_GetGlyphMetricsFunc
+   *
+   * @description:
+   *   A function used to retrieve the basic metrics of a given glyph index
+   *   before accessing its data.  This is necessary because, in certain
+   *   formats like TrueType, the metrics are stored in a different place from
+   *   the glyph images proper.
+   *
+   * @input:
+   *   incremental ::
+   *     A handle to an opaque @FT_Incremental handle provided by the client
+   *     application.
+   *
+   *   glyph_index ::
+   *     Index of relevant glyph.
+   *
+   *   vertical ::
+   *     If true, return vertical metrics.
+   *
+   *   ametrics ::
+   *     This parameter is used for both input and output.
+   *     The original glyph metrics, if any, in font units.  If metrics are
+   *     not available all the values must be set to zero.
+   *
+   * @output:
+   *   ametrics ::
+   *     The replacement glyph metrics in font units.
+   *
+   */
+  typedef FT_Error
+  (*FT_Incremental_GetGlyphMetricsFunc)
+                      ( FT_Incremental              incremental,
+                        FT_UInt                     glyph_index,
+                        FT_Bool                     vertical,
+                        FT_Incremental_MetricsRec  *ametrics );
+
+
+  /**************************************************************************
+   *
+   * @struct:
+   *   FT_Incremental_FuncsRec
+   *
+   * @description:
+   *   A table of functions for accessing fonts that load data
+   *   incrementally.  Used in @FT_Incremental_InterfaceRec.
+   *
+   * @fields:
+   *   get_glyph_data ::
+   *     The function to get glyph data.  Must not be null.
+   *
+   *   free_glyph_data ::
+   *     The function to release glyph data.  Must not be null.
+   *
+   *   get_glyph_metrics ::
+   *     The function to get glyph metrics.  May be null if the font does
+   *     not provide overriding glyph metrics.
+   *
+   */
+  typedef struct  FT_Incremental_FuncsRec_
+  {
+    FT_Incremental_GetGlyphDataFunc     get_glyph_data;
+    FT_Incremental_FreeGlyphDataFunc    free_glyph_data;
+    FT_Incremental_GetGlyphMetricsFunc  get_glyph_metrics;
+
+  } FT_Incremental_FuncsRec;
+
+
+  /***************************************************************************
+   *
+   * @struct:
+   *   FT_Incremental_InterfaceRec
+   *
+   * @description:
+   *   A structure to be used with @FT_Open_Face to indicate that the user
+   *   wants to support incremental glyph loading.  You should use it with
+   *   @FT_PARAM_TAG_INCREMENTAL as in the following example:
+   *
+   *     {
+   *       FT_Incremental_InterfaceRec  inc_int;
+   *       FT_Parameter                 parameter;
+   *       FT_Open_Args                 open_args;
+   *
+   *
+   *       // set up incremental descriptor
+   *       inc_int.funcs  = my_funcs;
+   *       inc_int.object = my_object;
+   *
+   *       // set up optional parameter
+   *       parameter.tag  = FT_PARAM_TAG_INCREMENTAL;
+   *       parameter.data = &inc_int;
+   *
+   *       // set up FT_Open_Args structure
+   *       open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;
+   *       open_args.pathname   = my_font_pathname;
+   *       open_args.num_params = 1;
+   *       open_args.params     = &parameter; // we use one optional argument
+   *
+   *       // open the font
+   *       error = FT_Open_Face( library, &open_args, index, &face );
+   *       ...
+   *     }
+   *
+   */
+  typedef struct  FT_Incremental_InterfaceRec_
+  {
+    const FT_Incremental_FuncsRec*  funcs;
+    FT_Incremental                  object;
+
+  } FT_Incremental_InterfaceRec;
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental_Interface
+   *
+   * @description:
+   *   A pointer to an @FT_Incremental_InterfaceRec structure.
+   *
+   */
+  typedef FT_Incremental_InterfaceRec*   FT_Incremental_Interface;
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_INCREMENTAL
+   *
+   * @description:
+   *   A constant used as the tag of @FT_Parameter structures to indicate
+   *   an incremental loading object to be used by FreeType.
+   *
+   */
+#define FT_PARAM_TAG_INCREMENTAL  FT_MAKE_TAG( 'i', 'n', 'c', 'r' )
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __FTINCREM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlcdfil.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlcdfil.h
new file mode 100644
index 0000000..042f983
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlcdfil.h
@@ -0,0 +1,251 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlcdfil.h                                                             */
+/*                                                                         */
+/*    FreeType API for color filtering of subpixel bitmap glyphs           */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 2006, 2007, 2008, 2010 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FT_LCD_FILTER_H__
+#define __FT_LCD_FILTER_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /***************************************************************************
+   *
+   * @section:
+   *   lcd_filtering
+   *
+   * @title:
+   *   LCD Filtering
+   *
+   * @abstract:
+   *   Reduce color fringes of LCD-optimized bitmaps.
+   *
+   * @description:
+   *   The @FT_Library_SetLcdFilter API can be used to specify a low-pass
+   *   filter which is then applied to LCD-optimized bitmaps generated
+   *   through @FT_Render_Glyph.  This is useful to reduce color fringes
+   *   which would occur with unfiltered rendering.
+   *
+   *   Note that no filter is active by default, and that this function is
+   *   *not* implemented in default builds of the library.  You need to
+   *   #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file
+   *   in order to activate it.
+   *
+   *   FreeType generates alpha coverage maps, which are linear by nature.
+   *   For instance, the value 0x80 in bitmap representation means that
+   *   (within numerical precision) 0x80/0xff fraction of that pixel is
+   *   covered by the glyph's outline.  The blending function for placing
+   *   text over a background is
+   *
+   *   {
+   *     dst = alpha * src + (1 - alpha) * dst    ,
+   *   }
+   *
+   *   which is known as OVER.  However, when calculating the output of the
+   *   OVER operator, the source colors should first be transformed to a
+   *   linear color space, then alpha blended in that space, and transformed
+   *   back to the output color space.
+   *
+   *   When linear light blending is used, the default FIR5 filtering
+   *   weights (as given by FT_LCD_FILTER_DEFAULT) are no longer optimal, as
+   *   they have been designed for black on white rendering while lacking
+   *   gamma correction.  To preserve color neutrality, weights for a FIR5
+   *   filter should be chosen according to two free parameters `a' and `c',
+   *   and the FIR weights should be
+   *
+   *   {
+   *     [a - c, a + c, 2 * a, a + c, a - c]    .
+   *   }
+   *
+   *   This formula generates equal weights for all the color primaries
+   *   across the filter kernel, which makes it colorless.  One suggested
+   *   set of weights is
+   *
+   *   {
+   *     [0x10, 0x50, 0x60, 0x50, 0x10]    ,
+   *   }
+   *
+   *   where `a' has value 0x30 and `b' value 0x20.  The weights in filter
+   *   may have a sum larger than 0x100, which increases coloration slightly
+   *   but also improves contrast.
+   */
+
+
+  /****************************************************************************
+   *
+   * @enum:
+   *   FT_LcdFilter
+   *
+   * @description:
+   *   A list of values to identify various types of LCD filters.
+   *
+   * @values:
+   *   FT_LCD_FILTER_NONE ::
+   *     Do not perform filtering.  When used with subpixel rendering, this
+   *     results in sometimes severe color fringes.
+   *
+   *   FT_LCD_FILTER_DEFAULT ::
+   *     The default filter reduces color fringes considerably, at the cost
+   *     of a slight blurriness in the output.
+   *
+   *   FT_LCD_FILTER_LIGHT ::
+   *     The light filter is a variant that produces less blurriness at the
+   *     cost of slightly more color fringes than the default one.  It might
+   *     be better, depending on taste, your monitor, or your personal vision.
+   *
+   *   FT_LCD_FILTER_LEGACY ::
+   *     This filter corresponds to the original libXft color filter.  It
+   *     provides high contrast output but can exhibit really bad color
+   *     fringes if glyphs are not extremely well hinted to the pixel grid.
+   *     In other words, it only works well if the TrueType bytecode
+   *     interpreter is enabled *and* high-quality hinted fonts are used.
+   *
+   *     This filter is only provided for comparison purposes, and might be
+   *     disabled or stay unsupported in the future.
+   *
+   * @since:
+   *   2.3.0
+   */
+  typedef enum  FT_LcdFilter_
+  {
+    FT_LCD_FILTER_NONE    = 0,
+    FT_LCD_FILTER_DEFAULT = 1,
+    FT_LCD_FILTER_LIGHT   = 2,
+    FT_LCD_FILTER_LEGACY  = 16,
+
+    FT_LCD_FILTER_MAX   /* do not remove */
+
+  } FT_LcdFilter;
+
+
+  /**************************************************************************
+   *
+   * @func:
+   *   FT_Library_SetLcdFilter
+   *
+   * @description:
+   *   This function is used to apply color filtering to LCD decimated
+   *   bitmaps, like the ones used when calling @FT_Render_Glyph with
+   *   @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V.
+   *
+   * @input:
+   *   library ::
+   *     A handle to the target library instance.
+   *
+   *   filter ::
+   *     The filter type.
+   *
+   *     You can use @FT_LCD_FILTER_NONE here to disable this feature, or
+   *     @FT_LCD_FILTER_DEFAULT to use a default filter that should work
+   *     well on most LCD screens.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   This feature is always disabled by default.  Clients must make an
+   *   explicit call to this function with a `filter' value other than
+   *   @FT_LCD_FILTER_NONE in order to enable it.
+   *
+   *   Due to *PATENTS* covering subpixel rendering, this function doesn't
+   *   do anything except returning `FT_Err_Unimplemented_Feature' if the
+   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+   *   defined in your build of the library, which should correspond to all
+   *   default builds of FreeType.
+   *
+   *   The filter affects glyph bitmaps rendered through @FT_Render_Glyph,
+   *   @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char.
+   *
+   *   It does _not_ affect the output of @FT_Outline_Render and
+   *   @FT_Outline_Get_Bitmap.
+   *
+   *   If this feature is activated, the dimensions of LCD glyph bitmaps are
+   *   either larger or taller than the dimensions of the corresponding
+   *   outline with regards to the pixel grid.  For example, for
+   *   @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and
+   *   up to 3~pixels to the right.
+   *
+   *   The bitmap offset values are adjusted correctly, so clients shouldn't
+   *   need to modify their layout and glyph positioning code when enabling
+   *   the filter.
+   *
+   * @since:
+   *   2.3.0
+   */
+  FT_EXPORT( FT_Error )
+  FT_Library_SetLcdFilter( FT_Library    library,
+                           FT_LcdFilter  filter );
+
+
+  /**************************************************************************
+   *
+   * @func:
+   *   FT_Library_SetLcdFilterWeights
+   *
+   * @description:
+   *   Use this function to override the filter weights selected by
+   *   @FT_Library_SetLcdFilter.  By default, FreeType uses the quintuple
+   *   (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10,
+   *   0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and
+   *   FT_LCD_FILTER_LEGACY.
+   *
+   * @input:
+   *   library ::
+   *     A handle to the target library instance.
+   *
+   *   weights ::
+   *     A pointer to an array; the function copies the first five bytes and
+   *     uses them to specify the filter weights.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   Due to *PATENTS* covering subpixel rendering, this function doesn't
+   *   do anything except returning `FT_Err_Unimplemented_Feature' if the
+   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+   *   defined in your build of the library, which should correspond to all
+   *   default builds of FreeType.
+   *
+   *   This function must be called after @FT_Library_SetLcdFilter to have
+   *   any effect.
+   *
+   * @since:
+   *   2.4.0
+   */
+  FT_EXPORT( FT_Error )
+  FT_Library_SetLcdFilterWeights( FT_Library      library,
+                                  unsigned char  *weights );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FT_LCD_FILTER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlist.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlist.h
new file mode 100644
index 0000000..8b18978
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlist.h
@@ -0,0 +1,277 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlist.h                                                               */
+/*                                                                         */
+/*    Generic list support for FreeType (specification).                   */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2007, 2010 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  This file implements functions relative to list processing.  Its     */
+  /*  data structures are defined in `freetype.h'.                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTLIST_H__
+#define __FTLIST_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    list_processing                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    List Processing                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Simple management of lists.                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains various definitions related to list          */
+  /*    processing using doubly-linked nodes.                              */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_List                                                            */
+  /*    FT_ListNode                                                        */
+  /*    FT_ListRec                                                         */
+  /*    FT_ListNodeRec                                                     */
+  /*                                                                       */
+  /*    FT_List_Add                                                        */
+  /*    FT_List_Insert                                                     */
+  /*    FT_List_Find                                                       */
+  /*    FT_List_Remove                                                     */
+  /*    FT_List_Up                                                         */
+  /*    FT_List_Iterate                                                    */
+  /*    FT_List_Iterator                                                   */
+  /*    FT_List_Finalize                                                   */
+  /*    FT_List_Destructor                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Find                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Find the list node for a given listed object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    list :: A pointer to the parent list.                              */
+  /*    data :: The address of the listed object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    List node.  NULL if it wasn't found.                               */
+  /*                                                                       */
+  FT_EXPORT( FT_ListNode )
+  FT_List_Find( FT_List  list,
+                void*    data );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Add                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Append an element to the end of a list.                            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    list :: A pointer to the parent list.                              */
+  /*    node :: The node to append.                                        */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Add( FT_List      list,
+               FT_ListNode  node );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Insert                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Insert an element at the head of a list.                           */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    list :: A pointer to parent list.                                  */
+  /*    node :: The node to insert.                                        */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Insert( FT_List      list,
+                  FT_ListNode  node );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Remove                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Remove a node from a list.  This function doesn't check whether    */
+  /*    the node is in the list!                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    node :: The node to remove.                                        */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    list :: A pointer to the parent list.                              */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Remove( FT_List      list,
+                  FT_ListNode  node );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Up                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Move a node to the head/top of a list.  Used to maintain LRU       */
+  /*    lists.                                                             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    list :: A pointer to the parent list.                              */
+  /*    node :: The node to move.                                          */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Up( FT_List      list,
+              FT_ListNode  node );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_List_Iterator                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An FT_List iterator function which is called during a list parse   */
+  /*    by @FT_List_Iterate.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    node :: The current iteration list node.                           */
+  /*                                                                       */
+  /*    user :: A typeless pointer passed to @FT_List_Iterate.             */
+  /*            Can be used to point to the iteration's state.             */
+  /*                                                                       */
+  typedef FT_Error
+  (*FT_List_Iterator)( FT_ListNode  node,
+                       void*        user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Iterate                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parse a list and calls a given iterator function on each element.  */
+  /*    Note that parsing is stopped as soon as one of the iterator calls  */
+  /*    returns a non-zero value.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    list     :: A handle to the list.                                  */
+  /*    iterator :: An iterator function, called on each node of the list. */
+  /*    user     :: A user-supplied field which is passed as the second    */
+  /*                argument to the iterator.                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result (a FreeType error code) of the last iterator call.      */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_List_Iterate( FT_List           list,
+                   FT_List_Iterator  iterator,
+                   void*             user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_List_Destructor                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An @FT_List iterator function which is called during a list        */
+  /*    finalization by @FT_List_Finalize to destroy all elements in a     */
+  /*    given list.                                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    system :: The current system object.                               */
+  /*                                                                       */
+  /*    data   :: The current object to destroy.                           */
+  /*                                                                       */
+  /*    user   :: A typeless pointer passed to @FT_List_Iterate.  It can   */
+  /*              be used to point to the iteration's state.               */
+  /*                                                                       */
+  typedef void
+  (*FT_List_Destructor)( FT_Memory  memory,
+                         void*      data,
+                         void*      user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Finalize                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy all elements in the list as well as the list itself.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    list    :: A handle to the list.                                   */
+  /*                                                                       */
+  /*    destroy :: A list destructor that will be applied to each element  */
+  /*               of the list.                                            */
+  /*                                                                       */
+  /*    memory  :: The current memory object which handles deallocation.   */
+  /*                                                                       */
+  /*    user    :: A user-supplied field which is passed as the last       */
+  /*               argument to the destructor.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function expects that all nodes added by @FT_List_Add or      */
+  /*    @FT_List_Insert have been dynamically allocated.                   */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Finalize( FT_List             list,
+                    FT_List_Destructor  destroy,
+                    FT_Memory           memory,
+                    void*               user );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTLIST_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlzw.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlzw.h
new file mode 100644
index 0000000..5bb4a82
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlzw.h
@@ -0,0 +1,99 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlzw.h                                                                */
+/*                                                                         */
+/*    LZW-compressed stream support.                                       */
+/*                                                                         */
+/*  Copyright 2004, 2006 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTLZW_H__
+#define __FTLZW_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    lzw                                                                */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    LZW Streams                                                        */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Using LZW-compressed font files.                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of LZW-specific functions.   */
+  /*                                                                       */
+  /*************************************************************************/
+
+ /************************************************************************
+  *
+  * @function:
+  *   FT_Stream_OpenLZW
+  *
+  * @description:
+  *   Open a new stream to parse LZW-compressed font files.  This is
+  *   mainly used to support the compressed `*.pcf.Z' fonts that come
+  *   with XFree86.
+  *
+  * @input:
+  *   stream :: The target embedding stream.
+  *
+  *   source :: The source stream.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   The source stream must be opened _before_ calling this function.
+  *
+  *   Calling the internal function `FT_Stream_Close' on the new stream will
+  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream
+  *   objects will be released to the heap.
+  *
+  *   The stream implementation is very basic and resets the decompression
+  *   process each time seeking backwards is needed within the stream
+  *
+  *   In certain builds of the library, LZW compression recognition is
+  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.
+  *   This means that if no font driver is capable of handling the raw
+  *   compressed file, the library will try to open a LZW stream from it
+  *   and re-open the face with it.
+  *
+  *   This function may return `FT_Err_Unimplemented_Feature' if your build
+  *   of FreeType was not compiled with LZW support.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Stream_OpenLZW( FT_Stream  stream,
+                     FT_Stream  source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTLZW_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmac.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmac.h
new file mode 100644
index 0000000..f40f3fb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmac.h
@@ -0,0 +1,274 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmac.h                                                                */
+/*                                                                         */
+/*    Additional Mac-specific API.                                         */
+/*                                                                         */
+/*  Copyright 1996-2001, 2004, 2006, 2007 by                               */
+/*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* NOTE: Include this file after <freetype/freetype.h> and after any       */
+/*       Mac-specific headers (because this header uses Mac types such as  */
+/*       Handle, FSSpec, FSRef, etc.)                                      */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTMAC_H__
+#define __FTMAC_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+/* gcc-3.4.1 and later can warn about functions tagged as deprecated */
+#ifndef FT_DEPRECATED_ATTRIBUTE
+#if defined(__GNUC__)                                               && \
+    ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
+#define FT_DEPRECATED_ATTRIBUTE  __attribute__((deprecated))
+#else
+#define FT_DEPRECATED_ATTRIBUTE
+#endif
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    mac_specific                                                       */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Mac Specific Interface                                             */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Only available on the Macintosh.                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The following definitions are only available if FreeType is        */
+  /*    compiled on a Macintosh.                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FOND                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new face object from a FOND resource.                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    fond       :: A FOND resource.                                     */
+  /*                                                                       */
+  /*    face_index :: Only supported for the -1 `sanity check' special     */
+  /*                  case.                                                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Notes>                                                               */
+  /*    This function can be used to create @FT_Face objects from fonts    */
+  /*    that are installed in the system as follows.                       */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      fond = GetResource( 'FOND', fontName );                          */
+  /*      error = FT_New_Face_From_FOND( library, fond, 0, &face );        */
+  /*    }                                                                  */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Face_From_FOND( FT_Library  library,
+                         Handle      fond,
+                         FT_Long     face_index,
+                         FT_Face    *aface )
+                       FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_GetFile_From_Mac_Name                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return an FSSpec for the disk file containing the named font.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    fontName   :: Mac OS name of the font (e.g., Times New Roman       */
+  /*                  Bold).                                               */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    pathSpec   :: FSSpec to the file.  For passing to                  */
+  /*                  @FT_New_Face_From_FSSpec.                            */
+  /*                                                                       */
+  /*    face_index :: Index of the face.  For passing to                   */
+  /*                  @FT_New_Face_From_FSSpec.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_GetFile_From_Mac_Name( const char*  fontName,
+                            FSSpec*      pathSpec,
+                            FT_Long*     face_index )
+                          FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_GetFile_From_Mac_ATS_Name                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return an FSSpec for the disk file containing the named font.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    fontName   :: Mac OS name of the font in ATS framework.            */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    pathSpec   :: FSSpec to the file. For passing to                   */
+  /*                  @FT_New_Face_From_FSSpec.                            */
+  /*                                                                       */
+  /*    face_index :: Index of the face. For passing to                    */
+  /*                  @FT_New_Face_From_FSSpec.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,
+                                FSSpec*      pathSpec,
+                                FT_Long*     face_index )
+                              FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_GetFilePath_From_Mac_ATS_Name                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a pathname of the disk file and face index for given font   */
+  /*    name which is handled by ATS framework.                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    fontName    :: Mac OS name of the font in ATS framework.           */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    path        :: Buffer to store pathname of the file.  For passing  */
+  /*                   to @FT_New_Face.  The client must allocate this     */
+  /*                   buffer before calling this function.                */
+  /*                                                                       */
+  /*    maxPathSize :: Lengths of the buffer `path' that client allocated. */
+  /*                                                                       */
+  /*    face_index  :: Index of the face.  For passing to @FT_New_Face.    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,
+                                    UInt8*       path,
+                                    UInt32       maxPathSize,
+                                    FT_Long*     face_index )
+                                  FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FSSpec                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new face object from a given resource and typeface index  */
+  /*    using an FSSpec to the font file.                                  */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    spec       :: FSSpec to the font file.                             */
+  /*                                                                       */
+  /*    face_index :: The index of the face within the resource.  The      */
+  /*                  first face has index~0.                              */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    @FT_New_Face_From_FSSpec is identical to @FT_New_Face except       */
+  /*    it accepts an FSSpec instead of a path.                            */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Face_From_FSSpec( FT_Library     library,
+                           const FSSpec  *spec,
+                           FT_Long        face_index,
+                           FT_Face       *aface )
+                         FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FSRef                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new face object from a given resource and typeface index  */
+  /*    using an FSRef to the font file.                                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    spec       :: FSRef to the font file.                              */
+  /*                                                                       */
+  /*    face_index :: The index of the face within the resource.  The      */
+  /*                  first face has index~0.                              */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    @FT_New_Face_From_FSRef is identical to @FT_New_Face except        */
+  /*    it accepts an FSRef instead of a path.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Face_From_FSRef( FT_Library    library,
+                          const FSRef  *ref,
+                          FT_Long       face_index,
+                          FT_Face      *aface )
+                        FT_DEPRECATED_ATTRIBUTE;
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTMAC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h
new file mode 100644
index 0000000..52aaf44
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h
@@ -0,0 +1,378 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmm.h                                                                 */
+/*                                                                         */
+/*    FreeType Multiple Master font interface (specification).             */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2004, 2006, 2009 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTMM_H__
+#define __FTMM_H__
+
+
+#include "../ft2build.h"
+#include "t1tables.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    multiple_masters                                                   */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Multiple Masters                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    How to manage Multiple Masters fonts.                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The following types and functions are used to manage Multiple      */
+  /*    Master fonts, i.e., the selection of specific design instances by  */
+  /*    setting design axis coordinates.                                   */
+  /*                                                                       */
+  /*    George Williams has extended this interface to make it work with   */
+  /*    both Type~1 Multiple Masters fonts and GX distortable (var)        */
+  /*    fonts.  Some of these routines only work with MM fonts, others     */
+  /*    will work with both types.  They are similar enough that a         */
+  /*    consistent interface makes sense.                                  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_MM_Axis                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to model a given axis in design space for  */
+  /*    Multiple Masters fonts.                                            */
+  /*                                                                       */
+  /*    This structure can't be used for GX var fonts.                     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    name    :: The axis's name.                                        */
+  /*                                                                       */
+  /*    minimum :: The axis's minimum design coordinate.                   */
+  /*                                                                       */
+  /*    maximum :: The axis's maximum design coordinate.                   */
+  /*                                                                       */
+  typedef struct  FT_MM_Axis_
+  {
+    FT_String*  name;
+    FT_Long     minimum;
+    FT_Long     maximum;
+
+  } FT_MM_Axis;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Multi_Master                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model the axes and space of a Multiple Masters */
+  /*    font.                                                              */
+  /*                                                                       */
+  /*    This structure can't be used for GX var fonts.                     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_axis    :: Number of axes.  Cannot exceed~4.                   */
+  /*                                                                       */
+  /*    num_designs :: Number of designs; should be normally 2^num_axis    */
+  /*                   even though the Type~1 specification strangely      */
+  /*                   allows for intermediate designs to be present. This */
+  /*                   number cannot exceed~16.                            */
+  /*                                                                       */
+  /*    axis        :: A table of axis descriptors.                        */
+  /*                                                                       */
+  typedef struct  FT_Multi_Master_
+  {
+    FT_UInt     num_axis;
+    FT_UInt     num_designs;
+    FT_MM_Axis  axis[T1_MAX_MM_AXIS];
+
+  } FT_Multi_Master;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Var_Axis                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to model a given axis in design space for  */
+  /*    Multiple Masters and GX var fonts.                                 */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    name    :: The axis's name.                                        */
+  /*               Not always meaningful for GX.                           */
+  /*                                                                       */
+  /*    minimum :: The axis's minimum design coordinate.                   */
+  /*                                                                       */
+  /*    def     :: The axis's default design coordinate.                   */
+  /*               FreeType computes meaningful default values for MM; it  */
+  /*               is then an integer value, not in 16.16 format.          */
+  /*                                                                       */
+  /*    maximum :: The axis's maximum design coordinate.                   */
+  /*                                                                       */
+  /*    tag     :: The axis's tag (the GX equivalent to `name').           */
+  /*               FreeType provides default values for MM if possible.    */
+  /*                                                                       */
+  /*    strid   :: The entry in `name' table (another GX version of        */
+  /*               `name').                                                */
+  /*               Not meaningful for MM.                                  */
+  /*                                                                       */
+  typedef struct  FT_Var_Axis_
+  {
+    FT_String*  name;
+
+    FT_Fixed    minimum;
+    FT_Fixed    def;
+    FT_Fixed    maximum;
+
+    FT_ULong    tag;
+    FT_UInt     strid;
+
+  } FT_Var_Axis;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Var_Named_Style                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to model a named style in a GX var font.   */
+  /*                                                                       */
+  /*    This structure can't be used for MM fonts.                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    coords :: The design coordinates for this style.                   */
+  /*              This is an array with one entry for each axis.           */
+  /*                                                                       */
+  /*    strid  :: The entry in `name' table identifying this style.        */
+  /*                                                                       */
+  typedef struct  FT_Var_Named_Style_
+  {
+    FT_Fixed*  coords;
+    FT_UInt    strid;
+
+  } FT_Var_Named_Style;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_MM_Var                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model the axes and space of a Multiple Masters */
+  /*    or GX var distortable font.                                        */
+  /*                                                                       */
+  /*    Some fields are specific to one format and not to the other.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_axis        :: The number of axes.  The maximum value is~4 for */
+  /*                       MM; no limit in GX.                             */
+  /*                                                                       */
+  /*    num_designs     :: The number of designs; should be normally       */
+  /*                       2^num_axis for MM fonts.  Not meaningful for GX */
+  /*                       (where every glyph could have a different       */
+  /*                       number of designs).                             */
+  /*                                                                       */
+  /*    num_namedstyles :: The number of named styles; only meaningful for */
+  /*                       GX which allows certain design coordinates to   */
+  /*                       have a string ID (in the `name' table)          */
+  /*                       associated with them.  The font can tell the    */
+  /*                       user that, for example, Weight=1.5 is `Bold'.   */
+  /*                                                                       */
+  /*    axis            :: A table of axis descriptors.                    */
+  /*                       GX fonts contain slightly more data than MM.    */
+  /*                                                                       */
+  /*    namedstyles     :: A table of named styles.                        */
+  /*                       Only meaningful with GX.                        */
+  /*                                                                       */
+  typedef struct  FT_MM_Var_
+  {
+    FT_UInt              num_axis;
+    FT_UInt              num_designs;
+    FT_UInt              num_namedstyles;
+    FT_Var_Axis*         axis;
+    FT_Var_Named_Style*  namedstyle;
+
+  } FT_MM_Var;
+
+
+  /* */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Multi_Master                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the Multiple Master descriptor of a given font.           */
+  /*                                                                       */
+  /*    This function can't be used with GX fonts.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: A handle to the source face.                            */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amaster :: The Multiple Masters descriptor.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Multi_Master( FT_Face           face,
+                       FT_Multi_Master  *amaster );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_MM_Var                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the Multiple Master/GX var descriptor of a given font.    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: A handle to the source face.                            */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amaster :: The Multiple Masters/GX var descriptor.                 */
+  /*               Allocates a data structure, which the user must free    */
+  /*               (a single call to FT_FREE will do it).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_MM_Var( FT_Face      face,
+                 FT_MM_Var*  *amaster );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_MM_Design_Coordinates                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    For Multiple Masters fonts, choose an interpolated font design     */
+  /*    through design coordinates.                                        */
+  /*                                                                       */
+  /*    This function can't be used with GX fonts.                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of design coordinates (must be equal to   */
+  /*                  the number of axes in the font).                     */
+  /*                                                                       */
+  /*    coords     :: An array of design coordinates.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_MM_Design_Coordinates( FT_Face   face,
+                                FT_UInt   num_coords,
+                                FT_Long*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Var_Design_Coordinates                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    For Multiple Master or GX Var fonts, choose an interpolated font   */
+  /*    design through design coordinates.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of design coordinates (must be equal to   */
+  /*                  the number of axes in the font).                     */
+  /*                                                                       */
+  /*    coords     :: An array of design coordinates.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Var_Design_Coordinates( FT_Face    face,
+                                 FT_UInt    num_coords,
+                                 FT_Fixed*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_MM_Blend_Coordinates                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    For Multiple Masters and GX var fonts, choose an interpolated font */
+  /*    design through normalized blend coordinates.                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of design coordinates (must be equal to   */
+  /*                  the number of axes in the font).                     */
+  /*                                                                       */
+  /*    coords     :: The design coordinates array (each element must be   */
+  /*                  between 0 and 1.0).                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_MM_Blend_Coordinates( FT_Face    face,
+                               FT_UInt    num_coords,
+                               FT_Fixed*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Var_Blend_Coordinates                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is another name of @FT_Set_MM_Blend_Coordinates.              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Var_Blend_Coordinates( FT_Face    face,
+                                FT_UInt    num_coords,
+                                FT_Fixed*  coords );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmodapi.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmodapi.h
new file mode 100644
index 0000000..f12c0a9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmodapi.h
@@ -0,0 +1,641 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmodapi.h                                                             */
+/*                                                                         */
+/*    FreeType modules public interface (specification).                   */
+/*                                                                         */
+/*  Copyright 1996-2003, 2006, 2008-2010, 2012, 2013 by                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTMODAPI_H__
+#define __FTMODAPI_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    module_management                                                  */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Module Management                                                  */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    How to add, upgrade, remove, and control modules from FreeType.    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The definitions below are used to manage modules within FreeType.  */
+  /*    Modules can be added, upgraded, and removed at runtime.            */
+  /*    Additionally, some module properties can be controlled also.       */
+  /*                                                                       */
+  /*    Here is a list of possible values of the `module_name' field in    */
+  /*    the @FT_Module_Class structure.                                    */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      autofitter                                                       */
+  /*      bdf                                                              */
+  /*      cff                                                              */
+  /*      gxvalid                                                          */
+  /*      otvalid                                                          */
+  /*      pcf                                                              */
+  /*      pfr                                                              */
+  /*      psaux                                                            */
+  /*      pshinter                                                         */
+  /*      psnames                                                          */
+  /*      raster1, raster5                                                 */
+  /*      sfnt                                                             */
+  /*      smooth, smooth-lcd, smooth-lcdv                                  */
+  /*      truetype                                                         */
+  /*      type1                                                            */
+  /*      type42                                                           */
+  /*      t1cid                                                            */
+  /*      winfonts                                                         */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    Note that the FreeType Cache sub-system is not a FreeType module.  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* module bit flags */
+#define FT_MODULE_FONT_DRIVER         1  /* this module is a font driver  */
+#define FT_MODULE_RENDERER            2  /* this module is a renderer     */
+#define FT_MODULE_HINTER              4  /* this module is a glyph hinter */
+#define FT_MODULE_STYLER              8  /* this module is a styler       */
+
+#define FT_MODULE_DRIVER_SCALABLE     0x100   /* the driver supports      */
+                                              /* scalable fonts           */
+#define FT_MODULE_DRIVER_NO_OUTLINES  0x200   /* the driver does not      */
+                                              /* support vector outlines  */
+#define FT_MODULE_DRIVER_HAS_HINTER   0x400   /* the driver provides its  */
+                                              /* own hinter               */
+
+
+  /* deprecated values */
+#define ft_module_font_driver         FT_MODULE_FONT_DRIVER
+#define ft_module_renderer            FT_MODULE_RENDERER
+#define ft_module_hinter              FT_MODULE_HINTER
+#define ft_module_styler              FT_MODULE_STYLER
+
+#define ft_module_driver_scalable     FT_MODULE_DRIVER_SCALABLE
+#define ft_module_driver_no_outlines  FT_MODULE_DRIVER_NO_OUTLINES
+#define ft_module_driver_has_hinter   FT_MODULE_DRIVER_HAS_HINTER
+
+
+  typedef FT_Pointer  FT_Module_Interface;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Constructor                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to initialize (not create) a new module object.    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    module :: The module to initialize.                                */
+  /*                                                                       */
+  typedef FT_Error
+  (*FT_Module_Constructor)( FT_Module  module );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Destructor                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to finalize (not destroy) a given module object.   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    module :: The module to finalize.                                  */
+  /*                                                                       */
+  typedef void
+  (*FT_Module_Destructor)( FT_Module  module );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Requester                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to query a given module for a specific interface.  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    module :: The module to be searched.                               */
+  /*                                                                       */
+  /*    name ::   The name of the interface in the module.                 */
+  /*                                                                       */
+  typedef FT_Module_Interface
+  (*FT_Module_Requester)( FT_Module    module,
+                          const char*  name );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Module_Class                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The module class descriptor.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    module_flags    :: Bit flags describing the module.                */
+  /*                                                                       */
+  /*    module_size     :: The size of one module object/instance in       */
+  /*                       bytes.                                          */
+  /*                                                                       */
+  /*    module_name     :: The name of the module.                         */
+  /*                                                                       */
+  /*    module_version  :: The version, as a 16.16 fixed number            */
+  /*                       (major.minor).                                  */
+  /*                                                                       */
+  /*    module_requires :: The version of FreeType this module requires,   */
+  /*                       as a 16.16 fixed number (major.minor).  Starts  */
+  /*                       at version 2.0, i.e., 0x20000.                  */
+  /*                                                                       */
+  /*    module_init     :: The initializing function.                      */
+  /*                                                                       */
+  /*    module_done     :: The finalizing function.                        */
+  /*                                                                       */
+  /*    get_interface   :: The interface requesting function.              */
+  /*                                                                       */
+  typedef struct  FT_Module_Class_
+  {
+    FT_ULong               module_flags;
+    FT_Long                module_size;
+    const FT_String*       module_name;
+    FT_Fixed               module_version;
+    FT_Fixed               module_requires;
+
+    const void*            module_interface;
+
+    FT_Module_Constructor  module_init;
+    FT_Module_Destructor   module_done;
+    FT_Module_Requester    get_interface;
+
+  } FT_Module_Class;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Add_Module                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Add a new module to a given library instance.                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library :: A handle to the library object.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    clazz   :: A pointer to class descriptor for the module.           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    An error will be returned if a module already exists by that name, */
+  /*    or if the module requires a version of FreeType that is too great. */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Add_Module( FT_Library              library,
+                 const FT_Module_Class*  clazz );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Module                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Find a module by its name.                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library     :: A handle to the library object.                     */
+  /*                                                                       */
+  /*    module_name :: The module's name (as an ASCII string).             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A module handle.  0~if none was found.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    FreeType's internal modules aren't documented very well, and you   */
+  /*    should look up the source code for details.                        */
+  /*                                                                       */
+  FT_EXPORT( FT_Module )
+  FT_Get_Module( FT_Library   library,
+                 const char*  module_name );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Remove_Module                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Remove a given module from a library instance.                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library :: A handle to a library object.                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    module  :: A handle to a module object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The module object is destroyed by the function in case of success. */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Remove_Module( FT_Library  library,
+                    FT_Module   module );
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Property_Set
+   *
+   * @description:
+   *    Set a property for a given module.
+   *
+   * @input:
+   *    library ::
+   *       A handle to the library the module is part of.
+   *
+   *    module_name ::
+   *       The module name.
+   *
+   *    property_name ::
+   *       The property name.  Properties are described in the `Synopsis'
+   *       subsection of the module's documentation.
+   *
+   *       Note that only a few modules have properties.
+   *
+   *    value ::
+   *       A generic pointer to a variable or structure which gives the new
+   *       value of the property.  The exact definition of `value' is
+   *       dependent on the property; see the `Synopsis' subsection of the
+   *       module's documentation.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *    If `module_name' isn't a valid module name, or `property_name'
+   *    doesn't specify a valid property, or if `value' doesn't represent a
+   *    valid value for the given property, an error is returned.
+   *
+   *    The following example sets property `bar' (a simple integer) in
+   *    module `foo' to value~1.
+   *
+   *    {
+   *      FT_UInt  bar;
+   *
+   *
+   *      bar = 1;
+   *      FT_Property_Set( library, "foo", "bar", &bar );
+   *    }
+   *
+   *    Note that the FreeType Cache sub-system doesn't recognize module
+   *    property changes.  To avoid glyph lookup confusion within the cache
+   *    you should call @FTC_Manager_Reset to completely flush the cache if
+   *    a module property gets changed after @FTC_Manager_New has been
+   *    called.
+   *
+   *    It is not possible to set properties of the FreeType Cache
+   *    sub-system itself with FT_Property_Set; use @FTC_Property_Set
+   *    instead.
+   *
+   *  @since:
+   *    2.4.11
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Property_Set( FT_Library        library,
+                   const FT_String*  module_name,
+                   const FT_String*  property_name,
+                   const void*       value );
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Property_Get
+   *
+   * @description:
+   *    Get a module's property value.
+   *
+   * @input:
+   *    library ::
+   *       A handle to the library the module is part of.
+   *
+   *    module_name ::
+   *       The module name.
+   *
+   *    property_name ::
+   *       The property name.  Properties are described in the `Synopsis'
+   *       subsection of the module's documentation.
+   *
+   * @inout:
+   *    value ::
+   *       A generic pointer to a variable or structure which gives the
+   *       value of the property.  The exact definition of `value' is
+   *       dependent on the property; see the `Synopsis' subsection of the
+   *       module's documentation.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *    If `module_name' isn't a valid module name, or `property_name'
+   *    doesn't specify a valid property, or if `value' doesn't represent a
+   *    valid value for the given property, an error is returned.
+   *
+   *    The following example gets property `baz' (a range) in module `foo'.
+   *
+   *    {
+   *      typedef  range_
+   *      {
+   *        FT_Int32  min;
+   *        FT_Int32  max;
+   *
+   *      } range;
+   *
+   *      range  baz;
+   *
+   *
+   *      FT_Property_Get( library, "foo", "baz", &baz );
+   *    }
+   *
+   *    It is not possible to retrieve properties of the FreeType Cache
+   *    sub-system with FT_Property_Get; use @FTC_Property_Get instead.
+   *
+   *  @since:
+   *    2.4.11
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Property_Get( FT_Library        library,
+                   const FT_String*  module_name,
+                   const FT_String*  property_name,
+                   void*             value );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Reference_Library                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A counter gets initialized to~1 at the time an @FT_Library         */
+  /*    structure is created.  This function increments the counter.       */
+  /*    @FT_Done_Library then only destroys a library if the counter is~1, */
+  /*    otherwise it simply decrements the counter.                        */
+  /*                                                                       */
+  /*    This function helps in managing life-cycles of structures which    */
+  /*    reference @FT_Library objects.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a target library object.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.4.2                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Reference_Library( FT_Library  library );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Library                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to create a new FreeType library instance    */
+  /*    from a given memory object.  It is thus possible to use libraries  */
+  /*    with distinct memory allocators within the same program.           */
+  /*                                                                       */
+  /*    Normally, you would call this function (followed by a call to      */
+  /*    @FT_Add_Default_Modules or a series of calls to @FT_Add_Module)    */
+  /*    instead of @FT_Init_FreeType to initialize the FreeType library.   */
+  /*                                                                       */
+  /*    Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a      */
+  /*    library instance.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory   :: A handle to the original memory object.                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    alibrary :: A pointer to handle of a new library object.           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    See the discussion of reference counters in the description of     */
+  /*    @FT_Reference_Library.                                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Library( FT_Memory    memory,
+                  FT_Library  *alibrary );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Library                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discard a given library object.  This closes all drivers and       */
+  /*    discards all resource objects.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to the target library.                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    See the discussion of reference counters in the description of     */
+  /*    @FT_Reference_Library.                                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Done_Library( FT_Library  library );
+
+/* */
+
+  typedef void
+  (*FT_DebugHook_Func)( void*  arg );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Debug_Hook                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set a debug hook function for debugging the interpreter of a font  */
+  /*    format.                                                            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    hook_index :: The index of the debug hook.  You should use the     */
+  /*                  values defined in `ftobjs.h', e.g.,                  */
+  /*                  `FT_DEBUG_HOOK_TRUETYPE'.                            */
+  /*                                                                       */
+  /*    debug_hook :: The function used to debug the interpreter.          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Currently, four debug hook slots are available, but only two (for  */
+  /*    the TrueType and the Type~1 interpreter) are defined.              */
+  /*                                                                       */
+  /*    Since the internal headers of FreeType are no longer installed,    */
+  /*    the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly.      */
+  /*    This is a bug and will be fixed in a forthcoming release.          */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Set_Debug_Hook( FT_Library         library,
+                     FT_UInt            hook_index,
+                     FT_DebugHook_Func  debug_hook );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Add_Default_Modules                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Add the set of default drivers to a given library object.          */
+  /*    This is only useful when you create a library object with          */
+  /*    @FT_New_Library (usually to plug a custom memory manager).         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library :: A handle to a new library object.                       */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Add_Default_Modules( FT_Library  library );
+
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   truetype_engine
+   *
+   * @title:
+   *   The TrueType Engine
+   *
+   * @abstract:
+   *   TrueType bytecode support.
+   *
+   * @description:
+   *   This section contains a function used to query the level of TrueType
+   *   bytecode support compiled in this version of the library.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   *  @enum:
+   *     FT_TrueTypeEngineType
+   *
+   *  @description:
+   *     A list of values describing which kind of TrueType bytecode
+   *     engine is implemented in a given FT_Library instance.  It is used
+   *     by the @FT_Get_TrueType_Engine_Type function.
+   *
+   *  @values:
+   *     FT_TRUETYPE_ENGINE_TYPE_NONE ::
+   *       The library doesn't implement any kind of bytecode interpreter.
+   *
+   *     FT_TRUETYPE_ENGINE_TYPE_UNPATENTED ::
+   *       The library implements a bytecode interpreter that doesn't
+   *       support the patented operations of the TrueType virtual machine.
+   *
+   *       Its main use is to load certain Asian fonts which position and
+   *       scale glyph components with bytecode instructions.  It produces
+   *       bad output for most other fonts.
+   *
+   *     FT_TRUETYPE_ENGINE_TYPE_PATENTED ::
+   *       The library implements a bytecode interpreter that covers
+   *       the full instruction set of the TrueType virtual machine (this
+   *       was governed by patents until May 2010, hence the name).
+   *
+   *  @since:
+   *     2.2
+   *
+   */
+  typedef enum  FT_TrueTypeEngineType_
+  {
+    FT_TRUETYPE_ENGINE_TYPE_NONE = 0,
+    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,
+    FT_TRUETYPE_ENGINE_TYPE_PATENTED
+
+  } FT_TrueTypeEngineType;
+
+
+  /**************************************************************************
+   *
+   *  @func:
+   *     FT_Get_TrueType_Engine_Type
+   *
+   *  @description:
+   *     Return an @FT_TrueTypeEngineType value to indicate which level of
+   *     the TrueType virtual machine a given library instance supports.
+   *
+   *  @input:
+   *     library ::
+   *       A library instance.
+   *
+   *  @return:
+   *     A value indicating which level is supported.
+   *
+   *  @since:
+   *     2.2
+   *
+   */
+  FT_EXPORT( FT_TrueTypeEngineType )
+  FT_Get_TrueType_Engine_Type( FT_Library  library );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMODAPI_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmoderr.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmoderr.h
new file mode 100644
index 0000000..4ca851e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmoderr.h
@@ -0,0 +1,194 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmoderr.h                                                             */
+/*                                                                         */
+/*    FreeType module error offsets (specification).                       */
+/*                                                                         */
+/*  Copyright 2001-2005, 2010, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the FreeType module error codes.          */
+  /*                                                                       */
+  /* If the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in `ftoption.h' is    */
+  /* set, the lower byte of an error value identifies the error code as    */
+  /* usual.  In addition, the higher byte identifies the module.  For      */
+  /* example, the error `FT_Err_Invalid_File_Format' has value 0x0003, the */
+  /* error `TT_Err_Invalid_File_Format' has value 0x1303, the error        */
+  /* `T1_Err_Invalid_File_Format' has value 0x1403, etc.                   */
+  /*                                                                       */
+  /* Note that `FT_Err_Ok', `TT_Err_Ok', etc. are always equal to zero,    */
+  /* including the high byte.                                              */
+  /*                                                                       */
+  /* If FT_CONFIG_OPTION_USE_MODULE_ERRORS isn't set, the higher byte of   */
+  /* an error value is set to zero.                                        */
+  /*                                                                       */
+  /* To hide the various `XXX_Err_' prefixes in the source code, FreeType  */
+  /* provides some macros in `fttypes.h'.                                  */
+  /*                                                                       */
+  /*   FT_ERR( err )                                                       */
+  /*     Add current error module prefix (as defined with the              */
+  /*     `FT_ERR_PREFIX' macro) to `err'.  For example, in the BDF module  */
+  /*     the line                                                          */
+  /*                                                                       */
+  /*       error = FT_ERR( Invalid_Outline );                              */
+  /*                                                                       */
+  /*     expands to                                                        */
+  /*                                                                       */
+  /*       error = BDF_Err_Invalid_Outline;                                */
+  /*                                                                       */
+  /*     For simplicity, you can always use `FT_Err_Ok' directly instead   */
+  /*     of `FT_ERR( Ok )'.                                                */
+  /*                                                                       */
+  /*   FT_ERR_EQ( errcode, err )                                           */
+  /*   FT_ERR_NEQ( errcode, err )                                          */
+  /*     Compare error code `errcode' with the error `err' for equality    */
+  /*     and inequality, respectively.  Example:                           */
+  /*                                                                       */
+  /*       if ( FT_ERR_EQ( error, Invalid_Outline ) )                      */
+  /*         ...                                                           */
+  /*                                                                       */
+  /*     Using this macro you don't have to think about error prefixes.    */
+  /*     Of course, if module errors are not active, the above example is  */
+  /*     the same as                                                       */
+  /*                                                                       */
+  /*       if ( error == FT_Err_Invalid_Outline )                          */
+  /*         ...                                                           */
+  /*                                                                       */
+  /*   FT_ERROR_BASE( errcode )                                            */
+  /*   FT_ERROR_MODULE( errcode )                                          */
+  /*     Get base error and module error code, respectively.               */
+  /*                                                                       */
+  /*                                                                       */
+  /* It can also be used to create a module error message table easily     */
+  /* with something like                                                   */
+  /*                                                                       */
+  /*   {                                                                   */
+  /*     #undef __FTMODERR_H__                                             */
+  /*     #define FT_MODERRDEF( e, v, s )  { FT_Mod_Err_ ## e, s },         */
+  /*     #define FT_MODERR_START_LIST     {                                */
+  /*     #define FT_MODERR_END_LIST       { 0, 0 } };                      */
+  /*                                                                       */
+  /*     const struct                                                      */
+  /*     {                                                                 */
+  /*       int          mod_err_offset;                                    */
+  /*       const char*  mod_err_msg                                        */
+  /*     } ft_mod_errors[] =                                               */
+  /*                                                                       */
+  /*     #include "ftmoderr.h"                                       */
+  /*   }                                                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTMODERR_H__
+#define __FTMODERR_H__
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                       SETUP MACROS                      *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#undef  FT_NEED_EXTERN_C
+
+#ifndef FT_MODERRDEF
+
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = v,
+#else
+#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = 0,
+#endif
+
+#define FT_MODERR_START_LIST  enum {
+#define FT_MODERR_END_LIST    FT_Mod_Err_Max };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+  extern "C" {
+#endif
+
+#endif /* !FT_MODERRDEF */
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****               LIST MODULE ERROR BASES                   *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#ifdef FT_MODERR_START_LIST
+  FT_MODERR_START_LIST
+#endif
+
+
+  FT_MODERRDEF( Base,      0x000, "base module" )
+  FT_MODERRDEF( Autofit,   0x100, "autofitter module" )
+  FT_MODERRDEF( BDF,       0x200, "BDF module" )
+  FT_MODERRDEF( Bzip2,     0x300, "Bzip2 module" )
+  FT_MODERRDEF( Cache,     0x400, "cache module" )
+  FT_MODERRDEF( CFF,       0x500, "CFF module" )
+  FT_MODERRDEF( CID,       0x600, "CID module" )
+  FT_MODERRDEF( Gzip,      0x700, "Gzip module" )
+  FT_MODERRDEF( LZW,       0x800, "LZW module" )
+  FT_MODERRDEF( OTvalid,   0x900, "OpenType validation module" )
+  FT_MODERRDEF( PCF,       0xA00, "PCF module" )
+  FT_MODERRDEF( PFR,       0xB00, "PFR module" )
+  FT_MODERRDEF( PSaux,     0xC00, "PS auxiliary module" )
+  FT_MODERRDEF( PShinter,  0xD00, "PS hinter module" )
+  FT_MODERRDEF( PSnames,   0xE00, "PS names module" )
+  FT_MODERRDEF( Raster,    0xF00, "raster module" )
+  FT_MODERRDEF( SFNT,     0x1000, "SFNT module" )
+  FT_MODERRDEF( Smooth,   0x1100, "smooth raster module" )
+  FT_MODERRDEF( TrueType, 0x1200, "TrueType module" )
+  FT_MODERRDEF( Type1,    0x1300, "Type 1 module" )
+  FT_MODERRDEF( Type42,   0x1400, "Type 42 module" )
+  FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" )
+  FT_MODERRDEF( GXvalid,  0x1600, "GX validation module" )
+
+
+#ifdef FT_MODERR_END_LIST
+  FT_MODERR_END_LIST
+#endif
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                      CLEANUP                            *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#ifdef FT_NEED_EXTERN_C
+  }
+#endif
+
+#undef FT_MODERR_START_LIST
+#undef FT_MODERR_END_LIST
+#undef FT_MODERRDEF
+#undef FT_NEED_EXTERN_C
+
+
+#endif /* __FTMODERR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftotval.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftotval.h
new file mode 100644
index 0000000..e33e307
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftotval.h
@@ -0,0 +1,203 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftotval.h                                                              */
+/*                                                                         */
+/*    FreeType API for validating OpenType tables (specification).         */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006, 2007 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/*                                                                         */
+/* Warning: This module might be moved to a different library in the       */
+/*          future to avoid a tight dependency between FreeType and the    */
+/*          OpenType specification.                                        */
+/*                                                                         */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTOTVAL_H__
+#define __FTOTVAL_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    ot_validation                                                      */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    OpenType Validation                                                */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    An API to validate OpenType tables.                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of functions to validate     */
+  /*    some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+ /**********************************************************************
+  *
+  * @enum:
+  *    FT_VALIDATE_OTXXX
+  *
+  * @description:
+  *    A list of bit-field constants used with @FT_OpenType_Validate to
+  *    indicate which OpenType tables should be validated.
+  *
+  * @values:
+  *    FT_VALIDATE_BASE ::
+  *      Validate BASE table.
+  *
+  *    FT_VALIDATE_GDEF ::
+  *      Validate GDEF table.
+  *
+  *    FT_VALIDATE_GPOS ::
+  *      Validate GPOS table.
+  *
+  *    FT_VALIDATE_GSUB ::
+  *      Validate GSUB table.
+  *
+  *    FT_VALIDATE_JSTF ::
+  *      Validate JSTF table.
+  *
+  *    FT_VALIDATE_MATH ::
+  *      Validate MATH table.
+  *
+  *    FT_VALIDATE_OT ::
+  *      Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).
+  *
+  */
+#define FT_VALIDATE_BASE  0x0100
+#define FT_VALIDATE_GDEF  0x0200
+#define FT_VALIDATE_GPOS  0x0400
+#define FT_VALIDATE_GSUB  0x0800
+#define FT_VALIDATE_JSTF  0x1000
+#define FT_VALIDATE_MATH  0x2000
+
+#define FT_VALIDATE_OT  FT_VALIDATE_BASE | \
+                        FT_VALIDATE_GDEF | \
+                        FT_VALIDATE_GPOS | \
+                        FT_VALIDATE_GSUB | \
+                        FT_VALIDATE_JSTF | \
+                        FT_VALIDATE_MATH
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_OpenType_Validate
+  *
+  * @description:
+  *    Validate various OpenType tables to assure that all offsets and
+  *    indices are valid.  The idea is that a higher-level library which
+  *    actually does the text layout can access those tables without
+  *    error checking (which can be quite time consuming).
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    validation_flags ::
+  *       A bit field which specifies the tables to be validated.  See
+  *       @FT_VALIDATE_OTXXX for possible values.
+  *
+  * @output:
+  *    BASE_table ::
+  *       A pointer to the BASE table.
+  *
+  *    GDEF_table ::
+  *       A pointer to the GDEF table.
+  *
+  *    GPOS_table ::
+  *       A pointer to the GPOS table.
+  *
+  *    GSUB_table ::
+  *       A pointer to the GSUB table.
+  *
+  *    JSTF_table ::
+  *       A pointer to the JSTF table.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   This function only works with OpenType fonts, returning an error
+  *   otherwise.
+  *
+  *   After use, the application should deallocate the five tables with
+  *   @FT_OpenType_Free.  A NULL value indicates that the table either
+  *   doesn't exist in the font, or the application hasn't asked for
+  *   validation.
+  */
+  FT_EXPORT( FT_Error )
+  FT_OpenType_Validate( FT_Face    face,
+                        FT_UInt    validation_flags,
+                        FT_Bytes  *BASE_table,
+                        FT_Bytes  *GDEF_table,
+                        FT_Bytes  *GPOS_table,
+                        FT_Bytes  *GSUB_table,
+                        FT_Bytes  *JSTF_table );
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_OpenType_Free
+  *
+  * @description:
+  *    Free the buffer allocated by OpenType validator.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    table ::
+  *       The pointer to the buffer that is allocated by
+  *       @FT_OpenType_Validate.
+  *
+  * @note:
+  *   This function must be used to free the buffer allocated by
+  *   @FT_OpenType_Validate only.
+  */
+  FT_EXPORT( void )
+  FT_OpenType_Free( FT_Face   face,
+                    FT_Bytes  table );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTOTVAL_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h
new file mode 100644
index 0000000..ca94947
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h
@@ -0,0 +1,560 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftoutln.h                                                              */
+/*                                                                         */
+/*    Support for the FT_Outline type used to store glyph shapes of        */
+/*    most scalable font formats (specification).                          */
+/*                                                                         */
+/*  Copyright 1996-2003, 2005-2012 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTOUTLN_H__
+#define __FTOUTLN_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    outline_processing                                                 */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Outline Processing                                                 */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Functions to create, transform, and render vectorial glyph images. */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains routines used to create and destroy scalable */
+  /*    glyph images known as `outlines'.  These can also be measured,     */
+  /*    transformed, and converted into bitmaps and pixmaps.               */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_Outline                                                         */
+  /*    FT_OUTLINE_FLAGS                                                   */
+  /*    FT_Outline_New                                                     */
+  /*    FT_Outline_Done                                                    */
+  /*    FT_Outline_Copy                                                    */
+  /*    FT_Outline_Translate                                               */
+  /*    FT_Outline_Transform                                               */
+  /*    FT_Outline_Embolden                                                */
+  /*    FT_Outline_EmboldenXY                                              */
+  /*    FT_Outline_Reverse                                                 */
+  /*    FT_Outline_Check                                                   */
+  /*                                                                       */
+  /*    FT_Outline_Get_CBox                                                */
+  /*    FT_Outline_Get_BBox                                                */
+  /*                                                                       */
+  /*    FT_Outline_Get_Bitmap                                              */
+  /*    FT_Outline_Render                                                  */
+  /*                                                                       */
+  /*    FT_Outline_Decompose                                               */
+  /*    FT_Outline_Funcs                                                   */
+  /*    FT_Outline_MoveTo_Func                                             */
+  /*    FT_Outline_LineTo_Func                                             */
+  /*    FT_Outline_ConicTo_Func                                            */
+  /*    FT_Outline_CubicTo_Func                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Decompose                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Walk over an outline's structure to decompose it into individual   */
+  /*    segments and Bézier arcs.  This function also emits `move to'      */
+  /*    operations to indicate the start of new contours in the outline.   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline        :: A pointer to the source target.                  */
+  /*                                                                       */
+  /*    func_interface :: A table of `emitters', i.e., function pointers   */
+  /*                      called during decomposition to indicate path     */
+  /*                      operations.                                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    user           :: A typeless pointer which is passed to each       */
+  /*                      emitter during the decomposition.  It can be     */
+  /*                      used to store the state during the               */
+  /*                      decomposition.                                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Decompose( FT_Outline*              outline,
+                        const FT_Outline_Funcs*  func_interface,
+                        void*                    user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_New                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new outline of a given size.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library     :: A handle to the library object from where the       */
+  /*                   outline is allocated.  Note however that the new    */
+  /*                   outline will *not* necessarily be *freed*, when     */
+  /*                   destroying the library, by @FT_Done_FreeType.       */
+  /*                                                                       */
+  /*    numPoints   :: The maximum number of points within the outline.    */
+  /*                   Must be smaller than or equal to 0xFFFF (65535).    */
+  /*                                                                       */
+  /*    numContours :: The maximum number of contours within the outline.  */
+  /*                   This value must be in the range 0 to `numPoints'.   */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    anoutline   :: A handle to the new outline.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The reason why this function takes a `library' parameter is simply */
+  /*    to use the library's memory allocator.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_New( FT_Library   library,
+                  FT_UInt      numPoints,
+                  FT_Int       numContours,
+                  FT_Outline  *anoutline );
+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_New_Internal( FT_Memory    memory,
+                           FT_UInt      numPoints,
+                           FT_Int       numContours,
+                           FT_Outline  *anoutline );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Done                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy an outline created with @FT_Outline_New.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle of the library object used to allocate the     */
+  /*               outline.                                                */
+  /*                                                                       */
+  /*    outline :: A pointer to the outline object to be discarded.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If the outline's `owner' field is not set, only the outline        */
+  /*    descriptor will be released.                                       */
+  /*                                                                       */
+  /*    The reason why this function takes an `library' parameter is       */
+  /*    simply to use ft_mem_free().                                       */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Done( FT_Library   library,
+                   FT_Outline*  outline );
+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_Done_Internal( FT_Memory    memory,
+                            FT_Outline*  outline );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Check                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Check the contents of an outline descriptor.                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline :: A handle to a source outline.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Check( FT_Outline*  outline );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Get_CBox                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return an outline's `control box'.  The control box encloses all   */
+  /*    the outline's points, including Bézier control points.  Though it  */
+  /*    coincides with the exact bounding box for most glyphs, it can be   */
+  /*    slightly larger in some situations (like when rotating an outline  */
+  /*    which contains Bézier outside arcs).                               */
+  /*                                                                       */
+  /*    Computing the control box is very fast, while getting the bounding */
+  /*    box can take much more time as it needs to walk over all segments  */
+  /*    and arcs in the outline.  To get the latter, you can use the       */
+  /*    `ftbbox' component which is dedicated to this single task.         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline :: A pointer to the source outline descriptor.             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acbox   :: The outline's control box.                              */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    See @FT_Glyph_Get_CBox for a discussion of tricky fonts.           */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Outline_Get_CBox( const FT_Outline*  outline,
+                       FT_BBox           *acbox );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Translate                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Apply a simple translation to the points of an outline.            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    outline :: A pointer to the target outline descriptor.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    xOffset :: The horizontal offset.                                  */
+  /*                                                                       */
+  /*    yOffset :: The vertical offset.                                    */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Outline_Translate( const FT_Outline*  outline,
+                        FT_Pos             xOffset,
+                        FT_Pos             yOffset );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Copy                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Copy an outline into another one.  Both objects must have the      */
+  /*    same sizes (number of points & number of contours) when this       */
+  /*    function is called.                                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    source :: A handle to the source outline.                          */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    target :: A handle to the target outline.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Copy( const FT_Outline*  source,
+                   FT_Outline        *target );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Transform                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Apply a simple 2x2 matrix to all of an outline's points.  Useful   */
+  /*    for applying rotations, slanting, flipping, etc.                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    outline :: A pointer to the target outline descriptor.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    matrix  :: A pointer to the transformation matrix.                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You can use @FT_Outline_Translate if you need to translate the     */
+  /*    outline's points.                                                  */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Outline_Transform( const FT_Outline*  outline,
+                        const FT_Matrix*   matrix );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Embolden                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Embolden an outline.  The new outline will be at most 4~times      */
+  /*    `strength' pixels wider and higher.  You may think of the left and */
+  /*    bottom borders as unchanged.                                       */
+  /*                                                                       */
+  /*    Negative `strength' values to reduce the outline thickness are     */
+  /*    possible also.                                                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    outline  :: A handle to the target outline.                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    strength :: How strong the glyph is emboldened.  Expressed in      */
+  /*                26.6 pixel format.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The used algorithm to increase or decrease the thickness of the    */
+  /*    glyph doesn't change the number of points; this means that certain */
+  /*    situations like acute angles or intersections are sometimes        */
+  /*    handled incorrectly.                                               */
+  /*                                                                       */
+  /*    If you need `better' metrics values you should call                */
+  /*    @FT_Outline_Get_CBox or @FT_Outline_Get_BBox.                      */
+  /*                                                                       */
+  /*    Example call:                                                      */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      FT_Load_Glyph( face, index, FT_LOAD_DEFAULT );                   */
+  /*      if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE )             */
+  /*        FT_Outline_Embolden( &face->slot->outline, strength );         */
+  /*    }                                                                  */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Embolden( FT_Outline*  outline,
+                       FT_Pos       strength );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_EmboldenXY                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Embolden an outline.  The new outline will be `xstrength' pixels   */
+  /*    wider and `ystrength' pixels higher.  Otherwise, it is similar to  */
+  /*    @FT_Outline_Embolden, which uses the same strength in both         */
+  /*    directions.                                                        */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_EmboldenXY( FT_Outline*  outline,
+                         FT_Pos       xstrength,
+                         FT_Pos       ystrength );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Reverse                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Reverse the drawing direction of an outline.  This is used to      */
+  /*    ensure consistent fill conventions for mirrored glyphs.            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    outline :: A pointer to the target outline descriptor.             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in     */
+  /*    the outline's `flags' field.                                       */
+  /*                                                                       */
+  /*    It shouldn't be used by a normal client application, unless it     */
+  /*    knows what it is doing.                                            */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Outline_Reverse( FT_Outline*  outline );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Get_Bitmap                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Render an outline within a bitmap.  The outline's image is simply  */
+  /*    OR-ed to the target bitmap.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a FreeType library object.                  */
+  /*                                                                       */
+  /*    outline :: A pointer to the source outline descriptor.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    abitmap :: A pointer to the target bitmap descriptor.              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function does NOT CREATE the bitmap, it only renders an       */
+  /*    outline image within the one you pass to it!  Consequently, the    */
+  /*    various fields in `abitmap' should be set accordingly.             */
+  /*                                                                       */
+  /*    It will use the raster corresponding to the default glyph format.  */
+  /*                                                                       */
+  /*    The value of the `num_grays' field in `abitmap' is ignored.  If    */
+  /*    you select the gray-level rasterizer, and you want less than 256   */
+  /*    gray levels, you have to use @FT_Outline_Render directly.          */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Get_Bitmap( FT_Library        library,
+                         FT_Outline*       outline,
+                         const FT_Bitmap  *abitmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Render                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Render an outline within a bitmap using the current scan-convert.  */
+  /*    This function uses an @FT_Raster_Params structure as an argument,  */
+  /*    allowing advanced features like direct composition, translucency,  */
+  /*    etc.                                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a FreeType library object.                  */
+  /*                                                                       */
+  /*    outline :: A pointer to the source outline descriptor.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    params  :: A pointer to an @FT_Raster_Params structure used to     */
+  /*               describe the rendering operation.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You should know what you are doing and how @FT_Raster_Params works */
+  /*    to use this function.                                              */
+  /*                                                                       */
+  /*    The field `params.source' will be set to `outline' before the scan */
+  /*    converter is called, which means that the value you give to it is  */
+  /*    actually ignored.                                                  */
+  /*                                                                       */
+  /*    The gray-level rasterizer always uses 256 gray levels.  If you     */
+  /*    want less gray levels, you have to provide your own span callback. */
+  /*    See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the   */
+  /*    @FT_Raster_Params structure for more details.                      */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Render( FT_Library         library,
+                     FT_Outline*        outline,
+                     FT_Raster_Params*  params );
+
+
+ /**************************************************************************
+  *
+  * @enum:
+  *   FT_Orientation
+  *
+  * @description:
+  *   A list of values used to describe an outline's contour orientation.
+  *
+  *   The TrueType and PostScript specifications use different conventions
+  *   to determine whether outline contours should be filled or unfilled.
+  *
+  * @values:
+  *   FT_ORIENTATION_TRUETYPE ::
+  *     According to the TrueType specification, clockwise contours must
+  *     be filled, and counter-clockwise ones must be unfilled.
+  *
+  *   FT_ORIENTATION_POSTSCRIPT ::
+  *     According to the PostScript specification, counter-clockwise contours
+  *     must be filled, and clockwise ones must be unfilled.
+  *
+  *   FT_ORIENTATION_FILL_RIGHT ::
+  *     This is identical to @FT_ORIENTATION_TRUETYPE, but is used to
+  *     remember that in TrueType, everything that is to the right of
+  *     the drawing direction of a contour must be filled.
+  *
+  *   FT_ORIENTATION_FILL_LEFT ::
+  *     This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to
+  *     remember that in PostScript, everything that is to the left of
+  *     the drawing direction of a contour must be filled.
+  *
+  *   FT_ORIENTATION_NONE ::
+  *     The orientation cannot be determined.  That is, different parts of
+  *     the glyph have different orientation.
+  *
+  */
+  typedef enum  FT_Orientation_
+  {
+    FT_ORIENTATION_TRUETYPE   = 0,
+    FT_ORIENTATION_POSTSCRIPT = 1,
+    FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,
+    FT_ORIENTATION_FILL_LEFT  = FT_ORIENTATION_POSTSCRIPT,
+    FT_ORIENTATION_NONE
+
+  } FT_Orientation;
+
+
+ /**************************************************************************
+  *
+  * @function:
+  *   FT_Outline_Get_Orientation
+  *
+  * @description:
+  *   This function analyzes a glyph outline and tries to compute its
+  *   fill orientation (see @FT_Orientation).  This is done by computing
+  *   the direction of each global horizontal and/or vertical extrema
+  *   within the outline.
+  *
+  *   Note that this will return @FT_ORIENTATION_TRUETYPE for empty
+  *   outlines.
+  *
+  * @input:
+  *   outline ::
+  *     A handle to the source outline.
+  *
+  * @return:
+  *   The orientation.
+  *
+  */
+  FT_EXPORT( FT_Orientation )
+  FT_Outline_Get_Orientation( FT_Outline*  outline );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTOUTLN_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftpfr.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftpfr.h
new file mode 100644
index 0000000..62cd67e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftpfr.h
@@ -0,0 +1,172 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpfr.h                                                                */
+/*                                                                         */
+/*    FreeType API for accessing PFR-specific data (specification only).   */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2006, 2008, 2009 by                        */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTPFR_H__
+#define __FTPFR_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    pfr_fonts                                                          */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    PFR Fonts                                                          */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    PFR/TrueDoc specific API.                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of PFR-specific functions.   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_PFR_Metrics
+  *
+  * @description:
+  *    Return the outline and metrics resolutions of a given PFR face.
+  *
+  * @input:
+  *    face :: Handle to the input face.  It can be a non-PFR face.
+  *
+  * @output:
+  *    aoutline_resolution ::
+  *      Outline resolution.  This is equivalent to `face->units_per_EM'
+  *      for non-PFR fonts.  Optional (parameter can be NULL).
+  *
+  *    ametrics_resolution ::
+  *      Metrics resolution.  This is equivalent to `outline_resolution'
+  *      for non-PFR fonts.  Optional (parameter can be NULL).
+  *
+  *    ametrics_x_scale ::
+  *      A 16.16 fixed-point number used to scale distance expressed
+  *      in metrics units to device sub-pixels.  This is equivalent to
+  *      `face->size->x_scale', but for metrics only.  Optional (parameter
+  *      can be NULL).
+  *
+  *    ametrics_y_scale ::
+  *      Same as `ametrics_x_scale' but for the vertical direction.
+  *      optional (parameter can be NULL).
+  *
+  * @return:
+  *    FreeType error code.  0~means success.
+  *
+  * @note:
+  *   If the input face is not a PFR, this function will return an error.
+  *   However, in all cases, it will return valid values.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_PFR_Metrics( FT_Face    face,
+                      FT_UInt   *aoutline_resolution,
+                      FT_UInt   *ametrics_resolution,
+                      FT_Fixed  *ametrics_x_scale,
+                      FT_Fixed  *ametrics_y_scale );
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_PFR_Kerning
+  *
+  * @description:
+  *    Return the kerning pair corresponding to two glyphs in a PFR face.
+  *    The distance is expressed in metrics units, unlike the result of
+  *    @FT_Get_Kerning.
+  *
+  * @input:
+  *    face  :: A handle to the input face.
+  *
+  *    left  :: Index of the left glyph.
+  *
+  *    right :: Index of the right glyph.
+  *
+  * @output:
+  *    avector :: A kerning vector.
+  *
+  * @return:
+  *    FreeType error code.  0~means success.
+  *
+  * @note:
+  *    This function always return distances in original PFR metrics
+  *    units.  This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED
+  *    mode, which always returns distances converted to outline units.
+  *
+  *    You can use the value of the `x_scale' and `y_scale' parameters
+  *    returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_PFR_Kerning( FT_Face     face,
+                      FT_UInt     left,
+                      FT_UInt     right,
+                      FT_Vector  *avector );
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_PFR_Advance
+  *
+  * @description:
+  *    Return a given glyph advance, expressed in original metrics units,
+  *    from a PFR font.
+  *
+  * @input:
+  *    face   :: A handle to the input face.
+  *
+  *    gindex :: The glyph index.
+  *
+  * @output:
+  *    aadvance :: The glyph advance in metrics units.
+  *
+  * @return:
+  *    FreeType error code.  0~means success.
+  *
+  * @note:
+  *    You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics
+  *    to convert the advance to device sub-pixels (i.e., 1/64th of pixels).
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_PFR_Advance( FT_Face   face,
+                      FT_UInt   gindex,
+                      FT_Pos   *aadvance );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTPFR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftrender.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftrender.h
new file mode 100644
index 0000000..b1437df
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftrender.h
@@ -0,0 +1,238 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftrender.h                                                             */
+/*                                                                         */
+/*    FreeType renderer modules public interface (specification).          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2005, 2006, 2010 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTRENDER_H__
+#define __FTRENDER_H__
+
+
+#include "../ft2build.h"
+#include "ftmodapi.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    module_management                                                  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* create a new glyph object */
+  typedef FT_Error
+  (*FT_Glyph_InitFunc)( FT_Glyph      glyph,
+                        FT_GlyphSlot  slot );
+
+  /* destroys a given glyph object */
+  typedef void
+  (*FT_Glyph_DoneFunc)( FT_Glyph  glyph );
+
+  typedef void
+  (*FT_Glyph_TransformFunc)( FT_Glyph          glyph,
+                             const FT_Matrix*  matrix,
+                             const FT_Vector*  delta );
+
+  typedef void
+  (*FT_Glyph_GetBBoxFunc)( FT_Glyph  glyph,
+                           FT_BBox*  abbox );
+
+  typedef FT_Error
+  (*FT_Glyph_CopyFunc)( FT_Glyph   source,
+                        FT_Glyph   target );
+
+  typedef FT_Error
+  (*FT_Glyph_PrepareFunc)( FT_Glyph      glyph,
+                           FT_GlyphSlot  slot );
+
+/* deprecated */
+#define FT_Glyph_Init_Func       FT_Glyph_InitFunc
+#define FT_Glyph_Done_Func       FT_Glyph_DoneFunc
+#define FT_Glyph_Transform_Func  FT_Glyph_TransformFunc
+#define FT_Glyph_BBox_Func       FT_Glyph_GetBBoxFunc
+#define FT_Glyph_Copy_Func       FT_Glyph_CopyFunc
+#define FT_Glyph_Prepare_Func    FT_Glyph_PrepareFunc
+
+
+  struct  FT_Glyph_Class_
+  {
+    FT_Long                 glyph_size;
+    FT_Glyph_Format         glyph_format;
+    FT_Glyph_InitFunc       glyph_init;
+    FT_Glyph_DoneFunc       glyph_done;
+    FT_Glyph_CopyFunc       glyph_copy;
+    FT_Glyph_TransformFunc  glyph_transform;
+    FT_Glyph_GetBBoxFunc    glyph_bbox;
+    FT_Glyph_PrepareFunc    glyph_prepare;
+  };
+
+
+  typedef FT_Error
+  (*FT_Renderer_RenderFunc)( FT_Renderer       renderer,
+                             FT_GlyphSlot      slot,
+                             FT_UInt           mode,
+                             const FT_Vector*  origin );
+
+  typedef FT_Error
+  (*FT_Renderer_TransformFunc)( FT_Renderer       renderer,
+                                FT_GlyphSlot      slot,
+                                const FT_Matrix*  matrix,
+                                const FT_Vector*  delta );
+
+
+  typedef void
+  (*FT_Renderer_GetCBoxFunc)( FT_Renderer   renderer,
+                              FT_GlyphSlot  slot,
+                              FT_BBox*      cbox );
+
+
+  typedef FT_Error
+  (*FT_Renderer_SetModeFunc)( FT_Renderer  renderer,
+                              FT_ULong     mode_tag,
+                              FT_Pointer   mode_ptr );
+
+/* deprecated identifiers */
+#define FTRenderer_render  FT_Renderer_RenderFunc
+#define FTRenderer_transform  FT_Renderer_TransformFunc
+#define FTRenderer_getCBox  FT_Renderer_GetCBoxFunc
+#define FTRenderer_setMode  FT_Renderer_SetModeFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Renderer_Class                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The renderer module class descriptor.                              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root            :: The root @FT_Module_Class fields.               */
+  /*                                                                       */
+  /*    glyph_format    :: The glyph image format this renderer handles.   */
+  /*                                                                       */
+  /*    render_glyph    :: A method used to render the image that is in a  */
+  /*                       given glyph slot into a bitmap.                 */
+  /*                                                                       */
+  /*    transform_glyph :: A method used to transform the image that is in */
+  /*                       a given glyph slot.                             */
+  /*                                                                       */
+  /*    get_glyph_cbox  :: A method used to access the glyph's cbox.       */
+  /*                                                                       */
+  /*    set_mode        :: A method used to pass additional parameters.    */
+  /*                                                                       */
+  /*    raster_class    :: For @FT_GLYPH_FORMAT_OUTLINE renderers only.    */
+  /*                       This is a pointer to its raster's class.        */
+  /*                                                                       */
+  typedef struct  FT_Renderer_Class_
+  {
+    FT_Module_Class            root;
+
+    FT_Glyph_Format            glyph_format;
+
+    FT_Renderer_RenderFunc     render_glyph;
+    FT_Renderer_TransformFunc  transform_glyph;
+    FT_Renderer_GetCBoxFunc    get_glyph_cbox;
+    FT_Renderer_SetModeFunc    set_mode;
+
+    FT_Raster_Funcs*           raster_class;
+
+  } FT_Renderer_Class;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Renderer                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the current renderer for a given glyph format.            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to the library object.                         */
+  /*                                                                       */
+  /*    format  :: The glyph format.                                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A renderer handle.  0~if none found.                               */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    An error will be returned if a module already exists by that name, */
+  /*    or if the module requires a version of FreeType that is too great. */
+  /*                                                                       */
+  /*    To add a new renderer, simply use @FT_Add_Module.  To retrieve a   */
+  /*    renderer by its name, use @FT_Get_Module.                          */
+  /*                                                                       */
+  FT_EXPORT( FT_Renderer )
+  FT_Get_Renderer( FT_Library       library,
+                   FT_Glyph_Format  format );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Renderer                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set the current renderer to use, and set additional mode.          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    renderer   :: A handle to the renderer object.                     */
+  /*                                                                       */
+  /*    num_params :: The number of additional parameters.                 */
+  /*                                                                       */
+  /*    parameters :: Additional parameters.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    In case of success, the renderer will be used to convert glyph     */
+  /*    images in the renderer's known format into bitmaps.                */
+  /*                                                                       */
+  /*    This doesn't change the current renderer for other formats.        */
+  /*                                                                       */
+  /*    Currently, only the B/W renderer, if compiled with                 */
+  /*    FT_RASTER_OPTION_ANTI_ALIASING (providing a 5-levels               */
+  /*    anti-aliasing mode; this option must be set directly in            */
+  /*    `ftraster.c' and is undefined by default) accepts a single tag     */
+  /*    `pal5' to set its gray palette as a character string with          */
+  /*    5~elements.  Consequently, the third and fourth argument are zero  */
+  /*    normally.                                                          */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Renderer( FT_Library     library,
+                   FT_Renderer    renderer,
+                   FT_UInt        num_params,
+                   FT_Parameter*  parameters );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTRENDER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsizes.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsizes.h
new file mode 100644
index 0000000..a4b449b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsizes.h
@@ -0,0 +1,159 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsizes.h                                                              */
+/*                                                                         */
+/*    FreeType size objects management (specification).                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2004, 2006, 2009 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Typical application would normally not need to use these functions.   */
+  /* However, they have been placed in a public API for the rare cases     */
+  /* where they are needed.                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTSIZES_H__
+#define __FTSIZES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    sizes_management                                                   */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Size Management                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Managing multiple sizes per face.                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    When creating a new face object (e.g., with @FT_New_Face), an      */
+  /*    @FT_Size object is automatically created and used to store all     */
+  /*    pixel-size dependent information, available in the `face->size'    */
+  /*    field.                                                             */
+  /*                                                                       */
+  /*    It is however possible to create more sizes for a given face,      */
+  /*    mostly in order to manage several character pixel sizes of the     */
+  /*    same font family and style.  See @FT_New_Size and @FT_Done_Size.   */
+  /*                                                                       */
+  /*    Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only           */
+  /*    modify the contents of the current `active' size; you thus need    */
+  /*    to use @FT_Activate_Size to change it.                             */
+  /*                                                                       */
+  /*    99% of applications won't need the functions provided here,        */
+  /*    especially if they use the caching sub-system, so be cautious      */
+  /*    when using these.                                                  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Size                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new size object from a given face object.                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to a parent face object.                          */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    asize :: A handle to a new size object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You need to call @FT_Activate_Size in order to select the new size */
+  /*    for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size,      */
+  /*    @FT_Load_Glyph, @FT_Load_Char, etc.                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Size( FT_Face   face,
+               FT_Size*  size );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Size                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discard a given size object.  Note that @FT_Done_Face              */
+  /*    automatically discards all size objects allocated with             */
+  /*    @FT_New_Size.                                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size :: A handle to a target size object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Done_Size( FT_Size  size );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Activate_Size                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Even though it is possible to create several size objects for a    */
+  /*    given face (see @FT_New_Size for details), functions like          */
+  /*    @FT_Load_Glyph or @FT_Load_Char only use the one which has been    */
+  /*    activated last to determine the `current character pixel size'.    */
+  /*                                                                       */
+  /*    This function can be used to `activate' a previously created size  */
+  /*    object.                                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size :: A handle to a target size object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If `face' is the size's parent face object, this function changes  */
+  /*    the value of `face->size' to the input size handle.                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Activate_Size( FT_Size  size );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTSIZES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsnames.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsnames.h
new file mode 100644
index 0000000..a13db81
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsnames.h
@@ -0,0 +1,200 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsnames.h                                                             */
+/*                                                                         */
+/*    Simple interface to access SFNT name tables (which are used          */
+/*    to hold font names, copyright info, notices, etc.) (specification).  */
+/*                                                                         */
+/*    This is _not_ used to retrieve glyph names!                          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2006, 2009, 2010 by                   */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FT_SFNT_NAMES_H__
+#define __FT_SFNT_NAMES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    sfnt_names                                                         */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    SFNT Names                                                         */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Access the names embedded in TrueType and OpenType files.          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The TrueType and OpenType specifications allow the inclusion of    */
+  /*    a special `names table' in font files.  This table contains        */
+  /*    textual (and internationalized) information regarding the font,    */
+  /*    like family name, copyright, version, etc.                         */
+  /*                                                                       */
+  /*    The definitions below are used to access them if available.        */
+  /*                                                                       */
+  /*    Note that this has nothing to do with glyph names!                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_SfntName                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model an SFNT `name' table entry.              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    platform_id :: The platform ID for `string'.                       */
+  /*                                                                       */
+  /*    encoding_id :: The encoding ID for `string'.                       */
+  /*                                                                       */
+  /*    language_id :: The language ID for `string'.                       */
+  /*                                                                       */
+  /*    name_id     :: An identifier for `string'.                         */
+  /*                                                                       */
+  /*    string      :: The `name' string.  Note that its format differs    */
+  /*                   depending on the (platform,encoding) pair.  It can  */
+  /*                   be a Pascal String, a UTF-16 one, etc.              */
+  /*                                                                       */
+  /*                   Generally speaking, the string is not               */
+  /*                   zero-terminated.  Please refer to the TrueType      */
+  /*                   specification for details.                          */
+  /*                                                                       */
+  /*    string_len  :: The length of `string' in bytes.                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Possible values for `platform_id', `encoding_id', `language_id',   */
+  /*    and `name_id' are given in the file `ttnameid.h'.  For details     */
+  /*    please refer to the TrueType or OpenType specification.            */
+  /*                                                                       */
+  /*    See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX,       */
+  /*    @TT_ISO_ID_XXX, and @TT_MS_ID_XXX.                                 */
+  /*                                                                       */
+  typedef struct  FT_SfntName_
+  {
+    FT_UShort  platform_id;
+    FT_UShort  encoding_id;
+    FT_UShort  language_id;
+    FT_UShort  name_id;
+
+    FT_Byte*   string;      /* this string is *not* null-terminated! */
+    FT_UInt    string_len;  /* in bytes */
+
+  } FT_SfntName;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Sfnt_Name_Count                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the number of name strings in the SFNT `name' table.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source face.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The number of strings in the `name' table.                         */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt )
+  FT_Get_Sfnt_Name_Count( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Sfnt_Name                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve a string of the SFNT `name' table for a given index.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face  :: A handle to the source face.                              */
+  /*                                                                       */
+  /*    idx   :: The index of the `name' string.                           */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aname :: The indexed @FT_SfntName structure.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `string' array returned in the `aname' structure is not        */
+  /*    null-terminated.  The application should deallocate it if it is no */
+  /*    longer in use.                                                     */
+  /*                                                                       */
+  /*    Use @FT_Get_Sfnt_Name_Count to get the total number of available   */
+  /*    `name' table entries, then do a loop until you get the right       */
+  /*    platform, encoding, and name ID.                                   */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Sfnt_Name( FT_Face       face,
+                    FT_UInt       idx,
+                    FT_SfntName  *aname );
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY
+   *
+   * @description:
+   *   A constant used as the tag of @FT_Parameter structures to make
+   *   FT_Open_Face() ignore preferred family subfamily names in `name'
+   *   table since OpenType version 1.4.  For backwards compatibility with
+   *   legacy systems which has 4-face-per-family restriction.
+   *
+   */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 'f' )
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY
+   *
+   * @description:
+   *   A constant used as the tag of @FT_Parameter structures to make
+   *   FT_Open_Face() ignore preferred subfamily names in `name' table since
+   *   OpenType version 1.4.  For backwards compatibility with legacy
+   *   systems which has 4-face-per-family restriction.
+   *
+   */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 's' )
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FT_SFNT_NAMES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftstroke.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftstroke.h
new file mode 100644
index 0000000..05f9a13
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftstroke.h
@@ -0,0 +1,751 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstroke.h                                                             */
+/*                                                                         */
+/*    FreeType path stroker (specification).                               */
+/*                                                                         */
+/*  Copyright 2002-2006, 2008, 2009, 2011-2012 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FT_STROKE_H__
+#define __FT_STROKE_H__
+
+#include "../ft2build.h"
+#include "ftoutln.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /************************************************************************
+  *
+  * @section:
+  *    glyph_stroker
+  *
+  * @title:
+  *    Glyph Stroker
+  *
+  * @abstract:
+  *    Generating bordered and stroked glyphs.
+  *
+  * @description:
+  *    This component generates stroked outlines of a given vectorial
+  *    glyph.  It also allows you to retrieve the `outside' and/or the
+  *    `inside' borders of the stroke.
+  *
+  *    This can be useful to generate `bordered' glyph, i.e., glyphs
+  *    displayed with a coloured (and anti-aliased) border around their
+  *    shape.
+  */
+
+
+ /**************************************************************
+  *
+  * @type:
+  *   FT_Stroker
+  *
+  * @description:
+  *   Opaque handler to a path stroker object.
+  */
+  typedef struct FT_StrokerRec_*  FT_Stroker;
+
+
+  /**************************************************************
+   *
+   * @enum:
+   *   FT_Stroker_LineJoin
+   *
+   * @description:
+   *   These values determine how two joining lines are rendered
+   *   in a stroker.
+   *
+   * @values:
+   *   FT_STROKER_LINEJOIN_ROUND ::
+   *     Used to render rounded line joins.  Circular arcs are used
+   *     to join two lines smoothly.
+   *
+   *   FT_STROKER_LINEJOIN_BEVEL ::
+   *     Used to render beveled line joins.  The outer corner of
+   *     the joined lines is filled by enclosing the triangular
+   *     region of the corner with a straight line between the
+   *     outer corners of each stroke.
+   *
+   *   FT_STROKER_LINEJOIN_MITER_FIXED ::
+   *     Used to render mitered line joins, with fixed bevels if the
+   *     miter limit is exceeded.  The outer edges of the strokes
+   *     for the two segments are extended until they meet at an
+   *     angle.  If the segments meet at too sharp an angle (such
+   *     that the miter would extend from the intersection of the
+   *     segments a distance greater than the product of the miter
+   *     limit value and the border radius), then a bevel join (see
+   *     above) is used instead.  This prevents long spikes being
+   *     created.  FT_STROKER_LINEJOIN_MITER_FIXED generates a miter
+   *     line join as used in PostScript and PDF.
+   *
+   *   FT_STROKER_LINEJOIN_MITER_VARIABLE ::
+   *   FT_STROKER_LINEJOIN_MITER ::
+   *     Used to render mitered line joins, with variable bevels if
+   *     the miter limit is exceeded.  The intersection of the
+   *     strokes is clipped at a line perpendicular to the bisector
+   *     of the angle between the strokes, at the distance from the
+   *     intersection of the segments equal to the product of the
+   *     miter limit value and the border radius.  This prevents
+   *     long spikes being created.
+   *     FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line
+   *     join as used in XPS.  FT_STROKER_LINEJOIN_MITER is an alias
+   *     for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for
+   *     backwards compatibility.
+   */
+  typedef enum  FT_Stroker_LineJoin_
+  {
+    FT_STROKER_LINEJOIN_ROUND          = 0,
+    FT_STROKER_LINEJOIN_BEVEL          = 1,
+    FT_STROKER_LINEJOIN_MITER_VARIABLE = 2,
+    FT_STROKER_LINEJOIN_MITER          = FT_STROKER_LINEJOIN_MITER_VARIABLE,
+    FT_STROKER_LINEJOIN_MITER_FIXED    = 3
+
+  } FT_Stroker_LineJoin;
+
+
+  /**************************************************************
+   *
+   * @enum:
+   *   FT_Stroker_LineCap
+   *
+   * @description:
+   *   These values determine how the end of opened sub-paths are
+   *   rendered in a stroke.
+   *
+   * @values:
+   *   FT_STROKER_LINECAP_BUTT ::
+   *     The end of lines is rendered as a full stop on the last
+   *     point itself.
+   *
+   *   FT_STROKER_LINECAP_ROUND ::
+   *     The end of lines is rendered as a half-circle around the
+   *     last point.
+   *
+   *   FT_STROKER_LINECAP_SQUARE ::
+   *     The end of lines is rendered as a square around the
+   *     last point.
+   */
+  typedef enum  FT_Stroker_LineCap_
+  {
+    FT_STROKER_LINECAP_BUTT = 0,
+    FT_STROKER_LINECAP_ROUND,
+    FT_STROKER_LINECAP_SQUARE
+
+  } FT_Stroker_LineCap;
+
+
+  /**************************************************************
+   *
+   * @enum:
+   *   FT_StrokerBorder
+   *
+   * @description:
+   *   These values are used to select a given stroke border
+   *   in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder.
+   *
+   * @values:
+   *   FT_STROKER_BORDER_LEFT ::
+   *     Select the left border, relative to the drawing direction.
+   *
+   *   FT_STROKER_BORDER_RIGHT ::
+   *     Select the right border, relative to the drawing direction.
+   *
+   * @note:
+   *   Applications are generally interested in the `inside' and `outside'
+   *   borders.  However, there is no direct mapping between these and the
+   *   `left' and `right' ones, since this really depends on the glyph's
+   *   drawing orientation, which varies between font formats.
+   *
+   *   You can however use @FT_Outline_GetInsideBorder and
+   *   @FT_Outline_GetOutsideBorder to get these.
+   */
+  typedef enum  FT_StrokerBorder_
+  {
+    FT_STROKER_BORDER_LEFT = 0,
+    FT_STROKER_BORDER_RIGHT
+
+  } FT_StrokerBorder;
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Outline_GetInsideBorder
+   *
+   * @description:
+   *   Retrieve the @FT_StrokerBorder value corresponding to the
+   *   `inside' borders of a given outline.
+   *
+   * @input:
+   *   outline ::
+   *     The source outline handle.
+   *
+   * @return:
+   *   The border index.  @FT_STROKER_BORDER_RIGHT for empty or invalid
+   *   outlines.
+   */
+  FT_EXPORT( FT_StrokerBorder )
+  FT_Outline_GetInsideBorder( FT_Outline*  outline );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Outline_GetOutsideBorder
+   *
+   * @description:
+   *   Retrieve the @FT_StrokerBorder value corresponding to the
+   *   `outside' borders of a given outline.
+   *
+   * @input:
+   *   outline ::
+   *     The source outline handle.
+   *
+   * @return:
+   *   The border index.  @FT_STROKER_BORDER_LEFT for empty or invalid
+   *   outlines.
+   */
+  FT_EXPORT( FT_StrokerBorder )
+  FT_Outline_GetOutsideBorder( FT_Outline*  outline );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_New
+   *
+   * @description:
+   *   Create a new stroker object.
+   *
+   * @input:
+   *   library ::
+   *     FreeType library handle.
+   *
+   * @output:
+   *   astroker ::
+   *     A new stroker object handle.  NULL in case of error.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_New( FT_Library   library,
+                  FT_Stroker  *astroker );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_Set
+   *
+   * @description:
+   *   Reset a stroker object's attributes.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   radius ::
+   *     The border radius.
+   *
+   *   line_cap ::
+   *     The line cap style.
+   *
+   *   line_join ::
+   *     The line join style.
+   *
+   *   miter_limit ::
+   *     The miter limit for the FT_STROKER_LINEJOIN_MITER_FIXED and
+   *     FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles,
+   *     expressed as 16.16 fixed-point value.
+   *
+   * @note:
+   *   The radius is expressed in the same units as the outline
+   *   coordinates.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_Set( FT_Stroker           stroker,
+                  FT_Fixed             radius,
+                  FT_Stroker_LineCap   line_cap,
+                  FT_Stroker_LineJoin  line_join,
+                  FT_Fixed             miter_limit );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_Rewind
+   *
+   * @description:
+   *   Reset a stroker object without changing its attributes.
+   *   You should call this function before beginning a new
+   *   series of calls to @FT_Stroker_BeginSubPath or
+   *   @FT_Stroker_EndSubPath.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_Rewind( FT_Stroker  stroker );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_ParseOutline
+   *
+   * @description:
+   *   A convenience function used to parse a whole outline with
+   *   the stroker.  The resulting outline(s) can be retrieved
+   *   later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   outline ::
+   *     The source outline.
+   *
+   *   opened ::
+   *     A boolean.  If~1, the outline is treated as an open path instead
+   *     of a closed one.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   If `opened' is~0 (the default), the outline is treated as a closed
+   *   path, and the stroker generates two distinct `border' outlines.
+   *
+   *   If `opened' is~1, the outline is processed as an open path, and the
+   *   stroker generates a single `stroke' outline.
+   *
+   *   This function calls @FT_Stroker_Rewind automatically.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_ParseOutline( FT_Stroker   stroker,
+                           FT_Outline*  outline,
+                           FT_Bool      opened );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_BeginSubPath
+   *
+   * @description:
+   *   Start a new sub-path in the stroker.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   to ::
+   *     A pointer to the start vector.
+   *
+   *   open ::
+   *     A boolean.  If~1, the sub-path is treated as an open one.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   This function is useful when you need to stroke a path that is
+   *   not stored as an @FT_Outline object.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_BeginSubPath( FT_Stroker  stroker,
+                           FT_Vector*  to,
+                           FT_Bool     open );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_EndSubPath
+   *
+   * @description:
+   *   Close the current sub-path in the stroker.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   You should call this function after @FT_Stroker_BeginSubPath.
+   *   If the subpath was not `opened', this function `draws' a
+   *   single line segment to the start position when needed.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_EndSubPath( FT_Stroker  stroker );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_LineTo
+   *
+   * @description:
+   *   `Draw' a single line segment in the stroker's current sub-path,
+   *   from the last position.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   to ::
+   *     A pointer to the destination point.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   You should call this function between @FT_Stroker_BeginSubPath and
+   *   @FT_Stroker_EndSubPath.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_LineTo( FT_Stroker  stroker,
+                     FT_Vector*  to );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_ConicTo
+   *
+   * @description:
+   *   `Draw' a single quadratic Bézier in the stroker's current sub-path,
+   *   from the last position.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   control ::
+   *     A pointer to a Bézier control point.
+   *
+   *   to ::
+   *     A pointer to the destination point.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   You should call this function between @FT_Stroker_BeginSubPath and
+   *   @FT_Stroker_EndSubPath.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_ConicTo( FT_Stroker  stroker,
+                      FT_Vector*  control,
+                      FT_Vector*  to );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_CubicTo
+   *
+   * @description:
+   *   `Draw' a single cubic Bézier in the stroker's current sub-path,
+   *   from the last position.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   control1 ::
+   *     A pointer to the first Bézier control point.
+   *
+   *   control2 ::
+   *     A pointer to second Bézier control point.
+   *
+   *   to ::
+   *     A pointer to the destination point.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   You should call this function between @FT_Stroker_BeginSubPath and
+   *   @FT_Stroker_EndSubPath.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_CubicTo( FT_Stroker  stroker,
+                      FT_Vector*  control1,
+                      FT_Vector*  control2,
+                      FT_Vector*  to );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_GetBorderCounts
+   *
+   * @description:
+   *   Call this function once you have finished parsing your paths
+   *   with the stroker.  It returns the number of points and
+   *   contours necessary to export one of the `border' or `stroke'
+   *   outlines generated by the stroker.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   border ::
+   *     The border index.
+   *
+   * @output:
+   *   anum_points ::
+   *     The number of points.
+   *
+   *   anum_contours ::
+   *     The number of contours.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   When an outline, or a sub-path, is `closed', the stroker generates
+   *   two independent `border' outlines, named `left' and `right'.
+   *
+   *   When the outline, or a sub-path, is `opened', the stroker merges
+   *   the `border' outlines with caps.  The `left' border receives all
+   *   points, while the `right' border becomes empty.
+   *
+   *   Use the function @FT_Stroker_GetCounts instead if you want to
+   *   retrieve the counts associated to both borders.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,
+                              FT_StrokerBorder  border,
+                              FT_UInt          *anum_points,
+                              FT_UInt          *anum_contours );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_ExportBorder
+   *
+   * @description:
+   *   Call this function after @FT_Stroker_GetBorderCounts to
+   *   export the corresponding border to your own @FT_Outline
+   *   structure.
+   *
+   *   Note that this function appends the border points and
+   *   contours to your outline, but does not try to resize its
+   *   arrays.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   border ::
+   *     The border index.
+   *
+   *   outline ::
+   *     The target outline handle.
+   *
+   * @note:
+   *   Always call this function after @FT_Stroker_GetBorderCounts to
+   *   get sure that there is enough room in your @FT_Outline object to
+   *   receive all new data.
+   *
+   *   When an outline, or a sub-path, is `closed', the stroker generates
+   *   two independent `border' outlines, named `left' and `right'
+   *
+   *   When the outline, or a sub-path, is `opened', the stroker merges
+   *   the `border' outlines with caps. The `left' border receives all
+   *   points, while the `right' border becomes empty.
+   *
+   *   Use the function @FT_Stroker_Export instead if you want to
+   *   retrieve all borders at once.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_ExportBorder( FT_Stroker        stroker,
+                           FT_StrokerBorder  border,
+                           FT_Outline*       outline );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_GetCounts
+   *
+   * @description:
+   *   Call this function once you have finished parsing your paths
+   *   with the stroker.  It returns the number of points and
+   *   contours necessary to export all points/borders from the stroked
+   *   outline/path.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   * @output:
+   *   anum_points ::
+   *     The number of points.
+   *
+   *   anum_contours ::
+   *     The number of contours.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_GetCounts( FT_Stroker  stroker,
+                        FT_UInt    *anum_points,
+                        FT_UInt    *anum_contours );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_Export
+   *
+   * @description:
+   *   Call this function after @FT_Stroker_GetBorderCounts to
+   *   export all borders to your own @FT_Outline structure.
+   *
+   *   Note that this function appends the border points and
+   *   contours to your outline, but does not try to resize its
+   *   arrays.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   outline ::
+   *     The target outline handle.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_Export( FT_Stroker   stroker,
+                     FT_Outline*  outline );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_Done
+   *
+   * @description:
+   *   Destroy a stroker object.
+   *
+   * @input:
+   *   stroker ::
+   *     A stroker handle.  Can be NULL.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_Done( FT_Stroker  stroker );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Glyph_Stroke
+   *
+   * @description:
+   *   Stroke a given outline glyph object with a given stroker.
+   *
+   * @inout:
+   *   pglyph ::
+   *     Source glyph handle on input, new glyph handle on output.
+   *
+   * @input:
+   *   stroker ::
+   *     A stroker handle.
+   *
+   *   destroy ::
+   *     A Boolean.  If~1, the source glyph object is destroyed
+   *     on success.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *   The source glyph is untouched in case of error.
+   *
+   *   Adding stroke may yield a significantly wider and taller glyph
+   *   depending on how large of a radius was used to stroke the glyph.  You
+   *   may need to manually adjust horizontal and vertical advance amounts
+   *   to account for this added size.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_Stroke( FT_Glyph    *pglyph,
+                   FT_Stroker   stroker,
+                   FT_Bool      destroy );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Glyph_StrokeBorder
+   *
+   * @description:
+   *   Stroke a given outline glyph object with a given stroker, but
+   *   only return either its inside or outside border.
+   *
+   * @inout:
+   *   pglyph ::
+   *     Source glyph handle on input, new glyph handle on output.
+   *
+   * @input:
+   *   stroker ::
+   *     A stroker handle.
+   *
+   *   inside ::
+   *     A Boolean.  If~1, return the inside border, otherwise
+   *     the outside border.
+   *
+   *   destroy ::
+   *     A Boolean.  If~1, the source glyph object is destroyed
+   *     on success.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *   The source glyph is untouched in case of error.
+   *
+   *   Adding stroke may yield a significantly wider and taller glyph
+   *   depending on how large of a radius was used to stroke the glyph.  You
+   *   may need to manually adjust horizontal and vertical advance amounts
+   *   to account for this added size.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,
+                         FT_Stroker   stroker,
+                         FT_Bool      inside,
+                         FT_Bool      destroy );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FT_STROKE_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsynth.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsynth.h
new file mode 100644
index 0000000..55f32d6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsynth.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsynth.h                                                              */
+/*                                                                         */
+/*    FreeType synthesizing code for emboldening and slanting              */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 2000-2001, 2003, 2006, 2008, 2012 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*********                                                       *********/
+  /*********        WARNING, THIS IS ALPHA CODE!  THIS API         *********/
+  /*********    IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE    *********/
+  /*********            FREETYPE DEVELOPMENT TEAM                  *********/
+  /*********                                                       *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* Main reason for not lifting the functions in this module to a  */
+  /* `standard' API is that the used parameters for emboldening and */
+  /* slanting are not configurable.  Consider the functions as a    */
+  /* code resource which should be copied into the application and  */
+  /* adapted to the particular needs.                               */
+
+
+#ifndef __FTSYNTH_H__
+#define __FTSYNTH_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /* Embolden a glyph by a `reasonable' value (which is highly a matter of */
+  /* taste).  This function is actually a convenience function, providing  */
+  /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden.           */
+  /*                                                                       */
+  /* For emboldened outlines the height, width, and advance metrics are    */
+  /* increased by the strength of the emboldening.  You can also call      */
+  /* @FT_Outline_Get_CBox to get precise values.                           */
+  FT_EXPORT( void )
+  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot );
+
+  /* Slant an outline glyph to the right by about 12 degrees. */
+  FT_EXPORT( void )
+  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot );
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __FTSYNTH_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsystem.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsystem.h
new file mode 100644
index 0000000..1e92390
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsystem.h
@@ -0,0 +1,354 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsystem.h                                                             */
+/*                                                                         */
+/*    FreeType low-level system interface definition (specification).      */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2005, 2010 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTSYSTEM_H__
+#define __FTSYSTEM_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*   system_interface                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*   System Interface                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*   How FreeType manages memory and i/o.                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   This section contains various definitions related to memory         */
+  /*   management and i/o access.  You need to understand this             */
+  /*   information if you want to use a custom memory manager or you own   */
+  /*   i/o streams.                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                  M E M O R Y   M A N A G E M E N T                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FT_Memory
+   *
+   * @description:
+   *   A handle to a given memory manager object, defined with an
+   *   @FT_MemoryRec structure.
+   *
+   */
+  typedef struct FT_MemoryRec_*  FT_Memory;
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Alloc_Func
+   *
+   * @description:
+   *   A function used to allocate `size' bytes from `memory'.
+   *
+   * @input:
+   *   memory ::
+   *     A handle to the source memory manager.
+   *
+   *   size ::
+   *     The size in bytes to allocate.
+   *
+   * @return:
+   *   Address of new memory block.  0~in case of failure.
+   *
+   */
+  typedef void*
+  (*FT_Alloc_Func)( FT_Memory  memory,
+                    long       size );
+
+  /* Sunliang.Liu 20100915 sync 221's revison. */
+  typedef void*
+	  (*FT_AllocDebug_Func)( FT_Memory  memory,
+	  long       size, const char* filename,  int line);
+
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Free_Func
+   *
+   * @description:
+   *   A function used to release a given block of memory.
+   *
+   * @input:
+   *   memory ::
+   *     A handle to the source memory manager.
+   *
+   *   block ::
+   *     The address of the target memory block.
+   *
+   */
+  typedef void
+  (*FT_Free_Func)( FT_Memory  memory,
+                   void*      block );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Realloc_Func
+   *
+   * @description:
+   *   A function used to re-allocate a given block of memory.
+   *
+   * @input:
+   *   memory ::
+   *     A handle to the source memory manager.
+   *
+   *   cur_size ::
+   *     The block's current size in bytes.
+   *
+   *   new_size ::
+   *     The block's requested new size.
+   *
+   *   block ::
+   *     The block's current address.
+   *
+   * @return:
+   *   New block address.  0~in case of memory shortage.
+   *
+   * @note:
+   *   In case of error, the old block must still be available.
+   *
+   */
+  typedef void*
+  (*FT_Realloc_Func)( FT_Memory  memory,
+                      long       cur_size,
+                      long       new_size,
+                      void*      block );
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   FT_MemoryRec
+   *
+   * @description:
+   *   A structure used to describe a given memory manager to FreeType~2.
+   *
+   * @fields:
+   *   user ::
+   *     A generic typeless pointer for user data.
+   *
+   *   alloc ::
+   *     A pointer type to an allocation function.
+   *
+   *   free ::
+   *     A pointer type to an memory freeing function.
+   *
+   *   realloc ::
+   *     A pointer type to a reallocation function.
+   *
+   */
+  struct  FT_MemoryRec_
+  {
+    void*            user;
+    FT_Alloc_Func    alloc;
+	FT_AllocDebug_Func allocdebug;	/* Sunliang.Liu 20100915 sync 221's revison. */
+    FT_Free_Func     free;
+    FT_Realloc_Func  realloc;
+  };
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                       I / O   M A N A G E M E N T                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FT_Stream
+   *
+   * @description:
+   *   A handle to an input stream.
+   *
+   */
+  typedef struct FT_StreamRec_*  FT_Stream;
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   FT_StreamDesc
+   *
+   * @description:
+   *   A union type used to store either a long or a pointer.  This is used
+   *   to store a file descriptor or a `FILE*' in an input stream.
+   *
+   */
+  typedef union  FT_StreamDesc_
+  {
+    long   value;
+    void*  pointer;
+
+  } FT_StreamDesc;
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Stream_IoFunc
+   *
+   * @description:
+   *   A function used to seek and read data from a given input stream.
+   *
+   * @input:
+   *   stream ::
+   *     A handle to the source stream.
+   *
+   *   offset ::
+   *     The offset of read in stream (always from start).
+   *
+   *   buffer ::
+   *     The address of the read buffer.
+   *
+   *   count ::
+   *     The number of bytes to read from the stream.
+   *
+   * @return:
+   *   The number of bytes effectively read by the stream.
+   *
+   * @note:
+   *   This function might be called to perform a seek or skip operation
+   *   with a `count' of~0.  A non-zero return value then indicates an
+   *   error.
+   *
+   */
+  typedef unsigned long
+  (*FT_Stream_IoFunc)( FT_Stream       stream,
+                       unsigned long   offset,
+                       unsigned char*  buffer,
+                       unsigned long   count );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Stream_CloseFunc
+   *
+   * @description:
+   *   A function used to close a given input stream.
+   *
+   * @input:
+   *  stream ::
+   *     A handle to the target stream.
+   *
+   */
+  typedef void
+  (*FT_Stream_CloseFunc)( FT_Stream  stream );
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   FT_StreamRec
+   *
+   * @description:
+   *   A structure used to describe an input stream.
+   *
+   * @input:
+   *   base ::
+   *     For memory-based streams, this is the address of the first stream
+   *     byte in memory.  This field should always be set to NULL for
+   *     disk-based streams.
+   *
+   *   size ::
+   *     The stream size in bytes.
+   *
+   *   pos ::
+   *     The current position within the stream.
+   *
+   *   descriptor ::
+   *     This field is a union that can hold an integer or a pointer.  It is
+   *     used by stream implementations to store file descriptors or `FILE*'
+   *     pointers.
+   *
+   *   pathname ::
+   *     This field is completely ignored by FreeType.  However, it is often
+   *     useful during debugging to use it to store the stream's filename
+   *     (where available).
+   *
+   *   read ::
+   *     The stream's input function.
+   *
+   *   close ::
+   *     The stream's close function.
+   *
+   *   memory ::
+   *     The memory manager to use to preload frames.  This is set
+   *     internally by FreeType and shouldn't be touched by stream
+   *     implementations.
+   *
+   *   cursor ::
+   *     This field is set and used internally by FreeType when parsing
+   *     frames.
+   *
+   *   limit ::
+   *     This field is set and used internally by FreeType when parsing
+   *     frames.
+   *
+   */
+  typedef struct  FT_StreamRec_
+  {
+    unsigned char*       base;
+    unsigned long        size;
+    unsigned long        pos;
+
+    FT_StreamDesc        descriptor;
+    FT_StreamDesc        pathname;
+    FT_Stream_IoFunc     read;
+    FT_Stream_CloseFunc  close;
+
+    FT_Memory            memory;
+    unsigned char*       cursor;
+    unsigned char*       limit;
+
+  } FT_StreamRec;
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTSYSTEM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttrigon.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttrigon.h
new file mode 100644
index 0000000..111c63e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttrigon.h
@@ -0,0 +1,350 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttrigon.h                                                             */
+/*                                                                         */
+/*    FreeType trigonometric functions (specification).                    */
+/*                                                                         */
+/*  Copyright 2001, 2003, 2005, 2007, 2013 by                              */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTTRIGON_H__
+#define __FTTRIGON_H__
+
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*   computations                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FT_Angle
+   *
+   * @description:
+   *   This type is used to model angle values in FreeType.  Note that the
+   *   angle is a 16.16 fixed-point value expressed in degrees.
+   *
+   */
+  typedef FT_Fixed  FT_Angle;
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ANGLE_PI
+   *
+   * @description:
+   *   The angle pi expressed in @FT_Angle units.
+   *
+   */
+#define FT_ANGLE_PI  ( 180L << 16 )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ANGLE_2PI
+   *
+   * @description:
+   *   The angle 2*pi expressed in @FT_Angle units.
+   *
+   */
+#define FT_ANGLE_2PI  ( FT_ANGLE_PI * 2 )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ANGLE_PI2
+   *
+   * @description:
+   *   The angle pi/2 expressed in @FT_Angle units.
+   *
+   */
+#define FT_ANGLE_PI2  ( FT_ANGLE_PI / 2 )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ANGLE_PI4
+   *
+   * @description:
+   *   The angle pi/4 expressed in @FT_Angle units.
+   *
+   */
+#define FT_ANGLE_PI4  ( FT_ANGLE_PI / 4 )
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Sin
+   *
+   * @description:
+   *   Return the sinus of a given angle in fixed-point format.
+   *
+   * @input:
+   *   angle ::
+   *     The input angle.
+   *
+   * @return:
+   *   The sinus value.
+   *
+   * @note:
+   *   If you need both the sinus and cosinus for a given angle, use the
+   *   function @FT_Vector_Unit.
+   *
+   */
+  FT_EXPORT( FT_Fixed )
+  FT_Sin( FT_Angle  angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Cos
+   *
+   * @description:
+   *   Return the cosinus of a given angle in fixed-point format.
+   *
+   * @input:
+   *   angle ::
+   *     The input angle.
+   *
+   * @return:
+   *   The cosinus value.
+   *
+   * @note:
+   *   If you need both the sinus and cosinus for a given angle, use the
+   *   function @FT_Vector_Unit.
+   *
+   */
+  FT_EXPORT( FT_Fixed )
+  FT_Cos( FT_Angle  angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Tan
+   *
+   * @description:
+   *   Return the tangent of a given angle in fixed-point format.
+   *
+   * @input:
+   *   angle ::
+   *     The input angle.
+   *
+   * @return:
+   *   The tangent value.
+   *
+   */
+  FT_EXPORT( FT_Fixed )
+  FT_Tan( FT_Angle  angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Atan2
+   *
+   * @description:
+   *   Return the arc-tangent corresponding to a given vector (x,y) in
+   *   the 2d plane.
+   *
+   * @input:
+   *   x ::
+   *     The horizontal vector coordinate.
+   *
+   *   y ::
+   *     The vertical vector coordinate.
+   *
+   * @return:
+   *   The arc-tangent value (i.e. angle).
+   *
+   */
+  FT_EXPORT( FT_Angle )
+  FT_Atan2( FT_Fixed  x,
+            FT_Fixed  y );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Angle_Diff
+   *
+   * @description:
+   *   Return the difference between two angles.  The result is always
+   *   constrained to the ]-PI..PI] interval.
+   *
+   * @input:
+   *   angle1 ::
+   *     First angle.
+   *
+   *   angle2 ::
+   *     Second angle.
+   *
+   * @return:
+   *   Constrained value of `value2-value1'.
+   *
+   */
+  FT_EXPORT( FT_Angle )
+  FT_Angle_Diff( FT_Angle  angle1,
+                 FT_Angle  angle2 );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_Unit
+   *
+   * @description:
+   *   Return the unit vector corresponding to a given angle.  After the
+   *   call, the value of `vec.x' will be `sin(angle)', and the value of
+   *   `vec.y' will be `cos(angle)'.
+   *
+   *   This function is useful to retrieve both the sinus and cosinus of a
+   *   given angle quickly.
+   *
+   * @output:
+   *   vec ::
+   *     The address of target vector.
+   *
+   * @input:
+   *   angle ::
+   *     The address of angle.
+   *
+   */
+  FT_EXPORT( void )
+  FT_Vector_Unit( FT_Vector*  vec,
+                  FT_Angle    angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_Rotate
+   *
+   * @description:
+   *   Rotate a vector by a given angle.
+   *
+   * @inout:
+   *   vec ::
+   *     The address of target vector.
+   *
+   * @input:
+   *   angle ::
+   *     The address of angle.
+   *
+   */
+  FT_EXPORT( void )
+  FT_Vector_Rotate( FT_Vector*  vec,
+                    FT_Angle    angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_Length
+   *
+   * @description:
+   *   Return the length of a given vector.
+   *
+   * @input:
+   *   vec ::
+   *     The address of target vector.
+   *
+   * @return:
+   *   The vector length, expressed in the same units that the original
+   *   vector coordinates.
+   *
+   */
+  FT_EXPORT( FT_Fixed )
+  FT_Vector_Length( FT_Vector*  vec );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_Polarize
+   *
+   * @description:
+   *   Compute both the length and angle of a given vector.
+   *
+   * @input:
+   *   vec ::
+   *     The address of source vector.
+   *
+   * @output:
+   *   length ::
+   *     The vector length.
+   *
+   *   angle ::
+   *     The vector angle.
+   *
+   */
+  FT_EXPORT( void )
+  FT_Vector_Polarize( FT_Vector*  vec,
+                      FT_Fixed   *length,
+                      FT_Angle   *angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_From_Polar
+   *
+   * @description:
+   *   Compute vector coordinates from a length and angle.
+   *
+   * @output:
+   *   vec ::
+   *     The address of source vector.
+   *
+   * @input:
+   *   length ::
+   *     The vector length.
+   *
+   *   angle ::
+   *     The vector angle.
+   *
+   */
+  FT_EXPORT( void )
+  FT_Vector_From_Polar( FT_Vector*  vec,
+                        FT_Fixed    length,
+                        FT_Angle    angle );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTTRIGON_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftttdrv.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftttdrv.h
new file mode 100644
index 0000000..01b25a4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftttdrv.h
@@ -0,0 +1,150 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftttdrv.h                                                              */
+/*                                                                         */
+/*    FreeType API for controlling the TrueType driver                     */
+/*    (specification only).                                                */
+/*                                                                         */
+/*  Copyright 2013 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTTTDRV_H__
+#define __FTTTDRV_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   tt_driver
+   *
+   * @title:
+   *   The TrueType driver
+   *
+   * @abstract:
+   *   Controlling the TrueType driver module.
+   *
+   * @description:
+   *   While FreeType's TrueType driver doesn't expose API functions by
+   *   itself, it is possible to control its behaviour with @FT_Property_Set
+   *   and @FT_Property_Get.  The following lists the available properties
+   *   together with the necessary macros and structures.
+   *
+   *   The TrueType driver's module name is `truetype'.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   interpreter-version
+   *
+   * @description:
+   *   Currently, two versions are available which represent the bytecode
+   *   interpreter with and without subpixel hinting support,
+   *   respectively.  The default is subpixel support if
+   *   TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel
+   *   support otherwise (since it isn't available then).
+   *
+   *   If subpixel hinting is on, many TrueType bytecode instructions
+   *   behave differently compared to B/W or grayscale rendering.  The
+   *   main idea is to render at a much increased horizontal resolution,
+   *   then sampling down the created output to subpixel precision.
+   *   However, many older fonts are not suited to this and must be
+   *   specially taken care of by applying (hardcoded) font-specific
+   *   tweaks.
+   *
+   *   Details on subpixel hinting and some of the necessary tweaks can be
+   *   found in Greg Hitchcock's whitepaper at
+   *   `http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.
+   *
+   *   The following example code demonstrates how to activate subpixel
+   *   hinting (omitting the error handling).
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Face     face;
+   *     FT_UInt     interpreter_version = TT_INTERPRETER_VERSION_38;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "truetype",
+   *                               "interpreter-version",
+   *                               &interpreter_version );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   TT_INTERPRETER_VERSION_XXX
+   *
+   * @description:
+   *   A list of constants used for the @interpreter-version property to
+   *   select the hinting engine for Truetype fonts.
+   *
+   *   The numeric value in the constant names represents the version
+   *   number as returned by the `GETINFO' bytecode instruction.
+   *
+   * @values:
+   *   TT_INTERPRETER_VERSION_35 ::
+   *     Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in
+   *     Windows~98; only grayscale and B/W rasterizing is supported.
+   *
+   *   TT_INTERPRETER_VERSION_38 ::
+   *     Version~38 corresponds to MS rasterizer v.1.9; it is roughly
+   *     equivalent to the hinting provided by DirectWrite ClearType (as
+   *     can be found, for example, in the Internet Explorer~9 running on
+   *     Windows~7).
+   *
+   * @note:
+   *   This property controls the behaviour of the bytecode interpreter
+   *   and thus how outlines get hinted.  It does *not* control how glyph
+   *   get rasterized!  In particular, it does not control subpixel color
+   *   filtering.
+   *
+   *   If FreeType has not been compiled with configuration option
+   *   FT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 causes an
+   *   `FT_Err_Unimplemented_Feature' error.
+   *
+   */
+#define TT_INTERPRETER_VERSION_35  35
+#define TT_INTERPRETER_VERSION_38  38
+
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __FTTTDRV_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttypes.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttypes.h
new file mode 100644
index 0000000..4d11bed
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttypes.h
@@ -0,0 +1,598 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttypes.h                                                              */
+/*                                                                         */
+/*    FreeType simple types definitions (specification only).              */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004, 2006-2009, 2012, 2013 by                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTTYPES_H__
+#define __FTTYPES_H__
+
+
+#include "../ft2build.h"
+#include "config/ftconfig.h"
+#include "ftsystem.h"
+#include "ftimage.h"
+
+#include <stddef.h>
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    basic_types                                                        */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Basic Data Types                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    The basic data types defined by the library.                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the basic data types defined by FreeType~2,  */
+  /*    ranging from simple scalar types to bitmap descriptors.  More      */
+  /*    font-specific structures are defined in a different section.       */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_Byte                                                            */
+  /*    FT_Bytes                                                           */
+  /*    FT_Char                                                            */
+  /*    FT_Int                                                             */
+  /*    FT_UInt                                                            */
+  /*    FT_Int16                                                           */
+  /*    FT_UInt16                                                          */
+  /*    FT_Int32                                                           */
+  /*    FT_UInt32                                                          */
+  /*    FT_Short                                                           */
+  /*    FT_UShort                                                          */
+  /*    FT_Long                                                            */
+  /*    FT_ULong                                                           */
+  /*    FT_Bool                                                            */
+  /*    FT_Offset                                                          */
+  /*    FT_PtrDist                                                         */
+  /*    FT_String                                                          */
+  /*    FT_Tag                                                             */
+  /*    FT_Error                                                           */
+  /*    FT_Fixed                                                           */
+  /*    FT_Pointer                                                         */
+  /*    FT_Pos                                                             */
+  /*    FT_Vector                                                          */
+  /*    FT_BBox                                                            */
+  /*    FT_Matrix                                                          */
+  /*    FT_FWord                                                           */
+  /*    FT_UFWord                                                          */
+  /*    FT_F2Dot14                                                         */
+  /*    FT_UnitVector                                                      */
+  /*    FT_F26Dot6                                                         */
+  /*                                                                       */
+  /*                                                                       */
+  /*    FT_Generic                                                         */
+  /*    FT_Generic_Finalizer                                               */
+  /*                                                                       */
+  /*    FT_Bitmap                                                          */
+  /*    FT_Pixel_Mode                                                      */
+  /*    FT_Palette_Mode                                                    */
+  /*    FT_Glyph_Format                                                    */
+  /*    FT_IMAGE_TAG                                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Bool                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef of unsigned char, used for simple booleans.  As usual,   */
+  /*    values 1 and~0 represent true and false, respectively.             */
+  /*                                                                       */
+  typedef unsigned char  FT_Bool;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_FWord                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A signed 16-bit integer used to store a distance in original font  */
+  /*    units.                                                             */
+  /*                                                                       */
+  typedef signed short  FT_FWord;   /* distance in FUnits */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UFWord                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An unsigned 16-bit integer used to store a distance in original    */
+  /*    font units.                                                        */
+  /*                                                                       */
+  typedef unsigned short  FT_UFWord;  /* unsigned distance */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Char                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple typedef for the _signed_ char type.                       */
+  /*                                                                       */
+  typedef signed char  FT_Char;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Byte                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple typedef for the _unsigned_ char type.                     */
+  /*                                                                       */
+  typedef unsigned char  FT_Byte;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Bytes                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for constant memory areas.                               */
+  /*                                                                       */
+  typedef const FT_Byte*  FT_Bytes;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Tag                                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for 32-bit tags (as used in the SFNT format).            */
+  /*                                                                       */
+  typedef FT_UInt32  FT_Tag;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_String                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple typedef for the char type, usually used for strings.      */
+  /*                                                                       */
+  typedef char  FT_String;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Short                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for signed short.                                        */
+  /*                                                                       */
+  typedef signed short  FT_Short;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UShort                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for unsigned short.                                      */
+  /*                                                                       */
+  typedef unsigned short  FT_UShort;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Int                                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for the int type.                                        */
+  /*                                                                       */
+  typedef signed int  FT_Int;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UInt                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for the unsigned int type.                               */
+  /*                                                                       */
+  typedef unsigned int  FT_UInt;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Long                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for signed long.                                         */
+  /*                                                                       */
+  typedef signed long  FT_Long;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_ULong                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for unsigned long.                                       */
+  /*                                                                       */
+  typedef unsigned long  FT_ULong;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_F2Dot14                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A signed 2.14 fixed-point type used for unit vectors.              */
+  /*                                                                       */
+  typedef signed short  FT_F2Dot14;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_F26Dot6                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A signed 26.6 fixed-point type used for vectorial pixel            */
+  /*    coordinates.                                                       */
+  /*                                                                       */
+  typedef signed long  FT_F26Dot6;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Fixed                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This type is used to store 16.16 fixed-point values, like scaling  */
+  /*    values or matrix coefficients.                                     */
+  /*                                                                       */
+  typedef signed long  FT_Fixed;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Error                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The FreeType error code type.  A value of~0 is always interpreted  */
+  /*    as a successful operation.                                         */
+  /*                                                                       */
+  typedef int  FT_Error;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Pointer                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple typedef for a typeless pointer.                           */
+  /*                                                                       */
+  typedef void*  FT_Pointer;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Offset                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is equivalent to the ANSI~C `size_t' type, i.e., the largest  */
+  /*    _unsigned_ integer type used to express a file size or position,   */
+  /*    or a memory block size.                                            */
+  /*                                                                       */
+  typedef size_t  FT_Offset;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_PtrDist                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the       */
+  /*    largest _signed_ integer type used to express the distance         */
+  /*    between two pointers.                                              */
+  /*                                                                       */
+  typedef ft_ptrdiff_t  FT_PtrDist;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_UnitVector                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to store a 2D vector unit vector.  Uses    */
+  /*    FT_F2Dot14 types.                                                  */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    x :: Horizontal coordinate.                                        */
+  /*                                                                       */
+  /*    y :: Vertical coordinate.                                          */
+  /*                                                                       */
+  typedef struct  FT_UnitVector_
+  {
+    FT_F2Dot14  x;
+    FT_F2Dot14  y;
+
+  } FT_UnitVector;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Matrix                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to store a 2x2 matrix.  Coefficients are   */
+  /*    in 16.16 fixed-point format.  The computation performed is:        */
+  /*                                                                       */
+  /*       {                                                               */
+  /*          x' = x*xx + y*xy                                             */
+  /*          y' = x*yx + y*yy                                             */
+  /*       }                                                               */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    xx :: Matrix coefficient.                                          */
+  /*                                                                       */
+  /*    xy :: Matrix coefficient.                                          */
+  /*                                                                       */
+  /*    yx :: Matrix coefficient.                                          */
+  /*                                                                       */
+  /*    yy :: Matrix coefficient.                                          */
+  /*                                                                       */
+  typedef struct  FT_Matrix_
+  {
+    FT_Fixed  xx, xy;
+    FT_Fixed  yx, yy;
+
+  } FT_Matrix;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Data                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Read-only binary data represented as a pointer and a length.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    pointer :: The data.                                               */
+  /*                                                                       */
+  /*    length  :: The length of the data in bytes.                        */
+  /*                                                                       */
+  typedef struct  FT_Data_
+  {
+    const FT_Byte*  pointer;
+    FT_Int          length;
+
+  } FT_Data;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Generic_Finalizer                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Describe a function used to destroy the `client' data of any       */
+  /*    FreeType object.  See the description of the @FT_Generic type for  */
+  /*    details of usage.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    The address of the FreeType object which is under finalization.    */
+  /*    Its client data is accessed through its `generic' field.           */
+  /*                                                                       */
+  typedef void  (*FT_Generic_Finalizer)(void*  object);
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Generic                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Client applications often need to associate their own data to a    */
+  /*    variety of FreeType core objects.  For example, a text layout API  */
+  /*    might want to associate a glyph cache to a given size object.      */
+  /*                                                                       */
+  /*    Some FreeType object contains a `generic' field, of type           */
+  /*    FT_Generic, which usage is left to client applications and font    */
+  /*    servers.                                                           */
+  /*                                                                       */
+  /*    It can be used to store a pointer to client-specific data, as well */
+  /*    as the address of a `finalizer' function, which will be called by  */
+  /*    FreeType when the object is destroyed (for example, the previous   */
+  /*    client example would put the address of the glyph cache destructor */
+  /*    in the `finalizer' field).                                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    data      :: A typeless pointer to any client-specified data. This */
+  /*                 field is completely ignored by the FreeType library.  */
+  /*                                                                       */
+  /*    finalizer :: A pointer to a `generic finalizer' function, which    */
+  /*                 will be called when the object is destroyed.  If this */
+  /*                 field is set to NULL, no code will be called.         */
+  /*                                                                       */
+  typedef struct  FT_Generic_
+  {
+    void*                 data;
+    FT_Generic_Finalizer  finalizer;
+
+  } FT_Generic;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_MAKE_TAG                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro converts four-letter tags which are used to label       */
+  /*    TrueType tables into an unsigned long to be used within FreeType.  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The produced values *must* be 32-bit integers.  Don't redefine     */
+  /*    this macro.                                                        */
+  /*                                                                       */
+#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
+          (FT_Tag)                        \
+          ( ( (FT_ULong)_x1 << 24 ) |     \
+            ( (FT_ULong)_x2 << 16 ) |     \
+            ( (FT_ULong)_x3 <<  8 ) |     \
+              (FT_ULong)_x4         )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /*                    L I S T   M A N A G E M E N T                      */
+  /*                                                                       */
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    list_processing                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_ListNode                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*     Many elements and objects in FreeType are listed through an       */
+  /*     @FT_List record (see @FT_ListRec).  As its name suggests, an      */
+  /*     FT_ListNode is a handle to a single list element.                 */
+  /*                                                                       */
+  typedef struct FT_ListNodeRec_*  FT_ListNode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_List                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a list record (see @FT_ListRec).                       */
+  /*                                                                       */
+  typedef struct FT_ListRec_*  FT_List;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_ListNodeRec                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold a single list element.                    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    prev :: The previous element in the list.  NULL if first.          */
+  /*                                                                       */
+  /*    next :: The next element in the list.  NULL if last.               */
+  /*                                                                       */
+  /*    data :: A typeless pointer to the listed object.                   */
+  /*                                                                       */
+  typedef struct  FT_ListNodeRec_
+  {
+    FT_ListNode  prev;
+    FT_ListNode  next;
+    void*        data;
+
+  } FT_ListNodeRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_ListRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold a simple doubly-linked list.  These are   */
+  /*    used in many parts of FreeType.                                    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    head :: The head (first element) of doubly-linked list.            */
+  /*                                                                       */
+  /*    tail :: The tail (last element) of doubly-linked list.             */
+  /*                                                                       */
+  typedef struct  FT_ListRec_
+  {
+    FT_ListNode  head;
+    FT_ListNode  tail;
+
+  } FT_ListRec;
+
+
+  /* */
+
+#define FT_IS_EMPTY( list )  ( (list).head == 0 )
+#define FT_BOOL( x )  ( (FT_Bool)( x ) )
+
+  /* concatenate C tokens */
+#define FT_ERR_XCAT( x, y )  x ## y
+#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )
+
+  /* see `ftmoderr.h' for descriptions of the following macros */
+
+#define FT_ERR( e )  FT_ERR_CAT( FT_ERR_PREFIX, e )
+
+#define FT_ERROR_BASE( x )    ( (x) & 0xFF )
+#define FT_ERROR_MODULE( x )  ( (x) & 0xFF00U )
+
+#define FT_ERR_EQ( x, e )                                        \
+          ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) )
+#define FT_ERR_NEQ( x, e )                                       \
+          ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTTYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftwinfnt.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftwinfnt.h
new file mode 100644
index 0000000..af4334e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftwinfnt.h
@@ -0,0 +1,274 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftwinfnt.h                                                             */
+/*                                                                         */
+/*    FreeType API for accessing Windows fnt-specific data.                */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2008 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTWINFNT_H__
+#define __FTWINFNT_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    winfnt_fonts                                                       */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Window FNT Files                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Windows FNT specific API.                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of Windows FNT specific      */
+  /*    functions.                                                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @enum:
+   *   FT_WinFNT_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `charset' byte in
+   *   @FT_WinFNT_HeaderRec.  Exact mapping tables for the various cpXXXX
+   *   encodings (except for cp1361) can be found at ftp://ftp.unicode.org
+   *   in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory.  cp1361 is
+   *   roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.
+   *
+   * @values:
+   *   FT_WinFNT_ID_DEFAULT ::
+   *     This is used for font enumeration and font creation as a
+   *     `don't care' value.  Valid font files don't contain this value.
+   *     When querying for information about the character set of the font
+   *     that is currently selected into a specified device context, this
+   *     return value (of the related Windows API) simply denotes failure.
+   *
+   *   FT_WinFNT_ID_SYMBOL ::
+   *     There is no known mapping table available.
+   *
+   *   FT_WinFNT_ID_MAC ::
+   *     Mac Roman encoding.
+   *
+   *   FT_WinFNT_ID_OEM ::
+   *     From Michael Pöttgen <michael@poettgen.de>:
+   *
+   *       The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM
+   *       is used for the charset of vector fonts, like `modern.fon',
+   *       `roman.fon', and `script.fon' on Windows.
+   *
+   *       The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value
+   *       specifies a character set that is operating-system dependent.
+   *
+   *       The `IFIMETRICS' documentation from the `Windows Driver
+   *       Development Kit' says: This font supports an OEM-specific
+   *       character set.  The OEM character set is system dependent.
+   *
+   *       In general OEM, as opposed to ANSI (i.e., cp1252), denotes the
+   *       second default codepage that most international versions of
+   *       Windows have.  It is one of the OEM codepages from
+   *
+   *         http://www.microsoft.com/globaldev/reference/cphome.mspx,
+   *
+   *       and is used for the `DOS boxes', to support legacy applications.
+   *       A German Windows version for example usually uses ANSI codepage
+   *       1252 and OEM codepage 850.
+   *
+   *   FT_WinFNT_ID_CP874 ::
+   *     A superset of Thai TIS 620 and ISO 8859-11.
+   *
+   *   FT_WinFNT_ID_CP932 ::
+   *     A superset of Japanese Shift-JIS (with minor deviations).
+   *
+   *   FT_WinFNT_ID_CP936 ::
+   *     A superset of simplified Chinese GB 2312-1980 (with different
+   *     ordering and minor deviations).
+   *
+   *   FT_WinFNT_ID_CP949 ::
+   *     A superset of Korean Hangul KS~C 5601-1987 (with different
+   *     ordering and minor deviations).
+   *
+   *   FT_WinFNT_ID_CP950 ::
+   *     A superset of traditional Chinese Big~5 ETen (with different
+   *     ordering and minor deviations).
+   *
+   *   FT_WinFNT_ID_CP1250 ::
+   *     A superset of East European ISO 8859-2 (with slightly different
+   *     ordering).
+   *
+   *   FT_WinFNT_ID_CP1251 ::
+   *     A superset of Russian ISO 8859-5 (with different ordering).
+   *
+   *   FT_WinFNT_ID_CP1252 ::
+   *     ANSI encoding.  A superset of ISO 8859-1.
+   *
+   *   FT_WinFNT_ID_CP1253 ::
+   *     A superset of Greek ISO 8859-7 (with minor modifications).
+   *
+   *   FT_WinFNT_ID_CP1254 ::
+   *     A superset of Turkish ISO 8859-9.
+   *
+   *   FT_WinFNT_ID_CP1255 ::
+   *     A superset of Hebrew ISO 8859-8 (with some modifications).
+   *
+   *   FT_WinFNT_ID_CP1256 ::
+   *     A superset of Arabic ISO 8859-6 (with different ordering).
+   *
+   *   FT_WinFNT_ID_CP1257 ::
+   *     A superset of Baltic ISO 8859-13 (with some deviations).
+   *
+   *   FT_WinFNT_ID_CP1258 ::
+   *     For Vietnamese.  This encoding doesn't cover all necessary
+   *     characters.
+   *
+   *   FT_WinFNT_ID_CP1361 ::
+   *     Korean (Johab).
+   */
+
+#define FT_WinFNT_ID_CP1252    0
+#define FT_WinFNT_ID_DEFAULT   1
+#define FT_WinFNT_ID_SYMBOL    2
+#define FT_WinFNT_ID_MAC      77
+#define FT_WinFNT_ID_CP932   128
+#define FT_WinFNT_ID_CP949   129
+#define FT_WinFNT_ID_CP1361  130
+#define FT_WinFNT_ID_CP936   134
+#define FT_WinFNT_ID_CP950   136
+#define FT_WinFNT_ID_CP1253  161
+#define FT_WinFNT_ID_CP1254  162
+#define FT_WinFNT_ID_CP1258  163
+#define FT_WinFNT_ID_CP1255  177
+#define FT_WinFNT_ID_CP1256  178
+#define FT_WinFNT_ID_CP1257  186
+#define FT_WinFNT_ID_CP1251  204
+#define FT_WinFNT_ID_CP874   222
+#define FT_WinFNT_ID_CP1250  238
+#define FT_WinFNT_ID_OEM     255
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_WinFNT_HeaderRec                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Windows FNT Header info.                                           */
+  /*                                                                       */
+  typedef struct  FT_WinFNT_HeaderRec_
+  {
+    FT_UShort  version;
+    FT_ULong   file_size;
+    FT_Byte    copyright[60];
+    FT_UShort  file_type;
+    FT_UShort  nominal_point_size;
+    FT_UShort  vertical_resolution;
+    FT_UShort  horizontal_resolution;
+    FT_UShort  ascent;
+    FT_UShort  internal_leading;
+    FT_UShort  external_leading;
+    FT_Byte    italic;
+    FT_Byte    underline;
+    FT_Byte    strike_out;
+    FT_UShort  weight;
+    FT_Byte    charset;
+    FT_UShort  pixel_width;
+    FT_UShort  pixel_height;
+    FT_Byte    pitch_and_family;
+    FT_UShort  avg_width;
+    FT_UShort  max_width;
+    FT_Byte    first_char;
+    FT_Byte    last_char;
+    FT_Byte    default_char;
+    FT_Byte    break_char;
+    FT_UShort  bytes_per_row;
+    FT_ULong   device_offset;
+    FT_ULong   face_name_offset;
+    FT_ULong   bits_pointer;
+    FT_ULong   bits_offset;
+    FT_Byte    reserved;
+    FT_ULong   flags;
+    FT_UShort  A_space;
+    FT_UShort  B_space;
+    FT_UShort  C_space;
+    FT_UShort  color_table_offset;
+    FT_ULong   reserved1[4];
+
+  } FT_WinFNT_HeaderRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_WinFNT_Header                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an @FT_WinFNT_HeaderRec structure.                     */
+  /*                                                                       */
+  typedef struct FT_WinFNT_HeaderRec_*  FT_WinFNT_Header;
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Get_WinFNT_Header
+   *
+   * @description:
+   *    Retrieve a Windows FNT font info header.
+   *
+   * @input:
+   *    face    :: A handle to the input face.
+   *
+   * @output:
+   *    aheader :: The WinFNT header.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   This function only works with Windows FNT faces, returning an error
+   *   otherwise.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_WinFNT_Header( FT_Face               face,
+                        FT_WinFNT_HeaderRec  *aheader );
+
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __FTWINFNT_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftxf86.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftxf86.h
new file mode 100644
index 0000000..d7e2dab
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftxf86.h
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftxf86.h                                                               */
+/*                                                                         */
+/*    Support functions for X11.                                           */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2006, 2007 by                              */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTXF86_H__
+#define __FTXF86_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*   font_formats                                                        */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*   Font Formats                                                        */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*   Getting the font format.                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   The single function in this section can be used to get the font     */
+  /*   format.  Note that this information is not needed normally;         */
+  /*   however, there are special cases (like in PDF devices) where it is  */
+  /*   important to differentiate, in spite of FreeType's uniform API.     */
+  /*                                                                       */
+  /*   This function is in the X11/xf86 namespace for historical reasons   */
+  /*   and in no way depends on that windowing system.                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*   FT_Get_X11_Font_Format                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   Return a string describing the format of a given face, using values */
+  /*   which can be used as an X11 FONT_PROPERTY.  Possible values are     */
+  /*   `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */
+  /*   `PFR', and `Windows~FNT'.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*   face ::                                                             */
+  /*     Input face handle.                                                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   Font format string.  NULL in case of error.                         */
+  /*                                                                       */
+  FT_EXPORT( const char* )
+  FT_Get_X11_Font_Format( FT_Face  face );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTXF86_H__ */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/autohint.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/autohint.h
new file mode 100644
index 0000000..f07646d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/autohint.h
@@ -0,0 +1,244 @@
+/***************************************************************************/
+/*                                                                         */
+/*  autohint.h                                                             */
+/*                                                                         */
+/*    High-level `autohint' module-specific interface (specification).     */
+/*                                                                         */
+/*  Copyright 1996-2002, 2007, 2009, 2012 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The auto-hinter is used to load and automatically hint glyphs if a    */
+  /* format-specific hinter isn't available.                               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __AUTOHINT_H__
+#define __AUTOHINT_H__
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A small technical note regarding automatic hinting in order to        */
+  /* clarify this module interface.                                        */
+  /*                                                                       */
+  /* An automatic hinter might compute two kinds of data for a given face: */
+  /*                                                                       */
+  /* - global hints: Usually some metrics that describe global properties  */
+  /*                 of the face.  It is computed by scanning more or less */
+  /*                 aggressively the glyphs in the face, and thus can be  */
+  /*                 very slow to compute (even if the size of global      */
+  /*                 hints is really small).                               */
+  /*                                                                       */
+  /* - glyph hints:  These describe some important features of the glyph   */
+  /*                 outline, as well as how to align them.  They are      */
+  /*                 generally much faster to compute than global hints.   */
+  /*                                                                       */
+  /* The current FreeType auto-hinter does a pretty good job while         */
+  /* performing fast computations for both global and glyph hints.         */
+  /* However, we might be interested in introducing more complex and       */
+  /* powerful algorithms in the future, like the one described in the John */
+  /* D. Hobby paper, which unfortunately requires a lot more horsepower.   */
+  /*                                                                       */
+  /* Because a sufficiently sophisticated font management system would     */
+  /* typically implement an LRU cache of opened face objects to reduce     */
+  /* memory usage, it is a good idea to be able to avoid recomputing       */
+  /* global hints every time the same face is re-opened.                   */
+  /*                                                                       */
+  /* We thus provide the ability to cache global hints outside of the face */
+  /* object, in order to speed up font re-opening time.  Of course, this   */
+  /* feature is purely optional, so most client programs won't even notice */
+  /* it.                                                                   */
+  /*                                                                       */
+  /* I initially thought that it would be a good idea to cache the glyph   */
+  /* hints too.  However, my general idea now is that if you really need   */
+  /* to cache these too, you are simply in need of a new font format,      */
+  /* where all this information could be stored within the font file and   */
+  /* decoded on the fly.                                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+  typedef struct FT_AutoHinterRec_  *FT_AutoHinter;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_AutoHinter_GlobalGetFunc                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the global hints computed for a given face object.  The   */
+  /*    resulting data is dissociated from the face and will survive a     */
+  /*    call to FT_Done_Face().  It must be discarded through the API      */
+  /*    FT_AutoHinter_GlobalDoneFunc().                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    hinter       :: A handle to the source auto-hinter.                */
+  /*                                                                       */
+  /*    face         :: A handle to the source face object.                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    global_hints :: A typeless pointer to the global hints.            */
+  /*                                                                       */
+  /*    global_len   :: The size in bytes of the global hints.             */
+  /*                                                                       */
+  typedef void
+  (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter  hinter,
+                                  FT_Face        face,
+                                  void**         global_hints,
+                                  long*          global_len );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_AutoHinter_GlobalDoneFunc                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discard the global hints retrieved through                         */
+  /*    FT_AutoHinter_GlobalGetFunc().  This is the only way these hints   */
+  /*    are freed from memory.                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    hinter :: A handle to the auto-hinter module.                      */
+  /*                                                                       */
+  /*    global :: A pointer to retrieved global hints to discard.          */
+  /*                                                                       */
+  typedef void
+  (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter  hinter,
+                                   void*          global );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_AutoHinter_GlobalResetFunc                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to recompute the global metrics in a given   */
+  /*    font.  This is useful when global font data changes (e.g. Multiple */
+  /*    Masters fonts where blend coordinates change).                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    hinter :: A handle to the source auto-hinter.                      */
+  /*                                                                       */
+  /*    face   :: A handle to the face.                                    */
+  /*                                                                       */
+  typedef void
+  (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter  hinter,
+                                    FT_Face        face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_AutoHinter_GlyphLoadFunc                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to load, scale, and automatically hint a     */
+  /*    glyph from a given face.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to the face.                               */
+  /*                                                                       */
+  /*    glyph_index :: The glyph index.                                    */
+  /*                                                                       */
+  /*    load_flags  :: The load flags.                                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is capable of loading composite glyphs by hinting    */
+  /*    each sub-glyph independently (which improves quality).             */
+  /*                                                                       */
+  /*    It will call the font driver with @FT_Load_Glyph, with             */
+  /*    @FT_LOAD_NO_SCALE set.                                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter  hinter,
+                                  FT_GlyphSlot   slot,
+                                  FT_Size        size,
+                                  FT_UInt        glyph_index,
+                                  FT_Int32       load_flags );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_AutoHinter_InterfaceRec                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The auto-hinter module's interface.                                */
+  /*                                                                       */
+  typedef struct  FT_AutoHinter_InterfaceRec_
+  {
+    FT_AutoHinter_GlobalResetFunc  reset_face;
+    FT_AutoHinter_GlobalGetFunc    get_global_hints;
+    FT_AutoHinter_GlobalDoneFunc   done_global_hints;
+    FT_AutoHinter_GlyphLoadFunc    load_glyph;
+
+  } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_AUTOHINTER_INTERFACE(       \
+          class_,                             \
+          reset_face_,                        \
+          get_global_hints_,                  \
+          done_global_hints_,                 \
+          load_glyph_ )                       \
+  FT_CALLBACK_TABLE_DEF                       \
+  const FT_AutoHinter_InterfaceRec  class_ =  \
+  {                                           \
+    reset_face_,                              \
+    get_global_hints_,                        \
+    done_global_hints_,                       \
+    load_glyph_                               \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_AUTOHINTER_INTERFACE(                            \
+          class_,                                                  \
+          reset_face_,                                             \
+          get_global_hints_,                                       \
+          done_global_hints_,                                      \
+          load_glyph_ )                                            \
+  void                                                             \
+  FT_Init_Class_ ## class_( FT_Library                   library,  \
+                            FT_AutoHinter_InterfaceRec*  clazz )   \
+  {                                                                \
+    FT_UNUSED( library );                                          \
+                                                                   \
+    clazz->reset_face        = reset_face_;                        \
+    clazz->get_global_hints  = get_global_hints_;                  \
+    clazz->done_global_hints = done_global_hints_;                 \
+    clazz->load_glyph        = load_glyph_;                        \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __AUTOHINT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h
new file mode 100644
index 0000000..1f2462d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h
@@ -0,0 +1,167 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcalc.h                                                               */
+/*                                                                         */
+/*    Arithmetic computations (specification).                             */
+/*                                                                         */
+/*  Copyright 1996-2006, 2008, 2009, 2012-2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCALC_H__
+#define __FTCALC_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_FixedSqrt                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the square root of a 16.16 fixed-point value.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    x :: The value to compute the root for.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `sqrt(x)'.                                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is not very fast.                                    */
+  /*                                                                       */
+  FT_BASE( FT_Int32 )
+  FT_SqrtFixed( FT_Int32  x );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FT_MulDiv() and FT_MulFix() are declared in freetype.h.               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_MulDiv_No_Round                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to perform the computation `(a*b)/c'   */
+  /*    (without rounding) with maximum accuracy (it uses a 64-bit         */
+  /*    intermediate integer whenever necessary).                          */
+  /*                                                                       */
+  /*    This function isn't necessarily as fast as some processor specific */
+  /*    operations, but is at least completely portable.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The first multiplier.                                         */
+  /*    b :: The second multiplier.                                        */
+  /*    c :: The divisor.                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a*b)/c'.  This function never traps when trying to */
+  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */
+  /*    on the signs of `a' and `b'.                                       */
+  /*                                                                       */
+  FT_BASE( FT_Long )
+  FT_MulDiv_No_Round( FT_Long  a,
+                      FT_Long  b,
+                      FT_Long  c );
+
+
+  /*
+   *  A variant of FT_Matrix_Multiply which scales its result afterwards.
+   *  The idea is that both `a' and `b' are scaled by factors of 10 so that
+   *  the values are as precise as possible to get a correct result during
+   *  the 64bit multiplication.  Let `sa' and `sb' be the scaling factors of
+   *  `a' and `b', respectively, then the scaling factor of the result is
+   *  `sa*sb'.
+   */
+  FT_BASE( void )
+  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,
+                             FT_Matrix        *b,
+                             FT_Long           scaling );
+
+
+  /*
+   *  A variant of FT_Vector_Transform.  See comments for
+   *  FT_Matrix_Multiply_Scaled.
+   */
+  FT_BASE( void )
+  FT_Vector_Transform_Scaled( FT_Vector*        vector,
+                              const FT_Matrix*  matrix,
+                              FT_Long           scaling );
+
+
+  /*
+   *  Return -1, 0, or +1, depending on the orientation of a given corner.
+   *  We use the Cartesian coordinate system, with positive vertical values
+   *  going upwards.  The function returns +1 if the corner turns to the
+   *  left, -1 to the right, and 0 for undecidable cases.
+   */
+  FT_BASE( FT_Int )
+  ft_corner_orientation( FT_Pos  in_x,
+                         FT_Pos  in_y,
+                         FT_Pos  out_x,
+                         FT_Pos  out_y );
+
+  /*
+   *  Return TRUE if a corner is flat or nearly flat.  This is equivalent to
+   *  saying that the angle difference between the `in' and `out' vectors is
+   *  very small.
+   */
+  FT_BASE( FT_Int )
+  ft_corner_is_flat( FT_Pos  in_x,
+                     FT_Pos  in_y,
+                     FT_Pos  out_x,
+                     FT_Pos  out_y );
+
+
+  /*
+   *  Return the most significant bit index.
+   */
+  FT_BASE( FT_Int )
+  FT_MSB( FT_UInt32  z );
+
+
+  /*
+   *  Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses
+   *  two fixed-point arguments instead.
+   */
+  FT_BASE( FT_Fixed )
+  FT_Hypot( FT_Fixed  x,
+            FT_Fixed  y );
+
+
+#define INT_TO_F26DOT6( x )    ( (FT_Long)(x) << 6  )
+#define INT_TO_F2DOT14( x )    ( (FT_Long)(x) << 14 )
+#define INT_TO_FIXED( x )      ( (FT_Long)(x) << 16 )
+#define F2DOT14_TO_FIXED( x )  ( (FT_Long)(x) << 2  )
+#define FLOAT_TO_FIXED( x )    ( (FT_Long)( x * 65536.0 ) )
+#define FIXED_TO_INT( x )      ( FT_RoundFix( x ) >> 16 )
+
+#define ROUND_F26DOT6( x )     ( x >= 0 ? (    ( (x) + 32 ) & -64 )     \
+                                        : ( -( ( 32 - (x) ) & -64 ) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTCALC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdebug.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdebug.h
new file mode 100644
index 0000000..e7b1419
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdebug.h
@@ -0,0 +1,255 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdebug.h                                                              */
+/*                                                                         */
+/*    Debugging and logging component (specification).                     */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004, 2006-2009, 2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/*                                                                         */
+/*  IMPORTANT: A description of FreeType's debugging support can be        */
+/*             found in `docs/DEBUG.TXT'.  Read it if you need to use or   */
+/*             understand this code.                                       */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTDEBUG_H__
+#define __FTDEBUG_H__
+
+
+#include "../../ft2build.h"
+#include "../config/ftconfig.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */
+  /* is already defined; this simplifies the following #ifdefs            */
+  /*                                                                      */
+#ifdef FT_DEBUG_LEVEL_TRACE
+#undef  FT_DEBUG_LEVEL_ERROR
+#define FT_DEBUG_LEVEL_ERROR
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the trace enums as well as the trace levels array when they    */
+  /* are needed.                                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define FT_TRACE_DEF( x )  trace_ ## x ,
+
+  /* defining the enumeration */
+  typedef enum  FT_Trace_
+  {
+#include "fttrace.h"
+    trace_count
+
+  } FT_Trace;
+
+
+  /* defining the array of trace levels, provided by `src/base/ftdebug.c' */
+  extern int  ft_trace_levels[trace_count];
+
+#undef FT_TRACE_DEF
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the FT_TRACE macro                                             */
+  /*                                                                       */
+  /* IMPORTANT!                                                            */
+  /*                                                                       */
+  /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */
+  /* value before using any TRACE macro.                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define FT_TRACE( level, varformat )                      \
+          do                                              \
+          {                                               \
+            if ( ft_trace_levels[FT_COMPONENT] >= level ) \
+              FT_Message varformat;                       \
+          } while ( 0 )
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+#define FT_TRACE( level, varformat )  do { } while ( 0 )      /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Trace_Get_Count                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the number of available trace components.                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The number of trace components.  0 if FreeType 2 is not built with */
+  /*    FT_DEBUG_LEVEL_TRACE definition.                                   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function may be useful if you want to access elements of      */
+  /*    the internal `ft_trace_levels' array by an index.                  */
+  /*                                                                       */
+  FT_BASE( FT_Int )
+  FT_Trace_Get_Count( void );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Trace_Get_Name                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the name of a trace component.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    The index of the trace component.                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The name of the trace component.  This is a statically allocated   */
+  /*    C string, so do not free it after use.  NULL if FreeType 2 is not  */
+  /*    built with FT_DEBUG_LEVEL_TRACE definition.                        */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Use @FT_Trace_Get_Count to get the number of available trace       */
+  /*    components.                                                        */
+  /*                                                                       */
+  /*    This function may be useful if you want to control FreeType 2's    */
+  /*    debug level in your application.                                   */
+  /*                                                                       */
+  FT_BASE( const char * )
+  FT_Trace_Get_Name( FT_Int  idx );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* You need two opening and closing parentheses!                         */
+  /*                                                                       */
+  /* Example: FT_TRACE0(( "Value is %i", foo ))                            */
+  /*                                                                       */
+  /* Output of the FT_TRACEX macros is sent to stderr.                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define FT_TRACE0( varformat )  FT_TRACE( 0, varformat )
+#define FT_TRACE1( varformat )  FT_TRACE( 1, varformat )
+#define FT_TRACE2( varformat )  FT_TRACE( 2, varformat )
+#define FT_TRACE3( varformat )  FT_TRACE( 3, varformat )
+#define FT_TRACE4( varformat )  FT_TRACE( 4, varformat )
+#define FT_TRACE5( varformat )  FT_TRACE( 5, varformat )
+#define FT_TRACE6( varformat )  FT_TRACE( 6, varformat )
+#define FT_TRACE7( varformat )  FT_TRACE( 7, varformat )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the FT_ERROR macro.                                            */
+  /*                                                                       */
+  /* Output of this macro is sent to stderr.                               */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ERROR( varformat )  FT_Message  varformat
+
+#else  /* !FT_DEBUG_LEVEL_ERROR */
+
+#define FT_ERROR( varformat )  do { } while ( 0 )      /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the FT_ASSERT and FT_THROW macros.  The call to `FT_Throw'     */
+  /* makes it possible to easily set a breakpoint at this function.        */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ASSERT( condition )                                      \
+          do                                                        \
+          {                                                         \
+            if ( !( condition ) )                                   \
+              FT_Panic( "assertion failed on line %d of file %s\n", \
+                        __LINE__, __FILE__ );                       \
+          } while ( 0 )
+
+#define FT_THROW( e )                                   \
+          ( FT_Throw( FT_ERR_CAT( FT_ERR_PREFIX, e ),   \
+                      __LINE__,                         \
+                      __FILE__ )                      | \
+            FT_ERR_CAT( FT_ERR_PREFIX, e )            )
+
+#else /* !FT_DEBUG_LEVEL_ERROR */
+
+#define FT_ASSERT( condition )  do { } while ( 0 )
+
+#define FT_THROW( e )  FT_ERR_CAT( FT_ERR_PREFIX, e )
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define `FT_Message' and `FT_Panic' when needed.                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#include "stdio.h"  /* for vfprintf() */
+
+  /* print a message */
+  FT_BASE( void )
+  FT_Message( const char*  fmt,
+              ... );
+
+  /* print a message and exit */
+  FT_BASE( void )
+  FT_Panic( const char*  fmt,
+            ... );
+
+  /* report file name and line number of an error */
+  FT_BASE( int )
+  FT_Throw( FT_Error     error,
+            int          line,
+            const char*  file );
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+  FT_BASE( void )
+  ft_debug_init( void );
+
+FT_END_HEADER
+
+#endif /* __FTDEBUG_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdriver.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdriver.h
new file mode 100644
index 0000000..5b0e863
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdriver.h
@@ -0,0 +1,409 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdriver.h                                                             */
+/*                                                                         */
+/*    FreeType font driver interface (specification).                      */
+/*                                                                         */
+/*  Copyright 1996-2003, 2006, 2008, 2011-2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTDRIVER_H__
+#define __FTDRIVER_H__
+
+
+#include "../../ft2build.h"
+#include "../ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+  typedef FT_Error
+  (*FT_Face_InitFunc)( FT_Stream      stream,
+                       FT_Face        face,
+                       FT_Int         typeface_index,
+                       FT_Int         num_params,
+                       FT_Parameter*  parameters );
+
+  typedef void
+  (*FT_Face_DoneFunc)( FT_Face  face );
+
+
+  typedef FT_Error
+  (*FT_Size_InitFunc)( FT_Size  size );
+
+  typedef void
+  (*FT_Size_DoneFunc)( FT_Size  size );
+
+
+  typedef FT_Error
+  (*FT_Slot_InitFunc)( FT_GlyphSlot  slot );
+
+  typedef void
+  (*FT_Slot_DoneFunc)( FT_GlyphSlot  slot );
+
+
+  typedef FT_Error
+  (*FT_Size_RequestFunc)( FT_Size          size,
+                          FT_Size_Request  req );
+
+  typedef FT_Error
+  (*FT_Size_SelectFunc)( FT_Size   size,
+                         FT_ULong  size_index );
+
+  typedef FT_Error
+  (*FT_Slot_LoadFunc)( FT_GlyphSlot  slot,
+                       FT_Size       size,
+                       FT_UInt       glyph_index,
+                       FT_Int32      load_flags );
+
+
+  typedef FT_UInt
+  (*FT_CharMap_CharIndexFunc)( FT_CharMap  charmap,
+                               FT_Long     charcode );
+
+  typedef FT_Long
+  (*FT_CharMap_CharNextFunc)( FT_CharMap  charmap,
+                              FT_Long     charcode );
+
+
+  typedef FT_Error
+  (*FT_Face_GetKerningFunc)( FT_Face     face,
+                             FT_UInt     left_glyph,
+                             FT_UInt     right_glyph,
+                             FT_Vector*  kerning );
+
+
+  typedef FT_Error
+  (*FT_Face_AttachFunc)( FT_Face    face,
+                         FT_Stream  stream );
+
+
+  typedef FT_Error
+  (*FT_Face_GetAdvancesFunc)( FT_Face    face,
+                              FT_UInt    first,
+                              FT_UInt    count,
+                              FT_Int32   flags,
+                              FT_Fixed*  advances );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Driver_ClassRec                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The font driver class.  This structure mostly contains pointers to */
+  /*    driver methods.                                                    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root             :: The parent module.                             */
+  /*                                                                       */
+  /*    face_object_size :: The size of a face object in bytes.            */
+  /*                                                                       */
+  /*    size_object_size :: The size of a size object in bytes.            */
+  /*                                                                       */
+  /*    slot_object_size :: The size of a glyph object in bytes.           */
+  /*                                                                       */
+  /*    init_face        :: The format-specific face constructor.          */
+  /*                                                                       */
+  /*    done_face        :: The format-specific face destructor.           */
+  /*                                                                       */
+  /*    init_size        :: The format-specific size constructor.          */
+  /*                                                                       */
+  /*    done_size        :: The format-specific size destructor.           */
+  /*                                                                       */
+  /*    init_slot        :: The format-specific slot constructor.          */
+  /*                                                                       */
+  /*    done_slot        :: The format-specific slot destructor.           */
+  /*                                                                       */
+  /*                                                                       */
+  /*    load_glyph       :: A function handle to load a glyph to a slot.   */
+  /*                        This field is mandatory!                       */
+  /*                                                                       */
+  /*    get_kerning      :: A function handle to return the unscaled       */
+  /*                        kerning for a given pair of glyphs.  Can be    */
+  /*                        set to 0 if the format doesn't support         */
+  /*                        kerning.                                       */
+  /*                                                                       */
+  /*    attach_file      :: This function handle is used to read           */
+  /*                        additional data for a face from another        */
+  /*                        file/stream.  For example, this can be used to */
+  /*                        add data from AFM or PFM files on a Type 1     */
+  /*                        face, or a CIDMap on a CID-keyed face.         */
+  /*                                                                       */
+  /*    get_advances     :: A function handle used to return advance       */
+  /*                        widths of `count' glyphs (in font units),      */
+  /*                        starting at `first'.  The `vertical' flag must */
+  /*                        be set to get vertical advance heights.  The   */
+  /*                        `advances' buffer is caller-allocated.         */
+  /*                        The idea of this function is to be able to     */
+  /*                        perform device-independent text layout without */
+  /*                        loading a single glyph image.                  */
+  /*                                                                       */
+  /*    request_size     :: A handle to a function used to request the new */
+  /*                        character size.  Can be set to 0 if the        */
+  /*                        scaling done in the base layer suffices.       */
+  /*                                                                       */
+  /*    select_size      :: A handle to a function used to select a new    */
+  /*                        fixed size.  It is used only if                */
+  /*                        @FT_FACE_FLAG_FIXED_SIZES is set.  Can be set  */
+  /*                        to 0 if the scaling done in the base layer     */
+  /*                        suffices.                                      */
+  /* <Note>                                                                */
+  /*    Most function pointers, with the exception of `load_glyph', can be */
+  /*    set to 0 to indicate a default behaviour.                          */
+  /*                                                                       */
+  typedef struct  FT_Driver_ClassRec_
+  {
+    FT_Module_Class          root;
+
+    FT_Long                  face_object_size;
+    FT_Long                  size_object_size;
+    FT_Long                  slot_object_size;
+
+    FT_Face_InitFunc         init_face;
+    FT_Face_DoneFunc         done_face;
+
+    FT_Size_InitFunc         init_size;
+    FT_Size_DoneFunc         done_size;
+
+    FT_Slot_InitFunc         init_slot;
+    FT_Slot_DoneFunc         done_slot;
+
+    FT_Slot_LoadFunc         load_glyph;
+
+    FT_Face_GetKerningFunc   get_kerning;
+    FT_Face_AttachFunc       attach_file;
+    FT_Face_GetAdvancesFunc  get_advances;
+
+    /* since version 2.2 */
+    FT_Size_RequestFunc      request_size;
+    FT_Size_SelectFunc       select_size;
+
+  } FT_Driver_ClassRec, *FT_Driver_Class;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DECLARE_DRIVER                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to create a forward declaration of an FT_Driver_ClassRec      */
+  /*    struct instance.                                                   */
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_DRIVER                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Driver_ClassRec struct.       */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function has to be */
+  /*    called with a pointer where the allocated structure is returned.   */
+  /*    And when it is no longer needed a `destroy' function needs to be   */
+  /*    called to release that allocation.                                 */
+  /*                                                                       */
+  /*    `fcinit.c' (ft_create_default_module_classes) already contains a   */
+  /*    mechanism to call these functions for the default modules          */
+  /*    described in `ftmodule.h'.                                         */
+  /*                                                                       */
+  /*    Notice that the created `create' and `destroy' functions call      */
+  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */
+  /*    initialize any additional global data, like a module specific      */
+  /*    interface, and put them in the global pic container defined in     */
+  /*    `ftpic.h'.  If you don't need them just implement the functions as */
+  /*    empty to resolve the link error.  Also the `pic_init' and          */
+  /*    `pic_free' functions should be declared in `pic.h', to be referred */
+  /*    by driver definition calling `FT_DEFINE_DRIVER' in following.      */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro is     */
+  /*    used).                                                             */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_DRIVER( class_ )  \
+  FT_CALLBACK_TABLE                  \
+  const FT_Driver_ClassRec  class_;
+
+#define FT_DEFINE_DRIVER(                    \
+          class_,                            \
+          flags_,                            \
+          size_,                             \
+          name_,                             \
+          version_,                          \
+          requires_,                         \
+          interface_,                        \
+          init_,                             \
+          done_,                             \
+          get_interface_,                    \
+          face_object_size_,                 \
+          size_object_size_,                 \
+          slot_object_size_,                 \
+          init_face_,                        \
+          done_face_,                        \
+          init_size_,                        \
+          done_size_,                        \
+          init_slot_,                        \
+          done_slot_,                        \
+          load_glyph_,                       \
+          get_kerning_,                      \
+          attach_file_,                      \
+          get_advances_,                     \
+          request_size_,                     \
+          select_size_ )                     \
+  FT_CALLBACK_TABLE_DEF                      \
+  const FT_Driver_ClassRec  class_ =         \
+  {                                          \
+    FT_DEFINE_ROOT_MODULE( flags_,           \
+                           size_,            \
+                           name_,            \
+                           version_,         \
+                           requires_,        \
+                           interface_,       \
+                           init_,            \
+                           done_,            \
+                           get_interface_ )  \
+                                             \
+    face_object_size_,                       \
+    size_object_size_,                       \
+    slot_object_size_,                       \
+                                             \
+    init_face_,                              \
+    done_face_,                              \
+                                             \
+    init_size_,                              \
+    done_size_,                              \
+                                             \
+    init_slot_,                              \
+    done_slot_,                              \
+                                             \
+    load_glyph_,                             \
+                                             \
+    get_kerning_,                            \
+    attach_file_,                            \
+    get_advances_,                           \
+                                             \
+    request_size_,                           \
+    select_size_                             \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_DRIVER( class_ )  FT_DECLARE_MODULE( class_ )
+
+#define FT_DEFINE_DRIVER(                                        \
+          class_,                                                \
+          flags_,                                                \
+          size_,                                                 \
+          name_,                                                 \
+          version_,                                              \
+          requires_,                                             \
+          interface_,                                            \
+          init_,                                                 \
+          done_,                                                 \
+          get_interface_,                                        \
+          face_object_size_,                                     \
+          size_object_size_,                                     \
+          slot_object_size_,                                     \
+          init_face_,                                            \
+          done_face_,                                            \
+          init_size_,                                            \
+          done_size_,                                            \
+          init_slot_,                                            \
+          done_slot_,                                            \
+          load_glyph_,                                           \
+          get_kerning_,                                          \
+          attach_file_,                                          \
+          get_advances_,                                         \
+          request_size_,                                         \
+          select_size_ )                                         \
+  void                                                           \
+  FT_Destroy_Class_ ## class_( FT_Library        library,        \
+                               FT_Module_Class*  clazz )         \
+  {                                                              \
+    FT_Memory        memory = library->memory;                   \
+    FT_Driver_Class  dclazz = (FT_Driver_Class)clazz;            \
+                                                                 \
+                                                                 \
+    class_ ## _pic_free( library );                              \
+    if ( dclazz )                                                \
+      FT_FREE( dclazz );                                         \
+  }                                                              \
+                                                                 \
+                                                                 \
+  FT_Error                                                       \
+  FT_Create_Class_ ## class_( FT_Library         library,        \
+                              FT_Module_Class**  output_class )  \
+  {                                                              \
+    FT_Driver_Class  clazz  = NULL;                              \
+    FT_Error         error;                                      \
+    FT_Memory        memory = library->memory;                   \
+                                                                 \
+                                                                 \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \
+      return error;                                              \
+                                                                 \
+    error = class_ ## _pic_init( library );                      \
+    if ( error )                                                 \
+    {                                                            \
+      FT_FREE( clazz );                                          \
+      return error;                                              \
+    }                                                            \
+                                                                 \
+    FT_DEFINE_ROOT_MODULE( flags_,                               \
+                           size_,                                \
+                           name_,                                \
+                           version_,                             \
+                           requires_,                            \
+                           interface_,                           \
+                           init_,                                \
+                           done_,                                \
+                           get_interface_ )                      \
+                                                                 \
+    clazz->face_object_size = face_object_size_;                 \
+    clazz->size_object_size = size_object_size_;                 \
+    clazz->slot_object_size = slot_object_size_;                 \
+                                                                 \
+    clazz->init_face        = init_face_;                        \
+    clazz->done_face        = done_face_;                        \
+                                                                 \
+    clazz->init_size        = init_size_;                        \
+    clazz->done_size        = done_size_;                        \
+                                                                 \
+    clazz->init_slot        = init_slot_;                        \
+    clazz->done_slot        = done_slot_;                        \
+                                                                 \
+    clazz->load_glyph       = load_glyph_;                       \
+                                                                 \
+    clazz->get_kerning      = get_kerning_;                      \
+    clazz->attach_file      = attach_file_;                      \
+    clazz->get_advances     = get_advances_;                     \
+                                                                 \
+    clazz->request_size     = request_size_;                     \
+    clazz->select_size      = select_size_;                      \
+                                                                 \
+    *output_class = (FT_Module_Class*)clazz;                     \
+                                                                 \
+    return FT_Err_Ok;                                            \
+  }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __FTDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftgloadr.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftgloadr.h
new file mode 100644
index 0000000..76e5a7e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftgloadr.h
@@ -0,0 +1,168 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgloadr.h                                                             */
+/*                                                                         */
+/*    The FreeType glyph loader (specification).                           */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2005, 2006 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTGLOADR_H__
+#define __FTGLOADR_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_GlyphLoader                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The glyph loader is an internal object used to load several glyphs */
+  /*    together (for example, in the case of composites).                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The glyph loader implementation is not part of the high-level API, */
+  /*    hence the forward structure declaration.                           */
+  /*                                                                       */
+  typedef struct FT_GlyphLoaderRec_*  FT_GlyphLoader ;
+
+
+#if 0  /* moved to freetype.h in version 2.2 */
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2
+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4
+#define FT_SUBGLYPH_FLAG_SCALE                   8
+#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40
+#define FT_SUBGLYPH_FLAG_2X2                  0x80
+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200
+#endif
+
+
+  typedef struct  FT_SubGlyphRec_
+  {
+    FT_Int     index;
+    FT_UShort  flags;
+    FT_Int     arg1;
+    FT_Int     arg2;
+    FT_Matrix  transform;
+
+  } FT_SubGlyphRec;
+
+
+  typedef struct  FT_GlyphLoadRec_
+  {
+    FT_Outline   outline;       /* outline                   */
+    FT_Vector*   extra_points;  /* extra points table        */
+    FT_Vector*   extra_points2; /* second extra points table */
+    FT_UInt      num_subglyphs; /* number of subglyphs       */
+    FT_SubGlyph  subglyphs;     /* subglyphs                 */
+
+  } FT_GlyphLoadRec, *FT_GlyphLoad;
+
+
+  typedef struct  FT_GlyphLoaderRec_
+  {
+    FT_Memory        memory;
+    FT_UInt          max_points;
+    FT_UInt          max_contours;
+    FT_UInt          max_subglyphs;
+    FT_Bool          use_extra;
+
+    FT_GlyphLoadRec  base;
+    FT_GlyphLoadRec  current;
+
+    void*            other;            /* for possible future extension? */
+
+  } FT_GlyphLoaderRec;
+
+
+  /* create new empty glyph loader */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_New( FT_Memory        memory,
+                      FT_GlyphLoader  *aloader );
+
+  /* add an extra points table to a glyph loader */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader );
+
+  /* destroy a glyph loader */
+  FT_BASE( void )
+  FT_GlyphLoader_Done( FT_GlyphLoader  loader );
+
+  /* reset a glyph loader (frees everything int it) */
+  FT_BASE( void )
+  FT_GlyphLoader_Reset( FT_GlyphLoader  loader );
+
+  /* rewind a glyph loader */
+  FT_BASE( void )
+  FT_GlyphLoader_Rewind( FT_GlyphLoader  loader );
+
+  /* check that there is enough space to add `n_points' and `n_contours' */
+  /* to the glyph loader                                                 */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,
+                              FT_UInt         n_points,
+                              FT_UInt         n_contours );
+
+
+#define FT_GLYPHLOADER_CHECK_P( _loader, _count )                         \
+   ( (_count) == 0 || ((_loader)->base.outline.n_points    +              \
+                       (_loader)->current.outline.n_points +              \
+                       (unsigned long)(_count)) <= (_loader)->max_points )
+
+#define FT_GLYPHLOADER_CHECK_C( _loader, _count )                          \
+  ( (_count) == 0 || ((_loader)->base.outline.n_contours    +              \
+                      (_loader)->current.outline.n_contours +              \
+                      (unsigned long)(_count)) <= (_loader)->max_contours )
+
+#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours )      \
+  ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points )   &&                  \
+      FT_GLYPHLOADER_CHECK_C( _loader, _contours ) )                   \
+    ? 0                                                                \
+    : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) )
+
+
+  /* check that there is enough space to add `n_subs' sub-glyphs to */
+  /* a glyph loader                                                 */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,
+                                 FT_UInt         n_subs );
+
+  /* prepare a glyph loader, i.e. empty the current glyph */
+  FT_BASE( void )
+  FT_GlyphLoader_Prepare( FT_GlyphLoader  loader );
+
+  /* add the current glyph to the base glyph */
+  FT_BASE( void )
+  FT_GlyphLoader_Add( FT_GlyphLoader  loader );
+
+  /* copy points from one glyph loader to another */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_CopyPoints( FT_GlyphLoader  target,
+                             FT_GlyphLoader  source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGLOADR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftmemory.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftmemory.h
new file mode 100644
index 0000000..432a9ba
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftmemory.h
@@ -0,0 +1,459 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmemory.h                                                             */
+/*                                                                         */
+/*    The FreeType memory management macros (specification).               */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004-2007, 2010, 2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTMEMORY_H__
+#define __FTMEMORY_H__
+
+
+#include "../../ft2build.h"
+#include "../config/ftconfig.h"
+#include "../fttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_SET_ERROR                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro is used to set an implicit `error' variable to a given  */
+  /*    expression's value (usually a function call), and convert it to a  */
+  /*    boolean which is set whenever the value is != 0.                   */
+  /*                                                                       */
+#undef  FT_SET_ERROR
+#define FT_SET_ERROR( expression ) \
+          ( ( error = (expression) ) != 0 )
+
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                           M E M O R Y                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*
+   *  C++ refuses to handle statements like p = (void*)anything, with `p' a
+   *  typed pointer.  Since we don't have a `typeof' operator in standard
+   *  C++, we have to use a template to emulate it.
+   */
+
+#ifdef __cplusplus
+
+  extern "C++"
+  template <typename T> inline T*
+  cplusplus_typeof(        T*,
+                    void  *v )
+  {
+    return static_cast <T*> ( v );
+  }
+
+#define FT_ASSIGNP( p, val )  (p) = cplusplus_typeof( (p), (val) )
+
+#else
+
+#define FT_ASSIGNP( p, val )  (p) = (val)
+
+#endif
+
+
+
+#ifdef FT_DEBUG_MEMORY
+
+  FT_BASE( const char* )  _ft_debug_file;
+  FT_BASE( long )         _ft_debug_lineno;
+
+#define FT_DEBUG_INNER( exp )  ( _ft_debug_file   = __FILE__, \
+                                 _ft_debug_lineno = __LINE__, \
+                                 (exp) )
+
+#define FT_ASSIGNP_INNER( p, exp )  ( _ft_debug_file   = __FILE__, \
+                                      _ft_debug_lineno = __LINE__, \
+                                      FT_ASSIGNP( p, exp ) )
+
+#else /* !FT_DEBUG_MEMORY */
+
+#define FT_DEBUG_INNER( exp )       (exp)
+#define FT_ASSIGNP_INNER( p, exp )  FT_ASSIGNP( p, exp )
+
+#endif /* !FT_DEBUG_MEMORY */
+
+
+  /*
+   *  The allocation functions return a pointer, and the error code
+   *  is written to through the `p_error' parameter.  See below for
+   *  for documentation.
+   */
+
+  FT_BASE( FT_Pointer )
+  ft_mem_alloc( FT_Memory  memory,
+                FT_Long    size,
+                FT_Error  *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_qalloc( FT_Memory  memory,
+                 FT_Long    size,
+                 FT_Error  *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_realloc( FT_Memory  memory,
+                  FT_Long    item_size,
+                  FT_Long    cur_count,
+                  FT_Long    new_count,
+                  void*      block,
+                  FT_Error  *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_qrealloc( FT_Memory  memory,
+                   FT_Long    item_size,
+                   FT_Long    cur_count,
+                   FT_Long    new_count,
+                   void*      block,
+                   FT_Error  *p_error );
+#ifdef _DEBUG
+//#define _XYQ_MEM_DEBUG
+#endif
+  
+#ifdef _XYQ_MEM_DEBUG		/* XYQ */
+  FT_BASE( FT_Pointer )
+	  ft_mem_allocdebug( FT_Memory  memory,
+	  FT_Long    size, const char* filename, int line,
+	  FT_Error  *p_error );
+  
+  FT_BASE( FT_Pointer )
+	  ft_mem_qallocdebug( FT_Memory  memory,
+	  FT_Long    size, const char* filename, int line,
+	  FT_Error  *p_error );
+  
+  FT_BASE( FT_Pointer )
+	  ft_mem_reallocdebug( FT_Memory  memory,
+	  FT_Long    item_size,
+	  FT_Long    cur_count,
+	  FT_Long    new_count,
+	  void*      block, const char* filename, int line,
+	  FT_Error  *p_error );
+  
+  FT_BASE( FT_Pointer )
+	  ft_mem_qreallocdebug( FT_Memory  memory,
+	  FT_Long    item_size,
+	  FT_Long    cur_count,
+	  FT_Long    new_count,
+	  void*      block, const char* filename, int line,
+	  FT_Error  *p_error );
+#endif
+
+
+  FT_BASE( void )
+  ft_mem_free( FT_Memory    memory,
+               const void*  P );
+
+
+#define FT_MEM_FREE( ptr )                \
+          FT_BEGIN_STMNT                  \
+            ft_mem_free( memory, (ptr) ); \
+            (ptr) = NULL;                 \
+          FT_END_STMNT
+#ifndef _XYQ_MEM_DEBUG
+#define FT_MEM_ALLOC( ptr, size )                                         \
+		  FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) )
+
+
+#define FT_MEM_REALLOC( ptr, cursz, newsz )                        \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,           \
+                                                 1,                \
+                                                 (FT_Long)(cursz), \
+                                                 (FT_Long)(newsz), \
+                                                 (ptr),            \
+                                                 &error ) )
+
+#define FT_MEM_QALLOC( ptr, size )                               \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory,          \
+                                                (FT_Long)(size), \
+                                                &error ) )
+
+#define FT_MEM_QREALLOC( ptr, cursz, newsz )                        \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,           \
+                                                  1,                \
+                                                  (FT_Long)(cursz), \
+                                                  (FT_Long)(newsz), \
+                                                  (ptr),            \
+                                                  &error ) )
+
+#define FT_MEM_ALLOC_MULT( ptr, count, item_size )                     \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,               \
+                                                 (FT_Long)(item_size), \
+                                                 0,                    \
+                                                 (FT_Long)(count),     \
+                                                 NULL,                 \
+                                                 &error ) )
+
+#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )           \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,            \
+                                                 (FT_Long)(itmsz),  \
+                                                 (FT_Long)(oldcnt), \
+                                                 (FT_Long)(newcnt), \
+                                                 (ptr),             \
+                                                 &error ) )
+
+#define FT_MEM_QALLOC_MULT( ptr, count, item_size )                     \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,               \
+                                                  (FT_Long)(item_size), \
+                                                  0,                    \
+                                                  (FT_Long)(count),     \
+                                                  NULL,                 \
+                                                  &error ) )
+
+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz)            \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,            \
+                                                  (FT_Long)(itmsz),  \
+                                                  (FT_Long)(oldcnt), \
+                                                  (FT_Long)(newcnt), \
+                                                  (ptr),             \
+                                                  &error ) )
+#define FT_MEM_NEW_ARRAY( ptr, count )                                      \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \
+                                                 0, (count),                \
+                                                 NULL, &error ) )
+
+#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz )                             \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \
+                                                 (cursz), (newsz),          \
+                                                 (ptr), &error ) )
+
+#define FT_MEM_QNEW_ARRAY( ptr, count )                                      \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \
+                                                  0, (count),                \
+                                                  NULL, &error ) )
+
+#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                             \
+	FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \
+	(cursz), (newsz),          \
+  (ptr), &error ) )
+  
+#else
+#define FT_MEM_ALLOC( ptr, size )                                         \
+  FT_ASSIGNP_INNER( ptr, ft_mem_allocdebug( memory, (size), __FILE__, __LINE__, &error ) )
+  
+#define FT_MEM_REALLOC( ptr, cursz, newsz )                        \
+	FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, 1,        \
+                                                  (cursz), (newsz),          \
+                                                 (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QALLOC( ptr, size )                                         \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qallocdebug( memory, (size), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QREALLOC( ptr, cursz, newsz )                         \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, 1,        \
+                                                  (cursz), (newsz), \
+                                                  (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_ALLOC_MULT( ptr, count, item_size )                    \
+          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (item_size), \
+                                                 0, (count),          \
+                                                 NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )            \
+          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (itmsz),    \
+                                                 (oldcnt), (newcnt), \
+                                                 (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QALLOC_MULT( ptr, count, item_size )                    \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (item_size), \
+                                                  0, (count),          \
+                                                  NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz)             \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (itmsz),    \
+                                                  (oldcnt), (newcnt), \
+                                                  (ptr), __FILE__, __LINE__, &error ) )
+  /*************************************************************************/
+  /*                                                                       */
+  /* The following functions macros expect that their pointer argument is  */
+  /* _typed_ in order to automatically compute array element sizes.        */
+  /*                                                                       */
+
+#define FT_MEM_NEW_ARRAY( ptr, count )                                      \
+          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \
+                                                 0, (count),                \
+                                                 NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz )                             \
+          FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \
+                                                 (cursz), (newsz),          \
+                                                 (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QNEW_ARRAY( ptr, count )                                      \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \
+                                                  0, (count),                \
+                                                  NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                             \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \
+                                                  (cursz), (newsz),          \
+                                                  (ptr), __FILE__, __LINE__, &error ) )
+
+#endif
+
+#define FT_MEM_NEW( ptr )                        \
+          FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) )
+
+#define FT_MEM_QNEW( ptr )                        \
+          FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) )
+
+#define FT_MEM_SET_ERROR( cond )  ( (cond), error != 0 )
+
+
+#define FT_MEM_SET( dest, byte, count )     ft_memset( dest, byte, count )
+
+#define FT_MEM_COPY( dest, source, count )  ft_memcpy( dest, source, count )
+
+#define FT_MEM_MOVE( dest, source, count )  ft_memmove( dest, source, count )
+
+
+#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )
+
+#define FT_ZERO( p )                FT_MEM_ZERO( p, sizeof ( *(p) ) )
+
+
+#define FT_ARRAY_ZERO( dest, count )                        \
+          FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) )
+
+#define FT_ARRAY_COPY( dest, source, count )                        \
+          FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) )
+
+#define FT_ARRAY_MOVE( dest, source, count )                        \
+          FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) )
+
+
+  /*
+   *  Return the maximum number of addressable elements in an array.
+   *  We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid
+   *  any problems.
+   */
+#define FT_ARRAY_MAX( ptr )           ( FT_INT_MAX / sizeof ( *(ptr) ) )
+
+#define FT_ARRAY_CHECK( ptr, count )  ( (count) <= FT_ARRAY_MAX( ptr ) )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The following functions macros expect that their pointer argument is  */
+  /* _typed_ in order to automatically compute array element sizes.        */
+  /*                                                                       */
+
+#define FT_ALLOC( ptr, size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) )
+
+#define FT_REALLOC( ptr, cursz, newsz )                           \
+          FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) )
+
+#define FT_ALLOC_MULT( ptr, count, item_size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) )
+
+#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \
+          FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt,      \
+                                                 newcnt, itmsz ) )
+
+#define FT_QALLOC( ptr, size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) )
+
+#define FT_QREALLOC( ptr, cursz, newsz )                           \
+          FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) )
+
+#define FT_QALLOC_MULT( ptr, count, item_size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) )
+
+#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \
+          FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt,      \
+                                                  newcnt, itmsz ) )
+
+#define FT_FREE( ptr )  FT_MEM_FREE( ptr )
+
+#define FT_NEW( ptr )  FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) )
+
+#define FT_NEW_ARRAY( ptr, count )                           \
+          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
+
+#define FT_RENEW_ARRAY( ptr, curcnt, newcnt )                           \
+          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+#define FT_QNEW( ptr )                           \
+          FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) )
+
+#define FT_QNEW_ARRAY( ptr, count )                          \
+          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
+
+#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt )                          \
+          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+
+  FT_BASE( FT_Pointer )
+  ft_mem_strdup( FT_Memory    memory,
+                 const char*  str,
+                 FT_Error    *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_dup( FT_Memory    memory,
+              const void*  address,
+              FT_ULong     size,
+              FT_Error    *p_error );
+
+
+#define FT_MEM_STRDUP( dst, str )                                            \
+          (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error )
+
+#define FT_STRDUP( dst, str )                           \
+          FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) )
+
+#define FT_MEM_DUP( dst, address, size )                                    \
+          (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )
+
+#define FT_DUP( dst, address, size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) )
+
+
+  /* Return >= 1 if a truncation occurs.            */
+  /* Return 0 if the source string fits the buffer. */
+  /* This is *not* the same as strlcpy().           */
+  FT_BASE( FT_Int )
+  ft_mem_strcpyn( char*        dst,
+                  const char*  src,
+                  FT_ULong     size );
+
+#define FT_STRCPYN( dst, src, size )                                         \
+          ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) )
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMEMORY_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h
new file mode 100644
index 0000000..d6f7de3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h
@@ -0,0 +1,1569 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftobjs.h                                                               */
+/*                                                                         */
+/*    The FreeType private base classes (specification).                   */
+/*                                                                         */
+/*  Copyright 1996-2006, 2008, 2010, 2012-2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  This file contains the definition of all internal FreeType classes.  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTOBJS_H__
+#define __FTOBJS_H__
+
+#include "../../ft2build.h"
+#include "../ftrender.h"
+#include "../ftsizes.h"
+#include "../ftlcdfil.h"
+#include "ftmemory.h"
+#include "ftgloadr.h"
+#include "ftdriver.h"
+#include "autohint.h"
+#include "ftserv.h"
+#include "ftpic.h"
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+#include "../ftincrem.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Some generic definitions.                                             */
+  /*                                                                       */
+#ifndef TRUE
+#define TRUE  1
+#endif
+
+#ifndef FALSE
+#define FALSE  0
+#endif
+
+#ifndef NULL
+#define NULL  (void*)0
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The min and max functions missing in C.  As usual, be careful not to  */
+  /* write things like FT_MIN( a++, b++ ) to avoid side effects.           */
+  /*                                                                       */
+#define FT_MIN( a, b )  ( (a) < (b) ? (a) : (b) )
+#define FT_MAX( a, b )  ( (a) > (b) ? (a) : (b) )
+
+#define FT_ABS( a )     ( (a) < 0 ? -(a) : (a) )
+
+
+#define FT_PAD_FLOOR( x, n )  ( (x) & ~((n)-1) )
+#define FT_PAD_ROUND( x, n )  FT_PAD_FLOOR( (x) + ((n)/2), n )
+#define FT_PAD_CEIL( x, n )   FT_PAD_FLOOR( (x) + ((n)-1), n )
+
+#define FT_PIX_FLOOR( x )     ( (x) & ~63 )
+#define FT_PIX_ROUND( x )     FT_PIX_FLOOR( (x) + 32 )
+#define FT_PIX_CEIL( x )      FT_PIX_FLOOR( (x) + 63 )
+
+
+  /*
+   *  Return the highest power of 2 that is <= value; this correspond to
+   *  the highest bit in a given 32-bit value.
+   */
+  FT_BASE( FT_UInt32 )
+  ft_highpow2( FT_UInt32  value );
+
+
+  /*
+   *  character classification functions -- since these are used to parse
+   *  font files, we must not use those in <ctypes.h> which are
+   *  locale-dependent
+   */
+#define  ft_isdigit( x )   ( ( (unsigned)(x) - '0' ) < 10U )
+
+#define  ft_isxdigit( x )  ( ( (unsigned)(x) - '0' ) < 10U || \
+                             ( (unsigned)(x) - 'a' ) < 6U  || \
+                             ( (unsigned)(x) - 'A' ) < 6U  )
+
+  /* the next two macros assume ASCII representation */
+#define  ft_isupper( x )  ( ( (unsigned)(x) - 'A' ) < 26U )
+#define  ft_islower( x )  ( ( (unsigned)(x) - 'a' ) < 26U )
+
+#define  ft_isalpha( x )  ( ft_isupper( x ) || ft_islower( x ) )
+#define  ft_isalnum( x )  ( ft_isdigit( x ) || ft_isalpha( x ) )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                       C H A R M A P S                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* handle to internal charmap object */
+  typedef struct FT_CMapRec_*              FT_CMap;
+
+  /* handle to charmap class structure */
+  typedef const struct FT_CMap_ClassRec_*  FT_CMap_Class;
+
+  /* internal charmap object structure */
+  typedef struct  FT_CMapRec_
+  {
+    FT_CharMapRec  charmap;
+    FT_CMap_Class  clazz;
+
+  } FT_CMapRec;
+
+  /* typecase any pointer to a charmap handle */
+#define FT_CMAP( x )              ((FT_CMap)( x ))
+
+  /* obvious macros */
+#define FT_CMAP_PLATFORM_ID( x )  FT_CMAP( x )->charmap.platform_id
+#define FT_CMAP_ENCODING_ID( x )  FT_CMAP( x )->charmap.encoding_id
+#define FT_CMAP_ENCODING( x )     FT_CMAP( x )->charmap.encoding
+#define FT_CMAP_FACE( x )         FT_CMAP( x )->charmap.face
+
+
+  /* class method definitions */
+  typedef FT_Error
+  (*FT_CMap_InitFunc)( FT_CMap     cmap,
+                       FT_Pointer  init_data );
+
+  typedef void
+  (*FT_CMap_DoneFunc)( FT_CMap  cmap );
+
+  typedef FT_UInt
+  (*FT_CMap_CharIndexFunc)( FT_CMap    cmap,
+                            FT_UInt32  char_code );
+
+  typedef FT_UInt
+  (*FT_CMap_CharNextFunc)( FT_CMap     cmap,
+                           FT_UInt32  *achar_code );
+
+  typedef FT_UInt
+  (*FT_CMap_CharVarIndexFunc)( FT_CMap    cmap,
+                               FT_CMap    unicode_cmap,
+                               FT_UInt32  char_code,
+                               FT_UInt32  variant_selector );
+
+  typedef FT_Bool
+  (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap    cmap,
+                                   FT_UInt32  char_code,
+                                   FT_UInt32  variant_selector );
+
+  typedef FT_UInt32 *
+  (*FT_CMap_VariantListFunc)( FT_CMap    cmap,
+                              FT_Memory  mem );
+
+  typedef FT_UInt32 *
+  (*FT_CMap_CharVariantListFunc)( FT_CMap    cmap,
+                                  FT_Memory  mem,
+                                  FT_UInt32  char_code );
+
+  typedef FT_UInt32 *
+  (*FT_CMap_VariantCharListFunc)( FT_CMap    cmap,
+                                  FT_Memory  mem,
+                                  FT_UInt32  variant_selector );
+
+
+  typedef struct  FT_CMap_ClassRec_
+  {
+    FT_ULong               size;
+    FT_CMap_InitFunc       init;
+    FT_CMap_DoneFunc       done;
+    FT_CMap_CharIndexFunc  char_index;
+    FT_CMap_CharNextFunc   char_next;
+
+    /* Subsequent entries are special ones for format 14 -- the variant */
+    /* selector subtable which behaves like no other                    */
+
+    FT_CMap_CharVarIndexFunc      char_var_index;
+    FT_CMap_CharVarIsDefaultFunc  char_var_default;
+    FT_CMap_VariantListFunc       variant_list;
+    FT_CMap_CharVariantListFunc   charvariant_list;
+    FT_CMap_VariantCharListFunc   variantchar_list;
+
+  } FT_CMap_ClassRec;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_CMAP_CLASS( class_ )              \
+  FT_CALLBACK_TABLE const  FT_CMap_ClassRec class_;
+
+#define FT_DEFINE_CMAP_CLASS(       \
+          class_,                   \
+          size_,                    \
+          init_,                    \
+          done_,                    \
+          char_index_,              \
+          char_next_,               \
+          char_var_index_,          \
+          char_var_default_,        \
+          variant_list_,            \
+          charvariant_list_,        \
+          variantchar_list_ )       \
+  FT_CALLBACK_TABLE_DEF             \
+  const FT_CMap_ClassRec  class_ =  \
+  {                                 \
+    size_,                          \
+    init_,                          \
+    done_,                          \
+    char_index_,                    \
+    char_next_,                     \
+    char_var_index_,                \
+    char_var_default_,              \
+    variant_list_,                  \
+    charvariant_list_,              \
+    variantchar_list_               \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_CMAP_CLASS( class_ )                  \
+  void                                                   \
+  FT_Init_Class_ ## class_( FT_Library         library,  \
+                            FT_CMap_ClassRec*  clazz );
+
+#define FT_DEFINE_CMAP_CLASS(                            \
+          class_,                                        \
+          size_,                                         \
+          init_,                                         \
+          done_,                                         \
+          char_index_,                                   \
+          char_next_,                                    \
+          char_var_index_,                               \
+          char_var_default_,                             \
+          variant_list_,                                 \
+          charvariant_list_,                             \
+          variantchar_list_ )                            \
+  void                                                   \
+  FT_Init_Class_ ## class_( FT_Library         library,  \
+                            FT_CMap_ClassRec*  clazz )   \
+  {                                                      \
+    FT_UNUSED( library );                                \
+                                                         \
+    clazz->size             = size_;                     \
+    clazz->init             = init_;                     \
+    clazz->done             = done_;                     \
+    clazz->char_index       = char_index_;               \
+    clazz->char_next        = char_next_;                \
+    clazz->char_var_index   = char_var_index_;           \
+    clazz->char_var_default = char_var_default_;         \
+    clazz->variant_list     = variant_list_;             \
+    clazz->charvariant_list = charvariant_list_;         \
+    clazz->variantchar_list = variantchar_list_;         \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /* create a new charmap and add it to charmap->face */
+  FT_BASE( FT_Error )
+  FT_CMap_New( FT_CMap_Class  clazz,
+               FT_Pointer     init_data,
+               FT_CharMap     charmap,
+               FT_CMap       *acmap );
+
+  /* destroy a charmap and remove it from face's list */
+  FT_BASE( void )
+  FT_CMap_Done( FT_CMap  cmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Face_InternalRec                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure contains the internal fields of each FT_Face        */
+  /*    object.  These fields may change between different releases of     */
+  /*    FreeType.                                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    max_points ::                                                      */
+  /*      The maximum number of points used to store the vectorial outline */
+  /*      of any glyph in this face.  If this value cannot be known in     */
+  /*      advance, or if the face isn't scalable, this should be set to 0. */
+  /*      Only relevant for scalable formats.                              */
+  /*                                                                       */
+  /*    max_contours ::                                                    */
+  /*      The maximum number of contours used to store the vectorial       */
+  /*      outline of any glyph in this face.  If this value cannot be      */
+  /*      known in advance, or if the face isn't scalable, this should be  */
+  /*      set to 0.  Only relevant for scalable formats.                   */
+  /*                                                                       */
+  /*    transform_matrix ::                                                */
+  /*      A 2x2 matrix of 16.16 coefficients used to transform glyph       */
+  /*      outlines after they are loaded from the font.  Only used by the  */
+  /*      convenience functions.                                           */
+  /*                                                                       */
+  /*    transform_delta ::                                                 */
+  /*      A translation vector used to transform glyph outlines after they */
+  /*      are loaded from the font.  Only used by the convenience          */
+  /*      functions.                                                       */
+  /*                                                                       */
+  /*    transform_flags ::                                                 */
+  /*      Some flags used to classify the transform.  Only used by the     */
+  /*      convenience functions.                                           */
+  /*                                                                       */
+  /*    services ::                                                        */
+  /*      A cache for frequently used services.  It should be only         */
+  /*      accessed with the macro `FT_FACE_LOOKUP_SERVICE'.                */
+  /*                                                                       */
+  /*    incremental_interface ::                                           */
+  /*      If non-null, the interface through which glyph data and metrics  */
+  /*      are loaded incrementally for faces that do not provide all of    */
+  /*      this data when first opened.  This field exists only if          */
+  /*      @FT_CONFIG_OPTION_INCREMENTAL is defined.                        */
+  /*                                                                       */
+  /*    ignore_unpatented_hinter ::                                        */
+  /*      This boolean flag instructs the glyph loader to ignore the       */
+  /*      native font hinter, if one is found.  This is exclusively used   */
+  /*      in the case when the unpatented hinter is compiled within the    */
+  /*      library.                                                         */
+  /*                                                                       */
+  /*    refcount ::                                                        */
+  /*      A counter initialized to~1 at the time an @FT_Face structure is  */
+  /*      created.  @FT_Reference_Face increments this counter, and        */
+  /*      @FT_Done_Face only destroys a face if the counter is~1,          */
+  /*      otherwise it simply decrements it.                               */
+  /*                                                                       */
+  typedef struct  FT_Face_InternalRec_
+  {
+    FT_Matrix           transform_matrix;
+    FT_Vector           transform_delta;
+    FT_Int              transform_flags;
+
+    FT_ServiceCacheRec  services;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_Incremental_InterfaceRec*  incremental_interface;
+#endif
+
+    FT_Bool             ignore_unpatented_hinter;
+    FT_Int              refcount;
+
+  } FT_Face_InternalRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Slot_InternalRec                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure contains the internal fields of each FT_GlyphSlot   */
+  /*    object.  These fields may change between different releases of     */
+  /*    FreeType.                                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    loader            :: The glyph loader object used to load outlines */
+  /*                         into the glyph slot.                          */
+  /*                                                                       */
+  /*    flags             :: Possible values are zero or                   */
+  /*                         FT_GLYPH_OWN_BITMAP.  The latter indicates    */
+  /*                         that the FT_GlyphSlot structure owns the      */
+  /*                         bitmap buffer.                                */
+  /*                                                                       */
+  /*    glyph_transformed :: Boolean.  Set to TRUE when the loaded glyph   */
+  /*                         must be transformed through a specific        */
+  /*                         font transformation.  This is _not_ the same  */
+  /*                         as the face transform set through             */
+  /*                         FT_Set_Transform().                           */
+  /*                                                                       */
+  /*    glyph_matrix      :: The 2x2 matrix corresponding to the glyph     */
+  /*                         transformation, if necessary.                 */
+  /*                                                                       */
+  /*    glyph_delta       :: The 2d translation vector corresponding to    */
+  /*                         the glyph transformation, if necessary.       */
+  /*                                                                       */
+  /*    glyph_hints       :: Format-specific glyph hints management.       */
+  /*                                                                       */
+
+#define FT_GLYPH_OWN_BITMAP  0x1
+
+  typedef struct  FT_Slot_InternalRec_
+  {
+    FT_GlyphLoader  loader;
+    FT_UInt         flags;
+    FT_Bool         glyph_transformed;
+    FT_Matrix       glyph_matrix;
+    FT_Vector       glyph_delta;
+    void*           glyph_hints;
+
+  } FT_GlyphSlot_InternalRec;
+
+
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Size_InternalRec                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure contains the internal fields of each FT_Size        */
+  /*    object.  Currently, it's empty.                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+  typedef struct  FT_Size_InternalRec_
+  {
+    /* empty */
+
+  } FT_Size_InternalRec;
+
+#endif
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                         M O D U L E S                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_ModuleRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A module object instance.                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    clazz   :: A pointer to the module's class.                        */
+  /*                                                                       */
+  /*    library :: A handle to the parent library object.                  */
+  /*                                                                       */
+  /*    memory  :: A handle to the memory manager.                         */
+  /*                                                                       */
+  typedef struct  FT_ModuleRec_
+  {
+    FT_Module_Class*  clazz;
+    FT_Library        library;
+    FT_Memory         memory;
+
+  } FT_ModuleRec;
+
+
+  /* typecast an object to an FT_Module */
+#define FT_MODULE( x )          ((FT_Module)( x ))
+#define FT_MODULE_CLASS( x )    FT_MODULE( x )->clazz
+#define FT_MODULE_LIBRARY( x )  FT_MODULE( x )->library
+#define FT_MODULE_MEMORY( x )   FT_MODULE( x )->memory
+
+
+#define FT_MODULE_IS_DRIVER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                    FT_MODULE_FONT_DRIVER )
+
+#define FT_MODULE_IS_RENDERER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                      FT_MODULE_RENDERER )
+
+#define FT_MODULE_IS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                    FT_MODULE_HINTER )
+
+#define FT_MODULE_IS_STYLER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                    FT_MODULE_STYLER )
+
+#define FT_DRIVER_IS_SCALABLE( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                      FT_MODULE_DRIVER_SCALABLE )
+
+#define FT_DRIVER_USES_OUTLINES( x )  !( FT_MODULE_CLASS( x )->module_flags & \
+                                         FT_MODULE_DRIVER_NO_OUTLINES )
+
+#define FT_DRIVER_HAS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                     FT_MODULE_DRIVER_HAS_HINTER )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Module_Interface                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finds a module and returns its specific interface as a typeless    */
+  /*    pointer.                                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library     :: A handle to the library object.                     */
+  /*                                                                       */
+  /*    module_name :: The module's name (as an ASCII string).             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A module-specific interface if available, 0 otherwise.             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You should better be familiar with FreeType internals to know      */
+  /*    which module to look for, and what its interface is :-)            */
+  /*                                                                       */
+  FT_BASE( const void* )
+  FT_Get_Module_Interface( FT_Library   library,
+                           const char*  mod_name );
+
+  FT_BASE( FT_Pointer )
+  ft_module_get_service( FT_Module    module,
+                         const char*  service_id );
+
+  /* */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****   F A C E,   S I Z E   &   G L Y P H   S L O T   O B J E C T S  ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* a few macros used to perform easy typecasts with minimal brain damage */
+
+#define FT_FACE( x )          ((FT_Face)(x))
+#define FT_SIZE( x )          ((FT_Size)(x))
+#define FT_SLOT( x )          ((FT_GlyphSlot)(x))
+
+#define FT_FACE_DRIVER( x )   FT_FACE( x )->driver
+#define FT_FACE_LIBRARY( x )  FT_FACE_DRIVER( x )->root.library
+#define FT_FACE_MEMORY( x )   FT_FACE( x )->memory
+#define FT_FACE_STREAM( x )   FT_FACE( x )->stream
+
+#define FT_SIZE_FACE( x )     FT_SIZE( x )->face
+#define FT_SLOT_FACE( x )     FT_SLOT( x )->face
+
+#define FT_FACE_SLOT( x )     FT_FACE( x )->glyph
+#define FT_FACE_SIZE( x )     FT_FACE( x )->size
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_GlyphSlot                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    It is sometimes useful to have more than one glyph slot for a      */
+  /*    given face object.  This function is used to create additional     */
+  /*    slots.  All of them are automatically discarded when the face is   */
+  /*    destroyed.                                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face  :: A handle to a parent face object.                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aslot :: A handle to a new glyph slot object.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_BASE( FT_Error )
+  FT_New_GlyphSlot( FT_Face        face,
+                    FT_GlyphSlot  *aslot );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_GlyphSlot                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroys a given glyph slot.  Remember however that all slots are  */
+  /*    automatically destroyed with its parent.  Using this function is   */
+  /*    not always mandatory.                                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot :: A handle to a target glyph slot.                           */
+  /*                                                                       */
+  FT_BASE( void )
+  FT_Done_GlyphSlot( FT_GlyphSlot  slot );
+
+ /* */
+
+#define FT_REQUEST_WIDTH( req )                                            \
+          ( (req)->horiResolution                                          \
+              ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \
+              : (req)->width )
+
+#define FT_REQUEST_HEIGHT( req )                                            \
+          ( (req)->vertResolution                                           \
+              ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \
+              : (req)->height )
+
+
+  /* Set the metrics according to a bitmap strike. */
+  FT_BASE( void )
+  FT_Select_Metrics( FT_Face   face,
+                     FT_ULong  strike_index );
+
+
+  /* Set the metrics according to a size request. */
+  FT_BASE( void )
+  FT_Request_Metrics( FT_Face          face,
+                      FT_Size_Request  req );
+
+
+  /* Match a size request against `available_sizes'. */
+  FT_BASE( FT_Error )
+  FT_Match_Size( FT_Face          face,
+                 FT_Size_Request  req,
+                 FT_Bool          ignore_width,
+                 FT_ULong*        size_index );
+
+
+  /* Use the horizontal metrics to synthesize the vertical metrics. */
+  /* If `advance' is zero, it is also synthesized.                  */
+  FT_BASE( void )
+  ft_synthesize_vertical_metrics( FT_Glyph_Metrics*  metrics,
+                                  FT_Pos             advance );
+
+
+  /* Free the bitmap of a given glyphslot when needed (i.e., only when it */
+  /* was allocated with ft_glyphslot_alloc_bitmap).                       */
+  FT_BASE( void )
+  ft_glyphslot_free_bitmap( FT_GlyphSlot  slot );
+
+
+  /* Allocate a new bitmap buffer in a glyph slot. */
+  FT_BASE( FT_Error )
+  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,
+                             FT_ULong      size );
+
+
+  /* Set the bitmap buffer in a glyph slot to a given pointer.  The buffer */
+  /* will not be freed by a later call to ft_glyphslot_free_bitmap.        */
+  FT_BASE( void )
+  ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,
+                           FT_Byte*      buffer );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                        R E N D E R E R S                        ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#define FT_RENDERER( x )      ((FT_Renderer)( x ))
+#define FT_GLYPH( x )         ((FT_Glyph)( x ))
+#define FT_BITMAP_GLYPH( x )  ((FT_BitmapGlyph)( x ))
+#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x ))
+
+
+  typedef struct  FT_RendererRec_
+  {
+    FT_ModuleRec            root;
+    FT_Renderer_Class*      clazz;
+    FT_Glyph_Format         glyph_format;
+    FT_Glyph_Class          glyph_class;
+
+    FT_Raster               raster;
+    FT_Raster_Render_Func   raster_render;
+    FT_Renderer_RenderFunc  render;
+
+  } FT_RendererRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                    F O N T   D R I V E R S                      ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* typecast a module into a driver easily */
+#define FT_DRIVER( x )        ((FT_Driver)(x))
+
+  /* typecast a module as a driver, and get its driver class */
+#define FT_DRIVER_CLASS( x )  FT_DRIVER( x )->clazz
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_DriverRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The root font driver class.  A font driver is responsible for      */
+  /*    managing and loading font files of a given format.                 */
+  /*                                                                       */
+  /*  <Fields>                                                             */
+  /*     root         :: Contains the fields of the root module class.     */
+  /*                                                                       */
+  /*     clazz        :: A pointer to the font driver's class.  Note that  */
+  /*                     this is NOT root.clazz.  `class' wasn't used      */
+  /*                     as it is a reserved word in C++.                  */
+  /*                                                                       */
+  /*     faces_list   :: The list of faces currently opened by this        */
+  /*                     driver.                                           */
+  /*                                                                       */
+  /*     glyph_loader :: The glyph loader for all faces managed by this    */
+  /*                     driver.  This object isn't defined for unscalable */
+  /*                     formats.                                          */
+  /*                                                                       */
+  typedef struct  FT_DriverRec_
+  {
+    FT_ModuleRec     root;
+    FT_Driver_Class  clazz;
+    FT_ListRec       faces_list;
+    FT_GlyphLoader   glyph_loader;
+
+  } FT_DriverRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                       L I B R A R I E S                         ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* This hook is used by the TrueType debugger.  It must be set to an */
+  /* alternate truetype bytecode interpreter function.                 */
+#define FT_DEBUG_HOOK_TRUETYPE            0
+
+
+  /* Set this debug hook to a non-null pointer to force unpatented hinting */
+  /* for all faces when both TT_USE_BYTECODE_INTERPRETER and               */
+  /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined.  This is only used   */
+  /* during debugging.                                                     */
+#define FT_DEBUG_HOOK_UNPATENTED_HINTING  1
+
+
+  typedef void  (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap*      bitmap,
+                                            FT_Render_Mode  render_mode,
+                                            FT_Library      library );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_LibraryRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The FreeType library class.  This is the root of all FreeType      */
+  /*    data.  Use FT_New_Library() to create a library object, and        */
+  /*    FT_Done_Library() to discard it and all child objects.             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory           :: The library's memory object.  Manages memory   */
+  /*                        allocation.                                    */
+  /*                                                                       */
+  /*    version_major    :: The major version number of the library.       */
+  /*                                                                       */
+  /*    version_minor    :: The minor version number of the library.       */
+  /*                                                                       */
+  /*    version_patch    :: The current patch level of the library.        */
+  /*                                                                       */
+  /*    num_modules      :: The number of modules currently registered     */
+  /*                        within this library.  This is set to 0 for new */
+  /*                        libraries.  New modules are added through the  */
+  /*                        FT_Add_Module() API function.                  */
+  /*                                                                       */
+  /*    modules          :: A table used to store handles to the currently */
+  /*                        registered modules. Note that each font driver */
+  /*                        contains a list of its opened faces.           */
+  /*                                                                       */
+  /*    renderers        :: The list of renderers currently registered     */
+  /*                        within the library.                            */
+  /*                                                                       */
+  /*    cur_renderer     :: The current outline renderer.  This is a       */
+  /*                        shortcut used to avoid parsing the list on     */
+  /*                        each call to FT_Outline_Render().  It is a     */
+  /*                        handle to the current renderer for the         */
+  /*                        FT_GLYPH_FORMAT_OUTLINE format.                */
+  /*                                                                       */
+  /*    auto_hinter      :: XXX                                            */
+  /*                                                                       */
+  /*    raster_pool      :: The raster object's render pool.  This can     */
+  /*                        ideally be changed dynamically at run-time.    */
+  /*                                                                       */
+  /*    raster_pool_size :: The size of the render pool in bytes.          */
+  /*                                                                       */
+  /*    debug_hooks      :: XXX                                            */
+  /*                                                                       */
+  /*    lcd_filter       :: If subpixel rendering is activated, the        */
+  /*                        selected LCD filter mode.                      */
+  /*                                                                       */
+  /*    lcd_extra        :: If subpixel rendering is activated, the number */
+  /*                        of extra pixels needed for the LCD filter.     */
+  /*                                                                       */
+  /*    lcd_weights      :: If subpixel rendering is activated, the LCD    */
+  /*                        filter weights, if any.                        */
+  /*                                                                       */
+  /*    lcd_filter_func  :: If subpixel rendering is activated, the LCD    */
+  /*                        filtering callback function.                   */
+  /*                                                                       */
+  /*    pic_container    :: Contains global structs and tables, instead    */
+  /*                        of defining them globallly.                    */
+  /*                                                                       */
+  /*    refcount         :: A counter initialized to~1 at the time an      */
+  /*                        @FT_Library structure is created.              */
+  /*                        @FT_Reference_Library increments this counter, */
+  /*                        and @FT_Done_Library only destroys a library   */
+  /*                        if the counter is~1, otherwise it simply       */
+  /*                        decrements it.                                 */
+  /*                                                                       */
+  typedef struct  FT_LibraryRec_
+  {
+    FT_Memory          memory;           /* library's memory manager */
+
+    FT_Int             version_major;
+    FT_Int             version_minor;
+    FT_Int             version_patch;
+
+    FT_UInt            num_modules;
+    FT_Module          modules[FT_MAX_MODULES];  /* module objects  */
+
+    FT_ListRec         renderers;        /* list of renderers        */
+    FT_Renderer        cur_renderer;     /* current outline renderer */
+    FT_Module          auto_hinter;
+
+    FT_Byte*           raster_pool;      /* scan-line conversion */
+                                         /* render pool          */
+    FT_ULong           raster_pool_size; /* size of render pool in bytes */
+
+    FT_DebugHook_Func  debug_hooks[4];
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+    FT_LcdFilter             lcd_filter;
+    FT_Int                   lcd_extra;        /* number of extra pixels */
+    FT_Byte                  lcd_weights[7];   /* filter weights, if any */
+    FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */
+#endif
+
+#ifdef FT_CONFIG_OPTION_PIC
+    FT_PIC_Container   pic_container;
+#endif
+
+    FT_Int             refcount;
+
+  } FT_LibraryRec;
+
+
+  FT_BASE( FT_Renderer )
+  FT_Lookup_Renderer( FT_Library       library,
+                      FT_Glyph_Format  format,
+                      FT_ListNode*     node );
+
+  FT_BASE( FT_Error )
+  FT_Render_Glyph_Internal( FT_Library      library,
+                            FT_GlyphSlot    slot,
+                            FT_Render_Mode  render_mode );
+
+  typedef const char*
+  (*FT_Face_GetPostscriptNameFunc)( FT_Face  face );
+
+  typedef FT_Error
+  (*FT_Face_GetGlyphNameFunc)( FT_Face     face,
+                               FT_UInt     glyph_index,
+                               FT_Pointer  buffer,
+                               FT_UInt     buffer_max );
+
+  typedef FT_UInt
+  (*FT_Face_GetGlyphNameIndexFunc)( FT_Face     face,
+                                    FT_String*  glyph_name );
+
+
+#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Memory                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Creates a new memory object.                                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A pointer to the new memory object.  0 in case of error.           */
+  /*                                                                       */
+  FT_BASE( FT_Memory )
+  FT_New_Memory( void );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Memory                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discards memory manager.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A handle to the memory manager.                          */
+  /*                                                                       */
+  FT_BASE( void )
+  FT_Done_Memory( FT_Memory  memory );
+
+#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
+
+
+  /* Define default raster's interface.  The default raster is located in  */
+  /* `src/base/ftraster.c'.                                                */
+  /*                                                                       */
+  /* Client applications can register new rasters through the              */
+  /* FT_Set_Raster() API.                                                  */
+
+#ifndef FT_NO_DEFAULT_RASTER
+  FT_EXPORT_VAR( FT_Raster_Funcs )  ft_default_raster;
+#endif
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                      P I C   S U P P O R T                      ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* PIC support macros for ftimage.h */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_OUTLINE_FUNCS                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Outline_Funcs struct.         */
+  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */
+  /*    be called with a pre-allocated structure to be filled.             */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_OUTLINE_FUNCS(           \
+          class_,                          \
+          move_to_,                        \
+          line_to_,                        \
+          conic_to_,                       \
+          cubic_to_,                       \
+          shift_,                          \
+          delta_ )                         \
+  static const  FT_Outline_Funcs class_ =  \
+  {                                        \
+    move_to_,                              \
+    line_to_,                              \
+    conic_to_,                             \
+    cubic_to_,                             \
+    shift_,                                \
+    delta_                                 \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_OUTLINE_FUNCS(                     \
+          class_,                                    \
+          move_to_,                                  \
+          line_to_,                                  \
+          conic_to_,                                 \
+          cubic_to_,                                 \
+          shift_,                                    \
+          delta_ )                                   \
+  static FT_Error                                    \
+  Init_Class_ ## class_( FT_Outline_Funcs*  clazz )  \
+  {                                                  \
+    clazz->move_to  = move_to_;                      \
+    clazz->line_to  = line_to_;                      \
+    clazz->conic_to = conic_to_;                     \
+    clazz->cubic_to = cubic_to_;                     \
+    clazz->shift    = shift_;                        \
+    clazz->delta    = delta_;                        \
+                                                     \
+    return FT_Err_Ok;                                \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_RASTER_FUNCS                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Raster_Funcs struct.          */
+  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */
+  /*    be called with a pre-allocated structure to be filled.             */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_RASTER_FUNCS(    \
+          class_,                  \
+          glyph_format_,           \
+          raster_new_,             \
+          raster_reset_,           \
+          raster_set_mode_,        \
+          raster_render_,          \
+          raster_done_ )           \
+  const FT_Raster_Funcs  class_ =  \
+  {                                \
+    glyph_format_,                 \
+    raster_new_,                   \
+    raster_reset_,                 \
+    raster_set_mode_,              \
+    raster_render_,                \
+    raster_done_                   \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_RASTER_FUNCS(                        \
+          class_,                                      \
+          glyph_format_,                               \
+          raster_new_,                                 \
+          raster_reset_,                               \
+          raster_set_mode_,                            \
+          raster_render_,                              \
+          raster_done_ )                               \
+  void                                                 \
+  FT_Init_Class_ ## class_( FT_Raster_Funcs*  clazz )  \
+  {                                                    \
+    clazz->glyph_format    = glyph_format_;            \
+    clazz->raster_new      = raster_new_;              \
+    clazz->raster_reset    = raster_reset_;            \
+    clazz->raster_set_mode = raster_set_mode_;         \
+    clazz->raster_render   = raster_render_;           \
+    clazz->raster_done     = raster_done_;             \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /* PIC support macros for ftrender.h */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_GLYPH                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Glyph_Class struct.           */
+  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */
+  /*    be called with a pre-allocated stcture to be filled.               */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_GLYPH(          \
+          class_,                 \
+          size_,                  \
+          format_,                \
+          init_,                  \
+          done_,                  \
+          copy_,                  \
+          transform_,             \
+          bbox_,                  \
+          prepare_ )              \
+  FT_CALLBACK_TABLE_DEF           \
+  const FT_Glyph_Class  class_ =  \
+  {                               \
+    size_,                        \
+    format_,                      \
+    init_,                        \
+    done_,                        \
+    copy_,                        \
+    transform_,                   \
+    bbox_,                        \
+    prepare_                      \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_GLYPH(                              \
+          class_,                                     \
+          size_,                                      \
+          format_,                                    \
+          init_,                                      \
+          done_,                                      \
+          copy_,                                      \
+          transform_,                                 \
+          bbox_,                                      \
+          prepare_ )                                  \
+  void                                                \
+  FT_Init_Class_ ## class_( FT_Glyph_Class*  clazz )  \
+  {                                                   \
+    clazz->glyph_size      = size_;                   \
+    clazz->glyph_format    = format_;                 \
+    clazz->glyph_init      = init_;                   \
+    clazz->glyph_done      = done_;                   \
+    clazz->glyph_copy      = copy_;                   \
+    clazz->glyph_transform = transform_;              \
+    clazz->glyph_bbox      = bbox_;                   \
+    clazz->glyph_prepare   = prepare_;                \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DECLARE_RENDERER                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to create a forward declaration of a                          */
+  /*    FT_Renderer_Class struct instance.                                 */
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_RENDERER                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Renderer_Class struct.        */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a `create' funtion will need  */
+  /*    to be called with a pointer where the allocated structure is       */
+  /*    returned.  And when it is no longer needed a `destroy' function    */
+  /*    needs to be called to release that allocation.                     */
+  /*    `fcinit.c' (ft_create_default_module_classes) already contains     */
+  /*    a mechanism to call these functions for the default modules        */
+  /*    described in `ftmodule.h'.                                         */
+  /*                                                                       */
+  /*    Notice that the created `create' and `destroy' functions call      */
+  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */
+  /*    initialize any additional global data, like a module specific      */
+  /*    interface, and put them in the global pic container defined in     */
+  /*    `ftpic.h'.  If you don't need them just implement the functions as */
+  /*    empty to resolve the link error.  Also the `pic_init' and          */
+  /*    `pic_free' functions should be declared in `pic.h', to be referred */
+  /*    by the renderer definition calling `FT_DEFINE_RENDERER' in the     */
+  /*    following.                                                         */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_RENDERER( class_ )               \
+  FT_EXPORT_VAR( const FT_Renderer_Class ) class_;
+
+#define FT_DEFINE_RENDERER(                  \
+          class_,                            \
+          flags_,                            \
+          size_,                             \
+          name_,                             \
+          version_,                          \
+          requires_,                         \
+          interface_,                        \
+          init_,                             \
+          done_,                             \
+          get_interface_,                    \
+          glyph_format_,                     \
+          render_glyph_,                     \
+          transform_glyph_,                  \
+          get_glyph_cbox_,                   \
+          set_mode_,                         \
+          raster_class_ )                    \
+  FT_CALLBACK_TABLE_DEF                      \
+  const FT_Renderer_Class  class_ =          \
+  {                                          \
+    FT_DEFINE_ROOT_MODULE( flags_,           \
+                           size_,            \
+                           name_,            \
+                           version_,         \
+                           requires_,        \
+                           interface_,       \
+                           init_,            \
+                           done_,            \
+                           get_interface_ )  \
+    glyph_format_,                           \
+                                             \
+    render_glyph_,                           \
+    transform_glyph_,                        \
+    get_glyph_cbox_,                         \
+    set_mode_,                               \
+                                             \
+    raster_class_                            \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_RENDERER( class_ )  FT_DECLARE_MODULE( class_ )
+
+#define FT_DEFINE_RENDERER(                                      \
+          class_,                                                \
+          flags_,                                                \
+          size_,                                                 \
+          name_,                                                 \
+          version_,                                              \
+          requires_,                                             \
+          interface_,                                            \
+          init_,                                                 \
+          done_,                                                 \
+          get_interface_,                                        \
+          glyph_format_,                                         \
+          render_glyph_,                                         \
+          transform_glyph_,                                      \
+          get_glyph_cbox_,                                       \
+          set_mode_,                                             \
+          raster_class_ )                                        \
+  void                                                           \
+  FT_Destroy_Class_ ## class_( FT_Library        library,        \
+                               FT_Module_Class*  clazz )         \
+  {                                                              \
+    FT_Renderer_Class*  rclazz = (FT_Renderer_Class*)clazz;      \
+    FT_Memory           memory = library->memory;                \
+                                                                 \
+                                                                 \
+    class_ ## _pic_free( library );                              \
+    if ( rclazz )                                                \
+      FT_FREE( rclazz );                                         \
+  }                                                              \
+                                                                 \
+                                                                 \
+  FT_Error                                                       \
+  FT_Create_Class_ ## class_( FT_Library         library,        \
+                              FT_Module_Class**  output_class )  \
+  {                                                              \
+    FT_Renderer_Class*  clazz = NULL;                            \
+    FT_Error            error;                                   \
+    FT_Memory           memory = library->memory;                \
+                                                                 \
+                                                                 \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \
+      return error;                                              \
+                                                                 \
+    error = class_ ## _pic_init( library );                      \
+    if ( error )                                                 \
+    {                                                            \
+      FT_FREE( clazz );                                          \
+      return error;                                              \
+    }                                                            \
+                                                                 \
+    FT_DEFINE_ROOT_MODULE( flags_,                               \
+                           size_,                                \
+                           name_,                                \
+                           version_,                             \
+                           requires_,                            \
+                           interface_,                           \
+                           init_,                                \
+                           done_,                                \
+                           get_interface_ )                      \
+                                                                 \
+    clazz->glyph_format    = glyph_format_;                      \
+                                                                 \
+    clazz->render_glyph    = render_glyph_;                      \
+    clazz->transform_glyph = transform_glyph_;                   \
+    clazz->get_glyph_cbox  = get_glyph_cbox_;                    \
+    clazz->set_mode        = set_mode_;                          \
+                                                                 \
+    clazz->raster_class    = raster_class_;                      \
+                                                                 \
+    *output_class = (FT_Module_Class*)clazz;                     \
+                                                                 \
+    return FT_Err_Ok;                                            \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /* PIC support macros for ftmodapi.h **/
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Creator                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to create (allocate) a new module class object.    */
+  /*    The object's members are initialized, but the module itself is     */
+  /*    not.                                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory       :: A handle to the memory manager.                    */
+  /*    output_class :: Initialized with the newly allocated class.        */
+  /*                                                                       */
+  typedef FT_Error
+  (*FT_Module_Creator)( FT_Memory          memory,
+                        FT_Module_Class**  output_class );
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Destroyer                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to destroy (deallocate) a module class object.     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A handle to the memory manager.                          */
+  /*    clazz  :: Module class to destroy.                                 */
+  /*                                                                       */
+  typedef void
+  (*FT_Module_Destroyer)( FT_Memory         memory,
+                          FT_Module_Class*  clazz );
+
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DECLARE_MODULE                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to create a forward declaration of a                          */
+  /*    FT_Module_Class struct instance.                                   */
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_MODULE                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of an FT_Module_Class struct.       */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a `create' funtion needs to   */
+  /*    be called with a pointer where the allocated structure is          */
+  /*    returned.  And when it is no longer needed a `destroy' function    */
+  /*    needs to be called to release that allocation.                     */
+  /*    `fcinit.c' (ft_create_default_module_classes) already contains     */
+  /*    a mechanism to call these functions for the default modules        */
+  /*    described in `ftmodule.h'.                                         */
+  /*                                                                       */
+  /*    Notice that the created `create' and `destroy' functions call      */
+  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */
+  /*    initialize any additional global data, like a module specific      */
+  /*    interface, and put them in the global pic container defined in     */
+  /*    `ftpic.h'.  If you don't need them just implement the functions as */
+  /*    empty to resolve the link error.  Also the `pic_init' and          */
+  /*    `pic_free' functions should be declared in `pic.h', to be referred */
+  /*    by the module definition calling `FT_DEFINE_MODULE' in the         */
+  /*    following.                                                         */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_ROOT_MODULE                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of an FT_Module_Class struct inside */
+  /*    another struct that contains it or in a function that initializes  */
+  /*    that containing struct.                                            */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_MODULE( class_ )  \
+  FT_CALLBACK_TABLE                  \
+  const FT_Module_Class  class_;
+
+#define FT_DEFINE_ROOT_MODULE(  \
+          flags_,               \
+          size_,                \
+          name_,                \
+          version_,             \
+          requires_,            \
+          interface_,           \
+          init_,                \
+          done_,                \
+          get_interface_ )      \
+  {                             \
+    flags_,                     \
+    size_,                      \
+                                \
+    name_,                      \
+    version_,                   \
+    requires_,                  \
+                                \
+    interface_,                 \
+                                \
+    init_,                      \
+    done_,                      \
+    get_interface_,             \
+  },
+
+#define FT_DEFINE_MODULE(         \
+          class_,                 \
+          flags_,                 \
+          size_,                  \
+          name_,                  \
+          version_,               \
+          requires_,              \
+          interface_,             \
+          init_,                  \
+          done_,                  \
+          get_interface_ )        \
+  FT_CALLBACK_TABLE_DEF           \
+  const FT_Module_Class class_ =  \
+  {                               \
+    flags_,                       \
+    size_,                        \
+                                  \
+    name_,                        \
+    version_,                     \
+    requires_,                    \
+                                  \
+    interface_,                   \
+                                  \
+    init_,                        \
+    done_,                        \
+    get_interface_,               \
+  };
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_MODULE( class_ )                               \
+  FT_Error                                                        \
+  FT_Create_Class_ ## class_( FT_Library         library,         \
+                              FT_Module_Class**  output_class );  \
+  void                                                            \
+  FT_Destroy_Class_ ## class_( FT_Library        library,         \
+                               FT_Module_Class*  clazz );
+
+#define FT_DEFINE_ROOT_MODULE(                      \
+          flags_,                                   \
+          size_,                                    \
+          name_,                                    \
+          version_,                                 \
+          requires_,                                \
+          interface_,                               \
+          init_,                                    \
+          done_,                                    \
+          get_interface_ )                          \
+    clazz->root.module_flags     = flags_;          \
+    clazz->root.module_size      = size_;           \
+    clazz->root.module_name      = name_;           \
+    clazz->root.module_version   = version_;        \
+    clazz->root.module_requires  = requires_;       \
+                                                    \
+    clazz->root.module_interface = interface_;      \
+                                                    \
+    clazz->root.module_init      = init_;           \
+    clazz->root.module_done      = done_;           \
+    clazz->root.get_interface    = get_interface_;
+
+#define FT_DEFINE_MODULE(                                        \
+          class_,                                                \
+          flags_,                                                \
+          size_,                                                 \
+          name_,                                                 \
+          version_,                                              \
+          requires_,                                             \
+          interface_,                                            \
+          init_,                                                 \
+          done_,                                                 \
+          get_interface_ )                                       \
+  void                                                           \
+  FT_Destroy_Class_ ## class_( FT_Library        library,        \
+                               FT_Module_Class*  clazz )         \
+  {                                                              \
+    FT_Memory memory = library->memory;                          \
+                                                                 \
+                                                                 \
+    class_ ## _pic_free( library );                              \
+    if ( clazz )                                                 \
+      FT_FREE( clazz );                                          \
+  }                                                              \
+                                                                 \
+                                                                 \
+  FT_Error                                                       \
+  FT_Create_Class_ ## class_( FT_Library         library,        \
+                              FT_Module_Class**  output_class )  \
+  {                                                              \
+    FT_Memory         memory = library->memory;                  \
+    FT_Module_Class*  clazz  = NULL;                             \
+    FT_Error          error;                                     \
+                                                                 \
+                                                                 \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \
+      return error;                                              \
+    error = class_ ## _pic_init( library );                      \
+    if ( error )                                                 \
+    {                                                            \
+      FT_FREE( clazz );                                          \
+      return error;                                              \
+    }                                                            \
+                                                                 \
+    clazz->module_flags     = flags_;                            \
+    clazz->module_size      = size_;                             \
+    clazz->module_name      = name_;                             \
+    clazz->module_version   = version_;                          \
+    clazz->module_requires  = requires_;                         \
+                                                                 \
+    clazz->module_interface = interface_;                        \
+                                                                 \
+    clazz->module_init      = init_;                             \
+    clazz->module_done      = done_;                             \
+    clazz->get_interface    = get_interface_;                    \
+                                                                 \
+    *output_class = clazz;                                       \
+                                                                 \
+    return FT_Err_Ok;                                            \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+FT_END_HEADER
+
+#endif /* __FTOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftpic.h
new file mode 100644
index 0000000..485ce7a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftpic.h
@@ -0,0 +1,71 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpic.h                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services (declaration).       */
+/*                                                                         */
+/*  Copyright 2009, 2012 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Modules that ordinarily have const global data that need address     */
+  /*  can instead define pointers here.                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTPIC_H__
+#define __FTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  typedef struct  FT_PIC_Container_
+  {
+    /* pic containers for base */
+    void*  base;
+
+    /* pic containers for modules */
+    void*  autofit;
+    void*  cff;
+    void*  pshinter;
+    void*  psnames;
+    void*  raster;
+    void*  sfnt;
+    void*  smooth;
+    void*  truetype;
+
+  } FT_PIC_Container;
+
+
+  /* Initialize the various function tables, structs, etc. */
+  /* stored in the container.                              */
+  FT_BASE( FT_Error )
+  ft_pic_container_init( FT_Library  library );
+
+
+  /* Destroy the contents of the container. */
+  FT_BASE( void )
+  ft_pic_container_destroy( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftrfork.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftrfork.h
new file mode 100644
index 0000000..061124b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftrfork.h
@@ -0,0 +1,258 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftrfork.h                                                              */
+/*                                                                         */
+/*    Embedded resource forks accessor (specification).                    */
+/*                                                                         */
+/*  Copyright 2004, 2006, 2007, 2012 by                                    */
+/*  Masatake YAMATO and Redhat K.K.                                        */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/* Development of the code in this file is support of                      */
+/* Information-technology Promotion Agency, Japan.                         */
+/***************************************************************************/
+
+
+#ifndef __FTRFORK_H__
+#define __FTRFORK_H__
+
+
+#include "../../ft2build.h"
+#include "ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* Number of guessing rules supported in `FT_Raccess_Guess'.            */
+  /* Don't forget to increment the number if you add a new guessing rule. */
+#define FT_RACCESS_N_RULES  9
+
+
+  /* A structure to describe a reference in a resource by its resource ID */
+  /* and internal offset.  The `POST' resource expects to be concatenated */
+  /* by the order of resource IDs instead of its appearance in the file.  */
+
+  typedef struct  FT_RFork_Ref_
+  {
+    FT_UShort  res_id;
+    FT_ULong   offset;
+
+  } FT_RFork_Ref;
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+  typedef FT_Error
+  (*ft_raccess_guess_func)( FT_Library  library,
+                            FT_Stream   stream,
+                            char       *base_file_name,
+                            char      **result_file_name,
+                            FT_Long    *result_offset );
+
+  typedef enum  FT_RFork_Rule_ {
+    FT_RFork_Rule_invalid = -2,
+    FT_RFork_Rule_uknown, /* -1 */
+    FT_RFork_Rule_apple_double,
+    FT_RFork_Rule_apple_single,
+    FT_RFork_Rule_darwin_ufs_export,
+    FT_RFork_Rule_darwin_newvfs,
+    FT_RFork_Rule_darwin_hfsplus,
+    FT_RFork_Rule_vfat,
+    FT_RFork_Rule_linux_cap,
+    FT_RFork_Rule_linux_double,
+    FT_RFork_Rule_linux_netatalk
+  } FT_RFork_Rule;
+
+  /* For fast translation between rule index and rule type,
+   * the macros FT_RFORK_xxx should be kept consistent with
+   * the raccess_guess_funcs table
+   */
+  typedef struct ft_raccess_guess_rec_ {
+    ft_raccess_guess_func  func;
+    FT_RFork_Rule          type;
+  } ft_raccess_guess_rec;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+  /* this array is a storage in non-PIC mode, so ; is needed in END */
+#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \
+          const type name[] = {
+#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \
+          { raccess_guess_ ## func_suffix,                           \
+            FT_RFork_Rule_ ## type_suffix },
+#define CONST_FT_RFORK_RULE_ARRAY_END  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+  /* this array is a function in PIC mode, so no ; is needed in END */
+#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \
+          void                                         \
+          FT_Init_ ## name( type*  storage )           \
+          {                                            \
+            type*  local = storage;                    \
+                                                       \
+                                                       \
+            int  i = 0;
+#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \
+          local[i].func = raccess_guess_ ## func_suffix;             \
+          local[i].type = FT_RFork_Rule_ ## type_suffix;             \
+          i++;
+#define CONST_FT_RFORK_RULE_ARRAY_END  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Raccess_Guess                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Guess a file name and offset where the actual resource fork is     */
+  /*    stored.  The macro FT_RACCESS_N_RULES holds the number of          */
+  /*    guessing rules;  the guessed result for the Nth rule is            */
+  /*    represented as a triplet: a new file name (new_names[N]), a file   */
+  /*    offset (offsets[N]), and an error code (errors[N]).                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library ::                                                         */
+  /*      A FreeType library instance.                                     */
+  /*                                                                       */
+  /*    stream ::                                                          */
+  /*      A file stream containing the resource fork.                      */
+  /*                                                                       */
+  /*    base_name ::                                                       */
+  /*      The (base) file name of the resource fork used for some          */
+  /*      guessing rules.                                                  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    new_names ::                                                       */
+  /*      An array of guessed file names in which the resource forks may   */
+  /*      exist.  If `new_names[N]' is NULL, the guessed file name is      */
+  /*      equal to `base_name'.                                            */
+  /*                                                                       */
+  /*    offsets ::                                                         */
+  /*      An array of guessed file offsets.  `offsets[N]' holds the file   */
+  /*      offset of the possible start of the resource fork in file        */
+  /*      `new_names[N]'.                                                  */
+  /*                                                                       */
+  /*    errors ::                                                          */
+  /*      An array of FreeType error codes.  `errors[N]' is the error      */
+  /*      code of Nth guessing rule function.  If `errors[N]' is not       */
+  /*      FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless.      */
+  /*                                                                       */
+  FT_BASE( void )
+  FT_Raccess_Guess( FT_Library  library,
+                    FT_Stream   stream,
+                    char*       base_name,
+                    char**      new_names,
+                    FT_Long*    offsets,
+                    FT_Error*   errors );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Raccess_Get_HeaderInfo                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the information from the header of resource fork.  The         */
+  /*    information includes the file offset where the resource map        */
+  /*    starts, and the file offset where the resource data starts.        */
+  /*    `FT_Raccess_Get_DataOffsets' requires these two data.              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library ::                                                         */
+  /*      A FreeType library instance.                                     */
+  /*                                                                       */
+  /*    stream ::                                                          */
+  /*      A file stream containing the resource fork.                      */
+  /*                                                                       */
+  /*    rfork_offset ::                                                    */
+  /*      The file offset where the resource fork starts.                  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    map_offset ::                                                      */
+  /*      The file offset where the resource map starts.                   */
+  /*                                                                       */
+  /*    rdata_pos ::                                                       */
+  /*      The file offset where the resource data starts.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  FT_Err_Ok means success.                     */
+  /*                                                                       */
+  FT_BASE( FT_Error )
+  FT_Raccess_Get_HeaderInfo( FT_Library  library,
+                             FT_Stream   stream,
+                             FT_Long     rfork_offset,
+                             FT_Long    *map_offset,
+                             FT_Long    *rdata_pos );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Raccess_Get_DataOffsets                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the data offsets for a tag in a resource fork.  Offsets are    */
+  /*    stored in an array because, in some cases, resources in a resource */
+  /*    fork have the same tag.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library ::                                                         */
+  /*      A FreeType library instance.                                     */
+  /*                                                                       */
+  /*    stream ::                                                          */
+  /*      A file stream containing the resource fork.                      */
+  /*                                                                       */
+  /*    map_offset ::                                                      */
+  /*      The file offset where the resource map starts.                   */
+  /*                                                                       */
+  /*    rdata_pos ::                                                       */
+  /*      The file offset where the resource data starts.                  */
+  /*                                                                       */
+  /*    tag ::                                                             */
+  /*      The resource tag.                                                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    offsets ::                                                         */
+  /*      The stream offsets for the resource data specified by `tag'.     */
+  /*      This array is allocated by the function, so you have to call     */
+  /*      @ft_mem_free after use.                                          */
+  /*                                                                       */
+  /*    count ::                                                           */
+  /*      The length of offsets array.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  FT_Err_Ok means success.                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Normally you should use `FT_Raccess_Get_HeaderInfo' to get the     */
+  /*    value for `map_offset' and `rdata_pos'.                            */
+  /*                                                                       */
+  FT_BASE( FT_Error )
+  FT_Raccess_Get_DataOffsets( FT_Library  library,
+                              FT_Stream   stream,
+                              FT_Long     map_offset,
+                              FT_Long     rdata_pos,
+                              FT_Long     tag,
+                              FT_Long   **offsets,
+                              FT_Long    *count );
+
+
+FT_END_HEADER
+
+#endif /* __FTRFORK_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftserv.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftserv.h
new file mode 100644
index 0000000..cd5fbd0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftserv.h
@@ -0,0 +1,763 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftserv.h                                                               */
+/*                                                                         */
+/*    The FreeType services (specification only).                          */
+/*                                                                         */
+/*  Copyright 2003-2007, 2009, 2012, 2013 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Each module can export one or more `services'.  Each service is      */
+  /*  identified by a constant string and modeled by a pointer; the latter */
+  /*  generally corresponds to a structure containing function pointers.   */
+  /*                                                                       */
+  /*  Note that a service's data cannot be a mere function pointer because */
+  /*  in C it is possible that function pointers might be implemented      */
+  /*  differently than data pointers (e.g. 48 bits instead of 32).         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTSERV_H__
+#define __FTSERV_H__
+
+
+FT_BEGIN_HEADER
+
+  /*
+   * @macro:
+   *   FT_FACE_FIND_SERVICE
+   *
+   * @description:
+   *   This macro is used to look up a service from a face's driver module.
+   *
+   * @input:
+   *   face ::
+   *     The source face handle.
+   *
+   *   id ::
+   *     A string describing the service as defined in the service's
+   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
+   *     `multi-masters').  It is automatically prefixed with
+   *     `FT_SERVICE_ID_'.
+   *
+   * @output:
+   *   ptr ::
+   *     A variable that receives the service pointer.  Will be NULL
+   *     if not found.
+   */
+#ifdef __cplusplus
+
+#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \
+  FT_BEGIN_STMNT                                                            \
+    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );             \
+    FT_Pointer   _tmp_  = NULL;                                             \
+    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                              \
+                                                                            \
+                                                                            \
+    if ( module->clazz->get_interface )                                     \
+      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
+    *_pptr_ = _tmp_;                                                        \
+  FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \
+  FT_BEGIN_STMNT                                                            \
+    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );              \
+    FT_Pointer  _tmp_  = NULL;                                              \
+                                                                            \
+    if ( module->clazz->get_interface )                                     \
+      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
+    ptr = _tmp_;                                                            \
+  FT_END_STMNT
+
+#endif /* !C++ */
+
+
+  /*
+   * @macro:
+   *   FT_FACE_FIND_GLOBAL_SERVICE
+   *
+   * @description:
+   *   This macro is used to look up a service from all modules.
+   *
+   * @input:
+   *   face ::
+   *     The source face handle.
+   *
+   *   id ::
+   *     A string describing the service as defined in the service's
+   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
+   *     `multi-masters').  It is automatically prefixed with
+   *     `FT_SERVICE_ID_'.
+   *
+   * @output:
+   *   ptr ::
+   *     A variable that receives the service pointer.  Will be NULL
+   *     if not found.
+   */
+#ifdef __cplusplus
+
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \
+  FT_BEGIN_STMNT                                                   \
+    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );    \
+    FT_Pointer   _tmp_;                                            \
+    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                     \
+                                                                   \
+                                                                   \
+    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
+    *_pptr_ = _tmp_;                                               \
+  FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \
+  FT_BEGIN_STMNT                                                   \
+    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );     \
+    FT_Pointer  _tmp_;                                             \
+                                                                   \
+                                                                   \
+    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
+    ptr   = _tmp_;                                                 \
+  FT_END_STMNT
+
+#endif /* !C++ */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****         S E R V I C E   D E S C R I P T O R S                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+   *  The following structure is used to _describe_ a given service
+   *  to the library.  This is useful to build simple static service lists.
+   */
+  typedef struct  FT_ServiceDescRec_
+  {
+    const char*  serv_id;     /* service name         */
+    const void*  serv_data;   /* service pointer/data */
+
+  } FT_ServiceDescRec;
+
+  typedef const FT_ServiceDescRec*  FT_ServiceDesc;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_SERVICEDESCREC1                                          */
+  /*    FT_DEFINE_SERVICEDESCREC2                                          */
+  /*    FT_DEFINE_SERVICEDESCREC3                                          */
+  /*    FT_DEFINE_SERVICEDESCREC4                                          */
+  /*    FT_DEFINE_SERVICEDESCREC5                                          */
+  /*    FT_DEFINE_SERVICEDESCREC6                                          */
+  /*    FT_DEFINE_SERVICEDESCREC7                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an array of FT_ServiceDescRec structures.       */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function needs to  */
+  /*    be called with a pointer to return an allocated array.  As soon as */
+  /*    it is no longer needed, a `destroy' function needs to be called to */
+  /*    release that allocation.                                           */
+  /*                                                                       */
+  /*    These functions should be manually called from the `pic_init' and  */
+  /*    `pic_free' functions of your module (see FT_DEFINE_MODULE).        */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the array will be         */
+  /*    allocated in the global scope (or the scope where the macro is     */
+  /*    used).                                                             */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \
+                                   serv_id_1, serv_data_1 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC4( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC5( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { serv_id_5, serv_data_5 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC6( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { serv_id_5, serv_data_5 },                                             \
+    { serv_id_6, serv_data_6 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC7( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6,                  \
+                                   serv_id_7, serv_data_7 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { serv_id_5, serv_data_5 },                                             \
+    { serv_id_6, serv_data_6 },                                             \
+    { serv_id_7, serv_data_7 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \
+                                   serv_id_1, serv_data_1 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 2 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = NULL;                                              \
+    clazz[1].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 3 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = NULL;                                              \
+    clazz[2].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 4 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = NULL;                                              \
+    clazz[3].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC4( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 5 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = NULL;                                              \
+    clazz[4].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC5( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 6 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = serv_id_5;                                         \
+    clazz[4].serv_data = serv_data_5;                                       \
+    clazz[5].serv_id   = NULL;                                              \
+    clazz[5].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC6( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class)            \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 7 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = serv_id_5;                                         \
+    clazz[4].serv_data = serv_data_5;                                       \
+    clazz[5].serv_id   = serv_id_6;                                         \
+    clazz[5].serv_data = serv_data_6;                                       \
+    clazz[6].serv_id   = NULL;                                              \
+    clazz[6].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC7( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6,                  \
+                                   serv_id_7, serv_data_7 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class)            \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 8 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = serv_id_5;                                         \
+    clazz[4].serv_data = serv_data_5;                                       \
+    clazz[5].serv_id   = serv_id_6;                                         \
+    clazz[5].serv_data = serv_data_6;                                       \
+    clazz[6].serv_id   = serv_id_7;                                         \
+    clazz[6].serv_data = serv_data_7;                                       \
+    clazz[7].serv_id   = NULL;                                              \
+    clazz[7].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /*
+   *  Parse a list of FT_ServiceDescRec descriptors and look for
+   *  a specific service by ID.  Note that the last element in the
+   *  array must be { NULL, NULL }, and that the function should
+   *  return NULL if the service isn't available.
+   *
+   *  This function can be used by modules to implement their
+   *  `get_service' method.
+   */
+  FT_BASE( FT_Pointer )
+  ft_service_list_lookup( FT_ServiceDesc  service_descriptors,
+                          const char*     service_id );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****             S E R V I C E S   C A C H E                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+   *  This structure is used to store a cache for several frequently used
+   *  services.  It is the type of `face->internal->services'.  You
+   *  should only use FT_FACE_LOOKUP_SERVICE to access it.
+   *
+   *  All fields should have the type FT_Pointer to relax compilation
+   *  dependencies.  We assume the developer isn't completely stupid.
+   *
+   *  Each field must be named `service_XXXX' where `XXX' corresponds to
+   *  the correct FT_SERVICE_ID_XXXX macro.  See the definition of
+   *  FT_FACE_LOOKUP_SERVICE below how this is implemented.
+   *
+   */
+  typedef struct  FT_ServiceCacheRec_
+  {
+    FT_Pointer  service_POSTSCRIPT_FONT_NAME;
+    FT_Pointer  service_MULTI_MASTERS;
+    FT_Pointer  service_GLYPH_DICT;
+    FT_Pointer  service_PFR_METRICS;
+    FT_Pointer  service_WINFNT;
+
+  } FT_ServiceCacheRec, *FT_ServiceCache;
+
+
+  /*
+   *  A magic number used within the services cache.
+   */
+
+  /* ensure that value `1' has the same width as a pointer */
+#define FT_SERVICE_UNAVAILABLE  ((FT_Pointer)~(FT_PtrDist)1)
+
+
+  /*
+   * @macro:
+   *   FT_FACE_LOOKUP_SERVICE
+   *
+   * @description:
+   *   This macro is used to lookup a service from a face's driver module
+   *   using its cache.
+   *
+   * @input:
+   *   face::
+   *     The source face handle containing the cache.
+   *
+   *   field ::
+   *     The field name in the cache.
+   *
+   *   id ::
+   *     The service ID.
+   *
+   * @output:
+   *   ptr ::
+   *     A variable receiving the service data.  NULL if not available.
+   */
+#ifdef __cplusplus
+
+#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \
+  FT_BEGIN_STMNT                                               \
+    FT_Pointer   svc;                                          \
+    FT_Pointer*  Pptr = (FT_Pointer*)&(ptr);                   \
+                                                               \
+                                                               \
+    svc = FT_FACE( face )->internal->services. service_ ## id; \
+    if ( svc == FT_SERVICE_UNAVAILABLE )                       \
+      svc = NULL;                                              \
+    else if ( svc == NULL )                                    \
+    {                                                          \
+      FT_FACE_FIND_SERVICE( face, svc, id );                   \
+                                                               \
+      FT_FACE( face )->internal->services. service_ ## id =    \
+        (FT_Pointer)( svc != NULL ? svc                        \
+                                  : FT_SERVICE_UNAVAILABLE );  \
+    }                                                          \
+    *Pptr = svc;                                               \
+  FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \
+  FT_BEGIN_STMNT                                               \
+    FT_Pointer  svc;                                           \
+                                                               \
+                                                               \
+    svc = FT_FACE( face )->internal->services. service_ ## id; \
+    if ( svc == FT_SERVICE_UNAVAILABLE )                       \
+      svc = NULL;                                              \
+    else if ( svc == NULL )                                    \
+    {                                                          \
+      FT_FACE_FIND_SERVICE( face, svc, id );                   \
+                                                               \
+      FT_FACE( face )->internal->services. service_ ## id =    \
+        (FT_Pointer)( svc != NULL ? svc                        \
+                                  : FT_SERVICE_UNAVAILABLE );  \
+    }                                                          \
+    ptr = svc;                                                 \
+  FT_END_STMNT
+
+#endif /* !C++ */
+
+  /*
+   *  A macro used to define new service structure types.
+   */
+
+#define FT_DEFINE_SERVICE( name )            \
+  typedef struct FT_Service_ ## name ## Rec_ \
+    FT_Service_ ## name ## Rec ;             \
+  typedef struct FT_Service_ ## name ## Rec_ \
+    const * FT_Service_ ## name ;            \
+  struct FT_Service_ ## name ## Rec_
+
+  /* */
+
+  /*
+   *  The header files containing the services.
+   */
+
+#define FT_SERVICE_BDF_H                <freetype/internal/services/svbdf.h>
+#define FT_SERVICE_CID_H                <freetype/internal/services/svcid.h>
+#define FT_SERVICE_GLYPH_DICT_H         <freetype/internal/services/svgldict.h>
+#define FT_SERVICE_GX_VALIDATE_H        <freetype/internal/services/svgxval.h>
+#define FT_SERVICE_KERNING_H            <freetype/internal/services/svkern.h>
+#define FT_SERVICE_MULTIPLE_MASTERS_H   <freetype/internal/services/svmm.h>
+#define FT_SERVICE_OPENTYPE_VALIDATE_H  <freetype/internal/services/svotval.h>
+#define FT_SERVICE_PFR_H                <freetype/internal/services/svpfr.h>
+#define FT_SERVICE_POSTSCRIPT_CMAPS_H   <freetype/internal/services/svpscmap.h>
+#define FT_SERVICE_POSTSCRIPT_INFO_H    <freetype/internal/services/svpsinfo.h>
+#define FT_SERVICE_POSTSCRIPT_NAME_H    <freetype/internal/services/svpostnm.h>
+#define FT_SERVICE_PROPERTIES_H         <freetype/internal/services/svprop.h>
+#define FT_SERVICE_SFNT_H               <freetype/internal/services/svsfnt.h>
+#define FT_SERVICE_TRUETYPE_ENGINE_H    <freetype/internal/services/svtteng.h>
+#define FT_SERVICE_TT_CMAP_H            <freetype/internal/services/svttcmap.h>
+#define FT_SERVICE_WINFNT_H             <freetype/internal/services/svwinfnt.h>
+#define FT_SERVICE_XFREE86_NAME_H       <freetype/internal/services/svxf86nm.h>
+#define FT_SERVICE_TRUETYPE_GLYF_H      <freetype/internal/services/svttglyf.h>
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSERV_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftstream.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftstream.h
new file mode 100644
index 0000000..c1a2654
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftstream.h
@@ -0,0 +1,536 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstream.h                                                             */
+/*                                                                         */
+/*    Stream handling (specification).                                     */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004-2006, 2011, 2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTSTREAM_H__
+#define __FTSTREAM_H__
+
+
+#include "../../ft2build.h"
+#include "../ftsystem.h"
+#include "ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* format of an 8-bit frame_op value:           */
+  /*                                              */
+  /* bit  76543210                                */
+  /*      xxxxxxes                                */
+  /*                                              */
+  /* s is set to 1 if the value is signed.        */
+  /* e is set to 1 if the value is little-endian. */
+  /* xxx is a command.                            */
+
+#define FT_FRAME_OP_SHIFT         2
+#define FT_FRAME_OP_SIGNED        1
+#define FT_FRAME_OP_LITTLE        2
+#define FT_FRAME_OP_COMMAND( x )  ( x >> FT_FRAME_OP_SHIFT )
+
+#define FT_MAKE_FRAME_OP( command, little, sign ) \
+          ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign )
+
+#define FT_FRAME_OP_END    0
+#define FT_FRAME_OP_START  1  /* start a new frame     */
+#define FT_FRAME_OP_BYTE   2  /* read 1-byte value     */
+#define FT_FRAME_OP_SHORT  3  /* read 2-byte value     */
+#define FT_FRAME_OP_LONG   4  /* read 4-byte value     */
+#define FT_FRAME_OP_OFF3   5  /* read 3-byte value     */
+#define FT_FRAME_OP_BYTES  6  /* read a bytes sequence */
+
+
+  typedef enum  FT_Frame_Op_
+  {
+    ft_frame_end       = 0,
+    ft_frame_start     = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ),
+
+    ft_frame_byte      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 0 ),
+    ft_frame_schar     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 1 ),
+
+    ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ),
+    ft_frame_short_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ),
+    ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ),
+    ft_frame_short_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ),
+
+    ft_frame_ulong_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ),
+    ft_frame_long_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ),
+    ft_frame_ulong_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ),
+    ft_frame_long_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ),
+
+    ft_frame_uoff3_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ),
+    ft_frame_off3_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ),
+    ft_frame_uoff3_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ),
+    ft_frame_off3_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ),
+
+    ft_frame_bytes     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ),
+    ft_frame_skip      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 )
+
+  } FT_Frame_Op;
+
+
+  typedef struct  FT_Frame_Field_
+  {
+    FT_Byte    value;
+    FT_Byte    size;
+    FT_UShort  offset;
+
+  } FT_Frame_Field;
+
+
+  /* Construct an FT_Frame_Field out of a structure type and a field name. */
+  /* The structure type must be set in the FT_STRUCTURE macro before       */
+  /* calling the FT_FRAME_START() macro.                                   */
+  /*                                                                       */
+#define FT_FIELD_SIZE( f ) \
+          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f )
+
+#define FT_FIELD_SIZE_DELTA( f ) \
+          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] )
+
+#define FT_FIELD_OFFSET( f ) \
+          (FT_UShort)( offsetof( FT_STRUCTURE, f ) )
+
+#define FT_FRAME_FIELD( frame_op, field ) \
+          {                               \
+            frame_op,                     \
+            FT_FIELD_SIZE( field ),       \
+            FT_FIELD_OFFSET( field )      \
+          }
+
+#define FT_MAKE_EMPTY_FIELD( frame_op )  { frame_op, 0, 0 }
+
+#define FT_FRAME_START( size )   { ft_frame_start, 0, size }
+#define FT_FRAME_END             { ft_frame_end, 0, 0 }
+
+#define FT_FRAME_LONG( f )       FT_FRAME_FIELD( ft_frame_long_be, f )
+#define FT_FRAME_ULONG( f )      FT_FRAME_FIELD( ft_frame_ulong_be, f )
+#define FT_FRAME_SHORT( f )      FT_FRAME_FIELD( ft_frame_short_be, f )
+#define FT_FRAME_USHORT( f )     FT_FRAME_FIELD( ft_frame_ushort_be, f )
+#define FT_FRAME_OFF3( f )       FT_FRAME_FIELD( ft_frame_off3_be, f )
+#define FT_FRAME_UOFF3( f )      FT_FRAME_FIELD( ft_frame_uoff3_be, f )
+#define FT_FRAME_BYTE( f )       FT_FRAME_FIELD( ft_frame_byte, f )
+#define FT_FRAME_CHAR( f )       FT_FRAME_FIELD( ft_frame_schar, f )
+
+#define FT_FRAME_LONG_LE( f )    FT_FRAME_FIELD( ft_frame_long_le, f )
+#define FT_FRAME_ULONG_LE( f )   FT_FRAME_FIELD( ft_frame_ulong_le, f )
+#define FT_FRAME_SHORT_LE( f )   FT_FRAME_FIELD( ft_frame_short_le, f )
+#define FT_FRAME_USHORT_LE( f )  FT_FRAME_FIELD( ft_frame_ushort_le, f )
+#define FT_FRAME_OFF3_LE( f )    FT_FRAME_FIELD( ft_frame_off3_le, f )
+#define FT_FRAME_UOFF3_LE( f )   FT_FRAME_FIELD( ft_frame_uoff3_le, f )
+
+#define FT_FRAME_SKIP_LONG       { ft_frame_long_be, 0, 0 }
+#define FT_FRAME_SKIP_SHORT      { ft_frame_short_be, 0, 0 }
+#define FT_FRAME_SKIP_BYTE       { ft_frame_byte, 0, 0 }
+
+#define FT_FRAME_BYTES( field, count ) \
+          {                            \
+            ft_frame_bytes,            \
+            count,                     \
+            FT_FIELD_OFFSET( field )   \
+          }
+
+#define FT_FRAME_SKIP_BYTES( count )  { ft_frame_skip, count, 0 }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */
+  /* type `char*' or equivalent (1-byte elements).                         */
+  /*                                                                       */
+
+#define FT_BYTE_( p, i )  ( ((const FT_Byte*)(p))[(i)] )
+
+#define FT_INT16( x )   ( (FT_Int16)(x)  )
+#define FT_UINT16( x )  ( (FT_UInt16)(x) )
+#define FT_INT32( x )   ( (FT_Int32)(x)  )
+#define FT_UINT32( x )  ( (FT_UInt32)(x) )
+
+
+#define FT_BYTE_U16( p, i, s )  ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) )
+#define FT_BYTE_U32( p, i, s )  ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) )
+
+
+#define FT_PEEK_SHORT( p )  FT_INT16( FT_BYTE_U16( p, 0, 8) | \
+                                      FT_BYTE_U16( p, 1, 0) )
+
+#define FT_PEEK_USHORT( p )  FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \
+                                        FT_BYTE_U16( p, 1, 0 ) )
+
+#define FT_PEEK_LONG( p )  FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \
+                                     FT_BYTE_U32( p, 1, 16 ) | \
+                                     FT_BYTE_U32( p, 2,  8 ) | \
+                                     FT_BYTE_U32( p, 3,  0 ) )
+
+#define FT_PEEK_ULONG( p )  FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \
+                                       FT_BYTE_U32( p, 1, 16 ) | \
+                                       FT_BYTE_U32( p, 2,  8 ) | \
+                                       FT_BYTE_U32( p, 3,  0 ) )
+
+#define FT_PEEK_OFF3( p )  FT_INT32( FT_BYTE_U32( p, 0, 16 ) | \
+                                     FT_BYTE_U32( p, 1,  8 ) | \
+                                     FT_BYTE_U32( p, 2,  0 ) )
+
+#define FT_PEEK_UOFF3( p )  FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \
+                                       FT_BYTE_U32( p, 1,  8 ) | \
+                                       FT_BYTE_U32( p, 2,  0 ) )
+
+#define FT_PEEK_SHORT_LE( p )  FT_INT16( FT_BYTE_U16( p, 1, 8 ) | \
+                                         FT_BYTE_U16( p, 0, 0 ) )
+
+#define FT_PEEK_USHORT_LE( p )  FT_UINT16( FT_BYTE_U16( p, 1, 8 ) |  \
+                                           FT_BYTE_U16( p, 0, 0 ) )
+
+#define FT_PEEK_LONG_LE( p )  FT_INT32( FT_BYTE_U32( p, 3, 24 ) | \
+                                        FT_BYTE_U32( p, 2, 16 ) | \
+                                        FT_BYTE_U32( p, 1,  8 ) | \
+                                        FT_BYTE_U32( p, 0,  0 ) )
+
+#define FT_PEEK_ULONG_LE( p )  FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \
+                                          FT_BYTE_U32( p, 2, 16 ) | \
+                                          FT_BYTE_U32( p, 1,  8 ) | \
+                                          FT_BYTE_U32( p, 0,  0 ) )
+
+#define FT_PEEK_OFF3_LE( p )  FT_INT32( FT_BYTE_U32( p, 2, 16 ) | \
+                                        FT_BYTE_U32( p, 1,  8 ) | \
+                                        FT_BYTE_U32( p, 0,  0 ) )
+
+#define FT_PEEK_UOFF3_LE( p )  FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \
+                                          FT_BYTE_U32( p, 1,  8 ) | \
+                                          FT_BYTE_U32( p, 0,  0 ) )
+
+
+#define FT_NEXT_CHAR( buffer )       \
+          ( (signed char)*buffer++ )
+
+#define FT_NEXT_BYTE( buffer )         \
+          ( (unsigned char)*buffer++ )
+
+#define FT_NEXT_SHORT( buffer )                                   \
+          ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) )
+
+#define FT_NEXT_USHORT( buffer )                                            \
+          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )
+
+#define FT_NEXT_OFF3( buffer )                                  \
+          ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )
+
+#define FT_NEXT_UOFF3( buffer )                                           \
+          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )
+
+#define FT_NEXT_LONG( buffer )                                  \
+          ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )
+
+#define FT_NEXT_ULONG( buffer )                                           \
+          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )
+
+
+#define FT_NEXT_SHORT_LE( buffer )                                   \
+          ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) )
+
+#define FT_NEXT_USHORT_LE( buffer )                                            \
+          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) )
+
+#define FT_NEXT_OFF3_LE( buffer )                                  \
+          ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) )
+
+#define FT_NEXT_UOFF3_LE( buffer )                                           \
+          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) )
+
+#define FT_NEXT_LONG_LE( buffer )                                  \
+          ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) )
+
+#define FT_NEXT_ULONG_LE( buffer )                                           \
+          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Each GET_xxxx() macro uses an implicit `stream' variable.             */
+  /*                                                                       */
+#if 0
+#define FT_GET_MACRO( type )    FT_NEXT_ ## type ( stream->cursor )
+
+#define FT_GET_CHAR()       FT_GET_MACRO( CHAR )
+#define FT_GET_BYTE()       FT_GET_MACRO( BYTE )
+#define FT_GET_SHORT()      FT_GET_MACRO( SHORT )
+#define FT_GET_USHORT()     FT_GET_MACRO( USHORT )
+#define FT_GET_OFF3()       FT_GET_MACRO( OFF3 )
+#define FT_GET_UOFF3()      FT_GET_MACRO( UOFF3 )
+#define FT_GET_LONG()       FT_GET_MACRO( LONG )
+#define FT_GET_ULONG()      FT_GET_MACRO( ULONG )
+#define FT_GET_TAG4()       FT_GET_MACRO( ULONG )
+
+#define FT_GET_SHORT_LE()   FT_GET_MACRO( SHORT_LE )
+#define FT_GET_USHORT_LE()  FT_GET_MACRO( USHORT_LE )
+#define FT_GET_LONG_LE()    FT_GET_MACRO( LONG_LE )
+#define FT_GET_ULONG_LE()   FT_GET_MACRO( ULONG_LE )
+
+#else
+#define FT_GET_MACRO( func, type )        ( (type)func( stream ) )
+
+#define FT_GET_CHAR()       FT_GET_MACRO( FT_Stream_GetChar, FT_Char )
+#define FT_GET_BYTE()       FT_GET_MACRO( FT_Stream_GetChar, FT_Byte )
+#define FT_GET_SHORT()      FT_GET_MACRO( FT_Stream_GetUShort, FT_Short )
+#define FT_GET_USHORT()     FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort )
+#define FT_GET_OFF3()       FT_GET_MACRO( FT_Stream_GetUOffset, FT_Long )
+#define FT_GET_UOFF3()      FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong )
+#define FT_GET_LONG()       FT_GET_MACRO( FT_Stream_GetULong, FT_Long )
+#define FT_GET_ULONG()      FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
+#define FT_GET_TAG4()       FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
+
+#define FT_GET_SHORT_LE()   FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short )
+#define FT_GET_USHORT_LE()  FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort )
+#define FT_GET_LONG_LE()    FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long )
+#define FT_GET_ULONG_LE()   FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong )
+#endif
+
+#define FT_READ_MACRO( func, type, var )        \
+          ( var = (type)func( stream, &error ), \
+            error != FT_Err_Ok )
+
+#define FT_READ_BYTE( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var )
+#define FT_READ_CHAR( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var )
+#define FT_READ_SHORT( var )      FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var )
+#define FT_READ_USHORT( var )     FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var )
+#define FT_READ_OFF3( var )       FT_READ_MACRO( FT_Stream_ReadUOffset, FT_Long, var )
+#define FT_READ_UOFF3( var )      FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var )
+#define FT_READ_LONG( var )       FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var )
+#define FT_READ_ULONG( var )      FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var )
+
+#define FT_READ_SHORT_LE( var )   FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var )
+#define FT_READ_USHORT_LE( var )  FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var )
+#define FT_READ_LONG_LE( var )    FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var )
+#define FT_READ_ULONG_LE( var )   FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var )
+
+
+#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
+
+  /* initialize a stream for reading a regular system stream */
+  FT_BASE( FT_Error )
+  FT_Stream_Open( FT_Stream    stream,
+                  const char*  filepathname );
+
+#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
+
+
+  /* create a new (input) stream from an FT_Open_Args structure */
+  FT_BASE( FT_Error )
+  FT_Stream_New( FT_Library           library,
+                 const FT_Open_Args*  args,
+                 FT_Stream           *astream );
+
+  /* free a stream */
+  FT_BASE( void )
+  FT_Stream_Free( FT_Stream  stream,
+                  FT_Int     external );
+
+  /* initialize a stream for reading in-memory data */
+  FT_BASE( void )
+  FT_Stream_OpenMemory( FT_Stream       stream,
+                        const FT_Byte*  base,
+                        FT_ULong        size );
+
+  /* close a stream (does not destroy the stream structure) */
+  FT_BASE( void )
+  FT_Stream_Close( FT_Stream  stream );
+
+
+  /* seek within a stream. position is relative to start of stream */
+  FT_BASE( FT_Error )
+  FT_Stream_Seek( FT_Stream  stream,
+                  FT_ULong   pos );
+
+  /* skip bytes in a stream */
+  FT_BASE( FT_Error )
+  FT_Stream_Skip( FT_Stream  stream,
+                  FT_Long    distance );
+
+  /* return current stream position */
+  FT_BASE( FT_Long )
+  FT_Stream_Pos( FT_Stream  stream );
+
+  /* read bytes from a stream into a user-allocated buffer, returns an */
+  /* error if not all bytes could be read.                             */
+  FT_BASE( FT_Error )
+  FT_Stream_Read( FT_Stream  stream,
+                  FT_Byte*   buffer,
+                  FT_ULong   count );
+
+  /* read bytes from a stream at a given position */
+  FT_BASE( FT_Error )
+  FT_Stream_ReadAt( FT_Stream  stream,
+                    FT_ULong   pos,
+                    FT_Byte*   buffer,
+                    FT_ULong   count );
+
+  /* try to read bytes at the end of a stream; return number of bytes */
+  /* really available                                                 */
+  FT_BASE( FT_ULong )
+  FT_Stream_TryRead( FT_Stream  stream,
+                     FT_Byte*   buffer,
+                     FT_ULong   count );
+
+  /* Enter a frame of `count' consecutive bytes in a stream.  Returns an */
+  /* error if the frame could not be read/accessed.  The caller can use  */
+  /* the FT_Stream_Get_XXX functions to retrieve frame data without      */
+  /* error checks.                                                       */
+  /*                                                                     */
+  /* You must _always_ call FT_Stream_ExitFrame() once you have entered  */
+  /* a stream frame!                                                     */
+  /*                                                                     */
+  FT_BASE( FT_Error )
+  FT_Stream_EnterFrame( FT_Stream  stream,
+                        FT_ULong   count );
+
+  /* exit a stream frame */
+  FT_BASE( void )
+  FT_Stream_ExitFrame( FT_Stream  stream );
+
+  /* Extract a stream frame.  If the stream is disk-based, a heap block */
+  /* is allocated and the frame bytes are read into it.  If the stream  */
+  /* is memory-based, this function simply set a pointer to the data.   */
+  /*                                                                    */
+  /* Useful to optimize access to memory-based streams transparently.   */
+  /*                                                                    */
+  /* All extracted frames must be `freed' with a call to the function   */
+  /* FT_Stream_ReleaseFrame().                                          */
+  /*                                                                    */
+  FT_BASE( FT_Error )
+  FT_Stream_ExtractFrame( FT_Stream  stream,
+                          FT_ULong   count,
+                          FT_Byte**  pbytes );
+
+  /* release an extract frame (see FT_Stream_ExtractFrame) */
+  FT_BASE( void )
+  FT_Stream_ReleaseFrame( FT_Stream  stream,
+                          FT_Byte**  pbytes );
+
+  /* read a byte from an entered frame */
+  FT_BASE( FT_Char )
+  FT_Stream_GetChar( FT_Stream  stream );
+
+  /* read a 16-bit big-endian unsigned integer from an entered frame */
+  FT_BASE( FT_UShort )
+  FT_Stream_GetUShort( FT_Stream  stream );
+
+  /* read a 24-bit big-endian unsigned integer from an entered frame */
+  FT_BASE( FT_ULong )
+  FT_Stream_GetUOffset( FT_Stream  stream );
+
+  /* read a 32-bit big-endian unsigned integer from an entered frame */
+  FT_BASE( FT_ULong )
+  FT_Stream_GetULong( FT_Stream  stream );
+
+  /* read a 16-bit little-endian unsigned integer from an entered frame */
+  FT_BASE( FT_UShort )
+  FT_Stream_GetUShortLE( FT_Stream  stream );
+
+  /* read a 32-bit little-endian unsigned integer from an entered frame */
+  FT_BASE( FT_ULong )
+  FT_Stream_GetULongLE( FT_Stream  stream );
+
+
+  /* read a byte from a stream */
+  FT_BASE( FT_Char )
+  FT_Stream_ReadChar( FT_Stream  stream,
+                      FT_Error*  error );
+
+  /* read a 16-bit big-endian unsigned integer from a stream */
+  FT_BASE( FT_UShort )
+  FT_Stream_ReadUShort( FT_Stream  stream,
+                        FT_Error*  error );
+
+  /* read a 24-bit big-endian unsigned integer from a stream */
+  FT_BASE( FT_ULong )
+  FT_Stream_ReadUOffset( FT_Stream  stream,
+                         FT_Error*  error );
+
+  /* read a 32-bit big-endian integer from a stream */
+  FT_BASE( FT_ULong )
+  FT_Stream_ReadULong( FT_Stream  stream,
+                       FT_Error*  error );
+
+  /* read a 16-bit little-endian unsigned integer from a stream */
+  FT_BASE( FT_UShort )
+  FT_Stream_ReadUShortLE( FT_Stream  stream,
+                          FT_Error*  error );
+
+  /* read a 32-bit little-endian unsigned integer from a stream */
+  FT_BASE( FT_ULong )
+  FT_Stream_ReadULongLE( FT_Stream  stream,
+                         FT_Error*  error );
+
+  /* Read a structure from a stream.  The structure must be described */
+  /* by an array of FT_Frame_Field records.                           */
+  FT_BASE( FT_Error )
+  FT_Stream_ReadFields( FT_Stream              stream,
+                        const FT_Frame_Field*  fields,
+                        void*                  structure );
+
+
+#define FT_STREAM_POS()           \
+          FT_Stream_Pos( stream )
+
+#define FT_STREAM_SEEK( position )                               \
+          FT_SET_ERROR( FT_Stream_Seek( stream,                  \
+                                        (FT_ULong)(position) ) )
+
+#define FT_STREAM_SKIP( distance )                              \
+          FT_SET_ERROR( FT_Stream_Skip( stream,                 \
+                                        (FT_Long)(distance) ) )
+
+#define FT_STREAM_READ( buffer, count )                       \
+          FT_SET_ERROR( FT_Stream_Read( stream,               \
+                                        (FT_Byte*)(buffer),   \
+                                        (FT_ULong)(count) ) )
+
+#define FT_STREAM_READ_AT( position, buffer, count )            \
+          FT_SET_ERROR( FT_Stream_ReadAt( stream,               \
+                                          (FT_ULong)(position), \
+                                          (FT_Byte*)buffer,     \
+                                          (FT_ULong)(count) ) )
+
+#define FT_STREAM_READ_FIELDS( fields, object )                          \
+          FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) )
+
+
+#define FT_FRAME_ENTER( size )                                           \
+          FT_SET_ERROR(                                                  \
+            FT_DEBUG_INNER( FT_Stream_EnterFrame( stream,                \
+                                                  (FT_ULong)(size) ) ) )
+
+#define FT_FRAME_EXIT()                                   \
+          FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) )
+
+#define FT_FRAME_EXTRACT( size, bytes )                                       \
+          FT_SET_ERROR(                                                       \
+            FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream,                   \
+                                                    (FT_ULong)(size),         \
+                                                    (FT_Byte**)&(bytes) ) ) )
+
+#define FT_FRAME_RELEASE( bytes )                                         \
+          FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream,                 \
+                                                  (FT_Byte**)&(bytes) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTSTREAM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/fttrace.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/fttrace.h
new file mode 100644
index 0000000..a9d98b6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/fttrace.h
@@ -0,0 +1,152 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttrace.h                                                              */
+/*                                                                         */
+/*    Tracing handling (specification only).                               */
+/*                                                                         */
+/*  Copyright 2002, 2004-2007, 2009, 2011-2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /* definitions of trace levels for FreeType 2 */
+
+  /* the first level must always be `trace_any' */
+FT_TRACE_DEF( any )
+
+  /* base components */
+FT_TRACE_DEF( calc )      /* calculations            (ftcalc.c)   */
+FT_TRACE_DEF( memory )    /* memory manager          (ftobjs.c)   */
+FT_TRACE_DEF( stream )    /* stream manager          (ftstream.c) */
+FT_TRACE_DEF( io )        /* i/o interface           (ftsystem.c) */
+FT_TRACE_DEF( list )      /* list management         (ftlist.c)   */
+FT_TRACE_DEF( init )      /* initialization          (ftinit.c)   */
+FT_TRACE_DEF( objs )      /* base objects            (ftobjs.c)   */
+FT_TRACE_DEF( outline )   /* outline management      (ftoutln.c)  */
+FT_TRACE_DEF( glyph )     /* glyph management        (ftglyph.c)  */
+FT_TRACE_DEF( gloader )   /* glyph loader            (ftgloadr.c) */
+
+FT_TRACE_DEF( raster )    /* monochrome rasterizer   (ftraster.c) */
+FT_TRACE_DEF( smooth )    /* anti-aliasing raster    (ftgrays.c)  */
+FT_TRACE_DEF( mm )        /* MM interface            (ftmm.c)     */
+FT_TRACE_DEF( raccess )   /* resource fork accessor  (ftrfork.c)  */
+FT_TRACE_DEF( synth )     /* bold/slant synthesizer  (ftsynth.c)  */
+FT_TRACE_DEF( bitmap )    /* bitmap checksum         (ftobjs.c)   */
+
+  /* Cache sub-system */
+FT_TRACE_DEF( cache )     /* cache sub-system        (ftcache.c, etc.) */
+
+  /* SFNT driver components */
+FT_TRACE_DEF( sfdriver )  /* SFNT font driver        (sfdriver.c) */
+FT_TRACE_DEF( sfobjs )    /* SFNT object handler     (sfobjs.c)   */
+FT_TRACE_DEF( ttcmap )    /* charmap handler         (ttcmap.c)   */
+FT_TRACE_DEF( ttkern )    /* kerning handler         (ttkern.c)   */
+FT_TRACE_DEF( ttload )    /* basic TrueType tables   (ttload.c)   */
+FT_TRACE_DEF( ttmtx )     /* metrics-related tables  (ttmtx.c)    */
+FT_TRACE_DEF( ttpost )    /* PS table processing     (ttpost.c)   */
+FT_TRACE_DEF( ttsbit )    /* TrueType sbit handling  (ttsbit.c)   */
+FT_TRACE_DEF( ttbdf )     /* TrueType embedded BDF   (ttbdf.c)    */
+
+  /* TrueType driver components */
+FT_TRACE_DEF( ttdriver )  /* TT font driver          (ttdriver.c) */
+FT_TRACE_DEF( ttgload )   /* TT glyph loader         (ttgload.c)  */
+FT_TRACE_DEF( ttinterp )  /* bytecode interpreter    (ttinterp.c) */
+FT_TRACE_DEF( ttobjs )    /* TT objects manager      (ttobjs.c)   */
+FT_TRACE_DEF( ttpload )   /* TT data/program loader  (ttpload.c)  */
+FT_TRACE_DEF( ttgxvar )   /* TrueType GX var handler (ttgxvar.c)  */
+
+  /* Type 1 driver components */
+FT_TRACE_DEF( t1afm )
+FT_TRACE_DEF( t1driver )
+FT_TRACE_DEF( t1gload )
+FT_TRACE_DEF( t1hint )
+FT_TRACE_DEF( t1load )
+FT_TRACE_DEF( t1objs )
+FT_TRACE_DEF( t1parse )
+
+  /* PostScript helper module `psaux' */
+FT_TRACE_DEF( t1decode )
+FT_TRACE_DEF( psobjs )
+FT_TRACE_DEF( psconv )
+
+  /* PostScript hinting module `pshinter' */
+FT_TRACE_DEF( pshrec )
+FT_TRACE_DEF( pshalgo1 )
+FT_TRACE_DEF( pshalgo2 )
+
+  /* Type 2 driver components */
+FT_TRACE_DEF( cffdriver )
+FT_TRACE_DEF( cffgload )
+FT_TRACE_DEF( cffload )
+FT_TRACE_DEF( cffobjs )
+FT_TRACE_DEF( cffparse )
+
+FT_TRACE_DEF( cf2blues )
+FT_TRACE_DEF( cf2hints )
+FT_TRACE_DEF( cf2interp )
+
+  /* Type 42 driver component */
+FT_TRACE_DEF( t42 )
+
+  /* CID driver components */
+FT_TRACE_DEF( cidafm )
+FT_TRACE_DEF( ciddriver )
+FT_TRACE_DEF( cidgload )
+FT_TRACE_DEF( cidload )
+FT_TRACE_DEF( cidobjs )
+FT_TRACE_DEF( cidparse )
+
+  /* Windows font component */
+FT_TRACE_DEF( winfnt )
+
+  /* PCF font components */
+FT_TRACE_DEF( pcfdriver )
+FT_TRACE_DEF( pcfread )
+
+  /* BDF font components */
+FT_TRACE_DEF( bdfdriver )
+FT_TRACE_DEF( bdflib )
+
+  /* PFR font component */
+FT_TRACE_DEF( pfr )
+
+  /* OpenType validation components */
+FT_TRACE_DEF( otvmodule )
+FT_TRACE_DEF( otvcommon )
+FT_TRACE_DEF( otvbase )
+FT_TRACE_DEF( otvgdef )
+FT_TRACE_DEF( otvgpos )
+FT_TRACE_DEF( otvgsub )
+FT_TRACE_DEF( otvjstf )
+FT_TRACE_DEF( otvmath )
+
+  /* TrueTypeGX/AAT validation components */
+FT_TRACE_DEF( gxvmodule )
+FT_TRACE_DEF( gxvcommon )
+FT_TRACE_DEF( gxvfeat )
+FT_TRACE_DEF( gxvmort )
+FT_TRACE_DEF( gxvmorx )
+FT_TRACE_DEF( gxvbsln )
+FT_TRACE_DEF( gxvjust )
+FT_TRACE_DEF( gxvkern )
+FT_TRACE_DEF( gxvopbd )
+FT_TRACE_DEF( gxvtrak )
+FT_TRACE_DEF( gxvprop )
+FT_TRACE_DEF( gxvlcar )
+
+  /* autofit components */
+FT_TRACE_DEF( afmodule )
+FT_TRACE_DEF( afhints )
+FT_TRACE_DEF( afcjk )
+FT_TRACE_DEF( aflatin )
+FT_TRACE_DEF( aflatin2 )
+FT_TRACE_DEF( afwarp )
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftvalid.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftvalid.h
new file mode 100644
index 0000000..4442613
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftvalid.h
@@ -0,0 +1,161 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftvalid.h                                                              */
+/*                                                                         */
+/*    FreeType validation support (specification).                         */
+/*                                                                         */
+/*  Copyright 2004, 2013 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTVALID_H__
+#define __FTVALID_H__
+
+#include "../../ft2build.h"
+#include "../config/ftstdlib.h"   /* for ft_setjmp and ft_longjmp */
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                    V A L I D A T I O N                          ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* handle to a validation object */
+  typedef struct FT_ValidatorRec_ volatile*  FT_Validator;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* There are three distinct validation levels defined here:              */
+  /*                                                                       */
+  /* FT_VALIDATE_DEFAULT ::                                                */
+  /*   A table that passes this validation level can be used reliably by   */
+  /*   FreeType.  It generally means that all offsets have been checked to */
+  /*   prevent out-of-bound reads, that array counts are correct, etc.     */
+  /*                                                                       */
+  /* FT_VALIDATE_TIGHT ::                                                  */
+  /*   A table that passes this validation level can be used reliably and  */
+  /*   doesn't contain invalid data.  For example, a charmap table that    */
+  /*   returns invalid glyph indices will not pass, even though it can     */
+  /*   be used with FreeType in default mode (the library will simply      */
+  /*   return an error later when trying to load the glyph).               */
+  /*                                                                       */
+  /*   It also checks that fields which must be a multiple of 2, 4, or 8,  */
+  /*   don't have incorrect values, etc.                                   */
+  /*                                                                       */
+  /* FT_VALIDATE_PARANOID ::                                               */
+  /*   Only for font debugging.  Checks that a table follows the           */
+  /*   specification by 100%.  Very few fonts will be able to pass this    */
+  /*   level anyway but it can be useful for certain tools like font       */
+  /*   editors/converters.                                                 */
+  /*                                                                       */
+  typedef enum  FT_ValidationLevel_
+  {
+    FT_VALIDATE_DEFAULT = 0,
+    FT_VALIDATE_TIGHT,
+    FT_VALIDATE_PARANOID
+
+  } FT_ValidationLevel;
+
+
+#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
+  /* We disable the warning `structure was padded due to   */
+  /* __declspec(align())' in order to compile cleanly with */
+  /* the maximum level of warnings.                        */
+#pragma warning( push )
+#pragma warning( disable : 4324 )
+#endif /* _MSC_VER */
+
+  /* validator structure */
+  typedef struct  FT_ValidatorRec_
+  {
+    const FT_Byte*      base;        /* address of table in memory       */
+    const FT_Byte*      limit;       /* `base' + sizeof(table) in memory */
+    FT_ValidationLevel  level;       /* validation level                 */
+    FT_Error            error;       /* error returned. 0 means success  */
+
+    ft_jmp_buf          jump_buffer; /* used for exception handling      */
+
+  } FT_ValidatorRec;
+
+#if defined( _MSC_VER )
+#pragma warning( pop )
+#endif
+
+#define FT_VALIDATOR( x )  ( (FT_Validator)( x ) )
+
+
+  FT_BASE( void )
+  ft_validator_init( FT_Validator        valid,
+                     const FT_Byte*      base,
+                     const FT_Byte*      limit,
+                     FT_ValidationLevel  level );
+
+  /* Do not use this. It's broken and will cause your validator to crash */
+  /* if you run it on an invalid font.                                   */
+  FT_BASE( FT_Int )
+  ft_validator_run( FT_Validator  valid );
+
+  /* Sets the error field in a validator, then calls `longjmp' to return */
+  /* to high-level caller.  Using `setjmp/longjmp' avoids many stupid    */
+  /* error checks within the validation routines.                        */
+  /*                                                                     */
+  FT_BASE( void )
+  ft_validator_error( FT_Validator  valid,
+                      FT_Error      error );
+
+
+  /* Calls ft_validate_error.  Assumes that the `valid' local variable */
+  /* holds a pointer to the current validator object.                  */
+  /*                                                                   */
+  /* Use preprocessor prescan to pass FT_ERR_PREFIX.                   */
+  /*                                                                   */
+#define FT_INVALID( _prefix, _error )  FT_INVALID_( _prefix, _error )
+#define FT_INVALID_( _prefix, _error ) \
+          ft_validator_error( valid, _prefix ## _error )
+
+  /* called when a broken table is detected */
+#define FT_INVALID_TOO_SHORT \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+  /* called when an invalid offset is detected */
+#define FT_INVALID_OFFSET \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Offset )
+
+  /* called when an invalid format/value is detected */
+#define FT_INVALID_FORMAT \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+  /* called when an invalid glyph index is detected */
+#define FT_INVALID_GLYPH_ID \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index )
+
+  /* called when an invalid field value is detected */
+#define FT_INVALID_DATA \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+
+FT_END_HEADER
+
+#endif /* __FTVALID_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/internal.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/internal.h
new file mode 100644
index 0000000..262afcf
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/internal.h
@@ -0,0 +1,63 @@
+/***************************************************************************/
+/*                                                                         */
+/*  internal.h                                                             */
+/*                                                                         */
+/*    Internal header files (specification only).                          */
+/*                                                                         */
+/*  Copyright 1996-2004, 2013 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is automatically included by `ft2build.h'.                  */
+  /* Do not include it manually!                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#define FT_INTERNAL_OBJECTS_H             <freetype/internal/ftobjs.h>
+#define FT_INTERNAL_PIC_H                 <freetype/internal/ftpic.h>
+#define FT_INTERNAL_STREAM_H              <freetype/internal/ftstream.h>
+#define FT_INTERNAL_MEMORY_H              <freetype/internal/ftmemory.h>
+#define FT_INTERNAL_DEBUG_H               <freetype/internal/ftdebug.h>
+#define FT_INTERNAL_CALC_H                <freetype/internal/ftcalc.h>
+#define FT_INTERNAL_DRIVER_H              <freetype/internal/ftdriver.h>
+#define FT_INTERNAL_TRACE_H               <freetype/internal/fttrace.h>
+#define FT_INTERNAL_GLYPH_LOADER_H        <freetype/internal/ftgloadr.h>
+#define FT_INTERNAL_SFNT_H                <freetype/internal/sfnt.h>
+#define FT_INTERNAL_SERVICE_H             <freetype/internal/ftserv.h>
+#define FT_INTERNAL_RFORK_H               <freetype/internal/ftrfork.h>
+#define FT_INTERNAL_VALIDATE_H            <freetype/internal/ftvalid.h>
+
+#define FT_INTERNAL_TRUETYPE_TYPES_H      <freetype/internal/tttypes.h>
+#define FT_INTERNAL_TYPE1_TYPES_H         <freetype/internal/t1types.h>
+
+#define FT_INTERNAL_POSTSCRIPT_AUX_H      <freetype/internal/psaux.h>
+#define FT_INTERNAL_POSTSCRIPT_HINTS_H    <freetype/internal/pshints.h>
+#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H  <freetype/internal/psglobal.h>
+
+#define FT_INTERNAL_AUTOHINT_H            <freetype/internal/autohint.h>
+
+
+#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
+
+  /* We disable the warning `conditional expression is constant' here */
+  /* in order to compile cleanly with the maximum level of warnings.  */
+  /* In particular, the warning complains about stuff like `while(0)' */
+  /* which is very useful in macro definitions.  There is no benefit  */
+  /* in having it enabled.                                            */
+#pragma warning( disable : 4127 )
+
+#endif /* _MSC_VER */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/psaux.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/psaux.h
new file mode 100644
index 0000000..3128ea4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/psaux.h
@@ -0,0 +1,877 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psaux.h                                                                */
+/*                                                                         */
+/*    Auxiliary functions and data structures related to PostScript fonts  */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006, 2008, 2009, 2012 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSAUX_H__
+#define __PSAUX_H__
+
+
+#include "../../ft2build.h"
+#include "ftobjs.h"
+#include "t1types.h"
+#include "services/svpscmap.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                             T1_TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct PS_TableRec_*              PS_Table;
+  typedef const struct PS_Table_FuncsRec_*  PS_Table_Funcs;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_Table_FuncsRec                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A set of function pointers to manage PS_Table objects.             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    table_init    :: Used to initialize a table.                       */
+  /*                                                                       */
+  /*    table_done    :: Finalizes resp. destroy a given table.            */
+  /*                                                                       */
+  /*    table_add     :: Adds a new object to a table.                     */
+  /*                                                                       */
+  /*    table_release :: Releases table data, then finalizes it.           */
+  /*                                                                       */
+  typedef struct  PS_Table_FuncsRec_
+  {
+    FT_Error
+    (*init)( PS_Table   table,
+             FT_Int     count,
+             FT_Memory  memory );
+
+    void
+    (*done)( PS_Table  table );
+
+    FT_Error
+    (*add)( PS_Table    table,
+            FT_Int      idx,
+            void*       object,
+            FT_PtrDist  length );
+
+    void
+    (*release)( PS_Table  table );
+
+  } PS_Table_FuncsRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_TableRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A PS_Table is a simple object used to store an array of objects in */
+  /*    a single memory block.                                             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    block     :: The address in memory of the growheap's block.  This  */
+  /*                 can change between two object adds, due to            */
+  /*                 reallocation.                                         */
+  /*                                                                       */
+  /*    cursor    :: The current top of the grow heap within its block.    */
+  /*                                                                       */
+  /*    capacity  :: The current size of the heap block.  Increments by    */
+  /*                 1kByte chunks.                                        */
+  /*                                                                       */
+  /*    init      :: Set to 0xDEADBEEF if `elements' and `lengths' have    */
+  /*                 been allocated.                                       */
+  /*                                                                       */
+  /*    max_elems :: The maximum number of elements in table.              */
+  /*                                                                       */
+  /*    num_elems :: The current number of elements in table.              */
+  /*                                                                       */
+  /*    elements  :: A table of element addresses within the block.        */
+  /*                                                                       */
+  /*    lengths   :: A table of element sizes within the block.            */
+  /*                                                                       */
+  /*    memory    :: The object used for memory operations                 */
+  /*                 (alloc/realloc).                                      */
+  /*                                                                       */
+  /*    funcs     :: A table of method pointers for this object.           */
+  /*                                                                       */
+  typedef struct  PS_TableRec_
+  {
+    FT_Byte*           block;          /* current memory block           */
+    FT_Offset          cursor;         /* current cursor in memory block */
+    FT_Offset          capacity;       /* current size of memory block   */
+    FT_Long            init;
+
+    FT_Int             max_elems;
+    FT_Int             num_elems;
+    FT_Byte**          elements;       /* addresses of table elements */
+    FT_PtrDist*        lengths;        /* lengths of table elements   */
+
+    FT_Memory          memory;
+    PS_Table_FuncsRec  funcs;
+
+  } PS_TableRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       T1 FIELDS & TOKENS                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct PS_ParserRec_*  PS_Parser;
+
+  typedef struct T1_TokenRec_*   T1_Token;
+
+  typedef struct T1_FieldRec_*   T1_Field;
+
+
+  /* simple enumeration type used to identify token types */
+  typedef enum  T1_TokenType_
+  {
+    T1_TOKEN_TYPE_NONE = 0,
+    T1_TOKEN_TYPE_ANY,
+    T1_TOKEN_TYPE_STRING,
+    T1_TOKEN_TYPE_ARRAY,
+    T1_TOKEN_TYPE_KEY, /* aka `name' */
+
+    /* do not remove */
+    T1_TOKEN_TYPE_MAX
+
+  } T1_TokenType;
+
+
+  /* a simple structure used to identify tokens */
+  typedef struct  T1_TokenRec_
+  {
+    FT_Byte*      start;   /* first character of token in input stream */
+    FT_Byte*      limit;   /* first character after the token          */
+    T1_TokenType  type;    /* type of token                            */
+
+  } T1_TokenRec;
+
+
+  /* enumeration type used to identify object fields */
+  typedef enum  T1_FieldType_
+  {
+    T1_FIELD_TYPE_NONE = 0,
+    T1_FIELD_TYPE_BOOL,
+    T1_FIELD_TYPE_INTEGER,
+    T1_FIELD_TYPE_FIXED,
+    T1_FIELD_TYPE_FIXED_1000,
+    T1_FIELD_TYPE_STRING,
+    T1_FIELD_TYPE_KEY,
+    T1_FIELD_TYPE_BBOX,
+    T1_FIELD_TYPE_MM_BBOX,
+    T1_FIELD_TYPE_INTEGER_ARRAY,
+    T1_FIELD_TYPE_FIXED_ARRAY,
+    T1_FIELD_TYPE_CALLBACK,
+
+    /* do not remove */
+    T1_FIELD_TYPE_MAX
+
+  } T1_FieldType;
+
+
+  typedef enum  T1_FieldLocation_
+  {
+    T1_FIELD_LOCATION_CID_INFO,
+    T1_FIELD_LOCATION_FONT_DICT,
+    T1_FIELD_LOCATION_FONT_EXTRA,
+    T1_FIELD_LOCATION_FONT_INFO,
+    T1_FIELD_LOCATION_PRIVATE,
+    T1_FIELD_LOCATION_BBOX,
+    T1_FIELD_LOCATION_LOADER,
+    T1_FIELD_LOCATION_FACE,
+    T1_FIELD_LOCATION_BLEND,
+
+    /* do not remove */
+    T1_FIELD_LOCATION_MAX
+
+  } T1_FieldLocation;
+
+
+  typedef void
+  (*T1_Field_ParseFunc)( FT_Face     face,
+                         FT_Pointer  parser );
+
+
+  /* structure type used to model object fields */
+  typedef struct  T1_FieldRec_
+  {
+    const char*         ident;        /* field identifier               */
+    T1_FieldLocation    location;
+    T1_FieldType        type;         /* type of field                  */
+    T1_Field_ParseFunc  reader;
+    FT_UInt             offset;       /* offset of field in object      */
+    FT_Byte             size;         /* size of field in bytes         */
+    FT_UInt             array_max;    /* maximum number of elements for */
+                                      /* array                          */
+    FT_UInt             count_offset; /* offset of element count for    */
+                                      /* arrays; must not be zero if in */
+                                      /* use -- in other words, a       */
+                                      /* `num_FOO' element must not     */
+                                      /* start the used structure if we */
+                                      /* parse a `FOO' array            */
+    FT_UInt             dict;         /* where we expect it             */
+  } T1_FieldRec;
+
+#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
+#define T1_FIELD_DICT_PRIVATE  ( 1 << 1 )
+
+
+
+#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
+          {                                                 \
+            _ident, T1CODE, _type,                          \
+            0,                                              \
+            FT_FIELD_OFFSET( _fname ),                      \
+            FT_FIELD_SIZE( _fname ),                        \
+            0, 0,                                           \
+            _dict                                           \
+          },
+
+#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
+          {                                             \
+            _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \
+            (T1_Field_ParseFunc)_reader,                \
+            0, 0,                                       \
+            0, 0,                                       \
+            _dict                                       \
+          },
+
+#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
+          {                                                      \
+            _ident, T1CODE, _type,                               \
+            0,                                                   \
+            FT_FIELD_OFFSET( _fname ),                           \
+            FT_FIELD_SIZE_DELTA( _fname ),                       \
+            _max,                                                \
+            FT_FIELD_OFFSET( num_ ## _fname ),                   \
+            _dict                                                \
+          },
+
+#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
+          {                                                       \
+            _ident, T1CODE, _type,                                \
+            0,                                                    \
+            FT_FIELD_OFFSET( _fname ),                            \
+            FT_FIELD_SIZE_DELTA( _fname ),                        \
+            _max, 0,                                              \
+            _dict                                                 \
+          },
+
+
+#define T1_FIELD_BOOL( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
+
+#define T1_FIELD_NUM( _ident, _fname, _dict )                                 \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
+
+#define T1_FIELD_FIXED( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
+
+#define T1_FIELD_FIXED_1000( _ident, _fname, _dict )                     \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
+                               _dict )
+
+#define T1_FIELD_STRING( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
+
+#define T1_FIELD_KEY( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
+
+#define T1_FIELD_BBOX( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
+
+
+#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict )         \
+          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
+                              _fname, _fmax, _dict )
+
+#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict )     \
+          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
+                              _fname, _fmax, _dict )
+
+#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict )         \
+          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
+                               _fname, _fmax, _dict )
+
+#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict )     \
+          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
+                               _fname, _fmax, _dict )
+
+#define T1_FIELD_CALLBACK( _ident, _name, _dict )       \
+          T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            T1 PARSER                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef const struct PS_Parser_FuncsRec_*  PS_Parser_Funcs;
+
+  typedef struct  PS_Parser_FuncsRec_
+  {
+    void
+    (*init)( PS_Parser  parser,
+             FT_Byte*   base,
+             FT_Byte*   limit,
+             FT_Memory  memory );
+
+    void
+    (*done)( PS_Parser  parser );
+
+    void
+    (*skip_spaces)( PS_Parser  parser );
+    void
+    (*skip_PS_token)( PS_Parser  parser );
+
+    FT_Long
+    (*to_int)( PS_Parser  parser );
+    FT_Fixed
+    (*to_fixed)( PS_Parser  parser,
+                 FT_Int     power_ten );
+
+    FT_Error
+    (*to_bytes)( PS_Parser  parser,
+                 FT_Byte*   bytes,
+                 FT_Offset  max_bytes,
+                 FT_Long*   pnum_bytes,
+                 FT_Bool    delimiters );
+
+    FT_Int
+    (*to_coord_array)( PS_Parser  parser,
+                       FT_Int     max_coords,
+                       FT_Short*  coords );
+    FT_Int
+    (*to_fixed_array)( PS_Parser  parser,
+                       FT_Int     max_values,
+                       FT_Fixed*  values,
+                       FT_Int     power_ten );
+
+    void
+    (*to_token)( PS_Parser  parser,
+                 T1_Token   token );
+    void
+    (*to_token_array)( PS_Parser  parser,
+                       T1_Token   tokens,
+                       FT_UInt    max_tokens,
+                       FT_Int*    pnum_tokens );
+
+    FT_Error
+    (*load_field)( PS_Parser       parser,
+                   const T1_Field  field,
+                   void**          objects,
+                   FT_UInt         max_objects,
+                   FT_ULong*       pflags );
+
+    FT_Error
+    (*load_field_table)( PS_Parser       parser,
+                         const T1_Field  field,
+                         void**          objects,
+                         FT_UInt         max_objects,
+                         FT_ULong*       pflags );
+
+  } PS_Parser_FuncsRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_ParserRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A PS_Parser is an object used to parse a Type 1 font very quickly. */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    cursor :: The current position in the text.                        */
+  /*                                                                       */
+  /*    base   :: Start of the processed text.                             */
+  /*                                                                       */
+  /*    limit  :: End of the processed text.                               */
+  /*                                                                       */
+  /*    error  :: The last error returned.                                 */
+  /*                                                                       */
+  /*    memory :: The object used for memory operations (alloc/realloc).   */
+  /*                                                                       */
+  /*    funcs  :: A table of functions for the parser.                     */
+  /*                                                                       */
+  typedef struct  PS_ParserRec_
+  {
+    FT_Byte*   cursor;
+    FT_Byte*   base;
+    FT_Byte*   limit;
+    FT_Error   error;
+    FT_Memory  memory;
+
+    PS_Parser_FuncsRec  funcs;
+
+  } PS_ParserRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         T1 BUILDER                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct T1_BuilderRec_*  T1_Builder;
+
+
+  typedef FT_Error
+  (*T1_Builder_Check_Points_Func)( T1_Builder  builder,
+                                   FT_Int      count );
+
+  typedef void
+  (*T1_Builder_Add_Point_Func)( T1_Builder  builder,
+                                FT_Pos      x,
+                                FT_Pos      y,
+                                FT_Byte     flag );
+
+  typedef FT_Error
+  (*T1_Builder_Add_Point1_Func)( T1_Builder  builder,
+                                 FT_Pos      x,
+                                 FT_Pos      y );
+
+  typedef FT_Error
+  (*T1_Builder_Add_Contour_Func)( T1_Builder  builder );
+
+  typedef FT_Error
+  (*T1_Builder_Start_Point_Func)( T1_Builder  builder,
+                                  FT_Pos      x,
+                                  FT_Pos      y );
+
+  typedef void
+  (*T1_Builder_Close_Contour_Func)( T1_Builder  builder );
+
+
+  typedef const struct T1_Builder_FuncsRec_*  T1_Builder_Funcs;
+
+  typedef struct  T1_Builder_FuncsRec_
+  {
+    void
+    (*init)( T1_Builder    builder,
+             FT_Face       face,
+             FT_Size       size,
+             FT_GlyphSlot  slot,
+             FT_Bool       hinting );
+
+    void
+    (*done)( T1_Builder   builder );
+
+    T1_Builder_Check_Points_Func   check_points;
+    T1_Builder_Add_Point_Func      add_point;
+    T1_Builder_Add_Point1_Func     add_point1;
+    T1_Builder_Add_Contour_Func    add_contour;
+    T1_Builder_Start_Point_Func    start_point;
+    T1_Builder_Close_Contour_Func  close_contour;
+
+  } T1_Builder_FuncsRec;
+
+
+  /* an enumeration type to handle charstring parsing states */
+  typedef enum  T1_ParseState_
+  {
+    T1_Parse_Start,
+    T1_Parse_Have_Width,
+    T1_Parse_Have_Moveto,
+    T1_Parse_Have_Path
+
+  } T1_ParseState;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Structure>                                                           */
+  /*    T1_BuilderRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*     A structure used during glyph loading to store its outline.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory       :: The current memory object.                         */
+  /*                                                                       */
+  /*    face         :: The current face object.                           */
+  /*                                                                       */
+  /*    glyph        :: The current glyph slot.                            */
+  /*                                                                       */
+  /*    loader       :: XXX                                                */
+  /*                                                                       */
+  /*    base         :: The base glyph outline.                            */
+  /*                                                                       */
+  /*    current      :: The current glyph outline.                         */
+  /*                                                                       */
+  /*    max_points   :: maximum points in builder outline                  */
+  /*                                                                       */
+  /*    max_contours :: Maximum number of contours in builder outline.     */
+  /*                                                                       */
+  /*    pos_x        :: The horizontal translation (if composite glyph).   */
+  /*                                                                       */
+  /*    pos_y        :: The vertical translation (if composite glyph).     */
+  /*                                                                       */
+  /*    left_bearing :: The left side bearing point.                       */
+  /*                                                                       */
+  /*    advance      :: The horizontal advance vector.                     */
+  /*                                                                       */
+  /*    bbox         :: Unused.                                            */
+  /*                                                                       */
+  /*    parse_state  :: An enumeration which controls the charstring       */
+  /*                    parsing state.                                     */
+  /*                                                                       */
+  /*    load_points  :: If this flag is not set, no points are loaded.     */
+  /*                                                                       */
+  /*    no_recurse   :: Set but not used.                                  */
+  /*                                                                       */
+  /*    metrics_only :: A boolean indicating that we only want to compute  */
+  /*                    the metrics of a given glyph, not load all of its  */
+  /*                    points.                                            */
+  /*                                                                       */
+  /*    funcs        :: An array of function pointers for the builder.     */
+  /*                                                                       */
+  typedef struct  T1_BuilderRec_
+  {
+    FT_Memory       memory;
+    FT_Face         face;
+    FT_GlyphSlot    glyph;
+    FT_GlyphLoader  loader;
+    FT_Outline*     base;
+    FT_Outline*     current;
+
+    FT_Pos          pos_x;
+    FT_Pos          pos_y;
+
+    FT_Vector       left_bearing;
+    FT_Vector       advance;
+
+    FT_BBox         bbox;          /* bounding box */
+    T1_ParseState   parse_state;
+    FT_Bool         load_points;
+    FT_Bool         no_recurse;
+
+    FT_Bool         metrics_only;
+
+    void*           hints_funcs;    /* hinter-specific */
+    void*           hints_globals;  /* hinter-specific */
+
+    T1_Builder_FuncsRec  funcs;
+
+  } T1_BuilderRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         T1 DECODER                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */
+  /* calls during glyph loading.                                           */
+  /*                                                                       */
+#define T1_MAX_SUBRS_CALLS  8
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */
+  /* minimum of 16 is required.                                            */
+  /*                                                                       */
+#define T1_MAX_CHARSTRINGS_OPERANDS  32
+
+#endif /* 0 */
+
+
+  typedef struct  T1_Decoder_ZoneRec_
+  {
+    FT_Byte*  cursor;
+    FT_Byte*  base;
+    FT_Byte*  limit;
+
+  } T1_Decoder_ZoneRec, *T1_Decoder_Zone;
+
+
+  typedef struct T1_DecoderRec_*              T1_Decoder;
+  typedef const struct T1_Decoder_FuncsRec_*  T1_Decoder_Funcs;
+
+
+  typedef FT_Error
+  (*T1_Decoder_Callback)( T1_Decoder  decoder,
+                          FT_UInt     glyph_index );
+
+
+  typedef struct  T1_Decoder_FuncsRec_
+  {
+    FT_Error
+    (*init)( T1_Decoder           decoder,
+             FT_Face              face,
+             FT_Size              size,
+             FT_GlyphSlot         slot,
+             FT_Byte**            glyph_names,
+             PS_Blend             blend,
+             FT_Bool              hinting,
+             FT_Render_Mode       hint_mode,
+             T1_Decoder_Callback  callback );
+
+    void
+    (*done)( T1_Decoder  decoder );
+
+    FT_Error
+    (*parse_charstrings)( T1_Decoder  decoder,
+                          FT_Byte*    base,
+                          FT_UInt     len );
+
+  } T1_Decoder_FuncsRec;
+
+
+  typedef struct  T1_DecoderRec_
+  {
+    T1_BuilderRec        builder;
+
+    FT_Long              stack[T1_MAX_CHARSTRINGS_OPERANDS];
+    FT_Long*             top;
+
+    T1_Decoder_ZoneRec   zones[T1_MAX_SUBRS_CALLS + 1];
+    T1_Decoder_Zone      zone;
+
+    FT_Service_PsCMaps   psnames;      /* for seac */
+    FT_UInt              num_glyphs;
+    FT_Byte**            glyph_names;
+
+    FT_Int               lenIV;        /* internal for sub routine calls */
+    FT_UInt              num_subrs;
+    FT_Byte**            subrs;
+    FT_PtrDist*          subrs_len;    /* array of subrs length (optional) */
+
+    FT_Matrix            font_matrix;
+    FT_Vector            font_offset;
+
+    FT_Int               flex_state;
+    FT_Int               num_flex_vectors;
+    FT_Vector            flex_vectors[7];
+
+    PS_Blend             blend;       /* for multiple master support */
+
+    FT_Render_Mode       hint_mode;
+
+    T1_Decoder_Callback  parse_callback;
+    T1_Decoder_FuncsRec  funcs;
+
+    FT_Long*             buildchar;
+    FT_UInt              len_buildchar;
+
+    FT_Bool              seac;
+
+  } T1_DecoderRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            AFM PARSER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct AFM_ParserRec_*  AFM_Parser;
+
+  typedef struct  AFM_Parser_FuncsRec_
+  {
+    FT_Error
+    (*init)( AFM_Parser  parser,
+             FT_Memory   memory,
+             FT_Byte*    base,
+             FT_Byte*    limit );
+
+    void
+    (*done)( AFM_Parser  parser );
+
+    FT_Error
+    (*parse)( AFM_Parser  parser );
+
+  } AFM_Parser_FuncsRec;
+
+
+  typedef struct AFM_StreamRec_*  AFM_Stream;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    AFM_ParserRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An AFM_Parser is a parser for the AFM files.                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory    :: The object used for memory operations (alloc and      */
+  /*                 realloc).                                             */
+  /*                                                                       */
+  /*    stream    :: This is an opaque object.                             */
+  /*                                                                       */
+  /*    FontInfo  :: The result will be stored here.                       */
+  /*                                                                       */
+  /*    get_index :: A user provided function to get a glyph index by its  */
+  /*                 name.                                                 */
+  /*                                                                       */
+  typedef struct  AFM_ParserRec_
+  {
+    FT_Memory     memory;
+    AFM_Stream    stream;
+
+    AFM_FontInfo  FontInfo;
+
+    FT_Int
+    (*get_index)( const char*  name,
+                  FT_Offset    len,
+                  void*        user_data );
+
+    void*         user_data;
+
+  } AFM_ParserRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     TYPE1 CHARMAPS                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef const struct T1_CMap_ClassesRec_*  T1_CMap_Classes;
+
+  typedef struct T1_CMap_ClassesRec_
+  {
+    FT_CMap_Class  standard;
+    FT_CMap_Class  expert;
+    FT_CMap_Class  custom;
+    FT_CMap_Class  unicode;
+
+  } T1_CMap_ClassesRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        PSAux Module Interface                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  PSAux_ServiceRec_
+  {
+    /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */
+    const PS_Table_FuncsRec*    ps_table_funcs;
+    const PS_Parser_FuncsRec*   ps_parser_funcs;
+    const T1_Builder_FuncsRec*  t1_builder_funcs;
+    const T1_Decoder_FuncsRec*  t1_decoder_funcs;
+
+    void
+    (*t1_decrypt)( FT_Byte*   buffer,
+                   FT_Offset  length,
+                   FT_UShort  seed );
+
+    T1_CMap_Classes  t1_cmap_classes;
+
+    /* fields after this comment line were added after version 2.1.10 */
+    const AFM_Parser_FuncsRec*  afm_parser_funcs;
+
+  } PSAux_ServiceRec, *PSAux_Service;
+
+  /* backwards-compatible type definition */
+  typedef PSAux_ServiceRec   PSAux_Interface;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                 Some convenience functions                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define IS_PS_NEWLINE( ch ) \
+  ( (ch) == '\r' ||         \
+    (ch) == '\n' )
+
+#define IS_PS_SPACE( ch )  \
+  ( (ch) == ' '         || \
+    IS_PS_NEWLINE( ch ) || \
+    (ch) == '\t'        || \
+    (ch) == '\f'        || \
+    (ch) == '\0' )
+
+#define IS_PS_SPECIAL( ch )       \
+  ( (ch) == '/'                || \
+    (ch) == '(' || (ch) == ')' || \
+    (ch) == '<' || (ch) == '>' || \
+    (ch) == '[' || (ch) == ']' || \
+    (ch) == '{' || (ch) == '}' || \
+    (ch) == '%'                )
+
+#define IS_PS_DELIM( ch )  \
+  ( IS_PS_SPACE( ch )   || \
+    IS_PS_SPECIAL( ch ) )
+
+#define IS_PS_DIGIT( ch )        \
+  ( (ch) >= '0' && (ch) <= '9' )
+
+#define IS_PS_XDIGIT( ch )            \
+  ( IS_PS_DIGIT( ch )              || \
+    ( (ch) >= 'A' && (ch) <= 'F' ) || \
+    ( (ch) >= 'a' && (ch) <= 'f' ) )
+
+#define IS_PS_BASE85( ch )       \
+  ( (ch) >= '!' && (ch) <= 'u' )
+
+#define IS_PS_TOKEN( cur, limit, token )                                \
+  ( (char)(cur)[0] == (token)[0]                                     && \
+    ( (cur) + sizeof ( (token) ) == (limit) ||                          \
+      ( (cur) + sizeof( (token) ) < (limit)          &&                 \
+        IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) )             && \
+    ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )
+
+
+FT_END_HEADER
+
+#endif /* __PSAUX_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/pshints.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/pshints.h
new file mode 100644
index 0000000..f9b5940
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/pshints.h
@@ -0,0 +1,722 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshints.h                                                              */
+/*                                                                         */
+/*    Interface to Postscript-specific (Type 1 and Type 2) hints           */
+/*    recorders (specification only).  These are used to support native    */
+/*    T1/T2 hints in the `type1', `cid', and `cff' font drivers.           */
+/*                                                                         */
+/*  Copyright 2001-2003, 2005-2007, 2009, 2012 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSHINTS_H__
+#define __PSHINTS_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+#include "../t1tables.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****               INTERNAL REPRESENTATION OF GLOBALS              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct PSH_GlobalsRec_*  PSH_Globals;
+
+  typedef FT_Error
+  (*PSH_Globals_NewFunc)( FT_Memory     memory,
+                          T1_Private*   private_dict,
+                          PSH_Globals*  aglobals );
+
+  typedef FT_Error
+  (*PSH_Globals_SetScaleFunc)( PSH_Globals  globals,
+                               FT_Fixed     x_scale,
+                               FT_Fixed     y_scale,
+                               FT_Fixed     x_delta,
+                               FT_Fixed     y_delta );
+
+  typedef void
+  (*PSH_Globals_DestroyFunc)( PSH_Globals  globals );
+
+
+  typedef struct  PSH_Globals_FuncsRec_
+  {
+    PSH_Globals_NewFunc       create;
+    PSH_Globals_SetScaleFunc  set_scale;
+    PSH_Globals_DestroyFunc   destroy;
+
+  } PSH_Globals_FuncsRec, *PSH_Globals_Funcs;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  PUBLIC TYPE 1 HINTS RECORDER                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************
+   *
+   * @type:
+   *   T1_Hints
+   *
+   * @description:
+   *   This is a handle to an opaque structure used to record glyph hints
+   *   from a Type 1 character glyph character string.
+   *
+   *   The methods used to operate on this object are defined by the
+   *   @T1_Hints_FuncsRec structure.  Recording glyph hints is normally
+   *   achieved through the following scheme:
+   *
+   *   - Open a new hint recording session by calling the `open' method.
+   *     This rewinds the recorder and prepare it for new input.
+   *
+   *   - For each hint found in the glyph charstring, call the corresponding
+   *     method (`stem', `stem3', or `reset').  Note that these functions do
+   *     not return an error code.
+   *
+   *   - Close the recording session by calling the `close' method.  It
+   *     returns an error code if the hints were invalid or something
+   *     strange happened (e.g., memory shortage).
+   *
+   *   The hints accumulated in the object can later be used by the
+   *   PostScript hinter.
+   *
+   */
+  typedef struct T1_HintsRec_*  T1_Hints;
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   T1_Hints_Funcs
+   *
+   * @description:
+   *   A pointer to the @T1_Hints_FuncsRec structure that defines the API of
+   *   a given @T1_Hints object.
+   *
+   */
+  typedef const struct T1_Hints_FuncsRec_*  T1_Hints_Funcs;
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_OpenFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to prepare it for a new Type 1
+   *   hints recording session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   * @note:
+   *   You should always call the @T1_Hints_CloseFunc method in order to
+   *   close an opened recording session.
+   *
+   */
+  typedef void
+  (*T1_Hints_OpenFunc)( T1_Hints  hints );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_SetStemFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to record a new horizontal or
+   *   vertical stem.  This corresponds to the Type 1 `hstem' and `vstem'
+   *   operators.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   dimension ::
+   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).
+   *
+   *   coords ::
+   *     Array of 2 coordinates in 16.16 format, used as (position,length)
+   *     stem descriptor.
+   *
+   * @note:
+   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use
+   *   horizontal coordinates (x) for vertical stems (dim=1).
+   *
+   *   `coords[0]' is the absolute stem position (lowest coordinate);
+   *   `coords[1]' is the length.
+   *
+   *   The length can be negative, in which case it must be either -20 or
+   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1
+   *   specification.
+   *
+   *   If the length is -21 (corresponding to a bottom ghost stem), then
+   *   the real stem position is `coords[0]+coords[1]'.
+   *
+   */
+  typedef void
+  (*T1_Hints_SetStemFunc)( T1_Hints   hints,
+                           FT_UInt    dimension,
+                           FT_Fixed*  coords );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_SetStem3Func
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to record three
+   *   counter-controlled horizontal or vertical stems at once.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   dimension ::
+   *     0 for horizontal stems, 1 for vertical ones.
+   *
+   *   coords ::
+   *     An array of 6 values in 16.16 format, holding 3 (position,length)
+   *     pairs for the counter-controlled stems.
+   *
+   * @note:
+   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use
+   *   horizontal coordinates (x) for vertical stems (dim=1).
+   *
+   *   The lengths cannot be negative (ghost stems are never
+   *   counter-controlled).
+   *
+   */
+  typedef void
+  (*T1_Hints_SetStem3Func)( T1_Hints   hints,
+                            FT_UInt    dimension,
+                            FT_Fixed*  coords );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_ResetFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to reset the stems hints in a
+   *   recording session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   end_point ::
+   *     The index of the last point in the input glyph in which the
+   *     previously defined hints apply.
+   *
+   */
+  typedef void
+  (*T1_Hints_ResetFunc)( T1_Hints  hints,
+                         FT_UInt   end_point );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_CloseFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to close a hint recording
+   *   session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   end_point ::
+   *     The index of the last point in the input glyph.
+   *
+   * @return:
+   *   FreeType error code.  0 means success.
+   *
+   * @note:
+   *   The error code is set to indicate that an error occurred during the
+   *   recording session.
+   *
+   */
+  typedef FT_Error
+  (*T1_Hints_CloseFunc)( T1_Hints  hints,
+                         FT_UInt   end_point );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_ApplyFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to apply hints to the
+   *   corresponding glyph outline.  Must be called once all hints have been
+   *   recorded.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   outline ::
+   *     A pointer to the target outline descriptor.
+   *
+   *   globals ::
+   *     The hinter globals for this font.
+   *
+   *   hint_mode ::
+   *     Hinting information.
+   *
+   * @return:
+   *   FreeType error code.  0 means success.
+   *
+   * @note:
+   *   On input, all points within the outline are in font coordinates. On
+   *   output, they are in 1/64th of pixels.
+   *
+   *   The scaling transformation is taken from the `globals' object which
+   *   must correspond to the same font as the glyph.
+   *
+   */
+  typedef FT_Error
+  (*T1_Hints_ApplyFunc)( T1_Hints        hints,
+                         FT_Outline*     outline,
+                         PSH_Globals     globals,
+                         FT_Render_Mode  hint_mode );
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   T1_Hints_FuncsRec
+   *
+   * @description:
+   *   The structure used to provide the API to @T1_Hints objects.
+   *
+   * @fields:
+   *   hints ::
+   *     A handle to the T1 Hints recorder.
+   *
+   *   open ::
+   *     The function to open a recording session.
+   *
+   *   close ::
+   *     The function to close a recording session.
+   *
+   *   stem ::
+   *     The function to set a simple stem.
+   *
+   *   stem3 ::
+   *     The function to set counter-controlled stems.
+   *
+   *   reset ::
+   *     The function to reset stem hints.
+   *
+   *   apply ::
+   *     The function to apply the hints to the corresponding glyph outline.
+   *
+   */
+  typedef struct  T1_Hints_FuncsRec_
+  {
+    T1_Hints               hints;
+    T1_Hints_OpenFunc      open;
+    T1_Hints_CloseFunc     close;
+    T1_Hints_SetStemFunc   stem;
+    T1_Hints_SetStem3Func  stem3;
+    T1_Hints_ResetFunc     reset;
+    T1_Hints_ApplyFunc     apply;
+
+  } T1_Hints_FuncsRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  PUBLIC TYPE 2 HINTS RECORDER                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************
+   *
+   * @type:
+   *   T2_Hints
+   *
+   * @description:
+   *   This is a handle to an opaque structure used to record glyph hints
+   *   from a Type 2 character glyph character string.
+   *
+   *   The methods used to operate on this object are defined by the
+   *   @T2_Hints_FuncsRec structure.  Recording glyph hints is normally
+   *   achieved through the following scheme:
+   *
+   *   - Open a new hint recording session by calling the `open' method.
+   *     This rewinds the recorder and prepare it for new input.
+   *
+   *   - For each hint found in the glyph charstring, call the corresponding
+   *     method (`stems', `hintmask', `counters').  Note that these
+   *     functions do not return an error code.
+   *
+   *   - Close the recording session by calling the `close' method.  It
+   *     returns an error code if the hints were invalid or something
+   *     strange happened (e.g., memory shortage).
+   *
+   *   The hints accumulated in the object can later be used by the
+   *   Postscript hinter.
+   *
+   */
+  typedef struct T2_HintsRec_*  T2_Hints;
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   T2_Hints_Funcs
+   *
+   * @description:
+   *   A pointer to the @T2_Hints_FuncsRec structure that defines the API of
+   *   a given @T2_Hints object.
+   *
+   */
+  typedef const struct T2_Hints_FuncsRec_*  T2_Hints_Funcs;
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_OpenFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to prepare it for a new Type 2
+   *   hints recording session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   * @note:
+   *   You should always call the @T2_Hints_CloseFunc method in order to
+   *   close an opened recording session.
+   *
+   */
+  typedef void
+  (*T2_Hints_OpenFunc)( T2_Hints  hints );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_StemsFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to set the table of stems in
+   *   either the vertical or horizontal dimension.  Equivalent to the
+   *   `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   dimension ::
+   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).
+   *
+   *   count ::
+   *     The number of stems.
+   *
+   *   coords ::
+   *     An array of `count' (position,length) pairs in 16.16 format.
+   *
+   * @note:
+   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use
+   *   horizontal coordinates (x) for vertical stems (dim=1).
+   *
+   *   There are `2*count' elements in the `coords' array.  Each even
+   *   element is an absolute position in font units, each odd element is a
+   *   length in font units.
+   *
+   *   A length can be negative, in which case it must be either -20 or
+   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1
+   *   specification.
+   *
+   */
+  typedef void
+  (*T2_Hints_StemsFunc)( T2_Hints   hints,
+                         FT_UInt    dimension,
+                         FT_UInt    count,
+                         FT_Fixed*  coordinates );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_MaskFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to set a given hintmask (this
+   *   corresponds to the `hintmask' Type 2 operator).
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   end_point ::
+   *     The glyph index of the last point to which the previously defined
+   *     or activated hints apply.
+   *
+   *   bit_count ::
+   *     The number of bits in the hint mask.
+   *
+   *   bytes ::
+   *     An array of bytes modelling the hint mask.
+   *
+   * @note:
+   *   If the hintmask starts the charstring (before any glyph point
+   *   definition), the value of `end_point' should be 0.
+   *
+   *   `bit_count' is the number of meaningful bits in the `bytes' array; it
+   *   must be equal to the total number of hints defined so far (i.e.,
+   *   horizontal+verticals).
+   *
+   *   The `bytes' array can come directly from the Type 2 charstring and
+   *   respects the same format.
+   *
+   */
+  typedef void
+  (*T2_Hints_MaskFunc)( T2_Hints        hints,
+                        FT_UInt         end_point,
+                        FT_UInt         bit_count,
+                        const FT_Byte*  bytes );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_CounterFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to set a given counter mask
+   *   (this corresponds to the `hintmask' Type 2 operator).
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   end_point ::
+   *     A glyph index of the last point to which the previously defined or
+   *     active hints apply.
+   *
+   *   bit_count ::
+   *     The number of bits in the hint mask.
+   *
+   *   bytes ::
+   *     An array of bytes modelling the hint mask.
+   *
+   * @note:
+   *   If the hintmask starts the charstring (before any glyph point
+   *   definition), the value of `end_point' should be 0.
+   *
+   *   `bit_count' is the number of meaningful bits in the `bytes' array; it
+   *   must be equal to the total number of hints defined so far (i.e.,
+   *   horizontal+verticals).
+   *
+   *    The `bytes' array can come directly from the Type 2 charstring and
+   *    respects the same format.
+   *
+   */
+  typedef void
+  (*T2_Hints_CounterFunc)( T2_Hints        hints,
+                           FT_UInt         bit_count,
+                           const FT_Byte*  bytes );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_CloseFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to close a hint recording
+   *   session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   end_point ::
+   *     The index of the last point in the input glyph.
+   *
+   * @return:
+   *   FreeType error code.  0 means success.
+   *
+   * @note:
+   *   The error code is set to indicate that an error occurred during the
+   *   recording session.
+   *
+   */
+  typedef FT_Error
+  (*T2_Hints_CloseFunc)( T2_Hints  hints,
+                         FT_UInt   end_point );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_ApplyFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to apply hints to the
+   *   corresponding glyph outline.  Must be called after the `close'
+   *   method.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   outline ::
+   *     A pointer to the target outline descriptor.
+   *
+   *   globals ::
+   *     The hinter globals for this font.
+   *
+   *   hint_mode ::
+   *     Hinting information.
+   *
+   * @return:
+   *   FreeType error code.  0 means success.
+   *
+   * @note:
+   *   On input, all points within the outline are in font coordinates. On
+   *   output, they are in 1/64th of pixels.
+   *
+   *   The scaling transformation is taken from the `globals' object which
+   *   must correspond to the same font than the glyph.
+   *
+   */
+  typedef FT_Error
+  (*T2_Hints_ApplyFunc)( T2_Hints        hints,
+                         FT_Outline*     outline,
+                         PSH_Globals     globals,
+                         FT_Render_Mode  hint_mode );
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   T2_Hints_FuncsRec
+   *
+   * @description:
+   *   The structure used to provide the API to @T2_Hints objects.
+   *
+   * @fields:
+   *   hints ::
+   *     A handle to the T2 hints recorder object.
+   *
+   *   open ::
+   *     The function to open a recording session.
+   *
+   *   close ::
+   *     The function to close a recording session.
+   *
+   *   stems ::
+   *     The function to set the dimension's stems table.
+   *
+   *   hintmask ::
+   *     The function to set hint masks.
+   *
+   *   counter ::
+   *     The function to set counter masks.
+   *
+   *   apply ::
+   *     The function to apply the hints on the corresponding glyph outline.
+   *
+   */
+  typedef struct  T2_Hints_FuncsRec_
+  {
+    T2_Hints              hints;
+    T2_Hints_OpenFunc     open;
+    T2_Hints_CloseFunc    close;
+    T2_Hints_StemsFunc    stems;
+    T2_Hints_MaskFunc     hintmask;
+    T2_Hints_CounterFunc  counter;
+    T2_Hints_ApplyFunc    apply;
+
+  } T2_Hints_FuncsRec;
+
+
+  /* */
+
+
+  typedef struct  PSHinter_Interface_
+  {
+    PSH_Globals_Funcs  (*get_globals_funcs)( FT_Module  module );
+    T1_Hints_Funcs     (*get_t1_funcs)     ( FT_Module  module );
+    T2_Hints_Funcs     (*get_t2_funcs)     ( FT_Module  module );
+
+  } PSHinter_Interface;
+
+  typedef PSHinter_Interface*  PSHinter_Service;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_PSHINTER_INTERFACE(        \
+          class_,                            \
+          get_globals_funcs_,                \
+          get_t1_funcs_,                     \
+          get_t2_funcs_ )                    \
+  static const PSHinter_Interface  class_ =  \
+  {                                          \
+    get_globals_funcs_,                      \
+    get_t1_funcs_,                           \
+    get_t2_funcs_                            \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_PSHINTER_INTERFACE(                      \
+          class_,                                          \
+          get_globals_funcs_,                              \
+          get_t1_funcs_,                                   \
+          get_t2_funcs_ )                                  \
+  void                                                     \
+  FT_Init_Class_ ## class_( FT_Library           library,  \
+                            PSHinter_Interface*  clazz )   \
+  {                                                        \
+    FT_UNUSED( library );                                  \
+                                                           \
+    clazz->get_globals_funcs = get_globals_funcs_;         \
+    clazz->get_t1_funcs      = get_t1_funcs_;              \
+    clazz->get_t2_funcs      = get_t2_funcs_;              \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __PSHINTS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svbdf.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svbdf.h
new file mode 100644
index 0000000..508bd15
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svbdf.h
@@ -0,0 +1,82 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svbdf.h                                                                */
+/*                                                                         */
+/*    The FreeType BDF services (specification).                           */
+/*                                                                         */
+/*  Copyright 2003, 2009, 2012 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVBDF_H__
+#define __SVBDF_H__
+
+#include "../../ftbdf.h"
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_BDF  "bdf"
+
+  typedef FT_Error
+  (*FT_BDF_GetCharsetIdFunc)( FT_Face       face,
+                              const char*  *acharset_encoding,
+                              const char*  *acharset_registry );
+
+  typedef FT_Error
+  (*FT_BDF_GetPropertyFunc)( FT_Face           face,
+                             const char*       prop_name,
+                             BDF_PropertyRec  *aproperty );
+
+
+  FT_DEFINE_SERVICE( BDF )
+  {
+    FT_BDF_GetCharsetIdFunc  get_charset_id;
+    FT_BDF_GetPropertyFunc   get_property;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_BDFRec( class_,                                \
+                                  get_charset_id_,                       \
+                                  get_property_ )                        \
+  static const FT_Service_BDFRec  class_ =                               \
+  {                                                                      \
+    get_charset_id_, get_property_                                       \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_BDFRec( class_,                                \
+                                  get_charset_id_,                       \
+                                  get_property_ )                        \
+  void                                                                   \
+  FT_Init_Class_ ## class_( FT_Service_BDFRec*  clazz )                  \
+  {                                                                      \
+    clazz->get_charset_id = get_charset_id_;                             \
+    clazz->get_property   = get_property_;                               \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVBDF_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svcid.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svcid.h
new file mode 100644
index 0000000..fe33c74
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svcid.h
@@ -0,0 +1,89 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svcid.h                                                                */
+/*                                                                         */
+/*    The FreeType CID font services (specification).                      */
+/*                                                                         */
+/*  Copyright 2007, 2009, 2012 by Derek Clegg, Michael Toftdal.            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVCID_H__
+#define __SVCID_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_CID  "CID"
+
+  typedef FT_Error
+  (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face       face,
+                                               const char*  *registry,
+                                               const char*  *ordering,
+                                               FT_Int       *supplement );
+  typedef FT_Error
+  (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face   face,
+                                         FT_Bool  *is_cid );
+  typedef FT_Error
+  (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face   face,
+                                      FT_UInt   glyph_index,
+                                      FT_UInt  *cid );
+
+  FT_DEFINE_SERVICE( CID )
+  {
+    FT_CID_GetRegistryOrderingSupplementFunc  get_ros;
+    FT_CID_GetIsInternallyCIDKeyedFunc        get_is_cid;
+    FT_CID_GetCIDFromGlyphIndexFunc           get_cid_from_glyph_index;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \
+                                  get_ros_,                                 \
+                                  get_is_cid_,                              \
+                                  get_cid_from_glyph_index_ )               \
+  static const FT_Service_CIDRec class_ =                                   \
+  {                                                                         \
+    get_ros_, get_is_cid_, get_cid_from_glyph_index_                        \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \
+                                  get_ros_,                                 \
+                                  get_is_cid_,                              \
+                                  get_cid_from_glyph_index_ )               \
+  void                                                                      \
+  FT_Init_Class_ ## class_( FT_Library          library,                    \
+                            FT_Service_CIDRec*  clazz )                     \
+  {                                                                         \
+    FT_UNUSED( library );                                                   \
+                                                                            \
+    clazz->get_ros                  = get_ros_;                             \
+    clazz->get_is_cid               = get_is_cid_;                          \
+    clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_;            \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVCID_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgldict.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgldict.h
new file mode 100644
index 0000000..9956f74
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgldict.h
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svgldict.h                                                             */
+/*                                                                         */
+/*    The FreeType glyph dictionary services (specification).              */
+/*                                                                         */
+/*  Copyright 2003, 2009, 2012 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVGLDICT_H__
+#define __SVGLDICT_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  A service used to retrieve glyph names, as well as to find the
+   *  index of a given glyph name in a font.
+   *
+   */
+
+#define FT_SERVICE_ID_GLYPH_DICT  "glyph-dict"
+
+
+  typedef FT_Error
+  (*FT_GlyphDict_GetNameFunc)( FT_Face     face,
+                               FT_UInt     glyph_index,
+                               FT_Pointer  buffer,
+                               FT_UInt     buffer_max );
+
+  typedef FT_UInt
+  (*FT_GlyphDict_NameIndexFunc)( FT_Face     face,
+                                 FT_String*  glyph_name );
+
+
+  FT_DEFINE_SERVICE( GlyphDict )
+  {
+    FT_GlyphDict_GetNameFunc    get_name;
+    FT_GlyphDict_NameIndexFunc  name_index;  /* optional */
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \
+                                        get_name_,                     \
+                                        name_index_)                   \
+  static const FT_Service_GlyphDictRec  class_ =                       \
+  {                                                                    \
+    get_name_, name_index_                                             \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \
+                                        get_name_,                     \
+                                        name_index_)                   \
+  void                                                                 \
+  FT_Init_Class_ ## class_( FT_Library                library,         \
+                            FT_Service_GlyphDictRec*  clazz )          \
+  {                                                                    \
+    FT_UNUSED( library );                                              \
+                                                                       \
+    clazz->get_name   = get_name_;                                     \
+    clazz->name_index = name_index_;                                   \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVGLDICT_H__ */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgxval.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgxval.h
new file mode 100644
index 0000000..277b6a9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgxval.h
@@ -0,0 +1,72 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svgxval.h                                                              */
+/*                                                                         */
+/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */
+/*                                                                         */
+/*  Copyright 2004, 2005 by                                                */
+/*  Masatake YAMATO, Red Hat K.K.,                                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVGXVAL_H__
+#define __SVGXVAL_H__
+
+#include "../../ftgxval.h"
+#include "../ftvalid.h"
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_GX_VALIDATE           "truetypegx-validate"
+#define FT_SERVICE_ID_CLASSICKERN_VALIDATE  "classickern-validate"
+
+  typedef FT_Error
+  (*gxv_validate_func)( FT_Face   face,
+                        FT_UInt   gx_flags,
+                        FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
+                        FT_UInt   table_length );
+
+
+  typedef FT_Error
+  (*ckern_validate_func)( FT_Face   face,
+                          FT_UInt   ckern_flags,
+                          FT_Bytes  *ckern_table );
+
+
+  FT_DEFINE_SERVICE( GXvalidate )
+  {
+    gxv_validate_func  validate;
+  };
+
+  FT_DEFINE_SERVICE( CKERNvalidate )
+  {
+    ckern_validate_func  validate;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVGXVAL_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svkern.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svkern.h
new file mode 100644
index 0000000..da03fef
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svkern.h
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svkern.h                                                               */
+/*                                                                         */
+/*    The FreeType Kerning service (specification).                        */
+/*                                                                         */
+/*  Copyright 2006 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVKERN_H__
+#define __SVKERN_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+#define FT_SERVICE_ID_KERNING  "kerning"
+
+
+  typedef FT_Error
+  (*FT_Kerning_TrackGetFunc)( FT_Face    face,
+                              FT_Fixed   point_size,
+                              FT_Int     degree,
+                              FT_Fixed*  akerning );
+
+  FT_DEFINE_SERVICE( Kerning )
+  {
+    FT_Kerning_TrackGetFunc  get_track;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVKERN_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svmm.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svmm.h
new file mode 100644
index 0000000..100ff87
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svmm.h
@@ -0,0 +1,113 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svmm.h                                                                 */
+/*                                                                         */
+/*    The FreeType Multiple Masters and GX var services (specification).   */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2009, 2012 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVMM_H__
+#define __SVMM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  A service used to manage multiple-masters data in a given face.
+   *
+   *  See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H).
+   *
+   */
+
+#define FT_SERVICE_ID_MULTI_MASTERS  "multi-masters"
+
+
+  typedef FT_Error
+  (*FT_Get_MM_Func)( FT_Face           face,
+                     FT_Multi_Master*  master );
+
+  typedef FT_Error
+  (*FT_Get_MM_Var_Func)( FT_Face      face,
+                         FT_MM_Var*  *master );
+
+  typedef FT_Error
+  (*FT_Set_MM_Design_Func)( FT_Face   face,
+                            FT_UInt   num_coords,
+                            FT_Long*  coords );
+
+  typedef FT_Error
+  (*FT_Set_Var_Design_Func)( FT_Face    face,
+                             FT_UInt    num_coords,
+                             FT_Fixed*  coords );
+
+  typedef FT_Error
+  (*FT_Set_MM_Blend_Func)( FT_Face   face,
+                           FT_UInt   num_coords,
+                           FT_Long*  coords );
+
+
+  FT_DEFINE_SERVICE( MultiMasters )
+  {
+    FT_Get_MM_Func          get_mm;
+    FT_Set_MM_Design_Func   set_mm_design;
+    FT_Set_MM_Blend_Func    set_mm_blend;
+    FT_Get_MM_Var_Func      get_mm_var;
+    FT_Set_Var_Design_Func  set_var_design;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \
+                                           get_mm_,                         \
+                                           set_mm_design_,                  \
+                                           set_mm_blend_,                   \
+                                           get_mm_var_,                     \
+                                           set_var_design_ )                \
+  static const FT_Service_MultiMastersRec  class_ =                         \
+  {                                                                         \
+    get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_    \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \
+                                           get_mm_,                         \
+                                           set_mm_design_,                  \
+                                           set_mm_blend_,                   \
+                                           get_mm_var_,                     \
+                                           set_var_design_ )                \
+  void                                                                      \
+  FT_Init_Class_ ## class_( FT_Service_MultiMastersRec*  clazz )            \
+  {                                                                         \
+    clazz->get_mm         = get_mm_;                                        \
+    clazz->set_mm_design  = set_mm_design_;                                 \
+    clazz->set_mm_blend   = set_mm_blend_;                                  \
+    clazz->get_mm_var     = get_mm_var_;                                    \
+    clazz->set_var_design = set_var_design_;                                \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVMM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svotval.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svotval.h
new file mode 100644
index 0000000..37cd34f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svotval.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svotval.h                                                              */
+/*                                                                         */
+/*    The FreeType OpenType validation service (specification).            */
+/*                                                                         */
+/*  Copyright 2004, 2006 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVOTVAL_H__
+#define __SVOTVAL_H__
+
+#include "../../ftotval.h"
+#include "../ftvalid.h"
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_OPENTYPE_VALIDATE  "opentype-validate"
+
+
+  typedef FT_Error
+  (*otv_validate_func)( FT_Face volatile  face,
+                        FT_UInt           ot_flags,
+                        FT_Bytes         *base,
+                        FT_Bytes         *gdef,
+                        FT_Bytes         *gpos,
+                        FT_Bytes         *gsub,
+                        FT_Bytes         *jstf );
+
+
+  FT_DEFINE_SERVICE( OTvalidate )
+  {
+    otv_validate_func  validate;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVOTVAL_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpfr.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpfr.h
new file mode 100644
index 0000000..21a00d3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpfr.h
@@ -0,0 +1,66 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svpfr.h                                                                */
+/*                                                                         */
+/*    Internal PFR service functions (specification).                      */
+/*                                                                         */
+/*  Copyright 2003, 2006 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPFR_H__
+#define __SVPFR_H__
+
+#include "../../ftpfr.h"
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_PFR_METRICS  "pfr-metrics"
+
+
+  typedef FT_Error
+  (*FT_PFR_GetMetricsFunc)( FT_Face    face,
+                            FT_UInt   *aoutline,
+                            FT_UInt   *ametrics,
+                            FT_Fixed  *ax_scale,
+                            FT_Fixed  *ay_scale );
+
+  typedef FT_Error
+  (*FT_PFR_GetKerningFunc)( FT_Face     face,
+                            FT_UInt     left,
+                            FT_UInt     right,
+                            FT_Vector  *avector );
+
+  typedef FT_Error
+  (*FT_PFR_GetAdvanceFunc)( FT_Face   face,
+                            FT_UInt   gindex,
+                            FT_Pos   *aadvance );
+
+
+  FT_DEFINE_SERVICE( PfrMetrics )
+  {
+    FT_PFR_GetMetricsFunc  get_metrics;
+    FT_PFR_GetKerningFunc  get_kerning;
+    FT_PFR_GetAdvanceFunc  get_advance;
+
+  };
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __SVPFR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpostnm.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpostnm.h
new file mode 100644
index 0000000..7fe8603
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpostnm.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svpostnm.h                                                             */
+/*                                                                         */
+/*    The FreeType PostScript name services (specification).               */
+/*                                                                         */
+/*  Copyright 2003, 2007, 2009, 2012 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPOSTNM_H__
+#define __SVPOSTNM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+  /*
+   *  A trivial service used to retrieve the PostScript name of a given
+   *  font when available.  The `get_name' field should never be NULL.
+   *
+   *  The corresponding function can return NULL to indicate that the
+   *  PostScript name is not available.
+   *
+   *  The name is owned by the face and will be destroyed with it.
+   */
+
+#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME  "postscript-font-name"
+
+
+  typedef const char*
+  (*FT_PsName_GetFunc)( FT_Face  face );
+
+
+  FT_DEFINE_SERVICE( PsFontName )
+  {
+    FT_PsName_GetFunc  get_ps_font_name;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+  static const FT_Service_PsFontNameRec  class_ =                    \
+  {                                                                  \
+    get_ps_font_name_                                                \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+  void                                                               \
+  FT_Init_Class_ ## class_( FT_Library                 library,      \
+                            FT_Service_PsFontNameRec*  clazz )       \
+  {                                                                  \
+    FT_UNUSED( library );                                            \
+                                                                     \
+    clazz->get_ps_font_name = get_ps_font_name_;                     \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPOSTNM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svprop.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svprop.h
new file mode 100644
index 0000000..22da0bb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svprop.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svprop.h                                                               */
+/*                                                                         */
+/*    The FreeType property service (specification).                       */
+/*                                                                         */
+/*  Copyright 2012 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPROP_H__
+#define __SVPROP_H__
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_PROPERTIES  "properties"
+
+
+  typedef FT_Error
+  (*FT_Properties_SetFunc)( FT_Module    module,
+                            const char*  property_name,
+                            const void*  value );
+
+  typedef FT_Error
+  (*FT_Properties_GetFunc)( FT_Module    module,
+                            const char*  property_name,
+                            void*        value );
+
+
+  FT_DEFINE_SERVICE( Properties )
+  {
+    FT_Properties_SetFunc  set_property;
+    FT_Properties_GetFunc  get_property;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PROPERTIESREC( class_,          \
+                                         set_property_,   \
+                                         get_property_ )  \
+  static const FT_Service_PropertiesRec  class_ =         \
+  {                                                       \
+    set_property_,                                        \
+    get_property_                                         \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PROPERTIESREC( class_,                \
+                                         set_property_,         \
+                                         get_property_ )        \
+  void                                                          \
+  FT_Init_Class_ ## class_( FT_Service_PropertiesRec*  clazz )  \
+  {                                                             \
+    clazz->set_property = set_property_;                        \
+    clazz->get_property = get_property_;                        \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPROP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpscmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpscmap.h
new file mode 100644
index 0000000..592d14f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpscmap.h
@@ -0,0 +1,177 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svpscmap.h                                                             */
+/*                                                                         */
+/*    The FreeType PostScript charmap service (specification).             */
+/*                                                                         */
+/*  Copyright 2003, 2006, 2009, 2012 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPSCMAP_H__
+#define __SVPSCMAP_H__
+
+#include "../ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_POSTSCRIPT_CMAPS  "postscript-cmaps"
+
+
+  /*
+   *  Adobe glyph name to unicode value.
+   */
+  typedef FT_UInt32
+  (*PS_Unicode_ValueFunc)( const char*  glyph_name );
+
+  /*
+   *  Macintosh name id to glyph name.  NULL if invalid index.
+   */
+  typedef const char*
+  (*PS_Macintosh_NameFunc)( FT_UInt  name_index );
+
+  /*
+   *  Adobe standard string ID to glyph name.  NULL if invalid index.
+   */
+  typedef const char*
+  (*PS_Adobe_Std_StringsFunc)( FT_UInt  string_index );
+
+
+  /*
+   *  Simple unicode -> glyph index charmap built from font glyph names
+   *  table.
+   */
+  typedef struct  PS_UniMap_
+  {
+    FT_UInt32  unicode;      /* bit 31 set: is glyph variant */
+    FT_UInt    glyph_index;
+
+  } PS_UniMap;
+
+
+  typedef struct PS_UnicodesRec_*  PS_Unicodes;
+
+  typedef struct  PS_UnicodesRec_
+  {
+    FT_CMapRec  cmap;
+    FT_UInt     num_maps;
+    PS_UniMap*  maps;
+
+  } PS_UnicodesRec;
+
+
+  /*
+   *  A function which returns a glyph name for a given index.  Returns
+   *  NULL if invalid index.
+   */
+  typedef const char*
+  (*PS_GetGlyphNameFunc)( FT_Pointer  data,
+                          FT_UInt     string_index );
+
+  /*
+   *  A function used to release the glyph name returned by
+   *  PS_GetGlyphNameFunc, when needed
+   */
+  typedef void
+  (*PS_FreeGlyphNameFunc)( FT_Pointer  data,
+                           const char*  name );
+
+  typedef FT_Error
+  (*PS_Unicodes_InitFunc)( FT_Memory             memory,
+                           PS_Unicodes           unicodes,
+                           FT_UInt               num_glyphs,
+                           PS_GetGlyphNameFunc   get_glyph_name,
+                           PS_FreeGlyphNameFunc  free_glyph_name,
+                           FT_Pointer            glyph_data );
+
+  typedef FT_UInt
+  (*PS_Unicodes_CharIndexFunc)( PS_Unicodes  unicodes,
+                                FT_UInt32    unicode );
+
+  typedef FT_UInt32
+  (*PS_Unicodes_CharNextFunc)( PS_Unicodes  unicodes,
+                               FT_UInt32   *unicode );
+
+
+  FT_DEFINE_SERVICE( PsCMaps )
+  {
+    PS_Unicode_ValueFunc       unicode_value;
+
+    PS_Unicodes_InitFunc       unicodes_init;
+    PS_Unicodes_CharIndexFunc  unicodes_char_index;
+    PS_Unicodes_CharNextFunc   unicodes_char_next;
+
+    PS_Macintosh_NameFunc      macintosh_name;
+    PS_Adobe_Std_StringsFunc   adobe_std_strings;
+    const unsigned short*      adobe_std_encoding;
+    const unsigned short*      adobe_expert_encoding;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \
+                                      unicode_value_,                       \
+                                      unicodes_init_,                       \
+                                      unicodes_char_index_,                 \
+                                      unicodes_char_next_,                  \
+                                      macintosh_name_,                      \
+                                      adobe_std_strings_,                   \
+                                      adobe_std_encoding_,                  \
+                                      adobe_expert_encoding_ )              \
+  static const FT_Service_PsCMapsRec  class_ =                              \
+  {                                                                         \
+    unicode_value_, unicodes_init_,                                         \
+    unicodes_char_index_, unicodes_char_next_, macintosh_name_,             \
+    adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_         \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \
+                                      unicode_value_,                       \
+                                      unicodes_init_,                       \
+                                      unicodes_char_index_,                 \
+                                      unicodes_char_next_,                  \
+                                      macintosh_name_,                      \
+                                      adobe_std_strings_,                   \
+                                      adobe_std_encoding_,                  \
+                                      adobe_expert_encoding_ )              \
+  void                                                                      \
+  FT_Init_Class_ ## class_( FT_Library              library,                \
+                            FT_Service_PsCMapsRec*  clazz )                 \
+  {                                                                         \
+    FT_UNUSED( library );                                                   \
+                                                                            \
+    clazz->unicode_value         = unicode_value_;                          \
+    clazz->unicodes_init         = unicodes_init_;                          \
+    clazz->unicodes_char_index   = unicodes_char_index_;                    \
+    clazz->unicodes_char_next    = unicodes_char_next_;                     \
+    clazz->macintosh_name        = macintosh_name_;                         \
+    clazz->adobe_std_strings     = adobe_std_strings_;                      \
+    clazz->adobe_std_encoding    = adobe_std_encoding_;                     \
+    clazz->adobe_expert_encoding = adobe_expert_encoding_;                  \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPSCMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpsinfo.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpsinfo.h
new file mode 100644
index 0000000..fa3b303
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpsinfo.h
@@ -0,0 +1,111 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svpsinfo.h                                                             */
+/*                                                                         */
+/*    The FreeType PostScript info service (specification).                */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2009, 2011, 2012 by                              */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPSINFO_H__
+#define __SVPSINFO_H__
+
+#include "../ftserv.h"
+#include "../t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_POSTSCRIPT_INFO  "postscript-info"
+
+
+  typedef FT_Error
+  (*PS_GetFontInfoFunc)( FT_Face          face,
+                         PS_FontInfoRec*  afont_info );
+
+  typedef FT_Error
+  (*PS_GetFontExtraFunc)( FT_Face           face,
+                          PS_FontExtraRec*  afont_extra );
+
+  typedef FT_Int
+  (*PS_HasGlyphNamesFunc)( FT_Face  face );
+
+  typedef FT_Error
+  (*PS_GetFontPrivateFunc)( FT_Face         face,
+                            PS_PrivateRec*  afont_private );
+
+  typedef FT_Long
+  (*PS_GetFontValueFunc)( FT_Face       face,
+                          PS_Dict_Keys  key,
+                          FT_UInt       idx,
+                          void         *value,
+                          FT_Long       value_len );
+
+
+  FT_DEFINE_SERVICE( PsInfo )
+  {
+    PS_GetFontInfoFunc     ps_get_font_info;
+    PS_GetFontExtraFunc    ps_get_font_extra;
+    PS_HasGlyphNamesFunc   ps_has_glyph_names;
+    PS_GetFontPrivateFunc  ps_get_font_private;
+    PS_GetFontValueFunc    ps_get_font_value;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \
+                                     get_font_info_,             \
+                                     ps_get_font_extra_,         \
+                                     has_glyph_names_,           \
+                                     get_font_private_,          \
+                                     get_font_value_ )           \
+  static const FT_Service_PsInfoRec  class_ =                    \
+  {                                                              \
+    get_font_info_, ps_get_font_extra_, has_glyph_names_,        \
+    get_font_private_, get_font_value_                           \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \
+                                     get_font_info_,             \
+                                     ps_get_font_extra_,         \
+                                     has_glyph_names_,           \
+                                     get_font_private_,          \
+                                     get_font_value_ )           \
+  void                                                           \
+  FT_Init_Class_ ## class_( FT_Library             library,      \
+                            FT_Service_PsInfoRec*  clazz )       \
+  {                                                              \
+    FT_UNUSED( library );                                        \
+                                                                 \
+    clazz->ps_get_font_info    = get_font_info_;                 \
+    clazz->ps_get_font_extra   = ps_get_font_extra_;             \
+    clazz->ps_has_glyph_names  = has_glyph_names_;               \
+    clazz->ps_get_font_private = get_font_private_;              \
+    clazz->ps_get_font_value   = get_font_value_;                \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPSINFO_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svsfnt.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svsfnt.h
new file mode 100644
index 0000000..3425042
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svsfnt.h
@@ -0,0 +1,103 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svsfnt.h                                                               */
+/*                                                                         */
+/*    The FreeType SFNT table loading service (specification).             */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2009, 2012 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVSFNT_H__
+#define __SVSFNT_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  SFNT table loading service.
+   */
+
+#define FT_SERVICE_ID_SFNT_TABLE  "sfnt-table"
+
+
+  /*
+   * Used to implement FT_Load_Sfnt_Table().
+   */
+  typedef FT_Error
+  (*FT_SFNT_TableLoadFunc)( FT_Face    face,
+                            FT_ULong   tag,
+                            FT_Long    offset,
+                            FT_Byte*   buffer,
+                            FT_ULong*  length );
+
+  /*
+   * Used to implement FT_Get_Sfnt_Table().
+   */
+  typedef void*
+  (*FT_SFNT_TableGetFunc)( FT_Face      face,
+                           FT_Sfnt_Tag  tag );
+
+
+  /*
+   * Used to implement FT_Sfnt_Table_Info().
+   */
+  typedef FT_Error
+  (*FT_SFNT_TableInfoFunc)( FT_Face    face,
+                            FT_UInt    idx,
+                            FT_ULong  *tag,
+                            FT_ULong  *offset,
+                            FT_ULong  *length );
+
+
+  FT_DEFINE_SERVICE( SFNT_Table )
+  {
+    FT_SFNT_TableLoadFunc  load_table;
+    FT_SFNT_TableGetFunc   get_table;
+    FT_SFNT_TableInfoFunc  table_info;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ )  \
+  static const FT_Service_SFNT_TableRec  class_ =                      \
+  {                                                                    \
+    load_, get_, info_                                                 \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \
+  void                                                                \
+  FT_Init_Class_ ## class_( FT_Service_SFNT_TableRec*  clazz )        \
+  {                                                                   \
+    clazz->load_table = load_;                                        \
+    clazz->get_table  = get_;                                         \
+    clazz->table_info = info_;                                        \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVSFNT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttcmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttcmap.h
new file mode 100644
index 0000000..02542ab
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttcmap.h
@@ -0,0 +1,107 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svttcmap.h                                                             */
+/*                                                                         */
+/*    The FreeType TrueType/sfnt cmap extra information service.           */
+/*                                                                         */
+/*  Copyright 2003 by                                                      */
+/*  Masatake YAMATO, Redhat K.K.                                           */
+/*                                                                         */
+/*  Copyright 2003, 2008, 2009, 2012 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/* Development of this service is support of
+   Information-technology Promotion Agency, Japan. */
+
+#ifndef __SVTTCMAP_H__
+#define __SVTTCMAP_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_TT_CMAP  "tt-cmaps"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_CMapInfo                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to store TrueType/sfnt specific cmap information  */
+  /*    which is not covered by the generic @FT_CharMap structure.  This   */
+  /*    structure can be accessed with the @FT_Get_TT_CMap_Info function.  */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    language ::                                                        */
+  /*      The language ID used in Mac fonts.  Definitions of values are in */
+  /*      freetype/ttnameid.h.                                             */
+  /*                                                                       */
+  /*    format ::                                                          */
+  /*      The cmap format.  OpenType 1.5 defines the formats 0 (byte       */
+  /*      encoding table), 2~(high-byte mapping through table), 4~(segment */
+  /*      mapping to delta values), 6~(trimmed table mapping), 8~(mixed    */
+  /*      16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented   */
+  /*      coverage), and 14 (Unicode Variation Sequences).                 */
+  /*                                                                       */
+  typedef struct  TT_CMapInfo_
+  {
+    FT_ULong  language;
+    FT_Long   format;
+
+  } TT_CMapInfo;
+
+
+  typedef FT_Error
+  (*TT_CMap_Info_GetFunc)( FT_CharMap    charmap,
+                           TT_CMapInfo  *cmap_info );
+
+
+  FT_DEFINE_SERVICE( TTCMaps )
+  {
+    TT_CMap_Info_GetFunc  get_cmap_info;
+  };
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \
+  static const FT_Service_TTCMapsRec  class_ =                  \
+  {                                                             \
+    get_cmap_info_                                              \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \
+  void                                                          \
+  FT_Init_Class_ ## class_( FT_Library              library,    \
+                            FT_Service_TTCMapsRec*  clazz )     \
+  {                                                             \
+    FT_UNUSED( library );                                       \
+                                                                \
+    clazz->get_cmap_info = get_cmap_info_;                      \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVTTCMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svtteng.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svtteng.h
new file mode 100644
index 0000000..e567efb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svtteng.h
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svtteng.h                                                              */
+/*                                                                         */
+/*    The FreeType TrueType engine query service (specification).          */
+/*                                                                         */
+/*  Copyright 2006 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVTTENG_H__
+#define __SVTTENG_H__
+
+#include "../ftserv.h"
+#include "../../ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  SFNT table loading service.
+   */
+
+#define FT_SERVICE_ID_TRUETYPE_ENGINE  "truetype-engine"
+
+  /*
+   * Used to implement FT_Get_TrueType_Engine_Type
+   */
+
+  FT_DEFINE_SERVICE( TrueTypeEngine )
+  {
+    FT_TrueTypeEngineType  engine_type;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVTTENG_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttglyf.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttglyf.h
new file mode 100644
index 0000000..d8824fb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttglyf.h
@@ -0,0 +1,68 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svttglyf.h                                                             */
+/*                                                                         */
+/*    The FreeType TrueType glyph service.                                 */
+/*                                                                         */
+/*  Copyright 2007, 2009, 2012 by David Turner.                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#ifndef __SVTTGLYF_H__
+#define __SVTTGLYF_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_TT_GLYF  "tt-glyf"
+
+
+  typedef FT_ULong
+  (*TT_Glyf_GetLocationFunc)( FT_Face    face,
+                              FT_UInt    gindex,
+                              FT_ULong  *psize );
+
+  FT_DEFINE_SERVICE( TTGlyf )
+  {
+    TT_Glyf_GetLocationFunc  get_location;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \
+  static const FT_Service_TTGlyfRec  class_ =                 \
+  {                                                           \
+    get_location_                                             \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \
+  void                                                        \
+  FT_Init_Class_ ## class_( FT_Service_TTGlyfRec*  clazz )    \
+  {                                                           \
+    clazz->get_location = get_location_;                      \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVTTGLYF_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svwinfnt.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svwinfnt.h
new file mode 100644
index 0000000..013a991
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svwinfnt.h
@@ -0,0 +1,50 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svwinfnt.h                                                             */
+/*                                                                         */
+/*    The FreeType Windows FNT/FONT service (specification).               */
+/*                                                                         */
+/*  Copyright 2003 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVWINFNT_H__
+#define __SVWINFNT_H__
+
+#include "../ftserv.h"
+#include "../../ftwinfnt.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_WINFNT  "winfonts"
+
+  typedef FT_Error
+  (*FT_WinFnt_GetHeaderFunc)( FT_Face               face,
+                              FT_WinFNT_HeaderRec  *aheader );
+
+
+  FT_DEFINE_SERVICE( WinFnt )
+  {
+    FT_WinFnt_GetHeaderFunc  get_header;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVWINFNT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svxf86nm.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svxf86nm.h
new file mode 100644
index 0000000..571f63d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svxf86nm.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svxf86nm.h                                                             */
+/*                                                                         */
+/*    The FreeType XFree86 services (specification only).                  */
+/*                                                                         */
+/*  Copyright 2003 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVXF86NM_H__
+#define __SVXF86NM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  A trivial service used to return the name of a face's font driver,
+   *  according to the XFree86 nomenclature.  Note that the service data
+   *  is a simple constant string pointer.
+   */
+
+#define FT_SERVICE_ID_XF86_NAME  "xf86-driver-name"
+
+#define FT_XF86_FORMAT_TRUETYPE  "TrueType"
+#define FT_XF86_FORMAT_TYPE_1    "Type 1"
+#define FT_XF86_FORMAT_BDF       "BDF"
+#define FT_XF86_FORMAT_PCF       "PCF"
+#define FT_XF86_FORMAT_TYPE_42   "Type 42"
+#define FT_XF86_FORMAT_CID       "CID Type 1"
+#define FT_XF86_FORMAT_CFF       "CFF"
+#define FT_XF86_FORMAT_PFR       "PFR"
+#define FT_XF86_FORMAT_WINFNT    "Windows FNT"
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVXF86NM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/sfnt.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/sfnt.h
new file mode 100644
index 0000000..2759ba3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/sfnt.h
@@ -0,0 +1,707 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfnt.h                                                                 */
+/*                                                                         */
+/*    High-level `sfnt' driver interface (specification).                  */
+/*                                                                         */
+/*  Copyright 1996-2006, 2009, 2012-2013 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SFNT_H__
+#define __SFNT_H__
+
+
+#include "../../ft2build.h"
+#include "ftdriver.h"
+#include "tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Init_Face_Func                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    First part of the SFNT face object initialization.  This finds     */
+  /*    the face in a SFNT file or collection, and load its format tag in  */
+  /*    face->format_tag.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     :: The input stream.                                    */
+  /*                                                                       */
+  /*    face       :: A handle to the target face object.                  */
+  /*                                                                       */
+  /*    face_index :: The index of the TrueType font, if we are opening a  */
+  /*                  collection.                                          */
+  /*                                                                       */
+  /*    num_params :: The number of additional parameters.                 */
+  /*                                                                       */
+  /*    params     :: Optional additional parameters.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be at the font file's origin.               */
+  /*                                                                       */
+  /*    This function recognizes fonts embedded in a `TrueType             */
+  /*    collection'.                                                       */
+  /*                                                                       */
+  /*    Once the format tag has been validated by the font driver, it      */
+  /*    should then call the TT_Load_Face_Func() callback to read the rest */
+  /*    of the SFNT tables in the object.                                  */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Init_Face_Func)( FT_Stream      stream,
+                        TT_Face        face,
+                        FT_Int         face_index,
+                        FT_Int         num_params,
+                        FT_Parameter*  params );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Face_Func                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Second part of the SFNT face object initialization.  This loads    */
+  /*    the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the    */
+  /*    face object.                                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     :: The input stream.                                    */
+  /*                                                                       */
+  /*    face       :: A handle to the target face object.                  */
+  /*                                                                       */
+  /*    face_index :: The index of the TrueType font, if we are opening a  */
+  /*                  collection.                                          */
+  /*                                                                       */
+  /*    num_params :: The number of additional parameters.                 */
+  /*                                                                       */
+  /*    params     :: Optional additional parameters.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function must be called after TT_Init_Face_Func().            */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Face_Func)( FT_Stream      stream,
+                        TT_Face        face,
+                        FT_Int         face_index,
+                        FT_Int         num_params,
+                        FT_Parameter*  params );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Done_Face_Func                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A callback used to delete the common SFNT data from a face.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the target face object.                        */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function does NOT destroy the face object.                    */
+  /*                                                                       */
+  typedef void
+  (*TT_Done_Face_Func)( TT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Any_Func                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load any font table into client memory.                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: The face object to look for.                             */
+  /*                                                                       */
+  /*    tag    :: The tag of table to load.  Use the value 0 if you want   */
+  /*              to access the whole font file, else set this parameter   */
+  /*              to a valid TrueType table tag that you can forge with    */
+  /*              the MAKE_TT_TAG macro.                                   */
+  /*                                                                       */
+  /*    offset :: The starting offset in the table (or the file if         */
+  /*              tag == 0).                                               */
+  /*                                                                       */
+  /*    length :: The address of the decision variable:                    */
+  /*                                                                       */
+  /*                If length == NULL:                                     */
+  /*                  Loads the whole table.  Returns an error if          */
+  /*                  `offset' == 0!                                       */
+  /*                                                                       */
+  /*                If *length == 0:                                       */
+  /*                  Exits immediately; returning the length of the given */
+  /*                  table or of the font file, depending on the value of */
+  /*                  `tag'.                                               */
+  /*                                                                       */
+  /*                If *length != 0:                                       */
+  /*                  Loads the next `length' bytes of table or font,      */
+  /*                  starting at offset `offset' (in table or font too).  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    buffer :: The address of target buffer.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    TrueType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Any_Func)( TT_Face    face,
+                       FT_ULong   tag,
+                       FT_Long    offset,
+                       FT_Byte   *buffer,
+                       FT_ULong*  length );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Find_SBit_Image_Func                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Check whether an embedded bitmap (an `sbit') exists for a given    */
+  /*    glyph, at a given strike.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face          :: The target face object.                           */
+  /*                                                                       */
+  /*    glyph_index   :: The glyph index.                                  */
+  /*                                                                       */
+  /*    strike_index  :: The current strike index.                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    arange        :: The SBit range containing the glyph index.        */
+  /*                                                                       */
+  /*    astrike       :: The SBit strike containing the glyph index.       */
+  /*                                                                       */
+  /*    aglyph_offset :: The offset of the glyph data in `EBDT' table.     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns                    */
+  /*    SFNT_Err_Invalid_Argument if no sbit exists for the requested      */
+  /*    glyph.                                                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Find_SBit_Image_Func)( TT_Face          face,
+                              FT_UInt          glyph_index,
+                              FT_ULong         strike_index,
+                              TT_SBit_Range   *arange,
+                              TT_SBit_Strike  *astrike,
+                              FT_ULong        *aglyph_offset );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_SBit_Metrics_Func                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the big metrics for a given embedded bitmap.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream      :: The input stream.                                   */
+  /*                                                                       */
+  /*    range       :: The SBit range containing the glyph.                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    big_metrics :: A big SBit metrics structure for the glyph.         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be positioned at the glyph's offset within  */
+  /*    the `EBDT' table before the call.                                  */
+  /*                                                                       */
+  /*    If the image format uses variable metrics, the stream cursor is    */
+  /*    positioned just after the metrics header in the `EBDT' table on    */
+  /*    function exit.                                                     */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_SBit_Metrics_Func)( FT_Stream        stream,
+                                TT_SBit_Range    range,
+                                TT_SBit_Metrics  metrics );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_SBit_Image_Func                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load a given glyph sbit image from the font resource.  This also   */
+  /*    returns its metrics.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      The target face object.                                          */
+  /*                                                                       */
+  /*    strike_index ::                                                    */
+  /*      The strike index.                                                */
+  /*                                                                       */
+  /*    glyph_index ::                                                     */
+  /*      The current glyph index.                                         */
+  /*                                                                       */
+  /*    load_flags ::                                                      */
+  /*      The current load flags.                                          */
+  /*                                                                       */
+  /*    stream ::                                                          */
+  /*      The input stream.                                                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amap ::                                                            */
+  /*      The target pixmap.                                               */
+  /*                                                                       */
+  /*    ametrics ::                                                        */
+  /*      A big sbit metrics structure for the glyph image.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns an error if no     */
+  /*    glyph sbit exists for the index.                                   */
+  /*                                                                       */
+  /*  <Note>                                                               */
+  /*    The `map.buffer' field is always freed before the glyph is loaded. */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_SBit_Image_Func)( TT_Face              face,
+                              FT_ULong             strike_index,
+                              FT_UInt              glyph_index,
+                              FT_UInt              load_flags,
+                              FT_Stream            stream,
+                              FT_Bitmap           *amap,
+                              TT_SBit_MetricsRec  *ametrics );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Set_SBit_Strike_Func                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Select an sbit strike for a given size request.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face          :: The target face object.                           */
+  /*                                                                       */
+  /*    req           :: The size request.                                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    astrike_index :: The index of the sbit strike.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns an error if no     */
+  /*    sbit strike exists for the selected ppem values.                   */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Set_SBit_Strike_Func)( TT_Face          face,
+                              FT_Size_Request  req,
+                              FT_ULong*        astrike_index );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Strike_Metrics_Func                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the metrics of a given strike.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face          :: The target face object.                           */
+  /*                                                                       */
+  /*    strike_index  :: The strike index.                                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    metrics       :: the metrics of the strike.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns an error if no     */
+  /*    such sbit strike exists.                                           */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Strike_Metrics_Func)( TT_Face           face,
+                                  FT_ULong          strike_index,
+                                  FT_Size_Metrics*  metrics );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Get_PS_Name_Func                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the PostScript glyph name of a glyph.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    idx  :: The glyph index.                                           */
+  /*                                                                       */
+  /*    PSname :: The address of a string pointer.  Will be NULL in case   */
+  /*              of error, otherwise it is a pointer to the glyph name.   */
+  /*                                                                       */
+  /*              You must not modify the returned string!                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Get_PS_Name_Func)( TT_Face      face,
+                          FT_UInt      idx,
+                          FT_String**  PSname );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Metrics_Func                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load a metrics table, which is a table with a horizontal and a     */
+  /*    vertical version.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the target face object.                    */
+  /*                                                                       */
+  /*    stream   :: The input stream.                                      */
+  /*                                                                       */
+  /*    vertical :: A boolean flag.  If set, load the vertical one.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Metrics_Func)( TT_Face    face,
+                           FT_Stream  stream,
+                           FT_Bool    vertical );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Get_Metrics_Func                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the horizontal or vertical header in a face object.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the target face object.                    */
+  /*                                                                       */
+  /*    stream   :: The input stream.                                      */
+  /*                                                                       */
+  /*    vertical :: A boolean flag.  If set, load vertical metrics.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Get_Metrics_Func)( TT_Face     face,
+                          FT_Bool     vertical,
+                          FT_UInt     gindex,
+                          FT_Short*   abearing,
+                          FT_UShort*  aadvance );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Table_Func                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load a given TrueType table.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The function uses `face->goto_table' to seek the stream to the     */
+  /*    start of the table, except while loading the font directory.       */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Table_Func)( TT_Face    face,
+                         FT_Stream  stream );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Free_Table_Func                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Free a given TrueType table.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the target face object.                        */
+  /*                                                                       */
+  typedef void
+  (*TT_Free_Table_Func)( TT_Face  face );
+
+
+  /*
+   * @functype:
+   *    TT_Face_GetKerningFunc
+   *
+   * @description:
+   *    Return the horizontal kerning value between two glyphs.
+   *
+   * @input:
+   *    face        :: A handle to the source face object.
+   *    left_glyph  :: The left glyph index.
+   *    right_glyph :: The right glyph index.
+   *
+   * @return:
+   *    The kerning value in font units.
+   */
+  typedef FT_Int
+  (*TT_Face_GetKerningFunc)( TT_Face  face,
+                             FT_UInt  left_glyph,
+                             FT_UInt  right_glyph );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    SFNT_Interface                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure holds pointers to the functions used to load and    */
+  /*    free the basic tables that are required in a `sfnt' font file.     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    Check the various xxx_Func() descriptions for details.             */
+  /*                                                                       */
+  typedef struct  SFNT_Interface_
+  {
+    TT_Loader_GotoTableFunc      goto_table;
+
+    TT_Init_Face_Func            init_face;
+    TT_Load_Face_Func            load_face;
+    TT_Done_Face_Func            done_face;
+    FT_Module_Requester          get_interface;
+
+    TT_Load_Any_Func             load_any;
+
+    /* these functions are called by `load_face' but they can also  */
+    /* be called from external modules, if there is a need to do so */
+    TT_Load_Table_Func           load_head;
+    TT_Load_Metrics_Func         load_hhea;
+    TT_Load_Table_Func           load_cmap;
+    TT_Load_Table_Func           load_maxp;
+    TT_Load_Table_Func           load_os2;
+    TT_Load_Table_Func           load_post;
+
+    TT_Load_Table_Func           load_name;
+    TT_Free_Table_Func           free_name;
+
+    /* this field was called `load_kerning' up to version 2.1.10 */
+    TT_Load_Table_Func           load_kern;
+
+    TT_Load_Table_Func           load_gasp;
+    TT_Load_Table_Func           load_pclt;
+
+    /* see `ttload.h'; this field was called `load_bitmap_header' up to */
+    /* version 2.1.10                                                   */
+    TT_Load_Table_Func           load_bhed;
+
+    TT_Load_SBit_Image_Func      load_sbit_image;
+
+    /* see `ttpost.h' */
+    TT_Get_PS_Name_Func          get_psname;
+    TT_Free_Table_Func           free_psnames;
+
+    /* starting here, the structure differs from version 2.1.7 */
+
+    /* this field was introduced in version 2.1.8, named `get_psname' */
+    TT_Face_GetKerningFunc       get_kerning;
+
+    /* new elements introduced after version 2.1.10 */
+
+    /* load the font directory, i.e., the offset table and */
+    /* the table directory                                 */
+    TT_Load_Table_Func           load_font_dir;
+    TT_Load_Metrics_Func         load_hmtx;
+
+    TT_Load_Table_Func           load_eblc;
+    TT_Free_Table_Func           free_eblc;
+
+    TT_Set_SBit_Strike_Func      set_sbit_strike;
+    TT_Load_Strike_Metrics_Func  load_strike_metrics;
+
+    TT_Get_Metrics_Func          get_metrics;
+
+  } SFNT_Interface;
+
+
+  /* transitional */
+  typedef SFNT_Interface*   SFNT_Service;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SFNT_INTERFACE(        \
+          class_,                        \
+          goto_table_,                   \
+          init_face_,                    \
+          load_face_,                    \
+          done_face_,                    \
+          get_interface_,                \
+          load_any_,                     \
+          load_head_,                    \
+          load_hhea_,                    \
+          load_cmap_,                    \
+          load_maxp_,                    \
+          load_os2_,                     \
+          load_post_,                    \
+          load_name_,                    \
+          free_name_,                    \
+          load_kern_,                    \
+          load_gasp_,                    \
+          load_pclt_,                    \
+          load_bhed_,                    \
+          load_sbit_image_,              \
+          get_psname_,                   \
+          free_psnames_,                 \
+          get_kerning_,                  \
+          load_font_dir_,                \
+          load_hmtx_,                    \
+          load_eblc_,                    \
+          free_eblc_,                    \
+          set_sbit_strike_,              \
+          load_strike_metrics_,          \
+          get_metrics_ )                 \
+  static const SFNT_Interface  class_ =  \
+  {                                      \
+    goto_table_,                         \
+    init_face_,                          \
+    load_face_,                          \
+    done_face_,                          \
+    get_interface_,                      \
+    load_any_,                           \
+    load_head_,                          \
+    load_hhea_,                          \
+    load_cmap_,                          \
+    load_maxp_,                          \
+    load_os2_,                           \
+    load_post_,                          \
+    load_name_,                          \
+    free_name_,                          \
+    load_kern_,                          \
+    load_gasp_,                          \
+    load_pclt_,                          \
+    load_bhed_,                          \
+    load_sbit_image_,                    \
+    get_psname_,                         \
+    free_psnames_,                       \
+    get_kerning_,                        \
+    load_font_dir_,                      \
+    load_hmtx_,                          \
+    load_eblc_,                          \
+    free_eblc_,                          \
+    set_sbit_strike_,                    \
+    load_strike_metrics_,                \
+    get_metrics_,                        \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_INTERNAL( a, a_ )  \
+          clazz->a = a_;
+
+#define FT_DEFINE_SFNT_INTERFACE(                       \
+          class_,                                       \
+          goto_table_,                                  \
+          init_face_,                                   \
+          load_face_,                                   \
+          done_face_,                                   \
+          get_interface_,                               \
+          load_any_,                                    \
+          load_head_,                                   \
+          load_hhea_,                                   \
+          load_cmap_,                                   \
+          load_maxp_,                                   \
+          load_os2_,                                    \
+          load_post_,                                   \
+          load_name_,                                   \
+          free_name_,                                   \
+          load_kern_,                                   \
+          load_gasp_,                                   \
+          load_pclt_,                                   \
+          load_bhed_,                                   \
+          load_sbit_image_,                             \
+          get_psname_,                                  \
+          free_psnames_,                                \
+          get_kerning_,                                 \
+          load_font_dir_,                               \
+          load_hmtx_,                                   \
+          load_eblc_,                                   \
+          free_eblc_,                                   \
+          set_sbit_strike_,                             \
+          load_strike_metrics_,                         \
+          get_metrics_ )                                \
+  void                                                  \
+  FT_Init_Class_ ## class_( FT_Library       library,   \
+                            SFNT_Interface*  clazz )    \
+  {                                                     \
+    FT_UNUSED( library );                               \
+                                                        \
+    clazz->goto_table          = goto_table_;           \
+    clazz->init_face           = init_face_;            \
+    clazz->load_face           = load_face_;            \
+    clazz->done_face           = done_face_;            \
+    clazz->get_interface       = get_interface_;        \
+    clazz->load_any            = load_any_;             \
+    clazz->load_head           = load_head_;            \
+    clazz->load_hhea           = load_hhea_;            \
+    clazz->load_cmap           = load_cmap_;            \
+    clazz->load_maxp           = load_maxp_;            \
+    clazz->load_os2            = load_os2_;             \
+    clazz->load_post           = load_post_;            \
+    clazz->load_name           = load_name_;            \
+    clazz->free_name           = free_name_;            \
+    clazz->load_kern           = load_kern_;            \
+    clazz->load_gasp           = load_gasp_;            \
+    clazz->load_pclt           = load_pclt_;            \
+    clazz->load_bhed           = load_bhed_;            \
+    clazz->load_sbit_image     = load_sbit_image_;      \
+    clazz->get_psname          = get_psname_;           \
+    clazz->free_psnames        = free_psnames_;         \
+    clazz->get_kerning         = get_kerning_;          \
+    clazz->load_font_dir       = load_font_dir_;        \
+    clazz->load_hmtx           = load_hmtx_;            \
+    clazz->load_eblc           = load_eblc_;            \
+    clazz->free_eblc           = free_eblc_;            \
+    clazz->set_sbit_strike     = set_sbit_strike_;      \
+    clazz->load_strike_metrics = load_strike_metrics_;  \
+    clazz->get_metrics         = get_metrics_;          \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __SFNT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/t1types.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/t1types.h
new file mode 100644
index 0000000..36deec8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/t1types.h
@@ -0,0 +1,255 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1types.h                                                              */
+/*                                                                         */
+/*    Basic Type1/Type2 type definitions and interface (specification      */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by                   */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1TYPES_H__
+#define __T1TYPES_H__
+
+
+#include "../../ft2build.h"
+#include "../t1tables.h"
+#include "pshints.h"
+#include "ftserv.h"
+#include "services/svpscmap.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***              REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS              ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    T1_EncodingRec                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling a custom encoding.                            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_chars  :: The number of character codes in the encoding.       */
+  /*                  Usually 256.                                         */
+  /*                                                                       */
+  /*    code_first :: The lowest valid character code in the encoding.     */
+  /*                                                                       */
+  /*    code_last  :: The highest valid character code in the encoding     */
+  /*                  + 1. When equal to code_first there are no valid     */
+  /*                  character codes.                                     */
+  /*                                                                       */
+  /*    char_index :: An array of corresponding glyph indices.             */
+  /*                                                                       */
+  /*    char_name  :: An array of corresponding glyph names.               */
+  /*                                                                       */
+  typedef struct  T1_EncodingRecRec_
+  {
+    FT_Int       num_chars;
+    FT_Int       code_first;
+    FT_Int       code_last;
+
+    FT_UShort*   char_index;
+    FT_String**  char_name;
+
+  } T1_EncodingRec, *T1_Encoding;
+
+
+  /* used to hold extra data of PS_FontInfoRec that
+   * cannot be stored in the publicly defined structure.
+   *
+   * Note these can't be blended with multiple-masters.
+   */
+  typedef struct  PS_FontExtraRec_
+  {
+    FT_UShort  fs_type;
+
+  } PS_FontExtraRec;
+
+
+  typedef struct  T1_FontRec_
+  {
+    PS_FontInfoRec   font_info;         /* font info dictionary   */
+    PS_FontExtraRec  font_extra;        /* font info extra fields */
+    PS_PrivateRec    private_dict;      /* private dictionary     */
+    FT_String*       font_name;         /* top-level dictionary   */
+
+    T1_EncodingType  encoding_type;
+    T1_EncodingRec   encoding;
+
+    FT_Byte*         subrs_block;
+    FT_Byte*         charstrings_block;
+    FT_Byte*         glyph_names_block;
+
+    FT_Int           num_subrs;
+    FT_Byte**        subrs;
+    FT_PtrDist*      subrs_len;
+
+    FT_Int           num_glyphs;
+    FT_String**      glyph_names;       /* array of glyph names       */
+    FT_Byte**        charstrings;       /* array of glyph charstrings */
+    FT_PtrDist*      charstrings_len;
+
+    FT_Byte          paint_type;
+    FT_Byte          font_type;
+    FT_Matrix        font_matrix;
+    FT_Vector        font_offset;
+    FT_BBox          font_bbox;
+    FT_Long          font_id;
+
+    FT_Fixed         stroke_width;
+
+  } T1_FontRec, *T1_Font;
+
+
+  typedef struct  CID_SubrsRec_
+  {
+    FT_UInt    num_subrs;
+    FT_Byte**  code;
+
+  } CID_SubrsRec, *CID_Subrs;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                AFM FONT INFORMATION STRUCTURES                    ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  AFM_TrackKernRec_
+  {
+    FT_Int    degree;
+    FT_Fixed  min_ptsize;
+    FT_Fixed  min_kern;
+    FT_Fixed  max_ptsize;
+    FT_Fixed  max_kern;
+
+  } AFM_TrackKernRec, *AFM_TrackKern;
+
+  typedef struct  AFM_KernPairRec_
+  {
+    FT_Int  index1;
+    FT_Int  index2;
+    FT_Int  x;
+    FT_Int  y;
+
+  } AFM_KernPairRec, *AFM_KernPair;
+
+  typedef struct  AFM_FontInfoRec_
+  {
+    FT_Bool        IsCIDFont;
+    FT_BBox        FontBBox;
+    FT_Fixed       Ascender;
+    FT_Fixed       Descender;
+    AFM_TrackKern  TrackKerns;   /* free if non-NULL */
+    FT_Int         NumTrackKern;
+    AFM_KernPair   KernPairs;    /* free if non-NULL */
+    FT_Int         NumKernPair;
+
+  } AFM_FontInfoRec, *AFM_FontInfo;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                ORIGINAL T1_FACE CLASS DEFINITION                  ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct T1_FaceRec_*   T1_Face;
+  typedef struct CID_FaceRec_*  CID_Face;
+
+
+  typedef struct  T1_FaceRec_
+  {
+    FT_FaceRec      root;
+    T1_FontRec      type1;
+    const void*     psnames;
+    const void*     psaux;
+    const void*     afm_data;
+    FT_CharMapRec   charmaprecs[2];
+    FT_CharMap      charmaps[2];
+
+    /* support for Multiple Masters fonts */
+    PS_Blend        blend;
+
+    /* undocumented, optional: indices of subroutines that express      */
+    /* the NormalizeDesignVector and the ConvertDesignVector procedure, */
+    /* respectively, as Type 2 charstrings; -1 if keywords not present  */
+    FT_Int           ndv_idx;
+    FT_Int           cdv_idx;
+
+    /* undocumented, optional: has the same meaning as len_buildchar */
+    /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25    */
+    FT_UInt          len_buildchar;
+    FT_Long*         buildchar;
+
+    /* since version 2.1 - interface to PostScript hinter */
+    const void*     pshinter;
+
+  } T1_FaceRec;
+
+
+  typedef struct  CID_FaceRec_
+  {
+    FT_FaceRec       root;
+    void*            psnames;
+    void*            psaux;
+    CID_FaceInfoRec  cid;
+    PS_FontExtraRec  font_extra;
+#if 0
+    void*            afm_data;
+#endif
+    CID_Subrs        subrs;
+
+    /* since version 2.1 - interface to PostScript hinter */
+    void*            pshinter;
+
+    /* since version 2.1.8, but was originally positioned after `afm_data' */
+    FT_Byte*         binary_data; /* used if hex data has been converted */
+    FT_Stream        cid_stream;
+
+  } CID_FaceRec;
+
+
+FT_END_HEADER
+
+#endif /* __T1TYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/tttypes.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/tttypes.h
new file mode 100644
index 0000000..d6c1d62
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/tttypes.h
@@ -0,0 +1,1440 @@
+/***************************************************************************/
+/*                                                                         */
+/*  tttypes.h                                                              */
+/*                                                                         */
+/*    Basic SFNT/TrueType type definitions and interface (specification    */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004-2008, 2012-2013 by                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTTYPES_H__
+#define __TTTYPES_H__
+
+
+#include "../../ft2build.h"
+#include "../tttables.h"
+#include "ftobjs.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "../ftmm.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***             REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TTC_HeaderRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    TrueType collection header.  This table contains the offsets of    */
+  /*    the font headers of each distinct TrueType face in the file.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    tag     :: Must be `ttc ' to indicate a TrueType collection.       */
+  /*                                                                       */
+  /*    version :: The version number.                                     */
+  /*                                                                       */
+  /*    count   :: The number of faces in the collection.  The             */
+  /*               specification says this should be an unsigned long, but */
+  /*               we use a signed long since we need the value -1 for     */
+  /*               specific purposes.                                      */
+  /*                                                                       */
+  /*    offsets :: The offsets of the font headers, one per face.          */
+  /*                                                                       */
+  typedef struct  TTC_HeaderRec_
+  {
+    FT_ULong   tag;
+    FT_Fixed   version;
+    FT_Long    count;
+    FT_ULong*  offsets;
+
+  } TTC_HeaderRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    SFNT_HeaderRec                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    SFNT file format header.                                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    format_tag     :: The font format tag.                             */
+  /*                                                                       */
+  /*    num_tables     :: The number of tables in file.                    */
+  /*                                                                       */
+  /*    search_range   :: Must be `16 * (max power of 2 <= num_tables)'.   */
+  /*                                                                       */
+  /*    entry_selector :: Must be log2 of `search_range / 16'.             */
+  /*                                                                       */
+  /*    range_shift    :: Must be `num_tables * 16 - search_range'.        */
+  /*                                                                       */
+  typedef struct  SFNT_HeaderRec_
+  {
+    FT_ULong   format_tag;
+    FT_UShort  num_tables;
+    FT_UShort  search_range;
+    FT_UShort  entry_selector;
+    FT_UShort  range_shift;
+
+    FT_ULong   offset;  /* not in file */
+
+  } SFNT_HeaderRec, *SFNT_Header;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_TableRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure describes a given table of a TrueType font.         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    Tag      :: A four-bytes tag describing the table.                 */
+  /*                                                                       */
+  /*    CheckSum :: The table checksum.  This value can be ignored.        */
+  /*                                                                       */
+  /*    Offset   :: The offset of the table from the start of the TrueType */
+  /*                font in its resource.                                  */
+  /*                                                                       */
+  /*    Length   :: The table length (in bytes).                           */
+  /*                                                                       */
+  typedef struct  TT_TableRec_
+  {
+    FT_ULong  Tag;        /*        table type */
+    FT_ULong  CheckSum;   /*    table checksum */
+    FT_ULong  Offset;     /* table file offset */
+    FT_ULong  Length;     /*      table length */
+
+  } TT_TableRec, *TT_Table;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_LongMetricsRec                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling the long metrics of the `hmtx' and `vmtx'     */
+  /*    TrueType tables.  The values are expressed in font units.          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    advance :: The advance width or height for the glyph.              */
+  /*                                                                       */
+  /*    bearing :: The left-side or top-side bearing for the glyph.        */
+  /*                                                                       */
+  typedef struct  TT_LongMetricsRec_
+  {
+    FT_UShort  advance;
+    FT_Short   bearing;
+
+  } TT_LongMetricsRec, *TT_LongMetrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_ShortMetrics                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple type to model the short metrics of the `hmtx' and `vmtx'  */
+  /*    tables.                                                            */
+  /*                                                                       */
+  typedef FT_Short  TT_ShortMetrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_NameEntryRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling TrueType name records.  Name records are used */
+  /*    to store important strings like family name, style name,           */
+  /*    copyright, etc. in _localized_ versions (i.e., language, encoding, */
+  /*    etc).                                                              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    platformID   :: The ID of the name's encoding platform.            */
+  /*                                                                       */
+  /*    encodingID   :: The platform-specific ID for the name's encoding.  */
+  /*                                                                       */
+  /*    languageID   :: The platform-specific ID for the name's language.  */
+  /*                                                                       */
+  /*    nameID       :: The ID specifying what kind of name this is.       */
+  /*                                                                       */
+  /*    stringLength :: The length of the string in bytes.                 */
+  /*                                                                       */
+  /*    stringOffset :: The offset to the string in the `name' table.      */
+  /*                                                                       */
+  /*    string       :: A pointer to the string's bytes.  Note that these  */
+  /*                    are usually UTF-16 encoded characters.             */
+  /*                                                                       */
+  typedef struct  TT_NameEntryRec_
+  {
+    FT_UShort  platformID;
+    FT_UShort  encodingID;
+    FT_UShort  languageID;
+    FT_UShort  nameID;
+    FT_UShort  stringLength;
+    FT_ULong   stringOffset;
+
+    /* this last field is not defined in the spec */
+    /* but used by the FreeType engine            */
+
+    FT_Byte*   string;
+
+  } TT_NameEntryRec, *TT_NameEntry;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_NameTableRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling the TrueType name table.                      */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    format         :: The format of the name table.                    */
+  /*                                                                       */
+  /*    numNameRecords :: The number of names in table.                    */
+  /*                                                                       */
+  /*    storageOffset  :: The offset of the name table in the `name'       */
+  /*                      TrueType table.                                  */
+  /*                                                                       */
+  /*    names          :: An array of name records.                        */
+  /*                                                                       */
+  /*    stream         :: the file's input stream.                         */
+  /*                                                                       */
+  typedef struct  TT_NameTableRec_
+  {
+    FT_UShort         format;
+    FT_UInt           numNameRecords;
+    FT_UInt           storageOffset;
+    TT_NameEntryRec*  names;
+    FT_Stream         stream;
+
+  } TT_NameTableRec, *TT_NameTable;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***             OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_GaspRangeRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A tiny structure used to model a gasp range according to the       */
+  /*    TrueType specification.                                            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    maxPPEM  :: The maximum ppem value to which `gaspFlag' applies.    */
+  /*                                                                       */
+  /*    gaspFlag :: A flag describing the grid-fitting and anti-aliasing   */
+  /*                modes to be used.                                      */
+  /*                                                                       */
+  typedef struct  TT_GaspRangeRec_
+  {
+    FT_UShort  maxPPEM;
+    FT_UShort  gaspFlag;
+
+  } TT_GaspRangeRec, *TT_GaspRange;
+
+
+#define TT_GASP_GRIDFIT  0x01
+#define TT_GASP_DOGRAY   0x02
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_GaspRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling the TrueType `gasp' table used to specify     */
+  /*    grid-fitting and anti-aliasing behaviour.                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    version    :: The version number.                                  */
+  /*                                                                       */
+  /*    numRanges  :: The number of gasp ranges in table.                  */
+  /*                                                                       */
+  /*    gaspRanges :: An array of gasp ranges.                             */
+  /*                                                                       */
+  typedef struct  TT_Gasp_
+  {
+    FT_UShort     version;
+    FT_UShort     numRanges;
+    TT_GaspRange  gaspRanges;
+
+  } TT_GaspRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                    EMBEDDED BITMAPS SUPPORT                       ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_MetricsRec                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold the big metrics of a given glyph bitmap   */
+  /*    in a TrueType or OpenType font.  These are usually found in the    */
+  /*    `EBDT' (Microsoft) or `bloc' (Apple) table.                        */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    height       :: The glyph height in pixels.                        */
+  /*                                                                       */
+  /*    width        :: The glyph width in pixels.                         */
+  /*                                                                       */
+  /*    horiBearingX :: The horizontal left bearing.                       */
+  /*                                                                       */
+  /*    horiBearingY :: The horizontal top bearing.                        */
+  /*                                                                       */
+  /*    horiAdvance  :: The horizontal advance.                            */
+  /*                                                                       */
+  /*    vertBearingX :: The vertical left bearing.                         */
+  /*                                                                       */
+  /*    vertBearingY :: The vertical top bearing.                          */
+  /*                                                                       */
+  /*    vertAdvance  :: The vertical advance.                              */
+  /*                                                                       */
+  typedef struct  TT_SBit_MetricsRec_
+  {
+    FT_Byte  height;
+    FT_Byte  width;
+
+    FT_Char  horiBearingX;
+    FT_Char  horiBearingY;
+    FT_Byte  horiAdvance;
+
+    FT_Char  vertBearingX;
+    FT_Char  vertBearingY;
+    FT_Byte  vertAdvance;
+
+  } TT_SBit_MetricsRec, *TT_SBit_Metrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_SmallMetricsRec                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold the small metrics of a given glyph bitmap */
+  /*    in a TrueType or OpenType font.  These are usually found in the    */
+  /*    `EBDT' (Microsoft) or the `bdat' (Apple) table.                    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    height   :: The glyph height in pixels.                            */
+  /*                                                                       */
+  /*    width    :: The glyph width in pixels.                             */
+  /*                                                                       */
+  /*    bearingX :: The left-side bearing.                                 */
+  /*                                                                       */
+  /*    bearingY :: The top-side bearing.                                  */
+  /*                                                                       */
+  /*    advance  :: The advance width or height.                           */
+  /*                                                                       */
+  typedef struct  TT_SBit_Small_Metrics_
+  {
+    FT_Byte  height;
+    FT_Byte  width;
+
+    FT_Char  bearingX;
+    FT_Char  bearingY;
+    FT_Byte  advance;
+
+  } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_LineMetricsRec                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to describe the text line metrics of a given      */
+  /*    bitmap strike, for either a horizontal or vertical layout.         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    ascender                :: The ascender in pixels.                 */
+  /*                                                                       */
+  /*    descender               :: The descender in pixels.                */
+  /*                                                                       */
+  /*    max_width               :: The maximum glyph width in pixels.      */
+  /*                                                                       */
+  /*    caret_slope_enumerator  :: Rise of the caret slope, typically set  */
+  /*                               to 1 for non-italic fonts.              */
+  /*                                                                       */
+  /*    caret_slope_denominator :: Rise of the caret slope, typically set  */
+  /*                               to 0 for non-italic fonts.              */
+  /*                                                                       */
+  /*    caret_offset            :: Offset in pixels to move the caret for  */
+  /*                               proper positioning.                     */
+  /*                                                                       */
+  /*    min_origin_SB           :: Minimum of horiBearingX (resp.          */
+  /*                               vertBearingY).                          */
+  /*    min_advance_SB          :: Minimum of                              */
+  /*                                                                       */
+  /*                                 horizontal advance -                  */
+  /*                                   ( horiBearingX + width )            */
+  /*                                                                       */
+  /*                               resp.                                   */
+  /*                                                                       */
+  /*                                 vertical advance -                    */
+  /*                                   ( vertBearingY + height )           */
+  /*                                                                       */
+  /*    max_before_BL           :: Maximum of horiBearingY (resp.          */
+  /*                               vertBearingY).                          */
+  /*                                                                       */
+  /*    min_after_BL            :: Minimum of                              */
+  /*                                                                       */
+  /*                                 horiBearingY - height                 */
+  /*                                                                       */
+  /*                               resp.                                   */
+  /*                                                                       */
+  /*                                 vertBearingX - width                  */
+  /*                                                                       */
+  /*    pads                    :: Unused (to make the size of the record  */
+  /*                               a multiple of 32 bits.                  */
+  /*                                                                       */
+  typedef struct  TT_SBit_LineMetricsRec_
+  {
+    FT_Char  ascender;
+    FT_Char  descender;
+    FT_Byte  max_width;
+    FT_Char  caret_slope_numerator;
+    FT_Char  caret_slope_denominator;
+    FT_Char  caret_offset;
+    FT_Char  min_origin_SB;
+    FT_Char  min_advance_SB;
+    FT_Char  max_before_BL;
+    FT_Char  min_after_BL;
+    FT_Char  pads[2];
+
+  } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_RangeRec                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A TrueType/OpenType subIndexTable as defined in the `EBLC'         */
+  /*    (Microsoft) or `bloc' (Apple) tables.                              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    first_glyph   :: The first glyph index in the range.               */
+  /*                                                                       */
+  /*    last_glyph    :: The last glyph index in the range.                */
+  /*                                                                       */
+  /*    index_format  :: The format of index table.  Valid values are 1    */
+  /*                     to 5.                                             */
+  /*                                                                       */
+  /*    image_format  :: The format of `EBDT' image data.                  */
+  /*                                                                       */
+  /*    image_offset  :: The offset to image data in `EBDT'.               */
+  /*                                                                       */
+  /*    image_size    :: For index formats 2 and 5.  This is the size in   */
+  /*                     bytes of each glyph bitmap.                       */
+  /*                                                                       */
+  /*    big_metrics   :: For index formats 2 and 5.  This is the big       */
+  /*                     metrics for each glyph bitmap.                    */
+  /*                                                                       */
+  /*    num_glyphs    :: For index formats 4 and 5.  This is the number of */
+  /*                     glyphs in the code array.                         */
+  /*                                                                       */
+  /*    glyph_offsets :: For index formats 1 and 3.                        */
+  /*                                                                       */
+  /*    glyph_codes   :: For index formats 4 and 5.                        */
+  /*                                                                       */
+  /*    table_offset  :: The offset of the index table in the `EBLC'       */
+  /*                     table.  Only used during strike loading.          */
+  /*                                                                       */
+  typedef struct  TT_SBit_RangeRec_
+  {
+    FT_UShort           first_glyph;
+    FT_UShort           last_glyph;
+
+    FT_UShort           index_format;
+    FT_UShort           image_format;
+    FT_ULong            image_offset;
+
+    FT_ULong            image_size;
+    TT_SBit_MetricsRec  metrics;
+    FT_ULong            num_glyphs;
+
+    FT_ULong*           glyph_offsets;
+    FT_UShort*          glyph_codes;
+
+    FT_ULong            table_offset;
+
+  } TT_SBit_RangeRec, *TT_SBit_Range;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_StrikeRec                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used describe a given bitmap strike in the `EBLC'      */
+  /*    (Microsoft) or `bloc' (Apple) tables.                              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*   num_index_ranges :: The number of index ranges.                     */
+  /*                                                                       */
+  /*   index_ranges     :: An array of glyph index ranges.                 */
+  /*                                                                       */
+  /*   color_ref        :: Unused.  `color_ref' is put in for future       */
+  /*                       enhancements, but these fields are already      */
+  /*                       in use by other platforms (e.g. Newton).        */
+  /*                       For details, please see                         */
+  /*                                                                       */
+  /*                         http://fonts.apple.com/                       */
+  /*                                TTRefMan/RM06/Chap6bloc.html           */
+  /*                                                                       */
+  /*   hori             :: The line metrics for horizontal layouts.        */
+  /*                                                                       */
+  /*   vert             :: The line metrics for vertical layouts.          */
+  /*                                                                       */
+  /*   start_glyph      :: The lowest glyph index for this strike.         */
+  /*                                                                       */
+  /*   end_glyph        :: The highest glyph index for this strike.        */
+  /*                                                                       */
+  /*   x_ppem           :: The number of horizontal pixels per EM.         */
+  /*                                                                       */
+  /*   y_ppem           :: The number of vertical pixels per EM.           */
+  /*                                                                       */
+  /*   bit_depth        :: The bit depth.  Valid values are 1, 2, 4,       */
+  /*                       and 8.                                          */
+  /*                                                                       */
+  /*   flags            :: Is this a vertical or horizontal strike?  For   */
+  /*                       details, please see                             */
+  /*                                                                       */
+  /*                         http://fonts.apple.com/                       */
+  /*                                TTRefMan/RM06/Chap6bloc.html           */
+  /*                                                                       */
+  typedef struct  TT_SBit_StrikeRec_
+  {
+    FT_Int                  num_ranges;
+    TT_SBit_Range           sbit_ranges;
+    FT_ULong                ranges_offset;
+
+    FT_ULong                color_ref;
+
+    TT_SBit_LineMetricsRec  hori;
+    TT_SBit_LineMetricsRec  vert;
+
+    FT_UShort               start_glyph;
+    FT_UShort               end_glyph;
+
+    FT_Byte                 x_ppem;
+    FT_Byte                 y_ppem;
+
+    FT_Byte                 bit_depth;
+    FT_Char                 flags;
+
+  } TT_SBit_StrikeRec, *TT_SBit_Strike;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_ComponentRec                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure to describe a compound sbit element.            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    glyph_code :: The element's glyph index.                           */
+  /*                                                                       */
+  /*    x_offset   :: The element's left bearing.                          */
+  /*                                                                       */
+  /*    y_offset   :: The element's top bearing.                           */
+  /*                                                                       */
+  typedef struct  TT_SBit_ComponentRec_
+  {
+    FT_UShort  glyph_code;
+    FT_Char    x_offset;
+    FT_Char    y_offset;
+
+  } TT_SBit_ComponentRec, *TT_SBit_Component;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_ScaleRec                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used describe a given bitmap scaling table, as defined */
+  /*    in the `EBSC' table.                                               */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    hori              :: The horizontal line metrics.                  */
+  /*                                                                       */
+  /*    vert              :: The vertical line metrics.                    */
+  /*                                                                       */
+  /*    x_ppem            :: The number of horizontal pixels per EM.       */
+  /*                                                                       */
+  /*    y_ppem            :: The number of vertical pixels per EM.         */
+  /*                                                                       */
+  /*    x_ppem_substitute :: Substitution x_ppem value.                    */
+  /*                                                                       */
+  /*    y_ppem_substitute :: Substitution y_ppem value.                    */
+  /*                                                                       */
+  typedef struct  TT_SBit_ScaleRec_
+  {
+    TT_SBit_LineMetricsRec  hori;
+    TT_SBit_LineMetricsRec  vert;
+
+    FT_Byte                 x_ppem;
+    FT_Byte                 y_ppem;
+
+    FT_Byte                 x_ppem_substitute;
+    FT_Byte                 y_ppem_substitute;
+
+  } TT_SBit_ScaleRec, *TT_SBit_Scale;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                  POSTSCRIPT GLYPH NAMES SUPPORT                   ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Post_20Rec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Postscript names sub-table, format 2.0.  Stores the PS name of     */
+  /*    each glyph in the font face.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_glyphs    :: The number of named glyphs in the table.          */
+  /*                                                                       */
+  /*    num_names     :: The number of PS names stored in the table.       */
+  /*                                                                       */
+  /*    glyph_indices :: The indices of the glyphs in the names arrays.    */
+  /*                                                                       */
+  /*    glyph_names   :: The PS names not in Mac Encoding.                 */
+  /*                                                                       */
+  typedef struct  TT_Post_20Rec_
+  {
+    FT_UShort   num_glyphs;
+    FT_UShort   num_names;
+    FT_UShort*  glyph_indices;
+    FT_Char**   glyph_names;
+
+  } TT_Post_20Rec, *TT_Post_20;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Post_25Rec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Postscript names sub-table, format 2.5.  Stores the PS name of     */
+  /*    each glyph in the font face.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_glyphs :: The number of glyphs in the table.                   */
+  /*                                                                       */
+  /*    offsets    :: An array of signed offsets in a normal Mac           */
+  /*                  Postscript name encoding.                            */
+  /*                                                                       */
+  typedef struct  TT_Post_25_
+  {
+    FT_UShort  num_glyphs;
+    FT_Char*   offsets;
+
+  } TT_Post_25Rec, *TT_Post_25;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Post_NamesRec                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Postscript names table, either format 2.0 or 2.5.                  */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    loaded    :: A flag to indicate whether the PS names are loaded.   */
+  /*                                                                       */
+  /*    format_20 :: The sub-table used for format 2.0.                    */
+  /*                                                                       */
+  /*    format_25 :: The sub-table used for format 2.5.                    */
+  /*                                                                       */
+  typedef struct  TT_Post_NamesRec_
+  {
+    FT_Bool  loaded;
+
+    union
+    {
+      TT_Post_20Rec  format_20;
+      TT_Post_25Rec  format_25;
+
+    } names;
+
+  } TT_Post_NamesRec, *TT_Post_Names;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                    GX VARIATION TABLE SUPPORT                     ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+  typedef struct GX_BlendRec_  *GX_Blend;
+#endif
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***              EMBEDDED BDF PROPERTIES TABLE SUPPORT                ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+   * These types are used to support a `BDF ' table that isn't part of the
+   * official TrueType specification.  It is mainly used in SFNT-based
+   * bitmap fonts that were generated from a set of BDF fonts.
+   *
+   * The format of the table is as follows.
+   *
+   *   USHORT   version      `BDF ' table version number, should be 0x0001.
+   *   USHORT   strikeCount  Number of strikes (bitmap sizes) in this table.
+   *   ULONG    stringTable  Offset (from start of BDF table) to string
+   *                         table.
+   *
+   * This is followed by an array of `strikeCount' descriptors, having the
+   * following format.
+   *
+   *   USHORT   ppem         Vertical pixels per EM for this strike.
+   *   USHORT   numItems     Number of items for this strike (properties and
+   *                         atoms).  Maximum is 255.
+   *
+   * This array in turn is followed by `strikeCount' value sets.  Each
+   * `value set' is an array of `numItems' items with the following format.
+   *
+   *   ULONG    item_name    Offset in string table to item name.
+   *   USHORT   item_type    The item type.  Possible values are
+   *                            0 => string (e.g., COMMENT)
+   *                            1 => atom   (e.g., FONT or even SIZE)
+   *                            2 => int32
+   *                            3 => uint32
+   *                         0x10 => A flag to indicate a properties.  This
+   *                                 is ORed with the above values.
+   *   ULONG    item_value   For strings  => Offset into string table without
+   *                                         the corresponding double quotes.
+   *                         For atoms    => Offset into string table.
+   *                         For integers => Direct value.
+   *
+   * All strings in the string table consist of bytes and are
+   * zero-terminated.
+   *
+   */
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+  typedef struct  TT_BDFRec_
+  {
+    FT_Byte*   table;
+    FT_Byte*   table_end;
+    FT_Byte*   strings;
+    FT_ULong   strings_size;
+    FT_UInt    num_strikes;
+    FT_Bool    loaded;
+
+  } TT_BDFRec, *TT_BDF;
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                  ORIGINAL TT_FACE CLASS DEFINITION                ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This structure/class is defined here because it is common to the      */
+  /* following formats: TTF, OpenType-TT, and OpenType-CFF.                */
+  /*                                                                       */
+  /* Note, however, that the classes TT_Size and TT_GlyphSlot are not      */
+  /* shared between font drivers, and are thus defined in `ttobjs.h'.      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_Face                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a TrueType face/font object.  A TT_Face encapsulates   */
+  /*    the resolution and scaling independent parts of a TrueType font    */
+  /*    resource.                                                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The TT_Face structure is also used as a `parent class' for the     */
+  /*    OpenType-CFF class (T2_Face).                                      */
+  /*                                                                       */
+  typedef struct TT_FaceRec_*  TT_Face;
+
+
+  /* a function type used for the truetype bytecode interpreter hooks */
+  typedef FT_Error
+  (*TT_Interpreter)( void*  exec_context );
+
+  /* forward declaration */
+  typedef struct TT_LoaderRec_*  TT_Loader;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Loader_GotoTableFunc                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Seeks a stream to the start of a given TrueType table.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    tag    :: A 4-byte tag used to name the table.                     */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    length :: The length of the table in bytes.  Set to 0 if not       */
+  /*              needed.                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be at the font file's origin.               */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Loader_GotoTableFunc)( TT_Face    face,
+                              FT_ULong   tag,
+                              FT_Stream  stream,
+                              FT_ULong*  length );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Loader_StartGlyphFunc                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Seeks a stream to the start of a given glyph element, and opens a  */
+  /*    frame for it.                                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    loader      :: The current TrueType glyph loader object.           */
+  /*                                                                       */
+  /*    glyph index :: The index of the glyph to access.                   */
+  /*                                                                       */
+  /*    offset      :: The offset of the glyph according to the            */
+  /*                   `locations' table.                                  */
+  /*                                                                       */
+  /*    byte_count  :: The size of the frame in bytes.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is normally equivalent to FT_STREAM_SEEK(offset)     */
+  /*    followed by FT_FRAME_ENTER(byte_count) with the loader's stream,   */
+  /*    but alternative formats (e.g. compressed ones) might use something */
+  /*    different.                                                         */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Loader_StartGlyphFunc)( TT_Loader  loader,
+                               FT_UInt    glyph_index,
+                               FT_ULong   offset,
+                               FT_UInt    byte_count );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Loader_ReadGlyphFunc                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Reads one glyph element (its header, a simple glyph, or a          */
+  /*    composite) from the loader's current stream frame.                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    loader :: The current TrueType glyph loader object.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Loader_ReadGlyphFunc)( TT_Loader  loader );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Loader_EndGlyphFunc                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Closes the current loader stream frame for the glyph.              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    loader :: The current TrueType glyph loader object.                */
+  /*                                                                       */
+  typedef void
+  (*TT_Loader_EndGlyphFunc)( TT_Loader  loader );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                         TrueType Face Type                            */
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Face                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The TrueType face class.  These objects model the resolution and   */
+  /*    point-size independent data found in a TrueType font file.         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root                 :: The base FT_Face structure, managed by the */
+  /*                            base layer.                                */
+  /*                                                                       */
+  /*    ttc_header           :: The TrueType collection header, used when  */
+  /*                            the file is a `ttc' rather than a `ttf'.   */
+  /*                            For ordinary font files, the field         */
+  /*                            `ttc_header.count' is set to 0.            */
+  /*                                                                       */
+  /*    format_tag           :: The font format tag.                       */
+  /*                                                                       */
+  /*    num_tables           :: The number of TrueType tables in this font */
+  /*                            file.                                      */
+  /*                                                                       */
+  /*    dir_tables           :: The directory of TrueType tables for this  */
+  /*                            font file.                                 */
+  /*                                                                       */
+  /*    header               :: The font's font header (`head' table).     */
+  /*                            Read on font opening.                      */
+  /*                                                                       */
+  /*    horizontal           :: The font's horizontal header (`hhea'       */
+  /*                            table).  This field also contains the      */
+  /*                            associated horizontal metrics table        */
+  /*                            (`hmtx').                                  */
+  /*                                                                       */
+  /*    max_profile          :: The font's maximum profile table.  Read on */
+  /*                            font opening.  Note that some maximum      */
+  /*                            values cannot be taken directly from this  */
+  /*                            table.  We thus define additional fields   */
+  /*                            below to hold the computed maxima.         */
+  /*                                                                       */
+  /*    vertical_info        :: A boolean which is set when the font file  */
+  /*                            contains vertical metrics.  If not, the    */
+  /*                            value of the `vertical' field is           */
+  /*                            undefined.                                 */
+  /*                                                                       */
+  /*    vertical             :: The font's vertical header (`vhea' table). */
+  /*                            This field also contains the associated    */
+  /*                            vertical metrics table (`vmtx'), if found. */
+  /*                            IMPORTANT: The contents of this field is   */
+  /*                            undefined if the `verticalInfo' field is   */
+  /*                            unset.                                     */
+  /*                                                                       */
+  /*    num_names            :: The number of name records within this     */
+  /*                            TrueType font.                             */
+  /*                                                                       */
+  /*    name_table           :: The table of name records (`name').        */
+  /*                                                                       */
+  /*    os2                  :: The font's OS/2 table (`OS/2').            */
+  /*                                                                       */
+  /*    postscript           :: The font's PostScript table (`post'        */
+  /*                            table).  The PostScript glyph names are    */
+  /*                            not loaded by the driver on face opening.  */
+  /*                            See the `ttpost' module for more details.  */
+  /*                                                                       */
+  /*    cmap_table           :: Address of the face's `cmap' SFNT table    */
+  /*                            in memory (it's an extracted frame).       */
+  /*                                                                       */
+  /*    cmap_size            :: The size in bytes of the `cmap_table'      */
+  /*                            described above.                           */
+  /*                                                                       */
+  /*    goto_table           :: A function called by each TrueType table   */
+  /*                            loader to position a stream's cursor to    */
+  /*                            the start of a given table according to    */
+  /*                            its tag.  It defaults to TT_Goto_Face but  */
+  /*                            can be different for strange formats (e.g. */
+  /*                            Type 42).                                  */
+  /*                                                                       */
+  /*    access_glyph_frame   :: A function used to access the frame of a   */
+  /*                            given glyph within the face's font file.   */
+  /*                                                                       */
+  /*    forget_glyph_frame   :: A function used to forget the frame of a   */
+  /*                            given glyph when all data has been loaded. */
+  /*                                                                       */
+  /*    read_glyph_header    :: A function used to read a glyph header.    */
+  /*                            It must be called between an `access' and  */
+  /*                            `forget'.                                  */
+  /*                                                                       */
+  /*    read_simple_glyph    :: A function used to read a simple glyph.    */
+  /*                            It must be called after the header was     */
+  /*                            read, and before the `forget'.             */
+  /*                                                                       */
+  /*    read_composite_glyph :: A function used to read a composite glyph. */
+  /*                            It must be called after the header was     */
+  /*                            read, and before the `forget'.             */
+  /*                                                                       */
+  /*    sfnt                 :: A pointer to the SFNT service.             */
+  /*                                                                       */
+  /*    psnames              :: A pointer to the PostScript names service. */
+  /*                                                                       */
+  /*    hdmx                 :: The face's horizontal device metrics       */
+  /*                            (`hdmx' table).  This table is optional in */
+  /*                            TrueType/OpenType fonts.                   */
+  /*                                                                       */
+  /*    gasp                 :: The grid-fitting and scaling properties    */
+  /*                            table (`gasp').  This table is optional in */
+  /*                            TrueType/OpenType fonts.                   */
+  /*                                                                       */
+  /*    pclt                 :: The `pclt' SFNT table.                     */
+  /*                                                                       */
+  /*    num_sbit_strikes     :: The number of sbit strikes, i.e., bitmap   */
+  /*                            sizes, embedded in this font.              */
+  /*                                                                       */
+  /*    sbit_strikes         :: An array of sbit strikes embedded in this  */
+  /*                            font.  This table is optional in a         */
+  /*                            TrueType/OpenType font.                    */
+  /*                                                                       */
+  /*    num_sbit_scales      :: The number of sbit scales for this font.   */
+  /*                                                                       */
+  /*    sbit_scales          :: Array of sbit scales embedded in this      */
+  /*                            font.  This table is optional in a         */
+  /*                            TrueType/OpenType font.                    */
+  /*                                                                       */
+  /*    postscript_names     :: A table used to store the Postscript names */
+  /*                            of  the glyphs for this font.  See the     */
+  /*                            file  `ttconfig.h' for comments on the     */
+  /*                            TT_CONFIG_OPTION_POSTSCRIPT_NAMES option.  */
+  /*                                                                       */
+  /*    num_locations        :: The number of glyph locations in this      */
+  /*                            TrueType file.  This should be             */
+  /*                            identical to the number of glyphs.         */
+  /*                            Ignored for Type 2 fonts.                  */
+  /*                                                                       */
+  /*    glyph_locations      :: An array of longs.  These are offsets to   */
+  /*                            glyph data within the `glyf' table.        */
+  /*                            Ignored for Type 2 font faces.             */
+  /*                                                                       */
+  /*    glyf_len             :: The length of the `glyf' table.  Needed    */
+  /*                            for malformed `loca' tables.               */
+  /*                                                                       */
+  /*    font_program_size    :: Size in bytecodes of the face's font       */
+  /*                            program.  0 if none defined.  Ignored for  */
+  /*                            Type 2 fonts.                              */
+  /*                                                                       */
+  /*    font_program         :: The face's font program (bytecode stream)  */
+  /*                            executed at load time, also used during    */
+  /*                            glyph rendering.  Comes from the `fpgm'    */
+  /*                            table.  Ignored for Type 2 font fonts.     */
+  /*                                                                       */
+  /*    cvt_program_size     :: The size in bytecodes of the face's cvt    */
+  /*                            program.  Ignored for Type 2 fonts.        */
+  /*                                                                       */
+  /*    cvt_program          :: The face's cvt program (bytecode stream)   */
+  /*                            executed each time an instance/size is     */
+  /*                            changed/reset.  Comes from the `prep'      */
+  /*                            table.  Ignored for Type 2 fonts.          */
+  /*                                                                       */
+  /*    cvt_size             :: Size of the control value table (in        */
+  /*                            entries).   Ignored for Type 2 fonts.      */
+  /*                                                                       */
+  /*    cvt                  :: The face's original control value table.   */
+  /*                            Coordinates are expressed in unscaled font */
+  /*                            units.  Comes from the `cvt ' table.       */
+  /*                            Ignored for Type 2 fonts.                  */
+  /*                                                                       */
+  /*    num_kern_pairs       :: The number of kerning pairs present in the */
+  /*                            font file.  The engine only loads the      */
+  /*                            first horizontal format 0 kern table it    */
+  /*                            finds in the font file.  Ignored for       */
+  /*                            Type 2 fonts.                              */
+  /*                                                                       */
+  /*    kern_table_index     :: The index of the kerning table in the font */
+  /*                            kerning directory.  Ignored for Type 2     */
+  /*                            fonts.                                     */
+  /*                                                                       */
+  /*    interpreter          :: A pointer to the TrueType bytecode         */
+  /*                            interpreters field is also used to hook    */
+  /*                            the debugger in `ttdebug'.                 */
+  /*                                                                       */
+  /*    unpatented_hinting   :: If true, use only unpatented methods in    */
+  /*                            the bytecode interpreter.                  */
+  /*                                                                       */
+  /*    doblend              :: A boolean which is set if the font should  */
+  /*                            be blended (this is for GX var).           */
+  /*                                                                       */
+  /*    blend                :: Contains the data needed to control GX     */
+  /*                            variation tables (rather like Multiple     */
+  /*                            Master data).                              */
+  /*                                                                       */
+  /*    extra                :: Reserved for third-party font drivers.     */
+  /*                                                                       */
+  /*    postscript_name      :: The PS name of the font.  Used by the      */
+  /*                            postscript name service.                   */
+  /*                                                                       */
+  typedef struct  TT_FaceRec_
+  {
+    FT_FaceRec            root;
+
+    TTC_HeaderRec         ttc_header;
+
+    FT_ULong              format_tag;
+    FT_UShort             num_tables;
+    TT_Table              dir_tables;
+
+    TT_Header             header;       /* TrueType header table          */
+    TT_HoriHeader         horizontal;   /* TrueType horizontal header     */
+
+    TT_MaxProfile         max_profile;
+
+    FT_Bool               vertical_info;
+    TT_VertHeader         vertical;     /* TT Vertical header, if present */
+
+    FT_UShort             num_names;    /* number of name records  */
+    TT_NameTableRec       name_table;   /* name table              */
+
+    TT_OS2                os2;          /* TrueType OS/2 table            */
+    TT_Postscript         postscript;   /* TrueType Postscript table      */
+
+    FT_Byte*              cmap_table;   /* extracted `cmap' table */
+    FT_ULong              cmap_size;
+
+    TT_Loader_GotoTableFunc   goto_table;
+
+    TT_Loader_StartGlyphFunc  access_glyph_frame;
+    TT_Loader_EndGlyphFunc    forget_glyph_frame;
+    TT_Loader_ReadGlyphFunc   read_glyph_header;
+    TT_Loader_ReadGlyphFunc   read_simple_glyph;
+    TT_Loader_ReadGlyphFunc   read_composite_glyph;
+
+    /* a typeless pointer to the SFNT_Interface table used to load */
+    /* the basic TrueType tables in the face object                */
+    void*                 sfnt;
+
+    /* a typeless pointer to the FT_Service_PsCMapsRec table used to */
+    /* handle glyph names <-> unicode & Mac values                   */
+    void*                 psnames;
+
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* Optional TrueType/OpenType tables                                   */
+    /*                                                                     */
+    /***********************************************************************/
+
+    /* grid-fitting and scaling table */
+    TT_GaspRec            gasp;                 /* the `gasp' table */
+
+    /* PCL 5 table */
+    TT_PCLT               pclt;
+
+    /* embedded bitmaps support */
+    FT_ULong              num_sbit_scales;
+    TT_SBit_Scale         sbit_scales;
+
+    /* postscript names table */
+    TT_Post_NamesRec      postscript_names;
+
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* TrueType-specific fields (ignored by the OTF-Type2 driver)          */
+    /*                                                                     */
+    /***********************************************************************/
+
+    /* the font program, if any */
+    FT_ULong              font_program_size;
+    FT_Byte*              font_program;
+
+    /* the cvt program, if any */
+    FT_ULong              cvt_program_size;
+    FT_Byte*              cvt_program;
+
+    /* the original, unscaled, control value table */
+    FT_ULong              cvt_size;
+    FT_Short*             cvt;
+
+    /* A pointer to the bytecode interpreter to use.  This is also */
+    /* used to hook the debugger for the `ttdebug' utility.        */
+    TT_Interpreter        interpreter;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    /* Use unpatented hinting only. */
+    FT_Bool               unpatented_hinting;
+#endif
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* Other tables or fields. This is used by derivative formats like     */
+    /* OpenType.                                                           */
+    /*                                                                     */
+    /***********************************************************************/
+
+    FT_Generic            extra;
+
+    const char*           postscript_name;
+
+    FT_ULong              glyf_len;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    FT_Bool               doblend;
+    GX_Blend              blend;
+#endif
+
+    /* since version 2.2 */
+
+    FT_Byte*              horz_metrics;
+    FT_ULong              horz_metrics_size;
+
+    FT_Byte*              vert_metrics;
+    FT_ULong              vert_metrics_size;
+
+    FT_ULong              num_locations; /* in broken TTF, gid > 0xFFFF */
+    FT_Byte*              glyph_locations;
+
+    FT_Byte*              hdmx_table;
+    FT_ULong              hdmx_table_size;
+    FT_UInt               hdmx_record_count;
+    FT_ULong              hdmx_record_size;
+    FT_Byte*              hdmx_record_sizes;
+
+    FT_Byte*              sbit_table;
+    FT_ULong              sbit_table_size;
+    FT_UInt               sbit_num_strikes;
+
+    FT_Byte*              kern_table;
+    FT_ULong              kern_table_size;
+    FT_UInt               num_kern_tables;
+    FT_UInt32             kern_avail_bits;
+    FT_UInt32             kern_order_bits;
+
+#ifdef TT_CONFIG_OPTION_BDF
+    TT_BDFRec             bdf;
+#endif /* TT_CONFIG_OPTION_BDF */
+
+    /* since 2.3.0 */
+    FT_ULong              horz_metrics_offset;
+    FT_ULong              vert_metrics_offset;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    /* since 2.4.12 */
+    FT_ULong              sph_found_func_flags; /* special functions found */
+                                                /* for this face           */
+    FT_Bool               sph_compatibility_mode;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+  } TT_FaceRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  <Struct>                                                             */
+  /*     TT_GlyphZoneRec                                                   */
+  /*                                                                       */
+  /*  <Description>                                                        */
+  /*     A glyph zone is used to load, scale and hint glyph outline        */
+  /*     coordinates.                                                      */
+  /*                                                                       */
+  /*  <Fields>                                                             */
+  /*     memory       :: A handle to the memory manager.                   */
+  /*                                                                       */
+  /*     max_points   :: The maximum size in points of the zone.           */
+  /*                                                                       */
+  /*     max_contours :: Max size in links contours of the zone.           */
+  /*                                                                       */
+  /*     n_points     :: The current number of points in the zone.         */
+  /*                                                                       */
+  /*     n_contours   :: The current number of contours in the zone.       */
+  /*                                                                       */
+  /*     org          :: The original glyph coordinates (font              */
+  /*                     units/scaled).                                    */
+  /*                                                                       */
+  /*     cur          :: The current glyph coordinates (scaled/hinted).    */
+  /*                                                                       */
+  /*     tags         :: The point control tags.                           */
+  /*                                                                       */
+  /*     contours     :: The contours end points.                          */
+  /*                                                                       */
+  /*     first_point  :: Offset of the current subglyph's first point.     */
+  /*                                                                       */
+  typedef struct  TT_GlyphZoneRec_
+  {
+    FT_Memory   memory;
+    FT_UShort   max_points;
+    FT_UShort   max_contours;
+    FT_UShort   n_points;    /* number of points in zone    */
+    FT_Short    n_contours;  /* number of contours          */
+
+    FT_Vector*  org;         /* original point coordinates  */
+    FT_Vector*  cur;         /* current point coordinates   */
+    FT_Vector*  orus;        /* original (unscaled) point coordinates */
+
+    FT_Byte*    tags;        /* current touch flags         */
+    FT_UShort*  contours;    /* contour end points          */
+
+    FT_UShort   first_point; /* offset of first (#0) point  */
+
+  } TT_GlyphZoneRec, *TT_GlyphZone;
+
+
+  /* handle to execution context */
+  typedef struct TT_ExecContextRec_*  TT_ExecContext;
+
+  /* glyph loader structure */
+  typedef struct  TT_LoaderRec_
+  {
+    FT_Face          face;
+    FT_Size          size;
+    FT_GlyphSlot     glyph;
+    FT_GlyphLoader   gloader;
+
+    FT_ULong         load_flags;
+    FT_UInt          glyph_index;
+
+    FT_Stream        stream;
+    FT_Int           byte_len;
+
+    FT_Short         n_contours;
+    FT_BBox          bbox;
+    FT_Int           left_bearing;
+    FT_Int           advance;
+    FT_Int           linear;
+    FT_Bool          linear_def;
+    FT_Bool          preserve_pps;
+    FT_Vector        pp1;
+    FT_Vector        pp2;
+
+    FT_ULong         glyf_offset;
+
+    /* the zone where we load our glyphs */
+    TT_GlyphZoneRec  base;
+    TT_GlyphZoneRec  zone;
+
+    TT_ExecContext   exec;
+    FT_Byte*         instructions;
+    FT_ULong         ins_pos;
+
+    /* for possible extensibility in other formats */
+    void*            other;
+
+    /* since version 2.1.8 */
+    FT_Int           top_bearing;
+    FT_Int           vadvance;
+    FT_Vector        pp3;
+    FT_Vector        pp4;
+
+    /* since version 2.2.1 */
+    FT_Byte*         cursor;
+    FT_Byte*         limit;
+
+  } TT_LoaderRec;
+
+
+FT_END_HEADER
+
+#endif /* __TTTYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/t1tables.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/t1tables.h
new file mode 100644
index 0000000..6530094
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/t1tables.h
@@ -0,0 +1,662 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1tables.h                                                             */
+/*                                                                         */
+/*    Basic Type 1/Type 2 tables definitions and interface (specification  */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006, 2008, 2009, 2011 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1TABLES_H__
+#define __T1TABLES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    type1_tables                                                       */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Type 1 Tables                                                      */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Type~1 (PostScript) specific font tables.                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the definition of Type 1-specific tables,    */
+  /*    including structures related to other PostScript font formats.     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */
+  /* structures in order to support Multiple Master fonts.               */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_FontInfoRec                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a Type~1 or Type~2 FontInfo dictionary.  */
+  /*    Note that for Multiple Master fonts, each instance has its own     */
+  /*    FontInfo dictionary.                                               */
+  /*                                                                       */
+  typedef struct  PS_FontInfoRec_
+  {
+    FT_String*  version;
+    FT_String*  notice;
+    FT_String*  full_name;
+    FT_String*  family_name;
+    FT_String*  weight;
+    FT_Long     italic_angle;
+    FT_Bool     is_fixed_pitch;
+    FT_Short    underline_position;
+    FT_UShort   underline_thickness;
+
+  } PS_FontInfoRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_FontInfo                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a @PS_FontInfoRec structure.                           */
+  /*                                                                       */
+  typedef struct PS_FontInfoRec_*  PS_FontInfo;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    T1_FontInfo                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This type is equivalent to @PS_FontInfoRec.  It is deprecated but  */
+  /*    kept to maintain source compatibility between various versions of  */
+  /*    FreeType.                                                          */
+  /*                                                                       */
+  typedef PS_FontInfoRec  T1_FontInfo;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_PrivateRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a Type~1 or Type~2 private dictionary.   */
+  /*    Note that for Multiple Master fonts, each instance has its own     */
+  /*    Private dictionary.                                                */
+  /*                                                                       */
+  typedef struct  PS_PrivateRec_
+  {
+    FT_Int     unique_id;
+    FT_Int     lenIV;
+
+    FT_Byte    num_blue_values;
+    FT_Byte    num_other_blues;
+    FT_Byte    num_family_blues;
+    FT_Byte    num_family_other_blues;
+
+    FT_Short   blue_values[14];
+    FT_Short   other_blues[10];
+
+    FT_Short   family_blues      [14];
+    FT_Short   family_other_blues[10];
+
+    FT_Fixed   blue_scale;
+    FT_Int     blue_shift;
+    FT_Int     blue_fuzz;
+
+    FT_UShort  standard_width[1];
+    FT_UShort  standard_height[1];
+
+    FT_Byte    num_snap_widths;
+    FT_Byte    num_snap_heights;
+    FT_Bool    force_bold;
+    FT_Bool    round_stem_up;
+
+    FT_Short   snap_widths [13];  /* including std width  */
+    FT_Short   snap_heights[13];  /* including std height */
+
+    FT_Fixed   expansion_factor;
+
+    FT_Long    language_group;
+    FT_Long    password;
+
+    FT_Short   min_feature[2];
+
+  } PS_PrivateRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_Private                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a @PS_PrivateRec structure.                            */
+  /*                                                                       */
+  typedef struct PS_PrivateRec_*  PS_Private;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    T1_Private                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   This type is equivalent to @PS_PrivateRec.  It is deprecated but    */
+  /*   kept to maintain source compatibility between various versions of   */
+  /*   FreeType.                                                           */
+  /*                                                                       */
+  typedef PS_PrivateRec  T1_Private;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    T1_Blend_Flags                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A set of flags used to indicate which fields are present in a      */
+  /*    given blend dictionary (font info or private).  Used to support    */
+  /*    Multiple Masters fonts.                                            */
+  /*                                                                       */
+  typedef enum  T1_Blend_Flags_
+  {
+    /*# required fields in a FontInfo blend dictionary */
+    T1_BLEND_UNDERLINE_POSITION = 0,
+    T1_BLEND_UNDERLINE_THICKNESS,
+    T1_BLEND_ITALIC_ANGLE,
+
+    /*# required fields in a Private blend dictionary */
+    T1_BLEND_BLUE_VALUES,
+    T1_BLEND_OTHER_BLUES,
+    T1_BLEND_STANDARD_WIDTH,
+    T1_BLEND_STANDARD_HEIGHT,
+    T1_BLEND_STEM_SNAP_WIDTHS,
+    T1_BLEND_STEM_SNAP_HEIGHTS,
+    T1_BLEND_BLUE_SCALE,
+    T1_BLEND_BLUE_SHIFT,
+    T1_BLEND_FAMILY_BLUES,
+    T1_BLEND_FAMILY_OTHER_BLUES,
+    T1_BLEND_FORCE_BOLD,
+
+    /*# never remove */
+    T1_BLEND_MAX
+
+  } T1_Blend_Flags;
+
+  /* */
+
+
+  /*# backwards compatible definitions */
+#define t1_blend_underline_position   T1_BLEND_UNDERLINE_POSITION
+#define t1_blend_underline_thickness  T1_BLEND_UNDERLINE_THICKNESS
+#define t1_blend_italic_angle         T1_BLEND_ITALIC_ANGLE
+#define t1_blend_blue_values          T1_BLEND_BLUE_VALUES
+#define t1_blend_other_blues          T1_BLEND_OTHER_BLUES
+#define t1_blend_standard_widths      T1_BLEND_STANDARD_WIDTH
+#define t1_blend_standard_height      T1_BLEND_STANDARD_HEIGHT
+#define t1_blend_stem_snap_widths     T1_BLEND_STEM_SNAP_WIDTHS
+#define t1_blend_stem_snap_heights    T1_BLEND_STEM_SNAP_HEIGHTS
+#define t1_blend_blue_scale           T1_BLEND_BLUE_SCALE
+#define t1_blend_blue_shift           T1_BLEND_BLUE_SHIFT
+#define t1_blend_family_blues         T1_BLEND_FAMILY_BLUES
+#define t1_blend_family_other_blues   T1_BLEND_FAMILY_OTHER_BLUES
+#define t1_blend_force_bold           T1_BLEND_FORCE_BOLD
+#define t1_blend_max                  T1_BLEND_MAX
+
+
+  /* maximum number of Multiple Masters designs, as defined in the spec */
+#define T1_MAX_MM_DESIGNS     16
+
+  /* maximum number of Multiple Masters axes, as defined in the spec */
+#define T1_MAX_MM_AXIS        4
+
+  /* maximum number of elements in a design map */
+#define T1_MAX_MM_MAP_POINTS  20
+
+
+  /* this structure is used to store the BlendDesignMap entry for an axis */
+  typedef struct  PS_DesignMap_
+  {
+    FT_Byte    num_points;
+    FT_Long*   design_points;
+    FT_Fixed*  blend_points;
+
+  } PS_DesignMapRec, *PS_DesignMap;
+
+  /* backwards-compatible definition */
+  typedef PS_DesignMapRec  T1_DesignMap;
+
+
+  typedef struct  PS_BlendRec_
+  {
+    FT_UInt          num_designs;
+    FT_UInt          num_axis;
+
+    FT_String*       axis_names[T1_MAX_MM_AXIS];
+    FT_Fixed*        design_pos[T1_MAX_MM_DESIGNS];
+    PS_DesignMapRec  design_map[T1_MAX_MM_AXIS];
+
+    FT_Fixed*        weight_vector;
+    FT_Fixed*        default_weight_vector;
+
+    PS_FontInfo      font_infos[T1_MAX_MM_DESIGNS + 1];
+    PS_Private       privates  [T1_MAX_MM_DESIGNS + 1];
+
+    FT_ULong         blend_bitflags;
+
+    FT_BBox*         bboxes    [T1_MAX_MM_DESIGNS + 1];
+
+    /* since 2.3.0 */
+
+    /* undocumented, optional: the default design instance;   */
+    /* corresponds to default_weight_vector --                */
+    /* num_default_design_vector == 0 means it is not present */
+    /* in the font and associated metrics files               */
+    FT_UInt          default_design_vector[T1_MAX_MM_DESIGNS];
+    FT_UInt          num_default_design_vector;
+
+  } PS_BlendRec, *PS_Blend;
+
+
+  /* backwards-compatible definition */
+  typedef PS_BlendRec  T1_Blend;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_FaceDictRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to represent data in a CID top-level dictionary.  */
+  /*                                                                       */
+  typedef struct  CID_FaceDictRec_
+  {
+    PS_PrivateRec  private_dict;
+
+    FT_UInt        len_buildchar;
+    FT_Fixed       forcebold_threshold;
+    FT_Pos         stroke_width;
+    FT_Fixed       expansion_factor;
+
+    FT_Byte        paint_type;
+    FT_Byte        font_type;
+    FT_Matrix      font_matrix;
+    FT_Vector      font_offset;
+
+    FT_UInt        num_subrs;
+    FT_ULong       subrmap_offset;
+    FT_Int         sd_bytes;
+
+  } CID_FaceDictRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_FaceDict                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a @CID_FaceDictRec structure.                          */
+  /*                                                                       */
+  typedef struct CID_FaceDictRec_*  CID_FaceDict;
+
+  /* */
+
+
+  /* backwards-compatible definition */
+  typedef CID_FaceDictRec  CID_FontDict;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_FaceInfoRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to represent CID Face information.                */
+  /*                                                                       */
+  typedef struct  CID_FaceInfoRec_
+  {
+    FT_String*      cid_font_name;
+    FT_Fixed        cid_version;
+    FT_Int          cid_font_type;
+
+    FT_String*      registry;
+    FT_String*      ordering;
+    FT_Int          supplement;
+
+    PS_FontInfoRec  font_info;
+    FT_BBox         font_bbox;
+    FT_ULong        uid_base;
+
+    FT_Int          num_xuid;
+    FT_ULong        xuid[16];
+
+    FT_ULong        cidmap_offset;
+    FT_Int          fd_bytes;
+    FT_Int          gd_bytes;
+    FT_ULong        cid_count;
+
+    FT_Int          num_dicts;
+    CID_FaceDict    font_dicts;
+
+    FT_ULong        data_offset;
+
+  } CID_FaceInfoRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_FaceInfo                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a @CID_FaceInfoRec structure.                          */
+  /*                                                                       */
+  typedef struct CID_FaceInfoRec_*  CID_FaceInfo;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_Info                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   This type is equivalent to @CID_FaceInfoRec.  It is deprecated but  */
+  /*   kept to maintain source compatibility between various versions of   */
+  /*   FreeType.                                                           */
+  /*                                                                       */
+  typedef CID_FaceInfoRec  CID_Info;
+
+
+  /************************************************************************
+   *
+   * @function:
+   *    FT_Has_PS_Glyph_Names
+   *
+   * @description:
+   *    Return true if a given face provides reliable PostScript glyph
+   *    names.  This is similar to using the @FT_HAS_GLYPH_NAMES macro,
+   *    except that certain fonts (mostly TrueType) contain incorrect
+   *    glyph name tables.
+   *
+   *    When this function returns true, the caller is sure that the glyph
+   *    names returned by @FT_Get_Glyph_Name are reliable.
+   *
+   * @input:
+   *    face ::
+   *       face handle
+   *
+   * @return:
+   *    Boolean.  True if glyph names are reliable.
+   *
+   */
+  FT_EXPORT( FT_Int )
+  FT_Has_PS_Glyph_Names( FT_Face  face );
+
+
+  /************************************************************************
+   *
+   * @function:
+   *    FT_Get_PS_Font_Info
+   *
+   * @description:
+   *    Retrieve the @PS_FontInfoRec structure corresponding to a given
+   *    PostScript font.
+   *
+   * @input:
+   *    face ::
+   *       PostScript face handle.
+   *
+   * @output:
+   *    afont_info ::
+   *       Output font info structure pointer.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    The string pointers within the font info structure are owned by
+   *    the face and don't need to be freed by the caller.
+   *
+   *    If the font's format is not PostScript-based, this function will
+   *    return the `FT_Err_Invalid_Argument' error code.
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_PS_Font_Info( FT_Face      face,
+                       PS_FontInfo  afont_info );
+
+
+  /************************************************************************
+   *
+   * @function:
+   *    FT_Get_PS_Font_Private
+   *
+   * @description:
+   *    Retrieve the @PS_PrivateRec structure corresponding to a given
+   *    PostScript font.
+   *
+   * @input:
+   *    face ::
+   *       PostScript face handle.
+   *
+   * @output:
+   *    afont_private ::
+   *       Output private dictionary structure pointer.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    The string pointers within the @PS_PrivateRec structure are owned by
+   *    the face and don't need to be freed by the caller.
+   *
+   *    If the font's format is not PostScript-based, this function returns
+   *    the `FT_Err_Invalid_Argument' error code.
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_PS_Font_Private( FT_Face     face,
+                          PS_Private  afont_private );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    T1_EncodingType                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration describing the `Encoding' entry in a Type 1         */
+  /*    dictionary.                                                        */
+  /*                                                                       */
+  typedef enum  T1_EncodingType_
+  {
+    T1_ENCODING_TYPE_NONE = 0,
+    T1_ENCODING_TYPE_ARRAY,
+    T1_ENCODING_TYPE_STANDARD,
+    T1_ENCODING_TYPE_ISOLATIN1,
+    T1_ENCODING_TYPE_EXPERT
+
+  } T1_EncodingType;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    PS_Dict_Keys                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration used in calls to @FT_Get_PS_Font_Value to identify  */
+  /*    the Type~1 dictionary entry to retrieve.                           */
+  /*                                                                       */
+  typedef enum  PS_Dict_Keys_
+  {
+    /* conventionally in the font dictionary */
+    PS_DICT_FONT_TYPE,              /* FT_Byte         */
+    PS_DICT_FONT_MATRIX,            /* FT_Fixed        */
+    PS_DICT_FONT_BBOX,              /* FT_Fixed        */
+    PS_DICT_PAINT_TYPE,             /* FT_Byte         */
+    PS_DICT_FONT_NAME,              /* FT_String*      */
+    PS_DICT_UNIQUE_ID,              /* FT_Int          */
+    PS_DICT_NUM_CHAR_STRINGS,       /* FT_Int          */
+    PS_DICT_CHAR_STRING_KEY,        /* FT_String*      */
+    PS_DICT_CHAR_STRING,            /* FT_String*      */
+    PS_DICT_ENCODING_TYPE,          /* T1_EncodingType */
+    PS_DICT_ENCODING_ENTRY,         /* FT_String*      */
+
+    /* conventionally in the font Private dictionary */
+    PS_DICT_NUM_SUBRS,              /* FT_Int     */
+    PS_DICT_SUBR,                   /* FT_String* */
+    PS_DICT_STD_HW,                 /* FT_UShort  */
+    PS_DICT_STD_VW,                 /* FT_UShort  */
+    PS_DICT_NUM_BLUE_VALUES,        /* FT_Byte    */
+    PS_DICT_BLUE_VALUE,             /* FT_Short   */
+    PS_DICT_BLUE_FUZZ,              /* FT_Int     */
+    PS_DICT_NUM_OTHER_BLUES,        /* FT_Byte    */
+    PS_DICT_OTHER_BLUE,             /* FT_Short   */
+    PS_DICT_NUM_FAMILY_BLUES,       /* FT_Byte    */
+    PS_DICT_FAMILY_BLUE,            /* FT_Short   */
+    PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte    */
+    PS_DICT_FAMILY_OTHER_BLUE,      /* FT_Short   */
+    PS_DICT_BLUE_SCALE,             /* FT_Fixed   */
+    PS_DICT_BLUE_SHIFT,             /* FT_Int     */
+    PS_DICT_NUM_STEM_SNAP_H,        /* FT_Byte    */
+    PS_DICT_STEM_SNAP_H,            /* FT_Short   */
+    PS_DICT_NUM_STEM_SNAP_V,        /* FT_Byte    */
+    PS_DICT_STEM_SNAP_V,            /* FT_Short   */
+    PS_DICT_FORCE_BOLD,             /* FT_Bool    */
+    PS_DICT_RND_STEM_UP,            /* FT_Bool    */
+    PS_DICT_MIN_FEATURE,            /* FT_Short   */
+    PS_DICT_LEN_IV,                 /* FT_Int     */
+    PS_DICT_PASSWORD,               /* FT_Long    */
+    PS_DICT_LANGUAGE_GROUP,         /* FT_Long    */
+
+    /* conventionally in the font FontInfo dictionary */
+    PS_DICT_VERSION,                /* FT_String* */
+    PS_DICT_NOTICE,                 /* FT_String* */
+    PS_DICT_FULL_NAME,              /* FT_String* */
+    PS_DICT_FAMILY_NAME,            /* FT_String* */
+    PS_DICT_WEIGHT,                 /* FT_String* */
+    PS_DICT_IS_FIXED_PITCH,         /* FT_Bool    */
+    PS_DICT_UNDERLINE_POSITION,     /* FT_Short   */
+    PS_DICT_UNDERLINE_THICKNESS,    /* FT_UShort  */
+    PS_DICT_FS_TYPE,                /* FT_UShort  */
+    PS_DICT_ITALIC_ANGLE,           /* FT_Long    */
+
+    PS_DICT_MAX = PS_DICT_ITALIC_ANGLE
+
+  } PS_Dict_Keys;
+
+
+  /************************************************************************
+   *
+   * @function:
+   *    FT_Get_PS_Font_Value
+   *
+   * @description:
+   *    Retrieve the value for the supplied key from a PostScript font.
+   *
+   * @input:
+   *    face ::
+   *       PostScript face handle.
+   *
+   *    key ::
+   *       An enumeration value representing the dictionary key to retrieve.
+   *
+   *    idx ::
+   *       For array values, this specifies the index to be returned.
+   *
+   *    value ::
+   *       A pointer to memory into which to write the value.
+   *
+   *    valen_len ::
+   *       The size, in bytes, of the memory supplied for the value.
+   *
+   * @output:
+   *    value ::
+   *       The value matching the above key, if it exists.
+   *
+   * @return:
+   *    The amount of memory (in bytes) required to hold the requested
+   *    value (if it exists, -1 otherwise).
+   *
+   * @note:
+   *    The values returned are not pointers into the internal structures of
+   *    the face, but are `fresh' copies, so that the memory containing them
+   *    belongs to the calling application.  This also enforces the
+   *    `read-only' nature of these values, i.e., this function cannot be
+   *    used to manipulate the face.
+   *
+   *    `value' is a void pointer because the values returned can be of
+   *    various types.
+   *
+   *    If either `value' is NULL or `value_len' is too small, just the
+   *    required memory size for the requested entry is returned.
+   *
+   *    The `idx' parameter is used, not only to retrieve elements of, for
+   *    example, the FontMatrix or FontBBox, but also to retrieve name keys
+   *    from the CharStrings dictionary, and the charstrings themselves.  It
+   *    is ignored for atomic values.
+   *
+   *    PS_DICT_BLUE_SCALE returns a value that is scaled up by 1000.  To
+   *    get the value as in the font stream, you need to divide by
+   *    65536000.0 (to remove the FT_Fixed scale, and the x1000 scale).
+   *
+   *    IMPORTANT: Only key/value pairs read by the FreeType interpreter can
+   *    be retrieved.  So, for example, PostScript procedures such as NP,
+   *    ND, and RD are not available.  Arbitrary keys are, obviously, not be
+   *    available either.
+   *
+   *    If the font's format is not PostScript-based, this function returns
+   *    the `FT_Err_Invalid_Argument' error code.
+   *
+   */
+  FT_EXPORT( FT_Long )
+  FT_Get_PS_Font_Value( FT_Face       face,
+                        PS_Dict_Keys  key,
+                        FT_UInt       idx,
+                        void         *value,
+                        FT_Long       value_len );
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __T1TABLES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttnameid.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttnameid.h
new file mode 100644
index 0000000..862bf92
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttnameid.h
@@ -0,0 +1,1237 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttnameid.h                                                             */
+/*                                                                         */
+/*    TrueType name ID definitions (specification only).                   */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006-2008, 2012 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTNAMEID_H__
+#define __TTNAMEID_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    truetype_tables                                                    */
+  /*                                                                       */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Possible values for the `platform' identifier code in the name        */
+  /* records of the TTF `name' table.                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_PLATFORM_XXX
+   *
+   * @description:
+   *   A list of valid values for the `platform_id' identifier code in
+   *   @FT_CharMapRec and @FT_SfntName structures.
+   *
+   * @values:
+   *   TT_PLATFORM_APPLE_UNICODE ::
+   *     Used by Apple to indicate a Unicode character map and/or name entry.
+   *     See @TT_APPLE_ID_XXX for corresponding `encoding_id' values.  Note
+   *     that name entries in this format are coded as big-endian UCS-2
+   *     character codes _only_.
+   *
+   *   TT_PLATFORM_MACINTOSH ::
+   *     Used by Apple to indicate a MacOS-specific charmap and/or name entry.
+   *     See @TT_MAC_ID_XXX for corresponding `encoding_id' values.  Note that
+   *     most TrueType fonts contain an Apple roman charmap to be usable on
+   *     MacOS systems (even if they contain a Microsoft charmap as well).
+   *
+   *   TT_PLATFORM_ISO ::
+   *     This value was used to specify ISO/IEC 10646 charmaps.  It is however
+   *     now deprecated.  See @TT_ISO_ID_XXX for a list of corresponding
+   *     `encoding_id' values.
+   *
+   *   TT_PLATFORM_MICROSOFT ::
+   *     Used by Microsoft to indicate Windows-specific charmaps.  See
+   *     @TT_MS_ID_XXX for a list of corresponding `encoding_id' values.
+   *     Note that most fonts contain a Unicode charmap using
+   *     (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS).
+   *
+   *   TT_PLATFORM_CUSTOM ::
+   *     Used to indicate application-specific charmaps.
+   *
+   *   TT_PLATFORM_ADOBE ::
+   *     This value isn't part of any font format specification, but is used
+   *     by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec
+   *     structure.  See @TT_ADOBE_ID_XXX.
+   */
+
+#define TT_PLATFORM_APPLE_UNICODE  0
+#define TT_PLATFORM_MACINTOSH      1
+#define TT_PLATFORM_ISO            2 /* deprecated */
+#define TT_PLATFORM_MICROSOFT      3
+#define TT_PLATFORM_CUSTOM         4
+#define TT_PLATFORM_ADOBE          7 /* artificial */
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_APPLE_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_APPLE_UNICODE charmaps and name entries.
+   *
+   * @values:
+   *   TT_APPLE_ID_DEFAULT ::
+   *     Unicode version 1.0.
+   *
+   *   TT_APPLE_ID_UNICODE_1_1 ::
+   *     Unicode 1.1; specifies Hangul characters starting at U+34xx.
+   *
+   *   TT_APPLE_ID_ISO_10646 ::
+   *     Deprecated (identical to preceding).
+   *
+   *   TT_APPLE_ID_UNICODE_2_0 ::
+   *     Unicode 2.0 and beyond (UTF-16 BMP only).
+   *
+   *   TT_APPLE_ID_UNICODE_32 ::
+   *     Unicode 3.1 and beyond, using UTF-32.
+   *
+   *   TT_APPLE_ID_VARIANT_SELECTOR ::
+   *     From Adobe, not Apple.  Not a normal cmap.  Specifies variations
+   *     on a real cmap.
+   */
+
+#define TT_APPLE_ID_DEFAULT           0 /* Unicode 1.0 */
+#define TT_APPLE_ID_UNICODE_1_1       1 /* specify Hangul at U+34xx */
+#define TT_APPLE_ID_ISO_10646         2 /* deprecated */
+#define TT_APPLE_ID_UNICODE_2_0       3 /* or later */
+#define TT_APPLE_ID_UNICODE_32        4 /* 2.0 or later, full repertoire */
+#define TT_APPLE_ID_VARIANT_SELECTOR  5 /* variation selector data */
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_MAC_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_MACINTOSH charmaps and name entries.
+   *
+   * @values:
+   *   TT_MAC_ID_ROMAN ::
+   *   TT_MAC_ID_JAPANESE ::
+   *   TT_MAC_ID_TRADITIONAL_CHINESE ::
+   *   TT_MAC_ID_KOREAN ::
+   *   TT_MAC_ID_ARABIC ::
+   *   TT_MAC_ID_HEBREW ::
+   *   TT_MAC_ID_GREEK ::
+   *   TT_MAC_ID_RUSSIAN ::
+   *   TT_MAC_ID_RSYMBOL ::
+   *   TT_MAC_ID_DEVANAGARI ::
+   *   TT_MAC_ID_GURMUKHI ::
+   *   TT_MAC_ID_GUJARATI ::
+   *   TT_MAC_ID_ORIYA ::
+   *   TT_MAC_ID_BENGALI ::
+   *   TT_MAC_ID_TAMIL ::
+   *   TT_MAC_ID_TELUGU ::
+   *   TT_MAC_ID_KANNADA ::
+   *   TT_MAC_ID_MALAYALAM ::
+   *   TT_MAC_ID_SINHALESE ::
+   *   TT_MAC_ID_BURMESE ::
+   *   TT_MAC_ID_KHMER ::
+   *   TT_MAC_ID_THAI ::
+   *   TT_MAC_ID_LAOTIAN ::
+   *   TT_MAC_ID_GEORGIAN ::
+   *   TT_MAC_ID_ARMENIAN ::
+   *   TT_MAC_ID_MALDIVIAN ::
+   *   TT_MAC_ID_SIMPLIFIED_CHINESE ::
+   *   TT_MAC_ID_TIBETAN ::
+   *   TT_MAC_ID_MONGOLIAN ::
+   *   TT_MAC_ID_GEEZ ::
+   *   TT_MAC_ID_SLAVIC ::
+   *   TT_MAC_ID_VIETNAMESE ::
+   *   TT_MAC_ID_SINDHI ::
+   *   TT_MAC_ID_UNINTERP ::
+   */
+
+#define TT_MAC_ID_ROMAN                 0
+#define TT_MAC_ID_JAPANESE              1
+#define TT_MAC_ID_TRADITIONAL_CHINESE   2
+#define TT_MAC_ID_KOREAN                3
+#define TT_MAC_ID_ARABIC                4
+#define TT_MAC_ID_HEBREW                5
+#define TT_MAC_ID_GREEK                 6
+#define TT_MAC_ID_RUSSIAN               7
+#define TT_MAC_ID_RSYMBOL               8
+#define TT_MAC_ID_DEVANAGARI            9
+#define TT_MAC_ID_GURMUKHI             10
+#define TT_MAC_ID_GUJARATI             11
+#define TT_MAC_ID_ORIYA                12
+#define TT_MAC_ID_BENGALI              13
+#define TT_MAC_ID_TAMIL                14
+#define TT_MAC_ID_TELUGU               15
+#define TT_MAC_ID_KANNADA              16
+#define TT_MAC_ID_MALAYALAM            17
+#define TT_MAC_ID_SINHALESE            18
+#define TT_MAC_ID_BURMESE              19
+#define TT_MAC_ID_KHMER                20
+#define TT_MAC_ID_THAI                 21
+#define TT_MAC_ID_LAOTIAN              22
+#define TT_MAC_ID_GEORGIAN             23
+#define TT_MAC_ID_ARMENIAN             24
+#define TT_MAC_ID_MALDIVIAN            25
+#define TT_MAC_ID_SIMPLIFIED_CHINESE   25
+#define TT_MAC_ID_TIBETAN              26
+#define TT_MAC_ID_MONGOLIAN            27
+#define TT_MAC_ID_GEEZ                 28
+#define TT_MAC_ID_SLAVIC               29
+#define TT_MAC_ID_VIETNAMESE           30
+#define TT_MAC_ID_SINDHI               31
+#define TT_MAC_ID_UNINTERP             32
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_ISO_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_ISO charmaps and name entries.
+   *
+   *   Their use is now deprecated.
+   *
+   * @values:
+   *   TT_ISO_ID_7BIT_ASCII ::
+   *     ASCII.
+   *   TT_ISO_ID_10646 ::
+   *     ISO/10646.
+   *   TT_ISO_ID_8859_1 ::
+   *     Also known as Latin-1.
+   */
+
+#define TT_ISO_ID_7BIT_ASCII  0
+#define TT_ISO_ID_10646       1
+#define TT_ISO_ID_8859_1      2
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_MS_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_MICROSOFT charmaps and name entries.
+   *
+   * @values:
+   *   TT_MS_ID_SYMBOL_CS ::
+   *     Corresponds to Microsoft symbol encoding. See
+   *     @FT_ENCODING_MS_SYMBOL.
+   *
+   *   TT_MS_ID_UNICODE_CS ::
+   *     Corresponds to a Microsoft WGL4 charmap, matching Unicode.  See
+   *     @FT_ENCODING_UNICODE.
+   *
+   *   TT_MS_ID_SJIS ::
+   *     Corresponds to SJIS Japanese encoding.  See @FT_ENCODING_SJIS.
+   *
+   *   TT_MS_ID_GB2312 ::
+   *     Corresponds to Simplified Chinese as used in Mainland China.  See
+   *     @FT_ENCODING_GB2312.
+   *
+   *   TT_MS_ID_BIG_5 ::
+   *     Corresponds to Traditional Chinese as used in Taiwan and Hong Kong.
+   *     See @FT_ENCODING_BIG5.
+   *
+   *   TT_MS_ID_WANSUNG ::
+   *     Corresponds to Korean Wansung encoding.  See @FT_ENCODING_WANSUNG.
+   *
+   *   TT_MS_ID_JOHAB ::
+   *     Corresponds to Johab encoding.  See @FT_ENCODING_JOHAB.
+   *
+   *   TT_MS_ID_UCS_4 ::
+   *     Corresponds to UCS-4 or UTF-32 charmaps.  This has been added to
+   *     the OpenType specification version 1.4 (mid-2001.)
+   */
+
+#define TT_MS_ID_SYMBOL_CS    0
+#define TT_MS_ID_UNICODE_CS   1
+#define TT_MS_ID_SJIS         2
+#define TT_MS_ID_GB2312       3
+#define TT_MS_ID_BIG_5        4
+#define TT_MS_ID_WANSUNG      5
+#define TT_MS_ID_JOHAB        6
+#define TT_MS_ID_UCS_4       10
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_ADOBE_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_ADOBE charmaps.  This is a FreeType-specific extension!
+   *
+   * @values:
+   *   TT_ADOBE_ID_STANDARD ::
+   *     Adobe standard encoding.
+   *   TT_ADOBE_ID_EXPERT ::
+   *     Adobe expert encoding.
+   *   TT_ADOBE_ID_CUSTOM ::
+   *     Adobe custom encoding.
+   *   TT_ADOBE_ID_LATIN_1 ::
+   *     Adobe Latin~1 encoding.
+   */
+
+#define TT_ADOBE_ID_STANDARD  0
+#define TT_ADOBE_ID_EXPERT    1
+#define TT_ADOBE_ID_CUSTOM    2
+#define TT_ADOBE_ID_LATIN_1   3
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Possible values of the language identifier field in the name records  */
+  /* of the TTF `name' table if the `platform' identifier code is          */
+  /* TT_PLATFORM_MACINTOSH.  These values are also used as return values   */
+  /* for function @FT_Get_CMap_Language_ID.                                */
+  /*                                                                       */
+  /* The canonical source for the Apple assigned Language ID's is at       */
+  /*                                                                       */
+  /*   https://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html      */
+  /*                                                                       */
+#define TT_MAC_LANGID_ENGLISH                       0
+#define TT_MAC_LANGID_FRENCH                        1
+#define TT_MAC_LANGID_GERMAN                        2
+#define TT_MAC_LANGID_ITALIAN                       3
+#define TT_MAC_LANGID_DUTCH                         4
+#define TT_MAC_LANGID_SWEDISH                       5
+#define TT_MAC_LANGID_SPANISH                       6
+#define TT_MAC_LANGID_DANISH                        7
+#define TT_MAC_LANGID_PORTUGUESE                    8
+#define TT_MAC_LANGID_NORWEGIAN                     9
+#define TT_MAC_LANGID_HEBREW                       10
+#define TT_MAC_LANGID_JAPANESE                     11
+#define TT_MAC_LANGID_ARABIC                       12
+#define TT_MAC_LANGID_FINNISH                      13
+#define TT_MAC_LANGID_GREEK                        14
+#define TT_MAC_LANGID_ICELANDIC                    15
+#define TT_MAC_LANGID_MALTESE                      16
+#define TT_MAC_LANGID_TURKISH                      17
+#define TT_MAC_LANGID_CROATIAN                     18
+#define TT_MAC_LANGID_CHINESE_TRADITIONAL          19
+#define TT_MAC_LANGID_URDU                         20
+#define TT_MAC_LANGID_HINDI                        21
+#define TT_MAC_LANGID_THAI                         22
+#define TT_MAC_LANGID_KOREAN                       23
+#define TT_MAC_LANGID_LITHUANIAN                   24
+#define TT_MAC_LANGID_POLISH                       25
+#define TT_MAC_LANGID_HUNGARIAN                    26
+#define TT_MAC_LANGID_ESTONIAN                     27
+#define TT_MAC_LANGID_LETTISH                      28
+#define TT_MAC_LANGID_SAAMISK                      29
+#define TT_MAC_LANGID_FAEROESE                     30
+#define TT_MAC_LANGID_FARSI                        31
+#define TT_MAC_LANGID_RUSSIAN                      32
+#define TT_MAC_LANGID_CHINESE_SIMPLIFIED           33
+#define TT_MAC_LANGID_FLEMISH                      34
+#define TT_MAC_LANGID_IRISH                        35
+#define TT_MAC_LANGID_ALBANIAN                     36
+#define TT_MAC_LANGID_ROMANIAN                     37
+#define TT_MAC_LANGID_CZECH                        38
+#define TT_MAC_LANGID_SLOVAK                       39
+#define TT_MAC_LANGID_SLOVENIAN                    40
+#define TT_MAC_LANGID_YIDDISH                      41
+#define TT_MAC_LANGID_SERBIAN                      42
+#define TT_MAC_LANGID_MACEDONIAN                   43
+#define TT_MAC_LANGID_BULGARIAN                    44
+#define TT_MAC_LANGID_UKRAINIAN                    45
+#define TT_MAC_LANGID_BYELORUSSIAN                 46
+#define TT_MAC_LANGID_UZBEK                        47
+#define TT_MAC_LANGID_KAZAKH                       48
+#define TT_MAC_LANGID_AZERBAIJANI                  49
+#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT  49
+#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT    50
+#define TT_MAC_LANGID_ARMENIAN                     51
+#define TT_MAC_LANGID_GEORGIAN                     52
+#define TT_MAC_LANGID_MOLDAVIAN                    53
+#define TT_MAC_LANGID_KIRGHIZ                      54
+#define TT_MAC_LANGID_TAJIKI                       55
+#define TT_MAC_LANGID_TURKMEN                      56
+#define TT_MAC_LANGID_MONGOLIAN                    57
+#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT   57
+#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT    58
+#define TT_MAC_LANGID_PASHTO                       59
+#define TT_MAC_LANGID_KURDISH                      60
+#define TT_MAC_LANGID_KASHMIRI                     61
+#define TT_MAC_LANGID_SINDHI                       62
+#define TT_MAC_LANGID_TIBETAN                      63
+#define TT_MAC_LANGID_NEPALI                       64
+#define TT_MAC_LANGID_SANSKRIT                     65
+#define TT_MAC_LANGID_MARATHI                      66
+#define TT_MAC_LANGID_BENGALI                      67
+#define TT_MAC_LANGID_ASSAMESE                     68
+#define TT_MAC_LANGID_GUJARATI                     69
+#define TT_MAC_LANGID_PUNJABI                      70
+#define TT_MAC_LANGID_ORIYA                        71
+#define TT_MAC_LANGID_MALAYALAM                    72
+#define TT_MAC_LANGID_KANNADA                      73
+#define TT_MAC_LANGID_TAMIL                        74
+#define TT_MAC_LANGID_TELUGU                       75
+#define TT_MAC_LANGID_SINHALESE                    76
+#define TT_MAC_LANGID_BURMESE                      77
+#define TT_MAC_LANGID_KHMER                        78
+#define TT_MAC_LANGID_LAO                          79
+#define TT_MAC_LANGID_VIETNAMESE                   80
+#define TT_MAC_LANGID_INDONESIAN                   81
+#define TT_MAC_LANGID_TAGALOG                      82
+#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT           83
+#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT          84
+#define TT_MAC_LANGID_AMHARIC                      85
+#define TT_MAC_LANGID_TIGRINYA                     86
+#define TT_MAC_LANGID_GALLA                        87
+#define TT_MAC_LANGID_SOMALI                       88
+#define TT_MAC_LANGID_SWAHILI                      89
+#define TT_MAC_LANGID_RUANDA                       90
+#define TT_MAC_LANGID_RUNDI                        91
+#define TT_MAC_LANGID_CHEWA                        92
+#define TT_MAC_LANGID_MALAGASY                     93
+#define TT_MAC_LANGID_ESPERANTO                    94
+#define TT_MAC_LANGID_WELSH                       128
+#define TT_MAC_LANGID_BASQUE                      129
+#define TT_MAC_LANGID_CATALAN                     130
+#define TT_MAC_LANGID_LATIN                       131
+#define TT_MAC_LANGID_QUECHUA                     132
+#define TT_MAC_LANGID_GUARANI                     133
+#define TT_MAC_LANGID_AYMARA                      134
+#define TT_MAC_LANGID_TATAR                       135
+#define TT_MAC_LANGID_UIGHUR                      136
+#define TT_MAC_LANGID_DZONGKHA                    137
+#define TT_MAC_LANGID_JAVANESE                    138
+#define TT_MAC_LANGID_SUNDANESE                   139
+
+
+#if 0  /* these seem to be errors that have been dropped */
+
+#define TT_MAC_LANGID_SCOTTISH_GAELIC             140
+#define TT_MAC_LANGID_IRISH_GAELIC                141
+
+#endif
+
+
+  /* The following codes are new as of 2000-03-10 */
+#define TT_MAC_LANGID_GALICIAN                    140
+#define TT_MAC_LANGID_AFRIKAANS                   141
+#define TT_MAC_LANGID_BRETON                      142
+#define TT_MAC_LANGID_INUKTITUT                   143
+#define TT_MAC_LANGID_SCOTTISH_GAELIC             144
+#define TT_MAC_LANGID_MANX_GAELIC                 145
+#define TT_MAC_LANGID_IRISH_GAELIC                146
+#define TT_MAC_LANGID_TONGAN                      147
+#define TT_MAC_LANGID_GREEK_POLYTONIC             148
+#define TT_MAC_LANGID_GREELANDIC                  149
+#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT    150
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Possible values of the language identifier field in the name records  */
+  /* of the TTF `name' table if the `platform' identifier code is          */
+  /* TT_PLATFORM_MICROSOFT.                                                */
+  /*                                                                       */
+  /* The canonical source for the MS assigned LCIDs is                     */
+  /*                                                                       */
+  /*   http://www.microsoft.com/globaldev/reference/lcid-all.mspx          */
+  /*                                                                       */
+
+#define TT_MS_LANGID_ARABIC_GENERAL                    0x0001
+#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA               0x0401
+#define TT_MS_LANGID_ARABIC_IRAQ                       0x0801
+#define TT_MS_LANGID_ARABIC_EGYPT                      0x0c01
+#define TT_MS_LANGID_ARABIC_LIBYA                      0x1001
+#define TT_MS_LANGID_ARABIC_ALGERIA                    0x1401
+#define TT_MS_LANGID_ARABIC_MOROCCO                    0x1801
+#define TT_MS_LANGID_ARABIC_TUNISIA                    0x1c01
+#define TT_MS_LANGID_ARABIC_OMAN                       0x2001
+#define TT_MS_LANGID_ARABIC_YEMEN                      0x2401
+#define TT_MS_LANGID_ARABIC_SYRIA                      0x2801
+#define TT_MS_LANGID_ARABIC_JORDAN                     0x2c01
+#define TT_MS_LANGID_ARABIC_LEBANON                    0x3001
+#define TT_MS_LANGID_ARABIC_KUWAIT                     0x3401
+#define TT_MS_LANGID_ARABIC_UAE                        0x3801
+#define TT_MS_LANGID_ARABIC_BAHRAIN                    0x3c01
+#define TT_MS_LANGID_ARABIC_QATAR                      0x4001
+#define TT_MS_LANGID_BULGARIAN_BULGARIA                0x0402
+#define TT_MS_LANGID_CATALAN_SPAIN                     0x0403
+#define TT_MS_LANGID_CHINESE_GENERAL                   0x0004
+#define TT_MS_LANGID_CHINESE_TAIWAN                    0x0404
+#define TT_MS_LANGID_CHINESE_PRC                       0x0804
+#define TT_MS_LANGID_CHINESE_HONG_KONG                 0x0c04
+#define TT_MS_LANGID_CHINESE_SINGAPORE                 0x1004
+
+#if 1  /* this looks like the correct value */
+#define TT_MS_LANGID_CHINESE_MACAU                     0x1404
+#else  /* but beware, Microsoft may change its mind...
+          the most recent Word reference has the following: */
+#define TT_MS_LANGID_CHINESE_MACAU  TT_MS_LANGID_CHINESE_HONG_KONG
+#endif
+
+#if 0  /* used only with .NET `cultures'; commented out */
+#define TT_MS_LANGID_CHINESE_TRADITIONAL               0x7C04
+#endif
+
+#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC              0x0405
+#define TT_MS_LANGID_DANISH_DENMARK                    0x0406
+#define TT_MS_LANGID_GERMAN_GERMANY                    0x0407
+#define TT_MS_LANGID_GERMAN_SWITZERLAND                0x0807
+#define TT_MS_LANGID_GERMAN_AUSTRIA                    0x0c07
+#define TT_MS_LANGID_GERMAN_LUXEMBOURG                 0x1007
+#define TT_MS_LANGID_GERMAN_LIECHTENSTEI               0x1407
+#define TT_MS_LANGID_GREEK_GREECE                      0x0408
+
+  /* don't ask what this one means... It is commented out currently. */
+#if 0
+#define TT_MS_LANGID_GREEK_GREECE2                     0x2008
+#endif
+
+#define TT_MS_LANGID_ENGLISH_GENERAL                   0x0009
+#define TT_MS_LANGID_ENGLISH_UNITED_STATES             0x0409
+#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM            0x0809
+#define TT_MS_LANGID_ENGLISH_AUSTRALIA                 0x0c09
+#define TT_MS_LANGID_ENGLISH_CANADA                    0x1009
+#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND               0x1409
+#define TT_MS_LANGID_ENGLISH_IRELAND                   0x1809
+#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA              0x1c09
+#define TT_MS_LANGID_ENGLISH_JAMAICA                   0x2009
+#define TT_MS_LANGID_ENGLISH_CARIBBEAN                 0x2409
+#define TT_MS_LANGID_ENGLISH_BELIZE                    0x2809
+#define TT_MS_LANGID_ENGLISH_TRINIDAD                  0x2c09
+#define TT_MS_LANGID_ENGLISH_ZIMBABWE                  0x3009
+#define TT_MS_LANGID_ENGLISH_PHILIPPINES               0x3409
+#define TT_MS_LANGID_ENGLISH_INDONESIA                 0x3809
+#define TT_MS_LANGID_ENGLISH_HONG_KONG                 0x3c09
+#define TT_MS_LANGID_ENGLISH_INDIA                     0x4009
+#define TT_MS_LANGID_ENGLISH_MALAYSIA                  0x4409
+#define TT_MS_LANGID_ENGLISH_SINGAPORE                 0x4809
+#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT    0x040a
+#define TT_MS_LANGID_SPANISH_MEXICO                    0x080a
+#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT  0x0c0a
+#define TT_MS_LANGID_SPANISH_GUATEMALA                 0x100a
+#define TT_MS_LANGID_SPANISH_COSTA_RICA                0x140a
+#define TT_MS_LANGID_SPANISH_PANAMA                    0x180a
+#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC        0x1c0a
+#define TT_MS_LANGID_SPANISH_VENEZUELA                 0x200a
+#define TT_MS_LANGID_SPANISH_COLOMBIA                  0x240a
+#define TT_MS_LANGID_SPANISH_PERU                      0x280a
+#define TT_MS_LANGID_SPANISH_ARGENTINA                 0x2c0a
+#define TT_MS_LANGID_SPANISH_ECUADOR                   0x300a
+#define TT_MS_LANGID_SPANISH_CHILE                     0x340a
+#define TT_MS_LANGID_SPANISH_URUGUAY                   0x380a
+#define TT_MS_LANGID_SPANISH_PARAGUAY                  0x3c0a
+#define TT_MS_LANGID_SPANISH_BOLIVIA                   0x400a
+#define TT_MS_LANGID_SPANISH_EL_SALVADOR               0x440a
+#define TT_MS_LANGID_SPANISH_HONDURAS                  0x480a
+#define TT_MS_LANGID_SPANISH_NICARAGUA                 0x4c0a
+#define TT_MS_LANGID_SPANISH_PUERTO_RICO               0x500a
+#define TT_MS_LANGID_SPANISH_UNITED_STATES             0x540a
+  /* The following ID blatantly violate MS specs by using a */
+  /* sublanguage > 0x1F.                                    */
+#define TT_MS_LANGID_SPANISH_LATIN_AMERICA             0xE40aU
+#define TT_MS_LANGID_FINNISH_FINLAND                   0x040b
+#define TT_MS_LANGID_FRENCH_FRANCE                     0x040c
+#define TT_MS_LANGID_FRENCH_BELGIUM                    0x080c
+#define TT_MS_LANGID_FRENCH_CANADA                     0x0c0c
+#define TT_MS_LANGID_FRENCH_SWITZERLAND                0x100c
+#define TT_MS_LANGID_FRENCH_LUXEMBOURG                 0x140c
+#define TT_MS_LANGID_FRENCH_MONACO                     0x180c
+#define TT_MS_LANGID_FRENCH_WEST_INDIES                0x1c0c
+#define TT_MS_LANGID_FRENCH_REUNION                    0x200c
+#define TT_MS_LANGID_FRENCH_CONGO                      0x240c
+  /* which was formerly: */
+#define TT_MS_LANGID_FRENCH_ZAIRE  TT_MS_LANGID_FRENCH_CONGO
+#define TT_MS_LANGID_FRENCH_SENEGAL                    0x280c
+#define TT_MS_LANGID_FRENCH_CAMEROON                   0x2c0c
+#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE              0x300c
+#define TT_MS_LANGID_FRENCH_MALI                       0x340c
+#define TT_MS_LANGID_FRENCH_MOROCCO                    0x380c
+#define TT_MS_LANGID_FRENCH_HAITI                      0x3c0c
+  /* and another violation of the spec (see 0xE40aU) */
+#define TT_MS_LANGID_FRENCH_NORTH_AFRICA               0xE40cU
+#define TT_MS_LANGID_HEBREW_ISRAEL                     0x040d
+#define TT_MS_LANGID_HUNGARIAN_HUNGARY                 0x040e
+#define TT_MS_LANGID_ICELANDIC_ICELAND                 0x040f
+#define TT_MS_LANGID_ITALIAN_ITALY                     0x0410
+#define TT_MS_LANGID_ITALIAN_SWITZERLAND               0x0810
+#define TT_MS_LANGID_JAPANESE_JAPAN                    0x0411
+#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA     0x0412
+#define TT_MS_LANGID_KOREAN_JOHAB_KOREA                0x0812
+#define TT_MS_LANGID_DUTCH_NETHERLANDS                 0x0413
+#define TT_MS_LANGID_DUTCH_BELGIUM                     0x0813
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL           0x0414
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK          0x0814
+#define TT_MS_LANGID_POLISH_POLAND                     0x0415
+#define TT_MS_LANGID_PORTUGUESE_BRAZIL                 0x0416
+#define TT_MS_LANGID_PORTUGUESE_PORTUGAL               0x0816
+#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND        0x0417
+#define TT_MS_LANGID_ROMANIAN_ROMANIA                  0x0418
+#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA                0x0818
+#define TT_MS_LANGID_RUSSIAN_RUSSIA                    0x0419
+#define TT_MS_LANGID_RUSSIAN_MOLDAVIA                  0x0819
+#define TT_MS_LANGID_CROATIAN_CROATIA                  0x041a
+#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN              0x081a
+#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC           0x0c1a
+
+#if 0  /* this used to be this value, but it looks like we were wrong */
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x101a
+#else  /* current sources say */
+#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA       0x101a
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x141a
+       /* and XPsp2 Platform SDK added (2004-07-26) */
+       /* Names are shortened to be significant within 40 chars. */
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN         0x181a
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC      0x181a
+#endif
+
+#define TT_MS_LANGID_SLOVAK_SLOVAKIA                   0x041b
+#define TT_MS_LANGID_ALBANIAN_ALBANIA                  0x041c
+#define TT_MS_LANGID_SWEDISH_SWEDEN                    0x041d
+#define TT_MS_LANGID_SWEDISH_FINLAND                   0x081d
+#define TT_MS_LANGID_THAI_THAILAND                     0x041e
+#define TT_MS_LANGID_TURKISH_TURKEY                    0x041f
+#define TT_MS_LANGID_URDU_PAKISTAN                     0x0420
+#define TT_MS_LANGID_URDU_INDIA                        0x0820
+#define TT_MS_LANGID_INDONESIAN_INDONESIA              0x0421
+#define TT_MS_LANGID_UKRAINIAN_UKRAINE                 0x0422
+#define TT_MS_LANGID_BELARUSIAN_BELARUS                0x0423
+#define TT_MS_LANGID_SLOVENE_SLOVENIA                  0x0424
+#define TT_MS_LANGID_ESTONIAN_ESTONIA                  0x0425
+#define TT_MS_LANGID_LATVIAN_LATVIA                    0x0426
+#define TT_MS_LANGID_LITHUANIAN_LITHUANIA              0x0427
+#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA      0x0827
+#define TT_MS_LANGID_TAJIK_TAJIKISTAN                  0x0428
+#define TT_MS_LANGID_FARSI_IRAN                        0x0429
+#define TT_MS_LANGID_VIETNAMESE_VIET_NAM               0x042a
+#define TT_MS_LANGID_ARMENIAN_ARMENIA                  0x042b
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN            0x042c
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC         0x082c
+#define TT_MS_LANGID_BASQUE_SPAIN                      0x042d
+#define TT_MS_LANGID_SORBIAN_GERMANY                   0x042e
+#define TT_MS_LANGID_MACEDONIAN_MACEDONIA              0x042f
+#define TT_MS_LANGID_SUTU_SOUTH_AFRICA                 0x0430
+#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA               0x0431
+#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA               0x0432
+#define TT_MS_LANGID_VENDA_SOUTH_AFRICA                0x0433
+#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA                0x0434
+#define TT_MS_LANGID_ZULU_SOUTH_AFRICA                 0x0435
+#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA            0x0436
+#define TT_MS_LANGID_GEORGIAN_GEORGIA                  0x0437
+#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS           0x0438
+#define TT_MS_LANGID_HINDI_INDIA                       0x0439
+#define TT_MS_LANGID_MALTESE_MALTA                     0x043a
+  /* Added by XPsp2 Platform SDK (2004-07-26) */
+#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY              0x043b
+#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN              0x083b
+#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND             0x0C3b
+#define TT_MS_LANGID_SAMI_LULE_NORWAY                  0x103b
+#define TT_MS_LANGID_SAMI_LULE_SWEDEN                  0x143b
+#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY              0x183b
+#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN              0x1C3b
+#define TT_MS_LANGID_SAMI_SKOLT_FINLAND                0x203b
+#define TT_MS_LANGID_SAMI_INARI_FINLAND                0x243b
+  /* ... and we also keep our old identifier... */
+#define TT_MS_LANGID_SAAMI_LAPONIA                     0x043b
+
+#if 0 /* this seems to be a previous inversion */
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043c
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083c
+#else
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083c
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043c
+#endif
+
+#define TT_MS_LANGID_YIDDISH_GERMANY                   0x043d
+#define TT_MS_LANGID_MALAY_MALAYSIA                    0x043e
+#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM           0x083e
+#define TT_MS_LANGID_KAZAK_KAZAKSTAN                   0x043f
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440
+  /* alias declared in Windows 2000 */
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \
+          TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN
+
+#define TT_MS_LANGID_SWAHILI_KENYA                     0x0441
+#define TT_MS_LANGID_TURKMEN_TURKMENISTAN              0x0442
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN            0x0443
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC         0x0843
+#define TT_MS_LANGID_TATAR_TATARSTAN                   0x0444
+#define TT_MS_LANGID_BENGALI_INDIA                     0x0445
+#define TT_MS_LANGID_BENGALI_BANGLADESH                0x0845
+#define TT_MS_LANGID_PUNJABI_INDIA                     0x0446
+#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN           0x0846
+#define TT_MS_LANGID_GUJARATI_INDIA                    0x0447
+#define TT_MS_LANGID_ORIYA_INDIA                       0x0448
+#define TT_MS_LANGID_TAMIL_INDIA                       0x0449
+#define TT_MS_LANGID_TELUGU_INDIA                      0x044a
+#define TT_MS_LANGID_KANNADA_INDIA                     0x044b
+#define TT_MS_LANGID_MALAYALAM_INDIA                   0x044c
+#define TT_MS_LANGID_ASSAMESE_INDIA                    0x044d
+#define TT_MS_LANGID_MARATHI_INDIA                     0x044e
+#define TT_MS_LANGID_SANSKRIT_INDIA                    0x044f
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN      0x0850
+#define TT_MS_LANGID_TIBETAN_CHINA                     0x0451
+  /* Don't use the next constant!  It has            */
+  /*   (1) the wrong spelling (Dzonghka)             */
+  /*   (2) Microsoft doesn't officially define it -- */
+  /*       at least it is not in the List of Local   */
+  /*       ID Values.                                */
+  /*   (3) Dzongkha is not the same language as      */
+  /*       Tibetan, so merging it is wrong anyway.   */
+  /*                                                 */
+  /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW.    */
+#define TT_MS_LANGID_DZONGHKA_BHUTAN                   0x0851
+
+#if 0
+  /* the following used to be defined */
+#define TT_MS_LANGID_TIBETAN_BHUTAN                    0x0451
+  /* ... but it was changed; */
+#else
+  /* So we will continue to #define it, but with the correct value */
+#define TT_MS_LANGID_TIBETAN_BHUTAN   TT_MS_LANGID_DZONGHKA_BHUTAN
+#endif
+
+#define TT_MS_LANGID_WELSH_WALES                       0x0452
+#define TT_MS_LANGID_KHMER_CAMBODIA                    0x0453
+#define TT_MS_LANGID_LAO_LAOS                          0x0454
+#define TT_MS_LANGID_BURMESE_MYANMAR                   0x0455
+#define TT_MS_LANGID_GALICIAN_SPAIN                    0x0456
+#define TT_MS_LANGID_KONKANI_INDIA                     0x0457
+#define TT_MS_LANGID_MANIPURI_INDIA  /* Bengali */     0x0458
+#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */         0x0459
+#define TT_MS_LANGID_SINDHI_PAKISTAN                   0x0859
+  /* Missing a LCID for Sindhi in Devanagari script */
+#define TT_MS_LANGID_SYRIAC_SYRIA                      0x045a
+#define TT_MS_LANGID_SINHALESE_SRI_LANKA               0x045b
+#define TT_MS_LANGID_CHEROKEE_UNITED_STATES            0x045c
+#define TT_MS_LANGID_INUKTITUT_CANADA                  0x045d
+#define TT_MS_LANGID_AMHARIC_ETHIOPIA                  0x045e
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */    0x045f
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN           0x085f
+  /* Missing a LCID for Tifinagh script */
+#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */    0x0460
+  /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */
+  /* script is yet unclear... might be Arabic, Nagari or Sharada */
+#define TT_MS_LANGID_KASHMIRI_SASIA                    0x0860
+  /* ... and aliased (by MS) for compatibility reasons. */
+#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA
+#define TT_MS_LANGID_NEPALI_NEPAL                      0x0461
+#define TT_MS_LANGID_NEPALI_INDIA                      0x0861
+#define TT_MS_LANGID_FRISIAN_NETHERLANDS               0x0462
+#define TT_MS_LANGID_PASHTO_AFGHANISTAN                0x0463
+#define TT_MS_LANGID_FILIPINO_PHILIPPINES              0x0464
+#define TT_MS_LANGID_DHIVEHI_MALDIVES                  0x0465
+  /* alias declared in Windows 2000 */
+#define TT_MS_LANGID_DIVEHI_MALDIVES  TT_MS_LANGID_DHIVEHI_MALDIVES
+#define TT_MS_LANGID_EDO_NIGERIA                       0x0466
+#define TT_MS_LANGID_FULFULDE_NIGERIA                  0x0467
+#define TT_MS_LANGID_HAUSA_NIGERIA                     0x0468
+#define TT_MS_LANGID_IBIBIO_NIGERIA                    0x0469
+#define TT_MS_LANGID_YORUBA_NIGERIA                    0x046a
+#define TT_MS_LANGID_QUECHUA_BOLIVIA                   0x046b
+#define TT_MS_LANGID_QUECHUA_ECUADOR                   0x086b
+#define TT_MS_LANGID_QUECHUA_PERU                      0x0c6b
+#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA               0x046c
+  /* Also spelled by XPsp2 Platform SDK (2004-07-26) */
+#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \
+          TT_MS_LANGID_SEPEDI_SOUTH_AFRICA
+  /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */
+#define TT_MS_LANGID_IGBO_NIGERIA                      0x0470
+#define TT_MS_LANGID_KANURI_NIGERIA                    0x0471
+#define TT_MS_LANGID_OROMO_ETHIOPIA                    0x0472
+#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA                 0x0473
+#define TT_MS_LANGID_TIGRIGNA_ERYTHREA                 0x0873
+  /* also spelled in the `Passport SDK' list as: */
+#define TT_MS_LANGID_TIGRIGNA_ERYTREA  TT_MS_LANGID_TIGRIGNA_ERYTHREA
+#define TT_MS_LANGID_GUARANI_PARAGUAY                  0x0474
+#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES            0x0475
+#define TT_MS_LANGID_LATIN                             0x0476
+#define TT_MS_LANGID_SOMALI_SOMALIA                    0x0477
+  /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */
+  /*       not written (but OTOH the peculiar writing system is worth     */
+  /*       studying).                                                     */
+#define TT_MS_LANGID_YI_CHINA                          0x0478
+#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES   0x0479
+  /* language codes from 0x047a to 0x047f are (still) unknown. */
+#define TT_MS_LANGID_UIGHUR_CHINA                      0x0480
+#define TT_MS_LANGID_MAORI_NEW_ZEALAND                 0x0481
+
+#if 0  /* not deemed useful for fonts */
+#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE            0x04ff
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Possible values of the `name' identifier field in the name records of */
+  /* the TTF `name' table.  These values are platform independent.         */
+  /*                                                                       */
+#define TT_NAME_ID_COPYRIGHT            0
+#define TT_NAME_ID_FONT_FAMILY          1
+#define TT_NAME_ID_FONT_SUBFAMILY       2
+#define TT_NAME_ID_UNIQUE_ID            3
+#define TT_NAME_ID_FULL_NAME            4
+#define TT_NAME_ID_VERSION_STRING       5
+#define TT_NAME_ID_PS_NAME              6
+#define TT_NAME_ID_TRADEMARK            7
+
+  /* the following values are from the OpenType spec */
+#define TT_NAME_ID_MANUFACTURER         8
+#define TT_NAME_ID_DESIGNER             9
+#define TT_NAME_ID_DESCRIPTION          10
+#define TT_NAME_ID_VENDOR_URL           11
+#define TT_NAME_ID_DESIGNER_URL         12
+#define TT_NAME_ID_LICENSE              13
+#define TT_NAME_ID_LICENSE_URL          14
+  /* number 15 is reserved */
+#define TT_NAME_ID_PREFERRED_FAMILY     16
+#define TT_NAME_ID_PREFERRED_SUBFAMILY  17
+#define TT_NAME_ID_MAC_FULL_NAME        18
+
+  /* The following code is new as of 2000-01-21 */
+#define TT_NAME_ID_SAMPLE_TEXT          19
+
+  /* This is new in OpenType 1.3 */
+#define TT_NAME_ID_CID_FINDFONT_NAME    20
+
+  /* This is new in OpenType 1.5 */
+#define TT_NAME_ID_WWS_FAMILY           21
+#define TT_NAME_ID_WWS_SUBFAMILY        22
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table.     */
+  /*                                                                       */
+  /* Updated 08-Nov-2008.                                                  */
+  /*                                                                       */
+
+  /* Bit  0   Basic Latin */
+#define TT_UCR_BASIC_LATIN                     (1L <<  0) /* U+0020-U+007E */
+  /* Bit  1   C1 Controls and Latin-1 Supplement */
+#define TT_UCR_LATIN1_SUPPLEMENT               (1L <<  1) /* U+0080-U+00FF */
+  /* Bit  2   Latin Extended-A */
+#define TT_UCR_LATIN_EXTENDED_A                (1L <<  2) /* U+0100-U+017F */
+  /* Bit  3   Latin Extended-B */
+#define TT_UCR_LATIN_EXTENDED_B                (1L <<  3) /* U+0180-U+024F */
+  /* Bit  4   IPA Extensions                 */
+  /*          Phonetic Extensions            */
+  /*          Phonetic Extensions Supplement */
+#define TT_UCR_IPA_EXTENSIONS                  (1L <<  4) /* U+0250-U+02AF */
+                                                          /* U+1D00-U+1D7F */
+                                                          /* U+1D80-U+1DBF */
+  /* Bit  5   Spacing Modifier Letters */
+  /*          Modifier Tone Letters    */
+#define TT_UCR_SPACING_MODIFIER                (1L <<  5) /* U+02B0-U+02FF */
+                                                          /* U+A700-U+A71F */
+  /* Bit  6   Combining Diacritical Marks            */
+  /*          Combining Diacritical Marks Supplement */
+#define TT_UCR_COMBINING_DIACRITICS            (1L <<  6) /* U+0300-U+036F */
+                                                          /* U+1DC0-U+1DFF */
+  /* Bit  7   Greek and Coptic */
+#define TT_UCR_GREEK                           (1L <<  7) /* U+0370-U+03FF */
+  /* Bit  8   Coptic */
+#define TT_UCR_COPTIC                          (1L <<  8) /* U+2C80-U+2CFF */
+  /* Bit  9   Cyrillic            */
+  /*          Cyrillic Supplement */
+  /*          Cyrillic Extended-A */
+  /*          Cyrillic Extended-B */
+#define TT_UCR_CYRILLIC                        (1L <<  9) /* U+0400-U+04FF */
+                                                          /* U+0500-U+052F */
+                                                          /* U+2DE0-U+2DFF */
+                                                          /* U+A640-U+A69F */
+  /* Bit 10   Armenian */
+#define TT_UCR_ARMENIAN                        (1L << 10) /* U+0530-U+058F */
+  /* Bit 11   Hebrew */
+#define TT_UCR_HEBREW                          (1L << 11) /* U+0590-U+05FF */
+  /* Bit 12   Vai */
+#define TT_UCR_VAI                             (1L << 12) /* U+A500-U+A63F */
+  /* Bit 13   Arabic            */
+  /*          Arabic Supplement */
+#define TT_UCR_ARABIC                          (1L << 13) /* U+0600-U+06FF */
+                                                          /* U+0750-U+077F */
+  /* Bit 14   NKo */
+#define TT_UCR_NKO                             (1L << 14) /* U+07C0-U+07FF */
+  /* Bit 15   Devanagari */
+#define TT_UCR_DEVANAGARI                      (1L << 15) /* U+0900-U+097F */
+  /* Bit 16   Bengali */
+#define TT_UCR_BENGALI                         (1L << 16) /* U+0980-U+09FF */
+  /* Bit 17   Gurmukhi */
+#define TT_UCR_GURMUKHI                        (1L << 17) /* U+0A00-U+0A7F */
+  /* Bit 18   Gujarati */
+#define TT_UCR_GUJARATI                        (1L << 18) /* U+0A80-U+0AFF */
+  /* Bit 19   Oriya */
+#define TT_UCR_ORIYA                           (1L << 19) /* U+0B00-U+0B7F */
+  /* Bit 20   Tamil */
+#define TT_UCR_TAMIL                           (1L << 20) /* U+0B80-U+0BFF */
+  /* Bit 21   Telugu */
+#define TT_UCR_TELUGU                          (1L << 21) /* U+0C00-U+0C7F */
+  /* Bit 22   Kannada */
+#define TT_UCR_KANNADA                         (1L << 22) /* U+0C80-U+0CFF */
+  /* Bit 23   Malayalam */
+#define TT_UCR_MALAYALAM                       (1L << 23) /* U+0D00-U+0D7F */
+  /* Bit 24   Thai */
+#define TT_UCR_THAI                            (1L << 24) /* U+0E00-U+0E7F */
+  /* Bit 25   Lao */
+#define TT_UCR_LAO                             (1L << 25) /* U+0E80-U+0EFF */
+  /* Bit 26   Georgian            */
+  /*          Georgian Supplement */
+#define TT_UCR_GEORGIAN                        (1L << 26) /* U+10A0-U+10FF */
+                                                          /* U+2D00-U+2D2F */
+  /* Bit 27   Balinese */
+#define TT_UCR_BALINESE                        (1L << 27) /* U+1B00-U+1B7F */
+  /* Bit 28   Hangul Jamo */
+#define TT_UCR_HANGUL_JAMO                     (1L << 28) /* U+1100-U+11FF */
+  /* Bit 29   Latin Extended Additional */
+  /*          Latin Extended-C          */
+  /*          Latin Extended-D          */
+#define TT_UCR_LATIN_EXTENDED_ADDITIONAL       (1L << 29) /* U+1E00-U+1EFF */
+                                                          /* U+2C60-U+2C7F */
+                                                          /* U+A720-U+A7FF */
+  /* Bit 30   Greek Extended */
+#define TT_UCR_GREEK_EXTENDED                  (1L << 30) /* U+1F00-U+1FFF */
+  /* Bit 31   General Punctuation      */
+  /*          Supplemental Punctuation */
+#define TT_UCR_GENERAL_PUNCTUATION             (1L << 31) /* U+2000-U+206F */
+                                                          /* U+2E00-U+2E7F */
+  /* Bit 32   Superscripts And Subscripts */
+#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS         (1L <<  0) /* U+2070-U+209F */
+  /* Bit 33   Currency Symbols */
+#define TT_UCR_CURRENCY_SYMBOLS                (1L <<  1) /* U+20A0-U+20CF */
+  /* Bit 34   Combining Diacritical Marks For Symbols */
+#define TT_UCR_COMBINING_DIACRITICS_SYMB       (1L <<  2) /* U+20D0-U+20FF */
+  /* Bit 35   Letterlike Symbols */
+#define TT_UCR_LETTERLIKE_SYMBOLS              (1L <<  3) /* U+2100-U+214F */
+  /* Bit 36   Number Forms */
+#define TT_UCR_NUMBER_FORMS                    (1L <<  4) /* U+2150-U+218F */
+  /* Bit 37   Arrows                           */
+  /*          Supplemental Arrows-A            */
+  /*          Supplemental Arrows-B            */
+  /*          Miscellaneous Symbols and Arrows */
+#define TT_UCR_ARROWS                          (1L <<  5) /* U+2190-U+21FF */
+                                                          /* U+27F0-U+27FF */
+                                                          /* U+2900-U+297F */
+                                                          /* U+2B00-U+2BFF */
+  /* Bit 38   Mathematical Operators               */
+  /*          Supplemental Mathematical Operators  */
+  /*          Miscellaneous Mathematical Symbols-A */
+  /*          Miscellaneous Mathematical Symbols-B */
+#define TT_UCR_MATHEMATICAL_OPERATORS          (1L <<  6) /* U+2200-U+22FF */
+                                                          /* U+2A00-U+2AFF */
+                                                          /* U+27C0-U+27EF */
+                                                          /* U+2980-U+29FF */
+  /* Bit 39 Miscellaneous Technical */
+#define TT_UCR_MISCELLANEOUS_TECHNICAL         (1L <<  7) /* U+2300-U+23FF */
+  /* Bit 40   Control Pictures */
+#define TT_UCR_CONTROL_PICTURES                (1L <<  8) /* U+2400-U+243F */
+  /* Bit 41   Optical Character Recognition */
+#define TT_UCR_OCR                             (1L <<  9) /* U+2440-U+245F */
+  /* Bit 42   Enclosed Alphanumerics */
+#define TT_UCR_ENCLOSED_ALPHANUMERICS          (1L << 10) /* U+2460-U+24FF */
+  /* Bit 43   Box Drawing */
+#define TT_UCR_BOX_DRAWING                     (1L << 11) /* U+2500-U+257F */
+  /* Bit 44   Block Elements */
+#define TT_UCR_BLOCK_ELEMENTS                  (1L << 12) /* U+2580-U+259F */
+  /* Bit 45   Geometric Shapes */
+#define TT_UCR_GEOMETRIC_SHAPES                (1L << 13) /* U+25A0-U+25FF */
+  /* Bit 46   Miscellaneous Symbols */
+#define TT_UCR_MISCELLANEOUS_SYMBOLS           (1L << 14) /* U+2600-U+26FF */
+  /* Bit 47   Dingbats */
+#define TT_UCR_DINGBATS                        (1L << 15) /* U+2700-U+27BF */
+  /* Bit 48   CJK Symbols and Punctuation */
+#define TT_UCR_CJK_SYMBOLS                     (1L << 16) /* U+3000-U+303F */
+  /* Bit 49   Hiragana */
+#define TT_UCR_HIRAGANA                        (1L << 17) /* U+3040-U+309F */
+  /* Bit 50   Katakana                     */
+  /*          Katakana Phonetic Extensions */
+#define TT_UCR_KATAKANA                        (1L << 18) /* U+30A0-U+30FF */
+                                                          /* U+31F0-U+31FF */
+  /* Bit 51   Bopomofo          */
+  /*          Bopomofo Extended */
+#define TT_UCR_BOPOMOFO                        (1L << 19) /* U+3100-U+312F */
+                                                          /* U+31A0-U+31BF */
+  /* Bit 52   Hangul Compatibility Jamo */
+#define TT_UCR_HANGUL_COMPATIBILITY_JAMO       (1L << 20) /* U+3130-U+318F */
+  /* Bit 53   Phags-Pa */
+#define TT_UCR_CJK_MISC                        (1L << 21) /* U+A840-U+A87F */
+#define TT_UCR_KANBUN  TT_UCR_CJK_MISC /* deprecated */
+#define TT_UCR_PHAGSPA
+  /* Bit 54   Enclosed CJK Letters and Months */
+#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS     (1L << 22) /* U+3200-U+32FF */
+  /* Bit 55   CJK Compatibility */
+#define TT_UCR_CJK_COMPATIBILITY               (1L << 23) /* U+3300-U+33FF */
+  /* Bit 56   Hangul Syllables */
+#define TT_UCR_HANGUL                          (1L << 24) /* U+AC00-U+D7A3 */
+  /* Bit 57   High Surrogates              */
+  /*          High Private Use Surrogates  */
+  /*          Low Surrogates               */
+  /*                                       */
+  /* According to OpenType specs v.1.3+,   */
+  /* setting bit 57 implies that there is  */
+  /* at least one codepoint beyond the     */
+  /* Basic Multilingual Plane that is      */
+  /* supported by this font.  So it really */
+  /* means >= U+10000                      */
+#define TT_UCR_SURROGATES                      (1L << 25) /* U+D800-U+DB7F */
+                                                          /* U+DB80-U+DBFF */
+                                                          /* U+DC00-U+DFFF */
+#define TT_UCR_NON_PLANE_0  TT_UCR_SURROGATES
+  /* Bit 58  Phoenician */
+#define TT_UCR_PHOENICIAN                      (1L << 26) /*U+10900-U+1091F*/
+  /* Bit 59   CJK Unified Ideographs             */
+  /*          CJK Radicals Supplement            */
+  /*          Kangxi Radicals                    */
+  /*          Ideographic Description Characters */
+  /*          CJK Unified Ideographs Extension A */
+  /*          CJK Unified Ideographs Extension B */
+  /*          Kanbun                             */
+#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS          (1L << 27) /* U+4E00-U+9FFF */
+                                                          /* U+2E80-U+2EFF */
+                                                          /* U+2F00-U+2FDF */
+                                                          /* U+2FF0-U+2FFF */
+                                                          /* U+3400-U+4DB5 */
+                                                          /*U+20000-U+2A6DF*/
+                                                          /* U+3190-U+319F */
+  /* Bit 60   Private Use */
+#define TT_UCR_PRIVATE_USE                     (1L << 28) /* U+E000-U+F8FF */
+  /* Bit 61   CJK Strokes                             */
+  /*          CJK Compatibility Ideographs            */
+  /*          CJK Compatibility Ideographs Supplement */
+#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS    (1L << 29) /* U+31C0-U+31EF */
+                                                          /* U+F900-U+FAFF */
+                                                          /*U+2F800-U+2FA1F*/
+  /* Bit 62   Alphabetic Presentation Forms */
+#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS   (1L << 30) /* U+FB00-U+FB4F */
+  /* Bit 63   Arabic Presentation Forms-A */
+#define TT_UCR_ARABIC_PRESENTATIONS_A          (1L << 31) /* U+FB50-U+FDFF */
+  /* Bit 64   Combining Half Marks */
+#define TT_UCR_COMBINING_HALF_MARKS            (1L <<  0) /* U+FE20-U+FE2F */
+  /* Bit 65   Vertical forms          */
+  /*          CJK Compatibility Forms */
+#define TT_UCR_CJK_COMPATIBILITY_FORMS         (1L <<  1) /* U+FE10-U+FE1F */
+                                                          /* U+FE30-U+FE4F */
+  /* Bit 66   Small Form Variants */
+#define TT_UCR_SMALL_FORM_VARIANTS             (1L <<  2) /* U+FE50-U+FE6F */
+  /* Bit 67   Arabic Presentation Forms-B */
+#define TT_UCR_ARABIC_PRESENTATIONS_B          (1L <<  3) /* U+FE70-U+FEFE */
+  /* Bit 68   Halfwidth and Fullwidth Forms */
+#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS       (1L <<  4) /* U+FF00-U+FFEF */
+  /* Bit 69   Specials */
+#define TT_UCR_SPECIALS                        (1L <<  5) /* U+FFF0-U+FFFD */
+  /* Bit 70   Tibetan */
+#define TT_UCR_TIBETAN                         (1L <<  6) /* U+0F00-U+0FFF */
+  /* Bit 71   Syriac */
+#define TT_UCR_SYRIAC                          (1L <<  7) /* U+0700-U+074F */
+  /* Bit 72   Thaana */
+#define TT_UCR_THAANA                          (1L <<  8) /* U+0780-U+07BF */
+  /* Bit 73   Sinhala */
+#define TT_UCR_SINHALA                         (1L <<  9) /* U+0D80-U+0DFF */
+  /* Bit 74   Myanmar */
+#define TT_UCR_MYANMAR                         (1L << 10) /* U+1000-U+109F */
+  /* Bit 75   Ethiopic            */
+  /*          Ethiopic Supplement */
+  /*          Ethiopic Extended   */
+#define TT_UCR_ETHIOPIC                        (1L << 11) /* U+1200-U+137F */
+                                                          /* U+1380-U+139F */
+                                                          /* U+2D80-U+2DDF */
+  /* Bit 76   Cherokee */
+#define TT_UCR_CHEROKEE                        (1L << 12) /* U+13A0-U+13FF */
+  /* Bit 77   Unified Canadian Aboriginal Syllabics */
+#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS   (1L << 13) /* U+1400-U+167F */
+  /* Bit 78   Ogham */
+#define TT_UCR_OGHAM                           (1L << 14) /* U+1680-U+169F */
+  /* Bit 79   Runic */
+#define TT_UCR_RUNIC                           (1L << 15) /* U+16A0-U+16FF */
+  /* Bit 80   Khmer         */
+  /*          Khmer Symbols */
+#define TT_UCR_KHMER                           (1L << 16) /* U+1780-U+17FF */
+                                                          /* U+19E0-U+19FF */
+  /* Bit 81   Mongolian */
+#define TT_UCR_MONGOLIAN                       (1L << 17) /* U+1800-U+18AF */
+  /* Bit 82   Braille Patterns */
+#define TT_UCR_BRAILLE                         (1L << 18) /* U+2800-U+28FF */
+  /* Bit 83   Yi Syllables */
+  /*          Yi Radicals  */
+#define TT_UCR_YI                              (1L << 19) /* U+A000-U+A48F */
+                                                          /* U+A490-U+A4CF */
+  /* Bit 84   Tagalog  */
+  /*          Hanunoo  */
+  /*          Buhid    */
+  /*          Tagbanwa */
+#define TT_UCR_PHILIPPINE                      (1L << 20) /* U+1700-U+171F */
+                                                          /* U+1720-U+173F */
+                                                          /* U+1740-U+175F */
+                                                          /* U+1760-U+177F */
+  /* Bit 85   Old Italic */
+#define TT_UCR_OLD_ITALIC                      (1L << 21) /*U+10300-U+1032F*/
+  /* Bit 86   Gothic */
+#define TT_UCR_GOTHIC                          (1L << 22) /*U+10330-U+1034F*/
+  /* Bit 87   Deseret */
+#define TT_UCR_DESERET                         (1L << 23) /*U+10400-U+1044F*/
+  /* Bit 88   Byzantine Musical Symbols      */
+  /*          Musical Symbols                */
+  /*          Ancient Greek Musical Notation */
+#define TT_UCR_MUSICAL_SYMBOLS                 (1L << 24) /*U+1D000-U+1D0FF*/
+                                                          /*U+1D100-U+1D1FF*/
+                                                          /*U+1D200-U+1D24F*/
+  /* Bit 89   Mathematical Alphanumeric Symbols */
+#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS       (1L << 25) /*U+1D400-U+1D7FF*/
+  /* Bit 90   Private Use (plane 15) */
+  /*          Private Use (plane 16) */
+#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY       (1L << 26) /*U+F0000-U+FFFFD*/
+                                                        /*U+100000-U+10FFFD*/
+  /* Bit 91   Variation Selectors            */
+  /*          Variation Selectors Supplement */
+#define TT_UCR_VARIATION_SELECTORS             (1L << 27) /* U+FE00-U+FE0F */
+                                                          /*U+E0100-U+E01EF*/
+  /* Bit 92   Tags */
+#define TT_UCR_TAGS                            (1L << 28) /*U+E0000-U+E007F*/
+  /* Bit 93   Limbu */
+#define TT_UCR_LIMBU                           (1L << 29) /* U+1900-U+194F */
+  /* Bit 94   Tai Le */
+#define TT_UCR_TAI_LE                          (1L << 30) /* U+1950-U+197F */
+  /* Bit 95   New Tai Lue */
+#define TT_UCR_NEW_TAI_LUE                     (1L << 31) /* U+1980-U+19DF */
+  /* Bit 96   Buginese */
+#define TT_UCR_BUGINESE                        (1L <<  0) /* U+1A00-U+1A1F */
+  /* Bit 97   Glagolitic */
+#define TT_UCR_GLAGOLITIC                      (1L <<  1) /* U+2C00-U+2C5F */
+  /* Bit 98   Tifinagh */
+#define TT_UCR_TIFINAGH                        (1L <<  2) /* U+2D30-U+2D7F */
+  /* Bit 99   Yijing Hexagram Symbols */
+#define TT_UCR_YIJING                          (1L <<  3) /* U+4DC0-U+4DFF */
+  /* Bit 100  Syloti Nagri */
+#define TT_UCR_SYLOTI_NAGRI                    (1L <<  4) /* U+A800-U+A82F */
+  /* Bit 101  Linear B Syllabary */
+  /*          Linear B Ideograms */
+  /*          Aegean Numbers     */
+#define TT_UCR_LINEAR_B                        (1L <<  5) /*U+10000-U+1007F*/
+                                                          /*U+10080-U+100FF*/
+                                                          /*U+10100-U+1013F*/
+  /* Bit 102  Ancient Greek Numbers */
+#define TT_UCR_ANCIENT_GREEK_NUMBERS           (1L <<  6) /*U+10140-U+1018F*/
+  /* Bit 103  Ugaritic */
+#define TT_UCR_UGARITIC                        (1L <<  7) /*U+10380-U+1039F*/
+  /* Bit 104  Old Persian */
+#define TT_UCR_OLD_PERSIAN                     (1L <<  8) /*U+103A0-U+103DF*/
+  /* Bit 105  Shavian */
+#define TT_UCR_SHAVIAN                         (1L <<  9) /*U+10450-U+1047F*/
+  /* Bit 106  Osmanya */
+#define TT_UCR_OSMANYA                         (1L << 10) /*U+10480-U+104AF*/
+  /* Bit 107  Cypriot Syllabary */
+#define TT_UCR_CYPRIOT_SYLLABARY               (1L << 11) /*U+10800-U+1083F*/
+  /* Bit 108  Kharoshthi */
+#define TT_UCR_KHAROSHTHI                      (1L << 12) /*U+10A00-U+10A5F*/
+  /* Bit 109  Tai Xuan Jing Symbols */
+#define TT_UCR_TAI_XUAN_JING                   (1L << 13) /*U+1D300-U+1D35F*/
+  /* Bit 110  Cuneiform                         */
+  /*          Cuneiform Numbers and Punctuation */
+#define TT_UCR_CUNEIFORM                       (1L << 14) /*U+12000-U+123FF*/
+                                                          /*U+12400-U+1247F*/
+  /* Bit 111  Counting Rod Numerals */
+#define TT_UCR_COUNTING_ROD_NUMERALS           (1L << 15) /*U+1D360-U+1D37F*/
+  /* Bit 112  Sundanese */
+#define TT_UCR_SUNDANESE                       (1L << 16) /* U+1B80-U+1BBF */
+  /* Bit 113  Lepcha */
+#define TT_UCR_LEPCHA                          (1L << 17) /* U+1C00-U+1C4F */
+  /* Bit 114  Ol Chiki */
+#define TT_UCR_OL_CHIKI                        (1L << 18) /* U+1C50-U+1C7F */
+  /* Bit 115  Saurashtra */
+#define TT_UCR_SAURASHTRA                      (1L << 19) /* U+A880-U+A8DF */
+  /* Bit 116  Kayah Li */
+#define TT_UCR_KAYAH_LI                        (1L << 20) /* U+A900-U+A92F */
+  /* Bit 117  Rejang */
+#define TT_UCR_REJANG                          (1L << 21) /* U+A930-U+A95F */
+  /* Bit 118  Cham */
+#define TT_UCR_CHAM                            (1L << 22) /* U+AA00-U+AA5F */
+  /* Bit 119  Ancient Symbols */
+#define TT_UCR_ANCIENT_SYMBOLS                 (1L << 23) /*U+10190-U+101CF*/
+  /* Bit 120  Phaistos Disc */
+#define TT_UCR_PHAISTOS_DISC                   (1L << 24) /*U+101D0-U+101FF*/
+  /* Bit 121  Carian */
+  /*          Lycian */
+  /*          Lydian */
+#define TT_UCR_OLD_ANATOLIAN                   (1L << 25) /*U+102A0-U+102DF*/
+                                                          /*U+10280-U+1029F*/
+                                                          /*U+10920-U+1093F*/
+  /* Bit 122  Domino Tiles  */
+  /*          Mahjong Tiles */
+#define TT_UCR_GAME_TILES                      (1L << 26) /*U+1F030-U+1F09F*/
+                                                          /*U+1F000-U+1F02F*/
+  /* Bit 123-127 Reserved for process-internal usage */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Some compilers have a very limited length of identifiers.             */
+  /*                                                                       */
+#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ )
+#define HAVE_LIMIT_ON_IDENTS
+#endif
+
+
+#ifndef HAVE_LIMIT_ON_IDENTS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Here some alias #defines in order to be clearer.                      */
+  /*                                                                       */
+  /* These are not always #defined to stay within the 31~character limit   */
+  /* which some compilers have.                                            */
+  /*                                                                       */
+  /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern  */
+  /* Borland compilers (read: from BC++ 3.1 on) can increase this limit.   */
+  /* If you get a warning with such a compiler, use the -i40 switch.       */
+  /*                                                                       */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_A      \
+         TT_UCR_ARABIC_PRESENTATIONS_A
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_B      \
+         TT_UCR_ARABIC_PRESENTATIONS_B
+
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS      \
+         TT_UCR_COMBINING_DIACRITICS
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \
+         TT_UCR_COMBINING_DIACRITICS_SYMB
+
+
+#endif /* !HAVE_LIMIT_ON_IDENTS */
+
+
+FT_END_HEADER
+
+#endif /* __TTNAMEID_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h
new file mode 100644
index 0000000..c620550
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h
@@ -0,0 +1,777 @@
+/***************************************************************************/
+/*                                                                         */
+/*  tttables.h                                                             */
+/*                                                                         */
+/*    Basic SFNT/TrueType tables definitions and interface                 */
+/*    (specification only).                                                */
+/*                                                                         */
+/*  Copyright 1996-2005, 2008-2012 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTTABLES_H__
+#define __TTTABLES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    truetype_tables                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    TrueType Tables                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    TrueType specific table types and functions.                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the definition of TrueType-specific tables   */
+  /*    as well as some routines used to access and process them.          */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Header                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType font header table.  All       */
+  /*    fields follow the TrueType specification.                          */
+  /*                                                                       */
+  typedef struct  TT_Header_
+  {
+    FT_Fixed   Table_Version;
+    FT_Fixed   Font_Revision;
+
+    FT_Long    CheckSum_Adjust;
+    FT_Long    Magic_Number;
+
+    FT_UShort  Flags;
+    FT_UShort  Units_Per_EM;
+
+    FT_Long    Created [2];
+    FT_Long    Modified[2];
+
+    FT_Short   xMin;
+    FT_Short   yMin;
+    FT_Short   xMax;
+    FT_Short   yMax;
+
+    FT_UShort  Mac_Style;
+    FT_UShort  Lowest_Rec_PPEM;
+
+    FT_Short   Font_Direction;
+    FT_Short   Index_To_Loc_Format;
+    FT_Short   Glyph_Data_Format;
+
+  } TT_Header;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_HoriHeader                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType horizontal header, the `hhea' */
+  /*    table, as well as the corresponding horizontal metrics table,      */
+  /*    i.e., the `hmtx' table.                                            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    Version                :: The table version.                       */
+  /*                                                                       */
+  /*    Ascender               :: The font's ascender, i.e., the distance  */
+  /*                              from the baseline to the top-most of all */
+  /*                              glyph points found in the font.          */
+  /*                                                                       */
+  /*                              This value is invalid in many fonts, as  */
+  /*                              it is usually set by the font designer,  */
+  /*                              and often reflects only a portion of the */
+  /*                              glyphs found in the font (maybe ASCII).  */
+  /*                                                                       */
+  /*                              You should use the `sTypoAscender' field */
+  /*                              of the OS/2 table instead if you want    */
+  /*                              the correct one.                         */
+  /*                                                                       */
+  /*    Descender              :: The font's descender, i.e., the distance */
+  /*                              from the baseline to the bottom-most of  */
+  /*                              all glyph points found in the font.  It  */
+  /*                              is negative.                             */
+  /*                                                                       */
+  /*                              This value is invalid in many fonts, as  */
+  /*                              it is usually set by the font designer,  */
+  /*                              and often reflects only a portion of the */
+  /*                              glyphs found in the font (maybe ASCII).  */
+  /*                                                                       */
+  /*                              You should use the `sTypoDescender'      */
+  /*                              field of the OS/2 table instead if you   */
+  /*                              want the correct one.                    */
+  /*                                                                       */
+  /*    Line_Gap               :: The font's line gap, i.e., the distance  */
+  /*                              to add to the ascender and descender to  */
+  /*                              get the BTB, i.e., the                   */
+  /*                              baseline-to-baseline distance for the    */
+  /*                              font.                                    */
+  /*                                                                       */
+  /*    advance_Width_Max      :: This field is the maximum of all advance */
+  /*                              widths found in the font.  It can be     */
+  /*                              used to compute the maximum width of an  */
+  /*                              arbitrary string of text.                */
+  /*                                                                       */
+  /*    min_Left_Side_Bearing  :: The minimum left side bearing of all     */
+  /*                              glyphs within the font.                  */
+  /*                                                                       */
+  /*    min_Right_Side_Bearing :: The minimum right side bearing of all    */
+  /*                              glyphs within the font.                  */
+  /*                                                                       */
+  /*    xMax_Extent            :: The maximum horizontal extent (i.e., the */
+  /*                              `width' of a glyph's bounding box) for   */
+  /*                              all glyphs in the font.                  */
+  /*                                                                       */
+  /*    caret_Slope_Rise       :: The rise coefficient of the cursor's     */
+  /*                              slope of the cursor (slope=rise/run).    */
+  /*                                                                       */
+  /*    caret_Slope_Run        :: The run coefficient of the cursor's      */
+  /*                              slope.                                   */
+  /*                                                                       */
+  /*    Reserved               :: 8~reserved bytes.                        */
+  /*                                                                       */
+  /*    metric_Data_Format     :: Always~0.                                */
+  /*                                                                       */
+  /*    number_Of_HMetrics     :: Number of HMetrics entries in the `hmtx' */
+  /*                              table -- this value can be smaller than  */
+  /*                              the total number of glyphs in the font.  */
+  /*                                                                       */
+  /*    long_metrics           :: A pointer into the `hmtx' table.         */
+  /*                                                                       */
+  /*    short_metrics          :: A pointer into the `hmtx' table.         */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */
+  /*               be identical except for the names of their fields which */
+  /*               are different.                                          */
+  /*                                                                       */
+  /*               This ensures that a single function in the `ttload'     */
+  /*               module is able to read both the horizontal and vertical */
+  /*               headers.                                                */
+  /*                                                                       */
+  typedef struct  TT_HoriHeader_
+  {
+    FT_Fixed   Version;
+    FT_Short   Ascender;
+    FT_Short   Descender;
+    FT_Short   Line_Gap;
+
+    FT_UShort  advance_Width_Max;      /* advance width maximum */
+
+    FT_Short   min_Left_Side_Bearing;  /* minimum left-sb       */
+    FT_Short   min_Right_Side_Bearing; /* minimum right-sb      */
+    FT_Short   xMax_Extent;            /* xmax extents          */
+    FT_Short   caret_Slope_Rise;
+    FT_Short   caret_Slope_Run;
+    FT_Short   caret_Offset;
+
+    FT_Short   Reserved[4];
+
+    FT_Short   metric_Data_Format;
+    FT_UShort  number_Of_HMetrics;
+
+    /* The following fields are not defined by the TrueType specification */
+    /* but they are used to connect the metrics header to the relevant    */
+    /* `HMTX' table.                                                      */
+
+    void*      long_metrics;
+    void*      short_metrics;
+
+  } TT_HoriHeader;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_VertHeader                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType vertical header, the `vhea'   */
+  /*    table, as well as the corresponding vertical metrics table, i.e.,  */
+  /*    the `vmtx' table.                                                  */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    Version                 :: The table version.                      */
+  /*                                                                       */
+  /*    Ascender                :: The font's ascender, i.e., the distance */
+  /*                               from the baseline to the top-most of    */
+  /*                               all glyph points found in the font.     */
+  /*                                                                       */
+  /*                               This value is invalid in many fonts, as */
+  /*                               it is usually set by the font designer, */
+  /*                               and often reflects only a portion of    */
+  /*                               the glyphs found in the font (maybe     */
+  /*                               ASCII).                                 */
+  /*                                                                       */
+  /*                               You should use the `sTypoAscender'      */
+  /*                               field of the OS/2 table instead if you  */
+  /*                               want the correct one.                   */
+  /*                                                                       */
+  /*    Descender               :: The font's descender, i.e., the         */
+  /*                               distance from the baseline to the       */
+  /*                               bottom-most of all glyph points found   */
+  /*                               in the font.  It is negative.           */
+  /*                                                                       */
+  /*                               This value is invalid in many fonts, as */
+  /*                               it is usually set by the font designer, */
+  /*                               and often reflects only a portion of    */
+  /*                               the glyphs found in the font (maybe     */
+  /*                               ASCII).                                 */
+  /*                                                                       */
+  /*                               You should use the `sTypoDescender'     */
+  /*                               field of the OS/2 table instead if you  */
+  /*                               want the correct one.                   */
+  /*                                                                       */
+  /*    Line_Gap                :: The font's line gap, i.e., the distance */
+  /*                               to add to the ascender and descender to */
+  /*                               get the BTB, i.e., the                  */
+  /*                               baseline-to-baseline distance for the   */
+  /*                               font.                                   */
+  /*                                                                       */
+  /*    advance_Height_Max      :: This field is the maximum of all        */
+  /*                               advance heights found in the font.  It  */
+  /*                               can be used to compute the maximum      */
+  /*                               height of an arbitrary string of text.  */
+  /*                                                                       */
+  /*    min_Top_Side_Bearing    :: The minimum top side bearing of all     */
+  /*                               glyphs within the font.                 */
+  /*                                                                       */
+  /*    min_Bottom_Side_Bearing :: The minimum bottom side bearing of all  */
+  /*                               glyphs within the font.                 */
+  /*                                                                       */
+  /*    yMax_Extent             :: The maximum vertical extent (i.e., the  */
+  /*                               `height' of a glyph's bounding box) for */
+  /*                               all glyphs in the font.                 */
+  /*                                                                       */
+  /*    caret_Slope_Rise        :: The rise coefficient of the cursor's    */
+  /*                               slope of the cursor (slope=rise/run).   */
+  /*                                                                       */
+  /*    caret_Slope_Run         :: The run coefficient of the cursor's     */
+  /*                               slope.                                  */
+  /*                                                                       */
+  /*    caret_Offset            :: The cursor's offset for slanted fonts.  */
+  /*                               This value is `reserved' in vmtx        */
+  /*                               version 1.0.                            */
+  /*                                                                       */
+  /*    Reserved                :: 8~reserved bytes.                       */
+  /*                                                                       */
+  /*    metric_Data_Format      :: Always~0.                               */
+  /*                                                                       */
+  /*    number_Of_HMetrics      :: Number of VMetrics entries in the       */
+  /*                               `vmtx' table -- this value can be       */
+  /*                               smaller than the total number of glyphs */
+  /*                               in the font.                            */
+  /*                                                                       */
+  /*    long_metrics           :: A pointer into the `vmtx' table.         */
+  /*                                                                       */
+  /*    short_metrics          :: A pointer into the `vmtx' table.         */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */
+  /*               be identical except for the names of their fields which */
+  /*               are different.                                          */
+  /*                                                                       */
+  /*               This ensures that a single function in the `ttload'     */
+  /*               module is able to read both the horizontal and vertical */
+  /*               headers.                                                */
+  /*                                                                       */
+  typedef struct  TT_VertHeader_
+  {
+    FT_Fixed   Version;
+    FT_Short   Ascender;
+    FT_Short   Descender;
+    FT_Short   Line_Gap;
+
+    FT_UShort  advance_Height_Max;      /* advance height maximum */
+
+    FT_Short   min_Top_Side_Bearing;    /* minimum left-sb or top-sb       */
+    FT_Short   min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb   */
+    FT_Short   yMax_Extent;             /* xmax or ymax extents            */
+    FT_Short   caret_Slope_Rise;
+    FT_Short   caret_Slope_Run;
+    FT_Short   caret_Offset;
+
+    FT_Short   Reserved[4];
+
+    FT_Short   metric_Data_Format;
+    FT_UShort  number_Of_VMetrics;
+
+    /* The following fields are not defined by the TrueType specification */
+    /* but they're used to connect the metrics header to the relevant     */
+    /* `HMTX' or `VMTX' table.                                            */
+
+    void*      long_metrics;
+    void*      short_metrics;
+
+  } TT_VertHeader;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_OS2                                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType OS/2 table. This is the long  */
+  /*    table version.  All fields comply to the TrueType specification.   */
+  /*                                                                       */
+  /*    Note that we now support old Mac fonts which do not include an     */
+  /*    OS/2 table.  In this case, the `version' field is always set to    */
+  /*    0xFFFF.                                                            */
+  /*                                                                       */
+  typedef struct  TT_OS2_
+  {
+    FT_UShort  version;                /* 0x0001 - more or 0xFFFF */
+    FT_Short   xAvgCharWidth;
+    FT_UShort  usWeightClass;
+    FT_UShort  usWidthClass;
+    FT_Short   fsType;
+    FT_Short   ySubscriptXSize;
+    FT_Short   ySubscriptYSize;
+    FT_Short   ySubscriptXOffset;
+    FT_Short   ySubscriptYOffset;
+    FT_Short   ySuperscriptXSize;
+    FT_Short   ySuperscriptYSize;
+    FT_Short   ySuperscriptXOffset;
+    FT_Short   ySuperscriptYOffset;
+    FT_Short   yStrikeoutSize;
+    FT_Short   yStrikeoutPosition;
+    FT_Short   sFamilyClass;
+
+    FT_Byte    panose[10];
+
+    FT_ULong   ulUnicodeRange1;        /* Bits 0-31   */
+    FT_ULong   ulUnicodeRange2;        /* Bits 32-63  */
+    FT_ULong   ulUnicodeRange3;        /* Bits 64-95  */
+    FT_ULong   ulUnicodeRange4;        /* Bits 96-127 */
+
+    FT_Char    achVendID[4];
+
+    FT_UShort  fsSelection;
+    FT_UShort  usFirstCharIndex;
+    FT_UShort  usLastCharIndex;
+    FT_Short   sTypoAscender;
+    FT_Short   sTypoDescender;
+    FT_Short   sTypoLineGap;
+    FT_UShort  usWinAscent;
+    FT_UShort  usWinDescent;
+
+    /* only version 1 tables: */
+
+    FT_ULong   ulCodePageRange1;       /* Bits 0-31   */
+    FT_ULong   ulCodePageRange2;       /* Bits 32-63  */
+
+    /* only version 2 tables: */
+
+    FT_Short   sxHeight;
+    FT_Short   sCapHeight;
+    FT_UShort  usDefaultChar;
+    FT_UShort  usBreakChar;
+    FT_UShort  usMaxContext;
+
+  } TT_OS2;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Postscript                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType PostScript table.  All fields */
+  /*    comply to the TrueType specification.  This structure does not     */
+  /*    reference the PostScript glyph names, which can be nevertheless    */
+  /*    accessed with the `ttpost' module.                                 */
+  /*                                                                       */
+  typedef struct  TT_Postscript_
+  {
+    FT_Fixed  FormatType;
+    FT_Fixed  italicAngle;
+    FT_Short  underlinePosition;
+    FT_Short  underlineThickness;
+    FT_ULong  isFixedPitch;
+    FT_ULong  minMemType42;
+    FT_ULong  maxMemType42;
+    FT_ULong  minMemType1;
+    FT_ULong  maxMemType1;
+
+    /* Glyph names follow in the file, but we don't   */
+    /* load them by default.  See the ttpost.c file.  */
+
+  } TT_Postscript;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_PCLT                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType PCLT table.  All fields       */
+  /*    comply to the TrueType specification.                              */
+  /*                                                                       */
+  typedef struct  TT_PCLT_
+  {
+    FT_Fixed   Version;
+    FT_ULong   FontNumber;
+    FT_UShort  Pitch;
+    FT_UShort  xHeight;
+    FT_UShort  Style;
+    FT_UShort  TypeFamily;
+    FT_UShort  CapHeight;
+    FT_UShort  SymbolSet;
+    FT_Char    TypeFace[16];
+    FT_Char    CharacterComplement[8];
+    FT_Char    FileName[6];
+    FT_Char    StrokeWeight;
+    FT_Char    WidthType;
+    FT_Byte    SerifStyle;
+    FT_Byte    Reserved;
+
+  } TT_PCLT;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_MaxProfile                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The maximum profile is a table containing many max values which    */
+  /*    can be used to pre-allocate arrays.  This ensures that no memory   */
+  /*    allocation occurs during a glyph load.                             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    version               :: The version number.                       */
+  /*                                                                       */
+  /*    numGlyphs             :: The number of glyphs in this TrueType     */
+  /*                             font.                                     */
+  /*                                                                       */
+  /*    maxPoints             :: The maximum number of points in a         */
+  /*                             non-composite TrueType glyph.  See also   */
+  /*                             the structure element                     */
+  /*                             `maxCompositePoints'.                     */
+  /*                                                                       */
+  /*    maxContours           :: The maximum number of contours in a       */
+  /*                             non-composite TrueType glyph.  See also   */
+  /*                             the structure element                     */
+  /*                             `maxCompositeContours'.                   */
+  /*                                                                       */
+  /*    maxCompositePoints    :: The maximum number of points in a         */
+  /*                             composite TrueType glyph.  See also the   */
+  /*                             structure element `maxPoints'.            */
+  /*                                                                       */
+  /*    maxCompositeContours  :: The maximum number of contours in a       */
+  /*                             composite TrueType glyph.  See also the   */
+  /*                             structure element `maxContours'.          */
+  /*                                                                       */
+  /*    maxZones              :: The maximum number of zones used for      */
+  /*                             glyph hinting.                            */
+  /*                                                                       */
+  /*    maxTwilightPoints     :: The maximum number of points in the       */
+  /*                             twilight zone used for glyph hinting.     */
+  /*                                                                       */
+  /*    maxStorage            :: The maximum number of elements in the     */
+  /*                             storage area used for glyph hinting.      */
+  /*                                                                       */
+  /*    maxFunctionDefs       :: The maximum number of function            */
+  /*                             definitions in the TrueType bytecode for  */
+  /*                             this font.                                */
+  /*                                                                       */
+  /*    maxInstructionDefs    :: The maximum number of instruction         */
+  /*                             definitions in the TrueType bytecode for  */
+  /*                             this font.                                */
+  /*                                                                       */
+  /*    maxStackElements      :: The maximum number of stack elements used */
+  /*                             during bytecode interpretation.           */
+  /*                                                                       */
+  /*    maxSizeOfInstructions :: The maximum number of TrueType opcodes    */
+  /*                             used for glyph hinting.                   */
+  /*                                                                       */
+  /*    maxComponentElements  :: The maximum number of simple (i.e., non-  */
+  /*                             composite) glyphs in a composite glyph.   */
+  /*                                                                       */
+  /*    maxComponentDepth     :: The maximum nesting depth of composite    */
+  /*                             glyphs.                                   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This structure is only used during font loading.                   */
+  /*                                                                       */
+  typedef struct  TT_MaxProfile_
+  {
+    FT_Fixed   version;
+    FT_UShort  numGlyphs;
+    FT_UShort  maxPoints;
+    FT_UShort  maxContours;
+    FT_UShort  maxCompositePoints;
+    FT_UShort  maxCompositeContours;
+    FT_UShort  maxZones;
+    FT_UShort  maxTwilightPoints;
+    FT_UShort  maxStorage;
+    FT_UShort  maxFunctionDefs;
+    FT_UShort  maxInstructionDefs;
+    FT_UShort  maxStackElements;
+    FT_UShort  maxSizeOfInstructions;
+    FT_UShort  maxComponentElements;
+    FT_UShort  maxComponentDepth;
+
+  } TT_MaxProfile;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Sfnt_Tag                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration used to specify the index of an SFNT table.         */
+  /*    Used in the @FT_Get_Sfnt_Table API function.                       */
+  /*                                                                       */
+  typedef enum  FT_Sfnt_Tag_
+  {
+    ft_sfnt_head = 0,    /* TT_Header     */
+    ft_sfnt_maxp = 1,    /* TT_MaxProfile */
+    ft_sfnt_os2  = 2,    /* TT_OS2        */
+    ft_sfnt_hhea = 3,    /* TT_HoriHeader */
+    ft_sfnt_vhea = 4,    /* TT_VertHeader */
+    ft_sfnt_post = 5,    /* TT_Postscript */
+    ft_sfnt_pclt = 6,    /* TT_PCLT       */
+
+    sfnt_max   /* internal end mark */
+
+  } FT_Sfnt_Tag;
+
+  /* */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Sfnt_Table                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a pointer to a given SFNT table within a face.              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source.                                    */
+  /*                                                                       */
+  /*    tag  :: The index of the SFNT table.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A type-less pointer to the table.  This will be~0 in case of       */
+  /*    error, or if the corresponding table was not found *OR* loaded     */
+  /*    from the file.                                                     */
+  /*                                                                       */
+  /*    Use a typecast according to `tag' to access the structure          */
+  /*    elements.                                                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The table is owned by the face object and disappears with it.      */
+  /*                                                                       */
+  /*    This function is only useful to access SFNT tables that are loaded */
+  /*    by the sfnt, truetype, and opentype drivers.  See @FT_Sfnt_Tag for */
+  /*    a list.                                                            */
+  /*                                                                       */
+  /*    Here an example how to access the `vhea' table:                    */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      TT_VertHeader*  vert_header;                                     */
+  /*                                                                       */
+  /*                                                                       */
+  /*      vert_header =                                                    */
+  /*        (TT_VertHeader*)FT_Get_Sfnt_Table( face, ft_sfnt_vhea );       */
+  /*    }                                                                  */
+  /*                                                                       */
+  FT_EXPORT( void* )
+  FT_Get_Sfnt_Table( FT_Face      face,
+                     FT_Sfnt_Tag  tag );
+
+
+ /**************************************************************************
+  *
+  * @function:
+  *   FT_Load_Sfnt_Table
+  *
+  * @description:
+  *   Load any font table into client memory.
+  *
+  * @input:
+  *   face ::
+  *     A handle to the source face.
+  *
+  *   tag ::
+  *     The four-byte tag of the table to load.  Use the value~0 if you want
+  *     to access the whole font file.  Otherwise, you can use one of the
+  *     definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new
+  *     one with @FT_MAKE_TAG.
+  *
+  *   offset ::
+  *     The starting offset in the table (or file if tag == 0).
+  *
+  * @output:
+  *   buffer ::
+  *     The target buffer address.  The client must ensure that the memory
+  *     array is big enough to hold the data.
+  *
+  * @inout:
+  *   length ::
+  *     If the `length' parameter is NULL, then try to load the whole table.
+  *     Return an error code if it fails.
+  *
+  *     Else, if `*length' is~0, exit immediately while returning the
+  *     table's (or file) full size in it.
+  *
+  *     Else the number of bytes to read from the table or file, from the
+  *     starting offset.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   If you need to determine the table's length you should first call this
+  *   function with `*length' set to~0, as in the following example:
+  *
+  *     {
+  *       FT_ULong  length = 0;
+  *
+  *
+  *       error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length );
+  *       if ( error ) { ... table does not exist ... }
+  *
+  *       buffer = malloc( length );
+  *       if ( buffer == NULL ) { ... not enough memory ... }
+  *
+  *       error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length );
+  *       if ( error ) { ... could not load table ... }
+  *     }
+  */
+  FT_EXPORT( FT_Error )
+  FT_Load_Sfnt_Table( FT_Face    face,
+                      FT_ULong   tag,
+                      FT_Long    offset,
+                      FT_Byte*   buffer,
+                      FT_ULong*  length );
+
+
+ /**************************************************************************
+  *
+  * @function:
+  *   FT_Sfnt_Table_Info
+  *
+  * @description:
+  *   Return information on an SFNT table.
+  *
+  * @input:
+  *   face ::
+  *     A handle to the source face.
+  *
+  *   table_index ::
+  *     The index of an SFNT table.  The function returns
+  *     FT_Err_Table_Missing for an invalid value.
+  *
+  * @inout:
+  *   tag ::
+  *     The name tag of the SFNT table.  If the value is NULL, `table_index'
+  *     is ignored, and `length' returns the number of SFNT tables in the
+  *     font.
+  *
+  * @output:
+  *   length ::
+  *     The length of the SFNT table (or the number of SFNT tables, depending
+  *     on `tag').
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   While parsing fonts, FreeType handles SFNT tables with length zero as
+  *   missing.
+  *
+  */
+  FT_EXPORT( FT_Error )
+  FT_Sfnt_Table_Info( FT_Face    face,
+                      FT_UInt    table_index,
+                      FT_ULong  *tag,
+                      FT_ULong  *length );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_CMap_Language_ID                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return TrueType/sfnt specific cmap language ID.  Definitions of    */
+  /*    language ID values are in `freetype/ttnameid.h'.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    charmap ::                                                         */
+  /*      The target charmap.                                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The language ID of `charmap'.  If `charmap' doesn't belong to a    */
+  /*    TrueType/sfnt face, just return~0 as the default value.            */
+  /*                                                                       */
+  /*    For a format~14 cmap (to access Unicode IVS), the return value is  */
+  /*    0xFFFFFFFF.                                                        */
+  /*                                                                       */
+  FT_EXPORT( FT_ULong )
+  FT_Get_CMap_Language_ID( FT_CharMap  charmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_CMap_Format                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return TrueType/sfnt specific cmap format.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    charmap ::                                                         */
+  /*      The target charmap.                                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The format of `charmap'.  If `charmap' doesn't belong to a         */
+  /*    TrueType/sfnt face, return -1.                                     */
+  /*                                                                       */
+  FT_EXPORT( FT_Long )
+  FT_Get_CMap_Format( FT_CharMap  charmap );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __TTTABLES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttags.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttags.h
new file mode 100644
index 0000000..ac7de2a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttags.h
@@ -0,0 +1,109 @@
+/***************************************************************************/
+/*                                                                         */
+/*  tttags.h                                                               */
+/*                                                                         */
+/*    Tags for TrueType and OpenType tables (specification only).          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2004, 2005, 2007, 2008, 2013 by                   */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTAGS_H__
+#define __TTAGS_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+#define TTAG_avar  FT_MAKE_TAG( 'a', 'v', 'a', 'r' )
+#define TTAG_BASE  FT_MAKE_TAG( 'B', 'A', 'S', 'E' )
+#define TTAG_bdat  FT_MAKE_TAG( 'b', 'd', 'a', 't' )
+#define TTAG_BDF   FT_MAKE_TAG( 'B', 'D', 'F', ' ' )
+#define TTAG_bhed  FT_MAKE_TAG( 'b', 'h', 'e', 'd' )
+#define TTAG_bloc  FT_MAKE_TAG( 'b', 'l', 'o', 'c' )
+#define TTAG_bsln  FT_MAKE_TAG( 'b', 's', 'l', 'n' )
+#define TTAG_CBDT  FT_MAKE_TAG( 'C', 'B', 'D', 'T' )
+#define TTAG_CBLC  FT_MAKE_TAG( 'C', 'B', 'L', 'C' )
+#define TTAG_CFF   FT_MAKE_TAG( 'C', 'F', 'F', ' ' )
+#define TTAG_CID   FT_MAKE_TAG( 'C', 'I', 'D', ' ' )
+#define TTAG_cmap  FT_MAKE_TAG( 'c', 'm', 'a', 'p' )
+#define TTAG_cvar  FT_MAKE_TAG( 'c', 'v', 'a', 'r' )
+#define TTAG_cvt   FT_MAKE_TAG( 'c', 'v', 't', ' ' )
+#define TTAG_DSIG  FT_MAKE_TAG( 'D', 'S', 'I', 'G' )
+#define TTAG_EBDT  FT_MAKE_TAG( 'E', 'B', 'D', 'T' )
+#define TTAG_EBLC  FT_MAKE_TAG( 'E', 'B', 'L', 'C' )
+#define TTAG_EBSC  FT_MAKE_TAG( 'E', 'B', 'S', 'C' )
+#define TTAG_feat  FT_MAKE_TAG( 'f', 'e', 'a', 't' )
+#define TTAG_FOND  FT_MAKE_TAG( 'F', 'O', 'N', 'D' )
+#define TTAG_fpgm  FT_MAKE_TAG( 'f', 'p', 'g', 'm' )
+#define TTAG_fvar  FT_MAKE_TAG( 'f', 'v', 'a', 'r' )
+#define TTAG_gasp  FT_MAKE_TAG( 'g', 'a', 's', 'p' )
+#define TTAG_GDEF  FT_MAKE_TAG( 'G', 'D', 'E', 'F' )
+#define TTAG_glyf  FT_MAKE_TAG( 'g', 'l', 'y', 'f' )
+#define TTAG_GPOS  FT_MAKE_TAG( 'G', 'P', 'O', 'S' )
+#define TTAG_GSUB  FT_MAKE_TAG( 'G', 'S', 'U', 'B' )
+#define TTAG_gvar  FT_MAKE_TAG( 'g', 'v', 'a', 'r' )
+#define TTAG_hdmx  FT_MAKE_TAG( 'h', 'd', 'm', 'x' )
+#define TTAG_head  FT_MAKE_TAG( 'h', 'e', 'a', 'd' )
+#define TTAG_hhea  FT_MAKE_TAG( 'h', 'h', 'e', 'a' )
+#define TTAG_hmtx  FT_MAKE_TAG( 'h', 'm', 't', 'x' )
+#define TTAG_JSTF  FT_MAKE_TAG( 'J', 'S', 'T', 'F' )
+#define TTAG_just  FT_MAKE_TAG( 'j', 'u', 's', 't' )
+#define TTAG_kern  FT_MAKE_TAG( 'k', 'e', 'r', 'n' )
+#define TTAG_lcar  FT_MAKE_TAG( 'l', 'c', 'a', 'r' )
+#define TTAG_loca  FT_MAKE_TAG( 'l', 'o', 'c', 'a' )
+#define TTAG_LTSH  FT_MAKE_TAG( 'L', 'T', 'S', 'H' )
+#define TTAG_LWFN  FT_MAKE_TAG( 'L', 'W', 'F', 'N' )
+#define TTAG_MATH  FT_MAKE_TAG( 'M', 'A', 'T', 'H' )
+#define TTAG_maxp  FT_MAKE_TAG( 'm', 'a', 'x', 'p' )
+#define TTAG_META  FT_MAKE_TAG( 'M', 'E', 'T', 'A' )
+#define TTAG_MMFX  FT_MAKE_TAG( 'M', 'M', 'F', 'X' )
+#define TTAG_MMSD  FT_MAKE_TAG( 'M', 'M', 'S', 'D' )
+#define TTAG_mort  FT_MAKE_TAG( 'm', 'o', 'r', 't' )
+#define TTAG_morx  FT_MAKE_TAG( 'm', 'o', 'r', 'x' )
+#define TTAG_name  FT_MAKE_TAG( 'n', 'a', 'm', 'e' )
+#define TTAG_opbd  FT_MAKE_TAG( 'o', 'p', 'b', 'd' )
+#define TTAG_OS2   FT_MAKE_TAG( 'O', 'S', '/', '2' )
+#define TTAG_OTTO  FT_MAKE_TAG( 'O', 'T', 'T', 'O' )
+#define TTAG_PCLT  FT_MAKE_TAG( 'P', 'C', 'L', 'T' )
+#define TTAG_POST  FT_MAKE_TAG( 'P', 'O', 'S', 'T' )
+#define TTAG_post  FT_MAKE_TAG( 'p', 'o', 's', 't' )
+#define TTAG_prep  FT_MAKE_TAG( 'p', 'r', 'e', 'p' )
+#define TTAG_prop  FT_MAKE_TAG( 'p', 'r', 'o', 'p' )
+#define TTAG_sfnt  FT_MAKE_TAG( 's', 'f', 'n', 't' )
+#define TTAG_SING  FT_MAKE_TAG( 'S', 'I', 'N', 'G' )
+#define TTAG_trak  FT_MAKE_TAG( 't', 'r', 'a', 'k' )
+#define TTAG_true  FT_MAKE_TAG( 't', 'r', 'u', 'e' )
+#define TTAG_ttc   FT_MAKE_TAG( 't', 't', 'c', ' ' )
+#define TTAG_ttcf  FT_MAKE_TAG( 't', 't', 'c', 'f' )
+#define TTAG_TYP1  FT_MAKE_TAG( 'T', 'Y', 'P', '1' )
+#define TTAG_typ1  FT_MAKE_TAG( 't', 'y', 'p', '1' )
+#define TTAG_VDMX  FT_MAKE_TAG( 'V', 'D', 'M', 'X' )
+#define TTAG_vhea  FT_MAKE_TAG( 'v', 'h', 'e', 'a' )
+#define TTAG_vmtx  FT_MAKE_TAG( 'v', 'm', 't', 'x' )
+
+
+FT_END_HEADER
+
+#endif /* __TTAGS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttunpat.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttunpat.h
new file mode 100644
index 0000000..08e2759
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttunpat.h
@@ -0,0 +1,59 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttunpat.h                                                              */
+/*                                                                         */
+/*    Definitions for the unpatented TrueType hinting system               */
+/*                                                                         */
+/*  Copyright 2003, 2006 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  Written by Graham Asher <graham.asher@btinternet.com>                  */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTUNPAT_H__
+#define __TTUNPAT_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /***************************************************************************
+  *
+  * @constant:
+  *   FT_PARAM_TAG_UNPATENTED_HINTING
+  *
+  * @description:
+  *   A constant used as the tag of an @FT_Parameter structure to indicate
+  *   that unpatented methods only should be used by the TrueType bytecode
+  *   interpreter for a typeface opened by @FT_Open_Face.
+  *
+  */
+#define FT_PARAM_TAG_UNPATENTED_HINTING  FT_MAKE_TAG( 'u', 'n', 'p', 'a' )
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __TTUNPAT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/ft2build.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/ft2build.h
new file mode 100644
index 0000000..1fc8121
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/ft2build.h
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ft2build.h                                                             */
+/*                                                                         */
+/*    FreeType 2 build and setup macros.                                   */
+/*    (Generic version)                                                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2006 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file corresponds to the default `ft2build.h' file for            */
+  /* FreeType 2.  It uses the `freetype' include root.                     */
+  /*                                                                       */
+  /* Note that specific platforms might use a different configuration.     */
+  /* See builds/unix/ft2unix.h for an example.                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FT2_BUILD_GENERIC_H__
+#define __FT2_BUILD_GENERIC_H__
+
+#include "foxitnames.h"
+#include "freetype/config/ftheader.h"
+
+#endif /* __FT2_BUILD_GENERIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/Jamfile
new file mode 100644
index 0000000..832e8b8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/Jamfile
@@ -0,0 +1,60 @@
+# FreeType 2 src/base Jamfile
+#
+# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) base ;
+
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = ftadvanc ftcalc   ftdbgmem ftgloadr
+               ftobjs   ftoutln  ftrfork  ftsnames
+               ftstream fttrigon ftutil
+               basepic  ftpic
+               ;
+  }
+  else
+  {
+    _sources = ftbase ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# Add the optional/replaceable files.
+#
+{
+  local  _sources = bbox   bdf    bitmap debug  gasp
+                    glyph  gxval  init   lcdfil mm
+                    otval  pfr    stroke synth  system
+                    type1  winfnt xf86   patent
+                    ;
+
+  Library  $(FT2_LIB) : ft$(_sources).c ;
+}
+
+# Add Macintosh-specific file to the library when necessary.
+#
+if $(MAC)
+{
+  Library  $(FT2_LIB) : ftmac.c ;
+}
+else if $(OS) = MACOSX
+{
+  if $(FT2_MULTI)
+  {
+    Library  $(FT2_LIB) : ftmac.c ;
+  }
+}
+
+# end of src/base Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.c
new file mode 100644
index 0000000..d6fc01c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.c
@@ -0,0 +1,108 @@
+/***************************************************************************/
+/*                                                                         */
+/*  basepic.c                                                              */
+/*                                                                         */
+/*    The FreeType position independent code services for base.            */
+/*                                                                         */
+/*  Copyright 2009, 2012 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "basepic.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from ftglyph.c */
+  void
+  FT_Init_Class_ft_outline_glyph_class( FT_Glyph_Class*  clazz );
+
+  void
+  FT_Init_Class_ft_bitmap_glyph_class( FT_Glyph_Class*  clazz );
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+  /* forward declaration of PIC init function from ftrfork.c */
+  /* (not modularized)                                       */
+  void
+  FT_Init_Table_raccess_guess_table( ft_raccess_guess_rec*  record );
+#endif
+
+  /* forward declaration of PIC init functions from ftinit.c */
+  FT_Error
+  ft_create_default_module_classes( FT_Library  library );
+
+  void
+  ft_destroy_default_module_classes( FT_Library  library );
+
+
+  void
+  ft_base_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory          memory        = library->memory;
+
+
+    if ( pic_container->base )
+    {
+      /* destroy default module classes            */
+      /* (in case FT_Add_Default_Modules was used) */
+      ft_destroy_default_module_classes( library );
+
+      FT_FREE( pic_container->base );
+      pic_container->base = NULL;
+    }
+  }
+
+
+  FT_Error
+  ft_base_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = FT_Err_Ok;
+    BasePIC*           container     = NULL;
+    FT_Memory          memory        = library->memory;
+
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->base = container;
+
+    /* initialize default modules list and pointers */
+    error = ft_create_default_module_classes( library );
+    if ( error )
+      goto Exit;
+
+    /* initialize pointer table -                       */
+    /* this is how the module usually expects this data */
+    FT_Init_Class_ft_outline_glyph_class(
+      &container->ft_outline_glyph_class );
+    FT_Init_Class_ft_bitmap_glyph_class(
+      &container->ft_bitmap_glyph_class );
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+    FT_Init_Table_raccess_guess_table(
+      (ft_raccess_guess_rec*)&container->ft_raccess_guess_table );
+#endif
+
+  Exit:
+    if ( error )
+      ft_base_pic_free( library );
+    return error;
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.h
new file mode 100644
index 0000000..e2308ca
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.h
@@ -0,0 +1,90 @@
+/***************************************************************************/
+/*                                                                         */
+/*  basepic.h                                                              */
+/*                                                                         */
+/*    The FreeType position independent code services for base.            */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __BASEPIC_H__
+#define __BASEPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_OUTLINE_GLYPH_CLASS_GET  &ft_outline_glyph_class
+#define FT_BITMAP_GLYPH_CLASS_GET   &ft_bitmap_glyph_class
+#define FT_DEFAULT_MODULES_GET      ft_default_modules
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#define FT_RACCESS_GUESS_TABLE_GET  ft_raccess_guess_table
+#endif
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/ftglyph.h"
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#include "../../include/freetype/internal/ftrfork.h"
+#endif
+
+
+  typedef struct  BasePIC_
+  {
+    FT_Module_Class**  default_module_classes;
+    FT_Glyph_Class     ft_outline_glyph_class;
+    FT_Glyph_Class     ft_bitmap_glyph_class;
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+    ft_raccess_guess_rec  ft_raccess_guess_table[FT_RACCESS_N_RULES];
+#endif
+
+  } BasePIC;
+
+
+#define GET_PIC( lib )  ( (BasePIC*)( (lib)->pic_container.base ) )
+
+#define FT_OUTLINE_GLYPH_CLASS_GET                      \
+          ( &GET_PIC( library )->ft_outline_glyph_class )
+#define FT_BITMAP_GLYPH_CLASS_GET                        \
+          ( &GET_PIC( library )->ft_bitmap_glyph_class )
+#define FT_DEFAULT_MODULES_GET                           \
+          ( GET_PIC( library )->default_module_classes )
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#define FT_RACCESS_GUESS_TABLE_GET                       \
+          ( GET_PIC( library )->ft_raccess_guess_table )
+#endif
+
+
+  /* see basepic.c for the implementation */
+  void
+  ft_base_pic_free( FT_Library  library );
+
+  FT_Error
+  ft_base_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __BASEPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftadvanc.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftadvanc.c
new file mode 100644
index 0000000..652e51b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftadvanc.c
@@ -0,0 +1,162 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftadvanc.c                                                             */
+/*                                                                         */
+/*    Quick computation of advance widths (body).                          */
+/*                                                                         */
+/*  Copyright 2008, 2009, 2011, 2013 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/ftadvanc.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+  static FT_Error
+  _ft_face_scale_advances( FT_Face    face,
+                           FT_Fixed*  advances,
+                           FT_UInt    count,
+                           FT_Int32   flags )
+  {
+    FT_Fixed  scale;
+    FT_UInt   nn;
+
+
+    if ( flags & FT_LOAD_NO_SCALE )
+      return FT_Err_Ok;
+
+    if ( face->size == NULL )
+      return FT_THROW( Invalid_Size_Handle );
+
+    if ( flags & FT_LOAD_VERTICAL_LAYOUT )
+      scale = face->size->metrics.y_scale;
+    else
+      scale = face->size->metrics.x_scale;
+
+    /* this must be the same scaling as to get linear{Hori,Vert}Advance */
+    /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c)        */
+
+    for ( nn = 0; nn < count; nn++ )
+      advances[nn] = FT_MulDiv( advances[nn], scale, 64 );
+
+    return FT_Err_Ok;
+  }
+
+
+   /* at the moment, we can perform fast advance retrieval only in */
+   /* the following cases:                                         */
+   /*                                                              */
+   /*  - unscaled load                                             */
+   /*  - unhinted load                                             */
+   /*  - light-hinted load                                         */
+
+#define LOAD_ADVANCE_FAST_CHECK( flags )                            \
+          ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING )    || \
+            FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT )
+
+
+  /* documentation is in ftadvanc.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Advance( FT_Face    face,
+                  FT_UInt    gindex,
+                  FT_Int32   flags,
+                  FT_Fixed  *padvance )
+  {
+    FT_Face_GetAdvancesFunc  func;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    if ( gindex >= (FT_UInt)face->num_glyphs )
+      return FT_THROW( Invalid_Glyph_Index );
+
+    func = face->driver->clazz->get_advances;
+    if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
+    {
+      FT_Error  error;
+
+
+      error = func( face, gindex, 1, flags, padvance );
+      if ( !error )
+        return _ft_face_scale_advances( face, padvance, 1, flags );
+
+      if ( FT_ERR_NEQ( error, Unimplemented_Feature ) )
+        return error;
+    }
+
+    return FT_Get_Advances( face, gindex, 1, flags, padvance );
+  }
+
+
+  /* documentation is in ftadvanc.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Advances( FT_Face    face,
+                   FT_UInt    start,
+                   FT_UInt    count,
+                   FT_Int32   flags,
+                   FT_Fixed  *padvances )
+  {
+    FT_Face_GetAdvancesFunc  func;
+    FT_UInt                  num, end, nn;
+    FT_Error                 error = FT_Err_Ok;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    num = (FT_UInt)face->num_glyphs;
+    end = start + count;
+    if ( start >= num || end < start || end > num )
+      return FT_THROW( Invalid_Glyph_Index );
+
+    if ( count == 0 )
+      return FT_Err_Ok;
+
+    func = face->driver->clazz->get_advances;
+    if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
+    {
+      error = func( face, start, count, flags, padvances );
+      if ( !error )
+        return _ft_face_scale_advances( face, padvances, count, flags );
+
+      if ( FT_ERR_NEQ( error, Unimplemented_Feature ) )
+        return error;
+    }
+
+    error = FT_Err_Ok;
+
+    if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )
+      return FT_THROW( Unimplemented_Feature );
+
+    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
+    for ( nn = 0; nn < count; nn++ )
+    {
+      error = FT_Load_Glyph( face, start + nn, flags );
+      if ( error )
+        break;
+
+      /* scale from 26.6 to 16.16 */
+      padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
+                      ? face->glyph->advance.y << 10
+                      : face->glyph->advance.x << 10;
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftapi.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftapi.c
new file mode 100644
index 0000000..9ab6462
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftapi.c
@@ -0,0 +1,121 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftapi.c                                                                */
+/*                                                                         */
+/*    The FreeType compatibility functions (body).                         */
+/*                                                                         */
+/*  Copyright 2002 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftlist.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttables.h"
+#include "../../include/freetype/ftoutln.h"
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                 C O M P A T I B I L I T Y                       ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* backwards compatibility API */
+
+  FT_BASE_DEF( void )
+  FT_New_Memory_Stream( FT_Library  library,
+                        FT_Byte*    base,
+                        FT_ULong    size,
+                        FT_Stream   stream )
+  {
+    FT_UNUSED( library );
+
+    FT_Stream_OpenMemory( stream, base, size );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Seek_Stream( FT_Stream  stream,
+                  FT_ULong   pos )
+  {
+    return FT_Stream_Seek( stream, pos );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Skip_Stream( FT_Stream  stream,
+                  FT_Long    distance )
+  {
+    return FT_Stream_Skip( stream, distance );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Read_Stream( FT_Stream  stream,
+                  FT_Byte*   buffer,
+                  FT_ULong   count )
+  {
+    return FT_Stream_Read( stream, buffer, count );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Read_Stream_At( FT_Stream  stream,
+                     FT_ULong   pos,
+                     FT_Byte*   buffer,
+                     FT_ULong   count )
+  {
+    return FT_Stream_ReadAt( stream, pos, buffer, count );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Extract_Frame( FT_Stream  stream,
+                    FT_ULong   count,
+                    FT_Byte**  pbytes )
+  {
+    return FT_Stream_ExtractFrame( stream, count, pbytes );
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Release_Frame( FT_Stream  stream,
+                    FT_Byte**  pbytes )
+  {
+    FT_Stream_ReleaseFrame( stream, pbytes );
+  }
+
+  FT_BASE_DEF( FT_Error )
+  FT_Access_Frame( FT_Stream  stream,
+                   FT_ULong   count )
+  {
+    return FT_Stream_EnterFrame( stream, count );
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Forget_Frame( FT_Stream  stream )
+  {
+    FT_Stream_ExitFrame( stream );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbase.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbase.h
new file mode 100644
index 0000000..dced300
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbase.h
@@ -0,0 +1,69 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbase.h                                                               */
+/*                                                                         */
+/*    The FreeType private functions used in base module (specification).  */
+/*                                                                         */
+/*  Copyright 2008, 2010 by                                                */
+/*  David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTBASE_H__
+#define __FTBASE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */
+  /* font, and try to load a face specified by the face_index.            */
+  FT_LOCAL( FT_Error )
+  open_face_PS_from_sfnt_stream( FT_Library     library,
+                                 FT_Stream      stream,
+                                 FT_Long        face_index,
+                                 FT_Int         num_params,
+                                 FT_Parameter  *params,
+                                 FT_Face       *aface );
+
+
+  /* Create a new FT_Face given a buffer and a driver name. */
+  /* From ftmac.c.                                          */
+  FT_LOCAL( FT_Error )
+  open_face_from_buffer( FT_Library   library,
+                         FT_Byte*     base,
+                         FT_ULong     size,
+                         FT_Long      face_index,
+                         const char*  driver_name,
+                         FT_Face     *aface );
+
+
+#if  defined( FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK ) && \
+    !defined( FT_MACINTOSH )
+  /* Mac OS X/Darwin kernel often changes recommended method to access */
+  /* the resource fork and older methods makes the kernel issue the    */
+  /* warning of deprecated method.  To calm it down, the methods based */
+  /* on Darwin VFS should be grouped and skip the rest methods after   */
+  /* the case the resource is opened but found to lack a font in it.   */
+  FT_LOCAL( FT_Bool )
+  ft_raccess_rule_by_darwin_vfs( FT_Library library, FT_UInt  rule_index );
+#endif
+
+
+FT_END_HEADER
+
+#endif /* __FTBASE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbbox.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbbox.c
new file mode 100644
index 0000000..a5862c5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbbox.c
@@ -0,0 +1,649 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbbox.c                                                               */
+/*                                                                         */
+/*    FreeType bbox computation (body).                                    */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004, 2006, 2010, 2013 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used        */
+/*  modified and distributed under the terms of the FreeType project       */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This component has a _single_ role: to compute exact outline bounding */
+  /* boxes.                                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/ftbbox.h"
+#include "../../include/freetype/ftimage.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+  typedef struct  TBBox_Rec_
+  {
+    FT_Vector  last;
+    FT_BBox    bbox;
+
+  } TBBox_Rec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    BBox_Move_To                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used as a `move_to' and `line_to' emitter during  */
+  /*    FT_Outline_Decompose().  It simply records the destination point   */
+  /*    in `user->last'; no further computations are necessary since we    */
+  /*    use the cbox as the starting bbox which must be refined.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    to   :: A pointer to the destination vector.                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    user :: A pointer to the current walk context.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Always 0.  Needed for the interface only.                          */
+  /*                                                                       */
+  static int
+  BBox_Move_To( FT_Vector*  to,
+                TBBox_Rec*  user )
+  {
+    user->last = *to;
+
+    return 0;
+  }
+
+
+#define CHECK_X( p, bbox )  \
+          ( p->x < bbox.xMin || p->x > bbox.xMax )
+
+#define CHECK_Y( p, bbox )  \
+          ( p->y < bbox.yMin || p->y > bbox.yMax )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    BBox_Conic_Check                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finds the extrema of a 1-dimensional conic Bezier curve and update */
+  /*    a bounding range.  This version uses direct computation, as it     */
+  /*    doesn't need square roots.                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    y1  :: The start coordinate.                                       */
+  /*                                                                       */
+  /*    y2  :: The coordinate of the control point.                        */
+  /*                                                                       */
+  /*    y3  :: The end coordinate.                                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    min :: The address of the current minimum.                         */
+  /*                                                                       */
+  /*    max :: The address of the current maximum.                         */
+  /*                                                                       */
+  static void
+  BBox_Conic_Check( FT_Pos   y1,
+                    FT_Pos   y2,
+                    FT_Pos   y3,
+                    FT_Pos*  min,
+                    FT_Pos*  max )
+  {
+    if ( y1 <= y3 && y2 == y1 )     /* flat arc */
+      goto Suite;
+
+    if ( y1 < y3 )
+    {
+      if ( y2 >= y1 && y2 <= y3 )   /* ascending arc */
+        goto Suite;
+    }
+    else
+    {
+      if ( y2 >= y3 && y2 <= y1 )   /* descending arc */
+      {
+        y2 = y1;
+        y1 = y3;
+        y3 = y2;
+        goto Suite;
+      }
+    }
+
+    y1 = y3 = y1 - FT_MulDiv( y2 - y1, y2 - y1, y1 - 2*y2 + y3 );
+
+  Suite:
+    if ( y1 < *min ) *min = y1;
+    if ( y3 > *max ) *max = y3;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    BBox_Conic_To                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used as a `conic_to' emitter during               */
+  /*    FT_Outline_Decompose().  It checks a conic Bezier curve with the   */
+  /*    current bounding box, and computes its extrema if necessary to     */
+  /*    update it.                                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    control :: A pointer to a control point.                           */
+  /*                                                                       */
+  /*    to      :: A pointer to the destination vector.                    */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    user    :: The address of the current walk context.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Always 0.  Needed for the interface only.                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    In the case of a non-monotonous arc, we compute directly the       */
+  /*    extremum coordinates, as it is sufficiently fast.                  */
+  /*                                                                       */
+  static int
+  BBox_Conic_To( FT_Vector*  control,
+                 FT_Vector*  to,
+                 TBBox_Rec*  user )
+  {
+    /* we don't need to check `to' since it is always an `on' point, thus */
+    /* within the bbox                                                    */
+
+    if ( CHECK_X( control, user->bbox ) )
+      BBox_Conic_Check( user->last.x,
+                        control->x,
+                        to->x,
+                        &user->bbox.xMin,
+                        &user->bbox.xMax );
+
+    if ( CHECK_Y( control, user->bbox ) )
+      BBox_Conic_Check( user->last.y,
+                        control->y,
+                        to->y,
+                        &user->bbox.yMin,
+                        &user->bbox.yMax );
+
+    user->last = *to;
+
+    return 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    BBox_Cubic_Check                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finds the extrema of a 1-dimensional cubic Bezier curve and        */
+  /*    updates a bounding range.  This version uses splitting because we  */
+  /*    don't want to use square roots and extra accuracy.                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    p1  :: The start coordinate.                                       */
+  /*                                                                       */
+  /*    p2  :: The coordinate of the first control point.                  */
+  /*                                                                       */
+  /*    p3  :: The coordinate of the second control point.                 */
+  /*                                                                       */
+  /*    p4  :: The end coordinate.                                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    min :: The address of the current minimum.                         */
+  /*                                                                       */
+  /*    max :: The address of the current maximum.                         */
+  /*                                                                       */
+
+#if 0
+
+  static void
+  BBox_Cubic_Check( FT_Pos   p1,
+                    FT_Pos   p2,
+                    FT_Pos   p3,
+                    FT_Pos   p4,
+                    FT_Pos*  min,
+                    FT_Pos*  max )
+  {
+    FT_Pos  q1, q2, q3, q4;
+
+
+    q1 = p1;
+    q2 = p2;
+    q3 = p3;
+    q4 = p4;
+
+    /* for a conic segment to possibly reach new maximum     */
+    /* one of its off-points must be above the current value */
+    while ( q2 > *max || q3 > *max )
+    {
+      /* determine which half contains the maximum and split */
+      if ( q1 + q2 > q3 + q4 ) /* first half */
+      {
+        q4 = q4 + q3;
+        q3 = q3 + q2;
+        q2 = q2 + q1;
+        q4 = q4 + q3;
+        q3 = q3 + q2;
+        q4 = ( q4 + q3 ) / 8;
+        q3 = q3 / 4;
+        q2 = q2 / 2;
+      }
+      else                     /* second half */
+      {
+        q1 = q1 + q2;
+        q2 = q2 + q3;
+        q3 = q3 + q4;
+        q1 = q1 + q2;
+        q2 = q2 + q3;
+        q1 = ( q1 + q2 ) / 8;
+        q2 = q2 / 4;
+        q3 = q3 / 2;
+      }
+
+      /* check if either end reached the maximum */
+      if ( q1 == q2 && q1 >= q3 )
+      {
+        *max = q1;
+        break;
+      }
+      if ( q3 == q4 && q2 <= q4 )
+      {
+        *max = q4;
+        break;
+      }
+    }
+
+    q1 = p1;
+    q2 = p2;
+    q3 = p3;
+    q4 = p4;
+
+    /* for a conic segment to possibly reach new minimum     */
+    /* one of its off-points must be below the current value */
+    while ( q2 < *min || q3 < *min )
+    {
+      /* determine which half contains the minimum and split */
+      if ( q1 + q2 < q3 + q4 ) /* first half */
+      {
+        q4 = q4 + q3;
+        q3 = q3 + q2;
+        q2 = q2 + q1;
+        q4 = q4 + q3;
+        q3 = q3 + q2;
+        q4 = ( q4 + q3 ) / 8;
+        q3 = q3 / 4;
+        q2 = q2 / 2;
+      }
+      else                     /* second half */
+      {
+        q1 = q1 + q2;
+        q2 = q2 + q3;
+        q3 = q3 + q4;
+        q1 = q1 + q2;
+        q2 = q2 + q3;
+        q1 = ( q1 + q2 ) / 8;
+        q2 = q2 / 4;
+        q3 = q3 / 2;
+      }
+
+      /* check if either end reached the minimum */
+      if ( q1 == q2 && q1 <= q3 )
+      {
+        *min = q1;
+        break;
+      }
+      if ( q3 == q4 && q2 >= q4 )
+      {
+        *min = q4;
+        break;
+      }
+    }
+  }
+
+#else
+
+  static void
+  test_cubic_extrema( FT_Pos    y1,
+                      FT_Pos    y2,
+                      FT_Pos    y3,
+                      FT_Pos    y4,
+                      FT_Fixed  u,
+                      FT_Pos*   min,
+                      FT_Pos*   max )
+  {
+ /* FT_Pos    a = y4 - 3*y3 + 3*y2 - y1; */
+    FT_Pos    b = y3 - 2*y2 + y1;
+    FT_Pos    c = y2 - y1;
+    FT_Pos    d = y1;
+    FT_Pos    y;
+    FT_Fixed  uu;
+
+    FT_UNUSED ( y4 );
+
+
+    /* The polynomial is                      */
+    /*                                        */
+    /*    P(x) = a*x^3 + 3b*x^2 + 3c*x + d  , */
+    /*                                        */
+    /*   dP/dx = 3a*x^2 + 6b*x + 3c         . */
+    /*                                        */
+    /* However, we also have                  */
+    /*                                        */
+    /*   dP/dx(u) = 0                       , */
+    /*                                        */
+    /* which implies by subtraction that      */
+    /*                                        */
+    /*   P(u) = b*u^2 + 2c*u + d            . */
+
+    if ( u > 0 && u < 0x10000L )
+    {
+      uu = FT_MulFix( u, u );
+      y  = d + FT_MulFix( c, 2*u ) + FT_MulFix( b, uu );
+
+      if ( y < *min ) *min = y;
+      if ( y > *max ) *max = y;
+    }
+  }
+
+
+  static void
+  BBox_Cubic_Check( FT_Pos   y1,
+                    FT_Pos   y2,
+                    FT_Pos   y3,
+                    FT_Pos   y4,
+                    FT_Pos*  min,
+                    FT_Pos*  max )
+  {
+    /* always compare first and last points */
+    if      ( y1 < *min )  *min = y1;
+    else if ( y1 > *max )  *max = y1;
+
+    if      ( y4 < *min )  *min = y4;
+    else if ( y4 > *max )  *max = y4;
+
+    /* now, try to see if there are split points here */
+    if ( y1 <= y4 )
+    {
+      /* flat or ascending arc test */
+      if ( y1 <= y2 && y2 <= y4 && y1 <= y3 && y3 <= y4 )
+        return;
+    }
+    else /* y1 > y4 */
+    {
+      /* descending arc test */
+      if ( y1 >= y2 && y2 >= y4 && y1 >= y3 && y3 >= y4 )
+        return;
+    }
+
+    /* There are some split points.  Find them.                        */
+    /* We already made sure that a, b, and c below cannot be all zero. */
+    {
+      FT_Pos    a = y4 - 3*y3 + 3*y2 - y1;
+      FT_Pos    b = y3 - 2*y2 + y1;
+      FT_Pos    c = y2 - y1;
+      FT_Pos    d;
+      FT_Fixed  t;
+      FT_Int    shift;
+
+
+      /* We need to solve `ax^2+2bx+c' here, without floating points!      */
+      /* The trick is to normalize to a different representation in order  */
+      /* to use our 16.16 fixed-point routines.                            */
+      /*                                                                   */
+      /* We compute FT_MulFix(b,b) and FT_MulFix(a,c) after normalization. */
+      /* These values must fit into a single 16.16 value.                  */
+      /*                                                                   */
+      /* We normalize a, b, and c to `8.16' fixed-point values to ensure   */
+      /* that their product is held in a `16.16' value including the sign. */
+      /* Necessarily, we need to shift `a', `b', and `c' so that the most  */
+      /* significant bit of their absolute values is at position 22.       */
+      /*                                                                   */
+      /* This also means that we are using 23 bits of precision to compute */
+      /* the zeros, independently of the range of the original polynomial  */
+      /* coefficients.                                                     */
+      /*                                                                   */
+      /* This algorithm should ensure reasonably accurate values for the   */
+      /* zeros.  Note that they are only expressed with 16 bits when       */
+      /* computing the extrema (the zeros need to be in 0..1 exclusive     */
+      /* to be considered part of the arc).                                */
+
+      shift = FT_MSB( FT_ABS( a ) | FT_ABS( b ) | FT_ABS( c ) );
+
+      if ( shift > 22 )
+      {
+        shift -= 22;
+
+        /* this loses some bits of precision, but we use 23 of them */
+        /* for the computation anyway                               */
+        a >>= shift;
+        b >>= shift;
+        c >>= shift;
+      }
+      else
+      {
+        shift = 22 - shift;
+
+        a <<= shift;
+        b <<= shift;
+        c <<= shift;
+      }
+
+      /* handle a == 0 */
+      if ( a == 0 )
+      {
+        if ( b != 0 )
+        {
+          t = - FT_DivFix( c, b ) / 2;
+          test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+        }
+      }
+      else
+      {
+        /* solve the equation now */
+        d = FT_MulFix( b, b ) - FT_MulFix( a, c );
+        if ( d < 0 )
+          return;
+
+        if ( d == 0 )
+        {
+          /* there is a single split point at -b/a */
+          t = - FT_DivFix( b, a );
+          test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+        }
+        else
+        {
+          /* there are two solutions; we need to filter them */
+          d = FT_SqrtFixed( (FT_Int32)d );
+          t = - FT_DivFix( b - d, a );
+          test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+
+          t = - FT_DivFix( b + d, a );
+          test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+        }
+      }
+    }
+  }
+
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    BBox_Cubic_To                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used as a `cubic_to' emitter during               */
+  /*    FT_Outline_Decompose().  It checks a cubic Bezier curve with the   */
+  /*    current bounding box, and computes its extrema if necessary to     */
+  /*    update it.                                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    control1 :: A pointer to the first control point.                  */
+  /*                                                                       */
+  /*    control2 :: A pointer to the second control point.                 */
+  /*                                                                       */
+  /*    to       :: A pointer to the destination vector.                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    user     :: The address of the current walk context.               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Always 0.  Needed for the interface only.                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    In the case of a non-monotonous arc, we don't compute directly     */
+  /*    extremum coordinates, we subdivide instead.                        */
+  /*                                                                       */
+  static int
+  BBox_Cubic_To( FT_Vector*  control1,
+                 FT_Vector*  control2,
+                 FT_Vector*  to,
+                 TBBox_Rec*  user )
+  {
+    /* we don't need to check `to' since it is always an `on' point, thus */
+    /* within the bbox                                                    */
+
+    if ( CHECK_X( control1, user->bbox ) ||
+         CHECK_X( control2, user->bbox ) )
+      BBox_Cubic_Check( user->last.x,
+                        control1->x,
+                        control2->x,
+                        to->x,
+                        &user->bbox.xMin,
+                        &user->bbox.xMax );
+
+    if ( CHECK_Y( control1, user->bbox ) ||
+         CHECK_Y( control2, user->bbox ) )
+      BBox_Cubic_Check( user->last.y,
+                        control1->y,
+                        control2->y,
+                        to->y,
+                        &user->bbox.yMin,
+                        &user->bbox.yMax );
+
+    user->last = *to;
+
+    return 0;
+  }
+
+FT_DEFINE_OUTLINE_FUNCS(bbox_interface,
+    (FT_Outline_MoveTo_Func) BBox_Move_To,
+    (FT_Outline_LineTo_Func) BBox_Move_To,
+    (FT_Outline_ConicTo_Func)BBox_Conic_To,
+    (FT_Outline_CubicTo_Func)BBox_Cubic_To,
+    0, 0
+  )
+
+  /* documentation is in ftbbox.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Get_BBox( FT_Outline*  outline,
+                       FT_BBox     *abbox )
+  {
+    FT_BBox     cbox;
+    FT_BBox     bbox;
+    FT_Vector*  vec;
+    FT_UShort   n;
+
+
+    if ( !abbox )
+      return FT_THROW( Invalid_Argument );
+
+    if ( !outline )
+      return FT_THROW( Invalid_Outline );
+
+    /* if outline is empty, return (0,0,0,0) */
+    if ( outline->n_points == 0 || outline->n_contours <= 0 )
+    {
+      abbox->xMin = abbox->xMax = 0;
+      abbox->yMin = abbox->yMax = 0;
+      return 0;
+    }
+
+    /* We compute the control box as well as the bounding box of  */
+    /* all `on' points in the outline.  Then, if the two boxes    */
+    /* coincide, we exit immediately.                             */
+
+    vec = outline->points;
+    bbox.xMin = bbox.xMax = cbox.xMin = cbox.xMax = vec->x;
+    bbox.yMin = bbox.yMax = cbox.yMin = cbox.yMax = vec->y;
+    vec++;
+
+    for ( n = 1; n < outline->n_points; n++ )
+    {
+      FT_Pos  x = vec->x;
+      FT_Pos  y = vec->y;
+
+
+      /* update control box */
+      if ( x < cbox.xMin ) cbox.xMin = x;
+      if ( x > cbox.xMax ) cbox.xMax = x;
+
+      if ( y < cbox.yMin ) cbox.yMin = y;
+      if ( y > cbox.yMax ) cbox.yMax = y;
+
+      if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON )
+      {
+        /* update bbox for `on' points only */
+        if ( x < bbox.xMin ) bbox.xMin = x;
+        if ( x > bbox.xMax ) bbox.xMax = x;
+
+        if ( y < bbox.yMin ) bbox.yMin = y;
+        if ( y > bbox.yMax ) bbox.yMax = y;
+      }
+
+      vec++;
+    }
+
+    /* test two boxes for equality */
+    if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax ||
+         cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax )
+    {
+      /* the two boxes are different, now walk over the outline to */
+      /* get the Bezier arc extrema.                               */
+
+      FT_Error   error;
+      TBBox_Rec  user;
+
+#ifdef FT_CONFIG_OPTION_PIC
+      FT_Outline_Funcs bbox_interface;
+      Init_Class_bbox_interface(&bbox_interface);
+#endif
+
+      user.bbox = bbox;
+
+      error = FT_Outline_Decompose( outline, &bbox_interface, &user );
+      if ( error )
+        return error;
+
+      *abbox = user.bbox;
+    }
+    else
+      *abbox = bbox;
+
+    return FT_Err_Ok;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbdf.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbdf.c
new file mode 100644
index 0000000..60bc5fc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbdf.c
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbdf.c                                                                */
+/*                                                                         */
+/*    FreeType API for accessing BDF-specific strings (body).              */
+/*                                                                         */
+/*  Copyright 2002-2004, 2013 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svbdf.h"
+
+
+  /* documentation is in ftbdf.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_BDF_Charset_ID( FT_Face       face,
+                         const char*  *acharset_encoding,
+                         const char*  *acharset_registry )
+  {
+    FT_Error     error;
+    const char*  encoding = NULL;
+    const char*  registry = NULL;
+
+
+    error = FT_ERR( Invalid_Argument );
+
+    if ( face )
+    {
+      FT_Service_BDF  service;
+
+
+      FT_FACE_FIND_SERVICE( face, service, BDF );
+
+      if ( service && service->get_charset_id )
+        error = service->get_charset_id( face, &encoding, &registry );
+    }
+
+    if ( acharset_encoding )
+      *acharset_encoding = encoding;
+
+    if ( acharset_registry )
+      *acharset_registry = registry;
+
+    return error;
+  }
+
+
+  /* documentation is in ftbdf.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_BDF_Property( FT_Face           face,
+                       const char*       prop_name,
+                       BDF_PropertyRec  *aproperty )
+  {
+    FT_Error  error;
+
+
+    error = FT_ERR( Invalid_Argument );
+
+    aproperty->type = BDF_PROPERTY_TYPE_NONE;
+
+    if ( face )
+    {
+      FT_Service_BDF  service;
+
+
+      FT_FACE_FIND_SERVICE( face, service, BDF );
+
+      if ( service && service->get_property )
+        error = service->get_property( face, prop_name, aproperty );
+    }
+
+    return  error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcalc.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcalc.c
new file mode 100644
index 0000000..0c773cf
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcalc.c
@@ -0,0 +1,972 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcalc.c                                                               */
+/*                                                                         */
+/*    Arithmetic computations (body).                                      */
+/*                                                                         */
+/*  Copyright 1996-2006, 2008, 2012-2013 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Support for 1-complement arithmetic has been totally dropped in this  */
+  /* release.  You can still write your own code if you need it.           */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Implementing basic computation routines.                              */
+  /*                                                                       */
+  /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(),   */
+  /* and FT_FloorFix() are declared in freetype.h.                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftglyph.h"
+#include "../../include/freetype/fttrigon.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+/* we need to emulate a 64-bit data type if a real one isn't available */
+
+#ifndef FT_LONG64
+
+  typedef struct  FT_Int64_
+  {
+    FT_UInt32  lo;
+    FT_UInt32  hi;
+
+  } FT_Int64;
+
+#endif /* !FT_LONG64 */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_calc
+
+
+  /* The following three functions are available regardless of whether */
+  /* FT_LONG64 is defined.                                             */
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_RoundFix( FT_Fixed  a )
+  {
+    return ( a >= 0 ) ?   ( a + 0x8000L ) & ~0xFFFFL
+                      : -((-a + 0x8000L ) & ~0xFFFFL );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_CeilFix( FT_Fixed  a )
+  {
+    return ( a >= 0 ) ?   ( a + 0xFFFFL ) & ~0xFFFFL
+                      : -((-a + 0xFFFFL ) & ~0xFFFFL );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_FloorFix( FT_Fixed  a )
+  {
+    return ( a >= 0 ) ?   a & ~0xFFFFL
+                      : -((-a) & ~0xFFFFL );
+  }
+
+
+  FT_BASE_DEF ( FT_Int )
+  FT_MSB( FT_UInt32 z )
+  {
+    FT_Int shift = 0;
+
+    /* determine msb bit index in `shift' */
+    if ( z >= ( 1L << 16 ) )
+    {
+      z     >>= 16;
+      shift  += 16;
+    }
+    if ( z >= ( 1L << 8 ) )
+    {
+      z     >>= 8;
+      shift  += 8;
+    }
+    if ( z >= ( 1L << 4 ) )
+    {
+      z     >>= 4;
+      shift  += 4;
+    }
+    if ( z >= ( 1L << 2 ) )
+    {
+      z     >>= 2;
+      shift  += 2;
+    }
+    if ( z >= ( 1L << 1 ) )
+    {
+      z     >>= 1;
+      shift  += 1;
+    }
+
+    return shift;
+  }
+
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( FT_Fixed )
+  FT_Hypot( FT_Fixed  x,
+            FT_Fixed  y )
+  {
+    FT_Vector  v;
+
+
+    v.x = x;
+    v.y = y;
+
+    return FT_Vector_Length( &v );
+  }
+
+
+#ifdef FT_LONG64
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_MulDiv( FT_Long  a,
+             FT_Long  b,
+             FT_Long  c )
+  {
+    FT_Int   s;
+    FT_Long  d;
+
+
+    s = 1;
+    if ( a < 0 ) { a = -a; s = -1; }
+    if ( b < 0 ) { b = -b; s = -s; }
+    if ( c < 0 ) { c = -c; s = -s; }
+
+    d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c
+                         : 0x7FFFFFFFL );
+
+    return ( s > 0 ) ? d : -d;
+  }
+
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( FT_Long )
+  FT_MulDiv_No_Round( FT_Long  a,
+                      FT_Long  b,
+                      FT_Long  c )
+  {
+    FT_Int   s;
+    FT_Long  d;
+
+
+    s = 1;
+    if ( a < 0 ) { a = -a; s = -1; }
+    if ( b < 0 ) { b = -b; s = -s; }
+    if ( c < 0 ) { c = -c; s = -s; }
+
+    d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c
+                         : 0x7FFFFFFFL );
+
+    return ( s > 0 ) ? d : -d;
+  }
+
+
+  /* documentation is in freetype.h */
+   /* if defined FT_MULFIX_INLINED, use the inline FT_MULFIX_ASSEMBLER function. */
+#ifndef FT_MULFIX_INLINED
+  FT_EXPORT_DEF( FT_Long )
+  FT_MulFix( FT_Long  a,
+             FT_Long  b )
+  {
+#ifdef FT_MULFIX_ASSEMBLER
+
+    return FT_MULFIX_ASSEMBLER( a, b );
+
+#else
+
+    FT_Int   s = 1;
+    FT_Long  c;
+
+
+    if ( a < 0 )
+    {
+      a = -a;
+      s = -1;
+    }
+
+    if ( b < 0 )
+    {
+      b = -b;
+      s = -s;
+    }
+
+    c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 );
+
+    return ( s > 0 ) ? c : -c;
+
+#endif /* FT_MULFIX_ASSEMBLER */
+  }
+  #endif/* FT_MULFIX_INLINED */
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_DivFix( FT_Long  a,
+             FT_Long  b )
+  {
+    FT_Int32   s;
+    FT_UInt32  q;
+
+
+    s = 1;
+    if ( a < 0 )
+    {
+      a = -a;
+      s = -1;
+    }
+    if ( b < 0 )
+    {
+      b = -b;
+      s = -s;
+    }
+
+    if ( b == 0 )
+      /* check for division by 0 */
+      q = 0x7FFFFFFFL;
+    else
+      /* compute result directly */
+      q = (FT_UInt32)( ( ( (FT_UInt64)a << 16 ) + ( b >> 1 ) ) / b );
+
+    return ( s < 0 ? -(FT_Long)q : (FT_Long)q );
+  }
+
+
+#else /* !FT_LONG64 */
+
+
+  static void
+  ft_multo64( FT_UInt32  x,
+              FT_UInt32  y,
+              FT_Int64  *z )
+  {
+    FT_UInt32  lo1, hi1, lo2, hi2, lo, hi, i1, i2;
+
+
+    lo1 = x & 0x0000FFFFU;  hi1 = x >> 16;
+    lo2 = y & 0x0000FFFFU;  hi2 = y >> 16;
+
+    lo = lo1 * lo2;
+    i1 = lo1 * hi2;
+    i2 = lo2 * hi1;
+    hi = hi1 * hi2;
+
+    /* Check carry overflow of i1 + i2 */
+    i1 += i2;
+    hi += (FT_UInt32)( i1 < i2 ) << 16;
+
+    hi += i1 >> 16;
+    i1  = i1 << 16;
+
+    /* Check carry overflow of i1 + lo */
+    lo += i1;
+    hi += ( lo < i1 );
+
+    z->lo = lo;
+    z->hi = hi;
+  }
+
+
+  static FT_UInt32
+  ft_div64by32( FT_UInt32  hi,
+                FT_UInt32  lo,
+                FT_UInt32  y )
+  {
+    FT_UInt32  r, q;
+    FT_Int     i;
+
+
+    q = 0;
+    r = hi;
+
+    if ( r >= y )
+      return (FT_UInt32)0x7FFFFFFFL;
+
+    i = 32;
+    do
+    {
+      r <<= 1;
+      q <<= 1;
+      r  |= lo >> 31;
+
+      if ( r >= y )
+      {
+        r -= y;
+        q |= 1;
+      }
+      lo <<= 1;
+    } while ( --i );
+
+    return q;
+  }
+
+
+  static void
+  FT_Add64( FT_Int64*  x,
+            FT_Int64*  y,
+            FT_Int64  *z )
+  {
+    register FT_UInt32  lo, hi;
+
+
+    lo = x->lo + y->lo;
+    hi = x->hi + y->hi + ( lo < x->lo );
+
+    z->lo = lo;
+    z->hi = hi;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  /* The FT_MulDiv function has been optimized thanks to ideas from      */
+  /* Graham Asher.  The trick is to optimize computation when everything */
+  /* fits within 32-bits (a rather common case).                         */
+  /*                                                                     */
+  /*  we compute 'a*b+c/2', then divide it by 'c'. (positive values)     */
+  /*                                                                     */
+  /*  46340 is FLOOR(SQRT(2^31-1)).                                      */
+  /*                                                                     */
+  /*  if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 )         */
+  /*                                                                     */
+  /*  0x7FFFFFFF - 0x7FFEA810 = 0x157F0                                  */
+  /*                                                                     */
+  /*  if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF )                */
+  /*                                                                     */
+  /*  and 2*0x157F0 = 176096                                             */
+  /*                                                                     */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_MulDiv( FT_Long  a,
+             FT_Long  b,
+             FT_Long  c )
+  {
+    long  s;
+
+
+    /* XXX: this function does not allow 64-bit arguments */
+    if ( a == 0 || b == c )
+      return a;
+
+    s  = a; a = FT_ABS( a );
+    s ^= b; b = FT_ABS( b );
+    s ^= c; c = FT_ABS( c );
+
+    if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 )
+      a = ( a * b + ( c >> 1 ) ) / c;
+
+    else if ( (FT_Int32)c > 0 )
+    {
+      FT_Int64  temp, temp2;
+
+
+      ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp );
+
+      temp2.hi = 0;
+      temp2.lo = (FT_UInt32)(c >> 1);
+      FT_Add64( &temp, &temp2, &temp );
+      a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c );
+    }
+    else
+      a = 0x7FFFFFFFL;
+
+    return ( s < 0 ? -a : a );
+  }
+
+
+  FT_BASE_DEF( FT_Long )
+  FT_MulDiv_No_Round( FT_Long  a,
+                      FT_Long  b,
+                      FT_Long  c )
+  {
+    long  s;
+
+
+    if ( a == 0 || b == c )
+      return a;
+
+    s  = a; a = FT_ABS( a );
+    s ^= b; b = FT_ABS( b );
+    s ^= c; c = FT_ABS( c );
+
+    if ( a <= 46340L && b <= 46340L && c > 0 )
+      a = a * b / c;
+
+    else if ( (FT_Int32)c > 0 )
+    {
+      FT_Int64  temp;
+
+
+      ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp );
+      a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c );
+    }
+    else
+      a = 0x7FFFFFFFL;
+
+    return ( s < 0 ? -a : a );
+  }
+
+
+  /* documentation is in freetype.h */
+  #ifndef FT_MULFIX_INLINED
+  FT_EXPORT_DEF( FT_Long )
+  FT_MulFix( FT_Long  a,
+             FT_Long  b )
+  {
+#ifdef FT_MULFIX_ASSEMBLER
+
+    return FT_MULFIX_ASSEMBLER( a, b );
+
+#elif 0
+
+    /*
+     *  This code is nonportable.  See comment below.
+     *
+     *  However, on a platform where right-shift of a signed quantity fills
+     *  the leftmost bits by copying the sign bit, it might be faster.
+     */
+
+    FT_Long   sa, sb;
+    FT_ULong  ua, ub;
+
+
+    if ( a == 0 || b == 0x10000L )
+      return a;
+
+    /*
+     *  This is a clever way of converting a signed number `a' into its
+     *  absolute value (stored back into `a') and its sign.  The sign is
+     *  stored in `sa'; 0 means `a' was positive or zero, and -1 means `a'
+     *  was negative.  (Similarly for `b' and `sb').
+     *
+     *  Unfortunately, it doesn't work (at least not portably).
+     *
+     *  It makes the assumption that right-shift on a negative signed value
+     *  fills the leftmost bits by copying the sign bit.  This is wrong.
+     *  According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206,
+     *  the result of right-shift of a negative signed value is
+     *  implementation-defined.  At least one implementation fills the
+     *  leftmost bits with 0s (i.e., it is exactly the same as an unsigned
+     *  right shift).  This means that when `a' is negative, `sa' ends up
+     *  with the value 1 rather than -1.  After that, everything else goes
+     *  wrong.
+     */
+    sa = ( a >> ( sizeof ( a ) * 8 - 1 ) );
+    a  = ( a ^ sa ) - sa;
+    sb = ( b >> ( sizeof ( b ) * 8 - 1 ) );
+    b  = ( b ^ sb ) - sb;
+
+    ua = (FT_ULong)a;
+    ub = (FT_ULong)b;
+
+    if ( ua <= 2048 && ub <= 1048576L )
+      ua = ( ua * ub + 0x8000U ) >> 16;
+    else
+    {
+      FT_ULong  al = ua & 0xFFFFU;
+
+
+      ua = ( ua >> 16 ) * ub +  al * ( ub >> 16 ) +
+           ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 );
+    }
+
+    sa ^= sb,
+    ua  = (FT_ULong)(( ua ^ sa ) - sa);
+
+    return (FT_Long)ua;
+
+#else /* 0 */
+
+    FT_Long   s;
+    FT_ULong  ua, ub;
+
+
+    if ( a == 0 || b == 0x10000L )
+      return a;
+
+    s  = a; a = FT_ABS( a );
+    s ^= b; b = FT_ABS( b );
+
+    ua = (FT_ULong)a;
+    ub = (FT_ULong)b;
+
+    if ( ua <= 2048 && ub <= 1048576L )
+      ua = ( ua * ub + 0x8000UL ) >> 16;
+    else
+    {
+      FT_ULong  al = ua & 0xFFFFUL;
+
+
+      ua = ( ua >> 16 ) * ub +  al * ( ub >> 16 ) +
+           ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 );
+    }
+
+    return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua );
+
+#endif /* 0 */
+
+  }
+#endif
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_DivFix( FT_Long  a,
+             FT_Long  b )
+  {
+    FT_Int32   s;
+    FT_UInt32  q;
+
+
+    /* XXX: this function does not allow 64-bit arguments */
+    s  = (FT_Int32)a; a = FT_ABS( a );
+    s ^= (FT_Int32)b; b = FT_ABS( b );
+
+    if ( (FT_UInt32)b == 0 )
+    {
+      /* check for division by 0 */
+      q = (FT_UInt32)0x7FFFFFFFL;
+    }
+    else if ( ( a >> 16 ) == 0 )
+    {
+      /* compute result directly */
+      q = (FT_UInt32)( ( (FT_ULong)a << 16 ) + ( b >> 1 ) ) / (FT_UInt32)b;
+    }
+    else
+    {
+      /* we need more bits; we have to do it by hand */
+      FT_Int64  temp, temp2;
+
+
+      temp.hi  = (FT_Int32)( a >> 16 );
+      temp.lo  = (FT_UInt32)a << 16;
+      temp2.hi = 0;
+      temp2.lo = (FT_UInt32)( b >> 1 );
+      FT_Add64( &temp, &temp2, &temp );
+      q = ft_div64by32( temp.hi, temp.lo, (FT_Int32)b );
+    }
+
+    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+  }
+
+
+#if 0
+
+  /* documentation is in ftcalc.h */
+
+  FT_EXPORT_DEF( void )
+  FT_MulTo64( FT_Int32   x,
+              FT_Int32   y,
+              FT_Int64  *z )
+  {
+    FT_Int32  s;
+
+
+    s  = x; x = FT_ABS( x );
+    s ^= y; y = FT_ABS( y );
+
+    ft_multo64( x, y, z );
+
+    if ( s < 0 )
+    {
+      z->lo = (FT_UInt32)-(FT_Int32)z->lo;
+      z->hi = ~z->hi + !( z->lo );
+    }
+  }
+
+
+  /* apparently, the second version of this code is not compiled correctly */
+  /* on Mac machines with the MPW C compiler..  tsk, tsk, tsk...           */
+
+#if 1
+
+  FT_EXPORT_DEF( FT_Int32 )
+  FT_Div64by32( FT_Int64*  x,
+                FT_Int32   y )
+  {
+    FT_Int32   s;
+    FT_UInt32  q, r, i, lo;
+
+
+    s  = x->hi;
+    if ( s < 0 )
+    {
+      x->lo = (FT_UInt32)-(FT_Int32)x->lo;
+      x->hi = ~x->hi + !x->lo;
+    }
+    s ^= y;  y = FT_ABS( y );
+
+    /* Shortcut */
+    if ( x->hi == 0 )
+    {
+      if ( y > 0 )
+        q = x->lo / y;
+      else
+        q = 0x7FFFFFFFL;
+
+      return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+    }
+
+    r  = x->hi;
+    lo = x->lo;
+
+    if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */
+      return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL );
+                             /* Return Max/Min Int32 if division overflow. */
+                             /* This includes division by zero!            */
+    q = 0;
+    for ( i = 0; i < 32; i++ )
+    {
+      r <<= 1;
+      q <<= 1;
+      r  |= lo >> 31;
+
+      if ( r >= (FT_UInt32)y )
+      {
+        r -= y;
+        q |= 1;
+      }
+      lo <<= 1;
+    }
+
+    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+  }
+
+#else /* 0 */
+
+  FT_EXPORT_DEF( FT_Int32 )
+  FT_Div64by32( FT_Int64*  x,
+                FT_Int32   y )
+  {
+    FT_Int32   s;
+    FT_UInt32  q;
+
+
+    s  = x->hi;
+    if ( s < 0 )
+    {
+      x->lo = (FT_UInt32)-(FT_Int32)x->lo;
+      x->hi = ~x->hi + !x->lo;
+    }
+    s ^= y;  y = FT_ABS( y );
+
+    /* Shortcut */
+    if ( x->hi == 0 )
+    {
+      if ( y > 0 )
+        q = ( x->lo + ( y >> 1 ) ) / y;
+      else
+        q = 0x7FFFFFFFL;
+
+      return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+    }
+
+    q = ft_div64by32( x->hi, x->lo, y );
+
+    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+  }
+
+#endif /* 0 */
+
+#endif /* 0 */
+
+
+#endif /* FT_LONG64 */
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Matrix_Multiply( const FT_Matrix*  a,
+                      FT_Matrix        *b )
+  {
+    FT_Fixed  xx, xy, yx, yy;
+
+
+    if ( !a || !b )
+      return;
+
+    xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx );
+    xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy );
+    yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx );
+    yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy );
+
+    b->xx = xx;  b->xy = xy;
+    b->yx = yx;  b->yy = yy;
+  }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Matrix_Invert( FT_Matrix*  matrix )
+  {
+    FT_Pos  delta, xx, yy;
+
+
+    if ( !matrix )
+      return FT_THROW( Invalid_Argument );
+
+    /* compute discriminant */
+    delta = FT_MulFix( matrix->xx, matrix->yy ) -
+            FT_MulFix( matrix->xy, matrix->yx );
+
+    if ( !delta )
+      return FT_THROW( Invalid_Argument );  /* matrix can't be inverted */
+
+    matrix->xy = - FT_DivFix( matrix->xy, delta );
+    matrix->yx = - FT_DivFix( matrix->yx, delta );
+
+    xx = matrix->xx;
+    yy = matrix->yy;
+
+    matrix->xx = FT_DivFix( yy, delta );
+    matrix->yy = FT_DivFix( xx, delta );
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( void )
+  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,
+                             FT_Matrix        *b,
+                             FT_Long           scaling )
+  {
+    FT_Fixed  xx, xy, yx, yy;
+
+    FT_Long   val = 0x10000L * scaling;
+
+
+    if ( !a || !b )
+      return;
+
+    xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val );
+    xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val );
+    yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val );
+    yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val );
+
+    b->xx = xx;  b->xy = xy;
+    b->yx = yx;  b->yy = yy;
+  }
+
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( void )
+  FT_Vector_Transform_Scaled( FT_Vector*        vector,
+                              const FT_Matrix*  matrix,
+                              FT_Long           scaling )
+  {
+    FT_Pos   xz, yz;
+
+    FT_Long  val = 0x10000L * scaling;
+
+
+    if ( !vector || !matrix )
+      return;
+
+    xz = FT_MulDiv( vector->x, matrix->xx, val ) +
+         FT_MulDiv( vector->y, matrix->xy, val );
+
+    yz = FT_MulDiv( vector->x, matrix->yx, val ) +
+         FT_MulDiv( vector->y, matrix->yy, val );
+
+    vector->x = xz;
+    vector->y = yz;
+  }
+
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( FT_Int32 )
+  FT_SqrtFixed( FT_Int32  x )
+  {
+    FT_UInt32  root, rem_hi, rem_lo, test_div;
+    FT_Int     count;
+
+
+    root = 0;
+
+    if ( x > 0 )
+    {
+      rem_hi = 0;
+      rem_lo = x;
+      count  = 24;
+      do
+      {
+        rem_hi   = ( rem_hi << 2 ) | ( rem_lo >> 30 );
+        rem_lo <<= 2;
+        root   <<= 1;
+        test_div = ( root << 1 ) + 1;
+
+        if ( rem_hi >= test_div )
+        {
+          rem_hi -= test_div;
+          root   += 1;
+        }
+      } while ( --count );
+    }
+
+    return (FT_Int32)root;
+  }
+
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( FT_Int )
+  ft_corner_orientation( FT_Pos  in_x,
+                         FT_Pos  in_y,
+                         FT_Pos  out_x,
+                         FT_Pos  out_y )
+  {
+    FT_Long  result; /* avoid overflow on 16-bit system */
+
+
+    /* deal with the trivial cases quickly */
+    if ( in_y == 0 )
+    {
+      if ( in_x >= 0 )
+        result = out_y;
+      else
+        result = -out_y;
+    }
+    else if ( in_x == 0 )
+    {
+      if ( in_y >= 0 )
+        result = -out_x;
+      else
+        result = out_x;
+    }
+    else if ( out_y == 0 )
+    {
+      if ( out_x >= 0 )
+        result = in_y;
+      else
+        result = -in_y;
+    }
+    else if ( out_x == 0 )
+    {
+      if ( out_y >= 0 )
+        result = -in_x;
+      else
+        result =  in_x;
+    }
+    else /* general case */
+    {
+#ifdef FT_LONG64
+
+      FT_Int64  delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;
+
+
+      if ( delta == 0 )
+        result = 0;
+      else
+        result = 1 - 2 * ( delta < 0 );
+
+#else
+
+      FT_Int64  z1, z2;
+
+
+      /* XXX: this function does not allow 64-bit arguments */
+      ft_multo64( (FT_Int32)in_x, (FT_Int32)out_y, &z1 );
+      ft_multo64( (FT_Int32)in_y, (FT_Int32)out_x, &z2 );
+
+      if ( z1.hi > z2.hi )
+        result = +1;
+      else if ( z1.hi < z2.hi )
+        result = -1;
+      else if ( z1.lo > z2.lo )
+        result = +1;
+      else if ( z1.lo < z2.lo )
+        result = -1;
+      else
+        result = 0;
+
+#endif
+    }
+
+    /* XXX: only the sign of return value, +1/0/-1 must be used */
+    return (FT_Int)result;
+  }
+
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( FT_Int )
+  ft_corner_is_flat( FT_Pos  in_x,
+                     FT_Pos  in_y,
+                     FT_Pos  out_x,
+                     FT_Pos  out_y )
+  {
+    FT_Pos  ax = in_x;
+    FT_Pos  ay = in_y;
+
+    FT_Pos  d_in, d_out, d_corner;
+
+
+    if ( ax < 0 )
+      ax = -ax;
+    if ( ay < 0 )
+      ay = -ay;
+    d_in = ax + ay;
+
+    ax = out_x;
+    if ( ax < 0 )
+      ax = -ax;
+    ay = out_y;
+    if ( ay < 0 )
+      ay = -ay;
+    d_out = ax + ay;
+
+    ax = out_x + in_x;
+    if ( ax < 0 )
+      ax = -ax;
+    ay = out_y + in_y;
+    if ( ay < 0 )
+      ay = -ay;
+    d_corner = ax + ay;
+
+    return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcid.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcid.c
new file mode 100644
index 0000000..d9817a4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcid.c
@@ -0,0 +1,117 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcid.c                                                                */
+/*                                                                         */
+/*    FreeType API for accessing CID font information.                     */
+/*                                                                         */
+/*  Copyright 2007, 2009, 2013 by Derek Clegg, Michael Toftdal.            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftcid.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svcid.h"
+
+
+  /* documentation is in ftcid.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,
+                                           const char*  *registry,
+                                           const char*  *ordering,
+                                           FT_Int       *supplement)
+  {
+    FT_Error     error;
+    const char*  r = NULL;
+    const char*  o = NULL;
+    FT_Int       s = 0;
+
+
+    error = FT_ERR( Invalid_Argument );
+
+    if ( face )
+    {
+      FT_Service_CID  service;
+
+
+      FT_FACE_FIND_SERVICE( face, service, CID );
+
+      if ( service && service->get_ros )
+        error = service->get_ros( face, &r, &o, &s );
+    }
+
+    if ( registry )
+      *registry = r;
+
+    if ( ordering )
+      *ordering = o;
+
+    if ( supplement )
+      *supplement = s;
+
+    return error;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,
+                                      FT_Bool  *is_cid )
+  {
+    FT_Error  error = FT_ERR( Invalid_Argument );
+    FT_Bool   ic = 0;
+
+
+    if ( face )
+    {
+      FT_Service_CID  service;
+
+
+      FT_FACE_FIND_SERVICE( face, service, CID );
+
+      if ( service && service->get_is_cid )
+        error = service->get_is_cid( face, &ic);
+    }
+
+    if ( is_cid )
+      *is_cid = ic;
+
+    return error;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_CID_From_Glyph_Index( FT_Face   face,
+                               FT_UInt   glyph_index,
+                               FT_UInt  *cid )
+  {
+    FT_Error  error = FT_ERR( Invalid_Argument );
+    FT_UInt   c = 0;
+
+
+    if ( face )
+    {
+      FT_Service_CID  service;
+
+
+      FT_FACE_FIND_SERVICE( face, service, CID );
+
+      if ( service && service->get_cid_from_glyph_index )
+        error = service->get_cid_from_glyph_index( face, glyph_index, &c);
+    }
+
+    if ( cid )
+      *cid = c;
+
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdbgmem.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdbgmem.c
new file mode 100644
index 0000000..55f5937
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdbgmem.c
@@ -0,0 +1,992 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdbgmem.c                                                             */
+/*                                                                         */
+/*    Memory debugger (body).                                              */
+/*                                                                         */
+/*  Copyright 2001-2006, 2009, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftmemory.h"
+#include "../../include/freetype/ftsystem.h"
+#include "../../include/freetype/fterrors.h"
+#include "../../include/freetype/fttypes.h"
+
+
+#ifdef FT_DEBUG_MEMORY
+
+#define  KEEPALIVE /* `Keep alive' means that freed blocks aren't released
+                    * to the heap.  This is useful to detect double-frees
+                    * or weird heap corruption, but it uses large amounts of
+                    * memory, however.
+                    */
+
+#include "../../include/freetype/config/ftstdlib.h"
+
+  FT_BASE_DEF( const char* )  _ft_debug_file   = 0;
+  FT_BASE_DEF( long )         _ft_debug_lineno = 0;
+
+  extern void
+  FT_DumpMemory( FT_Memory  memory );
+
+
+  typedef struct FT_MemSourceRec_*  FT_MemSource;
+  typedef struct FT_MemNodeRec_*    FT_MemNode;
+  typedef struct FT_MemTableRec_*   FT_MemTable;
+
+
+#define FT_MEM_VAL( addr )  ((FT_PtrDist)(FT_Pointer)( addr ))
+
+  /*
+   *  This structure holds statistics for a single allocation/release
+   *  site.  This is useful to know where memory operations happen the
+   *  most.
+   */
+  typedef struct  FT_MemSourceRec_
+  {
+    const char*   file_name;
+    long          line_no;
+
+    FT_Long       cur_blocks;   /* current number of allocated blocks */
+    FT_Long       max_blocks;   /* max. number of allocated blocks    */
+    FT_Long       all_blocks;   /* total number of blocks allocated   */
+
+    FT_Long       cur_size;     /* current cumulative allocated size */
+    FT_Long       max_size;     /* maximum cumulative allocated size */
+    FT_Long       all_size;     /* total cumulative allocated size   */
+
+    FT_Long       cur_max;      /* current maximum allocated size */
+
+    FT_UInt32     hash;
+    FT_MemSource  link;
+
+  } FT_MemSourceRec;
+
+
+  /*
+   *  We don't need a resizable array for the memory sources, because
+   *  their number is pretty limited within FreeType.
+   */
+#define FT_MEM_SOURCE_BUCKETS  128
+
+  /*
+   *  This structure holds information related to a single allocated
+   *  memory block.  If KEEPALIVE is defined, blocks that are freed by
+   *  FreeType are never released to the system.  Instead, their `size'
+   *  field is set to -size.  This is mainly useful to detect double frees,
+   *  at the price of large memory footprint during execution.
+   */
+  typedef struct  FT_MemNodeRec_
+  {
+    FT_Byte*      address;
+    FT_Long       size;     /* < 0 if the block was freed */
+
+    FT_MemSource  source;
+
+#ifdef KEEPALIVE
+    const char*   free_file_name;
+    FT_Long       free_line_no;
+#endif
+
+    FT_MemNode    link;
+
+  } FT_MemNodeRec;
+
+
+  /*
+   *  The global structure, containing compound statistics and all hash
+   *  tables.
+   */
+  typedef struct  FT_MemTableRec_
+  {
+    FT_ULong         size;
+    FT_ULong         nodes;
+    FT_MemNode*      buckets;
+
+    FT_ULong         alloc_total;
+    FT_ULong         alloc_current;
+    FT_ULong         alloc_max;
+    FT_ULong         alloc_count;
+
+    FT_Bool          bound_total;
+    FT_ULong         alloc_total_max;
+
+    FT_Bool          bound_count;
+    FT_ULong         alloc_count_max;
+
+    FT_MemSource     sources[FT_MEM_SOURCE_BUCKETS];
+
+    FT_Bool          keep_alive;
+
+    FT_Memory        memory;
+    FT_Pointer       memory_user;
+    FT_Alloc_Func    alloc;
+    FT_Free_Func     free;
+    FT_Realloc_Func  realloc;
+
+  } FT_MemTableRec;
+
+
+#define FT_MEM_SIZE_MIN  7
+#define FT_MEM_SIZE_MAX  13845163
+
+#define FT_FILENAME( x )  ((x) ? (x) : "unknown file")
+
+
+  /*
+   *  Prime numbers are ugly to handle.  It would be better to implement
+   *  L-Hashing, which is 10% faster and doesn't require divisions.
+   */
+  static const FT_UInt  ft_mem_primes[] =
+  {
+    7,
+    11,
+    19,
+    37,
+    73,
+    109,
+    163,
+    251,
+    367,
+    557,
+    823,
+    1237,
+    1861,
+    2777,
+    4177,
+    6247,
+    9371,
+    14057,
+    21089,
+    31627,
+    47431,
+    71143,
+    106721,
+    160073,
+    240101,
+    360163,
+    540217,
+    810343,
+    1215497,
+    1823231,
+    2734867,
+    4102283,
+    6153409,
+    9230113,
+    13845163,
+  };
+
+
+  static FT_ULong
+  ft_mem_closest_prime( FT_ULong  num )
+  {
+    FT_UInt  i;
+
+
+    for ( i = 0;
+          i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ )
+      if ( ft_mem_primes[i] > num )
+        return ft_mem_primes[i];
+
+    return FT_MEM_SIZE_MAX;
+  }
+
+
+  extern void
+  ft_mem_debug_panic( const char*  fmt,
+                      ... )
+  {
+    va_list  ap;
+
+
+    printf( "FreeType.Debug: " );
+
+    va_start( ap, fmt );
+    vprintf( fmt, ap );
+    va_end( ap );
+
+    printf( "\n" );
+    exit( EXIT_FAILURE );
+  }
+
+
+  static FT_Pointer
+  ft_mem_table_alloc( FT_MemTable  table,
+                      FT_Long      size )
+  {
+    FT_Memory   memory = table->memory;
+    FT_Pointer  block;
+
+
+    memory->user = table->memory_user;
+    block = table->alloc( memory, size );
+    memory->user = table;
+
+    return block;
+  }
+
+
+  static void
+  ft_mem_table_free( FT_MemTable  table,
+                     FT_Pointer   block )
+  {
+    FT_Memory  memory = table->memory;
+
+
+    memory->user = table->memory_user;
+    table->free( memory, block );
+    memory->user = table;
+  }
+
+
+  static void
+  ft_mem_table_resize( FT_MemTable  table )
+  {
+    FT_ULong  new_size;
+
+
+    new_size = ft_mem_closest_prime( table->nodes );
+    if ( new_size != table->size )
+    {
+      FT_MemNode*  new_buckets;
+      FT_ULong     i;
+
+
+      new_buckets = (FT_MemNode *)
+                      ft_mem_table_alloc( table,
+                                          new_size * sizeof ( FT_MemNode ) );
+      if ( new_buckets == NULL )
+        return;
+
+      FT_ARRAY_ZERO( new_buckets, new_size );
+
+      for ( i = 0; i < table->size; i++ )
+      {
+        FT_MemNode  node, next, *pnode;
+        FT_PtrDist  hash;
+
+
+        node = table->buckets[i];
+        while ( node )
+        {
+          next  = node->link;
+          hash  = FT_MEM_VAL( node->address ) % new_size;
+          pnode = new_buckets + hash;
+
+          node->link = pnode[0];
+          pnode[0]   = node;
+
+          node = next;
+        }
+      }
+
+      if ( table->buckets )
+        ft_mem_table_free( table, table->buckets );
+
+      table->buckets = new_buckets;
+      table->size    = new_size;
+    }
+  }
+
+
+  static FT_MemTable
+  ft_mem_table_new( FT_Memory  memory )
+  {
+    FT_MemTable  table;
+
+
+    table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) );
+    if ( table == NULL )
+      goto Exit;
+
+    FT_ZERO( table );
+
+    table->size  = FT_MEM_SIZE_MIN;
+    table->nodes = 0;
+
+    table->memory = memory;
+
+    table->memory_user = memory->user;
+
+    table->alloc   = memory->alloc;
+    table->realloc = memory->realloc;
+    table->free    = memory->free;
+
+    table->buckets = (FT_MemNode *)
+                       memory->alloc( memory,
+                                      table->size * sizeof ( FT_MemNode ) );
+    if ( table->buckets )
+      FT_ARRAY_ZERO( table->buckets, table->size );
+    else
+    {
+      memory->free( memory, table );
+      table = NULL;
+    }
+
+  Exit:
+    return table;
+  }
+
+
+  static void
+  ft_mem_table_destroy( FT_MemTable  table )
+  {
+    FT_ULong  i;
+    FT_Long   leak_count = 0;
+    FT_ULong  leaks      = 0;
+
+
+    FT_DumpMemory( table->memory );
+
+    /* remove all blocks from the table, revealing leaked ones */
+    for ( i = 0; i < table->size; i++ )
+    {
+      FT_MemNode  *pnode = table->buckets + i, next, node = *pnode;
+
+
+      while ( node )
+      {
+        next       = node->link;
+        node->link = 0;
+
+        if ( node->size > 0 )
+        {
+          printf(
+            "leaked memory block at address %p, size %8ld in (%s:%ld)\n",
+            node->address, node->size,
+            FT_FILENAME( node->source->file_name ),
+            node->source->line_no );
+
+          leak_count++;
+          leaks += node->size;
+
+          ft_mem_table_free( table, node->address );
+        }
+
+        node->address = NULL;
+        node->size    = 0;
+
+        ft_mem_table_free( table, node );
+        node = next;
+      }
+      table->buckets[i] = 0;
+    }
+
+    ft_mem_table_free( table, table->buckets );
+    table->buckets = NULL;
+
+    table->size  = 0;
+    table->nodes = 0;
+
+    /* remove all sources */
+    for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ )
+    {
+      FT_MemSource  source, next;
+
+
+      for ( source = table->sources[i]; source != NULL; source = next )
+      {
+        next = source->link;
+        ft_mem_table_free( table, source );
+      }
+
+      table->sources[i] = NULL;
+    }
+
+    printf( "FreeType: total memory allocations = %ld\n",
+            table->alloc_total );
+    printf( "FreeType: maximum memory footprint = %ld\n",
+            table->alloc_max );
+
+    ft_mem_table_free( table, table );
+
+    if ( leak_count > 0 )
+      ft_mem_debug_panic(
+        "FreeType: %ld bytes of memory leaked in %ld blocks\n",
+        leaks, leak_count );
+
+    printf( "FreeType: no memory leaks detected\n" );
+  }
+
+
+  static FT_MemNode*
+  ft_mem_table_get_nodep( FT_MemTable  table,
+                          FT_Byte*     address )
+  {
+    FT_PtrDist   hash;
+    FT_MemNode  *pnode, node;
+
+
+    hash  = FT_MEM_VAL( address );
+    pnode = table->buckets + ( hash % table->size );
+
+    for (;;)
+    {
+      node = pnode[0];
+      if ( !node )
+        break;
+
+      if ( node->address == address )
+        break;
+
+      pnode = &node->link;
+    }
+    return pnode;
+  }
+
+
+  static FT_MemSource
+  ft_mem_table_get_source( FT_MemTable  table )
+  {
+    FT_UInt32     hash;
+    FT_MemSource  node, *pnode;
+
+
+    /* cast to FT_PtrDist first since void* can be larger */
+    /* than FT_UInt32 and GCC 4.1.1 emits a warning       */
+    hash  = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file +
+              (FT_UInt32)( 5 * _ft_debug_lineno );
+    pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS];
+
+    for ( ;; )
+    {
+      node = *pnode;
+      if ( node == NULL )
+        break;
+
+      if ( node->file_name == _ft_debug_file &&
+           node->line_no   == _ft_debug_lineno   )
+        goto Exit;
+
+      pnode = &node->link;
+    }
+
+    node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) );
+    if ( node == NULL )
+      ft_mem_debug_panic(
+        "not enough memory to perform memory debugging\n" );
+
+    node->file_name = _ft_debug_file;
+    node->line_no   = _ft_debug_lineno;
+
+    node->cur_blocks = 0;
+    node->max_blocks = 0;
+    node->all_blocks = 0;
+
+    node->cur_size   = 0;
+    node->max_size   = 0;
+    node->all_size   = 0;
+
+    node->cur_max    = 0;
+
+    node->link = NULL;
+    node->hash = hash;
+    *pnode     = node;
+
+  Exit:
+    return node;
+  }
+
+
+  static void
+  ft_mem_table_set( FT_MemTable  table,
+                    FT_Byte*     address,
+                    FT_ULong     size,
+                    FT_Long      delta )
+  {
+    FT_MemNode  *pnode, node;
+
+
+    if ( table )
+    {
+      FT_MemSource  source;
+
+
+      pnode = ft_mem_table_get_nodep( table, address );
+      node  = *pnode;
+      if ( node )
+      {
+        if ( node->size < 0 )
+        {
+          /* This block was already freed.  Our memory is now completely */
+          /* corrupted!                                                  */
+          /* This can only happen in keep-alive mode.                    */
+          ft_mem_debug_panic(
+            "memory heap corrupted (allocating freed block)" );
+        }
+        else
+        {
+          /* This block was already allocated.  This means that our memory */
+          /* is also corrupted!                                            */
+          ft_mem_debug_panic(
+            "memory heap corrupted (re-allocating allocated block at"
+            " %p, of size %ld)\n"
+            "org=%s:%d new=%s:%d\n",
+            node->address, node->size,
+            FT_FILENAME( node->source->file_name ), node->source->line_no,
+            FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );
+        }
+      }
+
+      /* we need to create a new node in this table */
+      node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) );
+      if ( node == NULL )
+        ft_mem_debug_panic( "not enough memory to run memory tests" );
+
+      node->address = address;
+      node->size    = size;
+      node->source  = source = ft_mem_table_get_source( table );
+
+      if ( delta == 0 )
+      {
+        /* this is an allocation */
+        source->all_blocks++;
+        source->cur_blocks++;
+        if ( source->cur_blocks > source->max_blocks )
+          source->max_blocks = source->cur_blocks;
+      }
+
+      if ( size > (FT_ULong)source->cur_max )
+        source->cur_max = size;
+
+      if ( delta != 0 )
+      {
+        /* we are growing or shrinking a reallocated block */
+        source->cur_size     += delta;
+        table->alloc_current += delta;
+      }
+      else
+      {
+        /* we are allocating a new block */
+        source->cur_size     += size;
+        table->alloc_current += size;
+      }
+
+      source->all_size += size;
+
+      if ( source->cur_size > source->max_size )
+        source->max_size = source->cur_size;
+
+      node->free_file_name = NULL;
+      node->free_line_no   = 0;
+
+      node->link = pnode[0];
+
+      pnode[0] = node;
+      table->nodes++;
+
+      table->alloc_total += size;
+
+      if ( table->alloc_current > table->alloc_max )
+        table->alloc_max = table->alloc_current;
+
+      if ( table->nodes * 3 < table->size  ||
+           table->size  * 3 < table->nodes )
+        ft_mem_table_resize( table );
+    }
+  }
+
+
+  static void
+  ft_mem_table_remove( FT_MemTable  table,
+                       FT_Byte*     address,
+                       FT_Long      delta )
+  {
+    if ( table )
+    {
+      FT_MemNode  *pnode, node;
+
+
+      pnode = ft_mem_table_get_nodep( table, address );
+      node  = *pnode;
+      if ( node )
+      {
+        FT_MemSource  source;
+
+
+        if ( node->size < 0 )
+          ft_mem_debug_panic(
+            "freeing memory block at %p more than once at (%s:%ld)\n"
+            "block allocated at (%s:%ld) and released at (%s:%ld)",
+            address,
+            FT_FILENAME( _ft_debug_file ), _ft_debug_lineno,
+            FT_FILENAME( node->source->file_name ), node->source->line_no,
+            FT_FILENAME( node->free_file_name ), node->free_line_no );
+
+        /* scramble the node's content for additional safety */
+        FT_MEM_SET( address, 0xF3, node->size );
+
+        if ( delta == 0 )
+        {
+          source = node->source;
+
+          source->cur_blocks--;
+          source->cur_size -= node->size;
+
+          table->alloc_current -= node->size;
+        }
+
+        if ( table->keep_alive )
+        {
+          /* we simply invert the node's size to indicate that the node */
+          /* was freed.                                                 */
+          node->size           = -node->size;
+          node->free_file_name = _ft_debug_file;
+          node->free_line_no   = _ft_debug_lineno;
+        }
+        else
+        {
+          table->nodes--;
+
+          *pnode = node->link;
+
+          node->size   = 0;
+          node->source = NULL;
+
+          ft_mem_table_free( table, node );
+
+          if ( table->nodes * 3 < table->size  ||
+               table->size  * 3 < table->nodes )
+            ft_mem_table_resize( table );
+        }
+      }
+      else
+        ft_mem_debug_panic(
+          "trying to free unknown block at %p in (%s:%ld)\n",
+          address,
+          FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );
+    }
+  }
+
+
+  extern FT_Pointer
+  ft_mem_debug_alloc( FT_Memory  memory,
+                      FT_Long    size )
+  {
+    FT_MemTable  table = (FT_MemTable)memory->user;
+    FT_Byte*     block;
+
+
+    if ( size <= 0 )
+      ft_mem_debug_panic( "negative block size allocation (%ld)", size );
+
+    /* return NULL if the maximum number of allocations was reached */
+    if ( table->bound_count                           &&
+         table->alloc_count >= table->alloc_count_max )
+      return NULL;
+
+    /* return NULL if this allocation would overflow the maximum heap size */
+    if ( table->bound_total                                             &&
+         table->alloc_total_max - table->alloc_current > (FT_ULong)size )
+      return NULL;
+
+    block = (FT_Byte *)ft_mem_table_alloc( table, size );
+    if ( block )
+    {
+      ft_mem_table_set( table, block, (FT_ULong)size, 0 );
+
+      table->alloc_count++;
+    }
+
+    _ft_debug_file   = "<unknown>";
+    _ft_debug_lineno = 0;
+
+    return (FT_Pointer)block;
+  }
+
+
+  extern void
+  ft_mem_debug_free( FT_Memory   memory,
+                     FT_Pointer  block )
+  {
+    FT_MemTable  table = (FT_MemTable)memory->user;
+
+
+    if ( block == NULL )
+      ft_mem_debug_panic( "trying to free NULL in (%s:%ld)",
+                          FT_FILENAME( _ft_debug_file ),
+                          _ft_debug_lineno );
+
+    ft_mem_table_remove( table, (FT_Byte*)block, 0 );
+
+    if ( !table->keep_alive )
+      ft_mem_table_free( table, block );
+
+    table->alloc_count--;
+
+    _ft_debug_file   = "<unknown>";
+    _ft_debug_lineno = 0;
+  }
+
+
+  extern FT_Pointer
+  ft_mem_debug_realloc( FT_Memory   memory,
+                        FT_Long     cur_size,
+                        FT_Long     new_size,
+                        FT_Pointer  block )
+  {
+    FT_MemTable  table = (FT_MemTable)memory->user;
+    FT_MemNode   node, *pnode;
+    FT_Pointer   new_block;
+    FT_Long      delta;
+
+    const char*  file_name = FT_FILENAME( _ft_debug_file );
+    FT_Long      line_no   = _ft_debug_lineno;
+
+
+    /* unlikely, but possible */
+    if ( new_size == cur_size )
+      return block;
+
+    /* the following is valid according to ANSI C */
+#if 0
+    if ( block == NULL || cur_size == 0 )
+      ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)",
+                          file_name, line_no );
+#endif
+
+    /* while the following is allowed in ANSI C also, we abort since */
+    /* such case should be handled by FreeType.                      */
+    if ( new_size <= 0 )
+      ft_mem_debug_panic(
+        "trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)",
+        block, cur_size, file_name, line_no );
+
+    /* check `cur_size' value */
+    pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block );
+    node  = *pnode;
+    if ( !node )
+      ft_mem_debug_panic(
+        "trying to reallocate unknown block at %p in (%s:%ld)",
+        block, file_name, line_no );
+
+    if ( node->size <= 0 )
+      ft_mem_debug_panic(
+        "trying to reallocate freed block at %p in (%s:%ld)",
+        block, file_name, line_no );
+
+    if ( node->size != cur_size )
+      ft_mem_debug_panic( "invalid ft_realloc request for %p. cur_size is "
+                          "%ld instead of %ld in (%s:%ld)",
+                          block, cur_size, node->size, file_name, line_no );
+
+    /* return NULL if the maximum number of allocations was reached */
+    if ( table->bound_count                           &&
+         table->alloc_count >= table->alloc_count_max )
+      return NULL;
+
+    delta = (FT_Long)( new_size - cur_size );
+
+    /* return NULL if this allocation would overflow the maximum heap size */
+    if ( delta > 0                                                       &&
+         table->bound_total                                              &&
+         table->alloc_current + (FT_ULong)delta > table->alloc_total_max )
+      return NULL;
+
+    new_block = (FT_Byte *)ft_mem_table_alloc( table, new_size );
+    if ( new_block == NULL )
+      return NULL;
+
+    ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta );
+
+    ft_memcpy( new_block, block, cur_size < new_size ? cur_size : new_size );
+
+    ft_mem_table_remove( table, (FT_Byte*)block, delta );
+
+    _ft_debug_file   = "<unknown>";
+    _ft_debug_lineno = 0;
+
+    if ( !table->keep_alive )
+      ft_mem_table_free( table, block );
+
+    return new_block;
+  }
+
+
+  extern FT_Int
+  ft_mem_debug_init( FT_Memory  memory )
+  {
+    FT_MemTable  table;
+    FT_Int       result = 0;
+
+
+    if (1)/* XYQ: always enable ( getenv( "FT2_DEBUG_MEMORY" ) ) */
+    {
+      table = ft_mem_table_new( memory );
+      if ( table )
+      {
+        const char*  p;
+
+
+        memory->user    = table;
+        memory->alloc   = ft_mem_debug_alloc;
+        memory->realloc = ft_mem_debug_realloc;
+        memory->free    = ft_mem_debug_free;
+
+        p = getenv( "FT2_ALLOC_TOTAL_MAX" );
+        if ( p != NULL )
+        {
+          FT_Long   total_max = ft_atol( p );
+
+
+          if ( total_max > 0 )
+          {
+            table->bound_total     = 1;
+            table->alloc_total_max = (FT_ULong)total_max;
+          }
+        }
+
+        p = getenv( "FT2_ALLOC_COUNT_MAX" );
+        if ( p != NULL )
+        {
+          FT_Long  total_count = ft_atol( p );
+
+
+          if ( total_count > 0 )
+          {
+            table->bound_count     = 1;
+            table->alloc_count_max = (FT_ULong)total_count;
+          }
+        }
+
+        p = getenv( "FT2_KEEP_ALIVE" );
+        if ( p != NULL )
+        {
+          FT_Long  keep_alive = ft_atol( p );
+
+
+          if ( keep_alive > 0 )
+            table->keep_alive = 1;
+        }
+
+        result = 1;
+      }
+    }
+    return result;
+  }
+
+
+  extern void
+  ft_mem_debug_done( FT_Memory  memory )
+  {
+    FT_MemTable  table = (FT_MemTable)memory->user;
+
+
+    if ( table )
+    {
+      memory->free    = table->free;
+      memory->realloc = table->realloc;
+      memory->alloc   = table->alloc;
+
+      ft_mem_table_destroy( table );
+      memory->user = NULL;
+    }
+  }
+
+
+
+  static int
+  ft_mem_source_compare( const void*  p1,
+                         const void*  p2 )
+  {
+    FT_MemSource  s1 = *(FT_MemSource*)p1;
+    FT_MemSource  s2 = *(FT_MemSource*)p2;
+
+
+    if ( s2->max_size > s1->max_size )
+      return 1;
+    else if ( s2->max_size < s1->max_size )
+      return -1;
+    else
+      return 0;
+  }
+
+
+  extern void
+  FT_DumpMemory( FT_Memory  memory )
+  {
+    FT_MemTable  table = (FT_MemTable)memory->user;
+
+
+    if ( table )
+    {
+      FT_MemSource*  bucket = table->sources;
+      FT_MemSource*  limit  = bucket + FT_MEM_SOURCE_BUCKETS;
+      FT_MemSource*  sources;
+      FT_UInt        nn, count;
+      const char*    fmt;
+
+
+      count = 0;
+      for ( ; bucket < limit; bucket++ )
+      {
+        FT_MemSource  source = *bucket;
+
+
+        for ( ; source; source = source->link )
+          count++;
+      }
+
+      sources = (FT_MemSource*)ft_mem_table_alloc(
+                                 table, sizeof ( *sources ) * count );
+
+      count = 0;
+      for ( bucket = table->sources; bucket < limit; bucket++ )
+      {
+        FT_MemSource  source = *bucket;
+
+
+        for ( ; source; source = source->link )
+          sources[count++] = source;
+      }
+
+      ft_qsort( sources, count, sizeof ( *sources ), ft_mem_source_compare );
+
+      printf( "FreeType Memory Dump: "
+              "current=%ld max=%ld total=%ld count=%ld\n",
+              table->alloc_current, table->alloc_max,
+              table->alloc_total, table->alloc_count );
+      printf( " block  block    sizes    sizes    sizes   source\n" );
+      printf( " count   high      sum  highsum      max   location\n" );
+      printf( "-------------------------------------------------\n" );
+
+      fmt = "%6ld %6ld %8ld %8ld %8ld %s:%d\n";
+
+      for ( nn = 0; nn < count; nn++ )
+      {
+        FT_MemSource  source = sources[nn];
+
+
+        printf( fmt,
+                source->cur_blocks, source->max_blocks,
+                source->cur_size, source->max_size, source->cur_max,
+                FT_FILENAME( source->file_name ),
+                source->line_no );
+      }
+      printf( "------------------------------------------------\n" );
+
+      ft_mem_table_free( table, sources );
+    }
+  }
+
+#else  /* !FT_DEBUG_MEMORY */
+
+  /* ANSI C doesn't like empty source files */
+  typedef int  _debug_mem_dummy;
+
+#endif /* !FT_DEBUG_MEMORY */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdebug.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdebug.c
new file mode 100644
index 0000000..4b98cf0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdebug.c
@@ -0,0 +1,266 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdebug.c                                                              */
+/*                                                                         */
+/*    Debugging and logging component (body).                              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2008, 2013 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This component contains various macros and functions used to ease the */
+  /* debugging of the FreeType engine.  Its main purpose is in assertion   */
+  /* checking, tracing, and error detection.                               */
+  /*                                                                       */
+  /* There are now three debugging modes:                                  */
+  /*                                                                       */
+  /* - trace mode                                                          */
+  /*                                                                       */
+  /*   Error and trace messages are sent to the log file (which can be the */
+  /*   standard error output).                                             */
+  /*                                                                       */
+  /* - error mode                                                          */
+  /*                                                                       */
+  /*   Only error messages are generated.                                  */
+  /*                                                                       */
+  /* - release mode:                                                       */
+  /*                                                                       */
+  /*   No error message is sent or generated.  The code is free from any   */
+  /*   debugging parts.                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( void )
+  FT_Message( const char*  fmt,
+              ... )
+  {
+    va_list  ap;
+
+
+    va_start( ap, fmt );
+    vfprintf( stderr, fmt, ap );
+    va_end( ap );
+  }
+
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( void )
+  FT_Panic( const char*  fmt,
+            ... )
+  {
+    va_list  ap;
+
+
+    va_start( ap, fmt );
+    vfprintf( stderr, fmt, ap );
+    va_end( ap );
+
+    exit( EXIT_FAILURE );
+  }
+
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( int )
+  FT_Throw( FT_Error     error,
+            int          line,
+            const char*  file )
+  {
+    FT_UNUSED( error );
+    FT_UNUSED( line );
+    FT_UNUSED( file );
+
+    return 0;
+  }
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+  /* array of trace levels, initialized to 0 */
+  int  ft_trace_levels[trace_count];
+
+
+  /* define array of trace toggle names */
+#define FT_TRACE_DEF( x )  #x ,
+
+  static const char*  ft_trace_toggles[trace_count + 1] =
+  {
+#include "../../include/freetype/internal/fttrace.h"
+    NULL
+  };
+
+#undef FT_TRACE_DEF
+
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( FT_Int )
+  FT_Trace_Get_Count( void )
+  {
+    return trace_count;
+  }
+
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( const char * )
+  FT_Trace_Get_Name( FT_Int  idx )
+  {
+    int  max = FT_Trace_Get_Count();
+
+
+    if ( idx < max )
+      return ft_trace_toggles[idx];
+    else
+      return NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Initialize the tracing sub-system.  This is done by retrieving the    */
+  /* value of the `FT2_DEBUG' environment variable.  It must be a list of  */
+  /* toggles, separated by spaces, `;', or `,'.  Example:                  */
+  /*                                                                       */
+  /*    export FT2_DEBUG="any:3 memory:7 stream:5"                         */
+  /*                                                                       */
+  /* This requests that all levels be set to 3, except the trace level for */
+  /* the memory and stream components which are set to 7 and 5,            */
+  /* respectively.                                                         */
+  /*                                                                       */
+  /* See the file <include/freetype/internal/fttrace.h> for details of the */
+  /* available toggle names.                                               */
+  /*                                                                       */
+  /* The level must be between 0 and 7; 0 means quiet (except for serious  */
+  /* runtime errors), and 7 means _very_ verbose.                          */
+  /*                                                                       */
+  FT_BASE_DEF( void )
+  ft_debug_init( void )
+  {
+    const char*  ft2_debug = getenv( "FT2_DEBUG" );
+
+
+    if ( ft2_debug )
+    {
+      const char*  p = ft2_debug;
+      const char*  q;
+
+
+      for ( ; *p; p++ )
+      {
+        /* skip leading whitespace and separators */
+        if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
+          continue;
+
+        /* read toggle name, followed by ':' */
+        q = p;
+        while ( *p && *p != ':' )
+          p++;
+
+        if ( !*p )
+          break;
+
+        if ( *p == ':' && p > q )
+        {
+          FT_Int  n, i, len = (FT_Int)( p - q );
+          FT_Int  level = -1, found = -1;
+
+
+          for ( n = 0; n < trace_count; n++ )
+          {
+            const char*  toggle = ft_trace_toggles[n];
+
+
+            for ( i = 0; i < len; i++ )
+            {
+              if ( toggle[i] != q[i] )
+                break;
+            }
+
+            if ( i == len && toggle[i] == 0 )
+            {
+              found = n;
+              break;
+            }
+          }
+
+          /* read level */
+          p++;
+          if ( *p )
+          {
+            level = *p - '0';
+            if ( level < 0 || level > 7 )
+              level = -1;
+          }
+
+          if ( found >= 0 && level >= 0 )
+          {
+            if ( found == trace_any )
+            {
+              /* special case for `any' */
+              for ( n = 0; n < trace_count; n++ )
+                ft_trace_levels[n] = level;
+            }
+            else
+              ft_trace_levels[found] = level;
+          }
+        }
+      }
+    }
+  }
+
+
+#else  /* !FT_DEBUG_LEVEL_TRACE */
+
+
+  FT_BASE_DEF( void )
+  ft_debug_init( void )
+  {
+    /* nothing */
+  }
+
+
+  FT_BASE_DEF( FT_Int )
+  FT_Trace_Get_Count( void )
+  {
+    return 0;
+  }
+
+
+  FT_BASE_DEF( const char * )
+  FT_Trace_Get_Name( FT_Int  idx )
+  {
+    FT_UNUSED( idx );
+
+    return NULL;
+  }
+
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftfstype.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftfstype.c
new file mode 100644
index 0000000..948263a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftfstype.c
@@ -0,0 +1,62 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftfstype.c                                                             */
+/*                                                                         */
+/*    FreeType utility file to access FSType data (body).                  */
+/*                                                                         */
+/*  Copyright 2008, 2009 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/t1tables.h"
+#include "../../include/freetype/tttables.h"
+#include "../../include/freetype/internal/ftserv.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UShort )
+  FT_Get_FSType_Flags( FT_Face  face )
+  {
+    TT_OS2*  os2;
+
+
+    /* first, try to get the fs_type directly from the font */
+    if ( face )
+    {
+      FT_Service_PsInfo  service = NULL;
+
+
+      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+      if ( service && service->ps_get_font_extra )
+      {
+        PS_FontExtraRec  extra;
+
+
+        if ( !service->ps_get_font_extra( face, &extra ) &&
+             extra.fs_type != 0                          )
+          return extra.fs_type;
+      }
+    }
+
+    /* look at FSType before fsType for Type42 */
+
+    if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, ft_sfnt_os2 ) ) != NULL &&
+         os2->version != 0xFFFFU                                           )
+      return os2->fsType;
+
+    return 0;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgasp.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgasp.c
new file mode 100644
index 0000000..3187d96
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgasp.c
@@ -0,0 +1,61 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgasp.c                                                               */
+/*                                                                         */
+/*    Access of TrueType's `gasp' table (body).                            */
+/*                                                                         */
+/*  Copyright 2007 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftgasp.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+  FT_EXPORT_DEF( FT_Int )
+  FT_Get_Gasp( FT_Face  face,
+               FT_UInt  ppem )
+  {
+    FT_Int  result = FT_GASP_NO_TABLE;
+
+
+    if ( face && FT_IS_SFNT( face ) )
+    {
+      TT_Face  ttface = (TT_Face)face;
+
+
+      if ( ttface->gasp.numRanges > 0 )
+      {
+        TT_GaspRange  range     = ttface->gasp.gaspRanges;
+        TT_GaspRange  range_end = range + ttface->gasp.numRanges;
+
+
+        while ( ppem > range->maxPPEM )
+        {
+          range++;
+          if ( range >= range_end )
+            goto Exit;
+        }
+
+        result = range->gaspFlag;
+
+        /* ensure that we don't have spurious bits */
+        if ( ttface->gasp.version == 0 )
+          result &= 3;
+      }
+    }
+  Exit:
+    return result;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgloadr.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgloadr.c
new file mode 100644
index 0000000..a0dd86c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgloadr.c
@@ -0,0 +1,405 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgloadr.c                                                             */
+/*                                                                         */
+/*    The FreeType glyph loader (body).                                    */
+/*                                                                         */
+/*  Copyright 2002-2006, 2010, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftgloadr.h"
+#include "../../include/freetype/internal/ftmemory.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gloader
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                                                               *****/
+  /*****                    G L Y P H   L O A D E R                    *****/
+  /*****                                                               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The glyph loader is a simple object which is used to load a set of    */
+  /* glyphs easily.  It is critical for the correct loading of composites. */
+  /*                                                                       */
+  /* Ideally, one can see it as a stack of abstract `glyph' objects.       */
+  /*                                                                       */
+  /*   loader.base     Is really the bottom of the stack.  It describes a  */
+  /*                   single glyph image made of the juxtaposition of     */
+  /*                   several glyphs (those `in the stack').              */
+  /*                                                                       */
+  /*   loader.current  Describes the top of the stack, on which a new      */
+  /*                   glyph can be loaded.                                */
+  /*                                                                       */
+  /*   Rewind          Clears the stack.                                   */
+  /*   Prepare         Set up `loader.current' for addition of a new glyph */
+  /*                   image.                                              */
+  /*   Add             Add the `current' glyph image to the `base' one,    */
+  /*                   and prepare for another one.                        */
+  /*                                                                       */
+  /* The glyph loader is now a base object.  Each driver used to           */
+  /* re-implement it in one way or the other, which wasted code and        */
+  /* energy.                                                               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* create a new glyph loader */
+  FT_BASE_DEF( FT_Error )
+  FT_GlyphLoader_New( FT_Memory        memory,
+                      FT_GlyphLoader  *aloader )
+  {
+    FT_GlyphLoader  loader = NULL;
+    FT_Error        error;
+
+
+    if ( !FT_NEW( loader ) )
+    {
+      loader->memory = memory;
+      *aloader       = loader;
+    }
+    return error;
+  }
+
+
+  /* rewind the glyph loader - reset counters to 0 */
+  FT_BASE_DEF( void )
+  FT_GlyphLoader_Rewind( FT_GlyphLoader  loader )
+  {
+    FT_GlyphLoad  base    = &loader->base;
+    FT_GlyphLoad  current = &loader->current;
+
+
+    base->outline.n_points   = 0;
+    base->outline.n_contours = 0;
+    base->num_subglyphs      = 0;
+
+    *current = *base;
+  }
+
+
+  /* reset the glyph loader, frees all allocated tables */
+  /* and starts from zero                               */
+  FT_BASE_DEF( void )
+  FT_GlyphLoader_Reset( FT_GlyphLoader  loader )
+  {
+    FT_Memory memory = loader->memory;
+
+
+    FT_FREE( loader->base.outline.points );
+    FT_FREE( loader->base.outline.tags );
+    FT_FREE( loader->base.outline.contours );
+    FT_FREE( loader->base.extra_points );
+    FT_FREE( loader->base.subglyphs );
+
+    loader->base.extra_points2 = NULL;
+
+    loader->max_points    = 0;
+    loader->max_contours  = 0;
+    loader->max_subglyphs = 0;
+
+    FT_GlyphLoader_Rewind( loader );
+  }
+
+
+  /* delete a glyph loader */
+  FT_BASE_DEF( void )
+  FT_GlyphLoader_Done( FT_GlyphLoader  loader )
+  {
+    if ( loader )
+    {
+      FT_Memory memory = loader->memory;
+
+
+      FT_GlyphLoader_Reset( loader );
+      FT_FREE( loader );
+    }
+  }
+
+
+  /* re-adjust the `current' outline fields */
+  static void
+  FT_GlyphLoader_Adjust_Points( FT_GlyphLoader  loader )
+  {
+    FT_Outline*  base    = &loader->base.outline;
+    FT_Outline*  current = &loader->current.outline;
+
+
+    current->points   = base->points   + base->n_points;
+    current->tags     = base->tags     + base->n_points;
+    current->contours = base->contours + base->n_contours;
+
+    /* handle extra points table - if any */
+    if ( loader->use_extra )
+    {
+      loader->current.extra_points  = loader->base.extra_points +
+                                      base->n_points;
+
+      loader->current.extra_points2 = loader->base.extra_points2 +
+                                      base->n_points;
+    }
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader )
+  {
+    FT_Error   error;
+    FT_Memory  memory = loader->memory;
+
+
+    if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) )
+    {
+      loader->use_extra          = 1;
+      loader->base.extra_points2 = loader->base.extra_points +
+                                   loader->max_points;
+
+      FT_GlyphLoader_Adjust_Points( loader );
+    }
+    return error;
+  }
+
+
+  /* re-adjust the `current' subglyphs field */
+  static void
+  FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader  loader )
+  {
+    FT_GlyphLoad  base    = &loader->base;
+    FT_GlyphLoad  current = &loader->current;
+
+
+    current->subglyphs = base->subglyphs + base->num_subglyphs;
+  }
+
+
+  /* Ensure that we can add `n_points' and `n_contours' to our glyph.      */
+  /* This function reallocates its outline tables if necessary.  Note that */
+  /* it DOESN'T change the number of points within the loader!             */
+  /*                                                                       */
+  FT_BASE_DEF( FT_Error )
+  FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,
+                              FT_UInt         n_points,
+                              FT_UInt         n_contours )
+  {
+    FT_Memory    memory  = loader->memory;
+    FT_Error     error   = FT_Err_Ok;
+    FT_Outline*  base    = &loader->base.outline;
+    FT_Outline*  current = &loader->current.outline;
+    FT_Bool      adjust  = 0;
+
+    FT_UInt      new_max, old_max;
+
+
+    /* check points & tags */
+    new_max = base->n_points + current->n_points + n_points;
+    old_max = loader->max_points;
+
+    if ( new_max > old_max )
+    {
+      new_max = FT_PAD_CEIL( new_max, 8 );
+
+      if ( new_max > FT_OUTLINE_POINTS_MAX )
+        return FT_THROW( Array_Too_Large );
+
+      if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) ||
+           FT_RENEW_ARRAY( base->tags,   old_max, new_max ) )
+        goto Exit;
+
+      if ( loader->use_extra )
+      {
+        if ( FT_RENEW_ARRAY( loader->base.extra_points,
+                             old_max * 2, new_max * 2 ) )
+          goto Exit;
+
+        FT_ARRAY_MOVE( loader->base.extra_points + new_max,
+                       loader->base.extra_points + old_max,
+                       old_max );
+
+        loader->base.extra_points2 = loader->base.extra_points + new_max;
+      }
+
+      adjust = 1;
+      loader->max_points = new_max;
+    }
+
+    /* check contours */
+    old_max = loader->max_contours;
+    new_max = base->n_contours + current->n_contours +
+              n_contours;
+    if ( new_max > old_max )
+    {
+      new_max = FT_PAD_CEIL( new_max, 4 );
+
+      if ( new_max > FT_OUTLINE_CONTOURS_MAX )
+        return FT_THROW( Array_Too_Large );
+
+      if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) )
+        goto Exit;
+
+      adjust = 1;
+      loader->max_contours = new_max;
+    }
+
+    if ( adjust )
+      FT_GlyphLoader_Adjust_Points( loader );
+
+  Exit:
+    if ( error )
+      FT_GlyphLoader_Reset( loader );
+
+    return error;
+  }
+
+
+  /* Ensure that we can add `n_subglyphs' to our glyph. this function */
+  /* reallocates its subglyphs table if necessary.  Note that it DOES */
+  /* NOT change the number of subglyphs within the loader!            */
+  /*                                                                  */
+  FT_BASE_DEF( FT_Error )
+  FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,
+                                 FT_UInt         n_subs )
+  {
+    FT_Memory     memory = loader->memory;
+    FT_Error      error  = FT_Err_Ok;
+    FT_UInt       new_max, old_max;
+
+    FT_GlyphLoad  base    = &loader->base;
+    FT_GlyphLoad  current = &loader->current;
+
+
+    new_max = base->num_subglyphs + current->num_subglyphs + n_subs;
+    old_max = loader->max_subglyphs;
+    if ( new_max > old_max )
+    {
+      new_max = FT_PAD_CEIL( new_max, 2 );
+      if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) )
+        goto Exit;
+
+      loader->max_subglyphs = new_max;
+
+      FT_GlyphLoader_Adjust_Subglyphs( loader );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* prepare loader for the addition of a new glyph on top of the base one */
+  FT_BASE_DEF( void )
+  FT_GlyphLoader_Prepare( FT_GlyphLoader  loader )
+  {
+    FT_GlyphLoad  current = &loader->current;
+
+
+    current->outline.n_points   = 0;
+    current->outline.n_contours = 0;
+    current->num_subglyphs      = 0;
+
+    FT_GlyphLoader_Adjust_Points   ( loader );
+    FT_GlyphLoader_Adjust_Subglyphs( loader );
+  }
+
+
+  /* add current glyph to the base image -- and prepare for another */
+  FT_BASE_DEF( void )
+  FT_GlyphLoader_Add( FT_GlyphLoader  loader )
+  {
+    FT_GlyphLoad  base;
+    FT_GlyphLoad  current;
+
+    FT_UInt       n_curr_contours;
+    FT_UInt       n_base_points;
+    FT_UInt       n;
+
+
+    if ( !loader )
+      return;
+
+    base    = &loader->base;
+    current = &loader->current;
+
+    n_curr_contours = current->outline.n_contours;
+    n_base_points   = base->outline.n_points;
+
+    base->outline.n_points =
+      (short)( base->outline.n_points + current->outline.n_points );
+    base->outline.n_contours =
+      (short)( base->outline.n_contours + current->outline.n_contours );
+
+    base->num_subglyphs += current->num_subglyphs;
+
+    /* adjust contours count in newest outline */
+    for ( n = 0; n < n_curr_contours; n++ )
+      current->outline.contours[n] =
+        (short)( current->outline.contours[n] + n_base_points );
+
+    /* prepare for another new glyph image */
+    FT_GlyphLoader_Prepare( loader );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_GlyphLoader_CopyPoints( FT_GlyphLoader  target,
+                             FT_GlyphLoader  source )
+  {
+    FT_Error  error;
+    FT_UInt   num_points   = source->base.outline.n_points;
+    FT_UInt   num_contours = source->base.outline.n_contours;
+
+
+    error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours );
+    if ( !error )
+    {
+      FT_Outline*  out = &target->base.outline;
+      FT_Outline*  in  = &source->base.outline;
+
+
+      FT_ARRAY_COPY( out->points, in->points,
+                     num_points );
+      FT_ARRAY_COPY( out->tags, in->tags,
+                     num_points );
+      FT_ARRAY_COPY( out->contours, in->contours,
+                     num_contours );
+
+      /* do we need to copy the extra points? */
+      if ( target->use_extra && source->use_extra )
+      {
+        FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points,
+                       num_points );
+        FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2,
+                       num_points );
+      }
+
+      out->n_points   = (short)num_points;
+      out->n_contours = (short)num_contours;
+
+      FT_GlyphLoader_Adjust_Points( target );
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgxval.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgxval.c
new file mode 100644
index 0000000..3b5884e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgxval.c
@@ -0,0 +1,142 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgxval.c                                                              */
+/*                                                                         */
+/*    FreeType API for validating TrueTyepGX/AAT tables (body).            */
+/*                                                                         */
+/*  Copyright 2004-2006, 2010, 2013 by                                     */
+/*  Masatake YAMATO, Redhat K.K,                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svgxval.h"
+
+
+  /* documentation is in ftgxval.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_TrueTypeGX_Validate( FT_Face   face,
+                          FT_UInt   validation_flags,
+                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
+                          FT_UInt   table_length )
+  {
+    FT_Service_GXvalidate  service;
+    FT_Error               error;
+
+
+    if ( !face )
+    {
+      error = FT_THROW( Invalid_Face_Handle );
+      goto Exit;
+    }
+
+    if ( tables == NULL )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, service, GX_VALIDATE );
+
+    if ( service )
+      error = service->validate( face,
+                                 validation_flags,
+                                 tables,
+                                 table_length );
+    else
+      error = FT_THROW( Unimplemented_Feature );
+
+  Exit:
+    return error;
+  }
+
+
+  FT_EXPORT_DEF( void )
+  FT_TrueTypeGX_Free( FT_Face   face,
+                      FT_Bytes  table )
+  {
+    FT_Memory  memory;
+
+
+    if ( !face )
+      return;
+
+    memory = FT_FACE_MEMORY( face );
+
+    FT_FREE( table );
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_ClassicKern_Validate( FT_Face    face,
+                           FT_UInt    validation_flags,
+                           FT_Bytes  *ckern_table )
+  {
+    FT_Service_CKERNvalidate  service;
+    FT_Error                  error;
+
+
+    if ( !face )
+    {
+      error = FT_THROW( Invalid_Face_Handle );
+      goto Exit;
+    }
+
+    if ( ckern_table == NULL )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, service, CLASSICKERN_VALIDATE );
+
+    if ( service )
+      error = service->validate( face,
+                                 validation_flags,
+                                 ckern_table );
+    else
+      error = FT_THROW( Unimplemented_Feature );
+
+  Exit:
+    return error;
+  }
+
+
+  FT_EXPORT_DEF( void )
+  FT_ClassicKern_Free( FT_Face   face,
+                       FT_Bytes  table )
+  {
+    FT_Memory  memory;
+
+
+    if ( !face )
+      return;
+
+    memory = FT_FACE_MEMORY( face );
+
+
+    FT_FREE( table );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftmac.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftmac.c
new file mode 100644
index 0000000..76361d9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftmac.c
@@ -0,0 +1,1061 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmac.c                                                                */
+/*                                                                         */
+/*    Mac FOND support.  Written by just@letterror.com.                    */
+/*  Heavily modified by mpsuzuki, George Williams, and Sean McBride.       */
+/*                                                                         */
+/*  This file is for Mac OS X only; see builds/mac/ftoldmac.c for          */
+/*  classic platforms built by MPW.                                        */
+/*                                                                         */
+/*  Copyright 1996-2009, 2013 by                                           */
+/*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*
+    Notes
+
+    Mac suitcase files can (and often do!) contain multiple fonts.  To
+    support this I use the face_index argument of FT_(Open|New)_Face()
+    functions, and pretend the suitcase file is a collection.
+
+    Warning: fbit and NFNT bitmap resources are not supported yet.  In old
+    sfnt fonts, bitmap glyph data for each size is stored in each `NFNT'
+    resources instead of the `bdat' table in the sfnt resource.  Therefore,
+    face->num_fixed_sizes is set to 0, because bitmap data in `NFNT'
+    resource is unavailable at present.
+
+    The Mac FOND support works roughly like this:
+
+    - Check whether the offered stream points to a Mac suitcase file.  This
+      is done by checking the file type: it has to be 'FFIL' or 'tfil'.  The
+      stream that gets passed to our init_face() routine is a stdio stream,
+      which isn't usable for us, since the FOND resources live in the
+      resource fork.  So we just grab the stream->pathname field.
+
+    - Read the FOND resource into memory, then check whether there is a
+      TrueType font and/or(!) a Type 1 font available.
+
+    - If there is a Type 1 font available (as a separate `LWFN' file), read
+      its data into memory, massage it slightly so it becomes PFB data, wrap
+      it into a memory stream, load the Type 1 driver and delegate the rest
+      of the work to it by calling FT_Open_Face().  (XXX TODO: after this
+      has been done, the kerning data from the FOND resource should be
+      appended to the face: On the Mac there are usually no AFM files
+      available.  However, this is tricky since we need to map Mac char
+      codes to ps glyph names to glyph ID's...)
+
+    - If there is a TrueType font (an `sfnt' resource), read it into memory,
+      wrap it into a memory stream, load the TrueType driver and delegate
+      the rest of the work to it, by calling FT_Open_Face().
+
+    - Some suitcase fonts (notably Onyx) might point the `LWFN' file to
+      itself, even though it doesn't contains `POST' resources.  To handle
+      this special case without opening the file an extra time, we just
+      ignore errors from the `LWFN' and fallback to the `sfnt' if both are
+      available.
+  */
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "ftbase.h"
+
+  /* This is for Mac OS X.  Without redefinition, OS_INLINE */
+  /* expands to `static inline' which doesn't survive the   */
+  /* -ansi compilation flag of GCC.                         */
+#if !HAVE_ANSI_OS_INLINE
+#undef  OS_INLINE
+#define OS_INLINE  static __inline__
+#endif
+
+  /* `configure' checks the availability of `ResourceIndex' strictly */
+  /* and sets HAVE_TYPE_RESOURCE_INDEX 1 or 0 always.  If it is      */
+  /* not set (e.g., a build without `configure'), the availability   */
+  /* is guessed from the SDK version.                                */
+#ifndef HAVE_TYPE_RESOURCE_INDEX
+#if !defined( MAC_OS_X_VERSION_10_5 ) || \
+    ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 )
+#define HAVE_TYPE_RESOURCE_INDEX 0
+#else
+#define HAVE_TYPE_RESOURCE_INDEX 1
+#endif
+#endif /* !HAVE_TYPE_RESOURCE_INDEX */
+
+#if ( HAVE_TYPE_RESOURCE_INDEX == 0 )
+  typedef short  ResourceIndex;
+#endif
+
+#include <CoreServices/CoreServices.h>
+#include <ApplicationServices/ApplicationServices.h>
+#include <sys/syslimits.h> /* PATH_MAX */
+
+  /* Don't want warnings about our own use of deprecated functions. */
+#define FT_DEPRECATED_ATTRIBUTE
+
+#include "../../include/freetype/ftmac.h"
+
+#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */
+#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault
+#endif
+
+
+  /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over
+     TrueType in case *both* are available (this is not common,
+     but it *is* possible). */
+#ifndef PREFER_LWFN
+#define PREFER_LWFN  1
+#endif
+
+
+#ifdef FT_MACINTOSH
+
+  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */
+  FT_EXPORT_DEF( FT_Error )
+  FT_GetFile_From_Mac_Name( const char*  fontName,
+                            FSSpec*      pathSpec,
+                            FT_Long*     face_index )
+  {
+    FT_UNUSED( fontName );
+    FT_UNUSED( pathSpec );
+    FT_UNUSED( face_index );
+
+    return FT_THROW( Unimplemented_Feature );
+  }
+
+
+  /* Private function.                                         */
+  /* The FSSpec type has been discouraged for a long time,     */
+  /* unfortunately an FSRef replacement API for                */
+  /* ATSFontGetFileSpecification() is only available in        */
+  /* Mac OS X 10.5 and later.                                  */
+  static OSStatus
+  FT_ATSFontGetFileReference( ATSFontRef  ats_font_id,
+                              FSRef*      ats_font_ref )
+  {
+#if defined( MAC_OS_X_VERSION_10_5 ) && \
+    ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 )
+
+    OSStatus  err;
+
+    err = ATSFontGetFileReference( ats_font_id, ats_font_ref );
+
+    return err;
+#elif __LP64__ /* No 64bit Carbon API on legacy platforms */
+    FT_UNUSED( ats_font_id );
+    FT_UNUSED( ats_font_ref );
+
+
+    return fnfErr;
+#else /* 32bit Carbon API on legacy platforms */
+    OSStatus  err;
+    FSSpec    spec;
+
+
+    err = ATSFontGetFileSpecification( ats_font_id, &spec );
+    if ( noErr == err )
+      err = FSpMakeFSRef( &spec, ats_font_ref );
+
+    return err;
+#endif
+  }
+
+
+  static FT_Error
+  FT_GetFileRef_From_Mac_ATS_Name( const char*  fontName,
+                                   FSRef*       ats_font_ref,
+                                   FT_Long*     face_index )
+  {
+    CFStringRef  cf_fontName;
+    ATSFontRef   ats_font_id;
+
+
+    *face_index = 0;
+
+    cf_fontName = CFStringCreateWithCString( NULL, fontName,
+                                             kCFStringEncodingMacRoman );
+    ats_font_id = ATSFontFindFromName( cf_fontName,
+                                       kATSOptionFlagsUnRestrictedScope );
+    CFRelease( cf_fontName );
+
+    if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL )
+      return FT_THROW( Unknown_File_Format );
+
+    if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) )
+      return FT_THROW( Unknown_File_Format );
+
+    /* face_index calculation by searching preceding fontIDs */
+    /* with same FSRef                                       */
+    {
+      ATSFontRef  id2 = ats_font_id - 1;
+      FSRef       ref2;
+
+
+      while ( id2 > 0 )
+      {
+        if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) )
+          break;
+        if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) )
+          break;
+
+        id2 --;
+      }
+      *face_index = ats_font_id - ( id2 + 1 );
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,
+                                    UInt8*       path,
+                                    UInt32       maxPathSize,
+                                    FT_Long*     face_index )
+  {
+    FSRef     ref;
+    FT_Error  err;
+
+
+    err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
+    if ( err )
+      return err;
+
+    if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) )
+      return FT_THROW( Unknown_File_Format );
+
+    return FT_Err_Ok;
+  }
+
+
+  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */
+  FT_EXPORT_DEF( FT_Error )
+  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,
+                                FSSpec*      pathSpec,
+                                FT_Long*     face_index )
+  {
+#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \
+      ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )
+    FT_UNUSED( fontName );
+    FT_UNUSED( pathSpec );
+    FT_UNUSED( face_index );
+
+    return FT_THROW( Unimplemented_Feature );
+#else
+    FSRef     ref;
+    FT_Error  err;
+
+
+    err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
+    if ( err )
+      return err;
+
+    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL,
+                                    pathSpec, NULL ) )
+      return FT_THROW( Unknown_File_Format );
+
+    return FT_Err_Ok;
+#endif
+  }
+
+
+  static OSErr
+  FT_FSPathMakeRes( const UInt8*    pathname,
+                    ResFileRefNum*  res )
+  {
+    OSErr  err;
+    FSRef  ref;
+
+
+    if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )
+      return FT_THROW( Cannot_Open_Resource );
+
+    /* at present, no support for dfont format */
+    err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res );
+    if ( noErr == err )
+      return err;
+
+    /* fallback to original resource-fork font */
+    *res = FSOpenResFile( &ref, fsRdPerm );
+    err  = ResError();
+
+    return err;
+  }
+
+
+  /* Return the file type for given pathname */
+  static OSType
+  get_file_type_from_path( const UInt8*  pathname )
+  {
+    FSRef          ref;
+    FSCatalogInfo  info;
+
+
+    if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )
+      return ( OSType ) 0;
+
+    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info,
+                                    NULL, NULL, NULL ) )
+      return ( OSType ) 0;
+
+    return ((FInfo *)(info.finderInfo))->fdType;
+  }
+
+
+  /* Given a PostScript font name, create the Macintosh LWFN file name. */
+  static void
+  create_lwfn_name( char*   ps_name,
+                    Str255  lwfn_file_name )
+  {
+    int       max = 5, count = 0;
+    FT_Byte*  p = lwfn_file_name;
+    FT_Byte*  q = (FT_Byte*)ps_name;
+
+
+    lwfn_file_name[0] = 0;
+
+    while ( *q )
+    {
+      if ( ft_isupper( *q ) )
+      {
+        if ( count )
+          max = 3;
+        count = 0;
+      }
+      if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) )
+      {
+        *++p = *q;
+        lwfn_file_name[0]++;
+        count++;
+      }
+      q++;
+    }
+  }
+
+
+  static short
+  count_faces_sfnt( char*  fond_data )
+  {
+    /* The count is 1 greater than the value in the FOND.  */
+    /* Isn't that cute? :-)                                */
+
+    return EndianS16_BtoN( *( (short*)( fond_data +
+                                        sizeof ( FamRec ) ) ) ) + 1;
+  }
+
+
+  static short
+  count_faces_scalable( char*  fond_data )
+  {
+    AsscEntry*  assoc;
+    short       i, face, face_all;
+
+
+    face_all = EndianS16_BtoN( *( (short *)( fond_data +
+                                             sizeof ( FamRec ) ) ) ) + 1;
+    assoc    = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
+    face     = 0;
+
+    for ( i = 0; i < face_all; i++ )
+    {
+      if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) )
+        face++;
+    }
+    return face;
+  }
+
+
+  /* Look inside the FOND data, answer whether there should be an SFNT
+     resource, and answer the name of a possible LWFN Type 1 file.
+
+     Thanks to Paul Miller (paulm@profoundeffects.com) for the fix
+     to load a face OTHER than the first one in the FOND!
+  */
+
+
+  static void
+  parse_fond( char*   fond_data,
+              short*  have_sfnt,
+              ResID*  sfnt_id,
+              Str255  lwfn_file_name,
+              short   face_index )
+  {
+    AsscEntry*  assoc;
+    AsscEntry*  base_assoc;
+    FamRec*     fond;
+
+
+    *sfnt_id          = 0;
+    *have_sfnt        = 0;
+    lwfn_file_name[0] = 0;
+
+    fond       = (FamRec*)fond_data;
+    assoc      = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
+    base_assoc = assoc;
+
+    /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */
+    if ( 47 < face_index )
+      return;
+
+    /* Let's do a little range checking before we get too excited here */
+    if ( face_index < count_faces_sfnt( fond_data ) )
+    {
+      assoc += face_index;        /* add on the face_index! */
+
+      /* if the face at this index is not scalable,
+         fall back to the first one (old behavior) */
+      if ( EndianS16_BtoN( assoc->fontSize ) == 0 )
+      {
+        *have_sfnt = 1;
+        *sfnt_id   = EndianS16_BtoN( assoc->fontID );
+      }
+      else if ( base_assoc->fontSize == 0 )
+      {
+        *have_sfnt = 1;
+        *sfnt_id   = EndianS16_BtoN( base_assoc->fontID );
+      }
+    }
+
+    if ( EndianS32_BtoN( fond->ffStylOff ) )
+    {
+      unsigned char*  p = (unsigned char*)fond_data;
+      StyleTable*     style;
+      unsigned short  string_count;
+      char            ps_name[256];
+      unsigned char*  names[64];
+      int             i;
+
+
+      p += EndianS32_BtoN( fond->ffStylOff );
+      style = (StyleTable*)p;
+      p += sizeof ( StyleTable );
+      string_count = EndianS16_BtoN( *(short*)(p) );
+      p += sizeof ( short );
+
+      for ( i = 0; i < string_count && i < 64; i++ )
+      {
+        names[i] = p;
+        p       += names[i][0];
+        p++;
+      }
+
+      {
+        size_t  ps_name_len = (size_t)names[0][0];
+
+
+        if ( ps_name_len != 0 )
+        {
+          ft_memcpy(ps_name, names[0] + 1, ps_name_len);
+          ps_name[ps_name_len] = 0;
+        }
+        if ( style->indexes[face_index] > 1 &&
+             style->indexes[face_index] <= FT_MIN( string_count, 64 ) )
+        {
+          unsigned char*  suffixes = names[style->indexes[face_index] - 1];
+
+
+          for ( i = 1; i <= suffixes[0]; i++ )
+          {
+            unsigned char*  s;
+            size_t          j = suffixes[i] - 1;
+
+
+            if ( j < string_count && ( s = names[j] ) != NULL )
+            {
+              size_t  s_len = (size_t)s[0];
+
+
+              if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) )
+              {
+                ft_memcpy( ps_name + ps_name_len, s + 1, s_len );
+                ps_name_len += s_len;
+                ps_name[ps_name_len] = 0;
+              }
+            }
+          }
+        }
+      }
+
+      create_lwfn_name( ps_name, lwfn_file_name );
+    }
+  }
+
+
+  static  FT_Error
+  lookup_lwfn_by_fond( const UInt8*      path_fond,
+                       ConstStr255Param  base_lwfn,
+                       UInt8*            path_lwfn,
+                       size_t            path_size )
+  {
+    FSRef   ref, par_ref;
+    size_t  dirname_len;
+
+
+    /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */
+    /* We should not extract parent directory by string manipulation.      */
+
+    if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) )
+      return FT_THROW( Invalid_Argument );
+
+    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,
+                                    NULL, NULL, NULL, &par_ref ) )
+      return FT_THROW( Invalid_Argument );
+
+    if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) )
+      return FT_THROW( Invalid_Argument );
+
+    if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size )
+      return FT_THROW( Invalid_Argument );
+
+    /* now we have absolute dirname in path_lwfn */
+    ft_strcat( (char *)path_lwfn, "/" );
+    dirname_len = ft_strlen( (char *)path_lwfn );
+    ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 );
+    path_lwfn[dirname_len + base_lwfn[0]] = '\0';
+
+    if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) )
+      return FT_THROW( Cannot_Open_Resource );
+
+    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,
+                                    NULL, NULL, NULL, NULL ) )
+      return FT_THROW( Cannot_Open_Resource );
+
+    return FT_Err_Ok;
+  }
+
+
+  static short
+  count_faces( Handle        fond,
+               const UInt8*  pathname )
+  {
+    ResID     sfnt_id;
+    short     have_sfnt, have_lwfn;
+    Str255    lwfn_file_name;
+    UInt8     buff[PATH_MAX];
+    FT_Error  err;
+    short     num_faces;
+
+
+    have_sfnt = have_lwfn = 0;
+
+    parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 );
+
+    if ( lwfn_file_name[0] )
+    {
+      err = lookup_lwfn_by_fond( pathname, lwfn_file_name,
+                                 buff, sizeof ( buff )  );
+      if ( !err )
+        have_lwfn = 1;
+    }
+
+    if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
+      num_faces = 1;
+    else
+      num_faces = count_faces_scalable( *fond );
+
+    return num_faces;
+  }
+
+
+  /* Read Type 1 data from the POST resources inside the LWFN file,
+     return a PFB buffer.  This is somewhat convoluted because the FT2
+     PFB parser wants the ASCII header as one chunk, and the LWFN
+     chunks are often not organized that way, so we glue chunks
+     of the same type together. */
+  static FT_Error
+  read_lwfn( FT_Memory      memory,
+             ResFileRefNum  res,
+             FT_Byte**      pfb_data,
+             FT_ULong*      size )
+  {
+    FT_Error       error = FT_Err_Ok;
+    ResID          res_id;
+    unsigned char  *buffer, *p, *size_p = NULL;
+    FT_ULong       total_size = 0;
+    FT_ULong       old_total_size = 0;
+    FT_ULong       post_size, pfb_chunk_size;
+    Handle         post_data;
+    char           code, last_code;
+
+
+    UseResFile( res );
+
+    /* First pass: load all POST resources, and determine the size of */
+    /* the output buffer.                                             */
+    res_id    = 501;
+    last_code = -1;
+
+    for (;;)
+    {
+      post_data = Get1Resource( TTAG_POST, res_id++ );
+      if ( post_data == NULL )
+        break;  /* we are done */
+
+      code = (*post_data)[0];
+
+      if ( code != last_code )
+      {
+        if ( code == 5 )
+          total_size += 2; /* just the end code */
+        else
+          total_size += 6; /* code + 4 bytes chunk length */
+      }
+
+      total_size += GetHandleSize( post_data ) - 2;
+      last_code = code;
+
+      /* detect integer overflows */
+      if ( total_size < old_total_size )
+      {
+        error = FT_THROW( Array_Too_Large );
+        goto Error;
+      }
+
+      old_total_size = total_size;
+    }
+
+    if ( FT_ALLOC( buffer, (FT_Long)total_size ) )
+      goto Error;
+
+    /* Second pass: append all POST data to the buffer, add PFB fields. */
+    /* Glue all consecutive chunks of the same type together.           */
+    p              = buffer;
+    res_id         = 501;
+    last_code      = -1;
+    pfb_chunk_size = 0;
+
+    for (;;)
+    {
+      post_data = Get1Resource( TTAG_POST, res_id++ );
+      if ( post_data == NULL )
+        break;  /* we are done */
+
+      post_size = (FT_ULong)GetHandleSize( post_data ) - 2;
+      code = (*post_data)[0];
+
+      if ( code != last_code )
+      {
+        if ( last_code != -1 )
+        {
+          /* we are done adding a chunk, fill in the size field */
+          if ( size_p != NULL )
+          {
+            *size_p++ = (FT_Byte)(   pfb_chunk_size         & 0xFF );
+            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8  ) & 0xFF );
+            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF );
+            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF );
+          }
+          pfb_chunk_size = 0;
+        }
+
+        *p++ = 0x80;
+        if ( code == 5 )
+          *p++ = 0x03;  /* the end */
+        else if ( code == 2 )
+          *p++ = 0x02;  /* binary segment */
+        else
+          *p++ = 0x01;  /* ASCII segment */
+
+        if ( code != 5 )
+        {
+          size_p = p;   /* save for later */
+          p += 4;       /* make space for size field */
+        }
+      }
+
+      ft_memcpy( p, *post_data + 2, post_size );
+      pfb_chunk_size += post_size;
+      p += post_size;
+      last_code = code;
+    }
+
+    *pfb_data = buffer;
+    *size = total_size;
+
+  Error:
+    CloseResFile( res );
+    return error;
+  }
+
+
+  /* Create a new FT_Face from a file path to an LWFN file. */
+  static FT_Error
+  FT_New_Face_From_LWFN( FT_Library    library,
+                         const UInt8*  pathname,
+                         FT_Long       face_index,
+                         FT_Face*      aface )
+  {
+    FT_Byte*       pfb_data;
+    FT_ULong       pfb_size;
+    FT_Error       error;
+    ResFileRefNum  res;
+
+
+    if ( noErr != FT_FSPathMakeRes( pathname, &res ) )
+      return FT_THROW( Cannot_Open_Resource );
+
+    pfb_data = NULL;
+    pfb_size = 0;
+    error = read_lwfn( library->memory, res, &pfb_data, &pfb_size );
+    CloseResFile( res ); /* PFB is already loaded, useless anymore */
+    if ( error )
+      return error;
+
+    return open_face_from_buffer( library,
+                                  pfb_data,
+                                  pfb_size,
+                                  face_index,
+                                  "type1",
+                                  aface );
+  }
+
+
+  /* Create a new FT_Face from an SFNT resource, specified by res ID. */
+  static FT_Error
+  FT_New_Face_From_SFNT( FT_Library  library,
+                         ResID       sfnt_id,
+                         FT_Long     face_index,
+                         FT_Face*    aface )
+  {
+    Handle     sfnt = NULL;
+    FT_Byte*   sfnt_data;
+    size_t     sfnt_size;
+    FT_Error   error  = FT_Err_Ok;
+    FT_Memory  memory = library->memory;
+    int        is_cff, is_sfnt_ps;
+
+
+    sfnt = GetResource( TTAG_sfnt, sfnt_id );
+    if ( sfnt == NULL )
+      return FT_THROW( Invalid_Handle );
+
+    sfnt_size = (FT_ULong)GetHandleSize( sfnt );
+    if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) )
+    {
+      ReleaseResource( sfnt );
+      return error;
+    }
+
+    ft_memcpy( sfnt_data, *sfnt, sfnt_size );
+    ReleaseResource( sfnt );
+
+    is_cff     = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 );
+    is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 );
+
+    if ( is_sfnt_ps )
+    {
+      FT_Stream  stream;
+
+
+      if ( FT_NEW( stream ) )
+        goto Try_OpenType;
+
+      FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size );
+      if ( !open_face_PS_from_sfnt_stream( library,
+                                           stream,
+                                           face_index,
+                                           0, NULL,
+                                           aface ) )
+      {
+        FT_Stream_Close( stream );
+        FT_FREE( stream );
+        FT_FREE( sfnt_data );
+        goto Exit;
+      }
+
+      FT_FREE( stream );
+    }
+  Try_OpenType:
+    error = open_face_from_buffer( library,
+                                   sfnt_data,
+                                   sfnt_size,
+                                   face_index,
+                                   is_cff ? "cff" : "truetype",
+                                   aface );
+  Exit:
+    return error;
+  }
+
+
+  /* Create a new FT_Face from a file path to a suitcase file. */
+  static FT_Error
+  FT_New_Face_From_Suitcase( FT_Library    library,
+                             const UInt8*  pathname,
+                             FT_Long       face_index,
+                             FT_Face*      aface )
+  {
+    FT_Error       error = FT_ERR( Cannot_Open_Resource );
+    ResFileRefNum  res_ref;
+    ResourceIndex  res_index;
+    Handle         fond;
+    short          num_faces_in_res;
+
+
+    if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) )
+      return FT_THROW( Cannot_Open_Resource );
+
+    UseResFile( res_ref );
+    if ( ResError() )
+      return FT_THROW( Cannot_Open_Resource );
+
+    num_faces_in_res = 0;
+    for ( res_index = 1; ; ++res_index )
+    {
+      short  num_faces_in_fond;
+
+
+      fond = Get1IndResource( TTAG_FOND, res_index );
+      if ( ResError() )
+        break;
+
+      num_faces_in_fond  = count_faces( fond, pathname );
+      num_faces_in_res  += num_faces_in_fond;
+
+      if ( 0 <= face_index && face_index < num_faces_in_fond && error )
+        error = FT_New_Face_From_FOND( library, fond, face_index, aface );
+
+      face_index -= num_faces_in_fond;
+    }
+
+    CloseResFile( res_ref );
+    if ( !error && aface && *aface )
+      (*aface)->num_faces = num_faces_in_res;
+    return error;
+  }
+
+
+  /* documentation is in ftmac.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face_From_FOND( FT_Library  library,
+                         Handle      fond,
+                         FT_Long     face_index,
+                         FT_Face*    aface )
+  {
+    short     have_sfnt, have_lwfn = 0;
+    ResID     sfnt_id, fond_id;
+    OSType    fond_type;
+    Str255    fond_name;
+    Str255    lwfn_file_name;
+    UInt8     path_lwfn[PATH_MAX];
+    OSErr     err;
+    FT_Error  error = FT_Err_Ok;
+
+
+    GetResInfo( fond, &fond_id, &fond_type, fond_name );
+    if ( ResError() != noErr || fond_type != TTAG_FOND )
+      return FT_THROW( Invalid_File_Format );
+
+    parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index );
+
+    if ( lwfn_file_name[0] )
+    {
+      ResFileRefNum  res;
+
+
+      res = HomeResFile( fond );
+      if ( noErr != ResError() )
+        goto found_no_lwfn_file;
+
+      {
+        UInt8  path_fond[PATH_MAX];
+        FSRef  ref;
+
+
+        err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum,
+                               NULL, NULL, NULL, &ref, NULL );
+        if ( noErr != err )
+          goto found_no_lwfn_file;
+
+        err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) );
+        if ( noErr != err )
+          goto found_no_lwfn_file;
+
+        error = lookup_lwfn_by_fond( path_fond, lwfn_file_name,
+                                     path_lwfn, sizeof ( path_lwfn ) );
+        if ( !error )
+          have_lwfn = 1;
+      }
+    }
+
+    if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
+      error = FT_New_Face_From_LWFN( library,
+                                     path_lwfn,
+                                     face_index,
+                                     aface );
+    else
+      error = FT_THROW( Unknown_File_Format );
+
+  found_no_lwfn_file:
+    if ( have_sfnt && error )
+      error = FT_New_Face_From_SFNT( library,
+                                     sfnt_id,
+                                     face_index,
+                                     aface );
+
+    return error;
+  }
+
+
+  /* Common function to load a new FT_Face from a resource file. */
+  static FT_Error
+  FT_New_Face_From_Resource( FT_Library    library,
+                             const UInt8*  pathname,
+                             FT_Long       face_index,
+                             FT_Face*      aface )
+  {
+    OSType    file_type;
+    FT_Error  error;
+
+
+    /* LWFN is a (very) specific file format, check for it explicitly */
+    file_type = get_file_type_from_path( pathname );
+    if ( file_type == TTAG_LWFN )
+      return FT_New_Face_From_LWFN( library, pathname, face_index, aface );
+
+    /* Otherwise the file type doesn't matter (there are more than  */
+    /* `FFIL' and `tfil').  Just try opening it as a font suitcase; */
+    /* if it works, fine.                                           */
+
+    error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface );
+    if ( error == 0 )
+      return error;
+
+    /* let it fall through to normal loader (.ttf, .otf, etc.); */
+    /* we signal this by returning no error and no FT_Face      */
+    *aface = NULL;
+    return 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is the Mac-specific implementation of FT_New_Face.  In        */
+  /*    addition to the standard FT_New_Face() functionality, it also      */
+  /*    accepts pathnames to Mac suitcase files.  For further              */
+  /*    documentation see the original FT_New_Face() in freetype.h.        */
+  /*                                                                       */
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face( FT_Library   library,
+               const char*  pathname,
+               FT_Long      face_index,
+               FT_Face*     aface )
+  {
+    FT_Open_Args  args;
+    FT_Error      error;
+
+
+    /* test for valid `library' and `aface' delayed to FT_Open_Face() */
+    if ( !pathname )
+      return FT_THROW( Invalid_Argument );
+
+    error  = FT_Err_Ok;
+    *aface = NULL;
+
+    /* try resourcefork based font: LWFN, FFIL */
+    error = FT_New_Face_From_Resource( library, (UInt8 *)pathname,
+                                       face_index, aface );
+    if ( error != 0 || *aface != NULL )
+      return error;
+
+    /* let it fall through to normal loader (.ttf, .otf, etc.) */
+    args.flags    = FT_OPEN_PATHNAME;
+    args.pathname = (char*)pathname;
+    return FT_Open_Face( library, &args, face_index, aface );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FSRef                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FT_New_Face_From_FSRef is identical to FT_New_Face except it       */
+  /*    accepts an FSRef instead of a path.                                */
+  /*                                                                       */
+  /* This function is deprecated because Carbon data types (FSRef)         */
+  /* are not cross-platform, and thus not suitable for the freetype API.   */
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face_From_FSRef( FT_Library    library,
+                          const FSRef*  ref,
+                          FT_Long       face_index,
+                          FT_Face*      aface )
+  {
+    FT_Error      error;
+    FT_Open_Args  args;
+    OSErr   err;
+    UInt8   pathname[PATH_MAX];
+
+
+    if ( !ref )
+      return FT_THROW( Invalid_Argument );
+
+    err = FSRefMakePath( ref, pathname, sizeof ( pathname ) );
+    if ( err )
+      error = FT_THROW( Cannot_Open_Resource );
+
+    error = FT_New_Face_From_Resource( library, pathname, face_index, aface );
+    if ( error != 0 || *aface != NULL )
+      return error;
+
+    /* fallback to datafork font */
+    args.flags    = FT_OPEN_PATHNAME;
+    args.pathname = (char*)pathname;
+    return FT_Open_Face( library, &args, face_index, aface );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FSSpec                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FT_New_Face_From_FSSpec is identical to FT_New_Face except it      */
+  /*    accepts an FSSpec instead of a path.                               */
+  /*                                                                       */
+  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face_From_FSSpec( FT_Library     library,
+                           const FSSpec*  spec,
+                           FT_Long        face_index,
+                           FT_Face*       aface )
+  {
+#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \
+      ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )
+    FT_UNUSED( library );
+    FT_UNUSED( spec );
+    FT_UNUSED( face_index );
+    FT_UNUSED( aface );
+
+    return FT_THROW( Unimplemented_Feature );
+#else
+    FSRef  ref;
+
+
+    if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr )
+      return FT_THROW( Invalid_Argument );
+    else
+      return FT_New_Face_From_FSRef( library, &ref, face_index, aface );
+#endif
+  }
+
+#endif /* FT_MACINTOSH */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftobjs.c
new file mode 100644
index 0000000..96d460d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftobjs.c
@@ -0,0 +1,4867 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftobjs.c                                                               */
+/*                                                                         */
+/*    The FreeType private base classes (body).                            */
+/*                                                                         */
+/*  Copyright 1996-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftlist.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftvalid.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftrfork.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"    /* for SFNT_Load_Table_Func */
+#include "../../include/freetype/tttables.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ttnameid.h"
+
+#include "../../include/freetype/internal/services/svprop.h"
+#include "../../include/freetype/internal/services/svsfnt.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+#include "../../include/freetype/internal/services/svkern.h"
+#include "../../include/freetype/internal/services/svtteng.h"
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+#include "ftbase.h"
+#endif
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#include "../../include/freetype/ftbitmap.h"
+
+#if defined( _MSC_VER )      /* Visual C++ (and Intel C++)   */
+  /* We disable the warning `conversion from XXX to YYY,     */
+  /* possible loss of data' in order to compile cleanly with */
+  /* the maximum level of warnings: `md5.c' is non-FreeType  */
+  /* code, and it gets used during development builds only.  */
+#pragma warning( push )
+#pragma warning( disable : 4244 )
+#endif /* _MSC_VER */
+
+  /* it's easiest to include `md5.c' directly */
+#define free  md5_free /* suppress a shadow warning */
+#include "md5.c"
+#undef free
+
+#if defined( _MSC_VER )
+#pragma warning( pop )
+#endif
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+#define GRID_FIT_METRICS
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_service_list_lookup( FT_ServiceDesc  service_descriptors,
+                          const char*     service_id )
+  {
+    FT_Pointer      result = NULL;
+    FT_ServiceDesc  desc   = service_descriptors;
+
+
+    if ( desc && service_id )
+    {
+      for ( ; desc->serv_id != NULL; desc++ )
+      {
+        if ( ft_strcmp( desc->serv_id, service_id ) == 0 )
+        {
+          result = (FT_Pointer)desc->serv_data;
+          break;
+        }
+      }
+    }
+
+    return result;
+  }
+
+
+  FT_BASE_DEF( void )
+  ft_validator_init( FT_Validator        valid,
+                     const FT_Byte*      base,
+                     const FT_Byte*      limit,
+                     FT_ValidationLevel  level )
+  {
+    valid->base  = base;
+    valid->limit = limit;
+    valid->level = level;
+    valid->error = FT_Err_Ok;
+  }
+
+
+  FT_BASE_DEF( FT_Int )
+  ft_validator_run( FT_Validator  valid )
+  {
+    /* This function doesn't work!  None should call it. */
+    FT_UNUSED( valid );
+
+    return -1;
+  }
+
+
+  FT_BASE_DEF( void )
+  ft_validator_error( FT_Validator  valid,
+                      FT_Error      error )
+  {
+    /* since the cast below also disables the compiler's */
+    /* type check, we introduce a dummy variable, which  */
+    /* will be optimized away                            */
+    volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer;
+
+
+    valid->error = error;
+
+    /* throw away volatileness; use `jump_buffer' or the  */
+    /* compiler may warn about an unused local variable   */
+    ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                           S T R E A M                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* create a new input stream from an FT_Open_Args structure */
+  /*                                                          */
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_New( FT_Library           library,
+                 const FT_Open_Args*  args,
+                 FT_Stream           *astream )
+  {
+    FT_Error   error;
+    FT_Memory  memory;
+    FT_Stream  stream = NULL;
+
+
+    *astream = 0;
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    if ( !args )
+      return FT_THROW( Invalid_Argument );
+
+    memory = library->memory;
+
+    if ( FT_NEW( stream ) )
+      goto Exit;
+
+    stream->memory = memory;
+
+    if ( args->flags & FT_OPEN_MEMORY )
+    {
+      /* create a memory-based stream */
+      FT_Stream_OpenMemory( stream,
+                            (const FT_Byte*)args->memory_base,
+                            args->memory_size );
+    }
+
+#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT
+
+    else if ( args->flags & FT_OPEN_PATHNAME )
+    {
+      /* create a normal system stream */
+      error = FT_Stream_Open( stream, args->pathname );
+      stream->pathname.pointer = args->pathname;
+    }
+    else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream )
+    {
+      /* use an existing, user-provided stream */
+
+      /* in this case, we do not need to allocate a new stream object */
+      /* since the caller is responsible for closing it himself       */
+      FT_FREE( stream );
+      stream = args->stream;
+    }
+
+#endif
+
+    else
+      error = FT_THROW( Invalid_Argument );
+
+    if ( error )
+      FT_FREE( stream );
+    else
+      stream->memory = memory;  /* just to be certain */
+
+    *astream = stream;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Stream_Free( FT_Stream  stream,
+                  FT_Int     external )
+  {
+    if ( stream )
+    {
+      FT_Memory  memory = stream->memory;
+
+
+      FT_Stream_Close( stream );
+
+      if ( !external )
+        FT_FREE( stream );
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_objs
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****               FACE, SIZE & GLYPH SLOT OBJECTS                   ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  static FT_Error
+  ft_glyphslot_init( FT_GlyphSlot  slot )
+  {
+    FT_Driver         driver   = slot->face->driver;
+    FT_Driver_Class   clazz    = driver->clazz;
+    FT_Memory         memory   = driver->root.memory;
+    FT_Error          error    = FT_Err_Ok;
+    FT_Slot_Internal  internal = NULL;
+
+
+    slot->library = driver->root.library;
+
+    if ( FT_NEW( internal ) )
+      goto Exit;
+
+    slot->internal = internal;
+
+    if ( FT_DRIVER_USES_OUTLINES( driver ) )
+      error = FT_GlyphLoader_New( memory, &internal->loader );
+
+    if ( !error && clazz->init_slot )
+      error = clazz->init_slot( slot );
+
+  Exit:
+    return error;
+  }
+
+
+  FT_BASE_DEF( void )
+  ft_glyphslot_free_bitmap( FT_GlyphSlot  slot )
+  {
+    if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
+    {
+      FT_Memory  memory = FT_FACE_MEMORY( slot->face );
+
+
+      FT_FREE( slot->bitmap.buffer );
+      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+    }
+    else
+    {
+      /* assume that the bitmap buffer was stolen or not */
+      /* allocated from the heap                         */
+      slot->bitmap.buffer = NULL;
+    }
+  }
+
+
+  FT_BASE_DEF( void )
+  ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,
+                           FT_Byte*      buffer )
+  {
+    ft_glyphslot_free_bitmap( slot );
+
+    slot->bitmap.buffer = buffer;
+
+    FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,
+                             FT_ULong      size )
+  {
+    FT_Memory  memory = FT_FACE_MEMORY( slot->face );
+    FT_Error   error;
+
+
+    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+      FT_FREE( slot->bitmap.buffer );
+    else
+      slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+
+    (void)FT_ALLOC( slot->bitmap.buffer, size );
+    return error;
+  }
+
+
+  static void
+  ft_glyphslot_clear( FT_GlyphSlot  slot )
+  {
+    /* free bitmap if needed */
+    ft_glyphslot_free_bitmap( slot );
+
+    /* clear all public fields in the glyph slot */
+    FT_ZERO( &slot->metrics );
+    FT_ZERO( &slot->outline );
+
+    slot->bitmap.width      = 0;
+    slot->bitmap.rows       = 0;
+    slot->bitmap.pitch      = 0;
+    slot->bitmap.pixel_mode = 0;
+    /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */
+
+    slot->bitmap_left   = 0;
+    slot->bitmap_top    = 0;
+    slot->num_subglyphs = 0;
+    slot->subglyphs     = 0;
+    slot->control_data  = 0;
+    slot->control_len   = 0;
+    slot->other         = 0;
+    slot->format        = FT_GLYPH_FORMAT_NONE;
+
+    slot->linearHoriAdvance = 0;
+    slot->linearVertAdvance = 0;
+    slot->lsb_delta         = 0;
+    slot->rsb_delta         = 0;
+  }
+
+
+  static void
+  ft_glyphslot_done( FT_GlyphSlot  slot )
+  {
+    FT_Driver        driver = slot->face->driver;
+    FT_Driver_Class  clazz  = driver->clazz;
+    FT_Memory        memory = driver->root.memory;
+
+
+    if ( clazz->done_slot )
+      clazz->done_slot( slot );
+
+    /* free bitmap buffer if needed */
+    ft_glyphslot_free_bitmap( slot );
+
+    /* slot->internal might be NULL in out-of-memory situations */
+    if ( slot->internal )
+    {
+      /* free glyph loader */
+      if ( FT_DRIVER_USES_OUTLINES( driver ) )
+      {
+        FT_GlyphLoader_Done( slot->internal->loader );
+        slot->internal->loader = 0;
+      }
+
+      FT_FREE( slot->internal );
+    }
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Error )
+  FT_New_GlyphSlot( FT_Face        face,
+                    FT_GlyphSlot  *aslot )
+  {
+    FT_Error         error;
+    FT_Driver        driver;
+    FT_Driver_Class  clazz;
+    FT_Memory        memory;
+    FT_GlyphSlot     slot = NULL;
+
+
+    if ( !face || !face->driver )
+      return FT_THROW( Invalid_Argument );
+
+    driver = face->driver;
+    clazz  = driver->clazz;
+    memory = driver->root.memory;
+
+    FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" ));
+    if ( !FT_ALLOC( slot, clazz->slot_object_size ) )
+    {
+      slot->face = face;
+
+      error = ft_glyphslot_init( slot );
+      if ( error )
+      {
+        ft_glyphslot_done( slot );
+        FT_FREE( slot );
+        goto Exit;
+      }
+
+      slot->next  = face->glyph;
+      face->glyph = slot;
+
+      if ( aslot )
+        *aslot = slot;
+    }
+    else if ( aslot )
+      *aslot = 0;
+
+
+  Exit:
+    FT_TRACE4(( "FT_New_GlyphSlot: Return %d\n", error ));
+    return error;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( void )
+  FT_Done_GlyphSlot( FT_GlyphSlot  slot )
+  {
+    if ( slot )
+    {
+      FT_Driver     driver = slot->face->driver;
+      FT_Memory     memory = driver->root.memory;
+      FT_GlyphSlot  prev;
+      FT_GlyphSlot  cur;
+
+
+      /* Remove slot from its parent face's list */
+      prev = NULL;
+      cur  = slot->face->glyph;
+
+      while ( cur )
+      {
+        if ( cur == slot )
+        {
+          if ( !prev )
+            slot->face->glyph = cur->next;
+          else
+            prev->next = cur->next;
+
+          /* finalize client-specific data */
+          if ( slot->generic.finalizer )
+            slot->generic.finalizer( slot );
+
+          ft_glyphslot_done( slot );
+          FT_FREE( slot );
+          break;
+        }
+        prev = cur;
+        cur  = cur->next;
+      }
+    }
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Set_Transform( FT_Face     face,
+                    FT_Matrix*  matrix,
+                    FT_Vector*  delta )
+  {
+    FT_Face_Internal  internal;
+
+
+    if ( !face )
+      return;
+
+    internal = face->internal;
+
+    internal->transform_flags = 0;
+
+    if ( !matrix )
+    {
+      internal->transform_matrix.xx = 0x10000L;
+      internal->transform_matrix.xy = 0;
+      internal->transform_matrix.yx = 0;
+      internal->transform_matrix.yy = 0x10000L;
+      matrix = &internal->transform_matrix;
+    }
+    else
+      internal->transform_matrix = *matrix;
+
+    /* set transform_flags bit flag 0 if `matrix' isn't the identity */
+    if ( ( matrix->xy | matrix->yx ) ||
+         matrix->xx != 0x10000L      ||
+         matrix->yy != 0x10000L      )
+      internal->transform_flags |= 1;
+
+    if ( !delta )
+    {
+      internal->transform_delta.x = 0;
+      internal->transform_delta.y = 0;
+      delta = &internal->transform_delta;
+    }
+    else
+      internal->transform_delta = *delta;
+
+    /* set transform_flags bit flag 1 if `delta' isn't the null vector */
+    if ( delta->x | delta->y )
+      internal->transform_flags |= 2;
+  }
+
+
+  static FT_Renderer
+  ft_lookup_glyph_renderer( FT_GlyphSlot  slot );
+
+
+#ifdef GRID_FIT_METRICS
+  static void
+  ft_glyphslot_grid_fit_metrics( FT_GlyphSlot  slot,
+                                 FT_Bool       vertical )
+  {
+    FT_Glyph_Metrics*  metrics = &slot->metrics;
+    FT_Pos             right, bottom;
+
+
+    if ( vertical )
+    {
+      metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
+      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
+
+      right  = FT_PIX_CEIL( metrics->vertBearingX + metrics->width );
+      bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height );
+
+      metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );
+      metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );
+
+      metrics->width  = right - metrics->vertBearingX;
+      metrics->height = bottom - metrics->vertBearingY;
+    }
+    else
+    {
+      metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );
+      metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );
+
+      right  = FT_PIX_CEIL ( metrics->horiBearingX + metrics->width );
+      bottom = FT_PIX_FLOOR( metrics->horiBearingY - metrics->height );
+
+      metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
+      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
+
+      metrics->width  = right - metrics->horiBearingX;
+      metrics->height = metrics->horiBearingY - bottom;
+    }
+
+    metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );
+    metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );
+  }
+#endif /* GRID_FIT_METRICS */
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Load_Glyph( FT_Face   face,
+                 FT_UInt   glyph_index,
+                 FT_Int32  load_flags )
+  {
+    FT_Error      error;
+    FT_Driver     driver;
+    FT_GlyphSlot  slot;
+    FT_Library    library;
+    FT_Bool       autohint = FALSE;
+    FT_Module     hinter;
+    TT_Face       ttface = (TT_Face)face;
+
+
+    if ( !face || !face->size || !face->glyph )
+      return FT_THROW( Invalid_Face_Handle );
+
+    /* The validity test for `glyph_index' is performed by the */
+    /* font drivers.                                           */
+
+    slot = face->glyph;
+    ft_glyphslot_clear( slot );
+
+    driver  = face->driver;
+    library = driver->root.library;
+    hinter  = library->auto_hinter;
+
+    /* resolve load flags dependencies */
+
+    if ( load_flags & FT_LOAD_NO_RECURSE )
+      load_flags |= FT_LOAD_NO_SCALE         |
+                    FT_LOAD_IGNORE_TRANSFORM;
+
+    if ( load_flags & FT_LOAD_NO_SCALE )
+    {
+      load_flags |= FT_LOAD_NO_HINTING |
+                    FT_LOAD_NO_BITMAP;
+
+      load_flags &= ~FT_LOAD_RENDER;
+    }
+
+    /*
+     * Determine whether we need to auto-hint or not.
+     * The general rules are:
+     *
+     * - Do only auto-hinting if we have a hinter module, a scalable font
+     *   format dealing with outlines, and no transforms except simple
+     *   slants and/or rotations by integer multiples of 90 degrees.
+     *
+     * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't
+     *   have a native font hinter.
+     *
+     * - Otherwise, auto-hint for LIGHT hinting mode or if there isn't
+     *   any hinting bytecode in the TrueType/OpenType font.
+     *
+     * - Exception: The font is `tricky' and requires the native hinter to
+     *   load properly.
+     */
+
+    if ( hinter                                           &&
+         !( load_flags & FT_LOAD_NO_HINTING )             &&
+         !( load_flags & FT_LOAD_NO_AUTOHINT )            &&
+         FT_DRIVER_IS_SCALABLE( driver )                  &&
+         FT_DRIVER_USES_OUTLINES( driver )                &&
+         !FT_IS_TRICKY( face )                            &&
+         ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM )    ||
+           ( face->internal->transform_matrix.yx == 0 &&
+             face->internal->transform_matrix.xx != 0 ) ||
+           ( face->internal->transform_matrix.xx == 0 &&
+             face->internal->transform_matrix.yx != 0 ) ) )
+    {
+      if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) ||
+           !FT_DRIVER_HAS_HINTER( driver )         )
+        autohint = TRUE;
+      else
+      {
+        FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );
+
+
+        /* the check for `num_locations' assures that we actually    */
+        /* test for instructions in a TTF and not in a CFF-based OTF */
+        if ( mode == FT_RENDER_MODE_LIGHT                       ||
+             face->internal->ignore_unpatented_hinter           ||
+             ( FT_IS_SFNT( face )                             &&
+               ttface->num_locations                          &&
+               ttface->max_profile.maxSizeOfInstructions == 0 ) )
+          autohint = TRUE;
+      }
+    }
+
+    if ( autohint )
+    {
+      FT_AutoHinter_Interface  hinting;
+
+
+      /* try to load embedded bitmaps first if available            */
+      /*                                                            */
+      /* XXX: This is really a temporary hack that should disappear */
+      /*      promptly with FreeType 2.1!                           */
+      /*                                                            */
+      if ( FT_HAS_FIXED_SIZES( face )             &&
+          ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+      {
+        error = driver->clazz->load_glyph( slot, face->size,
+                                           glyph_index,
+                                           load_flags | FT_LOAD_SBITS_ONLY );
+
+        if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP )
+          goto Load_Ok;
+      }
+
+      {
+        FT_Face_Internal  internal        = face->internal;
+        FT_Int            transform_flags = internal->transform_flags;
+
+
+        /* since the auto-hinter calls FT_Load_Glyph by itself, */
+        /* make sure that glyphs aren't transformed             */
+        internal->transform_flags = 0;
+
+        /* load auto-hinted outline */
+        hinting = (FT_AutoHinter_Interface)hinter->clazz->module_interface;
+
+        error   = hinting->load_glyph( (FT_AutoHinter)hinter,
+                                       slot, face->size,
+                                       glyph_index, load_flags );
+
+        internal->transform_flags = transform_flags;
+      }
+    }
+    else
+    {
+      error = driver->clazz->load_glyph( slot,
+                                         face->size,
+                                         glyph_index,
+                                         load_flags );
+      if ( error )
+        goto Exit;
+
+      if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+      {
+        /* check that the loaded outline is correct */
+        error = FT_Outline_Check( &slot->outline );
+        if ( error )
+          goto Exit;
+
+#ifdef GRID_FIT_METRICS
+        if ( !( load_flags & FT_LOAD_NO_HINTING ) )
+          ft_glyphslot_grid_fit_metrics( slot,
+              FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) );
+#endif
+      }
+    }
+
+  Load_Ok:
+    /* compute the advance */
+    if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+    {
+      slot->advance.x = 0;
+      slot->advance.y = slot->metrics.vertAdvance;
+    }
+    else
+    {
+      slot->advance.x = slot->metrics.horiAdvance;
+      slot->advance.y = 0;
+    }
+
+    /* compute the linear advance in 16.16 pixels */
+    if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 &&
+         ( FT_IS_SCALABLE( face ) )                  )
+    {
+      FT_Size_Metrics*  metrics = &face->size->metrics;
+
+
+      /* it's tricky! */
+      slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance,
+                                           metrics->x_scale, 64 );
+
+      slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance,
+                                           metrics->y_scale, 64 );
+    }
+
+    if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 )
+    {
+      FT_Face_Internal  internal = face->internal;
+
+
+      /* now, transform the glyph image if needed */
+      if ( internal->transform_flags )
+      {
+        /* get renderer */
+        FT_Renderer  renderer = ft_lookup_glyph_renderer( slot );
+
+
+        if ( renderer )
+          error = renderer->clazz->transform_glyph(
+                                     renderer, slot,
+                                     &internal->transform_matrix,
+                                     &internal->transform_delta );
+        else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+        {
+          /* apply `standard' transformation if no renderer is available */
+          if ( internal->transform_flags & 1 )
+            FT_Outline_Transform( &slot->outline,
+                                  &internal->transform_matrix );
+
+          if ( internal->transform_flags & 2 )
+            FT_Outline_Translate( &slot->outline,
+                                  internal->transform_delta.x,
+                                  internal->transform_delta.y );
+        }
+
+        /* transform advance */
+        FT_Vector_Transform( &slot->advance, &internal->transform_matrix );
+      }
+    }
+
+    FT_TRACE5(( "  x advance: %d\n" , slot->advance.x ));
+    FT_TRACE5(( "  y advance: %d\n" , slot->advance.y ));
+
+    FT_TRACE5(( "  linear x advance: %d\n" , slot->linearHoriAdvance ));
+    FT_TRACE5(( "  linear y advance: %d\n" , slot->linearVertAdvance ));
+
+    /* do we need to render the image now? */
+    if ( !error                                    &&
+         slot->format != FT_GLYPH_FORMAT_BITMAP    &&
+         slot->format != FT_GLYPH_FORMAT_COMPOSITE &&
+         load_flags & FT_LOAD_RENDER )
+    {
+      FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );
+
+
+      if ( mode == FT_RENDER_MODE_NORMAL      &&
+           (load_flags & FT_LOAD_MONOCHROME ) )
+        mode = FT_RENDER_MODE_MONO;
+
+      error = FT_Render_Glyph( slot, mode );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Load_Char( FT_Face   face,
+                FT_ULong  char_code,
+                FT_Int32  load_flags )
+  {
+    FT_UInt  glyph_index;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    glyph_index = (FT_UInt)char_code;
+    if ( face->charmap )
+      glyph_index = FT_Get_Char_Index( face, char_code );
+
+    return FT_Load_Glyph( face, glyph_index, load_flags );
+  }
+
+
+  /* destructor for sizes list */
+  static void
+  destroy_size( FT_Memory  memory,
+                FT_Size    size,
+                FT_Driver  driver )
+  {
+    /* finalize client-specific data */
+    if ( size->generic.finalizer )
+      size->generic.finalizer( size );
+
+    /* finalize format-specific stuff */
+    if ( driver->clazz->done_size )
+      driver->clazz->done_size( size );
+
+    FT_FREE( size->internal );
+    FT_FREE( size );
+  }
+
+
+  static void
+  ft_cmap_done_internal( FT_CMap  cmap );
+
+
+  static void
+  destroy_charmaps( FT_Face    face,
+                    FT_Memory  memory )
+  {
+    FT_Int  n;
+
+
+    if ( !face )
+      return;
+
+    for ( n = 0; n < face->num_charmaps; n++ )
+    {
+      FT_CMap  cmap = FT_CMAP( face->charmaps[n] );
+
+
+      ft_cmap_done_internal( cmap );
+
+      face->charmaps[n] = NULL;
+    }
+
+    FT_FREE( face->charmaps );
+    face->num_charmaps = 0;
+  }
+
+
+  /* destructor for faces list */
+  static void
+  destroy_face( FT_Memory  memory,
+                FT_Face    face,
+                FT_Driver  driver )
+  {
+    FT_Driver_Class  clazz = driver->clazz;
+
+
+    /* discard auto-hinting data */
+    if ( face->autohint.finalizer )
+      face->autohint.finalizer( face->autohint.data );
+
+    /* Discard glyph slots for this face.                           */
+    /* Beware!  FT_Done_GlyphSlot() changes the field `face->glyph' */
+    while ( face->glyph )
+      FT_Done_GlyphSlot( face->glyph );
+
+    /* discard all sizes for this face */
+    FT_List_Finalize( &face->sizes_list,
+                      (FT_List_Destructor)destroy_size,
+                      memory,
+                      driver );
+    face->size = 0;
+
+    /* now discard client data */
+    if ( face->generic.finalizer )
+      face->generic.finalizer( face );
+
+    /* discard charmaps */
+    destroy_charmaps( face, memory );
+
+    /* finalize format-specific stuff */
+    if ( clazz->done_face )
+      clazz->done_face( face );
+
+    /* close the stream for this face if needed */
+    FT_Stream_Free(
+      face->stream,
+      ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 );
+
+    face->stream = 0;
+
+    /* get rid of it */
+    if ( face->internal )
+    {
+      FT_FREE( face->internal );
+    }
+    FT_FREE( face );
+  }
+
+
+  static void
+  Destroy_Driver( FT_Driver  driver )
+  {
+    FT_List_Finalize( &driver->faces_list,
+                      (FT_List_Destructor)destroy_face,
+                      driver->root.memory,
+                      driver );
+
+    /* check whether we need to drop the driver's glyph loader */
+    if ( FT_DRIVER_USES_OUTLINES( driver ) )
+      FT_GlyphLoader_Done( driver->glyph_loader );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    find_unicode_charmap                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function finds a Unicode charmap, if there is one.            */
+  /*    And if there is more than one, it tries to favour the more         */
+  /*    extensive one, i.e., one that supports UCS-4 against those which   */
+  /*    are limited to the BMP (said UCS-2 encoding.)                      */
+  /*                                                                       */
+  /*    This function is called from open_face() (just below), and also    */
+  /*    from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ).                */
+  /*                                                                       */
+  static FT_Error
+  find_unicode_charmap( FT_Face  face )
+  {
+    FT_CharMap*  first;
+    FT_CharMap*  cur;
+
+
+    /* caller should have already checked that `face' is valid */
+    FT_ASSERT( face );
+
+    first = face->charmaps;
+
+    if ( !first )
+      return FT_THROW( Invalid_CharMap_Handle );
+
+    /*
+     *  The original TrueType specification(s) only specified charmap
+     *  formats that are capable of mapping 8 or 16 bit character codes to
+     *  glyph indices.
+     *
+     *  However, recent updates to the Apple and OpenType specifications
+     *  introduced new formats that are capable of mapping 32-bit character
+     *  codes as well.  And these are already used on some fonts, mainly to
+     *  map non-BMP Asian ideographs as defined in Unicode.
+     *
+     *  For compatibility purposes, these fonts generally come with
+     *  *several* Unicode charmaps:
+     *
+     *   - One of them in the "old" 16-bit format, that cannot access
+     *     all glyphs in the font.
+     *
+     *   - Another one in the "new" 32-bit format, that can access all
+     *     the glyphs.
+     *
+     *  This function has been written to always favor a 32-bit charmap
+     *  when found.  Otherwise, a 16-bit one is returned when found.
+     */
+
+    /* Since the `interesting' table, with IDs (3,10), is normally the */
+    /* last one, we loop backwards.  This loses with type1 fonts with  */
+    /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP  */
+    /* chars (.01% ?), and this is the same about 99.99% of the time!  */
+
+    cur = first + face->num_charmaps;  /* points after the last one */
+
+    for ( ; --cur >= first; )
+    {
+      if ( cur[0]->encoding == FT_ENCODING_UNICODE )
+      {
+        /* XXX If some new encodings to represent UCS-4 are added, */
+        /*     they should be added here.                          */
+        if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT &&
+               cur[0]->encoding_id == TT_MS_ID_UCS_4        )     ||
+             ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&
+               cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32    ) )
+        {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+          if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )
+          {
+            FT_ERROR(( "find_unicode_charmap: UCS-4 cmap is found "
+                       "at too late position (%d)\n", cur - first ));
+            continue;
+          }
+#endif
+          face->charmap = cur[0];
+          return FT_Err_Ok;
+        }
+      }
+    }
+
+    /* We do not have any UCS-4 charmap.                */
+    /* Do the loop again and search for UCS-2 charmaps. */
+    cur = first + face->num_charmaps;
+
+    for ( ; --cur >= first; )
+    {
+      if ( cur[0]->encoding == FT_ENCODING_UNICODE )
+      {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+        if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )
+        {
+          FT_ERROR(( "find_unicode_charmap: UCS-2 cmap is found "
+                     "at too late position (%d)\n", cur - first ));
+          continue;
+        }
+#endif
+        face->charmap = cur[0];
+        return FT_Err_Ok;
+      }
+    }
+
+    return FT_THROW( Invalid_CharMap_Handle );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    find_variant_selector_charmap                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function finds the variant selector charmap, if there is one. */
+  /*    There can only be one (platform=0, specific=5, format=14).         */
+  /*                                                                       */
+  static FT_CharMap
+  find_variant_selector_charmap( FT_Face  face )
+  {
+    FT_CharMap*  first;
+    FT_CharMap*  end;
+    FT_CharMap*  cur;
+
+
+    /* caller should have already checked that `face' is valid */
+    FT_ASSERT( face );
+
+    first = face->charmaps;
+
+    if ( !first )
+      return NULL;
+
+    end = first + face->num_charmaps;  /* points after the last one */
+
+    for ( cur = first; cur < end; ++cur )
+    {
+      if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE    &&
+           cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR &&
+           FT_Get_CMap_Format( cur[0] ) == 14                  )
+      {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+        if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )
+        {
+          FT_ERROR(( "find_unicode_charmap: UVS cmap is found "
+                     "at too late position (%d)\n", cur - first ));
+          continue;
+        }
+#endif
+        return cur[0];
+      }
+    }
+
+    return NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    open_face                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function does some work for FT_Open_Face().                   */
+  /*                                                                       */
+  static FT_Error
+  open_face( FT_Driver      driver,
+             FT_Stream      stream,
+             FT_Long        face_index,
+             FT_Int         num_params,
+             FT_Parameter*  params,
+             FT_Face       *aface )
+  {
+    FT_Memory         memory;
+    FT_Driver_Class   clazz;
+    FT_Face           face = 0;
+    FT_Error          error, error2;
+    FT_Face_Internal  internal = NULL;
+
+
+    clazz  = driver->clazz;
+    memory = driver->root.memory;
+
+    /* allocate the face object and perform basic initialization */
+    if ( FT_ALLOC( face, clazz->face_object_size ) )
+      goto Fail;
+
+    face->driver = driver;
+    face->memory = memory;
+    face->stream = stream;
+
+    if ( FT_NEW( internal ) )
+      goto Fail;
+
+    face->internal = internal;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    {
+      int  i;
+
+
+      face->internal->incremental_interface = 0;
+      for ( i = 0; i < num_params && !face->internal->incremental_interface;
+            i++ )
+        if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL )
+          face->internal->incremental_interface =
+            (FT_Incremental_Interface)params[i].data;
+    }
+#endif
+
+    if ( clazz->init_face )
+      error = clazz->init_face( stream,
+                                face,
+                                (FT_Int)face_index,
+                                num_params,
+                                params );
+    if ( error )
+      goto Fail;
+
+    /* select Unicode charmap by default */
+    error2 = find_unicode_charmap( face );
+
+    /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */
+    /* is returned.                                                      */
+
+    /* no error should happen, but we want to play safe */
+    if ( error2 && FT_ERR_NEQ( error2, Invalid_CharMap_Handle ) )
+    {
+      error = error2;
+      goto Fail;
+    }
+
+    *aface = face;
+
+  Fail:
+    if ( error )
+    {
+      destroy_charmaps( face, memory );
+      if ( clazz->done_face )
+        clazz->done_face( face );
+      FT_FREE( internal );
+      FT_FREE( face );
+      *aface = 0;
+    }
+
+    return error;
+  }
+
+
+  /* there's a Mac-specific extended implementation of FT_New_Face() */
+  /* in src/base/ftmac.c                                             */
+
+//#ifndef FT_MACINTOSH
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face( FT_Library   library,
+               const char*  pathname,
+               FT_Long      face_index,
+               FT_Face     *aface )
+  {
+    FT_Open_Args  args;
+
+
+    /* test for valid `library' and `aface' delayed to FT_Open_Face() */
+    if ( !pathname )
+      return FT_THROW( Invalid_Argument );
+
+    args.flags    = FT_OPEN_PATHNAME;
+    args.pathname = (char*)pathname;
+    args.stream   = NULL;
+
+    return FT_Open_Face( library, &args, face_index, aface );
+  }
+
+//#endif
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Memory_Face( FT_Library      library,
+                      const FT_Byte*  file_base,
+                      FT_Long         file_size,
+                      FT_Long         face_index,
+                      FT_Face        *aface )
+  {
+    FT_Open_Args  args;
+
+
+    /* test for valid `library' and `face' delayed to FT_Open_Face() */
+    if ( !file_base )
+      return FT_THROW( Invalid_Argument );
+
+    args.flags       = FT_OPEN_MEMORY;
+    args.memory_base = file_base;
+    args.memory_size = file_size;
+    args.stream      = NULL;
+
+    return FT_Open_Face( library, &args, face_index, aface );
+  }
+
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+
+  /* The behavior here is very similar to that in base/ftmac.c, but it     */
+  /* is designed to work on non-mac systems, so no mac specific calls.     */
+  /*                                                                       */
+  /* We look at the file and determine if it is a mac dfont file or a mac  */
+  /* resource file, or a macbinary file containing a mac resource file.    */
+  /*                                                                       */
+  /* Unlike ftmac I'm not going to look at a `FOND'.  I don't really see   */
+  /* the point, especially since there may be multiple `FOND' resources.   */
+  /* Instead I'll just look for `sfnt' and `POST' resources, ordered as    */
+  /* they occur in the file.                                               */
+  /*                                                                       */
+  /* Note that multiple `POST' resources do not mean multiple postscript   */
+  /* fonts; they all get jammed together to make what is essentially a     */
+  /* pfb file.                                                             */
+  /*                                                                       */
+  /* We aren't interested in `NFNT' or `FONT' bitmap resources.            */
+  /*                                                                       */
+  /* As soon as we get an `sfnt' load it into memory and pass it off to    */
+  /* FT_Open_Face.                                                         */
+  /*                                                                       */
+  /* If we have a (set of) `POST' resources, massage them into a (memory)  */
+  /* pfb file and pass that to FT_Open_Face.  (As with ftmac.c I'm not     */
+  /* going to try to save the kerning info.  After all that lives in the   */
+  /* `FOND' which isn't in the file containing the `POST' resources so     */
+  /* we don't really have access to it.                                    */
+
+
+  /* Finalizer for a memory stream; gets called by FT_Done_Face(). */
+  /* It frees the memory it uses.                                  */
+  /* From ftmac.c.                                                 */
+  static void
+  memory_stream_close( FT_Stream  stream )
+  {
+    FT_Memory  memory = stream->memory;
+
+
+    FT_FREE( stream->base );
+
+    stream->size  = 0;
+    stream->base  = 0;
+    stream->close = 0;
+  }
+
+
+  /* Create a new memory stream from a buffer and a size. */
+  /* From ftmac.c.                                        */
+  static FT_Error
+  new_memory_stream( FT_Library           library,
+                     FT_Byte*             base,
+                     FT_ULong             size,
+                     FT_Stream_CloseFunc  close,
+                     FT_Stream           *astream )
+  {
+    FT_Error   error;
+    FT_Memory  memory;
+    FT_Stream  stream = NULL;
+
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    if ( !base )
+      return FT_THROW( Invalid_Argument );
+
+    *astream = 0;
+    memory = library->memory;
+    if ( FT_NEW( stream ) )
+      goto Exit;
+
+    FT_Stream_OpenMemory( stream, base, size );
+
+    stream->close = close;
+
+    *astream = stream;
+
+  Exit:
+    return error;
+  }
+
+
+  /* Create a new FT_Face given a buffer and a driver name. */
+  /* from ftmac.c */
+  FT_LOCAL_DEF( FT_Error )
+  open_face_from_buffer( FT_Library   library,
+                         FT_Byte*     base,
+                         FT_ULong     size,
+                         FT_Long      face_index,
+                         const char*  driver_name,
+                         FT_Face     *aface )
+  {
+    FT_Open_Args  args;
+    FT_Error      error;
+    FT_Stream     stream = NULL;
+    FT_Memory     memory = library->memory;
+
+
+    error = new_memory_stream( library,
+                               base,
+                               size,
+                               memory_stream_close,
+                               &stream );
+    if ( error )
+    {
+      FT_FREE( base );
+      return error;
+    }
+
+    args.flags = FT_OPEN_STREAM;
+    args.stream = stream;
+    if ( driver_name )
+    {
+      args.flags = args.flags | FT_OPEN_DRIVER;
+      args.driver = FT_Get_Module( library, driver_name );
+    }
+
+#ifdef FT_MACINTOSH
+    /* At this point, face_index has served its purpose;      */
+    /* whoever calls this function has already used it to     */
+    /* locate the correct font data.  We should not propagate */
+    /* this index to FT_Open_Face() (unless it is negative).  */
+
+    if ( face_index > 0 )
+      face_index = 0;
+#endif
+
+    error = FT_Open_Face( library, &args, face_index, aface );
+
+    if ( error == FT_Err_Ok )
+      (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;
+    else
+#ifdef FT_MACINTOSH
+      FT_Stream_Free( stream, 0 );
+#else
+    {
+      FT_Stream_Close( stream );
+      FT_FREE( stream );
+    }
+#endif
+
+    return error;
+  }
+
+
+  /* Look up `TYP1' or `CID ' table from sfnt table directory.       */
+  /* `offset' and `length' must exclude the binary header in tables. */
+
+  /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */
+  /* format too.  Here, since we can't expect that the TrueType font */
+  /* driver is loaded unconditially, we must parse the font by       */
+  /* ourselves.  We are only interested in the name of the table and */
+  /* the offset.                                                     */
+
+  static FT_Error
+  ft_lookup_PS_in_sfnt_stream( FT_Stream  stream,
+                               FT_Long    face_index,
+                               FT_ULong*  offset,
+                               FT_ULong*  length,
+                               FT_Bool*   is_sfnt_cid )
+  {
+    FT_Error   error;
+    FT_UShort  numTables;
+    FT_Long    pstable_index;
+    FT_ULong   tag;
+    int        i;
+
+
+    *offset = 0;
+    *length = 0;
+    *is_sfnt_cid = FALSE;
+
+    /* TODO: support for sfnt-wrapped PS/CID in TTC format */
+
+    /* version check for 'typ1' (should be ignored?) */
+    if ( FT_READ_ULONG( tag ) )
+      return error;
+    if ( tag != TTAG_typ1 )
+      return FT_THROW( Unknown_File_Format );
+
+    if ( FT_READ_USHORT( numTables ) )
+      return error;
+    if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */
+      return error;
+
+    pstable_index = -1;
+    *is_sfnt_cid  = FALSE;
+
+    for ( i = 0; i < numTables; i++ )
+    {
+      if ( FT_READ_ULONG( tag )     || FT_STREAM_SKIP( 4 )      ||
+           FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) )
+        return error;
+
+      if ( tag == TTAG_CID )
+      {
+        pstable_index++;
+        *offset += 22;
+        *length -= 22;
+        *is_sfnt_cid = TRUE;
+        if ( face_index < 0 )
+          return FT_Err_Ok;
+      }
+      else if ( tag == TTAG_TYP1 )
+      {
+        pstable_index++;
+        *offset += 24;
+        *length -= 24;
+        *is_sfnt_cid = FALSE;
+        if ( face_index < 0 )
+          return FT_Err_Ok;
+      }
+      if ( face_index >= 0 && pstable_index == face_index )
+        return FT_Err_Ok;
+    }
+    return FT_THROW( Table_Missing );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  open_face_PS_from_sfnt_stream( FT_Library     library,
+                                 FT_Stream      stream,
+                                 FT_Long        face_index,
+                                 FT_Int         num_params,
+                                 FT_Parameter  *params,
+                                 FT_Face       *aface )
+  {
+    FT_Error   error;
+    FT_Memory  memory = library->memory;
+    FT_ULong   offset, length;
+    FT_Long    pos;
+    FT_Bool    is_sfnt_cid;
+    FT_Byte*   sfnt_ps = NULL;
+
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+
+
+    pos = FT_Stream_Pos( stream );
+
+    error = ft_lookup_PS_in_sfnt_stream( stream,
+                                         face_index,
+                                         &offset,
+                                         &length,
+                                         &is_sfnt_cid );
+    if ( error )
+      goto Exit;
+
+    if ( FT_Stream_Seek( stream, pos + offset ) )
+      goto Exit;
+
+    if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) )
+      goto Exit;
+
+    error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length );
+    if ( error )
+      goto Exit;
+
+    error = open_face_from_buffer( library,
+                                   sfnt_ps,
+                                   length,
+                                   FT_MIN( face_index, 0 ),
+                                   is_sfnt_cid ? "cid" : "type1",
+                                   aface );
+  Exit:
+    {
+      FT_Error  error1;
+
+
+      if ( FT_ERR_EQ( error, Unknown_File_Format ) )
+      {
+        error1 = FT_Stream_Seek( stream, pos );
+        if ( error1 )
+          return error1;
+      }
+
+      return error;
+    }
+  }
+
+
+#ifndef FT_MACINTOSH
+
+  /* The resource header says we've got resource_cnt `POST' (type1) */
+  /* resources in this file.  They all need to be coalesced into    */
+  /* one lump which gets passed on to the type1 driver.             */
+  /* Here can be only one PostScript font in a file so face_index   */
+  /* must be 0 (or -1).                                             */
+  /*                                                                */
+  static FT_Error
+  Mac_Read_POST_Resource( FT_Library  library,
+                          FT_Stream   stream,
+                          FT_Long    *offsets,
+                          FT_Long     resource_cnt,
+                          FT_Long     face_index,
+                          FT_Face    *aface )
+  {
+    FT_Error   error  = FT_ERR( Cannot_Open_Resource );
+    FT_Memory  memory = library->memory;
+    FT_Byte*   pfb_data = NULL;
+    int        i, type, flags;
+    FT_Long    len;
+    FT_Long    pfb_len, pfb_pos, pfb_lenpos;
+    FT_Long    rlen, temp;
+
+
+    if ( face_index == -1 )
+      face_index = 0;
+    if ( face_index != 0 )
+      return error;
+
+    /* Find the length of all the POST resources, concatenated.  Assume */
+    /* worst case (each resource in its own section).                   */
+    pfb_len = 0;
+    for ( i = 0; i < resource_cnt; ++i )
+    {
+      error = FT_Stream_Seek( stream, offsets[i] );
+      if ( error )
+        goto Exit;
+      if ( FT_READ_LONG( temp ) )
+        goto Exit;
+      pfb_len += temp + 6;
+    }
+
+    if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) )
+      goto Exit;
+
+    pfb_data[0] = 0x80;
+    pfb_data[1] = 1;            /* Ascii section */
+    pfb_data[2] = 0;            /* 4-byte length, fill in later */
+    pfb_data[3] = 0;
+    pfb_data[4] = 0;
+    pfb_data[5] = 0;
+    pfb_pos     = 6;
+    pfb_lenpos  = 2;
+
+    len = 0;
+    type = 1;
+    for ( i = 0; i < resource_cnt; ++i )
+    {
+      error = FT_Stream_Seek( stream, offsets[i] );
+      if ( error )
+        goto Exit2;
+      if ( FT_READ_LONG( rlen ) )
+        goto Exit;
+      if ( FT_READ_USHORT( flags ) )
+        goto Exit;
+      FT_TRACE3(( "POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n",
+                   i, offsets[i], rlen, flags ));
+
+      /* postpone the check of rlen longer than buffer until FT_Stream_Read() */
+      if ( ( flags >> 8 ) == 0 )        /* Comment, should not be loaded */
+        continue;
+
+      /* the flags are part of the resource, so rlen >= 2.  */
+      /* but some fonts declare rlen = 0 for empty fragment */
+      if ( rlen > 2 )
+        rlen -= 2;
+      else
+        rlen = 0;
+
+      if ( ( flags >> 8 ) == type )
+        len += rlen;
+      else
+      {
+        if ( pfb_lenpos + 3 > pfb_len + 2 )
+          goto Exit2;
+        pfb_data[pfb_lenpos    ] = (FT_Byte)( len );
+        pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );
+        pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );
+        pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );
+
+        if ( ( flags >> 8 ) == 5 )      /* End of font mark */
+          break;
+
+        if ( pfb_pos + 6 > pfb_len + 2 )
+          goto Exit2;
+        pfb_data[pfb_pos++] = 0x80;
+
+        type = flags >> 8;
+        len = rlen;
+
+        pfb_data[pfb_pos++] = (FT_Byte)type;
+        pfb_lenpos          = pfb_pos;
+        pfb_data[pfb_pos++] = 0;        /* 4-byte length, fill in later */
+        pfb_data[pfb_pos++] = 0;
+        pfb_data[pfb_pos++] = 0;
+        pfb_data[pfb_pos++] = 0;
+      }
+
+      error = FT_ERR( Cannot_Open_Resource );
+      if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len )
+        goto Exit2;
+
+      error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen );
+      if ( error )
+        goto Exit2;
+      pfb_pos += rlen;
+    }
+
+    if ( pfb_pos + 2 > pfb_len + 2 )
+      goto Exit2;
+    pfb_data[pfb_pos++] = 0x80;
+    pfb_data[pfb_pos++] = 3;
+
+    if ( pfb_lenpos + 3 > pfb_len + 2 )
+      goto Exit2;
+    pfb_data[pfb_lenpos    ] = (FT_Byte)( len );
+    pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );
+    pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );
+    pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );
+
+    return open_face_from_buffer( library,
+                                  pfb_data,
+                                  pfb_pos,
+                                  face_index,
+                                  "type1",
+                                  aface );
+
+  Exit2:
+    FT_FREE( pfb_data );
+
+  Exit:
+    return error;
+  }
+
+
+  /* The resource header says we've got resource_cnt `sfnt'      */
+  /* (TrueType/OpenType) resources in this file.  Look through   */
+  /* them for the one indicated by face_index, load it into mem, */
+  /* pass it on the the truetype driver and return it.           */
+  /*                                                             */
+  static FT_Error
+  Mac_Read_sfnt_Resource( FT_Library  library,
+                          FT_Stream   stream,
+                          FT_Long    *offsets,
+                          FT_Long     resource_cnt,
+                          FT_Long     face_index,
+                          FT_Face    *aface )
+  {
+    FT_Memory  memory = library->memory;
+    FT_Byte*   sfnt_data = NULL;
+    FT_Error   error;
+    FT_Long    flag_offset;
+    FT_Long    rlen;
+    int        is_cff;
+    FT_Long    face_index_in_resource = 0;
+
+
+    if ( face_index == -1 )
+      face_index = 0;
+    if ( face_index >= resource_cnt )
+      return FT_THROW( Cannot_Open_Resource );
+
+    flag_offset = offsets[face_index];
+    error = FT_Stream_Seek( stream, flag_offset );
+    if ( error )
+      goto Exit;
+
+    if ( FT_READ_LONG( rlen ) )
+      goto Exit;
+    if ( rlen == -1 )
+      return FT_THROW( Cannot_Open_Resource );
+
+    error = open_face_PS_from_sfnt_stream( library,
+                                           stream,
+                                           face_index,
+                                           0, NULL,
+                                           aface );
+    if ( !error )
+      goto Exit;
+
+    /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */
+    if ( FT_Stream_Seek( stream, flag_offset + 4 ) )
+      goto Exit;
+
+    if ( FT_ALLOC( sfnt_data, (FT_Long)rlen ) )
+      return error;
+    error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, rlen );
+    if ( error )
+      goto Exit;
+
+    is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 );
+    error = open_face_from_buffer( library,
+                                   sfnt_data,
+                                   rlen,
+                                   face_index_in_resource,
+                                   is_cff ? "cff" : "truetype",
+                                   aface );
+
+  Exit:
+    return error;
+  }
+
+
+  /* Check for a valid resource fork header, or a valid dfont    */
+  /* header.  In a resource fork the first 16 bytes are repeated */
+  /* at the location specified by bytes 4-7.  In a dfont bytes   */
+  /* 4-7 point to 16 bytes of zeroes instead.                    */
+  /*                                                             */
+  static FT_Error
+  IsMacResource( FT_Library  library,
+                 FT_Stream   stream,
+                 FT_Long     resource_offset,
+                 FT_Long     face_index,
+                 FT_Face    *aface )
+  {
+    FT_Memory  memory = library->memory;
+    FT_Error   error;
+    FT_Long    map_offset, rdara_pos;
+    FT_Long    *data_offsets;
+    FT_Long    count;
+
+
+    error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset,
+                                       &map_offset, &rdara_pos );
+    if ( error )
+      return error;
+
+    error = FT_Raccess_Get_DataOffsets( library, stream,
+                                        map_offset, rdara_pos,
+                                        TTAG_POST,
+                                        &data_offsets, &count );
+    if ( !error )
+    {
+      error = Mac_Read_POST_Resource( library, stream, data_offsets, count,
+                                      face_index, aface );
+      FT_FREE( data_offsets );
+      /* POST exists in an LWFN providing a single face */
+      if ( !error )
+        (*aface)->num_faces = 1;
+      return error;
+    }
+
+    error = FT_Raccess_Get_DataOffsets( library, stream,
+                                        map_offset, rdara_pos,
+                                        TTAG_sfnt,
+                                        &data_offsets, &count );
+    if ( !error )
+    {
+      FT_Long  face_index_internal = face_index % count;
+
+
+      error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count,
+                                      face_index_internal, aface );
+      FT_FREE( data_offsets );
+      if ( !error )
+        (*aface)->num_faces = count;
+    }
+
+    return error;
+  }
+
+
+  /* Check for a valid macbinary header, and if we find one   */
+  /* check that the (flattened) resource fork in it is valid. */
+  /*                                                          */
+  static FT_Error
+  IsMacBinary( FT_Library  library,
+               FT_Stream   stream,
+               FT_Long     face_index,
+               FT_Face    *aface )
+  {
+    unsigned char  header[128];
+    FT_Error       error;
+    FT_Long        dlen, offset;
+
+
+    if ( NULL == stream )
+      return FT_THROW( Invalid_Stream_Operation );
+
+    error = FT_Stream_Seek( stream, 0 );
+    if ( error )
+      goto Exit;
+
+    error = FT_Stream_Read( stream, (FT_Byte*)header, 128 );
+    if ( error )
+      goto Exit;
+
+    if (            header[ 0] !=  0 ||
+                    header[74] !=  0 ||
+                    header[82] !=  0 ||
+                    header[ 1] ==  0 ||
+                    header[ 1] >  33 ||
+                    header[63] !=  0 ||
+         header[2 + header[1]] !=  0 )
+      return FT_THROW( Unknown_File_Format );
+
+    dlen = ( header[0x53] << 24 ) |
+           ( header[0x54] << 16 ) |
+           ( header[0x55] <<  8 ) |
+             header[0x56];
+#if 0
+    rlen = ( header[0x57] << 24 ) |
+           ( header[0x58] << 16 ) |
+           ( header[0x59] <<  8 ) |
+             header[0x5a];
+#endif /* 0 */
+    offset = 128 + ( ( dlen + 127 ) & ~127 );
+
+    return IsMacResource( library, stream, offset, face_index, aface );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  load_face_in_embedded_rfork( FT_Library           library,
+                               FT_Stream            stream,
+                               FT_Long              face_index,
+                               FT_Face             *aface,
+                               const FT_Open_Args  *args )
+  {
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_raccess
+
+    FT_Memory  memory = library->memory;
+    FT_Error   error  = FT_ERR( Unknown_File_Format );
+    int        i;
+
+    char *     file_names[FT_RACCESS_N_RULES];
+    FT_Long    offsets[FT_RACCESS_N_RULES];
+    FT_Error   errors[FT_RACCESS_N_RULES];
+    FT_Bool    is_darwin_vfs, vfs_rfork_has_no_font = FALSE; /* not tested */
+
+    FT_Open_Args  args2;
+    FT_Stream     stream2 = 0;
+
+
+    FT_Raccess_Guess( library, stream,
+                      args->pathname, file_names, offsets, errors );
+
+    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
+    {
+      is_darwin_vfs = ft_raccess_rule_by_darwin_vfs( library, i );
+      if ( is_darwin_vfs && vfs_rfork_has_no_font )
+      {
+        FT_TRACE3(( "Skip rule %d: darwin vfs resource fork"
+                    " is already checked and"
+                    " no font is found\n", i ));
+        continue;
+      }
+
+      if ( errors[i] )
+      {
+        FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i ));
+        continue;
+      }
+
+      args2.flags    = FT_OPEN_PATHNAME;
+      args2.pathname = file_names[i] ? file_names[i] : args->pathname;
+
+      FT_TRACE3(( "Try rule %d: %s (offset=%d) ...",
+                  i, args2.pathname, offsets[i] ));
+
+      error = FT_Stream_New( library, &args2, &stream2 );
+      if ( is_darwin_vfs && FT_ERR_EQ( error, Cannot_Open_Stream ) )
+        vfs_rfork_has_no_font = TRUE;
+
+      if ( error )
+      {
+        FT_TRACE3(( "failed\n" ));
+        continue;
+      }
+
+      error = IsMacResource( library, stream2, offsets[i],
+                             face_index, aface );
+      FT_Stream_Free( stream2, 0 );
+
+      FT_TRACE3(( "%s\n", error ? "failed": "successful" ));
+
+      if ( !error )
+          break;
+      else if ( is_darwin_vfs )
+          vfs_rfork_has_no_font = TRUE;
+    }
+
+    for (i = 0; i < FT_RACCESS_N_RULES; i++)
+    {
+      if ( file_names[i] )
+        FT_FREE( file_names[i] );
+    }
+
+    /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */
+    if ( error )
+      error = FT_ERR( Unknown_File_Format );
+
+    return error;
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_objs
+
+  }
+
+
+  /* Check for some macintosh formats without Carbon framework.    */
+  /* Is this a macbinary file?  If so look at the resource fork.   */
+  /* Is this a mac dfont file?                                     */
+  /* Is this an old style resource fork? (in data)                 */
+  /* Else call load_face_in_embedded_rfork to try extra rules      */
+  /* (defined in `ftrfork.c').                                     */
+  /*                                                               */
+  static FT_Error
+  load_mac_face( FT_Library           library,
+                 FT_Stream            stream,
+                 FT_Long              face_index,
+                 FT_Face             *aface,
+                 const FT_Open_Args  *args )
+  {
+    FT_Error error;
+    FT_UNUSED( args );
+
+
+    error = IsMacBinary( library, stream, face_index, aface );
+    if ( FT_ERR_EQ( error, Unknown_File_Format ) )
+    {
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_raccess
+
+      FT_TRACE3(( "Try as dfont: %s ...", args->pathname ));
+
+      error = IsMacResource( library, stream, 0, face_index, aface );
+
+      FT_TRACE3(( "%s\n", error ? "failed" : "successful" ));
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_objs
+
+    }
+
+    if ( ( FT_ERR_EQ( error, Unknown_File_Format )      ||
+           FT_ERR_EQ( error, Invalid_Stream_Operation ) ) &&
+         ( args->flags & FT_OPEN_PATHNAME )               )
+      error = load_face_in_embedded_rfork( library, stream,
+                                           face_index, aface, args );
+    return error;
+  }
+#endif
+
+#endif  /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Open_Face( FT_Library           library,
+                const FT_Open_Args*  args,
+                FT_Long              face_index,
+                FT_Face             *aface )
+  {
+    FT_Error     error;
+    FT_Driver    driver = NULL;
+    FT_Memory    memory = NULL;
+    FT_Stream    stream = NULL;
+    FT_Face      face   = NULL;
+    FT_ListNode  node   = NULL;
+    FT_Bool      external_stream;
+    FT_Module*   cur;
+    FT_Module*   limit;
+
+
+    /* test for valid `library' delayed to */
+    /* FT_Stream_New()                     */
+
+    if ( ( !aface && face_index >= 0 ) || !args )
+      return FT_THROW( Invalid_Argument );
+
+    external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) &&
+                               args->stream                     );
+
+    /* create input stream */
+    error = FT_Stream_New( library, args, &stream );
+    if ( error )
+      goto Fail3;
+
+    memory = library->memory;
+
+    /* If the font driver is specified in the `args' structure, use */
+    /* it.  Otherwise, we scan the list of registered drivers.      */
+    if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver )
+    {
+      driver = FT_DRIVER( args->driver );
+
+      /* not all modules are drivers, so check... */
+      if ( FT_MODULE_IS_DRIVER( driver ) )
+      {
+        FT_Int         num_params = 0;
+        FT_Parameter*  params     = 0;
+
+
+        if ( args->flags & FT_OPEN_PARAMS )
+        {
+          num_params = args->num_params;
+          params     = args->params;
+        }
+
+        error = open_face( driver, stream, face_index,
+                           num_params, params, &face );
+        if ( !error )
+          goto Success;
+      }
+      else
+        error = FT_THROW( Invalid_Handle );
+
+      FT_Stream_Free( stream, external_stream );
+      goto Fail;
+    }
+    else
+    {
+      error = FT_ERR( Missing_Module );
+
+      /* check each font driver for an appropriate format */
+      cur   = library->modules;
+      limit = cur + library->num_modules;
+
+      for ( ; cur < limit; cur++ )
+      {
+        /* not all modules are font drivers, so check... */
+        if ( FT_MODULE_IS_DRIVER( cur[0] ) )
+        {
+          FT_Int         num_params = 0;
+          FT_Parameter*  params     = 0;
+
+
+          driver = FT_DRIVER( cur[0] );
+
+          if ( args->flags & FT_OPEN_PARAMS )
+          {
+            num_params = args->num_params;
+            params     = args->params;
+          }
+
+          error = open_face( driver, stream, face_index,
+                             num_params, params, &face );
+          if ( !error )
+            goto Success;
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+          if ( ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 &&
+               FT_ERR_EQ( error, Table_Missing )                        )
+          {
+            /* TrueType but essential tables are missing */
+            if ( FT_Stream_Seek( stream, 0 ) )
+              break;
+
+            error = open_face_PS_from_sfnt_stream( library,
+                                                   stream,
+                                                   face_index,
+                                                   num_params,
+                                                   params,
+                                                   aface );
+            if ( !error )
+            {
+              FT_Stream_Free( stream, external_stream );
+              return error;
+            }
+          }
+#endif
+
+          if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
+            goto Fail3;
+        }
+      }
+
+    Fail3:
+      /* If we are on the mac, and we get an                          */
+      /* FT_Err_Invalid_Stream_Operation it may be because we have an */
+      /* empty data fork, so we need to check the resource fork.      */
+      if ( FT_ERR_NEQ( error, Cannot_Open_Stream )       &&
+           FT_ERR_NEQ( error, Unknown_File_Format )      &&
+           FT_ERR_NEQ( error, Invalid_Stream_Operation ) )
+        goto Fail2;
+
+#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS )
+      error = load_mac_face( library, stream, face_index, aface, args );
+      if ( !error )
+      {
+        /* We don't want to go to Success here.  We've already done that. */
+        /* On the other hand, if we succeeded we still need to close this */
+        /* stream (we opened a different stream which extracted the       */
+        /* interesting information out of this stream here.  That stream  */
+        /* will still be open and the face will point to it).             */
+        FT_Stream_Free( stream, external_stream );
+        return error;
+      }
+
+      if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
+        goto Fail2;
+#endif  /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */
+
+      /* no driver is able to handle this format */
+      error = FT_THROW( Unknown_File_Format );
+
+  Fail2:
+      FT_Stream_Free( stream, external_stream );
+      goto Fail;
+    }
+
+  Success:
+    FT_TRACE4(( "FT_Open_Face: New face object, adding to list\n" ));
+
+    /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */
+    if ( external_stream )
+      face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM;
+
+    /* add the face object to its driver's list */
+    if ( FT_NEW( node ) )
+      goto Fail;
+
+    node->data = face;
+    /* don't assume driver is the same as face->driver, so use */
+    /* face->driver instead.                                   */
+    FT_List_Add( &face->driver->faces_list, node );
+
+    /* now allocate a glyph slot object for the face */
+    FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" ));
+
+    if ( face_index >= 0 )
+    {
+      error = FT_New_GlyphSlot( face, NULL );
+      if ( error )
+        goto Fail;
+
+      /* finally, allocate a size object for the face */
+      {
+        FT_Size  size;
+
+
+        FT_TRACE4(( "FT_Open_Face: Creating size object\n" ));
+
+        error = FT_New_Size( face, &size );
+        if ( error )
+          goto Fail;
+
+        face->size = size;
+      }
+    }
+
+    /* some checks */
+
+    if ( FT_IS_SCALABLE( face ) )
+    {
+      if ( face->height < 0 )
+        face->height = (FT_Short)-face->height;
+
+      if ( !FT_HAS_VERTICAL( face ) )
+        face->max_advance_height = (FT_Short)face->height;
+    }
+
+    if ( FT_HAS_FIXED_SIZES( face ) )
+    {
+      FT_Int  i;
+
+
+      for ( i = 0; i < face->num_fixed_sizes; i++ )
+      {
+        FT_Bitmap_Size*  bsize = face->available_sizes + i;
+
+
+        if ( bsize->height < 0 )
+          bsize->height = (FT_Short)-bsize->height;
+        if ( bsize->x_ppem < 0 )
+          bsize->x_ppem = (FT_Short)-bsize->x_ppem;
+        if ( bsize->y_ppem < 0 )
+          bsize->y_ppem = -bsize->y_ppem;
+      }
+    }
+
+    /* initialize internal face data */
+    {
+      FT_Face_Internal  internal = face->internal;
+
+
+      internal->transform_matrix.xx = 0x10000L;
+      internal->transform_matrix.xy = 0;
+      internal->transform_matrix.yx = 0;
+      internal->transform_matrix.yy = 0x10000L;
+
+      internal->transform_delta.x = 0;
+      internal->transform_delta.y = 0;
+
+      internal->refcount = 1;
+    }
+
+    if ( aface )
+      *aface = face;
+    else
+      FT_Done_Face( face );
+
+    goto Exit;
+
+  Fail:
+    if ( node )
+      FT_Done_Face( face );    /* face must be in the driver's list */
+    else if ( face )
+      destroy_face( memory, face, driver );
+
+  Exit:
+    FT_TRACE4(( "FT_Open_Face: Return %d\n", error ));
+
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Attach_File( FT_Face      face,
+                  const char*  filepathname )
+  {
+    FT_Open_Args  open;
+
+
+    /* test for valid `face' delayed to FT_Attach_Stream() */
+
+    if ( !filepathname )
+      return FT_THROW( Invalid_Argument );
+
+    open.stream   = NULL;
+    open.flags    = FT_OPEN_PATHNAME;
+    open.pathname = (char*)filepathname;
+
+    return FT_Attach_Stream( face, &open );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Attach_Stream( FT_Face        face,
+                    FT_Open_Args*  parameters )
+  {
+    FT_Stream  stream;
+    FT_Error   error;
+    FT_Driver  driver;
+
+    FT_Driver_Class  clazz;
+
+
+    /* test for valid `parameters' delayed to FT_Stream_New() */
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    driver = face->driver;
+    if ( !driver )
+      return FT_THROW( Invalid_Driver_Handle );
+
+    error = FT_Stream_New( driver->root.library, parameters, &stream );
+    if ( error )
+      goto Exit;
+
+    /* we implement FT_Attach_Stream in each driver through the */
+    /* `attach_file' interface                                  */
+
+    error = FT_ERR( Unimplemented_Feature );
+    clazz = driver->clazz;
+    if ( clazz->attach_file )
+      error = clazz->attach_file( face, stream );
+
+    /* close the attached stream */
+    FT_Stream_Free( stream,
+                    (FT_Bool)( parameters->stream &&
+                               ( parameters->flags & FT_OPEN_STREAM ) ) );
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Reference_Face( FT_Face  face )
+  {
+    face->internal->refcount++;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Done_Face( FT_Face  face )
+  {
+    FT_Error     error;
+    FT_Driver    driver;
+    FT_Memory    memory;
+    FT_ListNode  node;
+
+
+    error = FT_ERR( Invalid_Face_Handle );
+    if ( face && face->driver )
+    {
+      face->internal->refcount--;
+      if ( face->internal->refcount > 0 )
+        error = FT_Err_Ok;
+      else
+      {
+        driver = face->driver;
+        memory = driver->root.memory;
+
+        /* find face in driver's list */
+        node = FT_List_Find( &driver->faces_list, face );
+        if ( node )
+        {
+          /* remove face object from the driver's list */
+          FT_List_Remove( &driver->faces_list, node );
+          FT_FREE( node );
+
+          /* now destroy the object proper */
+          destroy_face( memory, face, driver );
+          error = FT_Err_Ok;
+        }
+      }
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Size( FT_Face   face,
+               FT_Size  *asize )
+  {
+    FT_Error         error;
+    FT_Memory        memory;
+    FT_Driver        driver;
+    FT_Driver_Class  clazz;
+
+    FT_Size          size = 0;
+    FT_ListNode      node = 0;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    if ( !asize )
+      return FT_THROW( Invalid_Size_Handle );
+
+    if ( !face->driver )
+      return FT_THROW( Invalid_Driver_Handle );
+
+    *asize = 0;
+
+    driver = face->driver;
+    clazz  = driver->clazz;
+    memory = face->memory;
+
+    /* Allocate new size object and perform basic initialisation */
+    if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) )
+      goto Exit;
+
+    size->face = face;
+
+    /* for now, do not use any internal fields in size objects */
+    size->internal = 0;
+
+    if ( clazz->init_size )
+      error = clazz->init_size( size );
+
+    /* in case of success, add to the face's list */
+    if ( !error )
+    {
+      *asize     = size;
+      node->data = size;
+      FT_List_Add( &face->sizes_list, node );
+    }
+
+  Exit:
+    if ( error )
+    {
+      FT_FREE( node );
+      FT_FREE( size );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Done_Size( FT_Size  size )
+  {
+    FT_Error     error;
+    FT_Driver    driver;
+    FT_Memory    memory;
+    FT_Face      face;
+    FT_ListNode  node;
+
+
+    if ( !size )
+      return FT_THROW( Invalid_Size_Handle );
+
+    face = size->face;
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    driver = face->driver;
+    if ( !driver )
+      return FT_THROW( Invalid_Driver_Handle );
+
+    memory = driver->root.memory;
+
+    error = FT_Err_Ok;
+    node  = FT_List_Find( &face->sizes_list, size );
+    if ( node )
+    {
+      FT_List_Remove( &face->sizes_list, node );
+      FT_FREE( node );
+
+      if ( face->size == size )
+      {
+        face->size = 0;
+        if ( face->sizes_list.head )
+          face->size = (FT_Size)(face->sizes_list.head->data);
+      }
+
+      destroy_size( memory, size, driver );
+    }
+    else
+      error = FT_THROW( Invalid_Size_Handle );
+
+    return error;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Error )
+  FT_Match_Size( FT_Face          face,
+                 FT_Size_Request  req,
+                 FT_Bool          ignore_width,
+                 FT_ULong*        size_index )
+  {
+    FT_Int   i;
+    FT_Long  w, h;
+
+
+    if ( !FT_HAS_FIXED_SIZES( face ) )
+      return FT_THROW( Invalid_Face_Handle );
+
+    /* FT_Bitmap_Size doesn't provide enough info... */
+    if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )
+      return FT_THROW( Unimplemented_Feature );
+
+    w = FT_REQUEST_WIDTH ( req );
+    h = FT_REQUEST_HEIGHT( req );
+
+    if ( req->width && !req->height )
+      h = w;
+    else if ( !req->width && req->height )
+      w = h;
+
+    w = FT_PIX_ROUND( w );
+    h = FT_PIX_ROUND( h );
+
+    for ( i = 0; i < face->num_fixed_sizes; i++ )
+    {
+      FT_Bitmap_Size*  bsize = face->available_sizes + i;
+
+
+      if ( h != FT_PIX_ROUND( bsize->y_ppem ) )
+        continue;
+
+      if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width )
+      {
+        FT_TRACE3(( "FT_Match_Size: bitmap strike %d matches\n", i ));
+
+        if ( size_index )
+          *size_index = (FT_ULong)i;
+
+        return FT_Err_Ok;
+      }
+    }
+
+    return FT_THROW( Invalid_Pixel_Size );
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( void )
+  ft_synthesize_vertical_metrics( FT_Glyph_Metrics*  metrics,
+                                  FT_Pos             advance )
+  {
+    FT_Pos  height = metrics->height;
+
+
+    /* compensate for glyph with bbox above/below the baseline */
+    if ( metrics->horiBearingY < 0 )
+    {
+      if ( height < metrics->horiBearingY )
+        height = metrics->horiBearingY;
+    }
+    else if ( metrics->horiBearingY > 0 )
+      height -= metrics->horiBearingY;
+
+    /* the factor 1.2 is a heuristical value */
+    if ( !advance )
+      advance = height * 12 / 10;
+
+    metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2;
+    metrics->vertBearingY = ( advance - height ) / 2;
+    metrics->vertAdvance  = advance;
+  }
+
+
+  static void
+  ft_recompute_scaled_metrics( FT_Face           face,
+                               FT_Size_Metrics*  metrics )
+  {
+    /* Compute root ascender, descender, test height, and max_advance */
+
+#ifdef GRID_FIT_METRICS
+    metrics->ascender    = FT_PIX_CEIL( FT_MulFix( face->ascender,
+                                                   metrics->y_scale ) );
+
+    metrics->descender   = FT_PIX_FLOOR( FT_MulFix( face->descender,
+                                                    metrics->y_scale ) );
+
+    metrics->height      = FT_PIX_ROUND( FT_MulFix( face->height,
+                                                    metrics->y_scale ) );
+
+    metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width,
+                                                    metrics->x_scale ) );
+#else /* !GRID_FIT_METRICS */
+    metrics->ascender    = FT_MulFix( face->ascender,
+                                      metrics->y_scale );
+
+    metrics->descender   = FT_MulFix( face->descender,
+                                      metrics->y_scale );
+
+    metrics->height      = FT_MulFix( face->height,
+                                      metrics->y_scale );
+
+    metrics->max_advance = FT_MulFix( face->max_advance_width,
+                                      metrics->x_scale );
+#endif /* !GRID_FIT_METRICS */
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Select_Metrics( FT_Face   face,
+                     FT_ULong  strike_index )
+  {
+    FT_Size_Metrics*  metrics;
+    FT_Bitmap_Size*   bsize;
+
+
+    metrics = &face->size->metrics;
+    bsize   = face->available_sizes + strike_index;
+
+    metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 );
+    metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 );
+
+    if ( FT_IS_SCALABLE( face ) )
+    {
+      metrics->x_scale = FT_DivFix( bsize->x_ppem,
+                                    face->units_per_EM );
+      metrics->y_scale = FT_DivFix( bsize->y_ppem,
+                                    face->units_per_EM );
+
+      ft_recompute_scaled_metrics( face, metrics );
+    }
+    else
+    {
+      metrics->x_scale     = 1L << 16;
+      metrics->y_scale     = 1L << 16;
+      metrics->ascender    = bsize->y_ppem;
+      metrics->descender   = 0;
+      metrics->height      = bsize->height << 6;
+      metrics->max_advance = bsize->x_ppem;
+    }
+
+    FT_TRACE5(( "FT_Select_Metrics:\n" ));
+    FT_TRACE5(( "  x scale: %d (%f)\n",
+                metrics->x_scale, metrics->x_scale / 65536.0 ));
+    FT_TRACE5(( "  y scale: %d (%f)\n",
+                metrics->y_scale, metrics->y_scale / 65536.0 ));
+    FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
+    FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
+    FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
+    FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
+    FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
+    FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Request_Metrics( FT_Face          face,
+                      FT_Size_Request  req )
+  {
+    FT_Size_Metrics*  metrics;
+
+
+    metrics = &face->size->metrics;
+
+    if ( FT_IS_SCALABLE( face ) )
+    {
+      FT_Long  w = 0, h = 0, scaled_w = 0, scaled_h = 0;
+
+
+      switch ( req->type )
+      {
+      case FT_SIZE_REQUEST_TYPE_NOMINAL:
+        w = h = face->units_per_EM;
+        break;
+
+      case FT_SIZE_REQUEST_TYPE_REAL_DIM:
+        w = h = face->ascender - face->descender;
+        break;
+
+      case FT_SIZE_REQUEST_TYPE_BBOX:
+        w = face->bbox.xMax - face->bbox.xMin;
+        h = face->bbox.yMax - face->bbox.yMin;
+        break;
+
+      case FT_SIZE_REQUEST_TYPE_CELL:
+        w = face->max_advance_width;
+        h = face->ascender - face->descender;
+        break;
+
+      case FT_SIZE_REQUEST_TYPE_SCALES:
+        metrics->x_scale = (FT_Fixed)req->width;
+        metrics->y_scale = (FT_Fixed)req->height;
+        if ( !metrics->x_scale )
+          metrics->x_scale = metrics->y_scale;
+        else if ( !metrics->y_scale )
+          metrics->y_scale = metrics->x_scale;
+        goto Calculate_Ppem;
+
+      case FT_SIZE_REQUEST_TYPE_MAX:
+        break;
+      }
+
+      /* to be on the safe side */
+      if ( w < 0 )
+        w = -w;
+
+      if ( h < 0 )
+        h = -h;
+
+      scaled_w = FT_REQUEST_WIDTH ( req );
+      scaled_h = FT_REQUEST_HEIGHT( req );
+
+      /* determine scales */
+      if ( req->width )
+      {
+        metrics->x_scale = FT_DivFix( scaled_w, w );
+
+        if ( req->height )
+        {
+          metrics->y_scale = FT_DivFix( scaled_h, h );
+
+          if ( req->type == FT_SIZE_REQUEST_TYPE_CELL )
+          {
+            if ( metrics->y_scale > metrics->x_scale )
+              metrics->y_scale = metrics->x_scale;
+            else
+              metrics->x_scale = metrics->y_scale;
+          }
+        }
+        else
+        {
+          metrics->y_scale = metrics->x_scale;
+          scaled_h = FT_MulDiv( scaled_w, h, w );
+        }
+      }
+      else
+      {
+        metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h );
+        scaled_w = FT_MulDiv( scaled_h, w, h );
+      }
+
+  Calculate_Ppem:
+      /* calculate the ppems */
+      if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )
+      {
+        scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale );
+        scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale );
+      }
+
+      metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 );
+      metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 );
+
+      ft_recompute_scaled_metrics( face, metrics );
+    }
+    else
+    {
+      FT_ZERO( metrics );
+      metrics->x_scale = 1L << 16;
+      metrics->y_scale = 1L << 16;
+    }
+
+    FT_TRACE5(( "FT_Request_Metrics:\n" ));
+    FT_TRACE5(( "  x scale: %d (%f)\n",
+                metrics->x_scale, metrics->x_scale / 65536.0 ));
+    FT_TRACE5(( "  y scale: %d (%f)\n",
+                metrics->y_scale, metrics->y_scale / 65536.0 ));
+    FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
+    FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
+    FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
+    FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
+    FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
+    FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Select_Size( FT_Face  face,
+                  FT_Int   strike_index )
+  {
+    FT_Driver_Class  clazz;
+
+
+    if ( !face || !FT_HAS_FIXED_SIZES( face ) )
+      return FT_THROW( Invalid_Face_Handle );
+
+    if ( strike_index < 0 || strike_index >= face->num_fixed_sizes )
+      return FT_THROW( Invalid_Argument );
+
+    clazz = face->driver->clazz;
+
+    if ( clazz->select_size )
+    {
+      FT_Error  error;
+
+
+      error = clazz->select_size( face->size, (FT_ULong)strike_index );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+      {
+        FT_Size_Metrics*  metrics = &face->size->metrics;
+
+
+        FT_TRACE5(( "FT_Select_Size (font driver's `select_size'):\n" ));
+        FT_TRACE5(( "  x scale: %d (%f)\n",
+                    metrics->x_scale, metrics->x_scale / 65536.0 ));
+        FT_TRACE5(( "  y scale: %d (%f)\n",
+                    metrics->y_scale, metrics->y_scale / 65536.0 ));
+        FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
+        FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
+        FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
+        FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
+        FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
+        FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
+      }
+#endif
+
+      return error;
+    }
+
+    FT_Select_Metrics( face, (FT_ULong)strike_index );
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Request_Size( FT_Face          face,
+                   FT_Size_Request  req )
+  {
+    FT_Driver_Class  clazz;
+    FT_ULong         strike_index;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    if ( !req || req->width < 0 || req->height < 0 ||
+         req->type >= FT_SIZE_REQUEST_TYPE_MAX )
+      return FT_THROW( Invalid_Argument );
+
+    clazz = face->driver->clazz;
+
+    if ( clazz->request_size )
+    {
+      FT_Error  error;
+
+
+      error = clazz->request_size( face->size, req );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+      {
+        FT_Size_Metrics*  metrics = &face->size->metrics;
+
+
+        FT_TRACE5(( "FT_Request_Size (font driver's `request_size'):\n" ));
+        FT_TRACE5(( "  x scale: %d (%f)\n",
+                    metrics->x_scale, metrics->x_scale / 65536.0 ));
+        FT_TRACE5(( "  y scale: %d (%f)\n",
+                    metrics->y_scale, metrics->y_scale / 65536.0 ));
+        FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
+        FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
+        FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
+        FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
+        FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
+        FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
+      }
+#endif
+
+      return error;
+    }
+
+    /*
+     * The reason that a driver doesn't have `request_size' defined is
+     * either that the scaling here suffices or that the supported formats
+     * are bitmap-only and size matching is not implemented.
+     *
+     * In the latter case, a simple size matching is done.
+     */
+    if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) )
+    {
+      FT_Error  error;
+
+
+      error = FT_Match_Size( face, req, 0, &strike_index );
+      if ( error )
+        return error;
+
+      return FT_Select_Size( face, (FT_Int)strike_index );
+    }
+
+    FT_Request_Metrics( face, req );
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Char_Size( FT_Face     face,
+                    FT_F26Dot6  char_width,
+                    FT_F26Dot6  char_height,
+                    FT_UInt     horz_resolution,
+                    FT_UInt     vert_resolution )
+  {
+    FT_Size_RequestRec  req;
+
+
+    if ( !char_width )
+      char_width = char_height;
+    else if ( !char_height )
+      char_height = char_width;
+
+    if ( !horz_resolution )
+      horz_resolution = vert_resolution;
+    else if ( !vert_resolution )
+      vert_resolution = horz_resolution;
+
+    if ( char_width  < 1 * 64 )
+      char_width  = 1 * 64;
+    if ( char_height < 1 * 64 )
+      char_height = 1 * 64;
+
+    if ( !horz_resolution )
+      horz_resolution = vert_resolution = 72;
+
+    req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;
+    req.width          = char_width;
+    req.height         = char_height;
+    req.horiResolution = horz_resolution;
+    req.vertResolution = vert_resolution;
+
+    return FT_Request_Size( face, &req );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Pixel_Sizes( FT_Face  face,
+                      FT_UInt  pixel_width,
+                      FT_UInt  pixel_height )
+  {
+    FT_Size_RequestRec  req;
+
+
+    if ( pixel_width == 0 )
+      pixel_width = pixel_height;
+    else if ( pixel_height == 0 )
+      pixel_height = pixel_width;
+
+    if ( pixel_width  < 1 )
+      pixel_width  = 1;
+    if ( pixel_height < 1 )
+      pixel_height = 1;
+
+    /* use `>=' to avoid potential compiler warning on 16bit platforms */
+    if ( pixel_width  >= 0xFFFFU )
+      pixel_width  = 0xFFFFU;
+    if ( pixel_height >= 0xFFFFU )
+      pixel_height = 0xFFFFU;
+
+    req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;
+    req.width          = pixel_width << 6;
+    req.height         = pixel_height << 6;
+    req.horiResolution = 0;
+    req.vertResolution = 0;
+
+    return FT_Request_Size( face, &req );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Kerning( FT_Face     face,
+                  FT_UInt     left_glyph,
+                  FT_UInt     right_glyph,
+                  FT_UInt     kern_mode,
+                  FT_Vector  *akerning )
+  {
+    FT_Error   error = FT_Err_Ok;
+    FT_Driver  driver;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    if ( !akerning )
+      return FT_THROW( Invalid_Argument );
+
+    driver = face->driver;
+
+    akerning->x = 0;
+    akerning->y = 0;
+
+    if ( driver->clazz->get_kerning )
+    {
+      error = driver->clazz->get_kerning( face,
+                                          left_glyph,
+                                          right_glyph,
+                                          akerning );
+      if ( !error )
+      {
+        if ( kern_mode != FT_KERNING_UNSCALED )
+        {
+          akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale );
+          akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale );
+
+          if ( kern_mode != FT_KERNING_UNFITTED )
+          {
+            /* we scale down kerning values for small ppem values */
+            /* to avoid that rounding makes them too big.         */
+            /* `25' has been determined heuristically.            */
+            if ( face->size->metrics.x_ppem < 25 )
+              akerning->x = FT_MulDiv( akerning->x,
+                                       face->size->metrics.x_ppem, 25 );
+            if ( face->size->metrics.y_ppem < 25 )
+              akerning->y = FT_MulDiv( akerning->y,
+                                       face->size->metrics.y_ppem, 25 );
+
+            akerning->x = FT_PIX_ROUND( akerning->x );
+            akerning->y = FT_PIX_ROUND( akerning->y );
+          }
+        }
+      }
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Track_Kerning( FT_Face    face,
+                        FT_Fixed   point_size,
+                        FT_Int     degree,
+                        FT_Fixed*  akerning )
+  {
+    FT_Service_Kerning  service;
+    FT_Error            error = FT_Err_Ok;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    if ( !akerning )
+      return FT_THROW( Invalid_Argument );
+
+    FT_FACE_FIND_SERVICE( face, service, KERNING );
+    if ( !service )
+      return FT_THROW( Unimplemented_Feature );
+
+    error = service->get_track( face,
+                                point_size,
+                                degree,
+                                akerning );
+
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Select_Charmap( FT_Face      face,
+                     FT_Encoding  encoding )
+  {
+    FT_CharMap*  cur;
+    FT_CharMap*  limit;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    if ( encoding == FT_ENCODING_NONE )
+      return FT_THROW( Invalid_Argument );
+
+    /* FT_ENCODING_UNICODE is special.  We try to find the `best' Unicode */
+    /* charmap available, i.e., one with UCS-4 characters, if possible.   */
+    /*                                                                    */
+    /* This is done by find_unicode_charmap() above, to share code.       */
+    if ( encoding == FT_ENCODING_UNICODE )
+      return find_unicode_charmap( face );
+
+    cur = face->charmaps;
+    if ( !cur )
+      return FT_THROW( Invalid_CharMap_Handle );
+
+    limit = cur + face->num_charmaps;
+
+    for ( ; cur < limit; cur++ )
+    {
+      if ( cur[0]->encoding == encoding )
+      {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+        if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE )
+        {
+          FT_ERROR(( "FT_Select_Charmap: requested charmap is found (%d), "
+                     "but in too late position to cache\n",
+                     cur - face->charmaps ));
+          continue;
+        }
+#endif
+        face->charmap = cur[0];
+        return 0;
+      }
+    }
+
+    return FT_THROW( Invalid_Argument );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Charmap( FT_Face     face,
+                  FT_CharMap  charmap )
+  {
+    FT_CharMap*  cur;
+    FT_CharMap*  limit;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    cur = face->charmaps;
+    if ( !cur )
+      return FT_THROW( Invalid_CharMap_Handle );
+    if ( FT_Get_CMap_Format( charmap ) == 14 )
+      return FT_THROW( Invalid_Argument );
+
+    limit = cur + face->num_charmaps;
+
+    for ( ; cur < limit; cur++ )
+    {
+      if ( cur[0] == charmap )
+      {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+        if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE )
+        {
+          FT_ERROR(( "FT_Set_Charmap: requested charmap is found (%d), "
+                     "but in too late position to cache\n",
+                     cur - face->charmaps ));
+          continue;
+        }
+#endif
+        face->charmap = cur[0];
+        return 0;
+      }
+    }
+    return FT_THROW( Invalid_Argument );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Int )
+  FT_Get_Charmap_Index( FT_CharMap  charmap )
+  {
+    FT_Int  i;
+
+
+    if ( !charmap || !charmap->face )
+      return -1;
+
+    for ( i = 0; i < charmap->face->num_charmaps; i++ )
+      if ( charmap->face->charmaps[i] == charmap )
+        break;
+
+    FT_ASSERT( i < charmap->face->num_charmaps );
+
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+    if ( i > FT_MAX_CHARMAP_CACHEABLE )
+    {
+      FT_ERROR(( "FT_Get_Charmap_Index: requested charmap is found (%d), "
+                 "but in too late position to cache\n",
+                 i ));
+      return -i;
+    }
+#endif
+    return i;
+  }
+
+
+  static void
+  ft_cmap_done_internal( FT_CMap  cmap )
+  {
+    FT_CMap_Class  clazz  = cmap->clazz;
+    FT_Face        face   = cmap->charmap.face;
+    FT_Memory      memory = FT_FACE_MEMORY( face );
+
+
+    if ( clazz->done )
+      clazz->done( cmap );
+
+    FT_FREE( cmap );
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_CMap_Done( FT_CMap  cmap )
+  {
+    if ( cmap )
+    {
+      FT_Face    face   = cmap->charmap.face;
+      FT_Memory  memory = FT_FACE_MEMORY( face );
+      FT_Error   error;
+      FT_Int     i, j;
+
+
+      for ( i = 0; i < face->num_charmaps; i++ )
+      {
+        if ( (FT_CMap)face->charmaps[i] == cmap )
+        {
+          FT_CharMap  last_charmap = face->charmaps[face->num_charmaps - 1];
+
+
+          if ( FT_RENEW_ARRAY( face->charmaps,
+                               face->num_charmaps,
+                               face->num_charmaps - 1 ) )
+            return;
+
+          /* remove it from our list of charmaps */
+          for ( j = i + 1; j < face->num_charmaps; j++ )
+          {
+            if ( j == face->num_charmaps - 1 )
+              face->charmaps[j - 1] = last_charmap;
+            else
+              face->charmaps[j - 1] = face->charmaps[j];
+          }
+
+          face->num_charmaps--;
+
+          if ( (FT_CMap)face->charmap == cmap )
+            face->charmap = NULL;
+
+          ft_cmap_done_internal( cmap );
+
+          break;
+        }
+      }
+    }
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_CMap_New( FT_CMap_Class  clazz,
+               FT_Pointer     init_data,
+               FT_CharMap     charmap,
+               FT_CMap       *acmap )
+  {
+    FT_Error   error = FT_Err_Ok;
+    FT_Face    face;
+    FT_Memory  memory;
+    FT_CMap    cmap = NULL;
+
+
+    if ( clazz == NULL || charmap == NULL || charmap->face == NULL )
+      return FT_THROW( Invalid_Argument );
+
+    face   = charmap->face;
+    memory = FT_FACE_MEMORY( face );
+
+    if ( !FT_ALLOC( cmap, clazz->size ) )
+    {
+      cmap->charmap = *charmap;
+      cmap->clazz   = clazz;
+
+      if ( clazz->init )
+      {
+        error = clazz->init( cmap, init_data );
+        if ( error )
+          goto Fail;
+      }
+
+      /* add it to our list of charmaps */
+      if ( FT_RENEW_ARRAY( face->charmaps,
+                           face->num_charmaps,
+                           face->num_charmaps + 1 ) )
+        goto Fail;
+
+      face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap;
+    }
+
+  Exit:
+    if ( acmap )
+      *acmap = cmap;
+
+    return error;
+
+  Fail:
+    ft_cmap_done_internal( cmap );
+    cmap = NULL;
+    goto Exit;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UInt )
+  FT_Get_Char_Index( FT_Face   face,
+                     FT_ULong  charcode )
+  {
+    FT_UInt  result = 0;
+
+
+    if ( face && face->charmap )
+    {
+      FT_CMap  cmap = FT_CMAP( face->charmap );
+
+
+      if ( charcode > 0xFFFFFFFFUL )
+      {
+        FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+        FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+      }
+      result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode );
+    }
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_ULong )
+  FT_Get_First_Char( FT_Face   face,
+                     FT_UInt  *agindex )
+  {
+    FT_ULong  result = 0;
+    FT_UInt   gindex = 0;
+
+
+    if ( face && face->charmap && face->num_glyphs )
+    {
+      gindex = FT_Get_Char_Index( face, 0 );
+      if ( gindex == 0 || gindex >= (FT_UInt)face->num_glyphs )
+        result = FT_Get_Next_Char( face, 0, &gindex );
+    }
+
+    if ( agindex )
+      *agindex = gindex;
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_ULong )
+  FT_Get_Next_Char( FT_Face   face,
+                    FT_ULong  charcode,
+                    FT_UInt  *agindex )
+  {
+    FT_ULong  result = 0;
+    FT_UInt   gindex = 0;
+
+
+    if ( face && face->charmap && face->num_glyphs )
+    {
+      FT_UInt32  code = (FT_UInt32)charcode;
+      FT_CMap    cmap = FT_CMAP( face->charmap );
+
+
+      do {
+        gindex = cmap->clazz->char_next( cmap, &code );
+      } while ( gindex >= (FT_UInt)face->num_glyphs );
+
+      result = ( gindex == 0 ) ? 0 : code;
+    }
+
+    if ( agindex )
+      *agindex = gindex;
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UInt )
+  FT_Face_GetCharVariantIndex( FT_Face   face,
+                               FT_ULong  charcode,
+                               FT_ULong  variantSelector )
+  {
+    FT_UInt  result = 0;
+
+
+    if ( face && face->charmap &&
+        face->charmap->encoding == FT_ENCODING_UNICODE )
+    {
+      FT_CharMap  charmap = find_variant_selector_charmap( face );
+      FT_CMap     ucmap = FT_CMAP( face->charmap );
+
+
+      if ( charmap != NULL )
+      {
+        FT_CMap  vcmap = FT_CMAP( charmap );
+
+
+        if ( charcode > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+          FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+        }
+        if ( variantSelector > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+          FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
+        }
+
+        result = vcmap->clazz->char_var_index( vcmap, ucmap,
+                                               (FT_UInt32)charcode,
+                                               (FT_UInt32)variantSelector );
+      }
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Int )
+  FT_Face_GetCharVariantIsDefault( FT_Face   face,
+                                   FT_ULong  charcode,
+                                   FT_ULong  variantSelector )
+  {
+    FT_Int  result = -1;
+
+
+    if ( face )
+    {
+      FT_CharMap  charmap = find_variant_selector_charmap( face );
+
+
+      if ( charmap != NULL )
+      {
+        FT_CMap  vcmap = FT_CMAP( charmap );
+
+
+        if ( charcode > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+          FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+        }
+        if ( variantSelector > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+          FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
+        }
+
+        result = vcmap->clazz->char_var_default( vcmap,
+                                                 (FT_UInt32)charcode,
+                                                 (FT_UInt32)variantSelector );
+      }
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UInt32* )
+  FT_Face_GetVariantSelectors( FT_Face  face )
+  {
+    FT_UInt32  *result = NULL;
+
+
+    if ( face )
+    {
+      FT_CharMap  charmap = find_variant_selector_charmap( face );
+
+
+      if ( charmap != NULL )
+      {
+        FT_CMap    vcmap  = FT_CMAP( charmap );
+        FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+        result = vcmap->clazz->variant_list( vcmap, memory );
+      }
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UInt32* )
+  FT_Face_GetVariantsOfChar( FT_Face   face,
+                             FT_ULong  charcode )
+  {
+    FT_UInt32  *result = NULL;
+
+
+    if ( face )
+    {
+      FT_CharMap  charmap = find_variant_selector_charmap( face );
+
+
+      if ( charmap != NULL )
+      {
+        FT_CMap    vcmap  = FT_CMAP( charmap );
+        FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+        if ( charcode > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+          FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+        }
+
+        result = vcmap->clazz->charvariant_list( vcmap, memory,
+                                                 (FT_UInt32)charcode );
+      }
+    }
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UInt32* )
+  FT_Face_GetCharsOfVariant( FT_Face   face,
+                             FT_ULong  variantSelector )
+  {
+    FT_UInt32  *result = NULL;
+
+
+    if ( face )
+    {
+      FT_CharMap  charmap = find_variant_selector_charmap( face );
+
+
+      if ( charmap != NULL )
+      {
+        FT_CMap    vcmap  = FT_CMAP( charmap );
+        FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+        if ( variantSelector > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+          FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
+        }
+
+        result = vcmap->clazz->variantchar_list( vcmap, memory,
+                                                 (FT_UInt32)variantSelector );
+      }
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UInt )
+  FT_Get_Name_Index( FT_Face     face,
+                     FT_String*  glyph_name )
+  {
+    FT_UInt  result = 0;
+
+
+    if ( face && FT_HAS_GLYPH_NAMES( face ) )
+    {
+      FT_Service_GlyphDict  service;
+
+
+      FT_FACE_LOOKUP_SERVICE( face,
+                              service,
+                              GLYPH_DICT );
+
+      if ( service && service->name_index )
+        result = service->name_index( face, glyph_name );
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Glyph_Name( FT_Face     face,
+                     FT_UInt     glyph_index,
+                     FT_Pointer  buffer,
+                     FT_UInt     buffer_max )
+  {
+    FT_Error  error = FT_ERR( Invalid_Argument );
+
+
+    /* clean up buffer */
+    if ( buffer && buffer_max > 0 )
+      ((FT_Byte*)buffer)[0] = 0;
+
+    if ( face                                     &&
+         (FT_Long)glyph_index <= face->num_glyphs &&
+         FT_HAS_GLYPH_NAMES( face )               )
+    {
+      FT_Service_GlyphDict  service;
+
+
+      FT_FACE_LOOKUP_SERVICE( face,
+                              service,
+                              GLYPH_DICT );
+
+      if ( service && service->get_name )
+        error = service->get_name( face, glyph_index, buffer, buffer_max );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( const char* )
+  FT_Get_Postscript_Name( FT_Face  face )
+  {
+    const char*  result = NULL;
+
+
+    if ( !face )
+      goto Exit;
+
+    if ( !result )
+    {
+      FT_Service_PsFontName  service;
+
+
+      FT_FACE_LOOKUP_SERVICE( face,
+                              service,
+                              POSTSCRIPT_FONT_NAME );
+
+      if ( service && service->get_ps_font_name )
+        result = service->get_ps_font_name( face );
+    }
+
+  Exit:
+    return result;
+  }
+
+
+  /* documentation is in tttables.h */
+
+  FT_EXPORT_DEF( void* )
+  FT_Get_Sfnt_Table( FT_Face      face,
+                     FT_Sfnt_Tag  tag )
+  {
+    void*                  table = 0;
+    FT_Service_SFNT_Table  service;
+
+
+    if ( face && FT_IS_SFNT( face ) )
+    {
+      FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+      if ( service != NULL )
+        table = service->get_table( face, tag );
+    }
+
+    return table;
+  }
+
+
+  /* documentation is in tttables.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Load_Sfnt_Table( FT_Face    face,
+                      FT_ULong   tag,
+                      FT_Long    offset,
+                      FT_Byte*   buffer,
+                      FT_ULong*  length )
+  {
+    FT_Service_SFNT_Table  service;
+
+
+    if ( !face || !FT_IS_SFNT( face ) )
+      return FT_THROW( Invalid_Face_Handle );
+
+    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+    if ( service == NULL )
+      return FT_THROW( Unimplemented_Feature );
+
+    return service->load_table( face, tag, offset, buffer, length );
+  }
+
+
+  /* documentation is in tttables.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Sfnt_Table_Info( FT_Face    face,
+                      FT_UInt    table_index,
+                      FT_ULong  *tag,
+                      FT_ULong  *length )
+  {
+    FT_Service_SFNT_Table  service;
+    FT_ULong               offset;
+
+
+    if ( !face || !FT_IS_SFNT( face ) )
+      return FT_THROW( Invalid_Face_Handle );
+
+    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+    if ( service == NULL )
+      return FT_THROW( Unimplemented_Feature );
+
+    return service->table_info( face, table_index, tag, &offset, length );
+  }
+
+
+  /* documentation is in tttables.h */
+
+  FT_EXPORT_DEF( FT_ULong )
+  FT_Get_CMap_Language_ID( FT_CharMap  charmap )
+  {
+    FT_Service_TTCMaps  service;
+    FT_Face             face;
+    TT_CMapInfo         cmap_info;
+
+
+    if ( !charmap || !charmap->face )
+      return 0;
+
+    face = charmap->face;
+    FT_FACE_FIND_SERVICE( face, service, TT_CMAP );
+    if ( service == NULL )
+      return 0;
+    if ( service->get_cmap_info( charmap, &cmap_info ))
+      return 0;
+
+    return cmap_info.language;
+  }
+
+
+  /* documentation is in tttables.h */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_Get_CMap_Format( FT_CharMap  charmap )
+  {
+    FT_Service_TTCMaps  service;
+    FT_Face             face;
+    TT_CMapInfo         cmap_info;
+
+
+    if ( !charmap || !charmap->face )
+      return -1;
+
+    face = charmap->face;
+    FT_FACE_FIND_SERVICE( face, service, TT_CMAP );
+    if ( service == NULL )
+      return -1;
+    if ( service->get_cmap_info( charmap, &cmap_info ))
+      return -1;
+
+    return cmap_info.format;
+  }
+
+
+  /* documentation is in ftsizes.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Activate_Size( FT_Size  size )
+  {
+    FT_Face  face;
+
+
+    if ( size == NULL )
+      return FT_THROW( Invalid_Argument );
+
+    face = size->face;
+    if ( face == NULL || face->driver == NULL )
+      return FT_THROW( Invalid_Argument );
+
+    /* we don't need anything more complex than that; all size objects */
+    /* are already listed by the face                                  */
+    face->size = size;
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                        R E N D E R E R S                        ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* lookup a renderer by glyph format in the library's list */
+  FT_BASE_DEF( FT_Renderer )
+  FT_Lookup_Renderer( FT_Library       library,
+                      FT_Glyph_Format  format,
+                      FT_ListNode*     node )
+  {
+    FT_ListNode  cur;
+    FT_Renderer  result = 0;
+
+
+    if ( !library )
+      goto Exit;
+
+    cur = library->renderers.head;
+
+    if ( node )
+    {
+      if ( *node )
+        cur = (*node)->next;
+      *node = 0;
+    }
+
+    while ( cur )
+    {
+      FT_Renderer  renderer = FT_RENDERER( cur->data );
+
+
+      if ( renderer->glyph_format == format )
+      {
+        if ( node )
+          *node = cur;
+
+        result = renderer;
+        break;
+      }
+      cur = cur->next;
+    }
+
+  Exit:
+    return result;
+  }
+
+
+  static FT_Renderer
+  ft_lookup_glyph_renderer( FT_GlyphSlot  slot )
+  {
+    FT_Face      face    = slot->face;
+    FT_Library   library = FT_FACE_LIBRARY( face );
+    FT_Renderer  result  = library->cur_renderer;
+
+
+    if ( !result || result->glyph_format != slot->format )
+      result = FT_Lookup_Renderer( library, slot->format, 0 );
+
+    return result;
+  }
+
+
+  static void
+  ft_set_current_renderer( FT_Library  library )
+  {
+    FT_Renderer  renderer;
+
+
+    renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 );
+    library->cur_renderer = renderer;
+  }
+
+
+  static FT_Error
+  ft_add_renderer( FT_Module  module )
+  {
+    FT_Library   library = module->library;
+    FT_Memory    memory  = library->memory;
+    FT_Error     error;
+    FT_ListNode  node    = NULL;
+
+
+    if ( FT_NEW( node ) )
+      goto Exit;
+
+    {
+      FT_Renderer         render = FT_RENDERER( module );
+      FT_Renderer_Class*  clazz  = (FT_Renderer_Class*)module->clazz;
+
+
+      render->clazz        = clazz;
+      render->glyph_format = clazz->glyph_format;
+
+      /* allocate raster object if needed */
+      if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
+           clazz->raster_class->raster_new                )
+      {
+        error = clazz->raster_class->raster_new( memory, &render->raster );
+        if ( error )
+          goto Fail;
+
+        render->raster_render = clazz->raster_class->raster_render;
+        render->render        = clazz->render_glyph;
+      }
+
+      /* add to list */
+      node->data = module;
+      FT_List_Add( &library->renderers, node );
+
+      ft_set_current_renderer( library );
+    }
+
+  Fail:
+    if ( error )
+      FT_FREE( node );
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  ft_remove_renderer( FT_Module  module )
+  {
+    FT_Library   library = module->library;
+    FT_Memory    memory  = library->memory;
+    FT_ListNode  node;
+
+
+    node = FT_List_Find( &library->renderers, module );
+    if ( node )
+    {
+      FT_Renderer  render = FT_RENDERER( module );
+
+
+      /* release raster object, if any */
+      if ( render->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
+           render->raster                                         )
+        render->clazz->raster_class->raster_done( render->raster );
+
+      /* remove from list */
+      FT_List_Remove( &library->renderers, node );
+      FT_FREE( node );
+
+      ft_set_current_renderer( library );
+    }
+  }
+
+
+  /* documentation is in ftrender.h */
+
+  FT_EXPORT_DEF( FT_Renderer )
+  FT_Get_Renderer( FT_Library       library,
+                   FT_Glyph_Format  format )
+  {
+    /* test for valid `library' delayed to FT_Lookup_Renderer() */
+
+    return FT_Lookup_Renderer( library, format, 0 );
+  }
+
+
+  /* documentation is in ftrender.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Renderer( FT_Library     library,
+                   FT_Renderer    renderer,
+                   FT_UInt        num_params,
+                   FT_Parameter*  parameters )
+  {
+    FT_ListNode  node;
+    FT_Error     error = FT_Err_Ok;
+
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    if ( !renderer )
+      return FT_THROW( Invalid_Argument );
+
+    node = FT_List_Find( &library->renderers, renderer );
+    if ( !node )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    FT_List_Up( &library->renderers, node );
+
+    if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE )
+      library->cur_renderer = renderer;
+
+    if ( num_params > 0 )
+    {
+      FT_Renderer_SetModeFunc  set_mode = renderer->clazz->set_mode;
+
+
+      for ( ; num_params > 0; num_params-- )
+      {
+        error = set_mode( renderer, parameters->tag, parameters->data );
+        if ( error )
+          break;
+        parameters++;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Render_Glyph_Internal( FT_Library      library,
+                            FT_GlyphSlot    slot,
+                            FT_Render_Mode  render_mode )
+  {
+    FT_Error     error = FT_Err_Ok;
+    FT_Renderer  renderer;
+
+
+    /* if it is already a bitmap, no need to do anything */
+    switch ( slot->format )
+    {
+    case FT_GLYPH_FORMAT_BITMAP:   /* already a bitmap, don't do anything */
+      break;
+
+    default:
+      {
+        FT_ListNode  node   = 0;
+        FT_Bool      update = 0;
+
+
+        /* small shortcut for the very common case */
+        if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+        {
+          renderer = library->cur_renderer;
+          node     = library->renderers.head;
+        }
+        else
+          renderer = FT_Lookup_Renderer( library, slot->format, &node );
+
+        error = FT_ERR( Unimplemented_Feature );
+        while ( renderer )
+        {
+          error = renderer->render( renderer, slot, render_mode, NULL );
+          if ( !error                                   ||
+               FT_ERR_NEQ( error, Cannot_Render_Glyph ) )
+            break;
+
+          /* FT_Err_Cannot_Render_Glyph is returned if the render mode   */
+          /* is unsupported by the current renderer for this glyph image */
+          /* format.                                                     */
+
+          /* now, look for another renderer that supports the same */
+          /* format.                                               */
+          renderer = FT_Lookup_Renderer( library, slot->format, &node );
+          update   = 1;
+        }
+
+        /* if we changed the current renderer for the glyph image format */
+        /* we need to select it as the next current one                  */
+        if ( !error && update && renderer )
+          FT_Set_Renderer( library, renderer, 0, 0 );
+      }
+    }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_bitmap
+
+    /* we convert to a single bitmap format for computing the checksum */
+    {
+      FT_Bitmap  bitmap;
+      FT_Error   err;
+
+
+      FT_Bitmap_New( &bitmap );
+
+      err = FT_Bitmap_Convert( library, &slot->bitmap, &bitmap, 1 );
+      if ( !err )
+      {
+        MD5_CTX        ctx;
+        unsigned char  md5[16];
+        int            i;
+
+
+        MD5_Init( &ctx);
+        MD5_Update( &ctx, bitmap.buffer, bitmap.rows * bitmap.pitch );
+        MD5_Final( md5, &ctx );
+
+        FT_TRACE3(( "MD5 checksum for %dx%d bitmap:\n"
+                    "  ",
+                    bitmap.rows, bitmap.pitch ));
+        for ( i = 0; i < 16; i++ )
+          FT_TRACE3(( "%02X", md5[i] ));
+        FT_TRACE3(( "\n" ));
+      }
+
+      FT_Bitmap_Done( library, &bitmap );
+    }
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_objs
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+    return error;
+  }
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Render_Glyph( FT_GlyphSlot    slot,
+                   FT_Render_Mode  render_mode )
+  {
+    FT_Library  library;
+
+    if ( !slot || !slot->face )
+      return FT_THROW( Invalid_Argument );
+
+    library = FT_FACE_LIBRARY( slot->face );
+
+    return FT_Render_Glyph_Internal( library, slot, render_mode );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                         M O D U L E S                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Destroy_Module                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroys a given module object.  For drivers, this also destroys   */
+  /*    all child faces.                                                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    module :: A handle to the target driver object.                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The driver _must_ be LOCKED!                                       */
+  /*                                                                       */
+  static void
+  Destroy_Module( FT_Module  module )
+  {
+    FT_Memory         memory  = module->memory;
+    FT_Module_Class*  clazz   = module->clazz;
+    FT_Library        library = module->library;
+
+
+    if ( library && library->auto_hinter == module )
+      library->auto_hinter = 0;
+
+    /* if the module is a renderer */
+    if ( FT_MODULE_IS_RENDERER( module ) )
+      ft_remove_renderer( module );
+
+    /* if the module is a font driver, add some steps */
+    if ( FT_MODULE_IS_DRIVER( module ) )
+      Destroy_Driver( FT_DRIVER( module ) );
+
+    /* finalize the module object */
+    if ( clazz->module_done )
+      clazz->module_done( module );
+
+    /* discard it */
+    FT_FREE( module );
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Add_Module( FT_Library              library,
+                 const FT_Module_Class*  clazz )
+  {
+    FT_Error   error;
+    FT_Memory  memory;
+    FT_Module  module;
+    FT_UInt    nn;
+
+
+#define FREETYPE_VER_FIXED  ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \
+                                FREETYPE_MINOR                  )
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    if ( !clazz )
+      return FT_THROW( Invalid_Argument );
+
+    /* check freetype version */
+    if ( clazz->module_requires > FREETYPE_VER_FIXED )
+      return FT_THROW( Invalid_Version );
+
+    /* look for a module with the same name in the library's table */
+    for ( nn = 0; nn < library->num_modules; nn++ )
+    {
+      module = library->modules[nn];
+      if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 )
+      {
+        /* this installed module has the same name, compare their versions */
+        if ( clazz->module_version <= module->clazz->module_version )
+          return FT_THROW( Lower_Module_Version );
+
+        /* remove the module from our list, then exit the loop to replace */
+        /* it by our new version..                                        */
+        FT_Remove_Module( library, module );
+        break;
+      }
+    }
+
+    memory = library->memory;
+    error  = FT_Err_Ok;
+
+    if ( library->num_modules >= FT_MAX_MODULES )
+    {
+      error = FT_THROW( Too_Many_Drivers );
+      goto Exit;
+    }
+
+    /* allocate module object */
+    if ( FT_ALLOC( module, clazz->module_size ) )
+      goto Exit;
+
+    /* base initialization */
+    module->library = library;
+    module->memory  = memory;
+    module->clazz   = (FT_Module_Class*)clazz;
+
+    /* check whether the module is a renderer - this must be performed */
+    /* before the normal module initialization                         */
+    if ( FT_MODULE_IS_RENDERER( module ) )
+    {
+      /* add to the renderers list */
+      error = ft_add_renderer( module );
+      if ( error )
+        goto Fail;
+    }
+
+    /* is the module a auto-hinter? */
+    if ( FT_MODULE_IS_HINTER( module ) )
+      library->auto_hinter = module;
+
+    /* if the module is a font driver */
+    if ( FT_MODULE_IS_DRIVER( module ) )
+    {
+      /* allocate glyph loader if needed */
+      FT_Driver  driver = FT_DRIVER( module );
+
+
+      driver->clazz = (FT_Driver_Class)module->clazz;
+      if ( FT_DRIVER_USES_OUTLINES( driver ) )
+      {
+        error = FT_GlyphLoader_New( memory, &driver->glyph_loader );
+        if ( error )
+          goto Fail;
+      }
+    }
+
+    if ( clazz->module_init )
+    {
+      error = clazz->module_init( module );
+      if ( error )
+        goto Fail;
+    }
+
+    /* add module to the library's table */
+    library->modules[library->num_modules++] = module;
+
+  Exit:
+    return error;
+
+  Fail:
+    if ( FT_MODULE_IS_DRIVER( module ) )
+    {
+      FT_Driver  driver = FT_DRIVER( module );
+
+
+      if ( FT_DRIVER_USES_OUTLINES( driver ) )
+        FT_GlyphLoader_Done( driver->glyph_loader );
+    }
+
+    if ( FT_MODULE_IS_RENDERER( module ) )
+    {
+      FT_Renderer  renderer = FT_RENDERER( module );
+
+
+      if ( renderer->clazz                                          &&
+           renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
+           renderer->raster                                         )
+        renderer->clazz->raster_class->raster_done( renderer->raster );
+    }
+
+    FT_FREE( module );
+    goto Exit;
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Module )
+  FT_Get_Module( FT_Library   library,
+                 const char*  module_name )
+  {
+    FT_Module   result = 0;
+    FT_Module*  cur;
+    FT_Module*  limit;
+
+
+    if ( !library || !module_name )
+      return result;
+
+    cur   = library->modules;
+    limit = cur + library->num_modules;
+
+    for ( ; cur < limit; cur++ )
+      if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 )
+      {
+        result = cur[0];
+        break;
+      }
+
+    return result;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( const void* )
+  FT_Get_Module_Interface( FT_Library   library,
+                           const char*  mod_name )
+  {
+    FT_Module  module;
+
+
+    /* test for valid `library' delayed to FT_Get_Module() */
+
+    module = FT_Get_Module( library, mod_name );
+
+    return module ? module->clazz->module_interface : 0;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_module_get_service( FT_Module    module,
+                         const char*  service_id )
+  {
+    FT_Pointer  result = NULL;
+
+
+    if ( module )
+    {
+      FT_ASSERT( module->clazz && module->clazz->get_interface );
+
+      /* first, look for the service in the module */
+      if ( module->clazz->get_interface )
+        result = module->clazz->get_interface( module, service_id );
+
+      if ( result == NULL )
+      {
+        /* we didn't find it, look in all other modules then */
+        FT_Library  library = module->library;
+        FT_Module*  cur     = library->modules;
+        FT_Module*  limit   = cur + library->num_modules;
+
+
+        for ( ; cur < limit; cur++ )
+        {
+          if ( cur[0] != module )
+          {
+            FT_ASSERT( cur[0]->clazz );
+
+            if ( cur[0]->clazz->get_interface )
+            {
+              result = cur[0]->clazz->get_interface( cur[0], service_id );
+              if ( result != NULL )
+                break;
+            }
+          }
+        }
+      }
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Remove_Module( FT_Library  library,
+                    FT_Module   module )
+  {
+    /* try to find the module from the table, then remove it from there */
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    if ( module )
+    {
+      FT_Module*  cur   = library->modules;
+      FT_Module*  limit = cur + library->num_modules;
+
+
+      for ( ; cur < limit; cur++ )
+      {
+        if ( cur[0] == module )
+        {
+          /* remove it from the table */
+          library->num_modules--;
+          limit--;
+          while ( cur < limit )
+          {
+            cur[0] = cur[1];
+            cur++;
+          }
+          limit[0] = 0;
+
+          /* destroy the module */
+          Destroy_Module( module );
+
+          return FT_Err_Ok;
+        }
+      }
+    }
+    return FT_THROW( Invalid_Driver_Handle );
+  }
+
+
+  FT_Error
+  ft_property_do( FT_Library        library,
+                  const FT_String*  module_name,
+                  const FT_String*  property_name,
+                  void*             value,
+                  FT_Bool           set )
+  {
+    FT_Module*           cur;
+    FT_Module*           limit;
+    FT_Module_Interface  interface1;
+    FT_Service_Properties  service;
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+    const FT_String*  set_name  = "FT_Property_Set";
+    const FT_String*  get_name  = "FT_Property_Get";
+    const FT_String*  func_name = set ? set_name : get_name;
+#endif
+
+    FT_Bool  missing_func;
+
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    if ( !module_name || !property_name || !value )
+      return FT_THROW( Invalid_Argument );
+
+    cur   = library->modules;
+    limit = cur + library->num_modules;
+
+    /* search module */
+    for ( ; cur < limit; cur++ )
+      if ( !ft_strcmp( cur[0]->clazz->module_name, module_name ) )
+        break;
+
+    if ( cur == limit )
+    {
+      FT_ERROR(( "%s: can't find module `%s'\n",
+                 func_name, module_name ));
+      return FT_THROW( Missing_Module );
+    }
+
+    /* check whether we have a service interface */
+    if ( !cur[0]->clazz->get_interface )
+    {
+      FT_ERROR(( "%s: module `%s' doesn't support properties\n",
+                 func_name, module_name ));
+      return FT_THROW( Unimplemented_Feature );
+    }
+
+    /* search property service */
+    interface1 = cur[0]->clazz->get_interface( cur[0],
+                                              FT_SERVICE_ID_PROPERTIES );
+    if ( !interface1 )
+    {
+      FT_ERROR(( "%s: module `%s' doesn't support properties\n",
+                 func_name, module_name ));
+      return FT_THROW( Unimplemented_Feature );
+    }
+
+    service = (FT_Service_Properties)interface1;
+
+    if ( set )
+      missing_func = (FT_Bool)( !service->set_property );
+    else
+      missing_func = (FT_Bool)( !service->get_property );
+
+    if ( missing_func )
+    {
+      FT_ERROR(( "%s: property service of module `%s' is broken\n",
+                 func_name, module_name ));
+      return FT_THROW( Unimplemented_Feature );
+    }
+
+    return set ? service->set_property( cur[0], property_name, value )
+               : service->get_property( cur[0], property_name, value );
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Property_Set( FT_Library        library,
+                   const FT_String*  module_name,
+                   const FT_String*  property_name,
+                   const void*       value )
+  {
+    return ft_property_do( library,
+                           module_name,
+                           property_name,
+                           (void*)value,
+                           TRUE );
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Property_Get( FT_Library        library,
+                   const FT_String*  module_name,
+                   const FT_String*  property_name,
+                   void*             value )
+  {
+    return ft_property_do( library,
+                           module_name,
+                           property_name,
+                           value,
+                           FALSE );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                         L I B R A R Y                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Reference_Library( FT_Library  library )
+  {
+    library->refcount++;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Library( FT_Memory    memory,
+                  FT_Library  *alibrary )
+  {
+    FT_Library  library = NULL;
+    FT_Error    error;
+
+
+    if ( !memory )
+      return FT_THROW( Invalid_Argument );
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+    /* init debugging support */
+    ft_debug_init();
+#endif
+
+    /* first of all, allocate the library object */
+    if ( FT_NEW( library ) )
+      return error;
+
+    library->memory = memory;
+
+#ifdef FT_CONFIG_OPTION_PIC
+    /* initialize position independent code containers */
+    error = ft_pic_container_init( library );
+    if ( error )
+      goto Fail;
+#endif
+
+    /* allocate the render pool */
+    library->raster_pool_size = FT_RENDER_POOL_SIZE;
+#if FT_RENDER_POOL_SIZE > 0
+    if ( FT_ALLOC( library->raster_pool, FT_RENDER_POOL_SIZE ) )
+      goto Fail;
+#endif
+
+    library->version_major = FREETYPE_MAJOR;
+    library->version_minor = FREETYPE_MINOR;
+    library->version_patch = FREETYPE_PATCH;
+
+    library->refcount = 1;
+
+    /* That's ok now */
+    *alibrary = library;
+
+    return FT_Err_Ok;
+
+  Fail:
+#ifdef FT_CONFIG_OPTION_PIC
+    ft_pic_container_destroy( library );
+#endif
+    FT_FREE( library );
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Library_Version( FT_Library   library,
+                      FT_Int      *amajor,
+                      FT_Int      *aminor,
+                      FT_Int      *apatch )
+  {
+    FT_Int  major = 0;
+    FT_Int  minor = 0;
+    FT_Int  patch = 0;
+
+
+    if ( library )
+    {
+      major = library->version_major;
+      minor = library->version_minor;
+      patch = library->version_patch;
+    }
+
+    if ( amajor )
+      *amajor = major;
+
+    if ( aminor )
+      *aminor = minor;
+
+    if ( apatch )
+      *apatch = patch;
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Done_Library( FT_Library  library )
+  {
+    FT_Memory  memory;
+
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    library->refcount--;
+    if ( library->refcount > 0 )
+      goto Exit;
+
+    memory = library->memory;
+
+    /*
+     * Close all faces in the library.  If we don't do this, we can have
+     * some subtle memory leaks.
+     *
+     * Example:
+     *
+     *  - the cff font driver uses the pshinter module in cff_size_done
+     *  - if the pshinter module is destroyed before the cff font driver,
+     *    opened FT_Face objects managed by the driver are not properly
+     *    destroyed, resulting in a memory leak
+     *
+     * Some faces are dependent on other faces, like Type42 faces that
+     * depend on TrueType faces synthesized internally.
+     *
+     * The order of drivers should be specified in driver_name[].
+     */
+    {
+      FT_UInt      m, n;
+      const char*  driver_name[] = { "type42", NULL };
+
+
+      for ( m = 0;
+            m < sizeof ( driver_name ) / sizeof ( driver_name[0] );
+            m++ )
+      {
+        for ( n = 0; n < library->num_modules; n++ )
+        {
+          FT_Module    module      = library->modules[n];
+          const char*  module_name = module->clazz->module_name;
+          FT_List      faces;
+
+
+          if ( driver_name[m]                                &&
+               ft_strcmp( module_name, driver_name[m] ) != 0 )
+            continue;
+
+          if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 )
+            continue;
+
+          FT_TRACE7(( "FT_Done_Library: close faces for %s\n", module_name ));
+
+          faces = &FT_DRIVER( module )->faces_list;
+          while ( faces->head )
+          {
+            FT_Done_Face( FT_FACE( faces->head->data ) );
+            if ( faces->head )
+              FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" ));
+          }
+        }
+      }
+    }
+
+    /* Close all other modules in the library */
+#if 1
+    /* XXX Modules are removed in the reversed order so that  */
+    /* type42 module is removed before truetype module.  This */
+    /* avoids double free in some occasions.  It is a hack.   */
+    while ( library->num_modules > 0 )
+      FT_Remove_Module( library,
+                        library->modules[library->num_modules - 1] );
+#else
+    {
+      FT_UInt  n;
+
+
+      for ( n = 0; n < library->num_modules; n++ )
+      {
+        FT_Module  module = library->modules[n];
+
+
+        if ( module )
+        {
+          Destroy_Module( module );
+          library->modules[n] = 0;
+        }
+      }
+    }
+#endif
+
+    /* Destroy raster objects */
+    FT_FREE( library->raster_pool );
+    library->raster_pool_size = 0;
+
+#ifdef FT_CONFIG_OPTION_PIC
+    /* Destroy pic container contents */
+    ft_pic_container_destroy( library );
+#endif
+
+    FT_FREE( library );
+
+  Exit:
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Set_Debug_Hook( FT_Library         library,
+                     FT_UInt            hook_index,
+                     FT_DebugHook_Func  debug_hook )
+  {
+    if ( library && debug_hook &&
+         hook_index <
+           ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) )
+      library->debug_hooks[hook_index] = debug_hook;
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_TrueTypeEngineType )
+  FT_Get_TrueType_Engine_Type( FT_Library  library )
+  {
+    FT_TrueTypeEngineType  result = FT_TRUETYPE_ENGINE_TYPE_NONE;
+
+
+    if ( library )
+    {
+      FT_Module  module = FT_Get_Module( library, "truetype" );
+
+
+      if ( module )
+      {
+        FT_Service_TrueTypeEngine  service;
+
+
+        service = (FT_Service_TrueTypeEngine)
+                    ft_module_get_service( module,
+                                           FT_SERVICE_ID_TRUETYPE_ENGINE );
+        if ( service )
+          result = service->engine_type;
+      }
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,
+                        FT_UInt       sub_index,
+                        FT_Int       *p_index,
+                        FT_UInt      *p_flags,
+                        FT_Int       *p_arg1,
+                        FT_Int       *p_arg2,
+                        FT_Matrix    *p_transform )
+  {
+    FT_Error  error = FT_ERR( Invalid_Argument );
+
+
+    if ( glyph                                      &&
+         glyph->subglyphs                           &&
+         glyph->format == FT_GLYPH_FORMAT_COMPOSITE &&
+         sub_index < glyph->num_subglyphs           )
+    {
+      FT_SubGlyph  subg = glyph->subglyphs + sub_index;
+
+
+      *p_index     = subg->index;
+      *p_flags     = subg->flags;
+      *p_arg1      = subg->arg1;
+      *p_arg2      = subg->arg2;
+      *p_transform = subg->transform;
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftotval.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftotval.c
new file mode 100644
index 0000000..898fd19
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftotval.c
@@ -0,0 +1,91 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftotval.c                                                              */
+/*                                                                         */
+/*    FreeType API for validating OpenType tables (body).                  */
+/*                                                                         */
+/*  Copyright 2004, 2006, 2008, 2010, 2013 by                              */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svotval.h"
+#include "../../include/freetype/ftotval.h"
+
+
+  /* documentation is in ftotval.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_OpenType_Validate( FT_Face    face,
+                        FT_UInt    validation_flags,
+                        FT_Bytes  *BASE_table,
+                        FT_Bytes  *GDEF_table,
+                        FT_Bytes  *GPOS_table,
+                        FT_Bytes  *GSUB_table,
+                        FT_Bytes  *JSTF_table )
+  {
+    FT_Service_OTvalidate  service;
+    FT_Error               error;
+
+
+    if ( !face )
+    {
+      error = FT_THROW( Invalid_Face_Handle );
+      goto Exit;
+    }
+
+    if ( !( BASE_table &&
+            GDEF_table &&
+            GPOS_table &&
+            GSUB_table &&
+            JSTF_table ) )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, service, OPENTYPE_VALIDATE );
+
+    if ( service )
+      error = service->validate( face,
+                                 validation_flags,
+                                 BASE_table,
+                                 GDEF_table,
+                                 GPOS_table,
+                                 GSUB_table,
+                                 JSTF_table );
+    else
+      error = FT_THROW( Unimplemented_Feature );
+
+  Exit:
+    return error;
+  }
+
+
+  FT_EXPORT_DEF( void )
+  FT_OpenType_Free( FT_Face   face,
+                    FT_Bytes  table )
+  {
+    FT_Memory  memory;
+
+
+    if ( !face )
+      return;
+
+    memory = FT_FACE_MEMORY( face );
+
+    FT_FREE( table );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftoutln.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftoutln.c
new file mode 100644
index 0000000..6112770
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftoutln.c
@@ -0,0 +1,1081 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftoutln.c                                                              */
+/*                                                                         */
+/*    FreeType outline management (body).                                  */
+/*                                                                         */
+/*  Copyright 1996-2008, 2010, 2012-2013 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* All functions are declared in freetype.h.                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/fttrigon.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_outline
+
+
+  static
+  const FT_Outline  null_outline = { 0, 0, 0, 0, 0, 0 };
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Decompose( FT_Outline*              outline,
+                        const FT_Outline_Funcs*  func_interface,
+                        void*                    user )
+  {
+#undef SCALED
+#define SCALED( x )  ( ( (x) << shift ) - delta )
+
+    FT_Vector   v_last;
+    FT_Vector   v_control;
+    FT_Vector   v_start;
+
+    FT_Vector*  point;
+    FT_Vector*  limit;
+    char*       tags;
+
+    FT_Error    error;
+
+    FT_Int   n;         /* index of contour in outline     */
+    FT_UInt  first;     /* index of first point in contour */
+    FT_Int   tag;       /* current point's state           */
+
+    FT_Int   shift;
+    FT_Pos   delta;
+
+
+    if ( !outline || !func_interface )
+      return FT_THROW( Invalid_Argument );
+
+    shift = func_interface->shift;
+    delta = func_interface->delta;
+    first = 0;
+
+    for ( n = 0; n < outline->n_contours; n++ )
+    {
+      FT_Int  last;  /* index of last point in contour */
+
+
+      FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n ));
+
+      last = outline->contours[n];
+      if ( last < 0 )
+        goto Invalid_Outline;
+      limit = outline->points + last;
+
+      v_start   = outline->points[first];
+      v_start.x = SCALED( v_start.x );
+      v_start.y = SCALED( v_start.y );
+
+      v_last   = outline->points[last];
+      v_last.x = SCALED( v_last.x );
+      v_last.y = SCALED( v_last.y );
+
+      v_control = v_start;
+
+      point = outline->points + first;
+      tags  = outline->tags   + first;
+      tag   = FT_CURVE_TAG( tags[0] );
+
+      /* A contour cannot start with a cubic control point! */
+      if ( tag == FT_CURVE_TAG_CUBIC )
+        goto Invalid_Outline;
+
+      /* check first point to determine origin */
+      if ( tag == FT_CURVE_TAG_CONIC )
+      {
+        /* first point is conic control.  Yes, this happens. */
+        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
+        {
+          /* start at last point if it is on the curve */
+          v_start = v_last;
+          limit--;
+        }
+        else
+        {
+          /* if both first and last points are conic,         */
+          /* start at their middle and record its position    */
+          /* for closure                                      */
+          v_start.x = ( v_start.x + v_last.x ) / 2;
+          v_start.y = ( v_start.y + v_last.y ) / 2;
+
+          v_last = v_start;
+        }
+        point--;
+        tags--;
+      }
+
+      FT_TRACE5(( "  move to (%.2f, %.2f)\n",
+                  v_start.x / 64.0, v_start.y / 64.0 ));
+      error = func_interface->move_to( &v_start, user );
+      if ( error )
+        goto Exit;
+
+      while ( point < limit )
+      {
+        point++;
+        tags++;
+
+        tag = FT_CURVE_TAG( tags[0] );
+        switch ( tag )
+        {
+        case FT_CURVE_TAG_ON:  /* emit a single line_to */
+          {
+            FT_Vector  vec;
+
+
+            vec.x = SCALED( point->x );
+            vec.y = SCALED( point->y );
+
+            FT_TRACE5(( "  line to (%.2f, %.2f)\n",
+                        vec.x / 64.0, vec.y / 64.0 ));
+            error = func_interface->line_to( &vec, user );
+            if ( error )
+              goto Exit;
+            continue;
+          }
+
+        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
+          v_control.x = SCALED( point->x );
+          v_control.y = SCALED( point->y );
+
+        Do_Conic:
+          if ( point < limit )
+          {
+            FT_Vector  vec;
+            FT_Vector  v_middle;
+
+
+            point++;
+            tags++;
+            tag = FT_CURVE_TAG( tags[0] );
+
+            vec.x = SCALED( point->x );
+            vec.y = SCALED( point->y );
+
+            if ( tag == FT_CURVE_TAG_ON )
+            {
+              FT_TRACE5(( "  conic to (%.2f, %.2f)"
+                          " with control (%.2f, %.2f)\n",
+                          vec.x / 64.0, vec.y / 64.0,
+                          v_control.x / 64.0, v_control.y / 64.0 ));
+              error = func_interface->conic_to( &v_control, &vec, user );
+              if ( error )
+                goto Exit;
+              continue;
+            }
+
+            if ( tag != FT_CURVE_TAG_CONIC )
+              goto Invalid_Outline;
+
+            v_middle.x = ( v_control.x + vec.x ) / 2;
+            v_middle.y = ( v_control.y + vec.y ) / 2;
+
+            FT_TRACE5(( "  conic to (%.2f, %.2f)"
+                        " with control (%.2f, %.2f)\n",
+                        v_middle.x / 64.0, v_middle.y / 64.0,
+                        v_control.x / 64.0, v_control.y / 64.0 ));
+            error = func_interface->conic_to( &v_control, &v_middle, user );
+            if ( error )
+              goto Exit;
+
+            v_control = vec;
+            goto Do_Conic;
+          }
+
+          FT_TRACE5(( "  conic to (%.2f, %.2f)"
+                      " with control (%.2f, %.2f)\n",
+                      v_start.x / 64.0, v_start.y / 64.0,
+                      v_control.x / 64.0, v_control.y / 64.0 ));
+          error = func_interface->conic_to( &v_control, &v_start, user );
+          goto Close;
+
+        default:  /* FT_CURVE_TAG_CUBIC */
+          {
+            FT_Vector  vec1, vec2;
+
+
+            if ( point + 1 > limit                             ||
+                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+              goto Invalid_Outline;
+
+            point += 2;
+            tags  += 2;
+
+            vec1.x = SCALED( point[-2].x );
+            vec1.y = SCALED( point[-2].y );
+
+            vec2.x = SCALED( point[-1].x );
+            vec2.y = SCALED( point[-1].y );
+
+            if ( point <= limit )
+            {
+              FT_Vector  vec;
+
+
+              vec.x = SCALED( point->x );
+              vec.y = SCALED( point->y );
+
+              FT_TRACE5(( "  cubic to (%.2f, %.2f)"
+                          " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+                          vec.x / 64.0, vec.y / 64.0,
+                          vec1.x / 64.0, vec1.y / 64.0,
+                          vec2.x / 64.0, vec2.y / 64.0 ));
+              error = func_interface->cubic_to( &vec1, &vec2, &vec, user );
+              if ( error )
+                goto Exit;
+              continue;
+            }
+
+            FT_TRACE5(( "  cubic to (%.2f, %.2f)"
+                        " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+                        v_start.x / 64.0, v_start.y / 64.0,
+                        vec1.x / 64.0, vec1.y / 64.0,
+                        vec2.x / 64.0, vec2.y / 64.0 ));
+            error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );
+            goto Close;
+          }
+        }
+      }
+
+      /* close the contour with a line segment */
+      FT_TRACE5(( "  line to (%.2f, %.2f)\n",
+                  v_start.x / 64.0, v_start.y / 64.0 ));
+      error = func_interface->line_to( &v_start, user );
+
+    Close:
+      if ( error )
+        goto Exit;
+
+      first = last + 1;
+    }
+
+    FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
+    return FT_Err_Ok;
+
+  Exit:
+    FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error ));
+    return error;
+
+  Invalid_Outline:
+    return FT_THROW( Invalid_Outline );
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_New_Internal( FT_Memory    memory,
+                           FT_UInt      numPoints,
+                           FT_Int       numContours,
+                           FT_Outline  *anoutline )
+  {
+    FT_Error  error;
+
+
+    if ( !anoutline || !memory )
+      return FT_THROW( Invalid_Argument );
+
+    *anoutline = null_outline;
+
+    if ( numContours < 0                  ||
+         (FT_UInt)numContours > numPoints )
+      return FT_THROW( Invalid_Argument );
+
+    if ( numPoints > FT_OUTLINE_POINTS_MAX )
+      return FT_THROW( Array_Too_Large );
+
+    if ( FT_NEW_ARRAY( anoutline->points,   numPoints   ) ||
+         FT_NEW_ARRAY( anoutline->tags,     numPoints   ) ||
+         FT_NEW_ARRAY( anoutline->contours, numContours ) )
+      goto Fail;
+
+    anoutline->n_points    = (FT_UShort)numPoints;
+    anoutline->n_contours  = (FT_Short)numContours;
+    anoutline->flags      |= FT_OUTLINE_OWNER;
+
+    return FT_Err_Ok;
+
+  Fail:
+    anoutline->flags |= FT_OUTLINE_OWNER;
+    FT_Outline_Done_Internal( memory, anoutline );
+
+    return error;
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_New( FT_Library   library,
+                  FT_UInt      numPoints,
+                  FT_Int       numContours,
+                  FT_Outline  *anoutline )
+  {
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    return FT_Outline_New_Internal( library->memory, numPoints,
+                                    numContours, anoutline );
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Check( FT_Outline*  outline )
+  {
+    if ( outline )
+    {
+      FT_Int  n_points   = outline->n_points;
+      FT_Int  n_contours = outline->n_contours;
+      FT_Int  end0, end;
+      FT_Int  n;
+
+
+      /* empty glyph? */
+      if ( n_points == 0 && n_contours == 0 )
+        return 0;
+
+      /* check point and contour counts */
+      if ( n_points <= 0 || n_contours <= 0 )
+        goto Bad;
+
+      end0 = end = -1;
+      for ( n = 0; n < n_contours; n++ )
+      {
+        end = outline->contours[n];
+
+        /* note that we don't accept empty contours */
+        if ( end <= end0 || end >= n_points )
+          goto Bad;
+
+        end0 = end;
+      }
+
+      if ( end != n_points - 1 )
+        goto Bad;
+
+      /* XXX: check the tags array */
+      return 0;
+    }
+
+  Bad:
+    return FT_THROW( Invalid_Argument );
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Copy( const FT_Outline*  source,
+                   FT_Outline        *target )
+  {
+    FT_Int  is_owner;
+
+
+    if ( !source            || !target            ||
+         source->n_points   != target->n_points   ||
+         source->n_contours != target->n_contours )
+      return FT_THROW( Invalid_Argument );
+
+    if ( source == target )
+      return FT_Err_Ok;
+
+    FT_ARRAY_COPY( target->points, source->points, source->n_points );
+
+    FT_ARRAY_COPY( target->tags, source->tags, source->n_points );
+
+    FT_ARRAY_COPY( target->contours, source->contours, source->n_contours );
+
+    /* copy all flags, except the `FT_OUTLINE_OWNER' one */
+    is_owner      = target->flags & FT_OUTLINE_OWNER;
+    target->flags = source->flags;
+
+    target->flags &= ~FT_OUTLINE_OWNER;
+    target->flags |= is_owner;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Done_Internal( FT_Memory    memory,
+                            FT_Outline*  outline )
+  {
+    if ( memory && outline )
+    {
+      if ( outline->flags & FT_OUTLINE_OWNER )
+      {
+        FT_FREE( outline->points   );
+        FT_FREE( outline->tags     );
+        FT_FREE( outline->contours );
+      }
+      *outline = null_outline;
+
+      return FT_Err_Ok;
+    }
+    else
+      return FT_THROW( Invalid_Argument );
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Done( FT_Library   library,
+                   FT_Outline*  outline )
+  {
+    /* check for valid `outline' in FT_Outline_Done_Internal() */
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    return FT_Outline_Done_Internal( library->memory, outline );
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Outline_Get_CBox( const FT_Outline*  outline,
+                       FT_BBox           *acbox )
+  {
+    FT_Pos  xMin, yMin, xMax, yMax;
+
+
+    if ( outline && acbox )
+    {
+      if ( outline->n_points == 0 )
+      {
+        xMin = 0;
+        yMin = 0;
+        xMax = 0;
+        yMax = 0;
+      }
+      else
+      {
+        FT_Vector*  vec   = outline->points;
+        FT_Vector*  limit = vec + outline->n_points;
+
+
+        xMin = xMax = vec->x;
+        yMin = yMax = vec->y;
+        vec++;
+
+        for ( ; vec < limit; vec++ )
+        {
+          FT_Pos  x, y;
+
+
+          x = vec->x;
+          if ( x < xMin ) xMin = x;
+          if ( x > xMax ) xMax = x;
+
+          y = vec->y;
+          if ( y < yMin ) yMin = y;
+          if ( y > yMax ) yMax = y;
+        }
+      }
+      acbox->xMin = xMin;
+      acbox->xMax = xMax;
+      acbox->yMin = yMin;
+      acbox->yMax = yMax;
+    }
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Outline_Translate( const FT_Outline*  outline,
+                        FT_Pos             xOffset,
+                        FT_Pos             yOffset )
+  {
+    FT_UShort   n;
+    FT_Vector*  vec;
+
+
+    if ( !outline )
+      return;
+
+    vec = outline->points;
+
+    for ( n = 0; n < outline->n_points; n++ )
+    {
+      vec->x += xOffset;
+      vec->y += yOffset;
+      vec++;
+    }
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Outline_Reverse( FT_Outline*  outline )
+  {
+    FT_UShort  n;
+    FT_Int     first, last;
+
+
+    if ( !outline )
+      return;
+
+    first = 0;
+
+    for ( n = 0; n < outline->n_contours; n++ )
+    {
+      last  = outline->contours[n];
+
+      /* reverse point table */
+      {
+        FT_Vector*  p = outline->points + first;
+        FT_Vector*  q = outline->points + last;
+        FT_Vector   swap;
+
+
+        while ( p < q )
+        {
+          swap = *p;
+          *p   = *q;
+          *q   = swap;
+          p++;
+          q--;
+        }
+      }
+
+      /* reverse tags table */
+      {
+        char*  p = outline->tags + first;
+        char*  q = outline->tags + last;
+        char   swap;
+
+
+        while ( p < q )
+        {
+          swap = *p;
+          *p   = *q;
+          *q   = swap;
+          p++;
+          q--;
+        }
+      }
+
+      first = last + 1;
+    }
+
+    outline->flags ^= FT_OUTLINE_REVERSE_FILL;
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Render( FT_Library         library,
+                     FT_Outline*        outline,
+                     FT_Raster_Params*  params )
+  {
+    FT_Error     error;
+    FT_Bool      update = FALSE;
+    FT_Renderer  renderer;
+    FT_ListNode  node;
+
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    if ( !outline || !params )
+      return FT_THROW( Invalid_Argument );
+
+    renderer = library->cur_renderer;
+    node     = library->renderers.head;
+
+    params->source = (void*)outline;
+
+    error = FT_ERR( Cannot_Render_Glyph );
+    while ( renderer )
+    {
+      error = renderer->raster_render( renderer->raster, params );
+      if ( !error || FT_ERR_NEQ( error, Cannot_Render_Glyph ) )
+        break;
+
+      /* FT_Err_Cannot_Render_Glyph is returned if the render mode   */
+      /* is unsupported by the current renderer for this glyph image */
+      /* format                                                      */
+
+      /* now, look for another renderer that supports the same */
+      /* format                                                */
+      renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE,
+                                     &node );
+      update   = TRUE;
+    }
+
+    /* if we changed the current renderer for the glyph image format */
+    /* we need to select it as the next current one                  */
+    if ( !error && update && renderer )
+      FT_Set_Renderer( library, renderer, 0, 0 );
+
+    return error;
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Get_Bitmap( FT_Library        library,
+                         FT_Outline*       outline,
+                         const FT_Bitmap  *abitmap )
+  {
+    FT_Raster_Params  params;
+
+
+    if ( !abitmap )
+      return FT_THROW( Invalid_Argument );
+
+    /* other checks are delayed to FT_Outline_Render() */
+
+    params.target = abitmap;
+    params.flags  = 0;
+
+    if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY  ||
+         abitmap->pixel_mode == FT_PIXEL_MODE_LCD   ||
+         abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V )
+      params.flags |= FT_RASTER_FLAG_AA;
+
+    return FT_Outline_Render( library, outline, &params );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Vector_Transform( FT_Vector*        vector,
+                       const FT_Matrix*  matrix )
+  {
+    FT_Pos  xz, yz;
+
+
+    if ( !vector || !matrix )
+      return;
+
+    xz = FT_MulFix( vector->x, matrix->xx ) +
+         FT_MulFix( vector->y, matrix->xy );
+
+    yz = FT_MulFix( vector->x, matrix->yx ) +
+         FT_MulFix( vector->y, matrix->yy );
+
+    vector->x = xz;
+    vector->y = yz;
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Outline_Transform( const FT_Outline*  outline,
+                        const FT_Matrix*   matrix )
+  {
+    FT_Vector*  vec;
+    FT_Vector*  limit;
+
+
+    if ( !outline || !matrix )
+      return;
+
+    vec   = outline->points;
+    limit = vec + outline->n_points;
+
+    for ( ; vec < limit; vec++ )
+      FT_Vector_Transform( vec, matrix );
+  }
+
+
+#if 0
+
+#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last )  \
+  do {                                                     \
+    (first) = ( c > 0 ) ? (outline)->points +              \
+                            (outline)->contours[c - 1] + 1 \
+                        : (outline)->points;               \
+    (last) = (outline)->points + (outline)->contours[c];   \
+  } while ( 0 )
+
+
+  /* Is a point in some contour?                     */
+  /*                                                 */
+  /* We treat every point of the contour as if it    */
+  /* it were ON.  That is, we allow false positives, */
+  /* but disallow false negatives.  (XXX really?)    */
+  static FT_Bool
+  ft_contour_has( FT_Outline*  outline,
+                  FT_Short     c,
+                  FT_Vector*   point )
+  {
+    FT_Vector*  first;
+    FT_Vector*  last;
+    FT_Vector*  a;
+    FT_Vector*  b;
+    FT_UInt     n = 0;
+
+
+    FT_OUTLINE_GET_CONTOUR( outline, c, first, last );
+
+    for ( a = first; a <= last; a++ )
+    {
+      FT_Pos  x;
+      FT_Int  intersect;
+
+
+      b = ( a == last ) ? first : a + 1;
+
+      intersect = ( a->y - point->y ) ^ ( b->y - point->y );
+
+      /* a and b are on the same side */
+      if ( intersect >= 0 )
+      {
+        if ( intersect == 0 && a->y == point->y )
+        {
+          if ( ( a->x <= point->x && b->x >= point->x ) ||
+               ( a->x >= point->x && b->x <= point->x ) )
+            return 1;
+        }
+
+        continue;
+      }
+
+      x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y );
+
+      if ( x < point->x )
+        n++;
+      else if ( x == point->x )
+        return 1;
+    }
+
+    return n & 1;
+  }
+
+
+  static FT_Bool
+  ft_contour_enclosed( FT_Outline*  outline,
+                       FT_UShort    c )
+  {
+    FT_Vector*  first;
+    FT_Vector*  last;
+    FT_Short    i;
+
+
+    FT_OUTLINE_GET_CONTOUR( outline, c, first, last );
+
+    for ( i = 0; i < outline->n_contours; i++ )
+    {
+      if ( i != c && ft_contour_has( outline, i, first ) )
+      {
+        FT_Vector*  pt;
+
+
+        for ( pt = first + 1; pt <= last; pt++ )
+          if ( !ft_contour_has( outline, i, pt ) )
+            return 0;
+
+        return 1;
+      }
+    }
+
+    return 0;
+  }
+
+
+  /* This version differs from the public one in that each */
+  /* part (contour not enclosed in another contour) of the */
+  /* outline is checked for orientation.  This is          */
+  /* necessary for some buggy CJK fonts.                   */
+  static FT_Orientation
+  ft_outline_get_orientation( FT_Outline*  outline )
+  {
+    FT_Short        i;
+    FT_Vector*      first;
+    FT_Vector*      last;
+    FT_Orientation  orient = FT_ORIENTATION_NONE;
+
+
+    first = outline->points;
+    for ( i = 0; i < outline->n_contours; i++, first = last + 1 )
+    {
+      FT_Vector*  point;
+      FT_Vector*  xmin_point;
+      FT_Pos      xmin;
+
+
+      last = outline->points + outline->contours[i];
+
+      /* skip degenerate contours */
+      if ( last < first + 2 )
+        continue;
+
+      if ( ft_contour_enclosed( outline, i ) )
+        continue;
+
+      xmin       = first->x;
+      xmin_point = first;
+
+      for ( point = first + 1; point <= last; point++ )
+      {
+        if ( point->x < xmin )
+        {
+          xmin       = point->x;
+          xmin_point = point;
+        }
+      }
+
+      /* check the orientation of the contour */
+      {
+        FT_Vector*      prev;
+        FT_Vector*      next;
+        FT_Orientation  o;
+
+
+        prev = ( xmin_point == first ) ? last : xmin_point - 1;
+        next = ( xmin_point == last ) ? first : xmin_point + 1;
+
+        if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) >
+             FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) )
+          o = FT_ORIENTATION_POSTSCRIPT;
+        else
+          o = FT_ORIENTATION_TRUETYPE;
+
+        if ( orient == FT_ORIENTATION_NONE )
+          orient = o;
+        else if ( orient != o )
+          return FT_ORIENTATION_NONE;
+      }
+    }
+
+    return orient;
+  }
+
+#endif /* 0 */
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Embolden( FT_Outline*  outline,
+                       FT_Pos       strength )
+  {
+    return FT_Outline_EmboldenXY( outline, strength, strength );
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_EmboldenXY( FT_Outline*  outline,
+                         FT_Pos       xstrength,
+                         FT_Pos       ystrength )
+  {
+    FT_Vector*  points;
+    FT_Vector   v_prev, v_first, v_next, v_cur;
+    FT_Int      c, n, first;
+    FT_Int      orientation;
+
+
+    if ( !outline )
+      return FT_THROW( Invalid_Argument );
+
+    xstrength /= 2;
+    ystrength /= 2;
+    if ( xstrength == 0 && ystrength == 0 )
+      return FT_Err_Ok;
+
+    orientation = FT_Outline_Get_Orientation( outline );
+    if ( orientation == FT_ORIENTATION_NONE )
+    {
+      if ( outline->n_contours )
+        return FT_THROW( Invalid_Argument );
+      else
+        return FT_Err_Ok;
+    }
+
+    points = outline->points;
+
+    first = 0;
+    for ( c = 0; c < outline->n_contours; c++ )
+    {
+      FT_Vector  in, out, shift;
+      FT_Fixed   l_in, l_out, l, q, d;
+      int        last = outline->contours[c];
+
+
+      v_first = points[first];
+      v_prev  = points[last];
+      v_cur   = v_first;
+
+      /* compute incoming normalized vector */
+      in.x = v_cur.x - v_prev.x;
+      in.y = v_cur.y - v_prev.y;
+      l_in = FT_Vector_Length( &in );
+      if ( l_in )
+      {
+        in.x = FT_DivFix( in.x, l_in );
+        in.y = FT_DivFix( in.y, l_in );
+      }
+
+      for ( n = first; n <= last; n++ )
+      {
+        if ( n < last )
+          v_next = points[n + 1];
+        else
+          v_next = v_first;
+
+        /* compute outgoing normalized vector */
+        out.x = v_next.x - v_cur.x;
+        out.y = v_next.y - v_cur.y;
+        l_out = FT_Vector_Length( &out );
+        if ( l_out )
+        {
+          out.x = FT_DivFix( out.x, l_out );
+          out.y = FT_DivFix( out.y, l_out );
+        }
+
+        d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y );
+
+        /* shift only if turn is less than ~160 degrees */
+        if ( d > -0xF000L )
+        {
+          d = d + 0x10000L;
+
+          /* shift components are aligned along lateral bisector */
+          /* and directed according to the outline orientation.  */
+          shift.x = in.y + out.y;
+          shift.y = in.x + out.x;
+
+          if ( orientation == FT_ORIENTATION_TRUETYPE )
+            shift.x = -shift.x;
+          else
+            shift.y = -shift.y;
+
+          /* restrict shift magnitude to better handle collapsing segments */
+          q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x );
+          if ( orientation == FT_ORIENTATION_TRUETYPE )
+            q = -q;
+
+          l = FT_MIN( l_in, l_out );
+
+          /* non-strict inequalities avoid divide-by-zero when q == l == 0 */
+          if ( FT_MulFix( xstrength, q ) <= FT_MulFix( d, l ) )
+            shift.x = FT_MulDiv( shift.x, xstrength, d );
+          else
+            shift.x = FT_MulDiv( shift.x, l, q );
+
+
+          if ( FT_MulFix( ystrength, q ) <= FT_MulFix( d, l ) )
+            shift.y = FT_MulDiv( shift.y, ystrength, d );
+          else
+            shift.y = FT_MulDiv( shift.y, l, q );
+        }
+        else
+          shift.x = shift.y = 0;
+
+        outline->points[n].x = v_cur.x + xstrength + shift.x;
+        outline->points[n].y = v_cur.y + ystrength + shift.y;
+
+        in    = out;
+        l_in  = l_out;
+        v_cur = v_next;
+      }
+
+      first = last + 1;
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Orientation )
+  FT_Outline_Get_Orientation( FT_Outline*  outline )
+  {
+    FT_BBox     cbox;
+    FT_Int      xshift, yshift;
+    FT_Vector*  points;
+    FT_Vector   v_prev, v_cur;
+    FT_Int      c, n, first;
+    FT_Pos      area = 0;
+
+
+    if ( !outline || outline->n_points <= 0 )
+      return FT_ORIENTATION_TRUETYPE;
+
+    /* We use the nonzero winding rule to find the orientation.       */
+    /* Since glyph outlines behave much more `regular' than arbitrary */
+    /* cubic or quadratic curves, this test deals with the polygon    */
+    /* only which is spanned up by the control points.                */
+
+    FT_Outline_Get_CBox( outline, &cbox );
+
+    xshift = FT_MSB( FT_ABS( cbox.xMax ) | FT_ABS( cbox.xMin ) ) - 14;
+    xshift = FT_MAX( xshift, 0 );
+
+    yshift = FT_MSB( cbox.yMax - cbox.yMin ) - 14;
+    yshift = FT_MAX( yshift, 0 );
+
+    points = outline->points;
+
+    first = 0;
+    for ( c = 0; c < outline->n_contours; c++ )
+    {
+      FT_Int  last = outline->contours[c];
+
+
+      v_prev = points[last];
+
+      for ( n = first; n <= last; n++ )
+      {
+        v_cur = points[n];
+        area += ( ( v_cur.y - v_prev.y ) >> yshift ) *
+                ( ( v_cur.x + v_prev.x ) >> xshift );
+        v_prev = v_cur;
+      }
+
+      first = last + 1;
+    }
+
+    if ( area > 0 )
+      return FT_ORIENTATION_POSTSCRIPT;
+    else if ( area < 0 )
+      return FT_ORIENTATION_TRUETYPE;
+    else
+      return FT_ORIENTATION_NONE;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpatent.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpatent.c
new file mode 100644
index 0000000..589119c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpatent.c
@@ -0,0 +1,286 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpatent.c                                                             */
+/*                                                                         */
+/*    FreeType API for checking patented TrueType bytecode instructions    */
+/*    (body).                                                              */
+/*                                                                         */
+/*  Copyright 2007, 2008, 2010 by David Turner.                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/services/svsfnt.h"
+#include "../../include/freetype/internal/services/svttglyf.h"
+
+
+  static FT_Bool
+  _tt_check_patents_in_range( FT_Stream  stream,
+                              FT_ULong   size )
+  {
+    FT_Bool   result = FALSE;
+    FT_Error  error;
+    FT_Bytes  p, end;
+
+
+    if ( FT_FRAME_ENTER( size ) )
+      return 0;
+
+    p   = stream->cursor;
+    end = p + size;
+
+    while ( p < end )
+    {
+      switch (p[0])
+      {
+      case 0x06:  /* SPvTL // */
+      case 0x07:  /* SPvTL +  */
+      case 0x08:  /* SFvTL // */
+      case 0x09:  /* SFvTL +  */
+      case 0x0A:  /* SPvFS    */
+      case 0x0B:  /* SFvFS    */
+        result = TRUE;
+        goto Exit;
+
+      case 0x40:
+        if ( p + 1 >= end )
+          goto Exit;
+
+        p += p[1] + 2;
+        break;
+
+      case 0x41:
+        if ( p + 1 >= end )
+          goto Exit;
+
+        p += p[1] * 2 + 2;
+        break;
+
+      case 0x71:  /* DELTAP2 */
+      case 0x72:  /* DELTAP3 */
+      case 0x73:  /* DELTAC0 */
+      case 0x74:  /* DELTAC1 */
+      case 0x75:  /* DELTAC2 */
+        result = TRUE;
+        goto Exit;
+
+      case 0xB0:
+      case 0xB1:
+      case 0xB2:
+      case 0xB3:
+      case 0xB4:
+      case 0xB5:
+      case 0xB6:
+      case 0xB7:
+        p += ( p[0] - 0xB0 ) + 2;
+        break;
+
+      case 0xB8:
+      case 0xB9:
+      case 0xBA:
+      case 0xBB:
+      case 0xBC:
+      case 0xBD:
+      case 0xBE:
+      case 0xBF:
+        p += ( p[0] - 0xB8 ) * 2 + 3;
+        break;
+
+      default:
+        p += 1;
+        break;
+      }
+    }
+
+  Exit:
+    FT_UNUSED( error );
+    FT_FRAME_EXIT();
+    return result;
+  }
+
+
+  static FT_Bool
+  _tt_check_patents_in_table( FT_Face   face,
+                              FT_ULong  tag )
+  {
+    FT_Stream              stream = face->stream;
+    FT_Error               error  = FT_Err_Ok;
+    FT_Service_SFNT_Table  service;
+    FT_Bool                result = FALSE;
+
+
+    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+
+    if ( service )
+    {
+      FT_UInt   i = 0;
+      FT_ULong  tag_i = 0, offset_i = 0, length_i = 0;
+
+
+      for ( i = 0; !error && tag_i != tag ; i++ )
+        error = service->table_info( face, i,
+                                     &tag_i, &offset_i, &length_i );
+
+      if ( error                      ||
+           FT_STREAM_SEEK( offset_i ) )
+        goto Exit;
+
+      result = _tt_check_patents_in_range( stream, length_i );
+    }
+
+  Exit:
+    return result;
+  }
+
+
+  static FT_Bool
+  _tt_face_check_patents( FT_Face  face )
+  {
+    FT_Stream  stream = face->stream;
+    FT_UInt    gindex;
+    FT_Error   error;
+    FT_Bool    result;
+
+    FT_Service_TTGlyf  service;
+
+
+    result = _tt_check_patents_in_table( face, TTAG_fpgm );
+    if ( result )
+      goto Exit;
+
+    result = _tt_check_patents_in_table( face, TTAG_prep );
+    if ( result )
+      goto Exit;
+
+    FT_FACE_FIND_SERVICE( face, service, TT_GLYF );
+    if ( service == NULL )
+      goto Exit;
+
+    for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ )
+    {
+      FT_ULong  offset, num_ins, size;
+      FT_Int    num_contours;
+
+
+      offset = service->get_location( face, gindex, &size );
+      if ( size == 0 )
+        continue;
+
+      if ( FT_STREAM_SEEK( offset )      ||
+           FT_READ_SHORT( num_contours ) )
+        continue;
+
+      if ( num_contours >= 0 )  /* simple glyph */
+      {
+        if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) )
+          continue;
+      }
+      else  /* compound glyph */
+      {
+        FT_Bool  has_instr = 0;
+
+
+        if ( FT_STREAM_SKIP( 8 ) )
+          continue;
+
+        /* now read each component */
+        for (;;)
+        {
+          FT_UInt  flags, toskip;
+
+
+          if( FT_READ_USHORT( flags ) )
+            break;
+
+          toskip = 2 + 1 + 1;
+
+          if ( ( flags & ( 1 << 0 ) ) != 0 )       /* ARGS_ARE_WORDS */
+            toskip += 2;
+
+          if ( ( flags & ( 1 << 3 ) ) != 0 )       /* WE_HAVE_A_SCALE */
+            toskip += 2;
+          else if ( ( flags & ( 1 << 6 ) ) != 0 )  /* WE_HAVE_X_Y_SCALE */
+            toskip += 4;
+          else if ( ( flags & ( 1 << 7 ) ) != 0 )  /* WE_HAVE_A_2x2 */
+            toskip += 8;
+
+          if ( ( flags & ( 1 << 8 ) ) != 0 )       /* WE_HAVE_INSTRUCTIONS */
+            has_instr = 1;
+
+          if ( FT_STREAM_SKIP( toskip ) )
+            goto NextGlyph;
+
+          if ( ( flags & ( 1 << 5 ) ) == 0 )       /* MORE_COMPONENTS */
+            break;
+        }
+
+        if ( !has_instr )
+          goto NextGlyph;
+      }
+
+      if ( FT_READ_USHORT( num_ins ) )
+        continue;
+
+      result = _tt_check_patents_in_range( stream, num_ins );
+      if ( result )
+        goto Exit;
+
+    NextGlyph:
+      ;
+    }
+
+  Exit:
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Bool )
+  FT_Face_CheckTrueTypePatents( FT_Face  face )
+  {
+    FT_Bool  result = FALSE;
+
+
+    if ( face && FT_IS_SFNT( face ) )
+      result = _tt_face_check_patents( face );
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Bool )
+  FT_Face_SetUnpatentedHinting( FT_Face  face,
+                                FT_Bool  value )
+  {
+    FT_Bool  result = FALSE;
+
+
+#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \
+    !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )
+    if ( face && FT_IS_SFNT( face ) )
+    {
+      result = !face->internal->ignore_unpatented_hinter;
+      face->internal->ignore_unpatented_hinter = !value;
+    }
+#else
+    FT_UNUSED( face );
+    FT_UNUSED( value );
+#endif
+
+    return result;
+  }
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpfr.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpfr.c
new file mode 100644
index 0000000..1ea6888
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpfr.c
@@ -0,0 +1,146 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpfr.c                                                                */
+/*                                                                         */
+/*    FreeType API for accessing PFR-specific data (body).                 */
+/*                                                                         */
+/*  Copyright 2002-2004, 2008, 2010, 2013 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svpfr.h"
+
+
+  /* check the format */
+  static FT_Service_PfrMetrics
+  ft_pfr_check( FT_Face  face )
+  {
+    FT_Service_PfrMetrics  service = NULL;
+
+
+    if ( face )
+      FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS );
+
+    return service;
+  }
+
+
+  /* documentation is in ftpfr.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_PFR_Metrics( FT_Face    face,
+                      FT_UInt   *aoutline_resolution,
+                      FT_UInt   *ametrics_resolution,
+                      FT_Fixed  *ametrics_x_scale,
+                      FT_Fixed  *ametrics_y_scale )
+  {
+    FT_Error               error = FT_Err_Ok;
+    FT_Service_PfrMetrics  service;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Argument );
+
+    service = ft_pfr_check( face );
+    if ( service )
+    {
+      error = service->get_metrics( face,
+                                    aoutline_resolution,
+                                    ametrics_resolution,
+                                    ametrics_x_scale,
+                                    ametrics_y_scale );
+    }
+    else
+    {
+      FT_Fixed  x_scale, y_scale;
+
+
+      /* this is not a PFR font */
+      if ( aoutline_resolution )
+        *aoutline_resolution = face->units_per_EM;
+
+      if ( ametrics_resolution )
+        *ametrics_resolution = face->units_per_EM;
+
+      x_scale = y_scale = 0x10000L;
+      if ( face->size )
+      {
+        x_scale = face->size->metrics.x_scale;
+        y_scale = face->size->metrics.y_scale;
+      }
+
+      if ( ametrics_x_scale )
+        *ametrics_x_scale = x_scale;
+
+      if ( ametrics_y_scale )
+        *ametrics_y_scale = y_scale;
+
+      error = FT_THROW( Unknown_File_Format );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftpfr.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_PFR_Kerning( FT_Face     face,
+                      FT_UInt     left,
+                      FT_UInt     right,
+                      FT_Vector  *avector )
+  {
+    FT_Error               error;
+    FT_Service_PfrMetrics  service;
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Argument );
+
+    service = ft_pfr_check( face );
+    if ( service )
+      error = service->get_kerning( face, left, right, avector );
+    else
+      error = FT_Get_Kerning( face, left, right,
+                              FT_KERNING_UNSCALED, avector );
+
+    return error;
+  }
+
+
+  /* documentation is in ftpfr.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_PFR_Advance( FT_Face   face,
+                      FT_UInt   gindex,
+                      FT_Pos   *aadvance )
+  {
+    FT_Error               error;
+    FT_Service_PfrMetrics  service;
+
+
+    service = ft_pfr_check( face );
+    if ( service )
+    {
+      error = service->get_advance( face, gindex, aadvance );
+    }
+    else
+      /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */
+      error = FT_THROW( Invalid_Argument );
+
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpic.c
new file mode 100644
index 0000000..45c9ad2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpic.c
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpic.c                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services (body).              */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "basepic.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* documentation is in ftpic.h */
+
+  FT_BASE_DEF( FT_Error )
+  ft_pic_container_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = FT_Err_Ok;
+
+
+    FT_MEM_SET( pic_container, 0, sizeof ( *pic_container ) );
+
+    error = ft_base_pic_init( library );
+    if ( error )
+      return error;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* Destroy the contents of the container. */
+  FT_BASE_DEF( void )
+  ft_pic_container_destroy( FT_Library  library )
+  {
+    ft_base_pic_free( library );
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftrfork.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftrfork.c
new file mode 100644
index 0000000..8ab830e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftrfork.c
@@ -0,0 +1,849 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftrfork.c                                                              */
+/*                                                                         */
+/*    Embedded resource forks accessor (body).                             */
+/*                                                                         */
+/*  Copyright 2004-2010, 2013 by                                           */
+/*  Masatake YAMATO and Redhat K.K.                                        */
+/*                                                                         */
+/*  FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are     */
+/*  derived from ftobjs.c.                                                 */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/* Development of the code in this file is support of                      */
+/* Information-technology Promotion Agency, Japan.                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/ftrfork.h"
+#include "basepic.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_raccess
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****               Resource fork directory access                    ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_BASE_DEF( FT_Error )
+  FT_Raccess_Get_HeaderInfo( FT_Library  library,
+                             FT_Stream   stream,
+                             FT_Long     rfork_offset,
+                             FT_Long    *map_offset,
+                             FT_Long    *rdata_pos )
+  {
+    FT_Error       error;
+    unsigned char  head[16], head2[16];
+    FT_Long        map_pos, rdata_len;
+    int            allzeros, allmatch, i;
+    FT_Long        type_list;
+
+    FT_UNUSED( library );
+
+
+    error = FT_Stream_Seek( stream, rfork_offset );
+    if ( error )
+      return error;
+
+    error = FT_Stream_Read( stream, (FT_Byte *)head, 16 );
+    if ( error )
+      return error;
+
+    *rdata_pos = rfork_offset + ( ( head[0] << 24 ) |
+                                  ( head[1] << 16 ) |
+                                  ( head[2] <<  8 ) |
+                                    head[3]         );
+    map_pos    = rfork_offset + ( ( head[4] << 24 ) |
+                                  ( head[5] << 16 ) |
+                                  ( head[6] <<  8 ) |
+                                    head[7]         );
+    rdata_len = ( head[ 8] << 24 ) |
+                ( head[ 9] << 16 ) |
+                ( head[10] <<  8 ) |
+                  head[11];
+
+    /* map_len = head[12] .. head[15] */
+
+    if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset )
+      return FT_THROW( Unknown_File_Format );
+
+    error = FT_Stream_Seek( stream, map_pos );
+    if ( error )
+      return error;
+
+    head2[15] = (FT_Byte)( head[15] + 1 );       /* make it be different */
+
+    error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 );
+    if ( error )
+      return error;
+
+    allzeros = 1;
+    allmatch = 1;
+    for ( i = 0; i < 16; ++i )
+    {
+      if ( head2[i] != 0 )
+        allzeros = 0;
+      if ( head2[i] != head[i] )
+        allmatch = 0;
+    }
+    if ( !allzeros && !allmatch )
+      return FT_THROW( Unknown_File_Format );
+
+    /* If we have reached this point then it is probably a mac resource */
+    /* file.  Now, does it contain any interesting resources?           */
+    /* Skip handle to next resource map, the file resource number, and  */
+    /* attributes.                                                      */
+    (void)FT_STREAM_SKIP( 4        /* skip handle to next resource map */
+                          + 2      /* skip file resource number */
+                          + 2 );   /* skip attributes */
+
+    if ( FT_READ_USHORT( type_list ) )
+      return error;
+    if ( type_list == -1 )
+      return FT_THROW( Unknown_File_Format );
+
+    error = FT_Stream_Seek( stream, map_pos + type_list );
+    if ( error )
+      return error;
+
+    *map_offset = map_pos + type_list;
+    return FT_Err_Ok;
+  }
+
+
+  static int
+  ft_raccess_sort_ref_by_id( FT_RFork_Ref*  a,
+                             FT_RFork_Ref*  b )
+  {
+    if ( a->res_id < b->res_id )
+      return -1;
+    else if ( a->res_id > b->res_id )
+      return 1;
+    else
+      return 0;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Raccess_Get_DataOffsets( FT_Library  library,
+                              FT_Stream   stream,
+                              FT_Long     map_offset,
+                              FT_Long     rdata_pos,
+                              FT_Long     tag,
+                              FT_Long   **offsets,
+                              FT_Long    *count )
+  {
+    FT_Error      error;
+    int           i, j, cnt, subcnt;
+    FT_Long       tag_internal, rpos;
+    FT_Memory     memory = library->memory;
+    FT_Long       temp;
+    FT_Long       *offsets_internal = NULL;
+    FT_RFork_Ref  *ref = NULL;
+
+
+    error = FT_Stream_Seek( stream, map_offset );
+    if ( error )
+      return error;
+
+    if ( FT_READ_USHORT( cnt ) )
+      return error;
+    cnt++;
+
+    for ( i = 0; i < cnt; ++i )
+    {
+      if ( FT_READ_LONG( tag_internal ) ||
+           FT_READ_USHORT( subcnt )     ||
+           FT_READ_USHORT( rpos )       )
+        return error;
+
+      FT_TRACE2(( "Resource tags: %c%c%c%c\n",
+                  (char)( 0xff & ( tag_internal >> 24 ) ),
+                  (char)( 0xff & ( tag_internal >> 16 ) ),
+                  (char)( 0xff & ( tag_internal >>  8 ) ),
+                  (char)( 0xff & ( tag_internal >>  0 ) ) ));
+
+      if ( tag_internal == tag )
+      {
+        *count = subcnt + 1;
+        rpos  += map_offset;
+
+        error = FT_Stream_Seek( stream, rpos );
+        if ( error )
+          return error;
+
+        if ( FT_NEW_ARRAY( ref, *count ) )
+          return error;
+
+        for ( j = 0; j < *count; ++j )
+        {
+          if ( FT_READ_USHORT( ref[j].res_id ) )
+            goto Exit;
+          if ( FT_STREAM_SKIP( 2 ) ) /* resource name */
+            goto Exit;
+          if ( FT_READ_LONG( temp ) )
+            goto Exit;
+          if ( FT_STREAM_SKIP( 4 ) ) /* mbz */
+            goto Exit;
+
+          ref[j].offset = temp & 0xFFFFFFL;
+        }
+
+        ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ),
+                  ( int(*)(const void*, const void*) )
+                  ft_raccess_sort_ref_by_id );
+
+        if ( FT_NEW_ARRAY( offsets_internal, *count ) )
+          goto Exit;
+
+        /* XXX: duplicated reference ID,
+         *      gap between reference IDs are acceptable?
+         *      further investigation on Apple implementation is needed.
+         */
+        for ( j = 0; j < *count; ++j )
+          offsets_internal[j] = rdata_pos + ref[j].offset;
+
+        *offsets = offsets_internal;
+        error    = FT_Err_Ok;
+
+      Exit:
+        FT_FREE( ref );
+        return error;
+      }
+    }
+
+    return FT_THROW( Cannot_Open_Resource );
+  }
+
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                     Guessing functions                          ****/
+  /****                                                                 ****/
+  /****            When you add a new guessing function,                ****/
+  /****           update FT_RACCESS_N_RULES in ftrfork.h.               ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static FT_Error
+  raccess_guess_apple_double( FT_Library  library,
+                              FT_Stream   stream,
+                              char       *base_file_name,
+                              char      **result_file_name,
+                              FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_apple_single( FT_Library  library,
+                              FT_Stream   stream,
+                              char       *base_file_name,
+                              char      **result_file_name,
+                              FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_darwin_ufs_export( FT_Library  library,
+                                   FT_Stream   stream,
+                                   char       *base_file_name,
+                                   char      **result_file_name,
+                                   FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_darwin_newvfs( FT_Library  library,
+                               FT_Stream   stream,
+                               char       *base_file_name,
+                               char      **result_file_name,
+                               FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_darwin_hfsplus( FT_Library  library,
+                                FT_Stream   stream,
+                                char       *base_file_name,
+                                char      **result_file_name,
+                                FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_vfat( FT_Library  library,
+                      FT_Stream   stream,
+                      char       *base_file_name,
+                      char      **result_file_name,
+                      FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_linux_cap( FT_Library  library,
+                           FT_Stream   stream,
+                           char       *base_file_name,
+                           char      **result_file_name,
+                           FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_linux_double( FT_Library  library,
+                              FT_Stream   stream,
+                              char       *base_file_name,
+                              char      **result_file_name,
+                              FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_linux_netatalk( FT_Library  library,
+                                FT_Stream   stream,
+                                char       *base_file_name,
+                                char      **result_file_name,
+                                FT_Long    *result_offset );
+
+
+  CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table,
+                                  ft_raccess_guess_rec)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double,      apple_double)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single,      apple_single)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs,     darwin_newvfs)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus,    darwin_hfsplus)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat,              vfat)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap,         linux_cap)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double,      linux_double)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk,    linux_netatalk)
+  CONST_FT_RFORK_RULE_ARRAY_END
+
+
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                       Helper functions                          ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+
+  static FT_Error
+  raccess_guess_apple_generic( FT_Library  library,
+                               FT_Stream   stream,
+                               char       *base_file_name,
+                               FT_Int32    magic,
+                               FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_linux_double_from_file_name( FT_Library  library,
+                                             char *      file_name,
+                                             FT_Long    *result_offset );
+
+  static char *
+  raccess_make_file_name( FT_Memory    memory,
+                          const char  *original_name,
+                          const char  *insertion );
+
+  FT_BASE_DEF( void )
+  FT_Raccess_Guess( FT_Library  library,
+                    FT_Stream   stream,
+                    char*       base_name,
+                    char      **new_names,
+                    FT_Long    *offsets,
+                    FT_Error   *errors )
+  {
+    FT_Int  i;
+
+
+    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
+    {
+      new_names[i] = NULL;
+      if ( NULL != stream )
+        errors[i] = FT_Stream_Seek( stream, 0 );
+      else
+        errors[i] = FT_Err_Ok;
+
+      if ( errors[i] )
+        continue ;
+
+      errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library,
+                                                 stream, base_name,
+                                                 &(new_names[i]),
+                                                 &(offsets[i]) );
+    }
+
+    return;
+  }
+
+
+#ifndef FT_MACINTOSH
+  static FT_RFork_Rule
+  raccess_get_rule_type_from_rule_index( FT_Library  library,
+                                         FT_UInt     rule_index )
+  {
+    FT_UNUSED( library );
+
+    if ( rule_index >= FT_RACCESS_N_RULES )
+      return FT_RFork_Rule_invalid;
+
+    return FT_RACCESS_GUESS_TABLE_GET[rule_index].type;
+  }
+
+
+  /*
+   * For this function, refer ftbase.h.
+   */
+  FT_LOCAL_DEF( FT_Bool )
+  ft_raccess_rule_by_darwin_vfs( FT_Library  library,
+                                 FT_UInt     rule_index )
+  {
+    switch( raccess_get_rule_type_from_rule_index( library, rule_index ) )
+    {
+      case FT_RFork_Rule_darwin_newvfs:
+      case FT_RFork_Rule_darwin_hfsplus:
+        return TRUE;
+
+      default:
+        return FALSE;
+    }
+  }
+#endif
+
+
+  static FT_Error
+  raccess_guess_apple_double( FT_Library  library,
+                              FT_Stream   stream,
+                              char       *base_file_name,
+                              char      **result_file_name,
+                              FT_Long    *result_offset )
+  {
+    FT_Int32  magic = ( 0x00 << 24 ) |
+                      ( 0x05 << 16 ) |
+                      ( 0x16 <<  8 ) |
+                        0x07;
+
+
+    *result_file_name = NULL;
+    if ( NULL == stream )
+      return FT_THROW( Cannot_Open_Stream );
+
+    return raccess_guess_apple_generic( library, stream, base_file_name,
+                                        magic, result_offset );
+  }
+
+
+  static FT_Error
+  raccess_guess_apple_single( FT_Library  library,
+                              FT_Stream   stream,
+                              char       *base_file_name,
+                              char      **result_file_name,
+                              FT_Long    *result_offset )
+  {
+    FT_Int32  magic = ( 0x00 << 24 ) |
+                      ( 0x05 << 16 ) |
+                      ( 0x16 <<  8 ) |
+                        0x00;
+
+
+    *result_file_name = NULL;
+    if ( NULL == stream )
+      return FT_THROW( Cannot_Open_Stream );
+
+    return raccess_guess_apple_generic( library, stream, base_file_name,
+                                        magic, result_offset );
+  }
+
+
+  static FT_Error
+  raccess_guess_darwin_ufs_export( FT_Library  library,
+                                   FT_Stream   stream,
+                                   char       *base_file_name,
+                                   char      **result_file_name,
+                                   FT_Long    *result_offset )
+  {
+    char*      newpath;
+    FT_Error   error;
+    FT_Memory  memory;
+
+    FT_UNUSED( stream );
+
+
+    memory  = library->memory;
+    newpath = raccess_make_file_name( memory, base_file_name, "._" );
+    if ( !newpath )
+      return FT_THROW( Out_Of_Memory );
+
+    error = raccess_guess_linux_double_from_file_name( library, newpath,
+                                                       result_offset );
+    if ( !error )
+      *result_file_name = newpath;
+    else
+      FT_FREE( newpath );
+
+    return error;
+  }
+
+
+  static FT_Error
+  raccess_guess_darwin_hfsplus( FT_Library  library,
+                                FT_Stream   stream,
+                                char       *base_file_name,
+                                char      **result_file_name,
+                                FT_Long    *result_offset )
+  {
+    /*
+      Only meaningful on systems with hfs+ drivers (or Macs).
+     */
+    FT_Error   error;
+    char*      newpath = NULL;
+    FT_Memory  memory;
+    FT_Long    base_file_len = (FT_Long)ft_strlen( base_file_name );
+
+    FT_UNUSED( stream );
+
+
+    memory = library->memory;
+
+    if ( base_file_len + 6 > FT_INT_MAX )
+      return FT_THROW( Array_Too_Large );
+
+    if ( FT_ALLOC( newpath, base_file_len + 6 ) )
+      return error;
+
+    FT_MEM_COPY( newpath, base_file_name, base_file_len );
+    FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 );
+
+    *result_file_name = newpath;
+    *result_offset    = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Error
+  raccess_guess_darwin_newvfs( FT_Library  library,
+                               FT_Stream   stream,
+                               char       *base_file_name,
+                               char      **result_file_name,
+                               FT_Long    *result_offset )
+  {
+    /*
+      Only meaningful on systems with Mac OS X (> 10.1).
+     */
+    FT_Error   error;
+    char*      newpath = NULL;
+    FT_Memory  memory;
+    FT_Long    base_file_len = (FT_Long)ft_strlen( base_file_name );
+
+    FT_UNUSED( stream );
+
+
+    memory = library->memory;
+
+    if ( base_file_len + 18 > FT_INT_MAX )
+      return FT_THROW( Array_Too_Large );
+
+    if ( FT_ALLOC( newpath, base_file_len + 18 ) )
+      return error;
+
+    FT_MEM_COPY( newpath, base_file_name, base_file_len );
+    FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 );
+
+    *result_file_name = newpath;
+    *result_offset    = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Error
+  raccess_guess_vfat( FT_Library  library,
+                      FT_Stream   stream,
+                      char       *base_file_name,
+                      char      **result_file_name,
+                      FT_Long    *result_offset )
+  {
+    char*      newpath;
+    FT_Memory  memory;
+
+    FT_UNUSED( stream );
+
+
+    memory = library->memory;
+
+    newpath = raccess_make_file_name( memory, base_file_name,
+                                      "resource.frk/" );
+    if ( !newpath )
+      return FT_THROW( Out_Of_Memory );
+
+    *result_file_name = newpath;
+    *result_offset    = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Error
+  raccess_guess_linux_cap( FT_Library  library,
+                           FT_Stream   stream,
+                           char       *base_file_name,
+                           char      **result_file_name,
+                           FT_Long    *result_offset )
+  {
+    char*      newpath;
+    FT_Memory  memory;
+
+    FT_UNUSED( stream );
+
+
+    memory = library->memory;
+
+    newpath = raccess_make_file_name( memory, base_file_name, ".resource/" );
+    if ( !newpath )
+      return FT_THROW( Out_Of_Memory );
+
+    *result_file_name = newpath;
+    *result_offset    = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Error
+  raccess_guess_linux_double( FT_Library  library,
+                              FT_Stream   stream,
+                              char       *base_file_name,
+                              char      **result_file_name,
+                              FT_Long    *result_offset )
+  {
+    char*      newpath;
+    FT_Error   error;
+    FT_Memory  memory;
+
+    FT_UNUSED( stream );
+
+
+    memory = library->memory;
+
+    newpath = raccess_make_file_name( memory, base_file_name, "%" );
+    if ( !newpath )
+      return FT_THROW( Out_Of_Memory );
+
+    error = raccess_guess_linux_double_from_file_name( library, newpath,
+                                                       result_offset );
+    if ( !error )
+      *result_file_name = newpath;
+    else
+      FT_FREE( newpath );
+
+    return error;
+  }
+
+
+  static FT_Error
+  raccess_guess_linux_netatalk( FT_Library  library,
+                                FT_Stream   stream,
+                                char       *base_file_name,
+                                char      **result_file_name,
+                                FT_Long    *result_offset )
+  {
+    char*      newpath;
+    FT_Error   error;
+    FT_Memory  memory;
+
+    FT_UNUSED( stream );
+
+
+    memory = library->memory;
+
+    newpath = raccess_make_file_name( memory, base_file_name,
+                                      ".AppleDouble/" );
+    if ( !newpath )
+      return FT_THROW( Out_Of_Memory );
+
+    error = raccess_guess_linux_double_from_file_name( library, newpath,
+                                                       result_offset );
+    if ( !error )
+      *result_file_name = newpath;
+    else
+      FT_FREE( newpath );
+
+    return error;
+  }
+
+
+  static FT_Error
+  raccess_guess_apple_generic( FT_Library  library,
+                               FT_Stream   stream,
+                               char       *base_file_name,
+                               FT_Int32    magic,
+                               FT_Long    *result_offset )
+  {
+    FT_Int32   magic_from_stream;
+    FT_Error   error;
+    FT_Int32   version_number = 0;
+    FT_UShort  n_of_entries;
+
+    int        i;
+    FT_UInt32  entry_id, entry_offset, entry_length = 0;
+
+    const FT_UInt32  resource_fork_entry_id = 0x2;
+
+    FT_UNUSED( library );
+    FT_UNUSED( base_file_name );
+    FT_UNUSED( version_number );
+    FT_UNUSED( entry_length   );
+
+
+    if ( FT_READ_LONG( magic_from_stream ) )
+      return error;
+    if ( magic_from_stream != magic )
+      return FT_THROW( Unknown_File_Format );
+
+    if ( FT_READ_LONG( version_number ) )
+      return error;
+
+    /* filler */
+    error = FT_Stream_Skip( stream, 16 );
+    if ( error )
+      return error;
+
+    if ( FT_READ_USHORT( n_of_entries ) )
+      return error;
+    if ( n_of_entries == 0 )
+      return FT_THROW( Unknown_File_Format );
+
+    for ( i = 0; i < n_of_entries; i++ )
+    {
+      if ( FT_READ_LONG( entry_id ) )
+        return error;
+      if ( entry_id == resource_fork_entry_id )
+      {
+        if ( FT_READ_LONG( entry_offset ) ||
+             FT_READ_LONG( entry_length ) )
+          continue;
+        *result_offset = entry_offset;
+
+        return FT_Err_Ok;
+      }
+      else
+      {
+        error = FT_Stream_Skip( stream, 4 + 4 );    /* offset + length */
+        if ( error )
+          return error;
+      }
+    }
+
+    return FT_THROW( Unknown_File_Format );
+  }
+
+
+  static FT_Error
+  raccess_guess_linux_double_from_file_name( FT_Library  library,
+                                             char       *file_name,
+                                             FT_Long    *result_offset )
+  {
+    FT_Open_Args  args2;
+    FT_Stream     stream2;
+    char *        nouse = NULL;
+    FT_Error      error;
+
+
+    args2.flags    = FT_OPEN_PATHNAME;
+    args2.pathname = file_name;
+    error = FT_Stream_New( library, &args2, &stream2 );
+    if ( error )
+      return error;
+
+    error = raccess_guess_apple_double( library, stream2, file_name,
+                                        &nouse, result_offset );
+
+    FT_Stream_Free( stream2, 0 );
+
+    return error;
+  }
+
+
+  static char*
+  raccess_make_file_name( FT_Memory    memory,
+                          const char  *original_name,
+                          const char  *insertion )
+  {
+    char*        new_name = NULL;
+    const char*  tmp;
+    const char*  slash;
+    size_t       new_length;
+    FT_Error     error = FT_Err_Ok;
+
+    FT_UNUSED( error );
+
+
+    new_length = ft_strlen( original_name ) + ft_strlen( insertion );
+    if ( FT_ALLOC( new_name, new_length + 1 ) )
+      return NULL;
+
+    tmp = ft_strrchr( original_name, '/' );
+    if ( tmp )
+    {
+      ft_strncpy( new_name, original_name, tmp - original_name + 1 );
+      new_name[tmp - original_name + 1] = '\0';
+      slash = tmp + 1;
+    }
+    else
+    {
+      slash       = original_name;
+      new_name[0] = '\0';
+    }
+
+    ft_strcat( new_name, insertion );
+    ft_strcat( new_name, slash );
+
+    return new_name;
+  }
+
+
+#else   /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+  /*************************************************************************/
+  /*                  Dummy function; just sets errors                     */
+  /*************************************************************************/
+
+  FT_BASE_DEF( void )
+  FT_Raccess_Guess( FT_Library  library,
+                    FT_Stream   stream,
+                    char       *base_name,
+                    char      **new_names,
+                    FT_Long    *offsets,
+                    FT_Error   *errors )
+  {
+    FT_Int  i;
+
+    FT_UNUSED( library );
+    FT_UNUSED( stream );
+    FT_UNUSED( base_name );
+
+
+    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
+    {
+      new_names[i] = NULL;
+      offsets[i]   = 0;
+      errors[i]    = FT_ERR( Unimplemented_Feature );
+    }
+  }
+
+
+#endif  /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsnames.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsnames.c
new file mode 100644
index 0000000..b4e08ef
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsnames.c
@@ -0,0 +1,94 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsnames.c                                                             */
+/*                                                                         */
+/*    Simple interface to access SFNT name tables (which are used          */
+/*    to hold font names, copyright info, notices, etc.) (body).           */
+/*                                                                         */
+/*    This is _not_ used to retrieve glyph names!                          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2009 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftsnames.h"
+#include "../../include/freetype/internal/tttypes.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+
+#ifdef TT_CONFIG_OPTION_SFNT_NAMES
+
+
+  /* documentation is in ftsnames.h */
+
+  FT_EXPORT_DEF( FT_UInt )
+  FT_Get_Sfnt_Name_Count( FT_Face  face )
+  {
+    return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0;
+  }
+
+
+  /* documentation is in ftsnames.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Sfnt_Name( FT_Face       face,
+                    FT_UInt       idx,
+                    FT_SfntName  *aname )
+  {
+    FT_Error  error = FT_ERR( Invalid_Argument );
+
+
+    if ( aname && face && FT_IS_SFNT( face ) )
+    {
+      TT_Face  ttface = (TT_Face)face;
+
+
+      if ( idx < (FT_UInt)ttface->num_names )
+      {
+        TT_NameEntryRec*  entry = ttface->name_table.names + idx;
+
+
+        /* load name on demand */
+        if ( entry->stringLength > 0 && entry->string == NULL )
+        {
+          FT_Memory  memory = face->memory;
+          FT_Stream  stream = face->stream;
+
+
+          if ( FT_NEW_ARRAY  ( entry->string, entry->stringLength ) ||
+               FT_STREAM_SEEK( entry->stringOffset )                ||
+               FT_STREAM_READ( entry->string, entry->stringLength ) )
+          {
+            FT_FREE( entry->string );
+            entry->stringLength = 0;
+          }
+        }
+
+        aname->platform_id = entry->platformID;
+        aname->encoding_id = entry->encodingID;
+        aname->language_id = entry->languageID;
+        aname->name_id     = entry->nameID;
+        aname->string      = (FT_Byte*)entry->string;
+        aname->string_len  = entry->stringLength;
+
+        error = FT_Err_Ok;
+      }
+    }
+
+    return error;
+  }
+
+
+#endif /* TT_CONFIG_OPTION_SFNT_NAMES */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstream.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstream.c
new file mode 100644
index 0000000..8037506
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstream.c
@@ -0,0 +1,865 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstream.c                                                             */
+/*                                                                         */
+/*    I/O stream support (body).                                           */
+/*                                                                         */
+/*  Copyright 2000-2002, 2004-2006, 2008-2011, 2013 by                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_stream
+
+
+  FT_BASE_DEF( void )
+  FT_Stream_OpenMemory( FT_Stream       stream,
+                        const FT_Byte*  base,
+                        FT_ULong        size )
+  {
+    stream->base   = (FT_Byte*) base;
+    stream->size   = size;
+    stream->pos    = 0;
+    stream->cursor = 0;
+    stream->read   = 0;
+    stream->close  = 0;
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Stream_Close( FT_Stream  stream )
+  {
+    if ( stream && stream->close )
+      stream->close( stream );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_Seek( FT_Stream  stream,
+                  FT_ULong   pos )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( stream->read )
+    {
+      if ( stream->read( stream, pos, 0, 0 ) )
+      {
+        FT_ERROR(( "FT_Stream_Seek:"
+                   " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+                   pos, stream->size ));
+
+        error = FT_THROW( Invalid_Stream_Operation );
+      }
+    }
+    /* note that seeking to the first position after the file is valid */
+    else if ( pos > stream->size )
+    {
+      FT_ERROR(( "FT_Stream_Seek:"
+                 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+                 pos, stream->size ));
+
+      error = FT_THROW( Invalid_Stream_Operation );
+    }
+
+    if ( !error )
+      stream->pos = pos;
+
+    return error;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_Skip( FT_Stream  stream,
+                  FT_Long    distance )
+  {
+    if ( distance < 0 )
+      return FT_THROW( Invalid_Stream_Operation );
+
+    return FT_Stream_Seek( stream, (FT_ULong)( stream->pos + distance ) );
+  }
+
+
+  FT_BASE_DEF( FT_Long )
+  FT_Stream_Pos( FT_Stream  stream )
+  {
+    return stream->pos;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_Read( FT_Stream  stream,
+                  FT_Byte*   buffer,
+                  FT_ULong   count )
+  {
+    return FT_Stream_ReadAt( stream, stream->pos, buffer, count );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_ReadAt( FT_Stream  stream,
+                    FT_ULong   pos,
+                    FT_Byte*   buffer,
+                    FT_ULong   count )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_ULong  read_bytes;
+
+
+    if ( pos >= stream->size )
+    {
+      FT_ERROR(( "FT_Stream_ReadAt:"
+                 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+                 pos, stream->size ));
+
+      return FT_THROW( Invalid_Stream_Operation );
+    }
+
+    if ( stream->read )
+      read_bytes = stream->read( stream, pos, buffer, count );
+    else
+    {
+      read_bytes = stream->size - pos;
+      if ( read_bytes > count )
+        read_bytes = count;
+
+      FT_MEM_COPY( buffer, stream->base + pos, read_bytes );
+    }
+
+    stream->pos = pos + read_bytes;
+
+    if ( read_bytes < count )
+    {
+      FT_ERROR(( "FT_Stream_ReadAt:"
+                 " invalid read; expected %lu bytes, got %lu\n",
+                 count, read_bytes ));
+
+      error = FT_THROW( Invalid_Stream_Operation );
+    }
+
+    return error;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_TryRead( FT_Stream  stream,
+                     FT_Byte*   buffer,
+                     FT_ULong   count )
+  {
+    FT_ULong  read_bytes = 0;
+
+
+    if ( stream->pos >= stream->size )
+      goto Exit;
+
+    if ( stream->read )
+      read_bytes = stream->read( stream, stream->pos, buffer, count );
+    else
+    {
+      read_bytes = stream->size - stream->pos;
+      if ( read_bytes > count )
+        read_bytes = count;
+
+      FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes );
+    }
+
+    stream->pos += read_bytes;
+
+  Exit:
+    return read_bytes;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_ExtractFrame( FT_Stream  stream,
+                          FT_ULong   count,
+                          FT_Byte**  pbytes )
+  {
+    FT_Error  error;
+
+
+    error = FT_Stream_EnterFrame( stream, count );
+    if ( !error )
+    {
+      *pbytes = (FT_Byte*)stream->cursor;
+
+      /* equivalent to FT_Stream_ExitFrame(), with no memory block release */
+      stream->cursor = 0;
+      stream->limit  = 0;
+    }
+
+    return error;
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Stream_ReleaseFrame( FT_Stream  stream,
+                          FT_Byte**  pbytes )
+  {
+    if ( stream && stream->read )
+    {
+      FT_Memory  memory = stream->memory;
+
+#ifdef FT_DEBUG_MEMORY
+      ft_mem_free( memory, *pbytes );
+      *pbytes = NULL;
+#else
+      FT_FREE( *pbytes );
+#endif
+    }
+    *pbytes = 0;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_EnterFrame( FT_Stream  stream,
+                        FT_ULong   count )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_ULong  read_bytes;
+
+
+    /* check for nested frame access */
+    FT_ASSERT( stream && stream->cursor == 0 );
+
+    if ( stream->read )
+    {
+      /* allocate the frame in memory */
+      FT_Memory  memory = stream->memory;
+
+
+      /* simple sanity check */
+      if ( count > stream->size )
+      {
+        FT_ERROR(( "FT_Stream_EnterFrame:"
+                   " frame size (%lu) larger than stream size (%lu)\n",
+                   count, stream->size ));
+
+        error = FT_THROW( Invalid_Stream_Operation );
+        goto Exit;
+      }
+
+#ifdef FT_DEBUG_MEMORY
+      /* assume _ft_debug_file and _ft_debug_lineno are already set */
+      stream->base = (unsigned char*)ft_mem_qalloc( memory, count, &error );
+      if ( error )
+        goto Exit;
+#else
+      if ( FT_QALLOC( stream->base, count ) )
+        goto Exit;
+#endif
+      /* read it */
+      read_bytes = stream->read( stream, stream->pos,
+                                 stream->base, count );
+      if ( read_bytes < count )
+      {
+        FT_ERROR(( "FT_Stream_EnterFrame:"
+                   " invalid read; expected %lu bytes, got %lu\n",
+                   count, read_bytes ));
+
+        FT_FREE( stream->base );
+        error = FT_THROW( Invalid_Stream_Operation );
+      }
+      stream->cursor = stream->base;
+      stream->limit  = stream->cursor + count;
+      stream->pos   += read_bytes;
+    }
+    else
+    {
+      /* check current and new position */
+      if ( stream->pos >= stream->size        ||
+           stream->size - stream->pos < count )
+      {
+        FT_ERROR(( "FT_Stream_EnterFrame:"
+                   " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n",
+                   stream->pos, count, stream->size ));
+
+        error = FT_THROW( Invalid_Stream_Operation );
+        goto Exit;
+      }
+
+      /* set cursor */
+      stream->cursor = stream->base + stream->pos;
+      stream->limit  = stream->cursor + count;
+      stream->pos   += count;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Stream_ExitFrame( FT_Stream  stream )
+  {
+    /* IMPORTANT: The assertion stream->cursor != 0 was removed, given    */
+    /*            that it is possible to access a frame of length 0 in    */
+    /*            some weird fonts (usually, when accessing an array of   */
+    /*            0 records, like in some strange kern tables).           */
+    /*                                                                    */
+    /*  In this case, the loader code handles the 0-length table          */
+    /*  gracefully; however, stream.cursor is really set to 0 by the      */
+    /*  FT_Stream_EnterFrame() call, and this is not an error.            */
+    /*                                                                    */
+    FT_ASSERT( stream );
+
+    if ( stream->read )
+    {
+      FT_Memory  memory = stream->memory;
+
+#ifdef FT_DEBUG_MEMORY
+      ft_mem_free( memory, stream->base );
+      stream->base = NULL;
+#else
+      FT_FREE( stream->base );
+#endif
+    }
+    stream->cursor = 0;
+    stream->limit  = 0;
+  }
+
+
+  FT_BASE_DEF( FT_Char )
+  FT_Stream_GetChar( FT_Stream  stream )
+  {
+    FT_Char  result;
+
+
+    FT_ASSERT( stream && stream->cursor );
+
+    result = 0;
+    if ( stream->cursor < stream->limit )
+      result = *stream->cursor++;
+
+    return result;
+  }
+
+
+  FT_BASE_DEF( FT_UShort )
+  FT_Stream_GetUShort( FT_Stream  stream )
+  {
+    FT_Byte*  p;
+    FT_Short  result;
+
+
+    FT_ASSERT( stream && stream->cursor );
+
+    result         = 0;
+    p              = stream->cursor;
+    if ( p + 1 < stream->limit )
+      result       = FT_NEXT_USHORT( p );
+    stream->cursor = p;
+
+    return result;
+  }
+
+
+  FT_BASE_DEF( FT_UShort )
+  FT_Stream_GetUShortLE( FT_Stream  stream )
+  {
+    FT_Byte*  p;
+    FT_Short  result;
+
+
+    FT_ASSERT( stream && stream->cursor );
+
+    result         = 0;
+    p              = stream->cursor;
+    if ( p + 1 < stream->limit )
+      result       = FT_NEXT_USHORT_LE( p );
+    stream->cursor = p;
+
+    return result;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_GetUOffset( FT_Stream  stream )
+  {
+    FT_Byte*  p;
+    FT_Long   result;
+
+
+    FT_ASSERT( stream && stream->cursor );
+
+    result         = 0;
+    p              = stream->cursor;
+    if ( p + 2 < stream->limit )
+      result       = FT_NEXT_UOFF3( p );
+    stream->cursor = p;
+    return result;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_GetULong( FT_Stream  stream )
+  {
+    FT_Byte*  p;
+    FT_Long   result;
+
+
+    FT_ASSERT( stream && stream->cursor );
+
+    result         = 0;
+    p              = stream->cursor;
+    if ( p + 3 < stream->limit )
+      result       = FT_NEXT_ULONG( p );
+    stream->cursor = p;
+    return result;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_GetULongLE( FT_Stream  stream )
+  {
+    FT_Byte*  p;
+    FT_Long   result;
+
+
+    FT_ASSERT( stream && stream->cursor );
+
+    result         = 0;
+    p              = stream->cursor;
+    if ( p + 3 < stream->limit )
+      result       = FT_NEXT_ULONG_LE( p );
+    stream->cursor = p;
+    return result;
+  }
+
+
+  FT_BASE_DEF( FT_Char )
+  FT_Stream_ReadChar( FT_Stream  stream,
+                      FT_Error*  error )
+  {
+    FT_Byte  result = 0;
+
+
+    FT_ASSERT( stream );
+
+    *error = FT_Err_Ok;
+
+    if ( stream->read )
+    {
+      if ( stream->read( stream, stream->pos, &result, 1L ) != 1L )
+        goto Fail;
+    }
+    else
+    {
+      if ( stream->pos < stream->size )
+        result = stream->base[stream->pos];
+      else
+        goto Fail;
+    }
+    stream->pos++;
+
+    return result;
+
+  Fail:
+    *error = FT_THROW( Invalid_Stream_Operation );
+    FT_ERROR(( "FT_Stream_ReadChar:"
+               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+               stream->pos, stream->size ));
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_UShort )
+  FT_Stream_ReadUShort( FT_Stream  stream,
+                       FT_Error*  error )
+  {
+    FT_Byte   reads[2];
+    FT_Byte*  p = 0;
+    FT_Short  result = 0;
+
+
+    FT_ASSERT( stream );
+
+    *error = FT_Err_Ok;
+
+    if ( stream->pos + 1 < stream->size )
+    {
+      if ( stream->read )
+      {
+        if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )
+          goto Fail;
+
+        p = reads;
+      }
+      else
+      {
+        p = stream->base + stream->pos;
+      }
+
+      if ( p )
+        result = FT_NEXT_USHORT( p );
+    }
+    else
+      goto Fail;
+
+    stream->pos += 2;
+
+    return result;
+
+  Fail:
+    *error = FT_THROW( Invalid_Stream_Operation );
+    FT_ERROR(( "FT_Stream_ReadUShort:"
+               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+               stream->pos, stream->size ));
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_UShort )
+  FT_Stream_ReadUShortLE( FT_Stream  stream,
+                         FT_Error*  error )
+  {
+    FT_Byte   reads[2];
+    FT_Byte*  p = 0;
+    FT_Short  result = 0;
+
+
+    FT_ASSERT( stream );
+
+    *error = FT_Err_Ok;
+
+    if ( stream->pos + 1 < stream->size )
+    {
+      if ( stream->read )
+      {
+        if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )
+          goto Fail;
+
+        p = reads;
+      }
+      else
+      {
+        p = stream->base + stream->pos;
+      }
+
+      if ( p )
+        result = FT_NEXT_USHORT_LE( p );
+    }
+    else
+      goto Fail;
+
+    stream->pos += 2;
+
+    return result;
+
+  Fail:
+    *error = FT_THROW( Invalid_Stream_Operation );
+    FT_ERROR(( "FT_Stream_ReadUShortLE:"
+               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+               stream->pos, stream->size ));
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_ReadUOffset( FT_Stream  stream,
+                        FT_Error*  error )
+  {
+    FT_Byte   reads[3];
+    FT_Byte*  p = 0;
+    FT_Long   result = 0;
+
+
+    FT_ASSERT( stream );
+
+    *error = FT_Err_Ok;
+
+    if ( stream->pos + 2 < stream->size )
+    {
+      if ( stream->read )
+      {
+        if (stream->read( stream, stream->pos, reads, 3L ) != 3L )
+          goto Fail;
+
+        p = reads;
+      }
+      else
+      {
+        p = stream->base + stream->pos;
+      }
+
+      if ( p )
+        result = FT_NEXT_UOFF3( p );
+    }
+    else
+      goto Fail;
+
+    stream->pos += 3;
+
+    return result;
+
+  Fail:
+    *error = FT_THROW( Invalid_Stream_Operation );
+    FT_ERROR(( "FT_Stream_ReadUOffset:"
+               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+               stream->pos, stream->size ));
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_ReadULong( FT_Stream  stream,
+                      FT_Error*  error )
+  {
+    FT_Byte   reads[4];
+    FT_Byte*  p = 0;
+    FT_Long   result = 0;
+
+
+    FT_ASSERT( stream );
+
+    *error = FT_Err_Ok;
+
+    if ( stream->pos + 3 < stream->size )
+    {
+      if ( stream->read )
+      {
+        if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )
+          goto Fail;
+
+        p = reads;
+      }
+      else
+      {
+        p = stream->base + stream->pos;
+      }
+
+      if ( p )
+        result = FT_NEXT_ULONG( p );
+    }
+    else
+      goto Fail;
+
+    stream->pos += 4;
+
+    return result;
+
+  Fail:
+    *error = FT_THROW( Invalid_Stream_Operation );
+    FT_ERROR(( "FT_Stream_ReadULong:"
+               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+               stream->pos, stream->size ));
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_ReadULongLE( FT_Stream  stream,
+                        FT_Error*  error )
+  {
+    FT_Byte   reads[4];
+    FT_Byte*  p = 0;
+    FT_Long   result = 0;
+
+
+    FT_ASSERT( stream );
+
+    *error = FT_Err_Ok;
+
+    if ( stream->pos + 3 < stream->size )
+    {
+      if ( stream->read )
+      {
+        if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )
+          goto Fail;
+
+        p = reads;
+      }
+      else
+      {
+        p = stream->base + stream->pos;
+      }
+
+      if ( p )
+        result = FT_NEXT_ULONG_LE( p );
+    }
+    else
+      goto Fail;
+
+    stream->pos += 4;
+
+    return result;
+
+  Fail:
+    *error = FT_THROW( Invalid_Stream_Operation );
+    FT_ERROR(( "FT_Stream_ReadULongLE:"
+               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+               stream->pos, stream->size ));
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_ReadFields( FT_Stream              stream,
+                        const FT_Frame_Field*  fields,
+                        void*                  structure )
+  {
+    FT_Error  error;
+    FT_Bool   frame_accessed = 0;
+    FT_Byte*  cursor;
+
+
+    if ( !fields || !stream )
+      return FT_THROW( Invalid_Argument );
+
+    cursor = stream->cursor;
+
+    error = FT_Err_Ok;
+    do
+    {
+      FT_ULong  value;
+      FT_Int    sign_shift;
+      FT_Byte*  p;
+
+
+      switch ( fields->value )
+      {
+      case ft_frame_start:  /* access a new frame */
+        error = FT_Stream_EnterFrame( stream, fields->offset );
+        if ( error )
+          goto Exit;
+
+        frame_accessed = 1;
+        cursor         = stream->cursor;
+        fields++;
+        continue;  /* loop! */
+
+      case ft_frame_bytes:  /* read a byte sequence */
+      case ft_frame_skip:   /* skip some bytes      */
+        {
+          FT_UInt  len = fields->size;
+
+
+          if ( cursor + len > stream->limit )
+          {
+            error = FT_THROW( Invalid_Stream_Operation );
+            goto Exit;
+          }
+
+          if ( fields->value == ft_frame_bytes )
+          {
+            p = (FT_Byte*)structure + fields->offset;
+            FT_MEM_COPY( p, cursor, len );
+          }
+          cursor += len;
+          fields++;
+          continue;
+        }
+
+      case ft_frame_byte:
+      case ft_frame_schar:  /* read a single byte */
+        value = FT_NEXT_BYTE( cursor );
+        sign_shift = 24;
+        break;
+
+      case ft_frame_short_be:
+      case ft_frame_ushort_be:  /* read a 2-byte big-endian short */
+        value = FT_NEXT_USHORT( cursor) ;
+        sign_shift = 16;
+        break;
+
+      case ft_frame_short_le:
+      case ft_frame_ushort_le:  /* read a 2-byte little-endian short */
+        value = FT_NEXT_USHORT_LE( cursor );
+        sign_shift = 16;
+        break;
+
+      case ft_frame_long_be:
+      case ft_frame_ulong_be:  /* read a 4-byte big-endian long */
+        value = FT_NEXT_ULONG( cursor );
+        sign_shift = 0;
+        break;
+
+      case ft_frame_long_le:
+      case ft_frame_ulong_le:  /* read a 4-byte little-endian long */
+        value = FT_NEXT_ULONG_LE( cursor );
+        sign_shift = 0;
+        break;
+
+      case ft_frame_off3_be:
+      case ft_frame_uoff3_be:  /* read a 3-byte big-endian long */
+        value = FT_NEXT_UOFF3( cursor );
+        sign_shift = 8;
+        break;
+
+      case ft_frame_off3_le:
+      case ft_frame_uoff3_le:  /* read a 3-byte little-endian long */
+        value = FT_NEXT_UOFF3_LE( cursor );
+        sign_shift = 8;
+        break;
+
+      default:
+        /* otherwise, exit the loop */
+        stream->cursor = cursor;
+        goto Exit;
+      }
+
+      /* now, compute the signed value is necessary */
+      if ( fields->value & FT_FRAME_OP_SIGNED )
+        value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift );
+
+      /* finally, store the value in the object */
+
+      p = (FT_Byte*)structure + fields->offset;
+      switch ( fields->size )
+      {
+      case ( 8 / FT_CHAR_BIT ):
+        *(FT_Byte*)p = (FT_Byte)value;
+        break;
+
+      case ( 16 / FT_CHAR_BIT ):
+        *(FT_UShort*)p = (FT_UShort)value;
+        break;
+
+      case ( 32 / FT_CHAR_BIT ):
+        *(FT_UInt32*)p = (FT_UInt32)value;
+        break;
+
+      default:  /* for 64-bit systems */
+        *(FT_ULong*)p = (FT_ULong)value;
+      }
+
+      /* go to next field */
+      fields++;
+    }
+    while ( 1 );
+
+  Exit:
+    /* close the frame if it was opened by this read */
+    if ( frame_accessed )
+      FT_Stream_ExitFrame( stream );
+
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstroke.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstroke.c
new file mode 100644
index 0000000..c15aaaf
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstroke.c
@@ -0,0 +1,2418 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstroke.c                                                             */
+/*                                                                         */
+/*    FreeType path stroker (body).                                        */
+/*                                                                         */
+/*  Copyright 2002-2006, 2008-2011, 2013 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftstroke.h"
+#include "../../include/freetype/fttrigon.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftmemory.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_StrokerBorder )
+  FT_Outline_GetInsideBorder( FT_Outline*  outline )
+  {
+    FT_Orientation  o = FT_Outline_Get_Orientation( outline );
+
+
+    return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT
+                                        : FT_STROKER_BORDER_LEFT;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_StrokerBorder )
+  FT_Outline_GetOutsideBorder( FT_Outline*  outline )
+  {
+    FT_Orientation  o = FT_Outline_Get_Orientation( outline );
+
+
+    return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT
+                                        : FT_STROKER_BORDER_RIGHT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      BEZIER COMPUTATIONS                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define FT_SMALL_CONIC_THRESHOLD  ( FT_ANGLE_PI / 6 )
+#define FT_SMALL_CUBIC_THRESHOLD  ( FT_ANGLE_PI / 8 )
+
+#define FT_EPSILON  2
+
+#define FT_IS_SMALL( x )  ( (x) > -FT_EPSILON && (x) < FT_EPSILON )
+
+
+  static FT_Pos
+  ft_pos_abs( FT_Pos  x )
+  {
+    return x >= 0 ? x : -x;
+  }
+
+
+  static void
+  ft_conic_split( FT_Vector*  base )
+  {
+    FT_Pos  a, b;
+
+
+    base[4].x = base[2].x;
+    b = base[1].x;
+    a = base[3].x = ( base[2].x + b ) / 2;
+    b = base[1].x = ( base[0].x + b ) / 2;
+    base[2].x = ( a + b ) / 2;
+
+    base[4].y = base[2].y;
+    b = base[1].y;
+    a = base[3].y = ( base[2].y + b ) / 2;
+    b = base[1].y = ( base[0].y + b ) / 2;
+    base[2].y = ( a + b ) / 2;
+  }
+
+
+  static FT_Bool
+  ft_conic_is_small_enough( FT_Vector*  base,
+                            FT_Angle   *angle_in,
+                            FT_Angle   *angle_out )
+  {
+    FT_Vector  d1, d2;
+    FT_Angle   theta;
+    FT_Int     close1, close2;
+
+
+    d1.x = base[1].x - base[2].x;
+    d1.y = base[1].y - base[2].y;
+    d2.x = base[0].x - base[1].x;
+    d2.y = base[0].y - base[1].y;
+
+    close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );
+    close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );
+
+    if ( close1 )
+    {
+      if ( close2 )
+      {
+        /* basically a point;                      */
+        /* do nothing to retain original direction */
+      }
+      else
+      {
+        *angle_in  =
+        *angle_out = FT_Atan2( d2.x, d2.y );
+      }
+    }
+    else /* !close1 */
+    {
+      if ( close2 )
+      {
+        *angle_in  =
+        *angle_out = FT_Atan2( d1.x, d1.y );
+      }
+      else
+      {
+        *angle_in  = FT_Atan2( d1.x, d1.y );
+        *angle_out = FT_Atan2( d2.x, d2.y );
+      }
+    }
+
+    theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) );
+
+    return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD );
+  }
+
+
+  static void
+  ft_cubic_split( FT_Vector*  base )
+  {
+    FT_Pos  a, b, c, d;
+
+
+    base[6].x = base[3].x;
+    c = base[1].x;
+    d = base[2].x;
+    base[1].x = a = ( base[0].x + c ) / 2;
+    base[5].x = b = ( base[3].x + d ) / 2;
+    c = ( c + d ) / 2;
+    base[2].x = a = ( a + c ) / 2;
+    base[4].x = b = ( b + c ) / 2;
+    base[3].x = ( a + b ) / 2;
+
+    base[6].y = base[3].y;
+    c = base[1].y;
+    d = base[2].y;
+    base[1].y = a = ( base[0].y + c ) / 2;
+    base[5].y = b = ( base[3].y + d ) / 2;
+    c = ( c + d ) / 2;
+    base[2].y = a = ( a + c ) / 2;
+    base[4].y = b = ( b + c ) / 2;
+    base[3].y = ( a + b ) / 2;
+  }
+
+
+  /* Return the average of `angle1' and `angle2'.            */
+  /* This gives correct result even if `angle1' and `angle2' */
+  /* have opposite signs.                                    */
+  static FT_Angle
+  ft_angle_mean( FT_Angle  angle1,
+                 FT_Angle  angle2 )
+  {
+    return angle1 + FT_Angle_Diff( angle1, angle2 ) / 2;
+  }
+
+
+  static FT_Bool
+  ft_cubic_is_small_enough( FT_Vector*  base,
+                            FT_Angle   *angle_in,
+                            FT_Angle   *angle_mid,
+                            FT_Angle   *angle_out )
+  {
+    FT_Vector  d1, d2, d3;
+    FT_Angle   theta1, theta2;
+    FT_Int     close1, close2, close3;
+
+
+    d1.x = base[2].x - base[3].x;
+    d1.y = base[2].y - base[3].y;
+    d2.x = base[1].x - base[2].x;
+    d2.y = base[1].y - base[2].y;
+    d3.x = base[0].x - base[1].x;
+    d3.y = base[0].y - base[1].y;
+
+    close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );
+    close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );
+    close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y );
+
+    if ( close1 )
+    {
+      if ( close2 )
+      {
+        if ( close3 )
+        {
+          /* basically a point;                      */
+          /* do nothing to retain original direction */
+        }
+        else /* !close3 */
+        {
+          *angle_in  =
+          *angle_mid =
+          *angle_out = FT_Atan2( d3.x, d3.y );
+        }
+      }
+      else /* !close2 */
+      {
+        if ( close3 )
+        {
+          *angle_in  =
+          *angle_mid =
+          *angle_out = FT_Atan2( d2.x, d2.y );
+        }
+        else /* !close3 */
+        {
+          *angle_in  =
+          *angle_mid = FT_Atan2( d2.x, d2.y );
+          *angle_out = FT_Atan2( d3.x, d3.y );
+        }
+      }
+    }
+    else /* !close1 */
+    {
+      if ( close2 )
+      {
+        if ( close3 )
+        {
+          *angle_in  =
+          *angle_mid =
+          *angle_out = FT_Atan2( d1.x, d1.y );
+        }
+        else /* !close3 */
+        {
+          *angle_in  = FT_Atan2( d1.x, d1.y );
+          *angle_out = FT_Atan2( d3.x, d3.y );
+          *angle_mid = ft_angle_mean( *angle_in, *angle_out );
+        }
+      }
+      else /* !close2 */
+      {
+        if ( close3 )
+        {
+          *angle_in  = FT_Atan2( d1.x, d1.y );
+          *angle_mid =
+          *angle_out = FT_Atan2( d2.x, d2.y );
+        }
+        else /* !close3 */
+        {
+          *angle_in  = FT_Atan2( d1.x, d1.y );
+          *angle_mid = FT_Atan2( d2.x, d2.y );
+          *angle_out = FT_Atan2( d3.x, d3.y );
+        }
+      }
+    }
+
+    theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in,  *angle_mid ) );
+    theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) );
+
+    return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD &&
+                    theta2 < FT_SMALL_CUBIC_THRESHOLD );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       STROKE BORDERS                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef enum  FT_StrokeTags_
+  {
+    FT_STROKE_TAG_ON    = 1,   /* on-curve point  */
+    FT_STROKE_TAG_CUBIC = 2,   /* cubic off-point */
+    FT_STROKE_TAG_BEGIN = 4,   /* sub-path start  */
+    FT_STROKE_TAG_END   = 8    /* sub-path end    */
+
+  } FT_StrokeTags;
+
+#define  FT_STROKE_TAG_BEGIN_END  ( FT_STROKE_TAG_BEGIN | FT_STROKE_TAG_END )
+
+  typedef struct  FT_StrokeBorderRec_
+  {
+    FT_UInt     num_points;
+    FT_UInt     max_points;
+    FT_Vector*  points;
+    FT_Byte*    tags;
+    FT_Bool     movable;  /* TRUE for ends of lineto borders */
+    FT_Int      start;    /* index of current sub-path start point */
+    FT_Memory   memory;
+    FT_Bool     valid;
+
+  } FT_StrokeBorderRec, *FT_StrokeBorder;
+
+
+  static FT_Error
+  ft_stroke_border_grow( FT_StrokeBorder  border,
+                         FT_UInt          new_points )
+  {
+    FT_UInt   old_max = border->max_points;
+    FT_UInt   new_max = border->num_points + new_points;
+    FT_Error  error   = FT_Err_Ok;
+
+
+    if ( new_max > old_max )
+    {
+      FT_UInt    cur_max = old_max;
+      FT_Memory  memory  = border->memory;
+
+
+      while ( cur_max < new_max )
+        cur_max += ( cur_max >> 1 ) + 16;
+
+      if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) ||
+           FT_RENEW_ARRAY( border->tags,   old_max, cur_max ) )
+        goto Exit;
+
+      border->max_points = cur_max;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  ft_stroke_border_close( FT_StrokeBorder  border,
+                          FT_Bool          reverse )
+  {
+    FT_UInt  start = border->start;
+    FT_UInt  count = border->num_points;
+
+
+    FT_ASSERT( border->start >= 0 );
+
+    /* don't record empty paths! */
+    if ( count <= start + 1U )
+      border->num_points = start;
+    else
+    {
+      /* copy the last point to the start of this sub-path, since */
+      /* it contains the `adjusted' starting coordinates          */
+      border->num_points    = --count;
+      border->points[start] = border->points[count];
+
+      if ( reverse )
+      {
+        /* reverse the points */
+        {
+          FT_Vector*  vec1 = border->points + start + 1;
+          FT_Vector*  vec2 = border->points + count - 1;
+
+
+          for ( ; vec1 < vec2; vec1++, vec2-- )
+          {
+            FT_Vector  tmp;
+
+
+            tmp   = *vec1;
+            *vec1 = *vec2;
+            *vec2 = tmp;
+          }
+        }
+
+        /* then the tags */
+        {
+          FT_Byte*  tag1 = border->tags + start + 1;
+          FT_Byte*  tag2 = border->tags + count - 1;
+
+
+          for ( ; tag1 < tag2; tag1++, tag2-- )
+          {
+            FT_Byte  tmp;
+
+
+            tmp   = *tag1;
+            *tag1 = *tag2;
+            *tag2 = tmp;
+          }
+        }
+      }
+
+      border->tags[start    ] |= FT_STROKE_TAG_BEGIN;
+      border->tags[count - 1] |= FT_STROKE_TAG_END;
+    }
+
+    border->start   = -1;
+    border->movable = FALSE;
+  }
+
+
+  static FT_Error
+  ft_stroke_border_lineto( FT_StrokeBorder  border,
+                           FT_Vector*       to,
+                           FT_Bool          movable )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    FT_ASSERT( border->start >= 0 );
+
+    if ( border->movable )
+    {
+      /* move last point */
+      border->points[border->num_points - 1] = *to;
+    }
+    else
+    {
+      /* don't add zero-length lineto */
+      if ( border->num_points > 0                                          &&
+           FT_IS_SMALL( border->points[border->num_points - 1].x - to->x ) &&
+           FT_IS_SMALL( border->points[border->num_points - 1].y - to->y ) )
+        return error;
+
+      /* add one point */
+      error = ft_stroke_border_grow( border, 1 );
+      if ( !error )
+      {
+        FT_Vector*  vec = border->points + border->num_points;
+        FT_Byte*    tag = border->tags   + border->num_points;
+
+
+        vec[0] = *to;
+        tag[0] = FT_STROKE_TAG_ON;
+
+        border->num_points += 1;
+      }
+    }
+    border->movable = movable;
+    return error;
+  }
+
+
+  static FT_Error
+  ft_stroke_border_conicto( FT_StrokeBorder  border,
+                            FT_Vector*       control,
+                            FT_Vector*       to )
+  {
+    FT_Error  error;
+
+
+    FT_ASSERT( border->start >= 0 );
+
+    error = ft_stroke_border_grow( border, 2 );
+    if ( !error )
+    {
+      FT_Vector*  vec = border->points + border->num_points;
+      FT_Byte*    tag = border->tags   + border->num_points;
+
+
+      vec[0] = *control;
+      vec[1] = *to;
+
+      tag[0] = 0;
+      tag[1] = FT_STROKE_TAG_ON;
+
+      border->num_points += 2;
+    }
+
+    border->movable = FALSE;
+
+    return error;
+  }
+
+
+  static FT_Error
+  ft_stroke_border_cubicto( FT_StrokeBorder  border,
+                            FT_Vector*       control1,
+                            FT_Vector*       control2,
+                            FT_Vector*       to )
+  {
+    FT_Error  error;
+
+
+    FT_ASSERT( border->start >= 0 );
+
+    error = ft_stroke_border_grow( border, 3 );
+    if ( !error )
+    {
+      FT_Vector*  vec = border->points + border->num_points;
+      FT_Byte*    tag = border->tags   + border->num_points;
+
+
+      vec[0] = *control1;
+      vec[1] = *control2;
+      vec[2] = *to;
+
+      tag[0] = FT_STROKE_TAG_CUBIC;
+      tag[1] = FT_STROKE_TAG_CUBIC;
+      tag[2] = FT_STROKE_TAG_ON;
+
+      border->num_points += 3;
+    }
+
+    border->movable = FALSE;
+
+    return error;
+  }
+
+
+#define FT_ARC_CUBIC_ANGLE  ( FT_ANGLE_PI / 2 )
+
+
+  static FT_Error
+  ft_stroke_border_arcto( FT_StrokeBorder  border,
+                          FT_Vector*       center,
+                          FT_Fixed         radius,
+                          FT_Angle         angle_start,
+                          FT_Angle         angle_diff )
+  {
+    FT_Angle   total, angle, step, rotate, next, theta;
+    FT_Vector  a, b, a2, b2;
+    FT_Fixed   length;
+    FT_Error   error = FT_Err_Ok;
+
+
+    /* compute start point */
+    FT_Vector_From_Polar( &a, radius, angle_start );
+    a.x += center->x;
+    a.y += center->y;
+
+    total  = angle_diff;
+    angle  = angle_start;
+    rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2;
+
+    while ( total != 0 )
+    {
+      step = total;
+      if ( step > FT_ARC_CUBIC_ANGLE )
+        step = FT_ARC_CUBIC_ANGLE;
+
+      else if ( step < -FT_ARC_CUBIC_ANGLE )
+        step = -FT_ARC_CUBIC_ANGLE;
+
+      next  = angle + step;
+      theta = step;
+      if ( theta < 0 )
+        theta = -theta;
+
+      theta >>= 1;
+
+      /* compute end point */
+      FT_Vector_From_Polar( &b, radius, next );
+      b.x += center->x;
+      b.y += center->y;
+
+      /* compute first and second control points */
+      length = FT_MulDiv( radius, FT_Sin( theta ) * 4,
+                          ( 0x10000L + FT_Cos( theta ) ) * 3 );
+
+      FT_Vector_From_Polar( &a2, length, angle + rotate );
+      a2.x += a.x;
+      a2.y += a.y;
+
+      FT_Vector_From_Polar( &b2, length, next - rotate );
+      b2.x += b.x;
+      b2.y += b.y;
+
+      /* add cubic arc */
+      error = ft_stroke_border_cubicto( border, &a2, &b2, &b );
+      if ( error )
+        break;
+
+      /* process the rest of the arc ?? */
+      a      = b;
+      total -= step;
+      angle  = next;
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  ft_stroke_border_moveto( FT_StrokeBorder  border,
+                           FT_Vector*       to )
+  {
+    /* close current open path if any ? */
+    if ( border->start >= 0 )
+      ft_stroke_border_close( border, FALSE );
+
+    border->start = border->num_points;
+    border->movable = FALSE;
+
+    return ft_stroke_border_lineto( border, to, FALSE );
+  }
+
+
+  static void
+  ft_stroke_border_init( FT_StrokeBorder  border,
+                         FT_Memory        memory )
+  {
+    border->memory = memory;
+    border->points = NULL;
+    border->tags   = NULL;
+
+    border->num_points = 0;
+    border->max_points = 0;
+    border->start      = -1;
+    border->valid      = FALSE;
+  }
+
+
+  static void
+  ft_stroke_border_reset( FT_StrokeBorder  border )
+  {
+    border->num_points = 0;
+    border->start      = -1;
+    border->valid      = FALSE;
+  }
+
+
+  static void
+  ft_stroke_border_done( FT_StrokeBorder  border )
+  {
+    FT_Memory  memory = border->memory;
+
+
+    FT_FREE( border->points );
+    FT_FREE( border->tags );
+
+    border->num_points = 0;
+    border->max_points = 0;
+    border->start      = -1;
+    border->valid      = FALSE;
+  }
+
+
+  static FT_Error
+  ft_stroke_border_get_counts( FT_StrokeBorder  border,
+                               FT_UInt         *anum_points,
+                               FT_UInt         *anum_contours )
+  {
+    FT_Error  error        = FT_Err_Ok;
+    FT_UInt   num_points   = 0;
+    FT_UInt   num_contours = 0;
+
+    FT_UInt     count      = border->num_points;
+    FT_Vector*  point      = border->points;
+    FT_Byte*    tags       = border->tags;
+    FT_Int      in_contour = 0;
+
+
+    for ( ; count > 0; count--, num_points++, point++, tags++ )
+    {
+      if ( tags[0] & FT_STROKE_TAG_BEGIN )
+      {
+        if ( in_contour != 0 )
+          goto Fail;
+
+        in_contour = 1;
+      }
+      else if ( in_contour == 0 )
+        goto Fail;
+
+      if ( tags[0] & FT_STROKE_TAG_END )
+      {
+        in_contour = 0;
+        num_contours++;
+      }
+    }
+
+    if ( in_contour != 0 )
+      goto Fail;
+
+    border->valid = TRUE;
+
+  Exit:
+    *anum_points   = num_points;
+    *anum_contours = num_contours;
+    return error;
+
+  Fail:
+    num_points   = 0;
+    num_contours = 0;
+    goto Exit;
+  }
+
+
+  static void
+  ft_stroke_border_export( FT_StrokeBorder  border,
+                           FT_Outline*      outline )
+  {
+    /* copy point locations */
+    FT_ARRAY_COPY( outline->points + outline->n_points,
+                   border->points,
+                   border->num_points );
+
+    /* copy tags */
+    {
+      FT_UInt   count = border->num_points;
+      FT_Byte*  read  = border->tags;
+      FT_Byte*  write = (FT_Byte*)outline->tags + outline->n_points;
+
+
+      for ( ; count > 0; count--, read++, write++ )
+      {
+        if ( *read & FT_STROKE_TAG_ON )
+          *write = FT_CURVE_TAG_ON;
+        else if ( *read & FT_STROKE_TAG_CUBIC )
+          *write = FT_CURVE_TAG_CUBIC;
+        else
+          *write = FT_CURVE_TAG_CONIC;
+      }
+    }
+
+    /* copy contours */
+    {
+      FT_UInt    count = border->num_points;
+      FT_Byte*   tags  = border->tags;
+      FT_Short*  write = outline->contours + outline->n_contours;
+      FT_Short   idx   = (FT_Short)outline->n_points;
+
+
+      for ( ; count > 0; count--, tags++, idx++ )
+      {
+        if ( *tags & FT_STROKE_TAG_END )
+        {
+          *write++ = idx;
+          outline->n_contours++;
+        }
+      }
+    }
+
+    outline->n_points = (short)( outline->n_points + border->num_points );
+
+    FT_ASSERT( FT_Outline_Check( outline ) == 0 );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           STROKER                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define FT_SIDE_TO_ROTATE( s )   ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI )
+
+  typedef struct  FT_StrokerRec_
+  {
+    FT_Angle             angle_in;             /* direction into curr join */
+    FT_Angle             angle_out;            /* direction out of join  */
+    FT_Vector            center;               /* current position */
+    FT_Fixed             line_length;          /* length of last lineto */
+    FT_Bool              first_point;          /* is this the start? */
+    FT_Bool              subpath_open;         /* is the subpath open? */
+    FT_Angle             subpath_angle;        /* subpath start direction */
+    FT_Vector            subpath_start;        /* subpath start position */
+    FT_Fixed             subpath_line_length;  /* subpath start lineto len */
+    FT_Bool              handle_wide_strokes;  /* use wide strokes logic? */
+
+    FT_Stroker_LineCap   line_cap;
+    FT_Stroker_LineJoin  line_join;
+    FT_Stroker_LineJoin  line_join_saved;
+    FT_Fixed             miter_limit;
+    FT_Fixed             radius;
+
+    FT_StrokeBorderRec   borders[2];
+    FT_Library           library;
+
+  } FT_StrokerRec;
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_New( FT_Library   library,
+                  FT_Stroker  *astroker )
+  {
+    FT_Error    error;           /* assigned in FT_NEW */
+    FT_Memory   memory;
+    FT_Stroker  stroker = NULL;
+
+
+    if ( !library )
+      return FT_THROW( Invalid_Argument );
+
+    memory = library->memory;
+
+    if ( !FT_NEW( stroker ) )
+    {
+      stroker->library = library;
+
+      ft_stroke_border_init( &stroker->borders[0], memory );
+      ft_stroke_border_init( &stroker->borders[1], memory );
+    }
+
+    *astroker = stroker;
+
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Stroker_Set( FT_Stroker           stroker,
+                  FT_Fixed             radius,
+                  FT_Stroker_LineCap   line_cap,
+                  FT_Stroker_LineJoin  line_join,
+                  FT_Fixed             miter_limit )
+  {
+    stroker->radius      = radius;
+    stroker->line_cap    = line_cap;
+    stroker->line_join   = line_join;
+    stroker->miter_limit = miter_limit;
+
+    /* ensure miter limit has sensible value */
+    if ( stroker->miter_limit < 0x10000 )
+      stroker->miter_limit = 0x10000;
+
+    /* save line join style:                                           */
+    /* line join style can be temporarily changed when stroking curves */
+    stroker->line_join_saved = line_join;
+
+    FT_Stroker_Rewind( stroker );
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Stroker_Rewind( FT_Stroker  stroker )
+  {
+    if ( stroker )
+    {
+      ft_stroke_border_reset( &stroker->borders[0] );
+      ft_stroke_border_reset( &stroker->borders[1] );
+    }
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Stroker_Done( FT_Stroker  stroker )
+  {
+    if ( stroker )
+    {
+      FT_Memory  memory = stroker->library->memory;
+
+
+      ft_stroke_border_done( &stroker->borders[0] );
+      ft_stroke_border_done( &stroker->borders[1] );
+
+      stroker->library = NULL;
+      FT_FREE( stroker );
+    }
+  }
+
+
+  /* create a circular arc at a corner or cap */
+  static FT_Error
+  ft_stroker_arcto( FT_Stroker  stroker,
+                    FT_Int      side )
+  {
+    FT_Angle         total, rotate;
+    FT_Fixed         radius = stroker->radius;
+    FT_Error         error  = FT_Err_Ok;
+    FT_StrokeBorder  border = stroker->borders + side;
+
+
+    rotate = FT_SIDE_TO_ROTATE( side );
+
+    total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
+    if ( total == FT_ANGLE_PI )
+      total = -rotate * 2;
+
+    error = ft_stroke_border_arcto( border,
+                                    &stroker->center,
+                                    radius,
+                                    stroker->angle_in + rotate,
+                                    total );
+    border->movable = FALSE;
+    return error;
+  }
+
+
+  /* add a cap at the end of an opened path */
+  static FT_Error
+  ft_stroker_cap( FT_Stroker  stroker,
+                  FT_Angle    angle,
+                  FT_Int      side )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND )
+    {
+      /* add a round cap */
+      stroker->angle_in  = angle;
+      stroker->angle_out = angle + FT_ANGLE_PI;
+
+      error = ft_stroker_arcto( stroker, side );
+    }
+    else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE )
+    {
+      /* add a square cap */
+      FT_Vector        delta, delta2;
+      FT_Angle         rotate = FT_SIDE_TO_ROTATE( side );
+      FT_Fixed         radius = stroker->radius;
+      FT_StrokeBorder  border = stroker->borders + side;
+
+
+      FT_Vector_From_Polar( &delta2, radius, angle + rotate );
+      FT_Vector_From_Polar( &delta,  radius, angle );
+
+      delta.x += stroker->center.x + delta2.x;
+      delta.y += stroker->center.y + delta2.y;
+
+      error = ft_stroke_border_lineto( border, &delta, FALSE );
+      if ( error )
+        goto Exit;
+
+      FT_Vector_From_Polar( &delta2, radius, angle - rotate );
+      FT_Vector_From_Polar( &delta,  radius, angle );
+
+      delta.x += delta2.x + stroker->center.x;
+      delta.y += delta2.y + stroker->center.y;
+
+      error = ft_stroke_border_lineto( border, &delta, FALSE );
+    }
+    else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT )
+    {
+      /* add a butt ending */
+      FT_Vector        delta;
+      FT_Angle         rotate = FT_SIDE_TO_ROTATE( side );
+      FT_Fixed         radius = stroker->radius;
+      FT_StrokeBorder  border = stroker->borders + side;
+
+
+      FT_Vector_From_Polar( &delta, radius, angle + rotate );
+
+      delta.x += stroker->center.x;
+      delta.y += stroker->center.y;
+
+      error = ft_stroke_border_lineto( border, &delta, FALSE );
+      if ( error )
+        goto Exit;
+
+      FT_Vector_From_Polar( &delta, radius, angle - rotate );
+
+      delta.x += stroker->center.x;
+      delta.y += stroker->center.y;
+
+      error = ft_stroke_border_lineto( border, &delta, FALSE );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* process an inside corner, i.e. compute intersection */
+  static FT_Error
+  ft_stroker_inside( FT_Stroker  stroker,
+                     FT_Int      side,
+                     FT_Fixed    line_length )
+  {
+    FT_StrokeBorder  border = stroker->borders + side;
+    FT_Angle         phi, theta, rotate;
+    FT_Fixed         length, thcos;
+    FT_Vector        delta;
+    FT_Error         error = FT_Err_Ok;
+    FT_Bool          intersect;          /* use intersection of lines? */
+
+
+    rotate = FT_SIDE_TO_ROTATE( side );
+
+    theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2;
+
+    /* Only intersect borders if between two lineto's and both */
+    /* lines are long enough (line_length is zero for curves). */
+    if ( !border->movable || line_length == 0 )
+      intersect = FALSE;
+    else
+    {
+      /* compute minimum required length of lines */
+      FT_Fixed  min_length = ft_pos_abs( FT_MulFix( stroker->radius,
+                                                    FT_Tan( theta ) ) );
+
+
+      intersect = FT_BOOL( stroker->line_length >= min_length &&
+                           line_length          >= min_length );
+    }
+
+    if ( !intersect )
+    {
+      FT_Vector_From_Polar( &delta, stroker->radius,
+                            stroker->angle_out + rotate );
+      delta.x += stroker->center.x;
+      delta.y += stroker->center.y;
+
+      border->movable = FALSE;
+    }
+    else
+    {
+      /* compute median angle */
+      phi = stroker->angle_in + theta;
+
+      thcos = FT_Cos( theta );
+
+      length = FT_DivFix( stroker->radius, thcos );
+
+      FT_Vector_From_Polar( &delta, length, phi + rotate );
+      delta.x += stroker->center.x;
+      delta.y += stroker->center.y;
+    }
+
+    error = ft_stroke_border_lineto( border, &delta, FALSE );
+
+    return error;
+  }
+
+
+  /* process an outside corner, i.e. compute bevel/miter/round */
+  static FT_Error
+  ft_stroker_outside( FT_Stroker  stroker,
+                      FT_Int      side,
+                      FT_Fixed    line_length )
+  {
+    FT_StrokeBorder  border = stroker->borders + side;
+    FT_Error         error;
+    FT_Angle         rotate;
+
+
+    if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND )
+      error = ft_stroker_arcto( stroker, side );
+    else
+    {
+      /* this is a mitered (pointed) or beveled (truncated) corner */
+      FT_Fixed  sigma = 0, radius = stroker->radius;
+      FT_Angle  theta = 0, phi = 0;
+      FT_Fixed  thcos = 0;
+      FT_Bool   bevel, fixed_bevel;
+
+
+      rotate = FT_SIDE_TO_ROTATE( side );
+
+      bevel =
+        FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_BEVEL );
+
+      fixed_bevel =
+        FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_MITER_VARIABLE );
+
+      if ( !bevel )
+      {
+        theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
+
+        if ( theta == FT_ANGLE_PI )
+        {
+          theta = rotate;
+          phi   = stroker->angle_in;
+        }
+        else
+        {
+          theta /= 2;
+          phi    = stroker->angle_in + theta + rotate;
+        }
+
+        thcos = FT_Cos( theta );
+        sigma = FT_MulFix( stroker->miter_limit, thcos );
+
+        /* is miter limit exceeded? */
+        if ( sigma < 0x10000L )
+        {
+          /* don't create variable bevels for very small deviations; */
+          /* FT_Sin(x) = 0 for x <= 57                               */
+          if ( fixed_bevel || ft_pos_abs( theta ) > 57 )
+            bevel = TRUE;
+        }
+      }
+
+      if ( bevel )  /* this is a bevel (broken angle) */
+      {
+        if ( fixed_bevel )
+        {
+          /* the outer corners are simply joined together */
+          FT_Vector  delta;
+
+
+          /* add bevel */
+          FT_Vector_From_Polar( &delta,
+                                radius,
+                                stroker->angle_out + rotate );
+          delta.x += stroker->center.x;
+          delta.y += stroker->center.y;
+
+          border->movable = FALSE;
+          error = ft_stroke_border_lineto( border, &delta, FALSE );
+        }
+        else /* variable bevel */
+        {
+          /* the miter is truncated */
+          FT_Vector  middle, delta;
+          FT_Fixed   length;
+
+
+          /* compute middle point */
+          FT_Vector_From_Polar( &middle,
+                                FT_MulFix( radius, stroker->miter_limit ),
+                                phi );
+          middle.x += stroker->center.x;
+          middle.y += stroker->center.y;
+
+          /* compute first angle point */
+          length = FT_MulDiv( radius, 0x10000L - sigma,
+                              ft_pos_abs( FT_Sin( theta ) ) );
+
+          FT_Vector_From_Polar( &delta, length, phi + rotate );
+          delta.x += middle.x;
+          delta.y += middle.y;
+
+          error = ft_stroke_border_lineto( border, &delta, FALSE );
+          if ( error )
+            goto Exit;
+
+          /* compute second angle point */
+          FT_Vector_From_Polar( &delta, length, phi - rotate );
+          delta.x += middle.x;
+          delta.y += middle.y;
+
+          error = ft_stroke_border_lineto( border, &delta, FALSE );
+          if ( error )
+            goto Exit;
+
+          /* finally, add an end point; only needed if not lineto */
+          /* (line_length is zero for curves)                     */
+          if ( line_length == 0 )
+          {
+            FT_Vector_From_Polar( &delta,
+                                  radius,
+                                  stroker->angle_out + rotate );
+
+            delta.x += stroker->center.x;
+            delta.y += stroker->center.y;
+
+            error = ft_stroke_border_lineto( border, &delta, FALSE );
+          }
+        }
+      }
+      else /* this is a miter (intersection) */
+      {
+        FT_Fixed   length;
+        FT_Vector  delta;
+
+
+        length = FT_DivFix( stroker->radius, thcos );
+
+        FT_Vector_From_Polar( &delta, length, phi );
+        delta.x += stroker->center.x;
+        delta.y += stroker->center.y;
+
+        error = ft_stroke_border_lineto( border, &delta, FALSE );
+        if ( error )
+          goto Exit;
+
+        /* now add an end point; only needed if not lineto */
+        /* (line_length is zero for curves)                */
+        if ( line_length == 0 )
+        {
+          FT_Vector_From_Polar( &delta,
+                                stroker->radius,
+                                stroker->angle_out + rotate );
+          delta.x += stroker->center.x;
+          delta.y += stroker->center.y;
+
+          error = ft_stroke_border_lineto( border, &delta, FALSE );
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  ft_stroker_process_corner( FT_Stroker  stroker,
+                             FT_Fixed    line_length )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_Angle  turn;
+    FT_Int    inside_side;
+
+
+    turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
+
+    /* no specific corner processing is required if the turn is 0 */
+    if ( turn == 0 )
+      goto Exit;
+
+    /* when we turn to the right, the inside side is 0 */
+    inside_side = 0;
+
+    /* otherwise, the inside side is 1 */
+    if ( turn < 0 )
+      inside_side = 1;
+
+    /* process the inside side */
+    error = ft_stroker_inside( stroker, inside_side, line_length );
+    if ( error )
+      goto Exit;
+
+    /* process the outside side */
+    error = ft_stroker_outside( stroker, 1 - inside_side, line_length );
+
+  Exit:
+    return error;
+  }
+
+
+  /* add two points to the left and right borders corresponding to the */
+  /* start of the subpath                                              */
+  static FT_Error
+  ft_stroker_subpath_start( FT_Stroker  stroker,
+                            FT_Angle    start_angle,
+                            FT_Fixed    line_length )
+  {
+    FT_Vector        delta;
+    FT_Vector        point;
+    FT_Error         error;
+    FT_StrokeBorder  border;
+
+
+    FT_Vector_From_Polar( &delta, stroker->radius,
+                          start_angle + FT_ANGLE_PI2 );
+
+    point.x = stroker->center.x + delta.x;
+    point.y = stroker->center.y + delta.y;
+
+    border = stroker->borders;
+    error = ft_stroke_border_moveto( border, &point );
+    if ( error )
+      goto Exit;
+
+    point.x = stroker->center.x - delta.x;
+    point.y = stroker->center.y - delta.y;
+
+    border++;
+    error = ft_stroke_border_moveto( border, &point );
+
+    /* save angle, position, and line length for last join */
+    /* (line_length is zero for curves)                    */
+    stroker->subpath_angle       = start_angle;
+    stroker->first_point         = FALSE;
+    stroker->subpath_line_length = line_length;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_LineTo( FT_Stroker  stroker,
+                     FT_Vector*  to )
+  {
+    FT_Error         error = FT_Err_Ok;
+    FT_StrokeBorder  border;
+    FT_Vector        delta;
+    FT_Angle         angle;
+    FT_Int           side;
+    FT_Fixed         line_length;
+
+
+    delta.x = to->x - stroker->center.x;
+    delta.y = to->y - stroker->center.y;
+
+    /* a zero-length lineto is a no-op; avoid creating a spurious corner */
+    if ( delta.x == 0 && delta.y == 0 )
+       goto Exit;
+
+    /* compute length of line */
+    line_length = FT_Vector_Length( &delta );
+
+    angle = FT_Atan2( delta.x, delta.y );
+    FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 );
+
+    /* process corner if necessary */
+    if ( stroker->first_point )
+    {
+      /* This is the first segment of a subpath.  We need to     */
+      /* add a point to each border at their respective starting */
+      /* point locations.                                        */
+      error = ft_stroker_subpath_start( stroker, angle, line_length );
+      if ( error )
+        goto Exit;
+    }
+    else
+    {
+      /* process the current corner */
+      stroker->angle_out = angle;
+      error = ft_stroker_process_corner( stroker, line_length );
+      if ( error )
+        goto Exit;
+    }
+
+    /* now add a line segment to both the `inside' and `outside' paths */
+    for ( border = stroker->borders, side = 1; side >= 0; side--, border++ )
+    {
+      FT_Vector  point;
+
+
+      point.x = to->x + delta.x;
+      point.y = to->y + delta.y;
+
+      /* the ends of lineto borders are movable */
+      error = ft_stroke_border_lineto( border, &point, TRUE );
+      if ( error )
+        goto Exit;
+
+      delta.x = -delta.x;
+      delta.y = -delta.y;
+    }
+
+    stroker->angle_in    = angle;
+    stroker->center      = *to;
+    stroker->line_length = line_length;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_ConicTo( FT_Stroker  stroker,
+                      FT_Vector*  control,
+                      FT_Vector*  to )
+  {
+    FT_Error    error = FT_Err_Ok;
+    FT_Vector   bez_stack[34];
+    FT_Vector*  arc;
+    FT_Vector*  limit = bez_stack + 30;
+    FT_Bool     first_arc = TRUE;
+
+
+    /* if all control points are coincident, this is a no-op; */
+    /* avoid creating a spurious corner                       */
+    if ( FT_IS_SMALL( stroker->center.x - control->x ) &&
+         FT_IS_SMALL( stroker->center.y - control->y ) &&
+         FT_IS_SMALL( control->x        - to->x      ) &&
+         FT_IS_SMALL( control->y        - to->y      ) )
+    {
+       stroker->center = *to;
+       goto Exit;
+    }
+
+    arc    = bez_stack;
+    arc[0] = *to;
+    arc[1] = *control;
+    arc[2] = stroker->center;
+
+    while ( arc >= bez_stack )
+    {
+      FT_Angle  angle_in, angle_out;
+
+
+      /* initialize with current direction */
+      angle_in = angle_out = stroker->angle_in;
+
+      if ( arc < limit                                             &&
+           !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) )
+      {
+        if ( stroker->first_point )
+          stroker->angle_in = angle_in;
+
+        ft_conic_split( arc );
+        arc += 2;
+        continue;
+      }
+
+      if ( first_arc )
+      {
+        first_arc = FALSE;
+
+        /* process corner if necessary */
+        if ( stroker->first_point )
+          error = ft_stroker_subpath_start( stroker, angle_in, 0 );
+        else
+        {
+          stroker->angle_out = angle_in;
+          error = ft_stroker_process_corner( stroker, 0 );
+        }
+      }
+      else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >
+                  FT_SMALL_CONIC_THRESHOLD / 4                             )
+      {
+        /* if the deviation from one arc to the next is too great, */
+        /* add a round corner                                      */
+        stroker->center    = arc[2];
+        stroker->angle_out = angle_in;
+        stroker->line_join = FT_STROKER_LINEJOIN_ROUND;
+
+        error = ft_stroker_process_corner( stroker, 0 );
+
+        /* reinstate line join style */
+        stroker->line_join = stroker->line_join_saved;
+      }
+
+      if ( error )
+        goto Exit;
+
+      /* the arc's angle is small enough; we can add it directly to each */
+      /* border                                                          */
+      {
+        FT_Vector        ctrl, end;
+        FT_Angle         theta, phi, rotate, alpha0 = 0;
+        FT_Fixed         length;
+        FT_StrokeBorder  border;
+        FT_Int           side;
+
+
+        theta  = FT_Angle_Diff( angle_in, angle_out ) / 2;
+        phi    = angle_in + theta;
+        length = FT_DivFix( stroker->radius, FT_Cos( theta ) );
+
+        /* compute direction of original arc */
+        if ( stroker->handle_wide_strokes )
+          alpha0 = FT_Atan2( arc[0].x - arc[2].x, arc[0].y - arc[2].y );
+
+        for ( border = stroker->borders, side = 0;
+              side <= 1;
+              side++, border++ )
+        {
+          rotate = FT_SIDE_TO_ROTATE( side );
+
+          /* compute control point */
+          FT_Vector_From_Polar( &ctrl, length, phi + rotate );
+          ctrl.x += arc[1].x;
+          ctrl.y += arc[1].y;
+
+          /* compute end point */
+          FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );
+          end.x += arc[0].x;
+          end.y += arc[0].y;
+
+          if ( stroker->handle_wide_strokes )
+          {
+            FT_Vector  start;
+            FT_Angle   alpha1;
+
+
+            /* determine whether the border radius is greater than the */
+            /* radius of curvature of the original arc                 */
+            start = border->points[border->num_points - 1];
+
+            alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );
+
+            /* is the direction of the border arc opposite to */
+            /* that of the original arc? */
+            if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >
+                   FT_ANGLE_PI / 2                             )
+            {
+              FT_Angle   beta, gamma;
+              FT_Vector  bvec, delta;
+              FT_Fixed   blen, sinA, sinB, alen;
+
+
+              /* use the sine rule to find the intersection point */
+              beta  = FT_Atan2( arc[2].x - start.x, arc[2].y - start.y );
+              gamma = FT_Atan2( arc[0].x - end.x,   arc[0].y - end.y );
+
+              bvec.x = end.x - start.x;
+              bvec.y = end.y - start.y;
+
+              blen = FT_Vector_Length( &bvec );
+
+              sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );
+              sinB = ft_pos_abs( FT_Sin( beta - gamma ) );
+
+              alen = FT_MulDiv( blen, sinA, sinB );
+
+              FT_Vector_From_Polar( &delta, alen, beta );
+              delta.x += start.x;
+              delta.y += start.y;
+
+              /* circumnavigate the negative sector backwards */
+              border->movable = FALSE;
+              error = ft_stroke_border_lineto( border, &delta, FALSE );
+              if ( error )
+                goto Exit;
+              error = ft_stroke_border_lineto( border, &end, FALSE );
+              if ( error )
+                goto Exit;
+              error = ft_stroke_border_conicto( border, &ctrl, &start );
+              if ( error )
+                goto Exit;
+              /* and then move to the endpoint */
+              error = ft_stroke_border_lineto( border, &end, FALSE );
+              if ( error )
+                goto Exit;
+
+              continue;
+            }
+
+            /* else fall through */
+          }
+
+          /* simply add an arc */
+          error = ft_stroke_border_conicto( border, &ctrl, &end );
+          if ( error )
+            goto Exit;
+        }
+      }
+
+      arc -= 2;
+
+      stroker->angle_in = angle_out;
+    }
+
+    stroker->center = *to;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_CubicTo( FT_Stroker  stroker,
+                      FT_Vector*  control1,
+                      FT_Vector*  control2,
+                      FT_Vector*  to )
+  {
+    FT_Error    error = FT_Err_Ok;
+    FT_Vector   bez_stack[37];
+    FT_Vector*  arc;
+    FT_Vector*  limit = bez_stack + 32;
+    FT_Bool     first_arc = TRUE;
+
+
+    /* if all control points are coincident, this is a no-op; */
+    /* avoid creating a spurious corner */
+    if ( FT_IS_SMALL( stroker->center.x - control1->x ) &&
+         FT_IS_SMALL( stroker->center.y - control1->y ) &&
+         FT_IS_SMALL( control1->x       - control2->x ) &&
+         FT_IS_SMALL( control1->y       - control2->y ) &&
+         FT_IS_SMALL( control2->x       - to->x       ) &&
+         FT_IS_SMALL( control2->y       - to->y       ) )
+    {
+       stroker->center = *to;
+       goto Exit;
+    }
+
+    arc    = bez_stack;
+    arc[0] = *to;
+    arc[1] = *control2;
+    arc[2] = *control1;
+    arc[3] = stroker->center;
+
+    while ( arc >= bez_stack )
+    {
+      FT_Angle  angle_in, angle_mid, angle_out;
+
+
+      /* initialize with current direction */
+      angle_in = angle_out = angle_mid = stroker->angle_in;
+
+      if ( arc < limit                                         &&
+           !ft_cubic_is_small_enough( arc, &angle_in,
+                                      &angle_mid, &angle_out ) )
+      {
+        if ( stroker->first_point )
+          stroker->angle_in = angle_in;
+
+        ft_cubic_split( arc );
+        arc += 3;
+        continue;
+      }
+
+      if ( first_arc )
+      {
+        first_arc = FALSE;
+
+        /* process corner if necessary */
+        if ( stroker->first_point )
+          error = ft_stroker_subpath_start( stroker, angle_in, 0 );
+        else
+        {
+          stroker->angle_out = angle_in;
+          error = ft_stroker_process_corner( stroker, 0 );
+        }
+      }
+      else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >
+                  FT_SMALL_CUBIC_THRESHOLD / 4                             )
+      {
+        /* if the deviation from one arc to the next is too great, */
+        /* add a round corner                                      */
+        stroker->center    = arc[3];
+        stroker->angle_out = angle_in;
+        stroker->line_join = FT_STROKER_LINEJOIN_ROUND;
+
+        error = ft_stroker_process_corner( stroker, 0 );
+
+        /* reinstate line join style */
+        stroker->line_join = stroker->line_join_saved;
+      }
+
+      if ( error )
+        goto Exit;
+
+      /* the arc's angle is small enough; we can add it directly to each */
+      /* border                                                          */
+      {
+        FT_Vector        ctrl1, ctrl2, end;
+        FT_Angle         theta1, phi1, theta2, phi2, rotate, alpha0 = 0;
+        FT_Fixed         length1, length2;
+        FT_StrokeBorder  border;
+        FT_Int           side;
+
+
+        theta1  = FT_Angle_Diff( angle_in,  angle_mid ) / 2;
+        theta2  = FT_Angle_Diff( angle_mid, angle_out ) / 2;
+        phi1    = ft_angle_mean( angle_in,  angle_mid );
+        phi2    = ft_angle_mean( angle_mid, angle_out );
+        length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) );
+        length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) );
+
+        /* compute direction of original arc */
+        if ( stroker->handle_wide_strokes )
+          alpha0 = FT_Atan2( arc[0].x - arc[3].x, arc[0].y - arc[3].y );
+
+        for ( border = stroker->borders, side = 0;
+              side <= 1;
+              side++, border++ )
+        {
+          rotate = FT_SIDE_TO_ROTATE( side );
+
+          /* compute control points */
+          FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate );
+          ctrl1.x += arc[2].x;
+          ctrl1.y += arc[2].y;
+
+          FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate );
+          ctrl2.x += arc[1].x;
+          ctrl2.y += arc[1].y;
+
+          /* compute end point */
+          FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );
+          end.x += arc[0].x;
+          end.y += arc[0].y;
+
+          if ( stroker->handle_wide_strokes )
+          {
+            FT_Vector  start;
+            FT_Angle   alpha1;
+
+
+            /* determine whether the border radius is greater than the */
+            /* radius of curvature of the original arc                 */
+            start = border->points[border->num_points - 1];
+
+            alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );
+
+            /* is the direction of the border arc opposite to */
+            /* that of the original arc? */
+            if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >
+                   FT_ANGLE_PI / 2                             )
+            {
+              FT_Angle   beta, gamma;
+              FT_Vector  bvec, delta;
+              FT_Fixed   blen, sinA, sinB, alen;
+
+
+              /* use the sine rule to find the intersection point */
+              beta  = FT_Atan2( arc[3].x - start.x, arc[3].y - start.y );
+              gamma = FT_Atan2( arc[0].x - end.x,   arc[0].y - end.y );
+
+              bvec.x = end.x - start.x;
+              bvec.y = end.y - start.y;
+
+              blen = FT_Vector_Length( &bvec );
+
+              sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );
+              sinB = ft_pos_abs( FT_Sin( beta - gamma ) );
+
+              alen = FT_MulDiv( blen, sinA, sinB );
+
+              FT_Vector_From_Polar( &delta, alen, beta );
+              delta.x += start.x;
+              delta.y += start.y;
+
+              /* circumnavigate the negative sector backwards */
+              border->movable = FALSE;
+              error = ft_stroke_border_lineto( border, &delta, FALSE );
+              if ( error )
+                goto Exit;
+              error = ft_stroke_border_lineto( border, &end, FALSE );
+              if ( error )
+                goto Exit;
+              error = ft_stroke_border_cubicto( border,
+                                                &ctrl2,
+                                                &ctrl1,
+                                                &start );
+              if ( error )
+                goto Exit;
+              /* and then move to the endpoint */
+              error = ft_stroke_border_lineto( border, &end, FALSE );
+              if ( error )
+                goto Exit;
+
+              continue;
+            }
+
+            /* else fall through */
+          }
+
+          /* simply add an arc */
+          error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end );
+          if ( error )
+            goto Exit;
+        }
+      }
+
+      arc -= 3;
+
+      stroker->angle_in = angle_out;
+    }
+
+    stroker->center = *to;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_BeginSubPath( FT_Stroker  stroker,
+                           FT_Vector*  to,
+                           FT_Bool     open )
+  {
+    /* We cannot process the first point, because there is not enough      */
+    /* information regarding its corner/cap.  The latter will be processed */
+    /* in the `FT_Stroker_EndSubPath' routine.                             */
+    /*                                                                     */
+    stroker->first_point  = TRUE;
+    stroker->center       = *to;
+    stroker->subpath_open = open;
+
+    /* Determine if we need to check whether the border radius is greater */
+    /* than the radius of curvature of a curve, to handle this case       */
+    /* specially.  This is only required if bevel joins or butt caps may  */
+    /* be created, because round & miter joins and round & square caps    */
+    /* cover the negative sector created with wide strokes.               */
+    stroker->handle_wide_strokes =
+      FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_ROUND  ||
+               ( stroker->subpath_open                        &&
+                 stroker->line_cap == FT_STROKER_LINECAP_BUTT ) );
+
+    /* record the subpath start point for each border */
+    stroker->subpath_start = *to;
+
+    stroker->angle_in = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Error
+  ft_stroker_add_reverse_left( FT_Stroker  stroker,
+                               FT_Bool     open )
+  {
+    FT_StrokeBorder  right = stroker->borders + 0;
+    FT_StrokeBorder  left  = stroker->borders + 1;
+    FT_Int           new_points;
+    FT_Error         error = FT_Err_Ok;
+
+
+    FT_ASSERT( left->start >= 0 );
+
+    new_points = left->num_points - left->start;
+    if ( new_points > 0 )
+    {
+      error = ft_stroke_border_grow( right, (FT_UInt)new_points );
+      if ( error )
+        goto Exit;
+
+      {
+        FT_Vector*  dst_point = right->points + right->num_points;
+        FT_Byte*    dst_tag   = right->tags   + right->num_points;
+        FT_Vector*  src_point = left->points  + left->num_points - 1;
+        FT_Byte*    src_tag   = left->tags    + left->num_points - 1;
+
+
+        while ( src_point >= left->points + left->start )
+        {
+          *dst_point = *src_point;
+          *dst_tag   = *src_tag;
+
+          if ( open )
+            dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END;
+          else
+          {
+            FT_Byte  ttag =
+                       (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END );
+
+
+            /* switch begin/end tags if necessary */
+            if ( ttag == FT_STROKE_TAG_BEGIN ||
+                 ttag == FT_STROKE_TAG_END   )
+              dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END;
+          }
+
+          src_point--;
+          src_tag--;
+          dst_point++;
+          dst_tag++;
+        }
+      }
+
+      left->num_points   = left->start;
+      right->num_points += new_points;
+
+      right->movable = FALSE;
+      left->movable  = FALSE;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  /* there's a lot of magic in this function! */
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_EndSubPath( FT_Stroker  stroker )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( stroker->subpath_open )
+    {
+      FT_StrokeBorder  right = stroker->borders;
+
+
+      /* All right, this is an opened path, we need to add a cap between */
+      /* right & left, add the reverse of left, then add a final cap     */
+      /* between left & right.                                           */
+      error = ft_stroker_cap( stroker, stroker->angle_in, 0 );
+      if ( error )
+        goto Exit;
+
+      /* add reversed points from `left' to `right' */
+      error = ft_stroker_add_reverse_left( stroker, TRUE );
+      if ( error )
+        goto Exit;
+
+      /* now add the final cap */
+      stroker->center = stroker->subpath_start;
+      error = ft_stroker_cap( stroker,
+                              stroker->subpath_angle + FT_ANGLE_PI, 0 );
+      if ( error )
+        goto Exit;
+
+      /* Now end the right subpath accordingly.  The left one is */
+      /* rewind and doesn't need further processing.             */
+      ft_stroke_border_close( right, FALSE );
+    }
+    else
+    {
+      FT_Angle  turn;
+      FT_Int    inside_side;
+
+
+      /* close the path if needed */
+      if ( stroker->center.x != stroker->subpath_start.x ||
+           stroker->center.y != stroker->subpath_start.y )
+      {
+         error = FT_Stroker_LineTo( stroker, &stroker->subpath_start );
+         if ( error )
+           goto Exit;
+      }
+
+      /* process the corner */
+      stroker->angle_out = stroker->subpath_angle;
+      turn               = FT_Angle_Diff( stroker->angle_in,
+                                          stroker->angle_out );
+
+      /* no specific corner processing is required if the turn is 0 */
+      if ( turn != 0 )
+      {
+        /* when we turn to the right, the inside side is 0 */
+        inside_side = 0;
+
+        /* otherwise, the inside side is 1 */
+        if ( turn < 0 )
+          inside_side = 1;
+
+        error = ft_stroker_inside( stroker,
+                                   inside_side,
+                                   stroker->subpath_line_length );
+        if ( error )
+          goto Exit;
+
+        /* process the outside side */
+        error = ft_stroker_outside( stroker,
+                                    1 - inside_side,
+                                    stroker->subpath_line_length );
+        if ( error )
+          goto Exit;
+      }
+
+      /* then end our two subpaths */
+      ft_stroke_border_close( stroker->borders + 0, FALSE );
+      ft_stroke_border_close( stroker->borders + 1, TRUE );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,
+                              FT_StrokerBorder  border,
+                              FT_UInt          *anum_points,
+                              FT_UInt          *anum_contours )
+  {
+    FT_UInt   num_points = 0, num_contours = 0;
+    FT_Error  error;
+
+
+    if ( !stroker || border > 1 )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    error = ft_stroke_border_get_counts( stroker->borders + border,
+                                         &num_points, &num_contours );
+  Exit:
+    if ( anum_points )
+      *anum_points = num_points;
+
+    if ( anum_contours )
+      *anum_contours = num_contours;
+
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_GetCounts( FT_Stroker  stroker,
+                        FT_UInt    *anum_points,
+                        FT_UInt    *anum_contours )
+  {
+    FT_UInt   count1, count2, num_points   = 0;
+    FT_UInt   count3, count4, num_contours = 0;
+    FT_Error  error;
+
+
+    error = ft_stroke_border_get_counts( stroker->borders + 0,
+                                         &count1, &count2 );
+    if ( error )
+      goto Exit;
+
+    error = ft_stroke_border_get_counts( stroker->borders + 1,
+                                         &count3, &count4 );
+    if ( error )
+      goto Exit;
+
+    num_points   = count1 + count3;
+    num_contours = count2 + count4;
+
+  Exit:
+    *anum_points   = num_points;
+    *anum_contours = num_contours;
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Stroker_ExportBorder( FT_Stroker        stroker,
+                           FT_StrokerBorder  border,
+                           FT_Outline*       outline )
+  {
+    if ( border == FT_STROKER_BORDER_LEFT  ||
+         border == FT_STROKER_BORDER_RIGHT )
+    {
+      FT_StrokeBorder  sborder = & stroker->borders[border];
+
+
+      if ( sborder->valid )
+        ft_stroke_border_export( sborder, outline );
+    }
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Stroker_Export( FT_Stroker   stroker,
+                     FT_Outline*  outline )
+  {
+    FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline );
+    FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline );
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  /*
+   *  The following is very similar to FT_Outline_Decompose, except
+   *  that we do support opened paths, and do not scale the outline.
+   */
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_ParseOutline( FT_Stroker   stroker,
+                           FT_Outline*  outline,
+                           FT_Bool      opened )
+  {
+    FT_Vector   v_last;
+    FT_Vector   v_control;
+    FT_Vector   v_start;
+
+    FT_Vector*  point;
+    FT_Vector*  limit;
+    char*       tags;
+
+    FT_Error    error;
+
+    FT_Int      n;         /* index of contour in outline     */
+    FT_UInt     first;     /* index of first point in contour */
+    FT_Int      tag;       /* current point's state           */
+
+
+    if ( !outline || !stroker )
+      return FT_THROW( Invalid_Argument );
+
+    FT_Stroker_Rewind( stroker );
+
+    first = 0;
+
+    for ( n = 0; n < outline->n_contours; n++ )
+    {
+      FT_UInt  last;  /* index of last point in contour */
+
+
+      last  = outline->contours[n];
+      limit = outline->points + last;
+
+      /* skip empty points; we don't stroke these */
+      if ( last <= first )
+      {
+        first = last + 1;
+        continue;
+      }
+
+      v_start = outline->points[first];
+      v_last  = outline->points[last];
+
+      v_control = v_start;
+
+      point = outline->points + first;
+      tags  = outline->tags   + first;
+      tag   = FT_CURVE_TAG( tags[0] );
+
+      /* A contour cannot start with a cubic control point! */
+      if ( tag == FT_CURVE_TAG_CUBIC )
+        goto Invalid_Outline;
+
+      /* check first point to determine origin */
+      if ( tag == FT_CURVE_TAG_CONIC )
+      {
+        /* First point is conic control.  Yes, this happens. */
+        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
+        {
+          /* start at last point if it is on the curve */
+          v_start = v_last;
+          limit--;
+        }
+        else
+        {
+          /* if both first and last points are conic, */
+          /* start at their middle                    */
+          v_start.x = ( v_start.x + v_last.x ) / 2;
+          v_start.y = ( v_start.y + v_last.y ) / 2;
+        }
+        point--;
+        tags--;
+      }
+
+      error = FT_Stroker_BeginSubPath( stroker, &v_start, opened );
+      if ( error )
+        goto Exit;
+
+      while ( point < limit )
+      {
+        point++;
+        tags++;
+
+        tag = FT_CURVE_TAG( tags[0] );
+        switch ( tag )
+        {
+        case FT_CURVE_TAG_ON:  /* emit a single line_to */
+          {
+            FT_Vector  vec;
+
+
+            vec.x = point->x;
+            vec.y = point->y;
+
+            error = FT_Stroker_LineTo( stroker, &vec );
+            if ( error )
+              goto Exit;
+            continue;
+          }
+
+        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
+          v_control.x = point->x;
+          v_control.y = point->y;
+
+        Do_Conic:
+          if ( point < limit )
+          {
+            FT_Vector  vec;
+            FT_Vector  v_middle;
+
+
+            point++;
+            tags++;
+            tag = FT_CURVE_TAG( tags[0] );
+
+            vec = point[0];
+
+            if ( tag == FT_CURVE_TAG_ON )
+            {
+              error = FT_Stroker_ConicTo( stroker, &v_control, &vec );
+              if ( error )
+                goto Exit;
+              continue;
+            }
+
+            if ( tag != FT_CURVE_TAG_CONIC )
+              goto Invalid_Outline;
+
+            v_middle.x = ( v_control.x + vec.x ) / 2;
+            v_middle.y = ( v_control.y + vec.y ) / 2;
+
+            error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle );
+            if ( error )
+              goto Exit;
+
+            v_control = vec;
+            goto Do_Conic;
+          }
+
+          error = FT_Stroker_ConicTo( stroker, &v_control, &v_start );
+          goto Close;
+
+        default:  /* FT_CURVE_TAG_CUBIC */
+          {
+            FT_Vector  vec1, vec2;
+
+
+            if ( point + 1 > limit                             ||
+                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+              goto Invalid_Outline;
+
+            point += 2;
+            tags  += 2;
+
+            vec1 = point[-2];
+            vec2 = point[-1];
+
+            if ( point <= limit )
+            {
+              FT_Vector  vec;
+
+
+              vec = point[0];
+
+              error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec );
+              if ( error )
+                goto Exit;
+              continue;
+            }
+
+            error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start );
+            goto Close;
+          }
+        }
+      }
+
+    Close:
+      if ( error )
+        goto Exit;
+
+      /* don't try to end the path if no segments have been generated */
+      if ( !stroker->first_point )
+      {
+        error = FT_Stroker_EndSubPath( stroker );
+        if ( error )
+          goto Exit;
+      }
+
+      first = last + 1;
+    }
+
+    return FT_Err_Ok;
+
+  Exit:
+    return error;
+
+  Invalid_Outline:
+    return FT_THROW( Invalid_Outline );
+  }
+
+
+  /* declare an extern to access `ft_outline_glyph_class' globally     */
+  /* allocated  in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */
+  /* macro to access it when FT_CONFIG_OPTION_PIC is defined           */
+#ifndef FT_CONFIG_OPTION_PIC
+  extern const FT_Glyph_Class  ft_outline_glyph_class;
+#endif
+#include "basepic.h"
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Glyph_Stroke( FT_Glyph    *pglyph,
+                   FT_Stroker   stroker,
+                   FT_Bool      destroy )
+  {
+    FT_Error    error   = FT_ERR( Invalid_Argument );
+    FT_Glyph    glyph   = NULL;
+    FT_Library  library = stroker->library;
+
+    FT_UNUSED( library );
+
+
+    if ( pglyph == NULL )
+      goto Exit;
+
+    glyph = *pglyph;
+    if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )
+      goto Exit;
+
+    {
+      FT_Glyph  copy;
+
+
+      error = FT_Glyph_Copy( glyph, &copy );
+      if ( error )
+        goto Exit;
+
+      glyph = copy;
+    }
+
+    {
+      FT_OutlineGlyph  oglyph  = (FT_OutlineGlyph)glyph;
+      FT_Outline*      outline = &oglyph->outline;
+      FT_UInt          num_points, num_contours;
+
+
+      error = FT_Stroker_ParseOutline( stroker, outline, FALSE );
+      if ( error )
+        goto Fail;
+
+      (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours );
+
+      FT_Outline_Done( glyph->library, outline );
+
+      error = FT_Outline_New( glyph->library,
+                              num_points, num_contours, outline );
+      if ( error )
+        goto Fail;
+
+      outline->n_points   = 0;
+      outline->n_contours = 0;
+
+      FT_Stroker_Export( stroker, outline );
+    }
+
+    if ( destroy )
+      FT_Done_Glyph( *pglyph );
+
+    *pglyph = glyph;
+    goto Exit;
+
+  Fail:
+    FT_Done_Glyph( glyph );
+    glyph = NULL;
+
+    if ( !destroy )
+      *pglyph = NULL;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,
+                         FT_Stroker   stroker,
+                         FT_Bool      inside,
+                         FT_Bool      destroy )
+  {
+    FT_Error    error   = FT_ERR( Invalid_Argument );
+    FT_Glyph    glyph   = NULL;
+    FT_Library  library = stroker->library;
+
+    FT_UNUSED( library );
+
+
+    if ( pglyph == NULL )
+      goto Exit;
+
+    glyph = *pglyph;
+    if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )
+      goto Exit;
+
+    {
+      FT_Glyph  copy;
+
+
+      error = FT_Glyph_Copy( glyph, &copy );
+      if ( error )
+        goto Exit;
+
+      glyph = copy;
+    }
+
+    {
+      FT_OutlineGlyph   oglyph  = (FT_OutlineGlyph)glyph;
+      FT_StrokerBorder  border;
+      FT_Outline*       outline = &oglyph->outline;
+      FT_UInt           num_points, num_contours;
+
+
+      border = FT_Outline_GetOutsideBorder( outline );
+      if ( inside )
+      {
+        if ( border == FT_STROKER_BORDER_LEFT )
+          border = FT_STROKER_BORDER_RIGHT;
+        else
+          border = FT_STROKER_BORDER_LEFT;
+      }
+
+      error = FT_Stroker_ParseOutline( stroker, outline, FALSE );
+      if ( error )
+        goto Fail;
+
+      (void)FT_Stroker_GetBorderCounts( stroker, border,
+                                        &num_points, &num_contours );
+
+      FT_Outline_Done( glyph->library, outline );
+
+      error = FT_Outline_New( glyph->library,
+                              num_points,
+                              num_contours,
+                              outline );
+      if ( error )
+        goto Fail;
+
+      outline->n_points   = 0;
+      outline->n_contours = 0;
+
+      FT_Stroker_ExportBorder( stroker, border, outline );
+    }
+
+    if ( destroy )
+      FT_Done_Glyph( *pglyph );
+
+    *pglyph = glyph;
+    goto Exit;
+
+  Fail:
+    FT_Done_Glyph( glyph );
+    glyph = NULL;
+
+    if ( !destroy )
+      *pglyph = NULL;
+
+  Exit:
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsynth.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsynth.c
new file mode 100644
index 0000000..2142261
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsynth.c
@@ -0,0 +1,153 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsynth.c                                                              */
+/*                                                                         */
+/*    FreeType synthesizing code for emboldening and slanting (body).      */
+/*                                                                         */
+/*  Copyright 2000-2006, 2010, 2012 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftsynth.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftbitmap.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_synth
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****   EXPERIMENTAL OBLIQUING SUPPORT                                ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* documentation is in ftsynth.h */
+
+  FT_EXPORT_DEF( void )
+  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot )
+  {
+    FT_Matrix    transform;
+    FT_Outline*  outline = &slot->outline;
+
+
+    /* only oblique outline glyphs */
+    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )
+      return;
+
+    /* we don't touch the advance width */
+
+    /* For italic, simply apply a shear transform, with an angle */
+    /* of about 12 degrees.                                      */
+
+    transform.xx = 0x10000L;
+    transform.yx = 0x00000L;
+
+    transform.xy = 0x0366AL;
+    transform.yy = 0x10000L;
+
+    FT_Outline_Transform( outline, &transform );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****   EXPERIMENTAL EMBOLDENING SUPPORT                              ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* documentation is in ftsynth.h */
+
+  FT_EXPORT_DEF( void )
+  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot )
+  {
+    FT_Library  library = slot->library;
+    FT_Face     face    = slot->face;
+    FT_Error    error;
+    FT_Pos      xstr, ystr;
+
+
+    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE &&
+         slot->format != FT_GLYPH_FORMAT_BITMAP  )
+      return;
+
+    /* some reasonable strength */
+    xstr = FT_MulFix( face->units_per_EM,
+                      face->size->metrics.y_scale ) / 24;
+    ystr = xstr;
+
+    if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+    {
+      /* ignore error */
+      (void)FT_Outline_EmboldenXY( &slot->outline, xstr, ystr );
+    }
+    else /* slot->format == FT_GLYPH_FORMAT_BITMAP */
+    {
+      /* round to full pixels */
+      xstr &= ~63;
+      if ( xstr == 0 )
+        xstr = 1 << 6;
+      ystr &= ~63;
+
+      /*
+       * XXX: overflow check for 16-bit system, for compatibility
+       *      with FT_GlyphSlot_Embolden() since freetype-2.1.10.
+       *      unfortunately, this function return no informations
+       *      about the cause of error.
+       */
+      if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN )
+      {
+        FT_TRACE1(( "FT_GlyphSlot_Embolden:" ));
+        FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr ));
+        return;
+      }
+      error = FT_GlyphSlot_Own_Bitmap( slot );
+      if ( error )
+        return;
+
+      error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr );
+      if ( error )
+        return;
+    }
+
+    if ( slot->advance.x )
+      slot->advance.x += xstr;
+
+    if ( slot->advance.y )
+      slot->advance.y += ystr;
+
+    slot->metrics.width       += xstr;
+    slot->metrics.height      += ystr;
+    slot->metrics.horiAdvance += xstr;
+    slot->metrics.vertAdvance += ystr;
+
+    /* XXX: 16-bit overflow case must be excluded before here */
+    if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
+      slot->bitmap_top += (FT_Int)( ystr >> 6 );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c
new file mode 100644
index 0000000..aae71f7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c
@@ -0,0 +1,492 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttrigon.c                                                             */
+/*                                                                         */
+/*    FreeType trigonometric functions (body).                             */
+/*                                                                         */
+/*  Copyright 2001-2005, 2012-2013 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This is a fixed-point CORDIC implementation of trigonometric          */
+  /* functions as well as transformations between Cartesian and polar      */
+  /* coordinates.  The angles are represented as 16.16 fixed-point values  */
+  /* in degrees, i.e., the angular resolution is 2^-16 degrees.  Note that */
+  /* only vectors longer than 2^16*180/pi (or at least 22 bits) on a       */
+  /* discrete Cartesian grid can have the same or better angular           */
+  /* resolution.  Therefore, to maintain this precision, some functions    */
+  /* require an interim upscaling of the vectors, whereas others operate   */
+  /* with 24-bit long vectors directly.                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/fttrigon.h"
+
+
+  /* the Cordic shrink factor 0.858785336480436 * 2^32 */
+#define FT_TRIG_SCALE      0xDBD95B16UL
+
+  /* the highest bit in overflow-safe vector components, */
+  /* MSB of 0.858785336480436 * sqrt(0.5) * 2^30         */
+#define FT_TRIG_SAFE_MSB   29
+
+  /* this table was generated for FT_PI = 180L << 16, i.e. degrees */
+#define FT_TRIG_MAX_ITERS  23
+
+  static const FT_Fixed
+  ft_trig_arctan_table[] =
+  {
+    1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L,
+    14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L,
+    57L, 29L, 14L, 7L, 4L, 2L, 1L
+  };
+
+
+#ifdef FT_LONG64
+
+  /* multiply a given value by the CORDIC shrink factor */
+  static FT_Fixed
+  ft_trig_downscale( FT_Fixed  val )
+  {
+    FT_Fixed  s;
+    FT_Int64  v;
+
+
+    s   = val;
+    val = FT_ABS( val );
+
+    v   = ( val * (FT_Int64)FT_TRIG_SCALE ) + 0x100000000UL;
+    val = (FT_Fixed)( v >> 32 );
+
+    return ( s >= 0 ) ? val : -val;
+  }
+
+#else /* !FT_LONG64 */
+
+  /* multiply a given value by the CORDIC shrink factor */
+  static FT_Fixed
+  ft_trig_downscale( FT_Fixed  val )
+  {
+    FT_Fixed   s;
+    FT_UInt32  v1, v2, k1, k2, hi, lo1, lo2, lo3;
+
+
+    s   = val;
+    val = FT_ABS( val );
+
+    v1 = (FT_UInt32)val >> 16;
+    v2 = (FT_UInt32)( val & 0xFFFFL );
+
+    k1 = (FT_UInt32)FT_TRIG_SCALE >> 16;           /* constant */
+    k2 = (FT_UInt32)( FT_TRIG_SCALE & 0xFFFFL );   /* constant */
+
+    hi   = k1 * v1;
+    lo1  = k1 * v2 + k2 * v1;       /* can't overflow */
+
+    lo2  = ( k2 * v2 ) >> 16;
+    lo3  = FT_MAX( lo1, lo2 );
+    lo1 += lo2;
+
+    hi  += lo1 >> 16;
+    if ( lo1 < lo3 )
+      hi += (FT_UInt32)0x10000UL;
+
+    val  = (FT_Fixed)hi;
+
+    return ( s >= 0 ) ? val : -val;
+  }
+
+#endif /* !FT_LONG64 */
+
+
+  static FT_Int
+  ft_trig_prenorm( FT_Vector*  vec )
+  {
+    FT_Pos  x, y;
+    FT_Int  shift;
+
+
+    x = vec->x;
+    y = vec->y;
+
+    shift = FT_MSB( FT_ABS( x ) | FT_ABS( y ) );
+
+    if ( shift <= FT_TRIG_SAFE_MSB )
+    {
+      shift  = FT_TRIG_SAFE_MSB - shift;
+      vec->x = (FT_Pos)( (FT_ULong)x << shift );
+      vec->y = (FT_Pos)( (FT_ULong)y << shift );
+    }
+    else
+    {
+      shift -= FT_TRIG_SAFE_MSB;
+      vec->x = x >> shift;
+      vec->y = y >> shift;
+      shift  = -shift;
+    }
+
+    return shift;
+  }
+
+
+  static void
+  ft_trig_pseudo_rotate( FT_Vector*  vec,
+                         FT_Angle    theta )
+  {
+    FT_Int           i;
+    FT_Fixed         x, y, xtemp, b;
+    const FT_Fixed  *arctanptr;
+
+
+    x = vec->x;
+    y = vec->y;
+
+    /* Rotate inside [-PI/4,PI/4] sector */
+    while ( theta < -FT_ANGLE_PI4 )
+    {
+      xtemp  =  y;
+      y      = -x;
+      x      =  xtemp;
+      theta +=  FT_ANGLE_PI2;
+    }
+
+    while ( theta > FT_ANGLE_PI4 )
+    {
+      xtemp  = -y;
+      y      =  x;
+      x      =  xtemp;
+      theta -=  FT_ANGLE_PI2;
+    }
+
+    arctanptr = ft_trig_arctan_table;
+
+    /* Pseudorotations, with right shifts */
+    for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )
+    {
+      if ( theta < 0 )
+      {
+        xtemp  = x + ( ( y + b ) >> i );
+        y      = y - ( ( x + b ) >> i );
+        x      = xtemp;
+        theta += *arctanptr++;
+      }
+      else
+      {
+        xtemp  = x - ( ( y + b ) >> i );
+        y      = y + ( ( x + b ) >> i );
+        x      = xtemp;
+        theta -= *arctanptr++;
+      }
+    }
+
+    vec->x = x;
+    vec->y = y;
+  }
+
+
+  static void
+  ft_trig_pseudo_polarize( FT_Vector*  vec )
+  {
+    FT_Angle         theta;
+    FT_Int           i;
+    FT_Fixed         x, y, xtemp, b;
+    const FT_Fixed  *arctanptr;
+
+
+    x = vec->x;
+    y = vec->y;
+
+    /* Get the vector into [-PI/4,PI/4] sector */
+    if ( y > x )
+    {
+      if ( y > -x )
+      {
+        theta =  FT_ANGLE_PI2;
+        xtemp =  y;
+        y     = -x;
+        x     =  xtemp;
+      }
+      else
+      {
+        theta =  y > 0 ? FT_ANGLE_PI : -FT_ANGLE_PI;
+        x     = -x;
+        y     = -y;
+      }
+    }
+    else
+    {
+      if ( y < -x )
+      {
+        theta = -FT_ANGLE_PI2;
+        xtemp = -y;
+        y     =  x;
+        x     =  xtemp;
+      }
+      else
+      {
+        theta = 0;
+      }
+    }
+
+    arctanptr = ft_trig_arctan_table;
+
+    /* Pseudorotations, with right shifts */
+    for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )
+    {
+      if ( y > 0 )
+      {
+        xtemp  = x + ( ( y + b ) >> i );
+        y      = y - ( ( x + b ) >> i );
+        x      = xtemp;
+        theta += *arctanptr++;
+      }
+      else
+      {
+        xtemp  = x - ( ( y + b ) >> i );
+        y      = y + ( ( x + b ) >> i );
+        x      = xtemp;
+        theta -= *arctanptr++;
+      }
+    }
+
+    /* round theta */
+    if ( theta >= 0 )
+      theta = FT_PAD_ROUND( theta, 32 );
+    else
+      theta = -FT_PAD_ROUND( -theta, 32 );
+
+    vec->x = x;
+    vec->y = theta;
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_Cos( FT_Angle  angle )
+  {
+    FT_Vector  v;
+
+
+    v.x = FT_TRIG_SCALE >> 8;
+    v.y = 0;
+    ft_trig_pseudo_rotate( &v, angle );
+
+    return ( v.x + 0x80L ) >> 8;
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_Sin( FT_Angle  angle )
+  {
+    return FT_Cos( FT_ANGLE_PI2 - angle );
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_Tan( FT_Angle  angle )
+  {
+    FT_Vector  v;
+
+
+    v.x = FT_TRIG_SCALE >> 8;
+    v.y = 0;
+    ft_trig_pseudo_rotate( &v, angle );
+
+    return FT_DivFix( v.y, v.x );
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( FT_Angle )
+  FT_Atan2( FT_Fixed  dx,
+            FT_Fixed  dy )
+  {
+    FT_Vector  v;
+
+
+    if ( dx == 0 && dy == 0 )
+      return 0;
+
+    v.x = dx;
+    v.y = dy;
+    ft_trig_prenorm( &v );
+    ft_trig_pseudo_polarize( &v );
+
+    return v.y;
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Vector_Unit( FT_Vector*  vec,
+                  FT_Angle    angle )
+  {
+    vec->x = FT_TRIG_SCALE >> 8;
+    vec->y = 0;
+    ft_trig_pseudo_rotate( vec, angle );
+    vec->x = ( vec->x + 0x80L ) >> 8;
+    vec->y = ( vec->y + 0x80L ) >> 8;
+  }
+
+
+  /* these macros return 0 for positive numbers,
+     and -1 for negative ones */
+#define FT_SIGN_LONG( x )   ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) )
+#define FT_SIGN_INT( x )    ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) )
+#define FT_SIGN_INT32( x )  ( (x) >> 31 )
+#define FT_SIGN_INT16( x )  ( (x) >> 15 )
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Vector_Rotate( FT_Vector*  vec,
+                    FT_Angle    angle )
+  {
+    FT_Int     shift;
+    FT_Vector  v;
+
+
+    v.x   = vec->x;
+    v.y   = vec->y;
+
+    if ( angle && ( v.x != 0 || v.y != 0 ) )
+    {
+      shift = ft_trig_prenorm( &v );
+      ft_trig_pseudo_rotate( &v, angle );
+      v.x = ft_trig_downscale( v.x );
+      v.y = ft_trig_downscale( v.y );
+
+      if ( shift > 0 )
+      {
+        FT_Int32  half = (FT_Int32)1L << ( shift - 1 );
+
+
+        vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift;
+        vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift;
+      }
+      else
+      {
+        shift  = -shift;
+        vec->x = (FT_Pos)( (FT_ULong)v.x << shift );
+        vec->y = (FT_Pos)( (FT_ULong)v.y << shift );
+      }
+    }
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_Vector_Length( FT_Vector*  vec )
+  {
+    FT_Int     shift;
+    FT_Vector  v;
+
+
+    v = *vec;
+
+    /* handle trivial cases */
+    if ( v.x == 0 )
+    {
+      return FT_ABS( v.y );
+    }
+    else if ( v.y == 0 )
+    {
+      return FT_ABS( v.x );
+    }
+
+    /* general case */
+    shift = ft_trig_prenorm( &v );
+    ft_trig_pseudo_polarize( &v );
+
+    v.x = ft_trig_downscale( v.x );
+
+    if ( shift > 0 )
+      return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift;
+
+    return (FT_Fixed)( (FT_UInt32)v.x << -shift );
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Vector_Polarize( FT_Vector*  vec,
+                      FT_Fixed   *length,
+                      FT_Angle   *angle )
+  {
+    FT_Int     shift;
+    FT_Vector  v;
+
+
+    v = *vec;
+
+    if ( v.x == 0 && v.y == 0 )
+      return;
+
+    shift = ft_trig_prenorm( &v );
+    ft_trig_pseudo_polarize( &v );
+
+    v.x = ft_trig_downscale( v.x );
+
+    *length = ( shift >= 0 ) ?                      ( v.x >>  shift )
+                             : (FT_Fixed)( (FT_UInt32)v.x << -shift );
+    *angle  = v.y;
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Vector_From_Polar( FT_Vector*  vec,
+                        FT_Fixed    length,
+                        FT_Angle    angle )
+  {
+    vec->x = length;
+    vec->y = 0;
+
+    FT_Vector_Rotate( vec, angle );
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( FT_Angle )
+  FT_Angle_Diff( FT_Angle  angle1,
+                 FT_Angle  angle2 )
+  {
+    FT_Angle  delta = angle2 - angle1;
+
+
+    delta %= FT_ANGLE_2PI;
+    if ( delta < 0 )
+      delta += FT_ANGLE_2PI;
+
+    if ( delta > FT_ANGLE_PI )
+      delta -= FT_ANGLE_2PI;
+
+    return delta;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttype1.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttype1.c
new file mode 100644
index 0000000..b7167b7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttype1.c
@@ -0,0 +1,120 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttype1.c                                                              */
+/*                                                                         */
+/*    FreeType utility file for PS names support (body).                   */
+/*                                                                         */
+/*  Copyright 2002-2004, 2011 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftserv.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+
+
+  /* documentation is in t1tables.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_PS_Font_Info( FT_Face          face,
+                       PS_FontInfoRec*  afont_info )
+  {
+    FT_Error  error = FT_ERR( Invalid_Argument );
+
+
+    if ( face )
+    {
+      FT_Service_PsInfo  service = NULL;
+
+
+      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+      if ( service && service->ps_get_font_info )
+        error = service->ps_get_font_info( face, afont_info );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in t1tables.h */
+
+  FT_EXPORT_DEF( FT_Int )
+  FT_Has_PS_Glyph_Names( FT_Face  face )
+  {
+    FT_Int             result  = 0;
+    FT_Service_PsInfo  service = NULL;
+
+
+    if ( face )
+    {
+      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+      if ( service && service->ps_has_glyph_names )
+        result = service->ps_has_glyph_names( face );
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in t1tables.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_PS_Font_Private( FT_Face         face,
+                          PS_PrivateRec*  afont_private )
+  {
+    FT_Error  error = FT_ERR( Invalid_Argument );
+
+
+    if ( face )
+    {
+      FT_Service_PsInfo  service = NULL;
+
+
+      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+      if ( service && service->ps_get_font_private )
+        error = service->ps_get_font_private( face, afont_private );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in t1tables.h */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_Get_PS_Font_Value( FT_Face       face,
+                        PS_Dict_Keys  key,
+                        FT_UInt       idx,
+                        void         *value,
+                        FT_Long       value_len )
+  {
+    FT_Int             result  = 0;
+    FT_Service_PsInfo  service = NULL;
+
+
+    if ( face )
+    {
+      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+      if ( service && service->ps_get_font_value )
+        result = service->ps_get_font_value( face, key, idx,
+                                             value, value_len );
+    }
+
+    return result;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftutil.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftutil.c
new file mode 100644
index 0000000..4c0b916
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftutil.c
@@ -0,0 +1,548 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftutil.c                                                               */
+/*                                                                         */
+/*    FreeType utility file for memory and list management (body).         */
+/*                                                                         */
+/*  Copyright 2002, 2004-2007, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftmemory.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/ftlist.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_memory
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                                                               *****/
+  /*****               M E M O R Y   M A N A G E M E N T               *****/
+  /*****                                                               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_alloc( FT_Memory  memory,
+                FT_Long    size,
+                FT_Error  *p_error )
+  {
+    FT_Error    error;
+    FT_Pointer  block = ft_mem_qalloc( memory, size, &error );
+
+    if ( !error && size > 0 )
+      FT_MEM_ZERO( block, size );
+
+    *p_error = error;
+    return block;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_qalloc( FT_Memory  memory,
+                 FT_Long    size,
+                 FT_Error  *p_error )
+  {
+    FT_Error    error = FT_Err_Ok;
+    FT_Pointer  block = NULL;
+
+
+    if ( size > 0 )
+    {
+      block = memory->alloc( memory, size );
+      if ( block == NULL )
+        error = FT_THROW( Out_Of_Memory );
+    }
+    else if ( size < 0 )
+    {
+      /* may help catch/prevent security issues */
+      error = FT_THROW( Invalid_Argument );
+    }
+
+    *p_error = error;
+    return block;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_realloc( FT_Memory  memory,
+                  FT_Long    item_size,
+                  FT_Long    cur_count,
+                  FT_Long    new_count,
+                  void*      block,
+                  FT_Error  *p_error )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    block = ft_mem_qrealloc( memory, item_size,
+                             cur_count, new_count, block, &error );
+    if ( !error && new_count > cur_count )
+      FT_MEM_ZERO( (char*)block + cur_count * item_size,
+                   ( new_count - cur_count ) * item_size );
+
+    *p_error = error;
+    return block;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_qrealloc( FT_Memory  memory,
+                   FT_Long    item_size,
+                   FT_Long    cur_count,
+                   FT_Long    new_count,
+                   void*      block,
+                   FT_Error  *p_error )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    /* Note that we now accept `item_size == 0' as a valid parameter, in
+     * order to cover very weird cases where an ALLOC_MULT macro would be
+     * called.
+     */
+    if ( cur_count < 0 || new_count < 0 || item_size < 0 )
+    {
+      /* may help catch/prevent nasty security issues */
+      error = FT_THROW( Invalid_Argument );
+    }
+    else if ( new_count == 0 || item_size == 0 )
+    {
+      ft_mem_free( memory, block );
+      block = NULL;
+    }
+    else if ( new_count > FT_INT_MAX/item_size )
+    {
+      error = FT_THROW( Array_Too_Large );
+    }
+    else if ( cur_count == 0 )
+    {
+      FT_ASSERT( block == NULL );
+
+      block = ft_mem_alloc( memory, new_count*item_size, &error );
+    }
+    else
+    {
+      FT_Pointer  block2;
+      FT_Long     cur_size = cur_count*item_size;
+      FT_Long     new_size = new_count*item_size;
+
+
+      block2 = memory->realloc( memory, cur_size, new_size, block );
+      if ( block2 == NULL )
+        error = FT_THROW( Out_Of_Memory );
+      else
+        block = block2;
+    }
+
+    *p_error = error;
+    return block;
+  }
+
+  #ifdef _XYQ_MEM_DEBUG	/** XYQ 2006-10-12 */
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_allocdebug( FT_Memory  memory,
+                FT_Long    size, const char* file, int line,
+                FT_Error  *p_error )
+  {
+    FT_Error    error;
+    FT_Pointer  block = ft_mem_qallocdebug( memory, size, file, line, &error );
+
+    if ( !error && size > 0 )
+      FT_MEM_ZERO( block, size );
+
+    *p_error = error;
+    return block;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_qallocdebug( FT_Memory  memory,
+                 FT_Long    size, const char* file, int line,
+                 FT_Error  *p_error )
+  {
+    FT_Error    error = FT_Err_Ok;
+    FT_Pointer  block = NULL;
+
+
+    if ( size > 0 )
+    {
+      block = memory->allocdebug( memory, size, file, line );
+      if ( block == NULL )
+        error = FT_Err_Out_Of_Memory;
+    }
+    else if ( size < 0 )
+    {
+      /* may help catch/prevent security issues */
+      error = FT_Err_Invalid_Argument;
+    }
+
+    *p_error = error;
+    return block;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_reallocdebug( FT_Memory  memory,
+                  FT_Long    item_size,
+                  FT_Long    cur_count,
+                  FT_Long    new_count,
+                  void*      block, const char* file, int line,
+                  FT_Error  *p_error )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+    block = ft_mem_qreallocdebug( memory, item_size,
+                             cur_count, new_count, block, file, line, &error );
+    if ( !error && new_count > cur_count )
+      FT_MEM_ZERO( (char*)block + cur_count * item_size,
+                   ( new_count - cur_count ) * item_size );
+
+    *p_error = error;
+    return block;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_qreallocdebug( FT_Memory  memory,
+                   FT_Long    item_size,
+                   FT_Long    cur_count,
+                   FT_Long    new_count,
+                   void*      block, const char* file, int line,
+                   FT_Error  *p_error )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( cur_count < 0 || new_count < 0 || item_size <= 0 )
+    {
+      /* may help catch/prevent nasty security issues */
+      error = FT_Err_Invalid_Argument;
+    }
+    else if ( new_count == 0 )
+    {
+      ft_mem_free( memory, block );
+      block = NULL;
+    }
+    else if ( new_count > FT_INT_MAX/item_size )
+    {
+      error = FT_Err_Array_Too_Large;
+    }
+    else if ( cur_count == 0 )
+    {
+      FT_ASSERT( block == NULL );
+
+      block = ft_mem_allocdebug( memory, new_count*item_size, file, line, &error );
+    }
+    else
+    {
+      FT_Pointer  block2;
+      FT_Long     cur_size = cur_count*item_size;
+      FT_Long     new_size = new_count*item_size;
+
+
+      block2 = memory->realloc( memory, cur_size, new_size, block );
+      if ( block2 == NULL )
+        error = FT_Err_Out_Of_Memory;
+      else
+        block = block2;
+    }
+
+    *p_error = error;
+    return block;
+  }
+#endif
+  FT_BASE_DEF( void )
+  ft_mem_free( FT_Memory   memory,
+               const void *P )
+  {
+    if ( P )
+      memory->free( memory, (void*)P );
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_dup( FT_Memory    memory,
+              const void*  address,
+              FT_ULong     size,
+              FT_Error    *p_error )
+  {
+    FT_Error    error;
+    FT_Pointer  p = ft_mem_qalloc( memory, size, &error );
+
+
+    if ( !error && address )
+      ft_memcpy( p, address, size );
+
+    *p_error = error;
+    return p;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_strdup( FT_Memory    memory,
+                 const char*  str,
+                 FT_Error    *p_error )
+  {
+    FT_ULong  len = str ? (FT_ULong)ft_strlen( str ) + 1
+                        : 0;
+
+
+    return ft_mem_dup( memory, str, len, p_error );
+  }
+
+
+  FT_BASE_DEF( FT_Int )
+  ft_mem_strcpyn( char*        dst,
+                  const char*  src,
+                  FT_ULong     size )
+  {
+    while ( size > 1 && *src != 0 )
+    {
+      *dst++ = *src++;
+      size--;
+    }
+
+    *dst = 0;  /* always zero-terminate */
+
+    return *src != 0;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                                                               *****/
+  /*****            D O U B L Y   L I N K E D   L I S T S              *****/
+  /*****                                                               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_list
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( FT_ListNode )
+  FT_List_Find( FT_List  list,
+                void*    data )
+  {
+    FT_ListNode  cur;
+
+
+    cur = list->head;
+    while ( cur )
+    {
+      if ( cur->data == data )
+        return cur;
+
+      cur = cur->next;
+    }
+
+    return (FT_ListNode)0;
+  }
+
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( void )
+  FT_List_Add( FT_List      list,
+               FT_ListNode  node )
+  {
+    FT_ListNode  before = list->tail;
+
+
+    node->next = 0;
+    node->prev = before;
+
+    if ( before )
+      before->next = node;
+    else
+      list->head = node;
+
+    list->tail = node;
+  }
+
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( void )
+  FT_List_Insert( FT_List      list,
+                  FT_ListNode  node )
+  {
+    FT_ListNode  after = list->head;
+
+
+    node->next = after;
+    node->prev = 0;
+
+    if ( !after )
+      list->tail = node;
+    else
+      after->prev = node;
+
+    list->head = node;
+  }
+
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( void )
+  FT_List_Remove( FT_List      list,
+                  FT_ListNode  node )
+  {
+    FT_ListNode  before, after;
+
+
+    before = node->prev;
+    after  = node->next;
+
+    if ( before )
+      before->next = after;
+    else
+      list->head = after;
+
+    if ( after )
+      after->prev = before;
+    else
+      list->tail = before;
+  }
+
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( void )
+  FT_List_Up( FT_List      list,
+              FT_ListNode  node )
+  {
+    FT_ListNode  before, after;
+
+
+    before = node->prev;
+    after  = node->next;
+
+    /* check whether we are already on top of the list */
+    if ( !before )
+      return;
+
+    before->next = after;
+
+    if ( after )
+      after->prev = before;
+    else
+      list->tail = before;
+
+    node->prev       = 0;
+    node->next       = list->head;
+    list->head->prev = node;
+    list->head       = node;
+  }
+
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_List_Iterate( FT_List            list,
+                   FT_List_Iterator   iterator,
+                   void*              user )
+  {
+    FT_ListNode  cur   = list->head;
+    FT_Error     error = FT_Err_Ok;
+
+
+    while ( cur )
+    {
+      FT_ListNode  next = cur->next;
+
+
+      error = iterator( cur, user );
+      if ( error )
+        break;
+
+      cur = next;
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( void )
+  FT_List_Finalize( FT_List             list,
+                    FT_List_Destructor  destroy,
+                    FT_Memory           memory,
+                    void*               user )
+  {
+    FT_ListNode  cur;
+
+
+    cur = list->head;
+    while ( cur )
+    {
+      FT_ListNode  next = cur->next;
+      void*        data = cur->data;
+
+
+      if ( destroy )
+        destroy( memory, data, user );
+
+      FT_FREE( cur );
+      cur = next;
+    }
+
+    list->head = 0;
+    list->tail = 0;
+  }
+
+
+  FT_BASE_DEF( FT_UInt32 )
+  ft_highpow2( FT_UInt32  value )
+  {
+    FT_UInt32  value2;
+
+
+    /*
+     *  We simply clear the lowest bit in each iteration.  When
+     *  we reach 0, we know that the previous value was our result.
+     */
+    for ( ;; )
+    {
+      value2 = value & (value - 1);  /* clear lowest bit */
+      if ( value2 == 0 )
+        break;
+
+      value = value2;
+    }
+    return value;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftwinfnt.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftwinfnt.c
new file mode 100644
index 0000000..d5b81ba
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftwinfnt.c
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftwinfnt.c                                                             */
+/*                                                                         */
+/*    FreeType API for accessing Windows FNT specific info (body).         */
+/*                                                                         */
+/*  Copyright 2003, 2004 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftwinfnt.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svwinfnt.h"
+
+
+  /* documentation is in ftwinfnt.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_WinFNT_Header( FT_Face               face,
+                        FT_WinFNT_HeaderRec  *header )
+  {
+    FT_Service_WinFnt  service;
+    FT_Error           error;
+
+
+    error = FT_ERR( Invalid_Argument );
+
+    if ( face != NULL )
+    {
+      FT_FACE_LOOKUP_SERVICE( face, service, WINFNT );
+
+      if ( service != NULL )
+      {
+        error = service->get_header( face, header );
+      }
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftxf86.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftxf86.c
new file mode 100644
index 0000000..229f29b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftxf86.c
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftxf86.c                                                               */
+/*                                                                         */
+/*    FreeType utility file for X11 support (body).                        */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftxf86.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svxf86nm.h"
+
+
+  /* documentation is in ftxf86.h */
+
+  FT_EXPORT_DEF( const char* )
+  FT_Get_X11_Font_Format( FT_Face  face )
+  {
+    const char*  result = NULL;
+
+
+    if ( face )
+      FT_FACE_FIND_SERVICE( face, result, XF86_NAME );
+
+    return result;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbase.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbase.c
new file mode 100644
index 0000000..239223a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbase.c
@@ -0,0 +1,44 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  ftbase.c                                                               */
+/*                                                                         */
+/*    Single object library component (body only).                         */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by       */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+
+#define  FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include "ftpic.c"
+#include "basepic.c"
+#include "ftadvanc.c"
+#include "ftcalc.c"
+#include "ftdbgmem.c"
+#include "ftgloadr.c"
+#include "ftobjs.c"
+#include "ftoutln.c"
+#include "ftrfork.c"
+#include "ftsnames.c"
+#include "ftstream.c"
+#include "fttrigon.c"
+#include "ftutil.c"
+#include "ftxf86.c"
+
+#if defined( FT_MACINTOSH ) && !defined ( DARWIN_NO_CARBON )
+/*#include "ftmac.c"*/
+#endif
+
+/* END */
+#endif
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbitmap.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbitmap.c
new file mode 100644
index 0000000..7f1ef18
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbitmap.c
@@ -0,0 +1,760 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  ftbitmap.c                                                             */
+/*                                                                         */
+/*    FreeType utility functions for bitmaps (body).                       */
+/*                                                                         */
+/*  Copyright 2004-2009, 2011, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftbitmap.h"
+#include "../../include/freetype/ftimage.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+  static
+  const FT_Bitmap  null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 };
+
+
+  /* documentation is in ftbitmap.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Bitmap_New( FT_Bitmap  *abitmap )
+  {
+    *abitmap = null_bitmap;
+  }
+
+
+  /* documentation is in ftbitmap.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Bitmap_Copy( FT_Library        library,
+                  const FT_Bitmap  *source,
+                  FT_Bitmap        *target)
+  {
+    FT_Memory  memory = library->memory;
+    FT_Error   error  = FT_Err_Ok;
+    FT_Int     pitch  = source->pitch;
+    FT_ULong   size;
+
+
+    if ( source == target )
+      return FT_Err_Ok;
+
+    if ( source->buffer == NULL )
+    {
+      *target = *source;
+
+      return FT_Err_Ok;
+    }
+
+    if ( pitch < 0 )
+      pitch = -pitch;
+    size = (FT_ULong)( pitch * source->rows );
+
+    if ( target->buffer )
+    {
+      FT_Int    target_pitch = target->pitch;
+      FT_ULong  target_size;
+
+
+      if ( target_pitch < 0  )
+        target_pitch = -target_pitch;
+      target_size = (FT_ULong)( target_pitch * target->rows );
+
+      if ( target_size != size )
+        (void)FT_QREALLOC( target->buffer, target_size, size );
+    }
+    else
+      (void)FT_QALLOC( target->buffer, size );
+
+    if ( !error )
+    {
+      unsigned char *p;
+
+
+      p = target->buffer;
+      *target = *source;
+      target->buffer = p;
+
+      FT_MEM_COPY( target->buffer, source->buffer, size );
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  ft_bitmap_assure_buffer( FT_Memory   memory,
+                           FT_Bitmap*  bitmap,
+                           FT_UInt     xpixels,
+                           FT_UInt     ypixels )
+  {
+    FT_Error        error;
+    int             pitch;
+    int             new_pitch;
+    FT_UInt         bpp;
+    FT_Int          i, width, height;
+    unsigned char*  buffer = NULL;
+
+
+    width  = bitmap->width;
+    height = bitmap->rows;
+    pitch  = bitmap->pitch;
+    if ( pitch < 0 )
+      pitch = -pitch;
+
+    switch ( bitmap->pixel_mode )
+    {
+    case FT_PIXEL_MODE_MONO:
+      bpp       = 1;
+      new_pitch = ( width + xpixels + 7 ) >> 3;
+      break;
+    case FT_PIXEL_MODE_GRAY2:
+      bpp       = 2;
+      new_pitch = ( width + xpixels + 3 ) >> 2;
+      break;
+    case FT_PIXEL_MODE_GRAY4:
+      bpp       = 4;
+      new_pitch = ( width + xpixels + 1 ) >> 1;
+      break;
+    case FT_PIXEL_MODE_GRAY:
+    case FT_PIXEL_MODE_LCD:
+    case FT_PIXEL_MODE_LCD_V:
+      bpp       = 8;
+      new_pitch = ( width + xpixels );
+      break;
+    default:
+      return FT_THROW( Invalid_Glyph_Format );
+    }
+
+    /* if no need to allocate memory */
+    if ( ypixels == 0 && new_pitch <= pitch )
+    {
+      /* zero the padding */
+      FT_Int  bit_width = pitch * 8;
+      FT_Int  bit_last  = ( width + xpixels ) * bpp;
+
+
+      if ( bit_last < bit_width )
+      {
+        FT_Byte*  line  = bitmap->buffer + ( bit_last >> 3 );
+        FT_Byte*  end   = bitmap->buffer + pitch;
+        FT_Int    shift = bit_last & 7;
+        FT_UInt   mask  = 0xFF00U >> shift;
+        FT_Int    count = height;
+
+
+        for ( ; count > 0; count--, line += pitch, end += pitch )
+        {
+          FT_Byte*  write = line;
+
+
+          if ( shift > 0 )
+          {
+            write[0] = (FT_Byte)( write[0] & mask );
+            write++;
+          }
+          if ( write < end )
+            FT_MEM_ZERO( write, end-write );
+        }
+      }
+
+      return FT_Err_Ok;
+    }
+
+    if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) )
+      return error;
+
+    if ( bitmap->pitch > 0 )
+    {
+      FT_Int  len = ( width * bpp + 7 ) >> 3;
+
+
+      for ( i = 0; i < bitmap->rows; i++ )
+        FT_MEM_COPY( buffer + new_pitch * ( ypixels + i ),
+                     bitmap->buffer + pitch * i, len );
+    }
+    else
+    {
+      FT_Int  len = ( width * bpp + 7 ) >> 3;
+
+
+      for ( i = 0; i < bitmap->rows; i++ )
+        FT_MEM_COPY( buffer + new_pitch * i,
+                     bitmap->buffer + pitch * i, len );
+    }
+
+    FT_FREE( bitmap->buffer );
+    bitmap->buffer = buffer;
+
+    if ( bitmap->pitch < 0 )
+      new_pitch = -new_pitch;
+
+    /* set pitch only, width and height are left untouched */
+    bitmap->pitch = new_pitch;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftbitmap.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Bitmap_Embolden( FT_Library  library,
+                      FT_Bitmap*  bitmap,
+                      FT_Pos      xStrength,
+                      FT_Pos      yStrength )
+  {
+    FT_Error        error;
+    unsigned char*  p;
+    FT_Int          i, x, y, pitch;
+    FT_Int          xstr, ystr;
+
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    if ( !bitmap || !bitmap->buffer )
+      return FT_THROW( Invalid_Argument );
+
+    if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) ||
+         ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) )
+      return FT_THROW( Invalid_Argument );
+
+    xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6;
+    ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6;
+
+    if ( xstr == 0 && ystr == 0 )
+      return FT_Err_Ok;
+    else if ( xstr < 0 || ystr < 0 )
+      return FT_THROW( Invalid_Argument );
+
+    switch ( bitmap->pixel_mode )
+    {
+    case FT_PIXEL_MODE_GRAY2:
+    case FT_PIXEL_MODE_GRAY4:
+      {
+        FT_Bitmap  tmp;
+        FT_Int     align;
+
+
+        if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY2 )
+          align = ( bitmap->width + xstr + 3 ) / 4;
+        else
+          align = ( bitmap->width + xstr + 1 ) / 2;
+
+        FT_Bitmap_New( &tmp );
+
+        error = FT_Bitmap_Convert( library, bitmap, &tmp, align );
+        if ( error )
+          return error;
+
+        FT_Bitmap_Done( library, bitmap );
+        *bitmap = tmp;
+      }
+      break;
+
+    case FT_PIXEL_MODE_MONO:
+      if ( xstr > 8 )
+        xstr = 8;
+      break;
+
+    case FT_PIXEL_MODE_LCD:
+      xstr *= 3;
+      break;
+
+    case FT_PIXEL_MODE_LCD_V:
+      ystr *= 3;
+      break;
+
+    case FT_PIXEL_MODE_BGRA:
+      /* We don't embolden color glyphs. */
+      return FT_Err_Ok;
+    }
+
+    error = ft_bitmap_assure_buffer( library->memory, bitmap, xstr, ystr );
+    if ( error )
+      return error;
+
+    pitch = bitmap->pitch;
+    if ( pitch > 0 )
+      p = bitmap->buffer + pitch * ystr;
+    else
+    {
+      pitch = -pitch;
+      p = bitmap->buffer + pitch * ( bitmap->rows - 1 );
+    }
+
+    /* for each row */
+    for ( y = 0; y < bitmap->rows ; y++ )
+    {
+      /*
+       * Horizontally:
+       *
+       * From the last pixel on, make each pixel or'ed with the
+       * `xstr' pixels before it.
+       */
+      for ( x = pitch - 1; x >= 0; x-- )
+      {
+        unsigned char tmp;
+
+
+        tmp = p[x];
+        for ( i = 1; i <= xstr; i++ )
+        {
+          if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO )
+          {
+            p[x] |= tmp >> i;
+
+            /* the maximum value of 8 for `xstr' comes from here */
+            if ( x > 0 )
+              p[x] |= p[x - 1] << ( 8 - i );
+
+#if 0
+            if ( p[x] == 0xff )
+              break;
+#endif
+          }
+          else
+          {
+            if ( x - i >= 0 )
+            {
+              if ( p[x] + p[x - i] > bitmap->num_grays - 1 )
+              {
+                p[x] = (unsigned char)(bitmap->num_grays - 1);
+                break;
+              }
+              else
+              {
+                p[x] = (unsigned char)(p[x] + p[x-i]);
+                if ( p[x] == bitmap->num_grays - 1 )
+                  break;
+              }
+            }
+            else
+              break;
+          }
+        }
+      }
+
+      /*
+       * Vertically:
+       *
+       * Make the above `ystr' rows or'ed with it.
+       */
+      for ( x = 1; x <= ystr; x++ )
+      {
+        unsigned char*  q;
+
+
+        q = p - bitmap->pitch * x;
+        for ( i = 0; i < pitch; i++ )
+          q[i] |= p[i];
+      }
+
+      p += bitmap->pitch;
+    }
+
+    bitmap->width += xstr;
+    bitmap->rows += ystr;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_Byte
+  ft_gray_for_premultiplied_srgb_bgra( const FT_Byte*  bgra )
+  {
+    FT_Long  a = bgra[3];
+    FT_Long  b = bgra[0];
+    FT_Long  g = bgra[1];
+    FT_Long  r = bgra[2];
+    FT_Long  l;
+
+
+    /*
+     * Luminosity for sRGB is defined using ~0.2126,0.7152,0.0722
+     * coefficients for RGB channels *on the linear colors*.
+     * A gamma of 2.2 is fair to assume.  And then, we need to
+     * undo the premultiplication too.
+     *
+     * http://accessibility.kde.org/hsl-adjusted.php
+     *
+     * We do the computation with integers only.
+     */
+
+    /* Undo premultification, get the number in a 16.16 form. */
+    b = FT_MulDiv( b, 65536, a );
+    g = FT_MulDiv( g, 65536, a );
+    r = FT_MulDiv( r, 65536, a );
+    a = a * 256;
+
+    /* Apply gamma of 2.0 instead of 2.2. */
+    b = FT_MulFix( b, b );
+    g = FT_MulFix( g, g );
+    r = FT_MulFix( r, r );
+
+    /* Apply coefficients. */
+    b = FT_MulFix( b,  4731 /* 0.0722 * 65536 */ );
+    g = FT_MulFix( g, 46871 /* 0.7152 * 65536 */ );
+    r = FT_MulFix( r, 13933 /* 0.2126 * 65536 */ );
+
+    l = r + g + b;
+
+    /*
+     * Final transparency can be determined this way:
+     *
+     * - If alpha is zero, we want 0.
+     * - If alpha is zero and luminosity is zero, we want 255.
+     * - If alpha is zero and luminosity is one, we want 0.
+     *
+     * So the formula is a * (1 - l).
+     */
+
+    return (FT_Byte)( FT_MulFix( 65535 - l, a ) >> 8 );
+  }
+
+
+  /* documentation is in ftbitmap.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Bitmap_Convert( FT_Library        library,
+                     const FT_Bitmap  *source,
+                     FT_Bitmap        *target,
+                     FT_Int            alignment )
+  {
+    FT_Error   error = FT_Err_Ok;
+    FT_Memory  memory;
+
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    memory = library->memory;
+
+    switch ( source->pixel_mode )
+    {
+    case FT_PIXEL_MODE_MONO:
+    case FT_PIXEL_MODE_GRAY:
+    case FT_PIXEL_MODE_GRAY2:
+    case FT_PIXEL_MODE_GRAY4:
+    case FT_PIXEL_MODE_LCD:
+    case FT_PIXEL_MODE_LCD_V:
+    case FT_PIXEL_MODE_BGRA:
+      {
+        FT_Int   pad;
+        FT_Long  old_size;
+
+
+        old_size = target->rows * target->pitch;
+        if ( old_size < 0 )
+          old_size = -old_size;
+
+        target->pixel_mode = FT_PIXEL_MODE_GRAY;
+        target->rows       = source->rows;
+        target->width      = source->width;
+
+        pad = 0;
+        if ( alignment > 0 )
+        {
+          pad = source->width % alignment;
+          if ( pad != 0 )
+            pad = alignment - pad;
+        }
+
+        target->pitch = source->width + pad;
+
+        if ( target->pitch > 0                                     &&
+             (FT_ULong)target->rows > FT_ULONG_MAX / target->pitch )
+          return FT_THROW( Invalid_Argument );
+
+        if ( target->rows * target->pitch > old_size             &&
+             FT_QREALLOC( target->buffer,
+                          old_size, target->rows * target->pitch ) )
+          return error;
+      }
+      break;
+
+    default:
+      error = FT_THROW( Invalid_Argument );
+    }
+
+    switch ( source->pixel_mode )
+    {
+    case FT_PIXEL_MODE_MONO:
+      {
+        FT_Byte*  s = source->buffer;
+        FT_Byte*  t = target->buffer;
+        FT_Int    i;
+
+
+        target->num_grays = 2;
+
+        for ( i = source->rows; i > 0; i-- )
+        {
+          FT_Byte*  ss = s;
+          FT_Byte*  tt = t;
+          FT_Int    j;
+
+
+          /* get the full bytes */
+          for ( j = source->width >> 3; j > 0; j-- )
+          {
+            FT_Int  val = ss[0]; /* avoid a byte->int cast on each line */
+
+
+            tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 );
+            tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 );
+            tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 );
+            tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 );
+            tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 );
+            tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 );
+            tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 );
+            tt[7] = (FT_Byte)(   val & 0x01 );
+
+            tt += 8;
+            ss += 1;
+          }
+
+          /* get remaining pixels (if any) */
+          j = source->width & 7;
+          if ( j > 0 )
+          {
+            FT_Int  val = *ss;
+
+
+            for ( ; j > 0; j-- )
+            {
+              tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7);
+              val <<= 1;
+              tt   += 1;
+            }
+          }
+
+          s += source->pitch;
+          t += target->pitch;
+        }
+      }
+      break;
+
+
+    case FT_PIXEL_MODE_GRAY:
+    case FT_PIXEL_MODE_LCD:
+    case FT_PIXEL_MODE_LCD_V:
+      {
+        FT_Int    width   = source->width;
+        FT_Byte*  s       = source->buffer;
+        FT_Byte*  t       = target->buffer;
+        FT_Int    s_pitch = source->pitch;
+        FT_Int    t_pitch = target->pitch;
+        FT_Int    i;
+
+
+        target->num_grays = 256;
+
+        for ( i = source->rows; i > 0; i-- )
+        {
+          FT_ARRAY_COPY( t, s, width );
+
+          s += s_pitch;
+          t += t_pitch;
+        }
+      }
+      break;
+
+
+    case FT_PIXEL_MODE_GRAY2:
+      {
+        FT_Byte*  s = source->buffer;
+        FT_Byte*  t = target->buffer;
+        FT_Int    i;
+
+
+        target->num_grays = 4;
+
+        for ( i = source->rows; i > 0; i-- )
+        {
+          FT_Byte*  ss = s;
+          FT_Byte*  tt = t;
+          FT_Int    j;
+
+
+          /* get the full bytes */
+          for ( j = source->width >> 2; j > 0; j-- )
+          {
+            FT_Int  val = ss[0];
+
+
+            tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 );
+            tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 );
+            tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 );
+            tt[3] = (FT_Byte)( ( val & 0x03 ) );
+
+            ss += 1;
+            tt += 4;
+          }
+
+          j = source->width & 3;
+          if ( j > 0 )
+          {
+            FT_Int  val = ss[0];
+
+
+            for ( ; j > 0; j-- )
+            {
+              tt[0]  = (FT_Byte)( ( val & 0xC0 ) >> 6 );
+              val  <<= 2;
+              tt    += 1;
+            }
+          }
+
+          s += source->pitch;
+          t += target->pitch;
+        }
+      }
+      break;
+
+
+    case FT_PIXEL_MODE_GRAY4:
+      {
+        FT_Byte*  s = source->buffer;
+        FT_Byte*  t = target->buffer;
+        FT_Int    i;
+
+
+        target->num_grays = 16;
+
+        for ( i = source->rows; i > 0; i-- )
+        {
+          FT_Byte*  ss = s;
+          FT_Byte*  tt = t;
+          FT_Int    j;
+
+
+          /* get the full bytes */
+          for ( j = source->width >> 1; j > 0; j-- )
+          {
+            FT_Int  val = ss[0];
+
+
+            tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 );
+            tt[1] = (FT_Byte)( ( val & 0x0F ) );
+
+            ss += 1;
+            tt += 2;
+          }
+
+          if ( source->width & 1 )
+            tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 );
+
+          s += source->pitch;
+          t += target->pitch;
+        }
+      }
+      break;
+
+    case FT_PIXEL_MODE_BGRA:
+      {
+        FT_Byte*  s       = source->buffer;
+        FT_Byte*  t       = target->buffer;
+        FT_Int    s_pitch = source->pitch;
+        FT_Int    t_pitch = target->pitch;
+        FT_Int    i;
+
+
+        target->num_grays = 256;
+
+        for ( i = source->rows; i > 0; i-- )
+        {
+          FT_Byte*  ss = s;
+          FT_Byte*  tt = t;
+          FT_Int    j;
+
+
+          for ( j = source->width; j > 0; j-- )
+          {
+            tt[0] = ft_gray_for_premultiplied_srgb_bgra( ss );
+
+            ss += 4;
+            tt += 1;
+          }
+
+          s += s_pitch;
+          t += t_pitch;
+        }
+      }
+      break;
+
+    default:
+      ;
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftbitmap.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot )
+  {
+    if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP   &&
+         !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
+    {
+      FT_Bitmap  bitmap;
+      FT_Error   error;
+
+
+      FT_Bitmap_New( &bitmap );
+      error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap );
+      if ( error )
+        return error;
+
+      slot->bitmap = bitmap;
+      slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftbitmap.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Bitmap_Done( FT_Library  library,
+                  FT_Bitmap  *bitmap )
+  {
+    FT_Memory  memory;
+
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    if ( !bitmap )
+      return FT_THROW( Invalid_Argument );
+
+    memory = library->memory;
+
+    FT_FREE( bitmap->buffer );
+    *bitmap = null_bitmap;
+
+    return FT_Err_Ok;
+  }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftglyph.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftglyph.c
new file mode 100644
index 0000000..9ed83d2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftglyph.c
@@ -0,0 +1,631 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  ftglyph.c                                                              */
+/*                                                                         */
+/*    FreeType convenience functions to handle glyphs (body).              */
+/*                                                                         */
+/*  Copyright 1996-2005, 2007, 2008, 2010, 2012, 2013 by                   */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  This file contains the definition of several convenience functions   */
+  /*  that can be used by client applications to easily retrieve glyph     */
+  /*  bitmaps and outlines from a given face.                              */
+  /*                                                                       */
+  /*  These functions should be optional if you are writing a font server  */
+  /*  or text layout engine on top of FreeType.  However, they are pretty  */
+  /*  handy for many other simple uses of the library.                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftglyph.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftbitmap.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+#include "basepic.h"
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_glyph
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****   FT_BitmapGlyph support                                        ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_CALLBACK_DEF( FT_Error )
+  ft_bitmap_glyph_init( FT_Glyph      bitmap_glyph,
+                        FT_GlyphSlot  slot )
+  {
+    FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;
+    FT_Error        error   = FT_Err_Ok;
+    FT_Library      library = FT_GLYPH( glyph )->library;
+
+
+    if ( slot->format != FT_GLYPH_FORMAT_BITMAP )
+    {
+      error = FT_THROW( Invalid_Glyph_Format );
+      goto Exit;
+    }
+
+    glyph->left = slot->bitmap_left;
+    glyph->top  = slot->bitmap_top;
+
+    /* do lazy copying whenever possible */
+    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+    {
+      glyph->bitmap = slot->bitmap;
+      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+    }
+    else
+    {
+      FT_Bitmap_New( &glyph->bitmap );
+      error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ft_bitmap_glyph_copy( FT_Glyph  bitmap_source,
+                        FT_Glyph  bitmap_target )
+  {
+    FT_Library      library = bitmap_source->library;
+    FT_BitmapGlyph  source  = (FT_BitmapGlyph)bitmap_source;
+    FT_BitmapGlyph  target  = (FT_BitmapGlyph)bitmap_target;
+
+
+    target->left = source->left;
+    target->top  = source->top;
+
+    return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  ft_bitmap_glyph_done( FT_Glyph  bitmap_glyph )
+  {
+    FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;
+    FT_Library      library = FT_GLYPH( glyph )->library;
+
+
+    FT_Bitmap_Done( library, &glyph->bitmap );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  ft_bitmap_glyph_bbox( FT_Glyph  bitmap_glyph,
+                        FT_BBox*  cbox )
+  {
+    FT_BitmapGlyph  glyph = (FT_BitmapGlyph)bitmap_glyph;
+
+
+    cbox->xMin = glyph->left << 6;
+    cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 );
+    cbox->yMax = glyph->top << 6;
+    cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 );
+  }
+
+
+  FT_DEFINE_GLYPH(ft_bitmap_glyph_class,
+    sizeof ( FT_BitmapGlyphRec ),
+    FT_GLYPH_FORMAT_BITMAP,
+
+    ft_bitmap_glyph_init,
+    ft_bitmap_glyph_done,
+    ft_bitmap_glyph_copy,
+    0,                          /* FT_Glyph_TransformFunc */
+    ft_bitmap_glyph_bbox,
+    0                           /* FT_Glyph_PrepareFunc   */
+  )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****   FT_OutlineGlyph support                                       ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ft_outline_glyph_init( FT_Glyph      outline_glyph,
+                         FT_GlyphSlot  slot )
+  {
+    FT_OutlineGlyph  glyph   = (FT_OutlineGlyph)outline_glyph;
+    FT_Error         error   = FT_Err_Ok;
+    FT_Library       library = FT_GLYPH( glyph )->library;
+    FT_Outline*      source  = &slot->outline;
+    FT_Outline*      target  = &glyph->outline;
+
+
+    /* check format in glyph slot */
+    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )
+    {
+      error = FT_THROW( Invalid_Glyph_Format );
+      goto Exit;
+    }
+
+    /* allocate new outline */
+    error = FT_Outline_New( library, source->n_points, source->n_contours,
+                            &glyph->outline );
+    if ( error )
+      goto Exit;
+
+    FT_Outline_Copy( source, target );
+
+  Exit:
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  ft_outline_glyph_done( FT_Glyph  outline_glyph )
+  {
+    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+    FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ft_outline_glyph_copy( FT_Glyph  outline_source,
+                         FT_Glyph  outline_target )
+  {
+    FT_OutlineGlyph  source  = (FT_OutlineGlyph)outline_source;
+    FT_OutlineGlyph  target  = (FT_OutlineGlyph)outline_target;
+    FT_Error         error;
+    FT_Library       library = FT_GLYPH( source )->library;
+
+
+    error = FT_Outline_New( library, source->outline.n_points,
+                            source->outline.n_contours, &target->outline );
+    if ( !error )
+      FT_Outline_Copy( &source->outline, &target->outline );
+
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  ft_outline_glyph_transform( FT_Glyph          outline_glyph,
+                              const FT_Matrix*  matrix,
+                              const FT_Vector*  delta )
+  {
+    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+    if ( matrix )
+      FT_Outline_Transform( &glyph->outline, matrix );
+
+    if ( delta )
+      FT_Outline_Translate( &glyph->outline, delta->x, delta->y );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  ft_outline_glyph_bbox( FT_Glyph  outline_glyph,
+                         FT_BBox*  bbox )
+  {
+    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+    FT_Outline_Get_CBox( &glyph->outline, bbox );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ft_outline_glyph_prepare( FT_Glyph      outline_glyph,
+                            FT_GlyphSlot  slot )
+  {
+    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+    slot->format         = FT_GLYPH_FORMAT_OUTLINE;
+    slot->outline        = glyph->outline;
+    slot->outline.flags &= ~FT_OUTLINE_OWNER;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_DEFINE_GLYPH( ft_outline_glyph_class,
+    sizeof ( FT_OutlineGlyphRec ),
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    ft_outline_glyph_init,
+    ft_outline_glyph_done,
+    ft_outline_glyph_copy,
+    ft_outline_glyph_transform,
+    ft_outline_glyph_bbox,
+    ft_outline_glyph_prepare
+  )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****   FT_Glyph class and API                                        ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+   static FT_Error
+   ft_new_glyph( FT_Library             library,
+                 const FT_Glyph_Class*  clazz,
+                 FT_Glyph*              aglyph )
+   {
+     FT_Memory  memory = library->memory;
+     FT_Error   error;
+     FT_Glyph   glyph  = NULL;
+
+
+     *aglyph = 0;
+
+     if ( !FT_ALLOC( glyph, clazz->glyph_size ) )
+     {
+       glyph->library = library;
+       glyph->clazz   = clazz;
+       glyph->format  = clazz->glyph_format;
+
+       *aglyph = glyph;
+     }
+
+     return error;
+   }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Glyph_Copy( FT_Glyph   source,
+                 FT_Glyph  *target )
+  {
+    FT_Glyph               copy;
+    FT_Error               error;
+    const FT_Glyph_Class*  clazz;
+
+
+    /* check arguments */
+    if ( !target )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    *target = 0;
+
+    if ( !source || !source->clazz )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    clazz = source->clazz;
+    error = ft_new_glyph( source->library, clazz, &copy );
+    if ( error )
+      goto Exit;
+
+    copy->advance = source->advance;
+    copy->format  = source->format;
+
+    if ( clazz->glyph_copy )
+      error = clazz->glyph_copy( source, copy );
+
+    if ( error )
+      FT_Done_Glyph( copy );
+    else
+      *target = copy;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Glyph( FT_GlyphSlot  slot,
+                FT_Glyph     *aglyph )
+  {
+    FT_Library  library;
+    FT_Error    error;
+    FT_Glyph    glyph;
+
+    const FT_Glyph_Class*  clazz = 0;
+
+
+    if ( !slot )
+      return FT_THROW( Invalid_Slot_Handle );
+
+    library = slot->library;
+
+    if ( !aglyph )
+      return FT_THROW( Invalid_Argument );
+
+    /* if it is a bitmap, that's easy :-) */
+    if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
+      clazz = FT_BITMAP_GLYPH_CLASS_GET;
+
+    /* if it is an outline */
+    else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+      clazz = FT_OUTLINE_GLYPH_CLASS_GET;
+
+    else
+    {
+      /* try to find a renderer that supports the glyph image format */
+      FT_Renderer  render = FT_Lookup_Renderer( library, slot->format, 0 );
+
+
+      if ( render )
+        clazz = &render->glyph_class;
+    }
+
+    if ( !clazz )
+    {
+      error = FT_THROW( Invalid_Glyph_Format );
+      goto Exit;
+    }
+
+    /* create FT_Glyph object */
+    error = ft_new_glyph( library, clazz, &glyph );
+    if ( error )
+      goto Exit;
+
+    /* copy advance while converting it to 16.16 format */
+    glyph->advance.x = slot->advance.x << 10;
+    glyph->advance.y = slot->advance.y << 10;
+
+    /* now import the image from the glyph slot */
+    error = clazz->glyph_init( glyph, slot );
+
+    /* if an error occurred, destroy the glyph */
+    if ( error )
+      FT_Done_Glyph( glyph );
+    else
+      *aglyph = glyph;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Glyph_Transform( FT_Glyph    glyph,
+                      FT_Matrix*  matrix,
+                      FT_Vector*  delta )
+  {
+    const FT_Glyph_Class*  clazz;
+    FT_Error               error = FT_Err_Ok;
+
+
+    if ( !glyph || !glyph->clazz )
+      error = FT_THROW( Invalid_Argument );
+    else
+    {
+      clazz = glyph->clazz;
+      if ( clazz->glyph_transform )
+      {
+        /* transform glyph image */
+        clazz->glyph_transform( glyph, matrix, delta );
+
+        /* transform advance vector */
+        if ( matrix )
+          FT_Vector_Transform( &glyph->advance, matrix );
+      }
+      else
+        error = FT_THROW( Invalid_Glyph_Format );
+    }
+    return error;
+  }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Glyph_Get_CBox( FT_Glyph  glyph,
+                     FT_UInt   bbox_mode,
+                     FT_BBox  *acbox )
+  {
+    const FT_Glyph_Class*  clazz;
+
+
+    if ( !acbox )
+      return;
+
+    acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0;
+
+    if ( !glyph || !glyph->clazz )
+      return;
+    else
+    {
+      clazz = glyph->clazz;
+      if ( !clazz->glyph_bbox )
+        return;
+      else
+      {
+        /* retrieve bbox in 26.6 coordinates */
+        clazz->glyph_bbox( glyph, acbox );
+
+        /* perform grid fitting if needed */
+        if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT ||
+             bbox_mode == FT_GLYPH_BBOX_PIXELS  )
+        {
+          acbox->xMin = FT_PIX_FLOOR( acbox->xMin );
+          acbox->yMin = FT_PIX_FLOOR( acbox->yMin );
+          acbox->xMax = FT_PIX_CEIL( acbox->xMax );
+          acbox->yMax = FT_PIX_CEIL( acbox->yMax );
+        }
+
+        /* convert to integer pixels if needed */
+        if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE ||
+             bbox_mode == FT_GLYPH_BBOX_PIXELS   )
+        {
+          acbox->xMin >>= 6;
+          acbox->yMin >>= 6;
+          acbox->xMax >>= 6;
+          acbox->yMax >>= 6;
+        }
+      }
+    }
+    return;
+  }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,
+                      FT_Render_Mode  render_mode,
+                      FT_Vector*      origin,
+                      FT_Bool         destroy )
+  {
+    FT_GlyphSlotRec           dummy;
+    FT_GlyphSlot_InternalRec  dummy_internal;
+    FT_Error                  error = FT_Err_Ok;
+    FT_Glyph                  b, glyph;
+    FT_BitmapGlyph            bitmap = NULL;
+    const FT_Glyph_Class*     clazz;
+
+    /* FT_BITMAP_GLYPH_CLASS_GET derefers `library' in PIC mode */
+    FT_Library                library;
+
+
+    /* check argument */
+    if ( !the_glyph )
+      goto Bad;
+    glyph = *the_glyph;
+    if ( !glyph )
+      goto Bad;
+
+    clazz   = glyph->clazz;
+    library = glyph->library;
+    if ( !library || !clazz )
+      goto Bad;
+
+    /* when called with a bitmap glyph, do nothing and return successfully */
+    if ( clazz == FT_BITMAP_GLYPH_CLASS_GET )
+      goto Exit;
+
+    if ( !clazz->glyph_prepare )
+      goto Bad;
+
+    /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */
+    /* then calling FT_Render_Glyph_Internal()                            */
+
+    FT_MEM_ZERO( &dummy, sizeof ( dummy ) );
+    FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) );
+    dummy.internal = &dummy_internal;
+    dummy.library  = library;
+    dummy.format   = clazz->glyph_format;
+
+    /* create result bitmap glyph */
+    error = ft_new_glyph( library, FT_BITMAP_GLYPH_CLASS_GET, &b );
+    if ( error )
+      goto Exit;
+    bitmap = (FT_BitmapGlyph)b;
+
+#if 1
+    /* if `origin' is set, translate the glyph image */
+    if ( origin )
+      FT_Glyph_Transform( glyph, 0, origin );
+#else
+    FT_UNUSED( origin );
+#endif
+
+    /* prepare dummy slot for rendering */
+    error = clazz->glyph_prepare( glyph, &dummy );
+    if ( !error )
+      error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode );
+
+#if 1
+    if ( !destroy && origin )
+    {
+      FT_Vector  v;
+
+
+      v.x = -origin->x;
+      v.y = -origin->y;
+      FT_Glyph_Transform( glyph, 0, &v );
+    }
+#endif
+
+    if ( error )
+      goto Exit;
+
+    /* in case of success, copy the bitmap to the glyph bitmap */
+    error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy );
+    if ( error )
+      goto Exit;
+
+    /* copy advance */
+    bitmap->root.advance = glyph->advance;
+
+    if ( destroy )
+      FT_Done_Glyph( glyph );
+
+    *the_glyph = FT_GLYPH( bitmap );
+
+  Exit:
+    if ( error && bitmap )
+      FT_Done_Glyph( FT_GLYPH( bitmap ) );
+
+    return error;
+
+  Bad:
+    error = FT_THROW( Invalid_Argument );
+    goto Exit;
+  }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Done_Glyph( FT_Glyph  glyph )
+  {
+    if ( glyph )
+    {
+      FT_Memory              memory = glyph->library->memory;
+      const FT_Glyph_Class*  clazz  = glyph->clazz;
+
+
+      if ( clazz->glyph_done )
+        clazz->glyph_done( glyph );
+
+      FT_FREE( glyph );
+    }
+  }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftinit.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftinit.c
new file mode 100644
index 0000000..c7bf1f9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftinit.c
@@ -0,0 +1,285 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  ftinit.c                                                               */
+/*                                                                         */
+/*    FreeType initialization layer (body).                                */
+/*                                                                         */
+/*  Copyright 1996-2002, 2005, 2007, 2009, 2012, 2013 by                   */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  The purpose of this file is to implement the following two           */
+  /*  functions:                                                           */
+  /*                                                                       */
+  /*  FT_Add_Default_Modules():                                            */
+  /*     This function is used to add the set of default modules to a      */
+  /*     fresh new library object.  The set is taken from the header file  */
+  /*     `freetype/config/ftmodule.h'.  See the document `FreeType 2.0     */
+  /*     Build System' for more information.                               */
+  /*                                                                       */
+  /*  FT_Init_FreeType():                                                  */
+  /*     This function creates a system object for the current platform,   */
+  /*     builds a library out of it, then calls FT_Default_Drivers().      */
+  /*                                                                       */
+  /*  Note that even if FT_Init_FreeType() uses the implementation of the  */
+  /*  system object defined at build time, client applications are still   */
+  /*  able to provide their own `ftsystem.c'.                              */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftmodapi.h"
+#include "basepic.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_init
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+
+#undef  FT_USE_MODULE
+#ifdef __cplusplus
+#define FT_USE_MODULE( type, x )  extern "C" const type  x;
+#else
+#define FT_USE_MODULE( type, x )  extern const type  x;
+#endif
+
+#include "../../include/freetype/config/ftmodule.h"
+
+#undef  FT_USE_MODULE
+#define FT_USE_MODULE( type, x )  (const FT_Module_Class*)&(x),
+
+  static
+  const FT_Module_Class*  const ft_default_modules[] =
+  {
+#include "../../include/freetype/config/ftmodule.h"
+    0
+  };
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+
+#ifdef __cplusplus
+#define FT_EXTERNC  extern "C"
+#else
+#define FT_EXTERNC  extern
+#endif
+
+  /* declare the module's class creation/destruction functions */
+#undef  FT_USE_MODULE
+#define FT_USE_MODULE( type, x )                            \
+  FT_EXTERNC FT_Error                                       \
+  FT_Create_Class_ ## x( FT_Library         library,        \
+                         FT_Module_Class*  *output_class ); \
+  FT_EXTERNC void                                           \
+  FT_Destroy_Class_ ## x( FT_Library        library,        \
+                          FT_Module_Class*  clazz );
+
+#include "../../include/freetype/config/ftmodule.h"
+
+  /* count all module classes */
+#undef  FT_USE_MODULE
+#define FT_USE_MODULE( type, x )  MODULE_CLASS_ ## x,
+
+  enum
+  {
+#include "../../include/freetype/config/ftmodule.h"
+    FT_NUM_MODULE_CLASSES
+  };
+
+  /* destroy all module classes */
+#undef  FT_USE_MODULE
+#define FT_USE_MODULE( type, x )                   \
+  if ( classes[i] )                                \
+  {                                                \
+    FT_Destroy_Class_ ## x( library, classes[i] ); \
+  }                                                \
+  i++;
+
+
+  FT_BASE_DEF( void )
+  ft_destroy_default_module_classes( FT_Library  library )
+  {
+    FT_Module_Class*  *classes;
+    FT_Memory          memory;
+    FT_UInt            i;
+    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;
+
+
+    if ( !pic_container->default_module_classes )
+      return;
+
+    memory  = library->memory;
+    classes = pic_container->default_module_classes;
+    i       = 0;
+
+#include "../../include/freetype/config/ftmodule.h"
+
+    FT_FREE( classes );
+    pic_container->default_module_classes = 0;
+  }
+
+
+  /* initialize all module classes and the pointer table */
+#undef  FT_USE_MODULE
+#define FT_USE_MODULE( type, x )                     \
+  error = FT_Create_Class_ ## x( library, &clazz );  \
+  if ( error )                                       \
+    goto Exit;                                       \
+  classes[i++] = clazz;
+
+
+  FT_BASE_DEF( FT_Error )
+  ft_create_default_module_classes( FT_Library  library )
+  {
+    FT_Error           error;
+    FT_Memory          memory;
+    FT_Module_Class*  *classes = NULL;
+    FT_Module_Class*   clazz;
+    FT_UInt            i;
+    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;
+
+
+    memory = library->memory;
+
+    pic_container->default_module_classes = 0;
+
+    if ( FT_ALLOC( classes, sizeof ( FT_Module_Class* ) *
+                              ( FT_NUM_MODULE_CLASSES + 1 ) ) )
+      return error;
+
+    /* initialize all pointers to 0, especially the last one */
+    for ( i = 0; i < FT_NUM_MODULE_CLASSES; i++ )
+      classes[i] = 0;
+    classes[FT_NUM_MODULE_CLASSES] = 0;
+
+    i = 0;
+
+#include "../../include/freetype/config/ftmodule.h"
+
+  Exit:
+    if ( error )
+      ft_destroy_default_module_classes( library );
+    else
+      pic_container->default_module_classes = classes;
+
+    return error;
+  }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Add_Default_Modules( FT_Library  library )
+  {
+    FT_Error                       error;
+    const FT_Module_Class* const*  cur;
+
+
+    /* FT_DEFAULT_MODULES_GET dereferences `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+    if ( !library )
+      return;
+#endif
+
+    /* GCC 4.6 warns the type difference:
+     *   FT_Module_Class** != const FT_Module_Class* const*
+     */
+    cur = (const FT_Module_Class* const*)FT_DEFAULT_MODULES_GET;
+
+    /* test for valid `library' delayed to FT_Add_Module() */
+    while ( *cur )
+    {
+      error = FT_Add_Module( library, *cur );
+      /* notify errors, but don't stop */
+      if ( error )
+        FT_TRACE0(( "FT_Add_Default_Module:"
+                    " Cannot install `%s', error = 0x%x\n",
+                    (*cur)->module_name, error ));
+      cur++;
+    }
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Init_FreeType( FT_Library  *alibrary )
+  {
+    FT_Error   error;
+    FT_Memory  memory;
+
+
+    /* First of all, allocate a new system object -- this function is part */
+    /* of the system-specific component, i.e. `ftsystem.c'.                */
+
+    memory = FT_New_Memory();
+    if ( !memory )
+    {
+      FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" ));
+      return FT_THROW( Unimplemented_Feature );
+    }
+
+    /* build a library out of it, then fill it with the set of */
+    /* default drivers.                                        */
+
+    error = FT_New_Library( memory, alibrary );
+    if ( error )
+      FT_Done_Memory( memory );
+    else
+      FT_Add_Default_Modules( *alibrary );
+
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Done_FreeType( FT_Library  library )
+  {
+    if ( library )
+    {
+      FT_Memory  memory = library->memory;
+
+
+      /* Discard the library object */
+      FT_Done_Library( library );
+
+      /* discard memory manager */
+      FT_Done_Memory( memory );
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftlcdfil.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftlcdfil.c
new file mode 100644
index 0000000..66676de
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftlcdfil.c
@@ -0,0 +1,381 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  ftlcdfil.c                                                             */
+/*                                                                         */
+/*    FreeType API for color filtering of subpixel bitmap glyphs (body).   */
+/*                                                                         */
+/*  Copyright 2006, 2008-2010, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/ftlcdfil.h"
+#include "../../include/freetype/ftimage.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+/* define USE_LEGACY to implement the legacy filter */
+#define  USE_LEGACY
+
+  /* FIR filter used by the default and light filters */
+  static void
+  _ft_lcd_filter_fir( FT_Bitmap*      bitmap,
+                      FT_Render_Mode  mode,
+                      FT_Library      library )
+  {
+    FT_Byte*  weights = library->lcd_weights;
+    FT_UInt   width   = (FT_UInt)bitmap->width;
+    FT_UInt   height  = (FT_UInt)bitmap->rows;
+
+
+    /* horizontal in-place FIR filter */
+    if ( mode == FT_RENDER_MODE_LCD && width >= 4 )
+    {
+      FT_Byte*  line = bitmap->buffer;
+
+
+      for ( ; height > 0; height--, line += bitmap->pitch )
+      {
+        FT_UInt  fir[5];
+        FT_UInt  val1, xx;
+
+
+        val1   = line[0];
+        fir[0] = weights[2] * val1;
+        fir[1] = weights[3] * val1;
+        fir[2] = weights[4] * val1;
+        fir[3] = 0;
+        fir[4] = 0;
+
+        val1    = line[1];
+        fir[0] += weights[1] * val1;
+        fir[1] += weights[2] * val1;
+        fir[2] += weights[3] * val1;
+        fir[3] += weights[4] * val1;
+
+        for ( xx = 2; xx < width; xx++ )
+        {
+          FT_UInt  val, pix;
+
+
+          val    = line[xx];
+          pix    = fir[0] + weights[0] * val;
+          fir[0] = fir[1] + weights[1] * val;
+          fir[1] = fir[2] + weights[2] * val;
+          fir[2] = fir[3] + weights[3] * val;
+          fir[3] =          weights[4] * val;
+
+          pix        >>= 8;
+          pix         |= (FT_UInt)-(FT_Int)( pix >> 8 );
+          line[xx - 2] = (FT_Byte)pix;
+        }
+
+        {
+          FT_UInt  pix;
+
+
+          pix          = fir[0] >> 8;
+          pix         |= (FT_UInt)-(FT_Int)( pix >> 8 );
+          line[xx - 2] = (FT_Byte)pix;
+
+          pix          = fir[1] >> 8;
+          pix         |= (FT_UInt)-(FT_Int)( pix >> 8 );
+          line[xx - 1] = (FT_Byte)pix;
+        }
+      }
+    }
+
+    /* vertical in-place FIR filter */
+    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 )
+    {
+      FT_Byte*  column = bitmap->buffer;
+      FT_Int    pitch  = bitmap->pitch;
+
+
+      for ( ; width > 0; width--, column++ )
+      {
+        FT_Byte*  col = column;
+        FT_UInt   fir[5];
+        FT_UInt   val1, yy;
+
+
+        val1   = col[0];
+        fir[0] = weights[2] * val1;
+        fir[1] = weights[3] * val1;
+        fir[2] = weights[4] * val1;
+        fir[3] = 0;
+        fir[4] = 0;
+        col   += pitch;
+
+        val1    = col[0];
+        fir[0] += weights[1] * val1;
+        fir[1] += weights[2] * val1;
+        fir[2] += weights[3] * val1;
+        fir[3] += weights[4] * val1;
+        col    += pitch;
+
+        for ( yy = 2; yy < height; yy++ )
+        {
+          FT_UInt  val, pix;
+
+
+          val    = col[0];
+          pix    = fir[0] + weights[0] * val;
+          fir[0] = fir[1] + weights[1] * val;
+          fir[1] = fir[2] + weights[2] * val;
+          fir[2] = fir[3] + weights[3] * val;
+          fir[3] =          weights[4] * val;
+
+          pix           >>= 8;
+          pix            |= (FT_UInt)-(FT_Int)( pix >> 8 );
+          col[-2 * pitch] = (FT_Byte)pix;
+          col            += pitch;
+        }
+
+        {
+          FT_UInt  pix;
+
+
+          pix             = fir[0] >> 8;
+          pix            |= (FT_UInt)-(FT_Int)( pix >> 8 );
+          col[-2 * pitch] = (FT_Byte)pix;
+
+          pix         = fir[1] >> 8;
+          pix            |= (FT_UInt)-(FT_Int)( pix >> 8 );
+          col[-pitch] = (FT_Byte)pix;
+        }
+      }
+    }
+  }
+
+
+#ifdef USE_LEGACY
+
+  /* intra-pixel filter used by the legacy filter */
+  static void
+  _ft_lcd_filter_legacy( FT_Bitmap*      bitmap,
+                         FT_Render_Mode  mode,
+                         FT_Library      library )
+  {
+    FT_UInt  width  = (FT_UInt)bitmap->width;
+    FT_UInt  height = (FT_UInt)bitmap->rows;
+    FT_Int   pitch  = bitmap->pitch;
+
+    static const int  filters[3][3] =
+    {
+      { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 },
+      { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 },
+      { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }
+    };
+
+    FT_UNUSED( library );
+
+
+    /* horizontal in-place intra-pixel filter */
+    if ( mode == FT_RENDER_MODE_LCD && width >= 3 )
+    {
+      FT_Byte*  line = bitmap->buffer;
+
+
+      for ( ; height > 0; height--, line += pitch )
+      {
+        FT_UInt  xx;
+
+
+        for ( xx = 0; xx < width; xx += 3 )
+        {
+          FT_UInt  r = 0;
+          FT_UInt  g = 0;
+          FT_UInt  b = 0;
+          FT_UInt  p;
+
+
+          p  = line[xx];
+          r += filters[0][0] * p;
+          g += filters[0][1] * p;
+          b += filters[0][2] * p;
+
+          p  = line[xx + 1];
+          r += filters[1][0] * p;
+          g += filters[1][1] * p;
+          b += filters[1][2] * p;
+
+          p  = line[xx + 2];
+          r += filters[2][0] * p;
+          g += filters[2][1] * p;
+          b += filters[2][2] * p;
+
+          line[xx]     = (FT_Byte)( r / 65536 );
+          line[xx + 1] = (FT_Byte)( g / 65536 );
+          line[xx + 2] = (FT_Byte)( b / 65536 );
+        }
+      }
+    }
+    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 )
+    {
+      FT_Byte*  column = bitmap->buffer;
+
+
+      for ( ; width > 0; width--, column++ )
+      {
+        FT_Byte*  col     = column;
+        FT_Byte*  col_end = col + height * pitch;
+
+
+        for ( ; col < col_end; col += 3 * pitch )
+        {
+          FT_UInt  r = 0;
+          FT_UInt  g = 0;
+          FT_UInt  b = 0;
+          FT_UInt  p;
+
+
+          p  = col[0];
+          r += filters[0][0] * p;
+          g += filters[0][1] * p;
+          b += filters[0][2] * p;
+
+          p  = col[pitch];
+          r += filters[1][0] * p;
+          g += filters[1][1] * p;
+          b += filters[1][2] * p;
+
+          p  = col[pitch * 2];
+          r += filters[2][0] * p;
+          g += filters[2][1] * p;
+          b += filters[2][2] * p;
+
+          col[0]         = (FT_Byte)( r / 65536 );
+          col[pitch]     = (FT_Byte)( g / 65536 );
+          col[2 * pitch] = (FT_Byte)( b / 65536 );
+        }
+      }
+    }
+  }
+
+#endif /* USE_LEGACY */
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Library_SetLcdFilterWeights( FT_Library      library,
+                                  unsigned char  *weights )
+  {
+    if ( !library || !weights )
+      return FT_THROW( Invalid_Argument );
+
+    ft_memcpy( library->lcd_weights, weights, 5 );
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Library_SetLcdFilter( FT_Library    library,
+                           FT_LcdFilter  filter )
+  {
+    static const FT_Byte  light_filter[5] =
+                            { 0x00, 0x55, 0x56, 0x55, 0x00 };
+    /* the values here sum up to a value larger than 256, */
+    /* providing a cheap gamma correction                 */
+    static const FT_Byte  default_filter[5] =
+                            { 0x10, 0x40, 0x70, 0x40, 0x10 };
+
+
+    if ( !library )
+      return FT_THROW( Invalid_Argument );
+
+    switch ( filter )
+    {
+    case FT_LCD_FILTER_NONE:
+      library->lcd_filter_func = NULL;
+      library->lcd_extra       = 0;
+      break;
+
+    case FT_LCD_FILTER_DEFAULT:
+#if defined( FT_FORCE_LEGACY_LCD_FILTER )
+
+      library->lcd_filter_func = _ft_lcd_filter_legacy;
+      library->lcd_extra       = 0;
+
+#elif defined( FT_FORCE_LIGHT_LCD_FILTER )
+
+      ft_memcpy( library->lcd_weights, light_filter, 5 );
+      library->lcd_filter_func = _ft_lcd_filter_fir;
+      library->lcd_extra       = 2;
+
+#else
+
+      ft_memcpy( library->lcd_weights, default_filter, 5 );
+      library->lcd_filter_func = _ft_lcd_filter_fir;
+      library->lcd_extra       = 2;
+
+#endif
+
+      break;
+
+    case FT_LCD_FILTER_LIGHT:
+      ft_memcpy( library->lcd_weights, light_filter, 5 );
+      library->lcd_filter_func = _ft_lcd_filter_fir;
+      library->lcd_extra       = 2;
+      break;
+
+#ifdef USE_LEGACY
+
+    case FT_LCD_FILTER_LEGACY:
+      library->lcd_filter_func = _ft_lcd_filter_legacy;
+      library->lcd_extra       = 0;
+      break;
+
+#endif
+
+    default:
+      return FT_THROW( Invalid_Argument );
+    }
+
+    library->lcd_filter = filter;
+
+    return FT_Err_Ok;
+  }
+
+#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Library_SetLcdFilterWeights( FT_Library      library,
+                                  unsigned char  *weights )
+  {
+    FT_UNUSED( library );
+    FT_UNUSED( weights );
+
+    return FT_THROW( Unimplemented_Feature );
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Library_SetLcdFilter( FT_Library    library,
+                           FT_LcdFilter  filter )
+  {
+    FT_UNUSED( library );
+    FT_UNUSED( filter );
+
+    return FT_THROW( Unimplemented_Feature );
+  }
+
+#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftmm.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftmm.c
new file mode 100644
index 0000000..2f320d5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftmm.c
@@ -0,0 +1,206 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  ftmm.c                                                                 */
+/*                                                                         */
+/*    Multiple Master font support (body).                                 */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2004, 2009, 2013 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svmm.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_mm
+
+
+  static FT_Error
+  ft_face_get_mm_service( FT_Face                   face,
+                          FT_Service_MultiMasters  *aservice )
+  {
+    FT_Error  error;
+
+
+    *aservice = NULL;
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    error = FT_ERR( Invalid_Argument );
+
+    if ( FT_HAS_MULTIPLE_MASTERS( face ) )
+    {
+      FT_FACE_LOOKUP_SERVICE( face,
+                              *aservice,
+                              MULTI_MASTERS );
+
+      if ( *aservice )
+        error = FT_Err_Ok;
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Multi_Master( FT_Face           face,
+                       FT_Multi_Master  *amaster )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_ERR( Invalid_Argument );
+      if ( service->get_mm )
+        error = service->get_mm( face, amaster );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_MM_Var( FT_Face      face,
+                 FT_MM_Var*  *amaster )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_ERR( Invalid_Argument );
+      if ( service->get_mm_var )
+        error = service->get_mm_var( face, amaster );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_MM_Design_Coordinates( FT_Face   face,
+                                FT_UInt   num_coords,
+                                FT_Long*  coords )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_ERR( Invalid_Argument );
+      if ( service->set_mm_design )
+        error = service->set_mm_design( face, num_coords, coords );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Var_Design_Coordinates( FT_Face    face,
+                                 FT_UInt    num_coords,
+                                 FT_Fixed*  coords )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_ERR( Invalid_Argument );
+      if ( service->set_var_design )
+        error = service->set_var_design( face, num_coords, coords );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_MM_Blend_Coordinates( FT_Face    face,
+                               FT_UInt    num_coords,
+                               FT_Fixed*  coords )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_ERR( Invalid_Argument );
+      if ( service->set_mm_blend )
+         error = service->set_mm_blend( face, num_coords, coords );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  /* This is exactly the same as the previous function.  It exists for */
+  /* orthogonality.                                                    */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Var_Blend_Coordinates( FT_Face    face,
+                                FT_UInt    num_coords,
+                                FT_Fixed*  coords )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_ERR( Invalid_Argument );
+      if ( service->set_mm_blend )
+         error = service->set_mm_blend( face, num_coords, coords );
+    }
+
+    return error;
+  }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftsystem.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftsystem.c
new file mode 100644
index 0000000..ff7137f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftsystem.c
@@ -0,0 +1,375 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  ftsystem.c                                                             */
+/*                                                                         */
+/*    ANSI-specific FreeType low-level system interface (body).            */
+/*                                                                         */
+/*  Copyright 1996-2002, 2006, 2008-2011, 2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file contains the default interface used by FreeType to access   */
+  /* low-level, i.e. memory management, i/o access as well as thread       */
+  /* synchronisation.  It can be replaced by user-specific routines if     */
+  /* necessary.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/ftsystem.h"
+#include "../../include/freetype/fterrors.h"
+#include "../../include/freetype/fttypes.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                       MEMORY MANAGEMENT INTERFACE                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* It is not necessary to do any error checking for the                  */
+  /* allocation-related functions.  This will be done by the higher level  */
+  /* routines like ft_mem_alloc() or ft_mem_realloc().                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define _FOXIT_MEM_MANAGER_
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+extern "C" {
+#endif
+
+/** Allocate number of bytes */
+void*	FXMEM_DefaultAlloc(int byte_size, int flags);
+
+/** Allocate with debug information */
+void*	FXMEM_DefaultAllocDebug(int size, int flags, const char* file, int line);
+
+void*	FXMEM_DefaultRealloc(void* pointer, int new_size, int flags);
+
+/** Free previously allocated memory */
+void	FXMEM_DefaultFree(void* pointer, int flags);
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+}
+#endif
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_alloc                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory allocation function.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A pointer to the memory object.                          */
+  /*                                                                       */
+  /*    size   :: The requested size in bytes.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The address of newly allocated block.                              */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void* )
+  ft_alloc( FT_Memory  memory,
+            long       size )
+  {
+    FT_UNUSED( memory );
+  #ifdef _FOXIT_MEM_MANAGER_
+	return FXMEM_DefaultAlloc(size, 0);
+#else
+    return ft_smalloc( size );
+#endif
+  }
+  
+  /* XYQ 2006-10-12 */
+#ifdef _XYQ_MEM_DEBUG
+  FT_CALLBACK_DEF( void* )
+	  ft_allocdebug( FT_Memory  memory,
+	  long       size, const char* filename, int line)
+  {
+	  FT_UNUSED( memory );
+	  
+	  return FXMEM_DefaultAllocDebug( size, 0, filename, line );
+  }
+#endif
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_realloc                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory reallocation function.                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory   :: A pointer to the memory object.                        */
+  /*                                                                       */
+  /*    cur_size :: The current size of the allocated memory block.        */
+  /*                                                                       */
+  /*    new_size :: The newly requested size in bytes.                     */
+  /*                                                                       */
+  /*    block    :: The current address of the block in memory.            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The address of the reallocated memory block.                       */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void* )
+  ft_realloc( FT_Memory  memory,
+              long       cur_size,
+              long       new_size,
+              void*      block )
+  {
+    FT_UNUSED( memory );
+    FT_UNUSED( cur_size );
+
+#ifdef _FOXIT_MEM_MANAGER_
+	return FXMEM_DefaultRealloc(block, new_size, 0);
+#else
+    return ft_srealloc( block, new_size );
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_free                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory release function.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory  :: A pointer to the memory object.                         */
+  /*                                                                       */
+  /*    block   :: The address of block in memory to be freed.             */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void )
+  ft_free( FT_Memory  memory,
+           void*      block )
+  {
+    FT_UNUSED( memory );
+
+#ifdef _FOXIT_MEM_MANAGER_
+	FXMEM_DefaultFree(block, 0);
+#else
+    ft_sfree( block );
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                     RESOURCE MANAGEMENT INTERFACE                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_io
+
+  /* We use the macro STREAM_FILE for convenience to extract the       */
+  /* system-specific stream handle from a given FreeType stream object */
+#define STREAM_FILE( stream )  ( (FT_FILE*)stream->descriptor.pointer )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_ansi_stream_close                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The function to close a stream.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A pointer to the stream object.                          */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void )
+  ft_ansi_stream_close( FT_Stream  stream )
+  {
+//#if _FX_COMPILER_ != _FX_IARCC_ && _FX_OS_ != _FX_PALMOS_
+    ft_fclose( STREAM_FILE( stream ) );
+
+    stream->descriptor.pointer = NULL;
+    stream->size               = 0;
+    stream->base               = 0;
+//#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_ansi_stream_io                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The function to open a stream.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A pointer to the stream object.                          */
+  /*                                                                       */
+  /*    offset :: The position in the data stream to start reading.        */
+  /*                                                                       */
+  /*    buffer :: The address of buffer to store the read data.            */
+  /*                                                                       */
+  /*    count  :: The number of bytes to read from the stream.             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The number of bytes actually read.  If `count' is zero (this is,   */
+  /*    the function is used for seeking), a non-zero return value         */
+  /*    indicates an error.                                                */
+  /*                                                                       */
+  FT_CALLBACK_DEF( unsigned long )
+  ft_ansi_stream_io( FT_Stream       stream,
+                     unsigned long   offset,
+                     unsigned char*  buffer,
+                     unsigned long   count )
+  {
+//#if _FX_COMPILER_ != _FX_IARCC_ && _FX_OS_ != _FX_PALMOS_
+    FT_FILE*  file;
+
+
+    if ( !count && offset > stream->size )
+      return 1;
+
+    file = STREAM_FILE( stream );
+
+    if ( stream->pos != offset )
+      ft_fseek( file, offset, SEEK_SET );
+
+    return (unsigned long)ft_fread( buffer, 1, count, file );
+//#else
+//    return 0;
+//#endif
+  }
+
+
+  /* documentation is in ftstream.h */
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_Open( FT_Stream    stream,
+                  const char*  filepathname )
+  {
+//#if _FX_COMPILER_ != _FX_IARCC_ && _FX_OS_ != _FX_PALMOS_
+    FT_FILE*  file;
+
+
+    if ( !stream )
+      return FT_THROW( Invalid_Stream_Handle );
+
+    stream->descriptor.pointer = NULL;
+    stream->pathname.pointer   = (char*)filepathname;
+    stream->base               = 0;
+    stream->pos                = 0;
+    stream->read               = NULL;
+    stream->close              = NULL;
+
+    file = ft_fopen( filepathname, "rb" );
+    if ( !file )
+    {
+      FT_ERROR(( "FT_Stream_Open:"
+                 " could not open `%s'\n", filepathname ));
+
+      return FT_THROW( Cannot_Open_Resource );
+    }
+
+    ft_fseek( file, 0, FXSYS_SEEK_END );
+    stream->size = ft_ftell( file );
+    if ( !stream->size )
+    {
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " opened `%s' but zero-sized\n", filepathname ));
+      ft_fclose( file );
+      return FT_THROW( Cannot_Open_Stream );
+    }
+    ft_fseek( file, 0, FXSYS_SEEK_SET );
+
+    stream->descriptor.pointer = file;
+    stream->read  = ft_ansi_stream_io;
+    stream->close = ft_ansi_stream_close;
+
+    FT_TRACE1(( "FT_Stream_Open:" ));
+    FT_TRACE1(( " opened `%s' (%d bytes) successfully\n",
+                filepathname, stream->size ));
+//#endif
+
+    return FT_Err_Ok;
+  }
+
+#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
+
+#ifdef FT_DEBUG_MEMORY
+
+  extern FT_Int
+  ft_mem_debug_init( FT_Memory  memory );
+
+  extern void
+  ft_mem_debug_done( FT_Memory  memory );
+
+#endif
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Memory )
+  FT_New_Memory( void )
+  {
+    FT_Memory  memory;
+
+
+    memory = (FT_Memory)FXMEM_DefaultAlloc( sizeof ( *memory ), 0 );
+    if ( memory )
+    {
+      memory->user    = 0;
+      memory->alloc   = ft_alloc;
+#ifdef _XYQ_MEM_DEBUG
+	  memory->allocdebug = ft_allocdebug;
+#endif
+      memory->realloc = ft_realloc;
+      memory->free    = ft_free;
+#ifdef FT_DEBUG_MEMORY
+      ft_mem_debug_init( memory );
+#endif
+    }
+
+    return memory;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( void )
+  FT_Done_Memory( FT_Memory  memory )
+  {
+#ifdef FT_DEBUG_MEMORY
+    ft_mem_debug_done( memory );
+#endif
+    FXMEM_DefaultFree( memory, 0 );
+  }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.c
new file mode 100644
index 0000000..2f01c93
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.c
@@ -0,0 +1,295 @@
+/*
+ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
+ * MD5 Message-Digest Algorithm (RFC 1321).
+ *
+ * Homepage:
+ * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
+ *
+ * Author:
+ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
+ *
+ * This software was written by Alexander Peslyak in 2001.  No copyright is
+ * claimed, and the software is hereby placed in the public domain.
+ * In case this attempt to disclaim copyright and place the software in the
+ * public domain is deemed null and void, then the software is
+ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
+ * general public under the following terms:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted.
+ *
+ * There's ABSOLUTELY NO WARRANTY, express or implied.
+ *
+ * (This is a heavily cut-down "BSD license".)
+ *
+ * This differs from Colin Plumb's older public domain implementation in that
+ * no exactly 32-bit integer data type is required (any 32-bit or wider
+ * unsigned integer data type will do), there's no compile-time endianness
+ * configuration, and the function prototypes match OpenSSL's.  No code from
+ * Colin Plumb's implementation has been reused; this comment merely compares
+ * the properties of the two independent implementations.
+ *
+ * The primary goals of this implementation are portability and ease of use.
+ * It is meant to be fast, but not as fast as possible.  Some known
+ * optimizations are not included to reduce source code size and avoid
+ * compile-time configuration.
+ */
+
+#ifndef HAVE_OPENSSL
+
+#include <string.h>
+
+#include "md5.h"
+
+/*
+ * The basic MD5 functions.
+ *
+ * F and G are optimized compared to their RFC 1321 definitions for
+ * architectures that lack an AND-NOT instruction, just like in Colin Plumb's
+ * implementation.
+ */
+#define F(x, y, z)			((z) ^ ((x) & ((y) ^ (z))))
+#define G(x, y, z)			((y) ^ ((z) & ((x) ^ (y))))
+#define H(x, y, z)			((x) ^ (y) ^ (z))
+#define I(x, y, z)			((y) ^ ((x) | ~(z)))
+
+/*
+ * The MD5 transformation for all four rounds.
+ */
+#define STEP(f, a, b, c, d, x, t, s) \
+	(a) += f((b), (c), (d)) + (x) + (t); \
+	(a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
+	(a) += (b);
+
+/*
+ * SET reads 4 input bytes in little-endian byte order and stores them
+ * in a properly aligned word in host byte order.
+ *
+ * The check for little-endian architectures that tolerate unaligned
+ * memory accesses is just an optimization.  Nothing will break if it
+ * doesn't work.
+ */
+#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
+#define SET(n) \
+	(*(MD5_u32plus *)&ptr[(n) * 4])
+#define GET(n) \
+	SET(n)
+#else
+#define SET(n) \
+	(ctx->block[(n)] = \
+	(MD5_u32plus)ptr[(n) * 4] | \
+	((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \
+	((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \
+	((MD5_u32plus)ptr[(n) * 4 + 3] << 24))
+#define GET(n) \
+	(ctx->block[(n)])
+#endif
+
+/*
+ * This processes one or more 64-byte data blocks, but does NOT update
+ * the bit counters.  There are no alignment requirements.
+ */
+static void *body(MD5_CTX *ctx, void *data, unsigned long size)
+{
+	unsigned char *ptr;
+	MD5_u32plus a, b, c, d;
+	MD5_u32plus saved_a, saved_b, saved_c, saved_d;
+
+	ptr = (unsigned char *)data;
+
+	a = ctx->a;
+	b = ctx->b;
+	c = ctx->c;
+	d = ctx->d;
+
+	do {
+		saved_a = a;
+		saved_b = b;
+		saved_c = c;
+		saved_d = d;
+
+/* Round 1 */
+		STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
+		STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
+		STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
+		STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
+		STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
+		STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
+		STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
+		STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
+		STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
+		STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
+		STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
+		STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
+		STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
+		STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
+		STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
+		STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
+
+/* Round 2 */
+		STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
+		STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
+		STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
+		STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
+		STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
+		STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
+		STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
+		STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
+		STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
+		STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
+		STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
+		STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
+		STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
+		STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
+		STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
+		STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
+
+/* Round 3 */
+		STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
+		STEP(H, d, a, b, c, GET(8), 0x8771f681, 11)
+		STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
+		STEP(H, b, c, d, a, GET(14), 0xfde5380c, 23)
+		STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
+		STEP(H, d, a, b, c, GET(4), 0x4bdecfa9, 11)
+		STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
+		STEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23)
+		STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
+		STEP(H, d, a, b, c, GET(0), 0xeaa127fa, 11)
+		STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
+		STEP(H, b, c, d, a, GET(6), 0x04881d05, 23)
+		STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
+		STEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11)
+		STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
+		STEP(H, b, c, d, a, GET(2), 0xc4ac5665, 23)
+
+/* Round 4 */
+		STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
+		STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
+		STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
+		STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
+		STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
+		STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
+		STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
+		STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
+		STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
+		STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
+		STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
+		STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
+		STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
+		STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
+		STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
+		STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
+
+		a += saved_a;
+		b += saved_b;
+		c += saved_c;
+		d += saved_d;
+
+		ptr += 64;
+	} while (size -= 64);
+
+	ctx->a = a;
+	ctx->b = b;
+	ctx->c = c;
+	ctx->d = d;
+
+	return ptr;
+}
+
+void MD5_Init(MD5_CTX *ctx)
+{
+	ctx->a = 0x67452301;
+	ctx->b = 0xefcdab89;
+	ctx->c = 0x98badcfe;
+	ctx->d = 0x10325476;
+
+	ctx->lo = 0;
+	ctx->hi = 0;
+}
+
+void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size)
+{
+	MD5_u32plus saved_lo;
+	unsigned long used, free;
+
+	saved_lo = ctx->lo;
+	if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
+		ctx->hi++;
+	ctx->hi += size >> 29;
+
+	used = saved_lo & 0x3f;
+
+	if (used) {
+		free = 64 - used;
+
+		if (size < free) {
+			memcpy(&ctx->buffer[used], data, size);
+			return;
+		}
+
+		memcpy(&ctx->buffer[used], data, free);
+		data = (unsigned char *)data + free;
+		size -= free;
+		body(ctx, ctx->buffer, 64);
+	}
+
+	if (size >= 64) {
+		data = body(ctx, data, size & ~(unsigned long)0x3f);
+		size &= 0x3f;
+	}
+
+	memcpy(ctx->buffer, data, size);
+}
+
+void MD5_Final(unsigned char *result, MD5_CTX *ctx)
+{
+	unsigned long used, free;
+
+	used = ctx->lo & 0x3f;
+
+	ctx->buffer[used++] = 0x80;
+
+	free = 64 - used;
+
+	if (free < 8) {
+		memset(&ctx->buffer[used], 0, free);
+		body(ctx, ctx->buffer, 64);
+		used = 0;
+		free = 64;
+	}
+
+	memset(&ctx->buffer[used], 0, free - 8);
+
+	ctx->lo <<= 3;
+	ctx->buffer[56] = ctx->lo;
+	ctx->buffer[57] = ctx->lo >> 8;
+	ctx->buffer[58] = ctx->lo >> 16;
+	ctx->buffer[59] = ctx->lo >> 24;
+	ctx->buffer[60] = ctx->hi;
+	ctx->buffer[61] = ctx->hi >> 8;
+	ctx->buffer[62] = ctx->hi >> 16;
+	ctx->buffer[63] = ctx->hi >> 24;
+
+	body(ctx, ctx->buffer, 64);
+
+	result[0] = ctx->a;
+	result[1] = ctx->a >> 8;
+	result[2] = ctx->a >> 16;
+	result[3] = ctx->a >> 24;
+	result[4] = ctx->b;
+	result[5] = ctx->b >> 8;
+	result[6] = ctx->b >> 16;
+	result[7] = ctx->b >> 24;
+	result[8] = ctx->c;
+	result[9] = ctx->c >> 8;
+	result[10] = ctx->c >> 16;
+	result[11] = ctx->c >> 24;
+	result[12] = ctx->d;
+	result[13] = ctx->d >> 8;
+	result[14] = ctx->d >> 16;
+	result[15] = ctx->d >> 24;
+
+	memset(ctx, 0, sizeof(*ctx));
+}
+
+#endif
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.h
new file mode 100644
index 0000000..f1a6857
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.h
@@ -0,0 +1,45 @@
+/*
+ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
+ * MD5 Message-Digest Algorithm (RFC 1321).
+ *
+ * Homepage:
+ * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
+ *
+ * Author:
+ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
+ *
+ * This software was written by Alexander Peslyak in 2001.  No copyright is
+ * claimed, and the software is hereby placed in the public domain.
+ * In case this attempt to disclaim copyright and place the software in the
+ * public domain is deemed null and void, then the software is
+ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
+ * general public under the following terms:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted.
+ *
+ * There's ABSOLUTELY NO WARRANTY, express or implied.
+ *
+ * See md5.c for more information.
+ */
+
+#ifdef HAVE_OPENSSL
+#include <openssl/md5.h>
+#elif !defined(_MD5_H)
+#define _MD5_H
+
+/* Any 32-bit or wider unsigned integer data type will do */
+typedef unsigned int MD5_u32plus;
+
+typedef struct {
+	MD5_u32plus lo, hi;
+	MD5_u32plus a, b, c, d;
+	unsigned char buffer[64];
+	MD5_u32plus block[16];
+} MD5_CTX;
+
+extern void MD5_Init(MD5_CTX *ctx);
+extern void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size);
+extern void MD5_Final(unsigned char *result, MD5_CTX *ctx);
+
+#endif
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/rules.mk
new file mode 100644
index 0000000..e932191
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/rules.mk
@@ -0,0 +1,99 @@
+#
+# FreeType 2 base layer configuration rules
+#
+
+
+# Copyright 1996-2000, 2002-2009, 2013 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# It sets the following variables which are used by the master Makefile
+# after the call:
+#
+#   BASE_OBJ_S:   The single-object base layer.
+#   BASE_OBJ_M:   A list of all objects for a multiple-objects build.
+#   BASE_EXT_OBJ: A list of base layer extensions, i.e., components found
+#                 in `freetype/src/base' which are not compiled within the
+#                 base layer proper.
+
+
+BASE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SRC_DIR)/base)
+
+
+# Base layer sources
+#
+#   ftsystem, ftinit, and ftdebug are handled by freetype.mk
+#
+# All files listed here should be included in `ftbase.c' (for a `single'
+# build).
+#
+BASE_SRC := $(BASE_DIR)/ftadvanc.c \
+            $(BASE_DIR)/ftcalc.c   \
+            $(BASE_DIR)/ftdbgmem.c \
+            $(BASE_DIR)/ftgloadr.c \
+            $(BASE_DIR)/ftobjs.c   \
+            $(BASE_DIR)/ftoutln.c  \
+            $(BASE_DIR)/ftrfork.c  \
+            $(BASE_DIR)/ftsnames.c \
+            $(BASE_DIR)/ftstream.c \
+            $(BASE_DIR)/fttrigon.c \
+            $(BASE_DIR)/ftutil.c
+
+
+ifneq ($(ftmac_c),)
+  BASE_SRC += $(BASE_DIR)/$(ftmac_c)
+endif
+
+# for simplicity, we also handle `md5.c' (which gets included by `ftobjs.h')
+BASE_H := $(BASE_DIR)/ftbase.h \
+          $(BASE_DIR)/md5.c    \
+          $(BASE_DIR)/md5.h
+
+# Base layer `extensions' sources
+#
+# An extension is added to the library file as a separate object.  It is
+# then linked to the final executable only if one of its symbols is used by
+# the application.
+#
+BASE_EXT_SRC := $(patsubst %,$(BASE_DIR)/%,$(BASE_EXTENSIONS))
+
+# Default extensions objects
+#
+BASE_EXT_OBJ := $(BASE_EXT_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O)
+
+
+# Base layer object(s)
+#
+#   BASE_OBJ_M is used during `multi' builds (each base source file compiles
+#   to a single object file).
+#
+#   BASE_OBJ_S is used during `single' builds (the whole base layer is
+#   compiled as a single object file using ftbase.c).
+#
+BASE_OBJ_M := $(BASE_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O)
+BASE_OBJ_S := $(OBJ_DIR)/ftbase.$O
+
+# Base layer root source file for single build
+#
+BASE_SRC_S := $(BASE_DIR)/ftbase.c
+
+
+# Base layer - single object build
+#
+$(BASE_OBJ_S): $(BASE_SRC_S) $(BASE_SRC) $(FREETYPE_H) $(BASE_H)
+	$(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BASE_SRC_S))
+
+
+# Multiple objects build + extensions
+#
+$(OBJ_DIR)/%.$O: $(BASE_DIR)/%.c $(FREETYPE_H) $(BASE_H)
+	$(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/Jamfile
new file mode 100644
index 0000000..6705d3c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/cff Jamfile
+#
+# Copyright 2001, 2002 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) cff ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = cffdrivr cffgload cffload cffobjs cffparse cffcmap cffpic ;
+  }
+  else
+  {
+    _sources = cff ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/cff Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.c
new file mode 100644
index 0000000..fa967eb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.c
@@ -0,0 +1,241 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2arrst.c                                                             */
+/*                                                                         */
+/*    Adobe's code for Array Stacks (body).                                */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+#include "cf2arrst.h"
+
+#include "cf2error.h"
+
+
+  /*
+   * CF2_ArrStack uses an error pointer, to enable shared errors.
+   * Shared errors are necessary when multiple objects allow the program
+   * to continue after detecting errors.  Only the first error should be
+   * recorded.
+   */
+
+  FT_LOCAL_DEF( void )
+  cf2_arrstack_init( CF2_ArrStack  arrstack,
+                     FT_Memory     memory,
+                     FT_Error*     error,
+                     size_t        sizeItem )
+  {
+    FT_ASSERT( arrstack != NULL );
+
+    /* initialize the structure */
+    arrstack->memory    = memory;
+    arrstack->error     = error;
+    arrstack->sizeItem  = sizeItem;
+    arrstack->allocated = 0;
+    arrstack->chunk     = 10;    /* chunks of 10 items */
+    arrstack->count     = 0;
+    arrstack->totalSize = 0;
+    arrstack->ptr       = NULL;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_arrstack_finalize( CF2_ArrStack  arrstack )
+  {
+    FT_Memory  memory = arrstack->memory;     /* for FT_FREE */
+
+
+    FT_ASSERT( arrstack != NULL );
+
+    arrstack->allocated = 0;
+    arrstack->count     = 0;
+    arrstack->totalSize = 0;
+
+    /* free the data buffer */
+    FT_FREE( arrstack->ptr );
+  }
+
+
+  /* allocate or reallocate the buffer size; */
+  /* return false on memory error */
+  static FT_Bool
+  cf2_arrstack_setNumElements( CF2_ArrStack  arrstack,
+                               size_t        numElements )
+  {
+    FT_ASSERT( arrstack != NULL );
+
+    {
+      FT_Error   error  = FT_Err_Ok;        /* for FT_REALLOC */
+      FT_Memory  memory = arrstack->memory; /* for FT_REALLOC */
+
+      FT_Long  newSize = (FT_Long)( numElements * arrstack->sizeItem );
+
+
+      if ( numElements > LONG_MAX / arrstack->sizeItem )
+        goto exit;
+
+
+      FT_ASSERT( newSize > 0 );   /* avoid realloc with zero size */
+
+      if ( !FT_REALLOC( arrstack->ptr, arrstack->totalSize, newSize ) )
+      {
+        arrstack->allocated = numElements;
+        arrstack->totalSize = newSize;
+
+        if ( arrstack->count > numElements )
+        {
+          /* we truncated the list! */
+          CF2_SET_ERROR( arrstack->error, Stack_Overflow );
+          arrstack->count = numElements;
+          return FALSE;
+        }
+
+        return TRUE;     /* success */
+      }
+    }
+
+  exit:
+    /* if there's not already an error, store this one */
+    CF2_SET_ERROR( arrstack->error, Out_Of_Memory );
+
+    return FALSE;
+  }
+
+
+  /* set the count, ensuring allocation is sufficient */
+  FT_LOCAL_DEF( void )
+  cf2_arrstack_setCount( CF2_ArrStack  arrstack,
+                         size_t        numElements )
+  {
+    FT_ASSERT( arrstack != NULL );
+
+    if ( numElements > arrstack->allocated )
+    {
+      /* expand the allocation first */
+      if ( !cf2_arrstack_setNumElements( arrstack, numElements ) )
+        return;
+    }
+
+    arrstack->count = numElements;
+  }
+
+
+  /* clear the count */
+  FT_LOCAL_DEF( void )
+  cf2_arrstack_clear( CF2_ArrStack  arrstack )
+  {
+    FT_ASSERT( arrstack != NULL );
+
+    arrstack->count = 0;
+  }
+
+
+  /* current number of items */
+  FT_LOCAL_DEF( size_t )
+  cf2_arrstack_size( const CF2_ArrStack  arrstack )
+  {
+    FT_ASSERT( arrstack != NULL );
+
+    return arrstack->count;
+  }
+
+
+  FT_LOCAL_DEF( void* )
+  cf2_arrstack_getBuffer( const CF2_ArrStack  arrstack )
+  {
+    FT_ASSERT( arrstack != NULL );
+
+    return arrstack->ptr;
+  }
+
+
+  /* return pointer to the given element */
+  FT_LOCAL_DEF( void* )
+  cf2_arrstack_getPointer( const CF2_ArrStack  arrstack,
+                           size_t              idx )
+  {
+    void*  newPtr;
+
+
+    FT_ASSERT( arrstack != NULL );
+
+    if ( idx >= arrstack->count )
+    {
+      /* overflow */
+      CF2_SET_ERROR( arrstack->error, Stack_Overflow );
+      idx = 0;    /* choose safe default */
+    }
+
+    newPtr = (FT_Byte*)arrstack->ptr + idx * arrstack->sizeItem;
+
+    return newPtr;
+  }
+
+
+  /* push (append) an element at the end of the list;         */
+  /* return false on memory error                             */
+  /* TODO: should there be a length param for extra checking? */
+  FT_LOCAL_DEF( void )
+  cf2_arrstack_push( CF2_ArrStack  arrstack,
+                     const void*   ptr )
+  {
+    FT_ASSERT( arrstack != NULL );
+
+    if ( arrstack->count == arrstack->allocated )
+    {
+      /* grow the buffer by one chunk */
+      if ( !cf2_arrstack_setNumElements(
+             arrstack, arrstack->allocated + arrstack->chunk ) )
+      {
+        /* on error, ignore the push */
+        return;
+      }
+    }
+
+    FT_ASSERT( ptr != NULL );
+
+    {
+      size_t  offset = arrstack->count * arrstack->sizeItem;
+      void*   newPtr = (FT_Byte*)arrstack->ptr + offset;
+
+
+      FT_MEM_COPY( newPtr, ptr, arrstack->sizeItem );
+      arrstack->count += 1;
+    }
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.h
new file mode 100644
index 0000000..ff5ad8b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.h
@@ -0,0 +1,100 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2arrst.h                                                             */
+/*                                                                         */
+/*    Adobe's code for Array Stacks (specification).                       */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CF2ARRST_H__
+#define __CF2ARRST_H__
+
+
+#include "cf2error.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* need to define the struct here (not opaque) so it can be allocated by */
+  /* clients                                                               */
+  typedef struct  CF2_ArrStackRec_
+  {
+    FT_Memory  memory;
+    FT_Error*  error;
+
+    size_t  sizeItem;       /* bytes per element             */
+    size_t  allocated;      /* items allocated               */
+    size_t  chunk;          /* allocation increment in items */
+    size_t  count;          /* number of elements allocated  */
+    size_t  totalSize;      /* total bytes allocated         */
+
+    void*  ptr;             /* ptr to data                   */
+
+  } CF2_ArrStackRec, *CF2_ArrStack;
+
+
+  FT_LOCAL( void )
+  cf2_arrstack_init( CF2_ArrStack  arrstack,
+                     FT_Memory     memory,
+                     FT_Error*     error,
+                     size_t        sizeItem );
+  FT_LOCAL( void )
+  cf2_arrstack_finalize( CF2_ArrStack  arrstack );
+
+  FT_LOCAL( void )
+  cf2_arrstack_setCount( CF2_ArrStack  arrstack,
+                         size_t        numElements );
+  FT_LOCAL( void )
+  cf2_arrstack_clear( CF2_ArrStack  arrstack );
+  FT_LOCAL( size_t )
+  cf2_arrstack_size( const CF2_ArrStack  arrstack );
+
+  FT_LOCAL( void* )
+  cf2_arrstack_getBuffer( const CF2_ArrStack  arrstack );
+  FT_LOCAL( void* )
+  cf2_arrstack_getPointer( const CF2_ArrStack  arrstack,
+                           size_t              idx );
+
+  FT_LOCAL( void )
+  cf2_arrstack_push( CF2_ArrStack  arrstack,
+                     const void*   ptr );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2ARRST_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.c
new file mode 100644
index 0000000..8294342
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.c
@@ -0,0 +1,578 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2blues.c                                                             */
+/*                                                                         */
+/*    Adobe's code for handling Blue Zones (body).                         */
+/*                                                                         */
+/*  Copyright 2009-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2blues.h"
+#include "cf2hints.h"
+#include "cf2font.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cf2blues
+
+
+  /*
+   * For blue values, the FreeType parser produces an array of integers,
+   * while the Adobe CFF engine produces an array of fixed.
+   * Define a macro to convert FreeType to fixed.
+   */
+#define cf2_blueToFixed( x )  cf2_intToFixed( x )
+
+
+  FT_LOCAL_DEF( void )
+  cf2_blues_init( CF2_Blues  blues,
+                  CF2_Font   font )
+  {
+    /* pointer to parsed font object */
+    CFF_Decoder*  decoder = font->decoder;
+
+    CF2_Fixed  zoneHeight;
+    CF2_Fixed  maxZoneHeight = 0;
+    CF2_Fixed  csUnitsPerPixel;
+
+    size_t  numBlueValues;
+    size_t  numOtherBlues;
+    size_t  numFamilyBlues;
+    size_t  numFamilyOtherBlues;
+
+    FT_Pos*  blueValues;
+    FT_Pos*  otherBlues;
+    FT_Pos*  familyBlues;
+    FT_Pos*  familyOtherBlues;
+
+    size_t     i;
+    CF2_Fixed  emBoxBottom, emBoxTop;
+
+    CF2_Int  unitsPerEm = font->unitsPerEm;
+
+
+    if ( unitsPerEm == 0 )
+      unitsPerEm = 1000;
+
+    FT_ZERO( blues );
+    blues->scale = font->innerTransform.d;
+
+    cf2_getBlueMetrics( decoder,
+                        &blues->blueScale,
+                        &blues->blueShift,
+                        &blues->blueFuzz );
+
+    cf2_getBlueValues( decoder, &numBlueValues, &blueValues );
+    cf2_getOtherBlues( decoder, &numOtherBlues, &otherBlues );
+    cf2_getFamilyBlues( decoder, &numFamilyBlues, &familyBlues );
+    cf2_getFamilyOtherBlues( decoder, &numFamilyOtherBlues, &familyOtherBlues );
+
+    /*
+     * synthetic em box hint heuristic
+     *
+     * Apply this when ideographic dictionary (LanguageGroup 1) has no
+     * real alignment zones.  Adobe tools generate dummy zones at -250 and
+     * 1100 for a 1000 unit em.  Fonts with ICF-based alignment zones
+     * should not enable the heuristic.  When the heuristic is enabled,
+     * the font's blue zones are ignored.
+     *
+     */
+
+    /* get em box from OS/2 typoAscender/Descender                      */
+    /* TODO: FreeType does not parse these metrics.  Skip them for now. */
+#if 0
+    FCM_getHorizontalLineMetrics( &e,
+                                  font->font,
+                                  &ascender,
+                                  &descender,
+                                  &linegap );
+    if ( ascender - descender == unitsPerEm )
+    {
+      emBoxBottom = cf2_intToFixed( descender );
+      emBoxTop    = cf2_intToFixed( ascender );
+    }
+    else
+#endif
+    {
+      emBoxBottom = CF2_ICF_Bottom;
+      emBoxTop    = CF2_ICF_Top;
+    }
+
+    if ( cf2_getLanguageGroup( decoder ) == 1                   &&
+         ( numBlueValues == 0                                 ||
+           ( numBlueValues == 4                             &&
+             cf2_blueToFixed( blueValues[0] ) < emBoxBottom &&
+             cf2_blueToFixed( blueValues[1] ) < emBoxBottom &&
+             cf2_blueToFixed( blueValues[2] ) > emBoxTop    &&
+             cf2_blueToFixed( blueValues[3] ) > emBoxTop    ) ) )
+    {
+      /*
+       * Construct hint edges suitable for synthetic ghost hints at top
+       * and bottom of em box.  +-CF2_MIN_COUNTER allows for unhinted
+       * features above or below the last hinted edge.  This also gives a
+       * net 1 pixel boost to the height of ideographic glyphs.
+       *
+       * Note: Adjust synthetic hints outward by epsilon (0x.0001) to
+       *       avoid interference.  E.g., some fonts have real hints at
+       *       880 and -120.
+       */
+
+      blues->emBoxBottomEdge.csCoord = emBoxBottom - CF2_FIXED_EPSILON;
+      blues->emBoxBottomEdge.dsCoord = cf2_fixedRound(
+                                         FT_MulFix(
+                                           blues->emBoxBottomEdge.csCoord,
+                                           blues->scale ) ) -
+                                       CF2_MIN_COUNTER;
+      blues->emBoxBottomEdge.scale   = blues->scale;
+      blues->emBoxBottomEdge.flags   = CF2_GhostBottom |
+                                       CF2_Locked |
+                                       CF2_Synthetic;
+
+      blues->emBoxTopEdge.csCoord = emBoxTop + CF2_FIXED_EPSILON +
+                                    2 * font->darkenY;
+      blues->emBoxTopEdge.dsCoord = cf2_fixedRound(
+                                      FT_MulFix(
+                                        blues->emBoxTopEdge.csCoord,
+                                        blues->scale ) ) +
+                                    CF2_MIN_COUNTER;
+      blues->emBoxTopEdge.scale   = blues->scale;
+      blues->emBoxTopEdge.flags   = CF2_GhostTop |
+                                    CF2_Locked |
+                                    CF2_Synthetic;
+
+      blues->doEmBoxHints = TRUE;    /* enable the heuristic */
+
+      return;
+    }
+
+    /* copy `BlueValues' and `OtherBlues' to a combined array of top and */
+    /* bottom zones                                                      */
+    for ( i = 0; i < numBlueValues; i += 2 )
+    {
+      blues->zone[blues->count].csBottomEdge =
+        cf2_blueToFixed( blueValues[i] );
+      blues->zone[blues->count].csTopEdge =
+        cf2_blueToFixed( blueValues[i + 1] );
+
+      zoneHeight = blues->zone[blues->count].csTopEdge -
+                   blues->zone[blues->count].csBottomEdge;
+
+      if ( zoneHeight < 0 )
+      {
+        FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" ));
+        continue;   /* reject this zone */
+      }
+
+      if ( zoneHeight > maxZoneHeight )
+      {
+        /* take maximum before darkening adjustment      */
+        /* so overshoot suppression point doesn't change */
+        maxZoneHeight = zoneHeight;
+      }
+
+      /* adjust both edges of top zone upward by twice darkening amount */
+      if ( i != 0 )
+      {
+        blues->zone[blues->count].csTopEdge    += 2 * font->darkenY;
+        blues->zone[blues->count].csBottomEdge += 2 * font->darkenY;
+      }
+
+      /* first `BlueValue' is bottom zone; others are top */
+      if ( i == 0 )
+      {
+        blues->zone[blues->count].bottomZone =
+          TRUE;
+        blues->zone[blues->count].csFlatEdge =
+          blues->zone[blues->count].csTopEdge;
+      }
+      else
+      {
+        blues->zone[blues->count].bottomZone =
+          FALSE;
+        blues->zone[blues->count].csFlatEdge =
+          blues->zone[blues->count].csBottomEdge;
+      }
+
+      blues->count += 1;
+    }
+
+    for ( i = 0; i < numOtherBlues; i += 2 )
+    {
+      blues->zone[blues->count].csBottomEdge =
+        cf2_blueToFixed( otherBlues[i] );
+      blues->zone[blues->count].csTopEdge =
+        cf2_blueToFixed( otherBlues[i + 1] );
+
+      zoneHeight = blues->zone[blues->count].csTopEdge -
+                   blues->zone[blues->count].csBottomEdge;
+
+      if ( zoneHeight < 0 )
+      {
+        FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" ));
+        continue;   /* reject this zone */
+      }
+
+      if ( zoneHeight > maxZoneHeight )
+      {
+        /* take maximum before darkening adjustment      */
+        /* so overshoot suppression point doesn't change */
+        maxZoneHeight = zoneHeight;
+      }
+
+      /* Note: bottom zones are not adjusted for darkening amount */
+
+      /* all OtherBlues are bottom zone */
+      blues->zone[blues->count].bottomZone =
+        TRUE;
+      blues->zone[blues->count].csFlatEdge =
+        blues->zone[blues->count].csTopEdge;
+
+      blues->count += 1;
+    }
+
+    /* Adjust for FamilyBlues */
+
+    /* Search for the nearest flat edge in `FamilyBlues' or                */
+    /* `FamilyOtherBlues'.  According to the Black Book, any matching edge */
+    /* must be within one device pixel                                     */
+
+    csUnitsPerPixel = FT_DivFix( cf2_intToFixed( 1 ), blues->scale );
+
+    /* loop on all zones in this font */
+    for ( i = 0; i < blues->count; i++ )
+    {
+      size_t     j;
+      CF2_Fixed  minDiff;
+      CF2_Fixed  flatFamilyEdge, diff;
+      /* value for this font */
+      CF2_Fixed  flatEdge = blues->zone[i].csFlatEdge;
+
+
+      if ( blues->zone[i].bottomZone )
+      {
+        /* In a bottom zone, the top edge is the flat edge.             */
+        /* Search `FamilyOtherBlues' for bottom zones; look for closest */
+        /* Family edge that is within the one pixel threshold.          */
+
+        minDiff = CF2_FIXED_MAX;
+
+        for ( j = 0; j < numFamilyOtherBlues; j += 2 )
+        {
+          /* top edge */
+          flatFamilyEdge = cf2_blueToFixed( familyOtherBlues[j + 1] );
+
+          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+
+          if ( diff < minDiff && diff < csUnitsPerPixel )
+          {
+            blues->zone[i].csFlatEdge = flatFamilyEdge;
+            minDiff                   = diff;
+
+            if ( diff == 0 )
+              break;
+          }
+        }
+
+        /* check the first member of FamilyBlues, which is a bottom zone */
+        if ( numFamilyBlues >= 2 )
+        {
+          /* top edge */
+          flatFamilyEdge = cf2_blueToFixed( familyBlues[1] );
+
+          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+
+          if ( diff < minDiff && diff < csUnitsPerPixel )
+            blues->zone[i].csFlatEdge = flatFamilyEdge;
+        }
+      }
+      else
+      {
+        /* In a top zone, the bottom edge is the flat edge.                */
+        /* Search `FamilyBlues' for top zones; skip first zone, which is a */
+        /* bottom zone; look for closest Family edge that is within the    */
+        /* one pixel threshold                                             */
+
+        minDiff = CF2_FIXED_MAX;
+
+        for ( j = 2; j < numFamilyBlues; j += 2 )
+        {
+          /* bottom edge */
+          flatFamilyEdge = cf2_blueToFixed( familyBlues[j] );
+
+          /* adjust edges of top zone upward by twice darkening amount */
+          flatFamilyEdge += 2 * font->darkenY;      /* bottom edge */
+
+          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+
+          if ( diff < minDiff && diff < csUnitsPerPixel )
+          {
+            blues->zone[i].csFlatEdge = flatFamilyEdge;
+            minDiff                   = diff;
+
+            if ( diff == 0 )
+              break;
+          }
+        }
+      }
+    }
+
+    /* TODO: enforce separation of zones, including BlueFuzz */
+
+    /* Adjust BlueScale; similar to AdjustBlueScale() in coretype */
+    /* `bcsetup.c'.                                               */
+
+    if ( maxZoneHeight > 0 )
+    {
+      if ( blues->blueScale > FT_DivFix( cf2_intToFixed( 1 ),
+                                         maxZoneHeight ) )
+      {
+        /* clamp at maximum scale */
+        blues->blueScale = FT_DivFix( cf2_intToFixed( 1 ),
+                                      maxZoneHeight );
+      }
+
+      /*
+       * TODO: Revisit the bug fix for 613448.  The minimum scale
+       *       requirement catches a number of library fonts.  For
+       *       example, with default BlueScale (.039625) and 0.4 minimum,
+       *       the test below catches any font with maxZoneHeight < 10.1.
+       *       There are library fonts ranging from 2 to 10 that get
+       *       caught, including e.g., Eurostile LT Std Medium with
+       *       maxZoneHeight of 6.
+       *
+       */
+#if 0
+      if ( blueScale < .4 / maxZoneHeight )
+      {
+        tetraphilia_assert( 0 );
+        /* clamp at minimum scale, per bug 0613448 fix */
+        blueScale = .4 / maxZoneHeight;
+      }
+#endif
+
+    }
+
+    /*
+     * Suppress overshoot and boost blue zones at small sizes.  Boost
+     * amount varies linearly from 0.5 pixel near 0 to 0 pixel at
+     * blueScale cutoff.
+     * Note: This boost amount is different from the coretype heuristic.
+     *
+     */
+
+    if ( blues->scale < blues->blueScale )
+    {
+      blues->suppressOvershoot = TRUE;
+
+      /* Change rounding threshold for `dsFlatEdge'.                    */
+      /* Note: constant changed from 0.5 to 0.6 to avoid a problem with */
+      /*       10ppem Arial                                             */
+
+      blues->boost = FT_MulFix(
+                       cf2_floatToFixed( .6 ),
+                       ( cf2_intToFixed( 1 ) -
+                         FT_DivFix( blues->scale,
+                                    blues->blueScale ) ) );
+      if ( blues->boost > 0x7FFF )
+      {
+        /* boost must remain less than 0.5, or baseline could go negative */
+        blues->boost = 0x7FFF;
+      }
+    }
+
+    /* boost and darkening have similar effects; don't do both */
+    if ( font->stemDarkened )
+      blues->boost = 0;
+
+    /* set device space alignment for each zone;    */
+    /* apply boost amount before rounding flat edge */
+
+    for ( i = 0; i < blues->count; i++ )
+    {
+      if ( blues->zone[i].bottomZone )
+        blues->zone[i].dsFlatEdge = cf2_fixedRound(
+                                      FT_MulFix(
+                                        blues->zone[i].csFlatEdge,
+                                        blues->scale ) -
+                                      blues->boost );
+      else
+        blues->zone[i].dsFlatEdge = cf2_fixedRound(
+                                      FT_MulFix(
+                                        blues->zone[i].csFlatEdge,
+                                        blues->scale ) +
+                                      blues->boost );
+    }
+  }
+
+
+  /*
+   * Check whether `stemHint' is captured by one of the blue zones.
+   *
+   * Zero, one or both edges may be valid; only valid edges can be
+   * captured.  For compatibility with CoolType, search top and bottom
+   * zones in the same pass (see `BlueLock').  If a hint is captured,
+   * return true and position the edge(s) in one of 3 ways:
+   *
+   *  1) If `BlueScale' suppresses overshoot, position the captured edge
+   *     at the flat edge of the zone.
+   *  2) If overshoot is not suppressed and `BlueShift' requires
+   *     overshoot, position the captured edge a minimum of 1 device pixel
+   *     from the flat edge.
+   *  3) If overshoot is not suppressed or required, position the captured
+   *     edge at the nearest device pixel.
+   *
+   */
+  FT_LOCAL_DEF( FT_Bool )
+  cf2_blues_capture( const CF2_Blues  blues,
+                     CF2_Hint         bottomHintEdge,
+                     CF2_Hint         topHintEdge )
+  {
+    /* TODO: validate? */
+    CF2_Fixed  csFuzz = blues->blueFuzz;
+
+    /* new position of captured edge */
+    CF2_Fixed  dsNew;
+
+    /* amount that hint is moved when positioned */
+    CF2_Fixed  dsMove = 0;
+
+    FT_Bool   captured = FALSE;
+    CF2_UInt  i;
+
+
+    /* assert edge flags are consistent */
+    FT_ASSERT( !cf2_hint_isTop( bottomHintEdge ) &&
+               !cf2_hint_isBottom( topHintEdge ) );
+
+    /* TODO: search once without blue fuzz for compatibility with coretype? */
+    for ( i = 0; i < blues->count; i++ )
+    {
+      if ( blues->zone[i].bottomZone           &&
+           cf2_hint_isBottom( bottomHintEdge ) )
+      {
+        if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=
+               bottomHintEdge->csCoord                   &&
+             bottomHintEdge->csCoord <=
+               ( blues->zone[i].csTopEdge + csFuzz )     )
+        {
+          /* bottom edge captured by bottom zone */
+
+          if ( blues->suppressOvershoot )
+            dsNew = blues->zone[i].dsFlatEdge;
+
+          else if ( ( blues->zone[i].csTopEdge - bottomHintEdge->csCoord ) >=
+                      blues->blueShift )
+          {
+            /* guarantee minimum of 1 pixel overshoot */
+            dsNew = FT_MIN(
+                      cf2_fixedRound( bottomHintEdge->dsCoord ),
+                      blues->zone[i].dsFlatEdge - cf2_intToFixed( 1 ) );
+          }
+
+          else
+          {
+            /* simply round captured edge */
+            dsNew = cf2_fixedRound( bottomHintEdge->dsCoord );
+          }
+
+          dsMove   = dsNew - bottomHintEdge->dsCoord;
+          captured = TRUE;
+
+          break;
+        }
+      }
+
+      if ( !blues->zone[i].bottomZone && cf2_hint_isTop( topHintEdge ) )
+      {
+        if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=
+               topHintEdge->csCoord                      &&
+             topHintEdge->csCoord <=
+               ( blues->zone[i].csTopEdge + csFuzz )     )
+        {
+          /* top edge captured by top zone */
+
+          if ( blues->suppressOvershoot )
+            dsNew = blues->zone[i].dsFlatEdge;
+
+          else if ( ( topHintEdge->csCoord - blues->zone[i].csBottomEdge ) >=
+                      blues->blueShift )
+          {
+            /* guarantee minimum of 1 pixel overshoot */
+            dsNew = FT_MAX(
+                      cf2_fixedRound( topHintEdge->dsCoord ),
+                      blues->zone[i].dsFlatEdge + cf2_intToFixed( 1 ) );
+          }
+
+          else
+          {
+            /* simply round captured edge */
+            dsNew = cf2_fixedRound( topHintEdge->dsCoord );
+          }
+
+          dsMove   = dsNew - topHintEdge->dsCoord;
+          captured = TRUE;
+
+          break;
+        }
+      }
+    }
+
+    if ( captured )
+    {
+      /* move both edges and flag them `locked' */
+      if ( cf2_hint_isValid( bottomHintEdge ) )
+      {
+        bottomHintEdge->dsCoord += dsMove;
+        cf2_hint_lock( bottomHintEdge );
+      }
+
+      if ( cf2_hint_isValid( topHintEdge ) )
+      {
+        topHintEdge->dsCoord += dsMove;
+        cf2_hint_lock( topHintEdge );
+      }
+    }
+
+    return captured;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.h
new file mode 100644
index 0000000..2f38fca
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.h
@@ -0,0 +1,185 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2blues.h                                                             */
+/*                                                                         */
+/*    Adobe's code for handling Blue Zones (specification).                */
+/*                                                                         */
+/*  Copyright 2009-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*
+   * A `CF2_Blues' object stores the blue zones (horizontal alignment
+   * zones) of a font.  These are specified in the CFF private dictionary
+   * by `BlueValues', `OtherBlues', `FamilyBlues', and `FamilyOtherBlues'.
+   * Each zone is defined by a top and bottom edge in character space.
+   * Further, each zone is either a top zone or a bottom zone, as recorded
+   * by `bottomZone'.
+   *
+   * The maximum number of `BlueValues' and `FamilyBlues' is 7 each.
+   * However, these are combined to produce a total of 7 zones.
+   * Similarly, the maximum number of `OtherBlues' and `FamilyOtherBlues'
+   * is 5 and these are combined to produce an additional 5 zones.
+   *
+   * Blue zones are used to `capture' hints and force them to a common
+   * alignment point.  This alignment is recorded in device space in
+   * `dsFlatEdge'.  Except for this value, a `CF2_Blues' object could be
+   * constructed independently of scaling.  Construction may occur once
+   * the matrix is known.  Other features implemented in the Capture
+   * method are overshoot suppression, overshoot enforcement, and Blue
+   * Boost.
+   *
+   * Capture is determined by `BlueValues' and `OtherBlues', but the
+   * alignment point may be adjusted to the scaled flat edge of
+   * `FamilyBlues' or `FamilyOtherBlues'.  No alignment is done to the
+   * curved edge of a zone.
+   *
+   */
+
+
+#ifndef __CF2BLUES_H__
+#define __CF2BLUES_H__
+
+
+#include "cf2glue.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   * `CF2_Hint' is shared by `cf2hints.h' and
+   * `cf2blues.h', but `cf2blues.h' depends on
+   * `cf2hints.h', so define it here.  Note: The typedef is in
+   * `cf2glue.h'.
+   *
+   */
+  enum
+  {
+    CF2_GhostBottom = 0x1,  /* a single bottom edge           */
+    CF2_GhostTop    = 0x2,  /* a single top edge              */
+    CF2_PairBottom  = 0x4,  /* the bottom edge of a stem hint */
+    CF2_PairTop     = 0x8,  /* the top edge of a stem hint    */
+    CF2_Locked      = 0x10, /* this edge has been aligned     */
+                            /* by a blue zone                 */
+    CF2_Synthetic   = 0x20  /* this edge was synthesized      */
+  };
+
+
+  /*
+   * Default value for OS/2 typoAscender/Descender when their difference
+   * is not equal to `unitsPerEm'.  The default is based on -250 and 1100
+   * in `CF2_Blues', assuming 1000 units per em here.
+   *
+   */
+  enum
+  {
+    CF2_ICF_Top    = cf2_intToFixed(  880 ),
+    CF2_ICF_Bottom = cf2_intToFixed( -120 )
+  };
+
+
+  /*
+   * Constant used for hint adjustment and for synthetic em box hint
+   * placement.
+   */
+#define CF2_MIN_COUNTER  cf2_floatToFixed( 0.5 )
+
+
+  /* shared typedef is in cf2glue.h */
+  struct  CF2_HintRec_
+  {
+    CF2_UInt  flags;  /* attributes of the edge            */
+    size_t    index;  /* index in original stem hint array */
+                      /* (if not synthetic)                */
+    CF2_Fixed  csCoord;
+    CF2_Fixed  dsCoord;
+    CF2_Fixed  scale;
+  };
+
+
+  typedef struct  CF2_BlueRec_
+  {
+    CF2_Fixed  csBottomEdge;
+    CF2_Fixed  csTopEdge;
+    CF2_Fixed  csFlatEdge; /* may be from either local or Family zones */
+    CF2_Fixed  dsFlatEdge; /* top edge of bottom zone or bottom edge   */
+                           /* of top zone (rounded)                    */
+    FT_Bool  bottomZone;
+
+  } CF2_BlueRec;
+
+
+  /* max total blue zones is 12 */
+  enum
+  {
+    CF2_MAX_BLUES      = 7,
+    CF2_MAX_OTHERBLUES = 5
+  };
+
+
+  typedef struct  CF2_BluesRec_
+  {
+    CF2_Fixed  scale;
+    CF2_UInt   count;
+    FT_Bool    suppressOvershoot;
+    FT_Bool    doEmBoxHints;
+
+    CF2_Fixed  blueScale;
+    CF2_Fixed  blueShift;
+    CF2_Fixed  blueFuzz;
+
+    CF2_Fixed  boost;
+
+    CF2_HintRec  emBoxTopEdge;
+    CF2_HintRec  emBoxBottomEdge;
+
+    CF2_BlueRec  zone[CF2_MAX_BLUES + CF2_MAX_OTHERBLUES];
+
+  } CF2_BluesRec, *CF2_Blues;
+
+
+  FT_LOCAL( void )
+  cf2_blues_init( CF2_Blues  blues,
+                  CF2_Font   font );
+  FT_LOCAL( FT_Bool )
+  cf2_blues_capture( const CF2_Blues  blues,
+                     CF2_Hint         bottomHintEdge,
+                     CF2_Hint         topHintEdge );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2BLUES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.c
new file mode 100644
index 0000000..b5595a3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.c
@@ -0,0 +1,52 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2error.c                                                             */
+/*                                                                         */
+/*    Adobe's code for error handling (body).                              */
+/*                                                                         */
+/*  Copyright 2006-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "cf2error.h"
+
+
+  FT_LOCAL_DEF( void )
+  cf2_setError( FT_Error*  error,
+                FT_Error   value )
+  {
+    if ( error && *error == 0 )
+      *error = value;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.h
new file mode 100644
index 0000000..428775c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.h
@@ -0,0 +1,119 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2error.h                                                             */
+/*                                                                         */
+/*    Adobe's code for error handling (specification).                     */
+/*                                                                         */
+/*  Copyright 2006-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CF2ERROR_H__
+#define __CF2ERROR_H__
+
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  CF2_Err_
+#define FT_ERR_BASE    FT_Mod_Err_CF2
+
+
+#include "../../include/freetype/fterrors.h"
+#include "cf2ft.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   * A poor-man error facility.
+   *
+   * This code being written in vanilla C, doesn't have the luxury of a
+   * language-supported exception mechanism such as the one available in
+   * Java.  Instead, we are stuck with using error codes that must be
+   * carefully managed and preserved.  However, it is convenient for us to
+   * model our error mechanism on a Java-like exception mechanism.
+   * When we assign an error code we are thus `throwing' an error.
+   *
+   * The perservation of an error code is done by coding convention.
+   * Upon a function call if the error code is anything other than
+   * `FT_Err_Ok', which is guaranteed to be zero, we
+   * will return without altering that error.  This will allow the
+   * error to propogate and be handled at the appropriate location in
+   * the code.
+   *
+   * This allows a style of code where the error code is initialized
+   * up front and a block of calls are made with the error code only
+   * being checked after the block.  If a new error occurs, the original
+   * error will be preserved and a functional no-op should result in any
+   * subsequent function that has an initial error code not equal to
+   * `FT_Err_Ok'.
+   *
+   * Errors are encoded by calling the `FT_THROW' macro.  For example,
+   *
+   * {
+   *   FT_Error  e;
+   *
+   *
+   *   ...
+   *   e = FT_THROW( Out_Of_Memory );
+   * }
+   *
+   */
+
+
+  /* Set error code to a particular value. */
+  FT_LOCAL( void )
+  cf2_setError( FT_Error*  error,
+                FT_Error   value );
+
+
+  /*
+   * A macro that conditionally sets an error code.
+   *
+   * This macro will first check whether `error' is set;
+   * if not, it will set it to `e'.
+   *
+  */
+#define CF2_SET_ERROR( error, e )              \
+          cf2_setError( error, FT_THROW( e ) )
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2ERROR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2fixed.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2fixed.h
new file mode 100644
index 0000000..ed1452a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2fixed.h
@@ -0,0 +1,95 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2fixed.h                                                             */
+/*                                                                         */
+/*    Adobe's code for Fixed Point Mathematics (specification only).       */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CF2FIXED_H__
+#define __CF2FIXED_H__
+
+
+FT_BEGIN_HEADER
+
+
+  /* rasterizer integer and fixed point arithmetic must be 32-bit */
+
+#define   CF2_Fixed  CF2_F16Dot16
+  typedef FT_Int32   CF2_Frac;   /* 2.30 fixed point */
+
+
+#define CF2_FIXED_MAX      ( (CF2_Fixed)0x7FFFFFFFL )
+#define CF2_FIXED_MIN      ( (CF2_Fixed)0x80000000L )
+#define CF2_FIXED_ONE      0x10000L
+#define CF2_FIXED_EPSILON  0x0001
+
+  /* in C 89, left and right shift of negative numbers is  */
+  /* implementation specific behaviour in the general case */
+
+#define cf2_intToFixed( i )                                    \
+          ( (CF2_Fixed)( (FT_UInt32)(i) << 16 ) )
+#define cf2_fixedToInt( x )                                    \
+          ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
+#define cf2_fixedRound( x )                                    \
+          ( (CF2_Fixed)( ( (x) + 0x8000 ) & 0xFFFF0000L ) )
+#define cf2_floatToFixed( f )                                  \
+          ( (CF2_Fixed)( (f) * 65536.0 + 0.5 ) )
+#define cf2_fixedAbs( x )                                      \
+          ( (x) < 0 ? -(x) : (x) )
+#define cf2_fixedFloor( x )                                    \
+          ( (CF2_Fixed)( (x) & 0xFFFF0000L ) )
+#define cf2_fixedFraction( x )                                 \
+          ( (x) - cf2_fixedFloor( x ) )
+#define cf2_fracToFixed( x )                                   \
+          ( (x) < 0 ? -( ( -(x) + 0x2000 ) >> 14 )             \
+                    :  ( (  (x) + 0x2000 ) >> 14 ) )
+
+
+  /* signed numeric types */
+  typedef enum  CF2_NumberType_
+  {
+    CF2_NumberFixed,    /* 16.16 */
+    CF2_NumberFrac,     /*  2.30 */
+    CF2_NumberInt       /* 32.0  */
+
+  } CF2_NumberType;
+
+
+FT_END_HEADER
+
+
+#endif /*  __CF2FIXED_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c
new file mode 100644
index 0000000..c1eeec2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c
@@ -0,0 +1,404 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2font.c                                                              */
+/*                                                                         */
+/*    Adobe's code for font instances (body).                              */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+
+#include "cf2glue.h"
+#include "cf2font.h"
+#include "cf2error.h"
+#include "cf2intrp.h"
+
+
+  /* Compute a stem darkening amount in character space. */
+  static void
+  cf2_computeDarkening( CF2_Fixed   emRatio,
+                        CF2_Fixed   ppem,
+                        CF2_Fixed   stemWidth,
+                        CF2_Fixed*  darkenAmount,
+                        CF2_Fixed   boldenAmount,
+                        FT_Bool     stemDarkened )
+  {
+    /* Internal calculations are done in units per thousand for */
+    /* convenience.                                             */
+    CF2_Fixed  stemWidthPer1000, scaledStem;
+
+
+    *darkenAmount = 0;
+
+    if ( boldenAmount == 0 && !stemDarkened )
+      return;
+
+    /* protect against range problems and divide by zero */
+    if ( emRatio < cf2_floatToFixed( .01 ) )
+      return;
+
+    if ( stemDarkened )
+    {
+      /* convert from true character space to 1000 unit character space; */
+      /* add synthetic emboldening effect                                */
+
+      /* we have to assure that the computation of `scaledStem' */
+      /* and `stemWidthPer1000' don't overflow                  */
+
+      stemWidthPer1000 = FT_MulFix( stemWidth + boldenAmount, emRatio );
+
+      if ( emRatio > CF2_FIXED_ONE                          &&
+           stemWidthPer1000 <= ( stemWidth + boldenAmount ) )
+      {
+        stemWidthPer1000 = 0;                      /* to pacify compiler */
+        scaledStem       = cf2_intToFixed( 2333 );
+      }
+      else
+      {
+        scaledStem = FT_MulFix( stemWidthPer1000, ppem );
+
+        if ( ppem > CF2_FIXED_ONE           &&
+             scaledStem <= stemWidthPer1000 )
+          scaledStem = cf2_intToFixed( 2333 );
+      }
+
+      /*
+       * Total darkening amount is computed in 1000 unit character space
+       * using the modified 5 part curve as Avalon rasterizer.
+       * The darkening amount is smaller for thicker stems.
+       * It becomes zero when the stem is thicker than 2.333 pixels.
+       *
+       * In Avalon rasterizer,
+       *
+       *   darkenAmount = 0.5 pixels   if scaledStem <= 0.5 pixels,
+       *   darkenAmount = 0.333 pixels if 1 <= scaledStem <= 1.667 pixels,
+       *   darkenAmount = 0 pixel      if scaledStem >= 2.333 pixels,
+       *
+       * and piecewise linear in-between.
+       *
+       */
+      if ( scaledStem < cf2_intToFixed( 500 ) )
+        *darkenAmount = FT_DivFix( cf2_intToFixed( 400 ), ppem );
+
+      else if ( scaledStem < cf2_intToFixed( 1000 ) )
+        *darkenAmount = FT_DivFix( cf2_intToFixed( 525 ), ppem ) -
+                          FT_MulFix( stemWidthPer1000,
+                                     cf2_floatToFixed( .25 ) );
+
+      else if ( scaledStem < cf2_intToFixed( 1667 ) )
+        *darkenAmount = FT_DivFix( cf2_intToFixed( 275 ), ppem );
+
+      else if ( scaledStem < cf2_intToFixed( 2333 ) )
+        *darkenAmount = FT_DivFix( cf2_intToFixed( 963 ), ppem ) -
+                          FT_MulFix( stemWidthPer1000,
+                                     cf2_floatToFixed( .413 ) );
+
+      /* use half the amount on each side and convert back to true */
+      /* character space                                           */
+      *darkenAmount = FT_DivFix( *darkenAmount, 2 * emRatio );
+    }
+
+    /* add synthetic emboldening effect in character space */
+    *darkenAmount += boldenAmount / 2;
+  }
+
+
+  /* set up values for the current FontDict and matrix */
+
+  /* caller's transform is adjusted for subpixel positioning */
+  static void
+  cf2_font_setup( CF2_Font           font,
+                  const CF2_Matrix*  transform )
+  {
+    /* pointer to parsed font object */
+    CFF_Decoder*  decoder = font->decoder;
+
+    FT_Bool  needExtraSetup;
+
+    /* character space units */
+    CF2_Fixed  boldenX = font->syntheticEmboldeningAmountX;
+    CF2_Fixed  boldenY = font->syntheticEmboldeningAmountY;
+
+    CF2_Fixed  ppem;
+
+
+    /* clear previous error */
+    font->error = FT_Err_Ok;
+
+    /* if a CID fontDict has changed, we need to recompute some cached */
+    /* data                                                            */
+    needExtraSetup =
+      (FT_Bool)( font->lastSubfont != cf2_getSubfont( decoder ) );
+
+    /* if ppem has changed, we need to recompute some cached data         */
+    /* note: because of CID font matrix concatenation, ppem and transform */
+    /*       do not necessarily track.                                    */
+    ppem = cf2_getPpemY( decoder );
+    if ( font->ppem != ppem )
+    {
+      font->ppem     = ppem;
+      needExtraSetup = TRUE;
+    }
+
+    /* copy hinted flag on each call */
+    font->hinted = (FT_Bool)( font->renderingFlags & CF2_FlagsHinted );
+
+    /* determine if transform has changed;       */
+    /* include Fontmatrix but ignore translation */
+    if ( ft_memcmp( transform,
+                    &font->currentTransform,
+                    4 * sizeof ( CF2_Fixed ) ) != 0 )
+    {
+      /* save `key' information for `cache of one' matrix data; */
+      /* save client transform, without the translation         */
+      font->currentTransform    = *transform;
+      font->currentTransform.tx =
+      font->currentTransform.ty = cf2_intToFixed( 0 );
+
+      /* TODO: FreeType transform is simple scalar; for now, use identity */
+      /*       for outer                                                  */
+      font->innerTransform   = *transform;
+      font->outerTransform.a =
+      font->outerTransform.d = cf2_intToFixed( 1 );
+      font->outerTransform.b =
+      font->outerTransform.c = cf2_intToFixed( 0 );
+
+      needExtraSetup = TRUE;
+    }
+
+    /*
+     * font->darkened is set to true if there is a stem darkening request or
+     * the font is synthetic emboldened.
+     * font->darkened controls whether to adjust blue zones, winding order,
+     * and hinting.
+     *
+     */
+    if ( font->stemDarkened != ( font->renderingFlags & CF2_FlagsDarkened ) )
+    {
+      font->stemDarkened =
+        (FT_Bool)( font->renderingFlags & CF2_FlagsDarkened );
+
+      /* blue zones depend on darkened flag */
+      needExtraSetup = TRUE;
+    }
+
+    /* recompute variables that are dependent on transform or FontDict or */
+    /* darken flag                                                        */
+    if ( needExtraSetup )
+    {
+      /* StdVW is found in the private dictionary;                       */
+      /* recompute darkening amounts whenever private dictionary or      */
+      /* transform change                                                */
+      /* Note: a rendering flag turns darkening on or off, so we want to */
+      /*       store the `on' amounts;                                   */
+      /*       darkening amount is computed in character space           */
+      /* TODO: testing size-dependent darkening here;                    */
+      /*       what to do for rotations?                                 */
+
+      CF2_Fixed  emRatio;
+      CF2_Fixed  stdHW;
+      CF2_Int    unitsPerEm = font->unitsPerEm;
+
+
+      if ( unitsPerEm == 0 )
+        unitsPerEm = 1000;
+
+      ppem = FT_MAX( cf2_intToFixed( 4 ),
+                     font->ppem ); /* use minimum ppem of 4 */
+
+#if 0
+      /* since vstem is measured in the x-direction, we use the `a' member */
+      /* of the fontMatrix                                                 */
+      emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->a );
+#endif
+
+      /* Freetype does not preserve the fontMatrix when parsing; use */
+      /* unitsPerEm instead.                                         */
+      /* TODO: check precision of this                               */
+      emRatio     = cf2_intToFixed( 1000 ) / unitsPerEm;
+      font->stdVW = cf2_getStdVW( decoder );
+
+      if ( font->stdVW <= 0 )
+        font->stdVW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );
+
+      if ( boldenX > 0 )
+      {
+        /* Ensure that boldenX is at least 1 pixel for synthetic bold font */
+        /* (similar to what Avalon does)                                   */
+        boldenX = FT_MAX( boldenX,
+                          FT_DivFix( cf2_intToFixed( unitsPerEm ), ppem ) );
+
+        /* Synthetic emboldening adds at least 1 pixel to darkenX, while */
+        /* stem darkening adds at most half pixel.  Since the purpose of */
+        /* stem darkening (readability at small sizes) is met with       */
+        /* synthetic emboldening, no need to add stem darkening for a    */
+        /* synthetic bold font.                                          */
+        cf2_computeDarkening( emRatio,
+                              ppem,
+                              font->stdVW,
+                              &font->darkenX,
+                              boldenX,
+                              FALSE );
+      }
+      else
+        cf2_computeDarkening( emRatio,
+                              ppem,
+                              font->stdVW,
+                              &font->darkenX,
+                              0,
+                              font->stemDarkened );
+
+#if 0
+      /* since hstem is measured in the y-direction, we use the `d' member */
+      /* of the fontMatrix                                                 */
+      /* TODO: use the same units per em as above; check this              */
+      emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->d );
+#endif
+
+      /* set the default stem width, because it must be the same for all */
+      /* family members;                                                 */
+      /* choose a constant for StdHW that depends on font contrast       */
+      stdHW = cf2_getStdHW( decoder );
+
+      if ( stdHW > 0 && font->stdVW > 2 * stdHW )
+        font->stdHW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );
+      else
+      {
+        /* low contrast font gets less hstem darkening */
+        font->stdHW = FT_DivFix( cf2_intToFixed( 110 ), emRatio );
+      }
+
+      cf2_computeDarkening( emRatio,
+                            ppem,
+                            font->stdHW,
+                            &font->darkenY,
+                            boldenY,
+                            font->stemDarkened );
+
+      if ( font->darkenX != 0 || font->darkenY != 0 )
+        font->darkened = TRUE;
+      else
+        font->darkened = FALSE;
+
+      font->reverseWinding = FALSE; /* initial expectation is CCW */
+
+      /* compute blue zones for this instance */
+      cf2_blues_init( &font->blues, font );
+    }
+  }
+
+
+  /* equivalent to AdobeGetOutline */
+  FT_LOCAL_DEF( FT_Error )
+  cf2_getGlyphOutline( CF2_Font           font,
+                       CF2_Buffer         charstring,
+                       const CF2_Matrix*  transform,
+                       CF2_F16Dot16*      glyphWidth )
+  {
+    FT_Error  lastError = FT_Err_Ok;
+
+    FT_Vector  translation;
+	int refCount = 0;
+
+#if 0
+    FT_Vector  advancePoint;
+#endif
+
+    CF2_Fixed  advWidth = 0;
+    FT_Bool    needWinding;
+
+
+    /* Note: use both integer and fraction for outlines.  This allows bbox */
+    /*       to come out directly.                                         */
+
+    translation.x = transform->tx;
+    translation.y = transform->ty;
+
+    /* set up values based on transform */
+    cf2_font_setup( font, transform );
+    if ( font->error )
+      goto exit;                      /* setup encountered an error */
+
+    /* reset darken direction */
+    font->reverseWinding = FALSE;
+
+    /* winding order only affects darkening */
+    needWinding = font->darkened;
+
+    while ( refCount++ < 1024)
+    {
+      /* reset output buffer */
+      cf2_outline_reset( &font->outline );
+
+      /* build the outline, passing the full translation */
+      cf2_interpT2CharString( font,
+                              charstring,
+                              (CF2_OutlineCallbacks)&font->outline,
+                              &translation,
+                              FALSE,
+                              0,
+                              0,
+                              &advWidth );
+
+      if ( font->error )
+        goto exit;
+
+      if ( !needWinding )
+        break;
+
+      /* check winding order */
+      if ( font->outline.root.windingMomentum >= 0 ) /* CFF is CCW */
+        break;
+
+      /* invert darkening and render again                            */
+      /* TODO: this should be a parameter to getOutline-computeOffset */
+      font->reverseWinding = TRUE;
+
+      needWinding = FALSE;    /* exit after next iteration */
+    }
+
+    /* finish storing client outline */
+    cf2_outline_close( &font->outline );
+
+  exit:
+    /* FreeType just wants the advance width; there is no translation */
+    *glyphWidth = advWidth;
+
+    /* free resources and collect errors from objects we've used */
+    cf2_setError( &font->error, lastError );
+
+    return font->error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.h
new file mode 100644
index 0000000..f9dd1bb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.h
@@ -0,0 +1,114 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2font.h                                                              */
+/*                                                                         */
+/*    Adobe's code for font instances (specification).                     */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CF2FONT_H__
+#define __CF2FONT_H__
+
+
+#include "cf2ft.h"
+#include "cf2blues.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define CF2_OPERAND_STACK_SIZE  48
+#define CF2_MAX_SUBR            10 /* maximum subroutine nesting */
+
+
+  /* typedef is in `cf2glue.h' */
+  struct  CF2_FontRec_
+  {
+    FT_Memory  memory;
+    FT_Error   error;     /* shared error for this instance */
+
+    CF2_RenderingFlags  renderingFlags;
+
+    /* variables that depend on Transform:  */
+    /* the following have zero translation; */
+    /* inner * outer = font * original      */
+
+    CF2_Matrix  currentTransform;  /* original client matrix           */
+    CF2_Matrix  innerTransform;    /* for hinting; erect, scaled       */
+    CF2_Matrix  outerTransform;    /* post hinting; includes rotations */
+    CF2_Fixed   ppem;              /* transform-dependent              */
+
+    CF2_Int  unitsPerEm;
+
+    CF2_Fixed  syntheticEmboldeningAmountX;   /* character space units */
+    CF2_Fixed  syntheticEmboldeningAmountY;   /* character space units */
+
+    /* FreeType related members */
+    CF2_OutlineRec  outline;       /* freetype glyph outline functions */
+    CFF_Decoder*    decoder;
+    CFF_SubFont     lastSubfont;              /* FreeType parsed data; */
+                                              /* top font or subfont   */
+
+    /* these flags can vary from one call to the next */
+    FT_Bool  hinted;
+    FT_Bool  darkened;       /* true if stemDarkened or synthetic bold */
+                             /* i.e. darkenX != 0 || darkenY != 0      */
+    FT_Bool  stemDarkened;
+
+    /* variables that depend on both FontDict and Transform */
+    CF2_Fixed  stdVW;     /* in character space; depends on dict entry */
+    CF2_Fixed  stdHW;     /* in character space; depends on dict entry */
+    CF2_Fixed  darkenX;                    /* character space units    */
+    CF2_Fixed  darkenY;                    /* depends on transform     */
+                                           /* and private dict (StdVW) */
+    FT_Bool  reverseWinding;               /* darken assuming          */
+                                           /* counterclockwise winding */
+
+    CF2_BluesRec  blues;                         /* computed zone data */
+  };
+
+
+  FT_LOCAL( FT_Error )
+  cf2_getGlyphOutline( CF2_Font           font,
+                       CF2_Buffer         charstring,
+                       const CF2_Matrix*  transform,
+                       CF2_F16Dot16*      glyphWidth );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2FONT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c
new file mode 100644
index 0000000..4311d10
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c
@@ -0,0 +1,639 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2ft.c                                                                */
+/*                                                                         */
+/*    FreeType Glue Component to Adobe's Interpreter (body).               */
+/*                                                                         */
+/*  Copyright 2013 Adobe Systems Incorporated.                             */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2font.h"
+#include "cf2error.h"
+
+
+#define CF2_MAX_SIZE  cf2_intToFixed( 2000 )    /* max ppem */
+
+
+  /*
+   * This check should avoid most internal overflow cases.  Clients should
+   * generally respond to `Glyph_Too_Big' by getting a glyph outline
+   * at EM size, scaling it and filling it as a graphics operation.
+   *
+   */
+  static FT_Error
+  cf2_checkTransform( const CF2_Matrix*  transform,
+                      CF2_Int            unitsPerEm )
+  {
+    CF2_Fixed  maxScale;
+
+
+    FT_ASSERT( unitsPerEm > 0 );
+
+    FT_ASSERT( transform->a > 0 && transform->d > 0 );
+    FT_ASSERT( transform->b == 0 && transform->c == 0 );
+    FT_ASSERT( transform->tx == 0 && transform->ty == 0 );
+
+    if ( unitsPerEm > 0x7FFF )
+      return FT_THROW( Glyph_Too_Big );
+
+    maxScale = FT_DivFix( CF2_MAX_SIZE, cf2_intToFixed( unitsPerEm ) );
+
+    if ( transform->a > maxScale || transform->d > maxScale )
+      return FT_THROW( Glyph_Too_Big );
+
+    return FT_Err_Ok;
+  }
+
+
+  static void
+  cf2_setGlyphWidth( CF2_Outline  outline,
+                     CF2_Fixed    width )
+  {
+    CFF_Decoder*  decoder = outline->decoder;
+
+
+    FT_ASSERT( decoder );
+
+    decoder->glyph_width = cf2_fixedToInt( width );
+  }
+
+
+  /* Clean up font instance. */
+  static void
+  cf2_free_instance( void*  ptr )
+  {
+    CF2_Font  font = (CF2_Font)ptr;
+
+
+    if ( font )
+    {
+      FT_Memory  memory = font->memory;
+
+
+      (void)memory;
+    }
+  }
+
+
+  /********************************************/
+  /*                                          */
+  /* functions for handling client outline;   */
+  /* FreeType uses coordinates in 26.6 format */
+  /*                                          */
+  /********************************************/
+
+  static void
+  cf2_builder_moveTo( CF2_OutlineCallbacks      callbacks,
+                      const CF2_CallbackParams  params )
+  {
+    /* downcast the object pointer */
+    CF2_Outline   outline = (CF2_Outline)callbacks;
+    CFF_Builder*  builder;
+
+    (void)params;        /* only used in debug mode */
+
+
+    FT_ASSERT( outline && outline->decoder );
+    FT_ASSERT( params->op == CF2_PathOpMoveTo );
+
+    builder = &outline->decoder->builder;
+
+    /* note: two successive moves simply close the contour twice */
+    cff_builder_close_contour( builder );
+    builder->path_begun = 0;
+  }
+
+
+  static void
+  cf2_builder_lineTo( CF2_OutlineCallbacks      callbacks,
+                      const CF2_CallbackParams  params )
+  {
+    /* downcast the object pointer */
+    CF2_Outline   outline = (CF2_Outline)callbacks;
+    CFF_Builder*  builder;
+
+
+    FT_ASSERT( outline && outline->decoder );
+    FT_ASSERT( params->op == CF2_PathOpLineTo );
+
+    builder = &outline->decoder->builder;
+
+    if ( !builder->path_begun )
+    {
+      /* record the move before the line; also check points and set */
+      /* `path_begun'                                               */
+      cff_builder_start_point( builder,
+                               params->pt0.x,
+                               params->pt0.y );
+    }
+
+    /* `cff_builder_add_point1' includes a check_points call for one point */
+    cff_builder_add_point1( builder,
+                            params->pt1.x,
+                            params->pt1.y );
+  }
+
+
+  static void
+  cf2_builder_cubeTo( CF2_OutlineCallbacks      callbacks,
+                      const CF2_CallbackParams  params )
+  {
+    /* downcast the object pointer */
+    CF2_Outline   outline = (CF2_Outline)callbacks;
+    CFF_Builder*  builder;
+
+
+    FT_ASSERT( outline && outline->decoder );
+    FT_ASSERT( params->op == CF2_PathOpCubeTo );
+
+    builder = &outline->decoder->builder;
+
+    if ( !builder->path_begun )
+    {
+      /* record the move before the line; also check points and set */
+      /* `path_begun'                                               */
+      cff_builder_start_point( builder,
+                               params->pt0.x,
+                               params->pt0.y );
+    }
+
+    /* prepare room for 3 points: 2 off-curve, 1 on-curve */
+    cff_check_points( builder, 3 );
+
+    cff_builder_add_point( builder,
+                           params->pt1.x,
+                           params->pt1.y, 0 );
+    cff_builder_add_point( builder,
+                           params->pt2.x,
+                           params->pt2.y, 0 );
+    cff_builder_add_point( builder,
+                           params->pt3.x,
+                           params->pt3.y, 1 );
+  }
+
+
+  static void
+  cf2_outline_init( CF2_Outline  outline,
+                    FT_Memory    memory,
+                    FT_Error*    error )
+  {
+    FT_MEM_ZERO( outline, sizeof ( CF2_OutlineRec ) );
+
+    outline->root.memory = memory;
+    outline->root.error  = error;
+
+    outline->root.moveTo = cf2_builder_moveTo;
+    outline->root.lineTo = cf2_builder_lineTo;
+    outline->root.cubeTo = cf2_builder_cubeTo;
+  }
+
+
+  /* get scaling and hint flag from GlyphSlot */
+  static void
+  cf2_getScaleAndHintFlag( CFF_Decoder*  decoder,
+                           CF2_Fixed*    x_scale,
+                           CF2_Fixed*    y_scale,
+                           FT_Bool*      hinted,
+                           FT_Bool*      scaled )
+  {
+    FT_ASSERT( decoder && decoder->builder.glyph );
+
+    /* note: FreeType scale includes a factor of 64 */
+    *hinted = decoder->builder.glyph->hint;
+    *scaled = decoder->builder.glyph->scaled;
+
+    if ( *hinted )
+    {
+      *x_scale = FT_DivFix( decoder->builder.glyph->x_scale,
+                            cf2_intToFixed( 64 ) );
+      *y_scale = FT_DivFix( decoder->builder.glyph->y_scale,
+                            cf2_intToFixed( 64 ) );
+    }
+    else
+    {
+      /* for unhinted outlines, `cff_slot_load' does the scaling, */
+      /* thus render at `unity' scale                             */
+
+      *x_scale = 0x0400;   /* 1/64 as 16.16 */
+      *y_scale = 0x0400;
+    }
+  }
+
+
+  /* get units per em from `FT_Face' */
+  /* TODO: should handle font matrix concatenation? */
+  static FT_UShort
+  cf2_getUnitsPerEm( CFF_Decoder*  decoder )
+  {
+    FT_ASSERT( decoder && decoder->builder.face );
+    FT_ASSERT( decoder->builder.face->root.units_per_EM );
+
+    return decoder->builder.face->root.units_per_EM;
+  }
+
+
+  /* Main entry point: Render one glyph. */
+  FT_LOCAL_DEF( FT_Error )
+  cf2_decoder_parse_charstrings( CFF_Decoder*  decoder,
+                                 FT_Byte*      charstring_base,
+                                 FT_ULong      charstring_len )
+  {
+    FT_Memory  memory;
+    FT_Error   error = FT_Err_Ok;
+    CF2_Font   font;
+
+
+    FT_ASSERT( decoder && decoder->cff );
+
+    memory = decoder->builder.memory;
+
+    /* CF2 data is saved here across glyphs */
+    font = (CF2_Font)decoder->cff->cf2_instance.data;
+
+    /* on first glyph, allocate instance structure */
+    if ( decoder->cff->cf2_instance.data == NULL )
+    {
+      decoder->cff->cf2_instance.finalizer =
+        (FT_Generic_Finalizer)cf2_free_instance;
+
+      if ( FT_ALLOC( decoder->cff->cf2_instance.data,
+                     sizeof ( CF2_FontRec ) ) )
+        return FT_THROW( Out_Of_Memory );
+
+      font = (CF2_Font)decoder->cff->cf2_instance.data;
+
+      font->memory = memory;
+
+      /* initialize a client outline, to be shared by each glyph rendered */
+      cf2_outline_init( &font->outline, font->memory, &font->error );
+    }
+
+    /* save decoder; it is a stack variable and will be different on each */
+    /* call                                                               */
+    font->decoder         = decoder;
+    font->outline.decoder = decoder;
+
+    {
+      /* build parameters for Adobe engine */
+
+      CFF_Builder*  builder = &decoder->builder;
+      CFF_Driver    driver  = (CFF_Driver)FT_FACE_DRIVER( builder->face );
+
+      /* local error */
+      FT_Error       error2 = FT_Err_Ok;
+      CF2_BufferRec  buf;
+      CF2_Matrix     transform;
+      CF2_F16Dot16   glyphWidth;
+
+      FT_Bool  hinted;
+      FT_Bool  scaled;
+
+
+      /* FreeType has already looked up the GID; convert to         */
+      /* `RegionBuffer', assuming that the input has been validated */
+      FT_ASSERT( charstring_base + charstring_len >= charstring_base );
+
+      FT_ZERO( &buf );
+      buf.start =
+      buf.ptr   = charstring_base;
+      buf.end   = charstring_base + charstring_len;
+
+      FT_ZERO( &transform );
+
+      cf2_getScaleAndHintFlag( decoder,
+                               &transform.a,
+                               &transform.d,
+                               &hinted,
+                               &scaled );
+
+      font->renderingFlags = 0;
+      if ( hinted )
+        font->renderingFlags |= CF2_FlagsHinted;
+      if ( scaled && !driver->no_stem_darkening )
+        font->renderingFlags |= CF2_FlagsDarkened;
+
+      /* now get an outline for this glyph;      */
+      /* also get units per em to validate scale */
+      font->unitsPerEm = (CF2_Int)cf2_getUnitsPerEm( decoder );
+
+      error2 = cf2_checkTransform( &transform, font->unitsPerEm );
+      if ( error2 )
+        return error2;
+
+      error2 = cf2_getGlyphOutline( font, &buf, &transform, &glyphWidth );
+      if ( error2 )
+        return FT_ERR( Invalid_File_Format );
+
+      cf2_setGlyphWidth( &font->outline, glyphWidth );
+
+      return FT_Err_Ok;
+    }
+  }
+
+
+  /* get pointer to current FreeType subfont (based on current glyphID) */
+  FT_LOCAL_DEF( CFF_SubFont )
+  cf2_getSubfont( CFF_Decoder*  decoder )
+  {
+    FT_ASSERT( decoder && decoder->current_subfont );
+
+    return decoder->current_subfont;
+  }
+
+
+  /* get `y_ppem' from `CFF_Size' */
+  FT_LOCAL_DEF( CF2_Fixed )
+  cf2_getPpemY( CFF_Decoder*  decoder )
+  {
+    FT_ASSERT( decoder                          &&
+               decoder->builder.face            &&
+               decoder->builder.face->root.size );
+    FT_ASSERT( decoder->builder.face->root.size->metrics.y_ppem );
+
+    return cf2_intToFixed(
+             decoder->builder.face->root.size->metrics.y_ppem );
+  }
+
+
+  /* get standard stem widths for the current subfont; */
+  /* FreeType stores these as integer font units       */
+  /* (note: variable names seem swapped)               */
+  FT_LOCAL_DEF( CF2_Fixed )
+  cf2_getStdVW( CFF_Decoder*  decoder )
+  {
+    FT_ASSERT( decoder && decoder->current_subfont );
+
+    return cf2_intToFixed(
+             decoder->current_subfont->private_dict.standard_height );
+  }
+
+
+  FT_LOCAL_DEF( CF2_Fixed )
+  cf2_getStdHW( CFF_Decoder*  decoder )
+  {
+    FT_ASSERT( decoder && decoder->current_subfont );
+
+    return cf2_intToFixed(
+             decoder->current_subfont->private_dict.standard_width );
+  }
+
+
+  /* note: FreeType stores 1000 times the actual value for `BlueScale' */
+  FT_LOCAL_DEF( void )
+  cf2_getBlueMetrics( CFF_Decoder*  decoder,
+                      CF2_Fixed*    blueScale,
+                      CF2_Fixed*    blueShift,
+                      CF2_Fixed*    blueFuzz )
+  {
+    FT_ASSERT( decoder && decoder->current_subfont );
+
+    *blueScale = FT_DivFix(
+                   decoder->current_subfont->private_dict.blue_scale,
+                   cf2_intToFixed( 1000 ) );
+    *blueShift = cf2_intToFixed(
+                   decoder->current_subfont->private_dict.blue_shift );
+    *blueFuzz  = cf2_intToFixed(
+                   decoder->current_subfont->private_dict.blue_fuzz );
+  }
+
+
+  /* get blue values counts and arrays; the FreeType parser has validated */
+  /* the counts and verified that each is an even number                  */
+  FT_LOCAL_DEF( void )
+  cf2_getBlueValues( CFF_Decoder*  decoder,
+                     size_t*       count,
+                     FT_Pos*      *data )
+  {
+    FT_ASSERT( decoder && decoder->current_subfont );
+
+    *count = decoder->current_subfont->private_dict.num_blue_values;
+    *data  = (FT_Pos*)
+               &decoder->current_subfont->private_dict.blue_values;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_getOtherBlues( CFF_Decoder*  decoder,
+                     size_t*       count,
+                     FT_Pos*      *data )
+  {
+    FT_ASSERT( decoder && decoder->current_subfont );
+
+    *count = decoder->current_subfont->private_dict.num_other_blues;
+    *data  = (FT_Pos*)
+               &decoder->current_subfont->private_dict.other_blues;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_getFamilyBlues( CFF_Decoder*  decoder,
+                      size_t*       count,
+                      FT_Pos*      *data )
+  {
+    FT_ASSERT( decoder && decoder->current_subfont );
+
+    *count = decoder->current_subfont->private_dict.num_family_blues;
+    *data  = (FT_Pos*)
+               &decoder->current_subfont->private_dict.family_blues;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_getFamilyOtherBlues( CFF_Decoder*  decoder,
+                           size_t*       count,
+                           FT_Pos*      *data )
+  {
+    FT_ASSERT( decoder && decoder->current_subfont );
+
+    *count = decoder->current_subfont->private_dict.num_family_other_blues;
+    *data  = (FT_Pos*)
+               &decoder->current_subfont->private_dict.family_other_blues;
+  }
+
+
+  FT_LOCAL_DEF( CF2_Int )
+  cf2_getLanguageGroup( CFF_Decoder*  decoder )
+  {
+    FT_ASSERT( decoder && decoder->current_subfont );
+
+    return decoder->current_subfont->private_dict.language_group;
+  }
+
+
+  /* convert unbiased subroutine index to `CF2_Buffer' and */
+  /* return 0 on success                                   */
+  FT_LOCAL_DEF( CF2_Int )
+  cf2_initGlobalRegionBuffer( CFF_Decoder*  decoder,
+                              CF2_UInt      idx,
+                              CF2_Buffer    buf )
+  {
+    FT_ASSERT( decoder && decoder->globals );
+
+    FT_ZERO( buf );
+
+    idx += decoder->globals_bias;
+    if ( idx >= decoder->num_globals )
+      return TRUE;     /* error */
+
+    buf->start =
+    buf->ptr   = decoder->globals[idx];
+    buf->end   = decoder->globals[idx + 1];
+
+    return FALSE;      /* success */
+  }
+
+
+  /* convert AdobeStandardEncoding code to CF2_Buffer; */
+  /* used for seac component                           */
+  FT_LOCAL_DEF( FT_Error )
+  cf2_getSeacComponent( CFF_Decoder*  decoder,
+                        CF2_UInt      code,
+                        CF2_Buffer    buf )
+  {
+    CF2_Int   gid;
+    FT_Byte*  charstring;
+    FT_ULong  len;
+    FT_Error  error;
+
+
+    FT_ASSERT( decoder );
+
+    FT_ZERO( buf );
+
+    gid = cff_lookup_glyph_by_stdcharcode( decoder->cff, code );
+    if ( gid < 0 )
+      return FT_THROW( Invalid_Glyph_Format );
+
+    error = cff_get_glyph_data( decoder->builder.face,
+                                gid,
+                                &charstring,
+                                &len );
+    /* TODO: for now, just pass the FreeType error through */
+    if ( error )
+      return error;
+
+    /* assume input has been validated */
+    FT_ASSERT( charstring + len >= charstring );
+
+    buf->start = charstring;
+    buf->end   = charstring + len;
+    buf->ptr   = buf->start;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_freeSeacComponent( CFF_Decoder*  decoder,
+                         CF2_Buffer    buf )
+  {
+    FT_ASSERT( decoder );
+
+    cff_free_glyph_data( decoder->builder.face,
+                         (FT_Byte**)&buf->start,
+                         (FT_ULong)( buf->end - buf->start ) );
+  }
+
+
+  FT_LOCAL_DEF( CF2_Int )
+  cf2_initLocalRegionBuffer( CFF_Decoder*  decoder,
+                             CF2_UInt      idx,
+                             CF2_Buffer    buf )
+  {
+    FT_ASSERT( decoder && decoder->locals );
+
+    FT_ZERO( buf );
+
+    idx += decoder->locals_bias;
+    if ( idx >= decoder->num_locals )
+      return TRUE;     /* error */
+
+    buf->start =
+    buf->ptr   = decoder->locals[idx];
+    buf->end   = decoder->locals[idx + 1];
+
+    return FALSE;      /* success */
+  }
+
+
+  FT_LOCAL_DEF( CF2_Fixed )
+  cf2_getDefaultWidthX( CFF_Decoder*  decoder )
+  {
+    FT_ASSERT( decoder && decoder->current_subfont );
+
+    return cf2_intToFixed(
+             decoder->current_subfont->private_dict.default_width );
+  }
+
+
+  FT_LOCAL_DEF( CF2_Fixed )
+  cf2_getNominalWidthX( CFF_Decoder*  decoder )
+  {
+    FT_ASSERT( decoder && decoder->current_subfont );
+
+    return cf2_intToFixed(
+             decoder->current_subfont->private_dict.nominal_width );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_outline_reset( CF2_Outline  outline )
+  {
+    CFF_Decoder*  decoder = outline->decoder;
+
+
+    FT_ASSERT( decoder );
+
+    outline->root.windingMomentum = 0;
+
+    FT_GlyphLoader_Rewind( decoder->builder.loader );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_outline_close( CF2_Outline  outline )
+  {
+    CFF_Decoder*  decoder = outline->decoder;
+
+
+    FT_ASSERT( decoder );
+
+    cff_builder_close_contour( &decoder->builder );
+
+    FT_GlyphLoader_Add( decoder->builder.loader );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.h
new file mode 100644
index 0000000..70a0ed4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.h
@@ -0,0 +1,147 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2ft.h                                                                */
+/*                                                                         */
+/*    FreeType Glue Component to Adobe's Interpreter (specification).      */
+/*                                                                         */
+/*  Copyright 2013 Adobe Systems Incorporated.                             */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CF2FT_H__
+#define __CF2FT_H__
+
+
+#include "cf2types.h"
+
+
+  /* TODO: disable asserts for now */
+#define CF2_NDEBUG
+
+
+#include "../../include/freetype/ftsystem.h"
+
+#include "cf2glue.h"
+#include "cffgload.h"    /* for CFF_Decoder */
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  cf2_decoder_parse_charstrings( CFF_Decoder*  decoder,
+                                 FT_Byte*      charstring_base,
+                                 FT_ULong      charstring_len );
+
+  FT_LOCAL( CFF_SubFont )
+  cf2_getSubfont( CFF_Decoder*  decoder );
+
+
+  FT_LOCAL( CF2_Fixed )
+  cf2_getPpemY( CFF_Decoder*  decoder );
+  FT_LOCAL( CF2_Fixed )
+  cf2_getStdVW( CFF_Decoder*  decoder );
+  FT_LOCAL( CF2_Fixed )
+  cf2_getStdHW( CFF_Decoder*  decoder );
+
+  FT_LOCAL( void )
+  cf2_getBlueMetrics( CFF_Decoder*  decoder,
+                      CF2_Fixed*    blueScale,
+                      CF2_Fixed*    blueShift,
+                      CF2_Fixed*    blueFuzz );
+  FT_LOCAL( void )
+  cf2_getBlueValues( CFF_Decoder*  decoder,
+                     size_t*       count,
+                     FT_Pos*      *data );
+  FT_LOCAL( void )
+  cf2_getOtherBlues( CFF_Decoder*  decoder,
+                     size_t*       count,
+                     FT_Pos*      *data );
+  FT_LOCAL( void )
+  cf2_getFamilyBlues( CFF_Decoder*  decoder,
+                      size_t*       count,
+                      FT_Pos*      *data );
+  FT_LOCAL( void )
+  cf2_getFamilyOtherBlues( CFF_Decoder*  decoder,
+                           size_t*       count,
+                           FT_Pos*      *data );
+
+  FT_LOCAL( CF2_Int )
+  cf2_getLanguageGroup( CFF_Decoder*  decoder );
+
+  FT_LOCAL( CF2_Int )
+  cf2_initGlobalRegionBuffer( CFF_Decoder*  decoder,
+                              CF2_UInt      idx,
+                              CF2_Buffer    buf );
+  FT_LOCAL( FT_Error )
+  cf2_getSeacComponent( CFF_Decoder*  decoder,
+                        CF2_UInt      code,
+                        CF2_Buffer    buf );
+  FT_LOCAL( void )
+  cf2_freeSeacComponent( CFF_Decoder*  decoder,
+                         CF2_Buffer    buf );
+  FT_LOCAL( CF2_Int )
+  cf2_initLocalRegionBuffer( CFF_Decoder*  decoder,
+                             CF2_UInt      idx,
+                             CF2_Buffer    buf );
+
+  FT_LOCAL( CF2_Fixed )
+  cf2_getDefaultWidthX( CFF_Decoder*  decoder );
+  FT_LOCAL( CF2_Fixed )
+  cf2_getNominalWidthX( CFF_Decoder*  decoder );
+
+
+  /*
+   * FreeType client outline
+   *
+   * process output from the charstring interpreter
+   */
+  typedef struct  CF2_OutlineRec_
+  {
+    CF2_OutlineCallbacksRec  root;        /* base class must be first */
+    CFF_Decoder*             decoder;
+
+  } CF2_OutlineRec, *CF2_Outline;
+
+
+  FT_LOCAL( void )
+  cf2_outline_reset( CF2_Outline  outline );
+  FT_LOCAL( void )
+  cf2_outline_close( CF2_Outline  outline );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2FT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2glue.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2glue.h
new file mode 100644
index 0000000..a24da39
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2glue.h
@@ -0,0 +1,144 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2glue.h                                                              */
+/*                                                                         */
+/*    Adobe's code for shared stuff (specification only).                  */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CF2GLUE_H__
+#define __CF2GLUE_H__
+
+
+/* common includes for other modules */
+#include "cf2error.h"
+#include "cf2fixed.h"
+#include "cf2arrst.h"
+#include "cf2read.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* rendering parameters */
+
+  /* apply hints to rendered glyphs */
+#define CF2_FlagsHinted    1
+  /* for testing */
+#define CF2_FlagsDarkened  2
+
+  /* type for holding the flags */
+  typedef CF2_Int  CF2_RenderingFlags;
+
+
+  /* elements of a glyph outline */
+  typedef enum  CF2_PathOp_
+  {
+    CF2_PathOpMoveTo = 1,     /* change the current point */
+    CF2_PathOpLineTo = 2,     /* line                     */
+    CF2_PathOpQuadTo = 3,     /* quadratic curve          */
+    CF2_PathOpCubeTo = 4      /* cubic curve              */
+
+  } CF2_PathOp;
+
+
+  /* a matrix of fixed point values */
+  typedef struct  CF2_Matrix_
+  {
+    CF2_F16Dot16  a;
+    CF2_F16Dot16  b;
+    CF2_F16Dot16  c;
+    CF2_F16Dot16  d;
+    CF2_F16Dot16  tx;
+    CF2_F16Dot16  ty;
+
+  } CF2_Matrix;
+
+
+  /* these typedefs are needed by more than one header file */
+  /* and gcc compiler doesn't allow redefinition            */
+  typedef struct CF2_FontRec_  CF2_FontRec, *CF2_Font;
+  typedef struct CF2_HintRec_  CF2_HintRec, *CF2_Hint;
+
+
+  /* A common structure for all callback parameters.                       */
+  /*                                                                       */
+  /* Some members may be unused.  For example, `pt0' is not used for       */
+  /* `moveTo' and `pt3' is not used for `quadTo'.  The initial point `pt0' */
+  /* is included for each path element for generality; curve conversions   */
+  /* need it.  The `op' parameter allows one function to handle multiple   */
+  /* element types.                                                        */
+
+  typedef struct  CF2_CallbackParamsRec_
+  {
+    FT_Vector  pt0;
+    FT_Vector  pt1;
+    FT_Vector  pt2;
+    FT_Vector  pt3;
+
+    CF2_Int  op;
+
+  } CF2_CallbackParamsRec, *CF2_CallbackParams;
+
+
+  /* forward reference */
+  typedef struct CF2_OutlineCallbacksRec_  CF2_OutlineCallbacksRec,
+                                           *CF2_OutlineCallbacks;
+
+  /* callback function pointers */
+  typedef void
+  (*CF2_Callback_Type)( CF2_OutlineCallbacks      callbacks,
+                        const CF2_CallbackParams  params );
+
+
+  struct  CF2_OutlineCallbacksRec_
+  {
+    CF2_Callback_Type  moveTo;
+    CF2_Callback_Type  lineTo;
+    CF2_Callback_Type  quadTo;
+    CF2_Callback_Type  cubeTo;
+
+    CF2_Int  windingMomentum;    /* for winding order detection */
+
+    FT_Memory  memory;
+    FT_Error*  error;
+  };
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2GLUE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c
new file mode 100644
index 0000000..b3f6a04
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c
@@ -0,0 +1,1747 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2hints.c                                                             */
+/*                                                                         */
+/*    Adobe's code for handling CFF hints (body).                          */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+#include "cf2font.h"
+#include "cf2hints.h"
+#include "cf2intrp.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cf2hints
+
+
+  typedef struct  CF2_HintMoveRec_
+  {
+    size_t     j;          /* index of upper hint map edge   */
+    CF2_Fixed  moveUp;     /* adjustment to optimum position */
+
+  } CF2_HintMoveRec, *CF2_HintMove;
+
+
+  /* Compute angular momentum for winding order detection.  It is called */
+  /* for all lines and curves, but not necessarily in element order.     */
+  static CF2_Int
+  cf2_getWindingMomentum( CF2_Fixed  x1,
+                          CF2_Fixed  y1,
+                          CF2_Fixed  x2,
+                          CF2_Fixed  y2 )
+  {
+    /* cross product of pt1 position from origin with pt2 position from  */
+    /* pt1; we reduce the precision so that the result fits into 32 bits */
+
+    return ( x1 >> 16 ) * ( ( y2 - y1 ) >> 16 ) -
+           ( y1 >> 16 ) * ( ( x2 - x1 ) >> 16 );
+  }
+
+
+  /*
+   * Construct from a StemHint; this is used as a parameter to
+   * `cf2_blues_capture'.
+   * `hintOrigin' is the character space displacement of a seac accent.
+   * Adjust stem hint for darkening here.
+   *
+   */
+  static void
+  cf2_hint_init( CF2_Hint            hint,
+                 const CF2_ArrStack  stemHintArray,
+                 size_t              indexStemHint,
+                 const CF2_Font      font,
+                 CF2_Fixed           hintOrigin,
+                 CF2_Fixed           scale,
+                 FT_Bool             bottom )
+  {
+    CF2_Fixed               width;
+    const CF2_StemHintRec*  stemHint;
+
+
+    FT_ZERO( hint );
+
+    stemHint = (const CF2_StemHintRec*)cf2_arrstack_getPointer(
+                                         stemHintArray,
+                                         indexStemHint );
+
+    width = stemHint->max - stemHint->min;
+
+    if ( width == cf2_intToFixed( -21 ) )
+    {
+      /* ghost bottom */
+
+      if ( bottom )
+      {
+        hint->csCoord = stemHint->max;
+        hint->flags   = CF2_GhostBottom;
+      }
+      else
+        hint->flags = 0;
+    }
+
+    else if ( width == cf2_intToFixed( -20 ) )
+    {
+      /* ghost top */
+
+      if ( bottom )
+        hint->flags = 0;
+      else
+      {
+        hint->csCoord = stemHint->min;
+        hint->flags   = CF2_GhostTop;
+      }
+    }
+
+    else if ( width < 0 )
+    {
+      /* inverted pair */
+
+      /*
+       * Hints with negative widths were produced by an early version of a
+       * non-Adobe font tool.  The Type 2 spec allows edge (ghost) hints
+       * with negative widths, but says
+       *
+       *   All other negative widths have undefined meaning.
+       *
+       * CoolType has a silent workaround that negates the hint width; for
+       * permissive mode, we do the same here.
+       *
+       * Note: Such fonts cannot use ghost hints, but should otherwise work.
+       * Note: Some poor hints in our faux fonts can produce negative
+       *       widths at some blends.  For example, see a light weight of
+       *       `u' in ASerifMM.
+       *
+       */
+      if ( bottom )
+      {
+        hint->csCoord = stemHint->max;
+        hint->flags   = CF2_PairBottom;
+      }
+      else
+      {
+        hint->csCoord = stemHint->min;
+        hint->flags   = CF2_PairTop;
+      }
+    }
+
+    else
+    {
+      /* normal pair */
+
+      if ( bottom )
+      {
+        hint->csCoord = stemHint->min;
+        hint->flags   = CF2_PairBottom;
+      }
+      else
+      {
+        hint->csCoord = stemHint->max;
+        hint->flags   = CF2_PairTop;
+      }
+    }
+
+    /* Now that ghost hints have been detected, adjust this edge for      */
+    /* darkening.  Bottoms are not changed; tops are incremented by twice */
+    /* `darkenY'.                                                         */
+    if ( cf2_hint_isTop( hint ) )
+      hint->csCoord += 2 * font->darkenY;
+
+    hint->csCoord += hintOrigin;
+    hint->scale    = scale;
+    hint->index    = indexStemHint;   /* index in original stem hint array */
+
+    /* if original stem hint has been used, use the same position */
+    if ( hint->flags != 0 && stemHint->used )
+    {
+      if ( cf2_hint_isTop( hint ) )
+        hint->dsCoord = stemHint->maxDS;
+      else
+        hint->dsCoord = stemHint->minDS;
+
+      cf2_hint_lock( hint );
+    }
+    else
+      hint->dsCoord = FT_MulFix( hint->csCoord, scale );
+  }
+
+
+  /* initialize an invalid hint map element */
+  static void
+  cf2_hint_initZero( CF2_Hint  hint )
+  {
+    FT_ZERO( hint );
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  cf2_hint_isValid( const CF2_Hint  hint )
+  {
+    return (FT_Bool)( hint->flags != 0 );
+  }
+
+
+  static FT_Bool
+  cf2_hint_isPair( const CF2_Hint  hint )
+  {
+    return (FT_Bool)( ( hint->flags                      &
+                        ( CF2_PairBottom | CF2_PairTop ) ) != 0 );
+  }
+
+
+  static FT_Bool
+  cf2_hint_isPairTop( const CF2_Hint  hint )
+  {
+    return (FT_Bool)( ( hint->flags & CF2_PairTop ) != 0 );
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  cf2_hint_isTop( const CF2_Hint  hint )
+  {
+    return (FT_Bool)( ( hint->flags                    &
+                        ( CF2_PairTop | CF2_GhostTop ) ) != 0 );
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  cf2_hint_isBottom( const CF2_Hint  hint )
+  {
+    return (FT_Bool)( ( hint->flags                          &
+                        ( CF2_PairBottom | CF2_GhostBottom ) ) != 0 );
+  }
+
+
+  static FT_Bool
+  cf2_hint_isLocked( const CF2_Hint  hint )
+  {
+    return (FT_Bool)( ( hint->flags & CF2_Locked ) != 0 );
+  }
+
+
+  static FT_Bool
+  cf2_hint_isSynthetic( const CF2_Hint  hint )
+  {
+    return (FT_Bool)( ( hint->flags & CF2_Synthetic ) != 0 );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_hint_lock( CF2_Hint  hint )
+  {
+    hint->flags |= CF2_Locked;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_hintmap_init( CF2_HintMap   hintmap,
+                    CF2_Font      font,
+                    CF2_HintMap   initialMap,
+                    CF2_ArrStack  hintMoves,
+                    CF2_Fixed     scale )
+  {
+    FT_ZERO( hintmap );
+
+    /* copy parameters from font instance */
+    hintmap->hinted         = font->hinted;
+    hintmap->scale          = scale;
+    hintmap->font           = font;
+    hintmap->initialHintMap = initialMap;
+    /* will clear in `cf2_hintmap_adjustHints' */
+    hintmap->hintMoves      = hintMoves;
+  }
+
+
+  static FT_Bool
+  cf2_hintmap_isValid( const CF2_HintMap  hintmap )
+  {
+    return hintmap->isValid;
+  }
+
+
+  /* transform character space coordinate to device space using hint map */
+  static CF2_Fixed
+  cf2_hintmap_map( CF2_HintMap  hintmap,
+                   CF2_Fixed    csCoord )
+  {
+    FT_ASSERT( hintmap->isValid );  /* must call Build before Map */
+    FT_ASSERT( hintmap->lastIndex < CF2_MAX_HINT_EDGES );
+
+    if ( hintmap->count == 0 || ! hintmap->hinted )
+    {
+      /* there are no hints; use uniform scale and zero offset */
+      return FT_MulFix( csCoord, hintmap->scale );
+    }
+    else
+    {
+      /* start linear search from last hit */
+      CF2_UInt  i = hintmap->lastIndex;
+
+
+      /* search up */
+      while ( i < hintmap->count - 1                  &&
+              csCoord >= hintmap->edge[i + 1].csCoord )
+        i += 1;
+
+      /* search down */
+      while ( i > 0 && csCoord < hintmap->edge[i].csCoord )
+        i -= 1;
+
+      hintmap->lastIndex = i;
+
+      if ( i == 0 && csCoord < hintmap->edge[0].csCoord )
+      {
+        /* special case for points below first edge: use uniform scale */
+        return FT_MulFix( csCoord - hintmap->edge[0].csCoord,
+                          hintmap->scale ) +
+                 hintmap->edge[0].dsCoord;
+      }
+      else
+      {
+        /*
+         * Note: entries with duplicate csCoord are allowed.
+         * Use edge[i], the highest entry where csCoord >= entry[i].csCoord
+         */
+        return FT_MulFix( csCoord - hintmap->edge[i].csCoord,
+                          hintmap->edge[i].scale ) +
+                 hintmap->edge[i].dsCoord;
+      }
+    }
+  }
+
+
+  /*
+   * This hinting policy moves a hint pair in device space so that one of
+   * its two edges is on a device pixel boundary (its fractional part is
+   * zero).  `cf2_hintmap_insertHint' guarantees no overlap in CS
+   * space.  Ensure here that there is no overlap in DS.
+   *
+   * In the first pass, edges are adjusted relative to adjacent hints.
+   * Those that are below have already been adjusted.  Those that are
+   * above have not yet been adjusted.  If a hint above blocks an
+   * adjustment to an optimal position, we will try again in a second
+   * pass.  The second pass is top-down.
+   *
+   */
+
+  static void
+  cf2_hintmap_adjustHints( CF2_HintMap  hintmap )
+  {
+    size_t  i, j;
+
+
+    cf2_arrstack_clear( hintmap->hintMoves );      /* working storage */
+
+    /*
+     * First pass is bottom-up (font hint order) without look-ahead.
+     * Locked edges are already adjusted.
+     * Unlocked edges begin with dsCoord from `initialHintMap'.
+     * Save edges that are not optimally adjusted in `hintMoves' array,
+     * and process them in second pass.
+     */
+
+    for ( i = 0; i < hintmap->count; i++ )
+    {
+      FT_Bool  isPair = cf2_hint_isPair( &hintmap->edge[i] );
+
+
+      /* index of upper edge (same value for ghost hint) */
+      j = isPair ? i + 1 : i;
+
+      FT_ASSERT( j < hintmap->count );
+      FT_ASSERT( cf2_hint_isValid( &hintmap->edge[i] ) );
+      FT_ASSERT( cf2_hint_isValid( &hintmap->edge[j] ) );
+      FT_ASSERT( cf2_hint_isLocked( &hintmap->edge[i] ) ==
+                   cf2_hint_isLocked( &hintmap->edge[j] ) );
+
+      if ( !cf2_hint_isLocked( &hintmap->edge[i] ) )
+      {
+        /* hint edge is not locked, we can adjust it */
+        CF2_Fixed  fracDown = cf2_fixedFraction( hintmap->edge[i].dsCoord );
+        CF2_Fixed  fracUp   = cf2_fixedFraction( hintmap->edge[j].dsCoord );
+
+        /* calculate all four possibilities; moves down are negative */
+        CF2_Fixed  downMoveDown = 0 - fracDown;
+        CF2_Fixed  upMoveDown   = 0 - fracUp;
+        CF2_Fixed  downMoveUp   = fracDown == 0
+                                    ? 0
+                                    : cf2_intToFixed( 1 ) - fracDown;
+        CF2_Fixed  upMoveUp     = fracUp == 0
+                                    ? 0
+                                    : cf2_intToFixed( 1 ) - fracUp;
+
+        /* smallest move up */
+        CF2_Fixed  moveUp   = FT_MIN( downMoveUp, upMoveUp );
+        /* smallest move down */
+        CF2_Fixed  moveDown = FT_MAX( downMoveDown, upMoveDown );
+
+        /* final amount to move edge or edge pair */
+        CF2_Fixed  move;
+
+        CF2_Fixed  downMinCounter = CF2_MIN_COUNTER;
+        CF2_Fixed  upMinCounter   = CF2_MIN_COUNTER;
+        FT_Bool    saveEdge       = FALSE;
+
+
+        /* minimum counter constraint doesn't apply when adjacent edges */
+        /* are synthetic                                                */
+        /* TODO: doesn't seem a big effect; for now, reduce the code    */
+#if 0
+        if ( i == 0                                        ||
+             cf2_hint_isSynthetic( &hintmap->edge[i - 1] ) )
+          downMinCounter = 0;
+
+        if ( j >= hintmap->count - 1                       ||
+             cf2_hint_isSynthetic( &hintmap->edge[j + 1] ) )
+          upMinCounter = 0;
+#endif
+
+        /* is there room to move up?                                    */
+        /* there is if we are at top of array or the next edge is at or */
+        /* beyond proposed move up?                                     */
+        if ( j >= hintmap->count - 1                            ||
+             hintmap->edge[j + 1].dsCoord >=
+               hintmap->edge[j].dsCoord + moveUp + upMinCounter )
+        {
+          /* there is room to move up; is there also room to move down? */
+          if ( i == 0                                                 ||
+               hintmap->edge[i - 1].dsCoord <=
+                 hintmap->edge[i].dsCoord + moveDown - downMinCounter )
+          {
+            /* move smaller absolute amount */
+            move = ( -moveDown < moveUp ) ? moveDown : moveUp;  /* optimum */
+          }
+          else
+            move = moveUp;
+        }
+        else
+        {
+          /* is there room to move down? */
+          if ( i == 0                                                 ||
+               hintmap->edge[i - 1].dsCoord <=
+                 hintmap->edge[i].dsCoord + moveDown - downMinCounter )
+          {
+            move     = moveDown;
+            /* true if non-optimum move */
+            saveEdge = (FT_Bool)( moveUp < -moveDown );
+          }
+          else
+          {
+            /* no room to move either way without overlapping or reducing */
+            /* the counter too much                                       */
+            move     = 0;
+            saveEdge = TRUE;
+          }
+        }
+
+        /* Identify non-moves and moves down that aren't optimal, and save */
+        /* them for second pass.                                           */
+        /* Do this only if there is an unlocked edge above (which could    */
+        /* possibly move).                                                 */
+        if ( saveEdge                                    &&
+             j < hintmap->count - 1                      &&
+             !cf2_hint_isLocked( &hintmap->edge[j + 1] ) )
+        {
+          CF2_HintMoveRec  savedMove;
+
+
+          savedMove.j      = j;
+          /* desired adjustment in second pass */
+          savedMove.moveUp = moveUp - move;
+
+          cf2_arrstack_push( hintmap->hintMoves, &savedMove );
+        }
+
+        /* move the edge(s) */
+        hintmap->edge[i].dsCoord += move;
+        if ( isPair )
+          hintmap->edge[j].dsCoord += move;
+      }
+
+      /* assert there are no overlaps in device space */
+      FT_ASSERT( i == 0                                                   ||
+                 hintmap->edge[i - 1].dsCoord <= hintmap->edge[i].dsCoord );
+      FT_ASSERT( i < j                                                ||
+                 hintmap->edge[i].dsCoord <= hintmap->edge[j].dsCoord );
+
+      /* adjust the scales, avoiding divide by zero */
+      if ( i > 0 )
+      {
+        if ( hintmap->edge[i].csCoord != hintmap->edge[i - 1].csCoord )
+          hintmap->edge[i - 1].scale =
+            FT_DivFix(
+              hintmap->edge[i].dsCoord - hintmap->edge[i - 1].dsCoord,
+              hintmap->edge[i].csCoord - hintmap->edge[i - 1].csCoord );
+      }
+
+      if ( isPair )
+      {
+        if ( hintmap->edge[j].csCoord != hintmap->edge[j - 1].csCoord )
+          hintmap->edge[j - 1].scale =
+            FT_DivFix(
+              hintmap->edge[j].dsCoord - hintmap->edge[j - 1].dsCoord,
+              hintmap->edge[j].csCoord - hintmap->edge[j - 1].csCoord );
+
+        i += 1;     /* skip upper edge on next loop */
+      }
+    }
+
+    /* second pass tries to move non-optimal hints up, in case there is */
+    /* room now                                                         */
+    for ( i = cf2_arrstack_size( hintmap->hintMoves ); i > 0; i-- )
+    {
+      CF2_HintMove  hintMove = (CF2_HintMove)
+                      cf2_arrstack_getPointer( hintmap->hintMoves, i - 1 );
+
+
+      j = hintMove->j;
+
+      /* this was tested before the push, above */
+      FT_ASSERT( j < hintmap->count - 1 );
+
+      /* is there room to move up? */
+      if ( hintmap->edge[j + 1].dsCoord >=
+             hintmap->edge[j].dsCoord + hintMove->moveUp + CF2_MIN_COUNTER )
+      {
+        /* there is more room now, move edge up */
+        hintmap->edge[j].dsCoord += hintMove->moveUp;
+
+        if ( cf2_hint_isPair( &hintmap->edge[j] ) )
+        {
+          FT_ASSERT( j > 0 );
+          hintmap->edge[j - 1].dsCoord += hintMove->moveUp;
+        }
+      }
+    }
+  }
+
+
+  /* insert hint edges into map, sorted by csCoord */
+  static void
+  cf2_hintmap_insertHint( CF2_HintMap  hintmap,
+                          CF2_Hint     bottomHintEdge,
+                          CF2_Hint     topHintEdge )
+  {
+    CF2_UInt  indexInsert;
+
+    /* set default values, then check for edge hints */
+    FT_Bool   isPair         = TRUE;
+    CF2_Hint  firstHintEdge  = bottomHintEdge;
+    CF2_Hint  secondHintEdge = topHintEdge;
+
+
+    /* one or none of the input params may be invalid when dealing with */
+    /* edge hints; at least one edge must be valid                      */
+    FT_ASSERT( cf2_hint_isValid( bottomHintEdge ) ||
+               cf2_hint_isValid( topHintEdge )    );
+
+    /* determine how many and which edges to insert */
+    if ( !cf2_hint_isValid( bottomHintEdge ) )
+    {
+      /* insert only the top edge */
+      firstHintEdge = topHintEdge;
+      isPair        = FALSE;
+    }
+    else if ( !cf2_hint_isValid( topHintEdge ) )
+    {
+      /* insert only the bottom edge */
+      isPair = FALSE;
+    }
+
+    /* paired edges must be in proper order */
+    FT_ASSERT( !isPair                                         ||
+               topHintEdge->csCoord >= bottomHintEdge->csCoord );
+
+    /* linear search to find index value of insertion point */
+    indexInsert = 0;
+    for ( ; indexInsert < hintmap->count; indexInsert++ )
+    {
+      if ( hintmap->edge[indexInsert].csCoord > firstHintEdge->csCoord )
+        break;
+    }
+
+    /*
+     * Discard any hints that overlap in character space.  Most often,
+     * this is while building the initial map, but in theory, it can also
+     * occur because of darkening.
+     *
+     */
+    if ( indexInsert < hintmap->count )
+    {
+      /* we are inserting before an existing edge:              */
+      /* verify that a new pair does not straddle the next edge */
+      if ( isPair                                                       &&
+           hintmap->edge[indexInsert].csCoord < secondHintEdge->csCoord )
+        return; /* ignore overlapping stem hint */
+
+      /* verify that we are not inserting between paired edges */
+      if ( cf2_hint_isPairTop( &hintmap->edge[indexInsert] ) )
+        return; /* ignore overlapping stem hint */
+    }
+
+    /* recompute device space locations using initial hint map */
+    if ( cf2_hintmap_isValid( hintmap->initialHintMap ) &&
+         !cf2_hint_isLocked( firstHintEdge )            )
+    {
+      if ( isPair )
+      {
+        /* Use hint map to position the center of stem, and nominal scale */
+        /* to position the two edges.  This preserves the stem width.     */
+        CF2_Fixed  midpoint  = cf2_hintmap_map(
+                                 hintmap->initialHintMap,
+                                 ( secondHintEdge->csCoord +
+                                   firstHintEdge->csCoord ) / 2 );
+        CF2_Fixed  halfWidth = FT_MulFix(
+                                 ( secondHintEdge->csCoord -
+                                   firstHintEdge->csCoord ) / 2,
+                                 hintmap->scale );
+
+
+        firstHintEdge->dsCoord  = midpoint - halfWidth;
+        secondHintEdge->dsCoord = midpoint + halfWidth;
+      }
+      else
+        firstHintEdge->dsCoord = cf2_hintmap_map( hintmap->initialHintMap,
+                                                  firstHintEdge->csCoord );
+    }
+
+    /* discard any hints that overlap in device space; this can occur */
+    /* because locked hints have been moved to align with blue zones  */
+    if ( indexInsert > 0 )
+    {
+      /* we are inserting after an existing edge */
+      if ( firstHintEdge->dsCoord < hintmap->edge[indexInsert - 1].dsCoord )
+        return;
+    }
+
+    if ( indexInsert < hintmap->count )
+    {
+      /* we are inserting before an existing edge */
+      if ( isPair )
+      {
+        if ( secondHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord )
+          return;
+      }
+      else
+      {
+        if ( firstHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord )
+          return;
+      }
+    }
+
+    /* make room to insert */
+    {
+      CF2_Int  iSrc = hintmap->count - 1;
+      CF2_Int  iDst = isPair ? hintmap->count + 1 : hintmap->count;
+
+      CF2_Int  count = hintmap->count - indexInsert;
+
+
+      if ( iDst >= CF2_MAX_HINT_EDGES )
+      {
+        FT_TRACE4(( "cf2_hintmap_insertHint: too many hintmaps\n" ));
+        return;
+      }
+
+      while ( count-- )
+        hintmap->edge[iDst--] = hintmap->edge[iSrc--];
+
+      /* insert first edge */
+      hintmap->edge[indexInsert] = *firstHintEdge;         /* copy struct */
+      hintmap->count += 1;
+
+      if ( isPair )
+      {
+        /* insert second edge */
+        hintmap->edge[indexInsert + 1] = *secondHintEdge;  /* copy struct */
+        hintmap->count                += 1;
+      }
+    }
+
+    return;
+  }
+
+
+  /*
+   * Build a map from hints and mask.
+   *
+   * This function may recur one level if `hintmap->initialHintMap' is not yet
+   * valid.
+   * If `initialMap' is true, simply build initial map.
+   *
+   * Synthetic hints are used in two ways.  A hint at zero is inserted, if
+   * needed, in the initial hint map, to prevent translations from
+   * propagating across the origin.  If synthetic em box hints are enabled
+   * for ideographic dictionaries, then they are inserted in all hint
+   * maps, including the initial one.
+   *
+   */
+  FT_LOCAL_DEF( void )
+  cf2_hintmap_build( CF2_HintMap   hintmap,
+                     CF2_ArrStack  hStemHintArray,
+                     CF2_ArrStack  vStemHintArray,
+                     CF2_HintMask  hintMask,
+                     CF2_Fixed     hintOrigin,
+                     FT_Bool       initialMap )
+  {
+    FT_Byte*  maskPtr;
+	FT_Byte*  maskEndPtr;	// add by Xiaochuan_Liu
+
+    CF2_Font         font = hintmap->font;
+    CF2_HintMaskRec  tempHintMask;
+
+    size_t   bitCount, i;
+    FT_Byte  maskByte;
+
+
+    /* check whether initial map is constructed */
+    if ( !initialMap && !cf2_hintmap_isValid( hintmap->initialHintMap ) )
+    {
+      /* make recursive call with initialHintMap and temporary mask; */
+      /* temporary mask will get all bits set, below */
+      cf2_hintmask_init( &tempHintMask, hintMask->error );
+      cf2_hintmap_build( hintmap->initialHintMap,
+                         hStemHintArray,
+                         vStemHintArray,
+                         &tempHintMask,
+                         hintOrigin,
+                         TRUE );
+    }
+
+    if ( !cf2_hintmask_isValid( hintMask ) )
+    {
+      /* without a hint mask, assume all hints are active */
+      cf2_hintmask_setAll( hintMask,
+                           cf2_arrstack_size( hStemHintArray ) +
+                             cf2_arrstack_size( vStemHintArray ) );
+    }
+
+    /* begin by clearing the map */
+    hintmap->count     = 0;
+    hintmap->lastIndex = 0;
+
+    /* make a copy of the hint mask so we can modify it */
+    tempHintMask = *hintMask;
+    maskPtr      = cf2_hintmask_getMaskPtr( &tempHintMask );
+	maskEndPtr   = maskPtr + ( CF2_MAX_HINTS + 7 ) / 8;
+
+
+    /* use the hStem hints only, which are first in the mask */
+    /* TODO: compare this to cffhintmaskGetBitCount */
+    bitCount = cf2_arrstack_size( hStemHintArray );
+
+    /* synthetic embox hints get highest priority */
+    if ( font->blues.doEmBoxHints )
+    {
+      CF2_HintRec  dummy;
+
+
+      cf2_hint_initZero( &dummy );   /* invalid hint map element */
+
+      /* ghost bottom */
+      cf2_hintmap_insertHint( hintmap,
+                              &font->blues.emBoxBottomEdge,
+                              &dummy );
+      /* ghost top */
+      cf2_hintmap_insertHint( hintmap,
+                              &dummy,
+                              &font->blues.emBoxTopEdge );
+    }
+
+    /* insert hints captured by a blue zone or already locked (higher */
+    /* priority)                                                      */
+    for ( i = 0, maskByte = 0x80; i < bitCount; i++ )
+    {
+      if ( maskByte & *maskPtr )
+      {
+        /* expand StemHint into two `CF2_Hint' elements */
+        CF2_HintRec  bottomHintEdge, topHintEdge;
+
+
+        cf2_hint_init( &bottomHintEdge,
+                       hStemHintArray,
+                       i,
+                       font,
+                       hintOrigin,
+                       hintmap->scale,
+                       TRUE /* bottom */ );
+        cf2_hint_init( &topHintEdge,
+                       hStemHintArray,
+                       i,
+                       font,
+                       hintOrigin,
+                       hintmap->scale,
+                       FALSE /* top */ );
+
+        if ( cf2_hint_isLocked( &bottomHintEdge ) ||
+             cf2_hint_isLocked( &topHintEdge )    ||
+             cf2_blues_capture( &font->blues,
+                                &bottomHintEdge,
+                                &topHintEdge )   )
+        {
+          /* insert captured hint into map */
+          cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge );
+
+          *maskPtr &= ~maskByte;      /* turn off the bit for this hint */
+        }
+      }
+
+      if ( ( i & 7 ) == 7 )
+      {
+        /* move to next mask byte */
+        maskPtr++;
+		if (maskEndPtr >= maskEndPtr)
+		{
+			break;
+		}
+		
+        maskByte = 0x80;
+      }
+      else
+        maskByte >>= 1;
+    }
+
+    /* initial hint map includes only captured hints plus maybe one at 0 */
+
+    /*
+     * TODO: There is a problem here because we are trying to build a
+     *       single hint map containing all captured hints.  It is
+     *       possible for there to be conflicts between captured hints,
+     *       either because of darkening or because the hints are in
+     *       separate hint zones (we are ignoring hint zones for the
+     *       initial map).  An example of the latter is MinionPro-Regular
+     *       v2.030 glyph 883 (Greek Capital Alpha with Psili) at 15ppem.
+     *       A stem hint for the psili conflicts with the top edge hint
+     *       for the base character.  The stem hint gets priority because
+     *       of its sort order.  In glyph 884 (Greek Capital Alpha with
+     *       Psili and Oxia), the top of the base character gets a stem
+     *       hint, and the psili does not.  This creates different initial
+     *       maps for the two glyphs resulting in different renderings of
+     *       the base character.  Will probably defer this either as not
+     *       worth the cost or as a font bug.  I don't think there is any
+     *       good reason for an accent to be captured by an alignment
+     *       zone.  -darnold 2/12/10
+     */
+
+    if ( initialMap )
+    {
+      /* Apply a heuristic that inserts a point for (0,0), unless it's     */
+      /* already covered by a mapping.  This locks the baseline for glyphs */
+      /* that have no baseline hints.                                      */
+
+      if ( hintmap->count == 0                           ||
+           hintmap->edge[0].csCoord > 0                  ||
+           hintmap->edge[hintmap->count - 1].csCoord < 0 )
+      {
+        /* all edges are above 0 or all edges are below 0; */
+        /* construct a locked edge hint at 0               */
+
+        CF2_HintRec  edge, invalid;
+
+
+        cf2_hint_initZero( &edge );
+
+        edge.flags = CF2_GhostBottom |
+                     CF2_Locked      |
+                     CF2_Synthetic;
+        edge.scale = hintmap->scale;
+
+        cf2_hint_initZero( &invalid );
+        cf2_hintmap_insertHint( hintmap, &edge, &invalid );
+      }
+    }
+    else
+    {
+      /* insert remaining hints */
+
+      maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask );
+	  maskEndPtr   = maskPtr + ( CF2_MAX_HINTS + 7 ) / 8;
+
+      for ( i = 0, maskByte = 0x80; i < bitCount; i++ )
+      {
+        if ( maskByte & *maskPtr )
+        {
+          CF2_HintRec  bottomHintEdge, topHintEdge;
+
+
+          cf2_hint_init( &bottomHintEdge,
+                         hStemHintArray,
+                         i,
+                         font,
+                         hintOrigin,
+                         hintmap->scale,
+                         TRUE /* bottom */ );
+          cf2_hint_init( &topHintEdge,
+                         hStemHintArray,
+                         i,
+                         font,
+                         hintOrigin,
+                         hintmap->scale,
+                         FALSE /* top */ );
+
+          cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge );
+        }
+
+        if ( ( i & 7 ) == 7 )
+        {
+          /* move to next mask byte */
+          maskPtr++;
+		  if (maskPtr >= maskEndPtr)
+		  {
+			break;
+		  }
+          maskByte = 0x80;
+        }
+        else
+          maskByte >>= 1;
+      }
+    }
+
+    /*
+     * Note: The following line is a convenient place to break when
+     *       debugging hinting.  Examine `hintmap->edge' for the list of
+     *       enabled hints, then step over the call to see the effect of
+     *       adjustment.  We stop here first on the recursive call that
+     *       creates the initial map, and then on each counter group and
+     *       hint zone.
+     */
+
+    /* adjust positions of hint edges that are not locked to blue zones */
+    cf2_hintmap_adjustHints( hintmap );
+
+    /* save the position of all hints that were used in this hint map; */
+    /* if we use them again, we'll locate them in the same position    */
+    if ( !initialMap )
+    {
+      for ( i = 0; i < hintmap->count; i++ )
+      {
+        if ( !cf2_hint_isSynthetic( &hintmap->edge[i] ) )
+        {
+          /* Note: include both valid and invalid edges            */
+          /* Note: top and bottom edges are copied back separately */
+          CF2_StemHint  stemhint = (CF2_StemHint)
+                          cf2_arrstack_getPointer( hStemHintArray,
+                                                   hintmap->edge[i].index );
+
+
+          if ( cf2_hint_isTop( &hintmap->edge[i] ) )
+            stemhint->maxDS = hintmap->edge[i].dsCoord;
+          else
+            stemhint->minDS = hintmap->edge[i].dsCoord;
+
+          stemhint->used = TRUE;
+        }
+      }
+    }
+
+    /* hint map is ready to use */
+    hintmap->isValid = TRUE;
+
+    /* remember this mask has been used */
+    cf2_hintmask_setNew( hintMask, FALSE );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_glyphpath_init( CF2_GlyphPath         glyphpath,
+                      CF2_Font              font,
+                      CF2_OutlineCallbacks  callbacks,
+                      CF2_Fixed             scaleY,
+                      /* CF2_Fixed  hShift, */
+                      CF2_ArrStack          hStemHintArray,
+                      CF2_ArrStack          vStemHintArray,
+                      CF2_HintMask          hintMask,
+                      CF2_Fixed             hintOriginY,
+                      const CF2_Blues       blues,
+                      const FT_Vector*      fractionalTranslation )
+  {
+    FT_ZERO( glyphpath );
+
+    glyphpath->font      = font;
+    glyphpath->callbacks = callbacks;
+
+    cf2_arrstack_init( &glyphpath->hintMoves,
+                       font->memory,
+                       &font->error,
+                       sizeof ( CF2_HintMoveRec ) );
+
+    cf2_hintmap_init( &glyphpath->initialHintMap,
+                      font,
+                      &glyphpath->initialHintMap,
+                      &glyphpath->hintMoves,
+                      scaleY );
+    cf2_hintmap_init( &glyphpath->firstHintMap,
+                      font,
+                      &glyphpath->initialHintMap,
+                      &glyphpath->hintMoves,
+                      scaleY );
+    cf2_hintmap_init( &glyphpath->hintMap,
+                      font,
+                      &glyphpath->initialHintMap,
+                      &glyphpath->hintMoves,
+                      scaleY );
+
+    glyphpath->scaleX = font->innerTransform.a;
+    glyphpath->scaleC = font->innerTransform.c;
+    glyphpath->scaleY = font->innerTransform.d;
+
+    glyphpath->fractionalTranslation = *fractionalTranslation;
+
+#if 0
+    glyphpath->hShift = hShift;       /* for fauxing */
+#endif
+
+    glyphpath->hStemHintArray = hStemHintArray;
+    glyphpath->vStemHintArray = vStemHintArray;
+    glyphpath->hintMask       = hintMask;      /* ptr to current mask */
+    glyphpath->hintOriginY    = hintOriginY;
+    glyphpath->blues          = blues;
+    glyphpath->darken         = font->darkened; /* TODO: should we make copies? */
+    glyphpath->xOffset        = font->darkenX;
+    glyphpath->yOffset        = font->darkenY;
+    glyphpath->miterLimit     = 2 * FT_MAX(
+                                     cf2_fixedAbs( glyphpath->xOffset ),
+                                     cf2_fixedAbs( glyphpath->yOffset ) );
+
+    /* .1 character space unit */
+    glyphpath->snapThreshold = cf2_floatToFixed( 0.1f );
+
+    glyphpath->moveIsPending = TRUE;
+    glyphpath->pathIsOpen    = FALSE;
+    glyphpath->elemIsQueued  = FALSE;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_glyphpath_finalize( CF2_GlyphPath  glyphpath )
+  {
+    cf2_arrstack_finalize( &glyphpath->hintMoves );
+  }
+
+
+  /*
+   * Hint point in y-direction and apply outerTransform.
+   * Input `current' hint map (which is actually delayed by one element).
+   * Input x,y point in Character Space.
+   * Output x,y point in Device Space, including translation.
+   */
+  static void
+  cf2_glyphpath_hintPoint( CF2_GlyphPath  glyphpath,
+                           CF2_HintMap    hintmap,
+                           FT_Vector*     ppt,
+                           CF2_Fixed      x,
+                           CF2_Fixed      y )
+  {
+    FT_Vector  pt;   /* hinted point in upright DS */
+
+
+    pt.x = FT_MulFix( glyphpath->scaleX, x ) +
+             FT_MulFix( glyphpath->scaleC, y );
+    pt.y = cf2_hintmap_map( hintmap, y );
+
+    ppt->x = FT_MulFix( glyphpath->font->outerTransform.a, pt.x )   +
+               FT_MulFix( glyphpath->font->outerTransform.c, pt.y ) +
+               glyphpath->fractionalTranslation.x;
+    ppt->y = FT_MulFix( glyphpath->font->outerTransform.b, pt.x )   +
+               FT_MulFix( glyphpath->font->outerTransform.d, pt.y ) +
+               glyphpath->fractionalTranslation.y;
+  }
+
+
+  /*
+   * From two line segments, (u1,u2) and (v1,v2), compute a point of
+   * intersection on the corresponding lines.
+   * Return false if no intersection is found, or if the intersection is
+   * too far away from the ends of the line segments, u2 and v1.
+   *
+   */
+  static FT_Bool
+  cf2_glyphpath_computeIntersection( CF2_GlyphPath     glyphpath,
+                                     const FT_Vector*  u1,
+                                     const FT_Vector*  u2,
+                                     const FT_Vector*  v1,
+                                     const FT_Vector*  v2,
+                                     FT_Vector*        intersection )
+  {
+    /*
+     * Let `u' be a zero-based vector from the first segment, `v' from the
+     * second segment.
+     * Let `w 'be the zero-based vector from `u1' to `v1'.
+     * `perp' is the `perpendicular dot product'; see
+     * http://mathworld.wolfram.com/PerpDotProduct.html.
+     * `s' is the parameter for the parametric line for the first segment
+     * (`u').
+     *
+     * See notation in
+     * http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm.
+     * Calculations are done in 16.16, but must handle the squaring of
+     * line lengths in character space.  We scale all vectors by 1/32 to
+     * avoid overflow.  This allows values up to 4095 to be squared.  The
+     * scale factor cancels in the divide.
+     *
+     * TODO: the scale factor could be computed from UnitsPerEm.
+     *
+     */
+
+#define cf2_perp( a, b )                                    \
+          ( FT_MulFix( a.x, b.y ) - FT_MulFix( a.y, b.x ) )
+
+  /* round and divide by 32 */
+#define CF2_CS_SCALE( x )         \
+          ( ( (x) + 0x10 ) >> 5 )
+
+    FT_Vector  u, v, w;      /* scaled vectors */
+    CF2_Fixed  denominator, s;
+
+
+    u.x = CF2_CS_SCALE( u2->x - u1->x );
+    u.y = CF2_CS_SCALE( u2->y - u1->y );
+    v.x = CF2_CS_SCALE( v2->x - v1->x );
+    v.y = CF2_CS_SCALE( v2->y - v1->y );
+    w.x = CF2_CS_SCALE( v1->x - u1->x );
+    w.y = CF2_CS_SCALE( v1->y - u1->y );
+
+    denominator = cf2_perp( u, v );
+
+    if ( denominator == 0 )
+      return FALSE;           /* parallel or coincident lines */
+
+    s = FT_DivFix( cf2_perp( w, v ), denominator );
+
+    intersection->x = u1->x + FT_MulFix( s, u2->x - u1->x );
+    intersection->y = u1->y + FT_MulFix( s, u2->y - u1->y );
+
+    /*
+     * Special case snapping for horizontal and vertical lines.
+     * This cleans up intersections and reduces problems with winding
+     * order detection.
+     * Sample case is sbc cd KozGoPr6N-Medium.otf 20 16685.
+     * Note: these calculations are in character space.
+     *
+     */
+
+    if ( u1->x == u2->x                                                     &&
+         cf2_fixedAbs( intersection->x - u1->x ) < glyphpath->snapThreshold )
+      intersection->x = u1->x;
+    if ( u1->y == u2->y                                                     &&
+         cf2_fixedAbs( intersection->y - u1->y ) < glyphpath->snapThreshold )
+      intersection->y = u1->y;
+
+    if ( v1->x == v2->x                                                     &&
+         cf2_fixedAbs( intersection->x - v1->x ) < glyphpath->snapThreshold )
+      intersection->x = v1->x;
+    if ( v1->y == v2->y                                                     &&
+         cf2_fixedAbs( intersection->y - v1->y ) < glyphpath->snapThreshold )
+      intersection->y = v1->y;
+
+    /* limit the intersection distance from midpoint of u2 and v1 */
+    if ( cf2_fixedAbs( intersection->x - ( u2->x + v1->x ) / 2 ) >
+           glyphpath->miterLimit                                   ||
+         cf2_fixedAbs( intersection->y - ( u2->y + v1->y ) / 2 ) >
+           glyphpath->miterLimit                                   )
+      return FALSE;
+
+    return TRUE;
+  }
+
+
+  /*
+   * Push the cached element (glyphpath->prevElem*) to the outline
+   * consumer.  When a darkening offset is used, the end point of the
+   * cached element may be adjusted to an intersection point or it may be
+   * connected by a line to the current element.  This calculation must
+   * use a HintMap that was valid at the time the element was saved.  For
+   * the first point in a subpath, that is a saved HintMap.  For most
+   * elements, it just means the caller has delayed building a HintMap
+   * from the current HintMask.
+   *
+   * Transform each point with outerTransform and call the outline
+   * callbacks.  This is a general 3x3 transform:
+   *
+   *   x' = a*x + c*y + tx, y' = b*x + d*y + ty
+   *
+   * but it uses 4 elements from CF2_Font and the translation part
+   * from CF2_GlyphPath.
+   *
+   */
+  static void
+  cf2_glyphpath_pushPrevElem( CF2_GlyphPath  glyphpath,
+                              CF2_HintMap    hintmap,
+                              FT_Vector*     nextP0,
+                              FT_Vector      nextP1,
+                              FT_Bool        close )
+  {
+    CF2_CallbackParamsRec  params;
+
+    FT_Vector*  prevP0;
+    FT_Vector*  prevP1;
+
+    FT_Vector  intersection    = { 0, 0 };
+    FT_Bool    useIntersection = FALSE;
+
+
+    FT_ASSERT( glyphpath->prevElemOp == CF2_PathOpLineTo ||
+               glyphpath->prevElemOp == CF2_PathOpCubeTo );
+
+    if ( glyphpath->prevElemOp == CF2_PathOpLineTo )
+    {
+      prevP0 = &glyphpath->prevElemP0;
+      prevP1 = &glyphpath->prevElemP1;
+    }
+    else
+    {
+      prevP0 = &glyphpath->prevElemP2;
+      prevP1 = &glyphpath->prevElemP3;
+    }
+
+    /* optimization: if previous and next elements are offset by the same */
+    /* amount, then there will be no gap, and no need to compute an       */
+    /* intersection.                                                      */
+    if ( prevP1->x != nextP0->x || prevP1->y != nextP0->y )
+    {
+      /* previous element does not join next element:             */
+      /* adjust end point of previous element to the intersection */
+      useIntersection = cf2_glyphpath_computeIntersection( glyphpath,
+                                                           prevP0,
+                                                           prevP1,
+                                                           nextP0,
+                                                           &nextP1,
+                                                           &intersection );
+      if ( useIntersection )
+      {
+        /* modify the last point of the cached element (either line or */
+        /* curve)                                                      */
+        *prevP1 = intersection;
+      }
+    }
+
+    params.pt0 = glyphpath->currentDS;
+
+    switch( glyphpath->prevElemOp )
+    {
+    case CF2_PathOpLineTo:
+      params.op = CF2_PathOpLineTo;
+
+      /* note: pt2 and pt3 are unused */
+      cf2_glyphpath_hintPoint( glyphpath,
+                               hintmap,
+                               &params.pt1,
+                               glyphpath->prevElemP1.x,
+                               glyphpath->prevElemP1.y );
+
+      glyphpath->callbacks->lineTo( glyphpath->callbacks, &params );
+
+      glyphpath->currentDS = params.pt1;
+
+      break;
+
+    case CF2_PathOpCubeTo:
+      params.op = CF2_PathOpCubeTo;
+
+      /* TODO: should we intersect the interior joins (p1-p2 and p2-p3)? */
+      cf2_glyphpath_hintPoint( glyphpath,
+                               hintmap,
+                               &params.pt1,
+                               glyphpath->prevElemP1.x,
+                               glyphpath->prevElemP1.y );
+      cf2_glyphpath_hintPoint( glyphpath,
+                               hintmap,
+                               &params.pt2,
+                               glyphpath->prevElemP2.x,
+                               glyphpath->prevElemP2.y );
+      cf2_glyphpath_hintPoint( glyphpath,
+                               hintmap,
+                               &params.pt3,
+                               glyphpath->prevElemP3.x,
+                               glyphpath->prevElemP3.y );
+
+      glyphpath->callbacks->cubeTo( glyphpath->callbacks, &params );
+
+      glyphpath->currentDS = params.pt3;
+
+      break;
+    }
+
+    if ( !useIntersection || close )
+    {
+      /* insert connecting line between end of previous element and start */
+      /* of current one                                                   */
+      /* note: at the end of a subpath, we might do both, so use `nextP0' */
+      /* before we change it, below                                       */
+
+      cf2_glyphpath_hintPoint( glyphpath,
+                               hintmap,
+                               &params.pt1,
+                               nextP0->x,
+                               nextP0->y );
+
+      if ( params.pt1.x != glyphpath->currentDS.x ||
+           params.pt1.y != glyphpath->currentDS.y )
+      {
+        /* length is nonzero */
+        params.op  = CF2_PathOpLineTo;
+        params.pt0 = glyphpath->currentDS;
+
+        /* note: pt2 and pt3 are unused */
+        glyphpath->callbacks->lineTo( glyphpath->callbacks, &params );
+
+        glyphpath->currentDS = params.pt1;
+      }
+    }
+
+    if ( useIntersection )
+    {
+      /* return intersection point to caller */
+      *nextP0 = intersection;
+    }
+  }
+
+
+  /* push a MoveTo element based on current point and offset of current */
+  /* element                                                            */
+  static void
+  cf2_glyphpath_pushMove( CF2_GlyphPath  glyphpath,
+                          FT_Vector      start )
+  {
+    CF2_CallbackParamsRec  params;
+
+
+    params.op  = CF2_PathOpMoveTo;
+    params.pt0 = glyphpath->currentDS;
+
+    /* Test if move has really happened yet; it would have called */
+    /* `cf2_hintmap_build' to set `isValid'.                   */
+    if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) )
+    {
+      /* we are here iff first subpath is missing a moveto operator: */
+      /* synthesize first moveTo to finish initialization of hintMap */
+      cf2_glyphpath_moveTo( glyphpath,
+                            glyphpath->start.x,
+                            glyphpath->start.y );
+    }
+
+    cf2_glyphpath_hintPoint( glyphpath,
+                             &glyphpath->hintMap,
+                             &params.pt1,
+                             start.x,
+                             start.y );
+
+    /* note: pt2 and pt3 are unused */
+    glyphpath->callbacks->moveTo( glyphpath->callbacks, &params );
+
+    glyphpath->currentDS    = params.pt1;
+    glyphpath->offsetStart0 = start;
+  }
+
+
+  /*
+   * All coordinates are in character space.
+   * On input, (x1, y1) and (x2, y2) give line segment.
+   * On output, (x, y) give offset vector.
+   * We use a piecewise approximation to trig functions.
+   *
+   * TODO: Offset true perpendicular and proper length
+   *       supply the y-translation for hinting here, too,
+   *       that adds yOffset unconditionally to *y.
+   */
+  static void
+  cf2_glyphpath_computeOffset( CF2_GlyphPath  glyphpath,
+                               CF2_Fixed      x1,
+                               CF2_Fixed      y1,
+                               CF2_Fixed      x2,
+                               CF2_Fixed      y2,
+                               CF2_Fixed*     x,
+                               CF2_Fixed*     y )
+  {
+    CF2_Fixed  dx = x2 - x1;
+    CF2_Fixed  dy = y2 - y1;
+
+
+    /* note: negative offsets don't work here; negate deltas to change */
+    /* quadrants, below                                                */
+    if ( glyphpath->font->reverseWinding )
+    {
+      dx = -dx;
+      dy = -dy;
+    }
+
+    *x = *y = 0;
+
+    if ( !glyphpath->darken )
+        return;
+
+    /* add momentum for this path element */
+    glyphpath->callbacks->windingMomentum +=
+      cf2_getWindingMomentum( x1, y1, x2, y2 );
+
+    /* note: allow mixed integer and fixed multiplication here */
+    if ( dx >= 0 )
+    {
+      if ( dy >= 0 )
+      {
+        /* first quadrant, +x +y */
+
+        if ( dx > 2 * dy )
+        {
+          /* +x */
+          *x = 0;
+          *y = 0;
+        }
+        else if ( dy > 2 * dx )
+        {
+          /* +y */
+          *x = glyphpath->xOffset;
+          *y = glyphpath->yOffset;
+        }
+        else
+        {
+          /* +x +y */
+          *x = FT_MulFix( cf2_floatToFixed( 0.7 ),
+                          glyphpath->xOffset );
+          *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),
+                          glyphpath->yOffset );
+        }
+      }
+      else
+      {
+        /* fourth quadrant, +x -y */
+
+        if ( dx > -2 * dy )
+        {
+          /* +x */
+          *x = 0;
+          *y = 0;
+        }
+        else if ( -dy > 2 * dx )
+        {
+          /* -y */
+          *x = -glyphpath->xOffset;
+          *y = glyphpath->yOffset;
+        }
+        else
+        {
+          /* +x -y */
+          *x = FT_MulFix( cf2_floatToFixed( -0.7 ),
+                          glyphpath->xOffset );
+          *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),
+                          glyphpath->yOffset );
+        }
+      }
+    }
+    else
+    {
+      if ( dy >= 0 )
+      {
+        /* second quadrant, -x +y */
+
+        if ( -dx > 2 * dy )
+        {
+          /* -x */
+          *x = 0;
+          *y = 2 * glyphpath->yOffset;
+        }
+        else if ( dy > -2 * dx )
+        {
+          /* +y */
+          *x = glyphpath->xOffset;
+          *y = glyphpath->yOffset;
+        }
+        else
+        {
+          /* -x +y */
+          *x = FT_MulFix( cf2_floatToFixed( 0.7 ),
+                          glyphpath->xOffset );
+          *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),
+                          glyphpath->yOffset );
+        }
+      }
+      else
+      {
+        /* third quadrant, -x -y */
+
+        if ( -dx > -2 * dy )
+        {
+          /* -x */
+          *x = 0;
+          *y = 2 * glyphpath->yOffset;
+        }
+        else if ( -dy > -2 * dx )
+        {
+          /* -y */
+          *x = -glyphpath->xOffset;
+          *y = glyphpath->xOffset;
+        }
+        else
+        {
+          /* -x -y */
+          *x = FT_MulFix( cf2_floatToFixed( -0.7 ),
+                          glyphpath->xOffset );
+          *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),
+                          glyphpath->yOffset );
+        }
+      }
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_glyphpath_moveTo( CF2_GlyphPath  glyphpath,
+                        CF2_Fixed      x,
+                        CF2_Fixed      y )
+  {
+    cf2_glyphpath_closeOpenPath( glyphpath );
+
+    /* save the parameters of the move for later, when we'll know how to */
+    /* offset it;                                                        */
+    /* also save last move point */
+    glyphpath->currentCS.x = glyphpath->start.x = x;
+    glyphpath->currentCS.y = glyphpath->start.y = y;
+
+    glyphpath->moveIsPending = TRUE;
+
+    /* ensure we have a valid map with current mask */
+    if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) ||
+         cf2_hintmask_isNew( glyphpath->hintMask )   )
+      cf2_hintmap_build( &glyphpath->hintMap,
+                         glyphpath->hStemHintArray,
+                         glyphpath->vStemHintArray,
+                         glyphpath->hintMask,
+                         glyphpath->hintOriginY,
+                         FALSE );
+
+    /* save a copy of current HintMap to use when drawing initial point */
+    glyphpath->firstHintMap = glyphpath->hintMap;     /* structure copy */
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_glyphpath_lineTo( CF2_GlyphPath  glyphpath,
+                        CF2_Fixed      x,
+                        CF2_Fixed      y )
+  {
+    CF2_Fixed  xOffset, yOffset;
+    FT_Vector  P0, P1;
+
+
+    /* can't compute offset of zero length line, so ignore them */
+    if ( glyphpath->currentCS.x == x && glyphpath->currentCS.y == y )
+      return;
+
+    cf2_glyphpath_computeOffset( glyphpath,
+                                 glyphpath->currentCS.x,
+                                 glyphpath->currentCS.y,
+                                 x,
+                                 y,
+                                 &xOffset,
+                                 &yOffset );
+
+    /* construct offset points */
+    P0.x = glyphpath->currentCS.x + xOffset;
+    P0.y = glyphpath->currentCS.y + yOffset;
+    P1.x = x + xOffset;
+    P1.y = y + yOffset;
+
+    if ( glyphpath->moveIsPending )
+    {
+      /* emit offset 1st point as MoveTo */
+      cf2_glyphpath_pushMove( glyphpath, P0 );
+
+      glyphpath->moveIsPending = FALSE;  /* adjust state machine */
+      glyphpath->pathIsOpen    = TRUE;
+
+      glyphpath->offsetStart1 = P1;              /* record second point */
+    }
+
+    if ( glyphpath->elemIsQueued )
+    {
+      FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) );
+
+      cf2_glyphpath_pushPrevElem( glyphpath,
+                                  &glyphpath->hintMap,
+                                  &P0,
+                                  P1,
+                                  FALSE );
+    }
+
+    /* queue the current element with offset points */
+    glyphpath->elemIsQueued = TRUE;
+    glyphpath->prevElemOp   = CF2_PathOpLineTo;
+    glyphpath->prevElemP0   = P0;
+    glyphpath->prevElemP1   = P1;
+
+    /* update current map */
+    if ( cf2_hintmask_isNew( glyphpath->hintMask ) )
+      cf2_hintmap_build( &glyphpath->hintMap,
+                         glyphpath->hStemHintArray,
+                         glyphpath->vStemHintArray,
+                         glyphpath->hintMask,
+                         glyphpath->hintOriginY,
+                         FALSE );
+
+    glyphpath->currentCS.x = x;     /* pre-offset current point */
+    glyphpath->currentCS.y = y;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_glyphpath_curveTo( CF2_GlyphPath  glyphpath,
+                         CF2_Fixed      x1,
+                         CF2_Fixed      y1,
+                         CF2_Fixed      x2,
+                         CF2_Fixed      y2,
+                         CF2_Fixed      x3,
+                         CF2_Fixed      y3 )
+  {
+    CF2_Fixed  xOffset1, yOffset1, xOffset3, yOffset3;
+    FT_Vector  P0, P1, P2, P3;
+
+
+    /* TODO: ignore zero length portions of curve?? */
+    cf2_glyphpath_computeOffset( glyphpath,
+                                 glyphpath->currentCS.x,
+                                 glyphpath->currentCS.y,
+                                 x1,
+                                 y1,
+                                 &xOffset1,
+                                 &yOffset1 );
+    cf2_glyphpath_computeOffset( glyphpath,
+                                 x2,
+                                 y2,
+                                 x3,
+                                 y3,
+                                 &xOffset3,
+                                 &yOffset3 );
+
+    /* add momentum from the middle segment */
+    glyphpath->callbacks->windingMomentum +=
+      cf2_getWindingMomentum( x1, y1, x2, y2 );
+
+    /* construct offset points */
+    P0.x = glyphpath->currentCS.x + xOffset1;
+    P0.y = glyphpath->currentCS.y + yOffset1;
+    P1.x = x1 + xOffset1;
+    P1.y = y1 + yOffset1;
+    /* note: preserve angle of final segment by using offset3 at both ends */
+    P2.x = x2 + xOffset3;
+    P2.y = y2 + yOffset3;
+    P3.x = x3 + xOffset3;
+    P3.y = y3 + yOffset3;
+
+    if ( glyphpath->moveIsPending )
+    {
+      /* emit offset 1st point as MoveTo */
+      cf2_glyphpath_pushMove( glyphpath, P0 );
+
+      glyphpath->moveIsPending = FALSE;
+      glyphpath->pathIsOpen    = TRUE;
+
+      glyphpath->offsetStart1 = P1;              /* record second point */
+    }
+
+    if ( glyphpath->elemIsQueued )
+    {
+      FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) );
+
+      cf2_glyphpath_pushPrevElem( glyphpath,
+                                  &glyphpath->hintMap,
+                                  &P0,
+                                  P1,
+                                  FALSE );
+    }
+
+    /* queue the current element with offset points */
+    glyphpath->elemIsQueued = TRUE;
+    glyphpath->prevElemOp   = CF2_PathOpCubeTo;
+    glyphpath->prevElemP0   = P0;
+    glyphpath->prevElemP1   = P1;
+    glyphpath->prevElemP2   = P2;
+    glyphpath->prevElemP3   = P3;
+
+    /* update current map */
+    if ( cf2_hintmask_isNew( glyphpath->hintMask ) )
+      cf2_hintmap_build( &glyphpath->hintMap,
+                         glyphpath->hStemHintArray,
+                         glyphpath->vStemHintArray,
+                         glyphpath->hintMask,
+                         glyphpath->hintOriginY,
+                         FALSE );
+
+    glyphpath->currentCS.x = x3;       /* pre-offset current point */
+    glyphpath->currentCS.y = y3;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_glyphpath_closeOpenPath( CF2_GlyphPath  glyphpath )
+  {
+    if ( glyphpath->pathIsOpen )
+    {
+      FT_ASSERT( cf2_hintmap_isValid( &glyphpath->firstHintMap ) );
+
+      /* since we need to apply an offset to the implicit lineto, we make */
+      /* it explicit here                                                 */
+      cf2_glyphpath_lineTo( glyphpath,
+                            glyphpath->start.x,
+                            glyphpath->start.y );
+
+      /* Draw previous element (the explicit LineTo we just created,      */
+      /* above) and connect it to the start point, but with the offset we */
+      /* saved from the first element.                                    */
+      /* Use the saved HintMap, too. */
+      FT_ASSERT( glyphpath->elemIsQueued );
+
+      cf2_glyphpath_pushPrevElem( glyphpath,
+                                  &glyphpath->firstHintMap,
+                                  &glyphpath->offsetStart0,
+                                  glyphpath->offsetStart1,
+                                  TRUE );
+
+      /* reset state machine */
+      glyphpath->moveIsPending = TRUE;
+      glyphpath->pathIsOpen    = FALSE;
+      glyphpath->elemIsQueued  = FALSE;
+    }
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.h
new file mode 100644
index 0000000..c4fa922
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.h
@@ -0,0 +1,287 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2hints.h                                                             */
+/*                                                                         */
+/*    Adobe's code for handling CFF hints (body).                          */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CF2HINTS_H__
+#define __CF2HINTS_H__
+
+
+FT_BEGIN_HEADER
+
+
+  enum
+  {
+    CF2_MAX_HINTS = 96    /* maximum # of hints */
+  };
+
+
+  /*
+   * A HintMask object stores a bit mask that specifies which hints in the
+   * charstring are active at a given time.  Hints in CFF must be declared
+   * at the start, before any drawing operators, with horizontal hints
+   * preceding vertical hints.  The HintMask is ordered the same way, with
+   * horizontal hints immediately followed by vertical hints.  Clients are
+   * responsible for knowing how many of each type are present.
+   *
+   * The maximum total number of hints is 96, as specified by the CFF
+   * specification.
+   *
+   * A HintMask is built 0 or more times while interpreting a charstring, by
+   * the HintMask operator.  There is only one HintMask, but it is built or
+   * rebuilt each time there is a hint substitution (HintMask operator) in
+   * the charstring.  A default HintMask with all bits set is built if there
+   * has been no HintMask operator prior to the first drawing operator.
+   *
+   */
+
+  typedef struct  CF2_HintMaskRec_
+  {
+    FT_Error*  error;
+
+    FT_Bool  isValid;
+    FT_Bool  isNew;
+
+    size_t  bitCount;
+    size_t  byteCount;
+
+    FT_Byte  mask[( CF2_MAX_HINTS + 7 ) / 8];
+
+  } CF2_HintMaskRec, *CF2_HintMask;
+
+
+  typedef struct  CF2_StemHintRec_
+  {
+    FT_Bool  used;     /* DS positions are valid         */
+
+    CF2_Fixed  min;    /* original character space value */
+    CF2_Fixed  max;
+
+    CF2_Fixed  minDS;  /* DS position after first use    */
+    CF2_Fixed  maxDS;
+
+  } CF2_StemHintRec, *CF2_StemHint;
+
+
+  /*
+   * A HintMap object stores a piecewise linear function for mapping
+   * y-coordinates from character space to device space, providing
+   * appropriate pixel alignment to stem edges.
+   *
+   * The map is implemented as an array of `CF2_Hint' elements, each
+   * representing an edge.  When edges are paired, as from stem hints, the
+   * bottom edge must immediately precede the top edge in the array.
+   * Element character space AND device space positions must both increase
+   * monotonically in the array.  `CF2_Hint' elements are also used as
+   * parameters to `cf2_blues_capture'.
+   *
+   * The `cf2_hintmap_build' method must be called before any drawing
+   * operation (beginning with a Move operator) and at each hint
+   * substitution (HintMask operator).
+   *
+   * The `cf2_hintmap_map' method is called to transform y-coordinates at
+   * each drawing operation (move, line, curve).
+   *
+   */
+
+  /* TODO: make this a CF2_ArrStack and add a deep copy method */
+  enum
+  {
+    CF2_MAX_HINT_EDGES = CF2_MAX_HINTS * 2
+  };
+
+
+  typedef struct  CF2_HintMapRec_
+  {
+    CF2_Font  font;
+
+    /* initial map based on blue zones */
+    struct CF2_HintMapRec_*  initialHintMap;
+
+    /* working storage for 2nd pass adjustHints */
+    CF2_ArrStack  hintMoves;
+
+    FT_Bool  isValid;
+    FT_Bool  hinted;
+
+    CF2_Fixed  scale;
+    CF2_UInt   count;
+
+    /* start search from this index */
+    CF2_UInt  lastIndex;
+
+    CF2_HintRec  edge[CF2_MAX_HINT_EDGES]; /* 192 */
+
+  } CF2_HintMapRec, *CF2_HintMap;
+
+
+  FT_LOCAL( FT_Bool )
+  cf2_hint_isValid( const CF2_Hint  hint );
+  FT_LOCAL( FT_Bool )
+  cf2_hint_isTop( const CF2_Hint  hint );
+  FT_LOCAL( FT_Bool )
+  cf2_hint_isBottom( const CF2_Hint  hint );
+  FT_LOCAL( void )
+  cf2_hint_lock( CF2_Hint  hint );
+
+
+  FT_LOCAL( void )
+  cf2_hintmap_init( CF2_HintMap   hintmap,
+                    CF2_Font      font,
+                    CF2_HintMap   initialMap,
+                    CF2_ArrStack  hintMoves,
+                    CF2_Fixed     scale );
+  FT_LOCAL( void )
+  cf2_hintmap_build( CF2_HintMap   hintmap,
+                     CF2_ArrStack  hStemHintArray,
+                     CF2_ArrStack  vStemHintArray,
+                     CF2_HintMask  hintMask,
+                     CF2_Fixed     hintOrigin,
+                     FT_Bool       initialMap );
+
+
+  /*
+   * GlyphPath is a wrapper for drawing operations that scales the
+   * coordinates according to the render matrix and HintMap.  It also tracks
+   * open paths to control ClosePath and to insert MoveTo for broken fonts.
+   *
+   */
+  typedef struct  CF2_GlyphPathRec_
+  {
+    /* TODO: gather some of these into a hinting context */
+
+    CF2_Font              font;           /* font instance    */
+    CF2_OutlineCallbacks  callbacks;      /* outline consumer */
+
+
+    CF2_HintMapRec  hintMap;        /* current hint map            */
+    CF2_HintMapRec  firstHintMap;   /* saved copy                  */
+    CF2_HintMapRec  initialHintMap; /* based on all captured hints */
+
+    CF2_ArrStackRec  hintMoves;  /* list of hint moves for 2nd pass */
+
+    CF2_Fixed  scaleX;         /* matrix a */
+    CF2_Fixed  scaleC;         /* matrix c */
+    CF2_Fixed  scaleY;         /* matrix d */
+
+    FT_Vector  fractionalTranslation;  /* including deviceXScale */
+#if 0
+    CF2_Fixed  hShift;    /* character space horizontal shift */
+                          /* (for fauxing)                    */
+#endif
+
+    FT_Bool  pathIsOpen;     /* true after MoveTo                     */
+    FT_Bool  darken;         /* true if stem darkening                */
+    FT_Bool  moveIsPending;  /* true between MoveTo and offset MoveTo */
+
+    /* references used to call `cf2_hintmap_build', if necessary */
+    CF2_ArrStack         hStemHintArray;
+    CF2_ArrStack         vStemHintArray;
+    CF2_HintMask         hintMask;     /* ptr to the current mask */
+    CF2_Fixed            hintOriginY;  /* copy of current origin  */
+    const CF2_BluesRec*  blues;
+
+    CF2_Fixed  xOffset;        /* character space offsets */
+    CF2_Fixed  yOffset;
+
+    /* character space miter limit threshold */
+    CF2_Fixed  miterLimit;
+    /* vertical/horzizontal snap distance in character space */
+    CF2_Fixed  snapThreshold;
+
+    FT_Vector  offsetStart0;  /* first and second points of first */
+    FT_Vector  offsetStart1;  /* element with offset applied      */
+
+    /* current point, character space, before offset */
+    FT_Vector  currentCS;
+    /* current point, device space */
+    FT_Vector  currentDS;
+    FT_Vector  start;         /* start point of subpath */
+
+    /* the following members constitute the `queue' of one element */
+    FT_Bool  elemIsQueued;
+    CF2_Int  prevElemOp;
+
+    FT_Vector  prevElemP0;
+    FT_Vector  prevElemP1;
+    FT_Vector  prevElemP2;
+    FT_Vector  prevElemP3;
+
+  } CF2_GlyphPathRec, *CF2_GlyphPath;
+
+
+  FT_LOCAL( void )
+  cf2_glyphpath_init( CF2_GlyphPath         glyphpath,
+                      CF2_Font              font,
+                      CF2_OutlineCallbacks  callbacks,
+                      CF2_Fixed             scaleY,
+                      /* CF2_Fixed hShift, */
+                      CF2_ArrStack          hStemHintArray,
+                      CF2_ArrStack          vStemHintArray,
+                      CF2_HintMask          hintMask,
+                      CF2_Fixed             hintOrigin,
+                      const CF2_Blues       blues,
+                      const FT_Vector*      fractionalTranslation );
+  FT_LOCAL( void )
+  cf2_glyphpath_finalize( CF2_GlyphPath  glyphpath );
+
+  FT_LOCAL( void )
+  cf2_glyphpath_moveTo( CF2_GlyphPath  glyphpath,
+                        CF2_Fixed      x,
+                        CF2_Fixed      y );
+  FT_LOCAL( void )
+  cf2_glyphpath_lineTo( CF2_GlyphPath  glyphpath,
+                        CF2_Fixed      x,
+                        CF2_Fixed      y );
+  FT_LOCAL( void )
+  cf2_glyphpath_curveTo( CF2_GlyphPath  glyphpath,
+                         CF2_Fixed      x1,
+                         CF2_Fixed      y1,
+                         CF2_Fixed      x2,
+                         CF2_Fixed      y2,
+                         CF2_Fixed      x3,
+                         CF2_Fixed      y3 );
+  FT_LOCAL( void )
+  cf2_glyphpath_closeOpenPath( CF2_GlyphPath  glyphpath );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2HINTS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c
new file mode 100644
index 0000000..12f5dd7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c
@@ -0,0 +1,1540 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2intrp.c                                                             */
+/*                                                                         */
+/*    Adobe's CFF Interpreter (body).                                      */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+#include "cf2font.h"
+#include "cf2stack.h"
+#include "cf2hints.h"
+
+#include "cf2error.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cf2interp
+
+
+  /* some operators are not implemented yet */
+#define CF2_FIXME  FT_TRACE4(( "cf2_interpT2CharString:"            \
+                               " operator not implemented yet\n" ))
+
+
+
+  FT_LOCAL_DEF( void )
+  cf2_hintmask_init( CF2_HintMask  hintmask,
+                     FT_Error*     error )
+  {
+    FT_ZERO( hintmask );
+
+    hintmask->error = error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  cf2_hintmask_isValid( const CF2_HintMask  hintmask )
+  {
+    return hintmask->isValid;
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  cf2_hintmask_isNew( const CF2_HintMask  hintmask )
+  {
+    return hintmask->isNew;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_hintmask_setNew( CF2_HintMask  hintmask,
+                       FT_Bool       val )
+  {
+    hintmask->isNew = val;
+  }
+
+
+  /* clients call `getMaskPtr' in order to iterate */
+  /* through hint mask                             */
+
+  FT_LOCAL_DEF( FT_Byte* )
+  cf2_hintmask_getMaskPtr( CF2_HintMask  hintmask )
+  {
+    return hintmask->mask;
+  }
+
+
+  static size_t
+  cf2_hintmask_setCounts( CF2_HintMask  hintmask,
+                          size_t        bitCount )
+  {
+    if ( bitCount > CF2_MAX_HINTS )
+    {
+      /* total of h and v stems must be <= 96 */
+      CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format );
+      return 0;
+    }
+
+    hintmask->bitCount  = bitCount;
+    hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8;
+
+    hintmask->isValid = TRUE;
+    hintmask->isNew   = TRUE;
+
+    return bitCount;
+  }
+
+
+  /* consume the hintmask bytes from the charstring, advancing the src */
+  /* pointer                                                           */
+  static void
+  cf2_hintmask_read( CF2_HintMask  hintmask,
+                     CF2_Buffer    charstring,
+                     size_t        bitCount )
+  {
+    size_t  i;
+
+#ifndef CF2_NDEBUG
+    /* these are the bits in the final mask byte that should be zero  */
+    /* Note: this variable is only used in an assert expression below */
+    /* and then only if CF2_NDEBUG is not defined                     */
+    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
+#endif
+
+
+    /* initialize counts and isValid */
+    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
+      return;
+
+    FT_ASSERT( hintmask->byteCount > 0 );
+
+    FT_TRACE4(( " (maskbytes:" ));
+
+    /* set mask and advance interpreter's charstring pointer */
+    for ( i = 0; i < hintmask->byteCount; i++ )
+    {
+      hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring );
+      FT_TRACE4(( " 0x%02X", hintmask->mask[i] ));
+    }
+
+    FT_TRACE4(( ")\n" ));
+
+    /* assert any unused bits in last byte are zero unless there's a prior */
+    /* error                                                               */
+    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1      */
+#ifndef CF2_NDEBUG
+    FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 ||
+               *hintmask->error                                        );
+#endif
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_hintmask_setAll( CF2_HintMask  hintmask,
+                       size_t        bitCount )
+  {
+    size_t    i;
+    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
+
+
+    /* initialize counts and isValid */
+    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
+      return;
+
+    FT_ASSERT( hintmask->byteCount > 0 );
+    FT_ASSERT( hintmask->byteCount <
+                 sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) );
+
+    /* set mask to all ones */
+    for ( i = 0; i < hintmask->byteCount; i++ )
+      hintmask->mask[i] = 0xFF;
+
+    /* clear unused bits                                              */
+    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */
+    hintmask->mask[hintmask->byteCount - 1] &= ~mask;
+  }
+
+
+  /* Type2 charstring opcodes */
+  enum
+  {
+    cf2_cmdRESERVED_0,   /* 0 */
+    cf2_cmdHSTEM,        /* 1 */
+    cf2_cmdRESERVED_2,   /* 2 */
+    cf2_cmdVSTEM,        /* 3 */
+    cf2_cmdVMOVETO,      /* 4 */
+    cf2_cmdRLINETO,      /* 5 */
+    cf2_cmdHLINETO,      /* 6 */
+    cf2_cmdVLINETO,      /* 7 */
+    cf2_cmdRRCURVETO,    /* 8 */
+    cf2_cmdRESERVED_9,   /* 9 */
+    cf2_cmdCALLSUBR,     /* 10 */
+    cf2_cmdRETURN,       /* 11 */
+    cf2_cmdESC,          /* 12 */
+    cf2_cmdRESERVED_13,  /* 13 */
+    cf2_cmdENDCHAR,      /* 14 */
+    cf2_cmdRESERVED_15,  /* 15 */
+    cf2_cmdRESERVED_16,  /* 16 */
+    cf2_cmdRESERVED_17,  /* 17 */
+    cf2_cmdHSTEMHM,      /* 18 */
+    cf2_cmdHINTMASK,     /* 19 */
+    cf2_cmdCNTRMASK,     /* 20 */
+    cf2_cmdRMOVETO,      /* 21 */
+    cf2_cmdHMOVETO,      /* 22 */
+    cf2_cmdVSTEMHM,      /* 23 */
+    cf2_cmdRCURVELINE,   /* 24 */
+    cf2_cmdRLINECURVE,   /* 25 */
+    cf2_cmdVVCURVETO,    /* 26 */
+    cf2_cmdHHCURVETO,    /* 27 */
+    cf2_cmdEXTENDEDNMBR, /* 28 */
+    cf2_cmdCALLGSUBR,    /* 29 */
+    cf2_cmdVHCURVETO,    /* 30 */
+    cf2_cmdHVCURVETO     /* 31 */
+  };
+
+  enum
+  {
+    cf2_escDOTSECTION,   /* 0 */
+    cf2_escRESERVED_1,   /* 1 */
+    cf2_escRESERVED_2,   /* 2 */
+    cf2_escAND,          /* 3 */
+    cf2_escOR,           /* 4 */
+    cf2_escNOT,          /* 5 */
+    cf2_escRESERVED_6,   /* 6 */
+    cf2_escRESERVED_7,   /* 7 */
+    cf2_escRESERVED_8,   /* 8 */
+    cf2_escABS,          /* 9 */
+    cf2_escADD,          /* 10     like otherADD */
+    cf2_escSUB,          /* 11     like otherSUB */
+    cf2_escDIV,          /* 12 */
+    cf2_escRESERVED_13,  /* 13 */
+    cf2_escNEG,          /* 14 */
+    cf2_escEQ,           /* 15 */
+    cf2_escRESERVED_16,  /* 16 */
+    cf2_escRESERVED_17,  /* 17 */
+    cf2_escDROP,         /* 18 */
+    cf2_escRESERVED_19,  /* 19 */
+    cf2_escPUT,          /* 20     like otherPUT    */
+    cf2_escGET,          /* 21     like otherGET    */
+    cf2_escIFELSE,       /* 22     like otherIFELSE */
+    cf2_escRANDOM,       /* 23     like otherRANDOM */
+    cf2_escMUL,          /* 24     like otherMUL    */
+    cf2_escRESERVED_25,  /* 25 */
+    cf2_escSQRT,         /* 26 */
+    cf2_escDUP,          /* 27     like otherDUP    */
+    cf2_escEXCH,         /* 28     like otherEXCH   */
+    cf2_escINDEX,        /* 29 */
+    cf2_escROLL,         /* 30 */
+    cf2_escRESERVED_31,  /* 31 */
+    cf2_escRESERVED_32,  /* 32 */
+    cf2_escRESERVED_33,  /* 33 */
+    cf2_escHFLEX,        /* 34 */
+    cf2_escFLEX,         /* 35 */
+    cf2_escHFLEX1,       /* 36 */
+    cf2_escFLEX1         /* 37 */
+  };
+
+
+  /* `stemHintArray' does not change once we start drawing the outline. */
+  static void
+  cf2_doStems( const CF2_Font  font,
+               CF2_Stack       opStack,
+               CF2_ArrStack    stemHintArray,
+               CF2_Fixed*      width,
+               FT_Bool*        haveWidth,
+               CF2_Fixed       hintOffset )
+  {
+    CF2_UInt  i;
+    CF2_UInt  count       = cf2_stack_count( opStack );
+    FT_Bool   hasWidthArg = (FT_Bool)( count & 1 );
+
+    /* variable accumulates delta values from operand stack */
+    CF2_Fixed  position = hintOffset;
+
+    if ( hasWidthArg && ! *haveWidth )
+      *width = cf2_stack_getReal( opStack, 0 ) +
+                 cf2_getNominalWidthX( font->decoder );
+
+    if ( font->decoder->width_only )
+      goto exit;
+
+    for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 )
+    {
+      /* construct a CF2_StemHint and push it onto the list */
+      CF2_StemHintRec  stemhint;
+
+
+      stemhint.min  =
+        position   += cf2_stack_getReal( opStack, i );
+      stemhint.max  =
+        position   += cf2_stack_getReal( opStack, i + 1 );
+
+      stemhint.used  = FALSE;
+      stemhint.maxDS =
+      stemhint.minDS = 0;
+
+      cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */
+    }
+
+    cf2_stack_clear( opStack );
+
+  exit:
+    /* cf2_doStems must define a width (may be default) */
+    *haveWidth = TRUE;
+  }
+
+
+  static void
+  cf2_doFlex( CF2_Stack       opStack,
+              CF2_Fixed*      curX,
+              CF2_Fixed*      curY,
+              CF2_GlyphPath   glyphPath,
+              const FT_Bool*  readFromStack,
+              FT_Bool         doConditionalLastRead )
+  {
+    CF2_Fixed  vals[14];
+    CF2_UInt   index;
+    FT_Bool    isHFlex;
+    CF2_Int    top, i, j;
+
+
+    vals[0] = *curX;
+    vals[1] = *curY;
+    index   = 0;
+    isHFlex = readFromStack[9] == FALSE;
+    top     = isHFlex ? 9 : 10;
+
+    for ( i = 0; i < top; i++ )
+    {
+      vals[i + 2] = vals[i];
+      if ( readFromStack[i] )
+        vals[i + 2] += cf2_stack_getReal( opStack, index++ );
+    }
+
+    if ( isHFlex )
+      vals[9 + 2] = *curY;
+
+    if ( doConditionalLastRead )
+    {
+      FT_Bool    lastIsX = (FT_Bool)( cf2_fixedAbs( vals[10] - *curX ) >
+                                        cf2_fixedAbs( vals[11] - *curY ) );
+      CF2_Fixed  lastVal = cf2_stack_getReal( opStack, index );
+
+
+      if ( lastIsX )
+      {
+        vals[12] = vals[10] + lastVal;
+        vals[13] = *curY;
+      }
+      else
+      {
+        vals[12] = *curX;
+        vals[13] = vals[11] + lastVal;
+      }
+    }
+    else
+    {
+      if ( readFromStack[10] )
+        vals[12] = vals[10] + cf2_stack_getReal( opStack, index++ );
+      else
+        vals[12] = *curX;
+
+      if ( readFromStack[11] )
+        vals[13] = vals[11] + cf2_stack_getReal( opStack, index );
+      else
+        vals[13] = *curY;
+    }
+
+    for ( j = 0; j < 2; j++ )
+      cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2],
+                                        vals[j * 6 + 3],
+                                        vals[j * 6 + 4],
+                                        vals[j * 6 + 5],
+                                        vals[j * 6 + 6],
+                                        vals[j * 6 + 7] );
+
+    cf2_stack_clear( opStack );
+
+    *curX = vals[12];
+    *curY = vals[13];
+  }
+
+
+  /*
+   * `error' is a shared error code used by many objects in this
+   * routine.  Before the code continues from an error, it must check and
+   * record the error in `*error'.  The idea is that this shared
+   * error code will record the first error encountered.  If testing
+   * for an error anyway, the cost of `goto exit' is small, so we do it,
+   * even if continuing would be safe.  In this case, `lastError' is
+   * set, so the testing and storing can be done in one place, at `exit'.
+   *
+   * Continuing after an error is intended for objects which do their own
+   * testing of `*error', e.g., array stack functions.  This allows us to
+   * avoid an extra test after the call.
+   *
+   * Unimplemented opcodes are ignored.
+   *
+   */
+  FT_LOCAL_DEF( void )
+  cf2_interpT2CharString( CF2_Font              font,
+                          CF2_Buffer            buf,
+                          CF2_OutlineCallbacks  callbacks,
+                          const FT_Vector*      translation,
+                          FT_Bool               doingSeac,
+                          CF2_Fixed             curX,
+                          CF2_Fixed             curY,
+                          CF2_Fixed*            width )
+  {
+    /* lastError is used for errors that are immediately tested */
+    FT_Error  lastError = FT_Err_Ok;
+
+    /* pointer to parsed font object */
+    CFF_Decoder*  decoder = font->decoder;
+
+    FT_Error*  error  = &font->error;
+    FT_Memory  memory = font->memory;
+
+    CF2_Fixed  scaleY        = font->innerTransform.d;
+    CF2_Fixed  nominalWidthX = cf2_getNominalWidthX( decoder );
+
+    /* save this for hinting seac accents */
+    CF2_Fixed  hintOriginY = curY;
+
+    CF2_Stack  opStack = NULL;
+    FT_Byte    op1;                       /* first opcode byte */
+
+    /* instruction limit; 20,000,000 matches Avalon */
+    FT_UInt32  instructionLimit = 20000000UL;
+
+    CF2_ArrStackRec  subrStack;
+
+    FT_Bool     haveWidth;
+    CF2_Buffer  charstring = NULL;
+
+    CF2_Int  charstringIndex = -1;       /* initialize to empty */
+
+    /* TODO: placeholders for hint structures */
+
+    /* objects used for hinting */
+    CF2_ArrStackRec  hStemHintArray;
+    CF2_ArrStackRec  vStemHintArray;
+
+    CF2_HintMaskRec   hintMask;
+    CF2_GlyphPathRec  glyphPath;
+
+	int refCount = 0;
+
+
+    /* initialize the remaining objects */
+    cf2_arrstack_init( &subrStack,
+                       memory,
+                       error,
+                       sizeof ( CF2_BufferRec ) );
+    cf2_arrstack_init( &hStemHintArray,
+                       memory,
+                       error,
+                       sizeof ( CF2_StemHintRec ) );
+    cf2_arrstack_init( &vStemHintArray,
+                       memory,
+                       error,
+                       sizeof ( CF2_StemHintRec ) );
+
+    /* initialize CF2_StemHint arrays */
+    cf2_hintmask_init( &hintMask, error );
+
+    /* initialize path map to manage drawing operations */
+
+    /* Note: last 4 params are used to handle `MoveToPermissive', which */
+    /*       may need to call `hintMap.Build'                           */
+    /* TODO: MoveToPermissive is gone; are these still needed?          */
+    cf2_glyphpath_init( &glyphPath,
+                        font,
+                        callbacks,
+                        scaleY,
+                        /* hShift, */
+                        &hStemHintArray,
+                        &vStemHintArray,
+                        &hintMask,
+                        hintOriginY,
+                        &font->blues,
+                        translation );
+
+    /*
+     * Initialize state for width parsing.  From the CFF Spec:
+     *
+     *   The first stack-clearing operator, which must be one of hstem,
+     *   hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto,
+     *   rmoveto, or endchar, takes an additional argument - the width (as
+     *   described earlier), which may be expressed as zero or one numeric
+     *   argument.
+     *
+     * What we implement here uses the first validly specified width, but
+     * does not detect errors for specifying more than one width.
+     *
+     * If one of the above operators occurs without explicitly specifying
+     * a width, we assume the default width.
+     *
+     */
+    haveWidth = FALSE;
+    *width    = cf2_getDefaultWidthX( decoder );
+
+    /*
+     * Note: at this point, all pointers to resources must be NULL
+     * and all local objects must be initialized.
+     * There must be no branches to exit: above this point.
+     *
+     */
+
+    /* allocate an operand stack */
+    opStack = cf2_stack_init( memory, error );
+    if ( !opStack )
+    {
+      lastError = FT_THROW( Out_Of_Memory );
+      goto exit;
+    }
+
+    /* initialize subroutine stack by placing top level charstring as */
+    /* first element (max depth plus one for the charstring)          */
+    /* Note: Caller owns and must finalize the first charstring.      */
+    /*       Our copy of it does not change that requirement.         */
+    cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 );
+
+    charstring  = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );
+    *charstring = *buf;    /* structure copy */
+
+    charstringIndex = 0;       /* entry is valid now */
+
+    /* catch errors so far */
+    if ( *error )
+      goto exit;
+
+    /* main interpreter loop */
+    while ( refCount++ < 10240 )
+    {
+      if ( cf2_buf_isEnd( charstring ) )
+      {
+        /* If we've reached the end of the charstring, simulate a */
+        /* cf2_cmdRETURN or cf2_cmdENDCHAR.                       */
+        if ( charstringIndex )
+          op1 = cf2_cmdRETURN;  /* end of buffer for subroutine */
+        else
+          op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */
+      }
+      else
+        op1 = (FT_Byte)cf2_buf_readByte( charstring );
+
+      /* check for errors once per loop */
+      if ( *error )
+        goto exit;
+
+      instructionLimit--;
+      if ( instructionLimit == 0 )
+      {
+        lastError = FT_THROW( Invalid_Glyph_Format );
+        goto exit;
+      }
+
+      switch( op1 )
+      {
+      case cf2_cmdRESERVED_0:
+      case cf2_cmdRESERVED_2:
+      case cf2_cmdRESERVED_9:
+      case cf2_cmdRESERVED_13:
+      case cf2_cmdRESERVED_15:
+      case cf2_cmdRESERVED_16:
+      case cf2_cmdRESERVED_17:
+        /* we may get here if we have a prior error */
+        FT_TRACE4(( " unknown op (%d)\n", op1 ));
+        break;
+
+      case cf2_cmdHSTEMHM:
+      case cf2_cmdHSTEM:
+        FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? " hstemhm\n" : " hstem\n" ));
+
+        /* never add hints after the mask is computed */
+        if ( cf2_hintmask_isValid( &hintMask ) )
+          FT_TRACE4(( "cf2_interpT2CharString:"
+                      " invalid horizontal hint mask\n" ));
+
+        cf2_doStems( font,
+                     opStack,
+                     &hStemHintArray,
+                     width,
+                     &haveWidth,
+                     0 );
+
+        if ( font->decoder->width_only )
+            goto exit;
+
+        break;
+
+      case cf2_cmdVSTEMHM:
+      case cf2_cmdVSTEM:
+        FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? " vstemhm\n" : " vstem\n" ));
+
+        /* never add hints after the mask is computed */
+        if ( cf2_hintmask_isValid( &hintMask ) )
+          FT_TRACE4(( "cf2_interpT2CharString:"
+                      " invalid vertical hint mask\n" ));
+
+        cf2_doStems( font,
+                     opStack,
+                     &vStemHintArray,
+                     width,
+                     &haveWidth,
+                     0 );
+
+        if ( font->decoder->width_only )
+            goto exit;
+
+        break;
+
+      case cf2_cmdVMOVETO:
+        FT_TRACE4(( " vmoveto\n" ));
+
+        if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
+          *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
+
+        /* width is defined or default after this */
+        haveWidth = TRUE;
+
+        if ( font->decoder->width_only )
+            goto exit;
+
+        curY += cf2_stack_popFixed( opStack );
+
+        cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+        break;
+
+      case cf2_cmdRLINETO:
+        {
+          CF2_UInt  index;
+          CF2_UInt  count = cf2_stack_count( opStack );
+
+
+          FT_TRACE4(( " rlineto\n" ));
+
+          for ( index = 0; index < count; index += 2 )
+          {
+            curX += cf2_stack_getReal( opStack, index + 0 );
+            curY += cf2_stack_getReal( opStack, index + 1 );
+
+            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdHLINETO:
+      case cf2_cmdVLINETO:
+        {
+          CF2_UInt  index;
+          CF2_UInt  count = cf2_stack_count( opStack );
+
+          FT_Bool  isX = op1 == cf2_cmdHLINETO;
+
+
+          FT_TRACE4(( isX ? " hlineto\n" : " vlineto\n" ));
+
+          for ( index = 0; index < count; index++ )
+          {
+            CF2_Fixed  v = cf2_stack_getReal( opStack, index );
+
+
+            if ( isX )
+              curX += v;
+            else
+              curY += v;
+
+            isX = !isX;
+
+            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue;
+
+      case cf2_cmdRCURVELINE:
+      case cf2_cmdRRCURVETO:
+        {
+          CF2_UInt  count = cf2_stack_count( opStack );
+          CF2_UInt  index = 0;
+
+
+          FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? " rcurveline\n"
+                                               : " rrcurveto\n" ));
+
+          while ( index + 6 <= count )
+          {
+            CF2_Fixed  x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
+            CF2_Fixed  y1 = cf2_stack_getReal( opStack, index + 1 ) + curY;
+            CF2_Fixed  x2 = cf2_stack_getReal( opStack, index + 2 ) + x1;
+            CF2_Fixed  y2 = cf2_stack_getReal( opStack, index + 3 ) + y1;
+            CF2_Fixed  x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;
+            CF2_Fixed  y3 = cf2_stack_getReal( opStack, index + 5 ) + y2;
+
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX   = x3;
+            curY   = y3;
+            index += 6;
+          }
+
+          if ( op1 == cf2_cmdRCURVELINE )
+          {
+            curX += cf2_stack_getReal( opStack, index + 0 );
+            curY += cf2_stack_getReal( opStack, index + 1 );
+
+            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdCALLGSUBR:
+      case cf2_cmdCALLSUBR:
+        {
+          CF2_UInt  subrIndex;
+
+
+          FT_TRACE4(( op1 == cf2_cmdCALLGSUBR ? " callgsubr"
+                                              : " callsubr" ));
+
+          if ( charstringIndex > CF2_MAX_SUBR )
+          {
+            /* max subr plus one for charstring */
+            lastError = FT_THROW( Invalid_Glyph_Format );
+            goto exit;                      /* overflow of stack */
+          }
+
+          /* push our current CFF charstring region on subrStack */
+          charstring = (CF2_Buffer)
+                         cf2_arrstack_getPointer( &subrStack,
+                                                  charstringIndex + 1 );
+
+          /* set up the new CFF region and pointer */
+          subrIndex = cf2_stack_popInt( opStack );
+
+          switch ( op1 )
+          {
+          case cf2_cmdCALLGSUBR:
+            FT_TRACE4(( "(%d)\n", subrIndex + decoder->globals_bias ));
+
+            if ( cf2_initGlobalRegionBuffer( decoder,
+                                             subrIndex,
+                                             charstring ) )
+            {
+              lastError = FT_THROW( Invalid_Glyph_Format );
+              goto exit;  /* subroutine lookup or stream error */
+            }
+            break;
+
+          default:
+            /* cf2_cmdCALLSUBR */
+            FT_TRACE4(( "(%d)\n", subrIndex + decoder->locals_bias ));
+
+            if ( cf2_initLocalRegionBuffer( decoder,
+                                            subrIndex,
+                                            charstring ) )
+            {
+              lastError = FT_THROW( Invalid_Glyph_Format );
+              goto exit;  /* subroutine lookup or stream error */
+            }
+          }
+
+          charstringIndex += 1;       /* entry is valid now */
+        }
+        continue; /* do not clear the stack */
+
+      case cf2_cmdRETURN:
+        FT_TRACE4(( " return\n" ));
+
+        if ( charstringIndex < 1 )
+        {
+          /* Note: cannot return from top charstring */
+          lastError = FT_THROW( Invalid_Glyph_Format );
+          goto exit;                      /* underflow of stack */
+        }
+
+        /* restore position in previous charstring */
+        charstring = (CF2_Buffer)
+                       cf2_arrstack_getPointer( &subrStack,
+                                                --charstringIndex );
+        continue;     /* do not clear the stack */
+
+      case cf2_cmdESC:
+        {
+          FT_Byte  op2 = (FT_Byte)cf2_buf_readByte( charstring );
+
+
+          switch ( op2 )
+          {
+          case cf2_escDOTSECTION:
+            /* something about `flip type of locking' -- ignore it */
+            FT_TRACE4(( " dotsection\n" ));
+
+            break;
+
+          /* TODO: should these operators be supported? */
+          case cf2_escAND: /* in spec */
+            FT_TRACE4(( " and\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escOR: /* in spec */
+            FT_TRACE4(( " or\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escNOT: /* in spec */
+            FT_TRACE4(( " not\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escABS: /* in spec */
+            FT_TRACE4(( " abs\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escADD: /* in spec */
+            FT_TRACE4(( " add\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escSUB: /* in spec */
+            FT_TRACE4(( " sub\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escDIV: /* in spec */
+            FT_TRACE4(( " div\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escNEG: /* in spec */
+            FT_TRACE4(( " neg\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escEQ: /* in spec */
+            FT_TRACE4(( " eq\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escDROP: /* in spec */
+            FT_TRACE4(( " drop\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escPUT: /* in spec */
+            FT_TRACE4(( " put\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escGET: /* in spec */
+            FT_TRACE4(( " get\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escIFELSE: /* in spec */
+            FT_TRACE4(( " ifelse\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escRANDOM: /* in spec */
+            FT_TRACE4(( " random\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escMUL: /* in spec */
+            FT_TRACE4(( " mul\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escSQRT: /* in spec */
+            FT_TRACE4(( " sqrt\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escDUP: /* in spec */
+            FT_TRACE4(( " dup\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escEXCH: /* in spec */
+            FT_TRACE4(( " exch\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escINDEX: /* in spec */
+            FT_TRACE4(( " index\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escROLL: /* in spec */
+            FT_TRACE4(( " roll\n" ));
+
+            CF2_FIXME;
+            break;
+
+          case cf2_escHFLEX:
+            {
+              static const FT_Bool  readFromStack[12] =
+              {
+                TRUE /* dx1 */, FALSE /* dy1 */,
+                TRUE /* dx2 */, TRUE  /* dy2 */,
+                TRUE /* dx3 */, FALSE /* dy3 */,
+                TRUE /* dx4 */, FALSE /* dy4 */,
+                TRUE /* dx5 */, FALSE /* dy5 */,
+                TRUE /* dx6 */, FALSE /* dy6 */
+              };
+
+
+              FT_TRACE4(( " hflex\n" ));
+
+              cf2_doFlex( opStack,
+                          &curX,
+                          &curY,
+                          &glyphPath,
+                          readFromStack,
+                          FALSE /* doConditionalLastRead */ );
+            }
+            continue;
+
+          case cf2_escFLEX:
+            {
+              static const FT_Bool  readFromStack[12] =
+              {
+                TRUE /* dx1 */, TRUE /* dy1 */,
+                TRUE /* dx2 */, TRUE /* dy2 */,
+                TRUE /* dx3 */, TRUE /* dy3 */,
+                TRUE /* dx4 */, TRUE /* dy4 */,
+                TRUE /* dx5 */, TRUE /* dy5 */,
+                TRUE /* dx6 */, TRUE /* dy6 */
+              };
+
+
+              FT_TRACE4(( " flex\n" ));
+
+              cf2_doFlex( opStack,
+                          &curX,
+                          &curY,
+                          &glyphPath,
+                          readFromStack,
+                          FALSE /* doConditionalLastRead */ );
+            }
+            break;      /* TODO: why is this not a continue? */
+
+          case cf2_escHFLEX1:
+            {
+              static const FT_Bool  readFromStack[12] =
+              {
+                TRUE /* dx1 */, TRUE  /* dy1 */,
+                TRUE /* dx2 */, TRUE  /* dy2 */,
+                TRUE /* dx3 */, FALSE /* dy3 */,
+                TRUE /* dx4 */, FALSE /* dy4 */,
+                TRUE /* dx5 */, TRUE  /* dy5 */,
+                TRUE /* dx6 */, FALSE /* dy6 */
+              };
+
+
+              FT_TRACE4(( " hflex1\n" ));
+
+              cf2_doFlex( opStack,
+                          &curX,
+                          &curY,
+                          &glyphPath,
+                          readFromStack,
+                          FALSE /* doConditionalLastRead */ );
+            }
+            continue;
+
+          case cf2_escFLEX1:
+            {
+              static const FT_Bool  readFromStack[12] =
+              {
+                TRUE  /* dx1 */, TRUE  /* dy1 */,
+                TRUE  /* dx2 */, TRUE  /* dy2 */,
+                TRUE  /* dx3 */, TRUE  /* dy3 */,
+                TRUE  /* dx4 */, TRUE  /* dy4 */,
+                TRUE  /* dx5 */, TRUE  /* dy5 */,
+                FALSE /* dx6 */, FALSE /* dy6 */
+              };
+
+
+              FT_TRACE4(( " flex1\n" ));
+
+              cf2_doFlex( opStack,
+                          &curX,
+                          &curY,
+                          &glyphPath,
+                          readFromStack,
+                          TRUE /* doConditionalLastRead */ );
+            }
+            continue;
+
+          case cf2_escRESERVED_1:
+          case cf2_escRESERVED_2:
+          case cf2_escRESERVED_6:
+          case cf2_escRESERVED_7:
+          case cf2_escRESERVED_8:
+          case cf2_escRESERVED_13:
+          case cf2_escRESERVED_16:
+          case cf2_escRESERVED_17:
+          case cf2_escRESERVED_19:
+          case cf2_escRESERVED_25:
+          case cf2_escRESERVED_31:
+          case cf2_escRESERVED_32:
+          case cf2_escRESERVED_33:
+          default:
+            FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+
+          }; /* end of switch statement checking `op2' */
+
+        } /* case cf2_cmdESC */
+        break;
+
+      case cf2_cmdENDCHAR:
+        FT_TRACE4(( " endchar\n" ));
+
+        if ( cf2_stack_count( opStack ) == 1 ||
+             cf2_stack_count( opStack ) == 5 )
+        {
+          if ( !haveWidth )
+            *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
+        }
+
+        /* width is defined or default after this */
+        haveWidth = TRUE;
+
+        if ( font->decoder->width_only )
+            goto exit;
+
+        /* close path if still open */
+        cf2_glyphpath_closeOpenPath( &glyphPath );
+
+        if ( cf2_stack_count( opStack ) > 1 )
+        {
+          /* must be either 4 or 5 --                       */
+          /* this is a (deprecated) implied `seac' operator */
+
+          CF2_UInt       achar;
+          CF2_UInt       bchar;
+          CF2_BufferRec  component;
+          CF2_Fixed      dummyWidth;   /* ignore component width */
+          FT_Error       error2;
+
+
+          if ( doingSeac )
+          {
+            lastError = FT_THROW( Invalid_Glyph_Format );
+            goto exit;      /* nested seac */
+          }
+
+          achar = cf2_stack_popInt( opStack );
+          bchar = cf2_stack_popInt( opStack );
+
+          curY = cf2_stack_popFixed( opStack );
+          curX = cf2_stack_popFixed( opStack );
+
+          error2 = cf2_getSeacComponent( decoder, achar, &component );
+          if ( error2 )
+          {
+             lastError = error2;      /* pass FreeType error through */
+             goto exit;
+          }
+          cf2_interpT2CharString( font,
+                                  &component,
+                                  callbacks,
+                                  translation,
+                                  TRUE,
+                                  curX,
+                                  curY,
+                                  &dummyWidth );
+          cf2_freeSeacComponent( decoder, &component );
+
+          error2 = cf2_getSeacComponent( decoder, bchar, &component );
+          if ( error2 )
+          {
+            lastError = error2;      /* pass FreeType error through */
+            goto exit;
+          }
+          cf2_interpT2CharString( font,
+                                  &component,
+                                  callbacks,
+                                  translation,
+                                  TRUE,
+                                  0,
+                                  0,
+                                  &dummyWidth );
+          cf2_freeSeacComponent( decoder, &component );
+        }
+        goto exit;
+
+      case cf2_cmdCNTRMASK:
+      case cf2_cmdHINTMASK:
+        /* the final \n in the tracing message gets added in      */
+        /* `cf2_hintmask_read' (which also traces the mask bytes) */
+        FT_TRACE4(( op1 == cf2_cmdCNTRMASK ? " cntrmask" : " hintmask" ));
+
+        /* if there are arguments on the stack, there this is an */
+        /* implied cf2_cmdVSTEMHM                                */
+        if ( cf2_stack_count( opStack ) != 0 )
+        {
+          /* never add hints after the mask is computed */
+          if ( cf2_hintmask_isValid( &hintMask ) )
+            FT_TRACE4(( "cf2_interpT2CharString: invalid hint mask\n" ));
+        }
+
+        cf2_doStems( font,
+                     opStack,
+                     &vStemHintArray,
+                     width,
+                     &haveWidth,
+                     0 );
+
+        if ( font->decoder->width_only )
+            goto exit;
+
+        if ( op1 == cf2_cmdHINTMASK )
+        {
+          /* consume the hint mask bytes which follow the operator */
+          cf2_hintmask_read( &hintMask,
+                             charstring,
+                             cf2_arrstack_size( &hStemHintArray ) +
+                               cf2_arrstack_size( &vStemHintArray ) );
+        }
+        else
+        {
+          /*
+           * Consume the counter mask bytes which follow the operator:
+           * Build a temporary hint map, just to place and lock those
+           * stems participating in the counter mask.  These are most
+           * likely the dominant hstems, and are grouped together in a
+           * few counter groups, not necessarily in correspondence
+           * with the hint groups.  This reduces the chances of
+           * conflicts between hstems that are initially placed in
+           * separate hint groups and then brought together.  The
+           * positions are copied back to `hStemHintArray', so we can
+           * discard `counterMask' and `counterHintMap'.
+           *
+           */
+          CF2_HintMapRec   counterHintMap;
+          CF2_HintMaskRec  counterMask;
+
+
+          cf2_hintmap_init( &counterHintMap,
+                            font,
+                            &glyphPath.initialHintMap,
+                            &glyphPath.hintMoves,
+                            scaleY );
+          cf2_hintmask_init( &counterMask, error );
+
+          cf2_hintmask_read( &counterMask,
+                             charstring,
+                             cf2_arrstack_size( &hStemHintArray ) +
+                               cf2_arrstack_size( &vStemHintArray ) );
+          cf2_hintmap_build( &counterHintMap,
+                             &hStemHintArray,
+                             &vStemHintArray,
+                             &counterMask,
+                             0,
+                             FALSE );
+        }
+        break;
+
+      case cf2_cmdRMOVETO:
+        FT_TRACE4(( " rmoveto\n" ));
+
+        if ( cf2_stack_count( opStack ) > 2 && !haveWidth )
+          *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
+
+        /* width is defined or default after this */
+        haveWidth = TRUE;
+
+        if ( font->decoder->width_only )
+            goto exit;
+
+        curY += cf2_stack_popFixed( opStack );
+        curX += cf2_stack_popFixed( opStack );
+
+        cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+        break;
+
+      case cf2_cmdHMOVETO:
+        FT_TRACE4(( " hmoveto\n" ));
+
+        if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
+          *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
+
+        /* width is defined or default after this */
+        haveWidth = TRUE;
+
+        if ( font->decoder->width_only )
+            goto exit;
+
+        curX += cf2_stack_popFixed( opStack );
+
+        cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+        break;
+
+      case cf2_cmdRLINECURVE:
+        {
+          CF2_UInt  count = cf2_stack_count( opStack );
+          CF2_UInt  index = 0;
+
+
+          FT_TRACE4(( " rlinecurve\n" ));
+
+          while ( index + 6 < count )
+          {
+            curX += cf2_stack_getReal( opStack, index + 0 );
+            curY += cf2_stack_getReal( opStack, index + 1 );
+
+            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+            index += 2;
+          }
+
+          while ( index < count )
+          {
+            CF2_Fixed  x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
+            CF2_Fixed  y1 = cf2_stack_getReal( opStack, index + 1 ) + curY;
+            CF2_Fixed  x2 = cf2_stack_getReal( opStack, index + 2 ) + x1;
+            CF2_Fixed  y2 = cf2_stack_getReal( opStack, index + 3 ) + y1;
+            CF2_Fixed  x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;
+            CF2_Fixed  y3 = cf2_stack_getReal( opStack, index + 5 ) + y2;
+
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX   = x3;
+            curY   = y3;
+            index += 6;
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdVVCURVETO:
+        {
+          CF2_UInt  count = cf2_stack_count( opStack );
+          CF2_UInt  index = 0;
+
+
+          FT_TRACE4(( " vvcurveto\n" ));
+
+          while ( index < count )
+          {
+            CF2_Fixed  x1, y1, x2, y2, x3, y3;
+
+
+            if ( ( count - index ) & 1 )
+            {
+              x1 = cf2_stack_getReal( opStack, index ) + curX;
+
+              ++index;
+            }
+            else
+              x1 = curX;
+
+            y1 = cf2_stack_getReal( opStack, index + 0 ) + curY;
+            x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
+            y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
+            x3 = x2;
+            y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX   = x3;
+            curY   = y3;
+            index += 4;
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdHHCURVETO:
+        {
+          CF2_UInt  count = cf2_stack_count( opStack );
+          CF2_UInt  index = 0;
+
+
+          FT_TRACE4(( " hhcurveto\n" ));
+
+          while ( index < count )
+          {
+            CF2_Fixed  x1, y1, x2, y2, x3, y3;
+
+
+            if ( ( count - index ) & 1 )
+            {
+              y1 = cf2_stack_getReal( opStack, index ) + curY;
+
+              ++index;
+            }
+            else
+              y1 = curY;
+
+            x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
+            x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
+            y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
+            x3 = cf2_stack_getReal( opStack, index + 3 ) + x2;
+            y3 = y2;
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX   = x3;
+            curY   = y3;
+            index += 4;
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdVHCURVETO:
+      case cf2_cmdHVCURVETO:
+        {
+          CF2_UInt  count = cf2_stack_count( opStack );
+          CF2_UInt  index = 0;
+
+          FT_Bool  alternate = op1 == cf2_cmdHVCURVETO;
+
+
+          FT_TRACE4(( alternate ? " hvcurveto\n" : " vhcurveto\n" ));
+
+          while ( index < count )
+          {
+            CF2_Fixed x1, x2, x3, y1, y2, y3;
+
+
+            if ( alternate )
+            {
+              x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
+              y1 = curY;
+              x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
+              y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
+              y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;
+
+              if ( count - index == 5 )
+              {
+                x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;
+
+                ++index;
+              }
+              else
+                x3 = x2;
+
+              alternate = FALSE;
+            }
+            else
+            {
+              x1 = curX;
+              y1 = cf2_stack_getReal( opStack, index + 0 ) + curY;
+              x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
+              y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
+              x3 = cf2_stack_getReal( opStack, index + 3 ) + x2;
+
+              if ( count - index == 5 )
+              {
+                y3 = cf2_stack_getReal( opStack, index + 4 ) + y2;
+
+                ++index;
+              }
+              else
+                y3 = y2;
+
+              alternate = TRUE;
+            }
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX   = x3;
+            curY   = y3;
+            index += 4;
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue;     /* no need to clear stack again */
+
+      case cf2_cmdEXTENDEDNMBR:
+        {
+          CF2_Int  v;
+
+
+          v = (FT_Short)( ( cf2_buf_readByte( charstring ) << 8 ) |
+                            cf2_buf_readByte( charstring )        );
+
+          FT_TRACE4(( " %d", v ));
+
+          cf2_stack_pushInt( opStack, v );
+        }
+        continue;
+
+      default:
+        /* numbers */
+        {
+          if ( /* op1 >= 32 && */ op1 <= 246 )
+          {
+            CF2_Int  v;
+
+
+            v = op1 - 139;
+
+            FT_TRACE4(( " %d", v ));
+
+            /* -107 .. 107 */
+            cf2_stack_pushInt( opStack, v );
+          }
+
+          else if ( /* op1 >= 247 && */ op1 <= 250 )
+          {
+            CF2_Int  v;
+
+
+            v  = op1;
+            v -= 247;
+            v *= 256;
+            v += cf2_buf_readByte( charstring );
+            v += 108;
+
+            FT_TRACE4(( " %d", v ));
+
+            /* 108 .. 1131 */
+            cf2_stack_pushInt( opStack, v );
+          }
+
+          else if ( /* op1 >= 251 && */ op1 <= 254 )
+          {
+            CF2_Int  v;
+
+
+            v  = op1;
+            v -= 251;
+            v *= 256;
+            v += cf2_buf_readByte( charstring );
+            v  = -v - 108;
+
+            FT_TRACE4(( " %d", v ));
+
+            /* -1131 .. -108 */
+            cf2_stack_pushInt( opStack, v );
+          }
+
+          else /* op1 == 255 */
+          {
+            CF2_Fixed  v;
+
+
+            v = (CF2_Fixed)
+                  ( ( (FT_UInt32)cf2_buf_readByte( charstring ) << 24 ) |
+                    ( (FT_UInt32)cf2_buf_readByte( charstring ) << 16 ) |
+                    ( (FT_UInt32)cf2_buf_readByte( charstring ) <<  8 ) |
+                      (FT_UInt32)cf2_buf_readByte( charstring )         );
+
+            FT_TRACE4(( " %.2f", v / 65536.0 ));
+
+            cf2_stack_pushFixed( opStack, v );
+          }
+        }
+        continue;   /* don't clear stack */
+
+      } /* end of switch statement checking `op1' */
+
+      cf2_stack_clear( opStack );
+
+    } /* end of main interpreter loop */
+
+    /* we get here if the charstring ends without cf2_cmdENDCHAR */
+    FT_TRACE4(( "cf2_interpT2CharString:"
+                "  charstring ends without ENDCHAR\n" ));
+
+  exit:
+    /* check whether last error seen is also the first one */
+    cf2_setError( error, lastError );
+
+    /* free resources from objects we've used */
+    cf2_glyphpath_finalize( &glyphPath );
+    cf2_arrstack_finalize( &vStemHintArray );
+    cf2_arrstack_finalize( &hStemHintArray );
+    cf2_arrstack_finalize( &subrStack );
+    cf2_stack_free( opStack );
+
+    FT_TRACE4(( "\n" ));
+
+    return;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.h
new file mode 100644
index 0000000..b5d8947
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.h
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2font.h                                                              */
+/*                                                                         */
+/*    Adobe's CFF Interpreter (specification).                             */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CF2INTRP_H__
+#define __CF2INTRP_H__
+
+
+#include "cf2ft.h"
+#include "cf2hints.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( void )
+  cf2_hintmask_init( CF2_HintMask  hintmask,
+                     FT_Error*     error );
+  FT_LOCAL( FT_Bool )
+  cf2_hintmask_isValid( const CF2_HintMask  hintmask );
+  FT_LOCAL( FT_Bool )
+  cf2_hintmask_isNew( const CF2_HintMask  hintmask );
+  FT_LOCAL( void )
+  cf2_hintmask_setNew( CF2_HintMask  hintmask,
+                       FT_Bool       val );
+  FT_LOCAL( FT_Byte* )
+  cf2_hintmask_getMaskPtr( CF2_HintMask  hintmask );
+  FT_LOCAL( void )
+  cf2_hintmask_setAll( CF2_HintMask  hintmask,
+                       size_t        bitCount );
+
+  FT_LOCAL( void )
+  cf2_interpT2CharString( CF2_Font              font,
+                          CF2_Buffer            charstring,
+                          CF2_OutlineCallbacks  callbacks,
+                          const FT_Vector*      translation,
+                          FT_Bool               doingSeac,
+                          CF2_Fixed             curX,
+                          CF2_Fixed             curY,
+                          CF2_Fixed*            width );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2INTRP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.c
new file mode 100644
index 0000000..20e9294
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.c
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2read.c                                                              */
+/*                                                                         */
+/*    Adobe's code for stream handling (body).                             */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+
+#include "cf2error.h"
+
+
+  /* Define CF2_IO_FAIL as 1 to enable random errors and random */
+  /* value errors in I/O.                                       */
+#define CF2_IO_FAIL  0
+
+
+#if CF2_IO_FAIL
+
+  /* set the .00 value to a nonzero probability */
+  static int
+  randomError2( void )
+  {
+    /* for region buffer ReadByte (interp) function */
+    return (double)rand() / RAND_MAX < .00;
+  }
+
+  /* set the .00 value to a nonzero probability */
+  static CF2_Int
+  randomValue()
+  {
+    return (double)rand() / RAND_MAX < .00 ? rand() : 0;
+  }
+
+#endif /* CF2_IO_FAIL */
+
+
+  /* Region Buffer                                      */
+  /*                                                    */
+  /* Can be constructed from a copied buffer managed by */
+  /* `FCM_getDatablock'.                                */
+  /* Reads bytes with check for end of buffer.          */
+
+  /* reading past the end of the buffer sets error and returns zero */
+  FT_LOCAL_DEF( CF2_Int )
+  cf2_buf_readByte( CF2_Buffer  buf )
+  {
+    if ( buf->ptr < buf->end )
+    {
+#if CF2_IO_FAIL
+      if ( randomError2() )
+      {
+        CF2_SET_ERROR( buf->error, Invalid_Stream_Operation );
+        return 0;
+      }
+
+      return *(buf->ptr)++ + randomValue();
+#else
+      return *(buf->ptr)++;
+#endif
+    }
+    else
+    {
+      CF2_SET_ERROR( buf->error, Invalid_Stream_Operation );
+      return 0;
+    }
+  }
+
+
+  /* note: end condition can occur without error */
+  FT_LOCAL_DEF( FT_Bool )
+  cf2_buf_isEnd( CF2_Buffer  buf )
+  {
+    return (FT_Bool)( buf->ptr >= buf->end );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.h
new file mode 100644
index 0000000..7ef7c8c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.h
@@ -0,0 +1,68 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2read.h                                                              */
+/*                                                                         */
+/*    Adobe's code for stream handling (specification).                    */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CF2READ_H__
+#define __CF2READ_H__
+
+
+FT_BEGIN_HEADER
+
+
+  typedef struct  CF2_BufferRec_
+  {
+    FT_Error*       error;
+    const FT_Byte*  start;
+    const FT_Byte*  end;
+    const FT_Byte*  ptr;
+
+  } CF2_BufferRec, *CF2_Buffer;
+
+
+  FT_LOCAL( CF2_Int )
+  cf2_buf_readByte( CF2_Buffer  buf );
+  FT_LOCAL( FT_Bool )
+  cf2_buf_isEnd( CF2_Buffer  buf );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2READ_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.c
new file mode 100644
index 0000000..7930a22
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.c
@@ -0,0 +1,205 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2stack.c                                                             */
+/*                                                                         */
+/*    Adobe's code for emulating a CFF stack (body).                       */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+#include "cf2font.h"
+#include "cf2stack.h"
+
+#include "cf2error.h"
+
+
+  /* Allocate and initialize an instance of CF2_Stack.       */
+  /* Note: This function returns NULL on error (does not set */
+  /* `error').                                               */
+  FT_LOCAL_DEF( CF2_Stack )
+  cf2_stack_init( FT_Memory  memory,
+                  FT_Error*  e )
+  {
+    FT_Error  error = FT_Err_Ok;     /* for FT_QNEW */
+
+    CF2_Stack  stack = NULL;
+
+
+    if ( !FT_QNEW( stack ) )
+    {
+      /* initialize the structure; FT_QNEW zeroes it */
+      stack->memory = memory;
+      stack->error  = e;
+      stack->top    = &stack->buffer[0]; /* empty stack */
+    }
+
+    return stack;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_stack_free( CF2_Stack  stack )
+  {
+    if ( stack )
+    {
+      FT_Memory  memory = stack->memory;
+
+
+      /* free the main structure */
+      FT_FREE( stack );
+    }
+  }
+
+
+  FT_LOCAL_DEF( CF2_UInt )
+  cf2_stack_count( CF2_Stack  stack )
+  {
+    return (CF2_UInt)( stack->top - &stack->buffer[0] );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_stack_pushInt( CF2_Stack  stack,
+                     CF2_Int    val )
+  {
+    if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Overflow );
+      return;     /* stack overflow */
+    }
+
+    stack->top->u.i  = val;
+    stack->top->type = CF2_NumberInt;
+    ++stack->top;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_stack_pushFixed( CF2_Stack  stack,
+                       CF2_Fixed  val )
+  {
+    if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Overflow );
+      return;     /* stack overflow */
+    }
+
+    stack->top->u.r  = val;
+    stack->top->type = CF2_NumberFixed;
+    ++stack->top;
+  }
+
+
+  /* this function is only allowed to pop an integer type */
+  FT_LOCAL_DEF( CF2_Int )
+  cf2_stack_popInt( CF2_Stack  stack )
+  {
+    if ( stack->top == &stack->buffer[0] )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Underflow );
+      return 0;   /* underflow */
+    }
+    if ( stack->top[-1].type != CF2_NumberInt )
+    {
+      CF2_SET_ERROR( stack->error, Syntax_Error );
+      return 0;   /* type mismatch */
+    }
+
+    --stack->top;
+
+    return stack->top->u.i;
+  }
+
+
+  /* Note: type mismatch is silently cast */
+  /* TODO: check this */
+  FT_LOCAL_DEF( CF2_Fixed )
+  cf2_stack_popFixed( CF2_Stack  stack )
+  {
+    if ( stack->top == &stack->buffer[0] )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Underflow );
+      return cf2_intToFixed( 0 );    /* underflow */
+    }
+
+    --stack->top;
+
+    switch ( stack->top->type )
+    {
+    case CF2_NumberInt:
+      return cf2_intToFixed( stack->top->u.i );
+    case CF2_NumberFrac:
+      return cf2_fracToFixed( stack->top->u.f );
+    default:
+      return stack->top->u.r;
+    }
+  }
+
+
+  /* Note: type mismatch is silently cast */
+  /* TODO: check this */
+  FT_LOCAL_DEF( CF2_Fixed )
+  cf2_stack_getReal( CF2_Stack  stack,
+                     CF2_UInt   idx )
+  {
+    FT_ASSERT( cf2_stack_count( stack ) <= CF2_OPERAND_STACK_SIZE );
+
+    if ( idx >= cf2_stack_count( stack ) )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Overflow );
+      return cf2_intToFixed( 0 );    /* bounds error */
+    }
+
+    switch ( stack->buffer[idx].type )
+    {
+    case CF2_NumberInt:
+      return cf2_intToFixed( stack->buffer[idx].u.i );
+    case CF2_NumberFrac:
+      return cf2_fracToFixed( stack->buffer[idx].u.f );
+    default:
+      return stack->buffer[idx].u.r;
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_stack_clear( CF2_Stack  stack )
+  {
+    stack->top = &stack->buffer[0];
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.h
new file mode 100644
index 0000000..7d6d196
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.h
@@ -0,0 +1,106 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2stack.h                                                             */
+/*                                                                         */
+/*    Adobe's code for emulating a CFF stack (specification).              */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CF2STACK_H__
+#define __CF2STACK_H__
+
+
+FT_BEGIN_HEADER
+
+
+  /* CFF operand stack; specified maximum of 48 or 192 values */
+  typedef struct  CF2_StackNumber_
+  {
+    union
+    {
+      CF2_Fixed  r;      /* 16.16 fixed point */
+      CF2_Frac   f;      /* 2.30 fixed point (for font matrix) */
+      CF2_Int    i;
+    } u;
+
+    CF2_NumberType  type;
+
+  } CF2_StackNumber;
+
+
+  typedef struct  CF2_StackRec_
+  {
+    FT_Memory         memory;
+    FT_Error*         error;
+    CF2_StackNumber   buffer[CF2_OPERAND_STACK_SIZE];
+    CF2_StackNumber*  top;
+
+  } CF2_StackRec, *CF2_Stack;
+
+
+  FT_LOCAL( CF2_Stack )
+  cf2_stack_init( FT_Memory  memory,
+                  FT_Error*  error );
+  FT_LOCAL( void )
+  cf2_stack_free( CF2_Stack  stack );
+
+  FT_LOCAL( CF2_UInt )
+  cf2_stack_count( CF2_Stack  stack );
+
+  FT_LOCAL( void )
+  cf2_stack_pushInt( CF2_Stack  stack,
+                     CF2_Int    val );
+  FT_LOCAL( void )
+  cf2_stack_pushFixed( CF2_Stack  stack,
+                       CF2_Fixed  val );
+
+  FT_LOCAL( CF2_Int )
+  cf2_stack_popInt( CF2_Stack  stack );
+  FT_LOCAL( CF2_Fixed )
+  cf2_stack_popFixed( CF2_Stack  stack );
+
+  FT_LOCAL( CF2_Fixed )
+  cf2_stack_getReal( CF2_Stack  stack,
+                     CF2_UInt   idx );
+
+  FT_LOCAL( void )
+  cf2_stack_clear( CF2_Stack  stack );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2STACK_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2types.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2types.h
new file mode 100644
index 0000000..cbbef71
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2types.h
@@ -0,0 +1,78 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cf2types.h                                                             */
+/*                                                                         */
+/*    Adobe's code for defining data types (specification only).           */
+/*                                                                         */
+/*  Copyright 2011-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CF2TYPES_H__
+#define __CF2TYPES_H__
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   * The data models that we expect to support are as follows:
+   *
+   *   name  char short int long long-long pointer example
+   *  -----------------------------------------------------
+   *   ILP32  8    16    32  32     64*      32    32-bit MacOS, x86
+   *   LLP64  8    16    32  32     64       64    x64
+   *   LP64   8    16    32  64     64       64    64-bit MacOS
+   *
+   *    *) type may be supported by emulation on a 32-bit architecture
+   *
+   */
+
+
+  /* integers at least 32 bits wide */
+#define CF2_UInt  FT_UFast
+#define CF2_Int   FT_Fast
+
+
+  /* fixed-float numbers */
+  typedef FT_Int32  CF2_F16Dot16;
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2TYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.c
new file mode 100644
index 0000000..4aebe46
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.c
@@ -0,0 +1,210 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffcmap.c                                                              */
+/*                                                                         */
+/*    CFF character mapping table (cmap) support (body).                   */
+/*                                                                         */
+/*  Copyright 2002-2007, 2010, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "cffcmap.h"
+#include "cffload.h"
+
+#include "cfferrs.h"
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****           CFF STANDARD (AND EXPERT) ENCODING CMAPS            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_CALLBACK_DEF( FT_Error )
+  cff_cmap_encoding_init( CFF_CMapStd  cmap )
+  {
+    TT_Face       face     = (TT_Face)FT_CMAP_FACE( cmap );
+    CFF_Font      cff      = (CFF_Font)face->extra.data;
+    CFF_Encoding  encoding = &cff->encoding;
+
+
+    cmap->gids  = encoding->codes;
+
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  cff_cmap_encoding_done( CFF_CMapStd  cmap )
+  {
+    cmap->gids  = NULL;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  cff_cmap_encoding_char_index( CFF_CMapStd  cmap,
+                                FT_UInt32    char_code )
+  {
+    FT_UInt  result = 0;
+
+
+    if ( char_code < 256 )
+      result = cmap->gids[char_code];
+
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  cff_cmap_encoding_char_next( CFF_CMapStd   cmap,
+                               FT_UInt32    *pchar_code )
+  {
+    FT_UInt    result    = 0;
+    FT_UInt32  char_code = *pchar_code;
+
+
+    *pchar_code = 0;
+
+    if ( char_code < 255 )
+    {
+      FT_UInt  code = (FT_UInt)(char_code + 1);
+
+
+      for (;;)
+      {
+        if ( code >= 256 )
+          break;
+
+        result = cmap->gids[code];
+        if ( result != 0 )
+        {
+          *pchar_code = code;
+          break;
+        }
+
+        code++;
+      }
+    }
+    return result;
+  }
+
+
+  FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec,
+    sizeof ( CFF_CMapStdRec ),
+
+    (FT_CMap_InitFunc)     cff_cmap_encoding_init,
+    (FT_CMap_DoneFunc)     cff_cmap_encoding_done,
+    (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index,
+    (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****              CFF SYNTHETIC UNICODE ENCODING CMAP              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_CALLBACK_DEF( const char* )
+  cff_sid_to_glyph_name( TT_Face  face,
+                         FT_UInt  idx )
+  {
+    CFF_Font     cff     = (CFF_Font)face->extra.data;
+    CFF_Charset  charset = &cff->charset;
+    FT_UInt      sid     = charset->sids[idx];
+
+
+    return cff_index_get_sid_string( cff, sid );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  cff_cmap_unicode_init( PS_Unicodes  unicodes )
+  {
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    FT_Memory           memory  = FT_FACE_MEMORY( face );
+    CFF_Font            cff     = (CFF_Font)face->extra.data;
+    CFF_Charset         charset = &cff->charset;
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
+
+
+    /* can't build Unicode map for CID-keyed font */
+    /* because we don't know glyph names.         */
+    if ( !charset->sids )
+      return FT_THROW( No_Unicode_Glyph_Name );
+
+    return psnames->unicodes_init( memory,
+                                   unicodes,
+                                   cff->num_glyphs,
+                                   (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name,
+                                   (PS_FreeGlyphNameFunc)NULL,
+                                   (FT_Pointer)face );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  cff_cmap_unicode_done( PS_Unicodes  unicodes )
+  {
+    FT_Face    face   = FT_CMAP_FACE( unicodes );
+    FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+    FT_FREE( unicodes->maps );
+    unicodes->num_maps = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  cff_cmap_unicode_char_index( PS_Unicodes  unicodes,
+                               FT_UInt32    char_code )
+  {
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    CFF_Font            cff     = (CFF_Font)face->extra.data;
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
+
+
+    return psnames->unicodes_char_index( unicodes, char_code );
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  cff_cmap_unicode_char_next( PS_Unicodes  unicodes,
+                              FT_UInt32   *pchar_code )
+  {
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    CFF_Font            cff     = (CFF_Font)face->extra.data;
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
+
+
+    return psnames->unicodes_char_next( unicodes, pchar_code );
+  }
+
+
+  FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec,
+    sizeof ( PS_UnicodesRec ),
+
+    (FT_CMap_InitFunc)     cff_cmap_unicode_init,
+    (FT_CMap_DoneFunc)     cff_cmap_unicode_done,
+    (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index,
+    (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  )
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.h
new file mode 100644
index 0000000..3f7f67b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.h
@@ -0,0 +1,67 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffcmap.h                                                              */
+/*                                                                         */
+/*    CFF character mapping table (cmap) support (specification).          */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2006 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFCMAP_H__
+#define __CFFCMAP_H__
+
+#include "cffobjs.h"
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* standard (and expert) encoding cmaps */
+  typedef struct CFF_CMapStdRec_*  CFF_CMapStd;
+
+  typedef struct  CFF_CMapStdRec_
+  {
+    FT_CMapRec  cmap;
+    FT_UShort*  gids;   /* up to 256 elements */
+
+  } CFF_CMapStdRec;
+
+
+  FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec)
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****               CFF SYNTHETIC UNICODE ENCODING CMAP             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* unicode (synthetic) cmaps */
+
+  FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec)
+
+
+FT_END_HEADER
+
+#endif /* __CFFCMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.c
new file mode 100644
index 0000000..84f305c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.c
@@ -0,0 +1,787 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffdrivr.c                                                             */
+/*                                                                         */
+/*    OpenType font driver implementation (body).                          */
+/*                                                                         */
+/*  Copyright 1996-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/services/svcid.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+
+#include "cffdrivr.h"
+#include "cffgload.h"
+#include "cffload.h"
+#include "cffcmap.h"
+#include "cffparse.h"
+
+#include "cfferrs.h"
+#include "cffpic.h"
+
+#include "../../include/freetype/internal/services/svxf86nm.h"
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svprop.h"
+#include "../../include/freetype/ftcffdrv.h"
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cffdriver
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                          F A C E S                              ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#undef  PAIR_TAG
+#define PAIR_TAG( left, right )  ( ( (FT_ULong)left << 16 ) | \
+                                     (FT_ULong)right        )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_get_kerning                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A driver method used to return the kerning vector between two      */
+  /*    glyphs of the same face.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to the source face object.                 */
+  /*                                                                       */
+  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
+  /*                                                                       */
+  /*    right_glyph :: The index of the right glyph in the kern pair.      */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    kerning     :: The kerning vector.  This is in font units for      */
+  /*                   scalable formats, and in pixels for fixed-sizes     */
+  /*                   formats.                                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
+  /*    supported by this function.  Other layouts, or more sophisticated  */
+  /*    kernings, are out of scope of this method (the basic driver        */
+  /*    interface is meant to be simple).                                  */
+  /*                                                                       */
+  /*    They can be implemented by format-specific interfaces.             */
+  /*                                                                       */
+  FT_CALLBACK_DEF( FT_Error )
+  cff_get_kerning( FT_Face     ttface,          /* TT_Face */
+                   FT_UInt     left_glyph,
+                   FT_UInt     right_glyph,
+                   FT_Vector*  kerning )
+  {
+    TT_Face       face = (TT_Face)ttface;
+    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
+
+
+    kerning->x = 0;
+    kerning->y = 0;
+
+    if ( sfnt )
+      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
+
+    return FT_Err_Ok;
+  }
+
+
+#undef PAIR_TAG
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_glyph_load                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A driver method used to load a glyph within a given glyph slot.    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot        :: A handle to the target slot object where the glyph  */
+  /*                   will be loaded.                                     */
+  /*                                                                       */
+  /*    size        :: A handle to the source face size at which the glyph */
+  /*                   must be scaled, loaded, etc.                        */
+  /*                                                                       */
+  /*    glyph_index :: The index of the glyph in the font file.            */
+  /*                                                                       */
+  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
+  /*                   FT_LOAD_??? constants can be used to control the    */
+  /*                   glyph loading process (e.g., whether the outline    */
+  /*                   should be scaled, whether to load bitmaps or not,   */
+  /*                   whether to hint the outline, etc).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_CALLBACK_DEF( FT_Error )
+  cff_glyph_load( FT_GlyphSlot  cffslot,      /* CFF_GlyphSlot */
+                  FT_Size       cffsize,      /* CFF_Size      */
+                  FT_UInt       glyph_index,
+                  FT_Int32      load_flags )
+  {
+    FT_Error       error;
+    CFF_GlyphSlot  slot = (CFF_GlyphSlot)cffslot;
+    CFF_Size       size = (CFF_Size)cffsize;
+
+
+    if ( !slot )
+      return FT_THROW( Invalid_Slot_Handle );
+
+    /* check whether we want a scaled outline or bitmap */
+    if ( !size )
+      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+    /* reset the size object if necessary */
+    if ( load_flags & FT_LOAD_NO_SCALE )
+      size = NULL;
+
+    if ( size )
+    {
+      /* these two objects must have the same parent */
+      if ( cffsize->face != cffslot->face )
+        return FT_THROW( Invalid_Face_Handle );
+    }
+
+    /* now load the glyph outline if necessary */
+    error = cff_slot_load( slot, size, glyph_index, load_flags );
+
+    /* force drop-out mode to 2 - irrelevant now */
+    /* slot->outline.dropout_mode = 2; */
+
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  cff_get_advances( FT_Face    face,
+                    FT_UInt    start,
+                    FT_UInt    count,
+                    FT_Int32   flags,
+                    FT_Fixed*  advances )
+  {
+    FT_UInt       nn;
+    FT_Error      error = FT_Err_Ok;
+    FT_GlyphSlot  slot  = face->glyph;
+
+
+    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
+
+    for ( nn = 0; nn < count; nn++ )
+    {
+      error = cff_glyph_load( slot, face->size, start + nn, flags );
+      if ( error )
+        break;
+
+      advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
+                     ? slot->linearVertAdvance
+                     : slot->linearHoriAdvance;
+    }
+
+    return error;
+  }
+
+
+  /*
+   *  GLYPH DICT SERVICE
+   *
+   */
+
+  static FT_Error
+  cff_get_glyph_name( CFF_Face    face,
+                      FT_UInt     glyph_index,
+                      FT_Pointer  buffer,
+                      FT_UInt     buffer_max )
+  {
+    CFF_Font    font   = (CFF_Font)face->extra.data;
+    FT_String*  gname;
+    FT_UShort   sid;
+    FT_Error    error;
+
+
+    if ( !font->psnames )
+    {
+      FT_ERROR(( "cff_get_glyph_name:"
+                 " cannot get glyph name from CFF & CEF fonts\n"
+                 "                   "
+                 " without the `PSNames' module\n" ));
+      error = FT_THROW( Missing_Module );
+      goto Exit;
+    }
+
+    /* first, locate the sid in the charset table */
+    sid = font->charset.sids[glyph_index];
+
+    /* now, lookup the name itself */
+    gname = cff_index_get_sid_string( font, sid );
+
+    if ( gname )
+      FT_STRCPYN( buffer, gname, buffer_max );
+
+    error = FT_Err_Ok;
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_UInt
+  cff_get_name_index( CFF_Face    face,
+                      FT_String*  glyph_name )
+  {
+    CFF_Font            cff;
+    CFF_Charset         charset;
+    FT_Service_PsCMaps  psnames;
+    FT_String*          name;
+    FT_UShort           sid;
+    FT_UInt             i;
+
+
+    cff     = (CFF_FontRec *)face->extra.data;
+    charset = &cff->charset;
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+    if ( !psnames )
+      return 0;
+
+    for ( i = 0; i < cff->num_glyphs; i++ )
+    {
+      sid = charset->sids[i];
+
+      if ( sid > 390 )
+        name = cff_index_get_string( cff, sid - 391 );
+      else
+        name = (FT_String *)psnames->adobe_std_strings( sid );
+
+      if ( !name )
+        continue;
+
+      if ( !ft_strcmp( glyph_name, name ) )
+        return i;
+    }
+
+    return 0;
+  }
+
+
+  FT_DEFINE_SERVICE_GLYPHDICTREC(
+    cff_service_glyph_dict,
+    (FT_GlyphDict_GetNameFunc)  cff_get_glyph_name,
+    (FT_GlyphDict_NameIndexFunc)cff_get_name_index
+  )
+
+
+  /*
+   *  POSTSCRIPT INFO SERVICE
+   *
+   */
+
+  static FT_Int
+  cff_ps_has_glyph_names( FT_Face  face )
+  {
+    return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0;
+  }
+
+
+  static FT_Error
+  cff_ps_get_font_info( CFF_Face         face,
+                        PS_FontInfoRec*  afont_info )
+  {
+    CFF_Font  cff   = (CFF_Font)face->extra.data;
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( cff && cff->font_info == NULL )
+    {
+      CFF_FontRecDict  dict   = &cff->top_font.font_dict;
+      PS_FontInfoRec  *font_info = NULL;
+      FT_Memory        memory = face->root.memory;
+
+
+      if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) )
+        goto Fail;
+
+      font_info->version     = cff_index_get_sid_string( cff,
+                                                         dict->version );
+      font_info->notice      = cff_index_get_sid_string( cff,
+                                                         dict->notice );
+      font_info->full_name   = cff_index_get_sid_string( cff,
+                                                         dict->full_name );
+      font_info->family_name = cff_index_get_sid_string( cff,
+                                                         dict->family_name );
+      font_info->weight      = cff_index_get_sid_string( cff,
+                                                         dict->weight );
+      font_info->italic_angle        = dict->italic_angle;
+      font_info->is_fixed_pitch      = dict->is_fixed_pitch;
+      font_info->underline_position  = (FT_Short)dict->underline_position;
+      font_info->underline_thickness = (FT_Short)dict->underline_thickness;
+
+      cff->font_info = font_info;
+    }
+
+    if ( cff )
+      *afont_info = *cff->font_info;
+
+  Fail:
+    return error;
+  }
+
+
+  FT_DEFINE_SERVICE_PSINFOREC(
+    cff_service_ps_info,
+    (PS_GetFontInfoFunc)   cff_ps_get_font_info,
+    (PS_GetFontExtraFunc)  NULL,
+    (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names,
+    (PS_GetFontPrivateFunc)NULL,        /* unsupported with CFF fonts */
+    (PS_GetFontValueFunc)  NULL         /* not implemented            */
+  )
+
+
+  /*
+   *  POSTSCRIPT NAME SERVICE
+   *
+   */
+
+  static const char*
+  cff_get_ps_name( CFF_Face  face )
+  {
+    CFF_Font  cff = (CFF_Font)face->extra.data;
+
+
+    return (const char*)cff->font_name;
+  }
+
+
+  FT_DEFINE_SERVICE_PSFONTNAMEREC(
+    cff_service_ps_name,
+    (FT_PsName_GetFunc)cff_get_ps_name
+  )
+
+
+  /*
+   * TT CMAP INFO
+   *
+   * If the charmap is a synthetic Unicode encoding cmap or
+   * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO
+   * service defined in SFNT module.
+   *
+   * Otherwise call the service function in the sfnt module.
+   *
+   */
+  static FT_Error
+  cff_get_cmap_info( FT_CharMap    charmap,
+                     TT_CMapInfo  *cmap_info )
+  {
+    FT_CMap   cmap  = FT_CMAP( charmap );
+    FT_Error  error = FT_Err_Ok;
+
+    FT_Face     face    = FT_CMAP_FACE( cmap );
+    FT_Library  library = FT_FACE_LIBRARY( face );
+
+
+    cmap_info->language = 0;
+    cmap_info->format   = 0;
+
+    if ( cmap->clazz != &CFF_CMAP_ENCODING_CLASS_REC_GET &&
+         cmap->clazz != &CFF_CMAP_UNICODE_CLASS_REC_GET  )
+    {
+      FT_Module           sfnt    = FT_Get_Module( library, "sfnt" );
+      FT_Service_TTCMaps  service =
+        (FT_Service_TTCMaps)ft_module_get_service( sfnt,
+                                                   FT_SERVICE_ID_TT_CMAP );
+
+
+      if ( service && service->get_cmap_info )
+        error = service->get_cmap_info( charmap, cmap_info );
+    }
+
+    return error;
+  }
+
+
+  FT_DEFINE_SERVICE_TTCMAPSREC(
+    cff_service_get_cmap_info,
+    (TT_CMap_Info_GetFunc)cff_get_cmap_info
+  )
+
+
+  /*
+   *  CID INFO SERVICE
+   *
+   */
+  static FT_Error
+  cff_get_ros( CFF_Face      face,
+               const char*  *registry,
+               const char*  *ordering,
+               FT_Int       *supplement )
+  {
+    FT_Error  error = FT_Err_Ok;
+    CFF_Font  cff   = (CFF_Font)face->extra.data;
+
+
+    if ( cff )
+    {
+      CFF_FontRecDict  dict = &cff->top_font.font_dict;
+
+
+      if ( dict->cid_registry == 0xFFFFU )
+      {
+        error = FT_THROW( Invalid_Argument );
+        goto Fail;
+      }
+
+      if ( registry )
+      {
+        if ( cff->registry == NULL )
+          cff->registry = cff_index_get_sid_string( cff,
+                                                    dict->cid_registry );
+        *registry = cff->registry;
+      }
+
+      if ( ordering )
+      {
+        if ( cff->ordering == NULL )
+          cff->ordering = cff_index_get_sid_string( cff,
+                                                    dict->cid_ordering );
+        *ordering = cff->ordering;
+      }
+
+      /*
+       * XXX: According to Adobe TechNote #5176, the supplement in CFF
+       *      can be a real number. We truncate it to fit public API
+       *      since freetype-2.3.6.
+       */
+      if ( supplement )
+      {
+        if ( dict->cid_supplement < FT_INT_MIN ||
+             dict->cid_supplement > FT_INT_MAX )
+          FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n",
+                      dict->cid_supplement ));
+        *supplement = (FT_Int)dict->cid_supplement;
+      }
+    }
+
+  Fail:
+    return error;
+  }
+
+
+  static FT_Error
+  cff_get_is_cid( CFF_Face  face,
+                  FT_Bool  *is_cid )
+  {
+    FT_Error  error = FT_Err_Ok;
+    CFF_Font  cff   = (CFF_Font)face->extra.data;
+
+
+    *is_cid = 0;
+
+    if ( cff )
+    {
+      CFF_FontRecDict  dict = &cff->top_font.font_dict;
+
+
+      if ( dict->cid_registry != 0xFFFFU )
+        *is_cid = 1;
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  cff_get_cid_from_glyph_index( CFF_Face  face,
+                                FT_UInt   glyph_index,
+                                FT_UInt  *cid )
+  {
+    FT_Error  error = FT_Err_Ok;
+    CFF_Font  cff;
+
+
+    cff = (CFF_Font)face->extra.data;
+
+    if ( cff )
+    {
+      FT_UInt          c;
+      CFF_FontRecDict  dict = &cff->top_font.font_dict;
+
+
+      if ( dict->cid_registry == 0xFFFFU )
+      {
+        error = FT_THROW( Invalid_Argument );
+        goto Fail;
+      }
+
+      if ( glyph_index > cff->num_glyphs )
+      {
+        error = FT_THROW( Invalid_Argument );
+        goto Fail;
+      }
+
+      c = cff->charset.sids[glyph_index];
+
+      if ( cid )
+        *cid = c;
+    }
+
+  Fail:
+    return error;
+  }
+
+
+  FT_DEFINE_SERVICE_CIDREC(
+    cff_service_cid_info,
+    (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros,
+    (FT_CID_GetIsInternallyCIDKeyedFunc)      cff_get_is_cid,
+    (FT_CID_GetCIDFromGlyphIndexFunc)         cff_get_cid_from_glyph_index
+  )
+
+
+  /*
+   *  PROPERTY SERVICE
+   *
+   */
+  static FT_Error
+  cff_property_set( FT_Module    module,         /* CFF_Driver */
+                    const char*  property_name,
+                    const void*  value )
+  {
+    FT_Error    error  = FT_Err_Ok;
+    CFF_Driver  driver = (CFF_Driver)module;
+
+
+    if ( !ft_strcmp( property_name, "hinting-engine" ) )
+    {
+      FT_UInt*  hinting_engine = (FT_UInt*)value;
+
+
+#ifndef CFF_CONFIG_OPTION_OLD_ENGINE
+      if ( *hinting_engine != FT_CFF_HINTING_ADOBE )
+        error = FT_ERR( Unimplemented_Feature );
+      else
+#endif
+        driver->hinting_engine = *hinting_engine;
+
+      return error;
+    }
+    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+    {
+      FT_Bool*  no_stem_darkening = (FT_Bool*)value;
+
+
+      driver->no_stem_darkening = *no_stem_darkening;
+
+      return error;
+    }
+
+    FT_TRACE0(( "cff_property_set: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  static FT_Error
+  cff_property_get( FT_Module    module,         /* CFF_Driver */
+                    const char*  property_name,
+                    const void*  value )
+  {
+    FT_Error    error  = FT_Err_Ok;
+    CFF_Driver  driver = (CFF_Driver)module;
+
+    FT_UInt  hinting_engine    = driver->hinting_engine;
+    FT_Bool  no_stem_darkening = driver->no_stem_darkening;
+
+
+    if ( !ft_strcmp( property_name, "hinting-engine" ) )
+    {
+      FT_UInt*  val = (FT_UInt*)value;
+
+
+      *val = hinting_engine;
+
+      return error;
+    }
+    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+    {
+      FT_Bool*  val = (FT_Bool*)value;
+
+
+      *val = no_stem_darkening;
+
+      return error;
+    }
+
+    FT_TRACE0(( "cff_property_get: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  FT_DEFINE_SERVICE_PROPERTIESREC(
+    cff_service_properties,
+    (FT_Properties_SetFunc)cff_property_set,
+    (FT_Properties_GetFunc)cff_property_get )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                D R I V E R  I N T E R F A C E                   ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
+  FT_DEFINE_SERVICEDESCREC7(
+    cff_services,
+    FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_CFF,
+    FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_GLYPH_DICT,           &CFF_SERVICE_GLYPH_DICT_GET,
+    FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
+    FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,
+    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET
+  )
+#else
+  FT_DEFINE_SERVICEDESCREC6(
+    cff_services,
+    FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_CFF,
+    FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
+    FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,
+    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET
+  )
+#endif
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  cff_get_interface( FT_Module    driver,       /* CFF_Driver */
+                     const char*  module_interface )
+  {
+    FT_Library           library;
+    FT_Module            sfnt;
+    FT_Module_Interface  result;
+
+
+    /* CFF_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+    if ( !driver )
+      return NULL;
+    library = driver->library;
+    if ( !library )
+      return NULL;
+#endif
+
+    result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface );
+    if ( result != NULL )
+      return result;
+
+    /* `driver' is not yet evaluated in non-PIC mode */
+#ifndef FT_CONFIG_OPTION_PIC
+    if ( !driver )
+      return NULL;
+    library = driver->library;
+    if ( !library )
+      return NULL;
+#endif
+
+    /* we pass our request to the `sfnt' module */
+    sfnt = FT_Get_Module( library, "sfnt" );
+
+    return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0;
+  }
+
+
+  /* The FT_DriverInterface structure is defined in ftdriver.h. */
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#define CFF_SIZE_SELECT cff_size_select
+#else
+#define CFF_SIZE_SELECT 0
+#endif
+
+  FT_DEFINE_DRIVER(
+    cff_driver_class,
+
+      FT_MODULE_FONT_DRIVER       |
+      FT_MODULE_DRIVER_SCALABLE   |
+      FT_MODULE_DRIVER_HAS_HINTER,
+
+      sizeof ( CFF_DriverRec ),
+      "cff",
+      0x10000L,
+      0x20000L,
+
+      0,   /* module-specific interface */
+
+      cff_driver_init,
+      cff_driver_done,
+      cff_get_interface,
+
+    /* now the specific driver fields */
+    sizeof ( TT_FaceRec ),
+    sizeof ( CFF_SizeRec ),
+    sizeof ( CFF_GlyphSlotRec ),
+
+    cff_face_init,
+    cff_face_done,
+    cff_size_init,
+    cff_size_done,
+    cff_slot_init,
+    cff_slot_done,
+
+    cff_glyph_load,
+
+    cff_get_kerning,
+    0,                       /* FT_Face_AttachFunc */
+    cff_get_advances,
+
+    cff_size_request,
+
+    CFF_SIZE_SELECT
+  )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.h
new file mode 100644
index 0000000..cd41f57
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.h
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffdrivr.h                                                             */
+/*                                                                         */
+/*    High-level OpenType driver interface (specification).                */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFDRIVER_H__
+#define __CFFDRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdriver.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_DECLARE_DRIVER( cff_driver_class )
+
+
+FT_END_HEADER
+
+#endif /* __CFFDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfferrs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfferrs.h
new file mode 100644
index 0000000..47e755c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfferrs.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cfferrs.h                                                              */
+/*                                                                         */
+/*    CFF error codes (specification only).                                */
+/*                                                                         */
+/*  Copyright 2001, 2012 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the CFF error enumeration constants.      */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __CFFERRS_H__
+#define __CFFERRS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  CFF_Err_
+#define FT_ERR_BASE    FT_Mod_Err_CFF
+
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __CFFERRS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.c
new file mode 100644
index 0000000..bbb75ab
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.c
@@ -0,0 +1,3072 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffgload.c                                                             */
+/*                                                                         */
+/*    OpenType Glyph Loader (body).                                        */
+/*                                                                         */
+/*  Copyright 1996-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftcffdrv.h"
+
+#include "cffobjs.h"
+#include "cffload.h"
+#include "cffgload.h"
+#include "cf2ft.h"      /* for cf2_decoder_parse_charstrings */
+
+#include "cfferrs.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cffgload
+
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+
+  typedef enum  CFF_Operator_
+  {
+    cff_op_unknown = 0,
+
+    cff_op_rmoveto,
+    cff_op_hmoveto,
+    cff_op_vmoveto,
+
+    cff_op_rlineto,
+    cff_op_hlineto,
+    cff_op_vlineto,
+
+    cff_op_rrcurveto,
+    cff_op_hhcurveto,
+    cff_op_hvcurveto,
+    cff_op_rcurveline,
+    cff_op_rlinecurve,
+    cff_op_vhcurveto,
+    cff_op_vvcurveto,
+
+    cff_op_flex,
+    cff_op_hflex,
+    cff_op_hflex1,
+    cff_op_flex1,
+
+    cff_op_endchar,
+
+    cff_op_hstem,
+    cff_op_vstem,
+    cff_op_hstemhm,
+    cff_op_vstemhm,
+
+    cff_op_hintmask,
+    cff_op_cntrmask,
+    cff_op_dotsection,  /* deprecated, acts as no-op */
+
+    cff_op_abs,
+    cff_op_add,
+    cff_op_sub,
+    cff_op_div,
+    cff_op_neg,
+    cff_op_random,
+    cff_op_mul,
+    cff_op_sqrt,
+
+    cff_op_blend,
+
+    cff_op_drop,
+    cff_op_exch,
+    cff_op_index,
+    cff_op_roll,
+    cff_op_dup,
+
+    cff_op_put,
+    cff_op_get,
+    cff_op_store,
+    cff_op_load,
+
+    cff_op_and,
+    cff_op_or,
+    cff_op_not,
+    cff_op_eq,
+    cff_op_ifelse,
+
+    cff_op_callsubr,
+    cff_op_callgsubr,
+    cff_op_return,
+
+    /* Type 1 opcodes: invalid but seen in real life */
+    cff_op_hsbw,
+    cff_op_closepath,
+    cff_op_callothersubr,
+    cff_op_pop,
+    cff_op_seac,
+    cff_op_sbw,
+    cff_op_setcurrentpoint,
+
+    /* do not remove */
+    cff_op_max
+
+  } CFF_Operator;
+
+
+#define CFF_COUNT_CHECK_WIDTH  0x80
+#define CFF_COUNT_EXACT        0x40
+#define CFF_COUNT_CLEAR_STACK  0x20
+
+  /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are  */
+  /* used for checking the width and requested numbers of arguments    */
+  /* only; they are set to zero afterwards                             */
+
+  /* the other two flags are informative only and unused currently     */
+
+  static const FT_Byte  cff_argument_counts[] =
+  {
+    0,  /* unknown */
+
+    2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */
+    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
+    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
+
+    0 | CFF_COUNT_CLEAR_STACK, /* rlineto */
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+
+    0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+
+    13, /* flex */
+    7,
+    9,
+    11,
+
+    0 | CFF_COUNT_CHECK_WIDTH, /* endchar */
+
+    2 | CFF_COUNT_CHECK_WIDTH, /* hstem */
+    2 | CFF_COUNT_CHECK_WIDTH,
+    2 | CFF_COUNT_CHECK_WIDTH,
+    2 | CFF_COUNT_CHECK_WIDTH,
+
+    0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */
+    0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */
+    0, /* dotsection */
+
+    1, /* abs */
+    2,
+    2,
+    2,
+    1,
+    0,
+    2,
+    1,
+
+    1, /* blend */
+
+    1, /* drop */
+    2,
+    1,
+    2,
+    1,
+
+    2, /* put */
+    1,
+    4,
+    3,
+
+    2, /* and */
+    2,
+    1,
+    2,
+    4,
+
+    1, /* callsubr */
+    1,
+    0,
+
+    2, /* hsbw */
+    0,
+    0,
+    0,
+    5, /* seac */
+    4, /* sbw */
+    2  /* setcurrentpoint */
+  };
+
+#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /**********                                                      *********/
+  /**********                                                      *********/
+  /**********             GENERIC CHARSTRING PARSING               *********/
+  /**********                                                      *********/
+  /**********                                                      *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_builder_init                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given glyph builder.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    builder :: A pointer to the glyph builder to initialize.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: The current face object.                                */
+  /*                                                                       */
+  /*    size    :: The current size object.                                */
+  /*                                                                       */
+  /*    glyph   :: The current glyph object.                               */
+  /*                                                                       */
+  /*    hinting :: Whether hinting is active.                              */
+  /*                                                                       */
+  static void
+  cff_builder_init( CFF_Builder*   builder,
+                    TT_Face        face,
+                    CFF_Size       size,
+                    CFF_GlyphSlot  glyph,
+                    FT_Bool        hinting )
+  {
+    builder->path_begun  = 0;
+    builder->load_points = 1;
+
+    builder->face   = face;
+    builder->glyph  = glyph;
+    builder->memory = face->root.memory;
+
+    if ( glyph )
+    {
+      FT_GlyphLoader  loader = glyph->root.internal->loader;
+
+
+      builder->loader  = loader;
+      builder->base    = &loader->base.outline;
+      builder->current = &loader->current.outline;
+      FT_GlyphLoader_Rewind( loader );
+
+      builder->hints_globals = 0;
+      builder->hints_funcs   = 0;
+
+      if ( hinting && size )
+      {
+        CFF_Internal  internal = (CFF_Internal)size->root.internal;
+
+
+        builder->hints_globals = (void *)internal->topfont;
+        builder->hints_funcs   = glyph->root.internal->glyph_hints;
+      }
+    }
+
+    builder->pos_x = 0;
+    builder->pos_y = 0;
+
+    builder->left_bearing.x = 0;
+    builder->left_bearing.y = 0;
+    builder->advance.x      = 0;
+    builder->advance.y      = 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_builder_done                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a given glyph builder.  Its contents can still be used   */
+  /*    after the call, but the function saves important information       */
+  /*    within the corresponding glyph slot.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    builder :: A pointer to the glyph builder to finalize.             */
+  /*                                                                       */
+  static void
+  cff_builder_done( CFF_Builder*  builder )
+  {
+    CFF_GlyphSlot  glyph = builder->glyph;
+
+
+    if ( glyph )
+      glyph->root.outline = *builder->base;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_compute_bias                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the bias value in dependence of the number of glyph       */
+  /*    subroutines.                                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    in_charstring_type :: The `CharstringType' value of the top DICT   */
+  /*                          dictionary.                                  */
+  /*                                                                       */
+  /*    num_subrs          :: The number of glyph subroutines.             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The bias value.                                                    */
+  static FT_Int
+  cff_compute_bias( FT_Int   in_charstring_type,
+                    FT_UInt  num_subrs )
+  {
+    FT_Int  result;
+
+
+    if ( in_charstring_type == 1 )
+      result = 0;
+    else if ( num_subrs < 1240 )
+      result = 107;
+    else if ( num_subrs < 33900U )
+      result = 1131;
+    else
+      result = 32768U;
+
+    return result;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_decoder_init                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given glyph decoder.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    decoder :: A pointer to the glyph builder to initialize.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face      :: The current face object.                              */
+  /*                                                                       */
+  /*    size      :: The current size object.                              */
+  /*                                                                       */
+  /*    slot      :: The current glyph object.                             */
+  /*                                                                       */
+  /*    hinting   :: Whether hinting is active.                            */
+  /*                                                                       */
+  /*    hint_mode :: The hinting mode.                                     */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  cff_decoder_init( CFF_Decoder*    decoder,
+                    TT_Face         face,
+                    CFF_Size        size,
+                    CFF_GlyphSlot   slot,
+                    FT_Bool         hinting,
+                    FT_Render_Mode  hint_mode )
+  {
+    CFF_Font  cff = (CFF_Font)face->extra.data;
+
+
+    /* clear everything */
+    FT_MEM_ZERO( decoder, sizeof ( *decoder ) );
+
+    /* initialize builder */
+    cff_builder_init( &decoder->builder, face, size, slot, hinting );
+
+    /* initialize Type2 decoder */
+    decoder->cff          = cff;
+    decoder->num_globals  = cff->global_subrs_index.count;
+    decoder->globals      = cff->global_subrs;
+    decoder->globals_bias = cff_compute_bias(
+                              cff->top_font.font_dict.charstring_type,
+                              decoder->num_globals );
+
+    decoder->hint_mode    = hint_mode;
+  }
+
+
+  /* this function is used to select the subfont */
+  /* and the locals subrs array                  */
+  FT_LOCAL_DEF( FT_Error )
+  cff_decoder_prepare( CFF_Decoder*  decoder,
+                       CFF_Size      size,
+                       FT_UInt       glyph_index )
+  {
+    CFF_Builder  *builder = &decoder->builder;
+    CFF_Font      cff     = (CFF_Font)builder->face->extra.data;
+    CFF_SubFont   sub     = &cff->top_font;
+    FT_Error      error   = FT_Err_Ok;
+
+
+    /* manage CID fonts */
+    if ( cff->num_subfonts )
+    {
+      FT_Byte  fd_index = cff_fd_select_get( &cff->fd_select, glyph_index );
+
+
+      if ( fd_index >= cff->num_subfonts )
+      {
+        FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      FT_TRACE3(( "glyph index %d (subfont %d):\n", glyph_index, fd_index ));
+
+      sub = cff->subfonts[fd_index];
+
+      if ( builder->hints_funcs && size )
+      {
+        CFF_Internal  internal = (CFF_Internal)size->root.internal;
+
+
+        /* for CFFs without subfonts, this value has already been set */
+        builder->hints_globals = (void *)internal->subfonts[fd_index];
+      }
+    }
+#ifdef FT_DEBUG_LEVEL_TRACE
+    else
+      FT_TRACE3(( "glyph index %d:\n", glyph_index ));
+#endif
+
+    decoder->num_locals    = sub->local_subrs_index.count;
+    decoder->locals        = sub->local_subrs;
+    decoder->locals_bias   = cff_compute_bias(
+                               decoder->cff->top_font.font_dict.charstring_type,
+                               decoder->num_locals );
+
+    decoder->glyph_width   = sub->private_dict.default_width;
+    decoder->nominal_width = sub->private_dict.nominal_width;
+
+    decoder->current_subfont = sub;     /* for Adobe's CFF handler */
+
+  Exit:
+    return error;
+  }
+
+
+  /* check that there is enough space for `count' more points */
+  FT_LOCAL_DEF( FT_Error )
+  cff_check_points( CFF_Builder*  builder,
+                    FT_Int        count )
+  {
+    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
+  }
+
+
+  /* add a new point, do not check space */
+  FT_LOCAL_DEF( void )
+  cff_builder_add_point( CFF_Builder*  builder,
+                         FT_Pos        x,
+                         FT_Pos        y,
+                         FT_Byte       flag )
+  {
+    FT_Outline*  outline = builder->current;
+
+
+    if ( builder->load_points )
+    {
+      FT_Vector*  point   = outline->points + outline->n_points;
+      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+      CFF_Driver  driver  = (CFF_Driver)FT_FACE_DRIVER( builder->face );
+
+
+      if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
+      {
+        point->x = x >> 16;
+        point->y = y >> 16;
+      }
+      else
+#endif
+      {
+        /* cf2_decoder_parse_charstrings uses 16.16 coordinates */
+        point->x = x >> 10;
+        point->y = y >> 10;
+      }
+      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
+    }
+
+    outline->n_points++;
+  }
+
+
+  /* check space for a new on-curve point, then add it */
+  FT_LOCAL_DEF( FT_Error )
+  cff_builder_add_point1( CFF_Builder*  builder,
+                          FT_Pos        x,
+                          FT_Pos        y )
+  {
+    FT_Error  error;
+
+
+    error = cff_check_points( builder, 1 );
+    if ( !error )
+      cff_builder_add_point( builder, x, y, 1 );
+
+    return error;
+  }
+
+
+  /* check space for a new contour, then add it */
+  static FT_Error
+  cff_builder_add_contour( CFF_Builder*  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Error     error;
+
+
+    if ( !builder->load_points )
+    {
+      outline->n_contours++;
+      return FT_Err_Ok;
+    }
+
+    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
+    if ( !error )
+    {
+      if ( outline->n_contours > 0 )
+        outline->contours[outline->n_contours - 1] =
+          (short)( outline->n_points - 1 );
+
+      outline->n_contours++;
+    }
+
+    return error;
+  }
+
+
+  /* if a path was begun, add its first on-curve point */
+  FT_LOCAL_DEF( FT_Error )
+  cff_builder_start_point( CFF_Builder*  builder,
+                           FT_Pos        x,
+                           FT_Pos        y )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    /* test whether we are building a new contour */
+    if ( !builder->path_begun )
+    {
+      builder->path_begun = 1;
+      error = cff_builder_add_contour( builder );
+      if ( !error )
+        error = cff_builder_add_point1( builder, x, y );
+    }
+
+    return error;
+  }
+
+
+  /* close the current contour */
+  FT_LOCAL_DEF( void )
+  cff_builder_close_contour( CFF_Builder*  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Int       first;
+
+
+    if ( !outline )
+      return;
+
+    first = outline->n_contours <= 1
+            ? 0 : outline->contours[outline->n_contours - 2] + 1;
+
+    /* We must not include the last point in the path if it */
+    /* is located on the first point.                       */
+    if ( outline->n_points > 1 )
+    {
+      FT_Vector*  p1      = outline->points + first;
+      FT_Vector*  p2      = outline->points + outline->n_points - 1;
+      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;
+
+
+      /* `delete' last point only if it coincides with the first    */
+      /* point and if it is not a control point (which can happen). */
+      if ( p1->x == p2->x && p1->y == p2->y )
+        if ( *control == FT_CURVE_TAG_ON )
+          outline->n_points--;
+    }
+
+    if ( outline->n_contours > 0 )
+    {
+      /* Don't add contours only consisting of one point, i.e., */
+      /* check whether begin point and last point are the same. */
+      if ( first == outline->n_points - 1 )
+      {
+        outline->n_contours--;
+        outline->n_points--;
+      }
+      else
+        outline->contours[outline->n_contours - 1] =
+          (short)( outline->n_points - 1 );
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Int )
+  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,
+                                   FT_Int    charcode )
+  {
+    FT_UInt    n;
+    FT_UShort  glyph_sid;
+
+
+    /* CID-keyed fonts don't have glyph names */
+    if ( !cff->charset.sids )
+      return -1;
+
+    /* check range of standard char code */
+    if ( charcode < 0 || charcode > 255 )
+      return -1;
+
+    /* Get code to SID mapping from `cff_standard_encoding'. */
+    glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode );
+
+    for ( n = 0; n < cff->num_glyphs; n++ )
+    {
+      if ( cff->charset.sids[n] == glyph_sid )
+        return n;
+    }
+
+    return -1;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_get_glyph_data( TT_Face    face,
+                      FT_UInt    glyph_index,
+                      FT_Byte**  pointer,
+                      FT_ULong*  length )
+  {
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    /* For incremental fonts get the character data using the */
+    /* callback function.                                     */
+    if ( face->root.internal->incremental_interface )
+    {
+      FT_Data   data;
+      FT_Error  error =
+                  face->root.internal->incremental_interface->funcs->get_glyph_data(
+                    face->root.internal->incremental_interface->object,
+                    glyph_index, &data );
+
+
+      *pointer = (FT_Byte*)data.pointer;
+      *length = data.length;
+
+      return error;
+    }
+    else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    {
+      CFF_Font  cff  = (CFF_Font)(face->extra.data);
+
+
+      return cff_index_access_element( &cff->charstrings_index, glyph_index,
+                                       pointer, length );
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_free_glyph_data( TT_Face    face,
+                       FT_Byte**  pointer,
+                       FT_ULong   length )
+  {
+#ifndef FT_CONFIG_OPTION_INCREMENTAL
+    FT_UNUSED( length );
+#endif
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    /* For incremental fonts get the character data using the */
+    /* callback function.                                     */
+    if ( face->root.internal->incremental_interface )
+    {
+      FT_Data data;
+
+
+      data.pointer = *pointer;
+      data.length  = length;
+
+      face->root.internal->incremental_interface->funcs->free_glyph_data(
+        face->root.internal->incremental_interface->object, &data );
+    }
+    else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    {
+      CFF_Font  cff = (CFF_Font)(face->extra.data);
+
+
+      cff_index_forget_element( &cff->charstrings_index, pointer );
+    }
+  }
+
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+
+  static FT_Error
+  cff_operator_seac( CFF_Decoder*  decoder,
+                     FT_Pos        asb,
+                     FT_Pos        adx,
+                     FT_Pos        ady,
+                     FT_Int        bchar,
+                     FT_Int        achar )
+  {
+    FT_Error      error;
+    CFF_Builder*  builder = &decoder->builder;
+    FT_Int        bchar_index, achar_index;
+    TT_Face       face = decoder->builder.face;
+    FT_Vector     left_bearing, advance;
+    FT_Byte*      charstring;
+    FT_ULong      charstring_len;
+    FT_Pos        glyph_width;
+
+
+    if ( decoder->seac )
+    {
+      FT_ERROR(( "cff_operator_seac: invalid nested seac\n" ));
+      return FT_THROW( Syntax_Error );
+    }
+
+    adx += decoder->builder.left_bearing.x;
+    ady += decoder->builder.left_bearing.y;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    /* Incremental fonts don't necessarily have valid charsets.        */
+    /* They use the character code, not the glyph index, in this case. */
+    if ( face->root.internal->incremental_interface )
+    {
+      bchar_index = bchar;
+      achar_index = achar;
+    }
+    else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+    {
+      CFF_Font cff = (CFF_Font)(face->extra.data);
+
+
+      bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );
+      achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );
+    }
+
+    if ( bchar_index < 0 || achar_index < 0 )
+    {
+      FT_ERROR(( "cff_operator_seac:"
+                 " invalid seac character code arguments\n" ));
+      return FT_THROW( Syntax_Error );
+    }
+
+    /* If we are trying to load a composite glyph, do not load the */
+    /* accent character and return the array of subglyphs.         */
+    if ( builder->no_recurse )
+    {
+      FT_GlyphSlot    glyph  = (FT_GlyphSlot)builder->glyph;
+      FT_GlyphLoader  loader = glyph->internal->loader;
+      FT_SubGlyph     subg;
+
+
+      /* reallocate subglyph array if necessary */
+      error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
+      if ( error )
+        goto Exit;
+
+      subg = loader->current.subglyphs;
+
+      /* subglyph 0 = base character */
+      subg->index = bchar_index;
+      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
+                    FT_SUBGLYPH_FLAG_USE_MY_METRICS;
+      subg->arg1  = 0;
+      subg->arg2  = 0;
+      subg++;
+
+      /* subglyph 1 = accent character */
+      subg->index = achar_index;
+      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
+      subg->arg1  = (FT_Int)( adx >> 16 );
+      subg->arg2  = (FT_Int)( ady >> 16 );
+
+      /* set up remaining glyph fields */
+      glyph->num_subglyphs = 2;
+      glyph->subglyphs     = loader->base.subglyphs;
+      glyph->format        = FT_GLYPH_FORMAT_COMPOSITE;
+
+      loader->current.num_subglyphs = 2;
+    }
+
+    FT_GlyphLoader_Prepare( builder->loader );
+
+    /* First load `bchar' in builder */
+    error = cff_get_glyph_data( face, bchar_index,
+                                &charstring, &charstring_len );
+    if ( !error )
+    {
+      /* the seac operator must not be nested */
+      decoder->seac = TRUE;
+      error = cff_decoder_parse_charstrings( decoder, charstring,
+                                             charstring_len );
+      decoder->seac = FALSE;
+
+      cff_free_glyph_data( face, &charstring, charstring_len );
+
+      if ( error )
+        goto Exit;
+    }
+
+    /* Save the left bearing, advance and glyph width of the base */
+    /* character as they will be erased by the next load.         */
+
+    left_bearing = builder->left_bearing;
+    advance      = builder->advance;
+    glyph_width  = decoder->glyph_width;
+
+    builder->left_bearing.x = 0;
+    builder->left_bearing.y = 0;
+
+    builder->pos_x = adx - asb;
+    builder->pos_y = ady;
+
+    /* Now load `achar' on top of the base outline. */
+    error = cff_get_glyph_data( face, achar_index,
+                                &charstring, &charstring_len );
+    if ( !error )
+    {
+      /* the seac operator must not be nested */
+      decoder->seac = TRUE;
+      error = cff_decoder_parse_charstrings( decoder, charstring,
+                                             charstring_len );
+      decoder->seac = FALSE;
+
+      cff_free_glyph_data( face, &charstring, charstring_len );
+
+      if ( error )
+        goto Exit;
+    }
+
+    /* Restore the left side bearing, advance and glyph width */
+    /* of the base character.                                 */
+    builder->left_bearing = left_bearing;
+    builder->advance      = advance;
+    decoder->glyph_width  = glyph_width;
+
+    builder->pos_x = 0;
+    builder->pos_y = 0;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_decoder_parse_charstrings                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parses a given Type 2 charstrings program.                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    decoder         :: The current Type 1 decoder.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    charstring_base :: The base of the charstring stream.              */
+  /*                                                                       */
+  /*    charstring_len  :: The length in bytes of the charstring stream.   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
+                                 FT_Byte*      charstring_base,
+                                 FT_ULong      charstring_len )
+  {
+    FT_Error           error;
+    CFF_Decoder_Zone*  zone;
+    FT_Byte*           ip;
+    FT_Byte*           limit;
+    CFF_Builder*       builder = &decoder->builder;
+    FT_Pos             x, y;
+    FT_Fixed           seed;
+    FT_Fixed*          stack;
+    FT_Int             charstring_type =
+                         decoder->cff->top_font.font_dict.charstring_type;
+
+    T2_Hints_Funcs     hinter;
+
+
+    /* set default width */
+    decoder->num_hints  = 0;
+    decoder->read_width = 1;
+
+    /* compute random seed from stack address of parameter */
+    seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed              ^
+                         (FT_PtrDist)(char*)&decoder           ^
+                         (FT_PtrDist)(char*)&charstring_base ) &
+                         FT_ULONG_MAX ) ;
+    seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;
+    if ( seed == 0 )
+      seed = 0x7384;
+
+    /* initialize the decoder */
+    decoder->top  = decoder->stack;
+    decoder->zone = decoder->zones;
+    zone          = decoder->zones;
+    stack         = decoder->top;
+
+    hinter = (T2_Hints_Funcs)builder->hints_funcs;
+
+    builder->path_begun = 0;
+
+    zone->base           = charstring_base;
+    limit = zone->limit  = charstring_base + charstring_len;
+    ip    = zone->cursor = zone->base;
+
+    error = FT_Err_Ok;
+
+    x = builder->pos_x;
+    y = builder->pos_y;
+
+    /* begin hints recording session, if any */
+    if ( hinter )
+      hinter->open( hinter->hints );
+
+    /* now execute loop */
+    while ( ip < limit )
+    {
+      CFF_Operator  op;
+      FT_Byte       v;
+
+
+      /********************************************************************/
+      /*                                                                  */
+      /* Decode operator or operand                                       */
+      /*                                                                  */
+      v = *ip++;
+      if ( v >= 32 || v == 28 )
+      {
+        FT_Int    shift = 16;
+        FT_Int32  val;
+
+
+        /* this is an operand, push it on the stack */
+
+        /* if we use shifts, all computations are done with unsigned */
+        /* values; the conversion to a signed value is the last step */
+        if ( v == 28 )
+        {
+          if ( ip + 1 >= limit )
+            goto Syntax_Error;
+          val = (FT_Short)( ( (FT_UShort)ip[0] << 8 ) | ip[1] );
+          ip += 2;
+        }
+        else if ( v < 247 )
+          val = (FT_Int32)v - 139;
+        else if ( v < 251 )
+        {
+          if ( ip >= limit )
+            goto Syntax_Error;
+          val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108;
+        }
+        else if ( v < 255 )
+        {
+          if ( ip >= limit )
+            goto Syntax_Error;
+          val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108;
+        }
+        else
+        {
+          if ( ip + 3 >= limit )
+            goto Syntax_Error;
+          val = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |
+                            ( (FT_UInt32)ip[1] << 16 ) |
+                            ( (FT_UInt32)ip[2] <<  8 ) |
+                              (FT_UInt32)ip[3]         );
+          ip    += 4;
+          if ( charstring_type == 2 )
+            shift = 0;
+        }
+        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
+          goto Stack_Overflow;
+
+        val             = (FT_Int32)( (FT_UInt32)val << shift );
+        *decoder->top++ = val;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        if ( !( val & 0xFFFFL ) )
+          FT_TRACE4(( " %hd", (FT_Short)( (FT_UInt32)val >> 16 ) ));
+        else
+          FT_TRACE4(( " %.2f", val / 65536.0 ));
+#endif
+
+      }
+      else
+      {
+        /* The specification says that normally arguments are to be taken */
+        /* from the bottom of the stack.  However, this seems not to be   */
+        /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */
+        /* arguments similar to a PS interpreter.                         */
+
+        FT_Fixed*  args     = decoder->top;
+        FT_Int     num_args = (FT_Int)( args - decoder->stack );
+        FT_Int     req_args;
+
+
+        /* find operator */
+        op = cff_op_unknown;
+
+        switch ( v )
+        {
+        case 1:
+          op = cff_op_hstem;
+          break;
+        case 3:
+          op = cff_op_vstem;
+          break;
+        case 4:
+          op = cff_op_vmoveto;
+          break;
+        case 5:
+          op = cff_op_rlineto;
+          break;
+        case 6:
+          op = cff_op_hlineto;
+          break;
+        case 7:
+          op = cff_op_vlineto;
+          break;
+        case 8:
+          op = cff_op_rrcurveto;
+          break;
+        case 9:
+          op = cff_op_closepath;
+          break;
+        case 10:
+          op = cff_op_callsubr;
+          break;
+        case 11:
+          op = cff_op_return;
+          break;
+        case 12:
+          {
+            if ( ip >= limit )
+              goto Syntax_Error;
+            v = *ip++;
+
+            switch ( v )
+            {
+            case 0:
+              op = cff_op_dotsection;
+              break;
+            case 1: /* this is actually the Type1 vstem3 operator */
+              op = cff_op_vstem;
+              break;
+            case 2: /* this is actually the Type1 hstem3 operator */
+              op = cff_op_hstem;
+              break;
+            case 3:
+              op = cff_op_and;
+              break;
+            case 4:
+              op = cff_op_or;
+              break;
+            case 5:
+              op = cff_op_not;
+              break;
+            case 6:
+              op = cff_op_seac;
+              break;
+            case 7:
+              op = cff_op_sbw;
+              break;
+            case 8:
+              op = cff_op_store;
+              break;
+            case 9:
+              op = cff_op_abs;
+              break;
+            case 10:
+              op = cff_op_add;
+              break;
+            case 11:
+              op = cff_op_sub;
+              break;
+            case 12:
+              op = cff_op_div;
+              break;
+            case 13:
+              op = cff_op_load;
+              break;
+            case 14:
+              op = cff_op_neg;
+              break;
+            case 15:
+              op = cff_op_eq;
+              break;
+            case 16:
+              op = cff_op_callothersubr;
+              break;
+            case 17:
+              op = cff_op_pop;
+              break;
+            case 18:
+              op = cff_op_drop;
+              break;
+            case 20:
+              op = cff_op_put;
+              break;
+            case 21:
+              op = cff_op_get;
+              break;
+            case 22:
+              op = cff_op_ifelse;
+              break;
+            case 23:
+              op = cff_op_random;
+              break;
+            case 24:
+              op = cff_op_mul;
+              break;
+            case 26:
+              op = cff_op_sqrt;
+              break;
+            case 27:
+              op = cff_op_dup;
+              break;
+            case 28:
+              op = cff_op_exch;
+              break;
+            case 29:
+              op = cff_op_index;
+              break;
+            case 30:
+              op = cff_op_roll;
+              break;
+            case 33:
+              op = cff_op_setcurrentpoint;
+              break;
+            case 34:
+              op = cff_op_hflex;
+              break;
+            case 35:
+              op = cff_op_flex;
+              break;
+            case 36:
+              op = cff_op_hflex1;
+              break;
+            case 37:
+              op = cff_op_flex1;
+              break;
+            /*default: */  /* XYQ 2007-9-6: we can't just quit if we see some reserved op */
+              /* decrement ip for syntax error message */
+             /* ip--;*/
+            }
+          }
+          break;
+        case 13:
+          op = cff_op_hsbw;
+          break;
+        case 14:
+          op = cff_op_endchar;
+          break;
+        case 16:
+          op = cff_op_blend;
+          break;
+        case 18:
+          op = cff_op_hstemhm;
+          break;
+        case 19:
+          op = cff_op_hintmask;
+          break;
+        case 20:
+          op = cff_op_cntrmask;
+          break;
+        case 21:
+          op = cff_op_rmoveto;
+          break;
+        case 22:
+          op = cff_op_hmoveto;
+          break;
+        case 23:
+          op = cff_op_vstemhm;
+          break;
+        case 24:
+          op = cff_op_rcurveline;
+          break;
+        case 25:
+          op = cff_op_rlinecurve;
+          break;
+        case 26:
+          op = cff_op_vvcurveto;
+          break;
+        case 27:
+          op = cff_op_hhcurveto;
+          break;
+        case 29:
+          op = cff_op_callgsubr;
+          break;
+        case 30:
+          op = cff_op_vhcurveto;
+          break;
+        case 31:
+          op = cff_op_hvcurveto;
+          break;
+        default:
+          FT_TRACE4(( " unknown op (%d)\n", v ));
+          break;
+        }
+
+        if ( op == cff_op_unknown )
+          continue;
+
+        /* check arguments */
+        req_args = cff_argument_counts[op];
+        if ( req_args & CFF_COUNT_CHECK_WIDTH )
+        {
+          if ( num_args > 0 && decoder->read_width )
+          {
+            /* If `nominal_width' is non-zero, the number is really a      */
+            /* difference against `nominal_width'.  Else, the number here  */
+            /* is truly a width, not a difference against `nominal_width'. */
+            /* If the font does not set `nominal_width', then              */
+            /* `nominal_width' defaults to zero, and so we can set         */
+            /* `glyph_width' to `nominal_width' plus number on the stack   */
+            /* -- for either case.                                         */
+
+            FT_Int  set_width_ok;
+
+
+            switch ( op )
+            {
+            case cff_op_hmoveto:
+            case cff_op_vmoveto:
+              set_width_ok = num_args & 2;
+              break;
+
+            case cff_op_hstem:
+            case cff_op_vstem:
+            case cff_op_hstemhm:
+            case cff_op_vstemhm:
+            case cff_op_rmoveto:
+            case cff_op_hintmask:
+            case cff_op_cntrmask:
+              set_width_ok = num_args & 1;
+              break;
+
+            case cff_op_endchar:
+              /* If there is a width specified for endchar, we either have */
+              /* 1 argument or 5 arguments.  We like to argue.             */
+              set_width_ok = ( num_args == 5 ) || ( num_args == 1 );
+              break;
+
+            default:
+              set_width_ok = 0;
+              break;
+            }
+
+            if ( set_width_ok )
+            {
+              decoder->glyph_width = decoder->nominal_width +
+                                       ( stack[0] >> 16 );
+
+              if ( decoder->width_only )
+              {
+                /* we only want the advance width; stop here */
+                break;
+              }
+
+              /* Consumed an argument. */
+              num_args--;
+            }
+          }
+
+          decoder->read_width = 0;
+          req_args            = 0;
+        }
+
+        req_args &= 0x000F;
+        if ( num_args < req_args )
+          goto Stack_Underflow;
+        args     -= req_args;
+        num_args -= req_args;
+
+		/* Sunliang.Liu sync 221's revison. */
+		if (args > decoder->stack + CFF_MAX_OPERANDS)
+			goto Stack_Overflow;
+
+        /* At this point, `args' points to the first argument of the  */
+        /* operand in case `req_args' isn't zero.  Otherwise, we have */
+        /* to adjust `args' manually.                                 */
+
+        /* Note that we only pop arguments from the stack which we    */
+        /* really need and can digest so that we can continue in case */
+        /* of superfluous stack elements.                             */
+
+        switch ( op )
+        {
+        case cff_op_hstem:
+        case cff_op_vstem:
+        case cff_op_hstemhm:
+        case cff_op_vstemhm:
+          /* the number of arguments is always even here */
+          FT_TRACE4((
+              op == cff_op_hstem   ? " hstem\n"   :
+            ( op == cff_op_vstem   ? " vstem\n"   :
+            ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) ));
+
+          if ( hinter )
+            hinter->stems( hinter->hints,
+                           ( op == cff_op_hstem || op == cff_op_hstemhm ),
+                           num_args / 2,
+                           args - ( num_args & ~1 ) );
+
+          decoder->num_hints += num_args / 2;
+          args = stack;
+          break;
+
+        case cff_op_hintmask:
+        case cff_op_cntrmask:
+          FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" ));
+
+          /* implement vstem when needed --                        */
+          /* the specification doesn't say it, but this also works */
+          /* with the 'cntrmask' operator                          */
+          /*                                                       */
+          if ( num_args > 0 )
+          {
+            if ( hinter )
+              hinter->stems( hinter->hints,
+                             0,
+                             num_args / 2,
+                             args - ( num_args & ~1 ) );
+
+            decoder->num_hints += num_args / 2;
+          }
+
+          /* In a valid charstring there must be at least one byte */
+          /* after `hintmask' or `cntrmask' (e.g., for a `return'  */
+          /* instruction).  Additionally, there must be space for  */
+          /* `num_hints' bits.                                     */
+
+          if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit )
+            goto Syntax_Error;
+
+          if ( hinter )
+          {
+            if ( op == cff_op_hintmask )
+              hinter->hintmask( hinter->hints,
+                                builder->current->n_points,
+                                decoder->num_hints,
+                                ip );
+            else
+              hinter->counter( hinter->hints,
+                               decoder->num_hints,
+                               ip );
+          }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+          {
+            FT_UInt maskbyte;
+
+
+            FT_TRACE4(( " (maskbytes:" ));
+
+            for ( maskbyte = 0;
+                  maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 );
+                  maskbyte++, ip++ )
+              FT_TRACE4(( " 0x%02X", *ip ));
+
+            FT_TRACE4(( ")\n" ));
+          }
+#else
+          ip += ( decoder->num_hints + 7 ) >> 3;
+#endif
+          args = stack;
+          break;
+
+        case cff_op_rmoveto:
+          FT_TRACE4(( " rmoveto\n" ));
+
+          cff_builder_close_contour( builder );
+          builder->path_begun = 0;
+          x   += args[-2];
+          y   += args[-1];
+          args = stack;
+          break;
+
+        case cff_op_vmoveto:
+          FT_TRACE4(( " vmoveto\n" ));
+
+          cff_builder_close_contour( builder );
+          builder->path_begun = 0;
+          y   += args[-1];
+          args = stack;
+          break;
+
+        case cff_op_hmoveto:
+          FT_TRACE4(( " hmoveto\n" ));
+
+          cff_builder_close_contour( builder );
+          builder->path_begun = 0;
+          x   += args[-1];
+          args = stack;
+          break;
+
+        case cff_op_rlineto:
+          FT_TRACE4(( " rlineto\n" ));
+
+          if ( cff_builder_start_point( builder, x, y )  ||
+               cff_check_points( builder, num_args / 2 ) )
+            goto Fail;
+
+          if ( num_args < 2 )
+            goto Stack_Underflow;
+
+          args -= num_args & ~1;
+          while ( args < decoder->top )
+          {
+            x += args[0];
+            y += args[1];
+            cff_builder_add_point( builder, x, y, 1 );
+            args += 2;
+          }
+          args = stack;
+          break;
+
+        case cff_op_hlineto:
+        case cff_op_vlineto:
+          {
+            FT_Int  phase = ( op == cff_op_hlineto );
+
+
+            FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n"
+                                             : " vlineto\n" ));
+
+            if ( num_args < 0 )
+              goto Stack_Underflow;
+
+            /* there exist subsetted fonts (found in PDFs) */
+            /* which call `hlineto' without arguments      */
+            if ( num_args == 0 )
+              break;
+
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 cff_check_points( builder, num_args )    )
+              goto Fail;
+
+            args = stack;
+            while ( args < decoder->top )
+            {
+              if ( phase )
+                x += args[0];
+              else
+                y += args[0];
+
+              if ( cff_builder_add_point1( builder, x, y ) )
+                goto Fail;
+
+              args++;
+              phase ^= 1;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_rrcurveto:
+          {
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " rrcurveto\n" ));
+
+            if ( num_args < 6 )
+              goto Stack_Underflow;
+
+            nargs = num_args - num_args % 6;
+
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 cff_check_points( builder, nargs / 2 )   )
+              goto Fail;
+
+            args -= nargs;
+            while ( args < decoder->top )
+            {
+              x += args[0];
+              y += args[1];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[2];
+              y += args[3];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[4];
+              y += args[5];
+              cff_builder_add_point( builder, x, y, 1 );
+              args += 6;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_vvcurveto:
+          {
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " vvcurveto\n" ));
+
+            if ( num_args < 4 )
+              goto Stack_Underflow;
+
+            /* if num_args isn't of the form 4n or 4n+1, */
+            /* we enforce it by clearing the second bit  */
+
+            nargs = num_args & ~2;
+
+            if ( cff_builder_start_point( builder, x, y ) )
+              goto Fail;
+
+            args -= nargs;
+
+            if ( nargs & 1 )
+            {
+              x += args[0];
+              args++;
+              nargs--;
+            }
+
+            if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
+              goto Fail;
+
+            while ( args < decoder->top )
+            {
+              y += args[0];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[1];
+              y += args[2];
+              cff_builder_add_point( builder, x, y, 0 );
+              y += args[3];
+              cff_builder_add_point( builder, x, y, 1 );
+              args += 4;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_hhcurveto:
+          {
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " hhcurveto\n" ));
+
+            if ( num_args < 4 )
+              goto Stack_Underflow;
+
+            /* if num_args isn't of the form 4n or 4n+1, */
+            /* we enforce it by clearing the second bit  */
+
+            nargs = num_args & ~2;
+
+            if ( cff_builder_start_point( builder, x, y ) )
+              goto Fail;
+
+            args -= nargs;
+            if ( nargs & 1 )
+            {
+              y += args[0];
+              args++;
+              nargs--;
+            }
+
+            if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
+              goto Fail;
+
+            while ( args < decoder->top )
+            {
+              x += args[0];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[1];
+              y += args[2];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[3];
+              cff_builder_add_point( builder, x, y, 1 );
+              args += 4;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_vhcurveto:
+        case cff_op_hvcurveto:
+          {
+            FT_Int  phase;
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n"
+                                               : " hvcurveto\n" ));
+
+            if ( cff_builder_start_point( builder, x, y ) )
+              goto Fail;
+
+            if ( num_args < 4 )
+              goto Stack_Underflow;
+
+            /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */
+            /* we enforce it by clearing the second bit               */
+
+            nargs = num_args & ~2;
+
+            args -= nargs;
+            if ( cff_check_points( builder, ( nargs / 4 ) * 3 ) )
+              goto Stack_Underflow;
+
+            phase = ( op == cff_op_hvcurveto );
+
+            while ( nargs >= 4 )
+            {
+              nargs -= 4;
+              if ( phase )
+              {
+                x += args[0];
+                cff_builder_add_point( builder, x, y, 0 );
+                x += args[1];
+                y += args[2];
+                cff_builder_add_point( builder, x, y, 0 );
+                y += args[3];
+                if ( nargs == 1 )
+                  x += args[4];
+                cff_builder_add_point( builder, x, y, 1 );
+              }
+              else
+              {
+                y += args[0];
+                cff_builder_add_point( builder, x, y, 0 );
+                x += args[1];
+                y += args[2];
+                cff_builder_add_point( builder, x, y, 0 );
+                x += args[3];
+                if ( nargs == 1 )
+                  y += args[4];
+                cff_builder_add_point( builder, x, y, 1 );
+              }
+              args  += 4;
+              phase ^= 1;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_rlinecurve:
+          {
+            FT_Int  num_lines;
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " rlinecurve\n" ));
+
+            if ( num_args < 8 )
+              goto Stack_Underflow;
+
+            nargs     = num_args & ~1;
+            num_lines = ( nargs - 6 ) / 2;
+
+            if ( cff_builder_start_point( builder, x, y )   ||
+                 cff_check_points( builder, num_lines + 3 ) )
+              goto Fail;
+
+            args -= nargs;
+
+            /* first, add the line segments */
+            while ( num_lines > 0 )
+            {
+              x += args[0];
+              y += args[1];
+              cff_builder_add_point( builder, x, y, 1 );
+              args += 2;
+              num_lines--;
+            }
+
+            /* then the curve */
+            x += args[0];
+            y += args[1];
+            cff_builder_add_point( builder, x, y, 0 );
+            x += args[2];
+            y += args[3];
+            cff_builder_add_point( builder, x, y, 0 );
+            x += args[4];
+            y += args[5];
+            cff_builder_add_point( builder, x, y, 1 );
+            args = stack;
+          }
+          break;
+
+        case cff_op_rcurveline:
+          {
+            FT_Int  num_curves;
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " rcurveline\n" ));
+
+            if ( num_args < 8 )
+              goto Stack_Underflow;
+
+            nargs      = num_args - 2;
+            nargs      = nargs - nargs % 6 + 2;
+            num_curves = ( nargs - 2 ) / 6;
+
+            if ( cff_builder_start_point( builder, x, y )        ||
+                 cff_check_points( builder, num_curves * 3 + 2 ) )
+              goto Fail;
+
+            args -= nargs;
+
+            /* first, add the curves */
+            while ( num_curves > 0 )
+            {
+              x += args[0];
+              y += args[1];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[2];
+              y += args[3];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[4];
+              y += args[5];
+              cff_builder_add_point( builder, x, y, 1 );
+              args += 6;
+              num_curves--;
+            }
+
+            /* then the final line */
+            x += args[0];
+            y += args[1];
+            cff_builder_add_point( builder, x, y, 1 );
+            args = stack;
+          }
+          break;
+
+        case cff_op_hflex1:
+          {
+            FT_Pos start_y;
+
+
+            FT_TRACE4(( " hflex1\n" ));
+
+            /* adding five more points: 4 control points, 1 on-curve point */
+            /* -- make sure we have enough space for the start point if it */
+            /* needs to be added                                           */
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 cff_check_points( builder, 6 )           )
+              goto Fail;
+
+            /* record the starting point's y position for later use */
+            start_y = y;
+
+            /* first control point */
+            x += args[0];
+            y += args[1];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* second control point */
+            x += args[2];
+            y += args[3];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* join point; on curve, with y-value the same as the last */
+            /* control point's y-value                                 */
+            x += args[4];
+            cff_builder_add_point( builder, x, y, 1 );
+
+            /* third control point, with y-value the same as the join */
+            /* point's y-value                                        */
+            x += args[5];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* fourth control point */
+            x += args[6];
+            y += args[7];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* ending point, with y-value the same as the start   */
+            x += args[8];
+            y  = start_y;
+            cff_builder_add_point( builder, x, y, 1 );
+
+            args = stack;
+            break;
+          }
+
+        case cff_op_hflex:
+          {
+            FT_Pos start_y;
+
+
+            FT_TRACE4(( " hflex\n" ));
+
+            /* adding six more points; 4 control points, 2 on-curve points */
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 cff_check_points( builder, 6 )           )
+              goto Fail;
+
+            /* record the starting point's y-position for later use */
+            start_y = y;
+
+            /* first control point */
+            x += args[0];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* second control point */
+            x += args[1];
+            y += args[2];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* join point; on curve, with y-value the same as the last */
+            /* control point's y-value                                 */
+            x += args[3];
+            cff_builder_add_point( builder, x, y, 1 );
+
+            /* third control point, with y-value the same as the join */
+            /* point's y-value                                        */
+            x += args[4];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* fourth control point */
+            x += args[5];
+            y  = start_y;
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* ending point, with y-value the same as the start point's */
+            /* y-value -- we don't add this point, though               */
+            x += args[6];
+            cff_builder_add_point( builder, x, y, 1 );
+
+            args = stack;
+            break;
+          }
+
+        case cff_op_flex1:
+          {
+            FT_Pos     start_x, start_y; /* record start x, y values for */
+                                         /* alter use                    */
+            FT_Fixed   dx = 0, dy = 0;   /* used in horizontal/vertical  */
+                                         /* algorithm below              */
+            FT_Int     horizontal, count;
+            FT_Fixed*  temp;
+
+
+            FT_TRACE4(( " flex1\n" ));
+
+            /* adding six more points; 4 control points, 2 on-curve points */
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 cff_check_points( builder, 6 )           )
+              goto Fail;
+
+            /* record the starting point's x, y position for later use */
+            start_x = x;
+            start_y = y;
+
+            /* XXX: figure out whether this is supposed to be a horizontal */
+            /*      or vertical flex; the Type 2 specification is vague... */
+
+            temp = args;
+
+            /* grab up to the last argument */
+            for ( count = 5; count > 0; count-- )
+            {
+              dx += temp[0];
+              dy += temp[1];
+              temp += 2;
+            }
+
+            if ( dx < 0 )
+              dx = -dx;
+            if ( dy < 0 )
+              dy = -dy;
+
+            /* strange test, but here it is... */
+            horizontal = ( dx > dy );
+
+            for ( count = 5; count > 0; count-- )
+            {
+              x += args[0];
+              y += args[1];
+              cff_builder_add_point( builder, x, y,
+                                     (FT_Bool)( count == 3 ) );
+              args += 2;
+            }
+
+            /* is last operand an x- or y-delta? */
+            if ( horizontal )
+            {
+              x += args[0];
+              y  = start_y;
+            }
+            else
+            {
+              x  = start_x;
+              y += args[0];
+            }
+
+            cff_builder_add_point( builder, x, y, 1 );
+
+            args = stack;
+            break;
+           }
+
+        case cff_op_flex:
+          {
+            FT_UInt  count;
+
+
+            FT_TRACE4(( " flex\n" ));
+
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 cff_check_points( builder, 6 )           )
+              goto Fail;
+
+            for ( count = 6; count > 0; count-- )
+            {
+              x += args[0];
+              y += args[1];
+              cff_builder_add_point( builder, x, y,
+                                     (FT_Bool)( count == 4 || count == 1 ) );
+              args += 2;
+            }
+
+            args = stack;
+          }
+          break;
+
+        case cff_op_seac:
+            FT_TRACE4(( " seac\n" ));
+
+            error = cff_operator_seac( decoder,
+                                       args[0], args[1], args[2],
+                                       (FT_Int)( args[3] >> 16 ),
+                                       (FT_Int)( args[4] >> 16 ) );
+
+            /* add current outline to the glyph slot */
+            FT_GlyphLoader_Add( builder->loader );
+
+            /* return now! */
+            FT_TRACE4(( "\n" ));
+            return error;
+
+        case cff_op_endchar:
+          FT_TRACE4(( " endchar\n" ));
+
+          /* We are going to emulate the seac operator. */
+          if ( num_args >= 4 )
+          {
+            /* Save glyph width so that the subglyphs don't overwrite it. */
+            FT_Pos  glyph_width = decoder->glyph_width;
+
+
+            error = cff_operator_seac( decoder,
+                                       0L, args[-4], args[-3],
+                                       (FT_Int)( args[-2] >> 16 ),
+                                       (FT_Int)( args[-1] >> 16 ) );
+
+            decoder->glyph_width = glyph_width;
+          }
+          else
+          {
+            if ( !error )
+              error = FT_Err_Ok;
+
+            cff_builder_close_contour( builder );
+
+            /* close hints recording session */
+            if ( hinter )
+            {
+              if ( hinter->close( hinter->hints,
+                                  builder->current->n_points ) )
+                goto Syntax_Error;
+
+              /* apply hints to the loaded glyph outline now */
+              hinter->apply( hinter->hints,
+                             builder->current,
+                             (PSH_Globals)builder->hints_globals,
+                             decoder->hint_mode );
+            }
+
+            /* add current outline to the glyph slot */
+            FT_GlyphLoader_Add( builder->loader );
+          }
+
+          /* return now! */
+          FT_TRACE4(( "\n" ));
+          return error;
+
+        case cff_op_abs:
+          FT_TRACE4(( " abs\n" ));
+
+          if ( args[0] < 0 )
+            args[0] = -args[0];
+          args++;
+          break;
+
+        case cff_op_add:
+          FT_TRACE4(( " add\n" ));
+
+          args[0] += args[1];
+          args++;
+          break;
+
+        case cff_op_sub:
+          FT_TRACE4(( " sub\n" ));
+
+          args[0] -= args[1];
+          args++;
+          break;
+
+        case cff_op_div:
+          FT_TRACE4(( " div\n" ));
+
+          args[0] = FT_DivFix( args[0], args[1] );
+          args++;
+          break;
+
+        case cff_op_neg:
+          FT_TRACE4(( " neg\n" ));
+
+          args[0] = -args[0];
+          args++;
+          break;
+
+        case cff_op_random:
+          {
+            FT_Fixed  Rand;
+
+
+            FT_TRACE4(( " rand\n" ));
+
+            Rand = seed;
+            if ( Rand >= 0x8000L )
+              Rand++;
+
+            args[0] = Rand;
+            seed    = FT_MulFix( seed, 0x10000L - seed );
+            if ( seed == 0 )
+              seed += 0x2873;
+            args++;
+          }
+          break;
+
+        case cff_op_mul:
+          FT_TRACE4(( " mul\n" ));
+
+          args[0] = FT_MulFix( args[0], args[1] );
+          args++;
+          break;
+
+        case cff_op_sqrt:
+          FT_TRACE4(( " sqrt\n" ));
+
+          if ( args[0] > 0 )
+          {
+            FT_Int    count = 9;
+            FT_Fixed  root  = args[0];
+            FT_Fixed  new_root;
+
+
+            for (;;)
+            {
+              new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1;
+              if ( new_root == root || count <= 0 )
+                break;
+              root = new_root;
+            }
+            args[0] = new_root;
+          }
+          else
+            args[0] = 0;
+          args++;
+          break;
+
+        case cff_op_drop:
+          /* nothing */
+          FT_TRACE4(( " drop\n" ));
+
+          break;
+
+        case cff_op_exch:
+          {
+            FT_Fixed  tmp;
+
+
+            FT_TRACE4(( " exch\n" ));
+
+            tmp     = args[0];
+            args[0] = args[1];
+            args[1] = tmp;
+            args   += 2;
+          }
+          break;
+
+        case cff_op_index:
+          {
+            FT_Int  idx = (FT_Int)( args[0] >> 16 );
+
+
+            FT_TRACE4(( " index\n" ));
+
+            if ( idx < 0 )
+              idx = 0;
+            else if ( idx > num_args - 2 )
+              idx = num_args - 2;
+            args[0] = args[-( idx + 1 )];
+            args++;
+          }
+          break;
+
+        case cff_op_roll:
+          {
+            FT_Int  count = (FT_Int)( args[0] >> 16 );
+            FT_Int  idx   = (FT_Int)( args[1] >> 16 );
+
+
+            FT_TRACE4(( " roll\n" ));
+
+            if ( count <= 0 )
+              count = 1;
+
+            args -= count;
+            if ( args < stack )
+              goto Stack_Underflow;
+
+            if ( idx >= 0 )
+            {
+              while ( idx > 0 )
+              {
+                FT_Fixed  tmp = args[count - 1];
+                FT_Int    i;
+
+
+                for ( i = count - 2; i >= 0; i-- )
+                  args[i + 1] = args[i];
+                args[0] = tmp;
+                idx--;
+              }
+            }
+            else
+            {
+              while ( idx < 0 )
+              {
+                FT_Fixed  tmp = args[0];
+                FT_Int    i;
+
+
+                for ( i = 0; i < count - 1; i++ )
+                  args[i] = args[i + 1];
+                args[count - 1] = tmp;
+                idx++;
+              }
+            }
+            args += count;
+          }
+          break;
+
+        case cff_op_dup:
+          FT_TRACE4(( " dup\n" ));
+
+          args[1] = args[0];
+          args += 2;
+          break;
+
+        case cff_op_put:
+          {
+            FT_Fixed  val = args[0];
+            FT_Int    idx = (FT_Int)( args[1] >> 16 );
+
+
+            FT_TRACE4(( " put\n" ));
+
+            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
+              decoder->buildchar[idx] = val;
+          }
+          break;
+
+        case cff_op_get:
+          {
+            FT_Int    idx = (FT_Int)( args[0] >> 16 );
+            FT_Fixed  val = 0;
+
+
+            FT_TRACE4(( " get\n" ));
+
+            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
+              val = decoder->buildchar[idx];
+
+            args[0] = val;
+            args++;
+          }
+          break;
+
+        case cff_op_store:
+          FT_TRACE4(( " store\n"));
+
+          goto Unimplemented;
+
+        case cff_op_load:
+          FT_TRACE4(( " load\n" ));
+
+          goto Unimplemented;
+
+        case cff_op_dotsection:
+          /* this operator is deprecated and ignored by the parser */
+          FT_TRACE4(( " dotsection\n" ));
+          break;
+
+        case cff_op_closepath:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " closepath (invalid op)\n" ));
+
+          args = stack;
+          break;
+
+        case cff_op_hsbw:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " hsbw (invalid op)\n" ));
+
+          decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 );
+
+          decoder->builder.left_bearing.x = args[0];
+          decoder->builder.left_bearing.y = 0;
+
+          x    = decoder->builder.pos_x + args[0];
+          y    = decoder->builder.pos_y;
+          args = stack;
+          break;
+
+        case cff_op_sbw:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " sbw (invalid op)\n" ));
+
+          decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 );
+
+          decoder->builder.left_bearing.x = args[0];
+          decoder->builder.left_bearing.y = args[1];
+
+          x    = decoder->builder.pos_x + args[0];
+          y    = decoder->builder.pos_y + args[1];
+          args = stack;
+          break;
+
+        case cff_op_setcurrentpoint:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " setcurrentpoint (invalid op)\n" ));
+
+          x    = decoder->builder.pos_x + args[0];
+          y    = decoder->builder.pos_y + args[1];
+          args = stack;
+          break;
+
+        case cff_op_callothersubr:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " callothersubr (invalid op)\n" ));
+
+          /* subsequent `pop' operands should add the arguments,       */
+          /* this is the implementation described for `unknown' other  */
+          /* subroutines in the Type1 spec.                            */
+          /*                                                           */
+          /* XXX Fix return arguments (see discussion below).          */
+          args -= 2 + ( args[-2] >> 16 );
+          if ( args < stack )
+            goto Stack_Underflow;
+          break;
+
+        case cff_op_pop:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " pop (invalid op)\n" ));
+
+          /* XXX Increasing `args' is wrong: After a certain number of */
+          /* `pop's we get a stack overflow.  Reason for doing it is   */
+          /* code like this (actually found in a CFF font):            */
+          /*                                                           */
+          /*   17 1 3 callothersubr                                    */
+          /*   pop                                                     */
+          /*   callsubr                                                */
+          /*                                                           */
+          /* Since we handle `callothersubr' as a no-op, and           */
+          /* `callsubr' needs at least one argument, `pop' can't be a  */
+          /* no-op too as it basically should be.                      */
+          /*                                                           */
+          /* The right solution would be to provide real support for   */
+          /* `callothersubr' as done in `t1decode.c', however, given   */
+          /* the fact that CFF fonts with `pop' are invalid, it is     */
+          /* questionable whether it is worth the time.                */
+          args++;
+          break;
+
+        case cff_op_and:
+          {
+            FT_Fixed  cond = args[0] && args[1];
+
+
+            FT_TRACE4(( " and\n" ));
+
+            args[0] = cond ? 0x10000L : 0;
+            args++;
+          }
+          break;
+
+        case cff_op_or:
+          {
+            FT_Fixed  cond = args[0] || args[1];
+
+
+            FT_TRACE4(( " or\n" ));
+
+            args[0] = cond ? 0x10000L : 0;
+            args++;
+          }
+          break;
+
+        case cff_op_eq:
+          {
+            FT_Fixed  cond = !args[0];
+
+
+            FT_TRACE4(( " eq\n" ));
+
+            args[0] = cond ? 0x10000L : 0;
+            args++;
+          }
+          break;
+
+        case cff_op_ifelse:
+          {
+            FT_Fixed  cond = ( args[2] <= args[3] );
+
+
+            FT_TRACE4(( " ifelse\n" ));
+
+            if ( !cond )
+              args[0] = args[1];
+            args++;
+          }
+          break;
+
+        case cff_op_callsubr:
+          {
+            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +
+                                      decoder->locals_bias );
+
+
+            FT_TRACE4(( " callsubr(%d)\n", idx ));
+
+            if ( idx >= decoder->num_locals )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " invalid local subr index\n" ));
+              goto Syntax_Error;
+            }
+
+            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " too many nested subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            zone->cursor = ip;  /* save current instruction pointer */
+
+            zone++;
+            zone->base   = decoder->locals[idx];
+            zone->limit  = decoder->locals[idx + 1];
+            zone->cursor = zone->base;
+
+            if ( !zone->base || zone->limit == zone->base )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " invoking empty subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            decoder->zone = zone;
+            ip            = zone->base;
+            limit         = zone->limit;
+          }
+          break;
+
+        case cff_op_callgsubr:
+          {
+            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +
+                                      decoder->globals_bias );
+
+
+            FT_TRACE4(( " callgsubr(%d)\n", idx ));
+
+            if ( idx >= decoder->num_globals )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " invalid global subr index\n" ));
+              goto Syntax_Error;
+            }
+
+            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " too many nested subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            zone->cursor = ip;  /* save current instruction pointer */
+
+            zone++;
+            zone->base   = decoder->globals[idx];
+            zone->limit  = decoder->globals[idx + 1];
+            zone->cursor = zone->base;
+
+            if ( !zone->base || zone->limit == zone->base )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " invoking empty subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            decoder->zone = zone;
+            ip            = zone->base;
+            limit         = zone->limit;
+          }
+          break;
+
+        case cff_op_return:
+          FT_TRACE4(( " return\n" ));
+
+          if ( decoder->zone <= decoder->zones )
+          {
+            FT_ERROR(( "cff_decoder_parse_charstrings:"
+                       " unexpected return\n" ));
+            goto Syntax_Error;
+          }
+
+          decoder->zone--;
+          zone  = decoder->zone;
+          ip    = zone->cursor;
+          limit = zone->limit;
+          break;
+
+        default:
+        Unimplemented:
+          FT_ERROR(( "Unimplemented opcode: %d", ip[-1] ));
+
+          if ( ip[-1] == 12 )
+            FT_ERROR(( " %d", ip[0] ));
+          FT_ERROR(( "\n" ));
+
+          return FT_THROW( Unimplemented_Feature );
+        }
+
+        decoder->top = args;
+
+        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
+          goto Stack_Overflow;
+
+      } /* general operator processing */
+
+    } /* while ip < limit */
+
+    FT_TRACE4(( "..end..\n\n" ));
+
+  Fail:
+    return error;
+
+  Syntax_Error:
+    FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" ));
+    return FT_THROW( Invalid_File_Format );
+
+  Stack_Underflow:
+    FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" ));
+    return FT_THROW( Too_Few_Arguments );
+
+  Stack_Overflow:
+    FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" ));
+    return FT_THROW( Stack_Overflow );
+  }
+
+#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /**********                                                      *********/
+  /**********                                                      *********/
+  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/
+  /**********                                                      *********/
+  /**********    The following code is in charge of computing      *********/
+  /**********    the maximum advance width of the font.  It        *********/
+  /**********    quickly processes each glyph charstring to        *********/
+  /**********    extract the value from either a `sbw' or `seac'   *********/
+  /**********    operator.                                         *********/
+  /**********                                                      *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#if 0 /* unused until we support pure CFF fonts */
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_compute_max_advance( TT_Face  face,
+                           FT_Int*  max_advance )
+  {
+    FT_Error     error = FT_Err_Ok;
+    CFF_Decoder  decoder;
+    FT_Int       glyph_index;
+    CFF_Font     cff = (CFF_Font)face->other;
+
+
+    *max_advance = 0;
+
+    /* Initialize load decoder */
+    cff_decoder_init( &decoder, face, 0, 0, 0, 0 );
+
+    decoder.builder.metrics_only = 1;
+    decoder.builder.load_points  = 0;
+
+    /* For each glyph, parse the glyph charstring and extract */
+    /* the advance width.                                     */
+    for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
+          glyph_index++ )
+    {
+      FT_Byte*  charstring;
+      FT_ULong  charstring_len;
+
+
+      /* now get load the unscaled outline */
+      error = cff_get_glyph_data( face, glyph_index,
+                                  &charstring, &charstring_len );
+      if ( !error )
+      {
+        error = cff_decoder_prepare( &decoder, size, glyph_index );
+        if ( !error )
+          error = cff_decoder_parse_charstrings( &decoder,
+                                                 charstring,
+                                                 charstring_len );
+
+        cff_free_glyph_data( face, &charstring, &charstring_len );
+      }
+
+      /* ignore the error if one has occurred -- skip to next glyph */
+      error = FT_Err_Ok;
+    }
+
+    *max_advance = decoder.builder.advance.x;
+
+    return FT_Err_Ok;
+  }
+
+
+#endif /* 0 */
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_slot_load( CFF_GlyphSlot  glyph,
+                 CFF_Size       size,
+                 FT_UInt        glyph_index,
+                 FT_Int32       load_flags )
+  {
+    FT_Error     error;
+    CFF_Decoder  decoder;
+    TT_Face      face = (TT_Face)glyph->root.face;
+    FT_Bool      hinting, scaled, force_scaling;
+    CFF_Font     cff  = (CFF_Font)face->extra.data;
+
+    FT_Matrix    font_matrix;
+    FT_Vector    font_offset;
+
+
+    force_scaling = FALSE;
+
+    /* in a CID-keyed font, consider `glyph_index' as a CID and map */
+    /* it immediately to the real glyph_index -- if it isn't a      */
+    /* subsetted font, glyph_indices and CIDs are identical, though */
+    if ( cff->top_font.font_dict.cid_registry != 0xFFFFU &&
+         cff->charset.cids                               )
+    {
+      /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */
+      if ( glyph_index != 0 )
+      {
+        glyph_index = cff_charset_cid_to_gindex( &cff->charset,
+                                                 glyph_index );
+        if ( glyph_index == 0 )
+          return FT_THROW( Invalid_Argument );
+      }
+    }
+    else if ( glyph_index >= cff->num_glyphs )
+      return FT_THROW( Invalid_Argument );
+
+    if ( load_flags & FT_LOAD_NO_RECURSE )
+      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+    glyph->x_scale = 0x10000L;
+    glyph->y_scale = 0x10000L;
+    if ( size )
+    {
+      glyph->x_scale = size->root.metrics.x_scale;
+      glyph->y_scale = size->root.metrics.y_scale;
+    }
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+    /* try to load embedded bitmap if any              */
+    /*                                                 */
+    /* XXX: The convention should be emphasized in     */
+    /*      the documents because it can be confusing. */
+    if ( size )
+    {
+      CFF_Face      cff_face = (CFF_Face)size->root.face;
+      SFNT_Service  sfnt     = (SFNT_Service)cff_face->sfnt;
+      FT_Stream     stream   = cff_face->root.stream;
+
+
+      if ( size->strike_index != 0xFFFFFFFFUL      &&
+           sfnt->load_eblc                         &&
+           ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+      {
+        TT_SBit_MetricsRec  metrics;
+
+
+        error = sfnt->load_sbit_image( face,
+                                       size->strike_index,
+                                       glyph_index,
+                                       (FT_Int)load_flags,
+                                       stream,
+                                       &glyph->root.bitmap,
+                                       &metrics );
+
+        if ( !error )
+        {
+          FT_Bool    has_vertical_info;
+          FT_UShort  advance;
+          FT_Short   dummy;
+
+
+          glyph->root.outline.n_points   = 0;
+          glyph->root.outline.n_contours = 0;
+
+          glyph->root.metrics.width  = (FT_Pos)metrics.width  << 6;
+          glyph->root.metrics.height = (FT_Pos)metrics.height << 6;
+
+          glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
+          glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
+          glyph->root.metrics.horiAdvance  = (FT_Pos)metrics.horiAdvance  << 6;
+
+          glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
+          glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
+          glyph->root.metrics.vertAdvance  = (FT_Pos)metrics.vertAdvance  << 6;
+
+          glyph->root.format = FT_GLYPH_FORMAT_BITMAP;
+
+          if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+          {
+            glyph->root.bitmap_left = metrics.vertBearingX;
+            glyph->root.bitmap_top  = metrics.vertBearingY;
+          }
+          else
+          {
+            glyph->root.bitmap_left = metrics.horiBearingX;
+            glyph->root.bitmap_top  = metrics.horiBearingY;
+          }
+
+          /* compute linear advance widths */
+
+          ( (SFNT_Service)face->sfnt )->get_metrics( face, 0,
+                                                     glyph_index,
+                                                     &dummy,
+                                                     &advance );
+          glyph->root.linearHoriAdvance = advance;
+
+          has_vertical_info = FT_BOOL(
+                                face->vertical_info                   &&
+                                face->vertical.number_Of_VMetrics > 0 );
+
+          /* get the vertical metrics from the vtmx table if we have one */
+          if ( has_vertical_info )
+          {
+            ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,
+                                                       glyph_index,
+                                                       &dummy,
+                                                       &advance );
+            glyph->root.linearVertAdvance = advance;
+          }
+          else
+          {
+            /* make up vertical ones */
+            if ( face->os2.version != 0xFFFFU )
+              glyph->root.linearVertAdvance = (FT_Pos)
+                ( face->os2.sTypoAscender - face->os2.sTypoDescender );
+            else
+              glyph->root.linearVertAdvance = (FT_Pos)
+                ( face->horizontal.Ascender - face->horizontal.Descender );
+          }
+
+          return error;
+        }
+      }
+    }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+    /* return immediately if we only want the embedded bitmaps */
+    if ( load_flags & FT_LOAD_SBITS_ONLY )
+      return FT_THROW( Invalid_Argument );
+
+    /* if we have a CID subfont, use its matrix (which has already */
+    /* been multiplied with the root matrix)                       */
+
+    /* this scaling is only relevant if the PS hinter isn't active */
+    if ( cff->num_subfonts )
+    {
+      FT_ULong  top_upm, sub_upm;
+      FT_Byte   fd_index = cff_fd_select_get( &cff->fd_select,
+                                              glyph_index );
+
+
+      if ( fd_index >= cff->num_subfonts )
+        fd_index = (FT_Byte)( cff->num_subfonts - 1 );
+
+      top_upm = cff->top_font.font_dict.units_per_em;
+      sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em;
+
+
+      font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix;
+      font_offset = cff->subfonts[fd_index]->font_dict.font_offset;
+
+      if ( top_upm != sub_upm )
+      {
+        glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm );
+        glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm );
+
+        force_scaling = TRUE;
+      }
+    }
+    else
+    {
+      font_matrix = cff->top_font.font_dict.font_matrix;
+      font_offset = cff->top_font.font_dict.font_offset;
+    }
+
+    glyph->root.outline.n_points   = 0;
+    glyph->root.outline.n_contours = 0;
+
+    /* top-level code ensures that FT_LOAD_NO_HINTING is set */
+    /* if FT_LOAD_NO_SCALE is active                         */
+    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+    scaled  = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 );
+
+    glyph->hint        = hinting;
+    glyph->scaled      = scaled;
+    glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;  /* by default */
+
+    {
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+      CFF_Driver  driver = (CFF_Driver)FT_FACE_DRIVER( face );
+#endif
+
+
+      FT_Byte*  charstring;
+      FT_ULong  charstring_len;
+
+
+      cff_decoder_init( &decoder, face, size, glyph, hinting,
+                        FT_LOAD_TARGET_MODE( load_flags ) );
+
+      if ( load_flags & FT_LOAD_ADVANCE_ONLY )
+        decoder.width_only = TRUE;
+
+      decoder.builder.no_recurse =
+        (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE );
+
+      /* now load the unscaled outline */
+      error = cff_get_glyph_data( face, glyph_index,
+                                  &charstring, &charstring_len );
+      if ( error )
+        goto Glyph_Build_Finished;
+
+      error = cff_decoder_prepare( &decoder, size, glyph_index );
+      if ( error )
+        goto Glyph_Build_Finished;
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+      /* choose which CFF renderer to use */
+      if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
+        error = cff_decoder_parse_charstrings( &decoder,
+                                               charstring,
+                                               charstring_len );
+      else
+#endif
+      {
+        error = cf2_decoder_parse_charstrings( &decoder,
+                                               charstring,
+                                               charstring_len );
+
+        /* Adobe's engine uses 16.16 numbers everywhere;              */
+        /* as a consequence, glyphs larger than 2000ppem get rejected */
+        if ( FT_ERR_EQ( error, Glyph_Too_Big ) )
+        {
+          /* this time, we retry unhinted and scale up the glyph later on */
+          /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */
+          /* 0x400 for both `x_scale' and `y_scale' in this case)         */
+          hinting       = FALSE;
+          force_scaling = TRUE;
+          glyph->hint   = hinting;
+
+          error = cf2_decoder_parse_charstrings( &decoder,
+                                                 charstring,
+                                                 charstring_len );
+        }
+      }
+
+      cff_free_glyph_data( face, &charstring, charstring_len );
+
+      if ( error )
+        goto Glyph_Build_Finished;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+      /* Control data and length may not be available for incremental */
+      /* fonts.                                                       */
+      if ( face->root.internal->incremental_interface )
+      {
+        glyph->root.control_data = 0;
+        glyph->root.control_len = 0;
+      }
+      else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+      /* We set control_data and control_len if charstrings is loaded. */
+      /* See how charstring loads at cff_index_access_element() in     */
+      /* cffload.c.                                                    */
+      {
+        CFF_Index  csindex = &cff->charstrings_index;
+
+
+        if ( csindex->offsets )
+        {
+          glyph->root.control_data = csindex->bytes +
+                                     csindex->offsets[glyph_index] - 1;
+          glyph->root.control_len  = charstring_len;
+        }
+      }
+
+  Glyph_Build_Finished:
+      /* save new glyph tables, if no error */
+      if ( !error )
+        cff_builder_done( &decoder.builder );
+      /* XXX: anything to do for broken glyph entry? */
+    }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    /* Incremental fonts can optionally override the metrics. */
+    if ( !error                                                               &&
+         face->root.internal->incremental_interface                           &&
+         face->root.internal->incremental_interface->funcs->get_glyph_metrics )
+    {
+      FT_Incremental_MetricsRec  metrics;
+
+
+      metrics.bearing_x = decoder.builder.left_bearing.x;
+      metrics.bearing_y = 0;
+      metrics.advance   = decoder.builder.advance.x;
+      metrics.advance_v = decoder.builder.advance.y;
+
+      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+                face->root.internal->incremental_interface->object,
+                glyph_index, FALSE, &metrics );
+
+      decoder.builder.left_bearing.x = metrics.bearing_x;
+      decoder.builder.advance.x      = metrics.advance;
+      decoder.builder.advance.y      = metrics.advance_v;
+    }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    if ( !error )
+    {
+      /* Now, set the metrics -- this is rather simple, as   */
+      /* the left side bearing is the xMin, and the top side */
+      /* bearing the yMax.                                   */
+
+      /* For composite glyphs, return only left side bearing and */
+      /* advance width.                                          */
+      if ( load_flags & FT_LOAD_NO_RECURSE )
+      {
+        FT_Slot_Internal  internal = glyph->root.internal;
+
+
+        glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x;
+        glyph->root.metrics.horiAdvance  = decoder.glyph_width;
+        internal->glyph_matrix           = font_matrix;
+        internal->glyph_delta            = font_offset;
+        internal->glyph_transformed      = 1;
+      }
+      else
+      {
+        FT_BBox            cbox;
+        FT_Glyph_Metrics*  metrics = &glyph->root.metrics;
+        FT_Vector          advance;
+        FT_Bool            has_vertical_info;
+
+
+        /* copy the _unscaled_ advance width */
+        metrics->horiAdvance                    = decoder.glyph_width;
+        glyph->root.linearHoriAdvance           = decoder.glyph_width;
+        glyph->root.internal->glyph_transformed = 0;
+
+        has_vertical_info = FT_BOOL( face->vertical_info                   &&
+                                     face->vertical.number_Of_VMetrics > 0 );
+
+        /* get the vertical metrics from the vtmx table if we have one */
+        if ( has_vertical_info )
+        {
+          FT_Short   vertBearingY = 0;
+          FT_UShort  vertAdvance  = 0;
+
+
+          ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,
+                                                     glyph_index,
+                                                     &vertBearingY,
+                                                     &vertAdvance );
+          metrics->vertBearingY = vertBearingY;
+          metrics->vertAdvance  = vertAdvance;
+        }
+        else
+        {
+          /* make up vertical ones */
+          if ( face->os2.version != 0xFFFFU )
+            metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender -
+                                             face->os2.sTypoDescender );
+          else
+            metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender -
+                                             face->horizontal.Descender );
+        }
+
+        glyph->root.linearVertAdvance = metrics->vertAdvance;
+
+        glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
+
+        glyph->root.outline.flags = 0;
+        if ( size && size->root.metrics.y_ppem < 24 )
+          glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+        glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL;
+
+        if ( !( font_matrix.xx == 0x10000L &&
+                font_matrix.yy == 0x10000L &&
+                font_matrix.xy == 0        &&
+                font_matrix.yx == 0        ) )
+          FT_Outline_Transform( &glyph->root.outline, &font_matrix );
+
+        if ( !( font_offset.x == 0 &&
+                font_offset.y == 0 ) )
+          FT_Outline_Translate( &glyph->root.outline,
+                                font_offset.x, font_offset.y );
+
+        advance.x = metrics->horiAdvance;
+        advance.y = 0;
+        FT_Vector_Transform( &advance, &font_matrix );
+        metrics->horiAdvance = advance.x + font_offset.x;
+
+        advance.x = 0;
+        advance.y = metrics->vertAdvance;
+        FT_Vector_Transform( &advance, &font_matrix );
+        metrics->vertAdvance = advance.y + font_offset.y;
+
+        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )
+        {
+          /* scale the outline and the metrics */
+          FT_Int       n;
+          FT_Outline*  cur     = &glyph->root.outline;
+          FT_Vector*   vec     = cur->points;
+          FT_Fixed     x_scale = glyph->x_scale;
+          FT_Fixed     y_scale = glyph->y_scale;
+
+
+          /* First of all, scale the points */
+          if ( !hinting || !decoder.builder.hints_funcs )
+            for ( n = cur->n_points; n > 0; n--, vec++ )
+            {
+              vec->x = FT_MulFix( vec->x, x_scale );
+              vec->y = FT_MulFix( vec->y, y_scale );
+            }
+
+          /* Then scale the metrics */
+          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+        }
+
+        /* compute the other metrics */
+        FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
+
+        metrics->width  = cbox.xMax - cbox.xMin;
+        metrics->height = cbox.yMax - cbox.yMin;
+
+        metrics->horiBearingX = cbox.xMin;
+        metrics->horiBearingY = cbox.yMax;
+
+        if ( has_vertical_info )
+          metrics->vertBearingX = metrics->horiBearingX -
+                                    metrics->horiAdvance / 2;
+        else
+        {
+          if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+            ft_synthesize_vertical_metrics( metrics,
+                                            metrics->vertAdvance );
+        }
+      }
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.h
new file mode 100644
index 0000000..986bba1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.h
@@ -0,0 +1,240 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffgload.h                                                             */
+/*                                                                         */
+/*    OpenType Glyph Loader (specification).                               */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006-2009, 2013 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFGLOAD_H__
+#define __CFFGLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "cffobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define CFF_MAX_OPERANDS        48
+#define CFF_MAX_SUBRS_CALLS     32
+#define CFF_MAX_TRANS_ELEMENTS  32
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Structure>                                                           */
+  /*    CFF_Builder                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*     A structure used during glyph loading to store its outline.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory        :: The current memory object.                        */
+  /*                                                                       */
+  /*    face          :: The current face object.                          */
+  /*                                                                       */
+  /*    glyph         :: The current glyph slot.                           */
+  /*                                                                       */
+  /*    loader        :: The current glyph loader.                         */
+  /*                                                                       */
+  /*    base          :: The base glyph outline.                           */
+  /*                                                                       */
+  /*    current       :: The current glyph outline.                        */
+  /*                                                                       */
+  /*    pos_x         :: The horizontal translation (if composite glyph).  */
+  /*                                                                       */
+  /*    pos_y         :: The vertical translation (if composite glyph).    */
+  /*                                                                       */
+  /*    left_bearing  :: The left side bearing point.                      */
+  /*                                                                       */
+  /*    advance       :: The horizontal advance vector.                    */
+  /*                                                                       */
+  /*    bbox          :: Unused.                                           */
+  /*                                                                       */
+  /*    path_begun    :: A flag which indicates that a new path has begun. */
+  /*                                                                       */
+  /*    load_points   :: If this flag is not set, no points are loaded.    */
+  /*                                                                       */
+  /*    no_recurse    :: Set but not used.                                 */
+  /*                                                                       */
+  /*    metrics_only  :: A boolean indicating that we only want to compute */
+  /*                     the metrics of a given glyph, not load all of its */
+  /*                     points.                                           */
+  /*                                                                       */
+  /*    hints_funcs   :: Auxiliary pointer for hinting.                    */
+  /*                                                                       */
+  /*    hints_globals :: Auxiliary pointer for hinting.                    */
+  /*                                                                       */
+  typedef struct  CFF_Builder_
+  {
+    FT_Memory       memory;
+    TT_Face         face;
+    CFF_GlyphSlot   glyph;
+    FT_GlyphLoader  loader;
+    FT_Outline*     base;
+    FT_Outline*     current;
+
+    FT_Pos          pos_x;
+    FT_Pos          pos_y;
+
+    FT_Vector       left_bearing;
+    FT_Vector       advance;
+
+    FT_BBox         bbox;          /* bounding box */
+    FT_Bool         path_begun;
+    FT_Bool         load_points;
+    FT_Bool         no_recurse;
+
+    FT_Bool         metrics_only;
+
+    void*           hints_funcs;    /* hinter-specific */
+    void*           hints_globals;  /* hinter-specific */
+
+  } CFF_Builder;
+
+
+  FT_LOCAL( FT_Error )
+  cff_check_points( CFF_Builder*  builder,
+                    FT_Int        count );
+
+  FT_LOCAL( void )
+  cff_builder_add_point( CFF_Builder*  builder,
+                         FT_Pos        x,
+                         FT_Pos        y,
+                         FT_Byte       flag );
+  FT_LOCAL( FT_Error )
+  cff_builder_add_point1( CFF_Builder*  builder,
+                          FT_Pos        x,
+                          FT_Pos        y );
+  FT_LOCAL( FT_Error )
+  cff_builder_start_point( CFF_Builder*  builder,
+                           FT_Pos        x,
+                           FT_Pos        y );
+  FT_LOCAL( void )
+  cff_builder_close_contour( CFF_Builder*  builder );
+
+
+  FT_LOCAL( FT_Int )
+  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,
+                                   FT_Int    charcode );
+  FT_LOCAL( FT_Error )
+  cff_get_glyph_data( TT_Face    face,
+                      FT_UInt    glyph_index,
+                      FT_Byte**  pointer,
+                      FT_ULong*  length );
+  FT_LOCAL( void )
+  cff_free_glyph_data( TT_Face    face,
+                       FT_Byte**  pointer,
+                       FT_ULong   length );
+
+
+  /* execution context charstring zone */
+
+  typedef struct  CFF_Decoder_Zone_
+  {
+    FT_Byte*  base;
+    FT_Byte*  limit;
+    FT_Byte*  cursor;
+
+  } CFF_Decoder_Zone;
+
+
+  typedef struct  CFF_Decoder_
+  {
+    CFF_Builder        builder;
+    CFF_Font           cff;
+
+    FT_Fixed           stack[CFF_MAX_OPERANDS + 1];
+    FT_Fixed*          top;
+
+    CFF_Decoder_Zone   zones[CFF_MAX_SUBRS_CALLS + 1];
+    CFF_Decoder_Zone*  zone;
+
+    FT_Int             flex_state;
+    FT_Int             num_flex_vectors;
+    FT_Vector          flex_vectors[7];
+
+    FT_Pos             glyph_width;
+    FT_Pos             nominal_width;
+
+    FT_Bool            read_width;
+    FT_Bool            width_only;
+    FT_Int             num_hints;
+    FT_Fixed           buildchar[CFF_MAX_TRANS_ELEMENTS];
+
+    FT_UInt            num_locals;
+    FT_UInt            num_globals;
+
+    FT_Int             locals_bias;
+    FT_Int             globals_bias;
+
+    FT_Byte**          locals;
+    FT_Byte**          globals;
+
+    FT_Byte**          glyph_names;   /* for pure CFF fonts only  */
+    FT_UInt            num_glyphs;    /* number of glyphs in font */
+
+    FT_Render_Mode     hint_mode;
+
+    FT_Bool            seac;
+
+    CFF_SubFont        current_subfont; /* for current glyph_index */
+
+  } CFF_Decoder;
+
+
+  FT_LOCAL( void )
+  cff_decoder_init( CFF_Decoder*    decoder,
+                    TT_Face         face,
+                    CFF_Size        size,
+                    CFF_GlyphSlot   slot,
+                    FT_Bool         hinting,
+                    FT_Render_Mode  hint_mode );
+
+  FT_LOCAL( FT_Error )
+  cff_decoder_prepare( CFF_Decoder*  decoder,
+                       CFF_Size      size,
+                       FT_UInt       glyph_index );
+
+#if 0  /* unused until we support pure CFF fonts */
+
+  /* Compute the maximum advance width of a font through quick parsing */
+  FT_LOCAL( FT_Error )
+  cff_compute_max_advance( TT_Face  face,
+                           FT_Int*  max_advance );
+
+#endif /* 0 */
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+  FT_LOCAL( FT_Error )
+  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
+                                 FT_Byte*      charstring_base,
+                                 FT_ULong      charstring_len );
+#endif
+
+  FT_LOCAL( FT_Error )
+  cff_slot_load( CFF_GlyphSlot  glyph,
+                 CFF_Size       size,
+                 FT_UInt        glyph_index,
+                 FT_Int32       load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __CFFGLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.c
new file mode 100644
index 0000000..2e5cd9d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.c
@@ -0,0 +1,1696 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffload.c                                                              */
+/*                                                                         */
+/*    OpenType and CFF data/program tables loader (body).                  */
+/*                                                                         */
+/*  Copyright 1996-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/t1tables.h"
+
+#include "cffload.h"
+#include "cffparse.h"
+
+#include "cfferrs.h"
+
+
+#if 1
+
+  static const FT_UShort  cff_isoadobe_charset[229] =
+  {
+      0,   1,   2,   3,   4,   5,   6,   7,
+      8,   9,  10,  11,  12,  13,  14,  15,
+     16,  17,  18,  19,  20,  21,  22,  23,
+     24,  25,  26,  27,  28,  29,  30,  31,
+     32,  33,  34,  35,  36,  37,  38,  39,
+     40,  41,  42,  43,  44,  45,  46,  47,
+     48,  49,  50,  51,  52,  53,  54,  55,
+     56,  57,  58,  59,  60,  61,  62,  63,
+     64,  65,  66,  67,  68,  69,  70,  71,
+     72,  73,  74,  75,  76,  77,  78,  79,
+     80,  81,  82,  83,  84,  85,  86,  87,
+     88,  89,  90,  91,  92,  93,  94,  95,
+     96,  97,  98,  99, 100, 101, 102, 103,
+    104, 105, 106, 107, 108, 109, 110, 111,
+    112, 113, 114, 115, 116, 117, 118, 119,
+    120, 121, 122, 123, 124, 125, 126, 127,
+    128, 129, 130, 131, 132, 133, 134, 135,
+    136, 137, 138, 139, 140, 141, 142, 143,
+    144, 145, 146, 147, 148, 149, 150, 151,
+    152, 153, 154, 155, 156, 157, 158, 159,
+    160, 161, 162, 163, 164, 165, 166, 167,
+    168, 169, 170, 171, 172, 173, 174, 175,
+    176, 177, 178, 179, 180, 181, 182, 183,
+    184, 185, 186, 187, 188, 189, 190, 191,
+    192, 193, 194, 195, 196, 197, 198, 199,
+    200, 201, 202, 203, 204, 205, 206, 207,
+    208, 209, 210, 211, 212, 213, 214, 215,
+    216, 217, 218, 219, 220, 221, 222, 223,
+    224, 225, 226, 227, 228
+  };
+
+  static const FT_UShort  cff_expert_charset[166] =
+  {
+      0,   1, 229, 230, 231, 232, 233, 234,
+    235, 236, 237, 238,  13,  14,  15,  99,
+    239, 240, 241, 242, 243, 244, 245, 246,
+    247, 248,  27,  28, 249, 250, 251, 252,
+    253, 254, 255, 256, 257, 258, 259, 260,
+    261, 262, 263, 264, 265, 266, 109, 110,
+    267, 268, 269, 270, 271, 272, 273, 274,
+    275, 276, 277, 278, 279, 280, 281, 282,
+    283, 284, 285, 286, 287, 288, 289, 290,
+    291, 292, 293, 294, 295, 296, 297, 298,
+    299, 300, 301, 302, 303, 304, 305, 306,
+    307, 308, 309, 310, 311, 312, 313, 314,
+    315, 316, 317, 318, 158, 155, 163, 319,
+    320, 321, 322, 323, 324, 325, 326, 150,
+    164, 169, 327, 328, 329, 330, 331, 332,
+    333, 334, 335, 336, 337, 338, 339, 340,
+    341, 342, 343, 344, 345, 346, 347, 348,
+    349, 350, 351, 352, 353, 354, 355, 356,
+    357, 358, 359, 360, 361, 362, 363, 364,
+    365, 366, 367, 368, 369, 370, 371, 372,
+    373, 374, 375, 376, 377, 378
+  };
+
+  static const FT_UShort  cff_expertsubset_charset[87] =
+  {
+      0,   1, 231, 232, 235, 236, 237, 238,
+     13,  14,  15,  99, 239, 240, 241, 242,
+    243, 244, 245, 246, 247, 248,  27,  28,
+    249, 250, 251, 253, 254, 255, 256, 257,
+    258, 259, 260, 261, 262, 263, 264, 265,
+    266, 109, 110, 267, 268, 269, 270, 272,
+    300, 301, 302, 305, 314, 315, 158, 155,
+    163, 320, 321, 322, 323, 324, 325, 326,
+    150, 164, 169, 327, 328, 329, 330, 331,
+    332, 333, 334, 335, 336, 337, 338, 339,
+    340, 341, 342, 343, 344, 345, 346
+  };
+
+  static const FT_UShort  cff_standard_encoding[256] =
+  {
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,
+      9,  10,  11,  12,  13,  14,  15,  16,
+     17,  18,  19,  20,  21,  22,  23,  24,
+     25,  26,  27,  28,  29,  30,  31,  32,
+     33,  34,  35,  36,  37,  38,  39,  40,
+     41,  42,  43,  44,  45,  46,  47,  48,
+     49,  50,  51,  52,  53,  54,  55,  56,
+     57,  58,  59,  60,  61,  62,  63,  64,
+     65,  66,  67,  68,  69,  70,  71,  72,
+     73,  74,  75,  76,  77,  78,  79,  80,
+     81,  82,  83,  84,  85,  86,  87,  88,
+     89,  90,  91,  92,  93,  94,  95,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,  96,  97,  98,  99, 100, 101, 102,
+    103, 104, 105, 106, 107, 108, 109, 110,
+      0, 111, 112, 113, 114,   0, 115, 116,
+    117, 118, 119, 120, 121, 122,   0, 123,
+      0, 124, 125, 126, 127, 128, 129, 130,
+    131,   0, 132, 133,   0, 134, 135, 136,
+    137,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0, 138,   0, 139,   0,   0,   0,   0,
+    140, 141, 142, 143,   0,   0,   0,   0,
+      0, 144,   0,   0,   0, 145,   0,   0,
+    146, 147, 148, 149,   0,   0,   0,   0
+  };
+
+  static const FT_UShort  cff_expert_encoding[256] =
+  {
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      1, 229, 230,   0, 231, 232, 233, 234,
+    235, 236, 237, 238,  13,  14,  15,  99,
+    239, 240, 241, 242, 243, 244, 245, 246,
+    247, 248,  27,  28, 249, 250, 251, 252,
+      0, 253, 254, 255, 256, 257,   0,   0,
+      0, 258,   0,   0, 259, 260, 261, 262,
+      0,   0, 263, 264, 265,   0, 266, 109,
+    110, 267, 268, 269,   0, 270, 271, 272,
+    273, 274, 275, 276, 277, 278, 279, 280,
+    281, 282, 283, 284, 285, 286, 287, 288,
+    289, 290, 291, 292, 293, 294, 295, 296,
+    297, 298, 299, 300, 301, 302, 303,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0, 304, 305, 306,   0,   0, 307, 308,
+    309, 310, 311,   0, 312,   0,   0, 312,
+      0,   0, 314, 315,   0,   0, 316, 317,
+    318,   0,   0,   0, 158, 155, 163, 319,
+    320, 321, 322, 323, 324, 325,   0,   0,
+    326, 150, 164, 169, 327, 328, 329, 330,
+    331, 332, 333, 334, 335, 336, 337, 338,
+    339, 340, 341, 342, 343, 344, 345, 346,
+    347, 348, 349, 350, 351, 352, 353, 354,
+    355, 356, 357, 358, 359, 360, 361, 362,
+    363, 364, 365, 366, 367, 368, 369, 370,
+    371, 372, 373, 374, 375, 376, 377, 378
+  };
+
+#endif /* 1 */
+
+
+  FT_LOCAL_DEF( FT_UShort )
+  cff_get_standard_encoding( FT_UInt  charcode )
+  {
+    return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode]
+                                       : 0 );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cffload
+
+
+  /* read an offset from the index's stream current position */
+  static FT_ULong
+  cff_index_read_offset( CFF_Index  idx,
+                         FT_Error  *errorp )
+  {
+    FT_Error   error;
+    FT_Stream  stream = idx->stream;
+    FT_Byte    tmp[4];
+    FT_ULong   result = 0;
+
+
+    if ( !FT_STREAM_READ( tmp, idx->off_size ) )
+    {
+      FT_Int  nn;
+
+
+      for ( nn = 0; nn < idx->off_size; nn++ )
+        result = ( result << 8 ) | tmp[nn];
+    }
+
+    *errorp = error;
+    return result;
+  }
+
+
+  static FT_Error
+  cff_index_init( CFF_Index  idx,
+                  FT_Stream  stream,
+                  FT_Bool    load )
+  {
+    FT_Error   error;
+    FT_Memory  memory = stream->memory;
+    FT_UShort  count;
+
+
+    FT_MEM_ZERO( idx, sizeof ( *idx ) );
+
+    idx->stream = stream;
+    idx->start  = FT_STREAM_POS();
+    if ( !FT_READ_USHORT( count ) &&
+         count > 0                )
+    {
+      FT_Byte   offsize;
+      FT_ULong  size;
+
+
+      /* there is at least one element; read the offset size,           */
+      /* then access the offset table to compute the index's total size */
+      if ( FT_READ_BYTE( offsize ) )
+        goto Exit;
+
+      if ( offsize < 1 || offsize > 4 )
+      {
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
+      }
+
+      idx->count    = count;
+      idx->off_size = offsize;
+      size          = (FT_ULong)( count + 1 ) * offsize;
+
+      idx->data_offset = idx->start + 3 + size;
+
+      if ( FT_STREAM_SKIP( size - offsize ) )
+        goto Exit;
+
+      size = cff_index_read_offset( idx, &error );
+      if ( error )
+        goto Exit;
+
+      if ( size == 0 )
+      {
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
+      }
+
+      idx->data_size = --size;
+
+      if ( load )
+      {
+        /* load the data */
+        if ( FT_FRAME_EXTRACT( size, idx->bytes ) )
+          goto Exit;
+      }
+      else
+      {
+        /* skip the data */
+        if ( FT_STREAM_SKIP( size ) )
+          goto Exit;
+      }
+    }
+
+  Exit:
+    if ( error )
+      FT_FREE( idx->offsets );
+
+    return error;
+  }
+
+
+  static void
+  cff_index_done( CFF_Index  idx )
+  {
+    if ( idx->stream )
+    {
+      FT_Stream  stream = idx->stream;
+      FT_Memory  memory = stream->memory;
+
+
+      if ( idx->bytes )
+        FT_FRAME_RELEASE( idx->bytes );
+
+      FT_FREE( idx->offsets );
+      FT_MEM_ZERO( idx, sizeof ( *idx ) );
+    }
+  }
+
+
+  static FT_Error
+  cff_index_load_offsets( CFF_Index  idx )
+  {
+    FT_Error   error  = FT_Err_Ok;
+    FT_Stream  stream = idx->stream;
+    FT_Memory  memory = stream->memory;
+
+
+    if ( idx->count > 0 && idx->offsets == NULL )
+    {
+      FT_Byte    offsize = idx->off_size;
+      FT_ULong   data_size;
+      FT_Byte*   p;
+      FT_Byte*   p_end;
+      FT_ULong*  poff;
+
+
+      data_size = (FT_ULong)( idx->count + 1 ) * offsize;
+
+      if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) ||
+           FT_STREAM_SEEK( idx->start + 3 )             ||
+           FT_FRAME_ENTER( data_size )                  )
+        goto Exit;
+
+      poff   = idx->offsets;
+      p      = (FT_Byte*)stream->cursor;
+      p_end  = p + data_size;
+
+      switch ( offsize )
+      {
+      case 1:
+        for ( ; p < p_end; p++, poff++ )
+          poff[0] = p[0];
+        break;
+
+      case 2:
+        for ( ; p < p_end; p += 2, poff++ )
+          poff[0] = FT_PEEK_USHORT( p );
+        break;
+
+      case 3:
+        for ( ; p < p_end; p += 3, poff++ )
+          poff[0] = FT_PEEK_OFF3( p );
+        break;
+
+      default:
+        for ( ; p < p_end; p += 4, poff++ )
+          poff[0] = FT_PEEK_ULONG( p );
+      }
+
+      FT_FRAME_EXIT();
+    }
+
+  Exit:
+    if ( error )
+      FT_FREE( idx->offsets );
+
+    return error;
+  }
+
+
+  /* Allocate a table containing pointers to an index's elements. */
+  /* The `pool' argument makes this function convert the index    */
+  /* entries to C-style strings (this is, NULL-terminated).       */
+  static FT_Error
+  cff_index_get_pointers( CFF_Index   idx,
+                          FT_Byte***  table,
+                          FT_Byte**   pool )
+  {
+    FT_Error   error     = FT_Err_Ok;
+    FT_Memory  memory    = idx->stream->memory;
+
+    FT_Byte**  t         = NULL;
+    FT_Byte*   new_bytes = NULL;
+
+
+    *table = NULL;
+
+    if ( idx->offsets == NULL )
+    {
+      error = cff_index_load_offsets( idx );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( idx->count > 0                                        &&
+         !FT_NEW_ARRAY( t, idx->count + 1 )                    &&
+         ( !pool || !FT_ALLOC( new_bytes,
+                               idx->data_size + idx->count ) ) )
+    {
+      FT_ULong  n, cur_offset;
+      FT_ULong  extra = 0;
+      FT_Byte*  org_bytes = idx->bytes;
+
+
+      /* at this point, `idx->offsets' can't be NULL */
+      cur_offset = idx->offsets[0] - 1;
+
+      /* sanity check */
+      if ( cur_offset >= idx->data_size )
+      {
+        FT_TRACE0(( "cff_index_get_pointers:"
+                    " invalid first offset value %d set to zero\n",
+                    cur_offset ));
+        cur_offset = 0;
+      }
+
+      if ( !pool )
+        t[0] = org_bytes + cur_offset;
+      else
+        t[0] = new_bytes + cur_offset;
+
+      for ( n = 1; n <= idx->count; n++ )
+      {
+        FT_ULong  next_offset = idx->offsets[n] - 1;
+
+
+        /* empty slot + two sanity checks for invalid offset tables */
+        if ( next_offset == 0                                    ||
+             next_offset < cur_offset                            ||
+             ( next_offset >= idx->data_size && n < idx->count ) )
+          next_offset = cur_offset;
+
+        if ( !pool )
+          t[n] = org_bytes + next_offset;
+        else
+        {
+          t[n] = new_bytes + next_offset + extra;
+
+          if ( next_offset != cur_offset )
+          {
+            FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] );
+            t[n][0] = '\0';
+            t[n]   += 1;
+            extra++;
+          }
+        }
+
+        cur_offset = next_offset;
+      }
+      *table = t;
+
+      if ( pool )
+        *pool = new_bytes;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_index_access_element( CFF_Index  idx,
+                            FT_UInt    element,
+                            FT_Byte**  pbytes,
+                            FT_ULong*  pbyte_len )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( idx && idx->count > element )
+    {
+      /* compute start and end offsets */
+      FT_Stream  stream = idx->stream;
+      FT_ULong   off1, off2 = 0;
+
+
+      /* load offsets from file or the offset table */
+      if ( !idx->offsets )
+      {
+        FT_ULong  pos = element * idx->off_size;
+
+
+        if ( FT_STREAM_SEEK( idx->start + 3 + pos ) )
+          goto Exit;
+
+        off1 = cff_index_read_offset( idx, &error );
+        if ( error )
+          goto Exit;
+
+        if ( off1 != 0 )
+        {
+          do
+          {
+            element++;
+            off2 = cff_index_read_offset( idx, &error );
+          }
+          while ( off2 == 0 && element < idx->count );
+        }
+      }
+      else   /* use offsets table */
+      {
+        off1 = idx->offsets[element];
+        if ( off1 )
+        {
+          do
+          {
+            element++;
+            off2 = idx->offsets[element];
+
+          } while ( off2 == 0 && element < idx->count );
+        }
+      }
+
+      /* XXX: should check off2 does not exceed the end of this entry; */
+      /*      at present, only truncate off2 at the end of this stream */
+      if ( off2 > stream->size + 1                    ||
+           idx->data_offset > stream->size - off2 + 1 )
+      {
+        FT_ERROR(( "cff_index_access_element:"
+                   " offset to next entry (%d)"
+                   " exceeds the end of stream (%d)\n",
+                   off2, stream->size - idx->data_offset + 1 ));
+        off2 = stream->size - idx->data_offset + 1;
+      }
+
+      /* access element */
+      if ( off1 && off2 > off1 )
+      {
+        *pbyte_len = off2 - off1;
+
+        if ( idx->bytes )
+        {
+          /* this index was completely loaded in memory, that's easy */
+          *pbytes = idx->bytes + off1 - 1;
+        }
+        else
+        {
+          /* this index is still on disk/file, access it through a frame */
+          if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) ||
+               FT_FRAME_EXTRACT( off2 - off1, *pbytes )      )
+            goto Exit;
+        }
+      }
+      else
+      {
+        /* empty index element */
+        *pbytes    = 0;
+        *pbyte_len = 0;
+      }
+    }
+    else
+      error = FT_THROW( Invalid_Argument );
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_index_forget_element( CFF_Index  idx,
+                            FT_Byte**  pbytes )
+  {
+    if ( idx->bytes == 0 )
+    {
+      FT_Stream  stream = idx->stream;
+
+
+      FT_FRAME_RELEASE( *pbytes );
+    }
+  }
+
+
+  /* get an entry from Name INDEX */
+  FT_LOCAL_DEF( FT_String* )
+  cff_index_get_name( CFF_Font  font,
+                      FT_UInt   element )
+  {
+    CFF_Index   idx = &font->name_index;
+    FT_Memory   memory = idx->stream->memory;
+    FT_Byte*    bytes;
+    FT_ULong    byte_len;
+    FT_Error    error;
+    FT_String*  name = 0;
+
+
+    error = cff_index_access_element( idx, element, &bytes, &byte_len );
+    if ( error )
+      goto Exit;
+
+    if ( !FT_ALLOC( name, byte_len + 1 ) )
+    {
+      FT_MEM_COPY( name, bytes, byte_len );
+      name[byte_len] = 0;
+    }
+    cff_index_forget_element( idx, &bytes );
+
+  Exit:
+    return name;
+  }
+
+
+  /* get an entry from String INDEX */
+  FT_LOCAL_DEF( FT_String* )
+  cff_index_get_string( CFF_Font  font,
+                        FT_UInt   element )
+  {
+    return ( element < font->num_strings )
+             ? (FT_String*)font->strings[element]
+             : NULL;
+  }
+
+
+  FT_LOCAL_DEF( FT_String* )
+  cff_index_get_sid_string( CFF_Font  font,
+                            FT_UInt   sid )
+  {
+    /* value 0xFFFFU indicates a missing dictionary entry */
+    if ( sid == 0xFFFFU )
+      return NULL;
+
+    /* if it is not a standard string, return it */
+    if ( sid > 390 )
+      return cff_index_get_string( font, sid - 391 );
+
+    /* CID-keyed CFF fonts don't have glyph names */
+    if ( !font->psnames )
+      return NULL;
+
+    /* this is a standard string */
+    return (FT_String *)font->psnames->adobe_std_strings( sid );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***   FD Select table support                                         ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  static void
+  CFF_Done_FD_Select( CFF_FDSelect  fdselect,
+                      FT_Stream     stream )
+  {
+    if ( fdselect->data )
+      FT_FRAME_RELEASE( fdselect->data );
+
+    fdselect->data_size   = 0;
+    fdselect->format      = 0;
+    fdselect->range_count = 0;
+  }
+
+
+  static FT_Error
+  CFF_Load_FD_Select( CFF_FDSelect  fdselect,
+                      FT_UInt       num_glyphs,
+                      FT_Stream     stream,
+                      FT_ULong      offset )
+  {
+    FT_Error  error;
+    FT_Byte   format;
+    FT_UInt   num_ranges;
+
+
+    /* read format */
+    if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) )
+      goto Exit;
+
+    fdselect->format      = format;
+    fdselect->cache_count = 0;   /* clear cache */
+
+    switch ( format )
+    {
+    case 0:     /* format 0, that's simple */
+      fdselect->data_size = num_glyphs;
+      goto Load_Data;
+
+    case 3:     /* format 3, a tad more complex */
+      if ( FT_READ_USHORT( num_ranges ) )
+        goto Exit;
+
+      fdselect->data_size = num_ranges * 3 + 2;
+
+    Load_Data:
+      if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) )
+        goto Exit;
+      break;
+
+    default:    /* hmm... that's wrong */
+      error = FT_THROW( Invalid_File_Format );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Byte )
+  cff_fd_select_get( CFF_FDSelect  fdselect,
+                     FT_UInt       glyph_index )
+  {
+    FT_Byte  fd = 0;
+
+
+    switch ( fdselect->format )
+    {
+    case 0:
+      fd = fdselect->data[glyph_index];
+      break;
+
+    case 3:
+      /* first, compare to cache */
+      if ( (FT_UInt)( glyph_index - fdselect->cache_first ) <
+                        fdselect->cache_count )
+      {
+        fd = fdselect->cache_fd;
+        break;
+      }
+
+      /* then, lookup the ranges array */
+      {
+        FT_Byte*  p       = fdselect->data;
+        FT_Byte*  p_limit = p + fdselect->data_size;
+        FT_Byte   fd2;
+        FT_UInt   first, limit;
+
+
+        first = FT_NEXT_USHORT( p );
+        do
+        {
+          if ( glyph_index < first )
+            break;
+
+          fd2   = *p++;
+          limit = FT_NEXT_USHORT( p );
+
+          if ( glyph_index < limit )
+          {
+            fd = fd2;
+
+            /* update cache */
+            fdselect->cache_first = first;
+            fdselect->cache_count = limit-first;
+            fdselect->cache_fd    = fd2;
+            break;
+          }
+          first = limit;
+
+        } while ( p < p_limit );
+      }
+      break;
+
+    default:
+      ;
+    }
+
+    return fd;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***   CFF font support                                                ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static FT_Error
+  cff_charset_compute_cids( CFF_Charset  charset,
+                            FT_UInt      num_glyphs,
+                            FT_Memory    memory )
+  {
+    FT_Error   error   = FT_Err_Ok;
+    FT_UInt    i;
+    FT_Long    j;
+    FT_UShort  max_cid = 0;
+
+
+    if ( charset->max_cid > 0 )
+      goto Exit;
+
+    for ( i = 0; i < num_glyphs; i++ )
+    {
+      if ( charset->sids[i] > max_cid )
+        max_cid = charset->sids[i];
+    }
+
+    if ( FT_NEW_ARRAY( charset->cids, (FT_ULong)max_cid + 1 ) )
+      goto Exit;
+
+    /* When multiple GIDs map to the same CID, we choose the lowest */
+    /* GID.  This is not described in any spec, but it matches the  */
+    /* behaviour of recent Acroread versions.                       */
+    for ( j = num_glyphs - 1; j >= 0 ; j-- )
+      charset->cids[charset->sids[j]] = (FT_UShort)j;
+
+    charset->max_cid    = max_cid;
+    charset->num_glyphs = num_glyphs;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  cff_charset_cid_to_gindex( CFF_Charset  charset,
+                             FT_UInt      cid )
+  {
+    FT_UInt  result = 0;
+
+
+    if ( cid <= charset->max_cid )
+      result = charset->cids[cid];
+
+    return result;
+  }
+
+
+  static void
+  cff_charset_free_cids( CFF_Charset  charset,
+                         FT_Memory    memory )
+  {
+    FT_FREE( charset->cids );
+    charset->max_cid = 0;
+  }
+
+
+  static void
+  cff_charset_done( CFF_Charset  charset,
+                    FT_Stream    stream )
+  {
+    FT_Memory  memory = stream->memory;
+
+
+    cff_charset_free_cids( charset, memory );
+
+    FT_FREE( charset->sids );
+    charset->format = 0;
+    charset->offset = 0;
+  }
+
+
+  static FT_Error
+  cff_charset_load( CFF_Charset  charset,
+                    FT_UInt      num_glyphs,
+                    FT_Stream    stream,
+                    FT_ULong     base_offset,
+                    FT_ULong     offset,
+                    FT_Bool      invert )
+  {
+    FT_Memory  memory = stream->memory;
+    FT_Error   error  = FT_Err_Ok;
+    FT_UShort  glyph_sid;
+
+
+    /* If the the offset is greater than 2, we have to parse the */
+    /* charset table.                                            */
+    if ( offset > 2 )
+    {
+      FT_UInt  j;
+
+
+      charset->offset = base_offset + offset;
+
+      /* Get the format of the table. */
+      if ( FT_STREAM_SEEK( charset->offset ) ||
+           FT_READ_BYTE( charset->format )   )
+        goto Exit;
+
+      /* Allocate memory for sids. */
+      if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+        goto Exit;
+
+      /* assign the .notdef glyph */
+      charset->sids[0] = 0;
+
+      switch ( charset->format )
+      {
+      case 0:
+        if ( num_glyphs > 0 )
+        {
+          if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) )
+            goto Exit;
+
+          for ( j = 1; j < num_glyphs; j++ )
+            charset->sids[j] = FT_GET_USHORT();
+
+          FT_FRAME_EXIT();
+        }
+        break;
+
+      case 1:
+      case 2:
+        {
+          FT_UInt  nleft;
+          FT_UInt  i;
+
+
+          j = 1;
+
+          while ( j < num_glyphs )
+          {
+            /* Read the first glyph sid of the range. */
+            if ( FT_READ_USHORT( glyph_sid ) )
+              goto Exit;
+
+            /* Read the number of glyphs in the range.  */
+            if ( charset->format == 2 )
+            {
+              if ( FT_READ_USHORT( nleft ) )
+                goto Exit;
+            }
+            else
+            {
+              if ( FT_READ_BYTE( nleft ) )
+                goto Exit;
+            }
+
+            /* try to rescue some of the SIDs if `nleft' is too large */
+            if ( glyph_sid > 0xFFFFL - nleft )
+            {
+              FT_ERROR(( "cff_charset_load: invalid SID range trimmed"
+                         " nleft=%d -> %d\n", nleft, 0xFFFFL - glyph_sid ));
+              nleft = ( FT_UInt )( 0xFFFFL - glyph_sid );
+            }
+
+            /* Fill in the range of sids -- `nleft + 1' glyphs. */
+            for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ )
+              charset->sids[j] = glyph_sid;
+          }
+        }
+        break;
+
+      default:
+        FT_ERROR(( "cff_charset_load: invalid table format\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+    }
+    else
+    {
+      /* Parse default tables corresponding to offset == 0, 1, or 2.  */
+      /* CFF specification intimates the following:                   */
+      /*                                                              */
+      /* In order to use a predefined charset, the following must be  */
+      /* true: The charset constructed for the glyphs in the font's   */
+      /* charstrings dictionary must match the predefined charset in  */
+      /* the first num_glyphs.                                        */
+
+      charset->offset = offset;  /* record charset type */
+
+      switch ( (FT_UInt)offset )
+      {
+      case 0:
+        if ( num_glyphs > 229 )
+        {
+          FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
+                     "predefined charset (Adobe ISO-Latin)\n" ));
+          error = FT_THROW( Invalid_File_Format );
+          goto Exit;
+        }
+
+        /* Allocate memory for sids. */
+        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+          goto Exit;
+
+        /* Copy the predefined charset into the allocated memory. */
+        FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs );
+
+        break;
+
+      case 1:
+        if ( num_glyphs > 166 )
+        {
+          FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
+                     "predefined charset (Adobe Expert)\n" ));
+          error = FT_THROW( Invalid_File_Format );
+          goto Exit;
+        }
+
+        /* Allocate memory for sids. */
+        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+          goto Exit;
+
+        /* Copy the predefined charset into the allocated memory.     */
+        FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs );
+
+        break;
+
+      case 2:
+        if ( num_glyphs > 87 )
+        {
+          FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
+                     "predefined charset (Adobe Expert Subset)\n" ));
+          error = FT_THROW( Invalid_File_Format );
+          goto Exit;
+        }
+
+        /* Allocate memory for sids. */
+        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+          goto Exit;
+
+        /* Copy the predefined charset into the allocated memory.     */
+        FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs );
+
+        break;
+
+      default:
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+    }
+
+    /* we have to invert the `sids' array for subsetted CID-keyed fonts */
+    if ( invert )
+      error = cff_charset_compute_cids( charset, num_glyphs, memory );
+
+  Exit:
+    /* Clean up if there was an error. */
+    if ( error )
+    {
+      FT_FREE( charset->sids );
+      FT_FREE( charset->cids );
+      charset->format = 0;
+      charset->offset = 0;
+      charset->sids   = 0;
+    }
+
+    return error;
+  }
+
+
+  static void
+  cff_encoding_done( CFF_Encoding  encoding )
+  {
+    encoding->format = 0;
+    encoding->offset = 0;
+    encoding->count  = 0;
+  }
+
+
+  static FT_Error
+  cff_encoding_load( CFF_Encoding  encoding,
+                     CFF_Charset   charset,
+                     FT_UInt       num_glyphs,
+                     FT_Stream     stream,
+                     FT_ULong      base_offset,
+                     FT_ULong      offset )
+  {
+    FT_Error   error = FT_Err_Ok;
+    FT_UInt    count;
+    FT_UInt    j;
+    FT_UShort  glyph_sid;
+    FT_UInt    glyph_code;
+
+
+    /* Check for charset->sids.  If we do not have this, we fail. */
+    if ( !charset->sids )
+    {
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    /* Zero out the code to gid/sid mappings. */
+    for ( j = 0; j < 256; j++ )
+    {
+      encoding->sids [j] = 0;
+      encoding->codes[j] = 0;
+    }
+
+    /* Note: The encoding table in a CFF font is indexed by glyph index;  */
+    /* the first encoded glyph index is 1.  Hence, we read the character  */
+    /* code (`glyph_code') at index j and make the assignment:            */
+    /*                                                                    */
+    /*    encoding->codes[glyph_code] = j + 1                             */
+    /*                                                                    */
+    /* We also make the assignment:                                       */
+    /*                                                                    */
+    /*    encoding->sids[glyph_code] = charset->sids[j + 1]               */
+    /*                                                                    */
+    /* This gives us both a code to GID and a code to SID mapping.        */
+
+    if ( offset > 1 )
+    {
+      encoding->offset = base_offset + offset;
+
+      /* we need to parse the table to determine its size */
+      if ( FT_STREAM_SEEK( encoding->offset ) ||
+           FT_READ_BYTE( encoding->format )   ||
+           FT_READ_BYTE( count )              )
+        goto Exit;
+
+      switch ( encoding->format & 0x7F )
+      {
+      case 0:
+        {
+          FT_Byte*  p;
+
+
+          /* By convention, GID 0 is always ".notdef" and is never */
+          /* coded in the font.  Hence, the number of codes found  */
+          /* in the table is `count+1'.                            */
+          /*                                                       */
+          encoding->count = count + 1;
+
+          if ( FT_FRAME_ENTER( count ) )
+            goto Exit;
+
+          p = (FT_Byte*)stream->cursor;
+
+          for ( j = 1; j <= count; j++ )
+          {
+            glyph_code = *p++;
+
+            /* Make sure j is not too big. */
+            if ( j < num_glyphs )
+            {
+              /* Assign code to GID mapping. */
+              encoding->codes[glyph_code] = (FT_UShort)j;
+
+              /* Assign code to SID mapping. */
+              encoding->sids[glyph_code] = charset->sids[j];
+            }
+          }
+
+          FT_FRAME_EXIT();
+        }
+        break;
+
+      case 1:
+        {
+          FT_UInt  nleft;
+          FT_UInt  i = 1;
+          FT_UInt  k;
+
+
+          encoding->count = 0;
+
+          /* Parse the Format1 ranges. */
+          for ( j = 0;  j < count; j++, i += nleft )
+          {
+            /* Read the first glyph code of the range. */
+            if ( FT_READ_BYTE( glyph_code ) )
+              goto Exit;
+
+            /* Read the number of codes in the range. */
+            if ( FT_READ_BYTE( nleft ) )
+              goto Exit;
+
+            /* Increment nleft, so we read `nleft + 1' codes/sids. */
+            nleft++;
+
+            /* compute max number of character codes */
+            if ( (FT_UInt)nleft > encoding->count )
+              encoding->count = nleft;
+
+            /* Fill in the range of codes/sids. */
+            for ( k = i; k < nleft + i; k++, glyph_code++ )
+            {
+              /* Make sure k is not too big. */
+              if ( k < num_glyphs && glyph_code < 256 )
+              {
+                /* Assign code to GID mapping. */
+                encoding->codes[glyph_code] = (FT_UShort)k;
+
+                /* Assign code to SID mapping. */
+                encoding->sids[glyph_code] = charset->sids[k];
+              }
+            }
+          }
+
+          /* simple check; one never knows what can be found in a font */
+          if ( encoding->count > 256 )
+            encoding->count = 256;
+        }
+        break;
+
+      default:
+        FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      /* Parse supplemental encodings, if any. */
+      if ( encoding->format & 0x80 )
+      {
+        FT_UInt  gindex;
+
+
+        /* count supplements */
+        if ( FT_READ_BYTE( count ) )
+          goto Exit;
+
+        for ( j = 0; j < count; j++ )
+        {
+          /* Read supplemental glyph code. */
+          if ( FT_READ_BYTE( glyph_code ) )
+            goto Exit;
+
+          /* Read the SID associated with this glyph code. */
+          if ( FT_READ_USHORT( glyph_sid ) )
+            goto Exit;
+
+          /* Assign code to SID mapping. */
+          encoding->sids[glyph_code] = glyph_sid;
+
+          /* First, look up GID which has been assigned to */
+          /* SID glyph_sid.                                */
+          for ( gindex = 0; gindex < num_glyphs; gindex++ )
+          {
+            if ( charset->sids[gindex] == glyph_sid )
+            {
+              encoding->codes[glyph_code] = (FT_UShort)gindex;
+              break;
+            }
+          }
+        }
+      }
+    }
+    else
+    {
+      /* We take into account the fact a CFF font can use a predefined */
+      /* encoding without containing all of the glyphs encoded by this */
+      /* encoding (see the note at the end of section 12 in the CFF    */
+      /* specification).                                               */
+
+      switch ( (FT_UInt)offset )
+      {
+      case 0:
+        /* First, copy the code to SID mapping. */
+        FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 );
+        goto Populate;
+
+      case 1:
+        /* First, copy the code to SID mapping. */
+        FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 );
+
+      Populate:
+        /* Construct code to GID mapping from code to SID mapping */
+        /* and charset.                                           */
+
+        encoding->count = 0;
+
+        error = cff_charset_compute_cids( charset, num_glyphs,
+                                          stream->memory );
+        if ( error )
+          goto Exit;
+
+        for ( j = 0; j < 256; j++ )
+        {
+          FT_UInt  sid = encoding->sids[j];
+          FT_UInt  gid = 0;
+
+
+          if ( sid )
+            gid = cff_charset_cid_to_gindex( charset, sid );
+
+          if ( gid != 0 )
+          {
+            encoding->codes[j] = (FT_UShort)gid;
+            encoding->count    = j + 1;
+          }
+          else
+          {
+            encoding->codes[j] = 0;
+            encoding->sids [j] = 0;
+          }
+        }
+        break;
+
+      default:
+        FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+    }
+
+  Exit:
+
+    /* Clean up if there was an error. */
+    return error;
+  }
+
+
+  static FT_Error
+  cff_subfont_load( CFF_SubFont  font,
+                    CFF_Index    idx,
+                    FT_UInt      font_index,
+                    FT_Stream    stream,
+                    FT_ULong     base_offset,
+                    FT_Library   library )
+  {
+    FT_Error         error;
+    CFF_ParserRec    parser;
+    FT_Byte*         dict = NULL;
+    FT_ULong         dict_len;
+    CFF_FontRecDict  top  = &font->font_dict;
+    CFF_Private      priv = &font->private_dict;
+
+
+    cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library );
+
+    /* set defaults */
+    FT_MEM_ZERO( top, sizeof ( *top ) );
+
+    top->underline_position  = -( 100L << 16 );
+    top->underline_thickness = 50L << 16;
+    top->charstring_type     = 2;
+    top->font_matrix.xx      = 0x10000L;
+    top->font_matrix.yy      = 0x10000L;
+    top->cid_count           = 8720;
+
+    /* we use the implementation specific SID value 0xFFFF to indicate */
+    /* missing entries                                                 */
+    top->version             = 0xFFFFU;
+    top->notice              = 0xFFFFU;
+    top->copyright           = 0xFFFFU;
+    top->full_name           = 0xFFFFU;
+    top->family_name         = 0xFFFFU;
+    top->weight              = 0xFFFFU;
+    top->embedded_postscript = 0xFFFFU;
+
+    top->cid_registry        = 0xFFFFU;
+    top->cid_ordering        = 0xFFFFU;
+    top->cid_font_name       = 0xFFFFU;
+
+    error = cff_index_access_element( idx, font_index, &dict, &dict_len );
+    if ( !error )
+    {
+      FT_TRACE4(( " top dictionary:\n" ));
+      error = cff_parser_run( &parser, dict, dict + dict_len );
+    }
+
+    cff_index_forget_element( idx, &dict );
+
+    if ( error )
+      goto Exit;
+
+    /* if it is a CID font, we stop there */
+    if ( top->cid_registry != 0xFFFFU )
+      goto Exit;
+
+    /* parse the private dictionary, if any */
+    if ( top->private_offset && top->private_size )
+    {
+      /* set defaults */
+      FT_MEM_ZERO( priv, sizeof ( *priv ) );
+
+      priv->blue_shift       = 7;
+      priv->blue_fuzz        = 1;
+      priv->lenIV            = -1;
+      priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );
+      priv->blue_scale       = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );
+
+      cff_parser_init( &parser, CFF_CODE_PRIVATE, priv, library );
+
+      if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) ||
+           FT_FRAME_ENTER( font->font_dict.private_size )                 )
+        goto Exit;
+
+      FT_TRACE4(( " private dictionary:\n" ));
+      error = cff_parser_run( &parser,
+                              (FT_Byte*)stream->cursor,
+                              (FT_Byte*)stream->limit );
+      FT_FRAME_EXIT();
+      if ( error )
+        goto Exit;
+
+      /* ensure that `num_blue_values' is even */
+      priv->num_blue_values &= ~1;
+    }
+
+    /* read the local subrs, if any */
+    if ( priv->local_subrs_offset )
+    {
+      if ( FT_STREAM_SEEK( base_offset + top->private_offset +
+                           priv->local_subrs_offset ) )
+        goto Exit;
+
+      error = cff_index_init( &font->local_subrs_index, stream, 1 );
+      if ( error )
+        goto Exit;
+
+      error = cff_index_get_pointers( &font->local_subrs_index,
+                                      &font->local_subrs, NULL );
+      if ( error )
+        goto Exit;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  cff_subfont_done( FT_Memory    memory,
+                    CFF_SubFont  subfont )
+  {
+    if ( subfont )
+    {
+      cff_index_done( &subfont->local_subrs_index );
+      FT_FREE( subfont->local_subrs );
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_font_load( FT_Library library,
+                 FT_Stream  stream,
+                 FT_Int     face_index,
+                 CFF_Font   font,
+                 FT_Bool    pure_cff )
+  {
+    static const FT_Frame_Field  cff_header_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CFF_FontRec
+
+      FT_FRAME_START( 4 ),
+        FT_FRAME_BYTE( version_major ),
+        FT_FRAME_BYTE( version_minor ),
+        FT_FRAME_BYTE( header_size ),
+        FT_FRAME_BYTE( absolute_offsize ),
+      FT_FRAME_END
+    };
+
+    FT_Error         error;
+    FT_Memory        memory = stream->memory;
+    FT_ULong         base_offset;
+    CFF_FontRecDict  dict;
+    CFF_IndexRec     string_index;
+    FT_Int           subfont_index;
+
+
+    FT_ZERO( font );
+    FT_ZERO( &string_index );
+
+    font->stream = stream;
+    font->memory = memory;
+    dict         = &font->top_font.font_dict;
+    base_offset  = FT_STREAM_POS();
+
+    /* read CFF font header */
+    if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) )
+      goto Exit;
+
+    /* check format */
+    if ( font->version_major   != 1 ||
+         font->header_size      < 4 ||
+         font->absolute_offsize > 4 )
+    {
+      FT_TRACE2(( "  not a CFF font header\n" ));
+      error = FT_THROW( Unknown_File_Format );
+      goto Exit;
+    }
+
+    /* skip the rest of the header */
+    if ( FT_STREAM_SKIP( font->header_size - 4 ) )
+      goto Exit;
+
+    /* read the name, top dict, string and global subrs index */
+    if ( FT_SET_ERROR( cff_index_init( &font->name_index,
+                                       stream, 0 ) )                  ||
+         FT_SET_ERROR( cff_index_init( &font->font_dict_index,
+                                       stream, 0 ) )                  ||
+         FT_SET_ERROR( cff_index_init( &string_index,
+                                       stream, 1 ) )                  ||
+         FT_SET_ERROR( cff_index_init( &font->global_subrs_index,
+                                       stream, 1 ) )                  ||
+         FT_SET_ERROR( cff_index_get_pointers( &string_index,
+                                               &font->strings,
+                                               &font->string_pool ) ) )
+      goto Exit;
+
+    font->num_strings = string_index.count;
+
+    if ( pure_cff )
+    {
+      /* well, we don't really forget the `disabled' fonts... */
+      subfont_index = face_index;
+
+      if ( subfont_index >= (FT_Int)font->name_index.count )
+      {
+        FT_ERROR(( "cff_font_load:"
+                   " invalid subfont index for pure CFF font (%d)\n",
+                   subfont_index ));
+        error = FT_THROW( Invalid_Argument );
+        goto Exit;
+      }
+
+      font->num_faces = font->name_index.count;
+    }
+    else
+    {
+      subfont_index = 0;
+
+      if ( font->name_index.count > 1 )
+      {
+        FT_ERROR(( "cff_font_load:"
+                   " invalid CFF font with multiple subfonts\n"
+                   "              "
+                   " in SFNT wrapper\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+    }
+
+    /* in case of a font format check, simply exit now */
+    if ( face_index < 0 )
+      goto Exit;
+
+    /* now, parse the top-level font dictionary */
+    FT_TRACE4(( "parsing top-level\n" ));
+    error = cff_subfont_load( &font->top_font,
+                              &font->font_dict_index,
+                              subfont_index,
+                              stream,
+                              base_offset,
+                              library );
+    if ( error )
+      goto Exit;
+
+    if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )
+      goto Exit;
+
+    error = cff_index_init( &font->charstrings_index, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    /* now, check for a CID font */
+    if ( dict->cid_registry != 0xFFFFU )
+    {
+      CFF_IndexRec  fd_index;
+      CFF_SubFont   sub = NULL;
+      FT_UInt       idx;
+
+
+      /* this is a CID-keyed font, we must now allocate a table of */
+      /* sub-fonts, then load each of them separately              */
+      if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) )
+        goto Exit;
+
+      error = cff_index_init( &fd_index, stream, 0 );
+      if ( error )
+        goto Exit;
+
+      if ( fd_index.count > CFF_MAX_CID_FONTS )
+      {
+        FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" ));
+        goto Fail_CID;
+      }
+
+      /* allocate & read each font dict independently */
+      font->num_subfonts = fd_index.count;
+      if ( FT_NEW_ARRAY( sub, fd_index.count ) )
+        goto Fail_CID;
+
+      /* set up pointer table */
+      for ( idx = 0; idx < fd_index.count; idx++ )
+        font->subfonts[idx] = sub + idx;
+
+      /* now load each subfont independently */
+      for ( idx = 0; idx < fd_index.count; idx++ )
+      {
+        sub = font->subfonts[idx];
+        FT_TRACE4(( "parsing subfont %u\n", idx ));
+        error = cff_subfont_load( sub, &fd_index, idx,
+                                  stream, base_offset, library );
+        if ( error )
+          goto Fail_CID;
+      }
+
+      /* now load the FD Select array */
+      error = CFF_Load_FD_Select( &font->fd_select,
+                                  font->charstrings_index.count,
+                                  stream,
+                                  base_offset + dict->cid_fd_select_offset );
+
+    Fail_CID:
+      cff_index_done( &fd_index );
+
+      if ( error )
+        goto Exit;
+    }
+    else
+      font->num_subfonts = 0;
+
+    /* read the charstrings index now */
+    if ( dict->charstrings_offset == 0 )
+    {
+      FT_ERROR(( "cff_font_load: no charstrings offset\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    font->num_glyphs = font->charstrings_index.count;
+
+    error = cff_index_get_pointers( &font->global_subrs_index,
+                                    &font->global_subrs, NULL );
+
+    if ( error )
+      goto Exit;
+
+    /* read the Charset and Encoding tables if available */
+    if ( font->num_glyphs > 0 )
+    {
+      FT_Bool  invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff );
+
+
+      error = cff_charset_load( &font->charset, font->num_glyphs, stream,
+                                base_offset, dict->charset_offset, invert );
+      if ( error )
+        goto Exit;
+
+      /* CID-keyed CFFs don't have an encoding */
+      if ( dict->cid_registry == 0xFFFFU )
+      {
+        error = cff_encoding_load( &font->encoding,
+                                   &font->charset,
+                                   font->num_glyphs,
+                                   stream,
+                                   base_offset,
+                                   dict->encoding_offset );
+        if ( error )
+          goto Exit;
+      }
+    }
+
+    /* get the font name (/CIDFontName for CID-keyed fonts, */
+    /* /FontName otherwise)                                 */
+    font->font_name = cff_index_get_name( font, subfont_index );
+
+  Exit:
+    cff_index_done( &string_index );
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_font_done( CFF_Font  font )
+  {
+    FT_Memory  memory = font->memory;
+    FT_UInt    idx;
+
+
+    cff_index_done( &font->global_subrs_index );
+    cff_index_done( &font->font_dict_index );
+    cff_index_done( &font->name_index );
+    cff_index_done( &font->charstrings_index );
+
+    /* release font dictionaries, but only if working with */
+    /* a CID keyed CFF font                                */
+    if ( font->num_subfonts > 0 )
+    {
+      for ( idx = 0; idx < font->num_subfonts; idx++ )
+        cff_subfont_done( memory, font->subfonts[idx] );
+
+      /* the subfonts array has been allocated as a single block */
+      FT_FREE( font->subfonts[0] );
+    }
+
+    cff_encoding_done( &font->encoding );
+    cff_charset_done( &font->charset, font->stream );
+
+    cff_subfont_done( memory, &font->top_font );
+
+    CFF_Done_FD_Select( &font->fd_select, font->stream );
+
+    FT_FREE( font->font_info );
+
+    FT_FREE( font->font_name );
+    FT_FREE( font->global_subrs );
+    FT_FREE( font->strings );
+    FT_FREE( font->string_pool );
+
+    if ( font->cf2_instance.finalizer )
+    {
+      font->cf2_instance.finalizer( font->cf2_instance.data );
+      FT_FREE( font->cf2_instance.data );
+    }
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.h
new file mode 100644
index 0000000..50d8017
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.h
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffload.h                                                              */
+/*                                                                         */
+/*    OpenType & CFF data/program tables loader (specification).           */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2007, 2008, 2010 by                   */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFLOAD_H__
+#define __CFFLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "cfftypes.h"
+
+
+FT_BEGIN_HEADER
+
+  FT_LOCAL( FT_UShort )
+  cff_get_standard_encoding( FT_UInt  charcode );
+
+
+  FT_LOCAL( FT_String* )
+  cff_index_get_string( CFF_Font  font,
+                        FT_UInt   element );
+
+  FT_LOCAL( FT_String* )
+  cff_index_get_sid_string( CFF_Font  font,
+                            FT_UInt   sid );
+
+
+  FT_LOCAL( FT_Error )
+  cff_index_access_element( CFF_Index  idx,
+                            FT_UInt    element,
+                            FT_Byte**  pbytes,
+                            FT_ULong*  pbyte_len );
+
+  FT_LOCAL( void )
+  cff_index_forget_element( CFF_Index  idx,
+                            FT_Byte**  pbytes );
+
+  FT_LOCAL( FT_String* )
+  cff_index_get_name( CFF_Font  font,
+                      FT_UInt   element );
+
+
+  FT_LOCAL( FT_UInt )
+  cff_charset_cid_to_gindex( CFF_Charset  charset,
+                             FT_UInt      cid );
+
+
+  FT_LOCAL( FT_Error )
+  cff_font_load( FT_Library library,
+                 FT_Stream  stream,
+                 FT_Int     face_index,
+                 CFF_Font   font,
+                 FT_Bool    pure_cff );
+
+  FT_LOCAL( void )
+  cff_font_done( CFF_Font  font );
+
+
+  FT_LOCAL( FT_Byte )
+  cff_fd_select_get( CFF_FDSelect  fdselect,
+                     FT_UInt       glyph_index );
+
+
+FT_END_HEADER
+
+#endif /* __CFFLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.c
new file mode 100644
index 0000000..b0ec742
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.c
@@ -0,0 +1,1082 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffobjs.c                                                              */
+/*                                                                         */
+/*    OpenType objects manager (body).                                     */
+/*                                                                         */
+/*  Copyright 1996-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/fterrors.h"
+#include "../../include/freetype/ttnameid.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/ftcffdrv.h"
+
+#include "cffobjs.h"
+#include "cffload.h"
+#include "cffcmap.h"
+#include "cffpic.h"
+
+#include "cfferrs.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cffobjs
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            SIZE FUNCTIONS                             */
+  /*                                                                       */
+  /*  Note that we store the global hints in the size's `internal' root    */
+  /*  field.                                                               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static PSH_Globals_Funcs
+  cff_size_get_globals_funcs( CFF_Size  size )
+  {
+    CFF_Face          face     = (CFF_Face)size->root.face;
+    CFF_Font          font     = (CFF_Font)face->extra.data;
+    PSHinter_Service  pshinter = font->pshinter;
+    FT_Module         module;
+
+
+    module = FT_Get_Module( size->root.face->driver->root.library,
+                            "pshinter" );
+    return ( module && pshinter && pshinter->get_globals_funcs )
+           ? pshinter->get_globals_funcs( module )
+           : 0;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_size_done( FT_Size  cffsize )        /* CFF_Size */
+  {
+    CFF_Size      size     = (CFF_Size)cffsize;
+    CFF_Face      face     = (CFF_Face)size->root.face;
+    CFF_Font      font     = (CFF_Font)face->extra.data;
+    CFF_Internal  internal = (CFF_Internal)cffsize->internal;
+
+
+    if ( internal )
+    {
+      PSH_Globals_Funcs  funcs;
+
+
+      funcs = cff_size_get_globals_funcs( size );
+      if ( funcs )
+      {
+        FT_UInt  i;
+
+
+        funcs->destroy( internal->topfont );
+
+        for ( i = font->num_subfonts; i > 0; i-- )
+          funcs->destroy( internal->subfonts[i - 1] );
+      }
+
+      /* `internal' is freed by destroy_size (in ftobjs.c) */
+    }
+  }
+
+
+  /* CFF and Type 1 private dictionaries have slightly different      */
+  /* structures; we need to synthesize a Type 1 dictionary on the fly */
+
+  static void
+  cff_make_private_dict( CFF_SubFont  subfont,
+                         PS_Private   priv )
+  {
+    CFF_Private  cpriv = &subfont->private_dict;
+    FT_UInt      n, count;
+
+
+    FT_MEM_ZERO( priv, sizeof ( *priv ) );
+
+    count = priv->num_blue_values = cpriv->num_blue_values;
+    for ( n = 0; n < count; n++ )
+      priv->blue_values[n] = (FT_Short)cpriv->blue_values[n];
+
+    count = priv->num_other_blues = cpriv->num_other_blues;
+    for ( n = 0; n < count; n++ )
+      priv->other_blues[n] = (FT_Short)cpriv->other_blues[n];
+
+    count = priv->num_family_blues = cpriv->num_family_blues;
+    for ( n = 0; n < count; n++ )
+      priv->family_blues[n] = (FT_Short)cpriv->family_blues[n];
+
+    count = priv->num_family_other_blues = cpriv->num_family_other_blues;
+    for ( n = 0; n < count; n++ )
+      priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n];
+
+    priv->blue_scale = cpriv->blue_scale;
+    priv->blue_shift = (FT_Int)cpriv->blue_shift;
+    priv->blue_fuzz  = (FT_Int)cpriv->blue_fuzz;
+
+    priv->standard_width[0]  = (FT_UShort)cpriv->standard_width;
+    priv->standard_height[0] = (FT_UShort)cpriv->standard_height;
+
+    count = priv->num_snap_widths = cpriv->num_snap_widths;
+    for ( n = 0; n < count; n++ )
+      priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n];
+
+    count = priv->num_snap_heights = cpriv->num_snap_heights;
+    for ( n = 0; n < count; n++ )
+      priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n];
+
+    priv->force_bold     = cpriv->force_bold;
+    priv->language_group = cpriv->language_group;
+    priv->lenIV          = cpriv->lenIV;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_size_init( FT_Size  cffsize )         /* CFF_Size */
+  {
+    CFF_Size           size  = (CFF_Size)cffsize;
+    FT_Error           error = FT_Err_Ok;
+    PSH_Globals_Funcs  funcs = cff_size_get_globals_funcs( size );
+
+
+    if ( funcs )
+    {
+      CFF_Face      face     = (CFF_Face)cffsize->face;
+      CFF_Font      font     = (CFF_Font)face->extra.data;
+      CFF_Internal  internal = NULL;
+
+      PS_PrivateRec  priv;
+      FT_Memory      memory = cffsize->face->memory;
+
+      FT_UInt  i;
+
+
+      if ( FT_NEW( internal ) )
+        goto Exit;
+
+      cff_make_private_dict( &font->top_font, &priv );
+      error = funcs->create( cffsize->face->memory, &priv,
+                             &internal->topfont );
+      if ( error )
+        goto Exit;
+
+      for ( i = font->num_subfonts; i > 0; i-- )
+      {
+        CFF_SubFont  sub = font->subfonts[i - 1];
+
+
+        cff_make_private_dict( sub, &priv );
+        error = funcs->create( cffsize->face->memory, &priv,
+                               &internal->subfonts[i - 1] );
+        if ( error )
+          goto Exit;
+      }
+
+      cffsize->internal = (FT_Size_Internal)(void*)internal;
+    }
+
+    size->strike_index = 0xFFFFFFFFUL;
+
+  Exit:
+    return error;
+  }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_size_select( FT_Size   size,
+                   FT_ULong  strike_index )
+  {
+    CFF_Size           cffsize = (CFF_Size)size;
+    PSH_Globals_Funcs  funcs;
+
+
+    cffsize->strike_index = strike_index;
+
+    FT_Select_Metrics( size->face, strike_index );
+
+    funcs = cff_size_get_globals_funcs( cffsize );
+
+    if ( funcs )
+    {
+      CFF_Face      face     = (CFF_Face)size->face;
+      CFF_Font      font     = (CFF_Font)face->extra.data;
+      CFF_Internal  internal = (CFF_Internal)size->internal;
+
+      FT_ULong  top_upm  = font->top_font.font_dict.units_per_em;
+      FT_UInt   i;
+
+
+      funcs->set_scale( internal->topfont,
+                        size->metrics.x_scale, size->metrics.y_scale,
+                        0, 0 );
+
+      for ( i = font->num_subfonts; i > 0; i-- )
+      {
+        CFF_SubFont  sub     = font->subfonts[i - 1];
+        FT_ULong     sub_upm = sub->font_dict.units_per_em;
+        FT_Pos       x_scale, y_scale;
+
+
+        if ( top_upm != sub_upm )
+        {
+          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
+          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
+        }
+        else
+        {
+          x_scale = size->metrics.x_scale;
+          y_scale = size->metrics.y_scale;
+        }
+
+        funcs->set_scale( internal->subfonts[i - 1],
+                          x_scale, y_scale, 0, 0 );
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_size_request( FT_Size          size,
+                    FT_Size_Request  req )
+  {
+    CFF_Size           cffsize = (CFF_Size)size;
+    PSH_Globals_Funcs  funcs;
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+    if ( FT_HAS_FIXED_SIZES( size->face ) )
+    {
+      CFF_Face      cffface = (CFF_Face)size->face;
+      SFNT_Service  sfnt    = (SFNT_Service)cffface->sfnt;
+      FT_ULong      strike_index;
+
+
+      if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) )
+        cffsize->strike_index = 0xFFFFFFFFUL;
+      else
+        return cff_size_select( size, strike_index );
+    }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+    FT_Request_Metrics( size->face, req );
+
+    funcs = cff_size_get_globals_funcs( cffsize );
+
+    if ( funcs )
+    {
+      CFF_Face      cffface  = (CFF_Face)size->face;
+      CFF_Font      font     = (CFF_Font)cffface->extra.data;
+      CFF_Internal  internal = (CFF_Internal)size->internal;
+
+      FT_ULong  top_upm  = font->top_font.font_dict.units_per_em;
+      FT_UInt   i;
+
+
+      funcs->set_scale( internal->topfont,
+                        size->metrics.x_scale, size->metrics.y_scale,
+                        0, 0 );
+
+      for ( i = font->num_subfonts; i > 0; i-- )
+      {
+        CFF_SubFont  sub     = font->subfonts[i - 1];
+        FT_ULong     sub_upm = sub->font_dict.units_per_em;
+        FT_Pos       x_scale, y_scale;
+
+
+        if ( top_upm != sub_upm )
+        {
+          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
+          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
+        }
+        else
+        {
+          x_scale = size->metrics.x_scale;
+          y_scale = size->metrics.y_scale;
+        }
+
+        funcs->set_scale( internal->subfonts[i - 1],
+                          x_scale, y_scale, 0, 0 );
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            SLOT  FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  cff_slot_done( FT_GlyphSlot  slot )
+  {
+    slot->internal->glyph_hints = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_slot_init( FT_GlyphSlot  slot )
+  {
+    CFF_Face          face     = (CFF_Face)slot->face;
+    CFF_Font          font     = (CFF_Font)face->extra.data;
+    PSHinter_Service  pshinter = font->pshinter;
+
+
+    if ( pshinter )
+    {
+      FT_Module  module;
+
+
+      module = FT_Get_Module( slot->face->driver->root.library,
+                              "pshinter" );
+      if ( module )
+      {
+        T2_Hints_Funcs  funcs;
+
+
+        funcs = pshinter->get_t2_funcs( module );
+        slot->internal->glyph_hints = (void*)funcs;
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                           FACE  FUNCTIONS                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+  static FT_String*
+  cff_strcpy( FT_Memory         memory,
+              const FT_String*  source )
+  {
+    FT_Error    error;
+    FT_String*  result;
+
+
+    (void)FT_STRDUP( result, source );
+
+    FT_UNUSED( error );
+
+    return result;
+  }
+
+
+  /* Strip all subset prefixes of the form `ABCDEF+'.  Usually, there */
+  /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold'   */
+  /* have been seen in the wild.                                      */
+
+  static void
+  remove_subset_prefix( FT_String*  name )
+  {
+    FT_Int32  idx             = 0;
+    FT_Int32  length          = (FT_Int32)strlen( name ) + 1;
+    FT_Bool   continue_search = 1;
+
+
+    while ( continue_search )
+    {
+      if ( length >= 7 && name[6] == '+' )
+      {
+        for ( idx = 0; idx < 6; idx++ )
+        {
+          /* ASCII uppercase letters */
+          if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) )
+            continue_search = 0;
+        }
+
+        if ( continue_search )
+        {
+          for ( idx = 7; idx < length; idx++ )
+            name[idx - 7] = name[idx];
+          length -= 7;
+        }
+      }
+      else
+        continue_search = 0;
+    }
+  }
+
+
+  /* Remove the style part from the family name (if present). */
+
+  static void
+  remove_style( FT_String*        family_name,
+                const FT_String*  style_name )
+  {
+    FT_Int32  family_name_length, style_name_length;
+
+
+    family_name_length = (FT_Int32)strlen( family_name );
+    style_name_length  = (FT_Int32)strlen( style_name );
+
+    if ( family_name_length > style_name_length )
+    {
+      FT_Int  idx;
+
+
+      for ( idx = 1; idx <= style_name_length; ++idx )
+      {
+        if ( family_name[family_name_length - idx] !=
+             style_name[style_name_length - idx] )
+          break;
+      }
+
+      if ( idx > style_name_length )
+      {
+        /* family_name ends with style_name; remove it */
+        idx = family_name_length - style_name_length - 1;
+
+        /* also remove special characters     */
+        /* between real family name and style */
+        while ( idx > 0                     &&
+                ( family_name[idx] == '-' ||
+                  family_name[idx] == ' ' ||
+                  family_name[idx] == '_' ||
+                  family_name[idx] == '+' ) )
+          --idx;
+
+        if ( idx > 0 )
+          family_name[idx + 1] = '\0';
+      }
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_face_init( FT_Stream      stream,
+                 FT_Face        cffface,        /* CFF_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params )
+  {
+    CFF_Face            face        = (CFF_Face)cffface;
+    FT_Error            error;
+    SFNT_Service        sfnt;
+    FT_Service_PsCMaps  psnames;
+    PSHinter_Service    pshinter;
+    FT_Bool             pure_cff    = 1;
+    FT_Bool             sfnt_format = 0;
+    FT_Library          library     = cffface->driver->root.library;
+
+
+    sfnt = (SFNT_Service)FT_Get_Module_Interface(
+             library, "sfnt" );
+    if ( !sfnt )
+    {
+      FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" ));
+      error = FT_THROW( Missing_Module );
+      goto Exit;
+    }
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+
+    pshinter = (PSHinter_Service)FT_Get_Module_Interface(
+                 library, "pshinter" );
+
+    FT_TRACE2(( "CFF driver\n" ));
+
+    /* create input stream from resource */
+    if ( FT_STREAM_SEEK( 0 ) )
+      goto Exit;
+
+    /* check whether we have a valid OpenType file */
+    error = sfnt->init_face( stream, face, face_index, num_params, params );
+    if ( !error )
+    {
+      if ( face->format_tag != TTAG_OTTO && 
+		   face->format_tag != 0x00010000UL )  /* `OTTO'; OpenType/CFF font */
+      {
+        FT_TRACE2(( "  not an OpenType/CFF font\n" ));
+        error = FT_THROW( Unknown_File_Format );
+        goto Exit;
+      }
+
+      /* if we are performing a simple font format check, exit immediately */
+      if ( face_index < 0 )
+        return FT_Err_Ok;
+
+      sfnt_format = 1;
+
+      /* now, the font can be either an OpenType/CFF font, or an SVG CEF */
+      /* font; in the latter case it doesn't have a `head' table         */
+      error = face->goto_table( face, TTAG_head, stream, 0 );
+      if ( !error )
+      {
+        pure_cff = 0;
+
+        /* load font directory */
+        error = sfnt->load_face( stream, face, face_index,
+                                 num_params, params );
+        if ( error )
+          goto Exit;
+      }
+      else
+      {
+        /* load the `cmap' table explicitly */
+        error = sfnt->load_cmap( face, stream );
+        if ( error )
+          goto Exit;
+      }
+
+      /* now load the CFF part of the file */
+      error = face->goto_table( face, TTAG_CFF, stream, 0 );
+      if ( error )
+        goto Exit;
+    }
+    else
+    {
+      /* rewind to start of file; we are going to load a pure-CFF font */
+      if ( FT_STREAM_SEEK( 0 ) )
+        goto Exit;
+      error = FT_Err_Ok;
+    }
+
+    /* now load and parse the CFF table in the file */
+    {
+      CFF_Font         cff = NULL;
+      CFF_FontRecDict  dict;
+      FT_Memory        memory = cffface->memory;
+      FT_Int32         flags;
+      FT_UInt          i;
+
+
+      if ( FT_NEW( cff ) )
+        goto Exit;
+
+      face->extra.data = cff;
+      error = cff_font_load( library, stream, face_index, cff, pure_cff );
+      if ( error )
+        goto Exit;
+
+      cff->pshinter = pshinter;
+      cff->psnames  = psnames;
+
+      cffface->face_index = face_index;
+
+      /* Complement the root flags with some interesting information. */
+      /* Note that this is only necessary for pure CFF and CEF fonts; */
+      /* SFNT based fonts use the `name' table instead.               */
+
+      cffface->num_glyphs = cff->num_glyphs;
+
+      dict = &cff->top_font.font_dict;
+
+      /* we need the `PSNames' module for CFF and CEF formats */
+      /* which aren't CID-keyed                               */
+      if ( dict->cid_registry == 0xFFFFU && !psnames )
+      {
+        FT_ERROR(( "cff_face_init:"
+                   " cannot open CFF & CEF fonts\n"
+                   "              "
+                   " without the `PSNames' module\n" ));
+        error = FT_THROW( Missing_Module );
+        goto Exit;
+      }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+      {
+        FT_UInt     idx;
+        FT_String*  s;
+
+
+        FT_TRACE4(( "SIDs\n" ));
+
+        /* dump string index, including default strings for convenience */
+        for ( idx = 0; idx < cff->num_strings + 390; idx++ )
+        {
+          s = cff_index_get_sid_string( cff, idx );
+          if ( s )
+            FT_TRACE4(("  %5d %s\n", idx, s ));
+        }
+      }
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+      if ( !dict->has_font_matrix )
+        dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM;
+
+      /* Normalize the font matrix so that `matrix->xx' is 1; the */
+      /* scaling is done with `units_per_em' then (at this point, */
+      /* it already contains the scaling factor, but without      */
+      /* normalization of the matrix).                            */
+      /*                                                          */
+      /* Note that the offsets must be expressed in integer font  */
+      /* units.                                                   */
+
+      {
+        FT_Matrix*  matrix = &dict->font_matrix;
+        FT_Vector*  offset = &dict->font_offset;
+        FT_ULong*   upm    = &dict->units_per_em;
+        FT_Fixed    temp   = FT_ABS( matrix->yy );
+
+
+        if ( temp != 0x10000L )
+        {
+          *upm = FT_DivFix( *upm, temp );
+
+          matrix->xx = FT_DivFix( matrix->xx, temp );
+          matrix->yx = FT_DivFix( matrix->yx, temp );
+          matrix->xy = FT_DivFix( matrix->xy, temp );
+          matrix->yy = FT_DivFix( matrix->yy, temp );
+          offset->x  = FT_DivFix( offset->x,  temp );
+          offset->y  = FT_DivFix( offset->y,  temp );
+        }
+
+        offset->x >>= 16;
+        offset->y >>= 16;
+      }
+
+      for ( i = cff->num_subfonts; i > 0; i-- )
+      {
+        CFF_FontRecDict  sub = &cff->subfonts[i - 1]->font_dict;
+        CFF_FontRecDict  top = &cff->top_font.font_dict;
+
+        FT_Matrix*  matrix;
+        FT_Vector*  offset;
+        FT_ULong*   upm;
+        FT_Fixed    temp;
+
+
+        if ( sub->has_font_matrix )
+        {
+          FT_Long  scaling;
+
+
+          /* if we have a top-level matrix, */
+          /* concatenate the subfont matrix */
+
+          if ( top->has_font_matrix )
+          {
+            if ( top->units_per_em > 1 && sub->units_per_em > 1 )
+              scaling = FT_MIN( top->units_per_em, sub->units_per_em );
+            else
+              scaling = 1;
+
+            FT_Matrix_Multiply_Scaled( &top->font_matrix,
+                                       &sub->font_matrix,
+                                       scaling );
+            FT_Vector_Transform_Scaled( &sub->font_offset,
+                                        &top->font_matrix,
+                                        scaling );
+
+            sub->units_per_em = FT_MulDiv( sub->units_per_em,
+                                           top->units_per_em,
+                                           scaling );
+          }
+        }
+        else
+        {
+          sub->font_matrix = top->font_matrix;
+          sub->font_offset = top->font_offset;
+
+          sub->units_per_em = top->units_per_em;
+        }
+
+        matrix = &sub->font_matrix;
+        offset = &sub->font_offset;
+        upm    = &sub->units_per_em;
+        temp   = FT_ABS( matrix->yy );
+
+        if ( temp != 0x10000L )
+        {
+          *upm = FT_DivFix( *upm, temp );
+
+          matrix->xx = FT_DivFix( matrix->xx, temp );
+          matrix->yx = FT_DivFix( matrix->yx, temp );
+          matrix->xy = FT_DivFix( matrix->xy, temp );
+          matrix->yy = FT_DivFix( matrix->yy, temp );
+          offset->x  = FT_DivFix( offset->x,  temp );
+          offset->y  = FT_DivFix( offset->y,  temp );
+        }
+
+        offset->x >>= 16;
+        offset->y >>= 16;
+      }
+
+      if ( pure_cff )
+      {
+        char*  style_name = NULL;
+
+
+        /* set up num_faces */
+        cffface->num_faces = cff->num_faces;
+
+        /* compute number of glyphs */
+        if ( dict->cid_registry != 0xFFFFU )
+          cffface->num_glyphs = cff->charset.max_cid + 1;
+        else
+          cffface->num_glyphs = cff->charstrings_index.count;
+
+        /* set global bbox, as well as EM size */
+        cffface->bbox.xMin =   dict->font_bbox.xMin            >> 16;
+        cffface->bbox.yMin =   dict->font_bbox.yMin            >> 16;
+        /* no `U' suffix here to 0xFFFF! */
+        cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16;
+        cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16;
+
+        cffface->units_per_EM = (FT_UShort)( dict->units_per_em );
+
+        cffface->ascender  = (FT_Short)( cffface->bbox.yMax );
+        cffface->descender = (FT_Short)( cffface->bbox.yMin );
+
+        cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 );
+        if ( cffface->height < cffface->ascender - cffface->descender )
+          cffface->height = (FT_Short)( cffface->ascender - cffface->descender );
+
+        cffface->underline_position  =
+          (FT_Short)( dict->underline_position >> 16 );
+        cffface->underline_thickness =
+          (FT_Short)( dict->underline_thickness >> 16 );
+
+        /* retrieve font family & style name */
+        cffface->family_name = cff_index_get_name( cff, face_index );
+        if ( cffface->family_name )
+        {
+          char*  full   = cff_index_get_sid_string( cff,
+                                                    dict->full_name );
+          char*  fullp  = full;
+          char*  family = cffface->family_name;
+          char*  family_name = NULL;
+
+
+          remove_subset_prefix( cffface->family_name );
+
+          if ( dict->family_name )
+          {
+            family_name = cff_index_get_sid_string( cff,
+                                                    dict->family_name );
+            if ( family_name )
+              family = family_name;
+          }
+
+          /* We try to extract the style name from the full name.   */
+          /* We need to ignore spaces and dashes during the search. */
+          if ( full && family )
+          {
+            while ( *fullp )
+            {
+              /* skip common characters at the start of both strings */
+              if ( *fullp == *family )
+              {
+                family++;
+                fullp++;
+                continue;
+              }
+
+              /* ignore spaces and dashes in full name during comparison */
+              if ( *fullp == ' ' || *fullp == '-' )
+              {
+                fullp++;
+                continue;
+              }
+
+              /* ignore spaces and dashes in family name during comparison */
+              if ( *family == ' ' || *family == '-' )
+              {
+                family++;
+                continue;
+              }
+
+              if ( !*family && *fullp )
+              {
+                /* The full name begins with the same characters as the  */
+                /* family name, with spaces and dashes removed.  In this */
+                /* case, the remaining string in `fullp' will be used as */
+                /* the style name.                                       */
+                style_name = cff_strcpy( memory, fullp );
+
+                /* remove the style part from the family name (if present) */
+                remove_style( cffface->family_name, style_name );
+              }
+              break;
+            }
+          }
+        }
+        else
+        {
+          char  *cid_font_name =
+                   cff_index_get_sid_string( cff,
+                                             dict->cid_font_name );
+
+
+          /* do we have a `/FontName' for a CID-keyed font? */
+          if ( cid_font_name )
+            cffface->family_name = cff_strcpy( memory, cid_font_name );
+        }
+
+        if ( style_name )
+          cffface->style_name = style_name;
+        else
+          /* assume "Regular" style if we don't know better */
+          cffface->style_name = cff_strcpy( memory, (char *)"Regular" );
+
+        /*******************************************************************/
+        /*                                                                 */
+        /* Compute face flags.                                             */
+        /*                                                                 */
+        flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */
+                FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */
+                FT_FACE_FLAG_HINTER;      /* has native hinter */
+
+        if ( sfnt_format )
+          flags |= FT_FACE_FLAG_SFNT;
+
+        /* fixed width font? */
+        if ( dict->is_fixed_pitch )
+          flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+  /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */
+#if 0
+        /* kerning available? */
+        if ( face->kern_pairs )
+          flags |= FT_FACE_FLAG_KERNING;
+#endif
+
+        cffface->face_flags = flags;
+
+        /*******************************************************************/
+        /*                                                                 */
+        /* Compute style flags.                                            */
+        /*                                                                 */
+        flags = 0;
+
+        if ( dict->italic_angle )
+          flags |= FT_STYLE_FLAG_ITALIC;
+
+        {
+          char  *weight = cff_index_get_sid_string( cff,
+                                                    dict->weight );
+
+
+          if ( weight )
+            if ( !ft_strcmp( weight, "Bold"  ) ||
+                 !ft_strcmp( weight, "Black" ) )
+              flags |= FT_STYLE_FLAG_BOLD;
+        }
+
+        /* double check */
+        if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name )
+          if ( !ft_strncmp( cffface->style_name, "Bold", 4 )  ||
+               !ft_strncmp( cffface->style_name, "Black", 5 ) )
+            flags |= FT_STYLE_FLAG_BOLD;
+
+		if ( !(flags & FT_STYLE_FLAG_ITALIC) && cffface->style_name )
+			if ( !ft_strncmp( cffface->style_name, "Italic", 6 ) )
+          flags |= FT_STYLE_FLAG_ITALIC;
+
+        cffface->style_flags = flags;
+      }
+
+
+#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
+      /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */
+      /* has unset this flag because of the 3.0 `post' table.          */
+      if ( dict->cid_registry == 0xFFFFU )
+        cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
+#endif
+
+      if ( dict->cid_registry != 0xFFFFU && pure_cff )
+        cffface->face_flags |= FT_FACE_FLAG_CID_KEYED;
+
+
+      /*******************************************************************/
+      /*                                                                 */
+      /* Compute char maps.                                              */
+      /*                                                                 */
+
+      /* Try to synthesize a Unicode charmap if there is none available */
+      /* already.  If an OpenType font contains a Unicode "cmap", we    */
+      /* will use it, whatever be in the CFF part of the file.          */
+      {
+        FT_CharMapRec  cmaprec;
+        FT_CharMap     cmap;
+        FT_UInt        nn;
+        CFF_Encoding   encoding = &cff->encoding;
+
+
+        for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ )
+        {
+          cmap = cffface->charmaps[nn];
+
+          /* Windows Unicode? */
+          if ( cmap->platform_id == TT_PLATFORM_MICROSOFT &&
+               cmap->encoding_id == TT_MS_ID_UNICODE_CS   )
+            goto Skip_Unicode;
+
+          /* Apple Unicode platform id? */
+          if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE )
+            goto Skip_Unicode; /* Apple Unicode */
+        }
+
+        /* since CID-keyed fonts don't contain glyph names, we can't */
+        /* construct a cmap                                          */
+        if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU )
+          goto Exit;
+
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+        if ( nn + 1 > FT_MAX_CHARMAP_CACHEABLE )
+        {
+          FT_ERROR(( "cff_face_init: no Unicode cmap is found, "
+                     "and too many subtables (%d) to add synthesized cmap\n",
+                     nn ));
+          goto Exit;
+        }
+#endif
+
+        /* we didn't find a Unicode charmap -- synthesize one */
+        cmaprec.face        = cffface;
+        cmaprec.platform_id = TT_PLATFORM_MICROSOFT;
+        cmaprec.encoding_id = TT_MS_ID_UNICODE_CS;
+        cmaprec.encoding    = FT_ENCODING_UNICODE;
+
+        nn = (FT_UInt)cffface->num_charmaps;
+
+        error = FT_CMap_New( &CFF_CMAP_UNICODE_CLASS_REC_GET, NULL,
+                             &cmaprec, NULL );
+        if ( error                                      &&
+             FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )
+          goto Exit;
+        error = FT_Err_Ok;
+
+        /* if no Unicode charmap was previously selected, select this one */
+        if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps )
+          cffface->charmap = cffface->charmaps[nn];
+
+      Skip_Unicode:
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+        if ( nn > FT_MAX_CHARMAP_CACHEABLE )
+        {
+          FT_ERROR(( "cff_face_init: Unicode cmap is found, "
+                     "but too many preceding subtables (%d) to access\n",
+                     nn - 1 ));
+          goto Exit;
+        }
+#endif
+        if ( encoding->count > 0 )
+        {
+          FT_CMap_Class  clazz;
+
+
+          cmaprec.face        = cffface;
+          cmaprec.platform_id = TT_PLATFORM_ADOBE;  /* Adobe platform id */
+
+          if ( encoding->offset == 0 )
+          {
+            cmaprec.encoding_id = TT_ADOBE_ID_STANDARD;
+            cmaprec.encoding    = FT_ENCODING_ADOBE_STANDARD;
+            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;
+          }
+          else if ( encoding->offset == 1 )
+          {
+            cmaprec.encoding_id = TT_ADOBE_ID_EXPERT;
+            cmaprec.encoding    = FT_ENCODING_ADOBE_EXPERT;
+            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;
+          }
+          else
+          {
+            cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM;
+            cmaprec.encoding    = FT_ENCODING_ADOBE_CUSTOM;
+            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;
+          }
+
+          error = FT_CMap_New( clazz, NULL, &cmaprec, NULL );
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_face_done( FT_Face  cffface )         /* CFF_Face */
+  {
+    CFF_Face      face = (CFF_Face)cffface;
+    FT_Memory     memory;
+    SFNT_Service  sfnt;
+
+
+    if ( !face )
+      return;
+
+    memory = cffface->memory;
+    sfnt   = (SFNT_Service)face->sfnt;
+
+    if ( sfnt )
+      sfnt->done_face( face );
+
+    {
+      CFF_Font  cff = (CFF_Font)face->extra.data;
+
+
+      if ( cff )
+      {
+        cff_font_done( cff );
+        FT_FREE( face->extra.data );
+      }
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_driver_init( FT_Module  module )        /* CFF_Driver */
+  {
+    CFF_Driver  driver = (CFF_Driver)module;
+
+
+    /* set default property values */
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+    driver->hinting_engine    = FT_CFF_HINTING_FREETYPE;
+#else
+    driver->hinting_engine    = FT_CFF_HINTING_ADOBE;
+#endif
+    driver->no_stem_darkening = FALSE;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_driver_done( FT_Module  module )        /* CFF_Driver */
+  {
+    FT_UNUSED( module );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.h
new file mode 100644
index 0000000..a10232f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.h
@@ -0,0 +1,183 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffobjs.h                                                              */
+/*                                                                         */
+/*    OpenType objects manager (specification).                            */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006-2008, 2013 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFOBJS_H__
+#define __CFFOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "cfftypes.h"
+#include "../../include/freetype/internal/tttypes.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/pshints.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CFF_Driver                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an OpenType driver object.                             */
+  /*                                                                       */
+  typedef struct CFF_DriverRec_*  CFF_Driver;
+
+  typedef TT_Face  CFF_Face;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CFF_Size                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an OpenType size object.                               */
+  /*                                                                       */
+  typedef struct  CFF_SizeRec_
+  {
+    FT_SizeRec  root;
+    FT_ULong    strike_index;    /* 0xFFFFFFFF to indicate invalid */
+
+  } CFF_SizeRec, *CFF_Size;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CFF_GlyphSlot                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an OpenType glyph slot object.                         */
+  /*                                                                       */
+  typedef struct  CFF_GlyphSlotRec_
+  {
+    FT_GlyphSlotRec  root;
+
+    FT_Bool          hint;
+    FT_Bool          scaled;
+
+    FT_Fixed         x_scale;
+    FT_Fixed         y_scale;
+
+  } CFF_GlyphSlotRec, *CFF_GlyphSlot;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CFF_Internal                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The interface to the `internal' field of `FT_Size'.                */
+  /*                                                                       */
+  typedef struct  CFF_InternalRec_
+  {
+    PSH_Globals  topfont;
+    PSH_Globals  subfonts[CFF_MAX_CID_FONTS];
+
+  } CFF_InternalRec, *CFF_Internal;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Subglyph transformation record.                                       */
+  /*                                                                       */
+  typedef struct  CFF_Transform_
+  {
+    FT_Fixed    xx, xy;     /* transformation matrix coefficients */
+    FT_Fixed    yx, yy;
+    FT_F26Dot6  ox, oy;     /* offsets        */
+
+  } CFF_Transform;
+
+
+  /***********************************************************************/
+  /*                                                                     */
+  /* CFF driver class.                                                   */
+  /*                                                                     */
+  typedef struct  CFF_DriverRec_
+  {
+    FT_DriverRec  root;
+
+    FT_UInt  hinting_engine;
+    FT_Bool  no_stem_darkening;
+
+  } CFF_DriverRec;
+
+
+  FT_LOCAL( FT_Error )
+  cff_size_init( FT_Size  size );           /* CFF_Size */
+
+  FT_LOCAL( void )
+  cff_size_done( FT_Size  size );           /* CFF_Size */
+
+  FT_LOCAL( FT_Error )
+  cff_size_request( FT_Size          size,
+                    FT_Size_Request  req );
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+  FT_LOCAL( FT_Error )
+  cff_size_select( FT_Size   size,
+                   FT_ULong  strike_index );
+
+#endif
+
+  FT_LOCAL( void )
+  cff_slot_done( FT_GlyphSlot  slot );
+
+  FT_LOCAL( FT_Error )
+  cff_slot_init( FT_GlyphSlot  slot );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Face functions                                                        */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  cff_face_init( FT_Stream      stream,
+                 FT_Face        face,           /* CFF_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params );
+
+  FT_LOCAL( void )
+  cff_face_done( FT_Face  face );               /* CFF_Face */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Driver functions                                                      */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  cff_driver_init( FT_Module  module );         /* CFF_Driver */
+
+  FT_LOCAL( void )
+  cff_driver_done( FT_Module  module );         /* CFF_Driver */
+
+
+FT_END_HEADER
+
+#endif /* __CFFOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.c
new file mode 100644
index 0000000..b2d8553
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.c
@@ -0,0 +1,1177 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffparse.c                                                             */
+/*                                                                         */
+/*    CFF token stream parser (body)                                       */
+/*                                                                         */
+/*  Copyright 1996-2004, 2007-2013 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "cffparse.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cfferrs.h"
+#include "cffpic.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cffparse
+
+
+  FT_LOCAL_DEF( void )
+  cff_parser_init( CFF_Parser  parser,
+                   FT_UInt     code,
+                   void*       object,
+                   FT_Library  library)
+  {
+    FT_MEM_ZERO( parser, sizeof ( *parser ) );
+
+    parser->top         = parser->stack;
+    parser->object_code = code;
+    parser->object      = object;
+    parser->library     = library;
+  }
+
+
+  /* read an integer */
+  static FT_Long
+  cff_parse_integer( FT_Byte*  start,
+                     FT_Byte*  limit )
+  {
+    FT_Byte*  p   = start;
+    FT_Int    v   = *p++;
+    FT_Long   val = 0;
+
+
+    if ( v == 28 )
+    {
+      if ( p + 2 > limit )
+        goto Bad;
+
+      val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] );
+      p  += 2;
+    }
+    else if ( v == 29 )
+    {
+      if ( p + 4 > limit )
+        goto Bad;
+
+      val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) |
+                       ( (FT_ULong)p[1] << 16 ) |
+                       ( (FT_ULong)p[2] <<  8 ) |
+                         (FT_ULong)p[3]         );
+      p += 4;
+    }
+    else if ( v < 247 )
+    {
+      val = v - 139;
+    }
+    else if ( v < 251 )
+    {
+      if ( p + 1 > limit )
+        goto Bad;
+
+      val = ( v - 247 ) * 256 + p[0] + 108;
+      p++;
+    }
+    else
+    {
+      if ( p + 1 > limit )
+        goto Bad;
+
+      val = -( v - 251 ) * 256 - p[0] - 108;
+      p++;
+    }
+
+  Exit:
+    return val;
+
+  Bad:
+    val = 0;
+    FT_TRACE4(( "!!!END OF DATA:!!!" ));
+    goto Exit;
+  }
+
+
+  static const FT_Long power_tens[] =
+  {
+    1L,
+    10L,
+    100L,
+    1000L,
+    10000L,
+    100000L,
+    1000000L,
+    10000000L,
+    100000000L,
+    1000000000L
+  };
+
+
+  /* read a real */
+  static FT_Fixed
+  cff_parse_real( FT_Byte*  start,
+                  FT_Byte*  limit,
+                  FT_Long   power_ten,
+                  FT_Long*  scaling )
+  {
+    FT_Byte*  p = start;
+    FT_UInt   nib;
+    FT_UInt   phase;
+
+    FT_Long   result, number, exponent;
+    FT_Int    sign = 0, exponent_sign = 0, have_overflow = 0;
+    FT_Long   exponent_add, integer_length, fraction_length;
+
+
+    if ( scaling )
+      *scaling = 0;
+
+    result = 0;
+
+    number   = 0;
+    exponent = 0;
+
+    exponent_add    = 0;
+    integer_length  = 0;
+    fraction_length = 0;
+
+    /* First of all, read the integer part. */
+    phase = 4;
+
+    for (;;)
+    {
+      /* If we entered this iteration with phase == 4, we need to */
+      /* read a new byte.  This also skips past the initial 0x1E. */
+      if ( phase )
+      {
+        p++;
+
+        /* Make sure we don't read past the end. */
+        if ( p >= limit )
+          goto Bad;
+      }
+
+      /* Get the nibble. */
+      nib   = ( p[0] >> phase ) & 0xF;
+      phase = 4 - phase;
+
+      if ( nib == 0xE )
+        sign = 1;
+      else if ( nib > 9 )
+        break;
+      else
+      {
+        /* Increase exponent if we can't add the digit. */
+        if ( number >= 0xCCCCCCCL )
+          exponent_add++;
+        /* Skip leading zeros. */
+        else if ( nib || number )
+        {
+          integer_length++;
+          number = number * 10 + nib;
+        }
+      }
+    }
+
+    /* Read fraction part, if any. */
+    if ( nib == 0xa )
+      for (;;)
+      {
+        /* If we entered this iteration with phase == 4, we need */
+        /* to read a new byte.                                   */
+        if ( phase )
+        {
+          p++;
+
+          /* Make sure we don't read past the end. */
+          if ( p >= limit )
+            goto Bad;
+        }
+
+        /* Get the nibble. */
+        nib   = ( p[0] >> phase ) & 0xF;
+        phase = 4 - phase;
+        if ( nib >= 10 )
+          break;
+
+        /* Skip leading zeros if possible. */
+        if ( !nib && !number )
+          exponent_add--;
+        /* Only add digit if we don't overflow. */
+        else if ( number < 0xCCCCCCCL && fraction_length < 9 )
+        {
+          fraction_length++;
+          number = number * 10 + nib;
+        }
+      }
+
+    /* Read exponent, if any. */
+    if ( nib == 12 )
+    {
+      exponent_sign = 1;
+      nib           = 11;
+    }
+
+    if ( nib == 11 )
+    {
+      for (;;)
+      {
+        /* If we entered this iteration with phase == 4, */
+        /* we need to read a new byte.                   */
+        if ( phase )
+        {
+          p++;
+
+          /* Make sure we don't read past the end. */
+          if ( p >= limit )
+            goto Bad;
+        }
+
+        /* Get the nibble. */
+        nib   = ( p[0] >> phase ) & 0xF;
+        phase = 4 - phase;
+        if ( nib >= 10 )
+          break;
+
+        /* Arbitrarily limit exponent. */
+        if ( exponent > 1000 )
+          have_overflow = 1;
+        else
+          exponent = exponent * 10 + nib;
+      }
+
+      if ( exponent_sign )
+        exponent = -exponent;
+    }
+
+    if ( !number )
+      goto Exit;
+
+    if ( have_overflow )
+    {
+      if ( exponent_sign )
+        goto Underflow;
+      else
+        goto Overflow;
+    }
+
+    /* We don't check `power_ten' and `exponent_add'. */
+    exponent += power_ten + exponent_add;
+
+    if ( scaling )
+    {
+      /* Only use `fraction_length'. */
+      fraction_length += integer_length;
+      exponent        += integer_length;
+
+      if ( fraction_length <= 5 )
+      {
+        if ( number > 0x7FFFL )
+        {
+          result   = FT_DivFix( number, 10 );
+          *scaling = exponent - fraction_length + 1;
+        }
+        else
+        {
+          if ( exponent > 0 )
+          {
+            FT_Long  new_fraction_length, shift;
+
+
+            /* Make `scaling' as small as possible. */
+            new_fraction_length = FT_MIN( exponent, 5 );
+            shift               = new_fraction_length - fraction_length;
+
+            if ( shift > 0 )
+            {
+              exponent -= new_fraction_length;
+              number   *= power_tens[shift];
+              if ( number > 0x7FFFL )
+              {
+                number   /= 10;
+                exponent += 1;
+              }
+            }
+            else
+              exponent -= fraction_length;
+          }
+          else
+            exponent -= fraction_length;
+
+          result   = (FT_Long)( (FT_ULong)number << 16 );
+          *scaling = exponent;
+        }
+      }
+      else
+      {
+        if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL )
+        {
+          result   = FT_DivFix( number, power_tens[fraction_length - 4] );
+          *scaling = exponent - 4;
+        }
+        else
+        {
+          result   = FT_DivFix( number, power_tens[fraction_length - 5] );
+          *scaling = exponent - 5;
+        }
+      }
+    }
+    else
+    {
+      integer_length  += exponent;
+      fraction_length -= exponent;
+
+      if ( integer_length > 5 )
+        goto Overflow;
+      if ( integer_length < -5 )
+        goto Underflow;
+
+      /* Remove non-significant digits. */
+      if ( integer_length < 0 )
+      {
+        number          /= power_tens[-integer_length];
+        fraction_length += integer_length;
+      }
+
+      /* this can only happen if exponent was non-zero */
+      if ( fraction_length == 10 )
+      {
+        number          /= 10;
+        fraction_length -= 1;
+      }
+
+      /* Convert into 16.16 format. */
+      if ( fraction_length > 0 )
+      {
+        if ( ( number / power_tens[fraction_length] ) > 0x7FFFL )
+          goto Exit;
+
+        result = FT_DivFix( number, power_tens[fraction_length] );
+      }
+      else
+      {
+        number *= power_tens[-fraction_length];
+
+        if ( number > 0x7FFFL )
+          goto Overflow;
+
+        result = (FT_Long)( (FT_ULong)number << 16 );
+      }
+    }
+
+  Exit:
+    if ( sign )
+      result = -result;
+
+    return result;
+
+  Overflow:
+    result = 0x7FFFFFFFL;
+    FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+    goto Exit;
+
+  Underflow:
+    result = 0;
+    FT_TRACE4(( "!!!UNDERFLOW:!!!" ));
+    goto Exit;
+
+  Bad:
+    result = 0;
+    FT_TRACE4(( "!!!END OF DATA:!!!" ));
+    goto Exit;
+  }
+
+
+  /* read a number, either integer or real */
+  static FT_Long
+  cff_parse_num( FT_Byte**  d )
+  {
+    return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 )
+                     :   cff_parse_integer( d[0], d[1] );
+  }
+
+
+  /* read a floating point number, either integer or real */
+  static FT_Fixed
+  do_fixed( FT_Byte**  d,
+            FT_Long    scaling )
+  {
+    if ( **d == 30 )
+      return cff_parse_real( d[0], d[1], scaling, NULL );
+    else
+    {
+      FT_Long  val = cff_parse_integer( d[0], d[1] );
+
+
+      if ( scaling )
+        val *= power_tens[scaling];
+
+      if ( val > 0x7FFF )
+      {
+        val = 0x7FFFFFFFL;
+        goto Overflow;
+      }
+      else if ( val < -0x7FFF )
+      {
+        val = -0x7FFFFFFFL;
+        goto Overflow;
+      }
+
+      return (FT_Long)( (FT_ULong)val << 16 );
+
+    Overflow:
+      FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+      return val;
+    }
+  }
+
+
+  /* read a floating point number, either integer or real */
+  static FT_Fixed
+  cff_parse_fixed( FT_Byte**  d )
+  {
+    return do_fixed( d, 0 );
+  }
+
+
+  /* read a floating point number, either integer or real, */
+  /* but return `10^scaling' times the number read in      */
+  static FT_Fixed
+  cff_parse_fixed_scaled( FT_Byte**  d,
+                          FT_Long    scaling )
+  {
+    return do_fixed( d, scaling );
+  }
+
+
+  /* read a floating point number, either integer or real,     */
+  /* and return it as precise as possible -- `scaling' returns */
+  /* the scaling factor (as a power of 10)                     */
+  static FT_Fixed
+  cff_parse_fixed_dynamic( FT_Byte**  d,
+                           FT_Long*   scaling )
+  {
+    FT_ASSERT( scaling );
+
+    if ( **d == 30 )
+      return cff_parse_real( d[0], d[1], 0, scaling );
+    else
+    {
+      FT_Long  number;
+      FT_Int   integer_length;
+
+
+      number = cff_parse_integer( d[0], d[1] );
+
+      if ( number > 0x7FFFL )
+      {
+        for ( integer_length = 5; integer_length < 10; integer_length++ )
+          if ( number < power_tens[integer_length] )
+            break;
+
+        if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL )
+        {
+          *scaling = integer_length - 4;
+          return FT_DivFix( number, power_tens[integer_length - 4] );
+        }
+        else
+        {
+          *scaling = integer_length - 5;
+          return FT_DivFix( number, power_tens[integer_length - 5] );
+        }
+      }
+      else
+      {
+        *scaling = 0;
+        return (FT_Long)( (FT_ULong)number << 16 );
+      }
+    }
+  }
+
+
+  static FT_Error
+  cff_parse_font_matrix( CFF_Parser  parser )
+  {
+    CFF_FontRecDict  dict   = (CFF_FontRecDict)parser->object;
+    FT_Matrix*       matrix = &dict->font_matrix;
+    FT_Vector*       offset = &dict->font_offset;
+    FT_ULong*        upm    = &dict->units_per_em;
+    FT_Byte**        data   = parser->stack;
+    FT_Error         error  = FT_ERR( Stack_Underflow );
+
+
+    if ( parser->top >= parser->stack + 6 )
+    {
+      FT_Long  scaling;
+
+
+      error = FT_Err_Ok;
+
+      dict->has_font_matrix = TRUE;
+
+      /* We expect a well-formed font matrix, this is, the matrix elements */
+      /* `xx' and `yy' are of approximately the same magnitude.  To avoid  */
+      /* loss of precision, we use the magnitude of element `xx' to scale  */
+      /* all other elements.  The scaling factor is then contained in the  */
+      /* `units_per_em' value.                                             */
+
+      matrix->xx = cff_parse_fixed_dynamic( data++, &scaling );
+
+      scaling = -scaling;
+
+      if ( scaling < 0 || scaling > 9 )
+      {
+        /* Return default matrix in case of unlikely values. */
+
+        FT_TRACE1(( "cff_parse_font_matrix:"
+                    " strange scaling value for xx element (%d),\n"
+                    "                      "
+                    " using default matrix\n", scaling ));
+
+        matrix->xx = 0x10000L;
+        matrix->yx = 0;
+        matrix->xy = 0;
+        matrix->yy = 0x10000L;
+        offset->x  = 0;
+        offset->y  = 0;
+        *upm       = 1;
+
+        goto Exit;
+      }
+
+      matrix->yx = cff_parse_fixed_scaled( data++, scaling );
+      matrix->xy = cff_parse_fixed_scaled( data++, scaling );
+      matrix->yy = cff_parse_fixed_scaled( data++, scaling );
+      offset->x  = cff_parse_fixed_scaled( data++, scaling );
+      offset->y  = cff_parse_fixed_scaled( data,   scaling );
+
+      *upm = power_tens[scaling];
+
+      FT_TRACE4(( " [%f %f %f %f %f %f]\n",
+                  (double)matrix->xx / *upm / 65536,
+                  (double)matrix->xy / *upm / 65536,
+                  (double)matrix->yx / *upm / 65536,
+                  (double)matrix->yy / *upm / 65536,
+                  (double)offset->x  / *upm / 65536,
+                  (double)offset->y  / *upm / 65536 ));
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  cff_parse_font_bbox( CFF_Parser  parser )
+  {
+    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
+    FT_BBox*         bbox = &dict->font_bbox;
+    FT_Byte**        data = parser->stack;
+    FT_Error         error;
+
+
+    error = FT_ERR( Stack_Underflow );
+
+    if ( parser->top >= parser->stack + 4 )
+    {
+      bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) );
+      bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) );
+      bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) );
+      bbox->yMax = FT_RoundFix( cff_parse_fixed( data   ) );
+      error = FT_Err_Ok;
+
+      FT_TRACE4(( " [%d %d %d %d]\n",
+                  bbox->xMin / 65536,
+                  bbox->yMin / 65536,
+                  bbox->xMax / 65536,
+                  bbox->yMax / 65536 ));
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  cff_parse_private_dict( CFF_Parser  parser )
+  {
+    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
+    FT_Byte**        data = parser->stack;
+    FT_Error         error;
+
+
+    error = FT_ERR( Stack_Underflow );
+
+    if ( parser->top >= parser->stack + 2 )
+    {
+      dict->private_size   = cff_parse_num( data++ );
+      dict->private_offset = cff_parse_num( data   );
+      FT_TRACE4(( " %lu %lu\n",
+                  dict->private_size, dict->private_offset ));
+
+      error = FT_Err_Ok;
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  cff_parse_cid_ros( CFF_Parser  parser )
+  {
+    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
+    FT_Byte**        data = parser->stack;
+    FT_Error         error;
+
+
+    error = FT_ERR( Stack_Underflow );
+
+    if ( parser->top >= parser->stack + 3 )
+    {
+      dict->cid_registry = (FT_UInt)cff_parse_num( data++ );
+      dict->cid_ordering = (FT_UInt)cff_parse_num( data++ );
+      if ( **data == 30 )
+        FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" ));
+      dict->cid_supplement = cff_parse_num( data );
+      if ( dict->cid_supplement < 0 )
+        FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n",
+                   dict->cid_supplement ));
+      error = FT_Err_Ok;
+
+      FT_TRACE4(( " %d %d %d\n",
+                  dict->cid_registry,
+                  dict->cid_ordering,
+                  dict->cid_supplement ));
+    }
+
+    return error;
+  }
+
+
+#define CFF_FIELD_NUM( code, name, id )             \
+          CFF_FIELD( code, name, id, cff_kind_num )
+#define CFF_FIELD_FIXED( code, name, id )             \
+          CFF_FIELD( code, name, id, cff_kind_fixed )
+#define CFF_FIELD_FIXED_1000( code, name, id )                 \
+          CFF_FIELD( code, name, id, cff_kind_fixed_thousand )
+#define CFF_FIELD_STRING( code, name, id )             \
+          CFF_FIELD( code, name, id, cff_kind_string )
+#define CFF_FIELD_BOOL( code, name, id )             \
+          CFF_FIELD( code, name, id, cff_kind_bool )
+
+#define CFFCODE_TOPDICT  0x1000
+#define CFFCODE_PRIVATE  0x2000
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+
+#undef  CFF_FIELD
+#undef  CFF_FIELD_DELTA
+
+
+#ifndef FT_DEBUG_LEVEL_TRACE
+
+
+#define CFF_FIELD_CALLBACK( code, name, id ) \
+          {                                  \
+            cff_kind_callback,               \
+            code | CFFCODE,                  \
+            0, 0,                            \
+            cff_parse_ ## name,              \
+            0, 0                             \
+          },
+
+#define CFF_FIELD( code, name, id, kind ) \
+          {                               \
+            kind,                         \
+            code | CFFCODE,               \
+            FT_FIELD_OFFSET( name ),      \
+            FT_FIELD_SIZE( name ),        \
+            0, 0, 0                       \
+          },
+
+#define CFF_FIELD_DELTA( code, name, max, id ) \
+          {                                    \
+            cff_kind_delta,                    \
+            code | CFFCODE,                    \
+            FT_FIELD_OFFSET( name ),           \
+            FT_FIELD_SIZE_DELTA( name ),       \
+            0,                                 \
+            max,                               \
+            FT_FIELD_OFFSET( num_ ## name )    \
+          },
+
+  static const CFF_Field_Handler  cff_field_handlers[] =
+  {
+
+#include "cfftoken.h"
+
+    { 0, 0, 0, 0, 0, 0, 0 }
+  };
+
+
+#else /* FT_DEBUG_LEVEL_TRACE */
+
+
+
+#define CFF_FIELD_CALLBACK( code, name, id ) \
+          {                                  \
+            cff_kind_callback,               \
+            code | CFFCODE,                  \
+            0, 0,                            \
+            cff_parse_ ## name,              \
+            0, 0,                            \
+            id                               \
+          },
+
+#define CFF_FIELD( code, name, id, kind ) \
+          {                               \
+            kind,                         \
+            code | CFFCODE,               \
+            FT_FIELD_OFFSET( name ),      \
+            FT_FIELD_SIZE( name ),        \
+            0, 0, 0,                      \
+            id                            \
+          },
+
+#define CFF_FIELD_DELTA( code, name, max, id ) \
+          {                                    \
+            cff_kind_delta,                    \
+            code | CFFCODE,                    \
+            FT_FIELD_OFFSET( name ),           \
+            FT_FIELD_SIZE_DELTA( name ),       \
+            0,                                 \
+            max,                               \
+            FT_FIELD_OFFSET( num_ ## name ),   \
+            id                                 \
+          },
+
+  static const CFF_Field_Handler  cff_field_handlers[] =
+  {
+
+#include "cfftoken.h"
+
+    { 0, 0, 0, 0, 0, 0, 0, 0 }
+  };
+
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+
+  void
+  FT_Destroy_Class_cff_field_handlers( FT_Library          library,
+                                       CFF_Field_Handler*  clazz )
+  {
+    FT_Memory  memory = library->memory;
+
+
+    if ( clazz )
+      FT_FREE( clazz );
+  }
+
+
+  FT_Error
+  FT_Create_Class_cff_field_handlers( FT_Library           library,
+                                      CFF_Field_Handler**  output_class )
+  {
+    CFF_Field_Handler*  clazz  = NULL;
+    FT_Error            error;
+    FT_Memory           memory = library->memory;
+
+    int  i = 0;
+
+
+#undef CFF_FIELD
+#define CFF_FIELD( code, name, id, kind ) i++;
+#undef CFF_FIELD_DELTA
+#define CFF_FIELD_DELTA( code, name, max, id ) i++;
+#undef CFF_FIELD_CALLBACK
+#define CFF_FIELD_CALLBACK( code, name, id ) i++;
+
+#include "cfftoken.h"
+
+    i++; /* { 0, 0, 0, 0, 0, 0, 0 } */
+
+    if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) )
+      return error;
+
+    i = 0;
+
+
+#ifndef FT_DEBUG_LEVEL_TRACE
+
+
+#undef CFF_FIELD_CALLBACK
+#define CFF_FIELD_CALLBACK( code_, name_, id_ )        \
+          clazz[i].kind         = cff_kind_callback;   \
+          clazz[i].code         = code_ | CFFCODE;     \
+          clazz[i].offset       = 0;                   \
+          clazz[i].size         = 0;                   \
+          clazz[i].reader       = cff_parse_ ## name_; \
+          clazz[i].array_max    = 0;                   \
+          clazz[i].count_offset = 0;                   \
+          i++;
+
+#undef  CFF_FIELD
+#define CFF_FIELD( code_, name_, id_, kind_ )               \
+          clazz[i].kind         = kind_;                    \
+          clazz[i].code         = code_ | CFFCODE;          \
+          clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \
+          clazz[i].size         = FT_FIELD_SIZE( name_ );   \
+          clazz[i].reader       = 0;                        \
+          clazz[i].array_max    = 0;                        \
+          clazz[i].count_offset = 0;                        \
+          i++;                                              \
+
+#undef  CFF_FIELD_DELTA
+#define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \
+          clazz[i].kind         = cff_kind_delta;                   \
+          clazz[i].code         = code_ | CFFCODE;                  \
+          clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \
+          clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \
+          clazz[i].reader       = 0;                                \
+          clazz[i].array_max    = max_;                             \
+          clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
+          i++;
+
+#include "cfftoken.h"
+
+    clazz[i].kind         = 0;
+    clazz[i].code         = 0;
+    clazz[i].offset       = 0;
+    clazz[i].size         = 0;
+    clazz[i].reader       = 0;
+    clazz[i].array_max    = 0;
+    clazz[i].count_offset = 0;
+
+
+#else /* FT_DEBUG_LEVEL_TRACE */
+
+
+#undef CFF_FIELD_CALLBACK
+#define CFF_FIELD_CALLBACK( code_, name_, id_ )        \
+          clazz[i].kind         = cff_kind_callback;   \
+          clazz[i].code         = code_ | CFFCODE;     \
+          clazz[i].offset       = 0;                   \
+          clazz[i].size         = 0;                   \
+          clazz[i].reader       = cff_parse_ ## name_; \
+          clazz[i].array_max    = 0;                   \
+          clazz[i].count_offset = 0;                   \
+          clazz[i].id           = id_;                 \
+          i++;
+
+#undef  CFF_FIELD
+#define CFF_FIELD( code_, name_, id_, kind_ )               \
+          clazz[i].kind         = kind_;                    \
+          clazz[i].code         = code_ | CFFCODE;          \
+          clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \
+          clazz[i].size         = FT_FIELD_SIZE( name_ );   \
+          clazz[i].reader       = 0;                        \
+          clazz[i].array_max    = 0;                        \
+          clazz[i].count_offset = 0;                        \
+          clazz[i].id           = id_;                      \
+          i++;                                              \
+
+#undef  CFF_FIELD_DELTA
+#define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \
+          clazz[i].kind         = cff_kind_delta;                   \
+          clazz[i].code         = code_ | CFFCODE;                  \
+          clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \
+          clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \
+          clazz[i].reader       = 0;                                \
+          clazz[i].array_max    = max_;                             \
+          clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
+          clazz[i].id           = id_;                              \
+          i++;
+
+#include "cfftoken.h"
+
+    clazz[i].kind         = 0;
+    clazz[i].code         = 0;
+    clazz[i].offset       = 0;
+    clazz[i].size         = 0;
+    clazz[i].reader       = 0;
+    clazz[i].array_max    = 0;
+    clazz[i].count_offset = 0;
+    clazz[i].id           = 0;
+
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+    *output_class = clazz;
+
+    return FT_Err_Ok;
+  }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_parser_run( CFF_Parser  parser,
+                  FT_Byte*    start,
+                  FT_Byte*    limit )
+  {
+    FT_Byte*    p       = start;
+    FT_Error    error   = FT_Err_Ok;
+    FT_Library  library = parser->library;
+    FT_UNUSED( library );
+
+
+    parser->top    = parser->stack;
+    parser->start  = start;
+    parser->limit  = limit;
+    parser->cursor = start;
+
+    while ( p < limit )
+    {
+      FT_UInt  v = *p;
+
+
+      if ( v >= 27 && v != 31 )
+      {
+        /* it's a number; we will push its position on the stack */
+        if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH )
+          goto Stack_Overflow;
+
+        *parser->top ++ = p;
+
+        /* now, skip it */
+        if ( v == 30 )
+        {
+          /* skip real number */
+          p++;
+          for (;;)
+          {
+            /* An unterminated floating point number at the */
+            /* end of a dictionary is invalid but harmless. */
+            if ( p >= limit )
+              goto Exit;
+            v = p[0] >> 4;
+            if ( v == 15 )
+              break;
+            v = p[0] & 0xF;
+            if ( v == 15 )
+              break;
+            p++;
+          }
+        }
+        else if ( v == 28 )
+          p += 2;
+        else if ( v == 29 )
+          p += 4;
+        else if ( v > 246 )
+          p += 1;
+      }
+      else
+      {
+        /* This is not a number, hence it's an operator.  Compute its code */
+        /* and look for it in our current list.                            */
+
+        FT_UInt                   code;
+        FT_UInt                   num_args = (FT_UInt)
+                                             ( parser->top - parser->stack );
+        const CFF_Field_Handler*  field;
+
+
+        *parser->top = p;
+        code = v;
+        if ( v == 12 )
+        {
+          /* two byte operator */
+          p++;
+          if ( p >= limit )
+            goto Syntax_Error;
+
+          code = 0x100 | p[0];
+        }
+        code = code | parser->object_code;
+
+        for ( field = CFF_FIELD_HANDLERS_GET; field->kind; field++ )
+        {
+          if ( field->code == (FT_Int)code )
+          {
+            /* we found our field's handler; read it */
+            FT_Long   val;
+            FT_Byte*  q = (FT_Byte*)parser->object + field->offset;
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+            FT_TRACE4(( "  %s", field->id ));
+#endif
+
+            /* check that we have enough arguments -- except for */
+            /* delta encoded arrays, which can be empty          */
+            if ( field->kind != cff_kind_delta && num_args < 1 )
+              goto Stack_Underflow;
+
+            switch ( field->kind )
+            {
+            case cff_kind_bool:
+            case cff_kind_string:
+            case cff_kind_num:
+              val = cff_parse_num( parser->stack );
+              goto Store_Number;
+
+            case cff_kind_fixed:
+              val = cff_parse_fixed( parser->stack );
+              goto Store_Number;
+
+            case cff_kind_fixed_thousand:
+              val = cff_parse_fixed_scaled( parser->stack, 3 );
+
+            Store_Number:
+              switch ( field->size )
+              {
+              case (8 / FT_CHAR_BIT):
+                *(FT_Byte*)q = (FT_Byte)val;
+                break;
+
+              case (16 / FT_CHAR_BIT):
+                *(FT_Short*)q = (FT_Short)val;
+                break;
+
+              case (32 / FT_CHAR_BIT):
+                *(FT_Int32*)q = (FT_Int)val;
+                break;
+
+              default:  /* for 64-bit systems */
+                *(FT_Long*)q = val;
+              }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+              switch ( field->kind )
+              {
+              case cff_kind_bool:
+                FT_TRACE4(( " %s\n", val ? "true" : "false" ));
+                break;
+
+              case cff_kind_string:
+                FT_TRACE4(( " %ld (SID)\n", val ));
+                break;
+
+              case cff_kind_num:
+                FT_TRACE4(( " %ld\n", val ));
+                break;
+
+              case cff_kind_fixed:
+                FT_TRACE4(( " %f\n", (double)val / 65536 ));
+                break;
+
+              case cff_kind_fixed_thousand:
+                FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 ));
+
+              default:
+                ; /* never reached */
+              }
+#endif
+
+              break;
+
+            case cff_kind_delta:
+              {
+                FT_Byte*   qcount = (FT_Byte*)parser->object +
+                                      field->count_offset;
+
+                FT_Byte**  data = parser->stack;
+
+
+                if ( num_args > field->array_max )
+                  num_args = field->array_max;
+
+                FT_TRACE4(( " [" ));
+
+                /* store count */
+                *qcount = (FT_Byte)num_args;
+
+                val = 0;
+                while ( num_args > 0 )
+                {
+                  val += cff_parse_num( data++ );
+                  switch ( field->size )
+                  {
+                  case (8 / FT_CHAR_BIT):
+                    *(FT_Byte*)q = (FT_Byte)val;
+                    break;
+
+                  case (16 / FT_CHAR_BIT):
+                    *(FT_Short*)q = (FT_Short)val;
+                    break;
+
+                  case (32 / FT_CHAR_BIT):
+                    *(FT_Int32*)q = (FT_Int)val;
+                    break;
+
+                  default:  /* for 64-bit systems */
+                    *(FT_Long*)q = val;
+                  }
+
+                  FT_TRACE4(( " %ld", val ));
+
+                  q += field->size;
+                  num_args--;
+                }
+
+                FT_TRACE4(( "]\n" ));
+              }
+              break;
+
+            default:  /* callback */
+              error = field->reader( parser );
+              if ( error )
+                goto Exit;
+            }
+            goto Found;
+          }
+        }
+
+        /* this is an unknown operator, or it is unsupported; */
+        /* we will ignore it for now.                         */
+
+      Found:
+        /* clear stack */
+        parser->top = parser->stack;
+      }
+      p++;
+    }
+
+  Exit:
+    return error;
+
+  Stack_Overflow:
+    error = FT_THROW( Invalid_Argument );
+    goto Exit;
+
+  Stack_Underflow:
+    error = FT_THROW( Invalid_Argument );
+    goto Exit;
+
+  Syntax_Error:
+    error = FT_THROW( Invalid_Argument );
+    goto Exit;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.h
new file mode 100644
index 0000000..3371fd0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.h
@@ -0,0 +1,106 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffparse.h                                                             */
+/*                                                                         */
+/*    CFF token stream parser (specification)                              */
+/*                                                                         */
+/*  Copyright 1996-2003, 2011 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFF_PARSE_H__
+#define __CFF_PARSE_H__
+
+
+#include "../../include/ft2build.h"
+#include "cfftypes.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define CFF_MAX_STACK_DEPTH  96
+
+#define CFF_CODE_TOPDICT  0x1000
+#define CFF_CODE_PRIVATE  0x2000
+
+
+  typedef struct  CFF_ParserRec_
+  {
+    FT_Library library;
+    FT_Byte*   start;
+    FT_Byte*   limit;
+    FT_Byte*   cursor;
+
+    FT_Byte*   stack[CFF_MAX_STACK_DEPTH + 1];
+    FT_Byte**  top;
+
+    FT_UInt    object_code;
+    void*      object;
+
+  } CFF_ParserRec, *CFF_Parser;
+
+
+  FT_LOCAL( void )
+  cff_parser_init( CFF_Parser  parser,
+                   FT_UInt     code,
+                   void*       object,
+                   FT_Library  library);
+
+  FT_LOCAL( FT_Error )
+  cff_parser_run( CFF_Parser  parser,
+                  FT_Byte*    start,
+                  FT_Byte*    limit );
+
+
+  enum
+  {
+    cff_kind_none = 0,
+    cff_kind_num,
+    cff_kind_fixed,
+    cff_kind_fixed_thousand,
+    cff_kind_string,
+    cff_kind_bool,
+    cff_kind_delta,
+    cff_kind_callback,
+
+    cff_kind_max  /* do not remove */
+  };
+
+
+  /* now generate handlers for the most simple fields */
+  typedef FT_Error  (*CFF_Field_Reader)( CFF_Parser  parser );
+
+  typedef struct  CFF_Field_Handler_
+  {
+    int               kind;
+    int               code;
+    FT_UInt           offset;
+    FT_Byte           size;
+    CFF_Field_Reader  reader;
+    FT_UInt           array_max;
+    FT_UInt           count_offset;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    const char*       id;
+#endif
+
+  } CFF_Field_Handler;
+
+
+FT_END_HEADER
+
+
+#endif /* __CFF_PARSE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.c
new file mode 100644
index 0000000..5675e73
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.c
@@ -0,0 +1,138 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffpic.c                                                               */
+/*                                                                         */
+/*    The FreeType position independent code services for cff module.      */
+/*                                                                         */
+/*  Copyright 2009, 2010, 2012, 2013 by                                    */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "cffcmap.h"
+#include "cffpic.h"
+#include "cfferrs.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from cffdrivr.c */
+  FT_Error
+  FT_Create_Class_cff_services( FT_Library           library,
+                                FT_ServiceDescRec**  output_class );
+  void
+  FT_Destroy_Class_cff_services( FT_Library          library,
+                                 FT_ServiceDescRec*  clazz );
+  void
+  FT_Init_Class_cff_service_ps_info( FT_Library             library,
+                                     FT_Service_PsInfoRec*  clazz );
+  void
+  FT_Init_Class_cff_service_glyph_dict( FT_Library                library,
+                                        FT_Service_GlyphDictRec*  clazz );
+  void
+  FT_Init_Class_cff_service_ps_name( FT_Library                 library,
+                                     FT_Service_PsFontNameRec*  clazz );
+  void
+  FT_Init_Class_cff_service_get_cmap_info( FT_Library              library,
+                                           FT_Service_TTCMapsRec*  clazz );
+  void
+  FT_Init_Class_cff_service_cid_info( FT_Library          library,
+                                      FT_Service_CIDRec*  clazz );
+
+  /* forward declaration of PIC init functions from cffparse.c */
+  FT_Error
+  FT_Create_Class_cff_field_handlers( FT_Library           library,
+                                      CFF_Field_Handler**  output_class );
+  void
+  FT_Destroy_Class_cff_field_handlers( FT_Library          library,
+                                       CFF_Field_Handler*  clazz );
+
+
+  void
+  cff_driver_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory          memory        = library->memory;
+
+
+    if ( pic_container->cff )
+    {
+      CffModulePIC*  container = (CffModulePIC*)pic_container->cff;
+
+
+      if ( container->cff_services )
+        FT_Destroy_Class_cff_services( library,
+                                       container->cff_services );
+      container->cff_services = NULL;
+      if ( container->cff_field_handlers )
+        FT_Destroy_Class_cff_field_handlers(
+          library, container->cff_field_handlers );
+      container->cff_field_handlers = NULL;
+      FT_FREE( container );
+      pic_container->cff = NULL;
+    }
+  }
+
+
+  FT_Error
+  cff_driver_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = FT_Err_Ok;
+    CffModulePIC*      container     = NULL;
+    FT_Memory          memory        = library->memory;
+
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->cff = container;
+
+    /* initialize pointer table -                       */
+    /* this is how the module usually expects this data */
+    error = FT_Create_Class_cff_services( library,
+                                          &container->cff_services );
+    if ( error )
+      goto Exit;
+
+    error = FT_Create_Class_cff_field_handlers(
+              library, &container->cff_field_handlers );
+    if ( error )
+      goto Exit;
+
+    FT_Init_Class_cff_service_ps_info(
+      library, &container->cff_service_ps_info );
+    FT_Init_Class_cff_service_glyph_dict(
+      library, &container->cff_service_glyph_dict );
+    FT_Init_Class_cff_service_ps_name(
+      library, &container->cff_service_ps_name );
+    FT_Init_Class_cff_service_get_cmap_info(
+      library, &container->cff_service_get_cmap_info );
+    FT_Init_Class_cff_service_cid_info(
+      library, &container->cff_service_cid_info );
+    FT_Init_Class_cff_cmap_encoding_class_rec(
+      library, &container->cff_cmap_encoding_class_rec );
+    FT_Init_Class_cff_cmap_unicode_class_rec(
+      library, &container->cff_cmap_unicode_class_rec );
+
+  Exit:
+    if ( error )
+      cff_driver_class_pic_free( library );
+    return error;
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.h
new file mode 100644
index 0000000..7fb76e5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.h
@@ -0,0 +1,108 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffpic.h                                                               */
+/*                                                                         */
+/*    The FreeType position independent code services for cff module.      */
+/*                                                                         */
+/*  Copyright 2009, 2012, 2013 by                                          */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFPIC_H__
+#define __CFFPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define CFF_SERVICE_PS_INFO_GET          cff_service_ps_info
+#define CFF_SERVICE_GLYPH_DICT_GET       cff_service_glyph_dict
+#define CFF_SERVICE_PS_NAME_GET          cff_service_ps_name
+#define CFF_SERVICE_GET_CMAP_INFO_GET    cff_service_get_cmap_info
+#define CFF_SERVICE_CID_INFO_GET         cff_service_cid_info
+#define CFF_SERVICE_PROPERTIES_GET       cff_service_properties
+#define CFF_SERVICES_GET                 cff_services
+#define CFF_CMAP_ENCODING_CLASS_REC_GET  cff_cmap_encoding_class_rec
+#define CFF_CMAP_UNICODE_CLASS_REC_GET   cff_cmap_unicode_class_rec
+#define CFF_FIELD_HANDLERS_GET           cff_field_handlers
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "cffparse.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+#include "../../include/freetype/internal/services/svcid.h"
+#include "../../include/freetype/internal/services/svprop.h"
+
+
+  typedef struct  CffModulePIC_
+  {
+    FT_ServiceDescRec*        cff_services;
+    CFF_Field_Handler*        cff_field_handlers;
+    FT_Service_PsInfoRec      cff_service_ps_info;
+    FT_Service_GlyphDictRec   cff_service_glyph_dict;
+    FT_Service_PsFontNameRec  cff_service_ps_name;
+    FT_Service_TTCMapsRec     cff_service_get_cmap_info;
+    FT_Service_CIDRec         cff_service_cid_info;
+    FT_Service_PropertiesRec  cff_service_properties;
+    FT_CMap_ClassRec          cff_cmap_encoding_class_rec;
+    FT_CMap_ClassRec          cff_cmap_unicode_class_rec;
+
+  } CffModulePIC;
+
+
+#define GET_PIC( lib )                                    \
+          ( (CffModulePIC*)( (lib)->pic_container.cff ) )
+
+#define CFF_SERVICE_PS_INFO_GET                       \
+          ( GET_PIC( library )->cff_service_ps_info )
+#define CFF_SERVICE_GLYPH_DICT_GET                       \
+          ( GET_PIC( library )->cff_service_glyph_dict )
+#define CFF_SERVICE_PS_NAME_GET                       \
+          ( GET_PIC( library )->cff_service_ps_name )
+#define CFF_SERVICE_GET_CMAP_INFO_GET                       \
+          ( GET_PIC( library )->cff_service_get_cmap_info )
+#define CFF_SERVICE_CID_INFO_GET                       \
+          ( GET_PIC( library )->cff_service_cid_info )
+#define CFF_SERVICE_PROPERTIES_GET                       \
+          ( GET_PIC( library )->cff_service_properties )
+#define CFF_SERVICES_GET                       \
+          ( GET_PIC( library )->cff_services )
+#define CFF_CMAP_ENCODING_CLASS_REC_GET                       \
+          ( GET_PIC( library )->cff_cmap_encoding_class_rec )
+#define CFF_CMAP_UNICODE_CLASS_REC_GET                       \
+          ( GET_PIC( library )->cff_cmap_unicode_class_rec )
+#define CFF_FIELD_HANDLERS_GET                       \
+          ( GET_PIC( library )->cff_field_handlers )
+
+  /* see cffpic.c for the implementation */
+  void
+  cff_driver_class_pic_free( FT_Library  library );
+
+  FT_Error
+  cff_driver_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __CFFPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftoken.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftoken.h
new file mode 100644
index 0000000..bcb4276
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftoken.h
@@ -0,0 +1,97 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cfftoken.h                                                             */
+/*                                                                         */
+/*    CFF token definitions (specification only).                          */
+/*                                                                         */
+/*  Copyright 1996-2003, 2011 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CFF_FontRecDictRec
+
+#undef  CFFCODE
+#define CFFCODE       CFFCODE_TOPDICT
+
+  CFF_FIELD_STRING  ( 0,     version,             "Version" )
+  CFF_FIELD_STRING  ( 1,     notice,              "Notice" )
+  CFF_FIELD_STRING  ( 0x100, copyright,           "Copyright" )
+  CFF_FIELD_STRING  ( 2,     full_name,           "FullName" )
+  CFF_FIELD_STRING  ( 3,     family_name,         "FamilyName" )
+  CFF_FIELD_STRING  ( 4,     weight,              "Weight" )
+  CFF_FIELD_BOOL    ( 0x101, is_fixed_pitch,      "isFixedPitch" )
+  CFF_FIELD_FIXED   ( 0x102, italic_angle,        "ItalicAngle" )
+  CFF_FIELD_FIXED   ( 0x103, underline_position,  "UnderlinePosition" )
+  CFF_FIELD_FIXED   ( 0x104, underline_thickness, "UnderlineThickness" )
+  CFF_FIELD_NUM     ( 0x105, paint_type,          "PaintType" )
+  CFF_FIELD_NUM     ( 0x106, charstring_type,     "CharstringType" )
+  CFF_FIELD_CALLBACK( 0x107, font_matrix,         "FontMatrix" )
+  CFF_FIELD_NUM     ( 13,    unique_id,           "UniqueID" )
+  CFF_FIELD_CALLBACK( 5,     font_bbox,           "FontBBox" )
+  CFF_FIELD_NUM     ( 0x108, stroke_width,        "StrokeWidth" )
+  CFF_FIELD_NUM     ( 15,    charset_offset,      "charset" )
+  CFF_FIELD_NUM     ( 16,    encoding_offset,     "Encoding" )
+  CFF_FIELD_NUM     ( 17,    charstrings_offset,  "CharStrings" )
+  CFF_FIELD_CALLBACK( 18,    private_dict,        "Private" )
+  CFF_FIELD_NUM     ( 0x114, synthetic_base,      "SyntheticBase" )
+  CFF_FIELD_STRING  ( 0x115, embedded_postscript, "PostScript" )
+
+#if 0
+  CFF_FIELD_STRING  ( 0x116, base_font_name,      "BaseFontName" )
+  CFF_FIELD_DELTA   ( 0x117, base_font_blend, 16, "BaseFontBlend" )
+  CFF_FIELD_CALLBACK( 0x118, multiple_master,     "MultipleMaster" )
+  CFF_FIELD_CALLBACK( 0x119, blend_axis_types,    "BlendAxisTypes" )
+#endif
+
+  CFF_FIELD_CALLBACK( 0x11E, cid_ros,              "ROS" )
+  CFF_FIELD_NUM     ( 0x11F, cid_font_version,     "CIDFontVersion" )
+  CFF_FIELD_NUM     ( 0x120, cid_font_revision,    "CIDFontRevision" )
+  CFF_FIELD_NUM     ( 0x121, cid_font_type,        "CIDFontType" )
+  CFF_FIELD_NUM     ( 0x122, cid_count,            "CIDCount" )
+  CFF_FIELD_NUM     ( 0x123, cid_uid_base,         "UIDBase" )
+  CFF_FIELD_NUM     ( 0x124, cid_fd_array_offset,  "FDArray" )
+  CFF_FIELD_NUM     ( 0x125, cid_fd_select_offset, "FDSelect" )
+  CFF_FIELD_STRING  ( 0x126, cid_font_name,        "FontName" )
+
+#if 0
+  CFF_FIELD_NUM     ( 0x127, chameleon, "Chameleon" )
+#endif
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CFF_PrivateRec
+#undef  CFFCODE
+#define CFFCODE       CFFCODE_PRIVATE
+
+  CFF_FIELD_DELTA     ( 6,     blue_values, 14,        "BlueValues" )
+  CFF_FIELD_DELTA     ( 7,     other_blues, 10,        "OtherBlues" )
+  CFF_FIELD_DELTA     ( 8,     family_blues, 14,       "FamilyBlues" )
+  CFF_FIELD_DELTA     ( 9,     family_other_blues, 10, "FamilyOtherBlues" )
+  CFF_FIELD_FIXED_1000( 0x109, blue_scale,             "BlueScale" )
+  CFF_FIELD_NUM       ( 0x10A, blue_shift,             "BlueShift" )
+  CFF_FIELD_NUM       ( 0x10B, blue_fuzz,              "BlueFuzz" )
+  CFF_FIELD_NUM       ( 10,    standard_width,         "StdHW" )
+  CFF_FIELD_NUM       ( 11,    standard_height,        "StdVW" )
+  CFF_FIELD_DELTA     ( 0x10C, snap_widths, 13,        "StemSnapH" )
+  CFF_FIELD_DELTA     ( 0x10D, snap_heights, 13,       "StemSnapV" )
+  CFF_FIELD_BOOL      ( 0x10E, force_bold,             "ForceBold" )
+  CFF_FIELD_FIXED     ( 0x10F, force_bold_threshold,   "ForceBoldThreshold" )
+  CFF_FIELD_NUM       ( 0x110, lenIV,                  "lenIV" )
+  CFF_FIELD_NUM       ( 0x111, language_group,         "LanguageGroup" )
+  CFF_FIELD_FIXED     ( 0x112, expansion_factor,       "ExpansionFactor" )
+  CFF_FIELD_NUM       ( 0x113, initial_random_seed,    "initialRandomSeed" )
+  CFF_FIELD_NUM       ( 19,    local_subrs_offset,     "Subrs" )
+  CFF_FIELD_NUM       ( 20,    default_width,          "defaultWidthX" )
+  CFF_FIELD_NUM       ( 21,    nominal_width,          "nominalWidthX" )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftypes.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftypes.h
new file mode 100644
index 0000000..f08e064
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftypes.h
@@ -0,0 +1,284 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cfftypes.h                                                             */
+/*                                                                         */
+/*    Basic OpenType/CFF type definitions and interface (specification     */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 1996-2003, 2006-2008, 2010-2011, 2013 by                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFTYPES_H__
+#define __CFFTYPES_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/t1tables.h"
+#include "../../include/freetype/internal/ftserv.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/pshints.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CFF_IndexRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a CFF Index table.                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    stream      :: The source input stream.                            */
+  /*                                                                       */
+  /*    start       :: The position of the first index byte in the         */
+  /*                   input stream.                                       */
+  /*                                                                       */
+  /*    count       :: The number of elements in the index.                */
+  /*                                                                       */
+  /*    off_size    :: The size in bytes of object offsets in index.       */
+  /*                                                                       */
+  /*    data_offset :: The position of first data byte in the index's      */
+  /*                   bytes.                                              */
+  /*                                                                       */
+  /*    data_size   :: The size of the data table in this index.           */
+  /*                                                                       */
+  /*    offsets     :: A table of element offsets in the index.  Must be   */
+  /*                   loaded explicitly.                                  */
+  /*                                                                       */
+  /*    bytes       :: If the index is loaded in memory, its bytes.        */
+  /*                                                                       */
+  typedef struct  CFF_IndexRec_
+  {
+    FT_Stream  stream;
+    FT_ULong   start;
+    FT_UInt    count;
+    FT_Byte    off_size;
+    FT_ULong   data_offset;
+    FT_ULong   data_size;
+
+    FT_ULong*  offsets;
+    FT_Byte*   bytes;
+
+  } CFF_IndexRec, *CFF_Index;
+
+
+  typedef struct  CFF_EncodingRec_
+  {
+    FT_UInt     format;
+    FT_ULong    offset;
+
+    FT_UInt     count;
+    FT_UShort   sids [256];  /* avoid dynamic allocations */
+    FT_UShort   codes[256];
+
+  } CFF_EncodingRec, *CFF_Encoding;
+
+
+  typedef struct  CFF_CharsetRec_
+  {
+
+    FT_UInt     format;
+    FT_ULong    offset;
+
+    FT_UShort*  sids;
+    FT_UShort*  cids;       /* the inverse mapping of `sids'; only needed */
+                            /* for CID-keyed fonts                        */
+    FT_UInt     max_cid;
+    FT_UInt     num_glyphs;
+
+  } CFF_CharsetRec, *CFF_Charset;
+
+
+  typedef struct  CFF_FontRecDictRec_
+  {
+    FT_UInt    version;
+    FT_UInt    notice;
+    FT_UInt    copyright;
+    FT_UInt    full_name;
+    FT_UInt    family_name;
+    FT_UInt    weight;
+    FT_Bool    is_fixed_pitch;
+    FT_Fixed   italic_angle;
+    FT_Fixed   underline_position;
+    FT_Fixed   underline_thickness;
+    FT_Int     paint_type;
+    FT_Int     charstring_type;
+    FT_Matrix  font_matrix;
+    FT_Bool    has_font_matrix;
+    FT_ULong   units_per_em;  /* temporarily used as scaling value also */
+    FT_Vector  font_offset;
+    FT_ULong   unique_id;
+    FT_BBox    font_bbox;
+    FT_Pos     stroke_width;
+    FT_ULong   charset_offset;
+    FT_ULong   encoding_offset;
+    FT_ULong   charstrings_offset;
+    FT_ULong   private_offset;
+    FT_ULong   private_size;
+    FT_Long    synthetic_base;
+    FT_UInt    embedded_postscript;
+
+    /* these should only be used for the top-level font dictionary */
+    FT_UInt    cid_registry;
+    FT_UInt    cid_ordering;
+    FT_Long    cid_supplement;
+
+    FT_Long    cid_font_version;
+    FT_Long    cid_font_revision;
+    FT_Long    cid_font_type;
+    FT_ULong   cid_count;
+    FT_ULong   cid_uid_base;
+    FT_ULong   cid_fd_array_offset;
+    FT_ULong   cid_fd_select_offset;
+    FT_UInt    cid_font_name;
+
+  } CFF_FontRecDictRec, *CFF_FontRecDict;
+
+
+  typedef struct  CFF_PrivateRec_
+  {
+    FT_Byte   num_blue_values;
+    FT_Byte   num_other_blues;
+    FT_Byte   num_family_blues;
+    FT_Byte   num_family_other_blues;
+
+    FT_Pos    blue_values[14];
+    FT_Pos    other_blues[10];
+    FT_Pos    family_blues[14];
+    FT_Pos    family_other_blues[10];
+
+    FT_Fixed  blue_scale;
+    FT_Pos    blue_shift;
+    FT_Pos    blue_fuzz;
+    FT_Pos    standard_width;
+    FT_Pos    standard_height;
+
+    FT_Byte   num_snap_widths;
+    FT_Byte   num_snap_heights;
+    FT_Pos    snap_widths[13];
+    FT_Pos    snap_heights[13];
+    FT_Bool   force_bold;
+    FT_Fixed  force_bold_threshold;
+    FT_Int    lenIV;
+    FT_Int    language_group;
+    FT_Fixed  expansion_factor;
+    FT_Long   initial_random_seed;
+    FT_ULong  local_subrs_offset;
+    FT_Pos    default_width;
+    FT_Pos    nominal_width;
+
+  } CFF_PrivateRec, *CFF_Private;
+
+
+  typedef struct  CFF_FDSelectRec_
+  {
+    FT_Byte   format;
+    FT_UInt   range_count;
+
+    /* that's the table, taken from the file `as is' */
+    FT_Byte*  data;
+    FT_UInt   data_size;
+
+    /* small cache for format 3 only */
+    FT_UInt   cache_first;
+    FT_UInt   cache_count;
+    FT_Byte   cache_fd;
+
+  } CFF_FDSelectRec, *CFF_FDSelect;
+
+
+  /* A SubFont packs a font dict and a private dict together.  They are */
+  /* needed to support CID-keyed CFF fonts.                             */
+  typedef struct  CFF_SubFontRec_
+  {
+    CFF_FontRecDictRec  font_dict;
+    CFF_PrivateRec      private_dict;
+
+    CFF_IndexRec        local_subrs_index;
+    FT_Byte**           local_subrs; /* array of pointers into Local Subrs INDEX data */
+
+  } CFF_SubFontRec, *CFF_SubFont;
+
+
+#define CFF_MAX_CID_FONTS  256
+
+
+  typedef struct  CFF_FontRec_
+  {
+    FT_Stream        stream;
+    FT_Memory        memory;
+    FT_UInt          num_faces;
+    FT_UInt          num_glyphs;
+
+    FT_Byte          version_major;
+    FT_Byte          version_minor;
+    FT_Byte          header_size;
+    FT_Byte          absolute_offsize;
+
+
+    CFF_IndexRec     name_index;
+    CFF_IndexRec     top_dict_index;
+    CFF_IndexRec     global_subrs_index;
+
+    CFF_EncodingRec  encoding;
+    CFF_CharsetRec   charset;
+
+    CFF_IndexRec     charstrings_index;
+    CFF_IndexRec     font_dict_index;
+    CFF_IndexRec     private_index;
+    CFF_IndexRec     local_subrs_index;
+
+    FT_String*       font_name;
+
+    /* array of pointers into Global Subrs INDEX data */
+    FT_Byte**        global_subrs;
+
+    /* array of pointers into String INDEX data stored at string_pool */
+    FT_UInt          num_strings;
+    FT_Byte**        strings;
+    FT_Byte*         string_pool;
+
+    CFF_SubFontRec   top_font;
+    FT_UInt          num_subfonts;
+    CFF_SubFont      subfonts[CFF_MAX_CID_FONTS];
+
+    CFF_FDSelectRec  fd_select;
+
+    /* interface to PostScript hinter */
+    PSHinter_Service  pshinter;
+
+    /* interface to Postscript Names service */
+    FT_Service_PsCMaps  psnames;
+
+    /* since version 2.3.0 */
+    PS_FontInfoRec*  font_info;   /* font info dictionary */
+
+    /* since version 2.3.6 */
+    FT_String*       registry;
+    FT_String*       ordering;
+
+    /* since version 2.4.12 */
+    FT_Generic       cf2_instance;
+
+  } CFF_FontRec, *CFF_Font;
+
+
+FT_END_HEADER
+
+#endif /* __CFFTYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/fxft_cff.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/fxft_cff.c
new file mode 100644
index 0000000..34dbabb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/fxft_cff.c
@@ -0,0 +1,45 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  cff.c                                                                  */
+/*                                                                         */
+/*    FreeType OpenType driver component (body only).                      */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+
+#include "cffpic.c"
+#include "cffdrivr.c"
+#include "cffparse.c"
+#include "cffload.c"
+#include "cffobjs.c"
+#include "cffgload.c"
+#include "cffcmap.c"
+
+#include "cf2arrst.c"
+#include "cf2blues.c"
+#include "cf2error.c"
+#include "cf2font.c"
+#include "cf2ft.c"
+#include "cf2hints.c"
+#include "cf2intrp.c"
+#include "cf2read.c"
+#include "cf2stack.c"
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/module.mk
new file mode 100644
index 0000000..ef1391c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 CFF module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += CFF_DRIVER
+
+define CFF_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, cff_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)cff       $(ECHO_DRIVER_DESC)OpenType fonts with extension *.otf$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/rules.mk
new file mode 100644
index 0000000..13115c2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/rules.mk
@@ -0,0 +1,86 @@
+#
+# FreeType 2 OpenType/CFF driver configuration rules
+#
+
+
+# Copyright 1996-2001, 2003, 2011, 2013 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# OpenType driver directory
+#
+CFF_DIR := $(SRC_DIR)/cff
+
+
+CFF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CFF_DIR))
+
+
+# CFF driver sources (i.e., C files)
+#
+CFF_DRV_SRC := $(CFF_DIR)/cffcmap.c  \
+               $(CFF_DIR)/cffdrivr.c \
+               $(CFF_DIR)/cffgload.c \
+               $(CFF_DIR)/cffload.c  \
+               $(CFF_DIR)/cffobjs.c  \
+               $(CFF_DIR)/cffparse.c \
+               $(CFF_DIR)/cffpic.c   \
+               $(CFF_DIR)/cf2arrst.c \
+               $(CFF_DIR)/cf2blues.c \
+               $(CFF_DIR)/cf2error.c \
+               $(CFF_DIR)/cf2font.c  \
+               $(CFF_DIR)/cf2ft.c    \
+               $(CFF_DIR)/cf2hints.c \
+               $(CFF_DIR)/cf2intrp.c \
+               $(CFF_DIR)/cf2read.c  \
+               $(CFF_DIR)/cf2stack.c
+
+
+# CFF driver headers
+#
+CFF_DRV_H := $(CFF_DRV_SRC:%.c=%.h) \
+             $(CFF_DIR)/cfferrs.h   \
+             $(CFF_DIR)/cfftoken.h  \
+             $(CFF_DIR)/cfftypes.h  \
+             $(CFF_DIR)/cf2fixed.h  \
+             $(CFF_DIR)/cf2glue.h   \
+             $(CFF_DIR)/cf2types.h
+
+
+# CFF driver object(s)
+#
+#   CFF_DRV_OBJ_M is used during `multi' builds
+#   CFF_DRV_OBJ_S is used during `single' builds
+#
+CFF_DRV_OBJ_M := $(CFF_DRV_SRC:$(CFF_DIR)/%.c=$(OBJ_DIR)/%.$O)
+CFF_DRV_OBJ_S := $(OBJ_DIR)/cff.$O
+
+# CFF driver source file for single build
+#
+CFF_DRV_SRC_S := $(CFF_DIR)/cff.c
+
+
+# CFF driver - single object
+#
+$(CFF_DRV_OBJ_S): $(CFF_DRV_SRC_S) $(CFF_DRV_SRC) $(FREETYPE_H) $(CFF_DRV_H)
+	$(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CFF_DRV_SRC_S))
+
+
+# CFF driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(CFF_DIR)/%.c $(FREETYPE_H) $(CFF_DRV_H)
+	$(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(CFF_DRV_OBJ_S)
+DRV_OBJS_M += $(CFF_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/Jamfile
new file mode 100644
index 0000000..ebeaed5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/cid Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) cid ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = cidobjs cidload cidgload cidriver cidparse ;
+  }
+  else
+  {
+    _sources = type1cid ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/cid Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/ciderrs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/ciderrs.h
new file mode 100644
index 0000000..1fdc24f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/ciderrs.h
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ciderrs.h                                                              */
+/*                                                                         */
+/*    CID error codes (specification only).                                */
+/*                                                                         */
+/*  Copyright 2001, 2012 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the CID error enumeration constants.      */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __CIDERRS_H__
+#define __CIDERRS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  CID_Err_
+#define FT_ERR_BASE    FT_Mod_Err_CID
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __CIDERRS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.c
new file mode 100644
index 0000000..bb04ed4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.c
@@ -0,0 +1,442 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidgload.c                                                             */
+/*                                                                         */
+/*    CID-keyed Type1 Glyph Loader (body).                                 */
+/*                                                                         */
+/*  Copyright 1996-2007, 2009, 2010, 2013 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "cidload.h"
+#include "cidgload.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftcalc.h"
+
+#include "ciderrs.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cidgload
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  cid_load_glyph( T1_Decoder  decoder,
+                  FT_UInt     glyph_index )
+  {
+    CID_Face       face = (CID_Face)decoder->builder.face;
+    CID_FaceInfo   cid  = &face->cid;
+    FT_Byte*       p;
+    FT_UInt        fd_select;
+    FT_Stream      stream       = face->cid_stream;
+    FT_Error       error        = FT_Err_Ok;
+    FT_Byte*       charstring   = 0;
+    FT_Memory      memory       = face->root.memory;
+    FT_ULong       glyph_length = 0;
+    PSAux_Service  psaux        = (PSAux_Service)face->psaux;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_Incremental_InterfaceRec *inc =
+                                  face->root.internal->incremental_interface;
+#endif
+
+
+    FT_TRACE4(( "cid_load_glyph: glyph index %d\n", glyph_index ));
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    /* For incremental fonts get the character data using */
+    /* the callback function.                             */
+    if ( inc )
+    {
+      FT_Data  glyph_data;
+
+
+      error = inc->funcs->get_glyph_data( inc->object,
+                                          glyph_index, &glyph_data );
+      if ( error )
+        goto Exit;
+
+      p         = (FT_Byte*)glyph_data.pointer;
+      fd_select = (FT_UInt)cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
+
+      if ( glyph_data.length != 0 )
+      {
+        glyph_length = glyph_data.length - cid->fd_bytes;
+        (void)FT_ALLOC( charstring, glyph_length );
+        if ( !error )
+          ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes,
+                     glyph_length );
+      }
+
+      inc->funcs->free_glyph_data( inc->object, &glyph_data );
+
+      if ( error )
+        goto Exit;
+    }
+
+    else
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    /* For ordinary fonts read the CID font dictionary index */
+    /* and charstring offset from the CIDMap.                */
+    {
+      FT_UInt   entry_len = cid->fd_bytes + cid->gd_bytes;
+      FT_ULong  off1;
+
+
+      if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset +
+                           glyph_index * entry_len )               ||
+           FT_FRAME_ENTER( 2 * entry_len )                         )
+        goto Exit;
+
+      p            = (FT_Byte*)stream->cursor;
+      fd_select    = (FT_UInt) cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
+      off1         = (FT_ULong)cid_get_offset( &p, (FT_Byte)cid->gd_bytes );
+      p           += cid->fd_bytes;
+      glyph_length = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1;
+      FT_FRAME_EXIT();
+
+      if ( fd_select >= (FT_UInt)cid->num_dicts )
+      {
+        error = FT_THROW( Invalid_Offset );
+        goto Exit;
+      }
+      if ( glyph_length == 0 )
+        goto Exit;
+      if ( FT_ALLOC( charstring, glyph_length ) )
+        goto Exit;
+      if ( FT_STREAM_READ_AT( cid->data_offset + off1,
+                              charstring, glyph_length ) )
+        goto Exit;
+    }
+
+    /* Now set up the subrs array and parse the charstrings. */
+    {
+      CID_FaceDict  dict;
+      CID_Subrs     cid_subrs = face->subrs + fd_select;
+      FT_Int        cs_offset;
+
+
+      /* Set up subrs */
+      decoder->num_subrs = cid_subrs->num_subrs;
+      decoder->subrs     = cid_subrs->code;
+      decoder->subrs_len = 0;
+
+      /* Set up font matrix */
+      dict                 = cid->font_dicts + fd_select;
+
+      decoder->font_matrix = dict->font_matrix;
+      decoder->font_offset = dict->font_offset;
+      decoder->lenIV       = dict->private_dict.lenIV;
+
+      /* Decode the charstring. */
+
+      /* Adjustment for seed bytes. */
+      cs_offset = ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );
+
+      /* Decrypt only if lenIV >= 0. */
+      if ( decoder->lenIV >= 0 )
+        psaux->t1_decrypt( charstring, glyph_length, 4330 );
+
+      error = decoder->funcs.parse_charstrings(
+                decoder, charstring + cs_offset,
+                (FT_Int)glyph_length - cs_offset );
+    }
+
+    FT_FREE( charstring );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    /* Incremental fonts can optionally override the metrics. */
+    if ( !error && inc && inc->funcs->get_glyph_metrics )
+    {
+      FT_Incremental_MetricsRec  metrics;
+
+
+      metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );
+      metrics.bearing_y = 0;
+      metrics.advance   = FIXED_TO_INT( decoder->builder.advance.x );
+      metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );
+
+      error = inc->funcs->get_glyph_metrics( inc->object,
+                                             glyph_index, FALSE, &metrics );
+
+      decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );
+      decoder->builder.advance.x      = INT_TO_FIXED( metrics.advance );
+      decoder->builder.advance.y      = INT_TO_FIXED( metrics.advance_v );
+    }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+  Exit:
+    return error;
+  }
+
+
+#if 0
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /**********                                                      *********/
+  /**********                                                      *********/
+  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/
+  /**********                                                      *********/
+  /**********    The following code is in charge of computing      *********/
+  /**********    the maximum advance width of the font.  It        *********/
+  /**********    quickly processes each glyph charstring to        *********/
+  /**********    extract the value from either a `sbw' or `seac'   *********/
+  /**********    operator.                                         *********/
+  /**********                                                      *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cid_face_compute_max_advance( CID_Face  face,
+                                FT_Int*   max_advance )
+  {
+    FT_Error       error;
+    T1_DecoderRec  decoder;
+    FT_Int         glyph_index;
+
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+
+    *max_advance = 0;
+
+    /* Initialize load decoder */
+    error = psaux->t1_decoder_funcs->init( &decoder,
+                                           (FT_Face)face,
+                                           0, /* size       */
+                                           0, /* glyph slot */
+                                           0, /* glyph names! XXX */
+                                           0, /* blend == 0 */
+                                           0, /* hinting == 0 */
+                                           cid_load_glyph );
+    if ( error )
+      return error;
+
+    /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
+    /*       if we ever support CID-keyed multiple master fonts     */
+
+    decoder.builder.metrics_only = 1;
+    decoder.builder.load_points  = 0;
+
+    /* for each glyph, parse the glyph charstring and extract */
+    /* the advance width                                      */
+    for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
+          glyph_index++ )
+    {
+      /* now get load the unscaled outline */
+      error = cid_load_glyph( &decoder, glyph_index );
+      /* ignore the error if one occurred - skip to next glyph */
+    }
+
+    *max_advance = FIXED_TO_INT( decoder.builder.advance.x );
+
+    psaux->t1_decoder_funcs->done( &decoder );
+
+    return FT_Err_Ok;
+  }
+
+
+#endif /* 0 */
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cid_slot_load_glyph( FT_GlyphSlot  cidglyph,      /* CID_GlyphSlot */
+                       FT_Size       cidsize,       /* CID_Size      */
+                       FT_UInt       glyph_index,
+                       FT_Int32      load_flags )
+  {
+    CID_GlyphSlot  glyph = (CID_GlyphSlot)cidglyph;
+    FT_Error       error;
+    T1_DecoderRec  decoder;
+    CID_Face       face = (CID_Face)cidglyph->face;
+    FT_Bool        hinting;
+
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+    FT_Matrix      font_matrix;
+    FT_Vector      font_offset;
+
+
+    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    if ( load_flags & FT_LOAD_NO_RECURSE )
+      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+    glyph->x_scale = cidsize->metrics.x_scale;
+    glyph->y_scale = cidsize->metrics.y_scale;
+
+    cidglyph->outline.n_points   = 0;
+    cidglyph->outline.n_contours = 0;
+
+    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
+                       ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+
+    cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+    error = psaux->t1_decoder_funcs->init( &decoder,
+                                           cidglyph->face,
+                                           cidsize,
+                                           cidglyph,
+                                           0, /* glyph names -- XXX */
+                                           0, /* blend == 0 */
+                                           hinting,
+                                           FT_LOAD_TARGET_MODE( load_flags ),
+                                           cid_load_glyph );
+    if ( error )
+      goto Exit;
+
+    /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
+    /*       if we ever support CID-keyed multiple master fonts     */
+
+    /* set up the decoder */
+    decoder.builder.no_recurse = FT_BOOL(
+      ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) );
+
+    error = cid_load_glyph( &decoder, glyph_index );
+    if ( error )
+      goto Exit;
+
+    font_matrix = decoder.font_matrix;
+    font_offset = decoder.font_offset;
+
+    /* save new glyph tables */
+    psaux->t1_decoder_funcs->done( &decoder );
+
+    /* now set the metrics -- this is rather simple, as    */
+    /* the left side bearing is the xMin, and the top side */
+    /* bearing the yMax                                    */
+    cidglyph->outline.flags &= FT_OUTLINE_OWNER;
+    cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
+
+    /* for composite glyphs, return only left side bearing and */
+    /* advance width                                           */
+    if ( load_flags & FT_LOAD_NO_RECURSE )
+    {
+      FT_Slot_Internal  internal = cidglyph->internal;
+
+
+      cidglyph->metrics.horiBearingX =
+        FIXED_TO_INT( decoder.builder.left_bearing.x );
+      cidglyph->metrics.horiAdvance =
+        FIXED_TO_INT( decoder.builder.advance.x );
+
+      internal->glyph_matrix      = font_matrix;
+      internal->glyph_delta       = font_offset;
+      internal->glyph_transformed = 1;
+    }
+    else
+    {
+      FT_BBox            cbox;
+      FT_Glyph_Metrics*  metrics = &cidglyph->metrics;
+      FT_Vector          advance;
+
+
+      /* copy the _unscaled_ advance width */
+      metrics->horiAdvance =
+        FIXED_TO_INT( decoder.builder.advance.x );
+      cidglyph->linearHoriAdvance =
+        FIXED_TO_INT( decoder.builder.advance.x );
+      cidglyph->internal->glyph_transformed = 0;
+
+      /* make up vertical ones */
+      metrics->vertAdvance        = ( face->cid.font_bbox.yMax -
+                                      face->cid.font_bbox.yMin ) >> 16;
+      cidglyph->linearVertAdvance = metrics->vertAdvance;
+
+      cidglyph->format            = FT_GLYPH_FORMAT_OUTLINE;
+
+      if ( cidsize->metrics.y_ppem < 24 )
+        cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+      /* apply the font matrix */
+      FT_Outline_Transform( &cidglyph->outline, &font_matrix );
+
+      FT_Outline_Translate( &cidglyph->outline,
+                            font_offset.x,
+                            font_offset.y );
+
+      advance.x = metrics->horiAdvance;
+      advance.y = 0;
+      FT_Vector_Transform( &advance, &font_matrix );
+      metrics->horiAdvance = advance.x + font_offset.x;
+
+      advance.x = 0;
+      advance.y = metrics->vertAdvance;
+      FT_Vector_Transform( &advance, &font_matrix );
+      metrics->vertAdvance = advance.y + font_offset.y;
+
+      if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
+      {
+        /* scale the outline and the metrics */
+        FT_Int       n;
+        FT_Outline*  cur = decoder.builder.base;
+        FT_Vector*   vec = cur->points;
+        FT_Fixed     x_scale = glyph->x_scale;
+        FT_Fixed     y_scale = glyph->y_scale;
+
+
+        /* First of all, scale the points */
+        if ( !hinting || !decoder.builder.hints_funcs )
+          for ( n = cur->n_points; n > 0; n--, vec++ )
+          {
+            vec->x = FT_MulFix( vec->x, x_scale );
+            vec->y = FT_MulFix( vec->y, y_scale );
+          }
+
+        /* Then scale the metrics */
+        metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+        metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+      }
+
+      /* compute the other metrics */
+      FT_Outline_Get_CBox( &cidglyph->outline, &cbox );
+
+      metrics->width  = cbox.xMax - cbox.xMin;
+      metrics->height = cbox.yMax - cbox.yMin;
+
+      metrics->horiBearingX = cbox.xMin;
+      metrics->horiBearingY = cbox.yMax;
+
+      if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+      {
+        /* make up vertical ones */
+        ft_synthesize_vertical_metrics( metrics,
+                                        metrics->vertAdvance );
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.h
new file mode 100644
index 0000000..e701793
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.h
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidgload.h                                                             */
+/*                                                                         */
+/*    OpenType Glyph Loader (specification).                               */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CIDGLOAD_H__
+#define __CIDGLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "cidobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#if 0
+
+  /* Compute the maximum advance width of a font through quick parsing */
+  FT_LOCAL( FT_Error )
+  cid_face_compute_max_advance( CID_Face  face,
+                                FT_Int*   max_advance );
+
+#endif /* 0 */
+
+  FT_LOCAL( FT_Error )
+  cid_slot_load_glyph( FT_GlyphSlot  glyph,         /* CID_Glyph_Slot */
+                       FT_Size       size,          /* CID_Size       */
+                       FT_UInt       glyph_index,
+                       FT_Int32      load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __CIDGLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.c
new file mode 100644
index 0000000..bfb25dc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.c
@@ -0,0 +1,690 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidload.c                                                              */
+/*                                                                         */
+/*    CID-keyed Type1 font loader (body).                                  */
+/*                                                                         */
+/*  Copyright 1996-2006, 2009, 2011-2013 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/t1types.h"
+
+#include "cidload.h"
+
+#include "ciderrs.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cidload
+
+
+  /* read a single offset */
+  FT_LOCAL_DEF( FT_Long )
+  cid_get_offset( FT_Byte*  *start,
+                  FT_Byte    offsize )
+  {
+    FT_ULong  result;
+    FT_Byte*  p = *start;
+
+
+    for ( result = 0; offsize > 0; offsize-- )
+    {
+      result <<= 8;
+      result  |= *p++;
+    }
+
+    *start = p;
+    return (FT_Long)result;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    TYPE 1 SYMBOL PARSING                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  static FT_Error
+  cid_load_keyword( CID_Face        face,
+                    CID_Loader*     loader,
+                    const T1_Field  keyword )
+  {
+    FT_Error      error;
+    CID_Parser*   parser = &loader->parser;
+    FT_Byte*      object;
+    void*         dummy_object;
+    CID_FaceInfo  cid = &face->cid;
+
+
+    /* if the keyword has a dedicated callback, call it */
+    if ( keyword->type == T1_FIELD_TYPE_CALLBACK )
+    {
+      keyword->reader( (FT_Face)face, parser );
+      error = parser->root.error;
+      goto Exit;
+    }
+
+    /* we must now compute the address of our target object */
+    switch ( keyword->location )
+    {
+    case T1_FIELD_LOCATION_CID_INFO:
+      object = (FT_Byte*)cid;
+      break;
+
+    case T1_FIELD_LOCATION_FONT_INFO:
+      object = (FT_Byte*)&cid->font_info;
+      break;
+
+    case T1_FIELD_LOCATION_FONT_EXTRA:
+      object = (FT_Byte*)&face->font_extra;
+      break;
+
+    case T1_FIELD_LOCATION_BBOX:
+      object = (FT_Byte*)&cid->font_bbox;
+      break;
+
+    default:
+      {
+        CID_FaceDict  dict;
+
+
+        if ( parser->num_dict < 0 || parser->num_dict >= cid->num_dicts )
+        {
+          FT_ERROR(( "cid_load_keyword: invalid use of `%s'\n",
+                     keyword->ident ));
+          error = FT_THROW( Syntax_Error );
+          goto Exit;
+        }
+
+        dict = cid->font_dicts + parser->num_dict;
+        switch ( keyword->location )
+        {
+        case T1_FIELD_LOCATION_PRIVATE:
+          object = (FT_Byte*)&dict->private_dict;
+          break;
+
+        default:
+          object = (FT_Byte*)dict;
+        }
+      }
+    }
+
+    dummy_object = object;
+
+    /* now, load the keyword data in the object's field(s) */
+    if ( keyword->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
+         keyword->type == T1_FIELD_TYPE_FIXED_ARRAY   )
+      error = cid_parser_load_field_table( &loader->parser, keyword,
+                                           &dummy_object );
+    else
+      error = cid_parser_load_field( &loader->parser,
+                                     keyword, &dummy_object );
+  Exit:
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  cid_parse_font_matrix( CID_Face     face,
+                         CID_Parser*  parser )
+  {
+    FT_Matrix*    matrix;
+    FT_Vector*    offset;
+    CID_FaceDict  dict;
+    FT_Face       root = (FT_Face)&face->root;
+    FT_Fixed      temp[6];
+    FT_Fixed      temp_scale;
+
+
+    if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )
+    {
+      dict   = face->cid.font_dicts + parser->num_dict;
+      matrix = &dict->font_matrix;
+      offset = &dict->font_offset;
+
+      (void)cid_parser_to_fixed_array( parser, 6, temp, 3 );
+
+      temp_scale = FT_ABS( temp[3] );
+
+      /* Set Units per EM based on FontMatrix values.  We set the value to */
+      /* 1000 / temp_scale, because temp_scale was already multiplied by   */
+      /* 1000 (in t1_tofixed, from psobjs.c).                              */
+
+      root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
+
+      /* we need to scale the values by 1.0/temp[3] */
+      if ( temp_scale != 0x10000L )
+      {
+        temp[0] = FT_DivFix( temp[0], temp_scale );
+        temp[1] = FT_DivFix( temp[1], temp_scale );
+        temp[2] = FT_DivFix( temp[2], temp_scale );
+        temp[4] = FT_DivFix( temp[4], temp_scale );
+        temp[5] = FT_DivFix( temp[5], temp_scale );
+        temp[3] = 0x10000L;
+      }
+
+      matrix->xx = temp[0];
+      matrix->yx = temp[1];
+      matrix->xy = temp[2];
+      matrix->yy = temp[3];
+
+      /* note that the font offsets are expressed in integer font units */
+      offset->x  = temp[4] >> 16;
+      offset->y  = temp[5] >> 16;
+    }
+
+    return FT_Err_Ok;      /* this is a callback function; */
+                            /* we must return an error code */
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  parse_fd_array( CID_Face     face,
+                  CID_Parser*  parser )
+  {
+    CID_FaceInfo  cid    = &face->cid;
+    FT_Memory     memory = face->root.memory;
+    FT_Error      error  = FT_Err_Ok;
+    FT_Long       num_dicts;
+
+
+    num_dicts = cid_parser_to_int( parser );
+
+    if ( !cid->font_dicts )
+    {
+      FT_Int  n;
+
+
+      if ( FT_NEW_ARRAY( cid->font_dicts, num_dicts ) )
+        goto Exit;
+
+      cid->num_dicts = (FT_UInt)num_dicts;
+
+      /* don't forget to set a few defaults */
+      for ( n = 0; n < cid->num_dicts; n++ )
+      {
+        CID_FaceDict  dict = cid->font_dicts + n;
+
+
+        /* default value for lenIV */
+        dict->private_dict.lenIV = 4;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* by mistake, `expansion_factor' appears both in PS_PrivateRec */
+  /* and CID_FaceDictRec (both are public header files and can't  */
+  /* changed); we simply copy the value                           */
+
+  FT_CALLBACK_DEF( FT_Error )
+  parse_expansion_factor( CID_Face     face,
+                          CID_Parser*  parser )
+  {
+    CID_FaceDict  dict;
+
+
+    if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )
+    {
+      dict = face->cid.font_dicts + parser->num_dict;
+
+      dict->expansion_factor              = cid_parser_to_fixed( parser, 0 );
+      dict->private_dict.expansion_factor = dict->expansion_factor;
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  static
+  const T1_FieldRec  cid_field_records[] =
+  {
+
+#include "cidtoken.h"
+
+    T1_FIELD_CALLBACK( "FDArray",         parse_fd_array, 0 )
+    T1_FIELD_CALLBACK( "FontMatrix",      cid_parse_font_matrix, 0 )
+    T1_FIELD_CALLBACK( "ExpansionFactor", parse_expansion_factor, 0 )
+
+    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
+  };
+
+
+  static FT_Error
+  cid_parse_dict( CID_Face     face,
+                  CID_Loader*  loader,
+                  FT_Byte*     base,
+                  FT_Long      size )
+  {
+    CID_Parser*  parser = &loader->parser;
+
+
+    parser->root.cursor = base;
+    parser->root.limit  = base + size;
+    parser->root.error  = FT_Err_Ok;
+
+    {
+      FT_Byte*  cur   = base;
+      FT_Byte*  limit = cur + size;
+
+
+      for (;;)
+      {
+        FT_Byte*  newlimit;
+
+
+        parser->root.cursor = cur;
+        cid_parser_skip_spaces( parser );
+
+        if ( parser->root.cursor >= limit )
+          newlimit = limit - 1 - 17;
+        else
+          newlimit = parser->root.cursor - 17;
+
+        /* look for `%ADOBeginFontDict' */
+        for ( ; cur < newlimit; cur++ )
+        {
+          if ( *cur == '%'                                            &&
+               ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 )
+          {
+            /* if /FDArray was found, then cid->num_dicts is > 0, and */
+            /* we can start increasing parser->num_dict               */
+            if ( face->cid.num_dicts > 0 )
+              parser->num_dict++;
+          }
+        }
+
+        cur = parser->root.cursor;
+        /* no error can occur in cid_parser_skip_spaces */
+        if ( cur >= limit )
+          break;
+
+        cid_parser_skip_PS_token( parser );
+        if ( parser->root.cursor >= limit || parser->root.error )
+          break;
+
+        /* look for immediates */
+        if ( *cur == '/' && cur + 2 < limit )
+        {
+          FT_PtrDist  len;
+
+
+          cur++;
+          len = parser->root.cursor - cur;
+
+          if ( len > 0 && len < 22 )
+          {
+            /* now compare the immediate name to the keyword table */
+            T1_Field  keyword = (T1_Field)cid_field_records;
+
+
+            for (;;)
+            {
+              FT_Byte*  name;
+
+
+              name = (FT_Byte*)keyword->ident;
+              if ( !name )
+                break;
+
+              if ( cur[0] == name[0]                                 &&
+                   len == (FT_PtrDist)ft_strlen( (const char*)name ) )
+              {
+                FT_PtrDist  n;
+
+
+                for ( n = 1; n < len; n++ )
+                  if ( cur[n] != name[n] )
+                    break;
+
+                if ( n >= len )
+                {
+                  /* we found it - run the parsing callback */
+                  parser->root.error = cid_load_keyword( face,
+                                                         loader,
+                                                         keyword );
+                  if ( parser->root.error )
+                    return parser->root.error;
+                  break;
+                }
+              }
+              keyword++;
+            }
+          }
+        }
+
+        cur = parser->root.cursor;
+      }
+    }
+    return parser->root.error;
+  }
+
+
+  /* read the subrmap and the subrs of each font dict */
+  static FT_Error
+  cid_read_subrs( CID_Face  face )
+  {
+    CID_FaceInfo   cid    = &face->cid;
+    FT_Memory      memory = face->root.memory;
+    FT_Stream      stream = face->cid_stream;
+    FT_Error       error;
+    FT_Int         n;
+    CID_Subrs      subr;
+    FT_UInt        max_offsets = 0;
+    FT_ULong*      offsets = 0;
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+
+    if ( FT_NEW_ARRAY( face->subrs, cid->num_dicts ) )
+      goto Exit;
+
+    subr = face->subrs;
+    for ( n = 0; n < cid->num_dicts; n++, subr++ )
+    {
+      CID_FaceDict  dict  = cid->font_dicts + n;
+      FT_Int        lenIV = dict->private_dict.lenIV;
+      FT_UInt       count, num_subrs = dict->num_subrs;
+      FT_ULong      data_len;
+      FT_Byte*      p;
+
+
+      /* Check for possible overflow. */
+      if ( num_subrs == FT_UINT_MAX )
+      {
+        error = FT_THROW( Syntax_Error );
+        goto Fail;
+      }
+
+      /* reallocate offsets array if needed */
+      if ( num_subrs + 1 > max_offsets )
+      {
+        FT_UInt  new_max = FT_PAD_CEIL( num_subrs + 1, 4 );
+
+
+        if ( new_max <= max_offsets )
+        {
+          error = FT_THROW( Syntax_Error );
+          goto Fail;
+        }
+
+        if ( FT_RENEW_ARRAY( offsets, max_offsets, new_max ) )
+          goto Fail;
+
+        max_offsets = new_max;
+      }
+
+      /* read the subrmap's offsets */
+      if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) ||
+           FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes )      )
+        goto Fail;
+
+      p = (FT_Byte*)stream->cursor;
+      for ( count = 0; count <= num_subrs; count++ )
+        offsets[count] = cid_get_offset( &p, (FT_Byte)dict->sd_bytes );
+
+      FT_FRAME_EXIT();
+
+      /* offsets must be ordered */
+      for ( count = 1; count <= num_subrs; count++ )
+        if ( offsets[count - 1] > offsets[count] )
+          goto Fail;
+
+      /* now, compute the size of subrs charstrings, */
+      /* allocate, and read them                     */
+      data_len = offsets[num_subrs] - offsets[0];
+
+      if ( FT_NEW_ARRAY( subr->code, num_subrs + 1 ) ||
+               FT_ALLOC( subr->code[0], data_len )   )
+        goto Fail;
+
+      if ( FT_STREAM_SEEK( cid->data_offset + offsets[0] ) ||
+           FT_STREAM_READ( subr->code[0], data_len )  )
+        goto Fail;
+
+      /* set up pointers */
+      for ( count = 1; count <= num_subrs; count++ )
+      {
+        FT_ULong  len;
+
+
+        len               = offsets[count] - offsets[count - 1];
+        subr->code[count] = subr->code[count - 1] + len;
+      }
+
+      /* decrypt subroutines, but only if lenIV >= 0 */
+      if ( lenIV >= 0 )
+      {
+        for ( count = 0; count < num_subrs; count++ )
+        {
+          FT_ULong  len;
+
+
+          len = offsets[count + 1] - offsets[count];
+          psaux->t1_decrypt( subr->code[count], len, 4330 );
+        }
+      }
+
+      subr->num_subrs = num_subrs;
+    }
+
+  Exit:
+    FT_FREE( offsets );
+    return error;
+
+  Fail:
+    if ( face->subrs )
+    {
+      for ( n = 0; n < cid->num_dicts; n++ )
+      {
+        if ( face->subrs[n].code )
+          FT_FREE( face->subrs[n].code[0] );
+
+        FT_FREE( face->subrs[n].code );
+      }
+      FT_FREE( face->subrs );
+    }
+    goto Exit;
+  }
+
+
+  static void
+  cid_init_loader( CID_Loader*  loader,
+                   CID_Face     face )
+  {
+    FT_UNUSED( face );
+
+    FT_MEM_ZERO( loader, sizeof ( *loader ) );
+  }
+
+
+  static  void
+  cid_done_loader( CID_Loader*  loader )
+  {
+    CID_Parser*  parser = &loader->parser;
+
+
+    /* finalize parser */
+    cid_parser_done( parser );
+  }
+
+
+  static FT_Error
+  cid_hex_to_binary( FT_Byte*  data,
+                     FT_Long   data_len,
+                     FT_ULong  offset,
+                     CID_Face  face )
+  {
+    FT_Stream  stream = face->root.stream;
+    FT_Error   error;
+
+    FT_Byte    buffer[256];
+    FT_Byte   *p, *plimit;
+    FT_Byte   *d, *dlimit;
+    FT_Byte    val;
+
+    FT_Bool    upper_nibble, done;
+
+
+    if ( FT_STREAM_SEEK( offset ) )
+      goto Exit;
+
+    d      = data;
+    dlimit = d + data_len;
+    p      = buffer;
+    plimit = p;
+
+    upper_nibble = 1;
+    done         = 0;
+
+    while ( d < dlimit )
+    {
+      if ( p >= plimit )
+      {
+        FT_ULong  oldpos = FT_STREAM_POS();
+        FT_ULong  size   = stream->size - oldpos;
+
+
+        if ( size == 0 )
+        {
+          error = FT_THROW( Syntax_Error );
+          goto Exit;
+        }
+
+        if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) )
+          goto Exit;
+        p      = buffer;
+        plimit = p + FT_STREAM_POS() - oldpos;
+      }
+
+      if ( ft_isdigit( *p ) )
+        val = (FT_Byte)( *p - '0' );
+      else if ( *p >= 'a' && *p <= 'f' )
+        val = (FT_Byte)( *p - 'a' );
+      else if ( *p >= 'A' && *p <= 'F' )
+        val = (FT_Byte)( *p - 'A' + 10 );
+      else if ( *p == ' '  ||
+                *p == '\t' ||
+                *p == '\r' ||
+                *p == '\n' ||
+                *p == '\f' ||
+                *p == '\0' )
+      {
+        p++;
+        continue;
+      }
+      else if ( *p == '>' )
+      {
+        val  = 0;
+        done = 1;
+      }
+      else
+      {
+        error = FT_THROW( Syntax_Error );
+        goto Exit;
+      }
+
+      if ( upper_nibble )
+        *d = (FT_Byte)( val << 4 );
+      else
+      {
+        *d = (FT_Byte)( *d + val );
+        d++;
+      }
+
+      upper_nibble = (FT_Byte)( 1 - upper_nibble );
+
+      if ( done )
+        break;
+
+      p++;
+    }
+
+    error = FT_Err_Ok;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cid_face_open( CID_Face  face,
+                 FT_Int    face_index )
+  {
+    CID_Loader   loader;
+    CID_Parser*  parser;
+    FT_Memory    memory = face->root.memory;
+    FT_Error     error;
+
+
+    cid_init_loader( &loader, face );
+
+    parser = &loader.parser;
+    error = cid_parser_new( parser, face->root.stream, face->root.memory,
+                            (PSAux_Service)face->psaux );
+    if ( error )
+      goto Exit;
+
+    error = cid_parse_dict( face, &loader,
+                            parser->postscript,
+                            parser->postscript_len );
+    if ( error )
+      goto Exit;
+
+    if ( face_index < 0 )
+      goto Exit;
+
+    if ( FT_NEW( face->cid_stream ) )
+      goto Exit;
+
+    if ( parser->binary_length )
+    {
+      /* we must convert the data section from hexadecimal to binary */
+      if ( FT_ALLOC( face->binary_data, parser->binary_length )         ||
+           cid_hex_to_binary( face->binary_data, parser->binary_length,
+                              parser->data_offset, face )               )
+        goto Exit;
+
+      FT_Stream_OpenMemory( face->cid_stream,
+                            face->binary_data, parser->binary_length );
+      face->cid.data_offset = 0;
+    }
+    else
+    {
+      *face->cid_stream     = *face->root.stream;
+      face->cid.data_offset = loader.parser.data_offset;
+    }
+
+    error = cid_read_subrs( face );
+
+  Exit:
+    cid_done_loader( &loader );
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.h
new file mode 100644
index 0000000..523f7ee
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.h
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidload.h                                                              */
+/*                                                                         */
+/*    CID-keyed Type1 font loader (specification).                         */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CIDLOAD_H__
+#define __CIDLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "cidparse.h"
+
+
+FT_BEGIN_HEADER
+
+
+  typedef struct  CID_Loader_
+  {
+    CID_Parser  parser;          /* parser used to read the stream */
+    FT_Int      num_chars;       /* number of characters in encoding */
+
+  } CID_Loader;
+
+
+  FT_LOCAL( FT_Long )
+  cid_get_offset( FT_Byte**  start,
+                  FT_Byte    offsize );
+
+  FT_LOCAL( FT_Error )
+  cid_face_open( CID_Face  face,
+                 FT_Int    face_index );
+
+
+FT_END_HEADER
+
+#endif /* __CIDLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.c
new file mode 100644
index 0000000..7708600
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.c
@@ -0,0 +1,491 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidobjs.c                                                              */
+/*                                                                         */
+/*    CID objects manager (body).                                          */
+/*                                                                         */
+/*  Copyright 1996-2006, 2008, 2010-2011, 2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+#include "cidgload.h"
+#include "cidload.h"
+
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/internal/pshints.h"
+
+#include "ciderrs.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cidobjs
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            SLOT  FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  cid_slot_done( FT_GlyphSlot  slot )
+  {
+    slot->internal->glyph_hints = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cid_slot_init( FT_GlyphSlot  slot )
+  {
+    CID_Face          face;
+    PSHinter_Service  pshinter;
+
+
+    face     = (CID_Face)slot->face;
+    pshinter = (PSHinter_Service)face->pshinter;
+
+    if ( pshinter )
+    {
+      FT_Module  module;
+
+
+      module = FT_Get_Module( slot->face->driver->root.library,
+                              "pshinter" );
+      if ( module )
+      {
+        T1_Hints_Funcs  funcs;
+
+
+        funcs = pshinter->get_t1_funcs( module );
+        slot->internal->glyph_hints = (void*)funcs;
+      }
+    }
+
+    return 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                           SIZE  FUNCTIONS                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static PSH_Globals_Funcs
+  cid_size_get_globals_funcs( CID_Size  size )
+  {
+    CID_Face          face     = (CID_Face)size->root.face;
+    PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;
+    FT_Module         module;
+
+
+    module = FT_Get_Module( size->root.face->driver->root.library,
+                            "pshinter" );
+    return ( module && pshinter && pshinter->get_globals_funcs )
+           ? pshinter->get_globals_funcs( module )
+           : 0;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cid_size_done( FT_Size  cidsize )         /* CID_Size */
+  {
+    CID_Size  size = (CID_Size)cidsize;
+
+
+    if ( cidsize->internal )
+    {
+      PSH_Globals_Funcs  funcs;
+
+
+      funcs = cid_size_get_globals_funcs( size );
+      if ( funcs )
+        funcs->destroy( (PSH_Globals)cidsize->internal );
+
+      cidsize->internal = 0;
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cid_size_init( FT_Size  cidsize )     /* CID_Size */
+  {
+    CID_Size           size  = (CID_Size)cidsize;
+    FT_Error           error = FT_Err_Ok;
+    PSH_Globals_Funcs  funcs = cid_size_get_globals_funcs( size );
+
+
+    if ( funcs )
+    {
+      PSH_Globals   globals;
+      CID_Face      face = (CID_Face)cidsize->face;
+      CID_FaceDict  dict = face->cid.font_dicts + face->root.face_index;
+      PS_Private    priv = &dict->private_dict;
+
+
+      error = funcs->create( cidsize->face->memory, priv, &globals );
+      if ( !error )
+        cidsize->internal = (FT_Size_Internal)(void*)globals;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL( FT_Error )
+  cid_size_request( FT_Size          size,
+                    FT_Size_Request  req )
+  {
+    PSH_Globals_Funcs  funcs;
+
+
+    FT_Request_Metrics( size->face, req );
+
+    funcs = cid_size_get_globals_funcs( (CID_Size)size );
+
+    if ( funcs )
+      funcs->set_scale( (PSH_Globals)size->internal,
+                        size->metrics.x_scale,
+                        size->metrics.y_scale,
+                        0, 0 );
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                           FACE  FUNCTIONS                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cid_face_done                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a given face object.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A pointer to the face object to destroy.                   */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  cid_face_done( FT_Face  cidface )         /* CID_Face */
+  {
+    CID_Face      face = (CID_Face)cidface;
+    FT_Memory     memory;
+    CID_FaceInfo  cid;
+    PS_FontInfo   info;
+
+
+    if ( !face )
+      return;
+
+    cid    = &face->cid;
+    info   = &cid->font_info;
+    memory = cidface->memory;
+
+    /* release subrs */
+    if ( face->subrs )
+    {
+      FT_Int  n;
+
+
+      for ( n = 0; n < cid->num_dicts; n++ )
+      {
+        CID_Subrs  subr = face->subrs + n;
+
+
+        if ( subr->code )
+        {
+          FT_FREE( subr->code[0] );
+          FT_FREE( subr->code );
+        }
+      }
+
+      FT_FREE( face->subrs );
+    }
+
+    /* release FontInfo strings */
+    FT_FREE( info->version );
+    FT_FREE( info->notice );
+    FT_FREE( info->full_name );
+    FT_FREE( info->family_name );
+    FT_FREE( info->weight );
+
+    /* release font dictionaries */
+    FT_FREE( cid->font_dicts );
+    cid->num_dicts = 0;
+
+    /* release other strings */
+    FT_FREE( cid->cid_font_name );
+    FT_FREE( cid->registry );
+    FT_FREE( cid->ordering );
+
+    cidface->family_name = 0;
+    cidface->style_name  = 0;
+
+    FT_FREE( face->binary_data );
+    FT_FREE( face->cid_stream );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cid_face_init                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given CID face object.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     :: The source font stream.                              */
+  /*                                                                       */
+  /*    face_index :: The index of the font face in the resource.          */
+  /*                                                                       */
+  /*    num_params :: Number of additional generic parameters.  Ignored.   */
+  /*                                                                       */
+  /*    params     :: Additional generic parameters.  Ignored.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The newly built face object.                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  cid_face_init( FT_Stream      stream,
+                 FT_Face        cidface,        /* CID_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params )
+  {
+    CID_Face          face = (CID_Face)cidface;
+    FT_Error          error;
+    PSAux_Service     psaux;
+    PSHinter_Service  pshinter;
+
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+    FT_UNUSED( stream );
+
+
+    cidface->num_faces = 1;
+
+    psaux = (PSAux_Service)face->psaux;
+    if ( !psaux )
+    {
+      psaux = (PSAux_Service)FT_Get_Module_Interface(
+                FT_FACE_LIBRARY( face ), "psaux" );
+
+      if ( !psaux )
+      {
+        FT_ERROR(( "cid_face_init: cannot access `psaux' module\n" ));
+        error = FT_THROW( Missing_Module );
+        goto Exit;
+      }
+
+      face->psaux = psaux;
+    }
+
+    pshinter = (PSHinter_Service)face->pshinter;
+    if ( !pshinter )
+    {
+      pshinter = (PSHinter_Service)FT_Get_Module_Interface(
+                   FT_FACE_LIBRARY( face ), "pshinter" );
+
+      face->pshinter = pshinter;
+    }
+
+    FT_TRACE2(( "CID driver\n" ));
+
+    /* open the tokenizer; this will also check the font format */
+    if ( FT_STREAM_SEEK( 0 ) )
+      goto Exit;
+
+    error = cid_face_open( face, face_index );
+    if ( error )
+      goto Exit;
+
+    /* if we just wanted to check the format, leave successfully now */
+    if ( face_index < 0 )
+      goto Exit;
+
+    /* check the face index */
+    /* XXX: handle CID fonts with more than a single face */
+    if ( face_index != 0 )
+    {
+      FT_ERROR(( "cid_face_init: invalid face index\n" ));
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    /* now load the font program into the face object */
+
+    /* initialize the face object fields */
+
+    /* set up root face fields */
+    {
+      CID_FaceInfo  cid  = &face->cid;
+      PS_FontInfo   info = &cid->font_info;
+
+
+      cidface->num_glyphs   = cid->cid_count;
+      cidface->num_charmaps = 0;
+
+      cidface->face_index = face_index;
+      cidface->face_flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */
+                            FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */
+                            FT_FACE_FLAG_HINTER;      /* has native hinter */
+
+      if ( info->is_fixed_pitch )
+        cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+      /* XXX: TODO: add kerning with .afm support */
+
+      /* get style name -- be careful, some broken fonts only */
+      /* have a /FontName dictionary entry!                   */
+      cidface->family_name = info->family_name;
+      /* assume "Regular" style if we don't know better */
+      cidface->style_name = (char *)"Regular";
+      if ( cidface->family_name )
+      {
+        char*  full   = info->full_name;
+        char*  family = cidface->family_name;
+
+
+        if ( full )
+        {
+          while ( *full )
+          {
+            if ( *full == *family )
+            {
+              family++;
+              full++;
+            }
+            else
+            {
+              if ( *full == ' ' || *full == '-' )
+                full++;
+              else if ( *family == ' ' || *family == '-' )
+                family++;
+              else
+              {
+                if ( !*family )
+                  cidface->style_name = full;
+                break;
+              }
+            }
+          }
+        }
+      }
+      else
+      {
+        /* do we have a `/FontName'? */
+        if ( cid->cid_font_name )
+          cidface->family_name = cid->cid_font_name;
+      }
+
+      /* compute style flags */
+      cidface->style_flags = 0;
+      if ( info->italic_angle )
+        cidface->style_flags |= FT_STYLE_FLAG_ITALIC;
+      if ( info->weight )
+      {
+        if ( !ft_strcmp( info->weight, "Bold"  ) ||
+             !ft_strcmp( info->weight, "Black" ) )
+          cidface->style_flags |= FT_STYLE_FLAG_BOLD;
+      }
+
+      /* no embedded bitmap support */
+      cidface->num_fixed_sizes = 0;
+      cidface->available_sizes = 0;
+
+      cidface->bbox.xMin =   cid->font_bbox.xMin            >> 16;
+      cidface->bbox.yMin =   cid->font_bbox.yMin            >> 16;
+      /* no `U' suffix here to 0xFFFF! */
+      cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16;
+      cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16;
+
+      if ( !cidface->units_per_EM )
+        cidface->units_per_EM = 1000;
+
+      cidface->ascender  = (FT_Short)( cidface->bbox.yMax );
+      cidface->descender = (FT_Short)( cidface->bbox.yMin );
+
+      cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 );
+      if ( cidface->height < cidface->ascender - cidface->descender )
+        cidface->height = (FT_Short)( cidface->ascender - cidface->descender );
+
+      cidface->underline_position  = (FT_Short)info->underline_position;
+      cidface->underline_thickness = (FT_Short)info->underline_thickness;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cid_driver_init                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given CID driver object.                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target driver object.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  cid_driver_init( FT_Module  driver )
+  {
+    FT_UNUSED( driver );
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cid_driver_done                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a given CID driver.                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target CID driver.                       */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  cid_driver_done( FT_Module  driver )
+  {
+    FT_UNUSED( driver );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.h
new file mode 100644
index 0000000..53c4c39
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.h
@@ -0,0 +1,154 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidobjs.h                                                              */
+/*                                                                         */
+/*    CID objects manager (specification).                                 */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2006 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CIDOBJS_H__
+#define __CIDOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* The following structures must be defined by the hinter */
+  typedef struct CID_Size_Hints_   CID_Size_Hints;
+  typedef struct CID_Glyph_Hints_  CID_Glyph_Hints;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CID_Driver                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 driver object.                                */
+  /*                                                                       */
+  typedef struct CID_DriverRec_*  CID_Driver;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CID_Size                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 size object.                                  */
+  /*                                                                       */
+  typedef struct CID_SizeRec_*  CID_Size;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CID_GlyphSlot                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 glyph slot object.                            */
+  /*                                                                       */
+  typedef struct CID_GlyphSlotRec_*  CID_GlyphSlot;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CID_CharMap                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 character mapping object.                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The Type 1 format doesn't use a charmap but an encoding table.     */
+  /*    The driver is responsible for making up charmap objects            */
+  /*    corresponding to these tables.                                     */
+  /*                                                                       */
+  typedef struct CID_CharMapRec_*  CID_CharMap;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* HERE BEGINS THE TYPE 1 SPECIFIC STUFF                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  typedef struct  CID_SizeRec_
+  {
+    FT_SizeRec  root;
+    FT_Bool     valid;
+
+  } CID_SizeRec;
+
+
+  typedef struct  CID_GlyphSlotRec_
+  {
+    FT_GlyphSlotRec  root;
+
+    FT_Bool          hint;
+    FT_Bool          scaled;
+
+    FT_Fixed         x_scale;
+    FT_Fixed         y_scale;
+
+  } CID_GlyphSlotRec;
+
+
+  FT_LOCAL( void )
+  cid_slot_done( FT_GlyphSlot  slot );
+
+  FT_LOCAL( FT_Error )
+  cid_slot_init( FT_GlyphSlot  slot );
+
+
+  FT_LOCAL( void )
+  cid_size_done( FT_Size  size );       /* CID_Size */
+
+  FT_LOCAL( FT_Error )
+  cid_size_init( FT_Size  size );       /* CID_Size */
+
+  FT_LOCAL( FT_Error )
+  cid_size_request( FT_Size          size,      /* CID_Size */
+                    FT_Size_Request  req );
+
+  FT_LOCAL( FT_Error )
+  cid_face_init( FT_Stream      stream,
+                 FT_Face        face,           /* CID_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params );
+
+  FT_LOCAL( void )
+  cid_face_done( FT_Face  face );               /* CID_Face */
+
+
+  FT_LOCAL( FT_Error )
+  cid_driver_init( FT_Module  driver );
+
+  FT_LOCAL( void )
+  cid_driver_done( FT_Module  driver );
+
+
+FT_END_HEADER
+
+#endif /* __CIDOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.c
new file mode 100644
index 0000000..dccc4db
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.c
@@ -0,0 +1,225 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidparse.c                                                             */
+/*                                                                         */
+/*    CID-keyed Type1 parser (body).                                       */
+/*                                                                         */
+/*  Copyright 1996-2007, 2009, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+#include "cidparse.h"
+
+#include "ciderrs.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cidparse
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    INPUT STREAM PARSER                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cid_parser_new( CID_Parser*    parser,
+                  FT_Stream      stream,
+                  FT_Memory      memory,
+                  PSAux_Service  psaux )
+  {
+    FT_Error  error;
+    FT_ULong  base_offset, offset, ps_len;
+    FT_Byte   *cur, *limit;
+    FT_Byte   *arg1, *arg2;
+
+
+    FT_MEM_ZERO( parser, sizeof ( *parser ) );
+    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
+
+    parser->stream = stream;
+
+    base_offset = FT_STREAM_POS();
+
+    /* first of all, check the font format in the header */
+    if ( FT_FRAME_ENTER( 31 ) )
+      goto Exit;
+
+    if ( ft_strncmp( (char *)stream->cursor,
+                     "%!PS-Adobe-3.0 Resource-CIDFont", 31 ) )
+    {
+      FT_TRACE2(( "  not a CID-keyed font\n" ));
+      error = FT_THROW( Unknown_File_Format );
+    }
+
+    FT_FRAME_EXIT();
+    if ( error )
+      goto Exit;
+
+  Again:
+    /* now, read the rest of the file until we find */
+    /* `StartData' or `/sfnts'                      */
+    {
+      FT_Byte   buffer[256 + 10];
+      FT_Long   read_len = 256 + 10; /* same as signed FT_Stream->size */
+      FT_Byte*  p        = buffer;
+
+
+      for ( offset = FT_STREAM_POS(); ; offset += 256 )
+      {
+        FT_Long  stream_len; /* same as signed FT_Stream->size */
+
+
+        stream_len = stream->size - FT_STREAM_POS();
+        if ( stream_len == 0 )
+        {
+          FT_TRACE2(( "cid_parser_new: no `StartData' keyword found\n" ));
+          error = FT_THROW( Invalid_File_Format );
+          goto Exit;
+        }
+
+        read_len = FT_MIN( read_len, stream_len );
+        if ( FT_STREAM_READ( p, read_len ) )
+          goto Exit;
+
+        if ( read_len < 256 )
+          p[read_len]  = '\0';
+
+        limit = p + read_len - 10;
+
+        for ( p = buffer; p < limit; p++ )
+        {
+          if ( p[0] == 'S' && ft_strncmp( (char*)p, "StartData", 9 ) == 0 )
+          {
+            /* save offset of binary data after `StartData' */
+            offset += (FT_ULong)( p - buffer + 10 );
+            goto Found;
+          }
+          else if ( p[1] == 's' && ft_strncmp( (char*)p, "/sfnts", 6 ) == 0 )
+          {
+            offset += (FT_ULong)( p - buffer + 7 );
+            goto Found;
+          }
+        }
+
+        FT_MEM_MOVE( buffer, p, 10 );
+        read_len = 256;
+        p = buffer + 10;
+      }
+    }
+
+  Found:
+    /* We have found the start of the binary data or the `/sfnts' token. */
+    /* Now rewind and extract the frame corresponding to this PostScript */
+    /* section.                                                          */
+
+    ps_len = offset - base_offset;
+    if ( FT_STREAM_SEEK( base_offset )                  ||
+         FT_FRAME_EXTRACT( ps_len, parser->postscript ) )
+      goto Exit;
+
+    parser->data_offset    = offset;
+    parser->postscript_len = ps_len;
+    parser->root.base      = parser->postscript;
+    parser->root.cursor    = parser->postscript;
+    parser->root.limit     = parser->root.cursor + ps_len;
+    parser->num_dict       = -1;
+
+    /* Finally, we check whether `StartData' or `/sfnts' was real --  */
+    /* it could be in a comment or string.  We also get the arguments */
+    /* of `StartData' to find out whether the data is represented in  */
+    /* binary or hex format.                                          */
+
+    arg1 = parser->root.cursor;
+    cid_parser_skip_PS_token( parser );
+    cid_parser_skip_spaces  ( parser );
+    arg2 = parser->root.cursor;
+    cid_parser_skip_PS_token( parser );
+    cid_parser_skip_spaces  ( parser );
+
+    limit = parser->root.limit;
+    cur   = parser->root.cursor;
+
+    while ( cur < limit )
+    {
+      if ( parser->root.error )
+      {
+        error = parser->root.error;
+        goto Exit;
+      }
+
+      if ( cur[0] == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 )
+      {
+        if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 )
+          parser->binary_length = ft_atol( (const char *)arg2 );
+
+        limit = parser->root.limit;
+        cur   = parser->root.cursor;
+        goto Exit;
+      }
+      else if ( cur[1] == 's' && ft_strncmp( (char*)cur, "/sfnts", 6 ) == 0 )
+      {
+        FT_TRACE2(( "cid_parser_new: cannot handle Type 11 fonts\n" ));
+        error = FT_THROW( Unknown_File_Format );
+        goto Exit;
+      }
+
+      cid_parser_skip_PS_token( parser );
+      cid_parser_skip_spaces  ( parser );
+      arg1 = arg2;
+      arg2 = cur;
+      cur  = parser->root.cursor;
+    }
+
+    /* we haven't found the correct `StartData'; go back and continue */
+    /* searching                                                      */
+    FT_FRAME_RELEASE( parser->postscript );
+    if ( !FT_STREAM_SEEK( offset ) )
+      goto Again;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cid_parser_done( CID_Parser*  parser )
+  {
+    /* always free the private dictionary */
+    if ( parser->postscript )
+    {
+      FT_Stream  stream = parser->stream;
+
+
+      FT_FRAME_RELEASE( parser->postscript );
+    }
+    parser->root.funcs.done( &parser->root );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.h
new file mode 100644
index 0000000..46284d2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.h
@@ -0,0 +1,123 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidparse.h                                                             */
+/*                                                                         */
+/*    CID-keyed Type1 parser (specification).                              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CIDPARSE_H__
+#define __CIDPARSE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/t1types.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/psaux.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_Parser                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A CID_Parser is an object used to parse a Type 1 fonts very        */
+  /*    quickly.                                                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root           :: The root PS_ParserRec fields.                    */
+  /*                                                                       */
+  /*    stream         :: The current input stream.                        */
+  /*                                                                       */
+  /*    postscript     :: A pointer to the data to be parsed.              */
+  /*                                                                       */
+  /*    postscript_len :: The length of the data to be parsed.             */
+  /*                                                                       */
+  /*    data_offset    :: The start position of the binary data (i.e., the */
+  /*                      end of the data to be parsed.                    */
+  /*                                                                       */
+  /*    binary_length  :: The length of the data after the `StartData'     */
+  /*                      command if the data format is hexadecimal.       */
+  /*                                                                       */
+  /*    cid            :: A structure which holds the information about    */
+  /*                      the current font.                                */
+  /*                                                                       */
+  /*    num_dict       :: The number of font dictionaries.                 */
+  /*                                                                       */
+  typedef struct  CID_Parser_
+  {
+    PS_ParserRec  root;
+    FT_Stream     stream;
+
+    FT_Byte*      postscript;
+    FT_Long       postscript_len;
+
+    FT_ULong      data_offset;
+
+    FT_Long       binary_length;
+
+    CID_FaceInfo  cid;
+    FT_Int        num_dict;
+
+  } CID_Parser;
+
+
+  FT_LOCAL( FT_Error )
+  cid_parser_new( CID_Parser*    parser,
+                  FT_Stream      stream,
+                  FT_Memory      memory,
+                  PSAux_Service  psaux );
+
+  FT_LOCAL( void )
+  cid_parser_done( CID_Parser*  parser );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            PARSING ROUTINES                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define cid_parser_skip_spaces( p ) \
+          (p)->root.funcs.skip_spaces( &(p)->root )
+#define cid_parser_skip_PS_token( p ) \
+          (p)->root.funcs.skip_PS_token( &(p)->root )
+
+#define cid_parser_to_int( p )        (p)->root.funcs.to_int( &(p)->root )
+#define cid_parser_to_fixed( p, t )   (p)->root.funcs.to_fixed( &(p)->root, t )
+
+#define cid_parser_to_coord_array( p, m, c )                          \
+          (p)->root.funcs.to_coord_array( &(p)->root, m, c )
+#define cid_parser_to_fixed_array( p, m, f, t )                          \
+          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )
+#define cid_parser_to_token( p, t )                         \
+          (p)->root.funcs.to_token( &(p)->root, t )
+#define cid_parser_to_token_array( p, t, m, c )                          \
+          (p)->root.funcs.to_token_array( &(p)->root, t, m, c )
+
+#define cid_parser_load_field( p, f, o )                              \
+          (p)->root.funcs.load_field( &(p)->root, f, o, 0, 0 )
+#define cid_parser_load_field_table( p, f, o )                              \
+          (p)->root.funcs.load_field_table( &(p)->root, f, o, 0, 0 )
+
+
+FT_END_HEADER
+
+#endif /* __CIDPARSE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.c
new file mode 100644
index 0000000..37d251f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.c
@@ -0,0 +1,236 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidriver.c                                                             */
+/*                                                                         */
+/*    CID driver interface (body).                                         */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by                   */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "cidriver.h"
+#include "cidgload.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "ciderrs.h"
+
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svxf86nm.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+#include "../../include/freetype/internal/services/svcid.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ciddriver
+
+
+  /*
+   *  POSTSCRIPT NAME SERVICE
+   *
+   */
+
+  static const char*
+  cid_get_postscript_name( CID_Face  face )
+  {
+    const char*  result = face->cid.cid_font_name;
+
+
+    if ( result && result[0] == '/' )
+      result++;
+
+    return result;
+  }
+
+
+  static const FT_Service_PsFontNameRec  cid_service_ps_name =
+  {
+    (FT_PsName_GetFunc) cid_get_postscript_name
+  };
+
+
+  /*
+   *  POSTSCRIPT INFO SERVICE
+   *
+   */
+
+  static FT_Error
+  cid_ps_get_font_info( FT_Face          face,
+                        PS_FontInfoRec*  afont_info )
+  {
+    *afont_info = ((CID_Face)face)->cid.font_info;
+
+    return FT_Err_Ok;
+  }
+
+  static FT_Error
+  cid_ps_get_font_extra( FT_Face          face,
+                        PS_FontExtraRec*  afont_extra )
+  {
+    *afont_extra = ((CID_Face)face)->font_extra;
+
+    return FT_Err_Ok;
+  }
+
+  static const FT_Service_PsInfoRec  cid_service_ps_info =
+  {
+    (PS_GetFontInfoFunc)   cid_ps_get_font_info,
+    (PS_GetFontExtraFunc)  cid_ps_get_font_extra,
+    (PS_HasGlyphNamesFunc) NULL,        /* unsupported with CID fonts */
+    (PS_GetFontPrivateFunc)NULL,        /* unsupported                */
+    (PS_GetFontValueFunc)  NULL         /* not implemented            */
+  };
+
+
+  /*
+   *  CID INFO SERVICE
+   *
+   */
+  static FT_Error
+  cid_get_ros( CID_Face      face,
+               const char*  *registry,
+               const char*  *ordering,
+               FT_Int       *supplement )
+  {
+    CID_FaceInfo  cid = &face->cid;
+
+
+    if ( registry )
+      *registry = cid->registry;
+
+    if ( ordering )
+      *ordering = cid->ordering;
+
+    if ( supplement )
+      *supplement = cid->supplement;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Error
+  cid_get_is_cid( CID_Face  face,
+                  FT_Bool  *is_cid )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_UNUSED( face );
+
+
+    if ( is_cid )
+      *is_cid = 1; /* cid driver is only used for CID keyed fonts */
+
+    return error;
+  }
+
+
+  static FT_Error
+  cid_get_cid_from_glyph_index( CID_Face  face,
+                                FT_UInt   glyph_index,
+                                FT_UInt  *cid )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_UNUSED( face );
+
+
+    if ( cid )
+      *cid = glyph_index; /* identity mapping */
+
+    return error;
+  }
+
+
+  static const FT_Service_CIDRec  cid_service_cid_info =
+  {
+     (FT_CID_GetRegistryOrderingSupplementFunc)cid_get_ros,
+     (FT_CID_GetIsInternallyCIDKeyedFunc)      cid_get_is_cid,
+     (FT_CID_GetCIDFromGlyphIndexFunc)         cid_get_cid_from_glyph_index
+  };
+
+
+  /*
+   *  SERVICE LIST
+   *
+   */
+
+  static const FT_ServiceDescRec  cid_services[] =
+  {
+    { FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_CID },
+    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name },
+    { FT_SERVICE_ID_POSTSCRIPT_INFO,      &cid_service_ps_info },
+    { FT_SERVICE_ID_CID,                  &cid_service_cid_info },
+    { NULL, NULL }
+  };
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  cid_get_interface( FT_Module    module,
+                     const char*  cid_interface )
+  {
+    FT_UNUSED( module );
+
+    return ft_service_list_lookup( cid_services, cid_interface );
+  }
+
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Driver_ClassRec  t1cid_driver_class =
+  {
+    /* first of all, the FT_Module_Class fields */
+    {
+      FT_MODULE_FONT_DRIVER       |
+      FT_MODULE_DRIVER_SCALABLE   |
+      FT_MODULE_DRIVER_HAS_HINTER,
+
+      sizeof ( FT_DriverRec ),
+      "t1cid",   /* module name           */
+      0x10000L,  /* version 1.0 of driver */
+      0x20000L,  /* requires FreeType 2.0 */
+
+      0,
+
+      cid_driver_init,
+      cid_driver_done,
+      cid_get_interface
+    },
+
+    /* then the other font drivers fields */
+    sizeof ( CID_FaceRec ),
+    sizeof ( CID_SizeRec ),
+    sizeof ( CID_GlyphSlotRec ),
+
+    cid_face_init,
+    cid_face_done,
+
+    cid_size_init,
+    cid_size_done,
+    cid_slot_init,
+    cid_slot_done,
+
+    cid_slot_load_glyph,
+
+    0,                      /* FT_Face_GetKerningFunc  */
+    0,                      /* FT_Face_AttachFunc      */
+
+    0,                      /* FT_Face_GetAdvancesFunc */
+
+    cid_size_request,
+    0                       /* FT_Size_SelectFunc      */
+  };
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.h
new file mode 100644
index 0000000..fe98bf3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.h
@@ -0,0 +1,43 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidriver.h                                                             */
+/*                                                                         */
+/*    High-level CID driver interface (specification).                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CIDRIVER_H__
+#define __CIDRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdriver.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+  FT_CALLBACK_TABLE
+  const FT_Driver_ClassRec  t1cid_driver_class;
+
+
+FT_END_HEADER
+
+#endif /* __CIDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidtoken.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidtoken.h
new file mode 100644
index 0000000..904cb09
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidtoken.h
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidtoken.h                                                             */
+/*                                                                         */
+/*    CID token definitions (specification only).                          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by                   */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CID_FaceInfoRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_CID_INFO
+
+  T1_FIELD_KEY   ( "CIDFontName",    cid_font_name, 0 )
+  T1_FIELD_FIXED ( "CIDFontVersion", cid_version,   0 )
+  T1_FIELD_NUM   ( "CIDFontType",    cid_font_type, 0 )
+  T1_FIELD_STRING( "Registry",       registry,      0 )
+  T1_FIELD_STRING( "Ordering",       ordering,      0 )
+  T1_FIELD_NUM   ( "Supplement",     supplement,    0 )
+  T1_FIELD_NUM   ( "UIDBase",        uid_base,      0 )
+  T1_FIELD_NUM   ( "CIDMapOffset",   cidmap_offset, 0 )
+  T1_FIELD_NUM   ( "FDBytes",        fd_bytes,      0 )
+  T1_FIELD_NUM   ( "GDBytes",        gd_bytes,      0 )
+  T1_FIELD_NUM   ( "CIDCount",       cid_count,     0 )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_FontInfoRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_INFO
+
+  T1_FIELD_STRING( "version",            version,             0 )
+  T1_FIELD_STRING( "Notice",             notice,              0 )
+  T1_FIELD_STRING( "FullName",           full_name,           0 )
+  T1_FIELD_STRING( "FamilyName",         family_name,         0 )
+  T1_FIELD_STRING( "Weight",             weight,              0 )
+  T1_FIELD_NUM   ( "ItalicAngle",        italic_angle,        0 )
+  T1_FIELD_BOOL  ( "isFixedPitch",       is_fixed_pitch,      0 )
+  T1_FIELD_NUM   ( "UnderlinePosition",  underline_position,  0 )
+  T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness, 0 )
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_FontExtraRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA
+
+  T1_FIELD_NUM   ( "FSType",             fs_type,             0 )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CID_FaceDictRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_DICT
+
+  T1_FIELD_NUM  ( "PaintType",          paint_type,          0 )
+  T1_FIELD_NUM  ( "FontType",           font_type,           0 )
+  T1_FIELD_NUM  ( "SubrMapOffset",      subrmap_offset,      0 )
+  T1_FIELD_NUM  ( "SDBytes",            sd_bytes,            0 )
+  T1_FIELD_NUM  ( "SubrCount",          num_subrs,           0 )
+  T1_FIELD_NUM  ( "lenBuildCharArray",  len_buildchar,       0 )
+  T1_FIELD_FIXED( "ForceBoldThreshold", forcebold_threshold, 0 )
+  T1_FIELD_FIXED( "StrokeWidth",        stroke_width,        0 )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_PrivateRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_PRIVATE
+
+  T1_FIELD_NUM       ( "UniqueID",         unique_id,      0 )
+  T1_FIELD_NUM       ( "lenIV",            lenIV,          0 )
+  T1_FIELD_NUM       ( "LanguageGroup",    language_group, 0 )
+  T1_FIELD_NUM       ( "password",         password,       0 )
+
+  T1_FIELD_FIXED_1000( "BlueScale",        blue_scale,     0 )
+  T1_FIELD_NUM       ( "BlueShift",        blue_shift,     0 )
+  T1_FIELD_NUM       ( "BlueFuzz",         blue_fuzz,      0 )
+
+  T1_FIELD_NUM_TABLE ( "BlueValues",       blue_values,        14, 0 )
+  T1_FIELD_NUM_TABLE ( "OtherBlues",       other_blues,        10, 0 )
+  T1_FIELD_NUM_TABLE ( "FamilyBlues",      family_blues,       14, 0 )
+  T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, 0 )
+
+  T1_FIELD_NUM_TABLE2( "StdHW",            standard_width,      1, 0 )
+  T1_FIELD_NUM_TABLE2( "StdVW",            standard_height,     1, 0 )
+  T1_FIELD_NUM_TABLE2( "MinFeature",       min_feature,         2, 0 )
+
+  T1_FIELD_NUM_TABLE ( "StemSnapH",        snap_widths,        12, 0 )
+  T1_FIELD_NUM_TABLE ( "StemSnapV",        snap_heights,       12, 0 )
+
+  T1_FIELD_BOOL      ( "ForceBold",        force_bold,          0 )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  FT_BBox
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_BBOX
+
+  T1_FIELD_BBOX( "FontBBox", xMin, 0 )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/fxft_type1cid.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/fxft_type1cid.c
new file mode 100644
index 0000000..fe75571
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/fxft_type1cid.c
@@ -0,0 +1,33 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  type1cid.c                                                             */
+/*                                                                         */
+/*    FreeType OpenType driver component (body only).                      */
+/*                                                                         */
+/*  Copyright 1996-2001 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "cidparse.c"
+#include "cidload.c"
+#include "cidobjs.c"
+#include "cidriver.c"
+#include "cidgload.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/module.mk
new file mode 100644
index 0000000..ce30bfd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 CID module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += TYPE1CID_DRIVER
+
+define TYPE1CID_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, t1cid_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)cid       $(ECHO_DRIVER_DESC)Postscript CID-keyed fonts, no known extension$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/rules.mk
new file mode 100644
index 0000000..f362744
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/rules.mk
@@ -0,0 +1,70 @@
+#
+# FreeType 2 CID driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# CID driver directory
+#
+CID_DIR := $(SRC_DIR)/cid
+
+
+CID_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CID_DIR))
+
+
+# CID driver sources (i.e., C files)
+#
+CID_DRV_SRC := $(CID_DIR)/cidparse.c \
+               $(CID_DIR)/cidload.c  \
+               $(CID_DIR)/cidriver.c \
+               $(CID_DIR)/cidgload.c \
+               $(CID_DIR)/cidobjs.c
+
+# CID driver headers
+#
+CID_DRV_H := $(CID_DRV_SRC:%.c=%.h) \
+             $(CID_DIR)/cidtoken.h  \
+             $(CID_DIR)/ciderrs.h
+
+
+# CID driver object(s)
+#
+#   CID_DRV_OBJ_M is used during `multi' builds
+#   CID_DRV_OBJ_S is used during `single' builds
+#
+CID_DRV_OBJ_M := $(CID_DRV_SRC:$(CID_DIR)/%.c=$(OBJ_DIR)/%.$O)
+CID_DRV_OBJ_S := $(OBJ_DIR)/type1cid.$O
+
+# CID driver source file for single build
+#
+CID_DRV_SRC_S := $(CID_DIR)/type1cid.c
+
+
+# CID driver - single object
+#
+$(CID_DRV_OBJ_S): $(CID_DRV_SRC_S) $(CID_DRV_SRC) $(FREETYPE_H) $(CID_DRV_H)
+	$(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CID_DRV_SRC_S))
+
+
+# CID driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(CID_DIR)/%.c $(FREETYPE_H) $(CID_DRV_H)
+	$(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(CID_DRV_OBJ_S)
+DRV_OBJS_M += $(CID_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/Jamfile
new file mode 100644
index 0000000..faeded9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/Jamfile
@@ -0,0 +1,31 @@
+# FreeType 2 src/psaux Jamfile
+#
+# Copyright 2001, 2002 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) psaux ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = psauxmod psobjs   t1decode t1cmap
+               psconv   afmparse
+               ;
+  }
+  else
+  {
+    _sources = psaux ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/psaux Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.c
new file mode 100644
index 0000000..9a1cd3d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.c
@@ -0,0 +1,964 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afmparse.c                                                             */
+/*                                                                         */
+/*    AFM parser (body).                                                   */
+/*                                                                         */
+/*  Copyright 2006-2010, 2012, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/psaux.h"
+
+#include "afmparse.h"
+#include "psconv.h"
+
+#include "psauxerr.h"
+
+
+/***************************************************************************/
+/*                                                                         */
+/*    AFM_Stream                                                           */
+/*                                                                         */
+/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib.  */
+/*                                                                         */
+/*                                                                         */
+
+  enum
+  {
+    AFM_STREAM_STATUS_NORMAL,
+    AFM_STREAM_STATUS_EOC,
+    AFM_STREAM_STATUS_EOL,
+    AFM_STREAM_STATUS_EOF
+  };
+
+
+  typedef struct  AFM_StreamRec_
+  {
+    FT_Byte*  cursor;
+    FT_Byte*  base;
+    FT_Byte*  limit;
+
+    FT_Int    status;
+
+  } AFM_StreamRec;
+
+
+#ifndef EOF
+#define EOF -1
+#endif
+
+
+  /* this works because empty lines are ignored */
+#define AFM_IS_NEWLINE( ch )  ( (ch) == '\r' || (ch) == '\n' )
+
+#define AFM_IS_EOF( ch )      ( (ch) == EOF  || (ch) == '\x1a' )
+#define AFM_IS_SPACE( ch )    ( (ch) == ' '  || (ch) == '\t' )
+
+  /* column separator; there is no `column' in the spec actually */
+#define AFM_IS_SEP( ch )      ( (ch) == ';' )
+
+#define AFM_GETC()                                                       \
+          ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \
+                                                   : EOF )
+
+#define AFM_STREAM_KEY_BEGIN( stream )    \
+          (char*)( (stream)->cursor - 1 )
+
+#define AFM_STREAM_KEY_LEN( stream, key )       \
+          ( (char*)(stream)->cursor - key - 1 )
+
+#define AFM_STATUS_EOC( stream ) \
+          ( (stream)->status >= AFM_STREAM_STATUS_EOC )
+
+#define AFM_STATUS_EOL( stream ) \
+          ( (stream)->status >= AFM_STREAM_STATUS_EOL )
+
+#define AFM_STATUS_EOF( stream ) \
+          ( (stream)->status >= AFM_STREAM_STATUS_EOF )
+
+
+  static int
+  afm_stream_skip_spaces( AFM_Stream  stream )
+  {
+    int  ch = 0;  /* make stupid compiler happy */
+
+
+    if ( AFM_STATUS_EOC( stream ) )
+      return ';';
+
+    while ( 1 )
+    {
+      ch = AFM_GETC();
+      if ( !AFM_IS_SPACE( ch ) )
+        break;
+    }
+
+    if ( AFM_IS_NEWLINE( ch ) )
+      stream->status = AFM_STREAM_STATUS_EOL;
+    else if ( AFM_IS_SEP( ch ) )
+      stream->status = AFM_STREAM_STATUS_EOC;
+    else if ( AFM_IS_EOF( ch ) )
+      stream->status = AFM_STREAM_STATUS_EOF;
+
+    return ch;
+  }
+
+
+  /* read a key or value in current column */
+  static char*
+  afm_stream_read_one( AFM_Stream  stream )
+  {
+    char*  str;
+
+
+    afm_stream_skip_spaces( stream );
+    if ( AFM_STATUS_EOC( stream ) )
+      return NULL;
+
+    str = AFM_STREAM_KEY_BEGIN( stream );
+
+    while ( 1 )
+    {
+      int  ch = AFM_GETC();
+
+
+      if ( AFM_IS_SPACE( ch ) )
+        break;
+      else if ( AFM_IS_NEWLINE( ch ) )
+      {
+        stream->status = AFM_STREAM_STATUS_EOL;
+        break;
+      }
+      else if ( AFM_IS_SEP( ch ) )
+      {
+        stream->status = AFM_STREAM_STATUS_EOC;
+        break;
+      }
+      else if ( AFM_IS_EOF( ch ) )
+      {
+        stream->status = AFM_STREAM_STATUS_EOF;
+        break;
+      }
+    }
+
+    return str;
+  }
+
+
+  /* read a string (i.e., read to EOL) */
+  static char*
+  afm_stream_read_string( AFM_Stream  stream )
+  {
+    char*  str;
+
+
+    afm_stream_skip_spaces( stream );
+    if ( AFM_STATUS_EOL( stream ) )
+      return NULL;
+
+    str = AFM_STREAM_KEY_BEGIN( stream );
+
+    /* scan to eol */
+    while ( 1 )
+    {
+      int  ch = AFM_GETC();
+
+
+      if ( AFM_IS_NEWLINE( ch ) )
+      {
+        stream->status = AFM_STREAM_STATUS_EOL;
+        break;
+      }
+      else if ( AFM_IS_EOF( ch ) )
+      {
+        stream->status = AFM_STREAM_STATUS_EOF;
+        break;
+      }
+    }
+
+    return str;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*    AFM_Parser                                                         */
+  /*                                                                       */
+  /*                                                                       */
+
+  /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */
+  typedef enum  AFM_Token_
+  {
+    AFM_TOKEN_ASCENDER,
+    AFM_TOKEN_AXISLABEL,
+    AFM_TOKEN_AXISTYPE,
+    AFM_TOKEN_B,
+    AFM_TOKEN_BLENDAXISTYPES,
+    AFM_TOKEN_BLENDDESIGNMAP,
+    AFM_TOKEN_BLENDDESIGNPOSITIONS,
+    AFM_TOKEN_C,
+    AFM_TOKEN_CC,
+    AFM_TOKEN_CH,
+    AFM_TOKEN_CAPHEIGHT,
+    AFM_TOKEN_CHARWIDTH,
+    AFM_TOKEN_CHARACTERSET,
+    AFM_TOKEN_CHARACTERS,
+    AFM_TOKEN_DESCENDER,
+    AFM_TOKEN_ENCODINGSCHEME,
+    AFM_TOKEN_ENDAXIS,
+    AFM_TOKEN_ENDCHARMETRICS,
+    AFM_TOKEN_ENDCOMPOSITES,
+    AFM_TOKEN_ENDDIRECTION,
+    AFM_TOKEN_ENDFONTMETRICS,
+    AFM_TOKEN_ENDKERNDATA,
+    AFM_TOKEN_ENDKERNPAIRS,
+    AFM_TOKEN_ENDTRACKKERN,
+    AFM_TOKEN_ESCCHAR,
+    AFM_TOKEN_FAMILYNAME,
+    AFM_TOKEN_FONTBBOX,
+    AFM_TOKEN_FONTNAME,
+    AFM_TOKEN_FULLNAME,
+    AFM_TOKEN_ISBASEFONT,
+    AFM_TOKEN_ISCIDFONT,
+    AFM_TOKEN_ISFIXEDPITCH,
+    AFM_TOKEN_ISFIXEDV,
+    AFM_TOKEN_ITALICANGLE,
+    AFM_TOKEN_KP,
+    AFM_TOKEN_KPH,
+    AFM_TOKEN_KPX,
+    AFM_TOKEN_KPY,
+    AFM_TOKEN_L,
+    AFM_TOKEN_MAPPINGSCHEME,
+    AFM_TOKEN_METRICSSETS,
+    AFM_TOKEN_N,
+    AFM_TOKEN_NOTICE,
+    AFM_TOKEN_PCC,
+    AFM_TOKEN_STARTAXIS,
+    AFM_TOKEN_STARTCHARMETRICS,
+    AFM_TOKEN_STARTCOMPOSITES,
+    AFM_TOKEN_STARTDIRECTION,
+    AFM_TOKEN_STARTFONTMETRICS,
+    AFM_TOKEN_STARTKERNDATA,
+    AFM_TOKEN_STARTKERNPAIRS,
+    AFM_TOKEN_STARTKERNPAIRS0,
+    AFM_TOKEN_STARTKERNPAIRS1,
+    AFM_TOKEN_STARTTRACKKERN,
+    AFM_TOKEN_STDHW,
+    AFM_TOKEN_STDVW,
+    AFM_TOKEN_TRACKKERN,
+    AFM_TOKEN_UNDERLINEPOSITION,
+    AFM_TOKEN_UNDERLINETHICKNESS,
+    AFM_TOKEN_VV,
+    AFM_TOKEN_VVECTOR,
+    AFM_TOKEN_VERSION,
+    AFM_TOKEN_W,
+    AFM_TOKEN_W0,
+    AFM_TOKEN_W0X,
+    AFM_TOKEN_W0Y,
+    AFM_TOKEN_W1,
+    AFM_TOKEN_W1X,
+    AFM_TOKEN_W1Y,
+    AFM_TOKEN_WX,
+    AFM_TOKEN_WY,
+    AFM_TOKEN_WEIGHT,
+    AFM_TOKEN_WEIGHTVECTOR,
+    AFM_TOKEN_XHEIGHT,
+    N_AFM_TOKENS,
+    AFM_TOKEN_UNKNOWN
+
+  } AFM_Token;
+
+
+  static const char*  const afm_key_table[N_AFM_TOKENS] =
+  {
+    "Ascender",
+    "AxisLabel",
+    "AxisType",
+    "B",
+    "BlendAxisTypes",
+    "BlendDesignMap",
+    "BlendDesignPositions",
+    "C",
+    "CC",
+    "CH",
+    "CapHeight",
+    "CharWidth",
+    "CharacterSet",
+    "Characters",
+    "Descender",
+    "EncodingScheme",
+    "EndAxis",
+    "EndCharMetrics",
+    "EndComposites",
+    "EndDirection",
+    "EndFontMetrics",
+    "EndKernData",
+    "EndKernPairs",
+    "EndTrackKern",
+    "EscChar",
+    "FamilyName",
+    "FontBBox",
+    "FontName",
+    "FullName",
+    "IsBaseFont",
+    "IsCIDFont",
+    "IsFixedPitch",
+    "IsFixedV",
+    "ItalicAngle",
+    "KP",
+    "KPH",
+    "KPX",
+    "KPY",
+    "L",
+    "MappingScheme",
+    "MetricsSets",
+    "N",
+    "Notice",
+    "PCC",
+    "StartAxis",
+    "StartCharMetrics",
+    "StartComposites",
+    "StartDirection",
+    "StartFontMetrics",
+    "StartKernData",
+    "StartKernPairs",
+    "StartKernPairs0",
+    "StartKernPairs1",
+    "StartTrackKern",
+    "StdHW",
+    "StdVW",
+    "TrackKern",
+    "UnderlinePosition",
+    "UnderlineThickness",
+    "VV",
+    "VVector",
+    "Version",
+    "W",
+    "W0",
+    "W0X",
+    "W0Y",
+    "W1",
+    "W1X",
+    "W1Y",
+    "WX",
+    "WY",
+    "Weight",
+    "WeightVector",
+    "XHeight"
+  };
+
+
+  /*
+   * `afm_parser_read_vals' and `afm_parser_next_key' provide
+   * high-level operations to an AFM_Stream.  The rest of the
+   * parser functions should use them without accessing the
+   * AFM_Stream directly.
+   */
+
+  FT_LOCAL_DEF( FT_Int )
+  afm_parser_read_vals( AFM_Parser  parser,
+                        AFM_Value   vals,
+                        FT_UInt     n )
+  {
+    AFM_Stream  stream = parser->stream;
+    char*       str;
+    FT_UInt     i;
+
+
+    if ( n > AFM_MAX_ARGUMENTS )
+      return 0;
+
+    for ( i = 0; i < n; i++ )
+    {
+      FT_Offset  len;
+      AFM_Value  val = vals + i;
+
+
+      if ( val->type == AFM_VALUE_TYPE_STRING )
+        str = afm_stream_read_string( stream );
+      else
+        str = afm_stream_read_one( stream );
+
+      if ( !str )
+        break;
+
+      len = AFM_STREAM_KEY_LEN( stream, str );
+
+      switch ( val->type )
+      {
+      case AFM_VALUE_TYPE_STRING:
+      case AFM_VALUE_TYPE_NAME:
+        {
+          FT_Memory  memory = parser->memory;
+          FT_Error   error;
+
+
+          if ( !FT_QALLOC( val->u.s, len + 1 ) )
+          {
+            ft_memcpy( val->u.s, str, len );
+            val->u.s[len] = '\0';
+          }
+        }
+        break;
+
+      case AFM_VALUE_TYPE_FIXED:
+        val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str,
+                                    (FT_Byte*)str + len, 0 );
+        break;
+
+      case AFM_VALUE_TYPE_INTEGER:
+        val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str,
+                                  (FT_Byte*)str + len );
+        break;
+
+      case AFM_VALUE_TYPE_BOOL:
+        val->u.b = FT_BOOL( len == 4                      &&
+                            !ft_strncmp( str, "true", 4 ) );
+        break;
+
+      case AFM_VALUE_TYPE_INDEX:
+        if ( parser->get_index )
+          val->u.i = parser->get_index( str, len, parser->user_data );
+        else
+          val->u.i = 0;
+        break;
+      }
+    }
+
+    return i;
+  }
+
+
+  FT_LOCAL_DEF( char* )
+  afm_parser_next_key( AFM_Parser  parser,
+                       FT_Bool     line,
+                       FT_Offset*  len )
+  {
+    AFM_Stream  stream = parser->stream;
+    char*       key    = 0;  /* make stupid compiler happy */
+
+
+    if ( line )
+    {
+      while ( 1 )
+      {
+        /* skip current line */
+        if ( !AFM_STATUS_EOL( stream ) )
+          afm_stream_read_string( stream );
+
+        stream->status = AFM_STREAM_STATUS_NORMAL;
+        key = afm_stream_read_one( stream );
+
+        /* skip empty line */
+        if ( !key                      &&
+             !AFM_STATUS_EOF( stream ) &&
+             AFM_STATUS_EOL( stream )  )
+          continue;
+
+        break;
+      }
+    }
+    else
+    {
+      while ( 1 )
+      {
+        /* skip current column */
+        while ( !AFM_STATUS_EOC( stream ) )
+          afm_stream_read_one( stream );
+
+        stream->status = AFM_STREAM_STATUS_NORMAL;
+        key = afm_stream_read_one( stream );
+
+        /* skip empty column */
+        if ( !key                      &&
+             !AFM_STATUS_EOF( stream ) &&
+             AFM_STATUS_EOC( stream )  )
+          continue;
+
+        break;
+      }
+    }
+
+    if ( len )
+      *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key )
+                     : 0;
+
+    return key;
+  }
+
+
+  static AFM_Token
+  afm_tokenize( const char*  key,
+                FT_Offset    len )
+  {
+    int  n;
+
+
+    for ( n = 0; n < N_AFM_TOKENS; n++ )
+    {
+      if ( *( afm_key_table[n] ) == *key )
+      {
+        for ( ; n < N_AFM_TOKENS; n++ )
+        {
+          if ( *( afm_key_table[n] ) != *key )
+            return AFM_TOKEN_UNKNOWN;
+
+          if ( ft_strncmp( afm_key_table[n], key, len ) == 0 )
+            return (AFM_Token) n;
+        }
+      }
+    }
+
+    return AFM_TOKEN_UNKNOWN;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  afm_parser_init( AFM_Parser  parser,
+                   FT_Memory   memory,
+                   FT_Byte*    base,
+                   FT_Byte*    limit )
+  {
+    AFM_Stream  stream = NULL;
+    FT_Error    error;
+
+
+    if ( FT_NEW( stream ) )
+      return error;
+
+    stream->cursor = stream->base = base;
+    stream->limit  = limit;
+
+    /* don't skip the first line during the first call */
+    stream->status = AFM_STREAM_STATUS_EOL;
+
+    parser->memory    = memory;
+    parser->stream    = stream;
+    parser->FontInfo  = NULL;
+    parser->get_index = NULL;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_LOCAL( void )
+  afm_parser_done( AFM_Parser  parser )
+  {
+    FT_Memory  memory = parser->memory;
+
+
+    FT_FREE( parser->stream );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  afm_parser_read_int( AFM_Parser  parser,
+                       FT_Int*     aint )
+  {
+    AFM_ValueRec  val;
+
+
+    val.type = AFM_VALUE_TYPE_INTEGER;
+
+    if ( afm_parser_read_vals( parser, &val, 1 ) == 1 )
+    {
+      *aint = val.u.i;
+
+      return FT_Err_Ok;
+    }
+    else
+      return FT_THROW( Syntax_Error );
+  }
+
+
+  static FT_Error
+  afm_parse_track_kern( AFM_Parser  parser )
+  {
+    AFM_FontInfo   fi = parser->FontInfo;
+    AFM_TrackKern  tk;
+    char*          key;
+    FT_Offset      len;
+    int            n = -1;
+
+
+    if ( afm_parser_read_int( parser, &fi->NumTrackKern ) )
+        goto Fail;
+
+    if ( fi->NumTrackKern )
+    {
+      FT_Memory  memory = parser->memory;
+      FT_Error   error;
+
+
+      if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) )
+        return error;
+    }
+
+    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+    {
+      AFM_ValueRec  shared_vals[5];
+
+
+      switch ( afm_tokenize( key, len ) )
+      {
+      case AFM_TOKEN_TRACKKERN:
+        n++;
+
+        if ( n >= fi->NumTrackKern )
+          goto Fail;
+
+        tk = fi->TrackKerns + n;
+
+        shared_vals[0].type = AFM_VALUE_TYPE_INTEGER;
+        shared_vals[1].type = AFM_VALUE_TYPE_FIXED;
+        shared_vals[2].type = AFM_VALUE_TYPE_FIXED;
+        shared_vals[3].type = AFM_VALUE_TYPE_FIXED;
+        shared_vals[4].type = AFM_VALUE_TYPE_FIXED;
+        if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 )
+          goto Fail;
+
+        tk->degree     = shared_vals[0].u.i;
+        tk->min_ptsize = shared_vals[1].u.f;
+        tk->min_kern   = shared_vals[2].u.f;
+        tk->max_ptsize = shared_vals[3].u.f;
+        tk->max_kern   = shared_vals[4].u.f;
+
+        break;
+
+      case AFM_TOKEN_ENDTRACKKERN:
+      case AFM_TOKEN_ENDKERNDATA:
+      case AFM_TOKEN_ENDFONTMETRICS:
+        fi->NumTrackKern = n + 1;
+        return FT_Err_Ok;
+
+      case AFM_TOKEN_UNKNOWN:
+        break;
+
+      default:
+        goto Fail;
+      }
+    }
+
+  Fail:
+    return FT_THROW( Syntax_Error );
+  }
+
+
+#undef  KERN_INDEX
+#define KERN_INDEX( g1, g2 )  ( ( (FT_ULong)g1 << 16 ) | g2 )
+
+
+  /* compare two kerning pairs */
+  FT_CALLBACK_DEF( int )
+  afm_compare_kern_pairs( const void*  a,
+                          const void*  b )
+  {
+    AFM_KernPair  kp1 = (AFM_KernPair)a;
+    AFM_KernPair  kp2 = (AFM_KernPair)b;
+
+    FT_ULong  index1 = KERN_INDEX( kp1->index1, kp1->index2 );
+    FT_ULong  index2 = KERN_INDEX( kp2->index1, kp2->index2 );
+
+
+    if ( index1 > index2 )
+      return 1;
+    else if ( index1 < index2 )
+      return -1;
+    else
+      return 0;
+  }
+
+
+  static FT_Error
+  afm_parse_kern_pairs( AFM_Parser  parser )
+  {
+    AFM_FontInfo  fi = parser->FontInfo;
+    AFM_KernPair  kp;
+    char*         key;
+    FT_Offset     len;
+    int           n = -1;
+
+
+    if ( afm_parser_read_int( parser, &fi->NumKernPair ) )
+      goto Fail;
+
+    if ( fi->NumKernPair )
+    {
+      FT_Memory  memory = parser->memory;
+      FT_Error   error;
+
+
+      if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )
+        return error;
+    }
+
+    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+    {
+      AFM_Token  token = afm_tokenize( key, len );
+
+
+      switch ( token )
+      {
+      case AFM_TOKEN_KP:
+      case AFM_TOKEN_KPX:
+      case AFM_TOKEN_KPY:
+        {
+          FT_Int        r;
+          AFM_ValueRec  shared_vals[4];
+
+
+          n++;
+
+          if ( n >= fi->NumKernPair )
+            goto Fail;
+
+          kp = fi->KernPairs + n;
+
+          shared_vals[0].type = AFM_VALUE_TYPE_INDEX;
+          shared_vals[1].type = AFM_VALUE_TYPE_INDEX;
+          shared_vals[2].type = AFM_VALUE_TYPE_INTEGER;
+          shared_vals[3].type = AFM_VALUE_TYPE_INTEGER;
+          r = afm_parser_read_vals( parser, shared_vals, 4 );
+          if ( r < 3 )
+            goto Fail;
+
+          kp->index1 = shared_vals[0].u.i;
+          kp->index2 = shared_vals[1].u.i;
+          if ( token == AFM_TOKEN_KPY )
+          {
+            kp->x = 0;
+            kp->y = shared_vals[2].u.i;
+          }
+          else
+          {
+            kp->x = shared_vals[2].u.i;
+            kp->y = ( token == AFM_TOKEN_KP && r == 4 )
+                      ? shared_vals[3].u.i : 0;
+          }
+        }
+        break;
+
+      case AFM_TOKEN_ENDKERNPAIRS:
+      case AFM_TOKEN_ENDKERNDATA:
+      case AFM_TOKEN_ENDFONTMETRICS:
+        fi->NumKernPair = n + 1;
+        ft_qsort( fi->KernPairs, fi->NumKernPair,
+                  sizeof ( AFM_KernPairRec ),
+                  afm_compare_kern_pairs );
+        return FT_Err_Ok;
+
+      case AFM_TOKEN_UNKNOWN:
+        break;
+
+      default:
+        goto Fail;
+      }
+    }
+
+  Fail:
+    return FT_THROW( Syntax_Error );
+  }
+
+
+  static FT_Error
+  afm_parse_kern_data( AFM_Parser  parser )
+  {
+    FT_Error   error;
+    char*      key;
+    FT_Offset  len;
+
+
+    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+    {
+      switch ( afm_tokenize( key, len ) )
+      {
+      case AFM_TOKEN_STARTTRACKKERN:
+        error = afm_parse_track_kern( parser );
+        if ( error )
+          return error;
+        break;
+
+      case AFM_TOKEN_STARTKERNPAIRS:
+      case AFM_TOKEN_STARTKERNPAIRS0:
+        error = afm_parse_kern_pairs( parser );
+        if ( error )
+          return error;
+        break;
+
+      case AFM_TOKEN_ENDKERNDATA:
+      case AFM_TOKEN_ENDFONTMETRICS:
+        return FT_Err_Ok;
+
+      case AFM_TOKEN_UNKNOWN:
+        break;
+
+      default:
+        goto Fail;
+      }
+    }
+
+  Fail:
+    return FT_THROW( Syntax_Error );
+  }
+
+
+  static FT_Error
+  afm_parser_skip_section( AFM_Parser  parser,
+                           FT_UInt     n,
+                           AFM_Token   end_section )
+  {
+    char*      key;
+    FT_Offset  len;
+
+
+    while ( n-- > 0 )
+    {
+      key = afm_parser_next_key( parser, 1, NULL );
+      if ( !key )
+        goto Fail;
+    }
+
+    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+    {
+      AFM_Token  token = afm_tokenize( key, len );
+
+
+      if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS )
+        return FT_Err_Ok;
+    }
+
+  Fail:
+    return FT_THROW( Syntax_Error );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  afm_parser_parse( AFM_Parser  parser )
+  {
+    FT_Memory     memory = parser->memory;
+    AFM_FontInfo  fi     = parser->FontInfo;
+    FT_Error      error  = FT_ERR( Syntax_Error );
+    char*         key;
+    FT_Offset     len;
+    FT_Int        metrics_sets = 0;
+
+
+    if ( !fi )
+      return FT_THROW( Invalid_Argument );
+
+    key = afm_parser_next_key( parser, 1, &len );
+    if ( !key || len != 16                              ||
+         ft_strncmp( key, "StartFontMetrics", 16 ) != 0 )
+      return FT_THROW( Unknown_File_Format );
+
+    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+    {
+      AFM_ValueRec  shared_vals[4];
+
+
+      switch ( afm_tokenize( key, len ) )
+      {
+      case AFM_TOKEN_METRICSSETS:
+        if ( afm_parser_read_int( parser, &metrics_sets ) )
+          goto Fail;
+
+        if ( metrics_sets != 0 && metrics_sets != 2 )
+        {
+          error = FT_THROW( Unimplemented_Feature );
+
+          goto Fail;
+        }
+        break;
+
+      case AFM_TOKEN_ISCIDFONT:
+        shared_vals[0].type = AFM_VALUE_TYPE_BOOL;
+        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
+          goto Fail;
+
+        fi->IsCIDFont = shared_vals[0].u.b;
+        break;
+
+      case AFM_TOKEN_FONTBBOX:
+        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
+        shared_vals[1].type = AFM_VALUE_TYPE_FIXED;
+        shared_vals[2].type = AFM_VALUE_TYPE_FIXED;
+        shared_vals[3].type = AFM_VALUE_TYPE_FIXED;
+        if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 )
+          goto Fail;
+
+        fi->FontBBox.xMin = shared_vals[0].u.f;
+        fi->FontBBox.yMin = shared_vals[1].u.f;
+        fi->FontBBox.xMax = shared_vals[2].u.f;
+        fi->FontBBox.yMax = shared_vals[3].u.f;
+        break;
+
+      case AFM_TOKEN_ASCENDER:
+        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
+        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
+          goto Fail;
+
+        fi->Ascender = shared_vals[0].u.f;
+        break;
+
+      case AFM_TOKEN_DESCENDER:
+        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
+        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
+          goto Fail;
+
+        fi->Descender = shared_vals[0].u.f;
+        break;
+
+      case AFM_TOKEN_STARTCHARMETRICS:
+        {
+          FT_Int  n = 0;
+
+
+          if ( afm_parser_read_int( parser, &n ) )
+            goto Fail;
+
+          error = afm_parser_skip_section( parser, n,
+                                           AFM_TOKEN_ENDCHARMETRICS );
+          if ( error )
+            return error;
+        }
+        break;
+
+      case AFM_TOKEN_STARTKERNDATA:
+        error = afm_parse_kern_data( parser );
+        if ( error )
+          goto Fail;
+        /* fall through since we only support kern data */
+
+      case AFM_TOKEN_ENDFONTMETRICS:
+        return FT_Err_Ok;
+
+      default:
+        break;
+      }
+    }
+
+  Fail:
+    FT_FREE( fi->TrackKerns );
+    fi->NumTrackKern = 0;
+
+    FT_FREE( fi->KernPairs );
+    fi->NumKernPair = 0;
+
+    fi->IsCIDFont = 0;
+
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.h
new file mode 100644
index 0000000..ffa60d4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.h
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afmparse.h                                                             */
+/*                                                                         */
+/*    AFM parser (specification).                                          */
+/*                                                                         */
+/*  Copyright 2006 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFMPARSE_H__
+#define __AFMPARSE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  afm_parser_init( AFM_Parser  parser,
+                   FT_Memory   memory,
+                   FT_Byte*    base,
+                   FT_Byte*    limit );
+
+
+  FT_LOCAL( void )
+  afm_parser_done( AFM_Parser  parser );
+
+
+  FT_LOCAL( FT_Error )
+  afm_parser_parse( AFM_Parser  parser );
+
+
+  enum  AFM_ValueType_
+  {
+    AFM_VALUE_TYPE_STRING,
+    AFM_VALUE_TYPE_NAME,
+    AFM_VALUE_TYPE_FIXED,   /* real number */
+    AFM_VALUE_TYPE_INTEGER,
+    AFM_VALUE_TYPE_BOOL,
+    AFM_VALUE_TYPE_INDEX    /* glyph index */
+  };
+
+
+  typedef struct  AFM_ValueRec_
+  {
+    enum AFM_ValueType_  type;
+    union
+    {
+      char*     s;
+      FT_Fixed  f;
+      FT_Int    i;
+      FT_Bool   b;
+
+    } u;
+
+  } AFM_ValueRec, *AFM_Value;
+
+#define  AFM_MAX_ARGUMENTS  5
+
+  FT_LOCAL( FT_Int )
+  afm_parser_read_vals( AFM_Parser  parser,
+                        AFM_Value   vals,
+                        FT_UInt     n );
+
+  /* read the next key from the next line or column */
+  FT_LOCAL( char* )
+  afm_parser_next_key( AFM_Parser  parser,
+                       FT_Bool     line,
+                       FT_Offset*  len );
+
+FT_END_HEADER
+
+#endif /* __AFMPARSE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/fxft_psaux.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/fxft_psaux.c
new file mode 100644
index 0000000..59aad04
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/fxft_psaux.c
@@ -0,0 +1,38 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  psaux.c                                                                */
+/*                                                                         */
+/*    FreeType auxiliary PostScript driver component (body only).          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2006 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "psobjs.c"
+#include "psauxmod.c"
+#include "t1decode.c"
+#include "t1cmap.c"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "afmparse.c"
+#endif
+
+#include "psconv.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/module.mk
new file mode 100644
index 0000000..42bf6f5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PSaux module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += PSAUX_MODULE
+
+define PSAUX_MODULE
+$(OPEN_DRIVER) FT_Module_Class, psaux_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)psaux     $(ECHO_DRIVER_DESC)Postscript Type 1 & Type 2 helper module$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxerr.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxerr.h
new file mode 100644
index 0000000..257f17a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxerr.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psauxerr.h                                                             */
+/*                                                                         */
+/*    PS auxiliary module error codes (specification only).                */
+/*                                                                         */
+/*  Copyright 2001, 2012 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the PS auxiliary module error enumeration */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __PSAUXERR_H__
+#define __PSAUXERR_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  PSaux_Err_
+#define FT_ERR_BASE    FT_Mod_Err_PSaux
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __PSAUXERR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.c
new file mode 100644
index 0000000..f8d8866
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.c
@@ -0,0 +1,139 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psauxmod.c                                                             */
+/*                                                                         */
+/*    FreeType auxiliary PostScript module implementation (body).          */
+/*                                                                         */
+/*  Copyright 2000-2001, 2002, 2003, 2006 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "psauxmod.h"
+#include "psobjs.h"
+#include "t1decode.h"
+#include "t1cmap.h"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "afmparse.h"
+#endif
+
+
+  FT_CALLBACK_TABLE_DEF
+  const PS_Table_FuncsRec  ps_table_funcs =
+  {
+    ps_table_new,
+    ps_table_done,
+    ps_table_add,
+    ps_table_release
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const PS_Parser_FuncsRec  ps_parser_funcs =
+  {
+    ps_parser_init,
+    ps_parser_done,
+    ps_parser_skip_spaces,
+    ps_parser_skip_PS_token,
+    ps_parser_to_int,
+    ps_parser_to_fixed,
+    ps_parser_to_bytes,
+    ps_parser_to_coord_array,
+    ps_parser_to_fixed_array,
+    ps_parser_to_token,
+    ps_parser_to_token_array,
+    ps_parser_load_field,
+    ps_parser_load_field_table
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const T1_Builder_FuncsRec  t1_builder_funcs =
+  {
+    t1_builder_init,
+    t1_builder_done,
+    t1_builder_check_points,
+    t1_builder_add_point,
+    t1_builder_add_point1,
+    t1_builder_add_contour,
+    t1_builder_start_point,
+    t1_builder_close_contour
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const T1_Decoder_FuncsRec  t1_decoder_funcs =
+  {
+    t1_decoder_init,
+    t1_decoder_done,
+    t1_decoder_parse_charstrings
+  };
+
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+  FT_CALLBACK_TABLE_DEF
+  const AFM_Parser_FuncsRec  afm_parser_funcs =
+  {
+    afm_parser_init,
+    afm_parser_done,
+    afm_parser_parse
+  };
+#endif
+
+
+  FT_CALLBACK_TABLE_DEF
+  const T1_CMap_ClassesRec  t1_cmap_classes =
+  {
+    &t1_cmap_standard_class_rec,
+    &t1_cmap_expert_class_rec,
+    &t1_cmap_custom_class_rec,
+    &t1_cmap_unicode_class_rec
+  };
+
+
+  static
+  const PSAux_Interface  psaux_interface =
+  {
+    &ps_table_funcs,
+    &ps_parser_funcs,
+    &t1_builder_funcs,
+    &t1_decoder_funcs,
+    t1_decrypt,
+
+    (const T1_CMap_ClassesRec*) &t1_cmap_classes,
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+    &afm_parser_funcs,
+#else
+    0,
+#endif
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Module_Class  psaux_module_class =
+  {
+    0,
+    sizeof ( FT_ModuleRec ),
+    "psaux",
+    0x20000L,
+    0x20000L,
+
+    &psaux_interface,  /* module-specific interface */
+
+    (FT_Module_Constructor)0,
+    (FT_Module_Destructor) 0,
+    (FT_Module_Requester)  0
+  };
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.h
new file mode 100644
index 0000000..cf677ed
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psauxmod.h                                                             */
+/*                                                                         */
+/*    FreeType auxiliary PostScript module implementation (specification). */
+/*                                                                         */
+/*  Copyright 2000-2001 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSAUXMOD_H__
+#define __PSAUXMOD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+  FT_EXPORT_VAR( const FT_Module_Class )  psaux_driver_class;
+
+
+FT_END_HEADER
+
+#endif /* __PSAUXMOD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.c
new file mode 100644
index 0000000..22e2f7d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.c
@@ -0,0 +1,641 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psconv.c                                                               */
+/*                                                                         */
+/*    Some convenience conversions (body).                                 */
+/*                                                                         */
+/*  Copyright 2006, 2008, 2009, 2012-2013 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "psconv.h"
+#include "psauxerr.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_psconv
+
+
+  /* The following array is used by various functions to quickly convert */
+  /* digits (both decimal and non-decimal) into numbers.                 */
+
+#if 'A' == 65
+  /* ASCII */
+
+  static const FT_Char  ft_char_table[128] =
+  {
+    /* 0x00 */
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,
+    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
+    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
+  };
+
+  /* no character >= 0x80 can represent a valid number */
+#define OP  >=
+
+#endif /* 'A' == 65 */
+
+#if 'A' == 193
+  /* EBCDIC */
+
+  static const FT_Char  ft_char_table[128] =
+  {
+    /* 0x80 */
+    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,
+    -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,
+    -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,
+    -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,
+    -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,
+  };
+
+  /* no character < 0x80 can represent a valid number */
+#define OP  <
+
+#endif /* 'A' == 193 */
+
+
+  FT_LOCAL_DEF( FT_Long )
+  PS_Conv_Strtol( FT_Byte**  cursor,
+                  FT_Byte*   limit,
+                  FT_Long    base )
+  {
+    FT_Byte*  p = *cursor;
+
+    FT_Long   num           = 0;
+    FT_Bool   sign          = 0;
+    FT_Bool   have_overflow = 0;
+
+    FT_Long   num_limit;
+    FT_Char   c_limit;
+
+
+    if ( p >= limit )
+      goto Bad;
+
+    if ( base < 2 || base > 36 )
+    {
+      FT_TRACE4(( "!!!INVALID BASE:!!!" ));
+      return 0;
+    }
+
+    if ( *p == '-' || *p == '+' )
+    {
+      sign = FT_BOOL( *p == '-' );
+
+      p++;
+      if ( p == limit )
+        goto Bad;
+    }
+
+    num_limit = 0x7FFFFFFFL / base;
+    c_limit   = (FT_Char)( 0x7FFFFFFFL % base );
+
+    for ( ; p < limit; p++ )
+    {
+      FT_Char  c;
+
+
+      if ( IS_PS_SPACE( *p ) || *p OP 0x80 )
+        break;
+
+      c = ft_char_table[*p & 0x7f];
+
+      if ( c < 0 || c >= base )
+        break;
+
+      if ( num > num_limit || ( num == num_limit && c > c_limit ) )
+        have_overflow = 1;
+      else
+        num = num * base + c;
+    }
+
+    *cursor = p;
+
+    if ( have_overflow )
+    {
+      num = 0x7FFFFFFFL;
+      FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+    }
+
+    if ( sign )
+      num = -num;
+
+    return num;
+
+  Bad:
+    FT_TRACE4(( "!!!END OF DATA:!!!" ));
+    return 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Long )
+  PS_Conv_ToInt( FT_Byte**  cursor,
+                 FT_Byte*   limit )
+
+  {
+    FT_Byte*  p = *cursor;
+    FT_Byte*  curp;
+
+    FT_Long   num;
+
+
+    curp = p;
+    num  = PS_Conv_Strtol( &p, limit, 10 );
+
+    if ( p == curp )
+      return 0;
+
+    if ( p < limit && *p == '#' )
+    {
+      p++;
+
+      curp = p;
+      num  = PS_Conv_Strtol( &p, limit, num );
+
+      if ( p == curp )
+        return 0;
+    }
+
+    *cursor = p;
+
+    return num;
+  }
+
+
+  FT_LOCAL_DEF( FT_Fixed )
+  PS_Conv_ToFixed( FT_Byte**  cursor,
+                   FT_Byte*   limit,
+                   FT_Long    power_ten )
+  {
+    FT_Byte*  p = *cursor;
+    FT_Byte*  curp;
+	// Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.
+	// We must use 64-bit integer to avoid overflow. If there is some 64-bit integer support.
+	// Since some platform doesn't support 64-bit integer, then use integer instead.
+#if defined(FT_INT64)
+    FT_INT64  integral = 0;
+    FT_INT64  decimal = 0;
+#else
+	FT_Long integral;
+	FT_Long decimal = 0;
+	FT_Int temp0 = 65536;
+	FT_Int temp1 = power_ten;
+#endif
+	FT_Long divider = 1;
+
+	FT_Bool   sign = 0;
+    FT_Bool   have_overflow  = 0;
+    FT_Bool   have_underflow = 0;
+
+    if ( p >= limit )
+      goto Bad;
+
+    if ( *p == '-' || *p == '+' )
+    {
+      sign = FT_BOOL( *p == '-' );
+
+      p++;
+      if ( p == limit )
+        goto Bad;
+    }
+
+    /* read the integer part */
+    if ( *p != '.' )
+    {
+      curp     = p;
+
+		// Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.
+		// Limited to the fix-point mechanism, we have no choice now to crop the value domain.
+		// Do accurate overflow check if FT_INT64 supported, otherwise vague check.
+#if defined(FT_INT64)
+		integral = ((FT_INT64)PS_Conv_ToInt( &p, limit )) << 16;
+#else
+		// We use 'power_ten' and 2^16 to compute the coefficient.
+		//while ( temp1 > 0 ) { temp0 *= 10; temp1 --; }
+		//while ( temp1 < 0 ) { temp0 /= 10; temp1 ++; }
+		
+		integral = PS_Conv_ToInt( &p, limit );
+		if ( p == curp )
+			return 0;
+		if ( integral > 0x7FFF )
+			have_overflow = 1;
+		else 
+			integral = integral << 16;
+#endif   
+    }
+
+    /* read the decimal part */
+    if ( p < limit && *p == '.' )
+    {
+      p++;
+
+      for ( ; p < limit; p++ )
+      {
+        FT_Char  c;
+
+
+        if ( IS_PS_SPACE( *p ) || *p OP 0x80 )
+          break;
+
+        c = ft_char_table[*p & 0x7f];
+
+        if ( c < 0 || c >= 10 )
+          break;
+
+        if ( decimal < 0xCCCCCCCL )
+        {
+          decimal = decimal * 10 + c;
+
+          if ( !integral && power_ten > 0 )
+            power_ten--;
+          else
+            divider *= 10;
+        }
+      }
+    }
+
+    /* read exponent, if any */
+    if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) )
+    {
+      FT_Long  exponent;
+
+
+      p++;
+
+      curp     = p;
+      exponent = PS_Conv_ToInt( &p, limit );
+
+      if ( curp == p )
+        return 0;
+
+      /* arbitrarily limit exponent */
+      if ( exponent > 1000 )
+        have_overflow = 1;
+      else if ( exponent < -1000 )
+        have_underflow = 1;
+      else
+        power_ten += exponent;
+    }
+
+    *cursor = p;
+
+    if ( !integral && !decimal )
+      return 0;
+
+    if ( have_overflow )
+      goto Overflow;
+    if ( have_underflow )
+      goto Underflow;
+
+    while ( power_ten > 0 )
+    {
+      if ( integral >= 0xCCCCCCCL )
+        goto Overflow;
+      integral *= 10;
+
+      if ( decimal >= 0xCCCCCCCL )
+      {
+        if ( divider == 1 )
+          goto Overflow;
+        divider /= 10;
+      }
+      else
+        decimal *= 10;
+
+      power_ten--;
+    }
+
+    while ( power_ten < 0 )
+    {
+      integral /= 10;
+      if ( divider < 0xCCCCCCCL )
+        divider *= 10;
+      else
+        decimal /= 10;
+
+      if ( !integral && !decimal )
+        goto Underflow;
+
+      power_ten++;
+    }
+
+// Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.
+	// Limited to the fix-point mechanism, we have no choice now to crop the value domain.
+	// Do accurate overflow check if FT_INT64 supported, otherwise ignore the check at this moment.
+	// Since there is also a check using divider < 10000000L.  
+#if defined(FT_INT64) 
+    if ( decimal ) {
+		integral += FT_DivFix( (FT_Long)decimal, divider );
+	}
+	if ( integral > 2147483647) integral = 2147483647;
+#else
+	if ( decimal ) {
+		integral += FT_DivFix( decimal, divider );
+	}
+#endif
+
+
+  Exit:
+    if ( sign )
+      integral = -integral;
+
+    return (FT_Long)integral;
+
+  Bad:
+    FT_TRACE4(( "!!!END OF DATA:!!!" ));
+    return 0;
+
+  Overflow:
+    integral = 0x7FFFFFFFL;
+    FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+    goto Exit;
+
+  Underflow:
+    FT_TRACE4(( "!!!UNDERFLOW:!!!" ));
+    return 0;
+  }
+
+
+#if 0
+  FT_LOCAL_DEF( FT_UInt )
+  PS_Conv_StringDecode( FT_Byte**  cursor,
+                        FT_Byte*   limit,
+                        FT_Byte*   buffer,
+                        FT_Offset  n )
+  {
+    FT_Byte*  p;
+    FT_UInt   r = 0;
+
+
+    for ( p = *cursor; r < n && p < limit; p++ )
+    {
+      FT_Byte  b;
+
+
+      if ( *p != '\\' )
+      {
+        buffer[r++] = *p;
+
+        continue;
+      }
+
+      p++;
+
+      switch ( *p )
+      {
+      case 'n':
+        b = '\n';
+        break;
+      case 'r':
+        b = '\r';
+        break;
+      case 't':
+        b = '\t';
+        break;
+      case 'b':
+        b = '\b';
+        break;
+      case 'f':
+        b = '\f';
+        break;
+      case '\r':
+        p++;
+        if ( *p != '\n' )
+        {
+          b = *p;
+
+          break;
+        }
+        /* no break */
+      case '\n':
+        continue;
+        break;
+      default:
+        if ( IS_PS_DIGIT( *p ) )
+        {
+          b = *p - '0';
+
+          p++;
+
+          if ( IS_PS_DIGIT( *p ) )
+          {
+            b = b * 8 + *p - '0';
+
+            p++;
+
+            if ( IS_PS_DIGIT( *p ) )
+              b = b * 8 + *p - '0';
+            else
+            {
+              buffer[r++] = b;
+              b = *p;
+            }
+          }
+          else
+          {
+            buffer[r++] = b;
+            b = *p;
+          }
+        }
+        else
+          b = *p;
+        break;
+      }
+
+      buffer[r++] = b;
+    }
+
+    *cursor = p;
+
+    return r;
+  }
+#endif /* 0 */
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  PS_Conv_ASCIIHexDecode( FT_Byte**  cursor,
+                          FT_Byte*   limit,
+                          FT_Byte*   buffer,
+                          FT_Offset  n )
+  {
+    FT_Byte*  p;
+    FT_UInt   r   = 0;
+    FT_UInt   w   = 0;
+    FT_UInt   pad = 0x01;
+
+
+    n *= 2;
+
+#if 1
+
+    p = *cursor;
+
+    if ( p >= limit )
+      return 0;
+
+    if ( n > (FT_UInt)( limit - p ) )
+      n = (FT_UInt)( limit - p );
+
+    /* we try to process two nibbles at a time to be as fast as possible */
+    for ( ; r < n; r++ )
+    {
+      FT_UInt  c = p[r];
+
+
+      if ( IS_PS_SPACE( c ) )
+        continue;
+
+      if ( c OP 0x80 )
+        break;
+
+      c = ft_char_table[c & 0x7F];
+      if ( (unsigned)c >= 16 )
+        break;
+
+      pad = ( pad << 4 ) | c;
+      if ( pad & 0x100 )
+      {
+        buffer[w++] = (FT_Byte)pad;
+        pad         = 0x01;
+      }
+    }
+
+    if ( pad != 0x01 )
+      buffer[w++] = (FT_Byte)( pad << 4 );
+
+    *cursor = p + r;
+
+    return w;
+
+#else /* 0 */
+
+    for ( r = 0; r < n; r++ )
+    {
+      FT_Char  c;
+
+
+      if ( IS_PS_SPACE( *p ) )
+        continue;
+
+      if ( *p OP 0x80 )
+        break;
+
+      c = ft_char_table[*p & 0x7f];
+
+      if ( (unsigned)c >= 16 )
+        break;
+
+      if ( r & 1 )
+      {
+        *buffer = (FT_Byte)(*buffer + c);
+        buffer++;
+      }
+      else
+        *buffer = (FT_Byte)(c << 4);
+
+      r++;
+    }
+
+    *cursor = p;
+
+    return ( r + 1 ) / 2;
+
+#endif /* 0 */
+
+  }
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  PS_Conv_EexecDecode( FT_Byte**   cursor,
+                       FT_Byte*    limit,
+                       FT_Byte*    buffer,
+                       FT_Offset   n,
+                       FT_UShort*  seed )
+  {
+    FT_Byte*  p;
+    FT_UInt   r;
+    FT_UInt   s = *seed;
+
+
+#if 1
+
+    p = *cursor;
+
+    if ( p >= limit )
+      return 0;
+
+    if ( n > (FT_UInt)(limit - p) )
+      n = (FT_UInt)(limit - p);
+
+    for ( r = 0; r < n; r++ )
+    {
+      FT_UInt  val = p[r];
+      FT_UInt  b   = ( val ^ ( s >> 8 ) );
+
+
+      s         = ( (val + s)*52845U + 22719 ) & 0xFFFFU;
+      buffer[r] = (FT_Byte) b;
+    }
+
+    *cursor = p + n;
+    *seed   = (FT_UShort)s;
+
+#else /* 0 */
+
+    for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ )
+    {
+      FT_Byte  b = (FT_Byte)( *p ^ ( s >> 8 ) );
+
+
+      s = (FT_UShort)( ( *p + s ) * 52845U + 22719 );
+      *buffer++ = b;
+    }
+    *cursor = p;
+    *seed   = s;
+
+#endif /* 0 */
+
+    return r;
+  }
+
+FT_LOCAL_DEF( FT_Bool )
+	  xyq_PS_Conv_ToInt( FT_Byte**  cursor,
+	  FT_Byte*   limit, FT_Long* val )
+	  
+  {
+	  FT_Byte first_char = **cursor;
+	  if (first_char == '+' || first_char == '-' || (first_char >= '0' && first_char <= '9')) {
+		  *val = PS_Conv_ToInt(cursor, limit);
+		  return 1;
+	  }
+	  return 0;
+  }
+
+/* END */
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.h
new file mode 100644
index 0000000..7fa7727
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.h
@@ -0,0 +1,74 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psconv.h                                                               */
+/*                                                                         */
+/*    Some convenience conversions (specification).                        */
+/*                                                                         */
+/*  Copyright 2006, 2012 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSCONV_H__
+#define __PSCONV_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Long )
+  PS_Conv_Strtol( FT_Byte**  cursor,
+                  FT_Byte*   limit,
+                  FT_Long    base );
+
+
+  FT_LOCAL( FT_Long )
+  PS_Conv_ToInt( FT_Byte**  cursor,
+                 FT_Byte*   limit );
+  FT_LOCAL( FT_Bool )
+	  xyq_PS_Conv_ToInt( FT_Byte**  cursor,
+	  FT_Byte*   limit, FT_Long* val );	/* XYQ 2007-10-10: we add return value indicating whether it's actually a number */
+
+  FT_LOCAL( FT_Fixed )
+  PS_Conv_ToFixed( FT_Byte**  cursor,
+                   FT_Byte*   limit,
+                   FT_Long    power_ten );
+
+#if 0
+  FT_LOCAL( FT_UInt )
+  PS_Conv_StringDecode( FT_Byte**  cursor,
+                        FT_Byte*   limit,
+                        FT_Byte*   buffer,
+                        FT_Offset  n );
+#endif
+
+  FT_LOCAL( FT_UInt )
+  PS_Conv_ASCIIHexDecode( FT_Byte**  cursor,
+                          FT_Byte*   limit,
+                          FT_Byte*   buffer,
+                          FT_Offset  n );
+
+  FT_LOCAL( FT_UInt )
+  PS_Conv_EexecDecode( FT_Byte**   cursor,
+                       FT_Byte*    limit,
+                       FT_Byte*    buffer,
+                       FT_Offset   n,
+                       FT_UShort*  seed );
+
+
+FT_END_HEADER
+
+#endif /* __PSCONV_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.c
new file mode 100644
index 0000000..2cd9003
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.c
@@ -0,0 +1,1767 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psobjs.c                                                               */
+/*                                                                         */
+/*    Auxiliary functions for PostScript fonts (body).                     */
+/*                                                                         */
+/*  Copyright 1996-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+
+#include "psobjs.h"
+#include "psconv.h"
+
+#include "psauxerr.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_psobjs
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                             PS_TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ps_table_new                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a PS_Table.                                            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    table  :: The address of the target table.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    count  :: The table size = the maximum number of elements.         */
+  /*                                                                       */
+  /*    memory :: The memory object to use for all subsequent              */
+  /*              reallocations.                                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  ps_table_new( PS_Table   table,
+                FT_Int     count,
+                FT_Memory  memory )
+  {
+    FT_Error  error;
+
+
+    table->memory = memory;
+    if ( FT_NEW_ARRAY( table->elements, count ) ||
+         FT_NEW_ARRAY( table->lengths,  count ) )
+      goto Exit;
+
+    table->max_elems = count;
+    table->init      = 0xDEADBEEFUL;
+    table->num_elems = 0;
+    table->block     = 0;
+    table->capacity  = 0;
+    table->cursor    = 0;
+
+    *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs;
+
+  Exit:
+    if ( error )
+      FT_FREE( table->elements );
+
+    return error;
+  }
+
+
+  static void
+  shift_elements( PS_Table  table,
+                  FT_Byte*  old_base )
+  {
+    FT_PtrDist  delta  = table->block - old_base;
+    FT_Byte**   offset = table->elements;
+    FT_Byte**   limit  = offset + table->max_elems;
+
+
+    for ( ; offset < limit; offset++ )
+    {
+      if ( offset[0] )
+        offset[0] += delta;
+    }
+  }
+
+
+  static FT_Error
+  reallocate_t1_table( PS_Table   table,
+                       FT_Offset  new_size )
+  {
+    FT_Memory  memory   = table->memory;
+    FT_Byte*   old_base = table->block;
+    FT_Error   error;
+
+
+    /* allocate new base block */
+    if ( FT_ALLOC( table->block, new_size ) )
+    {
+      table->block = old_base;
+      return error;
+    }
+
+    /* copy elements and shift offsets */
+    if ( old_base )
+    {
+      FT_MEM_COPY( table->block, old_base, table->capacity );
+      shift_elements( table, old_base );
+      FT_FREE( old_base );
+    }
+
+    table->capacity = new_size;
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ps_table_add                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Adds an object to a PS_Table, possibly growing its memory block.   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    table  :: The target table.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    idx    :: The index of the object in the table.                    */
+  /*                                                                       */
+  /*    object :: The address of the object to copy in memory.             */
+  /*                                                                       */
+  /*    length :: The length in bytes of the source object.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  An error is returned if a  */
+  /*    reallocation fails.                                                */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  ps_table_add( PS_Table    table,
+                FT_Int      idx,
+                void*       object,
+                FT_PtrDist  length )
+  {
+    if ( idx < 0 || idx >= table->max_elems )
+    {
+      FT_ERROR(( "ps_table_add: invalid index\n" ));
+      return FT_THROW( Invalid_Argument );
+    }
+
+    if ( length < 0 )
+    {
+      FT_ERROR(( "ps_table_add: invalid length\n" ));
+      return FT_THROW( Invalid_Argument );
+    }
+
+    /* grow the base block if needed */
+    if ( table->cursor + length > table->capacity )
+    {
+      FT_Error    error;
+      FT_Offset   new_size = table->capacity;
+      FT_PtrDist  in_offset;
+
+
+      in_offset = (FT_Byte*)object - table->block;
+      if ( in_offset < 0 || (FT_Offset)in_offset >= table->capacity )
+        in_offset = -1;
+
+      while ( new_size < table->cursor + length )
+      {
+        /* increase size by 25% and round up to the nearest multiple
+           of 1024 */
+        new_size += ( new_size >> 2 ) + 1;
+        new_size  = FT_PAD_CEIL( new_size, 1024 );
+      }
+
+      error = reallocate_t1_table( table, new_size );
+      if ( error )
+        return error;
+
+      if ( in_offset >= 0 )
+        object = table->block + in_offset;
+    }
+
+    /* add the object to the base block and adjust offset */
+    table->elements[idx] = table->block + table->cursor;
+    table->lengths [idx] = length;
+    FT_MEM_COPY( table->block + table->cursor, object, length );
+
+    table->cursor += length;
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ps_table_done                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a PS_TableRec (i.e., reallocate it to its current        */
+  /*    cursor).                                                           */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    table :: The target table.                                         */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function does NOT release the heap's memory block.  It is up  */
+  /*    to the caller to clean it, or reference it in its own structures.  */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  ps_table_done( PS_Table  table )
+  {
+    FT_Memory  memory = table->memory;
+    FT_Error   error;
+    FT_Byte*   old_base = table->block;
+
+
+    /* should never fail, because rec.cursor <= rec.size */
+    if ( !old_base )
+      return;
+
+    if ( FT_ALLOC( table->block, table->cursor ) )
+      return;
+    FT_MEM_COPY( table->block, old_base, table->cursor );
+    shift_elements( table, old_base );
+
+    table->capacity = table->cursor;
+    FT_FREE( old_base );
+
+    FT_UNUSED( error );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ps_table_release( PS_Table  table )
+  {
+    FT_Memory  memory = table->memory;
+
+
+    if ( (FT_ULong)table->init == 0xDEADBEEFUL )
+    {
+      FT_FREE( table->block );
+      FT_FREE( table->elements );
+      FT_FREE( table->lengths );
+      table->init = 0;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            T1 PARSER                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* first character must be already part of the comment */
+
+  static void
+  skip_comment( FT_Byte*  *acur,
+                FT_Byte*   limit )
+  {
+    FT_Byte*  cur = *acur;
+
+
+    while ( cur < limit )
+    {
+      if ( IS_PS_NEWLINE( *cur ) )
+        break;
+      cur++;
+    }
+
+    *acur = cur;
+  }
+
+
+  static void
+  skip_spaces( FT_Byte*  *acur,
+               FT_Byte*   limit )
+  {
+    FT_Byte*  cur = *acur;
+
+
+    while ( cur < limit )
+    {
+      if ( !IS_PS_SPACE( *cur ) )
+      {
+        if ( *cur == '%' )
+          /* According to the PLRM, a comment is equal to a space. */
+          skip_comment( &cur, limit );
+        else
+          break;
+      }
+      cur++;
+    }
+
+    *acur = cur;
+  }
+
+
+#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' )
+
+
+  /* first character must be `(';                               */
+  /* *acur is positioned at the character after the closing `)' */
+
+  static FT_Error
+  skip_literal_string( FT_Byte*  *acur,
+                       FT_Byte*   limit )
+  {
+    FT_Byte*      cur   = *acur;
+    FT_Int        embed = 0;
+    FT_Error      error = FT_ERR( Invalid_File_Format );
+    unsigned int  i;
+
+
+    while ( cur < limit )
+    {
+      FT_Byte  c = *cur;
+
+
+      ++cur;
+
+      if ( c == '\\' )
+      {
+        /* Red Book 3rd ed., section `Literal Text Strings', p. 29:     */
+        /* A backslash can introduce three different types              */
+        /* of escape sequences:                                         */
+        /*   - a special escaped char like \r, \n, etc.                 */
+        /*   - a one-, two-, or three-digit octal number                */
+        /*   - none of the above in which case the backslash is ignored */
+
+        if ( cur == limit )
+          /* error (or to be ignored?) */
+          break;
+
+        switch ( *cur )
+        {
+          /* skip `special' escape */
+        case 'n':
+        case 'r':
+        case 't':
+        case 'b':
+        case 'f':
+        case '\\':
+        case '(':
+        case ')':
+          ++cur;
+          break;
+
+        default:
+          /* skip octal escape or ignore backslash */
+          for ( i = 0; i < 3 && cur < limit; ++i )
+          {
+            if ( !IS_OCTAL_DIGIT( *cur ) )
+              break;
+
+            ++cur;
+          }
+        }
+      }
+      else if ( c == '(' )
+        embed++;
+      else if ( c == ')' )
+      {
+        embed--;
+        if ( embed == 0 )
+        {
+          error = FT_Err_Ok;
+          break;
+        }
+      }
+    }
+
+    *acur = cur;
+
+    return error;
+  }
+
+
+  /* first character must be `<' */
+
+  static FT_Error
+  skip_string( FT_Byte*  *acur,
+               FT_Byte*   limit )
+  {
+    FT_Byte*  cur = *acur;
+    FT_Error  err =  FT_Err_Ok;
+
+
+    while ( ++cur < limit )
+    {
+      /* All whitespace characters are ignored. */
+      skip_spaces( &cur, limit );
+      if ( cur >= limit )
+        break;
+
+      if ( !IS_PS_XDIGIT( *cur ) )
+        break;
+    }
+
+    if ( cur < limit && *cur != '>' )
+    {
+      FT_ERROR(( "skip_string: missing closing delimiter `>'\n" ));
+      err = FT_THROW( Invalid_File_Format );
+    }
+    else
+      cur++;
+
+    *acur = cur;
+    return err;
+  }
+
+
+  /* first character must be the opening brace that */
+  /* starts the procedure                           */
+
+  /* NB: [ and ] need not match:                    */
+  /* `/foo {[} def' is a valid PostScript fragment, */
+  /* even within a Type1 font                       */
+
+  static FT_Error
+  skip_procedure( FT_Byte*  *acur,
+                  FT_Byte*   limit )
+  {
+    FT_Byte*  cur;
+    FT_Int    embed = 0;
+    FT_Error  error = FT_Err_Ok;
+
+
+    FT_ASSERT( **acur == '{' );
+
+    for ( cur = *acur; cur < limit && error == FT_Err_Ok; ++cur )
+    {
+      switch ( *cur )
+      {
+      case '{':
+        ++embed;
+        break;
+
+      case '}':
+        --embed;
+        if ( embed == 0 )
+        {
+          ++cur;
+          goto end;
+        }
+        break;
+
+      case '(':
+        error = skip_literal_string( &cur, limit );
+        break;
+
+      case '<':
+        error = skip_string( &cur, limit );
+        break;
+
+      case '%':
+        skip_comment( &cur, limit );
+        break;
+      }
+    }
+
+  end:
+    if ( embed != 0 )
+      error = FT_THROW( Invalid_File_Format );
+
+    *acur = cur;
+
+    return error;
+  }
+
+
+  /***********************************************************************/
+  /*                                                                     */
+  /* All exported parsing routines handle leading whitespace and stop at */
+  /* the first character which isn't part of the just handled token.     */
+  /*                                                                     */
+  /***********************************************************************/
+
+
+  FT_LOCAL_DEF( void )
+  ps_parser_skip_PS_token( PS_Parser  parser )
+  {
+    /* Note: PostScript allows any non-delimiting, non-whitespace        */
+    /*       character in a name (PS Ref Manual, 3rd ed, p31).           */
+    /*       PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */
+
+    FT_Byte*  cur   = parser->cursor;
+    FT_Byte*  limit = parser->limit;
+    FT_Error  error = FT_Err_Ok;
+
+
+    skip_spaces( &cur, limit );             /* this also skips comments */
+    if ( cur >= limit )
+      goto Exit;
+
+    /* self-delimiting, single-character tokens */
+    if ( *cur == '[' || *cur == ']' )
+    {
+      cur++;
+      goto Exit;
+    }
+
+    /* skip balanced expressions (procedures and strings) */
+
+    if ( *cur == '{' )                              /* {...} */
+    {
+      error = skip_procedure( &cur, limit );
+      goto Exit;
+    }
+
+    if ( *cur == '(' )                              /* (...) */
+    {
+      error = skip_literal_string( &cur, limit );
+      goto Exit;
+    }
+
+    if ( *cur == '<' )                              /* <...> */
+    {
+      if ( cur + 1 < limit && *(cur + 1) == '<' )   /* << */
+      {
+        cur++;
+        cur++;
+      }
+      else
+        error = skip_string( &cur, limit );
+
+      goto Exit;
+    }
+
+    if ( *cur == '>' )
+    {
+      cur++;
+      if ( cur >= limit || *cur != '>' )             /* >> */
+      {
+        FT_ERROR(( "ps_parser_skip_PS_token:"
+                   " unexpected closing delimiter `>'\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+      cur++;
+      goto Exit;
+    }
+
+    if ( *cur == '/' )
+      cur++;
+
+    /* anything else */
+    while ( cur < limit )
+    {
+      /* *cur might be invalid (e.g., ')' or '}'), but this   */
+      /* is handled by the test `cur == parser->cursor' below */
+      if ( IS_PS_DELIM( *cur ) )
+        break;
+
+      cur++;
+    }
+
+  Exit:
+    if ( cur < limit && cur == parser->cursor )
+    {
+      FT_ERROR(( "ps_parser_skip_PS_token:"
+                 " current token is `%c' which is self-delimiting\n"
+                 "                        "
+                 " but invalid at this point\n",
+                 *cur ));
+
+      error = FT_THROW( Invalid_File_Format );
+    }
+
+    parser->error  = error;
+    parser->cursor = cur;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ps_parser_skip_spaces( PS_Parser  parser )
+  {
+    skip_spaces( &parser->cursor, parser->limit );
+  }
+
+
+  /* `token' here means either something between balanced delimiters */
+  /* or the next token; the delimiters are not removed.              */
+
+  FT_LOCAL_DEF( void )
+  ps_parser_to_token( PS_Parser  parser,
+                      T1_Token   token )
+  {
+    FT_Byte*  cur;
+    FT_Byte*  limit;
+    FT_Int    embed;
+
+
+    token->type  = T1_TOKEN_TYPE_NONE;
+    token->start = 0;
+    token->limit = 0;
+
+    /* first of all, skip leading whitespace */
+    ps_parser_skip_spaces( parser );
+
+    cur   = parser->cursor;
+    limit = parser->limit;
+
+    if ( cur >= limit )
+      return;
+
+    switch ( *cur )
+    {
+      /************* check for literal string *****************/
+    case '(':
+      token->type  = T1_TOKEN_TYPE_STRING;
+      token->start = cur;
+
+      if ( skip_literal_string( &cur, limit ) == FT_Err_Ok )
+        token->limit = cur;
+      break;
+
+      /************* check for programs/array *****************/
+    case '{':
+      token->type  = T1_TOKEN_TYPE_ARRAY;
+      token->start = cur;
+
+      if ( skip_procedure( &cur, limit ) == FT_Err_Ok )
+        token->limit = cur;
+      break;
+
+      /************* check for table/array ********************/
+      /* XXX: in theory we should also look for "<<"          */
+      /*      since this is semantically equivalent to "[";   */
+      /*      in practice it doesn't matter (?)               */
+    case '[':
+      token->type  = T1_TOKEN_TYPE_ARRAY;
+      embed        = 1;
+      token->start = cur++;
+
+      /* we need this to catch `[ ]' */
+      parser->cursor = cur;
+      ps_parser_skip_spaces( parser );
+      cur = parser->cursor;
+
+      while ( cur < limit && !parser->error )
+      {
+        /* XXX: this is wrong because it does not      */
+        /*      skip comments, procedures, and strings */
+        if ( *cur == '[' )
+          embed++;
+        else if ( *cur == ']' )
+        {
+          embed--;
+          if ( embed <= 0 )
+          {
+            token->limit = ++cur;
+            break;
+          }
+        }
+
+        parser->cursor = cur;
+        ps_parser_skip_PS_token( parser );
+        /* we need this to catch `[XXX ]' */
+        ps_parser_skip_spaces  ( parser );
+        cur = parser->cursor;
+      }
+      break;
+
+      /* ************ otherwise, it is any token **************/
+    default:
+      token->start = cur;
+      token->type  = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY );
+      ps_parser_skip_PS_token( parser );
+      cur = parser->cursor;
+      if ( !parser->error )
+        token->limit = cur;
+    }
+
+    if ( !token->limit )
+    {
+      token->start = 0;
+      token->type  = T1_TOKEN_TYPE_NONE;
+    }
+
+    parser->cursor = cur;
+  }
+
+
+  /* NB: `tokens' can be NULL if we only want to count */
+  /* the number of array elements                      */
+
+  FT_LOCAL_DEF( void )
+  ps_parser_to_token_array( PS_Parser  parser,
+                            T1_Token   tokens,
+                            FT_UInt    max_tokens,
+                            FT_Int*    pnum_tokens )
+  {
+    T1_TokenRec  master;
+
+
+    *pnum_tokens = -1;
+
+    /* this also handles leading whitespace */
+    ps_parser_to_token( parser, &master );
+
+    if ( master.type == T1_TOKEN_TYPE_ARRAY )
+    {
+      FT_Byte*  old_cursor = parser->cursor;
+      FT_Byte*  old_limit  = parser->limit;
+      T1_Token  cur        = tokens;
+      T1_Token  limit      = cur + max_tokens;
+
+
+      /* don't include outermost delimiters */
+      parser->cursor = master.start + 1;
+      parser->limit  = master.limit - 1;
+
+      while ( parser->cursor < parser->limit )
+      {
+        T1_TokenRec  token;
+
+
+        ps_parser_to_token( parser, &token );
+        if ( !token.type )
+          break;
+
+        if ( tokens != NULL && cur < limit )
+          *cur = token;
+
+        cur++;
+      }
+
+      *pnum_tokens = (FT_Int)( cur - tokens );
+
+      parser->cursor = old_cursor;
+      parser->limit  = old_limit;
+    }
+  }
+
+
+  /* first character must be a delimiter or a part of a number */
+  /* NB: `coords' can be NULL if we just want to skip the      */
+  /*     array; in this case we ignore `max_coords'            */
+
+  static FT_Int
+  ps_tocoordarray( FT_Byte*  *acur,
+                   FT_Byte*   limit,
+                   FT_Int     max_coords,
+                   FT_Short*  coords )
+  {
+    FT_Byte*  cur   = *acur;
+    FT_Int    count = 0;
+    FT_Byte   c, ender;
+
+
+    if ( cur >= limit )
+      goto Exit;
+
+    /* check for the beginning of an array; otherwise, only one number */
+    /* will be read                                                    */
+    c     = *cur;
+    ender = 0;
+
+    if ( c == '[' )
+      ender = ']';
+    else if ( c == '{' )
+      ender = '}';
+
+    if ( ender )
+      cur++;
+
+    /* now, read the coordinates */
+    while ( cur < limit )
+    {
+      FT_Short  dummy;
+      FT_Byte*  old_cur;
+
+
+      /* skip whitespace in front of data */
+      skip_spaces( &cur, limit );
+      if ( cur >= limit )
+        goto Exit;
+
+      if ( *cur == ender )
+      {
+        cur++;
+        break;
+      }
+
+      old_cur = cur;
+
+      if ( coords != NULL && count >= max_coords )
+        break;
+
+      /* call PS_Conv_ToFixed() even if coords == NULL */
+      /* to properly parse number at `cur'             */
+      *( coords != NULL ? &coords[count] : &dummy ) =
+        (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 );
+
+      if ( old_cur == cur )
+      {
+        count = -1;
+        goto Exit;
+      }
+      else
+        count++;
+
+      if ( !ender )
+        break;
+    }
+
+  Exit:
+    *acur = cur;
+    return count;
+  }
+
+
+  /* first character must be a delimiter or a part of a number */
+  /* NB: `values' can be NULL if we just want to skip the      */
+  /*     array; in this case we ignore `max_values'            */
+
+  static FT_Int
+  ps_tofixedarray( FT_Byte*  *acur,
+                   FT_Byte*   limit,
+                   FT_Int     max_values,
+                   FT_Fixed*  values,
+                   FT_Int     power_ten )
+  {
+    FT_Byte*  cur   = *acur;
+    FT_Int    count = 0;
+    FT_Byte   c, ender;
+
+
+    if ( cur >= limit )
+      goto Exit;
+
+    /* Check for the beginning of an array.  Otherwise, only one number */
+    /* will be read.                                                    */
+    c     = *cur;
+    ender = 0;
+
+    if ( c == '[' )
+      ender = ']';
+    else if ( c == '{' )
+      ender = '}';
+
+    if ( ender )
+      cur++;
+
+    /* now, read the values */
+    while ( cur < limit )
+    {
+      FT_Fixed  dummy;
+      FT_Byte*  old_cur;
+
+
+      /* skip whitespace in front of data */
+      skip_spaces( &cur, limit );
+      if ( cur >= limit )
+        goto Exit;
+
+      if ( *cur == ender )
+      {
+        cur++;
+        break;
+      }
+
+      old_cur = cur;
+
+      if ( values != NULL && count >= max_values )
+        break;
+
+      /* call PS_Conv_ToFixed() even if coords == NULL */
+      /* to properly parse number at `cur'             */
+      *( values != NULL ? &values[count] : &dummy ) =
+        PS_Conv_ToFixed( &cur, limit, power_ten );
+
+      if ( old_cur == cur )
+      {
+        count = -1;
+        goto Exit;
+      }
+      else
+        count++;
+
+      if ( !ender )
+        break;
+    }
+
+  Exit:
+    *acur = cur;
+    return count;
+  }
+
+
+#if 0
+
+  static FT_String*
+  ps_tostring( FT_Byte**  cursor,
+               FT_Byte*   limit,
+               FT_Memory  memory )
+  {
+    FT_Byte*    cur = *cursor;
+    FT_PtrDist  len = 0;
+    FT_Int      count;
+    FT_String*  result;
+    FT_Error    error;
+
+
+    /* XXX: some stupid fonts have a `Notice' or `Copyright' string     */
+    /*      that simply doesn't begin with an opening parenthesis, even */
+    /*      though they have a closing one!  E.g. "amuncial.pfb"        */
+    /*                                                                  */
+    /*      We must deal with these ill-fated cases there.  Note that   */
+    /*      these fonts didn't work with the old Type 1 driver as the   */
+    /*      notice/copyright was not recognized as a valid string token */
+    /*      and made the old token parser commit errors.                */
+
+    while ( cur < limit && ( *cur == ' ' || *cur == '\t' ) )
+      cur++;
+    if ( cur + 1 >= limit )
+      return 0;
+
+    if ( *cur == '(' )
+      cur++;  /* skip the opening parenthesis, if there is one */
+
+    *cursor = cur;
+    count   = 0;
+
+    /* then, count its length */
+    for ( ; cur < limit; cur++ )
+    {
+      if ( *cur == '(' )
+        count++;
+
+      else if ( *cur == ')' )
+      {
+        count--;
+        if ( count < 0 )
+          break;
+      }
+    }
+
+    len = cur - *cursor;
+    if ( cur >= limit || FT_ALLOC( result, len + 1 ) )
+      return 0;
+
+    /* now copy the string */
+    FT_MEM_COPY( result, *cursor, len );
+    result[len] = '\0';
+    *cursor = cur;
+    return result;
+  }
+
+#endif /* 0 */
+
+
+  static int
+  ps_tobool( FT_Byte*  *acur,
+             FT_Byte*   limit )
+  {
+    FT_Byte*  cur    = *acur;
+    FT_Bool   result = 0;
+
+
+    /* return 1 if we find `true', 0 otherwise */
+    if ( cur + 3 < limit &&
+         cur[0] == 't'   &&
+         cur[1] == 'r'   &&
+         cur[2] == 'u'   &&
+         cur[3] == 'e'   )
+    {
+      result = 1;
+      cur   += 5;
+    }
+    else if ( cur + 4 < limit &&
+              cur[0] == 'f'   &&
+              cur[1] == 'a'   &&
+              cur[2] == 'l'   &&
+              cur[3] == 's'   &&
+              cur[4] == 'e'   )
+    {
+      result = 0;
+      cur   += 6;
+    }
+
+    *acur = cur;
+    return result;
+  }
+
+
+  /* load a simple field (i.e. non-table) into the current list of objects */
+
+  FT_LOCAL_DEF( FT_Error )
+  ps_parser_load_field( PS_Parser       parser,
+                        const T1_Field  field,
+                        void**          objects,
+                        FT_UInt         max_objects,
+                        FT_ULong*       pflags )
+  {
+    T1_TokenRec   token;
+    FT_Byte*      cur;
+    FT_Byte*      limit;
+    FT_UInt       count;
+    FT_UInt       idx;
+    FT_Error      error;
+    T1_FieldType  type;
+
+
+    /* this also skips leading whitespace */
+    ps_parser_to_token( parser, &token );
+    if ( !token.type )
+      goto Fail;
+
+    count = 1;
+    idx   = 0;
+    cur   = token.start;
+    limit = token.limit;
+
+    type = field->type;
+
+    /* we must detect arrays in /FontBBox */
+    if ( type == T1_FIELD_TYPE_BBOX )
+    {
+      T1_TokenRec  token2;
+      FT_Byte*     old_cur   = parser->cursor;
+      FT_Byte*     old_limit = parser->limit;
+
+
+      /* don't include delimiters */
+      parser->cursor = token.start + 1;
+      parser->limit  = token.limit - 1;
+
+      ps_parser_to_token( parser, &token2 );
+      parser->cursor = old_cur;
+      parser->limit  = old_limit;
+
+      if ( token2.type == T1_TOKEN_TYPE_ARRAY )
+      {
+        type = T1_FIELD_TYPE_MM_BBOX;
+        goto FieldArray;
+      }
+    }
+    else if ( token.type == T1_TOKEN_TYPE_ARRAY )
+    {
+      count = max_objects;
+
+    FieldArray:
+      /* if this is an array and we have no blend, an error occurs */
+      if ( max_objects == 0 )
+        goto Fail;
+
+      idx = 1;
+
+      /* don't include delimiters */
+      cur++;
+      limit--;
+    }
+
+    for ( ; count > 0; count--, idx++ )
+    {
+      FT_Byte*    q = (FT_Byte*)objects[idx] + field->offset;
+      FT_Long     val;
+      FT_String*  string;
+
+
+      skip_spaces( &cur, limit );
+
+      switch ( type )
+      {
+      case T1_FIELD_TYPE_BOOL:
+        val = ps_tobool( &cur, limit );
+        goto Store_Integer;
+
+      case T1_FIELD_TYPE_FIXED:
+        val = PS_Conv_ToFixed( &cur, limit, 0 );
+        goto Store_Integer;
+
+      case T1_FIELD_TYPE_FIXED_1000:
+        val = PS_Conv_ToFixed( &cur, limit, 3 );
+        goto Store_Integer;
+
+      case T1_FIELD_TYPE_INTEGER:
+        { FT_Bool ret = xyq_PS_Conv_ToInt( &cur, limit, &val );  /* XYQ 2007-10-10: abort if not a number*/
+		if (!ret) break; }
+        /* fall through */
+
+      Store_Integer:
+        switch ( field->size )
+        {
+        case (8 / FT_CHAR_BIT):
+          *(FT_Byte*)q = (FT_Byte)val;
+          break;
+
+        case (16 / FT_CHAR_BIT):
+          *(FT_UShort*)q = (FT_UShort)val;
+          break;
+
+        case (32 / FT_CHAR_BIT):
+          *(FT_UInt32*)q = (FT_UInt32)val;
+          break;
+
+        default:                /* for 64-bit systems */
+          *(FT_Long*)q = val;
+        }
+        break;
+
+      case T1_FIELD_TYPE_STRING:
+      case T1_FIELD_TYPE_KEY:
+        {
+          FT_Memory  memory = parser->memory;
+          FT_UInt    len    = (FT_UInt)( limit - cur );
+
+
+          if ( cur >= limit )
+            break;
+
+          /* we allow both a string or a name   */
+          /* for cases like /FontName (foo) def */
+          if ( token.type == T1_TOKEN_TYPE_KEY )
+          {
+            /* don't include leading `/' */
+            len--;
+            cur++;
+          }
+          else if ( token.type == T1_TOKEN_TYPE_STRING )
+          {
+            /* don't include delimiting parentheses    */
+            /* XXX we don't handle <<...>> here        */
+            /* XXX should we convert octal escapes?    */
+            /*     if so, what encoding should we use? */
+            cur++;
+            len -= 2;
+          }
+          else
+          {
+            FT_ERROR(( "ps_parser_load_field:"
+                       " expected a name or string\n"
+                       "                     "
+                       " but found token of type %d instead\n",
+                       token.type ));
+            error = FT_THROW( Invalid_File_Format );
+            goto Exit;
+          }
+
+          /* for this to work (FT_String**)q must have been */
+          /* initialized to NULL                            */
+          if ( *(FT_String**)q != NULL )
+          {
+            FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n",
+                        field->ident ));
+            FT_FREE( *(FT_String**)q );
+            *(FT_String**)q = NULL;
+          }
+
+          if ( FT_ALLOC( string, len + 1 ) )
+            goto Exit;
+
+          FT_MEM_COPY( string, cur, len );
+          string[len] = 0;
+
+          *(FT_String**)q = string;
+        }
+        break;
+
+      case T1_FIELD_TYPE_BBOX:
+        {
+		  // Add by Johnson, fix a Error #1: UNINITIALIZED READ. #testdoc 1282.pdf
+          FT_Fixed  temp[4] = {0,0,0,0};
+          FT_BBox*  bbox = (FT_BBox*)q;
+          FT_Int    result;
+
+
+          result = ps_tofixedarray( &cur, limit, 4, temp, 0 );
+
+          if ( result < 0 )
+          {
+            FT_ERROR(( "ps_parser_load_field:"
+                       " expected four integers in bounding box\n" ));
+            error = FT_THROW( Invalid_File_Format );
+            goto Exit;
+          }
+
+          bbox->xMin = FT_RoundFix( temp[0] );
+          bbox->yMin = FT_RoundFix( temp[1] );
+          bbox->xMax = FT_RoundFix( temp[2] );
+          bbox->yMax = FT_RoundFix( temp[3] );
+        }
+        break;
+
+      case T1_FIELD_TYPE_MM_BBOX:
+        {
+          FT_Memory  memory = parser->memory;
+          FT_Fixed*  temp;
+          FT_Int     result;
+          FT_UInt    i;
+
+
+          if ( FT_NEW_ARRAY( temp, max_objects * 4 ) )
+            goto Exit;
+
+          for ( i = 0; i < 4; i++ )
+          {
+            result = ps_tofixedarray( &cur, limit, max_objects,
+                                      temp + i * max_objects, 0 );
+            if ( result < 0 )
+            {
+              FT_ERROR(( "ps_parser_load_field:"
+                         " expected %d integers in the %s subarray\n"
+                         "                     "
+                         " of /FontBBox in the /Blend dictionary\n",
+                         max_objects,
+                         i == 0 ? "first"
+                                : ( i == 1 ? "second"
+                                           : ( i == 2 ? "third"
+                                                      : "fourth" ) ) ));
+              error = FT_THROW( Invalid_File_Format );
+              goto Exit;
+            }
+
+            skip_spaces( &cur, limit );
+          }
+
+          for ( i = 0; i < max_objects; i++ )
+          {
+            FT_BBox*  bbox = (FT_BBox*)objects[i];
+
+
+            bbox->xMin = FT_RoundFix( temp[i                  ] );
+            bbox->yMin = FT_RoundFix( temp[i +     max_objects] );
+            bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] );
+            bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] );
+          }
+
+          FT_FREE( temp );
+        }
+        break;
+
+      default:
+        /* an error occurred */
+        goto Fail;
+      }
+    }
+
+#if 0  /* obsolete -- keep for reference */
+    if ( pflags )
+      *pflags |= 1L << field->flag_bit;
+#else
+    FT_UNUSED( pflags );
+#endif
+
+    error = FT_Err_Ok;
+
+  Exit:
+    return error;
+
+  Fail:
+    error = FT_THROW( Invalid_File_Format );
+    goto Exit;
+  }
+
+
+#define T1_MAX_TABLE_ELEMENTS  32
+
+
+  FT_LOCAL_DEF( FT_Error )
+  ps_parser_load_field_table( PS_Parser       parser,
+                              const T1_Field  field,
+                              void**          objects,
+                              FT_UInt         max_objects,
+                              FT_ULong*       pflags )
+  {
+    T1_TokenRec  elements[T1_MAX_TABLE_ELEMENTS];
+    T1_Token     token;
+    FT_Int       num_elements;
+    FT_Error     error = FT_Err_Ok;
+    FT_Byte*     old_cursor;
+    FT_Byte*     old_limit;
+    T1_FieldRec  fieldrec = *(T1_Field)field;
+
+
+    fieldrec.type = T1_FIELD_TYPE_INTEGER;
+    if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY ||
+         field->type == T1_FIELD_TYPE_BBOX        )
+      fieldrec.type = T1_FIELD_TYPE_FIXED;
+
+    ps_parser_to_token_array( parser, elements,
+                              T1_MAX_TABLE_ELEMENTS, &num_elements );
+    if ( num_elements < 0 )
+    {
+      error = FT_ERR( Ignore );
+      goto Exit;
+    }
+    if ( (FT_UInt)num_elements > field->array_max )
+      num_elements = field->array_max;
+
+    old_cursor = parser->cursor;
+    old_limit  = parser->limit;
+
+    /* we store the elements count if necessary;           */
+    /* we further assume that `count_offset' can't be zero */
+    if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 )
+      *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) =
+        (FT_Byte)num_elements;
+
+    /* we now load each element, adjusting the field.offset on each one */
+    token = elements;
+    for ( ; num_elements > 0; num_elements--, token++ )
+    {
+      parser->cursor = token->start;
+      parser->limit  = token->limit;
+      ps_parser_load_field( parser, &fieldrec, objects, max_objects, 0 );
+      fieldrec.offset += fieldrec.size;
+    }
+
+#if 0  /* obsolete -- keep for reference */
+    if ( pflags )
+      *pflags |= 1L << field->flag_bit;
+#else
+    FT_UNUSED( pflags );
+#endif
+
+    parser->cursor = old_cursor;
+    parser->limit  = old_limit;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Long )
+  ps_parser_to_int( PS_Parser  parser )
+  {
+    ps_parser_skip_spaces( parser );
+    return PS_Conv_ToInt( &parser->cursor, parser->limit );
+  }
+
+
+  /* first character must be `<' if `delimiters' is non-zero */
+
+  FT_LOCAL_DEF( FT_Error )
+  ps_parser_to_bytes( PS_Parser  parser,
+                      FT_Byte*   bytes,
+                      FT_Offset  max_bytes,
+                      FT_Long*   pnum_bytes,
+                      FT_Bool    delimiters )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_Byte*  cur;
+
+
+    ps_parser_skip_spaces( parser );
+    cur = parser->cursor;
+
+    if ( cur >= parser->limit )
+      goto Exit;
+
+    if ( delimiters )
+    {
+      if ( *cur != '<' )
+      {
+        FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      cur++;
+    }
+
+    *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur,
+                                          parser->limit,
+                                          bytes,
+                                          max_bytes );
+
+    if ( delimiters )
+    {
+      if ( cur < parser->limit && *cur != '>' )
+      {
+        FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      cur++;
+    }
+
+    parser->cursor = cur;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Fixed )
+  ps_parser_to_fixed( PS_Parser  parser,
+                      FT_Int     power_ten )
+  {
+    ps_parser_skip_spaces( parser );
+    return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten );
+  }
+
+
+  FT_LOCAL_DEF( FT_Int )
+  ps_parser_to_coord_array( PS_Parser  parser,
+                            FT_Int     max_coords,
+                            FT_Short*  coords )
+  {
+    ps_parser_skip_spaces( parser );
+    return ps_tocoordarray( &parser->cursor, parser->limit,
+                            max_coords, coords );
+  }
+
+
+  FT_LOCAL_DEF( FT_Int )
+  ps_parser_to_fixed_array( PS_Parser  parser,
+                            FT_Int     max_values,
+                            FT_Fixed*  values,
+                            FT_Int     power_ten )
+  {
+    ps_parser_skip_spaces( parser );
+    return ps_tofixedarray( &parser->cursor, parser->limit,
+                            max_values, values, power_ten );
+  }
+
+
+#if 0
+
+  FT_LOCAL_DEF( FT_String* )
+  T1_ToString( PS_Parser  parser )
+  {
+    return ps_tostring( &parser->cursor, parser->limit, parser->memory );
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  T1_ToBool( PS_Parser  parser )
+  {
+    return ps_tobool( &parser->cursor, parser->limit );
+  }
+
+#endif /* 0 */
+
+
+  FT_LOCAL_DEF( void )
+  ps_parser_init( PS_Parser  parser,
+                  FT_Byte*   base,
+                  FT_Byte*   limit,
+                  FT_Memory  memory )
+  {
+    parser->error  = FT_Err_Ok;
+    parser->base   = base;
+    parser->limit  = limit;
+    parser->cursor = base;
+    parser->memory = memory;
+    parser->funcs  = ps_parser_funcs;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ps_parser_done( PS_Parser  parser )
+  {
+    FT_UNUSED( parser );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            T1 BUILDER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    t1_builder_init                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given glyph builder.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    builder :: A pointer to the glyph builder to initialize.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: The current face object.                                */
+  /*                                                                       */
+  /*    size    :: The current size object.                                */
+  /*                                                                       */
+  /*    glyph   :: The current glyph object.                               */
+  /*                                                                       */
+  /*    hinting :: Whether hinting should be applied.                      */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  t1_builder_init( T1_Builder    builder,
+                   FT_Face       face,
+                   FT_Size       size,
+                   FT_GlyphSlot  glyph,
+                   FT_Bool       hinting )
+  {
+    builder->parse_state = T1_Parse_Start;
+    builder->load_points = 1;
+
+    builder->face   = face;
+    builder->glyph  = glyph;
+    builder->memory = face->memory;
+
+    if ( glyph )
+    {
+      FT_GlyphLoader  loader = glyph->internal->loader;
+
+
+      builder->loader  = loader;
+      builder->base    = &loader->base.outline;
+      builder->current = &loader->current.outline;
+      FT_GlyphLoader_Rewind( loader );
+
+      builder->hints_globals = size->internal;
+      builder->hints_funcs   = 0;
+
+      if ( hinting )
+        builder->hints_funcs = glyph->internal->glyph_hints;
+    }
+
+    builder->pos_x = 0;
+    builder->pos_y = 0;
+
+    builder->left_bearing.x = 0;
+    builder->left_bearing.y = 0;
+    builder->advance.x      = 0;
+    builder->advance.y      = 0;
+
+    builder->funcs = t1_builder_funcs;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    t1_builder_done                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a given glyph builder.  Its contents can still be used   */
+  /*    after the call, but the function saves important information       */
+  /*    within the corresponding glyph slot.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    builder :: A pointer to the glyph builder to finalize.             */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  t1_builder_done( T1_Builder  builder )
+  {
+    FT_GlyphSlot  glyph = builder->glyph;
+
+
+    if ( glyph )
+      glyph->outline = *builder->base;
+  }
+
+
+  /* check that there is enough space for `count' more points */
+  FT_LOCAL_DEF( FT_Error )
+  t1_builder_check_points( T1_Builder  builder,
+                           FT_Int      count )
+  {
+    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
+  }
+
+
+  /* add a new point, do not check space */
+  FT_LOCAL_DEF( void )
+  t1_builder_add_point( T1_Builder  builder,
+                        FT_Pos      x,
+                        FT_Pos      y,
+                        FT_Byte     flag )
+  {
+    FT_Outline*  outline = builder->current;
+
+
+    if ( builder->load_points )
+    {
+      FT_Vector*  point   = outline->points + outline->n_points;
+      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;
+
+
+      point->x = FIXED_TO_INT( x );
+      point->y = FIXED_TO_INT( y );
+      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
+    }
+    outline->n_points++;
+  }
+
+
+  /* check space for a new on-curve point, then add it */
+  FT_LOCAL_DEF( FT_Error )
+  t1_builder_add_point1( T1_Builder  builder,
+                         FT_Pos      x,
+                         FT_Pos      y )
+  {
+    FT_Error  error;
+
+
+    error = t1_builder_check_points( builder, 1 );
+    if ( !error )
+      t1_builder_add_point( builder, x, y, 1 );
+
+    return error;
+  }
+
+
+  /* check space for a new contour, then add it */
+  FT_LOCAL_DEF( FT_Error )
+  t1_builder_add_contour( T1_Builder  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Error     error;
+
+
+    /* this might happen in invalid fonts */
+    if ( !outline )
+    {
+      FT_ERROR(( "t1_builder_add_contour: no outline to add points to\n" ));
+      return FT_THROW( Invalid_File_Format );
+    }
+
+    if ( !builder->load_points )
+    {
+      outline->n_contours++;
+      return FT_Err_Ok;
+    }
+
+    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
+    if ( !error )
+    {
+      if ( outline->n_contours > 0 )
+        outline->contours[outline->n_contours - 1] =
+          (short)( outline->n_points - 1 );
+
+      outline->n_contours++;
+    }
+
+    return error;
+  }
+
+
+  /* if a path was begun, add its first on-curve point */
+  FT_LOCAL_DEF( FT_Error )
+  t1_builder_start_point( T1_Builder  builder,
+                          FT_Pos      x,
+                          FT_Pos      y )
+  {
+    FT_Error  error = FT_ERR( Invalid_File_Format );
+
+
+    /* test whether we are building a new contour */
+
+    if ( builder->parse_state == T1_Parse_Have_Path )
+      error = FT_Err_Ok;
+    else
+    {
+      builder->parse_state = T1_Parse_Have_Path;
+      error = t1_builder_add_contour( builder );
+      if ( !error )
+        error = t1_builder_add_point1( builder, x, y );
+    }
+
+    return error;
+  }
+
+
+  /* close the current contour */
+  FT_LOCAL_DEF( void )
+  t1_builder_close_contour( T1_Builder  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Int       first;
+
+
+    if ( !outline )
+      return;
+
+    first = outline->n_contours <= 1
+            ? 0 : outline->contours[outline->n_contours - 2] + 1;
+
+    /* We must not include the last point in the path if it */
+    /* is located on the first point.                       */
+    if ( outline->n_points > 1 )
+    {
+      FT_Vector*  p1      = outline->points + first;
+      FT_Vector*  p2      = outline->points + outline->n_points - 1;
+      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;
+
+
+      /* `delete' last point only if it coincides with the first */
+      /* point and it is not a control point (which can happen). */
+      if ( p1->x == p2->x && p1->y == p2->y )
+        if ( *control == FT_CURVE_TAG_ON )
+          outline->n_points--;
+    }
+
+    if ( outline->n_contours > 0 )
+    {
+      /* Don't add contours only consisting of one point, i.e.,  */
+      /* check whether the first and the last point is the same. */
+      if ( first == outline->n_points - 1 )
+      {
+        outline->n_contours--;
+        outline->n_points--;
+      }
+      else
+        outline->contours[outline->n_contours - 1] =
+          (short)( outline->n_points - 1 );
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            OTHER                              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  t1_decrypt( FT_Byte*   buffer,
+              FT_Offset  length,
+              FT_UShort  seed )
+  {
+    PS_Conv_EexecDecode( &buffer,
+                         buffer + length,
+                         buffer,
+                         length,
+                         &seed );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.h
new file mode 100644
index 0000000..cbb05ec
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.h
@@ -0,0 +1,212 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psobjs.h                                                               */
+/*                                                                         */
+/*    Auxiliary functions for PostScript fonts (specification).            */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSOBJS_H__
+#define __PSOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                             T1_TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_CALLBACK_TABLE
+  const PS_Table_FuncsRec    ps_table_funcs;
+
+  FT_CALLBACK_TABLE
+  const PS_Parser_FuncsRec   ps_parser_funcs;
+
+  FT_CALLBACK_TABLE
+  const T1_Builder_FuncsRec  t1_builder_funcs;
+
+
+  FT_LOCAL( FT_Error )
+  ps_table_new( PS_Table   table,
+                FT_Int     count,
+                FT_Memory  memory );
+
+  FT_LOCAL( FT_Error )
+  ps_table_add( PS_Table    table,
+                FT_Int      idx,
+                void*       object,
+                FT_PtrDist  length );
+
+  FT_LOCAL( void )
+  ps_table_done( PS_Table  table );
+
+
+  FT_LOCAL( void )
+  ps_table_release( PS_Table  table );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            T1 PARSER                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL( void )
+  ps_parser_skip_spaces( PS_Parser  parser );
+
+  FT_LOCAL( void )
+  ps_parser_skip_PS_token( PS_Parser  parser );
+
+  FT_LOCAL( void )
+  ps_parser_to_token( PS_Parser  parser,
+                      T1_Token   token );
+
+  FT_LOCAL( void )
+  ps_parser_to_token_array( PS_Parser  parser,
+                            T1_Token   tokens,
+                            FT_UInt    max_tokens,
+                            FT_Int*    pnum_tokens );
+
+  FT_LOCAL( FT_Error )
+  ps_parser_load_field( PS_Parser       parser,
+                        const T1_Field  field,
+                        void**          objects,
+                        FT_UInt         max_objects,
+                        FT_ULong*       pflags );
+
+  FT_LOCAL( FT_Error )
+  ps_parser_load_field_table( PS_Parser       parser,
+                              const T1_Field  field,
+                              void**          objects,
+                              FT_UInt         max_objects,
+                              FT_ULong*       pflags );
+
+  FT_LOCAL( FT_Long )
+  ps_parser_to_int( PS_Parser  parser );
+
+
+  FT_LOCAL( FT_Error )
+  ps_parser_to_bytes( PS_Parser  parser,
+                      FT_Byte*   bytes,
+                      FT_Offset  max_bytes,
+                      FT_Long*   pnum_bytes,
+                      FT_Bool    delimiters );
+
+
+  FT_LOCAL( FT_Fixed )
+  ps_parser_to_fixed( PS_Parser  parser,
+                      FT_Int     power_ten );
+
+
+  FT_LOCAL( FT_Int )
+  ps_parser_to_coord_array( PS_Parser  parser,
+                            FT_Int     max_coords,
+                            FT_Short*  coords );
+
+  FT_LOCAL( FT_Int )
+  ps_parser_to_fixed_array( PS_Parser  parser,
+                            FT_Int     max_values,
+                            FT_Fixed*  values,
+                            FT_Int     power_ten );
+
+
+  FT_LOCAL( void )
+  ps_parser_init( PS_Parser  parser,
+                  FT_Byte*   base,
+                  FT_Byte*   limit,
+                  FT_Memory  memory );
+
+  FT_LOCAL( void )
+  ps_parser_done( PS_Parser  parser );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            T1 BUILDER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  t1_builder_init( T1_Builder    builder,
+                   FT_Face       face,
+                   FT_Size       size,
+                   FT_GlyphSlot  glyph,
+                   FT_Bool       hinting );
+
+  FT_LOCAL( void )
+  t1_builder_done( T1_Builder  builder );
+
+  FT_LOCAL( FT_Error )
+  t1_builder_check_points( T1_Builder  builder,
+                           FT_Int      count );
+
+  FT_LOCAL( void )
+  t1_builder_add_point( T1_Builder  builder,
+                        FT_Pos      x,
+                        FT_Pos      y,
+                        FT_Byte     flag );
+
+  FT_LOCAL( FT_Error )
+  t1_builder_add_point1( T1_Builder  builder,
+                         FT_Pos      x,
+                         FT_Pos      y );
+
+  FT_LOCAL( FT_Error )
+  t1_builder_add_contour( T1_Builder  builder );
+
+
+  FT_LOCAL( FT_Error )
+  t1_builder_start_point( T1_Builder  builder,
+                          FT_Pos      x,
+                          FT_Pos      y );
+
+
+  FT_LOCAL( void )
+  t1_builder_close_contour( T1_Builder  builder );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            OTHER                              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  t1_decrypt( FT_Byte*   buffer,
+              FT_Offset  length,
+              FT_UShort  seed );
+
+
+FT_END_HEADER
+
+#endif /* __PSOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/rules.mk
new file mode 100644
index 0000000..7a1be37
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/rules.mk
@@ -0,0 +1,73 @@
+#
+# FreeType 2 PSaux driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2002, 2003, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# PSAUX driver directory
+#
+PSAUX_DIR := $(SRC_DIR)/psaux
+
+
+# compilation flags for the driver
+#
+PSAUX_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSAUX_DIR))
+
+
+# PSAUX driver sources (i.e., C files)
+#
+PSAUX_DRV_SRC := $(PSAUX_DIR)/psobjs.c   \
+                 $(PSAUX_DIR)/t1decode.c \
+                 $(PSAUX_DIR)/t1cmap.c   \
+                 $(PSAUX_DIR)/afmparse.c \
+                 $(PSAUX_DIR)/psconv.c   \
+                 $(PSAUX_DIR)/psauxmod.c
+
+# PSAUX driver headers
+#
+PSAUX_DRV_H := $(PSAUX_DRV_SRC:%c=%h)  \
+               $(PSAUX_DIR)/psauxerr.h
+
+
+# PSAUX driver object(s)
+#
+#   PSAUX_DRV_OBJ_M is used during `multi' builds.
+#   PSAUX_DRV_OBJ_S is used during `single' builds.
+#
+PSAUX_DRV_OBJ_M := $(PSAUX_DRV_SRC:$(PSAUX_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PSAUX_DRV_OBJ_S := $(OBJ_DIR)/psaux.$O
+
+# PSAUX driver source file for single build
+#
+PSAUX_DRV_SRC_S := $(PSAUX_DIR)/psaux.c
+
+
+# PSAUX driver - single object
+#
+$(PSAUX_DRV_OBJ_S): $(PSAUX_DRV_SRC_S) $(PSAUX_DRV_SRC) \
+                   $(FREETYPE_H) $(PSAUX_DRV_H)
+	$(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSAUX_DRV_SRC_S))
+
+
+# PSAUX driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PSAUX_DIR)/%.c $(FREETYPE_H) $(PSAUX_DRV_H)
+	$(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PSAUX_DRV_OBJ_S)
+DRV_OBJS_M += $(PSAUX_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.c
new file mode 100644
index 0000000..4070306
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.c
@@ -0,0 +1,341 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1cmap.c                                                               */
+/*                                                                         */
+/*    Type 1 character map support (body).                                 */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2006, 2007, 2012 by                              */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "t1cmap.h"
+
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "psauxerr.h"
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  t1_cmap_std_init( T1_CMapStd  cmap,
+                    FT_Int      is_expert )
+  {
+    T1_Face             face    = (T1_Face)FT_CMAP_FACE( cmap );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+    cmap->num_glyphs    = face->type1.num_glyphs;
+    cmap->glyph_names   = (const char* const*)face->type1.glyph_names;
+    cmap->sid_to_string = psnames->adobe_std_strings;
+    cmap->code_to_sid   = is_expert ? psnames->adobe_expert_encoding
+                                    : psnames->adobe_std_encoding;
+
+    FT_ASSERT( cmap->code_to_sid != NULL );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  t1_cmap_std_done( T1_CMapStd  cmap )
+  {
+    cmap->num_glyphs    = 0;
+    cmap->glyph_names   = NULL;
+    cmap->sid_to_string = NULL;
+    cmap->code_to_sid   = NULL;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  t1_cmap_std_char_index( T1_CMapStd  cmap,
+                          FT_UInt32   char_code )
+  {
+    FT_UInt  result = 0;
+
+
+    if ( char_code < 256 )
+    {
+      FT_UInt      code, n;
+      const char*  glyph_name;
+
+
+      /* convert character code to Adobe SID string */
+      code       = cmap->code_to_sid[char_code];
+      glyph_name = cmap->sid_to_string( code );
+
+      /* look for the corresponding glyph name */
+      for ( n = 0; n < cmap->num_glyphs; n++ )
+      {
+        const char* gname = cmap->glyph_names[n];
+
+
+        if ( gname && gname[0] == glyph_name[0]  &&
+             ft_strcmp( gname, glyph_name ) == 0 )
+        {
+          result = n;
+          break;
+        }
+      }
+    }
+
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  t1_cmap_std_char_next( T1_CMapStd   cmap,
+                         FT_UInt32   *pchar_code )
+  {
+    FT_UInt    result    = 0;
+    FT_UInt32  char_code = *pchar_code + 1;
+
+
+    while ( char_code < 256 )
+    {
+      result = t1_cmap_std_char_index( cmap, char_code );
+      if ( result != 0 )
+        goto Exit;
+
+      char_code++;
+    }
+    char_code = 0;
+
+  Exit:
+    *pchar_code = char_code;
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  t1_cmap_standard_init( T1_CMapStd  cmap )
+  {
+    t1_cmap_std_init( cmap, 0 );
+    return 0;
+  }
+
+
+  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+  t1_cmap_standard_class_rec =
+  {
+    sizeof ( T1_CMapStdRec ),
+
+    (FT_CMap_InitFunc)     t1_cmap_standard_init,
+    (FT_CMap_DoneFunc)     t1_cmap_std_done,
+    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
+    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  };
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  t1_cmap_expert_init( T1_CMapStd  cmap )
+  {
+    t1_cmap_std_init( cmap, 1 );
+    return 0;
+  }
+
+  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+  t1_cmap_expert_class_rec =
+  {
+    sizeof ( T1_CMapStdRec ),
+
+    (FT_CMap_InitFunc)     t1_cmap_expert_init,
+    (FT_CMap_DoneFunc)     t1_cmap_std_done,
+    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
+    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  };
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    TYPE1 CUSTOM ENCODING CMAP                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  t1_cmap_custom_init( T1_CMapCustom  cmap )
+  {
+    T1_Face      face     = (T1_Face)FT_CMAP_FACE( cmap );
+    T1_Encoding  encoding = &face->type1.encoding;
+
+
+    cmap->first   = encoding->code_first;
+    cmap->count   = (FT_UInt)( encoding->code_last - cmap->first );
+    cmap->indices = encoding->char_index;
+
+    FT_ASSERT( cmap->indices != NULL );
+    FT_ASSERT( encoding->code_first <= encoding->code_last );
+
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  t1_cmap_custom_done( T1_CMapCustom  cmap )
+  {
+    cmap->indices = NULL;
+    cmap->first   = 0;
+    cmap->count   = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  t1_cmap_custom_char_index( T1_CMapCustom  cmap,
+                             FT_UInt32      char_code )
+  {
+    FT_UInt    result = 0;
+
+
+    if ( ( char_code >= cmap->first )                  &&
+         ( char_code < ( cmap->first + cmap->count ) ) )
+      result = cmap->indices[char_code];
+
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  t1_cmap_custom_char_next( T1_CMapCustom  cmap,
+                            FT_UInt32     *pchar_code )
+  {
+    FT_UInt    result = 0;
+    FT_UInt32  char_code = *pchar_code;
+
+
+    ++char_code;
+
+    if ( char_code < cmap->first )
+      char_code = cmap->first;
+
+    for ( ; char_code < ( cmap->first + cmap->count ); char_code++ )
+    {
+      result = cmap->indices[char_code];
+      if ( result != 0 )
+        goto Exit;
+    }
+
+    char_code = 0;
+
+  Exit:
+    *pchar_code = char_code;
+    return result;
+  }
+
+
+  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+  t1_cmap_custom_class_rec =
+  {
+    sizeof ( T1_CMapCustomRec ),
+
+    (FT_CMap_InitFunc)     t1_cmap_custom_init,
+    (FT_CMap_DoneFunc)     t1_cmap_custom_done,
+    (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index,
+    (FT_CMap_CharNextFunc) t1_cmap_custom_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  };
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****            TYPE1 SYNTHETIC UNICODE ENCODING CMAP              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_CALLBACK_DEF( const char * )
+  psaux_get_glyph_name( T1_Face  face,
+                        FT_UInt  idx )
+  {
+    return face->type1.glyph_names[idx];
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  t1_cmap_unicode_init( PS_Unicodes  unicodes )
+  {
+    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
+    FT_Memory           memory  = FT_FACE_MEMORY( face );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+    return psnames->unicodes_init( memory,
+                                   unicodes,
+                                   face->type1.num_glyphs,
+                                   (PS_GetGlyphNameFunc)&psaux_get_glyph_name,
+                                   (PS_FreeGlyphNameFunc)NULL,
+                                   (FT_Pointer)face );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  t1_cmap_unicode_done( PS_Unicodes  unicodes )
+  {
+    FT_Face    face   = FT_CMAP_FACE( unicodes );
+    FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+    FT_FREE( unicodes->maps );
+    unicodes->num_maps = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  t1_cmap_unicode_char_index( PS_Unicodes  unicodes,
+                              FT_UInt32    char_code )
+  {
+    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+    return psnames->unicodes_char_index( unicodes, char_code );
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  t1_cmap_unicode_char_next( PS_Unicodes  unicodes,
+                             FT_UInt32   *pchar_code )
+  {
+    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+    return psnames->unicodes_char_next( unicodes, pchar_code );
+  }
+
+
+  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+  t1_cmap_unicode_class_rec =
+  {
+    sizeof ( PS_UnicodesRec ),
+
+    (FT_CMap_InitFunc)     t1_cmap_unicode_init,
+    (FT_CMap_DoneFunc)     t1_cmap_unicode_done,
+    (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index,
+    (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  };
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.h
new file mode 100644
index 0000000..c32e0eb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.h
@@ -0,0 +1,105 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1cmap.h                                                               */
+/*                                                                         */
+/*    Type 1 character map support (specification).                        */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2006 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1CMAP_H__
+#define __T1CMAP_H__
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/t1types.h"
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* standard (and expert) encoding cmaps */
+  typedef struct T1_CMapStdRec_*  T1_CMapStd;
+
+  typedef struct  T1_CMapStdRec_
+  {
+    FT_CMapRec                cmap;
+
+    const FT_UShort*          code_to_sid;
+    PS_Adobe_Std_StringsFunc  sid_to_string;
+
+    FT_UInt                   num_glyphs;
+    const char* const*        glyph_names;
+
+  } T1_CMapStdRec;
+
+
+  FT_CALLBACK_TABLE const FT_CMap_ClassRec
+  t1_cmap_standard_class_rec;
+
+  FT_CALLBACK_TABLE const FT_CMap_ClassRec
+  t1_cmap_expert_class_rec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  TYPE1 CUSTOM ENCODING CMAP                   *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct T1_CMapCustomRec_*  T1_CMapCustom;
+
+  typedef struct  T1_CMapCustomRec_
+  {
+    FT_CMapRec  cmap;
+    FT_UInt     first;
+    FT_UInt     count;
+    FT_UShort*  indices;
+
+  } T1_CMapCustomRec;
+
+
+  FT_CALLBACK_TABLE const FT_CMap_ClassRec
+  t1_cmap_custom_class_rec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****             TYPE1 SYNTHETIC UNICODE ENCODING CMAP             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* unicode (synthetic) cmaps */
+
+  FT_CALLBACK_TABLE const FT_CMap_ClassRec
+  t1_cmap_unicode_class_rec;
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __T1CMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.c
new file mode 100644
index 0000000..abf1d74
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.c
@@ -0,0 +1,1620 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1decode.c                                                             */
+/*                                                                         */
+/*    PostScript Type 1 decoding routines (body).                          */
+/*                                                                         */
+/*  Copyright 2000-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/pshints.h"
+#include "../../include/freetype/ftoutln.h"
+
+#include "t1decode.h"
+#include "psobjs.h"
+
+#include "psauxerr.h"
+
+/* ensure proper sign extension */
+#define Fix2Int( f )  ( (FT_Int)(FT_Short)( (f) >> 16 ) )
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1decode
+
+
+  typedef enum  T1_Operator_
+  {
+    op_none = 0,
+    op_endchar,
+    op_hsbw,
+    op_seac,
+    op_sbw,
+    op_closepath,
+    op_hlineto,
+    op_hmoveto,
+    op_hvcurveto,
+    op_rlineto,
+    op_rmoveto,
+    op_rrcurveto,
+    op_vhcurveto,
+    op_vlineto,
+    op_vmoveto,
+    op_dotsection,
+    op_hstem,
+    op_hstem3,
+    op_vstem,
+    op_vstem3,
+    op_div,
+    op_callothersubr,
+    op_callsubr,
+    op_pop,
+    op_return,
+    op_setcurrentpoint,
+    op_unknown15,
+
+    op_max    /* never remove this one */
+
+  } T1_Operator;
+
+
+  static
+  const FT_Int  t1_args_count[op_max] =
+  {
+    0, /* none */
+    0, /* endchar */
+    2, /* hsbw */
+    5, /* seac */
+    4, /* sbw */
+    0, /* closepath */
+    1, /* hlineto */
+    1, /* hmoveto */
+    4, /* hvcurveto */
+    2, /* rlineto */
+    2, /* rmoveto */
+    6, /* rrcurveto */
+    4, /* vhcurveto */
+    1, /* vlineto */
+    1, /* vmoveto */
+    0, /* dotsection */
+    2, /* hstem */
+    6, /* hstem3 */
+    2, /* vstem */
+    6, /* vstem3 */
+    2, /* div */
+   -1, /* callothersubr */
+    1, /* callsubr */
+    0, /* pop */
+    0, /* return */
+    2, /* setcurrentpoint */
+    2  /* opcode 15 (undocumented and obsolete) */
+  };
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    t1_lookup_glyph_by_stdcharcode                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Looks up a given glyph by its StandardEncoding charcode.  Used to  */
+  /*    implement the SEAC Type 1 operator.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: The current face object.                               */
+  /*                                                                       */
+  /*    charcode :: The character code to look for.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A glyph index in the font face.  Returns -1 if the corresponding   */
+  /*    glyph wasn't found.                                                */
+  /*                                                                       */
+  static FT_Int
+  t1_lookup_glyph_by_stdcharcode( T1_Decoder  decoder,
+                                  FT_Int      charcode )
+  {
+    FT_UInt             n;
+    const FT_String*    glyph_name;
+    FT_Service_PsCMaps  psnames = decoder->psnames;
+
+
+    /* check range of standard char code */
+    if ( charcode < 0 || charcode > 255 )
+      return -1;
+
+    glyph_name = psnames->adobe_std_strings(
+                   psnames->adobe_std_encoding[charcode]);
+
+    for ( n = 0; n < decoder->num_glyphs; n++ )
+    {
+      FT_String*  name = (FT_String*)decoder->glyph_names[n];
+
+
+      if ( name                               &&
+           name[0] == glyph_name[0]           &&
+           ft_strcmp( name, glyph_name ) == 0 )
+        return n;
+    }
+
+    return -1;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    t1operator_seac                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Implements the `seac' Type 1 operator for a Type 1 decoder.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    decoder :: The current CID decoder.                                */
+  /*                                                                       */
+  /*    asb     :: The accent's side bearing.                              */
+  /*                                                                       */
+  /*    adx     :: The horizontal offset of the accent.                    */
+  /*                                                                       */
+  /*    ady     :: The vertical offset of the accent.                      */
+  /*                                                                       */
+  /*    bchar   :: The base character's StandardEncoding charcode.         */
+  /*                                                                       */
+  /*    achar   :: The accent character's StandardEncoding charcode.       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  t1operator_seac( T1_Decoder  decoder,
+                   FT_Pos      asb,
+                   FT_Pos      adx,
+                   FT_Pos      ady,
+                   FT_Int      bchar,
+                   FT_Int      achar )
+  {
+    FT_Error     error;
+    FT_Int       bchar_index, achar_index;
+#if 0
+    FT_Int       n_base_points;
+    FT_Outline*  base = decoder->builder.base;
+#endif
+    FT_Vector    left_bearing, advance;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    T1_Face      face  = (T1_Face)decoder->builder.face;
+#endif
+
+
+    if ( decoder->seac )
+    {
+      FT_ERROR(( "t1operator_seac: invalid nested seac\n" ));
+      return FT_THROW( Syntax_Error );
+    }
+
+    if ( decoder->builder.metrics_only )
+    {
+      FT_ERROR(( "t1operator_seac: unexpected seac\n" ));
+      return FT_THROW( Syntax_Error );
+    }
+
+    /* seac weirdness */
+    adx += decoder->builder.left_bearing.x;
+
+    /* `glyph_names' is set to 0 for CID fonts which do not */
+    /* include an encoding.  How can we deal with these?    */
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( decoder->glyph_names == 0                   &&
+         !face->root.internal->incremental_interface )
+#else
+    if ( decoder->glyph_names == 0 )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+    {
+      FT_ERROR(( "t1operator_seac:"
+                 " glyph names table not available in this font\n" ));
+      return FT_THROW( Syntax_Error );
+    }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( face->root.internal->incremental_interface )
+    {
+      /* the caller must handle the font encoding also */
+      bchar_index = bchar;
+      achar_index = achar;
+    }
+    else
+#endif
+    {
+      bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar );
+      achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar );
+    }
+
+    if ( bchar_index < 0 || achar_index < 0 )
+    {
+      FT_ERROR(( "t1operator_seac:"
+                 " invalid seac character code arguments\n" ));
+      return FT_THROW( Syntax_Error );
+    }
+
+    /* if we are trying to load a composite glyph, do not load the */
+    /* accent character and return the array of subglyphs.         */
+    if ( decoder->builder.no_recurse )
+    {
+      FT_GlyphSlot    glyph  = (FT_GlyphSlot)decoder->builder.glyph;
+      FT_GlyphLoader  loader = glyph->internal->loader;
+      FT_SubGlyph     subg;
+
+
+      /* reallocate subglyph array if necessary */
+      error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
+      if ( error )
+        goto Exit;
+
+      subg = loader->current.subglyphs;
+
+      /* subglyph 0 = base character */
+      subg->index = bchar_index;
+      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
+                    FT_SUBGLYPH_FLAG_USE_MY_METRICS;
+      subg->arg1  = 0;
+      subg->arg2  = 0;
+      subg++;
+
+      /* subglyph 1 = accent character */
+      subg->index = achar_index;
+      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
+      subg->arg1  = (FT_Int)FIXED_TO_INT( adx - asb );
+      subg->arg2  = (FT_Int)FIXED_TO_INT( ady );
+
+      /* set up remaining glyph fields */
+      glyph->num_subglyphs = 2;
+      glyph->subglyphs     = loader->base.subglyphs;
+      glyph->format        = FT_GLYPH_FORMAT_COMPOSITE;
+
+      loader->current.num_subglyphs = 2;
+      goto Exit;
+    }
+
+    /* First load `bchar' in builder */
+    /* now load the unscaled outline */
+
+    FT_GlyphLoader_Prepare( decoder->builder.loader );  /* prepare loader */
+
+    /* the seac operator must not be nested */
+    decoder->seac = TRUE;
+    error = t1_decoder_parse_glyph( decoder, bchar_index );
+    decoder->seac = FALSE;
+    if ( error )
+      goto Exit;
+
+    /* save the left bearing and width of the base character */
+    /* as they will be erased by the next load.              */
+
+    left_bearing = decoder->builder.left_bearing;
+    advance      = decoder->builder.advance;
+
+    decoder->builder.left_bearing.x = 0;
+    decoder->builder.left_bearing.y = 0;
+
+    decoder->builder.pos_x = adx - asb;
+    decoder->builder.pos_y = ady;
+
+    /* Now load `achar' on top of */
+    /* the base outline           */
+
+    /* the seac operator must not be nested */
+    decoder->seac = TRUE;
+    error = t1_decoder_parse_glyph( decoder, achar_index );
+    decoder->seac = FALSE;
+    if ( error )
+      goto Exit;
+
+    /* restore the left side bearing and   */
+    /* advance width of the base character */
+
+    decoder->builder.left_bearing = left_bearing;
+    decoder->builder.advance      = advance;
+
+    decoder->builder.pos_x = 0;
+    decoder->builder.pos_y = 0;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    t1_decoder_parse_charstrings                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parses a given Type 1 charstrings program.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    decoder         :: The current Type 1 decoder.                     */
+  /*                                                                       */
+  /*    charstring_base :: The base address of the charstring stream.      */
+  /*                                                                       */
+  /*    charstring_len  :: The length in bytes of the charstring stream.   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  t1_decoder_parse_charstrings( T1_Decoder  decoder,
+                                FT_Byte*    charstring_base,
+                                FT_UInt     charstring_len )
+  {
+    FT_Error         error;
+    T1_Decoder_Zone  zone;
+    FT_Byte*         ip;
+    FT_Byte*         limit;
+    T1_Builder       builder = &decoder->builder;
+    FT_Pos           x, y, orig_x, orig_y;
+    FT_Int           known_othersubr_result_cnt   = 0;
+    FT_Int           unknown_othersubr_result_cnt = 0;
+    FT_Bool          large_int;
+    FT_Fixed         seed;
+
+    T1_Hints_Funcs   hinter;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    FT_Bool          bol = TRUE;
+#endif
+
+
+    /* compute random seed from stack address of parameter */
+    seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed              ^
+                         (FT_PtrDist)(char*)&decoder           ^
+                         (FT_PtrDist)(char*)&charstring_base ) &
+                         FT_ULONG_MAX ) ;
+    seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;
+    if ( seed == 0 )
+      seed = 0x7384;
+
+    /* First of all, initialize the decoder */
+    decoder->top  = decoder->stack;
+    decoder->zone = decoder->zones;
+    zone          = decoder->zones;
+
+    builder->parse_state = T1_Parse_Start;
+
+    hinter = (T1_Hints_Funcs)builder->hints_funcs;
+
+    /* a font that reads BuildCharArray without setting */
+    /* its values first is buggy, but ...               */
+    FT_ASSERT( ( decoder->len_buildchar == 0 ) ==
+               ( decoder->buildchar == NULL )  );
+
+    if ( decoder->buildchar && decoder->len_buildchar > 0 )
+      ft_memset( &decoder->buildchar[0],
+                 0,
+                 sizeof ( decoder->buildchar[0] ) * decoder->len_buildchar );
+
+    FT_TRACE4(( "\n"
+                "Start charstring\n" ));
+
+    zone->base           = charstring_base;
+    limit = zone->limit  = charstring_base + charstring_len;
+    ip    = zone->cursor = zone->base;
+
+    error = FT_Err_Ok;
+
+    x = orig_x = builder->pos_x;
+    y = orig_y = builder->pos_y;
+
+    /* begin hints recording session, if any */
+    if ( hinter )
+      hinter->open( hinter->hints );
+
+    large_int = FALSE;
+
+    /* now, execute loop */
+    while ( ip < limit )
+    {
+      FT_Long*     top   = decoder->top;
+      T1_Operator  op    = op_none;
+      FT_Int32     value = 0;
+
+
+      FT_ASSERT( known_othersubr_result_cnt == 0   ||
+                 unknown_othersubr_result_cnt == 0 );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+      if ( bol )
+      {
+        FT_TRACE5(( " (%d)", decoder->top - decoder->stack ));
+        bol = FALSE;
+      }
+#endif
+
+      /*********************************************************************/
+      /*                                                                   */
+      /* Decode operator or operand                                        */
+      /*                                                                   */
+      /*                                                                   */
+
+      /* first of all, decompress operator or value */
+      switch ( *ip++ )
+      {
+      case 1:
+        op = op_hstem;
+        break;
+
+      case 3:
+        op = op_vstem;
+        break;
+      case 4:
+        op = op_vmoveto;
+        break;
+      case 5:
+        op = op_rlineto;
+        break;
+      case 6:
+        op = op_hlineto;
+        break;
+      case 7:
+        op = op_vlineto;
+        break;
+      case 8:
+        op = op_rrcurveto;
+        break;
+      case 9:
+        op = op_closepath;
+        break;
+      case 10:
+        op = op_callsubr;
+        break;
+      case 11:
+        op = op_return;
+        break;
+
+      case 13:
+        op = op_hsbw;
+        break;
+      case 14:
+        op = op_endchar;
+        break;
+
+      case 15:          /* undocumented, obsolete operator */
+        op = op_unknown15;
+        break;
+
+      case 21:
+        op = op_rmoveto;
+        break;
+      case 22:
+        op = op_hmoveto;
+        break;
+
+      case 30:
+        op = op_vhcurveto;
+        break;
+      case 31:
+        op = op_hvcurveto;
+        break;
+
+      case 12:
+        if ( ip > limit )
+        {
+          FT_ERROR(( "t1_decoder_parse_charstrings:"
+                     " invalid escape (12+EOF)\n" ));
+          goto Syntax_Error;
+        }
+
+        switch ( *ip++ )
+        {
+        case 0:
+          op = op_dotsection;
+          break;
+        case 1:
+          op = op_vstem3;
+          break;
+        case 2:
+          op = op_hstem3;
+          break;
+        case 6:
+          op = op_seac;
+          break;
+        case 7:
+          op = op_sbw;
+          break;
+        case 12:
+          op = op_div;
+          break;
+        case 16:
+          op = op_callothersubr;
+          break;
+        case 17:
+          op = op_pop;
+          break;
+        case 33:
+          op = op_setcurrentpoint;
+          break;
+
+        default:
+          FT_ERROR(( "t1_decoder_parse_charstrings:"
+                     " invalid escape (12+%d)\n",
+                     ip[-1] ));
+          goto Syntax_Error;
+        }
+        break;
+
+      case 255:    /* four bytes integer */
+        if ( ip + 4 > limit )
+        {
+          FT_ERROR(( "t1_decoder_parse_charstrings:"
+                     " unexpected EOF in integer\n" ));
+          goto Syntax_Error;
+        }
+
+        value = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |
+                            ( (FT_UInt32)ip[1] << 16 ) |
+                            ( (FT_UInt32)ip[2] << 8  ) |
+                              (FT_UInt32)ip[3]         );
+        ip += 4;
+
+        /* According to the specification, values > 32000 or < -32000 must */
+        /* be followed by a `div' operator to make the result be in the    */
+        /* range [-32000;32000].  We expect that the second argument of    */
+        /* `div' is not a large number.  Additionally, we don't handle     */
+        /* stuff like `<large1> <large2> <num> div <num> div' or           */
+        /* <large1> <large2> <num> div div'.  This is probably not allowed */
+        /* anyway.                                                         */
+        if ( value > 32000 || value < -32000 )
+        {
+          if ( large_int )
+          {
+            FT_ERROR(( "t1_decoder_parse_charstrings:"
+                       " no `div' after large integer\n" ));
+          }
+          else
+            large_int = TRUE;
+        }
+        else
+        {
+          if ( !large_int )
+            value = (FT_Int32)( (FT_UInt32)value << 16 );
+        }
+
+        break;
+
+      default:
+        if ( ip[-1] >= 32 )
+        {
+          if ( ip[-1] < 247 )
+            value = (FT_Int32)ip[-1] - 139;
+          else
+          {
+            if ( ++ip > limit )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " unexpected EOF in integer\n" ));
+              goto Syntax_Error;
+            }
+
+            if ( ip[-2] < 251 )
+              value =    ( ( ip[-2] - 247 ) * 256 ) + ip[-1] + 108;
+            else
+              value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 );
+          }
+
+          if ( !large_int )
+            value = (FT_Int32)( (FT_UInt32)value << 16 );
+        }
+        else
+        {
+          FT_ERROR(( "t1_decoder_parse_charstrings:"
+                     " invalid byte (%d)\n", ip[-1] ));
+          goto Syntax_Error;
+        }
+      }
+
+      if ( unknown_othersubr_result_cnt > 0 )
+      {
+        switch ( op )
+        {
+        case op_callsubr:
+        case op_return:
+        case op_none:
+        case op_pop:
+          break;
+
+        default:
+          /* all operands have been transferred by previous pops */
+          unknown_othersubr_result_cnt = 0;
+          break;
+        }
+      }
+
+      if ( large_int && !( op == op_none || op == op_div ) )
+      {
+        FT_ERROR(( "t1_decoder_parse_charstrings:"
+                   " no `div' after large integer\n" ));
+
+        large_int = FALSE;
+      }
+
+      /*********************************************************************/
+      /*                                                                   */
+      /*  Push value on stack, or process operator                         */
+      /*                                                                   */
+      /*                                                                   */
+      if ( op == op_none )
+      {
+        if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS )
+        {
+          FT_ERROR(( "t1_decoder_parse_charstrings: stack overflow\n" ));
+          goto Syntax_Error;
+        }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        if ( large_int )
+          FT_TRACE4(( " %ld", value ));
+        else
+          FT_TRACE4(( " %ld", Fix2Int( value ) ));
+#endif
+
+        *top++       = value;
+        decoder->top = top;
+      }
+      else if ( op == op_callothersubr )  /* callothersubr */
+      {
+        FT_Int  subr_no;
+        FT_Int  arg_cnt;
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        FT_TRACE4(( " callothersubr\n" ));
+        bol = TRUE;
+#endif
+
+        if ( top - decoder->stack < 2 )
+          goto Stack_Underflow;
+
+        top -= 2;
+
+        subr_no = Fix2Int( top[1] );
+        arg_cnt = Fix2Int( top[0] );
+
+        /***********************************************************/
+        /*                                                         */
+        /* remove all operands to callothersubr from the stack     */
+        /*                                                         */
+        /* for handled othersubrs, where we know the number of     */
+        /* arguments, we increase the stack by the value of        */
+        /* known_othersubr_result_cnt                              */
+        /*                                                         */
+        /* for unhandled othersubrs the following pops adjust the  */
+        /* stack pointer as necessary                              */
+
+        if ( arg_cnt > top - decoder->stack )
+          goto Stack_Underflow;
+
+        top -= arg_cnt;
+
+        known_othersubr_result_cnt   = 0;
+        unknown_othersubr_result_cnt = 0;
+
+        /* XXX TODO: The checks to `arg_count == <whatever>'       */
+        /* might not be correct; an othersubr expects a certain    */
+        /* number of operands on the PostScript stack (as opposed  */
+        /* to the T1 stack) but it doesn't have to put them there  */
+        /* by itself; previous othersubrs might have left the      */
+        /* operands there if they were not followed by an          */
+        /* appropriate number of pops                              */
+        /*                                                         */
+        /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */
+        /* accept a font that contains charstrings like            */
+        /*                                                         */
+        /*     100 200 2 20 callothersubr                          */
+        /*     300 1 20 callothersubr pop                          */
+        /*                                                         */
+        /* Perhaps this is the reason why BuildCharArray exists.   */
+
+        switch ( subr_no )
+        {
+        case 0:                     /* end flex feature */
+          if ( arg_cnt != 3 )
+            goto Unexpected_OtherSubr;
+
+          if ( decoder->flex_state       == 0 ||
+               decoder->num_flex_vectors != 7 )
+          {
+            FT_ERROR(( "t1_decoder_parse_charstrings:"
+                       " unexpected flex end\n" ));
+            goto Syntax_Error;
+          }
+
+          /* the two `results' are popped by the following setcurrentpoint */
+          top[0] = x;
+          top[1] = y;
+          known_othersubr_result_cnt = 2;
+          break;
+
+        case 1:                     /* start flex feature */
+          if ( arg_cnt != 0 )
+            goto Unexpected_OtherSubr;
+
+          decoder->flex_state        = 1;
+          decoder->num_flex_vectors  = 0;
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != FT_Err_Ok                                   ||
+               ( error = t1_builder_check_points( builder, 6 ) )
+                 != FT_Err_Ok                                   )
+            goto Fail;
+          break;
+
+        case 2:                     /* add flex vectors */
+          {
+            FT_Int  idx;
+
+
+            if ( arg_cnt != 0 )
+              goto Unexpected_OtherSubr;
+
+            if ( decoder->flex_state == 0 )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " missing flex start\n" ));
+              goto Syntax_Error;
+            }
+
+            /* note that we should not add a point for index 0; */
+            /* this will move our current position to the flex  */
+            /* point without adding any point to the outline    */
+            idx = decoder->num_flex_vectors++;
+            if ( idx > 0 && idx < 7 )
+              t1_builder_add_point( builder,
+                                    x,
+                                    y,
+                                    (FT_Byte)( idx == 3 || idx == 6 ) );
+          }
+          break;
+
+        case 3:                     /* change hints */
+          if ( arg_cnt != 1 )
+            goto Unexpected_OtherSubr;
+
+          known_othersubr_result_cnt = 1;
+
+          if ( hinter )
+            hinter->reset( hinter->hints, builder->current->n_points );
+          break;
+
+        case 12:
+        case 13:
+          /* counter control hints, clear stack */
+          top = decoder->stack;
+          break;
+
+        case 14:
+        case 15:
+        case 16:
+        case 17:
+        case 18:                    /* multiple masters */
+          {
+            PS_Blend  blend = decoder->blend;
+            FT_UInt   num_points, nn, mm;
+            FT_Long*  delta;
+            FT_Long*  values;
+
+
+            if ( !blend )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " unexpected multiple masters operator\n" ));
+              goto Syntax_Error;
+            }
+
+            num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 );
+            if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " incorrect number of multiple masters arguments\n" ));
+              goto Syntax_Error;
+            }
+
+            /* We want to compute                                    */
+            /*                                                       */
+            /*   a0*w0 + a1*w1 + ... + ak*wk                         */
+            /*                                                       */
+            /* but we only have a0, a1-a0, a2-a0, ..., ak-a0.        */
+            /*                                                       */
+            /* However, given that w0 + w1 + ... + wk == 1, we can   */
+            /* rewrite it easily as                                  */
+            /*                                                       */
+            /*   a0 + (a1-a0)*w1 + (a2-a0)*w2 + ... + (ak-a0)*wk     */
+            /*                                                       */
+            /* where k == num_designs-1.                             */
+            /*                                                       */
+            /* I guess that's why it's written in this `compact'     */
+            /* form.                                                 */
+            /*                                                       */
+            delta  = top + num_points;
+            values = top;
+            for ( nn = 0; nn < num_points; nn++ )
+            {
+              FT_Long  tmp = values[0];
+
+
+              for ( mm = 1; mm < blend->num_designs; mm++ )
+                tmp += FT_MulFix( *delta++, blend->weight_vector[mm] );
+
+              *values++ = tmp;
+            }
+
+            known_othersubr_result_cnt = num_points;
+            break;
+          }
+
+        case 19:
+          /* <idx> 1 19 callothersubr                             */
+          /* => replace elements starting from index cvi( <idx> ) */
+          /*    of BuildCharArray with WeightVector               */
+          {
+            FT_Int    idx;
+            PS_Blend  blend = decoder->blend;
+
+
+            if ( arg_cnt != 1 || blend == NULL )
+              goto Unexpected_OtherSubr;
+
+            idx = Fix2Int( top[0] );
+
+            if ( idx < 0                                           ||
+                 idx + blend->num_designs > decoder->len_buildchar )
+              goto Unexpected_OtherSubr;
+
+            ft_memcpy( &decoder->buildchar[idx],
+                       blend->weight_vector,
+                       blend->num_designs *
+                         sizeof ( blend->weight_vector[0] ) );
+          }
+          break;
+
+        case 20:
+          /* <arg1> <arg2> 2 20 callothersubr pop   */
+          /* ==> push <arg1> + <arg2> onto T1 stack */
+          if ( arg_cnt != 2 )
+            goto Unexpected_OtherSubr;
+
+          top[0] += top[1]; /* XXX (over|under)flow */
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+        case 21:
+          /* <arg1> <arg2> 2 21 callothersubr pop   */
+          /* ==> push <arg1> - <arg2> onto T1 stack */
+          if ( arg_cnt != 2 )
+            goto Unexpected_OtherSubr;
+
+          top[0] -= top[1]; /* XXX (over|under)flow */
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+        case 22:
+          /* <arg1> <arg2> 2 22 callothersubr pop   */
+          /* ==> push <arg1> * <arg2> onto T1 stack */
+          if ( arg_cnt != 2 )
+            goto Unexpected_OtherSubr;
+
+          top[0] = FT_MulFix( top[0], top[1] );
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+        case 23:
+          /* <arg1> <arg2> 2 23 callothersubr pop   */
+          /* ==> push <arg1> / <arg2> onto T1 stack */
+          if ( arg_cnt != 2 || top[1] == 0 )
+            goto Unexpected_OtherSubr;
+
+          top[0] = FT_DivFix( top[0], top[1] );
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+        case 24:
+          /* <val> <idx> 2 24 callothersubr               */
+          /* ==> set BuildCharArray[cvi( <idx> )] = <val> */
+          {
+            FT_Int    idx;
+            PS_Blend  blend = decoder->blend;
+
+
+            if ( arg_cnt != 2 || blend == NULL )
+              goto Unexpected_OtherSubr;
+
+            idx = Fix2Int( top[1] );
+
+            if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )
+              goto Unexpected_OtherSubr;
+
+            decoder->buildchar[idx] = top[0];
+          }
+          break;
+
+        case 25:
+          /* <idx> 1 25 callothersubr pop        */
+          /* ==> push BuildCharArray[cvi( idx )] */
+          /*     onto T1 stack                   */
+          {
+            FT_Int    idx;
+            PS_Blend  blend = decoder->blend;
+
+
+            if ( arg_cnt != 1 || blend == NULL )
+              goto Unexpected_OtherSubr;
+
+            idx = Fix2Int( top[0] );
+
+            if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )
+              goto Unexpected_OtherSubr;
+
+            top[0] = decoder->buildchar[idx];
+          }
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+#if 0
+        case 26:
+          /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */
+          /*                      leave mark on T1 stack                    */
+          /* <val> <idx>      ==> set BuildCharArray[cvi( <idx> )] = <val>  */
+          XXX which routine has left its mark on the (PostScript) stack?;
+          break;
+#endif
+
+        case 27:
+          /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */
+          /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */
+          /*     otherwise push <res2>                          */
+          if ( arg_cnt != 4 )
+            goto Unexpected_OtherSubr;
+
+          if ( top[2] > top[3] )
+            top[0] = top[1];
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+        case 28:
+          /* 0 28 callothersubr pop                               */
+          /* => push random value from interval [0, 1) onto stack */
+          if ( arg_cnt != 0 )
+            goto Unexpected_OtherSubr;
+
+          {
+            FT_Fixed  Rand;
+
+
+            Rand = seed;
+            if ( Rand >= 0x8000L )
+              Rand++;
+
+            top[0] = Rand;
+
+            seed = FT_MulFix( seed, 0x10000L - seed );
+            if ( seed == 0 )
+              seed += 0x2873;
+          }
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+        default:
+          if ( arg_cnt >= 0 && subr_no >= 0 )
+          {
+            FT_ERROR(( "t1_decoder_parse_charstrings:"
+                       " unknown othersubr [%d %d], wish me luck\n",
+                       arg_cnt, subr_no ));
+            unknown_othersubr_result_cnt = arg_cnt;
+            break;
+          }
+          /* fall through */
+
+        Unexpected_OtherSubr:
+          FT_ERROR(( "t1_decoder_parse_charstrings:"
+                     " invalid othersubr [%d %d]\n", arg_cnt, subr_no ));
+          goto Syntax_Error;
+        }
+
+        top += known_othersubr_result_cnt;
+
+        decoder->top = top;
+      }
+      else  /* general operator */
+      {
+        FT_Int  num_args = t1_args_count[op];
+
+
+        FT_ASSERT( num_args >= 0 );
+
+        if ( top - decoder->stack < num_args )
+          goto Stack_Underflow;
+
+        /* XXX Operators usually take their operands from the        */
+        /*     bottom of the stack, i.e., the operands are           */
+        /*     decoder->stack[0], ..., decoder->stack[num_args - 1]; */
+        /*     only div, callsubr, and callothersubr are different.  */
+        /*     In practice it doesn't matter (?).                    */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+        switch ( op )
+        {
+        case op_callsubr:
+        case op_div:
+        case op_callothersubr:
+        case op_pop:
+        case op_return:
+          break;
+
+        default:
+          if ( top - decoder->stack != num_args )
+            FT_TRACE0(( "t1_decoder_parse_charstrings:"
+                        " too much operands on the stack"
+                        " (seen %d, expected %d)\n",
+                        top - decoder->stack, num_args ));
+            break;
+        }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+        top -= num_args;
+
+        switch ( op )
+        {
+        case op_endchar:
+          FT_TRACE4(( " endchar\n" ));
+
+          t1_builder_close_contour( builder );
+
+          /* close hints recording session */
+          if ( hinter )
+          {
+            if ( hinter->close( hinter->hints, builder->current->n_points ) )
+              goto Syntax_Error;
+
+            /* apply hints to the loaded glyph outline now */
+            hinter->apply( hinter->hints,
+                           builder->current,
+                           (PSH_Globals)builder->hints_globals,
+                           decoder->hint_mode );
+          }
+
+          /* add current outline to the glyph slot */
+          FT_GlyphLoader_Add( builder->loader );
+
+          /* the compiler should optimize away this empty loop but ... */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+          if ( decoder->len_buildchar > 0 )
+          {
+            FT_UInt  i;
+
+
+            FT_TRACE4(( "BuildCharArray = [ " ));
+
+            for ( i = 0; i < decoder->len_buildchar; ++i )
+              FT_TRACE4(( "%d ", decoder->buildchar[i] ));
+
+            FT_TRACE4(( "]\n" ));
+          }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+          FT_TRACE4(( "\n" ));
+
+          /* return now! */
+          return FT_Err_Ok;
+
+        case op_hsbw:
+          FT_TRACE4(( " hsbw" ));
+
+          builder->parse_state = T1_Parse_Have_Width;
+
+          builder->left_bearing.x += top[0];
+          builder->advance.x       = top[1];
+          builder->advance.y       = 0;
+
+          orig_x = x = builder->pos_x + top[0];
+          orig_y = y = builder->pos_y;
+
+          FT_UNUSED( orig_y );
+
+          /* the `metrics_only' indicates that we only want to compute */
+          /* the glyph's metrics (lsb + advance width), not load the   */
+          /* rest of it; so exit immediately                           */
+          if ( builder->metrics_only )
+            return FT_Err_Ok;
+
+          break;
+
+        case op_seac:
+          return t1operator_seac( decoder,
+                                  top[0],
+                                  top[1],
+                                  top[2],
+                                  Fix2Int( top[3] ),
+                                  Fix2Int( top[4] ) );
+
+        case op_sbw:
+          FT_TRACE4(( " sbw" ));
+
+          builder->parse_state = T1_Parse_Have_Width;
+
+          builder->left_bearing.x += top[0];
+          builder->left_bearing.y += top[1];
+          builder->advance.x       = top[2];
+          builder->advance.y       = top[3];
+
+          x = builder->pos_x + top[0];
+          y = builder->pos_y + top[1];
+
+          /* the `metrics_only' indicates that we only want to compute */
+          /* the glyph's metrics (lsb + advance width), not load the   */
+          /* rest of it; so exit immediately                           */
+          if ( builder->metrics_only )
+            return FT_Err_Ok;
+
+          break;
+
+        case op_closepath:
+          FT_TRACE4(( " closepath" ));
+
+          /* if there is no path, `closepath' is a no-op */
+          if ( builder->parse_state == T1_Parse_Have_Path   ||
+               builder->parse_state == T1_Parse_Have_Moveto )
+            t1_builder_close_contour( builder );
+
+          builder->parse_state = T1_Parse_Have_Width;
+          break;
+
+        case op_hlineto:
+          FT_TRACE4(( " hlineto" ));
+
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != FT_Err_Ok )
+            goto Fail;
+
+          x += top[0];
+          goto Add_Line;
+
+        case op_hmoveto:
+          FT_TRACE4(( " hmoveto" ));
+
+          x += top[0];
+          if ( !decoder->flex_state )
+          {
+            if ( builder->parse_state == T1_Parse_Start )
+              goto Syntax_Error;
+            builder->parse_state = T1_Parse_Have_Moveto;
+          }
+          break;
+
+        case op_hvcurveto:
+          FT_TRACE4(( " hvcurveto" ));
+
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != FT_Err_Ok                                   ||
+               ( error = t1_builder_check_points( builder, 3 ) )
+                 != FT_Err_Ok                                   )
+            goto Fail;
+
+          x += top[0];
+          t1_builder_add_point( builder, x, y, 0 );
+          x += top[1];
+          y += top[2];
+          t1_builder_add_point( builder, x, y, 0 );
+          y += top[3];
+          t1_builder_add_point( builder, x, y, 1 );
+          break;
+
+        case op_rlineto:
+          FT_TRACE4(( " rlineto" ));
+
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != FT_Err_Ok )
+            goto Fail;
+
+          x += top[0];
+          y += top[1];
+
+        Add_Line:
+          if ( ( error = t1_builder_add_point1( builder, x, y ) )
+                 != FT_Err_Ok )
+            goto Fail;
+          break;
+
+        case op_rmoveto:
+          FT_TRACE4(( " rmoveto" ));
+
+          x += top[0];
+          y += top[1];
+          if ( !decoder->flex_state )
+          {
+            if ( builder->parse_state == T1_Parse_Start )
+              goto Syntax_Error;
+            builder->parse_state = T1_Parse_Have_Moveto;
+          }
+          break;
+
+        case op_rrcurveto:
+          FT_TRACE4(( " rrcurveto" ));
+
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != FT_Err_Ok                                   ||
+               ( error = t1_builder_check_points( builder, 3 ) )
+                 != FT_Err_Ok                                   )
+            goto Fail;
+
+          x += top[0];
+          y += top[1];
+          t1_builder_add_point( builder, x, y, 0 );
+
+          x += top[2];
+          y += top[3];
+          t1_builder_add_point( builder, x, y, 0 );
+
+          x += top[4];
+          y += top[5];
+          t1_builder_add_point( builder, x, y, 1 );
+          break;
+
+        case op_vhcurveto:
+          FT_TRACE4(( " vhcurveto" ));
+
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != FT_Err_Ok                                   ||
+               ( error = t1_builder_check_points( builder, 3 ) )
+                 != FT_Err_Ok                                   )
+            goto Fail;
+
+          y += top[0];
+          t1_builder_add_point( builder, x, y, 0 );
+          x += top[1];
+          y += top[2];
+          t1_builder_add_point( builder, x, y, 0 );
+          x += top[3];
+          t1_builder_add_point( builder, x, y, 1 );
+          break;
+
+        case op_vlineto:
+          FT_TRACE4(( " vlineto" ));
+
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != FT_Err_Ok )
+            goto Fail;
+
+          y += top[0];
+          goto Add_Line;
+
+        case op_vmoveto:
+          FT_TRACE4(( " vmoveto" ));
+
+          y += top[0];
+          if ( !decoder->flex_state )
+          {
+            if ( builder->parse_state == T1_Parse_Start )
+              goto Syntax_Error;
+            builder->parse_state = T1_Parse_Have_Moveto;
+          }
+          break;
+
+        case op_div:
+          FT_TRACE4(( " div" ));
+
+          /* if `large_int' is set, we divide unscaled numbers; */
+          /* otherwise, we divide numbers in 16.16 format --    */
+          /* in both cases, it is the same operation            */
+          *top = FT_DivFix( top[0], top[1] );
+          ++top;
+
+          large_int = FALSE;
+          break;
+
+        case op_callsubr:
+          {
+            FT_Int  idx;
+
+
+            FT_TRACE4(( " callsubr" ));
+
+            idx = Fix2Int( top[0] );
+            if ( idx < 0 || idx >= (FT_Int)decoder->num_subrs )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " invalid subrs index\n" ));
+              goto Syntax_Error;
+            }
+
+            if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " too many nested subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            zone->cursor = ip;  /* save current instruction pointer */
+
+            zone++;
+
+            /* The Type 1 driver stores subroutines without the seed bytes. */
+            /* The CID driver stores subroutines with seed bytes.  This     */
+            /* case is taken care of when decoder->subrs_len == 0.          */
+            zone->base = decoder->subrs[idx];
+
+            if ( decoder->subrs_len )
+              zone->limit = zone->base + decoder->subrs_len[idx];
+            else
+            {
+              /* We are using subroutines from a CID font.  We must adjust */
+              /* for the seed bytes.                                       */
+              zone->base  += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );
+              zone->limit  = decoder->subrs[idx + 1];
+            }
+
+            zone->cursor = zone->base;
+
+            if ( !zone->base )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " invoking empty subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            decoder->zone = zone;
+            ip            = zone->base;
+            limit         = zone->limit;
+            break;
+          }
+
+        case op_pop:
+          FT_TRACE4(( " pop" ));
+
+          if ( known_othersubr_result_cnt > 0 )
+          {
+            known_othersubr_result_cnt--;
+            /* ignore, we pushed the operands ourselves */
+            break;
+          }
+
+          if ( unknown_othersubr_result_cnt == 0 )
+          {
+            FT_ERROR(( "t1_decoder_parse_charstrings:"
+                       " no more operands for othersubr\n" ));
+            goto Syntax_Error;
+          }
+
+          unknown_othersubr_result_cnt--;
+          top++;   /* `push' the operand to callothersubr onto the stack */
+          break;
+
+        case op_return:
+          FT_TRACE4(( " return" ));
+
+          if ( zone <= decoder->zones )
+          {
+            FT_ERROR(( "t1_decoder_parse_charstrings:"
+                       " unexpected return\n" ));
+            goto Syntax_Error;
+          }
+
+          zone--;
+          ip            = zone->cursor;
+          limit         = zone->limit;
+          decoder->zone = zone;
+          break;
+
+        case op_dotsection:
+          FT_TRACE4(( " dotsection" ));
+
+          break;
+
+        case op_hstem:
+          FT_TRACE4(( " hstem" ));
+
+          /* record horizontal hint */
+          if ( hinter )
+          {
+            /* top[0] += builder->left_bearing.y; */
+            hinter->stem( hinter->hints, 1, top );
+          }
+          break;
+
+        case op_hstem3:
+          FT_TRACE4(( " hstem3" ));
+
+          /* record horizontal counter-controlled hints */
+          if ( hinter )
+            hinter->stem3( hinter->hints, 1, top );
+          break;
+
+        case op_vstem:
+          FT_TRACE4(( " vstem" ));
+
+          /* record vertical hint */
+          if ( hinter )
+          {
+            top[0] += orig_x;
+            hinter->stem( hinter->hints, 0, top );
+          }
+          break;
+
+        case op_vstem3:
+          FT_TRACE4(( " vstem3" ));
+
+          /* record vertical counter-controlled hints */
+          if ( hinter )
+          {
+            FT_Pos  dx = orig_x;
+
+
+            top[0] += dx;
+            top[2] += dx;
+            top[4] += dx;
+            hinter->stem3( hinter->hints, 0, top );
+          }
+          break;
+
+        case op_setcurrentpoint:
+          FT_TRACE4(( " setcurrentpoint" ));
+
+          /* From the T1 specification, section 6.4:                */
+          /*                                                        */
+          /*   The setcurrentpoint command is used only in          */
+          /*   conjunction with results from OtherSubrs procedures. */
+
+          /* known_othersubr_result_cnt != 0 is already handled     */
+          /* above.                                                 */
+
+          /* Note, however, that both Ghostscript and Adobe         */
+          /* Distiller handle this situation by silently ignoring   */
+          /* the inappropriate `setcurrentpoint' instruction.  So   */
+          /* we do the same.                                        */
+#if 0
+
+          if ( decoder->flex_state != 1 )
+          {
+            FT_ERROR(( "t1_decoder_parse_charstrings:"
+                       " unexpected `setcurrentpoint'\n" ));
+            goto Syntax_Error;
+          }
+          else
+            ...
+#endif
+
+          x = top[0];
+          y = top[1];
+          decoder->flex_state = 0;
+          break;
+
+        case op_unknown15:
+          FT_TRACE4(( " opcode_15" ));
+          /* nothing to do except to pop the two arguments */
+          break;
+
+        default:
+          FT_ERROR(( "t1_decoder_parse_charstrings:"
+                     " unhandled opcode %d\n", op ));
+          goto Syntax_Error;
+        }
+
+        /* XXX Operators usually clear the operand stack;  */
+        /*     only div, callsubr, callothersubr, pop, and */
+        /*     return are different.                       */
+        /*     In practice it doesn't matter (?).          */
+
+        decoder->top = top;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        FT_TRACE4(( "\n" ));
+        bol = TRUE;
+#endif
+
+      } /* general operator processing */
+
+    } /* while ip < limit */
+
+    FT_TRACE4(( "..end..\n\n" ));
+
+  Fail:
+    return error;
+
+  Syntax_Error:
+    return FT_THROW( Syntax_Error );
+
+  Stack_Underflow:
+    return FT_THROW( Stack_Underflow );
+  }
+
+
+  /* parse a single Type 1 glyph */
+  FT_LOCAL_DEF( FT_Error )
+  t1_decoder_parse_glyph( T1_Decoder  decoder,
+                          FT_UInt     glyph )
+  {
+    return decoder->parse_callback( decoder, glyph );
+  }
+
+
+  /* initialize T1 decoder */
+  FT_LOCAL_DEF( FT_Error )
+  t1_decoder_init( T1_Decoder           decoder,
+                   FT_Face              face,
+                   FT_Size              size,
+                   FT_GlyphSlot         slot,
+                   FT_Byte**            glyph_names,
+                   PS_Blend             blend,
+                   FT_Bool              hinting,
+                   FT_Render_Mode       hint_mode,
+                   T1_Decoder_Callback  parse_callback )
+  {
+    FT_MEM_ZERO( decoder, sizeof ( *decoder ) );
+
+    /* retrieve PSNames interface from list of current modules */
+    {
+      FT_Service_PsCMaps  psnames = 0;
+
+
+      FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+      if ( !psnames )
+      {
+        FT_ERROR(( "t1_decoder_init:"
+                   " the `psnames' module is not available\n" ));
+        return FT_THROW( Unimplemented_Feature );
+      }
+
+      decoder->psnames = psnames;
+    }
+
+    t1_builder_init( &decoder->builder, face, size, slot, hinting );
+
+    /* decoder->buildchar and decoder->len_buildchar have to be  */
+    /* initialized by the caller since we cannot know the length */
+    /* of the BuildCharArray                                     */
+
+    decoder->num_glyphs     = (FT_UInt)face->num_glyphs;
+    decoder->glyph_names    = glyph_names;
+    decoder->hint_mode      = hint_mode;
+    decoder->blend          = blend;
+    decoder->parse_callback = parse_callback;
+
+    decoder->funcs          = t1_decoder_funcs;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* finalize T1 decoder */
+  FT_LOCAL_DEF( void )
+  t1_decoder_done( T1_Decoder  decoder )
+  {
+    t1_builder_done( &decoder->builder );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.h
new file mode 100644
index 0000000..23bd99f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.h
@@ -0,0 +1,64 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1decode.h                                                             */
+/*                                                                         */
+/*    PostScript Type 1 decoding routines (specification).                 */
+/*                                                                         */
+/*  Copyright 2000-2001, 2002, 2003 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1DECODE_H__
+#define __T1DECODE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/internal/t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_CALLBACK_TABLE
+  const T1_Decoder_FuncsRec  t1_decoder_funcs;
+
+
+  FT_LOCAL( FT_Error )
+  t1_decoder_parse_glyph( T1_Decoder  decoder,
+                          FT_UInt     glyph_index );
+
+  FT_LOCAL( FT_Error )
+  t1_decoder_parse_charstrings( T1_Decoder  decoder,
+                                FT_Byte*    base,
+                                FT_UInt     len );
+
+  FT_LOCAL( FT_Error )
+  t1_decoder_init( T1_Decoder           decoder,
+                   FT_Face              face,
+                   FT_Size              size,
+                   FT_GlyphSlot         slot,
+                   FT_Byte**            glyph_names,
+                   PS_Blend             blend,
+                   FT_Bool              hinting,
+                   FT_Render_Mode       hint_mode,
+                   T1_Decoder_Callback  parse_glyph );
+
+  FT_LOCAL( void )
+  t1_decoder_done( T1_Decoder  decoder );
+
+
+FT_END_HEADER
+
+#endif /* __T1DECODE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/Jamfile
new file mode 100644
index 0000000..779f1b0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/pshinter Jamfile
+#
+# Copyright 2001, 2003 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) pshinter ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = pshrec pshglob pshalgo pshmod pshpic ;
+  }
+  else
+  {
+    _sources = pshinter ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/pshinter Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/fxft_pshinter.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/fxft_pshinter.c
new file mode 100644
index 0000000..27cf308
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/fxft_pshinter.c
@@ -0,0 +1,33 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  pshinter.c                                                             */
+/*                                                                         */
+/*    FreeType PostScript Hinting module                                   */
+/*                                                                         */
+/*  Copyright 2001, 2003 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "pshpic.c"
+#include "pshrec.c"
+#include "pshglob.c"
+#include "pshalgo.c"
+#include "pshmod.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/module.mk
new file mode 100644
index 0000000..ed24eb7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PSHinter module definition
+#
+
+
+# Copyright 1996-2001, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += PSHINTER_MODULE
+
+define PSHINTER_MODULE
+$(OPEN_DRIVER) FT_Module_Class, pshinter_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)pshinter  $(ECHO_DRIVER_DESC)Postscript hinter module$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.c
new file mode 100644
index 0000000..96f2cd5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.c
@@ -0,0 +1,2305 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshalgo.c                                                              */
+/*                                                                         */
+/*    PostScript hinting algorithm (body).                                 */
+/*                                                                         */
+/*  Copyright 2001-2010, 2012, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used        */
+/*  modified and distributed under the terms of the FreeType project       */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "pshalgo.h"
+
+#include "pshnterr.h"
+
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_pshalgo2
+
+
+#ifdef DEBUG_HINTER
+  PSH_Hint_Table  ps_debug_hint_table = 0;
+  PSH_HintFunc    ps_debug_hint_func  = 0;
+  PSH_Glyph       ps_debug_glyph      = 0;
+#endif
+
+
+#define  COMPUTE_INFLEXS  /* compute inflection points to optimize `S' */
+                          /* and similar glyphs                        */
+#define  STRONGER         /* slightly increase the contrast of smooth  */
+                          /* hinting                                   */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  BASIC HINTS RECORDINGS                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* return true if two stem hints overlap */
+  static FT_Int
+  psh_hint_overlap( PSH_Hint  hint1,
+                    PSH_Hint  hint2 )
+  {
+    return hint1->org_pos + hint1->org_len >= hint2->org_pos &&
+           hint2->org_pos + hint2->org_len >= hint1->org_pos;
+  }
+
+
+  /* destroy hints table */
+  static void
+  psh_hint_table_done( PSH_Hint_Table  table,
+                       FT_Memory       memory )
+  {
+    FT_FREE( table->zones );
+    table->num_zones = 0;
+    table->zone      = 0;
+
+    FT_FREE( table->sort );
+    FT_FREE( table->hints );
+    table->num_hints   = 0;
+    table->max_hints   = 0;
+    table->sort_global = 0;
+  }
+
+
+  /* deactivate all hints in a table */
+  static void
+  psh_hint_table_deactivate( PSH_Hint_Table  table )
+  {
+    FT_UInt   count = table->max_hints;
+    PSH_Hint  hint  = table->hints;
+
+
+    for ( ; count > 0; count--, hint++ )
+    {
+      psh_hint_deactivate( hint );
+      hint->order = -1;
+    }
+  }
+
+
+  /* internal function to record a new hint */
+  static void
+  psh_hint_table_record( PSH_Hint_Table  table,
+                         FT_UInt         idx )
+  {
+    PSH_Hint  hint = table->hints + idx;
+
+
+    if ( idx >= table->max_hints )
+    {
+      FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx ));
+      return;
+    }
+
+    /* ignore active hints */
+    if ( psh_hint_is_active( hint ) )
+      return;
+
+    psh_hint_activate( hint );
+
+    /* now scan the current active hint set to check */
+    /* whether `hint' overlaps with another hint     */
+    {
+      PSH_Hint*  sorted = table->sort_global;
+      FT_UInt    count  = table->num_hints;
+      PSH_Hint   hint2;
+
+
+      hint->parent = 0;
+      for ( ; count > 0; count--, sorted++ )
+      {
+        hint2 = sorted[0];
+
+        if ( psh_hint_overlap( hint, hint2 ) )
+        {
+          hint->parent = hint2;
+          break;
+        }
+      }
+    }
+
+    if ( table->num_hints < table->max_hints )
+      table->sort_global[table->num_hints++] = hint;
+    else
+      FT_TRACE0(( "psh_hint_table_record: too many sorted hints!  BUG!\n" ));
+  }
+
+
+  static void
+  psh_hint_table_record_mask( PSH_Hint_Table  table,
+                              PS_Mask         hint_mask )
+  {
+    FT_Int    mask = 0, val = 0;
+    FT_Byte*  cursor = hint_mask->bytes;
+    FT_UInt   idx, limit;
+
+
+    limit = hint_mask->num_bits;
+
+    for ( idx = 0; idx < limit; idx++ )
+    {
+      if ( mask == 0 )
+      {
+        val  = *cursor++;
+        mask = 0x80;
+      }
+
+      if ( val & mask )
+        psh_hint_table_record( table, idx );
+
+      mask >>= 1;
+    }
+  }
+
+
+  /* create hints table */
+  static FT_Error
+  psh_hint_table_init( PSH_Hint_Table  table,
+                       PS_Hint_Table   hints,
+                       PS_Mask_Table   hint_masks,
+                       PS_Mask_Table   counter_masks,
+                       FT_Memory       memory )
+  {
+    FT_UInt   count;
+    FT_Error  error;
+
+    FT_UNUSED( counter_masks );
+
+
+    count = hints->num_hints;
+
+    /* allocate our tables */
+    if ( FT_NEW_ARRAY( table->sort,  2 * count     ) ||
+         FT_NEW_ARRAY( table->hints,     count     ) ||
+         FT_NEW_ARRAY( table->zones, 2 * count + 1 ) )
+      goto Exit;
+
+    table->max_hints   = count;
+    table->sort_global = table->sort + count;
+    table->num_hints   = 0;
+    table->num_zones   = 0;
+    table->zone        = 0;
+
+    /* initialize the `table->hints' array */
+    {
+      PSH_Hint  write = table->hints;
+      PS_Hint   read  = hints->hints;
+
+
+      for ( ; count > 0; count--, write++, read++ )
+      {
+        write->org_pos = read->pos;
+        write->org_len = read->len;
+        write->flags   = read->flags;
+      }
+    }
+
+    /* we now need to determine the initial `parent' stems; first  */
+    /* activate the hints that are given by the initial hint masks */
+    if ( hint_masks )
+    {
+      PS_Mask  mask = hint_masks->masks;
+
+
+      count             = hint_masks->num_masks;
+      table->hint_masks = hint_masks;
+
+      for ( ; count > 0; count--, mask++ )
+        psh_hint_table_record_mask( table, mask );
+    }
+
+    /* finally, do a linear parse in case some hints were left alone */
+    if ( table->num_hints != table->max_hints )
+    {
+      FT_UInt  idx;
+
+
+      FT_TRACE0(( "psh_hint_table_init: missing/incorrect hint masks\n" ));
+
+      count = table->max_hints;
+      for ( idx = 0; idx < count; idx++ )
+        psh_hint_table_record( table, idx );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  psh_hint_table_activate_mask( PSH_Hint_Table  table,
+                                PS_Mask         hint_mask )
+  {
+    FT_Int    mask = 0, val = 0;
+    FT_Byte*  cursor = hint_mask->bytes;
+    FT_UInt   idx, limit, count;
+
+
+    limit = hint_mask->num_bits;
+    count = 0;
+
+    psh_hint_table_deactivate( table );
+
+    for ( idx = 0; idx < limit; idx++ )
+    {
+      if ( mask == 0 )
+      {
+        val  = *cursor++;
+        mask = 0x80;
+      }
+
+      if ( val & mask )
+      {
+        PSH_Hint  hint = &table->hints[idx];
+
+
+        if ( !psh_hint_is_active( hint ) )
+        {
+          FT_UInt     count2;
+
+#if 0
+          PSH_Hint*  sort = table->sort;
+          PSH_Hint   hint2;
+
+
+          for ( count2 = count; count2 > 0; count2--, sort++ )
+          {
+            hint2 = sort[0];
+            if ( psh_hint_overlap( hint, hint2 ) )
+              FT_TRACE0(( "psh_hint_table_activate_mask:"
+                          " found overlapping hints\n" ))
+          }
+#else
+          count2 = 0;
+#endif
+
+          if ( count2 == 0 )
+          {
+            psh_hint_activate( hint );
+            if ( count < table->max_hints )
+              table->sort[count++] = hint;
+            else
+              FT_TRACE0(( "psh_hint_tableactivate_mask:"
+                          " too many active hints\n" ));
+          }
+        }
+      }
+
+      mask >>= 1;
+    }
+    table->num_hints = count;
+
+    /* now, sort the hints; they are guaranteed to not overlap */
+    /* so we can compare their "org_pos" field directly        */
+    {
+      FT_Int     i1, i2;
+      PSH_Hint   hint1, hint2;
+      PSH_Hint*  sort = table->sort;
+
+
+      /* a simple bubble sort will do, since in 99% of cases, the hints */
+      /* will be already sorted -- and the sort will be linear          */
+      for ( i1 = 1; i1 < (FT_Int)count; i1++ )
+      {
+        hint1 = sort[i1];
+        for ( i2 = i1 - 1; i2 >= 0; i2-- )
+        {
+          hint2 = sort[i2];
+
+          if ( hint2->org_pos < hint1->org_pos )
+            break;
+
+          sort[i2 + 1] = hint2;
+          sort[i2]     = hint1;
+        }
+      }
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****               HINTS GRID-FITTING AND OPTIMIZATION             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#if 1
+  static FT_Pos
+  psh_dimension_quantize_len( PSH_Dimension  dim,
+                              FT_Pos         len,
+                              FT_Bool        do_snapping )
+  {
+    if ( len <= 64 )
+      len = 64;
+    else
+    {
+      FT_Pos  delta = len - dim->stdw.widths[0].cur;
+
+
+      if ( delta < 0 )
+        delta = -delta;
+
+      if ( delta < 40 )
+      {
+        len = dim->stdw.widths[0].cur;
+        if ( len < 48 )
+          len = 48;
+      }
+
+      if ( len < 3 * 64 )
+      {
+        delta = ( len & 63 );
+        len  &= -64;
+
+        if ( delta < 10 )
+          len += delta;
+
+        else if ( delta < 32 )
+          len += 10;
+
+        else if ( delta < 54 )
+          len += 54;
+
+        else
+          len += delta;
+      }
+      else
+        len = FT_PIX_ROUND( len );
+    }
+
+    if ( do_snapping )
+      len = FT_PIX_ROUND( len );
+
+    return  len;
+  }
+#endif /* 0 */
+
+
+#ifdef DEBUG_HINTER
+
+  static void
+  ps_simple_scale( PSH_Hint_Table  table,
+                   FT_Fixed        scale,
+                   FT_Fixed        delta,
+                   FT_Int          dimension )
+  {
+    FT_UInt  count;
+
+
+    for ( count = 0; count < table->max_hints; count++ )
+    {
+      PSH_Hint  hint = table->hints + count;
+
+
+      hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta;
+      hint->cur_len = FT_MulFix( hint->org_len, scale );
+
+      if ( ps_debug_hint_func )
+        ps_debug_hint_func( hint, dimension );
+    }
+  }
+
+#endif /* DEBUG_HINTER */
+
+
+  static FT_Fixed
+  psh_hint_snap_stem_side_delta( FT_Fixed  pos,
+                                 FT_Fixed  len )
+  {
+    FT_Fixed  delta1 = FT_PIX_ROUND( pos ) - pos;
+    FT_Fixed  delta2 = FT_PIX_ROUND( pos + len ) - pos - len;
+
+
+    if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) )
+      return delta1;
+    else
+      return delta2;
+  }
+
+
+  static void
+  psh_hint_align( PSH_Hint     hint,
+                  PSH_Globals  globals,
+                  FT_Int       dimension,
+                  PSH_Glyph    glyph )
+  {
+    PSH_Dimension  dim   = &globals->dimension[dimension];
+    FT_Fixed       scale = dim->scale_mult;
+    FT_Fixed       delta = dim->scale_delta;
+
+
+    if ( !psh_hint_is_fitted( hint ) )
+    {
+      FT_Pos  pos = FT_MulFix( hint->org_pos, scale ) + delta;
+      FT_Pos  len = FT_MulFix( hint->org_len, scale );
+
+      FT_Int            do_snapping;
+      FT_Pos            fit_len;
+      PSH_AlignmentRec  align;
+
+
+      /* ignore stem alignments when requested through the hint flags */
+      if ( ( dimension == 0 && !glyph->do_horz_hints ) ||
+           ( dimension == 1 && !glyph->do_vert_hints ) )
+      {
+        hint->cur_pos = pos;
+        hint->cur_len = len;
+
+        psh_hint_set_fitted( hint );
+        return;
+      }
+
+      /* perform stem snapping when requested - this is necessary
+       * for monochrome and LCD hinting modes only
+       */
+      do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) ||
+                    ( dimension == 1 && glyph->do_vert_snapping );
+
+      hint->cur_len = fit_len = len;
+
+      /* check blue zones for horizontal stems */
+      align.align     = PSH_BLUE_ALIGN_NONE;
+      align.align_bot = align.align_top = 0;
+
+      if ( dimension == 1 )
+        psh_blues_snap_stem( &globals->blues,
+                             hint->org_pos + hint->org_len,
+                             hint->org_pos,
+                             &align );
+
+      switch ( align.align )
+      {
+      case PSH_BLUE_ALIGN_TOP:
+        /* the top of the stem is aligned against a blue zone */
+        hint->cur_pos = align.align_top - fit_len;
+        break;
+
+      case PSH_BLUE_ALIGN_BOT:
+        /* the bottom of the stem is aligned against a blue zone */
+        hint->cur_pos = align.align_bot;
+        break;
+
+      case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:
+        /* both edges of the stem are aligned against blue zones */
+        hint->cur_pos = align.align_bot;
+        hint->cur_len = align.align_top - align.align_bot;
+        break;
+
+      default:
+        {
+          PSH_Hint  parent = hint->parent;
+
+
+          if ( parent )
+          {
+            FT_Pos  par_org_center, par_cur_center;
+            FT_Pos  cur_org_center, cur_delta;
+
+
+            /* ensure that parent is already fitted */
+            if ( !psh_hint_is_fitted( parent ) )
+              psh_hint_align( parent, globals, dimension, glyph );
+
+            /* keep original relation between hints, this is, use the */
+            /* scaled distance between the centers of the hints to    */
+            /* compute the new position                               */
+            par_org_center = parent->org_pos + ( parent->org_len >> 1 );
+            par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 );
+            cur_org_center = hint->org_pos   + ( hint->org_len   >> 1 );
+
+            cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );
+            pos       = par_cur_center + cur_delta - ( len >> 1 );
+          }
+
+          hint->cur_pos = pos;
+          hint->cur_len = fit_len;
+
+          /* Stem adjustment tries to snap stem widths to standard
+           * ones.  This is important to prevent unpleasant rounding
+           * artefacts.
+           */
+          if ( glyph->do_stem_adjust )
+          {
+            if ( len <= 64 )
+            {
+              /* the stem is less than one pixel; we will center it
+               * around the nearest pixel center
+               */
+              if ( len >= 32 )
+              {
+                /* This is a special case where we also widen the stem
+                 * and align it to the pixel grid.
+                 *
+                 *   stem_center          = pos + (len/2)
+                 *   nearest_pixel_center = FT_ROUND(stem_center-32)+32
+                 *   new_pos              = nearest_pixel_center-32
+                 *                        = FT_ROUND(stem_center-32)
+                 *                        = FT_FLOOR(stem_center-32+32)
+                 *                        = FT_FLOOR(stem_center)
+                 *   new_len              = 64
+                 */
+                pos = FT_PIX_FLOOR( pos + ( len >> 1 ) );
+                len = 64;
+              }
+              else if ( len > 0 )
+              {
+                /* This is a very small stem; we simply align it to the
+                 * pixel grid, trying to find the minimum displacement.
+                 *
+                 * left               = pos
+                 * right              = pos + len
+                 * left_nearest_edge  = ROUND(pos)
+                 * right_nearest_edge = ROUND(right)
+                 *
+                 * if ( ABS(left_nearest_edge - left) <=
+                 *      ABS(right_nearest_edge - right) )
+                 *    new_pos = left
+                 * else
+                 *    new_pos = right
+                 */
+                FT_Pos  left_nearest  = FT_PIX_ROUND( pos );
+                FT_Pos  right_nearest = FT_PIX_ROUND( pos + len );
+                FT_Pos  left_disp     = left_nearest - pos;
+                FT_Pos  right_disp    = right_nearest - ( pos + len );
+
+
+                if ( left_disp < 0 )
+                  left_disp = -left_disp;
+                if ( right_disp < 0 )
+                  right_disp = -right_disp;
+                if ( left_disp <= right_disp )
+                  pos = left_nearest;
+                else
+                  pos = right_nearest;
+              }
+              else
+              {
+                /* this is a ghost stem; we simply round it */
+                pos = FT_PIX_ROUND( pos );
+              }
+            }
+            else
+            {
+              len = psh_dimension_quantize_len( dim, len, 0 );
+            }
+          }
+
+          /* now that we have a good hinted stem width, try to position */
+          /* the stem along a pixel grid integer coordinate             */
+          hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len );
+          hint->cur_len = len;
+        }
+      }
+
+      if ( do_snapping )
+      {
+        pos = hint->cur_pos;
+        len = hint->cur_len;
+
+        if ( len < 64 )
+          len = 64;
+        else
+          len = FT_PIX_ROUND( len );
+
+        switch ( align.align )
+        {
+          case PSH_BLUE_ALIGN_TOP:
+            hint->cur_pos = align.align_top - len;
+            hint->cur_len = len;
+            break;
+
+          case PSH_BLUE_ALIGN_BOT:
+            hint->cur_len = len;
+            break;
+
+          case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP:
+            /* don't touch */
+            break;
+
+
+          default:
+            hint->cur_len = len;
+            if ( len & 64 )
+              pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32;
+            else
+              pos = FT_PIX_ROUND( pos + ( len >> 1 ) );
+
+            hint->cur_pos = pos - ( len >> 1 );
+            hint->cur_len = len;
+        }
+      }
+
+      psh_hint_set_fitted( hint );
+
+#ifdef DEBUG_HINTER
+      if ( ps_debug_hint_func )
+        ps_debug_hint_func( hint, dimension );
+#endif
+    }
+  }
+
+
+#if 0  /* not used for now, experimental */
+
+ /*
+  *  A variant to perform "light" hinting (i.e. FT_RENDER_MODE_LIGHT)
+  *  of stems
+  */
+  static void
+  psh_hint_align_light( PSH_Hint     hint,
+                        PSH_Globals  globals,
+                        FT_Int       dimension,
+                        PSH_Glyph    glyph )
+  {
+    PSH_Dimension  dim   = &globals->dimension[dimension];
+    FT_Fixed       scale = dim->scale_mult;
+    FT_Fixed       delta = dim->scale_delta;
+
+
+    if ( !psh_hint_is_fitted( hint ) )
+    {
+      FT_Pos  pos = FT_MulFix( hint->org_pos, scale ) + delta;
+      FT_Pos  len = FT_MulFix( hint->org_len, scale );
+
+      FT_Pos  fit_len;
+
+      PSH_AlignmentRec  align;
+
+
+      /* ignore stem alignments when requested through the hint flags */
+      if ( ( dimension == 0 && !glyph->do_horz_hints ) ||
+           ( dimension == 1 && !glyph->do_vert_hints ) )
+      {
+        hint->cur_pos = pos;
+        hint->cur_len = len;
+
+        psh_hint_set_fitted( hint );
+        return;
+      }
+
+      fit_len = len;
+
+      hint->cur_len = fit_len;
+
+      /* check blue zones for horizontal stems */
+      align.align = PSH_BLUE_ALIGN_NONE;
+      align.align_bot = align.align_top = 0;
+
+      if ( dimension == 1 )
+        psh_blues_snap_stem( &globals->blues,
+                             hint->org_pos + hint->org_len,
+                             hint->org_pos,
+                             &align );
+
+      switch ( align.align )
+      {
+      case PSH_BLUE_ALIGN_TOP:
+        /* the top of the stem is aligned against a blue zone */
+        hint->cur_pos = align.align_top - fit_len;
+        break;
+
+      case PSH_BLUE_ALIGN_BOT:
+        /* the bottom of the stem is aligned against a blue zone */
+        hint->cur_pos = align.align_bot;
+        break;
+
+      case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:
+        /* both edges of the stem are aligned against blue zones */
+        hint->cur_pos = align.align_bot;
+        hint->cur_len = align.align_top - align.align_bot;
+        break;
+
+      default:
+        {
+          PSH_Hint  parent = hint->parent;
+
+
+          if ( parent )
+          {
+            FT_Pos  par_org_center, par_cur_center;
+            FT_Pos  cur_org_center, cur_delta;
+
+
+            /* ensure that parent is already fitted */
+            if ( !psh_hint_is_fitted( parent ) )
+              psh_hint_align_light( parent, globals, dimension, glyph );
+
+            par_org_center = parent->org_pos + ( parent->org_len / 2 );
+            par_cur_center = parent->cur_pos + ( parent->cur_len / 2 );
+            cur_org_center = hint->org_pos   + ( hint->org_len   / 2 );
+
+            cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );
+            pos       = par_cur_center + cur_delta - ( len >> 1 );
+          }
+
+          /* Stems less than one pixel wide are easy -- we want to
+           * make them as dark as possible, so they must fall within
+           * one pixel.  If the stem is split between two pixels
+           * then snap the edge that is nearer to the pixel boundary
+           * to the pixel boundary.
+           */
+          if ( len <= 64 )
+          {
+            if ( ( pos + len + 63 ) / 64  != pos / 64 + 1 )
+              pos += psh_hint_snap_stem_side_delta ( pos, len );
+          }
+
+          /* Position stems other to minimize the amount of mid-grays.
+           * There are, in general, two positions that do this,
+           * illustrated as A) and B) below.
+           *
+           *   +                   +                   +                   +
+           *
+           * A)             |--------------------------------|
+           * B)   |--------------------------------|
+           * C)       |--------------------------------|
+           *
+           * Position A) (split the excess stem equally) should be better
+           * for stems of width N + f where f < 0.5.
+           *
+           * Position B) (split the deficiency equally) should be better
+           * for stems of width N + f where f > 0.5.
+           *
+           * It turns out though that minimizing the total number of lit
+           * pixels is also important, so position C), with one edge
+           * aligned with a pixel boundary is actually preferable
+           * to A).  There are also more possibile positions for C) than
+           * for A) or B), so it involves less distortion of the overall
+           * character shape.
+           */
+          else /* len > 64 */
+          {
+            FT_Fixed  frac_len = len & 63;
+            FT_Fixed  center = pos + ( len >> 1 );
+            FT_Fixed  delta_a, delta_b;
+
+
+            if ( ( len / 64 ) & 1 )
+            {
+              delta_a = FT_PIX_FLOOR( center ) + 32 - center;
+              delta_b = FT_PIX_ROUND( center ) - center;
+            }
+            else
+            {
+              delta_a = FT_PIX_ROUND( center ) - center;
+              delta_b = FT_PIX_FLOOR( center ) + 32 - center;
+            }
+
+            /* We choose between B) and C) above based on the amount
+             * of fractinal stem width; for small amounts, choose
+             * C) always, for large amounts, B) always, and inbetween,
+             * pick whichever one involves less stem movement.
+             */
+            if ( frac_len < 32 )
+            {
+              pos += psh_hint_snap_stem_side_delta ( pos, len );
+            }
+            else if ( frac_len < 48 )
+            {
+              FT_Fixed  side_delta = psh_hint_snap_stem_side_delta ( pos,
+                                                                     len );
+
+              if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) )
+                pos += side_delta;
+              else
+                pos += delta_b;
+            }
+            else
+            {
+              pos += delta_b;
+            }
+          }
+
+          hint->cur_pos = pos;
+        }
+      }  /* switch */
+
+      psh_hint_set_fitted( hint );
+
+#ifdef DEBUG_HINTER
+      if ( ps_debug_hint_func )
+        ps_debug_hint_func( hint, dimension );
+#endif
+    }
+  }
+
+#endif /* 0 */
+
+
+  static void
+  psh_hint_table_align_hints( PSH_Hint_Table  table,
+                              PSH_Globals     globals,
+                              FT_Int          dimension,
+                              PSH_Glyph       glyph )
+  {
+    PSH_Hint       hint;
+    FT_UInt        count;
+
+#ifdef DEBUG_HINTER
+
+    PSH_Dimension  dim   = &globals->dimension[dimension];
+    FT_Fixed       scale = dim->scale_mult;
+    FT_Fixed       delta = dim->scale_delta;
+
+
+    if ( ps_debug_no_vert_hints && dimension == 0 )
+    {
+      ps_simple_scale( table, scale, delta, dimension );
+      return;
+    }
+
+    if ( ps_debug_no_horz_hints && dimension == 1 )
+    {
+      ps_simple_scale( table, scale, delta, dimension );
+      return;
+    }
+
+#endif /* DEBUG_HINTER*/
+
+    hint  = table->hints;
+    count = table->max_hints;
+
+    for ( ; count > 0; count--, hint++ )
+      psh_hint_align( hint, globals, dimension, glyph );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                POINTS INTERPOLATION ROUTINES                  *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define PSH_ZONE_MIN  -3200000L
+#define PSH_ZONE_MAX  +3200000L
+
+#define xxDEBUG_ZONES
+
+
+#ifdef DEBUG_ZONES
+
+#include "../../include/freetype/config/ftstdlib.h"
+
+  static void
+  psh_print_zone( PSH_Zone  zone )
+  {
+    printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n",
+             zone->scale / 65536.0,
+             zone->delta / 64.0,
+             zone->min,
+             zone->max );
+  }
+
+#else
+
+#define psh_print_zone( x )  do { } while ( 0 )
+
+#endif /* DEBUG_ZONES */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    HINTER GLYPH MANAGEMENT                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#if 1
+
+#define  psh_corner_is_flat      ft_corner_is_flat
+#define  psh_corner_orientation  ft_corner_orientation
+
+#else
+
+  FT_LOCAL_DEF( FT_Int )
+  psh_corner_is_flat( FT_Pos  x_in,
+                      FT_Pos  y_in,
+                      FT_Pos  x_out,
+                      FT_Pos  y_out )
+  {
+    FT_Pos  ax = x_in;
+    FT_Pos  ay = y_in;
+
+    FT_Pos  d_in, d_out, d_corner;
+
+
+    if ( ax < 0 )
+      ax = -ax;
+    if ( ay < 0 )
+      ay = -ay;
+    d_in = ax + ay;
+
+    ax = x_out;
+    if ( ax < 0 )
+      ax = -ax;
+    ay = y_out;
+    if ( ay < 0 )
+      ay = -ay;
+    d_out = ax + ay;
+
+    ax = x_out + x_in;
+    if ( ax < 0 )
+      ax = -ax;
+    ay = y_out + y_in;
+    if ( ay < 0 )
+      ay = -ay;
+    d_corner = ax + ay;
+
+    return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );
+  }
+
+  static FT_Int
+  psh_corner_orientation( FT_Pos  in_x,
+                          FT_Pos  in_y,
+                          FT_Pos  out_x,
+                          FT_Pos  out_y )
+  {
+    FT_Int  result;
+
+
+    /* deal with the trivial cases quickly */
+    if ( in_y == 0 )
+    {
+      if ( in_x >= 0 )
+        result = out_y;
+      else
+        result = -out_y;
+    }
+    else if ( in_x == 0 )
+    {
+      if ( in_y >= 0 )
+        result = -out_x;
+      else
+        result = out_x;
+    }
+    else if ( out_y == 0 )
+    {
+      if ( out_x >= 0 )
+        result = in_y;
+      else
+        result = -in_y;
+    }
+    else if ( out_x == 0 )
+    {
+      if ( out_y >= 0 )
+        result = -in_x;
+      else
+        result =  in_x;
+    }
+    else /* general case */
+    {
+      long long  delta = (long long)in_x * out_y - (long long)in_y * out_x;
+
+      if ( delta == 0 )
+        result = 0;
+      else
+        result = 1 - 2 * ( delta < 0 );
+    }
+
+    return result;
+  }
+
+#endif /* !1 */
+
+
+#ifdef COMPUTE_INFLEXS
+
+  /* compute all inflex points in a given glyph */
+  static void
+  psh_glyph_compute_inflections( PSH_Glyph  glyph )
+  {
+    FT_UInt  n;
+
+
+    for ( n = 0; n < glyph->num_contours; n++ )
+    {
+      PSH_Point  first, start, end, before, after;
+      FT_Pos     in_x, in_y, out_x, out_y;
+      FT_Int     orient_prev, orient_cur;
+      FT_Int     finished = 0;
+
+
+      /* we need at least 4 points to create an inflection point */
+      if ( glyph->contours[n].count < 4 )
+        continue;
+
+      /* compute first segment in contour */
+      first = glyph->contours[n].start;
+
+      start = end = first;
+      do
+      {
+        end = end->next;
+        if ( end == first )
+          goto Skip;
+
+        in_x = end->org_u - start->org_u;
+        in_y = end->org_v - start->org_v;
+
+      } while ( in_x == 0 && in_y == 0 );
+
+      /* extend the segment start whenever possible */
+      before = start;
+      do
+      {
+        do
+        {
+          start  = before;
+          before = before->prev;
+          if ( before == first )
+            goto Skip;
+
+          out_x = start->org_u - before->org_u;
+          out_y = start->org_v - before->org_v;
+
+        } while ( out_x == 0 && out_y == 0 );
+
+        orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y );
+
+      } while ( orient_prev == 0 );
+
+      first = start;
+      in_x  = out_x;
+      in_y  = out_y;
+
+      /* now, process all segments in the contour */
+      do
+      {
+        /* first, extend current segment's end whenever possible */
+        after = end;
+        do
+        {
+          do
+          {
+            end   = after;
+            after = after->next;
+            if ( after == first )
+              finished = 1;
+
+            out_x = after->org_u - end->org_u;
+            out_y = after->org_v - end->org_v;
+
+          } while ( out_x == 0 && out_y == 0 );
+
+          orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y );
+
+        } while ( orient_cur == 0 );
+
+        if ( ( orient_cur ^ orient_prev ) < 0 )
+        {
+          do
+          {
+            psh_point_set_inflex( start );
+            start = start->next;
+          }
+          while ( start != end );
+
+          psh_point_set_inflex( start );
+        }
+
+        start       = end;
+        end         = after;
+        orient_prev = orient_cur;
+        in_x        = out_x;
+        in_y        = out_y;
+
+      } while ( !finished );
+
+    Skip:
+      ;
+    }
+  }
+
+#endif /* COMPUTE_INFLEXS */
+
+
+  static void
+  psh_glyph_done( PSH_Glyph  glyph )
+  {
+    FT_Memory  memory = glyph->memory;
+
+
+    psh_hint_table_done( &glyph->hint_tables[1], memory );
+    psh_hint_table_done( &glyph->hint_tables[0], memory );
+
+    FT_FREE( glyph->points );
+    FT_FREE( glyph->contours );
+
+    glyph->num_points   = 0;
+    glyph->num_contours = 0;
+
+    glyph->memory = 0;
+  }
+
+
+  static int
+  psh_compute_dir( FT_Pos  dx,
+                   FT_Pos  dy )
+  {
+    FT_Pos  ax, ay;
+    int     result = PSH_DIR_NONE;
+
+
+    ax = FT_ABS( dx );
+    ay = FT_ABS( dy );
+
+    if ( ay * 12 < ax )
+    {
+      /* |dy| <<< |dx|  means a near-horizontal segment */
+      result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT;
+    }
+    else if ( ax * 12 < ay )
+    {
+      /* |dx| <<< |dy|  means a near-vertical segment */
+      result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN;
+    }
+
+    return result;
+  }
+
+
+  /* load outline point coordinates into hinter glyph */
+  static void
+  psh_glyph_load_points( PSH_Glyph  glyph,
+                         FT_Int     dimension )
+  {
+    FT_Vector*  vec   = glyph->outline->points;
+    PSH_Point   point = glyph->points;
+    FT_UInt     count = glyph->num_points;
+
+
+    for ( ; count > 0; count--, point++, vec++ )
+    {
+      point->flags2 = 0;
+      point->hint   = NULL;
+      if ( dimension == 0 )
+      {
+        point->org_u = vec->x;
+        point->org_v = vec->y;
+      }
+      else
+      {
+        point->org_u = vec->y;
+        point->org_v = vec->x;
+      }
+
+#ifdef DEBUG_HINTER
+      point->org_x = vec->x;
+      point->org_y = vec->y;
+#endif
+
+    }
+  }
+
+
+  /* save hinted point coordinates back to outline */
+  static void
+  psh_glyph_save_points( PSH_Glyph  glyph,
+                         FT_Int     dimension )
+  {
+    FT_UInt     n;
+    PSH_Point   point = glyph->points;
+    FT_Vector*  vec   = glyph->outline->points;
+    char*       tags  = glyph->outline->tags;
+
+
+    for ( n = 0; n < glyph->num_points; n++ )
+    {
+      if ( dimension == 0 )
+        vec[n].x = point->cur_u;
+      else
+        vec[n].y = point->cur_u;
+
+      if ( psh_point_is_strong( point ) )
+        tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 );
+
+#ifdef DEBUG_HINTER
+
+      if ( dimension == 0 )
+      {
+        point->cur_x   = point->cur_u;
+        point->flags_x = point->flags2 | point->flags;
+      }
+      else
+      {
+        point->cur_y   = point->cur_u;
+        point->flags_y = point->flags2 | point->flags;
+      }
+
+#endif
+
+      point++;
+    }
+  }
+
+
+  static FT_Error
+  psh_glyph_init( PSH_Glyph    glyph,
+                  FT_Outline*  outline,
+                  PS_Hints     ps_hints,
+                  PSH_Globals  globals )
+  {
+    FT_Error   error;
+    FT_Memory  memory;
+
+
+    /* clear all fields */
+    FT_MEM_ZERO( glyph, sizeof ( *glyph ) );
+
+    memory = glyph->memory = globals->memory;
+
+    /* allocate and setup points + contours arrays */
+    if ( FT_NEW_ARRAY( glyph->points,   outline->n_points   ) ||
+         FT_NEW_ARRAY( glyph->contours, outline->n_contours ) )
+      goto Exit;
+
+    glyph->num_points   = outline->n_points;
+    glyph->num_contours = outline->n_contours;
+
+    {
+      FT_UInt      first = 0, next, n;
+      PSH_Point    points  = glyph->points;
+      PSH_Contour  contour = glyph->contours;
+
+
+      for ( n = 0; n < glyph->num_contours; n++ )
+      {
+        FT_Int     count;
+        PSH_Point  point;
+
+
+        next  = outline->contours[n] + 1;
+        count = next - first;
+
+        contour->start = points + first;
+        contour->count = (FT_UInt)count;
+
+        if ( count > 0 )
+        {
+          point = points + first;
+
+          point->prev    = points + next - 1;
+          point->contour = contour;
+
+          for ( ; count > 1; count-- )
+          {
+            point[0].next = point + 1;
+            point[1].prev = point;
+            point++;
+            point->contour = contour;
+          }
+          point->next = points + first;
+        }
+
+        contour++;
+        first = next;
+      }
+    }
+
+    {
+      PSH_Point   points = glyph->points;
+      PSH_Point   point  = points;
+      FT_Vector*  vec    = outline->points;
+      FT_UInt     n;
+
+
+      for ( n = 0; n < glyph->num_points; n++, point++ )
+      {
+        FT_Int  n_prev = (FT_Int)( point->prev - points );
+        FT_Int  n_next = (FT_Int)( point->next - points );
+        FT_Pos  dxi, dyi, dxo, dyo;
+
+
+        if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) )
+          point->flags = PSH_POINT_OFF;
+
+        dxi = vec[n].x - vec[n_prev].x;
+        dyi = vec[n].y - vec[n_prev].y;
+
+        point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi );
+
+        dxo = vec[n_next].x - vec[n].x;
+        dyo = vec[n_next].y - vec[n].y;
+
+        point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo );
+
+        /* detect smooth points */
+        if ( point->flags & PSH_POINT_OFF )
+          point->flags |= PSH_POINT_SMOOTH;
+
+        else if ( point->dir_in == point->dir_out )
+        {
+          if ( point->dir_out != PSH_DIR_NONE           ||
+               psh_corner_is_flat( dxi, dyi, dxo, dyo ) )
+            point->flags |= PSH_POINT_SMOOTH;
+        }
+      }
+    }
+
+    glyph->outline = outline;
+    glyph->globals = globals;
+
+#ifdef COMPUTE_INFLEXS
+    psh_glyph_load_points( glyph, 0 );
+    psh_glyph_compute_inflections( glyph );
+#endif /* COMPUTE_INFLEXS */
+
+    /* now deal with hints tables */
+    error = psh_hint_table_init( &glyph->hint_tables [0],
+                                 &ps_hints->dimension[0].hints,
+                                 &ps_hints->dimension[0].masks,
+                                 &ps_hints->dimension[0].counters,
+                                 memory );
+    if ( error )
+      goto Exit;
+
+    error = psh_hint_table_init( &glyph->hint_tables [1],
+                                 &ps_hints->dimension[1].hints,
+                                 &ps_hints->dimension[1].masks,
+                                 &ps_hints->dimension[1].counters,
+                                 memory );
+    if ( error )
+      goto Exit;
+
+  Exit:
+    return error;
+  }
+
+
+  /* compute all extrema in a glyph for a given dimension */
+  static void
+  psh_glyph_compute_extrema( PSH_Glyph  glyph )
+  {
+    FT_UInt  n;
+
+
+    /* first of all, compute all local extrema */
+    for ( n = 0; n < glyph->num_contours; n++ )
+    {
+      PSH_Point  first = glyph->contours[n].start;
+      PSH_Point  point, before, after;
+
+
+      if ( glyph->contours[n].count == 0 )
+        continue;
+
+      point  = first;
+      before = point;
+      after  = point;
+
+      do
+      {
+        before = before->prev;
+        if ( before == first )
+          goto Skip;
+
+      } while ( before->org_u == point->org_u );
+
+      first = point = before->next;
+
+      for (;;)
+      {
+        after = point;
+        do
+        {
+          after = after->next;
+          if ( after == first )
+            goto Next;
+
+        } while ( after->org_u == point->org_u );
+
+        if ( before->org_u < point->org_u )
+        {
+          if ( after->org_u < point->org_u )
+          {
+            /* local maximum */
+            goto Extremum;
+          }
+        }
+        else /* before->org_u > point->org_u */
+        {
+          if ( after->org_u > point->org_u )
+          {
+            /* local minimum */
+          Extremum:
+            do
+            {
+              psh_point_set_extremum( point );
+              point = point->next;
+
+            } while ( point != after );
+          }
+        }
+
+        before = after->prev;
+        point  = after;
+
+      } /* for  */
+
+    Next:
+      ;
+    }
+
+    /* for each extremum, determine its direction along the */
+    /* orthogonal axis                                      */
+    for ( n = 0; n < glyph->num_points; n++ )
+    {
+      PSH_Point  point, before, after;
+
+
+      point  = &glyph->points[n];
+      before = point;
+      after  = point;
+
+      if ( psh_point_is_extremum( point ) )
+      {
+        do
+        {
+          before = before->prev;
+          if ( before == point )
+            goto Skip;
+
+        } while ( before->org_v == point->org_v );
+
+        do
+        {
+          after = after->next;
+          if ( after == point )
+            goto Skip;
+
+        } while ( after->org_v == point->org_v );
+      }
+
+      if ( before->org_v < point->org_v &&
+           after->org_v  > point->org_v )
+      {
+        psh_point_set_positive( point );
+      }
+      else if ( before->org_v > point->org_v &&
+                after->org_v  < point->org_v )
+      {
+        psh_point_set_negative( point );
+      }
+
+    Skip:
+      ;
+    }
+  }
+
+
+  /* major_dir is the direction for points on the bottom/left of the stem; */
+  /* Points on the top/right of the stem will have a direction of          */
+  /* -major_dir.                                                           */
+
+  static void
+  psh_hint_table_find_strong_points( PSH_Hint_Table  table,
+                                     PSH_Point       point,
+                                     FT_UInt         count,
+                                     FT_Int          threshold,
+                                     FT_Int          major_dir )
+  {
+    PSH_Hint*  sort      = table->sort;
+    FT_UInt    num_hints = table->num_hints;
+
+
+    for ( ; count > 0; count--, point++ )
+    {
+      FT_Int  point_dir = 0;
+      FT_Pos  org_u     = point->org_u;
+
+
+      if ( psh_point_is_strong( point ) )
+        continue;
+
+      if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) )
+        point_dir = point->dir_in;
+
+      else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) )
+        point_dir = point->dir_out;
+
+      if ( point_dir )
+      {
+        if ( point_dir == major_dir )
+        {
+          FT_UInt  nn;
+
+
+          for ( nn = 0; nn < num_hints; nn++ )
+          {
+            PSH_Hint  hint = sort[nn];
+            FT_Pos    d    = org_u - hint->org_pos;
+
+
+            if ( d < threshold && -d < threshold )
+            {
+              psh_point_set_strong( point );
+              point->flags2 |= PSH_POINT_EDGE_MIN;
+              point->hint    = hint;
+              break;
+            }
+          }
+        }
+        else if ( point_dir == -major_dir )
+        {
+          FT_UInt  nn;
+
+
+          for ( nn = 0; nn < num_hints; nn++ )
+          {
+            PSH_Hint  hint = sort[nn];
+            FT_Pos    d    = org_u - hint->org_pos - hint->org_len;
+
+
+            if ( d < threshold && -d < threshold )
+            {
+              psh_point_set_strong( point );
+              point->flags2 |= PSH_POINT_EDGE_MAX;
+              point->hint    = hint;
+              break;
+            }
+          }
+        }
+      }
+
+#if 1
+      else if ( psh_point_is_extremum( point ) )
+      {
+        /* treat extrema as special cases for stem edge alignment */
+        FT_UInt  nn, min_flag, max_flag;
+
+
+        if ( major_dir == PSH_DIR_HORIZONTAL )
+        {
+          min_flag = PSH_POINT_POSITIVE;
+          max_flag = PSH_POINT_NEGATIVE;
+        }
+        else
+        {
+          min_flag = PSH_POINT_NEGATIVE;
+          max_flag = PSH_POINT_POSITIVE;
+        }
+
+        if ( point->flags2 & min_flag )
+        {
+          for ( nn = 0; nn < num_hints; nn++ )
+          {
+            PSH_Hint  hint = sort[nn];
+            FT_Pos    d    = org_u - hint->org_pos;
+
+
+            if ( d < threshold && -d < threshold )
+            {
+              point->flags2 |= PSH_POINT_EDGE_MIN;
+              point->hint    = hint;
+              psh_point_set_strong( point );
+              break;
+            }
+          }
+        }
+        else if ( point->flags2 & max_flag )
+        {
+          for ( nn = 0; nn < num_hints; nn++ )
+          {
+            PSH_Hint  hint = sort[nn];
+            FT_Pos    d    = org_u - hint->org_pos - hint->org_len;
+
+
+            if ( d < threshold && -d < threshold )
+            {
+              point->flags2 |= PSH_POINT_EDGE_MAX;
+              point->hint    = hint;
+              psh_point_set_strong( point );
+              break;
+            }
+          }
+        }
+
+        if ( point->hint == NULL )
+        {
+          for ( nn = 0; nn < num_hints; nn++ )
+          {
+            PSH_Hint  hint = sort[nn];
+
+
+            if ( org_u >= hint->org_pos                 &&
+                org_u <= hint->org_pos + hint->org_len )
+            {
+              point->hint = hint;
+              break;
+            }
+          }
+        }
+      }
+
+#endif /* 1 */
+    }
+  }
+
+
+  /* the accepted shift for strong points in fractional pixels */
+#define PSH_STRONG_THRESHOLD  32
+
+  /* the maximum shift value in font units */
+#define PSH_STRONG_THRESHOLD_MAXIMUM  30
+
+
+  /* find strong points in a glyph */
+  static void
+  psh_glyph_find_strong_points( PSH_Glyph  glyph,
+                                FT_Int     dimension )
+  {
+    /* a point is `strong' if it is located on a stem edge and       */
+    /* has an `in' or `out' tangent parallel to the hint's direction */
+
+    PSH_Hint_Table  table     = &glyph->hint_tables[dimension];
+    PS_Mask         mask      = table->hint_masks->masks;
+    FT_UInt         num_masks = table->hint_masks->num_masks;
+    FT_UInt         first     = 0;
+    FT_Int          major_dir = dimension == 0 ? PSH_DIR_VERTICAL
+                                               : PSH_DIR_HORIZONTAL;
+    PSH_Dimension   dim       = &glyph->globals->dimension[dimension];
+    FT_Fixed        scale     = dim->scale_mult;
+    FT_Int          threshold;
+
+
+    threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale );
+    if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM )
+      threshold = PSH_STRONG_THRESHOLD_MAXIMUM;
+
+    /* process secondary hints to `selected' points */
+    if ( num_masks > 1 && glyph->num_points > 0 )
+    {
+      /* the `endchar' op can reduce the number of points */
+      first = mask->end_point > glyph->num_points
+                ? glyph->num_points
+                : mask->end_point;
+      mask++;
+      for ( ; num_masks > 1; num_masks--, mask++ )
+      {
+        FT_UInt  next;
+        FT_Int   count;
+
+
+        next  = mask->end_point > glyph->num_points
+                  ? glyph->num_points
+                  : mask->end_point;
+        count = next - first;
+        if ( count > 0 )
+        {
+          PSH_Point  point = glyph->points + first;
+
+
+          psh_hint_table_activate_mask( table, mask );
+
+          psh_hint_table_find_strong_points( table, point, count,
+                                             threshold, major_dir );
+        }
+        first = next;
+      }
+    }
+
+    /* process primary hints for all points */
+    if ( num_masks == 1 )
+    {
+      FT_UInt    count = glyph->num_points;
+      PSH_Point  point = glyph->points;
+
+
+      psh_hint_table_activate_mask( table, table->hint_masks->masks );
+
+      psh_hint_table_find_strong_points( table, point, count,
+                                         threshold, major_dir );
+    }
+
+    /* now, certain points may have been attached to a hint and */
+    /* not marked as strong; update their flags then            */
+    {
+      FT_UInt    count = glyph->num_points;
+      PSH_Point  point = glyph->points;
+
+
+      for ( ; count > 0; count--, point++ )
+        if ( point->hint && !psh_point_is_strong( point ) )
+          psh_point_set_strong( point );
+    }
+  }
+
+
+  /* find points in a glyph which are in a blue zone and have `in' or */
+  /* `out' tangents parallel to the horizontal axis                   */
+  static void
+  psh_glyph_find_blue_points( PSH_Blues  blues,
+                              PSH_Glyph  glyph )
+  {
+    PSH_Blue_Table  table;
+    PSH_Blue_Zone   zone;
+    FT_UInt         glyph_count = glyph->num_points;
+    FT_UInt         blue_count;
+    PSH_Point       point = glyph->points;
+
+
+    for ( ; glyph_count > 0; glyph_count--, point++ )
+    {
+      FT_Pos  y;
+
+
+      /* check tangents */
+      if ( !PSH_DIR_COMPARE( point->dir_in,  PSH_DIR_HORIZONTAL ) &&
+           !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) )
+        continue;
+
+      /* skip strong points */
+      if ( psh_point_is_strong( point ) )
+        continue;
+
+      y = point->org_u;
+
+      /* look up top zones */
+      table      = &blues->normal_top;
+      blue_count = table->count;
+      zone       = table->zones;
+
+      for ( ; blue_count > 0; blue_count--, zone++ )
+      {
+        FT_Pos  delta = y - zone->org_bottom;
+
+
+        if ( delta < -blues->blue_fuzz )
+          break;
+
+        if ( y <= zone->org_top + blues->blue_fuzz )
+          if ( blues->no_overshoots || delta <= blues->blue_threshold )
+          {
+            point->cur_u = zone->cur_bottom;
+            psh_point_set_strong( point );
+            psh_point_set_fitted( point );
+          }
+      }
+
+      /* look up bottom zones */
+      table      = &blues->normal_bottom;
+      blue_count = table->count;
+      zone       = table->zones + blue_count - 1;
+
+      for ( ; blue_count > 0; blue_count--, zone-- )
+      {
+        FT_Pos  delta = zone->org_top - y;
+
+
+        if ( delta < -blues->blue_fuzz )
+          break;
+
+        if ( y >= zone->org_bottom - blues->blue_fuzz )
+          if ( blues->no_overshoots || delta < blues->blue_threshold )
+          {
+            point->cur_u = zone->cur_top;
+            psh_point_set_strong( point );
+            psh_point_set_fitted( point );
+          }
+      }
+    }
+  }
+
+
+  /* interpolate strong points with the help of hinted coordinates */
+  static void
+  psh_glyph_interpolate_strong_points( PSH_Glyph  glyph,
+                                       FT_Int     dimension )
+  {
+    PSH_Dimension  dim   = &glyph->globals->dimension[dimension];
+    FT_Fixed       scale = dim->scale_mult;
+
+    FT_UInt        count = glyph->num_points;
+    PSH_Point      point = glyph->points;
+
+
+    for ( ; count > 0; count--, point++ )
+    {
+      PSH_Hint  hint = point->hint;
+
+
+      if ( hint )
+      {
+        FT_Pos  delta;
+
+
+        if ( psh_point_is_edge_min( point ) )
+          point->cur_u = hint->cur_pos;
+
+        else if ( psh_point_is_edge_max( point ) )
+          point->cur_u = hint->cur_pos + hint->cur_len;
+
+        else
+        {
+          delta = point->org_u - hint->org_pos;
+
+          if ( delta <= 0 )
+            point->cur_u = hint->cur_pos + FT_MulFix( delta, scale );
+
+          else if ( delta >= hint->org_len )
+            point->cur_u = hint->cur_pos + hint->cur_len +
+                             FT_MulFix( delta - hint->org_len, scale );
+
+          else /* hint->org_len > 0 */
+            point->cur_u = hint->cur_pos +
+                             FT_MulDiv( delta, hint->cur_len,
+                                        hint->org_len );
+        }
+        psh_point_set_fitted( point );
+      }
+    }
+  }
+
+
+#define  PSH_MAX_STRONG_INTERNAL  16
+
+  static void
+  psh_glyph_interpolate_normal_points( PSH_Glyph  glyph,
+                                       FT_Int     dimension )
+  {
+
+#if 1
+    /* first technique: a point is strong if it is a local extremum */
+
+    PSH_Dimension  dim    = &glyph->globals->dimension[dimension];
+    FT_Fixed       scale  = dim->scale_mult;
+    FT_Memory      memory = glyph->memory;
+
+    PSH_Point*     strongs     = NULL;
+    PSH_Point      strongs_0[PSH_MAX_STRONG_INTERNAL];
+    FT_UInt        num_strongs = 0;
+
+    PSH_Point      points = glyph->points;
+    PSH_Point      points_end = points + glyph->num_points;
+    PSH_Point      point;
+
+
+    /* first count the number of strong points */
+    for ( point = points; point < points_end; point++ )
+    {
+      if ( psh_point_is_strong( point ) )
+        num_strongs++;
+    }
+
+    if ( num_strongs == 0 )  /* nothing to do here */
+      return;
+
+    /* allocate an array to store a list of points, */
+    /* stored in increasing org_u order             */
+    if ( num_strongs <= PSH_MAX_STRONG_INTERNAL )
+      strongs = strongs_0;
+    else
+    {
+      FT_Error  error;
+
+
+      if ( FT_NEW_ARRAY( strongs, num_strongs ) )
+        return;
+    }
+
+    num_strongs = 0;
+    for ( point = points; point < points_end; point++ )
+    {
+      PSH_Point*  insert;
+
+
+      if ( !psh_point_is_strong( point ) )
+        continue;
+
+      for ( insert = strongs + num_strongs; insert > strongs; insert-- )
+      {
+        if ( insert[-1]->org_u <= point->org_u )
+          break;
+
+        insert[0] = insert[-1];
+      }
+      insert[0] = point;
+      num_strongs++;
+    }
+
+    /* now try to interpolate all normal points */
+    for ( point = points; point < points_end; point++ )
+    {
+      if ( psh_point_is_strong( point ) )
+        continue;
+
+      /* sometimes, some local extrema are smooth points */
+      if ( psh_point_is_smooth( point ) )
+      {
+        if ( point->dir_in == PSH_DIR_NONE   ||
+             point->dir_in != point->dir_out )
+          continue;
+
+        if ( !psh_point_is_extremum( point ) &&
+             !psh_point_is_inflex( point )   )
+          continue;
+
+        point->flags &= ~PSH_POINT_SMOOTH;
+      }
+
+      /* find best enclosing point coordinates then interpolate */
+      {
+        PSH_Point   before, after;
+        FT_UInt     nn;
+
+
+        for ( nn = 0; nn < num_strongs; nn++ )
+          if ( strongs[nn]->org_u > point->org_u )
+            break;
+
+        if ( nn == 0 )  /* point before the first strong point */
+        {
+          after = strongs[0];
+
+          point->cur_u = after->cur_u +
+                           FT_MulFix( point->org_u - after->org_u,
+                                      scale );
+        }
+        else
+        {
+          before = strongs[nn - 1];
+
+          for ( nn = num_strongs; nn > 0; nn-- )
+            if ( strongs[nn - 1]->org_u < point->org_u )
+              break;
+
+          if ( nn == num_strongs )  /* point is after last strong point */
+          {
+            before = strongs[nn - 1];
+
+            point->cur_u = before->cur_u +
+                             FT_MulFix( point->org_u - before->org_u,
+                                        scale );
+          }
+          else
+          {
+            FT_Pos  u;
+
+
+            after = strongs[nn];
+
+            /* now interpolate point between before and after */
+            u = point->org_u;
+
+            if ( u == before->org_u )
+              point->cur_u = before->cur_u;
+
+            else if ( u == after->org_u )
+              point->cur_u = after->cur_u;
+
+            else
+              point->cur_u = before->cur_u +
+                               FT_MulDiv( u - before->org_u,
+                                          after->cur_u - before->cur_u,
+                                          after->org_u - before->org_u );
+          }
+        }
+        psh_point_set_fitted( point );
+      }
+    }
+
+    if ( strongs != strongs_0 )
+      FT_FREE( strongs );
+
+#endif /* 1 */
+
+  }
+
+
+  /* interpolate other points */
+  static void
+  psh_glyph_interpolate_other_points( PSH_Glyph  glyph,
+                                      FT_Int     dimension )
+  {
+    PSH_Dimension  dim          = &glyph->globals->dimension[dimension];
+    FT_Fixed       scale        = dim->scale_mult;
+    FT_Fixed       delta        = dim->scale_delta;
+    PSH_Contour    contour      = glyph->contours;
+    FT_UInt        num_contours = glyph->num_contours;
+
+
+    for ( ; num_contours > 0; num_contours--, contour++ )
+    {
+      PSH_Point  start = contour->start;
+      PSH_Point  first, next, point;
+      FT_UInt    fit_count;
+
+
+      /* count the number of strong points in this contour */
+      next      = start + contour->count;
+      fit_count = 0;
+      first     = 0;
+
+      for ( point = start; point < next; point++ )
+        if ( psh_point_is_fitted( point ) )
+        {
+          if ( !first )
+            first = point;
+
+          fit_count++;
+        }
+
+      /* if there are less than 2 fitted points in the contour, we */
+      /* simply scale and eventually translate the contour points  */
+      if ( fit_count < 2 )
+      {
+        if ( fit_count == 1 )
+          delta = first->cur_u - FT_MulFix( first->org_u, scale );
+
+        for ( point = start; point < next; point++ )
+          if ( point != first )
+            point->cur_u = FT_MulFix( point->org_u, scale ) + delta;
+
+        goto Next_Contour;
+      }
+
+      /* there are more than 2 strong points in this contour; we */
+      /* need to interpolate weak points between them            */
+      start = first;
+      do
+      {
+        point = first;
+
+        /* skip consecutive fitted points */
+        for (;;)
+        {
+          next = first->next;
+          if ( next == start )
+            goto Next_Contour;
+
+          if ( !psh_point_is_fitted( next ) )
+            break;
+
+          first = next;
+        }
+
+        /* find next fitted point after unfitted one */
+        for (;;)
+        {
+          next = next->next;
+          if ( psh_point_is_fitted( next ) )
+            break;
+        }
+
+        /* now interpolate between them */
+        {
+          FT_Pos    org_a, org_ab, cur_a, cur_ab;
+          FT_Pos    org_c, org_ac, cur_c;
+          FT_Fixed  scale_ab;
+
+
+          if ( first->org_u <= next->org_u )
+          {
+            org_a  = first->org_u;
+            cur_a  = first->cur_u;
+            org_ab = next->org_u - org_a;
+            cur_ab = next->cur_u - cur_a;
+          }
+          else
+          {
+            org_a  = next->org_u;
+            cur_a  = next->cur_u;
+            org_ab = first->org_u - org_a;
+            cur_ab = first->cur_u - cur_a;
+          }
+
+          scale_ab = 0x10000L;
+          if ( org_ab > 0 )
+            scale_ab = FT_DivFix( cur_ab, org_ab );
+
+          point = first->next;
+          do
+          {
+            org_c  = point->org_u;
+            org_ac = org_c - org_a;
+
+            if ( org_ac <= 0 )
+            {
+              /* on the left of the interpolation zone */
+              cur_c = cur_a + FT_MulFix( org_ac, scale );
+            }
+            else if ( org_ac >= org_ab )
+            {
+              /* on the right on the interpolation zone */
+              cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale );
+            }
+            else
+            {
+              /* within the interpolation zone */
+              cur_c = cur_a + FT_MulFix( org_ac, scale_ab );
+            }
+
+            point->cur_u = cur_c;
+
+            point = point->next;
+
+          } while ( point != next );
+        }
+
+        /* keep going until all points in the contours have been processed */
+        first = next;
+
+      } while ( first != start );
+
+    Next_Contour:
+      ;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     HIGH-LEVEL INTERFACE                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_Error
+  ps_hints_apply( PS_Hints        ps_hints,
+                  FT_Outline*     outline,
+                  PSH_Globals     globals,
+                  FT_Render_Mode  hint_mode )
+  {
+    PSH_GlyphRec  glyphrec;
+    PSH_Glyph     glyph = &glyphrec;
+    FT_Error      error;
+#ifdef DEBUG_HINTER
+    FT_Memory     memory;
+#endif
+    FT_Int        dimension;
+
+
+    /* something to do? */
+    if ( outline->n_points == 0 || outline->n_contours == 0 )
+      return FT_Err_Ok;
+
+#ifdef DEBUG_HINTER
+
+    memory = globals->memory;
+
+    if ( ps_debug_glyph )
+    {
+      psh_glyph_done( ps_debug_glyph );
+      FT_FREE( ps_debug_glyph );
+    }
+
+    if ( FT_NEW( glyph ) )
+      return error;
+
+    ps_debug_glyph = glyph;
+
+#endif /* DEBUG_HINTER */
+
+    error = psh_glyph_init( glyph, outline, ps_hints, globals );
+    if ( error )
+      goto Exit;
+
+    /* try to optimize the y_scale so that the top of non-capital letters
+     * is aligned on a pixel boundary whenever possible
+     */
+    {
+      PSH_Dimension  dim_x = &glyph->globals->dimension[0];
+      PSH_Dimension  dim_y = &glyph->globals->dimension[1];
+
+      FT_Fixed  x_scale = dim_x->scale_mult;
+      FT_Fixed  y_scale = dim_y->scale_mult;
+
+      FT_Fixed  old_x_scale = x_scale;
+      FT_Fixed  old_y_scale = y_scale;
+
+      FT_Fixed  scaled;
+      FT_Fixed  fitted;
+
+      FT_Bool  rescale = FALSE;
+
+
+      scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale );
+      fitted = FT_PIX_ROUND( scaled );
+
+      if ( fitted != 0 && scaled != fitted )
+      {
+        rescale = TRUE;
+
+        y_scale = FT_MulDiv( y_scale, fitted, scaled );
+
+        if ( fitted < scaled )
+          x_scale -= x_scale / 50;
+
+        psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 );
+      }
+
+      glyph->do_horz_hints = 1;
+      glyph->do_vert_hints = 1;
+
+      glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO ||
+                                         hint_mode == FT_RENDER_MODE_LCD  );
+
+      glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO  ||
+                                         hint_mode == FT_RENDER_MODE_LCD_V );
+
+      glyph->do_stem_adjust   = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT );
+
+      for ( dimension = 0; dimension < 2; dimension++ )
+      {
+        /* load outline coordinates into glyph */
+        psh_glyph_load_points( glyph, dimension );
+
+        /* compute local extrema */
+        psh_glyph_compute_extrema( glyph );
+
+        /* compute aligned stem/hints positions */
+        psh_hint_table_align_hints( &glyph->hint_tables[dimension],
+                                    glyph->globals,
+                                    dimension,
+                                    glyph );
+
+        /* find strong points, align them, then interpolate others */
+        psh_glyph_find_strong_points( glyph, dimension );
+        if ( dimension == 1 )
+          psh_glyph_find_blue_points( &globals->blues, glyph );
+        psh_glyph_interpolate_strong_points( glyph, dimension );
+        psh_glyph_interpolate_normal_points( glyph, dimension );
+        psh_glyph_interpolate_other_points( glyph, dimension );
+
+        /* save hinted coordinates back to outline */
+        psh_glyph_save_points( glyph, dimension );
+
+        if ( rescale )
+          psh_globals_set_scale( glyph->globals,
+                                 old_x_scale, old_y_scale, 0, 0 );
+      }
+    }
+
+  Exit:
+
+#ifndef DEBUG_HINTER
+    psh_glyph_done( glyph );
+#endif
+
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.h
new file mode 100644
index 0000000..c70f31e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.h
@@ -0,0 +1,246 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshalgo.h                                                              */
+/*                                                                         */
+/*    PostScript hinting algorithm (specification).                        */
+/*                                                                         */
+/*  Copyright 2001-2003, 2008, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSHALGO_H__
+#define __PSHALGO_H__
+
+
+#include "pshrec.h"
+#include "pshglob.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* handle to Hint structure */
+  typedef struct PSH_HintRec_*  PSH_Hint;
+
+  /* hint bit-flags */
+  typedef enum  PSH_Hint_Flags_
+  {
+    PSH_HINT_GHOST  = PS_HINT_FLAG_GHOST,
+    PSH_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM,
+    PSH_HINT_ACTIVE = 4,
+    PSH_HINT_FITTED = 8
+
+  } PSH_Hint_Flags;
+
+
+#define psh_hint_is_active( x )  ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 )
+#define psh_hint_is_ghost( x )   ( ( (x)->flags & PSH_HINT_GHOST  ) != 0 )
+#define psh_hint_is_fitted( x )  ( ( (x)->flags & PSH_HINT_FITTED ) != 0 )
+
+#define psh_hint_activate( x )    (x)->flags |=  PSH_HINT_ACTIVE
+#define psh_hint_deactivate( x )  (x)->flags &= ~PSH_HINT_ACTIVE
+#define psh_hint_set_fitted( x )  (x)->flags |=  PSH_HINT_FITTED
+
+  /* hint structure */
+  typedef struct  PSH_HintRec_
+  {
+    FT_Int    org_pos;
+    FT_Int    org_len;
+    FT_Pos    cur_pos;
+    FT_Pos    cur_len;
+    FT_UInt   flags;
+    PSH_Hint  parent;
+    FT_Int    order;
+
+  } PSH_HintRec;
+
+
+  /* this is an interpolation zone used for strong points;  */
+  /* weak points are interpolated according to their strong */
+  /* neighbours                                             */
+  typedef struct  PSH_ZoneRec_
+  {
+    FT_Fixed  scale;
+    FT_Fixed  delta;
+    FT_Pos    min;
+    FT_Pos    max;
+
+  } PSH_ZoneRec, *PSH_Zone;
+
+
+  typedef struct  PSH_Hint_TableRec_
+  {
+    FT_UInt        max_hints;
+    FT_UInt        num_hints;
+    PSH_Hint       hints;
+    PSH_Hint*      sort;
+    PSH_Hint*      sort_global;
+    FT_UInt        num_zones;
+    PSH_ZoneRec*   zones;
+    PSH_Zone       zone;
+    PS_Mask_Table  hint_masks;
+    PS_Mask_Table  counter_masks;
+
+  } PSH_Hint_TableRec, *PSH_Hint_Table;
+
+
+  typedef struct PSH_PointRec_*    PSH_Point;
+  typedef struct PSH_ContourRec_*  PSH_Contour;
+
+  enum
+  {
+    PSH_DIR_NONE  =  4,
+    PSH_DIR_UP    = -1,
+    PSH_DIR_DOWN  =  1,
+    PSH_DIR_LEFT  = -2,
+    PSH_DIR_RIGHT =  2
+  };
+
+#define PSH_DIR_HORIZONTAL  2
+#define PSH_DIR_VERTICAL    1
+
+#define PSH_DIR_COMPARE( d1, d2 )   ( (d1) == (d2) || (d1) == -(d2) )
+#define PSH_DIR_IS_HORIZONTAL( d )  PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL )
+#define PSH_DIR_IS_VERTICAL( d )    PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL )
+
+
+ /* the following bit-flags are computed once by the glyph */
+ /* analyzer, for both dimensions                          */
+  enum
+  {
+    PSH_POINT_OFF    = 1,   /* point is off the curve */
+    PSH_POINT_SMOOTH = 2,   /* point is smooth        */
+    PSH_POINT_INFLEX = 4    /* point is inflection    */
+  };
+
+#define psh_point_is_smooth( p )  ( (p)->flags & PSH_POINT_SMOOTH )
+#define psh_point_is_off( p )     ( (p)->flags & PSH_POINT_OFF    )
+#define psh_point_is_inflex( p )  ( (p)->flags & PSH_POINT_INFLEX )
+
+#define psh_point_set_smooth( p )  (p)->flags |= PSH_POINT_SMOOTH
+#define psh_point_set_off( p )     (p)->flags |= PSH_POINT_OFF
+#define psh_point_set_inflex( p )  (p)->flags |= PSH_POINT_INFLEX
+
+  /* the following bit-flags are re-computed for each dimension */
+  enum
+  {
+    PSH_POINT_STRONG   = 16,   /* point is strong                           */
+    PSH_POINT_FITTED   = 32,   /* point is already fitted                   */
+    PSH_POINT_EXTREMUM = 64,   /* point is local extremum                   */
+    PSH_POINT_POSITIVE = 128,  /* extremum has positive contour flow        */
+    PSH_POINT_NEGATIVE = 256,  /* extremum has negative contour flow        */
+    PSH_POINT_EDGE_MIN = 512,  /* point is aligned to left/bottom stem edge */
+    PSH_POINT_EDGE_MAX = 1024  /* point is aligned to top/right stem edge   */
+  };
+
+#define psh_point_is_strong( p )    ( (p)->flags2 & PSH_POINT_STRONG )
+#define psh_point_is_fitted( p )    ( (p)->flags2 & PSH_POINT_FITTED )
+#define psh_point_is_extremum( p )  ( (p)->flags2 & PSH_POINT_EXTREMUM )
+#define psh_point_is_positive( p )  ( (p)->flags2 & PSH_POINT_POSITIVE )
+#define psh_point_is_negative( p )  ( (p)->flags2 & PSH_POINT_NEGATIVE )
+#define psh_point_is_edge_min( p )  ( (p)->flags2 & PSH_POINT_EDGE_MIN )
+#define psh_point_is_edge_max( p )  ( (p)->flags2 & PSH_POINT_EDGE_MAX )
+
+#define psh_point_set_strong( p )    (p)->flags2 |= PSH_POINT_STRONG
+#define psh_point_set_fitted( p )    (p)->flags2 |= PSH_POINT_FITTED
+#define psh_point_set_extremum( p )  (p)->flags2 |= PSH_POINT_EXTREMUM
+#define psh_point_set_positive( p )  (p)->flags2 |= PSH_POINT_POSITIVE
+#define psh_point_set_negative( p )  (p)->flags2 |= PSH_POINT_NEGATIVE
+#define psh_point_set_edge_min( p )  (p)->flags2 |= PSH_POINT_EDGE_MIN
+#define psh_point_set_edge_max( p )  (p)->flags2 |= PSH_POINT_EDGE_MAX
+
+
+  typedef struct  PSH_PointRec_
+  {
+    PSH_Point    prev;
+    PSH_Point    next;
+    PSH_Contour  contour;
+    FT_UInt      flags;
+    FT_UInt      flags2;
+    FT_Char      dir_in;
+    FT_Char      dir_out;
+    PSH_Hint     hint;
+    FT_Pos       org_u;
+    FT_Pos       org_v;
+    FT_Pos       cur_u;
+#ifdef DEBUG_HINTER
+    FT_Pos       org_x;
+    FT_Pos       cur_x;
+    FT_Pos       org_y;
+    FT_Pos       cur_y;
+    FT_UInt      flags_x;
+    FT_UInt      flags_y;
+#endif
+
+  } PSH_PointRec;
+
+
+  typedef struct  PSH_ContourRec_
+  {
+    PSH_Point  start;
+    FT_UInt    count;
+
+  } PSH_ContourRec;
+
+
+  typedef struct  PSH_GlyphRec_
+  {
+    FT_UInt            num_points;
+    FT_UInt            num_contours;
+
+    PSH_Point          points;
+    PSH_Contour        contours;
+
+    FT_Memory          memory;
+    FT_Outline*        outline;
+    PSH_Globals        globals;
+    PSH_Hint_TableRec  hint_tables[2];
+
+    FT_Bool            vertical;
+    FT_Int             major_dir;
+    FT_Int             minor_dir;
+
+    FT_Bool            do_horz_hints;
+    FT_Bool            do_vert_hints;
+    FT_Bool            do_horz_snapping;
+    FT_Bool            do_vert_snapping;
+    FT_Bool            do_stem_adjust;
+
+  } PSH_GlyphRec, *PSH_Glyph;
+
+
+#ifdef DEBUG_HINTER
+  extern PSH_Hint_Table  ps_debug_hint_table;
+
+  typedef void
+  (*PSH_HintFunc)( PSH_Hint  hint,
+                   FT_Bool   vertical );
+
+  extern PSH_HintFunc    ps_debug_hint_func;
+
+  extern PSH_Glyph       ps_debug_glyph;
+#endif
+
+
+  extern FT_Error
+  ps_hints_apply( PS_Hints        ps_hints,
+                  FT_Outline*     outline,
+                  PSH_Globals     globals,
+                  FT_Render_Mode  hint_mode );
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHALGO_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.c
new file mode 100644
index 0000000..9e086dc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.c
@@ -0,0 +1,805 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshglob.c                                                              */
+/*                                                                         */
+/*    PostScript hinter global hinting management (body).                  */
+/*    Inspired by the new auto-hinter module.                              */
+/*                                                                         */
+/*  Copyright 2001-2004, 2006, 2010, 2012 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used        */
+/*  modified and distributed under the terms of the FreeType project       */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "pshglob.h"
+
+#ifdef DEBUG_HINTER
+  PSH_Globals  ps_debug_globals = 0;
+#endif
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       STANDARD WIDTHS                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* scale the widths/heights table */
+  static void
+  psh_globals_scale_widths( PSH_Globals  globals,
+                            FT_UInt      direction )
+  {
+    PSH_Dimension  dim   = &globals->dimension[direction];
+    PSH_Widths     stdw  = &dim->stdw;
+    FT_UInt        count = stdw->count;
+    PSH_Width      width = stdw->widths;
+    PSH_Width      stand = width;               /* standard width/height */
+    FT_Fixed       scale = dim->scale_mult;
+
+
+    if ( count > 0 )
+    {
+      width->cur = FT_MulFix( width->org, scale );
+      width->fit = FT_PIX_ROUND( width->cur );
+
+      width++;
+      count--;
+
+      for ( ; count > 0; count--, width++ )
+      {
+        FT_Pos  w, dist;
+
+
+        w    = FT_MulFix( width->org, scale );
+        dist = w - stand->cur;
+
+        if ( dist < 0 )
+          dist = -dist;
+
+        if ( dist < 128 )
+          w = stand->cur;
+
+        width->cur = w;
+        width->fit = FT_PIX_ROUND( w );
+      }
+    }
+  }
+
+
+#if 0
+
+  /* org_width is is font units, result in device pixels, 26.6 format */
+  FT_LOCAL_DEF( FT_Pos )
+  psh_dimension_snap_width( PSH_Dimension  dimension,
+                            FT_Int         org_width )
+  {
+    FT_UInt  n;
+    FT_Pos   width     = FT_MulFix( org_width, dimension->scale_mult );
+    FT_Pos   best      = 64 + 32 + 2;
+    FT_Pos   reference = width;
+
+
+    for ( n = 0; n < dimension->stdw.count; n++ )
+    {
+      FT_Pos  w;
+      FT_Pos  dist;
+
+
+      w = dimension->stdw.widths[n].cur;
+      dist = width - w;
+      if ( dist < 0 )
+        dist = -dist;
+      if ( dist < best )
+      {
+        best      = dist;
+        reference = w;
+      }
+    }
+
+    if ( width >= reference )
+    {
+      width -= 0x21;
+      if ( width < reference )
+        width = reference;
+    }
+    else
+    {
+      width += 0x21;
+      if ( width > reference )
+        width = reference;
+    }
+
+    return width;
+  }
+
+#endif /* 0 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       BLUE ZONES                              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  psh_blues_set_zones_0( PSH_Blues       target,
+                         FT_Bool         is_others,
+                         FT_UInt         read_count,
+                         FT_Short*       read,
+                         PSH_Blue_Table  top_table,
+                         PSH_Blue_Table  bot_table )
+  {
+    FT_UInt  count_top = top_table->count;
+    FT_UInt  count_bot = bot_table->count;
+    FT_Bool  first     = 1;
+
+    FT_UNUSED( target );
+
+
+    for ( ; read_count > 1; read_count -= 2 )
+    {
+      FT_Int         reference, delta;
+      FT_UInt        count;
+      PSH_Blue_Zone  zones, zone;
+      FT_Bool        top;
+
+
+      /* read blue zone entry, and select target top/bottom zone */
+      top = 0;
+      if ( first || is_others )
+      {
+        reference = read[1];
+        delta     = read[0] - reference;
+
+        zones = bot_table->zones;
+        count = count_bot;
+        first = 0;
+      }
+      else
+      {
+        reference = read[0];
+        delta     = read[1] - reference;
+
+        zones = top_table->zones;
+        count = count_top;
+        top   = 1;
+      }
+
+      /* insert into sorted table */
+      zone = zones;
+      for ( ; count > 0; count--, zone++ )
+      {
+        if ( reference < zone->org_ref )
+          break;
+
+        if ( reference == zone->org_ref )
+        {
+          FT_Int  delta0 = zone->org_delta;
+
+
+          /* we have two zones on the same reference position -- */
+          /* only keep the largest one                           */
+          if ( delta < 0 )
+          {
+            if ( delta < delta0 )
+              zone->org_delta = delta;
+          }
+          else
+          {
+            if ( delta > delta0 )
+              zone->org_delta = delta;
+          }
+          goto Skip;
+        }
+      }
+
+      for ( ; count > 0; count-- )
+        zone[count] = zone[count-1];
+
+      zone->org_ref   = reference;
+      zone->org_delta = delta;
+
+      if ( top )
+        count_top++;
+      else
+        count_bot++;
+
+    Skip:
+      read += 2;
+    }
+
+    top_table->count = count_top;
+    bot_table->count = count_bot;
+  }
+
+
+  /* Re-read blue zones from the original fonts and store them into out */
+  /* private structure.  This function re-orders, sanitizes and         */
+  /* fuzz-expands the zones as well.                                    */
+  static void
+  psh_blues_set_zones( PSH_Blues  target,
+                       FT_UInt    count,
+                       FT_Short*  blues,
+                       FT_UInt    count_others,
+                       FT_Short*  other_blues,
+                       FT_Int     fuzz,
+                       FT_Int     family )
+  {
+    PSH_Blue_Table  top_table, bot_table;
+    FT_Int          count_top, count_bot;
+
+
+    if ( family )
+    {
+      top_table = &target->family_top;
+      bot_table = &target->family_bottom;
+    }
+    else
+    {
+      top_table = &target->normal_top;
+      bot_table = &target->normal_bottom;
+    }
+
+    /* read the input blue zones, and build two sorted tables  */
+    /* (one for the top zones, the other for the bottom zones) */
+    top_table->count = 0;
+    bot_table->count = 0;
+
+    /* first, the blues */
+    psh_blues_set_zones_0( target, 0,
+                           count, blues, top_table, bot_table );
+    psh_blues_set_zones_0( target, 1,
+                           count_others, other_blues, top_table, bot_table );
+
+    count_top = top_table->count;
+    count_bot = bot_table->count;
+
+    /* sanitize top table */
+    if ( count_top > 0 )
+    {
+      PSH_Blue_Zone  zone = top_table->zones;
+
+
+      for ( count = count_top; count > 0; count--, zone++ )
+      {
+        FT_Int  delta;
+
+
+        if ( count > 1 )
+        {
+          delta = zone[1].org_ref - zone[0].org_ref;
+          if ( zone->org_delta > delta )
+            zone->org_delta = delta;
+        }
+
+        zone->org_bottom = zone->org_ref;
+        zone->org_top    = zone->org_delta + zone->org_ref;
+      }
+    }
+
+    /* sanitize bottom table */
+    if ( count_bot > 0 )
+    {
+      PSH_Blue_Zone  zone = bot_table->zones;
+
+
+      for ( count = count_bot; count > 0; count--, zone++ )
+      {
+        FT_Int  delta;
+
+
+        if ( count > 1 )
+        {
+          delta = zone[0].org_ref - zone[1].org_ref;
+          if ( zone->org_delta < delta )
+            zone->org_delta = delta;
+        }
+
+        zone->org_top    = zone->org_ref;
+        zone->org_bottom = zone->org_delta + zone->org_ref;
+		// XYQ 2006-3-11: FT PS hinter doesn't process wide zone well (all points shrinked to one horizontal line)
+		// therefore, we have to do some nasty thing here, because some fonts do give wide bottom zones.
+		// Our principle is to preserve the bottom line
+		// TEST DOC: bug#395 csl.pdf  letters "y", "j", etc.
+		if (zone->org_top - zone->org_bottom > 10) {
+			zone->org_top = zone->org_bottom;
+			zone->org_delta = 0;
+		}
+      }
+    }
+
+    /* expand top and bottom tables with blue fuzz */
+    {
+      FT_Int         dim, top, bot, delta;
+      PSH_Blue_Zone  zone;
+
+
+      zone  = top_table->zones;
+      count = count_top;
+
+      for ( dim = 1; dim >= 0; dim-- )
+      {
+        if ( count > 0 )
+        {
+          /* expand the bottom of the lowest zone normally */
+          zone->org_bottom -= fuzz;
+
+          /* expand the top and bottom of intermediate zones;    */
+          /* checking that the interval is smaller than the fuzz */
+          top = zone->org_top;
+
+          for ( count--; count > 0; count-- )
+          {
+            bot   = zone[1].org_bottom;
+            delta = bot - top;
+
+            if ( delta < 2 * fuzz )
+              zone[0].org_top = zone[1].org_bottom = top + delta / 2;
+            else
+            {
+              zone[0].org_top    = top + fuzz;
+              zone[1].org_bottom = bot - fuzz;
+            }
+
+            zone++;
+            top = zone->org_top;
+          }
+
+          /* expand the top of the highest zone normally */
+          zone->org_top = top + fuzz;
+        }
+        zone  = bot_table->zones;
+        count = count_bot;
+      }
+    }
+  }
+
+
+  /* reset the blues table when the device transform changes */
+  static void
+  psh_blues_scale_zones( PSH_Blues  blues,
+                         FT_Fixed   scale,
+                         FT_Pos     delta )
+  {
+    FT_UInt         count;
+    FT_UInt         num;
+    PSH_Blue_Table  table = 0;
+
+    /*                                                        */
+    /* Determine whether we need to suppress overshoots or    */
+    /* not.  We simply need to compare the vertical scale     */
+    /* parameter to the raw bluescale value.  Here is why:    */
+    /*                                                        */
+    /*   We need to suppress overshoots for all pointsizes.   */
+    /*   At 300dpi that satisfies:                            */
+    /*                                                        */
+    /*      pointsize < 240*bluescale + 0.49                  */
+    /*                                                        */
+    /*   This corresponds to:                                 */
+    /*                                                        */
+    /*      pixelsize < 1000*bluescale + 49/24                */
+    /*                                                        */
+    /*      scale*EM_Size < 1000*bluescale + 49/24            */
+    /*                                                        */
+    /*   However, for normal Type 1 fonts, EM_Size is 1000!   */
+    /*   We thus only check:                                  */
+    /*                                                        */
+    /*      scale < bluescale + 49/24000                      */
+    /*                                                        */
+    /*   which we shorten to                                  */
+    /*                                                        */
+    /*      "scale < bluescale"                               */
+    /*                                                        */
+    /* Note that `blue_scale' is stored 1000 times its real   */
+    /* value, and that `scale' converts from font units to    */
+    /* fractional pixels.                                     */
+    /*                                                        */
+
+    /* 1000 / 64 = 125 / 8 */
+    if ( scale >= 0x20C49BAL )
+      blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 );
+    else
+      blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 );
+
+    /*                                                        */
+    /*  The blue threshold is the font units distance under   */
+    /*  which overshoots are suppressed due to the BlueShift  */
+    /*  even if the scale is greater than BlueScale.          */
+    /*                                                        */
+    /*  It is the smallest distance such that                 */
+    /*                                                        */
+    /*    dist <= BlueShift && dist*scale <= 0.5 pixels       */
+    /*                                                        */
+    {
+      FT_Int  threshold = blues->blue_shift;
+
+
+      while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 )
+        threshold--;
+
+      blues->blue_threshold = threshold;
+    }
+
+    for ( num = 0; num < 4; num++ )
+    {
+      PSH_Blue_Zone  zone;
+
+
+      switch ( num )
+      {
+      case 0:
+        table = &blues->normal_top;
+        break;
+      case 1:
+        table = &blues->normal_bottom;
+        break;
+      case 2:
+        table = &blues->family_top;
+        break;
+      default:
+        table = &blues->family_bottom;
+        break;
+      }
+
+      zone  = table->zones;
+      count = table->count;
+      for ( ; count > 0; count--, zone++ )
+      {
+        zone->cur_top    = FT_MulFix( zone->org_top,    scale ) + delta;
+        zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta;
+        zone->cur_ref    = FT_MulFix( zone->org_ref,    scale ) + delta;
+        zone->cur_delta  = FT_MulFix( zone->org_delta,  scale );
+
+        /* round scaled reference position */
+        zone->cur_ref = FT_PIX_ROUND( zone->cur_ref );
+
+#if 0
+        if ( zone->cur_ref > zone->cur_top )
+          zone->cur_ref -= 64;
+        else if ( zone->cur_ref < zone->cur_bottom )
+          zone->cur_ref += 64;
+#endif
+      }
+    }
+
+    /* process the families now */
+
+    for ( num = 0; num < 2; num++ )
+    {
+      PSH_Blue_Zone   zone1, zone2;
+      FT_UInt         count1, count2;
+      PSH_Blue_Table  normal, family;
+
+
+      switch ( num )
+      {
+      case 0:
+        normal = &blues->normal_top;
+        family = &blues->family_top;
+        break;
+
+      default:
+        normal = &blues->normal_bottom;
+        family = &blues->family_bottom;
+      }
+
+      zone1  = normal->zones;
+      count1 = normal->count;
+
+      for ( ; count1 > 0; count1--, zone1++ )
+      {
+        /* try to find a family zone whose reference position is less */
+        /* than 1 pixel far from the current zone                     */
+        zone2  = family->zones;
+        count2 = family->count;
+
+        for ( ; count2 > 0; count2--, zone2++ )
+        {
+          FT_Pos  Delta;
+
+
+          Delta = zone1->org_ref - zone2->org_ref;
+          if ( Delta < 0 )
+            Delta = -Delta;
+
+          if ( FT_MulFix( Delta, scale ) < 64 )
+          {
+            zone1->cur_top    = zone2->cur_top;
+            zone1->cur_bottom = zone2->cur_bottom;
+            zone1->cur_ref    = zone2->cur_ref;
+            zone1->cur_delta  = zone2->cur_delta;
+            break;
+          }
+        }
+      }
+    }
+  }
+
+
+  /* calculate the maximum height of given blue zones */
+  static FT_Short
+  psh_calc_max_height( FT_UInt          num,
+                       const FT_Short*  values,
+                       FT_Short         cur_max )
+  {
+    FT_UInt  count;
+
+
+    for ( count = 0; count < num; count += 2 )
+    {
+      FT_Short  cur_height = values[count + 1] - values[count];
+
+
+      if ( cur_height > cur_max )
+        cur_max = cur_height;
+    }
+
+    return cur_max;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  psh_blues_snap_stem( PSH_Blues      blues,
+                       FT_Int         stem_top,
+                       FT_Int         stem_bot,
+                       PSH_Alignment  alignment )
+  {
+    PSH_Blue_Table  table;
+    FT_UInt         count;
+    FT_Pos          delta;
+    PSH_Blue_Zone   zone;
+    FT_Int          no_shoots;
+
+
+    alignment->align = PSH_BLUE_ALIGN_NONE;
+
+    no_shoots = blues->no_overshoots;
+
+    /* look up stem top in top zones table */
+    table = &blues->normal_top;
+    count = table->count;
+    zone  = table->zones;
+
+    for ( ; count > 0; count--, zone++ )
+    {
+      delta = stem_top - zone->org_bottom;
+      if ( delta < -blues->blue_fuzz )
+        break;
+
+      if ( stem_top <= zone->org_top + blues->blue_fuzz )
+      {
+        if ( no_shoots || delta <= blues->blue_threshold )
+        {
+          alignment->align    |= PSH_BLUE_ALIGN_TOP;
+          alignment->align_top = zone->cur_ref;
+        }
+        break;
+      }
+    }
+
+    /* look up stem bottom in bottom zones table */
+    table = &blues->normal_bottom;
+    count = table->count;
+    zone  = table->zones + count-1;
+
+    for ( ; count > 0; count--, zone-- )
+    {
+      delta = zone->org_top - stem_bot;
+      if ( delta < -blues->blue_fuzz )
+        break;
+
+      if ( stem_bot >= zone->org_bottom - blues->blue_fuzz )
+      {
+        if ( no_shoots || delta < blues->blue_threshold )
+        {
+          alignment->align    |= PSH_BLUE_ALIGN_BOT;
+          alignment->align_bot = zone->cur_ref;
+        }
+        break;
+      }
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        GLOBAL HINTS                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  psh_globals_destroy( PSH_Globals  globals )
+  {
+    if ( globals )
+    {
+      FT_Memory  memory;
+
+
+      memory = globals->memory;
+      globals->dimension[0].stdw.count = 0;
+      globals->dimension[1].stdw.count = 0;
+
+      globals->blues.normal_top.count    = 0;
+      globals->blues.normal_bottom.count = 0;
+      globals->blues.family_top.count    = 0;
+      globals->blues.family_bottom.count = 0;
+
+      FT_FREE( globals );
+
+#ifdef DEBUG_HINTER
+      ps_debug_globals = 0;
+#endif
+    }
+  }
+
+
+  static FT_Error
+  psh_globals_new( FT_Memory     memory,
+                   T1_Private*   priv,
+                   PSH_Globals  *aglobals )
+  {
+    PSH_Globals  globals = NULL;
+    FT_Error     error;
+
+
+    if ( !FT_NEW( globals ) )
+    {
+      FT_UInt    count;
+      FT_Short*  read;
+
+
+      globals->memory = memory;
+
+      /* copy standard widths */
+      {
+        PSH_Dimension  dim   = &globals->dimension[1];
+        PSH_Width      write = dim->stdw.widths;
+
+
+        write->org = priv->standard_width[0];
+        write++;
+
+        read = priv->snap_widths;
+        for ( count = priv->num_snap_widths; count > 0; count-- )
+        {
+          write->org = *read;
+          write++;
+          read++;
+        }
+
+        dim->stdw.count = priv->num_snap_widths + 1;
+      }
+
+      /* copy standard heights */
+      {
+        PSH_Dimension  dim = &globals->dimension[0];
+        PSH_Width      write = dim->stdw.widths;
+
+
+        write->org = priv->standard_height[0];
+        write++;
+        read = priv->snap_heights;
+        for ( count = priv->num_snap_heights; count > 0; count-- )
+        {
+          write->org = *read;
+          write++;
+          read++;
+        }
+
+        dim->stdw.count = priv->num_snap_heights + 1;
+      }
+
+      /* copy blue zones */
+      psh_blues_set_zones( &globals->blues, priv->num_blue_values,
+                           priv->blue_values, priv->num_other_blues,
+                           priv->other_blues, priv->blue_fuzz, 0 );
+
+      psh_blues_set_zones( &globals->blues, priv->num_family_blues,
+                           priv->family_blues, priv->num_family_other_blues,
+                           priv->family_other_blues, priv->blue_fuzz, 1 );
+
+      /* limit the BlueScale value to `1 / max_of_blue_zone_heights' */
+      {
+        FT_Fixed  max_scale;
+        FT_Short  max_height = 1;
+
+
+        max_height = psh_calc_max_height( priv->num_blue_values,
+                                          priv->blue_values,
+                                          max_height );
+        max_height = psh_calc_max_height( priv->num_other_blues,
+                                          priv->other_blues,
+                                          max_height );
+        max_height = psh_calc_max_height( priv->num_family_blues,
+                                          priv->family_blues,
+                                          max_height );
+        max_height = psh_calc_max_height( priv->num_family_other_blues,
+                                          priv->family_other_blues,
+                                          max_height );
+
+        /* BlueScale is scaled 1000 times */
+        max_scale = FT_DivFix( 1000, max_height );
+        globals->blues.blue_scale = priv->blue_scale < max_scale
+                                      ? priv->blue_scale
+                                      : max_scale;
+      }
+
+      globals->blues.blue_shift = priv->blue_shift;
+      globals->blues.blue_fuzz  = priv->blue_fuzz;
+
+      globals->dimension[0].scale_mult  = 0;
+      globals->dimension[0].scale_delta = 0;
+      globals->dimension[1].scale_mult  = 0;
+      globals->dimension[1].scale_delta = 0;
+
+#ifdef DEBUG_HINTER
+      ps_debug_globals = globals;
+#endif
+    }
+
+    *aglobals = globals;
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  psh_globals_set_scale( PSH_Globals  globals,
+                         FT_Fixed     x_scale,
+                         FT_Fixed     y_scale,
+                         FT_Fixed     x_delta,
+                         FT_Fixed     y_delta )
+  {
+    PSH_Dimension  dim = &globals->dimension[0];
+
+
+    dim = &globals->dimension[0];
+    if ( x_scale != dim->scale_mult  ||
+         x_delta != dim->scale_delta )
+    {
+      dim->scale_mult  = x_scale;
+      dim->scale_delta = x_delta;
+
+      psh_globals_scale_widths( globals, 0 );
+    }
+
+    dim = &globals->dimension[1];
+    if ( y_scale != dim->scale_mult  ||
+         y_delta != dim->scale_delta )
+    {
+      dim->scale_mult  = y_scale;
+      dim->scale_delta = y_delta;
+
+      psh_globals_scale_widths( globals, 1 );
+      psh_blues_scale_zones( &globals->blues, y_scale, y_delta );
+    }
+
+    return 0;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs )
+  {
+    funcs->create    = psh_globals_new;
+    funcs->set_scale = psh_globals_set_scale;
+    funcs->destroy   = psh_globals_destroy;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.h
new file mode 100644
index 0000000..cfc2001
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.h
@@ -0,0 +1,196 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshglob.h                                                              */
+/*                                                                         */
+/*    PostScript hinter global hinting management.                         */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2003 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSHGLOB_H__
+#define __PSHGLOB_H__
+
+
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/pshints.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    GLOBAL HINTS INTERNALS                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* @constant:                                                            */
+  /*    PS_GLOBALS_MAX_BLUE_ZONES                                          */
+  /*                                                                       */
+  /* @description:                                                         */
+  /*    The maximum number of blue zones in a font global hints structure. */
+  /*    See @PS_Globals_BluesRec.                                          */
+  /*                                                                       */
+#define PS_GLOBALS_MAX_BLUE_ZONES  16
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* @constant:                                                            */
+  /*    PS_GLOBALS_MAX_STD_WIDTHS                                          */
+  /*                                                                       */
+  /* @description:                                                         */
+  /*    The maximum number of standard and snap widths in either the       */
+  /*    horizontal or vertical direction.  See @PS_Globals_WidthsRec.      */
+  /*                                                                       */
+#define PS_GLOBALS_MAX_STD_WIDTHS  16
+
+
+  /* standard and snap width */
+  typedef struct  PSH_WidthRec_
+  {
+    FT_Int  org;
+    FT_Pos  cur;
+    FT_Pos  fit;
+
+  } PSH_WidthRec, *PSH_Width;
+
+
+  /* standard and snap widths table */
+  typedef struct  PSH_WidthsRec_
+  {
+    FT_UInt       count;
+    PSH_WidthRec  widths[PS_GLOBALS_MAX_STD_WIDTHS];
+
+  } PSH_WidthsRec, *PSH_Widths;
+
+
+  typedef struct  PSH_DimensionRec_
+  {
+    PSH_WidthsRec  stdw;
+    FT_Fixed       scale_mult;
+    FT_Fixed       scale_delta;
+
+  } PSH_DimensionRec, *PSH_Dimension;
+
+
+  /* blue zone descriptor */
+  typedef struct  PSH_Blue_ZoneRec_
+  {
+    FT_Int  org_ref;
+    FT_Int  org_delta;
+    FT_Int  org_top;
+    FT_Int  org_bottom;
+
+    FT_Pos  cur_ref;
+    FT_Pos  cur_delta;
+    FT_Pos  cur_bottom;
+    FT_Pos  cur_top;
+
+  } PSH_Blue_ZoneRec, *PSH_Blue_Zone;
+
+
+  typedef struct  PSH_Blue_TableRec_
+  {
+    FT_UInt           count;
+    PSH_Blue_ZoneRec  zones[PS_GLOBALS_MAX_BLUE_ZONES];
+
+  } PSH_Blue_TableRec, *PSH_Blue_Table;
+
+
+  /* blue zones table */
+  typedef struct  PSH_BluesRec_
+  {
+    PSH_Blue_TableRec  normal_top;
+    PSH_Blue_TableRec  normal_bottom;
+    PSH_Blue_TableRec  family_top;
+    PSH_Blue_TableRec  family_bottom;
+
+    FT_Fixed           blue_scale;
+    FT_Int             blue_shift;
+    FT_Int             blue_threshold;
+    FT_Int             blue_fuzz;
+    FT_Bool            no_overshoots;
+
+  } PSH_BluesRec, *PSH_Blues;
+
+
+  /* font globals.                                         */
+  /* dimension 0 => X coordinates + vertical hints/stems   */
+  /* dimension 1 => Y coordinates + horizontal hints/stems */
+  typedef struct  PSH_GlobalsRec_
+  {
+    FT_Memory         memory;
+    PSH_DimensionRec  dimension[2];
+    PSH_BluesRec      blues;
+
+  } PSH_GlobalsRec;
+
+
+#define PSH_BLUE_ALIGN_NONE  0
+#define PSH_BLUE_ALIGN_TOP   1
+#define PSH_BLUE_ALIGN_BOT   2
+
+
+  typedef struct  PSH_AlignmentRec_
+  {
+    int     align;
+    FT_Pos  align_top;
+    FT_Pos  align_bot;
+
+  } PSH_AlignmentRec, *PSH_Alignment;
+
+
+  FT_LOCAL( void )
+  psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs );
+
+
+#if 0
+  /* snap a stem width to fitter coordinates.  `org_width' is in font */
+  /* units.  The result is in device pixels (26.6 format).            */
+  FT_LOCAL( FT_Pos )
+  psh_dimension_snap_width( PSH_Dimension  dimension,
+                            FT_Int         org_width );
+#endif
+
+  FT_LOCAL( FT_Error )
+  psh_globals_set_scale( PSH_Globals  globals,
+                         FT_Fixed     x_scale,
+                         FT_Fixed     y_scale,
+                         FT_Fixed     x_delta,
+                         FT_Fixed     y_delta );
+
+  /* snap a stem to one or two blue zones */
+  FT_LOCAL( void )
+  psh_blues_snap_stem( PSH_Blues      blues,
+                       FT_Int         stem_top,
+                       FT_Int         stem_bot,
+                       PSH_Alignment  alignment );
+  /* */
+
+#ifdef DEBUG_HINTER
+  extern PSH_Globals  ps_debug_globals;
+#endif
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHGLOB_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.c
new file mode 100644
index 0000000..80edad8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.c
@@ -0,0 +1,119 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshmod.c                                                               */
+/*                                                                         */
+/*    FreeType PostScript hinter module implementation (body).             */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2007, 2009, 2012 by                              */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "pshrec.h"
+#include "pshalgo.h"
+#include "pshpic.h"
+
+
+  /* the Postscript Hinter module structure */
+  typedef struct  PS_Hinter_Module_Rec_
+  {
+    FT_ModuleRec          root;
+    PS_HintsRec           ps_hints;
+
+    PSH_Globals_FuncsRec  globals_funcs;
+    T1_Hints_FuncsRec     t1_funcs;
+    T2_Hints_FuncsRec     t2_funcs;
+
+  } PS_Hinter_ModuleRec, *PS_Hinter_Module;
+
+
+  /* finalize module */
+  FT_CALLBACK_DEF( void )
+  ps_hinter_done( PS_Hinter_Module  module )
+  {
+    module->t1_funcs.hints = NULL;
+    module->t2_funcs.hints = NULL;
+
+    ps_hints_done( &module->ps_hints );
+  }
+
+
+  /* initialize module, create hints recorder and the interface */
+  FT_CALLBACK_DEF( FT_Error )
+  ps_hinter_init( PS_Hinter_Module  module )
+  {
+    FT_Memory  memory = module->root.memory;
+    void*      ph     = &module->ps_hints;
+
+
+    ps_hints_init( &module->ps_hints, memory );
+
+    psh_globals_funcs_init( &module->globals_funcs );
+
+    t1_hints_funcs_init( &module->t1_funcs );
+    module->t1_funcs.hints = (T1_Hints)ph;
+
+    t2_hints_funcs_init( &module->t2_funcs );
+    module->t2_funcs.hints = (T2_Hints)ph;
+
+    return 0;
+  }
+
+
+  /* returns global hints interface */
+  FT_CALLBACK_DEF( PSH_Globals_Funcs )
+  pshinter_get_globals_funcs( FT_Module  module )
+  {
+    return &((PS_Hinter_Module)module)->globals_funcs;
+  }
+
+
+  /* return Type 1 hints interface */
+  FT_CALLBACK_DEF( T1_Hints_Funcs )
+  pshinter_get_t1_funcs( FT_Module  module )
+  {
+    return &((PS_Hinter_Module)module)->t1_funcs;
+  }
+
+
+  /* return Type 2 hints interface */
+  FT_CALLBACK_DEF( T2_Hints_Funcs )
+  pshinter_get_t2_funcs( FT_Module  module )
+  {
+    return &((PS_Hinter_Module)module)->t2_funcs;
+  }
+
+
+  FT_DEFINE_PSHINTER_INTERFACE(
+    pshinter_interface,
+    pshinter_get_globals_funcs,
+    pshinter_get_t1_funcs,
+    pshinter_get_t2_funcs )
+
+
+  FT_DEFINE_MODULE(
+    pshinter_module_class,
+
+    0,
+    sizeof ( PS_Hinter_ModuleRec ),
+    "pshinter",
+    0x10000L,
+    0x20000L,
+
+    &PSHINTER_INTERFACE_GET,              /* module-specific interface */
+
+    (FT_Module_Constructor)ps_hinter_init,
+    (FT_Module_Destructor) ps_hinter_done,
+    (FT_Module_Requester)  NULL )   /* no additional interface for now */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.h
new file mode 100644
index 0000000..c2143ac
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.h
@@ -0,0 +1,39 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshmod.h                                                               */
+/*                                                                         */
+/*    PostScript hinter module interface (specification).                  */
+/*                                                                         */
+/*  Copyright 2001 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSHMOD_H__
+#define __PSHMOD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_DECLARE_MODULE( pshinter_module_class )
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHMOD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshnterr.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshnterr.h
new file mode 100644
index 0000000..472fdbf
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshnterr.h
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshnterr.h                                                             */
+/*                                                                         */
+/*    PS Hinter error codes (specification only).                          */
+/*                                                                         */
+/*  Copyright 2003, 2012 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the PSHinter error enumeration constants. */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __PSHNTERR_H__
+#define __PSHNTERR_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  PSH_Err_
+#define FT_ERR_BASE    FT_Mod_Err_PShinter
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __PSHNTERR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.c
new file mode 100644
index 0000000..a35c99e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.c
@@ -0,0 +1,76 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshpic.c                                                               */
+/*                                                                         */
+/*    The FreeType position independent code services for pshinter module. */
+/*                                                                         */
+/*  Copyright 2009, 2010, 2012, 2013 by                                    */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "pshpic.h"
+#include "pshnterr.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from pshmod.c */
+  void
+  FT_Init_Class_pshinter_interface( FT_Library           library,
+                                    PSHinter_Interface*  clazz );
+
+  void
+  pshinter_module_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory          memory        = library->memory;
+
+
+    if ( pic_container->pshinter )
+    {
+      FT_FREE( pic_container->pshinter );
+      pic_container->pshinter = NULL;
+    }
+  }
+
+
+  FT_Error
+  pshinter_module_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = FT_Err_Ok;
+    PSHinterPIC*       container     = NULL;
+    FT_Memory          memory        = library->memory;
+
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->pshinter = container;
+
+    /* add call to initialization function when you add new scripts */
+    FT_Init_Class_pshinter_interface(
+      library, &container->pshinter_interface );
+
+    if ( error )
+      pshinter_module_class_pic_free( library );
+
+    return error;
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.h
new file mode 100644
index 0000000..8721aaa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.h
@@ -0,0 +1,63 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshpic.h                                                               */
+/*                                                                         */
+/*    The FreeType position independent code services for pshinter module. */
+/*                                                                         */
+/*  Copyright 2009, 2012, 2013 by                                          */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSHPIC_H__
+#define __PSHPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define PSHINTER_INTERFACE_GET  pshinter_interface
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/internal/pshints.h"
+
+  typedef struct  PSHinterPIC_
+  {
+    PSHinter_Interface  pshinter_interface;
+
+  } PSHinterPIC;
+
+
+#define GET_PIC( lib )  ( (PSHinterPIC*)( (lib)->pic_container.pshinter ) )
+
+#define PSHINTER_INTERFACE_GET  ( GET_PIC( library )->pshinter_interface )
+
+  /* see pshpic.c for the implementation */
+  void
+  pshinter_module_class_pic_free( FT_Library  library );
+
+  FT_Error
+  pshinter_module_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __PSHPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.c
new file mode 100644
index 0000000..8fc9a30
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.c
@@ -0,0 +1,1225 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshrec.c                                                               */
+/*                                                                         */
+/*    FreeType PostScript hints recorder (body).                           */
+/*                                                                         */
+/*  Copyright 2001-2004, 2007, 2009, 2013 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+
+#include "pshrec.h"
+#include "pshalgo.h"
+
+#include "pshnterr.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_pshrec
+
+#ifdef DEBUG_HINTER
+  PS_Hints  ps_debug_hints         = 0;
+  int       ps_debug_no_horz_hints = 0;
+  int       ps_debug_no_vert_hints = 0;
+#endif
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      PS_HINT MANAGEMENT                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* destroy hints table */
+  static void
+  ps_hint_table_done( PS_Hint_Table  table,
+                      FT_Memory      memory )
+  {
+    FT_FREE( table->hints );
+    table->num_hints = 0;
+    table->max_hints = 0;
+  }
+
+
+  /* ensure that a table can contain "count" elements */
+  static FT_Error
+  ps_hint_table_ensure( PS_Hint_Table  table,
+                        FT_UInt        count,
+                        FT_Memory      memory )
+  {
+    FT_UInt   old_max = table->max_hints;
+    FT_UInt   new_max = count;
+    FT_Error  error   = FT_Err_Ok;
+
+
+    if ( new_max > old_max )
+    {
+      /* try to grow the table */
+      new_max = FT_PAD_CEIL( new_max, 8 );
+      if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) )
+        table->max_hints = new_max;
+    }
+    return error;
+  }
+
+
+  static FT_Error
+  ps_hint_table_alloc( PS_Hint_Table  table,
+                       FT_Memory      memory,
+                       PS_Hint       *ahint )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_UInt   count;
+    PS_Hint   hint = 0;
+
+
+    count = table->num_hints;
+    count++;
+
+    if ( count >= table->max_hints )
+    {
+      error = ps_hint_table_ensure( table, count, memory );
+      if ( error )
+        goto Exit;
+    }
+
+    hint        = table->hints + count - 1;
+    hint->pos   = 0;
+    hint->len   = 0;
+    hint->flags = 0;
+
+    table->num_hints = count;
+
+  Exit:
+    *ahint = hint;
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      PS_MASK MANAGEMENT                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* destroy mask */
+  static void
+  ps_mask_done( PS_Mask    mask,
+                FT_Memory  memory )
+  {
+    FT_FREE( mask->bytes );
+    mask->num_bits  = 0;
+    mask->max_bits  = 0;
+    mask->end_point = 0;
+  }
+
+
+  /* ensure that a mask can contain "count" bits */
+  static FT_Error
+  ps_mask_ensure( PS_Mask    mask,
+                  FT_UInt    count,
+                  FT_Memory  memory )
+  {
+    FT_UInt   old_max = ( mask->max_bits + 7 ) >> 3;
+    FT_UInt   new_max = ( count          + 7 ) >> 3;
+    FT_Error  error   = FT_Err_Ok;
+
+
+    if ( new_max > old_max )
+    {
+      new_max = FT_PAD_CEIL( new_max, 8 );
+      if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) )
+        mask->max_bits = new_max * 8;
+    }
+    return error;
+  }
+
+
+  /* test a bit value in a given mask */
+  static FT_Int
+  ps_mask_test_bit( PS_Mask  mask,
+                    FT_Int   idx )
+  {
+    if ( (FT_UInt)idx >= mask->num_bits )
+      return 0;
+
+    return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) );
+  }
+
+
+  /* clear a given bit */
+  static void
+  ps_mask_clear_bit( PS_Mask  mask,
+                     FT_Int   idx )
+  {
+    FT_Byte*  p;
+
+
+    if ( (FT_UInt)idx >= mask->num_bits )
+      return;
+
+    p    = mask->bytes + ( idx >> 3 );
+    p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) );
+  }
+
+
+  /* set a given bit, possibly grow the mask */
+  static FT_Error
+  ps_mask_set_bit( PS_Mask    mask,
+                   FT_Int     idx,
+                   FT_Memory  memory )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_Byte*  p;
+
+
+    if ( idx < 0 )
+      goto Exit;
+
+    if ( (FT_UInt)idx >= mask->num_bits )
+    {
+      error = ps_mask_ensure( mask, idx + 1, memory );
+      if ( error )
+        goto Exit;
+
+      mask->num_bits = idx + 1;
+    }
+
+    p    = mask->bytes + ( idx >> 3 );
+    p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) );
+
+  Exit:
+    return error;
+  }
+
+
+  /* destroy mask table */
+  static void
+  ps_mask_table_done( PS_Mask_Table  table,
+                      FT_Memory      memory )
+  {
+    FT_UInt  count = table->max_masks;
+    PS_Mask  mask  = table->masks;
+
+
+    for ( ; count > 0; count--, mask++ )
+      ps_mask_done( mask, memory );
+
+    FT_FREE( table->masks );
+    table->num_masks = 0;
+    table->max_masks = 0;
+  }
+
+
+  /* ensure that a mask table can contain "count" masks */
+  static FT_Error
+  ps_mask_table_ensure( PS_Mask_Table  table,
+                        FT_UInt        count,
+                        FT_Memory      memory )
+  {
+    FT_UInt   old_max = table->max_masks;
+    FT_UInt   new_max = count;
+    FT_Error  error   = FT_Err_Ok;
+
+
+    if ( new_max > old_max )
+    {
+      new_max = FT_PAD_CEIL( new_max, 8 );
+      if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) )
+        table->max_masks = new_max;
+    }
+    return error;
+  }
+
+
+  /* allocate a new mask in a table */
+  static FT_Error
+  ps_mask_table_alloc( PS_Mask_Table  table,
+                       FT_Memory      memory,
+                       PS_Mask       *amask )
+  {
+    FT_UInt   count;
+    FT_Error  error = FT_Err_Ok;
+    PS_Mask   mask  = 0;
+
+
+    count = table->num_masks;
+    count++;
+
+    if ( count > table->max_masks )
+    {
+      error = ps_mask_table_ensure( table, count, memory );
+      if ( error )
+        goto Exit;
+    }
+
+    mask             = table->masks + count - 1;
+    mask->num_bits   = 0;
+    mask->end_point  = 0;
+    table->num_masks = count;
+
+  Exit:
+    *amask = mask;
+    return error;
+  }
+
+
+  /* return last hint mask in a table, create one if the table is empty */
+  static FT_Error
+  ps_mask_table_last( PS_Mask_Table  table,
+                      FT_Memory      memory,
+                      PS_Mask       *amask )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_UInt   count;
+    PS_Mask   mask;
+
+
+    count = table->num_masks;
+    if ( count == 0 )
+    {
+      error = ps_mask_table_alloc( table, memory, &mask );
+      if ( error )
+        goto Exit;
+    }
+    else
+      mask = table->masks + count - 1;
+
+  Exit:
+    *amask = mask;
+    return error;
+  }
+
+
+  /* set a new mask to a given bit range */
+  static FT_Error
+  ps_mask_table_set_bits( PS_Mask_Table   table,
+                          const FT_Byte*  source,
+                          FT_UInt         bit_pos,
+                          FT_UInt         bit_count,
+                          FT_Memory       memory )
+  {
+    FT_Error  error;
+    PS_Mask   mask;
+
+
+    error = ps_mask_table_last( table, memory, &mask );
+    if ( error )
+      goto Exit;
+
+    error = ps_mask_ensure( mask, bit_count, memory );
+    if ( error )
+      goto Exit;
+
+    mask->num_bits = bit_count;
+
+    /* now, copy bits */
+    {
+      FT_Byte*  read  = (FT_Byte*)source + ( bit_pos >> 3 );
+      FT_Int    rmask = 0x80 >> ( bit_pos & 7 );
+      FT_Byte*  write = mask->bytes;
+      FT_Int    wmask = 0x80;
+      FT_Int    val;
+
+
+      for ( ; bit_count > 0; bit_count-- )
+      {
+        val = write[0] & ~wmask;
+
+        if ( read[0] & rmask )
+          val |= wmask;
+
+        write[0] = (FT_Byte)val;
+
+        rmask >>= 1;
+        if ( rmask == 0 )
+        {
+          read++;
+          rmask = 0x80;
+        }
+
+        wmask >>= 1;
+        if ( wmask == 0 )
+        {
+          write++;
+          wmask = 0x80;
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* test whether two masks in a table intersect */
+  static FT_Int
+  ps_mask_table_test_intersect( PS_Mask_Table  table,
+                                FT_Int         index1,
+                                FT_Int         index2 )
+  {
+    PS_Mask   mask1  = table->masks + index1;
+    PS_Mask   mask2  = table->masks + index2;
+    FT_Byte*  p1     = mask1->bytes;
+    FT_Byte*  p2     = mask2->bytes;
+    FT_UInt   count1 = mask1->num_bits;
+    FT_UInt   count2 = mask2->num_bits;
+    FT_UInt   count;
+
+
+    count = FT_MIN( count1, count2 );
+    for ( ; count >= 8; count -= 8 )
+    {
+      if ( p1[0] & p2[0] )
+        return 1;
+
+      p1++;
+      p2++;
+    }
+
+    if ( count == 0 )
+      return 0;
+
+    return ( p1[0] & p2[0] ) & ~( 0xFF >> count );
+  }
+
+
+  /* merge two masks, used by ps_mask_table_merge_all */
+  static FT_Error
+  ps_mask_table_merge( PS_Mask_Table  table,
+                       FT_Int         index1,
+                       FT_Int         index2,
+                       FT_Memory      memory )
+  {
+    FT_UInt   temp;
+    FT_Error  error = FT_Err_Ok;
+
+
+    /* swap index1 and index2 so that index1 < index2 */
+    if ( index1 > index2 )
+    {
+      temp   = index1;
+      index1 = index2;
+      index2 = temp;
+    }
+
+    if ( index1 < index2 && index1 >= 0 && index2 < (FT_Int)table->num_masks )
+    {
+      /* we need to merge the bitsets of index1 and index2 with a */
+      /* simple union                                             */
+      PS_Mask  mask1  = table->masks + index1;
+      PS_Mask  mask2  = table->masks + index2;
+      FT_UInt  count1 = mask1->num_bits;
+      FT_UInt  count2 = mask2->num_bits;
+      FT_Int   delta;
+
+
+      if ( count2 > 0 )
+      {
+        FT_UInt   pos;
+        FT_Byte*  read;
+        FT_Byte*  write;
+
+
+        /* if "count2" is greater than "count1", we need to grow the */
+        /* first bitset, and clear the highest bits                  */
+        if ( count2 > count1 )
+        {
+          error = ps_mask_ensure( mask1, count2, memory );
+          if ( error )
+            goto Exit;
+
+          for ( pos = count1; pos < count2; pos++ )
+            ps_mask_clear_bit( mask1, pos );
+        }
+
+        /* merge (unite) the bitsets */
+        read  = mask2->bytes;
+        write = mask1->bytes;
+        pos   = (FT_UInt)( ( count2 + 7 ) >> 3 );
+
+        for ( ; pos > 0; pos-- )
+        {
+          write[0] = (FT_Byte)( write[0] | read[0] );
+          write++;
+          read++;
+        }
+      }
+
+      /* Now, remove "mask2" from the list.  We need to keep the masks */
+      /* sorted in order of importance, so move table elements.        */
+      mask2->num_bits  = 0;
+      mask2->end_point = 0;
+
+      delta = table->num_masks - 1 - index2; /* number of masks to move */
+      if ( delta > 0 )
+      {
+        /* move to end of table for reuse */
+        PS_MaskRec  dummy = *mask2;
+
+
+        ft_memmove( mask2, mask2 + 1, delta * sizeof ( PS_MaskRec ) );
+
+        mask2[delta] = dummy;
+      }
+
+      table->num_masks--;
+    }
+    else
+      FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n",
+                  index1, index2 ));
+
+  Exit:
+    return error;
+  }
+
+
+  /* Try to merge all masks in a given table.  This is used to merge */
+  /* all counter masks into independent counter "paths".             */
+  /*                                                                 */
+  static FT_Error
+  ps_mask_table_merge_all( PS_Mask_Table  table,
+                           FT_Memory      memory )
+  {
+    FT_Int    index1, index2;
+    FT_Error  error = FT_Err_Ok;
+
+
+    for ( index1 = table->num_masks - 1; index1 > 0; index1-- )
+    {
+      for ( index2 = index1 - 1; index2 >= 0; index2-- )
+      {
+        if ( ps_mask_table_test_intersect( table, index1, index2 ) )
+        {
+          error = ps_mask_table_merge( table, index2, index1, memory );
+          if ( error )
+            goto Exit;
+
+          break;
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    PS_DIMENSION MANAGEMENT                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* finalize a given dimension */
+  static void
+  ps_dimension_done( PS_Dimension  dimension,
+                     FT_Memory     memory )
+  {
+    ps_mask_table_done( &dimension->counters, memory );
+    ps_mask_table_done( &dimension->masks,    memory );
+    ps_hint_table_done( &dimension->hints,    memory );
+  }
+
+
+  /* initialize a given dimension */
+  static void
+  ps_dimension_init( PS_Dimension  dimension )
+  {
+    dimension->hints.num_hints    = 0;
+    dimension->masks.num_masks    = 0;
+    dimension->counters.num_masks = 0;
+  }
+
+
+#if 0
+
+  /* set a bit at a given index in the current hint mask */
+  static FT_Error
+  ps_dimension_set_mask_bit( PS_Dimension  dim,
+                             FT_UInt       idx,
+                             FT_Memory     memory )
+  {
+    PS_Mask   mask;
+    FT_Error  error = FT_Err_Ok;
+
+
+    /* get last hint mask */
+    error = ps_mask_table_last( &dim->masks, memory, &mask );
+    if ( error )
+      goto Exit;
+
+    error = ps_mask_set_bit( mask, idx, memory );
+
+  Exit:
+    return error;
+  }
+
+#endif
+
+  /* set the end point in a mask, called from "End" & "Reset" methods */
+  static void
+  ps_dimension_end_mask( PS_Dimension  dim,
+                         FT_UInt       end_point )
+  {
+    FT_UInt  count = dim->masks.num_masks;
+
+
+    if ( count > 0 )
+    {
+      PS_Mask  mask = dim->masks.masks + count - 1;
+
+
+      mask->end_point = end_point;
+    }
+  }
+
+
+  /* set the end point in the current mask, then create a new empty one */
+  /* (called by "Reset" method)                                         */
+  static FT_Error
+  ps_dimension_reset_mask( PS_Dimension  dim,
+                           FT_UInt       end_point,
+                           FT_Memory     memory )
+  {
+    PS_Mask  mask;
+
+
+    /* end current mask */
+    ps_dimension_end_mask( dim, end_point );
+
+    /* allocate new one */
+    return ps_mask_table_alloc( &dim->masks, memory, &mask );
+  }
+
+
+  /* set a new mask, called from the "T2Stem" method */
+  static FT_Error
+  ps_dimension_set_mask_bits( PS_Dimension    dim,
+                              const FT_Byte*  source,
+                              FT_UInt         source_pos,
+                              FT_UInt         source_bits,
+                              FT_UInt         end_point,
+                              FT_Memory       memory )
+  {
+    FT_Error  error;
+
+
+    /* reset current mask, if any */
+    error = ps_dimension_reset_mask( dim, end_point, memory );
+    if ( error )
+      goto Exit;
+
+    /* set bits in new mask */
+    error = ps_mask_table_set_bits( &dim->masks, source,
+                                    source_pos, source_bits, memory );
+
+  Exit:
+    return error;
+  }
+
+
+  /* add a new single stem (called from "T1Stem" method) */
+  static FT_Error
+  ps_dimension_add_t1stem( PS_Dimension  dim,
+                           FT_Int        pos,
+                           FT_Int        len,
+                           FT_Memory     memory,
+                           FT_Int       *aindex )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_UInt   flags = 0;
+
+
+    /* detect ghost stem */
+    if ( len < 0 )
+    {
+      flags |= PS_HINT_FLAG_GHOST;
+      if ( len == -21 )
+      {
+        flags |= PS_HINT_FLAG_BOTTOM;
+        pos   += len;
+      }
+      len = 0;
+    }
+
+    if ( aindex )
+      *aindex = -1;
+
+    /* now, lookup stem in the current hints table */
+    {
+      PS_Mask  mask;
+      FT_UInt  idx;
+      FT_UInt  max   = dim->hints.num_hints;
+      PS_Hint  hint  = dim->hints.hints;
+
+
+      for ( idx = 0; idx < max; idx++, hint++ )
+      {
+        if ( hint->pos == pos && hint->len == len )
+          break;
+      }
+
+      /* we need to create a new hint in the table */
+      if ( idx >= max )
+      {
+        error = ps_hint_table_alloc( &dim->hints, memory, &hint );
+        if ( error )
+          goto Exit;
+
+        hint->pos   = pos;
+        hint->len   = len;
+        hint->flags = flags;
+      }
+
+      /* now, store the hint in the current mask */
+      error = ps_mask_table_last( &dim->masks, memory, &mask );
+      if ( error )
+        goto Exit;
+
+      error = ps_mask_set_bit( mask, idx, memory );
+      if ( error )
+        goto Exit;
+
+      if ( aindex )
+        *aindex = (FT_Int)idx;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* add a "hstem3/vstem3" counter to our dimension table */
+  static FT_Error
+  ps_dimension_add_counter( PS_Dimension  dim,
+                            FT_Int        hint1,
+                            FT_Int        hint2,
+                            FT_Int        hint3,
+                            FT_Memory     memory )
+  {
+    FT_Error  error   = FT_Err_Ok;
+    FT_UInt   count   = dim->counters.num_masks;
+    PS_Mask   counter = dim->counters.masks;
+
+
+    /* try to find an existing counter mask that already uses */
+    /* one of these stems here                                */
+    for ( ; count > 0; count--, counter++ )
+    {
+      if ( ps_mask_test_bit( counter, hint1 ) ||
+           ps_mask_test_bit( counter, hint2 ) ||
+           ps_mask_test_bit( counter, hint3 ) )
+        break;
+    }
+
+    /* create a new counter when needed */
+    if ( count == 0 )
+    {
+      error = ps_mask_table_alloc( &dim->counters, memory, &counter );
+      if ( error )
+        goto Exit;
+    }
+
+    /* now, set the bits for our hints in the counter mask */
+    error = ps_mask_set_bit( counter, hint1, memory );
+    if ( error )
+      goto Exit;
+
+    error = ps_mask_set_bit( counter, hint2, memory );
+    if ( error )
+      goto Exit;
+
+    error = ps_mask_set_bit( counter, hint3, memory );
+    if ( error )
+      goto Exit;
+
+  Exit:
+    return error;
+  }
+
+
+  /* end of recording session for a given dimension */
+  static FT_Error
+  ps_dimension_end( PS_Dimension  dim,
+                    FT_UInt       end_point,
+                    FT_Memory     memory )
+  {
+    /* end hint mask table */
+    ps_dimension_end_mask( dim, end_point );
+
+    /* merge all counter masks into independent "paths" */
+    return ps_mask_table_merge_all( &dim->counters, memory );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    PS_RECORDER MANAGEMENT                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* destroy hints */
+  FT_LOCAL( void )
+  ps_hints_done( PS_Hints  hints )
+  {
+    FT_Memory  memory = hints->memory;
+
+
+    ps_dimension_done( &hints->dimension[0], memory );
+    ps_dimension_done( &hints->dimension[1], memory );
+
+    hints->error  = FT_Err_Ok;
+    hints->memory = 0;
+  }
+
+
+  FT_LOCAL( FT_Error )
+  ps_hints_init( PS_Hints   hints,
+                 FT_Memory  memory )
+  {
+    FT_MEM_ZERO( hints, sizeof ( *hints ) );
+    hints->memory = memory;
+    return FT_Err_Ok;
+  }
+
+
+  /* initialize a hints for a new session */
+  static void
+  ps_hints_open( PS_Hints      hints,
+                 PS_Hint_Type  hint_type )
+  {
+    switch ( hint_type )
+    {
+    case PS_HINT_TYPE_1:
+    case PS_HINT_TYPE_2:
+      hints->error     = FT_Err_Ok;
+      hints->hint_type = hint_type;
+
+      ps_dimension_init( &hints->dimension[0] );
+      ps_dimension_init( &hints->dimension[1] );
+      break;
+
+    default:
+      hints->error     = FT_THROW( Invalid_Argument );
+      hints->hint_type = hint_type;
+
+      FT_TRACE0(( "ps_hints_open: invalid charstring type\n" ));
+      break;
+    }
+  }
+
+
+  /* add one or more stems to the current hints table */
+  static void
+  ps_hints_stem( PS_Hints  hints,
+                 FT_Int    dimension,
+                 FT_UInt   count,
+                 FT_Long*  stems )
+  {
+    if ( !hints->error )
+    {
+      /* limit "dimension" to 0..1 */
+      if ( dimension < 0 || dimension > 1 )
+      {
+        FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n",
+                    dimension ));
+        dimension = ( dimension != 0 );
+      }
+
+      /* record the stems in the current hints/masks table */
+      switch ( hints->hint_type )
+      {
+      case PS_HINT_TYPE_1:  /* Type 1 "hstem" or "vstem" operator */
+      case PS_HINT_TYPE_2:  /* Type 2 "hstem" or "vstem" operator */
+        {
+          PS_Dimension  dim = &hints->dimension[dimension];
+
+
+          for ( ; count > 0; count--, stems += 2 )
+          {
+            FT_Error   error;
+            FT_Memory  memory = hints->memory;
+
+
+            error = ps_dimension_add_t1stem(
+                      dim, (FT_Int)stems[0], (FT_Int)stems[1],
+                      memory, NULL );
+            if ( error )
+            {
+              FT_ERROR(( "ps_hints_stem: could not add stem"
+                         " (%d,%d) to hints table\n", stems[0], stems[1] ));
+
+              hints->error = error;
+              return;
+            }
+          }
+          break;
+        }
+
+      default:
+        FT_TRACE0(( "ps_hints_stem: called with invalid hint type (%d)\n",
+                    hints->hint_type ));
+        break;
+      }
+    }
+  }
+
+
+  /* add one Type1 counter stem to the current hints table */
+  static void
+  ps_hints_t1stem3( PS_Hints   hints,
+                    FT_Int     dimension,
+                    FT_Fixed*  stems )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( !hints->error )
+    {
+      PS_Dimension  dim;
+      FT_Memory     memory = hints->memory;
+      FT_Int        count;
+      FT_Int        idx[3];
+
+
+      /* limit "dimension" to 0..1 */
+      if ( dimension < 0 || dimension > 1 )
+      {
+        FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n",
+                    dimension ));
+        dimension = ( dimension != 0 );
+      }
+
+      dim = &hints->dimension[dimension];
+
+      /* there must be 6 elements in the 'stem' array */
+      if ( hints->hint_type == PS_HINT_TYPE_1 )
+      {
+        /* add the three stems to our hints/masks table */
+        for ( count = 0; count < 3; count++, stems += 2 )
+        {
+          error = ps_dimension_add_t1stem( dim,
+                                           (FT_Int)FIXED_TO_INT( stems[0] ),
+                                           (FT_Int)FIXED_TO_INT( stems[1] ),
+                                           memory, &idx[count] );
+          if ( error )
+            goto Fail;
+        }
+
+        /* now, add the hints to the counters table */
+        error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2],
+                                          memory );
+        if ( error )
+          goto Fail;
+      }
+      else
+      {
+        FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type\n" ));
+        error = FT_THROW( Invalid_Argument );
+        goto Fail;
+      }
+    }
+
+    return;
+
+  Fail:
+    FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" ));
+    hints->error = error;
+  }
+
+
+  /* reset hints (only with Type 1 hints) */
+  static void
+  ps_hints_t1reset( PS_Hints  hints,
+                    FT_UInt   end_point )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( !hints->error )
+    {
+      FT_Memory  memory = hints->memory;
+
+
+      if ( hints->hint_type == PS_HINT_TYPE_1 )
+      {
+        error = ps_dimension_reset_mask( &hints->dimension[0],
+                                         end_point, memory );
+        if ( error )
+          goto Fail;
+
+        error = ps_dimension_reset_mask( &hints->dimension[1],
+                                         end_point, memory );
+        if ( error )
+          goto Fail;
+      }
+      else
+      {
+        /* invalid hint type */
+        error = FT_THROW( Invalid_Argument );
+        goto Fail;
+      }
+    }
+    return;
+
+  Fail:
+    hints->error = error;
+  }
+
+
+  /* Type2 "hintmask" operator, add a new hintmask to each direction */
+  static void
+  ps_hints_t2mask( PS_Hints        hints,
+                   FT_UInt         end_point,
+                   FT_UInt         bit_count,
+                   const FT_Byte*  bytes )
+  {
+    FT_Error  error;
+
+
+    if ( !hints->error )
+    {
+      PS_Dimension  dim    = hints->dimension;
+      FT_Memory     memory = hints->memory;
+      FT_UInt       count1 = dim[0].hints.num_hints;
+      FT_UInt       count2 = dim[1].hints.num_hints;
+
+
+      /* check bit count; must be equal to current total hint count */
+      if ( bit_count !=  count1 + count2 )
+      {
+        FT_TRACE0(( "ps_hints_t2mask:"
+                    " called with invalid bitcount %d (instead of %d)\n",
+                   bit_count, count1 + count2 ));
+
+        /* simply ignore the operator */
+        return;
+      }
+
+      /* set-up new horizontal and vertical hint mask now */
+      error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1,
+                                          end_point, memory );
+      if ( error )
+        goto Fail;
+
+      error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2,
+                                          end_point, memory );
+      if ( error )
+        goto Fail;
+    }
+    return;
+
+  Fail:
+    hints->error = error;
+  }
+
+
+  static void
+  ps_hints_t2counter( PS_Hints        hints,
+                      FT_UInt         bit_count,
+                      const FT_Byte*  bytes )
+  {
+    FT_Error  error;
+
+
+    if ( !hints->error )
+    {
+      PS_Dimension  dim    = hints->dimension;
+      FT_Memory     memory = hints->memory;
+      FT_UInt       count1 = dim[0].hints.num_hints;
+      FT_UInt       count2 = dim[1].hints.num_hints;
+
+
+      /* check bit count, must be equal to current total hint count */
+      if ( bit_count !=  count1 + count2 )
+      {
+        FT_TRACE0(( "ps_hints_t2counter:"
+                    " called with invalid bitcount %d (instead of %d)\n",
+                   bit_count, count1 + count2 ));
+
+        /* simply ignore the operator */
+        return;
+      }
+
+      /* set-up new horizontal and vertical hint mask now */
+      error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1,
+                                          0, memory );
+      if ( error )
+        goto Fail;
+
+      error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2,
+                                          0, memory );
+      if ( error )
+        goto Fail;
+    }
+    return;
+
+  Fail:
+    hints->error = error;
+  }
+
+
+  /* end recording session */
+  static FT_Error
+  ps_hints_close( PS_Hints  hints,
+                  FT_UInt   end_point )
+  {
+    FT_Error  error;
+
+
+    error = hints->error;
+    if ( !error )
+    {
+      FT_Memory     memory = hints->memory;
+      PS_Dimension  dim    = hints->dimension;
+
+
+      error = ps_dimension_end( &dim[0], end_point, memory );
+      if ( !error )
+      {
+        error = ps_dimension_end( &dim[1], end_point, memory );
+      }
+    }
+
+#ifdef DEBUG_HINTER
+    if ( !error )
+      ps_debug_hints = hints;
+#endif
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                TYPE 1 HINTS RECORDING INTERFACE               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  t1_hints_open( T1_Hints  hints )
+  {
+    ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 );
+  }
+
+  static void
+  t1_hints_stem( T1_Hints   hints,
+                 FT_Int     dimension,
+                 FT_Fixed*  coords )
+  {
+    FT_Pos  stems[2];
+
+
+    stems[0] = FIXED_TO_INT( coords[0] );
+    stems[1] = FIXED_TO_INT( coords[1] );
+
+    ps_hints_stem( (PS_Hints)hints, dimension, 1, stems );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs )
+  {
+    FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) );
+
+    funcs->open  = (T1_Hints_OpenFunc)    t1_hints_open;
+    funcs->close = (T1_Hints_CloseFunc)   ps_hints_close;
+    funcs->stem  = (T1_Hints_SetStemFunc) t1_hints_stem;
+    funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3;
+    funcs->reset = (T1_Hints_ResetFunc)   ps_hints_t1reset;
+    funcs->apply = (T1_Hints_ApplyFunc)   ps_hints_apply;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                TYPE 2 HINTS RECORDING INTERFACE               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  t2_hints_open( T2_Hints  hints )
+  {
+    ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 );
+  }
+
+
+  static void
+  t2_hints_stems( T2_Hints   hints,
+                  FT_Int     dimension,
+                  FT_Int     count,
+                  FT_Fixed*  coords )
+  {
+    FT_Pos  stems[32], y, n;
+    FT_Int  total = count;
+
+
+    y = 0;
+    while ( total > 0 )
+    {
+      /* determine number of stems to write */
+      count = total;
+      if ( count > 16 )
+        count = 16;
+
+      /* compute integer stem positions in font units */
+      for ( n = 0; n < count * 2; n++ )
+      {
+        y       += coords[n];
+        stems[n] = FIXED_TO_INT( y );
+      }
+
+      /* compute lengths */
+      for ( n = 0; n < count * 2; n += 2 )
+        stems[n + 1] = stems[n + 1] - stems[n];
+
+      /* add them to the current dimension */
+      ps_hints_stem( (PS_Hints)hints, dimension, count, stems );
+
+      total -= count;
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs )
+  {
+    FT_MEM_ZERO( funcs, sizeof ( *funcs ) );
+
+    funcs->open    = (T2_Hints_OpenFunc)   t2_hints_open;
+    funcs->close   = (T2_Hints_CloseFunc)  ps_hints_close;
+    funcs->stems   = (T2_Hints_StemsFunc)  t2_hints_stems;
+    funcs->hintmask= (T2_Hints_MaskFunc)   ps_hints_t2mask;
+    funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter;
+    funcs->apply   = (T2_Hints_ApplyFunc)  ps_hints_apply;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.h
new file mode 100644
index 0000000..91825db
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.h
@@ -0,0 +1,176 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshrec.h                                                               */
+/*                                                                         */
+/*    Postscript (Type1/Type2) hints recorder (specification).             */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2003, 2006, 2008 by                              */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /**************************************************************************/
+  /*                                                                        */
+  /*  The functions defined here are called from the Type 1, CID and CFF    */
+  /*  font drivers to record the hints of a given character/glyph.          */
+  /*                                                                        */
+  /*  The hints are recorded in a unified format, and are later processed   */
+  /*  by the `optimizer' and `fitter' to adjust the outlines to the pixel   */
+  /*  grid.                                                                 */
+  /*                                                                        */
+  /**************************************************************************/
+
+
+#ifndef __PSHREC_H__
+#define __PSHREC_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/pshints.h"
+#include "pshglob.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                 GLYPH HINTS RECORDER INTERNALS                *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* handle to hint record */
+  typedef struct PS_HintRec_*  PS_Hint;
+
+  /* hint types */
+  typedef enum  PS_Hint_Type_
+  {
+    PS_HINT_TYPE_1 = 1,
+    PS_HINT_TYPE_2 = 2
+
+  } PS_Hint_Type;
+
+
+  /* hint flags */
+  typedef enum  PS_Hint_Flags_
+  {
+    PS_HINT_FLAG_GHOST  = 1,
+    PS_HINT_FLAG_BOTTOM = 2
+
+  } PS_Hint_Flags;
+
+
+  /* hint descriptor */
+  typedef struct  PS_HintRec_
+  {
+    FT_Int   pos;
+    FT_Int   len;
+    FT_UInt  flags;
+
+  } PS_HintRec;
+
+
+#define ps_hint_is_active( x )  ( (x)->flags & PS_HINT_FLAG_ACTIVE )
+#define ps_hint_is_ghost( x )   ( (x)->flags & PS_HINT_FLAG_GHOST  )
+#define ps_hint_is_bottom( x )  ( (x)->flags & PS_HINT_FLAG_BOTTOM )
+
+
+  /* hints table descriptor */
+  typedef struct  PS_Hint_TableRec_
+  {
+    FT_UInt  num_hints;
+    FT_UInt  max_hints;
+    PS_Hint  hints;
+
+  } PS_Hint_TableRec, *PS_Hint_Table;
+
+
+  /* hint and counter mask descriptor */
+  typedef struct  PS_MaskRec_
+  {
+    FT_UInt   num_bits;
+    FT_UInt   max_bits;
+    FT_Byte*  bytes;
+    FT_UInt   end_point;
+
+  } PS_MaskRec, *PS_Mask;
+
+
+  /* masks and counters table descriptor */
+  typedef struct  PS_Mask_TableRec_
+  {
+    FT_UInt  num_masks;
+    FT_UInt  max_masks;
+    PS_Mask  masks;
+
+  } PS_Mask_TableRec, *PS_Mask_Table;
+
+
+ /* dimension-specific hints descriptor */
+  typedef struct  PS_DimensionRec_
+  {
+    PS_Hint_TableRec  hints;
+    PS_Mask_TableRec  masks;
+    PS_Mask_TableRec  counters;
+
+  } PS_DimensionRec, *PS_Dimension;
+
+
+  /* glyph hints descriptor                                */
+  /* dimension 0 => X coordinates + vertical hints/stems   */
+  /* dimension 1 => Y coordinates + horizontal hints/stems */
+  typedef struct  PS_HintsRec_
+  {
+    FT_Memory        memory;
+    FT_Error         error;
+    FT_UInt32        magic;
+    PS_Hint_Type     hint_type;
+    PS_DimensionRec  dimension[2];
+
+  } PS_HintsRec, *PS_Hints;
+
+  /* */
+
+  /* initialize hints recorder */
+  FT_LOCAL( FT_Error )
+  ps_hints_init( PS_Hints   hints,
+                 FT_Memory  memory );
+
+  /* finalize hints recorder */
+  FT_LOCAL( void )
+  ps_hints_done( PS_Hints  hints );
+
+  /* initialize Type1 hints recorder interface */
+  FT_LOCAL( void )
+  t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs );
+
+  /* initialize Type2 hints recorder interface */
+  FT_LOCAL( void )
+  t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs );
+
+
+#ifdef DEBUG_HINTER
+  extern PS_Hints  ps_debug_hints;
+  extern  int      ps_debug_no_horz_hints;
+  extern  int      ps_debug_no_vert_hints;
+#endif
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __PS_HINTER_RECORD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/rules.mk
new file mode 100644
index 0000000..888ece1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/rules.mk
@@ -0,0 +1,73 @@
+#
+# FreeType 2 PSHinter driver configuration rules
+#
+
+
+# Copyright 2001, 2003, 2011 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# PSHINTER driver directory
+#
+PSHINTER_DIR := $(SRC_DIR)/pshinter
+
+
+# compilation flags for the driver
+#
+PSHINTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSHINTER_DIR))
+
+
+# PSHINTER driver sources (i.e., C files)
+#
+PSHINTER_DRV_SRC := $(PSHINTER_DIR)/pshalgo.c \
+                    $(PSHINTER_DIR)/pshglob.c \
+                    $(PSHINTER_DIR)/pshmod.c  \
+                    $(PSHINTER_DIR)/pshpic.c  \
+                    $(PSHINTER_DIR)/pshrec.c
+
+
+# PSHINTER driver headers
+#
+PSHINTER_DRV_H := $(PSHINTER_DRV_SRC:%c=%h) \
+                  $(PSHINTER_DIR)/pshnterr.h
+
+
+# PSHINTER driver object(s)
+#
+#   PSHINTER_DRV_OBJ_M is used during `multi' builds.
+#   PSHINTER_DRV_OBJ_S is used during `single' builds.
+#
+PSHINTER_DRV_OBJ_M := $(PSHINTER_DRV_SRC:$(PSHINTER_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PSHINTER_DRV_OBJ_S := $(OBJ_DIR)/pshinter.$O
+
+# PSHINTER driver source file for single build
+#
+PSHINTER_DRV_SRC_S := $(PSHINTER_DIR)/pshinter.c
+
+
+# PSHINTER driver - single object
+#
+$(PSHINTER_DRV_OBJ_S): $(PSHINTER_DRV_SRC_S) $(PSHINTER_DRV_SRC) \
+                       $(FREETYPE_H) $(PSHINTER_DRV_H)
+	$(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSHINTER_DRV_SRC_S))
+
+
+# PSHINTER driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PSHINTER_DIR)/%.c $(FREETYPE_H) $(PSHINTER_DRV_H)
+	$(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PSHINTER_DRV_OBJ_S)
+DRV_OBJS_M += $(PSHINTER_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/Jamfile
new file mode 100644
index 0000000..06c0dda
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/psnames Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) psnames ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = psmodule pspic ;
+  }
+  else
+  {
+    _sources = psnames ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/psnames Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c
new file mode 100644
index 0000000..595aa87
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c
@@ -0,0 +1,670 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  psmodule.c                                                             */
+/*                                                                         */
+/*    PSNames module implementation (body).                                */
+/*                                                                         */
+/*  Copyright 1996-2003, 2005-2008, 2012, 2013 by                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+
+#include "psmodule.h"
+#include "pstables.h"
+
+#include "psnamerr.h"
+#include "pspic.h"
+
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+
+#define VARIANT_BIT         0x80000000UL
+#define BASE_GLYPH( code )  ( (FT_UInt32)( (code) & ~VARIANT_BIT ) )
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  /* Return the Unicode value corresponding to a given glyph.  Note that */
+  /* we do deal with glyph variants by detecting a non-initial dot in    */
+  /* the name, as in `A.swash' or `e.final'; in this case, the           */
+  /* VARIANT_BIT is set in the return value.                             */
+  /*                                                                     */
+int FXFT_unicode_from_adobe_name( const char*  glyph_name )
+  {
+    /* If the name begins with `uni', then the glyph name may be a */
+    /* hard-coded unicode character code.                          */
+    if ( glyph_name[0] == 'u' &&
+         glyph_name[1] == 'n' &&
+         glyph_name[2] == 'i' )
+    {
+      /* determine whether the next four characters following are */
+      /* hexadecimal.                                             */
+
+      /* XXX: Add code to deal with ligatures, i.e. glyph names like */
+      /*      `uniXXXXYYYYZZZZ'...                                   */
+
+      FT_Int       count;
+      FT_UInt32    value = 0;
+      const char*  p     = glyph_name + 3;
+
+
+      for ( count = 4; count > 0; count--, p++ )
+      {
+        char          c = *p;
+        unsigned int  d;
+
+
+        d = (unsigned char)c - '0';
+        if ( d >= 10 )
+        {
+          d = (unsigned char)c - 'A';
+          if ( d >= 6 )
+            d = 16;
+          else
+            d += 10;
+        }
+
+        /* Exit if a non-uppercase hexadecimal character was found   */
+        /* -- this also catches character codes below `0' since such */
+        /* negative numbers cast to `unsigned int' are far too big.  */
+        if ( d >= 16 )
+          break;
+
+        value = ( value << 4 ) + d;
+      }
+
+      /* there must be exactly four hex digits */
+      if ( count == 0 )
+      {
+        if ( *p == '\0' )
+          return value;
+        if ( *p == '.' )
+          return (FT_UInt32)( value | VARIANT_BIT );
+      }
+    }
+
+    /* If the name begins with `u', followed by four to six uppercase */
+    /* hexadecimal digits, it is a hard-coded unicode character code. */
+    if ( glyph_name[0] == 'u' )
+    {
+      FT_Int       count;
+      FT_UInt32    value = 0;
+      const char*  p     = glyph_name + 1;
+
+
+      for ( count = 6; count > 0; count--, p++ )
+      {
+        char          c = *p;
+        unsigned int  d;
+
+
+        d = (unsigned char)c - '0';
+        if ( d >= 10 )
+        {
+          d = (unsigned char)c - 'A';
+          if ( d >= 6 )
+            d = 16;
+          else
+            d += 10;
+        }
+
+        if ( d >= 16 )
+          break;
+
+        value = ( value << 4 ) + d;
+      }
+
+      if ( count <= 2 )
+      {
+        if ( *p == '\0' )
+          return value;
+        if ( *p == '.' )
+          return (FT_UInt32)( value | VARIANT_BIT );
+      }
+    }
+
+    /* Look for a non-initial dot in the glyph name in order to */
+    /* find variants like `A.swash', `e.final', etc.            */
+    {
+      const char*  p   = glyph_name;
+      const char*  dot = NULL;
+
+
+      for ( ; *p; p++ )
+      {
+        if ( *p == '.' && p > glyph_name )
+        {
+          dot = p;
+          break;
+        }
+      }
+
+      /* now look up the glyph in the Adobe Glyph List */
+      if ( !dot )
+        return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p );
+      else
+        return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) |
+                            VARIANT_BIT );
+    }
+  }
+  #ifdef __cplusplus
+}
+#endif
+
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+static int xyq_search_node(char* glyph_name, int name_offset, int table_offset, FT_UInt32 unicode)
+{
+	int i, count;
+
+	// copy letters
+	while (1) {
+		glyph_name[name_offset] = ft_adobe_glyph_list[table_offset] & 0x7f;
+		name_offset ++;
+		table_offset ++;
+		if (!(ft_adobe_glyph_list[table_offset-1] & 0x80)) break;
+	}
+	glyph_name[name_offset] = 0;
+
+	// get child count
+	count = ft_adobe_glyph_list[table_offset] & 0x7f;
+
+	// check if we have value for this node
+	if (ft_adobe_glyph_list[table_offset] & 0x80) {
+		unsigned short thiscode = ft_adobe_glyph_list[table_offset+1] * 256 + ft_adobe_glyph_list[table_offset+2];
+		if (thiscode == unicode)	// found it!
+			return 1;
+		table_offset += 3;
+	} else
+		table_offset ++;
+
+	// now search in sub-nodes
+	if (count == 0) return 0;
+	for (i = 0; i < count; i ++) {
+		int child_offset = ft_adobe_glyph_list[table_offset+i*2] * 256 + ft_adobe_glyph_list[table_offset+i*2+1];
+		if (xyq_search_node(glyph_name, name_offset, child_offset, unicode))
+			// found in child
+			return 1;
+	}
+	return 0;
+}
+
+// XYQ: function for searching Unicode in the glyph list
+void FXFT_adobe_name_from_unicode(char* glyph_name, FT_UInt32 unicode)
+{
+	int i, count;
+	
+	// start from top level node
+	count = ft_adobe_glyph_list[1];
+	for (i = 0; i < count; i ++) {
+		int child_offset = ft_adobe_glyph_list[i*2+2] * 256 + ft_adobe_glyph_list[i*2+3];
+		if (xyq_search_node(glyph_name, 0, child_offset, unicode))
+			return;
+	}
+
+	// failed, clear the buffer
+	glyph_name[0] = 0;
+}
+#endif
+
+  /* ft_qsort callback to sort the unicode map */
+  FT_CALLBACK_DEF( int )
+  compare_uni_maps( const void*  a,
+                    const void*  b )
+  {
+    PS_UniMap*  map1 = (PS_UniMap*)a;
+    PS_UniMap*  map2 = (PS_UniMap*)b;
+    FT_UInt32   unicode1 = BASE_GLYPH( map1->unicode );
+    FT_UInt32   unicode2 = BASE_GLYPH( map2->unicode );
+
+
+    /* sort base glyphs before glyph variants */
+    if ( unicode1 == unicode2 )
+    {
+      if ( map1->unicode > map2->unicode )
+        return 1;
+      else if ( map1->unicode < map2->unicode )
+        return -1;
+      else
+        return 0;
+    }
+    else
+    {
+      if ( unicode1 > unicode2 )
+        return 1;
+      else if ( unicode1 < unicode2 )
+        return -1;
+      else
+        return 0;
+    }
+  }
+
+
+  /* support for extra glyphs not handled (well) in AGL; */
+  /* we add extra mappings for them if necessary         */
+
+#define EXTRA_GLYPH_LIST_SIZE  10
+
+  static const FT_UInt32  ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] =
+  {
+    /* WGL 4 */
+    0x0394,
+    0x03A9,
+    0x2215,
+    0x00AD,
+    0x02C9,
+    0x03BC,
+    0x2219,
+    0x00A0,
+    /* Romanian */
+    0x021A,
+    0x021B
+  };
+
+  static const char  ft_extra_glyph_names[] =
+  {
+    'D','e','l','t','a',0,
+    'O','m','e','g','a',0,
+    'f','r','a','c','t','i','o','n',0,
+    'h','y','p','h','e','n',0,
+    'm','a','c','r','o','n',0,
+    'm','u',0,
+    'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0,
+    's','p','a','c','e',0,
+    'T','c','o','m','m','a','a','c','c','e','n','t',0,
+    't','c','o','m','m','a','a','c','c','e','n','t',0
+  };
+
+  static const FT_Int
+  ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] =
+  {
+     0,
+     6,
+    12,
+    21,
+    28,
+    35,
+    38,
+    53,
+    59,
+    72
+  };
+
+
+  static void
+  ps_check_extra_glyph_name( const char*  gname,
+                             FT_UInt      glyph,
+                             FT_UInt*     extra_glyphs,
+                             FT_UInt     *states )
+  {
+    FT_UInt  n;
+
+
+    for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
+    {
+      if ( ft_strcmp( ft_extra_glyph_names +
+                        ft_extra_glyph_name_offsets[n], gname ) == 0 )
+      {
+        if ( states[n] == 0 )
+        {
+          /* mark this extra glyph as a candidate for the cmap */
+          states[n]     = 1;
+          extra_glyphs[n] = glyph;
+        }
+
+        return;
+      }
+    }
+  }
+
+
+  static void
+  ps_check_extra_glyph_unicode( FT_UInt32  uni_char,
+                                FT_UInt   *states )
+  {
+    FT_UInt  n;
+
+
+    for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
+    {
+      if ( uni_char == ft_extra_glyph_unicodes[n] )
+      {
+        /* disable this extra glyph from being added to the cmap */
+        states[n] = 2;
+
+        return;
+      }
+    }
+  }
+
+
+  /* Build a table that maps Unicode values to glyph indices. */
+  static FT_Error
+  ps_unicodes_init( FT_Memory             memory,
+                    PS_Unicodes           table,
+                    FT_UInt               num_glyphs,
+                    PS_GetGlyphNameFunc   get_glyph_name,
+                    PS_FreeGlyphNameFunc  free_glyph_name,
+                    FT_Pointer            glyph_data )
+  {
+    FT_Error  error;
+
+    FT_UInt  extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+    FT_UInt  extra_glyphs[EXTRA_GLYPH_LIST_SIZE];
+
+
+    /* we first allocate the table */
+    table->num_maps = 0;
+    table->maps     = 0;
+
+    if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) )
+    {
+      FT_UInt     n;
+      FT_UInt     count;
+      PS_UniMap*  map;
+      FT_UInt32   uni_char;
+
+
+      map = table->maps;
+
+      for ( n = 0; n < num_glyphs; n++ )
+      {
+        const char*  gname = get_glyph_name( glyph_data, n );
+
+
+        if ( gname )
+        {
+          ps_check_extra_glyph_name( gname, n,
+                                     extra_glyphs, extra_glyph_list_states );
+          uni_char = FXFT_unicode_from_adobe_name( gname );
+
+          if ( BASE_GLYPH( uni_char ) != 0 )
+          {
+            ps_check_extra_glyph_unicode( uni_char,
+                                          extra_glyph_list_states );
+            map->unicode     = uni_char;
+            map->glyph_index = n;
+            map++;
+          }
+
+          if ( free_glyph_name )
+            free_glyph_name( glyph_data, gname );
+        }
+      }
+
+      for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
+      {
+        if ( extra_glyph_list_states[n] == 1 )
+        {
+          /* This glyph name has an additional representation. */
+          /* Add it to the cmap.                               */
+
+          map->unicode     = ft_extra_glyph_unicodes[n];
+          map->glyph_index = extra_glyphs[n];
+          map++;
+        }
+      }
+
+      /* now compress the table a bit */
+      count = (FT_UInt)( map - table->maps );
+
+      if ( count == 0 )
+      {
+        /* No unicode chars here! */
+        FT_FREE( table->maps );
+        if ( !error )
+          error = FT_THROW( No_Unicode_Glyph_Name );
+      }
+      else
+      {
+        /* Reallocate if the number of used entries is much smaller. */
+        if ( count < num_glyphs / 2 )
+        {
+          (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count );
+          error = FT_Err_Ok;
+        }
+
+        /* Sort the table in increasing order of unicode values, */
+        /* taking care of glyph variants.                        */
+        ft_qsort( table->maps, count, sizeof ( PS_UniMap ),
+                  compare_uni_maps );
+      }
+
+      table->num_maps = count;
+    }
+
+    return error;
+  }
+
+
+  static FT_UInt
+  ps_unicodes_char_index( PS_Unicodes  table,
+                          FT_UInt32    unicode )
+  {
+    PS_UniMap  *min, *max, *mid, *result = NULL;
+
+
+    /* Perform a binary search on the table. */
+
+    min = table->maps;
+    max = min + table->num_maps - 1;
+
+    while ( min <= max )
+    {
+      FT_UInt32  base_glyph;
+
+
+      mid = min + ( ( max - min ) >> 1 );
+
+      if ( mid->unicode == unicode )
+      {
+        result = mid;
+        break;
+      }
+
+      base_glyph = BASE_GLYPH( mid->unicode );
+
+      if ( base_glyph == unicode )
+        result = mid; /* remember match but continue search for base glyph */
+
+      if ( min == max )
+        break;
+
+      if ( base_glyph < unicode )
+        min = mid + 1;
+      else
+        max = mid - 1;
+    }
+
+    if ( result )
+      return result->glyph_index;
+    else
+      return 0;
+  }
+
+
+  static FT_UInt32
+  ps_unicodes_char_next( PS_Unicodes  table,
+                         FT_UInt32   *unicode )
+  {
+    FT_UInt    result    = 0;
+    FT_UInt32  char_code = *unicode + 1;
+
+
+    {
+      FT_UInt     min = 0;
+      FT_UInt     max = table->num_maps;
+      FT_UInt     mid;
+      PS_UniMap*  map;
+      FT_UInt32   base_glyph;
+
+
+      while ( min < max )
+      {
+        mid = min + ( ( max - min ) >> 1 );
+        map = table->maps + mid;
+
+        if ( map->unicode == char_code )
+        {
+          result = map->glyph_index;
+          goto Exit;
+        }
+
+        base_glyph = BASE_GLYPH( map->unicode );
+
+        if ( base_glyph == char_code )
+          result = map->glyph_index;
+
+        if ( base_glyph < char_code )
+          min = mid + 1;
+        else
+          max = mid;
+      }
+
+      if ( result )
+        goto Exit;               /* we have a variant glyph */
+
+      /* we didn't find it; check whether we have a map just above it */
+      char_code = 0;
+
+      if ( min < table->num_maps )
+      {
+        map       = table->maps + min;
+        result    = map->glyph_index;
+        char_code = BASE_GLYPH( map->unicode );
+      }
+    }
+
+  Exit:
+    *unicode = char_code;
+    return result;
+  }
+
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+
+  static const char*
+  ps_get_macintosh_name( FT_UInt  name_index )
+  {
+    if ( name_index >= FT_NUM_MAC_NAMES )
+      name_index = 0;
+
+    return ft_standard_glyph_names + ft_mac_names[name_index];
+  }
+
+
+  static const char*
+  ps_get_standard_strings( FT_UInt  sid )
+  {
+    if ( sid >= FT_NUM_SID_NAMES )
+      return 0;
+
+    return ft_standard_glyph_names + ft_sid_names[sid];
+  }
+
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+  FT_DEFINE_SERVICE_PSCMAPSREC(
+    pscmaps_interface,
+    (PS_Unicode_ValueFunc)     FXFT_unicode_from_adobe_name,
+    (PS_Unicodes_InitFunc)     ps_unicodes_init,
+    (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index,
+    (PS_Unicodes_CharNextFunc) ps_unicodes_char_next,
+
+    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,
+    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,
+
+    t1_standard_encoding,
+    t1_expert_encoding )
+
+#else
+
+  FT_DEFINE_SERVICE_PSCMAPSREC(
+    pscmaps_interface,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+
+    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,
+    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,
+
+    t1_standard_encoding,
+    t1_expert_encoding )
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+
+  FT_DEFINE_SERVICEDESCREC1(
+    pscmaps_services,
+    FT_SERVICE_ID_POSTSCRIPT_CMAPS, &PSCMAPS_INTERFACE_GET )
+
+
+  static FT_Pointer
+  psnames_get_service( FT_Module    module,
+                       const char*  service_id )
+  {
+    /* PSCMAPS_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+    FT_Library  library;
+
+
+    if ( !module )
+      return NULL;
+    library = module->library;
+    if ( !library )
+      return NULL;
+#else
+    FT_UNUSED( module );
+#endif
+
+    return ft_service_list_lookup( PSCMAPS_SERVICES_GET, service_id );
+  }
+
+#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#define PUT_PS_NAMES_SERVICE( a )  NULL
+#else
+#define PUT_PS_NAMES_SERVICE( a )  a
+#endif
+
+  FT_DEFINE_MODULE(
+    psnames_module_class,
+
+    0,  /* this is not a font driver, nor a renderer */
+    sizeof ( FT_ModuleRec ),
+
+    "psnames",  /* driver name                         */
+    0x10000L,   /* driver version                      */
+    0x20000L,   /* driver requires FreeType 2 or above */
+
+    PUT_PS_NAMES_SERVICE(
+      (void*)&PSCMAPS_INTERFACE_GET ),   /* module specific interface */
+    (FT_Module_Constructor)NULL,
+    (FT_Module_Destructor) NULL,
+    (FT_Module_Requester)  PUT_PS_NAMES_SERVICE( psnames_get_service ) )
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/module.mk
new file mode 100644
index 0000000..a6e9082
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PSnames module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += PSNAMES_MODULE
+
+define PSNAMES_MODULE
+$(OPEN_DRIVER) FT_Module_Class, psnames_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)psnames   $(ECHO_DRIVER_DESC)Postscript & Unicode Glyph name handling$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psmodule.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psmodule.h
new file mode 100644
index 0000000..1f37a8b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psmodule.h
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psmodule.h                                                             */
+/*                                                                         */
+/*    High-level PSNames module interface (specification).                 */
+/*                                                                         */
+/*  Copyright 1996-2001 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSMODULE_H__
+#define __PSMODULE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_DECLARE_MODULE( psnames_module_class )
+
+
+FT_END_HEADER
+
+#endif /* __PSMODULE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnamerr.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnamerr.h
new file mode 100644
index 0000000..9cb6c7e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnamerr.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psnamerr.h                                                             */
+/*                                                                         */
+/*    PS names module error codes (specification only).                    */
+/*                                                                         */
+/*  Copyright 2001, 2012 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the PS names module error enumeration     */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __PSNAMERR_H__
+#define __PSNAMERR_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  PSnames_Err_
+#define FT_ERR_BASE    FT_Mod_Err_PSnames
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __PSNAMERR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnames.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnames.c
new file mode 100644
index 0000000..efc9594
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnames.c
@@ -0,0 +1,26 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psnames.c                                                              */
+/*                                                                         */
+/*    FreeType PSNames module component (body only).                       */
+/*                                                                         */
+/*  Copyright 1996-2001 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include "../../include/ft2build.h"
+#include "pspic.c"
+#include "psmodule.c"
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.c
new file mode 100644
index 0000000..70dfcd9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.c
@@ -0,0 +1,97 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pspic.c                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services for psnames module.  */
+/*                                                                         */
+/*  Copyright 2009, 2010, 2012, 2013 by                                    */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "pspic.h"
+#include "psnamerr.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from psmodule.c */
+  FT_Error
+  FT_Create_Class_pscmaps_services( FT_Library           library,
+                                    FT_ServiceDescRec**  output_class );
+  void
+  FT_Destroy_Class_pscmaps_services( FT_Library          library,
+                                     FT_ServiceDescRec*  clazz );
+
+  void
+  FT_Init_Class_pscmaps_interface( FT_Library              library,
+                                   FT_Service_PsCMapsRec*  clazz );
+
+
+  void
+  psnames_module_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory          memory        = library->memory;
+
+
+    if ( pic_container->psnames )
+    {
+      PSModulePIC*  container = (PSModulePIC*)pic_container->psnames;
+
+
+      if ( container->pscmaps_services )
+        FT_Destroy_Class_pscmaps_services( library,
+                                           container->pscmaps_services );
+      container->pscmaps_services = NULL;
+      FT_FREE( container );
+      pic_container->psnames = NULL;
+    }
+  }
+
+
+  FT_Error
+  psnames_module_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = FT_Err_Ok;
+    PSModulePIC*       container     = NULL;
+    FT_Memory          memory        = library->memory;
+
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->psnames = container;
+
+    /* initialize pointer table -                       */
+    /* this is how the module usually expects this data */
+    error = FT_Create_Class_pscmaps_services(
+              library, &container->pscmaps_services );
+    if ( error )
+      goto Exit;
+    FT_Init_Class_pscmaps_interface( library,
+                                     &container->pscmaps_interface );
+
+  Exit:
+    if ( error )
+      psnames_module_class_pic_free( library );
+    return error;
+  }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.h
new file mode 100644
index 0000000..f055e33
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.h
@@ -0,0 +1,66 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pspic.h                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services for psnames module.  */
+/*                                                                         */
+/*  Copyright 2009, 2012 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSPIC_H__
+#define __PSPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define PSCMAPS_SERVICES_GET   pscmaps_services
+#define PSCMAPS_INTERFACE_GET  pscmaps_interface
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/internal/services/svpscmap.h"
+
+  typedef struct  PSModulePIC_
+  {
+    FT_ServiceDescRec*     pscmaps_services;
+    FT_Service_PsCMapsRec  pscmaps_interface;
+
+  } PSModulePIC;
+
+
+#define GET_PIC( lib )                                     \
+          ( (PSModulePIC*)((lib)->pic_container.psnames) )
+#define PSCMAPS_SERVICES_GET   ( GET_PIC( library )->pscmaps_services )
+#define PSCMAPS_INTERFACE_GET  ( GET_PIC( library )->pscmaps_interface )
+
+
+  /* see pspic.c for the implementation */
+  void
+  psnames_module_class_pic_free( FT_Library  library );
+
+  FT_Error
+  psnames_module_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __PSPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pstables.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pstables.h
new file mode 100644
index 0000000..66f039e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pstables.h
@@ -0,0 +1,4184 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pstables.h                                                             */
+/*                                                                         */
+/*    PostScript glyph names.                                              */
+/*                                                                         */
+/*  Copyright 2005, 2008, 2011 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /* This file has been generated automatically -- do not edit! */
+
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+  static const char  ft_standard_glyph_names[3696] =
+  {
+    '.','n','u','l','l', 0,
+    'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0,
+    'n','o','t','e','q','u','a','l', 0,
+    'i','n','f','i','n','i','t','y', 0,
+    'l','e','s','s','e','q','u','a','l', 0,
+    'g','r','e','a','t','e','r','e','q','u','a','l', 0,
+    'p','a','r','t','i','a','l','d','i','f','f', 0,
+    's','u','m','m','a','t','i','o','n', 0,
+    'p','r','o','d','u','c','t', 0,
+    'p','i', 0,
+    'i','n','t','e','g','r','a','l', 0,
+    'O','m','e','g','a', 0,
+    'r','a','d','i','c','a','l', 0,
+    'a','p','p','r','o','x','e','q','u','a','l', 0,
+    'D','e','l','t','a', 0,
+    'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0,
+    'l','o','z','e','n','g','e', 0,
+    'a','p','p','l','e', 0,
+    'f','r','a','n','c', 0,
+    'G','b','r','e','v','e', 0,
+    'g','b','r','e','v','e', 0,
+    'I','d','o','t','a','c','c','e','n','t', 0,
+    'S','c','e','d','i','l','l','a', 0,
+    's','c','e','d','i','l','l','a', 0,
+    'C','a','c','u','t','e', 0,
+    'c','a','c','u','t','e', 0,
+    'C','c','a','r','o','n', 0,
+    'c','c','a','r','o','n', 0,
+    'd','c','r','o','a','t', 0,
+    '.','n','o','t','d','e','f', 0,
+    's','p','a','c','e', 0,
+    'e','x','c','l','a','m', 0,
+    'q','u','o','t','e','d','b','l', 0,
+    'n','u','m','b','e','r','s','i','g','n', 0,
+    'd','o','l','l','a','r', 0,
+    'p','e','r','c','e','n','t', 0,
+    'a','m','p','e','r','s','a','n','d', 0,
+    'q','u','o','t','e','r','i','g','h','t', 0,
+    'p','a','r','e','n','l','e','f','t', 0,
+    'p','a','r','e','n','r','i','g','h','t', 0,
+    'a','s','t','e','r','i','s','k', 0,
+    'p','l','u','s', 0,
+    'c','o','m','m','a', 0,
+    'h','y','p','h','e','n', 0,
+    'p','e','r','i','o','d', 0,
+    's','l','a','s','h', 0,
+    'z','e','r','o', 0,
+    'o','n','e', 0,
+    't','w','o', 0,
+    't','h','r','e','e', 0,
+    'f','o','u','r', 0,
+    'f','i','v','e', 0,
+    's','i','x', 0,
+    's','e','v','e','n', 0,
+    'e','i','g','h','t', 0,
+    'n','i','n','e', 0,
+    'c','o','l','o','n', 0,
+    's','e','m','i','c','o','l','o','n', 0,
+    'l','e','s','s', 0,
+    'e','q','u','a','l', 0,
+    'g','r','e','a','t','e','r', 0,
+    'q','u','e','s','t','i','o','n', 0,
+    'a','t', 0,
+    'A', 0,
+    'B', 0,
+    'C', 0,
+    'D', 0,
+    'E', 0,
+    'F', 0,
+    'G', 0,
+    'H', 0,
+    'I', 0,
+    'J', 0,
+    'K', 0,
+    'L', 0,
+    'M', 0,
+    'N', 0,
+    'O', 0,
+    'P', 0,
+    'Q', 0,
+    'R', 0,
+    'S', 0,
+    'T', 0,
+    'U', 0,
+    'V', 0,
+    'W', 0,
+    'X', 0,
+    'Y', 0,
+    'Z', 0,
+    'b','r','a','c','k','e','t','l','e','f','t', 0,
+    'b','a','c','k','s','l','a','s','h', 0,
+    'b','r','a','c','k','e','t','r','i','g','h','t', 0,
+    'a','s','c','i','i','c','i','r','c','u','m', 0,
+    'u','n','d','e','r','s','c','o','r','e', 0,
+    'q','u','o','t','e','l','e','f','t', 0,
+    'a', 0,
+    'b', 0,
+    'c', 0,
+    'd', 0,
+    'e', 0,
+    'f', 0,
+    'g', 0,
+    'h', 0,
+    'i', 0,
+    'j', 0,
+    'k', 0,
+    'l', 0,
+    'm', 0,
+    'n', 0,
+    'o', 0,
+    'p', 0,
+    'q', 0,
+    'r', 0,
+    's', 0,
+    't', 0,
+    'u', 0,
+    'v', 0,
+    'w', 0,
+    'x', 0,
+    'y', 0,
+    'z', 0,
+    'b','r','a','c','e','l','e','f','t', 0,
+    'b','a','r', 0,
+    'b','r','a','c','e','r','i','g','h','t', 0,
+    'a','s','c','i','i','t','i','l','d','e', 0,
+    'e','x','c','l','a','m','d','o','w','n', 0,
+    'c','e','n','t', 0,
+    's','t','e','r','l','i','n','g', 0,
+    'f','r','a','c','t','i','o','n', 0,
+    'y','e','n', 0,
+    'f','l','o','r','i','n', 0,
+    's','e','c','t','i','o','n', 0,
+    'c','u','r','r','e','n','c','y', 0,
+    'q','u','o','t','e','s','i','n','g','l','e', 0,
+    'q','u','o','t','e','d','b','l','l','e','f','t', 0,
+    'g','u','i','l','l','e','m','o','t','l','e','f','t', 0,
+    'g','u','i','l','s','i','n','g','l','l','e','f','t', 0,
+    'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0,
+    'f','i', 0,
+    'f','l', 0,
+    'e','n','d','a','s','h', 0,
+    'd','a','g','g','e','r', 0,
+    'd','a','g','g','e','r','d','b','l', 0,
+    'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0,
+    'p','a','r','a','g','r','a','p','h', 0,
+    'b','u','l','l','e','t', 0,
+    'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0,
+    'q','u','o','t','e','d','b','l','b','a','s','e', 0,
+    'q','u','o','t','e','d','b','l','r','i','g','h','t', 0,
+    'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0,
+    'e','l','l','i','p','s','i','s', 0,
+    'p','e','r','t','h','o','u','s','a','n','d', 0,
+    'q','u','e','s','t','i','o','n','d','o','w','n', 0,
+    'g','r','a','v','e', 0,
+    'a','c','u','t','e', 0,
+    'c','i','r','c','u','m','f','l','e','x', 0,
+    't','i','l','d','e', 0,
+    'm','a','c','r','o','n', 0,
+    'b','r','e','v','e', 0,
+    'd','o','t','a','c','c','e','n','t', 0,
+    'd','i','e','r','e','s','i','s', 0,
+    'r','i','n','g', 0,
+    'c','e','d','i','l','l','a', 0,
+    'h','u','n','g','a','r','u','m','l','a','u','t', 0,
+    'o','g','o','n','e','k', 0,
+    'c','a','r','o','n', 0,
+    'e','m','d','a','s','h', 0,
+    'A','E', 0,
+    'o','r','d','f','e','m','i','n','i','n','e', 0,
+    'L','s','l','a','s','h', 0,
+    'O','s','l','a','s','h', 0,
+    'O','E', 0,
+    'o','r','d','m','a','s','c','u','l','i','n','e', 0,
+    'a','e', 0,
+    'd','o','t','l','e','s','s','i', 0,
+    'l','s','l','a','s','h', 0,
+    'o','s','l','a','s','h', 0,
+    'o','e', 0,
+    'g','e','r','m','a','n','d','b','l','s', 0,
+    'o','n','e','s','u','p','e','r','i','o','r', 0,
+    'l','o','g','i','c','a','l','n','o','t', 0,
+    'm','u', 0,
+    't','r','a','d','e','m','a','r','k', 0,
+    'E','t','h', 0,
+    'o','n','e','h','a','l','f', 0,
+    'p','l','u','s','m','i','n','u','s', 0,
+    'T','h','o','r','n', 0,
+    'o','n','e','q','u','a','r','t','e','r', 0,
+    'd','i','v','i','d','e', 0,
+    'b','r','o','k','e','n','b','a','r', 0,
+    'd','e','g','r','e','e', 0,
+    't','h','o','r','n', 0,
+    't','h','r','e','e','q','u','a','r','t','e','r','s', 0,
+    't','w','o','s','u','p','e','r','i','o','r', 0,
+    'r','e','g','i','s','t','e','r','e','d', 0,
+    'm','i','n','u','s', 0,
+    'e','t','h', 0,
+    'm','u','l','t','i','p','l','y', 0,
+    't','h','r','e','e','s','u','p','e','r','i','o','r', 0,
+    'c','o','p','y','r','i','g','h','t', 0,
+    'A','a','c','u','t','e', 0,
+    'A','c','i','r','c','u','m','f','l','e','x', 0,
+    'A','d','i','e','r','e','s','i','s', 0,
+    'A','g','r','a','v','e', 0,
+    'A','r','i','n','g', 0,
+    'A','t','i','l','d','e', 0,
+    'C','c','e','d','i','l','l','a', 0,
+    'E','a','c','u','t','e', 0,
+    'E','c','i','r','c','u','m','f','l','e','x', 0,
+    'E','d','i','e','r','e','s','i','s', 0,
+    'E','g','r','a','v','e', 0,
+    'I','a','c','u','t','e', 0,
+    'I','c','i','r','c','u','m','f','l','e','x', 0,
+    'I','d','i','e','r','e','s','i','s', 0,
+    'I','g','r','a','v','e', 0,
+    'N','t','i','l','d','e', 0,
+    'O','a','c','u','t','e', 0,
+    'O','c','i','r','c','u','m','f','l','e','x', 0,
+    'O','d','i','e','r','e','s','i','s', 0,
+    'O','g','r','a','v','e', 0,
+    'O','t','i','l','d','e', 0,
+    'S','c','a','r','o','n', 0,
+    'U','a','c','u','t','e', 0,
+    'U','c','i','r','c','u','m','f','l','e','x', 0,
+    'U','d','i','e','r','e','s','i','s', 0,
+    'U','g','r','a','v','e', 0,
+    'Y','a','c','u','t','e', 0,
+    'Y','d','i','e','r','e','s','i','s', 0,
+    'Z','c','a','r','o','n', 0,
+    'a','a','c','u','t','e', 0,
+    'a','c','i','r','c','u','m','f','l','e','x', 0,
+    'a','d','i','e','r','e','s','i','s', 0,
+    'a','g','r','a','v','e', 0,
+    'a','r','i','n','g', 0,
+    'a','t','i','l','d','e', 0,
+    'c','c','e','d','i','l','l','a', 0,
+    'e','a','c','u','t','e', 0,
+    'e','c','i','r','c','u','m','f','l','e','x', 0,
+    'e','d','i','e','r','e','s','i','s', 0,
+    'e','g','r','a','v','e', 0,
+    'i','a','c','u','t','e', 0,
+    'i','c','i','r','c','u','m','f','l','e','x', 0,
+    'i','d','i','e','r','e','s','i','s', 0,
+    'i','g','r','a','v','e', 0,
+    'n','t','i','l','d','e', 0,
+    'o','a','c','u','t','e', 0,
+    'o','c','i','r','c','u','m','f','l','e','x', 0,
+    'o','d','i','e','r','e','s','i','s', 0,
+    'o','g','r','a','v','e', 0,
+    'o','t','i','l','d','e', 0,
+    's','c','a','r','o','n', 0,
+    'u','a','c','u','t','e', 0,
+    'u','c','i','r','c','u','m','f','l','e','x', 0,
+    'u','d','i','e','r','e','s','i','s', 0,
+    'u','g','r','a','v','e', 0,
+    'y','a','c','u','t','e', 0,
+    'y','d','i','e','r','e','s','i','s', 0,
+    'z','c','a','r','o','n', 0,
+    'e','x','c','l','a','m','s','m','a','l','l', 0,
+    'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0,
+    'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0,
+    'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0,
+    'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0,
+    'A','c','u','t','e','s','m','a','l','l', 0,
+    'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0,
+    'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0,
+    't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0,
+    'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0,
+    'z','e','r','o','o','l','d','s','t','y','l','e', 0,
+    'o','n','e','o','l','d','s','t','y','l','e', 0,
+    't','w','o','o','l','d','s','t','y','l','e', 0,
+    't','h','r','e','e','o','l','d','s','t','y','l','e', 0,
+    'f','o','u','r','o','l','d','s','t','y','l','e', 0,
+    'f','i','v','e','o','l','d','s','t','y','l','e', 0,
+    's','i','x','o','l','d','s','t','y','l','e', 0,
+    's','e','v','e','n','o','l','d','s','t','y','l','e', 0,
+    'e','i','g','h','t','o','l','d','s','t','y','l','e', 0,
+    'n','i','n','e','o','l','d','s','t','y','l','e', 0,
+    'c','o','m','m','a','s','u','p','e','r','i','o','r', 0,
+    't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0,
+    'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0,
+    'q','u','e','s','t','i','o','n','s','m','a','l','l', 0,
+    'a','s','u','p','e','r','i','o','r', 0,
+    'b','s','u','p','e','r','i','o','r', 0,
+    'c','e','n','t','s','u','p','e','r','i','o','r', 0,
+    'd','s','u','p','e','r','i','o','r', 0,
+    'e','s','u','p','e','r','i','o','r', 0,
+    'i','s','u','p','e','r','i','o','r', 0,
+    'l','s','u','p','e','r','i','o','r', 0,
+    'm','s','u','p','e','r','i','o','r', 0,
+    'n','s','u','p','e','r','i','o','r', 0,
+    'o','s','u','p','e','r','i','o','r', 0,
+    'r','s','u','p','e','r','i','o','r', 0,
+    's','s','u','p','e','r','i','o','r', 0,
+    't','s','u','p','e','r','i','o','r', 0,
+    'f','f', 0,
+    'f','f','i', 0,
+    'f','f','l', 0,
+    'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0,
+    'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0,
+    'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+    'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0,
+    'G','r','a','v','e','s','m','a','l','l', 0,
+    'A','s','m','a','l','l', 0,
+    'B','s','m','a','l','l', 0,
+    'C','s','m','a','l','l', 0,
+    'D','s','m','a','l','l', 0,
+    'E','s','m','a','l','l', 0,
+    'F','s','m','a','l','l', 0,
+    'G','s','m','a','l','l', 0,
+    'H','s','m','a','l','l', 0,
+    'I','s','m','a','l','l', 0,
+    'J','s','m','a','l','l', 0,
+    'K','s','m','a','l','l', 0,
+    'L','s','m','a','l','l', 0,
+    'M','s','m','a','l','l', 0,
+    'N','s','m','a','l','l', 0,
+    'O','s','m','a','l','l', 0,
+    'P','s','m','a','l','l', 0,
+    'Q','s','m','a','l','l', 0,
+    'R','s','m','a','l','l', 0,
+    'S','s','m','a','l','l', 0,
+    'T','s','m','a','l','l', 0,
+    'U','s','m','a','l','l', 0,
+    'V','s','m','a','l','l', 0,
+    'W','s','m','a','l','l', 0,
+    'X','s','m','a','l','l', 0,
+    'Y','s','m','a','l','l', 0,
+    'Z','s','m','a','l','l', 0,
+    'c','o','l','o','n','m','o','n','e','t','a','r','y', 0,
+    'o','n','e','f','i','t','t','e','d', 0,
+    'r','u','p','i','a','h', 0,
+    'T','i','l','d','e','s','m','a','l','l', 0,
+    'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0,
+    'c','e','n','t','o','l','d','s','t','y','l','e', 0,
+    'L','s','l','a','s','h','s','m','a','l','l', 0,
+    'S','c','a','r','o','n','s','m','a','l','l', 0,
+    'Z','c','a','r','o','n','s','m','a','l','l', 0,
+    'D','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    'B','r','e','v','e','s','m','a','l','l', 0,
+    'C','a','r','o','n','s','m','a','l','l', 0,
+    'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0,
+    'M','a','c','r','o','n','s','m','a','l','l', 0,
+    'f','i','g','u','r','e','d','a','s','h', 0,
+    'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0,
+    'O','g','o','n','e','k','s','m','a','l','l', 0,
+    'R','i','n','g','s','m','a','l','l', 0,
+    'C','e','d','i','l','l','a','s','m','a','l','l', 0,
+    'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0,
+    'o','n','e','e','i','g','h','t','h', 0,
+    't','h','r','e','e','e','i','g','h','t','h','s', 0,
+    'f','i','v','e','e','i','g','h','t','h','s', 0,
+    's','e','v','e','n','e','i','g','h','t','h','s', 0,
+    'o','n','e','t','h','i','r','d', 0,
+    't','w','o','t','h','i','r','d','s', 0,
+    'z','e','r','o','s','u','p','e','r','i','o','r', 0,
+    'f','o','u','r','s','u','p','e','r','i','o','r', 0,
+    'f','i','v','e','s','u','p','e','r','i','o','r', 0,
+    's','i','x','s','u','p','e','r','i','o','r', 0,
+    's','e','v','e','n','s','u','p','e','r','i','o','r', 0,
+    'e','i','g','h','t','s','u','p','e','r','i','o','r', 0,
+    'n','i','n','e','s','u','p','e','r','i','o','r', 0,
+    'z','e','r','o','i','n','f','e','r','i','o','r', 0,
+    'o','n','e','i','n','f','e','r','i','o','r', 0,
+    't','w','o','i','n','f','e','r','i','o','r', 0,
+    't','h','r','e','e','i','n','f','e','r','i','o','r', 0,
+    'f','o','u','r','i','n','f','e','r','i','o','r', 0,
+    'f','i','v','e','i','n','f','e','r','i','o','r', 0,
+    's','i','x','i','n','f','e','r','i','o','r', 0,
+    's','e','v','e','n','i','n','f','e','r','i','o','r', 0,
+    'e','i','g','h','t','i','n','f','e','r','i','o','r', 0,
+    'n','i','n','e','i','n','f','e','r','i','o','r', 0,
+    'c','e','n','t','i','n','f','e','r','i','o','r', 0,
+    'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0,
+    'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0,
+    'c','o','m','m','a','i','n','f','e','r','i','o','r', 0,
+    'A','g','r','a','v','e','s','m','a','l','l', 0,
+    'A','a','c','u','t','e','s','m','a','l','l', 0,
+    'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+    'A','t','i','l','d','e','s','m','a','l','l', 0,
+    'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    'A','r','i','n','g','s','m','a','l','l', 0,
+    'A','E','s','m','a','l','l', 0,
+    'C','c','e','d','i','l','l','a','s','m','a','l','l', 0,
+    'E','g','r','a','v','e','s','m','a','l','l', 0,
+    'E','a','c','u','t','e','s','m','a','l','l', 0,
+    'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+    'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    'I','g','r','a','v','e','s','m','a','l','l', 0,
+    'I','a','c','u','t','e','s','m','a','l','l', 0,
+    'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+    'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    'E','t','h','s','m','a','l','l', 0,
+    'N','t','i','l','d','e','s','m','a','l','l', 0,
+    'O','g','r','a','v','e','s','m','a','l','l', 0,
+    'O','a','c','u','t','e','s','m','a','l','l', 0,
+    'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+    'O','t','i','l','d','e','s','m','a','l','l', 0,
+    'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    'O','E','s','m','a','l','l', 0,
+    'O','s','l','a','s','h','s','m','a','l','l', 0,
+    'U','g','r','a','v','e','s','m','a','l','l', 0,
+    'U','a','c','u','t','e','s','m','a','l','l', 0,
+    'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+    'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    'Y','a','c','u','t','e','s','m','a','l','l', 0,
+    'T','h','o','r','n','s','m','a','l','l', 0,
+    'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    '0','0','1','.','0','0','0', 0,
+    '0','0','1','.','0','0','1', 0,
+    '0','0','1','.','0','0','2', 0,
+    '0','0','1','.','0','0','3', 0,
+    'B','l','a','c','k', 0,
+    'B','o','l','d', 0,
+    'B','o','o','k', 0,
+    'L','i','g','h','t', 0,
+    'M','e','d','i','u','m', 0,
+    'R','e','g','u','l','a','r', 0,
+    'R','o','m','a','n', 0,
+    'S','e','m','i','b','o','l','d', 0,
+  };
+
+
+#define FT_NUM_MAC_NAMES  258
+
+  /* Values are offsets into the `ft_standard_glyph_names' table */
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+  static const short  ft_mac_names[FT_NUM_MAC_NAMES] =
+  {
+     253,   0,   6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351,
+     360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430,
+     436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498,
+     500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526,
+     528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610,
+     612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638,
+     640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685,
+    1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652,
+    1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776,
+    1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346,
+    1197, 985,1031,  23,1086,1108,  32,1219,  41,  51, 730,1194,  64,  76,
+      86,  94,  97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120,
+     132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916,
+     598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856,
+     888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500,
+     163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053,
+    1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229,
+    1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200,
+     209, 218, 225, 232, 239, 246
+  };
+
+
+#define FT_NUM_SID_NAMES  391
+
+  /* Values are offsets into the `ft_standard_glyph_names' table */
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+  static const short  ft_sid_names[FT_NUM_SID_NAMES] =
+  {
+     253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365,
+     371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441,
+     447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502,
+     504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530,
+     532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614,
+     616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642,
+     644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707,
+     712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832,
+     839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985,
+     991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089,
+    1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197,
+    1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319,
+    1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443,
+    1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562,
+    1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680,
+    1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797,
+    1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973,
+    1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167,
+    2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319,
+    2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454,
+    2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552,
+    2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684,
+    2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860,
+    2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034,
+    3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220,
+    3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409,
+    3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586,
+    3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687
+  };
+
+
+  /* the following are indices into the SID name table */
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+  static const unsigned short  t1_standard_encoding[256] =
+  {
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
+     17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+     33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
+     49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+     65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+     81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,  0,
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,
+      0,111,112,113,114,  0,115,116,117,118,119,120,121,122,  0,123,
+      0,124,125,126,127,128,129,130,131,  0,132,133,  0,134,135,136,
+    137,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0,138,  0,139,  0,  0,  0,  0,140,141,142,143,  0,  0,  0,  0,
+      0,144,  0,  0,  0,145,  0,  0,146,147,148,149,  0,  0,  0,  0
+  };
+
+
+  /* the following are indices into the SID name table */
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+  static const unsigned short  t1_expert_encoding[256] =
+  {
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      1,229,230,  0,231,232,233,234,235,236,237,238, 13, 14, 15, 99,
+    239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252,
+      0,253,254,255,256,257,  0,  0,  0,258,  0,  0,259,260,261,262,
+      0,  0,263,264,265,  0,266,109,110,267,268,269,  0,270,271,272,
+    273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,
+    289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,  0,
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0,304,305,306,  0,  0,307,308,309,310,311,  0,312,  0,  0,313,
+      0,  0,314,315,  0,  0,316,317,318,  0,  0,  0,158,155,163,319,
+    320,321,322,323,324,325,  0,  0,326,150,164,169,327,328,329,330,
+    331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,
+    347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,
+    363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378
+  };
+
+
+  /*
+   *  This table is a compressed version of the Adobe Glyph List (AGL),
+   *  optimized for efficient searching.  It has been generated by the
+   *  `glnames.py' python script located in the `src/tools' directory.
+   *
+   *  The lookup function to get the Unicode value for a given string
+   *  is defined below the table.
+   */
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+  static const unsigned char  ft_adobe_glyph_list[55997L] =
+  {
+      0, 52,  0,106,  2,167,  3, 63,  4,220,  6,125,  9,143, 10, 23,
+     11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88,
+     22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107,
+     32,222, 33, 55, 34,154, 35,218, 58, 10, 64,122, 72,188, 80,109,
+     88,104, 93, 61, 98,168,106, 91,114,111,115,237,122,180,127,255,
+    135,164,143,132,149,213,158,108,161,115,168,175,183,147,197,199,
+    202, 25,204,166,208,209,209, 81,215, 26, 65,143,  0, 65,  0,140,
+      0,175,  0,193,  1, 15,  1,147,  1,233,  1,251,  2,  7,  2, 40,
+      2, 57,  2, 82,  2, 91,  2,128,  2,136,  2,154, 69,131,  0,198,
+      0,150,  0,158,  0,167,225,227,245,244,101,128,  1,252,237,225,
+    227,242,239,110,128,  1,226,243,237,225,236,108,128,247,230,225,
+    227,245,244,101,129,  0,193,  0,185,243,237,225,236,108,128,247,
+    225,226,242,229,246,101,134,  1,  2,  0,213,  0,221,  0,232,  0,
+    243,  0,251,  1,  7,225,227,245,244,101,128, 30,174,227,249,242,
+    233,236,236,233, 99,128,  4,208,228,239,244,226,229,236,239,119,
+    128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225,
+    226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99,
+      4,  1, 25,  1, 32,  1,121,  1,137,225,242,239,110,128,  1,205,
+    233,242, 99,  2,  1, 40,  1, 45,236,101,128, 36,182,245,237,230,
+    236,229,120,134,  0,194,  1, 66,  1, 74,  1, 85,  1, 93,  1,105,
+      1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236,
+    239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239,
+    235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247,
+    226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201,  1,
+    129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99,
+    128,  4, 16,100,  3,  1,155,  1,165,  1,209,226,236,231,242,225,
+    246,101,128,  2,  0,233,229,242,229,243,233,115,131,  0,196,  1,
+    181,  1,192,  1,201,227,249,242,233,236,236,233, 99,128,  4,210,
+    237,225,227,242,239,110,128,  1,222,243,237,225,236,108,128,247,
+    228,239,116,  2,  1,216,  1,224,226,229,236,239,119,128, 30,160,
+    237,225,227,242,239,110,128,  1,224,231,242,225,246,101,129,  0,
+    192,  1,243,243,237,225,236,108,128,247,224,232,239,239,235,225,
+    226,239,246,101,128, 30,162,105,  2,  2, 13,  2, 25,229,227,249,
+    242,233,236,236,233, 99,128,  4,212,238,246,229,242,244,229,228,
+    226,242,229,246,101,128,  2,  2,236,240,232, 97,129,  3,145,  2,
+     49,244,239,238,239,115,128,  3,134,109,  2,  2, 63,  2, 71,225,
+    227,242,239,110,128,  1,  0,239,238,239,243,240,225,227,101,128,
+    255, 33,239,231,239,238,229,107,128,  1,  4,242,233,238,103,131,
+      0,197,  2,104,  2,112,  2,120,225,227,245,244,101,128,  1,250,
+    226,229,236,239,119,128, 30,  0,243,237,225,236,108,128,247,229,
+    243,237,225,236,108,128,247, 97,244,233,236,228,101,129,  0,195,
+      2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229,
+    238,233,225,110,128,  5, 49, 66,137,  0, 66,  2,189,  2,198,  2,
+    223,  3,  3,  3, 10,  3, 22,  3, 34,  3, 46,  3, 54,227,233,242,
+    227,236,101,128, 36,183,228,239,116,  2,  2,206,  2,215,225,227,
+    227,229,238,116,128, 30,  2,226,229,236,239,119,128, 30,  4,101,
+      3,  2,231,  2,242,  2,254,227,249,242,233,236,236,233, 99,128,
+      4, 17,238,225,242,237,229,238,233,225,110,128,  5, 50,244, 97,
+    128,  3,146,232,239,239,107,128,  1,129,236,233,238,229,226,229,
+    236,239,119,128, 30,  6,237,239,238,239,243,240,225,227,101,128,
+    255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237,
+    225,236,108,128,247, 98,244,239,240,226,225,114,128,  1,130, 67,
+    137,  0, 67,  3, 85,  3,127,  3,193,  3,210,  3,224,  4,171,  4,
+    188,  4,200,  4,212, 97,  3,  3, 93,  3,104,  3,111,225,242,237,
+    229,238,233,225,110,128,  5, 62,227,245,244,101,128,  1,  6,242,
+    239,110,129,246,202,  3,119,243,237,225,236,108,128,246,245, 99,
+      3,  3,135,  3,142,  3,171,225,242,239,110,128,  1, 12,229,228,
+    233,236,236, 97,130,  0,199,  3,155,  3,163,225,227,245,244,101,
+    128, 30,  8,243,237,225,236,108,128,247,231,233,242, 99,  2,  3,
+    179,  3,184,236,101,128, 36,184,245,237,230,236,229,120,128,  1,
+      8,228,239,116,129,  1, 10,  3,201,225,227,227,229,238,116,128,
+      1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184,
+    104,  4,  3,234,  3,246,  4,161,  4,165,225,225,242,237,229,238,
+    233,225,110,128,  5, 73,101,  6,  4,  4,  4, 24,  4, 35,  4,103,
+      4,115,  4,136,225,226,235,232,225,243,233,225,238,227,249,242,
+    233,236,236,233, 99,128,  4,188,227,249,242,233,236,236,233, 99,
+    128,  4, 39,100,  2,  4, 41,  4, 85,229,243,227,229,238,228,229,
+    114,  2,  4, 54,  4, 74,225,226,235,232,225,243,233,225,238,227,
+    249,242,233,236,236,233, 99,128,  4,190,227,249,242,233,236,236,
+    233, 99,128,  4,182,233,229,242,229,243,233,243,227,249,242,233,
+    236,236,233, 99,128,  4,244,232,225,242,237,229,238,233,225,110,
+    128,  5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242,
+    233,236,236,233, 99,128,  4,203,246,229,242,244,233,227,225,236,
+    243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,
+    184,105,128,  3,167,239,239,107,128,  1,135,233,242,227,245,237,
+    230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239,
+    243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225,
+    110,128,  5, 81,243,237,225,236,108,128,247, 99, 68,142,  0, 68,
+      4,252,  5, 10,  5, 36,  5, 96,  5,121,  5,166,  5,173,  5,231,
+      5,244,  6,  0,  6, 12,  6, 28,  6, 48,  6, 57, 90,129,  1,241,
+      5,  2,227,225,242,239,110,128,  1,196, 97,  2,  5, 16,  5, 27,
+    225,242,237,229,238,233,225,110,128,  5, 52,230,242,233,227,225,
+    110,128,  1,137, 99,  4,  5, 46,  5, 53,  5, 62,  5, 89,225,242,
+    239,110,128,  1, 14,229,228,233,236,236, 97,128, 30, 16,233,242,
+     99,  2,  5, 70,  5, 75,236,101,128, 36,185,245,237,230,236,229,
+    248,226,229,236,239,119,128, 30, 18,242,239,225,116,128,  1, 16,
+    228,239,116,  2,  5,104,  5,113,225,227,227,229,238,116,128, 30,
+     10,226,229,236,239,119,128, 30, 12,101,  3,  5,129,  5,140,  5,
+    150,227,249,242,233,236,236,233, 99,128,  4, 20,233,227,239,240,
+    244,233, 99,128,  3,238,236,244, 97,129, 34,  6,  5,158,231,242,
+    229,229,107,128,  3,148,232,239,239,107,128,  1,138,105,  2,  5,
+    179,  5,218,229,242,229,243,233,115,131,246,203,  5,194,  5,202,
+      5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128,
+    246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231,
+    242,229,229,107,128,  3,220,234,229,227,249,242,233,236,236,233,
+     99,128,  4,  2,236,233,238,229,226,229,236,239,119,128, 30, 14,
+    237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227,
+    227,229,238,244,243,237,225,236,108,128,246,247,115,  2,  6, 34,
+      6, 41,236,225,243,104,128,  1, 16,237,225,236,108,128,247,100,
+    244,239,240,226,225,114,128,  1,139,122,131,  1,242,  6, 67,  6,
+     75,  6,112,227,225,242,239,110,128,  1,197,101,  2,  6, 81,  6,
+    101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,
+    233, 99,128,  4,224,227,249,242,233,236,236,233, 99,128,  4,  5,
+    232,229,227,249,242,233,236,236,233, 99,128,  4, 15, 69,146,  0,
+     69,  6,165,  6,183,  6,191,  7, 89,  7,153,  7,165,  7,183,  7,
+    211,  8,  7,  8, 36,  8, 94,  8,169,  8,189,  8,208,  8,248,  9,
+     44,  9,109,  9,115,225,227,245,244,101,129,  0,201,  6,175,243,
+    237,225,236,108,128,247,233,226,242,229,246,101,128,  1, 20, 99,
+      5,  6,203,  6,210,  6,224,  6,236,  7, 79,225,242,239,110,128,
+      1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28,
+    232,225,242,237,229,238,233,225,110,128,  5, 53,233,242, 99,  2,
+      6,244,  6,249,236,101,128, 36,186,245,237,230,236,229,120,135,
+      0,202,  7, 16,  7, 24,  7, 32,  7, 43,  7, 51,  7, 63,  7, 71,
+    225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24,
+    228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101,
+    128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243,
+    237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249,
+    242,233,236,236,233, 99,128,  4,  4,100,  3,  7, 97,  7,107,  7,
+    127,226,236,231,242,225,246,101,128,  2,  4,233,229,242,229,243,
+    233,115,129,  0,203,  7,119,243,237,225,236,108,128,247,235,239,
+    116,130,  1, 22,  7,136,  7,145,225,227,227,229,238,116,128,  1,
+     22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236,
+    233, 99,128,  4, 36,231,242,225,246,101,129,  0,200,  7,175,243,
+    237,225,236,108,128,247,232,104,  2,  7,189,  7,200,225,242,237,
+    229,238,233,225,110,128,  5, 55,239,239,235,225,226,239,246,101,
+    128, 30,186,105,  3,  7,219,  7,230,  7,245,231,232,244,242,239,
+    237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229,
+    246,101,128,  2,  6,239,244,233,230,233,229,228,227,249,242,233,
+    236,236,233, 99,128,  4,100,108,  2,  8, 13,  8, 24,227,249,242,
+    233,236,236,233, 99,128,  4, 27,229,246,229,238,242,239,237,225,
+    110,128, 33,106,109,  3,  8, 44,  8, 72,  8, 83,225,227,242,239,
+    110,130,  1, 18,  8, 56,  8, 64,225,227,245,244,101,128, 30, 22,
+    231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99,
+    128,  4, 28,239,238,239,243,240,225,227,101,128,255, 37,110,  4,
+      8,104,  8,115,  8,135,  8,154,227,249,242,233,236,236,233, 99,
+    128,  4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233,
+    236,236,233, 99,128,  4,162,103,129,  1, 74,  8,141,232,229,227,
+    249,242,233,236,236,233, 99,128,  4,164,232,239,239,235,227,249,
+    242,233,236,236,233, 99,128,  4,199,111,  2,  8,175,  8,183,231,
+    239,238,229,107,128,  1, 24,240,229,110,128,  1,144,240,243,233,
+    236,239,110,129,  3,149,  8,200,244,239,238,239,115,128,  3,136,
+    114,  2,  8,214,  8,225,227,249,242,233,236,236,233, 99,128,  4,
+     32,229,246,229,242,243,229,100,129,  1,142,  8,237,227,249,242,
+    233,236,236,233, 99,128,  4, 45,115,  4,  9,  2,  9, 13,  9, 33,
+      9, 37,227,249,242,233,236,236,233, 99,128,  4, 33,228,229,243,
+    227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,
+    170,104,128,  1,169,237,225,236,108,128,247,101,116,  3,  9, 52,
+      9, 78,  9, 92, 97,130,  3,151,  9, 60,  9, 70,242,237,229,238,
+    233,225,110,128,  5, 56,244,239,238,239,115,128,  3,137,104,129,
+      0,208,  9, 84,243,237,225,236,108,128,247,240,233,236,228,101,
+    129, 30,188,  9,101,226,229,236,239,119,128, 30, 26,245,242,111,
+    128, 32,172,250,104,130,  1,183,  9,124,  9,132,227,225,242,239,
+    110,128,  1,238,242,229,246,229,242,243,229,100,128,  1,184, 70,
+    136,  0, 70,  9,163,  9,172,  9,184,  9,212,  9,219,  9,248, 10,
+      4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225,
+    227,227,229,238,116,128, 30, 30,101,  2,  9,190,  9,202,232,225,
+    242,237,229,238,233,225,110,128,  5, 86,233,227,239,240,244,233,
+     99,128,  3,228,232,239,239,107,128,  1,145,105,  2,  9,225,  9,
+    238,244,225,227,249,242,233,236,236,233, 99,128,  4,114,246,229,
+    242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227,
+    101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243,
+    237,225,236,108,128,247,102, 71,140,  0, 71, 10, 51, 10, 61, 10,
+    107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11,
+     90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97,  3, 10,
+     69, 10, 76, 10, 94,227,245,244,101,128,  1,244,237,237, 97,129,
+      3,147, 10, 84,225,230,242,233,227,225,110,128,  1,148,238,231,
+    233,225,227,239,240,244,233, 99,128,  3,234,226,242,229,246,101,
+    128,  1, 30, 99,  4, 10,125, 10,132, 10,141, 10,163,225,242,239,
+    110,128,  1,230,229,228,233,236,236, 97,128,  1, 34,233,242, 99,
+      2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120,
+    128,  1, 28,239,237,237,225,225,227,227,229,238,116,128,  1, 34,
+    228,239,116,129,  1, 32, 10,184,225,227,227,229,238,116,128,  1,
+     32,229,227,249,242,233,236,236,233, 99,128,  4, 19,104,  3, 10,
+    213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128,
+      5, 66,101,  3, 10,234, 10,255, 11, 16,237,233,228,228,236,229,
+    232,239,239,235,227,249,242,233,236,236,233, 99,128,  4,148,243,
+    244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,146,
+    245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128,  4,
+    144,239,239,107,128,  1,147,233,237,225,242,237,229,238,233,225,
+    110,128,  5, 51,234,229,227,249,242,233,236,236,233, 99,128,  4,
+      3,109,  2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239,
+    238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246,
+    206, 11, 99,243,237,225,236,108,128,247, 96,115,  2, 11,113, 11,
+    129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128,  2,
+    155,244,242,239,235,101,128,  1,228, 72,140,  0, 72, 11,165, 11,
+    190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12,
+    157, 12,165, 12,189,177,184, 53,  3, 11,175, 11,180, 11,185,179,
+     51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178,
+    176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203,
+     97,  3, 11,216, 11,236, 12,  0,225,226,235,232,225,243,233,225,
+    238,227,249,242,233,236,236,233, 99,128,  4,168,228,229,243,227,
+    229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,178,
+    242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128,  4,
+     42, 98,  2, 12, 23, 12, 28,225,114,128,  1, 38,242,229,246,229,
+    226,229,236,239,119,128, 30, 42, 99,  2, 12, 46, 12, 55,229,228,
+    233,236,236, 97,128, 30, 40,233,242, 99,  2, 12, 63, 12, 68,236,
+    101,128, 36,189,245,237,230,236,229,120,128,  1, 36,100,  2, 12,
+     83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116,  2,
+     12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236,
+    239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255,
+     40,111,  2, 12,135, 12,146,225,242,237,229,238,233,225,110,128,
+      5, 64,242,233,227,239,240,244,233, 99,128,  3,232,243,237,225,
+    236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116,
+    129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241,
+    245,225,242,101,128, 51,144, 73,146,  0, 73, 12,239, 12,251, 12,
+    255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13,
+    242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193,
+    227,249,242,233,236,236,233, 99,128,  4, 47, 74,128,  1, 50,213,
+    227,249,242,233,236,236,233, 99,128,  4, 46,225,227,245,244,101,
+    129,  0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229,
+    246,101,128,  1, 44, 99,  3, 13, 45, 13, 52, 13, 84,225,242,239,
+    110,128,  1,207,233,242, 99,  2, 13, 60, 13, 65,236,101,128, 36,
+    190,245,237,230,236,229,120,129,  0,206, 13, 76,243,237,225,236,
+    108,128,247,238,249,242,233,236,236,233, 99,128,  4,  6,100,  3,
+     13,102, 13,112, 13,155,226,236,231,242,225,246,101,128,  2,  8,
+    233,229,242,229,243,233,115,131,  0,207, 13,128, 13,136, 13,147,
+    225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99,
+    128,  4,228,243,237,225,236,108,128,247,239,239,116,130,  1, 48,
+     13,164, 13,173,225,227,227,229,238,116,128,  1, 48,226,229,236,
+    239,119,128, 30,202,101,  2, 13,187, 13,203,226,242,229,246,229,
+    227,249,242,233,236,236,233, 99,128,  4,214,227,249,242,233,236,
+    236,233, 99,128,  4, 21,230,242,225,235,244,245,114,128, 33, 17,
+    231,242,225,246,101,129,  0,204, 13,234,243,237,225,236,108,128,
+    247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105,  3,
+     14,  6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128,  4,
+     24,238,246,229,242,244,229,228,226,242,229,246,101,128,  2, 10,
+    243,232,239,242,244,227,249,242,233,236,236,233, 99,128,  4, 25,
+    109,  2, 14, 54, 14, 75,225,227,242,239,110,129,  1, 42, 14, 64,
+    227,249,242,233,236,236,233, 99,128,  4,226,239,238,239,243,240,
+    225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110,
+    128,  5, 59,111,  3, 14,107, 14,118, 14,126,227,249,242,233,236,
+    236,233, 99,128,  4,  1,231,239,238,229,107,128,  1, 46,244, 97,
+    131,  3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110,
+    128,  1,150,228,233,229,242,229,243,233,115,128,  3,170,244,239,
+    238,239,115,128,  3,138,115,  2, 14,172, 14,179,237,225,236,108,
+    128,247,105,244,242,239,235,101,128,  1,151,244,233,236,228,101,
+    129,  1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233,
+    244,243, 97,  2, 14,216, 14,227,227,249,242,233,236,236,233, 99,
+    128,  4,116,228,226,236,231,242,225,246,229,227,249,242,233,236,
+    236,233, 99,128,  4,118, 74,134,  0, 74, 15,  6, 15, 18, 15, 41,
+     15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128,
+      5, 65,227,233,242, 99,  2, 15, 27, 15, 32,236,101,128, 36,191,
+    245,237,230,236,229,120,128,  1, 52,229,227,249,242,233,236,236,
+    233, 99,128,  4,  8,232,229,232,225,242,237,229,238,233,225,110,
+    128,  5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243,
+    237,225,236,108,128,247,106, 75,140,  0, 75, 15,115, 15,125, 15,
+    135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16,
+    180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241,
+    245,225,242,101,128, 51,205, 97,  7, 15,151, 15,169, 15,191, 15,
+    211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249,
+    242,233,236,236,233, 99,128,  4,160, 99,  2, 15,175, 15,181,245,
+    244,101,128, 30, 48,249,242,233,236,236,233, 99,128,  4, 26,228,
+    229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,
+    128,  4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128,
+      4,195,240,240, 97,128,  3,154,243,244,242,239,235,229,227,249,
+    242,233,236,236,233, 99,128,  4,158,246,229,242,244,233,227,225,
+    236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128,
+      4,156, 99,  4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110,
+    128,  1,232,229,228,233,236,236, 97,128,  1, 54,233,242,227,236,
+    101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128,  1,
+     54,228,239,244,226,229,236,239,119,128, 30, 50,101,  2, 16, 82,
+     16, 94,232,225,242,237,229,238,233,225,110,128,  5, 84,238,225,
+    242,237,229,238,233,225,110,128,  5, 63,104,  3, 16,114, 16,126,
+     16,137,225,227,249,242,233,236,236,233, 99,128,  4, 37,229,233,
+    227,239,240,244,233, 99,128,  3,230,239,239,107,128,  1,152,234,
+    229,227,249,242,233,236,236,233, 99,128,  4, 12,236,233,238,229,
+    226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227,
+    101,128,255, 43,239,240,240, 97,  2, 16,189, 16,200,227,249,242,
+    233,236,236,233, 99,128,  4,128,231,242,229,229,107,128,  3,222,
+    115,  2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128,
+      4,110,237,225,236,108,128,247,107, 76,138,  0, 76, 17,  1, 17,
+      5, 17,  9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17,
+    189, 74,128,  1,199, 76,128,246,191, 97,  2, 17, 15, 17, 22,227,
+    245,244,101,128,  1, 57,237,226,228, 97,128,  3,155, 99,  4, 17,
+     39, 17, 46, 17, 55, 17, 82,225,242,239,110,128,  1, 61,229,228,
+    233,236,236, 97,128,  1, 59,233,242, 99,  2, 17, 63, 17, 68,236,
+    101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128,
+     30, 60,239,237,237,225,225,227,227,229,238,116,128,  1, 59,228,
+    239,116,130,  1, 63, 17,105, 17,114,225,227,227,229,238,116,128,
+      1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242,
+    239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110,
+    128,  5, 60,106,129,  1,200, 17,153,229,227,249,242,233,236,236,
+    233, 99,128,  4,  9,236,233,238,229,226,229,236,239,119,128, 30,
+     58,237,239,238,239,243,240,225,227,101,128,255, 44,115,  2, 17,
+    195, 17,212,236,225,243,104,129,  1, 65, 17,204,243,237,225,236,
+    108,128,246,249,237,225,236,108,128,247,108, 77,137,  0, 77, 17,
+    241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18,
+    100,194,243,241,245,225,242,101,128, 51,134,225, 99,  2, 18,  2,
+     18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128,
+    247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36,
+    194,228,239,116,  2, 18, 41, 18, 50,225,227,227,229,238,116,128,
+     30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229,
+    238,233,225,110,128,  5, 68,237,239,238,239,243,240,225,227,101,
+    128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229,
+    100,128,  1,156,117,128,  3,156, 78,141,  0, 78, 18,134, 18,138,
+     18,146, 18,212, 18,237, 18,248, 19,  3, 19, 21, 19, 33, 19, 45,
+     19, 58, 19, 66, 19, 84, 74,128,  1,202,225,227,245,244,101,128,
+      1, 67, 99,  4, 18,156, 18,163, 18,172, 18,199,225,242,239,110,
+    128,  1, 71,229,228,233,236,236, 97,128,  1, 69,233,242, 99,  2,
+     18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226,
+    229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238,
+    116,128,  1, 69,228,239,116,  2, 18,220, 18,229,225,227,227,229,
+    238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239,
+    235,236,229,230,116,128,  1,157,233,238,229,242,239,237,225,110,
+    128, 33,104,106,129,  1,203, 19,  9,229,227,249,242,233,236,236,
+    233, 99,128,  4, 10,236,233,238,229,226,229,236,239,119,128, 30,
+     72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225,
+    242,237,229,238,233,225,110,128,  5, 70,243,237,225,236,108,128,
+    247,110,244,233,236,228,101,129,  0,209, 19, 76,243,237,225,236,
+    108,128,247,241,117,128,  3,157, 79,141,  0, 79, 19,118, 19,132,
+     19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213,
+     21,223, 21,254, 22, 53, 69,129,  1, 82, 19,124,243,237,225,236,
+    108,128,246,250,225,227,245,244,101,129,  0,211, 19,142,243,237,
+    225,236,108,128,247,243, 98,  2, 19,156, 19,196,225,242,242,229,
+    100,  2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128,  4,
+    232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
+     99,128,  4,234,242,229,246,101,128,  1, 78, 99,  4, 19,213, 19,
+    220, 19,235, 20, 68,225,242,239,110,128,  1,209,229,238,244,229,
+    242,229,228,244,233,236,228,101,128,  1,159,233,242, 99,  2, 19,
+    243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134,  0,
+    212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245,
+    244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216,
+    231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246,
+    101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228,
+    101,128, 30,214,249,242,233,236,236,233, 99,128,  4, 30,100,  3,
+     20, 86, 20,109, 20,142,226,108,  2, 20, 93, 20,101,225,227,245,
+    244,101,128,  1, 80,231,242,225,246,101,128,  2, 12,233,229,242,
+    229,243,233,115,130,  0,214, 20,123, 20,134,227,249,242,233,236,
+    236,233, 99,128,  4,230,243,237,225,236,108,128,247,246,239,244,
+    226,229,236,239,119,128, 30,204,103,  2, 20,158, 20,170,239,238,
+    229,235,243,237,225,236,108,128,246,251,242,225,246,101,129,  0,
+    210, 20,179,243,237,225,236,108,128,247,242,104,  4, 20,197, 20,
+    208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128,  5, 85,
+    109,128, 33, 38,111,  2, 20,218, 20,228,239,235,225,226,239,246,
+    101,128, 30,206,242,110,133,  1,160, 20,243, 20,251, 21,  6, 21,
+     14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229,
+    236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239,
+    239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128,
+     30,224,245,238,231,225,242,245,237,236,225,245,116,128,  1, 80,
+    105,129,  1,162, 21, 54,238,246,229,242,244,229,228,226,242,229,
+    246,101,128,  2, 14,109,  4, 21, 79, 21,107, 21,184, 21,202,225,
+    227,242,239,110,130,  1, 76, 21, 91, 21, 99,225,227,245,244,101,
+    128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33,
+     38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233,
+     99,128,  4, 96,231,242,229,229,107,128,  3,169,242,239,245,238,
+    228,227,249,242,233,236,236,233, 99,128,  4,122,116,  2, 21,162,
+     21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128,  4,
+    124,239,238,239,115,128,  3,143,233,227,242,239,110,129,  3,159,
+     21,194,244,239,238,239,115,128,  3,140,239,238,239,243,240,225,
+    227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111,
+      2, 21,229, 21,248,231,239,238,229,107,129,  1,234, 21,239,237,
+    225,227,242,239,110,128,  1,236,240,229,110,128,  1,134,115,  3,
+     22,  6, 22, 33, 22, 40,236,225,243,104,130,  0,216, 22, 17, 22,
+     25,225,227,245,244,101,128,  1,254,243,237,225,236,108,128,247,
+    248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245,
+    244,101,128,  1,254,116,  2, 22, 59, 22, 70,227,249,242,233,236,
+    236,233, 99,128,  4,126,233,236,228,101,131,  0,213, 22, 83, 22,
+     91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229,
+    243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136,
+      0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246,
+     23,  2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101,
+    128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101,
+      3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128,
+      4, 31,232,225,242,237,229,238,233,225,110,128,  5, 74,237,233,
+    228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99,
+    128,  4,166,104,  2, 22,217, 22,221,105,128,  3,166,239,239,107,
+    128,  1,164,105,129,  3,160, 22,233,247,242,225,242,237,229,238,
+    233,225,110,128,  5, 83,237,239,238,239,243,240,225,227,101,128,
+    255, 48,115,  2, 23,  8, 23, 25,105,129,  3,168, 23, 14,227,249,
+    242,233,236,236,233, 99,128,  4,112,237,225,236,108,128,247,112,
+     81,131,  0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101,
+    128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243,
+    237,225,236,108,128,247,113, 82,138,  0, 82, 23, 95, 23,119, 23,
+    166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97,
+      2, 23,101, 23,112,225,242,237,229,238,233,225,110,128,  5, 76,
+    227,245,244,101,128,  1, 84, 99,  4, 23,129, 23,136, 23,145, 23,
+    153,225,242,239,110,128,  1, 88,229,228,233,236,236, 97,128,  1,
+     86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227,
+    229,238,116,128,  1, 86,100,  2, 23,172, 23,182,226,236,231,242,
+    225,246,101,128,  2, 16,239,116,  2, 23,189, 23,198,225,227,227,
+    229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208,
+    237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238,
+    233,225,110,128,  5, 80,230,242,225,235,244,245,114,128, 33, 28,
+    232,111,128,  3,161,233,110,  2, 23,252, 24,  5,231,243,237,225,
+    236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101,
+    128,  2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237,
+    239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108,
+    129,247,114, 24, 53,233,238,246,229,242,244,229,100,129,  2,129,
+     24, 66,243,245,240,229,242,233,239,114,128,  2,182, 83,139,  0,
+     83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27,
+    105, 27,117, 27,135, 27,143, 70,  6, 24,117, 24,209, 24,241, 25,
+     77, 25,119, 25,221, 48,  9, 24,137, 24,145, 24,153, 24,161, 24,
+    169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37,
+     12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37,
+     16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37,
+     60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37,
+     52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37,
+     36, 49,  3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37,
+      0,177,176,176,176, 48,128, 37,  2,185,176,176,176, 48,128, 37,
+     97, 50,  9, 25,  5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25,
+     53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176,
+    176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176,
+    176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176,
+    176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176,
+    176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51,  4, 25,
+     87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183,
+    176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185,
+    176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25,
+    165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176,
+    176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176,
+    176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176,
+    176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176,
+    176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176,
+    176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53,  5, 25,
+    233, 25,241, 25,249, 26,  1, 26,  9,176,176,176,176, 48,128, 37,
+     88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37,
+     83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37,
+    106, 97,  2, 26, 23, 26, 44,227,245,244,101,129,  1, 90, 26, 32,
+    228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231,
+    242,229,229,107,128,  3,224, 99,  5, 26, 67, 26, 98, 26,107, 26,
+    147, 26,169,225,242,239,110,130,  1, 96, 26, 78, 26, 90,228,239,
+    244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128,
+    246,253,229,228,233,236,236, 97,128,  1, 94,232,247, 97,130,  1,
+    143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128,  4,216,
+    228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,
+    128,  4,218,233,242, 99,  2, 26,155, 26,160,236,101,128, 36,200,
+    245,237,230,236,229,120,128,  1, 92,239,237,237,225,225,227,227,
+    229,238,116,128,  2, 24,228,239,116,  2, 26,190, 26,199,225,227,
+    227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26,
+    209,228,239,244,225,227,227,229,238,116,128, 30,104,101,  2, 26,
+    227, 26,239,232,225,242,237,229,238,233,225,110,128,  5, 77,246,
+    229,238,242,239,237,225,110,128, 33,102,104,  5, 27,  6, 27, 34,
+     27, 48, 27, 59, 27, 72, 97,  2, 27, 12, 27, 23,225,242,237,229,
+    238,233,225,110,128,  5, 71,227,249,242,233,236,236,233, 99,128,
+      4, 40,227,232,225,227,249,242,233,236,236,233, 99,128,  4, 41,
+    229,233,227,239,240,244,233, 99,128,  3,226,232,225,227,249,242,
+    233,236,236,233, 99,128,  4,186,233,237,225,227,239,240,244,233,
+     99,128,  3,236,105,  2, 27, 90, 27, 96,231,237, 97,128,  3,163,
+    248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225,
+    227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233,
+    236,236,233, 99,128,  4, 44,243,237,225,236,108,128,247,115,244,
+    233,231,237,225,231,242,229,229,107,128,  3,218, 84,141,  0, 84,
+     27,186, 27,191, 27,197, 28,  7, 28, 32, 28, 96, 28,147, 28,177,
+     28,189, 28,201, 28,246, 29,  6, 29, 46,225,117,128,  3,164,226,
+    225,114,128,  1,102, 99,  4, 27,207, 27,214, 27,223, 27,250,225,
+    242,239,110,128,  1,100,229,228,233,236,236, 97,128,  1, 98,233,
+    242, 99,  2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236,
+    229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227,
+    227,229,238,116,128,  1, 98,228,239,116,  2, 28, 15, 28, 24,225,
+    227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108,
+    101,  4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236,
+    233, 99,128,  4, 34,228,229,243,227,229,238,228,229,242,227,249,
+    242,233,236,236,233, 99,128,  4,172,238,242,239,237,225,110,128,
+     33,105,244,243,229,227,249,242,233,236,236,233, 99,128,  4,180,
+    104,  3, 28,104, 28,110, 28,136,229,244, 97,128,  3,152,111,  2,
+     28,116, 28,121,239,107,128,  1,172,242,110,129,  0,222, 28,128,
+    243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110,
+    128, 33, 98,105,  2, 28,153, 28,164,236,228,229,243,237,225,236,
+    108,128,246,254,247,238,225,242,237,229,238,233,225,110,128,  5,
+     79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238,
+    239,243,240,225,227,101,128,255, 52,111,  2, 28,207, 28,218,225,
+    242,237,229,238,233,225,110,128,  5, 57,238,101,  3, 28,227, 28,
+    234, 28,240,230,233,246,101,128,  1,188,243,233,120,128,  1,132,
+    244,247,111,128,  1,167,242,229,244,242,239,230,236,229,248,232,
+    239,239,107,128,  1,174,115,  3, 29, 14, 29, 26, 29, 39,229,227,
+    249,242,233,236,236,233, 99,128,  4, 38,232,229,227,249,242,233,
+    236,236,233, 99,128,  4, 11,237,225,236,108,128,247,116,119,  2,
+     29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107,
+    239,242,239,237,225,110,128, 33, 97, 85,142,  0, 85, 29,105, 29,
+    123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31,
+     21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129,  0,
+    218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101,
+    128,  1,108, 99,  3, 29,139, 29,146, 29,188,225,242,239,110,128,
+      1,211,233,242, 99,  2, 29,154, 29,159,236,101,128, 36,202,245,
+    237,230,236,229,120,130,  0,219, 29,172, 29,180,226,229,236,239,
+    119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236,
+    236,233, 99,128,  4, 35,100,  3, 29,206, 29,229, 30, 59,226,108,
+      2, 29,213, 29,221,225,227,245,244,101,128,  1,112,231,242,225,
+    246,101,128,  2, 20,233,229,242,229,243,233,115,134,  0,220, 29,
+    251, 30,  3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101,
+    128,  1,215,226,229,236,239,119,128, 30,114, 99,  2, 30, 17, 30,
+     24,225,242,239,110,128,  1,217,249,242,233,236,236,233, 99,128,
+      4,240,231,242,225,246,101,128,  1,219,237,225,227,242,239,110,
+    128,  1,213,243,237,225,236,108,128,247,252,239,244,226,229,236,
+    239,119,128, 30,228,231,242,225,246,101,129,  0,217, 30, 79,243,
+    237,225,236,108,128,247,249,104,  2, 30, 93, 30,171,111,  2, 30,
+     99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133,
+      1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244,
+    101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231,
+    242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101,
+    128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242,
+    245,237,236,225,245,116,129,  1,112, 30,187,227,249,242,233,236,
+    236,233, 99,128,  4,242,233,238,246,229,242,244,229,228,226,242,
+    229,246,101,128,  2, 22,235,227,249,242,233,236,236,233, 99,128,
+      4,120,109,  2, 30,232, 31, 10,225,227,242,239,110,130,  1,106,
+     30,244, 30,255,227,249,242,233,236,236,233, 99,128,  4,238,228,
+    233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225,
+    227,101,128,255, 53,239,231,239,238,229,107,128,  1,114,240,243,
+    233,236,239,110,133,  3,165, 31, 49, 31, 53, 31, 90, 31,121, 31,
+    134, 49,128,  3,210, 97,  2, 31, 59, 31, 81,227,245,244,229,232,
+    239,239,235,243,249,237,226,239,236,231,242,229,229,107,128,  3,
+    211,230,242,233,227,225,110,128,  1,177,228,233,229,242,229,243,
+    233,115,129,  3,171, 31,103,232,239,239,235,243,249,237,226,239,
+    236,231,242,229,229,107,128,  3,212,232,239,239,235,243,249,237,
+    226,239,108,128,  3,210,244,239,238,239,115,128,  3,142,242,233,
+    238,103,128,  1,110,115,  3, 31,157, 31,172, 31,179,232,239,242,
+    244,227,249,242,233,236,236,233, 99,128,  4, 14,237,225,236,108,
+    128,247,117,244,242,225,233,231,232,116,  2, 31,191, 31,202,227,
+    249,242,233,236,236,233, 99,128,  4,174,243,244,242,239,235,229,
+    227,249,242,233,236,236,233, 99,128,  4,176,244,233,236,228,101,
+    130,  1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226,
+    229,236,239,119,128, 30,116, 86,136,  0, 86, 32, 11, 32, 20, 32,
+     31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236,
+    101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101,
+      2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128,  4, 18,
+    247,225,242,237,229,238,233,225,110,128,  5, 78,232,239,239,107,
+    128,  1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239,
+    225,242,237,229,238,233,225,110,128,  5, 72,243,237,225,236,108,
+    128,247,118,244,233,236,228,101,128, 30,124, 87,134,  0, 87, 32,
+    123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101,
+    128, 30,130,227,233,242, 99,  2, 32,140, 32,145,236,101,128, 36,
+    204,245,237,230,236,229,120,128,  1,116,100,  2, 32,160, 32,170,
+    233,229,242,229,243,233,115,128, 30,132,239,116,  2, 32,177, 32,
+    186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128,
+     30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240,
+    225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134,
+      0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233,
+    242,227,236,101,128, 36,205,100,  2, 32,253, 33,  7,233,229,242,
+    229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128,
+     30,138,229,232,225,242,237,229,238,233,225,110,128,  5, 61,105,
+    128,  3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243,
+    237,225,236,108,128,247,120, 89,139,  0, 89, 33, 81, 33,116, 33,
+    139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34,
+     68, 97,  2, 33, 87, 33,104,227,245,244,101,129,  0,221, 33, 96,
+    243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233,
+     99,128,  4, 98,227,233,242, 99,  2, 33,125, 33,130,236,101,128,
+     36,206,245,237,230,236,229,120,128,  1,118,100,  2, 33,145, 33,
+    165,233,229,242,229,243,233,115,129,  1,120, 33,157,243,237,225,
+    236,108,128,247,255,239,116,  2, 33,172, 33,181,225,227,227,229,
+    238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114,  2,
+     33,196, 33,208,233,227,249,242,233,236,236,233, 99,128,  4, 43,
+    245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
+     99,128,  4,248,231,242,225,246,101,128, 30,242,232,239,239,107,
+    129,  1,179, 33,245,225,226,239,246,101,128, 30,246,105,  3, 34,
+      5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128,  5, 69,
+    227,249,242,233,236,236,233, 99,128,  4,  7,247,238,225,242,237,
+    229,238,233,225,110,128,  5, 82,237,239,238,239,243,240,225,227,
+    101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228,
+    101,128, 30,248,245,115,  2, 34, 75, 34,113,226,233,103,  2, 34,
+     83, 34, 94,227,249,242,233,236,236,233, 99,128,  4,106,233,239,
+    244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,  4,
+    108,236,233,244,244,236,101,  2, 34,124, 34,135,227,249,242,233,
+    236,236,233, 99,128,  4,102,233,239,244,233,230,233,229,228,227,
+    249,242,233,236,236,233, 99,128,  4,104, 90,136,  0, 90, 34,174,
+     34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97,  2,
+     34,180, 34,191,225,242,237,229,238,233,225,110,128,  5, 54,227,
+    245,244,101,128,  1,121, 99,  2, 34,204, 34,221,225,242,239,110,
+    129,  1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99,
+      2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120,
+    128, 30,144,228,239,116,130,  1,123, 34,253, 35,  6,225,227,227,
+    229,238,116,128,  1,123,226,229,236,239,119,128, 30,146,101,  3,
+     35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128,  4,
+     23,100,  2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227,
+    249,242,233,236,236,233, 99,128,  4,152,233,229,242,229,243,233,
+    243,227,249,242,233,236,236,233, 99,128,  4,222,244, 97,128,  3,
+    150,232,101,  4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229,
+    238,233,225,110,128,  5, 58,226,242,229,246,229,227,249,242,233,
+    236,236,233, 99,128,  4,193,227,249,242,233,236,236,233, 99,128,
+      4, 22,100,  2, 35,136, 35,155,229,243,227,229,238,228,229,242,
+    227,249,242,233,236,236,233, 99,128,  4,150,233,229,242,229,243,
+    233,243,227,249,242,233,236,236,233, 99,128,  4,220,236,233,238,
+    229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225,
+    227,101,128,255, 58,115,  2, 35,203, 35,210,237,225,236,108,128,
+    247,122,244,242,239,235,101,128,  1,181, 97,158,  0, 97, 36, 26,
+     38,154, 39,  4, 39, 68, 39,132, 39,196, 40,  4, 40, 68, 40,126,
+     40,190, 41, 70, 41,217, 42,137, 42,237, 43, 17, 49,192, 49,229,
+     50,  0, 50,225, 51,  7, 52, 96, 52,168, 53,123, 53,132, 54,  5,
+     56, 13, 57,  3, 57, 50, 57,201, 57,215, 49,138, 39,  1, 36, 50,
+     36,114, 36,154, 36,218, 37, 26, 37, 90, 37,154, 37,218, 38, 26,
+     38, 90, 48,138, 39, 33, 36, 74, 36, 78, 36, 82, 36, 86, 36, 90,
+     36, 94, 36, 98, 36,102, 36,106, 36,110, 48,128, 39, 94, 49,128,
+     39, 97, 50,128, 39, 98, 51,128, 39, 99, 52,128, 39,100, 53,128,
+     39, 16, 54,128, 39,101, 55,128, 39,102, 56,128, 39,103, 57,128,
+     38, 96, 49,134, 38, 27, 36,130, 36,134, 36,138, 36,142, 36,146,
+     36,150, 48,128, 38,101, 49,128, 38,102, 50,128, 38, 99, 55,128,
+     39,  9, 56,128, 39,  8, 57,128, 39,  7, 50,138, 38, 30, 36,178,
+     36,182, 36,186, 36,190, 36,194, 36,198, 36,202, 36,206, 36,210,
+     36,214, 48,128, 36, 96, 49,128, 36, 97, 50,128, 36, 98, 51,128,
+     36, 99, 52,128, 36,100, 53,128, 36,101, 54,128, 36,102, 55,128,
+     36,103, 56,128, 36,104, 57,128, 36,105, 51,138, 39, 12, 36,242,
+     36,246, 36,250, 36,254, 37,  2, 37,  6, 37, 10, 37, 14, 37, 18,
+     37, 22, 48,128, 39,118, 49,128, 39,119, 50,128, 39,120, 51,128,
+     39,121, 52,128, 39,122, 53,128, 39,123, 54,128, 39,124, 55,128,
+     39,125, 56,128, 39,126, 57,128, 39,127, 52,138, 39, 13, 37, 50,
+     37, 54, 37, 58, 37, 62, 37, 66, 37, 70, 37, 74, 37, 78, 37, 82,
+     37, 86, 48,128, 39,128, 49,128, 39,129, 50,128, 39,130, 51,128,
+     39,131, 52,128, 39,132, 53,128, 39,133, 54,128, 39,134, 55,128,
+     39,135, 56,128, 39,136, 57,128, 39,137, 53,138, 39, 14, 37,114,
+     37,118, 37,122, 37,126, 37,130, 37,134, 37,138, 37,142, 37,146,
+     37,150, 48,128, 39,138, 49,128, 39,139, 50,128, 39,140, 51,128,
+     39,141, 52,128, 39,142, 53,128, 39,143, 54,128, 39,144, 55,128,
+     39,145, 56,128, 39,146, 57,128, 39,147, 54,138, 39, 15, 37,178,
+     37,182, 37,186, 37,190, 37,194, 37,198, 37,202, 37,206, 37,210,
+     37,214, 48,128, 39,148, 49,128, 33,146, 50,128, 39,163, 51,128,
+     33,148, 52,128, 33,149, 53,128, 39,153, 54,128, 39,155, 55,128,
+     39,156, 56,128, 39,157, 57,128, 39,158, 55,138, 39, 17, 37,242,
+     37,246, 37,250, 37,254, 38,  2, 38,  6, 38, 10, 38, 14, 38, 18,
+     38, 22, 48,128, 39,159, 49,128, 39,160, 50,128, 39,161, 51,128,
+     39,162, 52,128, 39,164, 53,128, 39,165, 54,128, 39,166, 55,128,
+     39,167, 56,128, 39,168, 57,128, 39,169, 56,138, 39, 18, 38, 50,
+     38, 54, 38, 58, 38, 62, 38, 66, 38, 70, 38, 74, 38, 78, 38, 82,
+     38, 86, 48,128, 39,171, 49,128, 39,173, 50,128, 39,175, 51,128,
+     39,178, 52,128, 39,179, 53,128, 39,181, 54,128, 39,184, 55,128,
+     39,186, 56,128, 39,187, 57,128, 39,188, 57,138, 39, 19, 38,114,
+     38,118, 38,122, 38,126, 38,130, 38,134, 38,138, 38,142, 38,146,
+     38,150, 48,128, 39,189, 49,128, 39,190, 50,128, 39,154, 51,128,
+     39,170, 52,128, 39,182, 53,128, 39,185, 54,128, 39,152, 55,128,
+     39,180, 56,128, 39,183, 57,128, 39,172, 50,138, 39,  2, 38,178,
+     38,224, 38,228, 38,232, 38,236, 38,240, 38,244, 38,248, 38,252,
+     39,  0, 48,135, 39, 20, 38,196, 38,200, 38,204, 38,208, 38,212,
+     38,216, 38,220, 48,128, 39,174, 49,128, 39,177, 50,128, 39,  3,
+     51,128, 39, 80, 52,128, 39, 82, 53,128, 39,110, 54,128, 39,112,
+     49,128, 39, 21, 50,128, 39, 22, 51,128, 39, 23, 52,128, 39, 24,
+     53,128, 39, 25, 54,128, 39, 26, 55,128, 39, 27, 56,128, 39, 28,
+     57,128, 39, 34, 51,138, 39,  4, 39, 28, 39, 32, 39, 36, 39, 40,
+     39, 44, 39, 48, 39, 52, 39, 56, 39, 60, 39, 64, 48,128, 39, 35,
+     49,128, 39, 36, 50,128, 39, 37, 51,128, 39, 38, 52,128, 39, 39,
+     53,128, 38,  5, 54,128, 39, 41, 55,128, 39, 42, 56,128, 39, 43,
+     57,128, 39, 44, 52,138, 38, 14, 39, 92, 39, 96, 39,100, 39,104,
+     39,108, 39,112, 39,116, 39,120, 39,124, 39,128, 48,128, 39, 45,
+     49,128, 39, 46, 50,128, 39, 47, 51,128, 39, 48, 52,128, 39, 49,
+     53,128, 39, 50, 54,128, 39, 51, 55,128, 39, 52, 56,128, 39, 53,
+     57,128, 39, 54, 53,138, 39,  6, 39,156, 39,160, 39,164, 39,168,
+     39,172, 39,176, 39,180, 39,184, 39,188, 39,192, 48,128, 39, 55,
+     49,128, 39, 56, 50,128, 39, 57, 51,128, 39, 58, 52,128, 39, 59,
+     53,128, 39, 60, 54,128, 39, 61, 55,128, 39, 62, 56,128, 39, 63,
+     57,128, 39, 64, 54,138, 39, 29, 39,220, 39,224, 39,228, 39,232,
+     39,236, 39,240, 39,244, 39,248, 39,252, 40,  0, 48,128, 39, 65,
+     49,128, 39, 66, 50,128, 39, 67, 51,128, 39, 68, 52,128, 39, 69,
+     53,128, 39, 70, 54,128, 39, 71, 55,128, 39, 72, 56,128, 39, 73,
+     57,128, 39, 74, 55,138, 39, 30, 40, 28, 40, 32, 40, 36, 40, 40,
+     40, 44, 40, 48, 40, 52, 40, 56, 40, 60, 40, 64, 48,128, 39, 75,
+     49,128, 37,207, 50,128, 39, 77, 51,128, 37,160, 52,128, 39, 79,
+     53,128, 39, 81, 54,128, 37,178, 55,128, 37,188, 56,128, 37,198,
+     57,128, 39, 86, 56,137, 39, 31, 40, 90, 40, 94, 40, 98, 40,102,
+     40,106, 40,110, 40,114, 40,118, 40,122, 49,128, 37,215, 50,128,
+     39, 88, 51,128, 39, 89, 52,128, 39, 90, 53,128, 39,111, 54,128,
+     39,113, 55,128, 39,114, 56,128, 39,115, 57,128, 39,104, 57,138,
+     39, 32, 40,150, 40,154, 40,158, 40,162, 40,166, 40,170, 40,174,
+     40,178, 40,182, 40,186, 48,128, 39,105, 49,128, 39,108, 50,128,
+     39,109, 51,128, 39,106, 52,128, 39,107, 53,128, 39,116, 54,128,
+     39,117, 55,128, 39, 91, 56,128, 39, 92, 57,128, 39, 93, 97,  7,
+     40,206, 40,216, 40,223, 40,230, 40,255, 41, 15, 41, 26,226,229,
+    238,231,225,236,105,128,  9,134,227,245,244,101,128,  0,225,228,
+    229,246, 97,128,  9,  6,231,117,  2, 40,237, 40,246,234,225,242,
+    225,244,105,128, 10,134,242,237,245,235,232,105,128, 10,  6,237,
+    225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 62,242,
+    245,243,241,245,225,242,101,128, 51,  3,246,239,247,229,236,243,
+    233,231,110,  3, 41, 42, 41, 52, 41, 59,226,229,238,231,225,236,
+    105,128,  9,190,228,229,246, 97,128,  9, 62,231,245,234,225,242,
+    225,244,105,128, 10,190, 98,  4, 41, 80, 41,121, 41,130, 41,140,
+    226,242,229,246,233,225,244,233,239,110,  2, 41, 95, 41,110,237,
+    225,242,235,225,242,237,229,238,233,225,110,128,  5, 95,243,233,
+    231,238,228,229,246, 97,128,  9,112,229,238,231,225,236,105,128,
+      9,133,239,240,239,237,239,230,111,128, 49, 26,242,229,246,101,
+    134,  1,  3, 41,159, 41,167, 41,178, 41,189, 41,197, 41,209,225,
+    227,245,244,101,128, 30,175,227,249,242,233,236,236,233, 99,128,
+      4,209,228,239,244,226,229,236,239,119,128, 30,183,231,242,225,
+    246,101,128, 30,177,232,239,239,235,225,226,239,246,101,128, 30,
+    179,244,233,236,228,101,128, 30,181, 99,  4, 41,227, 41,234, 42,
+     57, 42,127,225,242,239,110,128,  1,206,233,242, 99,  2, 41,242,
+     41,247,236,101,128, 36,208,245,237,230,236,229,120,133,  0,226,
+     42, 10, 42, 18, 42, 29, 42, 37, 42, 49,225,227,245,244,101,128,
+     30,165,228,239,244,226,229,236,239,119,128, 30,173,231,242,225,
+    246,101,128, 30,167,232,239,239,235,225,226,239,246,101,128, 30,
+    169,244,233,236,228,101,128, 30,171,245,244,101,133,  0,180, 42,
+     73, 42, 84, 42,101, 42,108, 42,117,226,229,236,239,247,227,237,
+     98,128,  3, 23, 99,  2, 42, 90, 42, 95,237, 98,128,  3,  1,239,
+    237, 98,128,  3,  1,228,229,246, 97,128,  9, 84,236,239,247,237,
+    239,100,128,  2,207,244,239,238,229,227,237, 98,128,  3, 65,249,
+    242,233,236,236,233, 99,128,  4, 48,100,  5, 42,149, 42,159, 42,
+    173, 42,179, 42,213,226,236,231,242,225,246,101,128,  2,  1,228,
+    225,235,231,245,242,237,245,235,232,105,128, 10,113,229,246, 97,
+    128,  9,  5,233,229,242,229,243,233,115,130,  0,228, 42,193, 42,
+    204,227,249,242,233,236,236,233, 99,128,  4,211,237,225,227,242,
+    239,110,128,  1,223,239,116,  2, 42,220, 42,228,226,229,236,239,
+    119,128, 30,161,237,225,227,242,239,110,128,  1,225,101,131,  0,
+    230, 42,247, 42,255, 43,  8,225,227,245,244,101,128,  1,253,235,
+    239,242,229,225,110,128, 49, 80,237,225,227,242,239,110,128,  1,
+    227,230,233,105,  6, 43, 33, 43, 53, 45,246, 45,252, 46, 11, 49,
+    111, 48,  2, 43, 39, 43, 46,176,178,176, 56,128, 32, 21,184,185,
+    180, 49,128, 32,164,177, 48,  3, 43, 62, 45, 86, 45,221, 48,  9,
+     43, 82, 43,102, 43,164, 43,226, 44, 32, 44, 94, 44,156, 44,218,
+     45, 24, 49,  3, 43, 90, 43, 94, 43, 98, 55,128,  4, 16, 56,128,
+      4, 17, 57,128,  4, 18, 50, 10, 43,124, 43,128, 43,132, 43,136,
+     43,140, 43,144, 43,148, 43,152, 43,156, 43,160, 48,128,  4, 19,
+     49,128,  4, 20, 50,128,  4, 21, 51,128,  4,  1, 52,128,  4, 22,
+     53,128,  4, 23, 54,128,  4, 24, 55,128,  4, 25, 56,128,  4, 26,
+     57,128,  4, 27, 51, 10, 43,186, 43,190, 43,194, 43,198, 43,202,
+     43,206, 43,210, 43,214, 43,218, 43,222, 48,128,  4, 28, 49,128,
+      4, 29, 50,128,  4, 30, 51,128,  4, 31, 52,128,  4, 32, 53,128,
+      4, 33, 54,128,  4, 34, 55,128,  4, 35, 56,128,  4, 36, 57,128,
+      4, 37, 52, 10, 43,248, 43,252, 44,  0, 44,  4, 44,  8, 44, 12,
+     44, 16, 44, 20, 44, 24, 44, 28, 48,128,  4, 38, 49,128,  4, 39,
+     50,128,  4, 40, 51,128,  4, 41, 52,128,  4, 42, 53,128,  4, 43,
+     54,128,  4, 44, 55,128,  4, 45, 56,128,  4, 46, 57,128,  4, 47,
+     53, 10, 44, 54, 44, 58, 44, 62, 44, 66, 44, 70, 44, 74, 44, 78,
+     44, 82, 44, 86, 44, 90, 48,128,  4,144, 49,128,  4,  2, 50,128,
+      4,  3, 51,128,  4,  4, 52,128,  4,  5, 53,128,  4,  6, 54,128,
+      4,  7, 55,128,  4,  8, 56,128,  4,  9, 57,128,  4, 10, 54, 10,
+     44,116, 44,120, 44,124, 44,128, 44,132, 44,136, 44,140, 44,144,
+     44,148, 44,152, 48,128,  4, 11, 49,128,  4, 12, 50,128,  4, 14,
+     51,128,246,196, 52,128,246,197, 53,128,  4, 48, 54,128,  4, 49,
+     55,128,  4, 50, 56,128,  4, 51, 57,128,  4, 52, 55, 10, 44,178,
+     44,182, 44,186, 44,190, 44,194, 44,198, 44,202, 44,206, 44,210,
+     44,214, 48,128,  4, 53, 49,128,  4, 81, 50,128,  4, 54, 51,128,
+      4, 55, 52,128,  4, 56, 53,128,  4, 57, 54,128,  4, 58, 55,128,
+      4, 59, 56,128,  4, 60, 57,128,  4, 61, 56, 10, 44,240, 44,244,
+     44,248, 44,252, 45,  0, 45,  4, 45,  8, 45, 12, 45, 16, 45, 20,
+     48,128,  4, 62, 49,128,  4, 63, 50,128,  4, 64, 51,128,  4, 65,
+     52,128,  4, 66, 53,128,  4, 67, 54,128,  4, 68, 55,128,  4, 69,
+     56,128,  4, 70, 57,128,  4, 71, 57, 10, 45, 46, 45, 50, 45, 54,
+     45, 58, 45, 62, 45, 66, 45, 70, 45, 74, 45, 78, 45, 82, 48,128,
+      4, 72, 49,128,  4, 73, 50,128,  4, 74, 51,128,  4, 75, 52,128,
+      4, 76, 53,128,  4, 77, 54,128,  4, 78, 55,128,  4, 79, 56,128,
+      4,145, 57,128,  4, 82, 49,  4, 45, 96, 45,158, 45,163, 45,189,
+     48, 10, 45,118, 45,122, 45,126, 45,130, 45,134, 45,138, 45,142,
+     45,146, 45,150, 45,154, 48,128,  4, 83, 49,128,  4, 84, 50,128,
+      4, 85, 51,128,  4, 86, 52,128,  4, 87, 53,128,  4, 88, 54,128,
+      4, 89, 55,128,  4, 90, 56,128,  4, 91, 57,128,  4, 92,177, 48,
+    128,  4, 94, 52,  4, 45,173, 45,177, 45,181, 45,185, 53,128,  4,
+     15, 54,128,  4, 98, 55,128,  4,114, 56,128,  4,116, 57,  5, 45,
+    201, 45,205, 45,209, 45,213, 45,217, 50,128,246,198, 51,128,  4,
+     95, 52,128,  4, 99, 53,128,  4,115, 54,128,  4,117, 56,  2, 45,
+    227, 45,241, 51,  2, 45,233, 45,237, 49,128,246,199, 50,128,246,
+    200,180, 54,128,  4,217,178,185, 57,128, 32, 14,179, 48,  2, 46,
+      3, 46,  7, 48,128, 32, 15, 49,128, 32, 13,181, 55,  7, 46, 28,
+     46, 98, 47,163, 47,240, 48,197, 49, 34, 49,105, 51,  2, 46, 34,
+     46, 48, 56,  2, 46, 40, 46, 44, 49,128,  6,106, 56,128,  6, 12,
+     57,  8, 46, 66, 46, 70, 46, 74, 46, 78, 46, 82, 46, 86, 46, 90,
+     46, 94, 50,128,  6, 96, 51,128,  6, 97, 52,128,  6, 98, 53,128,
+      6, 99, 54,128,  6,100, 55,128,  6,101, 56,128,  6,102, 57,128,
+      6,103, 52,  7, 46,114, 46,146, 46,208, 47, 14, 47, 46, 47,102,
+     47,158, 48,  5, 46,126, 46,130, 46,134, 46,138, 46,142, 48,128,
+      6,104, 49,128,  6,105, 51,128,  6, 27, 55,128,  6, 31, 57,128,
+      6, 33, 49, 10, 46,168, 46,172, 46,176, 46,180, 46,184, 46,188,
+     46,192, 46,196, 46,200, 46,204, 48,128,  6, 34, 49,128,  6, 35,
+     50,128,  6, 36, 51,128,  6, 37, 52,128,  6, 38, 53,128,  6, 39,
+     54,128,  6, 40, 55,128,  6, 41, 56,128,  6, 42, 57,128,  6, 43,
+     50, 10, 46,230, 46,234, 46,238, 46,242, 46,246, 46,250, 46,254,
+     47,  2, 47,  6, 47, 10, 48,128,  6, 44, 49,128,  6, 45, 50,128,
+      6, 46, 51,128,  6, 47, 52,128,  6, 48, 53,128,  6, 49, 54,128,
+      6, 50, 55,128,  6, 51, 56,128,  6, 52, 57,128,  6, 53, 51,  5,
+     47, 26, 47, 30, 47, 34, 47, 38, 47, 42, 48,128,  6, 54, 49,128,
+      6, 55, 50,128,  6, 56, 51,128,  6, 57, 52,128,  6, 58, 52,  9,
+     47, 66, 47, 70, 47, 74, 47, 78, 47, 82, 47, 86, 47, 90, 47, 94,
+     47, 98, 48,128,  6, 64, 49,128,  6, 65, 50,128,  6, 66, 51,128,
+      6, 67, 52,128,  6, 68, 53,128,  6, 69, 54,128,  6, 70, 56,128,
+      6, 72, 57,128,  6, 73, 53,  9, 47,122, 47,126, 47,130, 47,134,
+     47,138, 47,142, 47,146, 47,150, 47,154, 48,128,  6, 74, 49,128,
+      6, 75, 50,128,  6, 76, 51,128,  6, 77, 52,128,  6, 78, 53,128,
+      6, 79, 54,128,  6, 80, 55,128,  6, 81, 56,128,  6, 82,183, 48,
+    128,  6, 71, 53,  3, 47,171, 47,203, 47,235, 48,  5, 47,183, 47,
+    187, 47,191, 47,195, 47,199, 53,128,  6,164, 54,128,  6,126, 55,
+    128,  6,134, 56,128,  6,152, 57,128,  6,175, 49,  5, 47,215, 47,
+    219, 47,223, 47,227, 47,231, 49,128,  6,121, 50,128,  6,136, 51,
+    128,  6,145, 52,128,  6,186, 57,128,  6,210,179, 52,128,  6,213,
+     54,  7, 48,  0, 48,  5, 48, 10, 48, 15, 48, 53, 48,115, 48,177,
+    179, 54,128, 32,170,180, 53,128,  5,190,181, 56,128,  5,195, 54,
+      6, 48, 29, 48, 33, 48, 37, 48, 41, 48, 45, 48, 49, 52,128,  5,
+    208, 53,128,  5,209, 54,128,  5,210, 55,128,  5,211, 56,128,  5,
+    212, 57,128,  5,213, 55, 10, 48, 75, 48, 79, 48, 83, 48, 87, 48,
+     91, 48, 95, 48, 99, 48,103, 48,107, 48,111, 48,128,  5,214, 49,
+    128,  5,215, 50,128,  5,216, 51,128,  5,217, 52,128,  5,218, 53,
+    128,  5,219, 54,128,  5,220, 55,128,  5,221, 56,128,  5,222, 57,
+    128,  5,223, 56, 10, 48,137, 48,141, 48,145, 48,149, 48,153, 48,
+    157, 48,161, 48,165, 48,169, 48,173, 48,128,  5,224, 49,128,  5,
+    225, 50,128,  5,226, 51,128,  5,227, 52,128,  5,228, 53,128,  5,
+    229, 54,128,  5,230, 55,128,  5,231, 56,128,  5,232, 57,128,  5,
+    233, 57,  3, 48,185, 48,189, 48,193, 48,128,  5,234, 52,128,251,
+     42, 53,128,251, 43, 55,  4, 48,207, 48,221, 48,241, 48,246, 48,
+      2, 48,213, 48,217, 48,128,251, 75, 53,128,251, 31, 49,  3, 48,
+    229, 48,233, 48,237, 54,128,  5,240, 55,128,  5,241, 56,128,  5,
+    242,178, 51,128,251, 53, 57,  7, 49,  6, 49, 10, 49, 14, 49, 18,
+     49, 22, 49, 26, 49, 30, 51,128,  5,180, 52,128,  5,181, 53,128,
+      5,182, 54,128,  5,187, 55,128,  5,184, 56,128,  5,183, 57,128,
+      5,176, 56,  3, 49, 42, 49, 86, 49, 91, 48,  7, 49, 58, 49, 62,
+     49, 66, 49, 70, 49, 74, 49, 78, 49, 82, 48,128,  5,178, 49,128,
+      5,177, 50,128,  5,179, 51,128,  5,194, 52,128,  5,193, 54,128,
+      5,185, 55,128,  5,188,179, 57,128,  5,189, 52,  2, 49, 97, 49,
+    101, 49,128,  5,191, 50,128,  5,192,185,178, 57,128,  2,188, 54,
+      3, 49,119, 49,178, 49,185, 49,  4, 49,129, 49,145, 49,151, 49,
+    172, 50,  2, 49,135, 49,140,180, 56,128, 33,  5,184, 57,128, 33,
+     19,179,181, 50,128, 33, 22,181, 55,  3, 49,160, 49,164, 49,168,
+     51,128, 32, 44, 52,128, 32, 45, 53,128, 32, 46,182,182, 52,128,
+     32, 12,179,177,182, 55,128,  6,109,180,185,179, 55,128,  2,189,
+    103,  2, 49,198, 49,205,242,225,246,101,128,  0,224,117,  2, 49,
+    211, 49,220,234,225,242,225,244,105,128, 10,133,242,237,245,235,
+    232,105,128, 10,  5,104,  2, 49,235, 49,245,233,242,225,231,225,
+    238, 97,128, 48, 66,239,239,235,225,226,239,246,101,128, 30,163,
+    105,  7, 50, 16, 50, 41, 50, 48, 50, 60, 50, 85, 50,101, 50,181,
+     98,  2, 50, 22, 50, 31,229,238,231,225,236,105,128,  9,144,239,
+    240,239,237,239,230,111,128, 49, 30,228,229,246, 97,128,  9, 16,
+    229,227,249,242,233,236,236,233, 99,128,  4,213,231,117,  2, 50,
+     67, 50, 76,234,225,242,225,244,105,128, 10,144,242,237,245,235,
+    232,105,128, 10, 16,237,225,244,242,225,231,245,242,237,245,235,
+    232,105,128, 10, 72,110,  5, 50,113, 50,122, 50,136, 50,152, 50,
+    167,225,242,225,226,233, 99,128,  6, 57,230,233,238,225,236,225,
+    242,225,226,233, 99,128,254,202,233,238,233,244,233,225,236,225,
+    242,225,226,233, 99,128,254,203,237,229,228,233,225,236,225,242,
+    225,226,233, 99,128,254,204,246,229,242,244,229,228,226,242,229,
+    246,101,128,  2,  3,246,239,247,229,236,243,233,231,110,  3, 50,
+    197, 50,207, 50,214,226,229,238,231,225,236,105,128,  9,200,228,
+    229,246, 97,128,  9, 72,231,245,234,225,242,225,244,105,128, 10,
+    200,107,  2, 50,231, 50,255,225,244,225,235,225,238, 97,129, 48,
+    162, 50,243,232,225,236,230,247,233,228,244,104,128,255,113,239,
+    242,229,225,110,128, 49, 79,108,  3, 51, 15, 52, 71, 52, 80,101,
+      2, 51, 21, 52, 66,102,136,  5,208, 51, 41, 51, 50, 51, 65, 51,
+     79, 51,168, 51,182, 52, 37, 52, 51,225,242,225,226,233, 99,128,
+      6, 39,228,225,231,229,243,232,232,229,226,242,229,119,128,251,
+     48,230,233,238,225,236,225,242,225,226,233, 99,128,254,142,104,
+      2, 51, 85, 51,160,225,237,250, 97,  2, 51, 94, 51,127,225,226,
+    239,246,101,  2, 51,104, 51,113,225,242,225,226,233, 99,128,  6,
+     35,230,233,238,225,236,225,242,225,226,233, 99,128,254,132,226,
+    229,236,239,119,  2, 51,137, 51,146,225,242,225,226,233, 99,128,
+      6, 37,230,233,238,225,236,225,242,225,226,233, 99,128,254,136,
+    229,226,242,229,119,128,  5,208,236,225,237,229,228,232,229,226,
+    242,229,119,128,251, 79,237, 97,  2, 51,189, 51,225,228,228,225,
+    225,226,239,246,101,  2, 51,202, 51,211,225,242,225,226,233, 99,
+    128,  6, 34,230,233,238,225,236,225,242,225,226,233, 99,128,254,
+    130,235,243,245,242, 97,  4, 51,239, 51,248, 52,  6, 52, 22,225,
+    242,225,226,233, 99,128,  6, 73,230,233,238,225,236,225,242,225,
+    226,233, 99,128,254,240,233,238,233,244,233,225,236,225,242,225,
+    226,233, 99,128,254,243,237,229,228,233,225,236,225,242,225,226,
+    233, 99,128,254,244,240,225,244,225,232,232,229,226,242,229,119,
+    128,251, 46,241,225,237,225,244,243,232,229,226,242,229,119,128,
+    251, 47,240,104,128, 33, 53,236,229,241,245,225,108,128, 34, 76,
+    240,232, 97,129,  3,177, 52, 88,244,239,238,239,115,128,  3,172,
+    109,  4, 52,106, 52,114, 52,125, 52,159,225,227,242,239,110,128,
+      1,  1,239,238,239,243,240,225,227,101,128,255, 65,240,229,242,
+    243,225,238,100,130,  0, 38, 52,139, 52,151,237,239,238,239,243,
+    240,225,227,101,128,255,  6,243,237,225,236,108,128,247, 38,243,
+    241,245,225,242,101,128, 51,194,110,  4, 52,178, 52,189, 53, 55,
+     53, 65,226,239,240,239,237,239,230,111,128, 49, 34,103,  4, 52,
+    199, 52,210, 52,224, 53, 47,226,239,240,239,237,239,230,111,128,
+     49, 36,235,232,225,238,235,232,245,244,232,225,105,128, 14, 90,
+    236,101,131, 34, 32, 52,235, 53, 32, 53, 39,226,242,225,227,235,
+    229,116,  2, 52,247, 53, 11,236,229,230,116,129, 48,  8, 53,  0,
+    246,229,242,244,233,227,225,108,128,254, 63,242,233,231,232,116,
+    129, 48,  9, 53, 21,246,229,242,244,233,227,225,108,128,254, 64,
+    236,229,230,116,128, 35, 41,242,233,231,232,116,128, 35, 42,243,
+    244,242,239,109,128, 33, 43,239,244,229,236,229,233, 97,128,  3,
+    135,117,  2, 53, 71, 53, 83,228,225,244,244,225,228,229,246, 97,
+    128,  9, 82,243,246,225,242, 97,  3, 53, 95, 53,105, 53,112,226,
+    229,238,231,225,236,105,128,  9,130,228,229,246, 97,128,  9,  2,
+    231,245,234,225,242,225,244,105,128, 10,130,239,231,239,238,229,
+    107,128,  1,  5,112,  3, 53,140, 53,164, 53,194, 97,  2, 53,146,
+     53,158,225,244,239,243,241,245,225,242,101,128, 51,  0,242,229,
+    110,128, 36,156,239,243,244,242,239,240,232,101,  2, 53,177, 53,
+    188,225,242,237,229,238,233,225,110,128,  5, 90,237,239,100,128,
+      2,188,112,  2, 53,200, 53,205,236,101,128,248,255,242,111,  2,
+     53,212, 53,220,225,227,232,229,115,128, 34, 80,120,  2, 53,226,
+     53,246,229,241,245,225,108,129, 34, 72, 53,236,239,242,233,237,
+    225,231,101,128, 34, 82,233,237,225,244,229,236,249,229,241,245,
+    225,108,128, 34, 69,114,  4, 54, 15, 54, 42, 54, 46, 54, 91,225,
+    229, 97,  2, 54, 23, 54, 33,229,235,239,242,229,225,110,128, 49,
+    142,235,239,242,229,225,110,128, 49,141, 99,128, 35, 18,105,  2,
+     54, 52, 54, 66,231,232,244,232,225,236,230,242,233,238,103,128,
+     30,154,238,103,130,  0,229, 54, 75, 54, 83,225,227,245,244,101,
+    128,  1,251,226,229,236,239,119,128, 30,  1,242,239,119,  8, 54,
+    111, 54,118, 54,247, 55, 57, 55,107, 55,162, 55,185, 56,  4,226,
+    239,244,104,128, 33,148,100,  3, 54,126, 54,165, 54,212,225,243,
+    104,  4, 54,138, 54,145, 54,152, 54,160,228,239,247,110,128, 33,
+    227,236,229,230,116,128, 33,224,242,233,231,232,116,128, 33,226,
+    245,112,128, 33,225,226,108,  5, 54,178, 54,185, 54,192, 54,199,
+     54,207,226,239,244,104,128, 33,212,228,239,247,110,128, 33,211,
+    236,229,230,116,128, 33,208,242,233,231,232,116,128, 33,210,245,
+    112,128, 33,209,239,247,110,131, 33,147, 54,224, 54,231, 54,239,
+    236,229,230,116,128, 33,153,242,233,231,232,116,128, 33,152,247,
+    232,233,244,101,128, 33,233,104,  2, 54,253, 55, 48,229,225,100,
+      4, 55,  9, 55, 19, 55, 29, 55, 40,228,239,247,238,237,239,100,
+    128,  2,197,236,229,230,244,237,239,100,128,  2,194,242,233,231,
+    232,244,237,239,100,128,  2,195,245,240,237,239,100,128,  2,196,
+    239,242,233,250,229,120,128,248,231,236,229,230,116,131, 33,144,
+     55, 70, 55, 87, 55, 99,228,226,108,129, 33,208, 55, 78,243,244,
+    242,239,235,101,128, 33,205,239,246,229,242,242,233,231,232,116,
+    128, 33,198,247,232,233,244,101,128, 33,230,242,233,231,232,116,
+    132, 33,146, 55,123, 55,135, 55,143, 55,154,228,226,236,243,244,
+    242,239,235,101,128, 33,207,232,229,225,246,121,128, 39,158,239,
+    246,229,242,236,229,230,116,128, 33,196,247,232,233,244,101,128,
+     33,232,244,225, 98,  2, 55,170, 55,177,236,229,230,116,128, 33,
+    228,242,233,231,232,116,128, 33,229,245,112,132, 33,145, 55,198,
+     55,226, 55,244, 55,252,100,  2, 55,204, 55,216,110,129, 33,149,
+     55,210,226,243,101,128, 33,168,239,247,238,226,225,243,101,128,
+     33,168,236,229,230,116,129, 33,150, 55,235,239,230,228,239,247,
+    110,128, 33,197,242,233,231,232,116,128, 33,151,247,232,233,244,
+    101,128, 33,231,246,229,242,244,229,120,128,248,230,115,  5, 56,
+     25, 56,101, 56,146, 56,229, 56,239, 99,  2, 56, 31, 56, 83,233,
+    105,  2, 56, 38, 56, 61,227,233,242,227,245,109,129,  0, 94, 56,
+     49,237,239,238,239,243,240,225,227,101,128,255, 62,244,233,236,
+    228,101,129,  0,126, 56, 71,237,239,238,239,243,240,225,227,101,
+    128,255, 94,242,233,240,116,129,  2, 81, 56, 92,244,245,242,238,
+    229,100,128,  2, 82,237,225,236,108,  2, 56,110, 56,121,232,233,
+    242,225,231,225,238, 97,128, 48, 65,235,225,244,225,235,225,238,
+     97,129, 48,161, 56,134,232,225,236,230,247,233,228,244,104,128,
+    255,103,244,229,242,233,115,  2, 56,156, 56,225,107,131,  0, 42,
+     56,166, 56,194, 56,217, 97,  2, 56,172, 56,186,236,244,239,238,
+    229,225,242,225,226,233, 99,128,  6,109,242,225,226,233, 99,128,
+      6,109,109,  2, 56,200, 56,206,225,244,104,128, 34, 23,239,238,
+    239,243,240,225,227,101,128,255, 10,243,237,225,236,108,128,254,
+     97,109,128, 32, 66,245,240,229,242,233,239,114,128,246,233,249,
+    237,240,244,239,244,233,227,225,236,236,249,229,241,245,225,108,
+    128, 34, 67,116,132,  0, 64, 57, 15, 57, 22, 57, 34, 57, 42,233,
+    236,228,101,128,  0,227,237,239,238,239,243,240,225,227,101,128,
+    255, 32,243,237,225,236,108,128,254,107,245,242,238,229,100,128,
+      2, 80,117,  6, 57, 64, 57, 89, 57, 96, 57,121, 57,141, 57,157,
+     98,  2, 57, 70, 57, 79,229,238,231,225,236,105,128,  9,148,239,
+    240,239,237,239,230,111,128, 49, 32,228,229,246, 97,128,  9, 20,
+    231,117,  2, 57,103, 57,112,234,225,242,225,244,105,128, 10,148,
+    242,237,245,235,232,105,128, 10, 20,236,229,238,231,244,232,237,
+    225,242,235,226,229,238,231,225,236,105,128,  9,215,237,225,244,
+    242,225,231,245,242,237,245,235,232,105,128, 10, 76,246,239,247,
+    229,236,243,233,231,110,  3, 57,173, 57,183, 57,190,226,229,238,
+    231,225,236,105,128,  9,204,228,229,246, 97,128,  9, 76,231,245,
+    234,225,242,225,244,105,128, 10,204,246,225,231,242,225,232,225,
+    228,229,246, 97,128,  9, 61,121,  2, 57,221, 57,233,226,225,242,
+    237,229,238,233,225,110,128,  5, 97,233,110,130,  5,226, 57,242,
+     58,  1,225,236,244,239,238,229,232,229,226,242,229,119,128,251,
+     32,232,229,226,242,229,119,128,  5,226, 98,144,  0, 98, 58, 46,
+     58,181, 58,192, 58,201, 58,226, 60, 11, 60, 73, 60,146, 62, 72,
+     62, 84, 62,127, 62,135, 62,145, 64, 15, 64, 39, 64, 48, 97,  7,
+     58, 62, 58, 72, 58, 96, 58,103, 58,128, 58,152, 58,163,226,229,
+    238,231,225,236,105,128,  9,172,227,235,243,236,225,243,104,129,
+      0, 92, 58, 84,237,239,238,239,243,240,225,227,101,128,255, 60,
+    228,229,246, 97,128,  9, 44,231,117,  2, 58,110, 58,119,234,225,
+    242,225,244,105,128, 10,172,242,237,245,235,232,105,128, 10, 44,
+    104,  2, 58,134, 58,144,233,242,225,231,225,238, 97,128, 48,112,
+    244,244,232,225,105,128, 14, 63,235,225,244,225,235,225,238, 97,
+    128, 48,208,114,129,  0,124, 58,169,237,239,238,239,243,240,225,
+    227,101,128,255, 92,226,239,240,239,237,239,230,111,128, 49,  5,
+    227,233,242,227,236,101,128, 36,209,228,239,116,  2, 58,209, 58,
+    218,225,227,227,229,238,116,128, 30,  3,226,229,236,239,119,128,
+     30,  5,101,  6, 58,240, 59,  5, 59, 28, 59,170, 59,181, 59,193,
+    225,237,229,228,243,233,248,244,229,229,238,244,232,238,239,244,
+    229,115,128, 38,108, 99,  2, 59, 11, 59, 18,225,245,243,101,128,
+     34, 53,249,242,233,236,236,233, 99,128,  4, 49,104,  5, 59, 40,
+     59, 49, 59, 63, 59, 93, 59,152,225,242,225,226,233, 99,128,  6,
+     40,230,233,238,225,236,225,242,225,226,233, 99,128,254,144,105,
+      2, 59, 69, 59, 84,238,233,244,233,225,236,225,242,225,226,233,
+     99,128,254,145,242,225,231,225,238, 97,128, 48,121,237,101,  2,
+     59,100, 59,113,228,233,225,236,225,242,225,226,233, 99,128,254,
+    146,229,237,105,  2, 59,121, 59,136,238,233,244,233,225,236,225,
+    242,225,226,233, 99,128,252,159,243,239,236,225,244,229,228,225,
+    242,225,226,233, 99,128,252,  8,238,239,239,238,230,233,238,225,
+    236,225,242,225,226,233, 99,128,252,109,235,225,244,225,235,225,
+    238, 97,128, 48,217,238,225,242,237,229,238,233,225,110,128,  5,
+     98,116,132,  5,209, 59,205, 59,225, 59,245, 59,254, 97,129,  3,
+    178, 59,211,243,249,237,226,239,236,231,242,229,229,107,128,  3,
+    208,228,225,231,229,243,104,129,251, 49, 59,236,232,229,226,242,
+    229,119,128,251, 49,232,229,226,242,229,119,128,  5,209,242,225,
+    230,229,232,229,226,242,229,119,128,251, 76,104,  2, 60, 17, 60,
+     67, 97,  3, 60, 25, 60, 35, 60, 42,226,229,238,231,225,236,105,
+    128,  9,173,228,229,246, 97,128,  9, 45,231,117,  2, 60, 49, 60,
+     58,234,225,242,225,244,105,128, 10,173,242,237,245,235,232,105,
+    128, 10, 45,239,239,107,128,  2, 83,105,  5, 60, 85, 60, 96, 60,
+    107, 60,121, 60,135,232,233,242,225,231,225,238, 97,128, 48,115,
+    235,225,244,225,235,225,238, 97,128, 48,211,236,225,226,233,225,
+    236,227,236,233,227,107,128,  2,152,238,228,233,231,245,242,237,
+    245,235,232,105,128, 10,  2,242,245,243,241,245,225,242,101,128,
+     51, 49,108,  3, 60,154, 62, 55, 62, 66, 97,  2, 60,160, 62, 50,
+    227,107,  6, 60,175, 60,184, 60,221, 61,114, 61,169, 61,221,227,
+    233,242,227,236,101,128, 37,207,100,  2, 60,190, 60,199,233,225,
+    237,239,238,100,128, 37,198,239,247,238,240,239,233,238,244,233,
+    238,231,244,242,233,225,238,231,236,101,128, 37,188,108,  2, 60,
+    227, 61, 74,101,  2, 60,233, 61, 13,230,244,240,239,233,238,244,
+    233,238,103,  2, 60,248, 61,  2,240,239,233,238,244,229,114,128,
+     37,196,244,242,233,225,238,231,236,101,128, 37,192,238,244,233,
+    227,245,236,225,242,226,242,225,227,235,229,116,  2, 61, 33, 61,
+     53,236,229,230,116,129, 48, 16, 61, 42,246,229,242,244,233,227,
+    225,108,128,254, 59,242,233,231,232,116,129, 48, 17, 61, 63,246,
+    229,242,244,233,227,225,108,128,254, 60,239,247,229,114,  2, 61,
+     83, 61, 98,236,229,230,244,244,242,233,225,238,231,236,101,128,
+     37,227,242,233,231,232,244,244,242,233,225,238,231,236,101,128,
+     37,226,114,  2, 61,120, 61,131,229,227,244,225,238,231,236,101,
+    128, 37,172,233,231,232,244,240,239,233,238,244,233,238,103,  2,
+     61,148, 61,158,240,239,233,238,244,229,114,128, 37,186,244,242,
+    233,225,238,231,236,101,128, 37,182,115,  3, 61,177, 61,207, 61,
+    215,109,  2, 61,183, 61,195,225,236,236,243,241,245,225,242,101,
+    128, 37,170,233,236,233,238,231,230,225,227,101,128, 38, 59,241,
+    245,225,242,101,128, 37,160,244,225,114,128, 38,  5,245,240,112,
+      2, 61,229, 62, 11,229,114,  2, 61,236, 61,251,236,229,230,244,
+    244,242,233,225,238,231,236,101,128, 37,228,242,233,231,232,244,
+    244,242,233,225,238,231,236,101,128, 37,229,239,233,238,244,233,
+    238,103,  2, 62, 23, 62, 39,243,237,225,236,236,244,242,233,225,
+    238,231,236,101,128, 37,180,244,242,233,225,238,231,236,101,128,
+     37,178,238,107,128, 36, 35,233,238,229,226,229,236,239,119,128,
+     30,  7,239,227,107,128, 37,136,237,239,238,239,243,240,225,227,
+    101,128,255, 66,111,  3, 62, 92, 62,105, 62,116,226,225,233,237,
+    225,233,244,232,225,105,128, 14, 26,232,233,242,225,231,225,238,
+     97,128, 48,124,235,225,244,225,235,225,238, 97,128, 48,220,240,
+    225,242,229,110,128, 36,157,241,243,241,245,225,242,101,128, 51,
+    195,114,  4, 62,155, 63,149, 63,222, 64,  5,225, 99,  2, 62,162,
+     63, 56,101,  3, 62,170, 62,175, 62,243,229,120,128,248,244,236,
+    229,230,116,133,  0,123, 62,192, 62,197, 62,219, 62,227, 62,232,
+    226,116,128,248,243,109,  2, 62,203, 62,208,233,100,128,248,242,
+    239,238,239,243,240,225,227,101,128,255, 91,243,237,225,236,108,
+    128,254, 91,244,112,128,248,241,246,229,242,244,233,227,225,108,
+    128,254, 55,242,233,231,232,116,133,  0,125, 63,  5, 63, 10, 63,
+     32, 63, 40, 63, 45,226,116,128,248,254,109,  2, 63, 16, 63, 21,
+    233,100,128,248,253,239,238,239,243,240,225,227,101,128,255, 93,
+    243,237,225,236,108,128,254, 92,244,112,128,248,252,246,229,242,
+    244,233,227,225,108,128,254, 56,235,229,116,  2, 63, 64, 63,106,
+    236,229,230,116,132,  0, 91, 63, 79, 63, 84, 63, 89, 63,101,226,
+    116,128,248,240,229,120,128,248,239,237,239,238,239,243,240,225,
+    227,101,128,255, 59,244,112,128,248,238,242,233,231,232,116,132,
+      0, 93, 63,122, 63,127, 63,132, 63,144,226,116,128,248,251,229,
+    120,128,248,250,237,239,238,239,243,240,225,227,101,128,255, 61,
+    244,112,128,248,249,229,246,101,131,  2,216, 63,161, 63,172, 63,
+    178,226,229,236,239,247,227,237, 98,128,  3, 46,227,237, 98,128,
+      3,  6,233,238,246,229,242,244,229,100,  3, 63,193, 63,204, 63,
+    210,226,229,236,239,247,227,237, 98,128,  3, 47,227,237, 98,128,
+      3, 17,228,239,245,226,236,229,227,237, 98,128,  3, 97,233,228,
+    231,101,  2, 63,231, 63,242,226,229,236,239,247,227,237, 98,128,
+      3, 42,233,238,246,229,242,244,229,228,226,229,236,239,247,227,
+    237, 98,128,  3, 58,239,235,229,238,226,225,114,128,  0,166,115,
+      2, 64, 21, 64, 29,244,242,239,235,101,128,  1,128,245,240,229,
+    242,233,239,114,128,246,234,244,239,240,226,225,114,128,  1,131,
+    117,  3, 64, 56, 64, 67, 64, 78,232,233,242,225,231,225,238, 97,
+    128, 48,118,235,225,244,225,235,225,238, 97,128, 48,214,236,108,
+      2, 64, 85, 64,115,229,116,130, 32, 34, 64, 94, 64,104,233,238,
+    246,229,242,243,101,128, 37,216,239,240,229,242,225,244,239,114,
+    128, 34, 25,243,229,249,101,128, 37,206, 99,143,  0, 99, 64,156,
+     65,105, 65,116, 65,180, 65,211, 66, 48, 67,215, 68,199, 69, 43,
+     69, 92, 72, 84, 72, 92, 72,102, 72,114, 72,147, 97,  9, 64,176,
+     64,187, 64,197, 64,204, 64,211, 64,236, 64,246, 65, 42, 65, 51,
+    225,242,237,229,238,233,225,110,128,  5,110,226,229,238,231,225,
+    236,105,128,  9,154,227,245,244,101,128,  1,  7,228,229,246, 97,
+    128,  9, 26,231,117,  2, 64,218, 64,227,234,225,242,225,244,105,
+    128, 10,154,242,237,245,235,232,105,128, 10, 26,236,243,241,245,
+    225,242,101,128, 51,136,238,228,242,225,226,233,238,228,117,  4,
+     65,  8, 65, 18, 65, 24, 65, 31,226,229,238,231,225,236,105,128,
+      9,129,227,237, 98,128,  3, 16,228,229,246, 97,128,  9,  1,231,
+    245,234,225,242,225,244,105,128, 10,129,240,243,236,239,227,107,
+    128, 33,234,114,  3, 65, 59, 65, 65, 65, 91,229,239,102,128, 33,
+      5,239,110,130,  2,199, 65, 74, 65, 85,226,229,236,239,247,227,
+    237, 98,128,  3, 44,227,237, 98,128,  3, 12,242,233,225,231,229,
+    242,229,244,245,242,110,128, 33,181,226,239,240,239,237,239,230,
+    111,128, 49, 24, 99,  4, 65,126, 65,133, 65,152, 65,174,225,242,
+    239,110,128,  1, 13,229,228,233,236,236, 97,129,  0,231, 65,144,
+    225,227,245,244,101,128, 30,  9,233,242, 99,  2, 65,160, 65,165,
+    236,101,128, 36,210,245,237,230,236,229,120,128,  1,  9,245,242,
+    108,128,  2, 85,100,  2, 65,186, 65,202,239,116,129,  1, 11, 65,
+    193,225,227,227,229,238,116,128,  1, 11,243,241,245,225,242,101,
+    128, 51,197,101,  2, 65,217, 65,233,228,233,236,236, 97,129,  0,
+    184, 65,227,227,237, 98,128,  3, 39,238,116,132,  0,162, 65,246,
+     66, 14, 66, 26, 66, 37,105,  2, 65,252, 66,  4,231,242,225,228,
+    101,128, 33,  3,238,230,229,242,233,239,114,128,246,223,237,239,
+    238,239,243,240,225,227,101,128,255,224,239,236,228,243,244,249,
+    236,101,128,247,162,243,245,240,229,242,233,239,114,128,246,224,
+    104,  5, 66, 60, 66,123, 66,134, 67, 62, 67,154, 97,  4, 66, 70,
+     66, 81, 66, 91, 66, 98,225,242,237,229,238,233,225,110,128,  5,
+    121,226,229,238,231,225,236,105,128,  9,155,228,229,246, 97,128,
+      9, 27,231,117,  2, 66,105, 66,114,234,225,242,225,244,105,128,
+     10,155,242,237,245,235,232,105,128, 10, 27,226,239,240,239,237,
+    239,230,111,128, 49, 20,101,  6, 66,148, 66,168, 66,192, 67,  4,
+     67, 16, 67, 37,225,226,235,232,225,243,233,225,238,227,249,242,
+    233,236,236,233, 99,128,  4,189, 99,  2, 66,174, 66,182,235,237,
+    225,242,107,128, 39, 19,249,242,233,236,236,233, 99,128,  4, 71,
+    100,  2, 66,198, 66,242,229,243,227,229,238,228,229,114,  2, 66,
+    211, 66,231,225,226,235,232,225,243,233,225,238,227,249,242,233,
+    236,236,233, 99,128,  4,191,227,249,242,233,236,236,233, 99,128,
+      4,183,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
+     99,128,  4,245,232,225,242,237,229,238,233,225,110,128,  5,115,
+    235,232,225,235,225,243,243,233,225,238,227,249,242,233,236,236,
+    233, 99,128,  4,204,246,229,242,244,233,227,225,236,243,244,242,
+    239,235,229,227,249,242,233,236,236,233, 99,128,  4,185,105,129,
+      3,199, 67, 68,229,245,227,104,  4, 67, 81, 67,116, 67,131, 67,
+    140, 97,  2, 67, 87, 67,102,227,233,242,227,236,229,235,239,242,
+    229,225,110,128, 50,119,240,225,242,229,238,235,239,242,229,225,
+    110,128, 50, 23,227,233,242,227,236,229,235,239,242,229,225,110,
+    128, 50,105,235,239,242,229,225,110,128, 49, 74,240,225,242,229,
+    238,235,239,242,229,225,110,128, 50,  9,111,  2, 67,160, 67,210,
+    227,104,  3, 67,169, 67,191, 67,201,225,110,  2, 67,176, 67,184,
+    231,244,232,225,105,128, 14, 10,244,232,225,105,128, 14,  8,233,
+    238,231,244,232,225,105,128, 14,  9,239,229,244,232,225,105,128,
+     14, 12,239,107,128,  1,136,105,  2, 67,221, 68, 67,229,245, 99,
+      5, 67,235, 68, 14, 68, 29, 68, 38, 68, 52, 97,  2, 67,241, 68,
+      0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,118,
+    240,225,242,229,238,235,239,242,229,225,110,128, 50, 22,227,233,
+    242,227,236,229,235,239,242,229,225,110,128, 50,104,235,239,242,
+    229,225,110,128, 49, 72,240,225,242,229,238,235,239,242,229,225,
+    110,128, 50,  8,245,240,225,242,229,238,235,239,242,229,225,110,
+    128, 50, 28,242, 99,  2, 68, 74, 68,169,236,101,132, 37,203, 68,
+     87, 68, 98, 68,103, 68,127,237,245,236,244,233,240,236,121,128,
+     34,151,239,116,128, 34,153,112,  2, 68,109, 68,115,236,245,115,
+    128, 34,149,239,243,244,225,236,237,225,242,107,128, 48, 54,247,
+    233,244,104,  2, 68,136, 68,152,236,229,230,244,232,225,236,230,
+    226,236,225,227,107,128, 37,208,242,233,231,232,244,232,225,236,
+    230,226,236,225,227,107,128, 37,209,245,237,230,236,229,120,130,
+      2,198, 68,182, 68,193,226,229,236,239,247,227,237, 98,128,  3,
+     45,227,237, 98,128,  3,  2,108,  3, 68,207, 68,213, 69, 11,229,
+    225,114,128, 35, 39,233,227,107,  4, 68,225, 68,236, 68,245, 68,
+    255,225,236,246,229,239,236,225,114,128,  1,194,228,229,238,244,
+    225,108,128,  1,192,236,225,244,229,242,225,108,128,  1,193,242,
+    229,244,242,239,230,236,229,120,128,  1,195,245, 98,129, 38, 99,
+     69, 18,243,245,233,116,  2, 69, 27, 69, 35,226,236,225,227,107,
+    128, 38, 99,247,232,233,244,101,128, 38,103,109,  3, 69, 51, 69,
+     65, 69, 76,227,245,226,229,228,243,241,245,225,242,101,128, 51,
+    164,239,238,239,243,240,225,227,101,128,255, 67,243,241,245,225,
+    242,229,228,243,241,245,225,242,101,128, 51,160,111,  8, 69,110,
+     69,121, 69,208, 70,150, 71,179, 71,210, 72, 61, 72, 70,225,242,
+    237,229,238,233,225,110,128,  5,129,236,239,110,131,  0, 58, 69,
+    133, 69,158, 69,177,237,239,110,  2, 69,141, 69,149,229,244,225,
+    242,121,128, 32,161,239,243,240,225,227,101,128,255, 26,115,  2,
+     69,164, 69,170,233,231,110,128, 32,161,237,225,236,108,128,254,
+     85,244,242,233,225,238,231,245,236,225,114,  2, 69,192, 69,202,
+    232,225,236,230,237,239,100,128,  2,209,237,239,100,128,  2,208,
+    109,  2, 69,214, 70,143,237, 97,134,  0, 44, 69,231, 70, 39, 70,
+     50, 70, 62, 70, 92, 70,115, 97,  3, 69,239, 70,  9, 70, 17,226,
+    239,246,101,  2, 69,248, 69,254,227,237, 98,128,  3, 19,242,233,
+    231,232,244,227,237, 98,128,  3, 21,227,227,229,238,116,128,246,
+    195,114,  2, 70, 23, 70, 30,225,226,233, 99,128,  6, 12,237,229,
+    238,233,225,110,128,  5, 93,233,238,230,229,242,233,239,114,128,
+    246,225,237,239,238,239,243,240,225,227,101,128,255, 12,242,229,
+    246,229,242,243,229,100,  2, 70, 75, 70, 86,225,226,239,246,229,
+    227,237, 98,128,  3, 20,237,239,100,128,  2,189,115,  2, 70, 98,
+     70,105,237,225,236,108,128,254, 80,245,240,229,242,233,239,114,
+    128,246,226,244,245,242,238,229,100,  2, 70,126, 70,137,225,226,
+    239,246,229,227,237, 98,128,  3, 18,237,239,100,128,  2,187,240,
+    225,243,115,128, 38, 60,110,  2, 70,156, 70,165,231,242,245,229,
+    238,116,128, 34, 69,116,  2, 70,171, 70,185,239,245,242,233,238,
+    244,229,231,242,225,108,128, 34, 46,242,239,108,142, 35,  3, 70,
+    219, 70,225, 70,240, 70,255, 71, 43, 71, 88, 71,102, 71,107, 71,
+    112, 71,117, 71,123, 71,128, 71,169, 71,174,193,195, 75,128,  0,
+      6, 66,  2, 70,231, 70,236,197, 76,128,  0,  7, 83,128,  0,  8,
+     67,  2, 70,246, 70,251,193, 78,128,  0, 24, 82,128,  0, 13, 68,
+      3, 71,  7, 71, 33, 71, 38, 67,  4, 71, 17, 71, 21, 71, 25, 71,
+     29, 49,128,  0, 17, 50,128,  0, 18, 51,128,  0, 19, 52,128,  0,
+     20,197, 76,128,  0,127,204, 69,128,  0, 16, 69,  5, 71, 55, 71,
+     59, 71, 64, 71, 69, 71, 74, 77,128,  0, 25,206, 81,128,  0,  5,
+    207, 84,128,  0,  4,211, 67,128,  0, 27, 84,  2, 71, 80, 71, 84,
+     66,128,  0, 23, 88,128,  0,  3, 70,  2, 71, 94, 71, 98, 70,128,
+      0, 12, 83,128,  0, 28,199, 83,128,  0, 29,200, 84,128,  0,  9,
+    204, 70,128,  0, 10,206,193, 75,128,  0, 21,210, 83,128,  0, 30,
+     83,  5, 71,140, 71,144, 71,154, 71,159, 71,164, 73,128,  0, 15,
+     79,129,  0, 14, 71,150, 84,128,  0,  2,212, 88,128,  0,  1,213,
+     66,128,  0, 26,217, 78,128,  0, 22,213, 83,128,  0, 31,214, 84,
+    128,  0, 11,240,249,242,233,231,232,116,129,  0,169, 71,191,115,
+      2, 71,197, 71,203,225,238,115,128,248,233,229,242,233,102,128,
+    246,217,114,  2, 71,216, 72, 44,238,229,242,226,242,225,227,235,
+    229,116,  2, 71,231, 72,  9,236,229,230,116,130, 48, 12, 71,242,
+     71,254,232,225,236,230,247,233,228,244,104,128,255, 98,246,229,
+    242,244,233,227,225,108,128,254, 65,242,233,231,232,116,130, 48,
+     13, 72, 21, 72, 33,232,225,236,230,247,233,228,244,104,128,255,
+     99,246,229,242,244,233,227,225,108,128,254, 66,240,239,242,225,
+    244,233,239,238,243,241,245,225,242,101,128, 51,127,243,241,245,
+    225,242,101,128, 51,199,246,229,242,235,231,243,241,245,225,242,
+    101,128, 51,198,240,225,242,229,110,128, 36,158,242,245,250,229,
+    233,242,111,128, 32,162,243,244,242,229,244,227,232,229,100,128,
+      2,151,245,114,  2, 72,121, 72,139,236,121,  2, 72,128, 72,134,
+    225,238,100,128, 34,207,239,114,128, 34,206,242,229,238,227,121,
+    128,  0,164,249,114,  4, 72,158, 72,166, 72,173, 72,181,194,242,
+    229,246,101,128,246,209,198,236,229,120,128,246,210,226,242,229,
+    246,101,128,246,212,230,236,229,120,128,246,213,100,146,  0,100,
+     72,228, 74,110, 75,134, 75,194, 76,114, 77, 68, 77,130, 78, 59,
+     78, 72, 78, 81, 78,107, 78,132, 78,141, 79,208, 79,216, 79,227,
+     79,247, 80, 19, 97, 11, 72,252, 73,  7, 73, 17, 73, 89, 73,152,
+     73,163, 73,174, 73,243, 74, 49, 74, 55, 74, 85,225,242,237,229,
+    238,233,225,110,128,  5,100,226,229,238,231,225,236,105,128,  9,
+    166,100,  5, 73, 29, 73, 38, 73, 44, 73, 58, 73, 74,225,242,225,
+    226,233, 99,128,  6, 54,229,246, 97,128,  9, 38,230,233,238,225,
+    236,225,242,225,226,233, 99,128,254,190,233,238,233,244,233,225,
+    236,225,242,225,226,233, 99,128,254,191,237,229,228,233,225,236,
+    225,242,225,226,233, 99,128,254,192,103,  3, 73, 97, 73,114, 73,
+    128,229,243,104,129,  5,188, 73,105,232,229,226,242,229,119,128,
+      5,188,231,229,114,129, 32, 32, 73,122,228,226,108,128, 32, 33,
+    117,  2, 73,134, 73,143,234,225,242,225,244,105,128, 10,166,242,
+    237,245,235,232,105,128, 10, 38,232,233,242,225,231,225,238, 97,
+    128, 48, 96,235,225,244,225,235,225,238, 97,128, 48,192,108,  3,
+     73,182, 73,191, 73,229,225,242,225,226,233, 99,128,  6, 47,229,
+    116,130,  5,211, 73,200, 73,220,228,225,231,229,243,104,129,251,
+     51, 73,211,232,229,226,242,229,119,128,251, 51,232,229,226,242,
+    229,119,128,  5,211,230,233,238,225,236,225,242,225,226,233, 99,
+    128,254,170,237,237, 97,  3, 73,253, 74,  6, 74, 18,225,242,225,
+    226,233, 99,128,  6, 79,236,239,247,225,242,225,226,233, 99,128,
+      6, 79,244,225,238, 97,  2, 74, 27, 74, 41,236,244,239,238,229,
+    225,242,225,226,233, 99,128,  6, 76,242,225,226,233, 99,128,  6,
+     76,238,228, 97,128,  9,100,242,231, 97,  2, 74, 63, 74, 72,232,
+    229,226,242,229,119,128,  5,167,236,229,230,244,232,229,226,242,
+    229,119,128,  5,167,243,233,225,240,238,229,245,237,225,244,225,
+    227,249,242,233,236,236,233,227,227,237, 98,128,  4,133, 98,  3,
+     74,118, 75,115, 75,125,108,  9, 74,138, 74,146, 75,  3, 75, 11,
+     75, 27, 75, 38, 75, 56, 75, 70, 75, 81,199,242,225,246,101,128,
+    246,211, 97,  2, 74,152, 74,209,238,231,236,229,226,242,225,227,
+    235,229,116,  2, 74,168, 74,188,236,229,230,116,129, 48, 10, 74,
+    177,246,229,242,244,233,227,225,108,128,254, 61,242,233,231,232,
+    116,129, 48, 11, 74,198,246,229,242,244,233,227,225,108,128,254,
+     62,114,  2, 74,215, 74,236,227,232,233,238,246,229,242,244,229,
+    228,226,229,236,239,247,227,237, 98,128,  3, 43,242,239,119,  2,
+     74,244, 74,251,236,229,230,116,128, 33,212,242,233,231,232,116,
+    128, 33,210,228,225,238,228, 97,128,  9,101,231,242,225,246,101,
+    129,246,214, 75, 21,227,237, 98,128,  3, 15,233,238,244,229,231,
+    242,225,108,128, 34, 44,236,239,247,236,233,238,101,129, 32, 23,
+     75, 50,227,237, 98,128,  3, 51,239,246,229,242,236,233,238,229,
+    227,237, 98,128,  3, 63,240,242,233,237,229,237,239,100,128,  2,
+    186,246,229,242,244,233,227,225,108,  2, 75, 94, 75,100,226,225,
+    114,128, 32, 22,236,233,238,229,225,226,239,246,229,227,237, 98,
+    128,  3, 14,239,240,239,237,239,230,111,128, 49,  9,243,241,245,
+    225,242,101,128, 51,200, 99,  4, 75,144, 75,151, 75,160, 75,187,
+    225,242,239,110,128,  1, 15,229,228,233,236,236, 97,128, 30, 17,
+    233,242, 99,  2, 75,168, 75,173,236,101,128, 36,211,245,237,230,
+    236,229,248,226,229,236,239,119,128, 30, 19,242,239,225,116,128,
+      1, 17,100,  4, 75,204, 76, 29, 76, 39, 76, 90, 97,  4, 75,214,
+     75,224, 75,231, 76,  0,226,229,238,231,225,236,105,128,  9,161,
+    228,229,246, 97,128,  9, 33,231,117,  2, 75,238, 75,247,234,225,
+    242,225,244,105,128, 10,161,242,237,245,235,232,105,128, 10, 33,
+    108,  2, 76,  6, 76, 15,225,242,225,226,233, 99,128,  6,136,230,
+    233,238,225,236,225,242,225,226,233, 99,128,251,137,228,232,225,
+    228,229,246, 97,128,  9, 92,232, 97,  3, 76, 48, 76, 58, 76, 65,
+    226,229,238,231,225,236,105,128,  9,162,228,229,246, 97,128,  9,
+     34,231,117,  2, 76, 72, 76, 81,234,225,242,225,244,105,128, 10,
+    162,242,237,245,235,232,105,128, 10, 34,239,116,  2, 76, 97, 76,
+    106,225,227,227,229,238,116,128, 30, 11,226,229,236,239,119,128,
+     30, 13,101,  8, 76,132, 76,185, 76,192, 76,217, 76,227, 76,238,
+     77, 27, 77, 63, 99,  2, 76,138, 76,175,233,237,225,236,243,229,
+    240,225,242,225,244,239,114,  2, 76,156, 76,165,225,242,225,226,
+    233, 99,128,  6,107,240,229,242,243,233,225,110,128,  6,107,249,
+    242,233,236,236,233, 99,128,  4, 52,231,242,229,101,128,  0,176,
+    232,105,  2, 76,199, 76,208,232,229,226,242,229,119,128,  5,173,
+    242,225,231,225,238, 97,128, 48,103,233,227,239,240,244,233, 99,
+    128,  3,239,235,225,244,225,235,225,238, 97,128, 48,199,108,  2,
+     76,244, 77, 11,229,244,101,  2, 76,252, 77,  3,236,229,230,116,
+    128, 35, 43,242,233,231,232,116,128, 35, 38,244, 97,129,  3,180,
+     77, 18,244,245,242,238,229,100,128,  1,141,238,239,237,233,238,
+    225,244,239,242,237,233,238,245,243,239,238,229,238,245,237,229,
+    242,225,244,239,242,226,229,238,231,225,236,105,128,  9,248,250,
+    104,128,  2,164,104,  2, 77, 74, 77,124, 97,  3, 77, 82, 77, 92,
+     77, 99,226,229,238,231,225,236,105,128,  9,167,228,229,246, 97,
+    128,  9, 39,231,117,  2, 77,106, 77,115,234,225,242,225,244,105,
+    128, 10,167,242,237,245,235,232,105,128, 10, 39,239,239,107,128,
+      2, 87,105,  6, 77,144, 77,193, 77,253, 78,  8, 78, 19, 78, 29,
+     97,  2, 77,150, 77,172,236,249,244,233,235,225,244,239,238,239,
+    115,129,  3,133, 77,166,227,237, 98,128,  3, 68,237,239,238,100,
+    129, 38,102, 77,181,243,245,233,244,247,232,233,244,101,128, 38,
+     98,229,242,229,243,233,115,133,  0,168, 77,212, 77,220, 77,231,
+     77,237, 77,245,225,227,245,244,101,128,246,215,226,229,236,239,
+    247,227,237, 98,128,  3, 36,227,237, 98,128,  3,  8,231,242,225,
+    246,101,128,246,216,244,239,238,239,115,128,  3,133,232,233,242,
+    225,231,225,238, 97,128, 48, 98,235,225,244,225,235,225,238, 97,
+    128, 48,194,244,244,239,237,225,242,107,128, 48,  3,246,105,  2,
+     78, 36, 78, 47,228,101,129,  0,247, 78, 43,115,128, 34, 35,243,
+    233,239,238,243,236,225,243,104,128, 34, 21,234,229,227,249,242,
+    233,236,236,233, 99,128,  4, 82,235,243,232,225,228,101,128, 37,
+    147,108,  2, 78, 87, 78, 98,233,238,229,226,229,236,239,119,128,
+     30, 15,243,241,245,225,242,101,128, 51,151,109,  2, 78,113, 78,
+    121,225,227,242,239,110,128,  1, 17,239,238,239,243,240,225,227,
+    101,128,255, 68,238,226,236,239,227,107,128, 37,132,111, 10, 78,
+    163, 78,175, 78,185, 78,196, 78,207, 79, 23, 79, 28, 79, 39, 79,
+    154, 79,180,227,232,225,228,225,244,232,225,105,128, 14, 14,228,
+    229,235,244,232,225,105,128, 14, 20,232,233,242,225,231,225,238,
+     97,128, 48,105,235,225,244,225,235,225,238, 97,128, 48,201,236,
+    236,225,114,132,  0, 36, 78,222, 78,233, 78,245, 79,  0,233,238,
+    230,229,242,233,239,114,128,246,227,237,239,238,239,243,240,225,
+    227,101,128,255,  4,239,236,228,243,244,249,236,101,128,247, 36,
+    115,  2, 79,  6, 79, 13,237,225,236,108,128,254,105,245,240,229,
+    242,233,239,114,128,246,228,238,103,128, 32,171,242,245,243,241,
+    245,225,242,101,128, 51, 38,116,  6, 79, 53, 79, 70, 79, 92, 79,
+    103, 79,135, 79,142,225,227,227,229,238,116,129,  2,217, 79, 64,
+    227,237, 98,128,  3,  7,226,229,236,239,247, 99,  2, 79, 81, 79,
+     86,237, 98,128,  3, 35,239,237, 98,128,  3, 35,235,225,244,225,
+    235,225,238, 97,128, 48,251,236,229,243,115,  2, 79,112, 79,116,
+    105,128,  1, 49,106,129,246,190, 79,122,243,244,242,239,235,229,
+    232,239,239,107,128,  2,132,237,225,244,104,128, 34,197,244,229,
+    228,227,233,242,227,236,101,128, 37,204,245,226,236,229,249,239,
+    228,240,225,244,225,104,129,251, 31, 79,171,232,229,226,242,229,
+    119,128,251, 31,247,238,244,225,227,107,  2, 79,191, 79,202,226,
+    229,236,239,247,227,237, 98,128,  3, 30,237,239,100,128,  2,213,
+    240,225,242,229,110,128, 36,159,243,245,240,229,242,233,239,114,
+    128,246,235,116,  2, 79,233, 79,239,225,233,108,128,  2, 86,239,
+    240,226,225,114,128,  1,140,117,  2, 79,253, 80,  8,232,233,242,
+    225,231,225,238, 97,128, 48,101,235,225,244,225,235,225,238, 97,
+    128, 48,197,122,132,  1,243, 80, 31, 80, 40, 80, 59, 80, 96,225,
+    236,244,239,238,101,128,  2,163, 99,  2, 80, 46, 80, 53,225,242,
+    239,110,128,  1,198,245,242,108,128,  2,165,101,  2, 80, 65, 80,
+     85,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,
+    233, 99,128,  4,225,227,249,242,233,236,236,233, 99,128,  4, 85,
+    232,229,227,249,242,233,236,236,233, 99,128,  4, 95,101,151,  0,
+    101, 80,159, 80,178, 80,212, 81,186, 81,248, 82, 25, 82, 37, 82,
+     60, 82,113, 83,225, 84, 27, 84,129, 84,245, 85,124, 85,199, 85,
+    230, 86, 36, 86, 89, 87, 24, 87,157, 87,177, 87,221, 88, 56, 97,
+      2, 80,165, 80,172,227,245,244,101,128,  0,233,242,244,104,128,
+     38, 65, 98,  3, 80,186, 80,195, 80,205,229,238,231,225,236,105,
+    128,  9,143,239,240,239,237,239,230,111,128, 49, 28,242,229,246,
+    101,128,  1, 21, 99,  5, 80,224, 81, 41, 81, 55, 81, 87, 81,176,
+     97,  2, 80,230, 81, 35,238,228,242, 97,  3, 80,241, 80,248, 81,
+      3,228,229,246, 97,128,  9, 13,231,245,234,225,242,225,244,105,
+    128, 10,141,246,239,247,229,236,243,233,231,110,  2, 81, 17, 81,
+     24,228,229,246, 97,128,  9, 69,231,245,234,225,242,225,244,105,
+    128, 10,197,242,239,110,128,  1, 27,229,228,233,236,236,225,226,
+    242,229,246,101,128, 30, 29,104,  2, 81, 61, 81, 72,225,242,237,
+    229,238,233,225,110,128,  5,101,249,233,247,238,225,242,237,229,
+    238,233,225,110,128,  5,135,233,242, 99,  2, 81, 95, 81,100,236,
+    101,128, 36,212,245,237,230,236,229,120,134,  0,234, 81,121, 81,
+    129, 81,137, 81,148, 81,156, 81,168,225,227,245,244,101,128, 30,
+    191,226,229,236,239,119,128, 30, 25,228,239,244,226,229,236,239,
+    119,128, 30,199,231,242,225,246,101,128, 30,193,232,239,239,235,
+    225,226,239,246,101,128, 30,195,244,233,236,228,101,128, 30,197,
+    249,242,233,236,236,233, 99,128,  4, 84,100,  4, 81,196, 81,206,
+     81,212, 81,222,226,236,231,242,225,246,101,128,  2,  5,229,246,
+     97,128,  9, 15,233,229,242,229,243,233,115,128,  0,235,239,116,
+    130,  1, 23, 81,231, 81,240,225,227,227,229,238,116,128,  1, 23,
+    226,229,236,239,119,128, 30,185,101,  2, 81,254, 82,  9,231,245,
+    242,237,245,235,232,105,128, 10, 15,237,225,244,242,225,231,245,
+    242,237,245,235,232,105,128, 10, 71,230,227,249,242,233,236,236,
+    233, 99,128,  4, 68,103,  2, 82, 43, 82, 50,242,225,246,101,128,
+      0,232,245,234,225,242,225,244,105,128, 10,143,104,  4, 82, 70,
+     82, 81, 82, 92, 82,102,225,242,237,229,238,233,225,110,128,  5,
+    103,226,239,240,239,237,239,230,111,128, 49, 29,233,242,225,231,
+    225,238, 97,128, 48, 72,239,239,235,225,226,239,246,101,128, 30,
+    187,105,  4, 82,123, 82,134, 83,192, 83,207,226,239,240,239,237,
+    239,230,111,128, 49, 31,231,232,116,142,  0, 56, 82,168, 82,177,
+     82,187, 82,217, 82,224, 83,  6, 83, 31, 83, 76, 83,110, 83,122,
+     83,133, 83,166, 83,174, 83,185,225,242,225,226,233, 99,128,  6,
+    104,226,229,238,231,225,236,105,128,  9,238,227,233,242,227,236,
+    101,129, 36,103, 82,198,233,238,246,229,242,243,229,243,225,238,
+    243,243,229,242,233,102,128, 39,145,228,229,246, 97,128,  9,110,
+    229,229,110,  2, 82,232, 82,241,227,233,242,227,236,101,128, 36,
+    113,112,  2, 82,247, 82,254,225,242,229,110,128, 36,133,229,242,
+    233,239,100,128, 36,153,231,117,  2, 83, 13, 83, 22,234,225,242,
+    225,244,105,128, 10,238,242,237,245,235,232,105,128, 10,110,104,
+      2, 83, 37, 83, 63, 97,  2, 83, 43, 83, 54,227,235,225,242,225,
+    226,233, 99,128,  6,104,238,231,250,232,239,117,128, 48, 40,238,
+    239,244,229,226,229,225,237,229,100,128, 38,107,105,  2, 83, 82,
+     83,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
+    110,128, 50, 39,238,230,229,242,233,239,114,128, 32,136,237,239,
+    238,239,243,240,225,227,101,128,255, 24,239,236,228,243,244,249,
+    236,101,128,247, 56,112,  2, 83,139, 83,146,225,242,229,110,128,
+     36,123,229,114,  2, 83,153, 83,159,233,239,100,128, 36,143,243,
+    233,225,110,128,  6,248,242,239,237,225,110,128, 33,119,243,245,
+    240,229,242,233,239,114,128, 32,120,244,232,225,105,128, 14, 88,
+    238,246,229,242,244,229,228,226,242,229,246,101,128,  2,  7,239,
+    244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,  4,
+    101,107,  2, 83,231, 83,255,225,244,225,235,225,238, 97,129, 48,
+    168, 83,243,232,225,236,230,247,233,228,244,104,128,255,116,111,
+      2, 84,  5, 84, 20,238,235,225,242,231,245,242,237,245,235,232,
+    105,128, 10,116,242,229,225,110,128, 49, 84,108,  3, 84, 35, 84,
+     46, 84,107,227,249,242,233,236,236,233, 99,128,  4, 59,101,  2,
+     84, 52, 84, 59,237,229,238,116,128, 34,  8,246,229,110,  3, 84,
+     69, 84, 78, 84, 99,227,233,242,227,236,101,128, 36,106,112,  2,
+     84, 84, 84, 91,225,242,229,110,128, 36,126,229,242,233,239,100,
+    128, 36,146,242,239,237,225,110,128, 33,122,236,233,240,243,233,
+    115,129, 32, 38, 84,118,246,229,242,244,233,227,225,108,128, 34,
+    238,109,  5, 84,141, 84,169, 84,180, 84,200, 84,211,225,227,242,
+    239,110,130,  1, 19, 84,153, 84,161,225,227,245,244,101,128, 30,
+     23,231,242,225,246,101,128, 30, 21,227,249,242,233,236,236,233,
+     99,128,  4, 60,228,225,243,104,129, 32, 20, 84,189,246,229,242,
+    244,233,227,225,108,128,254, 49,239,238,239,243,240,225,227,101,
+    128,255, 69,112,  2, 84,217, 84,237,232,225,243,233,243,237,225,
+    242,235,225,242,237,229,238,233,225,110,128,  5, 91,244,249,243,
+    229,116,128, 34,  5,110,  6, 85,  3, 85, 14, 85, 25, 85, 69, 85,
+    101, 85,116,226,239,240,239,237,239,230,111,128, 49, 35,227,249,
+    242,233,236,236,233, 99,128,  4, 61,100,  2, 85, 31, 85, 50,225,
+    243,104,129, 32, 19, 85, 39,246,229,242,244,233,227,225,108,128,
+    254, 50,229,243,227,229,238,228,229,242,227,249,242,233,236,236,
+    233, 99,128,  4,163,103,130,  1, 75, 85, 77, 85, 88,226,239,240,
+    239,237,239,230,111,128, 49, 37,232,229,227,249,242,233,236,236,
+    233, 99,128,  4,165,232,239,239,235,227,249,242,233,236,236,233,
+     99,128,  4,200,243,240,225,227,101,128, 32,  2,111,  3, 85,132,
+     85,140, 85,149,231,239,238,229,107,128,  1, 25,235,239,242,229,
+    225,110,128, 49, 83,240,229,110,130,  2, 91, 85,159, 85,168,227,
+    236,239,243,229,100,128,  2,154,242,229,246,229,242,243,229,100,
+    130,  2, 92, 85,183, 85,192,227,236,239,243,229,100,128,  2, 94,
+    232,239,239,107,128,  2, 93,112,  2, 85,205, 85,212,225,242,229,
+    110,128, 36,160,243,233,236,239,110,129,  3,181, 85,222,244,239,
+    238,239,115,128,  3,173,241,117,  2, 85,237, 86, 25,225,108,130,
+      0, 61, 85,246, 86,  2,237,239,238,239,243,240,225,227,101,128,
+    255, 29,115,  2, 86,  8, 86, 15,237,225,236,108,128,254,102,245,
+    240,229,242,233,239,114,128, 32,124,233,246,225,236,229,238,227,
+    101,128, 34, 97,114,  3, 86, 44, 86, 55, 86, 66,226,239,240,239,
+    237,239,230,111,128, 49, 38,227,249,242,233,236,236,233, 99,128,
+      4, 64,229,246,229,242,243,229,100,129,  2, 88, 86, 78,227,249,
+    242,233,236,236,233, 99,128,  4, 77,115,  6, 86,103, 86,114, 86,
+    134, 86,215, 87,  4, 87, 14,227,249,242,233,236,236,233, 99,128,
+      4, 65,228,229,243,227,229,238,228,229,242,227,249,242,233,236,
+    236,233, 99,128,  4,171,104,132,  2,131, 86,146, 86,153, 86,184,
+     86,199,227,245,242,108,128,  2,134,239,242,116,  2, 86,161, 86,
+    168,228,229,246, 97,128,  9, 14,246,239,247,229,236,243,233,231,
+    238,228,229,246, 97,128,  9, 70,242,229,246,229,242,243,229,228,
+    236,239,239,112,128,  1,170,243,241,245,225,244,242,229,246,229,
+    242,243,229,100,128,  2,133,237,225,236,108,  2, 86,224, 86,235,
+    232,233,242,225,231,225,238, 97,128, 48, 71,235,225,244,225,235,
+    225,238, 97,129, 48,167, 86,248,232,225,236,230,247,233,228,244,
+    104,128,255,106,244,233,237,225,244,229,100,128, 33, 46,245,240,
+    229,242,233,239,114,128,246,236,116,  5, 87, 36, 87, 62, 87, 66,
+     87, 83, 87,149, 97,130,  3,183, 87, 44, 87, 54,242,237,229,238,
+    233,225,110,128,  5,104,244,239,238,239,115,128,  3,174,104,128,
+      0,240,233,236,228,101,129, 30,189, 87, 75,226,229,236,239,119,
+    128, 30, 27,238,225,232,244, 97,  3, 87, 95, 87,127, 87,136,230,
+    239,245,235,104,  2, 87,105, 87,114,232,229,226,242,229,119,128,
+      5,145,236,229,230,244,232,229,226,242,229,119,128,  5,145,232,
+    229,226,242,229,119,128,  5,145,236,229,230,244,232,229,226,242,
+    229,119,128,  5,145,245,242,238,229,100,128,  1,221,117,  2, 87,
+    163, 87,172,235,239,242,229,225,110,128, 49, 97,242,111,128, 32,
+    172,246,239,247,229,236,243,233,231,110,  3, 87,193, 87,203, 87,
+    210,226,229,238,231,225,236,105,128,  9,199,228,229,246, 97,128,
+      9, 71,231,245,234,225,242,225,244,105,128, 10,199,120,  2, 87,
+    227, 88, 44,227,236,225,109,132,  0, 33, 87,242, 87,253, 88, 24,
+     88, 36,225,242,237,229,238,233,225,110,128,  5, 92,100,  2, 88,
+      3, 88,  8,226,108,128, 32, 60,239,247,110,129,  0,161, 88, 16,
+    243,237,225,236,108,128,247,161,237,239,238,239,243,240,225,227,
+    101,128,255,  1,243,237,225,236,108,128,247, 33,233,243,244,229,
+    238,244,233,225,108,128, 34,  3,250,104,131,  2,146, 88, 67, 88,
+     86, 88, 97, 99,  2, 88, 73, 88, 80,225,242,239,110,128,  1,239,
+    245,242,108,128,  2,147,242,229,246,229,242,243,229,100,128,  1,
+    185,244,225,233,108,128,  1,186,102,140,  0,102, 88,132, 88,214,
+     88,225, 88,234, 88,246, 89, 93, 89,109, 91,117, 91,130, 91,156,
+     93, 33, 93, 41, 97,  4, 88,142, 88,149, 88,160, 88,171,228,229,
+    246, 97,128,  9, 94,231,245,242,237,245,235,232,105,128, 10, 94,
+    232,242,229,238,232,229,233,116,128, 33,  9,244,232, 97,  3, 88,
+    181, 88,190, 88,202,225,242,225,226,233, 99,128,  6, 78,236,239,
+    247,225,242,225,226,233, 99,128,  6, 78,244,225,238,225,242,225,
+    226,233, 99,128,  6, 75,226,239,240,239,237,239,230,111,128, 49,
+      8,227,233,242,227,236,101,128, 36,213,228,239,244,225,227,227,
+    229,238,116,128, 30, 31,101,  3, 88,254, 89, 76, 89, 86,104,  4,
+     89,  8, 89, 31, 89, 45, 89, 61,225,114,  2, 89, 15, 89, 22,225,
+    226,233, 99,128,  6, 65,237,229,238,233,225,110,128,  5,134,230,
+    233,238,225,236,225,242,225,226,233, 99,128,254,210,233,238,233,
+    244,233,225,236,225,242,225,226,233, 99,128,254,211,237,229,228,
+    233,225,236,225,242,225,226,233, 99,128,254,212,233,227,239,240,
+    244,233, 99,128,  3,229,237,225,236,101,128, 38, 64,102,130,251,
+      0, 89,101, 89,105,105,128,251,  3,108,128,251,  4,105,136,251,
+      1, 89,129, 89,169, 89,180, 89,202, 90, 68, 90, 85, 90, 93, 90,
+    106,230,244,229,229,110,  2, 89,139, 89,148,227,233,242,227,236,
+    101,128, 36,110,112,  2, 89,154, 89,161,225,242,229,110,128, 36,
+    130,229,242,233,239,100,128, 36,150,231,245,242,229,228,225,243,
+    104,128, 32, 18,236,236,229,100,  2, 89,189, 89,195,226,239,120,
+    128, 37,160,242,229,227,116,128, 37,172,238,225,108,  5, 89,216,
+     89,255, 90, 16, 90, 33, 90, 49,235,225,102,130,  5,218, 89,226,
+     89,246,228,225,231,229,243,104,129,251, 58, 89,237,232,229,226,
+    242,229,119,128,251, 58,232,229,226,242,229,119,128,  5,218,237,
+    229,109,129,  5,221, 90,  7,232,229,226,242,229,119,128,  5,221,
+    238,245,110,129,  5,223, 90, 24,232,229,226,242,229,119,128,  5,
+    223,240,101,129,  5,227, 90, 40,232,229,226,242,229,119,128,  5,
+    227,244,243,225,228,105,129,  5,229, 90, 59,232,229,226,242,229,
+    119,128,  5,229,242,243,244,244,239,238,229,227,232,233,238,229,
+    243,101,128,  2,201,243,232,229,249,101,128, 37,201,244,225,227,
+    249,242,233,236,236,233, 99,128,  4,115,246,101,142,  0, 53, 90,
+    139, 90,148, 90,158, 90,188, 90,195, 90,205, 90,230, 91,  1, 91,
+     35, 91, 47, 91, 58, 91, 91, 91, 99, 91,110,225,242,225,226,233,
+     99,128,  6,101,226,229,238,231,225,236,105,128,  9,235,227,233,
+    242,227,236,101,129, 36,100, 90,169,233,238,246,229,242,243,229,
+    243,225,238,243,243,229,242,233,102,128, 39,142,228,229,246, 97,
+    128,  9,107,229,233,231,232,244,232,115,128, 33, 93,231,117,  2,
+     90,212, 90,221,234,225,242,225,244,105,128, 10,235,242,237,245,
+    235,232,105,128, 10,107,232, 97,  2, 90,237, 90,248,227,235,225,
+    242,225,226,233, 99,128,  6,101,238,231,250,232,239,117,128, 48,
+     37,105,  2, 91,  7, 91, 25,228,229,239,231,242,225,240,232,233,
+    227,240,225,242,229,110,128, 50, 36,238,230,229,242,233,239,114,
+    128, 32,133,237,239,238,239,243,240,225,227,101,128,255, 21,239,
+    236,228,243,244,249,236,101,128,247, 53,112,  2, 91, 64, 91, 71,
+    225,242,229,110,128, 36,120,229,114,  2, 91, 78, 91, 84,233,239,
+    100,128, 36,140,243,233,225,110,128,  6,245,242,239,237,225,110,
+    128, 33,116,243,245,240,229,242,233,239,114,128, 32,117,244,232,
+    225,105,128, 14, 85,108,129,251,  2, 91,123,239,242,233,110,128,
+      1,146,109,  2, 91,136, 91,147,239,238,239,243,240,225,227,101,
+    128,255, 70,243,241,245,225,242,101,128, 51,153,111,  4, 91,166,
+     91,188, 91,200, 91,207,230, 97,  2, 91,173, 91,181,238,244,232,
+    225,105,128, 14, 31,244,232,225,105,128, 14, 29,238,231,237,225,
+    238,244,232,225,105,128, 14, 79,242,225,236,108,128, 34,  0,245,
+    114,142,  0, 52, 91,240, 91,249, 92,  3, 92, 33, 92, 40, 92, 65,
+     92, 92, 92,126, 92,138, 92,157, 92,168, 92,201, 92,209, 92,220,
+    225,242,225,226,233, 99,128,  6,100,226,229,238,231,225,236,105,
+    128,  9,234,227,233,242,227,236,101,129, 36, 99, 92, 14,233,238,
+    246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39,
+    141,228,229,246, 97,128,  9,106,231,117,  2, 92, 47, 92, 56,234,
+    225,242,225,244,105,128, 10,234,242,237,245,235,232,105,128, 10,
+    106,232, 97,  2, 92, 72, 92, 83,227,235,225,242,225,226,233, 99,
+    128,  6,100,238,231,250,232,239,117,128, 48, 36,105,  2, 92, 98,
+     92,116,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
+    110,128, 50, 35,238,230,229,242,233,239,114,128, 32,132,237,239,
+    238,239,243,240,225,227,101,128,255, 20,238,245,237,229,242,225,
+    244,239,242,226,229,238,231,225,236,105,128,  9,247,239,236,228,
+    243,244,249,236,101,128,247, 52,112,  2, 92,174, 92,181,225,242,
+    229,110,128, 36,119,229,114,  2, 92,188, 92,194,233,239,100,128,
+     36,139,243,233,225,110,128,  6,244,242,239,237,225,110,128, 33,
+    115,243,245,240,229,242,233,239,114,128, 32,116,116,  2, 92,226,
+     93,  8,229,229,110,  2, 92,234, 92,243,227,233,242,227,236,101,
+    128, 36,109,112,  2, 92,249, 93,  0,225,242,229,110,128, 36,129,
+    229,242,233,239,100,128, 36,149,104,  2, 93, 14, 93, 19,225,105,
+    128, 14, 84,244,239,238,229,227,232,233,238,229,243,101,128,  2,
+    203,240,225,242,229,110,128, 36,161,242, 97,  2, 93, 48, 93, 56,
+    227,244,233,239,110,128, 32, 68,238, 99,128, 32,163,103,144,  0,
+    103, 93, 97, 94, 43, 94, 66, 94,127, 94,144, 95, 65, 96, 58, 96,
+    143, 96,156, 97, 14, 97, 39, 97, 67, 97, 89, 98, 34, 98, 56, 98,
+    158, 97,  9, 93,117, 93,127, 93,134, 93,141, 93,205, 93,230, 93,
+    241, 93,252, 94, 30,226,229,238,231,225,236,105,128,  9,151,227,
+    245,244,101,128,  1,245,228,229,246, 97,128,  9, 23,102,  4, 93,
+    151, 93,160, 93,174, 93,190,225,242,225,226,233, 99,128,  6,175,
+    230,233,238,225,236,225,242,225,226,233, 99,128,251,147,233,238,
+    233,244,233,225,236,225,242,225,226,233, 99,128,251,148,237,229,
+    228,233,225,236,225,242,225,226,233, 99,128,251,149,231,117,  2,
+     93,212, 93,221,234,225,242,225,244,105,128, 10,151,242,237,245,
+    235,232,105,128, 10, 23,232,233,242,225,231,225,238, 97,128, 48,
+     76,235,225,244,225,235,225,238, 97,128, 48,172,237,237, 97,130,
+      3,179, 94,  6, 94, 19,236,225,244,233,238,243,237,225,236,108,
+    128,  2, 99,243,245,240,229,242,233,239,114,128,  2,224,238,231,
+    233,225,227,239,240,244,233, 99,128,  3,235, 98,  2, 94, 49, 94,
+     59,239,240,239,237,239,230,111,128, 49, 13,242,229,246,101,128,
+      1, 31, 99,  4, 94, 76, 94, 83, 94, 92, 94,114,225,242,239,110,
+    128,  1,231,229,228,233,236,236, 97,128,  1, 35,233,242, 99,  2,
+     94,100, 94,105,236,101,128, 36,214,245,237,230,236,229,120,128,
+      1, 29,239,237,237,225,225,227,227,229,238,116,128,  1, 35,228,
+    239,116,129,  1, 33, 94,135,225,227,227,229,238,116,128,  1, 33,
+    101,  6, 94,158, 94,169, 94,180, 94,191, 94,210, 95, 56,227,249,
+    242,233,236,236,233, 99,128,  4, 51,232,233,242,225,231,225,238,
+     97,128, 48, 82,235,225,244,225,235,225,238, 97,128, 48,178,239,
+    237,229,244,242,233,227,225,236,236,249,229,241,245,225,108,128,
+     34, 81,114,  3, 94,218, 95, 11, 95, 21,229,243,104,  3, 94,228,
+     94,243, 94,252,225,227,227,229,238,244,232,229,226,242,229,119,
+    128,  5,156,232,229,226,242,229,119,128,  5,243,237,245,241,228,
+    225,237,232,229,226,242,229,119,128,  5,157,237,225,238,228,226,
+    236,115,128,  0,223,243,232,225,249,233,109,  2, 95, 32, 95, 47,
+    225,227,227,229,238,244,232,229,226,242,229,119,128,  5,158,232,
+    229,226,242,229,119,128,  5,244,244,225,237,225,242,107,128, 48,
+     19,104,  5, 95, 77, 95,210, 96, 17, 96, 42, 96, 48, 97,  4, 95,
+     87, 95, 97, 95,120, 95,145,226,229,238,231,225,236,105,128,  9,
+    152,100,  2, 95,103, 95,114,225,242,237,229,238,233,225,110,128,
+      5,114,229,246, 97,128,  9, 24,231,117,  2, 95,127, 95,136,234,
+    225,242,225,244,105,128, 10,152,242,237,245,235,232,105,128, 10,
+     24,233,110,  4, 95,156, 95,165, 95,179, 95,195,225,242,225,226,
+    233, 99,128,  6, 58,230,233,238,225,236,225,242,225,226,233, 99,
+    128,254,206,233,238,233,244,233,225,236,225,242,225,226,233, 99,
+    128,254,207,237,229,228,233,225,236,225,242,225,226,233, 99,128,
+    254,208,101,  3, 95,218, 95,239, 96,  0,237,233,228,228,236,229,
+    232,239,239,235,227,249,242,233,236,236,233, 99,128,  4,149,243,
+    244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,147,
+    245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128,  4,
+    145,232, 97,  2, 96, 24, 96, 31,228,229,246, 97,128,  9, 90,231,
+    245,242,237,245,235,232,105,128, 10, 90,239,239,107,128,  2, 96,
+    250,243,241,245,225,242,101,128, 51,147,105,  3, 96, 66, 96, 77,
+     96, 88,232,233,242,225,231,225,238, 97,128, 48, 78,235,225,244,
+    225,235,225,238, 97,128, 48,174,109,  2, 96, 94, 96,105,225,242,
+    237,229,238,233,225,110,128,  5, 99,229,108,130,  5,210, 96,114,
+     96,134,228,225,231,229,243,104,129,251, 50, 96,125,232,229,226,
+    242,229,119,128,251, 50,232,229,226,242,229,119,128,  5,210,234,
+    229,227,249,242,233,236,236,233, 99,128,  4, 83,236,239,244,244,
+    225,108,  2, 96,167, 96,184,233,238,246,229,242,244,229,228,243,
+    244,242,239,235,101,128,  1,190,243,244,239,112,132,  2,148, 96,
+    199, 96,210, 96,216, 96,248,233,238,246,229,242,244,229,100,128,
+      2,150,237,239,100,128,  2,192,242,229,246,229,242,243,229,100,
+    130,  2,149, 96,231, 96,237,237,239,100,128,  2,193,243,245,240,
+    229,242,233,239,114,128,  2,228,243,244,242,239,235,101,129,  2,
+    161, 97,  3,242,229,246,229,242,243,229,100,128,  2,162,109,  2,
+     97, 20, 97, 28,225,227,242,239,110,128, 30, 33,239,238,239,243,
+    240,225,227,101,128,255, 71,111,  2, 97, 45, 97, 56,232,233,242,
+    225,231,225,238, 97,128, 48, 84,235,225,244,225,235,225,238, 97,
+    128, 48,180,240, 97,  2, 97, 74, 97, 80,242,229,110,128, 36,162,
+    243,241,245,225,242,101,128, 51,172,114,  2, 97, 95, 97,192, 97,
+      2, 97,101, 97,109,228,233,229,238,116,128, 34,  7,246,101,134,
+      0, 96, 97,126, 97,137, 97,154, 97,161, 97,170, 97,182,226,229,
+    236,239,247,227,237, 98,128,  3, 22, 99,  2, 97,143, 97,148,237,
+     98,128,  3,  0,239,237, 98,128,  3,  0,228,229,246, 97,128,  9,
+     83,236,239,247,237,239,100,128,  2,206,237,239,238,239,243,240,
+    225,227,101,128,255, 64,244,239,238,229,227,237, 98,128,  3, 64,
+    229,225,244,229,114,132,  0, 62, 97,208, 97,227, 97,239, 98, 26,
+    229,241,245,225,108,129, 34,101, 97,218,239,242,236,229,243,115,
+    128, 34,219,237,239,238,239,243,240,225,227,101,128,255, 30,111,
+      2, 97,245, 98, 15,114,  2, 97,251, 98,  8,229,241,245,233,246,
+    225,236,229,238,116,128, 34,115,236,229,243,115,128, 34,119,246,
+    229,242,229,241,245,225,108,128, 34,103,243,237,225,236,108,128,
+    254,101,115,  2, 98, 40, 98, 48,227,242,233,240,116,128,  2, 97,
+    244,242,239,235,101,128,  1,229,117,  4, 98, 66, 98, 77, 98,134,
+     98,145,232,233,242,225,231,225,238, 97,128, 48, 80,233,108,  2,
+     98, 84, 98,109,236,229,237,239,116,  2, 98, 94, 98,101,236,229,
+    230,116,128,  0,171,242,233,231,232,116,128,  0,187,243,233,238,
+    231,108,  2, 98,119, 98,126,236,229,230,116,128, 32, 57,242,233,
+    231,232,116,128, 32, 58,235,225,244,225,235,225,238, 97,128, 48,
+    176,242,225,237,245,243,241,245,225,242,101,128, 51, 24,249,243,
+    241,245,225,242,101,128, 51,201,104,144,  0,104, 98,204,101, 90,
+    101,125,101,162,101,202,103, 90,103,110,104, 75,104, 87,104, 99,
+    105,167,105,175,105,186,105,195,106, 19,106, 23, 97, 13, 98,232,
+     99, 15, 99, 25, 99, 55, 99, 80, 99,158, 99,170, 99,195, 99,210,
+     99,239, 99,252,100, 54,100, 63, 97,  2, 98,238, 99,  1,226,235,
+    232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128,  4,
+    169,236,244,239,238,229,225,242,225,226,233, 99,128,  6,193,226,
+    229,238,231,225,236,105,128,  9,185,228,101,  2, 99, 32, 99, 50,
+    243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128,
+      4,179,246, 97,128,  9, 57,231,117,  2, 99, 62, 99, 71,234,225,
+    242,225,244,105,128, 10,185,242,237,245,235,232,105,128, 10, 57,
+    104,  4, 99, 90, 99, 99, 99,113, 99,143,225,242,225,226,233, 99,
+    128,  6, 45,230,233,238,225,236,225,242,225,226,233, 99,128,254,
+    162,105,  2, 99,119, 99,134,238,233,244,233,225,236,225,242,225,
+    226,233, 99,128,254,163,242,225,231,225,238, 97,128, 48,111,237,
+    229,228,233,225,236,225,242,225,226,233, 99,128,254,164,233,244,
+    245,243,241,245,225,242,101,128, 51, 42,235,225,244,225,235,225,
+    238, 97,129, 48,207, 99,183,232,225,236,230,247,233,228,244,104,
+    128,255,138,236,225,238,244,231,245,242,237,245,235,232,105,128,
+     10, 77,237,250, 97,  2, 99,218, 99,227,225,242,225,226,233, 99,
+    128,  6, 33,236,239,247,225,242,225,226,233, 99,128,  6, 33,238,
+    231,245,236,230,233,236,236,229,114,128, 49,100,114,  2,100,  2,
+    100, 18,228,243,233,231,238,227,249,242,233,236,236,233, 99,128,
+      4, 74,240,239,239,110,  2,100, 27,100, 40,236,229,230,244,226,
+    225,242,226,245,112,128, 33,188,242,233,231,232,244,226,225,242,
+    226,245,112,128, 33,192,243,241,245,225,242,101,128, 51,202,244,
+    225,102,  3,100, 73,100,165,101,  0,240,225,244,225,104,134,  5,
+    178,100, 93,100, 98,100,112,100,121,100,136,100,152,177, 54,128,
+      5,178, 50,  2,100,104,100,108, 51,128,  5,178,102,128,  5,178,
+    232,229,226,242,229,119,128,  5,178,238,225,242,242,239,247,232,
+    229,226,242,229,119,128,  5,178,241,245,225,242,244,229,242,232,
+    229,226,242,229,119,128,  5,178,247,233,228,229,232,229,226,242,
+    229,119,128,  5,178,241,225,237,225,244,115,135,  5,179,100,188,
+    100,193,100,198,100,203,100,212,100,227,100,243,177, 98,128,  5,
+    179,178, 56,128,  5,179,179, 52,128,  5,179,232,229,226,242,229,
+    119,128,  5,179,238,225,242,242,239,247,232,229,226,242,229,119,
+    128,  5,179,241,245,225,242,244,229,242,232,229,226,242,229,119,
+    128,  5,179,247,233,228,229,232,229,226,242,229,119,128,  5,179,
+    243,229,231,239,108,135,  5,177,101, 22,101, 27,101, 32,101, 37,
+    101, 46,101, 61,101, 77,177, 55,128,  5,177,178, 52,128,  5,177,
+    179, 48,128,  5,177,232,229,226,242,229,119,128,  5,177,238,225,
+    242,242,239,247,232,229,226,242,229,119,128,  5,177,241,245,225,
+    242,244,229,242,232,229,226,242,229,119,128,  5,177,247,233,228,
+    229,232,229,226,242,229,119,128,  5,177, 98,  3,101, 98,101,103,
+    101,113,225,114,128,  1, 39,239,240,239,237,239,230,111,128, 49,
+     15,242,229,246,229,226,229,236,239,119,128, 30, 43, 99,  2,101,
+    131,101,140,229,228,233,236,236, 97,128, 30, 41,233,242, 99,  2,
+    101,148,101,153,236,101,128, 36,215,245,237,230,236,229,120,128,
+      1, 37,100,  2,101,168,101,178,233,229,242,229,243,233,115,128,
+     30, 39,239,116,  2,101,185,101,194,225,227,227,229,238,116,128,
+     30, 35,226,229,236,239,119,128, 30, 37,101,136,  5,212,101,222,
+    101,255,102, 19,102,248,103,  8,103, 53,103, 62,103, 75,225,242,
+    116,129, 38,101,101,230,243,245,233,116,  2,101,239,101,247,226,
+    236,225,227,107,128, 38,101,247,232,233,244,101,128, 38, 97,228,
+    225,231,229,243,104,129,251, 52,102, 10,232,229,226,242,229,119,
+    128,251, 52,104,  6,102, 33,102, 61,102, 69,102,119,102,165,102,
+    214, 97,  2,102, 39,102, 53,236,244,239,238,229,225,242,225,226,
+    233, 99,128,  6,193,242,225,226,233, 99,128,  6, 71,229,226,242,
+    229,119,128,  5,212,230,233,238,225,236, 97,  2,102, 80,102,111,
+    236,116,  2,102, 87,102, 99,239,238,229,225,242,225,226,233, 99,
+    128,251,167,244,247,239,225,242,225,226,233, 99,128,254,234,242,
+    225,226,233, 99,128,254,234,232,225,237,250,225,225,226,239,246,
+    101,  2,102,134,102,148,230,233,238,225,236,225,242,225,226,233,
+     99,128,251,165,233,243,239,236,225,244,229,228,225,242,225,226,
+    233, 99,128,251,164,105,  2,102,171,102,205,238,233,244,233,225,
+    236, 97,  2,102,183,102,197,236,244,239,238,229,225,242,225,226,
+    233, 99,128,251,168,242,225,226,233, 99,128,254,235,242,225,231,
+    225,238, 97,128, 48,120,237,229,228,233,225,236, 97,  2,102,226,
+    102,240,236,244,239,238,229,225,242,225,226,233, 99,128,251,169,
+    242,225,226,233, 99,128,254,236,233,243,229,233,229,242,225,243,
+    241,245,225,242,101,128, 51,123,107,  2,103, 14,103, 38,225,244,
+    225,235,225,238, 97,129, 48,216,103, 26,232,225,236,230,247,233,
+    228,244,104,128,255,141,245,244,225,225,242,245,243,241,245,225,
+    242,101,128, 51, 54,238,231,232,239,239,107,128,  2,103,242,245,
+    244,245,243,241,245,225,242,101,128, 51, 57,116,129,  5,215,103,
+     81,232,229,226,242,229,119,128,  5,215,232,239,239,107,129,  2,
+    102,103, 99,243,245,240,229,242,233,239,114,128,  2,177,105,  4,
+    103,120,103,205,103,216,103,241,229,245,104,  4,103,132,103,167,
+    103,182,103,191, 97,  2,103,138,103,153,227,233,242,227,236,229,
+    235,239,242,229,225,110,128, 50,123,240,225,242,229,238,235,239,
+    242,229,225,110,128, 50, 27,227,233,242,227,236,229,235,239,242,
+    229,225,110,128, 50,109,235,239,242,229,225,110,128, 49, 78,240,
+    225,242,229,238,235,239,242,229,225,110,128, 50, 13,232,233,242,
+    225,231,225,238, 97,128, 48,114,235,225,244,225,235,225,238, 97,
+    129, 48,210,103,229,232,225,236,230,247,233,228,244,104,128,255,
+    139,242,233,113,134,  5,180,104,  3,104,  8,104, 22,104, 31,104,
+     46,104, 62,177, 52,128,  5,180, 50,  2,104, 14,104, 18, 49,128,
+      5,180,100,128,  5,180,232,229,226,242,229,119,128,  5,180,238,
+    225,242,242,239,247,232,229,226,242,229,119,128,  5,180,241,245,
+    225,242,244,229,242,232,229,226,242,229,119,128,  5,180,247,233,
+    228,229,232,229,226,242,229,119,128,  5,180,236,233,238,229,226,
+    229,236,239,119,128, 30,150,237,239,238,239,243,240,225,227,101,
+    128,255, 72,111,  9,104,119,104,130,104,154,104,179,105, 11,105,
+     24,105,110,105,150,105,161,225,242,237,229,238,233,225,110,128,
+      5,112,232,105,  2,104,137,104,145,240,244,232,225,105,128, 14,
+     43,242,225,231,225,238, 97,128, 48,123,235,225,244,225,235,225,
+    238, 97,129, 48,219,104,167,232,225,236,230,247,233,228,244,104,
+    128,255,142,236,225,109,135,  5,185,104,199,104,204,104,209,104,
+    214,104,223,104,238,104,254,177, 57,128,  5,185,178, 54,128,  5,
+    185,179, 50,128,  5,185,232,229,226,242,229,119,128,  5,185,238,
+    225,242,242,239,247,232,229,226,242,229,119,128,  5,185,241,245,
+    225,242,244,229,242,232,229,226,242,229,119,128,  5,185,247,233,
+    228,229,232,229,226,242,229,119,128,  5,185,238,239,235,232,245,
+    235,244,232,225,105,128, 14, 46,111,  2,105, 30,105,100,107,  4,
+    105, 40,105, 52,105, 58,105, 80,225,226,239,246,229,227,239,237,
+     98,128,  3,  9,227,237, 98,128,  3,  9,240,225,236,225,244,225,
+    236,233,250,229,228,226,229,236,239,247,227,237, 98,128,  3, 33,
+    242,229,244,242,239,230,236,229,248,226,229,236,239,247,227,237,
+     98,128,  3, 34,238,243,241,245,225,242,101,128, 51, 66,114,  2,
+    105,116,105,143,105,  2,105,122,105,131,227,239,240,244,233, 99,
+    128,  3,233,250,239,238,244,225,236,226,225,114,128, 32, 21,238,
+    227,237, 98,128,  3, 27,244,243,240,242,233,238,231,115,128, 38,
+    104,245,243,101,128, 35,  2,240,225,242,229,110,128, 36,163,243,
+    245,240,229,242,233,239,114,128,  2,176,244,245,242,238,229,100,
+    128,  2,101,117,  4,105,205,105,216,105,229,105,254,232,233,242,
+    225,231,225,238, 97,128, 48,117,233,233,244,239,243,241,245,225,
+    242,101,128, 51, 51,235,225,244,225,235,225,238, 97,129, 48,213,
+    105,242,232,225,236,230,247,233,228,244,104,128,255,140,238,231,
+    225,242,245,237,236,225,245,116,129,  2,221,106, 13,227,237, 98,
+    128,  3, 11,118,128,  1,149,249,240,232,229,110,132,  0, 45,106,
+     39,106, 50,106, 62,106, 85,233,238,230,229,242,233,239,114,128,
+    246,229,237,239,238,239,243,240,225,227,101,128,255, 13,115,  2,
+    106, 68,106, 75,237,225,236,108,128,254, 99,245,240,229,242,233,
+    239,114,128,246,230,244,247,111,128, 32, 16,105,149,  0,105,106,
+    137,106,160,106,194,106,241,110,123,110,243,111, 24,111, 51,111,
+    213,111,217,111,255,112, 21,112,105,113, 14,113, 89,113, 97,113,
+    110,113,197,113,254,114, 26,114, 70,225, 99,  2,106,144,106,150,
+    245,244,101,128,  0,237,249,242,233,236,236,233, 99,128,  4, 79,
+     98,  3,106,168,106,177,106,187,229,238,231,225,236,105,128,  9,
+    135,239,240,239,237,239,230,111,128, 49, 39,242,229,246,101,128,
+      1, 45, 99,  3,106,202,106,209,106,231,225,242,239,110,128,  1,
+    208,233,242, 99,  2,106,217,106,222,236,101,128, 36,216,245,237,
+    230,236,229,120,128,  0,238,249,242,233,236,236,233, 99,128,  4,
+     86,100,  4,106,251,107,  5,110, 80,110,113,226,236,231,242,225,
+    246,101,128,  2,  9,101,  2,107, 11,110, 75,239,231,242,225,240,
+    104,  7,107, 32,107, 46,107, 59,109,244,110, 19,110, 32,110, 44,
+    229,225,242,244,232,227,233,242,227,236,101,128, 50,143,230,233,
+    242,229,227,233,242,227,236,101,128, 50,139,233, 99, 14,107, 90,
+    107,106,107,205,108,  3,108, 69,108, 98,108,114,108,171,108,220,
+    108,232,109,  3,109, 70,109,208,109,237,225,236,236,233,225,238,
+    227,229,240,225,242,229,110,128, 50, 63, 99,  4,107,116,107,127,
+    107,141,107,148,225,236,236,240,225,242,229,110,128, 50, 58,229,
+    238,244,242,229,227,233,242,227,236,101,128, 50,165,236,239,243,
+    101,128, 48,  6,111,  3,107,156,107,171,107,191,237,237, 97,129,
+     48,  1,107,164,236,229,230,116,128,255,100,238,231,242,225,244,
+    245,236,225,244,233,239,238,240,225,242,229,110,128, 50, 55,242,
+    242,229,227,244,227,233,242,227,236,101,128, 50,163,101,  3,107,
+    213,107,225,107,242,225,242,244,232,240,225,242,229,110,128, 50,
+     47,238,244,229,242,240,242,233,243,229,240,225,242,229,110,128,
+     50, 61,248,227,229,236,236,229,238,244,227,233,242,227,236,101,
+    128, 50,157,102,  2,108,  9,108, 24,229,243,244,233,246,225,236,
+    240,225,242,229,110,128, 50, 64,105,  2,108, 30,108, 59,238,225,
+    238,227,233,225,108,  2,108, 42,108, 51,227,233,242,227,236,101,
+    128, 50,150,240,225,242,229,110,128, 50, 54,242,229,240,225,242,
+    229,110,128, 50, 43,104,  2,108, 75,108, 86,225,246,229,240,225,
+    242,229,110,128, 50, 50,233,231,232,227,233,242,227,236,101,128,
+     50,164,233,244,229,242,225,244,233,239,238,237,225,242,107,128,
+     48,  5,108,  3,108,122,108,148,108,160,225,226,239,114,  2,108,
+    131,108,140,227,233,242,227,236,101,128, 50,152,240,225,242,229,
+    110,128, 50, 56,229,230,244,227,233,242,227,236,101,128, 50,167,
+    239,247,227,233,242,227,236,101,128, 50,166,109,  2,108,177,108,
+    209,101,  2,108,183,108,198,228,233,227,233,238,229,227,233,242,
+    227,236,101,128, 50,169,244,225,236,240,225,242,229,110,128, 50,
+     46,239,239,238,240,225,242,229,110,128, 50, 42,238,225,237,229,
+    240,225,242,229,110,128, 50, 52,112,  2,108,238,108,246,229,242,
+    233,239,100,128, 48,  2,242,233,238,244,227,233,242,227,236,101,
+    128, 50,158,114,  2,109,  9,109, 57,101,  3,109, 17,109, 28,109,
+     43,225,227,232,240,225,242,229,110,128, 50, 67,240,242,229,243,
+    229,238,244,240,225,242,229,110,128, 50, 57,243,239,245,242,227,
+    229,240,225,242,229,110,128, 50, 62,233,231,232,244,227,233,242,
+    227,236,101,128, 50,168,115,  5,109, 82,109,111,109,125,109,150,
+    109,178,101,  2,109, 88,109,101,227,242,229,244,227,233,242,227,
+    236,101,128, 50,153,236,230,240,225,242,229,110,128, 50, 66,239,
+    227,233,229,244,249,240,225,242,229,110,128, 50, 51,112,  2,109,
+    131,109,137,225,227,101,128, 48,  0,229,227,233,225,236,240,225,
+    242,229,110,128, 50, 53,116,  2,109,156,109,167,239,227,235,240,
+    225,242,229,110,128, 50, 49,245,228,249,240,225,242,229,110,128,
+     50, 59,117,  2,109,184,109,193,238,240,225,242,229,110,128, 50,
+     48,240,229,242,246,233,243,229,240,225,242,229,110,128, 50, 60,
+    119,  2,109,214,109,226,225,244,229,242,240,225,242,229,110,128,
+     50, 44,239,239,228,240,225,242,229,110,128, 50, 45,250,229,242,
+    111,128, 48,  7,109,  2,109,250,110,  7,229,244,225,236,227,233,
+    242,227,236,101,128, 50,142,239,239,238,227,233,242,227,236,101,
+    128, 50,138,238,225,237,229,227,233,242,227,236,101,128, 50,148,
+    243,245,238,227,233,242,227,236,101,128, 50,144,119,  2,110, 50,
+    110, 63,225,244,229,242,227,233,242,227,236,101,128, 50,140,239,
+    239,228,227,233,242,227,236,101,128, 50,141,246, 97,128,  9,  7,
+    233,229,242,229,243,233,115,130,  0,239,110, 94,110,102,225,227,
+    245,244,101,128, 30, 47,227,249,242,233,236,236,233, 99,128,  4,
+    229,239,244,226,229,236,239,119,128, 30,203,101,  3,110,131,110,
+    147,110,158,226,242,229,246,229,227,249,242,233,236,236,233, 99,
+    128,  4,215,227,249,242,233,236,236,233, 99,128,  4, 53,245,238,
+    103,  4,110,170,110,205,110,220,110,229, 97,  2,110,176,110,191,
+    227,233,242,227,236,229,235,239,242,229,225,110,128, 50,117,240,
+    225,242,229,238,235,239,242,229,225,110,128, 50, 21,227,233,242,
+    227,236,229,235,239,242,229,225,110,128, 50,103,235,239,242,229,
+    225,110,128, 49, 71,240,225,242,229,238,235,239,242,229,225,110,
+    128, 50,  7,103,  2,110,249,111,  0,242,225,246,101,128,  0,236,
+    117,  2,111,  6,111, 15,234,225,242,225,244,105,128, 10,135,242,
+    237,245,235,232,105,128, 10,  7,104,  2,111, 30,111, 40,233,242,
+    225,231,225,238, 97,128, 48, 68,239,239,235,225,226,239,246,101,
+    128, 30,201,105,  8,111, 69,111, 79,111, 90,111, 97,111,122,111,
+    138,111,153,111,169,226,229,238,231,225,236,105,128,  9,136,227,
+    249,242,233,236,236,233, 99,128,  4, 56,228,229,246, 97,128,  9,
+      8,231,117,  2,111,104,111,113,234,225,242,225,244,105,128, 10,
+    136,242,237,245,235,232,105,128, 10,  8,237,225,244,242,225,231,
+    245,242,237,245,235,232,105,128, 10, 64,238,246,229,242,244,229,
+    228,226,242,229,246,101,128,  2, 11,243,232,239,242,244,227,249,
+    242,233,236,236,233, 99,128,  4, 57,246,239,247,229,236,243,233,
+    231,110,  3,111,185,111,195,111,202,226,229,238,231,225,236,105,
+    128,  9,192,228,229,246, 97,128,  9, 64,231,245,234,225,242,225,
+    244,105,128, 10,192,106,128,  1, 51,107,  2,111,223,111,247,225,
+    244,225,235,225,238, 97,129, 48,164,111,235,232,225,236,230,247,
+    233,228,244,104,128,255,114,239,242,229,225,110,128, 49, 99,108,
+      2,112,  5,112, 10,228,101,128,  2,220,245,249,232,229,226,242,
+    229,119,128,  5,172,109,  2,112, 27,112, 94, 97,  3,112, 35,112,
+     55,112, 80,227,242,239,110,129,  1, 43,112, 44,227,249,242,233,
+    236,236,233, 99,128,  4,227,231,229,239,242,225,240,240,242,239,
+    248,233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 83,
+    244,242,225,231,245,242,237,245,235,232,105,128, 10, 63,239,238,
+    239,243,240,225,227,101,128,255, 73,110,  5,112,117,112,127,112,
+    136,112,148,112,232,227,242,229,237,229,238,116,128, 34,  6,230,
+    233,238,233,244,121,128, 34, 30,233,225,242,237,229,238,233,225,
+    110,128,  5,107,116,  2,112,154,112,222,101,  2,112,160,112,211,
+    231,242,225,108,131, 34, 43,112,173,112,191,112,196, 98,  2,112,
+    179,112,187,239,244,244,239,109,128, 35, 33,116,128, 35, 33,229,
+    120,128,248,245,116,  2,112,202,112,207,239,112,128, 35, 32,112,
+    128, 35, 32,242,243,229,227,244,233,239,110,128, 34, 41,233,243,
+    241,245,225,242,101,128, 51,  5,118,  3,112,240,112,249,113,  2,
+    226,245,236,236,229,116,128, 37,216,227,233,242,227,236,101,128,
+     37,217,243,237,233,236,229,230,225,227,101,128, 38, 59,111,  3,
+    113, 22,113, 33,113, 41,227,249,242,233,236,236,233, 99,128,  4,
+     81,231,239,238,229,107,128,  1, 47,244, 97,131,  3,185,113, 52,
+    113, 73,113, 81,228,233,229,242,229,243,233,115,129,  3,202,113,
+     65,244,239,238,239,115,128,  3,144,236,225,244,233,110,128,  2,
+    105,244,239,238,239,115,128,  3,175,240,225,242,229,110,128, 36,
+    164,242,233,231,245,242,237,245,235,232,105,128, 10,114,115,  4,
+    113,120,113,165,113,179,113,187,237,225,236,108,  2,113,129,113,
+    140,232,233,242,225,231,225,238, 97,128, 48, 67,235,225,244,225,
+    235,225,238, 97,129, 48,163,113,153,232,225,236,230,247,233,228,
+    244,104,128,255,104,243,232,225,242,226,229,238,231,225,236,105,
+    128,  9,250,244,242,239,235,101,128,  2,104,245,240,229,242,233,
+    239,114,128,246,237,116,  2,113,203,113,237,229,242,225,244,233,
+    239,110,  2,113,215,113,226,232,233,242,225,231,225,238, 97,128,
+     48,157,235,225,244,225,235,225,238, 97,128, 48,253,233,236,228,
+    101,129,  1, 41,113,246,226,229,236,239,119,128, 30, 45,117,  2,
+    114,  4,114, 15,226,239,240,239,237,239,230,111,128, 49, 41,227,
+    249,242,233,236,236,233, 99,128,  4, 78,246,239,247,229,236,243,
+    233,231,110,  3,114, 42,114, 52,114, 59,226,229,238,231,225,236,
+    105,128,  9,191,228,229,246, 97,128,  9, 63,231,245,234,225,242,
+    225,244,105,128, 10,191,250,232,233,244,243, 97,  2,114, 81,114,
+     92,227,249,242,233,236,236,233, 99,128,  4,117,228,226,236,231,
+    242,225,246,229,227,249,242,233,236,236,233, 99,128,  4,119,106,
+    138,  0,106,114,135,114,198,114,209,115,  3,115, 19,115,132,115,
+    201,115,206,115,218,115,226, 97,  4,114,145,114,156,114,166,114,
+    173,225,242,237,229,238,233,225,110,128,  5,113,226,229,238,231,
+    225,236,105,128,  9,156,228,229,246, 97,128,  9, 28,231,117,  2,
+    114,180,114,189,234,225,242,225,244,105,128, 10,156,242,237,245,
+    235,232,105,128, 10, 28,226,239,240,239,237,239,230,111,128, 49,
+     16, 99,  3,114,217,114,224,114,246,225,242,239,110,128,  1,240,
+    233,242, 99,  2,114,232,114,237,236,101,128, 36,217,245,237,230,
+    236,229,120,128,  1, 53,242,239,243,243,229,228,244,225,233,108,
+    128,  2,157,228,239,244,236,229,243,243,243,244,242,239,235,101,
+    128,  2, 95,101,  3,115, 27,115, 38,115,103,227,249,242,233,236,
+    236,233, 99,128,  4, 88,229,109,  4,115, 49,115, 58,115, 72,115,
+     88,225,242,225,226,233, 99,128,  6, 44,230,233,238,225,236,225,
+    242,225,226,233, 99,128,254,158,233,238,233,244,233,225,236,225,
+    242,225,226,233, 99,128,254,159,237,229,228,233,225,236,225,242,
+    225,226,233, 99,128,254,160,104,  2,115,109,115,118,225,242,225,
+    226,233, 99,128,  6,152,230,233,238,225,236,225,242,225,226,233,
+     99,128,251,139,104,  2,115,138,115,188, 97,  3,115,146,115,156,
+    115,163,226,229,238,231,225,236,105,128,  9,157,228,229,246, 97,
+    128,  9, 29,231,117,  2,115,170,115,179,234,225,242,225,244,105,
+    128, 10,157,242,237,245,235,232,105,128, 10, 29,229,232,225,242,
+    237,229,238,233,225,110,128,  5,123,233,115,128, 48,  4,237,239,
+    238,239,243,240,225,227,101,128,255, 74,240,225,242,229,110,128,
+     36,165,243,245,240,229,242,233,239,114,128,  2,178,107,146,  0,
+    107,116, 21,118,110,118,121,118,183,118,194,119, 28,119, 42,120,
+    150,121, 90,121,103,121,129,121,178,122, 60,122, 82,122, 95,122,
+    118,122,160,122,170, 97, 12,116, 47,116, 79,116,101,116,131,116,
+    245,117, 14,117, 44,117, 69,117,175,117,189,118, 56,118, 85, 98,
+      2,116, 53,116, 70,225,243,232,235,233,242,227,249,242,233,236,
+    236,233, 99,128,  4,161,229,238,231,225,236,105,128,  9,149, 99,
+      2,116, 85,116, 91,245,244,101,128, 30, 49,249,242,233,236,236,
+    233, 99,128,  4, 58,228,101,  2,116,108,116,126,243,227,229,238,
+    228,229,242,227,249,242,233,236,236,233, 99,128,  4,155,246, 97,
+    128,  9, 21,102,135,  5,219,116,149,116,158,116,178,116,192,116,
+    201,116,217,116,232,225,242,225,226,233, 99,128,  6, 67,228,225,
+    231,229,243,104,129,251, 59,116,169,232,229,226,242,229,119,128,
+    251, 59,230,233,238,225,236,225,242,225,226,233, 99,128,254,218,
+    232,229,226,242,229,119,128,  5,219,233,238,233,244,233,225,236,
+    225,242,225,226,233, 99,128,254,219,237,229,228,233,225,236,225,
+    242,225,226,233, 99,128,254,220,242,225,230,229,232,229,226,242,
+    229,119,128,251, 77,231,117,  2,116,252,117,  5,234,225,242,225,
+    244,105,128, 10,149,242,237,245,235,232,105,128, 10, 21,104,  2,
+    117, 20,117, 30,233,242,225,231,225,238, 97,128, 48, 75,239,239,
+    235,227,249,242,233,236,236,233, 99,128,  4,196,235,225,244,225,
+    235,225,238, 97,129, 48,171,117, 57,232,225,236,230,247,233,228,
+    244,104,128,255,118,112,  2,117, 75,117, 96,240, 97,129,  3,186,
+    117, 82,243,249,237,226,239,236,231,242,229,229,107,128,  3,240,
+    249,229,239,245,110,  3,117,108,117,122,117,156,237,233,229,245,
+    237,235,239,242,229,225,110,128, 49,113,112,  2,117,128,117,143,
+    232,233,229,245,240,232,235,239,242,229,225,110,128, 49,132,233,
+    229,245,240,235,239,242,229,225,110,128, 49,120,243,243,225,238,
+    231,240,233,229,245,240,235,239,242,229,225,110,128, 49,121,242,
+    239,242,233,233,243,241,245,225,242,101,128, 51, 13,115,  5,117,
+    201,117,245,118,  4,118, 12,118, 40,232,233,228,225,225,245,244,
+    111,  2,117,214,117,223,225,242,225,226,233, 99,128,  6, 64,238,
+    239,243,233,228,229,226,229,225,242,233,238,231,225,242,225,226,
+    233, 99,128,  6, 64,237,225,236,236,235,225,244,225,235,225,238,
+     97,128, 48,245,241,245,225,242,101,128, 51,132,242, 97,  2,118,
+     19,118, 28,225,242,225,226,233, 99,128,  6, 80,244,225,238,225,
+    242,225,226,233, 99,128,  6, 77,244,242,239,235,229,227,249,242,
+    233,236,236,233, 99,128,  4,159,244,225,232,233,242,225,240,242,
+    239,236,239,238,231,237,225,242,235,232,225,236,230,247,233,228,
+    244,104,128,255,112,246,229,242,244,233,227,225,236,243,244,242,
+    239,235,229,227,249,242,233,236,236,233, 99,128,  4,157,226,239,
+    240,239,237,239,230,111,128, 49, 14, 99,  4,118,131,118,153,118,
+    162,118,170, 97,  2,118,137,118,147,236,243,241,245,225,242,101,
+    128, 51,137,242,239,110,128,  1,233,229,228,233,236,236, 97,128,
+      1, 55,233,242,227,236,101,128, 36,218,239,237,237,225,225,227,
+    227,229,238,116,128,  1, 55,228,239,244,226,229,236,239,119,128,
+     30, 51,101,  4,118,204,118,231,119,  0,119, 12,104,  2,118,210,
+    118,221,225,242,237,229,238,233,225,110,128,  5,132,233,242,225,
+    231,225,238, 97,128, 48, 81,235,225,244,225,235,225,238, 97,129,
+     48,177,118,244,232,225,236,230,247,233,228,244,104,128,255,121,
+    238,225,242,237,229,238,233,225,110,128,  5,111,243,237,225,236,
+    236,235,225,244,225,235,225,238, 97,128, 48,246,231,242,229,229,
+    238,236,225,238,228,233, 99,128,  1, 56,104,  6,119, 56,119,185,
+    119,196,119,221,120, 52,120,140, 97,  5,119, 68,119, 78,119, 89,
+    119, 96,119,121,226,229,238,231,225,236,105,128,  9,150,227,249,
+    242,233,236,236,233, 99,128,  4, 69,228,229,246, 97,128,  9, 22,
+    231,117,  2,119,103,119,112,234,225,242,225,244,105,128, 10,150,
+    242,237,245,235,232,105,128, 10, 22,104,  4,119,131,119,140,119,
+    154,119,170,225,242,225,226,233, 99,128,  6, 46,230,233,238,225,
+    236,225,242,225,226,233, 99,128,254,166,233,238,233,244,233,225,
+    236,225,242,225,226,233, 99,128,254,167,237,229,228,233,225,236,
+    225,242,225,226,233, 99,128,254,168,229,233,227,239,240,244,233,
+     99,128,  3,231,232, 97,  2,119,203,119,210,228,229,246, 97,128,
+      9, 89,231,245,242,237,245,235,232,105,128, 10, 89,233,229,245,
+    235,104,  4,119,235,120, 14,120, 29,120, 38, 97,  2,119,241,120,
+      0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,120,
+    240,225,242,229,238,235,239,242,229,225,110,128, 50, 24,227,233,
+    242,227,236,229,235,239,242,229,225,110,128, 50,106,235,239,242,
+    229,225,110,128, 49, 75,240,225,242,229,238,235,239,242,229,225,
+    110,128, 50, 10,111,  4,120, 62,120,111,120,121,120,126,235,104,
+      4,120, 73,120, 82,120, 91,120,101,225,233,244,232,225,105,128,
+     14,  2,239,238,244,232,225,105,128, 14,  5,245,225,244,244,232,
+    225,105,128, 14,  3,247,225,233,244,232,225,105,128, 14,  4,237,
+    245,244,244,232,225,105,128, 14, 91,239,107,128,  1,153,242,225,
+    235,232,225,238,231,244,232,225,105,128, 14,  6,250,243,241,245,
+    225,242,101,128, 51,145,105,  4,120,160,120,171,120,196,120,245,
+    232,233,242,225,231,225,238, 97,128, 48, 77,235,225,244,225,235,
+    225,238, 97,129, 48,173,120,184,232,225,236,230,247,233,228,244,
+    104,128,255,119,242,111,  3,120,205,120,220,120,236,231,245,242,
+    225,237,245,243,241,245,225,242,101,128, 51, 21,237,229,229,244,
+    239,242,245,243,241,245,225,242,101,128, 51, 22,243,241,245,225,
+    242,101,128, 51, 20,249,229,239,107,  5,121,  4,121, 39,121, 54,
+    121, 63,121, 77, 97,  2,121, 10,121, 25,227,233,242,227,236,229,
+    235,239,242,229,225,110,128, 50,110,240,225,242,229,238,235,239,
+    242,229,225,110,128, 50, 14,227,233,242,227,236,229,235,239,242,
+    229,225,110,128, 50, 96,235,239,242,229,225,110,128, 49, 49,240,
+    225,242,229,238,235,239,242,229,225,110,128, 50,  0,243,233,239,
+    243,235,239,242,229,225,110,128, 49, 51,234,229,227,249,242,233,
+    236,236,233, 99,128,  4, 92,108,  2,121,109,121,120,233,238,229,
+    226,229,236,239,119,128, 30, 53,243,241,245,225,242,101,128, 51,
+    152,109,  3,121,137,121,151,121,162,227,245,226,229,228,243,241,
+    245,225,242,101,128, 51,166,239,238,239,243,240,225,227,101,128,
+    255, 75,243,241,245,225,242,229,228,243,241,245,225,242,101,128,
+     51,162,111,  5,121,190,121,216,121,254,122, 10,122, 24,104,  2,
+    121,196,121,206,233,242,225,231,225,238, 97,128, 48, 83,237,243,
+    241,245,225,242,101,128, 51,192,235, 97,  2,121,223,121,231,233,
+    244,232,225,105,128, 14,  1,244,225,235,225,238, 97,129, 48,179,
+    121,242,232,225,236,230,247,233,228,244,104,128,255,122,239,240,
+    239,243,241,245,225,242,101,128, 51, 30,240,240,225,227,249,242,
+    233,236,236,233, 99,128,  4,129,114,  2,122, 30,122, 50,229,225,
+    238,243,244,225,238,228,225,242,228,243,249,237,226,239,108,128,
+     50,127,239,238,233,243,227,237, 98,128,  3, 67,240, 97,  2,122,
+     67,122, 73,242,229,110,128, 36,166,243,241,245,225,242,101,128,
+     51,170,243,233,227,249,242,233,236,236,233, 99,128,  4,111,116,
+      2,122,101,122,110,243,241,245,225,242,101,128, 51,207,245,242,
+    238,229,100,128,  2,158,117,  2,122,124,122,135,232,233,242,225,
+    231,225,238, 97,128, 48, 79,235,225,244,225,235,225,238, 97,129,
+     48,175,122,148,232,225,236,230,247,233,228,244,104,128,255,120,
+    246,243,241,245,225,242,101,128, 51,184,247,243,241,245,225,242,
+    101,128, 51,190,108,146,  0,108,122,220,124,247,125, 20,125, 86,
+    125,124,126, 20,126, 29,126, 45,126, 69,126, 87,126,205,126,246,
+    127,125,127,133,127,166,127,175,127,183,127,245, 97,  7,122,236,
+    122,246,122,253,123,  4,123, 29,123, 45,124,235,226,229,238,231,
+    225,236,105,128,  9,178,227,245,244,101,128,  1, 58,228,229,246,
+     97,128,  9, 50,231,117,  2,123, 11,123, 20,234,225,242,225,244,
+    105,128, 10,178,242,237,245,235,232,105,128, 10, 50,235,235,232,
+    225,238,231,249,225,239,244,232,225,105,128, 14, 69,109, 10,123,
+     67,124,  6,124, 23,124, 61,124, 75,124, 94,124,110,124,130,124,
+    150,124,173, 97,  2,123, 73,123,254,236,229,102,  4,123, 85,123,
+     99,123,191,123,208,230,233,238,225,236,225,242,225,226,233, 99,
+    128,254,252,232,225,237,250, 97,  2,123,109,123,150,225,226,239,
+    246,101,  2,123,119,123,133,230,233,238,225,236,225,242,225,226,
+    233, 99,128,254,248,233,243,239,236,225,244,229,228,225,242,225,
+    226,233, 99,128,254,247,226,229,236,239,119,  2,123,160,123,174,
+    230,233,238,225,236,225,242,225,226,233, 99,128,254,250,233,243,
+    239,236,225,244,229,228,225,242,225,226,233, 99,128,254,249,233,
+    243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,251,
+    237,225,228,228,225,225,226,239,246,101,  2,123,223,123,237,230,
+    233,238,225,236,225,242,225,226,233, 99,128,254,246,233,243,239,
+    236,225,244,229,228,225,242,225,226,233, 99,128,254,245,242,225,
+    226,233, 99,128,  6, 68,226,228, 97,129,  3,187,124, 14,243,244,
+    242,239,235,101,128,  1,155,229,100,130,  5,220,124, 32,124, 52,
+    228,225,231,229,243,104,129,251, 60,124, 43,232,229,226,242,229,
+    119,128,251, 60,232,229,226,242,229,119,128,  5,220,230,233,238,
+    225,236,225,242,225,226,233, 99,128,254,222,232,225,232,233,238,
+    233,244,233,225,236,225,242,225,226,233, 99,128,252,202,233,238,
+    233,244,233,225,236,225,242,225,226,233, 99,128,254,223,234,229,
+    229,237,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,
+    252,201,235,232,225,232,233,238,233,244,233,225,236,225,242,225,
+    226,233, 99,128,252,203,236,225,237,232,229,232,233,243,239,236,
+    225,244,229,228,225,242,225,226,233, 99,128,253,242,237,101,  2,
+    124,180,124,193,228,233,225,236,225,242,225,226,233, 99,128,254,
+    224,229,109,  2,124,200,124,219,232,225,232,233,238,233,244,233,
+    225,236,225,242,225,226,233, 99,128,253,136,233,238,233,244,233,
+    225,236,225,242,225,226,233, 99,128,252,204,242,231,229,227,233,
+    242,227,236,101,128, 37,239, 98,  3,124,255,125,  4,125, 10,225,
+    114,128,  1,154,229,236,116,128,  2,108,239,240,239,237,239,230,
+    111,128, 49, 12, 99,  4,125, 30,125, 37,125, 46,125, 73,225,242,
+    239,110,128,  1, 62,229,228,233,236,236, 97,128,  1, 60,233,242,
+     99,  2,125, 54,125, 59,236,101,128, 36,219,245,237,230,236,229,
+    248,226,229,236,239,119,128, 30, 61,239,237,237,225,225,227,227,
+    229,238,116,128,  1, 60,228,239,116,130,  1, 64,125, 96,125,105,
+    225,227,227,229,238,116,128,  1, 64,226,229,236,239,119,129, 30,
+     55,125,115,237,225,227,242,239,110,128, 30, 57,101,  3,125,132,
+    125,170,126, 15,230,116,  2,125,139,125,155,225,238,231,236,229,
+    225,226,239,246,229,227,237, 98,128,  3, 26,244,225,227,235,226,
+    229,236,239,247,227,237, 98,128,  3, 24,243,115,132,  0, 60,125,
+    183,125,205,125,217,126,  7,229,241,245,225,108,129, 34,100,125,
+    193,239,242,231,242,229,225,244,229,114,128, 34,218,237,239,238,
+    239,243,240,225,227,101,128,255, 28,111,  2,125,223,125,252,114,
+      2,125,229,125,242,229,241,245,233,246,225,236,229,238,116,128,
+     34,114,231,242,229,225,244,229,114,128, 34,118,246,229,242,229,
+    241,245,225,108,128, 34,102,243,237,225,236,108,128,254,100,250,
+    104,128,  2,110,230,226,236,239,227,107,128, 37,140,232,239,239,
+    235,242,229,244,242,239,230,236,229,120,128,  2,109,105,  2,126,
+     51,126, 56,242, 97,128, 32,164,247,238,225,242,237,229,238,233,
+    225,110,128,  5,108,106,129,  1,201,126, 75,229,227,249,242,233,
+    236,236,233, 99,128,  4, 89,108,132,246,192,126, 99,126,123,126,
+    134,126,143, 97,  2,126,105,126,112,228,229,246, 97,128,  9, 51,
+    231,245,234,225,242,225,244,105,128, 10,179,233,238,229,226,229,
+    236,239,119,128, 30, 59,236,225,228,229,246, 97,128,  9, 52,246,
+    239,227,225,236,233, 99,  3,126,157,126,167,126,174,226,229,238,
+    231,225,236,105,128,  9,225,228,229,246, 97,128,  9, 97,246,239,
+    247,229,236,243,233,231,110,  2,126,188,126,198,226,229,238,231,
+    225,236,105,128,  9,227,228,229,246, 97,128,  9, 99,109,  3,126,
+    213,126,226,126,237,233,228,228,236,229,244,233,236,228,101,128,
+      2,107,239,238,239,243,240,225,227,101,128,255, 76,243,241,245,
+    225,242,101,128, 51,208,111,  6,127,  4,127, 16,127, 58,127, 69,
+    127, 75,127,117,227,232,245,236,225,244,232,225,105,128, 14, 44,
+    231,233,227,225,108,  3,127, 28,127, 34,127, 53,225,238,100,128,
+     34, 39,238,239,116,129,  0,172,127, 42,242,229,246,229,242,243,
+    229,100,128, 35, 16,239,114,128, 34, 40,236,233,238,231,244,232,
+    225,105,128, 14, 37,238,231,115,128,  1,127,247,236,233,238,101,
+      2,127, 85,127,108, 99,  2,127, 91,127,103,229,238,244,229,242,
+    236,233,238,101,128,254, 78,237, 98,128,  3, 50,228,225,243,232,
+    229,100,128,254, 77,250,229,238,231,101,128, 37,202,240,225,242,
+    229,110,128, 36,167,115,  3,127,141,127,148,127,156,236,225,243,
+    104,128,  1, 66,241,245,225,242,101,128, 33, 19,245,240,229,242,
+    233,239,114,128,246,238,244,243,232,225,228,101,128, 37,145,245,
+    244,232,225,105,128, 14, 38,246,239,227,225,236,233, 99,  3,127,
+    197,127,207,127,214,226,229,238,231,225,236,105,128,  9,140,228,
+    229,246, 97,128,  9, 12,246,239,247,229,236,243,233,231,110,  2,
+    127,228,127,238,226,229,238,231,225,236,105,128,  9,226,228,229,
+    246, 97,128,  9, 98,248,243,241,245,225,242,101,128, 51,211,109,
+    144,  0,109,128, 35,130,144,130,169,130,196,130,221,132, 18,132,
+     40,133, 95,133,125,133,174,134, 25,134, 47,134, 72,134, 81,135,
+    108,135,136, 97, 12,128, 61,128, 71,128,135,128,142,128,167,128,
+    215,130, 51,130, 76,130, 81,130, 95,130,107,130,112,226,229,238,
+    231,225,236,105,128,  9,174, 99,  2,128, 77,128,129,242,239,110,
+    132,  0,175,128, 91,128,102,128,108,128,117,226,229,236,239,247,
+    227,237, 98,128,  3, 49,227,237, 98,128,  3,  4,236,239,247,237,
+    239,100,128,  2,205,237,239,238,239,243,240,225,227,101,128,255,
+    227,245,244,101,128, 30, 63,228,229,246, 97,128,  9, 46,231,117,
+      2,128,149,128,158,234,225,242,225,244,105,128, 10,174,242,237,
+    245,235,232,105,128, 10, 46,104,  2,128,173,128,205,225,240,225,
+    235,104,  2,128,183,128,192,232,229,226,242,229,119,128,  5,164,
+    236,229,230,244,232,229,226,242,229,119,128,  5,164,233,242,225,
+    231,225,238, 97,128, 48,126,105,  5,128,227,129, 40,129,103,129,
+    133,130, 39,227,232,225,244,244,225,247, 97,  3,128,242,129, 17,
+    129, 24,236,239,119,  2,128,250,129,  5,236,229,230,244,244,232,
+    225,105,128,248,149,242,233,231,232,244,244,232,225,105,128,248,
+    148,244,232,225,105,128, 14, 75,245,240,240,229,242,236,229,230,
+    244,244,232,225,105,128,248,147,229,107,  3,129, 49,129, 80,129,
+     87,236,239,119,  2,129, 57,129, 68,236,229,230,244,244,232,225,
+    105,128,248,140,242,233,231,232,244,244,232,225,105,128,248,139,
+    244,232,225,105,128, 14, 72,245,240,240,229,242,236,229,230,244,
+    244,232,225,105,128,248,138,232,225,238,225,235,225,116,  2,129,
+    115,129,126,236,229,230,244,244,232,225,105,128,248,132,244,232,
+    225,105,128, 14, 49,116,  3,129,141,129,169,129,232,225,233,235,
+    232,117,  2,129,151,129,162,236,229,230,244,244,232,225,105,128,
+    248,137,244,232,225,105,128, 14, 71,232,111,  3,129,178,129,209,
+    129,216,236,239,119,  2,129,186,129,197,236,229,230,244,244,232,
+    225,105,128,248,143,242,233,231,232,244,244,232,225,105,128,248,
+    142,244,232,225,105,128, 14, 73,245,240,240,229,242,236,229,230,
+    244,244,232,225,105,128,248,141,242,105,  3,129,241,130, 16,130,
+     23,236,239,119,  2,129,249,130,  4,236,229,230,244,244,232,225,
+    105,128,248,146,242,233,231,232,244,244,232,225,105,128,248,145,
+    244,232,225,105,128, 14, 74,245,240,240,229,242,236,229,230,244,
+    244,232,225,105,128,248,144,249,225,237,239,235,244,232,225,105,
+    128, 14, 70,235,225,244,225,235,225,238, 97,129, 48,222,130, 64,
+    232,225,236,230,247,233,228,244,104,128,255,143,236,101,128, 38,
+     66,238,243,249,239,238,243,241,245,225,242,101,128, 51, 71,241,
+    225,230,232,229,226,242,229,119,128,  5,190,242,115,128, 38, 66,
+    115,  2,130,118,130,136,239,242,225,227,233,242,227,236,229,232,
+    229,226,242,229,119,128,  5,175,241,245,225,242,101,128, 51,131,
+     98,  2,130,150,130,160,239,240,239,237,239,230,111,128, 49,  7,
+    243,241,245,225,242,101,128, 51,212, 99,  2,130,175,130,183,233,
+    242,227,236,101,128, 36,220,245,226,229,228,243,241,245,225,242,
+    101,128, 51,165,228,239,116,  2,130,204,130,213,225,227,227,229,
+    238,116,128, 30, 65,226,229,236,239,119,128, 30, 67,101,  7,130,
+    237,131,108,131,119,131,134,131,159,131,196,131,208,101,  2,130,
+    243,131, 95,109,  4,130,253,131,  6,131, 20,131, 36,225,242,225,
+    226,233, 99,128,  6, 69,230,233,238,225,236,225,242,225,226,233,
+     99,128,254,226,233,238,233,244,233,225,236,225,242,225,226,233,
+     99,128,254,227,237,101,  2,131, 43,131, 56,228,233,225,236,225,
+    242,225,226,233, 99,128,254,228,229,237,105,  2,131, 64,131, 79,
+    238,233,244,233,225,236,225,242,225,226,233, 99,128,252,209,243,
+    239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 72,244,
+    239,242,245,243,241,245,225,242,101,128, 51, 77,232,233,242,225,
+    231,225,238, 97,128, 48,129,233,250,233,229,242,225,243,241,245,
+    225,242,101,128, 51,126,235,225,244,225,235,225,238, 97,129, 48,
+    225,131,147,232,225,236,230,247,233,228,244,104,128,255,146,109,
+    130,  5,222,131,167,131,187,228,225,231,229,243,104,129,251, 62,
+    131,178,232,229,226,242,229,119,128,251, 62,232,229,226,242,229,
+    119,128,  5,222,238,225,242,237,229,238,233,225,110,128,  5,116,
+    242,235,232, 97,  3,131,219,131,228,132,  5,232,229,226,242,229,
+    119,128,  5,165,235,229,230,245,236, 97,  2,131,239,131,248,232,
+    229,226,242,229,119,128,  5,166,236,229,230,244,232,229,226,242,
+    229,119,128,  5,166,236,229,230,244,232,229,226,242,229,119,128,
+      5,165,104,  2,132, 24,132, 30,239,239,107,128,  2,113,250,243,
+    241,245,225,242,101,128, 51,146,105,  6,132, 54,132, 91,132,228,
+    132,239,133,  8,133, 65,228,100,  2,132, 61,132, 86,236,229,228,
+    239,244,235,225,244,225,235,225,238,225,232,225,236,230,247,233,
+    228,244,104,128,255,101,239,116,128,  0,183,229,245,109,  5,132,
+    105,132,140,132,155,132,164,132,215, 97,  2,132,111,132,126,227,
+    233,242,227,236,229,235,239,242,229,225,110,128, 50,114,240,225,
+    242,229,238,235,239,242,229,225,110,128, 50, 18,227,233,242,227,
+    236,229,235,239,242,229,225,110,128, 50,100,235,239,242,229,225,
+    110,128, 49, 65,112,  2,132,170,132,202, 97,  2,132,176,132,190,
+    238,243,233,239,243,235,239,242,229,225,110,128, 49,112,242,229,
+    238,235,239,242,229,225,110,128, 50,  4,233,229,245,240,235,239,
+    242,229,225,110,128, 49,110,243,233,239,243,235,239,242,229,225,
+    110,128, 49,111,232,233,242,225,231,225,238, 97,128, 48,127,235,
+    225,244,225,235,225,238, 97,129, 48,223,132,252,232,225,236,230,
+    247,233,228,244,104,128,255,144,238,117,  2,133, 15,133, 60,115,
+    132, 34, 18,133, 27,133, 38,133, 47,133, 53,226,229,236,239,247,
+    227,237, 98,128,  3, 32,227,233,242,227,236,101,128, 34,150,237,
+    239,100,128,  2,215,240,236,245,115,128, 34, 19,244,101,128, 32,
+     50,242,105,  2,133, 72,133, 86,226,225,225,242,245,243,241,245,
+    225,242,101,128, 51, 74,243,241,245,225,242,101,128, 51, 73,108,
+      2,133,101,133,116,239,238,231,236,229,231,244,245,242,238,229,
+    100,128,  2,112,243,241,245,225,242,101,128, 51,150,109,  3,133,
+    133,133,147,133,158,227,245,226,229,228,243,241,245,225,242,101,
+    128, 51,163,239,238,239,243,240,225,227,101,128,255, 77,243,241,
+    245,225,242,229,228,243,241,245,225,242,101,128, 51,159,111,  5,
+    133,186,133,212,133,237,133,247,134,  0,104,  2,133,192,133,202,
+    233,242,225,231,225,238, 97,128, 48,130,237,243,241,245,225,242,
+    101,128, 51,193,235,225,244,225,235,225,238, 97,129, 48,226,133,
+    225,232,225,236,230,247,233,228,244,104,128,255,147,236,243,241,
+    245,225,242,101,128, 51,214,237,225,244,232,225,105,128, 14, 33,
+    246,229,242,243,243,241,245,225,242,101,129, 51,167,134, 15,228,
+    243,241,245,225,242,101,128, 51,168,240, 97,  2,134, 32,134, 38,
+    242,229,110,128, 36,168,243,241,245,225,242,101,128, 51,171,115,
+      2,134, 53,134, 62,243,241,245,225,242,101,128, 51,179,245,240,
+    229,242,233,239,114,128,246,239,244,245,242,238,229,100,128,  2,
+    111,117,141,  0,181,134,111,134,115,134,125,134,149,134,159,134,
+    181,134,192,134,217,134,240,134,250,135, 24,135, 88,135, 98, 49,
+    128,  0,181,225,243,241,245,225,242,101,128, 51,130,227,104,  2,
+    134,132,134,142,231,242,229,225,244,229,114,128, 34,107,236,229,
+    243,115,128, 34,106,230,243,241,245,225,242,101,128, 51,140,103,
+      2,134,165,134,172,242,229,229,107,128,  3,188,243,241,245,225,
+    242,101,128, 51,141,232,233,242,225,231,225,238, 97,128, 48,128,
+    235,225,244,225,235,225,238, 97,129, 48,224,134,205,232,225,236,
+    230,247,233,228,244,104,128,255,145,108,  2,134,223,134,232,243,
+    241,245,225,242,101,128, 51,149,244,233,240,236,121,128,  0,215,
+    237,243,241,245,225,242,101,128, 51,155,238,225,104,  2,135,  2,
+    135, 11,232,229,226,242,229,119,128,  5,163,236,229,230,244,232,
+    229,226,242,229,119,128,  5,163,115,  2,135, 30,135, 79,233, 99,
+      3,135, 39,135, 56,135, 67,225,236,238,239,244,101,129, 38,106,
+    135, 50,228,226,108,128, 38,107,230,236,225,244,243,233,231,110,
+    128, 38,109,243,232,225,242,240,243,233,231,110,128, 38,111,243,
+    241,245,225,242,101,128, 51,178,246,243,241,245,225,242,101,128,
+     51,182,247,243,241,245,225,242,101,128, 51,188,118,  2,135,114,
+    135,127,237,229,231,225,243,241,245,225,242,101,128, 51,185,243,
+    241,245,225,242,101,128, 51,183,119,  2,135,142,135,155,237,229,
+    231,225,243,241,245,225,242,101,128, 51,191,243,241,245,225,242,
+    101,128, 51,189,110,150,  0,110,135,212,136, 90,136,114,136,180,
+    136,205,137,  7,137, 17,137, 84,137,127,139,161,139,179,139,204,
+    139,235,140,  5,140, 70,142, 52,142, 60,142, 85,142, 93,143, 61,
+    143, 71,143, 81, 97,  8,135,230,135,250,136,  1,136,  8,136, 33,
+    136, 44,136, 69,136, 81, 98,  2,135,236,135,245,229,238,231,225,
+    236,105,128,  9,168,236, 97,128, 34,  7,227,245,244,101,128,  1,
+     68,228,229,246, 97,128,  9, 40,231,117,  2,136, 15,136, 24,234,
+    225,242,225,244,105,128, 10,168,242,237,245,235,232,105,128, 10,
+     40,232,233,242,225,231,225,238, 97,128, 48,106,235,225,244,225,
+    235,225,238, 97,129, 48,202,136, 57,232,225,236,230,247,233,228,
+    244,104,128,255,133,240,239,243,244,242,239,240,232,101,128,  1,
+     73,243,241,245,225,242,101,128, 51,129, 98,  2,136, 96,136,106,
+    239,240,239,237,239,230,111,128, 49, 11,243,240,225,227,101,128,
+      0,160, 99,  4,136,124,136,131,136,140,136,167,225,242,239,110,
+    128,  1, 72,229,228,233,236,236, 97,128,  1, 70,233,242, 99,  2,
+    136,148,136,153,236,101,128, 36,221,245,237,230,236,229,248,226,
+    229,236,239,119,128, 30, 75,239,237,237,225,225,227,227,229,238,
+    116,128,  1, 70,228,239,116,  2,136,188,136,197,225,227,227,229,
+    238,116,128, 30, 69,226,229,236,239,119,128, 30, 71,101,  3,136,
+    213,136,224,136,249,232,233,242,225,231,225,238, 97,128, 48,109,
+    235,225,244,225,235,225,238, 97,129, 48,205,136,237,232,225,236,
+    230,247,233,228,244,104,128,255,136,247,243,232,229,241,229,236,
+    243,233,231,110,128, 32,170,230,243,241,245,225,242,101,128, 51,
+    139,103,  2,137, 23,137, 73, 97,  3,137, 31,137, 41,137, 48,226,
+    229,238,231,225,236,105,128,  9,153,228,229,246, 97,128,  9, 25,
+    231,117,  2,137, 55,137, 64,234,225,242,225,244,105,128, 10,153,
+    242,237,245,235,232,105,128, 10, 25,239,238,231,245,244,232,225,
+    105,128, 14,  7,104,  2,137, 90,137,100,233,242,225,231,225,238,
+     97,128, 48,147,239,239,107,  2,137,108,137,115,236,229,230,116,
+    128,  2,114,242,229,244,242,239,230,236,229,120,128,  2,115,105,
+      4,137,137,138, 50,138, 61,138,119,229,245,110,  7,137,155,137,
+    190,137,222,137,236,137,245,138, 22,138, 35, 97,  2,137,161,137,
+    176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,111,
+    240,225,242,229,238,235,239,242,229,225,110,128, 50, 15,227,105,
+      2,137,197,137,209,229,245,227,235,239,242,229,225,110,128, 49,
+     53,242,227,236,229,235,239,242,229,225,110,128, 50, 97,232,233,
+    229,245,232,235,239,242,229,225,110,128, 49, 54,235,239,242,229,
+    225,110,128, 49, 52,240, 97,  2,137,252,138, 10,238,243,233,239,
+    243,235,239,242,229,225,110,128, 49,104,242,229,238,235,239,242,
+    229,225,110,128, 50,  1,243,233,239,243,235,239,242,229,225,110,
+    128, 49,103,244,233,235,229,245,244,235,239,242,229,225,110,128,
+     49,102,232,233,242,225,231,225,238, 97,128, 48,107,107,  2,138,
+     67,138, 91,225,244,225,235,225,238, 97,129, 48,203,138, 79,232,
+    225,236,230,247,233,228,244,104,128,255,134,232,225,232,233,116,
+      2,138,101,138,112,236,229,230,244,244,232,225,105,128,248,153,
+    244,232,225,105,128, 14, 77,238,101,141,  0, 57,138,150,138,159,
+    138,169,138,199,138,206,138,231,139,  2,139, 36,139, 48,139, 59,
+    139, 92,139,100,139,111,225,242,225,226,233, 99,128,  6,105,226,
+    229,238,231,225,236,105,128,  9,239,227,233,242,227,236,101,129,
+     36,104,138,180,233,238,246,229,242,243,229,243,225,238,243,243,
+    229,242,233,102,128, 39,146,228,229,246, 97,128,  9,111,231,117,
+      2,138,213,138,222,234,225,242,225,244,105,128, 10,239,242,237,
+    245,235,232,105,128, 10,111,232, 97,  2,138,238,138,249,227,235,
+    225,242,225,226,233, 99,128,  6,105,238,231,250,232,239,117,128,
+     48, 41,105,  2,139,  8,139, 26,228,229,239,231,242,225,240,232,
+    233,227,240,225,242,229,110,128, 50, 40,238,230,229,242,233,239,
+    114,128, 32,137,237,239,238,239,243,240,225,227,101,128,255, 25,
+    239,236,228,243,244,249,236,101,128,247, 57,112,  2,139, 65,139,
+     72,225,242,229,110,128, 36,124,229,114,  2,139, 79,139, 85,233,
+    239,100,128, 36,144,243,233,225,110,128,  6,249,242,239,237,225,
+    110,128, 33,120,243,245,240,229,242,233,239,114,128, 32,121,116,
+      2,139,117,139,155,229,229,110,  2,139,125,139,134,227,233,242,
+    227,236,101,128, 36,114,112,  2,139,140,139,147,225,242,229,110,
+    128, 36,134,229,242,233,239,100,128, 36,154,232,225,105,128, 14,
+     89,106,129,  1,204,139,167,229,227,249,242,233,236,236,233, 99,
+    128,  4, 90,235,225,244,225,235,225,238, 97,129, 48,243,139,192,
+    232,225,236,230,247,233,228,244,104,128,255,157,108,  2,139,210,
+    139,224,229,231,242,233,231,232,244,236,239,238,103,128,  1,158,
+    233,238,229,226,229,236,239,119,128, 30, 73,109,  2,139,241,139,
+    252,239,238,239,243,240,225,227,101,128,255, 78,243,241,245,225,
+    242,101,128, 51,154,110,  2,140, 11,140, 61, 97,  3,140, 19,140,
+     29,140, 36,226,229,238,231,225,236,105,128,  9,163,228,229,246,
+     97,128,  9, 35,231,117,  2,140, 43,140, 52,234,225,242,225,244,
+    105,128, 10,163,242,237,245,235,232,105,128, 10, 35,238,225,228,
+    229,246, 97,128,  9, 41,111,  6,140, 84,140, 95,140,120,140,161,
+    141,113,142, 40,232,233,242,225,231,225,238, 97,128, 48,110,235,
+    225,244,225,235,225,238, 97,129, 48,206,140,108,232,225,236,230,
+    247,233,228,244,104,128,255,137,110,  3,140,128,140,144,140,153,
+    226,242,229,225,235,233,238,231,243,240,225,227,101,128,  0,160,
+    229,238,244,232,225,105,128, 14, 19,245,244,232,225,105,128, 14,
+     25,239,110,  7,140,178,140,187,140,201,140,235,140,251,141, 36,
+    141, 95,225,242,225,226,233, 99,128,  6, 70,230,233,238,225,236,
+    225,242,225,226,233, 99,128,254,230,231,232,245,238,238, 97,  2,
+    140,212,140,221,225,242,225,226,233, 99,128,  6,186,230,233,238,
+    225,236,225,242,225,226,233, 99,128,251,159,233,238,233,244,233,
+    225,236,225,242,225,226,233, 99,128,254,231,234,229,229,237,105,
+      2,141,  5,141, 20,238,233,244,233,225,236,225,242,225,226,233,
+     99,128,252,210,243,239,236,225,244,229,228,225,242,225,226,233,
+     99,128,252, 75,237,101,  2,141, 43,141, 56,228,233,225,236,225,
+    242,225,226,233, 99,128,254,232,229,237,105,  2,141, 64,141, 79,
+    238,233,244,233,225,236,225,242,225,226,233, 99,128,252,213,243,
+    239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 78,238,
+    239,239,238,230,233,238,225,236,225,242,225,226,233, 99,128,252,
+    141,116,  7,141,129,141,140,141,169,141,204,141,216,141,236,142,
+      6,227,239,238,244,225,233,238,115,128, 34, 12,101,  2,141,146,
+    141,162,236,229,237,229,238,116,129, 34,  9,141,157,239,102,128,
+     34,  9,241,245,225,108,128, 34, 96,231,242,229,225,244,229,114,
+    129, 34,111,141,181,238,239,114,  2,141,189,141,197,229,241,245,
+    225,108,128, 34,113,236,229,243,115,128, 34,121,233,228,229,238,
+    244,233,227,225,108,128, 34, 98,236,229,243,115,129, 34,110,141,
+    225,238,239,242,229,241,245,225,108,128, 34,112,112,  2,141,242,
+    141,252,225,242,225,236,236,229,108,128, 34, 38,242,229,227,229,
+    228,229,115,128, 34,128,243,117,  3,142, 15,142, 22,142, 31,226,
+    243,229,116,128, 34,132,227,227,229,229,228,115,128, 34,129,240,
+    229,242,243,229,116,128, 34,133,247,225,242,237,229,238,233,225,
+    110,128,  5,118,240,225,242,229,110,128, 36,169,115,  2,142, 66,
+    142, 75,243,241,245,225,242,101,128, 51,177,245,240,229,242,233,
+    239,114,128, 32,127,244,233,236,228,101,128,  0,241,117,132,  3,
+    189,142,105,142,116,142,197,143, 24,232,233,242,225,231,225,238,
+     97,128, 48,108,107,  2,142,122,142,146,225,244,225,235,225,238,
+     97,129, 48,204,142,134,232,225,236,230,247,233,228,244,104,128,
+    255,135,244, 97,  3,142,155,142,165,142,172,226,229,238,231,225,
+    236,105,128,  9,188,228,229,246, 97,128,  9, 60,231,117,  2,142,
+    179,142,188,234,225,242,225,244,105,128, 10,188,242,237,245,235,
+    232,105,128, 10, 60,109,  2,142,203,142,237,226,229,242,243,233,
+    231,110,130,  0, 35,142,217,142,229,237,239,238,239,243,240,225,
+    227,101,128,255,  3,243,237,225,236,108,128,254, 95,229,114,  2,
+    142,244,143, 20,225,236,243,233,231,110,  2,142,255,143,  7,231,
+    242,229,229,107,128,  3,116,236,239,247,229,242,231,242,229,229,
+    107,128,  3,117,111,128, 33, 22,110,130,  5,224,143, 32,143, 52,
+    228,225,231,229,243,104,129,251, 64,143, 43,232,229,226,242,229,
+    119,128,251, 64,232,229,226,242,229,119,128,  5,224,246,243,241,
+    245,225,242,101,128, 51,181,247,243,241,245,225,242,101,128, 51,
+    187,249, 97,  3,143, 90,143,100,143,107,226,229,238,231,225,236,
+    105,128,  9,158,228,229,246, 97,128,  9, 30,231,117,  2,143,114,
+    143,123,234,225,242,225,244,105,128, 10,158,242,237,245,235,232,
+    105,128, 10, 30,111,147,  0,111,143,174,143,196,144, 18,144,188,
+    145,  4,145, 19,145, 59,145,182,145,203,145,241,145,252,146,174,
+    148,  8,148, 72,148,105,148,151,149, 24,149, 71,149, 83, 97,  2,
+    143,180,143,187,227,245,244,101,128,  0,243,238,231,244,232,225,
+    105,128, 14, 45, 98,  4,143,206,143,248,144,  1,144, 11,225,242,
+    242,229,100,130,  2,117,143,218,143,229,227,249,242,233,236,236,
+    233, 99,128,  4,233,228,233,229,242,229,243,233,243,227,249,242,
+    233,236,236,233, 99,128,  4,235,229,238,231,225,236,105,128,  9,
+    147,239,240,239,237,239,230,111,128, 49, 27,242,229,246,101,128,
+      1, 79, 99,  3,144, 26,144, 99,144,178, 97,  2,144, 32,144, 93,
+    238,228,242, 97,  3,144, 43,144, 50,144, 61,228,229,246, 97,128,
+      9, 17,231,245,234,225,242,225,244,105,128, 10,145,246,239,247,
+    229,236,243,233,231,110,  2,144, 75,144, 82,228,229,246, 97,128,
+      9, 73,231,245,234,225,242,225,244,105,128, 10,201,242,239,110,
+    128,  1,210,233,242, 99,  2,144,107,144,112,236,101,128, 36,222,
+    245,237,230,236,229,120,133,  0,244,144,131,144,139,144,150,144,
+    158,144,170,225,227,245,244,101,128, 30,209,228,239,244,226,229,
+    236,239,119,128, 30,217,231,242,225,246,101,128, 30,211,232,239,
+    239,235,225,226,239,246,101,128, 30,213,244,233,236,228,101,128,
+     30,215,249,242,233,236,236,233, 99,128,  4, 62,100,  4,144,198,
+    144,221,144,227,144,250,226,108,  2,144,205,144,213,225,227,245,
+    244,101,128,  1, 81,231,242,225,246,101,128,  2, 13,229,246, 97,
+    128,  9, 19,233,229,242,229,243,233,115,129,  0,246,144,239,227,
+    249,242,233,236,236,233, 99,128,  4,231,239,244,226,229,236,239,
+    119,128, 30,205,101,129,  1, 83,145, 10,235,239,242,229,225,110,
+    128, 49, 90,103,  3,145, 27,145, 42,145, 49,239,238,229,107,129,
+      2,219,145, 36,227,237, 98,128,  3, 40,242,225,246,101,128,  0,
+    242,245,234,225,242,225,244,105,128, 10,147,104,  4,145, 69,145,
+     80,145, 90,145,168,225,242,237,229,238,233,225,110,128,  5,133,
+    233,242,225,231,225,238, 97,128, 48, 74,111,  2,145, 96,145,106,
+    239,235,225,226,239,246,101,128, 30,207,242,110,133,  1,161,145,
+    121,145,129,145,140,145,148,145,160,225,227,245,244,101,128, 30,
+    219,228,239,244,226,229,236,239,119,128, 30,227,231,242,225,246,
+    101,128, 30,221,232,239,239,235,225,226,239,246,101,128, 30,223,
+    244,233,236,228,101,128, 30,225,245,238,231,225,242,245,237,236,
+    225,245,116,128,  1, 81,105,129,  1,163,145,188,238,246,229,242,
+    244,229,228,226,242,229,246,101,128,  2, 15,107,  2,145,209,145,
+    233,225,244,225,235,225,238, 97,129, 48,170,145,221,232,225,236,
+    230,247,233,228,244,104,128,255,117,239,242,229,225,110,128, 49,
+     87,236,229,232,229,226,242,229,119,128,  5,171,109,  6,146, 10,
+    146, 38,146, 45,146,134,146,145,146,163,225,227,242,239,110,130,
+      1, 77,146, 22,146, 30,225,227,245,244,101,128, 30, 83,231,242,
+    225,246,101,128, 30, 81,228,229,246, 97,128,  9, 80,229,231, 97,
+    133,  3,201,146, 61,146, 65,146, 76,146, 90,146,106, 49,128,  3,
+    214,227,249,242,233,236,236,233, 99,128,  4, 97,236,225,244,233,
+    238,227,236,239,243,229,100,128,  2,119,242,239,245,238,228,227,
+    249,242,233,236,236,233, 99,128,  4,123,116,  2,146,112,146,127,
+    233,244,236,239,227,249,242,233,236,236,233, 99,128,  4,125,239,
+    238,239,115,128,  3,206,231,245,234,225,242,225,244,105,128, 10,
+    208,233,227,242,239,110,129,  3,191,146,155,244,239,238,239,115,
+    128,  3,204,239,238,239,243,240,225,227,101,128,255, 79,238,101,
+    145,  0, 49,146,213,146,222,146,232,147,  6,147, 31,147, 40,147,
+     49,147, 74,147,108,147,142,147,154,147,173,147,184,147,217,147,
+    227,147,235,147,246,225,242,225,226,233, 99,128,  6, 97,226,229,
+    238,231,225,236,105,128,  9,231,227,233,242,227,236,101,129, 36,
+     96,146,243,233,238,246,229,242,243,229,243,225,238,243,243,229,
+    242,233,102,128, 39,138,100,  2,147, 12,147, 18,229,246, 97,128,
+      9,103,239,244,229,238,236,229,225,228,229,114,128, 32, 36,229,
+    233,231,232,244,104,128, 33, 91,230,233,244,244,229,100,128,246,
+    220,231,117,  2,147, 56,147, 65,234,225,242,225,244,105,128, 10,
+    231,242,237,245,235,232,105,128, 10,103,232, 97,  3,147, 83,147,
+     94,147, 99,227,235,225,242,225,226,233, 99,128,  6, 97,236,102,
+    128,  0,189,238,231,250,232,239,117,128, 48, 33,105,  2,147,114,
+    147,132,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
+    110,128, 50, 32,238,230,229,242,233,239,114,128, 32,129,237,239,
+    238,239,243,240,225,227,101,128,255, 17,238,245,237,229,242,225,
+    244,239,242,226,229,238,231,225,236,105,128,  9,244,239,236,228,
+    243,244,249,236,101,128,247, 49,112,  2,147,190,147,197,225,242,
+    229,110,128, 36,116,229,114,  2,147,204,147,210,233,239,100,128,
+     36,136,243,233,225,110,128,  6,241,241,245,225,242,244,229,114,
+    128,  0,188,242,239,237,225,110,128, 33,112,243,245,240,229,242,
+    233,239,114,128,  0,185,244,104,  2,147,253,148,  2,225,105,128,
+     14, 81,233,242,100,128, 33, 83,111,  3,148, 16,148, 50,148, 66,
+    103,  2,148, 22,148, 40,239,238,229,107,129,  1,235,148, 31,237,
+    225,227,242,239,110,128,  1,237,245,242,237,245,235,232,105,128,
+     10, 19,237,225,244,242,225,231,245,242,237,245,235,232,105,128,
+     10, 75,240,229,110,128,  2, 84,112,  3,148, 80,148, 87,148, 98,
+    225,242,229,110,128, 36,170,229,238,226,245,236,236,229,116,128,
+     37,230,244,233,239,110,128, 35, 37,114,  2,148,111,148,140,100,
+      2,148,117,148,128,230,229,237,233,238,233,238,101,128,  0,170,
+    237,225,243,227,245,236,233,238,101,128,  0,186,244,232,239,231,
+    239,238,225,108,128, 34, 31,115,  5,148,163,148,195,148,212,149,
+      1,149, 14,232,239,242,116,  2,148,172,148,179,228,229,246, 97,
+    128,  9, 18,246,239,247,229,236,243,233,231,238,228,229,246, 97,
+    128,  9, 74,236,225,243,104,129,  0,248,148,204,225,227,245,244,
+    101,128,  1,255,237,225,236,108,  2,148,221,148,232,232,233,242,
+    225,231,225,238, 97,128, 48, 73,235,225,244,225,235,225,238, 97,
+    129, 48,169,148,245,232,225,236,230,247,233,228,244,104,128,255,
+    107,244,242,239,235,229,225,227,245,244,101,128,  1,255,245,240,
+    229,242,233,239,114,128,246,240,116,  2,149, 30,149, 41,227,249,
+    242,233,236,236,233, 99,128,  4,127,233,236,228,101,130,  0,245,
+    149, 52,149, 60,225,227,245,244,101,128, 30, 77,228,233,229,242,
+    229,243,233,115,128, 30, 79,245,226,239,240,239,237,239,230,111,
+    128, 49, 33,118,  2,149, 89,149,170,229,114,  2,149, 96,149,162,
+    236,233,238,101,131, 32, 62,149,109,149,132,149,155, 99,  2,149,
+    115,149,127,229,238,244,229,242,236,233,238,101,128,254, 74,237,
+     98,128,  3,  5,100,  2,149,138,149,146,225,243,232,229,100,128,
+    254, 73,226,236,247,225,246,121,128,254, 76,247,225,246,121,128,
+    254, 75,243,227,239,242,101,128,  0,175,239,247,229,236,243,233,
+    231,110,  3,149,185,149,195,149,202,226,229,238,231,225,236,105,
+    128,  9,203,228,229,246, 97,128,  9, 75,231,245,234,225,242,225,
+    244,105,128, 10,203,112,145,  0,112,149,251,152,123,152,134,152,
+    143,152,155,154, 80,154, 90,155, 82,156,101,156,191,156,217,157,
+     92,157,100,158,  2,158, 60,158, 88,158, 98, 97, 14,150, 25,150,
+     57,150, 67,150, 74,150, 81,150,129,150,140,150,154,150,165,150,
+    212,150,226,151,238,152, 21,152,111, 97,  2,150, 31,150, 43,237,
+    240,243,243,241,245,225,242,101,128, 51,128,243,229,238,244,239,
+    243,241,245,225,242,101,128, 51, 43,226,229,238,231,225,236,105,
+    128,  9,170,227,245,244,101,128, 30, 85,228,229,246, 97,128,  9,
+     42,103,  2,150, 87,150,105,101,  2,150, 93,150,100,228,239,247,
+    110,128, 33,223,245,112,128, 33,222,117,  2,150,111,150,120,234,
+    225,242,225,244,105,128, 10,170,242,237,245,235,232,105,128, 10,
+     42,232,233,242,225,231,225,238, 97,128, 48,113,233,249,225,238,
+    238,239,233,244,232,225,105,128, 14, 47,235,225,244,225,235,225,
+    238, 97,128, 48,209,108,  2,150,171,150,196,225,244,225,236,233,
+    250,225,244,233,239,238,227,249,242,233,236,236,233,227,227,237,
+     98,128,  4,132,239,227,232,235,225,227,249,242,233,236,236,233,
+     99,128,  4,192,238,243,233,239,243,235,239,242,229,225,110,128,
+     49,127,114,  3,150,234,150,255,151,227, 97,  2,150,240,150,248,
+    231,242,225,240,104,128,  0,182,236,236,229,108,128, 34, 37,229,
+    110,  2,151,  6,151,116,236,229,230,116,136,  0, 40,151, 29,151,
+     44,151, 49,151, 54,151, 65,151, 77,151,100,151,105,225,236,244,
+    239,238,229,225,242,225,226,233, 99,128,253, 62,226,116,128,248,
+    237,229,120,128,248,236,233,238,230,229,242,233,239,114,128, 32,
+    141,237,239,238,239,243,240,225,227,101,128,255,  8,115,  2,151,
+     83,151, 90,237,225,236,108,128,254, 89,245,240,229,242,233,239,
+    114,128, 32,125,244,112,128,248,235,246,229,242,244,233,227,225,
+    108,128,254, 53,242,233,231,232,116,136,  0, 41,151,140,151,155,
+    151,160,151,165,151,176,151,188,151,211,151,216,225,236,244,239,
+    238,229,225,242,225,226,233, 99,128,253, 63,226,116,128,248,248,
+    229,120,128,248,247,233,238,230,229,242,233,239,114,128, 32,142,
+    237,239,238,239,243,240,225,227,101,128,255,  9,115,  2,151,194,
+    151,201,237,225,236,108,128,254, 90,245,240,229,242,233,239,114,
+    128, 32,126,244,112,128,248,246,246,229,242,244,233,227,225,108,
+    128,254, 54,244,233,225,236,228,233,230,102,128, 34,  2,115,  3,
+    151,246,152,  1,152, 13,229,241,232,229,226,242,229,119,128,  5,
+    192,232,244,225,232,229,226,242,229,119,128,  5,153,241,245,225,
+    242,101,128, 51,169,244,225,104,134,  5,183,152, 39,152, 53,152,
+     58,152, 67,152, 82,152, 98, 49,  2,152, 45,152, 49, 49,128,  5,
+    183,100,128,  5,183,178, 97,128,  5,183,232,229,226,242,229,119,
+    128,  5,183,238,225,242,242,239,247,232,229,226,242,229,119,128,
+      5,183,241,245,225,242,244,229,242,232,229,226,242,229,119,128,
+      5,183,247,233,228,229,232,229,226,242,229,119,128,  5,183,250,
+    229,242,232,229,226,242,229,119,128,  5,161,226,239,240,239,237,
+    239,230,111,128, 49,  6,227,233,242,227,236,101,128, 36,223,228,
+    239,244,225,227,227,229,238,116,128, 30, 87,101,137,  5,228,152,
+    177,152,188,152,208,152,220,152,240,153, 86,153, 97,153,118,154,
+     73,227,249,242,233,236,236,233, 99,128,  4, 63,228,225,231,229,
+    243,104,129,251, 68,152,199,232,229,226,242,229,119,128,251, 68,
+    229,250,233,243,241,245,225,242,101,128, 51, 59,230,233,238,225,
+    236,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 67,
+    104,  5,152,252,153, 19,153, 27,153, 41,153, 71,225,114,  2,153,
+      3,153, 10,225,226,233, 99,128,  6,126,237,229,238,233,225,110,
+    128,  5,122,229,226,242,229,119,128,  5,228,230,233,238,225,236,
+    225,242,225,226,233, 99,128,251, 87,105,  2,153, 47,153, 62,238,
+    233,244,233,225,236,225,242,225,226,233, 99,128,251, 88,242,225,
+    231,225,238, 97,128, 48,122,237,229,228,233,225,236,225,242,225,
+    226,233, 99,128,251, 89,235,225,244,225,235,225,238, 97,128, 48,
+    218,237,233,228,228,236,229,232,239,239,235,227,249,242,233,236,
+    236,233, 99,128,  4,167,114,  5,153,130,153,142,153,184,154, 49,
+    154, 62,225,230,229,232,229,226,242,229,119,128,251, 78,227,229,
+    238,116,131,  0, 37,153,155,153,164,153,176,225,242,225,226,233,
+     99,128,  6,106,237,239,238,239,243,240,225,227,101,128,255,  5,
+    243,237,225,236,108,128,254,106,105,  2,153,190,154, 31,239,100,
+    134,  0, 46,153,207,153,218,153,229,153,241,153,252,154,  8,225,
+    242,237,229,238,233,225,110,128,  5,137,227,229,238,244,229,242,
+    229,100,128,  0,183,232,225,236,230,247,233,228,244,104,128,255,
+     97,233,238,230,229,242,233,239,114,128,246,231,237,239,238,239,
+    243,240,225,227,101,128,255, 14,115,  2,154, 14,154, 21,237,225,
+    236,108,128,254, 82,245,240,229,242,233,239,114,128,246,232,243,
+    240,239,237,229,238,233,231,242,229,229,235,227,237, 98,128,  3,
+     66,240,229,238,228,233,227,245,236,225,114,128, 34,165,244,232,
+    239,245,243,225,238,100,128, 32, 48,243,229,244, 97,128, 32,167,
+    230,243,241,245,225,242,101,128, 51,138,104,  3,154, 98,154,148,
+    155, 29, 97,  3,154,106,154,116,154,123,226,229,238,231,225,236,
+    105,128,  9,171,228,229,246, 97,128,  9, 43,231,117,  2,154,130,
+    154,139,234,225,242,225,244,105,128, 10,171,242,237,245,235,232,
+    105,128, 10, 43,105,133,  3,198,154,162,154,166,154,252,155,  4,
+    155, 15, 49,128,  3,213,229,245,240,104,  4,154,179,154,214,154,
+    229,154,238, 97,  2,154,185,154,200,227,233,242,227,236,229,235,
+    239,242,229,225,110,128, 50,122,240,225,242,229,238,235,239,242,
+    229,225,110,128, 50, 26,227,233,242,227,236,229,235,239,242,229,
+    225,110,128, 50,108,235,239,242,229,225,110,128, 49, 77,240,225,
+    242,229,238,235,239,242,229,225,110,128, 50, 12,236,225,244,233,
+    110,128,  2,120,238,244,232,245,244,232,225,105,128, 14, 58,243,
+    249,237,226,239,236,231,242,229,229,107,128,  3,213,111,  3,155,
+     37,155, 42,155, 68,239,107,128,  1,165,240,104,  2,155, 49,155,
+     58,225,238,244,232,225,105,128, 14, 30,245,238,231,244,232,225,
+    105,128, 14, 28,243,225,237,240,232,225,239,244,232,225,105,128,
+     14, 32,105,133,  3,192,155, 96,156, 52,156, 63,156, 74,156, 88,
+    229,245,112,  6,155,112,155,147,155,179,155,207,155,221,156, 17,
+     97,  2,155,118,155,133,227,233,242,227,236,229,235,239,242,229,
+    225,110,128, 50,115,240,225,242,229,238,235,239,242,229,225,110,
+    128, 50, 19,227,105,  2,155,154,155,166,229,245,227,235,239,242,
+    229,225,110,128, 49,118,242,227,236,229,235,239,242,229,225,110,
+    128, 50,101,107,  2,155,185,155,199,233,249,229,239,235,235,239,
+    242,229,225,110,128, 49,114,239,242,229,225,110,128, 49, 66,240,
+    225,242,229,238,235,239,242,229,225,110,128, 50,  5,243,233,239,
+    115,  2,155,230,156,  2,107,  2,155,236,155,250,233,249,229,239,
+    235,235,239,242,229,225,110,128, 49,116,239,242,229,225,110,128,
+     49, 68,244,233,235,229,245,244,235,239,242,229,225,110,128, 49,
+    117,116,  2,156, 23,156, 38,232,233,229,245,244,232,235,239,242,
+    229,225,110,128, 49,119,233,235,229,245,244,235,239,242,229,225,
+    110,128, 49,115,232,233,242,225,231,225,238, 97,128, 48,116,235,
+    225,244,225,235,225,238, 97,128, 48,212,243,249,237,226,239,236,
+    231,242,229,229,107,128,  3,214,247,242,225,242,237,229,238,233,
+    225,110,128,  5,131,236,245,115,132,  0, 43,156,115,156,126,156,
+    135,156,168,226,229,236,239,247,227,237, 98,128,  3, 31,227,233,
+    242,227,236,101,128, 34,149,109,  2,156,141,156,148,233,238,245,
+    115,128,  0,177,111,  2,156,154,156,158,100,128,  2,214,238,239,
+    243,240,225,227,101,128,255, 11,115,  2,156,174,156,181,237,225,
+    236,108,128,254, 98,245,240,229,242,233,239,114,128, 32,122,109,
+      2,156,197,156,208,239,238,239,243,240,225,227,101,128,255, 80,
+    243,241,245,225,242,101,128, 51,216,111,  5,156,229,156,240,157,
+     51,157, 62,157, 72,232,233,242,225,231,225,238, 97,128, 48,125,
+    233,238,244,233,238,231,233,238,228,229,120,  4,157,  4,157, 16,
+    157, 28,157, 41,228,239,247,238,247,232,233,244,101,128, 38, 31,
+    236,229,230,244,247,232,233,244,101,128, 38, 28,242,233,231,232,
+    244,247,232,233,244,101,128, 38, 30,245,240,247,232,233,244,101,
+    128, 38, 29,235,225,244,225,235,225,238, 97,128, 48,221,240,236,
+    225,244,232,225,105,128, 14, 27,243,244,225,236,237,225,242,107,
+    129, 48, 18,157, 85,230,225,227,101,128, 48, 32,240,225,242,229,
+    110,128, 36,171,114,  3,157,108,157,134,157,159,101,  2,157,114,
+    157,122,227,229,228,229,115,128, 34,122,243,227,242,233,240,244,
+    233,239,110,128, 33, 30,233,237,101,  2,157,142,157,148,237,239,
+    100,128,  2,185,242,229,246,229,242,243,229,100,128, 32, 53,111,
+      4,157,169,157,176,157,186,157,199,228,245,227,116,128, 34, 15,
+    234,229,227,244,233,246,101,128, 35,  5,236,239,238,231,229,228,
+    235,225,238, 97,128, 48,252,112,  2,157,205,157,242,101,  2,157,
+    211,157,218,236,236,239,114,128, 35, 24,242,243,117,  2,157,226,
+    157,233,226,243,229,116,128, 34,130,240,229,242,243,229,116,128,
+     34,131,239,242,244,233,239,110,129, 34, 55,157,253,225,108,128,
+     34, 29,115,  2,158,  8,158, 51,105,130,  3,200,158, 16,158, 27,
+    227,249,242,233,236,236,233, 99,128,  4,113,236,233,240,238,229,
+    245,237,225,244,225,227,249,242,233,236,236,233,227,227,237, 98,
+    128,  4,134,243,241,245,225,242,101,128, 51,176,117,  2,158, 66,
+    158, 77,232,233,242,225,231,225,238, 97,128, 48,119,235,225,244,
+    225,235,225,238, 97,128, 48,215,246,243,241,245,225,242,101,128,
+     51,180,247,243,241,245,225,242,101,128, 51,186,113,136,  0,113,
+    158,128,159,177,159,188,159,197,159,204,159,216,159,254,160,  6,
+     97,  4,158,138,158,161,158,225,159,160,100,  2,158,144,158,150,
+    229,246, 97,128,  9, 88,237,225,232,229,226,242,229,119,128,  5,
+    168,102,  4,158,171,158,180,158,194,158,210,225,242,225,226,233,
+     99,128,  6, 66,230,233,238,225,236,225,242,225,226,233, 99,128,
+    254,214,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,
+    254,215,237,229,228,233,225,236,225,242,225,226,233, 99,128,254,
+    216,237,225,244,115,136,  5,184,158,248,159, 12,159, 26,159, 31,
+    159, 36,159, 45,159, 60,159,147, 49,  3,159,  0,159,  4,159,  8,
+     48,128,  5,184, 97,128,  5,184, 99,128,  5,184, 50,  2,159, 18,
+    159, 22, 55,128,  5,184, 57,128,  5,184,179, 51,128,  5,184,228,
+    101,128,  5,184,232,229,226,242,229,119,128,  5,184,238,225,242,
+    242,239,247,232,229,226,242,229,119,128,  5,184,113,  2,159, 66,
+    159,132,225,244,225,110,  4,159, 79,159, 88,159,103,159,119,232,
+    229,226,242,229,119,128,  5,184,238,225,242,242,239,247,232,229,
+    226,242,229,119,128,  5,184,241,245,225,242,244,229,242,232,229,
+    226,242,229,119,128,  5,184,247,233,228,229,232,229,226,242,229,
+    119,128,  5,184,245,225,242,244,229,242,232,229,226,242,229,119,
+    128,  5,184,247,233,228,229,232,229,226,242,229,119,128,  5,184,
+    242,238,229,249,240,225,242,225,232,229,226,242,229,119,128,  5,
+    159,226,239,240,239,237,239,230,111,128, 49, 17,227,233,242,227,
+    236,101,128, 36,224,232,239,239,107,128,  2,160,237,239,238,239,
+    243,240,225,227,101,128,255, 81,239,102,130,  5,231,159,225,159,
+    245,228,225,231,229,243,104,129,251, 71,159,236,232,229,226,242,
+    229,119,128,251, 71,232,229,226,242,229,119,128,  5,231,240,225,
+    242,229,110,128, 36,172,117,  4,160, 16,160, 28,160,117,160,204,
+    225,242,244,229,242,238,239,244,101,128, 38,105,226,245,244,115,
+    135,  5,187,160, 49,160, 54,160, 59,160, 64,160, 73,160, 88,160,
+    104,177, 56,128,  5,187,178, 53,128,  5,187,179, 49,128,  5,187,
+    232,229,226,242,229,119,128,  5,187,238,225,242,242,239,247,232,
+    229,226,242,229,119,128,  5,187,241,245,225,242,244,229,242,232,
+    229,226,242,229,119,128,  5,187,247,233,228,229,232,229,226,242,
+    229,119,128,  5,187,229,243,244,233,239,110,133,  0, 63,160,136,
+    160,159,160,176,160,184,160,196,225,114,  2,160,143,160,150,225,
+    226,233, 99,128,  6, 31,237,229,238,233,225,110,128,  5, 94,228,
+    239,247,110,129,  0,191,160,168,243,237,225,236,108,128,247,191,
+    231,242,229,229,107,128,  3,126,237,239,238,239,243,240,225,227,
+    101,128,255, 31,243,237,225,236,108,128,247, 63,239,244,101,  4,
+    160,216,161, 31,161, 51,161, 80,228,226,108,133,  0, 34,160,232,
+    160,239,160,246,161,  2,161, 23,226,225,243,101,128, 32, 30,236,
+    229,230,116,128, 32, 28,237,239,238,239,243,240,225,227,101,128,
+    255,  2,240,242,233,237,101,129, 48, 30,161, 12,242,229,246,229,
+    242,243,229,100,128, 48, 29,242,233,231,232,116,128, 32, 29,236,
+    229,230,116,129, 32, 24,161, 40,242,229,246,229,242,243,229,100,
+    128, 32, 27,114,  2,161, 57,161, 67,229,246,229,242,243,229,100,
+    128, 32, 27,233,231,232,116,129, 32, 25,161, 76,110,128,  1, 73,
+    243,233,238,231,108,  2,161, 90,161, 97,226,225,243,101,128, 32,
+     26,101,129,  0, 39,161,103,237,239,238,239,243,240,225,227,101,
+    128,255,  7,114,145,  0,114,161,153,162,157,162,168,162,215,163,
+     10,164, 27,164, 51,164,146,166,180,166,217,166,229,167, 27,167,
+     35,167,197,167,208,167,243,168, 87, 97, 11,161,177,161,188,161,
+    198,161,205,162, 14,162, 30,162, 55,162, 66,162, 91,162,114,162,
+    151,225,242,237,229,238,233,225,110,128,  5,124,226,229,238,231,
+    225,236,105,128,  9,176,227,245,244,101,128,  1, 85,100,  4,161,
+    215,161,221,161,235,162,  5,229,246, 97,128,  9, 48,233,227,225,
+    108,129, 34, 26,161,230,229,120,128,248,229,239,246,229,242,243,
+    243,241,245,225,242,101,129, 51,174,161,251,228,243,241,245,225,
+    242,101,128, 51,175,243,241,245,225,242,101,128, 51,173,230,101,
+    129,  5,191,162, 21,232,229,226,242,229,119,128,  5,191,231,117,
+      2,162, 37,162, 46,234,225,242,225,244,105,128, 10,176,242,237,
+    245,235,232,105,128, 10, 48,232,233,242,225,231,225,238, 97,128,
+     48,137,235,225,244,225,235,225,238, 97,129, 48,233,162, 79,232,
+    225,236,230,247,233,228,244,104,128,255,151,236,239,247,229,242,
+    228,233,225,231,239,238,225,236,226,229,238,231,225,236,105,128,
+      9,241,109,  2,162,120,162,143,233,228,228,236,229,228,233,225,
+    231,239,238,225,236,226,229,238,231,225,236,105,128,  9,240,243,
+    232,239,242,110,128,  2,100,244,233,111,128, 34, 54,226,239,240,
+    239,237,239,230,111,128, 49, 22, 99,  4,162,178,162,185,162,194,
+    162,202,225,242,239,110,128,  1, 89,229,228,233,236,236, 97,128,
+      1, 87,233,242,227,236,101,128, 36,225,239,237,237,225,225,227,
+    227,229,238,116,128,  1, 87,100,  2,162,221,162,231,226,236,231,
+    242,225,246,101,128,  2, 17,239,116,  2,162,238,162,247,225,227,
+    227,229,238,116,128, 30, 89,226,229,236,239,119,129, 30, 91,163,
+      1,237,225,227,242,239,110,128, 30, 93,101,  6,163, 24,163, 69,
+    163,104,163,159,163,184,163,217,102,  2,163, 30,163, 43,229,242,
+    229,238,227,229,237,225,242,107,128, 32, 59,236,229,248,243,117,
+      2,163, 53,163, 60,226,243,229,116,128, 34,134,240,229,242,243,
+    229,116,128, 34,135,231,233,243,244,229,114,  2,163, 80,163, 85,
+    229,100,128,  0,174,115,  2,163, 91,163, 97,225,238,115,128,248,
+    232,229,242,233,102,128,246,218,104,  3,163,112,163,135,163,149,
+    225,114,  2,163,119,163,126,225,226,233, 99,128,  6, 49,237,229,
+    238,233,225,110,128,  5,128,230,233,238,225,236,225,242,225,226,
+    233, 99,128,254,174,233,242,225,231,225,238, 97,128, 48,140,235,
+    225,244,225,235,225,238, 97,129, 48,236,163,172,232,225,236,230,
+    247,233,228,244,104,128,255,154,243,104,130,  5,232,163,193,163,
+    208,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 72,
+    232,229,226,242,229,119,128,  5,232,118,  3,163,225,163,238,164,
+     14,229,242,243,229,228,244,233,236,228,101,128, 34, 61,233, 97,
+      2,163,245,163,254,232,229,226,242,229,119,128,  5,151,237,245,
+    231,242,225,243,232,232,229,226,242,229,119,128,  5,151,236,239,
+    231,233,227,225,236,238,239,116,128, 35, 16,230,233,243,232,232,
+    239,239,107,129,  2,126,164, 40,242,229,246,229,242,243,229,100,
+    128,  2,127,104,  2,164, 57,164, 80, 97,  2,164, 63,164, 73,226,
+    229,238,231,225,236,105,128,  9,221,228,229,246, 97,128,  9, 93,
+    111,131,  3,193,164, 90,164,119,164,133,239,107,129,  2,125,164,
+     97,244,245,242,238,229,100,129,  2,123,164,108,243,245,240,229,
+    242,233,239,114,128,  2,181,243,249,237,226,239,236,231,242,229,
+    229,107,128,  3,241,244,233,227,232,239,239,235,237,239,100,128,
+      2,222,105,  6,164,160,165,204,165,250,166,  5,166, 30,166,166,
+    229,245,108,  9,164,182,164,217,164,232,164,246,165, 36,165, 50,
+    165,136,165,149,165,184, 97,  2,164,188,164,203,227,233,242,227,
+    236,229,235,239,242,229,225,110,128, 50,113,240,225,242,229,238,
+    235,239,242,229,225,110,128, 50, 17,227,233,242,227,236,229,235,
+    239,242,229,225,110,128, 50, 99,232,233,229,245,232,235,239,242,
+    229,225,110,128, 49, 64,107,  2,164,252,165, 28,233,249,229,239,
+    107,  2,165,  6,165, 15,235,239,242,229,225,110,128, 49, 58,243,
+    233,239,243,235,239,242,229,225,110,128, 49,105,239,242,229,225,
+    110,128, 49, 57,237,233,229,245,237,235,239,242,229,225,110,128,
+     49, 59,112,  3,165, 58,165, 90,165,105, 97,  2,165, 64,165, 78,
+    238,243,233,239,243,235,239,242,229,225,110,128, 49,108,242,229,
+    238,235,239,242,229,225,110,128, 50,  3,232,233,229,245,240,232,
+    235,239,242,229,225,110,128, 49, 63,233,229,245,112,  2,165,114,
+    165,123,235,239,242,229,225,110,128, 49, 60,243,233,239,243,235,
+    239,242,229,225,110,128, 49,107,243,233,239,243,235,239,242,229,
+    225,110,128, 49, 61,116,  2,165,155,165,170,232,233,229,245,244,
+    232,235,239,242,229,225,110,128, 49, 62,233,235,229,245,244,235,
+    239,242,229,225,110,128, 49,106,249,229,239,242,233,238,232,233,
+    229,245,232,235,239,242,229,225,110,128, 49,109,231,232,116,  2,
+    165,212,165,220,225,238,231,236,101,128, 34, 31,116,  2,165,226,
+    165,240,225,227,235,226,229,236,239,247,227,237, 98,128,  3, 25,
+    242,233,225,238,231,236,101,128, 34,191,232,233,242,225,231,225,
+    238, 97,128, 48,138,235,225,244,225,235,225,238, 97,129, 48,234,
+    166, 18,232,225,236,230,247,233,228,244,104,128,255,152,110,  2,
+    166, 36,166,152,103,131,  2,218,166, 46,166, 57,166, 63,226,229,
+    236,239,247,227,237, 98,128,  3, 37,227,237, 98,128,  3, 10,232,
+    225,236,102,  2,166, 72,166,118,236,229,230,116,131,  2,191,166,
+     85,166, 96,166,107,225,242,237,229,238,233,225,110,128,  5, 89,
+    226,229,236,239,247,227,237, 98,128,  3, 28,227,229,238,244,229,
+    242,229,100,128,  2,211,242,233,231,232,116,130,  2,190,166,130,
+    166,141,226,229,236,239,247,227,237, 98,128,  3, 57,227,229,238,
+    244,229,242,229,100,128,  2,210,246,229,242,244,229,228,226,242,
+    229,246,101,128,  2, 19,244,244,239,242,245,243,241,245,225,242,
+    101,128, 51, 81,108,  2,166,186,166,197,233,238,229,226,229,236,
+    239,119,128, 30, 95,239,238,231,236,229,103,129,  2,124,166,208,
+    244,245,242,238,229,100,128,  2,122,237,239,238,239,243,240,225,
+    227,101,128,255, 82,111,  3,166,237,166,248,167, 17,232,233,242,
+    225,231,225,238, 97,128, 48,141,235,225,244,225,235,225,238, 97,
+    129, 48,237,167,  5,232,225,236,230,247,233,228,244,104,128,255,
+    155,242,245,225,244,232,225,105,128, 14, 35,240,225,242,229,110,
+    128, 36,173,114,  3,167, 43,167, 79,167,109, 97,  3,167, 51,167,
+     61,167, 68,226,229,238,231,225,236,105,128,  9,220,228,229,246,
+     97,128,  9, 49,231,245,242,237,245,235,232,105,128, 10, 92,229,
+    104,  2,167, 86,167, 95,225,242,225,226,233, 99,128,  6,145,230,
+    233,238,225,236,225,242,225,226,233, 99,128,251,141,246,239,227,
+    225,236,233, 99,  4,167,125,167,135,167,142,167,153,226,229,238,
+    231,225,236,105,128,  9,224,228,229,246, 97,128,  9, 96,231,245,
+    234,225,242,225,244,105,128, 10,224,246,239,247,229,236,243,233,
+    231,110,  3,167,169,167,179,167,186,226,229,238,231,225,236,105,
+    128,  9,196,228,229,246, 97,128,  9, 68,231,245,234,225,242,225,
+    244,105,128, 10,196,243,245,240,229,242,233,239,114,128,246,241,
+    116,  2,167,214,167,222,226,236,239,227,107,128, 37,144,245,242,
+    238,229,100,129,  2,121,167,232,243,245,240,229,242,233,239,114,
+    128,  2,180,117,  4,167,253,168,  8,168, 33,168, 80,232,233,242,
+    225,231,225,238, 97,128, 48,139,235,225,244,225,235,225,238, 97,
+    129, 48,235,168, 21,232,225,236,230,247,233,228,244,104,128,255,
+    153,112,  2,168, 39,168, 74,229,101,  2,168, 46,168, 60,237,225,
+    242,235,226,229,238,231,225,236,105,128,  9,242,243,233,231,238,
+    226,229,238,231,225,236,105,128,  9,243,233,225,104,128,246,221,
+    244,232,225,105,128, 14, 36,246,239,227,225,236,233, 99,  4,168,
+    103,168,113,168,120,168,131,226,229,238,231,225,236,105,128,  9,
+    139,228,229,246, 97,128,  9, 11,231,245,234,225,242,225,244,105,
+    128, 10,139,246,239,247,229,236,243,233,231,110,  3,168,147,168,
+    157,168,164,226,229,238,231,225,236,105,128,  9,195,228,229,246,
+     97,128,  9, 67,231,245,234,225,242,225,244,105,128, 10,195,115,
+    147,  0,115,168,217,170,187,170,198,171, 68,171,107,174, 49,174,
+     60,176,203,179, 85,179,131,179,158,180, 93,180,160,181,193,181,
+    203,182,133,182,206,183,120,183,130, 97,  9,168,237,168,247,169,
+     12,169, 84,169,109,169,120,169,145,169,177,169,217,226,229,238,
+    231,225,236,105,128,  9,184,227,245,244,101,129,  1, 91,169,  0,
+    228,239,244,225,227,227,229,238,116,128, 30,101,100,  5,169, 24,
+    169, 33,169, 39,169, 53,169, 69,225,242,225,226,233, 99,128,  6,
+     53,229,246, 97,128,  9, 56,230,233,238,225,236,225,242,225,226,
+    233, 99,128,254,186,233,238,233,244,233,225,236,225,242,225,226,
+    233, 99,128,254,187,237,229,228,233,225,236,225,242,225,226,233,
+     99,128,254,188,231,117,  2,169, 91,169,100,234,225,242,225,244,
+    105,128, 10,184,242,237,245,235,232,105,128, 10, 56,232,233,242,
+    225,231,225,238, 97,128, 48, 85,235,225,244,225,235,225,238, 97,
+    129, 48,181,169,133,232,225,236,230,247,233,228,244,104,128,255,
+    123,236,236,225,236,236,225,232,239,245,225,236,225,249,232,229,
+    247,225,243,225,236,236,225,237,225,242,225,226,233, 99,128,253,
+    250,237,229,235,104,130,  5,225,169,188,169,208,228,225,231,229,
+    243,104,129,251, 65,169,199,232,229,226,242,229,119,128,251, 65,
+    232,229,226,242,229,119,128,  5,225,242, 97,  5,169,230,170, 48,
+    170, 56,170,106,170,114, 97,  5,169,242,169,250,170,  2,170, 33,
+    170, 41,225,244,232,225,105,128, 14, 50,229,244,232,225,105,128,
+     14, 65,233,237,225,233,109,  2,170, 12,170, 23,225,236,225,233,
+    244,232,225,105,128, 14, 68,245,225,238,244,232,225,105,128, 14,
+     67,237,244,232,225,105,128, 14, 51,244,232,225,105,128, 14, 48,
+    229,244,232,225,105,128, 14, 64,105,  3,170, 64,170, 88,170, 99,
+    105,  2,170, 70,170, 81,236,229,230,244,244,232,225,105,128,248,
+    134,244,232,225,105,128, 14, 53,236,229,230,244,244,232,225,105,
+    128,248,133,244,232,225,105,128, 14, 52,239,244,232,225,105,128,
+     14, 66,117,  3,170,122,170,172,170,179,101,  3,170,130,170,154,
+    170,165,101,  2,170,136,170,147,236,229,230,244,244,232,225,105,
+    128,248,136,244,232,225,105,128, 14, 55,236,229,230,244,244,232,
+    225,105,128,248,135,244,232,225,105,128, 14, 54,244,232,225,105,
+    128, 14, 56,245,244,232,225,105,128, 14, 57,226,239,240,239,237,
+    239,230,111,128, 49, 25, 99,  5,170,210,170,231,170,240,171, 33,
+    171, 55,225,242,239,110,129,  1, 97,170,219,228,239,244,225,227,
+    227,229,238,116,128, 30,103,229,228,233,236,236, 97,128,  1, 95,
+    232,247, 97,131,  2, 89,170,252,171,  7,171, 26,227,249,242,233,
+    236,236,233, 99,128,  4,217,228,233,229,242,229,243,233,243,227,
+    249,242,233,236,236,233, 99,128,  4,219,232,239,239,107,128,  2,
+     90,233,242, 99,  2,171, 41,171, 46,236,101,128, 36,226,245,237,
+    230,236,229,120,128,  1, 93,239,237,237,225,225,227,227,229,238,
+    116,128,  2, 25,228,239,116,  2,171, 76,171, 85,225,227,227,229,
+    238,116,128, 30, 97,226,229,236,239,119,129, 30, 99,171, 95,228,
+    239,244,225,227,227,229,238,116,128, 30,105,101,  9,171,127,171,
+    143,171,178,171,243,172, 90,172,117,172,142,172,223,172,250,225,
+    231,245,236,236,226,229,236,239,247,227,237, 98,128,  3, 60, 99,
+      2,171,149,171,171,239,238,100,129, 32, 51,171,157,244,239,238,
+    229,227,232,233,238,229,243,101,128,  2,202,244,233,239,110,128,
+      0,167,229,110,  4,171,189,171,198,171,212,171,228,225,242,225,
+    226,233, 99,128,  6, 51,230,233,238,225,236,225,242,225,226,233,
+     99,128,254,178,233,238,233,244,233,225,236,225,242,225,226,233,
+     99,128,254,179,237,229,228,233,225,236,225,242,225,226,233, 99,
+    128,254,180,231,239,108,135,  5,182,172,  7,172, 21,172, 26,172,
+     35,172, 50,172, 66,172, 77, 49,  2,172, 13,172, 17, 51,128,  5,
+    182,102,128,  5,182,178, 99,128,  5,182,232,229,226,242,229,119,
+    128,  5,182,238,225,242,242,239,247,232,229,226,242,229,119,128,
+      5,182,241,245,225,242,244,229,242,232,229,226,242,229,119,128,
+      5,182,244,225,232,229,226,242,229,119,128,  5,146,247,233,228,
+    229,232,229,226,242,229,119,128,  5,182,104,  2,172, 96,172,107,
+    225,242,237,229,238,233,225,110,128,  5,125,233,242,225,231,225,
+    238, 97,128, 48, 91,235,225,244,225,235,225,238, 97,129, 48,187,
+    172,130,232,225,236,230,247,233,228,244,104,128,255,126,237,105,
+      2,172,149,172,192,227,239,236,239,110,131,  0, 59,172,163,172,
+    172,172,184,225,242,225,226,233, 99,128,  6, 27,237,239,238,239,
+    243,240,225,227,101,128,255, 27,243,237,225,236,108,128,254, 84,
+    246,239,233,227,229,228,237,225,242,235,235,225,238, 97,129, 48,
+    156,172,211,232,225,236,230,247,233,228,244,104,128,255,159,238,
+    116,  2,172,230,172,240,233,243,241,245,225,242,101,128, 51, 34,
+    239,243,241,245,225,242,101,128, 51, 35,246,229,110,142,  0, 55,
+    173, 28,173, 37,173, 47,173, 77,173, 84,173, 94,173,119,173,146,
+    173,180,173,192,173,203,173,236,173,244,173,255,225,242,225,226,
+    233, 99,128,  6,103,226,229,238,231,225,236,105,128,  9,237,227,
+    233,242,227,236,101,129, 36,102,173, 58,233,238,246,229,242,243,
+    229,243,225,238,243,243,229,242,233,102,128, 39,144,228,229,246,
+     97,128,  9,109,229,233,231,232,244,232,115,128, 33, 94,231,117,
+      2,173,101,173,110,234,225,242,225,244,105,128, 10,237,242,237,
+    245,235,232,105,128, 10,109,232, 97,  2,173,126,173,137,227,235,
+    225,242,225,226,233, 99,128,  6,103,238,231,250,232,239,117,128,
+     48, 39,105,  2,173,152,173,170,228,229,239,231,242,225,240,232,
+    233,227,240,225,242,229,110,128, 50, 38,238,230,229,242,233,239,
+    114,128, 32,135,237,239,238,239,243,240,225,227,101,128,255, 23,
+    239,236,228,243,244,249,236,101,128,247, 55,112,  2,173,209,173,
+    216,225,242,229,110,128, 36,122,229,114,  2,173,223,173,229,233,
+    239,100,128, 36,142,243,233,225,110,128,  6,247,242,239,237,225,
+    110,128, 33,118,243,245,240,229,242,233,239,114,128, 32,119,116,
+      2,174,  5,174, 43,229,229,110,  2,174, 13,174, 22,227,233,242,
+    227,236,101,128, 36,112,112,  2,174, 28,174, 35,225,242,229,110,
+    128, 36,132,229,242,233,239,100,128, 36,152,232,225,105,128, 14,
+     87,230,244,232,249,240,232,229,110,128,  0,173,104,  7,174, 76,
+    175, 50,175, 61,175, 75,176, 20,176, 33,176,197, 97,  6,174, 90,
+    174,101,174,111,174,122,175,  9,175, 34,225,242,237,229,238,233,
+    225,110,128,  5,119,226,229,238,231,225,236,105,128,  9,182,227,
+    249,242,233,236,236,233, 99,128,  4, 72,100,  2,174,128,174,224,
+    228, 97,  4,174,139,174,148,174,179,174,193,225,242,225,226,233,
+     99,128,  6, 81,228,225,237,237, 97,  2,174,158,174,167,225,242,
+    225,226,233, 99,128,252, 97,244,225,238,225,242,225,226,233, 99,
+    128,252, 94,230,225,244,232,225,225,242,225,226,233, 99,128,252,
+     96,235,225,243,242, 97,  2,174,203,174,212,225,242,225,226,233,
+     99,128,252, 98,244,225,238,225,242,225,226,233, 99,128,252, 95,
+    101,132, 37,146,174,236,174,243,174,251,175,  4,228,225,242,107,
+    128, 37,147,236,233,231,232,116,128, 37,145,237,229,228,233,245,
+    109,128, 37,146,246, 97,128,  9, 54,231,117,  2,175, 16,175, 25,
+    234,225,242,225,244,105,128, 10,182,242,237,245,235,232,105,128,
+     10, 54,236,243,232,229,236,229,244,232,229,226,242,229,119,128,
+      5,147,226,239,240,239,237,239,230,111,128, 49, 21,227,232,225,
+    227,249,242,233,236,236,233, 99,128,  4, 73,101,  4,175, 85,175,
+    150,175,160,175,177,229,110,  4,175, 96,175,105,175,119,175,135,
+    225,242,225,226,233, 99,128,  6, 52,230,233,238,225,236,225,242,
+    225,226,233, 99,128,254,182,233,238,233,244,233,225,236,225,242,
+    225,226,233, 99,128,254,183,237,229,228,233,225,236,225,242,225,
+    226,233, 99,128,254,184,233,227,239,240,244,233, 99,128,  3,227,
+    241,229,108,129, 32,170,175,168,232,229,226,242,229,119,128, 32,
+    170,246, 97,134,  5,176,175,194,175,209,175,223,175,232,175,247,
+    176,  7, 49,  2,175,200,175,205,177, 53,128,  5,176, 53,128,  5,
+    176, 50,  2,175,215,175,219, 50,128,  5,176,101,128,  5,176,232,
+    229,226,242,229,119,128,  5,176,238,225,242,242,239,247,232,229,
+    226,242,229,119,128,  5,176,241,245,225,242,244,229,242,232,229,
+    226,242,229,119,128,  5,176,247,233,228,229,232,229,226,242,229,
+    119,128,  5,176,232,225,227,249,242,233,236,236,233, 99,128,  4,
+    187,105,  2,176, 39,176, 50,237,225,227,239,240,244,233, 99,128,
+      3,237,110,131,  5,233,176, 60,176,143,176,152,100,  2,176, 66,
+    176,132,225,231,229,243,104,130,251, 73,176, 78,176, 87,232,229,
+    226,242,229,119,128,251, 73,115,  2,176, 93,176,113,232,233,238,
+    228,239,116,129,251, 44,176,104,232,229,226,242,229,119,128,251,
+     44,233,238,228,239,116,129,251, 45,176,123,232,229,226,242,229,
+    119,128,251, 45,239,244,232,229,226,242,229,119,128,  5,193,232,
+    229,226,242,229,119,128,  5,233,115,  2,176,158,176,178,232,233,
+    238,228,239,116,129,251, 42,176,169,232,229,226,242,229,119,128,
+    251, 42,233,238,228,239,116,129,251, 43,176,188,232,229,226,242,
+    229,119,128,251, 43,239,239,107,128,  2,130,105,  8,176,221,177,
+      9,177, 20,177, 45,177, 75,177, 83,177, 96,178, 11,231,237, 97,
+    131,  3,195,176,233,176,237,176,245, 49,128,  3,194,230,233,238,
+    225,108,128,  3,194,236,245,238,225,244,229,243,249,237,226,239,
+    236,231,242,229,229,107,128,  3,242,232,233,242,225,231,225,238,
+     97,128, 48, 87,235,225,244,225,235,225,238, 97,129, 48,183,177,
+     33,232,225,236,230,247,233,228,244,104,128,255,124,236,245,113,
+      2,177, 53,177, 62,232,229,226,242,229,119,128,  5,189,236,229,
+    230,244,232,229,226,242,229,119,128,  5,189,237,233,236,225,114,
+    128, 34, 60,238,228,239,244,232,229,226,242,229,119,128,  5,194,
+    239,115,  6,177,111,177,146,177,178,177,206,177,220,177,252, 97,
+      2,177,117,177,132,227,233,242,227,236,229,235,239,242,229,225,
+    110,128, 50,116,240,225,242,229,238,235,239,242,229,225,110,128,
+     50, 20,227,105,  2,177,153,177,165,229,245,227,235,239,242,229,
+    225,110,128, 49,126,242,227,236,229,235,239,242,229,225,110,128,
+     50,102,107,  2,177,184,177,198,233,249,229,239,235,235,239,242,
+    229,225,110,128, 49,122,239,242,229,225,110,128, 49, 69,238,233,
+    229,245,238,235,239,242,229,225,110,128, 49,123,112,  2,177,226,
+    177,239,225,242,229,238,235,239,242,229,225,110,128, 50,  6,233,
+    229,245,240,235,239,242,229,225,110,128, 49,125,244,233,235,229,
+    245,244,235,239,242,229,225,110,128, 49,124,120,141,  0, 54,178,
+     41,178, 50,178, 60,178, 90,178, 97,178,122,178,149,178,183,178,
+    195,178,206,178,239,178,247,179,  2,225,242,225,226,233, 99,128,
+      6,102,226,229,238,231,225,236,105,128,  9,236,227,233,242,227,
+    236,101,129, 36,101,178, 71,233,238,246,229,242,243,229,243,225,
+    238,243,243,229,242,233,102,128, 39,143,228,229,246, 97,128,  9,
+    108,231,117,  2,178,104,178,113,234,225,242,225,244,105,128, 10,
+    236,242,237,245,235,232,105,128, 10,108,232, 97,  2,178,129,178,
+    140,227,235,225,242,225,226,233, 99,128,  6,102,238,231,250,232,
+    239,117,128, 48, 38,105,  2,178,155,178,173,228,229,239,231,242,
+    225,240,232,233,227,240,225,242,229,110,128, 50, 37,238,230,229,
+    242,233,239,114,128, 32,134,237,239,238,239,243,240,225,227,101,
+    128,255, 22,239,236,228,243,244,249,236,101,128,247, 54,112,  2,
+    178,212,178,219,225,242,229,110,128, 36,121,229,114,  2,178,226,
+    178,232,233,239,100,128, 36,141,243,233,225,110,128,  6,246,242,
+    239,237,225,110,128, 33,117,243,245,240,229,242,233,239,114,128,
+     32,118,116,  2,179,  8,179, 79,229,229,110,  2,179, 16,179, 58,
+     99,  2,179, 22,179, 30,233,242,227,236,101,128, 36,111,245,242,
+    242,229,238,227,249,228,229,238,239,237,233,238,225,244,239,242,
+    226,229,238,231,225,236,105,128,  9,249,112,  2,179, 64,179, 71,
+    225,242,229,110,128, 36,131,229,242,233,239,100,128, 36,151,232,
+    225,105,128, 14, 86,108,  2,179, 91,179,111,225,243,104,129,  0,
+     47,179, 99,237,239,238,239,243,240,225,227,101,128,255, 15,239,
+    238,103,129,  1,127,179,119,228,239,244,225,227,227,229,238,116,
+    128, 30,155,109,  2,179,137,179,147,233,236,229,230,225,227,101,
+    128, 38, 58,239,238,239,243,240,225,227,101,128,255, 83,111,  6,
+    179,172,179,222,179,233,180,  2,180, 47,180, 58,102,  2,179,178,
+    179,192,240,225,243,245,241,232,229,226,242,229,119,128,  5,195,
+    116,  2,179,198,179,207,232,249,240,232,229,110,128,  0,173,243,
+    233,231,238,227,249,242,233,236,236,233, 99,128,  4, 76,232,233,
+    242,225,231,225,238, 97,128, 48, 93,235,225,244,225,235,225,238,
+     97,129, 48,189,179,246,232,225,236,230,247,233,228,244,104,128,
+    255,127,236,233,228,245,115,  2,180, 12,180, 29,236,239,238,231,
+    239,246,229,242,236,225,249,227,237, 98,128,  3, 56,243,232,239,
+    242,244,239,246,229,242,236,225,249,227,237, 98,128,  3, 55,242,
+    245,243,233,244,232,225,105,128, 14, 41,115,  3,180, 66,180, 76,
+    180, 84,225,236,225,244,232,225,105,128, 14, 40,239,244,232,225,
+    105,128, 14, 11,245,225,244,232,225,105,128, 14, 42,240, 97,  3,
+    180,102,180,122,180,154,227,101,129,  0, 32,180,109,232,225,227,
+    235,225,242,225,226,233, 99,128,  0, 32,228,101,129, 38, 96,180,
+    129,243,245,233,116,  2,180,138,180,146,226,236,225,227,107,128,
+     38, 96,247,232,233,244,101,128, 38,100,242,229,110,128, 36,174,
+    241,245,225,242,101, 11,180,188,180,199,180,213,180,238,180,255,
+    181, 25,181, 40,181, 73,181,100,181,156,181,171,226,229,236,239,
+    247,227,237, 98,128,  3, 59, 99,  2,180,205,180,209, 99,128, 51,
+    196,109,128, 51,157,228,233,225,231,239,238,225,236,227,242,239,
+    243,243,232,225,244,227,232,230,233,236,108,128, 37,169,232,239,
+    242,233,250,239,238,244,225,236,230,233,236,108,128, 37,164,107,
+      2,181,  5,181,  9,103,128, 51,143,109,129, 51,158,181, 15,227,
+    225,240,233,244,225,108,128, 51,206,108,  2,181, 31,181, 35,110,
+    128, 51,209,239,103,128, 51,210,109,  4,181, 50,181, 54,181, 59,
+    181, 63,103,128, 51,142,233,108,128, 51,213,109,128, 51,156,243,
+    241,245,225,242,229,100,128, 51,161,239,242,244,232,239,231,239,
+    238,225,236,227,242,239,243,243,232,225,244,227,232,230,233,236,
+    108,128, 37,166,245,240,240,229,114,  2,181,110,181,133,236,229,
+    230,244,244,239,236,239,247,229,242,242,233,231,232,244,230,233,
+    236,108,128, 37,167,242,233,231,232,244,244,239,236,239,247,229,
+    242,236,229,230,244,230,233,236,108,128, 37,168,246,229,242,244,
+    233,227,225,236,230,233,236,108,128, 37,165,247,232,233,244,229,
+    247,233,244,232,243,237,225,236,236,226,236,225,227,107,128, 37,
+    163,242,243,241,245,225,242,101,128, 51,219,115,  2,181,209,182,
+    123, 97,  4,181,219,181,229,181,236,181,247,226,229,238,231,225,
+    236,105,128,  9,183,228,229,246, 97,128,  9, 55,231,245,234,225,
+    242,225,244,105,128, 10,183,238,103,  8,182, 10,182, 24,182, 38,
+    182, 52,182, 67,182, 81,182, 95,182,108,227,233,229,245,227,235,
+    239,242,229,225,110,128, 49, 73,232,233,229,245,232,235,239,242,
+    229,225,110,128, 49,133,233,229,245,238,231,235,239,242,229,225,
+    110,128, 49,128,235,233,249,229,239,235,235,239,242,229,225,110,
+    128, 49, 50,238,233,229,245,238,235,239,242,229,225,110,128, 49,
+    101,240,233,229,245,240,235,239,242,229,225,110,128, 49, 67,243,
+    233,239,243,235,239,242,229,225,110,128, 49, 70,244,233,235,229,
+    245,244,235,239,242,229,225,110,128, 49, 56,245,240,229,242,233,
+    239,114,128,246,242,116,  2,182,139,182,162,229,242,236,233,238,
+    103,129,  0,163,182,150,237,239,238,239,243,240,225,227,101,128,
+    255,225,242,239,235,101,  2,182,171,182,188,236,239,238,231,239,
+    246,229,242,236,225,249,227,237, 98,128,  3, 54,243,232,239,242,
+    244,239,246,229,242,236,225,249,227,237, 98,128,  3, 53,117,  7,
+    182,222,182,254,183, 20,183, 31,183, 72,183, 82,183, 86,226,243,
+    229,116,130, 34,130,182,233,182,244,238,239,244,229,241,245,225,
+    108,128, 34,138,239,242,229,241,245,225,108,128, 34,134, 99,  2,
+    183,  4,183, 12,227,229,229,228,115,128, 34,123,232,244,232,225,
+    116,128, 34, 11,232,233,242,225,231,225,238, 97,128, 48, 89,107,
+      2,183, 37,183, 61,225,244,225,235,225,238, 97,129, 48,185,183,
+     49,232,225,236,230,247,233,228,244,104,128,255,125,245,238,225,
+    242,225,226,233, 99,128,  6, 82,237,237,225,244,233,239,110,128,
+     34, 17,110,128, 38, 60,240,229,242,243,229,116,130, 34,131,183,
+     99,183,110,238,239,244,229,241,245,225,108,128, 34,139,239,242,
+    229,241,245,225,108,128, 34,135,246,243,241,245,225,242,101,128,
+     51,220,249,239,245,247,225,229,242,225,243,241,245,225,242,101,
+    128, 51,124,116,144,  0,116,183,183,184,192,184,213,185,100,185,
+    140,187,188,191, 70,192,145,192,157,192,169,193,202,193,227,194,
+     57,194,237,195,165,195,255, 97, 10,183,205,183,215,183,236,183,
+    243,184, 12,184, 90,184,107,184,132,184,146,184,150,226,229,238,
+    231,225,236,105,128,  9,164,227,107,  2,183,222,183,229,228,239,
+    247,110,128, 34,164,236,229,230,116,128, 34,163,228,229,246, 97,
+    128,  9, 36,231,117,  2,183,250,184,  3,234,225,242,225,244,105,
+    128, 10,164,242,237,245,235,232,105,128, 10, 36,104,  4,184, 22,
+    184, 31,184, 45,184, 75,225,242,225,226,233, 99,128,  6, 55,230,
+    233,238,225,236,225,242,225,226,233, 99,128,254,194,105,  2,184,
+     51,184, 66,238,233,244,233,225,236,225,242,225,226,233, 99,128,
+    254,195,242,225,231,225,238, 97,128, 48, 95,237,229,228,233,225,
+    236,225,242,225,226,233, 99,128,254,196,233,243,249,239,245,229,
+    242,225,243,241,245,225,242,101,128, 51,125,235,225,244,225,235,
+    225,238, 97,129, 48,191,184,120,232,225,236,230,247,233,228,244,
+    104,128,255,128,244,247,229,229,236,225,242,225,226,233, 99,128,
+      6, 64,117,128,  3,196,118,130,  5,234,184,158,184,183,228,225,
+    231,229,115,129,251, 74,184,168,104,129,251, 74,184,174,232,229,
+    226,242,229,119,128,251, 74,232,229,226,242,229,119,128,  5,234,
+     98,  2,184,198,184,203,225,114,128,  1,103,239,240,239,237,239,
+    230,111,128, 49, 10, 99,  6,184,227,184,234,184,241,184,250,185,
+     60,185, 87,225,242,239,110,128,  1,101,227,245,242,108,128,  2,
+    168,229,228,233,236,236, 97,128,  1, 99,232,229,104,  4,185,  6,
+    185, 15,185, 29,185, 45,225,242,225,226,233, 99,128,  6,134,230,
+    233,238,225,236,225,242,225,226,233, 99,128,251,123,233,238,233,
+    244,233,225,236,225,242,225,226,233, 99,128,251,124,237,229,228,
+    233,225,236,225,242,225,226,233, 99,128,251,125,233,242, 99,  2,
+    185, 68,185, 73,236,101,128, 36,227,245,237,230,236,229,248,226,
+    229,236,239,119,128, 30,113,239,237,237,225,225,227,227,229,238,
+    116,128,  1, 99,100,  2,185,106,185,116,233,229,242,229,243,233,
+    115,128, 30,151,239,116,  2,185,123,185,132,225,227,227,229,238,
+    116,128, 30,107,226,229,236,239,119,128, 30,109,101,  9,185,160,
+    185,171,185,191,186,201,186,226,187, 34,187,101,187,106,187,158,
+    227,249,242,233,236,236,233, 99,128,  4, 66,228,229,243,227,229,
+    238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,173,104,
+      7,185,207,185,216,185,230,186, 14,186, 44,186, 85,186,183,225,
+    242,225,226,233, 99,128,  6, 42,230,233,238,225,236,225,242,225,
+    226,233, 99,128,254,150,232,225,232,105,  2,185,239,185,254,238,
+    233,244,233,225,236,225,242,225,226,233, 99,128,252,162,243,239,
+    236,225,244,229,228,225,242,225,226,233, 99,128,252, 12,105,  2,
+    186, 20,186, 35,238,233,244,233,225,236,225,242,225,226,233, 99,
+    128,254,151,242,225,231,225,238, 97,128, 48,102,234,229,229,237,
+    105,  2,186, 54,186, 69,238,233,244,233,225,236,225,242,225,226,
+    233, 99,128,252,161,243,239,236,225,244,229,228,225,242,225,226,
+    233, 99,128,252, 11,109,  2,186, 91,186,125,225,242,226,245,244,
+     97,  2,186,102,186,111,225,242,225,226,233, 99,128,  6, 41,230,
+    233,238,225,236,225,242,225,226,233, 99,128,254,148,101,  2,186,
+    131,186,144,228,233,225,236,225,242,225,226,233, 99,128,254,152,
+    229,237,105,  2,186,152,186,167,238,233,244,233,225,236,225,242,
+    225,226,233, 99,128,252,164,243,239,236,225,244,229,228,225,242,
+    225,226,233, 99,128,252, 14,238,239,239,238,230,233,238,225,236,
+    225,242,225,226,233, 99,128,252,115,235,225,244,225,235,225,238,
+     97,129, 48,198,186,214,232,225,236,230,247,233,228,244,104,128,
+    255,131,108,  2,186,232,186,251,229,240,232,239,238,101,129, 33,
+     33,186,243,226,236,225,227,107,128, 38, 14,233,243,232, 97,  2,
+    187,  4,187, 19,231,229,228,239,236,225,232,229,226,242,229,119,
+    128,  5,160,241,229,244,225,238,225,232,229,226,242,229,119,128,
+      5,169,110,  4,187, 44,187, 53,187, 72,187, 93,227,233,242,227,
+    236,101,128, 36,105,233,228,229,239,231,242,225,240,232,233,227,
+    240,225,242,229,110,128, 50, 41,112,  2,187, 78,187, 85,225,242,
+    229,110,128, 36,125,229,242,233,239,100,128, 36,145,242,239,237,
+    225,110,128, 33,121,243,104,128,  2,167,116,131,  5,216,187,116,
+    187,136,187,145,228,225,231,229,243,104,129,251, 56,187,127,232,
+    229,226,242,229,119,128,251, 56,232,229,226,242,229,119,128,  5,
+    216,243,229,227,249,242,233,236,236,233, 99,128,  4,181,246,233,
+    114,  2,187,166,187,175,232,229,226,242,229,119,128,  5,155,236,
+    229,230,244,232,229,226,242,229,119,128,  5,155,104,  6,187,202,
+    188, 98,188,220,189, 96,190,  3,191, 60, 97,  5,187,214,187,224,
+    187,231,188,  0,188, 29,226,229,238,231,225,236,105,128,  9,165,
+    228,229,246, 97,128,  9, 37,231,117,  2,187,238,187,247,234,225,
+    242,225,244,105,128, 10,165,242,237,245,235,232,105,128, 10, 37,
+    108,  2,188,  6,188, 15,225,242,225,226,233, 99,128,  6, 48,230,
+    233,238,225,236,225,242,225,226,233, 99,128,254,172,238,244,232,
+    225,235,232,225,116,  3,188, 44,188, 75,188, 82,236,239,119,  2,
+    188, 52,188, 63,236,229,230,244,244,232,225,105,128,248,152,242,
+    233,231,232,244,244,232,225,105,128,248,151,244,232,225,105,128,
+     14, 76,245,240,240,229,242,236,229,230,244,244,232,225,105,128,
+    248,150,101,  3,188,106,188,170,188,193,104,  4,188,116,188,125,
+    188,139,188,155,225,242,225,226,233, 99,128,  6, 43,230,233,238,
+    225,236,225,242,225,226,233, 99,128,254,154,233,238,233,244,233,
+    225,236,225,242,225,226,233, 99,128,254,155,237,229,228,233,225,
+    236,225,242,225,226,233, 99,128,254,156,242,101,  2,188,177,188,
+    186,229,248,233,243,244,115,128, 34,  3,230,239,242,101,128, 34,
+     52,244, 97,130,  3,184,188,202,188,206, 49,128,  3,209,243,249,
+    237,226,239,236,231,242,229,229,107,128,  3,209,105,  2,188,226,
+    189, 56,229,245,244,104,  4,188,239,189, 18,189, 33,189, 42, 97,
+      2,188,245,189,  4,227,233,242,227,236,229,235,239,242,229,225,
+    110,128, 50,121,240,225,242,229,238,235,239,242,229,225,110,128,
+     50, 25,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,
+    107,235,239,242,229,225,110,128, 49, 76,240,225,242,229,238,235,
+    239,242,229,225,110,128, 50, 11,242,244,229,229,110,  2,189, 66,
+    189, 75,227,233,242,227,236,101,128, 36,108,112,  2,189, 81,189,
+     88,225,242,229,110,128, 36,128,229,242,233,239,100,128, 36,148,
+    111,  6,189,110,189,127,189,132,189,146,189,151,189,204,238,225,
+    238,231,237,239,238,244,232,239,244,232,225,105,128, 14, 17,239,
+    107,128,  1,173,240,232,245,244,232,225,239,244,232,225,105,128,
+     14, 18,242,110,128,  0,254,244,104,  3,189,160,189,184,189,194,
+     97,  2,189,166,189,176,232,225,238,244,232,225,105,128, 14, 23,
+    238,244,232,225,105,128, 14, 16,239,238,231,244,232,225,105,128,
+     14, 24,245,238,231,244,232,225,105,128, 14, 22,245,243,225,238,
+    100,  2,189,214,189,225,227,249,242,233,236,236,233, 99,128,  4,
+    130,243,243,229,240,225,242,225,244,239,114,  2,189,240,189,249,
+    225,242,225,226,233, 99,128,  6,108,240,229,242,243,233,225,110,
+    128,  6,108,242,229,101,144,  0, 51,190, 41,190, 50,190, 60,190,
+     90,190, 97,190,107,190,132,190,159,190,193,190,205,190,224,190,
+    235,191, 12,191, 34,191, 42,191, 53,225,242,225,226,233, 99,128,
+      6, 99,226,229,238,231,225,236,105,128,  9,233,227,233,242,227,
+    236,101,129, 36, 98,190, 71,233,238,246,229,242,243,229,243,225,
+    238,243,243,229,242,233,102,128, 39,140,228,229,246, 97,128,  9,
+    105,229,233,231,232,244,232,115,128, 33, 92,231,117,  2,190,114,
+    190,123,234,225,242,225,244,105,128, 10,233,242,237,245,235,232,
+    105,128, 10,105,232, 97,  2,190,139,190,150,227,235,225,242,225,
+    226,233, 99,128,  6, 99,238,231,250,232,239,117,128, 48, 35,105,
+      2,190,165,190,183,228,229,239,231,242,225,240,232,233,227,240,
+    225,242,229,110,128, 50, 34,238,230,229,242,233,239,114,128, 32,
+    131,237,239,238,239,243,240,225,227,101,128,255, 19,238,245,237,
+    229,242,225,244,239,242,226,229,238,231,225,236,105,128,  9,246,
+    239,236,228,243,244,249,236,101,128,247, 51,112,  2,190,241,190,
+    248,225,242,229,110,128, 36,118,229,114,  2,190,255,191,  5,233,
+    239,100,128, 36,138,243,233,225,110,128,  6,243,241,245,225,242,
+    244,229,242,115,129,  0,190,191, 25,229,237,228,225,243,104,128,
+    246,222,242,239,237,225,110,128, 33,114,243,245,240,229,242,233,
+    239,114,128,  0,179,244,232,225,105,128, 14, 83,250,243,241,245,
+    225,242,101,128, 51,148,105,  7,191, 86,191, 97,191,212,192, 54,
+    192, 66,192,115,192,132,232,233,242,225,231,225,238, 97,128, 48,
+     97,107,  2,191,103,191,127,225,244,225,235,225,238, 97,129, 48,
+    193,191,115,232,225,236,230,247,233,228,244,104,128,255,129,229,
+    245,116,  4,191,139,191,174,191,189,191,198, 97,  2,191,145,191,
+    160,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,112,
+    240,225,242,229,238,235,239,242,229,225,110,128, 50, 16,227,233,
+    242,227,236,229,235,239,242,229,225,110,128, 50, 98,235,239,242,
+    229,225,110,128, 49, 55,240,225,242,229,238,235,239,242,229,225,
+    110,128, 50,  2,236,228,101,133,  2,220,191,228,191,239,192,  0,
+    192, 12,192, 40,226,229,236,239,247,227,237, 98,128,  3, 48, 99,
+      2,191,245,191,250,237, 98,128,  3,  3,239,237, 98,128,  3,  3,
+    228,239,245,226,236,229,227,237, 98,128,  3, 96,111,  2,192, 18,
+    192, 28,240,229,242,225,244,239,114,128, 34, 60,246,229,242,236,
+    225,249,227,237, 98,128,  3, 52,246,229,242,244,233,227,225,236,
+    227,237, 98,128,  3, 62,237,229,243,227,233,242,227,236,101,128,
+     34,151,112,  2,192, 72,192,102,229,232, 97,  2,192, 80,192, 89,
+    232,229,226,242,229,119,128,  5,150,236,229,230,244,232,229,226,
+    242,229,119,128,  5,150,240,233,231,245,242,237,245,235,232,105,
+    128, 10,112,244,236,239,227,249,242,233,236,236,233,227,227,237,
+     98,128,  4,131,247,238,225,242,237,229,238,233,225,110,128,  5,
+    127,236,233,238,229,226,229,236,239,119,128, 30,111,237,239,238,
+    239,243,240,225,227,101,128,255, 84,111,  7,192,185,192,196,192,
+    207,192,232,193, 96,193,108,193,192,225,242,237,229,238,233,225,
+    110,128,  5,105,232,233,242,225,231,225,238, 97,128, 48,104,235,
+    225,244,225,235,225,238, 97,129, 48,200,192,220,232,225,236,230,
+    247,233,228,244,104,128,255,132,110,  3,192,240,193, 82,193, 87,
+    101,  4,192,250,193, 63,193, 70,193, 76,226,225,114,  4,193,  6,
+    193, 35,193, 45,193, 54,229,248,244,242, 97,  2,193, 16,193, 26,
+    232,233,231,232,237,239,100,128,  2,229,236,239,247,237,239,100,
+    128,  2,233,232,233,231,232,237,239,100,128,  2,230,236,239,247,
+    237,239,100,128,  2,232,237,233,228,237,239,100,128,  2,231,230,
+    233,246,101,128,  1,189,243,233,120,128,  1,133,244,247,111,128,
+      1,168,239,115,128,  3,132,243,241,245,225,242,101,128, 51, 39,
+    240,225,244,225,235,244,232,225,105,128, 14, 15,242,244,239,233,
+    243,229,243,232,229,236,236,226,242,225,227,235,229,116,  2,193,
+    131,193,161,236,229,230,116,130, 48, 20,193,142,193,150,243,237,
+    225,236,108,128,254, 93,246,229,242,244,233,227,225,108,128,254,
+     57,242,233,231,232,116,130, 48, 21,193,173,193,181,243,237,225,
+    236,108,128,254, 94,246,229,242,244,233,227,225,108,128,254, 58,
+    244,225,239,244,232,225,105,128, 14, 21,240, 97,  2,193,209,193,
+    221,236,225,244,225,236,232,239,239,107,128,  1,171,242,229,110,
+    128, 36,175,114,  3,193,235,194, 10,194, 25,225,228,229,237,225,
+    242,107,129, 33, 34,193,247,115,  2,193,253,194,  3,225,238,115,
+    128,248,234,229,242,233,102,128,246,219,229,244,242,239,230,236,
+    229,248,232,239,239,107,128,  2,136,233,225,103,  4,194, 37,194,
+     42,194, 47,194, 52,228,110,128, 37,188,236,102,128, 37,196,242,
+    116,128, 37,186,245,112,128, 37,178,115,132,  2,166,194, 69,194,
+    108,194,214,194,227,225,228,105,130,  5,230,194, 79,194, 99,228,
+    225,231,229,243,104,129,251, 70,194, 90,232,229,226,242,229,119,
+    128,251, 70,232,229,226,242,229,119,128,  5,230,101,  2,194,114,
+    194,125,227,249,242,233,236,236,233, 99,128,  4, 70,242,101,134,
+      5,181,194,142,194,156,194,161,194,170,194,185,194,201, 49,  2,
+    194,148,194,152, 50,128,  5,181,101,128,  5,181,178, 98,128,  5,
+    181,232,229,226,242,229,119,128,  5,181,238,225,242,242,239,247,
+    232,229,226,242,229,119,128,  5,181,241,245,225,242,244,229,242,
+    232,229,226,242,229,119,128,  5,181,247,233,228,229,232,229,226,
+    242,229,119,128,  5,181,232,229,227,249,242,233,236,236,233, 99,
+    128,  4, 91,245,240,229,242,233,239,114,128,246,243,116,  4,194,
+    247,195, 41,195,106,195,157, 97,  3,194,255,195,  9,195, 16,226,
+    229,238,231,225,236,105,128,  9,159,228,229,246, 97,128,  9, 31,
+    231,117,  2,195, 23,195, 32,234,225,242,225,244,105,128, 10,159,
+    242,237,245,235,232,105,128, 10, 31,229,104,  4,195, 52,195, 61,
+    195, 75,195, 91,225,242,225,226,233, 99,128,  6,121,230,233,238,
+    225,236,225,242,225,226,233, 99,128,251,103,233,238,233,244,233,
+    225,236,225,242,225,226,233, 99,128,251,104,237,229,228,233,225,
+    236,225,242,225,226,233, 99,128,251,105,232, 97,  3,195,115,195,
+    125,195,132,226,229,238,231,225,236,105,128,  9,160,228,229,246,
+     97,128,  9, 32,231,117,  2,195,139,195,148,234,225,242,225,244,
+    105,128, 10,160,242,237,245,235,232,105,128, 10, 32,245,242,238,
+    229,100,128,  2,135,117,  3,195,173,195,184,195,209,232,233,242,
+    225,231,225,238, 97,128, 48,100,235,225,244,225,235,225,238, 97,
+    129, 48,196,195,197,232,225,236,230,247,233,228,244,104,128,255,
+    130,243,237,225,236,108,  2,195,219,195,230,232,233,242,225,231,
+    225,238, 97,128, 48, 99,235,225,244,225,235,225,238, 97,129, 48,
+    195,195,243,232,225,236,230,247,233,228,244,104,128,255,111,119,
+      2,196,  5,196,110,101,  2,196, 11,196, 59,236,246,101,  3,196,
+     21,196, 30,196, 51,227,233,242,227,236,101,128, 36,107,112,  2,
+    196, 36,196, 43,225,242,229,110,128, 36,127,229,242,233,239,100,
+    128, 36,147,242,239,237,225,110,128, 33,123,238,244,121,  3,196,
+     69,196, 78,196, 89,227,233,242,227,236,101,128, 36,115,232,225,
+    238,231,250,232,239,117,128, 83, 68,112,  2,196, 95,196,102,225,
+    242,229,110,128, 36,135,229,242,233,239,100,128, 36,155,111,142,
+      0, 50,196,142,196,151,196,161,196,191,196,243,197, 12,197, 39,
+    197, 73,197, 85,197,104,197,115,197,148,197,156,197,180,225,242,
+    225,226,233, 99,128,  6, 98,226,229,238,231,225,236,105,128,  9,
+    232,227,233,242,227,236,101,129, 36, 97,196,172,233,238,246,229,
+    242,243,229,243,225,238,243,243,229,242,233,102,128, 39,139,100,
+      2,196,197,196,203,229,246, 97,128,  9,104,239,116,  2,196,210,
+    196,221,229,238,236,229,225,228,229,114,128, 32, 37,236,229,225,
+    228,229,114,129, 32, 37,196,232,246,229,242,244,233,227,225,108,
+    128,254, 48,231,117,  2,196,250,197,  3,234,225,242,225,244,105,
+    128, 10,232,242,237,245,235,232,105,128, 10,104,232, 97,  2,197,
+     19,197, 30,227,235,225,242,225,226,233, 99,128,  6, 98,238,231,
+    250,232,239,117,128, 48, 34,105,  2,197, 45,197, 63,228,229,239,
+    231,242,225,240,232,233,227,240,225,242,229,110,128, 50, 33,238,
+    230,229,242,233,239,114,128, 32,130,237,239,238,239,243,240,225,
+    227,101,128,255, 18,238,245,237,229,242,225,244,239,242,226,229,
+    238,231,225,236,105,128,  9,245,239,236,228,243,244,249,236,101,
+    128,247, 50,112,  2,197,121,197,128,225,242,229,110,128, 36,117,
+    229,114,  2,197,135,197,141,233,239,100,128, 36,137,243,233,225,
+    110,128,  6,242,242,239,237,225,110,128, 33,113,115,  2,197,162,
+    197,170,244,242,239,235,101,128,  1,187,245,240,229,242,233,239,
+    114,128,  0,178,244,104,  2,197,187,197,192,225,105,128, 14, 82,
+    233,242,228,115,128, 33, 84,117,145,  0,117,197,237,197,245,198,
+     30,198, 87,198,225,199,  6,199,129,199,145,199,196,200, 10,200,
+     91,200,100,200,219,200,243,201, 95,201,123,201,237,225,227,245,
+    244,101,128,  0,250, 98,  4,197,255,198,  4,198, 13,198, 23,225,
+    114,128,  2,137,229,238,231,225,236,105,128,  9,137,239,240,239,
+    237,239,230,111,128, 49, 40,242,229,246,101,128,  1,109, 99,  3,
+    198, 38,198, 45,198, 77,225,242,239,110,128,  1,212,233,242, 99,
+      2,198, 53,198, 58,236,101,128, 36,228,245,237,230,236,229,120,
+    129,  0,251,198, 69,226,229,236,239,119,128, 30,119,249,242,233,
+    236,236,233, 99,128,  4, 67,100,  5,198, 99,198,110,198,133,198,
+    139,198,215,225,244,244,225,228,229,246, 97,128,  9, 81,226,108,
+      2,198,117,198,125,225,227,245,244,101,128,  1,113,231,242,225,
+    246,101,128,  2, 21,229,246, 97,128,  9,  9,233,229,242,229,243,
+    233,115,133,  0,252,198,159,198,167,198,175,198,198,198,206,225,
+    227,245,244,101,128,  1,216,226,229,236,239,119,128, 30,115, 99,
+      2,198,181,198,188,225,242,239,110,128,  1,218,249,242,233,236,
+    236,233, 99,128,  4,241,231,242,225,246,101,128,  1,220,237,225,
+    227,242,239,110,128,  1,214,239,244,226,229,236,239,119,128, 30,
+    229,103,  2,198,231,198,238,242,225,246,101,128,  0,249,117,  2,
+    198,244,198,253,234,225,242,225,244,105,128, 10,137,242,237,245,
+    235,232,105,128, 10,  9,104,  3,199, 14,199, 24,199,102,233,242,
+    225,231,225,238, 97,128, 48, 70,111,  2,199, 30,199, 40,239,235,
+    225,226,239,246,101,128, 30,231,242,110,133,  1,176,199, 55,199,
+     63,199, 74,199, 82,199, 94,225,227,245,244,101,128, 30,233,228,
+    239,244,226,229,236,239,119,128, 30,241,231,242,225,246,101,128,
+     30,235,232,239,239,235,225,226,239,246,101,128, 30,237,244,233,
+    236,228,101,128, 30,239,245,238,231,225,242,245,237,236,225,245,
+    116,129,  1,113,199,118,227,249,242,233,236,236,233, 99,128,  4,
+    243,233,238,246,229,242,244,229,228,226,242,229,246,101,128,  2,
+     23,107,  3,199,153,199,177,199,188,225,244,225,235,225,238, 97,
+    129, 48,166,199,165,232,225,236,230,247,233,228,244,104,128,255,
+    115,227,249,242,233,236,236,233, 99,128,  4,121,239,242,229,225,
+    110,128, 49, 92,109,  2,199,202,199,255, 97,  2,199,208,199,241,
+    227,242,239,110,130,  1,107,199,219,199,230,227,249,242,233,236,
+    236,233, 99,128,  4,239,228,233,229,242,229,243,233,115,128, 30,
+    123,244,242,225,231,245,242,237,245,235,232,105,128, 10, 65,239,
+    238,239,243,240,225,227,101,128,255, 85,110,  2,200, 16,200, 71,
+    228,229,242,243,227,239,242,101,132,  0, 95,200, 35,200, 41,200,
+     53,200, 64,228,226,108,128, 32, 23,237,239,238,239,243,240,225,
+    227,101,128,255, 63,246,229,242,244,233,227,225,108,128,254, 51,
+    247,225,246,121,128,254, 79,105,  2,200, 77,200, 82,239,110,128,
+     34, 42,246,229,242,243,225,108,128, 34,  0,239,231,239,238,229,
+    107,128,  1,115,112,  5,200,112,200,119,200,127,200,142,200,193,
+    225,242,229,110,128, 36,176,226,236,239,227,107,128, 37,128,240,
+    229,242,228,239,244,232,229,226,242,229,119,128,  5,196,243,233,
+    236,239,110,131,  3,197,200,156,200,177,200,185,228,233,229,242,
+    229,243,233,115,129,  3,203,200,169,244,239,238,239,115,128,  3,
+    176,236,225,244,233,110,128,  2,138,244,239,238,239,115,128,  3,
+    205,244,225,227,107,  2,200,202,200,213,226,229,236,239,247,227,
+    237, 98,128,  3, 29,237,239,100,128,  2,212,114,  2,200,225,200,
+    237,225,231,245,242,237,245,235,232,105,128, 10,115,233,238,103,
+    128,  1,111,115,  3,200,251,201, 10,201, 55,232,239,242,244,227,
+    249,242,233,236,236,233, 99,128,  4, 94,237,225,236,108,  2,201,
+     19,201, 30,232,233,242,225,231,225,238, 97,128, 48, 69,235,225,
+    244,225,235,225,238, 97,129, 48,165,201, 43,232,225,236,230,247,
+    233,228,244,104,128,255,105,244,242,225,233,231,232,116,  2,201,
+     67,201, 78,227,249,242,233,236,236,233, 99,128,  4,175,243,244,
+    242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,177,244,
+    233,236,228,101,130,  1,105,201,107,201,115,225,227,245,244,101,
+    128, 30,121,226,229,236,239,119,128, 30,117,117,  5,201,135,201,
+    145,201,152,201,177,201,193,226,229,238,231,225,236,105,128,  9,
+    138,228,229,246, 97,128,  9, 10,231,117,  2,201,159,201,168,234,
+    225,242,225,244,105,128, 10,138,242,237,245,235,232,105,128, 10,
+     10,237,225,244,242,225,231,245,242,237,245,235,232,105,128, 10,
+     66,246,239,247,229,236,243,233,231,110,  3,201,209,201,219,201,
+    226,226,229,238,231,225,236,105,128,  9,194,228,229,246, 97,128,
+      9, 66,231,245,234,225,242,225,244,105,128, 10,194,246,239,247,
+    229,236,243,233,231,110,  3,201,253,202,  7,202, 14,226,229,238,
+    231,225,236,105,128,  9,193,228,229,246, 97,128,  9, 65,231,245,
+    234,225,242,225,244,105,128, 10,193,118,139,  0,118,202, 51,202,
+    199,202,208,202,219,203,148,203,155,203,253,204,  9,204,109,204,
+    117,204,138, 97,  4,202, 61,202, 68,202, 93,202,104,228,229,246,
+     97,128,  9, 53,231,117,  2,202, 75,202, 84,234,225,242,225,244,
+    105,128, 10,181,242,237,245,235,232,105,128, 10, 53,235,225,244,
+    225,235,225,238, 97,128, 48,247,118,132,  5,213,202,116,202,143,
+    202,175,202,187,228,225,231,229,243,104,130,251, 53,202,129,202,
+    134,182, 53,128,251, 53,232,229,226,242,229,119,128,251, 53,104,
+      2,202,149,202,157,229,226,242,229,119,128,  5,213,239,236,225,
+    109,129,251, 75,202,166,232,229,226,242,229,119,128,251, 75,246,
+    225,246,232,229,226,242,229,119,128,  5,240,249,239,228,232,229,
+    226,242,229,119,128,  5,241,227,233,242,227,236,101,128, 36,229,
+    228,239,244,226,229,236,239,119,128, 30,127,101,  6,202,233,202,
+    244,203, 52,203, 63,203, 69,203,136,227,249,242,233,236,236,233,
+     99,128,  4, 50,104,  4,202,254,203,  7,203, 21,203, 37,225,242,
+    225,226,233, 99,128,  6,164,230,233,238,225,236,225,242,225,226,
+    233, 99,128,251,107,233,238,233,244,233,225,236,225,242,225,226,
+    233, 99,128,251,108,237,229,228,233,225,236,225,242,225,226,233,
+     99,128,251,109,235,225,244,225,235,225,238, 97,128, 48,249,238,
+    245,115,128, 38, 64,242,244,233,227,225,108,  2,203, 80,203, 86,
+    226,225,114,128,  0,124,236,233,238,101,  4,203, 99,203,110,203,
+    121,203,130,225,226,239,246,229,227,237, 98,128,  3, 13,226,229,
+    236,239,247,227,237, 98,128,  3, 41,236,239,247,237,239,100,128,
+      2,204,237,239,100,128,  2,200,247,225,242,237,229,238,233,225,
+    110,128,  5,126,232,239,239,107,128,  2,139,105,  3,203,163,203,
+    174,203,213,235,225,244,225,235,225,238, 97,128, 48,248,242,225,
+    237, 97,  3,203,185,203,195,203,202,226,229,238,231,225,236,105,
+    128,  9,205,228,229,246, 97,128,  9, 77,231,245,234,225,242,225,
+    244,105,128, 10,205,243,225,242,231, 97,  3,203,225,203,235,203,
+    242,226,229,238,231,225,236,105,128,  9,131,228,229,246, 97,128,
+      9,  3,231,245,234,225,242,225,244,105,128, 10,131,237,239,238,
+    239,243,240,225,227,101,128,255, 86,111,  3,204, 17,204, 28,204,
+     98,225,242,237,229,238,233,225,110,128,  5,120,233,227,229,100,
+      2,204, 37,204, 73,233,244,229,242,225,244,233,239,110,  2,204,
+     51,204, 62,232,233,242,225,231,225,238, 97,128, 48,158,235,225,
+    244,225,235,225,238, 97,128, 48,254,237,225,242,235,235,225,238,
+     97,129, 48,155,204, 86,232,225,236,230,247,233,228,244,104,128,
+    255,158,235,225,244,225,235,225,238, 97,128, 48,250,240,225,242,
+    229,110,128, 36,177,116,  2,204,123,204,130,233,236,228,101,128,
+     30,125,245,242,238,229,100,128,  2,140,117,  2,204,144,204,155,
+    232,233,242,225,231,225,238, 97,128, 48,148,235,225,244,225,235,
+    225,238, 97,128, 48,244,119,143,  0,119,204,200,205,177,205,187,
+    205,210,205,250,206, 61,206, 69,208, 40,208, 81,208, 93,208,168,
+    208,176,208,183,208,194,208,203, 97,  8,204,218,204,225,204,235,
+    204,246,205, 28,205, 60,205, 72,205,108,227,245,244,101,128, 30,
+    131,229,235,239,242,229,225,110,128, 49, 89,232,233,242,225,231,
+    225,238, 97,128, 48,143,107,  2,204,252,205, 20,225,244,225,235,
+    225,238, 97,129, 48,239,205,  8,232,225,236,230,247,233,228,244,
+    104,128,255,156,239,242,229,225,110,128, 49, 88,243,237,225,236,
+    108,  2,205, 38,205, 49,232,233,242,225,231,225,238, 97,128, 48,
+    142,235,225,244,225,235,225,238, 97,128, 48,238,244,244,239,243,
+    241,245,225,242,101,128, 51, 87,118,  2,205, 78,205, 86,229,228,
+    225,243,104,128, 48, 28,249,245,238,228,229,242,243,227,239,242,
+    229,246,229,242,244,233,227,225,108,128,254, 52,119,  3,205,116,
+    205,125,205,139,225,242,225,226,233, 99,128,  6, 72,230,233,238,
+    225,236,225,242,225,226,233, 99,128,254,238,232,225,237,250,225,
+    225,226,239,246,101,  2,205,154,205,163,225,242,225,226,233, 99,
+    128,  6, 36,230,233,238,225,236,225,242,225,226,233, 99,128,254,
+    134,226,243,241,245,225,242,101,128, 51,221,227,233,242, 99,  2,
+    205,196,205,201,236,101,128, 36,230,245,237,230,236,229,120,128,
+      1,117,100,  2,205,216,205,226,233,229,242,229,243,233,115,128,
+     30,133,239,116,  2,205,233,205,242,225,227,227,229,238,116,128,
+     30,135,226,229,236,239,119,128, 30,137,101,  4,206,  4,206, 15,
+    206, 27,206, 51,232,233,242,225,231,225,238, 97,128, 48,145,233,
+    229,242,243,244,242,225,243,115,128, 33, 24,107,  2,206, 33,206,
+     43,225,244,225,235,225,238, 97,128, 48,241,239,242,229,225,110,
+    128, 49, 94,239,235,239,242,229,225,110,128, 49, 93,231,242,225,
+    246,101,128, 30,129,232,233,244,101,  8,206, 90,206, 99,206,183,
+    207, 17,207,101,207,146,207,198,207,254,226,245,236,236,229,116,
+    128, 37,230, 99,  2,206,105,206,125,233,242,227,236,101,129, 37,
+    203,206,115,233,238,246,229,242,243,101,128, 37,217,239,242,238,
+    229,242,226,242,225,227,235,229,116,  2,206,142,206,162,236,229,
+    230,116,129, 48, 14,206,151,246,229,242,244,233,227,225,108,128,
+    254, 67,242,233,231,232,116,129, 48, 15,206,172,246,229,242,244,
+    233,227,225,108,128,254, 68,100,  2,206,189,206,230,233,225,237,
+    239,238,100,129, 37,199,206,200,227,239,238,244,225,233,238,233,
+    238,231,226,236,225,227,235,243,237,225,236,236,228,233,225,237,
+    239,238,100,128, 37,200,239,247,238,240,239,233,238,244,233,238,
+    103,  2,206,246,207,  6,243,237,225,236,236,244,242,233,225,238,
+    231,236,101,128, 37,191,244,242,233,225,238,231,236,101,128, 37,
+    189,236,101,  2,207, 24,207, 66,230,244,240,239,233,238,244,233,
+    238,103,  2,207, 39,207, 55,243,237,225,236,236,244,242,233,225,
+    238,231,236,101,128, 37,195,244,242,233,225,238,231,236,101,128,
+     37,193,238,244,233,227,245,236,225,242,226,242,225,227,235,229,
+    116,  2,207, 86,207, 93,236,229,230,116,128, 48, 22,242,233,231,
+    232,116,128, 48, 23,242,233,231,232,244,240,239,233,238,244,233,
+    238,103,  2,207,119,207,135,243,237,225,236,236,244,242,233,225,
+    238,231,236,101,128, 37,185,244,242,233,225,238,231,236,101,128,
+     37,183,115,  3,207,154,207,184,207,192,109,  2,207,160,207,172,
+    225,236,236,243,241,245,225,242,101,128, 37,171,233,236,233,238,
+    231,230,225,227,101,128, 38, 58,241,245,225,242,101,128, 37,161,
+    244,225,114,128, 38,  6,116,  2,207,204,207,215,229,236,229,240,
+    232,239,238,101,128, 38, 15,239,242,244,239,233,243,229,243,232,
+    229,236,236,226,242,225,227,235,229,116,  2,207,239,207,246,236,
+    229,230,116,128, 48, 24,242,233,231,232,116,128, 48, 25,245,240,
+    240,239,233,238,244,233,238,103,  2,208, 13,208, 29,243,237,225,
+    236,236,244,242,233,225,238,231,236,101,128, 37,181,244,242,233,
+    225,238,231,236,101,128, 37,179,105,  2,208, 46,208, 57,232,233,
+    242,225,231,225,238, 97,128, 48,144,107,  2,208, 63,208, 73,225,
+    244,225,235,225,238, 97,128, 48,240,239,242,229,225,110,128, 49,
+     95,237,239,238,239,243,240,225,227,101,128,255, 87,111,  4,208,
+    103,208,114,208,139,208,157,232,233,242,225,231,225,238, 97,128,
+     48,146,235,225,244,225,235,225,238, 97,129, 48,242,208,127,232,
+    225,236,230,247,233,228,244,104,128,255,102,110,129, 32,169,208,
+    145,237,239,238,239,243,240,225,227,101,128,255,230,247,225,229,
+    238,244,232,225,105,128, 14, 39,240,225,242,229,110,128, 36,178,
+    242,233,238,103,128, 30,152,243,245,240,229,242,233,239,114,128,
+      2,183,244,245,242,238,229,100,128,  2,141,249,238,110,128,  1,
+    191,120,137,  0,120,208,231,208,242,208,253,209,  6,209, 33,209,
+     46,209, 50,209, 62,209, 70,225,226,239,246,229,227,237, 98,128,
+      3, 61,226,239,240,239,237,239,230,111,128, 49, 18,227,233,242,
+    227,236,101,128, 36,231,100,  2,209, 12,209, 22,233,229,242,229,
+    243,233,115,128, 30,141,239,244,225,227,227,229,238,116,128, 30,
+    139,229,232,225,242,237,229,238,233,225,110,128,  5,109,105,128,
+      3,190,237,239,238,239,243,240,225,227,101,128,255, 88,240,225,
+    242,229,110,128, 36,179,243,245,240,229,242,233,239,114,128,  2,
+    227,121,143,  0,121,209,115,210, 74,210, 97,210,137,212,103,212,
+    111,212,128,212,192,212,204,213,201,213,241,213,253,214,  8,214,
+     29,215,  2, 97, 11,209,139,209,151,209,161,209,168,209,175,209,
+    185,209,210,209,221,210,  3,210, 16,210, 62,225,228,239,243,241,
+    245,225,242,101,128, 51, 78,226,229,238,231,225,236,105,128,  9,
+    175,227,245,244,101,128,  0,253,228,229,246, 97,128,  9, 47,229,
+    235,239,242,229,225,110,128, 49, 82,231,117,  2,209,192,209,201,
+    234,225,242,225,244,105,128, 10,175,242,237,245,235,232,105,128,
+     10, 47,232,233,242,225,231,225,238, 97,128, 48,132,107,  2,209,
+    227,209,251,225,244,225,235,225,238, 97,129, 48,228,209,239,232,
+    225,236,230,247,233,228,244,104,128,255,148,239,242,229,225,110,
+    128, 49, 81,237,225,235,235,225,238,244,232,225,105,128, 14, 78,
+    243,237,225,236,108,  2,210, 26,210, 37,232,233,242,225,231,225,
+    238, 97,128, 48,131,235,225,244,225,235,225,238, 97,129, 48,227,
+    210, 50,232,225,236,230,247,233,228,244,104,128,255,108,244,227,
+    249,242,233,236,236,233, 99,128,  4, 99,227,233,242, 99,  2,210,
+     83,210, 88,236,101,128, 36,232,245,237,230,236,229,120,128,  1,
+    119,100,  2,210,103,210,113,233,229,242,229,243,233,115,128,  0,
+    255,239,116,  2,210,120,210,129,225,227,227,229,238,116,128, 30,
+    143,226,229,236,239,119,128, 30,245,101,  7,210,153,211,161,211,
+    170,211,188,211,220,212, 40,212, 91,104,  8,210,171,210,180,210,
+    214,210,228,211, 45,211, 61,211,120,211,138,225,242,225,226,233,
+     99,128,  6, 74,226,225,242,242,229,101,  2,210,191,210,200,225,
+    242,225,226,233, 99,128,  6,210,230,233,238,225,236,225,242,225,
+    226,233, 99,128,251,175,230,233,238,225,236,225,242,225,226,233,
+     99,128,254,242,232,225,237,250,225,225,226,239,246,101,  4,210,
+    247,211,  0,211, 14,211, 30,225,242,225,226,233, 99,128,  6, 38,
+    230,233,238,225,236,225,242,225,226,233, 99,128,254,138,233,238,
+    233,244,233,225,236,225,242,225,226,233, 99,128,254,139,237,229,
+    228,233,225,236,225,242,225,226,233, 99,128,254,140,233,238,233,
+    244,233,225,236,225,242,225,226,233, 99,128,254,243,237,101,  2,
+    211, 68,211, 81,228,233,225,236,225,242,225,226,233, 99,128,254,
+    244,229,237,105,  2,211, 89,211,104,238,233,244,233,225,236,225,
+    242,225,226,233, 99,128,252,221,243,239,236,225,244,229,228,225,
+    242,225,226,233, 99,128,252, 88,238,239,239,238,230,233,238,225,
+    236,225,242,225,226,233, 99,128,252,148,244,232,242,229,229,228,
+    239,244,243,226,229,236,239,247,225,242,225,226,233, 99,128,  6,
+    209,235,239,242,229,225,110,128, 49, 86,110,129,  0,165,211,176,
+    237,239,238,239,243,240,225,227,101,128,255,229,111,  2,211,194,
+    211,203,235,239,242,229,225,110,128, 49, 85,242,233,238,232,233,
+    229,245,232,235,239,242,229,225,110,128, 49,134,114,  3,211,228,
+    212,  8,212, 20,225,232,226,229,238,249,239,237,111,  2,211,242,
+    211,251,232,229,226,242,229,119,128,  5,170,236,229,230,244,232,
+    229,226,242,229,119,128,  5,170,233,227,249,242,233,236,236,233,
+     99,128,  4, 75,245,228,233,229,242,229,243,233,243,227,249,242,
+    233,236,236,233, 99,128,  4,249,243,233,229,245,238,103,  3,212,
+     53,212, 62,212, 78,235,239,242,229,225,110,128, 49,129,240,225,
+    238,243,233,239,243,235,239,242,229,225,110,128, 49,131,243,233,
+    239,243,235,239,242,229,225,110,128, 49,130,244,233,246,232,229,
+    226,242,229,119,128,  5,154,231,242,225,246,101,128, 30,243,232,
+    239,239,107,129,  1,180,212,120,225,226,239,246,101,128, 30,247,
+    105,  5,212,140,212,151,212,162,212,171,212,179,225,242,237,229,
+    238,233,225,110,128,  5,117,227,249,242,233,236,236,233, 99,128,
+      4, 87,235,239,242,229,225,110,128, 49, 98,238,249,225,238,103,
+    128, 38, 47,247,238,225,242,237,229,238,233,225,110,128,  5,130,
+    237,239,238,239,243,240,225,227,101,128,255, 89,111,  7,212,220,
+    213, 34,213, 45,213, 55,213, 93,213,139,213,148,100,131,  5,217,
+    212,230,212,250,213,  3,228,225,231,229,243,104,129,251, 57,212,
+    241,232,229,226,242,229,119,128,251, 57,232,229,226,242,229,119,
+    128,  5,217,249,239,100,  2,213, 11,213, 20,232,229,226,242,229,
+    119,128,  5,242,240,225,244,225,232,232,229,226,242,229,119,128,
+    251, 31,232,233,242,225,231,225,238, 97,128, 48,136,233,235,239,
+    242,229,225,110,128, 49,137,107,  2,213, 61,213, 85,225,244,225,
+    235,225,238, 97,129, 48,232,213, 73,232,225,236,230,247,233,228,
+    244,104,128,255,150,239,242,229,225,110,128, 49, 91,243,237,225,
+    236,108,  2,213,103,213,114,232,233,242,225,231,225,238, 97,128,
+     48,135,235,225,244,225,235,225,238, 97,129, 48,231,213,127,232,
+    225,236,230,247,233,228,244,104,128,255,110,244,231,242,229,229,
+    107,128,  3,243,121,  2,213,154,213,191, 97,  2,213,160,213,170,
+    229,235,239,242,229,225,110,128, 49,136,107,  2,213,176,213,184,
+    239,242,229,225,110,128, 49,135,244,232,225,105,128, 14, 34,233,
+    238,231,244,232,225,105,128, 14, 13,112,  2,213,207,213,214,225,
+    242,229,110,128, 36,180,239,231,229,231,242,225,237,237,229,238,
+    105,129,  3,122,213,230,231,242,229,229,235,227,237, 98,128,  3,
+     69,114,129,  1,166,213,247,233,238,103,128, 30,153,243,245,240,
+    229,242,233,239,114,128,  2,184,116,  2,214, 14,214, 21,233,236,
+    228,101,128, 30,249,245,242,238,229,100,128,  2,142,117,  5,214,
+     41,214, 52,214, 62,214,100,214,232,232,233,242,225,231,225,238,
+     97,128, 48,134,233,235,239,242,229,225,110,128, 49,140,107,  2,
+    214, 68,214, 92,225,244,225,235,225,238, 97,129, 48,230,214, 80,
+    232,225,236,230,247,233,228,244,104,128,255,149,239,242,229,225,
+    110,128, 49, 96,115,  3,214,108,214,146,214,187,226,233,103,  2,
+    214,116,214,127,227,249,242,233,236,236,233, 99,128,  4,107,233,
+    239,244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,
+      4,109,236,233,244,244,236,101,  2,214,157,214,168,227,249,242,
+    233,236,236,233, 99,128,  4,103,233,239,244,233,230,233,229,228,
+    227,249,242,233,236,236,233, 99,128,  4,105,237,225,236,108,  2,
+    214,196,214,207,232,233,242,225,231,225,238, 97,128, 48,133,235,
+    225,244,225,235,225,238, 97,129, 48,229,214,220,232,225,236,230,
+    247,233,228,244,104,128,255,109,249,101,  2,214,239,214,248,235,
+    239,242,229,225,110,128, 49,139,239,235,239,242,229,225,110,128,
+     49,138,249, 97,  2,215,  9,215, 19,226,229,238,231,225,236,105,
+    128,  9,223,228,229,246, 97,128,  9, 95,122,142,  0,122,215, 58,
+    216, 66,216, 77,216,120,216,147,217,182,218, 34,218, 76,218, 88,
+    218,100,218,128,218,136,218,152,218,161, 97, 10,215, 80,215, 91,
+    215, 98,215,105,215,116,215,194,215,224,215,235,216, 15,216, 27,
+    225,242,237,229,238,233,225,110,128,  5,102,227,245,244,101,128,
+      1,122,228,229,246, 97,128,  9, 91,231,245,242,237,245,235,232,
+    105,128, 10, 91,104,  4,215,126,215,135,215,149,215,179,225,242,
+    225,226,233, 99,128,  6, 56,230,233,238,225,236,225,242,225,226,
+    233, 99,128,254,198,105,  2,215,155,215,170,238,233,244,233,225,
+    236,225,242,225,226,233, 99,128,254,199,242,225,231,225,238, 97,
+    128, 48, 86,237,229,228,233,225,236,225,242,225,226,233, 99,128,
+    254,200,233,110,  2,215,201,215,210,225,242,225,226,233, 99,128,
+      6, 50,230,233,238,225,236,225,242,225,226,233, 99,128,254,176,
+    235,225,244,225,235,225,238, 97,128, 48,182,241,229,102,  2,215,
+    243,216,  1,231,225,228,239,236,232,229,226,242,229,119,128,  5,
+    149,241,225,244,225,238,232,229,226,242,229,119,128,  5,148,242,
+    241,225,232,229,226,242,229,119,128,  5,152,249,233,110,130,  5,
+    214,216, 37,216, 57,228,225,231,229,243,104,129,251, 54,216, 48,
+    232,229,226,242,229,119,128,251, 54,232,229,226,242,229,119,128,
+      5,214,226,239,240,239,237,239,230,111,128, 49, 23, 99,  3,216,
+     85,216, 92,216,114,225,242,239,110,128,  1,126,233,242, 99,  2,
+    216,100,216,105,236,101,128, 36,233,245,237,230,236,229,120,128,
+     30,145,245,242,108,128,  2,145,228,239,116,130,  1,124,216,130,
+    216,139,225,227,227,229,238,116,128,  1,124,226,229,236,239,119,
+    128, 30,147,101,  6,216,161,216,172,216,215,216,226,216,237,217,
+    177,227,249,242,233,236,236,233, 99,128,  4, 55,100,  2,216,178,
+    216,197,229,243,227,229,238,228,229,242,227,249,242,233,236,236,
+    233, 99,128,  4,153,233,229,242,229,243,233,243,227,249,242,233,
+    236,236,233, 99,128,  4,223,232,233,242,225,231,225,238, 97,128,
+     48, 92,235,225,244,225,235,225,238, 97,128, 48,188,242,111,140,
+      0, 48,217, 10,217, 19,217, 29,217, 36,217, 61,217, 74,217, 85,
+    217, 97,217,108,217,118,217,129,217,136,225,242,225,226,233, 99,
+    128,  6, 96,226,229,238,231,225,236,105,128,  9,230,228,229,246,
+     97,128,  9,102,231,117,  2,217, 43,217, 52,234,225,242,225,244,
+    105,128, 10,230,242,237,245,235,232,105,128, 10,102,232,225,227,
+    235,225,242,225,226,233, 99,128,  6, 96,233,238,230,229,242,233,
+    239,114,128, 32,128,237,239,238,239,243,240,225,227,101,128,255,
+     16,239,236,228,243,244,249,236,101,128,247, 48,240,229,242,243,
+    233,225,110,128,  6,240,243,245,240,229,242,233,239,114,128, 32,
+    112,244,232,225,105,128, 14, 80,247,233,228,244,104,  3,217,148,
+    217,157,217,169,234,239,233,238,229,114,128,254,255,238,239,238,
+    234,239,233,238,229,114,128, 32, 12,243,240,225,227,101,128, 32,
+     11,244, 97,128,  3,182,104,  2,217,188,217,199,226,239,240,239,
+    237,239,230,111,128, 49, 19,101,  4,217,209,217,220,217,236,217,
+    247,225,242,237,229,238,233,225,110,128,  5,106,226,242,229,246,
+    229,227,249,242,233,236,236,233, 99,128,  4,194,227,249,242,233,
+    236,236,233, 99,128,  4, 54,100,  2,217,253,218, 16,229,243,227,
+    229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,151,
+    233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128,
+      4,221,105,  3,218, 42,218, 53,218, 64,232,233,242,225,231,225,
+    238, 97,128, 48, 88,235,225,244,225,235,225,238, 97,128, 48,184,
+    238,239,242,232,229,226,242,229,119,128,  5,174,236,233,238,229,
+    226,229,236,239,119,128, 30,149,237,239,238,239,243,240,225,227,
+    101,128,255, 90,111,  2,218,106,218,117,232,233,242,225,231,225,
+    238, 97,128, 48, 94,235,225,244,225,235,225,238, 97,128, 48,190,
+    240,225,242,229,110,128, 36,181,242,229,244,242,239,230,236,229,
+    248,232,239,239,107,128,  2,144,243,244,242,239,235,101,128,  1,
+    182,117,  2,218,167,218,178,232,233,242,225,231,225,238, 97,128,
+     48, 90,235,225,244,225,235,225,238, 97,128, 48,186
+  };
+
+
+  /*
+   *  This function searches the compressed table efficiently.
+   */
+  static unsigned long
+  ft_get_adobe_glyph_index( const char*  name,
+                            const char*  limit )
+  {
+    int                   c = 0;
+    int                   count, min, max;
+    const unsigned char*  p = ft_adobe_glyph_list;
+
+
+    if ( name == 0 || name >= limit )
+      goto NotFound;
+
+    c     = *name++;
+    count = p[1];
+    p    += 2;
+
+    min = 0;
+    max = count;
+
+    while ( min < max )
+    {
+      int                   mid = ( min + max ) >> 1;
+      const unsigned char*  q   = p + mid * 2;
+      int                   c2;
+
+
+      q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] );
+
+      c2 = q[0] & 127;
+      if ( c2 == c )
+      {
+        p = q;
+        goto Found;
+      }
+      if ( c2 < c )
+        min = mid + 1;
+      else
+        max = mid;
+    }
+    goto NotFound;
+
+  Found:
+    for (;;)
+    {
+      /* assert (*p & 127) == c */
+
+      if ( name >= limit )
+      {
+        if ( (p[0] & 128) == 0 &&
+             (p[1] & 128) != 0 )
+          return (unsigned long)( ( (int)p[2] << 8 ) | p[3] );
+
+        goto NotFound;
+      }
+      c = *name++;
+      if ( p[0] & 128 )
+      {
+        p++;
+        if ( c != (p[0] & 127) )
+          goto NotFound;
+
+        continue;
+      }
+
+      p++;
+      count = p[0] & 127;
+      if ( p[0] & 128 )
+        p += 2;
+
+      p++;
+
+      for ( ; count > 0; count--, p += 2 )
+      {
+        int                   offset = ( (int)p[0] << 8 ) | p[1];
+        const unsigned char*  q      = ft_adobe_glyph_list + offset;
+
+        if ( c == ( q[0] & 127 ) )
+        {
+          p = q;
+          goto NextIter;
+        }
+      }
+      goto NotFound;
+
+    NextIter:
+      ;
+    }
+
+  NotFound:
+    return 0;
+  }
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/rules.mk
new file mode 100644
index 0000000..4cd39a8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/rules.mk
@@ -0,0 +1,71 @@
+#
+# FreeType 2 PSNames driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2011 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# PSNames driver directory
+#
+PSNAMES_DIR := $(SRC_DIR)/psnames
+
+
+# compilation flags for the driver
+#
+PSNAMES_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSNAMES_DIR))
+
+
+# PSNames driver sources (i.e., C files)
+#
+PSNAMES_DRV_SRC := $(PSNAMES_DIR)/psmodule.c \
+                   $(PSNAMES_DIR)/pspic.c
+
+
+# PSNames driver headers
+#
+PSNAMES_DRV_H := $(PSNAMES_DRV_SRC:%.c=%.h) \
+                 $(PSNAMES_DIR)/psnamerr.h  \
+                 $(PSNAMES_DIR)/pstables.h
+
+
+# PSNames driver object(s)
+#
+#   PSNAMES_DRV_OBJ_M is used during `multi' builds
+#   PSNAMES_DRV_OBJ_S is used during `single' builds
+#
+PSNAMES_DRV_OBJ_M := $(PSNAMES_DRV_SRC:$(PSNAMES_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PSNAMES_DRV_OBJ_S := $(OBJ_DIR)/psnames.$O
+
+# PSNames driver source file for single build
+#
+PSNAMES_DRV_SRC_S := $(PSNAMES_DIR)/psmodule.c
+
+
+# PSNames driver - single object
+#
+$(PSNAMES_DRV_OBJ_S): $(PSNAMES_DRV_SRC_S) $(PSNAMES_DRV_SRC) \
+                      $(FREETYPE_H) $(PSNAMES_DRV_H)
+	$(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSNAMES_DRV_SRC_S))
+
+
+# PSNames driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PSNAMES_DIR)/%.c $(FREETYPE_H) $(PSNAMES_DRV_H)
+	$(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PSNAMES_DRV_OBJ_S)
+DRV_OBJS_M += $(PSNAMES_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/Jamfile
new file mode 100644
index 0000000..4f60e87
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/raster Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) raster ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = ftraster ftrend1 rastpic ;
+  }
+  else
+  {
+    _sources = raster ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/raster Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftmisc.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftmisc.h
new file mode 100644
index 0000000..c551e89
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftmisc.h
@@ -0,0 +1,142 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmisc.h                                                               */
+/*                                                                         */
+/*    Miscellaneous macros for stand-alone rasterizer (specification       */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 2005, 2009, 2010 by                                          */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used        */
+/*  modified and distributed under the terms of the FreeType project       */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /***************************************************/
+  /*                                                 */
+  /* This file is *not* portable!  You have to adapt */
+  /* its definitions to your platform.               */
+  /*                                                 */
+  /***************************************************/
+
+#ifndef __FTMISC_H__
+#define __FTMISC_H__
+
+
+  /* memset */
+#include "../../include/freetype/config/ftstdlib.h"
+
+#define FT_BEGIN_HEADER
+#define FT_END_HEADER
+
+#define FT_LOCAL_DEF( x )   static x
+
+
+  /* from include/freetype2/fttypes.h */
+
+  typedef unsigned char  FT_Byte;
+  typedef signed int     FT_Int;
+  typedef unsigned int   FT_UInt;
+  typedef signed long    FT_Long;
+  typedef unsigned long  FT_ULong;
+  typedef signed long    FT_F26Dot6;
+  typedef int            FT_Error;
+
+#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
+          ( ( (FT_ULong)_x1 << 24 ) |     \
+            ( (FT_ULong)_x2 << 16 ) |     \
+            ( (FT_ULong)_x3 <<  8 ) |     \
+              (FT_ULong)_x4         )
+
+
+  /* from include/freetype2/ftsystem.h */
+
+  typedef struct FT_MemoryRec_*  FT_Memory;
+
+  typedef void* (*FT_Alloc_Func)( FT_Memory  memory,
+                                  long       size );
+
+  typedef void (*FT_Free_Func)( FT_Memory  memory,
+                                void*      block );
+
+  typedef void* (*FT_Realloc_Func)( FT_Memory  memory,
+                                    long       cur_size,
+                                    long       new_size,
+                                    void*      block );
+
+  typedef struct FT_MemoryRec_
+  {
+    void*            user;
+
+    FT_Alloc_Func    alloc;
+    FT_Free_Func     free;
+    FT_Realloc_Func  realloc;
+
+  } FT_MemoryRec;
+
+
+  /* from src/ftcalc.c */
+
+#if ( defined _WIN32 || defined _WIN64 )
+
+  typedef __int64  FT_Int64;
+
+#else
+
+#include "inttypes.h"
+
+  typedef int64_t  FT_Int64;
+
+#endif
+
+
+  static FT_Long
+  FT_MulDiv( FT_Long  a,
+             FT_Long  b,
+             FT_Long  c )
+  {
+    FT_Int   s;
+    FT_Long  d;
+
+
+    s = 1;
+    if ( a < 0 ) { a = -a; s = -1; }
+    if ( b < 0 ) { b = -b; s = -s; }
+    if ( c < 0 ) { c = -c; s = -s; }
+
+    d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c
+                         : 0x7FFFFFFFL );
+
+    return ( s > 0 ) ? d : -d;
+  }
+
+
+  static FT_Long
+  FT_MulDiv_No_Round( FT_Long  a,
+                      FT_Long  b,
+                      FT_Long  c )
+  {
+    FT_Int   s;
+    FT_Long  d;
+
+
+    s = 1;
+    if ( a < 0 ) { a = -a; s = -1; }
+    if ( b < 0 ) { b = -b; s = -s; }
+    if ( c < 0 ) { c = -c; s = -s; }
+
+    d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c
+                         : 0x7FFFFFFFL );
+
+    return ( s > 0 ) ? d : -d;
+  }
+
+#endif /* __FTMISC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.c
new file mode 100644
index 0000000..264f6b0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.c
@@ -0,0 +1,3640 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftraster.c                                                             */
+/*                                                                         */
+/*    The FreeType glyph rasterizer (body).                                */
+/*                                                                         */
+/*  Copyright 1996-2003, 2005, 2007-2013 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file can be compiled without the rest of the FreeType engine, by */
+  /* defining the _STANDALONE_ macro when compiling it.  You also need to  */
+  /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir)           */
+  /* directory.  Typically, you should do something like                   */
+  /*                                                                       */
+  /* - copy `src/raster/ftraster.c' (this file) to your current directory  */
+  /*                                                                       */
+  /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h'         */
+  /*   to your current directory                                           */
+  /*                                                                       */
+  /* - compile `ftraster' with the _STANDALONE_ macro defined, as in       */
+  /*                                                                       */
+  /*     cc -c -D_STANDALONE_ ftraster.c                                   */
+  /*                                                                       */
+  /* The renderer can be initialized with a call to                        */
+  /* `ft_standard_raster.raster_new'; a bitmap can be generated            */
+  /* with a call to `ft_standard_raster.raster_render'.                    */
+  /*                                                                       */
+  /* See the comments and documentation in the file `ftimage.h' for more   */
+  /* details on how the raster works.                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This is a rewrite of the FreeType 1.x scan-line converter             */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef _STANDALONE_
+
+#define FT_CONFIG_STANDARD_LIBRARY_H  <stdlib.h>
+
+#include <string.h>           /* for memset */
+
+#include "ftmisc.h"
+#include "ftimage.h"
+
+#else /* !_STANDALONE_ */
+
+#include "../../include/ft2build.h"
+#include "ftraster.h"
+#include "../../include/freetype/internal/ftcalc.h"   /* for FT_MulDiv and FT_MulDiv_No_Round */
+
+#include "rastpic.h"
+
+#endif /* !_STANDALONE_ */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A simple technical note on how the raster works                       */
+  /* -----------------------------------------------                       */
+  /*                                                                       */
+  /*   Converting an outline into a bitmap is achieved in several steps:   */
+  /*                                                                       */
+  /*   1 - Decomposing the outline into successive `profiles'.  Each       */
+  /*       profile is simply an array of scanline intersections on a given */
+  /*       dimension.  A profile's main attributes are                     */
+  /*                                                                       */
+  /*       o its scanline position boundaries, i.e. `Ymin' and `Ymax'      */
+  /*                                                                       */
+  /*       o an array of intersection coordinates for each scanline        */
+  /*         between `Ymin' and `Ymax'                                     */
+  /*                                                                       */
+  /*       o a direction, indicating whether it was built going `up' or    */
+  /*         `down', as this is very important for filling rules           */
+  /*                                                                       */
+  /*       o its drop-out mode                                             */
+  /*                                                                       */
+  /*   2 - Sweeping the target map's scanlines in order to compute segment */
+  /*       `spans' which are then filled.  Additionally, this pass         */
+  /*       performs drop-out control.                                      */
+  /*                                                                       */
+  /*   The outline data is parsed during step 1 only.  The profiles are    */
+  /*   built from the bottom of the render pool, used as a stack.  The     */
+  /*   following graphics shows the profile list under construction:       */
+  /*                                                                       */
+  /*     __________________________________________________________ _ _    */
+  /*    |         |                 |         |                 |          */
+  /*    | profile | coordinates for | profile | coordinates for |-->       */
+  /*    |    1    |  profile 1      |    2    |  profile 2      |-->       */
+  /*    |_________|_________________|_________|_________________|__ _ _    */
+  /*                                                                       */
+  /*    ^                                                       ^          */
+  /*    |                                                       |          */
+  /* start of render pool                                      top         */
+  /*                                                                       */
+  /*   The top of the profile stack is kept in the `top' variable.         */
+  /*                                                                       */
+  /*   As you can see, a profile record is pushed on top of the render     */
+  /*   pool, which is then followed by its coordinates/intersections.  If  */
+  /*   a change of direction is detected in the outline, a new profile is  */
+  /*   generated until the end of the outline.                             */
+  /*                                                                       */
+  /*   Note that when all profiles have been generated, the function       */
+  /*   Finalize_Profile_Table() is used to record, for each profile, its   */
+  /*   bottom-most scanline as well as the scanline above its upmost       */
+  /*   boundary.  These positions are called `y-turns' because they (sort  */
+  /*   of) correspond to local extrema.  They are stored in a sorted list  */
+  /*   built from the top of the render pool as a downwards stack:         */
+  /*                                                                       */
+  /*      _ _ _______________________________________                      */
+  /*                            |                    |                     */
+  /*                         <--| sorted list of     |                     */
+  /*                         <--|  extrema scanlines |                     */
+  /*      _ _ __________________|____________________|                     */
+  /*                                                                       */
+  /*                            ^                    ^                     */
+  /*                            |                    |                     */
+  /*                         maxBuff           sizeBuff = end of pool      */
+  /*                                                                       */
+  /*   This list is later used during the sweep phase in order to          */
+  /*   optimize performance (see technical note on the sweep below).       */
+  /*                                                                       */
+  /*   Of course, the raster detects whether the two stacks collide and    */
+  /*   handles the situation properly.                                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /**                                                                     **/
+  /**  CONFIGURATION MACROS                                               **/
+  /**                                                                     **/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* define DEBUG_RASTER if you want to compile a debugging version */
+/* #define DEBUG_RASTER */
+
+  /* define FT_RASTER_OPTION_ANTI_ALIASING if you want to support */
+  /* 5-levels anti-aliasing                                       */
+/* #define FT_RASTER_OPTION_ANTI_ALIASING */
+
+  /* The size of the two-lines intermediate bitmap used */
+  /* for anti-aliasing, in bytes.                       */
+#define RASTER_GRAY_LINES  2048
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /**                                                                     **/
+  /**  OTHER MACROS (do not change)                                       **/
+  /**                                                                     **/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_raster
+
+
+#ifdef _STANDALONE_
+
+  /* Auxiliary macros for token concatenation. */
+#define FT_ERR_XCAT( x, y )  x ## y
+#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )
+
+  /* This macro is used to indicate that a function parameter is unused. */
+  /* Its purpose is simply to reduce compiler warnings.  Note also that  */
+  /* simply defining it as `(void)x' doesn't avoid warnings with certain */
+  /* ANSI compilers (e.g. LCC).                                          */
+#define FT_UNUSED( x )  (x) = (x)
+
+  /* Disable the tracing mechanism for simplicity -- developers can      */
+  /* activate it easily by redefining these macros.                      */
+#ifndef FT_ERROR
+#define FT_ERROR( x )  do { } while ( 0 )     /* nothing */
+#endif
+
+#ifndef FT_TRACE
+#define FT_TRACE( x )   do { } while ( 0 )    /* nothing */
+#define FT_TRACE1( x )  do { } while ( 0 )    /* nothing */
+#define FT_TRACE6( x )  do { } while ( 0 )    /* nothing */
+#endif
+
+#ifndef FT_THROW
+#define FT_THROW( e )  FT_ERR_CAT( Raster_Err_, e )
+#endif
+
+#define Raster_Err_None          0
+#define Raster_Err_Not_Ini      -1
+#define Raster_Err_Overflow     -2
+#define Raster_Err_Neg_Height   -3
+#define Raster_Err_Invalid      -4
+#define Raster_Err_Unsupported  -5
+
+#define ft_memset  memset
+
+#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \
+                                raster_reset_, raster_set_mode_,    \
+                                raster_render_, raster_done_ )      \
+          const FT_Raster_Funcs class_ =                            \
+          {                                                         \
+            glyph_format_,                                          \
+            raster_new_,                                            \
+            raster_reset_,                                          \
+            raster_set_mode_,                                       \
+            raster_render_,                                         \
+            raster_done_                                            \
+         };
+
+#else /* !_STANDALONE_ */
+
+
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"       /* for FT_TRACE, FT_ERROR, and FT_THROW */
+
+#include "rasterrs.h"
+
+#define Raster_Err_None         FT_Err_Ok
+#define Raster_Err_Not_Ini      Raster_Err_Raster_Uninitialized
+#define Raster_Err_Overflow     Raster_Err_Raster_Overflow
+#define Raster_Err_Neg_Height   Raster_Err_Raster_Negative_Height
+#define Raster_Err_Invalid      Raster_Err_Invalid_Outline
+#define Raster_Err_Unsupported  Raster_Err_Cannot_Render_Glyph
+
+
+#endif /* !_STANDALONE_ */
+
+
+#ifndef FT_MEM_SET
+#define FT_MEM_SET( d, s, c )  ft_memset( d, s, c )
+#endif
+
+#ifndef FT_MEM_ZERO
+#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )
+#endif
+
+  /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is       */
+  /* typically a small value and the result of a*b is known to fit into */
+  /* 32 bits.                                                           */
+#define FMulDiv( a, b, c )  ( (a) * (b) / (c) )
+
+  /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */
+  /* for clipping computations.  It simply uses the FT_MulDiv() function   */
+  /* defined in `ftcalc.h'.                                                */
+#define SMulDiv           FT_MulDiv
+#define SMulDiv_No_Round  FT_MulDiv_No_Round
+
+  /* The rasterizer is a very general purpose component; please leave */
+  /* the following redefinitions there (you never know your target    */
+  /* environment).                                                    */
+
+#ifndef TRUE
+#define TRUE   1
+#endif
+
+#ifndef FALSE
+#define FALSE  0
+#endif
+
+#ifndef NULL
+#define NULL  (void*)0
+#endif
+
+#ifndef SUCCESS
+#define SUCCESS  0
+#endif
+
+#ifndef FAILURE
+#define FAILURE  1
+#endif
+
+
+#define MaxBezier  32   /* The maximum number of stacked Bezier curves. */
+                        /* Setting this constant to more than 32 is a   */
+                        /* pure waste of space.                         */
+
+#define Pixel_Bits  6   /* fractional bits of *input* coordinates */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /**                                                                     **/
+  /**  SIMPLE TYPE DECLARATIONS                                           **/
+  /**                                                                     **/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef int             Int;
+  typedef unsigned int    UInt;
+  typedef short           Short;
+  typedef unsigned short  UShort, *PUShort;
+  typedef long            Long, *PLong;
+  typedef unsigned long   ULong;
+
+  typedef unsigned char   Byte, *PByte;
+  typedef char            Bool;
+
+
+  typedef union  Alignment_
+  {
+    long    l;
+    void*   p;
+    void  (*f)(void);
+
+  } Alignment, *PAlignment;
+
+
+  typedef struct  TPoint_
+  {
+    Long  x;
+    Long  y;
+
+  } TPoint;
+
+
+  /* values for the `flags' bit field */
+#define Flow_Up           0x8
+#define Overshoot_Top     0x10
+#define Overshoot_Bottom  0x20
+
+
+  /* States of each line, arc, and profile */
+  typedef enum  TStates_
+  {
+    Unknown_State,
+    Ascending_State,
+    Descending_State,
+    Flat_State
+
+  } TStates;
+
+
+  typedef struct TProfile_  TProfile;
+  typedef TProfile*         PProfile;
+
+  struct  TProfile_
+  {
+    FT_F26Dot6  X;           /* current coordinate during sweep          */
+    PProfile    link;        /* link to next profile (various purposes)  */
+    PLong       offset;      /* start of profile's data in render pool   */
+    unsigned    flags;       /* Bit 0-2: drop-out mode                   */
+                             /* Bit 3: profile orientation (up/down)     */
+                             /* Bit 4: is top profile?                   */
+                             /* Bit 5: is bottom profile?                */
+    long        height;      /* profile's height in scanlines            */
+    long        start;       /* profile's starting scanline              */
+
+    unsigned    countL;      /* number of lines to step before this      */
+                             /* profile becomes drawable                 */
+
+    PProfile    next;        /* next profile in same contour, used       */
+                             /* during drop-out control                  */
+  };
+
+  typedef PProfile   TProfileList;
+  typedef PProfile*  PProfileList;
+
+
+  /* Simple record used to implement a stack of bands, required */
+  /* by the sub-banding mechanism                               */
+  typedef struct  black_TBand_
+  {
+    Short  y_min;   /* band's minimum */
+    Short  y_max;   /* band's maximum */
+
+  } black_TBand;
+
+
+#define AlignProfileSize \
+  ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( long ) )
+
+
+#undef RAS_ARG
+#undef RAS_ARGS
+#undef RAS_VAR
+#undef RAS_VARS
+
+#ifdef FT_STATIC_RASTER
+
+
+#define RAS_ARGS       /* void */
+#define RAS_ARG        /* void */
+
+#define RAS_VARS       /* void */
+#define RAS_VAR        /* void */
+
+#define FT_UNUSED_RASTER  do { } while ( 0 )
+
+
+#else /* !FT_STATIC_RASTER */
+
+
+#define RAS_ARGS       black_PWorker  worker,
+#define RAS_ARG        black_PWorker  worker
+
+#define RAS_VARS       worker,
+#define RAS_VAR        worker
+
+#define FT_UNUSED_RASTER  FT_UNUSED( worker )
+
+
+#endif /* !FT_STATIC_RASTER */
+
+
+  typedef struct black_TWorker_  black_TWorker, *black_PWorker;
+
+
+  /* prototypes used for sweep function dispatch */
+  typedef void
+  Function_Sweep_Init( RAS_ARGS Short*  min,
+                                Short*  max );
+
+  typedef void
+  Function_Sweep_Span( RAS_ARGS Short       y,
+                                FT_F26Dot6  x1,
+                                FT_F26Dot6  x2,
+                                PProfile    left,
+                                PProfile    right );
+
+  typedef void
+  Function_Sweep_Step( RAS_ARG );
+
+
+  /* NOTE: These operations are only valid on 2's complement processors */
+#undef FLOOR
+#undef CEILING
+#undef TRUNC
+#undef SCALED
+
+#define FLOOR( x )    ( (x) & -ras.precision )
+#define CEILING( x )  ( ( (x) + ras.precision - 1 ) & -ras.precision )
+#define TRUNC( x )    ( (Long)(x) >> ras.precision_bits )
+#define FRAC( x )     ( (x) & ( ras.precision - 1 ) )
+#define SCALED( x )   ( ( (ULong)(x) << ras.scale_shift ) - ras.precision_half )
+
+#define IS_BOTTOM_OVERSHOOT( x ) \
+          (Bool)( CEILING( x ) - x >= ras.precision_half )
+#define IS_TOP_OVERSHOOT( x )    \
+          (Bool)( x - FLOOR( x ) >= ras.precision_half )
+
+  /* The most used variables are positioned at the top of the structure. */
+  /* Thus, their offset can be coded with less opcodes, resulting in a   */
+  /* smaller executable.                                                 */
+
+  struct  black_TWorker_
+  {
+    Int         precision_bits;     /* precision related variables         */
+    Int         precision;
+    Int         precision_half;
+    Int         precision_shift;
+    Int         precision_step;
+    Int         precision_jitter;
+
+    Int         scale_shift;        /* == precision_shift   for bitmaps    */
+                                    /* == precision_shift+1 for pixmaps    */
+
+    PLong       buff;               /* The profiles buffer                 */
+    PLong       sizeBuff;           /* Render pool size                    */
+    PLong       maxBuff;            /* Profiles buffer size                */
+    PLong       top;                /* Current cursor in buffer            */
+
+    FT_Error    error;
+
+    Int         numTurns;           /* number of Y-turns in outline        */
+
+    TPoint*     arc;                /* current Bezier arc pointer          */
+
+    UShort      bWidth;             /* target bitmap width                 */
+    PByte       bTarget;            /* target bitmap buffer                */
+    PByte       gTarget;            /* target pixmap buffer                */
+
+    Long        lastX, lastY;
+    Long        minY, maxY;
+
+    UShort      num_Profs;          /* current number of profiles          */
+
+    Bool        fresh;              /* signals a fresh new profile which   */
+                                    /* `start' field must be completed     */
+    Bool        joint;              /* signals that the last arc ended     */
+                                    /* exactly on a scanline.  Allows      */
+                                    /* removal of doublets                 */
+    PProfile    cProfile;           /* current profile                     */
+    PProfile    fProfile;           /* head of linked list of profiles     */
+    PProfile    gProfile;           /* contour's first profile in case     */
+                                    /* of impact                           */
+
+    TStates     state;              /* rendering state                     */
+
+    FT_Bitmap   target;             /* description of target bit/pixmap    */
+    FT_Outline  outline;
+
+    Long        traceOfs;           /* current offset in target bitmap     */
+    Long        traceG;             /* current offset in target pixmap     */
+
+    Short       traceIncr;          /* sweep's increment in target bitmap  */
+
+    Short       gray_min_x;         /* current min x during gray rendering */
+    Short       gray_max_x;         /* current max x during gray rendering */
+
+    /* dispatch variables */
+
+    Function_Sweep_Init*  Proc_Sweep_Init;
+    Function_Sweep_Span*  Proc_Sweep_Span;
+    Function_Sweep_Span*  Proc_Sweep_Drop;
+    Function_Sweep_Step*  Proc_Sweep_Step;
+
+    Byte        dropOutControl;     /* current drop_out control method     */
+
+    Bool        second_pass;        /* indicates whether a horizontal pass */
+                                    /* should be performed to control      */
+                                    /* drop-out accurately when calling    */
+                                    /* Render_Glyph.  Note that there is   */
+                                    /* no horizontal pass during gray      */
+                                    /* rendering.                          */
+
+    TPoint      arcs[3 * MaxBezier + 1]; /* The Bezier stack               */
+
+    black_TBand  band_stack[16];    /* band stack used for sub-banding     */
+    Int          band_top;          /* band stack top                      */
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+    Byte*       grays;
+
+    Byte        gray_lines[RASTER_GRAY_LINES];
+                                /* Intermediate table used to render the   */
+                                /* graylevels pixmaps.                     */
+                                /* gray_lines is a buffer holding two      */
+                                /* monochrome scanlines                    */
+
+    Short       gray_width;     /* width in bytes of one monochrome        */
+                                /* intermediate scanline of gray_lines.    */
+                                /* Each gray pixel takes 2 bits long there */
+
+                       /* The gray_lines must hold 2 lines, thus with size */
+                       /* in bytes of at least `gray_width*2'.             */
+
+#endif /* FT_RASTER_ANTI_ALIASING */
+
+  };
+
+
+  typedef struct  black_TRaster_
+  {
+    char*          buffer;
+    long           buffer_size;
+    void*          memory;
+    black_PWorker  worker;
+    Byte           grays[5];
+    Short          gray_width;
+
+  } black_TRaster, *black_PRaster;
+
+#ifdef FT_STATIC_RASTER
+
+  static black_TWorker  cur_ras;
+#define ras  cur_ras
+
+#else /* !FT_STATIC_RASTER */
+
+#define ras  (*worker)
+
+#endif /* !FT_STATIC_RASTER */
+
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+  /* A lookup table used to quickly count set bits in four gray 2x2 */
+  /* cells.  The values of the table have been produced with the    */
+  /* following code:                                                */
+  /*                                                                */
+  /*   for ( i = 0; i < 256; i++ )                                  */
+  /*   {                                                            */
+  /*     l = 0;                                                     */
+  /*     j = i;                                                     */
+  /*                                                                */
+  /*     for ( c = 0; c < 4; c++ )                                  */
+  /*     {                                                          */
+  /*       l <<= 4;                                                 */
+  /*                                                                */
+  /*       if ( j & 0x80 ) l++;                                     */
+  /*       if ( j & 0x40 ) l++;                                     */
+  /*                                                                */
+  /*       j = ( j << 2 ) & 0xFF;                                   */
+  /*     }                                                          */
+  /*     printf( "0x%04X", l );                                     */
+  /*   }                                                            */
+  /*                                                                */
+
+  static const short  count_table[256] =
+  {
+    0x0000, 0x0001, 0x0001, 0x0002, 0x0010, 0x0011, 0x0011, 0x0012,
+    0x0010, 0x0011, 0x0011, 0x0012, 0x0020, 0x0021, 0x0021, 0x0022,
+    0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,
+    0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,
+    0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,
+    0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,
+    0x0200, 0x0201, 0x0201, 0x0202, 0x0210, 0x0211, 0x0211, 0x0212,
+    0x0210, 0x0211, 0x0211, 0x0212, 0x0220, 0x0221, 0x0221, 0x0222,
+    0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,
+    0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,
+    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+    0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,
+    0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,
+    0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,
+    0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,
+    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+    0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,
+    0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,
+    0x2000, 0x2001, 0x2001, 0x2002, 0x2010, 0x2011, 0x2011, 0x2012,
+    0x2010, 0x2011, 0x2011, 0x2012, 0x2020, 0x2021, 0x2021, 0x2022,
+    0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,
+    0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,
+    0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,
+    0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,
+    0x2200, 0x2201, 0x2201, 0x2202, 0x2210, 0x2211, 0x2211, 0x2212,
+    0x2210, 0x2211, 0x2211, 0x2212, 0x2220, 0x2221, 0x2221, 0x2222
+  };
+
+#endif /* FT_RASTER_OPTION_ANTI_ALIASING */
+
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /**                                                                     **/
+  /**  PROFILES COMPUTATION                                               **/
+  /**                                                                     **/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Set_High_Precision                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set precision variables according to param flag.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    High :: Set to True for high precision (typically for ppem < 24),  */
+  /*            false otherwise.                                           */
+  /*                                                                       */
+  static void
+  Set_High_Precision( RAS_ARGS Int  High )
+  {
+    /*
+     * `precision_step' is used in `Bezier_Up' to decide when to split a
+     * given y-monotonous Bezier arc that crosses a scanline before
+     * approximating it as a straight segment.  The default value of 32 (for
+     * low accuracy) corresponds to
+     *
+     *   32 / 64 == 0.5 pixels ,
+     *
+     * while for the high accuracy case we have
+     *
+     *   256/ (1 << 12) = 0.0625 pixels .
+     *
+     * `precision_jitter' is an epsilon threshold used in
+     * `Vertical_Sweep_Span' to deal with small imperfections in the Bezier
+     * decomposition (after all, we are working with approximations only);
+     * it avoids switching on additional pixels which would cause artifacts
+     * otherwise.
+     *
+     * The value of `precision_jitter' has been determined heuristically.
+     *
+     */
+
+    if ( High )
+    {
+      ras.precision_bits   = 12;
+      ras.precision_step   = 256;
+      ras.precision_jitter = 30;
+    }
+    else
+    {
+      ras.precision_bits   = 6;
+      ras.precision_step   = 32;
+      ras.precision_jitter = 2;
+    }
+
+    FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" ));
+
+    ras.precision       = 1 << ras.precision_bits;
+    ras.precision_half  = ras.precision / 2;
+    ras.precision_shift = ras.precision_bits - Pixel_Bits;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    New_Profile                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new profile in the render pool.                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    aState    :: The state/orientation of the new profile.             */
+  /*                                                                       */
+  /*    overshoot :: Whether the profile's unrounded start position        */
+  /*                 differs by at least a half pixel.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   SUCCESS on success.  FAILURE in case of overflow or of incoherent   */
+  /*   profile.                                                            */
+  /*                                                                       */
+  static Bool
+  New_Profile( RAS_ARGS TStates  aState,
+                        Bool     overshoot )
+  {
+    if ( !ras.fProfile )
+    {
+      ras.cProfile  = (PProfile)ras.top;
+      ras.fProfile  = ras.cProfile;
+      ras.top      += AlignProfileSize;
+    }
+
+    if ( ras.top >= ras.maxBuff )
+    {
+      ras.error = FT_THROW( Overflow );
+      return FAILURE;
+    }
+
+    ras.cProfile->flags  = 0;
+    ras.cProfile->start  = 0;
+    ras.cProfile->height = 0;
+    ras.cProfile->offset = ras.top;
+    ras.cProfile->link   = (PProfile)0;
+    ras.cProfile->next   = (PProfile)0;
+    ras.cProfile->flags  = ras.dropOutControl;
+
+    switch ( aState )
+    {
+    case Ascending_State:
+      ras.cProfile->flags |= Flow_Up;
+      if ( overshoot )
+        ras.cProfile->flags |= Overshoot_Bottom;
+
+      FT_TRACE6(( "New ascending profile = %p\n", ras.cProfile ));
+      break;
+
+    case Descending_State:
+      if ( overshoot )
+        ras.cProfile->flags |= Overshoot_Top;
+      FT_TRACE6(( "New descending profile = %p\n", ras.cProfile ));
+      break;
+
+    default:
+      FT_ERROR(( "New_Profile: invalid profile direction\n" ));
+      ras.error = FT_THROW( Invalid );
+      return FAILURE;
+    }
+
+    if ( !ras.gProfile )
+      ras.gProfile = ras.cProfile;
+
+    ras.state = aState;
+    ras.fresh = TRUE;
+    ras.joint = FALSE;
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    End_Profile                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalize the current profile.                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    overshoot :: Whether the profile's unrounded end position differs  */
+  /*                 by at least a half pixel.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success.  FAILURE in case of overflow or incoherency.   */
+  /*                                                                       */
+  static Bool
+  End_Profile( RAS_ARGS Bool  overshoot )
+  {
+    Long  h;
+
+
+    h = (Long)( ras.top - ras.cProfile->offset );
+
+    if ( h < 0 )
+    {
+      FT_ERROR(( "End_Profile: negative height encountered\n" ));
+      ras.error = FT_THROW( Neg_Height );
+      return FAILURE;
+    }
+
+    if ( h > 0 )
+    {
+      PProfile  oldProfile;
+
+
+      FT_TRACE6(( "Ending profile %p, start = %ld, height = %ld\n",
+                  ras.cProfile, ras.cProfile->start, h ));
+
+      ras.cProfile->height = h;
+      if ( overshoot )
+      {
+        if ( ras.cProfile->flags & Flow_Up )
+          ras.cProfile->flags |= Overshoot_Top;
+        else
+          ras.cProfile->flags |= Overshoot_Bottom;
+      }
+
+      oldProfile   = ras.cProfile;
+      ras.cProfile = (PProfile)ras.top;
+
+      ras.top += AlignProfileSize;
+
+      ras.cProfile->height = 0;
+      ras.cProfile->offset = ras.top;
+
+      oldProfile->next = ras.cProfile;
+      ras.num_Profs++;
+    }
+
+    if ( ras.top >= ras.maxBuff )
+    {
+      FT_TRACE1(( "overflow in End_Profile\n" ));
+      ras.error = FT_THROW( Overflow );
+      return FAILURE;
+    }
+
+    ras.joint = FALSE;
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Insert_Y_Turn                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Insert a salient into the sorted list placed on top of the render  */
+  /*    pool.                                                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    New y scanline position.                                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success.  FAILURE in case of overflow.                  */
+  /*                                                                       */
+  static Bool
+  Insert_Y_Turn( RAS_ARGS Int  y )
+  {
+    PLong  y_turns;
+    Int    n;
+
+
+    n       = ras.numTurns - 1;
+    y_turns = ras.sizeBuff - ras.numTurns;
+
+    /* look for first y value that is <= */
+    while ( n >= 0 && y < y_turns[n] )
+      n--;
+
+    /* if it is <, simply insert it, ignore if == */
+    if ( n >= 0 && y > y_turns[n] )
+      while ( n >= 0 )
+      {
+        Int  y2 = (Int)y_turns[n];
+
+
+        y_turns[n] = y;
+        y = y2;
+        n--;
+      }
+
+    if ( n < 0 )
+    {
+      ras.maxBuff--;
+      if ( ras.maxBuff <= ras.top )
+      {
+        ras.error = FT_THROW( Overflow );
+        return FAILURE;
+      }
+      ras.numTurns++;
+      ras.sizeBuff[-ras.numTurns] = y;
+    }
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Finalize_Profile_Table                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Adjust all links in the profiles list.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success.  FAILURE in case of overflow.                  */
+  /*                                                                       */
+  static Bool
+  Finalize_Profile_Table( RAS_ARG )
+  {
+    UShort    n;
+    PProfile  p;
+
+
+    n = ras.num_Profs;
+    p = ras.fProfile;
+
+    if ( n > 1 && p )
+    {
+      while ( n > 0 )
+      {
+        Int  bottom, top;
+
+
+        if ( n > 1 )
+          p->link = (PProfile)( p->offset + p->height );
+        else
+          p->link = NULL;
+
+        if ( p->flags & Flow_Up )
+        {
+          bottom = (Int)p->start;
+          top    = (Int)( p->start + p->height - 1 );
+        }
+        else
+        {
+          bottom     = (Int)( p->start - p->height + 1 );
+          top        = (Int)p->start;
+          p->start   = bottom;
+          p->offset += p->height - 1;
+        }
+
+        if ( Insert_Y_Turn( RAS_VARS bottom )  ||
+             Insert_Y_Turn( RAS_VARS top + 1 ) )
+          return FAILURE;
+
+        p = p->link;
+        n--;
+      }
+    }
+    else
+      ras.fProfile = NULL;
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Split_Conic                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Subdivide one conic Bezier into two joint sub-arcs in the Bezier   */
+  /*    stack.                                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    None (subdivided Bezier is taken from the top of the stack).       */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This routine is the `beef' of this component.  It is  _the_ inner  */
+  /*    loop that should be optimized to hell to get the best performance. */
+  /*                                                                       */
+  static void
+  Split_Conic( TPoint*  base )
+  {
+    Long  a, b;
+
+
+    base[4].x = base[2].x;
+    b = base[1].x;
+    a = base[3].x = ( base[2].x + b ) / 2;
+    b = base[1].x = ( base[0].x + b ) / 2;
+    base[2].x = ( a + b ) / 2;
+
+    base[4].y = base[2].y;
+    b = base[1].y;
+    a = base[3].y = ( base[2].y + b ) / 2;
+    b = base[1].y = ( base[0].y + b ) / 2;
+    base[2].y = ( a + b ) / 2;
+
+    /* hand optimized.  gcc doesn't seem to be too good at common      */
+    /* expression substitution and instruction scheduling ;-)          */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Split_Cubic                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Subdivide a third-order Bezier arc into two joint sub-arcs in the  */
+  /*    Bezier stack.                                                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This routine is the `beef' of the component.  It is one of _the_   */
+  /*    inner loops that should be optimized like hell to get the best     */
+  /*    performance.                                                       */
+  /*                                                                       */
+  static void
+  Split_Cubic( TPoint*  base )
+  {
+    Long  a, b, c, d;
+
+
+    base[6].x = base[3].x;
+    c = base[1].x;
+    d = base[2].x;
+    base[1].x = a = ( base[0].x + c + 1 ) >> 1;
+    base[5].x = b = ( base[3].x + d + 1 ) >> 1;
+    c = ( c + d + 1 ) >> 1;
+    base[2].x = a = ( a + c + 1 ) >> 1;
+    base[4].x = b = ( b + c + 1 ) >> 1;
+    base[3].x = ( a + b + 1 ) >> 1;
+
+    base[6].y = base[3].y;
+    c = base[1].y;
+    d = base[2].y;
+    base[1].y = a = ( base[0].y + c + 1 ) >> 1;
+    base[5].y = b = ( base[3].y + d + 1 ) >> 1;
+    c = ( c + d + 1 ) >> 1;
+    base[2].y = a = ( a + c + 1 ) >> 1;
+    base[4].y = b = ( b + c + 1 ) >> 1;
+    base[3].y = ( a + b + 1 ) >> 1;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Line_Up                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Compute the x-coordinates of an ascending line segment and store   */
+  /*    them in the render pool.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    x1   :: The x-coordinate of the segment's start point.             */
+  /*                                                                       */
+  /*    y1   :: The y-coordinate of the segment's start point.             */
+  /*                                                                       */
+  /*    x2   :: The x-coordinate of the segment's end point.               */
+  /*                                                                       */
+  /*    y2   :: The y-coordinate of the segment's end point.               */
+  /*                                                                       */
+  /*    miny :: A lower vertical clipping bound value.                     */
+  /*                                                                       */
+  /*    maxy :: An upper vertical clipping bound value.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success, FAILURE on render pool overflow.               */
+  /*                                                                       */
+  static Bool
+  Line_Up( RAS_ARGS Long  x1,
+                    Long  y1,
+                    Long  x2,
+                    Long  y2,
+                    Long  miny,
+                    Long  maxy )
+  {
+    Long   Dx, Dy;
+    Int    e1, e2, f1, f2, size;     /* XXX: is `Short' sufficient? */
+    Long   Ix, Rx, Ax;
+
+    PLong  top;
+
+
+    Dx = x2 - x1;
+    Dy = y2 - y1;
+
+    if ( Dy <= 0 || y2 < miny || y1 > maxy )
+      return SUCCESS;
+
+    if ( y1 < miny )
+    {
+      /* Take care: miny-y1 can be a very large value; we use     */
+      /*            a slow MulDiv function to avoid clipping bugs */
+      x1 += SMulDiv( Dx, miny - y1, Dy );
+      e1  = (Int)TRUNC( miny );
+      f1  = 0;
+    }
+    else
+    {
+      e1 = (Int)TRUNC( y1 );
+      f1 = (Int)FRAC( y1 );
+    }
+
+    if ( y2 > maxy )
+    {
+      /* x2 += FMulDiv( Dx, maxy - y2, Dy );  UNNECESSARY */
+      e2  = (Int)TRUNC( maxy );
+      f2  = 0;
+    }
+    else
+    {
+      e2 = (Int)TRUNC( y2 );
+      f2 = (Int)FRAC( y2 );
+    }
+
+    if ( f1 > 0 )
+    {
+      if ( e1 == e2 )
+        return SUCCESS;
+      else
+      {
+        x1 += SMulDiv( Dx, ras.precision - f1, Dy );
+        e1 += 1;
+      }
+    }
+    else
+      if ( ras.joint )
+      {
+        ras.top--;
+        ras.joint = FALSE;
+      }
+
+    ras.joint = (char)( f2 == 0 );
+
+    if ( ras.fresh )
+    {
+      ras.cProfile->start = e1;
+      ras.fresh           = FALSE;
+    }
+
+    size = e2 - e1 + 1;
+    if ( ras.top + size >= ras.maxBuff )
+    {
+      ras.error = FT_THROW( Overflow );
+      return FAILURE;
+    }
+
+    if ( Dx > 0 )
+    {
+      Ix = SMulDiv_No_Round( ras.precision, Dx, Dy );
+      Rx = ( ras.precision * Dx ) % Dy;
+      Dx = 1;
+    }
+    else
+    {
+      Ix = -SMulDiv_No_Round( ras.precision, -Dx, Dy );
+      Rx = ( ras.precision * -Dx ) % Dy;
+      Dx = -1;
+    }
+
+    Ax  = -Dy;
+    top = ras.top;
+
+    while ( size > 0 )
+    {
+      *top++ = x1;
+
+      x1 += Ix;
+      Ax += Rx;
+      if ( Ax >= 0 )
+      {
+        Ax -= Dy;
+        x1 += Dx;
+      }
+      size--;
+    }
+
+    ras.top = top;
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Line_Down                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Compute the x-coordinates of an descending line segment and store  */
+  /*    them in the render pool.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    x1   :: The x-coordinate of the segment's start point.             */
+  /*                                                                       */
+  /*    y1   :: The y-coordinate of the segment's start point.             */
+  /*                                                                       */
+  /*    x2   :: The x-coordinate of the segment's end point.               */
+  /*                                                                       */
+  /*    y2   :: The y-coordinate of the segment's end point.               */
+  /*                                                                       */
+  /*    miny :: A lower vertical clipping bound value.                     */
+  /*                                                                       */
+  /*    maxy :: An upper vertical clipping bound value.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success, FAILURE on render pool overflow.               */
+  /*                                                                       */
+  static Bool
+  Line_Down( RAS_ARGS Long  x1,
+                      Long  y1,
+                      Long  x2,
+                      Long  y2,
+                      Long  miny,
+                      Long  maxy )
+  {
+    Bool  result, fresh;
+
+
+    fresh  = ras.fresh;
+
+    result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny );
+
+    if ( fresh && !ras.fresh )
+      ras.cProfile->start = -ras.cProfile->start;
+
+    return result;
+  }
+
+
+  /* A function type describing the functions used to split Bezier arcs */
+  typedef void  (*TSplitter)( TPoint*  base );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Bezier_Up                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Compute the x-coordinates of an ascending Bezier arc and store     */
+  /*    them in the render pool.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    degree   :: The degree of the Bezier arc (either 2 or 3).          */
+  /*                                                                       */
+  /*    splitter :: The function to split Bezier arcs.                     */
+  /*                                                                       */
+  /*    miny     :: A lower vertical clipping bound value.                 */
+  /*                                                                       */
+  /*    maxy     :: An upper vertical clipping bound value.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success, FAILURE on render pool overflow.               */
+  /*                                                                       */
+  static Bool
+  Bezier_Up( RAS_ARGS Int        degree,
+                      TSplitter  splitter,
+                      Long       miny,
+                      Long       maxy )
+  {
+    Long   y1, y2, e, e2, e0;
+    Short  f1;
+
+    TPoint*  arc;
+    TPoint*  start_arc;
+
+    PLong top;
+
+
+    arc = ras.arc;
+    y1  = arc[degree].y;
+    y2  = arc[0].y;
+    top = ras.top;
+
+    if ( y2 < miny || y1 > maxy )
+      goto Fin;
+
+    e2 = FLOOR( y2 );
+
+    if ( e2 > maxy )
+      e2 = maxy;
+
+    e0 = miny;
+
+    if ( y1 < miny )
+      e = miny;
+    else
+    {
+      e  = CEILING( y1 );
+      f1 = (Short)( FRAC( y1 ) );
+      e0 = e;
+
+      if ( f1 == 0 )
+      {
+        if ( ras.joint )
+        {
+          top--;
+          ras.joint = FALSE;
+        }
+
+        *top++ = arc[degree].x;
+
+        e += ras.precision;
+      }
+    }
+
+    if ( ras.fresh )
+    {
+      ras.cProfile->start = TRUNC( e0 );
+      ras.fresh = FALSE;
+    }
+
+    if ( e2 < e )
+      goto Fin;
+
+    if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff )
+    {
+      ras.top   = top;
+      ras.error = FT_THROW( Overflow );
+      return FAILURE;
+    }
+
+    start_arc = arc;
+
+    while ( arc >= start_arc && e <= e2 )
+    {
+      ras.joint = FALSE;
+
+      y2 = arc[0].y;
+
+      if ( y2 > e )
+      {
+        y1 = arc[degree].y;
+        if ( y2 - y1 >= ras.precision_step )
+        {
+          splitter( arc );
+          arc += degree;
+        }
+        else
+        {
+          *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x,
+                                            e - y1, y2 - y1 );
+          arc -= degree;
+          e   += ras.precision;
+        }
+      }
+      else
+      {
+        if ( y2 == e )
+        {
+          ras.joint  = TRUE;
+          *top++     = arc[0].x;
+
+          e += ras.precision;
+        }
+        arc -= degree;
+      }
+    }
+
+  Fin:
+    ras.top  = top;
+    ras.arc -= degree;
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Bezier_Down                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Compute the x-coordinates of an descending Bezier arc and store    */
+  /*    them in the render pool.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    degree   :: The degree of the Bezier arc (either 2 or 3).          */
+  /*                                                                       */
+  /*    splitter :: The function to split Bezier arcs.                     */
+  /*                                                                       */
+  /*    miny     :: A lower vertical clipping bound value.                 */
+  /*                                                                       */
+  /*    maxy     :: An upper vertical clipping bound value.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success, FAILURE on render pool overflow.               */
+  /*                                                                       */
+  static Bool
+  Bezier_Down( RAS_ARGS Int        degree,
+                        TSplitter  splitter,
+                        Long       miny,
+                        Long       maxy )
+  {
+    TPoint*  arc = ras.arc;
+    Bool     result, fresh;
+
+
+    arc[0].y = -arc[0].y;
+    arc[1].y = -arc[1].y;
+    arc[2].y = -arc[2].y;
+    if ( degree > 2 )
+      arc[3].y = -arc[3].y;
+
+    fresh = ras.fresh;
+
+    result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny );
+
+    if ( fresh && !ras.fresh )
+      ras.cProfile->start = -ras.cProfile->start;
+
+    arc[0].y = -arc[0].y;
+    return result;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Line_To                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Inject a new line segment and adjust the Profiles list.            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*   x :: The x-coordinate of the segment's end point (its start point   */
+  /*        is stored in `lastX').                                         */
+  /*                                                                       */
+  /*   y :: The y-coordinate of the segment's end point (its start point   */
+  /*        is stored in `lastY').                                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */
+  /*   profile.                                                            */
+  /*                                                                       */
+  static Bool
+  Line_To( RAS_ARGS Long  x,
+                    Long  y )
+  {
+    /* First, detect a change of direction */
+
+    switch ( ras.state )
+    {
+    case Unknown_State:
+      if ( y > ras.lastY )
+      {
+        if ( New_Profile( RAS_VARS Ascending_State,
+                                   IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )
+          return FAILURE;
+      }
+      else
+      {
+        if ( y < ras.lastY )
+          if ( New_Profile( RAS_VARS Descending_State,
+                                     IS_TOP_OVERSHOOT( ras.lastY ) ) )
+            return FAILURE;
+      }
+      break;
+
+    case Ascending_State:
+      if ( y < ras.lastY )
+      {
+        if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) ||
+             New_Profile( RAS_VARS Descending_State,
+                                   IS_TOP_OVERSHOOT( ras.lastY ) ) )
+          return FAILURE;
+      }
+      break;
+
+    case Descending_State:
+      if ( y > ras.lastY )
+      {
+        if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ||
+             New_Profile( RAS_VARS Ascending_State,
+                                   IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )
+          return FAILURE;
+      }
+      break;
+
+    default:
+      ;
+    }
+
+    /* Then compute the lines */
+
+    switch ( ras.state )
+    {
+    case Ascending_State:
+      if ( Line_Up( RAS_VARS ras.lastX, ras.lastY,
+                             x, y, ras.minY, ras.maxY ) )
+        return FAILURE;
+      break;
+
+    case Descending_State:
+      if ( Line_Down( RAS_VARS ras.lastX, ras.lastY,
+                               x, y, ras.minY, ras.maxY ) )
+        return FAILURE;
+      break;
+
+    default:
+      ;
+    }
+
+    ras.lastX = x;
+    ras.lastY = y;
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Conic_To                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Inject a new conic arc and adjust the profile list.                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*   cx :: The x-coordinate of the arc's new control point.              */
+  /*                                                                       */
+  /*   cy :: The y-coordinate of the arc's new control point.              */
+  /*                                                                       */
+  /*   x  :: The x-coordinate of the arc's end point (its start point is   */
+  /*         stored in `lastX').                                           */
+  /*                                                                       */
+  /*   y  :: The y-coordinate of the arc's end point (its start point is   */
+  /*         stored in `lastY').                                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */
+  /*   profile.                                                            */
+  /*                                                                       */
+  static Bool
+  Conic_To( RAS_ARGS Long  cx,
+                     Long  cy,
+                     Long  x,
+                     Long  y )
+  {
+    Long     y1, y2, y3, x3, ymin, ymax;
+    TStates  state_bez;
+
+
+    ras.arc      = ras.arcs;
+    ras.arc[2].x = ras.lastX;
+    ras.arc[2].y = ras.lastY;
+    ras.arc[1].x = cx;
+    ras.arc[1].y = cy;
+    ras.arc[0].x = x;
+    ras.arc[0].y = y;
+
+    do
+    {
+      y1 = ras.arc[2].y;
+      y2 = ras.arc[1].y;
+      y3 = ras.arc[0].y;
+      x3 = ras.arc[0].x;
+
+      /* first, categorize the Bezier arc */
+
+      if ( y1 <= y3 )
+      {
+        ymin = y1;
+        ymax = y3;
+      }
+      else
+      {
+        ymin = y3;
+        ymax = y1;
+      }
+
+      if ( y2 < ymin || y2 > ymax )
+      {
+        /* this arc has no given direction, split it! */
+        Split_Conic( ras.arc );
+        ras.arc += 2;
+      }
+      else if ( y1 == y3 )
+      {
+        /* this arc is flat, ignore it and pop it from the Bezier stack */
+        ras.arc -= 2;
+      }
+      else
+      {
+        /* the arc is y-monotonous, either ascending or descending */
+        /* detect a change of direction                            */
+        state_bez = y1 < y3 ? Ascending_State : Descending_State;
+        if ( ras.state != state_bez )
+        {
+          Bool  o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )
+                                                 : IS_TOP_OVERSHOOT( y1 );
+
+
+          /* finalize current profile if any */
+          if ( ras.state != Unknown_State &&
+               End_Profile( RAS_VARS o )  )
+            goto Fail;
+
+          /* create a new profile */
+          if ( New_Profile( RAS_VARS state_bez, o ) )
+            goto Fail;
+        }
+
+        /* now call the appropriate routine */
+        if ( state_bez == Ascending_State )
+        {
+          if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
+            goto Fail;
+        }
+        else
+          if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
+            goto Fail;
+      }
+
+    } while ( ras.arc >= ras.arcs );
+
+    ras.lastX = x3;
+    ras.lastY = y3;
+
+    return SUCCESS;
+
+  Fail:
+    return FAILURE;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Cubic_To                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Inject a new cubic arc and adjust the profile list.                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*   cx1 :: The x-coordinate of the arc's first new control point.       */
+  /*                                                                       */
+  /*   cy1 :: The y-coordinate of the arc's first new control point.       */
+  /*                                                                       */
+  /*   cx2 :: The x-coordinate of the arc's second new control point.      */
+  /*                                                                       */
+  /*   cy2 :: The y-coordinate of the arc's second new control point.      */
+  /*                                                                       */
+  /*   x   :: The x-coordinate of the arc's end point (its start point is  */
+  /*          stored in `lastX').                                          */
+  /*                                                                       */
+  /*   y   :: The y-coordinate of the arc's end point (its start point is  */
+  /*          stored in `lastY').                                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */
+  /*   profile.                                                            */
+  /*                                                                       */
+  static Bool
+  Cubic_To( RAS_ARGS Long  cx1,
+                     Long  cy1,
+                     Long  cx2,
+                     Long  cy2,
+                     Long  x,
+                     Long  y )
+  {
+    Long     y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2;
+    TStates  state_bez;
+
+
+    ras.arc      = ras.arcs;
+    ras.arc[3].x = ras.lastX;
+    ras.arc[3].y = ras.lastY;
+    ras.arc[2].x = cx1;
+    ras.arc[2].y = cy1;
+    ras.arc[1].x = cx2;
+    ras.arc[1].y = cy2;
+    ras.arc[0].x = x;
+    ras.arc[0].y = y;
+
+    do
+    {
+      y1 = ras.arc[3].y;
+      y2 = ras.arc[2].y;
+      y3 = ras.arc[1].y;
+      y4 = ras.arc[0].y;
+      x4 = ras.arc[0].x;
+
+      /* first, categorize the Bezier arc */
+
+      if ( y1 <= y4 )
+      {
+        ymin1 = y1;
+        ymax1 = y4;
+      }
+      else
+      {
+        ymin1 = y4;
+        ymax1 = y1;
+      }
+
+      if ( y2 <= y3 )
+      {
+        ymin2 = y2;
+        ymax2 = y3;
+      }
+      else
+      {
+        ymin2 = y3;
+        ymax2 = y2;
+      }
+
+      if ( ymin2 < ymin1 || ymax2 > ymax1 )
+      {
+        /* this arc has no given direction, split it! */
+        Split_Cubic( ras.arc );
+        ras.arc += 3;
+      }
+      else if ( y1 == y4 )
+      {
+        /* this arc is flat, ignore it and pop it from the Bezier stack */
+        ras.arc -= 3;
+      }
+      else
+      {
+        state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State;
+
+        /* detect a change of direction */
+        if ( ras.state != state_bez )
+        {
+          Bool  o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )
+                                                 : IS_TOP_OVERSHOOT( y1 );
+
+
+          /* finalize current profile if any */
+          if ( ras.state != Unknown_State &&
+               End_Profile( RAS_VARS o )  )
+            goto Fail;
+
+          if ( New_Profile( RAS_VARS state_bez, o ) )
+            goto Fail;
+        }
+
+        /* compute intersections */
+        if ( state_bez == Ascending_State )
+        {
+          if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
+            goto Fail;
+        }
+        else
+          if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
+            goto Fail;
+      }
+
+    } while ( ras.arc >= ras.arcs );
+
+    ras.lastX = x4;
+    ras.lastY = y4;
+
+    return SUCCESS;
+
+  Fail:
+    return FAILURE;
+  }
+
+
+#undef  SWAP_
+#define SWAP_( x, y )  do                \
+                       {                 \
+                         Long  swap = x; \
+                                         \
+                                         \
+                         x = y;          \
+                         y = swap;       \
+                       } while ( 0 )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Decompose_Curve                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Scan the outline arrays in order to emit individual segments and   */
+  /*    Beziers by calling Line_To() and Bezier_To().  It handles all      */
+  /*    weird cases, like when the first point is off the curve, or when   */
+  /*    there are simply no `on' points in the contour!                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    first   :: The index of the first point in the contour.            */
+  /*                                                                       */
+  /*    last    :: The index of the last point in the contour.             */
+  /*                                                                       */
+  /*    flipped :: If set, flip the direction of the curve.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success, FAILURE on error.                              */
+  /*                                                                       */
+  static Bool
+  Decompose_Curve( RAS_ARGS UShort  first,
+                            UShort  last,
+                            int     flipped )
+  {
+    FT_Vector   v_last;
+    FT_Vector   v_control;
+    FT_Vector   v_start;
+
+    FT_Vector*  points;
+    FT_Vector*  point;
+    FT_Vector*  limit;
+    char*       tags;
+
+    unsigned    tag;       /* current point's state           */
+
+
+    points = ras.outline.points;
+    limit  = points + last;
+
+    v_start.x = SCALED( points[first].x );
+    v_start.y = SCALED( points[first].y );
+    v_last.x  = SCALED( points[last].x );
+    v_last.y  = SCALED( points[last].y );
+
+    if ( flipped )
+    {
+      SWAP_( v_start.x, v_start.y );
+      SWAP_( v_last.x, v_last.y );
+    }
+
+    v_control = v_start;
+
+    point = points + first;
+    tags  = ras.outline.tags + first;
+
+    /* set scan mode if necessary */
+    if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE )
+      ras.dropOutControl = (Byte)tags[0] >> 5;
+
+    tag = FT_CURVE_TAG( tags[0] );
+
+    /* A contour cannot start with a cubic control point! */
+    if ( tag == FT_CURVE_TAG_CUBIC )
+      goto Invalid_Outline;
+
+    /* check first point to determine origin */
+    if ( tag == FT_CURVE_TAG_CONIC )
+    {
+      /* first point is conic control.  Yes, this happens. */
+      if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON )
+      {
+        /* start at last point if it is on the curve */
+        v_start = v_last;
+        limit--;
+      }
+      else
+      {
+        /* if both first and last points are conic,         */
+        /* start at their middle and record its position    */
+        /* for closure                                      */
+        v_start.x = ( v_start.x + v_last.x ) / 2;
+        v_start.y = ( v_start.y + v_last.y ) / 2;
+
+        v_last = v_start;
+      }
+      point--;
+      tags--;
+    }
+
+    ras.lastX = v_start.x;
+    ras.lastY = v_start.y;
+
+    while ( point < limit )
+    {
+      point++;
+      tags++;
+
+      tag = FT_CURVE_TAG( tags[0] );
+
+      switch ( tag )
+      {
+      case FT_CURVE_TAG_ON:  /* emit a single line_to */
+        {
+          Long  x, y;
+
+
+          x = SCALED( point->x );
+          y = SCALED( point->y );
+          if ( flipped )
+            SWAP_( x, y );
+
+          if ( Line_To( RAS_VARS x, y ) )
+            goto Fail;
+          continue;
+        }
+
+      case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
+        v_control.x = SCALED( point[0].x );
+        v_control.y = SCALED( point[0].y );
+
+        if ( flipped )
+          SWAP_( v_control.x, v_control.y );
+
+      Do_Conic:
+        if ( point < limit )
+        {
+          FT_Vector  v_middle;
+          Long       x, y;
+
+
+          point++;
+          tags++;
+          tag = FT_CURVE_TAG( tags[0] );
+
+          x = SCALED( point[0].x );
+          y = SCALED( point[0].y );
+
+          if ( flipped )
+            SWAP_( x, y );
+
+          if ( tag == FT_CURVE_TAG_ON )
+          {
+            if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) )
+              goto Fail;
+            continue;
+          }
+
+          if ( tag != FT_CURVE_TAG_CONIC )
+            goto Invalid_Outline;
+
+          v_middle.x = ( v_control.x + x ) / 2;
+          v_middle.y = ( v_control.y + y ) / 2;
+
+          if ( Conic_To( RAS_VARS v_control.x, v_control.y,
+                                  v_middle.x,  v_middle.y ) )
+            goto Fail;
+
+          v_control.x = x;
+          v_control.y = y;
+
+          goto Do_Conic;
+        }
+
+        if ( Conic_To( RAS_VARS v_control.x, v_control.y,
+                                v_start.x,   v_start.y ) )
+          goto Fail;
+
+        goto Close;
+
+      default:  /* FT_CURVE_TAG_CUBIC */
+        {
+          Long  x1, y1, x2, y2, x3, y3;
+
+
+          if ( point + 1 > limit                             ||
+               FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+            goto Invalid_Outline;
+
+          point += 2;
+          tags  += 2;
+
+          x1 = SCALED( point[-2].x );
+          y1 = SCALED( point[-2].y );
+          x2 = SCALED( point[-1].x );
+          y2 = SCALED( point[-1].y );
+
+          if ( flipped )
+          {
+            SWAP_( x1, y1 );
+            SWAP_( x2, y2 );
+          }
+
+          if ( point <= limit )
+          {
+            x3 = SCALED( point[0].x );
+            y3 = SCALED( point[0].y );
+
+            if ( flipped )
+              SWAP_( x3, y3 );
+
+            if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) )
+              goto Fail;
+            continue;
+          }
+
+          if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) )
+            goto Fail;
+          goto Close;
+        }
+      }
+    }
+
+    /* close the contour with a line segment */
+    if ( Line_To( RAS_VARS v_start.x, v_start.y ) )
+      goto Fail;
+
+  Close:
+    return SUCCESS;
+
+  Invalid_Outline:
+    ras.error = FT_THROW( Invalid );
+
+  Fail:
+    return FAILURE;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Convert_Glyph                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Convert a glyph into a series of segments and arcs and make a      */
+  /*    profiles list with them.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    flipped :: If set, flip the direction of curve.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success, FAILURE if any error was encountered during    */
+  /*    rendering.                                                         */
+  /*                                                                       */
+  static Bool
+  Convert_Glyph( RAS_ARGS int  flipped )
+  {
+    int       i;
+    unsigned  start;
+
+
+    ras.fProfile = NULL;
+    ras.joint    = FALSE;
+    ras.fresh    = FALSE;
+
+    ras.maxBuff  = ras.sizeBuff - AlignProfileSize;
+
+    ras.numTurns = 0;
+
+    ras.cProfile         = (PProfile)ras.top;
+    ras.cProfile->offset = ras.top;
+    ras.num_Profs        = 0;
+
+    start = 0;
+
+    for ( i = 0; i < ras.outline.n_contours; i++ )
+    {
+      PProfile  lastProfile;
+      Bool      o;
+
+
+      ras.state    = Unknown_State;
+      ras.gProfile = NULL;
+
+      if ( Decompose_Curve( RAS_VARS (unsigned short)start,
+                                     ras.outline.contours[i],
+                                     flipped ) )
+        return FAILURE;
+
+      start = ras.outline.contours[i] + 1;
+
+      /* we must now check whether the extreme arcs join or not */
+      if ( FRAC( ras.lastY ) == 0 &&
+           ras.lastY >= ras.minY  &&
+           ras.lastY <= ras.maxY  )
+        if ( ras.gProfile                        &&
+             ( ras.gProfile->flags & Flow_Up ) ==
+               ( ras.cProfile->flags & Flow_Up ) )
+          ras.top--;
+        /* Note that ras.gProfile can be nil if the contour was too small */
+        /* to be drawn.                                                   */
+
+      lastProfile = ras.cProfile;
+      if ( ras.cProfile->flags & Flow_Up )
+        o = IS_TOP_OVERSHOOT( ras.lastY );
+      else
+        o = IS_BOTTOM_OVERSHOOT( ras.lastY );
+      if ( End_Profile( RAS_VARS o ) )
+        return FAILURE;
+
+      /* close the `next profile in contour' linked list */
+      if ( ras.gProfile )
+        lastProfile->next = ras.gProfile;
+    }
+
+    if ( Finalize_Profile_Table( RAS_VAR ) )
+      return FAILURE;
+
+    return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /**                                                                     **/
+  /**  SCAN-LINE SWEEPS AND DRAWING                                       **/
+  /**                                                                     **/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Init_Linked                                                          */
+  /*                                                                       */
+  /*    Initializes an empty linked list.                                  */
+  /*                                                                       */
+  static void
+  Init_Linked( TProfileList*  l )
+  {
+    *l = NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  InsNew                                                               */
+  /*                                                                       */
+  /*    Inserts a new profile in a linked list.                            */
+  /*                                                                       */
+  static void
+  InsNew( PProfileList  list,
+          PProfile      profile )
+  {
+    PProfile  *old, current;
+    Long       x;
+
+
+    old     = list;
+    current = *old;
+    x       = profile->X;
+
+    while ( current )
+    {
+      if ( x < current->X )
+        break;
+      old     = &current->link;
+      current = *old;
+    }
+
+    profile->link = current;
+    *old          = profile;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  DelOld                                                               */
+  /*                                                                       */
+  /*    Removes an old profile from a linked list.                         */
+  /*                                                                       */
+  static void
+  DelOld( PProfileList  list,
+          PProfile      profile )
+  {
+    PProfile  *old, current;
+
+
+    old     = list;
+    current = *old;
+
+    while ( current )
+    {
+      if ( current == profile )
+      {
+        *old = current->link;
+        return;
+      }
+
+      old     = &current->link;
+      current = *old;
+    }
+
+    /* we should never get there, unless the profile was not part of */
+    /* the list.                                                     */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Sort                                                                 */
+  /*                                                                       */
+  /*    Sorts a trace list.  In 95%, the list is already sorted.  We need  */
+  /*    an algorithm which is fast in this case.  Bubble sort is enough    */
+  /*    and simple.                                                        */
+  /*                                                                       */
+  static void
+  Sort( PProfileList  list )
+  {
+    PProfile  *old, current, next;
+
+
+    /* First, set the new X coordinate of each profile */
+    current = *list;
+    while ( current )
+    {
+      current->X       = *current->offset;
+      current->offset += current->flags & Flow_Up ? 1 : -1;
+      current->height--;
+      current = current->link;
+    }
+
+    /* Then sort them */
+    old     = list;
+    current = *old;
+
+    if ( !current )
+      return;
+
+    next = current->link;
+
+    while ( next )
+    {
+      if ( current->X <= next->X )
+      {
+        old     = &current->link;
+        current = *old;
+
+        if ( !current )
+          return;
+      }
+      else
+      {
+        *old          = next;
+        current->link = next->link;
+        next->link    = current;
+
+        old     = list;
+        current = *old;
+      }
+
+      next = current->link;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Vertical Sweep Procedure Set                                         */
+  /*                                                                       */
+  /*  These four routines are used during the vertical black/white sweep   */
+  /*  phase by the generic Draw_Sweep() function.                          */
+  /*                                                                       */
+  /*************************************************************************/
+
+  static void
+  Vertical_Sweep_Init( RAS_ARGS Short*  min,
+                                Short*  max )
+  {
+    Long  pitch = ras.target.pitch;
+
+    FT_UNUSED( max );
+
+
+    ras.traceIncr = (Short)-pitch;
+    ras.traceOfs  = -*min * pitch;
+    if ( pitch > 0 )
+      ras.traceOfs += ( ras.target.rows - 1 ) * pitch;
+
+    ras.gray_min_x = 0;
+    ras.gray_max_x = 0;
+  }
+
+
+  static void
+  Vertical_Sweep_Span( RAS_ARGS Short       y,
+                                FT_F26Dot6  x1,
+                                FT_F26Dot6  x2,
+                                PProfile    left,
+                                PProfile    right )
+  {
+    Long   e1, e2;
+    Byte*  target;
+
+    FT_UNUSED( y );
+    FT_UNUSED( left );
+    FT_UNUSED( right );
+
+
+    /* Drop-out control */
+
+    e1 = TRUNC( CEILING( x1 ) );
+
+    if ( x2 - x1 - ras.precision <= ras.precision_jitter )
+      e2 = e1;
+    else
+      e2 = TRUNC( FLOOR( x2 ) );
+
+    if ( e2 >= 0 && e1 < ras.bWidth )
+    {
+      int   c1, c2;
+      Byte  f1, f2;
+
+
+      if ( e1 < 0 )
+        e1 = 0;
+      if ( e2 >= ras.bWidth )
+        e2 = ras.bWidth - 1;
+
+      c1 = (Short)( e1 >> 3 );
+      c2 = (Short)( e2 >> 3 );
+
+      f1 = (Byte)  ( 0xFF >> ( e1 & 7 ) );
+      f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) );
+
+      if ( ras.gray_min_x > c1 )
+        ras.gray_min_x = (short)c1;
+      if ( ras.gray_max_x < c2 )
+        ras.gray_max_x = (short)c2;
+
+      target = ras.bTarget + ras.traceOfs + c1;
+      c2 -= c1;
+
+      if ( c2 > 0 )
+      {
+        target[0] |= f1;
+
+        /* memset() is slower than the following code on many platforms. */
+        /* This is due to the fact that, in the vast majority of cases,  */
+        /* the span length in bytes is relatively small.                 */
+        c2--;
+        while ( c2 > 0 )
+        {
+          *(++target) = 0xFF;
+          c2--;
+        }
+        target[1] |= f2;
+      }
+      else
+        *target |= ( f1 & f2 );
+    }
+  }
+
+
+  static void
+  Vertical_Sweep_Drop( RAS_ARGS Short       y,
+                                FT_F26Dot6  x1,
+                                FT_F26Dot6  x2,
+                                PProfile    left,
+                                PProfile    right )
+  {
+    Long   e1, e2, pxl;
+    Short  c1, f1;
+
+
+    /* Drop-out control */
+
+    /*   e2            x2                    x1           e1   */
+    /*                                                         */
+    /*                 ^                     |                 */
+    /*                 |                     |                 */
+    /*   +-------------+---------------------+------------+    */
+    /*                 |                     |                 */
+    /*                 |                     v                 */
+    /*                                                         */
+    /* pixel         contour              contour       pixel  */
+    /* center                                           center */
+
+    /* drop-out mode    scan conversion rules (as defined in OpenType) */
+    /* --------------------------------------------------------------- */
+    /*  0                1, 2, 3                                       */
+    /*  1                1, 2, 4                                       */
+    /*  2                1, 2                                          */
+    /*  3                same as mode 2                                */
+    /*  4                1, 2, 5                                       */
+    /*  5                1, 2, 6                                       */
+    /*  6, 7             same as mode 2                                */
+
+    e1  = CEILING( x1 );
+    e2  = FLOOR  ( x2 );
+    pxl = e1;
+
+    if ( e1 > e2 )
+    {
+      Int  dropOutControl = left->flags & 7;
+
+
+      if ( e1 == e2 + ras.precision )
+      {
+        switch ( dropOutControl )
+        {
+        case 0: /* simple drop-outs including stubs */
+          pxl = e2;
+          break;
+
+        case 4: /* smart drop-outs including stubs */
+          pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+          break;
+
+        case 1: /* simple drop-outs excluding stubs */
+        case 5: /* smart drop-outs excluding stubs  */
+
+          /* Drop-out Control Rules #4 and #6 */
+
+          /* The specification neither provides an exact definition */
+          /* of a `stub' nor gives exact rules to exclude them.     */
+          /*                                                        */
+          /* Here the constraints we use to recognize a stub.       */
+          /*                                                        */
+          /*  upper stub:                                           */
+          /*                                                        */
+          /*   - P_Left and P_Right are in the same contour         */
+          /*   - P_Right is the successor of P_Left in that contour */
+          /*   - y is the top of P_Left and P_Right                 */
+          /*                                                        */
+          /*  lower stub:                                           */
+          /*                                                        */
+          /*   - P_Left and P_Right are in the same contour         */
+          /*   - P_Left is the successor of P_Right in that contour */
+          /*   - y is the bottom of P_Left                          */
+          /*                                                        */
+          /* We draw a stub if the following constraints are met.   */
+          /*                                                        */
+          /*   - for an upper or lower stub, there is top or bottom */
+          /*     overshoot, respectively                            */
+          /*   - the covered interval is greater or equal to a half */
+          /*     pixel                                              */
+
+          /* upper stub test */
+          if ( left->next == right                &&
+               left->height <= 0                  &&
+               !( left->flags & Overshoot_Top   &&
+                  x2 - x1 >= ras.precision_half ) )
+            return;
+
+          /* lower stub test */
+          if ( right->next == left                 &&
+               left->start == y                    &&
+               !( left->flags & Overshoot_Bottom &&
+                  x2 - x1 >= ras.precision_half  ) )
+            return;
+
+          if ( dropOutControl == 1 )
+            pxl = e2;
+          else
+            pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+          break;
+
+        default: /* modes 2, 3, 6, 7 */
+          return;  /* no drop-out control */
+        }
+
+        /* undocumented but confirmed: If the drop-out would result in a  */
+        /* pixel outside of the bounding box, use the pixel inside of the */
+        /* bounding box instead                                           */
+        if ( pxl < 0 )
+          pxl = e1;
+        else if ( TRUNC( pxl ) >= ras.bWidth )
+          pxl = e2;
+
+        /* check that the other pixel isn't set */
+        e1 = pxl == e1 ? e2 : e1;
+
+        e1 = TRUNC( e1 );
+
+        c1 = (Short)( e1 >> 3 );
+        f1 = (Short)( e1 &  7 );
+
+        if ( e1 >= 0 && e1 < ras.bWidth                      &&
+             ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) )
+          return;
+      }
+      else
+        return;
+    }
+
+    e1 = TRUNC( pxl );
+
+    if ( e1 >= 0 && e1 < ras.bWidth )
+    {
+      c1 = (Short)( e1 >> 3 );
+      f1 = (Short)( e1 & 7 );
+
+      if ( ras.gray_min_x > c1 )
+        ras.gray_min_x = c1;
+      if ( ras.gray_max_x < c1 )
+        ras.gray_max_x = c1;
+
+      ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 );
+    }
+  }
+
+
+  static void
+  Vertical_Sweep_Step( RAS_ARG )
+  {
+    ras.traceOfs += ras.traceIncr;
+  }
+
+
+  /***********************************************************************/
+  /*                                                                     */
+  /*  Horizontal Sweep Procedure Set                                     */
+  /*                                                                     */
+  /*  These four routines are used during the horizontal black/white     */
+  /*  sweep phase by the generic Draw_Sweep() function.                  */
+  /*                                                                     */
+  /***********************************************************************/
+
+  static void
+  Horizontal_Sweep_Init( RAS_ARGS Short*  min,
+                                  Short*  max )
+  {
+    /* nothing, really */
+    FT_UNUSED_RASTER;
+    FT_UNUSED( min );
+    FT_UNUSED( max );
+  }
+
+
+  static void
+  Horizontal_Sweep_Span( RAS_ARGS Short       y,
+                                  FT_F26Dot6  x1,
+                                  FT_F26Dot6  x2,
+                                  PProfile    left,
+                                  PProfile    right )
+  {
+    FT_UNUSED( left );
+    FT_UNUSED( right );
+
+
+    if ( x2 - x1 < ras.precision )
+    {
+      Long  e1, e2;
+
+
+      e1 = CEILING( x1 );
+      e2 = FLOOR  ( x2 );
+
+      if ( e1 == e2 )
+      {
+        Byte   f1;
+        PByte  bits;
+
+
+        bits = ras.bTarget + ( y >> 3 );
+        f1   = (Byte)( 0x80 >> ( y & 7 ) );
+
+        e1 = TRUNC( e1 );
+
+        if ( e1 >= 0 && e1 < ras.target.rows )
+        {
+          PByte  p;
+
+
+          p = bits - e1 * ras.target.pitch;
+          if ( ras.target.pitch > 0 )
+            p += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+          p[0] |= f1;
+        }
+      }
+    }
+  }
+
+
+  static void
+  Horizontal_Sweep_Drop( RAS_ARGS Short       y,
+                                  FT_F26Dot6  x1,
+                                  FT_F26Dot6  x2,
+                                  PProfile    left,
+                                  PProfile    right )
+  {
+    Long   e1, e2, pxl;
+    PByte  bits;
+    Byte   f1;
+
+
+    /* During the horizontal sweep, we only take care of drop-outs */
+
+    /* e1     +       <-- pixel center */
+    /*        |                        */
+    /* x1  ---+-->    <-- contour      */
+    /*        |                        */
+    /*        |                        */
+    /* x2  <--+---    <-- contour      */
+    /*        |                        */
+    /*        |                        */
+    /* e2     +       <-- pixel center */
+
+    e1  = CEILING( x1 );
+    e2  = FLOOR  ( x2 );
+    pxl = e1;
+
+    if ( e1 > e2 )
+    {
+      Int  dropOutControl = left->flags & 7;
+
+
+      if ( e1 == e2 + ras.precision )
+      {
+        switch ( dropOutControl )
+        {
+        case 0: /* simple drop-outs including stubs */
+          pxl = e2;
+          break;
+
+        case 4: /* smart drop-outs including stubs */
+          pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+          break;
+
+        case 1: /* simple drop-outs excluding stubs */
+        case 5: /* smart drop-outs excluding stubs  */
+          /* see Vertical_Sweep_Drop for details */
+
+          /* rightmost stub test */
+          if ( left->next == right                &&
+               left->height <= 0                  &&
+               !( left->flags & Overshoot_Top   &&
+                  x2 - x1 >= ras.precision_half ) )
+            return;
+
+          /* leftmost stub test */
+          if ( right->next == left                 &&
+               left->start == y                    &&
+               !( left->flags & Overshoot_Bottom &&
+                  x2 - x1 >= ras.precision_half  ) )
+            return;
+
+          if ( dropOutControl == 1 )
+            pxl = e2;
+          else
+            pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+          break;
+
+        default: /* modes 2, 3, 6, 7 */
+          return;  /* no drop-out control */
+        }
+
+        /* undocumented but confirmed: If the drop-out would result in a  */
+        /* pixel outside of the bounding box, use the pixel inside of the */
+        /* bounding box instead                                           */
+        if ( pxl < 0 )
+          pxl = e1;
+        else if ( TRUNC( pxl ) >= ras.target.rows )
+          pxl = e2;
+
+        /* check that the other pixel isn't set */
+        e1 = pxl == e1 ? e2 : e1;
+
+        e1 = TRUNC( e1 );
+
+        bits = ras.bTarget + ( y >> 3 );
+        f1   = (Byte)( 0x80 >> ( y & 7 ) );
+
+        bits -= e1 * ras.target.pitch;
+        if ( ras.target.pitch > 0 )
+          bits += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+        if ( e1 >= 0              &&
+             e1 < ras.target.rows &&
+             *bits & f1           )
+          return;
+      }
+      else
+        return;
+    }
+
+    bits = ras.bTarget + ( y >> 3 );
+    f1   = (Byte)( 0x80 >> ( y & 7 ) );
+
+    e1 = TRUNC( pxl );
+
+    if ( e1 >= 0 && e1 < ras.target.rows )
+    {
+      bits -= e1 * ras.target.pitch;
+      if ( ras.target.pitch > 0 )
+        bits += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+      bits[0] |= f1;
+    }
+  }
+
+
+  static void
+  Horizontal_Sweep_Step( RAS_ARG )
+  {
+    /* Nothing, really */
+    FT_UNUSED_RASTER;
+  }
+
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Vertical Gray Sweep Procedure Set                                    */
+  /*                                                                       */
+  /*  These two routines are used during the vertical gray-levels sweep    */
+  /*  phase by the generic Draw_Sweep() function.                          */
+  /*                                                                       */
+  /*  NOTES                                                                */
+  /*                                                                       */
+  /*  - The target pixmap's width *must* be a multiple of 4.               */
+  /*                                                                       */
+  /*  - You have to use the function Vertical_Sweep_Span() for the gray    */
+  /*    span call.                                                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+  static void
+  Vertical_Gray_Sweep_Init( RAS_ARGS Short*  min,
+                                     Short*  max )
+  {
+    Long  pitch, byte_len;
+
+
+    *min = *min & -2;
+    *max = ( *max + 3 ) & -2;
+
+    ras.traceOfs  = 0;
+    pitch         = ras.target.pitch;
+    byte_len      = -pitch;
+    ras.traceIncr = (Short)byte_len;
+    ras.traceG    = ( *min / 2 ) * byte_len;
+
+    if ( pitch > 0 )
+    {
+      ras.traceG += ( ras.target.rows - 1 ) * pitch;
+      byte_len    = -byte_len;
+    }
+
+    ras.gray_min_x =  (Short)byte_len;
+    ras.gray_max_x = -(Short)byte_len;
+  }
+
+
+  static void
+  Vertical_Gray_Sweep_Step( RAS_ARG )
+  {
+    short*  count = (short*)count_table;
+    Byte*   grays;
+
+
+    ras.traceOfs += ras.gray_width;
+
+    if ( ras.traceOfs > ras.gray_width )
+    {
+      PByte  pix;
+
+
+      pix   = ras.gTarget + ras.traceG + ras.gray_min_x * 4;
+      grays = ras.grays;
+
+      if ( ras.gray_max_x >= 0 )
+      {
+        Long  last_pixel = ras.target.width - 1;
+        Int   last_cell  = last_pixel >> 2;
+        Int   last_bit   = last_pixel & 3;
+        Bool  over       = 0;
+
+        Int    c1, c2;
+        PByte  bit, bit2;
+
+
+        if ( ras.gray_max_x >= last_cell && last_bit != 3 )
+        {
+          ras.gray_max_x = last_cell - 1;
+          over = 1;
+        }
+
+        if ( ras.gray_min_x < 0 )
+          ras.gray_min_x = 0;
+
+        bit  = ras.bTarget + ras.gray_min_x;
+        bit2 = bit + ras.gray_width;
+
+        c1 = ras.gray_max_x - ras.gray_min_x;
+
+        while ( c1 >= 0 )
+        {
+          c2 = count[*bit] + count[*bit2];
+
+          if ( c2 )
+          {
+            pix[0] = grays[(c2 >> 12) & 0x000F];
+            pix[1] = grays[(c2 >> 8 ) & 0x000F];
+            pix[2] = grays[(c2 >> 4 ) & 0x000F];
+            pix[3] = grays[ c2        & 0x000F];
+
+            *bit  = 0;
+            *bit2 = 0;
+          }
+
+          bit++;
+          bit2++;
+          pix += 4;
+          c1--;
+        }
+
+        if ( over )
+        {
+          c2 = count[*bit] + count[*bit2];
+          if ( c2 )
+          {
+            switch ( last_bit )
+            {
+            case 2:
+              pix[2] = grays[(c2 >> 4 ) & 0x000F];
+            case 1:
+              pix[1] = grays[(c2 >> 8 ) & 0x000F];
+            default:
+              pix[0] = grays[(c2 >> 12) & 0x000F];
+            }
+
+            *bit  = 0;
+            *bit2 = 0;
+          }
+        }
+      }
+
+      ras.traceOfs = 0;
+      ras.traceG  += ras.traceIncr;
+
+      ras.gray_min_x =  32000;
+      ras.gray_max_x = -32000;
+    }
+  }
+
+
+  static void
+  Horizontal_Gray_Sweep_Span( RAS_ARGS Short       y,
+                                       FT_F26Dot6  x1,
+                                       FT_F26Dot6  x2,
+                                       PProfile    left,
+                                       PProfile    right )
+  {
+    /* nothing, really */
+    FT_UNUSED_RASTER;
+    FT_UNUSED( y );
+    FT_UNUSED( x1 );
+    FT_UNUSED( x2 );
+    FT_UNUSED( left );
+    FT_UNUSED( right );
+  }
+
+
+  static void
+  Horizontal_Gray_Sweep_Drop( RAS_ARGS Short       y,
+                                       FT_F26Dot6  x1,
+                                       FT_F26Dot6  x2,
+                                       PProfile    left,
+                                       PProfile    right )
+  {
+    Long   e1, e2;
+    PByte  pixel;
+
+
+    /* During the horizontal sweep, we only take care of drop-outs */
+
+    e1 = CEILING( x1 );
+    e2 = FLOOR  ( x2 );
+
+    if ( e1 > e2 )
+    {
+      Int  dropOutControl = left->flags & 7;
+
+
+      if ( e1 == e2 + ras.precision )
+      {
+        switch ( dropOutControl )
+        {
+        case 0: /* simple drop-outs including stubs */
+          e1 = e2;
+          break;
+
+        case 4: /* smart drop-outs including stubs */
+          e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+          break;
+
+        case 1: /* simple drop-outs excluding stubs */
+        case 5: /* smart drop-outs excluding stubs  */
+          /* see Vertical_Sweep_Drop for details */
+
+          /* rightmost stub test */
+          if ( left->next == right && left->height <= 0 )
+            return;
+
+          /* leftmost stub test */
+          if ( right->next == left && left->start == y )
+            return;
+
+          if ( dropOutControl == 1 )
+            e1 = e2;
+          else
+            e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+
+          break;
+
+        default: /* modes 2, 3, 6, 7 */
+          return;  /* no drop-out control */
+        }
+      }
+      else
+        return;
+    }
+
+    if ( e1 >= 0 )
+    {
+      Byte  color;
+
+
+      if ( x2 - x1 >= ras.precision_half )
+        color = ras.grays[2];
+      else
+        color = ras.grays[1];
+
+      e1 = TRUNC( e1 ) / 2;
+      if ( e1 < ras.target.rows )
+      {
+        pixel = ras.gTarget - e1 * ras.target.pitch + y / 2;
+        if ( ras.target.pitch > 0 )
+          pixel += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+        if ( pixel[0] == ras.grays[0] )
+          pixel[0] = color;
+      }
+    }
+  }
+
+
+#endif /* FT_RASTER_OPTION_ANTI_ALIASING */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Generic Sweep Drawing routine                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+  static Bool
+  Draw_Sweep( RAS_ARG )
+  {
+    Short         y, y_change, y_height;
+
+    PProfile      P, Q, P_Left, P_Right;
+
+    Short         min_Y, max_Y, top, bottom, dropouts;
+
+    Long          x1, x2, xs, e1, e2;
+
+    TProfileList  waiting;
+    TProfileList  draw_left, draw_right;
+
+
+    /* initialize empty linked lists */
+
+    Init_Linked( &waiting );
+
+    Init_Linked( &draw_left  );
+    Init_Linked( &draw_right );
+
+    /* first, compute min and max Y */
+
+    P     = ras.fProfile;
+    max_Y = (Short)TRUNC( ras.minY );
+    min_Y = (Short)TRUNC( ras.maxY );
+
+    while ( P )
+    {
+      Q = P->link;
+
+      bottom = (Short)P->start;
+      top    = (Short)( P->start + P->height - 1 );
+
+      if ( min_Y > bottom )
+        min_Y = bottom;
+      if ( max_Y < top )
+        max_Y = top;
+
+      P->X = 0;
+      InsNew( &waiting, P );
+
+      P = Q;
+    }
+
+    /* check the Y-turns */
+    if ( ras.numTurns == 0 )
+    {
+      ras.error = FT_THROW( Invalid );
+      return FAILURE;
+    }
+
+    /* now initialize the sweep */
+
+    ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y );
+
+    /* then compute the distance of each profile from min_Y */
+
+    P = waiting;
+
+    while ( P )
+    {
+      P->countL = (UShort)( P->start - min_Y );
+      P = P->link;
+    }
+
+    /* let's go */
+
+    y        = min_Y;
+    y_height = 0;
+
+    if ( ras.numTurns > 0                     &&
+         ras.sizeBuff[-ras.numTurns] == min_Y )
+      ras.numTurns--;
+
+    while ( ras.numTurns > 0 )
+    {
+      /* check waiting list for new activations */
+
+      P = waiting;
+
+      while ( P )
+      {
+        Q = P->link;
+        P->countL -= y_height;
+        if ( P->countL == 0 )
+        {
+          DelOld( &waiting, P );
+
+          if ( P->flags & Flow_Up )
+            InsNew( &draw_left,  P );
+          else
+            InsNew( &draw_right, P );
+        }
+
+        P = Q;
+      }
+
+      /* sort the drawing lists */
+
+      Sort( &draw_left );
+      Sort( &draw_right );
+
+      y_change = (Short)ras.sizeBuff[-ras.numTurns--];
+      y_height = (Short)( y_change - y );
+
+      while ( y < y_change )
+      {
+        /* let's trace */
+
+        dropouts = 0;
+
+        P_Left  = draw_left;
+        P_Right = draw_right;
+
+        while ( P_Left )
+        {
+          x1 = P_Left ->X;
+          x2 = P_Right->X;
+
+          if ( x1 > x2 )
+          {
+            xs = x1;
+            x1 = x2;
+            x2 = xs;
+          }
+
+          e1 = FLOOR( x1 );
+          e2 = CEILING( x2 );
+
+          if ( x2 - x1 <= ras.precision &&
+               e1 != x1 && e2 != x2     )
+          {
+            if ( e1 > e2 || e2 == e1 + ras.precision )
+            {
+              Int  dropOutControl = P_Left->flags & 7;
+
+
+              if ( dropOutControl != 2 )
+              {
+                /* a drop-out was detected */
+
+                P_Left ->X = x1;
+                P_Right->X = x2;
+
+                /* mark profile for drop-out processing */
+                P_Left->countL = 1;
+                dropouts++;
+              }
+
+              goto Skip_To_Next;
+            }
+          }
+
+          ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right );
+
+        Skip_To_Next:
+
+          P_Left  = P_Left->link;
+          P_Right = P_Right->link;
+        }
+
+        /* handle drop-outs _after_ the span drawing --       */
+        /* drop-out processing has been moved out of the loop */
+        /* for performance tuning                             */
+        if ( dropouts > 0 )
+          goto Scan_DropOuts;
+
+      Next_Line:
+
+        ras.Proc_Sweep_Step( RAS_VAR );
+
+        y++;
+
+        if ( y < y_change )
+        {
+          Sort( &draw_left  );
+          Sort( &draw_right );
+        }
+      }
+
+      /* now finalize the profiles that need it */
+
+      P = draw_left;
+      while ( P )
+      {
+        Q = P->link;
+        if ( P->height == 0 )
+          DelOld( &draw_left, P );
+        P = Q;
+      }
+
+      P = draw_right;
+      while ( P )
+      {
+        Q = P->link;
+        if ( P->height == 0 )
+          DelOld( &draw_right, P );
+        P = Q;
+      }
+    }
+
+    /* for gray-scaling, flush the bitmap scanline cache */
+    while ( y <= max_Y )
+    {
+      ras.Proc_Sweep_Step( RAS_VAR );
+      y++;
+    }
+
+    return SUCCESS;
+
+  Scan_DropOuts:
+
+    P_Left  = draw_left;
+    P_Right = draw_right;
+
+    while ( P_Left )
+    {
+      if ( P_Left->countL )
+      {
+        P_Left->countL = 0;
+#if 0
+        dropouts--;  /* -- this is useful when debugging only */
+#endif
+        ras.Proc_Sweep_Drop( RAS_VARS y,
+                                      P_Left->X,
+                                      P_Right->X,
+                                      P_Left,
+                                      P_Right );
+      }
+
+      P_Left  = P_Left->link;
+      P_Right = P_Right->link;
+    }
+
+    goto Next_Line;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Render_Single_Pass                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Perform one sweep with sub-banding.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    flipped :: If set, flip the direction of the outline.              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Renderer error code.                                               */
+  /*                                                                       */
+  static int
+  Render_Single_Pass( RAS_ARGS Bool  flipped )
+  {
+    Short  i, j, k;
+
+
+    while ( ras.band_top >= 0 )
+    {
+      ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision;
+      ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision;
+
+      ras.top = ras.buff;
+
+      ras.error = Raster_Err_None;
+
+      if ( Convert_Glyph( RAS_VARS flipped ) )
+      {
+        if ( ras.error != Raster_Err_Overflow )
+          return FAILURE;
+
+        ras.error = Raster_Err_None;
+
+        /* sub-banding */
+
+#ifdef DEBUG_RASTER
+        ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) );
+#endif
+
+        i = ras.band_stack[ras.band_top].y_min;
+        j = ras.band_stack[ras.band_top].y_max;
+
+        k = (Short)( ( i + j ) / 2 );
+
+        if ( ras.band_top >= 7 || k < i )
+        {
+          ras.band_top = 0;
+          ras.error    = FT_THROW( Invalid );
+
+          return ras.error;
+        }
+
+        ras.band_stack[ras.band_top + 1].y_min = k;
+        ras.band_stack[ras.band_top + 1].y_max = j;
+
+        ras.band_stack[ras.band_top].y_max = (Short)( k - 1 );
+
+        ras.band_top++;
+      }
+      else
+      {
+        if ( ras.fProfile )
+          if ( Draw_Sweep( RAS_VAR ) )
+             return ras.error;
+        ras.band_top--;
+      }
+    }
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Render_Glyph                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Render a glyph in a bitmap.  Sub-banding if needed.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  Render_Glyph( RAS_ARG )
+  {
+    FT_Error  error;
+
+
+    Set_High_Precision( RAS_VARS ras.outline.flags &
+                                 FT_OUTLINE_HIGH_PRECISION );
+    ras.scale_shift = ras.precision_shift;
+
+    if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )
+      ras.dropOutControl = 2;
+    else
+    {
+      if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )
+        ras.dropOutControl = 4;
+      else
+        ras.dropOutControl = 0;
+
+      if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )
+        ras.dropOutControl += 1;
+    }
+
+    ras.second_pass = (FT_Byte)( !( ras.outline.flags &
+                                    FT_OUTLINE_SINGLE_PASS ) );
+
+    /* Vertical Sweep */
+    ras.Proc_Sweep_Init = Vertical_Sweep_Init;
+    ras.Proc_Sweep_Span = Vertical_Sweep_Span;
+    ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
+    ras.Proc_Sweep_Step = Vertical_Sweep_Step;
+
+    ras.band_top            = 0;
+    ras.band_stack[0].y_min = 0;
+    ras.band_stack[0].y_max = (short)( ras.target.rows - 1 );
+
+    ras.bWidth  = (unsigned short)ras.target.width;
+    ras.bTarget = (Byte*)ras.target.buffer;
+
+    if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 )
+      return error;
+
+    /* Horizontal Sweep */
+    if ( ras.second_pass && ras.dropOutControl != 2 )
+    {
+      ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
+      ras.Proc_Sweep_Span = Horizontal_Sweep_Span;
+      ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop;
+      ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
+
+      ras.band_top            = 0;
+      ras.band_stack[0].y_min = 0;
+      ras.band_stack[0].y_max = (short)( ras.target.width - 1 );
+
+      if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 )
+        return error;
+    }
+
+    return Raster_Err_None;
+  }
+
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Render_Gray_Glyph                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Render a glyph with grayscaling.  Sub-banding if needed.           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  Render_Gray_Glyph( RAS_ARG )
+  {
+    Long      pixel_width;
+    FT_Error  error;
+
+
+    Set_High_Precision( RAS_VARS ras.outline.flags &
+                                 FT_OUTLINE_HIGH_PRECISION );
+    ras.scale_shift = ras.precision_shift + 1;
+
+    if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )
+      ras.dropOutControl = 2;
+    else
+    {
+      if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )
+        ras.dropOutControl = 4;
+      else
+        ras.dropOutControl = 0;
+
+      if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )
+        ras.dropOutControl += 1;
+    }
+
+    ras.second_pass = !( ras.outline.flags & FT_OUTLINE_SINGLE_PASS );
+
+    /* Vertical Sweep */
+
+    ras.band_top            = 0;
+    ras.band_stack[0].y_min = 0;
+    ras.band_stack[0].y_max = 2 * ras.target.rows - 1;
+
+    ras.bWidth  = ras.gray_width;
+    pixel_width = 2 * ( ( ras.target.width + 3 ) >> 2 );
+
+    if ( ras.bWidth > pixel_width )
+      ras.bWidth = pixel_width;
+
+    ras.bWidth  = ras.bWidth * 8;
+    ras.bTarget = (Byte*)ras.gray_lines;
+    ras.gTarget = (Byte*)ras.target.buffer;
+
+    ras.Proc_Sweep_Init = Vertical_Gray_Sweep_Init;
+    ras.Proc_Sweep_Span = Vertical_Sweep_Span;
+    ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
+    ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step;
+
+    error = Render_Single_Pass( RAS_VARS 0 );
+    if ( error )
+      return error;
+
+    /* Horizontal Sweep */
+    if ( ras.second_pass && ras.dropOutControl != 2 )
+    {
+      ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
+      ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span;
+      ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop;
+      ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
+
+      ras.band_top            = 0;
+      ras.band_stack[0].y_min = 0;
+      ras.band_stack[0].y_max = ras.target.width * 2 - 1;
+
+      error = Render_Single_Pass( RAS_VARS 1 );
+      if ( error )
+        return error;
+    }
+
+    return Raster_Err_None;
+  }
+
+#else /* !FT_RASTER_OPTION_ANTI_ALIASING */
+
+  FT_LOCAL_DEF( FT_Error )
+  Render_Gray_Glyph( RAS_ARG )
+  {
+    FT_UNUSED_RASTER;
+
+    return FT_THROW( Unsupported );
+  }
+
+#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */
+
+
+  static void
+  ft_black_init( black_PRaster  raster )
+  {
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+    FT_UInt  n;
+
+
+    /* set default 5-levels gray palette */
+    for ( n = 0; n < 5; n++ )
+      raster->grays[n] = n * 255 / 4;
+
+    raster->gray_width = RASTER_GRAY_LINES / 2;
+#else
+    FT_UNUSED( raster );
+#endif
+  }
+
+
+  /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/
+  /****                         a static object.                  *****/
+
+
+#ifdef _STANDALONE_
+
+
+  static int
+  ft_black_new( void*       memory,
+                FT_Raster  *araster )
+  {
+     static black_TRaster  the_raster;
+     FT_UNUSED( memory );
+
+
+     *araster = (FT_Raster)&the_raster;
+     FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );
+     ft_black_init( &the_raster );
+
+     return 0;
+  }
+
+
+  static void
+  ft_black_done( FT_Raster  raster )
+  {
+    /* nothing */
+    FT_UNUSED( raster );
+  }
+
+
+#else /* !_STANDALONE_ */
+
+
+  static int
+  ft_black_new( FT_Memory       memory,
+                black_PRaster  *araster )
+  {
+    FT_Error       error;
+    black_PRaster  raster = NULL;
+
+
+    *araster = 0;
+    if ( !FT_NEW( raster ) )
+    {
+      raster->memory = memory;
+      ft_black_init( raster );
+
+      *araster = raster;
+    }
+
+    return error;
+  }
+
+
+  static void
+  ft_black_done( black_PRaster  raster )
+  {
+    FT_Memory  memory = (FT_Memory)raster->memory;
+
+
+    FT_FREE( raster );
+  }
+
+
+#endif /* !_STANDALONE_ */
+
+
+  static void
+  ft_black_reset( black_PRaster  raster,
+                  char*          pool_base,
+                  long           pool_size )
+  {
+    if ( raster )
+    {
+      if ( pool_base && pool_size >= (long)sizeof ( black_TWorker ) + 2048 )
+      {
+        black_PWorker  worker = (black_PWorker)pool_base;
+
+
+        raster->buffer      = pool_base + ( ( sizeof ( *worker ) + 7 ) & ~7 );
+        raster->buffer_size = (long)( pool_base + pool_size -
+                                        (char*)raster->buffer );
+        raster->worker      = worker;
+      }
+      else
+      {
+        raster->buffer      = NULL;
+        raster->buffer_size = 0;
+        raster->worker      = NULL;
+      }
+    }
+  }
+
+
+  static void
+  ft_black_set_mode( black_PRaster  raster,
+                     unsigned long  mode,
+                     const char*    palette )
+  {
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+    if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) )
+    {
+      /* set 5-levels gray palette */
+      raster->grays[0] = palette[0];
+      raster->grays[1] = palette[1];
+      raster->grays[2] = palette[2];
+      raster->grays[3] = palette[3];
+      raster->grays[4] = palette[4];
+    }
+
+#else
+
+    FT_UNUSED( raster );
+    FT_UNUSED( mode );
+    FT_UNUSED( palette );
+
+#endif
+  }
+
+
+  static int
+  ft_black_render( black_PRaster            raster,
+                   const FT_Raster_Params*  params )
+  {
+    const FT_Outline*  outline    = (const FT_Outline*)params->source;
+    const FT_Bitmap*   target_map = params->target;
+    black_PWorker      worker;
+
+
+    if ( !raster || !raster->buffer || !raster->buffer_size )
+      return FT_THROW( Not_Ini );
+
+    if ( !outline )
+      return FT_THROW( Invalid );
+
+    /* return immediately if the outline is empty */
+    if ( outline->n_points == 0 || outline->n_contours <= 0 )
+      return Raster_Err_None;
+
+    if ( !outline->contours || !outline->points )
+      return FT_THROW( Invalid );
+
+    if ( outline->n_points !=
+           outline->contours[outline->n_contours - 1] + 1 )
+      return FT_THROW( Invalid );
+
+    worker = raster->worker;
+
+    /* this version of the raster does not support direct rendering, sorry */
+    if ( params->flags & FT_RASTER_FLAG_DIRECT )
+      return FT_THROW( Unsupported );
+
+    if ( !target_map )
+      return FT_THROW( Invalid );
+
+    /* nothing to do */
+    if ( !target_map->width || !target_map->rows )
+      return Raster_Err_None;
+
+    if ( !target_map->buffer )
+      return FT_THROW( Invalid );
+
+    ras.outline = *outline;
+    ras.target  = *target_map;
+
+    worker->buff       = (PLong) raster->buffer;
+    worker->sizeBuff   = worker->buff +
+                           raster->buffer_size / sizeof ( Long );
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+    worker->grays      = raster->grays;
+    worker->gray_width = raster->gray_width;
+
+    FT_MEM_ZERO( worker->gray_lines, worker->gray_width * 2 );
+#endif
+
+    return ( params->flags & FT_RASTER_FLAG_AA )
+           ? Render_Gray_Glyph( RAS_VAR )
+           : Render_Glyph( RAS_VAR );
+  }
+
+
+  FT_DEFINE_RASTER_FUNCS( ft_standard_raster,
+    FT_GLYPH_FORMAT_OUTLINE,
+    (FT_Raster_New_Func)     ft_black_new,
+    (FT_Raster_Reset_Func)   ft_black_reset,
+    (FT_Raster_Set_Mode_Func)ft_black_set_mode,
+    (FT_Raster_Render_Func)  ft_black_render,
+    (FT_Raster_Done_Func)    ft_black_done
+  )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.h
new file mode 100644
index 0000000..b77260f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.h
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftraster.h                                                             */
+/*                                                                         */
+/*    The FreeType glyph rasterizer (specification).                       */
+/*                                                                         */
+/*  Copyright 1996-2001 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used        */
+/*  modified and distributed under the terms of the FreeType project       */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTRASTER_H__
+#define __FTRASTER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/ftimage.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Uncomment the following line if you are using ftraster.c as a         */
+  /* standalone module, fully independent of FreeType.                     */
+  /*                                                                       */
+/* #define _STANDALONE_ */
+
+  FT_EXPORT_VAR( const FT_Raster_Funcs )  ft_standard_raster;
+
+
+FT_END_HEADER
+
+#endif /* __FTRASTER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.c
new file mode 100644
index 0000000..0f4ffab
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.c
@@ -0,0 +1,306 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftrend1.c                                                              */
+/*                                                                         */
+/*    The FreeType glyph rasterizer interface (body).                      */
+/*                                                                         */
+/*  Copyright 1996-2003, 2005, 2006, 2011, 2013 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/ftoutln.h"
+#include "ftrend1.h"
+#include "ftraster.h"
+#include "rastpic.h"
+
+#include "rasterrs.h"
+
+
+  /* initialize renderer -- init its raster */
+  static FT_Error
+  ft_raster1_init( FT_Renderer  render )
+  {
+    FT_Library  library = FT_MODULE_LIBRARY( render );
+
+
+    render->clazz->raster_class->raster_reset( render->raster,
+                                               library->raster_pool,
+                                               library->raster_pool_size );
+
+    return FT_Err_Ok;
+  }
+
+
+  /* set render-specific mode */
+  static FT_Error
+  ft_raster1_set_mode( FT_Renderer  render,
+                       FT_ULong     mode_tag,
+                       FT_Pointer   data )
+  {
+    /* we simply pass it to the raster */
+    return render->clazz->raster_class->raster_set_mode( render->raster,
+                                                         mode_tag,
+                                                         data );
+  }
+
+
+  /* transform a given glyph image */
+  static FT_Error
+  ft_raster1_transform( FT_Renderer       render,
+                        FT_GlyphSlot      slot,
+                        const FT_Matrix*  matrix,
+                        const FT_Vector*  delta )
+  {
+    FT_Error error = FT_Err_Ok;
+
+
+    if ( slot->format != render->glyph_format )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    if ( matrix )
+      FT_Outline_Transform( &slot->outline, matrix );
+
+    if ( delta )
+      FT_Outline_Translate( &slot->outline, delta->x, delta->y );
+
+  Exit:
+    return error;
+  }
+
+
+  /* return the glyph's control box */
+  static void
+  ft_raster1_get_cbox( FT_Renderer   render,
+                       FT_GlyphSlot  slot,
+                       FT_BBox*      cbox )
+  {
+    FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
+
+    if ( slot->format == render->glyph_format )
+      FT_Outline_Get_CBox( &slot->outline, cbox );
+  }
+
+
+  /* convert a slot's glyph image into a bitmap */
+  static FT_Error
+  ft_raster1_render( FT_Renderer       render,
+                     FT_GlyphSlot      slot,
+                     FT_Render_Mode    mode,
+                     const FT_Vector*  origin )
+  {
+    FT_Error     error;
+    FT_Outline*  outline;
+    FT_BBox      cbox;
+    FT_UInt      width, height, pitch;
+    FT_Bitmap*   bitmap;
+    FT_Memory    memory;
+
+    FT_Raster_Params  params;
+
+
+    /* check glyph image format */
+    if ( slot->format != render->glyph_format )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    /* check rendering mode */
+#ifndef FT_CONFIG_OPTION_PIC
+    if ( mode != FT_RENDER_MODE_MONO )
+    {
+      /* raster1 is only capable of producing monochrome bitmaps */
+      if ( render->clazz == &ft_raster1_renderer_class )
+        return FT_THROW( Cannot_Render_Glyph );
+    }
+    else
+    {
+      /* raster5 is only capable of producing 5-gray-levels bitmaps */
+      if ( render->clazz == &ft_raster5_renderer_class )
+        return FT_THROW( Cannot_Render_Glyph );
+    }
+#else /* FT_CONFIG_OPTION_PIC */
+    /* When PIC is enabled, we cannot get to the class object      */
+    /* so instead we check the final character in the class name   */
+    /* ("raster5" or "raster1"). Yes this is a hack.               */
+    /* The "correct" thing to do is have different render function */
+    /* for each of the classes.                                    */
+    if ( mode != FT_RENDER_MODE_MONO )
+    {
+      /* raster1 is only capable of producing monochrome bitmaps */
+      if ( render->clazz->root.module_name[6] == '1' )
+        return FT_THROW( Cannot_Render_Glyph );
+    }
+    else
+    {
+      /* raster5 is only capable of producing 5-gray-levels bitmaps */
+      if ( render->clazz->root.module_name[6] == '5' )
+        return FT_THROW( Cannot_Render_Glyph );
+    }
+#endif /* FT_CONFIG_OPTION_PIC */
+
+    outline = &slot->outline;
+
+    /* translate the outline to the new origin if needed */
+    if ( origin )
+      FT_Outline_Translate( outline, origin->x, origin->y );
+
+    /* compute the control box, and grid fit it */
+    FT_Outline_Get_CBox( outline, &cbox );
+
+    /* undocumented but confirmed: bbox values get rounded */
+#if 1
+    cbox.xMin = FT_PIX_ROUND( cbox.xMin );
+    cbox.yMin = FT_PIX_ROUND( cbox.yMin );
+    cbox.xMax = FT_PIX_ROUND( cbox.xMax );
+    cbox.yMax = FT_PIX_ROUND( cbox.yMax );
+#else
+    cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+    cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+    cbox.xMax = FT_PIX_CEIL( cbox.xMax );
+    cbox.yMax = FT_PIX_CEIL( cbox.yMax );
+#endif
+
+    width  = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 );
+    height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 );
+
+    if ( width > FT_USHORT_MAX || height > FT_USHORT_MAX )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    bitmap = &slot->bitmap;
+    memory = render->root.memory;
+
+    /* release old bitmap buffer */
+    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+    {
+      FT_FREE( bitmap->buffer );
+      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+    }
+
+    /* allocate new one, depends on pixel format */
+    if ( !( mode & FT_RENDER_MODE_MONO ) )
+    {
+      /* we pad to 32 bits, only for backwards compatibility with FT 1.x */
+      pitch              = FT_PAD_CEIL( width, 4 );
+      bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
+      bitmap->num_grays  = 256;
+    }
+    else
+    {
+      pitch              = ( ( width + 15 ) >> 4 ) << 1;
+      bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
+    }
+
+    bitmap->width = width;
+    bitmap->rows  = height;
+    bitmap->pitch = pitch;
+
+    if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) )
+      goto Exit;
+
+    slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+
+    /* translate outline to render it into the bitmap */
+    FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin );
+
+    /* set up parameters */
+    params.target = bitmap;
+    params.source = outline;
+    params.flags  = 0;
+
+    if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY )
+      params.flags |= FT_RASTER_FLAG_AA;
+
+    /* render outline into the bitmap */
+    error = render->raster_render( render->raster, &params );
+
+    FT_Outline_Translate( outline, cbox.xMin, cbox.yMin );
+
+    if ( error )
+      goto Exit;
+
+    slot->format      = FT_GLYPH_FORMAT_BITMAP;
+    slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 );
+    slot->bitmap_top  = (FT_Int)( cbox.yMax >> 6 );
+
+  Exit:
+    return error;
+  }
+
+
+  FT_DEFINE_RENDERER( ft_raster1_renderer_class,
+
+      FT_MODULE_RENDERER,
+      sizeof ( FT_RendererRec ),
+
+      "raster1",
+      0x10000L,
+      0x20000L,
+
+      0,    /* module specific interface */
+
+      (FT_Module_Constructor)ft_raster1_init,
+      (FT_Module_Destructor) 0,
+      (FT_Module_Requester)  0
+    ,
+
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    (FT_Renderer_RenderFunc)   ft_raster1_render,
+    (FT_Renderer_TransformFunc)ft_raster1_transform,
+    (FT_Renderer_GetCBoxFunc)  ft_raster1_get_cbox,
+    (FT_Renderer_SetModeFunc)  ft_raster1_set_mode,
+
+    (FT_Raster_Funcs*)    &FT_STANDARD_RASTER_GET
+  )
+
+
+  /* This renderer is _NOT_ part of the default modules; you will need */
+  /* to register it by hand in your application.  It should only be    */
+  /* used for backwards-compatibility with FT 1.x anyway.              */
+  /*                                                                   */
+  FT_DEFINE_RENDERER( ft_raster5_renderer_class,
+
+      FT_MODULE_RENDERER,
+      sizeof ( FT_RendererRec ),
+
+      "raster5",
+      0x10000L,
+      0x20000L,
+
+      0,    /* module specific interface */
+
+      (FT_Module_Constructor)ft_raster1_init,
+      (FT_Module_Destructor) 0,
+      (FT_Module_Requester)  0
+    ,
+
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    (FT_Renderer_RenderFunc)   ft_raster1_render,
+    (FT_Renderer_TransformFunc)ft_raster1_transform,
+    (FT_Renderer_GetCBoxFunc)  ft_raster1_get_cbox,
+    (FT_Renderer_SetModeFunc)  ft_raster1_set_mode,
+
+    (FT_Raster_Funcs*)    &FT_STANDARD_RASTER_GET
+  )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.h
new file mode 100644
index 0000000..9767e12
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.h
@@ -0,0 +1,44 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftrend1.h                                                              */
+/*                                                                         */
+/*    The FreeType glyph rasterizer interface (specification).             */
+/*                                                                         */
+/*  Copyright 1996-2001 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTREND1_H__
+#define __FTREND1_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftrender.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_DECLARE_RENDERER( ft_raster1_renderer_class )
+
+  /* this renderer is _NOT_ part of the default modules, you'll need */
+  /* to register it by hand in your application.  It should only be  */
+  /* used for backwards-compatibility with FT 1.x anyway.            */
+  /*                                                                 */
+  FT_DECLARE_RENDERER( ft_raster5_renderer_class )
+
+
+FT_END_HEADER
+
+#endif /* __FTREND1_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/fxft_raster.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/fxft_raster.c
new file mode 100644
index 0000000..231e12f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/fxft_raster.c
@@ -0,0 +1,35 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  raster.c                                                               */
+/*                                                                         */
+/*    FreeType monochrome rasterer module component (body only).           */
+/*                                                                         */
+/*  Copyright 1996-2001 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "rastpic.c"
+#ifdef _FX_MANAGED_CODE_
+#define TWorker_	TWorker_raster
+#define TRaster_	TRaster_raster
+#endif
+#include "ftraster.c"
+#include "ftrend1.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/module.mk
new file mode 100644
index 0000000..cbff5df
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 renderer module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += RASTER_MODULE
+
+define RASTER_MODULE
+$(OPEN_DRIVER) FT_Renderer_Class, ft_raster1_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)raster    $(ECHO_DRIVER_DESC)monochrome bitmap renderer$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rasterrs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rasterrs.h
new file mode 100644
index 0000000..86d13d2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rasterrs.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  rasterrs.h                                                             */
+/*                                                                         */
+/*    monochrome renderer error codes (specification only).                */
+/*                                                                         */
+/*  Copyright 2001, 2012 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the monochrome renderer error enumeration */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __RASTERRS_H__
+#define __RASTERRS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  Raster_Err_
+#define FT_ERR_BASE    FT_Mod_Err_Raster
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __RASTERRS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.c
new file mode 100644
index 0000000..a749b94
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.c
@@ -0,0 +1,103 @@
+/***************************************************************************/
+/*                                                                         */
+/*  rastpic.c                                                              */
+/*                                                                         */
+/*    The FreeType position independent code services for raster module.   */
+/*                                                                         */
+/*  Copyright 2009, 2010, 2012, 2013 by                                    */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "rastpic.h"
+#include "rasterrs.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from ftraster.c */
+  void
+  FT_Init_Class_ft_standard_raster( FT_Raster_Funcs*  funcs );
+
+
+  void
+  ft_raster1_renderer_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory          memory        = library->memory;
+
+
+    if ( pic_container->raster )
+    {
+      RasterPIC*  container = (RasterPIC*)pic_container->raster;
+
+
+      if ( --container->ref_count )
+        return;
+      FT_FREE( container );
+      pic_container->raster = NULL;
+    }
+  }
+
+
+  FT_Error
+  ft_raster1_renderer_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = FT_Err_Ok;
+    RasterPIC*         container     = NULL;
+    FT_Memory          memory        = library->memory;
+
+
+    /* since this function also serves raster5 renderer, */
+    /* it implements reference counting                  */
+    if ( pic_container->raster )
+    {
+      ((RasterPIC*)pic_container->raster)->ref_count++;
+      return error;
+    }
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->raster = container;
+
+    container->ref_count = 1;
+
+    /* initialize pointer table -                       */
+    /* this is how the module usually expects this data */
+    FT_Init_Class_ft_standard_raster( &container->ft_standard_raster );
+
+    return error;
+  }
+
+
+  /* re-route these init and free functions to the above functions */
+  FT_Error
+  ft_raster5_renderer_class_pic_init( FT_Library  library )
+  {
+    return ft_raster1_renderer_class_pic_init( library );
+  }
+
+
+  void
+  ft_raster5_renderer_class_pic_free( FT_Library  library )
+  {
+    ft_raster1_renderer_class_pic_free( library );
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.h
new file mode 100644
index 0000000..bba362f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.h
@@ -0,0 +1,69 @@
+/***************************************************************************/
+/*                                                                         */
+/*  rastpic.h                                                              */
+/*                                                                         */
+/*    The FreeType position independent code services for raster module.   */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __RASTPIC_H__
+#define __RASTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_STANDARD_RASTER_GET  ft_standard_raster
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+  typedef struct  RasterPIC_
+  {
+    int              ref_count;
+    FT_Raster_Funcs  ft_standard_raster;
+
+  } RasterPIC;
+
+
+#define GET_PIC( lib )                                    \
+          ( (RasterPIC*)( (lib)->pic_container.raster ) )
+#define FT_STANDARD_RASTER_GET  ( GET_PIC( library )->ft_standard_raster )
+
+
+  /* see rastpic.c for the implementation */
+  void
+  ft_raster1_renderer_class_pic_free( FT_Library  library );
+
+  void
+  ft_raster5_renderer_class_pic_free( FT_Library  library );
+
+  FT_Error
+  ft_raster1_renderer_class_pic_init( FT_Library  library );
+
+  FT_Error
+  ft_raster5_renderer_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __RASTPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rules.mk
new file mode 100644
index 0000000..0e0b5e4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rules.mk
@@ -0,0 +1,70 @@
+#
+# FreeType 2 renderer module build rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2008, 2009, 2011 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# raster driver directory
+#
+RASTER_DIR := $(SRC_DIR)/raster
+
+# compilation flags for the driver
+#
+RASTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(RASTER_DIR))
+
+
+# raster driver sources (i.e., C files)
+#
+RASTER_DRV_SRC := $(RASTER_DIR)/ftraster.c \
+                  $(RASTER_DIR)/ftrend1.c  \
+                  $(RASTER_DIR)/rastpic.c
+
+
+# raster driver headers
+#
+RASTER_DRV_H := $(RASTER_DRV_SRC:%.c=%.h) \
+                $(RASTER_DIR)/rasterrs.h
+
+
+# raster driver object(s)
+#
+#   RASTER_DRV_OBJ_M is used during `multi' builds.
+#   RASTER_DRV_OBJ_S is used during `single' builds.
+#
+RASTER_DRV_OBJ_M := $(RASTER_DRV_SRC:$(RASTER_DIR)/%.c=$(OBJ_DIR)/%.$O)
+RASTER_DRV_OBJ_S := $(OBJ_DIR)/raster.$O
+
+# raster driver source file for single build
+#
+RASTER_DRV_SRC_S := $(RASTER_DIR)/raster.c
+
+
+# raster driver - single object
+#
+$(RASTER_DRV_OBJ_S): $(RASTER_DRV_SRC_S) $(RASTER_DRV_SRC) \
+                     $(FREETYPE_H) $(RASTER_DRV_H)
+	$(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(RASTER_DRV_SRC_S))
+
+
+# raster driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(RASTER_DIR)/%.c $(FREETYPE_H) $(RASTER_DRV_H)
+	$(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(RASTER_DRV_OBJ_S)
+DRV_OBJS_M += $(RASTER_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/Jamfile
new file mode 100644
index 0000000..cb20b1b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/sfnt Jamfile
+#
+# Copyright 2001, 2002, 2004, 2005 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) sfnt ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = sfobjs sfdriver ttcmap ttmtx ttpost ttload ttsbit ttkern ttbdf sfntpic ;
+  }
+  else
+  {
+    _sources = sfnt ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/sfnt Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/fxft_sfnt.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/fxft_sfnt.c
new file mode 100644
index 0000000..d0c6ba4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/fxft_sfnt.c
@@ -0,0 +1,47 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  sfnt.c                                                                 */
+/*                                                                         */
+/*    Single object library component.                                     */
+/*                                                                         */
+/*  Copyright 1996-2006, 2013 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "sfntpic.c"
+#include "ttload.c"
+#include "ttmtx.c"
+#include "ttcmap.c"
+#include "ttkern.c"
+#include "sfobjs.c"
+#include "sfdriver.c"
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#include "pngshim.c"
+#include "ttsbit.c"
+#endif
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#include "ttpost.c"
+#endif
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.c"
+#endif
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/module.mk
new file mode 100644
index 0000000..95fd6a3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 SFNT module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += SFNT_MODULE
+
+define SFNT_MODULE
+$(OPEN_DRIVER) FT_Module_Class, sfnt_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)sfnt      $(ECHO_DRIVER_DESC)helper module for TrueType & OpenType formats$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.c
new file mode 100644
index 0000000..a1478c6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.c
@@ -0,0 +1,336 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pngshim.c                                                              */
+/*                                                                         */
+/*    PNG Bitmap glyph support.                                            */
+/*                                                                         */
+/*  Copyright 2013 by Google, Inc.                                         */
+/*  Written by Stuart Gill and Behdad Esfahbod.                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/config/ftstdlib.h"
+
+
+#ifdef FT_CONFIG_OPTION_USE_PNG
+
+  /* We always include <stjmp.h>, so make libpng shut up! */
+#define PNG_SKIP_SETJMP_CHECK 1
+#include <png.h>
+#include "pngshim.h"
+
+#include "sferrors.h"
+
+
+  /* This code is freely based on cairo-png.c.  There's so many ways */
+  /* to call libpng, and the way cairo does it is defacto standard.  */
+
+  static int
+  multiply_alpha( int  alpha,
+                  int  color )
+  {
+    int  temp = ( alpha * color ) + 0x80;
+
+
+    return ( temp + ( temp >> 8 ) ) >> 8;
+  }
+
+
+  /* Premultiplies data and converts RGBA bytes => native endian. */
+  static void
+  premultiply_data( png_structp    png,
+                    png_row_infop  row_info,
+                    png_bytep      data )
+  {
+    unsigned int  i;
+
+    FT_UNUSED( png );
+
+
+    for ( i = 0; i < row_info->rowbytes; i += 4 )
+    {
+      unsigned char*  base  = &data[i];
+      unsigned int    alpha = base[3];
+
+
+      if ( alpha == 0 )
+        base[0] = base[1] = base[2] = base[3] = 0;
+
+      else
+      {
+        unsigned int  red   = base[0];
+        unsigned int  green = base[1];
+        unsigned int  blue  = base[2];
+
+
+        if ( alpha != 0xFF )
+        {
+          red   = multiply_alpha( alpha, red   );
+          green = multiply_alpha( alpha, green );
+          blue  = multiply_alpha( alpha, blue  );
+        }
+
+        base[0] = blue;
+        base[1] = green;
+        base[2] = red;
+        base[3] = alpha;
+      }
+    }
+  }
+
+
+  /* Converts RGBx bytes to BGRA. */
+  static void
+  convert_bytes_to_data( png_structp    png,
+                         png_row_infop  row_info,
+                         png_bytep      data )
+  {
+    unsigned int  i;
+
+    FT_UNUSED( png );
+
+
+    for ( i = 0; i < row_info->rowbytes; i += 4 )
+    {
+      unsigned char*  base  = &data[i];
+      unsigned int    red   = base[0];
+      unsigned int    green = base[1];
+      unsigned int    blue  = base[2];
+
+
+      base[0] = blue;
+      base[1] = green;
+      base[2] = red;
+      base[3] = 0xFF;
+    }
+  }
+
+
+  /* Use error callback to avoid png writing to stderr. */
+  static void
+  error_callback( png_structp      png,
+                  png_const_charp  error_msg )
+  {
+    FT_Error*  error = png_get_error_ptr( png );
+
+    FT_UNUSED( error_msg );
+
+
+    *error = FT_THROW( Out_Of_Memory );
+#ifdef PNG_SETJMP_SUPPORTED
+    longjmp( png_jmpbuf( png ), 1 );
+#endif
+    /* if we get here, then we have no choice but to abort ... */
+  }
+
+
+  /* Use warning callback to avoid png writing to stderr. */
+  static void
+  warning_callback( png_structp      png,
+                    png_const_charp  error_msg )
+  {
+    FT_UNUSED( png );
+    FT_UNUSED( error_msg );
+
+    /* Just ignore warnings. */
+  }
+
+
+  static void
+  read_data_from_FT_Stream( png_structp  png,
+                            png_bytep    data,
+                            png_size_t   length )
+  {
+    FT_Error   error;
+    png_voidp  p      = png_get_io_ptr( png );
+    FT_Stream  stream = (FT_Stream)p;
+
+
+    if ( FT_FRAME_ENTER( length ) )
+    {
+      FT_Error*  e = png_get_error_ptr( png );
+
+
+      *e = FT_THROW( Invalid_Stream_Read );
+      png_error( png, NULL );
+
+      return;
+    }
+
+    memcpy( data, stream->cursor, length );
+
+    FT_FRAME_EXIT();
+  }
+
+
+  static FT_Error
+  Load_SBit_Png( FT_Bitmap*       map,
+                 FT_Int           x_offset,
+                 FT_Int           y_offset,
+                 FT_Int           pix_bits,
+                 TT_SBit_Metrics  metrics,
+                 FT_Memory        memory,
+                 FT_Byte*         data,
+                 FT_UInt          png_len )
+  {
+    FT_Error      error = FT_Err_Ok;
+    FT_StreamRec  stream;
+
+    png_structp  png;
+    png_infop    info;
+    png_uint_32  imgWidth, imgHeight;
+
+    int         bitdepth, color_type, interlace;
+    FT_Int      i;
+    png_byte*  *rows;
+
+
+    if ( x_offset < 0 || x_offset + metrics->width  > map->width ||
+         y_offset < 0 || y_offset + metrics->height > map->rows  ||
+         pix_bits != 32 || map->pixel_mode != FT_PIXEL_MODE_BGRA )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    FT_Stream_OpenMemory( &stream, data, png_len );
+
+    png = png_create_read_struct( PNG_LIBPNG_VER_STRING,
+                                  &error,
+                                  error_callback,
+                                  warning_callback );
+    if ( !png )
+    {
+      error = FT_THROW( Out_Of_Memory );
+      goto Exit;
+    }
+
+    info = png_create_info_struct( png );
+    if ( !info )
+    {
+      error = FT_THROW( Out_Of_Memory );
+      png_destroy_read_struct( &png, NULL, NULL );
+      goto Exit;
+    }
+
+    if ( ft_setjmp( png_jmpbuf( png ) ) )
+    {
+      error = FT_THROW( Invalid_File_Format );
+      goto DestroyExit;
+    }
+
+    png_set_read_fn( png, &stream, read_data_from_FT_Stream );
+
+    png_read_info( png, info );
+    png_get_IHDR( png, info,
+                  &imgWidth, &imgHeight,
+                  &bitdepth, &color_type, &interlace,
+                  NULL, NULL );
+
+    if ( error != FT_Err_Ok                   ||
+         (FT_Int)imgWidth  != metrics->width  ||
+         (FT_Int)imgHeight != metrics->height )
+      goto DestroyExit;
+
+    /* convert palette/gray image to rgb */
+    if ( color_type == PNG_COLOR_TYPE_PALETTE )
+      png_set_palette_to_rgb( png );
+
+    /* expand gray bit depth if needed */
+    if ( color_type == PNG_COLOR_TYPE_GRAY )
+    {
+#if PNG_LIBPNG_VER >= 10209
+      png_set_expand_gray_1_2_4_to_8( png );
+#else
+      png_set_gray_1_2_4_to_8( png );
+#endif
+    }
+
+    /* transform transparency to alpha */
+    if ( png_get_valid(png, info, PNG_INFO_tRNS ) )
+      png_set_tRNS_to_alpha( png );
+
+    if ( bitdepth == 16 )
+      png_set_strip_16( png );
+
+    if ( bitdepth < 8 )
+      png_set_packing( png );
+
+    /* convert grayscale to RGB */
+    if ( color_type == PNG_COLOR_TYPE_GRAY       ||
+         color_type == PNG_COLOR_TYPE_GRAY_ALPHA )
+      png_set_gray_to_rgb( png );
+
+    if ( interlace != PNG_INTERLACE_NONE )
+      png_set_interlace_handling( png );
+
+    png_set_filler( png, 0xFF, PNG_FILLER_AFTER );
+
+    /* recheck header after setting EXPAND options */
+    png_read_update_info(png, info );
+    png_get_IHDR( png, info,
+                  &imgWidth, &imgHeight,
+                  &bitdepth, &color_type, &interlace,
+                  NULL, NULL );
+
+    if ( bitdepth != 8                              ||
+        !( color_type == PNG_COLOR_TYPE_RGB       ||
+           color_type == PNG_COLOR_TYPE_RGB_ALPHA ) )
+    {
+      error = FT_THROW( Invalid_File_Format );
+      goto DestroyExit;
+    }
+
+    switch ( color_type )
+    {
+    default:
+      /* Shouldn't happen, but fall through. */
+
+    case PNG_COLOR_TYPE_RGB_ALPHA:
+      png_set_read_user_transform_fn( png, premultiply_data );
+      break;
+
+    case PNG_COLOR_TYPE_RGB:
+      /* Humm, this smells.  Carry on though. */
+      png_set_read_user_transform_fn( png, convert_bytes_to_data );
+      break;
+    }
+
+    if ( FT_NEW_ARRAY( rows, imgHeight ) )
+    {
+      error = FT_THROW( Out_Of_Memory );
+      goto DestroyExit;
+    }
+
+    for ( i = 0; i < (FT_Int)imgHeight; i++ )
+      rows[i] = map->buffer + ( y_offset + i ) * map->pitch + x_offset * 4;
+
+    png_read_image( png, rows );
+
+    FT_FREE( rows );
+
+    png_read_end( png, info );
+
+  DestroyExit:
+    png_destroy_read_struct( &png, &info, NULL );
+    FT_Stream_Close( &stream );
+
+  Exit:
+    return error;
+  }
+
+#endif /* FT_CONFIG_OPTION_USE_PNG */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.h
new file mode 100644
index 0000000..a25086b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.h
@@ -0,0 +1,48 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pngshim.h                                                              */
+/*                                                                         */
+/*    PNG Bitmap glyph support.                                            */
+/*                                                                         */
+/*  Copyright 2013 by Google, Inc.                                         */
+/*  Written by Stuart Gill and Behdad Esfahbod.                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PNGSHIM_H__
+#define __PNGSHIM_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttload.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_USE_PNG
+
+  FT_LOCAL( FT_Error )
+  Load_SBit_Png( FT_Bitmap*       map,
+                 FT_Int           x_offset,
+                 FT_Int           y_offset,
+                 FT_Int           pix_bits,
+                 TT_SBit_Metrics  metrics,
+                 FT_Memory        memory,
+                 FT_Byte*         data,
+                 FT_UInt          png_len );
+
+#endif
+
+FT_END_HEADER
+
+#endif /* __PNGSHIM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/rules.mk
new file mode 100644
index 0000000..a6c956a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/rules.mk
@@ -0,0 +1,78 @@
+#
+# FreeType 2 SFNT driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2002-2007, 2009, 2011, 2013 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# SFNT driver directory
+#
+SFNT_DIR := $(SRC_DIR)/sfnt
+
+
+# compilation flags for the driver
+#
+SFNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SFNT_DIR))
+
+
+# SFNT driver sources (i.e., C files)
+#
+SFNT_DRV_SRC := $(SFNT_DIR)/ttload.c   \
+                $(SFNT_DIR)/ttmtx.c    \
+                $(SFNT_DIR)/ttcmap.c   \
+                $(SFNT_DIR)/ttsbit.c   \
+                $(SFNT_DIR)/ttpost.c   \
+                $(SFNT_DIR)/ttkern.c   \
+                $(SFNT_DIR)/ttbdf.c    \
+                $(SFNT_DIR)/sfobjs.c   \
+                $(SFNT_DIR)/sfdriver.c \
+                $(SFNT_DIR)/sfntpic.c  \
+                $(SFNT_DIR)/pngshim.c
+
+# SFNT driver headers
+#
+SFNT_DRV_H := $(SFNT_DRV_SRC:%c=%h)  \
+              $(SFNT_DIR)/sferrors.h
+
+
+# SFNT driver object(s)
+#
+#   SFNT_DRV_OBJ_M is used during `multi' builds.
+#   SFNT_DRV_OBJ_S is used during `single' builds.
+#
+SFNT_DRV_OBJ_M := $(SFNT_DRV_SRC:$(SFNT_DIR)/%.c=$(OBJ_DIR)/%.$O)
+SFNT_DRV_OBJ_S := $(OBJ_DIR)/sfnt.$O
+
+# SFNT driver source file for single build
+#
+SFNT_DRV_SRC_S := $(SFNT_DIR)/sfnt.c
+
+
+# SFNT driver - single object
+#
+$(SFNT_DRV_OBJ_S): $(SFNT_DRV_SRC_S) $(SFNT_DRV_SRC) \
+                   $(FREETYPE_H) $(SFNT_DRV_H)
+	$(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SFNT_DRV_SRC_S))
+
+
+# SFNT driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(SFNT_DIR)/%.c $(FREETYPE_H) $(SFNT_DRV_H)
+	$(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(SFNT_DRV_OBJ_S)
+DRV_OBJS_M += $(SFNT_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.c
new file mode 100644
index 0000000..1758383
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.c
@@ -0,0 +1,529 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfdriver.c                                                             */
+/*                                                                         */
+/*    High-level SFNT driver interface (body).                             */
+/*                                                                         */
+/*  Copyright 1996-2007, 2009-2013 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+#include "sfdriver.h"
+#include "ttload.h"
+#include "sfobjs.h"
+#include "sfntpic.h"
+
+#include "sferrors.h"
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#include "ttsbit.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#include "ttpost.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.h"
+#include "../../include/freetype/internal/services/svbdf.h"
+#endif
+
+#include "ttcmap.h"
+#include "ttkern.h"
+#include "ttmtx.h"
+
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svsfnt.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_sfdriver
+
+
+  /*
+   *  SFNT TABLE SERVICE
+   *
+   */
+
+  static void*
+  get_sfnt_table( TT_Face      face,
+                  FT_Sfnt_Tag  tag )
+  {
+    void*  table;
+
+
+    switch ( tag )
+    {
+    case ft_sfnt_head:
+      table = &face->header;
+      break;
+
+    case ft_sfnt_hhea:
+      table = &face->horizontal;
+      break;
+
+    case ft_sfnt_vhea:
+      table = face->vertical_info ? &face->vertical : 0;
+      break;
+
+    case ft_sfnt_os2:
+      table = face->os2.version == 0xFFFFU ? 0 : &face->os2;
+      break;
+
+    case ft_sfnt_post:
+      table = &face->postscript;
+      break;
+
+    case ft_sfnt_maxp:
+      table = &face->max_profile;
+      break;
+
+    case ft_sfnt_pclt:
+      table = face->pclt.Version ? &face->pclt : 0;
+      break;
+
+    default:
+      table = 0;
+    }
+
+    return table;
+  }
+
+
+  static FT_Error
+  sfnt_table_info( TT_Face    face,
+                   FT_UInt    idx,
+                   FT_ULong  *tag,
+                   FT_ULong  *offset,
+                   FT_ULong  *length )
+  {
+    if ( !offset || !length )
+      return FT_THROW( Invalid_Argument );
+
+    if ( !tag )
+      *length = face->num_tables;
+    else
+    {
+      if ( idx >= face->num_tables )
+        return FT_THROW( Table_Missing );
+
+      *tag    = face->dir_tables[idx].Tag;
+      *offset = face->dir_tables[idx].Offset;
+      *length = face->dir_tables[idx].Length;
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_DEFINE_SERVICE_SFNT_TABLEREC(
+    sfnt_service_sfnt_table,
+    (FT_SFNT_TableLoadFunc)tt_face_load_any,
+    (FT_SFNT_TableGetFunc) get_sfnt_table,
+    (FT_SFNT_TableInfoFunc)sfnt_table_info )
+
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+  /*
+   *  GLYPH DICT SERVICE
+   *
+   */
+
+  static FT_Error
+  sfnt_get_glyph_name( TT_Face     face,
+                       FT_UInt     glyph_index,
+                       FT_Pointer  buffer,
+                       FT_UInt     buffer_max )
+  {
+    FT_String*  gname;
+    FT_Error    error;
+
+
+    error = tt_face_get_ps_name( face, glyph_index, &gname );
+    if ( !error )
+      FT_STRCPYN( buffer, gname, buffer_max );
+
+    return error;
+  }
+
+
+  static FT_UInt
+  sfnt_get_name_index( TT_Face     face,
+                       FT_String*  glyph_name )
+  {
+    FT_Face  root = &face->root;
+
+    FT_UInt  i, max_gid = FT_UINT_MAX;
+
+
+    if ( root->num_glyphs < 0 )
+      return 0;
+    else if ( (FT_ULong)root->num_glyphs < FT_UINT_MAX )
+      max_gid = (FT_UInt)root->num_glyphs;
+    else
+      FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n",
+                  FT_UINT_MAX, root->num_glyphs ));
+
+    for ( i = 0; i < max_gid; i++ )
+    {
+      FT_String*  gname;
+      FT_Error    error = tt_face_get_ps_name( face, i, &gname );
+
+
+      if ( error )
+        continue;
+
+      if ( !ft_strcmp( glyph_name, gname ) )
+        return i;
+    }
+
+    return 0;
+  }
+
+
+  FT_DEFINE_SERVICE_GLYPHDICTREC(
+    sfnt_service_glyph_dict,
+    (FT_GlyphDict_GetNameFunc)  sfnt_get_glyph_name,
+    (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index )
+
+
+#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+  /*
+   *  POSTSCRIPT NAME SERVICE
+   *
+   */
+
+  static const char*
+  sfnt_get_ps_name( TT_Face  face )
+  {
+    FT_Int       n, found_win, found_apple;
+    const char*  result = NULL;
+
+
+    /* shouldn't happen, but just in case to avoid memory leaks */
+    if ( face->postscript_name )
+      return face->postscript_name;
+
+    /* scan the name table to see whether we have a Postscript name here, */
+    /* either in Macintosh or Windows platform encodings                  */
+    found_win   = -1;
+    found_apple = -1;
+
+    for ( n = 0; n < face->num_names; n++ )
+    {
+      TT_NameEntryRec*  name = face->name_table.names + n;
+
+
+      if ( name->nameID == 6 && name->stringLength > 0 )
+      {
+        if ( name->platformID == 3     &&
+             name->encodingID == 1     &&
+             name->languageID == 0x409 )
+          found_win = n;
+
+        if ( name->platformID == 1 &&
+             name->encodingID == 0 &&
+             name->languageID == 0 )
+          found_apple = n;
+      }
+    }
+
+    if ( found_win != -1 )
+    {
+      FT_Memory         memory = face->root.memory;
+      TT_NameEntryRec*  name   = face->name_table.names + found_win;
+      FT_UInt           len    = name->stringLength / 2;
+      FT_Error          error  = FT_Err_Ok;
+
+      FT_UNUSED( error );
+
+
+      if ( !FT_ALLOC( result, name->stringLength + 1 ) )
+      {
+        FT_Stream   stream = face->name_table.stream;
+        FT_String*  r      = (FT_String*)result;
+        FT_Byte*    p      = (FT_Byte*)name->string;
+
+
+        if ( FT_STREAM_SEEK( name->stringOffset ) ||
+             FT_FRAME_ENTER( name->stringLength ) )
+        {
+          FT_FREE( result );
+          name->stringLength = 0;
+          name->stringOffset = 0;
+          FT_FREE( name->string );
+
+          goto Exit;
+        }
+
+        p = (FT_Byte*)stream->cursor;
+
+        for ( ; len > 0; len--, p += 2 )
+        {
+          if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 )
+            *r++ = p[1];
+        }
+        *r = '\0';
+
+        FT_FRAME_EXIT();
+      }
+      goto Exit;
+    }
+
+    if ( found_apple != -1 )
+    {
+      FT_Memory         memory = face->root.memory;
+      TT_NameEntryRec*  name   = face->name_table.names + found_apple;
+      FT_UInt           len    = name->stringLength;
+      FT_Error          error  = FT_Err_Ok;
+
+      FT_UNUSED( error );
+
+
+      if ( !FT_ALLOC( result, len + 1 ) )
+      {
+        FT_Stream  stream = face->name_table.stream;
+
+
+        if ( FT_STREAM_SEEK( name->stringOffset ) ||
+             FT_STREAM_READ( result, len )        )
+        {
+          name->stringOffset = 0;
+          name->stringLength = 0;
+          FT_FREE( name->string );
+          FT_FREE( result );
+          goto Exit;
+        }
+        ((char*)result)[len] = '\0';
+      }
+    }
+
+  Exit:
+    face->postscript_name = result;
+    return result;
+  }
+
+
+  FT_DEFINE_SERVICE_PSFONTNAMEREC(
+    sfnt_service_ps_name,
+    (FT_PsName_GetFunc)sfnt_get_ps_name )
+
+
+  /*
+   *  TT CMAP INFO
+   */
+  FT_DEFINE_SERVICE_TTCMAPSREC(
+    tt_service_get_cmap_info,
+    (TT_CMap_Info_GetFunc)tt_get_cmap_info )
+
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+  static FT_Error
+  sfnt_get_charset_id( TT_Face       face,
+                       const char*  *acharset_encoding,
+                       const char*  *acharset_registry )
+  {
+    BDF_PropertyRec  encoding, registry;
+    FT_Error         error;
+
+
+    /* XXX: I don't know whether this is correct, since
+     *      tt_face_find_bdf_prop only returns something correct if we have
+     *      previously selected a size that is listed in the BDF table.
+     *      Should we change the BDF table format to include single offsets
+     *      for `CHARSET_REGISTRY' and `CHARSET_ENCODING'?
+     */
+    error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", &registry );
+    if ( !error )
+    {
+      error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding );
+      if ( !error )
+      {
+        if ( registry.type == BDF_PROPERTY_TYPE_ATOM &&
+             encoding.type == BDF_PROPERTY_TYPE_ATOM )
+        {
+          *acharset_encoding = encoding.u.atom;
+          *acharset_registry = registry.u.atom;
+        }
+        else
+          error = FT_THROW( Invalid_Argument );
+      }
+    }
+
+    return error;
+  }
+
+
+  FT_DEFINE_SERVICE_BDFRec(
+    sfnt_service_bdf,
+    (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id,
+    (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop )
+
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+
+  /*
+   *  SERVICE LIST
+   */
+
+#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF
+  FT_DEFINE_SERVICEDESCREC5(
+    sfnt_services,
+    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_GLYPH_DICT,           &SFNT_SERVICE_GLYPH_DICT_GET,
+    FT_SERVICE_ID_BDF,                  &SFNT_SERVICE_BDF_GET,
+    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
+#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+  FT_DEFINE_SERVICEDESCREC4(
+    sfnt_services,
+    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_GLYPH_DICT,           &SFNT_SERVICE_GLYPH_DICT_GET,
+    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
+#elif defined TT_CONFIG_OPTION_BDF
+  FT_DEFINE_SERVICEDESCREC4(
+    sfnt_services,
+    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_BDF,                  &SFNT_SERVICE_BDF_GET,
+    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
+#else
+  FT_DEFINE_SERVICEDESCREC3(
+    sfnt_services,
+    FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
+#endif
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  sfnt_get_interface( FT_Module    module,
+                      const char*  module_interface )
+  {
+    /* SFNT_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+    FT_Library  library;
+
+
+    if ( !module )
+      return NULL;
+    library = module->library;
+    if ( !library )
+      return NULL;
+#else
+    FT_UNUSED( module );
+#endif
+
+    return ft_service_list_lookup( SFNT_SERVICES_GET, module_interface );
+  }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#define PUT_EMBEDDED_BITMAPS( a )  a
+#else
+#define PUT_EMBEDDED_BITMAPS( a )  NULL
+#endif
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#define PUT_PS_NAMES( a )  a
+#else
+#define PUT_PS_NAMES( a )  NULL
+#endif
+
+  FT_DEFINE_SFNT_INTERFACE(
+    sfnt_interface,
+    tt_face_goto_table,
+
+    sfnt_init_face,
+    sfnt_load_face,
+    sfnt_done_face,
+    sfnt_get_interface,
+
+    tt_face_load_any,
+
+    tt_face_load_head,
+    tt_face_load_hhea,
+    tt_face_load_cmap,
+    tt_face_load_maxp,
+    tt_face_load_os2,
+    tt_face_load_post,
+
+    tt_face_load_name,
+    tt_face_free_name,
+
+    tt_face_load_kern,
+    tt_face_load_gasp,
+    tt_face_load_pclt,
+
+    /* see `ttload.h' */
+    PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ),
+
+    PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ),
+
+    /* see `ttpost.h' */
+    PUT_PS_NAMES( tt_face_get_ps_name   ),
+    PUT_PS_NAMES( tt_face_free_ps_names ),
+
+    /* since version 2.1.8 */
+    tt_face_get_kerning,
+
+    /* since version 2.2 */
+    tt_face_load_font_dir,
+    tt_face_load_hmtx,
+
+    /* see `ttsbit.h' and `sfnt.h' */
+    PUT_EMBEDDED_BITMAPS( tt_face_load_eblc ),
+    PUT_EMBEDDED_BITMAPS( tt_face_free_eblc ),
+
+    PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike     ),
+    PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ),
+
+    tt_face_get_metrics
+  )
+
+
+  FT_DEFINE_MODULE(
+    sfnt_module_class,
+
+    0,  /* not a font driver or renderer */
+    sizeof ( FT_ModuleRec ),
+
+    "sfnt",     /* driver name                            */
+    0x10000L,   /* driver version 1.0                     */
+    0x20000L,   /* driver requires FreeType 2.0 or higher */
+
+    (const void*)&SFNT_INTERFACE_GET,  /* module specific interface */
+
+    (FT_Module_Constructor)0,
+    (FT_Module_Destructor) 0,
+    (FT_Module_Requester)  sfnt_get_interface )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.h
new file mode 100644
index 0000000..7c743f9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.h
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfdriver.h                                                             */
+/*                                                                         */
+/*    High-level SFNT driver interface (specification).                    */
+/*                                                                         */
+/*  Copyright 1996-2001 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SFDRIVER_H__
+#define __SFDRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_DECLARE_MODULE( sfnt_module_class )
+
+
+FT_END_HEADER
+
+#endif /* __SFDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sferrors.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sferrors.h
new file mode 100644
index 0000000..f313707
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sferrors.h
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sferrors.h                                                             */
+/*                                                                         */
+/*    SFNT error codes (specification only).                               */
+/*                                                                         */
+/*  Copyright 2001, 2004, 2012, 2013 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the SFNT error enumeration constants.     */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __SFERRORS_H__
+#define __SFERRORS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  SFNT_Err_
+#define FT_ERR_BASE    FT_Mod_Err_SFNT
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __SFERRORS_H__ */
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.c
new file mode 100644
index 0000000..7d34eee
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.c
@@ -0,0 +1,143 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfntpic.c                                                              */
+/*                                                                         */
+/*    The FreeType position independent code services for sfnt module.     */
+/*                                                                         */
+/*  Copyright 2009, 2010, 2012, 2013 by                                    */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "sfntpic.h"
+#include "sferrors.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from sfdriver.c */
+  FT_Error
+  FT_Create_Class_sfnt_services( FT_Library           library,
+                                 FT_ServiceDescRec**  output_class );
+  void
+  FT_Destroy_Class_sfnt_services( FT_Library          library,
+                                  FT_ServiceDescRec*  clazz );
+  void
+  FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec*  clazz );
+  void
+  FT_Init_Class_sfnt_interface( FT_Library       library,
+                                SFNT_Interface*  clazz );
+  void
+  FT_Init_Class_sfnt_service_glyph_dict(
+    FT_Library                library,
+    FT_Service_GlyphDictRec*  clazz );
+  void
+  FT_Init_Class_sfnt_service_ps_name(
+    FT_Library                 library,
+    FT_Service_PsFontNameRec*  clazz );
+  void
+  FT_Init_Class_tt_service_get_cmap_info(
+    FT_Library              library,
+    FT_Service_TTCMapsRec*  clazz );
+  void
+  FT_Init_Class_sfnt_service_sfnt_table(
+    FT_Service_SFNT_TableRec*  clazz );
+
+
+  /* forward declaration of PIC init functions from ttcmap.c */
+  FT_Error
+  FT_Create_Class_tt_cmap_classes( FT_Library       library,
+                                   TT_CMap_Class**  output_class );
+  void
+  FT_Destroy_Class_tt_cmap_classes( FT_Library      library,
+                                    TT_CMap_Class*  clazz );
+
+
+  void
+  sfnt_module_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory          memory        = library->memory;
+
+
+    if ( pic_container->sfnt )
+    {
+      sfntModulePIC*  container = (sfntModulePIC*)pic_container->sfnt;
+
+
+      if ( container->sfnt_services )
+        FT_Destroy_Class_sfnt_services( library,
+                                        container->sfnt_services );
+      container->sfnt_services = NULL;
+
+      if ( container->tt_cmap_classes )
+        FT_Destroy_Class_tt_cmap_classes( library,
+                                          container->tt_cmap_classes );
+      container->tt_cmap_classes = NULL;
+
+      FT_FREE( container );
+      pic_container->sfnt = NULL;
+    }
+  }
+
+
+  FT_Error
+  sfnt_module_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = FT_Err_Ok;
+    sfntModulePIC*     container     = NULL;
+    FT_Memory          memory        = library->memory;
+
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->sfnt = container;
+
+    /* initialize pointer table -                       */
+    /* this is how the module usually expects this data */
+    error = FT_Create_Class_sfnt_services( library,
+                                           &container->sfnt_services );
+    if ( error )
+      goto Exit;
+
+    error = FT_Create_Class_tt_cmap_classes( library,
+                                             &container->tt_cmap_classes );
+    if ( error )
+      goto Exit;
+
+    FT_Init_Class_sfnt_service_glyph_dict(
+      library, &container->sfnt_service_glyph_dict );
+    FT_Init_Class_sfnt_service_ps_name(
+      library, &container->sfnt_service_ps_name );
+    FT_Init_Class_tt_service_get_cmap_info(
+      library, &container->tt_service_get_cmap_info );
+    FT_Init_Class_sfnt_service_sfnt_table(
+      &container->sfnt_service_sfnt_table );
+#ifdef TT_CONFIG_OPTION_BDF
+    FT_Init_Class_sfnt_service_bdf( &container->sfnt_service_bdf );
+#endif
+    FT_Init_Class_sfnt_interface( library, &container->sfnt_interface );
+
+  Exit:
+    if ( error )
+      sfnt_module_class_pic_free( library );
+    return error;
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.h
new file mode 100644
index 0000000..470f228
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.h
@@ -0,0 +1,114 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfntpic.h                                                              */
+/*                                                                         */
+/*    The FreeType position independent code services for sfnt module.     */
+/*                                                                         */
+/*  Copyright 2009, 2012 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SFNTPIC_H__
+#define __SFNTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define SFNT_SERVICES_GET            sfnt_services
+#define SFNT_SERVICE_GLYPH_DICT_GET  sfnt_service_glyph_dict
+#define SFNT_SERVICE_PS_NAME_GET     sfnt_service_ps_name
+#define TT_SERVICE_CMAP_INFO_GET     tt_service_get_cmap_info
+#define SFNT_SERVICES_GET            sfnt_services
+#define TT_CMAP_CLASSES_GET          tt_cmap_classes
+#define SFNT_SERVICE_SFNT_TABLE_GET  sfnt_service_sfnt_table
+#define SFNT_SERVICE_BDF_GET         sfnt_service_bdf
+#define SFNT_INTERFACE_GET           sfnt_interface
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+  /* some include files required for members of sfntModulePIC */
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svsfnt.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.h"
+#include "../../include/freetype/internal/services/svbdf.h"
+#endif
+
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "ttcmap.h"
+
+
+  typedef struct  sfntModulePIC_
+  {
+    FT_ServiceDescRec*        sfnt_services;
+    FT_Service_GlyphDictRec   sfnt_service_glyph_dict;
+    FT_Service_PsFontNameRec  sfnt_service_ps_name;
+    FT_Service_TTCMapsRec     tt_service_get_cmap_info;
+    TT_CMap_Class*            tt_cmap_classes;
+    FT_Service_SFNT_TableRec  sfnt_service_sfnt_table;
+#ifdef TT_CONFIG_OPTION_BDF
+    FT_Service_BDFRec         sfnt_service_bdf;
+#endif
+    SFNT_Interface            sfnt_interface;
+
+  } sfntModulePIC;
+
+
+#define GET_PIC( lib )                                      \
+          ( (sfntModulePIC*)( (lib)->pic_container.sfnt ) )
+
+#define SFNT_SERVICES_GET                       \
+          ( GET_PIC( library )->sfnt_services )
+#define SFNT_SERVICE_GLYPH_DICT_GET                       \
+          ( GET_PIC( library )->sfnt_service_glyph_dict )
+#define SFNT_SERVICE_PS_NAME_GET                       \
+          ( GET_PIC( library )->sfnt_service_ps_name )
+#define TT_SERVICE_CMAP_INFO_GET                           \
+          ( GET_PIC( library )->tt_service_get_cmap_info )
+#define SFNT_SERVICES_GET                       \
+          ( GET_PIC( library )->sfnt_services )
+#define TT_CMAP_CLASSES_GET                       \
+          ( GET_PIC( library )->tt_cmap_classes )
+#define SFNT_SERVICE_SFNT_TABLE_GET                       \
+          ( GET_PIC( library )->sfnt_service_sfnt_table )
+#define SFNT_SERVICE_BDF_GET                       \
+          ( GET_PIC( library )->sfnt_service_bdf )
+#define SFNT_INTERFACE_GET                       \
+          ( GET_PIC( library )->sfnt_interface )
+
+
+  /* see sfntpic.c for the implementation */
+  void
+  sfnt_module_class_pic_free( FT_Library  library );
+
+  FT_Error
+  sfnt_module_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __SFNTPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.c
new file mode 100644
index 0000000..2d5a388
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.c
@@ -0,0 +1,1165 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfobjs.c                                                               */
+/*                                                                         */
+/*    SFNT object management (base).                                       */
+/*                                                                         */
+/*  Copyright 1996-2008, 2010-2013 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "sfobjs.h"
+#include "ttload.h"
+#include "ttcmap.h"
+#include "ttkern.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ttnameid.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/ftsnames.h"
+#include "sferrors.h"
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.h"
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_sfobjs
+
+
+
+  /* convert a UTF-16 name entry to ASCII */
+  static FT_String*
+  tt_name_entry_ascii_from_utf16( TT_NameEntry  entry,
+                                  FT_Memory     memory )
+  {
+    FT_String*  string = NULL;
+    FT_UInt     len, code, n;
+    FT_Byte*    read   = (FT_Byte*)entry->string;
+    FT_Error    error;
+
+
+    len = (FT_UInt)entry->stringLength / 2;
+
+    if ( FT_NEW_ARRAY( string, len + 1 ) )
+      return NULL;
+
+    for ( n = 0; n < len; n++ )
+    {
+      code = FT_NEXT_USHORT( read );
+
+      if ( code == 0 )
+        break;
+
+      if (code > 255) /*Johnson 2010-10-09, #TESTDOC:0000042_QUT20005_5.pdf.*/
+		  code = code>>8&0x00ff;
+	  if ( code < 32 || code > 127 )
+        code = '?';
+
+      string[n] = (char)code;
+    }
+
+    string[n] = 0;
+
+    return string;
+  }
+
+
+  /* convert an Apple Roman or symbol name entry to ASCII */
+  static FT_String*
+  tt_name_entry_ascii_from_other( TT_NameEntry  entry,
+                                  FT_Memory     memory )
+  {
+    FT_String*  string = NULL;
+    FT_UInt     len, code, n;
+    FT_Byte*    read   = (FT_Byte*)entry->string;
+    FT_Error    error;
+
+
+    len = (FT_UInt)entry->stringLength;
+
+    if ( FT_NEW_ARRAY( string, len + 1 ) )
+      return NULL;
+
+    for ( n = 0; n < len; n++ )
+    {
+      code = *read++;
+
+      if ( code == 0 )
+        break;
+
+      if ( code < 32 || code > 127 )
+        code = '?';
+
+      string[n] = (char)code;
+    }
+
+    string[n] = 0;
+
+    return string;
+  }
+
+
+  typedef FT_String*  (*TT_NameEntry_ConvertFunc)( TT_NameEntry  entry,
+                                                   FT_Memory     memory );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_get_name                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Returns a given ENGLISH name record in ASCII.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the source face object.                      */
+  /*                                                                       */
+  /*    nameid :: The name id of the name record to return.                */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    name   :: The address of a string pointer.  NULL if no name is     */
+  /*              present.                                                 */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  tt_face_get_name( TT_Face      face,
+                    FT_UShort    nameid,
+                    FT_String**  name )
+  {
+    FT_Memory         memory = face->root.memory;
+    FT_Error          error  = FT_Err_Ok;
+    FT_String*        result = NULL;
+    FT_UShort         n;
+    TT_NameEntryRec*  rec;
+    FT_Int            found_apple         = -1;
+    FT_Int            found_apple_roman   = -1;
+    FT_Int            found_apple_english = -1;
+    FT_Int            found_win           = -1;
+    FT_Int            found_unicode       = -1;
+
+    FT_Bool           is_english = 0;
+
+    TT_NameEntry_ConvertFunc  convert;
+
+
+    FT_ASSERT( name );
+
+    rec = face->name_table.names;
+    for ( n = 0; n < face->num_names; n++, rec++ )
+    {
+      /* According to the OpenType 1.3 specification, only Microsoft or  */
+      /* Apple platform IDs might be used in the `name' table.  The      */
+      /* `Unicode' platform is reserved for the `cmap' table, and the    */
+      /* `ISO' one is deprecated.                                        */
+      /*                                                                 */
+      /* However, the Apple TrueType specification doesn't say the same  */
+      /* thing and goes to suggest that all Unicode `name' table entries */
+      /* should be coded in UTF-16 (in big-endian format I suppose).     */
+      /*                                                                 */
+      if ( rec->nameID == nameid && rec->stringLength > 0 )
+      {
+        switch ( rec->platformID )
+        {
+        case TT_PLATFORM_APPLE_UNICODE:
+        case TT_PLATFORM_ISO:
+          /* there is `languageID' to check there.  We should use this */
+          /* field only as a last solution when nothing else is        */
+          /* available.                                                */
+          /*                                                           */
+          found_unicode = n;
+          break;
+
+        case TT_PLATFORM_MACINTOSH:
+          /* This is a bit special because some fonts will use either    */
+          /* an English language id, or a Roman encoding id, to indicate */
+          /* the English version of its font name.                       */
+          /*                                                             */
+          if ( rec->languageID == TT_MAC_LANGID_ENGLISH )
+            found_apple_english = n;
+          else if ( rec->encodingID == TT_MAC_ID_ROMAN )
+            found_apple_roman = n;
+          break;
+
+        case TT_PLATFORM_MICROSOFT:
+          /* we only take a non-English name when there is nothing */
+          /* else available in the font                            */
+          /*                                                       */
+          if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 )
+          {
+            switch ( rec->encodingID )
+            {
+            case TT_MS_ID_SYMBOL_CS:
+            case TT_MS_ID_UNICODE_CS:
+            case TT_MS_ID_UCS_4:
+              is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 );
+              found_win  = n;
+              break;
+
+            default:
+              ;
+            }
+          }
+          break;
+
+        default:
+          ;
+        }
+      }
+    }
+
+    found_apple = found_apple_roman;
+    if ( found_apple_english >= 0 )
+      found_apple = found_apple_english;
+
+    /* some fonts contain invalid Unicode or Macintosh formatted entries; */
+    /* we will thus favor names encoded in Windows formats if available   */
+    /* (provided it is an English name)                                   */
+    /*                                                                    */
+    convert = NULL;
+    if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) )
+    {
+      rec = face->name_table.names + found_win;
+      switch ( rec->encodingID )
+      {
+        /* all Unicode strings are encoded using UTF-16BE */
+      case TT_MS_ID_UNICODE_CS:
+      case TT_MS_ID_SYMBOL_CS:
+        convert = tt_name_entry_ascii_from_utf16;
+        break;
+
+      case TT_MS_ID_UCS_4:
+        /* Apparently, if this value is found in a name table entry, it is */
+        /* documented as `full Unicode repertoire'.  Experience with the   */
+        /* MsGothic font shipped with Windows Vista shows that this really */
+        /* means UTF-16 encoded names (UCS-4 values are only used within   */
+        /* charmaps).                                                      */
+        convert = tt_name_entry_ascii_from_utf16;
+        break;
+
+      default:
+        ;
+      }
+    }
+    else if ( found_apple >= 0 )
+    {
+      rec     = face->name_table.names + found_apple;
+      convert = tt_name_entry_ascii_from_other;
+    }
+    else if ( found_unicode >= 0 )
+    {
+      rec     = face->name_table.names + found_unicode;
+      convert = tt_name_entry_ascii_from_utf16;
+    }
+
+    if ( rec && convert )
+    {
+      if ( rec->string == NULL )
+      {
+        FT_Stream  stream = face->name_table.stream;
+
+
+        if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) ||
+             FT_STREAM_SEEK( rec->stringOffset )              ||
+             FT_STREAM_READ( rec->string, rec->stringLength ) )
+        {
+          FT_FREE( rec->string );
+          rec->stringLength = 0;
+          result            = NULL;
+          goto Exit;
+        }
+      }
+
+      result = convert( rec, memory );
+    }
+
+  Exit:
+    *name = result;
+    return error;
+  }
+
+
+  static FT_Encoding
+  sfnt_find_encoding( int  platform_id,
+                      int  encoding_id )
+  {
+    typedef struct  TEncoding_
+    {
+      int          platform_id;
+      int          encoding_id;
+      FT_Encoding  encoding;
+
+    } TEncoding;
+
+    static
+    const TEncoding  tt_encodings[] =
+    {
+      { TT_PLATFORM_ISO,           -1,                  FT_ENCODING_UNICODE },
+
+      { TT_PLATFORM_APPLE_UNICODE, -1,                  FT_ENCODING_UNICODE },
+
+      { TT_PLATFORM_MACINTOSH,     TT_MAC_ID_ROMAN,     FT_ENCODING_APPLE_ROMAN },
+
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SYMBOL_CS,  FT_ENCODING_MS_SYMBOL },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UCS_4,      FT_ENCODING_UNICODE },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SJIS,       FT_ENCODING_SJIS },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_GB2312,     FT_ENCODING_GB2312 },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_BIG_5,      FT_ENCODING_BIG5 },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_WANSUNG,    FT_ENCODING_WANSUNG },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_JOHAB,      FT_ENCODING_JOHAB }
+    };
+
+    const TEncoding  *cur, *limit;
+
+
+    cur   = tt_encodings;
+    limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] );
+
+    for ( ; cur < limit; cur++ )
+    {
+      if ( cur->platform_id == platform_id )
+      {
+        if ( cur->encoding_id == encoding_id ||
+             cur->encoding_id == -1          )
+          return cur->encoding;
+      }
+    }
+
+    return FT_ENCODING_NONE;
+  }
+
+
+  /* Fill in face->ttc_header.  If the font is not a TTC, it is */
+  /* synthesized into a TTC with one offset table.              */
+  static FT_Error
+  sfnt_open_font( FT_Stream  stream,
+                  TT_Face    face )
+  {
+    FT_Memory  memory = stream->memory;
+    FT_Error   error;
+    FT_ULong   tag, offset;
+
+    static const FT_Frame_Field  ttc_header_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TTC_HeaderRec
+
+      FT_FRAME_START( 8 ),
+        FT_FRAME_LONG( version ),
+        FT_FRAME_LONG( count   ),  /* this is ULong in the specs */
+      FT_FRAME_END
+    };
+
+
+    face->ttc_header.tag     = 0;
+    face->ttc_header.version = 0;
+    face->ttc_header.count   = 0;
+
+    offset = FT_STREAM_POS();
+
+    if ( FT_READ_ULONG( tag ) )
+      return error;
+
+    if ( tag != 0x00010000UL &&
+         tag != TTAG_ttcf    &&
+         tag != TTAG_OTTO    &&
+         tag != TTAG_true    &&
+         tag != TTAG_typ1    &&
+         tag != 0x00020000UL )
+    {
+      FT_TRACE2(( "  not a font using the SFNT container format\n" ));
+      return FT_THROW( Unknown_File_Format );
+    }
+
+    face->ttc_header.tag = TTAG_ttcf;
+
+    if ( tag == TTAG_ttcf )
+    {
+      FT_Int  n;
+
+
+      FT_TRACE3(( "sfnt_open_font: file is a collection\n" ));
+
+      if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) )
+        return error;
+
+      if ( face->ttc_header.count == 0 )
+        return FT_THROW( Invalid_Table );
+
+      /* a rough size estimate: let's conservatively assume that there   */
+      /* is just a single table info in each subfont header (12 + 16*1 = */
+      /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */
+      /* size of the TTC header plus `28*count' bytes for all subfont    */
+      /* headers                                                         */
+      if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) )
+        return FT_THROW( Array_Too_Large );
+
+      /* now read the offsets of each font in the file */
+      if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) )
+        return error;
+
+      if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) )
+        return error;
+
+      for ( n = 0; n < face->ttc_header.count; n++ )
+        face->ttc_header.offsets[n] = FT_GET_ULONG();
+
+      FT_FRAME_EXIT();
+    }
+    else
+    {
+      FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" ));
+
+      face->ttc_header.version = 1 << 16;
+      face->ttc_header.count   = 1;
+
+      if ( FT_NEW( face->ttc_header.offsets ) )
+        return error;
+
+      face->ttc_header.offsets[0] = offset;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  sfnt_init_face( FT_Stream      stream,
+                  TT_Face        face,
+                  FT_Int         face_index,
+                  FT_Int         num_params,
+                  FT_Parameter*  params )
+  {
+    FT_Error        error;
+    FT_Library      library = face->root.driver->root.library;
+    SFNT_Service    sfnt;
+
+
+    /* for now, parameters are unused */
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+
+
+    sfnt = (SFNT_Service)face->sfnt;
+    if ( !sfnt )
+    {
+      sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" );
+      if ( !sfnt )
+      {
+        FT_ERROR(( "sfnt_init_face: cannot access `sfnt' module\n" ));
+        return FT_THROW( Missing_Module );
+      }
+
+      face->sfnt       = sfnt;
+      face->goto_table = sfnt->goto_table;
+    }
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS );
+
+    FT_TRACE2(( "SFNT driver\n" ));
+
+    error = sfnt_open_font( stream, face );
+    if ( error )
+      return error;
+
+    FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index ));
+
+    if ( face_index < 0 )
+      face_index = 0;
+
+    if ( face_index >= face->ttc_header.count )
+      return FT_THROW( Invalid_Argument );
+
+    if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) )
+      return error;
+
+    /* check that we have a valid TrueType file */
+    error = sfnt->load_font_dir( face, stream );
+    if ( error )
+      return error;
+
+    face->root.num_faces  = face->ttc_header.count;
+    face->root.face_index = face_index;
+
+    return error;
+  }
+
+
+#define LOAD_( x )                                          \
+  do {                                                      \
+    FT_TRACE2(( "`" #x "' " ));                             \
+    FT_TRACE3(( "-->\n" ));                                 \
+                                                            \
+    error = sfnt->load_ ## x( face, stream );               \
+                                                            \
+    FT_TRACE2(( "%s\n", ( !error )                          \
+                        ? "loaded"                          \
+                        : FT_ERR_EQ( error, Table_Missing ) \
+                          ? "missing"                       \
+                          : "failed to load" ));            \
+    FT_TRACE3(( "\n" ));                                    \
+  } while ( 0 )
+
+#define LOADM_( x, vertical )                               \
+  do {                                                      \
+    FT_TRACE2(( "`%s" #x "' ",                              \
+                vertical ? "vertical " : "" ));             \
+    FT_TRACE3(( "-->\n" ));                                 \
+                                                            \
+    error = sfnt->load_ ## x( face, stream, vertical );     \
+                                                            \
+    FT_TRACE2(( "%s\n", ( !error )                          \
+                        ? "loaded"                          \
+                        : FT_ERR_EQ( error, Table_Missing ) \
+                          ? "missing"                       \
+                          : "failed to load" ));            \
+    FT_TRACE3(( "\n" ));                                    \
+  } while ( 0 )
+
+#define GET_NAME( id, field )                                   \
+  do {                                                          \
+    error = tt_face_get_name( face, TT_NAME_ID_ ## id, field ); \
+    if ( error )                                                \
+      goto Exit;                                                \
+  } while ( 0 )
+
+
+  FT_LOCAL_DEF( FT_Error )
+  sfnt_load_face( FT_Stream      stream,
+                  TT_Face        face,
+                  FT_Int         face_index,
+                  FT_Int         num_params,
+                  FT_Parameter*  params )
+  {
+    FT_Error      error;
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+    FT_Error      psnames_error;
+#endif
+    FT_Bool       has_outline;
+    FT_Bool       is_apple_sbit;
+    FT_Bool       ignore_preferred_family    = FALSE;
+    FT_Bool       ignore_preferred_subfamily = FALSE;
+
+    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
+
+    FT_UNUSED( face_index );
+
+
+    /* Check parameters */
+
+    {
+      FT_Int  i;
+
+
+      for ( i = 0; i < num_params; i++ )
+      {
+        if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY )
+          ignore_preferred_family = TRUE;
+        else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY )
+          ignore_preferred_subfamily = TRUE;
+      }
+    }
+
+    /* Load tables */
+
+    /* We now support two SFNT-based bitmapped font formats.  They */
+    /* are recognized easily as they do not include a `glyf'       */
+    /* table.                                                      */
+    /*                                                             */
+    /* The first format comes from Apple, and uses a table named   */
+    /* `bhed' instead of `head' to store the font header (using    */
+    /* the same format).  It also doesn't include horizontal and   */
+    /* vertical metrics tables (i.e. `hhea' and `vhea' tables are  */
+    /* missing).                                                   */
+    /*                                                             */
+    /* The other format comes from Microsoft, and is used with     */
+    /* WinCE/PocketPC.  It looks like a standard TTF, except that  */
+    /* it doesn't contain outlines.                                */
+    /*                                                             */
+
+    FT_TRACE2(( "sfnt_load_face: %08p\n\n", face ));
+
+    /* do we have outlines in there? */
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 ||
+                           tt_face_lookup_table( face, TTAG_glyf )    != 0 ||
+                           tt_face_lookup_table( face, TTAG_CFF )     != 0 );
+#else
+    has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 ||
+                           tt_face_lookup_table( face, TTAG_CFF )  != 0 );
+#endif
+
+    is_apple_sbit = 0;
+
+    /* if this font doesn't contain outlines, we try to load */
+    /* a `bhed' table                                        */
+    if ( !has_outline && sfnt->load_bhed )
+    {
+      LOAD_( bhed );
+      is_apple_sbit = FT_BOOL( !error );
+    }
+
+    /* load the font header (`head' table) if this isn't an Apple */
+    /* sbit font file                                             */
+    if ( !is_apple_sbit )
+    {
+      LOAD_( head );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( face->header.Units_Per_EM == 0 )
+    {
+      error = FT_THROW( Invalid_Table );
+
+      goto Exit;
+    }
+
+    /* the following tables are often not present in embedded TrueType */
+    /* fonts within PDF documents, so don't check for them.            */
+    LOAD_( maxp );
+    LOAD_( cmap );
+
+    /* the following tables are optional in PCL fonts -- */
+    /* don't check for errors                            */
+    LOAD_( name );
+    LOAD_( post );
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+    psnames_error = error;
+#endif
+
+    /* do not load the metrics headers and tables if this is an Apple */
+    /* sbit font file                                                 */
+    if ( !is_apple_sbit )
+    {
+      /* load the `hhea' and `hmtx' tables */
+      LOADM_( hhea, 0 );
+      if ( !error )
+      {
+        LOADM_( hmtx, 0 );
+        if ( FT_ERR_EQ( error, Table_Missing ) )
+        {
+          error = FT_THROW( Hmtx_Table_Missing );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+          /* If this is an incrementally loaded font and there are */
+          /* overriding metrics, tolerate a missing `hmtx' table.  */
+          if ( face->root.internal->incremental_interface          &&
+               face->root.internal->incremental_interface->funcs->
+                 get_glyph_metrics                                 )
+          {
+            face->horizontal.number_Of_HMetrics = 0;
+            error                               = FT_Err_Ok;
+          }
+#endif
+        }
+      }
+      else if ( FT_ERR_EQ( error, Table_Missing ) )
+      {
+        /* No `hhea' table necessary for SFNT Mac fonts. */
+        if ( face->format_tag == TTAG_true )
+        {
+          FT_TRACE2(( "This is an SFNT Mac font.\n" ));
+
+          has_outline = 0;
+          error       = FT_Err_Ok;
+        }
+        else
+        {
+          error = FT_THROW( Horiz_Header_Missing );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+          /* If this is an incrementally loaded font and there are */
+          /* overriding metrics, tolerate a missing `hhea' table.  */
+          if ( face->root.internal->incremental_interface          &&
+               face->root.internal->incremental_interface->funcs->
+                 get_glyph_metrics                                 )
+          {
+            face->horizontal.number_Of_HMetrics = 0;
+            error                               = FT_Err_Ok;
+          }
+#endif
+
+        }
+      }
+
+      if ( error )
+       goto Exit;
+
+      /* try to load the `vhea' and `vmtx' tables */
+      LOADM_( hhea, 1 );
+      if ( !error )
+      {
+        LOADM_( hmtx, 1 );
+        if ( !error )
+          face->vertical_info = 1;
+      }
+
+      if ( error && FT_ERR_NEQ( error, Table_Missing ) )
+        goto Exit;
+
+      LOAD_( os2 );
+      if ( error )
+      {
+        /* we treat the table as missing if there are any errors */
+        face->os2.version = 0xFFFFU;
+      }
+    }
+
+    /* the optional tables */
+
+    /* embedded bitmap support */
+    if ( sfnt->load_eblc )
+    {
+      LOAD_( eblc );
+      if ( error )
+      {
+        /* a font which contains neither bitmaps nor outlines is */
+        /* still valid (although rather useless in most cases);  */
+        /* however, you can find such stripped fonts in PDFs     */
+        if ( FT_ERR_EQ( error, Table_Missing ) )
+          error = FT_Err_Ok;
+        else
+          goto Exit;
+      }
+    }
+
+    LOAD_( pclt );
+    if ( error )
+    {
+      if ( FT_ERR_NEQ( error, Table_Missing ) )
+        goto Exit;
+
+      face->pclt.Version = 0;
+    }
+
+    /* consider the kerning and gasp tables as optional */
+    LOAD_( gasp );
+    LOAD_( kern );
+
+    face->root.num_glyphs = face->max_profile.numGlyphs;
+
+    /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes  */
+    /* a WWS-only font face.  `WWS' stands for `weight', width', and */
+    /* `slope', a term used by Microsoft's Windows Presentation      */
+    /* Foundation (WPF).  This flag has been introduced in version   */
+    /* 1.5 of the OpenType specification (May 2008).                 */
+
+    face->root.family_name = NULL;
+    face->root.style_name  = NULL;
+    if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 )
+    {
+      if ( !ignore_preferred_family )
+        GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
+      if ( !face->root.family_name )
+        GET_NAME( FONT_FAMILY, &face->root.family_name );
+
+      if ( !ignore_preferred_subfamily )
+        GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
+      if ( !face->root.style_name )
+        GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
+    }
+    else
+    {
+      GET_NAME( WWS_FAMILY, &face->root.family_name );
+      if ( !face->root.family_name && !ignore_preferred_family )
+        GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
+      if ( !face->root.family_name )
+        GET_NAME( FONT_FAMILY, &face->root.family_name );
+
+      GET_NAME( WWS_SUBFAMILY, &face->root.style_name );
+      if ( !face->root.style_name && !ignore_preferred_subfamily )
+        GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
+      if ( !face->root.style_name )
+        GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
+    }
+
+    /* now set up root fields */
+    {
+      FT_Face  root  = &face->root;
+      FT_Long  flags = root->face_flags;
+
+
+      /*********************************************************************/
+      /*                                                                   */
+      /* Compute face flags.                                               */
+      /*                                                                   */
+      if ( has_outline == TRUE )
+        flags |= FT_FACE_FLAG_SCALABLE;   /* scalable outlines */
+
+      /* The sfnt driver only supports bitmap fonts natively, thus we */
+      /* don't set FT_FACE_FLAG_HINTER.                               */
+      flags |= FT_FACE_FLAG_SFNT       |  /* SFNT file format  */
+               FT_FACE_FLAG_HORIZONTAL;   /* horizontal data   */
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+      if ( !psnames_error                             &&
+           face->postscript.FormatType != 0x00030000L )
+        flags |= FT_FACE_FLAG_GLYPH_NAMES;
+#endif
+
+      /* fixed width font? */
+      if ( face->postscript.isFixedPitch )
+        flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+      /* vertical information? */
+      if ( face->vertical_info )
+        flags |= FT_FACE_FLAG_VERTICAL;
+
+      /* kerning available ? */
+      if ( TT_FACE_HAS_KERNING( face ) )
+        flags |= FT_FACE_FLAG_KERNING;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+      /* Don't bother to load the tables unless somebody asks for them. */
+      /* No need to do work which will (probably) not be used.          */
+      if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 &&
+           tt_face_lookup_table( face, TTAG_fvar ) != 0 &&
+           tt_face_lookup_table( face, TTAG_gvar ) != 0 )
+        flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
+#endif
+
+      root->face_flags = flags;
+
+      /*********************************************************************/
+      /*                                                                   */
+      /* Compute style flags.                                              */
+      /*                                                                   */
+
+      flags = 0;
+      if ( has_outline == TRUE && face->os2.version != 0xFFFFU )
+      {
+        /* We have an OS/2 table; use the `fsSelection' field.  Bit 9 */
+        /* indicates an oblique font face.  This flag has been        */
+        /* introduced in version 1.5 of the OpenType specification.   */
+
+        if ( face->os2.fsSelection & 512 )       /* bit 9 */
+          flags |= FT_STYLE_FLAG_ITALIC;
+        else if ( face->os2.fsSelection & 1 )    /* bit 0 */
+          flags |= FT_STYLE_FLAG_ITALIC;
+
+        if ( face->os2.fsSelection & 32 )        /* bit 5 */
+          flags |= FT_STYLE_FLAG_BOLD;
+      }
+      else
+      {
+        /* this is an old Mac font, use the header field */
+
+        if ( face->header.Mac_Style & 1 )
+          flags |= FT_STYLE_FLAG_BOLD;
+
+        if ( face->header.Mac_Style & 2 )
+          flags |= FT_STYLE_FLAG_ITALIC;
+      }
+
+      root->style_flags = flags;
+
+      /*********************************************************************/
+      /*                                                                   */
+      /* Polish the charmaps.                                              */
+      /*                                                                   */
+      /*   Try to set the charmap encoding according to the platform &     */
+      /*   encoding ID of each charmap.                                    */
+      /*                                                                   */
+
+      tt_face_build_cmaps( face );  /* ignore errors */
+
+
+      /* set the encoding fields */
+      {
+        FT_Int  m;
+
+
+        for ( m = 0; m < root->num_charmaps; m++ )
+        {
+          FT_CharMap  charmap = root->charmaps[m];
+
+
+          charmap->encoding = sfnt_find_encoding( charmap->platform_id,
+                                                  charmap->encoding_id );
+
+#if 0
+          if ( root->charmap     == NULL &&
+               charmap->encoding == FT_ENCODING_UNICODE )
+          {
+            /* set 'root->charmap' to the first Unicode encoding we find */
+            root->charmap = charmap;
+          }
+#endif
+        }
+      }
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+      /*
+       *  Now allocate the root array of FT_Bitmap_Size records and
+       *  populate them.  Unfortunately, it isn't possible to indicate bit
+       *  depths in the FT_Bitmap_Size record.  This is a design error.
+       */
+      {
+        FT_UInt  i, count;
+
+
+        count = face->sbit_num_strikes;
+
+        if ( count > 0 )
+        {
+          FT_Memory        memory   = face->root.stream->memory;
+          FT_UShort        em_size  = face->header.Units_Per_EM;
+          FT_Short         avgwidth = face->os2.xAvgCharWidth;
+          FT_Size_Metrics  metrics;
+
+
+          if ( em_size == 0 || face->os2.version == 0xFFFFU )
+          {
+            avgwidth = 0;
+            em_size = 1;
+          }
+
+          if ( FT_NEW_ARRAY( root->available_sizes, count ) )
+            goto Exit;
+
+          for ( i = 0; i < count; i++ )
+          {
+            FT_Bitmap_Size*  bsize = root->available_sizes + i;
+
+
+            error = sfnt->load_strike_metrics( face, i, &metrics );
+            if ( error )
+              goto Exit;
+
+            bsize->height = (FT_Short)( metrics.height >> 6 );
+            bsize->width = (FT_Short)(
+                ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size );
+
+            bsize->x_ppem = metrics.x_ppem << 6;
+            bsize->y_ppem = metrics.y_ppem << 6;
+
+            /* assume 72dpi */
+            bsize->size   = metrics.y_ppem << 6;
+          }
+
+          root->face_flags     |= FT_FACE_FLAG_FIXED_SIZES;
+          root->num_fixed_sizes = (FT_Int)count;
+        }
+      }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+      /* a font with no bitmaps and no outlines is scalable; */
+      /* it has only empty glyphs then                       */
+      if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) )
+        root->face_flags |= FT_FACE_FLAG_SCALABLE;
+
+
+      /*********************************************************************/
+      /*                                                                   */
+      /*  Set up metrics.                                                  */
+      /*                                                                   */
+      if ( FT_IS_SCALABLE( root ) )
+      {
+        /* XXX What about if outline header is missing */
+        /*     (e.g. sfnt wrapped bitmap)?             */
+        root->bbox.xMin    = face->header.xMin;
+        root->bbox.yMin    = face->header.yMin;
+        root->bbox.xMax    = face->header.xMax;
+        root->bbox.yMax    = face->header.yMax;
+        root->units_per_EM = face->header.Units_Per_EM;
+
+
+        /* XXX: Computing the ascender/descender/height is very different */
+        /*      from what the specification tells you.  Apparently, we    */
+        /*      must be careful because                                   */
+        /*                                                                */
+        /*      - not all fonts have an OS/2 table; in this case, we take */
+        /*        the values in the horizontal header.  However, these    */
+        /*        values very often are not reliable.                     */
+        /*                                                                */
+        /*      - otherwise, the correct typographic values are in the    */
+        /*        sTypoAscender, sTypoDescender & sTypoLineGap fields.    */
+        /*                                                                */
+        /*        However, certain fonts have these fields set to 0.      */
+        /*        Rather, they have usWinAscent & usWinDescent correctly  */
+        /*        set (but with different values).                        */
+        /*                                                                */
+        /*      As an example, Arial Narrow is implemented through four   */
+        /*      files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */
+        /*                                                                */
+        /*      Strangely, all fonts have the same values in their        */
+        /*      sTypoXXX fields, except ARIALNB which sets them to 0.     */
+        /*                                                                */
+        /*      On the other hand, they all have different                */
+        /*      usWinAscent/Descent values -- as a conclusion, the OS/2   */
+        /*      table cannot be used to compute the text height reliably! */
+        /*                                                                */
+
+        /* The ascender and descender are taken from the `hhea' table. */
+        /* If zero, they are taken from the `OS/2' table.              */
+
+        root->ascender  = face->horizontal.Ascender;
+        root->descender = face->horizontal.Descender;
+
+        root->height = (FT_Short)( root->ascender - root->descender +
+                                   face->horizontal.Line_Gap );
+
+        if ( !( root->ascender || root->descender ) )
+        {
+          if ( face->os2.version != 0xFFFFU )
+          {
+            if ( face->os2.sTypoAscender || face->os2.sTypoDescender )
+            {
+              root->ascender  = face->os2.sTypoAscender;
+              root->descender = face->os2.sTypoDescender;
+
+              root->height = (FT_Short)( root->ascender - root->descender +
+                                         face->os2.sTypoLineGap );
+            }
+            else
+            {
+              root->ascender  =  (FT_Short)face->os2.usWinAscent;
+              root->descender = -(FT_Short)face->os2.usWinDescent;
+
+              root->height = (FT_UShort)( root->ascender - root->descender );
+            }
+          }
+        }
+
+        root->max_advance_width  = face->horizontal.advance_Width_Max;
+        root->max_advance_height = (FT_Short)( face->vertical_info
+                                     ? face->vertical.advance_Height_Max
+                                     : root->height );
+
+        /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */
+        /* Adjust underline position from top edge to centre of     */
+        /* stroke to convert TrueType meaning to FreeType meaning.  */
+        root->underline_position  = face->postscript.underlinePosition -
+                                    face->postscript.underlineThickness / 2;
+        root->underline_thickness = face->postscript.underlineThickness;
+      }
+
+    }
+
+  Exit:
+    FT_TRACE2(( "sfnt_load_face: done\n" ));
+
+    return error;
+  }
+
+
+#undef LOAD_
+#undef LOADM_
+#undef GET_NAME
+
+
+  FT_LOCAL_DEF( void )
+  sfnt_done_face( TT_Face  face )
+  {
+    FT_Memory     memory;
+    SFNT_Service  sfnt;
+
+
+    if ( !face )
+      return;
+
+    memory = face->root.memory;
+    sfnt   = (SFNT_Service)face->sfnt;
+
+    if ( sfnt )
+    {
+      /* destroy the postscript names table if it is loaded */
+      if ( sfnt->free_psnames )
+        sfnt->free_psnames( face );
+
+      /* destroy the embedded bitmaps table if it is loaded */
+      if ( sfnt->free_eblc )
+        sfnt->free_eblc( face );
+    }
+
+#ifdef TT_CONFIG_OPTION_BDF
+    /* freeing the embedded BDF properties */
+    tt_face_free_bdf_props( face );
+#endif
+
+    /* freeing the kerning table */
+    tt_face_done_kern( face );
+
+    /* freeing the collection table */
+    FT_FREE( face->ttc_header.offsets );
+    face->ttc_header.count = 0;
+
+    /* freeing table directory */
+    FT_FREE( face->dir_tables );
+    face->num_tables = 0;
+
+    {
+      FT_Stream  stream = FT_FACE_STREAM( face );
+
+
+      /* simply release the 'cmap' table frame */
+      FT_FRAME_RELEASE( face->cmap_table );
+      face->cmap_size = 0;
+    }
+
+    /* freeing the horizontal metrics */
+    {
+      FT_Stream  stream = FT_FACE_STREAM( face );
+
+
+      FT_FRAME_RELEASE( face->horz_metrics );
+      FT_FRAME_RELEASE( face->vert_metrics );
+      face->horz_metrics_size = 0;
+      face->vert_metrics_size = 0;
+    }
+
+    /* freeing the vertical ones, if any */
+    if ( face->vertical_info )
+    {
+      FT_FREE( face->vertical.long_metrics  );
+      FT_FREE( face->vertical.short_metrics );
+      face->vertical_info = 0;
+    }
+
+    /* freeing the gasp table */
+    FT_FREE( face->gasp.gaspRanges );
+    face->gasp.numRanges = 0;
+
+    /* freeing the name table */
+    if ( sfnt )
+      sfnt->free_name( face );
+
+    /* freeing family and style name */
+    FT_FREE( face->root.family_name );
+    FT_FREE( face->root.style_name );
+
+    /* freeing sbit size table */
+    FT_FREE( face->root.available_sizes );
+    face->root.num_fixed_sizes = 0;
+
+    FT_FREE( face->postscript_name );
+
+    face->sfnt = 0;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.h
new file mode 100644
index 0000000..10be62c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.h
@@ -0,0 +1,54 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfobjs.h                                                               */
+/*                                                                         */
+/*    SFNT object management (specification).                              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SFOBJS_H__
+#define __SFOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  sfnt_init_face( FT_Stream      stream,
+                  TT_Face        face,
+                  FT_Int         face_index,
+                  FT_Int         num_params,
+                  FT_Parameter*  params );
+
+  FT_LOCAL( FT_Error )
+  sfnt_load_face( FT_Stream      stream,
+                  TT_Face        face,
+                  FT_Int         face_index,
+                  FT_Int         num_params,
+                  FT_Parameter*  params );
+
+  FT_LOCAL( void )
+  sfnt_done_face( TT_Face  face );
+
+
+FT_END_HEADER
+
+#endif /* __SFDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.c
new file mode 100644
index 0000000..7fb6365
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.c
@@ -0,0 +1,250 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttbdf.c                                                                */
+/*                                                                         */
+/*    TrueType and OpenType embedded BDF properties (body).                */
+/*                                                                         */
+/*  Copyright 2005, 2006, 2010, 2013 by                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttbdf.h"
+
+#include "sferrors.h"
+
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttbdf
+
+
+  FT_LOCAL_DEF( void )
+  tt_face_free_bdf_props( TT_Face  face )
+  {
+    TT_BDF  bdf = &face->bdf;
+
+
+    if ( bdf->loaded )
+    {
+      FT_Stream  stream = FT_FACE(face)->stream;
+
+
+      if ( bdf->table != NULL )
+        FT_FRAME_RELEASE( bdf->table );
+
+      bdf->table_end    = NULL;
+      bdf->strings      = NULL;
+      bdf->strings_size = 0;
+    }
+  }
+
+
+  static FT_Error
+  tt_face_load_bdf_props( TT_Face    face,
+                          FT_Stream  stream )
+  {
+    TT_BDF    bdf = &face->bdf;
+    FT_ULong  length;
+    FT_Error  error;
+
+
+    FT_ZERO( bdf );
+
+    error = tt_face_goto_table( face, TTAG_BDF, stream, &length );
+    if ( error                                  ||
+         length < 8                             ||
+         FT_FRAME_EXTRACT( length, bdf->table ) )
+    {
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    bdf->table_end = bdf->table + length;
+
+    {
+      FT_Byte*   p           = bdf->table;
+      FT_UInt    version     = FT_NEXT_USHORT( p );
+      FT_UInt    num_strikes = FT_NEXT_USHORT( p );
+      FT_ULong   strings     = FT_NEXT_ULONG ( p );
+      FT_UInt    count;
+      FT_Byte*   strike;
+
+
+      if ( version != 0x0001                 ||
+           strings < 8                       ||
+           ( strings - 8 ) / 4 < num_strikes ||
+           strings + 1 > length              )
+      {
+        goto BadTable;
+      }
+
+      bdf->num_strikes  = num_strikes;
+      bdf->strings      = bdf->table + strings;
+      bdf->strings_size = length - strings;
+
+      count  = bdf->num_strikes;
+      p      = bdf->table + 8;
+      strike = p + count * 4;
+
+
+      for ( ; count > 0; count-- )
+      {
+        FT_UInt  num_items = FT_PEEK_USHORT( p + 2 );
+
+        /*
+         *  We don't need to check the value sets themselves, since this
+         *  is done later.
+         */
+        strike += 10 * num_items;
+
+        p += 4;
+      }
+
+      if ( strike > bdf->strings )
+        goto BadTable;
+    }
+
+    bdf->loaded = 1;
+
+  Exit:
+    return error;
+
+  BadTable:
+    FT_FRAME_RELEASE( bdf->table );
+    FT_ZERO( bdf );
+    error = FT_THROW( Invalid_Table );
+    goto Exit;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_find_bdf_prop( TT_Face           face,
+                         const char*       property_name,
+                         BDF_PropertyRec  *aprop )
+  {
+    TT_BDF     bdf   = &face->bdf;
+    FT_Size    size  = FT_FACE(face)->size;
+    FT_Error   error = FT_Err_Ok;
+    FT_Byte*   p;
+    FT_UInt    count;
+    FT_Byte*   strike;
+    FT_Offset  property_len;
+
+
+    aprop->type = BDF_PROPERTY_TYPE_NONE;
+
+    if ( bdf->loaded == 0 )
+    {
+      error = tt_face_load_bdf_props( face, FT_FACE( face )->stream );
+      if ( error )
+        goto Exit;
+    }
+
+    count  = bdf->num_strikes;
+    p      = bdf->table + 8;
+    strike = p + 4 * count;
+
+    error = FT_ERR( Invalid_Argument );
+
+    if ( size == NULL || property_name == NULL )
+      goto Exit;
+
+    property_len = ft_strlen( property_name );
+    if ( property_len == 0 )
+      goto Exit;
+
+    for ( ; count > 0; count-- )
+    {
+      FT_UInt  _ppem  = FT_NEXT_USHORT( p );
+      FT_UInt  _count = FT_NEXT_USHORT( p );
+
+      if ( _ppem == size->metrics.y_ppem )
+      {
+        count = _count;
+        goto FoundStrike;
+      }
+
+      strike += 10 * _count;
+    }
+    goto Exit;
+
+  FoundStrike:
+    p = strike;
+    for ( ; count > 0; count-- )
+    {
+      FT_UInt  type = FT_PEEK_USHORT( p + 4 );
+
+      if ( ( type & 0x10 ) != 0 )
+      {
+        FT_UInt32  name_offset = FT_PEEK_ULONG( p     );
+        FT_UInt32  value       = FT_PEEK_ULONG( p + 6 );
+
+        /* be a bit paranoid for invalid entries here */
+        if ( name_offset < bdf->strings_size                    &&
+             property_len < bdf->strings_size - name_offset     &&
+             ft_strncmp( property_name,
+                         (const char*)bdf->strings + name_offset,
+                         bdf->strings_size - name_offset ) == 0 )
+        {
+          switch ( type & 0x0F )
+          {
+          case 0x00:  /* string */
+          case 0x01:  /* atoms */
+            /* check that the content is really 0-terminated */
+            if ( value < bdf->strings_size &&
+                 ft_memchr( bdf->strings + value, 0, bdf->strings_size ) )
+            {
+              aprop->type   = BDF_PROPERTY_TYPE_ATOM;
+              aprop->u.atom = (const char*)bdf->strings + value;
+              error         = FT_Err_Ok;
+              goto Exit;
+            }
+            break;
+
+          case 0x02:
+            aprop->type      = BDF_PROPERTY_TYPE_INTEGER;
+            aprop->u.integer = (FT_Int32)value;
+            error            = FT_Err_Ok;
+            goto Exit;
+
+          case 0x03:
+            aprop->type       = BDF_PROPERTY_TYPE_CARDINAL;
+            aprop->u.cardinal = value;
+            error             = FT_Err_Ok;
+            goto Exit;
+
+          default:
+            ;
+          }
+        }
+      }
+      p += 10;
+    }
+
+  Exit:
+    return error;
+  }
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.h
new file mode 100644
index 0000000..f9d2022
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.h
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttbdf.h                                                                */
+/*                                                                         */
+/*    TrueType and OpenType embedded BDF properties (specification).       */
+/*                                                                         */
+/*  Copyright 2005 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTBDF_H__
+#define __TTBDF_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttload.h"
+#include "../../include/freetype/ftbdf.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( void )
+  tt_face_free_bdf_props( TT_Face  face );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_find_bdf_prop( TT_Face           face,
+                         const char*       property_name,
+                         BDF_PropertyRec  *aprop );
+
+
+FT_END_HEADER
+
+#endif /* __TTBDF_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.c
new file mode 100644
index 0000000..668ea7d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.c
@@ -0,0 +1,3560 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttcmap.c                                                               */
+/*                                                                         */
+/*    TrueType character mapping table (cmap) support (body).              */
+/*                                                                         */
+/*  Copyright 2002-2010, 2012, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "sferrors.h"           /* must come before FT_INTERNAL_VALIDATE_H */
+
+#include "../../include/freetype/internal/ftvalid.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "ttload.h"
+#include "ttcmap.h"
+#include "sfntpic.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttcmap
+
+
+#define TT_PEEK_SHORT   FT_PEEK_SHORT
+#define TT_PEEK_USHORT  FT_PEEK_USHORT
+#define TT_PEEK_UINT24  FT_PEEK_UOFF3
+#define TT_PEEK_LONG    FT_PEEK_LONG
+#define TT_PEEK_ULONG   FT_PEEK_ULONG
+
+#define TT_NEXT_SHORT   FT_NEXT_SHORT
+#define TT_NEXT_USHORT  FT_NEXT_USHORT
+#define TT_NEXT_UINT24  FT_NEXT_UOFF3
+#define TT_NEXT_LONG    FT_NEXT_LONG
+#define TT_NEXT_ULONG   FT_NEXT_ULONG
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap_init( TT_CMap   cmap,
+                FT_Byte*  table )
+  {
+    cmap->data = table;
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           FORMAT 0                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME        OFFSET         TYPE          DESCRIPTION                */
+  /*                                                                       */
+  /*   format      0              USHORT        must be 0                  */
+  /*   length      2              USHORT        table length in bytes      */
+  /*   language    4              USHORT        Mac language code          */
+  /*   glyph_ids   6              BYTE[256]     array of glyph indices     */
+  /*               262                                                     */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_0
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap0_validate( FT_Byte*      table,
+                     FT_Validator  valid )
+  {
+    FT_Byte*  p      = table + 2;
+    FT_UInt   length = TT_NEXT_USHORT( p );
+
+
+    if ( table + length > valid->limit || length < 262 )
+      FT_INVALID_TOO_SHORT;
+
+    /* check glyph indices whenever necessary */
+    if ( valid->level >= FT_VALIDATE_TIGHT )
+    {
+      FT_UInt  n, idx;
+
+
+      p = table + 6;
+      for ( n = 0; n < 256; n++ )
+      {
+        idx = *p++;
+        if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
+          FT_INVALID_GLYPH_ID;
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap0_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
+  {
+    FT_Byte*  table = cmap->data;
+
+
+    return char_code < 256 ? table[6 + char_code] : 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap0_char_next( TT_CMap     cmap,
+                      FT_UInt32  *pchar_code )
+  {
+    FT_Byte*   table    = cmap->data;
+    FT_UInt32  charcode = *pchar_code;
+    FT_UInt32  result   = 0;
+    FT_UInt    gindex   = 0;
+
+
+    table += 6;  /* go to glyph IDs */
+    while ( ++charcode < 256 )
+    {
+      gindex = table[charcode];
+      if ( gindex != 0 )
+      {
+        result = charcode;
+        break;
+      }
+    }
+
+    *pchar_code = result;
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap0_get_info( TT_CMap       cmap,
+                     TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 4;
+
+
+    cmap_info->format   = 0;
+    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(
+    tt_cmap0_class_rec,
+    sizeof ( TT_CMapRec ),
+
+    (FT_CMap_InitFunc)     tt_cmap_init,
+    (FT_CMap_DoneFunc)     NULL,
+    (FT_CMap_CharIndexFunc)tt_cmap0_char_index,
+    (FT_CMap_CharNextFunc) tt_cmap0_char_next,
+
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+
+    0,
+    (TT_CMap_ValidateFunc)tt_cmap0_validate,
+    (TT_CMap_Info_GetFunc)tt_cmap0_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_0 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          FORMAT 2                             *****/
+  /*****                                                               *****/
+  /***** This is used for certain CJK encodings that encode text in a  *****/
+  /***** mixed 8/16 bits encoding along the following lines:           *****/
+  /*****                                                               *****/
+  /***** * Certain byte values correspond to an 8-bit character code   *****/
+  /*****   (typically in the range 0..127 for ASCII compatibility).    *****/
+  /*****                                                               *****/
+  /***** * Certain byte values signal the first byte of a 2-byte       *****/
+  /*****   character code (but these values are also valid as the      *****/
+  /*****   second byte of a 2-byte character).                         *****/
+  /*****                                                               *****/
+  /***** The following charmap lookup and iteration functions all      *****/
+  /***** assume that the value "charcode" correspond to following:     *****/
+  /*****                                                               *****/
+  /*****   - For one byte characters, "charcode" is simply the         *****/
+  /*****     character code.                                           *****/
+  /*****                                                               *****/
+  /*****   - For two byte characters, "charcode" is the 2-byte         *****/
+  /*****     character code in big endian format.  More exactly:       *****/
+  /*****                                                               *****/
+  /*****       (charcode >> 8)    is the first byte value              *****/
+  /*****       (charcode & 0xFF)  is the second byte value             *****/
+  /*****                                                               *****/
+  /***** Note that not all values of "charcode" are valid according    *****/
+  /***** to these rules, and the function moderately check the         *****/
+  /***** arguments.                                                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME        OFFSET         TYPE            DESCRIPTION              */
+  /*                                                                       */
+  /*   format      0              USHORT          must be 2                */
+  /*   length      2              USHORT          table length in bytes    */
+  /*   language    4              USHORT          Mac language code        */
+  /*   keys        6              USHORT[256]     sub-header keys          */
+  /*   subs        518            SUBHEAD[NSUBS]  sub-headers array        */
+  /*   glyph_ids   518+NSUB*8     USHORT[]        glyph ID array           */
+  /*                                                                       */
+  /* The `keys' table is used to map charcode high-bytes to sub-headers.   */
+  /* The value of `NSUBS' is the number of sub-headers defined in the      */
+  /* table and is computed by finding the maximum of the `keys' table.     */
+  /*                                                                       */
+  /* Note that for any n, `keys[n]' is a byte offset within the `subs'     */
+  /* table, i.e., it is the corresponding sub-header index multiplied      */
+  /* by 8.                                                                 */
+  /*                                                                       */
+  /* Each sub-header has the following format:                             */
+  /*                                                                       */
+  /*   NAME        OFFSET      TYPE            DESCRIPTION                 */
+  /*                                                                       */
+  /*   first       0           USHORT          first valid low-byte        */
+  /*   count       2           USHORT          number of valid low-bytes   */
+  /*   delta       4           SHORT           see below                   */
+  /*   offset      6           USHORT          see below                   */
+  /*                                                                       */
+  /* A sub-header defines, for each high-byte, the range of valid          */
+  /* low-bytes within the charmap.  Note that the range defined by `first' */
+  /* and `count' must be completely included in the interval [0..255]      */
+  /* according to the specification.                                       */
+  /*                                                                       */
+  /* If a character code is contained within a given sub-header, then      */
+  /* mapping it to a glyph index is done as follows:                       */
+  /*                                                                       */
+  /* * The value of `offset' is read.  This is a _byte_ distance from the  */
+  /*   location of the `offset' field itself into a slice of the           */
+  /*   `glyph_ids' table.  Let's call it `slice' (it is a USHORT[] too).   */
+  /*                                                                       */
+  /* * The value `slice[char.lo - first]' is read.  If it is 0, there is   */
+  /*   no glyph for the charcode.  Otherwise, the value of `delta' is      */
+  /*   added to it (modulo 65536) to form a new glyph index.               */
+  /*                                                                       */
+  /* It is up to the validation routine to check that all offsets fall     */
+  /* within the glyph IDs table (and not within the `subs' table itself or */
+  /* outside of the CMap).                                                 */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_2
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap2_validate( FT_Byte*      table,
+                     FT_Validator  valid )
+  {
+    FT_Byte*  p      = table + 2;           /* skip format */
+    FT_UInt   length = TT_PEEK_USHORT( p );
+    FT_UInt   n, max_subs;
+    FT_Byte*  keys;                         /* keys table */
+    FT_Byte*  subs;                         /* sub-headers */
+    FT_Byte*  glyph_ids;                    /* glyph ID array */
+
+
+    if ( table + length > valid->limit || length < 6 + 512 )
+      FT_INVALID_TOO_SHORT;
+
+    keys = table + 6;
+
+    /* parse keys to compute sub-headers count */
+    p        = keys;
+    max_subs = 0;
+    for ( n = 0; n < 256; n++ )
+    {
+      FT_UInt  idx = TT_NEXT_USHORT( p );
+
+
+      /* value must be multiple of 8 */
+      if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 )
+        FT_INVALID_DATA;
+
+      idx >>= 3;
+
+      if ( idx > max_subs )
+        max_subs = idx;
+    }
+
+    FT_ASSERT( p == table + 518 );
+
+    subs      = p;
+    glyph_ids = subs + (max_subs + 1) * 8;
+    if ( glyph_ids > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    /* parse sub-headers */
+    for ( n = 0; n <= max_subs; n++ )
+    {
+      FT_UInt   first_code, code_count, offset;
+      FT_Int    delta;
+      FT_Byte*  ids;
+
+
+      first_code = TT_NEXT_USHORT( p );
+      code_count = TT_NEXT_USHORT( p );
+      delta      = TT_NEXT_SHORT( p );
+      offset     = TT_NEXT_USHORT( p );
+
+      /* many Dynalab fonts have empty sub-headers */
+      if ( code_count == 0 )
+        continue;
+
+      /* check range within 0..255 */
+      if ( valid->level >= FT_VALIDATE_PARANOID )
+      {
+        if ( first_code >= 256 || first_code + code_count > 256 )
+          FT_INVALID_DATA;
+      }
+
+      /* check offset */
+      if ( offset != 0 )
+      {
+        ids = p - 2 + offset;
+        if ( ids < glyph_ids || ids + code_count*2 > table + length )
+          FT_INVALID_OFFSET;
+
+        /* check glyph IDs */
+        if ( valid->level >= FT_VALIDATE_TIGHT )
+        {
+          FT_Byte*  limit = p + code_count * 2;
+          FT_UInt   idx;
+
+
+          for ( ; p < limit; )
+          {
+            idx = TT_NEXT_USHORT( p );
+            if ( idx != 0 )
+            {
+              idx = ( idx + delta ) & 0xFFFFU;
+              if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
+                FT_INVALID_GLYPH_ID;
+            }
+          }
+        }
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  /* return sub header corresponding to a given character code */
+  /* NULL on invalid charcode                                  */
+  static FT_Byte*
+  tt_cmap2_get_subheader( FT_Byte*   table,
+                          FT_UInt32  char_code )
+  {
+    FT_Byte*  result = NULL;
+
+
+    if ( char_code < 0x10000UL )
+    {
+      FT_UInt   char_lo = (FT_UInt)( char_code & 0xFF );
+      FT_UInt   char_hi = (FT_UInt)( char_code >> 8 );
+      FT_Byte*  p       = table + 6;    /* keys table */
+      FT_Byte*  subs    = table + 518;  /* subheaders table */
+      FT_Byte*  sub;
+
+
+      if ( char_hi == 0 )
+      {
+        /* an 8-bit character code -- we use subHeader 0 in this case */
+        /* to test whether the character code is in the charmap       */
+        /*                                                            */
+        sub = subs;  /* jump to first sub-header */
+
+        /* check that the sub-header for this byte is 0, which */
+        /* indicates that it is really a valid one-byte value  */
+        /* Otherwise, return 0                                 */
+        /*                                                     */
+        p += char_lo * 2;
+        if ( TT_PEEK_USHORT( p ) != 0 )
+          goto Exit;
+      }
+      else
+      {
+        /* a 16-bit character code */
+
+        /* jump to key entry  */
+        p  += char_hi * 2;
+        /* jump to sub-header */
+        sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) );
+
+        /* check that the high byte isn't a valid one-byte value */
+        if ( sub == subs )
+          goto Exit;
+      }
+      result = sub;
+    }
+  Exit:
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap2_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
+  {
+    FT_Byte*  table   = cmap->data;
+    FT_UInt   result  = 0;
+    FT_Byte*  subheader;
+
+
+    subheader = tt_cmap2_get_subheader( table, char_code );
+    if ( subheader )
+    {
+      FT_Byte*  p   = subheader;
+      FT_UInt   idx = (FT_UInt)(char_code & 0xFF);
+      FT_UInt   start, count;
+      FT_Int    delta;
+      FT_UInt   offset;
+
+
+      start  = TT_NEXT_USHORT( p );
+      count  = TT_NEXT_USHORT( p );
+      delta  = TT_NEXT_SHORT ( p );
+      offset = TT_PEEK_USHORT( p );
+
+      idx -= start;
+      if ( idx < count && offset != 0 )
+      {
+        p  += offset + 2 * idx;
+        idx = TT_PEEK_USHORT( p );
+
+        if ( idx != 0 )
+          result = (FT_UInt)( idx + delta ) & 0xFFFFU;
+      }
+    }
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap2_char_next( TT_CMap     cmap,
+                      FT_UInt32  *pcharcode )
+  {
+    FT_Byte*   table    = cmap->data;
+    FT_UInt    gindex   = 0;
+    FT_UInt32  result   = 0;
+    FT_UInt32  charcode = *pcharcode + 1;
+    FT_Byte*   subheader;
+
+
+    while ( charcode < 0x10000UL )
+    {
+      subheader = tt_cmap2_get_subheader( table, charcode );
+      if ( subheader )
+      {
+        FT_Byte*  p       = subheader;
+        FT_UInt   start   = TT_NEXT_USHORT( p );
+        FT_UInt   count   = TT_NEXT_USHORT( p );
+        FT_Int    delta   = TT_NEXT_SHORT ( p );
+        FT_UInt   offset  = TT_PEEK_USHORT( p );
+        FT_UInt   char_lo = (FT_UInt)( charcode & 0xFF );
+        FT_UInt   pos, idx;
+
+
+        if ( offset == 0 )
+          goto Next_SubHeader;
+
+        if ( char_lo < start )
+        {
+          char_lo = start;
+          pos     = 0;
+        }
+        else
+          pos = (FT_UInt)( char_lo - start );
+
+        p       += offset + pos * 2;
+        charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo;
+
+        for ( ; pos < count; pos++, charcode++ )
+        {
+          idx = TT_NEXT_USHORT( p );
+
+          if ( idx != 0 )
+          {
+            gindex = ( idx + delta ) & 0xFFFFU;
+            if ( gindex != 0 )
+            {
+              result = charcode;
+              goto Exit;
+            }
+          }
+        }
+      }
+
+      /* jump to next sub-header, i.e. higher byte value */
+    Next_SubHeader:
+      charcode = FT_PAD_FLOOR( charcode, 256 ) + 256;
+    }
+
+  Exit:
+    *pcharcode = result;
+
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap2_get_info( TT_CMap       cmap,
+                     TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 4;
+
+
+    cmap_info->format   = 2;
+    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(
+    tt_cmap2_class_rec,
+    sizeof ( TT_CMapRec ),
+
+    (FT_CMap_InitFunc)     tt_cmap_init,
+    (FT_CMap_DoneFunc)     NULL,
+    (FT_CMap_CharIndexFunc)tt_cmap2_char_index,
+    (FT_CMap_CharNextFunc) tt_cmap2_char_next,
+
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+
+    2,
+    (TT_CMap_ValidateFunc)tt_cmap2_validate,
+    (TT_CMap_Info_GetFunc)tt_cmap2_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_2 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           FORMAT 4                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME          OFFSET         TYPE              DESCRIPTION          */
+  /*                                                                       */
+  /*   format        0              USHORT            must be 4            */
+  /*   length        2              USHORT            table length         */
+  /*                                                  in bytes             */
+  /*   language      4              USHORT            Mac language code    */
+  /*                                                                       */
+  /*   segCountX2    6              USHORT            2*NUM_SEGS           */
+  /*   searchRange   8              USHORT            2*(1 << LOG_SEGS)    */
+  /*   entrySelector 10             USHORT            LOG_SEGS             */
+  /*   rangeShift    12             USHORT            segCountX2 -         */
+  /*                                                    searchRange        */
+  /*                                                                       */
+  /*   endCount      14             USHORT[NUM_SEGS]  end charcode for     */
+  /*                                                  each segment; last   */
+  /*                                                  is 0xFFFF            */
+  /*                                                                       */
+  /*   pad           14+NUM_SEGS*2  USHORT            padding              */
+  /*                                                                       */
+  /*   startCount    16+NUM_SEGS*2  USHORT[NUM_SEGS]  first charcode for   */
+  /*                                                  each segment         */
+  /*                                                                       */
+  /*   idDelta       16+NUM_SEGS*4  SHORT[NUM_SEGS]   delta for each       */
+  /*                                                  segment              */
+  /*   idOffset      16+NUM_SEGS*6  SHORT[NUM_SEGS]   range offset for     */
+  /*                                                  each segment; can be */
+  /*                                                  zero                 */
+  /*                                                                       */
+  /*   glyphIds      16+NUM_SEGS*8  USHORT[]          array of glyph ID    */
+  /*                                                  ranges               */
+  /*                                                                       */
+  /* Character codes are modelled by a series of ordered (increasing)      */
+  /* intervals called segments.  Each segment has start and end codes,     */
+  /* provided by the `startCount' and `endCount' arrays.  Segments must    */
+  /* not overlap, and the last segment should always contain the value     */
+  /* 0xFFFF for `endCount'.                                                */
+  /*                                                                       */
+  /* The fields `searchRange', `entrySelector' and `rangeShift' are better */
+  /* ignored (they are traces of over-engineering in the TrueType          */
+  /* specification).                                                       */
+  /*                                                                       */
+  /* Each segment also has a signed `delta', as well as an optional offset */
+  /* within the `glyphIds' table.                                          */
+  /*                                                                       */
+  /* If a segment's idOffset is 0, the glyph index corresponding to any    */
+  /* charcode within the segment is obtained by adding the value of        */
+  /* `idDelta' directly to the charcode, modulo 65536.                     */
+  /*                                                                       */
+  /* Otherwise, a glyph index is taken from the glyph IDs sub-array for    */
+  /* the segment, and the value of `idDelta' is added to it.               */
+  /*                                                                       */
+  /*                                                                       */
+  /* Finally, note that a lot of fonts contain an invalid last segment,    */
+  /* where `start' and `end' are correctly set to 0xFFFF but both `delta'  */
+  /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with     */
+  /* OpenOffice.org).  We need special code to deal with them correctly.   */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_4
+
+  typedef struct  TT_CMap4Rec_
+  {
+    TT_CMapRec  cmap;
+    FT_UInt32   cur_charcode;   /* current charcode */
+    FT_UInt     cur_gindex;     /* current glyph index */
+
+    FT_UInt     num_ranges;
+    FT_UInt     cur_range;
+    FT_UInt     cur_start;
+    FT_UInt     cur_end;
+    FT_Int      cur_delta;
+    FT_Byte*    cur_values;
+
+  } TT_CMap4Rec, *TT_CMap4;
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap4_init( TT_CMap4  cmap,
+                 FT_Byte*  table )
+  {
+    FT_Byte*  p;
+
+
+    cmap->cmap.data    = table;
+
+    p                  = table + 6;
+    cmap->num_ranges   = FT_PEEK_USHORT( p ) >> 1;
+    cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
+    cmap->cur_gindex   = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Int
+  tt_cmap4_set_range( TT_CMap4  cmap,
+                      FT_UInt   range_index )
+  {
+    FT_Byte*  table = cmap->cmap.data;
+    FT_Byte*  p;
+    FT_UInt   num_ranges = cmap->num_ranges;
+
+
+    while ( range_index < num_ranges )
+    {
+      FT_UInt  offset;
+
+
+      p             = table + 14 + range_index * 2;
+      cmap->cur_end = FT_PEEK_USHORT( p );
+
+      p              += 2 + num_ranges * 2;
+      cmap->cur_start = FT_PEEK_USHORT( p );
+
+      p              += num_ranges * 2;
+      cmap->cur_delta = FT_PEEK_SHORT( p );
+
+      p     += num_ranges * 2;
+      offset = FT_PEEK_USHORT( p );
+
+      /* some fonts have an incorrect last segment; */
+      /* we have to catch it                        */
+      if ( range_index     >= num_ranges - 1 &&
+           cmap->cur_start == 0xFFFFU        &&
+           cmap->cur_end   == 0xFFFFU        )
+      {
+        TT_Face   face  = (TT_Face)cmap->cmap.cmap.charmap.face;
+        FT_Byte*  limit = face->cmap_table + face->cmap_size;
+
+
+        if ( offset && p + offset + 2 > limit )
+        {
+          cmap->cur_delta = 1;
+          offset          = 0;
+        }
+      }
+
+      if ( offset != 0xFFFFU )
+      {
+        cmap->cur_values = offset ? p + offset : NULL;
+        cmap->cur_range  = range_index;
+        return 0;
+      }
+
+      /* we skip empty segments */
+      range_index++;
+    }
+
+    return -1;
+  }
+
+
+  /* search the index of the charcode next to cmap->cur_charcode; */
+  /* caller should call tt_cmap4_set_range with proper range      */
+  /* before calling this function                                 */
+  /*                                                              */
+  static void
+  tt_cmap4_next( TT_CMap4  cmap )
+  {
+    FT_UInt  charcode;
+
+
+    if ( cmap->cur_charcode >= 0xFFFFUL )
+      goto Fail;
+
+    charcode = (FT_UInt)cmap->cur_charcode + 1;
+
+    if ( charcode < cmap->cur_start )
+      charcode = cmap->cur_start;
+
+    for ( ;; )
+    {
+      FT_Byte*  values = cmap->cur_values;
+      FT_UInt   end    = cmap->cur_end;
+      FT_Int    delta  = cmap->cur_delta;
+
+
+      if ( charcode <= end )
+      {
+        if ( values )
+        {
+          FT_Byte*  p = values + 2 * ( charcode - cmap->cur_start );
+
+
+          do
+          {
+            FT_UInt  gindex = FT_NEXT_USHORT( p );
+
+
+            if ( gindex != 0 )
+            {
+              gindex = (FT_UInt)( ( gindex + delta ) & 0xFFFFU );
+              if ( gindex != 0 )
+              {
+                cmap->cur_charcode = charcode;
+                cmap->cur_gindex   = gindex;
+                return;
+              }
+            }
+          } while ( ++charcode <= end );
+        }
+        else
+        {
+          do
+          {
+            FT_UInt  gindex = (FT_UInt)( ( charcode + delta ) & 0xFFFFU );
+
+
+            if ( gindex != 0 )
+            {
+              cmap->cur_charcode = charcode;
+              cmap->cur_gindex   = gindex;
+              return;
+            }
+          } while ( ++charcode <= end );
+        }
+      }
+
+      /* we need to find another range */
+      if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 )
+        break;
+
+      if ( charcode < cmap->cur_start )
+        charcode = cmap->cur_start;
+    }
+
+  Fail:
+    cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
+    cmap->cur_gindex   = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap4_validate( FT_Byte*      table,
+                     FT_Validator  valid )
+  {
+    FT_Byte*  p      = table + 2;               /* skip format */
+    FT_UInt   length = TT_NEXT_USHORT( p );
+    FT_Byte   *ends, *starts, *offsets, *deltas, *glyph_ids;
+    FT_UInt   num_segs;
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( length < 16 )
+      FT_INVALID_TOO_SHORT;
+
+    /* in certain fonts, the `length' field is invalid and goes */
+    /* out of bound.  We try to correct this here...            */
+    if ( table + length > valid->limit )
+    {
+      if ( valid->level >= FT_VALIDATE_TIGHT )
+        FT_INVALID_TOO_SHORT;
+
+      length = (FT_UInt)( valid->limit - table );
+    }
+
+    p        = table + 6;
+    num_segs = TT_NEXT_USHORT( p );   /* read segCountX2 */
+
+    if ( valid->level >= FT_VALIDATE_PARANOID )
+    {
+      /* check that we have an even value here */
+      if ( num_segs & 1 )
+        FT_INVALID_DATA;
+    }
+
+    num_segs /= 2;
+
+    if ( length < 16 + num_segs * 2 * 4 )
+      FT_INVALID_TOO_SHORT;
+
+    /* check the search parameters - even though we never use them */
+    /*                                                             */
+    if ( valid->level >= FT_VALIDATE_PARANOID )
+    {
+      /* check the values of `searchRange', `entrySelector', `rangeShift' */
+      FT_UInt  search_range   = TT_NEXT_USHORT( p );
+      FT_UInt  entry_selector = TT_NEXT_USHORT( p );
+      FT_UInt  range_shift    = TT_NEXT_USHORT( p );
+
+
+      if ( ( search_range | range_shift ) & 1 )  /* must be even values */
+        FT_INVALID_DATA;
+
+      search_range /= 2;
+      range_shift  /= 2;
+
+      /* `search range' is the greatest power of 2 that is <= num_segs */
+
+      if ( search_range                > num_segs                 ||
+           search_range * 2            < num_segs                 ||
+           search_range + range_shift != num_segs                 ||
+           search_range               != ( 1U << entry_selector ) )
+        FT_INVALID_DATA;
+    }
+
+    ends      = table   + 14;
+    starts    = table   + 16 + num_segs * 2;
+    deltas    = starts  + num_segs * 2;
+    offsets   = deltas  + num_segs * 2;
+    glyph_ids = offsets + num_segs * 2;
+
+    /* check last segment; its end count value must be 0xFFFF */
+    if ( valid->level >= FT_VALIDATE_PARANOID )
+    {
+      p = ends + ( num_segs - 1 ) * 2;
+      if ( TT_PEEK_USHORT( p ) != 0xFFFFU )
+        FT_INVALID_DATA;
+    }
+
+    {
+      FT_UInt   start, end, offset, n;
+      FT_UInt   last_start = 0, last_end = 0;
+      FT_Int    delta;
+      FT_Byte*  p_start   = starts;
+      FT_Byte*  p_end     = ends;
+      FT_Byte*  p_delta   = deltas;
+      FT_Byte*  p_offset  = offsets;
+
+
+      for ( n = 0; n < num_segs; n++ )
+      {
+        p      = p_offset;
+        start  = TT_NEXT_USHORT( p_start );
+        end    = TT_NEXT_USHORT( p_end );
+        delta  = TT_NEXT_SHORT( p_delta );
+        offset = TT_NEXT_USHORT( p_offset );
+
+        if ( start > end )
+          FT_INVALID_DATA;
+
+        /* this test should be performed at default validation level; */
+        /* unfortunately, some popular Asian fonts have overlapping   */
+        /* ranges in their charmaps                                   */
+        /*                                                            */
+        if ( start <= last_end && n > 0 )
+        {
+          if ( valid->level >= FT_VALIDATE_TIGHT )
+            FT_INVALID_DATA;
+          else
+          {
+            /* allow overlapping segments, provided their start points */
+            /* and end points, respectively, are in ascending order    */
+            /*                                                         */
+            if ( last_start > start || last_end > end )
+              error |= TT_CMAP_FLAG_UNSORTED;
+            else
+              error |= TT_CMAP_FLAG_OVERLAPPING;
+          }
+        }
+
+        if ( offset && offset != 0xFFFFU )
+        {
+          p += offset;  /* start of glyph ID array */
+
+          /* check that we point within the glyph IDs table only */
+          if ( valid->level >= FT_VALIDATE_TIGHT )
+          {
+            if ( p < glyph_ids                                ||
+                 p + ( end - start + 1 ) * 2 > table + length )
+              FT_INVALID_DATA;
+          }
+          /* Some fonts handle the last segment incorrectly.  In */
+          /* theory, 0xFFFF might point to an ordinary glyph --  */
+          /* a cmap 4 is versatile and could be used for any     */
+          /* encoding, not only Unicode.  However, reality shows */
+          /* that far too many fonts are sloppy and incorrectly  */
+          /* set all fields but `start' and `end' for the last   */
+          /* segment if it contains only a single character.     */
+          /*                                                     */
+          /* We thus omit the test here, delaying it to the      */
+          /* routines which actually access the cmap.            */
+          else if ( n != num_segs - 1                       ||
+                    !( start == 0xFFFFU && end == 0xFFFFU ) )
+          {
+            if ( p < glyph_ids                              ||
+                 p + ( end - start + 1 ) * 2 > valid->limit )
+              FT_INVALID_DATA;
+          }
+
+          /* check glyph indices within the segment range */
+          if ( valid->level >= FT_VALIDATE_TIGHT )
+          {
+            FT_UInt  i, idx;
+
+
+            for ( i = start; i < end; i++ )
+            {
+              idx = FT_NEXT_USHORT( p );
+              if ( idx != 0 )
+              {
+                idx = (FT_UInt)( idx + delta ) & 0xFFFFU;
+
+                if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
+                  FT_INVALID_GLYPH_ID;
+              }
+            }
+          }
+        }
+        else if ( offset == 0xFFFFU )
+        {
+          /* some fonts (erroneously?) use a range offset of 0xFFFF */
+          /* to mean missing glyph in cmap table                    */
+          /*                                                        */
+          if ( valid->level >= FT_VALIDATE_PARANOID    ||
+               n != num_segs - 1                       ||
+               !( start == 0xFFFFU && end == 0xFFFFU ) )
+            FT_INVALID_DATA;
+        }
+
+        last_start = start;
+        last_end   = end;
+      }
+    }
+
+    return error;
+  }
+
+
+  static FT_UInt
+  tt_cmap4_char_map_linear( TT_CMap     cmap,
+                            FT_UInt32*  pcharcode,
+                            FT_Bool     next )
+  {
+    FT_UInt    num_segs2, start, end, offset;
+    FT_Int     delta;
+    FT_UInt    i, num_segs;
+    FT_UInt32  charcode = *pcharcode;
+    FT_UInt    gindex   = 0;
+    FT_Byte*   p;
+
+
+    p = cmap->data + 6;
+    num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
+
+    num_segs = num_segs2 >> 1;
+
+    if ( !num_segs )
+      return 0;
+
+    if ( next )
+      charcode++;
+
+    /* linear search */
+    for ( ; charcode <= 0xFFFFU; charcode++ )
+    {
+      FT_Byte*  q;
+
+
+      p = cmap->data + 14;               /* ends table   */
+      q = cmap->data + 16 + num_segs2;   /* starts table */
+
+      for ( i = 0; i < num_segs; i++ )
+      {
+        end   = TT_NEXT_USHORT( p );
+        start = TT_NEXT_USHORT( q );
+
+        if ( charcode >= start && charcode <= end )
+        {
+          p       = q - 2 + num_segs2;
+          delta   = TT_PEEK_SHORT( p );
+          p      += num_segs2;
+          offset  = TT_PEEK_USHORT( p );
+
+          /* some fonts have an incorrect last segment; */
+          /* we have to catch it                        */
+          if ( i >= num_segs - 1                  &&
+               start == 0xFFFFU && end == 0xFFFFU )
+          {
+            TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;
+            FT_Byte*  limit = face->cmap_table + face->cmap_size;
+
+
+            if ( offset && p + offset + 2 > limit )
+            {
+              delta  = 1;
+              offset = 0;
+            }
+          }
+
+          if ( offset == 0xFFFFU )
+            continue;
+
+          if ( offset )
+          {
+            p += offset + ( charcode - start ) * 2;
+            gindex = TT_PEEK_USHORT( p );
+            if ( gindex != 0 )
+              gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;
+          }
+          else
+            gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;
+
+          break;
+        }
+      }
+
+      if ( !next || gindex )
+        break;
+    }
+
+    if ( next && gindex )
+      *pcharcode = charcode;
+
+    return gindex;
+  }
+
+
+  static FT_UInt
+  tt_cmap4_char_map_binary( TT_CMap     cmap,
+                            FT_UInt32*  pcharcode,
+                            FT_Bool     next )
+  {
+    FT_UInt   num_segs2, start, end, offset;
+    FT_Int    delta;
+    FT_UInt   max, min, mid, num_segs;
+    FT_UInt   charcode = (FT_UInt)*pcharcode;
+    FT_UInt   gindex   = 0;
+    FT_Byte*  p;
+
+
+    p = cmap->data + 6;
+    num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
+
+    if ( !num_segs2 )
+      return 0;
+
+    num_segs = num_segs2 >> 1;
+
+    /* make compiler happy */
+    mid = num_segs;
+    end = 0xFFFFU;
+
+    if ( next )
+      charcode++;
+
+    min = 0;
+    max = num_segs;
+
+    /* binary search */
+    while ( min < max )
+    {
+      mid    = ( min + max ) >> 1;
+      p      = cmap->data + 14 + mid * 2;
+      end    = TT_PEEK_USHORT( p );
+      p     += 2 + num_segs2;
+      start  = TT_PEEK_USHORT( p );
+
+      if ( charcode < start )
+        max = mid;
+      else if ( charcode > end )
+        min = mid + 1;
+      else
+      {
+        p     += num_segs2;
+        delta  = TT_PEEK_SHORT( p );
+        p     += num_segs2;
+        offset = TT_PEEK_USHORT( p );
+
+        /* some fonts have an incorrect last segment; */
+        /* we have to catch it                        */
+        if ( mid >= num_segs - 1                &&
+             start == 0xFFFFU && end == 0xFFFFU )
+        {
+          TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;
+          FT_Byte*  limit = face->cmap_table + face->cmap_size;
+
+
+          if ( offset && p + offset + 2 > limit )
+          {
+            delta  = 1;
+            offset = 0;
+          }
+        }
+
+        /* search the first segment containing `charcode' */
+        if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING )
+        {
+          FT_UInt  i;
+
+
+          /* call the current segment `max' */
+          max = mid;
+
+          if ( offset == 0xFFFFU )
+            mid = max + 1;
+
+          /* search in segments before the current segment */
+          for ( i = max ; i > 0; i-- )
+          {
+            FT_UInt   prev_end;
+            FT_Byte*  old_p;
+
+
+            old_p    = p;
+            p        = cmap->data + 14 + ( i - 1 ) * 2;
+            prev_end = TT_PEEK_USHORT( p );
+
+            if ( charcode > prev_end )
+            {
+              p = old_p;
+              break;
+            }
+
+            end    = prev_end;
+            p     += 2 + num_segs2;
+            start  = TT_PEEK_USHORT( p );
+            p     += num_segs2;
+            delta  = TT_PEEK_SHORT( p );
+            p     += num_segs2;
+            offset = TT_PEEK_USHORT( p );
+
+            if ( offset != 0xFFFFU )
+              mid = i - 1;
+          }
+
+          /* no luck */
+          if ( mid == max + 1 )
+          {
+            if ( i != max )
+            {
+              p      = cmap->data + 14 + max * 2;
+              end    = TT_PEEK_USHORT( p );
+              p     += 2 + num_segs2;
+              start  = TT_PEEK_USHORT( p );
+              p     += num_segs2;
+              delta  = TT_PEEK_SHORT( p );
+              p     += num_segs2;
+              offset = TT_PEEK_USHORT( p );
+            }
+
+            mid = max;
+
+            /* search in segments after the current segment */
+            for ( i = max + 1; i < num_segs; i++ )
+            {
+              FT_UInt  next_end, next_start;
+
+
+              p          = cmap->data + 14 + i * 2;
+              next_end   = TT_PEEK_USHORT( p );
+              p         += 2 + num_segs2;
+              next_start = TT_PEEK_USHORT( p );
+
+              if ( charcode < next_start )
+                break;
+
+              end    = next_end;
+              start  = next_start;
+              p     += num_segs2;
+              delta  = TT_PEEK_SHORT( p );
+              p     += num_segs2;
+              offset = TT_PEEK_USHORT( p );
+
+              if ( offset != 0xFFFFU )
+                mid = i;
+            }
+            i--;
+
+            /* still no luck */
+            if ( mid == max )
+            {
+              mid = i;
+
+              break;
+            }
+          }
+
+          /* end, start, delta, and offset are for the i'th segment */
+          if ( mid != i )
+          {
+            p      = cmap->data + 14 + mid * 2;
+            end    = TT_PEEK_USHORT( p );
+            p     += 2 + num_segs2;
+            start  = TT_PEEK_USHORT( p );
+            p     += num_segs2;
+            delta  = TT_PEEK_SHORT( p );
+            p     += num_segs2;
+            offset = TT_PEEK_USHORT( p );
+          }
+        }
+        else
+        {
+          if ( offset == 0xFFFFU )
+            break;
+        }
+
+        if ( offset )
+        {
+          p += offset + ( charcode - start ) * 2;
+          gindex = TT_PEEK_USHORT( p );
+          if ( gindex != 0 )
+            gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;
+        }
+        else
+          gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;
+
+        break;
+      }
+    }
+
+    if ( next )
+    {
+      TT_CMap4  cmap4 = (TT_CMap4)cmap;
+
+
+      /* if `charcode' is not in any segment, then `mid' is */
+      /* the segment nearest to `charcode'                  */
+      /*                                                    */
+
+      if ( charcode > end )
+      {
+        mid++;
+        if ( mid == num_segs )
+          return 0;
+      }
+
+      if ( tt_cmap4_set_range( cmap4, mid ) )
+      {
+        if ( gindex )
+          *pcharcode = charcode;
+      }
+      else
+      {
+        cmap4->cur_charcode = charcode;
+
+        if ( gindex )
+          cmap4->cur_gindex = gindex;
+        else
+        {
+          cmap4->cur_charcode = charcode;
+          tt_cmap4_next( cmap4 );
+          gindex = cmap4->cur_gindex;
+        }
+
+        if ( gindex )
+          *pcharcode = cmap4->cur_charcode;
+      }
+    }
+
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap4_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
+  {
+    if ( char_code >= 0x10000UL )
+      return 0;
+
+    if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
+      return tt_cmap4_char_map_linear( cmap, &char_code, 0 );
+    else
+      return tt_cmap4_char_map_binary( cmap, &char_code, 0 );
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap4_char_next( TT_CMap     cmap,
+                      FT_UInt32  *pchar_code )
+  {
+    FT_UInt  gindex;
+
+
+    if ( *pchar_code >= 0xFFFFU )
+      return 0;
+
+    if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
+      gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 );
+    else
+    {
+      TT_CMap4  cmap4 = (TT_CMap4)cmap;
+
+
+      /* no need to search */
+      if ( *pchar_code == cmap4->cur_charcode )
+      {
+        tt_cmap4_next( cmap4 );
+        gindex = cmap4->cur_gindex;
+        if ( gindex )
+          *pchar_code = cmap4->cur_charcode;
+      }
+      else
+        gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 );
+    }
+
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap4_get_info( TT_CMap       cmap,
+                     TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 4;
+
+
+    cmap_info->format   = 4;
+    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(
+    tt_cmap4_class_rec,
+    sizeof ( TT_CMap4Rec ),
+    (FT_CMap_InitFunc)     tt_cmap4_init,
+    (FT_CMap_DoneFunc)     NULL,
+    (FT_CMap_CharIndexFunc)tt_cmap4_char_index,
+    (FT_CMap_CharNextFunc) tt_cmap4_char_next,
+
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+
+    4,
+    (TT_CMap_ValidateFunc)tt_cmap4_validate,
+    (TT_CMap_Info_GetFunc)tt_cmap4_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_4 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          FORMAT 6                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME        OFFSET          TYPE             DESCRIPTION            */
+  /*                                                                       */
+  /*   format       0              USHORT           must be 4              */
+  /*   length       2              USHORT           table length in bytes  */
+  /*   language     4              USHORT           Mac language code      */
+  /*                                                                       */
+  /*   first        6              USHORT           first segment code     */
+  /*   count        8              USHORT           segment size in chars  */
+  /*   glyphIds     10             USHORT[count]    glyph IDs              */
+  /*                                                                       */
+  /* A very simplified segment mapping.                                    */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_6
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap6_validate( FT_Byte*      table,
+                     FT_Validator  valid )
+  {
+    FT_Byte*  p;
+    FT_UInt   length, count;
+
+
+    if ( table + 10 > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    p      = table + 2;
+    length = TT_NEXT_USHORT( p );
+
+    p      = table + 8;             /* skip language and start index */
+    count  = TT_NEXT_USHORT( p );
+
+    if ( table + length > valid->limit || length < 10 + count/* * 2 */) // Zhangxuefeng 2013.12.23. remove count multiply 2.
+      FT_INVALID_TOO_SHORT;
+
+    /* check glyph indices */
+    if ( valid->level >= FT_VALIDATE_TIGHT )
+    {
+      FT_UInt  gindex;
+
+
+      for ( ; count > 0; count-- )
+      {
+        gindex = TT_NEXT_USHORT( p );
+        if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
+          FT_INVALID_GLYPH_ID;
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap6_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
+  {
+    FT_Byte*  table  = cmap->data;
+    FT_UInt   result = 0;
+    FT_Byte*  p      = table + 6;
+    FT_UInt   start  = TT_NEXT_USHORT( p );
+    FT_UInt   count  = TT_NEXT_USHORT( p );
+    FT_UInt   idx    = (FT_UInt)( char_code - start );
+
+
+    if ( idx < count )
+    {
+      p += 2 * idx;
+      result = TT_PEEK_USHORT( p );
+    }
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap6_char_next( TT_CMap     cmap,
+                      FT_UInt32  *pchar_code )
+  {
+    FT_Byte*   table     = cmap->data;
+    FT_UInt32  result    = 0;
+    FT_UInt32  char_code = *pchar_code + 1;
+    FT_UInt    gindex    = 0;
+
+    FT_Byte*   p         = table + 6;
+    FT_UInt    start     = TT_NEXT_USHORT( p );
+    FT_UInt    count     = TT_NEXT_USHORT( p );
+    FT_UInt    idx;
+
+
+    if ( char_code >= 0x10000UL )
+      goto Exit;
+
+    if ( char_code < start )
+      char_code = start;
+
+    idx = (FT_UInt)( char_code - start );
+    p  += 2 * idx;
+
+    for ( ; idx < count; idx++ )
+    {
+      gindex = TT_NEXT_USHORT( p );
+      if ( gindex != 0 )
+      {
+        result = char_code;
+        break;
+      }
+      char_code++;
+    }
+
+  Exit:
+    *pchar_code = result;
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap6_get_info( TT_CMap       cmap,
+                     TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 4;
+
+
+    cmap_info->format   = 6;
+    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(
+    tt_cmap6_class_rec,
+    sizeof ( TT_CMapRec ),
+
+    (FT_CMap_InitFunc)     tt_cmap_init,
+    (FT_CMap_DoneFunc)     NULL,
+    (FT_CMap_CharIndexFunc)tt_cmap6_char_index,
+    (FT_CMap_CharNextFunc) tt_cmap6_char_next,
+
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+
+    6,
+    (TT_CMap_ValidateFunc)tt_cmap6_validate,
+    (TT_CMap_Info_GetFunc)tt_cmap6_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_6 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          FORMAT 8                             *****/
+  /*****                                                               *****/
+  /***** It is hard to completely understand what the OpenType spec    *****/
+  /***** says about this format, but here is my conclusion.            *****/
+  /*****                                                               *****/
+  /***** The purpose of this format is to easily map UTF-16 text to    *****/
+  /***** glyph indices.  Basically, the `char_code' must be in one of  *****/
+  /***** the following formats:                                        *****/
+  /*****                                                               *****/
+  /*****   - A 16-bit value that isn't part of the Unicode Surrogates  *****/
+  /*****     Area (i.e. U+D800-U+DFFF).                                *****/
+  /*****                                                               *****/
+  /*****   - A 32-bit value, made of two surrogate values, i.e.. if    *****/
+  /*****     `char_code = (char_hi << 16) | char_lo', then both        *****/
+  /*****     `char_hi' and `char_lo' must be in the Surrogates Area.   *****/
+  /*****      Area.                                                    *****/
+  /*****                                                               *****/
+  /***** The `is32' table embedded in the charmap indicates whether a  *****/
+  /***** given 16-bit value is in the surrogates area or not.          *****/
+  /*****                                                               *****/
+  /***** So, for any given `char_code', we can assert the following:   *****/
+  /*****                                                               *****/
+  /*****   If `char_hi == 0' then we must have `is32[char_lo] == 0'.   *****/
+  /*****                                                               *****/
+  /*****   If `char_hi != 0' then we must have both                    *****/
+  /*****   `is32[char_hi] != 0' and `is32[char_lo] != 0'.              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME        OFFSET         TYPE        DESCRIPTION                  */
+  /*                                                                       */
+  /*   format      0              USHORT      must be 8                    */
+  /*   reserved    2              USHORT      reserved                     */
+  /*   length      4              ULONG       length in bytes              */
+  /*   language    8              ULONG       Mac language code            */
+  /*   is32        12             BYTE[8192]  32-bitness bitmap            */
+  /*   count       8204           ULONG       number of groups             */
+  /*                                                                       */
+  /* This header is followed by `count' groups of the following format:    */
+  /*                                                                       */
+  /*   start       0              ULONG       first charcode               */
+  /*   end         4              ULONG       last charcode                */
+  /*   startId     8              ULONG       start glyph ID for the group */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_8
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap8_validate( FT_Byte*      table,
+                     FT_Validator  valid )
+  {
+    FT_Byte*   p = table + 4;
+    FT_Byte*   is32;
+    FT_UInt32  length;
+    FT_UInt32  num_groups;
+
+
+    if ( table + 16 + 8192 > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    length = TT_NEXT_ULONG( p );
+    if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 )
+      FT_INVALID_TOO_SHORT;
+
+    is32       = table + 12;
+    p          = is32  + 8192;          /* skip `is32' array */
+    num_groups = TT_NEXT_ULONG( p );
+
+    if ( p + num_groups * 12 > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    /* check groups, they must be in increasing order */
+    {
+      FT_UInt32  n, start, end, start_id, count, last = 0;
+
+
+      for ( n = 0; n < num_groups; n++ )
+      {
+        FT_UInt   hi, lo;
+
+
+        start    = TT_NEXT_ULONG( p );
+        end      = TT_NEXT_ULONG( p );
+        start_id = TT_NEXT_ULONG( p );
+
+        if ( start > end )
+          FT_INVALID_DATA;
+
+        if ( n > 0 && start <= last )
+          FT_INVALID_DATA;
+
+        if ( valid->level >= FT_VALIDATE_TIGHT )
+        {
+          if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )
+            FT_INVALID_GLYPH_ID;
+
+          count = (FT_UInt32)( end - start + 1 );
+
+          if ( start & ~0xFFFFU )
+          {
+            /* start_hi != 0; check that is32[i] is 1 for each i in */
+            /* the `hi' and `lo' of the range [start..end]          */
+            for ( ; count > 0; count--, start++ )
+            {
+              hi = (FT_UInt)( start >> 16 );
+              lo = (FT_UInt)( start & 0xFFFFU );
+
+              if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 )
+                FT_INVALID_DATA;
+
+              if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 )
+                FT_INVALID_DATA;
+            }
+          }
+          else
+          {
+            /* start_hi == 0; check that is32[i] is 0 for each i in */
+            /* the range [start..end]                               */
+
+            /* end_hi cannot be != 0! */
+            if ( end & ~0xFFFFU )
+              FT_INVALID_DATA;
+
+            for ( ; count > 0; count--, start++ )
+            {
+              lo = (FT_UInt)( start & 0xFFFFU );
+
+              if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 )
+                FT_INVALID_DATA;
+            }
+          }
+        }
+
+        last = end;
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap8_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
+  {
+    FT_Byte*   table      = cmap->data;
+    FT_UInt    result     = 0;
+    FT_Byte*   p          = table + 8204;
+    FT_UInt32  num_groups = TT_NEXT_ULONG( p );
+    FT_UInt32  start, end, start_id;
+
+
+    for ( ; num_groups > 0; num_groups-- )
+    {
+      start    = TT_NEXT_ULONG( p );
+      end      = TT_NEXT_ULONG( p );
+      start_id = TT_NEXT_ULONG( p );
+
+      if ( char_code < start )
+        break;
+
+      if ( char_code <= end )
+      {
+        result = (FT_UInt)( start_id + char_code - start );
+        break;
+      }
+    }
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap8_char_next( TT_CMap     cmap,
+                      FT_UInt32  *pchar_code )
+  {
+    FT_UInt32  result     = 0;
+    FT_UInt32  char_code  = *pchar_code + 1;
+    FT_UInt    gindex     = 0;
+    FT_Byte*   table      = cmap->data;
+    FT_Byte*   p          = table + 8204;
+    FT_UInt32  num_groups = TT_NEXT_ULONG( p );
+    FT_UInt32  start, end, start_id;
+
+
+    p = table + 8208;
+
+    for ( ; num_groups > 0; num_groups-- )
+    {
+      start    = TT_NEXT_ULONG( p );
+      end      = TT_NEXT_ULONG( p );
+      start_id = TT_NEXT_ULONG( p );
+
+      if ( char_code < start )
+        char_code = start;
+
+      if ( char_code <= end )
+      {
+        gindex = (FT_UInt)( char_code - start + start_id );
+        if ( gindex != 0 )
+        {
+          result = char_code;
+          goto Exit;
+        }
+      }
+    }
+
+  Exit:
+    *pchar_code = result;
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap8_get_info( TT_CMap       cmap,
+                     TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 8;
+
+
+    cmap_info->format   = 8;
+    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(
+    tt_cmap8_class_rec,
+    sizeof ( TT_CMapRec ),
+
+    (FT_CMap_InitFunc)     tt_cmap_init,
+    (FT_CMap_DoneFunc)     NULL,
+    (FT_CMap_CharIndexFunc)tt_cmap8_char_index,
+    (FT_CMap_CharNextFunc) tt_cmap8_char_next,
+
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+
+    8,
+    (TT_CMap_ValidateFunc)tt_cmap8_validate,
+    (TT_CMap_Info_GetFunc)tt_cmap8_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_8 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          FORMAT 10                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME      OFFSET  TYPE               DESCRIPTION                    */
+  /*                                                                       */
+  /*   format     0      USHORT             must be 10                     */
+  /*   reserved   2      USHORT             reserved                       */
+  /*   length     4      ULONG              length in bytes                */
+  /*   language   8      ULONG              Mac language code              */
+  /*                                                                       */
+  /*   start     12      ULONG              first char in range            */
+  /*   count     16      ULONG              number of chars in range       */
+  /*   glyphIds  20      USHORT[count]      glyph indices covered          */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_10
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap10_validate( FT_Byte*      table,
+                      FT_Validator  valid )
+  {
+    FT_Byte*  p = table + 4;
+    FT_ULong  length, count;
+
+
+    if ( table + 20 > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    length = TT_NEXT_ULONG( p );
+    p      = table + 16;
+    count  = TT_NEXT_ULONG( p );
+
+    if ( length > (FT_ULong)( valid->limit - table ) ||
+         length < 20 + count * 2                     )
+      FT_INVALID_TOO_SHORT;
+
+    /* check glyph indices */
+    if ( valid->level >= FT_VALIDATE_TIGHT )
+    {
+      FT_UInt  gindex;
+
+
+      for ( ; count > 0; count-- )
+      {
+        gindex = TT_NEXT_USHORT( p );
+        if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
+          FT_INVALID_GLYPH_ID;
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap10_char_index( TT_CMap    cmap,
+                        FT_UInt32  char_code )
+  {
+    FT_Byte*   table  = cmap->data;
+    FT_UInt    result = 0;
+    FT_Byte*   p      = table + 12;
+    FT_UInt32  start  = TT_NEXT_ULONG( p );
+    FT_UInt32  count  = TT_NEXT_ULONG( p );
+    FT_UInt32  idx    = (FT_ULong)( char_code - start );
+
+
+    if ( idx < count )
+    {
+      p     += 2 * idx;
+      result = TT_PEEK_USHORT( p );
+    }
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap10_char_next( TT_CMap     cmap,
+                       FT_UInt32  *pchar_code )
+  {
+    FT_Byte*   table     = cmap->data;
+    FT_UInt32  char_code = *pchar_code + 1;
+    FT_UInt    gindex    = 0;
+    FT_Byte*   p         = table + 12;
+    FT_UInt32  start     = TT_NEXT_ULONG( p );
+    FT_UInt32  count     = TT_NEXT_ULONG( p );
+    FT_UInt32  idx;
+
+
+    if ( char_code < start )
+      char_code = start;
+
+    idx = (FT_UInt32)( char_code - start );
+    p  += 2 * idx;
+
+    for ( ; idx < count; idx++ )
+    {
+      gindex = TT_NEXT_USHORT( p );
+      if ( gindex != 0 )
+        break;
+      char_code++;
+    }
+
+    *pchar_code = char_code;
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap10_get_info( TT_CMap       cmap,
+                      TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 8;
+
+
+    cmap_info->format   = 10;
+    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(
+    tt_cmap10_class_rec,
+    sizeof ( TT_CMapRec ),
+
+    (FT_CMap_InitFunc)     tt_cmap_init,
+    (FT_CMap_DoneFunc)     NULL,
+    (FT_CMap_CharIndexFunc)tt_cmap10_char_index,
+    (FT_CMap_CharNextFunc) tt_cmap10_char_next,
+
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+
+    10,
+    (TT_CMap_ValidateFunc)tt_cmap10_validate,
+    (TT_CMap_Info_GetFunc)tt_cmap10_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_10 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          FORMAT 12                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME        OFFSET     TYPE       DESCRIPTION                       */
+  /*                                                                       */
+  /*   format      0          USHORT     must be 12                        */
+  /*   reserved    2          USHORT     reserved                          */
+  /*   length      4          ULONG      length in bytes                   */
+  /*   language    8          ULONG      Mac language code                 */
+  /*   count       12         ULONG      number of groups                  */
+  /*               16                                                      */
+  /*                                                                       */
+  /* This header is followed by `count' groups of the following format:    */
+  /*                                                                       */
+  /*   start       0          ULONG      first charcode                    */
+  /*   end         4          ULONG      last charcode                     */
+  /*   startId     8          ULONG      start glyph ID for the group      */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_12
+
+  typedef struct  TT_CMap12Rec_
+  {
+    TT_CMapRec  cmap;
+    FT_Bool     valid;
+    FT_ULong    cur_charcode;
+    FT_UInt     cur_gindex;
+    FT_ULong    cur_group;
+    FT_ULong    num_groups;
+
+  } TT_CMap12Rec, *TT_CMap12;
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap12_init( TT_CMap12  cmap,
+                  FT_Byte*   table )
+  {
+    cmap->cmap.data  = table;
+
+    table           += 12;
+    cmap->num_groups = FT_PEEK_ULONG( table );
+
+    cmap->valid      = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap12_validate( FT_Byte*      table,
+                      FT_Validator  valid )
+  {
+    FT_Byte*   p;
+    FT_ULong   length;
+    FT_ULong   num_groups;
+
+
+    if ( table + 16 > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    p      = table + 4;
+    length = TT_NEXT_ULONG( p );
+
+    p          = table + 12;
+    num_groups = TT_NEXT_ULONG( p );
+
+    if ( length > (FT_ULong)( valid->limit - table ) ||
+         length < 16 + 12 * num_groups               )
+      FT_INVALID_TOO_SHORT;
+
+    /* check groups, they must be in increasing order */
+    {
+      FT_ULong  n, start, end, start_id, last = 0;
+
+
+      for ( n = 0; n < num_groups; n++ )
+      {
+        start    = TT_NEXT_ULONG( p );
+        end      = TT_NEXT_ULONG( p );
+        start_id = TT_NEXT_ULONG( p );
+
+        if ( start > end )
+          FT_INVALID_DATA;
+
+        if ( n > 0 && start <= last )
+          FT_INVALID_DATA;
+
+        if ( valid->level >= FT_VALIDATE_TIGHT )
+        {
+          if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )
+            FT_INVALID_GLYPH_ID;
+        }
+
+        last = end;
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  /* search the index of the charcode next to cmap->cur_charcode */
+  /* cmap->cur_group should be set up properly by caller         */
+  /*                                                             */
+  static void
+  tt_cmap12_next( TT_CMap12  cmap )
+  {
+    FT_Byte*  p;
+    FT_ULong  start, end, start_id, char_code;
+    FT_ULong  n;
+    FT_UInt   gindex;
+
+
+    if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
+      goto Fail;
+
+    char_code = cmap->cur_charcode + 1;
+
+    n = cmap->cur_group;
+
+    for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
+    {
+      p        = cmap->cmap.data + 16 + 12 * n;
+      start    = TT_NEXT_ULONG( p );
+      end      = TT_NEXT_ULONG( p );
+      start_id = TT_PEEK_ULONG( p );
+
+      if ( char_code < start )
+        char_code = start;
+
+      for ( ; char_code <= end; char_code++ )
+      {
+        gindex = (FT_UInt)( start_id + char_code - start );
+
+        if ( gindex )
+        {
+          cmap->cur_charcode = char_code;;
+          cmap->cur_gindex   = gindex;
+          cmap->cur_group    = n;
+
+          return;
+        }
+      }
+    }
+
+  Fail:
+    cmap->valid = 0;
+  }
+
+
+  static FT_UInt
+  tt_cmap12_char_map_binary( TT_CMap     cmap,
+                             FT_UInt32*  pchar_code,
+                             FT_Bool     next )
+  {
+    FT_UInt    gindex     = 0;
+    FT_Byte*   p          = cmap->data + 12;
+    FT_UInt32  num_groups = TT_PEEK_ULONG( p );
+    FT_UInt32  char_code  = *pchar_code;
+    FT_UInt32  start, end, start_id;
+    FT_UInt32  max, min, mid;
+
+
+    if ( !num_groups )
+      return 0;
+
+    /* make compiler happy */
+    mid = num_groups;
+    end = 0xFFFFFFFFUL;
+
+    if ( next )
+      char_code++;
+
+    min = 0;
+    max = num_groups;
+
+    /* binary search */
+    while ( min < max )
+    {
+      mid = ( min + max ) >> 1;
+      p   = cmap->data + 16 + 12 * mid;
+
+      start = TT_NEXT_ULONG( p );
+      end   = TT_NEXT_ULONG( p );
+
+      if ( char_code < start )
+        max = mid;
+      else if ( char_code > end )
+        min = mid + 1;
+      else
+      {
+        start_id = TT_PEEK_ULONG( p );
+        gindex = (FT_UInt)( start_id + char_code - start );
+
+        break;
+      }
+    }
+
+    if ( next )
+    {
+      TT_CMap12  cmap12 = (TT_CMap12)cmap;
+
+
+      /* if `char_code' is not in any group, then `mid' is */
+      /* the group nearest to `char_code'                  */
+      /*                                                   */
+
+      if ( char_code > end )
+      {
+        mid++;
+        if ( mid == num_groups )
+          return 0;
+      }
+
+      cmap12->valid        = 1;
+      cmap12->cur_charcode = char_code;
+      cmap12->cur_group    = mid;
+
+      if ( !gindex )
+      {
+        tt_cmap12_next( cmap12 );
+
+        if ( cmap12->valid )
+          gindex = cmap12->cur_gindex;
+      }
+      else
+        cmap12->cur_gindex = gindex;
+
+      if ( gindex )
+        *pchar_code = cmap12->cur_charcode;
+    }
+
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap12_char_index( TT_CMap    cmap,
+                        FT_UInt32  char_code )
+  {
+    return tt_cmap12_char_map_binary( cmap, &char_code, 0 );
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap12_char_next( TT_CMap     cmap,
+                       FT_UInt32  *pchar_code )
+  {
+    TT_CMap12  cmap12 = (TT_CMap12)cmap;
+    FT_ULong   gindex;
+
+
+    if ( cmap12->cur_charcode >= 0xFFFFFFFFUL )
+      return 0;
+
+    /* no need to search */
+    if ( cmap12->valid && cmap12->cur_charcode == *pchar_code )
+    {
+      tt_cmap12_next( cmap12 );
+      if ( cmap12->valid )
+      {
+        gindex = cmap12->cur_gindex;
+
+        /* XXX: check cur_charcode overflow is expected */
+        if ( gindex )
+          *pchar_code = (FT_UInt32)cmap12->cur_charcode;
+      }
+      else
+        gindex = 0;
+    }
+    else
+      gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 );
+
+    /* XXX: check gindex overflow is expected */
+    return (FT_UInt32)gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap12_get_info( TT_CMap       cmap,
+                      TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 8;
+
+
+    cmap_info->format   = 12;
+    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(
+    tt_cmap12_class_rec,
+    sizeof ( TT_CMap12Rec ),
+
+    (FT_CMap_InitFunc)     tt_cmap12_init,
+    (FT_CMap_DoneFunc)     NULL,
+    (FT_CMap_CharIndexFunc)tt_cmap12_char_index,
+    (FT_CMap_CharNextFunc) tt_cmap12_char_next,
+
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+
+    12,
+    (TT_CMap_ValidateFunc)tt_cmap12_validate,
+    (TT_CMap_Info_GetFunc)tt_cmap12_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_12 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          FORMAT 13                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME        OFFSET     TYPE       DESCRIPTION                       */
+  /*                                                                       */
+  /*   format      0          USHORT     must be 13                        */
+  /*   reserved    2          USHORT     reserved                          */
+  /*   length      4          ULONG      length in bytes                   */
+  /*   language    8          ULONG      Mac language code                 */
+  /*   count       12         ULONG      number of groups                  */
+  /*               16                                                      */
+  /*                                                                       */
+  /* This header is followed by `count' groups of the following format:    */
+  /*                                                                       */
+  /*   start       0          ULONG      first charcode                    */
+  /*   end         4          ULONG      last charcode                     */
+  /*   glyphId     8          ULONG      glyph ID for the whole group      */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_13
+
+  typedef struct  TT_CMap13Rec_
+  {
+    TT_CMapRec  cmap;
+    FT_Bool     valid;
+    FT_ULong    cur_charcode;
+    FT_UInt     cur_gindex;
+    FT_ULong    cur_group;
+    FT_ULong    num_groups;
+
+  } TT_CMap13Rec, *TT_CMap13;
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap13_init( TT_CMap13  cmap,
+                  FT_Byte*   table )
+  {
+    cmap->cmap.data  = table;
+
+    table           += 12;
+    cmap->num_groups = FT_PEEK_ULONG( table );
+
+    cmap->valid      = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap13_validate( FT_Byte*      table,
+                      FT_Validator  valid )
+  {
+    FT_Byte*  p;
+    FT_ULong  length;
+    FT_ULong  num_groups;
+
+
+    if ( table + 16 > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    p      = table + 4;
+    length = TT_NEXT_ULONG( p );
+
+    p          = table + 12;
+    num_groups = TT_NEXT_ULONG( p );
+
+    if ( length > (FT_ULong)( valid->limit - table ) ||
+         length < 16 + 12 * num_groups               )
+      FT_INVALID_TOO_SHORT;
+
+    /* check groups, they must be in increasing order */
+    {
+      FT_ULong  n, start, end, glyph_id, last = 0;
+
+
+      for ( n = 0; n < num_groups; n++ )
+      {
+        start    = TT_NEXT_ULONG( p );
+        end      = TT_NEXT_ULONG( p );
+        glyph_id = TT_NEXT_ULONG( p );
+
+        if ( start > end )
+          FT_INVALID_DATA;
+
+        if ( n > 0 && start <= last )
+          FT_INVALID_DATA;
+
+        if ( valid->level >= FT_VALIDATE_TIGHT )
+        {
+          if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) )
+            FT_INVALID_GLYPH_ID;
+        }
+
+        last = end;
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  /* search the index of the charcode next to cmap->cur_charcode */
+  /* cmap->cur_group should be set up properly by caller         */
+  /*                                                             */
+  static void
+  tt_cmap13_next( TT_CMap13  cmap )
+  {
+    FT_Byte*  p;
+    FT_ULong  start, end, glyph_id, char_code;
+    FT_ULong  n;
+    FT_UInt   gindex;
+
+
+    if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
+      goto Fail;
+
+    char_code = cmap->cur_charcode + 1;
+
+    n = cmap->cur_group;
+
+    for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
+    {
+      p        = cmap->cmap.data + 16 + 12 * n;
+      start    = TT_NEXT_ULONG( p );
+      end      = TT_NEXT_ULONG( p );
+      glyph_id = TT_PEEK_ULONG( p );
+
+      if ( char_code < start )
+        char_code = start;
+
+      if ( char_code <= end )
+      {
+        gindex = (FT_UInt)glyph_id;
+
+        if ( gindex )
+        {
+          cmap->cur_charcode = char_code;;
+          cmap->cur_gindex   = gindex;
+          cmap->cur_group    = n;
+
+          return;
+        }
+      }
+    }
+
+  Fail:
+    cmap->valid = 0;
+  }
+
+
+  static FT_UInt
+  tt_cmap13_char_map_binary( TT_CMap     cmap,
+                             FT_UInt32*  pchar_code,
+                             FT_Bool     next )
+  {
+    FT_UInt    gindex     = 0;
+    FT_Byte*   p          = cmap->data + 12;
+    FT_UInt32  num_groups = TT_PEEK_ULONG( p );
+    FT_UInt32  char_code  = *pchar_code;
+    FT_UInt32  start, end;
+    FT_UInt32  max, min, mid;
+
+
+    if ( !num_groups )
+      return 0;
+
+    /* make compiler happy */
+    mid = num_groups;
+    end = 0xFFFFFFFFUL;
+
+    if ( next )
+      char_code++;
+
+    min = 0;
+    max = num_groups;
+
+    /* binary search */
+    while ( min < max )
+    {
+      mid = ( min + max ) >> 1;
+      p   = cmap->data + 16 + 12 * mid;
+
+      start = TT_NEXT_ULONG( p );
+      end   = TT_NEXT_ULONG( p );
+
+      if ( char_code < start )
+        max = mid;
+      else if ( char_code > end )
+        min = mid + 1;
+      else
+      {
+        gindex = (FT_UInt)TT_PEEK_ULONG( p );
+
+        break;
+      }
+    }
+
+    if ( next )
+    {
+      TT_CMap13  cmap13 = (TT_CMap13)cmap;
+
+
+      /* if `char_code' is not in any group, then `mid' is */
+      /* the group nearest to `char_code'                  */
+
+      if ( char_code > end )
+      {
+        mid++;
+        if ( mid == num_groups )
+          return 0;
+      }
+
+      cmap13->valid        = 1;
+      cmap13->cur_charcode = char_code;
+      cmap13->cur_group    = mid;
+
+      if ( !gindex )
+      {
+        tt_cmap13_next( cmap13 );
+
+        if ( cmap13->valid )
+          gindex = cmap13->cur_gindex;
+      }
+      else
+        cmap13->cur_gindex = gindex;
+
+      if ( gindex )
+        *pchar_code = cmap13->cur_charcode;
+    }
+
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap13_char_index( TT_CMap    cmap,
+                        FT_UInt32  char_code )
+  {
+    return tt_cmap13_char_map_binary( cmap, &char_code, 0 );
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap13_char_next( TT_CMap     cmap,
+                       FT_UInt32  *pchar_code )
+  {
+    TT_CMap13  cmap13 = (TT_CMap13)cmap;
+    FT_UInt    gindex;
+
+
+    if ( cmap13->cur_charcode >= 0xFFFFFFFFUL )
+      return 0;
+
+    /* no need to search */
+    if ( cmap13->valid && cmap13->cur_charcode == *pchar_code )
+    {
+      tt_cmap13_next( cmap13 );
+      if ( cmap13->valid )
+      {
+        gindex = cmap13->cur_gindex;
+        if ( gindex )
+          *pchar_code = cmap13->cur_charcode;
+      }
+      else
+        gindex = 0;
+    }
+    else
+      gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 );
+
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap13_get_info( TT_CMap       cmap,
+                      TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 8;
+
+
+    cmap_info->format   = 13;
+    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(
+    tt_cmap13_class_rec,
+    sizeof ( TT_CMap13Rec ),
+
+    (FT_CMap_InitFunc)     tt_cmap13_init,
+    (FT_CMap_DoneFunc)     NULL,
+    (FT_CMap_CharIndexFunc)tt_cmap13_char_index,
+    (FT_CMap_CharNextFunc) tt_cmap13_char_next,
+
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+
+    13,
+    (TT_CMap_ValidateFunc)tt_cmap13_validate,
+    (TT_CMap_Info_GetFunc)tt_cmap13_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_13 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           FORMAT 14                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME         OFFSET  TYPE    DESCRIPTION                            */
+  /*                                                                       */
+  /*   format         0     USHORT  must be 14                             */
+  /*   length         2     ULONG   table length in bytes                  */
+  /*   numSelector    6     ULONG   number of variation sel. records       */
+  /*                                                                       */
+  /* Followed by numSelector records, each of which looks like             */
+  /*                                                                       */
+  /*   varSelector    0     UINT24  Unicode codepoint of sel.              */
+  /*   defaultOff     3     ULONG   offset to a default UVS table          */
+  /*                                describing any variants to be found in */
+  /*                                the normal Unicode subtable.           */
+  /*   nonDefOff      7     ULONG   offset to a non-default UVS table      */
+  /*                                describing any variants not in the     */
+  /*                                standard cmap, with GIDs here          */
+  /* (either offset may be 0 NULL)                                         */
+  /*                                                                       */
+  /* Selectors are sorted by code point.                                   */
+  /*                                                                       */
+  /* A default Unicode Variation Selector (UVS) subtable is just a list of */
+  /* ranges of code points which are to be found in the standard cmap.  No */
+  /* glyph IDs (GIDs) here.                                                */
+  /*                                                                       */
+  /*   numRanges      0     ULONG   number of ranges following             */
+  /*                                                                       */
+  /* A range looks like                                                    */
+  /*                                                                       */
+  /*   uniStart       0     UINT24  code point of the first character in   */
+  /*                                this range                             */
+  /*   additionalCnt  3     UBYTE   count of additional characters in this */
+  /*                                range (zero means a range of a single  */
+  /*                                character)                             */
+  /*                                                                       */
+  /* Ranges are sorted by `uniStart'.                                      */
+  /*                                                                       */
+  /* A non-default Unicode Variation Selector (UVS) subtable is a list of  */
+  /* mappings from codepoint to GID.                                       */
+  /*                                                                       */
+  /*   numMappings    0     ULONG   number of mappings                     */
+  /*                                                                       */
+  /* A range looks like                                                    */
+  /*                                                                       */
+  /*   uniStart       0     UINT24  code point of the first character in   */
+  /*                                this range                             */
+  /*   GID            3     USHORT  and its GID                            */
+  /*                                                                       */
+  /* Ranges are sorted by `uniStart'.                                      */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_14
+
+  typedef struct  TT_CMap14Rec_
+  {
+    TT_CMapRec  cmap;
+    FT_ULong    num_selectors;
+
+    /* This array is used to store the results of various
+     * cmap 14 query functions.  The data is overwritten
+     * on each call to these functions.
+     */
+    FT_UInt32   max_results;
+    FT_UInt32*  results;
+    FT_Memory   memory;
+
+  } TT_CMap14Rec, *TT_CMap14;
+
+
+  FT_CALLBACK_DEF( void )
+  tt_cmap14_done( TT_CMap14  cmap )
+  {
+    FT_Memory  memory = cmap->memory;
+
+
+    cmap->max_results = 0;
+    if ( memory != NULL && cmap->results != NULL )
+      FT_FREE( cmap->results );
+  }
+
+
+  static FT_Error
+  tt_cmap14_ensure( TT_CMap14  cmap,
+                    FT_UInt32  num_results,
+                    FT_Memory  memory )
+  {
+    FT_UInt32  old_max = cmap->max_results;
+    FT_Error   error   = FT_Err_Ok;
+
+
+    if ( num_results > cmap->max_results )
+    {
+       cmap->memory = memory;
+
+       if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) )
+         return error;
+
+       cmap->max_results = num_results;
+    }
+
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap14_init( TT_CMap14  cmap,
+                  FT_Byte*   table )
+  {
+    cmap->cmap.data = table;
+
+    table               += 6;
+    cmap->num_selectors  = FT_PEEK_ULONG( table );
+    cmap->max_results    = 0;
+    cmap->results        = NULL;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap14_validate( FT_Byte*      table,
+                      FT_Validator  valid )
+  {
+    FT_Byte*  p             = table + 2;
+    FT_ULong  length        = TT_NEXT_ULONG( p );
+    FT_ULong  num_selectors = TT_NEXT_ULONG( p );
+
+
+    if ( length > (FT_ULong)( valid->limit - table ) ||
+         length < 10 + 11 * num_selectors            )
+      FT_INVALID_TOO_SHORT;
+
+    /* check selectors, they must be in increasing order */
+    {
+      /* we start lastVarSel at 1 because a variant selector value of 0
+       * isn't valid.
+       */
+      FT_ULong  n, lastVarSel = 1;
+
+
+      for ( n = 0; n < num_selectors; n++ )
+      {
+        FT_ULong  varSel    = TT_NEXT_UINT24( p );
+        FT_ULong  defOff    = TT_NEXT_ULONG( p );
+        FT_ULong  nondefOff = TT_NEXT_ULONG( p );
+
+
+        if ( defOff >= length || nondefOff >= length )
+          FT_INVALID_TOO_SHORT;
+
+        if ( varSel < lastVarSel )
+          FT_INVALID_DATA;
+
+        lastVarSel = varSel + 1;
+
+        /* check the default table (these glyphs should be reached     */
+        /* through the normal Unicode cmap, no GIDs, just check order) */
+        if ( defOff != 0 )
+        {
+          FT_Byte*  defp      = table + defOff;
+          FT_ULong  numRanges = TT_NEXT_ULONG( defp );
+          FT_ULong  i;
+          FT_ULong  lastBase  = 0;
+
+
+          if ( defp + numRanges * 4 > valid->limit )
+            FT_INVALID_TOO_SHORT;
+
+          for ( i = 0; i < numRanges; ++i )
+          {
+            FT_ULong  base = TT_NEXT_UINT24( defp );
+            FT_ULong  cnt  = FT_NEXT_BYTE( defp );
+
+
+            if ( base + cnt >= 0x110000UL )              /* end of Unicode */
+              FT_INVALID_DATA;
+
+            if ( base < lastBase )
+              FT_INVALID_DATA;
+
+            lastBase = base + cnt + 1U;
+          }
+        }
+
+        /* and the non-default table (these glyphs are specified here) */
+        if ( nondefOff != 0 )
+        {
+          FT_Byte*  ndp         = table + nondefOff;
+          FT_ULong  numMappings = TT_NEXT_ULONG( ndp );
+          FT_ULong  i, lastUni  = 0;
+
+
+          if ( numMappings * 4 > (FT_ULong)( valid->limit - ndp ) )
+            FT_INVALID_TOO_SHORT;
+
+          for ( i = 0; i < numMappings; ++i )
+          {
+            FT_ULong  uni = TT_NEXT_UINT24( ndp );
+            FT_ULong  gid = TT_NEXT_USHORT( ndp );
+
+
+            if ( uni >= 0x110000UL )                     /* end of Unicode */
+              FT_INVALID_DATA;
+
+            if ( uni < lastUni )
+              FT_INVALID_DATA;
+
+            lastUni = uni + 1U;
+
+            if ( valid->level >= FT_VALIDATE_TIGHT    &&
+                 gid >= TT_VALID_GLYPH_COUNT( valid ) )
+              FT_INVALID_GLYPH_ID;
+          }
+        }
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap14_char_index( TT_CMap    cmap,
+                        FT_UInt32  char_code )
+  {
+    FT_UNUSED( cmap );
+    FT_UNUSED( char_code );
+
+    /* This can't happen */
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap14_char_next( TT_CMap     cmap,
+                       FT_UInt32  *pchar_code )
+  {
+    FT_UNUSED( cmap );
+
+    /* This can't happen */
+    *pchar_code = 0;
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap14_get_info( TT_CMap       cmap,
+                      TT_CMapInfo  *cmap_info )
+  {
+    FT_UNUSED( cmap );
+
+    cmap_info->format   = 14;
+    /* subtable 14 does not define a language field */
+    cmap_info->language = 0xFFFFFFFFUL;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_UInt
+  tt_cmap14_char_map_def_binary( FT_Byte    *base,
+                                 FT_UInt32   char_code )
+  {
+    FT_UInt32  numRanges = TT_PEEK_ULONG( base );
+    FT_UInt32  max, min;
+
+
+    min = 0;
+    max = numRanges;
+
+    base += 4;
+
+    /* binary search */
+    while ( min < max )
+    {
+      FT_UInt32  mid   = ( min + max ) >> 1;
+      FT_Byte*   p     = base + 4 * mid;
+      FT_ULong   start = TT_NEXT_UINT24( p );
+      FT_UInt    cnt   = FT_NEXT_BYTE( p );
+
+
+      if ( char_code < start )
+        max = mid;
+      else if ( char_code > start+cnt )
+        min = mid + 1;
+      else
+        return TRUE;
+    }
+
+    return FALSE;
+  }
+
+
+  static FT_UInt
+  tt_cmap14_char_map_nondef_binary( FT_Byte    *base,
+                                    FT_UInt32   char_code )
+  {
+    FT_UInt32  numMappings = TT_PEEK_ULONG( base );
+    FT_UInt32  max, min;
+
+
+    min = 0;
+    max = numMappings;
+
+    base += 4;
+
+    /* binary search */
+    while ( min < max )
+    {
+      FT_UInt32  mid = ( min + max ) >> 1;
+      FT_Byte*   p   = base + 5 * mid;
+      FT_UInt32  uni = (FT_UInt32)TT_NEXT_UINT24( p );
+
+
+      if ( char_code < uni )
+        max = mid;
+      else if ( char_code > uni )
+        min = mid + 1;
+      else
+        return TT_PEEK_USHORT( p );
+    }
+
+    return 0;
+  }
+
+
+  static FT_Byte*
+  tt_cmap14_find_variant( FT_Byte    *base,
+                          FT_UInt32   variantCode )
+  {
+    FT_UInt32  numVar = TT_PEEK_ULONG( base );
+    FT_UInt32  max, min;
+
+
+    min = 0;
+    max = numVar;
+
+    base += 4;
+
+    /* binary search */
+    while ( min < max )
+    {
+      FT_UInt32  mid    = ( min + max ) >> 1;
+      FT_Byte*   p      = base + 11 * mid;
+      FT_ULong   varSel = TT_NEXT_UINT24( p );
+
+
+      if ( variantCode < varSel )
+        max = mid;
+      else if ( variantCode > varSel )
+        min = mid + 1;
+      else
+        return p;
+    }
+
+    return NULL;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap14_char_var_index( TT_CMap    cmap,
+                            TT_CMap    ucmap,
+                            FT_UInt32  charcode,
+                            FT_UInt32  variantSelector )
+  {
+    FT_Byte*  p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
+    FT_ULong  defOff;
+    FT_ULong  nondefOff;
+
+
+    if ( !p )
+      return 0;
+
+    defOff    = TT_NEXT_ULONG( p );
+    nondefOff = TT_PEEK_ULONG( p );
+
+    if ( defOff != 0                                                    &&
+         tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
+    {
+      /* This is the default variant of this charcode.  GID not stored */
+      /* here; stored in the normal Unicode charmap instead.           */
+      return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode );
+    }
+
+    if ( nondefOff != 0 )
+      return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
+                                               charcode );
+
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Int )
+  tt_cmap14_char_var_isdefault( TT_CMap    cmap,
+                                FT_UInt32  charcode,
+                                FT_UInt32  variantSelector )
+  {
+    FT_Byte*  p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
+    FT_ULong  defOff;
+    FT_ULong  nondefOff;
+
+
+    if ( !p )
+      return -1;
+
+    defOff    = TT_NEXT_ULONG( p );
+    nondefOff = TT_NEXT_ULONG( p );
+
+    if ( defOff != 0                                                    &&
+         tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
+      return 1;
+
+    if ( nondefOff != 0                                            &&
+         tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
+                                           charcode ) != 0         )
+      return 0;
+
+    return -1;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32* )
+  tt_cmap14_variants( TT_CMap    cmap,
+                      FT_Memory  memory )
+  {
+    TT_CMap14   cmap14 = (TT_CMap14)cmap;
+    FT_UInt32   count  = cmap14->num_selectors;
+    FT_Byte*    p      = cmap->data + 10;
+    FT_UInt32*  result;
+    FT_UInt32   i;
+
+
+    if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
+      return NULL;
+
+    result = cmap14->results;
+    for ( i = 0; i < count; ++i )
+    {
+      result[i] = (FT_UInt32)TT_NEXT_UINT24( p );
+      p        += 8;
+    }
+    result[i] = 0;
+
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 * )
+  tt_cmap14_char_variants( TT_CMap    cmap,
+                           FT_Memory  memory,
+                           FT_UInt32  charCode )
+  {
+    TT_CMap14   cmap14 = (TT_CMap14)  cmap;
+    FT_UInt32   count  = cmap14->num_selectors;
+    FT_Byte*    p      = cmap->data + 10;
+    FT_UInt32*  q;
+
+
+    if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
+      return NULL;
+
+    for ( q = cmap14->results; count > 0; --count )
+    {
+      FT_UInt32  varSel    = TT_NEXT_UINT24( p );
+      FT_ULong   defOff    = TT_NEXT_ULONG( p );
+      FT_ULong   nondefOff = TT_NEXT_ULONG( p );
+
+
+      if ( ( defOff != 0                                               &&
+             tt_cmap14_char_map_def_binary( cmap->data + defOff,
+                                            charCode )                 ) ||
+           ( nondefOff != 0                                            &&
+             tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
+                                               charCode ) != 0         ) )
+      {
+        q[0] = varSel;
+        q++;
+      }
+    }
+    q[0] = 0;
+
+    return cmap14->results;
+  }
+
+
+  static FT_UInt
+  tt_cmap14_def_char_count( FT_Byte  *p )
+  {
+    FT_UInt32  numRanges = (FT_UInt32)TT_NEXT_ULONG( p );
+    FT_UInt    tot       = 0;
+
+
+    p += 3;  /* point to the first `cnt' field */
+    for ( ; numRanges > 0; numRanges-- )
+    {
+      tot += 1 + p[0];
+      p   += 4;
+    }
+
+    return tot;
+  }
+
+
+  static FT_UInt32*
+  tt_cmap14_get_def_chars( TT_CMap    cmap,
+                           FT_Byte*   p,
+                           FT_Memory  memory )
+  {
+    TT_CMap14   cmap14 = (TT_CMap14) cmap;
+    FT_UInt32   numRanges;
+    FT_UInt     cnt;
+    FT_UInt32*  q;
+
+
+    cnt       = tt_cmap14_def_char_count( p );
+    numRanges = (FT_UInt32)TT_NEXT_ULONG( p );
+
+    if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) )
+      return NULL;
+
+    for ( q = cmap14->results; numRanges > 0; --numRanges )
+    {
+      FT_UInt32  uni = (FT_UInt32)TT_NEXT_UINT24( p );
+
+
+      cnt = FT_NEXT_BYTE( p ) + 1;
+      do
+      {
+        q[0]  = uni;
+        uni  += 1;
+        q    += 1;
+
+      } while ( --cnt != 0 );
+    }
+    q[0] = 0;
+
+    return cmap14->results;
+  }
+
+
+  static FT_UInt32*
+  tt_cmap14_get_nondef_chars( TT_CMap     cmap,
+                              FT_Byte    *p,
+                              FT_Memory   memory )
+  {
+    TT_CMap14   cmap14 = (TT_CMap14) cmap;
+    FT_UInt32   numMappings;
+    FT_UInt     i;
+    FT_UInt32  *ret;
+
+
+    numMappings = (FT_UInt32)TT_NEXT_ULONG( p );
+
+    if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) )
+      return NULL;
+
+    ret = cmap14->results;
+    for ( i = 0; i < numMappings; ++i )
+    {
+      ret[i] = (FT_UInt32)TT_NEXT_UINT24( p );
+      p += 2;
+    }
+    ret[i] = 0;
+
+    return ret;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 * )
+  tt_cmap14_variant_chars( TT_CMap    cmap,
+                           FT_Memory  memory,
+                           FT_UInt32  variantSelector )
+  {
+    FT_Byte    *p  = tt_cmap14_find_variant( cmap->data + 6,
+                                             variantSelector );
+    FT_UInt32  *ret;
+    FT_Int      i;
+    FT_ULong    defOff;
+    FT_ULong    nondefOff;
+
+
+    if ( !p )
+      return NULL;
+
+    defOff    = TT_NEXT_ULONG( p );
+    nondefOff = TT_NEXT_ULONG( p );
+
+    if ( defOff == 0 && nondefOff == 0 )
+      return NULL;
+
+    if ( defOff == 0 )
+      return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
+                                         memory );
+    else if ( nondefOff == 0 )
+      return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
+                                      memory );
+    else
+    {
+      /* Both a default and a non-default glyph set?  That's probably not */
+      /* good font design, but the spec allows for it...                  */
+      TT_CMap14  cmap14 = (TT_CMap14) cmap;
+      FT_UInt32  numRanges;
+      FT_UInt32  numMappings;
+      FT_UInt32  duni;
+      FT_UInt32  dcnt;
+      FT_UInt32  nuni;
+      FT_Byte*   dp;
+      FT_UInt    di, ni, k;
+
+
+      p  = cmap->data + nondefOff;
+      dp = cmap->data + defOff;
+
+      numMappings = (FT_UInt32)TT_NEXT_ULONG( p );
+      dcnt        = tt_cmap14_def_char_count( dp );
+      numRanges   = (FT_UInt32)TT_NEXT_ULONG( dp );
+
+      if ( numMappings == 0 )
+        return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
+                                        memory );
+      if ( dcnt == 0 )
+        return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
+                                           memory );
+
+      if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) )
+        return NULL;
+
+      ret  = cmap14->results;
+      duni = (FT_UInt32)TT_NEXT_UINT24( dp );
+      dcnt = FT_NEXT_BYTE( dp );
+      di   = 1;
+      nuni = (FT_UInt32)TT_NEXT_UINT24( p );
+      p   += 2;
+      ni   = 1;
+      i    = 0;
+
+      for ( ;; )
+      {
+        if ( nuni > duni + dcnt )
+        {
+          for ( k = 0; k <= dcnt; ++k )
+            ret[i++] = duni + k;
+
+          ++di;
+
+          if ( di > numRanges )
+            break;
+
+          duni = (FT_UInt32)TT_NEXT_UINT24( dp );
+          dcnt = FT_NEXT_BYTE( dp );
+        }
+        else
+        {
+          if ( nuni < duni )
+            ret[i++] = nuni;
+          /* If it is within the default range then ignore it -- */
+          /* that should not have happened                       */
+          ++ni;
+          if ( ni > numMappings )
+            break;
+
+          nuni = (FT_UInt32)TT_NEXT_UINT24( p );
+          p += 2;
+        }
+      }
+
+      if ( ni <= numMappings )
+      {
+        /* If we get here then we have run out of all default ranges.   */
+        /* We have read one non-default mapping which we haven't stored */
+        /* and there may be others that need to be read.                */
+        ret[i++] = nuni;
+        while ( ni < numMappings )
+        {
+          ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p );
+          p += 2;
+          ++ni;
+        }
+      }
+      else if ( di <= numRanges )
+      {
+        /* If we get here then we have run out of all non-default     */
+        /* mappings.  We have read one default range which we haven't */
+        /* stored and there may be others that need to be read.       */
+        for ( k = 0; k <= dcnt; ++k )
+          ret[i++] = duni + k;
+
+        while ( di < numRanges )
+        {
+          duni = (FT_UInt32)TT_NEXT_UINT24( dp );
+          dcnt = FT_NEXT_BYTE( dp );
+
+          for ( k = 0; k <= dcnt; ++k )
+            ret[i++] = duni + k;
+          ++di;
+        }
+      }
+
+      ret[i] = 0;
+
+      return ret;
+    }
+  }
+
+
+  FT_DEFINE_TT_CMAP(
+    tt_cmap14_class_rec,
+    sizeof ( TT_CMap14Rec ),
+
+    (FT_CMap_InitFunc)     tt_cmap14_init,
+    (FT_CMap_DoneFunc)     tt_cmap14_done,
+    (FT_CMap_CharIndexFunc)tt_cmap14_char_index,
+    (FT_CMap_CharNextFunc) tt_cmap14_char_next,
+
+    /* Format 14 extension functions */
+    (FT_CMap_CharVarIndexFunc)    tt_cmap14_char_var_index,
+    (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault,
+    (FT_CMap_VariantListFunc)     tt_cmap14_variants,
+    (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants,
+    (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars,
+
+    14,
+    (TT_CMap_ValidateFunc)tt_cmap14_validate,
+    (TT_CMap_Info_GetFunc)tt_cmap14_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_14 */
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+  static const TT_CMap_Class  tt_cmap_classes[] =
+  {
+#define TTCMAPCITEM( a )  &a,
+#include "ttcmapc.h"
+    NULL,
+  };
+
+#else /*FT_CONFIG_OPTION_PIC*/
+
+  void
+  FT_Destroy_Class_tt_cmap_classes( FT_Library      library,
+                                    TT_CMap_Class*  clazz )
+  {
+    FT_Memory  memory = library->memory;
+
+
+    if ( clazz )
+      FT_FREE( clazz );
+  }
+
+
+  FT_Error
+  FT_Create_Class_tt_cmap_classes( FT_Library       library,
+                                   TT_CMap_Class**  output_class )
+  {
+    TT_CMap_Class*     clazz  = NULL;
+    TT_CMap_ClassRec*  recs;
+    FT_Error           error;
+    FT_Memory          memory = library->memory;
+
+    int  i = 0;
+
+
+#define TTCMAPCITEM( a ) i++;
+#include "ttcmapc.h"
+
+    /* allocate enough space for both the pointers */
+    /* plus terminator and the class instances     */
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * ( i + 1 ) +
+                          sizeof ( TT_CMap_ClassRec ) * i ) )
+      return error;
+
+    /* the location of the class instances follows the array of pointers */
+    recs = (TT_CMap_ClassRec*)( (char*)clazz +
+                                sizeof ( *clazz ) * ( i + 1 ) );
+    i    = 0;
+
+#undef TTCMAPCITEM
+#define  TTCMAPCITEM( a )             \
+    FT_Init_Class_ ## a( &recs[i] );  \
+    clazz[i] = &recs[i];              \
+    i++;
+#include "ttcmapc.h"
+
+    clazz[i] = NULL;
+
+    *output_class = clazz;
+    return FT_Err_Ok;
+  }
+
+#endif /*FT_CONFIG_OPTION_PIC*/
+
+
+  /* parse the `cmap' table and build the corresponding TT_CMap objects */
+  /* in the current face                                                */
+  /*                                                                    */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_build_cmaps( TT_Face  face )
+  {
+    FT_Byte*           table = face->cmap_table;
+    FT_Byte*           limit = table + face->cmap_size;
+    FT_UInt volatile   num_cmaps;
+    FT_Byte* volatile  p     = table;
+    FT_Library         library = FT_FACE_LIBRARY( face );
+
+    FT_UNUSED( library );
+
+
+    if ( !p || p + 4 > limit )
+      return FT_THROW( Invalid_Table );
+
+    /* only recognize format 0 */
+    if ( TT_NEXT_USHORT( p ) != 0 )
+    {
+      p -= 2;
+      FT_ERROR(( "tt_face_build_cmaps:"
+                 " unsupported `cmap' table format = %d\n",
+                 TT_PEEK_USHORT( p ) ));
+      return FT_THROW( Invalid_Table );
+    }
+
+    num_cmaps = TT_NEXT_USHORT( p );
+
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+    if ( num_cmaps > FT_MAX_CHARMAP_CACHEABLE )
+      FT_ERROR(( "tt_face_build_cmaps: too many cmap subtables (%d)\n"
+                 "                     subtable #%d and higher are loaded"
+                 "                     but cannot be searched\n",
+                 num_cmaps, FT_MAX_CHARMAP_CACHEABLE + 1 ));
+#endif
+
+    for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- )
+    {
+      FT_CharMapRec  charmap;
+      FT_UInt32      offset;
+
+
+      charmap.platform_id = TT_NEXT_USHORT( p );
+      charmap.encoding_id = TT_NEXT_USHORT( p );
+      charmap.face        = FT_FACE( face );
+      charmap.encoding    = FT_ENCODING_NONE;  /* will be filled later */
+      offset              = TT_NEXT_ULONG( p );
+
+      if ( offset && offset <= face->cmap_size - 2 )
+      {
+        FT_Byte* volatile              cmap   = table + offset;
+        volatile FT_UInt               format = TT_PEEK_USHORT( cmap );
+        const TT_CMap_Class* volatile  pclazz = TT_CMAP_CLASSES_GET;
+        TT_CMap_Class volatile         clazz;
+
+
+        for ( ; *pclazz; pclazz++ )
+        {
+          clazz = *pclazz;
+          if ( clazz->format == format )
+          {
+            volatile TT_ValidatorRec  valid;
+            volatile FT_Error         error = FT_Err_Ok;
+
+
+            ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit,
+                               FT_VALIDATE_DEFAULT );
+
+            valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs;
+#ifndef _FX_MANAGED_CODE_
+            if ( ft_setjmp( FT_VALIDATOR( &valid )->jump_buffer) == 0 )
+            {
+#endif
+              /* validate this cmap sub-table */
+              error = clazz->validate( cmap, FT_VALIDATOR( &valid ) );
+#ifndef _FX_MANAGED_CODE_            
+			}
+#endif
+
+            if ( valid.validator.error == 0 )
+            {
+              FT_CMap  ttcmap;
+
+
+              /* It might make sense to store the single variation         */
+              /* selector cmap somewhere special.  But it would have to be */
+              /* in the public FT_FaceRec, and we can't change that.       */
+
+              if ( !FT_CMap_New( (FT_CMap_Class)clazz,
+                                 cmap, &charmap, &ttcmap ) )
+              {
+                /* it is simpler to directly set `flags' than adding */
+                /* a parameter to FT_CMap_New                        */
+                ((TT_CMap)ttcmap)->flags = (FT_Int)error;
+              }
+            }
+            else
+            {
+              FT_TRACE0(( "tt_face_build_cmaps:"
+                          " broken cmap sub-table ignored\n" ));
+            }
+            break;
+          }
+        }
+
+        if ( *pclazz == NULL )
+        {
+          FT_TRACE0(( "tt_face_build_cmaps:"
+                      " unsupported cmap sub-table ignored\n" ));
+        }
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_LOCAL( FT_Error )
+  tt_get_cmap_info( FT_CharMap    charmap,
+                    TT_CMapInfo  *cmap_info )
+  {
+    FT_CMap        cmap  = (FT_CMap)charmap;
+    TT_CMap_Class  clazz = (TT_CMap_Class)cmap->clazz;
+
+
+    return clazz->get_cmap_info( charmap, cmap_info );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.h
new file mode 100644
index 0000000..3862494
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.h
@@ -0,0 +1,158 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttcmap.h                                                               */
+/*                                                                         */
+/*    TrueType character mapping table (cmap) support (specification).     */
+/*                                                                         */
+/*  Copyright 2002-2005, 2009, 2012 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTCMAP_H__
+#define __TTCMAP_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/tttypes.h"
+#include "../../include/freetype/internal/ftvalid.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+
+FT_BEGIN_HEADER
+
+
+#define TT_CMAP_FLAG_UNSORTED     1
+#define TT_CMAP_FLAG_OVERLAPPING  2
+
+  typedef struct  TT_CMapRec_
+  {
+    FT_CMapRec  cmap;
+    FT_Byte*    data;           /* pointer to in-memory cmap table */
+    FT_Int      flags;          /* for format 4 only               */
+
+  } TT_CMapRec, *TT_CMap;
+
+  typedef const struct TT_CMap_ClassRec_*  TT_CMap_Class;
+
+
+  typedef FT_Error
+  (*TT_CMap_ValidateFunc)( FT_Byte*      data,
+                           FT_Validator  valid );
+
+  typedef struct  TT_CMap_ClassRec_
+  {
+    FT_CMap_ClassRec      clazz;
+    FT_UInt               format;
+    TT_CMap_ValidateFunc  validate;
+    TT_CMap_Info_GetFunc  get_cmap_info;
+
+  } TT_CMap_ClassRec;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_TT_CMAP( class_,             \
+                           size_,              \
+                           init_,              \
+                           done_,              \
+                           char_index_,        \
+                           char_next_,         \
+                           char_var_index_,    \
+                           char_var_default_,  \
+                           variant_list_,      \
+                           charvariant_list_,  \
+                           variantchar_list_,  \
+                           format_,            \
+                           validate_,          \
+                           get_cmap_info_ )    \
+  FT_CALLBACK_TABLE_DEF                        \
+  const TT_CMap_ClassRec  class_ =             \
+  {                                            \
+    { size_,                                   \
+      init_,                                   \
+      done_,                                   \
+      char_index_,                             \
+      char_next_,                              \
+      char_var_index_,                         \
+      char_var_default_,                       \
+      variant_list_,                           \
+      charvariant_list_,                       \
+      variantchar_list_                        \
+    },                                         \
+                                               \
+    format_,                                   \
+    validate_,                                 \
+    get_cmap_info_                             \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_TT_CMAP( class_,                      \
+                           size_,                       \
+                           init_,                       \
+                           done_,                       \
+                           char_index_,                 \
+                           char_next_,                  \
+                           char_var_index_,             \
+                           char_var_default_,           \
+                           variant_list_,               \
+                           charvariant_list_,           \
+                           variantchar_list_,           \
+                           format_,                     \
+                           validate_,                   \
+                           get_cmap_info_ )             \
+  void                                                  \
+  FT_Init_Class_ ## class_( TT_CMap_ClassRec*  clazz )  \
+  {                                                     \
+    clazz->clazz.size             = size_;              \
+    clazz->clazz.init             = init_;              \
+    clazz->clazz.done             = done_;              \
+    clazz->clazz.char_index       = char_index_;        \
+    clazz->clazz.char_next        = char_next_;         \
+    clazz->clazz.char_var_index   = char_var_index_;    \
+    clazz->clazz.char_var_default = char_var_default_;  \
+    clazz->clazz.variant_list     = variant_list_;      \
+    clazz->clazz.charvariant_list = charvariant_list_;  \
+    clazz->clazz.variantchar_list = variantchar_list_;  \
+    clazz->format                 = format_;            \
+    clazz->validate               = validate_;          \
+    clazz->get_cmap_info          = get_cmap_info_;     \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  typedef struct  TT_ValidatorRec_
+  {
+    FT_ValidatorRec  validator;
+    FT_UInt          num_glyphs;
+
+  } TT_ValidatorRec, *TT_Validator;
+
+
+#define TT_VALIDATOR( x )          ( (TT_Validator)( x ) )
+#define TT_VALID_GLYPH_COUNT( x )  TT_VALIDATOR( x )->num_glyphs
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_build_cmaps( TT_Face  face );
+
+  /* used in tt-cmaps service */
+  FT_LOCAL( FT_Error )
+  tt_get_cmap_info( FT_CharMap    charmap,
+                    TT_CMapInfo  *cmap_info );
+
+
+FT_END_HEADER
+
+#endif /* __TTCMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmapc.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmapc.h
new file mode 100644
index 0000000..2ea2043
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmapc.h
@@ -0,0 +1,56 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttcmapc.h                                                              */
+/*                                                                         */
+/*    TT CMAP classes definitions (specification only).                    */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifdef TT_CONFIG_CMAP_FORMAT_0
+  TTCMAPCITEM( tt_cmap0_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_2
+  TTCMAPCITEM( tt_cmap2_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_4
+  TTCMAPCITEM( tt_cmap4_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_6
+  TTCMAPCITEM( tt_cmap6_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_8
+  TTCMAPCITEM( tt_cmap8_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_10
+  TTCMAPCITEM( tt_cmap10_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_12
+  TTCMAPCITEM( tt_cmap12_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_13
+  TTCMAPCITEM( tt_cmap13_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_14
+  TTCMAPCITEM( tt_cmap14_class_rec )
+#endif
+
+
+  /* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.c
new file mode 100644
index 0000000..da38cf7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.c
@@ -0,0 +1,306 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttkern.c                                                               */
+/*                                                                         */
+/*    Load the basic TrueType kerning table.  This doesn't handle          */
+/*    kerning data within the GPOS table at the moment.                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttkern.h"
+
+#include "sferrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttkern
+
+
+#undef  TT_KERN_INDEX
+#define TT_KERN_INDEX( g1, g2 )  ( ( (FT_ULong)(g1) << 16 ) | (g2) )
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_kern( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error   error;
+    FT_ULong   table_size;
+    FT_Byte*   p;
+    FT_Byte*   p_limit;
+    FT_UInt    nn, num_tables;
+    FT_UInt32  avail = 0, ordered = 0;
+
+
+    /* the kern table is optional; exit silently if it is missing */
+    error = face->goto_table( face, TTAG_kern, stream, &table_size );
+    if ( error )
+      goto Exit;
+
+    if ( table_size < 4 )  /* the case of a malformed table */
+    {
+      FT_ERROR(( "tt_face_load_kern:"
+                 " kerning table is too small - ignored\n" ));
+      error = FT_THROW( Table_Missing );
+      goto Exit;
+    }
+
+    if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) )
+    {
+      FT_ERROR(( "tt_face_load_kern:"
+                 " could not extract kerning table\n" ));
+      goto Exit;
+    }
+
+    face->kern_table_size = table_size;
+
+    p       = face->kern_table;
+    p_limit = p + table_size;
+
+    p         += 2; /* skip version */
+    num_tables = FT_NEXT_USHORT( p );
+
+    if ( num_tables > 32 ) /* we only support up to 32 sub-tables */
+      num_tables = 32;
+
+    for ( nn = 0; nn < num_tables; nn++ )
+    {
+      FT_UInt    num_pairs, length, coverage;
+      FT_Byte*   p_next;
+      FT_UInt32  mask = (FT_UInt32)1UL << nn;
+
+
+      if ( p + 6 > p_limit )
+        break;
+
+      p_next = p;
+
+      p += 2; /* skip version */
+      length   = FT_NEXT_USHORT( p );
+      coverage = FT_NEXT_USHORT( p );
+
+      if ( length <= 6 )
+        break;
+
+      p_next += length;
+
+      if ( p_next > p_limit )  /* handle broken table */
+        p_next = p_limit;
+
+      /* only use horizontal kerning tables */
+      if ( ( coverage & ~8 ) != 0x0001 ||
+           p + 8 > p_limit             )
+        goto NextTable;
+
+      num_pairs = FT_NEXT_USHORT( p );
+      p        += 6;
+
+      if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */
+        num_pairs = (FT_UInt)( ( p_next - p ) / 6 );
+
+      avail |= mask;
+
+      /*
+       *  Now check whether the pairs in this table are ordered.
+       *  We then can use binary search.
+       */
+      if ( num_pairs > 0 )
+      {
+        FT_ULong  count;
+        FT_ULong  old_pair;
+
+
+        old_pair = FT_NEXT_ULONG( p );
+        p       += 2;
+
+        for ( count = num_pairs - 1; count > 0; count-- )
+        {
+          FT_UInt32  cur_pair;
+
+
+          cur_pair = FT_NEXT_ULONG( p );
+          if ( cur_pair <= old_pair )
+            break;
+
+          p += 2;
+          old_pair = cur_pair;
+        }
+
+        if ( count == 0 )
+          ordered |= mask;
+      }
+
+    NextTable:
+      p = p_next;
+    }
+
+    face->num_kern_tables = nn;
+    face->kern_avail_bits = avail;
+    face->kern_order_bits = ordered;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  tt_face_done_kern( TT_Face  face )
+  {
+    FT_Stream  stream = face->root.stream;
+
+
+    FT_FRAME_RELEASE( face->kern_table );
+    face->kern_table_size = 0;
+    face->num_kern_tables = 0;
+    face->kern_avail_bits = 0;
+    face->kern_order_bits = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Int )
+  tt_face_get_kerning( TT_Face  face,
+                       FT_UInt  left_glyph,
+                       FT_UInt  right_glyph )
+  {
+    FT_Int    result = 0;
+    FT_UInt   count, mask = 1;
+    FT_Byte*  p       = face->kern_table;
+    FT_Byte*  p_limit = p + face->kern_table_size;
+
+
+    p   += 4;
+    mask = 0x0001;
+
+    for ( count = face->num_kern_tables;
+          count > 0 && p + 6 <= p_limit;
+          count--, mask <<= 1 )
+    {
+      FT_Byte* base     = p;
+      FT_Byte* next     = base;
+      FT_UInt  version  = FT_NEXT_USHORT( p );
+      FT_UInt  length   = FT_NEXT_USHORT( p );
+      FT_UInt  coverage = FT_NEXT_USHORT( p );
+      FT_UInt  num_pairs;
+      FT_Int   value    = 0;
+
+      FT_UNUSED( version );
+
+
+      next = base + length;
+
+      if ( next > p_limit )  /* handle broken table */
+        next = p_limit;
+
+      if ( ( face->kern_avail_bits & mask ) == 0 )
+        goto NextTable;
+
+      if ( p + 8 > next )
+        goto NextTable;
+
+      num_pairs = FT_NEXT_USHORT( p );
+      p        += 6;
+
+      if ( ( next - p ) < 6 * (int)num_pairs )  /* handle broken count  */
+        num_pairs = (FT_UInt)( ( next - p ) / 6 );
+
+      switch ( coverage >> 8 )
+      {
+      case 0:
+        {
+          FT_ULong  key0 = TT_KERN_INDEX( left_glyph, right_glyph );
+
+
+          if ( face->kern_order_bits & mask )   /* binary search */
+          {
+            FT_UInt   min = 0;
+            FT_UInt   max = num_pairs;
+
+
+            while ( min < max )
+            {
+              FT_UInt   mid = ( min + max ) >> 1;
+              FT_Byte*  q   = p + 6 * mid;
+              FT_ULong  key;
+
+
+              key = FT_NEXT_ULONG( q );
+
+              if ( key == key0 )
+              {
+                value = FT_PEEK_SHORT( q );
+                goto Found;
+              }
+              if ( key < key0 )
+                min = mid + 1;
+              else
+                max = mid;
+            }
+          }
+          else /* linear search */
+          {
+            FT_UInt  count2;
+
+
+            for ( count2 = num_pairs; count2 > 0; count2-- )
+            {
+              FT_ULong  key = FT_NEXT_ULONG( p );
+
+
+              if ( key == key0 )
+              {
+                value = FT_PEEK_SHORT( p );
+                goto Found;
+              }
+              p += 2;
+            }
+          }
+        }
+        break;
+
+       /*
+        *  We don't support format 2 because we haven't seen a single font
+        *  using it in real life...
+        */
+
+      default:
+        ;
+      }
+
+      goto NextTable;
+
+    Found:
+      if ( coverage & 8 ) /* override or add */
+        result = value;
+      else
+        result += value;
+
+    NextTable:
+      p = next;
+    }
+
+    return result;
+  }
+
+#undef TT_KERN_INDEX
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.h
new file mode 100644
index 0000000..c2f1a93
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.h
@@ -0,0 +1,52 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttkern.h                                                               */
+/*                                                                         */
+/*    Load the basic TrueType kerning table.  This doesn't handle          */
+/*    kerning data within the GPOS table at the moment.                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2005, 2007 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTKERN_H__
+#define __TTKERN_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error  )
+  tt_face_load_kern( TT_Face    face,
+                     FT_Stream  stream );
+
+  FT_LOCAL( void )
+  tt_face_done_kern( TT_Face  face );
+
+  FT_LOCAL( FT_Int )
+  tt_face_get_kerning( TT_Face     face,
+                       FT_UInt     left_glyph,
+                       FT_UInt     right_glyph );
+
+#define TT_FACE_HAS_KERNING( face )  ( (face)->kern_avail_bits != 0 )
+
+
+FT_END_HEADER
+
+#endif /* __TTKERN_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.c
new file mode 100644
index 0000000..38b7559
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.c
@@ -0,0 +1,1295 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttload.c                                                               */
+/*                                                                         */
+/*    Load the basic TrueType tables, i.e., tables that can be either in   */
+/*    TTF or OTF fonts (body).                                             */
+/*                                                                         */
+/*  Copyright 1996-2010, 2012, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttload.h"
+
+#include "sferrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttload
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_lookup_table                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Looks for a TrueType table by name.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A face object handle.                                      */
+  /*                                                                       */
+  /*    tag  :: The searched tag.                                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A pointer to the table directory entry.  0 if not found.           */
+  /*                                                                       */
+  FT_LOCAL_DEF( TT_Table  )
+  tt_face_get_nexttable(TT_Table first, TT_Table limit, TT_Table entry)
+  {
+	  TT_Table temp = NULL;
+	  if (!entry) return NULL;
+
+	  for (first; first < limit; first++){
+		  if (entry->Offset + entry->Length <= first->Offset){
+			  if (!temp || first->Offset < temp->Offset){
+				  temp = first;
+			  }
+		  }
+	  }
+	  return temp;
+  }
+
+  FT_LOCAL_DEF( TT_Table  )
+  tt_face_lookup_table( TT_Face   face,
+                        FT_ULong  tag  )
+  {
+    TT_Table  entry;
+    TT_Table  limit;
+#ifdef FT_DEBUG_LEVEL_TRACE
+    FT_Bool   zero_length = FALSE;
+#endif
+
+
+    FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ",
+                face,
+                (FT_Char)( tag >> 24 ),
+                (FT_Char)( tag >> 16 ),
+                (FT_Char)( tag >> 8  ),
+                (FT_Char)( tag       ) ));
+
+    entry = face->dir_tables;
+    limit = entry + face->num_tables;
+
+    for ( ; entry < limit; entry++ )
+    {
+      /* For compatibility with Windows, we consider    */
+      /* zero-length tables the same as missing tables. */
+      if ( entry->Tag == tag )
+      {
+        if ( entry->Length != 0 )
+        {
+          if (tag == TTAG_loca){
+			  TT_Table next = tt_face_get_nexttable(face->dir_tables, limit, entry);
+			  if (next && entry->Offset + entry->Length < next->Offset)
+				  entry->Length = next->Offset - entry->Offset;
+		  }
+          FT_TRACE4(( "found table.\n" ));
+          return entry;
+        }
+#ifdef FT_DEBUG_LEVEL_TRACE
+        zero_length = TRUE;
+#endif
+      }
+    }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    if ( zero_length )
+      FT_TRACE4(( "ignoring empty table\n" ));
+    else
+      FT_TRACE4(( "could not find table\n" ));
+#endif
+
+    return NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_goto_table                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Looks for a TrueType table by name, then seek a stream to it.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A face object handle.                                    */
+  /*                                                                       */
+  /*    tag    :: The searched tag.                                        */
+  /*                                                                       */
+  /*    stream :: The stream to seek when the table is found.              */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    length :: The length of the table if found, undefined otherwise.   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_goto_table( TT_Face    face,
+                      FT_ULong   tag,
+                      FT_Stream  stream,
+                      FT_ULong*  length )
+  {
+    TT_Table  table;
+    FT_Error  error = 0;
+
+
+    table = tt_face_lookup_table( face, tag );
+    if ( table )
+    {
+      if ( length )
+        *length = table->Length;
+
+      if ( FT_STREAM_SEEK( table->Offset ) )
+        goto Exit;
+    }
+    else
+      error = FT_THROW( Table_Missing );
+
+  Exit:
+    return error;
+  }
+
+
+  /* Here, we                                                         */
+  /*                                                                  */
+  /* - check that `num_tables' is valid (and adjust it if necessary)  */
+  /*                                                                  */
+  /* - look for a `head' table, check its size, and parse it to check */
+  /*   whether its `magic' field is correctly set                     */
+  /*                                                                  */
+  /* - errors (except errors returned by stream handling)             */
+  /*                                                                  */
+  /*     SFNT_Err_Unknown_File_Format:                                */
+  /*       no table is defined in directory, it is not sfnt-wrapped   */
+  /*       data                                                       */
+  /*     SFNT_Err_Table_Missing:                                      */
+  /*       table directory is valid, but essential tables             */
+  /*       (head/bhed/SING) are missing                               */
+  /*                                                                  */
+  static FT_Error
+  check_table_dir( SFNT_Header  sfnt,
+                   FT_Stream    stream )
+  {
+    FT_Error   error;
+    FT_UShort  nn, valid_entries = 0;
+    FT_UInt    has_head = 0, has_sing = 0, has_meta = 0;
+    FT_ULong   offset = sfnt->offset + 12;
+
+    static const FT_Frame_Field  table_dir_entry_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_TableRec
+
+      FT_FRAME_START( 16 ),
+        FT_FRAME_ULONG( Tag ),
+        FT_FRAME_ULONG( CheckSum ),
+        FT_FRAME_ULONG( Offset ),
+        FT_FRAME_ULONG( Length ),
+      FT_FRAME_END
+    };
+
+
+    if ( FT_STREAM_SEEK( offset ) )
+      goto Exit;
+
+    for ( nn = 0; nn < sfnt->num_tables; nn++ )
+    {
+      TT_TableRec  table;
+
+
+      if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) )
+      {
+        nn--;
+        FT_TRACE2(( "check_table_dir:"
+                    " can read only %d table%s in font (instead of %d)\n",
+                    nn, nn == 1 ? "" : "s", sfnt->num_tables ));
+        sfnt->num_tables = nn;
+        break;
+      }
+
+      /* we ignore invalid tables */
+      if ( table.Offset + table.Length > stream->size )
+      {
+		//BUGID: 53876, the cmap table is invalid, the font file couldn't be used.
+		if (table.Tag == TTAG_cmap) break;
+        FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn ));
+        continue;
+      }
+      else
+        valid_entries++;
+
+      if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed )
+      {
+        FT_UInt32  magic;
+
+
+#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+        if ( table.Tag == TTAG_head )
+#endif
+          has_head = 1;
+
+        /*
+         * The table length should be 0x36, but certain font tools make it
+         * 0x38, so we will just check that it is greater.
+         *
+         * Note that according to the specification, the table must be
+         * padded to 32-bit lengths, but this doesn't apply to the value of
+         * its `Length' field!
+         *
+         */
+        if ( table.Length < 0x36 )
+        {
+          FT_TRACE2(( "check_table_dir: `head' table too small\n" ));
+          error = FT_THROW( Table_Missing );
+          goto Exit;
+        }
+
+        if ( FT_STREAM_SEEK( table.Offset + 12 ) ||
+             FT_READ_ULONG( magic )              )
+          goto Exit;
+
+        if ( magic != 0x5F0F3CF5UL )
+        {
+          FT_TRACE2(( "check_table_dir:"
+                      " no magic number found in `head' table\n"));
+          error = FT_THROW( Table_Missing );
+          goto Exit;
+        }
+
+        if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) )
+          goto Exit;
+      }
+      else if ( table.Tag == TTAG_SING )
+        has_sing = 1;
+      else if ( table.Tag == TTAG_META )
+        has_meta = 1;
+    }
+
+    sfnt->num_tables = valid_entries;
+
+    if ( sfnt->num_tables == 0 )
+    {
+      FT_TRACE2(( "check_table_dir: no tables found\n" ));
+      error = FT_THROW( Unknown_File_Format );
+      goto Exit;
+    }
+
+    /* if `sing' and `meta' tables are present, there is no `head' table */
+    if ( has_head || ( has_sing && has_meta ) )
+    {
+      error = FT_Err_Ok;
+      goto Exit;
+    }
+    else
+    {
+      FT_TRACE2(( "check_table_dir:" ));
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+      FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" ));
+#else
+      FT_TRACE2(( " neither `head' nor `sing' table found\n" ));
+#endif
+      error = FT_THROW( Table_Missing );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_font_dir                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the header of a SFNT font file.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: A handle to the target face object.                  */
+  /*                                                                       */
+  /*    stream     :: The input stream.                                    */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    sfnt       :: The SFNT header.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be at the beginning of the font directory.  */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_font_dir( TT_Face    face,
+                         FT_Stream  stream )
+  {
+    SFNT_HeaderRec  sfnt;
+    FT_Error        error;
+    FT_Memory       memory = stream->memory;
+    TT_TableRec*    entry;
+    FT_Int          nn;
+
+    static const FT_Frame_Field  offset_table_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  SFNT_HeaderRec
+
+      FT_FRAME_START( 8 ),
+        FT_FRAME_USHORT( num_tables ),
+        FT_FRAME_USHORT( search_range ),
+        FT_FRAME_USHORT( entry_selector ),
+        FT_FRAME_USHORT( range_shift ),
+      FT_FRAME_END
+    };
+
+
+    FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face ));
+
+    /* read the offset table */
+
+    sfnt.offset = FT_STREAM_POS();
+
+    if ( FT_READ_ULONG( sfnt.format_tag )                    ||
+         FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) )
+      goto Exit;
+
+    /* many fonts don't have these fields set correctly */
+#if 0
+    if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 )        ||
+         sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 )
+      return FT_THROW( Unknown_File_Format );
+#endif
+
+    /* load the table directory */
+
+    FT_TRACE2(( "-- Number of tables: %10u\n",    sfnt.num_tables ));
+    FT_TRACE2(( "-- Format version:   0x%08lx\n", sfnt.format_tag ));
+
+    if ( sfnt.format_tag != TTAG_OTTO )
+    {
+      /* check first */
+      error = check_table_dir( &sfnt, stream );
+      if ( error )
+      {
+        FT_TRACE2(( "tt_face_load_font_dir:"
+                    " invalid table directory for TrueType\n" ));
+
+        goto Exit;
+      }
+    }
+
+    face->num_tables = sfnt.num_tables;
+    face->format_tag = sfnt.format_tag;
+
+    if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) )
+      goto Exit;
+
+    if ( FT_STREAM_SEEK( sfnt.offset + 12 )       ||
+         FT_FRAME_ENTER( face->num_tables * 16L ) )
+      goto Exit;
+
+    entry = face->dir_tables;
+
+    FT_TRACE2(( "\n"
+                "  tag    offset    length   checksum\n"
+                "  ----------------------------------\n" ));
+
+    for ( nn = 0; nn < sfnt.num_tables; nn++ )
+    {
+      entry->Tag      = FT_GET_TAG4();
+      entry->CheckSum = FT_GET_ULONG();
+      entry->Offset   = FT_GET_LONG();
+      entry->Length   = FT_GET_LONG();
+
+      /* ignore invalid tables */
+      if ( entry->Offset + entry->Length > stream->size )
+        continue;
+      else
+      {
+        FT_TRACE2(( "  %c%c%c%c  %08lx  %08lx  %08lx\n",
+                    (FT_Char)( entry->Tag >> 24 ),
+                    (FT_Char)( entry->Tag >> 16 ),
+                    (FT_Char)( entry->Tag >> 8  ),
+                    (FT_Char)( entry->Tag       ),
+                    entry->Offset,
+                    entry->Length,
+                    entry->CheckSum ));
+        entry++;
+      }
+    }
+
+    FT_FRAME_EXIT();
+
+    FT_TRACE2(( "table directory loaded\n\n" ));
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_any                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads any font table into client memory.                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: The face object to look for.                             */
+  /*                                                                       */
+  /*    tag    :: The tag of table to load.  Use the value 0 if you want   */
+  /*              to access the whole font file, else set this parameter   */
+  /*              to a valid TrueType table tag that you can forge with    */
+  /*              the MAKE_TT_TAG macro.                                   */
+  /*                                                                       */
+  /*    offset :: The starting offset in the table (or the file if         */
+  /*              tag == 0).                                               */
+  /*                                                                       */
+  /*    length :: The address of the decision variable:                    */
+  /*                                                                       */
+  /*                If length == NULL:                                     */
+  /*                  Loads the whole table.  Returns an error if          */
+  /*                  `offset' == 0!                                       */
+  /*                                                                       */
+  /*                If *length == 0:                                       */
+  /*                  Exits immediately; returning the length of the given */
+  /*                  table or of the font file, depending on the value of */
+  /*                  `tag'.                                               */
+  /*                                                                       */
+  /*                If *length != 0:                                       */
+  /*                  Loads the next `length' bytes of table or font,      */
+  /*                  starting at offset `offset' (in table or font too).  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    buffer :: The address of target buffer.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_any( TT_Face    face,
+                    FT_ULong   tag,
+                    FT_Long    offset,
+                    FT_Byte*   buffer,
+                    FT_ULong*  length )
+  {
+    FT_Error   error;
+    FT_Stream  stream;
+    TT_Table   table;
+    FT_ULong   size;
+
+
+    if ( tag != 0 )
+    {
+      /* look for tag in font directory */
+      table = tt_face_lookup_table( face, tag );
+      if ( !table )
+      {
+        error = FT_THROW( Table_Missing );
+        goto Exit;
+      }
+
+      offset += table->Offset;
+      size    = table->Length;
+    }
+    else
+      /* tag == 0 -- the user wants to access the font file directly */
+      size = face->root.stream->size;
+
+    if ( length && *length == 0 )
+    {
+      *length = size;
+
+      return FT_Err_Ok;
+    }
+
+    if ( length )
+      size = *length;
+
+    stream = face->root.stream;
+    /* the `if' is syntactic sugar for picky compilers */
+    if ( FT_STREAM_READ_AT( offset, buffer, size ) )
+      goto Exit;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_generic_header                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the TrueType table `head' or `bhed'.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  tt_face_load_generic_header( TT_Face    face,
+                               FT_Stream  stream,
+                               FT_ULong   tag )
+  {
+    FT_Error    error;
+    TT_Header*  header;
+
+    static const FT_Frame_Field  header_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_Header
+
+      FT_FRAME_START( 54 ),
+        FT_FRAME_ULONG ( Table_Version ),
+        FT_FRAME_ULONG ( Font_Revision ),
+        FT_FRAME_LONG  ( CheckSum_Adjust ),
+        FT_FRAME_LONG  ( Magic_Number ),
+        FT_FRAME_USHORT( Flags ),
+        FT_FRAME_USHORT( Units_Per_EM ),
+        FT_FRAME_LONG  ( Created[0] ),
+        FT_FRAME_LONG  ( Created[1] ),
+        FT_FRAME_LONG  ( Modified[0] ),
+        FT_FRAME_LONG  ( Modified[1] ),
+        FT_FRAME_SHORT ( xMin ),
+        FT_FRAME_SHORT ( yMin ),
+        FT_FRAME_SHORT ( xMax ),
+        FT_FRAME_SHORT ( yMax ),
+        FT_FRAME_USHORT( Mac_Style ),
+        FT_FRAME_USHORT( Lowest_Rec_PPEM ),
+        FT_FRAME_SHORT ( Font_Direction ),
+        FT_FRAME_SHORT ( Index_To_Loc_Format ),
+        FT_FRAME_SHORT ( Glyph_Data_Format ),
+      FT_FRAME_END
+    };
+
+
+    error = face->goto_table( face, tag, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    header = &face->header;
+
+    if ( FT_STREAM_READ_FIELDS( header_fields, header ) )
+      goto Exit;
+
+    FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM ));
+    FT_TRACE3(( "IndexToLoc:   %4d\n", header->Index_To_Loc_Format ));
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_head( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    return tt_face_load_generic_header( face, stream, TTAG_head );
+  }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_bhed( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    return tt_face_load_generic_header( face, stream, TTAG_bhed );
+  }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_max_profile                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the maximum profile into a face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_maxp( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error        error;
+    TT_MaxProfile*  maxProfile = &face->max_profile;
+
+    static const FT_Frame_Field  maxp_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_MaxProfile
+
+      FT_FRAME_START( 6 ),
+        FT_FRAME_LONG  ( version ),
+        FT_FRAME_USHORT( numGlyphs ),
+      FT_FRAME_END
+    };
+
+    static const FT_Frame_Field  maxp_fields_extra[] =
+    {
+      FT_FRAME_START( 26 ),
+        FT_FRAME_USHORT( maxPoints ),
+        FT_FRAME_USHORT( maxContours ),
+        FT_FRAME_USHORT( maxCompositePoints ),
+        FT_FRAME_USHORT( maxCompositeContours ),
+        FT_FRAME_USHORT( maxZones ),
+        FT_FRAME_USHORT( maxTwilightPoints ),
+        FT_FRAME_USHORT( maxStorage ),
+        FT_FRAME_USHORT( maxFunctionDefs ),
+        FT_FRAME_USHORT( maxInstructionDefs ),
+        FT_FRAME_USHORT( maxStackElements ),
+        FT_FRAME_USHORT( maxSizeOfInstructions ),
+        FT_FRAME_USHORT( maxComponentElements ),
+        FT_FRAME_USHORT( maxComponentDepth ),
+      FT_FRAME_END
+    };
+
+
+    error = face->goto_table( face, TTAG_maxp, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) )
+      goto Exit;
+
+    maxProfile->maxPoints             = 0;
+    maxProfile->maxContours           = 0;
+    maxProfile->maxCompositePoints    = 0;
+    maxProfile->maxCompositeContours  = 0;
+    maxProfile->maxZones              = 0;
+    maxProfile->maxTwilightPoints     = 0;
+    maxProfile->maxStorage            = 0;
+    maxProfile->maxFunctionDefs       = 0;
+    maxProfile->maxInstructionDefs    = 0;
+    maxProfile->maxStackElements      = 0;
+    maxProfile->maxSizeOfInstructions = 0;
+    maxProfile->maxComponentElements  = 0;
+    maxProfile->maxComponentDepth     = 0;
+
+    if ( maxProfile->version >= 0x10000L )
+    {
+      if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) )
+        goto Exit;
+
+      /* XXX: an adjustment that is necessary to load certain */
+      /*      broken fonts like `Keystrokes MT' :-(           */
+      /*                                                      */
+      /*   We allocate 64 function entries by default when    */
+      /*   the maxFunctionDefs value is smaller.              */
+
+      if ( maxProfile->maxFunctionDefs < 64 )
+        maxProfile->maxFunctionDefs = 64;
+
+      /* we add 4 phantom points later */
+      if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) )
+      {
+        FT_TRACE0(( "tt_face_load_maxp:"
+                    " too much twilight points in `maxp' table;\n"
+                    "                  "
+                    " some glyphs might be rendered incorrectly\n" ));
+
+        maxProfile->maxTwilightPoints = 0xFFFFU - 4;
+      }
+
+      /* we arbitrarily limit recursion to avoid stack exhaustion */
+      if ( maxProfile->maxComponentDepth > 100 )
+      {
+        FT_TRACE0(( "tt_face_load_maxp:"
+                    " abnormally large component depth (%d) set to 100\n",
+                    maxProfile->maxComponentDepth ));
+        maxProfile->maxComponentDepth = 100;
+      }
+    }
+
+    FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs ));
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_name                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the name records.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_name( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error      error;
+    FT_Memory     memory = stream->memory;
+    FT_ULong      table_pos, table_len;
+    FT_ULong      storage_start, storage_limit;
+    FT_UInt       count;
+    TT_NameTable  table;
+
+    static const FT_Frame_Field  name_table_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_NameTableRec
+
+      FT_FRAME_START( 6 ),
+        FT_FRAME_USHORT( format ),
+        FT_FRAME_USHORT( numNameRecords ),
+        FT_FRAME_USHORT( storageOffset ),
+      FT_FRAME_END
+    };
+
+    static const FT_Frame_Field  name_record_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_NameEntryRec
+
+      /* no FT_FRAME_START */
+        FT_FRAME_USHORT( platformID ),
+        FT_FRAME_USHORT( encodingID ),
+        FT_FRAME_USHORT( languageID ),
+        FT_FRAME_USHORT( nameID ),
+        FT_FRAME_USHORT( stringLength ),
+        FT_FRAME_USHORT( stringOffset ),
+      FT_FRAME_END
+    };
+
+
+    table         = &face->name_table;
+    table->stream = stream;
+
+    error = face->goto_table( face, TTAG_name, stream, &table_len );
+    if ( error )
+      goto Exit;
+
+    table_pos = FT_STREAM_POS();
+
+
+    if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) )
+      goto Exit;
+
+    /* Some popular Asian fonts have an invalid `storageOffset' value   */
+    /* (it should be at least "6 + 12*num_names").  However, the string */
+    /* offsets, computed as "storageOffset + entry->stringOffset", are  */
+    /* valid pointers within the name table...                          */
+    /*                                                                  */
+    /* We thus can't check `storageOffset' right now.                   */
+    /*                                                                  */
+    storage_start = table_pos + 6 + 12*table->numNameRecords;
+    storage_limit = table_pos + table_len;
+
+    if ( storage_start > storage_limit )
+    {
+      FT_ERROR(( "tt_face_load_name: invalid `name' table\n" ));
+      error = FT_THROW( Name_Table_Missing );
+      goto Exit;
+    }
+
+    /* Allocate the array of name records. */
+    count                 = table->numNameRecords;
+    table->numNameRecords = 0;
+
+    if ( FT_NEW_ARRAY( table->names, count ) ||
+         FT_FRAME_ENTER( count * 12 )        )
+      goto Exit;
+
+    /* Load the name records and determine how much storage is needed */
+    /* to hold the strings themselves.                                */
+    {
+      TT_NameEntryRec*  entry = table->names;
+
+
+      for ( ; count > 0; count-- )
+      {
+        if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) )
+          continue;
+
+        /* check that the name is not empty */
+        if ( entry->stringLength == 0 )
+          continue;
+
+        /* check that the name string is within the table */
+        entry->stringOffset += table_pos + table->storageOffset;
+        if ( entry->stringOffset                       < storage_start ||
+             entry->stringOffset + entry->stringLength > storage_limit )
+        {
+          /* invalid entry - ignore it */
+          entry->stringOffset = 0;
+          entry->stringLength = 0;
+          continue;
+        }
+
+        entry++;
+      }
+
+      table->numNameRecords = (FT_UInt)( entry - table->names );
+    }
+
+    FT_FRAME_EXIT();
+
+    /* everything went well, update face->num_names */
+    face->num_names = (FT_UShort) table->numNameRecords;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_free_names                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Frees the name records.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the target face object.                        */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_face_free_name( TT_Face  face )
+  {
+    FT_Memory     memory = face->root.driver->root.memory;
+    TT_NameTable  table  = &face->name_table;
+    TT_NameEntry  entry  = table->names;
+    FT_UInt       count  = table->numNameRecords;
+
+
+    if ( table->names )
+    {
+      for ( ; count > 0; count--, entry++ )
+      {
+        FT_FREE( entry->string );
+        entry->stringLength = 0;
+      }
+
+      /* free strings table */
+      FT_FREE( table->names );
+    }
+
+    table->numNameRecords = 0;
+    table->format         = 0;
+    table->storageOffset  = 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_cmap                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the cmap directory in a face object.  The cmaps themselves   */
+  /*    are loaded on demand in the `ttcmap.c' module.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_cmap( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error  error;
+
+
+    error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size );
+    if ( error )
+      goto Exit;
+
+    if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) )
+      face->cmap_size = 0;
+
+  Exit:
+    return error;
+  }
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_os2                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the OS2 table.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_os2( TT_Face    face,
+                    FT_Stream  stream )
+  {
+    FT_Error  error;
+    TT_OS2*   os2;
+
+    static const FT_Frame_Field  os2_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_OS2
+
+      FT_FRAME_START( 78 ),
+        FT_FRAME_USHORT( version ),
+        FT_FRAME_SHORT ( xAvgCharWidth ),
+        FT_FRAME_USHORT( usWeightClass ),
+        FT_FRAME_USHORT( usWidthClass ),
+        FT_FRAME_SHORT ( fsType ),
+        FT_FRAME_SHORT ( ySubscriptXSize ),
+        FT_FRAME_SHORT ( ySubscriptYSize ),
+        FT_FRAME_SHORT ( ySubscriptXOffset ),
+        FT_FRAME_SHORT ( ySubscriptYOffset ),
+        FT_FRAME_SHORT ( ySuperscriptXSize ),
+        FT_FRAME_SHORT ( ySuperscriptYSize ),
+        FT_FRAME_SHORT ( ySuperscriptXOffset ),
+        FT_FRAME_SHORT ( ySuperscriptYOffset ),
+        FT_FRAME_SHORT ( yStrikeoutSize ),
+        FT_FRAME_SHORT ( yStrikeoutPosition ),
+        FT_FRAME_SHORT ( sFamilyClass ),
+        FT_FRAME_BYTE  ( panose[0] ),
+        FT_FRAME_BYTE  ( panose[1] ),
+        FT_FRAME_BYTE  ( panose[2] ),
+        FT_FRAME_BYTE  ( panose[3] ),
+        FT_FRAME_BYTE  ( panose[4] ),
+        FT_FRAME_BYTE  ( panose[5] ),
+        FT_FRAME_BYTE  ( panose[6] ),
+        FT_FRAME_BYTE  ( panose[7] ),
+        FT_FRAME_BYTE  ( panose[8] ),
+        FT_FRAME_BYTE  ( panose[9] ),
+        FT_FRAME_ULONG ( ulUnicodeRange1 ),
+        FT_FRAME_ULONG ( ulUnicodeRange2 ),
+        FT_FRAME_ULONG ( ulUnicodeRange3 ),
+        FT_FRAME_ULONG ( ulUnicodeRange4 ),
+        FT_FRAME_BYTE  ( achVendID[0] ),
+        FT_FRAME_BYTE  ( achVendID[1] ),
+        FT_FRAME_BYTE  ( achVendID[2] ),
+        FT_FRAME_BYTE  ( achVendID[3] ),
+
+        FT_FRAME_USHORT( fsSelection ),
+        FT_FRAME_USHORT( usFirstCharIndex ),
+        FT_FRAME_USHORT( usLastCharIndex ),
+        FT_FRAME_SHORT ( sTypoAscender ),
+        FT_FRAME_SHORT ( sTypoDescender ),
+        FT_FRAME_SHORT ( sTypoLineGap ),
+        FT_FRAME_USHORT( usWinAscent ),
+        FT_FRAME_USHORT( usWinDescent ),
+      FT_FRAME_END
+    };
+
+    static const FT_Frame_Field  os2_fields_extra[] =
+    {
+      FT_FRAME_START( 8 ),
+        FT_FRAME_ULONG( ulCodePageRange1 ),
+        FT_FRAME_ULONG( ulCodePageRange2 ),
+      FT_FRAME_END
+    };
+
+    static const FT_Frame_Field  os2_fields_extra2[] =
+    {
+      FT_FRAME_START( 10 ),
+        FT_FRAME_SHORT ( sxHeight ),
+        FT_FRAME_SHORT ( sCapHeight ),
+        FT_FRAME_USHORT( usDefaultChar ),
+        FT_FRAME_USHORT( usBreakChar ),
+        FT_FRAME_USHORT( usMaxContext ),
+      FT_FRAME_END
+    };
+
+
+    /* We now support old Mac fonts where the OS/2 table doesn't  */
+    /* exist.  Simply put, we set the `version' field to 0xFFFF   */
+    /* and test this value each time we need to access the table. */
+    error = face->goto_table( face, TTAG_OS2, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    os2 = &face->os2;
+
+    if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) )
+      goto Exit;
+
+    os2->ulCodePageRange1 = 0;
+    os2->ulCodePageRange2 = 0;
+    os2->sxHeight         = 0;
+    os2->sCapHeight       = 0;
+    os2->usDefaultChar    = 0;
+    os2->usBreakChar      = 0;
+    os2->usMaxContext     = 0;
+
+    if ( os2->version >= 0x0001 )
+    {
+      /* only version 1 tables */
+      if ( FT_STREAM_READ_FIELDS( os2_fields_extra, os2 ) )
+        goto Exit;
+
+      if ( os2->version >= 0x0002 )
+      {
+        /* only version 2 tables */
+        if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) )
+          goto Exit;
+      }
+    }
+
+    FT_TRACE3(( "sTypoAscender:  %4d\n",   os2->sTypoAscender ));
+    FT_TRACE3(( "sTypoDescender: %4d\n",   os2->sTypoDescender ));
+    FT_TRACE3(( "usWinAscent:    %4u\n",   os2->usWinAscent ));
+    FT_TRACE3(( "usWinDescent:   %4u\n",   os2->usWinDescent ));
+    FT_TRACE3(( "fsSelection:    0x%2x\n", os2->fsSelection ));
+
+  Exit:
+     /*return error;*/
+	return 0;	/* XYQ 2007-11-23 We can't just quit if OS/2 table can't be loaded.
+				TESTDOC: Bug #3160 - MyDoc.pdf */
+
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_postscript                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the Postscript table.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_post( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error        error;
+    TT_Postscript*  post = &face->postscript;
+
+    static const FT_Frame_Field  post_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_Postscript
+
+      FT_FRAME_START( 32 ),
+        FT_FRAME_ULONG( FormatType ),
+        FT_FRAME_ULONG( italicAngle ),
+        FT_FRAME_SHORT( underlinePosition ),
+        FT_FRAME_SHORT( underlineThickness ),
+        FT_FRAME_ULONG( isFixedPitch ),
+        FT_FRAME_ULONG( minMemType42 ),
+        FT_FRAME_ULONG( maxMemType42 ),
+        FT_FRAME_ULONG( minMemType1 ),
+        FT_FRAME_ULONG( maxMemType1 ),
+      FT_FRAME_END
+    };
+
+
+    error = face->goto_table( face, TTAG_post, stream, 0 );
+    if ( error )
+      return error;
+
+    if ( FT_STREAM_READ_FIELDS( post_fields, post ) )
+      return error;
+
+    /* we don't load the glyph names, we do that in another */
+    /* module (ttpost).                                     */
+
+    FT_TRACE3(( "FormatType:   0x%x\n", post->FormatType ));
+    FT_TRACE3(( "isFixedPitch:   %s\n", post->isFixedPitch
+                                        ? "  yes" : "   no" ));
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_pclt                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the PCL 5 Table.                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_pclt( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    static const FT_Frame_Field  pclt_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_PCLT
+
+      FT_FRAME_START( 54 ),
+        FT_FRAME_ULONG ( Version ),
+        FT_FRAME_ULONG ( FontNumber ),
+        FT_FRAME_USHORT( Pitch ),
+        FT_FRAME_USHORT( xHeight ),
+        FT_FRAME_USHORT( Style ),
+        FT_FRAME_USHORT( TypeFamily ),
+        FT_FRAME_USHORT( CapHeight ),
+        FT_FRAME_BYTES ( TypeFace, 16 ),
+        FT_FRAME_BYTES ( CharacterComplement, 8 ),
+        FT_FRAME_BYTES ( FileName, 6 ),
+        FT_FRAME_CHAR  ( StrokeWeight ),
+        FT_FRAME_CHAR  ( WidthType ),
+        FT_FRAME_BYTE  ( SerifStyle ),
+        FT_FRAME_BYTE  ( Reserved ),
+      FT_FRAME_END
+    };
+
+    FT_Error  error;
+    TT_PCLT*  pclt = &face->pclt;
+
+
+    /* optional table */
+    error = face->goto_table( face, TTAG_PCLT, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) )
+      goto Exit;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_gasp                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the `gasp' table into a face object.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_gasp( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error   error;
+    FT_Memory  memory = stream->memory;
+
+    FT_UInt        j,num_ranges;
+    TT_GaspRange   gaspranges = NULL;
+
+
+    /* the gasp table is optional */
+    error = face->goto_table( face, TTAG_gasp, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    if ( FT_FRAME_ENTER( 4L ) )
+      goto Exit;
+
+    face->gasp.version   = FT_GET_USHORT();
+    face->gasp.numRanges = FT_GET_USHORT();
+
+    FT_FRAME_EXIT();
+
+    /* only support versions 0 and 1 of the table */
+    if ( face->gasp.version >= 2 )
+    {
+      face->gasp.numRanges = 0;
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    num_ranges = face->gasp.numRanges;
+    FT_TRACE3(( "numRanges: %u\n", num_ranges ));
+
+    if ( FT_QNEW_ARRAY( face->gasp.gaspRanges, num_ranges ) ||
+         FT_FRAME_ENTER( num_ranges * 4L )                  )
+      goto Exit;
+
+    gaspranges = face->gasp.gaspRanges;
+
+    for ( j = 0; j < num_ranges; j++ )
+    {
+      gaspranges[j].maxPPEM  = FT_GET_USHORT();
+      gaspranges[j].gaspFlag = FT_GET_USHORT();
+
+      FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n",
+                  j,
+                  gaspranges[j].maxPPEM,
+                  gaspranges[j].gaspFlag ));
+    }
+
+    FT_FRAME_EXIT();
+
+  Exit:
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.h
new file mode 100644
index 0000000..a07bf09
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.h
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttload.h                                                               */
+/*                                                                         */
+/*    Load the basic TrueType tables, i.e., tables that can be either in   */
+/*    TTF or OTF fonts (specification).                                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2005, 2006 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTLOAD_H__
+#define __TTLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( TT_Table  )
+  tt_face_lookup_table( TT_Face   face,
+                        FT_ULong  tag );
+
+  FT_LOCAL( FT_Error )
+  tt_face_goto_table( TT_Face    face,
+                      FT_ULong   tag,
+                      FT_Stream  stream,
+                      FT_ULong*  length );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_font_dir( TT_Face    face,
+                         FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_any( TT_Face    face,
+                    FT_ULong   tag,
+                    FT_Long    offset,
+                    FT_Byte*   buffer,
+                    FT_ULong*  length );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_head( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_cmap( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_maxp( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_name( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_os2( TT_Face    face,
+                    FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_post( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_pclt( TT_Face    face,
+                     FT_Stream  stream );
+
+  FT_LOCAL( void )
+  tt_face_free_name( TT_Face  face );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_gasp( TT_Face    face,
+                     FT_Stream  stream );
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_bhed( TT_Face    face,
+                     FT_Stream  stream );
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+FT_END_HEADER
+
+#endif /* __TTLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.c
new file mode 100644
index 0000000..9fe61fb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.c
@@ -0,0 +1,286 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttmtx.c                                                                */
+/*                                                                         */
+/*    Load the metrics tables common to TTF and OTF fonts (body).          */
+/*                                                                         */
+/*  Copyright 2006-2009, 2011-2013 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttmtx.h"
+
+#include "sferrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttmtx
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_hmtx                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the `hmtx' or `vmtx' table into a face object.                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the target face object.                    */
+  /*                                                                       */
+  /*    stream   :: The input stream.                                      */
+  /*                                                                       */
+  /*    vertical :: A boolean flag.  If set, load `vmtx'.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_hmtx( TT_Face    face,
+                     FT_Stream  stream,
+                     FT_Bool    vertical )
+  {
+    FT_Error   error;
+    FT_ULong   tag, table_size;
+    FT_ULong*  ptable_offset;
+    FT_ULong*  ptable_size;
+
+
+    if ( vertical )
+    {
+      tag           = TTAG_vmtx;
+      ptable_offset = &face->vert_metrics_offset;
+      ptable_size   = &face->vert_metrics_size;
+    }
+    else
+    {
+      tag           = TTAG_hmtx;
+      ptable_offset = &face->horz_metrics_offset;
+      ptable_size   = &face->horz_metrics_size;
+    }
+
+    error = face->goto_table( face, tag, stream, &table_size );
+#if 0
+    if ( error )
+      goto Fail;
+
+    *ptable_size   = table_size;
+    *ptable_offset = FT_STREAM_POS();
+
+  Fail:
+    return error;
+#else
+	*ptable_size   =  error ? 0 : table_size;
+	*ptable_offset = FT_STREAM_POS();
+
+	return 0;
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_hhea                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the `hhea' or 'vhea' table into a face object.                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the target face object.                    */
+  /*                                                                       */
+  /*    stream   :: The input stream.                                      */
+  /*                                                                       */
+  /*    vertical :: A boolean flag.  If set, load `vhea'.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_hhea( TT_Face    face,
+                     FT_Stream  stream,
+                     FT_Bool    vertical )
+  {
+    FT_Error        error;
+    TT_HoriHeader*  header;
+
+    static const FT_Frame_Field  metrics_header_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_HoriHeader
+
+      FT_FRAME_START( 36 ),
+        FT_FRAME_ULONG ( Version ),
+        FT_FRAME_SHORT ( Ascender ),
+        FT_FRAME_SHORT ( Descender ),
+        FT_FRAME_SHORT ( Line_Gap ),
+        FT_FRAME_USHORT( advance_Width_Max ),
+        FT_FRAME_SHORT ( min_Left_Side_Bearing ),
+        FT_FRAME_SHORT ( min_Right_Side_Bearing ),
+        FT_FRAME_SHORT ( xMax_Extent ),
+        FT_FRAME_SHORT ( caret_Slope_Rise ),
+        FT_FRAME_SHORT ( caret_Slope_Run ),
+        FT_FRAME_SHORT ( caret_Offset ),
+        FT_FRAME_SHORT ( Reserved[0] ),
+        FT_FRAME_SHORT ( Reserved[1] ),
+        FT_FRAME_SHORT ( Reserved[2] ),
+        FT_FRAME_SHORT ( Reserved[3] ),
+        FT_FRAME_SHORT ( metric_Data_Format ),
+        FT_FRAME_USHORT( number_Of_HMetrics ),
+      FT_FRAME_END
+    };
+
+
+    if ( vertical )
+    {
+      void  *v = &face->vertical;
+
+
+      error = face->goto_table( face, TTAG_vhea, stream, 0 );
+      if ( error )
+        goto Fail;
+
+      header = (TT_HoriHeader*)v;
+    }
+    else
+    {
+      error = face->goto_table( face, TTAG_hhea, stream, 0 );
+      if ( error )
+        goto Fail;
+
+      header = &face->horizontal;
+    }
+
+    if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) )
+      goto Fail;
+
+    FT_TRACE3(( "Ascender:          %5d\n", header->Ascender ));
+    FT_TRACE3(( "Descender:         %5d\n", header->Descender ));
+    FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics ));
+
+    header->long_metrics  = NULL;
+    header->short_metrics = NULL;
+
+  Fail:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_get_metrics                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Returns the horizontal or vertical metrics in font units for a     */
+  /*    given glyph.  The metrics are the left side bearing (resp. top     */
+  /*    side bearing) and advance width (resp. advance height).            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    header  :: A pointer to either the horizontal or vertical metrics  */
+  /*               structure.                                              */
+  /*                                                                       */
+  /*    idx     :: The glyph index.                                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    bearing :: The bearing, either left side or top side.              */
+  /*                                                                       */
+  /*    advance :: The advance width resp. advance height.                 */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_get_metrics( TT_Face     face,
+                       FT_Bool     vertical,
+                       FT_UInt     gindex,
+                       FT_Short   *abearing,
+                       FT_UShort  *aadvance )
+  {
+    FT_Error        error;
+    FT_Stream       stream = face->root.stream;
+    TT_HoriHeader*  header;
+    FT_ULong        table_pos, table_size, table_end;
+    FT_UShort       k;
+
+
+    if ( vertical )
+    {
+      void*  v = &face->vertical;
+
+
+      header     = (TT_HoriHeader*)v;
+      table_pos  = face->vert_metrics_offset;
+      table_size = face->vert_metrics_size;
+    }
+    else
+    {
+      header     = &face->horizontal;
+      table_pos  = face->horz_metrics_offset;
+      table_size = face->horz_metrics_size;
+    }
+
+    table_end = table_pos + table_size;
+
+    k = header->number_Of_HMetrics;
+
+    if ( k > 0 )
+    {
+      if ( gindex < (FT_UInt)k )
+      {
+        table_pos += 4 * gindex;
+        if ( table_pos + 4 > table_end )
+          goto NoData;
+
+        if ( FT_STREAM_SEEK( table_pos ) ||
+             FT_READ_USHORT( *aadvance ) ||
+             FT_READ_SHORT( *abearing )  )
+          goto NoData;
+      }
+      else
+      {
+        table_pos += 4 * ( k - 1 );
+        if ( table_pos + 4 > table_end )
+          goto NoData;
+
+        if ( FT_STREAM_SEEK( table_pos ) ||
+             FT_READ_USHORT( *aadvance ) )
+          goto NoData;
+
+        table_pos += 4 + 2 * ( gindex - k );
+        if ( table_pos + 2 > table_end )
+          *abearing = 0;
+        else
+        {
+          if ( !FT_STREAM_SEEK( table_pos ) )
+            (void)FT_READ_SHORT( *abearing );
+        }
+      }
+    }
+    else
+    {
+    NoData:
+      *abearing = 0;
+      *aadvance = 0;
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.h
new file mode 100644
index 0000000..78c0f06
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttmtx.h                                                                */
+/*                                                                         */
+/*    Load the metrics tables common to TTF and OTF fonts (specification). */
+/*                                                                         */
+/*  Copyright 2006 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTMTX_H__
+#define __TTMTX_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_hhea( TT_Face    face,
+                     FT_Stream  stream,
+                     FT_Bool    vertical );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_hmtx( TT_Face    face,
+                     FT_Stream  stream,
+                     FT_Bool    vertical );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_get_metrics( TT_Face     face,
+                       FT_Bool     vertical,
+                       FT_UInt     gindex,
+                       FT_Short*   abearing,
+                       FT_UShort*  aadvance );
+
+FT_END_HEADER
+
+#endif /* __TTMTX_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.c
new file mode 100644
index 0000000..37688f2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.c
@@ -0,0 +1,563 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttpost.c                                                               */
+/*                                                                         */
+/*    Postcript name table processing for TrueType and OpenType fonts      */
+/*    (body).                                                              */
+/*                                                                         */
+/*  Copyright 1996-2003, 2006-2010, 2013 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The post table is not completely loaded by the core engine.  This     */
+  /* file loads the missing PS glyph names and implements an API to access */
+  /* them.                                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttpost.h"
+
+#include "sferrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttpost
+
+
+  /* If this configuration macro is defined, we rely on the `PSNames' */
+  /* module to grab the glyph names.                                  */
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+#include "../../include/freetype/internal/services/svpscmap.h"
+
+#define MAC_NAME( x )  ( (FT_String*)psnames->macintosh_name( x ) )
+
+
+#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+   /* Otherwise, we ignore the `PSNames' module, and provide our own  */
+   /* table of Mac names.  Thus, it is possible to build a version of */
+   /* FreeType without the Type 1 driver & PSNames module.            */
+
+#define MAC_NAME( x )  ( (FT_String*)tt_post_default_names[x] )
+
+  /* the 258 default Mac PS glyph names */
+
+  static const FT_String* const  tt_post_default_names[258] =
+  {
+    /*   0 */
+    ".notdef", ".null", "CR", "space", "exclam",
+    "quotedbl", "numbersign", "dollar", "percent", "ampersand",
+    /*  10 */
+    "quotesingle", "parenleft", "parenright", "asterisk", "plus",
+    "comma", "hyphen", "period", "slash", "zero",
+    /*  20 */
+    "one", "two", "three", "four", "five",
+    "six", "seven", "eight", "nine", "colon",
+    /*  30 */
+    "semicolon", "less", "equal", "greater", "question",
+    "at", "A", "B", "C", "D",
+    /*  40 */
+    "E", "F", "G", "H", "I",
+    "J", "K", "L", "M", "N",
+    /*  50 */
+    "O", "P", "Q", "R", "S",
+    "T", "U", "V", "W", "X",
+    /*  60 */
+    "Y", "Z", "bracketleft", "backslash", "bracketright",
+    "asciicircum", "underscore", "grave", "a", "b",
+    /*  70 */
+    "c", "d", "e", "f", "g",
+    "h", "i", "j", "k", "l",
+    /*  80 */
+    "m", "n", "o", "p", "q",
+    "r", "s", "t", "u", "v",
+    /*  90 */
+    "w", "x", "y", "z", "braceleft",
+    "bar", "braceright", "asciitilde", "Adieresis", "Aring",
+    /* 100 */
+    "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis",
+    "aacute", "agrave", "acircumflex", "adieresis", "atilde",
+    /* 110 */
+    "aring", "ccedilla", "eacute", "egrave", "ecircumflex",
+    "edieresis", "iacute", "igrave", "icircumflex", "idieresis",
+    /* 120 */
+    "ntilde", "oacute", "ograve", "ocircumflex", "odieresis",
+    "otilde", "uacute", "ugrave", "ucircumflex", "udieresis",
+    /* 130 */
+    "dagger", "degree", "cent", "sterling", "section",
+    "bullet", "paragraph", "germandbls", "registered", "copyright",
+    /* 140 */
+    "trademark", "acute", "dieresis", "notequal", "AE",
+    "Oslash", "infinity", "plusminus", "lessequal", "greaterequal",
+    /* 150 */
+    "yen", "mu", "partialdiff", "summation", "product",
+    "pi", "integral", "ordfeminine", "ordmasculine", "Omega",
+    /* 160 */
+    "ae", "oslash", "questiondown", "exclamdown", "logicalnot",
+    "radical", "florin", "approxequal", "Delta", "guillemotleft",
+    /* 170 */
+    "guillemotright", "ellipsis", "nbspace", "Agrave", "Atilde",
+    "Otilde", "OE", "oe", "endash", "emdash",
+    /* 180 */
+    "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide",
+    "lozenge", "ydieresis", "Ydieresis", "fraction", "currency",
+    /* 190 */
+    "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl",
+    "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex",
+    /* 200 */
+    "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute",
+    "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex",
+    /* 210 */
+    "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave",
+    "dotlessi", "circumflex", "tilde", "macron", "breve",
+    /* 220 */
+    "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek",
+    "caron", "Lslash", "lslash", "Scaron", "scaron",
+    /* 230 */
+    "Zcaron", "zcaron", "brokenbar", "Eth", "eth",
+    "Yacute", "yacute", "Thorn", "thorn", "minus",
+    /* 240 */
+    "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf",
+    "onequarter", "threequarters", "franc", "Gbreve", "gbreve",
+    /* 250 */
+    "Idot", "Scedilla", "scedilla", "Cacute", "cacute",
+    "Ccaron", "ccaron", "dmacron",
+  };
+
+
+#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+  static FT_Error
+  load_format_20( TT_Face    face,
+                  FT_Stream  stream,
+                  FT_Long    post_limit )
+  {
+    FT_Memory   memory = stream->memory;
+    FT_Error    error;
+
+    FT_Int      num_glyphs;
+    FT_UShort   num_names;
+
+    FT_UShort*  glyph_indices = 0;
+    FT_Char**   name_strings  = 0;
+
+
+    if ( FT_READ_USHORT( num_glyphs ) )
+      goto Exit;
+
+    /* UNDOCUMENTED!  The number of glyphs in this table can be smaller */
+    /* than the value in the maxp table (cf. cyberbit.ttf).             */
+
+    /* There already exist fonts which have more than 32768 glyph names */
+    /* in this table, so the test for this threshold has been dropped.  */
+
+    if ( num_glyphs > face->max_profile.numGlyphs )
+    {
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    /* load the indices */
+    {
+      FT_Int  n;
+
+
+      if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) ||
+           FT_FRAME_ENTER( num_glyphs * 2L )          )
+        goto Fail;
+
+      for ( n = 0; n < num_glyphs; n++ )
+        glyph_indices[n] = FT_GET_USHORT();
+
+      FT_FRAME_EXIT();
+    }
+
+    /* compute number of names stored in table */
+    {
+      FT_Int  n;
+
+
+      num_names = 0;
+
+      for ( n = 0; n < num_glyphs; n++ )
+      {
+        FT_Int  idx;
+
+
+        idx = glyph_indices[n];
+        if ( idx >= 258 )
+        {
+          idx -= 257;
+          if ( idx > num_names )
+            num_names = (FT_UShort)idx;
+        }
+      }
+    }
+
+    /* now load the name strings */
+    {
+      FT_UShort  n;
+
+
+      if ( FT_NEW_ARRAY( name_strings, num_names ) )
+        goto Fail;
+
+      for ( n = 0; n < num_names; n++ )
+      {
+        FT_UInt  len;
+
+
+        if ( FT_STREAM_POS() >= post_limit )
+          break;
+        else
+        {
+          FT_TRACE6(( "load_format_20: %d byte left in post table\n",
+                      post_limit - FT_STREAM_POS() ));
+
+          if ( FT_READ_BYTE( len ) )
+            goto Fail1;
+        }
+
+        if ( (FT_Int)len > post_limit                   ||
+             FT_STREAM_POS() > post_limit - (FT_Int)len )
+        {
+          FT_ERROR(( "load_format_20:"
+                     " exceeding string length (%d),"
+                     " truncating at end of post table (%d byte left)\n",
+                     len, post_limit - FT_STREAM_POS() ));
+          len = FT_MAX( 0, post_limit - FT_STREAM_POS() );
+        }
+
+        if ( FT_NEW_ARRAY( name_strings[n], len + 1 ) ||
+             FT_STREAM_READ( name_strings[n], len   ) )
+          goto Fail1;
+
+        name_strings[n][len] = '\0';
+      }
+
+      if ( n < num_names )
+      {
+        FT_ERROR(( "load_format_20:"
+                   " all entries in post table are already parsed,"
+                   " using NULL names for gid %d - %d\n",
+                    n, num_names - 1 ));
+        for ( ; n < num_names; n++ )
+          if ( FT_NEW_ARRAY( name_strings[n], 1 ) )
+            goto Fail1;
+          else
+            name_strings[n][0] = '\0';
+      }
+    }
+
+    /* all right, set table fields and exit successfully */
+    {
+      TT_Post_20  table = &face->postscript_names.names.format_20;
+
+
+      table->num_glyphs    = (FT_UShort)num_glyphs;
+      table->num_names     = (FT_UShort)num_names;
+      table->glyph_indices = glyph_indices;
+      table->glyph_names   = name_strings;
+    }
+    return FT_Err_Ok;
+
+  Fail1:
+    {
+      FT_UShort  n;
+
+
+      for ( n = 0; n < num_names; n++ )
+        FT_FREE( name_strings[n] );
+    }
+
+  Fail:
+    FT_FREE( name_strings );
+    FT_FREE( glyph_indices );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  load_format_25( TT_Face    face,
+                  FT_Stream  stream,
+                  FT_Long    post_limit )
+  {
+    FT_Memory  memory = stream->memory;
+    FT_Error   error;
+
+    FT_Int     num_glyphs;
+    FT_Char*   offset_table = 0;
+
+    FT_UNUSED( post_limit );
+
+
+    /* UNDOCUMENTED!  This value appears only in the Apple TT specs. */
+    if ( FT_READ_USHORT( num_glyphs ) )
+      goto Exit;
+
+    /* check the number of glyphs */
+    if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 )
+    {
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    if ( FT_NEW_ARRAY( offset_table, num_glyphs )   ||
+         FT_STREAM_READ( offset_table, num_glyphs ) )
+      goto Fail;
+
+    /* now check the offset table */
+    {
+      FT_Int  n;
+
+
+      for ( n = 0; n < num_glyphs; n++ )
+      {
+        FT_Long  idx = (FT_Long)n + offset_table[n];
+
+
+        if ( idx < 0 || idx > num_glyphs )
+        {
+          error = FT_THROW( Invalid_File_Format );
+          goto Fail;
+        }
+      }
+    }
+
+    /* OK, set table fields and exit successfully */
+    {
+      TT_Post_25  table = &face->postscript_names.names.format_25;
+
+
+      table->num_glyphs = (FT_UShort)num_glyphs;
+      table->offsets    = offset_table;
+    }
+
+    return FT_Err_Ok;
+
+  Fail:
+    FT_FREE( offset_table );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  load_post_names( TT_Face  face )
+  {
+    FT_Stream  stream;
+    FT_Error   error;
+    FT_Fixed   format;
+    FT_ULong   post_len;
+    FT_Long    post_limit;
+
+
+    /* get a stream for the face's resource */
+    stream = face->root.stream;
+
+    /* seek to the beginning of the PS names table */
+    error = face->goto_table( face, TTAG_post, stream, &post_len );
+    if ( error )
+      goto Exit;
+
+    post_limit = FT_STREAM_POS() + post_len;
+
+    format = face->postscript.FormatType;
+
+    /* go to beginning of subtable */
+    if ( FT_STREAM_SKIP( 32 ) )
+      goto Exit;
+
+    /* now read postscript table */
+    if ( format == 0x00020000L )
+      error = load_format_20( face, stream, post_limit );
+    else if ( format == 0x00028000L )
+      error = load_format_25( face, stream, post_limit );
+    else
+      error = FT_THROW( Invalid_File_Format );
+
+    face->postscript_names.loaded = 1;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  tt_face_free_ps_names( TT_Face  face )
+  {
+    FT_Memory      memory = face->root.memory;
+    TT_Post_Names  names  = &face->postscript_names;
+    FT_Fixed       format;
+
+
+    if ( names->loaded )
+    {
+      format = face->postscript.FormatType;
+
+      if ( format == 0x00020000L )
+      {
+        TT_Post_20  table = &names->names.format_20;
+        FT_UShort   n;
+
+
+        FT_FREE( table->glyph_indices );
+        table->num_glyphs = 0;
+
+        for ( n = 0; n < table->num_names; n++ )
+          FT_FREE( table->glyph_names[n] );
+
+        FT_FREE( table->glyph_names );
+        table->num_names = 0;
+      }
+      else if ( format == 0x00028000L )
+      {
+        TT_Post_25  table = &names->names.format_25;
+
+
+        FT_FREE( table->offsets );
+        table->num_glyphs = 0;
+      }
+    }
+    names->loaded = 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_get_ps_name                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the PostScript glyph name of a glyph.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the parent face.                             */
+  /*                                                                       */
+  /*    idx    :: The glyph index.                                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    PSname :: The address of a string pointer.  Will be NULL in case   */
+  /*              of error, otherwise it is a pointer to the glyph name.   */
+  /*                                                                       */
+  /*              You must not modify the returned string!                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_get_ps_name( TT_Face      face,
+                       FT_UInt      idx,
+                       FT_String**  PSname )
+  {
+    FT_Error       error;
+    TT_Post_Names  names;
+    FT_Fixed       format;
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+    FT_Service_PsCMaps  psnames;
+#endif
+
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    if ( idx >= (FT_UInt)face->max_profile.numGlyphs )
+      return FT_THROW( Invalid_Glyph_Index );
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+    psnames = (FT_Service_PsCMaps)face->psnames;
+    if ( !psnames )
+      return FT_THROW( Unimplemented_Feature );
+#endif
+
+    names = &face->postscript_names;
+
+    /* `.notdef' by default */
+    *PSname = MAC_NAME( 0 );
+
+    format = face->postscript.FormatType;
+
+    if ( format == 0x00010000L )
+    {
+      if ( idx < 258 )                    /* paranoid checking */
+        *PSname = MAC_NAME( idx );
+    }
+    else if ( format == 0x00020000L )
+    {
+      TT_Post_20  table = &names->names.format_20;
+
+
+      if ( !names->loaded )
+      {
+        error = load_post_names( face );
+        if ( error )
+          goto End;
+      }
+
+      if ( idx < (FT_UInt)table->num_glyphs )
+      {
+        FT_UShort  name_index = table->glyph_indices[idx];
+
+
+        if ( name_index < 258 )
+          *PSname = MAC_NAME( name_index );
+        else
+          *PSname = (FT_String*)table->glyph_names[name_index - 258];
+      }
+    }
+    else if ( format == 0x00028000L )
+    {
+      TT_Post_25  table = &names->names.format_25;
+
+
+      if ( !names->loaded )
+      {
+        error = load_post_names( face );
+        if ( error )
+          goto End;
+      }
+
+      if ( idx < (FT_UInt)table->num_glyphs )    /* paranoid checking */
+      {
+        idx    += table->offsets[idx];
+        *PSname = MAC_NAME( idx );
+      }
+    }
+
+    /* nothing to do for format == 0x00030000L */
+
+  End:
+    return FT_Err_Ok;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.h
new file mode 100644
index 0000000..0016c09
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.h
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttpost.h                                                               */
+/*                                                                         */
+/*    Postcript name table processing for TrueType and OpenType fonts      */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTPOST_H__
+#define __TTPOST_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_get_ps_name( TT_Face      face,
+                       FT_UInt      idx,
+                       FT_String**  PSname );
+
+  FT_LOCAL( void )
+  tt_face_free_ps_names( TT_Face  face );
+
+
+FT_END_HEADER
+
+#endif /* __TTPOST_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.c
new file mode 100644
index 0000000..1f54e2c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.c
@@ -0,0 +1,1177 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttsbit.c                                                               */
+/*                                                                         */
+/*    TrueType and OpenType embedded bitmap support (body).                */
+/*                                                                         */
+/*  Copyright 2005-2009, 2013 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  Copyright 2013 by Google, Inc.                                         */
+/*  Google Author(s): Behdad Esfahbod.                                     */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ftbitmap.h"
+#include "ttsbit.h"
+
+#include "sferrors.h"
+
+#include "pngshim.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttsbit
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_eblc( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_Fixed  version;
+    FT_ULong  num_strikes, table_size;
+    FT_Byte*  p;
+    FT_Byte*  p_limit;
+    FT_UInt   count;
+
+
+    face->sbit_num_strikes = 0;
+
+    /* this table is optional */
+    error = face->goto_table( face, TTAG_CBLC, stream, &table_size );
+    if ( error )
+      error = face->goto_table( face, TTAG_EBLC, stream, &table_size );
+    if ( error )
+      error = face->goto_table( face, TTAG_bloc, stream, &table_size );
+    if ( error )
+      goto Exit;
+
+    if ( table_size < 8 )
+    {
+      FT_ERROR(( "tt_face_load_sbit_strikes: table too short\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) )
+      goto Exit;
+
+    face->sbit_table_size = table_size;
+
+    p       = face->sbit_table;
+    p_limit = p + table_size;
+
+    version     = FT_NEXT_ULONG( p );
+    num_strikes = FT_NEXT_ULONG( p );
+
+    if ( version != 0x00020000UL || num_strikes >= 0x10000UL )
+    {
+      FT_ERROR(( "tt_face_load_sbit_strikes: invalid table version\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Fail;
+    }
+
+    /*
+     *  Count the number of strikes available in the table.  We are a bit
+     *  paranoid there and don't trust the data.
+     */
+    count = (FT_UInt)num_strikes;
+    if ( 8 + 48UL * count > table_size )
+      count = (FT_UInt)( ( p_limit - p ) / 48 );
+
+    face->sbit_num_strikes = count;
+
+    FT_TRACE3(( "sbit_num_strikes: %u\n", count ));
+  Exit:
+    return error;
+
+  Fail:
+    FT_FRAME_RELEASE( face->sbit_table );
+    face->sbit_table_size = 0;
+    goto Exit;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  tt_face_free_eblc( TT_Face  face )
+  {
+    FT_Stream  stream = face->root.stream;
+
+
+    FT_FRAME_RELEASE( face->sbit_table );
+    face->sbit_table_size  = 0;
+    face->sbit_num_strikes = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_set_sbit_strike( TT_Face          face,
+                           FT_Size_Request  req,
+                           FT_ULong*        astrike_index )
+  {
+    return FT_Match_Size( (FT_Face)face, req, 0, astrike_index );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_strike_metrics( TT_Face           face,
+                               FT_ULong          strike_index,
+                               FT_Size_Metrics*  metrics )
+  {
+    FT_Byte*  strike;
+
+
+    if ( strike_index >= (FT_ULong)face->sbit_num_strikes )
+      return FT_THROW( Invalid_Argument );
+
+    strike = face->sbit_table + 8 + strike_index * 48;
+
+    metrics->x_ppem = (FT_UShort)strike[44];
+    metrics->y_ppem = (FT_UShort)strike[45];
+
+    metrics->ascender  = (FT_Char)strike[16] << 6;  /* hori.ascender  */
+    metrics->descender = (FT_Char)strike[17] << 6;  /* hori.descender */
+    metrics->height    = metrics->ascender - metrics->descender;
+
+    /* XXX: Is this correct? */
+    metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB  */
+                                      strike[18] + /* max_width      */
+                             (FT_Char)strike[23]   /* min_advance_SB */
+                                                 ) << 6;
+
+    return FT_Err_Ok;
+  }
+
+
+  typedef struct  TT_SBitDecoderRec_
+  {
+    TT_Face          face;
+    FT_Stream        stream;
+    FT_Bitmap*       bitmap;
+    TT_SBit_Metrics  metrics;
+    FT_Bool          metrics_loaded;
+    FT_Bool          bitmap_allocated;
+    FT_Byte          bit_depth;
+
+    FT_ULong         ebdt_start;
+    FT_ULong         ebdt_size;
+
+    FT_ULong         strike_index_array;
+    FT_ULong         strike_index_count;
+    FT_Byte*         eblc_base;
+    FT_Byte*         eblc_limit;
+
+  } TT_SBitDecoderRec, *TT_SBitDecoder;
+
+
+  static FT_Error
+  tt_sbit_decoder_init( TT_SBitDecoder       decoder,
+                        TT_Face              face,
+                        FT_ULong             strike_index,
+                        TT_SBit_MetricsRec*  metrics )
+  {
+    FT_Error   error;
+    FT_Stream  stream = face->root.stream;
+    FT_ULong   ebdt_size;
+
+
+    error = face->goto_table( face, TTAG_CBDT, stream, &ebdt_size );
+    if ( error )
+      error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size );
+    if ( error )
+      error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size );
+    if ( error )
+      goto Exit;
+
+    decoder->face    = face;
+    decoder->stream  = stream;
+    decoder->bitmap  = &face->root.glyph->bitmap;
+    decoder->metrics = metrics;
+
+    decoder->metrics_loaded   = 0;
+    decoder->bitmap_allocated = 0;
+
+    decoder->ebdt_start = FT_STREAM_POS();
+    decoder->ebdt_size  = ebdt_size;
+
+    decoder->eblc_base  = face->sbit_table;
+    decoder->eblc_limit = face->sbit_table + face->sbit_table_size;
+
+    /* now find the strike corresponding to the index */
+    {
+      FT_Byte*  p;
+
+
+      if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size )
+      {
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      p = decoder->eblc_base + 8 + 48 * strike_index;
+
+      decoder->strike_index_array = FT_NEXT_ULONG( p );
+      p                          += 4;
+      decoder->strike_index_count = FT_NEXT_ULONG( p );
+      p                          += 34;
+      decoder->bit_depth          = *p;
+
+      if ( decoder->strike_index_array > face->sbit_table_size             ||
+           decoder->strike_index_array + 8 * decoder->strike_index_count >
+             face->sbit_table_size                                         )
+        error = FT_THROW( Invalid_File_Format );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  tt_sbit_decoder_done( TT_SBitDecoder  decoder )
+  {
+    FT_UNUSED( decoder );
+  }
+
+
+  static FT_Error
+  tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder  decoder,
+                                FT_UInt         load_flags )
+  {
+    FT_Error    error = FT_Err_Ok;
+    FT_UInt     width, height;
+    FT_Bitmap*  map = decoder->bitmap;
+    FT_Long     size;
+
+
+    if ( !decoder->metrics_loaded )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    width  = decoder->metrics->width;
+    height = decoder->metrics->height;
+
+    map->width = (int)width;
+    map->rows  = (int)height;
+
+    switch ( decoder->bit_depth )
+    {
+    case 1:
+      map->pixel_mode = FT_PIXEL_MODE_MONO;
+      map->pitch      = ( map->width + 7 ) >> 3;
+      map->num_grays  = 2;
+      break;
+
+    case 2:
+      map->pixel_mode = FT_PIXEL_MODE_GRAY2;
+      map->pitch      = ( map->width + 3 ) >> 2;
+      map->num_grays  = 4;
+      break;
+
+    case 4:
+      map->pixel_mode = FT_PIXEL_MODE_GRAY4;
+      map->pitch      = ( map->width + 1 ) >> 1;
+      map->num_grays  = 16;
+      break;
+
+    case 8:
+      map->pixel_mode = FT_PIXEL_MODE_GRAY;
+      map->pitch      = map->width;
+      map->num_grays  = 256;
+      break;
+
+    case 32:
+      if ( load_flags & FT_LOAD_COLOR )
+      {
+        map->pixel_mode = FT_PIXEL_MODE_BGRA;
+        map->pitch      = map->width * 4;
+        map->num_grays  = 256;
+      }
+      else
+      {
+        map->pixel_mode = FT_PIXEL_MODE_GRAY;
+        map->pitch      = map->width;
+        map->num_grays  = 256;
+      }
+      break;
+
+    default:
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    size = map->rows * map->pitch;
+
+    /* check that there is no empty image */
+    if ( size == 0 )
+      goto Exit;     /* exit successfully! */
+
+    error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size );
+    if ( error )
+      goto Exit;
+
+    decoder->bitmap_allocated = 1;
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  tt_sbit_decoder_load_metrics( TT_SBitDecoder  decoder,
+                                FT_Byte*       *pp,
+                                FT_Byte*        limit,
+                                FT_Bool         big )
+  {
+    FT_Byte*         p       = *pp;
+    TT_SBit_Metrics  metrics = decoder->metrics;
+
+
+    if ( p + 5 > limit )
+      goto Fail;
+
+    metrics->height       = p[0];
+    metrics->width        = p[1];
+    metrics->horiBearingX = (FT_Char)p[2];
+    metrics->horiBearingY = (FT_Char)p[3];
+    metrics->horiAdvance  = p[4];
+
+    p += 5;
+    if ( big )
+    {
+      if ( p + 3 > limit )
+        goto Fail;
+
+      metrics->vertBearingX = (FT_Char)p[0];
+      metrics->vertBearingY = (FT_Char)p[1];
+      metrics->vertAdvance  = p[2];
+
+      p += 3;
+    }
+
+    decoder->metrics_loaded = 1;
+    *pp = p;
+    return FT_Err_Ok;
+
+  Fail:
+    FT_TRACE1(( "tt_sbit_decoder_load_metrics: broken table" ));
+    return FT_THROW( Invalid_Argument );
+  }
+
+
+  /* forward declaration */
+  static FT_Error
+  tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,
+                              FT_UInt         load_flags,
+                              FT_UInt         glyph_index,
+                              FT_Int          x_pos,
+                              FT_Int          y_pos );
+
+  typedef FT_Error  (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder  decoder,
+                                                FT_UInt         load_flags,
+                                                FT_Byte*        p,
+                                                FT_Byte*        plimit,
+                                                FT_Int          x_pos,
+                                                FT_Int          y_pos );
+
+
+  static FT_Error
+  tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder  decoder,
+                                     FT_UInt         load_flags,
+                                     FT_Byte*        p,
+                                     FT_Byte*        limit,
+                                     FT_Int          x_pos,
+                                     FT_Int          y_pos )
+  {
+    FT_Error    error = FT_Err_Ok;
+    FT_Byte*    line;
+    FT_Int      bit_height, bit_width, pitch, width, height, line_bits, h;
+    FT_Bitmap*  bitmap;
+
+    FT_UNUSED( load_flags );
+
+
+    /* check that we can write the glyph into the bitmap */
+    bitmap     = decoder->bitmap;
+    bit_width  = bitmap->width;
+    bit_height = bitmap->rows;
+    pitch      = bitmap->pitch;
+    line       = bitmap->buffer;
+
+    width  = decoder->metrics->width;
+    height = decoder->metrics->height;
+
+    line_bits = width * decoder->bit_depth;
+
+    if ( x_pos < 0 || x_pos + width > bit_width   ||
+         y_pos < 0 || y_pos + height > bit_height )
+    {
+      FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned:"
+                  " invalid bitmap dimensions\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    if ( p + ( ( line_bits + 7 ) >> 3 ) * height > limit )
+    {
+      FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned: broken bitmap\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    /* now do the blit */
+    line  += y_pos * pitch + ( x_pos >> 3 );
+    x_pos &= 7;
+
+    if ( x_pos == 0 )  /* the easy one */
+    {
+      for ( h = height; h > 0; h--, line += pitch )
+      {
+        FT_Byte*  pwrite = line;
+        FT_Int    w;
+
+
+        for ( w = line_bits; w >= 8; w -= 8 )
+        {
+          pwrite[0] = (FT_Byte)( pwrite[0] | *p++ );
+          pwrite   += 1;
+        }
+
+        if ( w > 0 )
+          pwrite[0] = (FT_Byte)( pwrite[0] | ( *p++ & ( 0xFF00U >> w ) ) );
+      }
+    }
+    else  /* x_pos > 0 */
+    {
+      for ( h = height; h > 0; h--, line += pitch )
+      {
+        FT_Byte*  pwrite = line;
+        FT_Int    w;
+        FT_UInt   wval = 0;
+
+
+        for ( w = line_bits; w >= 8; w -= 8 )
+        {
+          wval       = (FT_UInt)( wval | *p++ );
+          pwrite[0]  = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );
+          pwrite    += 1;
+          wval     <<= 8;
+        }
+
+        if ( w > 0 )
+          wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) );
+
+        /* all bits read and there are `x_pos + w' bits to be written */
+
+        pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );
+
+        if ( x_pos + w > 8 )
+        {
+          pwrite++;
+          wval     <<= 8;
+          pwrite[0]  = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );
+        }
+      }
+    }
+
+  Exit:
+    if ( !error )
+      FT_TRACE3(( "tt_sbit_decoder_load_byte_aligned: loaded\n" ));
+    return error;
+  }
+
+
+  /*
+   * Load a bit-aligned bitmap (with pointer `p') into a line-aligned bitmap
+   * (with pointer `pwrite').  In the example below, the width is 3 pixel,
+   * and `x_pos' is 1 pixel.
+   *
+   *       p                               p+1
+   *     |                               |                               |
+   *     | 7   6   5   4   3   2   1   0 | 7   6   5   4   3   2   1   0 |...
+   *     |                               |                               |
+   *       +-------+   +-------+   +-------+ ...
+   *           .           .           .
+   *           .           .           .
+   *           v           .           .
+   *       +-------+       .           .
+   * |                               | .
+   * | 7   6   5   4   3   2   1   0 | .
+   * |                               | .
+   *   pwrite              .           .
+   *                       .           .
+   *                       v           .
+   *                   +-------+       .
+   *             |                               |
+   *             | 7   6   5   4   3   2   1   0 |
+   *             |                               |
+   *               pwrite+1            .
+   *                                   .
+   *                                   v
+   *                               +-------+
+   *                         |                               |
+   *                         | 7   6   5   4   3   2   1   0 |
+   *                         |                               |
+   *                           pwrite+2
+   *
+   */
+
+  static FT_Error
+  tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder  decoder,
+                                    FT_UInt         load_flags,
+                                    FT_Byte*        p,
+                                    FT_Byte*        limit,
+                                    FT_Int          x_pos,
+                                    FT_Int          y_pos )
+  {
+    FT_Error    error = FT_Err_Ok;
+    FT_Byte*    line;
+    FT_Int      bit_height, bit_width, pitch, width, height, line_bits, h, nbits;
+    FT_Bitmap*  bitmap;
+    FT_UShort   rval;
+
+    FT_UNUSED( load_flags );
+
+
+    /* check that we can write the glyph into the bitmap */
+    bitmap     = decoder->bitmap;
+    bit_width  = bitmap->width;
+    bit_height = bitmap->rows;
+    pitch      = bitmap->pitch;
+    line       = bitmap->buffer;
+
+    width  = decoder->metrics->width;
+    height = decoder->metrics->height;
+
+    line_bits = width * decoder->bit_depth;
+
+    if ( x_pos < 0 || x_pos + width  > bit_width  ||
+         y_pos < 0 || y_pos + height > bit_height )
+    {
+      FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned:"
+                  " invalid bitmap dimensions\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    if ( p + ( ( line_bits * height + 7 ) >> 3 ) > limit )
+    {
+      FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned: broken bitmap\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    /* now do the blit */
+
+    /* adjust `line' to point to the first byte of the bitmap */
+    line  += y_pos * pitch + ( x_pos >> 3 );
+    x_pos &= 7;
+
+    /* the higher byte of `rval' is used as a buffer */
+    rval  = 0;
+    nbits = 0;
+
+    for ( h = height; h > 0; h--, line += pitch )
+    {
+      FT_Byte*  pwrite = line;
+      FT_Int    w      = line_bits;
+
+
+      /* handle initial byte (in target bitmap) specially if necessary */
+      if ( x_pos )
+      {
+        w = ( line_bits < 8 - x_pos ) ? line_bits : 8 - x_pos;
+
+        if ( h == height )
+        {
+          rval  = *p++;
+          nbits = x_pos;
+        }
+        else if ( nbits < w )
+        {
+          if ( p < limit )
+            rval |= *p++;
+          nbits += 8 - w;
+        }
+        else
+        {
+          rval  >>= 8;
+          nbits  -= w;
+        }
+
+        *pwrite++ |= ( ( rval >> nbits ) & 0xFF ) &
+                     ( ~( 0xFF << w ) << ( 8 - w - x_pos ) );
+        rval     <<= 8;
+
+        w = line_bits - w;
+      }
+
+      /* handle medial bytes */
+      for ( ; w >= 8; w -= 8 )
+      {
+        rval      |= *p++;
+        *pwrite++ |= ( rval >> nbits ) & 0xFF;
+
+        rval <<= 8;
+      }
+
+      /* handle final byte if necessary */
+      if ( w > 0 )
+      {
+        if ( nbits < w )
+        {
+          if ( p < limit )
+            rval |= *p++;
+          *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );
+          nbits   += 8 - w;
+
+          rval <<= 8;
+        }
+        else
+        {
+          *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );
+          nbits   -= w;
+        }
+      }
+    }
+
+  Exit:
+    if ( !error )
+      FT_TRACE3(( "tt_sbit_decoder_load_bit_aligned: loaded\n" ));
+    return error;
+  }
+
+
+  static FT_Error
+  tt_sbit_decoder_load_compound( TT_SBitDecoder  decoder,
+                                 FT_UInt         load_flags,
+                                 FT_Byte*        p,
+                                 FT_Byte*        limit,
+                                 FT_Int          x_pos,
+                                 FT_Int          y_pos )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_UInt   num_components, nn;
+
+    FT_Char  horiBearingX = decoder->metrics->horiBearingX;
+    FT_Char  horiBearingY = decoder->metrics->horiBearingY;
+    FT_Byte  horiAdvance  = decoder->metrics->horiAdvance;
+    FT_Char  vertBearingX = decoder->metrics->vertBearingX;
+    FT_Char  vertBearingY = decoder->metrics->vertBearingY;
+    FT_Byte  vertAdvance  = decoder->metrics->vertAdvance;
+
+
+    if ( p + 2 > limit )
+      goto Fail;
+
+    num_components = FT_NEXT_USHORT( p );
+    if ( p + 4 * num_components > limit )
+    {
+      FT_TRACE1(( "tt_sbit_decoder_load_compound: broken table\n" ));
+      goto Fail;
+    }
+
+    FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d components\n",
+                num_components ));
+
+    for ( nn = 0; nn < num_components; nn++ )
+    {
+      FT_UInt  gindex = FT_NEXT_USHORT( p );
+      FT_Byte  dx     = FT_NEXT_BYTE( p );
+      FT_Byte  dy     = FT_NEXT_BYTE( p );
+
+
+      /* NB: a recursive call */
+      error = tt_sbit_decoder_load_image( decoder, load_flags, gindex,
+                                          x_pos + dx, y_pos + dy );
+      if ( error )
+        break;
+    }
+
+    FT_TRACE3(( "tt_sbit_decoder_load_compound: done\n" ));
+
+    decoder->metrics->horiBearingX = horiBearingX;
+    decoder->metrics->horiBearingY = horiBearingY;
+    decoder->metrics->horiAdvance  = horiAdvance;
+    decoder->metrics->vertBearingX = vertBearingX;
+    decoder->metrics->vertBearingY = vertBearingY;
+    decoder->metrics->vertAdvance  = vertAdvance;
+    decoder->metrics->width        = (FT_Byte)decoder->bitmap->width;
+    decoder->metrics->height       = (FT_Byte)decoder->bitmap->rows;
+
+  Exit:
+    return error;
+
+  Fail:
+    error = FT_THROW( Invalid_File_Format );
+    goto Exit;
+  }
+
+
+#ifdef FT_CONFIG_OPTION_USE_PNG
+
+  static FT_Error
+  tt_sbit_decoder_load_png( TT_SBitDecoder  decoder,
+                            FT_UInt         load_flags,
+                            FT_Byte*        p,
+                            FT_Byte*        limit,
+                            FT_Int          x_pos,
+                            FT_Int          y_pos )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_ULong  png_len;
+
+    FT_UNUSED( load_flags );
+
+
+    if ( limit - p < 4 )
+    {
+      FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    png_len = FT_NEXT_ULONG( p );
+    if ( (FT_ULong)( limit - p ) < png_len )
+    {
+      FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    error = Load_SBit_Png( decoder->bitmap,
+                           x_pos,
+                           y_pos,
+                           decoder->bit_depth,
+                           decoder->metrics,
+                           decoder->stream->memory,
+                           p,
+                           png_len );
+
+  Exit:
+    if ( !error )
+      FT_TRACE3(( "tt_sbit_decoder_load_png: loaded\n" ));
+    return error;
+  }
+
+#endif /* FT_CONFIG_OPTION_USE_PNG */
+
+
+  static FT_Error
+  tt_sbit_decoder_load_bitmap( TT_SBitDecoder  decoder,
+                               FT_UInt         load_flags,
+                               FT_UInt         glyph_format,
+                               FT_ULong        glyph_start,
+                               FT_ULong        glyph_size,
+                               FT_Int          x_pos,
+                               FT_Int          y_pos )
+  {
+    FT_Error   error;
+    FT_Stream  stream = decoder->stream;
+    FT_Byte*   p;
+    FT_Byte*   p_limit;
+    FT_Byte*   data;
+
+
+    /* seek into the EBDT table now */
+    if ( glyph_start + glyph_size > decoder->ebdt_size )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) ||
+         FT_FRAME_EXTRACT( glyph_size, data )                )
+      goto Exit;
+
+    p       = data;
+    p_limit = p + glyph_size;
+
+    /* read the data, depending on the glyph format */
+    switch ( glyph_format )
+    {
+    case 1:
+    case 2:
+    case 8:
+    case 17:
+      error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 );
+      break;
+
+    case 6:
+    case 7:
+    case 9:
+    case 18:
+      error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 );
+      break;
+
+    default:
+      error = FT_Err_Ok;
+    }
+
+    if ( error )
+      goto Fail;
+
+    {
+      TT_SBitDecoder_LoadFunc  loader;
+
+
+      switch ( glyph_format )
+      {
+      case 1:
+      case 6:
+        loader = tt_sbit_decoder_load_byte_aligned;
+        break;
+
+      case 2:
+      case 5:
+      case 7:
+        loader = tt_sbit_decoder_load_bit_aligned;
+        break;
+
+      case 8:
+        if ( p + 1 > p_limit )
+          goto Fail;
+
+        p += 1;  /* skip padding */
+        /* fall-through */
+
+      case 9:
+        loader = tt_sbit_decoder_load_compound;
+        break;
+
+#ifdef FT_CONFIG_OPTION_USE_PNG
+      case 17: /* small metrics, PNG image data   */
+      case 18: /* big metrics, PNG image data     */
+      case 19: /* metrics in EBLC, PNG image data */
+        loader = tt_sbit_decoder_load_png;
+        break;
+#endif /* FT_CONFIG_OPTION_USE_PNG */
+
+      default:
+        error = FT_THROW( Invalid_Table );
+        goto Fail;
+      }
+
+      if ( !decoder->bitmap_allocated )
+      {
+        error = tt_sbit_decoder_alloc_bitmap( decoder, load_flags );
+        if ( error )
+          goto Fail;
+      }
+
+      if ( decoder->bit_depth == 32                          &&
+           decoder->bitmap->pixel_mode != FT_PIXEL_MODE_BGRA )
+      {
+        /* Flatten color bitmaps if color was not requested. */
+
+        FT_Library library = decoder->face->root.glyph->library;
+        FT_Memory  memory  = decoder->stream->memory;
+
+        FT_Bitmap color, *orig;
+
+
+        if ( decoder->bitmap->pixel_mode != FT_PIXEL_MODE_GRAY ||
+             x_pos != 0 || y_pos != 0                          )
+        {
+          /* Shouldn't happen. */
+          error = FT_THROW( Invalid_Table );
+          goto Fail;
+        }
+
+        FT_Bitmap_New( &color );
+
+        color.rows       = decoder->bitmap->rows;
+        color.width      = decoder->bitmap->width;
+        color.pitch      = color.width * 4;
+        color.pixel_mode = FT_PIXEL_MODE_BGRA;
+
+        if ( FT_ALLOC( color.buffer, color.rows * color.pitch ) )
+          goto Fail;
+
+        orig            = decoder->bitmap;
+        decoder->bitmap = &color;
+
+        error = loader( decoder, load_flags, p, p_limit, x_pos, y_pos );
+
+        decoder->bitmap = orig;
+
+        /* explicitly test against FT_Err_Ok to avoid compiler warnings */
+        /* (we do an assignment within a conditional)                   */
+        if ( error                                           ||
+             ( error = FT_Bitmap_Convert( library,
+                                          &color,
+                                          decoder->bitmap,
+                                          1 ) ) != FT_Err_Ok )
+        {
+          FT_Bitmap_Done( library, &color );
+          goto Fail;
+        }
+
+        FT_Bitmap_Done( library, &color );
+      }
+
+      else
+        error = loader( decoder, load_flags, p, p_limit, x_pos, y_pos );
+    }
+
+  Fail:
+    FT_FRAME_RELEASE( data );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,
+                              FT_UInt         load_flags,
+                              FT_UInt         glyph_index,
+                              FT_Int          x_pos,
+                              FT_Int          y_pos )
+  {
+    /*
+     *  First, we find the correct strike range that applies to this
+     *  glyph index.
+     */
+
+    FT_Byte*  p          = decoder->eblc_base + decoder->strike_index_array;
+    FT_Byte*  p_limit    = decoder->eblc_limit;
+    FT_ULong  num_ranges = decoder->strike_index_count;
+    FT_UInt   start, end, index_format, image_format;
+    FT_ULong  image_start = 0, image_end = 0, image_offset;
+
+
+    for ( ; num_ranges > 0; num_ranges-- )
+    {
+      start = FT_NEXT_USHORT( p );
+      end   = FT_NEXT_USHORT( p );
+
+      if ( glyph_index >= start && glyph_index <= end )
+        goto FoundRange;
+
+      p += 4;  /* ignore index offset */
+    }
+    goto NoBitmap;
+
+  FoundRange:
+    image_offset = FT_NEXT_ULONG( p );
+
+    /* overflow check */
+    p = decoder->eblc_base + decoder->strike_index_array;
+    if ( image_offset > (FT_ULong)( p_limit - p ) )
+      goto Failure;
+
+    p += image_offset;
+    if ( p + 8 > p_limit )
+      goto NoBitmap;
+
+    /* now find the glyph's location and extend within the ebdt table */
+    index_format = FT_NEXT_USHORT( p );
+    image_format = FT_NEXT_USHORT( p );
+    image_offset = FT_NEXT_ULONG ( p );
+
+    switch ( index_format )
+    {
+    case 1: /* 4-byte offsets relative to `image_offset' */
+      {
+        p += 4 * ( glyph_index - start );
+        if ( p + 8 > p_limit )
+          goto NoBitmap;
+
+        image_start = FT_NEXT_ULONG( p );
+        image_end   = FT_NEXT_ULONG( p );
+
+        if ( image_start == image_end )  /* missing glyph */
+          goto NoBitmap;
+      }
+      break;
+
+    case 2: /* big metrics, constant image size */
+      {
+        FT_ULong  image_size;
+
+
+        if ( p + 12 > p_limit )
+          goto NoBitmap;
+
+        image_size = FT_NEXT_ULONG( p );
+
+        if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )
+          goto NoBitmap;
+
+        image_start = image_size * ( glyph_index - start );
+        image_end   = image_start + image_size;
+      }
+      break;
+
+    case 3: /* 2-byte offsets relative to 'image_offset' */
+      {
+        p += 2 * ( glyph_index - start );
+        if ( p + 4 > p_limit )
+          goto NoBitmap;
+
+        image_start = FT_NEXT_USHORT( p );
+        image_end   = FT_NEXT_USHORT( p );
+
+        if ( image_start == image_end )  /* missing glyph */
+          goto NoBitmap;
+      }
+      break;
+
+    case 4: /* sparse glyph array with (glyph,offset) pairs */
+      {
+        FT_ULong  mm, num_glyphs;
+
+
+        if ( p + 4 > p_limit )
+          goto NoBitmap;
+
+        num_glyphs = FT_NEXT_ULONG( p );
+
+        /* overflow check for p + ( num_glyphs + 1 ) * 4 */
+        if ( num_glyphs > (FT_ULong)( ( ( p_limit - p ) >> 2 ) - 1 ) )
+          goto NoBitmap;
+
+        for ( mm = 0; mm < num_glyphs; mm++ )
+        {
+          FT_UInt  gindex = FT_NEXT_USHORT( p );
+
+
+          if ( gindex == glyph_index )
+          {
+            image_start = FT_NEXT_USHORT( p );
+            p          += 2;
+            image_end   = FT_PEEK_USHORT( p );
+            break;
+          }
+          p += 2;
+        }
+
+        if ( mm >= num_glyphs )
+          goto NoBitmap;
+      }
+      break;
+
+    case 5: /* constant metrics with sparse glyph codes */
+    case 19:
+      {
+        FT_ULong  image_size, mm, num_glyphs;
+
+
+        if ( p + 16 > p_limit )
+          goto NoBitmap;
+
+        image_size = FT_NEXT_ULONG( p );
+
+        if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )
+          goto NoBitmap;
+
+        num_glyphs = FT_NEXT_ULONG( p );
+
+        /* overflow check for p + 2 * num_glyphs */
+        if ( num_glyphs > (FT_ULong)( ( p_limit - p ) >> 1 ) )
+          goto NoBitmap;
+
+        for ( mm = 0; mm < num_glyphs; mm++ )
+        {
+          FT_UInt  gindex = FT_NEXT_USHORT( p );
+
+
+          if ( gindex == glyph_index )
+            break;
+        }
+
+        if ( mm >= num_glyphs )
+          goto NoBitmap;
+
+        image_start = image_size * mm;
+        image_end   = image_start + image_size;
+      }
+      break;
+
+    default:
+      goto NoBitmap;
+    }
+
+    if ( image_start > image_end )
+      goto NoBitmap;
+
+    image_end  -= image_start;
+    image_start = image_offset + image_start;
+
+    FT_TRACE3(( "tt_sbit_decoder_load_image:"
+                " found sbit (format %d) for glyph index %d\n",
+                image_format, glyph_index ));
+
+    return tt_sbit_decoder_load_bitmap( decoder,
+                                        load_flags,
+                                        image_format,
+                                        image_start,
+                                        image_end,
+                                        x_pos,
+                                        y_pos );
+
+  Failure:
+    return FT_THROW( Invalid_Table );
+
+  NoBitmap:
+    FT_TRACE4(( "tt_sbit_decoder_load_image:"
+                " no sbit found for glyph index %d\n", glyph_index ));
+
+    return FT_THROW( Invalid_Argument );
+  }
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_sbit_image( TT_Face              face,
+                           FT_ULong             strike_index,
+                           FT_UInt              glyph_index,
+                           FT_UInt              load_flags,
+                           FT_Stream            stream,
+                           FT_Bitmap           *map,
+                           TT_SBit_MetricsRec  *metrics )
+  {
+    TT_SBitDecoderRec  decoder[1];
+    FT_Error           error;
+
+    FT_UNUSED( load_flags );
+    FT_UNUSED( stream );
+    FT_UNUSED( map );
+
+
+    error = tt_sbit_decoder_init( decoder, face, strike_index, metrics );
+    if ( !error )
+    {
+      error = tt_sbit_decoder_load_image( decoder,
+                                          load_flags,
+                                          glyph_index,
+                                          0,
+                                          0 );
+      tt_sbit_decoder_done( decoder );
+    }
+
+    return error;
+  }
+
+
+/* EOF */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.h
new file mode 100644
index 0000000..93096d8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.h
@@ -0,0 +1,63 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttsbit.h                                                               */
+/*                                                                         */
+/*    TrueType and OpenType embedded bitmap support (specification).       */
+/*                                                                         */
+/*  Copyright 1996-2008, 2013 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTSBIT_H__
+#define __TTSBIT_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttload.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_eblc( TT_Face    face,
+                     FT_Stream  stream );
+
+  FT_LOCAL( void )
+  tt_face_free_eblc( TT_Face  face );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_set_sbit_strike( TT_Face          face,
+                           FT_Size_Request  req,
+                           FT_ULong*        astrike_index );
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_strike_metrics( TT_Face           face,
+                               FT_ULong          strike_index,
+                               FT_Size_Metrics*  metrics );
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_sbit_image( TT_Face              face,
+                           FT_ULong             strike_index,
+                           FT_UInt              glyph_index,
+                           FT_UInt              load_flags,
+                           FT_Stream            stream,
+                           FT_Bitmap           *map,
+                           TT_SBit_MetricsRec  *metrics );
+
+
+FT_END_HEADER
+
+#endif /* __TTSBIT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/Jamfile
new file mode 100644
index 0000000..a8496aa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/smooth Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) smooth ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = ftgrays ftsmooth ftspic ;
+  }
+  else
+  {
+    _sources = smooth ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/smooth Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.c
new file mode 100644
index 0000000..3aafeed
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.c
@@ -0,0 +1,2137 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgrays.c                                                              */
+/*                                                                         */
+/*    A new `perfect' anti-aliasing renderer (body).                       */
+/*                                                                         */
+/*  Copyright 2000-2003, 2005-2013 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file can be compiled without the rest of the FreeType engine, by */
+  /* defining the _STANDALONE_ macro when compiling it.  You also need to  */
+  /* put the files `ftgrays.h' and `ftimage.h' into the current            */
+  /* compilation directory.  Typically, you could do something like        */
+  /*                                                                       */
+  /* - copy `src/smooth/ftgrays.c' (this file) to your current directory   */
+  /*                                                                       */
+  /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */
+  /*   same directory                                                      */
+  /*                                                                       */
+  /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in        */
+  /*                                                                       */
+  /*     cc -c -D_STANDALONE_ ftgrays.c                                    */
+  /*                                                                       */
+  /* The renderer can be initialized with a call to                        */
+  /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated  */
+  /* with a call to `ft_gray_raster.raster_render'.                        */
+  /*                                                                       */
+  /* See the comments and documentation in the file `ftimage.h' for more   */
+  /* details on how the raster works.                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This is a new anti-aliasing scan-converter for FreeType 2.  The       */
+  /* algorithm used here is _very_ different from the one in the standard  */
+  /* `ftraster' module.  Actually, `ftgrays' computes the _exact_          */
+  /* coverage of the outline on each pixel cell.                           */
+  /*                                                                       */
+  /* It is based on ideas that I initially found in Raph Levien's          */
+  /* excellent LibArt graphics library (see http://www.levien.com/libart   */
+  /* for more information, though the web pages do not tell anything       */
+  /* about the renderer; you'll have to dive into the source code to       */
+  /* understand how it works).                                             */
+  /*                                                                       */
+  /* Note, however, that this is a _very_ different implementation         */
+  /* compared to Raph's.  Coverage information is stored in a very         */
+  /* different way, and I don't use sorted vector paths.  Also, it doesn't */
+  /* use floating point values.                                            */
+  /*                                                                       */
+  /* This renderer has the following advantages:                           */
+  /*                                                                       */
+  /* - It doesn't need an intermediate bitmap.  Instead, one can supply a  */
+  /*   callback function that will be called by the renderer to draw gray  */
+  /*   spans on any target surface.  You can thus do direct composition on */
+  /*   any kind of bitmap, provided that you give the renderer the right   */
+  /*   callback.                                                           */
+  /*                                                                       */
+  /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on   */
+  /*   each pixel cell.                                                    */
+  /*                                                                       */
+  /* - It performs a single pass on the outline (the `standard' FT2        */
+  /*   renderer makes two passes).                                         */
+  /*                                                                       */
+  /* - It can easily be modified to render to _any_ number of gray levels  */
+  /*   cheaply.                                                            */
+  /*                                                                       */
+  /* - For small (< 20) pixel sizes, it is faster than the standard        */
+  /*   renderer.                                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_smooth
+
+
+#ifdef _STANDALONE_
+
+
+  /* Auxiliary macros for token concatenation. */
+#define FT_ERR_XCAT( x, y )  x ## y
+#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )
+
+
+  /* define this to dump debugging information */
+/* #define FT_DEBUG_LEVEL_TRACE */
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+#include <stdio.h>
+#include <stdarg.h>
+#endif
+
+#include <stddef.h>
+#include <string.h>
+#include <setjmp.h>
+#include <limits.h>
+#define FT_UINT_MAX  UINT_MAX
+#define FT_INT_MAX   INT_MAX
+
+#define ft_memset   memset
+
+#define ft_setjmp   setjmp
+#define ft_longjmp  longjmp
+#define ft_jmp_buf  jmp_buf
+
+typedef ptrdiff_t  FT_PtrDist;
+
+
+#define ErrRaster_Invalid_Mode      -2
+#define ErrRaster_Invalid_Outline   -1
+#define ErrRaster_Invalid_Argument  -3
+#define ErrRaster_Memory_Overflow   -4
+
+#define FT_BEGIN_HEADER
+#define FT_END_HEADER
+
+#include "ftimage.h"
+#include "ftgrays.h"
+
+
+  /* This macro is used to indicate that a function parameter is unused. */
+  /* Its purpose is simply to reduce compiler warnings.  Note also that  */
+  /* simply defining it as `(void)x' doesn't avoid warnings with certain */
+  /* ANSI compilers (e.g. LCC).                                          */
+#define FT_UNUSED( x )  (x) = (x)
+
+
+  /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+  void
+  FT_Message( const char*  fmt,
+              ... )
+  {
+    va_list  ap;
+
+
+    va_start( ap, fmt );
+    vfprintf( stderr, fmt, ap );
+    va_end( ap );
+  }
+
+
+  /* empty function useful for setting a breakpoint to catch errors */
+  int
+  FT_Throw( int          error,
+            int          line,
+            const char*  file )
+  {
+    FT_UNUSED( error );
+    FT_UNUSED( line );
+    FT_UNUSED( file );
+
+    return 0;
+  }
+
+
+  /* we don't handle tracing levels in stand-alone mode; */
+#ifndef FT_TRACE5
+#define FT_TRACE5( varformat )  FT_Message varformat
+#endif
+#ifndef FT_TRACE7
+#define FT_TRACE7( varformat )  FT_Message varformat
+#endif
+#ifndef FT_ERROR
+#define FT_ERROR( varformat )   FT_Message varformat
+#endif
+
+#define FT_THROW( e )                               \
+          ( FT_Throw( FT_ERR_CAT( ErrRaster, e ),   \
+                      __LINE__,                     \
+                      __FILE__ )                  | \
+            FT_ERR_CAT( ErrRaster, e )            )
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+#define FT_TRACE5( x )  do { } while ( 0 )     /* nothing */
+#define FT_TRACE7( x )  do { } while ( 0 )     /* nothing */
+#define FT_ERROR( x )   do { } while ( 0 )     /* nothing */
+#define FT_THROW( e )   FT_ERR_CAT( ErrRaster_, e )
+
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+#define FT_DEFINE_OUTLINE_FUNCS( class_,               \
+                                 move_to_, line_to_,   \
+                                 conic_to_, cubic_to_, \
+                                 shift_, delta_ )      \
+          static const FT_Outline_Funcs class_ =       \
+          {                                            \
+            move_to_,                                  \
+            line_to_,                                  \
+            conic_to_,                                 \
+            cubic_to_,                                 \
+            shift_,                                    \
+            delta_                                     \
+         };
+
+#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_,            \
+                                raster_new_, raster_reset_,       \
+                                raster_set_mode_, raster_render_, \
+                                raster_done_ )                    \
+          const FT_Raster_Funcs class_ =                          \
+          {                                                       \
+            glyph_format_,                                        \
+            raster_new_,                                          \
+            raster_reset_,                                        \
+            raster_set_mode_,                                     \
+            raster_render_,                                       \
+            raster_done_                                          \
+         };
+
+
+#else /* !_STANDALONE_ */
+
+
+#include "../../include/ft2build.h"
+#include "ftgrays.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftoutln.h"
+
+#include "ftsmerrs.h"
+
+#include "ftspic.h"
+
+#define Smooth_Err_Invalid_Mode     Smooth_Err_Cannot_Render_Glyph
+#define Smooth_Err_Memory_Overflow  Smooth_Err_Out_Of_Memory
+#define ErrRaster_Memory_Overflow   Smooth_Err_Out_Of_Memory
+
+
+#endif /* !_STANDALONE_ */
+
+
+#ifndef FT_MEM_SET
+#define FT_MEM_SET( d, s, c )  ft_memset( d, s, c )
+#endif
+
+#ifndef FT_MEM_ZERO
+#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )
+#endif
+
+  /* as usual, for the speed hungry :-) */
+
+#undef RAS_ARG
+#undef RAS_ARG_
+#undef RAS_VAR
+#undef RAS_VAR_
+
+#ifndef FT_STATIC_RASTER
+
+#define RAS_ARG   gray_PWorker  worker
+#define RAS_ARG_  gray_PWorker  worker,
+
+#define RAS_VAR   worker
+#define RAS_VAR_  worker,
+
+#else /* FT_STATIC_RASTER */
+
+#define RAS_ARG   /* empty */
+#define RAS_ARG_  /* empty */
+#define RAS_VAR   /* empty */
+#define RAS_VAR_  /* empty */
+
+#endif /* FT_STATIC_RASTER */
+
+
+  /* must be at least 6 bits! */
+#define PIXEL_BITS  8
+
+#undef FLOOR
+#undef CEILING
+#undef TRUNC
+#undef SCALED
+
+#define ONE_PIXEL       ( 1L << PIXEL_BITS )
+#define PIXEL_MASK      ( -1L << PIXEL_BITS )
+#define TRUNC( x )      ( (TCoord)( (x) >> PIXEL_BITS ) )
+#define SUBPIXELS( x )  ( (TPos)(x) << PIXEL_BITS )
+#define FLOOR( x )      ( (x) & -ONE_PIXEL )
+#define CEILING( x )    ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL )
+#define ROUND( x )      ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL )
+
+#if PIXEL_BITS >= 6
+#define UPSCALE( x )    ( (x) << ( PIXEL_BITS - 6 ) )
+#define DOWNSCALE( x )  ( (x) >> ( PIXEL_BITS - 6 ) )
+#else
+#define UPSCALE( x )    ( (x) >> ( 6 - PIXEL_BITS ) )
+#define DOWNSCALE( x )  ( (x) << ( 6 - PIXEL_BITS ) )
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*   TYPE DEFINITIONS                                                    */
+  /*                                                                       */
+
+  /* don't change the following types to FT_Int or FT_Pos, since we might */
+  /* need to define them to "float" or "double" when experimenting with   */
+  /* new algorithms                                                       */
+
+  typedef long  TCoord;   /* integer scanline/pixel coordinate */
+  typedef long  TPos;     /* sub-pixel coordinate              */
+
+  /* determine the type used to store cell areas.  This normally takes at */
+  /* least PIXEL_BITS*2 + 1 bits.  On 16-bit systems, we need to use      */
+  /* `long' instead of `int', otherwise bad things happen                 */
+
+#if PIXEL_BITS <= 7
+
+  typedef int  TArea;
+
+#else /* PIXEL_BITS >= 8 */
+
+  /* approximately determine the size of integers using an ANSI-C header */
+#if FT_UINT_MAX == 0xFFFFU
+  typedef long  TArea;
+#else
+  typedef int   TArea;
+#endif
+
+#endif /* PIXEL_BITS >= 8 */
+
+
+  /* maximum number of gray spans in a call to the span callback */
+#define FT_MAX_GRAY_SPANS  32
+
+
+  typedef struct TCell_*  PCell;
+
+  typedef struct  TCell_
+  {
+    TPos    x;     /* same with gray_TWorker.ex    */
+    TCoord  cover; /* same with gray_TWorker.cover */
+    TArea   area;
+    PCell   next;
+
+  } TCell;
+
+
+#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
+  /* We disable the warning `structure was padded due to   */
+  /* __declspec(align())' in order to compile cleanly with */
+  /* the maximum level of warnings.                        */
+#pragma warning( push )
+#pragma warning( disable : 4324 )
+#endif /* _MSC_VER */
+
+  typedef struct  gray_TWorker_
+  {
+    TCoord  ex, ey;
+    TPos    min_ex, max_ex;
+    TPos    min_ey, max_ey;
+    TPos    count_ex, count_ey;
+
+    TArea   area;
+    TCoord  cover;
+    int     invalid;
+
+    PCell       cells;
+    FT_PtrDist  max_cells;
+    FT_PtrDist  num_cells;
+
+    TCoord  cx, cy;
+    TPos    x,  y;
+
+    TPos    last_ey;
+
+    FT_Vector   bez_stack[32 * 3 + 1];
+    int         lev_stack[32];
+
+    FT_Outline  outline;
+    FT_Bitmap   target;
+    FT_BBox     clip_box;
+
+    FT_Span     gray_spans[FT_MAX_GRAY_SPANS];
+    int         num_gray_spans;
+
+    FT_Raster_Span_Func  render_span;
+    void*                render_span_data;
+    int                  span_y;
+
+    int  band_size;
+    int  band_shoot;
+
+    ft_jmp_buf  jump_buffer;
+
+    void*       buffer;
+    long        buffer_size;
+
+    PCell*     ycells;
+    TPos       ycount;
+
+  } gray_TWorker, *gray_PWorker;
+
+#if defined( _MSC_VER )
+#pragma warning( pop )
+#endif
+
+
+#ifndef FT_STATIC_RASTER
+#define ras  (*worker)
+#else
+  static gray_TWorker  ras;
+#endif
+
+
+  typedef struct gray_TRaster_
+  {
+    void*         buffer;
+    long          buffer_size;
+    int           band_size;
+    void*         memory;
+    gray_PWorker  worker;
+
+  } gray_TRaster, *gray_PRaster;
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Initialize the cells table.                                           */
+  /*                                                                       */
+  static void
+  gray_init_cells( RAS_ARG_ void*  buffer,
+                   long            byte_size )
+  {
+    ras.buffer      = buffer;
+    ras.buffer_size = byte_size;
+
+    ras.ycells      = (PCell*) buffer;
+    ras.cells       = NULL;
+    ras.max_cells   = 0;
+    ras.num_cells   = 0;
+    ras.area        = 0;
+    ras.cover       = 0;
+    ras.invalid     = 1;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compute the outline bounding box.                                     */
+  /*                                                                       */
+  static void
+  gray_compute_cbox( RAS_ARG )
+  {
+    FT_Outline*  outline = &ras.outline;
+    FT_Vector*   vec     = outline->points;
+    FT_Vector*   limit   = vec + outline->n_points;
+
+
+    if ( outline->n_points <= 0 )
+    {
+      ras.min_ex = ras.max_ex = 0;
+      ras.min_ey = ras.max_ey = 0;
+      return;
+    }
+
+    ras.min_ex = ras.max_ex = vec->x;
+    ras.min_ey = ras.max_ey = vec->y;
+
+    vec++;
+
+    for ( ; vec < limit; vec++ )
+    {
+      TPos  x = vec->x;
+      TPos  y = vec->y;
+
+
+      if ( x < ras.min_ex ) ras.min_ex = x;
+      if ( x > ras.max_ex ) ras.max_ex = x;
+      if ( y < ras.min_ey ) ras.min_ey = y;
+      if ( y > ras.max_ey ) ras.max_ey = y;
+    }
+
+    /* truncate the bounding box to integer pixels */
+    ras.min_ex = ras.min_ex >> 6;
+    ras.min_ey = ras.min_ey >> 6;
+    ras.max_ex = ( ras.max_ex + 63 ) >> 6;
+    ras.max_ey = ( ras.max_ey + 63 ) >> 6;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Record the current cell in the table.                                 */
+  /*                                                                       */
+  static PCell
+  gray_find_cell( RAS_ARG )
+  {
+    PCell  *pcell, cell;
+    TPos    x = ras.ex;
+
+
+    if ( x > ras.count_ex )
+      x = ras.count_ex;
+
+    pcell = &ras.ycells[ras.ey];
+    for (;;)
+    {
+      cell = *pcell;
+      if ( cell == NULL || cell->x > x )
+        break;
+
+      if ( cell->x == x )
+        goto Exit;
+
+      pcell = &cell->next;
+    }
+
+    if ( ras.num_cells >= ras.max_cells )
+      ft_longjmp( ras.jump_buffer, 1 );
+
+    cell        = ras.cells + ras.num_cells++;
+    cell->x     = x;
+    cell->area  = 0;
+    cell->cover = 0;
+
+    cell->next  = *pcell;
+    *pcell      = cell;
+
+  Exit:
+    return cell;
+  }
+
+
+  static void
+  gray_record_cell( RAS_ARG )
+  {
+    if ( !ras.invalid && ( ras.area | ras.cover ) )
+    {
+      PCell  cell = gray_find_cell( RAS_VAR );
+
+
+      cell->area  += ras.area;
+      cell->cover += ras.cover;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Set the current cell to a new position.                               */
+  /*                                                                       */
+  static void
+  gray_set_cell( RAS_ARG_ TCoord  ex,
+                          TCoord  ey )
+  {
+    /* Move the cell pointer to a new position.  We set the `invalid'      */
+    /* flag to indicate that the cell isn't part of those we're interested */
+    /* in during the render phase.  This means that:                       */
+    /*                                                                     */
+    /* . the new vertical position must be within min_ey..max_ey-1.        */
+    /* . the new horizontal position must be strictly less than max_ex     */
+    /*                                                                     */
+    /* Note that if a cell is to the left of the clipping region, it is    */
+    /* actually set to the (min_ex-1) horizontal position.                 */
+
+    /* All cells that are on the left of the clipping region go to the */
+    /* min_ex - 1 horizontal position.                                 */
+    ey -= ras.min_ey;
+
+    if ( ex > ras.max_ex )
+      ex = ras.max_ex;
+
+    ex -= ras.min_ex;
+    if ( ex < 0 )
+      ex = -1;
+
+    /* are we moving to a different cell ? */
+    if ( ex != ras.ex || ey != ras.ey )
+    {
+      /* record the current one if it is valid */
+      if ( !ras.invalid )
+        gray_record_cell( RAS_VAR );
+
+      ras.area  = 0;
+      ras.cover = 0;
+    }
+
+    ras.ex      = ex;
+    ras.ey      = ey;
+    ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey ||
+                              ex >= ras.count_ex           );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Start a new contour at a given cell.                                  */
+  /*                                                                       */
+  static void
+  gray_start_cell( RAS_ARG_ TCoord  ex,
+                            TCoord  ey )
+  {
+    if ( ex > ras.max_ex )
+      ex = (TCoord)( ras.max_ex );
+
+    if ( ex < ras.min_ex )
+      ex = (TCoord)( ras.min_ex - 1 );
+
+    ras.area    = 0;
+    ras.cover   = 0;
+    ras.ex      = ex - ras.min_ex;
+    ras.ey      = ey - ras.min_ey;
+    ras.last_ey = SUBPIXELS( ey );
+    ras.invalid = 0;
+
+    gray_set_cell( RAS_VAR_ ex, ey );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Render a scanline as one or more cells.                               */
+  /*                                                                       */
+  static void
+  gray_render_scanline( RAS_ARG_ TCoord  ey,
+                                 TPos    x1,
+                                 TCoord  y1,
+                                 TPos    x2,
+                                 TCoord  y2 )
+  {
+    TCoord  ex1, ex2, fx1, fx2, delta, mod;
+    long    p, first, dx;
+    int     incr;
+
+
+    dx = x2 - x1;
+
+    ex1 = TRUNC( x1 );
+    ex2 = TRUNC( x2 );
+    fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) );
+    fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) );
+
+    /* trivial case.  Happens often */
+    if ( y1 == y2 )
+    {
+      gray_set_cell( RAS_VAR_ ex2, ey );
+      return;
+    }
+
+    /* everything is located in a single cell.  That is easy! */
+    /*                                                        */
+    if ( ex1 == ex2 )
+    {
+      delta      = y2 - y1;
+      ras.area  += (TArea)(( fx1 + fx2 ) * delta);
+      ras.cover += delta;
+      return;
+    }
+
+    /* ok, we'll have to render a run of adjacent cells on the same */
+    /* scanline...                                                  */
+    /*                                                              */
+    p     = ( ONE_PIXEL - fx1 ) * ( y2 - y1 );
+    first = ONE_PIXEL;
+    incr  = 1;
+
+    if ( dx < 0 )
+    {
+      p     = fx1 * ( y2 - y1 );
+      first = 0;
+      incr  = -1;
+      dx    = -dx;
+    }
+
+    delta = (TCoord)( p / dx );
+    mod   = (TCoord)( p % dx );
+    if ( mod < 0 )
+    {
+      delta--;
+      mod += (TCoord)dx;
+    }
+
+    ras.area  += (TArea)(( fx1 + first ) * delta);
+    ras.cover += delta;
+
+    ex1 += incr;
+    gray_set_cell( RAS_VAR_ ex1, ey );
+    y1  += delta;
+
+    if ( ex1 != ex2 )
+    {
+      TCoord  lift, rem;
+
+
+      p    = ONE_PIXEL * ( y2 - y1 + delta );
+      lift = (TCoord)( p / dx );
+      rem  = (TCoord)( p % dx );
+      if ( rem < 0 )
+      {
+        lift--;
+        rem += (TCoord)dx;
+      }
+
+      mod -= (int)dx;
+
+      while ( ex1 != ex2 )
+      {
+        delta = lift;
+        mod  += rem;
+        if ( mod >= 0 )
+        {
+          mod -= (TCoord)dx;
+          delta++;
+        }
+
+        ras.area  += (TArea)(ONE_PIXEL * delta);
+        ras.cover += delta;
+        y1        += delta;
+        ex1       += incr;
+        gray_set_cell( RAS_VAR_ ex1, ey );
+      }
+    }
+
+    delta      = y2 - y1;
+    ras.area  += (TArea)(( fx2 + ONE_PIXEL - first ) * delta);
+    ras.cover += delta;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Render a given line as a series of scanlines.                         */
+  /*                                                                       */
+  static void
+  gray_render_line( RAS_ARG_ TPos  to_x,
+                             TPos  to_y )
+  {
+    TCoord  ey1, ey2, fy1, fy2, mod;
+    TPos    dx, dy, x, x2;
+    long    p, first;
+    int     delta, rem, lift, incr;
+
+
+    ey1 = TRUNC( ras.last_ey );
+    ey2 = TRUNC( to_y );     /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */
+    fy1 = (TCoord)( ras.y - ras.last_ey );
+    fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) );
+
+    dx = to_x - ras.x;
+    dy = to_y - ras.y;
+
+    /* XXX: we should do something about the trivial case where dx == 0, */
+    /*      as it happens very often!                                    */
+
+    /* perform vertical clipping */
+    {
+      TCoord  min, max;
+
+
+      min = ey1;
+      max = ey2;
+      if ( ey1 > ey2 )
+      {
+        min = ey2;
+        max = ey1;
+      }
+      if ( min >= ras.max_ey || max < ras.min_ey )
+        goto End;
+    }
+
+    /* everything is on a single scanline */
+    if ( ey1 == ey2 )
+    {
+      gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 );
+      goto End;
+    }
+
+    /* vertical line - avoid calling gray_render_scanline */
+    incr = 1;
+
+    if ( dx == 0 )
+    {
+      TCoord  ex     = TRUNC( ras.x );
+      TCoord  two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 );
+      TArea   area;
+
+
+      first = ONE_PIXEL;
+      if ( dy < 0 )
+      {
+        first = 0;
+        incr  = -1;
+      }
+
+      delta      = (int)( first - fy1 );
+      ras.area  += (TArea)two_fx * delta;
+      ras.cover += delta;
+      ey1       += incr;
+
+      gray_set_cell( RAS_VAR_ ex, ey1 );
+
+      delta = (int)( first + first - ONE_PIXEL );
+      area  = (TArea)two_fx * delta;
+      while ( ey1 != ey2 )
+      {
+        ras.area  += area;
+        ras.cover += delta;
+        ey1       += incr;
+
+        gray_set_cell( RAS_VAR_ ex, ey1 );
+      }
+
+      delta      = (int)( fy2 - ONE_PIXEL + first );
+      ras.area  += (TArea)two_fx * delta;
+      ras.cover += delta;
+
+      goto End;
+    }
+
+    /* ok, we have to render several scanlines */
+    p     = ( ONE_PIXEL - fy1 ) * dx;
+    first = ONE_PIXEL;
+    incr  = 1;
+
+    if ( dy < 0 )
+    {
+      p     = fy1 * dx;
+      first = 0;
+      incr  = -1;
+      dy    = -dy;
+    }
+
+    delta = (int)( p / dy );
+    mod   = (int)( p % dy );
+    if ( mod < 0 )
+    {
+      delta--;
+      mod += (TCoord)dy;
+    }
+
+    x = ras.x + delta;
+    gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first );
+
+    ey1 += incr;
+    gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
+
+    if ( ey1 != ey2 )
+    {
+      p     = ONE_PIXEL * dx;
+      lift  = (int)( p / dy );
+      rem   = (int)( p % dy );
+      if ( rem < 0 )
+      {
+        lift--;
+        rem += (int)dy;
+      }
+      mod -= (int)dy;
+
+      while ( ey1 != ey2 )
+      {
+        delta = lift;
+        mod  += rem;
+        if ( mod >= 0 )
+        {
+          mod -= (int)dy;
+          delta++;
+        }
+
+        x2 = x + delta;
+        gray_render_scanline( RAS_VAR_ ey1, x,
+                                       (TCoord)( ONE_PIXEL - first ), x2,
+                                       (TCoord)first );
+        x = x2;
+
+        ey1 += incr;
+        gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
+      }
+    }
+
+    gray_render_scanline( RAS_VAR_ ey1, x,
+                                   (TCoord)( ONE_PIXEL - first ), to_x,
+                                   fy2 );
+
+  End:
+    ras.x       = to_x;
+    ras.y       = to_y;
+    ras.last_ey = SUBPIXELS( ey2 );
+  }
+
+
+  static void
+  gray_split_conic( FT_Vector*  base )
+  {
+    TPos  a, b;
+
+
+    base[4].x = base[2].x;
+    b = base[1].x;
+    a = base[3].x = ( base[2].x + b ) / 2;
+    b = base[1].x = ( base[0].x + b ) / 2;
+    base[2].x = ( a + b ) / 2;
+
+    base[4].y = base[2].y;
+    b = base[1].y;
+    a = base[3].y = ( base[2].y + b ) / 2;
+    b = base[1].y = ( base[0].y + b ) / 2;
+    base[2].y = ( a + b ) / 2;
+  }
+
+
+  static void
+  gray_render_conic( RAS_ARG_ const FT_Vector*  control,
+                              const FT_Vector*  to )
+  {
+    TPos        dx, dy;
+    TPos        min, max, y;
+    int         top, level;
+    int*        levels;
+    FT_Vector*  arc;
+
+
+    levels = ras.lev_stack;
+
+    arc      = ras.bez_stack;
+    arc[0].x = UPSCALE( to->x );
+    arc[0].y = UPSCALE( to->y );
+    arc[1].x = UPSCALE( control->x );
+    arc[1].y = UPSCALE( control->y );
+    arc[2].x = ras.x;
+    arc[2].y = ras.y;
+    top      = 0;
+
+    dx = FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x );
+    dy = FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y );
+    if ( dx < dy )
+      dx = dy;
+
+    if ( dx < ONE_PIXEL / 4 )
+      goto Draw;
+
+    /* short-cut the arc that crosses the current band */
+    min = max = arc[0].y;
+
+    y = arc[1].y;
+    if ( y < min ) min = y;
+    if ( y > max ) max = y;
+
+    y = arc[2].y;
+    if ( y < min ) min = y;
+    if ( y > max ) max = y;
+
+    if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )
+      goto Draw;
+
+    level = 0;
+    do
+    {
+      dx >>= 2;
+      level++;
+    } while ( dx > ONE_PIXEL / 4 );
+
+    levels[0] = level;
+
+    do
+    {
+      level = levels[top];
+      if ( level > 0 )
+      {
+        gray_split_conic( arc );
+        arc += 2;
+        top++;
+        levels[top] = levels[top - 1] = level - 1;
+        continue;
+      }
+
+    Draw:
+      gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
+      top--;
+      arc -= 2;
+
+    } while ( top >= 0 );
+  }
+
+
+  static void
+  gray_split_cubic( FT_Vector*  base )
+  {
+    TPos  a, b, c, d;
+
+
+    base[6].x = base[3].x;
+    c = base[1].x;
+    d = base[2].x;
+    base[1].x = a = ( base[0].x + c ) / 2;
+    base[5].x = b = ( base[3].x + d ) / 2;
+    c = ( c + d ) / 2;
+    base[2].x = a = ( a + c ) / 2;
+    base[4].x = b = ( b + c ) / 2;
+    base[3].x = ( a + b ) / 2;
+
+    base[6].y = base[3].y;
+    c = base[1].y;
+    d = base[2].y;
+    base[1].y = a = ( base[0].y + c ) / 2;
+    base[5].y = b = ( base[3].y + d ) / 2;
+    c = ( c + d ) / 2;
+    base[2].y = a = ( a + c ) / 2;
+    base[4].y = b = ( b + c ) / 2;
+    base[3].y = ( a + b ) / 2;
+  }
+
+
+  static void
+  gray_render_cubic( RAS_ARG_ const FT_Vector*  control1,
+                              const FT_Vector*  control2,
+                              const FT_Vector*  to )
+  {
+    FT_Vector*  arc;
+    TPos        min, max, y;
+
+
+    arc      = ras.bez_stack;
+    arc[0].x = UPSCALE( to->x );
+    arc[0].y = UPSCALE( to->y );
+    arc[1].x = UPSCALE( control2->x );
+    arc[1].y = UPSCALE( control2->y );
+    arc[2].x = UPSCALE( control1->x );
+    arc[2].y = UPSCALE( control1->y );
+    arc[3].x = ras.x;
+    arc[3].y = ras.y;
+
+    /* Short-cut the arc that crosses the current band. */
+    min = max = arc[0].y;
+
+    y = arc[1].y;
+    if ( y < min )
+      min = y;
+    if ( y > max )
+      max = y;
+
+    y = arc[2].y;
+    if ( y < min )
+      min = y;
+    if ( y > max )
+      max = y;
+
+    y = arc[3].y;
+    if ( y < min )
+      min = y;
+    if ( y > max )
+      max = y;
+
+    if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )
+      goto Draw;
+
+    for (;;)
+    {
+      /* Decide whether to split or draw. See `Rapid Termination          */
+      /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */
+      /* F. Hain, at                                                      */
+      /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */
+
+      {
+        TPos  dx, dy, dx_, dy_;
+        TPos  dx1, dy1, dx2, dy2;
+        TPos  L, s, s_limit;
+
+
+        /* dx and dy are x and y components of the P0-P3 chord vector. */
+        dx = arc[3].x - arc[0].x;
+        dy = arc[3].y - arc[0].y;
+
+        /* L is an (under)estimate of the Euclidean distance P0-P3.       */
+        /*                                                                */
+        /* If dx >= dy, then r = sqrt(dx^2 + dy^2) can be overestimated   */
+        /* with least maximum error by                                    */
+        /*                                                                */
+        /*   r_upperbound = dx + (sqrt(2) - 1) * dy  ,                    */
+        /*                                                                */
+        /* where sqrt(2) - 1 can be (over)estimated by 107/256, giving an */
+        /* error of no more than 8.4%.                                    */
+        /*                                                                */
+        /* Similarly, some elementary calculus shows that r can be        */
+        /* underestimated with least maximum error by                     */
+        /*                                                                */
+        /*   r_lowerbound = sqrt(2 + sqrt(2)) / 2 * dx                    */
+        /*                  + sqrt(2 - sqrt(2)) / 2 * dy  .               */
+        /*                                                                */
+        /* 236/256 and 97/256 are (under)estimates of the two algebraic   */
+        /* numbers, giving an error of no more than 8.1%.                 */
+
+        dx_ = FT_ABS( dx );
+        dy_ = FT_ABS( dy );
+
+        /* This is the same as                     */
+        /*                                         */
+        /*   L = ( 236 * FT_MAX( dx_, dy_ )        */
+        /*       + 97 * FT_MIN( dx_, dy_ ) ) >> 8; */
+        L = ( dx_ > dy_ ? 236 * dx_ +  97 * dy_
+                        :  97 * dx_ + 236 * dy_ ) >> 8;
+
+        /* Avoid possible arithmetic overflow below by splitting. */
+        if ( L > 32767 )
+          goto Split;
+
+        /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */
+        s_limit = L * (TPos)( ONE_PIXEL / 6 );
+
+        /* s is L * the perpendicular distance from P1 to the line P0-P3. */
+        dx1 = arc[1].x - arc[0].x;
+        dy1 = arc[1].y - arc[0].y;
+        s = FT_ABS( dy * dx1 - dx * dy1 );
+
+        if ( s > s_limit )
+          goto Split;
+
+        /* s is L * the perpendicular distance from P2 to the line P0-P3. */
+        dx2 = arc[2].x - arc[0].x;
+        dy2 = arc[2].y - arc[0].y;
+        s = FT_ABS( dy * dx2 - dx * dy2 );
+
+        if ( s > s_limit )
+          goto Split;
+
+        /* Split super curvy segments where the off points are so far
+           from the chord that the angles P0-P1-P3 or P0-P2-P3 become
+           acute as detected by appropriate dot products. */
+        if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 ||
+             dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 )
+          goto Split;
+
+        /* No reason to split. */
+        goto Draw;
+      }
+
+    Split:
+      gray_split_cubic( arc );
+      arc += 3;
+      continue;
+
+    Draw:
+      gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
+
+      if ( arc == ras.bez_stack )
+        return;
+
+      arc -= 3;
+    }
+  }
+
+
+  static int
+  gray_move_to( const FT_Vector*  to,
+                gray_PWorker      worker )
+  {
+    TPos  x, y;
+
+
+    /* record current cell, if any */
+    gray_record_cell( RAS_VAR );
+
+    /* start to a new position */
+    x = UPSCALE( to->x );
+    y = UPSCALE( to->y );
+
+    gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) );
+
+    worker->x = x;
+    worker->y = y;
+    return 0;
+  }
+
+
+  static int
+  gray_line_to( const FT_Vector*  to,
+                gray_PWorker      worker )
+  {
+    gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) );
+    return 0;
+  }
+
+
+  static int
+  gray_conic_to( const FT_Vector*  control,
+                 const FT_Vector*  to,
+                 gray_PWorker      worker )
+  {
+    gray_render_conic( RAS_VAR_ control, to );
+    return 0;
+  }
+
+
+  static int
+  gray_cubic_to( const FT_Vector*  control1,
+                 const FT_Vector*  control2,
+                 const FT_Vector*  to,
+                 gray_PWorker      worker )
+  {
+    gray_render_cubic( RAS_VAR_ control1, control2, to );
+    return 0;
+  }
+
+
+  static void
+  gray_render_span( int             y,
+                    int             count,
+                    const FT_Span*  spans,
+                    gray_PWorker    worker )
+  {
+    unsigned char*  p;
+    FT_Bitmap*      map = &worker->target;
+
+
+    /* first of all, compute the scanline offset */
+    p = (unsigned char*)map->buffer - y * map->pitch;
+    if ( map->pitch >= 0 )
+      p += (unsigned)( ( map->rows - 1 ) * map->pitch );
+
+    for ( ; count > 0; count--, spans++ )
+    {
+      unsigned char  coverage = spans->coverage;
+
+
+      if ( coverage )
+      {
+        /* For small-spans it is faster to do it by ourselves than
+         * calling `memset'.  This is mainly due to the cost of the
+         * function call.
+         */
+        if ( spans->len >= 8 )
+          FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len );
+        else
+        {
+          unsigned char*  q = p + spans->x;
+
+
+          switch ( spans->len )
+          {
+          case 7: *q++ = (unsigned char)coverage;
+          case 6: *q++ = (unsigned char)coverage;
+          case 5: *q++ = (unsigned char)coverage;
+          case 4: *q++ = (unsigned char)coverage;
+          case 3: *q++ = (unsigned char)coverage;
+          case 2: *q++ = (unsigned char)coverage;
+          case 1: *q   = (unsigned char)coverage;
+          default:
+            ;
+          }
+        }
+      }
+    }
+  }
+
+
+  static void
+  gray_hline( RAS_ARG_ TCoord  x,
+                       TCoord  y,
+                       TPos    area,
+                       TCoord  acount )
+  {
+    int  coverage;
+
+
+    /* compute the coverage line's coverage, depending on the    */
+    /* outline fill rule                                         */
+    /*                                                           */
+    /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */
+    /*                                                           */
+    coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) );
+                                                    /* use range 0..256 */
+    if ( coverage < 0 )
+      coverage = -coverage;
+
+    if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL )
+    {
+      coverage &= 511;
+
+      if ( coverage > 256 )
+        coverage = 512 - coverage;
+      else if ( coverage == 256 )
+        coverage = 255;
+    }
+    else
+    {
+      /* normal non-zero winding rule */
+      if ( coverage >= 256 )
+        coverage = 255;
+    }
+
+    y += (TCoord)ras.min_ey;
+    x += (TCoord)ras.min_ex;
+
+    /* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */
+    if ( x >= 32767 )
+      x = 32767;
+
+    /* FT_Span.y is an integer, so limit our coordinates appropriately */
+    if ( y >= FT_INT_MAX )
+      y = FT_INT_MAX;
+
+    if ( coverage )
+    {
+      FT_Span*  span;
+      int       count;
+
+
+      /* see whether we can add this span to the current list */
+      count = ras.num_gray_spans;
+      span  = ras.gray_spans + count - 1;
+      if ( count > 0                          &&
+           ras.span_y == y                    &&
+           (int)span->x + span->len == (int)x &&
+           span->coverage == coverage         )
+      {
+        span->len = (unsigned short)( span->len + acount );
+        return;
+      }
+
+      if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS )
+      {
+        if ( ras.render_span && count > 0 )
+          ras.render_span( ras.span_y, count, ras.gray_spans,
+                           ras.render_span_data );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+        if ( count > 0 )
+        {
+          int  n;
+
+
+          FT_TRACE7(( "y = %3d ", ras.span_y ));
+          span = ras.gray_spans;
+          for ( n = 0; n < count; n++, span++ )
+            FT_TRACE7(( "[%d..%d]:%02x ",
+                        span->x, span->x + span->len - 1, span->coverage ));
+          FT_TRACE7(( "\n" ));
+        }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+        ras.num_gray_spans = 0;
+        ras.span_y         = (int)y;
+
+        count = 0;
+        span  = ras.gray_spans;
+      }
+      else
+        span++;
+	  // Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.
+	  // Limited to the value range of 'x', we have to crop it for avoid the overflow.
+	  if (x < 32768) {
+      /* add a gray span to the current list */
+      span->x        = (short)x;
+      span->len      = (unsigned short)acount;
+      span->coverage = (unsigned char)coverage;
+
+      ras.num_gray_spans++;
+	  }
+    }
+  }
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+  /* to be called while in the debugger --                                */
+  /* this function causes a compiler warning since it is unused otherwise */
+  static void
+  gray_dump_cells( RAS_ARG )
+  {
+    int  yindex;
+
+
+    for ( yindex = 0; yindex < ras.ycount; yindex++ )
+    {
+      PCell  cell;
+
+
+      printf( "%3d:", yindex );
+
+      for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next )
+        printf( " (%3ld, c:%4ld, a:%6d)", cell->x, cell->cover, cell->area );
+      printf( "\n" );
+    }
+  }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+  static void
+  gray_sweep( RAS_ARG_ const FT_Bitmap*  target )
+  {
+    int  yindex;
+
+    FT_UNUSED( target );
+
+
+    if ( ras.num_cells == 0 )
+      return;
+
+    ras.num_gray_spans = 0;
+
+    FT_TRACE7(( "gray_sweep: start\n" ));
+
+    for ( yindex = 0; yindex < ras.ycount; yindex++ )
+    {
+      PCell   cell  = ras.ycells[yindex];
+      TCoord  cover = 0;
+      TCoord  x     = 0;
+
+
+      for ( ; cell != NULL; cell = cell->next )
+      {
+        TPos  area;
+
+
+        if ( cell->x > x && cover != 0 )
+          gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),
+                      cell->x - x );
+
+        cover += cell->cover;
+        area   = cover * ( ONE_PIXEL * 2 ) - cell->area;
+
+        if ( area != 0 && cell->x >= 0 )
+          gray_hline( RAS_VAR_ cell->x, yindex, area, 1 );
+
+        x = cell->x + 1;
+      }
+
+      if ( cover != 0 )
+        gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),
+                    ras.count_ex - x );
+    }
+
+    if ( ras.render_span && ras.num_gray_spans > 0 )
+      ras.render_span( ras.span_y, ras.num_gray_spans,
+                       ras.gray_spans, ras.render_span_data );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+    if ( ras.num_gray_spans > 0 )
+    {
+      FT_Span*  span;
+      int       n;
+
+
+      FT_TRACE7(( "y = %3d ", ras.span_y ));
+      span = ras.gray_spans;
+      for ( n = 0; n < ras.num_gray_spans; n++, span++ )
+        FT_TRACE7(( "[%d..%d]:%02x ",
+                    span->x, span->x + span->len - 1, span->coverage ));
+      FT_TRACE7(( "\n" ));
+    }
+
+    FT_TRACE7(( "gray_sweep: end\n" ));
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+  }
+
+
+#ifdef _STANDALONE_
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  The following function should only compile in stand-alone mode,      */
+  /*  i.e., when building this component without the rest of FreeType.     */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Decompose                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Walk over an outline's structure to decompose it into individual   */
+  /*    segments and Bézier arcs.  This function is also able to emit      */
+  /*    `move to' and `close to' operations to indicate the start and end  */
+  /*    of new contours in the outline.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline        :: A pointer to the source target.                  */
+  /*                                                                       */
+  /*    func_interface :: A table of `emitters', i.e., function pointers   */
+  /*                      called during decomposition to indicate path     */
+  /*                      operations.                                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    user           :: A typeless pointer which is passed to each       */
+  /*                      emitter during the decomposition.  It can be     */
+  /*                      used to store the state during the               */
+  /*                      decomposition.                                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0 means success.                                      */
+  /*                                                                       */
+  static int
+  FT_Outline_Decompose( const FT_Outline*        outline,
+                        const FT_Outline_Funcs*  func_interface,
+                        void*                    user )
+  {
+#undef SCALED
+#define SCALED( x )  ( ( (x) << shift ) - delta )
+
+    FT_Vector   v_last;
+    FT_Vector   v_control;
+    FT_Vector   v_start;
+
+    FT_Vector*  point;
+    FT_Vector*  limit;
+    char*       tags;
+
+    int         error;
+
+    int   n;         /* index of contour in outline     */
+    int   first;     /* index of first point in contour */
+    char  tag;       /* current point's state           */
+
+    int   shift;
+    TPos  delta;
+
+
+    if ( !outline || !func_interface )
+      return FT_THROW( Invalid_Argument );
+
+    shift = func_interface->shift;
+    delta = func_interface->delta;
+    first = 0;
+
+    for ( n = 0; n < outline->n_contours; n++ )
+    {
+      int  last;  /* index of last point in contour */
+
+
+      FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n ));
+
+      last  = outline->contours[n];
+      if ( last < 0 )
+        goto Invalid_Outline;
+      limit = outline->points + last;
+
+      v_start   = outline->points[first];
+      v_start.x = SCALED( v_start.x );
+      v_start.y = SCALED( v_start.y );
+
+      v_last   = outline->points[last];
+      v_last.x = SCALED( v_last.x );
+      v_last.y = SCALED( v_last.y );
+
+      v_control = v_start;
+
+      point = outline->points + first;
+      tags  = outline->tags   + first;
+      tag   = FT_CURVE_TAG( tags[0] );
+
+      /* A contour cannot start with a cubic control point! */
+      if ( tag == FT_CURVE_TAG_CUBIC )
+        goto Invalid_Outline;
+
+      /* check first point to determine origin */
+      if ( tag == FT_CURVE_TAG_CONIC )
+      {
+        /* first point is conic control.  Yes, this happens. */
+        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
+        {
+          /* start at last point if it is on the curve */
+          v_start = v_last;
+          limit--;
+        }
+        else
+        {
+          /* if both first and last points are conic,         */
+          /* start at their middle and record its position    */
+          /* for closure                                      */
+          v_start.x = ( v_start.x + v_last.x ) / 2;
+          v_start.y = ( v_start.y + v_last.y ) / 2;
+
+          v_last = v_start;
+        }
+        point--;
+        tags--;
+      }
+
+      FT_TRACE5(( "  move to (%.2f, %.2f)\n",
+                  v_start.x / 64.0, v_start.y / 64.0 ));
+      error = func_interface->move_to( &v_start, user );
+      if ( error )
+        goto Exit;
+
+      while ( point < limit )
+      {
+        point++;
+        tags++;
+
+        tag = FT_CURVE_TAG( tags[0] );
+        switch ( tag )
+        {
+        case FT_CURVE_TAG_ON:  /* emit a single line_to */
+          {
+            FT_Vector  vec;
+
+
+            vec.x = SCALED( point->x );
+            vec.y = SCALED( point->y );
+
+            FT_TRACE5(( "  line to (%.2f, %.2f)\n",
+                        vec.x / 64.0, vec.y / 64.0 ));
+            error = func_interface->line_to( &vec, user );
+            if ( error )
+              goto Exit;
+            continue;
+          }
+
+        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
+          v_control.x = SCALED( point->x );
+          v_control.y = SCALED( point->y );
+
+        Do_Conic:
+          if ( point < limit )
+          {
+            FT_Vector  vec;
+            FT_Vector  v_middle;
+
+
+            point++;
+            tags++;
+            tag = FT_CURVE_TAG( tags[0] );
+
+            vec.x = SCALED( point->x );
+            vec.y = SCALED( point->y );
+
+            if ( tag == FT_CURVE_TAG_ON )
+            {
+              FT_TRACE5(( "  conic to (%.2f, %.2f)"
+                          " with control (%.2f, %.2f)\n",
+                          vec.x / 64.0, vec.y / 64.0,
+                          v_control.x / 64.0, v_control.y / 64.0 ));
+              error = func_interface->conic_to( &v_control, &vec, user );
+              if ( error )
+                goto Exit;
+              continue;
+            }
+
+            if ( tag != FT_CURVE_TAG_CONIC )
+              goto Invalid_Outline;
+
+            v_middle.x = ( v_control.x + vec.x ) / 2;
+            v_middle.y = ( v_control.y + vec.y ) / 2;
+
+            FT_TRACE5(( "  conic to (%.2f, %.2f)"
+                        " with control (%.2f, %.2f)\n",
+                        v_middle.x / 64.0, v_middle.y / 64.0,
+                        v_control.x / 64.0, v_control.y / 64.0 ));
+            error = func_interface->conic_to( &v_control, &v_middle, user );
+            if ( error )
+              goto Exit;
+
+            v_control = vec;
+            goto Do_Conic;
+          }
+
+          FT_TRACE5(( "  conic to (%.2f, %.2f)"
+                      " with control (%.2f, %.2f)\n",
+                      v_start.x / 64.0, v_start.y / 64.0,
+                      v_control.x / 64.0, v_control.y / 64.0 ));
+          error = func_interface->conic_to( &v_control, &v_start, user );
+          goto Close;
+
+        default:  /* FT_CURVE_TAG_CUBIC */
+          {
+            FT_Vector  vec1, vec2;
+
+
+            if ( point + 1 > limit                             ||
+                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+              goto Invalid_Outline;
+
+            point += 2;
+            tags  += 2;
+
+            vec1.x = SCALED( point[-2].x );
+            vec1.y = SCALED( point[-2].y );
+
+            vec2.x = SCALED( point[-1].x );
+            vec2.y = SCALED( point[-1].y );
+
+            if ( point <= limit )
+            {
+              FT_Vector  vec;
+
+
+              vec.x = SCALED( point->x );
+              vec.y = SCALED( point->y );
+
+              FT_TRACE5(( "  cubic to (%.2f, %.2f)"
+                          " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+                          vec.x / 64.0, vec.y / 64.0,
+                          vec1.x / 64.0, vec1.y / 64.0,
+                          vec2.x / 64.0, vec2.y / 64.0 ));
+              error = func_interface->cubic_to( &vec1, &vec2, &vec, user );
+              if ( error )
+                goto Exit;
+              continue;
+            }
+
+            FT_TRACE5(( "  cubic to (%.2f, %.2f)"
+                        " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+                        v_start.x / 64.0, v_start.y / 64.0,
+                        vec1.x / 64.0, vec1.y / 64.0,
+                        vec2.x / 64.0, vec2.y / 64.0 ));
+            error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );
+            goto Close;
+          }
+        }
+      }
+
+      /* close the contour with a line segment */
+      FT_TRACE5(( "  line to (%.2f, %.2f)\n",
+                  v_start.x / 64.0, v_start.y / 64.0 ));
+      error = func_interface->line_to( &v_start, user );
+
+   Close:
+      if ( error )
+        goto Exit;
+
+      first = last + 1;
+    }
+
+    FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
+    return 0;
+
+  Exit:
+    FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error ));
+    return error;
+
+  Invalid_Outline:
+    return FT_THROW( Invalid_Outline );
+  }
+
+#endif /* _STANDALONE_ */
+
+
+  typedef struct  gray_TBand_
+  {
+    TPos  min, max;
+
+  } gray_TBand;
+
+    FT_DEFINE_OUTLINE_FUNCS(func_interface,
+      (FT_Outline_MoveTo_Func) gray_move_to,
+      (FT_Outline_LineTo_Func) gray_line_to,
+      (FT_Outline_ConicTo_Func)gray_conic_to,
+      (FT_Outline_CubicTo_Func)gray_cubic_to,
+      0,
+      0
+    )
+
+  static int
+  gray_convert_glyph_inner( RAS_ARG )
+  {
+
+    volatile int  error = 0;
+
+#ifdef FT_CONFIG_OPTION_PIC
+      FT_Outline_Funcs func_interface;
+      Init_Class_func_interface(&func_interface);
+#endif
+#ifndef _FX_MANAGED_CODE_    
+    if ( ft_setjmp( ras.jump_buffer ) == 0 )
+    {
+#endif
+      error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
+      gray_record_cell( RAS_VAR );
+#ifndef _FX_MANAGED_CODE_ 
+	}
+    else
+      error = FT_THROW( Memory_Overflow );
+#endif
+    return error;
+  }
+
+
+  static int
+  gray_convert_glyph( RAS_ARG )
+  {
+    gray_TBand            bands[40];
+    gray_TBand* volatile  band;
+    int volatile          n, num_bands;
+    TPos volatile         min, max, max_y;
+    FT_BBox*              clip;
+
+
+    /* Set up state in the raster object */
+    gray_compute_cbox( RAS_VAR );
+
+    /* clip to target bitmap, exit if nothing to do */
+    clip = &ras.clip_box;
+
+    if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax ||
+         ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax )
+      return 0;
+
+    if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin;
+    if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin;
+
+    if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax;
+    if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax;
+
+    ras.count_ex = ras.max_ex - ras.min_ex;
+    ras.count_ey = ras.max_ey - ras.min_ey;
+
+    /* set up vertical bands */
+    num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size );
+    if ( num_bands == 0 )
+      num_bands = 1;
+    if ( num_bands >= 39 )
+      num_bands = 39;
+
+    ras.band_shoot = 0;
+
+    min   = ras.min_ey;
+    max_y = ras.max_ey;
+
+    for ( n = 0; n < num_bands; n++, min = max )
+    {
+      max = min + ras.band_size;
+      if ( n == num_bands - 1 || max > max_y )
+        max = max_y;
+
+      bands[0].min = min;
+      bands[0].max = max;
+      band         = bands;
+
+      while ( band >= bands )
+      {
+        TPos  bottom, top, middle;
+        int   error;
+
+        {
+          PCell  cells_max;
+          int    yindex;
+          long   cell_start, cell_end, cell_mod;
+
+
+          ras.ycells = (PCell*)ras.buffer;
+          ras.ycount = band->max - band->min;
+
+          cell_start = sizeof ( PCell ) * ras.ycount;
+          cell_mod   = cell_start % sizeof ( TCell );
+          if ( cell_mod > 0 )
+            cell_start += sizeof ( TCell ) - cell_mod;
+
+          cell_end  = ras.buffer_size;
+          cell_end -= cell_end % sizeof ( TCell );
+
+          cells_max = (PCell)( (char*)ras.buffer + cell_end );
+          ras.cells = (PCell)( (char*)ras.buffer + cell_start );
+          if ( ras.cells >= cells_max )
+            goto ReduceBands;
+
+          ras.max_cells = cells_max - ras.cells;
+          if ( ras.max_cells < 2 )
+            goto ReduceBands;
+
+          for ( yindex = 0; yindex < ras.ycount; yindex++ )
+            ras.ycells[yindex] = NULL;
+        }
+
+        ras.num_cells = 0;
+        ras.invalid   = 1;
+        ras.min_ey    = band->min;
+        ras.max_ey    = band->max;
+        ras.count_ey  = band->max - band->min;
+
+        error = gray_convert_glyph_inner( RAS_VAR );
+
+        if ( !error )
+        {
+          gray_sweep( RAS_VAR_ &ras.target );
+          band--;
+          continue;
+        }
+        else if ( error != ErrRaster_Memory_Overflow )
+          return 1;
+
+      ReduceBands:
+        /* render pool overflow; we will reduce the render band by half */
+        bottom = band->min;
+        top    = band->max;
+        middle = bottom + ( ( top - bottom ) >> 1 );
+
+        /* This is too complex for a single scanline; there must */
+        /* be some problems.                                     */
+        if ( middle == bottom )
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" ));
+#endif
+          return 1;
+        }
+
+        if ( bottom-top >= ras.band_size )
+          ras.band_shoot++;
+
+        band[1].min = bottom;
+        band[1].max = middle;
+        band[0].min = middle;
+        band[0].max = top;
+        band++;
+      }
+    }
+
+    if ( ras.band_shoot > 8 && ras.band_size > 16 )
+      ras.band_size = ras.band_size / 2;
+
+    return 0;
+  }
+
+
+  static int
+  gray_raster_render( gray_PRaster             raster,
+                      const FT_Raster_Params*  params )
+  {
+    const FT_Outline*  outline    = (const FT_Outline*)params->source;
+    const FT_Bitmap*   target_map = params->target;
+    gray_PWorker       worker;
+
+
+    if ( !raster || !raster->buffer || !raster->buffer_size )
+      return FT_THROW( Invalid_Argument );
+
+    if ( !outline )
+      return FT_THROW( Invalid_Outline );
+
+    /* return immediately if the outline is empty */
+    if ( outline->n_points == 0 || outline->n_contours <= 0 )
+      return 0;
+
+    if ( !outline->contours || !outline->points )
+      return FT_THROW( Invalid_Outline );
+
+    if ( outline->n_points !=
+           outline->contours[outline->n_contours - 1] + 1 )
+      return FT_THROW( Invalid_Outline );
+
+    worker = raster->worker;
+
+    /* if direct mode is not set, we must have a target bitmap */
+    if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
+    {
+      if ( !target_map )
+        return FT_THROW( Invalid_Argument );
+
+      /* nothing to do */
+      if ( !target_map->width || !target_map->rows )
+        return 0;
+
+      if ( !target_map->buffer )
+        return FT_THROW( Invalid_Argument );
+    }
+
+    /* this version does not support monochrome rendering */
+    if ( !( params->flags & FT_RASTER_FLAG_AA ) )
+      return FT_THROW( Invalid_Mode );
+
+    /* compute clipping box */
+    if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
+    {
+      /* compute clip box from target pixmap */
+      ras.clip_box.xMin = 0;
+      ras.clip_box.yMin = 0;
+      ras.clip_box.xMax = target_map->width;
+      ras.clip_box.yMax = target_map->rows;
+    }
+    else if ( params->flags & FT_RASTER_FLAG_CLIP )
+      ras.clip_box = params->clip_box;
+    else
+    {
+      ras.clip_box.xMin = -32768L;
+      ras.clip_box.yMin = -32768L;
+      ras.clip_box.xMax =  32767L;
+      ras.clip_box.yMax =  32767L;
+    }
+
+    gray_init_cells( RAS_VAR_ raster->buffer, raster->buffer_size );
+
+    ras.outline        = *outline;
+    ras.num_cells      = 0;
+    ras.invalid        = 1;
+    ras.band_size      = raster->band_size;
+    ras.num_gray_spans = 0;
+
+    if ( params->flags & FT_RASTER_FLAG_DIRECT )
+    {
+      ras.render_span      = (FT_Raster_Span_Func)params->gray_spans;
+      ras.render_span_data = params->user;
+    }
+    else
+    {
+      ras.target           = *target_map;
+      ras.render_span      = (FT_Raster_Span_Func)gray_render_span;
+      ras.render_span_data = &ras;
+    }
+
+    return gray_convert_glyph( RAS_VAR );
+  }
+
+
+  /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/
+  /****                         a static object.                   *****/
+
+#ifdef _STANDALONE_
+
+  static int
+  gray_raster_new( void*       memory,
+                   FT_Raster*  araster )
+  {
+    static gray_TRaster  the_raster;
+
+    FT_UNUSED( memory );
+
+
+    *araster = (FT_Raster)&the_raster;
+    FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );
+
+    return 0;
+  }
+
+
+  static void
+  gray_raster_done( FT_Raster  raster )
+  {
+    /* nothing */
+    FT_UNUSED( raster );
+  }
+
+#else /* !_STANDALONE_ */
+
+  static int
+  gray_raster_new( FT_Memory   memory,
+                   FT_Raster*  araster )
+  {
+    FT_Error      error;
+    gray_PRaster  raster = NULL;
+
+
+    *araster = 0;
+    if ( !FT_ALLOC( raster, sizeof ( gray_TRaster ) ) )
+    {
+      raster->memory = memory;
+      *araster       = (FT_Raster)raster;
+    }
+
+    return error;
+  }
+
+
+  static void
+  gray_raster_done( FT_Raster  raster )
+  {
+    FT_Memory  memory = (FT_Memory)((gray_PRaster)raster)->memory;
+
+
+    FT_FREE( raster );
+  }
+
+#endif /* !_STANDALONE_ */
+
+
+  static void
+  gray_raster_reset( FT_Raster  raster,
+                     char*      pool_base,
+                     long       pool_size )
+  {
+    gray_PRaster  rast = (gray_PRaster)raster;
+
+
+    if ( raster )
+    {
+      if ( pool_base && pool_size >= (long)sizeof ( gray_TWorker ) + 2048 )
+      {
+        gray_PWorker  worker = (gray_PWorker)pool_base;
+
+
+        rast->worker      = worker;
+        rast->buffer      = pool_base +
+                              ( ( sizeof ( gray_TWorker ) +
+                                  sizeof ( TCell ) - 1 )  &
+                                ~( sizeof ( TCell ) - 1 ) );
+        rast->buffer_size = (long)( ( pool_base + pool_size ) -
+                                    (char*)rast->buffer ) &
+                                      ~( sizeof ( TCell ) - 1 );
+        rast->band_size   = (int)( rast->buffer_size /
+                                     ( sizeof ( TCell ) * 8 ) );
+      }
+      else
+      {
+        rast->buffer      = NULL;
+        rast->buffer_size = 0;
+        rast->worker      = NULL;
+      }
+    }
+  }
+
+
+  FT_DEFINE_RASTER_FUNCS(ft_grays_raster,
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    (FT_Raster_New_Func)     gray_raster_new,
+    (FT_Raster_Reset_Func)   gray_raster_reset,
+    (FT_Raster_Set_Mode_Func)0,
+    (FT_Raster_Render_Func)  gray_raster_render,
+    (FT_Raster_Done_Func)    gray_raster_done
+  )
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.h
new file mode 100644
index 0000000..089db89
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.h
@@ -0,0 +1,58 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgrays.h                                                              */
+/*                                                                         */
+/*    FreeType smooth renderer declaration                                 */
+/*                                                                         */
+/*  Copyright 1996-2001 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTGRAYS_H__
+#define __FTGRAYS_H__
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+
+#ifdef _STANDALONE_
+#include "ftimage.h"
+#else
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h" /* for FT_CONFIG_OPTION_PIC */
+#include "../../include/freetype/ftimage.h"
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* To make ftgrays.h independent from configuration files we check       */
+  /* whether FT_EXPORT_VAR has been defined already.                       */
+  /*                                                                       */
+  /* On some systems and compilers (Win32 mostly), an extra keyword is     */
+  /* necessary to compile the library as a DLL.                            */
+  /*                                                                       */
+#ifndef FT_EXPORT_VAR
+#define FT_EXPORT_VAR( x )  extern  x
+#endif
+
+  FT_EXPORT_VAR( const FT_Raster_Funcs )  ft_grays_raster;
+
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif /* __FTGRAYS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmerrs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmerrs.h
new file mode 100644
index 0000000..5f4f824
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmerrs.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsmerrs.h                                                             */
+/*                                                                         */
+/*    smooth renderer error codes (specification only).                    */
+/*                                                                         */
+/*  Copyright 2001, 2012 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the smooth renderer error enumeration     */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __FTSMERRS_H__
+#define __FTSMERRS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  Smooth_Err_
+#define FT_ERR_BASE    FT_Mod_Err_Smooth
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __FTSMERRS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c
new file mode 100644
index 0000000..375b27b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c
@@ -0,0 +1,534 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsmooth.c                                                             */
+/*                                                                         */
+/*    Anti-aliasing renderer interface (body).                             */
+/*                                                                         */
+/*  Copyright 2000-2006, 2009-2013 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/ftoutln.h"
+#include "ftsmooth.h"
+#include "ftgrays.h"
+#include "ftspic.h"
+
+#include "ftsmerrs.h"
+
+
+  /* initialize renderer -- init its raster */
+  static FT_Error
+  ft_smooth_init( FT_Renderer  render )
+  {
+    FT_Library  library = FT_MODULE_LIBRARY( render );
+
+
+    render->clazz->raster_class->raster_reset( render->raster,
+                                               library->raster_pool,
+                                               library->raster_pool_size );
+
+    return 0;
+  }
+
+
+  /* sets render-specific mode */
+  static FT_Error
+  ft_smooth_set_mode( FT_Renderer  render,
+                      FT_ULong     mode_tag,
+                      FT_Pointer   data )
+  {
+    /* we simply pass it to the raster */
+    return render->clazz->raster_class->raster_set_mode( render->raster,
+                                                         mode_tag,
+                                                         data );
+  }
+
+  /* transform a given glyph image */
+  static FT_Error
+  ft_smooth_transform( FT_Renderer       render,
+                       FT_GlyphSlot      slot,
+                       const FT_Matrix*  matrix,
+                       const FT_Vector*  delta )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( slot->format != render->glyph_format )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    if ( matrix )
+      FT_Outline_Transform( &slot->outline, matrix );
+
+    if ( delta )
+      FT_Outline_Translate( &slot->outline, delta->x, delta->y );
+
+  Exit:
+    return error;
+  }
+
+
+  /* return the glyph's control box */
+  static void
+  ft_smooth_get_cbox( FT_Renderer   render,
+                      FT_GlyphSlot  slot,
+                      FT_BBox*      cbox )
+  {
+    FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
+
+    if ( slot->format == render->glyph_format )
+      FT_Outline_Get_CBox( &slot->outline, cbox );
+  }
+
+
+  /* convert a slot's glyph image into a bitmap */
+  static FT_Error
+  ft_smooth_render_generic( FT_Renderer       render,
+                            FT_GlyphSlot      slot,
+                            FT_Render_Mode    mode,
+                            const FT_Vector*  origin,
+                            FT_Render_Mode    required_mode )
+  {
+    FT_Error     error;
+    FT_Outline*  outline = NULL;
+    FT_BBox      cbox;
+    FT_Pos       width, height, pitch;
+#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+    FT_Pos       height_org, width_org;
+#endif
+    FT_Bitmap*   bitmap  = &slot->bitmap;
+    FT_Memory    memory  = render->root.memory;
+    FT_Int       hmul    = mode == FT_RENDER_MODE_LCD;
+    FT_Int       vmul    = mode == FT_RENDER_MODE_LCD_V;
+    FT_Pos       x_shift = 0;
+    FT_Pos       y_shift = 0;
+    FT_Pos       x_left, y_top;
+
+    FT_Raster_Params  params;
+
+    FT_Bool  have_translated_origin = FALSE;
+    FT_Bool  have_outline_shifted   = FALSE;
+    FT_Bool  have_buffer            = FALSE;
+
+
+    /* check glyph image format */
+    if ( slot->format != render->glyph_format )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    /* check mode */
+    if ( mode != required_mode )
+    {
+      error = FT_THROW( Cannot_Render_Glyph );
+      goto Exit;
+    }
+
+    outline = &slot->outline;
+
+    /* translate the outline to the new origin if needed */
+    if ( origin )
+    {
+      FT_Outline_Translate( outline, origin->x, origin->y );
+      have_translated_origin = TRUE;
+    }
+
+    /* compute the control box, and grid fit it */
+    FT_Outline_Get_CBox( outline, &cbox );
+
+    cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+    cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+    cbox.xMax = FT_PIX_CEIL( cbox.xMax );
+    cbox.yMax = FT_PIX_CEIL( cbox.yMax );
+
+    if ( cbox.xMin < 0 && cbox.xMax > FT_INT_MAX + cbox.xMin )
+    {
+      FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
+                 " xMin = %d, xMax = %d\n",
+                 cbox.xMin >> 6, cbox.xMax >> 6 ));
+      error = FT_THROW( Raster_Overflow );
+      goto Exit;
+    }
+    else
+      width = ( cbox.xMax - cbox.xMin ) >> 6;
+
+    if ( cbox.yMin < 0 && cbox.yMax > FT_INT_MAX + cbox.yMin )
+    {
+      FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
+                 " yMin = %d, yMax = %d\n",
+                 cbox.yMin >> 6, cbox.yMax >> 6 ));
+      error = FT_THROW( Raster_Overflow );
+      goto Exit;
+    }
+    else
+      height = ( cbox.yMax - cbox.yMin ) >> 6;
+
+#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+    width_org  = width;
+    height_org = height;
+#endif
+
+    /* release old bitmap buffer */
+    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+    {
+      FT_FREE( bitmap->buffer );
+      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+    }
+
+    /* allocate new one */
+    pitch = width;
+    if ( hmul )
+    {
+      width = width * 3;
+      pitch = FT_PAD_CEIL( width, 4 );
+    }
+
+    if ( vmul )
+      height *= 3;
+
+    x_shift = (FT_Int) cbox.xMin;
+    y_shift = (FT_Int) cbox.yMin;
+    x_left  = (FT_Int)( cbox.xMin >> 6 );
+    y_top   = (FT_Int)( cbox.yMax >> 6 );
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+    if ( slot->library->lcd_filter_func )
+    {
+      FT_Int  extra = slot->library->lcd_extra;
+
+
+      if ( hmul )
+      {
+        x_shift -= 64 * ( extra >> 1 );
+        width   += 3 * extra;
+        pitch    = FT_PAD_CEIL( width, 4 );
+        x_left  -= extra >> 1;
+      }
+
+      if ( vmul )
+      {
+        y_shift -= 64 * ( extra >> 1 );
+        height  += 3 * extra;
+        y_top   += extra >> 1;
+      }
+    }
+
+#endif
+
+#if FT_UINT_MAX > 0xFFFFU
+
+    /* Required check is (pitch * height < FT_ULONG_MAX),        */
+    /* but we care realistic cases only.  Always pitch <= width. */
+    if ( width > 0x7FFF || height > 0x7FFF )
+    {
+      FT_ERROR(( "ft_smooth_render_generic: glyph too large: %u x %u\n",
+                 width, height ));
+      error = FT_THROW( Raster_Overflow );
+      goto Exit;
+    }
+
+#endif
+
+    bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
+    bitmap->num_grays  = 256;
+    bitmap->width      = width;
+    bitmap->rows       = height;
+    bitmap->pitch      = pitch;
+
+    /* translate outline to render it into the bitmap */
+    FT_Outline_Translate( outline, -x_shift, -y_shift );
+    have_outline_shifted = TRUE;
+
+    if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) )
+      goto Exit;
+    else
+      have_buffer = TRUE;
+
+    slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+
+    /* set up parameters */
+    params.target = bitmap;
+    params.source = outline;
+    params.flags  = FT_RASTER_FLAG_AA;
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+    /* implode outline if needed */
+    {
+      FT_Vector*  points     = outline->points;
+      FT_Vector*  points_end = points + outline->n_points;
+      FT_Vector*  vec;
+
+
+      if ( hmul )
+        for ( vec = points; vec < points_end; vec++ )
+          vec->x *= 3;
+
+      if ( vmul )
+        for ( vec = points; vec < points_end; vec++ )
+          vec->y *= 3;
+    }
+
+    /* render outline into the bitmap */
+    error = render->raster_render( render->raster, &params );
+
+    /* deflate outline if needed */
+    {
+      FT_Vector*  points     = outline->points;
+      FT_Vector*  points_end = points + outline->n_points;
+      FT_Vector*  vec;
+
+
+      if ( hmul )
+        for ( vec = points; vec < points_end; vec++ )
+          vec->x /= 3;
+
+      if ( vmul )
+        for ( vec = points; vec < points_end; vec++ )
+          vec->y /= 3;
+    }
+
+    if ( error )
+      goto Exit;
+
+    if ( slot->library->lcd_filter_func )
+      slot->library->lcd_filter_func( bitmap, mode, slot->library );
+
+#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+    /* render outline into bitmap */
+    error = render->raster_render( render->raster, &params );
+    if ( error )
+      goto Exit;
+
+    /* expand it horizontally */
+    if ( hmul )
+    {
+      FT_Byte*  line = bitmap->buffer;
+      FT_UInt   hh;
+
+
+      for ( hh = height_org; hh > 0; hh--, line += pitch )
+      {
+        FT_UInt   xx;
+        FT_Byte*  end = line + width;
+
+
+        for ( xx = width_org; xx > 0; xx-- )
+        {
+          FT_UInt  pixel = line[xx-1];
+
+
+          end[-3] = (FT_Byte)pixel;
+          end[-2] = (FT_Byte)pixel;
+          end[-1] = (FT_Byte)pixel;
+          end    -= 3;
+        }
+      }
+    }
+
+    /* expand it vertically */
+    if ( vmul )
+    {
+      FT_Byte*  read  = bitmap->buffer + ( height - height_org ) * pitch;
+      FT_Byte*  write = bitmap->buffer;
+      FT_UInt   hh;
+
+
+      for ( hh = height_org; hh > 0; hh-- )
+      {
+        ft_memcpy( write, read, pitch );
+        write += pitch;
+
+        ft_memcpy( write, read, pitch );
+        write += pitch;
+
+        ft_memcpy( write, read, pitch );
+        write += pitch;
+        read  += pitch;
+      }
+    }
+
+#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+    /*
+     * XXX: on 16bit system, we return an error for huge bitmap
+     * to prevent an overflow.
+     */
+    if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX )
+    {
+      error = FT_THROW( Invalid_Pixel_Size );
+      goto Exit;
+    }
+
+    slot->format      = FT_GLYPH_FORMAT_BITMAP;
+    slot->bitmap_left = (FT_Int)x_left;
+    slot->bitmap_top  = (FT_Int)y_top;
+
+    /* everything is fine; don't deallocate buffer */
+    have_buffer = FALSE;
+
+    error = FT_Err_Ok;
+
+  Exit:
+    if ( have_outline_shifted )
+      FT_Outline_Translate( outline, x_shift, y_shift );
+    if ( have_translated_origin )
+      FT_Outline_Translate( outline, -origin->x, -origin->y );
+    if ( have_buffer )
+    {
+      FT_FREE( bitmap->buffer );
+      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+    }
+
+    return error;
+  }
+
+
+  /* convert a slot's glyph image into a bitmap */
+  static FT_Error
+  ft_smooth_render( FT_Renderer       render,
+                    FT_GlyphSlot      slot,
+                    FT_Render_Mode    mode,
+                    const FT_Vector*  origin )
+  {
+    if ( mode == FT_RENDER_MODE_LIGHT )
+      mode = FT_RENDER_MODE_NORMAL;
+
+    return ft_smooth_render_generic( render, slot, mode, origin,
+                                     FT_RENDER_MODE_NORMAL );
+  }
+
+
+  /* convert a slot's glyph image into a horizontal LCD bitmap */
+  static FT_Error
+  ft_smooth_render_lcd( FT_Renderer       render,
+                        FT_GlyphSlot      slot,
+                        FT_Render_Mode    mode,
+                        const FT_Vector*  origin )
+  {
+    FT_Error  error;
+
+    error = ft_smooth_render_generic( render, slot, mode, origin,
+                                      FT_RENDER_MODE_LCD );
+    if ( !error )
+      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD;
+
+    return error;
+  }
+
+
+  /* convert a slot's glyph image into a vertical LCD bitmap */
+  static FT_Error
+  ft_smooth_render_lcd_v( FT_Renderer       render,
+                          FT_GlyphSlot      slot,
+                          FT_Render_Mode    mode,
+                          const FT_Vector*  origin )
+  {
+    FT_Error  error;
+
+    error = ft_smooth_render_generic( render, slot, mode, origin,
+                                      FT_RENDER_MODE_LCD_V );
+    if ( !error )
+      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V;
+
+    return error;
+  }
+
+
+  FT_DEFINE_RENDERER( ft_smooth_renderer_class,
+
+      FT_MODULE_RENDERER,
+      sizeof ( FT_RendererRec ),
+
+      "smooth",
+      0x10000L,
+      0x20000L,
+
+      0,    /* module specific interface */
+
+      (FT_Module_Constructor)ft_smooth_init,
+      (FT_Module_Destructor) 0,
+      (FT_Module_Requester)  0
+    ,
+
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    (FT_Renderer_RenderFunc)   ft_smooth_render,
+    (FT_Renderer_TransformFunc)ft_smooth_transform,
+    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
+    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
+
+    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
+  )
+
+
+  FT_DEFINE_RENDERER( ft_smooth_lcd_renderer_class,
+
+      FT_MODULE_RENDERER,
+      sizeof ( FT_RendererRec ),
+
+      "smooth-lcd",
+      0x10000L,
+      0x20000L,
+
+      0,    /* module specific interface */
+
+      (FT_Module_Constructor)ft_smooth_init,
+      (FT_Module_Destructor) 0,
+      (FT_Module_Requester)  0
+    ,
+
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd,
+    (FT_Renderer_TransformFunc)ft_smooth_transform,
+    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
+    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
+
+    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
+  )
+
+  FT_DEFINE_RENDERER( ft_smooth_lcdv_renderer_class,
+
+      FT_MODULE_RENDERER,
+      sizeof ( FT_RendererRec ),
+
+      "smooth-lcdv",
+      0x10000L,
+      0x20000L,
+
+      0,    /* module specific interface */
+
+      (FT_Module_Constructor)ft_smooth_init,
+      (FT_Module_Destructor) 0,
+      (FT_Module_Requester)  0
+    ,
+
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd_v,
+    (FT_Renderer_TransformFunc)ft_smooth_transform,
+    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
+    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
+
+    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
+  )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.h
new file mode 100644
index 0000000..775b82d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.h
@@ -0,0 +1,49 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsmooth.h                                                             */
+/*                                                                         */
+/*    Anti-aliasing renderer interface (specification).                    */
+/*                                                                         */
+/*  Copyright 1996-2001 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTSMOOTH_H__
+#define __FTSMOOTH_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftrender.h"
+
+
+FT_BEGIN_HEADER
+
+
+#ifndef FT_CONFIG_OPTION_NO_STD_RASTER
+  FT_DECLARE_RENDERER( ft_std_renderer_class )
+#endif
+
+#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER
+  FT_DECLARE_RENDERER( ft_smooth_renderer_class )
+
+  FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class )
+
+  FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class )
+#endif
+
+
+
+FT_END_HEADER
+
+#endif /* __FTSMOOTH_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.c
new file mode 100644
index 0000000..42b9373
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.c
@@ -0,0 +1,118 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftspic.c                                                               */
+/*                                                                         */
+/*    The FreeType position independent code services for smooth module.   */
+/*                                                                         */
+/*  Copyright 2009, 2010, 2012, 2013 by                                    */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "ftspic.h"
+#include "ftsmerrs.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from ftgrays.c */
+  void
+  FT_Init_Class_ft_grays_raster( FT_Raster_Funcs*  funcs );
+
+
+  void
+  ft_smooth_renderer_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory          memory        = library->memory;
+
+
+    if ( pic_container->smooth )
+    {
+      SmoothPIC*  container = (SmoothPIC*)pic_container->smooth;
+
+
+      if ( --container->ref_count )
+        return;
+
+      FT_FREE( container );
+      pic_container->smooth = NULL;
+    }
+  }
+
+
+  FT_Error
+  ft_smooth_renderer_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = FT_Err_Ok;
+    SmoothPIC*         container     = NULL;
+    FT_Memory          memory        = library->memory;
+
+
+    /* since this function also serve smooth_lcd and smooth_lcdv renderers,
+       it implements reference counting */
+    if ( pic_container->smooth )
+    {
+      ((SmoothPIC*)pic_container->smooth)->ref_count++;
+      return error;
+    }
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->smooth = container;
+
+    container->ref_count = 1;
+
+    /* initialize pointer table -                       */
+    /* this is how the module usually expects this data */
+    FT_Init_Class_ft_grays_raster( &container->ft_grays_raster );
+
+    return error;
+  }
+
+
+  /* re-route these init and free functions to the above functions */
+  FT_Error
+  ft_smooth_lcd_renderer_class_pic_init( FT_Library  library )
+  {
+    return ft_smooth_renderer_class_pic_init( library );
+  }
+
+
+  void
+  ft_smooth_lcd_renderer_class_pic_free( FT_Library  library )
+  {
+    ft_smooth_renderer_class_pic_free( library );
+  }
+
+
+  FT_Error
+  ft_smooth_lcdv_renderer_class_pic_init( FT_Library  library )
+  {
+    return ft_smooth_renderer_class_pic_init( library );
+  }
+
+
+  void
+  ft_smooth_lcdv_renderer_class_pic_free( FT_Library  library )
+  {
+    ft_smooth_renderer_class_pic_free( library );
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.h
new file mode 100644
index 0000000..5533967
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.h
@@ -0,0 +1,74 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftspic.h                                                               */
+/*                                                                         */
+/*    The FreeType position independent code services for smooth module.   */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTSPIC_H__
+#define __FTSPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_GRAYS_RASTER_GET  ft_grays_raster
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+  typedef struct  SmoothPIC_
+  {
+    int              ref_count;
+    FT_Raster_Funcs  ft_grays_raster;
+
+  } SmoothPIC;
+
+
+#define GET_PIC( lib ) \
+          ( (SmoothPIC*)( (lib)->pic_container.smooth ) )
+#define FT_GRAYS_RASTER_GET  ( GET_PIC( library )->ft_grays_raster )
+
+
+  /* see ftspic.c for the implementation */
+  void
+  ft_smooth_renderer_class_pic_free( FT_Library  library );
+
+  void
+  ft_smooth_lcd_renderer_class_pic_free( FT_Library  library );
+
+  void
+  ft_smooth_lcdv_renderer_class_pic_free( FT_Library  library );
+
+  FT_Error
+  ft_smooth_renderer_class_pic_init( FT_Library  library );
+
+  FT_Error
+  ft_smooth_lcd_renderer_class_pic_init( FT_Library  library );
+
+  FT_Error
+  ft_smooth_lcdv_renderer_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/fxft_smooth.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/fxft_smooth.c
new file mode 100644
index 0000000..ad047dd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/fxft_smooth.c
@@ -0,0 +1,31 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  smooth.c                                                               */
+/*                                                                         */
+/*    FreeType anti-aliasing rasterer module component (body only).        */
+/*                                                                         */
+/*  Copyright 1996-2001 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "ftspic.c"
+#include "ftgrays.c"
+#include "ftsmooth.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/module.mk
new file mode 100644
index 0000000..47f6c04
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/module.mk
@@ -0,0 +1,27 @@
+#
+# FreeType 2 smooth renderer module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += SMOOTH_RENDERER
+
+define SMOOTH_RENDERER
+$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)smooth    $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer$(ECHO_DRIVER_DONE)
+$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcd_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)smooth    $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for LCDs$(ECHO_DRIVER_DONE)
+$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcdv_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)smooth    $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for vertical LCDs$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/rules.mk
new file mode 100644
index 0000000..88d0aa5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/rules.mk
@@ -0,0 +1,70 @@
+#
+# FreeType 2 smooth renderer module build rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2011 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# smooth driver directory
+#
+SMOOTH_DIR := $(SRC_DIR)/smooth
+
+# compilation flags for the driver
+#
+SMOOTH_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SMOOTH_DIR))
+
+
+# smooth driver sources (i.e., C files)
+#
+SMOOTH_DRV_SRC := $(SMOOTH_DIR)/ftgrays.c  \
+                  $(SMOOTH_DIR)/ftsmooth.c \
+                  $(SMOOTH_DIR)/ftspic.c
+
+
+# smooth driver headers
+#
+SMOOTH_DRV_H := $(SMOOTH_DRV_SRC:%c=%h)  \
+                $(SMOOTH_DIR)/ftsmerrs.h
+
+
+# smooth driver object(s)
+#
+#   SMOOTH_DRV_OBJ_M is used during `multi' builds.
+#   SMOOTH_DRV_OBJ_S is used during `single' builds.
+#
+SMOOTH_DRV_OBJ_M := $(SMOOTH_DRV_SRC:$(SMOOTH_DIR)/%.c=$(OBJ_DIR)/%.$O)
+SMOOTH_DRV_OBJ_S := $(OBJ_DIR)/smooth.$O
+
+# smooth driver source file for single build
+#
+SMOOTH_DRV_SRC_S := $(SMOOTH_DIR)/smooth.c
+
+
+# smooth driver - single object
+#
+$(SMOOTH_DRV_OBJ_S): $(SMOOTH_DRV_SRC_S) $(SMOOTH_DRV_SRC) \
+                     $(FREETYPE_H) $(SMOOTH_DRV_H)
+	$(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SMOOTH_DRV_SRC_S))
+
+
+# smooth driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(SMOOTH_DIR)/%.c $(FREETYPE_H) $(SMOOTH_DRV_H)
+	$(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(SMOOTH_DRV_OBJ_S)
+DRV_OBJS_M += $(SMOOTH_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/Jamfile
new file mode 100644
index 0000000..a8cccfe
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/truetype Jamfile
+#
+# Copyright 2001, 2004 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) truetype ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = ttdriver ttobjs ttpload ttgload ttinterp ttgxvar ttpic ;
+  }
+  else
+  {
+    _sources = truetype ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/truetype Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/fxft_truetype.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/fxft_truetype.c
new file mode 100644
index 0000000..5c793a4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/fxft_truetype.c
@@ -0,0 +1,42 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  truetype.c                                                             */
+/*                                                                         */
+/*    FreeType TrueType driver component (body only).                      */
+/*                                                                         */
+/*  Copyright 1996-2001, 2004, 2006, 2012 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "ttpic.c"
+#include "ttdriver.c"   /* driver interface    */
+#include "ttpload.c"    /* tables loader       */
+#include "ttgload.c"    /* glyph loader        */
+#include "ttobjs.c"     /* object manager      */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#include "ttinterp.c"
+#include "ttsubpix.c"
+#endif
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.c"    /* gx distortable font */
+#endif
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/module.mk
new file mode 100644
index 0000000..baee81a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 TrueType module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += TRUETYPE_DRIVER
+
+define TRUETYPE_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, tt_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)truetype  $(ECHO_DRIVER_DESC)Windows/Mac font files with extension *.ttf or *.ttc$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/rules.mk
new file mode 100644
index 0000000..d4b69f5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/rules.mk
@@ -0,0 +1,74 @@
+#
+# FreeType 2 TrueType driver configuration rules
+#
+
+
+# Copyright 1996-2001, 2003-2004, 2011-2012 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# TrueType driver directory
+#
+TT_DIR := $(SRC_DIR)/truetype
+
+
+# compilation flags for the driver
+#
+TT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(TT_DIR))
+
+
+# TrueType driver sources (i.e., C files)
+#
+TT_DRV_SRC := $(TT_DIR)/ttdriver.c \
+              $(TT_DIR)/ttgload.c  \
+              $(TT_DIR)/ttgxvar.c  \
+              $(TT_DIR)/ttinterp.c \
+              $(TT_DIR)/ttobjs.c   \
+              $(TT_DIR)/ttpic.c    \
+              $(TT_DIR)/ttpload.c  \
+              $(TT_DIR)/ttsubpix.c
+
+# TrueType driver headers
+#
+TT_DRV_H := $(TT_DRV_SRC:%.c=%.h) \
+            $(TT_DIR)/tterrors.h
+
+
+# TrueType driver object(s)
+#
+#   TT_DRV_OBJ_M is used during `multi' builds
+#   TT_DRV_OBJ_S is used during `single' builds
+#
+TT_DRV_OBJ_M := $(TT_DRV_SRC:$(TT_DIR)/%.c=$(OBJ_DIR)/%.$O)
+TT_DRV_OBJ_S := $(OBJ_DIR)/truetype.$O
+
+# TrueType driver source file for single build
+#
+TT_DRV_SRC_S := $(TT_DIR)/truetype.c
+
+
+# TrueType driver - single object
+#
+$(TT_DRV_OBJ_S): $(TT_DRV_SRC_S) $(TT_DRV_SRC) $(FREETYPE_H) $(TT_DRV_H)
+	$(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(TT_DRV_SRC_S))
+
+
+# driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(TT_DIR)/%.c $(FREETYPE_H) $(TT_DRV_H)
+	$(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(TT_DRV_OBJ_S)
+DRV_OBJS_M += $(TT_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.c
new file mode 100644
index 0000000..4576ad9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.c
@@ -0,0 +1,572 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttdriver.c                                                             */
+/*                                                                         */
+/*    TrueType font driver implementation (body).                          */
+/*                                                                         */
+/*  Copyright 1996-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/services/svxf86nm.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/services/svmm.h"
+#endif
+
+#include "../../include/freetype/internal/services/svtteng.h"
+#include "../../include/freetype/internal/services/svttglyf.h"
+#include "../../include/freetype/internal/services/svprop.h"
+#include "../../include/freetype/ftttdrv.h"
+
+#include "ttdriver.h"
+#include "ttgload.h"
+#include "ttpload.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+#include "tterrors.h"
+
+#include "ttpic.h"
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttdriver
+
+
+  /*
+   *  PROPERTY SERVICE
+   *
+   */
+  static FT_Error
+  tt_property_set( FT_Module    module,         /* TT_Driver */
+                   const char*  property_name,
+                   const void*  value )
+  {
+    FT_Error   error  = FT_Err_Ok;
+    TT_Driver  driver = (TT_Driver)module;
+
+
+    if ( !ft_strcmp( property_name, "interpreter-version" ) )
+    {
+      FT_UInt*  interpreter_version = (FT_UInt*)value;
+
+
+#ifndef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+      if ( *interpreter_version != TT_INTERPRETER_VERSION_35 )
+        error = FT_ERR( Unimplemented_Feature );
+      else
+#endif
+        driver->interpreter_version = *interpreter_version;
+
+      return error;
+    }
+
+    FT_TRACE0(( "tt_property_set: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  static FT_Error
+  tt_property_get( FT_Module    module,         /* TT_Driver */
+                   const char*  property_name,
+                   const void*  value )
+  {
+    FT_Error   error  = FT_Err_Ok;
+    TT_Driver  driver = (TT_Driver)module;
+
+    FT_UInt  interpreter_version = driver->interpreter_version;
+
+
+    if ( !ft_strcmp( property_name, "interpreter-version" ) )
+    {
+      FT_UInt*  val = (FT_UInt*)value;
+
+
+      *val = interpreter_version;
+
+      return error;
+    }
+
+    FT_TRACE0(( "tt_property_get: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  FT_DEFINE_SERVICE_PROPERTIESREC(
+    tt_service_properties,
+    (FT_Properties_SetFunc)tt_property_set,
+    (FT_Properties_GetFunc)tt_property_get )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                          F A C E S                              ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#undef  PAIR_TAG
+#define PAIR_TAG( left, right )  ( ( (FT_ULong)left << 16 ) | \
+                                     (FT_ULong)right        )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_get_kerning                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A driver method used to return the kerning vector between two      */
+  /*    glyphs of the same face.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to the source face object.                 */
+  /*                                                                       */
+  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
+  /*                                                                       */
+  /*    right_glyph :: The index of the right glyph in the kern pair.      */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    kerning     :: The kerning vector.  This is in font units for      */
+  /*                   scalable formats, and in pixels for fixed-sizes     */
+  /*                   formats.                                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
+  /*    supported by this function.  Other layouts, or more sophisticated  */
+  /*    kernings, are out of scope of this method (the basic driver        */
+  /*    interface is meant to be simple).                                  */
+  /*                                                                       */
+  /*    They can be implemented by format-specific interfaces.             */
+  /*                                                                       */
+  static FT_Error
+  tt_get_kerning( FT_Face     ttface,          /* TT_Face */
+                  FT_UInt     left_glyph,
+                  FT_UInt     right_glyph,
+                  FT_Vector*  kerning )
+  {
+    TT_Face       face = (TT_Face)ttface;
+    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
+
+
+    kerning->x = 0;
+    kerning->y = 0;
+
+    if ( sfnt )
+      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
+
+    return 0;
+  }
+
+
+#undef PAIR_TAG
+
+
+  static FT_Error
+  tt_get_advances( FT_Face    ttface,
+                   FT_UInt    start,
+                   FT_UInt    count,
+                   FT_Int32   flags,
+                   FT_Fixed  *advances )
+  {
+    FT_UInt  nn;
+    TT_Face  face  = (TT_Face) ttface;
+
+
+    /* XXX: TODO: check for sbits */
+
+    if ( flags & FT_LOAD_VERTICAL_LAYOUT )
+    {
+      for ( nn = 0; nn < count; nn++ )
+      {
+        FT_Short   tsb;
+        FT_UShort  ah;
+
+
+        TT_Get_VMetrics( face, start + nn, &tsb, &ah );
+        advances[nn] = ah;
+      }
+    }
+    else
+    {
+      for ( nn = 0; nn < count; nn++ )
+      {
+        FT_Short   lsb;
+        FT_UShort  aw;
+
+
+        TT_Get_HMetrics( face, start + nn, &lsb, &aw );
+        advances[nn] = aw;
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                           S I Z E S                             ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+  static FT_Error
+  tt_size_select( FT_Size   size,
+                  FT_ULong  strike_index )
+  {
+    TT_Face   ttface = (TT_Face)size->face;
+    TT_Size   ttsize = (TT_Size)size;
+    FT_Error  error  = FT_Err_Ok;
+
+
+    ttsize->strike_index = strike_index;
+
+    if ( FT_IS_SCALABLE( size->face ) )
+    {
+      /* use the scaled metrics, even when tt_size_reset fails */
+      FT_Select_Metrics( size->face, strike_index );
+
+      tt_size_reset( ttsize );
+    }
+    else
+    {
+      SFNT_Service      sfnt    = (SFNT_Service) ttface->sfnt;
+      FT_Size_Metrics*  metrics = &size->metrics;
+
+
+      error = sfnt->load_strike_metrics( ttface, strike_index, metrics );
+      if ( error )
+        ttsize->strike_index = 0xFFFFFFFFUL;
+    }
+
+    return error;
+  }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+  static FT_Error
+  tt_size_request( FT_Size          size,
+                   FT_Size_Request  req )
+  {
+    TT_Size   ttsize = (TT_Size)size;
+    FT_Error  error  = FT_Err_Ok;
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+    if ( FT_HAS_FIXED_SIZES( size->face ) )
+    {
+      TT_Face       ttface = (TT_Face)size->face;
+      SFNT_Service  sfnt   = (SFNT_Service) ttface->sfnt;
+      FT_ULong      strike_index;
+
+
+      error = sfnt->set_sbit_strike( ttface, req, &strike_index );
+
+      if ( error )
+        ttsize->strike_index = 0xFFFFFFFFUL;
+      else
+        return tt_size_select( size, strike_index );
+    }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+    FT_Request_Metrics( size->face, req );
+
+    if ( FT_IS_SCALABLE( size->face ) )
+    {
+      error = tt_size_reset( ttsize );
+      ttsize->root.metrics = ttsize->metrics;
+    }
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_glyph_load                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A driver method used to load a glyph within a given glyph slot.    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot        :: A handle to the target slot object where the glyph  */
+  /*                   will be loaded.                                     */
+  /*                                                                       */
+  /*    size        :: A handle to the source face size at which the glyph */
+  /*                   must be scaled, loaded, etc.                        */
+  /*                                                                       */
+  /*    glyph_index :: The index of the glyph in the font file.            */
+  /*                                                                       */
+  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
+  /*                   FT_LOAD_XXX constants can be used to control the    */
+  /*                   glyph loading process (e.g., whether the outline    */
+  /*                   should be scaled, whether to load bitmaps or not,   */
+  /*                   whether to hint the outline, etc).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  tt_glyph_load( FT_GlyphSlot  ttslot,      /* TT_GlyphSlot */
+                 FT_Size       ttsize,      /* TT_Size      */
+                 FT_UInt       glyph_index,
+                 FT_Int32      load_flags )
+  {
+    TT_GlyphSlot  slot = (TT_GlyphSlot)ttslot;
+    TT_Size       size = (TT_Size)ttsize;
+    FT_Face       face = ttslot->face;
+    FT_Error      error;
+
+
+    if ( !slot )
+      return FT_THROW( Invalid_Slot_Handle );
+
+    if ( !size )
+      return FT_THROW( Invalid_Size_Handle );
+
+    if ( !face )
+      return FT_THROW( Invalid_Argument );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( glyph_index >= (FT_UInt)face->num_glyphs &&
+         !face->internal->incremental_interface   )
+#else
+    if ( glyph_index >= (FT_UInt)face->num_glyphs )
+#endif
+      return FT_THROW( Invalid_Argument );
+
+    if ( load_flags & FT_LOAD_NO_HINTING )
+    {
+      /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT   */
+      /* are necessary to disable hinting for tricky fonts */
+
+      if ( FT_IS_TRICKY( face ) )
+        load_flags &= ~FT_LOAD_NO_HINTING;
+
+      if ( load_flags & FT_LOAD_NO_AUTOHINT )
+        load_flags |= FT_LOAD_NO_HINTING;
+    }
+
+    if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) )
+    {
+      load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE;
+
+      if ( !FT_IS_TRICKY( face ) )
+        load_flags |= FT_LOAD_NO_HINTING;
+    }
+
+    /* now load the glyph outline if necessary */
+    error = TT_Load_Glyph( size, slot, glyph_index, load_flags );
+
+    /* force drop-out mode to 2 - irrelevant now */
+    /* slot->outline.dropout_mode = 2; */
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                D R I V E R  I N T E R F A C E                   ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+  FT_DEFINE_SERVICE_MULTIMASTERSREC(
+    tt_service_gx_multi_masters,
+    (FT_Get_MM_Func)        NULL,
+    (FT_Set_MM_Design_Func) NULL,
+    (FT_Set_MM_Blend_Func)  TT_Set_MM_Blend,
+    (FT_Get_MM_Var_Func)    TT_Get_MM_Var,
+    (FT_Set_Var_Design_Func)TT_Set_Var_Design )
+#endif
+
+  static const FT_Service_TrueTypeEngineRec  tt_service_truetype_engine =
+  {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED
+#else
+    FT_TRUETYPE_ENGINE_TYPE_PATENTED
+#endif
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+    FT_TRUETYPE_ENGINE_TYPE_NONE
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+  };
+
+  FT_DEFINE_SERVICE_TTGLYFREC(
+    tt_service_truetype_glyf,
+    (TT_Glyf_GetLocationFunc)tt_face_get_location )
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+  FT_DEFINE_SERVICEDESCREC5(
+    tt_services,
+    FT_SERVICE_ID_XF86_NAME,       FT_XF86_FORMAT_TRUETYPE,
+    FT_SERVICE_ID_MULTI_MASTERS,   &TT_SERVICE_GX_MULTI_MASTERS_GET,
+    FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
+    FT_SERVICE_ID_TT_GLYF,         &TT_SERVICE_TRUETYPE_GLYF_GET,
+    FT_SERVICE_ID_PROPERTIES,      &TT_SERVICE_PROPERTIES_GET )
+#else
+  FT_DEFINE_SERVICEDESCREC4(
+    tt_services,
+    FT_SERVICE_ID_XF86_NAME,       FT_XF86_FORMAT_TRUETYPE,
+    FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
+    FT_SERVICE_ID_TT_GLYF,         &TT_SERVICE_TRUETYPE_GLYF_GET,
+    FT_SERVICE_ID_PROPERTIES,      &TT_SERVICE_PROPERTIES_GET )
+#endif
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  tt_get_interface( FT_Module    driver,    /* TT_Driver */
+                    const char*  tt_interface )
+  {
+    FT_Library           library;
+    FT_Module_Interface  result;
+    FT_Module            sfntd;
+    SFNT_Service         sfnt;
+
+
+    /* TT_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+    if ( !driver )
+      return NULL;
+    library = driver->library;
+    if ( !library )
+      return NULL;
+#endif
+
+    result = ft_service_list_lookup( TT_SERVICES_GET, tt_interface );
+    if ( result != NULL )
+      return result;
+
+#ifndef FT_CONFIG_OPTION_PIC
+    if ( !driver )
+      return NULL;
+    library = driver->library;
+    if ( !library )
+      return NULL;
+#endif
+
+    /* only return the default interface from the SFNT module */
+    sfntd = FT_Get_Module( library, "sfnt" );
+    if ( sfntd )
+    {
+      sfnt = (SFNT_Service)( sfntd->clazz->module_interface );
+      if ( sfnt )
+        return sfnt->get_interface( driver, tt_interface );
+    }
+
+    return 0;
+  }
+
+
+  /* The FT_DriverInterface structure is defined in ftdriver.h. */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#define TT_HINTER_FLAG  FT_MODULE_DRIVER_HAS_HINTER
+#else
+#define TT_HINTER_FLAG  0
+#endif
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#define TT_SIZE_SELECT  tt_size_select
+#else
+#define TT_SIZE_SELECT  0
+#endif
+
+  FT_DEFINE_DRIVER(
+    tt_driver_class,
+
+      FT_MODULE_FONT_DRIVER     |
+      FT_MODULE_DRIVER_SCALABLE |
+      TT_HINTER_FLAG,
+
+      sizeof ( TT_DriverRec ),
+
+      "truetype_xyq",      /* driver name                           */
+      0x10000L,        /* driver version == 1.0                 */
+      0x20000L,        /* driver requires FreeType 2.0 or above */
+
+      (void*)0,        /* driver specific interface */
+
+      tt_driver_init,
+      tt_driver_done,
+      tt_get_interface,
+
+    sizeof ( TT_FaceRec ),
+    sizeof ( TT_SizeRec ),
+    sizeof ( FT_GlyphSlotRec ),
+
+    tt_face_init,
+    tt_face_done,
+    tt_size_init,
+    tt_size_done,
+    tt_slot_init,
+    0,                       /* FT_Slot_DoneFunc */
+
+    tt_glyph_load,
+
+    tt_get_kerning,
+    0,                       /* FT_Face_AttachFunc */
+    tt_get_advances,
+
+    tt_size_request,
+    TT_SIZE_SELECT
+  )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.h
new file mode 100644
index 0000000..80802c1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.h
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttdriver.h                                                             */
+/*                                                                         */
+/*    High-level TrueType driver interface (specification).                */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTDRIVER_H__
+#define __TTDRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdriver.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_DECLARE_DRIVER( tt_driver_class )
+
+
+FT_END_HEADER
+
+#endif /* __TTDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/tterrors.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/tterrors.h
new file mode 100644
index 0000000..b6aaa9f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/tterrors.h
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  tterrors.h                                                             */
+/*                                                                         */
+/*    TrueType error codes (specification only).                           */
+/*                                                                         */
+/*  Copyright 2001, 2012 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the TrueType error enumeration            */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __TTERRORS_H__
+#define __TTERRORS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  TT_Err_
+#define FT_ERR_BASE    FT_Mod_Err_TrueType
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __TTERRORS_H__ */
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.c
new file mode 100644
index 0000000..c32419b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.c
@@ -0,0 +1,2337 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttgload.c                                                              */
+/*                                                                         */
+/*    TrueType Glyph Loader (body).                                        */
+/*                                                                         */
+/*  Copyright 1996-2013                                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftttdrv.h"
+
+
+#include "ttgload.h"
+#include "ttpload.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+#include "tterrors.h"
+#include "ttsubpix.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttgload
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Composite glyph flags.                                                */
+  /*                                                                       */
+#define ARGS_ARE_WORDS             0x0001
+#define ARGS_ARE_XY_VALUES         0x0002
+#define ROUND_XY_TO_GRID           0x0004
+#define WE_HAVE_A_SCALE            0x0008
+/* reserved                        0x0010 */
+#define MORE_COMPONENTS            0x0020
+#define WE_HAVE_AN_XY_SCALE        0x0040
+#define WE_HAVE_A_2X2              0x0080
+#define WE_HAVE_INSTR              0x0100
+#define USE_MY_METRICS             0x0200
+#define OVERLAP_COMPOUND           0x0400
+#define SCALED_COMPONENT_OFFSET    0x0800
+#define UNSCALED_COMPONENT_OFFSET  0x1000
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Return the horizontal metrics in font units for a given glyph.        */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  TT_Get_HMetrics( TT_Face     face,
+                   FT_UInt     idx,
+                   FT_Short*   lsb,
+                   FT_UShort*  aw )
+  {
+    ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw );
+
+    FT_TRACE5(( "  advance width (font units): %d\n", *aw ));
+    FT_TRACE5(( "  left side bearing (font units): %d\n", *lsb ));
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Return the vertical metrics in font units for a given glyph.          */
+  /* Greg Hitchcock from Microsoft told us that if there were no `vmtx'    */
+  /* table, typoAscender/Descender from the `OS/2' table would be used     */
+  /* instead, and if there were no `OS/2' table, use ascender/descender    */
+  /* from the `hhea' table.  But that is not what Microsoft's rasterizer   */
+  /* apparently does: It uses the ppem value as the advance height, and    */
+  /* sets the top side bearing to be zero.                                 */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  TT_Get_VMetrics( TT_Face     face,
+                   FT_UInt     idx,
+                   FT_Short*   tsb,
+                   FT_UShort*  ah )
+  {
+    if ( face->vertical_info )
+      ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah );
+
+#if 1             /* Empirically determined, at variance with what MS said */
+
+    else
+    {
+      *tsb = 0;
+      *ah  = face->root.units_per_EM;
+    }
+
+#else      /* This is what MS said to do.  It isn't what they do, however. */
+
+    else if ( face->os2.version != 0xFFFFU )
+    {
+      *tsb = face->os2.sTypoAscender;
+      *ah  = face->os2.sTypoAscender - face->os2.sTypoDescender;
+    }
+    else
+    {
+      *tsb = face->horizontal.Ascender;
+      *ah  = face->horizontal.Ascender - face->horizontal.Descender;
+    }
+
+#endif
+
+    FT_TRACE5(( "  advance height (font units): %d\n", *ah ));
+    FT_TRACE5(( "  top side bearing (font units): %d\n", *tsb ));
+  }
+
+
+  static void
+  tt_get_metrics( TT_Loader  loader,
+                  FT_UInt    glyph_index )
+  {
+    TT_Face    face   = (TT_Face)loader->face;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
+#endif
+
+    FT_Short   left_bearing = 0, top_bearing = 0;
+    FT_UShort  advance_width = 0, advance_height = 0;
+
+
+    TT_Get_HMetrics( face, glyph_index,
+                     &left_bearing,
+                     &advance_width );
+    TT_Get_VMetrics( face, glyph_index,
+                     &top_bearing,
+                     &advance_height );
+
+    loader->left_bearing = left_bearing;
+    loader->advance      = advance_width;
+    loader->top_bearing  = top_bearing;
+    loader->vadvance     = advance_height;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+    {
+      if ( loader->exec )
+        loader->exec->sph_tweak_flags = 0;
+
+      /* this may not be the right place for this, but it works */
+      if ( loader->exec && loader->exec->ignore_x_mode )
+        sph_set_tweaks( loader, glyph_index );
+    }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    if ( !loader->linear_def )
+    {
+      loader->linear_def = 1;
+      loader->linear     = advance_width;
+    }
+  }
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+  static void
+  tt_get_metrics_incr_overrides( TT_Loader  loader,
+                                 FT_UInt    glyph_index )
+  {
+    TT_Face  face = (TT_Face)loader->face;
+
+    FT_Short   left_bearing = 0, top_bearing = 0;
+    FT_UShort  advance_width = 0, advance_height = 0;
+
+
+    /* If this is an incrementally loaded font check whether there are */
+    /* overriding metrics for this glyph.                              */
+    if ( face->root.internal->incremental_interface                           &&
+         face->root.internal->incremental_interface->funcs->get_glyph_metrics )
+    {
+      FT_Incremental_MetricsRec  metrics;
+      FT_Error                   error;
+
+
+      metrics.bearing_x = loader->left_bearing;
+      metrics.bearing_y = 0;
+      metrics.advance   = loader->advance;
+      metrics.advance_v = 0;
+
+      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+                face->root.internal->incremental_interface->object,
+                glyph_index, FALSE, &metrics );
+      if ( error )
+        goto Exit;
+
+      left_bearing  = (FT_Short)metrics.bearing_x;
+      advance_width = (FT_UShort)metrics.advance;
+
+#if 0
+
+      /* GWW: Do I do the same for vertical metrics? */
+      metrics.bearing_x = 0;
+      metrics.bearing_y = loader->top_bearing;
+      metrics.advance   = loader->vadvance;
+
+      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+                face->root.internal->incremental_interface->object,
+                glyph_index, TRUE, &metrics );
+      if ( error )
+        goto Exit;
+
+      top_bearing    = (FT_Short)metrics.bearing_y;
+      advance_height = (FT_UShort)metrics.advance;
+
+#endif /* 0 */
+
+      loader->left_bearing = left_bearing;
+      loader->advance      = advance_width;
+      loader->top_bearing  = top_bearing;
+      loader->vadvance     = advance_height;
+
+      if ( !loader->linear_def )
+      {
+        loader->linear_def = 1;
+        loader->linear     = advance_width;
+      }
+    }
+
+  Exit:
+    return;
+  }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Translates an array of coordinates.                                   */
+  /*                                                                       */
+  static void
+  translate_array( FT_UInt     n,
+                   FT_Vector*  coords,
+                   FT_Pos      delta_x,
+                   FT_Pos      delta_y )
+  {
+    FT_UInt  k;
+
+
+    if ( delta_x )
+      for ( k = 0; k < n; k++ )
+        coords[k].x += delta_x;
+
+    if ( delta_y )
+      for ( k = 0; k < n; k++ )
+        coords[k].y += delta_y;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The following functions are used by default with TrueType fonts.      */
+  /* However, they can be replaced by alternatives if we need to support   */
+  /* TrueType-compressed formats (like MicroType) in the future.           */
+  /*                                                                       */
+  /*************************************************************************/
+
+  FT_CALLBACK_DEF( FT_Error )
+  TT_Access_Glyph_Frame( TT_Loader  loader,
+                         FT_UInt    glyph_index,
+                         FT_ULong   offset,
+                         FT_UInt    byte_count )
+  {
+    FT_Error   error;
+    FT_Stream  stream = loader->stream;
+
+    /* for non-debug mode */
+    FT_UNUSED( glyph_index );
+
+
+    FT_TRACE4(( "Glyph %ld\n", glyph_index ));
+
+    /* the following line sets the `error' variable through macros! */
+    if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) )
+      return error;
+
+    loader->cursor = stream->cursor;
+    loader->limit  = stream->limit;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  TT_Forget_Glyph_Frame( TT_Loader  loader )
+  {
+    FT_Stream  stream = loader->stream;
+
+
+    FT_FRAME_EXIT();
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  TT_Load_Glyph_Header( TT_Loader  loader )
+  {
+    FT_Byte*  p     = loader->cursor;
+    FT_Byte*  limit = loader->limit;
+
+
+    if ( p + 10 > limit )
+      return FT_THROW( Invalid_Outline );
+
+    loader->n_contours = FT_NEXT_SHORT( p );
+
+    loader->bbox.xMin = FT_NEXT_SHORT( p );
+    loader->bbox.yMin = FT_NEXT_SHORT( p );
+    loader->bbox.xMax = FT_NEXT_SHORT( p );
+    loader->bbox.yMax = FT_NEXT_SHORT( p );
+
+    FT_TRACE5(( "  # of contours: %d\n", loader->n_contours ));
+    FT_TRACE5(( "  xMin: %4d  xMax: %4d\n", loader->bbox.xMin,
+                                            loader->bbox.xMax ));
+    FT_TRACE5(( "  yMin: %4d  yMax: %4d\n", loader->bbox.yMin,
+                                            loader->bbox.yMax ));
+    loader->cursor = p;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  TT_Load_Simple_Glyph( TT_Loader  load )
+  {
+    FT_Error        error;
+    FT_Byte*        p          = load->cursor;
+    FT_Byte*        limit      = load->limit;
+    FT_GlyphLoader  gloader    = load->gloader;
+    FT_Int          n_contours = load->n_contours;
+    FT_Outline*     outline;
+    TT_Face         face       = (TT_Face)load->face;
+    FT_UShort       n_ins;
+    FT_Int          n_points;
+
+    FT_Byte         *flag, *flag_limit;
+    FT_Byte         c, count;
+    FT_Vector       *vec, *vec_limit;
+    FT_Pos          x;
+    FT_Short        *cont, *cont_limit, prev_cont;
+    FT_Int          xy_size = 0;
+
+
+    /* check that we can add the contours to the glyph */
+    error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours );
+    if ( error )
+      goto Fail;
+
+    /* reading the contours' endpoints & number of points */
+    cont       = gloader->current.outline.contours;
+    cont_limit = cont + n_contours;
+
+    /* check space for contours array + instructions count */
+    if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit )
+      goto Invalid_Outline;
+
+    prev_cont = FT_NEXT_SHORT( p );
+
+    if ( n_contours > 0 )
+      cont[0] = prev_cont;
+
+    if ( prev_cont < 0 )
+      goto Invalid_Outline;
+
+    for ( cont++; cont < cont_limit; cont++ )
+    {
+      cont[0] = FT_NEXT_SHORT( p );
+      if ( cont[0] <= prev_cont )
+      {
+        /* unordered contours: this is invalid */
+        goto Invalid_Outline;
+      }
+      prev_cont = cont[0];
+    }
+
+    n_points = 0;
+    if ( n_contours > 0 )
+    {
+      n_points = cont[-1] + 1;
+      if ( n_points < 0 )
+        goto Invalid_Outline;
+    }
+
+    /* note that we will add four phantom points later */
+    error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 );
+    if ( error )
+      goto Fail;
+
+    /* reading the bytecode instructions */
+    load->glyph->control_len  = 0;
+    load->glyph->control_data = 0;
+
+    if ( p + 2 > limit )
+      goto Invalid_Outline;
+
+    n_ins = FT_NEXT_USHORT( p );
+
+    FT_TRACE5(( "  Instructions size: %u\n", n_ins ));
+
+    if ( n_ins > face->max_profile.maxSizeOfInstructions )
+    {
+      FT_TRACE0(( "TT_Load_Simple_Glyph: too many instructions (%d)\n",
+                  n_ins ));
+      error = FT_THROW( Too_Many_Hints );
+      goto Fail;
+    }
+
+    if ( ( limit - p ) < n_ins )
+    {
+      FT_TRACE0(( "TT_Load_Simple_Glyph: instruction count mismatch\n" ));
+      error = FT_THROW( Too_Many_Hints );
+      goto Fail;
+    }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    if ( IS_HINTED( load->load_flags ) )
+    {
+      load->glyph->control_len  = n_ins;
+      load->glyph->control_data = load->exec->glyphIns;
+
+      FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins );
+    }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+    p += n_ins;
+
+    outline = &gloader->current.outline;
+	if (outline->tags == NULL) {
+		FT_TRACE0(( "TT_Load_Simple_Glyph: Outline->tags = NULL!\n" ));
+		goto Invalid_Outline;
+	}
+
+    /* reading the point tags */
+    flag       = (FT_Byte*)outline->tags;
+    flag_limit = flag + n_points;
+
+    //FT_ASSERT( flag != NULL );
+
+    while ( flag < flag_limit )
+    {
+      if ( p + 1 > limit )
+        goto Invalid_Outline;
+
+      *flag++ = c = FT_NEXT_BYTE( p );
+      if ( c & 8 )
+      {
+        if ( p + 1 > limit )
+          goto Invalid_Outline;
+
+        count = FT_NEXT_BYTE( p );
+        if ( flag + (FT_Int)count > flag_limit )
+          goto Invalid_Outline;
+
+        for ( ; count > 0; count-- )
+          *flag++ = c;
+      }
+    }
+
+    /* reading the X coordinates */
+
+    vec       = outline->points;
+    vec_limit = vec + n_points;
+    flag      = (FT_Byte*)outline->tags;
+    x         = 0;
+
+    if ( p + xy_size > limit )
+      goto Invalid_Outline;
+
+    for ( ; vec < vec_limit; vec++, flag++ )
+    {
+      FT_Pos   y = 0;
+      FT_Byte  f = *flag;
+
+
+      if ( f & 2 )
+      {
+        if ( p + 1 > limit )
+          goto Invalid_Outline;
+
+        y = (FT_Pos)FT_NEXT_BYTE( p );
+        if ( ( f & 16 ) == 0 )
+          y = -y;
+      }
+      else if ( ( f & 16 ) == 0 )
+      {
+        if ( p + 2 > limit )
+          goto Invalid_Outline;
+
+        y = (FT_Pos)FT_NEXT_SHORT( p );
+      }
+
+      x     += y;
+      vec->x = x;
+      /* the cast is for stupid compilers */
+      *flag  = (FT_Byte)( f & ~( 2 | 16 ) );
+    }
+
+    /* reading the Y coordinates */
+
+    vec       = gloader->current.outline.points;
+    vec_limit = vec + n_points;
+    flag      = (FT_Byte*)outline->tags;
+    x         = 0;
+
+    for ( ; vec < vec_limit; vec++, flag++ )
+    {
+      FT_Pos   y = 0;
+      FT_Byte  f = *flag;
+
+
+      if ( f & 4 )
+      {
+        if ( p + 1 > limit )
+          goto Invalid_Outline;
+
+        y = (FT_Pos)FT_NEXT_BYTE( p );
+        if ( ( f & 32 ) == 0 )
+          y = -y;
+      }
+      else if ( ( f & 32 ) == 0 )
+      {
+        if ( p + 2 > limit )
+          goto Invalid_Outline;
+
+        y = (FT_Pos)FT_NEXT_SHORT( p );
+      }
+
+      x     += y;
+      vec->y = x;
+      /* the cast is for stupid compilers */
+      *flag  = (FT_Byte)( f & FT_CURVE_TAG_ON );
+    }
+
+    outline->n_points   = (FT_UShort)n_points;
+    outline->n_contours = (FT_Short) n_contours;
+
+    load->cursor = p;
+
+  Fail:
+    return error;
+
+  Invalid_Outline:
+    error = FT_THROW( Invalid_Outline );
+    goto Fail;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  TT_Load_Composite_Glyph( TT_Loader  loader )
+  {
+    FT_Error        error;
+    FT_Byte*        p       = loader->cursor;
+    FT_Byte*        limit   = loader->limit;
+    FT_GlyphLoader  gloader = loader->gloader;
+    FT_SubGlyph     subglyph;
+    FT_UInt         num_subglyphs;
+
+
+    num_subglyphs = 0;
+
+    do
+    {
+      FT_Fixed  xx, xy, yy, yx;
+      FT_UInt   count;
+
+
+      /* check that we can load a new subglyph */
+      error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 );
+      if ( error )
+        goto Fail;
+
+      /* check space */
+      if ( p + 4 > limit )
+        goto Invalid_Composite;
+
+      subglyph = gloader->current.subglyphs + num_subglyphs;
+
+      subglyph->arg1 = subglyph->arg2 = 0;
+
+      subglyph->flags = FT_NEXT_USHORT( p );
+      subglyph->index = FT_NEXT_USHORT( p );
+
+      /* check space */
+      count = 2;
+      if ( subglyph->flags & ARGS_ARE_WORDS )
+        count += 2;
+      if ( subglyph->flags & WE_HAVE_A_SCALE )
+        count += 2;
+      else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
+        count += 4;
+      else if ( subglyph->flags & WE_HAVE_A_2X2 )
+        count += 8;
+
+      if ( p + count > limit )
+        goto Invalid_Composite;
+
+      /* read arguments */
+      if ( subglyph->flags & ARGS_ARE_WORDS )
+      {
+        subglyph->arg1 = FT_NEXT_SHORT( p );
+        subglyph->arg2 = FT_NEXT_SHORT( p );
+      }
+      else
+      {
+        subglyph->arg1 = FT_NEXT_CHAR( p );
+        subglyph->arg2 = FT_NEXT_CHAR( p );
+      }
+
+      /* read transform */
+      xx = yy = 0x10000L;
+      xy = yx = 0;
+
+      if ( subglyph->flags & WE_HAVE_A_SCALE )
+      {
+        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        yy = xx;
+      }
+      else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
+      {
+        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+      }
+      else if ( subglyph->flags & WE_HAVE_A_2X2 )
+      {
+        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        yx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        xy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+      }
+
+      subglyph->transform.xx = xx;
+      subglyph->transform.xy = xy;
+      subglyph->transform.yx = yx;
+      subglyph->transform.yy = yy;
+
+      num_subglyphs++;
+
+    } while ( subglyph->flags & MORE_COMPONENTS );
+
+    gloader->current.num_subglyphs = num_subglyphs;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    {
+      FT_Stream  stream = loader->stream;
+
+
+      /* we must undo the FT_FRAME_ENTER in order to point */
+      /* to the composite instructions, if we find some.   */
+      /* We will process them later.                       */
+      /*                                                   */
+      loader->ins_pos = (FT_ULong)( FT_STREAM_POS() +
+                                    p - limit );
+    }
+
+#endif
+
+    loader->cursor = p;
+
+  Fail:
+    return error;
+
+  Invalid_Composite:
+    error = FT_THROW( Invalid_Composite );
+    goto Fail;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  TT_Init_Glyph_Loading( TT_Face  face )
+  {
+    face->access_glyph_frame   = TT_Access_Glyph_Frame;
+    face->read_glyph_header    = TT_Load_Glyph_Header;
+    face->read_simple_glyph    = TT_Load_Simple_Glyph;
+    face->read_composite_glyph = TT_Load_Composite_Glyph;
+    face->forget_glyph_frame   = TT_Forget_Glyph_Frame;
+  }
+
+
+  static void
+  tt_prepare_zone( TT_GlyphZone  zone,
+                   FT_GlyphLoad  load,
+                   FT_UInt       start_point,
+                   FT_UInt       start_contour )
+  {
+    zone->n_points    = (FT_UShort)( load->outline.n_points - start_point );
+    zone->n_contours  = (FT_Short) ( load->outline.n_contours -
+                                       start_contour );
+    zone->org         = load->extra_points + start_point;
+    zone->cur         = load->outline.points + start_point;
+    zone->orus        = load->extra_points2 + start_point;
+    zone->tags        = (FT_Byte*)load->outline.tags + start_point;
+    zone->contours    = (FT_UShort*)load->outline.contours + start_contour;
+    zone->first_point = (FT_UShort)start_point;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Hint_Glyph                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Hint the glyph using the zone prepared by the caller.  Note that   */
+  /*    the zone is supposed to include four phantom points.               */
+  /*                                                                       */
+  static FT_Error
+  TT_Hint_Glyph( TT_Loader  loader,
+                 FT_Bool    is_composite )
+  {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    TT_Face    face   = (TT_Face)loader->face;
+    TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
+#endif
+
+    TT_GlyphZone  zone = &loader->zone;
+    FT_Pos        origin;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    FT_UInt       n_ins;
+#else
+    FT_UNUSED( is_composite );
+#endif
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    if ( loader->glyph->control_len > 0xFFFFL )
+    {
+      FT_TRACE1(( "TT_Hint_Glyph: too long instructions " ));
+      FT_TRACE1(( "(0x%lx byte) is truncated\n",
+                 loader->glyph->control_len ));
+    }
+    n_ins = (FT_UInt)( loader->glyph->control_len );
+#endif
+
+    origin = zone->cur[zone->n_points - 4].x;
+    origin = FT_PIX_ROUND( origin ) - origin;
+    if ( origin )
+      translate_array( zone->n_points, zone->cur, origin, 0 );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    /* save original point position in org */
+    if ( n_ins > 0 )
+      FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );
+
+    /* Reset graphics state. */
+    loader->exec->GS = ((TT_Size)loader->size)->GS;
+
+    /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */
+    /*      completely refer to the (already) hinted subglyphs.     */
+    if ( is_composite )
+    {
+      loader->exec->metrics.x_scale = 1 << 16;
+      loader->exec->metrics.y_scale = 1 << 16;
+
+      FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points );
+    }
+    else
+    {
+      loader->exec->metrics.x_scale =
+        ((TT_Size)loader->size)->metrics.x_scale;
+      loader->exec->metrics.y_scale =
+        ((TT_Size)loader->size)->metrics.y_scale;
+    }
+#endif
+
+    /* round pp2 and pp4 */
+    zone->cur[zone->n_points - 3].x =
+      FT_PIX_ROUND( zone->cur[zone->n_points - 3].x );
+    zone->cur[zone->n_points - 1].y =
+      FT_PIX_ROUND( zone->cur[zone->n_points - 1].y );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    if ( n_ins > 0 )
+    {
+      FT_Bool   debug;
+      FT_Error  error;
+
+      FT_GlyphLoader  gloader         = loader->gloader;
+      FT_Outline      current_outline = gloader->current.outline;
+
+
+      error = TT_Set_CodeRange( loader->exec, tt_coderange_glyph,
+                                loader->exec->glyphIns, n_ins );
+      if ( error )
+        return error;
+
+      loader->exec->is_composite = is_composite;
+      loader->exec->pts          = *zone;
+
+      debug = FT_BOOL( !( loader->load_flags & FT_LOAD_NO_SCALE ) &&
+                       ((TT_Size)loader->size)->debug             );
+
+      error = TT_Run_Context( loader->exec, debug );
+      if ( error && loader->exec->pedantic_hinting )
+        return error;
+
+      /* store drop-out mode in bits 5-7; set bit 2 also as a marker */
+      current_outline.tags[0] |=
+        ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE;
+    }
+
+#endif
+
+    /* save glyph phantom points */
+    if ( !loader->preserve_pps )
+    {
+      loader->pp1 = zone->cur[zone->n_points - 4];
+      loader->pp2 = zone->cur[zone->n_points - 3];
+      loader->pp3 = zone->cur[zone->n_points - 2];
+      loader->pp4 = zone->cur[zone->n_points - 1];
+    }
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+    {
+      if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN )
+        FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 );
+
+      else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN )
+        FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 );
+    }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Process_Simple_Glyph                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Once a simple glyph has been loaded, it needs to be processed.     */
+  /*    Usually, this means scaling and hinting through bytecode           */
+  /*    interpretation.                                                    */
+  /*                                                                       */
+  static FT_Error
+  TT_Process_Simple_Glyph( TT_Loader  loader )
+  {
+    FT_GlyphLoader  gloader = loader->gloader;
+    FT_Error        error   = FT_Err_Ok;
+    FT_Outline*     outline;
+    FT_Int          n_points;
+
+
+    outline  = &gloader->current.outline;
+    n_points = outline->n_points;
+
+    /* set phantom points */
+
+    outline->points[n_points    ] = loader->pp1;
+    outline->points[n_points + 1] = loader->pp2;
+    outline->points[n_points + 2] = loader->pp3;
+    outline->points[n_points + 3] = loader->pp4;
+
+    outline->tags[n_points    ] = 0;
+    outline->tags[n_points + 1] = 0;
+    outline->tags[n_points + 2] = 0;
+    outline->tags[n_points + 3] = 0;
+
+    n_points += 4;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+    if ( ((TT_Face)loader->face)->doblend )
+    {
+      /* Deltas apply to the unscaled data. */
+      FT_Vector*  deltas;
+      FT_Memory   memory = loader->face->memory;
+      FT_Int      i;
+
+
+      error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),
+                                        loader->glyph_index,
+                                        &deltas,
+                                        n_points );
+      if ( error )
+        return error;
+
+      for ( i = 0; i < n_points; ++i )
+      {
+        outline->points[i].x += deltas[i].x;
+        outline->points[i].y += deltas[i].y;
+      }
+
+      FT_FREE( deltas );
+    }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+    if ( IS_HINTED( loader->load_flags ) )
+    {
+      tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 );
+
+      FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur,
+                     loader->zone.n_points + 4 );
+    }
+
+    {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+      TT_Face    face   = (TT_Face)loader->face;
+      TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
+
+      FT_String*  family         = face->root.family_name;
+      FT_Int      ppem           = loader->size->metrics.x_ppem;
+      FT_String*  style          = face->root.style_name;
+      FT_Int      x_scale_factor = 1000;
+#endif
+
+      FT_Vector*  vec   = outline->points;
+      FT_Vector*  limit = outline->points + n_points;
+
+      FT_Fixed  x_scale = 0; /* pacify compiler */
+      FT_Fixed  y_scale = 0;
+
+      FT_Bool  do_scale = FALSE;
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+      {
+        /* scale, but only if enabled and only if TT hinting is being used */
+        if ( IS_HINTED( loader->load_flags ) )
+          x_scale_factor = sph_test_tweak_x_scaling( face,
+                                                     family,
+                                                     ppem,
+                                                     style,
+                                                     loader->glyph_index );
+        /* scale the glyph */
+        if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ||
+             x_scale_factor != 1000                         )
+        {
+          x_scale = FT_MulDiv( ((TT_Size)loader->size)->metrics.x_scale,
+                               x_scale_factor, 1000 );
+          y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+
+          /* compensate for any scaling by de/emboldening; */
+          /* the amount was determined via experimentation */
+          if ( x_scale_factor != 1000 && ppem > 11 )
+            FT_Outline_EmboldenXY( outline,
+                                   FT_MulFix( 1280 * ppem,
+                                              1000 - x_scale_factor ),
+                                   0 );
+          do_scale = TRUE;
+        }
+      }
+      else
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+      {
+        /* scale the glyph */
+        if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+        {
+          x_scale = ((TT_Size)loader->size)->metrics.x_scale;
+          y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+
+          do_scale = TRUE;
+        }
+      }
+
+      if ( do_scale )
+      {
+        for ( ; vec < limit; vec++ )
+        {
+          vec->x = FT_MulFix( vec->x, x_scale );
+          vec->y = FT_MulFix( vec->y, y_scale );
+        }
+
+        loader->pp1 = outline->points[n_points - 4];
+        loader->pp2 = outline->points[n_points - 3];
+        loader->pp3 = outline->points[n_points - 2];
+        loader->pp4 = outline->points[n_points - 1];
+      }
+    }
+
+    /**We Disable HINT except tricky font, seem it looks better, #Testdoc:0000584_Open_CAC5U7WH.pdf,
+	0000879_Image_MSFNUnattendedPDF.pdf,0005480_sample-barcodes print.pdf.
+	*/
+	
+    if ( IS_HINTED( loader->load_flags ) && (loader->face->face_flags&FT_FACE_FLAG_TRICKY))
+    {
+      loader->zone.n_points += 4;
+
+      error = TT_Hint_Glyph( loader, 0 );
+    }
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Process_Composite_Component                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Once a composite component has been loaded, it needs to be         */
+  /*    processed.  Usually, this means transforming and translating.      */
+  /*                                                                       */
+  static FT_Error
+  TT_Process_Composite_Component( TT_Loader    loader,
+                                  FT_SubGlyph  subglyph,
+                                  FT_UInt      start_point,
+                                  FT_UInt      num_base_points )
+  {
+    FT_GlyphLoader  gloader    = loader->gloader;
+    FT_Vector*      base_vec   = gloader->base.outline.points;
+    FT_UInt         num_points = gloader->base.outline.n_points;
+    FT_Bool         have_scale;
+    FT_Pos          x, y;
+
+
+    have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE     |
+                                              WE_HAVE_AN_XY_SCALE |
+                                              WE_HAVE_A_2X2       ) );
+
+    /* perform the transform required for this subglyph */
+    if ( have_scale )
+    {
+      FT_UInt  i;
+
+
+      for ( i = num_base_points; i < num_points; i++ )
+        FT_Vector_Transform( base_vec + i, &subglyph->transform );
+    }
+
+    /* get offset */
+    if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) )
+    {
+      FT_UInt     k = subglyph->arg1;
+      FT_UInt     l = subglyph->arg2;
+      FT_Vector*  p1;
+      FT_Vector*  p2;
+
+
+      /* match l-th point of the newly loaded component to the k-th point */
+      /* of the previously loaded components.                             */
+
+      /* change to the point numbers used by our outline */
+      k += start_point;
+      l += num_base_points;
+      if ( k >= num_base_points ||
+           l >= num_points      )
+        return FT_THROW( Invalid_Composite );
+
+      p1 = gloader->base.outline.points + k;
+      p2 = gloader->base.outline.points + l;
+
+      x = p1->x - p2->x;
+      y = p1->y - p2->y;
+    }
+    else
+    {
+      x = subglyph->arg1;
+      y = subglyph->arg2;
+
+      if ( !x && !y )
+        return FT_Err_Ok;
+
+  /* Use a default value dependent on                                     */
+  /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED.  This is useful for old TT */
+  /* fonts which don't set the xxx_COMPONENT_OFFSET bit.                  */
+
+      if ( have_scale &&
+#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
+           !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) )
+#else
+            ( subglyph->flags & SCALED_COMPONENT_OFFSET ) )
+#endif
+      {
+
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This algorithm is what Apple documents.  But it doesn't work.         */
+  /*                                                                       */
+        int  a = subglyph->transform.xx > 0 ?  subglyph->transform.xx
+                                            : -subglyph->transform.xx;
+        int  b = subglyph->transform.yx > 0 ?  subglyph->transform.yx
+                                            : -subglyph->transform.yx;
+        int  c = subglyph->transform.xy > 0 ?  subglyph->transform.xy
+                                            : -subglyph->transform.xy;
+        int  d = subglyph->transform.yy > 0 ? subglyph->transform.yy
+                                            : -subglyph->transform.yy;
+        int  m = a > b ? a : b;
+        int  n = c > d ? c : d;
+
+
+        if ( a - b <= 33 && a - b >= -33 )
+          m *= 2;
+        if ( c - d <= 33 && c - d >= -33 )
+          n *= 2;
+        x = FT_MulFix( x, m );
+        y = FT_MulFix( y, n );
+
+#else /* 0 */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This algorithm is a guess and works much better than the above.       */
+  /*                                                                       */
+        FT_Fixed  mac_xscale = FT_Hypot( subglyph->transform.xx,
+                                         subglyph->transform.xy );
+        FT_Fixed  mac_yscale = FT_Hypot( subglyph->transform.yy,
+                                         subglyph->transform.yx );
+
+
+        x = FT_MulFix( x, mac_xscale );
+        y = FT_MulFix( y, mac_yscale );
+
+#endif /* 0 */
+
+      }
+
+      if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
+      {
+        FT_Fixed  x_scale = ((TT_Size)loader->size)->metrics.x_scale;
+        FT_Fixed  y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+
+
+        x = FT_MulFix( x, x_scale );
+        y = FT_MulFix( y, y_scale );
+
+        if ( subglyph->flags & ROUND_XY_TO_GRID )
+        {
+          x = FT_PIX_ROUND( x );
+          y = FT_PIX_ROUND( y );
+        }
+      }
+    }
+
+    if ( x || y )
+      translate_array( num_points - num_base_points,
+                       base_vec + num_base_points,
+                       x, y );
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Process_Composite_Glyph                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is slightly different from TT_Process_Simple_Glyph, in that   */
+  /*    its sole purpose is to hint the glyph.  Thus this function is      */
+  /*    only available when bytecode interpreter is enabled.               */
+  /*                                                                       */
+  static FT_Error
+  TT_Process_Composite_Glyph( TT_Loader  loader,
+                              FT_UInt    start_point,
+                              FT_UInt    start_contour )
+  {
+    FT_Error     error;
+    FT_Outline*  outline;
+    FT_UInt      i;
+
+
+    outline = &loader->gloader->base.outline;
+
+    /* make room for phantom points */
+    error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader,
+                                         outline->n_points + 4,
+                                         0 );
+    if ( error )
+      return error;
+
+    outline->points[outline->n_points    ] = loader->pp1;
+    outline->points[outline->n_points + 1] = loader->pp2;
+    outline->points[outline->n_points + 2] = loader->pp3;
+    outline->points[outline->n_points + 3] = loader->pp4;
+
+    outline->tags[outline->n_points    ] = 0;
+    outline->tags[outline->n_points + 1] = 0;
+    outline->tags[outline->n_points + 2] = 0;
+    outline->tags[outline->n_points + 3] = 0;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    {
+      FT_Stream  stream = loader->stream;
+      FT_UShort  n_ins, max_ins;
+      FT_ULong   tmp;
+
+
+      /* TT_Load_Composite_Glyph only gives us the offset of instructions */
+      /* so we read them here                                             */
+      if ( FT_STREAM_SEEK( loader->ins_pos ) ||
+           FT_READ_USHORT( n_ins )           )
+        return error;
+
+      FT_TRACE5(( "  Instructions size = %d\n", n_ins ));
+
+      /* check it */
+      max_ins = ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions;
+      if ( n_ins > max_ins )
+      {
+        /* acroread ignores this field, so we only do a rough safety check */
+        if ( (FT_Int)n_ins > loader->byte_len )
+        {
+          FT_TRACE1(( "TT_Process_Composite_Glyph: "
+                      "too many instructions (%d) for glyph with length %d\n",
+                      n_ins, loader->byte_len ));
+          return FT_THROW( Too_Many_Hints );
+        }
+
+        tmp = loader->exec->glyphSize;
+        error = Update_Max( loader->exec->memory,
+                            &tmp,
+                            sizeof ( FT_Byte ),
+                            (void*)&loader->exec->glyphIns,
+                            n_ins );
+        loader->exec->glyphSize = (FT_UShort)tmp;
+        if ( error )
+          return error;
+      }
+      else if ( n_ins == 0 )
+        return FT_Err_Ok;
+
+      if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) )
+        return error;
+
+      loader->glyph->control_data = loader->exec->glyphIns;
+      loader->glyph->control_len  = n_ins;
+    }
+
+#endif
+
+    tt_prepare_zone( &loader->zone, &loader->gloader->base,
+                     start_point, start_contour );
+
+    /* Some points are likely touched during execution of  */
+    /* instructions on components.  So let's untouch them. */
+    for ( i = start_point; i < loader->zone.n_points; i++ )
+      loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH;
+
+    loader->zone.n_points += 4;
+
+    return TT_Hint_Glyph( loader, 1 );
+  }
+
+
+  /* Calculate the four phantom points.                     */
+  /* The first two stand for horizontal origin and advance. */
+  /* The last two stand for vertical origin and advance.    */
+#define TT_LOADER_SET_PP( loader )                                          \
+          do {                                                              \
+            (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \
+            (loader)->pp1.y = 0;                                            \
+            (loader)->pp2.x = (loader)->pp1.x + (loader)->advance;          \
+            (loader)->pp2.y = 0;                                            \
+            (loader)->pp3.x = 0;                                            \
+            (loader)->pp3.y = (loader)->top_bearing + (loader)->bbox.yMax;  \
+            (loader)->pp4.x = 0;                                            \
+            (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance;         \
+          } while ( 0 )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    load_truetype_glyph                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads a given truetype glyph.  Handles composites and uses a       */
+  /*    TT_Loader object.                                                  */
+  /*                                                                       */
+  static FT_Error
+  load_truetype_glyph( TT_Loader  loader,
+                       FT_UInt    glyph_index,
+                       FT_UInt    recurse_count,
+                       FT_Bool    header_only )
+  {
+    FT_Error        error        = FT_Err_Ok;
+    FT_Fixed        x_scale, y_scale;
+    FT_ULong        offset;
+    TT_Face         face         = (TT_Face)loader->face;
+    FT_GlyphLoader  gloader      = loader->gloader;
+    FT_Bool         opened_frame = 0;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    FT_Vector*      deltas       = NULL;
+#endif
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_StreamRec    inc_stream;
+    FT_Data         glyph_data;
+    FT_Bool         glyph_data_loaded = 0;
+#endif
+
+
+    /* some fonts have an incorrect value of `maxComponentDepth', */
+    /* thus we allow depth 1 to catch the majority of them        */
+    if ( recurse_count > 1                                   &&
+         recurse_count > face->max_profile.maxComponentDepth )
+    {
+      error = FT_THROW( Invalid_Composite );
+      goto Exit;
+    }
+
+    /* check glyph index */
+    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
+    {
+      error = FT_THROW( Invalid_Glyph_Index );
+      goto Exit;
+    }
+
+    loader->glyph_index = glyph_index;
+
+    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+    {
+      x_scale = ((TT_Size)loader->size)->metrics.x_scale;
+      y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+    }
+    else
+    {
+      x_scale = 0x10000L;
+      y_scale = 0x10000L;
+    }
+
+    tt_get_metrics( loader, glyph_index );
+
+    /* Set `offset' to the start of the glyph relative to the start of */
+    /* the `glyf' table, and `byte_len' to the length of the glyph in  */
+    /* bytes.                                                          */
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    /* If we are loading glyph data via the incremental interface, set */
+    /* the loader stream to a memory stream reading the data returned  */
+    /* by the interface.                                               */
+    if ( face->root.internal->incremental_interface )
+    {
+      error = face->root.internal->incremental_interface->funcs->get_glyph_data(
+                face->root.internal->incremental_interface->object,
+                glyph_index, &glyph_data );
+      if ( error )
+        goto Exit;
+
+      glyph_data_loaded = 1;
+      offset            = 0;
+      loader->byte_len  = glyph_data.length;
+
+      FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) );
+      FT_Stream_OpenMemory( &inc_stream,
+                            glyph_data.pointer, glyph_data.length );
+
+      loader->stream = &inc_stream;
+    }
+    else
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+      offset = tt_face_get_location( face, glyph_index,
+                                     (FT_UInt*)&loader->byte_len );
+
+    if ( loader->byte_len > 0 )
+    {
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+      /* for the incremental interface, `glyf_offset' is always zero */
+      if ( !loader->glyf_offset                        &&
+           !face->root.internal->incremental_interface )
+#else
+      if ( !loader->glyf_offset )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+      {
+        FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" ));
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
+      }
+
+      error = face->access_glyph_frame( loader, glyph_index,
+                                        loader->glyf_offset + offset,
+                                        loader->byte_len );
+      if ( error )
+        goto Exit;
+
+      opened_frame = 1;
+
+      /* read glyph header first */
+      error = face->read_glyph_header( loader );
+      if ( error || header_only )
+        goto Exit;
+    }
+
+    if ( loader->byte_len == 0 || loader->n_contours == 0 )
+    {
+      loader->bbox.xMin = 0;
+      loader->bbox.xMax = 0;
+      loader->bbox.yMin = 0;
+      loader->bbox.yMax = 0;
+
+      if ( header_only )
+        goto Exit;
+
+      /* must initialize points before (possibly) overriding */
+      /* glyph metrics from the incremental interface        */
+      TT_LOADER_SET_PP( loader );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+      tt_get_metrics_incr_overrides( loader, glyph_index );
+#endif
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+      if ( ((TT_Face)(loader->face))->doblend )
+      {
+        /* this must be done before scaling */
+        FT_Memory  memory = loader->face->memory;
+
+
+        error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),
+                                          glyph_index, &deltas, 4 );
+        if ( error )
+          goto Exit;
+
+        loader->pp1.x += deltas[0].x; loader->pp1.y += deltas[0].y;
+        loader->pp2.x += deltas[1].x; loader->pp2.y += deltas[1].y;
+        loader->pp3.x += deltas[2].x; loader->pp3.y += deltas[2].y;
+        loader->pp4.x += deltas[3].x; loader->pp4.y += deltas[3].y;
+
+        FT_FREE( deltas );
+      }
+
+#endif
+
+      if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+      {
+        loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );
+        loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );
+        loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );
+        loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
+      }
+
+      error = FT_Err_Ok;
+      goto Exit;
+    }
+
+    /* must initialize points before (possibly) overriding */
+    /* glyph metrics from the incremental interface        */
+    TT_LOADER_SET_PP( loader );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    tt_get_metrics_incr_overrides( loader, glyph_index );
+#endif
+
+    /***********************************************************************/
+    /***********************************************************************/
+    /***********************************************************************/
+
+    /* if it is a simple glyph, load it */
+
+    if ( loader->n_contours > 0 )
+    {
+      error = face->read_simple_glyph( loader );
+      if ( error )
+        goto Exit;
+
+      /* all data have been read */
+      face->forget_glyph_frame( loader );
+      opened_frame = 0;
+
+      error = TT_Process_Simple_Glyph( loader );
+      if ( error )
+        goto Exit;
+
+      FT_GlyphLoader_Add( gloader );
+    }
+
+    /***********************************************************************/
+    /***********************************************************************/
+    /***********************************************************************/
+
+    /* otherwise, load a composite! */
+    else if ( loader->n_contours == -1 )
+    {
+      FT_UInt   start_point;
+      FT_UInt   start_contour;
+      FT_ULong  ins_pos;  /* position of composite instructions, if any */
+
+
+      start_point   = gloader->base.outline.n_points;
+      start_contour = gloader->base.outline.n_contours;
+
+      /* for each subglyph, read composite header */
+      error = face->read_composite_glyph( loader );
+      if ( error )
+        goto Exit;
+
+      /* store the offset of instructions */
+      ins_pos = loader->ins_pos;
+
+      /* all data we need are read */
+      face->forget_glyph_frame( loader );
+      opened_frame = 0;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+      if ( face->doblend )
+      {
+        FT_Int       i, limit;
+        FT_SubGlyph  subglyph;
+        FT_Memory    memory = face->root.memory;
+
+
+        /* this provides additional offsets */
+        /* for each component's translation */
+
+        if ( ( error = TT_Vary_Get_Glyph_Deltas(
+                         face,
+                         glyph_index,
+                         &deltas,
+                         gloader->current.num_subglyphs + 4 )) != 0 )
+          goto Exit;
+
+        subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs;
+        limit    = gloader->current.num_subglyphs;
+
+        for ( i = 0; i < limit; ++i, ++subglyph )
+        {
+          if ( subglyph->flags & ARGS_ARE_XY_VALUES )
+          {
+            /* XXX: overflow check for subglyph->{arg1,arg2}.   */
+            /* deltas[i].{x,y} must be within signed 16-bit,    */
+            /* but the restriction of summed delta is not clear */
+            subglyph->arg1 += (FT_Int16)deltas[i].x;
+            subglyph->arg2 += (FT_Int16)deltas[i].y;
+          }
+        }
+
+        loader->pp1.x += deltas[i + 0].x; loader->pp1.y += deltas[i + 0].y;
+        loader->pp2.x += deltas[i + 1].x; loader->pp2.y += deltas[i + 1].y;
+        loader->pp3.x += deltas[i + 2].x; loader->pp3.y += deltas[i + 2].y;
+        loader->pp4.x += deltas[i + 3].x; loader->pp4.y += deltas[i + 3].y;
+
+        FT_FREE( deltas );
+      }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+      if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+      {
+        loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );
+        loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );
+        loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );
+        loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
+      }
+
+      /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */
+      /* `as is' in the glyph slot (the client application will be     */
+      /* responsible for interpreting these data)...                   */
+      if ( loader->load_flags & FT_LOAD_NO_RECURSE )
+      {
+        FT_GlyphLoader_Add( gloader );
+        loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE;
+
+        goto Exit;
+      }
+
+      /*********************************************************************/
+      /*********************************************************************/
+      /*********************************************************************/
+
+      {
+        FT_UInt      n, num_base_points;
+        FT_SubGlyph  subglyph       = 0;
+
+        FT_UInt      num_points     = start_point;
+        FT_UInt      num_subglyphs  = gloader->current.num_subglyphs;
+        FT_UInt      num_base_subgs = gloader->base.num_subglyphs;
+
+        FT_Stream    old_stream     = loader->stream;
+        FT_Int       old_byte_len   = loader->byte_len;
+
+
+        FT_GlyphLoader_Add( gloader );
+
+        /* read each subglyph independently */
+        for ( n = 0; n < num_subglyphs; n++ )
+        {
+          FT_Vector  pp[4];
+
+
+          /* Each time we call load_truetype_glyph in this loop, the   */
+          /* value of `gloader.base.subglyphs' can change due to table */
+          /* reallocations.  We thus need to recompute the subglyph    */
+          /* pointer on each iteration.                                */
+          subglyph = gloader->base.subglyphs + num_base_subgs + n;
+
+          pp[0] = loader->pp1;
+          pp[1] = loader->pp2;
+          pp[2] = loader->pp3;
+          pp[3] = loader->pp4;
+
+          num_base_points = gloader->base.outline.n_points;
+
+          error = load_truetype_glyph( loader, subglyph->index,
+                                       recurse_count + 1, FALSE );
+          if ( error )
+            goto Exit;
+
+          /* restore subglyph pointer */
+          subglyph = gloader->base.subglyphs + num_base_subgs + n;
+
+          if ( !( subglyph->flags & USE_MY_METRICS ) )
+          {
+            loader->pp1 = pp[0];
+            loader->pp2 = pp[1];
+            loader->pp3 = pp[2];
+            loader->pp4 = pp[3];
+          }
+
+          num_points = gloader->base.outline.n_points;
+
+          if ( num_points == num_base_points )
+            continue;
+
+          /* gloader->base.outline consists of three parts:               */
+          /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */
+          /*                                                              */
+          /* (1): exists from the beginning                               */
+          /* (2): components that have been loaded so far                 */
+          /* (3): the newly loaded component                              */
+          TT_Process_Composite_Component( loader, subglyph, start_point,
+                                          num_base_points );
+        }
+
+        loader->stream   = old_stream;
+        loader->byte_len = old_byte_len;
+
+        /* process the glyph */
+        loader->ins_pos = ins_pos;
+        if ( IS_HINTED( loader->load_flags ) &&
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+             subglyph->flags & WE_HAVE_INSTR &&
+
+#endif
+
+             num_points > start_point )
+          TT_Process_Composite_Glyph( loader, start_point, start_contour );
+
+      }
+    }
+    else
+    {
+      /* invalid composite count (negative but not -1) */
+      error = FT_THROW( Invalid_Outline );
+      goto Exit;
+    }
+
+    /***********************************************************************/
+    /***********************************************************************/
+    /***********************************************************************/
+
+  Exit:
+
+    if ( opened_frame )
+      face->forget_glyph_frame( loader );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    if ( glyph_data_loaded )
+      face->root.internal->incremental_interface->funcs->free_glyph_data(
+        face->root.internal->incremental_interface->object,
+        &glyph_data );
+
+#endif
+
+    return error;
+  }
+
+
+  static FT_Error
+  compute_glyph_metrics( TT_Loader  loader,
+                         FT_UInt    glyph_index )
+  {
+    TT_Face    face   = (TT_Face)loader->face;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
+#endif
+
+    FT_BBox       bbox;
+    FT_Fixed      y_scale;
+    TT_GlyphSlot  glyph = loader->glyph;
+    TT_Size       size  = (TT_Size)loader->size;
+
+
+    y_scale = 0x10000L;
+    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+      y_scale = size->root.metrics.y_scale;
+
+    if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE )
+      FT_Outline_Get_CBox( &glyph->outline, &bbox );
+    else
+      bbox = loader->bbox;
+
+    /* get the device-independent horizontal advance; it is scaled later */
+    /* by the base layer.                                                */
+    glyph->linearHoriAdvance = loader->linear;
+
+    glyph->metrics.horiBearingX = bbox.xMin;
+    glyph->metrics.horiBearingY = bbox.yMax;
+    glyph->metrics.horiAdvance  = loader->pp2.x - loader->pp1.x;
+
+    /* adjust advance width to the value contained in the hdmx table */
+    if ( !face->postscript.isFixedPitch  &&
+         IS_HINTED( loader->load_flags ) )
+    {
+      FT_Byte*  widthp;
+
+
+      widthp = tt_face_get_device_metrics( face,
+                                           size->root.metrics.x_ppem,
+                                           glyph_index );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+      {
+        FT_Bool  ignore_x_mode;
+
+
+        ignore_x_mode = FT_BOOL( FT_LOAD_TARGET_MODE( loader->load_flags ) !=
+                                 FT_RENDER_MODE_MONO );
+
+        if ( widthp                                                   &&
+             ( ( ignore_x_mode && loader->exec->compatible_widths ) ||
+                !ignore_x_mode                                      ||
+                SPH_OPTION_BITMAP_WIDTHS                            ) )
+          glyph->metrics.horiAdvance = *widthp << 6;
+      }
+      else
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+      {
+        if ( widthp )
+          glyph->metrics.horiAdvance = *widthp << 6;
+      }
+    }
+
+    /* set glyph dimensions */
+    glyph->metrics.width  = bbox.xMax - bbox.xMin;
+    glyph->metrics.height = bbox.yMax - bbox.yMin;
+
+    /* Now take care of vertical metrics.  In the case where there is */
+    /* no vertical information within the font (relatively common),   */
+    /* create some metrics manually                                   */
+    {
+      FT_Pos  top;      /* scaled vertical top side bearing  */
+      FT_Pos  advance;  /* scaled vertical advance height    */
+
+
+      /* Get the unscaled top bearing and advance height. */
+      if ( face->vertical_info                   &&
+           face->vertical.number_Of_VMetrics > 0 )
+      {
+        top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax,
+                                   y_scale );
+
+        if ( loader->pp3.y <= loader->pp4.y )
+          advance = 0;
+        else
+          advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y,
+                                          y_scale );
+      }
+      else
+      {
+        FT_Pos  height;
+
+
+        /* XXX Compute top side bearing and advance height in  */
+        /*     Get_VMetrics instead of here.                   */
+
+        /* NOTE: The OS/2 values are the only `portable' ones, */
+        /*       which is why we use them, if there is an OS/2 */
+        /*       table in the font.  Otherwise, we use the     */
+        /*       values defined in the horizontal header.      */
+
+        height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin,
+                                      y_scale );
+        if ( face->os2.version != 0xFFFFU )
+          advance = (FT_Pos)( face->os2.sTypoAscender -
+                              face->os2.sTypoDescender );
+        else
+          advance = (FT_Pos)( face->horizontal.Ascender -
+                              face->horizontal.Descender );
+
+        top = ( advance - height ) / 2;
+      }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+      {
+        FT_Incremental_InterfaceRec*  incr;
+        FT_Incremental_MetricsRec     metrics;
+        FT_Error                      error;
+
+
+        incr = face->root.internal->incremental_interface;
+
+        /* If this is an incrementally loaded font see if there are */
+        /* overriding metrics for this glyph.                       */
+        if ( incr && incr->funcs->get_glyph_metrics )
+        {
+          metrics.bearing_x = 0;
+          metrics.bearing_y = top;
+          metrics.advance   = advance;
+
+          error = incr->funcs->get_glyph_metrics( incr->object,
+                                                  glyph_index,
+                                                  TRUE,
+                                                  &metrics );
+          if ( error )
+            return error;
+
+          top     = metrics.bearing_y;
+          advance = metrics.advance;
+        }
+      }
+
+      /* GWW: Do vertical metrics get loaded incrementally too? */
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+      glyph->linearVertAdvance = advance;
+
+      /* scale the metrics */
+      if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
+      {
+        top     = FT_MulFix( top,     y_scale );
+        advance = FT_MulFix( advance, y_scale );
+      }
+
+      /* XXX: for now, we have no better algorithm for the lsb, but it */
+      /*      should work fine.                                        */
+      /*                                                               */
+      glyph->metrics.vertBearingX = glyph->metrics.horiBearingX -
+                                      glyph->metrics.horiAdvance / 2;
+      glyph->metrics.vertBearingY = top;
+      glyph->metrics.vertAdvance  = advance;
+    }
+
+    return 0;
+  }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+  static FT_Error
+  load_sbit_image( TT_Size       size,
+                   TT_GlyphSlot  glyph,
+                   FT_UInt       glyph_index,
+                   FT_Int32      load_flags )
+  {
+    TT_Face             face;
+    SFNT_Service        sfnt;
+    FT_Stream           stream;
+    FT_Error            error;
+    TT_SBit_MetricsRec  metrics;
+
+
+    face   = (TT_Face)glyph->face;
+    sfnt   = (SFNT_Service)face->sfnt;
+    stream = face->root.stream;
+
+    error = sfnt->load_sbit_image( face,
+                                   size->strike_index,
+                                   glyph_index,
+                                   (FT_Int)load_flags,
+                                   stream,
+                                   &glyph->bitmap,
+                                   &metrics );
+    if ( !error )
+    {
+      glyph->outline.n_points   = 0;
+      glyph->outline.n_contours = 0;
+
+      glyph->metrics.width  = (FT_Pos)metrics.width  << 6;
+      glyph->metrics.height = (FT_Pos)metrics.height << 6;
+
+      glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
+      glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
+      glyph->metrics.horiAdvance  = (FT_Pos)metrics.horiAdvance  << 6;
+
+      glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
+      glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
+      glyph->metrics.vertAdvance  = (FT_Pos)metrics.vertAdvance  << 6;
+
+      glyph->format = FT_GLYPH_FORMAT_BITMAP;
+
+      if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+      {
+        glyph->bitmap_left = metrics.vertBearingX;
+        glyph->bitmap_top  = metrics.vertBearingY;
+      }
+      else
+      {
+        glyph->bitmap_left = metrics.horiBearingX;
+        glyph->bitmap_top  = metrics.horiBearingY;
+      }
+    }
+
+    return error;
+  }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+  static FT_Error
+  tt_loader_init( TT_Loader     loader,
+                  TT_Size       size,
+                  TT_GlyphSlot  glyph,
+                  FT_Int32      load_flags,
+                  FT_Bool       glyf_table_only )
+  {
+    TT_Face    face;
+    FT_Stream  stream;
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    FT_Bool    pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
+#endif
+
+
+    face   = (TT_Face)glyph->face;
+    stream = face->root.stream;
+
+    FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    /* load execution context */
+    if ( IS_HINTED( load_flags ) && !glyf_table_only )
+    {
+      TT_ExecContext  exec;
+      FT_Bool         grayscale;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+      TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
+
+      FT_Bool  subpixel_hinting  = FALSE;
+      FT_Bool  grayscale_hinting = TRUE;
+
+#if 0
+      /* not used yet */
+      FT_Bool  compatible_widths;
+      FT_Bool  symmetrical_smoothing;
+      FT_Bool  bgr;
+      FT_Bool  subpixel_positioned;
+#endif
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+      FT_Bool  reexecute = FALSE;
+
+
+      if ( !size->cvt_ready )
+      {
+        FT_Error  error = tt_size_ready_bytecode( size, pedantic );
+
+
+        if ( error )
+          return error;
+      }
+
+      /* query new execution context */
+      exec = size->debug ? size->context
+                         : ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
+      if ( !exec )
+        return FT_THROW( Could_Not_Find_Context );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+      {
+        subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags )
+                                      != FT_RENDER_MODE_MONO )          &&
+                                    SPH_OPTION_SET_SUBPIXEL             );
+
+        if ( subpixel_hinting )
+          grayscale = grayscale_hinting = FALSE;
+        else if ( SPH_OPTION_SET_GRAYSCALE )
+        {
+          grayscale = grayscale_hinting = TRUE;
+          subpixel_hinting              = FALSE;
+        }
+        else
+          grayscale = grayscale_hinting = FALSE;
+
+        if ( FT_IS_TRICKY( glyph->face ) )
+          subpixel_hinting = grayscale_hinting = FALSE;
+
+        exec->ignore_x_mode      = subpixel_hinting || grayscale_hinting;
+        exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
+        if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
+          exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
+
+#if 1
+        exec->compatible_widths     = SPH_OPTION_SET_COMPATIBLE_WIDTHS;
+        exec->symmetrical_smoothing = FALSE;
+        exec->bgr                   = FALSE;
+        exec->subpixel_positioned   = TRUE;
+#else /* 0 */
+        exec->compatible_widths =
+          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+                   TT_LOAD_COMPATIBLE_WIDTHS );
+        exec->symmetrical_smoothing =
+          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+                   TT_LOAD_SYMMETRICAL_SMOOTHING );
+        exec->bgr =
+          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+                   TT_LOAD_BGR );
+        exec->subpixel_positioned =
+          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+                   TT_LOAD_SUBPIXEL_POSITIONED );
+#endif /* 0 */
+
+      }
+      else
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+      {
+        grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+                             FT_RENDER_MODE_MONO );
+      }
+
+      TT_Load_Context( exec, face, size );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+      {
+        /* a change from mono to subpixel rendering (and vice versa) */
+        /* requires a re-execution of the CVT program                */
+        if ( subpixel_hinting != exec->subpixel_hinting )
+        {
+          FT_TRACE4(( "tt_loader_init: subpixel hinting change,"
+                      " re-executing `prep' table\n" ));
+
+          exec->subpixel_hinting = subpixel_hinting;
+          reexecute              = TRUE;
+        }
+
+        /* a change from mono to grayscale rendering (and vice versa) */
+        /* requires a re-execution of the CVT program                 */
+        if ( grayscale != exec->grayscale_hinting )
+        {
+          FT_TRACE4(( "tt_loader_init: grayscale hinting change,"
+                      " re-executing `prep' table\n" ));
+
+          exec->grayscale_hinting = grayscale_hinting;
+          reexecute               = TRUE;
+        }
+      }
+      else
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+      {
+        /* a change from mono to grayscale rendering (and vice versa) */
+        /* requires a re-execution of the CVT program                 */
+        if ( grayscale != exec->grayscale )
+        {
+          FT_TRACE4(( "tt_loader_init: grayscale change,"
+                      " re-executing `prep' table\n" ));
+
+          exec->grayscale = grayscale;
+          reexecute       = TRUE;
+        }
+      }
+
+      if ( reexecute )
+      {
+        FT_UInt  i;
+
+
+        for ( i = 0; i < size->cvt_size; i++ )
+          size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
+        tt_size_run_prep( size, pedantic );
+      }
+
+      /* see whether the cvt program has disabled hinting */
+      if ( exec->GS.instruct_control & 1 )
+        load_flags |= FT_LOAD_NO_HINTING;
+
+      /* load default graphics state -- if needed */
+      if ( exec->GS.instruct_control & 2 )
+        exec->GS = tt_default_graphics_state;
+
+      exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
+      loader->exec = exec;
+      loader->instructions = exec->glyphIns;
+    }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+    /* seek to the beginning of the glyph table -- for Type 42 fonts     */
+    /* the table might be accessed from a Postscript stream or something */
+    /* else...                                                           */
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    if ( face->root.internal->incremental_interface )
+      loader->glyf_offset = 0;
+    else
+
+#endif
+
+    {
+      FT_Error  error = face->goto_table( face, TTAG_glyf, stream, 0 );
+
+
+      if ( FT_ERR_EQ( error, Table_Missing ) )
+        loader->glyf_offset = 0;
+      else if ( error )
+      {
+        FT_ERROR(( "tt_loader_init: could not access glyph table\n" ));
+        return error;
+      }
+      else
+        loader->glyf_offset = FT_STREAM_POS();
+    }
+
+    /* get face's glyph loader */
+    if ( !glyf_table_only )
+    {
+      FT_GlyphLoader  gloader = glyph->internal->loader;
+
+
+      FT_GlyphLoader_Rewind( gloader );
+      loader->gloader = gloader;
+    }
+
+    loader->load_flags = load_flags;
+
+    loader->face   = (FT_Face)face;
+    loader->size   = (FT_Size)size;
+    loader->glyph  = (FT_GlyphSlot)glyph;
+    loader->stream = stream;
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Load_Glyph                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to load a single glyph within a given glyph slot,  */
+  /*    for a given size.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    glyph       :: A handle to a target slot object where the glyph    */
+  /*                   will be loaded.                                     */
+  /*                                                                       */
+  /*    size        :: A handle to the source face size at which the glyph */
+  /*                   must be scaled/loaded.                              */
+  /*                                                                       */
+  /*    glyph_index :: The index of the glyph in the font file.            */
+  /*                                                                       */
+  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
+  /*                   FT_LOAD_XXX constants can be used to control the    */
+  /*                   glyph loading process (e.g., whether the outline    */
+  /*                   should be scaled, whether to load bitmaps or not,   */
+  /*                   whether to hint the outline, etc).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Load_Glyph( TT_Size       size,
+                 TT_GlyphSlot  glyph,
+                 FT_UInt       glyph_index,
+                 FT_Int32      load_flags )
+  {
+    FT_Error      error;
+    TT_LoaderRec  loader;
+
+
+    error = FT_Err_Ok;
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+    /* try to load embedded bitmap if any              */
+    /*                                                 */
+    /* XXX: The convention should be emphasized in     */
+    /*      the documents because it can be confusing. */
+    if ( size->strike_index != 0xFFFFFFFFUL      &&
+         ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+    {
+      error = load_sbit_image( size, glyph, glyph_index, load_flags );
+      if ( !error )
+      {
+        if ( FT_IS_SCALABLE( glyph->face ) )
+        {
+          /* for the bbox we need the header only */
+          (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE );
+          (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE );
+          glyph->linearHoriAdvance = loader.linear;
+          glyph->linearVertAdvance = loader.top_bearing + loader.bbox.yMax -
+                                       loader.vadvance;
+
+          /* sanity check: if `horiAdvance' in the sbit metric */
+          /* structure isn't set, use `linearHoriAdvance'      */
+          if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance )
+            glyph->metrics.horiAdvance =
+              FT_MulFix( glyph->linearHoriAdvance,
+                         size->root.metrics.x_scale );
+        }
+
+        return FT_Err_Ok;
+      }
+    }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+    /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */
+    if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid )
+      return FT_THROW( Invalid_Size_Handle );
+
+    if ( load_flags & FT_LOAD_SBITS_ONLY )
+      return FT_THROW( Invalid_Argument );
+
+    error = tt_loader_init( &loader, size, glyph, load_flags, FALSE );
+    if ( error )
+      return error;
+
+    glyph->format        = FT_GLYPH_FORMAT_OUTLINE;
+    glyph->num_subglyphs = 0;
+    glyph->outline.flags = 0;
+
+    /* main loading loop */
+    error = load_truetype_glyph( &loader, glyph_index, 0, FALSE );
+    if ( !error )
+    {
+      if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE )
+      {
+        glyph->num_subglyphs = loader.gloader->base.num_subglyphs;
+        glyph->subglyphs     = loader.gloader->base.subglyphs;
+      }
+      else
+      {
+        glyph->outline        = loader.gloader->base.outline;
+        glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS;
+
+        /* Translate array so that (0,0) is the glyph's origin.  Note  */
+        /* that this behaviour is independent on the value of bit 1 of */
+        /* the `flags' field in the `head' table -- at least major     */
+        /* applications like Acroread indicate that.                   */
+        if ( loader.pp1.x )
+          FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 );
+      }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+      if ( IS_HINTED( load_flags ) )
+      {
+        if ( loader.exec->GS.scan_control )
+        {
+          /* convert scan conversion mode to FT_OUTLINE_XXX flags */
+          switch ( loader.exec->GS.scan_type )
+          {
+          case 0: /* simple drop-outs including stubs */
+            glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS;
+            break;
+          case 1: /* simple drop-outs excluding stubs */
+            /* nothing; it's the default rendering mode */
+            break;
+          case 4: /* smart drop-outs including stubs */
+            glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS |
+                                    FT_OUTLINE_INCLUDE_STUBS;
+            break;
+          case 5: /* smart drop-outs excluding stubs  */
+            glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS;
+            break;
+
+          default: /* no drop-out control */
+            glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;
+            break;
+          }
+        }
+        else
+          glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;
+      }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+      compute_glyph_metrics( &loader, glyph_index );
+    }
+
+    /* Set the `high precision' bit flag.                           */
+    /* This is _critical_ to get correct output for monochrome      */
+    /* TrueType glyphs at all sizes using the bytecode interpreter. */
+    /*                                                              */
+    if ( !( load_flags & FT_LOAD_NO_SCALE ) &&
+         size->root.metrics.y_ppem < 24     )
+      glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.h
new file mode 100644
index 0000000..aea68f8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.h
@@ -0,0 +1,61 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttgload.h                                                              */
+/*                                                                         */
+/*    TrueType Glyph Loader (specification).                               */
+/*                                                                         */
+/*  Copyright 1996-2006, 2008, 2011 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTGLOAD_H__
+#define __TTGLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttobjs.h"
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#include "ttinterp.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( void )
+  TT_Init_Glyph_Loading( TT_Face  face );
+
+  FT_LOCAL( void )
+  TT_Get_HMetrics( TT_Face     face,
+                   FT_UInt     idx,
+                   FT_Short*   lsb,
+                   FT_UShort*  aw );
+
+  FT_LOCAL( void )
+  TT_Get_VMetrics( TT_Face     face,
+                   FT_UInt     idx,
+                   FT_Short*   tsb,
+                   FT_UShort*  ah );
+
+  FT_LOCAL( FT_Error )
+  TT_Load_Glyph( TT_Size       size,
+                 TT_GlyphSlot  glyph,
+                 FT_UInt       glyph_index,
+                 FT_Int32      load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __TTGLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.c
new file mode 100644
index 0000000..559e632
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.c
@@ -0,0 +1,1532 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttgxvar.c                                                              */
+/*                                                                         */
+/*    TrueType GX Font Variation loader                                    */
+/*                                                                         */
+/*  Copyright 2004-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.     */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at      */
+  /*                                                                       */
+  /*   http://developer.apple.com/fonts/TTRefMan/RM06/Chap6[fgca]var.html  */
+  /*                                                                       */
+  /* The documentation for `fvar' is inconsistent.  At one point it says   */
+  /* that `countSizePairs' should be 3, at another point 2.  It should     */
+  /* be 2.                                                                 */
+  /*                                                                       */
+  /* The documentation for `gvar' is not intelligible; `cvar' refers you   */
+  /* to `gvar' and is thus also incomprehensible.                          */
+  /*                                                                       */
+  /* The documentation for `avar' appears correct, but Apple has no fonts  */
+  /* with an `avar' table, so it is hard to test.                          */
+  /*                                                                       */
+  /* Many thanks to John Jenkins (at Apple) in figuring this out.          */
+  /*                                                                       */
+  /*                                                                       */
+  /* Apple's `kern' table has some references to tuple indices, but as     */
+  /* there is no indication where these indices are defined, nor how to    */
+  /* interpolate the kerning values (different tuples have different       */
+  /* classes) this issue is ignored.                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ftmm.h"
+
+#include "ttpload.h"
+#include "ttgxvar.h"
+
+#include "tterrors.h"
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+
+#define FT_Stream_FTell( stream )  \
+          (FT_ULong)( (stream)->cursor - (stream)->base )
+#define FT_Stream_SeekSet( stream, off ) \
+          ( (stream)->cursor = (stream)->base + (off) )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttgxvar
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       Internal Routines                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'.  It        */
+  /* indicates that there is a delta for every point without needing to    */
+  /* enumerate all of them.                                                */
+  /*                                                                       */
+
+  /* ensure that value `0' has the same width as a pointer */
+#define ALL_POINTS  (FT_UShort*)~(FT_PtrDist)0
+
+
+#define GX_PT_POINTS_ARE_WORDS      0x80
+#define GX_PT_POINT_RUN_COUNT_MASK  0x7F
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_var_readpackedpoints                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Read a set of points to which the following deltas will apply.     */
+  /*    Points are packed with a run length encoding.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream    :: The data stream.                                      */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    point_cnt :: The number of points read.  A zero value means that   */
+  /*                 all points in the glyph will be affected, without     */
+  /*                 enumerating them individually.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    An array of FT_UShort containing the affected points or the        */
+  /*    special value ALL_POINTS.                                          */
+  /*                                                                       */
+  static FT_UShort*
+  ft_var_readpackedpoints( FT_Stream  stream,
+                           FT_UInt   *point_cnt )
+  {
+    FT_UShort *points = NULL;
+    FT_Int     n;
+    FT_Int     runcnt;
+    FT_Int     i;
+    FT_Int     j;
+    FT_Int     first;
+    FT_Memory  memory = stream->memory;
+    FT_Error   error  = FT_Err_Ok;
+
+    FT_UNUSED( error );
+
+
+    *point_cnt = n = FT_GET_BYTE();
+    if ( n == 0 )
+      return ALL_POINTS;
+
+    if ( n & GX_PT_POINTS_ARE_WORDS )
+      n = FT_GET_BYTE() | ( ( n & GX_PT_POINT_RUN_COUNT_MASK ) << 8 );
+
+    if ( FT_NEW_ARRAY( points, n ) )
+      return NULL;
+
+    i = 0;
+    while ( i < n )
+    {
+      runcnt = FT_GET_BYTE();
+      if ( runcnt & GX_PT_POINTS_ARE_WORDS )
+      {
+        runcnt = runcnt & GX_PT_POINT_RUN_COUNT_MASK;
+        first  = points[i++] = FT_GET_USHORT();
+
+        if ( runcnt < 1 || i + runcnt >= n )
+          goto Exit;
+
+        /* first point not included in runcount */
+        for ( j = 0; j < runcnt; ++j )
+          points[i++] = (FT_UShort)( first += FT_GET_USHORT() );
+      }
+      else
+      {
+        first = points[i++] = FT_GET_BYTE();
+
+        if ( runcnt < 1 || i + runcnt >= n )
+          goto Exit;
+
+        for ( j = 0; j < runcnt; ++j )
+          points[i++] = (FT_UShort)( first += FT_GET_BYTE() );
+      }
+    }
+
+  Exit:
+    return points;
+  }
+
+
+  enum
+  {
+    GX_DT_DELTAS_ARE_ZERO      = 0x80,
+    GX_DT_DELTAS_ARE_WORDS     = 0x40,
+    GX_DT_DELTA_RUN_COUNT_MASK = 0x3F
+  };
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_var_readpackeddeltas                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Read a set of deltas.  These are packed slightly differently than  */
+  /*    points.  In particular there is no overall count.                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream    :: The data stream.                                      */
+  /*                                                                       */
+  /*    delta_cnt :: The number of to be read.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    An array of FT_Short containing the deltas for the affected        */
+  /*    points.  (This only gets the deltas for one dimension.  It will    */
+  /*    generally be called twice, once for x, once for y.  When used in   */
+  /*    cvt table, it will only be called once.)                           */
+  /*                                                                       */
+  static FT_Short*
+  ft_var_readpackeddeltas( FT_Stream  stream,
+                           FT_Offset  delta_cnt )
+  {
+    FT_Short  *deltas = NULL;
+    FT_UInt    runcnt;
+    FT_Offset  i;
+    FT_UInt    j;
+    FT_Memory  memory = stream->memory;
+    FT_Error   error  = FT_Err_Ok;
+
+    FT_UNUSED( error );
+
+
+    if ( FT_NEW_ARRAY( deltas, delta_cnt ) )
+      return NULL;
+
+    i = 0;
+    while ( i < delta_cnt )
+    {
+      runcnt = FT_GET_BYTE();
+      if ( runcnt & GX_DT_DELTAS_ARE_ZERO )
+      {
+        /* runcnt zeroes get added */
+        for ( j = 0;
+              j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;
+              ++j )
+          deltas[i++] = 0;
+      }
+      else if ( runcnt & GX_DT_DELTAS_ARE_WORDS )
+      {
+        /* runcnt shorts from the stack */
+        for ( j = 0;
+              j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;
+              ++j )
+          deltas[i++] = FT_GET_SHORT();
+      }
+      else
+      {
+        /* runcnt signed bytes from the stack */
+        for ( j = 0;
+              j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;
+              ++j )
+          deltas[i++] = FT_GET_CHAR();
+      }
+
+      if ( j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) )
+      {
+        /* Bad format */
+        FT_FREE( deltas );
+        return NULL;
+      }
+    }
+
+    return deltas;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_var_load_avar                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parse the `avar' table if present.  It need not be, so we return   */
+  /*    nothing.                                                           */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face :: The font face.                                             */
+  /*                                                                       */
+  static void
+  ft_var_load_avar( TT_Face  face )
+  {
+    FT_Stream       stream = FT_FACE_STREAM(face);
+    FT_Memory       memory = stream->memory;
+    GX_Blend        blend  = face->blend;
+    GX_AVarSegment  segment;
+    FT_Error        error = FT_Err_Ok;
+    FT_ULong        version;
+    FT_Long         axisCount;
+    FT_Int          i, j;
+    FT_ULong        table_len;
+
+    FT_UNUSED( error );
+
+
+    blend->avar_checked = TRUE;
+    if ( (error = face->goto_table( face, TTAG_avar, stream, &table_len )) != 0 )
+      return;
+
+    if ( FT_FRAME_ENTER( table_len ) )
+      return;
+
+    version   = FT_GET_LONG();
+    axisCount = FT_GET_LONG();
+
+    if ( version != 0x00010000L                       ||
+         axisCount != (FT_Long)blend->mmvar->num_axis )
+      goto Exit;
+
+    if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) )
+      goto Exit;
+
+    segment = &blend->avar_segment[0];
+    for ( i = 0; i < axisCount; ++i, ++segment )
+    {
+      segment->pairCount = FT_GET_USHORT();
+      if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) )
+      {
+        /* Failure.  Free everything we have done so far.  We must do */
+        /* it right now since loading the `avar' table is optional.   */
+
+        for ( j = i - 1; j >= 0; --j )
+          FT_FREE( blend->avar_segment[j].correspondence );
+
+        FT_FREE( blend->avar_segment );
+        blend->avar_segment = NULL;
+        goto Exit;
+      }
+
+      for ( j = 0; j < segment->pairCount; ++j )
+      {
+        segment->correspondence[j].fromCoord =
+          FT_GET_SHORT() << 2;    /* convert to Fixed */
+        segment->correspondence[j].toCoord =
+          FT_GET_SHORT()<<2;    /* convert to Fixed */
+      }
+    }
+
+  Exit:
+    FT_FRAME_EXIT();
+  }
+
+
+  typedef struct  GX_GVar_Head_
+  {
+    FT_Long    version;
+    FT_UShort  axisCount;
+    FT_UShort  globalCoordCount;
+    FT_ULong   offsetToCoord;
+    FT_UShort  glyphCount;
+    FT_UShort  flags;
+    FT_ULong   offsetToData;
+
+  } GX_GVar_Head;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_var_load_gvar                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parses the `gvar' table if present.  If `fvar' is there, `gvar'    */
+  /*    had better be there too.                                           */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face :: The font face.                                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  ft_var_load_gvar( TT_Face  face )
+  {
+    FT_Stream     stream = FT_FACE_STREAM(face);
+    FT_Memory     memory = stream->memory;
+    GX_Blend      blend  = face->blend;
+    FT_Error      error;
+    FT_UInt       i, j;
+    FT_ULong      table_len;
+    FT_ULong      gvar_start;
+    FT_ULong      offsetToData;
+    GX_GVar_Head  gvar_head;
+
+    static const FT_Frame_Field  gvar_fields[] =
+    {
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  GX_GVar_Head
+
+      FT_FRAME_START( 20 ),
+        FT_FRAME_LONG  ( version ),
+        FT_FRAME_USHORT( axisCount ),
+        FT_FRAME_USHORT( globalCoordCount ),
+        FT_FRAME_ULONG ( offsetToCoord ),
+        FT_FRAME_USHORT( glyphCount ),
+        FT_FRAME_USHORT( flags ),
+        FT_FRAME_ULONG ( offsetToData ),
+      FT_FRAME_END
+    };
+
+    if ( (error = face->goto_table( face, TTAG_gvar, stream, &table_len )) != 0 )
+      goto Exit;
+
+    gvar_start = FT_STREAM_POS( );
+    if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) )
+      goto Exit;
+
+    blend->tuplecount  = gvar_head.globalCoordCount;
+    blend->gv_glyphcnt = gvar_head.glyphCount;
+    offsetToData       = gvar_start + gvar_head.offsetToData;
+
+    if ( gvar_head.version   != (FT_Long)0x00010000L              ||
+         gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis )
+    {
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) )
+      goto Exit;
+
+    if ( gvar_head.flags & 1 )
+    {
+      /* long offsets (one more offset than glyphs, to mark size of last) */
+      if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) )
+        goto Exit;
+
+      for ( i = 0; i <= blend->gv_glyphcnt; ++i )
+        blend->glyphoffsets[i] = offsetToData + FT_GET_LONG();
+
+      FT_FRAME_EXIT();
+    }
+    else
+    {
+      /* short offsets (one more offset than glyphs, to mark size of last) */
+      if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) )
+        goto Exit;
+
+      for ( i = 0; i <= blend->gv_glyphcnt; ++i )
+        blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2;
+                                              /* XXX: Undocumented: `*2'! */
+
+      FT_FRAME_EXIT();
+    }
+
+    if ( blend->tuplecount != 0 )
+    {
+      if ( FT_NEW_ARRAY( blend->tuplecoords,
+                         gvar_head.axisCount * blend->tuplecount ) )
+        goto Exit;
+
+      if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord )       ||
+           FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L )                   )
+        goto Exit;
+
+      for ( i = 0; i < blend->tuplecount; ++i )
+        for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; ++j )
+          blend->tuplecoords[i * gvar_head.axisCount + j] =
+            FT_GET_SHORT() << 2;                /* convert to FT_Fixed */
+
+      FT_FRAME_EXIT();
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_var_apply_tuple                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Figure out whether a given tuple (design) applies to the current   */
+  /*    blend, and if so, what is the scaling factor.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    blend           :: The current blend of the font.                  */
+  /*                                                                       */
+  /*    tupleIndex      :: A flag saying whether this is an intermediate   */
+  /*                       tuple or not.                                   */
+  /*                                                                       */
+  /*    tuple_coords    :: The coordinates of the tuple in normalized axis */
+  /*                       units.                                          */
+  /*                                                                       */
+  /*    im_start_coords :: The initial coordinates where this tuple starts */
+  /*                       to apply (for intermediate coordinates).        */
+  /*                                                                       */
+  /*    im_end_coords   :: The final coordinates after which this tuple no */
+  /*                       longer applies (for intermediate coordinates).  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    An FT_Fixed value containing the scaling factor.                   */
+  /*                                                                       */
+  static FT_Fixed
+  ft_var_apply_tuple( GX_Blend   blend,
+                      FT_UShort  tupleIndex,
+                      FT_Fixed*  tuple_coords,
+                      FT_Fixed*  im_start_coords,
+                      FT_Fixed*  im_end_coords )
+  {
+    FT_UInt   i;
+    FT_Fixed  apply = 0x10000L;
+
+
+    for ( i = 0; i < blend->num_axis; ++i )
+    {
+      if ( tuple_coords[i] == 0 )
+        /* It's not clear why (for intermediate tuples) we don't need     */
+        /* to check against start/end -- the documentation says we don't. */
+        /* Similarly, it's unclear why we don't need to scale along the   */
+        /* axis.                                                          */
+        continue;
+
+      else if ( blend->normalizedcoords[i] == 0                           ||
+                ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) ||
+                ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) )
+      {
+        apply = 0;
+        break;
+      }
+
+      else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )
+        /* not an intermediate tuple */
+        apply = FT_MulFix( apply,
+                           blend->normalizedcoords[i] > 0
+                             ? blend->normalizedcoords[i]
+                             : -blend->normalizedcoords[i] );
+
+      else if ( blend->normalizedcoords[i] <= im_start_coords[i] ||
+                blend->normalizedcoords[i] >= im_end_coords[i]   )
+      {
+        apply = 0;
+        break;
+      }
+
+      else if ( blend->normalizedcoords[i] < tuple_coords[i] )
+        apply = FT_MulDiv( apply,
+                           blend->normalizedcoords[i] - im_start_coords[i],
+                           tuple_coords[i] - im_start_coords[i] );
+
+      else
+        apply = FT_MulDiv( apply,
+                           im_end_coords[i] - blend->normalizedcoords[i],
+                           im_end_coords[i] - tuple_coords[i] );
+    }
+
+    return apply;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****               MULTIPLE MASTERS SERVICE FUNCTIONS              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct  GX_FVar_Head_
+  {
+    FT_Long    version;
+    FT_UShort  offsetToData;
+    FT_UShort  countSizePairs;
+    FT_UShort  axisCount;
+    FT_UShort  axisSize;
+    FT_UShort  instanceCount;
+    FT_UShort  instanceSize;
+
+  } GX_FVar_Head;
+
+
+  typedef struct  fvar_axis_
+  {
+    FT_ULong   axisTag;
+    FT_ULong   minValue;
+    FT_ULong   defaultValue;
+    FT_ULong   maxValue;
+    FT_UShort  flags;
+    FT_UShort  nameID;
+
+  } GX_FVar_Axis;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Get_MM_Var                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Check that the font's `fvar' table is valid, parse it, and return  */
+  /*    those data.                                                        */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: The font face.                                           */
+  /*              TT_Get_MM_Var initializes the blend structure.           */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    master :: The `fvar' data (must be freed by caller).               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Get_MM_Var( TT_Face      face,
+                 FT_MM_Var*  *master )
+  {
+    FT_Stream            stream = face->root.stream;
+    FT_Memory            memory = face->root.memory;
+    FT_ULong             table_len;
+    FT_Error             error  = FT_Err_Ok;
+    FT_ULong             fvar_start;
+    FT_Int               i, j;
+    FT_MM_Var*           mmvar = NULL;
+    FT_Fixed*            next_coords;
+    FT_String*           next_name;
+    FT_Var_Axis*         a;
+    FT_Var_Named_Style*  ns;
+    GX_FVar_Head         fvar_head;
+
+    static const FT_Frame_Field  fvar_fields[] =
+    {
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  GX_FVar_Head
+
+      FT_FRAME_START( 16 ),
+        FT_FRAME_LONG  ( version ),
+        FT_FRAME_USHORT( offsetToData ),
+        FT_FRAME_USHORT( countSizePairs ),
+        FT_FRAME_USHORT( axisCount ),
+        FT_FRAME_USHORT( axisSize ),
+        FT_FRAME_USHORT( instanceCount ),
+        FT_FRAME_USHORT( instanceSize ),
+      FT_FRAME_END
+    };
+
+    static const FT_Frame_Field  fvaraxis_fields[] =
+    {
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  GX_FVar_Axis
+
+      FT_FRAME_START( 20 ),
+        FT_FRAME_ULONG ( axisTag ),
+        FT_FRAME_ULONG ( minValue ),
+        FT_FRAME_ULONG ( defaultValue ),
+        FT_FRAME_ULONG ( maxValue ),
+        FT_FRAME_USHORT( flags ),
+        FT_FRAME_USHORT( nameID ),
+      FT_FRAME_END
+    };
+
+
+    if ( face->blend == NULL )
+    {
+      /* both `fvar' and `gvar' must be present */
+      if ( (error = face->goto_table( face, TTAG_gvar,
+                                      stream, &table_len )) != 0 )
+        goto Exit;
+
+      if ( (error = face->goto_table( face, TTAG_fvar,
+                                      stream, &table_len )) != 0 )
+        goto Exit;
+
+      fvar_start = FT_STREAM_POS( );
+
+      if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) )
+        goto Exit;
+
+      if ( fvar_head.version != (FT_Long)0x00010000L                      ||
+           fvar_head.countSizePairs != 2                                  ||
+           fvar_head.axisSize != 20                                       ||
+           /* axisCount limit implied by 16-bit instanceSize */
+           fvar_head.axisCount > 0x3FFE                                   ||
+           fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount          ||
+           /* instanceCount limit implied by limited range of name IDs */
+           fvar_head.instanceCount > 0x7EFF                               ||
+           fvar_head.offsetToData + fvar_head.axisCount * 20U +
+             fvar_head.instanceCount * fvar_head.instanceSize > table_len )
+      {
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
+      }
+
+      if ( FT_NEW( face->blend ) )
+        goto Exit;
+
+      /* cannot overflow 32-bit arithmetic because of limits above */
+      face->blend->mmvar_len =
+        sizeof ( FT_MM_Var ) +
+        fvar_head.axisCount * sizeof ( FT_Var_Axis ) +
+        fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) +
+        fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) +
+        5 * fvar_head.axisCount;
+
+      if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
+        goto Exit;
+      face->blend->mmvar = mmvar;
+
+      mmvar->num_axis =
+        fvar_head.axisCount;
+      mmvar->num_designs =
+        ~0U;                   /* meaningless in this context; each glyph */
+                               /* may have a different number of designs  */
+                               /* (or tuples, as called by Apple)         */
+      mmvar->num_namedstyles =
+        fvar_head.instanceCount;
+      mmvar->axis =
+        (FT_Var_Axis*)&(mmvar[1]);
+      mmvar->namedstyle =
+        (FT_Var_Named_Style*)&(mmvar->axis[fvar_head.axisCount]);
+
+      next_coords =
+        (FT_Fixed*)&(mmvar->namedstyle[fvar_head.instanceCount]);
+      for ( i = 0; i < fvar_head.instanceCount; ++i )
+      {
+        mmvar->namedstyle[i].coords  = next_coords;
+        next_coords                 += fvar_head.axisCount;
+      }
+
+      next_name = (FT_String*)next_coords;
+      for ( i = 0; i < fvar_head.axisCount; ++i )
+      {
+        mmvar->axis[i].name  = next_name;
+        next_name           += 5;
+      }
+
+      if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) )
+        goto Exit;
+
+      a = mmvar->axis;
+      for ( i = 0; i < fvar_head.axisCount; ++i )
+      {
+        GX_FVar_Axis  axis_rec;
+
+
+        if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) )
+          goto Exit;
+        a->tag     = axis_rec.axisTag;
+        a->minimum = axis_rec.minValue;     /* A Fixed */
+        a->def     = axis_rec.defaultValue; /* A Fixed */
+        a->maximum = axis_rec.maxValue;     /* A Fixed */
+        a->strid   = axis_rec.nameID;
+
+        a->name[0] = (FT_String)(   a->tag >> 24 );
+        a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF );
+        a->name[2] = (FT_String)( ( a->tag >>  8 ) & 0xFF );
+        a->name[3] = (FT_String)( ( a->tag       ) & 0xFF );
+        a->name[4] = 0;
+
+        ++a;
+      }
+
+      ns = mmvar->namedstyle;
+      for ( i = 0; i < fvar_head.instanceCount; ++i, ++ns )
+      {
+        if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) )
+          goto Exit;
+
+        ns->strid       =    FT_GET_USHORT();
+        (void) /* flags = */ FT_GET_USHORT();
+
+        for ( j = 0; j < fvar_head.axisCount; ++j )
+          ns->coords[j] = FT_GET_ULONG();     /* A Fixed */
+
+        FT_FRAME_EXIT();
+      }
+    }
+
+    if ( master != NULL )
+    {
+      FT_UInt  n;
+
+
+      if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
+        goto Exit;
+      FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len );
+
+      mmvar->axis =
+        (FT_Var_Axis*)&(mmvar[1]);
+      mmvar->namedstyle =
+        (FT_Var_Named_Style*)&(mmvar->axis[mmvar->num_axis]);
+      next_coords =
+        (FT_Fixed*)&(mmvar->namedstyle[mmvar->num_namedstyles]);
+
+      for ( n = 0; n < mmvar->num_namedstyles; ++n )
+      {
+        mmvar->namedstyle[n].coords  = next_coords;
+        next_coords                 += mmvar->num_axis;
+      }
+
+      a = mmvar->axis;
+      next_name = (FT_String*)next_coords;
+      for ( n = 0; n < mmvar->num_axis; ++n )
+      {
+        a->name = next_name;
+
+        /* standard PostScript names for some standard apple tags */
+        if ( a->tag == TTAG_wght )
+          a->name = (char *)"Weight";
+        else if ( a->tag == TTAG_wdth )
+          a->name = (char *)"Width";
+        else if ( a->tag == TTAG_opsz )
+          a->name = (char *)"OpticalSize";
+        else if ( a->tag == TTAG_slnt )
+          a->name = (char *)"Slant";
+
+        next_name += 5;
+        ++a;
+      }
+
+      *master = mmvar;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Set_MM_Blend                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set the blend (normalized) coordinates for this instance of the    */
+  /*    font.  Check that the `gvar' table is reasonable and does some     */
+  /*    initial preparation.                                               */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The font.                                            */
+  /*                  Initialize the blend structure with `gvar' data.     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: Must be the axis count of the font.                  */
+  /*                                                                       */
+  /*    coords     :: An array of num_coords, each between [-1,1].         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Set_MM_Blend( TT_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords )
+  {
+    FT_Error    error = FT_Err_Ok;
+    GX_Blend    blend;
+    FT_MM_Var*  mmvar;
+    FT_UInt     i;
+    FT_Memory   memory = face->root.memory;
+
+    enum
+    {
+      mcvt_retain,
+      mcvt_modify,
+      mcvt_load
+
+    } manageCvt;
+
+
+    face->doblend = FALSE;
+
+    if ( face->blend == NULL )
+    {
+      if ( (error = TT_Get_MM_Var( face, NULL)) != 0 )
+        goto Exit;
+    }
+
+    blend = face->blend;
+    mmvar = blend->mmvar;
+
+    if ( num_coords != mmvar->num_axis )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    for ( i = 0; i < num_coords; ++i )
+      if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L )
+      {
+        error = FT_THROW( Invalid_Argument );
+        goto Exit;
+      }
+
+    if ( blend->glyphoffsets == NULL )
+      if ( (error = ft_var_load_gvar( face )) != 0 )
+        goto Exit;
+
+    if ( blend->normalizedcoords == NULL )
+    {
+      if ( FT_NEW_ARRAY( blend->normalizedcoords, num_coords ) )
+        goto Exit;
+
+      manageCvt = mcvt_modify;
+
+      /* If we have not set the blend coordinates before this, then the  */
+      /* cvt table will still be what we read from the `cvt ' table and  */
+      /* we don't need to reload it.  We may need to change it though... */
+    }
+    else
+    {
+      manageCvt = mcvt_retain;
+      for ( i = 0; i < num_coords; ++i )
+      {
+        if ( blend->normalizedcoords[i] != coords[i] )
+        {
+          manageCvt = mcvt_load;
+          break;
+        }
+      }
+
+      /* If we don't change the blend coords then we don't need to do  */
+      /* anything to the cvt table.  It will be correct.  Otherwise we */
+      /* no longer have the original cvt (it was modified when we set  */
+      /* the blend last time), so we must reload and then modify it.   */
+    }
+
+    blend->num_axis = num_coords;
+    FT_MEM_COPY( blend->normalizedcoords,
+                 coords,
+                 num_coords * sizeof ( FT_Fixed ) );
+
+    face->doblend = TRUE;
+
+    if ( face->cvt != NULL )
+    {
+      switch ( manageCvt )
+      {
+      case mcvt_load:
+        /* The cvt table has been loaded already; every time we change the */
+        /* blend we may need to reload and remodify the cvt table.         */
+        FT_FREE( face->cvt );
+        face->cvt = NULL;
+
+        tt_face_load_cvt( face, face->root.stream );
+        break;
+
+      case mcvt_modify:
+        /* The original cvt table is in memory.  All we need to do is */
+        /* apply the `cvar' table (if any).                           */
+        tt_face_vary_cvt( face, face->root.stream );
+        break;
+
+      case mcvt_retain:
+        /* The cvt table is correct for this set of coordinates. */
+        break;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Set_Var_Design                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set the coordinates for the instance, measured in the user         */
+  /*    coordinate system.  Parse the `avar' table (if present) to convert */
+  /*    from user to normalized coordinates.                               */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The font face.                                       */
+  /*                  Initialize the blend struct with `gvar' data.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: This must be the axis count of the font.             */
+  /*                                                                       */
+  /*    coords     :: A coordinate array with `num_coords' elements.       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Set_Var_Design( TT_Face    face,
+                     FT_UInt    num_coords,
+                     FT_Fixed*  coords )
+  {
+    FT_Error        error      = FT_Err_Ok;
+    FT_Fixed*       normalized = NULL;
+    GX_Blend        blend;
+    FT_MM_Var*      mmvar;
+    FT_UInt         i, j;
+    FT_Var_Axis*    a;
+    GX_AVarSegment  av;
+    FT_Memory       memory = face->root.memory;
+
+
+    if ( face->blend == NULL )
+    {
+      if ( (error = TT_Get_MM_Var( face, NULL )) != 0 )
+        goto Exit;
+    }
+
+    blend = face->blend;
+    mmvar = blend->mmvar;
+
+    if ( num_coords != mmvar->num_axis )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    /* Axis normalization is a two stage process.  First we normalize */
+    /* based on the [min,def,max] values for the axis to be [-1,0,1]. */
+    /* Then, if there's an `avar' table, we renormalize this range.   */
+
+    if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) )
+      goto Exit;
+
+    a = mmvar->axis;
+    for ( i = 0; i < mmvar->num_axis; ++i, ++a )
+    {
+      if ( coords[i] > a->maximum || coords[i] < a->minimum )
+      {
+        error = FT_THROW( Invalid_Argument );
+        goto Exit;
+      }
+
+      if ( coords[i] < a->def )
+        normalized[i] = -FT_DivFix( coords[i] - a->def, a->minimum - a->def );
+      else if ( a->maximum == a->def )
+        normalized[i] = 0;
+      else
+        normalized[i] = FT_DivFix( coords[i] - a->def, a->maximum - a->def );
+    }
+
+    if ( !blend->avar_checked )
+      ft_var_load_avar( face );
+
+    if ( blend->avar_segment != NULL )
+    {
+      av = blend->avar_segment;
+      for ( i = 0; i < mmvar->num_axis; ++i, ++av )
+      {
+        for ( j = 1; j < (FT_UInt)av->pairCount; ++j )
+          if ( normalized[i] < av->correspondence[j].fromCoord )
+          {
+            normalized[i] =
+              FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord,
+                         av->correspondence[j].toCoord -
+                           av->correspondence[j - 1].toCoord,
+                         av->correspondence[j].fromCoord -
+                           av->correspondence[j - 1].fromCoord ) +
+              av->correspondence[j - 1].toCoord;
+            break;
+          }
+      }
+    }
+
+    error = TT_Set_MM_Blend( face, num_coords, normalized );
+
+  Exit:
+    FT_FREE( normalized );
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     GX VAR PARSING ROUTINES                   *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_vary_cvt                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Modify the loaded cvt table according to the `cvar' table and the  */
+  /*    font's blend.                                                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /*    Most errors are ignored.  It is perfectly valid not to have a      */
+  /*    `cvar' table even if there is a `gvar' and `fvar' table.           */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_vary_cvt( TT_Face    face,
+                    FT_Stream  stream )
+  {
+    FT_Error    error;
+    FT_Memory   memory = stream->memory;
+    FT_ULong    table_start;
+    FT_ULong    table_len;
+    FT_UInt     tupleCount;
+    FT_ULong    offsetToData;
+    FT_ULong    here;
+    FT_UInt     i, j;
+    FT_Fixed*   tuple_coords    = NULL;
+    FT_Fixed*   im_start_coords = NULL;
+    FT_Fixed*   im_end_coords   = NULL;
+    GX_Blend    blend           = face->blend;
+    FT_UInt     point_count;
+    FT_UShort*  localpoints;
+    FT_Short*   deltas;
+
+
+    FT_TRACE2(( "CVAR " ));
+
+    if ( blend == NULL )
+    {
+      FT_TRACE2(( "tt_face_vary_cvt: no blend specified\n" ));
+
+      error = FT_Err_Ok;
+      goto Exit;
+    }
+
+    if ( face->cvt == NULL )
+    {
+      FT_TRACE2(( "tt_face_vary_cvt: no `cvt ' table\n" ));
+
+      error = FT_Err_Ok;
+      goto Exit;
+    }
+
+    error = face->goto_table( face, TTAG_cvar, stream, &table_len );
+    if ( error )
+    {
+      FT_TRACE2(( "is missing\n" ));
+
+      error = FT_Err_Ok;
+      goto Exit;
+    }
+
+    if ( FT_FRAME_ENTER( table_len ) )
+    {
+      error = FT_Err_Ok;
+      goto Exit;
+    }
+
+    table_start = FT_Stream_FTell( stream );
+    if ( FT_GET_LONG() != 0x00010000L )
+    {
+      FT_TRACE2(( "bad table version\n" ));
+
+      error = FT_Err_Ok;
+      goto FExit;
+    }
+
+    if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis )    ||
+         FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||
+         FT_NEW_ARRAY( im_end_coords, blend->num_axis )   )
+      goto FExit;
+
+    tupleCount   = FT_GET_USHORT();
+    offsetToData = table_start + FT_GET_USHORT();
+
+    /* The documentation implies there are flags packed into the        */
+    /* tuplecount, but John Jenkins says that shared points don't apply */
+    /* to `cvar', and no other flags are defined.                       */
+
+    for ( i = 0; i < ( tupleCount & 0xFFF ); ++i )
+    {
+      FT_UInt   tupleDataSize;
+      FT_UInt   tupleIndex;
+      FT_Fixed  apply;
+
+
+      tupleDataSize = FT_GET_USHORT();
+      tupleIndex    = FT_GET_USHORT();
+
+      /* There is no provision here for a global tuple coordinate section, */
+      /* so John says.  There are no tuple indices, just embedded tuples.  */
+
+      if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
+      {
+        for ( j = 0; j < blend->num_axis; ++j )
+          tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from        */
+                                                 /* short frac to fixed */
+      }
+      else
+      {
+        /* skip this tuple; it makes no sense */
+
+        if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+          for ( j = 0; j < 2 * blend->num_axis; ++j )
+            (void)FT_GET_SHORT();
+
+        offsetToData += tupleDataSize;
+        continue;
+      }
+
+      if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+      {
+        for ( j = 0; j < blend->num_axis; ++j )
+          im_start_coords[j] = FT_GET_SHORT() << 2;
+        for ( j = 0; j < blend->num_axis; ++j )
+          im_end_coords[j] = FT_GET_SHORT() << 2;
+      }
+
+      apply = ft_var_apply_tuple( blend,
+                                  (FT_UShort)tupleIndex,
+                                  tuple_coords,
+                                  im_start_coords,
+                                  im_end_coords );
+      if ( /* tuple isn't active for our blend */
+           apply == 0                                    ||
+           /* global points not allowed,           */
+           /* if they aren't local, makes no sense */
+           !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) )
+      {
+        offsetToData += tupleDataSize;
+        continue;
+      }
+
+      here = FT_Stream_FTell( stream );
+
+      FT_Stream_SeekSet( stream, offsetToData );
+
+      localpoints = ft_var_readpackedpoints( stream, &point_count );
+      deltas      = ft_var_readpackeddeltas( stream,
+                                             point_count == 0 ? face->cvt_size
+                                                              : point_count );
+      if ( localpoints == NULL || deltas == NULL )
+        /* failure, ignore it */;
+
+      else if ( localpoints == ALL_POINTS )
+      {
+        /* this means that there are deltas for every entry in cvt */
+        for ( j = 0; j < face->cvt_size; ++j )
+          face->cvt[j] = (FT_Short)( face->cvt[j] +
+                                     FT_MulFix( deltas[j], apply ) );
+      }
+
+      else
+      {
+        for ( j = 0; j < point_count; ++j )
+        {
+          int  pindex = localpoints[j];
+
+          face->cvt[pindex] = (FT_Short)( face->cvt[pindex] +
+                                          FT_MulFix( deltas[j], apply ) );
+        }
+      }
+
+      if ( localpoints != ALL_POINTS )
+        FT_FREE( localpoints );
+      FT_FREE( deltas );
+
+      offsetToData += tupleDataSize;
+
+      FT_Stream_SeekSet( stream, here );
+    }
+
+  FExit:
+    FT_FRAME_EXIT();
+
+  Exit:
+    FT_FREE( tuple_coords );
+    FT_FREE( im_start_coords );
+    FT_FREE( im_end_coords );
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Vary_Get_Glyph_Deltas                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the appropriate deltas for the current glyph.                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to the target face object.                 */
+  /*                                                                       */
+  /*    glyph_index :: The index of the glyph being modified.              */
+  /*                                                                       */
+  /*    n_points    :: The number of the points in the glyph, including    */
+  /*                   phantom points.                                     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    deltas      :: The array of points to change.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Vary_Get_Glyph_Deltas( TT_Face      face,
+                            FT_UInt      glyph_index,
+                            FT_Vector*  *deltas,
+                            FT_UInt      n_points )
+  {
+    FT_Stream   stream = face->root.stream;
+    FT_Memory   memory = stream->memory;
+    GX_Blend    blend  = face->blend;
+    FT_Vector*  delta_xy = NULL;
+
+    FT_Error    error;
+    FT_ULong    glyph_start;
+    FT_UInt     tupleCount;
+    FT_ULong    offsetToData;
+    FT_ULong    here;
+    FT_UInt     i, j;
+    FT_Fixed*   tuple_coords    = NULL;
+    FT_Fixed*   im_start_coords = NULL;
+    FT_Fixed*   im_end_coords   = NULL;
+    FT_UInt     point_count, spoint_count = 0;
+    FT_UShort*  sharedpoints = NULL;
+    FT_UShort*  localpoints  = NULL;
+    FT_UShort*  points;
+    FT_Short    *deltas_x, *deltas_y;
+
+
+    if ( !face->doblend || blend == NULL )
+      return FT_THROW( Invalid_Argument );
+
+    /* to be freed by the caller */
+    if ( FT_NEW_ARRAY( delta_xy, n_points ) )
+      goto Exit;
+    *deltas = delta_xy;
+
+    if ( glyph_index >= blend->gv_glyphcnt      ||
+         blend->glyphoffsets[glyph_index] ==
+           blend->glyphoffsets[glyph_index + 1] )
+      return FT_Err_Ok;               /* no variation data for this glyph */
+
+    if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] )   ||
+         FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] -
+                           blend->glyphoffsets[glyph_index] ) )
+      goto Fail1;
+
+    glyph_start = FT_Stream_FTell( stream );
+
+    /* each set of glyph variation data is formatted similarly to `cvar' */
+    /* (except we get shared points and global tuples)                   */
+
+    if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis )    ||
+         FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||
+         FT_NEW_ARRAY( im_end_coords, blend->num_axis )   )
+      goto Fail2;
+
+    tupleCount   = FT_GET_USHORT();
+    offsetToData = glyph_start + FT_GET_USHORT();
+
+    if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS )
+    {
+      here = FT_Stream_FTell( stream );
+
+      FT_Stream_SeekSet( stream, offsetToData );
+
+      sharedpoints = ft_var_readpackedpoints( stream, &spoint_count );
+      offsetToData = FT_Stream_FTell( stream );
+
+      FT_Stream_SeekSet( stream, here );
+    }
+
+    for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); ++i )
+    {
+      FT_UInt   tupleDataSize;
+      FT_UInt   tupleIndex;
+      FT_Fixed  apply;
+
+
+      tupleDataSize = FT_GET_USHORT();
+      tupleIndex    = FT_GET_USHORT();
+
+      if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
+      {
+        for ( j = 0; j < blend->num_axis; ++j )
+          tuple_coords[j] = FT_GET_SHORT() << 2;  /* convert from        */
+                                                  /* short frac to fixed */
+      }
+      else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount )
+      {
+        error = FT_THROW( Invalid_Table );
+        goto Fail3;
+      }
+      else
+      {
+        FT_MEM_COPY(
+          tuple_coords,
+          &blend->tuplecoords[(tupleIndex & 0xFFF) * blend->num_axis],
+          blend->num_axis * sizeof ( FT_Fixed ) );
+      }
+
+      if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+      {
+        for ( j = 0; j < blend->num_axis; ++j )
+          im_start_coords[j] = FT_GET_SHORT() << 2;
+        for ( j = 0; j < blend->num_axis; ++j )
+          im_end_coords[j] = FT_GET_SHORT() << 2;
+      }
+
+      apply = ft_var_apply_tuple( blend,
+                                  (FT_UShort)tupleIndex,
+                                  tuple_coords,
+                                  im_start_coords,
+                                  im_end_coords );
+
+      if ( apply == 0 )              /* tuple isn't active for our blend */
+      {
+        offsetToData += tupleDataSize;
+        continue;
+      }
+
+      here = FT_Stream_FTell( stream );
+
+      if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS )
+      {
+        FT_Stream_SeekSet( stream, offsetToData );
+
+        localpoints = ft_var_readpackedpoints( stream, &point_count );
+        points      = localpoints;
+      }
+      else
+      {
+        points      = sharedpoints;
+        point_count = spoint_count;
+      }
+
+      deltas_x = ft_var_readpackeddeltas( stream,
+                                          point_count == 0 ? n_points
+                                                           : point_count );
+      deltas_y = ft_var_readpackeddeltas( stream,
+                                          point_count == 0 ? n_points
+                                                           : point_count );
+
+      if ( points == NULL || deltas_y == NULL || deltas_x == NULL )
+        ; /* failure, ignore it */
+
+      else if ( points == ALL_POINTS )
+      {
+        /* this means that there are deltas for every point in the glyph */
+        for ( j = 0; j < n_points; ++j )
+        {
+          delta_xy[j].x += FT_MulFix( deltas_x[j], apply );
+          delta_xy[j].y += FT_MulFix( deltas_y[j], apply );
+        }
+      }
+
+      else
+      {
+        for ( j = 0; j < point_count; ++j )
+        {
+          if ( localpoints[j] >= n_points )
+            continue;
+
+          delta_xy[localpoints[j]].x += FT_MulFix( deltas_x[j], apply );
+          delta_xy[localpoints[j]].y += FT_MulFix( deltas_y[j], apply );
+        }
+      }
+
+      if ( localpoints != ALL_POINTS )
+        FT_FREE( localpoints );
+      FT_FREE( deltas_x );
+      FT_FREE( deltas_y );
+
+      offsetToData += tupleDataSize;
+
+      FT_Stream_SeekSet( stream, here );
+    }
+
+  Fail3:
+    FT_FREE( tuple_coords );
+    FT_FREE( im_start_coords );
+    FT_FREE( im_end_coords );
+
+  Fail2:
+    FT_FRAME_EXIT();
+
+  Fail1:
+    if ( error )
+    {
+      FT_FREE( delta_xy );
+      *deltas = NULL;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_done_blend                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Frees the blend internal data structure.                           */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_done_blend( FT_Memory  memory,
+                 GX_Blend   blend )
+  {
+    if ( blend != NULL )
+    {
+      FT_UInt  i;
+
+
+      FT_FREE( blend->normalizedcoords );
+      FT_FREE( blend->mmvar );
+
+      if ( blend->avar_segment != NULL )
+      {
+        for ( i = 0; i < blend->num_axis; ++i )
+          FT_FREE( blend->avar_segment[i].correspondence );
+        FT_FREE( blend->avar_segment );
+      }
+
+      FT_FREE( blend->tuplecoords );
+      FT_FREE( blend->glyphoffsets );
+      FT_FREE( blend );
+    }
+  }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.h
new file mode 100644
index 0000000..72fe953
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.h
@@ -0,0 +1,182 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttgxvar.h                                                              */
+/*                                                                         */
+/*    TrueType GX Font Variation loader (specification)                    */
+/*                                                                         */
+/*  Copyright 2004 by                                                      */
+/*  David Turner, Robert Wilhelm, Werner Lemberg and George Williams.      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTGXVAR_H__
+#define __TTGXVAR_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    GX_AVarCorrespondenceRec                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A data structure representing `shortFracCorrespondence' in `avar'  */
+  /*    table according to the specifications from Apple.                  */
+  /*                                                                       */
+  typedef struct  GX_AVarCorrespondenceRec_
+  {
+    FT_Fixed  fromCoord;
+    FT_Fixed  toCoord;
+
+  } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    GX_AVarRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Data from the segment field of `avar' table.                       */
+  /*    There is one of these for each axis.                               */
+  /*                                                                       */
+  typedef struct  GX_AVarSegmentRec_
+  {
+    FT_UShort              pairCount;
+    GX_AVarCorrespondence  correspondence; /* array with pairCount entries */
+
+  } GX_AVarSegmentRec, *GX_AVarSegment;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    GX_BlendRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Data for interpolating a font from a distortable font specified    */
+  /*    by the GX *var tables ([fgca]var).                                 */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_axis         :: The number of axes along which interpolation   */
+  /*                         may happen                                    */
+  /*                                                                       */
+  /*    normalizedcoords :: A normalized value (between [-1,1]) indicating */
+  /*                        the contribution along each axis to the final  */
+  /*                        interpolated font.                             */
+  /*                                                                       */
+  typedef struct  GX_BlendRec_
+  {
+    FT_UInt         num_axis;
+    FT_Fixed*       normalizedcoords;
+
+    FT_MM_Var*      mmvar;
+    FT_Offset       mmvar_len;
+
+    FT_Bool         avar_checked;
+    GX_AVarSegment  avar_segment;
+
+    FT_UInt         tuplecount;      /* shared tuples in `gvar'           */
+    FT_Fixed*       tuplecoords;     /* tuplecoords[tuplecount][num_axis] */
+
+    FT_UInt         gv_glyphcnt;
+    FT_ULong*       glyphoffsets;
+
+  } GX_BlendRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <enum>                                                                */
+  /*    GX_TupleCountFlags                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Flags used within the `TupleCount' field of the `gvar' table.      */
+  /*                                                                       */
+  typedef enum  GX_TupleCountFlags_
+  {
+    GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000,
+    GX_TC_RESERVED_TUPLE_FLAGS       = 0x7000,
+    GX_TC_TUPLE_COUNT_MASK           = 0x0FFF
+
+  } GX_TupleCountFlags;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <enum>                                                                */
+  /*    GX_TupleIndexFlags                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Flags used within the `TupleIndex' field of the `gvar' and `cvar'  */
+  /*    tables.                                                            */
+  /*                                                                       */
+  typedef enum  GX_TupleIndexFlags_
+  {
+    GX_TI_EMBEDDED_TUPLE_COORD  = 0x8000,
+    GX_TI_INTERMEDIATE_TUPLE    = 0x4000,
+    GX_TI_PRIVATE_POINT_NUMBERS = 0x2000,
+    GX_TI_RESERVED_TUPLE_FLAG   = 0x1000,
+    GX_TI_TUPLE_INDEX_MASK      = 0x0FFF
+
+  } GX_TupleIndexFlags;
+
+
+#define TTAG_wght  FT_MAKE_TAG( 'w', 'g', 'h', 't' )
+#define TTAG_wdth  FT_MAKE_TAG( 'w', 'd', 't', 'h' )
+#define TTAG_opsz  FT_MAKE_TAG( 'o', 'p', 's', 'z' )
+#define TTAG_slnt  FT_MAKE_TAG( 's', 'l', 'n', 't' )
+
+
+  FT_LOCAL( FT_Error )
+  TT_Set_MM_Blend( TT_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords );
+
+  FT_LOCAL( FT_Error )
+  TT_Set_Var_Design( TT_Face    face,
+                     FT_UInt    num_coords,
+                     FT_Fixed*  coords );
+
+  FT_LOCAL( FT_Error )
+  TT_Get_MM_Var( TT_Face      face,
+                 FT_MM_Var*  *master );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_vary_cvt( TT_Face    face,
+                    FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  TT_Vary_Get_Glyph_Deltas( TT_Face      face,
+                            FT_UInt      glyph_index,
+                            FT_Vector*  *deltas,
+                            FT_UInt      n_points );
+
+
+  FT_LOCAL( void )
+  tt_done_blend( FT_Memory  memory,
+                 GX_Blend   blend );
+
+
+FT_END_HEADER
+
+
+#endif /* __TTGXVAR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.c
new file mode 100644
index 0000000..b7d2b62
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.c
@@ -0,0 +1,8952 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttinterp.c                                                             */
+/*                                                                         */
+/*    TrueType bytecode interpreter (body).                                */
+/*                                                                         */
+/*  Copyright 1996-2013                                                    */
+/*  by David Turner, Robert Wilhelm, and Werner Lemberg.                   */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */
+/* issues; many thanks!                                                */
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/fttrigon.h"
+#include "../../include/freetype/ftsystem.h"
+#include "../../include/freetype/ftttdrv.h"
+
+#include "ttinterp.h"
+#include "tterrors.h"
+#include "ttsubpix.h"
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttinterp
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* In order to detect infinite loops in the code, we set up a counter    */
+  /* within the run loop.  A single stroke of interpretation is now        */
+  /* limited to a maximum number of opcodes defined below.                 */
+  /*                                                                       */
+#define MAX_RUNNABLE_OPCODES  1000000L
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* There are two kinds of implementations:                               */
+  /*                                                                       */
+  /* a. static implementation                                              */
+  /*                                                                       */
+  /*    The current execution context is a static variable, which fields   */
+  /*    are accessed directly by the interpreter during execution.  The    */
+  /*    context is named `cur'.                                            */
+  /*                                                                       */
+  /*    This version is non-reentrant, of course.                          */
+  /*                                                                       */
+  /* b. indirect implementation                                            */
+  /*                                                                       */
+  /*    The current execution context is passed to _each_ function as its  */
+  /*    first argument, and each field is thus accessed indirectly.        */
+  /*                                                                       */
+  /*    This version is fully re-entrant.                                  */
+  /*                                                                       */
+  /* The idea is that an indirect implementation may be slower to execute  */
+  /* on low-end processors that are used in some systems (like 386s or     */
+  /* even 486s).                                                           */
+  /*                                                                       */
+  /* As a consequence, the indirect implementation is now the default, as  */
+  /* its performance costs can be considered negligible in our context.    */
+  /* Note, however, that we kept the same source with macros because:      */
+  /*                                                                       */
+  /* - The code is kept very close in design to the Pascal code used for   */
+  /*   development.                                                        */
+  /*                                                                       */
+  /* - It's much more readable that way!                                   */
+  /*                                                                       */
+  /* - It's still open to experimentation and tuning.                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER     /* indirect implementation */
+
+#define CUR  (*exc)                             /* see ttobjs.h */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This macro is used whenever `exec' is unused in a function, to avoid  */
+  /* stupid warnings from pedantic compilers.                              */
+  /*                                                                       */
+#define FT_UNUSED_EXEC  FT_UNUSED( exc )
+
+#else                                           /* static implementation */
+
+#define CUR  cur
+
+#define FT_UNUSED_EXEC  int  __dummy = __dummy
+
+  static
+  TT_ExecContextRec  cur;   /* static exec. context variable */
+
+  /* apparently, we have a _lot_ of direct indexing when accessing  */
+  /* the static `cur', which makes the code bigger (due to all the  */
+  /* four bytes addresses).                                         */
+
+#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The instruction argument stack.                                       */
+  /*                                                                       */
+#define INS_ARG  EXEC_OP_ FT_Long*  args    /* see ttobjs.h for EXEC_OP_ */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This macro is used whenever `args' is unused in a function, to avoid  */
+  /* stupid warnings from pedantic compilers.                              */
+  /*                                                                       */
+#define FT_UNUSED_ARG  FT_UNUSED_EXEC; FT_UNUSED( args )
+
+
+#define SUBPIXEL_HINTING                                                    \
+          ( ((TT_Driver)FT_FACE_DRIVER( CUR.face ))->interpreter_version == \
+            TT_INTERPRETER_VERSION_38 )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to        */
+  /* increase readability of the code.                                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#define SKIP_Code() \
+          SkipCode( EXEC_ARG )
+
+#define GET_ShortIns() \
+          GetShortIns( EXEC_ARG )
+
+#define NORMalize( x, y, v ) \
+          Normalize( EXEC_ARG_ x, y, v )
+
+#define SET_SuperRound( scale, flags ) \
+          SetSuperRound( EXEC_ARG_ scale, flags )
+
+#define ROUND_None( d, c ) \
+          Round_None( EXEC_ARG_ d, c )
+
+#define INS_Goto_CodeRange( range, ip ) \
+          Ins_Goto_CodeRange( EXEC_ARG_ range, ip )
+
+#define CUR_Func_move( z, p, d ) \
+          CUR.func_move( EXEC_ARG_ z, p, d )
+
+#define CUR_Func_move_orig( z, p, d ) \
+          CUR.func_move_orig( EXEC_ARG_ z, p, d )
+
+#define CUR_Func_round( d, c ) \
+          CUR.func_round( EXEC_ARG_ d, c )
+
+#define CUR_Func_read_cvt( index ) \
+          CUR.func_read_cvt( EXEC_ARG_ index )
+
+#define CUR_Func_write_cvt( index, val ) \
+          CUR.func_write_cvt( EXEC_ARG_ index, val )
+
+#define CUR_Func_move_cvt( index, val ) \
+          CUR.func_move_cvt( EXEC_ARG_ index, val )
+
+#define CURRENT_Ratio() \
+          Current_Ratio( EXEC_ARG )
+
+#define CURRENT_Ppem() \
+          Current_Ppem( EXEC_ARG )
+
+#define CUR_Ppem() \
+          Cur_PPEM( EXEC_ARG )
+
+#define INS_SxVTL( a, b, c, d ) \
+          Ins_SxVTL( EXEC_ARG_ a, b, c, d )
+
+#define COMPUTE_Funcs() \
+          Compute_Funcs( EXEC_ARG )
+
+#define COMPUTE_Round( a ) \
+          Compute_Round( EXEC_ARG_ a )
+
+#define COMPUTE_Point_Displacement( a, b, c, d ) \
+          Compute_Point_Displacement( EXEC_ARG_ a, b, c, d )
+
+#define MOVE_Zp2_Point( a, b, c, t ) \
+          Move_Zp2_Point( EXEC_ARG_ a, b, c, t )
+
+
+#define CUR_Func_project( v1, v2 )  \
+          CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
+
+#define CUR_Func_dualproj( v1, v2 )  \
+          CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
+
+#define CUR_fast_project( v ) \
+          CUR.func_project( EXEC_ARG_ (v)->x, (v)->y )
+
+#define CUR_fast_dualproj( v ) \
+          CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Instruction dispatch function, as used by the interpreter.            */
+  /*                                                                       */
+  typedef void  (*TInstruction_Function)( INS_ARG );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Two simple bounds-checking macros.                                    */
+  /*                                                                       */
+#define BOUNDS( x, n )   ( (FT_UInt)(x)  >= (FT_UInt)(n)  )
+#define BOUNDSL( x, n )  ( (FT_ULong)(x) >= (FT_ULong)(n) )
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This macro computes (a*2^14)/b and complements TT_MulFix14.           */
+  /*                                                                       */
+#define TT_DivFix14( a, b ) \
+          FT_DivFix( a, (b) << 2 )
+
+
+#undef  SUCCESS
+#define SUCCESS  0
+
+#undef  FAILURE
+#define FAILURE  1
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define GUESS_VECTOR( V )                                         \
+  if ( CUR.face->unpatented_hinting )                             \
+  {                                                               \
+    CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \
+    CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \
+  }
+#else
+#define GUESS_VECTOR( V )
+#endif
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                        CODERANGE FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Goto_CodeRange                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Switches to a new code range (updates the code related elements in */
+  /*    `exec', and `IP').                                                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    range :: The new execution code range.                             */
+  /*                                                                       */
+  /*    IP    :: The new IP in the new code range.                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    exec  :: The target execution context.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Goto_CodeRange( TT_ExecContext  exec,
+                     FT_Int          range,
+                     FT_Long         IP )
+  {
+    TT_CodeRange*  coderange;
+
+
+    FT_ASSERT( range >= 1 && range <= 3 );
+
+    coderange = &exec->codeRangeTable[range - 1];
+
+    FT_ASSERT( coderange->base != NULL );
+
+    /* NOTE: Because the last instruction of a program may be a CALL */
+    /*       which will return to the first byte *after* the code    */
+    /*       range, we test for IP <= Size instead of IP < Size.     */
+    /*                                                               */
+    FT_ASSERT( (FT_ULong)IP <= coderange->size );
+
+    exec->code     = coderange->base;
+    exec->codeSize = coderange->size;
+    exec->IP       = IP;
+    exec->curRange = range;
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Set_CodeRange                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Sets a code range.                                                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    range  :: The code range index.                                    */
+  /*                                                                       */
+  /*    base   :: The new code base.                                       */
+  /*                                                                       */
+  /*    length :: The range size in bytes.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    exec   :: The target execution context.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Set_CodeRange( TT_ExecContext  exec,
+                    FT_Int          range,
+                    void*           base,
+                    FT_Long         length )
+  {
+    FT_ASSERT( range >= 1 && range <= 3 );
+
+    exec->codeRangeTable[range - 1].base = (FT_Byte*)base;
+    exec->codeRangeTable[range - 1].size = length;
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Clear_CodeRange                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Clears a code range.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    range :: The code range index.                                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    exec  :: The target execution context.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Does not set the Error variable.                                   */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Clear_CodeRange( TT_ExecContext  exec,
+                      FT_Int          range )
+  {
+    FT_ASSERT( range >= 1 && range <= 3 );
+
+    exec->codeRangeTable[range - 1].base = NULL;
+    exec->codeRangeTable[range - 1].size = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                   EXECUTION CONTEXT ROUTINES                          */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Done_Context                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroys a given context.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    exec   :: A handle to the target execution context.                */
+  /*                                                                       */
+  /*    memory :: A handle to the parent memory object.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only the glyph loader and debugger should call this function.      */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Done_Context( TT_ExecContext  exec )
+  {
+    FT_Memory  memory = exec->memory;
+
+
+    /* points zone */
+    exec->maxPoints   = 0;
+    exec->maxContours = 0;
+
+    /* free stack */
+    FT_FREE( exec->stack );
+    exec->stackSize = 0;
+
+    /* free call stack */
+    FT_FREE( exec->callStack );
+    exec->callSize = 0;
+    exec->callTop  = 0;
+
+    /* free glyph code range */
+    FT_FREE( exec->glyphIns );
+    exec->glyphSize = 0;
+
+    exec->size = NULL;
+    exec->face = NULL;
+
+    FT_FREE( exec );
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Init_Context                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a context object.                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A handle to the parent memory object.                    */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    exec   :: A handle to the target execution context.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  Init_Context( TT_ExecContext  exec,
+                FT_Memory       memory )
+  {
+    FT_Error  error;
+
+
+    FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec ));
+
+    exec->memory   = memory;
+    exec->callSize = 32;
+
+    if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) )
+      goto Fail_Memory;
+
+    /* all values in the context are set to 0 already, but this is */
+    /* here as a remainder                                         */
+    exec->maxPoints   = 0;
+    exec->maxContours = 0;
+
+    exec->stackSize = 0;
+    exec->glyphSize = 0;
+
+    exec->stack     = NULL;
+    exec->glyphIns  = NULL;
+
+    exec->face = NULL;
+    exec->size = NULL;
+
+    return FT_Err_Ok;
+
+  Fail_Memory:
+    FT_ERROR(( "Init_Context: not enough memory for %p\n", exec ));
+    TT_Done_Context( exec );
+
+    return error;
+ }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Update_Max                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Checks the size of a buffer and reallocates it if necessary.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory     :: A handle to the parent memory object.                */
+  /*                                                                       */
+  /*    multiplier :: The size in bytes of each element in the buffer.     */
+  /*                                                                       */
+  /*    new_max    :: The new capacity (size) of the buffer.               */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    size       :: The address of the buffer's current size expressed   */
+  /*                  in elements.                                         */
+  /*                                                                       */
+  /*    buff       :: The address of the buffer base pointer.              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  Update_Max( FT_Memory  memory,
+              FT_ULong*  size,
+              FT_Long    multiplier,
+              void*      _pbuff,
+              FT_ULong   new_max )
+  {
+    FT_Error  error;
+    void**    pbuff = (void**)_pbuff;
+
+
+    if ( *size < new_max )
+    {
+      if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) )
+        return error;
+      *size = new_max;
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Load_Context                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Prepare an execution context for glyph hinting.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source face object.                        */
+  /*                                                                       */
+  /*    size :: A handle to the source size object.                        */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    exec :: A handle to the target execution context.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only the glyph loader and debugger should call this function.      */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Load_Context( TT_ExecContext  exec,
+                   TT_Face         face,
+                   TT_Size         size )
+  {
+    FT_Int          i;
+    FT_ULong        tmp;
+    TT_MaxProfile*  maxp;
+    FT_Error        error;
+
+
+    exec->face = face;
+    maxp       = &face->max_profile;
+    exec->size = size;
+
+    if ( size )
+    {
+      exec->numFDefs   = size->num_function_defs;
+      exec->maxFDefs   = size->max_function_defs;
+      exec->numIDefs   = size->num_instruction_defs;
+      exec->maxIDefs   = size->max_instruction_defs;
+      exec->FDefs      = size->function_defs;
+      exec->IDefs      = size->instruction_defs;
+      exec->tt_metrics = size->ttmetrics;
+      exec->metrics    = size->metrics;
+
+      exec->maxFunc    = size->max_func;
+      exec->maxIns     = size->max_ins;
+
+      for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
+        exec->codeRangeTable[i] = size->codeRangeTable[i];
+
+      /* set graphics state */
+      exec->GS = size->GS;
+
+      exec->cvtSize = size->cvt_size;
+      exec->cvt     = size->cvt;
+
+      exec->storeSize = size->storage_size;
+      exec->storage   = size->storage;
+
+      exec->twilight  = size->twilight;
+
+      /* In case of multi-threading it can happen that the old size object */
+      /* no longer exists, thus we must clear all glyph zone references.   */
+      ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) );
+      exec->zp1 = exec->zp0;
+      exec->zp2 = exec->zp0;
+    }
+
+    /* XXX: We reserve a little more elements on the stack to deal safely */
+    /*      with broken fonts like arialbs, courbs, timesbs, etc.         */
+    tmp = exec->stackSize;
+    error = Update_Max( exec->memory,
+                        &tmp,
+                        sizeof ( FT_F26Dot6 ),
+                        (void*)&exec->stack,
+                        maxp->maxStackElements + 32 );
+    exec->stackSize = (FT_UInt)tmp;
+    if ( error )
+      return error;
+
+    tmp = exec->glyphSize;
+    error = Update_Max( exec->memory,
+                        &tmp,
+                        sizeof ( FT_Byte ),
+                        (void*)&exec->glyphIns,
+                        maxp->maxSizeOfInstructions );
+    exec->glyphSize = (FT_UShort)tmp;
+    if ( error )
+      return error;
+
+    exec->pts.n_points   = 0;
+    exec->pts.n_contours = 0;
+
+    exec->zp1 = exec->pts;
+    exec->zp2 = exec->pts;
+    exec->zp0 = exec->pts;
+
+    exec->instruction_trap = FALSE;
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Save_Context                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Saves the code ranges in a `size' object.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    exec :: A handle to the source execution context.                  */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    size :: A handle to the target size object.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only the glyph loader and debugger should call this function.      */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Save_Context( TT_ExecContext  exec,
+                   TT_Size         size )
+  {
+    FT_Int  i;
+
+
+    /* XXX: Will probably disappear soon with all the code range */
+    /*      management, which is now rather obsolete.            */
+    /*                                                           */
+    size->num_function_defs    = exec->numFDefs;
+    size->num_instruction_defs = exec->numIDefs;
+
+    size->max_func = exec->maxFunc;
+    size->max_ins  = exec->maxIns;
+
+    for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
+      size->codeRangeTable[i] = exec->codeRangeTable[i];
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Run_Context                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Executes one or more instructions in the execution context.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    debug :: A Boolean flag.  If set, the function sets some internal  */
+  /*             variables and returns immediately, otherwise TT_RunIns()  */
+  /*             is called.                                                */
+  /*                                                                       */
+  /*             This is commented out currently.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    exec  :: A handle to the target execution context.                 */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    TrueType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only the glyph loader and debugger should call this function.      */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Run_Context( TT_ExecContext  exec,
+                  FT_Bool         debug )
+  {
+    FT_Error  error;
+
+
+    if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) )
+           != FT_Err_Ok )
+      return error;
+
+    exec->zp0 = exec->pts;
+    exec->zp1 = exec->pts;
+    exec->zp2 = exec->pts;
+
+    exec->GS.gep0 = 1;
+    exec->GS.gep1 = 1;
+    exec->GS.gep2 = 1;
+
+    exec->GS.projVector.x = 0x4000;
+    exec->GS.projVector.y = 0x0000;
+
+    exec->GS.freeVector = exec->GS.projVector;
+    exec->GS.dualVector = exec->GS.projVector;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    exec->GS.both_x_axis = TRUE;
+#endif
+
+    exec->GS.round_state = 1;
+    exec->GS.loop        = 1;
+
+    /* some glyphs leave something on the stack. so we clean it */
+    /* before a new execution.                                  */
+    exec->top     = 0;
+    exec->callTop = 0;
+
+#if 1
+    FT_UNUSED( debug );
+
+    return exec->face->interpreter( exec );
+#else
+    if ( !debug )
+      return TT_RunIns( exec );
+    else
+      return FT_Err_Ok;
+#endif
+  }
+
+
+  /* The default value for `scan_control' is documented as FALSE in the */
+  /* TrueType specification.  This is confusing since it implies a      */
+  /* Boolean value.  However, this is not the case, thus both the       */
+  /* default values of our `scan_type' and `scan_control' fields (which */
+  /* the documentation's `scan_control' variable is split into) are     */
+  /* zero.                                                              */
+
+  const TT_GraphicsState  tt_default_graphics_state =
+  {
+    0, 0, 0,
+    { 0x4000, 0 },
+    { 0x4000, 0 },
+    { 0x4000, 0 },
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    TRUE,
+#endif
+
+    1, 64, 1,
+    TRUE, 68, 0, 0, 9, 3,
+    0, FALSE, 0, 1, 1, 1
+  };
+
+
+  /* documentation is in ttinterp.h */
+
+  FT_EXPORT_DEF( TT_ExecContext )
+  TT_New_Context( TT_Driver  driver )
+  {
+    TT_ExecContext  exec;
+    FT_Memory       memory;
+
+
+    memory = driver->root.root.memory;
+    exec   = driver->context;
+
+    if ( !driver->context )
+    {
+      FT_Error  error;
+
+
+      /* allocate object */
+      if ( FT_NEW( exec ) )
+        goto Fail;
+
+      /* initialize it; in case of error this deallocates `exec' too */
+      error = Init_Context( exec, memory );
+      if ( error )
+        goto Fail;
+
+      /* store it into the driver */
+      driver->context = exec;
+    }
+
+    return driver->context;
+
+  Fail:
+    return NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Before an opcode is executed, the interpreter verifies that there are */
+  /* enough arguments on the stack, with the help of the `Pop_Push_Count'  */
+  /* table.                                                                */
+  /*                                                                       */
+  /* For each opcode, the first column gives the number of arguments that  */
+  /* are popped from the stack; the second one gives the number of those   */
+  /* that are pushed in result.                                            */
+  /*                                                                       */
+  /* Opcodes which have a varying number of parameters in the data stream  */
+  /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */
+  /* the `opcode_length' table, and the value in `Pop_Push_Count' is set   */
+  /* to zero.                                                              */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#undef  PACK
+#define PACK( x, y )  ( ( x << 4 ) | y )
+
+
+  static
+  const FT_Byte  Pop_Push_Count[256] =
+  {
+    /* opcodes are gathered in groups of 16 */
+    /* please keep the spaces as they are   */
+
+    /*  SVTCA  y  */  PACK( 0, 0 ),
+    /*  SVTCA  x  */  PACK( 0, 0 ),
+    /*  SPvTCA y  */  PACK( 0, 0 ),
+    /*  SPvTCA x  */  PACK( 0, 0 ),
+    /*  SFvTCA y  */  PACK( 0, 0 ),
+    /*  SFvTCA x  */  PACK( 0, 0 ),
+    /*  SPvTL //  */  PACK( 2, 0 ),
+    /*  SPvTL +   */  PACK( 2, 0 ),
+    /*  SFvTL //  */  PACK( 2, 0 ),
+    /*  SFvTL +   */  PACK( 2, 0 ),
+    /*  SPvFS     */  PACK( 2, 0 ),
+    /*  SFvFS     */  PACK( 2, 0 ),
+    /*  GPV       */  PACK( 0, 2 ),
+    /*  GFV       */  PACK( 0, 2 ),
+    /*  SFvTPv    */  PACK( 0, 0 ),
+    /*  ISECT     */  PACK( 5, 0 ),
+
+    /*  SRP0      */  PACK( 1, 0 ),
+    /*  SRP1      */  PACK( 1, 0 ),
+    /*  SRP2      */  PACK( 1, 0 ),
+    /*  SZP0      */  PACK( 1, 0 ),
+    /*  SZP1      */  PACK( 1, 0 ),
+    /*  SZP2      */  PACK( 1, 0 ),
+    /*  SZPS      */  PACK( 1, 0 ),
+    /*  SLOOP     */  PACK( 1, 0 ),
+    /*  RTG       */  PACK( 0, 0 ),
+    /*  RTHG      */  PACK( 0, 0 ),
+    /*  SMD       */  PACK( 1, 0 ),
+    /*  ELSE      */  PACK( 0, 0 ),
+    /*  JMPR      */  PACK( 1, 0 ),
+    /*  SCvTCi    */  PACK( 1, 0 ),
+    /*  SSwCi     */  PACK( 1, 0 ),
+    /*  SSW       */  PACK( 1, 0 ),
+
+    /*  DUP       */  PACK( 1, 2 ),
+    /*  POP       */  PACK( 1, 0 ),
+    /*  CLEAR     */  PACK( 0, 0 ),
+    /*  SWAP      */  PACK( 2, 2 ),
+    /*  DEPTH     */  PACK( 0, 1 ),
+    /*  CINDEX    */  PACK( 1, 1 ),
+    /*  MINDEX    */  PACK( 1, 0 ),
+    /*  AlignPTS  */  PACK( 2, 0 ),
+    /*  INS_$28   */  PACK( 0, 0 ),
+    /*  UTP       */  PACK( 1, 0 ),
+    /*  LOOPCALL  */  PACK( 2, 0 ),
+    /*  CALL      */  PACK( 1, 0 ),
+    /*  FDEF      */  PACK( 1, 0 ),
+    /*  ENDF      */  PACK( 0, 0 ),
+    /*  MDAP[0]   */  PACK( 1, 0 ),
+    /*  MDAP[1]   */  PACK( 1, 0 ),
+
+    /*  IUP[0]    */  PACK( 0, 0 ),
+    /*  IUP[1]    */  PACK( 0, 0 ),
+    /*  SHP[0]    */  PACK( 0, 0 ),
+    /*  SHP[1]    */  PACK( 0, 0 ),
+    /*  SHC[0]    */  PACK( 1, 0 ),
+    /*  SHC[1]    */  PACK( 1, 0 ),
+    /*  SHZ[0]    */  PACK( 1, 0 ),
+    /*  SHZ[1]    */  PACK( 1, 0 ),
+    /*  SHPIX     */  PACK( 1, 0 ),
+    /*  IP        */  PACK( 0, 0 ),
+    /*  MSIRP[0]  */  PACK( 2, 0 ),
+    /*  MSIRP[1]  */  PACK( 2, 0 ),
+    /*  AlignRP   */  PACK( 0, 0 ),
+    /*  RTDG      */  PACK( 0, 0 ),
+    /*  MIAP[0]   */  PACK( 2, 0 ),
+    /*  MIAP[1]   */  PACK( 2, 0 ),
+
+    /*  NPushB    */  PACK( 0, 0 ),
+    /*  NPushW    */  PACK( 0, 0 ),
+    /*  WS        */  PACK( 2, 0 ),
+    /*  RS        */  PACK( 1, 1 ),
+    /*  WCvtP     */  PACK( 2, 0 ),
+    /*  RCvt      */  PACK( 1, 1 ),
+    /*  GC[0]     */  PACK( 1, 1 ),
+    /*  GC[1]     */  PACK( 1, 1 ),
+    /*  SCFS      */  PACK( 2, 0 ),
+    /*  MD[0]     */  PACK( 2, 1 ),
+    /*  MD[1]     */  PACK( 2, 1 ),
+    /*  MPPEM     */  PACK( 0, 1 ),
+    /*  MPS       */  PACK( 0, 1 ),
+    /*  FlipON    */  PACK( 0, 0 ),
+    /*  FlipOFF   */  PACK( 0, 0 ),
+    /*  DEBUG     */  PACK( 1, 0 ),
+
+    /*  LT        */  PACK( 2, 1 ),
+    /*  LTEQ      */  PACK( 2, 1 ),
+    /*  GT        */  PACK( 2, 1 ),
+    /*  GTEQ      */  PACK( 2, 1 ),
+    /*  EQ        */  PACK( 2, 1 ),
+    /*  NEQ       */  PACK( 2, 1 ),
+    /*  ODD       */  PACK( 1, 1 ),
+    /*  EVEN      */  PACK( 1, 1 ),
+    /*  IF        */  PACK( 1, 0 ),
+    /*  EIF       */  PACK( 0, 0 ),
+    /*  AND       */  PACK( 2, 1 ),
+    /*  OR        */  PACK( 2, 1 ),
+    /*  NOT       */  PACK( 1, 1 ),
+    /*  DeltaP1   */  PACK( 1, 0 ),
+    /*  SDB       */  PACK( 1, 0 ),
+    /*  SDS       */  PACK( 1, 0 ),
+
+    /*  ADD       */  PACK( 2, 1 ),
+    /*  SUB       */  PACK( 2, 1 ),
+    /*  DIV       */  PACK( 2, 1 ),
+    /*  MUL       */  PACK( 2, 1 ),
+    /*  ABS       */  PACK( 1, 1 ),
+    /*  NEG       */  PACK( 1, 1 ),
+    /*  FLOOR     */  PACK( 1, 1 ),
+    /*  CEILING   */  PACK( 1, 1 ),
+    /*  ROUND[0]  */  PACK( 1, 1 ),
+    /*  ROUND[1]  */  PACK( 1, 1 ),
+    /*  ROUND[2]  */  PACK( 1, 1 ),
+    /*  ROUND[3]  */  PACK( 1, 1 ),
+    /*  NROUND[0] */  PACK( 1, 1 ),
+    /*  NROUND[1] */  PACK( 1, 1 ),
+    /*  NROUND[2] */  PACK( 1, 1 ),
+    /*  NROUND[3] */  PACK( 1, 1 ),
+
+    /*  WCvtF     */  PACK( 2, 0 ),
+    /*  DeltaP2   */  PACK( 1, 0 ),
+    /*  DeltaP3   */  PACK( 1, 0 ),
+    /*  DeltaCn[0] */ PACK( 1, 0 ),
+    /*  DeltaCn[1] */ PACK( 1, 0 ),
+    /*  DeltaCn[2] */ PACK( 1, 0 ),
+    /*  SROUND    */  PACK( 1, 0 ),
+    /*  S45Round  */  PACK( 1, 0 ),
+    /*  JROT      */  PACK( 2, 0 ),
+    /*  JROF      */  PACK( 2, 0 ),
+    /*  ROFF      */  PACK( 0, 0 ),
+    /*  INS_$7B   */  PACK( 0, 0 ),
+    /*  RUTG      */  PACK( 0, 0 ),
+    /*  RDTG      */  PACK( 0, 0 ),
+    /*  SANGW     */  PACK( 1, 0 ),
+    /*  AA        */  PACK( 1, 0 ),
+
+    /*  FlipPT    */  PACK( 0, 0 ),
+    /*  FlipRgON  */  PACK( 2, 0 ),
+    /*  FlipRgOFF */  PACK( 2, 0 ),
+    /*  INS_$83   */  PACK( 0, 0 ),
+    /*  INS_$84   */  PACK( 0, 0 ),
+    /*  ScanCTRL  */  PACK( 1, 0 ),
+    /*  SDPVTL[0] */  PACK( 2, 0 ),
+    /*  SDPVTL[1] */  PACK( 2, 0 ),
+    /*  GetINFO   */  PACK( 1, 1 ),
+    /*  IDEF      */  PACK( 1, 0 ),
+    /*  ROLL      */  PACK( 3, 3 ),
+    /*  MAX       */  PACK( 2, 1 ),
+    /*  MIN       */  PACK( 2, 1 ),
+    /*  ScanTYPE  */  PACK( 1, 0 ),
+    /*  InstCTRL  */  PACK( 2, 0 ),
+    /*  INS_$8F   */  PACK( 0, 0 ),
+
+    /*  INS_$90  */   PACK( 0, 0 ),
+    /*  INS_$91  */   PACK( 0, 0 ),
+    /*  INS_$92  */   PACK( 0, 0 ),
+    /*  INS_$93  */   PACK( 0, 0 ),
+    /*  INS_$94  */   PACK( 0, 0 ),
+    /*  INS_$95  */   PACK( 0, 0 ),
+    /*  INS_$96  */   PACK( 0, 0 ),
+    /*  INS_$97  */   PACK( 0, 0 ),
+    /*  INS_$98  */   PACK( 0, 0 ),
+    /*  INS_$99  */   PACK( 0, 0 ),
+    /*  INS_$9A  */   PACK( 0, 0 ),
+    /*  INS_$9B  */   PACK( 0, 0 ),
+    /*  INS_$9C  */   PACK( 0, 0 ),
+    /*  INS_$9D  */   PACK( 0, 0 ),
+    /*  INS_$9E  */   PACK( 0, 0 ),
+    /*  INS_$9F  */   PACK( 0, 0 ),
+
+    /*  INS_$A0  */   PACK( 0, 0 ),
+    /*  INS_$A1  */   PACK( 0, 0 ),
+    /*  INS_$A2  */   PACK( 0, 0 ),
+    /*  INS_$A3  */   PACK( 0, 0 ),
+    /*  INS_$A4  */   PACK( 0, 0 ),
+    /*  INS_$A5  */   PACK( 0, 0 ),
+    /*  INS_$A6  */   PACK( 0, 0 ),
+    /*  INS_$A7  */   PACK( 0, 0 ),
+    /*  INS_$A8  */   PACK( 0, 0 ),
+    /*  INS_$A9  */   PACK( 0, 0 ),
+    /*  INS_$AA  */   PACK( 0, 0 ),
+    /*  INS_$AB  */   PACK( 0, 0 ),
+    /*  INS_$AC  */   PACK( 0, 0 ),
+    /*  INS_$AD  */   PACK( 0, 0 ),
+    /*  INS_$AE  */   PACK( 0, 0 ),
+    /*  INS_$AF  */   PACK( 0, 0 ),
+
+    /*  PushB[0]  */  PACK( 0, 1 ),
+    /*  PushB[1]  */  PACK( 0, 2 ),
+    /*  PushB[2]  */  PACK( 0, 3 ),
+    /*  PushB[3]  */  PACK( 0, 4 ),
+    /*  PushB[4]  */  PACK( 0, 5 ),
+    /*  PushB[5]  */  PACK( 0, 6 ),
+    /*  PushB[6]  */  PACK( 0, 7 ),
+    /*  PushB[7]  */  PACK( 0, 8 ),
+    /*  PushW[0]  */  PACK( 0, 1 ),
+    /*  PushW[1]  */  PACK( 0, 2 ),
+    /*  PushW[2]  */  PACK( 0, 3 ),
+    /*  PushW[3]  */  PACK( 0, 4 ),
+    /*  PushW[4]  */  PACK( 0, 5 ),
+    /*  PushW[5]  */  PACK( 0, 6 ),
+    /*  PushW[6]  */  PACK( 0, 7 ),
+    /*  PushW[7]  */  PACK( 0, 8 ),
+
+    /*  MDRP[00]  */  PACK( 1, 0 ),
+    /*  MDRP[01]  */  PACK( 1, 0 ),
+    /*  MDRP[02]  */  PACK( 1, 0 ),
+    /*  MDRP[03]  */  PACK( 1, 0 ),
+    /*  MDRP[04]  */  PACK( 1, 0 ),
+    /*  MDRP[05]  */  PACK( 1, 0 ),
+    /*  MDRP[06]  */  PACK( 1, 0 ),
+    /*  MDRP[07]  */  PACK( 1, 0 ),
+    /*  MDRP[08]  */  PACK( 1, 0 ),
+    /*  MDRP[09]  */  PACK( 1, 0 ),
+    /*  MDRP[10]  */  PACK( 1, 0 ),
+    /*  MDRP[11]  */  PACK( 1, 0 ),
+    /*  MDRP[12]  */  PACK( 1, 0 ),
+    /*  MDRP[13]  */  PACK( 1, 0 ),
+    /*  MDRP[14]  */  PACK( 1, 0 ),
+    /*  MDRP[15]  */  PACK( 1, 0 ),
+
+    /*  MDRP[16]  */  PACK( 1, 0 ),
+    /*  MDRP[17]  */  PACK( 1, 0 ),
+    /*  MDRP[18]  */  PACK( 1, 0 ),
+    /*  MDRP[19]  */  PACK( 1, 0 ),
+    /*  MDRP[20]  */  PACK( 1, 0 ),
+    /*  MDRP[21]  */  PACK( 1, 0 ),
+    /*  MDRP[22]  */  PACK( 1, 0 ),
+    /*  MDRP[23]  */  PACK( 1, 0 ),
+    /*  MDRP[24]  */  PACK( 1, 0 ),
+    /*  MDRP[25]  */  PACK( 1, 0 ),
+    /*  MDRP[26]  */  PACK( 1, 0 ),
+    /*  MDRP[27]  */  PACK( 1, 0 ),
+    /*  MDRP[28]  */  PACK( 1, 0 ),
+    /*  MDRP[29]  */  PACK( 1, 0 ),
+    /*  MDRP[30]  */  PACK( 1, 0 ),
+    /*  MDRP[31]  */  PACK( 1, 0 ),
+
+    /*  MIRP[00]  */  PACK( 2, 0 ),
+    /*  MIRP[01]  */  PACK( 2, 0 ),
+    /*  MIRP[02]  */  PACK( 2, 0 ),
+    /*  MIRP[03]  */  PACK( 2, 0 ),
+    /*  MIRP[04]  */  PACK( 2, 0 ),
+    /*  MIRP[05]  */  PACK( 2, 0 ),
+    /*  MIRP[06]  */  PACK( 2, 0 ),
+    /*  MIRP[07]  */  PACK( 2, 0 ),
+    /*  MIRP[08]  */  PACK( 2, 0 ),
+    /*  MIRP[09]  */  PACK( 2, 0 ),
+    /*  MIRP[10]  */  PACK( 2, 0 ),
+    /*  MIRP[11]  */  PACK( 2, 0 ),
+    /*  MIRP[12]  */  PACK( 2, 0 ),
+    /*  MIRP[13]  */  PACK( 2, 0 ),
+    /*  MIRP[14]  */  PACK( 2, 0 ),
+    /*  MIRP[15]  */  PACK( 2, 0 ),
+
+    /*  MIRP[16]  */  PACK( 2, 0 ),
+    /*  MIRP[17]  */  PACK( 2, 0 ),
+    /*  MIRP[18]  */  PACK( 2, 0 ),
+    /*  MIRP[19]  */  PACK( 2, 0 ),
+    /*  MIRP[20]  */  PACK( 2, 0 ),
+    /*  MIRP[21]  */  PACK( 2, 0 ),
+    /*  MIRP[22]  */  PACK( 2, 0 ),
+    /*  MIRP[23]  */  PACK( 2, 0 ),
+    /*  MIRP[24]  */  PACK( 2, 0 ),
+    /*  MIRP[25]  */  PACK( 2, 0 ),
+    /*  MIRP[26]  */  PACK( 2, 0 ),
+    /*  MIRP[27]  */  PACK( 2, 0 ),
+    /*  MIRP[28]  */  PACK( 2, 0 ),
+    /*  MIRP[29]  */  PACK( 2, 0 ),
+    /*  MIRP[30]  */  PACK( 2, 0 ),
+    /*  MIRP[31]  */  PACK( 2, 0 )
+  };
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+  static
+  const char*  const opcode_name[256] =
+  {
+    "SVTCA y",
+    "SVTCA x",
+    "SPvTCA y",
+    "SPvTCA x",
+    "SFvTCA y",
+    "SFvTCA x",
+    "SPvTL ||",
+    "SPvTL +",
+    "SFvTL ||",
+    "SFvTL +",
+    "SPvFS",
+    "SFvFS",
+    "GPV",
+    "GFV",
+    "SFvTPv",
+    "ISECT",
+
+    "SRP0",
+    "SRP1",
+    "SRP2",
+    "SZP0",
+    "SZP1",
+    "SZP2",
+    "SZPS",
+    "SLOOP",
+    "RTG",
+    "RTHG",
+    "SMD",
+    "ELSE",
+    "JMPR",
+    "SCvTCi",
+    "SSwCi",
+    "SSW",
+
+    "DUP",
+    "POP",
+    "CLEAR",
+    "SWAP",
+    "DEPTH",
+    "CINDEX",
+    "MINDEX",
+    "AlignPTS",
+    "INS_$28",
+    "UTP",
+    "LOOPCALL",
+    "CALL",
+    "FDEF",
+    "ENDF",
+    "MDAP[0]",
+    "MDAP[1]",
+
+    "IUP[0]",
+    "IUP[1]",
+    "SHP[0]",
+    "SHP[1]",
+    "SHC[0]",
+    "SHC[1]",
+    "SHZ[0]",
+    "SHZ[1]",
+    "SHPIX",
+    "IP",
+    "MSIRP[0]",
+    "MSIRP[1]",
+    "AlignRP",
+    "RTDG",
+    "MIAP[0]",
+    "MIAP[1]",
+
+    "NPushB",
+    "NPushW",
+    "WS",
+    "RS",
+    "WCvtP",
+    "RCvt",
+    "GC[0]",
+    "GC[1]",
+    "SCFS",
+    "MD[0]",
+    "MD[1]",
+    "MPPEM",
+    "MPS",
+    "FlipON",
+    "FlipOFF",
+    "DEBUG",
+
+    "LT",
+    "LTEQ",
+    "GT",
+    "GTEQ",
+    "EQ",
+    "NEQ",
+    "ODD",
+    "EVEN",
+    "IF",
+    "EIF",
+    "AND",
+    "OR",
+    "NOT",
+    "DeltaP1",
+    "SDB",
+    "SDS",
+
+    "ADD",
+    "SUB",
+    "DIV",
+    "MUL",
+    "ABS",
+    "NEG",
+    "FLOOR",
+    "CEILING",
+    "ROUND[0]",
+    "ROUND[1]",
+    "ROUND[2]",
+    "ROUND[3]",
+    "NROUND[0]",
+    "NROUND[1]",
+    "NROUND[2]",
+    "NROUND[3]",
+
+    "WCvtF",
+    "DeltaP2",
+    "DeltaP3",
+    "DeltaCn[0]",
+    "DeltaCn[1]",
+    "DeltaCn[2]",
+    "SROUND",
+    "S45Round",
+    "JROT",
+    "JROF",
+    "ROFF",
+    "INS_$7B",
+    "RUTG",
+    "RDTG",
+    "SANGW",
+    "AA",
+
+    "FlipPT",
+    "FlipRgON",
+    "FlipRgOFF",
+    "INS_$83",
+    "INS_$84",
+    "ScanCTRL",
+    "SDVPTL[0]",
+    "SDVPTL[1]",
+    "GetINFO",
+    "IDEF",
+    "ROLL",
+    "MAX",
+    "MIN",
+    "ScanTYPE",
+    "InstCTRL",
+    "INS_$8F",
+
+    "INS_$90",
+    "INS_$91",
+    "INS_$92",
+    "INS_$93",
+    "INS_$94",
+    "INS_$95",
+    "INS_$96",
+    "INS_$97",
+    "INS_$98",
+    "INS_$99",
+    "INS_$9A",
+    "INS_$9B",
+    "INS_$9C",
+    "INS_$9D",
+    "INS_$9E",
+    "INS_$9F",
+
+    "INS_$A0",
+    "INS_$A1",
+    "INS_$A2",
+    "INS_$A3",
+    "INS_$A4",
+    "INS_$A5",
+    "INS_$A6",
+    "INS_$A7",
+    "INS_$A8",
+    "INS_$A9",
+    "INS_$AA",
+    "INS_$AB",
+    "INS_$AC",
+    "INS_$AD",
+    "INS_$AE",
+    "INS_$AF",
+
+    "PushB[0]",
+    "PushB[1]",
+    "PushB[2]",
+    "PushB[3]",
+    "PushB[4]",
+    "PushB[5]",
+    "PushB[6]",
+    "PushB[7]",
+    "PushW[0]",
+    "PushW[1]",
+    "PushW[2]",
+    "PushW[3]",
+    "PushW[4]",
+    "PushW[5]",
+    "PushW[6]",
+    "PushW[7]",
+
+    "MDRP[00]",
+    "MDRP[01]",
+    "MDRP[02]",
+    "MDRP[03]",
+    "MDRP[04]",
+    "MDRP[05]",
+    "MDRP[06]",
+    "MDRP[07]",
+    "MDRP[08]",
+    "MDRP[09]",
+    "MDRP[10]",
+    "MDRP[11]",
+    "MDRP[12]",
+    "MDRP[13]",
+    "MDRP[14]",
+    "MDRP[15]",
+
+    "MDRP[16]",
+    "MDRP[17]",
+    "MDRP[18]",
+    "MDRP[19]",
+    "MDRP[20]",
+    "MDRP[21]",
+    "MDRP[22]",
+    "MDRP[23]",
+    "MDRP[24]",
+    "MDRP[25]",
+    "MDRP[26]",
+    "MDRP[27]",
+    "MDRP[28]",
+    "MDRP[29]",
+    "MDRP[30]",
+    "MDRP[31]",
+
+    "MIRP[00]",
+    "MIRP[01]",
+    "MIRP[02]",
+    "MIRP[03]",
+    "MIRP[04]",
+    "MIRP[05]",
+    "MIRP[06]",
+    "MIRP[07]",
+    "MIRP[08]",
+    "MIRP[09]",
+    "MIRP[10]",
+    "MIRP[11]",
+    "MIRP[12]",
+    "MIRP[13]",
+    "MIRP[14]",
+    "MIRP[15]",
+
+    "MIRP[16]",
+    "MIRP[17]",
+    "MIRP[18]",
+    "MIRP[19]",
+    "MIRP[20]",
+    "MIRP[21]",
+    "MIRP[22]",
+    "MIRP[23]",
+    "MIRP[24]",
+    "MIRP[25]",
+    "MIRP[26]",
+    "MIRP[27]",
+    "MIRP[28]",
+    "MIRP[29]",
+    "MIRP[30]",
+    "MIRP[31]"
+  };
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+  static
+  const FT_Char  opcode_length[256] =
+  {
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+
+   -1,-2, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    2, 3, 4, 5,  6, 7, 8, 9,  3, 5, 7, 9, 11,13,15,17,
+
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1
+  };
+
+#undef PACK
+
+#if 1
+
+  static FT_Int32
+  TT_MulFix14( FT_Int32  a,
+               FT_Int    b )
+  {
+    FT_Int32   sign;
+    FT_UInt32  ah, al, mid, lo, hi;
+
+
+    sign = a ^ b;
+
+    if ( a < 0 )
+      a = -a;
+    if ( b < 0 )
+      b = -b;
+
+    ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU );
+    al = (FT_UInt32)( a & 0xFFFFU );
+
+    lo    = al * b;
+    mid   = ah * b;
+    hi    = mid >> 16;
+    mid   = ( mid << 16 ) + ( 1 << 13 ); /* rounding */
+    lo   += mid;
+    if ( lo < mid )
+      hi += 1;
+
+    mid = ( lo >> 14 ) | ( hi << 18 );
+
+    return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid;
+  }
+
+#else
+
+  /* compute (a*b)/2^14 with maximum accuracy and rounding */
+  static FT_Int32
+  TT_MulFix14( FT_Int32  a,
+               FT_Int    b )
+  {
+    FT_Int32   m, s, hi;
+    FT_UInt32  l, lo;
+
+
+    /* compute ax*bx as 64-bit value */
+    l  = (FT_UInt32)( ( a & 0xFFFFU ) * b );
+    m  = ( a >> 16 ) * b;
+
+    lo = l + ( (FT_UInt32)m << 16 );
+    hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l );
+
+    /* divide the result by 2^14 with rounding */
+    s   = hi >> 31;
+    l   = lo + (FT_UInt32)s;
+    hi += s + ( l < lo );
+    lo  = l;
+
+    l   = lo + 0x2000U;
+    hi += l < lo;
+
+    return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
+  }
+#endif
+
+
+  /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */
+  static FT_Int32
+  TT_DotFix14( FT_Int32  ax,
+               FT_Int32  ay,
+               FT_Int    bx,
+               FT_Int    by )
+  {
+    FT_Int32   m, s, hi1, hi2, hi;
+    FT_UInt32  l, lo1, lo2, lo;
+
+
+    /* compute ax*bx as 64-bit value */
+    l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx );
+    m = ( ax >> 16 ) * bx;
+
+    lo1 = l + ( (FT_UInt32)m << 16 );
+    hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l );
+
+    /* compute ay*by as 64-bit value */
+    l = (FT_UInt32)( ( ay & 0xFFFFU ) * by );
+    m = ( ay >> 16 ) * by;
+
+    lo2 = l + ( (FT_UInt32)m << 16 );
+    hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l );
+
+    /* add them */
+    lo = lo1 + lo2;
+    hi = hi1 + hi2 + ( lo < lo1 );
+
+    /* divide the result by 2^14 with rounding */
+    s   = hi >> 31;
+    l   = lo + (FT_UInt32)s;
+    hi += s + ( l < lo );
+    lo  = l;
+
+    l   = lo + 0x2000U;
+    hi += ( l < lo );
+
+    return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Current_Ratio                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Returns the current aspect ratio scaling factor depending on the   */
+  /*    projection vector's state and device resolutions.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The aspect ratio in 16.16 format, always <= 1.0 .                  */
+  /*                                                                       */
+  static FT_Long
+  Current_Ratio( EXEC_OP )
+  {
+    if ( !CUR.tt_metrics.ratio )
+    {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+      if ( CUR.face->unpatented_hinting )
+      {
+        if ( CUR.GS.both_x_axis )
+          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
+        else
+          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
+      }
+      else
+#endif
+      {
+        if ( CUR.GS.projVector.y == 0 )
+          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
+
+        else if ( CUR.GS.projVector.x == 0 )
+          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
+
+        else
+        {
+          FT_F26Dot6  x, y;
+
+
+          x = TT_MulFix14( CUR.tt_metrics.x_ratio,
+                           CUR.GS.projVector.x );
+          y = TT_MulFix14( CUR.tt_metrics.y_ratio,
+                           CUR.GS.projVector.y );
+          CUR.tt_metrics.ratio = FT_Hypot( x, y );
+        }
+      }
+    }
+    return CUR.tt_metrics.ratio;
+  }
+
+
+  static FT_Long
+  Current_Ppem( EXEC_OP )
+  {
+    return FT_MulFix( CUR.tt_metrics.ppem, CURRENT_Ratio() );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Functions related to the control value table (CVT).                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  FT_CALLBACK_DEF( FT_F26Dot6 )
+  Read_CVT( EXEC_OP_ FT_ULong  idx )
+  {
+    return CUR.cvt[idx];
+  }
+
+
+  FT_CALLBACK_DEF( FT_F26Dot6 )
+  Read_CVT_Stretched( EXEC_OP_ FT_ULong  idx )
+  {
+    return FT_MulFix( CUR.cvt[idx], CURRENT_Ratio() );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  Write_CVT( EXEC_OP_ FT_ULong    idx,
+                      FT_F26Dot6  value )
+  {
+    CUR.cvt[idx] = value;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  Write_CVT_Stretched( EXEC_OP_ FT_ULong    idx,
+                                FT_F26Dot6  value )
+  {
+    CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  Move_CVT( EXEC_OP_ FT_ULong    idx,
+                     FT_F26Dot6  value )
+  {
+    CUR.cvt[idx] += value;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  Move_CVT_Stretched( EXEC_OP_ FT_ULong    idx,
+                               FT_F26Dot6  value )
+  {
+    CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    GetShortIns                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Returns a short integer taken from the instruction stream at       */
+  /*    address IP.                                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Short read at code[IP].                                            */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This one could become a macro.                                     */
+  /*                                                                       */
+  static FT_Short
+  GetShortIns( EXEC_OP )
+  {
+    /* Reading a byte stream so there is no endianess (DaveP) */
+    CUR.IP += 2;
+    return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) +
+                         CUR.code[CUR.IP - 1]      );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Ins_Goto_CodeRange                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Goes to a certain code range in the instruction stream.            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    aRange :: The index of the code range.                             */
+  /*                                                                       */
+  /*    aIP    :: The new IP address in the code range.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS or FAILURE.                                                */
+  /*                                                                       */
+  static FT_Bool
+  Ins_Goto_CodeRange( EXEC_OP_ FT_Int    aRange,
+                               FT_ULong  aIP )
+  {
+    TT_CodeRange*  range;
+
+
+    if ( aRange < 1 || aRange > 3 )
+    {
+      CUR.error = FT_THROW( Bad_Argument );
+      return FAILURE;
+    }
+
+    range = &CUR.codeRangeTable[aRange - 1];
+
+    if ( range->base == NULL )     /* invalid coderange */
+    {
+      CUR.error = FT_THROW( Invalid_CodeRange );
+      return FAILURE;
+    }
+
+    /* NOTE: Because the last instruction of a program may be a CALL */
+    /*       which will return to the first byte *after* the code    */
+    /*       range, we test for aIP <= Size, instead of aIP < Size.  */
+
+    if ( aIP > range->size )
+    {
+      CUR.error = FT_THROW( Code_Overflow );
+      return FAILURE;
+    }
+
+    CUR.code     = range->base;
+    CUR.codeSize = range->size;
+    CUR.IP       = aIP;
+    CUR.curRange = aRange;
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Direct_Move                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Moves a point by a given distance along the freedom vector.  The   */
+  /*    point will be `touched'.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    point    :: The index of the point to move.                        */
+  /*                                                                       */
+  /*    distance :: The distance to apply.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    zone     :: The affected glyph zone.                               */
+  /*                                                                       */
+  static void
+  Direct_Move( EXEC_OP_ TT_GlyphZone  zone,
+                        FT_UShort     point,
+                        FT_F26Dot6    distance )
+  {
+    FT_F26Dot6  v;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+    v = CUR.GS.freeVector.x;
+
+    if ( v != 0 )
+    {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+      if ( !SUBPIXEL_HINTING                                     ||
+           ( !CUR.ignore_x_mode                                ||
+             ( CUR.sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) )
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+        zone->cur[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );
+
+      zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
+    }
+
+    v = CUR.GS.freeVector.y;
+
+    if ( v != 0 )
+    {
+      zone->cur[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );
+
+      zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Direct_Move_Orig                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Moves the *original* position of a point by a given distance along */
+  /*    the freedom vector.  Obviously, the point will not be `touched'.   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    point    :: The index of the point to move.                        */
+  /*                                                                       */
+  /*    distance :: The distance to apply.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    zone     :: The affected glyph zone.                               */
+  /*                                                                       */
+  static void
+  Direct_Move_Orig( EXEC_OP_ TT_GlyphZone  zone,
+                             FT_UShort     point,
+                             FT_F26Dot6    distance )
+  {
+    FT_F26Dot6  v;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+    v = CUR.GS.freeVector.x;
+
+    if ( v != 0 )
+      zone->org[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );
+
+    v = CUR.GS.freeVector.y;
+
+    if ( v != 0 )
+      zone->org[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Special versions of Direct_Move()                                     */
+  /*                                                                       */
+  /*   The following versions are used whenever both vectors are both      */
+  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static void
+  Direct_Move_X( EXEC_OP_ TT_GlyphZone  zone,
+                          FT_UShort     point,
+                          FT_F26Dot6    distance )
+  {
+    FT_UNUSED_EXEC;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( !SUBPIXEL_HINTING  ||
+         !CUR.ignore_x_mode )
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+      zone->cur[point].x += distance;
+
+    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_X;
+  }
+
+
+  static void
+  Direct_Move_Y( EXEC_OP_ TT_GlyphZone  zone,
+                          FT_UShort     point,
+                          FT_F26Dot6    distance )
+  {
+    FT_UNUSED_EXEC;
+
+    zone->cur[point].y += distance;
+    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_Y;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Special versions of Direct_Move_Orig()                                */
+  /*                                                                       */
+  /*   The following versions are used whenever both vectors are both      */
+  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static void
+  Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone  zone,
+                               FT_UShort     point,
+                               FT_F26Dot6    distance )
+  {
+    FT_UNUSED_EXEC;
+
+    zone->org[point].x += distance;
+  }
+
+
+  static void
+  Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone  zone,
+                               FT_UShort     point,
+                               FT_F26Dot6    distance )
+  {
+    FT_UNUSED_EXEC;
+
+    zone->org[point].y += distance;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_None                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Does not round, but adds engine compensation.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance (not) to round.                       */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The compensated distance.                                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The TrueType specification says very few about the relationship    */
+  /*    between rounding and engine compensation.  However, it seems from  */
+  /*    the description of super round that we should add the compensation */
+  /*    before rounding.                                                   */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_None( EXEC_OP_ FT_F26Dot6  distance,
+                       FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( distance >= 0 )
+    {
+      val = distance + compensation;
+      if ( distance && val < 0 )
+        val = 0;
+    }
+    else
+    {
+      val = distance - compensation;
+      if ( val > 0 )
+        val = 0;
+    }
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_To_Grid                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Rounds value to grid after adding engine compensation.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
+                          FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( distance >= 0 )
+    {
+      val = distance + compensation + 32;
+      if ( distance && val > 0 )
+        val &= ~63;
+      else
+        val = 0;
+    }
+    else
+    {
+      val = -FT_PIX_ROUND( compensation - distance );
+      if ( val > 0 )
+        val = 0;
+    }
+
+    return  val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_To_Half_Grid                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Rounds value to half grid after adding engine compensation.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6  distance,
+                               FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( distance >= 0 )
+    {
+      val = FT_PIX_FLOOR( distance + compensation ) + 32;
+      if ( distance && val < 0 )
+        val = 0;
+    }
+    else
+    {
+      val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );
+      if ( val > 0 )
+        val = 0;
+    }
+
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_Down_To_Grid                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Rounds value down to grid after adding engine compensation.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
+                               FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( distance >= 0 )
+    {
+      val = distance + compensation;
+      if ( distance && val > 0 )
+        val &= ~63;
+      else
+        val = 0;
+    }
+    else
+    {
+      val = -( ( compensation - distance ) & -64 );
+      if ( val > 0 )
+        val = 0;
+    }
+
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_Up_To_Grid                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Rounds value up to grid after adding engine compensation.          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
+                             FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( distance >= 0 )
+    {
+      val = distance + compensation + 63;
+      if ( distance && val > 0 )
+        val &= ~63;
+      else
+        val = 0;
+    }
+    else
+    {
+      val = -FT_PIX_CEIL( compensation - distance );
+      if ( val > 0 )
+        val = 0;
+    }
+
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_To_Double_Grid                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Rounds value to double grid after adding engine compensation.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6  distance,
+                                 FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6 val;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( distance >= 0 )
+    {
+      val = distance + compensation + 16;
+      if ( distance && val > 0 )
+        val &= ~31;
+      else
+        val = 0;
+    }
+    else
+    {
+      val = -FT_PAD_ROUND( compensation - distance, 32 );
+      if ( val > 0 )
+        val = 0;
+    }
+
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_Super                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Super-rounds value to grid after adding engine compensation.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The TrueType specification says very few about the relationship    */
+  /*    between rounding and engine compensation.  However, it seems from  */
+  /*    the description of super round that we should add the compensation */
+  /*    before rounding.                                                   */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_Super( EXEC_OP_ FT_F26Dot6  distance,
+                        FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+
+    if ( distance >= 0 )
+    {
+      val = ( distance - CUR.phase + CUR.threshold + compensation ) &
+              -CUR.period;
+      if ( distance && val < 0 )
+        val = 0;
+      val += CUR.phase;
+    }
+    else
+    {
+      val = -( ( CUR.threshold - CUR.phase - distance + compensation ) &
+               -CUR.period );
+      if ( val > 0 )
+        val = 0;
+      val -= CUR.phase;
+    }
+
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_Super_45                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Super-rounds value to grid after adding engine compensation.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    There is a separate function for Round_Super_45() as we may need   */
+  /*    greater precision.                                                 */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_Super_45( EXEC_OP_ FT_F26Dot6  distance,
+                           FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+
+    if ( distance >= 0 )
+    {
+      val = ( ( distance - CUR.phase + CUR.threshold + compensation ) /
+                CUR.period ) * CUR.period;
+      if ( distance && val < 0 )
+        val = 0;
+      val += CUR.phase;
+    }
+    else
+    {
+      val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) /
+                   CUR.period ) * CUR.period );
+      if ( val > 0 )
+        val = 0;
+      val -= CUR.phase;
+    }
+
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Compute_Round                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Sets the rounding mode.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    round_mode :: The rounding mode to be used.                        */
+  /*                                                                       */
+  static void
+  Compute_Round( EXEC_OP_ FT_Byte  round_mode )
+  {
+    switch ( round_mode )
+    {
+    case TT_Round_Off:
+      CUR.func_round = (TT_Round_Func)Round_None;
+      break;
+
+    case TT_Round_To_Grid:
+      CUR.func_round = (TT_Round_Func)Round_To_Grid;
+      break;
+
+    case TT_Round_Up_To_Grid:
+      CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
+      break;
+
+    case TT_Round_Down_To_Grid:
+      CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
+      break;
+
+    case TT_Round_To_Half_Grid:
+      CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
+      break;
+
+    case TT_Round_To_Double_Grid:
+      CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
+      break;
+
+    case TT_Round_Super:
+      CUR.func_round = (TT_Round_Func)Round_Super;
+      break;
+
+    case TT_Round_Super_45:
+      CUR.func_round = (TT_Round_Func)Round_Super_45;
+      break;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    SetSuperRound                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Sets Super Round parameters.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    GridPeriod :: The grid period.                                     */
+  /*                                                                       */
+  /*    selector   :: The SROUND opcode.                                   */
+  /*                                                                       */
+  static void
+  SetSuperRound( EXEC_OP_ FT_F26Dot6  GridPeriod,
+                          FT_Long     selector )
+  {
+    switch ( (FT_Int)( selector & 0xC0 ) )
+    {
+      case 0:
+        CUR.period = GridPeriod / 2;
+        break;
+
+      case 0x40:
+        CUR.period = GridPeriod;
+        break;
+
+      case 0x80:
+        CUR.period = GridPeriod * 2;
+        break;
+
+      /* This opcode is reserved, but... */
+
+      case 0xC0:
+        CUR.period = GridPeriod;
+        break;
+    }
+
+    switch ( (FT_Int)( selector & 0x30 ) )
+    {
+    case 0:
+      CUR.phase = 0;
+      break;
+
+    case 0x10:
+      CUR.phase = CUR.period / 4;
+      break;
+
+    case 0x20:
+      CUR.phase = CUR.period / 2;
+      break;
+
+    case 0x30:
+      CUR.phase = CUR.period * 3 / 4;
+      break;
+    }
+
+    if ( ( selector & 0x0F ) == 0 )
+      CUR.threshold = CUR.period - 1;
+    else
+      CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8;
+
+    CUR.period    /= 256;
+    CUR.phase     /= 256;
+    CUR.threshold /= 256;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Project                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the projection of vector given by (v2-v1) along the       */
+  /*    current projection vector.                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    v1 :: First input vector.                                          */
+  /*    v2 :: Second input vector.                                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The distance in F26dot6 format.                                    */
+  /*                                                                       */
+  static FT_F26Dot6
+  Project( EXEC_OP_ FT_Pos  dx,
+                    FT_Pos  dy )
+  {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
+                        CUR.GS.projVector.x,
+                        CUR.GS.projVector.y );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Dual_Project                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the projection of the vector given by (v2-v1) along the   */
+  /*    current dual vector.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    v1 :: First input vector.                                          */
+  /*    v2 :: Second input vector.                                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The distance in F26dot6 format.                                    */
+  /*                                                                       */
+  static FT_F26Dot6
+  Dual_Project( EXEC_OP_ FT_Pos  dx,
+                         FT_Pos  dy )
+  {
+    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
+                        CUR.GS.dualVector.x,
+                        CUR.GS.dualVector.y );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Project_x                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the projection of the vector given by (v2-v1) along the   */
+  /*    horizontal axis.                                                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    v1 :: First input vector.                                          */
+  /*    v2 :: Second input vector.                                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The distance in F26dot6 format.                                    */
+  /*                                                                       */
+  static FT_F26Dot6
+  Project_x( EXEC_OP_ FT_Pos  dx,
+                      FT_Pos  dy )
+  {
+    FT_UNUSED_EXEC;
+    FT_UNUSED( dy );
+
+    return dx;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Project_y                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the projection of the vector given by (v2-v1) along the   */
+  /*    vertical axis.                                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    v1 :: First input vector.                                          */
+  /*    v2 :: Second input vector.                                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The distance in F26dot6 format.                                    */
+  /*                                                                       */
+  static FT_F26Dot6
+  Project_y( EXEC_OP_ FT_Pos  dx,
+                      FT_Pos  dy )
+  {
+    FT_UNUSED_EXEC;
+    FT_UNUSED( dx );
+
+    return dy;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Compute_Funcs                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the projection and movement function pointers according   */
+  /*    to the current graphics state.                                     */
+  /*                                                                       */
+  static void
+  Compute_Funcs( EXEC_OP )
+  {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    if ( CUR.face->unpatented_hinting )
+    {
+      /* If both vectors point rightwards along the x axis, set             */
+      /* `both-x-axis' true, otherwise set it false.  The x values only     */
+      /* need be tested because the vector has been normalised to a unit    */
+      /* vector of length 0x4000 = unity.                                   */
+      CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 &&
+                                      CUR.GS.freeVector.x == 0x4000 );
+
+      /* Throw away projection and freedom vector information */
+      /* because the patents don't allow them to be stored.   */
+      /* The relevant US Patents are 5155805 and 5325479.     */
+      CUR.GS.projVector.x = 0;
+      CUR.GS.projVector.y = 0;
+      CUR.GS.freeVector.x = 0;
+      CUR.GS.freeVector.y = 0;
+
+      if ( CUR.GS.both_x_axis )
+      {
+        CUR.func_project   = Project_x;
+        CUR.func_move      = Direct_Move_X;
+        CUR.func_move_orig = Direct_Move_Orig_X;
+      }
+      else
+      {
+        CUR.func_project   = Project_y;
+        CUR.func_move      = Direct_Move_Y;
+        CUR.func_move_orig = Direct_Move_Orig_Y;
+      }
+
+      if ( CUR.GS.dualVector.x == 0x4000 )
+        CUR.func_dualproj = Project_x;
+      else if ( CUR.GS.dualVector.y == 0x4000 )
+        CUR.func_dualproj = Project_y;
+      else
+        CUR.func_dualproj = Dual_Project;
+
+      /* Force recalculation of cached aspect ratio */
+      CUR.tt_metrics.ratio = 0;
+
+      return;
+    }
+#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */
+
+    if ( CUR.GS.freeVector.x == 0x4000 )
+      CUR.F_dot_P = CUR.GS.projVector.x;
+    else if ( CUR.GS.freeVector.y == 0x4000 )
+      CUR.F_dot_P = CUR.GS.projVector.y;
+    else
+      CUR.F_dot_P = ( (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x +
+                      (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y ) >>
+                    14;
+
+    if ( CUR.GS.projVector.x == 0x4000 )
+      CUR.func_project = (TT_Project_Func)Project_x;
+    else if ( CUR.GS.projVector.y == 0x4000 )
+      CUR.func_project = (TT_Project_Func)Project_y;
+    else
+      CUR.func_project = (TT_Project_Func)Project;
+
+    if ( CUR.GS.dualVector.x == 0x4000 )
+      CUR.func_dualproj = (TT_Project_Func)Project_x;
+    else if ( CUR.GS.dualVector.y == 0x4000 )
+      CUR.func_dualproj = (TT_Project_Func)Project_y;
+    else
+      CUR.func_dualproj = (TT_Project_Func)Dual_Project;
+
+    CUR.func_move      = (TT_Move_Func)Direct_Move;
+    CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig;
+
+    if ( CUR.F_dot_P == 0x4000L )
+    {
+      if ( CUR.GS.freeVector.x == 0x4000 )
+      {
+        CUR.func_move      = (TT_Move_Func)Direct_Move_X;
+        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
+      }
+      else if ( CUR.GS.freeVector.y == 0x4000 )
+      {
+        CUR.func_move      = (TT_Move_Func)Direct_Move_Y;
+        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
+      }
+    }
+
+    /* at small sizes, F_dot_P can become too small, resulting   */
+    /* in overflows and `spikes' in a number of glyphs like `w'. */
+
+    if ( FT_ABS( CUR.F_dot_P ) < 0x400L )
+      CUR.F_dot_P = 0x4000L;
+
+    /* Disable cached aspect ratio */
+    CUR.tt_metrics.ratio = 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Normalize                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Norms a vector.                                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    Vx :: The horizontal input vector coordinate.                      */
+  /*    Vy :: The vertical input vector coordinate.                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    R  :: The normed unit vector.                                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Returns FAILURE if a vector parameter is zero.                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    In case Vx and Vy are both zero, Normalize() returns SUCCESS, and  */
+  /*    R is undefined.                                                    */
+  /*                                                                       */
+  static FT_Bool
+  Normalize( EXEC_OP_ FT_F26Dot6      Vx,
+                      FT_F26Dot6      Vy,
+                      FT_UnitVector*  R )
+  {
+    FT_F26Dot6  W;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( FT_ABS( Vx ) < 0x4000L && FT_ABS( Vy ) < 0x4000L )
+    {
+      if ( Vx == 0 && Vy == 0 )
+      {
+        /* XXX: UNDOCUMENTED! It seems that it is possible to try   */
+        /*      to normalize the vector (0,0).  Return immediately. */
+        return SUCCESS;
+      }
+
+      Vx *= 0x4000;
+      Vy *= 0x4000;
+    }
+
+    W = FT_Hypot( Vx, Vy );
+
+    R->x = (FT_F2Dot14)TT_DivFix14( Vx, W );
+    R->y = (FT_F2Dot14)TT_DivFix14( Vy, W );
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Here we start with the implementation of the various opcodes.         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static FT_Bool
+  Ins_SxVTL( EXEC_OP_ FT_UShort       aIdx1,
+                      FT_UShort       aIdx2,
+                      FT_Int          aOpc,
+                      FT_UnitVector*  Vec )
+  {
+    FT_Long     A, B, C;
+    FT_Vector*  p1;
+    FT_Vector*  p2;
+
+
+    if ( BOUNDS( aIdx1, CUR.zp2.n_points ) ||
+         BOUNDS( aIdx2, CUR.zp1.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return FAILURE;
+    }
+
+    p1 = CUR.zp1.cur + aIdx2;
+    p2 = CUR.zp2.cur + aIdx1;
+
+    A = p1->x - p2->x;
+    B = p1->y - p2->y;
+
+    /* If p1 == p2, SPVTL and SFVTL behave the same as */
+    /* SPVTCA[X] and SFVTCA[X], respectively.          */
+    /*                                                 */
+    /* Confirmed by Greg Hitchcock.                    */
+
+    if ( A == 0 && B == 0 )
+    {
+      A    = 0x4000;
+      aOpc = 0;
+    }
+
+    if ( ( aOpc & 1 ) != 0 )
+    {
+      C =  B;   /* counter clockwise rotation */
+      B =  A;
+      A = -C;
+    }
+
+    NORMalize( A, B, Vec );
+
+    return SUCCESS;
+  }
+
+
+  /* When not using the big switch statements, the interpreter uses a */
+  /* call table defined later below in this source.  Each opcode must */
+  /* thus have a corresponding function, even trivial ones.           */
+  /*                                                                  */
+  /* They are all defined there.                                      */
+
+#define DO_SVTCA                            \
+  {                                         \
+    FT_Short  A, B;                         \
+                                            \
+                                            \
+    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
+    B = A ^ (FT_Short)0x4000;               \
+                                            \
+    CUR.GS.freeVector.x = A;                \
+    CUR.GS.projVector.x = A;                \
+    CUR.GS.dualVector.x = A;                \
+                                            \
+    CUR.GS.freeVector.y = B;                \
+    CUR.GS.projVector.y = B;                \
+    CUR.GS.dualVector.y = B;                \
+                                            \
+    COMPUTE_Funcs();                        \
+  }
+
+
+#define DO_SPVTCA                           \
+  {                                         \
+    FT_Short  A, B;                         \
+                                            \
+                                            \
+    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
+    B = A ^ (FT_Short)0x4000;               \
+                                            \
+    CUR.GS.projVector.x = A;                \
+    CUR.GS.dualVector.x = A;                \
+                                            \
+    CUR.GS.projVector.y = B;                \
+    CUR.GS.dualVector.y = B;                \
+                                            \
+    GUESS_VECTOR( freeVector );             \
+                                            \
+    COMPUTE_Funcs();                        \
+  }
+
+
+#define DO_SFVTCA                           \
+  {                                         \
+    FT_Short  A, B;                         \
+                                            \
+                                            \
+    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
+    B = A ^ (FT_Short)0x4000;               \
+                                            \
+    CUR.GS.freeVector.x = A;                \
+    CUR.GS.freeVector.y = B;                \
+                                            \
+    GUESS_VECTOR( projVector );             \
+                                            \
+    COMPUTE_Funcs();                        \
+  }
+
+
+#define DO_SPVTL                                      \
+    if ( INS_SxVTL( (FT_UShort)args[1],               \
+                    (FT_UShort)args[0],               \
+                    CUR.opcode,                       \
+                    &CUR.GS.projVector ) == SUCCESS ) \
+    {                                                 \
+      CUR.GS.dualVector = CUR.GS.projVector;          \
+      GUESS_VECTOR( freeVector );                     \
+      COMPUTE_Funcs();                                \
+    }
+
+
+#define DO_SFVTL                                      \
+    if ( INS_SxVTL( (FT_UShort)args[1],               \
+                    (FT_UShort)args[0],               \
+                    CUR.opcode,                       \
+                    &CUR.GS.freeVector ) == SUCCESS ) \
+    {                                                 \
+      GUESS_VECTOR( projVector );                     \
+      COMPUTE_Funcs();                                \
+    }
+
+
+#define DO_SFVTPV                          \
+    GUESS_VECTOR( projVector );            \
+    CUR.GS.freeVector = CUR.GS.projVector; \
+    COMPUTE_Funcs();
+
+
+#define DO_SPVFS                                \
+  {                                             \
+    FT_Short  S;                                \
+    FT_Long   X, Y;                             \
+                                                \
+                                                \
+    /* Only use low 16bits, then sign extend */ \
+    S = (FT_Short)args[1];                      \
+    Y = (FT_Long)S;                             \
+    S = (FT_Short)args[0];                      \
+    X = (FT_Long)S;                             \
+                                                \
+    NORMalize( X, Y, &CUR.GS.projVector );      \
+                                                \
+    CUR.GS.dualVector = CUR.GS.projVector;      \
+    GUESS_VECTOR( freeVector );                 \
+    COMPUTE_Funcs();                            \
+  }
+
+
+#define DO_SFVFS                                \
+  {                                             \
+    FT_Short  S;                                \
+    FT_Long   X, Y;                             \
+                                                \
+                                                \
+    /* Only use low 16bits, then sign extend */ \
+    S = (FT_Short)args[1];                      \
+    Y = (FT_Long)S;                             \
+    S = (FT_Short)args[0];                      \
+    X = S;                                      \
+                                                \
+    NORMalize( X, Y, &CUR.GS.freeVector );      \
+    GUESS_VECTOR( projVector );                 \
+    COMPUTE_Funcs();                            \
+  }
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define DO_GPV                                   \
+    if ( CUR.face->unpatented_hinting )          \
+    {                                            \
+      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
+      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
+    }                                            \
+    else                                         \
+    {                                            \
+      args[0] = CUR.GS.projVector.x;             \
+      args[1] = CUR.GS.projVector.y;             \
+    }
+#else
+#define DO_GPV                                   \
+    args[0] = CUR.GS.projVector.x;               \
+    args[1] = CUR.GS.projVector.y;
+#endif
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define DO_GFV                                   \
+    if ( CUR.face->unpatented_hinting )          \
+    {                                            \
+      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
+      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
+    }                                            \
+    else                                         \
+    {                                            \
+      args[0] = CUR.GS.freeVector.x;             \
+      args[1] = CUR.GS.freeVector.y;             \
+    }
+#else
+#define DO_GFV                                   \
+    args[0] = CUR.GS.freeVector.x;               \
+    args[1] = CUR.GS.freeVector.y;
+#endif
+
+
+#define DO_SRP0                      \
+    CUR.GS.rp0 = (FT_UShort)args[0];
+
+
+#define DO_SRP1                      \
+    CUR.GS.rp1 = (FT_UShort)args[0];
+
+
+#define DO_SRP2                      \
+    CUR.GS.rp2 = (FT_UShort)args[0];
+
+
+#define DO_RTHG                                         \
+    CUR.GS.round_state = TT_Round_To_Half_Grid;         \
+    CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
+
+
+#define DO_RTG                                     \
+    CUR.GS.round_state = TT_Round_To_Grid;         \
+    CUR.func_round = (TT_Round_Func)Round_To_Grid;
+
+
+#define DO_RTDG                                           \
+    CUR.GS.round_state = TT_Round_To_Double_Grid;         \
+    CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
+
+
+#define DO_RUTG                                       \
+    CUR.GS.round_state = TT_Round_Up_To_Grid;         \
+    CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
+
+
+#define DO_RDTG                                         \
+    CUR.GS.round_state = TT_Round_Down_To_Grid;         \
+    CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
+
+
+#define DO_ROFF                                 \
+    CUR.GS.round_state = TT_Round_Off;          \
+    CUR.func_round = (TT_Round_Func)Round_None;
+
+
+#define DO_SROUND                                \
+    SET_SuperRound( 0x4000, args[0] );           \
+    CUR.GS.round_state = TT_Round_Super;         \
+    CUR.func_round = (TT_Round_Func)Round_Super;
+
+
+#define DO_S45ROUND                                 \
+    SET_SuperRound( 0x2D41, args[0] );              \
+    CUR.GS.round_state = TT_Round_Super_45;         \
+    CUR.func_round = (TT_Round_Func)Round_Super_45;
+
+
+#define DO_SLOOP                            \
+    if ( args[0] < 0 )                      \
+      CUR.error = FT_THROW( Bad_Argument ); \
+    else                                    \
+      CUR.GS.loop = args[0];
+
+
+#define DO_SMD                         \
+    CUR.GS.minimum_distance = args[0];
+
+
+#define DO_SCVTCI                                     \
+    CUR.GS.control_value_cutin = (FT_F26Dot6)args[0];
+
+
+#define DO_SSWCI                                     \
+    CUR.GS.single_width_cutin = (FT_F26Dot6)args[0];
+
+
+#define DO_SSW                                                     \
+    CUR.GS.single_width_value = FT_MulFix( args[0],                \
+                                           CUR.tt_metrics.scale );
+
+
+#define DO_FLIPON            \
+    CUR.GS.auto_flip = TRUE;
+
+
+#define DO_FLIPOFF            \
+    CUR.GS.auto_flip = FALSE;
+
+
+#define DO_SDB                             \
+    CUR.GS.delta_base = (FT_Short)args[0];
+
+
+#define DO_SDS                              \
+    CUR.GS.delta_shift = (FT_Short)args[0];
+
+
+#define DO_MD  /* nothing */
+
+
+#define DO_MPPEM              \
+    args[0] = CURRENT_Ppem();
+
+
+  /* Note: The pointSize should be irrelevant in a given font program; */
+  /*       we thus decide to return only the ppem.                     */
+#if 0
+
+#define DO_MPS                       \
+    args[0] = CUR.metrics.pointSize;
+
+#else
+
+#define DO_MPS                \
+    args[0] = CURRENT_Ppem();
+
+#endif /* 0 */
+
+
+#define DO_DUP         \
+    args[1] = args[0];
+
+
+#define DO_CLEAR     \
+    CUR.new_top = 0;
+
+
+#define DO_SWAP        \
+  {                    \
+    FT_Long  L;        \
+                       \
+                       \
+    L       = args[0]; \
+    args[0] = args[1]; \
+    args[1] = L;       \
+  }
+
+
+#define DO_DEPTH       \
+    args[0] = CUR.top;
+
+
+#define DO_CINDEX                                  \
+  {                                                \
+    FT_Long  L;                                    \
+                                                   \
+                                                   \
+    L = args[0];                                   \
+                                                   \
+    if ( L <= 0 || L > CUR.args )                  \
+    {                                              \
+      if ( CUR.pedantic_hinting )                  \
+        CUR.error = FT_THROW( Invalid_Reference ); \
+      args[0] = 0;                                 \
+    }                                              \
+    else                                           \
+      args[0] = CUR.stack[CUR.args - L];           \
+  }
+
+
+#define DO_JROT                                                   \
+    if ( args[1] != 0 )                                           \
+    {                                                             \
+      if ( args[0] == 0 && CUR.args == 0 )                        \
+        CUR.error = FT_THROW( Bad_Argument );                     \
+      CUR.IP += args[0];                                          \
+      if ( CUR.IP < 0                                          || \
+           ( CUR.callTop > 0                                 &&   \
+             CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \
+        CUR.error = FT_THROW( Bad_Argument );                     \
+      CUR.step_ins = FALSE;                                       \
+    }
+
+
+#define DO_JMPR                                                 \
+    if ( args[0] == 0 && CUR.args == 0 )                        \
+      CUR.error = FT_THROW( Bad_Argument );                     \
+    CUR.IP += args[0];                                          \
+    if ( CUR.IP < 0                                          || \
+         ( CUR.callTop > 0                                 &&   \
+           CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \
+      CUR.error = FT_THROW( Bad_Argument );                     \
+    CUR.step_ins = FALSE;
+
+
+#define DO_JROF                                                   \
+    if ( args[1] == 0 )                                           \
+    {                                                             \
+      if ( args[0] == 0 && CUR.args == 0 )                        \
+        CUR.error = FT_THROW( Bad_Argument );                     \
+      CUR.IP += args[0];                                          \
+      if ( CUR.IP < 0                                          || \
+           ( CUR.callTop > 0                                 &&   \
+             CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \
+        CUR.error = FT_THROW( Bad_Argument );                     \
+      CUR.step_ins = FALSE;                                       \
+    }
+
+
+#define DO_LT                        \
+    args[0] = ( args[0] < args[1] );
+
+
+#define DO_LTEQ                       \
+    args[0] = ( args[0] <= args[1] );
+
+
+#define DO_GT                        \
+    args[0] = ( args[0] > args[1] );
+
+
+#define DO_GTEQ                       \
+    args[0] = ( args[0] >= args[1] );
+
+
+#define DO_EQ                         \
+    args[0] = ( args[0] == args[1] );
+
+
+#define DO_NEQ                        \
+    args[0] = ( args[0] != args[1] );
+
+
+#define DO_ODD                                                  \
+    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 );
+
+
+#define DO_EVEN                                                \
+    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 );
+
+
+#define DO_AND                        \
+    args[0] = ( args[0] && args[1] );
+
+
+#define DO_OR                         \
+    args[0] = ( args[0] || args[1] );
+
+
+#define DO_NOT          \
+    args[0] = !args[0];
+
+
+#define DO_ADD          \
+    args[0] += args[1];
+
+
+#define DO_SUB          \
+    args[0] -= args[1];
+
+
+#define DO_DIV                                               \
+    if ( args[1] == 0 )                                      \
+      CUR.error = FT_THROW( Divide_By_Zero );                \
+    else                                                     \
+      args[0] = FT_MulDiv_No_Round( args[0], 64L, args[1] );
+
+
+#define DO_MUL                                    \
+    args[0] = FT_MulDiv( args[0], args[1], 64L );
+
+
+#define DO_ABS                   \
+    args[0] = FT_ABS( args[0] );
+
+
+#define DO_NEG          \
+    args[0] = -args[0];
+
+
+#define DO_FLOOR    \
+    args[0] = FT_PIX_FLOOR( args[0] );
+
+
+#define DO_CEILING                    \
+    args[0] = FT_PIX_CEIL( args[0] );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+#define DO_RS                                             \
+   {                                                      \
+     FT_ULong  I = (FT_ULong)args[0];                     \
+                                                          \
+                                                          \
+     if ( BOUNDSL( I, CUR.storeSize ) )                   \
+     {                                                    \
+       if ( CUR.pedantic_hinting )                        \
+         ARRAY_BOUND_ERROR;                               \
+       else                                               \
+         args[0] = 0;                                     \
+     }                                                    \
+     else                                                 \
+     {                                                    \
+       /* subpixel hinting - avoid Typeman Dstroke and */ \
+       /* IStroke and Vacuform rounds                  */ \
+                                                          \
+       if ( SUBPIXEL_HINTING                           && \
+            CUR.ignore_x_mode                          && \
+            ( ( I == 24                            &&     \
+                ( CUR.face->sph_found_func_flags &        \
+                  ( SPH_FDEF_SPACING_1 |                  \
+                    SPH_FDEF_SPACING_2 )         ) ) ||   \
+              ( I == 22                      &&           \
+                ( CUR.sph_in_func_flags    &              \
+                  SPH_FDEF_TYPEMAN_STROKES ) )       ||   \
+              ( I == 8                             &&     \
+                ( CUR.face->sph_found_func_flags &        \
+                  SPH_FDEF_VACUFORM_ROUND_1      ) &&     \
+                  CUR.iup_called                   ) ) )  \
+         args[0] = 0;                                     \
+       else                                               \
+         args[0] = CUR.storage[I];                        \
+     }                                                    \
+   }
+
+#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+#define DO_RS                           \
+   {                                    \
+     FT_ULong  I = (FT_ULong)args[0];   \
+                                        \
+                                        \
+     if ( BOUNDSL( I, CUR.storeSize ) ) \
+     {                                  \
+       if ( CUR.pedantic_hinting )      \
+       {                                \
+         ARRAY_BOUND_ERROR;             \
+       }                                \
+       else                             \
+         args[0] = 0;                   \
+     }                                  \
+     else                               \
+       args[0] = CUR.storage[I];        \
+   }
+
+#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+#define DO_WS                           \
+   {                                    \
+     FT_ULong  I = (FT_ULong)args[0];   \
+                                        \
+                                        \
+     if ( BOUNDSL( I, CUR.storeSize ) ) \
+     {                                  \
+       if ( CUR.pedantic_hinting )      \
+       {                                \
+         ARRAY_BOUND_ERROR;             \
+       }                                \
+     }                                  \
+     else                               \
+       CUR.storage[I] = args[1];        \
+   }
+
+
+#define DO_RCVT                          \
+   {                                     \
+     FT_ULong  I = (FT_ULong)args[0];    \
+                                         \
+                                         \
+     if ( BOUNDSL( I, CUR.cvtSize ) )    \
+     {                                   \
+       if ( CUR.pedantic_hinting )       \
+       {                                 \
+         ARRAY_BOUND_ERROR;              \
+       }                                 \
+       else                              \
+         args[0] = 0;                    \
+     }                                   \
+     else                                \
+       args[0] = CUR_Func_read_cvt( I ); \
+   }
+
+
+#define DO_WCVTP                         \
+   {                                     \
+     FT_ULong  I = (FT_ULong)args[0];    \
+                                         \
+                                         \
+     if ( BOUNDSL( I, CUR.cvtSize ) )    \
+     {                                   \
+       if ( CUR.pedantic_hinting )       \
+       {                                 \
+         ARRAY_BOUND_ERROR;              \
+       }                                 \
+     }                                   \
+     else                                \
+       CUR_Func_write_cvt( I, args[1] ); \
+   }
+
+
+#define DO_WCVTF                                                \
+   {                                                            \
+     FT_ULong  I = (FT_ULong)args[0];                           \
+                                                                \
+                                                                \
+     if ( BOUNDSL( I, CUR.cvtSize ) )                           \
+     {                                                          \
+       if ( CUR.pedantic_hinting )                              \
+       {                                                        \
+         ARRAY_BOUND_ERROR;                                     \
+       }                                                        \
+     }                                                          \
+     else                                                       \
+       CUR.cvt[I] = FT_MulFix( args[1], CUR.tt_metrics.scale ); \
+   }
+
+
+#define DO_DEBUG                          \
+    CUR.error = FT_THROW( Debug_OpCode );
+
+
+#define DO_ROUND                                                   \
+    args[0] = CUR_Func_round(                                      \
+                args[0],                                           \
+                CUR.tt_metrics.compensations[CUR.opcode - 0x68] );
+
+
+#define DO_NROUND                                                            \
+    args[0] = ROUND_None( args[0],                                           \
+                          CUR.tt_metrics.compensations[CUR.opcode - 0x6C] );
+
+
+#define DO_MAX               \
+    if ( args[1] > args[0] ) \
+      args[0] = args[1];
+
+
+#define DO_MIN               \
+    if ( args[1] < args[0] ) \
+      args[0] = args[1];
+
+
+#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+#undef  ARRAY_BOUND_ERROR
+#define ARRAY_BOUND_ERROR                        \
+    {                                            \
+      CUR.error = FT_THROW( Invalid_Reference ); \
+      return;                                    \
+    }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SVTCA[a]:     Set (F and P) Vectors to Coordinate Axis                */
+  /* Opcode range: 0x00-0x01                                               */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_SVTCA( INS_ARG )
+  {
+    DO_SVTCA
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SPVTCA[a]:    Set PVector to Coordinate Axis                          */
+  /* Opcode range: 0x02-0x03                                               */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_SPVTCA( INS_ARG )
+  {
+    DO_SPVTCA
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SFVTCA[a]:    Set FVector to Coordinate Axis                          */
+  /* Opcode range: 0x04-0x05                                               */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_SFVTCA( INS_ARG )
+  {
+    DO_SFVTCA
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SPVTL[a]:     Set PVector To Line                                     */
+  /* Opcode range: 0x06-0x07                                               */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_SPVTL( INS_ARG )
+  {
+    DO_SPVTL
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SFVTL[a]:     Set FVector To Line                                     */
+  /* Opcode range: 0x08-0x09                                               */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_SFVTL( INS_ARG )
+  {
+    DO_SFVTL
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SFVTPV[]:     Set FVector To PVector                                  */
+  /* Opcode range: 0x0E                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_SFVTPV( INS_ARG )
+  {
+    DO_SFVTPV
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SPVFS[]:      Set PVector From Stack                                  */
+  /* Opcode range: 0x0A                                                    */
+  /* Stack:        f2.14 f2.14 -->                                         */
+  /*                                                                       */
+  static void
+  Ins_SPVFS( INS_ARG )
+  {
+    DO_SPVFS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SFVFS[]:      Set FVector From Stack                                  */
+  /* Opcode range: 0x0B                                                    */
+  /* Stack:        f2.14 f2.14 -->                                         */
+  /*                                                                       */
+  static void
+  Ins_SFVFS( INS_ARG )
+  {
+    DO_SFVFS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* GPV[]:        Get Projection Vector                                   */
+  /* Opcode range: 0x0C                                                    */
+  /* Stack:        ef2.14 --> ef2.14                                       */
+  /*                                                                       */
+  static void
+  Ins_GPV( INS_ARG )
+  {
+    DO_GPV
+  }
+
+
+  /*************************************************************************/
+  /* GFV[]:        Get Freedom Vector                                      */
+  /* Opcode range: 0x0D                                                    */
+  /* Stack:        ef2.14 --> ef2.14                                       */
+  /*                                                                       */
+  static void
+  Ins_GFV( INS_ARG )
+  {
+    DO_GFV
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SRP0[]:       Set Reference Point 0                                   */
+  /* Opcode range: 0x10                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SRP0( INS_ARG )
+  {
+    DO_SRP0
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SRP1[]:       Set Reference Point 1                                   */
+  /* Opcode range: 0x11                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SRP1( INS_ARG )
+  {
+    DO_SRP1
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SRP2[]:       Set Reference Point 2                                   */
+  /* Opcode range: 0x12                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SRP2( INS_ARG )
+  {
+    DO_SRP2
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* RTHG[]:       Round To Half Grid                                      */
+  /* Opcode range: 0x19                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_RTHG( INS_ARG )
+  {
+    DO_RTHG
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* RTG[]:        Round To Grid                                           */
+  /* Opcode range: 0x18                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_RTG( INS_ARG )
+  {
+    DO_RTG
+  }
+
+
+  /*************************************************************************/
+  /* RTDG[]:       Round To Double Grid                                    */
+  /* Opcode range: 0x3D                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_RTDG( INS_ARG )
+  {
+    DO_RTDG
+  }
+
+
+  /*************************************************************************/
+  /* RUTG[]:       Round Up To Grid                                        */
+  /* Opcode range: 0x7C                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_RUTG( INS_ARG )
+  {
+    DO_RUTG
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* RDTG[]:       Round Down To Grid                                      */
+  /* Opcode range: 0x7D                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_RDTG( INS_ARG )
+  {
+    DO_RDTG
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ROFF[]:       Round OFF                                               */
+  /* Opcode range: 0x7A                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_ROFF( INS_ARG )
+  {
+    DO_ROFF
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SROUND[]:     Super ROUND                                             */
+  /* Opcode range: 0x76                                                    */
+  /* Stack:        Eint8 -->                                               */
+  /*                                                                       */
+  static void
+  Ins_SROUND( INS_ARG )
+  {
+    DO_SROUND
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* S45ROUND[]:   Super ROUND 45 degrees                                  */
+  /* Opcode range: 0x77                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_S45ROUND( INS_ARG )
+  {
+    DO_S45ROUND
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SLOOP[]:      Set LOOP variable                                       */
+  /* Opcode range: 0x17                                                    */
+  /* Stack:        int32? -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SLOOP( INS_ARG )
+  {
+    DO_SLOOP
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SMD[]:        Set Minimum Distance                                    */
+  /* Opcode range: 0x1A                                                    */
+  /* Stack:        f26.6 -->                                               */
+  /*                                                                       */
+  static void
+  Ins_SMD( INS_ARG )
+  {
+    DO_SMD
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SCVTCI[]:     Set Control Value Table Cut In                          */
+  /* Opcode range: 0x1D                                                    */
+  /* Stack:        f26.6 -->                                               */
+  /*                                                                       */
+  static void
+  Ins_SCVTCI( INS_ARG )
+  {
+    DO_SCVTCI
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SSWCI[]:      Set Single Width Cut In                                 */
+  /* Opcode range: 0x1E                                                    */
+  /* Stack:        f26.6 -->                                               */
+  /*                                                                       */
+  static void
+  Ins_SSWCI( INS_ARG )
+  {
+    DO_SSWCI
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SSW[]:        Set Single Width                                        */
+  /* Opcode range: 0x1F                                                    */
+  /* Stack:        int32? -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SSW( INS_ARG )
+  {
+    DO_SSW
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FLIPON[]:     Set auto-FLIP to ON                                     */
+  /* Opcode range: 0x4D                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_FLIPON( INS_ARG )
+  {
+    DO_FLIPON
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FLIPOFF[]:    Set auto-FLIP to OFF                                    */
+  /* Opcode range: 0x4E                                                    */
+  /* Stack: -->                                                            */
+  /*                                                                       */
+  static void
+  Ins_FLIPOFF( INS_ARG )
+  {
+    DO_FLIPOFF
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SANGW[]:      Set ANGle Weight                                        */
+  /* Opcode range: 0x7E                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SANGW( INS_ARG )
+  {
+    /* instruction not supported anymore */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SDB[]:        Set Delta Base                                          */
+  /* Opcode range: 0x5E                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SDB( INS_ARG )
+  {
+    DO_SDB
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SDS[]:        Set Delta Shift                                         */
+  /* Opcode range: 0x5F                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SDS( INS_ARG )
+  {
+    DO_SDS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MPPEM[]:      Measure Pixel Per EM                                    */
+  /* Opcode range: 0x4B                                                    */
+  /* Stack:        --> Euint16                                             */
+  /*                                                                       */
+  static void
+  Ins_MPPEM( INS_ARG )
+  {
+    DO_MPPEM
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MPS[]:        Measure Point Size                                      */
+  /* Opcode range: 0x4C                                                    */
+  /* Stack:        --> Euint16                                             */
+  /*                                                                       */
+  static void
+  Ins_MPS( INS_ARG )
+  {
+    DO_MPS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DUP[]:        DUPlicate the top stack's element                       */
+  /* Opcode range: 0x20                                                    */
+  /* Stack:        StkElt --> StkElt StkElt                                */
+  /*                                                                       */
+  static void
+  Ins_DUP( INS_ARG )
+  {
+    DO_DUP
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* POP[]:        POP the stack's top element                             */
+  /* Opcode range: 0x21                                                    */
+  /* Stack:        StkElt -->                                              */
+  /*                                                                       */
+  static void
+  Ins_POP( INS_ARG )
+  {
+    /* nothing to do */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* CLEAR[]:      CLEAR the entire stack                                  */
+  /* Opcode range: 0x22                                                    */
+  /* Stack:        StkElt... -->                                           */
+  /*                                                                       */
+  static void
+  Ins_CLEAR( INS_ARG )
+  {
+    DO_CLEAR
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SWAP[]:       SWAP the stack's top two elements                       */
+  /* Opcode range: 0x23                                                    */
+  /* Stack:        2 * StkElt --> 2 * StkElt                               */
+  /*                                                                       */
+  static void
+  Ins_SWAP( INS_ARG )
+  {
+    DO_SWAP
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DEPTH[]:      return the stack DEPTH                                  */
+  /* Opcode range: 0x24                                                    */
+  /* Stack:        --> uint32                                              */
+  /*                                                                       */
+  static void
+  Ins_DEPTH( INS_ARG )
+  {
+    DO_DEPTH
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* CINDEX[]:     Copy INDEXed element                                    */
+  /* Opcode range: 0x25                                                    */
+  /* Stack:        int32 --> StkElt                                        */
+  /*                                                                       */
+  static void
+  Ins_CINDEX( INS_ARG )
+  {
+    DO_CINDEX
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* EIF[]:        End IF                                                  */
+  /* Opcode range: 0x59                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_EIF( INS_ARG )
+  {
+    /* nothing to do */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* JROT[]:       Jump Relative On True                                   */
+  /* Opcode range: 0x78                                                    */
+  /* Stack:        StkElt int32 -->                                        */
+  /*                                                                       */
+  static void
+  Ins_JROT( INS_ARG )
+  {
+    DO_JROT
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* JMPR[]:       JuMP Relative                                           */
+  /* Opcode range: 0x1C                                                    */
+  /* Stack:        int32 -->                                               */
+  /*                                                                       */
+  static void
+  Ins_JMPR( INS_ARG )
+  {
+    DO_JMPR
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* JROF[]:       Jump Relative On False                                  */
+  /* Opcode range: 0x79                                                    */
+  /* Stack:        StkElt int32 -->                                        */
+  /*                                                                       */
+  static void
+  Ins_JROF( INS_ARG )
+  {
+    DO_JROF
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* LT[]:         Less Than                                               */
+  /* Opcode range: 0x50                                                    */
+  /* Stack:        int32? int32? --> bool                                  */
+  /*                                                                       */
+  static void
+  Ins_LT( INS_ARG )
+  {
+    DO_LT
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* LTEQ[]:       Less Than or EQual                                      */
+  /* Opcode range: 0x51                                                    */
+  /* Stack:        int32? int32? --> bool                                  */
+  /*                                                                       */
+  static void
+  Ins_LTEQ( INS_ARG )
+  {
+    DO_LTEQ
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* GT[]:         Greater Than                                            */
+  /* Opcode range: 0x52                                                    */
+  /* Stack:        int32? int32? --> bool                                  */
+  /*                                                                       */
+  static void
+  Ins_GT( INS_ARG )
+  {
+    DO_GT
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* GTEQ[]:       Greater Than or EQual                                   */
+  /* Opcode range: 0x53                                                    */
+  /* Stack:        int32? int32? --> bool                                  */
+  /*                                                                       */
+  static void
+  Ins_GTEQ( INS_ARG )
+  {
+    DO_GTEQ
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* EQ[]:         EQual                                                   */
+  /* Opcode range: 0x54                                                    */
+  /* Stack:        StkElt StkElt --> bool                                  */
+  /*                                                                       */
+  static void
+  Ins_EQ( INS_ARG )
+  {
+    DO_EQ
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* NEQ[]:        Not EQual                                               */
+  /* Opcode range: 0x55                                                    */
+  /* Stack:        StkElt StkElt --> bool                                  */
+  /*                                                                       */
+  static void
+  Ins_NEQ( INS_ARG )
+  {
+    DO_NEQ
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ODD[]:        Is ODD                                                  */
+  /* Opcode range: 0x56                                                    */
+  /* Stack:        f26.6 --> bool                                          */
+  /*                                                                       */
+  static void
+  Ins_ODD( INS_ARG )
+  {
+    DO_ODD
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* EVEN[]:       Is EVEN                                                 */
+  /* Opcode range: 0x57                                                    */
+  /* Stack:        f26.6 --> bool                                          */
+  /*                                                                       */
+  static void
+  Ins_EVEN( INS_ARG )
+  {
+    DO_EVEN
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* AND[]:        logical AND                                             */
+  /* Opcode range: 0x5A                                                    */
+  /* Stack:        uint32 uint32 --> uint32                                */
+  /*                                                                       */
+  static void
+  Ins_AND( INS_ARG )
+  {
+    DO_AND
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* OR[]:         logical OR                                              */
+  /* Opcode range: 0x5B                                                    */
+  /* Stack:        uint32 uint32 --> uint32                                */
+  /*                                                                       */
+  static void
+  Ins_OR( INS_ARG )
+  {
+    DO_OR
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* NOT[]:        logical NOT                                             */
+  /* Opcode range: 0x5C                                                    */
+  /* Stack:        StkElt --> uint32                                       */
+  /*                                                                       */
+  static void
+  Ins_NOT( INS_ARG )
+  {
+    DO_NOT
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ADD[]:        ADD                                                     */
+  /* Opcode range: 0x60                                                    */
+  /* Stack:        f26.6 f26.6 --> f26.6                                   */
+  /*                                                                       */
+  static void
+  Ins_ADD( INS_ARG )
+  {
+    DO_ADD
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SUB[]:        SUBtract                                                */
+  /* Opcode range: 0x61                                                    */
+  /* Stack:        f26.6 f26.6 --> f26.6                                   */
+  /*                                                                       */
+  static void
+  Ins_SUB( INS_ARG )
+  {
+    DO_SUB
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DIV[]:        DIVide                                                  */
+  /* Opcode range: 0x62                                                    */
+  /* Stack:        f26.6 f26.6 --> f26.6                                   */
+  /*                                                                       */
+  static void
+  Ins_DIV( INS_ARG )
+  {
+    DO_DIV
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MUL[]:        MULtiply                                                */
+  /* Opcode range: 0x63                                                    */
+  /* Stack:        f26.6 f26.6 --> f26.6                                   */
+  /*                                                                       */
+  static void
+  Ins_MUL( INS_ARG )
+  {
+    DO_MUL
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ABS[]:        ABSolute value                                          */
+  /* Opcode range: 0x64                                                    */
+  /* Stack:        f26.6 --> f26.6                                         */
+  /*                                                                       */
+  static void
+  Ins_ABS( INS_ARG )
+  {
+    DO_ABS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* NEG[]:        NEGate                                                  */
+  /* Opcode range: 0x65                                                    */
+  /* Stack: f26.6 --> f26.6                                                */
+  /*                                                                       */
+  static void
+  Ins_NEG( INS_ARG )
+  {
+    DO_NEG
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FLOOR[]:      FLOOR                                                   */
+  /* Opcode range: 0x66                                                    */
+  /* Stack:        f26.6 --> f26.6                                         */
+  /*                                                                       */
+  static void
+  Ins_FLOOR( INS_ARG )
+  {
+    DO_FLOOR
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* CEILING[]:    CEILING                                                 */
+  /* Opcode range: 0x67                                                    */
+  /* Stack:        f26.6 --> f26.6                                         */
+  /*                                                                       */
+  static void
+  Ins_CEILING( INS_ARG )
+  {
+    DO_CEILING
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* RS[]:         Read Store                                              */
+  /* Opcode range: 0x43                                                    */
+  /* Stack:        uint32 --> uint32                                       */
+  /*                                                                       */
+  static void
+  Ins_RS( INS_ARG )
+  {
+    DO_RS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* WS[]:         Write Store                                             */
+  /* Opcode range: 0x42                                                    */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_WS( INS_ARG )
+  {
+    DO_WS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* WCVTP[]:      Write CVT in Pixel units                                */
+  /* Opcode range: 0x44                                                    */
+  /* Stack:        f26.6 uint32 -->                                        */
+  /*                                                                       */
+  static void
+  Ins_WCVTP( INS_ARG )
+  {
+    DO_WCVTP
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* WCVTF[]:      Write CVT in Funits                                     */
+  /* Opcode range: 0x70                                                    */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_WCVTF( INS_ARG )
+  {
+    DO_WCVTF
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* RCVT[]:       Read CVT                                                */
+  /* Opcode range: 0x45                                                    */
+  /* Stack:        uint32 --> f26.6                                        */
+  /*                                                                       */
+  static void
+  Ins_RCVT( INS_ARG )
+  {
+    DO_RCVT
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* AA[]:         Adjust Angle                                            */
+  /* Opcode range: 0x7F                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_AA( INS_ARG )
+  {
+    /* intentionally no longer supported */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DEBUG[]:      DEBUG.  Unsupported.                                    */
+  /* Opcode range: 0x4F                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  /* Note: The original instruction pops a value from the stack.           */
+  /*                                                                       */
+  static void
+  Ins_DEBUG( INS_ARG )
+  {
+    DO_DEBUG
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ROUND[ab]:    ROUND value                                             */
+  /* Opcode range: 0x68-0x6B                                               */
+  /* Stack:        f26.6 --> f26.6                                         */
+  /*                                                                       */
+  static void
+  Ins_ROUND( INS_ARG )
+  {
+    DO_ROUND
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* NROUND[ab]:   No ROUNDing of value                                    */
+  /* Opcode range: 0x6C-0x6F                                               */
+  /* Stack:        f26.6 --> f26.6                                         */
+  /*                                                                       */
+  static void
+  Ins_NROUND( INS_ARG )
+  {
+    DO_NROUND
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MAX[]:        MAXimum                                                 */
+  /* Opcode range: 0x68                                                    */
+  /* Stack:        int32? int32? --> int32                                 */
+  /*                                                                       */
+  static void
+  Ins_MAX( INS_ARG )
+  {
+    DO_MAX
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MIN[]:        MINimum                                                 */
+  /* Opcode range: 0x69                                                    */
+  /* Stack:        int32? int32? --> int32                                 */
+  /*                                                                       */
+  static void
+  Ins_MIN( INS_ARG )
+  {
+    DO_MIN
+  }
+
+
+#endif  /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The following functions are called as is within the switch statement. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MINDEX[]:     Move INDEXed element                                    */
+  /* Opcode range: 0x26                                                    */
+  /* Stack:        int32? --> StkElt                                       */
+  /*                                                                       */
+  static void
+  Ins_MINDEX( INS_ARG )
+  {
+    FT_Long  L, K;
+
+
+    L = args[0];
+
+    if ( L <= 0 || L > CUR.args )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+    }
+    else
+    {
+      K = CUR.stack[CUR.args - L];
+
+      FT_ARRAY_MOVE( &CUR.stack[CUR.args - L    ],
+                     &CUR.stack[CUR.args - L + 1],
+                     ( L - 1 ) );
+
+      CUR.stack[CUR.args - 1] = K;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ROLL[]:       ROLL top three elements                                 */
+  /* Opcode range: 0x8A                                                    */
+  /* Stack:        3 * StkElt --> 3 * StkElt                               */
+  /*                                                                       */
+  static void
+  Ins_ROLL( INS_ARG )
+  {
+    FT_Long  A, B, C;
+
+    FT_UNUSED_EXEC;
+
+
+    A = args[2];
+    B = args[1];
+    C = args[0];
+
+    args[2] = C;
+    args[1] = A;
+    args[0] = B;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MANAGING THE FLOW OF CONTROL                                          */
+  /*                                                                       */
+  /*   Instructions appear in the specification's order.                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static FT_Bool
+  SkipCode( EXEC_OP )
+  {
+    CUR.IP += CUR.length;
+
+    if ( CUR.IP < CUR.codeSize )
+    {
+      CUR.opcode = CUR.code[CUR.IP];
+
+      CUR.length = opcode_length[CUR.opcode];
+      if ( CUR.length < 0 )
+      {
+        if ( CUR.IP + 1 >= CUR.codeSize )
+          goto Fail_Overflow;
+        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
+      }
+
+      if ( CUR.IP + CUR.length <= CUR.codeSize )
+        return SUCCESS;
+    }
+
+  Fail_Overflow:
+    CUR.error = FT_THROW( Code_Overflow );
+    return FAILURE;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* IF[]:         IF test                                                 */
+  /* Opcode range: 0x58                                                    */
+  /* Stack:        StkElt -->                                              */
+  /*                                                                       */
+  static void
+  Ins_IF( INS_ARG )
+  {
+    FT_Int   nIfs;
+    FT_Bool  Out;
+
+
+    if ( args[0] != 0 )
+      return;
+
+    nIfs = 1;
+    Out = 0;
+
+    do
+    {
+      if ( SKIP_Code() == FAILURE )
+        return;
+
+      switch ( CUR.opcode )
+      {
+      case 0x58:      /* IF */
+        nIfs++;
+        break;
+
+      case 0x1B:      /* ELSE */
+        Out = FT_BOOL( nIfs == 1 );
+        break;
+
+      case 0x59:      /* EIF */
+        nIfs--;
+        Out = FT_BOOL( nIfs == 0 );
+        break;
+      }
+    } while ( Out == 0 );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ELSE[]:       ELSE                                                    */
+  /* Opcode range: 0x1B                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_ELSE( INS_ARG )
+  {
+    FT_Int  nIfs;
+
+    FT_UNUSED_ARG;
+
+
+    nIfs = 1;
+
+    do
+    {
+      if ( SKIP_Code() == FAILURE )
+        return;
+
+      switch ( CUR.opcode )
+      {
+      case 0x58:    /* IF */
+        nIfs++;
+        break;
+
+      case 0x59:    /* EIF */
+        nIfs--;
+        break;
+      }
+    } while ( nIfs != 0 );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS                         */
+  /*                                                                       */
+  /*   Instructions appear in the specification's order.                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FDEF[]:       Function DEFinition                                     */
+  /* Opcode range: 0x2C                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_FDEF( INS_ARG )
+  {
+    FT_ULong       n;
+    TT_DefRecord*  rec;
+    TT_DefRecord*  limit;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    /* arguments to opcodes are skipped by `SKIP_Code' */
+    FT_Byte    opcode_pattern[9][12] = {
+                 /* #0 inline delta function 1 */
+                 {
+                   0x4B, /* PPEM    */
+                   0x53, /* GTEQ    */
+                   0x23, /* SWAP    */
+                   0x4B, /* PPEM    */
+                   0x51, /* LTEQ    */
+                   0x5A, /* AND     */
+                   0x58, /* IF      */
+                   0x38, /*   SHPIX */
+                   0x1B, /* ELSE    */
+                   0x21, /*   POP   */
+                   0x21, /*   POP   */
+                   0x59  /* EIF     */
+                 },
+                 /* #1 inline delta function 2 */
+                 {
+                   0x4B, /* PPEM    */
+                   0x54, /* EQ      */
+                   0x58, /* IF      */
+                   0x38, /*   SHPIX */
+                   0x1B, /* ELSE    */
+                   0x21, /*   POP   */
+                   0x21, /*   POP   */
+                   0x59  /* EIF     */
+                 },
+                 /* #2 diagonal stroke function */
+                 {
+                   0x20, /* DUP     */
+                   0x20, /* DUP     */
+                   0xB0, /* PUSHB_1 */
+                         /*   1     */
+                   0x60, /* ADD     */
+                   0x46, /* GC_cur  */
+                   0xB0, /* PUSHB_1 */
+                         /*   64    */
+                   0x23, /* SWAP    */
+                   0x42  /* WS      */
+                 },
+                 /* #3 VacuFormRound function */
+                 {
+                   0x45, /* RCVT    */
+                   0x23, /* SWAP    */
+                   0x46, /* GC_cur  */
+                   0x60, /* ADD     */
+                   0x20, /* DUP     */
+                   0xB0  /* PUSHB_1 */
+                         /*   38    */
+                 },
+                 /* #4 TTFautohint bytecode (old) */
+                 {
+                   0x20, /* DUP     */
+                   0x64, /* ABS     */
+                   0xB0, /* PUSHB_1 */
+                         /*   32    */
+                   0x60, /* ADD     */
+                   0x66, /* FLOOR   */
+                   0x23, /* SWAP    */
+                   0xB0  /* PUSHB_1 */
+                 },
+                 /* #5 spacing function 1 */
+                 {
+                   0x01, /* SVTCA_x */
+                   0xB0, /* PUSHB_1 */
+                         /*   24    */
+                   0x43, /* RS      */
+                   0x58  /* IF      */
+                 },
+                 /* #6 spacing function 2 */
+                 {
+                   0x01, /* SVTCA_x */
+                   0x18, /* RTG     */
+                   0xB0, /* PUSHB_1 */
+                         /*   24    */
+                   0x43, /* RS      */
+                   0x58  /* IF      */
+                 },
+                 /* #7 TypeMan Talk DiagEndCtrl function */
+                 {
+                   0x01, /* SVTCA_x */
+                   0x20, /* DUP     */
+                   0xB0, /* PUSHB_1 */
+                         /*   3     */
+                   0x25, /* CINDEX  */
+                 },
+                 /* #8 TypeMan Talk Align */
+                 {
+                   0x06, /* SPVTL   */
+                   0x7D, /* RDTG    */
+                 },
+               };
+    FT_UShort  opcode_patterns   = 9;
+    FT_UShort  opcode_pointer[9] = {  0, 0, 0, 0, 0, 0, 0, 0, 0 };
+    FT_UShort  opcode_size[9]    = { 12, 8, 8, 6, 7, 4, 5, 4, 2 };
+    FT_UShort  i;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+    /* some font programs are broken enough to redefine functions! */
+    /* We will then parse the current table.                       */
+
+    rec   = CUR.FDefs;
+    limit = rec + CUR.numFDefs;
+    n     = args[0];
+
+    for ( ; rec < limit; rec++ )
+    {
+      if ( rec->opc == n )
+        break;
+    }
+
+    if ( rec == limit )
+    {
+      /* check that there is enough room for new functions */
+      if ( CUR.numFDefs >= CUR.maxFDefs )
+      {
+        CUR.error = FT_THROW( Too_Many_Function_Defs );
+        return;
+      }
+      CUR.numFDefs++;
+    }
+
+    /* Although FDEF takes unsigned 32-bit integer,  */
+    /* func # must be within unsigned 16-bit integer */
+    if ( n > 0xFFFFU )
+    {
+      CUR.error = FT_THROW( Too_Many_Function_Defs );
+      return;
+    }
+
+    rec->range          = CUR.curRange;
+    rec->opc            = (FT_UInt16)n;
+    rec->start          = CUR.IP + 1;
+    rec->active         = TRUE;
+    rec->inline_delta   = FALSE;
+    rec->sph_fdef_flags = 0x0000;
+
+    if ( n > CUR.maxFunc )
+      CUR.maxFunc = (FT_UInt16)n;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    /* We don't know for sure these are typeman functions, */
+    /* however they are only active when RS 22 is called   */
+    if ( n >= 64 && n <= 66 )
+      rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES;
+#endif
+
+    /* Now skip the whole function definition. */
+    /* We don't allow nested IDEFS & FDEFs.    */
+
+    while ( SKIP_Code() == SUCCESS )
+    {
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+      if ( SUBPIXEL_HINTING )
+      {
+        for ( i = 0; i < opcode_patterns; i++ )
+        {
+          if ( opcode_pointer[i] < opcode_size[i]                 &&
+               CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )
+          {
+            opcode_pointer[i] += 1;
+
+            if ( opcode_pointer[i] == opcode_size[i] )
+            {
+              FT_TRACE7(( "sph: Function %d, opcode ptrn: %d, %s %s\n",
+                          i, n,
+                          CUR.face->root.family_name,
+                          CUR.face->root.style_name ));
+
+              switch ( i )
+              {
+              case 0:
+                rec->sph_fdef_flags            |= SPH_FDEF_INLINE_DELTA_1;
+                CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1;
+                break;
+
+              case 1:
+                rec->sph_fdef_flags            |= SPH_FDEF_INLINE_DELTA_2;
+                CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2;
+                break;
+
+              case 2:
+                switch ( n )
+                {
+                  /* needs to be implemented still */
+                case 58:
+                  rec->sph_fdef_flags            |= SPH_FDEF_DIAGONAL_STROKE;
+                  CUR.face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE;
+                }
+                break;
+
+              case 3:
+                switch ( n )
+                {
+                case 0:
+                  rec->sph_fdef_flags            |= SPH_FDEF_VACUFORM_ROUND_1;
+                  CUR.face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1;
+                }
+                break;
+
+              case 4:
+                /* probably not necessary to detect anymore */
+                rec->sph_fdef_flags            |= SPH_FDEF_TTFAUTOHINT_1;
+                CUR.face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1;
+                break;
+
+              case 5:
+                switch ( n )
+                {
+                case 0:
+                case 1:
+                case 2:
+                case 4:
+                case 7:
+                case 8:
+                  rec->sph_fdef_flags            |= SPH_FDEF_SPACING_1;
+                  CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_1;
+                }
+                break;
+
+              case 6:
+                switch ( n )
+                {
+                case 0:
+                case 1:
+                case 2:
+                case 4:
+                case 7:
+                case 8:
+                  rec->sph_fdef_flags            |= SPH_FDEF_SPACING_2;
+                  CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_2;
+                }
+                break;
+
+               case 7:
+                 rec->sph_fdef_flags            |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
+                 CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
+                 break;
+
+               case 8:
+#if 0
+                 rec->sph_fdef_flags            |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
+                 CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
+#endif
+                 break;
+              }
+              opcode_pointer[i] = 0;
+            }
+          }
+
+          else
+            opcode_pointer[i] = 0;
+        }
+
+        /* Set sph_compatibility_mode only when deltas are detected */
+        CUR.face->sph_compatibility_mode =
+          ( ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) |
+            ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) );
+      }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+      switch ( CUR.opcode )
+      {
+      case 0x89:    /* IDEF */
+      case 0x2C:    /* FDEF */
+        CUR.error = FT_THROW( Nested_DEFS );
+        return;
+
+      case 0x2D:   /* ENDF */
+        rec->end = CUR.IP;
+        return;
+      }
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ENDF[]:       END Function definition                                 */
+  /* Opcode range: 0x2D                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_ENDF( INS_ARG )
+  {
+    TT_CallRec*  pRec;
+
+    FT_UNUSED_ARG;
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    CUR.sph_in_func_flags = 0x0000;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    if ( CUR.callTop <= 0 )     /* We encountered an ENDF without a call */
+    {
+      CUR.error = FT_THROW( ENDF_In_Exec_Stream );
+      return;
+    }
+
+    CUR.callTop--;
+
+    pRec = &CUR.callStack[CUR.callTop];
+
+    pRec->Cur_Count--;
+
+    CUR.step_ins = FALSE;
+
+    if ( pRec->Cur_Count > 0 )
+    {
+      CUR.callTop++;
+      CUR.IP = pRec->Cur_Restart;
+    }
+    else
+      /* Loop through the current function */
+      INS_Goto_CodeRange( pRec->Caller_Range,
+                          pRec->Caller_IP );
+
+    /* Exit the current call frame.                      */
+
+    /* NOTE: If the last instruction of a program is a   */
+    /*       CALL or LOOPCALL, the return address is     */
+    /*       always out of the code range.  This is a    */
+    /*       valid address, and it is why we do not test */
+    /*       the result of Ins_Goto_CodeRange() here!    */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* CALL[]:       CALL function                                           */
+  /* Opcode range: 0x2B                                                    */
+  /* Stack:        uint32? -->                                             */
+  /*                                                                       */
+  static void
+  Ins_CALL( INS_ARG )
+  {
+    FT_ULong       F;
+    TT_CallRec*    pCrec;
+    TT_DefRecord*  def;
+
+
+    /* first of all, check the index */
+
+    F = args[0];
+    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
+      goto Fail;
+
+    /* Except for some old Apple fonts, all functions in a TrueType */
+    /* font are defined in increasing order, starting from 0.  This */
+    /* means that we normally have                                  */
+    /*                                                              */
+    /*    CUR.maxFunc+1 == CUR.numFDefs                             */
+    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */
+    /*                                                              */
+    /* If this isn't true, we need to look up the function table.   */
+
+    def = CUR.FDefs + F;
+    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
+    {
+      /* look up the FDefs table */
+      TT_DefRecord*  limit;
+
+
+      def   = CUR.FDefs;
+      limit = def + CUR.numFDefs;
+
+      while ( def < limit && def->opc != F )
+        def++;
+
+      if ( def == limit )
+        goto Fail;
+    }
+
+    /* check that the function is active */
+    if ( !def->active )
+      goto Fail;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( SUBPIXEL_HINTING                                              &&
+         CUR.ignore_x_mode                                             &&
+         ( ( CUR.iup_called                                        &&
+             ( CUR.sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) ||
+           ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 )       ) )
+      goto Fail;
+    else
+      CUR.sph_in_func_flags = def->sph_fdef_flags;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    /* check the call stack */
+    if ( CUR.callTop >= CUR.callSize )
+    {
+      CUR.error = FT_THROW( Stack_Overflow );
+      return;
+    }
+
+    pCrec = CUR.callStack + CUR.callTop;
+
+    pCrec->Caller_Range = CUR.curRange;
+    pCrec->Caller_IP    = CUR.IP + 1;
+    pCrec->Cur_Count    = 1;
+    pCrec->Cur_Restart  = def->start;
+    pCrec->Cur_End      = def->end;
+
+    CUR.callTop++;
+
+    INS_Goto_CodeRange( def->range,
+                        def->start );
+
+    CUR.step_ins = FALSE;
+
+    return;
+
+  Fail:
+    CUR.error = FT_THROW( Invalid_Reference );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* LOOPCALL[]:   LOOP and CALL function                                  */
+  /* Opcode range: 0x2A                                                    */
+  /* Stack:        uint32? Eint16? -->                                     */
+  /*                                                                       */
+  static void
+  Ins_LOOPCALL( INS_ARG )
+  {
+    FT_ULong       F;
+    TT_CallRec*    pCrec;
+    TT_DefRecord*  def;
+
+
+    /* first of all, check the index */
+    F = args[1];
+    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
+      goto Fail;
+
+    /* Except for some old Apple fonts, all functions in a TrueType */
+    /* font are defined in increasing order, starting from 0.  This */
+    /* means that we normally have                                  */
+    /*                                                              */
+    /*    CUR.maxFunc+1 == CUR.numFDefs                             */
+    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */
+    /*                                                              */
+    /* If this isn't true, we need to look up the function table.   */
+
+    def = CUR.FDefs + F;
+    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
+    {
+      /* look up the FDefs table */
+      TT_DefRecord*  limit;
+
+
+      def   = CUR.FDefs;
+      limit = def + CUR.numFDefs;
+
+      while ( def < limit && def->opc != F )
+        def++;
+
+      if ( def == limit )
+        goto Fail;
+    }
+
+    /* check that the function is active */
+    if ( !def->active )
+      goto Fail;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( SUBPIXEL_HINTING                                    &&
+         CUR.ignore_x_mode                                   &&
+         ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) )
+      goto Fail;
+    else
+      CUR.sph_in_func_flags = def->sph_fdef_flags;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    /* check stack */
+    if ( CUR.callTop >= CUR.callSize )
+    {
+      CUR.error = FT_THROW( Stack_Overflow );
+      return;
+    }
+
+    if ( args[0] > 0 )
+    {
+      pCrec = CUR.callStack + CUR.callTop;
+
+      pCrec->Caller_Range = CUR.curRange;
+      pCrec->Caller_IP    = CUR.IP + 1;
+      pCrec->Cur_Count    = (FT_Int)args[0];
+      pCrec->Cur_Restart  = def->start;
+      pCrec->Cur_End      = def->end;
+
+      CUR.callTop++;
+
+      INS_Goto_CodeRange( def->range, def->start );
+
+      CUR.step_ins = FALSE;
+    }
+
+    return;
+
+  Fail:
+    CUR.error = FT_THROW( Invalid_Reference );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* IDEF[]:       Instruction DEFinition                                  */
+  /* Opcode range: 0x89                                                    */
+  /* Stack:        Eint8 -->                                               */
+  /*                                                                       */
+  static void
+  Ins_IDEF( INS_ARG )
+  {
+    TT_DefRecord*  def;
+    TT_DefRecord*  limit;
+
+
+    /*  First of all, look for the same function in our table */
+
+    def   = CUR.IDefs;
+    limit = def + CUR.numIDefs;
+
+    for ( ; def < limit; def++ )
+      if ( def->opc == (FT_ULong)args[0] )
+        break;
+
+    if ( def == limit )
+    {
+      /* check that there is enough room for a new instruction */
+      if ( CUR.numIDefs >= CUR.maxIDefs )
+      {
+        CUR.error = FT_THROW( Too_Many_Instruction_Defs );
+        return;
+      }
+      CUR.numIDefs++;
+    }
+
+    /* opcode must be unsigned 8-bit integer */
+    if ( 0 > args[0] || args[0] > 0x00FF )
+    {
+      CUR.error = FT_THROW( Too_Many_Instruction_Defs );
+      return;
+    }
+
+    def->opc    = (FT_Byte)args[0];
+    def->start  = CUR.IP + 1;
+    def->range  = CUR.curRange;
+    def->active = TRUE;
+
+    if ( (FT_ULong)args[0] > CUR.maxIns )
+      CUR.maxIns = (FT_Byte)args[0];
+
+    /* Now skip the whole function definition. */
+    /* We don't allow nested IDEFs & FDEFs.    */
+
+    while ( SKIP_Code() == SUCCESS )
+    {
+      switch ( CUR.opcode )
+      {
+      case 0x89:   /* IDEF */
+      case 0x2C:   /* FDEF */
+        CUR.error = FT_THROW( Nested_DEFS );
+        return;
+      case 0x2D:   /* ENDF */
+        return;
+      }
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* PUSHING DATA ONTO THE INTERPRETER STACK                               */
+  /*                                                                       */
+  /*   Instructions appear in the specification's order.                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* NPUSHB[]:     PUSH N Bytes                                            */
+  /* Opcode range: 0x40                                                    */
+  /* Stack:        --> uint32...                                           */
+  /*                                                                       */
+  static void
+  Ins_NPUSHB( INS_ARG )
+  {
+    FT_UShort  L, K;
+
+
+    L = (FT_UShort)CUR.code[CUR.IP + 1];
+
+    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+    {
+      CUR.error = FT_THROW( Stack_Overflow );
+      return;
+    }
+
+    for ( K = 1; K <= L; K++ )
+      args[K - 1] = CUR.code[CUR.IP + K + 1];
+
+    CUR.new_top += L;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* NPUSHW[]:     PUSH N Words                                            */
+  /* Opcode range: 0x41                                                    */
+  /* Stack:        --> int32...                                            */
+  /*                                                                       */
+  static void
+  Ins_NPUSHW( INS_ARG )
+  {
+    FT_UShort  L, K;
+
+
+    L = (FT_UShort)CUR.code[CUR.IP + 1];
+
+    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+    {
+      CUR.error = FT_THROW( Stack_Overflow );
+      return;
+    }
+
+    CUR.IP += 2;
+
+    for ( K = 0; K < L; K++ )
+      args[K] = GET_ShortIns();
+
+    CUR.step_ins = FALSE;
+    CUR.new_top += L;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* PUSHB[abc]:   PUSH Bytes                                              */
+  /* Opcode range: 0xB0-0xB7                                               */
+  /* Stack:        --> uint32...                                           */
+  /*                                                                       */
+  static void
+  Ins_PUSHB( INS_ARG )
+  {
+    FT_UShort  L, K;
+
+
+    L = (FT_UShort)( CUR.opcode - 0xB0 + 1 );
+
+    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+    {
+      CUR.error = FT_THROW( Stack_Overflow );
+      return;
+    }
+
+    for ( K = 1; K <= L; K++ )
+      args[K - 1] = CUR.code[CUR.IP + K];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* PUSHW[abc]:   PUSH Words                                              */
+  /* Opcode range: 0xB8-0xBF                                               */
+  /* Stack:        --> int32...                                            */
+  /*                                                                       */
+  static void
+  Ins_PUSHW( INS_ARG )
+  {
+    FT_UShort  L, K;
+
+
+    L = (FT_UShort)( CUR.opcode - 0xB8 + 1 );
+
+    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+    {
+      CUR.error = FT_THROW( Stack_Overflow );
+      return;
+    }
+
+    CUR.IP++;
+
+    for ( K = 0; K < L; K++ )
+      args[K] = GET_ShortIns();
+
+    CUR.step_ins = FALSE;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MANAGING THE GRAPHICS STATE                                           */
+  /*                                                                       */
+  /*  Instructions appear in the specs' order.                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* GC[a]:        Get Coordinate projected onto                           */
+  /* Opcode range: 0x46-0x47                                               */
+  /* Stack:        uint32 --> f26.6                                        */
+  /*                                                                       */
+  /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken     */
+  /*      along the dual projection vector!                                */
+  /*                                                                       */
+  static void
+  Ins_GC( INS_ARG )
+  {
+    FT_ULong    L;
+    FT_F26Dot6  R;
+
+
+    L = (FT_ULong)args[0];
+
+    if ( BOUNDSL( L, CUR.zp2.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      R = 0;
+    }
+    else
+    {
+      if ( CUR.opcode & 1 )
+        R = CUR_fast_dualproj( &CUR.zp2.org[L] );
+      else
+        R = CUR_fast_project( &CUR.zp2.cur[L] );
+    }
+
+    args[0] = R;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SCFS[]:       Set Coordinate From Stack                               */
+  /* Opcode range: 0x48                                                    */
+  /* Stack:        f26.6 uint32 -->                                        */
+  /*                                                                       */
+  /* Formula:                                                              */
+  /*                                                                       */
+  /*   OA := OA + ( value - OA.p )/( f.p ) * f                             */
+  /*                                                                       */
+  static void
+  Ins_SCFS( INS_ARG )
+  {
+    FT_Long    K;
+    FT_UShort  L;
+
+
+    L = (FT_UShort)args[0];
+
+    if ( BOUNDS( L, CUR.zp2.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    K = CUR_fast_project( &CUR.zp2.cur[L] );
+
+    CUR_Func_move( &CUR.zp2, L, args[1] - K );
+
+    /* UNDOCUMENTED!  The MS rasterizer does that with */
+    /* twilight points (confirmed by Greg Hitchcock)   */
+    if ( CUR.GS.gep2 == 0 )
+      CUR.zp2.org[L] = CUR.zp2.cur[L];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MD[a]:        Measure Distance                                        */
+  /* Opcode range: 0x49-0x4A                                               */
+  /* Stack:        uint32 uint32 --> f26.6                                 */
+  /*                                                                       */
+  /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along  */
+  /*                    the dual projection vector.                        */
+  /*                                                                       */
+  /* XXX: UNDOCUMENTED: Flag attributes are inverted!                      */
+  /*                      0 => measure distance in original outline        */
+  /*                      1 => measure distance in grid-fitted outline     */
+  /*                                                                       */
+  /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1!                   */
+  /*                                                                       */
+  static void
+  Ins_MD( INS_ARG )
+  {
+    FT_UShort   K, L;
+    FT_F26Dot6  D;
+
+
+    K = (FT_UShort)args[1];
+    L = (FT_UShort)args[0];
+
+    if ( BOUNDS( L, CUR.zp0.n_points ) ||
+         BOUNDS( K, CUR.zp1.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      D = 0;
+    }
+    else
+    {
+      if ( CUR.opcode & 1 )
+        D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K );
+      else
+      {
+        /* XXX: UNDOCUMENTED: twilight zone special case */
+
+        if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
+        {
+          FT_Vector*  vec1 = CUR.zp0.org + L;
+          FT_Vector*  vec2 = CUR.zp1.org + K;
+
+
+          D = CUR_Func_dualproj( vec1, vec2 );
+        }
+        else
+        {
+          FT_Vector*  vec1 = CUR.zp0.orus + L;
+          FT_Vector*  vec2 = CUR.zp1.orus + K;
+
+
+          if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+          {
+            /* this should be faster */
+            D = CUR_Func_dualproj( vec1, vec2 );
+            D = FT_MulFix( D, CUR.metrics.x_scale );
+          }
+          else
+          {
+            FT_Vector  vec;
+
+
+            vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );
+            vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );
+
+            D = CUR_fast_dualproj( &vec );
+          }
+        }
+      }
+    }
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */
+    if ( SUBPIXEL_HINTING                       &&
+         CUR.ignore_x_mode && FT_ABS( D ) == 64 )
+      D += 1;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    args[0] = D;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SDPVTL[a]:    Set Dual PVector to Line                                */
+  /* Opcode range: 0x86-0x87                                               */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_SDPVTL( INS_ARG )
+  {
+    FT_Long    A, B, C;
+    FT_UShort  p1, p2;            /* was FT_Int in pas type ERROR */
+    FT_Int     aOpc = CUR.opcode;
+
+
+    p1 = (FT_UShort)args[1];
+    p2 = (FT_UShort)args[0];
+
+    if ( BOUNDS( p2, CUR.zp1.n_points ) ||
+         BOUNDS( p1, CUR.zp2.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    {
+      FT_Vector* v1 = CUR.zp1.org + p2;
+      FT_Vector* v2 = CUR.zp2.org + p1;
+
+
+      A = v1->x - v2->x;
+      B = v1->y - v2->y;
+
+      /* If v1 == v2, SDPVTL behaves the same as */
+      /* SVTCA[X], respectively.                 */
+      /*                                         */
+      /* Confirmed by Greg Hitchcock.            */
+
+      if ( A == 0 && B == 0 )
+      {
+        A    = 0x4000;
+        aOpc = 0;
+      }
+    }
+
+    if ( ( aOpc & 1 ) != 0 )
+    {
+      C =  B;   /* counter clockwise rotation */
+      B =  A;
+      A = -C;
+    }
+
+    NORMalize( A, B, &CUR.GS.dualVector );
+
+    {
+      FT_Vector*  v1 = CUR.zp1.cur + p2;
+      FT_Vector*  v2 = CUR.zp2.cur + p1;
+
+
+      A = v1->x - v2->x;
+      B = v1->y - v2->y;
+
+      if ( A == 0 && B == 0 )
+      {
+        A    = 0x4000;
+        aOpc = 0;
+      }
+    }
+
+    if ( ( aOpc & 1 ) != 0 )
+    {
+      C =  B;   /* counter clockwise rotation */
+      B =  A;
+      A = -C;
+    }
+
+    NORMalize( A, B, &CUR.GS.projVector );
+
+    GUESS_VECTOR( freeVector );
+
+    COMPUTE_Funcs();
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SZP0[]:       Set Zone Pointer 0                                      */
+  /* Opcode range: 0x13                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SZP0( INS_ARG )
+  {
+    switch ( (FT_Int)args[0] )
+    {
+    case 0:
+      CUR.zp0 = CUR.twilight;
+      break;
+
+    case 1:
+      CUR.zp0 = CUR.pts;
+      break;
+
+    default:
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    CUR.GS.gep0 = (FT_UShort)args[0];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SZP1[]:       Set Zone Pointer 1                                      */
+  /* Opcode range: 0x14                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SZP1( INS_ARG )
+  {
+    switch ( (FT_Int)args[0] )
+    {
+    case 0:
+      CUR.zp1 = CUR.twilight;
+      break;
+
+    case 1:
+      CUR.zp1 = CUR.pts;
+      break;
+
+    default:
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    CUR.GS.gep1 = (FT_UShort)args[0];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SZP2[]:       Set Zone Pointer 2                                      */
+  /* Opcode range: 0x15                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SZP2( INS_ARG )
+  {
+    switch ( (FT_Int)args[0] )
+    {
+    case 0:
+      CUR.zp2 = CUR.twilight;
+      break;
+
+    case 1:
+      CUR.zp2 = CUR.pts;
+      break;
+
+    default:
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    CUR.GS.gep2 = (FT_UShort)args[0];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SZPS[]:       Set Zone PointerS                                       */
+  /* Opcode range: 0x16                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SZPS( INS_ARG )
+  {
+    switch ( (FT_Int)args[0] )
+    {
+    case 0:
+      CUR.zp0 = CUR.twilight;
+      break;
+
+    case 1:
+      CUR.zp0 = CUR.pts;
+      break;
+
+    default:
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    CUR.zp1 = CUR.zp0;
+    CUR.zp2 = CUR.zp0;
+
+    CUR.GS.gep0 = (FT_UShort)args[0];
+    CUR.GS.gep1 = (FT_UShort)args[0];
+    CUR.GS.gep2 = (FT_UShort)args[0];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* INSTCTRL[]:   INSTruction ConTRoL                                     */
+  /* Opcode range: 0x8e                                                    */
+  /* Stack:        int32 int32 -->                                         */
+  /*                                                                       */
+  static void
+  Ins_INSTCTRL( INS_ARG )
+  {
+    FT_Long  K, L;
+
+
+    K = args[1];
+    L = args[0];
+
+    if ( K < 1 || K > 2 )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    if ( L != 0 )
+        L = K;
+
+    CUR.GS.instruct_control = FT_BOOL(
+      ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SCANCTRL[]:   SCAN ConTRoL                                            */
+  /* Opcode range: 0x85                                                    */
+  /* Stack:        uint32? -->                                             */
+  /*                                                                       */
+  static void
+  Ins_SCANCTRL( INS_ARG )
+  {
+    FT_Int  A;
+
+
+    /* Get Threshold */
+    A = (FT_Int)( args[0] & 0xFF );
+
+    if ( A == 0xFF )
+    {
+      CUR.GS.scan_control = TRUE;
+      return;
+    }
+    else if ( A == 0 )
+    {
+      CUR.GS.scan_control = FALSE;
+      return;
+    }
+
+    if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A )
+      CUR.GS.scan_control = TRUE;
+
+    if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated )
+      CUR.GS.scan_control = TRUE;
+
+    if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched )
+      CUR.GS.scan_control = TRUE;
+
+    if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A )
+      CUR.GS.scan_control = FALSE;
+
+    if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated )
+      CUR.GS.scan_control = FALSE;
+
+    if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched )
+      CUR.GS.scan_control = FALSE;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SCANTYPE[]:   SCAN TYPE                                               */
+  /* Opcode range: 0x8D                                                    */
+  /* Stack:        uint32? -->                                             */
+  /*                                                                       */
+  static void
+  Ins_SCANTYPE( INS_ARG )
+  {
+    if ( args[0] >= 0 )
+      CUR.GS.scan_type = (FT_Int)args[0];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MANAGING OUTLINES                                                     */
+  /*                                                                       */
+  /*   Instructions appear in the specification's order.                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FLIPPT[]:     FLIP PoinT                                              */
+  /* Opcode range: 0x80                                                    */
+  /* Stack:        uint32... -->                                           */
+  /*                                                                       */
+  static void
+  Ins_FLIPPT( INS_ARG )
+  {
+    FT_UShort  point;
+
+    FT_UNUSED_ARG;
+
+
+    if ( CUR.top < CUR.GS.loop )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Too_Few_Arguments );
+      goto Fail;
+    }
+
+    while ( CUR.GS.loop > 0 )
+    {
+      CUR.args--;
+
+      point = (FT_UShort)CUR.stack[CUR.args];
+
+      if ( BOUNDS( point, CUR.pts.n_points ) )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = FT_THROW( Invalid_Reference );
+          return;
+        }
+      }
+      else
+        CUR.pts.tags[point] ^= FT_CURVE_TAG_ON;
+
+      CUR.GS.loop--;
+    }
+
+  Fail:
+    CUR.GS.loop = 1;
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FLIPRGON[]:   FLIP RanGe ON                                           */
+  /* Opcode range: 0x81                                                    */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_FLIPRGON( INS_ARG )
+  {
+    FT_UShort  I, K, L;
+
+
+    K = (FT_UShort)args[1];
+    L = (FT_UShort)args[0];
+
+    if ( BOUNDS( K, CUR.pts.n_points ) ||
+         BOUNDS( L, CUR.pts.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    for ( I = L; I <= K; I++ )
+      CUR.pts.tags[I] |= FT_CURVE_TAG_ON;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FLIPRGOFF:    FLIP RanGe OFF                                          */
+  /* Opcode range: 0x82                                                    */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_FLIPRGOFF( INS_ARG )
+  {
+    FT_UShort  I, K, L;
+
+
+    K = (FT_UShort)args[1];
+    L = (FT_UShort)args[0];
+
+    if ( BOUNDS( K, CUR.pts.n_points ) ||
+         BOUNDS( L, CUR.pts.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    for ( I = L; I <= K; I++ )
+      CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON;
+  }
+
+
+  static FT_Bool
+  Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6*   x,
+                                       FT_F26Dot6*   y,
+                                       TT_GlyphZone  zone,
+                                       FT_UShort*    refp )
+  {
+    TT_GlyphZoneRec  zp;
+    FT_UShort        p;
+    FT_F26Dot6       d;
+
+
+    if ( CUR.opcode & 1 )
+    {
+      zp = CUR.zp0;
+      p  = CUR.GS.rp1;
+    }
+    else
+    {
+      zp = CUR.zp1;
+      p  = CUR.GS.rp2;
+    }
+
+    if ( BOUNDS( p, zp.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      *refp = 0;
+      return FAILURE;
+    }
+
+    *zone = zp;
+    *refp = p;
+
+    d = CUR_Func_project( zp.cur + p, zp.org + p );
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    if ( CUR.face->unpatented_hinting )
+    {
+      if ( CUR.GS.both_x_axis )
+      {
+        *x = d;
+        *y = 0;
+      }
+      else
+      {
+        *x = 0;
+        *y = d;
+      }
+    }
+    else
+#endif
+    {
+      *x = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.x, CUR.F_dot_P );
+      *y = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.y, CUR.F_dot_P );
+    }
+
+    return SUCCESS;
+  }
+
+
+  static void
+  Move_Zp2_Point( EXEC_OP_ FT_UShort   point,
+                           FT_F26Dot6  dx,
+                           FT_F26Dot6  dy,
+                           FT_Bool     touch )
+  {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    if ( CUR.face->unpatented_hinting )
+    {
+      if ( CUR.GS.both_x_axis )
+      {
+        CUR.zp2.cur[point].x += dx;
+        if ( touch )
+          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
+      }
+      else
+      {
+        CUR.zp2.cur[point].y += dy;
+        if ( touch )
+          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+      }
+      return;
+    }
+#endif
+
+	if (CUR.zp2.cur == NULL) return; /* Security fix: Google Chris6 ufuzz109.pdf page #1 */
+    if ( CUR.GS.freeVector.x != 0 )
+    {
+      CUR.zp2.cur[point].x += dx;
+      if ( touch )
+        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
+    }
+
+    if ( CUR.GS.freeVector.y != 0 )
+    {
+      CUR.zp2.cur[point].y += dy;
+      if ( touch )
+        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SHP[a]:       SHift Point by the last point                           */
+  /* Opcode range: 0x32-0x33                                               */
+  /* Stack:        uint32... -->                                           */
+  /*                                                                       */
+  static void
+  Ins_SHP( INS_ARG )
+  {
+    TT_GlyphZoneRec  zp;
+    FT_UShort        refp;
+
+    FT_F26Dot6       dx,
+                     dy;
+    FT_UShort        point;
+
+    FT_UNUSED_ARG;
+
+
+    if ( CUR.top < CUR.GS.loop )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      goto Fail;
+    }
+
+    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+      return;
+
+    while ( CUR.GS.loop > 0 )
+    {
+      CUR.args--;
+      point = (FT_UShort)CUR.stack[CUR.args];
+
+      if ( BOUNDS( point, CUR.zp2.n_points ) )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = FT_THROW( Invalid_Reference );
+          return;
+        }
+      }
+      else
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+      /* doesn't follow Cleartype spec but produces better result */
+      if ( SUBPIXEL_HINTING  &&
+           CUR.ignore_x_mode )
+        MOVE_Zp2_Point( point, 0, dy, TRUE );
+      else
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+        MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+      CUR.GS.loop--;
+    }
+
+  Fail:
+    CUR.GS.loop = 1;
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SHC[a]:       SHift Contour                                           */
+  /* Opcode range: 0x34-35                                                 */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual)     */
+  /*               contour in the twilight zone, namely contour number     */
+  /*               zero which includes all points of it.                   */
+  /*                                                                       */
+  static void
+  Ins_SHC( INS_ARG )
+  {
+    TT_GlyphZoneRec  zp;
+    FT_UShort        refp;
+    FT_F26Dot6       dx, dy;
+
+    FT_Short         contour, bounds;
+    FT_UShort        start, limit, i;
+
+
+    contour = (FT_UShort)args[0];
+    bounds  = ( CUR.GS.gep2 == 0 ) ? 1 : CUR.zp2.n_contours;
+
+    if ( BOUNDS( contour, bounds ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+      return;
+
+    if ( contour == 0 )
+      start = 0;
+    else
+      start = (FT_UShort)( CUR.zp2.contours[contour - 1] + 1 -
+                           CUR.zp2.first_point );
+
+    /* we use the number of points if in the twilight zone */
+    if ( CUR.GS.gep2 == 0 )
+      limit = CUR.zp2.n_points;
+    else
+      limit = (FT_UShort)( CUR.zp2.contours[contour] -
+                           CUR.zp2.first_point + 1 );
+
+    for ( i = start; i < limit; i++ )
+    {
+      if ( zp.cur != CUR.zp2.cur || refp != i )
+        MOVE_Zp2_Point( i, dx, dy, TRUE );
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SHZ[a]:       SHift Zone                                              */
+  /* Opcode range: 0x36-37                                                 */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SHZ( INS_ARG )
+  {
+    TT_GlyphZoneRec  zp;
+    FT_UShort        refp;
+    FT_F26Dot6       dx,
+                     dy;
+
+    FT_UShort        limit, i;
+
+
+    if ( BOUNDS( args[0], 2 ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+      return;
+
+    /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points.     */
+    /*      Twilight zone has no real contours, so use `n_points'. */
+    /*      Normal zone's `n_points' includes phantoms, so must    */
+    /*      use end of last contour.                               */
+    if ( CUR.GS.gep2 == 0 )
+      limit = (FT_UShort)CUR.zp2.n_points;
+    else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 ) {
+      limit = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] + 1 );
+	  if (limit >= CUR.zp2.n_points)		/* XYQ 2010-10-01: security fix: validate last point index */
+		  limit = CUR.zp2.n_points - 1;
+	}
+    else
+      limit = 0;
+
+    /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */
+    for ( i = 0; i < limit; i++ )
+    {
+      if ( zp.cur != CUR.zp2.cur || refp != i )
+        MOVE_Zp2_Point( i, dx, dy, FALSE );
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SHPIX[]:      SHift points by a PIXel amount                          */
+  /* Opcode range: 0x38                                                    */
+  /* Stack:        f26.6 uint32... -->                                     */
+  /*                                                                       */
+  static void
+  Ins_SHPIX( INS_ARG )
+  {
+    FT_F26Dot6  dx, dy;
+    FT_UShort   point;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    FT_Int      B1, B2;
+#endif
+
+
+    if ( CUR.top < CUR.GS.loop + 1 )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      goto Fail;
+    }
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    if ( CUR.face->unpatented_hinting )
+    {
+      if ( CUR.GS.both_x_axis )
+      {
+        dx = (FT_UInt32)args[0];
+        dy = 0;
+      }
+      else
+      {
+        dx = 0;
+        dy = (FT_UInt32)args[0];
+      }
+    }
+    else
+#endif
+    {
+      dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x );
+      dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y );
+    }
+
+    while ( CUR.GS.loop > 0 )
+    {
+      CUR.args--;
+
+      point = (FT_UShort)CUR.stack[CUR.args];
+
+      if ( BOUNDS( point, CUR.zp2.n_points ) )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = FT_THROW( Invalid_Reference );
+          return;
+        }
+      }
+      else
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+      {
+        /*  If not using ignore_x_mode rendering, allow ZP2 move.          */
+        /*  If inline deltas aren't allowed, skip ZP2 move.                */
+        /*  If using ignore_x_mode rendering, allow ZP2 point move if:     */
+        /*   - freedom vector is y and sph_compatibility_mode is off       */
+        /*   - the glyph is composite and the move is in the Y direction   */
+        /*   - the glyph is specifically set to allow SHPIX moves          */
+        /*   - the move is on a previously Y-touched point                 */
+
+        if ( SUBPIXEL_HINTING  &&
+             CUR.ignore_x_mode )
+        {
+          /* save point for later comparison */
+          if ( CUR.GS.freeVector.y != 0 )
+            B1 = CUR.zp2.cur[point].y;
+          else
+            B1 = CUR.zp2.cur[point].x;
+
+          if ( !CUR.face->sph_compatibility_mode &&
+               CUR.GS.freeVector.y != 0          )
+          {
+            MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+            /* save new point */
+            if ( CUR.GS.freeVector.y != 0 )
+            {
+              B2 = CUR.zp2.cur[point].y;
+
+              /* reverse any disallowed moves */
+              if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
+                   ( B1 & 63 ) != 0                                          &&
+                   ( B2 & 63 ) != 0                                          &&
+                    B1 != B2                                                 )
+                MOVE_Zp2_Point( point, -dx, -dy, TRUE );
+            }
+          }
+          else if ( CUR.face->sph_compatibility_mode )
+          {
+            if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
+            {
+              dx = FT_PIX_ROUND( B1 + dx ) - B1;
+              dy = FT_PIX_ROUND( B1 + dy ) - B1;
+            }
+
+            /* skip post-iup deltas */
+            if ( CUR.iup_called                                          &&
+                 ( ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) ||
+                   ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) )
+              goto Skip;
+
+            if ( !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) &&
+                  ( ( CUR.is_composite && CUR.GS.freeVector.y != 0 ) ||
+                    ( CUR.zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y )   ||
+                    ( CUR.sph_tweak_flags & SPH_TWEAK_DO_SHPIX )     )   )
+              MOVE_Zp2_Point( point, 0, dy, TRUE );
+
+            /* save new point */
+            if ( CUR.GS.freeVector.y != 0 )
+            {
+              B2 = CUR.zp2.cur[point].y;
+
+              /* reverse any disallowed moves */
+              if ( ( B1 & 63 ) == 0 &&
+                   ( B2 & 63 ) != 0 &&
+                   B1 != B2         )
+                MOVE_Zp2_Point( point, 0, -dy, TRUE );
+            }
+          }
+          else if ( CUR.sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL )
+            MOVE_Zp2_Point( point, dx, dy, TRUE );
+        }
+        else
+          MOVE_Zp2_Point( point, dx, dy, TRUE );
+      }
+
+    Skip:
+
+#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+        MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+      CUR.GS.loop--;
+    }
+
+  Fail:
+    CUR.GS.loop = 1;
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MSIRP[a]:     Move Stack Indirect Relative Position                   */
+  /* Opcode range: 0x3A-0x3B                                               */
+  /* Stack:        f26.6 uint32 -->                                        */
+  /*                                                                       */
+  static void
+  Ins_MSIRP( INS_ARG )
+  {
+    FT_UShort   point;
+    FT_F26Dot6  distance;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    FT_F26Dot6  control_value_cutin = 0; /* pacify compiler */
+
+
+    if ( SUBPIXEL_HINTING )
+    {
+      control_value_cutin = CUR.GS.control_value_cutin;
+
+      if ( CUR.ignore_x_mode                                 &&
+           CUR.GS.freeVector.x != 0                          &&
+           !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
+        control_value_cutin = 0;
+    }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    point = (FT_UShort)args[0];
+
+    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
+         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    /* UNDOCUMENTED!  The MS rasterizer does that with */
+    /* twilight points (confirmed by Greg Hitchcock)   */
+    if ( CUR.GS.gep1 == 0 )
+    {
+      CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0];
+      CUR_Func_move_orig( &CUR.zp1, point, args[1] );
+      CUR.zp1.cur[point] = CUR.zp1.org[point];
+    }
+
+    distance = CUR_Func_project( CUR.zp1.cur + point,
+                                 CUR.zp0.cur + CUR.GS.rp0 );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    /* subpixel hinting - make MSIRP respect CVT cut-in; */
+    if ( SUBPIXEL_HINTING                                    &&
+         CUR.ignore_x_mode                                   &&
+         CUR.GS.freeVector.x != 0                            &&
+         FT_ABS( distance - args[1] ) >= control_value_cutin )
+      distance = args[1];
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    CUR_Func_move( &CUR.zp1, point, args[1] - distance );
+
+    CUR.GS.rp1 = CUR.GS.rp0;
+    CUR.GS.rp2 = point;
+
+    if ( ( CUR.opcode & 1 ) != 0 )
+      CUR.GS.rp0 = point;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MDAP[a]:      Move Direct Absolute Point                              */
+  /* Opcode range: 0x2E-0x2F                                               */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_MDAP( INS_ARG )
+  {
+    FT_UShort   point;
+    FT_F26Dot6  cur_dist;
+    FT_F26Dot6  distance;
+
+
+    point = (FT_UShort)args[0];
+
+    if ( BOUNDS( point, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    if ( ( CUR.opcode & 1 ) != 0 )
+    {
+      cur_dist = CUR_fast_project( &CUR.zp0.cur[point] );
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+      if ( SUBPIXEL_HINTING         &&
+           CUR.ignore_x_mode        &&
+           CUR.GS.freeVector.x != 0 )
+        distance = ROUND_None(
+                     cur_dist,
+                     CUR.tt_metrics.compensations[0] ) - cur_dist;
+      else
+#endif
+        distance = CUR_Func_round(
+                     cur_dist,
+                     CUR.tt_metrics.compensations[0] ) - cur_dist;
+    }
+    else
+      distance = 0;
+
+    CUR_Func_move( &CUR.zp0, point, distance );
+
+    CUR.GS.rp0 = point;
+    CUR.GS.rp1 = point;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MIAP[a]:      Move Indirect Absolute Point                            */
+  /* Opcode range: 0x3E-0x3F                                               */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_MIAP( INS_ARG )
+  {
+    FT_ULong    cvtEntry;
+    FT_UShort   point;
+    FT_F26Dot6  distance;
+    FT_F26Dot6  org_dist;
+    FT_F26Dot6  control_value_cutin;
+
+
+    control_value_cutin = CUR.GS.control_value_cutin;
+    cvtEntry            = (FT_ULong)args[1];
+    point               = (FT_UShort)args[0];
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( SUBPIXEL_HINTING                                  &&
+         CUR.ignore_x_mode                                 &&
+         CUR.GS.freeVector.x != 0                          &&
+         CUR.GS.freeVector.y == 0                          &&
+         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
+      control_value_cutin = 0;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    if ( BOUNDS( point,     CUR.zp0.n_points ) ||
+         BOUNDSL( cvtEntry, CUR.cvtSize )      )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      goto Fail;
+    }
+
+    /* UNDOCUMENTED!                                                      */
+    /*                                                                    */
+    /* The behaviour of an MIAP instruction is quite different when used  */
+    /* in the twilight zone.                                              */
+    /*                                                                    */
+    /* First, no control value cut-in test is performed as it would fail  */
+    /* anyway.  Second, the original point, i.e. (org_x,org_y) of         */
+    /* zp0.point, is set to the absolute, unrounded distance found in the */
+    /* CVT.                                                               */
+    /*                                                                    */
+    /* This is used in the CVT programs of the Microsoft fonts Arial,     */
+    /* Times, etc., in order to re-adjust some key font heights.  It      */
+    /* allows the use of the IP instruction in the twilight zone, which   */
+    /* otherwise would be invalid according to the specification.         */
+    /*                                                                    */
+    /* We implement it with a special sequence for the twilight zone.     */
+    /* This is a bad hack, but it seems to work.                          */
+    /*                                                                    */
+    /* Confirmed by Greg Hitchcock.                                       */
+
+    distance = CUR_Func_read_cvt( cvtEntry );
+
+    if ( CUR.GS.gep0 == 0 )   /* If in twilight zone */
+    {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+      /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */
+      /* Determined via experimentation and may be incorrect...         */
+      if ( !SUBPIXEL_HINTING                     ||
+           ( !CUR.ignore_x_mode                ||
+             !CUR.face->sph_compatibility_mode ) )
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+        CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance,
+                                            CUR.GS.freeVector.x );
+      CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance,
+                                          CUR.GS.freeVector.y ),
+      CUR.zp0.cur[point]   = CUR.zp0.org[point];
+    }
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( SUBPIXEL_HINTING                              &&
+         CUR.ignore_x_mode                             &&
+         ( CUR.sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) &&
+         distance > 0                                  &&
+         CUR.GS.freeVector.y != 0                      )
+      distance = 0;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    org_dist = CUR_fast_project( &CUR.zp0.cur[point] );
+
+    if ( ( CUR.opcode & 1 ) != 0 )   /* rounding and control cut-in flag */
+    {
+      if ( FT_ABS( distance - org_dist ) > control_value_cutin )
+        distance = org_dist;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+      if ( SUBPIXEL_HINTING         &&
+           CUR.ignore_x_mode        &&
+           CUR.GS.freeVector.x != 0 )
+        distance = ROUND_None( distance,
+                               CUR.tt_metrics.compensations[0] );
+      else
+#endif
+        distance = CUR_Func_round( distance,
+                                   CUR.tt_metrics.compensations[0] );
+    }
+
+    CUR_Func_move( &CUR.zp0, point, distance - org_dist );
+
+  Fail:
+    CUR.GS.rp0 = point;
+    CUR.GS.rp1 = point;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MDRP[abcde]:  Move Direct Relative Point                              */
+  /* Opcode range: 0xC0-0xDF                                               */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_MDRP( INS_ARG )
+  {
+    FT_UShort   point;
+    FT_F26Dot6  org_dist, distance, minimum_distance;
+
+
+    minimum_distance = CUR.GS.minimum_distance;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( SUBPIXEL_HINTING                                  &&
+         CUR.ignore_x_mode                                 &&
+         CUR.GS.freeVector.x != 0                          &&
+         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
+      minimum_distance = 0;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    point = (FT_UShort)args[0];
+
+    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
+         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      goto Fail;
+    }
+
+    /* XXX: Is there some undocumented feature while in the */
+    /*      twilight zone?                                  */
+
+    /* XXX: UNDOCUMENTED: twilight zone special case */
+
+    if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
+    {
+      FT_Vector*  vec1 = &CUR.zp1.org[point];
+      FT_Vector*  vec2 = &CUR.zp0.org[CUR.GS.rp0];
+
+
+      org_dist = CUR_Func_dualproj( vec1, vec2 );
+    }
+    else
+    {
+      FT_Vector*  vec1 = &CUR.zp1.orus[point];
+      FT_Vector*  vec2 = &CUR.zp0.orus[CUR.GS.rp0];
+
+
+      if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+      {
+        /* this should be faster */
+        org_dist = CUR_Func_dualproj( vec1, vec2 );
+        org_dist = FT_MulFix( org_dist, CUR.metrics.x_scale );
+      }
+      else
+      {
+        FT_Vector  vec;
+
+
+        vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );
+        vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );
+
+        org_dist = CUR_fast_dualproj( &vec );
+      }
+    }
+
+    /* single width cut-in test */
+
+    if ( FT_ABS( org_dist - CUR.GS.single_width_value ) <
+         CUR.GS.single_width_cutin )
+    {
+      if ( org_dist >= 0 )
+        org_dist = CUR.GS.single_width_value;
+      else
+        org_dist = -CUR.GS.single_width_value;
+    }
+
+    /* round flag */
+
+    if ( ( CUR.opcode & 4 ) != 0 )
+    {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+      if ( SUBPIXEL_HINTING         &&
+           CUR.ignore_x_mode        &&
+           CUR.GS.freeVector.x != 0 )
+        distance = ROUND_None(
+                     org_dist,
+                     CUR.tt_metrics.compensations[CUR.opcode & 3] );
+      else
+#endif
+      distance = CUR_Func_round(
+                   org_dist,
+                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
+    }
+    else
+      distance = ROUND_None(
+                   org_dist,
+                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
+
+    /* minimum distance flag */
+
+    if ( ( CUR.opcode & 8 ) != 0 )
+    {
+      if ( org_dist >= 0 )
+      {
+        if ( distance < minimum_distance )
+          distance = minimum_distance;
+      }
+      else
+      {
+        if ( distance > -minimum_distance )
+          distance = -minimum_distance;
+      }
+    }
+
+    /* now move the point */
+
+    org_dist = CUR_Func_project( CUR.zp1.cur + point,
+                                 CUR.zp0.cur + CUR.GS.rp0 );
+
+    CUR_Func_move( &CUR.zp1, point, distance - org_dist );
+
+  Fail:
+    CUR.GS.rp1 = CUR.GS.rp0;
+    CUR.GS.rp2 = point;
+
+    if ( ( CUR.opcode & 16 ) != 0 )
+      CUR.GS.rp0 = point;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MIRP[abcde]:  Move Indirect Relative Point                            */
+  /* Opcode range: 0xE0-0xFF                                               */
+  /* Stack:        int32? uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_MIRP( INS_ARG )
+  {
+    FT_UShort   point;
+    FT_ULong    cvtEntry;
+
+    FT_F26Dot6  cvt_dist,
+                distance,
+                cur_dist,
+                org_dist,
+                control_value_cutin,
+                minimum_distance;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    FT_Int      B1           = 0; /* pacify compiler */
+    FT_Int      B2           = 0;
+    FT_Bool     reverse_move = FALSE;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+    minimum_distance    = CUR.GS.minimum_distance;
+    control_value_cutin = CUR.GS.control_value_cutin;
+    point               = (FT_UShort)args[0];
+    cvtEntry            = (FT_ULong)( args[1] + 1 );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( SUBPIXEL_HINTING                                  &&
+         CUR.ignore_x_mode                                 &&
+         CUR.GS.freeVector.x != 0                          &&
+         !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
+      control_value_cutin = minimum_distance = 0;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */
+	/* Security fix: Google 07_oobread4.pdf page #1, cvtEntry > CUR.cvtSize + 1 will cause array index oob. */
+    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
+         BOUNDS( cvtEntry,  CUR.cvtSize + 1 )  ||
+         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      goto Fail;
+    }
+
+    if ( !cvtEntry )
+      cvt_dist = 0;
+    else
+      cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 );
+
+    /* single width test */
+
+    if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) <
+         CUR.GS.single_width_cutin )
+    {
+      if ( cvt_dist >= 0 )
+        cvt_dist =  CUR.GS.single_width_value;
+      else
+        cvt_dist = -CUR.GS.single_width_value;
+    }
+
+    /* UNDOCUMENTED!  The MS rasterizer does that with */
+    /* twilight points (confirmed by Greg Hitchcock)   */
+    if ( CUR.GS.gep1 == 0 )
+    {
+      CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x +
+                             TT_MulFix14( (FT_UInt32)cvt_dist,
+                                          CUR.GS.freeVector.x );
+      CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y +
+                             TT_MulFix14( (FT_UInt32)cvt_dist,
+                                          CUR.GS.freeVector.y );
+      CUR.zp1.cur[point]   = CUR.zp1.org[point];
+    }
+
+    org_dist = CUR_Func_dualproj( &CUR.zp1.org[point],
+                                  &CUR.zp0.org[CUR.GS.rp0] );
+    cur_dist = CUR_Func_project ( &CUR.zp1.cur[point],
+                                  &CUR.zp0.cur[CUR.GS.rp0] );
+
+    /* auto-flip test */
+
+    if ( CUR.GS.auto_flip )
+    {
+      if ( ( org_dist ^ cvt_dist ) < 0 )
+        cvt_dist = -cvt_dist;
+    }
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( SUBPIXEL_HINTING                                         &&
+         CUR.ignore_x_mode                                        &&
+         CUR.GS.freeVector.y != 0                                 &&
+         ( CUR.sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) )
+    {
+      if ( cur_dist < -64 )
+        cvt_dist -= 16;
+      else if ( cur_dist > 64 && cur_dist < 84 )
+        cvt_dist += 32;
+    }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    /* control value cut-in and round */
+
+    if ( ( CUR.opcode & 4 ) != 0 )
+    {
+      /* XXX: UNDOCUMENTED!  Only perform cut-in test when both points */
+      /*      refer to the same zone.                                  */
+
+      if ( CUR.GS.gep0 == CUR.GS.gep1 )
+      {
+        /* XXX: According to Greg Hitchcock, the following wording is */
+        /*      the right one:                                        */
+        /*                                                            */
+        /*        When the absolute difference between the value in   */
+        /*        the table [CVT] and the measurement directly from   */
+        /*        the outline is _greater_ than the cut_in value, the */
+        /*        outline measurement is used.                        */
+        /*                                                            */
+        /*      This is from `instgly.doc'.  The description in       */
+        /*      `ttinst2.doc', version 1.66, is thus incorrect since  */
+        /*      it implies `>=' instead of `>'.                       */
+
+        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
+          cvt_dist = org_dist;
+      }
+
+      distance = CUR_Func_round(
+                   cvt_dist,
+                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
+    }
+    else
+    {
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+      /* do cvt cut-in always in MIRP for sph */
+      if ( SUBPIXEL_HINTING           &&
+           CUR.ignore_x_mode          &&
+           CUR.GS.gep0 == CUR.GS.gep1 )
+      {
+        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
+          cvt_dist = org_dist;
+      }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+      distance = ROUND_None(
+                   cvt_dist,
+                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
+    }
+
+    /* minimum distance test */
+
+    if ( ( CUR.opcode & 8 ) != 0 )
+    {
+      if ( org_dist >= 0 )
+      {
+        if ( distance < minimum_distance )
+          distance = minimum_distance;
+      }
+      else
+      {
+        if ( distance > -minimum_distance )
+          distance = -minimum_distance;
+      }
+    }
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( SUBPIXEL_HINTING )
+    {
+      B1 = CUR.zp1.cur[point].y;
+
+      /* Round moves if necessary */
+      if ( CUR.ignore_x_mode                                          &&
+           CUR.GS.freeVector.y != 0                                   &&
+           ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) )
+        distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist;
+
+      if ( CUR.ignore_x_mode                                      &&
+           CUR.GS.freeVector.y != 0                               &&
+           ( CUR.opcode & 16 ) == 0                               &&
+           ( CUR.opcode & 8 ) == 0                                &&
+           ( CUR.sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) )
+        distance += 64;
+    }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    CUR_Func_move( &CUR.zp1, point, distance - cur_dist );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( SUBPIXEL_HINTING )
+    {
+      B2 = CUR.zp1.cur[point].y;
+
+      /* Reverse move if necessary */
+      if ( CUR.ignore_x_mode )
+      {
+        if ( CUR.face->sph_compatibility_mode                          &&
+             CUR.GS.freeVector.y != 0                                  &&
+             ( B1 & 63 ) == 0                                          &&
+             ( B2 & 63 ) != 0                                          )
+          reverse_move = TRUE;
+
+        if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
+             CUR.GS.freeVector.y != 0                                  &&
+             ( B2 & 63 ) != 0                                          &&
+             ( B1 & 63 ) != 0                                          )
+          reverse_move = TRUE;
+      }
+
+      if ( reverse_move )
+        CUR_Func_move( &CUR.zp1, point, -( distance - cur_dist ) );
+    }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+  Fail:
+    CUR.GS.rp1 = CUR.GS.rp0;
+
+    if ( ( CUR.opcode & 16 ) != 0 )
+      CUR.GS.rp0 = point;
+
+    CUR.GS.rp2 = point;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ALIGNRP[]:    ALIGN Relative Point                                    */
+  /* Opcode range: 0x3C                                                    */
+  /* Stack:        uint32 uint32... -->                                    */
+  /*                                                                       */
+  static void
+  Ins_ALIGNRP( INS_ARG )
+  {
+    FT_UShort   point;
+    FT_F26Dot6  distance;
+
+    FT_UNUSED_ARG;
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( SUBPIXEL_HINTING                                         &&
+         CUR.ignore_x_mode                                        &&
+         CUR.iup_called                                           &&
+         ( CUR.sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) )
+    {
+      CUR.error = FT_THROW( Invalid_Reference );
+      goto Fail;
+    }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    if ( CUR.top < CUR.GS.loop ||
+         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      goto Fail;
+    }
+
+    while ( CUR.GS.loop > 0 )
+    {
+      CUR.args--;
+
+      point = (FT_UShort)CUR.stack[CUR.args];
+
+      if ( BOUNDS( point, CUR.zp1.n_points ) )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = FT_THROW( Invalid_Reference );
+          return;
+        }
+      }
+      else
+      {
+        distance = CUR_Func_project( CUR.zp1.cur + point,
+                                     CUR.zp0.cur + CUR.GS.rp0 );
+
+        CUR_Func_move( &CUR.zp1, point, -distance );
+      }
+
+      CUR.GS.loop--;
+    }
+
+  Fail:
+    CUR.GS.loop = 1;
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ISECT[]:      moves point to InterSECTion                             */
+  /* Opcode range: 0x0F                                                    */
+  /* Stack:        5 * uint32 -->                                          */
+  /*                                                                       */
+  static void
+  Ins_ISECT( INS_ARG )
+  {
+    FT_UShort   point,
+                a0, a1,
+                b0, b1;
+
+    FT_F26Dot6  discriminant, dotproduct;
+
+    FT_F26Dot6  dx,  dy,
+                dax, day,
+                dbx, dby;
+
+    FT_F26Dot6  val;
+
+    FT_Vector   R;
+
+
+    point = (FT_UShort)args[0];
+
+    a0 = (FT_UShort)args[1];
+    a1 = (FT_UShort)args[2];
+    b0 = (FT_UShort)args[3];
+    b1 = (FT_UShort)args[4];
+
+    if ( BOUNDS( b0, CUR.zp0.n_points )  ||
+         BOUNDS( b1, CUR.zp0.n_points )  ||
+         BOUNDS( a0, CUR.zp1.n_points )  ||
+         BOUNDS( a1, CUR.zp1.n_points )  ||
+         BOUNDS( point, CUR.zp2.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    /* Cramer's rule */
+
+    dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x;
+    dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y;
+
+    dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x;
+    day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y;
+
+    dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x;
+    dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y;
+
+    CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;
+
+    discriminant = FT_MulDiv( dax, -dby, 0x40 ) +
+                   FT_MulDiv( day, dbx, 0x40 );
+    dotproduct   = FT_MulDiv( dax, dbx, 0x40 ) +
+                   FT_MulDiv( day, dby, 0x40 );
+
+    /* The discriminant above is actually a cross product of vectors     */
+    /* da and db. Together with the dot product, they can be used as     */
+    /* surrogates for sine and cosine of the angle between the vectors.  */
+    /* Indeed,                                                           */
+    /*       dotproduct   = |da||db|cos(angle)                           */
+    /*       discriminant = |da||db|sin(angle)     .                     */
+    /* We use these equations to reject grazing intersections by         */
+    /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */
+    if ( 19 * FT_ABS( discriminant ) > FT_ABS( dotproduct ) )
+    {
+      val = FT_MulDiv( dx, -dby, 0x40 ) + FT_MulDiv( dy, dbx, 0x40 );
+
+      R.x = FT_MulDiv( val, dax, discriminant );
+      R.y = FT_MulDiv( val, day, discriminant );
+
+      CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x;
+      CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y;
+    }
+    else
+    {
+      /* else, take the middle of the middles of A and B */
+
+      CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x +
+                               CUR.zp1.cur[a1].x +
+                               CUR.zp0.cur[b0].x +
+                               CUR.zp0.cur[b1].x ) / 4;
+      CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y +
+                               CUR.zp1.cur[a1].y +
+                               CUR.zp0.cur[b0].y +
+                               CUR.zp0.cur[b1].y ) / 4;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ALIGNPTS[]:   ALIGN PoinTS                                            */
+  /* Opcode range: 0x27                                                    */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_ALIGNPTS( INS_ARG )
+  {
+    FT_UShort   p1, p2;
+    FT_F26Dot6  distance;
+
+
+    p1 = (FT_UShort)args[0];
+    p2 = (FT_UShort)args[1];
+
+    if ( BOUNDS( p1, CUR.zp1.n_points ) ||
+         BOUNDS( p2, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    distance = CUR_Func_project( CUR.zp0.cur + p2,
+                                 CUR.zp1.cur + p1 ) / 2;
+
+    CUR_Func_move( &CUR.zp1, p1, distance );
+    CUR_Func_move( &CUR.zp0, p2, -distance );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* IP[]:         Interpolate Point                                       */
+  /* Opcode range: 0x39                                                    */
+  /* Stack:        uint32... -->                                           */
+  /*                                                                       */
+
+  /* SOMETIMES, DUMBER CODE IS BETTER CODE */
+
+  static void
+  Ins_IP( INS_ARG )
+  {
+    FT_F26Dot6  old_range, cur_range;
+    FT_Vector*  orus_base;
+    FT_Vector*  cur_base;
+    FT_Int      twilight;
+
+    FT_UNUSED_ARG;
+
+
+    if ( CUR.top < CUR.GS.loop )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      goto Fail;
+    }
+
+    /*
+     * We need to deal in a special way with the twilight zone.
+     * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0),
+     * for every n.
+     */
+    twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0;
+
+    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      goto Fail;
+    }
+
+    if ( twilight )
+      orus_base = &CUR.zp0.org[CUR.GS.rp1];
+    else
+      orus_base = &CUR.zp0.orus[CUR.GS.rp1];
+
+    cur_base = &CUR.zp0.cur[CUR.GS.rp1];
+
+    /* XXX: There are some glyphs in some braindead but popular */
+    /*      fonts out there (e.g. [aeu]grave in monotype.ttf)   */
+    /*      calling IP[] with bad values of rp[12].             */
+    /*      Do something sane when this odd thing happens.      */
+    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ||
+         BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) )
+    {
+      old_range = 0;
+      cur_range = 0;
+    }
+    else
+    {
+      if ( twilight )
+        old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2],
+                                       orus_base );
+      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+        old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2],
+                                       orus_base );
+      else
+      {
+        FT_Vector  vec;
+
+
+        vec.x = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].x - orus_base->x,
+                           CUR.metrics.x_scale );
+        vec.y = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].y - orus_base->y,
+                           CUR.metrics.y_scale );
+
+        old_range = CUR_fast_dualproj( &vec );
+      }
+
+      cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base );
+    }
+
+    for ( ; CUR.GS.loop > 0; --CUR.GS.loop )
+    {
+      FT_UInt     point = (FT_UInt)CUR.stack[--CUR.args];
+      FT_F26Dot6  org_dist, cur_dist, new_dist;
+
+
+      /* check point bounds */
+      if ( BOUNDS( point, CUR.zp2.n_points ) )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = FT_THROW( Invalid_Reference );
+          return;
+        }
+        continue;
+      }
+
+      if ( twilight )
+        org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base );
+      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+        org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base );
+      else
+      {
+        FT_Vector  vec;
+
+
+        vec.x = FT_MulFix( CUR.zp2.orus[point].x - orus_base->x,
+                           CUR.metrics.x_scale );
+        vec.y = FT_MulFix( CUR.zp2.orus[point].y - orus_base->y,
+                           CUR.metrics.y_scale );
+
+        org_dist = CUR_fast_dualproj( &vec );
+      }
+
+      cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base );
+
+      if ( org_dist )
+      {
+        if ( old_range )
+          new_dist = FT_MulDiv( org_dist, cur_range, old_range );
+        else
+        {
+          /* This is the same as what MS does for the invalid case:  */
+          /*                                                         */
+          /*   delta = (Original_Pt - Original_RP1) -                */
+          /*           (Current_Pt - Current_RP1)                    */
+          /*                                                         */
+          /* In FreeType speak:                                      */
+          /*                                                         */
+          /*   new_dist = cur_dist -                                 */
+          /*              org_dist - cur_dist;                       */
+
+          new_dist = -org_dist;
+        }
+      }
+      else
+        new_dist = 0;
+
+      CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist );
+    }
+
+  Fail:
+    CUR.GS.loop = 1;
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* UTP[a]:       UnTouch Point                                           */
+  /* Opcode range: 0x29                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_UTP( INS_ARG )
+  {
+    FT_UShort  point;
+    FT_Byte    mask;
+
+
+    point = (FT_UShort)args[0];
+
+    if ( BOUNDS( point, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = FT_THROW( Invalid_Reference );
+      return;
+    }
+
+    mask = 0xFF;
+
+    if ( CUR.GS.freeVector.x != 0 )
+      mask &= ~FT_CURVE_TAG_TOUCH_X;
+
+    if ( CUR.GS.freeVector.y != 0 )
+      mask &= ~FT_CURVE_TAG_TOUCH_Y;
+
+    CUR.zp0.tags[point] &= mask;
+  }
+
+
+  /* Local variables for Ins_IUP: */
+  typedef struct  IUP_WorkerRec_
+  {
+    FT_Vector*  orgs;   /* original and current coordinate */
+    FT_Vector*  curs;   /* arrays                          */
+    FT_Vector*  orus;
+    FT_UInt     max_points;
+
+  } IUP_WorkerRec, *IUP_Worker;
+
+
+  static void
+  _iup_worker_shift( IUP_Worker  worker,
+                     FT_UInt     p1,
+                     FT_UInt     p2,
+                     FT_UInt     p )
+  {
+    FT_UInt     i;
+    FT_F26Dot6  dx;
+
+
+    dx = worker->curs[p].x - worker->orgs[p].x;
+    if ( dx != 0 )
+    {
+      for ( i = p1; i < p; i++ )
+        worker->curs[i].x += dx;
+
+      for ( i = p + 1; i <= p2; i++ )
+        worker->curs[i].x += dx;
+    }
+  }
+
+
+  static void
+  _iup_worker_interpolate( IUP_Worker  worker,
+                           FT_UInt     p1,
+                           FT_UInt     p2,
+                           FT_UInt     ref1,
+                           FT_UInt     ref2 )
+  {
+    FT_UInt     i;
+    FT_F26Dot6  orus1, orus2, org1, org2, delta1, delta2;
+
+
+    if ( p1 > p2 )
+      return;
+
+    if ( BOUNDS( ref1, worker->max_points ) ||
+         BOUNDS( ref2, worker->max_points ) )
+      return;
+
+    orus1 = worker->orus[ref1].x;
+    orus2 = worker->orus[ref2].x;
+
+    if ( orus1 > orus2 )
+    {
+      FT_F26Dot6  tmp_o;
+      FT_UInt     tmp_r;
+
+
+      tmp_o = orus1;
+      orus1 = orus2;
+      orus2 = tmp_o;
+
+      tmp_r = ref1;
+      ref1  = ref2;
+      ref2  = tmp_r;
+    }
+
+    org1   = worker->orgs[ref1].x;
+    org2   = worker->orgs[ref2].x;
+    delta1 = worker->curs[ref1].x - org1;
+    delta2 = worker->curs[ref2].x - org2;
+
+    if ( orus1 == orus2 )
+    {
+      /* simple shift of untouched points */
+      for ( i = p1; i <= p2; i++ )
+      {
+        FT_F26Dot6  x = worker->orgs[i].x;
+
+
+        if ( x <= org1 )
+          x += delta1;
+        else
+          x += delta2;
+
+        worker->curs[i].x = x;
+      }
+    }
+    else
+    {
+      FT_Fixed  scale       = 0;
+      FT_Bool   scale_valid = 0;
+
+
+      /* interpolation */
+      for ( i = p1; i <= p2; i++ )
+      {
+        FT_F26Dot6  x = worker->orgs[i].x;
+
+
+        if ( x <= org1 )
+          x += delta1;
+
+        else if ( x >= org2 )
+          x += delta2;
+
+        else
+        {
+          if ( !scale_valid )
+          {
+            scale_valid = 1;
+            scale       = FT_DivFix( org2 + delta2 - ( org1 + delta1 ),
+                                     orus2 - orus1 );
+          }
+
+          x = ( org1 + delta1 ) +
+              FT_MulFix( worker->orus[i].x - orus1, scale );
+        }
+        worker->curs[i].x = x;
+      }
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* IUP[a]:       Interpolate Untouched Points                            */
+  /* Opcode range: 0x30-0x31                                               */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_IUP( INS_ARG )
+  {
+    IUP_WorkerRec  V;
+    FT_Byte        mask;
+
+    FT_UInt   first_point;   /* first point of contour        */
+    FT_UInt   end_point;     /* end point (last+1) of contour */
+
+    FT_UInt   first_touched; /* first touched point in contour   */
+    FT_UInt   cur_touched;   /* current touched point in contour */
+
+    FT_UInt   point;         /* current point   */
+    FT_Short  contour;       /* current contour */
+
+    FT_UNUSED_ARG;
+
+
+    /* ignore empty outlines */
+    if ( CUR.pts.n_contours == 0 )
+      return;
+
+    if ( CUR.opcode & 1 )
+    {
+      mask   = FT_CURVE_TAG_TOUCH_X;
+      V.orgs = CUR.pts.org;
+      V.curs = CUR.pts.cur;
+      V.orus = CUR.pts.orus;
+    }
+    else
+    {
+      mask   = FT_CURVE_TAG_TOUCH_Y;
+      V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 );
+      V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 );
+      V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 );
+    }
+    V.max_points = CUR.pts.n_points;
+
+    contour = 0;
+    point   = 0;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    if ( SUBPIXEL_HINTING  &&
+         CUR.ignore_x_mode )
+    {
+      CUR.iup_called = TRUE;
+      if ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_IUP )
+        return;
+    }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    do
+    {
+      end_point   = CUR.pts.contours[contour] - CUR.pts.first_point;
+      first_point = point;
+
+      if ( BOUNDS ( end_point, CUR.pts.n_points ) )
+        end_point = CUR.pts.n_points - 1;
+
+      while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 )
+        point++;
+
+      if ( point <= end_point )
+      {
+        first_touched = point;
+        cur_touched   = point;
+
+        point++;
+
+        while ( point <= end_point )
+        {
+          if ( ( CUR.pts.tags[point] & mask ) != 0 )
+          {
+            _iup_worker_interpolate( &V,
+                                     cur_touched + 1,
+                                     point - 1,
+                                     cur_touched,
+                                     point );
+            cur_touched = point;
+          }
+
+          point++;
+        }
+
+        if ( cur_touched == first_touched )
+          _iup_worker_shift( &V, first_point, end_point, cur_touched );
+        else
+        {
+          _iup_worker_interpolate( &V,
+                                   (FT_UShort)( cur_touched + 1 ),
+                                   end_point,
+                                   cur_touched,
+                                   first_touched );
+
+          if ( first_touched > 0 )
+            _iup_worker_interpolate( &V,
+                                     first_point,
+                                     first_touched - 1,
+                                     cur_touched,
+                                     first_touched );
+        }
+      }
+      contour++;
+    } while ( contour < CUR.pts.n_contours );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DELTAPn[]:    DELTA exceptions P1, P2, P3                             */
+  /* Opcode range: 0x5D,0x71,0x72                                          */
+  /* Stack:        uint32 (2 * uint32)... -->                              */
+  /*                                                                       */
+  static void
+  Ins_DELTAP( INS_ARG )
+  {
+    FT_ULong   k, nump;
+    FT_UShort  A;
+    FT_ULong   C;
+    FT_Long    B;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    FT_UShort  B1, B2;
+
+
+    if ( SUBPIXEL_HINTING                                        &&
+         CUR.ignore_x_mode                                       &&
+         CUR.iup_called                                          &&
+         ( CUR.sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) )
+      goto Fail;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    /* Delta hinting is covered by US Patent 5159668. */
+    if ( CUR.face->unpatented_hinting )
+    {
+      FT_Long  n = args[0] * 2;
+
+
+      if ( CUR.args < n )
+      {
+        if ( CUR.pedantic_hinting )
+          CUR.error = FT_THROW( Too_Few_Arguments );
+        n = CUR.args;
+      }
+
+      CUR.args -= n;
+      CUR.new_top = CUR.args;
+      return;
+    }
+#endif
+
+    nump = (FT_ULong)args[0];   /* some points theoretically may occur more
+                                   than once, thus UShort isn't enough */
+
+    for ( k = 1; k <= nump; k++ )
+    {
+      if ( CUR.args < 2 )
+      {
+        if ( CUR.pedantic_hinting )
+          CUR.error = FT_THROW( Too_Few_Arguments );
+        CUR.args = 0;
+        goto Fail;
+      }
+
+      CUR.args -= 2;
+
+      A = (FT_UShort)CUR.stack[CUR.args + 1];
+      B = CUR.stack[CUR.args];
+
+      /* XXX: Because some popular fonts contain some invalid DeltaP */
+      /*      instructions, we simply ignore them when the stacked   */
+      /*      point reference is off limit, rather than returning an */
+      /*      error.  As a delta instruction doesn't change a glyph  */
+      /*      in great ways, this shouldn't be a problem.            */
+
+      if ( !BOUNDS( A, CUR.zp0.n_points ) )
+      {
+        C = ( (FT_ULong)B & 0xF0 ) >> 4;
+
+        switch ( CUR.opcode )
+        {
+        case 0x5D:
+          break;
+
+        case 0x71:
+          C += 16;
+          break;
+
+        case 0x72:
+          C += 32;
+          break;
+        }
+
+        C += CUR.GS.delta_base;
+
+        if ( CURRENT_Ppem() == (FT_Long)C )
+        {
+          B = ( (FT_ULong)B & 0xF ) - 8;
+          if ( B >= 0 )
+            B++;
+          B = B * 64 / ( 1L << CUR.GS.delta_shift );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+          if ( SUBPIXEL_HINTING )
+          {
+            /*
+             *  Allow delta move if
+             *
+             *  - not using ignore_x_mode rendering
+             *  - glyph is specifically set to allow it
+             *  - glyph is composite and freedom vector is not subpixel
+             *    vector
+             */
+            if ( !CUR.ignore_x_mode                                   ||
+                 ( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) ||
+                 ( CUR.is_composite && CUR.GS.freeVector.y != 0 )     )
+              CUR_Func_move( &CUR.zp0, A, B );
+
+            /* Otherwise apply subpixel hinting and */
+            /* compatibility mode rules             */
+            else if ( CUR.ignore_x_mode )
+            {
+              if ( CUR.GS.freeVector.y != 0 )
+                B1 = CUR.zp0.cur[A].y;
+              else
+                B1 = CUR.zp0.cur[A].x;
+
+#if 0
+              /* Standard Subpixel Hinting: Allow y move.       */
+              /* This messes up dejavu and may not be needed... */
+              if ( !CUR.face->sph_compatibility_mode &&
+                   CUR.GS.freeVector.y != 0          )
+                CUR_Func_move( &CUR.zp0, A, B );
+              else
+#endif /* 0 */
+
+              /* Compatibility Mode: Allow x or y move if point touched in */
+              /* Y direction.                                              */
+              if ( CUR.face->sph_compatibility_mode                      &&
+                   !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) )
+              {
+                /* save the y value of the point now; compare after move */
+                B1 = CUR.zp0.cur[A].y;
+
+                if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
+                  B = FT_PIX_ROUND( B1 + B ) - B1;
+
+                /* Allow delta move if using sph_compatibility_mode,   */
+                /* IUP has not been called, and point is touched on Y. */
+                if ( !CUR.iup_called                            &&
+                     ( CUR.zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )
+                  CUR_Func_move( &CUR.zp0, A, B );
+              }
+
+              B2 = CUR.zp0.cur[A].y;
+
+              /* Reverse this move if it results in a disallowed move */
+              if ( CUR.GS.freeVector.y != 0                           &&
+                   ( ( CUR.face->sph_compatibility_mode           &&
+                       ( B1 & 63 ) == 0                           &&
+                       ( B2 & 63 ) != 0                           ) ||
+                     ( ( CUR.sph_tweak_flags                    &
+                         SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) &&
+                       ( B1 & 63 ) != 0                           &&
+                       ( B2 & 63 ) != 0                           ) ) )
+                CUR_Func_move( &CUR.zp0, A, -B );
+            }
+          }
+          else
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+            CUR_Func_move( &CUR.zp0, A, B );
+        }
+      }
+      else
+        if ( CUR.pedantic_hinting )
+          CUR.error = FT_THROW( Invalid_Reference );
+    }
+
+  Fail:
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DELTACn[]:    DELTA exceptions C1, C2, C3                             */
+  /* Opcode range: 0x73,0x74,0x75                                          */
+  /* Stack:        uint32 (2 * uint32)... -->                              */
+  /*                                                                       */
+  static void
+  Ins_DELTAC( INS_ARG )
+  {
+    FT_ULong  nump, k;
+    FT_ULong  A, C;
+    FT_Long   B;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    /* Delta hinting is covered by US Patent 5159668. */
+    if ( CUR.face->unpatented_hinting )
+    {
+      FT_Long  n = args[0] * 2;
+
+
+      if ( CUR.args < n )
+      {
+        if ( CUR.pedantic_hinting )
+          CUR.error = FT_THROW( Too_Few_Arguments );
+        n = CUR.args;
+      }
+
+      CUR.args -= n;
+      CUR.new_top = CUR.args;
+      return;
+    }
+#endif
+
+    nump = (FT_ULong)args[0];
+
+    for ( k = 1; k <= nump; k++ )
+    {
+      if ( CUR.args < 2 )
+      {
+        if ( CUR.pedantic_hinting )
+          CUR.error = FT_THROW( Too_Few_Arguments );
+        CUR.args = 0;
+        goto Fail;
+      }
+
+      CUR.args -= 2;
+
+      A = (FT_ULong)CUR.stack[CUR.args + 1];
+      B = CUR.stack[CUR.args];
+
+      if ( BOUNDSL( A, CUR.cvtSize ) )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = FT_THROW( Invalid_Reference );
+          return;
+        }
+      }
+      else
+      {
+        C = ( (FT_ULong)B & 0xF0 ) >> 4;
+
+        switch ( CUR.opcode )
+        {
+        case 0x73:
+          break;
+
+        case 0x74:
+          C += 16;
+          break;
+
+        case 0x75:
+          C += 32;
+          break;
+        }
+
+        C += CUR.GS.delta_base;
+
+        if ( CURRENT_Ppem() == (FT_Long)C )
+        {
+          B = ( (FT_ULong)B & 0xF ) - 8;
+          if ( B >= 0 )
+            B++;
+          B = B * 64 / ( 1L << CUR.GS.delta_shift );
+
+          CUR_Func_move_cvt( A, B );
+        }
+      }
+    }
+
+  Fail:
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MISC. INSTRUCTIONS                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* GETINFO[]:    GET INFOrmation                                         */
+  /* Opcode range: 0x88                                                    */
+  /* Stack:        uint32 --> uint32                                       */
+  /*                                                                       */
+  static void
+  Ins_GETINFO( INS_ARG )
+  {
+    FT_Long  K;
+
+
+    K = 0;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    /********************************/
+    /* RASTERIZER VERSION           */
+    /* Selector Bit:  0             */
+    /* Return Bit(s): 0-7           */
+    /*                              */
+    if ( SUBPIXEL_HINTING     &&
+         ( args[0] & 1 ) != 0 &&
+         CUR.ignore_x_mode    )
+    {
+      K = CUR.rasterizer_version;
+      FT_TRACE7(( "Setting rasterizer version %d\n",
+                  CUR.rasterizer_version ));
+    }
+    else
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+      if ( ( args[0] & 1 ) != 0 )
+        K = TT_INTERPRETER_VERSION_35;
+
+    /********************************/
+    /* GLYPH ROTATED                */
+    /* Selector Bit:  1             */
+    /* Return Bit(s): 8             */
+    /*                              */
+    if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated )
+      K |= 0x80;
+
+    /********************************/
+    /* GLYPH STRETCHED              */
+    /* Selector Bit:  2             */
+    /* Return Bit(s): 9             */
+    /*                              */
+    if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched )
+      K |= 1 << 8;
+
+    /********************************/
+    /* HINTING FOR GRAYSCALE        */
+    /* Selector Bit:  5             */
+    /* Return Bit(s): 12            */
+    /*                              */
+    if ( ( args[0] & 32 ) != 0 && CUR.grayscale )
+      K |= 1 << 12;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+    if ( SUBPIXEL_HINTING                                    &&
+         CUR.ignore_x_mode                                   &&
+         CUR.rasterizer_version >= TT_INTERPRETER_VERSION_35 )
+    {
+      /********************************/
+      /* HINTING FOR GRAYSCALE        */
+      /* Selector Bit:  5             */
+      /* Return Bit(s): 12            */
+      /*                              */
+      if ( ( args[0] & 32 ) != 0 && CUR.grayscale_hinting )
+        K |= 1 << 12;
+
+      /********************************/
+      /* HINTING FOR SUBPIXEL         */
+      /* Selector Bit:  6             */
+      /* Return Bit(s): 13            */
+      /*                              */
+      if ( ( args[0] & 64 ) != 0        &&
+           CUR.subpixel_hinting         &&
+           CUR.rasterizer_version >= 37 )
+      {
+        K |= 1 << 13;
+
+        /* the stuff below is irrelevant if subpixel_hinting is not set */
+
+        /********************************/
+        /* COMPATIBLE WIDTHS ENABLED    */
+        /* Selector Bit:  7             */
+        /* Return Bit(s): 14            */
+        /*                              */
+        /* Functionality still needs to be added */
+        if ( ( args[0] & 128 ) != 0 && CUR.compatible_widths )
+          K |= 1 << 14;
+
+        /********************************/
+        /* SYMMETRICAL SMOOTHING        */
+        /* Selector Bit:  8             */
+        /* Return Bit(s): 15            */
+        /*                              */
+        /* Functionality still needs to be added */
+        if ( ( args[0] & 256 ) != 0 && CUR.symmetrical_smoothing )
+          K |= 1 << 15;
+
+        /********************************/
+        /* HINTING FOR BGR?             */
+        /* Selector Bit:  9             */
+        /* Return Bit(s): 16            */
+        /*                              */
+        /* Functionality still needs to be added */
+        if ( ( args[0] & 512 ) != 0 && CUR.bgr )
+          K |= 1 << 16;
+
+        if ( CUR.rasterizer_version >= 38 )
+        {
+          /********************************/
+          /* SUBPIXEL POSITIONED?         */
+          /* Selector Bit:  10            */
+          /* Return Bit(s): 17            */
+          /*                              */
+          /* Functionality still needs to be added */
+          if ( ( args[0] & 1024 ) != 0 && CUR.subpixel_positioned )
+            K |= 1 << 17;
+        }
+      }
+    }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    args[0] = K;
+  }
+
+
+  static void
+  Ins_UNKNOWN( INS_ARG )
+  {
+    TT_DefRecord*  def   = CUR.IDefs;
+    TT_DefRecord*  limit = def + CUR.numIDefs;
+
+    FT_UNUSED_ARG;
+
+
+    for ( ; def < limit; def++ )
+    {
+      if ( (FT_Byte)def->opc == CUR.opcode && def->active )
+      {
+        TT_CallRec*  call;
+
+
+        if ( CUR.callTop >= CUR.callSize )
+        {
+          CUR.error = FT_THROW( Stack_Overflow );
+          return;
+        }
+
+        call = CUR.callStack + CUR.callTop++;
+
+        call->Caller_Range = CUR.curRange;
+        call->Caller_IP    = CUR.IP + 1;
+        call->Cur_Count    = 1;
+        call->Cur_Restart  = def->start;
+        call->Cur_End      = def->end;
+
+        INS_Goto_CodeRange( def->range, def->start );
+
+        CUR.step_ins = FALSE;
+        return;
+      }
+    }
+
+    CUR.error = FT_THROW( Invalid_Opcode );
+  }
+
+
+#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+  static
+  TInstruction_Function  Instruct_Dispatch[256] =
+  {
+    /* Opcodes are gathered in groups of 16. */
+    /* Please keep the spaces as they are.   */
+
+    /*  SVTCA  y  */  Ins_SVTCA,
+    /*  SVTCA  x  */  Ins_SVTCA,
+    /*  SPvTCA y  */  Ins_SPVTCA,
+    /*  SPvTCA x  */  Ins_SPVTCA,
+    /*  SFvTCA y  */  Ins_SFVTCA,
+    /*  SFvTCA x  */  Ins_SFVTCA,
+    /*  SPvTL //  */  Ins_SPVTL,
+    /*  SPvTL +   */  Ins_SPVTL,
+    /*  SFvTL //  */  Ins_SFVTL,
+    /*  SFvTL +   */  Ins_SFVTL,
+    /*  SPvFS     */  Ins_SPVFS,
+    /*  SFvFS     */  Ins_SFVFS,
+    /*  GPV       */  Ins_GPV,
+    /*  GFV       */  Ins_GFV,
+    /*  SFvTPv    */  Ins_SFVTPV,
+    /*  ISECT     */  Ins_ISECT,
+
+    /*  SRP0      */  Ins_SRP0,
+    /*  SRP1      */  Ins_SRP1,
+    /*  SRP2      */  Ins_SRP2,
+    /*  SZP0      */  Ins_SZP0,
+    /*  SZP1      */  Ins_SZP1,
+    /*  SZP2      */  Ins_SZP2,
+    /*  SZPS      */  Ins_SZPS,
+    /*  SLOOP     */  Ins_SLOOP,
+    /*  RTG       */  Ins_RTG,
+    /*  RTHG      */  Ins_RTHG,
+    /*  SMD       */  Ins_SMD,
+    /*  ELSE      */  Ins_ELSE,
+    /*  JMPR      */  Ins_JMPR,
+    /*  SCvTCi    */  Ins_SCVTCI,
+    /*  SSwCi     */  Ins_SSWCI,
+    /*  SSW       */  Ins_SSW,
+
+    /*  DUP       */  Ins_DUP,
+    /*  POP       */  Ins_POP,
+    /*  CLEAR     */  Ins_CLEAR,
+    /*  SWAP      */  Ins_SWAP,
+    /*  DEPTH     */  Ins_DEPTH,
+    /*  CINDEX    */  Ins_CINDEX,
+    /*  MINDEX    */  Ins_MINDEX,
+    /*  AlignPTS  */  Ins_ALIGNPTS,
+    /*  INS_0x28  */  Ins_UNKNOWN,
+    /*  UTP       */  Ins_UTP,
+    /*  LOOPCALL  */  Ins_LOOPCALL,
+    /*  CALL      */  Ins_CALL,
+    /*  FDEF      */  Ins_FDEF,
+    /*  ENDF      */  Ins_ENDF,
+    /*  MDAP[0]   */  Ins_MDAP,
+    /*  MDAP[1]   */  Ins_MDAP,
+
+    /*  IUP[0]    */  Ins_IUP,
+    /*  IUP[1]    */  Ins_IUP,
+    /*  SHP[0]    */  Ins_SHP,
+    /*  SHP[1]    */  Ins_SHP,
+    /*  SHC[0]    */  Ins_SHC,
+    /*  SHC[1]    */  Ins_SHC,
+    /*  SHZ[0]    */  Ins_SHZ,
+    /*  SHZ[1]    */  Ins_SHZ,
+    /*  SHPIX     */  Ins_SHPIX,
+    /*  IP        */  Ins_IP,
+    /*  MSIRP[0]  */  Ins_MSIRP,
+    /*  MSIRP[1]  */  Ins_MSIRP,
+    /*  AlignRP   */  Ins_ALIGNRP,
+    /*  RTDG      */  Ins_RTDG,
+    /*  MIAP[0]   */  Ins_MIAP,
+    /*  MIAP[1]   */  Ins_MIAP,
+
+    /*  NPushB    */  Ins_NPUSHB,
+    /*  NPushW    */  Ins_NPUSHW,
+    /*  WS        */  Ins_WS,
+    /*  RS        */  Ins_RS,
+    /*  WCvtP     */  Ins_WCVTP,
+    /*  RCvt      */  Ins_RCVT,
+    /*  GC[0]     */  Ins_GC,
+    /*  GC[1]     */  Ins_GC,
+    /*  SCFS      */  Ins_SCFS,
+    /*  MD[0]     */  Ins_MD,
+    /*  MD[1]     */  Ins_MD,
+    /*  MPPEM     */  Ins_MPPEM,
+    /*  MPS       */  Ins_MPS,
+    /*  FlipON    */  Ins_FLIPON,
+    /*  FlipOFF   */  Ins_FLIPOFF,
+    /*  DEBUG     */  Ins_DEBUG,
+
+    /*  LT        */  Ins_LT,
+    /*  LTEQ      */  Ins_LTEQ,
+    /*  GT        */  Ins_GT,
+    /*  GTEQ      */  Ins_GTEQ,
+    /*  EQ        */  Ins_EQ,
+    /*  NEQ       */  Ins_NEQ,
+    /*  ODD       */  Ins_ODD,
+    /*  EVEN      */  Ins_EVEN,
+    /*  IF        */  Ins_IF,
+    /*  EIF       */  Ins_EIF,
+    /*  AND       */  Ins_AND,
+    /*  OR        */  Ins_OR,
+    /*  NOT       */  Ins_NOT,
+    /*  DeltaP1   */  Ins_DELTAP,
+    /*  SDB       */  Ins_SDB,
+    /*  SDS       */  Ins_SDS,
+
+    /*  ADD       */  Ins_ADD,
+    /*  SUB       */  Ins_SUB,
+    /*  DIV       */  Ins_DIV,
+    /*  MUL       */  Ins_MUL,
+    /*  ABS       */  Ins_ABS,
+    /*  NEG       */  Ins_NEG,
+    /*  FLOOR     */  Ins_FLOOR,
+    /*  CEILING   */  Ins_CEILING,
+    /*  ROUND[0]  */  Ins_ROUND,
+    /*  ROUND[1]  */  Ins_ROUND,
+    /*  ROUND[2]  */  Ins_ROUND,
+    /*  ROUND[3]  */  Ins_ROUND,
+    /*  NROUND[0] */  Ins_NROUND,
+    /*  NROUND[1] */  Ins_NROUND,
+    /*  NROUND[2] */  Ins_NROUND,
+    /*  NROUND[3] */  Ins_NROUND,
+
+    /*  WCvtF     */  Ins_WCVTF,
+    /*  DeltaP2   */  Ins_DELTAP,
+    /*  DeltaP3   */  Ins_DELTAP,
+    /*  DeltaCn[0] */ Ins_DELTAC,
+    /*  DeltaCn[1] */ Ins_DELTAC,
+    /*  DeltaCn[2] */ Ins_DELTAC,
+    /*  SROUND    */  Ins_SROUND,
+    /*  S45Round  */  Ins_S45ROUND,
+    /*  JROT      */  Ins_JROT,
+    /*  JROF      */  Ins_JROF,
+    /*  ROFF      */  Ins_ROFF,
+    /*  INS_0x7B  */  Ins_UNKNOWN,
+    /*  RUTG      */  Ins_RUTG,
+    /*  RDTG      */  Ins_RDTG,
+    /*  SANGW     */  Ins_SANGW,
+    /*  AA        */  Ins_AA,
+
+    /*  FlipPT    */  Ins_FLIPPT,
+    /*  FlipRgON  */  Ins_FLIPRGON,
+    /*  FlipRgOFF */  Ins_FLIPRGOFF,
+    /*  INS_0x83  */  Ins_UNKNOWN,
+    /*  INS_0x84  */  Ins_UNKNOWN,
+    /*  ScanCTRL  */  Ins_SCANCTRL,
+    /*  SDPVTL[0] */  Ins_SDPVTL,
+    /*  SDPVTL[1] */  Ins_SDPVTL,
+    /*  GetINFO   */  Ins_GETINFO,
+    /*  IDEF      */  Ins_IDEF,
+    /*  ROLL      */  Ins_ROLL,
+    /*  MAX       */  Ins_MAX,
+    /*  MIN       */  Ins_MIN,
+    /*  ScanTYPE  */  Ins_SCANTYPE,
+    /*  InstCTRL  */  Ins_INSTCTRL,
+    /*  INS_0x8F  */  Ins_UNKNOWN,
+
+    /*  INS_0x90  */   Ins_UNKNOWN,
+    /*  INS_0x91  */   Ins_UNKNOWN,
+    /*  INS_0x92  */   Ins_UNKNOWN,
+    /*  INS_0x93  */   Ins_UNKNOWN,
+    /*  INS_0x94  */   Ins_UNKNOWN,
+    /*  INS_0x95  */   Ins_UNKNOWN,
+    /*  INS_0x96  */   Ins_UNKNOWN,
+    /*  INS_0x97  */   Ins_UNKNOWN,
+    /*  INS_0x98  */   Ins_UNKNOWN,
+    /*  INS_0x99  */   Ins_UNKNOWN,
+    /*  INS_0x9A  */   Ins_UNKNOWN,
+    /*  INS_0x9B  */   Ins_UNKNOWN,
+    /*  INS_0x9C  */   Ins_UNKNOWN,
+    /*  INS_0x9D  */   Ins_UNKNOWN,
+    /*  INS_0x9E  */   Ins_UNKNOWN,
+    /*  INS_0x9F  */   Ins_UNKNOWN,
+
+    /*  INS_0xA0  */   Ins_UNKNOWN,
+    /*  INS_0xA1  */   Ins_UNKNOWN,
+    /*  INS_0xA2  */   Ins_UNKNOWN,
+    /*  INS_0xA3  */   Ins_UNKNOWN,
+    /*  INS_0xA4  */   Ins_UNKNOWN,
+    /*  INS_0xA5  */   Ins_UNKNOWN,
+    /*  INS_0xA6  */   Ins_UNKNOWN,
+    /*  INS_0xA7  */   Ins_UNKNOWN,
+    /*  INS_0xA8  */   Ins_UNKNOWN,
+    /*  INS_0xA9  */   Ins_UNKNOWN,
+    /*  INS_0xAA  */   Ins_UNKNOWN,
+    /*  INS_0xAB  */   Ins_UNKNOWN,
+    /*  INS_0xAC  */   Ins_UNKNOWN,
+    /*  INS_0xAD  */   Ins_UNKNOWN,
+    /*  INS_0xAE  */   Ins_UNKNOWN,
+    /*  INS_0xAF  */   Ins_UNKNOWN,
+
+    /*  PushB[0]  */  Ins_PUSHB,
+    /*  PushB[1]  */  Ins_PUSHB,
+    /*  PushB[2]  */  Ins_PUSHB,
+    /*  PushB[3]  */  Ins_PUSHB,
+    /*  PushB[4]  */  Ins_PUSHB,
+    /*  PushB[5]  */  Ins_PUSHB,
+    /*  PushB[6]  */  Ins_PUSHB,
+    /*  PushB[7]  */  Ins_PUSHB,
+    /*  PushW[0]  */  Ins_PUSHW,
+    /*  PushW[1]  */  Ins_PUSHW,
+    /*  PushW[2]  */  Ins_PUSHW,
+    /*  PushW[3]  */  Ins_PUSHW,
+    /*  PushW[4]  */  Ins_PUSHW,
+    /*  PushW[5]  */  Ins_PUSHW,
+    /*  PushW[6]  */  Ins_PUSHW,
+    /*  PushW[7]  */  Ins_PUSHW,
+
+    /*  MDRP[00]  */  Ins_MDRP,
+    /*  MDRP[01]  */  Ins_MDRP,
+    /*  MDRP[02]  */  Ins_MDRP,
+    /*  MDRP[03]  */  Ins_MDRP,
+    /*  MDRP[04]  */  Ins_MDRP,
+    /*  MDRP[05]  */  Ins_MDRP,
+    /*  MDRP[06]  */  Ins_MDRP,
+    /*  MDRP[07]  */  Ins_MDRP,
+    /*  MDRP[08]  */  Ins_MDRP,
+    /*  MDRP[09]  */  Ins_MDRP,
+    /*  MDRP[10]  */  Ins_MDRP,
+    /*  MDRP[11]  */  Ins_MDRP,
+    /*  MDRP[12]  */  Ins_MDRP,
+    /*  MDRP[13]  */  Ins_MDRP,
+    /*  MDRP[14]  */  Ins_MDRP,
+    /*  MDRP[15]  */  Ins_MDRP,
+
+    /*  MDRP[16]  */  Ins_MDRP,
+    /*  MDRP[17]  */  Ins_MDRP,
+    /*  MDRP[18]  */  Ins_MDRP,
+    /*  MDRP[19]  */  Ins_MDRP,
+    /*  MDRP[20]  */  Ins_MDRP,
+    /*  MDRP[21]  */  Ins_MDRP,
+    /*  MDRP[22]  */  Ins_MDRP,
+    /*  MDRP[23]  */  Ins_MDRP,
+    /*  MDRP[24]  */  Ins_MDRP,
+    /*  MDRP[25]  */  Ins_MDRP,
+    /*  MDRP[26]  */  Ins_MDRP,
+    /*  MDRP[27]  */  Ins_MDRP,
+    /*  MDRP[28]  */  Ins_MDRP,
+    /*  MDRP[29]  */  Ins_MDRP,
+    /*  MDRP[30]  */  Ins_MDRP,
+    /*  MDRP[31]  */  Ins_MDRP,
+
+    /*  MIRP[00]  */  Ins_MIRP,
+    /*  MIRP[01]  */  Ins_MIRP,
+    /*  MIRP[02]  */  Ins_MIRP,
+    /*  MIRP[03]  */  Ins_MIRP,
+    /*  MIRP[04]  */  Ins_MIRP,
+    /*  MIRP[05]  */  Ins_MIRP,
+    /*  MIRP[06]  */  Ins_MIRP,
+    /*  MIRP[07]  */  Ins_MIRP,
+    /*  MIRP[08]  */  Ins_MIRP,
+    /*  MIRP[09]  */  Ins_MIRP,
+    /*  MIRP[10]  */  Ins_MIRP,
+    /*  MIRP[11]  */  Ins_MIRP,
+    /*  MIRP[12]  */  Ins_MIRP,
+    /*  MIRP[13]  */  Ins_MIRP,
+    /*  MIRP[14]  */  Ins_MIRP,
+    /*  MIRP[15]  */  Ins_MIRP,
+
+    /*  MIRP[16]  */  Ins_MIRP,
+    /*  MIRP[17]  */  Ins_MIRP,
+    /*  MIRP[18]  */  Ins_MIRP,
+    /*  MIRP[19]  */  Ins_MIRP,
+    /*  MIRP[20]  */  Ins_MIRP,
+    /*  MIRP[21]  */  Ins_MIRP,
+    /*  MIRP[22]  */  Ins_MIRP,
+    /*  MIRP[23]  */  Ins_MIRP,
+    /*  MIRP[24]  */  Ins_MIRP,
+    /*  MIRP[25]  */  Ins_MIRP,
+    /*  MIRP[26]  */  Ins_MIRP,
+    /*  MIRP[27]  */  Ins_MIRP,
+    /*  MIRP[28]  */  Ins_MIRP,
+    /*  MIRP[29]  */  Ins_MIRP,
+    /*  MIRP[30]  */  Ins_MIRP,
+    /*  MIRP[31]  */  Ins_MIRP
+  };
+
+
+#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* RUN                                                                   */
+  /*                                                                       */
+  /*  This function executes a run of opcodes.  It will exit in the        */
+  /*  following cases:                                                     */
+  /*                                                                       */
+  /*  - Errors (in which case it returns FALSE).                           */
+  /*                                                                       */
+  /*  - Reaching the end of the main code range (returns TRUE).            */
+  /*    Reaching the end of a code range within a function call is an      */
+  /*    error.                                                             */
+  /*                                                                       */
+  /*  - After executing one single opcode, if the flag `Instruction_Trap'  */
+  /*    is set to TRUE (returns TRUE).                                     */
+  /*                                                                       */
+  /*  On exit with TRUE, test IP < CodeSize to know whether it comes from  */
+  /*  an instruction trap or a normal termination.                         */
+  /*                                                                       */
+  /*                                                                       */
+  /*  Note: The documented DEBUG opcode pops a value from the stack.  This */
+  /*        behaviour is unsupported; here a DEBUG opcode is always an     */
+  /*        error.                                                         */
+  /*                                                                       */
+  /*                                                                       */
+  /* THIS IS THE INTERPRETER'S MAIN LOOP.                                  */
+  /*                                                                       */
+  /*  Instructions appear in the specification's order.                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* documentation is in ttinterp.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  TT_RunIns( TT_ExecContext  exc )
+  {
+    FT_Long    ins_counter = 0;  /* executed instructions counter */
+    FT_UShort  i;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    FT_Byte    opcode_pattern[1][2] = {
+                  /* #8 TypeMan Talk Align */
+                  {
+                    0x06, /* SPVTL   */
+                    0x7D, /* RDTG    */
+                  },
+                };
+    FT_UShort  opcode_patterns   = 1;
+    FT_UShort  opcode_pointer[1] = { 0 };
+    FT_UShort  opcode_size[1]    = { 1 };
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+#ifdef TT_CONFIG_OPTION_STATIC_RASTER
+    cur = *exc;
+#endif
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    CUR.iup_called = FALSE;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+    /* set CVT functions */
+    CUR.tt_metrics.ratio = 0;
+    if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem )
+    {
+      /* non-square pixels, use the stretched routines */
+      CUR.func_read_cvt  = Read_CVT_Stretched;
+      CUR.func_write_cvt = Write_CVT_Stretched;
+      CUR.func_move_cvt  = Move_CVT_Stretched;
+    }
+    else
+    {
+      /* square pixels, use normal routines */
+      CUR.func_read_cvt  = Read_CVT;
+      CUR.func_write_cvt = Write_CVT;
+      CUR.func_move_cvt  = Move_CVT;
+    }
+
+    COMPUTE_Funcs();
+    COMPUTE_Round( (FT_Byte)exc->GS.round_state );
+
+    do
+    {
+      CUR.opcode = CUR.code[CUR.IP];
+
+      FT_TRACE7(( "  " ));
+      FT_TRACE7(( opcode_name[CUR.opcode] ));
+      FT_TRACE7(( "\n" ));
+
+      if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 )
+      {
+        if ( CUR.IP + 1 >= CUR.codeSize )
+          goto LErrorCodeOverflow_;
+
+        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
+      }
+
+      if ( CUR.IP + CUR.length > CUR.codeSize )
+        goto LErrorCodeOverflow_;
+
+      /* First, let's check for empty stack and overflow */
+      CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 );
+
+      /* `args' is the top of the stack once arguments have been popped. */
+      /* One can also interpret it as the index of the last argument.    */
+      if ( CUR.args < 0 )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = FT_THROW( Too_Few_Arguments );
+          goto LErrorLabel_;
+        }
+
+        /* push zeroes onto the stack */
+        for ( i = 0; i < Pop_Push_Count[CUR.opcode] >> 4; i++ )
+          CUR.stack[i] = 0;
+        CUR.args = 0;
+      }
+
+      CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 );
+
+      /* `new_top' is the new top of the stack, after the instruction's */
+      /* execution.  `top' will be set to `new_top' after the `switch'  */
+      /* statement.                                                     */
+      if ( CUR.new_top > CUR.stackSize )
+      {
+        CUR.error = FT_THROW( Stack_Overflow );
+        goto LErrorLabel_;
+      }
+
+      CUR.step_ins = TRUE;
+      CUR.error    = FT_Err_Ok;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+      if ( SUBPIXEL_HINTING )
+      {
+        for ( i = 0; i < opcode_patterns; i++ )
+        {
+          if ( opcode_pointer[i] < opcode_size[i]                 &&
+               CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )
+          {
+            opcode_pointer[i] += 1;
+
+            if ( opcode_pointer[i] == opcode_size[i] )
+            {
+              FT_TRACE7(( "sph: opcode ptrn: %d, %s %s\n",
+                          i,
+                          CUR.face->root.family_name,
+                          CUR.face->root.style_name ));
+
+              switch ( i )
+              {
+              case 0:
+                break;
+              }
+              opcode_pointer[i] = 0;
+            }
+          }
+          else
+            opcode_pointer[i] = 0;
+        }
+      }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+      {
+        FT_Long*  args   = CUR.stack + CUR.args;
+        FT_Byte   opcode = CUR.opcode;
+
+
+#undef  ARRAY_BOUND_ERROR
+#define ARRAY_BOUND_ERROR  goto Set_Invalid_Ref
+
+
+        switch ( opcode )
+        {
+        case 0x00:  /* SVTCA y  */
+        case 0x01:  /* SVTCA x  */
+        case 0x02:  /* SPvTCA y */
+        case 0x03:  /* SPvTCA x */
+        case 0x04:  /* SFvTCA y */
+        case 0x05:  /* SFvTCA x */
+          {
+            FT_Short  AA, BB;
+
+
+            AA = (FT_Short)( ( opcode & 1 ) << 14 );
+            BB = (FT_Short)( AA ^ 0x4000 );
+
+            if ( opcode < 4 )
+            {
+              CUR.GS.projVector.x = AA;
+              CUR.GS.projVector.y = BB;
+
+              CUR.GS.dualVector.x = AA;
+              CUR.GS.dualVector.y = BB;
+            }
+            else
+            {
+              GUESS_VECTOR( projVector );
+            }
+
+            if ( ( opcode & 2 ) == 0 )
+            {
+              CUR.GS.freeVector.x = AA;
+              CUR.GS.freeVector.y = BB;
+            }
+            else
+            {
+              GUESS_VECTOR( freeVector );
+            }
+
+            COMPUTE_Funcs();
+          }
+          break;
+
+        case 0x06:  /* SPvTL // */
+        case 0x07:  /* SPvTL +  */
+          DO_SPVTL
+          break;
+
+        case 0x08:  /* SFvTL // */
+        case 0x09:  /* SFvTL +  */
+          DO_SFVTL
+          break;
+
+        case 0x0A:  /* SPvFS */
+          DO_SPVFS
+          break;
+
+        case 0x0B:  /* SFvFS */
+          DO_SFVFS
+          break;
+
+        case 0x0C:  /* GPV */
+          DO_GPV
+          break;
+
+        case 0x0D:  /* GFV */
+          DO_GFV
+          break;
+
+        case 0x0E:  /* SFvTPv */
+          DO_SFVTPV
+          break;
+
+        case 0x0F:  /* ISECT  */
+          Ins_ISECT( EXEC_ARG_ args );
+          break;
+
+        case 0x10:  /* SRP0 */
+          DO_SRP0
+          break;
+
+        case 0x11:  /* SRP1 */
+          DO_SRP1
+          break;
+
+        case 0x12:  /* SRP2 */
+          DO_SRP2
+          break;
+
+        case 0x13:  /* SZP0 */
+          Ins_SZP0( EXEC_ARG_ args );
+          break;
+
+        case 0x14:  /* SZP1 */
+          Ins_SZP1( EXEC_ARG_ args );
+          break;
+
+        case 0x15:  /* SZP2 */
+          Ins_SZP2( EXEC_ARG_ args );
+          break;
+
+        case 0x16:  /* SZPS */
+          Ins_SZPS( EXEC_ARG_ args );
+          break;
+
+        case 0x17:  /* SLOOP */
+          DO_SLOOP
+          break;
+
+        case 0x18:  /* RTG */
+          DO_RTG
+          break;
+
+        case 0x19:  /* RTHG */
+          DO_RTHG
+          break;
+
+        case 0x1A:  /* SMD */
+          DO_SMD
+          break;
+
+        case 0x1B:  /* ELSE */
+          Ins_ELSE( EXEC_ARG_ args );
+          break;
+
+        case 0x1C:  /* JMPR */
+          DO_JMPR
+          break;
+
+        case 0x1D:  /* SCVTCI */
+          DO_SCVTCI
+          break;
+
+        case 0x1E:  /* SSWCI */
+          DO_SSWCI
+          break;
+
+        case 0x1F:  /* SSW */
+          DO_SSW
+          break;
+
+        case 0x20:  /* DUP */
+          DO_DUP
+          break;
+
+        case 0x21:  /* POP */
+          /* nothing :-) */
+          break;
+
+        case 0x22:  /* CLEAR */
+          DO_CLEAR
+          break;
+
+        case 0x23:  /* SWAP */
+          DO_SWAP
+          break;
+
+        case 0x24:  /* DEPTH */
+          DO_DEPTH
+          break;
+
+        case 0x25:  /* CINDEX */
+          DO_CINDEX
+          break;
+
+        case 0x26:  /* MINDEX */
+          Ins_MINDEX( EXEC_ARG_ args );
+          break;
+
+        case 0x27:  /* ALIGNPTS */
+          Ins_ALIGNPTS( EXEC_ARG_ args );
+          break;
+
+        case 0x28:  /* ???? */
+          Ins_UNKNOWN( EXEC_ARG_ args );
+          break;
+
+        case 0x29:  /* UTP */
+          Ins_UTP( EXEC_ARG_ args );
+          break;
+
+        case 0x2A:  /* LOOPCALL */
+          Ins_LOOPCALL( EXEC_ARG_ args );
+          break;
+
+        case 0x2B:  /* CALL */
+          Ins_CALL( EXEC_ARG_ args );
+          break;
+
+        case 0x2C:  /* FDEF */
+          Ins_FDEF( EXEC_ARG_ args );
+          break;
+
+        case 0x2D:  /* ENDF */
+          Ins_ENDF( EXEC_ARG_ args );
+          break;
+
+        case 0x2E:  /* MDAP */
+        case 0x2F:  /* MDAP */
+          Ins_MDAP( EXEC_ARG_ args );
+          break;
+
+        case 0x30:  /* IUP */
+        case 0x31:  /* IUP */
+          Ins_IUP( EXEC_ARG_ args );
+          break;
+
+        case 0x32:  /* SHP */
+        case 0x33:  /* SHP */
+          Ins_SHP( EXEC_ARG_ args );
+          break;
+
+        case 0x34:  /* SHC */
+        case 0x35:  /* SHC */
+          Ins_SHC( EXEC_ARG_ args );
+          break;
+
+        case 0x36:  /* SHZ */
+        case 0x37:  /* SHZ */
+          Ins_SHZ( EXEC_ARG_ args );
+          break;
+
+        case 0x38:  /* SHPIX */
+          Ins_SHPIX( EXEC_ARG_ args );
+          break;
+
+        case 0x39:  /* IP    */
+          Ins_IP( EXEC_ARG_ args );
+          break;
+
+        case 0x3A:  /* MSIRP */
+        case 0x3B:  /* MSIRP */
+          Ins_MSIRP( EXEC_ARG_ args );
+          break;
+
+        case 0x3C:  /* AlignRP */
+          Ins_ALIGNRP( EXEC_ARG_ args );
+          break;
+
+        case 0x3D:  /* RTDG */
+          DO_RTDG
+          break;
+
+        case 0x3E:  /* MIAP */
+        case 0x3F:  /* MIAP */
+          Ins_MIAP( EXEC_ARG_ args );
+          break;
+
+        case 0x40:  /* NPUSHB */
+          Ins_NPUSHB( EXEC_ARG_ args );
+          break;
+
+        case 0x41:  /* NPUSHW */
+          Ins_NPUSHW( EXEC_ARG_ args );
+          break;
+
+        case 0x42:  /* WS */
+          DO_WS
+          break;
+
+      Set_Invalid_Ref:
+            CUR.error = FT_THROW( Invalid_Reference );
+          break;
+
+        case 0x43:  /* RS */
+          DO_RS
+          break;
+
+        case 0x44:  /* WCVTP */
+          DO_WCVTP
+          break;
+
+        case 0x45:  /* RCVT */
+          DO_RCVT
+          break;
+
+        case 0x46:  /* GC */
+        case 0x47:  /* GC */
+          Ins_GC( EXEC_ARG_ args );
+          break;
+
+        case 0x48:  /* SCFS */
+          Ins_SCFS( EXEC_ARG_ args );
+          break;
+
+        case 0x49:  /* MD */
+        case 0x4A:  /* MD */
+          Ins_MD( EXEC_ARG_ args );
+          break;
+
+        case 0x4B:  /* MPPEM */
+          DO_MPPEM
+          break;
+
+        case 0x4C:  /* MPS */
+          DO_MPS
+          break;
+
+        case 0x4D:  /* FLIPON */
+          DO_FLIPON
+          break;
+
+        case 0x4E:  /* FLIPOFF */
+          DO_FLIPOFF
+          break;
+
+        case 0x4F:  /* DEBUG */
+          DO_DEBUG
+          break;
+
+        case 0x50:  /* LT */
+          DO_LT
+          break;
+
+        case 0x51:  /* LTEQ */
+          DO_LTEQ
+          break;
+
+        case 0x52:  /* GT */
+          DO_GT
+          break;
+
+        case 0x53:  /* GTEQ */
+          DO_GTEQ
+          break;
+
+        case 0x54:  /* EQ */
+          DO_EQ
+          break;
+
+        case 0x55:  /* NEQ */
+          DO_NEQ
+          break;
+
+        case 0x56:  /* ODD */
+          DO_ODD
+          break;
+
+        case 0x57:  /* EVEN */
+          DO_EVEN
+          break;
+
+        case 0x58:  /* IF */
+          Ins_IF( EXEC_ARG_ args );
+          break;
+
+        case 0x59:  /* EIF */
+          /* do nothing */
+          break;
+
+        case 0x5A:  /* AND */
+          DO_AND
+          break;
+
+        case 0x5B:  /* OR */
+          DO_OR
+          break;
+
+        case 0x5C:  /* NOT */
+          DO_NOT
+          break;
+
+        case 0x5D:  /* DELTAP1 */
+          Ins_DELTAP( EXEC_ARG_ args );
+          break;
+
+        case 0x5E:  /* SDB */
+          DO_SDB
+          break;
+
+        case 0x5F:  /* SDS */
+          DO_SDS
+          break;
+
+        case 0x60:  /* ADD */
+          DO_ADD
+          break;
+
+        case 0x61:  /* SUB */
+          DO_SUB
+          break;
+
+        case 0x62:  /* DIV */
+          DO_DIV
+          break;
+
+        case 0x63:  /* MUL */
+          DO_MUL
+          break;
+
+        case 0x64:  /* ABS */
+          DO_ABS
+          break;
+
+        case 0x65:  /* NEG */
+          DO_NEG
+          break;
+
+        case 0x66:  /* FLOOR */
+          DO_FLOOR
+          break;
+
+        case 0x67:  /* CEILING */
+          DO_CEILING
+          break;
+
+        case 0x68:  /* ROUND */
+        case 0x69:  /* ROUND */
+        case 0x6A:  /* ROUND */
+        case 0x6B:  /* ROUND */
+          DO_ROUND
+          break;
+
+        case 0x6C:  /* NROUND */
+        case 0x6D:  /* NROUND */
+        case 0x6E:  /* NRRUND */
+        case 0x6F:  /* NROUND */
+          DO_NROUND
+          break;
+
+        case 0x70:  /* WCVTF */
+          DO_WCVTF
+          break;
+
+        case 0x71:  /* DELTAP2 */
+        case 0x72:  /* DELTAP3 */
+          Ins_DELTAP( EXEC_ARG_ args );
+          break;
+
+        case 0x73:  /* DELTAC0 */
+        case 0x74:  /* DELTAC1 */
+        case 0x75:  /* DELTAC2 */
+          Ins_DELTAC( EXEC_ARG_ args );
+          break;
+
+        case 0x76:  /* SROUND */
+          DO_SROUND
+          break;
+
+        case 0x77:  /* S45Round */
+          DO_S45ROUND
+          break;
+
+        case 0x78:  /* JROT */
+          DO_JROT
+          break;
+
+        case 0x79:  /* JROF */
+          DO_JROF
+          break;
+
+        case 0x7A:  /* ROFF */
+          DO_ROFF
+          break;
+
+        case 0x7B:  /* ???? */
+          Ins_UNKNOWN( EXEC_ARG_ args );
+          break;
+
+        case 0x7C:  /* RUTG */
+          DO_RUTG
+          break;
+
+        case 0x7D:  /* RDTG */
+          DO_RDTG
+          break;
+
+        case 0x7E:  /* SANGW */
+        case 0x7F:  /* AA    */
+          /* nothing - obsolete */
+          break;
+
+        case 0x80:  /* FLIPPT */
+          Ins_FLIPPT( EXEC_ARG_ args );
+          break;
+
+        case 0x81:  /* FLIPRGON */
+          Ins_FLIPRGON( EXEC_ARG_ args );
+          break;
+
+        case 0x82:  /* FLIPRGOFF */
+          Ins_FLIPRGOFF( EXEC_ARG_ args );
+          break;
+
+        case 0x83:  /* UNKNOWN */
+        case 0x84:  /* UNKNOWN */
+          Ins_UNKNOWN( EXEC_ARG_ args );
+          break;
+
+        case 0x85:  /* SCANCTRL */
+          Ins_SCANCTRL( EXEC_ARG_ args );
+          break;
+
+        case 0x86:  /* SDPVTL */
+        case 0x87:  /* SDPVTL */
+          Ins_SDPVTL( EXEC_ARG_ args );
+          break;
+
+        case 0x88:  /* GETINFO */
+          Ins_GETINFO( EXEC_ARG_ args );
+          break;
+
+        case 0x89:  /* IDEF */
+          Ins_IDEF( EXEC_ARG_ args );
+          break;
+
+        case 0x8A:  /* ROLL */
+          Ins_ROLL( EXEC_ARG_ args );
+          break;
+
+        case 0x8B:  /* MAX */
+          DO_MAX
+          break;
+
+        case 0x8C:  /* MIN */
+          DO_MIN
+          break;
+
+        case 0x8D:  /* SCANTYPE */
+          Ins_SCANTYPE( EXEC_ARG_ args );
+          break;
+
+        case 0x8E:  /* INSTCTRL */
+          Ins_INSTCTRL( EXEC_ARG_ args );
+          break;
+
+        case 0x8F:
+          Ins_UNKNOWN( EXEC_ARG_ args );
+          break;
+
+        default:
+          if ( opcode >= 0xE0 )
+            Ins_MIRP( EXEC_ARG_ args );
+          else if ( opcode >= 0xC0 )
+            Ins_MDRP( EXEC_ARG_ args );
+          else if ( opcode >= 0xB8 )
+            Ins_PUSHW( EXEC_ARG_ args );
+          else if ( opcode >= 0xB0 )
+            Ins_PUSHB( EXEC_ARG_ args );
+          else
+            Ins_UNKNOWN( EXEC_ARG_ args );
+        }
+
+      }
+
+#else
+
+      Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] );
+
+#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+      if ( CUR.error )
+      {
+        switch ( CUR.error )
+        {
+          /* looking for redefined instructions */
+        case FT_ERR( Invalid_Opcode ):
+          {
+            TT_DefRecord*  def   = CUR.IDefs;
+            TT_DefRecord*  limit = def + CUR.numIDefs;
+
+
+            for ( ; def < limit; def++ )
+            {
+              if ( def->active && CUR.opcode == (FT_Byte)def->opc )
+              {
+                TT_CallRec*  callrec;
+
+
+                if ( CUR.callTop >= CUR.callSize )
+                {
+                  CUR.error = FT_THROW( Invalid_Reference );
+                  goto LErrorLabel_;
+                }
+
+                callrec = &CUR.callStack[CUR.callTop];
+
+                callrec->Caller_Range = CUR.curRange;
+                callrec->Caller_IP    = CUR.IP + 1;
+                callrec->Cur_Count    = 1;
+                callrec->Cur_Restart  = def->start;
+                callrec->Cur_End      = def->end;
+
+                if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE )
+                  goto LErrorLabel_;
+
+                goto LSuiteLabel_;
+              }
+            }
+          }
+
+          CUR.error = FT_THROW( Invalid_Opcode );
+          goto LErrorLabel_;
+
+#if 0
+          break;   /* Unreachable code warning suppression.             */
+                   /* Leave to remind in case a later change the editor */
+                   /* to consider break;                                */
+#endif
+
+        default:
+          goto LErrorLabel_;
+
+#if 0
+        break;
+#endif
+        }
+      }
+
+      CUR.top = CUR.new_top;
+
+      if ( CUR.step_ins )
+        CUR.IP += CUR.length;
+
+      /* increment instruction counter and check if we didn't */
+      /* run this program for too long (e.g. infinite loops). */
+      if ( ++ins_counter > MAX_RUNNABLE_OPCODES )
+        return FT_THROW( Execution_Too_Long );
+
+    LSuiteLabel_:
+      if ( CUR.IP >= CUR.codeSize )
+      {
+        if ( CUR.callTop > 0 )
+        {
+          CUR.error = FT_THROW( Code_Overflow );
+          goto LErrorLabel_;
+        }
+        else
+          goto LNo_Error_;
+      }
+    } while ( !CUR.instruction_trap );
+
+  LNo_Error_:
+
+#ifdef TT_CONFIG_OPTION_STATIC_RASTER
+    *exc = cur;
+#endif
+
+    return FT_Err_Ok;
+
+  LErrorCodeOverflow_:
+    CUR.error = FT_THROW( Code_Overflow );
+
+  LErrorLabel_:
+
+#ifdef TT_CONFIG_OPTION_STATIC_RASTER
+    *exc = cur;
+#endif
+
+    /* If any errors have occurred, function tables may be broken. */
+    /* Force a re-execution of `prep' and `fpgm' tables if no      */
+    /* bytecode debugger is run.                                   */
+    if ( CUR.error && !CUR.instruction_trap )
+    {
+      FT_TRACE1(( "  The interpreter returned error 0x%x\n", CUR.error ));
+      exc->size->cvt_ready      = FALSE;
+    }
+
+    return CUR.error;
+  }
+
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.h
new file mode 100644
index 0000000..3acfade
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.h
@@ -0,0 +1,397 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttinterp.h                                                             */
+/*                                                                         */
+/*    TrueType bytecode interpreter (specification).                       */
+/*                                                                         */
+/*  Copyright 1996-2007, 2010, 2012-2013 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTINTERP_H__
+#define __TTINTERP_H__
+
+#include "../../include/ft2build.h"
+#include "ttobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */
+
+#define EXEC_OP_   TT_ExecContext  exc,
+#define EXEC_OP    TT_ExecContext  exc
+#define EXEC_ARG_  exc,
+#define EXEC_ARG   exc
+
+#else                                       /* static implementation */
+
+#define EXEC_OP_   /* void */
+#define EXEC_OP    /* void */
+#define EXEC_ARG_  /* void */
+#define EXEC_ARG   /* void */
+
+#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Rounding mode constants.                                              */
+  /*                                                                       */
+#define TT_Round_Off             5
+#define TT_Round_To_Half_Grid    0
+#define TT_Round_To_Grid         1
+#define TT_Round_To_Double_Grid  2
+#define TT_Round_Up_To_Grid      4
+#define TT_Round_Down_To_Grid    3
+#define TT_Round_Super           6
+#define TT_Round_Super_45        7
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Function types used by the interpreter, depending on various modes    */
+  /* (e.g. the rounding mode, whether to render a vertical or horizontal   */
+  /* line etc).                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /* Rounding function */
+  typedef FT_F26Dot6
+  (*TT_Round_Func)( EXEC_OP_ FT_F26Dot6  distance,
+                             FT_F26Dot6  compensation );
+
+  /* Point displacement along the freedom vector routine */
+  typedef void
+  (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone  zone,
+                            FT_UShort     point,
+                            FT_F26Dot6    distance );
+
+  /* Distance projection along one of the projection vectors */
+  typedef FT_F26Dot6
+  (*TT_Project_Func)( EXEC_OP_ FT_Pos   dx,
+                               FT_Pos   dy );
+
+  /* reading a cvt value.  Take care of non-square pixels if necessary */
+  typedef FT_F26Dot6
+  (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong  idx );
+
+  /* setting or moving a cvt value.  Take care of non-square pixels  */
+  /* if necessary                                                    */
+  typedef void
+  (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong    idx,
+                               FT_F26Dot6  value );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This structure defines a call record, used to manage function calls.  */
+  /*                                                                       */
+  typedef struct  TT_CallRec_
+  {
+    FT_Int   Caller_Range;
+    FT_Long  Caller_IP;
+    FT_Long  Cur_Count;
+    FT_Long  Cur_Restart;
+    FT_Long  Cur_End;
+
+  } TT_CallRec, *TT_CallStack;
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* These structures define rules used to tweak subpixel hinting for      */
+  /* various fonts.  "", 0, "", NULL value indicates to match any value.   */
+  /*                                                                       */
+
+#define SPH_MAX_NAME_SIZE      32
+#define SPH_MAX_CLASS_MEMBERS  100
+
+  typedef struct  SPH_TweakRule_
+  {
+    const char      family[SPH_MAX_NAME_SIZE];
+    const FT_UInt   ppem;
+    const char      style[SPH_MAX_NAME_SIZE];
+    const FT_ULong  glyph;
+
+  } SPH_TweakRule;
+
+
+  typedef struct  SPH_ScaleRule_
+  {
+    const char      family[SPH_MAX_NAME_SIZE];
+    const FT_UInt   ppem;
+    const char      style[SPH_MAX_NAME_SIZE];
+    const FT_ULong  glyph;
+    const FT_ULong  scale;
+
+  } SPH_ScaleRule;
+
+
+  typedef struct  SPH_Font_Class_
+  {
+    const char  name[SPH_MAX_NAME_SIZE];
+    const char  member[SPH_MAX_CLASS_MEMBERS][SPH_MAX_NAME_SIZE];
+
+  } SPH_Font_Class;
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The main structure for the interpreter which collects all necessary   */
+  /* variables and states.                                                 */
+  /*                                                                       */
+  typedef struct  TT_ExecContextRec_
+  {
+    TT_Face            face;
+    TT_Size            size;
+    FT_Memory          memory;
+
+    /* instructions state */
+
+    FT_Error           error;      /* last execution error */
+
+    FT_Long            top;        /* top of exec. stack   */
+
+    FT_UInt            stackSize;  /* size of exec. stack  */
+    FT_Long*           stack;      /* current exec. stack  */
+
+    FT_Long            args;
+    FT_UInt            new_top;    /* new top after exec.  */
+
+    TT_GlyphZoneRec    zp0,        /* zone records */
+                       zp1,
+                       zp2,
+                       pts,
+                       twilight;
+
+    FT_Size_Metrics    metrics;
+    TT_Size_Metrics    tt_metrics; /* size metrics */
+
+    TT_GraphicsState   GS;         /* current graphics state */
+
+    FT_Int             curRange;  /* current code range number   */
+    FT_Byte*           code;      /* current code range          */
+    FT_Long            IP;        /* current instruction pointer */
+    FT_Long            codeSize;  /* size of current range       */
+
+    FT_Byte            opcode;    /* current opcode              */
+    FT_Int             length;    /* length of current opcode    */
+
+    FT_Bool            step_ins;  /* true if the interpreter must */
+                                  /* increment IP after ins. exec */
+    FT_ULong           cvtSize;
+    FT_Long*           cvt;
+
+    FT_UInt            glyphSize; /* glyph instructions buffer size */
+    FT_Byte*           glyphIns;  /* glyph instructions buffer */
+
+    FT_UInt            numFDefs;  /* number of function defs         */
+    FT_UInt            maxFDefs;  /* maximum number of function defs */
+    TT_DefArray        FDefs;     /* table of FDefs entries          */
+
+    FT_UInt            numIDefs;  /* number of instruction defs */
+    FT_UInt            maxIDefs;  /* maximum number of ins defs */
+    TT_DefArray        IDefs;     /* table of IDefs entries     */
+
+    FT_UInt            maxFunc;   /* maximum function index     */
+    FT_UInt            maxIns;    /* maximum instruction index  */
+
+    FT_Int             callTop,    /* top of call stack during execution */
+                       callSize;   /* size of call stack */
+    TT_CallStack       callStack;  /* call stack */
+
+    FT_UShort          maxPoints;    /* capacity of this context's `pts' */
+    FT_Short           maxContours;  /* record, expressed in points and  */
+                                     /* contours.                        */
+
+    TT_CodeRangeTable  codeRangeTable;  /* table of valid code ranges */
+                                        /* useful for the debugger   */
+
+    FT_UShort          storeSize;  /* size of current storage */
+    FT_Long*           storage;    /* storage area            */
+
+    FT_F26Dot6         period;     /* values used for the */
+    FT_F26Dot6         phase;      /* `SuperRounding'     */
+    FT_F26Dot6         threshold;
+
+#if 0
+    /* this seems to be unused */
+    FT_Int             cur_ppem;   /* ppem along the current proj vector */
+#endif
+
+    FT_Bool            instruction_trap; /* If `True', the interpreter will */
+                                         /* exit after each instruction     */
+
+    TT_GraphicsState   default_GS;       /* graphics state resulting from   */
+                                         /* the prep program                */
+    FT_Bool            is_composite;     /* true if the glyph is composite  */
+    FT_Bool            pedantic_hinting; /* true if pedantic interpretation */
+
+    /* latest interpreter additions */
+
+    FT_Long            F_dot_P;    /* dot product of freedom and projection */
+                                   /* vectors                               */
+    TT_Round_Func      func_round; /* current rounding function             */
+
+    TT_Project_Func    func_project,   /* current projection function */
+                       func_dualproj,  /* current dual proj. function */
+                       func_freeProj;  /* current freedom proj. func  */
+
+    TT_Move_Func       func_move;      /* current point move function */
+    TT_Move_Func       func_move_orig; /* move original position function */
+
+    TT_Get_CVT_Func    func_read_cvt;  /* read a cvt entry              */
+    TT_Set_CVT_Func    func_write_cvt; /* write a cvt entry (in pixels) */
+    TT_Set_CVT_Func    func_move_cvt;  /* incr a cvt entry (in pixels)  */
+
+    FT_Bool            grayscale;      /* are we hinting for grayscale? */
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    TT_Round_Func      func_round_sphn;   /* subpixel rounding function */
+
+    FT_Bool            grayscale_hinting; /* Using grayscale hinting?      */
+    FT_Bool            subpixel_hinting;  /* Using subpixel hinting?       */
+    FT_Bool            native_hinting;    /* Using native hinting?         */
+    FT_Bool            ignore_x_mode;     /* Standard rendering mode for   */
+                                          /* subpixel hinting.  On if gray */
+                                          /* or subpixel hinting is on )   */
+
+    /* The following 4 aren't fully implemented but here for MS rasterizer */
+    /* compatibility.                                                      */
+    FT_Bool            compatible_widths;     /* compatible widths?        */
+    FT_Bool            symmetrical_smoothing; /* symmetrical_smoothing?    */
+    FT_Bool            bgr;                   /* bgr instead of rgb?       */
+    FT_Bool            subpixel_positioned;   /* subpixel positioned       */
+                                              /* (DirectWrite ClearType)?  */
+
+    FT_Int             rasterizer_version;    /* MS rasterizer version     */
+
+    FT_Bool            iup_called;            /* IUP called for glyph?     */
+
+    FT_ULong           sph_tweak_flags;       /* flags to control          */
+                                              /* hint tweaks               */
+
+    FT_ULong           sph_in_func_flags;     /* flags to indicate if in   */
+                                              /* special functions         */
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+  } TT_ExecContextRec;
+
+
+  extern const TT_GraphicsState  tt_default_graphics_state;
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+  FT_LOCAL( FT_Error )
+  TT_Goto_CodeRange( TT_ExecContext  exec,
+                     FT_Int          range,
+                     FT_Long         IP );
+
+  FT_LOCAL( FT_Error )
+  TT_Set_CodeRange( TT_ExecContext  exec,
+                    FT_Int          range,
+                    void*           base,
+                    FT_Long         length );
+
+  FT_LOCAL( FT_Error )
+  TT_Clear_CodeRange( TT_ExecContext  exec,
+                      FT_Int          range );
+
+
+  FT_LOCAL( FT_Error )
+  Update_Max( FT_Memory  memory,
+              FT_ULong*  size,
+              FT_Long    multiplier,
+              void*      _pbuff,
+              FT_ULong   new_max );
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_New_Context                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Queries the face context for a given font.  Note that there is     */
+  /*    now a _single_ execution context in the TrueType driver which is   */
+  /*    shared among faces.                                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source face object.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A handle to the execution context.  Initialized for `face'.        */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only the glyph loader and debugger should call this function.      */
+  /*                                                                       */
+  FT_EXPORT( TT_ExecContext )
+  TT_New_Context( TT_Driver  driver );
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+  FT_LOCAL( FT_Error )
+  TT_Done_Context( TT_ExecContext  exec );
+
+  FT_LOCAL( FT_Error )
+  TT_Load_Context( TT_ExecContext  exec,
+                   TT_Face         face,
+                   TT_Size         size );
+
+  FT_LOCAL( FT_Error )
+  TT_Save_Context( TT_ExecContext  exec,
+                   TT_Size         ins );
+
+  FT_LOCAL( FT_Error )
+  TT_Run_Context( TT_ExecContext  exec,
+                  FT_Bool         debug );
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_RunIns                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Executes one or more instruction in the execution context.  This   */
+  /*    is the main function of the TrueType opcode interpreter.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    exec :: A handle to the target execution context.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only the object manager and debugger should call this function.    */
+  /*                                                                       */
+  /*    This function is publicly exported because it is directly          */
+  /*    invoked by the TrueType debugger.                                  */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  TT_RunIns( TT_ExecContext  exec );
+
+
+FT_END_HEADER
+
+#endif /* __TTINTERP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.c
new file mode 100644
index 0000000..4a6a7c1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.c
@@ -0,0 +1,1346 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttobjs.c                                                               */
+/*                                                                         */
+/*    Objects manager (body).                                              */
+/*                                                                         */
+/*  Copyright 1996-2013                                                    */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/ftttdrv.h"
+
+#include "ttgload.h"
+#include "ttpload.h"
+
+#include "tterrors.h"
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#include "ttinterp.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#include "../../include/freetype/ttunpat.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttobjs
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                       GLYPH ZONE FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_glyphzone_done                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Deallocate a glyph zone.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    zone :: A pointer to the target glyph zone.                        */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_glyphzone_done( TT_GlyphZone  zone )
+  {
+    FT_Memory  memory = zone->memory;
+
+
+    if ( memory )
+    {
+      FT_FREE( zone->contours );
+      FT_FREE( zone->tags );
+      FT_FREE( zone->cur );
+      FT_FREE( zone->org );
+      FT_FREE( zone->orus );
+
+      zone->max_points   = zone->n_points   = 0;
+      zone->max_contours = zone->n_contours = 0;
+      zone->memory       = NULL;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_glyphzone_new                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Allocate a new glyph zone.                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory      :: A handle to the current memory object.              */
+  /*                                                                       */
+  /*    maxPoints   :: The capacity of glyph zone in points.               */
+  /*                                                                       */
+  /*    maxContours :: The capacity of glyph zone in contours.             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    zone        :: A pointer to the target glyph zone record.          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_glyphzone_new( FT_Memory     memory,
+                    FT_UShort     maxPoints,
+                    FT_Short      maxContours,
+                    TT_GlyphZone  zone )
+  {
+    FT_Error  error;
+
+
+    FT_MEM_ZERO( zone, sizeof ( *zone ) );
+    zone->memory = memory;
+
+    if ( FT_NEW_ARRAY( zone->org,      maxPoints   ) ||
+         FT_NEW_ARRAY( zone->cur,      maxPoints   ) ||
+         FT_NEW_ARRAY( zone->orus,     maxPoints   ) ||
+         FT_NEW_ARRAY( zone->tags,     maxPoints   ) ||
+         FT_NEW_ARRAY( zone->contours, maxContours ) )
+    {
+      tt_glyphzone_done( zone );
+    }
+    else
+    {
+      zone->max_points   = maxPoints;
+      zone->max_contours = maxContours;
+    }
+
+    return error;
+  }
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+  /* Compare the face with a list of well-known `tricky' fonts. */
+  /* This list shall be expanded as we find more of them.       */
+
+  static FT_Bool
+  tt_check_trickyness_family( FT_String*  name )
+  {
+
+#define TRICK_NAMES_MAX_CHARACTERS  16
+#define TRICK_NAMES_COUNT            8
+
+    static const char trick_names[TRICK_NAMES_COUNT]
+                                 [TRICK_NAMES_MAX_CHARACTERS + 1] =
+    {
+      "DFKaiSho-SB",     /* dfkaisb.ttf */
+      "DFKaiShu",
+      "DFKai-SB",        /* kaiu.ttf */
+      "HuaTianKaiTi?",   /* htkt2.ttf */
+      "HuaTianSongTi?",  /* htst3.ttf */
+      "MingLiU",         /* mingliu.ttf & mingliu.ttc */
+      "PMingLiU",        /* mingliu.ttc */
+      "MingLi43",        /* mingli.ttf */
+    };
+
+    int  nn;
+
+
+    for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ )
+      if ( ft_strstr( name, trick_names[nn] ) )
+        return TRUE;
+
+    return FALSE;
+  }
+
+
+  /* XXX: This function should be in the `sfnt' module. */
+
+  /* Some PDF generators clear the checksums in the TrueType header table. */
+  /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF     */
+  /* Printer clears the entries for subsetted subtables.  We thus have to  */
+  /* recalculate the checksums  where necessary.                           */
+
+  static FT_UInt32
+  tt_synth_sfnt_checksum( FT_Stream  stream,
+                          FT_ULong   length )
+  {
+    FT_Error   error;
+    FT_UInt32  checksum = 0;
+    int        i;
+
+
+    if ( FT_FRAME_ENTER( length ) )
+      return 0;
+
+    for ( ; length > 3; length -= 4 )
+      checksum += (FT_UInt32)FT_GET_ULONG();
+
+    for ( i = 3; length > 0; length --, i-- )
+      checksum += (FT_UInt32)( FT_GET_BYTE() << ( i * 8 ) );
+
+    FT_FRAME_EXIT();
+
+    return checksum;
+  }
+
+
+  /* XXX: This function should be in the `sfnt' module. */
+
+  static FT_ULong
+  tt_get_sfnt_checksum( TT_Face    face,
+                        FT_UShort  i )
+  {
+#if 0 /* if we believe the written value, use following part. */
+    if ( face->dir_tables[i].CheckSum )
+      return face->dir_tables[i].CheckSum;
+#endif
+
+    if ( !face->goto_table )
+      return 0;
+
+    if ( face->goto_table( face,
+                           face->dir_tables[i].Tag,
+                           face->root.stream,
+                           NULL ) )
+      return 0;
+
+    return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream,
+                                             face->dir_tables[i].Length );
+  }
+
+
+  typedef struct tt_sfnt_id_rec_
+  {
+    FT_ULong  CheckSum;
+    FT_ULong  Length;
+
+  } tt_sfnt_id_rec;
+
+
+  static FT_Bool
+  tt_check_trickyness_sfnt_ids( TT_Face  face )
+  {
+#define TRICK_SFNT_IDS_PER_FACE   3
+#define TRICK_SFNT_IDS_NUM_FACES  17
+
+    static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES]
+                                       [TRICK_SFNT_IDS_PER_FACE] = {
+
+#define TRICK_SFNT_ID_cvt   0
+#define TRICK_SFNT_ID_fpgm  1
+#define TRICK_SFNT_ID_prep  2
+
+      { /* MingLiU 1995 */
+        { 0x05bcf058, 0x000002e4 }, /* cvt  */
+        { 0x28233bf1, 0x000087c4 }, /* fpgm */
+        { 0xa344a1ea, 0x000001e1 }  /* prep */
+      },
+      { /* MingLiU 1996- */
+        { 0x05bcf058, 0x000002e4 }, /* cvt  */
+        { 0x28233bf1, 0x000087c4 }, /* fpgm */
+        { 0xa344a1eb, 0x000001e1 }  /* prep */
+      },
+      { /* DFKaiShu */
+        { 0x11e5ead4, 0x00000350 }, /* cvt  */
+        { 0x5a30ca3b, 0x00009063 }, /* fpgm */
+        { 0x13a42602, 0x0000007e }  /* prep */
+      },
+      { /* HuaTianKaiTi */
+        { 0xfffbfffc, 0x00000008 }, /* cvt  */
+        { 0x9c9e48b8, 0x0000bea2 }, /* fpgm */
+        { 0x70020112, 0x00000008 }  /* prep */
+      },
+      { /* HuaTianSongTi */
+        { 0xfffbfffc, 0x00000008 }, /* cvt  */
+        { 0x0a5a0483, 0x00017c39 }, /* fpgm */
+        { 0x70020112, 0x00000008 }  /* prep */
+      },
+      { /* NEC fadpop7.ttf */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x40c92555, 0x000000e5 }, /* fpgm */
+        { 0xa39b58e3, 0x0000117c }  /* prep */
+      },
+      { /* NEC fadrei5.ttf */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x33c41652, 0x000000e5 }, /* fpgm */
+        { 0x26d6c52a, 0x00000f6a }  /* prep */
+      },
+      { /* NEC fangot7.ttf */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x6db1651d, 0x0000019d }, /* fpgm */
+        { 0x6c6e4b03, 0x00002492 }  /* prep */
+      },
+      { /* NEC fangyo5.ttf */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x40c92555, 0x000000e5 }, /* fpgm */
+        { 0xde51fad0, 0x0000117c }  /* prep */
+      },
+      { /* NEC fankyo5.ttf */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x85e47664, 0x000000e5 }, /* fpgm */
+        { 0xa6c62831, 0x00001caa }  /* prep */
+      },
+      { /* NEC fanrgo5.ttf */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x2d891cfd, 0x0000019d }, /* fpgm */
+        { 0xa0604633, 0x00001de8 }  /* prep */
+      },
+      { /* NEC fangot5.ttc */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x40aa774c, 0x000001cb }, /* fpgm */
+        { 0x9b5caa96, 0x00001f9a }  /* prep */
+      },
+      { /* NEC fanmin3.ttc */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x0d3de9cb, 0x00000141 }, /* fpgm */
+        { 0xd4127766, 0x00002280 }  /* prep */
+      },
+      { /* NEC FA-Gothic, 1996 */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x4a692698, 0x000001f0 }, /* fpgm */
+        { 0x340d4346, 0x00001fca }  /* prep */
+      },
+      { /* NEC FA-Minchou, 1996 */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0xcd34c604, 0x00000166 }, /* fpgm */
+        { 0x6cf31046, 0x000022b0 }  /* prep */
+      },
+      { /* NEC FA-RoundGothicB, 1996 */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x5da75315, 0x0000019d }, /* fpgm */
+        { 0x40745a5f, 0x000022e0 }  /* prep */
+      },
+      { /* NEC FA-RoundGothicM, 1996 */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0xf055fc48, 0x000001c2 }, /* fpgm */
+        { 0x3900ded3, 0x00001e18 }  /* prep */
+      }
+    };
+
+    FT_ULong   checksum;
+    int        num_matched_ids[TRICK_SFNT_IDS_NUM_FACES];
+    FT_Bool    has_cvt, has_fpgm, has_prep;
+    FT_UShort  i;
+    int        j, k;
+
+
+    FT_MEM_SET( num_matched_ids, 0,
+                sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES );
+    has_cvt  = FALSE;
+    has_fpgm = FALSE;
+    has_prep = FALSE;
+
+    for ( i = 0; i < face->num_tables; i++ )
+    {
+      checksum = 0;
+
+      switch( face->dir_tables[i].Tag )
+      {
+      case TTAG_cvt:
+        k = TRICK_SFNT_ID_cvt;
+        has_cvt  = TRUE;
+        break;
+
+      case TTAG_fpgm:
+        k = TRICK_SFNT_ID_fpgm;
+        has_fpgm = TRUE;
+        break;
+
+      case TTAG_prep:
+        k = TRICK_SFNT_ID_prep;
+        has_prep = TRUE;
+        break;
+
+      default:
+        continue;
+      }
+
+      for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )
+        if ( face->dir_tables[i].Length == sfnt_id[j][k].Length )
+        {
+          if ( !checksum )
+            checksum = tt_get_sfnt_checksum( face, i );
+
+          if ( sfnt_id[j][k].CheckSum == checksum )
+            num_matched_ids[j]++;
+
+          if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
+            return TRUE;
+        }
+    }
+
+    for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )
+    {
+      if ( !has_cvt  && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length )
+        num_matched_ids[j] ++;
+      if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length )
+        num_matched_ids[j] ++;
+      if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length )
+        num_matched_ids[j] ++;
+      if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
+        return TRUE;
+    }
+
+    return FALSE;
+  }
+
+
+  static FT_Bool
+  tt_check_trickyness( FT_Face  face )
+  {
+    if ( !face )
+      return FALSE;
+
+    /* For first, check the face name for quick check. */
+    if ( face->family_name                               &&
+         tt_check_trickyness_family( face->family_name ) )
+      return TRUE;
+
+    /* Type42 fonts may lack `name' tables, we thus try to identify */
+    /* tricky fonts by checking the checksums of Type42-persistent  */
+    /* sfnt tables (`cvt', `fpgm', and `prep').                     */
+    if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) )
+      return TRUE;
+
+    return FALSE;
+  }
+
+
+  /* Check whether `.notdef' is the only glyph in the `loca' table. */
+  static FT_Bool
+  tt_check_single_notdef( FT_Face  ttface )
+  {
+    FT_Bool   result = FALSE;
+
+    TT_Face   face = (TT_Face)ttface;
+    FT_UInt   asize;
+    FT_ULong  i;
+    FT_ULong  glyph_index = 0;
+    FT_UInt   count       = 0;
+
+
+    for( i = 0; i < face->num_locations; i++ )
+    {
+      tt_face_get_location( face, i, &asize );
+      if ( asize > 0 )
+      {
+        count += 1;
+        if ( count > 1 )
+          break;
+        glyph_index = i;
+      }
+    }
+
+    /* Only have a single outline. */
+    if ( count == 1 )
+    {
+      if ( glyph_index == 0 )
+        result = TRUE;
+      else
+      {
+        /* FIXME: Need to test glyphname == .notdef ? */
+        FT_Error error;
+        char buf[8];
+
+
+        error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 );
+        if ( !error                                            &&
+             buf[0] == '.' && !ft_strncmp( buf, ".notdef", 8 ) )
+          result = TRUE;
+      }
+    }
+
+    return result;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_init                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a given TrueType face object.                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     :: The source font stream.                              */
+  /*                                                                       */
+  /*    face_index :: The index of the font face in the resource.          */
+  /*                                                                       */
+  /*    num_params :: Number of additional generic parameters.  Ignored.   */
+  /*                                                                       */
+  /*    params     :: Additional generic parameters.  Ignored.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The newly built face object.                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_init( FT_Stream      stream,
+                FT_Face        ttface,      /* TT_Face */
+                FT_Int         face_index,
+                FT_Int         num_params,
+                FT_Parameter*  params )
+  {
+    FT_Error      error;
+    FT_Library    library;
+    SFNT_Service  sfnt;
+    TT_Face       face = (TT_Face)ttface;
+
+
+    FT_TRACE2(( "TTF driver\n" ));
+
+    library = ttface->driver->root.library;
+
+    sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" );
+    if ( !sfnt )
+    {
+      FT_ERROR(( "tt_face_init: cannot access `sfnt' module\n" ));
+      error = FT_THROW( Missing_Module );
+      goto Exit;
+    }
+
+    /* create input stream from resource */
+    if ( FT_STREAM_SEEK( 0 ) )
+      goto Exit;
+
+    /* check that we have a valid TrueType file */
+    error = sfnt->init_face( stream, face, face_index, num_params, params );
+    if ( error )
+      goto Exit;
+
+    /* We must also be able to accept Mac/GX fonts, as well as OT ones. */
+    /* The 0x00020000 tag is completely undocumented; some fonts from   */
+    /* Arphic made for Chinese Windows 3.1 have this.                   */
+    if ( face->format_tag != 0x00010000L &&    /* MS fonts  */
+         face->format_tag != 0x00020000L &&    /* CJK fonts for Win 3.1 */
+         face->format_tag != TTAG_true   )     /* Mac fonts */
+    {
+      FT_TRACE2(( "  not a TTF font\n" ));
+      goto Bad_Format;
+    } 
+	else
+	{
+		FT_ULong  table_len;
+		if (face->goto_table( face, TTAG_CFF, stream, &table_len) != TT_Err_Table_Missing && 
+			face->goto_table( face, TTAG_loca, stream, &table_len) == TT_Err_Table_Missing) 
+		{
+			FT_TRACE2(( "[not a valid TTF font]\n" ));
+			goto Bad_Format;
+		}
+	}
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    ttface->face_flags |= FT_FACE_FLAG_HINTER;
+#endif
+
+    /* If we are performing a simple font format check, exit immediately. */
+    if ( face_index < 0 )
+      return FT_Err_Ok;
+
+    /* Load font directory */
+    error = sfnt->load_face( stream, face, face_index, num_params, params );
+    if ( error )
+      goto Exit;
+
+    if ( tt_check_trickyness( ttface ) )
+      ttface->face_flags |= FT_FACE_FLAG_TRICKY;
+
+    error = tt_face_load_hdmx( face, stream );
+    if ( error )
+      goto Exit;
+
+    if ( FT_IS_SCALABLE( ttface ) )
+    {
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+      if ( !ttface->internal->incremental_interface )
+        error = tt_face_load_loca( face, stream );
+      if ( !error )
+        error = tt_face_load_cvt( face, stream );
+      if ( !error )
+        error = tt_face_load_fpgm( face, stream );
+      if ( !error )
+        error = tt_face_load_prep( face, stream );
+
+      /* Check the scalable flag based on `loca'. */
+      if ( !ttface->internal->incremental_interface &&
+           ttface->num_fixed_sizes                  &&
+           face->glyph_locations                    &&
+           tt_check_single_notdef( ttface )         )
+      {
+        FT_TRACE5(( "tt_face_init:"
+                    " Only the `.notdef' glyph has an outline.\n"
+                    "             "
+                    " Resetting scalable flag to FALSE.\n" ));
+
+        ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
+      }
+
+#else
+
+      if ( !error )
+        error = tt_face_load_loca( face, stream );
+      if ( !error )
+        error = tt_face_load_cvt( face, stream );
+      if ( !error )
+        error = tt_face_load_fpgm( face, stream );
+      if ( !error )
+        error = tt_face_load_prep( face, stream );
+
+      /* Check the scalable flag based on `loca'. */
+      if ( ttface->num_fixed_sizes          &&
+           face->glyph_locations            &&
+           tt_check_single_notdef( ttface ) )
+      {
+        FT_TRACE5(( "tt_face_init:"
+                    " Only the `.notdef' glyph has an outline.\n"
+                    "             "
+                    " Resetting scalable flag to FALSE.\n" ));
+
+        ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
+      }
+
+#endif
+
+    }
+
+#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING    ) && \
+    !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )
+
+    {
+      FT_Bool  unpatented_hinting;
+      int      i;
+
+
+      /* Determine whether unpatented hinting is to be used for this face. */
+      unpatented_hinting = FT_BOOL
+        ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL );
+
+      for ( i = 0; i < num_params && !face->unpatented_hinting; i++ )
+        if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING )
+          unpatented_hinting = TRUE;
+
+      if ( !unpatented_hinting )
+        ttface->internal->ignore_unpatented_hinter = TRUE;
+    }
+
+#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING &&
+          !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
+
+    /* initialize standard glyph loading routines */
+    TT_Init_Glyph_Loading( face );
+
+  Exit:
+    return error;
+
+  Bad_Format:
+    error = FT_THROW( Unknown_File_Format );
+    goto Exit;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_done                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalize a given face object.                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A pointer to the face object to destroy.                   */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_face_done( FT_Face  ttface )           /* TT_Face */
+  {
+    TT_Face       face = (TT_Face)ttface;
+    FT_Memory     memory;
+    FT_Stream     stream;
+    SFNT_Service  sfnt;
+
+
+    if ( !face )
+      return;
+
+    memory = ttface->memory;
+    stream = ttface->stream;
+    sfnt   = (SFNT_Service)face->sfnt;
+
+    /* for `extended TrueType formats' (i.e. compressed versions) */
+    if ( face->extra.finalizer )
+      face->extra.finalizer( face->extra.data );
+
+    if ( sfnt )
+      sfnt->done_face( face );
+
+    /* freeing the locations table */
+    tt_face_done_loca( face );
+
+    tt_face_free_hdmx( face );
+
+    /* freeing the CVT */
+    FT_FREE( face->cvt );
+    face->cvt_size = 0;
+
+    /* freeing the programs */
+    FT_FRAME_RELEASE( face->font_program );
+    FT_FRAME_RELEASE( face->cvt_program );
+    face->font_program_size = 0;
+    face->cvt_program_size  = 0;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    tt_done_blend( memory, face->blend );
+    face->blend = NULL;
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                           SIZE  FUNCTIONS                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_size_run_fpgm                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Run the font program.                                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size     :: A handle to the size object.                           */
+  /*                                                                       */
+  /*    pedantic :: Set if bytecode execution should be pedantic.          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_run_fpgm( TT_Size  size,
+                    FT_Bool  pedantic )
+  {
+    TT_Face         face = (TT_Face)size->root.face;
+    TT_ExecContext  exec;
+    FT_Error        error;
+
+
+    /* debugging instances have their own context */
+    if ( size->debug )
+      exec = size->context;
+    else
+      exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
+
+    if ( !exec )
+      return FT_THROW( Could_Not_Find_Context );
+
+    TT_Load_Context( exec, face, size );
+
+    exec->callTop = 0;
+    exec->top     = 0;
+
+    exec->period    = 64;
+    exec->phase     = 0;
+    exec->threshold = 0;
+
+    exec->instruction_trap = FALSE;
+    exec->F_dot_P          = 0x4000L;
+
+    exec->pedantic_hinting = pedantic;
+
+    {
+      FT_Size_Metrics*  metrics    = &exec->metrics;
+      TT_Size_Metrics*  tt_metrics = &exec->tt_metrics;
+
+
+      metrics->x_ppem   = 0;
+      metrics->y_ppem   = 0;
+      metrics->x_scale  = 0;
+      metrics->y_scale  = 0;
+
+      tt_metrics->ppem  = 0;
+      tt_metrics->scale = 0;
+      tt_metrics->ratio = 0x10000L;
+    }
+
+    /* allow font program execution */
+    TT_Set_CodeRange( exec,
+                      tt_coderange_font,
+                      face->font_program,
+                      face->font_program_size );
+
+    /* disable CVT and glyph programs coderange */
+    TT_Clear_CodeRange( exec, tt_coderange_cvt );
+    TT_Clear_CodeRange( exec, tt_coderange_glyph );
+
+    if ( face->font_program_size > 0 )
+    {
+      error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 );
+
+      if ( !error )
+      {
+        FT_TRACE4(( "Executing `fpgm' table.\n" ));
+
+        error = face->interpreter( exec );
+      }
+    }
+    else
+      error = FT_Err_Ok;
+
+    if ( !error )
+      TT_Save_Context( exec, size );
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_size_run_prep                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Run the control value program.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size     :: A handle to the size object.                           */
+  /*                                                                       */
+  /*    pedantic :: Set if bytecode execution should be pedantic.          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_run_prep( TT_Size  size,
+                    FT_Bool  pedantic )
+  {
+    TT_Face         face = (TT_Face)size->root.face;
+    TT_ExecContext  exec;
+    FT_Error        error;
+
+
+    /* debugging instances have their own context */
+    if ( size->debug )
+      exec = size->context;
+    else
+      exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
+
+    if ( !exec )
+      return FT_THROW( Could_Not_Find_Context );
+
+    TT_Load_Context( exec, face, size );
+
+    exec->callTop = 0;
+    exec->top     = 0;
+
+    exec->instruction_trap = FALSE;
+
+    exec->pedantic_hinting = pedantic;
+
+    TT_Set_CodeRange( exec,
+                      tt_coderange_cvt,
+                      face->cvt_program,
+                      face->cvt_program_size );
+
+    TT_Clear_CodeRange( exec, tt_coderange_glyph );
+
+    if ( face->cvt_program_size > 0 )
+    {
+      error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
+
+      if ( !error && !size->debug )
+      {
+        FT_TRACE4(( "Executing `prep' table.\n" ));
+
+        error = face->interpreter( exec );
+      }
+    }
+    else
+      error = FT_Err_Ok;
+
+    /* UNDOCUMENTED!  The MS rasterizer doesn't allow the following */
+    /* graphics state variables to be modified by the CVT program.  */
+
+    exec->GS.dualVector.x = 0x4000;
+    exec->GS.dualVector.y = 0;
+    exec->GS.projVector.x = 0x4000;
+    exec->GS.projVector.y = 0x0;
+    exec->GS.freeVector.x = 0x4000;
+    exec->GS.freeVector.y = 0x0;
+
+    exec->GS.rp0 = 0;
+    exec->GS.rp1 = 0;
+    exec->GS.rp2 = 0;
+
+    exec->GS.gep0 = 1;
+    exec->GS.gep1 = 1;
+    exec->GS.gep2 = 1;
+
+    exec->GS.loop = 1;
+
+    /* save as default graphics state */
+    size->GS = exec->GS;
+
+    TT_Save_Context( exec, size );
+
+    return error;
+  }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  static void
+  tt_size_done_bytecode( FT_Size  ftsize )
+  {
+    TT_Size    size   = (TT_Size)ftsize;
+    TT_Face    face   = (TT_Face)ftsize->face;
+    FT_Memory  memory = face->root.memory;
+
+
+    if ( size->debug )
+    {
+      /* the debug context must be deleted by the debugger itself */
+      size->context = NULL;
+      size->debug   = FALSE;
+    }
+
+    FT_FREE( size->cvt );
+    size->cvt_size = 0;
+
+    /* free storage area */
+    FT_FREE( size->storage );
+    size->storage_size = 0;
+
+    /* twilight zone */
+    tt_glyphzone_done( &size->twilight );
+
+    FT_FREE( size->function_defs );
+    FT_FREE( size->instruction_defs );
+
+    size->num_function_defs    = 0;
+    size->max_function_defs    = 0;
+    size->num_instruction_defs = 0;
+    size->max_instruction_defs = 0;
+
+    size->max_func = 0;
+    size->max_ins  = 0;
+
+    size->bytecode_ready = 0;
+    size->cvt_ready      = 0;
+  }
+
+
+  /* Initialize bytecode-related fields in the size object.       */
+  /* We do this only if bytecode interpretation is really needed. */
+  static FT_Error
+  tt_size_init_bytecode( FT_Size  ftsize,
+                         FT_Bool  pedantic )
+  {
+    FT_Error   error;
+    TT_Size    size = (TT_Size)ftsize;
+    TT_Face    face = (TT_Face)ftsize->face;
+    FT_Memory  memory = face->root.memory;
+    FT_Int     i;
+
+    FT_UShort       n_twilight;
+    TT_MaxProfile*  maxp = &face->max_profile;
+
+
+    size->bytecode_ready = 1;
+    size->cvt_ready      = 0;
+
+    size->max_function_defs    = maxp->maxFunctionDefs;
+    size->max_instruction_defs = maxp->maxInstructionDefs;
+
+    size->num_function_defs    = 0;
+    size->num_instruction_defs = 0;
+
+    size->max_func = 0;
+    size->max_ins  = 0;
+
+    size->cvt_size     = face->cvt_size;
+    size->storage_size = maxp->maxStorage;
+
+    /* Set default metrics */
+    {
+      TT_Size_Metrics*  metrics = &size->ttmetrics;
+
+
+      metrics->rotated   = FALSE;
+      metrics->stretched = FALSE;
+
+      /* set default compensation (all 0) */
+      for ( i = 0; i < 4; i++ )
+        metrics->compensations[i] = 0;
+    }
+
+    /* allocate function defs, instruction defs, cvt, and storage area */
+    if ( FT_NEW_ARRAY( size->function_defs,    size->max_function_defs    ) ||
+         FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) ||
+         FT_NEW_ARRAY( size->cvt,              size->cvt_size             ) ||
+         FT_NEW_ARRAY( size->storage,          size->storage_size         ) )
+      goto Exit;
+
+    /* reserve twilight zone */
+    n_twilight = maxp->maxTwilightPoints;
+
+    /* there are 4 phantom points (do we need this?) */
+    n_twilight += 4;
+
+    error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight );
+    if ( error )
+      goto Exit;
+
+    size->twilight.n_points = n_twilight;
+
+    size->GS = tt_default_graphics_state;
+
+    /* set `face->interpreter' according to the debug hook present */
+    {
+      FT_Library  library = face->root.driver->root.library;
+
+
+      face->interpreter = (TT_Interpreter)
+                            library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];
+      if ( !face->interpreter )
+        face->interpreter = (TT_Interpreter)TT_RunIns;
+    }
+
+    /* Fine, now run the font program! */
+    error = tt_size_run_fpgm( size, pedantic );
+	/* It seems fpgm proc is causing some problem for some font, so we ignore the error. TESTDOC: Bug #12690 - Restaurantkarte_Oktober09+Wild.pdf*/
+	if ( error )
+      tt_size_done_bytecode( ftsize );
+	return TT_Err_Ok;
+
+  Exit:
+    if ( error )
+      tt_size_done_bytecode( ftsize );
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_ready_bytecode( TT_Size  size,
+                          FT_Bool  pedantic )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( !size->bytecode_ready )
+    {
+      error = tt_size_init_bytecode( (FT_Size)size, pedantic );
+      if ( error )
+        goto Exit;
+    }
+
+    /* rescale CVT when needed */
+    if ( !size->cvt_ready )
+    {
+      FT_UInt  i;
+      TT_Face  face = (TT_Face)size->root.face;
+
+
+      /* Scale the cvt values to the new ppem.          */
+      /* We use by default the y ppem to scale the CVT. */
+      for ( i = 0; i < size->cvt_size; i++ )
+        size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
+
+      /* all twilight points are originally zero */
+      for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ )
+      {
+        size->twilight.org[i].x = 0;
+        size->twilight.org[i].y = 0;
+        size->twilight.cur[i].x = 0;
+        size->twilight.cur[i].y = 0;
+      }
+
+      /* clear storage area */
+      for ( i = 0; i < (FT_UInt)size->storage_size; i++ )
+        size->storage[i] = 0;
+
+      size->GS = tt_default_graphics_state;
+
+      tt_size_run_prep( size, pedantic );/* It seems prep proc is causing some problem for some font, so we ignore the error. TESTDOC: Bug #5025 - naredba-rd-16-296.pdf */
+	  /* However we can't disable the prep. TESTDOC: Bug #0063 - 050826_differ_table.pdf, page #4 */
+      if ( !error )
+        size->cvt_ready = 1;
+    }
+
+  Exit:
+    return error;
+  }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_size_init                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a new TrueType size object.                             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    size :: A handle to the size object.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_init( FT_Size  ttsize )           /* TT_Size */
+  {
+    TT_Size   size  = (TT_Size)ttsize;
+    FT_Error  error = FT_Err_Ok;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    size->bytecode_ready = 0;
+    size->cvt_ready      = 0;
+#endif
+
+    size->ttmetrics.valid = FALSE;
+    size->strike_index    = 0xFFFFFFFFUL;
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_size_done                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The TrueType size object finalizer.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size :: A handle to the target size object.                        */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_size_done( FT_Size  ttsize )           /* TT_Size */
+  {
+    TT_Size  size = (TT_Size)ttsize;
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    if ( size->bytecode_ready )
+      tt_size_done_bytecode( ttsize );
+#endif
+
+    size->ttmetrics.valid = FALSE;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_size_reset                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Reset a TrueType size when resolutions and character dimensions    */
+  /*    have been changed.                                                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size :: A handle to the target size object.                        */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_reset( TT_Size  size )
+  {
+    TT_Face           face;
+    FT_Error          error = FT_Err_Ok;
+    FT_Size_Metrics*  metrics;
+
+
+    size->ttmetrics.valid = FALSE;
+
+    face = (TT_Face)size->root.face;
+
+    metrics = &size->metrics;
+
+    /* copy the result from base layer */
+    *metrics = size->root.metrics;
+
+    if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 )
+      return FT_THROW( Invalid_PPem );
+
+    /* This bit flag, if set, indicates that the ppems must be       */
+    /* rounded to integers.  Nearly all TrueType fonts have this bit */
+    /* set, as hinting won't work really well otherwise.             */
+    /*                                                               */
+    if ( face->header.Flags & 8 )
+    {
+      metrics->x_scale = FT_DivFix( metrics->x_ppem << 6,
+                                    face->root.units_per_EM );
+      metrics->y_scale = FT_DivFix( metrics->y_ppem << 6,
+                                    face->root.units_per_EM );
+
+      metrics->ascender =
+        FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) );
+      metrics->descender =
+        FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) );
+      metrics->height =
+        FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) );
+      metrics->max_advance =
+        FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width,
+                                 metrics->x_scale ) );
+    }
+
+    /* compute new transformation */
+    if ( metrics->x_ppem >= metrics->y_ppem )
+    {
+      size->ttmetrics.scale   = metrics->x_scale;
+      size->ttmetrics.ppem    = metrics->x_ppem;
+      size->ttmetrics.x_ratio = 0x10000L;
+      size->ttmetrics.y_ratio = FT_DivFix( metrics->y_ppem,
+                                           metrics->x_ppem );
+    }
+    else
+    {
+      size->ttmetrics.scale   = metrics->y_scale;
+      size->ttmetrics.ppem    = metrics->y_ppem;
+      size->ttmetrics.x_ratio = FT_DivFix( metrics->x_ppem,
+                                           metrics->y_ppem );
+      size->ttmetrics.y_ratio = 0x10000L;
+    }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    size->cvt_ready = 0;
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+    if ( !error )
+      size->ttmetrics.valid = TRUE;
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_driver_init                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a given TrueType driver object.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target driver object.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_driver_init( FT_Module  ttdriver )     /* TT_Driver */
+  {
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    TT_Driver  driver = (TT_Driver)ttdriver;
+
+
+    if ( !TT_New_Context( driver ) )
+      return FT_THROW( Could_Not_Find_Context );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    driver->interpreter_version = TT_INTERPRETER_VERSION_38;
+#else
+    driver->interpreter_version = TT_INTERPRETER_VERSION_35;
+#endif
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+    FT_UNUSED( ttdriver );
+
+#endif /* !TT_USE_BYTECODE_INTERPRETER */
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_driver_done                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalize a given TrueType driver.                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target TrueType driver.                  */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_driver_done( FT_Module  ttdriver )     /* TT_Driver */
+  {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    TT_Driver  driver = (TT_Driver)ttdriver;
+
+
+    /* destroy the execution context */
+    if ( driver->context )
+    {
+      TT_Done_Context( driver->context );
+      driver->context = NULL;
+    }
+#else
+    FT_UNUSED( ttdriver );
+#endif
+
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_slot_init                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a new slot object.                                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    slot :: A handle to the slot object.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_slot_init( FT_GlyphSlot  slot )
+  {
+    return FT_GlyphLoader_CreateExtra( slot->internal->loader );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.h
new file mode 100644
index 0000000..21dfb7a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.h
@@ -0,0 +1,442 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttobjs.h                                                               */
+/*                                                                         */
+/*    Objects manager (specification).                                     */
+/*                                                                         */
+/*  Copyright 1996-2009, 2011-2013 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTOBJS_H__
+#define __TTOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_Driver                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a TrueType driver object.                              */
+  /*                                                                       */
+  typedef struct TT_DriverRec_*  TT_Driver;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_Instance                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a TrueType size object.                                */
+  /*                                                                       */
+  typedef struct TT_SizeRec_*  TT_Size;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_GlyphSlot                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a TrueType glyph slot object.                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This is a direct typedef of FT_GlyphSlot, as there is nothing      */
+  /*    specific about the TrueType glyph slot.                            */
+  /*                                                                       */
+  typedef FT_GlyphSlot  TT_GlyphSlot;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_GraphicsState                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The TrueType graphics state used during bytecode interpretation.   */
+  /*                                                                       */
+  typedef struct  TT_GraphicsState_
+  {
+    FT_UShort      rp0;
+    FT_UShort      rp1;
+    FT_UShort      rp2;
+
+    FT_UnitVector  dualVector;
+    FT_UnitVector  projVector;
+    FT_UnitVector  freeVector;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    FT_Bool        both_x_axis;
+#endif
+
+    FT_Long        loop;
+    FT_F26Dot6     minimum_distance;
+    FT_Int         round_state;
+
+    FT_Bool        auto_flip;
+    FT_F26Dot6     control_value_cutin;
+    FT_F26Dot6     single_width_cutin;
+    FT_F26Dot6     single_width_value;
+    FT_Short       delta_base;
+    FT_Short       delta_shift;
+
+    FT_Byte        instruct_control;
+    /* According to Greg Hitchcock from Microsoft, the `scan_control'     */
+    /* variable as documented in the TrueType specification is a 32-bit   */
+    /* integer; the high-word part holds the SCANTYPE value, the low-word */
+    /* part the SCANCTRL value.  We separate it into two fields.          */
+    FT_Bool        scan_control;
+    FT_Int         scan_type;
+
+    FT_UShort      gep0;
+    FT_UShort      gep1;
+    FT_UShort      gep2;
+
+  } TT_GraphicsState;
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  FT_LOCAL( void )
+  tt_glyphzone_done( TT_GlyphZone  zone );
+
+  FT_LOCAL( FT_Error )
+  tt_glyphzone_new( FT_Memory     memory,
+                    FT_UShort     maxPoints,
+                    FT_Short      maxContours,
+                    TT_GlyphZone  zone );
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  EXECUTION SUBTABLES                                                  */
+  /*                                                                       */
+  /*  These sub-tables relate to instruction execution.                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#define TT_MAX_CODE_RANGES  3
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* There can only be 3 active code ranges at once:                       */
+  /*   - the Font Program                                                  */
+  /*   - the CVT Program                                                   */
+  /*   - a glyph's instructions set                                        */
+  /*                                                                       */
+  typedef enum  TT_CodeRange_Tag_
+  {
+    tt_coderange_none = 0,
+    tt_coderange_font,
+    tt_coderange_cvt,
+    tt_coderange_glyph
+
+  } TT_CodeRange_Tag;
+
+
+  typedef struct  TT_CodeRange_
+  {
+    FT_Byte*  base;
+    FT_ULong  size;
+
+  } TT_CodeRange;
+
+  typedef TT_CodeRange  TT_CodeRangeTable[TT_MAX_CODE_RANGES];
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Defines a function/instruction definition record.                     */
+  /*                                                                       */
+  typedef struct  TT_DefRecord_
+  {
+    FT_Int    range;          /* in which code range is it located?     */
+    FT_Long   start;          /* where does it start?                   */
+    FT_Long   end;            /* where does it end?                     */
+    FT_UInt   opc;            /* function #, or instruction code        */
+    FT_Bool   active;         /* is it active?                          */
+    FT_Bool   inline_delta;   /* is function that defines inline delta? */
+    FT_ULong  sph_fdef_flags; /* flags to identify special functions    */
+
+  } TT_DefRecord, *TT_DefArray;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Subglyph transformation record.                                       */
+  /*                                                                       */
+  typedef struct  TT_Transform_
+  {
+    FT_Fixed    xx, xy;     /* transformation matrix coefficients */
+    FT_Fixed    yx, yy;
+    FT_F26Dot6  ox, oy;     /* offsets                            */
+
+  } TT_Transform;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A note regarding non-squared pixels:                                  */
+  /*                                                                       */
+  /* (This text will probably go into some docs at some time; for now, it  */
+  /* is kept here to explain some definitions in the TT_Size_Metrics       */
+  /* record).                                                              */
+  /*                                                                       */
+  /* The CVT is a one-dimensional array containing values that control     */
+  /* certain important characteristics in a font, like the height of all   */
+  /* capitals, all lowercase letter, default spacing or stem width/height. */
+  /*                                                                       */
+  /* These values are found in FUnits in the font file, and must be scaled */
+  /* to pixel coordinates before being used by the CVT and glyph programs. */
+  /* Unfortunately, when using distinct x and y resolutions (or distinct x */
+  /* and y pointsizes), there are two possible scalings.                   */
+  /*                                                                       */
+  /* A first try was to implement a `lazy' scheme where all values were    */
+  /* scaled when first used.  However, while some values are always used   */
+  /* in the same direction, some others are used under many different      */
+  /* circumstances and orientations.                                       */
+  /*                                                                       */
+  /* I have found a simpler way to do the same, and it even seems to work  */
+  /* in most of the cases:                                                 */
+  /*                                                                       */
+  /* - All CVT values are scaled to the maximum ppem size.                 */
+  /*                                                                       */
+  /* - When performing a read or write in the CVT, a ratio factor is used  */
+  /*   to perform adequate scaling.  Example:                              */
+  /*                                                                       */
+  /*     x_ppem = 14                                                       */
+  /*     y_ppem = 10                                                       */
+  /*                                                                       */
+  /*   We choose ppem = x_ppem = 14 as the CVT scaling size.  All cvt      */
+  /*   entries are scaled to it.                                           */
+  /*                                                                       */
+  /*     x_ratio = 1.0                                                     */
+  /*     y_ratio = y_ppem/ppem (< 1.0)                                     */
+  /*                                                                       */
+  /*   We compute the current ratio like:                                  */
+  /*                                                                       */
+  /*   - If projVector is horizontal,                                      */
+  /*       ratio = x_ratio = 1.0                                           */
+  /*                                                                       */
+  /*   - if projVector is vertical,                                        */
+  /*       ratio = y_ratio                                                 */
+  /*                                                                       */
+  /*   - else,                                                             */
+  /*       ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */
+  /*                                                                       */
+  /*   Reading a cvt value returns                                         */
+  /*     ratio * cvt[index]                                                */
+  /*                                                                       */
+  /*   Writing a cvt value in pixels:                                      */
+  /*     cvt[index] / ratio                                                */
+  /*                                                                       */
+  /*   The current ppem is simply                                          */
+  /*     ratio * ppem                                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Metrics used by the TrueType size and context objects.                */
+  /*                                                                       */
+  typedef struct  TT_Size_Metrics_
+  {
+    /* for non-square pixels */
+    FT_Long     x_ratio;
+    FT_Long     y_ratio;
+
+    FT_UShort   ppem;               /* maximum ppem size              */
+    FT_Long     ratio;              /* current ratio                  */
+    FT_Fixed    scale;
+
+    FT_F26Dot6  compensations[4];   /* device-specific compensations  */
+
+    FT_Bool     valid;
+
+    FT_Bool     rotated;            /* `is the glyph rotated?'-flag   */
+    FT_Bool     stretched;          /* `is the glyph stretched?'-flag */
+
+  } TT_Size_Metrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TrueType size class.                                                  */
+  /*                                                                       */
+  typedef struct  TT_SizeRec_
+  {
+    FT_SizeRec         root;
+
+    /* we have our own copy of metrics so that we can modify */
+    /* it without affecting auto-hinting (when used)         */
+    FT_Size_Metrics    metrics;
+
+    TT_Size_Metrics    ttmetrics;
+
+    FT_ULong           strike_index;      /* 0xFFFFFFFF to indicate invalid */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    FT_UInt            num_function_defs; /* number of function definitions */
+    FT_UInt            max_function_defs;
+    TT_DefArray        function_defs;     /* table of function definitions  */
+
+    FT_UInt            num_instruction_defs;  /* number of ins. definitions */
+    FT_UInt            max_instruction_defs;
+    TT_DefArray        instruction_defs;      /* table of ins. definitions  */
+
+    FT_UInt            max_func;
+    FT_UInt            max_ins;
+
+    TT_CodeRangeTable  codeRangeTable;
+
+    TT_GraphicsState   GS;
+
+    FT_ULong           cvt_size;      /* the scaled control value table */
+    FT_Long*           cvt;
+
+    FT_UShort          storage_size; /* The storage area is now part of */
+    FT_Long*           storage;      /* the instance                    */
+
+    TT_GlyphZoneRec    twilight;     /* The instance's twilight zone    */
+
+    /* debugging variables */
+
+    /* When using the debugger, we must keep the */
+    /* execution context tied to the instance    */
+    /* object rather than asking it on demand.   */
+
+    FT_Bool            debug;
+    TT_ExecContext     context;
+
+    FT_Bool            bytecode_ready;
+    FT_Bool            cvt_ready;
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+  } TT_SizeRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TrueType driver class.                                                */
+  /*                                                                       */
+  typedef struct  TT_DriverRec_
+  {
+    FT_DriverRec  root;
+
+    TT_ExecContext   context;  /* execution context        */
+    TT_GlyphZoneRec  zone;     /* glyph loader points zone */
+
+    FT_UInt  interpreter_version;
+
+  } TT_DriverRec;
+
+
+  /* Note: All of the functions below (except tt_size_reset()) are used    */
+  /* as function pointers in a FT_Driver_ClassRec.  Therefore their        */
+  /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face,  */
+  /* TT_Size, etc., so that the compiler can confirm that the types and    */
+  /* number of parameters are correct.  In all cases the FT_xxx types are  */
+  /* cast to their TT_xxx counterparts inside the functions since FreeType */
+  /* will always use the TT driver to create them.                         */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Face functions                                                        */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  tt_face_init( FT_Stream      stream,
+                FT_Face        ttface,      /* TT_Face */
+                FT_Int         face_index,
+                FT_Int         num_params,
+                FT_Parameter*  params );
+
+  FT_LOCAL( void )
+  tt_face_done( FT_Face  ttface );          /* TT_Face */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Size functions                                                        */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  tt_size_init( FT_Size  ttsize );          /* TT_Size */
+
+  FT_LOCAL( void )
+  tt_size_done( FT_Size  ttsize );          /* TT_Size */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  FT_LOCAL( FT_Error )
+  tt_size_run_fpgm( TT_Size  size,
+                    FT_Bool  pedantic );
+
+  FT_LOCAL( FT_Error )
+  tt_size_run_prep( TT_Size  size,
+                    FT_Bool  pedantic );
+
+  FT_LOCAL( FT_Error )
+  tt_size_ready_bytecode( TT_Size  size,
+                          FT_Bool  pedantic );
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+  FT_LOCAL( FT_Error )
+  tt_size_reset( TT_Size  size );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Driver functions                                                      */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  tt_driver_init( FT_Module  ttdriver );    /* TT_Driver */
+
+  FT_LOCAL( void )
+  tt_driver_done( FT_Module  ttdriver );    /* TT_Driver */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Slot functions                                                        */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  tt_slot_init( FT_GlyphSlot  slot );
+
+
+  /* auxiliary */
+#define IS_HINTED( flags )  ( ( flags & FT_LOAD_NO_HINTING ) == 0 )
+
+
+FT_END_HEADER
+
+#endif /* __TTOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.c
new file mode 100644
index 0000000..ea38fd8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.c
@@ -0,0 +1,101 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttpic.c                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services for truetype module. */
+/*                                                                         */
+/*  Copyright 2009, 2010, 2012, 2013 by                                    */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "ttpic.h"
+#include "tterrors.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from ttdriver.c */
+  FT_Error
+  FT_Create_Class_tt_services( FT_Library           library,
+                               FT_ServiceDescRec**  output_class );
+  void
+  FT_Destroy_Class_tt_services( FT_Library          library,
+                                FT_ServiceDescRec*  clazz );
+  void
+  FT_Init_Class_tt_service_gx_multi_masters(
+    FT_Service_MultiMastersRec*  sv_mm );
+  void
+  FT_Init_Class_tt_service_truetype_glyf(
+    FT_Service_TTGlyfRec*  sv_ttglyf );
+
+
+  void
+  tt_driver_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory          memory        = library->memory;
+
+
+    if ( pic_container->truetype )
+    {
+      TTModulePIC*  container = (TTModulePIC*)pic_container->truetype;
+
+
+      if ( container->tt_services )
+        FT_Destroy_Class_tt_services( library, container->tt_services );
+      container->tt_services = NULL;
+      FT_FREE( container );
+      pic_container->truetype = NULL;
+    }
+  }
+
+
+  FT_Error
+  tt_driver_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = FT_Err_Ok;
+    TTModulePIC*       container     = NULL;
+    FT_Memory          memory        = library->memory;
+
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->truetype = container;
+
+    /* initialize pointer table - this is how the module usually */
+    /* expects this data                                         */
+    error = FT_Create_Class_tt_services( library,
+                                         &container->tt_services );
+    if ( error )
+      goto Exit;
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    FT_Init_Class_tt_service_gx_multi_masters(
+      &container->tt_service_gx_multi_masters );
+#endif
+    FT_Init_Class_tt_service_truetype_glyf(
+      &container->tt_service_truetype_glyf );
+
+  Exit:
+    if ( error )
+      tt_driver_class_pic_free( library );
+    return error;
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.h
new file mode 100644
index 0000000..36cb357
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttpic.h                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services for truetype module. */
+/*                                                                         */
+/*  Copyright 2009, 2012, 2013 by                                          */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTPIC_H__
+#define __TTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define TT_SERVICES_GET                  tt_services
+#define TT_SERVICE_GX_MULTI_MASTERS_GET  tt_service_gx_multi_masters
+#define TT_SERVICE_TRUETYPE_GLYF_GET     tt_service_truetype_glyf
+#define TT_SERVICE_PROPERTIES_GET        tt_service_properties
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/services/svmm.h"
+#include "../../include/freetype/internal/services/svttglyf.h"
+#include "../../include/freetype/internal/services/svprop.h"
+
+
+  typedef struct  TTModulePIC_
+  {
+    FT_ServiceDescRec*          tt_services;
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    FT_Service_MultiMastersRec  tt_service_gx_multi_masters;
+#endif
+    FT_Service_TTGlyfRec        tt_service_truetype_glyf;
+    FT_Service_PropertiesRec    tt_service_properties;
+
+  } TTModulePIC;
+
+
+#define GET_PIC( lib )                                      \
+          ( (TTModulePIC*)((lib)->pic_container.truetype) )
+#define TT_SERVICES_GET                       \
+          ( GET_PIC( library )->tt_services )
+#define TT_SERVICE_GX_MULTI_MASTERS_GET                       \
+          ( GET_PIC( library )->tt_service_gx_multi_masters )
+#define TT_SERVICE_TRUETYPE_GLYF_GET                       \
+          ( GET_PIC( library )->tt_service_truetype_glyf )
+#define TT_SERVICE_PROPERTIES_GET                       \
+          ( GET_PIC( library )->tt_service_properties )
+
+
+  /* see ttpic.c for the implementation */
+  void
+  tt_driver_class_pic_free( FT_Library  library );
+
+  FT_Error
+  tt_driver_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __TTPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.c
new file mode 100644
index 0000000..283d07d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.c
@@ -0,0 +1,601 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttpload.c                                                              */
+/*                                                                         */
+/*    TrueType-specific tables loader (body).                              */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004-2013 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+
+#include "ttpload.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+#include "tterrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttpload
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_loca                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the locations table.                                          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_loca( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error  error;
+    FT_ULong  table_len;
+    FT_Int    shift;
+
+
+    /* we need the size of the `glyf' table for malformed `loca' tables */
+    error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len );
+
+    /* it is possible that a font doesn't have a glyf table at all */
+    /* or its size is zero                                         */
+    if ( FT_ERR_EQ( error, Table_Missing ) )
+      face->glyf_len = 0;
+    else if ( error )
+      goto Exit;
+
+    FT_TRACE2(( "Locations " ));
+    error = face->goto_table( face, TTAG_loca, stream, &table_len );
+    if ( error )
+    {
+      error = FT_THROW( Locations_Missing );
+      goto Exit;
+    }
+
+    if ( face->header.Index_To_Loc_Format != 0 )
+    {
+      shift = 2;
+
+      if ( table_len >= 0x40000L )
+      {
+        FT_TRACE2(( "table too large\n" ));
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
+      }
+      face->num_locations = table_len >> shift;
+    }
+    else
+    {
+      shift = 1;
+
+      if ( table_len >= 0x20000L )
+      {
+        FT_TRACE2(( "table too large\n" ));
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
+      }
+      face->num_locations = table_len >> shift;
+    }
+	/* Sunliang.Liu 20101013, We ignore the 242 new added code which cause some font load failed. 
+	   TESTDOC: Bug #4502 - PM2-beheerdershandleiding.pdf*/
+    /*if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 )
+    {
+      FT_TRACE2(( "glyph count mismatch!  loca: %d, maxp: %d\n",
+                  face->num_locations - 1, face->root.num_glyphs ));
+
+      // we only handle the case where `maxp' gives a larger value 
+      if ( face->num_locations <= (FT_ULong)face->root.num_glyphs )
+      {
+        FT_Long   new_loca_len =
+                    ( (FT_Long)( face->root.num_glyphs ) + 1 ) << shift;
+
+        TT_Table  entry = face->dir_tables;
+        TT_Table  limit = entry + face->num_tables;
+
+        FT_Long   pos  = FT_Stream_Pos( stream );
+        FT_Long   dist = 0x7FFFFFFFL;
+
+
+        // compute the distance to next table in font file 
+        for ( ; entry < limit; entry++ )
+        {
+          FT_Long  diff = entry->Offset - pos;
+
+
+          if ( diff > 0 && diff < dist )
+            dist = diff;
+        }
+
+        if ( entry == limit )
+        {
+          // `loca' is the last table
+          dist = stream->size - pos;
+        }
+
+        if ( new_loca_len <= dist )
+        {
+          face->num_locations = face->root.num_glyphs + 1;
+          table_len           = new_loca_len;
+
+          FT_TRACE2(( "adjusting num_locations to %d\n",
+                      face->num_locations ));
+        }
+      }
+    }*/
+
+    /*
+     * Extract the frame.  We don't need to decompress it since
+     * we are able to parse it directly.
+     */
+    if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) )
+      goto Exit;
+
+    FT_TRACE2(( "loaded\n" ));
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_ULong )
+  tt_face_get_location( TT_Face   face,
+                        FT_UInt   gindex,
+                        FT_UInt  *asize )
+  {
+    FT_ULong  pos1, pos2;
+    FT_Byte*  p;
+    FT_Byte*  p_limit;
+
+
+    pos1 = pos2 = 0;
+
+
+    if (gindex < face->num_locations)/* gindex < face->num_locations */ /* XYQ 2008-11-03 Some ill TT has wrong glyf table size. It seems Adobe ignore the limit. TESTDOC: Bug #6248 - F-2008-18.pdf */
+    {
+      if ( face->header.Index_To_Loc_Format != 0 )
+      {
+        p       = face->glyph_locations + gindex * 4;
+        p_limit = face->glyph_locations + face->num_locations * 4;
+
+        pos1 = FT_NEXT_ULONG( p );
+        pos2 = pos1;
+
+        if (1)/* p + 4 <= p_limit ) */
+          pos2 = FT_NEXT_ULONG( p );
+      }
+      else
+      {
+        p       = face->glyph_locations + gindex * 2;
+        p_limit = face->glyph_locations + face->num_locations * 2;
+
+        pos1 = FT_NEXT_USHORT( p );
+        pos2 = pos1;
+
+        if (1) /* p + 2 <= p_limit ) */
+          pos2 = FT_NEXT_USHORT( p );
+
+        pos1 <<= 1;
+        pos2 <<= 1;
+      }
+    }
+
+    /* Check broken location data */
+    if ( pos1 > face->glyf_len )
+    {
+      FT_TRACE1(( "tt_face_get_location:"
+                  " too large offset=0x%08lx found for gid=0x%04lx,"
+                  " exceeding the end of glyf table (0x%08lx)\n",
+                  pos1, gindex, face->glyf_len ));
+      *asize = 0;
+      return 0;
+    }
+
+    if ( pos2 > face->glyf_len )
+    {
+      FT_TRACE1(( "tt_face_get_location:"
+                  " too large offset=0x%08lx found for gid=0x%04lx,"
+                  " truncate at the end of glyf table (0x%08lx)\n",
+                  pos2, gindex + 1, face->glyf_len ));
+      pos2 = face->glyf_len;
+    }
+
+    /* The `loca' table must be ordered; it refers to the length of */
+    /* an entry as the difference between the current and the next  */
+    /* position.  However, there do exist (malformed) fonts which   */
+    /* don't obey this rule, so we are only able to provide an      */
+    /* upper bound for the size.                                    */
+    /*                                                              */
+    /* We get (intentionally) a wrong, non-zero result in case the  */
+    /* `glyf' table is missing.                                     */
+    if ( pos2 >= pos1 )
+      *asize = (FT_UInt)( pos2 - pos1 );
+    else
+      *asize = (FT_UInt)( face->glyf_len - pos1 );
+
+    return pos1;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  tt_face_done_loca( TT_Face  face )
+  {
+    FT_Stream  stream = face->root.stream;
+
+
+    FT_FRAME_RELEASE( face->glyph_locations );
+    face->num_locations = 0;
+  }
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_cvt                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the control value table into a face object.                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_cvt( TT_Face    face,
+                    FT_Stream  stream )
+  {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    FT_Error   error;
+    FT_Memory  memory = stream->memory;
+    FT_ULong   table_len;
+
+
+    FT_TRACE2(( "CVT " ));
+
+    error = face->goto_table( face, TTAG_cvt, stream, &table_len );
+    if ( error )
+    {
+      FT_TRACE2(( "is missing\n" ));
+
+      face->cvt_size = 0;
+      face->cvt      = NULL;
+      error          = FT_Err_Ok;
+
+      goto Exit;
+    }
+
+    face->cvt_size = table_len / 2;
+
+    if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) )
+      goto Exit;
+
+    if ( FT_FRAME_ENTER( face->cvt_size * 2L ) )
+      goto Exit;
+
+    {
+      FT_Short*  cur   = face->cvt;
+      FT_Short*  limit = cur + face->cvt_size;
+
+
+      for ( ; cur < limit; cur++ )
+        *cur = FT_GET_SHORT();
+    }
+
+    FT_FRAME_EXIT();
+    FT_TRACE2(( "loaded\n" ));
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    if ( face->doblend )
+      error = tt_face_vary_cvt( face, stream );
+#endif
+
+  Exit:
+    return error;
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+    FT_UNUSED( face   );
+    FT_UNUSED( stream );
+
+    return FT_Err_Ok;
+
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_fpgm                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the font program.                                             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_fpgm( TT_Face    face,
+                     FT_Stream  stream )
+  {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    FT_Error  error;
+    FT_ULong  table_len;
+
+
+    FT_TRACE2(( "Font program " ));
+
+    /* The font program is optional */
+    error = face->goto_table( face, TTAG_fpgm, stream, &table_len );
+    if ( error )
+    {
+      face->font_program      = NULL;
+      face->font_program_size = 0;
+      error                   = FT_Err_Ok;
+
+      FT_TRACE2(( "is missing\n" ));
+    }
+    else
+    {
+      face->font_program_size = table_len;
+      if ( FT_FRAME_EXTRACT( table_len, face->font_program ) )
+        goto Exit;
+
+      FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size ));
+    }
+
+  Exit:
+    return error;
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+    FT_UNUSED( face   );
+    FT_UNUSED( stream );
+
+    return FT_Err_Ok;
+
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_prep                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the cvt program.                                              */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_prep( TT_Face    face,
+                     FT_Stream  stream )
+  {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    FT_Error  error;
+    FT_ULong  table_len;
+
+
+    FT_TRACE2(( "Prep program " ));
+
+    error = face->goto_table( face, TTAG_prep, stream, &table_len );
+    if ( error )
+    {
+      face->cvt_program      = NULL;
+      face->cvt_program_size = 0;
+      error                  = FT_Err_Ok;
+
+      FT_TRACE2(( "is missing\n" ));
+    }
+    else
+    {
+      face->cvt_program_size = table_len;
+      if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) )
+        goto Exit;
+
+      FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size ));
+    }
+
+  Exit:
+    return error;
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+    FT_UNUSED( face   );
+    FT_UNUSED( stream );
+
+    return FT_Err_Ok;
+
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_hdmx                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the `hdmx' table into the face object.                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_hdmx( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error   error;
+    FT_Memory  memory = stream->memory;
+    FT_UInt    version, nn, num_records;
+    FT_ULong   table_size, record_size;
+    FT_Byte*   p;
+    FT_Byte*   limit;
+
+
+    /* this table is optional */
+    error = face->goto_table( face, TTAG_hdmx, stream, &table_size );
+    if ( error || table_size < 8 )
+      return FT_Err_Ok;
+
+    if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) )
+      goto Exit;
+
+    p     = face->hdmx_table;
+    limit = p + table_size;
+
+    version     = FT_NEXT_USHORT( p );
+    num_records = FT_NEXT_USHORT( p );
+    record_size = FT_NEXT_ULONG( p );
+
+    /* The maximum number of bytes in an hdmx device record is the */
+    /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is   */
+    /* the reason why `record_size' is a long (which we read as    */
+    /* unsigned long for convenience).  In practice, two bytes     */
+    /* sufficient to hold the size value.                          */
+    /*                                                             */
+    /* There are at least two fonts, HANNOM-A and HANNOM-B version */
+    /* 2.0 (2005), which get this wrong: The upper two bytes of    */
+    /* the size value are set to 0xFF instead of 0x00.  We catch   */
+    /* and fix this.                                               */
+
+    if ( record_size >= 0xFFFF0000UL )
+      record_size &= 0xFFFFU;
+
+    /* The limit for `num_records' is a heuristic value. */
+
+    if ( version != 0 || num_records > 255 || record_size > 0x10001L )
+    {
+      error = FT_THROW( Invalid_File_Format );
+      goto Fail;
+    }
+
+    if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) )
+      goto Fail;
+
+    for ( nn = 0; nn < num_records; nn++ )
+    {
+      if ( p + record_size > limit )
+        break;
+
+      face->hdmx_record_sizes[nn] = p[0];
+      p                          += record_size;
+    }
+
+    face->hdmx_record_count = nn;
+    face->hdmx_table_size   = table_size;
+    face->hdmx_record_size  = record_size;
+
+  Exit:
+    return error;
+
+  Fail:
+    FT_FRAME_RELEASE( face->hdmx_table );
+    face->hdmx_table_size = 0;
+    goto Exit;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  tt_face_free_hdmx( TT_Face  face )
+  {
+    FT_Stream  stream = face->root.stream;
+    FT_Memory  memory = stream->memory;
+
+
+    FT_FREE( face->hdmx_record_sizes );
+    FT_FRAME_RELEASE( face->hdmx_table );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Return the advance width table for a given pixel size if it is found  */
+  /* in the font's `hdmx' table (if any).                                  */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Byte* )
+  tt_face_get_device_metrics( TT_Face  face,
+                              FT_UInt  ppem,
+                              FT_UInt  gindex )
+  {
+    FT_UInt   nn;
+    FT_Byte*  result      = NULL;
+    FT_ULong  record_size = face->hdmx_record_size;
+    FT_Byte*  record      = face->hdmx_table + 8;
+
+
+    for ( nn = 0; nn < face->hdmx_record_count; nn++ )
+      if ( face->hdmx_record_sizes[nn] == ppem )
+      {
+        gindex += 2;
+        if ( gindex < record_size )
+          result = record + nn * record_size + gindex;
+        break;
+      }
+
+    return result;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.h
new file mode 100644
index 0000000..4535880
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.h
@@ -0,0 +1,75 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttpload.h                                                              */
+/*                                                                         */
+/*    TrueType-specific tables loader (specification).                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2005, 2006 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTPLOAD_H__
+#define __TTPLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_loca( TT_Face    face,
+                     FT_Stream  stream );
+
+  FT_LOCAL( FT_ULong )
+  tt_face_get_location( TT_Face   face,
+                        FT_UInt   gindex,
+                        FT_UInt  *asize );
+
+  FT_LOCAL( void )
+  tt_face_done_loca( TT_Face  face );
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_cvt( TT_Face    face,
+                    FT_Stream  stream );
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_fpgm( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_prep( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_hdmx( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( void )
+  tt_face_free_hdmx( TT_Face  face );
+
+
+  FT_LOCAL( FT_Byte* )
+  tt_face_get_device_metrics( TT_Face    face,
+                              FT_UInt    ppem,
+                              FT_UInt    gindex );
+
+FT_END_HEADER
+
+#endif /* __TTPLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.c
new file mode 100644
index 0000000..1bff6f9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.c
@@ -0,0 +1,1011 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttsubpix.c                                                             */
+/*                                                                         */
+/*    TrueType Subpixel Hinting.                                           */
+/*                                                                         */
+/*  Copyright 2010-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftttdrv.h"
+
+#include "ttsubpix.h"
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* These rules affect how the TT Interpreter does hinting, with the      */
+  /* goal of doing subpixel hinting by (in general) ignoring x moves.      */
+  /* Some of these rules are fixes that go above and beyond the            */
+  /* stated techniques in the MS whitepaper on Cleartype, due to           */
+  /* artifacts in many glyphs.  So, these rules make some glyphs render    */
+  /* better than they do in the MS rasterizer.                             */
+  /*                                                                       */
+  /* "" string or 0 int/char indicates to apply to all glyphs.             */
+  /* "-" used as dummy placeholders, but any non-matching string works.    */
+  /*                                                                       */
+  /* Some of this could arguably be implemented in fontconfig, however:    */
+  /*                                                                       */
+  /*  - Fontconfig can't set things on a glyph-by-glyph basis.             */
+  /*  - The tweaks that happen here are very low-level, from an average    */
+  /*    user's point of view and are best implemented in the hinter.       */
+  /*                                                                       */
+  /* The goal is to make the subpixel hinting techniques as generalized    */
+  /* as possible across all fonts to prevent the need for extra rules such */
+  /* as these.                                                             */
+  /*                                                                       */
+  /* The rule structure is designed so that entirely new rules can easily  */
+  /* be added when a new compatibility feature is discovered.              */
+  /*                                                                       */
+  /* The rule structures could also use some enhancement to handle ranges. */
+  /*                                                                       */
+  /*     ****************** WORK IN PROGRESS *******************           */
+  /*                                                                       */
+
+  /* These are `classes' of fonts that can be grouped together and used in */
+  /* rules below.  A blank entry "" is required at the end of these!       */
+#define FAMILY_CLASS_RULES_SIZE  7
+
+  static const SPH_Font_Class FAMILY_CLASS_Rules
+                              [FAMILY_CLASS_RULES_SIZE] =
+  {
+    { "MS Legacy Fonts",
+      { "Aharoni",
+        "Andale Mono",
+        "Andalus",
+        "Angsana New",
+        "AngsanaUPC",
+        "Arabic Transparent",
+        "Arial Black",
+        "Arial Narrow",
+        "Arial Unicode MS",
+        "Arial",
+        "Batang",
+        "Browallia New",
+        "BrowalliaUPC",
+        "Comic Sans MS",
+        "Cordia New",
+        "CordiaUPC",
+        "Courier New",
+        "DFKai-SB",
+        "David Transparent",
+        "David",
+        "DilleniaUPC",
+        "Estrangelo Edessa",
+        "EucrosiaUPC",
+        "FangSong_GB2312",
+        "Fixed Miriam Transparent",
+        "FrankRuehl",
+        "Franklin Gothic Medium",
+        "FreesiaUPC",
+        "Garamond",
+        "Gautami",
+        "Georgia",
+        "Gulim",
+        "Impact",
+        "IrisUPC",
+        "JasmineUPC",
+        "KaiTi_GB2312",
+        "KodchiangUPC",
+        "Latha",
+        "Levenim MT",
+        "LilyUPC",
+        "Lucida Console",
+        "Lucida Sans Unicode",
+        "MS Gothic",
+        "MS Mincho",
+        "MV Boli",
+        "Mangal",
+        "Marlett",
+        "Microsoft Sans Serif",
+        "Mingliu",
+        "Miriam Fixed",
+        "Miriam Transparent",
+        "Miriam",
+        "Narkisim",
+        "Palatino Linotype",
+        "Raavi",
+        "Rod Transparent",
+        "Rod",
+        "Shruti",
+        "SimHei",
+        "Simplified Arabic Fixed",
+        "Simplified Arabic",
+        "Simsun",
+        "Sylfaen",
+        "Symbol",
+        "Tahoma",
+        "Times New Roman",
+        "Traditional Arabic",
+        "Trebuchet MS",
+        "Tunga",
+        "Verdana",
+        "Webdings",
+        "Wingdings",
+        "",
+      },
+    },
+    { "Core MS Legacy Fonts",
+      { "Arial Black",
+        "Arial Narrow",
+        "Arial Unicode MS",
+        "Arial",
+        "Comic Sans MS",
+        "Courier New",
+        "Garamond",
+        "Georgia",
+        "Impact",
+        "Lucida Console",
+        "Lucida Sans Unicode",
+        "Microsoft Sans Serif",
+        "Palatino Linotype",
+        "Tahoma",
+        "Times New Roman",
+        "Trebuchet MS",
+        "Verdana",
+        "",
+      },
+    },
+    { "Apple Legacy Fonts",
+      { "Geneva",
+        "Times",
+        "Monaco",
+        "Century",
+        "Chalkboard",
+        "Lobster",
+        "Century Gothic",
+        "Optima",
+        "Lucida Grande",
+        "Gill Sans",
+        "Baskerville",
+        "Helvetica",
+        "Helvetica Neue",
+        "",
+      },
+    },
+    { "Legacy Sans Fonts",
+      { "Andale Mono",
+        "Arial Unicode MS",
+        "Arial",
+        "Century Gothic",
+        "Comic Sans MS",
+        "Franklin Gothic Medium",
+        "Geneva",
+        "Lucida Console",
+        "Lucida Grande",
+        "Lucida Sans Unicode",
+        "Lucida Sans Typewriter",
+        "Microsoft Sans Serif",
+        "Monaco",
+        "Tahoma",
+        "Trebuchet MS",
+        "Verdana",
+        "",
+      },
+    },
+
+    { "Misc Legacy Fonts",
+      { "Dark Courier", "", }, },
+    { "Verdana Clones",
+      { "DejaVu Sans",
+        "Bitstream Vera Sans", "", }, },
+    { "Verdana and Clones",
+      { "DejaVu Sans",
+        "Bitstream Vera Sans",
+        "Verdana", "", }, },
+  };
+
+
+  /* Define this to force natural (i.e. not bitmap-compatible) widths.     */
+  /* The default leans strongly towards natural widths except for a few    */
+  /* legacy fonts where a selective combination produces nicer results.    */
+/* #define FORCE_NATURAL_WIDTHS   */
+
+
+  /* Define `classes' of styles that can be grouped together and used in   */
+  /* rules below.  A blank entry "" is required at the end of these!       */
+#define STYLE_CLASS_RULES_SIZE  5
+
+  const SPH_Font_Class STYLE_CLASS_Rules
+                       [STYLE_CLASS_RULES_SIZE] =
+  {
+    { "Regular Class",
+      { "Regular",
+        "Book",
+        "Medium",
+        "Roman",
+        "Normal",
+        "",
+      },
+    },
+    { "Regular/Italic Class",
+      { "Regular",
+        "Book",
+        "Medium",
+        "Italic",
+        "Oblique",
+        "Roman",
+        "Normal",
+        "",
+      },
+    },
+    { "Bold/BoldItalic Class",
+      { "Bold",
+        "Bold Italic",
+        "Black",
+        "",
+      },
+    },
+    { "Bold/Italic/BoldItalic Class",
+      { "Bold",
+        "Bold Italic",
+        "Black",
+        "Italic",
+        "Oblique",
+        "",
+      },
+    },
+    { "Regular/Bold Class",
+      { "Regular",
+        "Book",
+        "Medium",
+        "Normal",
+        "Roman",
+        "Bold",
+        "Black",
+        "",
+      },
+    },
+  };
+
+
+  /* Force special legacy fixes for fonts.                                 */
+#define COMPATIBILITY_MODE_RULES_SIZE  1
+
+  const SPH_TweakRule  COMPATIBILITY_MODE_Rules
+                       [COMPATIBILITY_MODE_RULES_SIZE] =
+  {
+    { "-", 0, "", 0 },
+  };
+
+
+  /* Don't do subpixel (ignore_x_mode) hinting; do normal hinting.         */
+#define PIXEL_HINTING_RULES_SIZE  2
+
+  const SPH_TweakRule  PIXEL_HINTING_Rules
+                       [PIXEL_HINTING_RULES_SIZE] =
+  {
+    /* these characters are almost always safe */
+    { "Courier New", 12, "Italic", 'z' },
+    { "Courier New", 11, "Italic", 'z' },
+  };
+
+
+  /* Subpixel hinting ignores SHPIX rules on X.  Force SHPIX for these.    */
+#define DO_SHPIX_RULES_SIZE  1
+
+  const SPH_TweakRule  DO_SHPIX_Rules
+                       [DO_SHPIX_RULES_SIZE] =
+  {
+    { "-", 0, "", 0 },
+  };
+
+
+  /* Skip Y moves that start with a point that is not on a Y pixel         */
+  /* boundary and don't move that point to a Y pixel boundary.             */
+#define SKIP_NONPIXEL_Y_MOVES_RULES_SIZE  4
+
+  const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_Rules
+                       [SKIP_NONPIXEL_Y_MOVES_RULES_SIZE] =
+  {
+    /* fix vwxyz thinness*/
+    { "Consolas", 0, "", 0 },
+    /* Fix thin middle stems */
+    { "Core MS Legacy Fonts", 0, "Regular", 0 },
+    /* Cyrillic small letter I */
+    { "Legacy Sans Fonts", 0, "", 0 },
+    /* Fix artifacts with some Regular & Bold */
+    { "Verdana Clones", 0, "", 0 },
+  };
+
+
+#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1
+
+  const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions
+                       [SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
+  {
+    /* Fixes < and > */
+    { "Courier New", 0, "Regular", 0 },
+  };
+
+
+  /* Skip Y moves that start with a point that is not on a Y pixel         */
+  /* boundary and don't move that point to a Y pixel boundary.             */
+#define SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE  2
+
+  const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_DELTAP_Rules
+                       [SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE] =
+  {
+    /* Maintain thickness of diagonal in 'N' */
+    { "Times New Roman", 0, "Regular/Bold Class", 'N' },
+    { "Georgia", 0, "Regular/Bold Class", 'N' },
+  };
+
+
+  /* Skip Y moves that move a point off a Y pixel boundary.                */
+#define SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE  1
+
+  const SPH_TweakRule  SKIP_OFFPIXEL_Y_MOVES_Rules
+                       [SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE] =
+  {
+    { "-", 0, "", 0 },
+  };
+
+
+#define SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1
+
+  const SPH_TweakRule  SKIP_OFFPIXEL_Y_MOVES_Rules_Exceptions
+                       [SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
+  {
+    { "-", 0, "", 0 },
+  };
+
+
+  /* Round moves that don't move a point to a Y pixel boundary.            */
+#define ROUND_NONPIXEL_Y_MOVES_RULES_SIZE  2
+
+  const SPH_TweakRule  ROUND_NONPIXEL_Y_MOVES_Rules
+                       [ROUND_NONPIXEL_Y_MOVES_RULES_SIZE] =
+  {
+    /* Droid font instructions don't snap Y to pixels */
+    { "Droid Sans", 0, "Regular/Italic Class", 0 },
+    { "Droid Sans Mono", 0, "", 0 },
+  };
+
+
+#define ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1
+
+  const SPH_TweakRule  ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions
+                       [ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
+  {
+    { "-", 0, "", 0 },
+  };
+
+
+  /* Allow a Direct_Move along X freedom vector if matched.                */
+#define ALLOW_X_DMOVE_RULES_SIZE  1
+
+  const SPH_TweakRule  ALLOW_X_DMOVE_Rules
+                       [ALLOW_X_DMOVE_RULES_SIZE] =
+  {
+    /* Fixes vanishing diagonal in 4 */
+    { "Verdana", 0, "Regular", '4' },
+  };
+
+
+  /* Return MS rasterizer version 35 if matched.                           */
+#define RASTERIZER_35_RULES_SIZE  8
+
+  const SPH_TweakRule  RASTERIZER_35_Rules
+                       [RASTERIZER_35_RULES_SIZE] =
+  {
+    /* This seems to be the only way to make these look good */
+    { "Times New Roman", 0, "Regular", 'i' },
+    { "Times New Roman", 0, "Regular", 'j' },
+    { "Times New Roman", 0, "Regular", 'm' },
+    { "Times New Roman", 0, "Regular", 'r' },
+    { "Times New Roman", 0, "Regular", 'a' },
+    { "Times New Roman", 0, "Regular", 'n' },
+    { "Times New Roman", 0, "Regular", 'p' },
+    { "Times", 0, "", 0 },
+  };
+
+
+  /* Don't round to the subpixel grid.  Round to pixel grid.               */
+#define NORMAL_ROUND_RULES_SIZE  1
+
+  const SPH_TweakRule  NORMAL_ROUND_Rules
+                       [NORMAL_ROUND_RULES_SIZE] =
+  {
+    /* Fix serif thickness for certain ppems */
+    /* Can probably be generalized somehow   */
+    { "Courier New", 0, "", 0 },
+  };
+
+
+  /* Skip IUP instructions if matched.                                     */
+#define SKIP_IUP_RULES_SIZE  1
+
+  const SPH_TweakRule  SKIP_IUP_Rules
+                       [SKIP_IUP_RULES_SIZE] =
+  {
+    { "Arial", 13, "Regular", 'a' },
+  };
+
+
+  /* Skip MIAP Twilight hack if matched.                                   */
+#define MIAP_HACK_RULES_SIZE  1
+
+  const SPH_TweakRule  MIAP_HACK_Rules
+                       [MIAP_HACK_RULES_SIZE] =
+  {
+    { "Geneva", 12, "", 0 },
+  };
+
+
+  /* Skip DELTAP instructions if matched.                                  */
+#define ALWAYS_SKIP_DELTAP_RULES_SIZE  23
+
+  const SPH_TweakRule  ALWAYS_SKIP_DELTAP_Rules
+                       [ALWAYS_SKIP_DELTAP_RULES_SIZE] =
+  {
+    { "Georgia", 0, "Regular", 'k' },
+    /* fix various problems with e in different versions */
+    { "Trebuchet MS", 14, "Regular", 'e' },
+    { "Trebuchet MS", 13, "Regular", 'e' },
+    { "Trebuchet MS", 15, "Regular", 'e' },
+    { "Trebuchet MS", 0, "Italic", 'v' },
+    { "Trebuchet MS", 0, "Italic", 'w' },
+    { "Trebuchet MS", 0, "Regular", 'Y' },
+    { "Arial", 11, "Regular", 's' },
+    /* prevent problems with '3' and others */
+    { "Verdana", 10, "Regular", 0 },
+    { "Verdana", 9, "Regular", 0 },
+    /* Cyrillic small letter short I */
+    { "Legacy Sans Fonts", 0, "", 0x438 },
+    { "Legacy Sans Fonts", 0, "", 0x439 },
+    { "Arial", 10, "Regular", '6' },
+    { "Arial", 0, "Bold/BoldItalic Class", 'a' },
+    /* Make horizontal stems consistent with the rest */
+    { "Arial", 24, "Bold", 'a' },
+    { "Arial", 25, "Bold", 'a' },
+    { "Arial", 24, "Bold", 's' },
+    { "Arial", 25, "Bold", 's' },
+    { "Arial", 34, "Bold", 's' },
+    { "Arial", 35, "Bold", 's' },
+    { "Arial", 36, "Bold", 's' },
+    { "Arial", 25, "Regular", 's' },
+    { "Arial", 26, "Regular", 's' },
+  };
+
+
+  /* Always do DELTAP instructions if matched.                             */
+#define ALWAYS_DO_DELTAP_RULES_SIZE  1
+
+  const SPH_TweakRule  ALWAYS_DO_DELTAP_Rules
+                       [ALWAYS_DO_DELTAP_RULES_SIZE] =
+  {
+    { "-", 0, "", 0 },
+  };
+
+
+  /* Don't allow ALIGNRP after IUP.                                        */
+#define NO_ALIGNRP_AFTER_IUP_RULES_SIZE  1
+
+  static const SPH_TweakRule  NO_ALIGNRP_AFTER_IUP_Rules
+                              [NO_ALIGNRP_AFTER_IUP_RULES_SIZE] =
+  {
+    /* Prevent creation of dents in outline */
+    { "-", 0, "", 0 },
+  };
+
+
+  /* Don't allow DELTAP after IUP.                                         */
+#define NO_DELTAP_AFTER_IUP_RULES_SIZE  1
+
+  static const SPH_TweakRule  NO_DELTAP_AFTER_IUP_Rules
+                              [NO_DELTAP_AFTER_IUP_RULES_SIZE] =
+  {
+    { "-", 0, "", 0 },
+  };
+
+
+  /* Don't allow CALL after IUP.                                           */
+#define NO_CALL_AFTER_IUP_RULES_SIZE  1
+
+  static const SPH_TweakRule  NO_CALL_AFTER_IUP_Rules
+                              [NO_CALL_AFTER_IUP_RULES_SIZE] =
+  {
+    /* Prevent creation of dents in outline */
+    { "-", 0, "", 0 },
+  };
+
+
+  /* De-embolden these glyphs slightly.                                    */
+#define DEEMBOLDEN_RULES_SIZE  9
+
+  static const SPH_TweakRule  DEEMBOLDEN_Rules
+                              [DEEMBOLDEN_RULES_SIZE] =
+  {
+    { "Courier New", 0, "Bold", 'A' },
+    { "Courier New", 0, "Bold", 'W' },
+    { "Courier New", 0, "Bold", 'w' },
+    { "Courier New", 0, "Bold", 'M' },
+    { "Courier New", 0, "Bold", 'X' },
+    { "Courier New", 0, "Bold", 'K' },
+    { "Courier New", 0, "Bold", 'x' },
+    { "Courier New", 0, "Bold", 'z' },
+    { "Courier New", 0, "Bold", 'v' },
+  };
+
+
+  /* Embolden these glyphs slightly.                                       */
+#define EMBOLDEN_RULES_SIZE  2
+
+  static const SPH_TweakRule  EMBOLDEN_Rules
+                              [EMBOLDEN_RULES_SIZE] =
+  {
+    { "Courier New", 0, "Regular", 0 },
+    { "Courier New", 0, "Italic", 0 },
+  };
+
+
+  /* This is a CVT hack that makes thick horizontal stems on 2, 5, 7       */
+  /* similar to Windows XP.                                                */
+#define TIMES_NEW_ROMAN_HACK_RULES_SIZE  12
+
+  static const SPH_TweakRule  TIMES_NEW_ROMAN_HACK_Rules
+                              [TIMES_NEW_ROMAN_HACK_RULES_SIZE] =
+  {
+    { "Times New Roman", 16, "Italic", '2' },
+    { "Times New Roman", 16, "Italic", '5' },
+    { "Times New Roman", 16, "Italic", '7' },
+    { "Times New Roman", 16, "Regular", '2' },
+    { "Times New Roman", 16, "Regular", '5' },
+    { "Times New Roman", 16, "Regular", '7' },
+    { "Times New Roman", 17, "Italic", '2' },
+    { "Times New Roman", 17, "Italic", '5' },
+    { "Times New Roman", 17, "Italic", '7' },
+    { "Times New Roman", 17, "Regular", '2' },
+    { "Times New Roman", 17, "Regular", '5' },
+    { "Times New Roman", 17, "Regular", '7' },
+  };
+
+
+  /* This fudges distance on 2 to get rid of the vanishing stem issue.     */
+  /* A real solution to this is certainly welcome.                         */
+#define COURIER_NEW_2_HACK_RULES_SIZE  15
+
+  static const SPH_TweakRule  COURIER_NEW_2_HACK_Rules
+                              [COURIER_NEW_2_HACK_RULES_SIZE] =
+  {
+    { "Courier New", 10, "Regular", '2' },
+    { "Courier New", 11, "Regular", '2' },
+    { "Courier New", 12, "Regular", '2' },
+    { "Courier New", 13, "Regular", '2' },
+    { "Courier New", 14, "Regular", '2' },
+    { "Courier New", 15, "Regular", '2' },
+    { "Courier New", 16, "Regular", '2' },
+    { "Courier New", 17, "Regular", '2' },
+    { "Courier New", 18, "Regular", '2' },
+    { "Courier New", 19, "Regular", '2' },
+    { "Courier New", 20, "Regular", '2' },
+    { "Courier New", 21, "Regular", '2' },
+    { "Courier New", 22, "Regular", '2' },
+    { "Courier New", 23, "Regular", '2' },
+    { "Courier New", 24, "Regular", '2' },
+  };
+
+
+#ifndef FORCE_NATURAL_WIDTHS
+
+  /* Use compatible widths with these glyphs.  Compatible widths is always */
+  /* on when doing B/W TrueType instructing, but is used selectively here, */
+  /* typically on glyphs with 3 or more vertical stems.                    */
+#define COMPATIBLE_WIDTHS_RULES_SIZE  38
+
+  static const SPH_TweakRule  COMPATIBLE_WIDTHS_Rules
+                              [COMPATIBLE_WIDTHS_RULES_SIZE] =
+  {
+    { "Arial Unicode MS", 12, "Regular Class", 'm' },
+    { "Arial Unicode MS", 14, "Regular Class", 'm' },
+    /* Cyrillic small letter sha */
+    { "Arial", 10, "Regular Class", 0x448 },
+    { "Arial", 11, "Regular Class", 'm' },
+    { "Arial", 12, "Regular Class", 'm' },
+    /* Cyrillic small letter sha */
+    { "Arial", 12, "Regular Class", 0x448 },
+    { "Arial", 13, "Regular Class", 0x448 },
+    { "Arial", 14, "Regular Class", 'm' },
+    /* Cyrillic small letter sha */
+    { "Arial", 14, "Regular Class", 0x448 },
+    { "Arial", 15, "Regular Class", 0x448 },
+    { "Arial", 17, "Regular Class", 'm' },
+    { "DejaVu Sans", 15, "Regular Class", 0 },
+    { "Microsoft Sans Serif", 11, "Regular Class", 0 },
+    { "Microsoft Sans Serif", 12, "Regular Class", 0 },
+    { "Segoe UI", 11, "Regular Class", 0 },
+    { "Monaco", 0, "Regular Class", 0 },
+    { "Segoe UI", 12, "Regular Class", 'm' },
+    { "Segoe UI", 14, "Regular Class", 'm' },
+    { "Tahoma", 11, "Regular Class", 0 },
+    { "Times New Roman", 16, "Regular Class", 'c' },
+    { "Times New Roman", 16, "Regular Class", 'm' },
+    { "Times New Roman", 16, "Regular Class", 'o' },
+    { "Times New Roman", 16, "Regular Class", 'w' },
+    { "Trebuchet MS", 11, "Regular Class", 0 },
+    { "Trebuchet MS", 12, "Regular Class", 0 },
+    { "Trebuchet MS", 14, "Regular Class", 0 },
+    { "Trebuchet MS", 15, "Regular Class", 0 },
+    { "Ubuntu", 12, "Regular Class", 'm' },
+    /* Cyrillic small letter sha */
+    { "Verdana", 10, "Regular Class", 0x448 },
+    { "Verdana", 11, "Regular Class", 0x448 },
+    { "Verdana and Clones", 12, "Regular Class", 'i' },
+    { "Verdana and Clones", 12, "Regular Class", 'j' },
+    { "Verdana and Clones", 12, "Regular Class", 'l' },
+    { "Verdana and Clones", 12, "Regular Class", 'm' },
+    { "Verdana and Clones", 13, "Regular Class", 'i' },
+    { "Verdana and Clones", 13, "Regular Class", 'j' },
+    { "Verdana and Clones", 13, "Regular Class", 'l' },
+    { "Verdana and Clones", 14, "Regular Class", 'm' },
+  };
+
+
+  /* Scaling slightly in the x-direction prior to hinting results in       */
+  /* more visually pleasing glyphs in certain cases.                       */
+  /* This sometimes needs to be coordinated with compatible width rules.   */
+  /* A value of 1000 corresponds to a scaled value of 1.0.                 */
+
+#define X_SCALING_RULES_SIZE  50
+
+  static const SPH_ScaleRule  X_SCALING_Rules[X_SCALING_RULES_SIZE] =
+  {
+    { "DejaVu Sans", 12, "Regular Class", 'm', 950 },
+    { "Verdana and Clones", 12, "Regular Class", 'a', 1100 },
+    { "Verdana and Clones", 13, "Regular Class", 'a', 1050 },
+    { "Arial", 11, "Regular Class", 'm', 975 },
+    { "Arial", 12, "Regular Class", 'm', 1050 },
+    /* Cyrillic small letter el */
+    { "Arial", 13, "Regular Class", 0x43B, 950 },
+    { "Arial", 13, "Regular Class", 'o', 950 },
+    { "Arial", 13, "Regular Class", 'e', 950 },
+    { "Arial", 14, "Regular Class", 'm', 950 },
+    /* Cyrillic small letter el */
+    { "Arial", 15, "Regular Class", 0x43B, 925 },
+    { "Bitstream Vera Sans", 10, "Regular/Italic Class", 0, 1100 },
+    { "Bitstream Vera Sans", 12, "Regular/Italic Class", 0, 1050 },
+    { "Bitstream Vera Sans", 16, "Regular Class", 0, 1050 },
+    { "Bitstream Vera Sans", 9, "Regular/Italic Class", 0, 1050 },
+    { "DejaVu Sans", 12, "Regular Class", 'l', 975 },
+    { "DejaVu Sans", 12, "Regular Class", 'i', 975 },
+    { "DejaVu Sans", 12, "Regular Class", 'j', 975 },
+    { "DejaVu Sans", 13, "Regular Class", 'l', 950 },
+    { "DejaVu Sans", 13, "Regular Class", 'i', 950 },
+    { "DejaVu Sans", 13, "Regular Class", 'j', 950 },
+    { "DejaVu Sans", 10, "Regular/Italic Class", 0, 1100 },
+    { "DejaVu Sans", 12, "Regular/Italic Class", 0, 1050 },
+    { "Georgia", 10, "", 0, 1050 },
+    { "Georgia", 11, "", 0, 1100 },
+    { "Georgia", 12, "", 0, 1025 },
+    { "Georgia", 13, "", 0, 1050 },
+    { "Georgia", 16, "", 0, 1050 },
+    { "Georgia", 17, "", 0, 1030 },
+    { "Liberation Sans", 12, "Regular Class", 'm', 1100 },
+    { "Lucida Grande", 11, "Regular Class", 'm', 1100 },
+    { "Microsoft Sans Serif", 11, "Regular Class", 'm', 950 },
+    { "Microsoft Sans Serif", 12, "Regular Class", 'm', 1050 },
+    { "Segoe UI", 12, "Regular Class", 'H', 1050 },
+    { "Segoe UI", 12, "Regular Class", 'm', 1050 },
+    { "Segoe UI", 14, "Regular Class", 'm', 1050 },
+    { "Tahoma", 11, "Regular Class", 'i', 975 },
+    { "Tahoma", 11, "Regular Class", 'l', 975 },
+    { "Tahoma", 11, "Regular Class", 'j', 900 },
+    { "Tahoma", 11, "Regular Class", 'm', 918 },
+    { "Verdana", 10, "Regular/Italic Class", 0, 1100 },
+    { "Verdana", 12, "Regular Class", 'm', 975 },
+    { "Verdana", 12, "Regular/Italic Class", 0, 1050 },
+    { "Verdana", 13, "Regular/Italic Class", 'i', 950 },
+    { "Verdana", 13, "Regular/Italic Class", 'j', 950 },
+    { "Verdana", 13, "Regular/Italic Class", 'l', 950 },
+    { "Verdana", 16, "Regular Class", 0, 1050 },
+    { "Verdana", 9, "Regular/Italic Class", 0, 1050 },
+    { "Times New Roman", 16, "Regular Class", 'm', 918 },
+    { "Trebuchet MS", 11, "Regular Class", 'm', 800 },
+    { "Trebuchet MS", 12, "Regular Class", 'm', 800 },
+  };
+
+#else
+
+#define COMPATIBLE_WIDTHS_RULES_SIZE  1
+
+  static const SPH_TweakRule  COMPATIBLE_WIDTHS_Rules
+                              [COMPATIBLE_WIDTHS_RULES_SIZE] =
+  {
+    { "-", 0, "", 0 },
+  };
+
+
+#define X_SCALING_RULES_SIZE  1
+
+  static const SPH_ScaleRule  X_SCALING_Rules
+                              [X_SCALING_RULES_SIZE] =
+  {
+    { "-", 0, "", 0, 1000 },
+  };
+
+#endif /* FORCE_NATURAL_WIDTHS */
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  is_member_of_family_class( const FT_String*  detected_font_name,
+                             const FT_String*  rule_font_name )
+  {
+    FT_UInt  i, j;
+
+
+    /* Does font name match rule family? */
+    if ( strcmp( detected_font_name, rule_font_name ) == 0 )
+      return TRUE;
+
+    /* Is font name a wildcard ""? */
+    if ( strcmp( rule_font_name, "" ) == 0 )
+      return TRUE;
+
+    /* Is font name contained in a class list? */
+    for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ )
+    {
+      if ( strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 )
+      {
+        for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
+        {
+          if ( strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 )
+            continue;
+          if ( strcmp( FAMILY_CLASS_Rules[i].member[j],
+                       detected_font_name ) == 0 )
+            return TRUE;
+        }
+      }
+    }
+
+    return FALSE;
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  is_member_of_style_class( const FT_String*  detected_font_style,
+                            const FT_String*  rule_font_style )
+  {
+    FT_UInt  i, j;
+
+
+    /* Does font style match rule style? */
+    if ( strcmp( detected_font_style, rule_font_style ) == 0 )
+      return TRUE;
+
+    /* Is font style a wildcard ""? */
+    if ( strcmp( rule_font_style, "" ) == 0 )
+      return TRUE;
+
+    /* Is font style contained in a class list? */
+    for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ )
+    {
+      if ( strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 )
+      {
+        for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
+        {
+          if ( strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 )
+            continue;
+          if ( strcmp( STYLE_CLASS_Rules[i].member[j],
+                       detected_font_style ) == 0 )
+            return TRUE;
+        }
+      }
+    }
+
+    return FALSE;
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  sph_test_tweak( TT_Face               face,
+                  const FT_String*      family,
+                  FT_UInt               ppem,
+                  const FT_String*      style,
+                  FT_UInt               glyph_index,
+                  const SPH_TweakRule*  rule,
+                  FT_UInt               num_rules )
+  {
+    FT_UInt  i;
+
+
+    /* rule checks may be able to be optimized further */
+    for ( i = 0; i < num_rules; i++ )
+    {
+      if ( family                                                   &&
+           ( is_member_of_family_class ( family, rule[i].family ) ) )
+        if ( rule[i].ppem == 0    ||
+             rule[i].ppem == ppem )
+          if ( style                                             &&
+               is_member_of_style_class ( style, rule[i].style ) )
+            if ( rule[i].glyph == 0                                ||
+                 FT_Get_Char_Index( (FT_Face)face,
+                                    rule[i].glyph ) == glyph_index )
+        return TRUE;
+    }
+
+    return FALSE;
+  }
+
+
+  static FT_UInt
+  scale_test_tweak( TT_Face               face,
+                    const FT_String*      family,
+                    FT_UInt               ppem,
+                    const FT_String*      style,
+                    FT_UInt               glyph_index,
+                    const SPH_ScaleRule*  rule,
+                    FT_UInt               num_rules )
+  {
+    FT_UInt  i;
+
+
+    /* rule checks may be able to be optimized further */
+    for ( i = 0; i < num_rules; i++ )
+    {
+      if ( family                                                   &&
+           ( is_member_of_family_class ( family, rule[i].family ) ) )
+        if ( rule[i].ppem == 0    ||
+             rule[i].ppem == ppem )
+          if ( style                                            &&
+               is_member_of_style_class( style, rule[i].style ) )
+            if ( rule[i].glyph == 0                                ||
+                 FT_Get_Char_Index( (FT_Face)face,
+                                    rule[i].glyph ) == glyph_index )
+        return rule[i].scale;
+    }
+
+    return 1000;
+  }
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  sph_test_tweak_x_scaling( TT_Face           face,
+                            const FT_String*  family,
+                            FT_UInt           ppem,
+                            const FT_String*  style,
+                            FT_UInt           glyph_index )
+  {
+    return scale_test_tweak( face, family, ppem, style, glyph_index,
+                             X_SCALING_Rules, X_SCALING_RULES_SIZE );
+  }
+
+
+#define TWEAK_RULES( x )                                       \
+  if ( sph_test_tweak( face, family, ppem, style, glyph_index, \
+                       x##_Rules, x##_RULES_SIZE ) )           \
+    loader->exec->sph_tweak_flags |= SPH_TWEAK_##x;
+
+#define TWEAK_RULES_EXCEPTIONS( x )                                        \
+  if ( sph_test_tweak( face, family, ppem, style, glyph_index,             \
+                       x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \
+    loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x;
+
+
+  FT_LOCAL_DEF( void )
+  sph_set_tweaks( TT_Loader  loader,
+                  FT_UInt    glyph_index )
+  {
+    TT_Face     face   = (TT_Face)loader->face;
+    FT_String*  family = face->root.family_name;
+    int         ppem   = loader->size->metrics.x_ppem;
+    FT_String*  style  = face->root.style_name;
+
+
+    /* don't apply rules if style isn't set */
+    if ( !face->root.style_name )
+      return;
+
+#ifdef SPH_DEBUG_MORE_VERBOSE
+    printf( "%s,%d,%s,%c=%d ",
+            family, ppem, style, glyph_index, glyph_index );
+#endif
+
+    TWEAK_RULES( PIXEL_HINTING );
+
+    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_PIXEL_HINTING )
+    {
+      loader->exec->ignore_x_mode = FALSE;
+      return;
+    }
+
+    TWEAK_RULES( ALLOW_X_DMOVE );
+    TWEAK_RULES( ALWAYS_DO_DELTAP );
+    TWEAK_RULES( ALWAYS_SKIP_DELTAP );
+    TWEAK_RULES( DEEMBOLDEN );
+    TWEAK_RULES( DO_SHPIX );
+    TWEAK_RULES( EMBOLDEN );
+    TWEAK_RULES( MIAP_HACK );
+    TWEAK_RULES( NORMAL_ROUND );
+    TWEAK_RULES( NO_ALIGNRP_AFTER_IUP );
+    TWEAK_RULES( NO_CALL_AFTER_IUP );
+    TWEAK_RULES( NO_DELTAP_AFTER_IUP );
+    TWEAK_RULES( RASTERIZER_35 );
+    TWEAK_RULES( SKIP_IUP );
+
+    TWEAK_RULES( SKIP_OFFPIXEL_Y_MOVES );
+    TWEAK_RULES_EXCEPTIONS( SKIP_OFFPIXEL_Y_MOVES );
+
+    TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES_DELTAP );
+
+    TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES );
+    TWEAK_RULES_EXCEPTIONS( SKIP_NONPIXEL_Y_MOVES );
+
+    TWEAK_RULES( ROUND_NONPIXEL_Y_MOVES );
+    TWEAK_RULES_EXCEPTIONS( ROUND_NONPIXEL_Y_MOVES );
+
+    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
+    {
+      if ( loader->exec->rasterizer_version != TT_INTERPRETER_VERSION_35 )
+      {
+        loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
+        loader->exec->size->cvt_ready    = FALSE;
+
+        tt_size_ready_bytecode(
+          loader->exec->size,
+          FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
+      }
+      else
+        loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
+    }
+    else
+    {
+      if ( loader->exec->rasterizer_version  !=
+           SPH_OPTION_SET_RASTERIZER_VERSION )
+      {
+        loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
+        loader->exec->size->cvt_ready    = FALSE;
+
+        tt_size_ready_bytecode(
+          loader->exec->size,
+          FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
+      }
+      else
+        loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
+    }
+
+    if ( IS_HINTED( loader->load_flags ) )
+    {
+      TWEAK_RULES( TIMES_NEW_ROMAN_HACK );
+      TWEAK_RULES( COURIER_NEW_2_HACK );
+    }
+
+    if ( sph_test_tweak( face, family, ppem, style, glyph_index,
+           COMPATIBILITY_MODE_Rules, COMPATIBILITY_MODE_RULES_SIZE ) )
+      loader->exec->face->sph_compatibility_mode = TRUE;
+
+
+    if ( IS_HINTED( loader->load_flags ) )
+    {
+      if ( sph_test_tweak( face, family, ppem, style, glyph_index,
+             COMPATIBLE_WIDTHS_Rules, COMPATIBLE_WIDTHS_RULES_SIZE ) )
+        loader->exec->compatible_widths |= TRUE;
+    }
+  }
+
+#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+  /* ANSI C doesn't like empty source files */
+  typedef int  _tt_subpix_dummy;
+
+#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.h
new file mode 100644
index 0000000..b536c98
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.h
@@ -0,0 +1,110 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttsubpix.h                                                             */
+/*                                                                         */
+/*    TrueType Subpixel Hinting.                                           */
+/*                                                                         */
+/*  Copyright 2010-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTSUBPIX_H__
+#define __TTSUBPIX_H__
+
+#include "../../include/ft2build.h"
+#include "ttobjs.h"
+#include "ttinterp.h"
+
+
+FT_BEGIN_HEADER
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ID flags to identify special functions at FDEF and runtime.           */
+  /*                                                                       */
+  /*                                                                       */
+#define SPH_FDEF_INLINE_DELTA_1       0x0000001
+#define SPH_FDEF_INLINE_DELTA_2       0x0000002
+#define SPH_FDEF_DIAGONAL_STROKE      0x0000004
+#define SPH_FDEF_VACUFORM_ROUND_1     0x0000008
+#define SPH_FDEF_TTFAUTOHINT_1        0x0000010
+#define SPH_FDEF_SPACING_1            0x0000020
+#define SPH_FDEF_SPACING_2            0x0000040
+#define SPH_FDEF_TYPEMAN_STROKES      0x0000080
+#define SPH_FDEF_TYPEMAN_DIAGENDCTRL  0x0000100
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Tweak flags that are set for each glyph by the below rules.           */
+  /*                                                                       */
+  /*                                                                       */
+#define SPH_TWEAK_ALLOW_X_DMOVE                   0x0000001
+#define SPH_TWEAK_ALWAYS_DO_DELTAP                0x0000002
+#define SPH_TWEAK_ALWAYS_SKIP_DELTAP              0x0000004
+#define SPH_TWEAK_COURIER_NEW_2_HACK              0x0000008
+#define SPH_TWEAK_DEEMBOLDEN                      0x0000010
+#define SPH_TWEAK_DO_SHPIX                        0x0000020
+#define SPH_TWEAK_EMBOLDEN                        0x0000040
+#define SPH_TWEAK_MIAP_HACK                       0x0000080
+#define SPH_TWEAK_NORMAL_ROUND                    0x0000100
+#define SPH_TWEAK_NO_ALIGNRP_AFTER_IUP            0x0000200
+#define SPH_TWEAK_NO_CALL_AFTER_IUP               0x0000400
+#define SPH_TWEAK_NO_DELTAP_AFTER_IUP             0x0000800
+#define SPH_TWEAK_PIXEL_HINTING                   0x0001000
+#define SPH_TWEAK_RASTERIZER_35                   0x0002000
+#define SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES          0x0004000
+#define SPH_TWEAK_SKIP_IUP                        0x0008000
+#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES           0x0010000
+#define SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES           0x0020000
+#define SPH_TWEAK_TIMES_NEW_ROMAN_HACK            0x0040000
+#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP    0x0080000
+
+
+  FT_LOCAL( FT_Bool )
+  sph_test_tweak( TT_Face               face,
+                  const FT_String*      family,
+                  FT_UInt               ppem,
+                  const FT_String*      style,
+                  FT_UInt               glyph_index,
+                  const SPH_TweakRule*  rule,
+                  FT_UInt               num_rules );
+
+  FT_LOCAL( FT_UInt )
+  sph_test_tweak_x_scaling( TT_Face           face,
+                            const FT_String*  family,
+                            FT_UInt           ppem,
+                            const FT_String*  style,
+                            FT_UInt           glyph_index );
+
+  FT_LOCAL( void )
+  sph_set_tweaks( TT_Loader  loader,
+                  FT_UInt    glyph_index );
+
+
+  /* These macros are defined absent a method for setting them */
+#define SPH_OPTION_BITMAP_WIDTHS           FALSE
+#define SPH_OPTION_SET_SUBPIXEL            TRUE
+#define SPH_OPTION_SET_GRAYSCALE           FALSE
+#define SPH_OPTION_SET_COMPATIBLE_WIDTHS   FALSE
+#define SPH_OPTION_SET_RASTERIZER_VERSION  38
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+FT_END_HEADER
+
+#endif /* __TTSUBPIX_H__ */
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/Jamfile
new file mode 100644
index 0000000..8e366ba
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/type1 Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) type1 ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = t1afm t1driver t1objs t1load t1gload t1parse ;
+  }
+  else
+  {
+    _sources = type1 ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/type1 Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/fxft_type1.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/fxft_type1.c
new file mode 100644
index 0000000..00c85e1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/fxft_type1.c
@@ -0,0 +1,37 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/*                                                                         */
+/*  type1.c                                                                */
+/*                                                                         */
+/*    FreeType Type 1 driver component (body only).                        */
+/*                                                                         */
+/*  Copyright 1996-2001 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "t1parse.c"
+#include "t1load.c"
+#include "t1objs.c"
+#include "t1driver.c"
+#include "t1gload.c"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "t1afm.c"
+#endif
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/module.mk
new file mode 100644
index 0000000..ade0210
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 Type1 module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += TYPE1_DRIVER
+
+define TYPE1_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, t1_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)type1     $(ECHO_DRIVER_DESC)Postscript font files with extension *.pfa or *.pfb$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/rules.mk
new file mode 100644
index 0000000..15087b0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/rules.mk
@@ -0,0 +1,73 @@
+#
+# FreeType 2 Type1 driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# Type1 driver directory
+#
+T1_DIR := $(SRC_DIR)/type1
+
+
+# compilation flags for the driver
+#
+T1_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(T1_DIR))
+
+
+# Type1 driver sources (i.e., C files)
+#
+T1_DRV_SRC := $(T1_DIR)/t1parse.c  \
+              $(T1_DIR)/t1load.c   \
+              $(T1_DIR)/t1driver.c \
+              $(T1_DIR)/t1afm.c    \
+              $(T1_DIR)/t1gload.c  \
+              $(T1_DIR)/t1objs.c
+
+# Type1 driver headers
+#
+T1_DRV_H := $(T1_DRV_SRC:%.c=%.h) \
+            $(T1_DIR)/t1tokens.h  \
+            $(T1_DIR)/t1errors.h
+
+
+# Type1 driver object(s)
+#
+#   T1_DRV_OBJ_M is used during `multi' builds
+#   T1_DRV_OBJ_S is used during `single' builds
+#
+T1_DRV_OBJ_M := $(T1_DRV_SRC:$(T1_DIR)/%.c=$(OBJ_DIR)/%.$O)
+T1_DRV_OBJ_S := $(OBJ_DIR)/type1.$O
+
+# Type1 driver source file for single build
+#
+T1_DRV_SRC_S := $(T1_DIR)/type1.c
+
+
+# Type1 driver - single object
+#
+$(T1_DRV_OBJ_S): $(T1_DRV_SRC_S) $(T1_DRV_SRC) $(FREETYPE_H) $(T1_DRV_H)
+	$(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T1_DRV_SRC_S))
+
+
+# Type1 driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(T1_DIR)/%.c $(FREETYPE_H) $(T1_DRV_H)
+	$(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(T1_DRV_OBJ_S)
+DRV_OBJS_M += $(T1_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.c
new file mode 100644
index 0000000..b592255
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.c
@@ -0,0 +1,396 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1afm.c                                                                */
+/*                                                                         */
+/*    AFM support for Type 1 fonts (body).                                 */
+/*                                                                         */
+/*  Copyright 1996-2011, 2013 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "t1afm.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "t1errors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1afm
+
+
+  FT_LOCAL_DEF( void )
+  T1_Done_Metrics( FT_Memory     memory,
+                   AFM_FontInfo  fi )
+  {
+    FT_FREE( fi->KernPairs );
+    fi->NumKernPair = 0;
+
+    FT_FREE( fi->TrackKerns );
+    fi->NumTrackKern = 0;
+
+    FT_FREE( fi );
+  }
+
+
+  /* read a glyph name and return the equivalent glyph index */
+  static FT_Int
+  t1_get_index( const char*  name,
+                FT_Offset    len,
+                void*        user_data )
+  {
+    T1_Font  type1 = (T1_Font)user_data;
+    FT_Int   n;
+
+
+    /* PS string/name length must be < 16-bit */
+    if ( len > 0xFFFFU )
+      return 0;
+
+    for ( n = 0; n < type1->num_glyphs; n++ )
+    {
+      char*  gname = (char*)type1->glyph_names[n];
+
+
+      if ( gname && gname[0] == name[0]        &&
+           ft_strlen( gname ) == len           &&
+           ft_strncmp( gname, name, len ) == 0 )
+        return n;
+    }
+
+    return 0;
+  }
+
+
+#undef  KERN_INDEX
+#define KERN_INDEX( g1, g2 )  ( ( (FT_ULong)(g1) << 16 ) | (g2) )
+
+
+  /* compare two kerning pairs */
+  FT_CALLBACK_DEF( int )
+  compare_kern_pairs( const void*  a,
+                      const void*  b )
+  {
+    AFM_KernPair  pair1 = (AFM_KernPair)a;
+    AFM_KernPair  pair2 = (AFM_KernPair)b;
+
+    FT_ULong  index1 = KERN_INDEX( pair1->index1, pair1->index2 );
+    FT_ULong  index2 = KERN_INDEX( pair2->index1, pair2->index2 );
+
+
+    if ( index1 > index2 )
+      return 1;
+    else if ( index1 < index2 )
+      return -1;
+    else
+      return 0;
+  }
+
+
+  /* parse a PFM file -- for now, only read the kerning pairs */
+  static FT_Error
+  T1_Read_PFM( FT_Face       t1_face,
+               FT_Stream     stream,
+               AFM_FontInfo  fi )
+  {
+    FT_Error      error  = FT_Err_Ok;
+    FT_Memory     memory = stream->memory;
+    FT_Byte*      start;
+    FT_Byte*      limit;
+    FT_Byte*      p;
+    AFM_KernPair  kp;
+    FT_Int        width_table_length;
+    FT_CharMap    oldcharmap;
+    FT_CharMap    charmap;
+    FT_Int        n;
+
+
+    start = (FT_Byte*)stream->cursor;
+    limit = (FT_Byte*)stream->limit;
+
+    /* Figure out how long the width table is.          */
+    /* This info is a little-endian short at offset 99. */
+    p = start + 99;
+    if ( p + 2 > limit )
+    {
+      error = FT_THROW( Unknown_File_Format );
+      goto Exit;
+    }
+    width_table_length = FT_PEEK_USHORT_LE( p );
+
+    p += 18 + width_table_length;
+    if ( p + 0x12 > limit || FT_PEEK_USHORT_LE( p ) < 0x12 )
+      /* extension table is probably optional */
+      goto Exit;
+
+    /* Kerning offset is 14 bytes from start of extensions table. */
+    p += 14;
+    p = start + FT_PEEK_ULONG_LE( p );
+
+    if ( p == start )
+      /* zero offset means no table */
+      goto Exit;
+
+    if ( p + 2 > limit )
+    {
+      error = FT_THROW( Unknown_File_Format );
+      goto Exit;
+    }
+
+    fi->NumKernPair = FT_PEEK_USHORT_LE( p );
+    p += 2;
+    if ( p + 4 * fi->NumKernPair > limit )
+    {
+      error = FT_THROW( Unknown_File_Format );
+      goto Exit;
+    }
+
+    /* Actually, kerning pairs are simply optional! */
+    if ( fi->NumKernPair == 0 )
+      goto Exit;
+
+    /* allocate the pairs */
+    if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )
+      goto Exit;
+
+    /* now, read each kern pair */
+    kp             = fi->KernPairs;
+    limit          = p + 4 * fi->NumKernPair;
+
+    /* PFM kerning data are stored by encoding rather than glyph index, */
+    /* so find the PostScript charmap of this font and install it       */
+    /* temporarily.  If we find no PostScript charmap, then just use    */
+    /* the default and hope it is the right one.                        */
+    oldcharmap = t1_face->charmap;
+    charmap    = NULL;
+
+    for ( n = 0; n < t1_face->num_charmaps; n++ )
+    {
+      charmap = t1_face->charmaps[n];
+      /* check against PostScript pseudo platform */
+      if ( charmap->platform_id == 7 )
+      {
+        error = FT_Set_Charmap( t1_face, charmap );
+        if ( error )
+          goto Exit;
+        break;
+      }
+    }
+
+    /* Kerning info is stored as:             */
+    /*                                        */
+    /*   encoding of first glyph (1 byte)     */
+    /*   encoding of second glyph (1 byte)    */
+    /*   offset (little-endian short)         */
+    for ( ; p < limit ; p += 4 )
+    {
+      kp->index1 = FT_Get_Char_Index( t1_face, p[0] );
+      kp->index2 = FT_Get_Char_Index( t1_face, p[1] );
+
+      kp->x = (FT_Int)FT_PEEK_SHORT_LE(p + 2);
+      kp->y = 0;
+
+      kp++;
+    }
+
+    if ( oldcharmap != NULL )
+      error = FT_Set_Charmap( t1_face, oldcharmap );
+    if ( error )
+      goto Exit;
+
+    /* now, sort the kern pairs according to their glyph indices */
+    ft_qsort( fi->KernPairs, fi->NumKernPair, sizeof ( AFM_KernPairRec ),
+              compare_kern_pairs );
+
+  Exit:
+    if ( error )
+    {
+      FT_FREE( fi->KernPairs );
+      fi->NumKernPair = 0;
+    }
+
+    return error;
+  }
+
+
+  /* parse a metrics file -- either AFM or PFM depending on what */
+  /* it turns out to be                                          */
+  FT_LOCAL_DEF( FT_Error )
+  T1_Read_Metrics( FT_Face    t1_face,
+                   FT_Stream  stream )
+  {
+    PSAux_Service  psaux;
+    FT_Memory      memory  = stream->memory;
+    AFM_ParserRec  parser;
+    AFM_FontInfo   fi      = NULL;
+    FT_Error       error   = FT_ERR( Unknown_File_Format );
+    T1_Font        t1_font = &( (T1_Face)t1_face )->type1;
+
+
+    if ( FT_NEW( fi )                   ||
+         FT_FRAME_ENTER( stream->size ) )
+      goto Exit;
+
+    fi->FontBBox  = t1_font->font_bbox;
+    fi->Ascender  = t1_font->font_bbox.yMax;
+    fi->Descender = t1_font->font_bbox.yMin;
+
+    psaux = (PSAux_Service)( (T1_Face)t1_face )->psaux;
+    if ( psaux->afm_parser_funcs )
+    {
+      error = psaux->afm_parser_funcs->init( &parser,
+                                             stream->memory,
+                                             stream->cursor,
+                                             stream->limit );
+
+      if ( !error )
+      {
+        parser.FontInfo  = fi;
+        parser.get_index = t1_get_index;
+        parser.user_data = t1_font;
+
+        error = psaux->afm_parser_funcs->parse( &parser );
+        psaux->afm_parser_funcs->done( &parser );
+      }
+    }
+
+    if ( FT_ERR_EQ( error, Unknown_File_Format ) )
+    {
+      FT_Byte*  start = stream->cursor;
+
+
+      /* MS Windows allows versions up to 0x3FF without complaining */
+      if ( stream->size > 6                              &&
+           start[1] < 4                                  &&
+           FT_PEEK_ULONG_LE( start + 2 ) == stream->size )
+        error = T1_Read_PFM( t1_face, stream, fi );
+    }
+
+    if ( !error )
+    {
+      t1_font->font_bbox = fi->FontBBox;
+
+      t1_face->bbox.xMin =   fi->FontBBox.xMin            >> 16;
+      t1_face->bbox.yMin =   fi->FontBBox.yMin            >> 16;
+      /* no `U' suffix here to 0xFFFF! */
+      t1_face->bbox.xMax = ( fi->FontBBox.xMax + 0xFFFF ) >> 16;
+      t1_face->bbox.yMax = ( fi->FontBBox.yMax + 0xFFFF ) >> 16;
+
+      /* no `U' suffix here to 0x8000! */
+      t1_face->ascender  = (FT_Short)( ( fi->Ascender  + 0x8000 ) >> 16 );
+      t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000 ) >> 16 );
+
+      if ( fi->NumKernPair )
+      {
+        t1_face->face_flags |= FT_FACE_FLAG_KERNING;
+        ( (T1_Face)t1_face )->afm_data = fi;
+        fi = NULL;
+      }
+    }
+
+    FT_FRAME_EXIT();
+
+  Exit:
+    if ( fi != NULL )
+      T1_Done_Metrics( memory, fi );
+
+    return error;
+  }
+
+
+  /* find the kerning for a given glyph pair */
+  FT_LOCAL_DEF( void )
+  T1_Get_Kerning( AFM_FontInfo  fi,
+                  FT_UInt       glyph1,
+                  FT_UInt       glyph2,
+                  FT_Vector*    kerning )
+  {
+    AFM_KernPair  min, mid, max;
+    FT_ULong      idx = KERN_INDEX( glyph1, glyph2 );
+
+
+    /* simple binary search */
+    min = fi->KernPairs;
+    max = min + fi->NumKernPair - 1;
+
+    while ( min <= max )
+    {
+      FT_ULong  midi;
+
+
+      mid  = min + ( max - min ) / 2;
+      midi = KERN_INDEX( mid->index1, mid->index2 );
+
+      if ( midi == idx )
+      {
+        kerning->x = mid->x;
+        kerning->y = mid->y;
+
+        return;
+      }
+
+      if ( midi < idx )
+        min = mid + 1;
+      else
+        max = mid - 1;
+    }
+
+    kerning->x = 0;
+    kerning->y = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_Track_Kerning( FT_Face    face,
+                        FT_Fixed   ptsize,
+                        FT_Int     degree,
+                        FT_Fixed*  kerning )
+  {
+    AFM_FontInfo  fi = (AFM_FontInfo)( (T1_Face)face )->afm_data;
+    FT_Int        i;
+
+
+    if ( !fi )
+      return FT_THROW( Invalid_Argument );
+
+    for ( i = 0; i < fi->NumTrackKern; i++ )
+    {
+      AFM_TrackKern  tk = fi->TrackKerns + i;
+
+
+      if ( tk->degree != degree )
+        continue;
+
+      if ( ptsize < tk->min_ptsize )
+        *kerning = tk->min_kern;
+      else if ( ptsize > tk->max_ptsize )
+        *kerning = tk->max_kern;
+      else
+      {
+        *kerning = FT_MulDiv( ptsize - tk->min_ptsize,
+                              tk->max_kern - tk->min_kern,
+                              tk->max_ptsize - tk->min_ptsize ) +
+                   tk->min_kern;
+      }
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.h
new file mode 100644
index 0000000..60c3aa4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.h
@@ -0,0 +1,54 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1afm.h                                                                */
+/*                                                                         */
+/*    AFM support for Type 1 fonts (specification).                        */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2006 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1AFM_H__
+#define __T1AFM_H__
+
+#include "../../include/ft2build.h"
+#include "t1objs.h"
+#include "../../include/freetype/internal/t1types.h"
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  T1_Read_Metrics( FT_Face    face,
+                   FT_Stream  stream );
+
+  FT_LOCAL( void )
+  T1_Done_Metrics( FT_Memory     memory,
+                   AFM_FontInfo  fi );
+
+  FT_LOCAL( void )
+  T1_Get_Kerning( AFM_FontInfo  fi,
+                  FT_UInt       glyph1,
+                  FT_UInt       glyph2,
+                  FT_Vector*    kerning );
+
+  FT_LOCAL( FT_Error )
+  T1_Get_Track_Kerning( FT_Face    face,
+                        FT_Fixed   ptsize,
+                        FT_Int     degree,
+                        FT_Fixed*  kerning );
+
+FT_END_HEADER
+
+#endif /* __T1AFM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.c
new file mode 100644
index 0000000..8885862
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.c
@@ -0,0 +1,726 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1driver.c                                                             */
+/*                                                                         */
+/*    Type 1 driver interface (body).                                      */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006, 2007, 2009, 2011, 2013 by                   */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "t1driver.h"
+#include "t1gload.h"
+#include "t1load.h"
+
+#include "t1errors.h"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "t1afm.h"
+#endif
+
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+#include "../../include/freetype/internal/services/svmm.h"
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svxf86nm.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+#include "../../include/freetype/internal/services/svkern.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1driver
+
+ /*
+  *  GLYPH DICT SERVICE
+  *
+  */
+
+  static FT_Error
+  t1_get_glyph_name( T1_Face     face,
+                     FT_UInt     glyph_index,
+                     FT_Pointer  buffer,
+                     FT_UInt     buffer_max )
+  {
+    FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_UInt
+  t1_get_name_index( T1_Face     face,
+                     FT_String*  glyph_name )
+  {
+    FT_Int  i;
+
+
+    for ( i = 0; i < face->type1.num_glyphs; i++ )
+    {
+      FT_String*  gname = face->type1.glyph_names[i];
+
+
+      if ( !ft_strcmp( glyph_name, gname ) )
+        return (FT_UInt)i;
+    }
+
+    return 0;
+  }
+
+
+  static const FT_Service_GlyphDictRec  t1_service_glyph_dict =
+  {
+    (FT_GlyphDict_GetNameFunc)  t1_get_glyph_name,
+    (FT_GlyphDict_NameIndexFunc)t1_get_name_index
+  };
+
+
+  /*
+   *  POSTSCRIPT NAME SERVICE
+   *
+   */
+
+  static const char*
+  t1_get_ps_name( T1_Face  face )
+  {
+    return (const char*) face->type1.font_name;
+  }
+
+
+  static const FT_Service_PsFontNameRec  t1_service_ps_name =
+  {
+    (FT_PsName_GetFunc)t1_get_ps_name
+  };
+
+
+  /*
+   *  MULTIPLE MASTERS SERVICE
+   *
+   */
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+  static const FT_Service_MultiMastersRec  t1_service_multi_masters =
+  {
+    (FT_Get_MM_Func)        T1_Get_Multi_Master,
+    (FT_Set_MM_Design_Func) T1_Set_MM_Design,
+    (FT_Set_MM_Blend_Func)  T1_Set_MM_Blend,
+    (FT_Get_MM_Var_Func)    T1_Get_MM_Var,
+    (FT_Set_Var_Design_Func)T1_Set_Var_Design
+  };
+#endif
+
+
+  /*
+   *  POSTSCRIPT INFO SERVICE
+   *
+   */
+
+  static FT_Error
+  t1_ps_get_font_info( FT_Face          face,
+                       PS_FontInfoRec*  afont_info )
+  {
+    *afont_info = ((T1_Face)face)->type1.font_info;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Error
+  t1_ps_get_font_extra( FT_Face           face,
+                        PS_FontExtraRec*  afont_extra )
+  {
+    *afont_extra = ((T1_Face)face)->type1.font_extra;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Int
+  t1_ps_has_glyph_names( FT_Face  face )
+  {
+    FT_UNUSED( face );
+
+    return 1;
+  }
+
+
+  static FT_Error
+  t1_ps_get_font_private( FT_Face         face,
+                          PS_PrivateRec*  afont_private )
+  {
+    *afont_private = ((T1_Face)face)->type1.private_dict;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Long
+  t1_ps_get_font_value( FT_Face       face,
+                        PS_Dict_Keys  key,
+                        FT_UInt       idx,
+                        void         *value,
+                        FT_Long       value_len )
+  {
+    FT_Long  retval = -1;
+    T1_Face  t1face = (T1_Face)face;
+    T1_Font  type1  = &t1face->type1;
+
+
+    switch ( key )
+    {
+    case PS_DICT_FONT_TYPE:
+      retval = sizeof ( type1->font_type );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->font_type;
+      break;
+
+    case PS_DICT_FONT_MATRIX:
+      if ( idx < sizeof ( type1->font_matrix ) /
+                   sizeof ( type1->font_matrix.xx ) )
+      {
+        FT_Fixed  val = 0;
+
+
+        retval = sizeof ( val );
+        if ( value && value_len >= retval )
+        {
+          switch ( idx )
+          {
+          case 0:
+            val = type1->font_matrix.xx;
+            break;
+          case 1:
+            val = type1->font_matrix.xy;
+            break;
+          case 2:
+            val = type1->font_matrix.yx;
+            break;
+          case 3:
+            val = type1->font_matrix.yy;
+            break;
+          }
+          *((FT_Fixed *)value) = val;
+        }
+      }
+      break;
+
+    case PS_DICT_FONT_BBOX:
+      if ( idx < sizeof ( type1->font_bbox ) /
+                   sizeof ( type1->font_bbox.xMin ) )
+      {
+        FT_Fixed val = 0;
+
+
+        retval = sizeof ( val );
+        if ( value && value_len >= retval )
+        {
+          switch ( idx )
+          {
+          case 0:
+            val = type1->font_bbox.xMin;
+            break;
+          case 1:
+            val = type1->font_bbox.yMin;
+            break;
+          case 2:
+            val = type1->font_bbox.xMax;
+            break;
+          case 3:
+            val = type1->font_bbox.yMax;
+            break;
+          }
+          *((FT_Fixed *)value) = val;
+        }
+      }
+      break;
+
+    case PS_DICT_PAINT_TYPE:
+      retval = sizeof ( type1->paint_type );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->paint_type;
+      break;
+
+    case PS_DICT_FONT_NAME:
+      retval = (FT_Long)( ft_strlen( type1->font_name ) + 1 );
+      if ( value && value_len >= retval )
+        ft_memcpy( value, (void *)( type1->font_name ), retval );
+      break;
+
+    case PS_DICT_UNIQUE_ID:
+      retval = sizeof ( type1->private_dict.unique_id );
+      if ( value && value_len >= retval )
+        *((FT_Int *)value) = type1->private_dict.unique_id;
+      break;
+
+    case PS_DICT_NUM_CHAR_STRINGS:
+      retval = sizeof ( type1->num_glyphs );
+      if ( value && value_len >= retval )
+        *((FT_Int *)value) = type1->num_glyphs;
+      break;
+
+    case PS_DICT_CHAR_STRING_KEY:
+      if ( idx < (FT_UInt)type1->num_glyphs )
+      {
+        retval = (FT_Long)( ft_strlen( type1->glyph_names[idx] ) + 1 );
+        if ( value && value_len >= retval )
+        {
+          ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval );
+          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+        }
+      }
+      break;
+
+    case PS_DICT_CHAR_STRING:
+      if ( idx < (FT_UInt)type1->num_glyphs )
+      {
+        retval = (FT_Long)( type1->charstrings_len[idx] + 1 );
+        if ( value && value_len >= retval )
+        {
+          ft_memcpy( value, (void *)( type1->charstrings[idx] ),
+                     retval - 1 );
+          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+        }
+      }
+      break;
+
+    case PS_DICT_ENCODING_TYPE:
+      retval = sizeof ( type1->encoding_type );
+      if ( value && value_len >= retval )
+        *((T1_EncodingType *)value) = type1->encoding_type;
+      break;
+
+    case PS_DICT_ENCODING_ENTRY:
+      if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY &&
+           idx < (FT_UInt)type1->encoding.num_chars       )
+      {
+        retval = (FT_Long)( ft_strlen( type1->encoding.char_name[idx] ) + 1 );
+        if ( value && value_len >= retval )
+        {
+          ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ),
+                     retval - 1 );
+          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+        }
+      }
+      break;
+
+    case PS_DICT_NUM_SUBRS:
+      retval = sizeof ( type1->num_subrs );
+      if ( value && value_len >= retval )
+        *((FT_Int *)value) = type1->num_subrs;
+      break;
+
+    case PS_DICT_SUBR:
+      if ( idx < (FT_UInt)type1->num_subrs )
+      {
+        retval = (FT_Long)( type1->subrs_len[idx] + 1 );
+        if ( value && value_len >= retval )
+        {
+          ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 );
+          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+        }
+      }
+      break;
+
+    case PS_DICT_STD_HW:
+      retval = sizeof ( type1->private_dict.standard_width[0] );
+      if ( value && value_len >= retval )
+        *((FT_UShort *)value) = type1->private_dict.standard_width[0];
+      break;
+
+    case PS_DICT_STD_VW:
+      retval = sizeof ( type1->private_dict.standard_height[0] );
+      if ( value && value_len >= retval )
+        *((FT_UShort *)value) = type1->private_dict.standard_height[0];
+      break;
+
+    case PS_DICT_NUM_BLUE_VALUES:
+      retval = sizeof ( type1->private_dict.num_blue_values );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->private_dict.num_blue_values;
+      break;
+
+    case PS_DICT_BLUE_VALUE:
+      if ( idx < type1->private_dict.num_blue_values )
+      {
+        retval = sizeof ( type1->private_dict.blue_values[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.blue_values[idx];
+      }
+      break;
+
+    case PS_DICT_BLUE_SCALE:
+      retval = sizeof ( type1->private_dict.blue_scale );
+      if ( value && value_len >= retval )
+        *((FT_Fixed *)value) = type1->private_dict.blue_scale;
+      break;
+
+    case PS_DICT_BLUE_FUZZ:
+      retval = sizeof ( type1->private_dict.blue_fuzz );
+      if ( value && value_len >= retval )
+        *((FT_Int *)value) = type1->private_dict.blue_fuzz;
+      break;
+
+    case PS_DICT_BLUE_SHIFT:
+      retval = sizeof ( type1->private_dict.blue_shift );
+      if ( value && value_len >= retval )
+        *((FT_Int *)value) = type1->private_dict.blue_shift;
+      break;
+
+    case PS_DICT_NUM_OTHER_BLUES:
+      retval = sizeof ( type1->private_dict.num_other_blues );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->private_dict.num_other_blues;
+      break;
+
+    case PS_DICT_OTHER_BLUE:
+      if ( idx < type1->private_dict.num_other_blues )
+      {
+        retval = sizeof ( type1->private_dict.other_blues[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.other_blues[idx];
+      }
+      break;
+
+    case PS_DICT_NUM_FAMILY_BLUES:
+      retval = sizeof ( type1->private_dict.num_family_blues );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->private_dict.num_family_blues;
+      break;
+
+    case PS_DICT_FAMILY_BLUE:
+      if ( idx < type1->private_dict.num_family_blues )
+      {
+        retval = sizeof ( type1->private_dict.family_blues[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.family_blues[idx];
+      }
+      break;
+
+    case PS_DICT_NUM_FAMILY_OTHER_BLUES:
+      retval = sizeof ( type1->private_dict.num_family_other_blues );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->private_dict.num_family_other_blues;
+      break;
+
+    case PS_DICT_FAMILY_OTHER_BLUE:
+      if ( idx < type1->private_dict.num_family_other_blues )
+      {
+        retval = sizeof ( type1->private_dict.family_other_blues[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.family_other_blues[idx];
+      }
+      break;
+
+    case PS_DICT_NUM_STEM_SNAP_H:
+      retval = sizeof ( type1->private_dict.num_snap_widths );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->private_dict.num_snap_widths;
+      break;
+
+    case PS_DICT_STEM_SNAP_H:
+      if ( idx < type1->private_dict.num_snap_widths )
+      {
+        retval = sizeof ( type1->private_dict.snap_widths[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.snap_widths[idx];
+      }
+      break;
+
+    case PS_DICT_NUM_STEM_SNAP_V:
+      retval = sizeof ( type1->private_dict.num_snap_heights );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->private_dict.num_snap_heights;
+      break;
+
+    case PS_DICT_STEM_SNAP_V:
+      if ( idx < type1->private_dict.num_snap_heights )
+      {
+        retval = sizeof ( type1->private_dict.snap_heights[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.snap_heights[idx];
+      }
+      break;
+
+    case PS_DICT_RND_STEM_UP:
+      retval = sizeof ( type1->private_dict.round_stem_up );
+      if ( value && value_len >= retval )
+        *((FT_Bool *)value) = type1->private_dict.round_stem_up;
+      break;
+
+    case PS_DICT_FORCE_BOLD:
+      retval = sizeof ( type1->private_dict.force_bold );
+      if ( value && value_len >= retval )
+        *((FT_Bool *)value) = type1->private_dict.force_bold;
+      break;
+
+    case PS_DICT_MIN_FEATURE:
+      if ( idx < sizeof ( type1->private_dict.min_feature ) /
+                   sizeof ( type1->private_dict.min_feature[0] ) )
+      {
+        retval = sizeof ( type1->private_dict.min_feature[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.min_feature[idx];
+      }
+      break;
+
+    case PS_DICT_LEN_IV:
+      retval = sizeof ( type1->private_dict.lenIV );
+      if ( value && value_len >= retval )
+        *((FT_Int *)value) = type1->private_dict.lenIV;
+      break;
+
+    case PS_DICT_PASSWORD:
+      retval = sizeof ( type1->private_dict.password );
+      if ( value && value_len >= retval )
+        *((FT_Long *)value) = type1->private_dict.password;
+      break;
+
+    case PS_DICT_LANGUAGE_GROUP:
+      retval = sizeof ( type1->private_dict.language_group );
+      if ( value && value_len >= retval )
+        *((FT_Long *)value) = type1->private_dict.language_group;
+      break;
+
+    case PS_DICT_IS_FIXED_PITCH:
+      retval = sizeof ( type1->font_info.is_fixed_pitch );
+      if ( value && value_len >= retval )
+        *((FT_Bool *)value) = type1->font_info.is_fixed_pitch;
+      break;
+
+    case PS_DICT_UNDERLINE_POSITION:
+      retval = sizeof ( type1->font_info.underline_position );
+      if ( value && value_len >= retval )
+        *((FT_Short *)value) = type1->font_info.underline_position;
+      break;
+
+    case PS_DICT_UNDERLINE_THICKNESS:
+      retval = sizeof ( type1->font_info.underline_thickness );
+      if ( value && value_len >= retval )
+        *((FT_UShort *)value) = type1->font_info.underline_thickness;
+      break;
+
+    case PS_DICT_FS_TYPE:
+      retval = sizeof ( type1->font_extra.fs_type );
+      if ( value && value_len >= retval )
+        *((FT_UShort *)value) = type1->font_extra.fs_type;
+      break;
+
+    case PS_DICT_VERSION:
+      retval = (FT_Long)( ft_strlen( type1->font_info.version ) + 1 );
+      if ( value && value_len >= retval )
+        ft_memcpy( value, (void *)( type1->font_info.version ), retval );
+      break;
+
+    case PS_DICT_NOTICE:
+      retval = (FT_Long)( ft_strlen( type1->font_info.notice ) + 1 );
+      if ( value && value_len >= retval )
+        ft_memcpy( value, (void *)( type1->font_info.notice ), retval );
+      break;
+
+    case PS_DICT_FULL_NAME:
+      retval = (FT_Long)( ft_strlen( type1->font_info.full_name ) + 1 );
+      if ( value && value_len >= retval )
+        ft_memcpy( value, (void *)( type1->font_info.full_name ), retval );
+      break;
+
+    case PS_DICT_FAMILY_NAME:
+      retval = (FT_Long)( ft_strlen( type1->font_info.family_name ) + 1 );
+      if ( value && value_len >= retval )
+        ft_memcpy( value, (void *)( type1->font_info.family_name ), retval );
+      break;
+
+    case PS_DICT_WEIGHT:
+      retval = (FT_Long)( ft_strlen( type1->font_info.weight ) + 1 );
+      if ( value && value_len >= retval )
+        ft_memcpy( value, (void *)( type1->font_info.weight ), retval );
+      break;
+
+    case PS_DICT_ITALIC_ANGLE:
+      retval = sizeof ( type1->font_info.italic_angle );
+      if ( value && value_len >= retval )
+        *((FT_Long *)value) = type1->font_info.italic_angle;
+      break;
+
+    default:
+      break;
+    }
+
+    return retval;
+  }
+
+
+  static const FT_Service_PsInfoRec  t1_service_ps_info =
+  {
+    (PS_GetFontInfoFunc)   t1_ps_get_font_info,
+    (PS_GetFontExtraFunc)  t1_ps_get_font_extra,
+    (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names,
+    (PS_GetFontPrivateFunc)t1_ps_get_font_private,
+    (PS_GetFontValueFunc)  t1_ps_get_font_value,
+  };
+
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+  static const FT_Service_KerningRec  t1_service_kerning =
+  {
+    T1_Get_Track_Kerning,
+  };
+#endif
+
+
+  /*
+   *  SERVICE LIST
+   *
+   */
+
+  static const FT_ServiceDescRec  t1_services[] =
+  {
+    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name },
+    { FT_SERVICE_ID_GLYPH_DICT,           &t1_service_glyph_dict },
+    { FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_TYPE_1 },
+    { FT_SERVICE_ID_POSTSCRIPT_INFO,      &t1_service_ps_info },
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+    { FT_SERVICE_ID_KERNING,              &t1_service_kerning },
+#endif
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+    { FT_SERVICE_ID_MULTI_MASTERS,        &t1_service_multi_masters },
+#endif
+    { NULL, NULL }
+  };
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  Get_Interface( FT_Module         module,
+                 const FT_String*  t1_interface )
+  {
+    FT_UNUSED( module );
+
+    return ft_service_list_lookup( t1_services, t1_interface );
+  }
+
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Get_Kerning                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A driver method used to return the kerning vector between two      */
+  /*    glyphs of the same face.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to the source face object.                 */
+  /*                                                                       */
+  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
+  /*                                                                       */
+  /*    right_glyph :: The index of the right glyph in the kern pair.      */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    kerning     :: The kerning vector.  This is in font units for      */
+  /*                   scalable formats, and in pixels for fixed-sizes     */
+  /*                   formats.                                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
+  /*    supported by this function.  Other layouts, or more sophisticated  */
+  /*    kernings are out of scope of this method (the basic driver         */
+  /*    interface is meant to be simple).                                  */
+  /*                                                                       */
+  /*    They can be implemented by format-specific interfaces.             */
+  /*                                                                       */
+  static FT_Error
+  Get_Kerning( FT_Face     t1face,        /* T1_Face */
+               FT_UInt     left_glyph,
+               FT_UInt     right_glyph,
+               FT_Vector*  kerning )
+  {
+    T1_Face  face = (T1_Face)t1face;
+
+
+    kerning->x = 0;
+    kerning->y = 0;
+
+    if ( face->afm_data )
+      T1_Get_Kerning( (AFM_FontInfo)face->afm_data,
+                      left_glyph,
+                      right_glyph,
+                      kerning );
+
+    return FT_Err_Ok;
+  }
+
+
+#endif /* T1_CONFIG_OPTION_NO_AFM */
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Driver_ClassRec  t1_driver_class =
+  {
+    {
+      FT_MODULE_FONT_DRIVER       |
+      FT_MODULE_DRIVER_SCALABLE   |
+      FT_MODULE_DRIVER_HAS_HINTER,
+
+      sizeof ( FT_DriverRec ),
+
+      "type1",
+      0x10000L,
+      0x20000L,
+
+      0,   /* format interface */
+
+      T1_Driver_Init,
+      T1_Driver_Done,
+      Get_Interface,
+    },
+
+    sizeof ( T1_FaceRec ),
+    sizeof ( T1_SizeRec ),
+    sizeof ( T1_GlyphSlotRec ),
+
+    T1_Face_Init,
+    T1_Face_Done,
+    T1_Size_Init,
+    T1_Size_Done,
+    T1_GlyphSlot_Init,
+    T1_GlyphSlot_Done,
+
+    T1_Load_Glyph,
+
+#ifdef T1_CONFIG_OPTION_NO_AFM
+    0,                     /* FT_Face_GetKerningFunc */
+    0,                     /* FT_Face_AttachFunc     */
+#else
+    Get_Kerning,
+    T1_Read_Metrics,
+#endif
+    T1_Get_Advances,
+    T1_Size_Request,
+    0                      /* FT_Size_SelectFunc     */
+  };
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.h
new file mode 100644
index 0000000..feff60d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1driver.h                                                             */
+/*                                                                         */
+/*    High-level Type 1 driver interface (specification).                  */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 by                                           */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1DRIVER_H__
+#define __T1DRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdriver.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+  FT_EXPORT_VAR( const FT_Driver_ClassRec )  t1_driver_class;
+
+
+FT_END_HEADER
+
+#endif /* __T1DRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1errors.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1errors.h
new file mode 100644
index 0000000..69584ba
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1errors.h
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1errors.h                                                             */
+/*                                                                         */
+/*    Type 1 error codes (specification only).                             */
+/*                                                                         */
+/*  Copyright 2001, 2012 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the Type 1 error enumeration constants.   */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __T1ERRORS_H__
+#define __T1ERRORS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  T1_Err_
+#define FT_ERR_BASE    FT_Mod_Err_Type1
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __T1ERRORS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.c
new file mode 100644
index 0000000..6fc908b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.c
@@ -0,0 +1,517 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1gload.c                                                              */
+/*                                                                         */
+/*    Type 1 Glyph Loader (body).                                          */
+/*                                                                         */
+/*  Copyright 1996-2006, 2008-2010, 2013 by                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "t1gload.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/psaux.h"
+
+#include "t1errors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1gload
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /**********                                                      *********/
+  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/
+  /**********                                                      *********/
+  /**********    The following code is in charge of computing      *********/
+  /**********    the maximum advance width of the font.  It        *********/
+  /**********    quickly processes each glyph charstring to        *********/
+  /**********    extract the value from either a `sbw' or `seac'   *********/
+  /**********    operator.                                         *********/
+  /**********                                                      *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Parse_Glyph_And_Get_Char_String( T1_Decoder  decoder,
+                                      FT_UInt     glyph_index,
+                                      FT_Data*    char_string )
+  {
+    T1_Face   face  = (T1_Face)decoder->builder.face;
+    T1_Font   type1 = &face->type1;
+    FT_Error  error = FT_Err_Ok;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_Incremental_InterfaceRec *inc =
+                      face->root.internal->incremental_interface;
+#endif
+
+
+    decoder->font_matrix = type1->font_matrix;
+    decoder->font_offset = type1->font_offset;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    /* For incremental fonts get the character data using the */
+    /* callback function.                                     */
+    if ( inc )
+      error = inc->funcs->get_glyph_data( inc->object,
+                                          glyph_index, char_string );
+    else
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    /* For ordinary fonts get the character data stored in the face record. */
+    {
+      char_string->pointer = type1->charstrings[glyph_index];
+      char_string->length  = (FT_Int)type1->charstrings_len[glyph_index];
+    }
+
+    if ( !error )
+      error = decoder->funcs.parse_charstrings(
+                decoder, (FT_Byte*)char_string->pointer,
+                char_string->length );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    /* Incremental fonts can optionally override the metrics. */
+    if ( !error && inc && inc->funcs->get_glyph_metrics )
+    {
+      FT_Incremental_MetricsRec  metrics;
+
+
+      metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );
+      metrics.bearing_y = 0;
+      metrics.advance   = FIXED_TO_INT( decoder->builder.advance.x );
+      metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );
+
+      error = inc->funcs->get_glyph_metrics( inc->object,
+                                             glyph_index, FALSE, &metrics );
+
+      decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );
+      decoder->builder.advance.x      = INT_TO_FIXED( metrics.advance );
+      decoder->builder.advance.y      = INT_TO_FIXED( metrics.advance_v );
+    }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  T1_Parse_Glyph( T1_Decoder  decoder,
+                  FT_UInt     glyph_index )
+  {
+    FT_Data   glyph_data;
+    FT_Error  error = T1_Parse_Glyph_And_Get_Char_String(
+                        decoder, glyph_index, &glyph_data );
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    if ( !error )
+    {
+      T1_Face  face = (T1_Face)decoder->builder.face;
+
+
+      if ( face->root.internal->incremental_interface )
+        face->root.internal->incremental_interface->funcs->free_glyph_data(
+          face->root.internal->incremental_interface->object,
+          &glyph_data );
+    }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Compute_Max_Advance( T1_Face  face,
+                          FT_Pos*  max_advance )
+  {
+    FT_Error       error;
+    T1_DecoderRec  decoder;
+    FT_Int         glyph_index;
+    T1_Font        type1 = &face->type1;
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+
+    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
+
+    *max_advance = 0;
+
+    /* initialize load decoder */
+    error = psaux->t1_decoder_funcs->init( &decoder,
+                                           (FT_Face)face,
+                                           0, /* size       */
+                                           0, /* glyph slot */
+                                           (FT_Byte**)type1->glyph_names,
+                                           face->blend,
+                                           0,
+                                           FT_RENDER_MODE_NORMAL,
+                                           T1_Parse_Glyph );
+    if ( error )
+      return error;
+
+    decoder.builder.metrics_only = 1;
+    decoder.builder.load_points  = 0;
+
+    decoder.num_subrs     = type1->num_subrs;
+    decoder.subrs         = type1->subrs;
+    decoder.subrs_len     = type1->subrs_len;
+
+    decoder.buildchar     = face->buildchar;
+    decoder.len_buildchar = face->len_buildchar;
+
+    *max_advance = 0;
+
+    /* for each glyph, parse the glyph charstring and extract */
+    /* the advance width                                      */
+    for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ )
+    {
+      /* now get load the unscaled outline */
+      error = T1_Parse_Glyph( &decoder, glyph_index );
+      if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance )
+        *max_advance = decoder.builder.advance.x;
+
+      /* ignore the error if one occurred - skip to next glyph */
+    }
+
+    psaux->t1_decoder_funcs->done( &decoder );
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_Advances( FT_Face    t1face,        /* T1_Face */
+                   FT_UInt    first,
+                   FT_UInt    count,
+                   FT_Int32   load_flags,
+                   FT_Fixed*  advances )
+  {
+    T1_Face        face  = (T1_Face)t1face;
+    T1_DecoderRec  decoder;
+    T1_Font        type1 = &face->type1;
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+    FT_UInt        nn;
+    FT_Error       error;
+
+
+    if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+    {
+      for ( nn = 0; nn < count; nn++ )
+        advances[nn] = 0;
+
+      return FT_Err_Ok;
+    }
+
+    error = psaux->t1_decoder_funcs->init( &decoder,
+                                           (FT_Face)face,
+                                           0, /* size       */
+                                           0, /* glyph slot */
+                                           (FT_Byte**)type1->glyph_names,
+                                           face->blend,
+                                           0,
+                                           FT_RENDER_MODE_NORMAL,
+                                           T1_Parse_Glyph );
+    if ( error )
+      return error;
+
+    decoder.builder.metrics_only = 1;
+    decoder.builder.load_points  = 0;
+
+    decoder.num_subrs = type1->num_subrs;
+    decoder.subrs     = type1->subrs;
+    decoder.subrs_len = type1->subrs_len;
+
+    decoder.buildchar     = face->buildchar;
+    decoder.len_buildchar = face->len_buildchar;
+
+    for ( nn = 0; nn < count; nn++ )
+    {
+      error = T1_Parse_Glyph( &decoder, first + nn );
+      if ( !error )
+        advances[nn] = FIXED_TO_INT( decoder.builder.advance.x );
+      else
+        advances[nn] = 0;
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Load_Glyph( FT_GlyphSlot  t1glyph,          /* T1_GlyphSlot */
+                 FT_Size       t1size,           /* T1_Size      */
+                 FT_UInt       glyph_index,
+                 FT_Int32      load_flags )
+  {
+    T1_GlyphSlot            glyph = (T1_GlyphSlot)t1glyph;
+    FT_Error                error;
+    T1_DecoderRec           decoder;
+    T1_Face                 face = (T1_Face)t1glyph->face;
+    FT_Bool                 hinting;
+    T1_Font                 type1         = &face->type1;
+    PSAux_Service           psaux         = (PSAux_Service)face->psaux;
+    const T1_Decoder_Funcs  decoder_funcs = psaux->t1_decoder_funcs;
+
+    FT_Matrix               font_matrix;
+    FT_Vector               font_offset;
+    FT_Data                 glyph_data;
+    FT_Bool                 must_finish_decoder = FALSE;
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_Bool                 glyph_data_loaded = 0;
+#endif
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( glyph_index >= (FT_UInt)face->root.num_glyphs &&
+         !face->root.internal->incremental_interface   )
+#else
+    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
+
+    if ( load_flags & FT_LOAD_NO_RECURSE )
+      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+    if ( t1size )
+    {
+      glyph->x_scale = t1size->metrics.x_scale;
+      glyph->y_scale = t1size->metrics.y_scale;
+    }
+    else
+    {
+      glyph->x_scale = 0x10000L;
+      glyph->y_scale = 0x10000L;
+    }
+
+    t1glyph->outline.n_points   = 0;
+    t1glyph->outline.n_contours = 0;
+
+    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
+                       ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+
+    t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+    error = decoder_funcs->init( &decoder,
+                                 t1glyph->face,
+                                 t1size,
+                                 t1glyph,
+                                 (FT_Byte**)type1->glyph_names,
+                                 face->blend,
+                                 FT_BOOL( hinting ),
+                                 FT_LOAD_TARGET_MODE( load_flags ),
+                                 T1_Parse_Glyph );
+    if ( error )
+      goto Exit;
+
+    must_finish_decoder = TRUE;
+
+    decoder.builder.no_recurse = FT_BOOL(
+                                   ( load_flags & FT_LOAD_NO_RECURSE ) != 0 );
+
+    decoder.num_subrs     = type1->num_subrs;
+    decoder.subrs         = type1->subrs;
+    decoder.subrs_len     = type1->subrs_len;
+
+    decoder.buildchar     = face->buildchar;
+    decoder.len_buildchar = face->len_buildchar;
+
+    /* now load the unscaled outline */
+    error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index,
+                                                &glyph_data );
+    if ( error )
+      goto Exit;
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    glyph_data_loaded = 1;
+#endif
+
+    font_matrix = decoder.font_matrix;
+    font_offset = decoder.font_offset;
+
+    /* save new glyph tables */
+    decoder_funcs->done( &decoder );
+
+    must_finish_decoder = FALSE;
+
+    /* now, set the metrics -- this is rather simple, as   */
+    /* the left side bearing is the xMin, and the top side */
+    /* bearing the yMax                                    */
+    if ( !error )
+    {
+      t1glyph->outline.flags &= FT_OUTLINE_OWNER;
+      t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
+
+      /* for composite glyphs, return only left side bearing and */
+      /* advance width                                           */
+      if ( load_flags & FT_LOAD_NO_RECURSE )
+      {
+        FT_Slot_Internal  internal = t1glyph->internal;
+
+
+        t1glyph->metrics.horiBearingX =
+          FIXED_TO_INT( decoder.builder.left_bearing.x );
+        t1glyph->metrics.horiAdvance  =
+          FIXED_TO_INT( decoder.builder.advance.x );
+
+        internal->glyph_matrix      = font_matrix;
+        internal->glyph_delta       = font_offset;
+        internal->glyph_transformed = 1;
+      }
+      else
+      {
+        FT_BBox            cbox;
+        FT_Glyph_Metrics*  metrics = &t1glyph->metrics;
+        FT_Vector          advance;
+
+
+        /* copy the _unscaled_ advance width */
+        metrics->horiAdvance =
+          FIXED_TO_INT( decoder.builder.advance.x );
+        t1glyph->linearHoriAdvance =
+          FIXED_TO_INT( decoder.builder.advance.x );
+        t1glyph->internal->glyph_transformed = 0;
+
+        if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+        {
+          /* make up vertical ones */
+          metrics->vertAdvance = ( face->type1.font_bbox.yMax -
+                                   face->type1.font_bbox.yMin ) >> 16;
+          t1glyph->linearVertAdvance = metrics->vertAdvance;
+        }
+        else
+        {
+          metrics->vertAdvance =
+            FIXED_TO_INT( decoder.builder.advance.y );
+          t1glyph->linearVertAdvance =
+            FIXED_TO_INT( decoder.builder.advance.y );
+        }
+
+        t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+        if ( t1size && t1size->metrics.y_ppem < 24 )
+          t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+#if 1
+        /* apply the font matrix, if any */
+        if ( font_matrix.xx != 0x10000L || font_matrix.yy != font_matrix.xx ||
+             font_matrix.xy != 0        || font_matrix.yx != 0              )
+          FT_Outline_Transform( &t1glyph->outline, &font_matrix );
+
+        if ( font_offset.x || font_offset.y )
+          FT_Outline_Translate( &t1glyph->outline,
+                                font_offset.x,
+                                font_offset.y );
+
+        advance.x = metrics->horiAdvance;
+        advance.y = 0;
+        FT_Vector_Transform( &advance, &font_matrix );
+        metrics->horiAdvance = advance.x + font_offset.x;
+        advance.x = 0;
+        advance.y = metrics->vertAdvance;
+        FT_Vector_Transform( &advance, &font_matrix );
+        metrics->vertAdvance = advance.y + font_offset.y;
+#endif
+
+        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
+        {
+          /* scale the outline and the metrics */
+          FT_Int       n;
+          FT_Outline*  cur = decoder.builder.base;
+          FT_Vector*   vec = cur->points;
+          FT_Fixed     x_scale = glyph->x_scale;
+          FT_Fixed     y_scale = glyph->y_scale;
+
+
+          /* First of all, scale the points, if we are not hinting */
+          if ( !hinting || ! decoder.builder.hints_funcs )
+            for ( n = cur->n_points; n > 0; n--, vec++ )
+            {
+              vec->x = FT_MulFix( vec->x, x_scale );
+              vec->y = FT_MulFix( vec->y, y_scale );
+            }
+
+          /* Then scale the metrics */
+          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+        }
+
+        /* compute the other metrics */
+        FT_Outline_Get_CBox( &t1glyph->outline, &cbox );
+
+        metrics->width  = cbox.xMax - cbox.xMin;
+        metrics->height = cbox.yMax - cbox.yMin;
+
+        metrics->horiBearingX = cbox.xMin;
+        metrics->horiBearingY = cbox.yMax;
+
+        if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+        {
+          /* make up vertical ones */
+          ft_synthesize_vertical_metrics( metrics,
+                                          metrics->vertAdvance );
+        }
+      }
+
+      /* Set control data to the glyph charstrings.  Note that this is */
+      /* _not_ zero-terminated.                                        */
+      t1glyph->control_data = (FT_Byte*)glyph_data.pointer;
+      t1glyph->control_len  = glyph_data.length;
+    }
+
+
+  Exit:
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( glyph_data_loaded && face->root.internal->incremental_interface )
+    {
+      face->root.internal->incremental_interface->funcs->free_glyph_data(
+        face->root.internal->incremental_interface->object,
+        &glyph_data );
+
+      /* Set the control data to null - it is no longer available if   */
+      /* loaded incrementally.                                         */
+      t1glyph->control_data = 0;
+      t1glyph->control_len  = 0;
+    }
+#endif
+
+    if ( must_finish_decoder )
+      decoder_funcs->done( &decoder );
+
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.h
new file mode 100644
index 0000000..b8f4cfa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.h
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1gload.h                                                              */
+/*                                                                         */
+/*    Type 1 Glyph Loader (specification).                                 */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2008, 2011 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1GLOAD_H__
+#define __T1GLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "t1objs.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  T1_Compute_Max_Advance( T1_Face  face,
+                          FT_Pos*  max_advance );
+
+  FT_LOCAL( FT_Error )
+  T1_Get_Advances( FT_Face    face,
+                   FT_UInt    first,
+                   FT_UInt    count,
+                   FT_Int32   load_flags,
+                   FT_Fixed*  advances );
+
+  FT_LOCAL( FT_Error )
+  T1_Load_Glyph( FT_GlyphSlot  glyph,
+                 FT_Size       size,
+                 FT_UInt       glyph_index,
+                 FT_Int32      load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __T1GLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.c
new file mode 100644
index 0000000..76e36f8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.c
@@ -0,0 +1,2272 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1load.c                                                               */
+/*                                                                         */
+/*    Type 1 font loader (body).                                           */
+/*                                                                         */
+/*  Copyright 1996-2013 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This is the new and improved Type 1 data loader for FreeType 2.  The  */
+  /* old loader has several problems: it is slow, complex, difficult to    */
+  /* maintain, and contains incredible hacks to make it accept some        */
+  /* ill-formed Type 1 fonts without hiccup-ing.  Moreover, about 5% of    */
+  /* the Type 1 fonts on my machine still aren't loaded correctly by it.   */
+  /*                                                                       */
+  /* This version is much simpler, much faster and also easier to read and */
+  /* maintain by a great order of magnitude.  The idea behind it is to     */
+  /* _not_ try to read the Type 1 token stream with a state machine (i.e.  */
+  /* a Postscript-like interpreter) but rather to perform simple pattern   */
+  /* matching.                                                             */
+  /*                                                                       */
+  /* Indeed, nearly all data definitions follow a simple pattern like      */
+  /*                                                                       */
+  /*  ... /Field <data> ...                                                */
+  /*                                                                       */
+  /* where <data> can be a number, a boolean, a string, or an array of     */
+  /* numbers.  There are a few exceptions, namely the encoding, font name, */
+  /* charstrings, and subrs; they are handled with a special pattern       */
+  /* matching routine.                                                     */
+  /*                                                                       */
+  /* All other common cases are handled very simply.  The matching rules   */
+  /* are defined in the file `t1tokens.h' through the use of several       */
+  /* macros calls PARSE_XXX.  This file is included twice here; the first  */
+  /* time to generate parsing callback functions, the second time to       */
+  /* generate a table of keywords (with pointers to the associated         */
+  /* callback functions).                                                  */
+  /*                                                                       */
+  /* The function `parse_dict' simply scans *linearly* a given dictionary  */
+  /* (either the top-level or private one) and calls the appropriate       */
+  /* callback when it encounters an immediate keyword.                     */
+  /*                                                                       */
+  /* This is by far the fastest way one can find to parse and read all     */
+  /* data.                                                                 */
+  /*                                                                       */
+  /* This led to tremendous code size reduction.  Note that later, the     */
+  /* glyph loader will also be _greatly_ simplified, and the automatic     */
+  /* hinter will replace the clumsy `t1hinter'.                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/t1types.h"
+#include "../../include/freetype/internal/ftcalc.h"
+
+#include "t1load.h"
+#include "t1errors.h"
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+#define IS_INCREMENTAL  (FT_Bool)( face->root.internal->incremental_interface != 0 )
+#else
+#define IS_INCREMENTAL  0
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1load
+
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    MULTIPLE MASTERS SUPPORT                   *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static FT_Error
+  t1_allocate_blend( T1_Face  face,
+                     FT_UInt  num_designs,
+                     FT_UInt  num_axis )
+  {
+    PS_Blend   blend;
+    FT_Memory  memory = face->root.memory;
+    FT_Error   error  = FT_Err_Ok;
+
+
+    blend = face->blend;
+    if ( !blend )
+    {
+      if ( FT_NEW( blend ) )
+        goto Exit;
+
+      blend->num_default_design_vector = 0;
+
+      face->blend = blend;
+    }
+
+    /* allocate design data if needed */
+    if ( num_designs > 0 )
+    {
+      if ( blend->num_designs == 0 )
+      {
+        FT_UInt  nn;
+
+
+        /* allocate the blend `private' and `font_info' dictionaries */
+        if ( FT_NEW_ARRAY( blend->font_infos[1], num_designs     ) ||
+             FT_NEW_ARRAY( blend->privates  [1], num_designs     ) ||
+             FT_NEW_ARRAY( blend->bboxes    [1], num_designs     ) ||
+             FT_NEW_ARRAY( blend->weight_vector, num_designs * 2 ) )
+          goto Exit;
+
+        blend->default_weight_vector = blend->weight_vector + num_designs;
+
+        blend->font_infos[0] = &face->type1.font_info;
+        blend->privates  [0] = &face->type1.private_dict;
+        blend->bboxes    [0] = &face->type1.font_bbox;
+
+        for ( nn = 2; nn <= num_designs; nn++ )
+        {
+          blend->font_infos[nn] = blend->font_infos[nn - 1] + 1;
+          blend->privates  [nn] = blend->privates  [nn - 1] + 1;
+          blend->bboxes    [nn] = blend->bboxes    [nn - 1] + 1;
+        }
+
+        blend->num_designs = num_designs;
+      }
+      else if ( blend->num_designs != num_designs )
+        goto Fail;
+    }
+
+    /* allocate axis data if needed */
+    if ( num_axis > 0 )
+    {
+      if ( blend->num_axis != 0 && blend->num_axis != num_axis )
+        goto Fail;
+
+      blend->num_axis = num_axis;
+    }
+
+    /* allocate the blend design pos table if needed */
+    num_designs = blend->num_designs;
+    num_axis    = blend->num_axis;
+    if ( num_designs && num_axis && blend->design_pos[0] == 0 )
+    {
+      FT_UInt  n;
+
+
+      if ( FT_NEW_ARRAY( blend->design_pos[0], num_designs * num_axis ) )
+        goto Exit;
+
+      for ( n = 1; n < num_designs; n++ )
+        blend->design_pos[n] = blend->design_pos[0] + num_axis * n;
+    }
+
+  Exit:
+    return error;
+
+  Fail:
+    error = FT_THROW( Invalid_File_Format );
+    goto Exit;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_Multi_Master( T1_Face           face,
+                       FT_Multi_Master*  master )
+  {
+    PS_Blend  blend = face->blend;
+    FT_UInt   n;
+    FT_Error  error;
+
+
+    error = FT_THROW( Invalid_Argument );
+
+    if ( blend )
+    {
+      master->num_axis    = blend->num_axis;
+      master->num_designs = blend->num_designs;
+
+      for ( n = 0; n < blend->num_axis; n++ )
+      {
+        FT_MM_Axis*   axis = master->axis + n;
+        PS_DesignMap  map = blend->design_map + n;
+
+
+        axis->name    = blend->axis_names[n];
+        axis->minimum = map->design_points[0];
+        axis->maximum = map->design_points[map->num_points - 1];
+      }
+
+      error = FT_Err_Ok;
+    }
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Given a normalized (blend) coordinate, figure out the design          */
+  /* coordinate appropriate for that value.                                */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Fixed )
+  mm_axis_unmap( PS_DesignMap  axismap,
+                 FT_Fixed      ncv )
+  {
+    int  j;
+
+
+    if ( ncv <= axismap->blend_points[0] )
+      return INT_TO_FIXED( axismap->design_points[0] );
+
+    for ( j = 1; j < axismap->num_points; ++j )
+    {
+      if ( ncv <= axismap->blend_points[j] )
+        return INT_TO_FIXED( axismap->design_points[j - 1] ) +
+               ( axismap->design_points[j] - axismap->design_points[j - 1] ) *
+               FT_DivFix( ncv - axismap->blend_points[j - 1],
+                          axismap->blend_points[j] -
+                            axismap->blend_points[j - 1] );
+    }
+
+    return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Given a vector of weights, one for each design, figure out the        */
+  /* normalized axis coordinates which gave rise to those weights.         */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  mm_weights_unmap( FT_Fixed*  weights,
+                    FT_Fixed*  axiscoords,
+                    FT_UInt    axis_count )
+  {
+    FT_ASSERT( axis_count <= T1_MAX_MM_AXIS );
+
+    if ( axis_count == 1 )
+      axiscoords[0] = weights[1];
+
+    else if ( axis_count == 2 )
+    {
+      axiscoords[0] = weights[3] + weights[1];
+      axiscoords[1] = weights[3] + weights[2];
+    }
+
+    else if ( axis_count == 3 )
+    {
+      axiscoords[0] = weights[7] + weights[5] + weights[3] + weights[1];
+      axiscoords[1] = weights[7] + weights[6] + weights[3] + weights[2];
+      axiscoords[2] = weights[7] + weights[6] + weights[5] + weights[4];
+    }
+
+    else
+    {
+      axiscoords[0] = weights[15] + weights[13] + weights[11] + weights[9] +
+                        weights[7] + weights[5] + weights[3] + weights[1];
+      axiscoords[1] = weights[15] + weights[14] + weights[11] + weights[10] +
+                        weights[7] + weights[6] + weights[3] + weights[2];
+      axiscoords[2] = weights[15] + weights[14] + weights[13] + weights[12] +
+                        weights[7] + weights[6] + weights[5] + weights[4];
+      axiscoords[3] = weights[15] + weights[14] + weights[13] + weights[12] +
+                        weights[11] + weights[10] + weights[9] + weights[8];
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Just a wrapper around T1_Get_Multi_Master to support the different    */
+  /*  arguments needed by the GX var distortable fonts.                    */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_MM_Var( T1_Face      face,
+                 FT_MM_Var*  *master )
+  {
+    FT_Memory        memory = face->root.memory;
+    FT_MM_Var       *mmvar = NULL;
+    FT_Multi_Master  mmaster;
+    FT_Error         error;
+    FT_UInt          i;
+    FT_Fixed         axiscoords[T1_MAX_MM_AXIS];
+    PS_Blend         blend = face->blend;
+
+
+    error = T1_Get_Multi_Master( face, &mmaster );
+    if ( error )
+      goto Exit;
+    if ( FT_ALLOC( mmvar,
+                   sizeof ( FT_MM_Var ) +
+                     mmaster.num_axis * sizeof ( FT_Var_Axis ) ) )
+      goto Exit;
+
+    mmvar->num_axis        = mmaster.num_axis;
+    mmvar->num_designs     = mmaster.num_designs;
+    mmvar->num_namedstyles = ~0U;                        /* Does not apply */
+    mmvar->axis            = (FT_Var_Axis*)&mmvar[1];
+                                      /* Point to axes after MM_Var struct */
+    mmvar->namedstyle      = NULL;
+
+    for ( i = 0 ; i < mmaster.num_axis; ++i )
+    {
+      mmvar->axis[i].name    = mmaster.axis[i].name;
+      mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum);
+      mmvar->axis[i].maximum = INT_TO_FIXED( mmaster.axis[i].maximum);
+      mmvar->axis[i].def     = ( mmvar->axis[i].minimum +
+                                   mmvar->axis[i].maximum ) / 2;
+                            /* Does not apply.  But this value is in range */
+      mmvar->axis[i].strid   = ~0U;                      /* Does not apply */
+      mmvar->axis[i].tag     = ~0U;                      /* Does not apply */
+
+      if ( ft_strcmp( mmvar->axis[i].name, "Weight" ) == 0 )
+        mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'g', 'h', 't' );
+      else if ( ft_strcmp( mmvar->axis[i].name, "Width" ) == 0 )
+        mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'd', 't', 'h' );
+      else if ( ft_strcmp( mmvar->axis[i].name, "OpticalSize" ) == 0 )
+        mmvar->axis[i].tag = FT_MAKE_TAG( 'o', 'p', 's', 'z' );
+    }
+
+    if ( blend->num_designs == ( 1U << blend->num_axis ) )
+    {
+      mm_weights_unmap( blend->default_weight_vector,
+                        axiscoords,
+                        blend->num_axis );
+
+      for ( i = 0; i < mmaster.num_axis; ++i )
+        mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i],
+                                            axiscoords[i] );
+    }
+
+    *master = mmvar;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Set_MM_Blend( T1_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords )
+  {
+    PS_Blend  blend = face->blend;
+    FT_Error  error;
+    FT_UInt   n, m;
+
+
+    error = FT_ERR( Invalid_Argument );
+
+    if ( blend && blend->num_axis == num_coords )
+    {
+      /* recompute the weight vector from the blend coordinates */
+      error = FT_Err_Ok;
+
+      for ( n = 0; n < blend->num_designs; n++ )
+      {
+        FT_Fixed  result = 0x10000L;  /* 1.0 fixed */
+
+
+        for ( m = 0; m < blend->num_axis; m++ )
+        {
+          FT_Fixed  factor;
+
+
+          /* get current blend axis position */
+          factor = coords[m];
+          if ( factor < 0 )
+            factor = 0;
+          if ( factor > 0x10000L )
+            factor = 0x10000L;
+
+          if ( ( n & ( 1 << m ) ) == 0 )
+            factor = 0x10000L - factor;
+
+          result = FT_MulFix( result, factor );
+        }
+        blend->weight_vector[n] = result;
+      }
+
+      error = FT_Err_Ok;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Set_MM_Design( T1_Face   face,
+                    FT_UInt   num_coords,
+                    FT_Long*  coords )
+  {
+    PS_Blend  blend = face->blend;
+    FT_Error  error;
+    FT_UInt   n, p;
+
+
+    error = FT_ERR( Invalid_Argument );
+    if ( blend && blend->num_axis == num_coords )
+    {
+      /* compute the blend coordinates through the blend design map */
+      FT_Fixed  final_blends[T1_MAX_MM_DESIGNS];
+
+
+      for ( n = 0; n < blend->num_axis; n++ )
+      {
+        FT_Long       design  = coords[n];
+        FT_Fixed      the_blend;
+        PS_DesignMap  map     = blend->design_map + n;
+        FT_Long*      designs = map->design_points;
+        FT_Fixed*     blends  = map->blend_points;
+        FT_Int        before  = -1, after = -1;
+
+
+        for ( p = 0; p < (FT_UInt)map->num_points; p++ )
+        {
+          FT_Long  p_design = designs[p];
+
+
+          /* exact match? */
+          if ( design == p_design )
+          {
+            the_blend = blends[p];
+            goto Found;
+          }
+
+          if ( design < p_design )
+          {
+            after = p;
+            break;
+          }
+
+          before = p;
+        }
+
+        /* now interpolate if necessary */
+        if ( before < 0 )
+          the_blend = blends[0];
+
+        else if ( after < 0 )
+          the_blend = blends[map->num_points - 1];
+
+        else
+          the_blend = FT_MulDiv( design         - designs[before],
+                                 blends [after] - blends [before],
+                                 designs[after] - designs[before] );
+
+      Found:
+        final_blends[n] = the_blend;
+      }
+
+      error = T1_Set_MM_Blend( face, num_coords, final_blends );
+    }
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Just a wrapper around T1_Set_MM_Design to support the different       */
+  /* arguments needed by the GX var distortable fonts.                     */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  T1_Set_Var_Design( T1_Face    face,
+                     FT_UInt    num_coords,
+                     FT_Fixed*  coords )
+  {
+     FT_Long   lcoords[4];          /* maximum axis count is 4 */
+     FT_UInt   i;
+     FT_Error  error;
+
+
+     error = FT_ERR( Invalid_Argument );
+     if ( num_coords <= 4 && num_coords > 0 )
+     {
+       for ( i = 0; i < num_coords; ++i )
+         lcoords[i] = FIXED_TO_INT( coords[i] );
+       error = T1_Set_MM_Design( face, num_coords, lcoords );
+     }
+
+     return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  T1_Done_Blend( T1_Face  face )
+  {
+    FT_Memory  memory = face->root.memory;
+    PS_Blend   blend  = face->blend;
+
+
+    if ( blend )
+    {
+      FT_UInt  num_designs = blend->num_designs;
+      FT_UInt  num_axis    = blend->num_axis;
+      FT_UInt  n;
+
+
+      /* release design pos table */
+      FT_FREE( blend->design_pos[0] );
+      for ( n = 1; n < num_designs; n++ )
+        blend->design_pos[n] = NULL;
+
+      /* release blend `private' and `font info' dictionaries */
+      FT_FREE( blend->privates[1] );
+      FT_FREE( blend->font_infos[1] );
+      FT_FREE( blend->bboxes[1] );
+
+      for ( n = 0; n < num_designs; n++ )
+      {
+        blend->privates  [n] = NULL;
+        blend->font_infos[n] = NULL;
+        blend->bboxes    [n] = NULL;
+      }
+
+      /* release weight vectors */
+      FT_FREE( blend->weight_vector );
+      blend->default_weight_vector = NULL;
+
+      /* release axis names */
+      for ( n = 0; n < num_axis; n++ )
+        FT_FREE( blend->axis_names[n] );
+
+      /* release design map */
+      for ( n = 0; n < num_axis; n++ )
+      {
+        PS_DesignMap  dmap = blend->design_map + n;
+
+
+        FT_FREE( dmap->design_points );
+        dmap->num_points = 0;
+      }
+
+      FT_FREE( face->blend );
+    }
+  }
+
+
+  static void
+  parse_blend_axis_types( T1_Face    face,
+                          T1_Loader  loader )
+  {
+    T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];
+    FT_Int       n, num_axis;
+    FT_Error     error = FT_Err_Ok;
+    PS_Blend     blend;
+    FT_Memory    memory;
+
+
+    /* take an array of objects */
+    T1_ToTokenArray( &loader->parser, axis_tokens,
+                     T1_MAX_MM_AXIS, &num_axis );
+    if ( num_axis < 0 )
+    {
+      error = FT_ERR( Ignore );
+      goto Exit;
+    }
+    if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )
+    {
+      FT_ERROR(( "parse_blend_axis_types: incorrect number of axes: %d\n",
+                 num_axis ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    /* allocate blend if necessary */
+    error = t1_allocate_blend( face, 0, (FT_UInt)num_axis );
+    if ( error )
+      goto Exit;
+
+    blend  = face->blend;
+    memory = face->root.memory;
+
+    /* each token is an immediate containing the name of the axis */
+    for ( n = 0; n < num_axis; n++ )
+    {
+      T1_Token    token = axis_tokens + n;
+      FT_Byte*    name;
+      FT_PtrDist  len;
+
+
+      /* skip first slash, if any */
+      if ( token->start[0] == '/' )
+        token->start++;
+
+      len = token->limit - token->start;
+      if ( len == 0 )
+      {
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      if ( FT_ALLOC( blend->axis_names[n], (FT_Long)( len + 1 ) ) )
+        goto Exit;
+
+      name = (FT_Byte*)blend->axis_names[n];
+      FT_MEM_COPY( name, token->start, len );
+      name[len] = '\0';
+    }
+
+  Exit:
+    loader->parser.root.error = error;
+  }
+
+
+  static void
+  parse_blend_design_positions( T1_Face    face,
+                                T1_Loader  loader )
+  {
+    T1_TokenRec  design_tokens[T1_MAX_MM_DESIGNS];
+    FT_Int       num_designs;
+    FT_Int       num_axis;
+    T1_Parser    parser = &loader->parser;
+
+    FT_Error     error = FT_Err_Ok;
+    PS_Blend     blend;
+
+
+    /* get the array of design tokens -- compute number of designs */
+    T1_ToTokenArray( parser, design_tokens,
+                     T1_MAX_MM_DESIGNS, &num_designs );
+    if ( num_designs < 0 )
+    {
+      error = FT_ERR( Ignore );
+      goto Exit;
+    }
+    if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )
+    {
+      FT_ERROR(( "parse_blend_design_positions:"
+                 " incorrect number of designs: %d\n",
+                 num_designs ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    {
+      FT_Byte*  old_cursor = parser->root.cursor;
+      FT_Byte*  old_limit  = parser->root.limit;
+      FT_Int    n;
+
+
+      blend    = face->blend;
+      num_axis = 0;  /* make compiler happy */
+
+      for ( n = 0; n < num_designs; n++ )
+      {
+        T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];
+        T1_Token     token;
+        FT_Int       axis, n_axis;
+
+
+        /* read axis/coordinates tokens */
+        token = design_tokens + n;
+        parser->root.cursor = token->start;
+        parser->root.limit  = token->limit;
+        T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis );
+
+        if ( n == 0 )
+        {
+          if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS )
+          {
+            FT_ERROR(( "parse_blend_design_positions:"
+                       " invalid number of axes: %d\n",
+                       n_axis ));
+            error = FT_THROW( Invalid_File_Format );
+            goto Exit;
+          }
+
+          num_axis = n_axis;
+          error = t1_allocate_blend( face, num_designs, num_axis );
+          if ( error )
+            goto Exit;
+          blend = face->blend;
+        }
+        else if ( n_axis != num_axis )
+        {
+          FT_ERROR(( "parse_blend_design_positions: incorrect table\n" ));
+          error = FT_THROW( Invalid_File_Format );
+          goto Exit;
+        }
+
+        /* now read each axis token into the design position */
+        for ( axis = 0; axis < n_axis; axis++ )
+        {
+          T1_Token  token2 = axis_tokens + axis;
+
+
+          parser->root.cursor = token2->start;
+          parser->root.limit  = token2->limit;
+          blend->design_pos[n][axis] = T1_ToFixed( parser, 0 );
+        }
+      }
+
+      loader->parser.root.cursor = old_cursor;
+      loader->parser.root.limit  = old_limit;
+    }
+
+  Exit:
+    loader->parser.root.error = error;
+  }
+
+
+  static void
+  parse_blend_design_map( T1_Face    face,
+                          T1_Loader  loader )
+  {
+    FT_Error     error  = FT_Err_Ok;
+    T1_Parser    parser = &loader->parser;
+    PS_Blend     blend;
+    T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];
+    FT_Int       n, num_axis;
+    FT_Byte*     old_cursor;
+    FT_Byte*     old_limit;
+    FT_Memory    memory = face->root.memory;
+
+
+    T1_ToTokenArray( parser, axis_tokens,
+                     T1_MAX_MM_AXIS, &num_axis );
+    if ( num_axis < 0 )
+    {
+      error = FT_ERR( Ignore );
+      goto Exit;
+    }
+    if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )
+    {
+      FT_ERROR(( "parse_blend_design_map: incorrect number of axes: %d\n",
+                 num_axis ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    old_cursor = parser->root.cursor;
+    old_limit  = parser->root.limit;
+
+    error = t1_allocate_blend( face, 0, num_axis );
+    if ( error )
+      goto Exit;
+    blend = face->blend;
+
+    /* now read each axis design map */
+    for ( n = 0; n < num_axis; n++ )
+    {
+      PS_DesignMap  map = blend->design_map + n;
+      T1_Token      axis_token;
+      T1_TokenRec   point_tokens[T1_MAX_MM_MAP_POINTS];
+      FT_Int        p, num_points;
+
+
+      axis_token = axis_tokens + n;
+
+      parser->root.cursor = axis_token->start;
+      parser->root.limit  = axis_token->limit;
+      T1_ToTokenArray( parser, point_tokens,
+                       T1_MAX_MM_MAP_POINTS, &num_points );
+
+      if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS )
+      {
+        FT_ERROR(( "parse_blend_design_map: incorrect table\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      /* allocate design map data */
+      if ( FT_NEW_ARRAY( map->design_points, num_points * 2 ) )
+        goto Exit;
+      map->blend_points = map->design_points + num_points;
+      map->num_points   = (FT_Byte)num_points;
+
+      for ( p = 0; p < num_points; p++ )
+      {
+        T1_Token  point_token;
+
+
+        point_token = point_tokens + p;
+
+        /* don't include delimiting brackets */
+        parser->root.cursor = point_token->start + 1;
+        parser->root.limit  = point_token->limit - 1;
+
+        map->design_points[p] = T1_ToInt( parser );
+        map->blend_points [p] = T1_ToFixed( parser, 0 );
+      }
+    }
+
+    parser->root.cursor = old_cursor;
+    parser->root.limit  = old_limit;
+
+  Exit:
+    parser->root.error = error;
+  }
+
+
+  static void
+  parse_weight_vector( T1_Face    face,
+                       T1_Loader  loader )
+  {
+    T1_TokenRec  design_tokens[T1_MAX_MM_DESIGNS];
+    FT_Int       num_designs;
+    FT_Error     error  = FT_Err_Ok;
+    T1_Parser    parser = &loader->parser;
+    PS_Blend     blend  = face->blend;
+    T1_Token     token;
+    FT_Int       n;
+    FT_Byte*     old_cursor;
+    FT_Byte*     old_limit;
+
+
+    T1_ToTokenArray( parser, design_tokens,
+                     T1_MAX_MM_DESIGNS, &num_designs );
+    if ( num_designs < 0 )
+    {
+      error = FT_ERR( Ignore );
+      goto Exit;
+    }
+    if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )
+    {
+      FT_ERROR(( "parse_weight_vector:"
+                 " incorrect number of designs: %d\n",
+                 num_designs ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    if ( !blend || !blend->num_designs )
+    {
+      error = t1_allocate_blend( face, num_designs, 0 );
+      if ( error )
+        goto Exit;
+      blend = face->blend;
+    }
+    else if ( blend->num_designs != (FT_UInt)num_designs )
+    {
+      FT_ERROR(( "parse_weight_vector:"
+                 " /BlendDesignPosition and /WeightVector have\n"
+                 "                    "
+                 " different number of elements\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    old_cursor = parser->root.cursor;
+    old_limit  = parser->root.limit;
+
+    for ( n = 0; n < num_designs; n++ )
+    {
+      token = design_tokens + n;
+      parser->root.cursor = token->start;
+      parser->root.limit  = token->limit;
+
+      blend->default_weight_vector[n] =
+      blend->weight_vector[n]         = T1_ToFixed( parser, 0 );
+    }
+
+    parser->root.cursor = old_cursor;
+    parser->root.limit  = old_limit;
+
+  Exit:
+    parser->root.error = error;
+  }
+
+
+  /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def           */
+  /* we're only interested in the number of array elements */
+  static void
+  parse_buildchar( T1_Face    face,
+                   T1_Loader  loader )
+  {
+    face->len_buildchar = T1_ToFixedArray( &loader->parser, 0, NULL, 0 );
+
+    return;
+  }
+
+
+#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      TYPE 1 SYMBOL PARSING                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static FT_Error
+  t1_load_keyword( T1_Face         face,
+                   T1_Loader       loader,
+                   const T1_Field  field )
+  {
+    FT_Error  error;
+    void*     dummy_object;
+    void**    objects;
+    FT_UInt   max_objects;
+    PS_Blend  blend = face->blend;
+
+
+    if ( blend && blend->num_designs == 0 )
+      blend = NULL;
+
+    /* if the keyword has a dedicated callback, call it */
+    if ( field->type == T1_FIELD_TYPE_CALLBACK )
+    {
+      field->reader( (FT_Face)face, loader );
+      error = loader->parser.root.error;
+      goto Exit;
+    }
+
+    /* now, the keyword is either a simple field, or a table of fields; */
+    /* we are now going to take care of it                              */
+    switch ( field->location )
+    {
+    case T1_FIELD_LOCATION_FONT_INFO:
+      dummy_object = &face->type1.font_info;
+      objects      = &dummy_object;
+      max_objects  = 0;
+
+      if ( blend )
+      {
+        objects     = (void**)blend->font_infos;
+        max_objects = blend->num_designs;
+      }
+      break;
+
+    case T1_FIELD_LOCATION_FONT_EXTRA:
+      dummy_object = &face->type1.font_extra;
+      objects      = &dummy_object;
+      max_objects  = 0;
+      break;
+
+    case T1_FIELD_LOCATION_PRIVATE:
+      dummy_object = &face->type1.private_dict;
+      objects      = &dummy_object;
+      max_objects  = 0;
+
+      if ( blend )
+      {
+        objects     = (void**)blend->privates;
+        max_objects = blend->num_designs;
+      }
+      break;
+
+    case T1_FIELD_LOCATION_BBOX:
+      dummy_object = &face->type1.font_bbox;
+      objects      = &dummy_object;
+      max_objects  = 0;
+
+      if ( blend )
+      {
+        objects     = (void**)blend->bboxes;
+        max_objects = blend->num_designs;
+      }
+      break;
+
+    case T1_FIELD_LOCATION_LOADER:
+      dummy_object = loader;
+      objects      = &dummy_object;
+      max_objects  = 0;
+      break;
+
+    case T1_FIELD_LOCATION_FACE:
+      dummy_object = face;
+      objects      = &dummy_object;
+      max_objects  = 0;
+      break;
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+    case T1_FIELD_LOCATION_BLEND:
+      dummy_object = face->blend;
+      objects      = &dummy_object;
+      max_objects  = 0;
+      break;
+#endif
+
+    default:
+      dummy_object = &face->type1;
+      objects      = &dummy_object;
+      max_objects  = 0;
+    }
+
+    if ( *objects )
+    {
+      if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
+           field->type == T1_FIELD_TYPE_FIXED_ARRAY   )
+        error = T1_Load_Field_Table( &loader->parser, field,
+                                     objects, max_objects, 0 );
+      else
+        error = T1_Load_Field( &loader->parser, field,
+                               objects, max_objects, 0 );
+    }
+    else
+    {
+      FT_TRACE1(( "t1_load_keyword: ignoring keyword `%s'"
+                  " which is not valid at this point\n"
+                  "                 (probably due to missing keywords)\n",
+                 field->ident ));
+      error = FT_Err_Ok;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  parse_private( T1_Face    face,
+                 T1_Loader  loader )
+  {
+    FT_UNUSED( face );
+
+    loader->keywords_encountered |= T1_PRIVATE;
+  }
+
+
+  static int
+  read_binary_data( T1_Parser  parser,
+                    FT_Long*   size,
+                    FT_Byte**  base,
+                    FT_Bool    incremental )
+  {
+    FT_Byte*  cur;
+    FT_Byte*  limit = parser->root.limit;
+
+
+    /* the binary data has one of the following formats */
+    /*                                                  */
+    /*   `size' [white*] RD white ....... ND            */
+    /*   `size' [white*] -| white ....... |-            */
+    /*                                                  */
+
+    T1_Skip_Spaces( parser );
+
+    cur = parser->root.cursor;
+
+    if ( cur < limit && ft_isdigit( *cur ) )
+    {
+      FT_Long  s = T1_ToInt( parser );
+
+
+      T1_Skip_PS_Token( parser );   /* `RD' or `-|' or something else */
+
+      /* there is only one whitespace char after the */
+      /* `RD' or `-|' token                          */
+      *base = parser->root.cursor + 1;
+
+      if ( s >= 0 && s < limit - *base )
+      {
+        parser->root.cursor += s + 1;
+        *size = s;
+        return !parser->root.error;
+      }
+    }
+
+    if( !incremental )
+    {
+      FT_ERROR(( "read_binary_data: invalid size field\n" ));
+      parser->root.error = FT_THROW( Invalid_File_Format );
+    }
+
+    return 0;
+  }
+
+
+  /* We now define the routines to handle the `/Encoding', `/Subrs', */
+  /* and `/CharStrings' dictionaries.                                */
+
+  static void
+  t1_parse_font_matrix( T1_Face    face,
+                        T1_Loader  loader )
+  {
+    T1_Parser   parser = &loader->parser;
+    FT_Matrix*  matrix = &face->type1.font_matrix;
+    FT_Vector*  offset = &face->type1.font_offset;
+    FT_Face     root   = (FT_Face)&face->root;
+    FT_Fixed    temp[6];
+    FT_Fixed    temp_scale;
+    FT_Int      result;
+
+
+    result = T1_ToFixedArray( parser, 6, temp, 3 );
+
+    if ( result < 0 )
+    {
+      parser->root.error = FT_THROW( Invalid_File_Format );
+      return;
+    }
+
+    temp_scale = FT_ABS( temp[3] );
+
+    if ( temp_scale == 0 )
+    {
+      FT_ERROR(( "t1_parse_font_matrix: invalid font matrix\n" ));
+      parser->root.error = FT_THROW( Invalid_File_Format );
+      return;
+    }
+
+    /* Set Units per EM based on FontMatrix values.  We set the value to */
+    /* 1000 / temp_scale, because temp_scale was already multiplied by   */
+    /* 1000 (in t1_tofixed, from psobjs.c).                              */
+
+    root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
+
+    /* we need to scale the values by 1.0/temp_scale */
+    if ( temp_scale != 0x10000L )
+    {
+      temp[0] = FT_DivFix( temp[0], temp_scale );
+      temp[1] = FT_DivFix( temp[1], temp_scale );
+      temp[2] = FT_DivFix( temp[2], temp_scale );
+      temp[4] = FT_DivFix( temp[4], temp_scale );
+      temp[5] = FT_DivFix( temp[5], temp_scale );
+      temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L;
+    }
+
+    matrix->xx = temp[0];
+    matrix->yx = temp[1];
+    matrix->xy = temp[2];
+    matrix->yy = temp[3];
+
+    /* note that the offsets must be expressed in integer font units */
+    offset->x = temp[4] >> 16;
+    offset->y = temp[5] >> 16;
+  }
+
+
+  static void
+  parse_encoding( T1_Face    face,
+                  T1_Loader  loader )
+  {
+    T1_Parser  parser = &loader->parser;
+    FT_Byte*   cur;
+    FT_Byte*   limit  = parser->root.limit;
+
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+
+    T1_Skip_Spaces( parser );
+    cur = parser->root.cursor;
+    if ( cur >= limit )
+    {
+      FT_ERROR(( "parse_encoding: out of bounds\n" ));
+      parser->root.error = FT_THROW( Invalid_File_Format );
+      return;
+    }
+
+    /* if we have a number or `[', the encoding is an array, */
+    /* and we must load it now                               */
+    if ( ft_isdigit( *cur ) || *cur == '[' )
+    {
+      T1_Encoding  encode          = &face->type1.encoding;
+      FT_Int       count, n;
+      PS_Table     char_table      = &loader->encoding_table;
+      FT_Memory    memory          = parser->root.memory;
+      FT_Error     error;
+      FT_Bool      only_immediates = 0;
+
+
+      /* read the number of entries in the encoding; should be 256 */
+      if ( *cur == '[' )
+      {
+        count           = 256;
+        only_immediates = 1;
+        parser->root.cursor++;
+      }
+      else
+        count = (FT_Int)T1_ToInt( parser );
+
+      T1_Skip_Spaces( parser );
+      if ( parser->root.cursor >= limit )
+        return;
+
+      /* we use a T1_Table to store our charnames */
+      loader->num_chars = encode->num_chars = count;
+      if ( FT_NEW_ARRAY( encode->char_index, count )     ||
+           FT_NEW_ARRAY( encode->char_name,  count )     ||
+           FT_SET_ERROR( psaux->ps_table_funcs->init(
+                           char_table, count, memory ) ) )
+      {
+        parser->root.error = error;
+        return;
+      }
+
+      /* We need to `zero' out encoding_table.elements */
+      for ( n = 0; n < count; n++ )
+      {
+        char*  notdef = (char *)".notdef";
+
+
+        T1_Add_Table( char_table, n, notdef, 8 );
+      }
+
+      /* Now we need to read records of the form                */
+      /*                                                        */
+      /*   ... charcode /charname ...                           */
+      /*                                                        */
+      /* for each entry in our table.                           */
+      /*                                                        */
+      /* We simply look for a number followed by an immediate   */
+      /* name.  Note that this ignores correctly the sequence   */
+      /* that is often seen in type1 fonts:                     */
+      /*                                                        */
+      /*   0 1 255 { 1 index exch /.notdef put } for dup        */
+      /*                                                        */
+      /* used to clean the encoding array before anything else. */
+      /*                                                        */
+      /* Alternatively, if the array is directly given as       */
+      /*                                                        */
+      /*   /Encoding [ ... ]                                    */
+      /*                                                        */
+      /* we only read immediates.                               */
+
+      n = 0;
+      T1_Skip_Spaces( parser );
+
+      while ( parser->root.cursor < limit )
+      {
+        cur = parser->root.cursor;
+
+        /* we stop when we encounter a `def' or `]' */
+        if ( *cur == 'd' && cur + 3 < limit )
+        {
+          if ( cur[1] == 'e'         &&
+               cur[2] == 'f'         &&
+               IS_PS_DELIM( cur[3] ) )
+          {
+            FT_TRACE6(( "encoding end\n" ));
+            cur += 3;
+            break;
+          }
+        }
+        if ( *cur == ']' )
+        {
+          FT_TRACE6(( "encoding end\n" ));
+          cur++;
+          break;
+        }
+
+        /* check whether we've found an entry */
+        if ( ft_isdigit( *cur ) || only_immediates )
+        {
+          FT_Int  charcode;
+
+
+          if ( only_immediates )
+            charcode = n;
+          else
+          {
+            charcode = (FT_Int)T1_ToInt( parser );
+            T1_Skip_Spaces( parser );
+          }
+
+          cur = parser->root.cursor;
+
+          if ( cur + 2 < limit && *cur == '/' && n < count )
+          {
+            FT_PtrDist  len;
+
+
+            cur++;
+
+            parser->root.cursor = cur;
+            T1_Skip_PS_Token( parser );
+            if ( parser->root.cursor >= limit )
+              return;
+            if ( parser->root.error )
+              return;
+
+            len = parser->root.cursor - cur;
+
+            parser->root.error = T1_Add_Table( char_table, charcode,
+                                               cur, len + 1 );
+            if ( parser->root.error )
+              return;
+            char_table->elements[charcode][len] = '\0';
+
+            n++;
+          }
+          else if ( only_immediates )
+          {
+            /* Since the current position is not updated for           */
+            /* immediates-only mode we would get an infinite loop if   */
+            /* we don't do anything here.                              */
+            /*                                                         */
+            /* This encoding array is not valid according to the type1 */
+            /* specification (it might be an encoding for a CID type1  */
+            /* font, however), so we conclude that this font is NOT a  */
+            /* type1 font.                                             */
+            parser->root.error = FT_THROW( Unknown_File_Format );
+            return;
+          }
+        }
+        else
+        {
+          T1_Skip_PS_Token( parser );
+          if ( parser->root.error )
+            return;
+        }
+
+        T1_Skip_Spaces( parser );
+      }
+
+      face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY;
+      parser->root.cursor       = cur;
+    }
+
+    /* Otherwise, we should have either `StandardEncoding', */
+    /* `ExpertEncoding', or `ISOLatin1Encoding'             */
+    else
+    {
+      if ( cur + 17 < limit                                            &&
+           ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 )
+        face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD;
+
+      else if ( cur + 15 < limit                                          &&
+                ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 )
+        face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT;
+
+      else if ( cur + 18 < limit                                             &&
+                ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 )
+        face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;
+
+      else
+        parser->root.error = FT_ERR( Ignore );
+    }
+  }
+
+
+  static void
+  parse_subrs( T1_Face    face,
+               T1_Loader  loader )
+  {
+    T1_Parser  parser = &loader->parser;
+    PS_Table   table  = &loader->subrs;
+    FT_Memory  memory = parser->root.memory;
+    FT_Error   error;
+    FT_Int     num_subrs;
+
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+
+    T1_Skip_Spaces( parser );
+
+    /* test for empty array */
+    if ( parser->root.cursor < parser->root.limit &&
+         *parser->root.cursor == '['              )
+    {
+      T1_Skip_PS_Token( parser );
+      T1_Skip_Spaces  ( parser );
+      if ( parser->root.cursor >= parser->root.limit ||
+           *parser->root.cursor != ']'               )
+        parser->root.error = FT_THROW( Invalid_File_Format );
+      return;
+    }
+
+    num_subrs = (FT_Int)T1_ToInt( parser );
+
+    /* position the parser right before the `dup' of the first subr */
+    T1_Skip_PS_Token( parser );         /* `array' */
+    if ( parser->root.error )
+      return;
+    T1_Skip_Spaces( parser );
+
+    /* initialize subrs array -- with synthetic fonts it is possible */
+    /* we get here twice                                             */
+    if ( !loader->num_subrs )
+    {
+      error = psaux->ps_table_funcs->init( table, num_subrs, memory );
+      if ( error )
+        goto Fail;
+    }
+
+    /* the format is simple:   */
+    /*                         */
+    /*   `index' + binary data */
+    /*                         */
+    for (;;)
+    {
+      FT_Long   idx, size;
+      FT_Byte*  base;
+
+
+      /* If we are out of data, or if the next token isn't `dup', */
+      /* we are done.                                             */
+      if ( parser->root.cursor + 4 >= parser->root.limit          ||
+          ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 )
+        break;
+
+      T1_Skip_PS_Token( parser );       /* `dup' */
+
+      idx = T1_ToInt( parser );
+
+      if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )
+        return;
+
+      /* The binary string is followed by one token, e.g. `NP' */
+      /* (bound to `noaccess put') or by two separate tokens:  */
+      /* `noaccess' & `put'.  We position the parser right     */
+      /* before the next `dup', if any.                        */
+      T1_Skip_PS_Token( parser );   /* `NP' or `|' or `noaccess' */
+      if ( parser->root.error )
+        return;
+      T1_Skip_Spaces  ( parser );
+
+      if ( parser->root.cursor + 4 < parser->root.limit            &&
+           ft_strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 )
+      {
+        T1_Skip_PS_Token( parser ); /* skip `put' */
+        T1_Skip_Spaces  ( parser );
+      }
+
+      /* with synthetic fonts it is possible we get here twice */
+      if ( loader->num_subrs )
+        continue;
+
+      /* some fonts use a value of -1 for lenIV to indicate that */
+      /* the charstrings are unencoded                           */
+      /*                                                         */
+      /* thanks to Tom Kacvinsky for pointing this out           */
+      /*                                                         */
+      if ( face->type1.private_dict.lenIV >= 0 )
+      {
+        FT_Byte*  temp;
+
+
+        /* some fonts define empty subr records -- this is not totally */
+        /* compliant to the specification (which says they should at   */
+        /* least contain a `return'), but we support them anyway       */
+        if ( size < face->type1.private_dict.lenIV )
+        {
+          error = FT_THROW( Invalid_File_Format );
+          goto Fail;
+        }
+
+        /* t1_decrypt() shouldn't write to base -- make temporary copy */
+        if ( FT_ALLOC( temp, size ) )
+          goto Fail;
+        FT_MEM_COPY( temp, base, size );
+        psaux->t1_decrypt( temp, size, 4330 );
+        size -= face->type1.private_dict.lenIV;
+        error = T1_Add_Table( table, (FT_Int)idx,
+                              temp + face->type1.private_dict.lenIV, size );
+        FT_FREE( temp );
+      }
+      else
+        error = T1_Add_Table( table, (FT_Int)idx, base, size );
+      if ( error )
+        goto Fail;
+    }
+
+    if ( !loader->num_subrs )
+      loader->num_subrs = num_subrs;
+
+    return;
+
+  Fail:
+    parser->root.error = error;
+  }
+
+
+#define TABLE_EXTEND  5
+
+
+  static void
+  parse_charstrings( T1_Face    face,
+                     T1_Loader  loader )
+  {
+    T1_Parser      parser       = &loader->parser;
+    PS_Table       code_table   = &loader->charstrings;
+    PS_Table       name_table   = &loader->glyph_names;
+    PS_Table       swap_table   = &loader->swap_table;
+    FT_Memory      memory       = parser->root.memory;
+    FT_Error       error;
+
+    PSAux_Service  psaux        = (PSAux_Service)face->psaux;
+
+    FT_Byte*       cur;
+    FT_Byte*       limit        = parser->root.limit;
+    FT_Int         n, num_glyphs;
+    FT_UInt        notdef_index = 0;
+    FT_Byte        notdef_found = 0;
+
+
+    num_glyphs = (FT_Int)T1_ToInt( parser );
+    if ( num_glyphs < 0 )
+    {
+      error = FT_THROW( Invalid_File_Format );
+      goto Fail;
+    }
+
+    /* some fonts like Optima-Oblique not only define the /CharStrings */
+    /* array but access it also                                        */
+    if ( num_glyphs == 0 || parser->root.error )
+      return;
+
+    /* initialize tables, leaving space for addition of .notdef, */
+    /* if necessary, and a few other glyphs to handle buggy      */
+    /* fonts which have more glyphs than specified.              */
+
+    /* for some non-standard fonts like `Optima' which provides  */
+    /* different outlines depending on the resolution it is      */
+    /* possible to get here twice                                */
+    if ( !loader->num_glyphs )
+    {
+      error = psaux->ps_table_funcs->init(
+                code_table, num_glyphs + 1 + TABLE_EXTEND, memory );
+      if ( error )
+        goto Fail;
+
+      error = psaux->ps_table_funcs->init(
+                name_table, num_glyphs + 1 + TABLE_EXTEND, memory );
+      if ( error )
+        goto Fail;
+
+      /* Initialize table for swapping index notdef_index and */
+      /* index 0 names and codes (if necessary).              */
+
+      error = psaux->ps_table_funcs->init( swap_table, 4, memory );
+      if ( error )
+        goto Fail;
+    }
+
+    n = 0;
+
+    for (;;)
+    {
+      FT_Long   size;
+      FT_Byte*  base;
+
+
+      /* the format is simple:        */
+      /*   `/glyphname' + binary data */
+
+      T1_Skip_Spaces( parser );
+
+      cur = parser->root.cursor;
+      if ( cur >= limit )
+        break;
+
+      /* we stop when we find a `def' or `end' keyword */
+      if ( cur + 3 < limit && IS_PS_DELIM( cur[3] ) )
+      {
+        if ( cur[0] == 'd' &&
+             cur[1] == 'e' &&
+             cur[2] == 'f' )
+        {
+          /* There are fonts which have this: */
+          /*                                  */
+          /*   /CharStrings 118 dict def      */
+          /*   Private begin                  */
+          /*   CharStrings begin              */
+          /*   ...                            */
+          /*                                  */
+          /* To catch this we ignore `def' if */
+          /* no charstring has actually been  */
+          /* seen.                            */
+          if ( n )
+            break;
+        }
+
+        if ( cur[0] == 'e' &&
+             cur[1] == 'n' &&
+             cur[2] == 'd' )
+          break;
+      }
+
+      T1_Skip_PS_Token( parser );
+      if ( parser->root.error )
+        return;
+
+      if ( *cur == '/' )
+      {
+        FT_PtrDist  len;
+
+
+        if ( cur + 1 >= limit )
+        {
+          error = FT_THROW( Invalid_File_Format );
+          goto Fail;
+        }
+
+        cur++;                              /* skip `/' */
+        len = parser->root.cursor - cur;
+
+        if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )
+          return;
+		/* xhl: Add boundary check here. Fix the bug reported by ifilter. */
+		/* TESTDOC: bug# 0018509, 45.pdf. */
+		if (base + size >= limit) {
+			error = T1_Err_Invalid_File_Format;
+			goto Fail;
+		}
+        /* for some non-standard fonts like `Optima' which provides */
+        /* different outlines depending on the resolution it is     */
+        /* possible to get here twice                               */
+        if ( loader->num_glyphs )
+          continue;
+
+        error = T1_Add_Table( name_table, n, cur, len + 1 );
+        if ( error )
+          goto Fail;
+
+        /* add a trailing zero to the name table */
+        name_table->elements[n][len] = '\0';
+
+        /* record index of /.notdef */
+        if ( *cur == '.'                                              &&
+             ft_strcmp( ".notdef",
+                        (const char*)(name_table->elements[n]) ) == 0 )
+        {
+          notdef_index = n;
+          notdef_found = 1;
+        }
+
+        if ( face->type1.private_dict.lenIV >= 0 &&
+             n < num_glyphs + TABLE_EXTEND       )
+        {
+          FT_Byte*  temp;
+
+
+          if ( size <= face->type1.private_dict.lenIV )
+          {
+            error = FT_THROW( Invalid_File_Format );
+            goto Fail;
+          }
+
+          /* t1_decrypt() shouldn't write to base -- make temporary copy */
+          if ( FT_ALLOC( temp, size ) )
+            goto Fail;
+          FT_MEM_COPY( temp, base, size );
+          psaux->t1_decrypt( temp, size, 4330 );
+          size -= face->type1.private_dict.lenIV;
+          error = T1_Add_Table( code_table, n,
+                                temp + face->type1.private_dict.lenIV, size );
+          FT_FREE( temp );
+        }
+        else
+          error = T1_Add_Table( code_table, n, base, size );
+        if ( error )
+          goto Fail;
+
+        n++;
+      }
+    }
+
+    loader->num_glyphs = n;
+
+    /* if /.notdef is found but does not occupy index 0, do our magic. */
+    if ( notdef_found                                                 &&
+         ft_strcmp( ".notdef", (const char*)name_table->elements[0] ) )
+    {
+      /* Swap glyph in index 0 with /.notdef glyph.  First, add index 0  */
+      /* name and code entries to swap_table.  Then place notdef_index   */
+      /* name and code entries into swap_table.  Then swap name and code */
+      /* entries at indices notdef_index and 0 using values stored in    */
+      /* swap_table.                                                     */
+
+      /* Index 0 name */
+      error = T1_Add_Table( swap_table, 0,
+                            name_table->elements[0],
+                            name_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      /* Index 0 code */
+      error = T1_Add_Table( swap_table, 1,
+                            code_table->elements[0],
+                            code_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      /* Index notdef_index name */
+      error = T1_Add_Table( swap_table, 2,
+                            name_table->elements[notdef_index],
+                            name_table->lengths [notdef_index] );
+      if ( error )
+        goto Fail;
+
+      /* Index notdef_index code */
+      error = T1_Add_Table( swap_table, 3,
+                            code_table->elements[notdef_index],
+                            code_table->lengths [notdef_index] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( name_table, notdef_index,
+                            swap_table->elements[0],
+                            swap_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( code_table, notdef_index,
+                            swap_table->elements[1],
+                            swap_table->lengths [1] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( name_table, 0,
+                            swap_table->elements[2],
+                            swap_table->lengths [2] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( code_table, 0,
+                            swap_table->elements[3],
+                            swap_table->lengths [3] );
+      if ( error )
+        goto Fail;
+
+    }
+    else if ( !notdef_found )
+    {
+      /* notdef_index is already 0, or /.notdef is undefined in   */
+      /* charstrings dictionary.  Worry about /.notdef undefined. */
+      /* We take index 0 and add it to the end of the table(s)    */
+      /* and add our own /.notdef glyph to index 0.               */
+
+      /* 0 333 hsbw endchar */
+      FT_Byte  notdef_glyph[] = { 0x8B, 0xF7, 0xE1, 0x0D, 0x0E };
+      char*    notdef_name    = (char *)".notdef";
+
+
+      error = T1_Add_Table( swap_table, 0,
+                            name_table->elements[0],
+                            name_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( swap_table, 1,
+                            code_table->elements[0],
+                            code_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( name_table, 0, notdef_name, 8 );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( code_table, 0, notdef_glyph, 5 );
+
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( name_table, n,
+                            swap_table->elements[0],
+                            swap_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( code_table, n,
+                            swap_table->elements[1],
+                            swap_table->lengths [1] );
+      if ( error )
+        goto Fail;
+
+      /* we added a glyph. */
+      loader->num_glyphs += 1;
+    }
+
+    return;
+
+  Fail:
+    parser->root.error = error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the token field static variables.  This is a set of            */
+  /* T1_FieldRec variables.                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static
+  const T1_FieldRec  t1_keywords[] =
+  {
+
+#include "t1tokens.h"
+
+    /* now add the special functions... */
+    T1_FIELD_CALLBACK( "FontMatrix",           t1_parse_font_matrix,
+                       T1_FIELD_DICT_FONTDICT )
+    T1_FIELD_CALLBACK( "Encoding",             parse_encoding,
+                       T1_FIELD_DICT_FONTDICT )
+    T1_FIELD_CALLBACK( "Subrs",                parse_subrs,
+                       T1_FIELD_DICT_PRIVATE )
+    T1_FIELD_CALLBACK( "CharStrings",          parse_charstrings,
+                       T1_FIELD_DICT_PRIVATE )
+    T1_FIELD_CALLBACK( "Private",              parse_private,
+                       T1_FIELD_DICT_FONTDICT )
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+    T1_FIELD_CALLBACK( "BlendDesignPositions", parse_blend_design_positions,
+                       T1_FIELD_DICT_FONTDICT )
+    T1_FIELD_CALLBACK( "BlendDesignMap",       parse_blend_design_map,
+                       T1_FIELD_DICT_FONTDICT )
+    T1_FIELD_CALLBACK( "BlendAxisTypes",       parse_blend_axis_types,
+                       T1_FIELD_DICT_FONTDICT )
+    T1_FIELD_CALLBACK( "WeightVector",         parse_weight_vector,
+                       T1_FIELD_DICT_FONTDICT )
+    T1_FIELD_CALLBACK( "BuildCharArray",       parse_buildchar,
+                       T1_FIELD_DICT_PRIVATE )
+#endif
+
+    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
+  };
+
+
+#define T1_FIELD_COUNT                                           \
+          ( sizeof ( t1_keywords ) / sizeof ( t1_keywords[0] ) )
+
+
+  static FT_Error
+  parse_dict( T1_Face    face,
+              T1_Loader  loader,
+              FT_Byte*   base,
+              FT_Long    size )
+  {
+    T1_Parser  parser = &loader->parser;
+    FT_Byte   *limit, *start_binary = NULL;
+    FT_Bool    have_integer = 0;
+
+
+    parser->root.cursor = base;
+    parser->root.limit  = base + size;
+    parser->root.error  = FT_Err_Ok;
+
+    limit = parser->root.limit;
+
+    T1_Skip_Spaces( parser );
+
+    while ( parser->root.cursor < limit )
+    {
+      FT_Byte*  cur;
+
+
+      cur = parser->root.cursor;
+
+      /* look for `eexec' */
+      if ( IS_PS_TOKEN( cur, limit, "eexec" ) )
+        break;
+
+      /* look for `closefile' which ends the eexec section */
+      else if ( IS_PS_TOKEN( cur, limit, "closefile" ) )
+        break;
+
+      /* in a synthetic font the base font starts after a           */
+      /* `FontDictionary' token that is placed after a Private dict */
+      else if ( IS_PS_TOKEN( cur, limit, "FontDirectory" ) )
+      {
+        if ( loader->keywords_encountered & T1_PRIVATE )
+          loader->keywords_encountered |=
+            T1_FONTDIR_AFTER_PRIVATE;
+        parser->root.cursor += 13;
+      }
+
+      /* check whether we have an integer */
+      else if ( ft_isdigit( *cur ) )
+      {
+        start_binary = cur;
+        T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
+        have_integer = 1;
+      }
+
+      /* in valid Type 1 fonts we don't see `RD' or `-|' directly */
+      /* since those tokens are handled by parse_subrs and        */
+      /* parse_charstrings                                        */
+      else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' &&
+                have_integer )
+      {
+        FT_Long   s;
+        FT_Byte*  b;
+
+
+        parser->root.cursor = start_binary;
+        if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )
+          return FT_THROW( Invalid_File_Format );
+        have_integer = 0;
+      }
+
+      else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' &&
+                have_integer )
+      {
+        FT_Long   s;
+        FT_Byte*  b;
+
+
+        parser->root.cursor = start_binary;
+        if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )
+          return FT_THROW( Invalid_File_Format );
+        have_integer = 0;
+      }
+
+      /* look for immediates */
+      else if ( *cur == '/' && cur + 2 < limit )
+      {
+        FT_PtrDist  len;
+
+
+        cur++;
+
+        parser->root.cursor = cur;
+        T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
+
+        len = parser->root.cursor - cur;
+
+        if ( len > 0 && len < 22 && parser->root.cursor < limit )
+        {
+          /* now compare the immediate name to the keyword table */
+          T1_Field  keyword = (T1_Field)t1_keywords;
+
+
+          for (;;)
+          {
+            FT_Byte*  name;
+
+
+            name = (FT_Byte*)keyword->ident;
+            if ( !name )
+              break;
+
+            if ( cur[0] == name[0]                                  &&
+                 len == (FT_PtrDist)ft_strlen( (const char *)name ) &&
+                 ft_memcmp( cur, name, len ) == 0                   )
+            {
+              /* We found it -- run the parsing callback!     */
+              /* We record every instance of every field      */
+              /* (until we reach the base font of a           */
+              /* synthetic font) to deal adequately with      */
+              /* multiple master fonts; this is also          */
+              /* necessary because later PostScript           */
+              /* definitions override earlier ones.           */
+
+              /* Once we encounter `FontDirectory' after      */
+              /* `/Private', we know that this is a synthetic */
+              /* font; except for `/CharStrings' we are not   */
+              /* interested in anything that follows this     */
+              /* `FontDirectory'.                             */
+
+              /* MM fonts have more than one /Private token at */
+              /* the top level; let's hope that all the junk   */
+              /* that follows the first /Private token is not  */
+              /* interesting to us.                            */
+
+              /* According to Adobe Tech Note #5175 (CID-Keyed */
+              /* Font Installation for ATM Software) a `begin' */
+              /* must be followed by exactly one `end', and    */
+              /* `begin' -- `end' pairs must be accurately     */
+              /* paired.  We could use this to distinguish     */
+              /* between the global Private and the Private    */
+              /* dict that is a member of the Blend dict.      */
+
+              const FT_UInt dict =
+                ( loader->keywords_encountered & T1_PRIVATE )
+                    ? T1_FIELD_DICT_PRIVATE
+                    : T1_FIELD_DICT_FONTDICT;
+
+              if ( !( dict & keyword->dict ) )
+              {
+                FT_TRACE1(( "parse_dict: found `%s' but ignoring it"
+                            " since it is in the wrong dictionary\n",
+                            keyword->ident ));
+                break;
+              }
+
+              if ( !( loader->keywords_encountered &
+                      T1_FONTDIR_AFTER_PRIVATE     )                  ||
+                   ft_strcmp( (const char*)name, "CharStrings" ) == 0 )
+              {
+                parser->root.error = t1_load_keyword( face,
+                                                      loader,
+                                                      keyword );
+                if ( parser->root.error != FT_Err_Ok )
+                {
+                  if ( FT_ERR_EQ( parser->root.error, Ignore ) )
+                    parser->root.error = FT_Err_Ok;
+                  else
+                    return parser->root.error;
+                }
+              }
+              break;
+            }
+
+            keyword++;
+          }
+        }
+
+        have_integer = 0;
+      }
+      else
+      {
+        T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
+        have_integer = 0;
+      }
+
+      T1_Skip_Spaces( parser );
+    }
+
+  Exit:
+    return parser->root.error;
+  }
+
+
+  static void
+  t1_init_loader( T1_Loader  loader,
+                  T1_Face    face )
+  {
+    FT_UNUSED( face );
+
+    FT_MEM_ZERO( loader, sizeof ( *loader ) );
+    loader->num_glyphs = 0;
+    loader->num_chars  = 0;
+
+    /* initialize the tables -- simply set their `init' field to 0 */
+    loader->encoding_table.init  = 0;
+    loader->charstrings.init     = 0;
+    loader->glyph_names.init     = 0;
+    loader->subrs.init           = 0;
+    loader->swap_table.init      = 0;
+    loader->fontdata             = 0;
+    loader->keywords_encountered = 0;
+  }
+
+
+  static void
+  t1_done_loader( T1_Loader  loader )
+  {
+    T1_Parser  parser = &loader->parser;
+
+
+    /* finalize tables */
+    T1_Release_Table( &loader->encoding_table );
+    T1_Release_Table( &loader->charstrings );
+    T1_Release_Table( &loader->glyph_names );
+    T1_Release_Table( &loader->swap_table );
+    T1_Release_Table( &loader->subrs );
+
+    /* finalize parser */
+    T1_Finalize_Parser( parser );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Open_Face( T1_Face  face )
+  {
+    T1_LoaderRec   loader;
+    T1_Parser      parser;
+    T1_Font        type1 = &face->type1;
+    PS_Private     priv  = &type1->private_dict;
+    FT_Error       error;
+
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+
+    t1_init_loader( &loader, face );
+
+    /* default values */
+    face->ndv_idx          = -1;
+    face->cdv_idx          = -1;
+    face->len_buildchar    = 0;
+
+    priv->blue_shift       = 7;
+    priv->blue_fuzz        = 1;
+    priv->lenIV            = 4;
+    priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );
+    priv->blue_scale       = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );
+
+    parser = &loader.parser;
+    error  = T1_New_Parser( parser,
+                            face->root.stream,
+                            face->root.memory,
+                            psaux );
+    if ( error )
+      goto Exit;
+
+    error = parse_dict( face, &loader,
+                        parser->base_dict, parser->base_len );
+    if ( error )
+      goto Exit;
+
+    error = T1_Get_Private_Dict( parser, psaux );
+    if ( error )
+      goto Exit;
+
+    error = parse_dict( face, &loader,
+                        parser->private_dict, parser->private_len );
+    if ( error )
+      goto Exit;
+
+    /* ensure even-ness of `num_blue_values' */
+    priv->num_blue_values &= ~1;
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+    if ( face->blend                                                     &&
+         face->blend->num_default_design_vector != 0                     &&
+         face->blend->num_default_design_vector != face->blend->num_axis )
+    {
+      /* we don't use it currently so just warn, reset, and ignore */
+      FT_ERROR(( "T1_Open_Face(): /DesignVector contains %u entries "
+                 "while there are %u axes.\n",
+                 face->blend->num_default_design_vector,
+                 face->blend->num_axis ));
+
+      face->blend->num_default_design_vector = 0;
+    }
+
+    /* the following can happen for MM instances; we then treat the */
+    /* font as a normal PS font                                     */
+    if ( face->blend                                             &&
+         ( !face->blend->num_designs || !face->blend->num_axis ) )
+      T1_Done_Blend( face );
+
+    /* another safety check */
+    if ( face->blend )
+    {
+      FT_UInt  i;
+
+
+      for ( i = 0; i < face->blend->num_axis; i++ )
+        if ( !face->blend->design_map[i].num_points )
+        {
+          T1_Done_Blend( face );
+          break;
+        }
+    }
+
+    if ( face->blend )
+    {
+      if ( face->len_buildchar > 0 )
+      {
+        FT_Memory  memory = face->root.memory;
+
+
+        if ( FT_NEW_ARRAY( face->buildchar, face->len_buildchar ) )
+        {
+          FT_ERROR(( "T1_Open_Face: cannot allocate BuildCharArray\n" ));
+          face->len_buildchar = 0;
+          goto Exit;
+        }
+      }
+    }
+    else
+      face->len_buildchar = 0;
+
+#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+    /* now, propagate the subrs, charstrings, and glyphnames tables */
+    /* to the Type1 data                                            */
+    type1->num_glyphs = loader.num_glyphs;
+
+    if ( loader.subrs.init )
+    {
+      loader.subrs.init  = 0;
+      type1->num_subrs   = loader.num_subrs;
+      type1->subrs_block = loader.subrs.block;
+      type1->subrs       = loader.subrs.elements;
+      type1->subrs_len   = loader.subrs.lengths;
+    }
+
+    if ( !IS_INCREMENTAL )
+      if ( !loader.charstrings.init )
+      {
+        FT_ERROR(( "T1_Open_Face: no `/CharStrings' array in face\n" ));
+        error = FT_THROW( Invalid_File_Format );
+      }
+
+    loader.charstrings.init  = 0;
+    type1->charstrings_block = loader.charstrings.block;
+    type1->charstrings       = loader.charstrings.elements;
+    type1->charstrings_len   = loader.charstrings.lengths;
+
+    /* we copy the glyph names `block' and `elements' fields; */
+    /* the `lengths' field must be released later             */
+    type1->glyph_names_block    = loader.glyph_names.block;
+    type1->glyph_names          = (FT_String**)loader.glyph_names.elements;
+    loader.glyph_names.block    = 0;
+    loader.glyph_names.elements = 0;
+
+    /* we must now build type1.encoding when we have a custom array */
+    if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY )
+    {
+      FT_Int    charcode, idx, min_char, max_char;
+      FT_Byte*  char_name;
+      FT_Byte*  glyph_name;
+
+
+      /* OK, we do the following: for each element in the encoding  */
+      /* table, look up the index of the glyph having the same name */
+      /* the index is then stored in type1.encoding.char_index, and */
+      /* the name to type1.encoding.char_name                       */
+
+      min_char = 0;
+      max_char = 0;
+
+      charcode = 0;
+      for ( ; charcode < loader.encoding_table.max_elems; charcode++ )
+      {
+        type1->encoding.char_index[charcode] = 0;
+        type1->encoding.char_name [charcode] = (char *)".notdef";
+
+        char_name = loader.encoding_table.elements[charcode];
+        if ( char_name )
+          for ( idx = 0; idx < type1->num_glyphs; idx++ )
+          {
+            glyph_name = (FT_Byte*)type1->glyph_names[idx];
+            if ( ft_strcmp( (const char*)char_name,
+                            (const char*)glyph_name ) == 0 )
+            {
+              type1->encoding.char_index[charcode] = (FT_UShort)idx;
+              type1->encoding.char_name [charcode] = (char*)glyph_name;
+
+              /* Change min/max encoded char only if glyph name is */
+              /* not /.notdef                                      */
+              if ( ft_strcmp( (const char*)".notdef",
+                              (const char*)glyph_name ) != 0 )
+              {
+                if ( charcode < min_char )
+                  min_char = charcode;
+                if ( charcode >= max_char )
+                  max_char = charcode + 1;
+              }
+              break;
+            }
+          }
+      }
+
+      type1->encoding.code_first = min_char;
+      type1->encoding.code_last  = max_char;
+      type1->encoding.num_chars  = loader.num_chars;
+    }
+
+  Exit:
+    t1_done_loader( &loader );
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.h
new file mode 100644
index 0000000..d01744c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1load.h                                                               */
+/*                                                                         */
+/*    Type 1 font loader (specification).                                  */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2006, 2007 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1LOAD_H__
+#define __T1LOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/ftmm.h"
+
+#include "t1parse.h"
+
+
+FT_BEGIN_HEADER
+
+
+  typedef struct  T1_Loader_
+  {
+    T1_ParserRec  parser;          /* parser used to read the stream */
+
+    FT_Int        num_chars;       /* number of characters in encoding */
+    PS_TableRec   encoding_table;  /* PS_Table used to store the       */
+                                   /* encoding character names         */
+
+    FT_Int        num_glyphs;
+    PS_TableRec   glyph_names;
+    PS_TableRec   charstrings;
+    PS_TableRec   swap_table;      /* For moving .notdef glyph to index 0. */
+
+    FT_Int        num_subrs;
+    PS_TableRec   subrs;
+    FT_Bool       fontdata;
+
+    FT_UInt       keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */
+
+  } T1_LoaderRec, *T1_Loader;
+
+
+  /* treatment of some keywords differs depending on whether */
+  /* they precede or follow certain other keywords           */
+
+#define T1_PRIVATE                ( 1 << 0 )
+#define T1_FONTDIR_AFTER_PRIVATE  ( 1 << 1 )
+
+
+  FT_LOCAL( FT_Error )
+  T1_Open_Face( T1_Face  face );
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+  FT_LOCAL( FT_Error )
+  T1_Get_Multi_Master( T1_Face           face,
+                       FT_Multi_Master*  master );
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_MM_Var( T1_Face      face,
+                 FT_MM_Var*  *master );
+
+  FT_LOCAL( FT_Error )
+  T1_Set_MM_Blend( T1_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords );
+
+  FT_LOCAL( FT_Error )
+  T1_Set_MM_Design( T1_Face   face,
+                    FT_UInt   num_coords,
+                    FT_Long*  coords );
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Set_Var_Design( T1_Face    face,
+                     FT_UInt    num_coords,
+                     FT_Fixed*  coords );
+
+  FT_LOCAL( void )
+  T1_Done_Blend( T1_Face  face );
+
+#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+
+FT_END_HEADER
+
+#endif /* __T1LOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.c
new file mode 100644
index 0000000..81b2303
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.c
@@ -0,0 +1,616 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1objs.c                                                               */
+/*                                                                         */
+/*    Type 1 objects manager (body).                                       */
+/*                                                                         */
+/*  Copyright 1996-2009, 2011, 2013 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/ttnameid.h"
+
+#include "t1gload.h"
+#include "t1load.h"
+
+#include "t1errors.h"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "t1afm.h"
+#endif
+
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/psaux.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1objs
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            SIZE FUNCTIONS                             */
+  /*                                                                       */
+  /*  note that we store the global hints in the size's "internal" root    */
+  /*  field                                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static PSH_Globals_Funcs
+  T1_Size_Get_Globals_Funcs( T1_Size  size )
+  {
+    T1_Face           face     = (T1_Face)size->root.face;
+    PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;
+    FT_Module         module;
+
+
+    module = FT_Get_Module( size->root.face->driver->root.library,
+                            "pshinter" );
+    return ( module && pshinter && pshinter->get_globals_funcs )
+           ? pshinter->get_globals_funcs( module )
+           : 0 ;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  T1_Size_Done( FT_Size  t1size )          /* T1_Size */
+  {
+    T1_Size  size = (T1_Size)t1size;
+
+
+    if ( size->root.internal )
+    {
+      PSH_Globals_Funcs  funcs;
+
+
+      funcs = T1_Size_Get_Globals_Funcs( size );
+      if ( funcs )
+        funcs->destroy( (PSH_Globals)size->root.internal );
+
+      size->root.internal = 0;
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Size_Init( FT_Size  t1size )      /* T1_Size */
+  {
+    T1_Size            size  = (T1_Size)t1size;
+    FT_Error           error = FT_Err_Ok;
+    PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );
+
+
+    if ( funcs )
+    {
+      PSH_Globals  globals;
+      T1_Face      face = (T1_Face)size->root.face;
+
+
+      error = funcs->create( size->root.face->memory,
+                             &face->type1.private_dict, &globals );
+      if ( !error )
+        size->root.internal = (FT_Size_Internal)(void*)globals;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Size_Request( FT_Size          t1size,     /* T1_Size */
+                   FT_Size_Request  req )
+  {
+    T1_Size            size  = (T1_Size)t1size;
+    PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );
+
+
+    FT_Request_Metrics( size->root.face, req );
+
+    if ( funcs )
+      funcs->set_scale( (PSH_Globals)size->root.internal,
+                        size->root.metrics.x_scale,
+                        size->root.metrics.y_scale,
+                        0, 0 );
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            SLOT  FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  T1_GlyphSlot_Done( FT_GlyphSlot  slot )
+  {
+    slot->internal->glyph_hints = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_GlyphSlot_Init( FT_GlyphSlot  slot )
+  {
+    T1_Face           face;
+    PSHinter_Service  pshinter;
+
+
+    face     = (T1_Face)slot->face;
+    pshinter = (PSHinter_Service)face->pshinter;
+
+    if ( pshinter )
+    {
+      FT_Module  module;
+
+
+      module = FT_Get_Module( slot->face->driver->root.library,
+                              "pshinter" );
+      if ( module )
+      {
+        T1_Hints_Funcs  funcs;
+
+
+        funcs = pshinter->get_t1_funcs( module );
+        slot->internal->glyph_hints = (void*)funcs;
+      }
+    }
+
+    return 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            FACE  FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    T1_Face_Done                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The face object destructor.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A typeless pointer to the face object to destroy.          */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  T1_Face_Done( FT_Face  t1face )         /* T1_Face */
+  {
+    T1_Face    face = (T1_Face)t1face;
+    FT_Memory  memory;
+    T1_Font    type1;
+
+
+    if ( !face )
+      return;
+
+    memory = face->root.memory;
+    type1  = &face->type1;
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+    /* release multiple masters information */
+    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
+
+    if ( face->buildchar )
+    {
+      FT_FREE( face->buildchar );
+
+      face->buildchar     = NULL;
+      face->len_buildchar = 0;
+    }
+
+    T1_Done_Blend( face );
+    face->blend = 0;
+#endif
+
+    /* release font info strings */
+    {
+      PS_FontInfo  info = &type1->font_info;
+
+
+      FT_FREE( info->version );
+      FT_FREE( info->notice );
+      FT_FREE( info->full_name );
+      FT_FREE( info->family_name );
+      FT_FREE( info->weight );
+    }
+
+    /* release top dictionary */
+    FT_FREE( type1->charstrings_len );
+    FT_FREE( type1->charstrings );
+    FT_FREE( type1->glyph_names );
+
+    FT_FREE( type1->subrs );
+    FT_FREE( type1->subrs_len );
+
+    FT_FREE( type1->subrs_block );
+    FT_FREE( type1->charstrings_block );
+    FT_FREE( type1->glyph_names_block );
+
+    FT_FREE( type1->encoding.char_index );
+    FT_FREE( type1->encoding.char_name );
+    FT_FREE( type1->font_name );
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+    /* release afm data if present */
+    if ( face->afm_data )
+      T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data );
+#endif
+
+    /* release unicode map, if any */
+#if 0
+    FT_FREE( face->unicode_map_rec.maps );
+    face->unicode_map_rec.num_maps = 0;
+    face->unicode_map              = NULL;
+#endif
+
+    face->root.family_name = NULL;
+    face->root.style_name  = NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    T1_Face_Init                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The face object constructor.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     ::  input stream where to load font data.               */
+  /*                                                                       */
+  /*    face_index :: The index of the font face in the resource.          */
+  /*                                                                       */
+  /*    num_params :: Number of additional generic parameters.  Ignored.   */
+  /*                                                                       */
+  /*    params     :: Additional generic parameters.  Ignored.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The face record to build.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  T1_Face_Init( FT_Stream      stream,
+                FT_Face        t1face,          /* T1_Face */
+                FT_Int         face_index,
+                FT_Int         num_params,
+                FT_Parameter*  params )
+  {
+    T1_Face             face = (T1_Face)t1face;
+    FT_Error            error;
+    FT_Service_PsCMaps  psnames;
+    PSAux_Service       psaux;
+    T1_Font             type1 = &face->type1;
+    PS_FontInfo         info = &type1->font_info;
+
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+    FT_UNUSED( stream );
+
+
+    face->root.num_faces = 1;
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+    face->psnames = psnames;
+
+    face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
+                                           "psaux" );
+    psaux = (PSAux_Service)face->psaux;
+    if ( !psaux )
+    {
+      FT_ERROR(( "T1_Face_Init: cannot access `psaux' module\n" ));
+      error = FT_THROW( Missing_Module );
+      goto Exit;
+    }
+
+    face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
+                                              "pshinter" );
+
+    FT_TRACE2(( "Type 1 driver\n" ));
+
+    /* open the tokenizer; this will also check the font format */
+    error = T1_Open_Face( face );
+    if ( error )
+      goto Exit;
+
+    /* if we just wanted to check the format, leave successfully now */
+    if ( face_index < 0 )
+      goto Exit;
+
+    /* check the face index */
+    if ( face_index > 0 )
+    {
+      FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    /* now load the font program into the face object */
+
+    /* initialize the face object fields */
+
+    /* set up root face fields */
+    {
+      FT_Face  root = (FT_Face)&face->root;
+
+
+      root->num_glyphs = type1->num_glyphs;
+      root->face_index = 0;
+
+      root->face_flags = FT_FACE_FLAG_SCALABLE    |
+                         FT_FACE_FLAG_HORIZONTAL  |
+                         FT_FACE_FLAG_GLYPH_NAMES |
+                         FT_FACE_FLAG_HINTER;
+
+      if ( info->is_fixed_pitch )
+        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+      if ( face->blend )
+        root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
+
+      /* XXX: TODO -- add kerning with .afm support */
+
+
+      /* The following code to extract the family and the style is very   */
+      /* simplistic and might get some things wrong.  For a full-featured */
+      /* algorithm you might have a look at the whitepaper given at       */
+      /*                                                                  */
+      /*   http://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */
+
+      /* get style name -- be careful, some broken fonts only */
+      /* have a `/FontName' dictionary entry!                 */
+      root->family_name = info->family_name;
+      root->style_name  = NULL;
+
+      if ( root->family_name )
+      {
+        char*  full   = info->full_name;
+        char*  family = root->family_name;
+
+
+        if ( full )
+        {
+          FT_Bool  the_same = TRUE;
+
+
+          while ( *full )
+          {
+            if ( *full == *family )
+            {
+              family++;
+              full++;
+            }
+            else
+            {
+              if ( *full == ' ' || *full == '-' )
+                full++;
+              else if ( *family == ' ' || *family == '-' )
+                family++;
+              else
+              {
+                the_same = FALSE;
+
+                if ( !*family )
+                  root->style_name = full;
+                break;
+              }
+            }
+          }
+
+          if ( the_same )
+            root->style_name = (char *)"Regular";
+        }
+      }
+      else
+      {
+        /* do we have a `/FontName'? */
+        if ( type1->font_name )
+          root->family_name = type1->font_name;
+      }
+
+      if ( !root->style_name )
+      {
+        if ( info->weight )
+          root->style_name = info->weight;
+        else
+          /* assume `Regular' style because we don't know better */
+          root->style_name = (char *)"Regular";
+      }
+
+      /* compute style flags */
+      root->style_flags = 0;
+      if ( info->italic_angle )
+        root->style_flags |= FT_STYLE_FLAG_ITALIC;
+      if ( info->weight )
+      {
+        if ( !ft_strcmp( info->weight, "Bold"  ) ||
+             !ft_strcmp( info->weight, "Black" ) )
+          root->style_flags |= FT_STYLE_FLAG_BOLD;
+      }
+
+      /* no embedded bitmap support */
+      root->num_fixed_sizes = 0;
+      root->available_sizes = 0;
+
+      root->bbox.xMin =   type1->font_bbox.xMin            >> 16;
+      root->bbox.yMin =   type1->font_bbox.yMin            >> 16;
+      /* no `U' suffix here to 0xFFFF! */
+      root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFF ) >> 16;
+      root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFF ) >> 16;
+
+      /* Set units_per_EM if we didn't set it in t1_parse_font_matrix. */
+      if ( !root->units_per_EM )
+        root->units_per_EM = 1000;
+
+      root->ascender  = (FT_Short)( root->bbox.yMax );
+      root->descender = (FT_Short)( root->bbox.yMin );
+
+      root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 );
+      if ( root->height < root->ascender - root->descender )
+        root->height = (FT_Short)( root->ascender - root->descender );
+
+      /* now compute the maximum advance width */
+      root->max_advance_width =
+        (FT_Short)( root->bbox.xMax );
+      {
+        FT_Pos  max_advance;
+
+
+        error = T1_Compute_Max_Advance( face, &max_advance );
+
+        /* in case of error, keep the standard width */
+        if ( !error )
+          root->max_advance_width = (FT_Short)FIXED_TO_INT( max_advance );
+        else
+          error = FT_Err_Ok;   /* clear error */
+      }
+
+      root->max_advance_height = root->height;
+
+      root->underline_position  = (FT_Short)info->underline_position;
+      root->underline_thickness = (FT_Short)info->underline_thickness;
+    }
+
+    {
+      FT_Face  root = &face->root;
+
+
+      if ( psnames )
+      {
+        FT_CharMapRec    charmap;
+        T1_CMap_Classes  cmap_classes = psaux->t1_cmap_classes;
+        FT_CMap_Class    clazz;
+
+
+        charmap.face = root;
+
+        /* first of all, try to synthesize a Unicode charmap */
+        charmap.platform_id = TT_PLATFORM_MICROSOFT;
+        charmap.encoding_id = TT_MS_ID_UNICODE_CS;
+        charmap.encoding    = FT_ENCODING_UNICODE;
+
+        error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );
+        if ( error                                      &&
+             FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )
+          goto Exit;
+        error = FT_Err_Ok;
+
+        /* now, generate an Adobe Standard encoding when appropriate */
+        charmap.platform_id = TT_PLATFORM_ADOBE;
+        clazz               = NULL;
+
+        switch ( type1->encoding_type )
+        {
+        case T1_ENCODING_TYPE_STANDARD:
+          charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;
+          charmap.encoding_id = TT_ADOBE_ID_STANDARD;
+          clazz               = cmap_classes->standard;
+          break;
+
+        case T1_ENCODING_TYPE_EXPERT:
+          charmap.encoding    = FT_ENCODING_ADOBE_EXPERT;
+          charmap.encoding_id = TT_ADOBE_ID_EXPERT;
+          clazz               = cmap_classes->expert;
+          break;
+
+        case T1_ENCODING_TYPE_ARRAY:
+          charmap.encoding    = FT_ENCODING_ADOBE_CUSTOM;
+          charmap.encoding_id = TT_ADOBE_ID_CUSTOM;
+          clazz               = cmap_classes->custom;
+          break;
+
+        case T1_ENCODING_TYPE_ISOLATIN1:
+          charmap.encoding    = FT_ENCODING_ADOBE_LATIN_1;
+          charmap.encoding_id = TT_ADOBE_ID_LATIN_1;
+          clazz               = cmap_classes->unicode;
+          break;
+
+        default:
+          ;
+        }
+
+        if ( clazz )
+          error = FT_CMap_New( clazz, NULL, &charmap, NULL );
+
+#if 0
+        /* Select default charmap */
+        if (root->num_charmaps)
+          root->charmap = root->charmaps[0];
+#endif
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    T1_Driver_Init                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given Type 1 driver object.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target driver object.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  T1_Driver_Init( FT_Module  driver )
+  {
+    FT_UNUSED( driver );
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    T1_Driver_Done                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a given Type 1 driver.                                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target Type 1 driver.                    */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  T1_Driver_Done( FT_Module  driver )
+  {
+    FT_UNUSED( driver );
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.h
new file mode 100644
index 0000000..338cfc2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.h
@@ -0,0 +1,160 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1objs.h                                                               */
+/*                                                                         */
+/*    Type 1 objects manager (specification).                              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2006, 2011 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1OBJS_H__
+#define __T1OBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* The following structures must be defined by the hinter */
+  typedef struct T1_Size_Hints_   T1_Size_Hints;
+  typedef struct T1_Glyph_Hints_  T1_Glyph_Hints;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    T1_Size                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 size object.                                  */
+  /*                                                                       */
+  typedef struct T1_SizeRec_*  T1_Size;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    T1_GlyphSlot                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 glyph slot object.                            */
+  /*                                                                       */
+  typedef struct T1_GlyphSlotRec_*  T1_GlyphSlot;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    T1_CharMap                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 character mapping object.                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The Type 1 format doesn't use a charmap but an encoding table.     */
+  /*    The driver is responsible for making up charmap objects            */
+  /*    corresponding to these tables.                                     */
+  /*                                                                       */
+  typedef struct T1_CharMapRec_*   T1_CharMap;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                  HERE BEGINS THE TYPE1 SPECIFIC STUFF                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    T1_SizeRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Type 1 size record.                                                */
+  /*                                                                       */
+  typedef struct  T1_SizeRec_
+  {
+    FT_SizeRec  root;
+
+  } T1_SizeRec;
+
+
+  FT_LOCAL( void )
+  T1_Size_Done( FT_Size  size );
+
+  FT_LOCAL( FT_Error )
+  T1_Size_Request( FT_Size          size,
+                   FT_Size_Request  req );
+
+  FT_LOCAL( FT_Error )
+  T1_Size_Init( FT_Size  size );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    T1_GlyphSlotRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Type 1 glyph slot record.                                          */
+  /*                                                                       */
+  typedef struct  T1_GlyphSlotRec_
+  {
+    FT_GlyphSlotRec  root;
+
+    FT_Bool          hint;
+    FT_Bool          scaled;
+
+    FT_Int           max_points;
+    FT_Int           max_contours;
+
+    FT_Fixed         x_scale;
+    FT_Fixed         y_scale;
+
+  } T1_GlyphSlotRec;
+
+
+  FT_LOCAL( FT_Error )
+  T1_Face_Init( FT_Stream      stream,
+                FT_Face        face,
+                FT_Int         face_index,
+                FT_Int         num_params,
+                FT_Parameter*  params );
+
+  FT_LOCAL( void )
+  T1_Face_Done( FT_Face  face );
+
+  FT_LOCAL( FT_Error )
+  T1_GlyphSlot_Init( FT_GlyphSlot  slot );
+
+  FT_LOCAL( void )
+  T1_GlyphSlot_Done( FT_GlyphSlot  slot );
+
+  FT_LOCAL( FT_Error )
+  T1_Driver_Init( FT_Module  driver );
+
+  FT_LOCAL( void )
+  T1_Driver_Done( FT_Module  driver );
+
+
+FT_END_HEADER
+
+#endif /* __T1OBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.c
new file mode 100644
index 0000000..293d69a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.c
@@ -0,0 +1,497 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1parse.c                                                              */
+/*                                                                         */
+/*    Type 1 parser (body).                                                */
+/*                                                                         */
+/*  Copyright 1996-2005, 2008, 2009, 2012, 2013 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The Type 1 parser is in charge of the following:                      */
+  /*                                                                       */
+  /*  - provide an implementation of a growing sequence of objects called  */
+  /*    a `T1_Table' (used to build various tables needed by the loader).  */
+  /*                                                                       */
+  /*  - opening .pfb and .pfa files to extract their top-level and private */
+  /*    dictionaries.                                                      */
+  /*                                                                       */
+  /*  - read numbers, arrays & strings from any dictionary.                */
+  /*                                                                       */
+  /* See `t1load.c' to see how data is loaded from the font file.          */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/psaux.h"
+
+#include "t1parse.h"
+
+#include "t1errors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1parse
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                   INPUT STREAM PARSER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* see Adobe Technical Note 5040.Download_Fonts.pdf */
+
+  static FT_Error
+  read_pfb_tag( FT_Stream   stream,
+                FT_UShort  *atag,
+                FT_ULong   *asize )
+  {
+    FT_Error   error;
+    FT_UShort  tag;
+    FT_ULong   size;
+
+
+    *atag  = 0;
+    *asize = 0;
+
+    if ( !FT_READ_USHORT( tag ) )
+    {
+      if ( tag == 0x8001U || tag == 0x8002U )
+      {
+        if ( !FT_READ_ULONG_LE( size ) )
+          *asize = size;
+      }
+
+      *atag = tag;
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  check_type1_format( FT_Stream    stream,
+                      const char*  header_string,
+                      size_t       header_length )
+  {
+    FT_Error   error;
+    FT_UShort  tag;
+    FT_ULong   dummy;
+
+
+    if ( FT_STREAM_SEEK( 0 ) )
+      goto Exit;
+
+    error = read_pfb_tag( stream, &tag, &dummy );
+    if ( error )
+      goto Exit;
+
+    /* We assume that the first segment in a PFB is always encoded as   */
+    /* text.  This might be wrong (and the specification doesn't insist */
+    /* on that), but we have never seen a counterexample.               */
+    if ( tag != 0x8001U && FT_STREAM_SEEK( 0 ) )
+      goto Exit;
+
+    if ( !FT_FRAME_ENTER( header_length ) )
+    {
+      error = FT_Err_Ok;
+
+      if ( ft_memcmp( stream->cursor, header_string, header_length ) != 0 )
+        error = FT_THROW( Unknown_File_Format );
+
+      FT_FRAME_EXIT();
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_New_Parser( T1_Parser      parser,
+                 FT_Stream      stream,
+                 FT_Memory      memory,
+                 PSAux_Service  psaux )
+  {
+    FT_Error   error;
+    FT_UShort  tag;
+    FT_ULong   size;
+
+
+    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
+
+    parser->stream       = stream;
+    parser->base_len     = 0;
+    parser->base_dict    = 0;
+    parser->private_len  = 0;
+    parser->private_dict = 0;
+    parser->in_pfb       = 0;
+    parser->in_memory    = 0;
+    parser->single_block = 0;
+
+    /* check the header format */
+    error = check_type1_format( stream, "%!PS-AdobeFont", 14 );
+    if ( error )
+    {
+      if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
+        goto Exit;
+
+      error = check_type1_format( stream, "%!FontType", 10 );
+      if ( error )
+      {
+        FT_TRACE2(( "  not a Type 1 font\n" ));
+        goto Exit;
+      }
+    }
+
+    /******************************************************************/
+    /*                                                                */
+    /* Here a short summary of what is going on:                      */
+    /*                                                                */
+    /*   When creating a new Type 1 parser, we try to locate and load */
+    /*   the base dictionary if this is possible (i.e., for PFB       */
+    /*   files).  Otherwise, we load the whole font into memory.      */
+    /*                                                                */
+    /*   When `loading' the base dictionary, we only setup pointers   */
+    /*   in the case of a memory-based stream.  Otherwise, we         */
+    /*   allocate and load the base dictionary in it.                 */
+    /*                                                                */
+    /*   parser->in_pfb is set if we are in a binary (`.pfb') font.   */
+    /*   parser->in_memory is set if we have a memory stream.         */
+    /*                                                                */
+
+    /* try to compute the size of the base dictionary;     */
+    /* look for a Postscript binary file tag, i.e., 0x8001 */
+    if ( FT_STREAM_SEEK( 0L ) )
+      goto Exit;
+
+    error = read_pfb_tag( stream, &tag, &size );
+    if ( error )
+      goto Exit;
+
+    if ( tag != 0x8001U )
+    {
+      /* assume that this is a PFA file for now; an error will */
+      /* be produced later when more things are checked        */
+      if ( FT_STREAM_SEEK( 0L ) )
+        goto Exit;
+      size = stream->size;
+    }
+    else
+      parser->in_pfb = 1;
+
+    /* now, try to load `size' bytes of the `base' dictionary we */
+    /* found previously                                          */
+
+    /* if it is a memory-based resource, set up pointers */
+    if ( !stream->read )
+    {
+      parser->base_dict = (FT_Byte*)stream->base + stream->pos;
+      parser->base_len  = size;
+      parser->in_memory = 1;
+
+      /* check that the `size' field is valid */
+      if ( FT_STREAM_SKIP( size ) )
+        goto Exit;
+    }
+    else
+    {
+      /* read segment in memory -- this is clumsy, but so does the format */
+      if ( FT_ALLOC( parser->base_dict, size )       ||
+           FT_STREAM_READ( parser->base_dict, size ) )
+        goto Exit;
+      parser->base_len = size;
+    }
+
+    parser->root.base   = parser->base_dict;
+    parser->root.cursor = parser->base_dict;
+    parser->root.limit  = parser->root.cursor + parser->base_len;
+
+  Exit:
+    if ( error && !parser->in_memory )
+      FT_FREE( parser->base_dict );
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  T1_Finalize_Parser( T1_Parser  parser )
+  {
+    FT_Memory  memory = parser->root.memory;
+
+
+    /* always free the private dictionary */
+    FT_FREE( parser->private_dict );
+
+    /* free the base dictionary only when we have a disk stream */
+    if ( !parser->in_memory )
+      FT_FREE( parser->base_dict );
+
+    parser->root.funcs.done( &parser->root );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_Private_Dict( T1_Parser      parser,
+                       PSAux_Service  psaux )
+  {
+    FT_Stream  stream = parser->stream;
+    FT_Memory  memory = parser->root.memory;
+    FT_Error   error  = FT_Err_Ok;
+    FT_ULong   size;
+
+
+    if ( parser->in_pfb )
+    {
+      /* in the case of the PFB format, the private dictionary can be  */
+      /* made of several segments.  We thus first read the number of   */
+      /* segments to compute the total size of the private dictionary  */
+      /* then re-read them into memory.                                */
+      FT_Long    start_pos = FT_STREAM_POS();
+      FT_UShort  tag;
+
+
+      parser->private_len = 0;
+      for (;;)
+      {
+        error = read_pfb_tag( stream, &tag, &size );
+        if ( error )
+          goto Fail;
+
+        if ( tag != 0x8002U )
+          break;
+
+        parser->private_len += size;
+
+        if ( FT_STREAM_SKIP( size ) )
+          goto Fail;
+      }
+
+      /* Check that we have a private dictionary there */
+      /* and allocate private dictionary buffer        */
+      if ( parser->private_len == 0 )
+      {
+        FT_ERROR(( "T1_Get_Private_Dict:"
+                   " invalid private dictionary section\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Fail;
+      }
+
+      if ( FT_STREAM_SEEK( start_pos )                           ||
+           FT_ALLOC( parser->private_dict, parser->private_len ) )
+        goto Fail;
+
+      parser->private_len = 0;
+      for (;;)
+      {
+        error = read_pfb_tag( stream, &tag, &size );
+        if ( error || tag != 0x8002U )
+        {
+          error = FT_Err_Ok;
+          break;
+        }
+
+        if ( FT_STREAM_READ( parser->private_dict + parser->private_len,
+                             size ) )
+          goto Fail;
+
+        parser->private_len += size;
+      }
+    }
+    else
+    {
+      /* We have already `loaded' the whole PFA font file into memory; */
+      /* if this is a memory resource, allocate a new block to hold    */
+      /* the private dict.  Otherwise, simply overwrite into the base  */
+      /* dictionary block in the heap.                                 */
+
+      /* first of all, look at the `eexec' keyword */
+      FT_Byte*  cur   = parser->base_dict;
+      FT_Byte*  limit = cur + parser->base_len;
+      FT_Byte   c;
+
+
+    Again:
+      for (;;)
+      {
+        c = cur[0];
+        if ( c == 'e' && cur + 9 < limit )  /* 9 = 5 letters for `eexec' + */
+                                            /* whitespace + 4 chars        */
+        {
+          if ( cur[1] == 'e' &&
+               cur[2] == 'x' &&
+               cur[3] == 'e' &&
+               cur[4] == 'c' )
+            break;
+        }
+        cur++;
+        if ( cur >= limit )
+        {
+          FT_ERROR(( "T1_Get_Private_Dict:"
+                     " could not find `eexec' keyword\n" ));
+          error = FT_THROW( Invalid_File_Format );
+          goto Exit;
+        }
+      }
+
+      /* check whether `eexec' was real -- it could be in a comment */
+      /* or string (as e.g. in u003043t.gsf from ghostscript)       */
+
+      parser->root.cursor = parser->base_dict;
+      /* set limit to `eexec' + whitespace + 4 characters */
+      parser->root.limit  = cur + 10;
+
+      cur   = parser->root.cursor;
+      limit = parser->root.limit;
+
+      while ( cur < limit )
+      {
+        if ( *cur == 'e' && ft_strncmp( (char*)cur, "eexec", 5 ) == 0 )
+          goto Found;
+
+        T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          break;
+        T1_Skip_Spaces  ( parser );
+        cur = parser->root.cursor;
+      }
+
+      /* we haven't found the correct `eexec'; go back and continue */
+      /* searching                                                  */
+
+      cur   = limit;
+      limit = parser->base_dict + parser->base_len;
+      goto Again;
+
+      /* now determine where to write the _encrypted_ binary private  */
+      /* dictionary.  We overwrite the base dictionary for disk-based */
+      /* resources and allocate a new block otherwise                 */
+
+    Found:
+      parser->root.limit = parser->base_dict + parser->base_len;
+
+      T1_Skip_PS_Token( parser );
+      cur   = parser->root.cursor;
+      limit = parser->root.limit;
+
+      /* according to the Type1 spec, the first cipher byte must not be  */
+      /* an ASCII whitespace character code (blank, tab, carriage return */
+      /* or line feed).  We have seen Type 1 fonts with two line feed    */
+      /* characters...  So skip now all whitespace character codes.      */
+      while ( cur < limit       &&
+              ( *cur == ' '  ||
+                *cur == '\t' ||
+                *cur == '\r' ||
+                *cur == '\n' ) )
+        ++cur;
+      if ( cur >= limit )
+      {
+        FT_ERROR(( "T1_Get_Private_Dict:"
+                   " `eexec' not properly terminated\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      size = (FT_ULong)( parser->base_len - ( cur - parser->base_dict ) );
+
+      if ( parser->in_memory )
+      {
+        /* note that we allocate one more byte to put a terminating `0' */
+        if ( FT_ALLOC( parser->private_dict, size + 1 ) )
+          goto Fail;
+        parser->private_len = size;
+      }
+      else
+      {
+        parser->single_block = 1;
+        parser->private_dict = parser->base_dict;
+        parser->private_len  = size;
+        parser->base_dict    = 0;
+        parser->base_len     = 0;
+      }
+
+      /* now determine whether the private dictionary is encoded in binary */
+      /* or hexadecimal ASCII format -- decode it accordingly              */
+
+      /* we need to access the next 4 bytes (after the final whitespace */
+      /* following the `eexec' keyword); if they all are hexadecimal    */
+      /* digits, then we have a case of ASCII storage                   */
+
+      if ( cur + 3 < limit                                &&
+           ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) &&
+           ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) )
+      {
+        /* ASCII hexadecimal encoding */
+        FT_Long  len;
+
+
+        parser->root.cursor = cur;
+        (void)psaux->ps_parser_funcs->to_bytes( &parser->root,
+                                                parser->private_dict,
+                                                parser->private_len,
+                                                &len,
+                                                0 );
+        parser->private_len = len;
+
+        /* put a safeguard */
+        parser->private_dict[len] = '\0';
+      }
+      else
+        /* binary encoding -- copy the private dict */
+        FT_MEM_MOVE( parser->private_dict, cur, size );
+    }
+
+    /* we now decrypt the encoded binary private dictionary */
+    psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U );
+
+    if ( parser->private_len < 4 )
+    {
+      FT_ERROR(( "T1_Get_Private_Dict:"
+                 " invalid private dictionary section\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Fail;
+    }
+
+    /* replace the four random bytes at the beginning with whitespace */
+    parser->private_dict[0] = ' ';
+    parser->private_dict[1] = ' ';
+    parser->private_dict[2] = ' ';
+    parser->private_dict[3] = ' ';
+
+    parser->root.base   = parser->private_dict;
+    parser->root.cursor = parser->private_dict;
+    parser->root.limit  = parser->root.cursor + parser->private_len;
+
+  Fail:
+  Exit:
+    return error;
+  }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.h
new file mode 100644
index 0000000..8bb6c43
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.h
@@ -0,0 +1,135 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1parse.h                                                              */
+/*                                                                         */
+/*    Type 1 parser (specification).                                       */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2008 by                               */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1PARSE_H__
+#define __T1PARSE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/t1types.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    T1_ParserRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A PS_ParserRec is an object used to parse a Type 1 fonts very      */
+  /*    quickly.                                                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root         :: The root parser.                                   */
+  /*                                                                       */
+  /*    stream       :: The current input stream.                          */
+  /*                                                                       */
+  /*    base_dict    :: A pointer to the top-level dictionary.             */
+  /*                                                                       */
+  /*    base_len     :: The length in bytes of the top dictionary.         */
+  /*                                                                       */
+  /*    private_dict :: A pointer to the private dictionary.               */
+  /*                                                                       */
+  /*    private_len  :: The length in bytes of the private dictionary.     */
+  /*                                                                       */
+  /*    in_pfb       :: A boolean.  Indicates that we are handling a PFB   */
+  /*                    file.                                              */
+  /*                                                                       */
+  /*    in_memory    :: A boolean.  Indicates a memory-based stream.       */
+  /*                                                                       */
+  /*    single_block :: A boolean.  Indicates that the private dictionary  */
+  /*                    is stored in lieu of the base dictionary.          */
+  /*                                                                       */
+  typedef struct  T1_ParserRec_
+  {
+    PS_ParserRec  root;
+    FT_Stream     stream;
+
+    FT_Byte*      base_dict;
+    FT_ULong      base_len;
+
+    FT_Byte*      private_dict;
+    FT_ULong      private_len;
+
+    FT_Bool       in_pfb;
+    FT_Bool       in_memory;
+    FT_Bool       single_block;
+
+  } T1_ParserRec, *T1_Parser;
+
+
+#define T1_Add_Table( p, i, o, l )  (p)->funcs.add( (p), i, o, l )
+#define T1_Done_Table( p )          \
+          do                        \
+          {                         \
+            if ( (p)->funcs.done )  \
+              (p)->funcs.done( p ); \
+          } while ( 0 )
+#define T1_Release_Table( p )          \
+          do                           \
+          {                            \
+            if ( (p)->funcs.release )  \
+              (p)->funcs.release( p ); \
+          } while ( 0 )
+
+
+#define T1_Skip_Spaces( p )    (p)->root.funcs.skip_spaces( &(p)->root )
+#define T1_Skip_PS_Token( p )  (p)->root.funcs.skip_PS_token( &(p)->root )
+
+#define T1_ToInt( p )       (p)->root.funcs.to_int( &(p)->root )
+#define T1_ToFixed( p, t )  (p)->root.funcs.to_fixed( &(p)->root, t )
+
+#define T1_ToCoordArray( p, m, c )                           \
+          (p)->root.funcs.to_coord_array( &(p)->root, m, c )
+#define T1_ToFixedArray( p, m, f, t )                           \
+          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )
+#define T1_ToToken( p, t )                          \
+          (p)->root.funcs.to_token( &(p)->root, t )
+#define T1_ToTokenArray( p, t, m, c )                           \
+          (p)->root.funcs.to_token_array( &(p)->root, t, m, c )
+
+#define T1_Load_Field( p, f, o, m, pf )                         \
+          (p)->root.funcs.load_field( &(p)->root, f, o, m, pf )
+
+#define T1_Load_Field_Table( p, f, o, m, pf )                         \
+          (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf )
+
+
+  FT_LOCAL( FT_Error )
+  T1_New_Parser( T1_Parser      parser,
+                 FT_Stream      stream,
+                 FT_Memory      memory,
+                 PSAux_Service  psaux );
+
+  FT_LOCAL( FT_Error )
+  T1_Get_Private_Dict( T1_Parser      parser,
+                       PSAux_Service  psaux );
+
+  FT_LOCAL( void )
+  T1_Finalize_Parser( T1_Parser  parser );
+
+
+FT_END_HEADER
+
+#endif /* __T1PARSE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1tokens.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1tokens.h
new file mode 100644
index 0000000..e37276b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1tokens.h
@@ -0,0 +1,143 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1tokens.h                                                             */
+/*                                                                         */
+/*    Type 1 tokenizer (specification).                                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by             */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_FontInfoRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_INFO
+
+  T1_FIELD_STRING( "version",            version,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_STRING( "Notice",             notice,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_STRING( "FullName",           full_name,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_STRING( "FamilyName",         family_name,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_STRING( "Weight",             weight,
+                   T1_FIELD_DICT_FONTDICT )
+
+  /* we use pointers to detect modifications made by synthetic fonts */
+  T1_FIELD_NUM   ( "ItalicAngle",        italic_angle,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_BOOL  ( "isFixedPitch",       is_fixed_pitch,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_NUM   ( "UnderlinePosition",  underline_position,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness,
+                   T1_FIELD_DICT_FONTDICT )
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_FontExtraRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA
+
+  T1_FIELD_NUM   ( "FSType", fs_type,
+                   T1_FIELD_DICT_FONTDICT )
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_PrivateRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_PRIVATE
+
+  T1_FIELD_NUM       ( "UniqueID",         unique_id,
+                       T1_FIELD_DICT_FONTDICT | T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM       ( "lenIV",            lenIV,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM       ( "LanguageGroup",    language_group,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM       ( "password",         password,
+                       T1_FIELD_DICT_PRIVATE )
+
+  T1_FIELD_FIXED_1000( "BlueScale",        blue_scale,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM       ( "BlueShift",        blue_shift,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM       ( "BlueFuzz",         blue_fuzz,
+                       T1_FIELD_DICT_PRIVATE )
+
+  T1_FIELD_NUM_TABLE ( "BlueValues",       blue_values,        14,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM_TABLE ( "OtherBlues",       other_blues,        10,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM_TABLE ( "FamilyBlues",      family_blues,       14,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10,
+                       T1_FIELD_DICT_PRIVATE )
+
+  T1_FIELD_NUM_TABLE2( "StdHW",            standard_width,      1,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM_TABLE2( "StdVW",            standard_height,     1,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM_TABLE2( "MinFeature",       min_feature,         2,
+                       T1_FIELD_DICT_PRIVATE )
+
+  T1_FIELD_NUM_TABLE ( "StemSnapH",        snap_widths,        12,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM_TABLE ( "StemSnapV",        snap_heights,       12,
+                       T1_FIELD_DICT_PRIVATE )
+
+  T1_FIELD_FIXED     ( "ExpansionFactor",  expansion_factor,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_BOOL      ( "ForceBold",        force_bold,
+                       T1_FIELD_DICT_PRIVATE )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  T1_FontRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_DICT
+
+  T1_FIELD_KEY  ( "FontName",    font_name,    T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_NUM  ( "PaintType",   paint_type,   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_NUM  ( "FontType",    font_type,    T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_FIXED( "StrokeWidth", stroke_width, T1_FIELD_DICT_FONTDICT )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  FT_BBox
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_BBOX
+
+  T1_FIELD_BBOX( "FontBBox", xMin, T1_FIELD_DICT_FONTDICT )
+
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  T1_FaceRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FACE
+
+  T1_FIELD_NUM( "NDV", ndv_idx, T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM( "CDV", cdv_idx, T1_FIELD_DICT_PRIVATE )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_BlendRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_BLEND
+
+  T1_FIELD_NUM_TABLE( "DesignVector", default_design_vector,
+                      T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT )
+
+
+#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/include/fxft_cffobjs.h b/core/src/fxge/fx_freetype/include/fxft_cffobjs.h
new file mode 100644
index 0000000..c15e075
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_cffobjs.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_CFFOBJS_H_
+#define _FXFT_CFFOBJS_H_
+#include "../fxft2.5.01/src/cff/cffobjs.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_cfftypes.h b/core/src/fxge/fx_freetype/include/fxft_cfftypes.h
new file mode 100644
index 0000000..9fbb7a3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_cfftypes.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FREETYPE_H_
+#define _FXFT_FREETYPE_H_
+#include "../fxft2.5.01/src/cff/cfftypes.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_freetype.h b/core/src/fxge/fx_freetype/include/fxft_freetype.h
new file mode 100644
index 0000000..92ffde0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_freetype.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FREETYPE_H_
+#define _FXFT_FREETYPE_H_
+#include "../fxft2.5.01/include/freetype/freetype.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ft2build.h b/core/src/fxge/fx_freetype/include/fxft_ft2build.h
new file mode 100644
index 0000000..f3438d4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ft2build.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FT2BUILD_H_
+#define _FXFT_FT2BUILD_H_
+#include "../fxft2.5.01/include/ft2build.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftmm.h b/core/src/fxge/fx_freetype/include/fxft_ftmm.h
new file mode 100644
index 0000000..4b36ef7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftmm.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTMM_H_
+#define _FXFT_FTMM_H_
+#include "../fxft2.5.01/include/freetype/ftmm.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftobjs.h b/core/src/fxge/fx_freetype/include/fxft_ftobjs.h
new file mode 100644
index 0000000..40d7eaa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftobjs.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTOBJS_H_
+#define _FXFT_FTOBJS_H_
+#include "../fxft2.5.01/include/freetype/internal/ftobjs.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftotval.h b/core/src/fxge/fx_freetype/include/fxft_ftotval.h
new file mode 100644
index 0000000..f613aa7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftotval.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTOTVAL_H_
+#define _FXFT_FTOTVAL_H_
+#include "../fxft2.5.01/include/freetype/ftotval.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftoutln.h b/core/src/fxge/fx_freetype/include/fxft_ftoutln.h
new file mode 100644
index 0000000..14396d8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftoutln.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTOUTLN_H_
+#define _FXFT_FTOUTLN_H_
+#include "../fxft2.5.01/include/freetype/ftoutln.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftstream.h b/core/src/fxge/fx_freetype/include/fxft_ftstream.h
new file mode 100644
index 0000000..ff6a422
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftstream.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTSTREAM_H_
+#define _FXFT_FTSTREAM_H_
+#include "../fxft2.5.01/include/freetype/internal/ftstream.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_tttables.h b/core/src/fxge/fx_freetype/include/fxft_tttables.h
new file mode 100644
index 0000000..3b44fff
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_tttables.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_TTTABLES_H_
+#define _FXFT_TTTABLES_H_
+#include "../fxft2.5.01/include/freetype/tttables.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_tttypes.h b/core/src/fxge/fx_freetype/include/fxft_tttypes.h
new file mode 100644
index 0000000..06128de
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_tttypes.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_TTTYPES_H_
+#define _FXFT_TTTYPES_H_
+#include "../fxft2.5.01/include/freetype/internal/tttypes.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/src/fxft_cff.c b/core/src/fxge/fx_freetype/src/fxft_cff.c
new file mode 100644
index 0000000..e877b7d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_cff.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/cff/fxft_cff.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftbase.c b/core/src/fxge/fx_freetype/src/fxft_ftbase.c
new file mode 100644
index 0000000..d769aca
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftbase.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftbase.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftbitmap.c b/core/src/fxge/fx_freetype/src/fxft_ftbitmap.c
new file mode 100644
index 0000000..2edbc83
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftbitmap.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftbitmap.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftglyph.c b/core/src/fxge/fx_freetype/src/fxft_ftglyph.c
new file mode 100644
index 0000000..85855ac
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftglyph.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftglyph.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftinit.c b/core/src/fxge/fx_freetype/src/fxft_ftinit.c
new file mode 100644
index 0000000..2be4b7f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftinit.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftinit.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c b/core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c
new file mode 100644
index 0000000..8225ea0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftlcdfil.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftmm.c b/core/src/fxge/fx_freetype/src/fxft_ftmm.c
new file mode 100644
index 0000000..8506446
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftmm.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftmm.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftsystem.c b/core/src/fxge/fx_freetype/src/fxft_ftsystem.c
new file mode 100644
index 0000000..36182a3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftsystem.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftsystem.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_psaux.c b/core/src/fxge/fx_freetype/src/fxft_psaux.c
new file mode 100644
index 0000000..0c6d0cb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_psaux.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/psaux/fxft_psaux.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_pshinter.c b/core/src/fxge/fx_freetype/src/fxft_pshinter.c
new file mode 100644
index 0000000..02c5d41
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_pshinter.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/pshinter/fxft_pshinter.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_psmodule.c b/core/src/fxge/fx_freetype/src/fxft_psmodule.c
new file mode 100644
index 0000000..9495886
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_psmodule.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/psnames/fxft_psmodule.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_raster.c b/core/src/fxge/fx_freetype/src/fxft_raster.c
new file mode 100644
index 0000000..a616016
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_raster.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/raster/fxft_raster.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_sfnt.c b/core/src/fxge/fx_freetype/src/fxft_sfnt.c
new file mode 100644
index 0000000..6fa2b57
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_sfnt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/sfnt/fxft_sfnt.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_smooth.c b/core/src/fxge/fx_freetype/src/fxft_smooth.c
new file mode 100644
index 0000000..2cbfa01
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_smooth.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/smooth/fxft_smooth.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_truetype.c b/core/src/fxge/fx_freetype/src/fxft_truetype.c
new file mode 100644
index 0000000..6ed5496
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_truetype.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/truetype/fxft_truetype.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_type1.c b/core/src/fxge/fx_freetype/src/fxft_type1.c
new file mode 100644
index 0000000..d784e0a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_type1.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/type1/fxft_type1.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_type1cid.c b/core/src/fxge/fx_freetype/src/fxft_type1cid.c
new file mode 100644
index 0000000..b6319f6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_type1cid.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/cid/fxft_type1cid.c"
diff --git a/core/src/fxge/ge/fx_ge.cpp b/core/src/fxge/ge/fx_ge.cpp
new file mode 100644
index 0000000..df200d5
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge.cpp
@@ -0,0 +1,79 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#include "text_int.h"

+static CFX_GEModule* g_pGEModule = NULL;

+CFX_GEModule::CFX_GEModule()

+{

+    m_pFontCache = NULL;

+    m_pFontMgr = NULL;

+    m_FTLibrary = NULL;

+    m_pCodecModule = NULL;

+    m_pPlatformData = NULL;

+}

+CFX_GEModule::~CFX_GEModule()

+{

+    if (m_pFontCache) {

+        delete m_pFontCache;

+    }

+    m_pFontCache = NULL;

+    if (m_pFontMgr) {

+        delete m_pFontMgr;

+    }

+    m_pFontMgr = NULL;

+    DestroyPlatform();

+}

+CFX_GEModule* CFX_GEModule::Get()

+{

+    return g_pGEModule;

+}

+void CFX_GEModule::Create()

+{

+    g_pGEModule = FX_NEW CFX_GEModule;

+    if (!g_pGEModule) {

+        return;

+    }

+    g_pGEModule->m_pFontMgr = FX_NEW CFX_FontMgr;

+    g_pGEModule->InitPlatform();

+    g_pGEModule->SetTextGamma(2.2f);

+}

+void CFX_GEModule::Use(CFX_GEModule* pModule)

+{

+    g_pGEModule = pModule;

+}

+void CFX_GEModule::Destroy()

+{

+    if (g_pGEModule) {

+        delete g_pGEModule;

+    }

+    g_pGEModule = NULL;

+}

+CFX_FontCache* CFX_GEModule::GetFontCache()

+{

+    if (m_pFontCache == NULL) {

+        m_pFontCache = FX_NEW CFX_FontCache();

+    }

+    return m_pFontCache;

+}

+void CFX_GEModule::SetTextGamma(FX_FLOAT gammaValue)

+{

+    gammaValue /= 2.2f;

+    int i = 0;

+    while (i < 256) {

+        m_GammaValue[i] = (FX_BYTE)(FXSYS_pow((FX_FLOAT)i / 255, gammaValue) * 255.0f + 0.5f);

+        i++;

+    }

+}

+FX_LPCBYTE CFX_GEModule::GetTextGammaTable()

+{

+    return m_GammaValue;

+}

+void CFX_GEModule::SetExtFontMapper(IFX_FontMapper* pFontMapper)

+{

+    GetFontMgr()->m_pExtMapper = pFontMapper;

+    pFontMapper->m_pFontMgr = m_pFontMgr;

+}

diff --git a/core/src/fxge/ge/fx_ge_device.cpp b/core/src/fxge/ge/fx_ge_device.cpp
new file mode 100644
index 0000000..8f7ccdb
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_device.cpp
@@ -0,0 +1,405 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+CFX_RenderDevice::CFX_RenderDevice()

+{

+    m_pDeviceDriver = NULL;

+    m_pBitmap = NULL;

+}

+CFX_RenderDevice::~CFX_RenderDevice()

+{

+    if (m_pDeviceDriver) {

+        delete m_pDeviceDriver;

+    }

+}

+void CFX_RenderDevice::SetDeviceDriver(IFX_RenderDeviceDriver* pDriver)

+{

+    if (m_pDeviceDriver) {

+        delete m_pDeviceDriver;

+    }

+    m_pDeviceDriver = pDriver;

+    InitDeviceInfo();

+}

+void CFX_RenderDevice::InitDeviceInfo()

+{

+    ASSERT(m_pDeviceDriver != NULL);

+    m_Width = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_WIDTH);

+    m_Height = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_HEIGHT);

+    m_bpp = m_pDeviceDriver->GetDeviceCaps(FXDC_BITS_PIXEL);

+    m_RenderCaps = m_pDeviceDriver->GetDeviceCaps(FXDC_RENDER_CAPS);

+    m_DeviceClass = m_pDeviceDriver->GetDeviceCaps(FXDC_DEVICE_CLASS);

+    if (!m_pDeviceDriver->GetClipBox(&m_ClipBox)) {

+        m_ClipBox.left = 0;

+        m_ClipBox.top = 0;

+        m_ClipBox.right = m_Width;

+        m_ClipBox.bottom = m_Height;

+    }

+}

+FX_BOOL CFX_RenderDevice::StartRendering()

+{

+    return m_pDeviceDriver->StartRendering();

+}

+void CFX_RenderDevice::EndRendering()

+{

+    m_pDeviceDriver->EndRendering();

+}

+void CFX_RenderDevice::SaveState()

+{

+    m_pDeviceDriver->SaveState();

+}

+void CFX_RenderDevice::RestoreState(FX_BOOL bKeepSaved)

+{

+    m_pDeviceDriver->RestoreState(bKeepSaved);

+    UpdateClipBox();

+}

+int CFX_RenderDevice::GetDeviceCaps(int caps_id) const

+{

+    return m_pDeviceDriver->GetDeviceCaps(caps_id);

+}

+CFX_Matrix CFX_RenderDevice::GetCTM() const

+{

+    return m_pDeviceDriver->GetCTM();

+}

+FX_BOOL CFX_RenderDevice::CreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const

+{

+    if (m_RenderCaps & FXRC_CMYK_OUTPUT) {

+        return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Cmyka : FXDIB_Cmyk);

+    } else if (m_RenderCaps & FXRC_BYTEMASK_OUTPUT) {

+        return pDIB->Create(width, height, FXDIB_8bppMask);

+    } else

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+        return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb32);

+#else

+        return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb);

+#endif

+}

+FX_BOOL CFX_RenderDevice::SetClip_PathFill(const CFX_PathData* pPathData,

+        const CFX_AffineMatrix* pObject2Device,

+        int fill_mode

+                                          )

+{

+    if (!m_pDeviceDriver->SetClip_PathFill(pPathData, pObject2Device, fill_mode)) {

+        return FALSE;

+    }

+    UpdateClipBox();

+    return TRUE;

+}

+FX_BOOL CFX_RenderDevice::SetClip_PathStroke(const CFX_PathData* pPathData,

+        const CFX_AffineMatrix* pObject2Device,

+        const CFX_GraphStateData* pGraphState

+                                            )

+{

+    if (!m_pDeviceDriver->SetClip_PathStroke(pPathData, pObject2Device, pGraphState)) {

+        return FALSE;

+    }

+    UpdateClipBox();

+    return TRUE;

+}

+FX_BOOL CFX_RenderDevice::SetClip_Rect(const FX_RECT* pRect)

+{

+    CFX_PathData path;

+    path.AppendRect((FX_FLOAT)(pRect->left), (FX_FLOAT)(pRect->bottom), (FX_FLOAT)(pRect->right), (FX_FLOAT)(pRect->top));

+    if (!SetClip_PathFill(&path, NULL, FXFILL_WINDING)) {

+        return FALSE;

+    }

+    UpdateClipBox();

+    return TRUE;

+}

+void CFX_RenderDevice::UpdateClipBox()

+{

+    if (m_pDeviceDriver->GetClipBox(&m_ClipBox)) {

+        return;

+    }

+    m_ClipBox.left = 0;

+    m_ClipBox.top = 0;

+    m_ClipBox.right = m_Width;

+    m_ClipBox.bottom = m_Height;

+}

+FX_BOOL CFX_RenderDevice::DrawPath(const CFX_PathData* pPathData,

+                                   const CFX_AffineMatrix* pObject2Device,

+                                   const CFX_GraphStateData* pGraphState,

+                                   FX_DWORD fill_color, FX_DWORD stroke_color, int fill_mode,

+                                   int alpha_flag, void* pIccTransform, int blend_type)

+{

+    FX_BYTE fill_alpha, stroke_alpha;

+    if (FXGETFLAG_COLORTYPE(alpha_flag)) {

+        fill_alpha = FXGETFLAG_ALPHA_FILL(alpha_flag);

+        stroke_alpha = FXGETFLAG_ALPHA_STROKE(alpha_flag);

+    } else {

+        fill_alpha = FXARGB_A(fill_color);

+        stroke_alpha = FXARGB_A(stroke_color);

+    }

+    if ((fill_mode & 3) == 0) {

+        fill_alpha = 0;

+    }

+    if (pGraphState == NULL) {

+        stroke_alpha = 0;

+    }

+    if (stroke_alpha == 0 && pPathData->GetPointCount() == 2) {

+        FX_PATHPOINT* pPoints = pPathData->GetPoints();

+        FX_FLOAT x1, x2, y1, y2;

+        if (pObject2Device) {

+            pObject2Device->Transform(pPoints[0].m_PointX, pPoints[0].m_PointY, x1, y1);

+            pObject2Device->Transform(pPoints[1].m_PointX, pPoints[1].m_PointY, x2, y2);

+        } else {

+            x1 = pPoints[0].m_PointX;

+            y1 = pPoints[0].m_PointY;

+            x2 = pPoints[1].m_PointX;

+            y2 = pPoints[1].m_PointY;

+        }

+        DrawCosmeticLine(x1, y1, x2, y2, fill_color, fill_mode, alpha_flag, pIccTransform, blend_type);

+        return TRUE;

+    }

+    if ((pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) && stroke_alpha == 0) {

+        CFX_FloatRect rect_f;

+        if (!(fill_mode & FXFILL_RECT_AA) && pPathData->IsRect(pObject2Device, &rect_f)) {

+            FX_RECT rect_i = rect_f.GetOutterRect();

+            int width = (int)FXSYS_ceil(rect_f.right - rect_f.left);

+            if (width < 1) {

+                width = 1;

+                if (rect_i.left == rect_i.right) {

+                    rect_i.right ++;

+                }

+            }

+            int height = (int)FXSYS_ceil(rect_f.top - rect_f.bottom);

+            if (height < 1) {

+                height = 1;

+                if (rect_i.bottom == rect_i.top) {

+                    rect_i.bottom ++;

+                }

+            }

+            if (rect_i.Width() >= width + 1) {

+                if (rect_f.left - (FX_FLOAT)(rect_i.left) > (FX_FLOAT)(rect_i.right) - rect_f.right) {

+                    rect_i.left ++;

+                } else {

+                    rect_i.right --;

+                }

+            }

+            if (rect_i.Height() >= height + 1) {

+                if (rect_f.top - (FX_FLOAT)(rect_i.top) > (FX_FLOAT)(rect_i.bottom) - rect_f.bottom) {

+                    rect_i.top ++;

+                } else {

+                    rect_i.bottom --;

+                }

+            }

+            if (FillRect(&rect_i, fill_color, alpha_flag, pIccTransform, blend_type)) {

+                return TRUE;

+            }

+        }

+    }

+    if((fill_mode & 3) && stroke_alpha == 0 && !(fill_mode & FX_FILL_STROKE) && !(fill_mode & FX_FILL_TEXT_MODE)) {

+        CFX_PathData newPath;

+        FX_BOOL bThin = FALSE;

+        if (pPathData->GetZeroAreaPath(newPath, (CFX_Matrix*)pObject2Device, bThin, m_pDeviceDriver->GetDriverType())) {

+            CFX_GraphStateData graphState;

+            graphState.m_LineWidth = 0.0f;

+            FX_DWORD strokecolor = fill_color;

+            if (bThin) {

+                if (FXGETFLAG_COLORTYPE(alpha_flag)) {

+                    FXSETFLAG_ALPHA_STROKE(alpha_flag, fill_alpha >> 2);

+                } else {

+                    strokecolor = (((fill_alpha >> 2) << 24) | (strokecolor & 0x00ffffff));

+                }

+            }

+            CFX_AffineMatrix* pMatrix = NULL;

+            if (pObject2Device && !pObject2Device->IsIdentity()) {

+                pMatrix = (CFX_AffineMatrix*)pObject2Device;

+            }

+            int smooth_path = FX_ZEROAREA_FILL;

+            if (fill_mode & FXFILL_NOPATHSMOOTH) {

+                smooth_path |= FXFILL_NOPATHSMOOTH;

+            }

+            m_pDeviceDriver->DrawPath(&newPath, pMatrix, &graphState, 0, strokecolor, smooth_path, alpha_flag, pIccTransform, blend_type);

+        }

+    }

+    if ((fill_mode & 3) && fill_alpha && stroke_alpha < 0xff && (fill_mode & FX_FILL_STROKE)) {

+        if (!(m_RenderCaps & FXRC_GET_BITS)) {

+            return FALSE;

+        }

+        CFX_FloatRect bbox;

+        if (pGraphState) {

+            bbox = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);

+        } else {

+            bbox = pPathData->GetBoundingBox();

+        }

+        if (pObject2Device) {

+            bbox.Transform(pObject2Device);

+        }

+        CFX_Matrix ctm = GetCTM();

+        FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);

+        FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);

+        FX_RECT rect = bbox.GetOutterRect();

+        CFX_DIBitmap bitmap, Backdrop;

+        if (!CreateCompatibleBitmap(&bitmap, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY))) {

+            return FALSE;

+        }

+        if (bitmap.HasAlpha()) {

+            bitmap.Clear(0);

+            Backdrop.Copy(&bitmap);

+        } else {

+            if (!m_pDeviceDriver->GetDIBits(&bitmap, rect.left, rect.top, NULL)) {

+                return FALSE;

+            }

+            Backdrop.Copy(&bitmap);

+        }

+        CFX_FxgeDevice bitmap_device;

+        bitmap_device.Attach(&bitmap, 0, FALSE, &Backdrop, TRUE);

+        CFX_AffineMatrix matrix;

+        if (pObject2Device) {

+            matrix = *pObject2Device;

+        }

+        matrix.TranslateI(-rect.left, -rect.top);

+        matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0);

+        if (!bitmap_device.GetDeviceDriver()->DrawPath(pPathData, &matrix, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {

+            return FALSE;

+        }

+        FX_RECT src_rect(0, 0, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY));

+        return m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, rect.left, rect.top, FXDIB_BLEND_NORMAL);

+    }

+    return m_pDeviceDriver->DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type);

+}

+FX_BOOL CFX_RenderDevice::SetPixel(int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)

+{

+    if (m_pDeviceDriver->SetPixel(x, y, color, alpha_flag, pIccTransform)) {

+        return TRUE;

+    }

+    FX_RECT rect(x, y, x + 1, y + 1);

+    return FillRect(&rect, color, alpha_flag, pIccTransform);

+}

+FX_BOOL CFX_RenderDevice::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)

+{

+    if (m_pDeviceDriver->FillRect(pRect, fill_color, alpha_flag, pIccTransform, blend_type)) {

+        return TRUE;

+    }

+    if (!(m_RenderCaps & FXRC_GET_BITS)) {

+        return FALSE;

+    }

+    CFX_DIBitmap bitmap;

+    if (!CreateCompatibleBitmap(&bitmap, pRect->Width(), pRect->Height())) {

+        return FALSE;

+    }

+    if (!m_pDeviceDriver->GetDIBits(&bitmap, pRect->left, pRect->top)) {

+        return FALSE;

+    }

+    if (!bitmap.CompositeRect(0, 0, pRect->Width(), pRect->Height(), fill_color, alpha_flag, pIccTransform)) {

+        return FALSE;

+    }

+    FX_RECT src_rect(0, 0, pRect->Width(), pRect->Height());

+    m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, pRect->left, pRect->top, FXDIB_BLEND_NORMAL);

+    return TRUE;

+}

+FX_BOOL CFX_RenderDevice::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,

+        int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)

+{

+    if (((m_RenderCaps & FXRC_ALPHA_PATH) &&

+            (FXGETFLAG_COLORTYPE(alpha_flag) && FXGETFLAG_ALPHA_FILL(alpha_flag) == 0xff)) ||

+            color >= 0xff000000)

+        if (m_pDeviceDriver->DrawCosmeticLine(x1, y1, x2, y2, color, alpha_flag, pIccTransform, blend_type)) {

+            return TRUE;

+        }

+    CFX_GraphStateData graph_state;

+    CFX_PathData path;

+    path.SetPointCount(2);

+    path.SetPoint(0, x1, y1, FXPT_MOVETO);

+    path.SetPoint(1, x2, y2, FXPT_LINETO);

+    return m_pDeviceDriver->DrawPath(&path, NULL, &graph_state, 0, color, fill_mode, alpha_flag, pIccTransform, blend_type);

+}

+FX_BOOL CFX_RenderDevice::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform)

+{

+    if (!(m_RenderCaps & FXRC_GET_BITS)) {

+        return FALSE;

+    }

+    return m_pDeviceDriver->GetDIBits(pBitmap, left, top, pIccTransform);

+}

+CFX_DIBitmap* CFX_RenderDevice::GetBackDrop()

+{

+    return m_pDeviceDriver->GetBackDrop();

+}

+FX_BOOL CFX_RenderDevice::SetDIBits(const CFX_DIBSource* pBitmap, int left, int top, int blend_mode,

+                                    void* pIccTransform)

+{

+    ASSERT(!pBitmap->IsAlphaMask());

+    CFX_AffineMatrix ctm = GetCTM();

+    FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);

+    FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);

+    FX_RECT dest_rect(left, top, FXSYS_round(left + pBitmap->GetWidth() / fScaleX), FXSYS_round(top + pBitmap->GetHeight() / fScaleY));

+    dest_rect.Intersect(m_ClipBox);

+    if (dest_rect.IsEmpty()) {

+        return TRUE;

+    }

+    FX_RECT src_rect(dest_rect.left - left, dest_rect.top - top,

+                     dest_rect.left - left + dest_rect.Width(), dest_rect.top - top + dest_rect.Height());

+    src_rect.left = FXSYS_round(src_rect.left * fScaleX);

+    src_rect.top = FXSYS_round(src_rect.top * fScaleY);

+    src_rect.right = FXSYS_round(src_rect.right * fScaleX);

+    src_rect.bottom = FXSYS_round(src_rect.bottom * fScaleY);

+    if ((blend_mode != FXDIB_BLEND_NORMAL && !(m_RenderCaps & FXRC_BLEND_MODE)) ||

+            (pBitmap->HasAlpha() && !(m_RenderCaps & FXRC_ALPHA_IMAGE))) {

+        if (!(m_RenderCaps & FXRC_GET_BITS)) {

+            return FALSE;

+        }

+        int bg_pixel_width = FXSYS_round(dest_rect.Width() * fScaleX);

+        int bg_pixel_height = FXSYS_round(dest_rect.Height() * fScaleY);

+        CFX_DIBitmap background;

+        if (!background.Create(bg_pixel_width, bg_pixel_height,

+                               (m_RenderCaps & FXRC_CMYK_OUTPUT) ? FXDIB_Cmyk : FXDIB_Rgb32)) {

+            return FALSE;

+        }

+        if (!m_pDeviceDriver->GetDIBits(&background, dest_rect.left, dest_rect.top)) {

+            return FALSE;

+        }

+        if (!background.CompositeBitmap(0, 0, bg_pixel_width, bg_pixel_height,

+                                        pBitmap, src_rect.left, src_rect.top,

+                                        blend_mode, NULL, FALSE, pIccTransform)) {

+            return FALSE;

+        }

+        FX_RECT src_rect(0, 0, bg_pixel_width, bg_pixel_height);

+        return m_pDeviceDriver->SetDIBits(&background, 0, &src_rect, dest_rect.left, dest_rect.top, FXDIB_BLEND_NORMAL);

+    }

+    return m_pDeviceDriver->SetDIBits(pBitmap, 0, &src_rect, dest_rect.left, dest_rect.top, blend_mode, 0, pIccTransform);

+}

+FX_BOOL CFX_RenderDevice::StretchDIBits(const CFX_DIBSource* pBitmap, int left, int top,

+                                        int dest_width, int dest_height, FX_DWORD flags,

+                                        void* pIccTransform, int blend_mode)

+{

+    FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);

+    FX_RECT clip_box = m_ClipBox;

+    clip_box.Intersect(dest_rect);

+    if (clip_box.IsEmpty()) {

+        return TRUE;

+    }

+    return m_pDeviceDriver->StretchDIBits(pBitmap, 0, left, top, dest_width, dest_height, &clip_box, flags, 0, pIccTransform, blend_mode);

+}

+FX_BOOL CFX_RenderDevice::SetBitMask(const CFX_DIBSource* pBitmap, int left, int top, FX_DWORD argb,

+                                     int alpha_flag, void* pIccTransform)

+{

+    FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());

+    return m_pDeviceDriver->SetDIBits(pBitmap, argb, &src_rect, left, top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);

+}

+FX_BOOL CFX_RenderDevice::StretchBitMask(const CFX_DIBSource* pBitmap, int left, int top,

+        int dest_width, int dest_height, FX_DWORD argb, FX_DWORD flags,

+        int alpha_flag, void* pIccTransform)

+{

+    FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);

+    FX_RECT clip_box = m_ClipBox;

+    clip_box.Intersect(dest_rect);

+    return m_pDeviceDriver->StretchDIBits(pBitmap, argb, left, top, dest_width, dest_height, &clip_box, flags, alpha_flag, pIccTransform);

+}

+FX_BOOL CFX_RenderDevice::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD argb,

+                                      const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,

+                                      int alpha_flag, void* pIccTransform, int blend_mode)

+{

+    return m_pDeviceDriver->StartDIBits(pBitmap, bitmap_alpha, argb, pMatrix, flags, handle, alpha_flag, pIccTransform, blend_mode);

+}

+FX_BOOL CFX_RenderDevice::ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)

+{

+    return m_pDeviceDriver->ContinueDIBits(handle, pPause);

+}

+void CFX_RenderDevice::CancelDIBits(FX_LPVOID handle)

+{

+    m_pDeviceDriver->CancelDIBits(handle);

+}

diff --git a/core/src/fxge/ge/fx_ge_font.cpp b/core/src/fxge/ge/fx_ge_font.cpp
new file mode 100644
index 0000000..e047d2e
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_font.cpp
@@ -0,0 +1,458 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fxge/fx_freetype.h"

+#include "text_int.h"

+#define EM_ADJUST(em, a) (em == 0?(a): (a)*1000/em)

+extern void _FPDFAPI_GetInternalFontData(int id1, FX_LPCBYTE& data, FX_DWORD& size);

+CFX_Font::CFX_Font()

+{

+    m_pSubstFont = NULL;

+    m_Face = NULL;

+    m_bEmbedded = FALSE;

+    m_bVertical = FALSE;

+    m_pFontData = NULL;

+    m_pFontDataAllocation = NULL;

+    m_dwSize = 0;

+    m_pOwnedStream = NULL;

+    m_pGsubData = NULL;

+    m_pPlatformFont = NULL;

+    m_pPlatformFontCollection = NULL;

+    m_pDwFont = NULL;

+    m_hHandle = NULL;

+    m_bDwLoaded = FALSE;

+}

+CFX_Font::~CFX_Font()

+{

+    if (m_pSubstFont) {

+        delete m_pSubstFont;

+        m_pSubstFont = NULL;

+    }

+#ifdef FOXIT_CHROME_BUILD

+    if (m_pFontDataAllocation) {

+        FX_Free(m_pFontDataAllocation);

+        m_pFontDataAllocation = NULL;

+    }

+#endif

+    if (m_Face) {

+#ifdef FOXIT_CHROME_BUILD

+        FXFT_Library library = FXFT_Get_Face_FreeType(m_Face);

+        if (FXFT_Get_Face_External_Stream(m_Face)) {

+            FXFT_Clear_Face_External_Stream(m_Face);

+        }

+#endif

+        if(m_bEmbedded) {

+            DeleteFace();

+        } else {

+            CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face);

+        }

+    }

+    if (m_pOwnedStream) {

+        FX_Free(m_pOwnedStream);

+        m_pOwnedStream = NULL;

+    }

+    if (m_pGsubData) {

+        FX_Free(m_pGsubData);

+        m_pGsubData = NULL;

+    }

+#if (_FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))

+    ReleasePlatformResource();

+#endif

+}

+void CFX_Font::DeleteFace()

+{

+    FXFT_Done_Face(m_Face);

+    m_Face = NULL;

+}

+FX_BOOL CFX_Font::LoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,

+                            int weight, int italic_angle, int CharsetCP, FX_BOOL bVertical)

+{

+    m_bEmbedded = FALSE;

+    m_bVertical = bVertical;

+    m_pSubstFont = FX_NEW CFX_SubstFont;

+    if (!m_pSubstFont) {

+        return FALSE;

+    }

+    m_Face = CFX_GEModule::Get()->GetFontMgr()->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,

+             CharsetCP, m_pSubstFont);

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+    if(m_pSubstFont->m_ExtHandle) {

+        m_pPlatformFont = m_pSubstFont->m_ExtHandle;

+        m_pSubstFont->m_ExtHandle = NULL;

+    }

+#endif

+    if (m_Face) {

+        m_pFontData = FXFT_Get_Face_Stream_Base(m_Face);

+        m_dwSize = FXFT_Get_Face_Stream_Size(m_Face);

+    }

+    return TRUE;

+}

+extern "C" {

+    unsigned long _FTStreamRead(FXFT_Stream stream, unsigned long offset,

+                                unsigned char* buffer, unsigned long count)

+    {

+        if (count == 0) {

+            return 0;

+        }

+        IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;

+        int res = pFile->ReadBlock(buffer, offset, count);

+        if (res) {

+            return count;

+        }

+        return 0;

+    }

+    void _FTStreamClose(FXFT_Stream stream)

+    {

+    }

+};

+FX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream)

+{

+    FXFT_Stream stream1 = (FXFT_Stream)FX_Alloc(FX_BYTE, sizeof (FXFT_StreamRec));

+    if (!stream1) {

+        return FALSE;

+    }

+    stream1->base = NULL;

+    stream1->size = (unsigned long)pFile->GetSize();

+    stream1->pos = 0;

+    stream1->descriptor.pointer = pFile;

+    stream1->close = _FTStreamClose;

+    stream1->read = _FTStreamRead;

+    FXFT_Open_Args args;

+    args.flags = FT_OPEN_STREAM;

+    args.stream = stream1;

+    if (FXFT_Open_Face(library, &args, 0, Face)) {

+        FX_Free(stream1);

+        return FALSE;

+    }

+    if (stream) {

+        *stream = stream1;

+    }

+    return TRUE;

+}

+FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile)

+{

+    m_bEmbedded = FALSE;

+    FXFT_Library library;

+    if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {

+        FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);

+    }

+    library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;

+    FXFT_Stream stream = NULL;

+    if (!_LoadFile(library, &m_Face, pFile, &stream)) {

+        return FALSE;

+    }

+    m_pOwnedStream = stream;

+    FXFT_Set_Pixel_Sizes(m_Face, 0, 64);

+    return TRUE;

+}

+int CFX_Font::GetGlyphWidth(FX_DWORD glyph_index)

+{

+    if (!m_Face) {

+        return 0;

+    }

+    if (m_pSubstFont && (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM)) {

+        AdjustMMParams(glyph_index, 0, 0);

+    }

+    int err = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);

+    if (err) {

+        return 0;

+    }

+    int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriAdvance(m_Face));

+    return width;

+}

+static FXFT_Face FT_LoadFont(FX_LPBYTE pData, int size)

+{

+    FXFT_Library library;

+    if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {

+        FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);

+    }

+    library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;

+    FXFT_Face face;

+    int error = FXFT_New_Memory_Face(library, pData, size, 0, &face);

+    if (error) {

+        return NULL;

+    }

+    error = FXFT_Set_Pixel_Sizes(face, 64, 64);

+    if (error) {

+        return NULL;

+    }

+    return face;

+}

+FX_BOOL CFX_Font::LoadEmbedded(FX_LPCBYTE data, FX_DWORD size)

+{

+#ifdef FOXIT_CHROME_BUILD

+    m_pFontDataAllocation = FX_Alloc(FX_BYTE, size);

+    if (!m_pFontDataAllocation) {

+        return FALSE;

+    }

+    FXSYS_memcpy32(m_pFontDataAllocation, data, size);

+    m_Face = FT_LoadFont((FX_LPBYTE)m_pFontDataAllocation, size);

+    m_pFontData = (FX_LPBYTE)m_pFontDataAllocation;

+#else

+    m_Face = FT_LoadFont((FX_LPBYTE)data, size);

+    m_pFontData = (FX_LPBYTE)data;

+#endif

+    m_bEmbedded = TRUE;

+    m_dwSize = size;

+    return m_Face != NULL;

+}

+FX_BOOL CFX_Font::IsTTFont()

+{

+    if (m_Face == NULL) {

+        return FALSE;

+    }

+    return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT;

+}

+int CFX_Font::GetAscent() const

+{

+    if (m_Face == NULL) {

+        return 0;

+    }

+    int ascent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Ascender(m_Face));

+    return ascent;

+}

+int CFX_Font::GetDescent() const

+{

+    if (m_Face == NULL) {

+        return 0;

+    }

+    int descent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Descender(m_Face));

+    return descent;

+}

+FX_BOOL CFX_Font::GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox)

+{

+    if (m_Face == NULL) {

+        return FALSE;

+    }

+    if (FXFT_Is_Face_Tricky(m_Face)) {

+        int error = FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72);

+        if (error) {

+            return FALSE;

+        }

+        error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);

+        if (error) {

+            return FALSE;

+        }

+        FXFT_BBox cbox;

+        FT_Glyph glyph;

+        error = FXFT_Get_Glyph(((FXFT_Face)m_Face)->glyph, &glyph);

+        if (error) {

+            return FALSE;

+        }

+        FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);

+        int pixel_size_x = ((FXFT_Face)m_Face)->size->metrics.x_ppem,

+            pixel_size_y = ((FXFT_Face)m_Face)->size->metrics.y_ppem;

+        if (pixel_size_x == 0 || pixel_size_y == 0) {

+            bbox.left = cbox.xMin;

+            bbox.right = cbox.xMax;

+            bbox.top = cbox.yMax;

+            bbox.bottom = cbox.yMin;

+        } else {

+            bbox.left = cbox.xMin * 1000 / pixel_size_x;

+            bbox.right = cbox.xMax * 1000 / pixel_size_x;

+            bbox.top = cbox.yMax * 1000 / pixel_size_y;

+            bbox.bottom = cbox.yMin * 1000 / pixel_size_y;

+        }

+        if (bbox.top > FXFT_Get_Face_Ascender(m_Face)) {

+            bbox.top = FXFT_Get_Face_Ascender(m_Face);

+        }

+        if (bbox.bottom < FXFT_Get_Face_Descender(m_Face)) {

+            bbox.bottom = FXFT_Get_Face_Descender(m_Face);

+        }

+        FT_Done_Glyph(glyph);

+        return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0;

+    }

+    if (FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {

+        return FALSE;

+    }

+    int em = FXFT_Get_Face_UnitsPerEM(m_Face);

+    if (em == 0) {

+        bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face);

+        bbox.bottom = FXFT_Get_Glyph_HoriBearingY(m_Face);

+        bbox.top = bbox.bottom - FXFT_Get_Glyph_Height(m_Face);

+        bbox.right = bbox.left + FXFT_Get_Glyph_Width(m_Face);

+    } else {

+        bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face) * 1000 / em;

+        bbox.top = (FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)) * 1000 / em;

+        bbox.right = (FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)) * 1000 / em;

+        bbox.bottom = (FXFT_Get_Glyph_HoriBearingY(m_Face)) * 1000 / em;

+    }

+    return TRUE;

+}

+FX_BOOL CFX_Font::IsItalic()

+{

+    if (m_Face == NULL) {

+        return FALSE;

+    }

+    FX_BOOL ret = FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC;

+    if (!ret) {

+        CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face));

+        str.MakeLower();

+        if (str.Find("italic") != -1) {

+            ret = TRUE;

+        }

+    }

+    return ret;

+}

+FX_BOOL CFX_Font::IsBold()

+{

+    if (m_Face == NULL) {

+        return FALSE;

+    }

+    return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD;

+}

+FX_BOOL CFX_Font::IsFixedWidth()

+{

+    if (m_Face == NULL) {

+        return FALSE;

+    }

+    return FXFT_Is_Face_fixedwidth(m_Face);

+}

+CFX_WideString CFX_Font::GetPsName() const

+{

+    if (m_Face == NULL) {

+        return CFX_WideString();

+    }

+    CFX_WideString psName = CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(m_Face));

+    if (psName.IsEmpty()) {

+        psName =  CFX_WideString::FromLocal("Untitled");

+    }

+    return psName;

+}

+CFX_ByteString CFX_Font::GetFamilyName() const

+{

+    if (m_Face == NULL && m_pSubstFont == NULL) {

+        return CFX_ByteString();

+    }

+    if (m_Face) {

+        return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face));

+    } else {

+        return m_pSubstFont->m_Family;

+    }

+}

+CFX_ByteString CFX_Font::GetFaceName() const

+{

+    if (m_Face == NULL && m_pSubstFont == NULL) {

+        return CFX_ByteString();

+    }

+    if (m_Face) {

+        CFX_ByteString facename;

+        CFX_ByteString style = CFX_ByteString(FXFT_Get_Face_Style_Name(m_Face));

+        facename = GetFamilyName();

+        if (facename.IsEmpty()) {

+            facename = "Untitled";

+        }

+        if (!style.IsEmpty() && style != "Regular") {

+            facename += " " + style;

+        }

+        return facename;

+    } else {

+        return m_pSubstFont->m_Family;

+    }

+}

+FX_BOOL CFX_Font::GetBBox(FX_RECT &bbox)

+{

+    if (m_Face == NULL) {

+        return FALSE;

+    }

+    int em = FXFT_Get_Face_UnitsPerEM(m_Face);

+    if (em == 0) {

+        bbox.left = FXFT_Get_Face_xMin(m_Face);

+        bbox.bottom = FXFT_Get_Face_yMax(m_Face);

+        bbox.top = FXFT_Get_Face_yMin(m_Face);

+        bbox.right = FXFT_Get_Face_xMax(m_Face);

+    } else {

+        bbox.left = FXFT_Get_Face_xMin(m_Face) * 1000 / em;

+        bbox.top = FXFT_Get_Face_yMin(m_Face) * 1000 / em;

+        bbox.right = FXFT_Get_Face_xMax(m_Face) * 1000 / em;

+        bbox.bottom = FXFT_Get_Face_yMax(m_Face) * 1000 / em;

+    }

+    return TRUE;

+}

+int CFX_Font::GetHeight()

+{

+    if (m_Face == NULL) {

+        return 0;

+    }

+    int height = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face));

+    return height;

+}

+int CFX_Font::GetMaxAdvanceWidth()

+{

+    if (m_Face == NULL) {

+        return 0;

+    }

+    int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_MaxAdvanceWidth(m_Face));

+    return width;

+}

+int CFX_Font::GetULPos()

+{

+    if (m_Face == NULL) {

+        return 0;

+    }

+    int pos = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_UnderLinePosition(m_Face));

+    return pos;

+}

+int CFX_Font::GetULthickness()

+{

+    if (m_Face == NULL) {

+        return 0;

+    }

+    int thickness = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_UnderLineThickness(m_Face));

+    return thickness;

+}

+CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont)

+{

+    m_pFont = pFont;

+}

+FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCode(FX_DWORD charcode)

+{

+    FXFT_Face face =  m_pFont->GetFace();

+    if (!face) {

+        return charcode;

+    }

+    if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) {

+        return FXFT_Get_Char_Index(face, charcode);

+    }

+    if (m_pFont->m_pSubstFont && m_pFont->m_pSubstFont->m_Charset == 2) {

+        FX_DWORD index = 0;

+        if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) {

+            index = FXFT_Get_Char_Index(face, charcode);

+        }

+        if (!index && !FXFT_Select_Charmap(face, FXFT_ENCODING_APPLE_ROMAN)) {

+            return FXFT_Get_Char_Index(face, charcode);

+        }

+    }

+    return charcode;

+}

+FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCodeEx(FX_DWORD charcode, int encoding)

+{

+    FXFT_Face face =  m_pFont->GetFace();

+    if (!face) {

+        return charcode;

+    }

+    if (encoding == ENCODING_UNICODE) {

+        return	GlyphFromCharCode(charcode);

+    } else {

+        int nmaps = FXFT_Get_Face_CharmapCount(m_pFont->m_Face);

+        int i = 0;

+        while (i < nmaps) {

+            int encoding = FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i++]);

+            if (encoding != FXFT_ENCODING_UNICODE) {

+                FXFT_Select_Charmap(face, encoding);

+                break;

+            }

+        }

+    }

+    return FXFT_Get_Char_Index(face, charcode);

+}

+IFX_FontEncoding* FXGE_CreateUnicodeEncoding(CFX_Font* pFont)

+{

+    CFX_UnicodeEncoding* pEncoding = NULL;

+    pEncoding = FX_NEW CFX_UnicodeEncoding(pFont);

+    return pEncoding;

+}

diff --git a/core/src/fxge/ge/fx_ge_fontmap.cpp b/core/src/fxge/ge/fx_ge_fontmap.cpp
new file mode 100644
index 0000000..6549e8e
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_fontmap.cpp
@@ -0,0 +1,1558 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fxge/fx_freetype.h"

+#include "text_int.h"

+#define GET_TT_SHORT(w)  (FX_WORD)(((w)[0] << 8) | (w)[1])

+#define GET_TT_LONG(w) (FX_DWORD)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3])

+CFX_SubstFont::CFX_SubstFont()

+{

+    m_ExtHandle = NULL;

+    m_Charset = 0;

+    m_SubstFlags = 0;

+    m_Weight = 0;

+    m_ItalicAngle = 0;

+    m_bSubstOfCJK = FALSE;

+    m_WeightCJK = 0;

+    m_bItlicCJK = FALSE;

+}

+CTTFontDesc::~CTTFontDesc()

+{

+    if (m_Type == 1) {

+        if (m_SingleFace.m_pFace) {

+            FXFT_Done_Face(m_SingleFace.m_pFace);

+        }

+    } else if (m_Type == 2) {

+        for (int i = 0; i < 16; i ++)

+            if (m_TTCFace.m_pFaces[i]) {

+                FXFT_Done_Face(m_TTCFace.m_pFaces[i]);

+            }

+    }

+    if (m_pFontData) {

+        FX_Free(m_pFontData);

+    }

+}

+FX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face)

+{

+    if (m_Type == 1) {

+        if (m_SingleFace.m_pFace != face) {

+            return FALSE;

+        }

+    } else if (m_Type == 2) {

+        int i;

+        for (i = 0; i < 16; i ++)

+            if (m_TTCFace.m_pFaces[i] == face) {

+                break;

+            }

+        if (i == 16) {

+            return FALSE;

+        }

+    }

+    m_RefCount --;

+    if (m_RefCount) {

+        return FALSE;

+    }

+    delete this;

+    return TRUE;

+}

+CFX_FontMgr::CFX_FontMgr()

+{

+    m_pBuiltinMapper = FX_NEW CFX_FontMapper;

+    if (!m_pBuiltinMapper) {

+        return;

+    }

+    m_pBuiltinMapper->m_pFontMgr = this;

+    m_pExtMapper = NULL;

+    m_FTLibrary = NULL;

+    FXSYS_memset32(m_ExternalFonts, 0, sizeof m_ExternalFonts);

+}

+CFX_FontMgr::~CFX_FontMgr()

+{

+    if (m_pBuiltinMapper) {

+        delete m_pBuiltinMapper;

+    }

+    FreeCache();

+    if (m_FTLibrary) {

+        FXFT_Done_FreeType(m_FTLibrary);

+    }

+}

+void CFX_FontMgr::InitFTLibrary()

+{

+    if (m_FTLibrary == NULL) {

+        FXFT_Init_FreeType(&m_FTLibrary);

+    }

+}

+void CFX_FontMgr::FreeCache()

+{

+    FX_POSITION pos = m_FaceMap.GetStartPosition();

+    while(pos) {

+        CFX_ByteString Key;

+        CTTFontDesc* face;

+        m_FaceMap.GetNextAssoc(pos, Key, (void*&)face);

+        delete face;

+    }

+    m_FaceMap.RemoveAll();

+}

+void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo)

+{

+    m_pBuiltinMapper->SetSystemFontInfo(pFontInfo);

+}

+FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType,

+                                     FX_DWORD flags, int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont)

+{

+    if (m_FTLibrary == NULL) {

+        FXFT_Init_FreeType(&m_FTLibrary);

+    }

+    if (m_pExtMapper) {

+        FXFT_Face face = m_pExtMapper->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,

+                         CharsetCP, pSubstFont);

+        if (face) {

+            return face;

+        }

+    }

+    return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,

+                                           CharsetCP, pSubstFont);

+}

+FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name,

+                                     int weight, FX_BOOL bItalic, FX_LPBYTE& pFontData)

+{

+    CFX_ByteString key(face_name);

+    key += ',';

+    key += CFX_ByteString::FormatInteger(weight);

+    key += bItalic ? 'I' : 'N';

+    CTTFontDesc* pFontDesc = NULL;

+    m_FaceMap.Lookup(key, (void*&)pFontDesc);

+    if(pFontDesc) {

+        pFontData = pFontDesc->m_pFontData;

+        pFontDesc->m_RefCount ++;

+        return pFontDesc->m_SingleFace.m_pFace;

+    }

+    return NULL;

+}

+FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name,

+                                     int weight, FX_BOOL bItalic, FX_LPBYTE pData, FX_DWORD size, int face_index)

+{

+    CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc;

+    if (!pFontDesc) {

+        return NULL;

+    }

+    pFontDesc->m_Type = 1;

+    pFontDesc->m_SingleFace.m_pFace = NULL;

+    pFontDesc->m_SingleFace.m_bBold = weight;

+    pFontDesc->m_SingleFace.m_bItalic = bItalic;

+    pFontDesc->m_pFontData = pData;

+    pFontDesc->m_RefCount = 1;

+    FXFT_Library library;

+    if (m_FTLibrary == NULL) {

+        FXFT_Init_FreeType(&m_FTLibrary);

+    }

+    library = m_FTLibrary;

+    int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &pFontDesc->m_SingleFace.m_pFace);

+    if (ret) {

+        delete pFontDesc;

+        return NULL;

+    }

+    ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64);

+    if (ret) {

+        delete pFontDesc;

+        return NULL;

+    }

+    CFX_ByteString key(face_name);

+    key += ',';

+    key += CFX_ByteString::FormatInteger(weight);

+    key += bItalic ? 'I' : 'N';

+    m_FaceMap.SetAt(key, pFontDesc);

+    return pFontDesc->m_SingleFace.m_pFace;

+}

+const FX_LPCSTR g_Base14FontNames[14] = {

+    "Courier",

+    "Courier-Bold",

+    "Courier-BoldOblique",

+    "Courier-Oblique",

+    "Helvetica",

+    "Helvetica-Bold",

+    "Helvetica-BoldOblique",

+    "Helvetica-Oblique",

+    "Times-Roman",

+    "Times-Bold",

+    "Times-BoldItalic",

+    "Times-Italic",

+    "Symbol",

+    "ZapfDingbats",

+};

+const struct _AltFontName {

+    const FX_CHAR*	m_pName;

+    int		m_Index;

+}

+g_AltFontNames[] = {

+    {"Arial", 4},

+    {"Arial,Bold", 5},

+    {"Arial,BoldItalic", 6},

+    {"Arial,Italic", 7},

+    {"Arial-Bold", 5},

+    {"Arial-BoldItalic", 6},

+    {"Arial-BoldItalicMT", 6},

+    {"Arial-BoldMT", 5},

+    {"Arial-Italic", 7},

+    {"Arial-ItalicMT", 7},

+    {"ArialBold", 5},

+    {"ArialBoldItalic", 6},

+    {"ArialItalic", 7},

+    {"ArialMT", 4},

+    {"ArialMT,Bold", 5},

+    {"ArialMT,BoldItalic", 6},

+    {"ArialMT,Italic", 7},

+    {"ArialRoundedMTBold", 5},

+    {"Courier", 0},

+    {"Courier,Bold", 1},

+    {"Courier,BoldItalic", 2},

+    {"Courier,Italic", 3},

+    {"Courier-Bold", 1},

+    {"Courier-BoldOblique", 2},

+    {"Courier-Oblique", 3},

+    {"CourierBold", 1},

+    {"CourierBoldItalic", 2},

+    {"CourierItalic", 3},

+    {"CourierNew", 0},

+    {"CourierNew,Bold", 1},

+    {"CourierNew,BoldItalic", 2},

+    {"CourierNew,Italic", 3},

+    {"CourierNew-Bold", 1},

+    {"CourierNew-BoldItalic", 2},

+    {"CourierNew-Italic", 3},

+    {"CourierNewBold", 1},

+    {"CourierNewBoldItalic", 2},

+    {"CourierNewItalic", 3},

+    {"CourierNewPS-BoldItalicMT", 2},

+    {"CourierNewPS-BoldMT", 1},

+    {"CourierNewPS-ItalicMT", 3},

+    {"CourierNewPSMT", 0},

+    {"CourierStd", 0},

+    {"CourierStd-Bold", 1},

+    {"CourierStd-BoldOblique", 2},

+    {"CourierStd-Oblique", 3},

+    {"Helvetica", 4},

+    {"Helvetica,Bold", 5},

+    {"Helvetica,BoldItalic", 6},

+    {"Helvetica,Italic", 7},

+    {"Helvetica-Bold", 5},

+    {"Helvetica-BoldItalic", 6},

+    {"Helvetica-BoldOblique", 6},

+    {"Helvetica-Italic", 7},

+    {"Helvetica-Oblique", 7},

+    {"HelveticaBold", 5},

+    {"HelveticaBoldItalic", 6},

+    {"HelveticaItalic", 7},

+    {"Symbol", 12},

+    {"SymbolMT", 12},

+    {"Times-Bold", 9},

+    {"Times-BoldItalic", 10},

+    {"Times-Italic", 11},

+    {"Times-Roman", 8},

+    {"TimesBold", 9},

+    {"TimesBoldItalic", 10},

+    {"TimesItalic", 11},

+    {"TimesNewRoman", 8},

+    {"TimesNewRoman,Bold", 9},

+    {"TimesNewRoman,BoldItalic", 10},

+    {"TimesNewRoman,Italic", 11},

+    {"TimesNewRoman-Bold", 9},

+    {"TimesNewRoman-BoldItalic", 10},

+    {"TimesNewRoman-Italic", 11},

+    {"TimesNewRomanBold", 9},

+    {"TimesNewRomanBoldItalic", 10},

+    {"TimesNewRomanItalic", 11},

+    {"TimesNewRomanPS", 8},

+    {"TimesNewRomanPS-Bold", 9},

+    {"TimesNewRomanPS-BoldItalic", 10},

+    {"TimesNewRomanPS-BoldItalicMT", 10},

+    {"TimesNewRomanPS-BoldMT", 9},

+    {"TimesNewRomanPS-Italic", 11},

+    {"TimesNewRomanPS-ItalicMT", 11},

+    {"TimesNewRomanPSMT", 8},

+    {"TimesNewRomanPSMT,Bold", 9},

+    {"TimesNewRomanPSMT,BoldItalic", 10},

+    {"TimesNewRomanPSMT,Italic", 11},

+    {"ZapfDingbats", 13},

+};

+extern "C" {

+    static int compareString(const void* key, const void* element)

+    {

+        return FXSYS_stricmp((FX_LPCSTR)key, ((_AltFontName*)element)->m_pName);

+    }

+}

+int _PDF_GetStandardFontName(CFX_ByteString& name)

+{

+    _AltFontName* found = (_AltFontName*)FXSYS_bsearch((FX_LPCSTR)name, g_AltFontNames,

+                          sizeof g_AltFontNames / sizeof (_AltFontName), sizeof (_AltFontName), compareString);

+    if (found == NULL) {

+        return -1;

+    }

+    name = g_Base14FontNames[found->m_Index];

+    return found->m_Index;

+}

+int GetTTCIndex(FX_LPCBYTE pFontData, FX_DWORD ttc_size, FX_DWORD font_offset)

+{

+    int face_index = 0;

+    FX_LPCBYTE p = pFontData + 8;

+    FX_DWORD nfont = GET_TT_LONG(p);

+    FX_DWORD index;

+    for (index = 0; index < nfont; index ++) {

+        p = pFontData + 12 + index * 4;

+        if (GET_TT_LONG(p) == font_offset) {

+            break;

+        }

+    }

+    if(index >= nfont) {

+        face_index = 0;

+    } else {

+        face_index = index;

+    }

+    return face_index;

+}

+FXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, FX_DWORD checksum,

+                                        int font_offset, FX_LPBYTE& pFontData)

+{

+    CFX_ByteString key;

+    key.Format("%d:%d", ttc_size, checksum);

+    CTTFontDesc* pFontDesc = NULL;

+    m_FaceMap.Lookup(key, (void*&)pFontDesc);

+    if (pFontDesc == NULL) {

+        return NULL;

+    }

+    pFontData = pFontDesc->m_pFontData;

+    pFontDesc->m_RefCount ++;

+    int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);

+    if (pFontDesc->m_TTCFace.m_pFaces[face_index] == NULL) {

+        pFontDesc->m_TTCFace.m_pFaces[face_index] = GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);

+    }

+    return pFontDesc->m_TTCFace.m_pFaces[face_index];

+}

+FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, FX_DWORD checksum,

+                                        FX_LPBYTE pData, FX_DWORD size, int font_offset)

+{

+    CFX_ByteString key;

+    key.Format("%d:%d", ttc_size, checksum);

+    CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc;

+    if (!pFontDesc) {

+        return NULL;

+    }

+    pFontDesc->m_Type = 2;

+    pFontDesc->m_pFontData = pData;

+    for (int i = 0; i < 16; i ++) {

+        pFontDesc->m_TTCFace.m_pFaces[i] = NULL;

+    }

+    pFontDesc->m_RefCount ++;

+    key.Format("%d:%d", ttc_size, checksum);

+    m_FaceMap.SetAt(key, pFontDesc);

+    int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);

+    pFontDesc->m_TTCFace.m_pFaces[face_index] = GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);

+    return pFontDesc->m_TTCFace.m_pFaces[face_index];

+}

+FXFT_Face CFX_FontMgr::GetFixedFace(FX_LPCBYTE pData, FX_DWORD size, int face_index)

+{

+    FXFT_Library library;

+    if (m_FTLibrary == NULL) {

+        FXFT_Init_FreeType(&m_FTLibrary);

+    }

+    library = m_FTLibrary;

+    FXFT_Face face = NULL;

+    int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &face);

+    if (ret) {

+        return NULL;

+    }

+    ret = FXFT_Set_Pixel_Sizes(face, 64, 64);

+    if (ret) {

+        return NULL;

+    }

+    return face;

+}

+FXFT_Face CFX_FontMgr::GetFileFace(FX_LPCSTR filename, int face_index)

+{

+    FXFT_Library library;

+    if (m_FTLibrary == NULL) {

+        FXFT_Init_FreeType(&m_FTLibrary);

+    }

+    library = m_FTLibrary;

+    FXFT_Face face = NULL;

+    int ret = FXFT_New_Face(library, filename, face_index, &face);

+    if (ret) {

+        return NULL;

+    }

+    ret = FXFT_Set_Pixel_Sizes(face, 64, 64);

+    if (ret) {

+        return NULL;

+    }

+    return face;

+}

+void CFX_FontMgr::ReleaseFace(FXFT_Face face)

+{

+    if (face == NULL) {

+        return;

+    }

+    FX_POSITION pos = m_FaceMap.GetStartPosition();

+    while(pos) {

+        CFX_ByteString Key;

+        CTTFontDesc* ttface;

+        m_FaceMap.GetNextAssoc(pos, Key, (void*&)ttface);

+        if (ttface->ReleaseFace(face)) {

+            m_FaceMap.RemoveKey(Key);

+        }

+    }

+}

+extern "C" {

+    extern const unsigned char g_FoxitFixedItalicFontData [18746];

+    extern const unsigned char g_FoxitFixedFontData [17597];

+    extern const unsigned char g_FoxitSansItalicFontData [16339];

+    extern const unsigned char g_FoxitSansFontData [15025];

+    extern const unsigned char g_FoxitSerifItalicFontData [21227];

+    extern const unsigned char g_FoxitSerifFontData [19469];

+    extern const unsigned char g_FoxitFixedBoldItalicFontData [19151];

+    extern const unsigned char g_FoxitFixedBoldFontData [18055];

+    extern const unsigned char g_FoxitSansBoldItalicFontData [16418];

+    extern const unsigned char g_FoxitSansBoldFontData [16344];

+    extern const unsigned char g_FoxitSerifBoldItalicFontData [20733];

+    extern const unsigned char g_FoxitSerifBoldFontData [19395];

+    extern const unsigned char g_FoxitSymbolFontData[16729];

+    extern const unsigned char g_FoxitDingbatsFontData[29513];

+    extern const unsigned char g_FoxitSerifMMFontData[113417];

+    extern const unsigned char g_FoxitSansMMFontData[66919];

+};

+const FoxitFonts g_FoxitFonts[14] = {

+    {g_FoxitFixedFontData, 17597},

+    {g_FoxitFixedBoldFontData, 18055},

+    {g_FoxitFixedBoldItalicFontData, 19151},

+    {g_FoxitFixedItalicFontData, 18746},

+    {g_FoxitSansFontData, 15025},

+    {g_FoxitSansBoldFontData, 16344},

+    {g_FoxitSansBoldItalicFontData, 16418},

+    {g_FoxitSansItalicFontData, 16339},

+    {g_FoxitSerifFontData, 19469},

+    {g_FoxitSerifBoldFontData, 19395},

+    {g_FoxitSerifBoldItalicFontData, 20733},

+    {g_FoxitSerifItalicFontData, 21227},

+    {g_FoxitSymbolFontData, 16729},

+    {g_FoxitDingbatsFontData, 29513},

+};

+void _FPDFAPI_GetInternalFontData(int id, FX_LPCBYTE& data, FX_DWORD& size)

+{

+    CFX_GEModule::Get()->GetFontMgr()->GetStandardFont(data, size, id);

+}

+FX_BOOL CFX_FontMgr::GetStandardFont(FX_LPCBYTE& pFontData, FX_DWORD& size, int index)

+{

+    if (index > 15 || index < 0) {

+        return FALSE;

+    }

+    {

+        if (index >= 14) {

+            if (index == 14) {

+                pFontData = g_FoxitSerifMMFontData;

+                size = 113417;

+            } else {

+                pFontData = g_FoxitSansMMFontData;

+                size = 66919;

+            }

+        } else {

+            pFontData = g_FoxitFonts[index].m_pFontData;

+            size = g_FoxitFonts[index].m_dwSize;

+        }

+    }

+    return TRUE;

+}

+CFX_FontMapper::CFX_FontMapper()

+{

+    FXSYS_memset32(m_FoxitFaces, 0, sizeof m_FoxitFaces);

+    m_MMFaces[0] = m_MMFaces[1] = NULL;

+    m_pFontInfo = NULL;

+    m_bListLoaded = FALSE;

+    m_pFontEnumerator = NULL;

+}

+CFX_FontMapper::~CFX_FontMapper()

+{

+    for (int i = 0; i < 14; i ++)

+        if (m_FoxitFaces[i]) {

+            FXFT_Done_Face(m_FoxitFaces[i]);

+        }

+    if (m_MMFaces[0]) {

+        FXFT_Done_Face(m_MMFaces[0]);

+    }

+    if (m_MMFaces[1]) {

+        FXFT_Done_Face(m_MMFaces[1]);

+    }

+    if (m_pFontInfo) {

+        m_pFontInfo->Release();

+    }

+}

+void CFX_FontMapper::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo)

+{

+    if (pFontInfo == NULL) {

+        return;

+    }

+    if (m_pFontInfo) {

+        m_pFontInfo->Release();

+    }

+    m_pFontInfo = pFontInfo;

+}

+static CFX_ByteString _TT_NormalizeName(FX_LPCSTR family)

+{

+    CFX_ByteString norm(family, -1);

+    norm.Remove(' ');

+    norm.Remove('-');

+    norm.Remove(',');

+    int pos = norm.Find('+');

+    if (pos > 0) {

+        norm = norm.Left(pos);

+    }

+    norm.MakeLower();

+    return norm;

+}

+CFX_ByteString _FPDF_GetNameFromTT(FX_LPCBYTE name_table, FX_DWORD name_id)

+{

+    FX_LPCBYTE ptr = name_table + 2;

+    int name_count = GET_TT_SHORT(ptr);

+    int string_offset = GET_TT_SHORT(ptr + 2);

+    FX_LPCBYTE string_ptr = name_table + string_offset;

+    ptr += 4;

+    for (int i = 0; i < name_count; i ++) {

+        if (GET_TT_SHORT(ptr + 6) == name_id && GET_TT_SHORT(ptr) == 1 && GET_TT_SHORT(ptr + 2) == 0) {

+            return CFX_ByteStringC(string_ptr + GET_TT_SHORT(ptr + 10), GET_TT_SHORT(ptr + 8));

+        }

+        ptr += 12;

+    }

+    return CFX_ByteString();

+}

+static CFX_ByteString _FPDF_ReadStringFromFile(FXSYS_FILE* pFile, FX_DWORD size)

+{

+    CFX_ByteString buffer;

+    if (!FXSYS_fread(buffer.GetBuffer(size), size, 1, pFile)) {

+        return CFX_ByteString();

+    }

+    buffer.ReleaseBuffer(size);

+    return buffer;

+}

+static CFX_ByteString _FPDF_ReadStringFromStreamFile(IFX_FileStream* pFile, FX_DWORD size)

+{

+    CFX_ByteString buffer;

+    if (!pFile->ReadBlock(buffer.GetBuffer(size), size)) {

+        return CFX_ByteString();

+    }

+    buffer.ReleaseBuffer(size);

+    return buffer;

+}

+CFX_ByteString _FPDF_LoadTableFromTT(FXSYS_FILE* pFile, FX_LPCBYTE pTables, FX_DWORD nTables, FX_DWORD tag)

+{

+    for (FX_DWORD i = 0; i < nTables; i ++) {

+        FX_LPCBYTE p = pTables + i * 16;

+        if (GET_TT_LONG(p) == tag) {

+            FX_DWORD offset = GET_TT_LONG(p + 8);

+            FX_DWORD size = GET_TT_LONG(p + 12);

+            FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);

+            return _FPDF_ReadStringFromFile(pFile, size);

+        }

+    }

+    return CFX_ByteString();

+}

+CFX_ByteString _FPDF_LoadTableFromTTStreamFile(IFX_FileStream* pFile, FX_LPCBYTE pTables, FX_DWORD nTables, FX_DWORD tag)

+{

+    for (FX_DWORD i = 0; i < nTables; i ++) {

+        FX_LPCBYTE p = pTables + i * 16;

+        if (GET_TT_LONG(p) == tag) {

+            FX_DWORD offset = GET_TT_LONG(p + 8);

+            FX_DWORD size = GET_TT_LONG(p + 12);

+            CFX_ByteString buffer;

+            if (!pFile->ReadBlock(buffer.GetBuffer(size), offset, size)) {

+                return CFX_ByteString();

+            }

+            buffer.ReleaseBuffer(size);

+            return buffer;

+        }

+    }

+    return CFX_ByteString();

+}

+CFX_ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont)

+{

+    if (m_pFontInfo == NULL) {

+        CFX_ByteString();

+    }

+    CFX_ByteString result;

+    FX_DWORD size = m_pFontInfo->GetFontData(hFont, 0x6e616d65, NULL, 0);

+    if (size) {

+        FX_LPBYTE buffer = FX_Alloc(FX_BYTE, size);

+        if (!buffer) {

+            return result;

+        }

+        m_pFontInfo->GetFontData(hFont, 0x6e616d65, buffer, size);

+        result = _FPDF_GetNameFromTT(buffer, 6);

+        FX_Free(buffer);

+    }

+    return result;

+}

+void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset)

+{

+    if (m_pFontInfo == NULL) {

+        return;

+    }

+    if (m_CharsetArray.Find((FX_DWORD)charset) == -1) {

+        m_CharsetArray.Add((FX_DWORD)charset);

+        m_FaceArray.Add(name);

+    }

+    if (name == m_LastFamily) {

+        return;

+    }

+    FX_LPCBYTE ptr = name;

+    FX_BOOL bLocalized = FALSE;

+    for (int i = 0; i < name.GetLength(); i ++)

+        if (ptr[i] > 0x80) {

+            bLocalized = TRUE;

+            break;

+        }

+    if (bLocalized) {

+        void* hFont = m_pFontInfo->GetFont(name);

+        if (hFont == NULL) {

+            FX_BOOL bExact;

+            hFont = m_pFontInfo->MapFont(0, 0, FXFONT_DEFAULT_CHARSET, 0, name, bExact);

+            if (hFont == NULL) {

+                return;

+            }

+        }

+        CFX_ByteString new_name = GetPSNameFromTT(hFont);

+        if (!new_name.IsEmpty()) {

+            new_name.Insert(0, ' ');

+            m_InstalledTTFonts.Add(new_name);

+        }

+        m_pFontInfo->DeleteFont(hFont);

+    }

+    m_InstalledTTFonts.Add(name);

+    m_LastFamily = name;

+}

+void CFX_FontMapper::LoadInstalledFonts()

+{

+    if (m_pFontInfo == NULL) {

+        return;

+    }

+    if (m_bListLoaded) {

+        return;

+    }

+    if (m_bListLoaded) {

+        return;

+    }

+    m_pFontInfo->EnumFontList(this);

+    m_bListLoaded = TRUE;

+}

+CFX_ByteString CFX_FontMapper::MatchInstalledFonts(const CFX_ByteString& norm_name)

+{

+    LoadInstalledFonts();

+    int i;

+    for (i = m_InstalledTTFonts.GetSize() - 1; i >= 0; i --) {

+        CFX_ByteString norm1 = _TT_NormalizeName(m_InstalledTTFonts[i]);

+        if (norm1 == norm_name) {

+            break;

+        }

+    }

+    if (i < 0) {

+        return CFX_ByteString();

+    }

+    CFX_ByteString match = m_InstalledTTFonts[i];

+    if (match[0] == ' ') {

+        match = m_InstalledTTFonts[i + 1];

+    }

+    return match;

+}

+typedef struct _CHARSET_MAP_ {

+    FX_BYTE charset;

+    FX_WORD codepage;

+} CHARSET_MAP;

+static const CHARSET_MAP g_Codepage2CharsetTable[] = {

+    { 1	 , 0	},

+    { 2	 , 42	},

+    { 254, 437	},

+    { 255, 850	},

+    { 222, 874	},

+    { 128, 932	},

+    { 134, 936	},

+    { 129, 949	},

+    { 136, 950	},

+    { 238, 1250	},

+    { 204, 1251	},

+    { 0,   1252	},

+    { 161, 1253	},

+    { 162, 1254	},

+    { 177, 1255	},

+    { 178, 1256	},

+    { 186, 1257	},

+    { 163, 1258 },

+    { 130, 1361 },

+    { 77, 10000 },

+    { 78, 10001 },

+    { 79, 10003 },

+    { 80, 10008 },

+    { 81, 10002 },

+    { 83, 10005 },

+    { 84, 10004 },

+    { 85, 10006 },

+    { 86, 10081 },

+    { 87, 10021 },

+    { 88, 10029 },

+    { 89, 10007 },

+};

+FX_BYTE _GetCharsetFromCodePage(FX_WORD codepage)

+{

+    FX_INT32 iEnd = sizeof(g_Codepage2CharsetTable) / sizeof(CHARSET_MAP) - 1;

+    FXSYS_assert(iEnd >= 0);

+    FX_INT32 iStart = 0, iMid;

+    do {

+        iMid = (iStart + iEnd) / 2;

+        const CHARSET_MAP & cp = g_Codepage2CharsetTable[iMid];

+        if (codepage == cp.codepage) {

+            return cp.charset;

+        } else if (codepage < cp.codepage) {

+            iEnd = iMid - 1;

+        } else {

+            iStart = iMid + 1;

+        }

+    } while (iStart <= iEnd);

+    return 1;

+}

+FX_DWORD _GetCodePageRangeFromCharset(int charset)

+{

+    if (charset == FXFONT_EASTEUROPE_CHARSET) {

+        return 1 << 1;

+    }

+    if (charset == FXFONT_GREEK_CHARSET) {

+        return 1 << 3;

+    }

+    if (charset == FXFONT_TURKISH_CHARSET) {

+        return 1 << 4;

+    }

+    if (charset == FXFONT_HEBREW_CHARSET) {

+        return 1 << 5;

+    }

+    if (charset == FXFONT_ARABIC_CHARSET) {

+        return 1 << 6;

+    }

+    if (charset == FXFONT_BALTIC_CHARSET) {

+        return 1 << 7;

+    }

+    if (charset == FXFONT_THAI_CHARSET) {

+        return 1 << 16;

+    }

+    if (charset == FXFONT_SHIFTJIS_CHARSET) {

+        return 1 << 17;

+    }

+    if (charset == FXFONT_GB2312_CHARSET) {

+        return 1 << 18;

+    }

+    if (charset == FXFONT_CHINESEBIG5_CHARSET) {

+        return 1 << 20;

+    }

+    if (charset == FXFONT_HANGEUL_CHARSET) {

+        return 1 << 19;

+    }

+    if (charset == FXFONT_SYMBOL_CHARSET) {

+        return 1 << 31;

+    }

+    return 1 << 21;

+}

+static int CP2CharSet(int cp)

+{

+    if(cp == 932) {

+        return FXFONT_SHIFTJIS_CHARSET;

+    } else if(cp == 936) {

+        return FXFONT_GB2312_CHARSET;

+    } else if(cp == 949) {

+        return FXFONT_HANGEUL_CHARSET;

+    } else if(cp == 950) {

+        return FXFONT_CHINESEBIG5_CHARSET;

+    }

+    return FXFONT_DEFAULT_CHARSET;

+}

+FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, int iBaseFont, int italic_angle, int weight, int picthfamily)

+{

+    if (iBaseFont < 12) {

+        if (m_FoxitFaces[iBaseFont]) {

+            return m_FoxitFaces[iBaseFont];

+        }

+        FX_LPCBYTE pFontData = NULL;

+        FX_DWORD size = 0;

+        if (m_pFontMgr->GetStandardFont(pFontData, size, iBaseFont)) {

+            m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(pFontData, size, 0);

+            return m_FoxitFaces[iBaseFont];

+        }

+    }

+    pSubstFont->m_SubstFlags |= FXFONT_SUBST_MM;

+    pSubstFont->m_ItalicAngle = italic_angle;

+    if (weight) {

+        pSubstFont->m_Weight = weight;

+    }

+    if (picthfamily & FXFONT_FF_ROMAN) {

+        pSubstFont->m_Weight = pSubstFont->m_Weight * 4 / 5;

+        pSubstFont->m_Family = "Chrome Serif";

+        if (m_MMFaces[1]) {

+            return m_MMFaces[1];

+        }

+        FX_LPCBYTE pFontData = NULL;

+        FX_DWORD size;

+        m_pFontMgr->GetStandardFont(pFontData, size, 14);

+        m_MMFaces[1] = m_pFontMgr->GetFixedFace(pFontData, size, 0);

+        return m_MMFaces[1];

+    }

+    pSubstFont->m_Family = "Chrome Sans";

+    if (m_MMFaces[0]) {

+        return m_MMFaces[0];

+    }

+    FX_LPCBYTE pFontData = NULL;

+    FX_DWORD size = 0;

+    m_pFontMgr->GetStandardFont(pFontData, size, 15);

+    m_MMFaces[0] = m_pFontMgr->GetFixedFace(pFontData, size, 0);

+    return m_MMFaces[0];

+}

+const struct _AltFontFamily {

+    FX_LPCSTR m_pFontName;

+    FX_LPCSTR m_pFontFamily;

+}

+g_AltFontFamilies[] = {

+    {"AGaramondPro", "Adobe Garamond Pro"},

+    {"BankGothicBT-Medium", "BankGothic Md BT"},

+    {"ForteMT", "Forte"},

+};

+extern "C" {

+    static int compareFontFamilyString(const void* key, const void* element)

+    {

+        CFX_ByteString str_key((FX_LPCSTR)key);

+        if (str_key.Find(((_AltFontFamily*)element)->m_pFontName) != -1) {

+            return 0;

+        }

+        return FXSYS_stricmp((FX_LPCSTR)key, ((_AltFontFamily*)element)->m_pFontName);

+    }

+}

+#define FX_FONT_STYLE_None		0x00

+#define FX_FONT_STYLE_Bold		0x01

+#define FX_FONT_STYLE_Italic	0x02

+#define FX_FONT_STYLE_BoldBold	0x04

+static CFX_ByteString _GetFontFamily(CFX_ByteString fontName, int nStyle)

+{

+    if (fontName.Find("Script") >= 0) {

+        if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) {

+            fontName = "ScriptMTBold";

+        } else if (fontName.Find("Palace") >= 0) {

+            fontName = "PalaceScriptMT";

+        } else if (fontName.Find("French") >= 0) {

+            fontName = "FrenchScriptMT";

+        } else if (fontName.Find("FreeStyle") >= 0) {

+            fontName = "FreeStyleScript";

+        }

+        return fontName;

+    }

+    _AltFontFamily* found = (_AltFontFamily*)FXSYS_bsearch((FX_LPCSTR)fontName, g_AltFontFamilies,

+                            sizeof g_AltFontFamilies / sizeof (_AltFontFamily), sizeof (_AltFontFamily), compareFontFamilyString);

+    if (found == NULL) {

+        return fontName;

+    }

+    return found->m_pFontFamily;

+};

+typedef struct _FX_FontStyle {

+    FX_LPCSTR style;

+    FX_INT32 len;

+} FX_FontStyle;

+const FX_FontStyle g_FontStyles[] = {

+    "Bold", 4,

+    "Italic", 6,

+    "BoldItalic", 10,

+    "Reg", 3,

+    "Regular", 7,

+};

+CFX_ByteString ParseStyle(FX_LPCSTR pStyle, int iLen, int iIndex)

+{

+    CFX_ByteTextBuf buf;

+    if (!iLen || iLen <= iIndex) {

+        return buf.GetByteString();

+    }

+    while (iIndex < iLen) {

+        if (pStyle[iIndex] == ',') {

+            break;

+        }

+        buf.AppendChar(pStyle[iIndex]);

+        ++iIndex;

+    }

+    return buf.GetByteString();

+}

+FX_INT32 GetStyleType(const CFX_ByteString &bsStyle, FX_BOOL bRevert)

+{

+    FX_INT32 iLen = bsStyle.GetLength();

+    if (!iLen) {

+        return -1;

+    }

+    int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle);

+    const FX_FontStyle *pStyle = NULL;

+    for (int i = iSize - 1; i >= 0; --i) {

+        pStyle = g_FontStyles + i;

+        if (!pStyle || pStyle->len > iLen) {

+            continue;

+        }

+        if (!bRevert) {

+            if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) {

+                return i;

+            }

+        } else {

+            if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) {

+                return i;

+            }

+        }

+    }

+    return -1;

+}

+FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int &PitchFamily)

+{

+    if (name == FX_BSTRC("MyriadPro")) {

+        PitchFamily &= ~FXFONT_FF_ROMAN;

+        return TRUE;

+    }

+    return FALSE;

+}

+FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, FX_BOOL bTrueType, FX_DWORD flags,

+                                        int weight, int italic_angle, int WindowCP, CFX_SubstFont* pSubstFont)

+{

+    if (!(flags & FXFONT_USEEXTERNATTR)) {

+        weight = FXFONT_FW_NORMAL;

+        italic_angle = 0;

+    }

+    CFX_ByteString SubstName = name;

+    SubstName.Remove(0x20);

+    if (bTrueType) {

+        if (name[0] == '@') {

+            SubstName = name.Mid(1);

+        }

+    }

+    _PDF_GetStandardFontName(SubstName);

+    if (SubstName == FX_BSTRC("Symbol") && !bTrueType) {

+        pSubstFont->m_Family = "Chrome Symbol";

+        pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;

+        pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;

+        if (m_FoxitFaces[12]) {

+            return m_FoxitFaces[12];

+        }

+        FX_LPCBYTE pFontData = NULL;

+        FX_DWORD size = 0;

+        m_pFontMgr->GetStandardFont(pFontData, size, 12);

+        m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0);

+        return m_FoxitFaces[12];

+    }

+    if (SubstName == FX_BSTRC("ZapfDingbats")) {

+        pSubstFont->m_Family = "Chrome Dingbats";

+        pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;

+        pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;

+        if (m_FoxitFaces[13]) {

+            return m_FoxitFaces[13];

+        }

+        FX_LPCBYTE pFontData = NULL;

+        FX_DWORD size = 0;

+        m_pFontMgr->GetStandardFont(pFontData, size, 13);

+        m_FoxitFaces[13] = m_pFontMgr->GetFixedFace(pFontData, size, 0);

+        return m_FoxitFaces[13];

+    }

+    int iBaseFont = 0;

+    CFX_ByteString family, style;

+    FX_BOOL	bHasComma = FALSE;

+    FX_BOOL bHasHypen = FALSE;

+    int find = SubstName.Find(FX_BSTRC(","), 0);

+    if (find >= 0) {

+        family = SubstName.Left(find);

+        _PDF_GetStandardFontName(family);

+        style = SubstName.Mid(find + 1);

+        bHasComma = TRUE;

+    } else {

+        family = SubstName;

+    }

+    for (; iBaseFont < 12; iBaseFont ++)

+        if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont])) {

+            break;

+        }

+    int PitchFamily = 0;

+    FX_BOOL bItalic = FALSE;

+    FX_DWORD nStyle = 0;

+    FX_BOOL bStyleAvail = FALSE;

+    FX_BOOL bFamilyStyleIsWhole = FALSE;

+    FX_BOOL bNextF = FALSE;

+    if (iBaseFont < 12) {

+        family = g_Base14FontNames[iBaseFont];

+        if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2) {

+            nStyle |= FX_FONT_STYLE_Bold;

+        }

+        if ((iBaseFont % 4) / 2) {

+            nStyle |= FX_FONT_STYLE_Italic;

+        }

+        if (iBaseFont < 4) {

+            PitchFamily |= FXFONT_FF_FIXEDPITCH;

+        }

+        if (iBaseFont >= 8) {

+            PitchFamily |= FXFONT_FF_ROMAN;

+        }

+    } else {

+        if (!bHasComma) {

+            find = family.ReverseFind('-');

+            if (find >= 0) {

+                style = family.Mid(find + 1);

+                family = family.Left(find);

+                bHasHypen = TRUE;

+            }

+        }

+        if (!bHasHypen) {

+            int nLen = family.GetLength();

+            FX_INT32 nRet = GetStyleType(family, TRUE);

+            if (nRet > -1) {

+                family = family.Left(nLen - g_FontStyles[nRet].len);

+                if (nRet == 0) {

+                    nStyle |= FX_FONT_STYLE_Bold;

+                }

+                if (nRet == 1) {

+                    nStyle |= FX_FONT_STYLE_Italic;

+                }

+                if (nRet == 2) {

+                    nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic);

+                }

+            }

+        }

+        if (flags & FXFONT_SERIF) {

+            PitchFamily |= FXFONT_FF_ROMAN;

+        }

+        if (flags & FXFONT_SCRIPT) {

+            PitchFamily |= FXFONT_FF_SCRIPT;

+        }

+        if (flags & FXFONT_FIXED_PITCH) {

+            PitchFamily |= FXFONT_FF_FIXEDPITCH;

+        }

+    }

+    if (!style.IsEmpty()) {

+        int nLen = style.GetLength();

+        FX_LPCSTR pStyle = style;

+        int i = 0;

+        FX_BOOL bFirstItem = TRUE;

+        CFX_ByteString buf;

+        while (i < nLen) {

+            buf = ParseStyle(pStyle, nLen, i);

+            FX_INT32 nRet = GetStyleType(buf, FALSE);

+            if ((i && !bStyleAvail) || (!i && nRet < 0)) {

+                family = SubstName;

+                iBaseFont = 12;

+                break;

+            } else if (nRet >= 0) {

+                bStyleAvail = TRUE;

+            }

+            if (nRet == 0) {

+                if (nStyle & FX_FONT_STYLE_Bold) {

+                    nStyle |= FX_FONT_STYLE_BoldBold;

+                } else {

+                    nStyle |= FX_FONT_STYLE_Bold;

+                }

+                bFirstItem = FALSE;

+            }

+            if (nRet == 1) {

+                if (bFirstItem) {

+                    nStyle |= FX_FONT_STYLE_Italic;

+                } else {

+                    family = SubstName;

+                    iBaseFont = 12;

+                }

+                break;

+            }

+            if (nRet == 2) {

+                nStyle |= FX_FONT_STYLE_Italic;

+                if (nStyle & FX_FONT_STYLE_Bold) {

+                    nStyle |= FX_FONT_STYLE_BoldBold;

+                } else {

+                    nStyle |= FX_FONT_STYLE_Bold;

+                }

+                bFirstItem = FALSE;

+            }

+            i += buf.GetLength() + 1;

+        }

+    }

+    weight = weight ? weight : FXFONT_FW_NORMAL;

+    int old_weight = weight;

+    if (nStyle) {

+        weight = nStyle & FX_FONT_STYLE_BoldBold ? 900 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);

+    }

+    if (nStyle & FX_FONT_STYLE_Italic) {

+        bItalic = TRUE;

+    }

+    FX_BOOL bCJK = FALSE;

+    FX_BOOL bExact = FALSE;

+    int Charset = FXFONT_ANSI_CHARSET;

+    if (WindowCP) {

+        Charset = _GetCharsetFromCodePage(WindowCP);

+    } else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC)) {

+        Charset = FXFONT_SYMBOL_CHARSET;

+    }

+    if (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET ||

+            Charset == FXFONT_HANGEUL_CHARSET || Charset == FXFONT_CHINESEBIG5_CHARSET) {

+        bCJK = TRUE;

+    }

+    if (m_pFontInfo == NULL) {

+        pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;

+        return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);

+    }

+    family = _GetFontFamily(family, nStyle);

+    CFX_ByteString match = MatchInstalledFonts(_TT_NormalizeName(family));

+    if (match.IsEmpty() && family != SubstName && (!bHasComma && (!bHasHypen || (bHasHypen && !bStyleAvail)))) {

+        match = MatchInstalledFonts(_TT_NormalizeName(SubstName));

+    }

+    if (match.IsEmpty() && iBaseFont >= 12) {

+        if (!bCJK) {

+            if (!CheckSupportThirdPartFont(family, PitchFamily)) {

+                if (italic_angle != 0) {

+                    bItalic = TRUE;

+                } else {

+                    bItalic = FALSE;

+                }

+                weight = old_weight;

+            }

+        } else {

+            pSubstFont->m_bSubstOfCJK = TRUE;

+            if (nStyle) {

+                pSubstFont->m_WeightCJK = weight;

+            } else {

+                pSubstFont->m_WeightCJK = FXFONT_FW_NORMAL;

+            }

+            if (nStyle & FX_FONT_STYLE_Italic) {

+                pSubstFont->m_bItlicCJK = TRUE;

+            }

+        }

+    } else {

+        italic_angle = 0;

+        weight = nStyle & FX_FONT_STYLE_BoldBold ? 900 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);

+    }

+    if (!match.IsEmpty() || iBaseFont < 12) {

+        pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;

+        if (!match.IsEmpty()) {

+            family = match;

+        }

+        if (iBaseFont < 12) {

+            if (nStyle && !(iBaseFont % 4)) {

+                if ((nStyle & 0x3) == 1) {

+                    iBaseFont += 1;

+                }

+                if ((nStyle & 0x3) == 2) {

+                    iBaseFont += 3;

+                }

+                if ((nStyle & 0x3) == 3) {

+                    iBaseFont += 2;

+                }

+            }

+            if (m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData) {

+                if (m_FoxitFaces[iBaseFont]) {

+                    return m_FoxitFaces[iBaseFont];

+                }

+                m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData,

+                                          m_pFontMgr->m_ExternalFonts[iBaseFont].m_dwSize, 0);

+                if (m_FoxitFaces[iBaseFont]) {

+                    return m_FoxitFaces[iBaseFont];

+                }

+            } else {

+                family = g_Base14FontNames[iBaseFont];

+            }

+            pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;

+        }

+    } else {

+        if (flags & FXFONT_ITALIC) {

+            bItalic = TRUE;

+        }

+    }

+    bExact = !match.IsEmpty();

+    void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily, family, bExact);

+    if (bExact) {

+        pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;

+    }

+    if (hFont == NULL) {

+        if (bCJK) {

+            if (italic_angle != 0) {

+                bItalic = TRUE;

+            } else {

+                bItalic = FALSE;

+            }

+            weight = old_weight;

+        }

+        if (!match.IsEmpty()) {

+            hFont = m_pFontInfo->GetFont(match);

+            if (hFont == NULL) {

+                return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);

+            }

+        } else {

+            if (Charset == FXFONT_SYMBOL_CHARSET) {

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_  == _FXM_PLATFORM_ANDROID_

+                if (SubstName == FX_BSTRC("Symbol")) {

+                    pSubstFont->m_Family = "Chrome Symbol";

+                    pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;

+                    pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;

+                    if (m_FoxitFaces[12]) {

+                        return m_FoxitFaces[12];

+                    }

+                    FX_LPCBYTE pFontData = NULL;

+                    FX_DWORD size = 0;

+                    m_pFontMgr->GetStandardFont(pFontData, size, 12);

+                    m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0);

+                    return m_FoxitFaces[12];

+                } else {

+                    pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL;

+                    return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, weight, italic_angle, 0, pSubstFont);

+                }

+#else

+                pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL;

+                return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, weight, italic_angle, 0, pSubstFont);

+#endif

+            }

+            if (Charset == FXFONT_ANSI_CHARSET) {

+                pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;

+                return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);

+            }

+            int index = m_CharsetArray.Find(Charset);

+            if (index < 0) {

+                return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);

+            } else {

+                hFont = m_pFontInfo->GetFont(m_FaceArray[index]);

+            }

+        }

+    }

+    pSubstFont->m_ExtHandle = m_pFontInfo->RetainFont(hFont);

+    if (hFont == NULL) {

+        return NULL;

+    }

+    m_pFontInfo->GetFaceName(hFont, SubstName);

+    if (Charset == FXFONT_DEFAULT_CHARSET) {

+        m_pFontInfo->GetFontCharset(hFont, Charset);

+    }

+    FX_DWORD ttc_size = m_pFontInfo->GetFontData(hFont, 0x74746366, NULL, 0);

+    FX_DWORD font_size = m_pFontInfo->GetFontData(hFont, 0, NULL, 0);

+    if(font_size == 0 && ttc_size == 0) {

+        m_pFontInfo->DeleteFont(hFont);

+        return NULL;

+    }

+    FXFT_Face face = NULL;

+    if (ttc_size) {

+        FX_BYTE temp[1024];

+        m_pFontInfo->GetFontData(hFont, 0x74746366, temp, 1024);

+        FX_DWORD checksum = 0;

+        for (int i = 0; i < 256; i ++) {

+            checksum += ((FX_DWORD*)temp)[i];

+        }

+        FX_LPBYTE pFontData;

+        face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size, pFontData);

+        if (face == NULL) {

+            pFontData = FX_Alloc(FX_BYTE, ttc_size);

+            if (pFontData) {

+                m_pFontInfo->GetFontData(hFont, 0x74746366, pFontData, ttc_size);

+                face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size,

+                                                    ttc_size - font_size);

+            }

+        }

+    } else {

+        FX_LPBYTE pFontData;

+        face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData);

+        if (face == NULL) {

+            pFontData = FX_Alloc(FX_BYTE, font_size);

+            if (!pFontData) {

+                m_pFontInfo->DeleteFont(hFont);

+                return NULL;

+            }

+            m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size);

+            face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, font_size, m_pFontInfo->GetFaceIndex(hFont));

+        }

+    }

+    if (face == NULL) {

+        m_pFontInfo->DeleteFont(hFont);

+        return NULL;

+    }

+    pSubstFont->m_Family = SubstName;

+    pSubstFont->m_Charset = Charset;

+    FX_BOOL bNeedUpdateWeight = FALSE;

+    if (FXFT_Is_Face_Bold(face)) {

+        if (weight == FXFONT_FW_BOLD) {

+            bNeedUpdateWeight = FALSE;

+        } else {

+            bNeedUpdateWeight = TRUE;

+        }

+    } else {

+        if (weight == FXFONT_FW_NORMAL) {

+            bNeedUpdateWeight = FALSE;

+        } else {

+            bNeedUpdateWeight = TRUE;

+        }

+    }

+    if (bNeedUpdateWeight) {

+        pSubstFont->m_Weight = weight;

+    }

+    if (bItalic && !FXFT_Is_Face_Italic(face)) {

+        if (italic_angle == 0) {

+            italic_angle = -12;

+        } else if (FXSYS_abs(italic_angle) < 5) {

+            italic_angle = 0;

+        }

+        pSubstFont->m_ItalicAngle = italic_angle;

+    }

+    m_pFontInfo->DeleteFont(hFont);

+    return face;

+}

+extern "C" {

+    unsigned long _FTStreamRead(FXFT_Stream stream, unsigned long offset,

+                                unsigned char* buffer, unsigned long count);

+    void _FTStreamClose(FXFT_Stream stream);

+};

+CFontFileFaceInfo::CFontFileFaceInfo()

+{

+    m_pFile = NULL;

+    m_Face = NULL;

+    m_Charsets = 0;

+    m_FileSize = 0;

+    m_FontOffset = 0;

+    m_Weight = 0;

+    m_bItalic = FALSE;

+    m_PitchFamily = 0;

+}

+CFontFileFaceInfo::~CFontFileFaceInfo()

+{

+    if (m_Face) {

+        FXFT_Done_Face(m_Face);

+    }

+    m_Face = NULL;

+}

+extern FX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream);

+#if defined(_FPDFAPI_MINI_) || _FX_OS_ == _FX_ANDROID_

+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()

+{

+    return NULL;

+}

+#endif

+#if !defined(_FPDFAPI_MINI_)

+CFX_FolderFontInfo::CFX_FolderFontInfo()

+{

+}

+CFX_FolderFontInfo::~CFX_FolderFontInfo()

+{

+    FX_POSITION pos = m_FontList.GetStartPosition();

+    while (pos) {

+        CFX_ByteString key;

+        FX_LPVOID value;

+        m_FontList.GetNextAssoc(pos, key, value);

+        delete (CFontFaceInfo*)value;

+    }

+}

+void CFX_FolderFontInfo::AddPath(FX_BSTR path)

+{

+    m_PathList.Add(path);

+}

+void CFX_FolderFontInfo::Release()

+{

+    delete this;

+}

+FX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper)

+{

+    m_pMapper = pMapper;

+    for (int i = 0; i < m_PathList.GetSize(); i ++) {

+        ScanPath(m_PathList[i]);

+    }

+    return TRUE;

+}

+void CFX_FolderFontInfo::ScanPath(CFX_ByteString& path)

+{

+    void* handle = FX_OpenFolder(path);

+    if (handle == NULL) {

+        return;

+    }

+    CFX_ByteString filename;

+    FX_BOOL bFolder;

+    while (FX_GetNextFile(handle, filename, bFolder)) {

+        if (bFolder) {

+            if (filename == "." || filename == "..") {

+                continue;

+            }

+        } else {

+            CFX_ByteString ext = filename.Right(4);

+            ext.MakeUpper();

+            if (ext != ".TTF" && ext != ".OTF" && ext != ".TTC") {

+                continue;

+            }

+        }

+        CFX_ByteString fullpath = path;

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_WINDOWS_

+        fullpath += "\\";

+#else

+        fullpath += "/";

+#endif

+        fullpath += filename;

+        if (bFolder) {

+            ScanPath(fullpath);

+        } else {

+            ScanFile(fullpath);

+        }

+    }

+    FX_CloseFolder(handle);

+}

+void CFX_FolderFontInfo::ScanFile(CFX_ByteString& path)

+{

+    FXSYS_FILE* pFile = FXSYS_fopen(path, "rb");

+    if (pFile == NULL) {

+        return;

+    }

+    FXSYS_fseek(pFile, 0, FXSYS_SEEK_END);

+    FX_DWORD filesize = FXSYS_ftell(pFile);

+    FX_BYTE buffer[16];

+    FXSYS_fseek(pFile, 0, FXSYS_SEEK_SET);

+    size_t readCnt = FXSYS_fread(buffer, 12, 1, pFile);

+    if (GET_TT_LONG(buffer) == 0x74746366) {

+        FX_DWORD nFaces = GET_TT_LONG(buffer + 8);

+        FX_LPBYTE offsets = FX_Alloc(FX_BYTE, nFaces * 4);

+        if (!offsets) {

+            FXSYS_fclose(pFile);

+            return;

+        }

+        readCnt = FXSYS_fread(offsets, nFaces * 4, 1, pFile);

+        for (FX_DWORD i = 0; i < nFaces; i ++) {

+            FX_LPBYTE p = offsets + i * 4;

+            ReportFace(path, pFile, filesize, GET_TT_LONG(p));

+        }

+        FX_Free(offsets);

+    } else {

+        ReportFace(path, pFile, filesize, 0);

+    }

+    FXSYS_fclose(pFile);

+}

+void CFX_FolderFontInfo::ReportFace(CFX_ByteString& path, FXSYS_FILE* pFile, FX_DWORD filesize, FX_DWORD offset)

+{

+    FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);

+    char buffer[16];

+    if (!FXSYS_fread(buffer, 12, 1, pFile)) {

+        return;

+    }

+    FX_DWORD nTables = GET_TT_SHORT(buffer + 4);

+    CFX_ByteString tables = _FPDF_ReadStringFromFile(pFile, nTables * 16);

+    CFX_ByteString names = _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x6e616d65);

+    CFX_ByteString facename = _FPDF_GetNameFromTT(names, 1);

+    CFX_ByteString style = _FPDF_GetNameFromTT(names, 2);

+    if (style != "Regular") {

+        facename += " " + style;

+    }

+    FX_LPVOID p;

+    if (m_FontList.Lookup(facename, p)) {

+        return;

+    }

+    CFontFaceInfo* pInfo = FX_NEW CFontFaceInfo;

+    if (!pInfo) {

+        return;

+    }

+    pInfo->m_FilePath = path;

+    pInfo->m_FaceName = facename;

+    pInfo->m_FontTables = tables;

+    pInfo->m_FontOffset = offset;

+    pInfo->m_FileSize = filesize;

+    pInfo->m_Charsets = 0;

+    CFX_ByteString os2 = _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x4f532f32);

+    if (os2.GetLength() >= 86) {

+        FX_LPCBYTE p = (FX_LPCBYTE)os2 + 78;

+        FX_DWORD codepages = GET_TT_LONG(p);

+        if (codepages & (1 << 17)) {

+            m_pMapper->AddInstalledFont(facename, FXFONT_SHIFTJIS_CHARSET);

+            pInfo->m_Charsets |= CHARSET_FLAG_SHIFTJIS;

+        }

+        if (codepages & (1 << 18)) {

+            m_pMapper->AddInstalledFont(facename, FXFONT_GB2312_CHARSET);

+            pInfo->m_Charsets |= CHARSET_FLAG_GB;

+        }

+        if (codepages & (1 << 20)) {

+            m_pMapper->AddInstalledFont(facename, FXFONT_CHINESEBIG5_CHARSET);

+            pInfo->m_Charsets |= CHARSET_FLAG_BIG5;

+        }

+        if ((codepages & (1 << 19)) || (codepages & (1 << 21))) {

+            m_pMapper->AddInstalledFont(facename, FXFONT_HANGEUL_CHARSET);

+            pInfo->m_Charsets |= CHARSET_FLAG_KOREAN;

+        }

+        if (codepages & (1 << 31)) {

+            m_pMapper->AddInstalledFont(facename, FXFONT_SYMBOL_CHARSET);

+            pInfo->m_Charsets |= CHARSET_FLAG_SYMBOL;

+        }

+    }

+    m_pMapper->AddInstalledFont(facename, FXFONT_ANSI_CHARSET);

+    pInfo->m_Charsets |= CHARSET_FLAG_ANSI;

+    pInfo->m_Styles = 0;

+    if (style.Find(FX_BSTRC("Bold")) > -1) {

+        pInfo->m_Styles |= FXFONT_BOLD;

+    }

+    if (style.Find(FX_BSTRC("Italic")) > -1 || style.Find(FX_BSTRC("Oblique")) > -1) {

+        pInfo->m_Styles |= FXFONT_ITALIC;

+    }

+    if (facename.Find(FX_BSTRC("Serif")) > -1) {

+        pInfo->m_Styles |= FXFONT_SERIF;

+    }

+    m_FontList.SetAt(facename, pInfo);

+}

+void* CFX_FolderFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact)

+{

+    return NULL;

+}

+void* CFX_FolderFontInfo::GetFont(FX_LPCSTR face)

+{

+    FX_LPVOID p;

+    if (!m_FontList.Lookup(face, p)) {

+        return NULL;

+    }

+    return p;

+}

+FX_DWORD CFX_FolderFontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)

+{

+    if (hFont == NULL) {

+        return 0;

+    }

+    CFontFaceInfo* pFont = (CFontFaceInfo*)hFont;

+    FXSYS_FILE* pFile = NULL;

+    if (size > 0) {

+        pFile = FXSYS_fopen(pFont->m_FilePath, "rb");

+        if (pFile == NULL) {

+            return 0;

+        }

+    }

+    FX_DWORD datasize = 0;

+    FX_DWORD offset;

+    if (table == 0)	{

+        datasize = pFont->m_FontOffset ? 0 : pFont->m_FileSize;

+        offset = 0;

+    } else if (table == 0x74746366)	{

+        datasize = pFont->m_FontOffset ? pFont->m_FileSize : 0;

+        offset = 0;

+    } else {

+        FX_DWORD nTables = pFont->m_FontTables.GetLength() / 16;

+        for (FX_DWORD i = 0; i < nTables; i ++) {

+            FX_LPCBYTE p = (FX_LPCBYTE)pFont->m_FontTables + i * 16;

+            if (GET_TT_LONG(p) == table) {

+                offset = GET_TT_LONG(p + 8);

+                datasize = GET_TT_LONG(p + 12);

+            }

+        }

+    }

+    if (datasize && size >= datasize && pFile) {

+        FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);

+        size_t readCnt = FXSYS_fread(buffer, datasize, 1, pFile);

+    }

+    if (pFile) {

+        FXSYS_fclose(pFile);

+    }

+    return datasize;

+}

+void CFX_FolderFontInfo::DeleteFont(void* hFont)

+{

+}

+FX_BOOL CFX_FolderFontInfo::GetFaceName(void* hFont, CFX_ByteString& name)

+{

+    if (hFont == NULL) {

+        return FALSE;

+    }

+    CFontFaceInfo* pFont = (CFontFaceInfo*)hFont;

+    name = pFont->m_FaceName;

+    return TRUE;

+}

+FX_BOOL CFX_FolderFontInfo::GetFontCharset(void* hFont, int& charset)

+{

+    return FALSE;

+}

+#endif

diff --git a/core/src/fxge/ge/fx_ge_linux.cpp b/core/src/fxge/ge/fx_ge_linux.cpp
new file mode 100644
index 0000000..33cfcfe
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_linux.cpp
@@ -0,0 +1,259 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#include "../agg/include/fx_agg_driver.h"

+#include "text_int.h"

+#if !defined(_FPDFAPI_MINI_) &&  _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_

+#if (_FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))

+void CFX_AggDeviceDriver::InitPlatform()

+{

+}

+void CFX_AggDeviceDriver::DestroyPlatform()

+{

+}

+void CFX_FaceCache::InitPlatform()

+{

+}

+FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,

+        CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,

+        FX_FLOAT font_size, FX_DWORD argb)

+{

+    return FALSE;

+}

+CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index, const CFX_AffineMatrix* pMatrix,

+        int dest_width, int anti_alias)

+{

+    return NULL;

+}

+void CFX_Font::ReleasePlatformResource()

+{

+}

+#endif

+static const struct {

+    FX_LPCSTR	m_pName;

+    FX_LPCSTR	m_pSubstName;

+}

+Base14Substs[] = {

+    {"Courier", "Courier New"},

+    {"Courier-Bold", "Courier New Bold"},

+    {"Courier-BoldOblique", "Courier New Bold Italic"},

+    {"Courier-Oblique", "Courier New Italic"},

+    {"Helvetica", "Arial"},

+    {"Helvetica-Bold", "Arial Bold"},

+    {"Helvetica-BoldOblique", "Arial Bold Italic"},

+    {"Helvetica-Oblique", "Arial Italic"},

+    {"Times-Roman", "Times New Roman"},

+    {"Times-Bold", "Times New Roman Bold"},

+    {"Times-BoldItalic", "Times New Roman Bold Italic"},

+    {"Times-Italic", "Times New Roman Italic"},

+};

+class CFX_LinuxFontInfo : public CFX_FolderFontInfo

+{

+public:

+    virtual void*		MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);

+    FX_BOOL				ParseFontCfg();

+    void*				FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName);

+};

+#define LINUX_GPNAMESIZE	6

+static const struct {

+    FX_LPCSTR NameArr[LINUX_GPNAMESIZE];

+}

+LinuxGpFontList[] = {

+    {{"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic", "VL Gothic regular"}},

+    {{"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", NULL, "VL Gothic regular"}},

+    {{"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},

+    {{"TakaoMincho", "IPAMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},

+};

+static const FX_LPCSTR g_LinuxGbFontList[] = {

+    "AR PL UMing CN Light",

+    "WenQuanYi Micro Hei",

+    "AR PL UKai CN",

+};

+static const FX_LPCSTR g_LinuxB5FontList[] = {

+    "AR PL UMing TW Light",

+    "WenQuanYi Micro Hei",

+    "AR PL UKai TW",

+};

+static const FX_LPCSTR g_LinuxHGFontList[] = {

+    "UnDotum",

+};

+static FX_INT32 GetJapanesePreference(FX_LPCSTR facearr, int weight, int picth_family)

+{

+    CFX_ByteString face = facearr;

+    if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {

+        if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {

+            return 0;

+        } else {

+            return 1;

+        }

+    } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {

+        if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {

+            return 2;

+        } else {

+            return 3;

+        }

+    }

+    if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {

+        return 0;

+    }

+    return 2;

+}

+void* CFX_LinuxFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)

+{

+    CFX_ByteString face = cstr_face;

+    int iBaseFont;

+    for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)

+        if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {

+            face = Base14Substs[iBaseFont].m_pSubstName;

+            bExact = TRUE;

+            break;

+        }

+    if (iBaseFont < 12) {

+        return GetFont(face);

+    }

+    FX_LPVOID p = NULL;

+    FX_BOOL bCJK = TRUE;

+    switch (charset) {

+        case FXFONT_SHIFTJIS_CHARSET: {

+                FX_INT32 index = GetJapanesePreference(cstr_face, weight, pitch_family);

+                if (index < 0) {

+                    break;

+                }

+                for (FX_INT32 i = 0; i < LINUX_GPNAMESIZE; i++)

+                    if (m_FontList.Lookup(LinuxGpFontList[index].NameArr[i], p)) {

+                        return p;

+                    }

+            }

+            break;

+        case FXFONT_GB2312_CHARSET: {

+                static FX_INT32 s_gbCount = sizeof(g_LinuxGbFontList) / sizeof(FX_LPCSTR);

+                for (FX_INT32 i = 0; i < s_gbCount; i++)

+                    if (m_FontList.Lookup(g_LinuxGbFontList[i], p)) {

+                        return p;

+                    }

+            }

+            break;

+        case FXFONT_CHINESEBIG5_CHARSET: {

+                static FX_INT32 s_b5Count = sizeof(g_LinuxB5FontList) / sizeof(FX_LPCSTR);

+                for (FX_INT32 i = 0; i < s_b5Count; i++)

+                    if (m_FontList.Lookup(g_LinuxB5FontList[i], p)) {

+                        return p;

+                    }

+            }

+            break;

+        case FXFONT_HANGEUL_CHARSET: {

+                static FX_INT32 s_hgCount = sizeof(g_LinuxHGFontList) / sizeof(FX_LPCSTR);

+                for (FX_INT32 i = 0; i < s_hgCount; i++)

+                    if (m_FontList.Lookup(g_LinuxHGFontList[i], p)) {

+                        return p;

+                    }

+            }

+            break;

+        default:

+            bCJK = FALSE;

+            break;

+    }

+    if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {

+        return GetFont("Courier New");

+    }

+    return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK);

+}

+static FX_DWORD _LinuxGetCharset(int charset)

+{

+    switch(charset) {

+        case FXFONT_SHIFTJIS_CHARSET:

+            return CHARSET_FLAG_SHIFTJIS;

+        case FXFONT_GB2312_CHARSET:

+            return CHARSET_FLAG_GB;

+        case FXFONT_CHINESEBIG5_CHARSET:

+            return CHARSET_FLAG_BIG5;

+        case FXFONT_HANGEUL_CHARSET:

+            return CHARSET_FLAG_KOREAN;

+        case FXFONT_SYMBOL_CHARSET:

+            return CHARSET_FLAG_SYMBOL;

+        case FXFONT_ANSI_CHARSET:

+            return CHARSET_FLAG_ANSI;

+        default:

+            break;

+    }

+    return 0;

+}

+static FX_INT32 _LinuxGetSimilarValue(int weight, FX_BOOL bItalic, int pitch_family, FX_DWORD style)

+{

+    FX_INT32 iSimilarValue = 0;

+    if ((style & FXFONT_BOLD) == (weight > 400)) {

+        iSimilarValue += 16;

+    }

+    if ((style & FXFONT_ITALIC) == bItalic) {

+        iSimilarValue += 16;

+    }

+    if ((style & FXFONT_SERIF) == (pitch_family & FXFONT_FF_ROMAN)) {

+        iSimilarValue += 16;

+    }

+    if ((style & FXFONT_SCRIPT) == (pitch_family & FXFONT_FF_SCRIPT)) {

+        iSimilarValue += 8;

+    }

+    if ((style & FXFONT_FIXED_PITCH) == (pitch_family & FXFONT_FF_FIXEDPITCH)) {

+        iSimilarValue += 8;

+    }

+    return iSimilarValue;

+}

+void* CFX_LinuxFontInfo::FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName)

+{

+    CFontFaceInfo* pFind = NULL;

+    FX_DWORD charset_flag = _LinuxGetCharset(charset);

+    FX_INT32 iBestSimilar = 0;

+    FX_POSITION pos = m_FontList.GetStartPosition();

+    while (pos) {

+        CFX_ByteString bsName;

+        CFontFaceInfo* pFont = NULL;

+        m_FontList.GetNextAssoc(pos, bsName, (FX_LPVOID&)pFont);

+        if (!(pFont->m_Charsets & charset_flag) && charset != FXFONT_DEFAULT_CHARSET) {

+            continue;

+        }

+        FX_INT32 iSimilarValue = 0;

+        FX_INT32 index = bsName.Find(family);

+        if (bMatchName && index < 0) {

+            continue;

+        }

+        if (!bMatchName && index > 0) {

+            iSimilarValue += 64;

+        }

+        iSimilarValue = _LinuxGetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles);

+        if (iSimilarValue > iBestSimilar) {

+            iBestSimilar = iSimilarValue;

+            pFind = pFont;

+        }

+    }

+    return pFind;

+}

+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()

+{

+    CFX_LinuxFontInfo* pInfo = FX_NEW CFX_LinuxFontInfo;

+    if (!pInfo) {

+        return NULL;

+    }

+    if (!pInfo->ParseFontCfg()) {

+        pInfo->AddPath("/usr/share/fonts");

+        pInfo->AddPath("/usr/share/X11/fonts/Type1");

+        pInfo->AddPath("/usr/share/X11/fonts/TTF");

+        pInfo->AddPath("/usr/local/share/fonts");

+    }

+    return pInfo;

+}

+FX_BOOL CFX_LinuxFontInfo::ParseFontCfg()

+{

+    return FALSE;

+}

+void CFX_GEModule::InitPlatform()

+{

+    m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());

+}

+void CFX_GEModule::DestroyPlatform()

+{

+}

+#endif

diff --git a/core/src/fxge/ge/fx_ge_path.cpp b/core/src/fxge/ge/fx_ge_path.cpp
new file mode 100644
index 0000000..fc6ee52
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_path.cpp
@@ -0,0 +1,654 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxcrt/fx_basic.h"

+#include "../../../include/fxge/fx_ge.h"

+CFX_ClipRgn::CFX_ClipRgn(int width, int height)

+{

+    m_Type = RectI;

+    m_Box.left = m_Box.top = 0;

+    m_Box.right = width;

+    m_Box.bottom = height;

+}

+CFX_ClipRgn::CFX_ClipRgn(const FX_RECT& rect)

+{

+    m_Type = RectI;

+    m_Box = rect;

+}

+CFX_ClipRgn::CFX_ClipRgn(const CFX_ClipRgn& src)

+{

+    m_Type = src.m_Type;

+    m_Box = src.m_Box;

+    m_Mask = src.m_Mask;

+}

+CFX_ClipRgn::~CFX_ClipRgn()

+{

+}

+void CFX_ClipRgn::Reset(const FX_RECT& rect)

+{

+    m_Type = RectI;

+    m_Box = rect;

+    m_Mask.SetNull();

+}

+void CFX_ClipRgn::IntersectRect(const FX_RECT& rect)

+{

+    if (m_Type == RectI) {

+        m_Box.Intersect(rect);

+        return;

+    }

+    if (m_Type == MaskF) {

+        IntersectMaskRect(rect, m_Box, m_Mask);

+        return;

+    }

+}

+void CFX_ClipRgn::IntersectMaskRect(FX_RECT rect, FX_RECT mask_rect, CFX_DIBitmapRef Mask)

+{

+    const CFX_DIBitmap* mask_dib = Mask;

+    m_Type = MaskF;

+    m_Box = rect;

+    m_Box.Intersect(mask_rect);

+    if (m_Box.IsEmpty()) {

+        m_Type = RectI;

+        return;

+    } else if (m_Box == mask_rect) {

+        m_Mask = Mask;

+        return;

+    }

+    CFX_DIBitmap* new_dib = m_Mask.New();

+    if (!new_dib) {

+        return;

+    }

+    new_dib->Create(m_Box.Width(), m_Box.Height(), FXDIB_8bppMask);

+    for (int row = m_Box.top; row < m_Box.bottom; row ++) {

+        FX_LPBYTE dest_scan = new_dib->GetBuffer() + new_dib->GetPitch() * (row - m_Box.top);

+        FX_LPBYTE src_scan = mask_dib->GetBuffer() + mask_dib->GetPitch() * (row - mask_rect.top);

+        for (int col = m_Box.left; col < m_Box.right; col ++) {

+            dest_scan[col - m_Box.left] = src_scan[col - mask_rect.left];

+        }

+    }

+}

+void CFX_ClipRgn::IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask)

+{

+    const CFX_DIBitmap* mask_dib = Mask;

+    ASSERT(mask_dib->GetFormat() == FXDIB_8bppMask);

+    FX_RECT mask_box(left, top, left + mask_dib->GetWidth(), top + mask_dib->GetHeight());

+    if (m_Type == RectI) {

+        IntersectMaskRect(m_Box, mask_box, Mask);

+        return;

+    }

+    if (m_Type == MaskF) {

+        FX_RECT new_box = m_Box;

+        new_box.Intersect(mask_box);

+        if (new_box.IsEmpty()) {

+            m_Type = RectI;

+            m_Mask.SetNull();

+            m_Box = new_box;

+            return;

+        }

+        CFX_DIBitmapRef new_mask;

+        CFX_DIBitmap* new_dib = new_mask.New();

+        if (!new_dib) {

+            return;

+        }

+        new_dib->Create(new_box.Width(), new_box.Height(), FXDIB_8bppMask);

+        const CFX_DIBitmap* old_dib = m_Mask;

+        for (int row = new_box.top; row < new_box.bottom; row ++) {

+            FX_LPBYTE old_scan = old_dib->GetBuffer() + (row - m_Box.top) * old_dib->GetPitch();

+            FX_LPBYTE mask_scan = mask_dib->GetBuffer() + (row - top) * mask_dib->GetPitch();

+            FX_LPBYTE new_scan = new_dib->GetBuffer() + (row - new_box.top) * new_dib->GetPitch();

+            for (int col = new_box.left; col < new_box.right; col ++) {

+                new_scan[col - new_box.left] = old_scan[col - m_Box.left] * mask_scan[col - left] / 255;

+            }

+        }

+        m_Box = new_box;

+        m_Mask = new_mask;

+        return;

+    }

+    ASSERT(FALSE);

+}

+CFX_PathData::CFX_PathData()

+{

+    m_PointCount = m_AllocCount = 0;

+    m_pPoints = NULL;

+}

+CFX_PathData::~CFX_PathData()

+{

+    if (m_pPoints) {

+        FX_Free(m_pPoints);

+    }

+}

+FX_BOOL CFX_PathData::SetPointCount(int nPoints)

+{

+    m_PointCount = nPoints;

+    if (m_AllocCount < nPoints) {

+        if (m_pPoints) {

+            FX_Free(m_pPoints);

+            m_pPoints = NULL;

+        }

+        m_pPoints = FX_Alloc(FX_PATHPOINT, nPoints);

+        if (!m_pPoints) {

+            return FALSE;

+        }

+        m_AllocCount = nPoints;

+    }

+    return TRUE;

+}

+FX_BOOL CFX_PathData::AllocPointCount(int nPoints)

+{

+    if (m_AllocCount < nPoints) {

+        FX_PATHPOINT* pNewBuf = FX_Alloc(FX_PATHPOINT, nPoints);

+        if (!pNewBuf) {

+            return FALSE;

+        }

+        if (m_PointCount) {

+            FXSYS_memcpy32(pNewBuf, m_pPoints, m_PointCount * sizeof(FX_PATHPOINT));

+        }

+        if (m_pPoints) {

+            FX_Free(m_pPoints);

+        }

+        m_pPoints = pNewBuf;

+        m_AllocCount = nPoints;

+    }

+    return TRUE;

+}

+CFX_PathData::CFX_PathData(const CFX_PathData& src)

+{

+    m_pPoints = NULL;

+    m_PointCount = m_AllocCount = src.m_PointCount;

+    m_pPoints = FX_Alloc(FX_PATHPOINT, src.m_PointCount);

+    if (!m_pPoints) {

+        return;

+    }

+    FXSYS_memcpy32(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);

+}

+void CFX_PathData::TrimPoints(int nPoints)

+{

+    if (m_PointCount <= nPoints) {

+        return;

+    }

+    SetPointCount(nPoints);

+}

+FX_BOOL CFX_PathData::AddPointCount(int addPoints)

+{

+    int new_count = m_PointCount + addPoints;

+    if (!AllocPointCount(new_count)) {

+        return FALSE;

+    }

+    m_PointCount = new_count;

+    return TRUE;

+}

+FX_BOOL CFX_PathData::Append(const CFX_PathData* pSrc, const CFX_AffineMatrix* pMatrix)

+{

+    int old_count = m_PointCount;

+    if (!AddPointCount(pSrc->m_PointCount)) {

+        return FALSE;

+    }

+    FXSYS_memcpy32(m_pPoints + old_count, pSrc->m_pPoints, pSrc->m_PointCount * sizeof(FX_PATHPOINT));

+    if (pMatrix == NULL) {

+        return TRUE;

+    }

+    for (int i = 0; i < pSrc->m_PointCount; i ++) {

+        pMatrix->Transform(m_pPoints[old_count + i].m_PointX, m_pPoints[old_count + i].m_PointY);

+    }

+    return TRUE;

+}

+void CFX_PathData::SetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag)

+{

+    ASSERT(index < m_PointCount);

+    m_pPoints[index].m_PointX = x;

+    m_pPoints[index].m_PointY = y;

+    m_pPoints[index].m_Flag = flag;

+}

+FX_BOOL CFX_PathData::AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)

+{

+    int old_count = m_PointCount;

+    if (!AddPointCount(5)) {

+        return FALSE;

+    }

+    FX_PATHPOINT* pPoints = m_pPoints + old_count;

+    pPoints[0].m_PointX = pPoints[1].m_PointX = pPoints[4].m_PointX = left;

+    pPoints[2].m_PointX = pPoints[3].m_PointX = right;

+    pPoints[0].m_PointY = pPoints[3].m_PointY = pPoints[4].m_PointY = bottom;

+    pPoints[1].m_PointY = pPoints[2].m_PointY = top;

+    pPoints[0].m_Flag = FXPT_MOVETO;

+    pPoints[1].m_Flag = pPoints[2].m_Flag = pPoints[3].m_Flag = FXPT_LINETO;

+    pPoints[4].m_Flag = FXPT_LINETO | FXPT_CLOSEFIGURE;

+    return TRUE;

+}

+CFX_FloatRect CFX_PathData::GetBoundingBox() const

+{

+    CFX_FloatRect rect;

+    if (m_PointCount) {

+        rect.InitRect(m_pPoints[0].m_PointX, m_pPoints[0].m_PointY);

+        for (int i = 1; i < m_PointCount; i ++) {

+            rect.UpdateRect(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);

+        }

+    }

+    return rect;

+}

+static void _UpdateLineEndPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y, FX_FLOAT end_x, FX_FLOAT end_y,

+                                 FX_FLOAT hw)

+{

+    if (start_x == end_x) {

+        if (start_y == end_y) {

+            rect.UpdateRect(end_x + hw, end_y + hw);

+            rect.UpdateRect(end_x - hw, end_y - hw);

+            return;

+        }

+        FX_FLOAT point_y;

+        if (end_y < start_y) {

+            point_y = end_y - hw;

+        } else {

+            point_y = end_y + hw;

+        }

+        rect.UpdateRect(end_x + hw, point_y);

+        rect.UpdateRect(end_x - hw, point_y);

+        return;

+    } else if (start_y == end_y) {

+        FX_FLOAT point_x;

+        if (end_x < start_x) {

+            point_x = end_x - hw;

+        } else {

+            point_x = end_x + hw;

+        }

+        rect.UpdateRect(point_x, end_y + hw);

+        rect.UpdateRect(point_x, end_y - hw);

+        return;

+    }

+    FX_FLOAT dx = end_x - start_x;

+    FX_FLOAT dy = end_y - start_y;

+    FX_FLOAT ll = FXSYS_sqrt2(dx, dy);

+    FX_FLOAT mx = end_x + hw * dx / ll;

+    FX_FLOAT my = end_y + hw * dy / ll;

+    FX_FLOAT dx1 = hw * dy / ll;

+    FX_FLOAT dy1 = hw * dx / ll;

+    rect.UpdateRect(mx - dx1, my + dy1);

+    rect.UpdateRect(mx + dx1, my - dy1);

+}

+static void _UpdateLineJoinPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y,

+                                  FX_FLOAT middle_x, FX_FLOAT middle_y, FX_FLOAT end_x, FX_FLOAT end_y,

+                                  FX_FLOAT half_width, FX_FLOAT miter_limit)

+{

+    FX_FLOAT start_k = 0, start_c = 0, end_k = 0, end_c = 0, start_len = 0, start_dc = 0, end_len = 0, end_dc = 0;

+    FX_BOOL bStartVert = FXSYS_fabs(start_x - middle_x) < 1.0f / 20;

+    FX_BOOL bEndVert = FXSYS_fabs(middle_x - end_x) < 1.0f / 20;

+    if (bStartVert && bEndVert) {

+        int start_dir = middle_y > start_y ? 1 : -1;

+        FX_FLOAT point_y = middle_y + half_width * start_dir;

+        rect.UpdateRect(middle_x + half_width, point_y);

+        rect.UpdateRect(middle_x - half_width, point_y);

+        return;

+    }

+    if (!bStartVert) {

+        start_k = FXSYS_Div(middle_y - start_y, middle_x - start_x);

+        start_c = middle_y - FXSYS_Mul(start_k, middle_x);

+        start_len = FXSYS_sqrt2(start_x - middle_x, start_y - middle_y);

+        start_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, start_len, start_x - middle_x));

+    }

+    if (!bEndVert) {

+        end_k = FXSYS_Div(end_y - middle_y, end_x - middle_x);

+        end_c = middle_y - FXSYS_Mul(end_k, middle_x);

+        end_len = FXSYS_sqrt2(end_x - middle_x, end_y - middle_y);

+        end_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, end_len, end_x - middle_x));

+    }

+    if (bStartVert) {

+        FX_FLOAT outside_x = start_x;

+        if (end_x < start_x) {

+            outside_x += half_width;

+        } else {

+            outside_x -= half_width;

+        }

+        FX_FLOAT outside_y;

+        if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {

+            outside_y = FXSYS_Mul(end_k, outside_x) + end_c + end_dc;

+        } else {

+            outside_y = FXSYS_Mul(end_k, outside_x) + end_c - end_dc;

+        }

+        rect.UpdateRect(outside_x, outside_y);

+        return;

+    }

+    if (bEndVert) {

+        FX_FLOAT outside_x = end_x;

+        if (start_x < end_x) {

+            outside_x += half_width;

+        } else {

+            outside_x -= half_width;

+        }

+        FX_FLOAT outside_y;

+        if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {

+            outside_y = FXSYS_Mul(start_k, outside_x) + start_c + start_dc;

+        } else {

+            outside_y = FXSYS_Mul(start_k, outside_x) + start_c - start_dc;

+        }

+        rect.UpdateRect(outside_x, outside_y);

+        return;

+    }

+    if (FXSYS_fabs(start_k - end_k) < 1.0f / 20) {

+        int start_dir = middle_x > start_x ? 1 : -1;

+        int end_dir = end_x > middle_x ? 1 : -1;

+        if (start_dir == end_dir) {

+            _UpdateLineEndPoints(rect, middle_x, middle_y, end_x, end_y, half_width);

+        } else {

+            _UpdateLineEndPoints(rect, start_x, start_y, middle_x, middle_y, half_width);

+        }

+        return;

+    }

+    FX_FLOAT start_outside_c = start_c;

+    if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {

+        start_outside_c += start_dc;

+    } else {

+        start_outside_c -= start_dc;

+    }

+    FX_FLOAT end_outside_c = end_c;

+    if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {

+        end_outside_c += end_dc;

+    } else {

+        end_outside_c -= end_dc;

+    }

+    FX_FLOAT join_x = FXSYS_Div(end_outside_c - start_outside_c, start_k - end_k);

+    FX_FLOAT join_y = FXSYS_Mul(start_k, join_x) + start_outside_c;

+    rect.UpdateRect(join_x, join_y);

+}

+CFX_FloatRect CFX_PathData::GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const

+{

+    CFX_FloatRect rect(100000 * 1.0f, 100000 * 1.0f, -100000 * 1.0f, -100000 * 1.0f);

+    int iPoint = 0;

+    FX_FLOAT half_width = line_width;

+    int iStartPoint, iEndPoint, iMiddlePoint;

+    FX_BOOL bJoin;

+    while (iPoint < m_PointCount) {

+        if (m_pPoints[iPoint].m_Flag == FXPT_MOVETO) {

+            iStartPoint = iPoint + 1;

+            iEndPoint = iPoint;

+            bJoin = FALSE;

+        } else {

+            if (m_pPoints[iPoint].m_Flag == FXPT_BEZIERTO) {

+                rect.UpdateRect(m_pPoints[iPoint].m_PointX, m_pPoints[iPoint].m_PointY);

+                rect.UpdateRect(m_pPoints[iPoint + 1].m_PointX, m_pPoints[iPoint + 1].m_PointY);

+                iPoint += 2;

+            }

+            if (iPoint == m_PointCount - 1 || m_pPoints[iPoint + 1].m_Flag == FXPT_MOVETO) {

+                iStartPoint = iPoint - 1;

+                iEndPoint = iPoint;

+                bJoin = FALSE;

+            } else {

+                iStartPoint = iPoint - 1;

+                iMiddlePoint = iPoint;

+                iEndPoint = iPoint + 1;

+                bJoin = TRUE;

+            }

+        }

+        FX_FLOAT start_x = m_pPoints[iStartPoint].m_PointX;

+        FX_FLOAT start_y = m_pPoints[iStartPoint].m_PointY;

+        FX_FLOAT end_x = m_pPoints[iEndPoint].m_PointX;

+        FX_FLOAT end_y = m_pPoints[iEndPoint].m_PointY;

+        if (bJoin) {

+            FX_FLOAT middle_x = m_pPoints[iMiddlePoint].m_PointX;

+            FX_FLOAT middle_y = m_pPoints[iMiddlePoint].m_PointY;

+            _UpdateLineJoinPoints(rect, start_x, start_y, middle_x, middle_y, end_x, end_y, half_width, miter_limit);

+        } else {

+            _UpdateLineEndPoints(rect, start_x, start_y, end_x, end_y, half_width);

+        }

+        iPoint ++;

+    }

+    return rect;

+}

+void CFX_PathData::Transform(const CFX_AffineMatrix* pMatrix)

+{

+    if (pMatrix == NULL) {

+        return;

+    }

+    for (int i = 0; i < m_PointCount; i ++) {

+        pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);

+    }

+}

+const int g_Distant[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

+FX_BOOL CFX_PathData::GetZeroAreaPath(CFX_PathData& NewPath, CFX_AffineMatrix* pMatrix, FX_BOOL&bThin, FX_BOOL bAdjust) const

+{

+    if (m_PointCount < 3) {

+        return FALSE;

+    }

+    if (m_PointCount == 3 && (m_pPoints[0].m_Flag & FXPT_TYPE) == FXPT_MOVETO &&

+            (m_pPoints[1].m_Flag & FXPT_TYPE) == FXPT_LINETO && (m_pPoints[2].m_Flag & FXPT_TYPE) == FXPT_LINETO

+            && m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) {

+        NewPath.AddPointCount(2);

+        if (bAdjust) {

+            if (pMatrix) {

+                FX_FLOAT x = m_pPoints[0].m_PointX, y = m_pPoints[0].m_PointY;

+                pMatrix->TransformPoint(x, y);

+                x = (int)x + 0.5f;

+                y = (int)y + 0.5f;

+                NewPath.SetPoint(0, x, y, FXPT_MOVETO);

+                x = m_pPoints[1].m_PointX, y = m_pPoints[1].m_PointY;

+                pMatrix->TransformPoint(x, y);

+                x = (int)x + 0.5f;

+                y = (int)y + 0.5f;

+                NewPath.SetPoint(1, x, y, FXPT_LINETO);

+                pMatrix->SetIdentity();

+            } else {

+                FX_FLOAT x = (int)m_pPoints[0].m_PointX + 0.5f, y = (int)m_pPoints[0].m_PointY + 0.5f;

+                NewPath.SetPoint(0, x, y, FXPT_MOVETO);

+                x = (int)m_pPoints[1].m_PointX + 0.5f, y = (int)m_pPoints[1].m_PointY + 0.5f;

+                NewPath.SetPoint(1, x, y, FXPT_LINETO);

+            }

+        } else {

+            NewPath.SetPoint(0, m_pPoints[0].m_PointX, m_pPoints[0].m_PointY, FXPT_MOVETO);

+            NewPath.SetPoint(1, m_pPoints[1].m_PointX, m_pPoints[1].m_PointY, FXPT_LINETO);

+        }

+        if (m_pPoints[0].m_PointX != m_pPoints[1].m_PointX && m_pPoints[0].m_PointY != m_pPoints[1].m_PointY) {

+            bThin = TRUE;

+        }

+        return TRUE;

+    }

+    if (((m_PointCount > 3) && (m_PointCount % 2))) {

+        int mid = m_PointCount / 2;

+        FX_BOOL bZeroArea = FALSE;

+        CFX_PathData t_path;

+        for (int i = 0; i < mid; i++) {

+            if (!(m_pPoints[mid - i - 1].m_PointX == m_pPoints[mid + i + 1].m_PointX

+                    && m_pPoints[mid - i - 1].m_PointY == m_pPoints[mid + i + 1].m_PointY &&

+                    ((m_pPoints[mid - i - 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[mid + i + 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO))) {

+                bZeroArea = TRUE;

+                break;

+            }

+            int new_count = t_path.GetPointCount();

+            t_path.AddPointCount(2);

+            t_path.SetPoint(new_count, m_pPoints[mid - i].m_PointX, m_pPoints[mid - i].m_PointY, FXPT_MOVETO);

+            t_path.SetPoint(new_count + 1, m_pPoints[mid - i - 1].m_PointX, m_pPoints[mid - i - 1].m_PointY, FXPT_LINETO);

+        }

+        if (!bZeroArea) {

+            NewPath.Append(&t_path, NULL);

+            bThin = TRUE;

+            return TRUE;

+        }

+    }

+    int stratPoint = 0;

+    int next = 0, i;

+    for (i = 0; i < m_PointCount; i++) {

+        int point_type = m_pPoints[i].m_Flag & FXPT_TYPE;

+        if (point_type == FXPT_MOVETO) {

+            stratPoint = i;

+        } else if (point_type == FXPT_LINETO) {

+            next = (i + 1 - stratPoint) % (m_PointCount - stratPoint) + stratPoint;

+            if ((m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_MOVETO) {

+                if((m_pPoints[i - 1].m_PointX == m_pPoints[i].m_PointX && m_pPoints[i].m_PointX == m_pPoints[next].m_PointX)

+                        && ((m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY) * (m_pPoints[i].m_PointY - m_pPoints[next].m_PointY) > 0)) {

+                    int pre = i;

+                    if (FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY)

+                            < FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[next].m_PointY)) {

+                        pre --;

+                        next--;

+                    }

+                    int new_count = NewPath.GetPointCount();

+                    NewPath.AddPointCount(2);

+                    NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);

+                    NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);

+                } else if((m_pPoints[i - 1].m_PointY == m_pPoints[i].m_PointY && m_pPoints[i].m_PointY == m_pPoints[next].m_PointY)

+                          && ((m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX) * (m_pPoints[i].m_PointX - m_pPoints[next].m_PointX) > 0)) {

+                    int pre = i;

+                    if (FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX)

+                            < FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[next].m_PointX)) {

+                        pre --;

+                        next--;

+                    }

+                    int new_count = NewPath.GetPointCount();

+                    NewPath.AddPointCount(2);

+                    NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);

+                    NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);

+                } else if ((m_pPoints[i - 1].m_Flag & FXPT_TYPE) == FXPT_MOVETO && (m_pPoints[next].m_Flag & FXPT_TYPE) == FXPT_LINETO &&

+                           m_pPoints[i - 1].m_PointX == m_pPoints[next].m_PointX && m_pPoints[i - 1].m_PointY == m_pPoints[next].m_PointY

+                           && m_pPoints[next].m_Flag & FXPT_CLOSEFIGURE) {

+                    int new_count = NewPath.GetPointCount();

+                    NewPath.AddPointCount(2);

+                    NewPath.SetPoint(new_count, m_pPoints[i - 1].m_PointX, m_pPoints[i - 1].m_PointY, FXPT_MOVETO);

+                    NewPath.SetPoint(new_count + 1, m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, FXPT_LINETO);

+                    bThin = TRUE;

+                }

+            }

+        } else if (point_type == FXPT_BEZIERTO) {

+            i += 2;

+            continue;

+        }

+    }

+    if (m_PointCount > 3 && NewPath.GetPointCount()) {

+        bThin = TRUE;

+    }

+    if (NewPath.GetPointCount() == 0) {

+        return FALSE;

+    }

+    return TRUE;

+}

+FX_BOOL CFX_PathData::IsRect() const

+{

+    if (m_PointCount != 5 && m_PointCount != 4) {

+        return FALSE;

+    }

+    if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX ||

+                               m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||

+            (m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) ||

+            (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {

+        return FALSE;

+    }

+    if (m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {

+        return FALSE;

+    }

+    for (int i = 1; i < 4; i ++) {

+        if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {

+            return FALSE;

+        }

+        if (m_pPoints[i].m_PointX != m_pPoints[i - 1].m_PointX && m_pPoints[i].m_PointY != m_pPoints[i - 1].m_PointY) {

+            return FALSE;

+        }

+    }

+    return m_PointCount == 5 || (m_pPoints[3].m_Flag & FXPT_CLOSEFIGURE);

+}

+FX_BOOL CFX_PathData::IsRect(const CFX_AffineMatrix* pMatrix, CFX_FloatRect* pRect) const

+{

+    if (pMatrix == NULL) {

+        if (!IsRect()) {

+            return FALSE;

+        }

+        if (pRect) {

+            pRect->left = m_pPoints[0].m_PointX;

+            pRect->right = m_pPoints[2].m_PointX;

+            pRect->bottom = m_pPoints[0].m_PointY;

+            pRect->top = m_pPoints[2].m_PointY;

+            pRect->Normalize();

+        }

+        return TRUE;

+    }

+    if (m_PointCount != 5 && m_PointCount != 4) {

+        return FALSE;

+    }

+    if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX || m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||

+            (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {

+        return FALSE;

+    }

+    if (m_PointCount == 4 && m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {

+        return FALSE;

+    }

+    FX_FLOAT x[5], y[5];

+    for (int i = 0; i < m_PointCount; i ++) {

+        pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, x[i], y[i]);

+        if (i) {

+            if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {

+                return FALSE;

+            }

+            if (x[i] != x[i - 1] && y[i] != y[i - 1]) {

+                return FALSE;

+            }

+        }

+    }

+    if (pRect) {

+        pRect->left = x[0];

+        pRect->right = x[2];

+        pRect->bottom = y[0];

+        pRect->top = y[2];

+        pRect->Normalize();

+    }

+    return TRUE;

+}

+FX_BOOL CFX_PathData::Copy(const CFX_PathData &src)

+{

+    if (!SetPointCount(src.m_PointCount)) {

+        return FALSE;

+    }

+    FXSYS_memcpy32(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);

+    return TRUE;

+}

+CFX_GraphStateData::CFX_GraphStateData()

+{

+    m_LineCap = LineCapButt;

+    m_DashCount = 0;

+    m_DashArray = NULL;

+    m_DashPhase = 0;

+    m_LineJoin = LineJoinMiter;

+    m_MiterLimit = 10 * 1.0f;

+    m_LineWidth = 1.0f;

+}

+CFX_GraphStateData::CFX_GraphStateData(const CFX_GraphStateData& src)

+{

+    m_DashArray = NULL;

+    Copy(src);

+}

+void CFX_GraphStateData::Copy(const CFX_GraphStateData& src)

+{

+    m_LineCap = src.m_LineCap;

+    m_DashCount = src.m_DashCount;

+    if (m_DashArray) {

+        FX_Free(m_DashArray);

+    }

+    m_DashArray = NULL;

+    m_DashPhase = src.m_DashPhase;

+    m_LineJoin = src.m_LineJoin;

+    m_MiterLimit = src.m_MiterLimit;

+    m_LineWidth = src.m_LineWidth;

+    if (m_DashCount) {

+        m_DashArray = FX_Alloc(FX_FLOAT, m_DashCount);

+        if (!m_DashArray) {

+            return;

+        }

+        FXSYS_memcpy32(m_DashArray, src.m_DashArray, m_DashCount * sizeof(FX_FLOAT));

+    }

+}

+CFX_GraphStateData::~CFX_GraphStateData()

+{

+    if (m_DashArray) {

+        FX_Free(m_DashArray);

+    }

+}

+void CFX_GraphStateData::SetDashCount(int count)

+{

+    if (m_DashArray) {

+        FX_Free(m_DashArray);

+    }

+    m_DashArray = NULL;

+    m_DashCount = count;

+    if (count == 0) {

+        return;

+    }

+    m_DashArray = FX_Alloc(FX_FLOAT, count);

+}

diff --git a/core/src/fxge/ge/fx_ge_ps.cpp b/core/src/fxge/ge/fx_ge_ps.cpp
new file mode 100644
index 0000000..a39ab2d
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_ps.cpp
@@ -0,0 +1,657 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "text_int.h"

+struct PSGlyph {

+    CFX_Font*		m_pFont;

+    FX_DWORD		m_GlyphIndex;

+    FX_BOOL			m_bGlyphAdjust;

+    FX_FLOAT		m_AdjustMatrix[4];

+};

+class CPSFont : public CFX_Object

+{

+public:

+    PSGlyph			m_Glyphs[256];

+    int				m_nGlyphs;

+};

+CFX_PSRenderer::CFX_PSRenderer()

+{

+    m_pOutput = NULL;

+    m_bColorSet = m_bGraphStateSet = FALSE;

+    m_bInited = FALSE;

+}

+CFX_PSRenderer::~CFX_PSRenderer()

+{

+    for (int i = 0; i < (int)m_PSFontList.GetSize(); i ++) {

+        CPSFont* pFont = m_PSFontList[i];

+        delete pFont;

+    }

+}

+#define OUTPUT_PS(str) m_pOutput->OutputPS(str, sizeof str-1)

+void CFX_PSRenderer::Init(IFX_PSOutput* pOutput, int pslevel, int width, int height, FX_BOOL bCmykOutput)

+{

+    m_PSLevel = pslevel;

+    m_pOutput = pOutput;

+    m_ClipBox.left = m_ClipBox.top = 0;

+    m_ClipBox.right = width;

+    m_ClipBox.bottom = height;

+    m_bCmykOutput = bCmykOutput;

+}

+FX_BOOL CFX_PSRenderer::StartRendering()

+{

+    if (m_bInited) {

+        return TRUE;

+    }

+    static const char init_str[] = "\nsave\n/im/initmatrix load def\n"

+                                   "/n/newpath load def/m/moveto load def/l/lineto load def/c/curveto load def/h/closepath load def\n"

+                                   "/f/fill load def/F/eofill load def/s/stroke load def/W/clip load def/W*/eoclip load def\n"

+                                   "/rg/setrgbcolor load def/k/setcmykcolor load def\n"

+                                   "/J/setlinecap load def/j/setlinejoin load def/w/setlinewidth load def/M/setmiterlimit load def/d/setdash load def\n"

+                                   "/q/gsave load def/Q/grestore load def/iM/imagemask load def\n"

+                                   "/Tj/show load def/Ff/findfont load def/Fs/scalefont load def/Sf/setfont load def\n"

+                                   "/cm/concat load def/Cm/currentmatrix load def/mx/matrix load def/sm/setmatrix load def\n"

+                                   ;

+    OUTPUT_PS(init_str);

+    m_bInited = TRUE;

+    return TRUE;

+}

+void CFX_PSRenderer::EndRendering()

+{

+    if (m_bInited) {

+        OUTPUT_PS("\nrestore\n");

+    }

+    m_bInited = FALSE;

+}

+void CFX_PSRenderer::SaveState()

+{

+    StartRendering();

+    OUTPUT_PS("q\n");

+    m_ClipBoxStack.Add(m_ClipBox);

+}

+void CFX_PSRenderer::RestoreState(FX_BOOL bKeepSaved)

+{

+    StartRendering();

+    if (bKeepSaved) {

+        OUTPUT_PS("Q\nq\n");

+    } else {

+        OUTPUT_PS("Q\n");

+    }

+    m_bColorSet = m_bGraphStateSet = FALSE;

+    m_ClipBox = m_ClipBoxStack.GetAt(m_ClipBoxStack.GetSize() - 1);

+    if (!bKeepSaved) {

+        m_ClipBoxStack.RemoveAt(m_ClipBoxStack.GetSize() - 1);

+    }

+}

+void CFX_PSRenderer::OutputPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device)

+{

+    int nPoints = pPathData->GetPointCount();

+    CFX_ByteTextBuf buf;

+    buf.EstimateSize(nPoints * 10);

+    for (int i = 0; i < nPoints; i ++) {

+        FX_BYTE flag = pPathData->GetFlag(i);

+        FX_FLOAT x = pPathData->GetPointX(i);

+        FX_FLOAT y = pPathData->GetPointY(i);

+        if (pObject2Device) {

+            pObject2Device->Transform(x, y);

+        }

+        buf << x << FX_BSTRC(" ") << y;

+        switch (flag & FXPT_TYPE) {

+            case FXPT_MOVETO:

+                buf << FX_BSTRC(" m ");

+                break;

+            case FXPT_LINETO:

+                if (flag & FXPT_CLOSEFIGURE) {

+                    buf << FX_BSTRC(" l h ");

+                } else {

+                    buf << FX_BSTRC(" l ");

+                }

+                break;

+            case FXPT_BEZIERTO: {

+                    FX_FLOAT x1 = pPathData->GetPointX(i + 1);

+                    FX_FLOAT x2 = pPathData->GetPointX(i + 2);

+                    FX_FLOAT y1 = pPathData->GetPointY(i + 1);

+                    FX_FLOAT y2 = pPathData->GetPointY(i + 2);

+                    if (pObject2Device) {

+                        pObject2Device->Transform(x1, y1);

+                        pObject2Device->Transform(x2, y2);

+                    }

+                    buf << FX_BSTRC(" ") << x1 << FX_BSTRC(" ") << y1 << FX_BSTRC(" ") << x2 << FX_BSTRC(" ") << y2;

+                    if (flag & FXPT_CLOSEFIGURE) {

+                        buf << FX_BSTRC(" c h\n");

+                    } else {

+                        buf << FX_BSTRC(" c\n");

+                    }

+                    i += 2;

+                    break;

+                }

+        }

+    }

+    m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());

+}

+void CFX_PSRenderer::SetClip_PathFill(const CFX_PathData* pPathData,

+                                      const CFX_AffineMatrix* pObject2Device,

+                                      int fill_mode

+                                     )

+{

+    StartRendering();

+    OutputPath(pPathData, pObject2Device);

+    CFX_FloatRect rect = pPathData->GetBoundingBox();

+    if (pObject2Device) {

+        rect.Transform(pObject2Device);

+    }

+    m_ClipBox.Intersect(rect.GetOutterRect());

+    if ((fill_mode & 3) == FXFILL_WINDING) {

+        OUTPUT_PS("W n\n");

+    } else {

+        OUTPUT_PS("W* n\n");

+    }

+}

+void CFX_PSRenderer::SetClip_PathStroke(const CFX_PathData* pPathData,

+                                        const CFX_AffineMatrix* pObject2Device,

+                                        const CFX_GraphStateData* pGraphState

+                                       )

+{

+    StartRendering();

+    SetGraphState(pGraphState);

+    if (pObject2Device) {

+        CFX_ByteTextBuf buf;

+        buf << FX_BSTRC("mx Cm [") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ") <<

+            pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d << FX_BSTRC(" ") << pObject2Device->e <<

+            FX_BSTRC(" ") << pObject2Device->f << FX_BSTRC("]cm ");

+        m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());

+    }

+    OutputPath(pPathData, NULL);

+    CFX_FloatRect rect = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);

+    rect.Transform(pObject2Device);

+    m_ClipBox.Intersect(rect.GetOutterRect());

+    if (pObject2Device) {

+        OUTPUT_PS("strokepath W n sm\n");

+    } else {

+        OUTPUT_PS("strokepath W n\n");

+    }

+}

+FX_BOOL CFX_PSRenderer::DrawPath(const CFX_PathData* pPathData,

+                                 const CFX_AffineMatrix* pObject2Device,

+                                 const CFX_GraphStateData* pGraphState,

+                                 FX_DWORD fill_color,

+                                 FX_DWORD stroke_color,

+                                 int fill_mode,

+                                 int alpha_flag,

+                                 void* pIccTransform

+                                )

+{

+    StartRendering();

+    int fill_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);

+    int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_STROKE(alpha_flag) : FXARGB_A(stroke_color);

+    if (fill_alpha && fill_alpha < 255) {

+        return FALSE;

+    }

+    if (stroke_alpha && stroke_alpha < 255) {

+        return FALSE;

+    }

+    if (fill_alpha == 0 && stroke_alpha == 0) {

+        return FALSE;

+    }

+    if (stroke_alpha) {

+        SetGraphState(pGraphState);

+        if (pObject2Device) {

+            CFX_ByteTextBuf buf;

+            buf << FX_BSTRC("mx Cm [") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ") <<

+                pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d << FX_BSTRC(" ") << pObject2Device->e <<

+                FX_BSTRC(" ") << pObject2Device->f << FX_BSTRC("]cm ");

+            m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());

+        }

+    }

+    OutputPath(pPathData, stroke_alpha ? NULL : pObject2Device);

+    if (fill_mode && fill_alpha) {

+        SetColor(fill_color, alpha_flag, pIccTransform);

+        if ((fill_mode & 3) == FXFILL_WINDING) {

+            if (stroke_alpha) {

+                OUTPUT_PS("q f Q ");

+            } else {

+                OUTPUT_PS("f");

+            }

+        } else if ((fill_mode & 3) == FXFILL_ALTERNATE) {

+            if (stroke_alpha) {

+                OUTPUT_PS("q F Q ");

+            } else {

+                OUTPUT_PS("F");

+            }

+        }

+    }

+    if (stroke_alpha) {

+        SetColor(stroke_color, alpha_flag, pIccTransform);

+        if (pObject2Device) {

+            OUTPUT_PS("s sm");

+        } else {

+            OUTPUT_PS("s");

+        }

+    }

+    OUTPUT_PS("\n");

+    return TRUE;

+}

+void CFX_PSRenderer::SetGraphState(const CFX_GraphStateData* pGraphState)

+{

+    CFX_ByteTextBuf buf;

+    if (!m_bGraphStateSet || m_CurGraphState.m_LineCap != pGraphState->m_LineCap) {

+        buf << pGraphState->m_LineCap << FX_BSTRC(" J\n");

+    }

+    if (!m_bGraphStateSet || m_CurGraphState.m_DashCount != pGraphState->m_DashCount ||

+            FXSYS_memcmp32(m_CurGraphState.m_DashArray, pGraphState->m_DashArray, sizeof(FX_FLOAT)*m_CurGraphState.m_DashCount)) {

+        buf << FX_BSTRC("[");

+        for (int i = 0; i < pGraphState->m_DashCount; i ++) {

+            buf << pGraphState->m_DashArray[i] << FX_BSTRC(" ");

+        }

+        buf << FX_BSTRC("]") << pGraphState->m_DashPhase << FX_BSTRC(" d\n");

+    }

+    if (!m_bGraphStateSet || m_CurGraphState.m_LineJoin != pGraphState->m_LineJoin) {

+        buf << pGraphState->m_LineJoin << FX_BSTRC(" j\n");

+    }

+    if (!m_bGraphStateSet || m_CurGraphState.m_LineWidth != pGraphState->m_LineWidth) {

+        buf << pGraphState->m_LineWidth << FX_BSTRC(" w\n");

+    }

+    if (!m_bGraphStateSet || m_CurGraphState.m_MiterLimit != pGraphState->m_MiterLimit) {

+        buf << pGraphState->m_MiterLimit << FX_BSTRC(" M\n");

+    }

+    m_CurGraphState.Copy(*pGraphState);

+    m_bGraphStateSet = TRUE;

+    if (buf.GetSize()) {

+        m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());

+    }

+}

+static void FaxCompressData(FX_LPBYTE src_buf, int width, int height, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)

+{

+    CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();

+    if (width * height > 128 && pEncoders && pEncoders->GetFaxModule()->Encode(src_buf, width, height, (width + 7) / 8, dest_buf, dest_size)) {

+        FX_Free(src_buf);

+    } else {

+        dest_buf = src_buf;

+        dest_size = (width + 7) / 8 * height;

+    }

+}

+static void PSCompressData(int PSLevel, FX_LPBYTE src_buf, FX_DWORD src_size,

+                           FX_LPBYTE& output_buf, FX_DWORD& output_size, FX_LPCSTR& filter)

+{

+    output_buf = src_buf;

+    output_size = src_size;

+    filter = "";

+    if (src_size < 1024) {

+        return;

+    }

+    CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();

+    FX_LPBYTE dest_buf = NULL;

+    FX_DWORD dest_size = src_size;

+    if (PSLevel >= 3) {

+        if (pEncoders && pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size)) {

+            filter = "/FlateDecode filter ";

+        }

+    } else {

+        if (pEncoders && pEncoders->GetBasicModule()->RunLengthEncode(src_buf, src_size, dest_buf, dest_size)) {

+            filter = "/RunLengthDecode filter ";

+        }

+    }

+    if (dest_size < src_size) {

+        output_buf = dest_buf;

+        output_size = dest_size;

+    } else {

+        filter = NULL;

+        if (dest_buf) {

+            FX_Free(dest_buf);

+        }

+    }

+}

+FX_BOOL CFX_PSRenderer::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int left, int top,

+                                  int alpha_flag, void* pIccTransform)

+{

+    StartRendering();

+    CFX_AffineMatrix matrix((FX_FLOAT)(pSource->GetWidth()), 0.0f, 0.0f, -(FX_FLOAT)(pSource->GetHeight()),

+                            (FX_FLOAT)(left), (FX_FLOAT)(top + pSource->GetHeight()));

+    return DrawDIBits(pSource, color, &matrix, 0, alpha_flag, pIccTransform);

+}

+FX_BOOL CFX_PSRenderer::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,

+                                      int dest_width, int dest_height, FX_DWORD flags,

+                                      int alpha_flag, void* pIccTransform)

+{

+    StartRendering();

+    CFX_AffineMatrix matrix((FX_FLOAT)(dest_width), 0.0f, 0.0f, (FX_FLOAT)(-dest_height),

+                            (FX_FLOAT)(dest_left), (FX_FLOAT)(dest_top + dest_height));

+    return DrawDIBits(pSource, color, &matrix, flags, alpha_flag, pIccTransform);

+}

+FX_BOOL CFX_PSRenderer::DrawDIBits(const CFX_DIBSource* pSource, FX_DWORD color,

+                                   const CFX_AffineMatrix* pMatrix, FX_DWORD flags,

+                                   int alpha_flag, void* pIccTransform)

+{

+    StartRendering();

+    if ((pMatrix->a == 0 && pMatrix->b == 0) || (pMatrix->c == 0 && pMatrix->d == 0)) {

+        return TRUE;

+    }

+    if (pSource->HasAlpha()) {

+        return FALSE;

+    }

+    int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(color) : FXARGB_A(color);

+    if (pSource->IsAlphaMask() && (alpha < 255 || pSource->GetBPP() != 1)) {

+        return FALSE;

+    }

+    OUTPUT_PS("q\n");

+    CFX_ByteTextBuf buf;

+    buf << FX_BSTRC("[") << pMatrix->a << FX_BSTRC(" ") << pMatrix->b << FX_BSTRC(" ") <<

+        pMatrix->c << FX_BSTRC(" ") << pMatrix->d << FX_BSTRC(" ") << pMatrix->e <<

+        FX_BSTRC(" ") << pMatrix->f << FX_BSTRC("]cm ");

+    int width = pSource->GetWidth();

+    int height = pSource->GetHeight();

+    buf << width << FX_BSTRC(" ") << height;

+    if (pSource->GetBPP() == 1 && pSource->GetPalette() == NULL) {

+        int pitch = (width + 7) / 8;

+        FX_DWORD src_size = height * pitch;

+        FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size);

+        if (!src_buf) {

+            return FALSE;

+        }

+        for (int row = 0; row < height; row ++) {

+            FX_LPCBYTE src_scan = pSource->GetScanline(row);

+            FXSYS_memcpy32(src_buf + row * pitch, src_scan, pitch);

+        }

+        FX_LPBYTE output_buf;

+        FX_DWORD output_size;

+        FaxCompressData(src_buf, width, height, output_buf, output_size);

+        if (pSource->IsAlphaMask()) {

+            SetColor(color, alpha_flag, pIccTransform);

+            m_bColorSet = FALSE;

+            buf << FX_BSTRC(" true[");

+        } else {

+            buf << FX_BSTRC(" 1[");

+        }

+        buf << width << FX_BSTRC(" 0 0 -") << height << FX_BSTRC(" 0 ") << height <<

+            FX_BSTRC("]currentfile/ASCII85Decode filter ");

+        if (output_buf != src_buf)

+            buf << FX_BSTRC("<</K -1/EndOfBlock false/Columns ") << width << FX_BSTRC("/Rows ") << height <<

+                FX_BSTRC(">>/CCITTFaxDecode filter ");

+        if (pSource->IsAlphaMask()) {

+            buf << FX_BSTRC("iM\n");

+        } else {

+            buf << FX_BSTRC("false 1 colorimage\n");

+        }

+        m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());

+        WritePSBinary(output_buf, output_size);

+        FX_Free(output_buf);

+    } else {

+        CFX_DIBSource* pConverted = (CFX_DIBSource*)pSource;

+        if (pIccTransform) {

+            FXDIB_Format format = m_bCmykOutput ? FXDIB_Cmyk : FXDIB_Rgb;

+            pConverted = pSource->CloneConvert(format, NULL, pIccTransform);

+        } else {

+            switch (pSource->GetFormat()) {

+                case FXDIB_1bppRgb:

+                case FXDIB_Rgb32:

+                    pConverted = pSource->CloneConvert(FXDIB_Rgb);

+                    break;

+                case FXDIB_8bppRgb:

+                    if (pSource->GetPalette() != NULL) {

+                        pConverted = pSource->CloneConvert(FXDIB_Rgb);

+                    }

+                    break;

+                case FXDIB_1bppCmyk:

+                    pConverted = pSource->CloneConvert(FXDIB_Cmyk);

+                    break;

+                case FXDIB_8bppCmyk:

+                    if (pSource->GetPalette() != NULL) {

+                        pConverted = pSource->CloneConvert(FXDIB_Cmyk);

+                    }

+                    break;

+                default:

+                    break;

+            }

+        }

+        if (pConverted == NULL) {

+            OUTPUT_PS("\nQ\n");

+            return FALSE;

+        }

+        int Bpp = pConverted->GetBPP() / 8;

+        FX_LPBYTE output_buf = NULL;

+        FX_STRSIZE output_size = 0;

+        FX_LPCSTR filter = NULL;

+        if (flags & FXRENDER_IMAGE_LOSSY) {

+            CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();

+            if (pEncoders && pEncoders->GetJpegModule()->Encode(pConverted, output_buf, output_size)) {

+                filter = "/DCTDecode filter ";

+            }

+        }

+        if (filter == NULL) {

+            int src_pitch = width * Bpp;

+            output_size = height * src_pitch;

+            output_buf = FX_Alloc(FX_BYTE, output_size);

+            if (!output_buf) {

+                if (pConverted != pSource) {

+                    delete pConverted;

+                    pConverted = NULL;

+                }

+                return FALSE;

+            }

+            for (int row = 0; row < height; row ++) {

+                FX_LPCBYTE src_scan = pConverted->GetScanline(row);

+                FX_LPBYTE dest_scan = output_buf + row * src_pitch;

+                if (Bpp == 3) {

+                    for (int col = 0; col < width; col ++) {

+                        *dest_scan++ = src_scan[2];

+                        *dest_scan++ = src_scan[1];

+                        *dest_scan++ = *src_scan;

+                        src_scan += 3;

+                    }

+                } else {

+                    FXSYS_memcpy32(dest_scan, src_scan, src_pitch);

+                }

+            }

+            FX_LPBYTE compressed_buf;

+            FX_DWORD compressed_size;

+            PSCompressData(m_PSLevel, output_buf, output_size, compressed_buf, compressed_size, filter);

+            if (output_buf != compressed_buf) {

+                FX_Free(output_buf);

+            }

+            output_buf = compressed_buf;

+            output_size = compressed_size;

+        }

+        if (pConverted != pSource) {

+            delete pConverted;

+            pConverted = NULL;

+        }

+        buf << FX_BSTRC(" 8[");

+        buf << width << FX_BSTRC(" 0 0 -") << height << FX_BSTRC(" 0 ") << height << FX_BSTRC("]");

+        buf << FX_BSTRC("currentfile/ASCII85Decode filter ");

+        if (filter) {

+            buf << filter;

+        }

+        buf << FX_BSTRC("false ") << Bpp;

+        buf << FX_BSTRC(" colorimage\n");

+        m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());

+        WritePSBinary(output_buf, output_size);

+        FX_Free(output_buf);

+    }

+    OUTPUT_PS("\nQ\n");

+    return TRUE;

+}

+void CFX_PSRenderer::SetColor(FX_DWORD color, int alpha_flag, void* pIccTransform)

+{

+    if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {

+        pIccTransform = NULL;

+    }

+    FX_BOOL bCMYK = FALSE;

+    if (pIccTransform) {

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);

+        FX_LPBYTE pColor = (FX_LPBYTE)&color;

+        pIccModule->TranslateScanline(pIccTransform, pColor, pColor, 1);

+        color = m_bCmykOutput ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);

+        bCMYK = m_bCmykOutput;

+    } else {

+        bCMYK = FXGETFLAG_COLORTYPE(alpha_flag);

+    }

+    if (bCMYK != m_bCmykOutput || !m_bColorSet || m_LastColor != color) {

+        CFX_ByteTextBuf buf;

+        if (bCMYK) {

+            buf << FXSYS_GetCValue(color) / 255.0 << FX_BSTRC(" ") << FXSYS_GetMValue(color) / 255.0 << FX_BSTRC(" ")

+                << FXSYS_GetYValue(color) / 255.0 << FX_BSTRC(" ") << FXSYS_GetKValue(color) / 255.0 << FX_BSTRC(" k\n");

+        } else {

+            buf << FXARGB_R(color) / 255.0 << FX_BSTRC(" ") << FXARGB_G(color) / 255.0 << FX_BSTRC(" ")

+                << FXARGB_B(color) / 255.0 << FX_BSTRC(" rg\n");

+        }

+        if (bCMYK == m_bCmykOutput) {

+            m_bColorSet = TRUE;

+            m_LastColor = color;

+        }

+        m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());

+    }

+}

+void CFX_PSRenderer::FindPSFontGlyph(CFX_FaceCache* pFaceCache, CFX_Font* pFont, const FXTEXT_CHARPOS& charpos,

+                                     int& ps_fontnum, int &ps_glyphindex)

+{

+    for (int i = 0; i < (int)m_PSFontList.GetSize(); i ++) {

+        CPSFont* pPSFont = m_PSFontList[i];

+        for (int j = 0; j < pPSFont->m_nGlyphs; j ++)

+            if (pPSFont->m_Glyphs[j].m_pFont == pFont && pPSFont->m_Glyphs[j].m_GlyphIndex == charpos.m_GlyphIndex) {

+                if ((!pPSFont->m_Glyphs[j].m_bGlyphAdjust && !charpos.m_bGlyphAdjust) ||

+                        (pPSFont->m_Glyphs[j].m_bGlyphAdjust && charpos.m_bGlyphAdjust &&

+                         (FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[0] - charpos.m_AdjustMatrix[0]) < 0.01 &&

+                          FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[1] - charpos.m_AdjustMatrix[1]) < 0.01 &&

+                          FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[2] - charpos.m_AdjustMatrix[2]) < 0.01 &&

+                          FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[3] - charpos.m_AdjustMatrix[3]) < 0.01))) {

+                    ps_fontnum = i;

+                    ps_glyphindex = j;

+                    return;

+                }

+            }

+    }

+    if (m_PSFontList.GetSize() == 0 || m_PSFontList[m_PSFontList.GetSize() - 1]->m_nGlyphs == 256) {

+        CPSFont* pPSFont = FX_NEW CPSFont;

+        if (!pPSFont) {

+            return;

+        }

+        pPSFont->m_nGlyphs = 0;

+        m_PSFontList.Add(pPSFont);

+        CFX_ByteTextBuf buf;

+        buf << FX_BSTRC("8 dict begin/FontType 3 def/FontMatrix[1 0 0 1 0 0]def\n"

+                        "/FontBBox[0 0 0 0]def/Encoding 256 array def 0 1 255{Encoding exch/.notdef put}for\n"

+                        "/CharProcs 1 dict def CharProcs begin/.notdef {} def end\n"

+                        "/BuildGlyph{1 0 -10 -10 10 10 setcachedevice exch/CharProcs get exch 2 copy known not{pop/.notdef}if get exec}bind def\n"

+                        "/BuildChar{1 index/Encoding get exch get 1 index/BuildGlyph get exec}bind def\n"

+                        "currentdict end\n");

+        buf << FX_BSTRC("/X") << m_PSFontList.GetSize() - 1 << FX_BSTRC(" exch definefont pop\n");

+        m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());

+        buf.Clear();

+    }

+    ps_fontnum = m_PSFontList.GetSize() - 1;

+    CPSFont* pPSFont = m_PSFontList[ps_fontnum];

+    ps_glyphindex = pPSFont->m_nGlyphs;

+    pPSFont->m_Glyphs[ps_glyphindex].m_GlyphIndex = charpos.m_GlyphIndex;

+    pPSFont->m_Glyphs[ps_glyphindex].m_pFont = pFont;

+    pPSFont->m_Glyphs[ps_glyphindex].m_bGlyphAdjust = charpos.m_bGlyphAdjust;

+    if (charpos.m_bGlyphAdjust) {

+        pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[0] = charpos.m_AdjustMatrix[0];

+        pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[1] = charpos.m_AdjustMatrix[1];

+        pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[2] = charpos.m_AdjustMatrix[2];

+        pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[3] = charpos.m_AdjustMatrix[3];

+    }

+    pPSFont->m_nGlyphs ++;

+    CFX_AffineMatrix matrix;

+    if (charpos.m_bGlyphAdjust)

+        matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],

+                   charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);

+    matrix.Concat(1.0f, 0, 0, 1.0f, 0, 0);

+    const CFX_PathData* pPathData = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);

+    if (pPathData == NULL) {

+        return;

+    }

+    CFX_PathData TransformedPath(*pPathData);

+    if (charpos.m_bGlyphAdjust) {

+        TransformedPath.Transform(&matrix);

+    }

+    CFX_ByteTextBuf buf;

+    buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff/CharProcs get begin/")

+        << ps_glyphindex << FX_BSTRC("{");

+    buf << FX_BSTRC("n ");

+    for (int p = 0; p < TransformedPath.GetPointCount(); p ++) {

+        FX_FLOAT x = TransformedPath.GetPointX(p), y = TransformedPath.GetPointY(p);

+        switch (TransformedPath.GetFlag(p) & FXPT_TYPE) {

+            case FXPT_MOVETO: {

+                    buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" m\n");

+                    break;

+                }

+            case FXPT_LINETO: {

+                    buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" l\n");

+                    break;

+                }

+            case FXPT_BEZIERTO: {

+                    buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" ")

+                        << TransformedPath.GetPointX(p + 1) << FX_BSTRC(" ")

+                        << TransformedPath.GetPointY(p + 1) << FX_BSTRC(" ")

+                        << TransformedPath.GetPointX(p + 2) << FX_BSTRC(" ")

+                        << TransformedPath.GetPointY(p + 2) << FX_BSTRC(" c\n");

+                    p += 2;

+                    break;

+                }

+        }

+    }

+    buf << FX_BSTRC("f");

+    buf << FX_BSTRC("}bind def end\n");

+    buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff/Encoding get ") << ps_glyphindex

+        << FX_BSTRC("/") << ps_glyphindex << FX_BSTRC(" put\n");

+    m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());

+}

+FX_BOOL CFX_PSRenderer::DrawText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,

+                                 CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,

+                                 FX_FLOAT font_size, FX_DWORD color,

+                                 int alpha_flag, void* pIccTransform)

+{

+    StartRendering();

+    int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);

+    if (alpha < 255) {

+        return FALSE;

+    }

+    if ((pObject2Device->a == 0 && pObject2Device->b == 0) || (pObject2Device->c == 0 && pObject2Device->d == 0)) {

+        return TRUE;

+    }

+    SetColor(color, alpha_flag, pIccTransform);

+    CFX_ByteTextBuf buf;

+    buf << FX_BSTRC("q[") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ")

+        << pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d;

+    buf << FX_BSTRC(" ") << pObject2Device->e << FX_BSTRC(" ") << pObject2Device->f << "]cm\n";

+    if (pCache == NULL) {

+        pCache = CFX_GEModule::Get()->GetFontCache();

+    }

+    CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);

+    FX_FONTCACHE_DEFINE(pCache, pFont);

+    int last_fontnum = -1;

+    for (int i = 0; i < nChars; i ++) {

+        int ps_fontnum, ps_glyphindex;

+        FindPSFontGlyph(pFaceCache, pFont, pCharPos[i], ps_fontnum, ps_glyphindex);

+        if (last_fontnum != ps_fontnum) {

+            buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff ") << font_size

+                << FX_BSTRC(" Fs Sf ");

+            last_fontnum = ps_fontnum;

+        }

+        buf << pCharPos[i].m_OriginX << FX_BSTRC(" ")

+            << pCharPos[i].m_OriginY << FX_BSTRC(" m");

+        CFX_ByteString hex;

+        hex.Format("<%02X>", ps_glyphindex);

+        buf << hex << FX_BSTRC("Tj\n");

+    }

+    buf << FX_BSTRC("Q\n");

+    m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());

+    return TRUE;

+}

+void CFX_PSRenderer::WritePSBinary(FX_LPCBYTE data, int len)

+{

+    FX_LPBYTE dest_buf;

+    FX_DWORD dest_size;

+    CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();

+    if (pEncoders && pEncoders->GetBasicModule()->A85Encode(data, len, dest_buf, dest_size)) {

+        m_pOutput->OutputPS((FX_LPCSTR)dest_buf, dest_size);

+        FX_Free(dest_buf);

+    } else {

+        m_pOutput->OutputPS((FX_LPCSTR)data, len);

+    }

+}

diff --git a/core/src/fxge/ge/fx_ge_text.cpp b/core/src/fxge/ge/fx_ge_text.cpp
new file mode 100644
index 0000000..3c08cd6
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_text.cpp
@@ -0,0 +1,1774 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#include "../../../include/fxge/fx_freetype.h"

+#include "../../../include/fxcodec/fx_codec.h"

+#include "text_int.h"

+#undef FX_GAMMA

+#undef FX_GAMMA_INVERSE

+#define FX_GAMMA(value)			(value)

+#define FX_GAMMA_INVERSE(value)	(value)

+FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)

+{

+    FX_RECT rect(0, 0, 0, 0);

+    FX_BOOL bStarted = FALSE;

+    for (int iChar = 0; iChar < nChars; iChar ++) {

+        FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];

+        const CFX_GlyphBitmap* pGlyph = glyph.m_pGlyph;

+        if (pGlyph == NULL) {

+            continue;

+        }

+        int char_left = glyph.m_OriginX + pGlyph->m_Left;

+        int char_width = (int)(pGlyph->m_Bitmap.GetWidth() / retinaScaleX);

+        if (anti_alias == FXFT_RENDER_MODE_LCD) {

+            char_width /= 3;

+        }

+        int char_right = char_left + char_width;

+        int char_top = glyph.m_OriginY - pGlyph->m_Top;

+        int char_bottom = char_top + (int)(pGlyph->m_Bitmap.GetHeight() / retinaScaleY);

+        if (!bStarted) {

+            rect.left = char_left;

+            rect.right = char_right;

+            rect.top = char_top;

+            rect.bottom = char_bottom;

+            bStarted = TRUE;

+        } else {

+            if (rect.left > char_left) {

+                rect.left = char_left;

+            }

+            if (rect.right < char_right) {

+                rect.right = char_right;

+            }

+            if (rect.top > char_top) {

+                rect.top = char_top;

+            }

+            if (rect.bottom < char_bottom) {

+                rect.bottom = char_bottom;

+            }

+        }

+    }

+    return rect;

+}

+static void _AdjustGlyphSpace(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars)

+{

+    ASSERT(nChars > 1);

+    FX_BOOL bVertical = FALSE;

+    if (pGlyphAndPos[nChars - 1].m_OriginX == pGlyphAndPos[0].m_OriginX) {

+        bVertical = TRUE;

+    } else if (pGlyphAndPos[nChars - 1].m_OriginY != pGlyphAndPos[0].m_OriginY) {

+        return;

+    }

+    int i = nChars - 1;

+    int* next_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;

+    FX_FLOAT next_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;

+    for (i --; i > 0; i --) {

+        int* this_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;

+        FX_FLOAT this_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;

+        int space = (*next_origin) - (*this_origin);

+        FX_FLOAT space_f = next_origin_f - this_origin_f;

+        FX_FLOAT error = (FX_FLOAT)(FXSYS_fabs(space_f) - FXSYS_fabs((FX_FLOAT)(space)));

+        if (error > 0.5f) {

+            *this_origin += space > 0 ? -1 : 1;

+        }

+        next_origin = this_origin;

+        next_origin_f = this_origin_f;

+    }

+}

+static const FX_BYTE g_GdipGamma_bgw[9] = {0, 0, 63, 120, 0, 168, 210, 239, 255};

+static const FX_BYTE g_GdipGamma_fgw[9] = {0, 0, 16, 45, 0, 87, 135, 192, 255};

+static const FX_BYTE g_GdipGammaAdjust_47[48] = {

+    0, 30, 33, 34, 35, 36, 37, 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43,

+    43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 46,

+    46, 46, 46, 46, 46, 46, 46, 47

+};

+static const FX_BYTE g_GdipGammaAdjust_75[76] = {

+    0, 46, 50, 52, 54, 55, 56, 57, 58, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65,

+    65, 65, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 70, 70, 70,

+    70, 70, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73,

+    73, 74, 74, 74, 74, 74, 74, 74, 74, 75

+};

+static const FX_BYTE g_GdipGammaAdjust_81[82] = {

+    0, 49, 53, 56, 58, 59, 60, 61, 62, 63, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 69, 70, 70, 70,

+    71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 76,

+    76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 80,

+    80, 80, 80, 80, 80, 80, 80, 81

+};

+static void _Adjust_alpha(int background, int foreground, int& src_alpha, int text_flags, int a)

+{

+}

+static const FX_BYTE g_TextGammaAdjust[256] = {

+    0, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 18, 19,

+    21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38,

+    39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55,

+    56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72,

+    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,

+    89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,

+    105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,

+    121, 122, 123, 124, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134, 135,

+    136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,

+    152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,

+    167, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181,

+    182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196,

+    197, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 210, 211,

+    212, 213, 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,

+    227, 228, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 239, 240,

+    241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 250, 251, 252, 253, 254, 255,

+};

+#define ADJUST_ALPHA(background, foreground, src_alpha, text_flags, a) \

+    src_alpha = g_TextGammaAdjust[(FX_BYTE)src_alpha];

+void _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform)

+{

+    if (pIccTransform == NULL && !FXGETFLAG_COLORTYPE(alpha_flag)) {

+        argb = color;

+        return;

+    }

+    if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {

+        pIccTransform = NULL;

+    }

+    FX_BYTE bgra[4];

+    if (pIccTransform) {

+        ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();

+        color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);

+        pIccModule->TranslateScanline(pIccTransform, bgra, (FX_LPCBYTE)&color, 1);

+        bgra[3] = FXGETFLAG_COLORTYPE(alpha_flag) ?

+                  (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag) :

+                  FXARGB_A(color);

+        argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);

+        return;

+    }

+    AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color),

+                       FXSYS_GetYValue(color), FXSYS_GetKValue(color),

+                       bgra[2], bgra[1], bgra[0]);

+    bgra[3] = (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag);

+    argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);

+}

+FX_BOOL CFX_RenderDevice::DrawNormalText(int nChars, const FXTEXT_CHARPOS* pCharPos,

+        CFX_Font* pFont, CFX_FontCache* pCache,

+        FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,

+        FX_DWORD fill_color, FX_DWORD text_flags,

+        int alpha_flag, void* pIccTransform)

+{

+    int nativetext_flags = text_flags;

+    if (m_DeviceClass != FXDC_DISPLAY) {

+        if (!(text_flags & FXTEXT_PRINTGRAPHICTEXT)) {

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+            if (!(text_flags & FXFONT_CIDFONT) && pFont->GetPsName().Find(CFX_WideString::FromLocal("+ZJHL")) == -1)

+#ifdef FOXIT_CHROME_BUILD

+                if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10"))

+#endif

+#endif

+                    if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {

+                        return TRUE;

+                    }

+        }

+        int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);

+        if (alpha < 255) {

+            return FALSE;

+        }

+    } else if (!(text_flags & FXTEXT_NO_NATIVETEXT)) {

+#if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_

+        if (!(text_flags & FXFONT_CIDFONT))

+#ifdef FOXIT_CHROME_BUILD

+            if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10"))

+#endif

+#endif

+                if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {

+                    return TRUE;

+                }

+    }

+    CFX_AffineMatrix char2device, deviceCtm, text2Device;

+    if (pText2Device) {

+        char2device = *pText2Device;

+        text2Device = *pText2Device;

+    }

+    char2device.Scale(font_size, -font_size);

+    if (FXSYS_fabs(char2device.a) + FXSYS_fabs(char2device.b) > 50 * 1.0f ||

+            ((m_DeviceClass == FXDC_PRINTER && !m_pDeviceDriver->IsPSPrintDriver())

+             && !(text_flags & FXTEXT_PRINTIMAGETEXT))) {

+        if (pFont->GetFace() != NULL || (pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {

+            int nPathFlags = (text_flags & FXTEXT_NOSMOOTH) == 0 ? 0 : FXFILL_NOPATHSMOOTH;

+            return DrawTextPath(nChars, pCharPos, pFont, pCache, font_size, pText2Device, NULL, NULL, fill_color, 0, NULL, nPathFlags, alpha_flag, pIccTransform);

+        }

+    }

+    int anti_alias = FXFT_RENDER_MODE_MONO;

+    FX_BOOL bNormal = FALSE;

+    if ((text_flags & FXTEXT_NOSMOOTH) == 0) {

+        if (m_DeviceClass == FXDC_DISPLAY && m_bpp > 1) {

+            FX_BOOL bClearType;

+            if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_CLEARTYPE)) {

+                bClearType = FALSE;

+            } else {

+                bClearType = text_flags & FXTEXT_CLEARTYPE;

+            }

+            if ((m_RenderCaps & (FXRC_ALPHA_OUTPUT | FXRC_CMYK_OUTPUT))) {

+                anti_alias = FXFT_RENDER_MODE_LCD;

+                bNormal = TRUE;

+            } else if (m_bpp < 16) {

+                anti_alias = FXFT_RENDER_MODE_NORMAL;

+            } else {

+                if (bClearType == FALSE) {

+                    anti_alias = FXFT_RENDER_MODE_LCD;

+                    bNormal = TRUE;

+                } else {

+                    anti_alias = FXFT_RENDER_MODE_LCD;

+                }

+            }

+        }

+    }

+    if (pCache == NULL) {

+        pCache = CFX_GEModule::Get()->GetFontCache();

+    }

+    CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);

+    FX_FONTCACHE_DEFINE(pCache, pFont);

+    FXTEXT_GLYPHPOS* pGlyphAndPos = FX_Alloc(FXTEXT_GLYPHPOS, nChars);

+    if (!pGlyphAndPos) {

+        return FALSE;

+    }

+    int iChar;

+    deviceCtm = char2device;

+    CFX_AffineMatrix matrixCTM = GetCTM();

+    FX_FLOAT scale_x = FXSYS_fabs(matrixCTM.a);

+    FX_FLOAT scale_y = FXSYS_fabs(matrixCTM.d);

+    deviceCtm.Concat(scale_x, 0, 0, scale_y, 0, 0);

+    text2Device.Concat(scale_x, 0, 0, scale_y, 0, 0);

+    for (iChar = 0; iChar < nChars; iChar ++) {

+        FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];

+        const FXTEXT_CHARPOS& charpos = pCharPos[iChar];

+        glyph.m_fOriginX = charpos.m_OriginX;

+        glyph.m_fOriginY = charpos.m_OriginY;

+        text2Device.Transform(glyph.m_fOriginX, glyph.m_fOriginY);

+        if (anti_alias < FXFT_RENDER_MODE_LCD) {

+            glyph.m_OriginX = FXSYS_round(glyph.m_fOriginX);

+        } else {

+            glyph.m_OriginX = (int)FXSYS_floor(glyph.m_fOriginX);

+        }

+        glyph.m_OriginY = FXSYS_round(glyph.m_fOriginY);

+        if (charpos.m_bGlyphAdjust) {

+            CFX_AffineMatrix new_matrix(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],

+                                        charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);

+            new_matrix.Concat(deviceCtm);

+            glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &new_matrix,

+                             charpos.m_FontCharWidth, anti_alias, nativetext_flags);

+        } else

+            glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &deviceCtm,

+                             charpos.m_FontCharWidth, anti_alias, nativetext_flags);

+    }

+    if (anti_alias < FXFT_RENDER_MODE_LCD && nChars > 1) {

+        _AdjustGlyphSpace(pGlyphAndPos, nChars);

+    }

+    FX_RECT bmp_rect1 = FXGE_GetGlyphsBBox(pGlyphAndPos, nChars, anti_alias);

+    if (scale_x > 1 && scale_y > 1) {

+        bmp_rect1.left--;

+        bmp_rect1.top --;

+        bmp_rect1.right ++;

+        bmp_rect1.bottom ++;

+    }

+    FX_RECT bmp_rect(FXSYS_round((FX_FLOAT)(bmp_rect1.left) / scale_x), FXSYS_round((FX_FLOAT)(bmp_rect1.top) / scale_y),

+                     FXSYS_round((FX_FLOAT)bmp_rect1.right / scale_x), FXSYS_round((FX_FLOAT)bmp_rect1.bottom / scale_y));

+    bmp_rect.Intersect(m_ClipBox);

+    if (bmp_rect.IsEmpty()) {

+        FX_Free(pGlyphAndPos);

+        return TRUE;

+    }

+    int pixel_width = FXSYS_round(bmp_rect.Width() * scale_x);

+    int pixel_height = FXSYS_round(bmp_rect.Height() * scale_y);

+    int pixel_left = FXSYS_round(bmp_rect.left * scale_x);

+    int pixel_top = FXSYS_round(bmp_rect.top * scale_y);

+    if (anti_alias == FXFT_RENDER_MODE_MONO) {

+        CFX_DIBitmap bitmap;

+        if (!bitmap.Create(pixel_width, pixel_height, FXDIB_1bppMask)) {

+            FX_Free(pGlyphAndPos);

+            return FALSE;

+        }

+        bitmap.Clear(0);

+        for (iChar = 0; iChar < nChars; iChar ++) {

+            FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];

+            if (glyph.m_pGlyph == NULL) {

+                continue;

+            }

+            const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;

+            bitmap.TransferBitmap(glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left,

+                                  glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top,

+                                  pGlyph->GetWidth(), pGlyph->GetHeight(), pGlyph, 0, 0);

+        }

+        FX_Free(pGlyphAndPos);

+        return SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color);

+    }

+    CFX_DIBitmap bitmap;

+    if (m_bpp == 8) {

+        if (!bitmap.Create(pixel_width, pixel_height, FXDIB_8bppMask)) {

+            FX_Free(pGlyphAndPos);

+            return FALSE;

+        }

+    } else {

+        if (!CreateCompatibleBitmap(&bitmap, pixel_width, pixel_height)) {

+            FX_Free(pGlyphAndPos);

+            return FALSE;

+        }

+    }

+    if (!bitmap.HasAlpha() && !bitmap.IsAlphaMask()) {

+        bitmap.Clear(0xFFFFFFFF);

+        if (!GetDIBits(&bitmap, bmp_rect.left, bmp_rect.top)) {

+            FX_Free(pGlyphAndPos);

+            return FALSE;

+        }

+    } else {

+        bitmap.Clear(0);

+        if (bitmap.m_pAlphaMask) {

+            bitmap.m_pAlphaMask->Clear(0);

+        }

+    }

+    int dest_width = pixel_width;

+    FX_LPBYTE dest_buf = bitmap.GetBuffer();

+    int dest_pitch = bitmap.GetPitch();

+    int Bpp = bitmap.GetBPP() / 8;

+    int a, r, g, b;

+    if (anti_alias == FXFT_RENDER_MODE_LCD) {

+        _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);

+        ArgbDecode(fill_color, a, r, g, b);

+        r = FX_GAMMA(r);

+        g = FX_GAMMA(g);

+        b = FX_GAMMA(b);

+    }

+    for (iChar = 0; iChar < nChars; iChar ++) {

+        FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];

+        if (glyph.m_pGlyph == NULL) {

+            continue;

+        }

+        const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;

+        int left = glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left;

+        int top = glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top;

+        int ncols = pGlyph->GetWidth();

+        int nrows = pGlyph->GetHeight();

+        if (anti_alias == FXFT_RENDER_MODE_NORMAL) {

+            if (!bitmap.CompositeMask(left, top, ncols, nrows, pGlyph, fill_color,

+                                      0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {

+                FX_Free(pGlyphAndPos);

+                return FALSE;

+            }

+            continue;

+        }

+        FX_BOOL bBGRStripe = text_flags & FXTEXT_BGR_STRIPE;

+        ncols /= 3;

+        int x_subpixel = (int)(glyph.m_fOriginX * 3) % 3;

+        FX_LPBYTE src_buf = pGlyph->GetBuffer();

+        int src_pitch = pGlyph->GetPitch();

+        int start_col = left;

+        if (start_col < 0) {

+            start_col = 0;

+        }

+        int end_col = left + ncols;

+        if (end_col > dest_width) {

+            end_col = dest_width;

+        }

+        if (start_col >= end_col) {

+            continue;

+        }

+        if (bitmap.GetFormat() == FXDIB_Argb) {

+            for (int row = 0; row < nrows; row ++) {

+                int dest_row = row + top;

+                if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {

+                    continue;

+                }

+                FX_LPBYTE src_scan = src_buf + row * src_pitch + (start_col - left) * 3;

+                FX_LPBYTE dest_scan = dest_buf + dest_row * dest_pitch + (start_col << 2);

+                if (bBGRStripe) {

+                    if (x_subpixel == 0) {

+                        for (int col = start_col; col < end_col; col ++) {

+                            int src_alpha = src_scan[2];

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            src_alpha = src_scan[1];

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[0];

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan[3] = 255;

+                            dest_scan += 4;

+                            src_scan += 3;

+                        }

+                    } else if (x_subpixel == 1) {

+                        int src_alpha = src_scan[1];

+                        ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                        src_alpha = src_alpha * a / 255;

+                        dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                        src_alpha = src_scan[0];

+                        ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                        src_alpha = src_alpha * a / 255;

+                        dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                        if (start_col > left) {

+                            src_alpha = src_scan[-1];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                        }

+                        dest_scan[3] = 255;

+                        dest_scan += 4;

+                        src_scan += 3;

+                        for (int col = start_col + 1; col < end_col - 1; col ++) {

+                            int src_alpha = src_scan[1];

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[-1];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan[3] = 255;

+                            dest_scan += 4;

+                            src_scan += 3;

+                        }

+                    } else {

+                        int src_alpha = src_scan[0];

+                        ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                        src_alpha = src_alpha * a / 255;

+                        dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                        if (start_col > left) {

+                            src_alpha = src_scan[-1];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[-2];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                        }

+                        dest_scan[3] = 255;

+                        dest_scan += 4;

+                        src_scan += 3;

+                        for (int col = start_col + 1; col < end_col - 1; col ++) {

+                            int src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            src_alpha = src_scan[-1];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[-2];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan[3] = 255;

+                            dest_scan += 4;

+                            src_scan += 3;

+                        }

+                    }

+                } else {

+                    if (x_subpixel == 0) {

+                        for (int col = start_col; col < end_col; col ++) {

+                            if (bNormal) {

+                                int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;

+                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);

+                                src_alpha1 = src_alpha1 * a / 255;

+                                FX_BYTE back_alpha = dest_scan[3];

+                                if (back_alpha == 0) {

+                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));

+                                    dest_scan += 4;

+                                    src_scan += 3;

+                                    continue;

+                                }

+                                if (src_alpha1 == 0) {

+                                    dest_scan += 4;

+                                    src_scan += 3;

+                                    continue;

+                                }

+                                FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;

+                                dest_scan[3] = dest_alpha;

+                                int alpha_ratio = src_alpha1 * 255 / dest_alpha;

+                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));

+                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));

+                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));

+                                dest_scan += 4;

+                                src_scan += 3;

+                                continue;

+                            }

+                            int src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            src_alpha = src_scan[1];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[2];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan[3] = 255;

+                            dest_scan += 4;

+                            src_scan += 3;

+                        }

+                    } else if (x_subpixel == 1) {

+                        if (bNormal) {

+                            int src_alpha1 = start_col > left ? ((src_scan[-1] + src_scan[0] + src_scan[1]) / 3) : ((src_scan[0] + src_scan[1]) / 3);

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);

+                            src_alpha1 = src_alpha1 * a / 255;

+                            if (src_alpha1 == 0) {

+                                dest_scan += 4;

+                                src_scan += 3;

+                            } else {

+                                FX_BYTE back_alpha = dest_scan[3];

+                                if (back_alpha == 0) {

+                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));

+                                } else {

+                                    FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;

+                                    dest_scan[3] = dest_alpha;

+                                    int alpha_ratio = src_alpha1 * 255 / dest_alpha;

+                                    dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));

+                                    dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));

+                                    dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));

+                                }

+                                dest_scan += 4;

+                                src_scan += 3;

+                            }

+                        } else {

+                            if (start_col > left) {

+                                int src_alpha = src_scan[-1];

+                                ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                                src_alpha = src_alpha * a / 255;

+                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            }

+                            int src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[1];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan[3] = 255;

+                            dest_scan += 4;

+                            src_scan += 3;

+                        }

+                        for (int col = start_col + 1; col < end_col; col ++) {

+                            if (bNormal) {

+                                int src_alpha1 = (src_scan[-1] + src_scan[0] + src_scan[1]) / 3;

+                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);

+                                src_alpha1 = src_alpha1 * a / 255;

+                                FX_BYTE back_alpha = dest_scan[3];

+                                if (back_alpha == 0) {

+                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));

+                                    dest_scan += 4;

+                                    src_scan += 3;

+                                    continue;

+                                }

+                                if (src_alpha1 == 0) {

+                                    dest_scan += 4;

+                                    src_scan += 3;

+                                    continue;

+                                }

+                                FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;

+                                dest_scan[3] = dest_alpha;

+                                int alpha_ratio = src_alpha1 * 255 / dest_alpha;

+                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));

+                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));

+                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));

+                                dest_scan += 4;

+                                src_scan += 3;

+                                continue;

+                            }

+                            int src_alpha = src_scan[-1];

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[1];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan[3] = 255;

+                            dest_scan += 4;

+                            src_scan += 3;

+                        }

+                    } else {

+                        if (bNormal) {

+                            int src_alpha1 = start_col > left ? ((src_scan[-2] + src_scan[-1] + src_scan[0]) / 3) : ((src_scan[0]) / 3);

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);

+                            src_alpha1 = src_alpha1 * a / 255;

+                            if (src_alpha1 == 0) {

+                                dest_scan += 4;

+                                src_scan += 3;

+                            } else {

+                                FX_BYTE back_alpha = dest_scan[3];

+                                if (back_alpha == 0) {

+                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));

+                                } else {

+                                    FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;

+                                    dest_scan[3] = dest_alpha;

+                                    int alpha_ratio = src_alpha1 * 255 / dest_alpha;

+                                    dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));

+                                    dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));

+                                    dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));

+                                }

+                                dest_scan += 4;

+                                src_scan += 3;

+                            }

+                        } else {

+                            if (start_col > left) {

+                                int src_alpha = src_scan[-2];

+                                ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                                src_alpha = src_alpha * a / 255;

+                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                                src_alpha = src_scan[-1];

+                                ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                                src_alpha = src_alpha * a / 255;

+                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            }

+                            int src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan[3] = 255;

+                            dest_scan += 4;

+                            src_scan += 3;

+                        }

+                        for (int col = start_col + 1; col < end_col; col ++) {

+                            if (bNormal) {

+                                int src_alpha1 = (src_scan[-2] + src_scan[-1] + src_scan[0]) / 3;

+                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);

+                                src_alpha1 = src_alpha1 * a / 255;

+                                FX_BYTE back_alpha = dest_scan[3];

+                                if (back_alpha == 0) {

+                                    FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));

+                                    dest_scan += 4;

+                                    src_scan += 3;

+                                    continue;

+                                }

+                                if (src_alpha1 == 0) {

+                                    dest_scan += 4;

+                                    src_scan += 3;

+                                    continue;

+                                }

+                                FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;

+                                dest_scan[3] = dest_alpha;

+                                int alpha_ratio = src_alpha1 * 255 / dest_alpha;

+                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));

+                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));

+                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));

+                                dest_scan += 4;

+                                src_scan += 3;

+                                continue;

+                            }

+                            int src_alpha = src_scan[-2];

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            src_alpha = src_scan[-1];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan[3] = 255;

+                            dest_scan += 4;

+                            src_scan += 3;

+                        }

+                    }

+                }

+            }

+        } else {

+            for (int row = 0; row < nrows; row ++) {

+                int dest_row = row + top;

+                if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {

+                    continue;

+                }

+                FX_LPBYTE src_scan = src_buf + row * src_pitch + (start_col - left) * 3;

+                FX_LPBYTE dest_scan = dest_buf + dest_row * dest_pitch + start_col * Bpp;

+                if (bBGRStripe) {

+                    if (x_subpixel == 0) {

+                        for (int col = start_col; col < end_col; col ++) {

+                            int src_alpha = src_scan[2];

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            src_alpha = src_scan[1];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan += Bpp;

+                            src_scan += 3;

+                        }

+                    } else if (x_subpixel == 1) {

+                        int src_alpha = src_scan[1];

+                        ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                        src_alpha = src_alpha * a / 255;

+                        dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                        src_alpha = src_scan[0];

+                        ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                        src_alpha = src_alpha * a / 255;

+                        dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                        if (start_col > left) {

+                            src_alpha = src_scan[-1];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                        }

+                        dest_scan += Bpp;

+                        src_scan += 3;

+                        for (int col = start_col + 1; col < end_col - 1; col ++) {

+                            int src_alpha = src_scan[1];

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[-1];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan += Bpp;

+                            src_scan += 3;

+                        }

+                    } else {

+                        int src_alpha = src_scan[0];

+                        ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                        src_alpha = src_alpha * a / 255;

+                        dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                        if (start_col > left) {

+                            src_alpha = src_scan[-1];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[-2];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                        }

+                        dest_scan += Bpp;

+                        src_scan += 3;

+                        for (int col = start_col + 1; col < end_col - 1; col ++) {

+                            int src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            src_alpha = src_scan[-1];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[-2];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan += Bpp;

+                            src_scan += 3;

+                        }

+                    }

+                } else {

+                    if (x_subpixel == 0) {

+                        for (int col = start_col; col < end_col; col ++) {

+                            if (bNormal) {

+                                int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;

+                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);

+                                src_alpha1 = src_alpha1 * a / 255;

+                                if (src_alpha1 == 0) {

+                                    dest_scan += Bpp;

+                                    src_scan += 3;

+                                    continue;

+                                }

+                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));

+                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));

+                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));

+                                dest_scan += Bpp;

+                                src_scan += 3;

+                                continue;

+                            }

+                            int src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            src_alpha = src_scan[1];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[2];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan += Bpp;

+                            src_scan += 3;

+                        }

+                    } else if (x_subpixel == 1) {

+                        if (bNormal) {

+                            int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[1] + src_scan[-1]) / 3 : (src_scan[0] + src_scan[1]) / 3;

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);

+                            src_alpha1 = src_alpha1 * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));

+                            dest_scan += Bpp;

+                            src_scan += 3;

+                        } else {

+                            if (start_col > left) {

+                                int src_alpha = src_scan[-1];

+                                ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                                src_alpha = src_alpha * a / 255;

+                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            }

+                            int src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[1];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan += Bpp;

+                            src_scan += 3;

+                        }

+                        for (int col = start_col + 1; col < end_col; col ++) {

+                            if (bNormal) {

+                                int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[-1]) / 3;

+                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);

+                                src_alpha1 = src_alpha1 * a / 255;

+                                if (src_alpha1 == 0) {

+                                    dest_scan += Bpp;

+                                    src_scan += 3;

+                                    continue;

+                                }

+                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));

+                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));

+                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));

+                                dest_scan += Bpp;

+                                src_scan += 3;

+                                continue;

+                            }

+                            int src_alpha = src_scan[-1];

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[1];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan += Bpp;

+                            src_scan += 3;

+                        }

+                    } else {

+                        if (bNormal) {

+                            int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[-2] + src_scan[-1]) / 3 : src_scan[0] / 3;

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);

+                            src_alpha1 = src_alpha1 * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));

+                            dest_scan += Bpp;

+                            src_scan += 3;

+                        } else {

+                            if (start_col > left) {

+                                int src_alpha = src_scan[-2];

+                                ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                                src_alpha = src_alpha * a / 255;

+                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                                src_alpha = src_scan[-1];

+                                ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                                src_alpha = src_alpha * a / 255;

+                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            }

+                            int src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan += Bpp;

+                            src_scan += 3;

+                        }

+                        for (int col = start_col + 1; col < end_col; col ++) {

+                            if (bNormal) {

+                                int src_alpha1 = ((int)(src_scan[0]) + (int)(src_scan[-2]) + (int)(src_scan[-1])) / 3;

+                                ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);

+                                src_alpha1 = src_alpha1 * a / 255;

+                                if (src_alpha1 == 0) {

+                                    dest_scan += Bpp;

+                                    src_scan += 3;

+                                    continue;

+                                }

+                                dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));

+                                dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));

+                                dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));

+                                dest_scan += Bpp;

+                                src_scan += 3;

+                                continue;

+                            }

+                            int src_alpha = src_scan[-2];

+                            ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));

+                            src_alpha = src_scan[-1];

+                            ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));

+                            src_alpha = src_scan[0];

+                            ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);

+                            src_alpha = src_alpha * a / 255;

+                            dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));

+                            dest_scan += Bpp;

+                            src_scan += 3;

+                        }

+                    }

+                }

+            }

+        }

+    }

+    if (bitmap.IsAlphaMask()) {

+        SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color, alpha_flag, pIccTransform);

+    } else {

+        SetDIBits(&bitmap, bmp_rect.left, bmp_rect.top);

+    }

+    FX_Free(pGlyphAndPos);

+    return TRUE;

+}

+FX_BOOL CFX_RenderDevice::DrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPos,

+                                       CFX_Font* pFont, CFX_FontCache* pCache,

+                                       FX_FLOAT font_size, const CFX_AffineMatrix* pText2User,

+                                       const CFX_AffineMatrix* pUser2Device, const CFX_GraphStateData* pGraphState,

+                                       FX_DWORD fill_color, FX_ARGB stroke_color, CFX_PathData* pClippingPath, int nFlag,

+                                       int alpha_flag, void* pIccTransform, int blend_type)

+{

+    if (pCache == NULL) {

+        pCache = CFX_GEModule::Get()->GetFontCache();

+    }

+    CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);

+    FX_FONTCACHE_DEFINE(pCache, pFont);

+    for (int iChar = 0; iChar < nChars; iChar ++) {

+        const FXTEXT_CHARPOS& charpos = pCharPos[iChar];

+        CFX_AffineMatrix matrix;

+        if (charpos.m_bGlyphAdjust)

+            matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],

+                       charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);

+        matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_OriginY);

+        const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);

+        if (pPath == NULL) {

+            continue;

+        }

+        matrix.Concat(*pText2User);

+        CFX_PathData TransformedPath(*pPath);

+        TransformedPath.Transform(&matrix);

+        FX_BOOL bHasAlpha = FXGETFLAG_COLORTYPE(alpha_flag) ?

+                            (FXGETFLAG_ALPHA_FILL(alpha_flag) || FXGETFLAG_ALPHA_STROKE(alpha_flag)) :

+                            (fill_color || stroke_color);

+        if (bHasAlpha) {

+            int fill_mode = nFlag;

+            if (FXGETFLAG_COLORTYPE(alpha_flag)) {

+                if (FXGETFLAG_ALPHA_FILL(alpha_flag)) {

+                    fill_mode |= FXFILL_WINDING;

+                }

+            } else {

+                if (fill_color) {

+                    fill_mode |= FXFILL_WINDING;

+                }

+            }

+            fill_mode |= FX_FILL_TEXT_MODE;

+            if (!DrawPath(&TransformedPath, pUser2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {

+                return FALSE;

+            }

+        }

+        if (pClippingPath) {

+            pClippingPath->Append(&TransformedPath, pUser2Device);

+        }

+    }

+    return TRUE;

+}

+CFX_FontCache::~CFX_FontCache()

+{

+    FreeCache(TRUE);

+}

+CFX_FaceCache* CFX_FontCache::GetCachedFace(CFX_Font* pFont)

+{

+    FX_BOOL bExternal = pFont->GetFace() == NULL;

+    void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();

+    CFX_FTCacheMap& map =  bExternal ? m_ExtFaceMap : m_FTFaceMap;

+    CFX_CountedFaceCache* counted_face_cache = NULL;

+    if (map.Lookup((FXFT_Face)face, counted_face_cache)) {

+        counted_face_cache->m_nCount++;

+        return counted_face_cache->m_Obj;

+    }

+    CFX_FaceCache* face_cache = NULL;

+    face_cache = FX_NEW CFX_FaceCache(bExternal ? NULL : (FXFT_Face)face);

+    if (face_cache == NULL)	{

+        return NULL;

+    }

+    counted_face_cache = FX_NEW CFX_CountedFaceCache;

+    if (!counted_face_cache) {

+        if (face_cache) {

+            delete face_cache;

+            face_cache = NULL;

+        }

+        return NULL;

+    }

+    counted_face_cache->m_nCount = 2;

+    counted_face_cache->m_Obj = face_cache;

+    map.SetAt((FXFT_Face)face, counted_face_cache);

+    return face_cache;

+}

+void CFX_FontCache::ReleaseCachedFace(CFX_Font* pFont)

+{

+    FX_BOOL bExternal = pFont->GetFace() == NULL;

+    void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();

+    CFX_FTCacheMap& map =  bExternal ? m_ExtFaceMap : m_FTFaceMap;

+    CFX_CountedFaceCache* counted_face_cache = NULL;

+    if (!map.Lookup((FXFT_Face)face, counted_face_cache)) {

+        return;

+    }

+    if (counted_face_cache->m_nCount > 1) {

+        counted_face_cache->m_nCount--;

+    }

+}

+void CFX_FontCache::FreeCache(FX_BOOL bRelease)

+{

+    {

+        FX_POSITION pos;

+        pos = m_FTFaceMap.GetStartPosition();

+        while (pos) {

+            FXFT_Face face;

+            CFX_CountedFaceCache* cache;

+            m_FTFaceMap.GetNextAssoc(pos, face, cache);

+            if (bRelease || cache->m_nCount < 2) {

+                delete cache->m_Obj;

+                delete cache;

+                m_FTFaceMap.RemoveKey(face);

+            }

+        }

+        pos = m_ExtFaceMap.GetStartPosition();

+        while (pos) {

+            FXFT_Face face;

+            CFX_CountedFaceCache* cache;

+            m_ExtFaceMap.GetNextAssoc(pos, face, cache);

+            if (bRelease || cache->m_nCount < 2) {

+                delete cache->m_Obj;

+                delete cache;

+                m_ExtFaceMap.RemoveKey(face);

+            }

+        }

+    }

+}

+CFX_FaceCache::CFX_FaceCache(FXFT_Face face)

+{

+    m_Face = face;

+    m_pBitmap = NULL;

+}

+CFX_FaceCache::~CFX_FaceCache()

+{

+    FX_POSITION pos = m_SizeMap.GetStartPosition();

+    CFX_ByteString Key;

+    CFX_SizeGlyphCache* pSizeCache = NULL;

+    while(pos) {

+        m_SizeMap.GetNextAssoc( pos, Key, (void*&)pSizeCache);

+        delete pSizeCache;

+    }

+    m_SizeMap.RemoveAll();

+    pos = m_PathMap.GetStartPosition();

+    FX_LPVOID key1;

+    CFX_PathData* pPath;

+    while (pos) {

+        m_PathMap.GetNextAssoc(pos, key1, (FX_LPVOID&)pPath);

+        delete pPath;

+    }

+    if (m_pBitmap) {

+        delete m_pBitmap;

+    }

+    m_PathMap.RemoveAll();

+}

+#if ((_FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))

+void CFX_FaceCache::InitPlatform()

+{

+}

+#endif

+CFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix,

+        CFX_ByteStringC& FaceGlyphsKey, FX_DWORD glyph_index, FX_BOOL bFontStyle,

+        int dest_width, int anti_alias)

+{

+    CFX_SizeGlyphCache* pSizeCache = NULL;

+    if (!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {

+        pSizeCache = FX_NEW CFX_SizeGlyphCache;

+        if (pSizeCache == NULL)	{

+            return NULL;

+        }

+        m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);

+    }

+    CFX_GlyphBitmap* pGlyphBitmap = NULL;

+    if (pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)glyph_index, (void*&)pGlyphBitmap)) {

+        return pGlyphBitmap;

+    }

+    pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle, pMatrix, dest_width, anti_alias);

+    if (pGlyphBitmap == NULL)	{

+        return NULL;

+    }

+    pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);

+    return pGlyphBitmap;

+}

+const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,

+        int dest_width, int anti_alias, int& text_flags)

+{

+    if (glyph_index == (FX_DWORD) - 1) {

+        return NULL;

+    }

+    _CFX_UniqueKeyGen keygen;

+#if ((_FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))

+    if (pFont->GetSubstFont())

+        keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),

+                        (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,

+                        pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());

+    else

+        keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),

+                        (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);

+#else

+    if (text_flags & FXTEXT_NO_NATIVETEXT) {

+        if (pFont->GetSubstFont())

+            keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),

+                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,

+                            pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());

+        else

+            keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),

+                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);

+    } else {

+        if (pFont->GetSubstFont())

+            keygen.Generate(10, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),

+                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,

+                            pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical(), 3);

+        else

+            keygen.Generate(7, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),

+                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias, 3);

+    }

+#endif

+    CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);

+#if ((_FXM_PLATFORM_  != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))

+    return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);

+#else

+    if (text_flags & FXTEXT_NO_NATIVETEXT) {

+        return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);

+    } else {

+        CFX_GlyphBitmap* pGlyphBitmap;

+        CFX_SizeGlyphCache* pSizeCache = NULL;

+        if (m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {

+            if (pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)glyph_index, (void*&)pGlyphBitmap)) {

+                return pGlyphBitmap;

+            }

+            pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);

+            if (pGlyphBitmap) {

+                pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);

+                return pGlyphBitmap;

+            }

+        } else {

+            pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);

+            if (pGlyphBitmap) {

+                pSizeCache = FX_NEW CFX_SizeGlyphCache;

+                if (pSizeCache == NULL)	{

+                    return NULL;

+                }

+                m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);

+                pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);

+                return pGlyphBitmap;

+            }

+        }

+        if (pFont->GetSubstFont())

+            keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),

+                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,

+                            pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());

+        else

+            keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),

+                            (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);

+        CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);

+        text_flags |= FXTEXT_NO_NATIVETEXT;

+        return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);

+    }

+#endif

+}

+CFX_SizeGlyphCache::~CFX_SizeGlyphCache()

+{

+    FX_POSITION pos = m_GlyphMap.GetStartPosition();

+    FX_LPVOID Key;

+    CFX_GlyphBitmap* pGlyphBitmap = NULL;

+    while(pos) {

+        m_GlyphMap.GetNextAssoc(pos, Key, (void*&)pGlyphBitmap);

+        delete pGlyphBitmap;

+    }

+    m_GlyphMap.RemoveAll();

+}

+#if defined(_FPDFAPI_MINI_)

+#define CONTRAST_RAMP_STEP	16

+#else

+#define CONTRAST_RAMP_STEP	1

+#endif

+static const FX_BYTE g_adjust_contrast11[256] = {

+    0, 0, 2, 3, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 21, 22, 24, 25, 26, 28, 29, 31,

+    32, 33, 35, 36, 38, 39, 40, 42, 43, 45, 46, 48, 49, 51, 52, 54, 55, 56, 58, 59, 61, 62, 64, 65,

+    67, 68, 70, 71, 72, 74, 75, 77, 78, 80, 81, 83, 84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 99, 100,

+    101, 103, 104, 106, 107, 109, 110, 111, 113, 114, 116, 117, 118, 120, 121, 123, 124, 125, 127,

+    128, 130, 131, 132, 134, 135, 136, 138, 139, 140, 142, 143, 144, 146, 147, 148, 149, 151, 152,

+    153, 155, 156, 157, 158, 160, 161, 162, 163, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175,

+    177, 178, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196,

+    197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,

+    215, 216, 217, 218, 219, 220, 221, 221, 222, 223, 224, 224, 225, 226, 227, 227, 228, 229, 230,

+    230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 237, 238, 239, 239, 240, 240, 241, 241,

+    242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249,

+    250, 250, 250, 251, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 254, 254,

+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255,

+};

+static const FX_BYTE g_adjust_contrast15[256] = {

+    0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,

+    22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 43, 45, 46, 47, 48, 50, 51,

+    52, 54, 55, 56, 58, 59, 60, 62, 63, 64, 66, 67, 68, 70, 71, 73, 74, 75, 77, 78, 80, 81, 82, 84, 85, 87,

+    88, 90, 91, 93, 94, 95, 97, 98, 100, 101, 103, 104, 106, 107, 109, 110, 111, 113, 114, 116, 117, 119,

+    120, 122, 123, 125, 126, 128, 129, 130, 132, 133, 135, 136, 138, 139, 141, 142, 143, 145, 146, 148,

+    149, 150, 152, 153, 155, 156, 157, 159, 160, 161, 163, 164, 166, 167, 168, 170, 171, 172, 174, 175,

+    176, 177, 179, 180, 181, 183, 184, 185, 186, 188, 189, 190, 191, 192, 194, 195, 196, 197, 198, 199,

+    201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220,

+    221, 222, 223, 224, 225, 226, 227, 227, 228, 229, 230, 231, 232, 232, 233, 234, 235, 235, 236, 237,

+    237, 238, 239, 239, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248,

+    248, 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 254, 254,

+    254, 254, 254, 254, 254, 254, 254, 254, 254, 255,

+};

+static void _CalcContrastRamp(FX_LPBYTE ramp, int level)

+{

+    int contrast_min = 0, contrast_max = 255 - level, i;

+    for (i = 0; i < contrast_min; i ++) {

+        ramp[i] = 0;

+    }

+    for (i = contrast_min; i < contrast_max; i ++) {

+        ramp[i] = 255 * (i - contrast_min) / (contrast_max - contrast_min);

+    }

+    for (i = contrast_max; i < 256; i ++) {

+        ramp[i] = 255;

+    }

+}

+void CFX_Font::AdjustMMParams(int glyph_index, int dest_width, int weight)

+{

+    FXFT_MM_Var pMasters = NULL;

+    FXFT_Get_MM_Var(m_Face, &pMasters);

+    if (pMasters == NULL) {

+        return;

+    }

+    long coords[2];

+    if (weight == 0) {

+        coords[0] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 0)) / 65536;

+    } else {

+        coords[0] = weight;

+    }

+    if (dest_width == 0) {

+        coords[1] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;

+    } else {

+        int min_param = FXFT_Get_MM_Axis_Min(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;

+        int max_param = FXFT_Get_MM_Axis_Max(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;

+        coords[1] = min_param;

+        int error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);

+        error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);

+        int min_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);

+        coords[1] = max_param;

+        error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);

+        error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);

+        int max_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);

+        if (max_width == min_width) {

+            return;

+        }

+        int param = min_param + (max_param - min_param) * (dest_width - min_width) / (max_width - min_width);

+        coords[1] = param;

+    }

+    FXFT_Free(m_Face, pMasters);

+    FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);

+}

+extern const char g_AngleSkew[30] = {

+    0, 2, 3, 5, 7, 9, 11, 12, 14, 16,

+    18, 19, 21, 23, 25, 27, 29, 31, 32, 34,

+    36, 38, 40, 42, 45, 47, 49, 51, 53, 55,

+};

+static const FX_BYTE g_WeightPow[100] = {

+    0, 3, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20,

+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 36,

+    37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42,

+    42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47,

+    47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51,

+    51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53,

+};

+extern const FX_BYTE g_WeightPow_11[100] = {

+    0, 4, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22,

+    23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 39, 40, 40,

+    41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46,

+    46, 43, 47, 47, 48, 48, 48, 48, 45, 50, 50, 50, 46, 51, 51, 51, 52, 52,

+    52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56,

+    56, 56, 56, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58,

+};

+extern const FX_BYTE g_WeightPow_SHIFTJIS[100] = {

+    0, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 21, 22, 24, 26, 28,

+    30, 32, 33, 35, 37, 39, 41, 43, 45, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50,

+    51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55,

+    55, 55, 55, 56, 56, 56, 56, 56 , 56, 57, 57, 57 , 57 , 57, 57, 57, 58, 58, 58, 58, 58,

+    58, 58, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60,

+};

+static void _GammaAdjust(FX_LPBYTE pData, int nWid, int nHei, int src_pitch, FX_LPCBYTE gammaTable)

+{

+    int count = nHei * src_pitch;

+    for(int i = 0; i < count; i++) {

+        pData[i] = gammaTable[pData[i]];

+    }

+}

+static void _ContrastAdjust(FX_LPBYTE pDataIn, FX_LPBYTE pDataOut, int nWid, int nHei, int nSrcRowBytes, int nDstRowBytes)

+{

+    int col, row, temp;

+    int max = 0, min = 255;

+    FX_FLOAT rate;

+    for (row = 0; row < nHei; row ++) {

+        FX_LPBYTE pRow = pDataIn + row * nSrcRowBytes;

+        for (col = 0; col < nWid; col++) {

+            temp = *pRow ++;

+            if (temp > max) {

+                max = temp;

+            }

+            if (temp < min) {

+                min = temp;

+            }

+        }

+    }

+    temp = max - min;

+    if (0 == temp || 255 == temp) {

+        int rowbytes = FXSYS_abs(nSrcRowBytes) > nDstRowBytes ? nDstRowBytes : FXSYS_abs(nSrcRowBytes);

+        for (row = 0; row < nHei; row ++) {

+            FXSYS_memcpy32(pDataOut + row * nDstRowBytes, pDataIn + row * nSrcRowBytes, rowbytes);

+        }

+        return;

+    }

+    rate = 255.f / temp;

+    for (row = 0; row < nHei; row ++) {

+        FX_LPBYTE pSrcRow = pDataIn + row * nSrcRowBytes;

+        FX_LPBYTE pDstRow = pDataOut + row * nDstRowBytes;

+        for (col = 0; col < nWid; col ++) {

+            temp = (int)((*(pSrcRow++) - min) * rate + 0.5);

+            if (temp > 255)	{

+                temp = 255;

+            } else if (temp < 0) {

+                temp = 0;

+            }

+            *pDstRow ++ = (FX_BYTE)temp;

+        }

+    }

+}

+CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,

+        const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias)

+{

+    if (m_Face == NULL) {

+        return NULL;

+    }

+    FXFT_Matrix  ft_matrix;

+    ft_matrix.xx = (signed long)(pMatrix->GetA() / 64 * 65536);

+    ft_matrix.xy = (signed long)(pMatrix->GetC() / 64 * 65536);

+    ft_matrix.yx = (signed long)(pMatrix->GetB() / 64 * 65536);

+    ft_matrix.yy = (signed long)(pMatrix->GetD() / 64 * 65536);

+    FX_BOOL bUseCJKSubFont = FALSE;

+    const CFX_SubstFont* pSubstFont = pFont->GetSubstFont();

+    if (pSubstFont) {

+        bUseCJKSubFont = pSubstFont->m_bSubstOfCJK && bFontStyle;

+        int skew = 0;

+        if (bUseCJKSubFont) {

+            skew = pSubstFont->m_bItlicCJK ? -15 : 0;

+        } else {

+            skew = pSubstFont->m_ItalicAngle;

+        }

+        if (skew) {

+            skew = skew <= -30 ? -58 : -g_AngleSkew[-skew];

+            if (pFont->IsVertical()) {

+                ft_matrix.yx += ft_matrix.yy * skew / 100;

+            } else {

+                ft_matrix.xy += -ft_matrix.xx * skew / 100;

+            }

+        }

+        if (pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {

+            pFont->AdjustMMParams(glyph_index, dest_width, pFont->GetSubstFont()->m_Weight);

+        }

+    }

+    int transflag = FXFT_Get_Face_Internal_Flag(m_Face);

+    FXFT_Set_Transform(m_Face, &ft_matrix, 0);

+    int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : (FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING);

+    int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);

+    if (error) {

+        FXFT_Set_Face_Internal_Flag(m_Face, transflag);

+        return NULL;

+    }

+    int weight = 0;

+    if (bUseCJKSubFont) {

+        weight = pSubstFont->m_WeightCJK;

+    } else {

+        weight = pSubstFont ? pSubstFont->m_Weight : 0;

+    }

+    if (pSubstFont && !(pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && weight > 400) {

+        int index = (weight - 400) / 10;

+        if (index >= 100) {

+            FXFT_Set_Face_Internal_Flag(m_Face, transflag);

+            return NULL;

+        }

+        int level = 0;

+        if (pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {

+            level = g_WeightPow_SHIFTJIS[index] * 2 * (FXSYS_abs(ft_matrix.xx) + FXSYS_abs(ft_matrix.xy)) / 36655;

+        } else {

+            level = g_WeightPow_11[index] * (FXSYS_abs(ft_matrix.xx) + FXSYS_abs(ft_matrix.xy)) / 36655;

+        }

+        FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);

+    }

+    FXFT_Library_SetLcdFilter(CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary, FT_LCD_FILTER_DEFAULT);

+    error = FXFT_Render_Glyph(m_Face, anti_alias);

+    if (error) {

+        FXFT_Set_Face_Internal_Flag(m_Face, transflag);

+        return NULL;

+    }

+    int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(m_Face));

+    int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(m_Face));

+    if (bmwidth > 2048 || bmheight > 2048) {

+        FXFT_Set_Face_Internal_Flag(m_Face, transflag);

+        return NULL;

+    }

+    int dib_width = bmwidth;

+    CFX_GlyphBitmap* pGlyphBitmap = FX_NEW CFX_GlyphBitmap;

+    if (!pGlyphBitmap) {

+        return NULL;

+    }

+    pGlyphBitmap->m_Bitmap.Create(dib_width, bmheight,

+                                  anti_alias == FXFT_RENDER_MODE_MONO ? FXDIB_1bppMask : FXDIB_8bppMask);

+    pGlyphBitmap->m_Left = FXFT_Get_Glyph_BitmapLeft(m_Face);

+    pGlyphBitmap->m_Top = FXFT_Get_Glyph_BitmapTop(m_Face);

+    int dest_pitch = pGlyphBitmap->m_Bitmap.GetPitch();

+    int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(m_Face));

+    FX_BYTE* pDestBuf = pGlyphBitmap->m_Bitmap.GetBuffer();

+    FX_BYTE* pSrcBuf = (FX_BYTE*)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(m_Face));

+    if (anti_alias != FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {

+        int bytes = anti_alias == FXFT_RENDER_MODE_LCD ? 3 : 1;

+        for(int i = 0; i < bmheight; i++)

+            for(int n = 0; n < bmwidth; n++) {

+                FX_BYTE data = (pSrcBuf[i * src_pitch + n / 8] & (0x80 >> (n % 8))) ? 255 : 0;

+                for (int b = 0; b < bytes; b ++) {

+                    pDestBuf[i * dest_pitch + n * bytes + b] = data;

+                }

+            }

+    } else {

+        FXSYS_memset32(pDestBuf, 0, dest_pitch * bmheight);

+        if (anti_alias == FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {

+            int rowbytes = FXSYS_abs(src_pitch) > dest_pitch ? dest_pitch : FXSYS_abs(src_pitch);

+            for (int row = 0; row < bmheight; row ++) {

+                FXSYS_memcpy32(pDestBuf + row * dest_pitch, pSrcBuf + row * src_pitch, rowbytes);

+            }

+        } else {

+            _ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, dest_pitch);

+            _GammaAdjust(pDestBuf, bmwidth, bmheight, dest_pitch, CFX_GEModule::Get()->GetTextGammaTable());

+        }

+    }

+    FXFT_Set_Face_Internal_Flag(m_Face, transflag);

+    return pGlyphBitmap;

+}

+FX_BOOL _OutputGlyph(void* dib, int x, int y, CFX_Font* pFont,

+                     int glyph_index, FX_ARGB argb)

+{

+    CFX_DIBitmap* pDib = (CFX_DIBitmap*)dib;

+    FXFT_Face face = pFont->GetFace();

+    int error = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_BITMAP);

+    if (error) {

+        return FALSE;

+    }

+    error = FXFT_Render_Glyph(face, FXFT_RENDER_MODE_NORMAL);

+    if (error) {

+        return FALSE;

+    }

+    int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(face));

+    int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(face));

+    int left = FXFT_Get_Glyph_BitmapLeft(face);

+    int top = FXFT_Get_Glyph_BitmapTop(face);

+    FX_LPCBYTE src_buf = (FX_LPCBYTE)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(face));

+    int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(face));

+    CFX_DIBitmap mask;

+    mask.Create(bmwidth, bmheight, FXDIB_8bppMask);

+    FX_LPBYTE dest_buf = mask.GetBuffer();

+    int dest_pitch = mask.GetPitch();

+    for (int row = 0; row < bmheight; row ++) {

+        FX_LPCBYTE src_scan = src_buf + row * src_pitch;

+        FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;

+        FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);

+    }

+    pDib->CompositeMask(x + left, y - top, bmwidth, bmheight, &mask, argb, 0, 0);

+    return TRUE;

+}

+FX_BOOL OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,

+                   CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb)

+{

+    if (!pFont) {

+        return FALSE;

+    }

+    FXFT_Face face = pFont->GetFace();

+    FXFT_Select_Charmap(pFont->m_Face, FXFT_ENCODING_UNICODE);

+    int transflag = FXFT_Get_Face_Internal_Flag(pFont->m_Face);

+    if (pText_matrix) {

+        FXFT_Matrix  ft_matrix;

+        ft_matrix.xx = (signed long)(pText_matrix->a / 64 * 65536);

+        ft_matrix.xy = (signed long)(pText_matrix->c / 64 * 65536);

+        ft_matrix.yx = (signed long)(pText_matrix->b / 64 * 65536);

+        ft_matrix.yy = (signed long)(pText_matrix->d / 64 * 65536);

+        FXFT_Set_Transform(face, &ft_matrix, 0);

+    }

+    FX_FLOAT x_pos = 0;

+    for (; *text != 0; text ++) {

+        FX_WCHAR unicode = *text;

+        int glyph_index = FXFT_Get_Char_Index(pFont->m_Face, unicode);

+        if (glyph_index <= 0) {

+            continue;

+        }

+        int err = FXFT_Load_Glyph(pFont->m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);

+        if (err) {

+            continue;

+        }

+        int w = FXFT_Get_Glyph_HoriAdvance(pFont->m_Face);

+        int em = FXFT_Get_Face_UnitsPerEM(pFont->m_Face);

+        FX_FLOAT x1, y1;

+        pText_matrix->Transform(x_pos, 0, x1, y1);

+        _OutputGlyph(dib, (int)x1 + x, (int) - y1 + y, pFont,

+                     glyph_index, argb);

+        x_pos += (FX_FLOAT)w / em;

+    }

+    FXFT_Set_Face_Internal_Flag(pFont->m_Face, transflag);

+    return TRUE;

+}

+FX_BOOL OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,

+                    CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb)

+{

+    FXFT_Matrix  ft_matrix;

+    if (pMatrix) {

+        ft_matrix.xx = (signed long)(pMatrix->a * font_size / 64 * 65536);

+        ft_matrix.xy = (signed long)(pMatrix->c * font_size / 64 * 65536);

+        ft_matrix.yx = (signed long)(pMatrix->b * font_size / 64 * 65536);

+        ft_matrix.yy = (signed long)(pMatrix->d * font_size / 64 * 65536);

+    } else {

+        ft_matrix.xx = (signed long)(font_size / 64 * 65536);

+        ft_matrix.xy = ft_matrix.yx = 0;

+        ft_matrix.yy = (signed long)(font_size / 64 * 65536);

+    }

+    int transflag = FXFT_Get_Face_Internal_Flag(pFont->m_Face);

+    FXFT_Set_Transform(pFont->m_Face, &ft_matrix, 0);

+    FX_BOOL ret = _OutputGlyph(dib, x, y, pFont,

+                               glyph_index, argb);

+    FXFT_Set_Face_Internal_Flag(pFont->m_Face, transflag);

+    return ret;

+}

+const CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width)

+{

+    if (m_Face == NULL || glyph_index == (FX_DWORD) - 1) {

+        return NULL;

+    }

+    CFX_PathData* pGlyphPath = NULL;

+    FX_LPVOID key;

+    if (pFont->GetSubstFont())

+        key = (FX_LPVOID)(FX_UINTPTR)(glyph_index + ((pFont->GetSubstFont()->m_Weight / 16) << 15) +

+                                      ((pFont->GetSubstFont()->m_ItalicAngle / 2) << 21) + ((dest_width / 16) << 25) +

+                                      (pFont->IsVertical() << 31));

+    else {

+        key = (FX_LPVOID)(FX_UINTPTR)glyph_index;

+    }

+    if (m_PathMap.Lookup(key, (FX_LPVOID&)pGlyphPath)) {

+        return pGlyphPath;

+    }

+    pGlyphPath = pFont->LoadGlyphPath(glyph_index, dest_width);

+    m_PathMap.SetAt(key, pGlyphPath);

+    return pGlyphPath;

+}

+typedef struct {

+    FX_BOOL			m_bCount;

+    int				m_PointCount;

+    FX_PATHPOINT*	m_pPoints;

+    int				m_CurX;

+    int				m_CurY;

+    FX_FLOAT		m_CoordUnit;

+} OUTLINE_PARAMS;

+void _Outline_CheckEmptyContour(OUTLINE_PARAMS* param)

+{

+    if (param->m_PointCount >= 2 && param->m_pPoints[param->m_PointCount - 2].m_Flag == FXPT_MOVETO &&

+            param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 1].m_PointX &&

+            param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 1].m_PointY) {

+        param->m_PointCount -= 2;

+    }

+    if (param->m_PointCount >= 4 && param->m_pPoints[param->m_PointCount - 4].m_Flag == FXPT_MOVETO &&

+            param->m_pPoints[param->m_PointCount - 3].m_Flag == FXPT_BEZIERTO &&

+            param->m_pPoints[param->m_PointCount - 3].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&

+            param->m_pPoints[param->m_PointCount - 3].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&

+            param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&

+            param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&

+            param->m_pPoints[param->m_PointCount - 1].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&

+            param->m_pPoints[param->m_PointCount - 1].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY) {

+        param->m_PointCount -= 4;

+    }

+}

+extern "C" {

+    static int _Outline_MoveTo(const FXFT_Vector* to, void* user)

+    {

+        OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;

+        if (!param->m_bCount) {

+            _Outline_CheckEmptyContour(param);

+            param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount].m_Flag = FXPT_MOVETO;

+            param->m_CurX = to->x;

+            param->m_CurY = to->y;

+            if (param->m_PointCount) {

+                param->m_pPoints[param->m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;

+            }

+        }

+        param->m_PointCount ++;

+        return 0;

+    }

+};

+extern "C" {

+    static int _Outline_LineTo(const FXFT_Vector* to, void* user)

+    {

+        OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;

+        if (!param->m_bCount) {

+            param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount].m_Flag = FXPT_LINETO;

+            param->m_CurX = to->x;

+            param->m_CurY = to->y;

+        }

+        param->m_PointCount ++;

+        return 0;

+    }

+};

+extern "C" {

+    static int _Outline_ConicTo(const FXFT_Vector* control, const FXFT_Vector* to, void* user)

+    {

+        OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;

+        if (!param->m_bCount) {

+            param->m_pPoints[param->m_PointCount].m_PointX = (param->m_CurX + (control->x - param->m_CurX) * 2 / 3) / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount].m_PointY = (param->m_CurY + (control->y - param->m_CurY) * 2 / 3) / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;

+            param->m_pPoints[param->m_PointCount + 1].m_PointX = (control->x + (to->x - control->x) / 3) / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount + 1].m_PointY = (control->y + (to->y - control->y) / 3) / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;

+            param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;

+            param->m_CurX = to->x;

+            param->m_CurY = to->y;

+        }

+        param->m_PointCount += 3;

+        return 0;

+    }

+};

+extern "C" {

+    static int _Outline_CubicTo(const FXFT_Vector* control1, const FXFT_Vector* control2, const FXFT_Vector* to, void* user)

+    {

+        OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;

+        if (!param->m_bCount) {

+            param->m_pPoints[param->m_PointCount].m_PointX = control1->x / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount].m_PointY = control1->y / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;

+            param->m_pPoints[param->m_PointCount + 1].m_PointX = control2->x / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount + 1].m_PointY = control2->y / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;

+            param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;

+            param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;

+            param->m_CurX = to->x;

+            param->m_CurY = to->y;

+        }

+        param->m_PointCount += 3;

+        return 0;

+    }

+};

+CFX_PathData* CFX_Font::LoadGlyphPath(FX_DWORD glyph_index, int dest_width)

+{

+    if (m_Face == NULL) {

+        return NULL;

+    }

+    FXFT_Set_Pixel_Sizes(m_Face, 0, 64);

+    FXFT_Matrix  ft_matrix = {65536, 0, 0, 65536};

+    if (m_pSubstFont) {

+        if (m_pSubstFont->m_ItalicAngle) {

+            int skew = m_pSubstFont->m_ItalicAngle;

+            skew = skew <= -30 ? -58 : -g_AngleSkew[-skew];

+            if (m_bVertical) {

+                ft_matrix.yx += ft_matrix.yy * skew / 100;

+            } else {

+                ft_matrix.xy += -ft_matrix.xx * skew / 100;

+            }

+        }

+        if (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {

+            AdjustMMParams(glyph_index, dest_width, m_pSubstFont->m_Weight);

+        }

+    }

+    int transflag = FXFT_Get_Face_Internal_Flag(m_Face);

+    FXFT_Set_Transform(m_Face, &ft_matrix, 0);

+    int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING;

+    int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);

+    if (error) {

+        FXFT_Set_Face_Internal_Flag(m_Face, transflag);

+        return NULL;

+    }

+    if (m_pSubstFont && !(m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && m_pSubstFont->m_Weight > 400) {

+        int level = 0;

+        if (m_pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {

+            level = g_WeightPow_SHIFTJIS[(m_pSubstFont->m_Weight - 400) / 10] * 2 * 65536 / 36655;

+        } else {

+            level = g_WeightPow[(m_pSubstFont->m_Weight - 400) / 10] * 2;

+        }

+        FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);

+    }

+    FXFT_Outline_Funcs funcs;

+    funcs.move_to = _Outline_MoveTo;

+    funcs.line_to = _Outline_LineTo;

+    funcs.conic_to = _Outline_ConicTo;

+    funcs.cubic_to = _Outline_CubicTo;

+    funcs.shift = 0;

+    funcs.delta = 0;

+    OUTLINE_PARAMS params;

+    params.m_bCount = TRUE;

+    params.m_PointCount = 0;

+    FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);

+    if (params.m_PointCount == 0) {

+        FXFT_Set_Face_Internal_Flag(m_Face, transflag);

+        return NULL;

+    }

+    CFX_PathData* pPath = FX_NEW CFX_PathData;

+    if (!pPath) {

+        return NULL;

+    }

+    pPath->SetPointCount(params.m_PointCount);

+    params.m_bCount = FALSE;

+    params.m_PointCount = 0;

+    params.m_pPoints = pPath->GetPoints();

+    params.m_CurX = params.m_CurY = 0;

+    params.m_CoordUnit = 64 * 64.0;

+    FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);

+    _Outline_CheckEmptyContour(&params);

+    pPath->TrimPoints(params.m_PointCount);

+    if (params.m_PointCount) {

+        pPath->GetPoints()[params.m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;

+    }

+    FXFT_Set_Face_Internal_Flag(m_Face, transflag);

+    return pPath;

+}

+void _CFX_UniqueKeyGen::Generate(int count, ...)

+{

+    va_list argList;

+    va_start(argList, count);

+    for (int i = 0; i < count; i ++) {

+        int p = va_arg(argList, int);

+        ((FX_DWORD*)m_Key)[i] = p;

+    }

+    va_end(argList);

+    m_KeyLen = count * sizeof(FX_DWORD);

+}

diff --git a/core/src/fxge/ge/text_int.h b/core/src/fxge/ge/text_int.h
new file mode 100644
index 0000000..7608f8a
--- /dev/null
+++ b/core/src/fxge/ge/text_int.h
@@ -0,0 +1,100 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+struct _CFX_UniqueKeyGen {

+    void		Generate(int count, ...);

+    FX_CHAR		m_Key[128];

+    int			m_KeyLen;

+};

+class CFX_SizeGlyphCache : public CFX_Object

+{

+public:

+    CFX_SizeGlyphCache()

+    {

+        m_GlyphMap.InitHashTable(253);

+    }

+    ~CFX_SizeGlyphCache();

+    CFX_MapPtrToPtr			m_GlyphMap;

+};

+class CTTFontDesc : public CFX_Object

+{

+public:

+    CTTFontDesc()

+    {

+        m_Type = 0;

+        m_pFontData = NULL;

+        m_RefCount = 0;

+    }

+    ~CTTFontDesc();

+    FX_BOOL			ReleaseFace(FXFT_Face face);

+    int				m_Type;

+    union {

+        struct {

+            FX_BOOL		m_bItalic;

+            FX_BOOL		m_bBold;

+            FXFT_Face	m_pFace;

+        } m_SingleFace;

+        struct {

+            FXFT_Face	m_pFaces[16];

+        } m_TTCFace;

+    };

+    FX_BYTE*		m_pFontData;

+    int				m_RefCount;

+};

+class CFX_UnicodeEncoding : public IFX_FontEncoding

+{

+public:

+    CFX_UnicodeEncoding(CFX_Font* pFont);

+    virtual FX_DWORD		GlyphFromCharCodeEx(FX_DWORD charcode, int encoding = ENCODING_UNICODE);

+private:

+    CFX_Font*			m_pFont;

+    virtual FX_DWORD		GlyphFromCharCode(FX_DWORD charcode);

+    virtual CFX_WideString	UnicodeFromCharCode(FX_DWORD charcode) const

+    {

+        return CFX_WideString((FX_WCHAR)charcode);

+    }

+    virtual FX_DWORD		CharCodeFromUnicode(FX_WCHAR Unicode) const

+    {

+        return Unicode;

+    }

+    virtual FX_BOOL			IsUnicodeCompatible() const

+    {

+        return TRUE;

+    }

+};

+#define CHARSET_FLAG_ANSI		1

+#define CHARSET_FLAG_SYMBOL		2

+#define CHARSET_FLAG_SHIFTJIS	4

+#define CHARSET_FLAG_BIG5		8

+#define CHARSET_FLAG_GB			16

+#define CHARSET_FLAG_KOREAN		32

+class CFontFaceInfo : public CFX_Object

+{

+public:

+    CFX_ByteString		m_FilePath;

+    CFX_ByteString		m_FaceName;

+    FX_DWORD			m_Styles;

+    FX_DWORD			m_Charsets;

+    FX_DWORD			m_FontOffset;

+    FX_DWORD			m_FileSize;

+    CFX_ByteString		m_FontTables;

+};

+class CFontFileFaceInfo : public CFX_Object

+{

+public:

+    CFontFileFaceInfo();

+    ~CFontFileFaceInfo();

+    IFX_FileStream*		m_pFile;

+    FXFT_Face			m_Face;

+    CFX_ByteString		m_FaceName;

+    FX_DWORD			m_Charsets;

+    FX_DWORD			m_FileSize;

+    FX_DWORD			m_FontOffset;

+    int					m_Weight;

+    FX_BOOL				m_bItalic;

+    int					m_PitchFamily;

+    CFX_ByteString		m_FontTables;

+};

diff --git a/core/src/fxge/win32/dwrite_int.h b/core/src/fxge/win32/dwrite_int.h
new file mode 100644
index 0000000..1f0770d
--- /dev/null
+++ b/core/src/fxge/win32/dwrite_int.h
@@ -0,0 +1,59 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#ifndef _FX_DIRECT_WRITE_

+#define _FX_DIRECT_WRITE_

+#ifndef DECLSPEC_UUID

+#if (_MSC_VER >= 1100) && defined (__cplusplus)

+#define DECLSPEC_UUID(x)    __declspec(uuid(x))

+#else

+#define DECLSPEC_UUID(x)

+#endif

+#endif

+#ifndef DECLSPEC_NOVTABLE

+#if (_MSC_VER >= 1100) && defined(__cplusplus)

+#define DECLSPEC_NOVTABLE   __declspec(novtable)

+#else

+#define DECLSPEC_NOVTABLE

+#endif

+#endif

+#if(WINVER < 0x0500)

+#ifndef _MAC

+DECLARE_HANDLE(HMONITOR);

+#endif

+#endif

+class CDWriteExt

+{

+public:

+    CDWriteExt();

+    ~CDWriteExt();

+

+    void			Load();

+    void            Unload();

+

+    FX_BOOL			IsAvailable()

+    {

+        return m_pDWriteFactory != NULL;

+    }

+

+    void*			DwCreateFontFaceFromStream(FX_LPBYTE pData, FX_DWORD size, int simulation_style);

+    FX_BOOL         DwCreateRenderingTarget(CFX_DIBitmap* pSrc, void** renderTarget);

+    void            DwDeleteRenderingTarget(void* renderTarget);

+    FX_BOOL			DwRendingString(void* renderTarget, CFX_ClipRgn* pClipRgn, FX_RECT& stringRect, CFX_AffineMatrix* pMatrix,

+                                    void *font, FX_FLOAT font_size, FX_ARGB text_color,

+                                    int glyph_count, unsigned short* glyph_indices,

+                                    FX_FLOAT baselineOriginX, FX_FLOAT baselineOriginY,

+                                    void* glyph_offsets,

+                                    FX_FLOAT* glyph_advances);

+    void			DwDeleteFont(void* pFont);

+

+protected:

+    void*			m_hModule;

+    void*			m_pDWriteFactory;

+    void*		    m_pDwFontContext;

+    void*	        m_pDwTextRenderer;

+};

+#endif

diff --git a/core/src/fxge/win32/fx_win32_device.cpp b/core/src/fxge/win32/fx_win32_device.cpp
new file mode 100644
index 0000000..e3f5ae0
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_device.cpp
@@ -0,0 +1,1200 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_

+#include "../../../include/fxge/fx_ge_win32.h"

+#include <crtdbg.h>

+#include "../agg/include/fxfx_agg_clip_liang_barsky.h"

+#include "dwrite_int.h"

+#include "win32_int.h"

+#include "../ge/text_int.h"

+#include "../dib/dib_int.h"

+#include "../agg/include/fx_agg_driver.h"

+#include "../../../include/fxge/fx_freetype.h"

+#include "../../../include/fxcodec/fx_codec.h"

+class CWin32FontInfo : public IFX_SystemFontInfo

+{

+public:

+    CWin32FontInfo();

+    ~CWin32FontInfo();

+    virtual void		Release();

+    virtual	FX_BOOL		EnumFontList(CFX_FontMapper* pMapper);

+    virtual void*		MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);

+    virtual void*		GetFont(FX_LPCSTR face)

+    {

+        return NULL;

+    }

+    virtual FX_DWORD	GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);

+    virtual void		DeleteFont(void* hFont);

+    virtual	FX_BOOL		GetFaceName(void* hFont, CFX_ByteString& name);

+    virtual FX_BOOL		GetFontCharset(void* hFont, int& charset);

+    FX_BOOL				IsOpenTypeFromDiv(const LOGFONTA *plf);

+    FX_BOOL				IsSupportFontFormDiv(const LOGFONTA* plf);

+    void				AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType);

+    void				GetGBPreference(CFX_ByteString& face, int weight, int picth_family);

+    void				GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family);

+    CFX_ByteString		FindFont(const CFX_ByteString& name);

+    HDC					m_hDC;

+    CFX_FontMapper*		m_pMapper;

+    CFX_ByteString		m_LastFamily;

+    CFX_ByteString		m_KaiTi, m_FangSong;

+};

+CWin32FontInfo::CWin32FontInfo()

+{

+    m_hDC = CreateCompatibleDC(NULL);

+}

+CWin32FontInfo::~CWin32FontInfo()

+{

+    m_pMapper = NULL;

+}

+void CWin32FontInfo::Release()

+{

+    DeleteDC(m_hDC);

+    delete this;

+}

+#define TT_MAKE_TAG(x1, x2, x3, x4) (((FX_DWORD)x1<<24)|((FX_DWORD)x2<<16)|((FX_DWORD)x3<<8)|(FX_DWORD)x4)

+FX_BOOL CWin32FontInfo::IsOpenTypeFromDiv(const LOGFONTA *plf)

+{

+    HFONT hFont = CreateFontIndirectA(plf);

+    FX_BOOL ret = FALSE;

+    FX_DWORD font_size  = GetFontData(hFont, 0, NULL, 0);

+    if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) {

+        FX_DWORD lVersion = 0;

+        GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD));

+        lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 |

+                   ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24));

+        if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') ||

+                lVersion == 0x00010000 ||

+                lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') ||

+                lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') ||

+                lVersion == 0x00020000) {

+            ret = TRUE;

+        }

+    }

+    DeleteFont(hFont);

+    return ret;

+}

+FX_BOOL CWin32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf)

+{

+    HFONT hFont = CreateFontIndirectA(plf);

+    FX_BOOL ret = FALSE;

+    FX_DWORD font_size  = GetFontData(hFont, 0, NULL, 0);

+    if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) {

+        FX_DWORD lVersion = 0;

+        GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD));

+        lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 |

+                   ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24));

+        if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') ||

+                lVersion == 0x00010000 ||

+                lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') ||

+                lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') ||

+                lVersion == 0x00020000) {

+            ret = TRUE;

+        } else if ((lVersion & 0xFFFF0000) == TT_MAKE_TAG(0x80, 0x01, 0x00, 0x00) ||

+                   (lVersion & 0xFFFF0000) == TT_MAKE_TAG('%', '!', 0, 0)) {

+            ret = TRUE;

+        }

+    }

+    DeleteFont(hFont);

+    return ret;

+}

+void CWin32FontInfo::AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType)

+{

+    CFX_ByteString name(plf->lfFaceName, -1);

+    if (name[0] == '@') {

+        return;

+    }

+    if (name == m_LastFamily) {

+        m_pMapper->AddInstalledFont(name, plf->lfCharSet);

+        return;

+    }

+    if (!(FontType & TRUETYPE_FONTTYPE) && !(FontType & DEVICE_FONTTYPE)) {

+        return;

+    }

+    if (!(FontType & TRUETYPE_FONTTYPE)) {

+        if (!IsSupportFontFormDiv(plf)) {

+            return;

+        }

+    }

+    m_pMapper->AddInstalledFont(name, plf->lfCharSet);

+    m_LastFamily = name;

+}

+static int CALLBACK FontEnumProc(

+    const LOGFONTA *plf,

+    const TEXTMETRICA *lpntme,

+    FX_DWORD FontType,

+    LPARAM lParam

+)

+{

+    CWin32FontInfo* pFontInfo = (CWin32FontInfo*)lParam;

+    if (pFontInfo->m_pMapper->GetFontEnumerator()) {

+        pFontInfo->m_pMapper->GetFontEnumerator()->HitFont();

+    }

+    pFontInfo->AddInstalledFont(plf, FontType);

+    return 1;

+}

+FX_BOOL CWin32FontInfo::EnumFontList(CFX_FontMapper* pMapper)

+{

+    m_pMapper = pMapper;

+    LOGFONTA lf;

+    FXSYS_memset32(&lf, 0, sizeof(LOGFONTA));

+    lf.lfCharSet = DEFAULT_CHARSET;

+    lf.lfFaceName[0] = 0;

+    lf.lfPitchAndFamily = 0;

+    EnumFontFamiliesExA(m_hDC, &lf, (FONTENUMPROCA)FontEnumProc, (FX_UINTPTR)this, 0);

+    if (pMapper->GetFontEnumerator()) {

+        pMapper->GetFontEnumerator()->Finish();

+    }

+    return TRUE;

+}

+static const struct {

+    FX_LPCSTR	m_pFaceName;

+    FX_LPCSTR	m_pVariantName;

+}

+VariantNames[] = {

+    {"DFKai-SB", "\x19\x6A\x77\x69\xD4\x9A"},

+};

+static const struct {

+    FX_LPCSTR	m_pName;

+    FX_LPCSTR	m_pWinName;

+    FX_BOOL		m_bBold;

+    FX_BOOL		m_bItalic;

+}

+Base14Substs[] = {

+    {"Courier", "Courier New", FALSE, FALSE},

+    {"Courier-Bold", "Courier New", TRUE, FALSE},

+    {"Courier-BoldOblique", "Courier New", TRUE, TRUE},

+    {"Courier-Oblique", "Courier New", FALSE, TRUE},

+    {"Helvetica", "Arial", FALSE, FALSE},

+    {"Helvetica-Bold", "Arial", TRUE, FALSE},

+    {"Helvetica-BoldOblique", "Arial", TRUE, TRUE},

+    {"Helvetica-Oblique", "Arial", FALSE, TRUE},

+    {"Times-Roman", "Times New Roman", FALSE, FALSE},

+    {"Times-Bold", "Times New Roman", TRUE, FALSE},

+    {"Times-BoldItalic", "Times New Roman", TRUE, TRUE},

+    {"Times-Italic", "Times New Roman", FALSE, TRUE},

+};

+CFX_ByteString CWin32FontInfo::FindFont(const CFX_ByteString& name)

+{

+    if (m_pMapper == NULL) {

+        return name;

+    }

+    int nFonts = m_pMapper->m_InstalledTTFonts.GetSize();

+    for (int i = 0; i < nFonts; i ++) {

+        CFX_ByteString thisname = m_pMapper->m_InstalledTTFonts[i];

+        if (thisname[0] == ' ') {

+            if (thisname.Mid(1, name.GetLength()) == name) {

+                return m_pMapper->m_InstalledTTFonts[i + 1];

+            }

+        } else if (thisname.Left(name.GetLength()) == name) {

+            return m_pMapper->m_InstalledTTFonts[i];

+        }

+    }

+    return CFX_ByteString();

+}

+struct _FontNameMap {

+    FX_LPCSTR	m_pSubFontName;

+    FX_LPCSTR	m_pSrcFontName;

+};

+const _FontNameMap g_JpFontNameMap[] = {

+    {"MS Mincho", "Heiseimin-W3"},

+    {"MS Gothic", "Jun101-Light"},

+};

+const _FontNameMap g_GbFontNameMap[1];

+extern "C" {

+    static int compareString(const void* key, const void* element)

+    {

+        return FXSYS_stricmp((FX_LPCSTR)key, ((_FontNameMap*)element)->m_pSrcFontName);

+    }

+}

+FX_BOOL _GetSubFontName(CFX_ByteString& name, int lang)

+{

+    int size = sizeof g_JpFontNameMap;

+    void* pFontnameMap = (void*)g_JpFontNameMap;

+    if (lang == 1) {

+        size = sizeof g_GbFontNameMap;

+        pFontnameMap = (void*)g_GbFontNameMap;

+    } else if (lang == 2) {

+        size = 0;

+    }

+    _FontNameMap* found = (_FontNameMap*)FXSYS_bsearch((FX_LPCSTR)name, pFontnameMap,

+                          size / sizeof (_FontNameMap), sizeof (_FontNameMap), compareString);

+    if (found == NULL) {

+        return FALSE;

+    }

+    name = found->m_pSubFontName;

+    return TRUE;

+}

+void CWin32FontInfo::GetGBPreference(CFX_ByteString& face, int weight, int picth_family)

+{

+    if (face.Find("KaiTi") >= 0 || face.Find("\xbf\xac") >= 0) {

+        if (m_KaiTi.IsEmpty()) {

+            m_KaiTi = FindFont("KaiTi");

+            if (m_KaiTi.IsEmpty()) {

+                m_KaiTi = "SimSun";

+            }

+        }

+        face = m_KaiTi;

+    } else if (face.Find("FangSong") >= 0 || face.Find("\xb7\xc2\xcb\xce") >= 0) {

+        if (m_FangSong.IsEmpty()) {

+            m_FangSong = FindFont("FangSong");

+            if (m_FangSong.IsEmpty()) {

+                m_FangSong = "SimSun";

+            }

+        }

+        face = m_FangSong;

+    } else if (face.Find("SimSun") >= 0 || face.Find("\xcb\xce") >= 0) {

+        face = "SimSun";

+    } else if (face.Find("SimHei") >= 0 || face.Find("\xba\xda") >= 0) {

+        face = "SimHei";

+    } else if (!(picth_family & FF_ROMAN) && weight > 550) {

+        face = "SimHei";

+    } else {

+        face = "SimSun";

+    }

+}

+void CWin32FontInfo::GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)

+{

+    if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {

+        if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {

+            face = "MS PGothic";

+        } else if (face.Find("UI Gothic") >= 0) {

+            face = "MS UI Gothic";

+        } else {

+            if (face.Find("HGSGothicM") >= 0 || face.Find("HGMaruGothicMPRO") >= 0) {

+                face = "MS PGothic";

+            } else {

+                face = "MS Gothic";

+            }

+        }

+        return;

+    } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {

+        if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {

+            face = "MS PMincho";

+        } else {

+            face = "MS Mincho";

+        }

+        return;

+    }

+    if (_GetSubFontName(face, 0)) {

+        return;

+    }

+    if (!(picth_family & FF_ROMAN) && weight > 400) {

+        face = "MS PGothic";

+    } else {

+        face = "MS PMincho";

+    }

+}

+void* CWin32FontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)

+{

+    CFX_ByteString face = cstr_face;

+    int iBaseFont;

+    for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)

+        if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {

+            face = Base14Substs[iBaseFont].m_pWinName;

+            weight = Base14Substs[iBaseFont].m_bBold ? FW_BOLD : FW_NORMAL;

+            bItalic = Base14Substs[iBaseFont].m_bItalic;

+            bExact = TRUE;

+            break;

+        }

+    if (charset == ANSI_CHARSET || charset == SYMBOL_CHARSET) {

+        charset = DEFAULT_CHARSET;

+    }

+    int subst_pitch_family = pitch_family;

+    switch (charset) {

+        case SHIFTJIS_CHARSET:

+            subst_pitch_family = FF_ROMAN;

+            break;

+        case CHINESEBIG5_CHARSET:

+        case HANGUL_CHARSET:

+        case GB2312_CHARSET:

+            subst_pitch_family = 0;

+            break;

+    }

+    HFONT hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS,

+                                0, 0, subst_pitch_family, face);

+    char facebuf[100];

+    HFONT hOldFont = (HFONT)::SelectObject(m_hDC, hFont);

+    int ret = ::GetTextFaceA(m_hDC, 100, facebuf);

+    ::SelectObject(m_hDC, hOldFont);

+    if (face.EqualNoCase(facebuf)) {

+        return hFont;

+    }

+    int iCount = sizeof(VariantNames) / sizeof(VariantNames[0]);

+    for (int i = 0; i < iCount; ++i) {

+        if (face == VariantNames[i].m_pFaceName) {

+            CFX_WideString wsFace = CFX_WideString::FromLocal(facebuf);

+            CFX_WideString wsName = CFX_WideString::FromUTF16LE((const unsigned short*)VariantNames[i].m_pVariantName);

+            if (wsFace == wsName) {

+                return hFont;

+            }

+        }

+    }

+    ::DeleteObject(hFont);

+    if (charset == DEFAULT_CHARSET) {

+        return NULL;

+    }

+    switch (charset) {

+        case SHIFTJIS_CHARSET:

+            GetJapanesePreference(face, weight, pitch_family);

+            break;

+        case GB2312_CHARSET:

+            GetGBPreference(face, weight, pitch_family);

+            break;

+        case HANGUL_CHARSET:

+            face = "Gulim";

+            break;

+        case CHINESEBIG5_CHARSET:

+            if (face.Find("MSung") >= 0) {

+                face = "MingLiU";

+            } else {

+                face = "PMingLiU";

+            }

+            break;

+    }

+    hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS,

+                          0, 0, subst_pitch_family, face);

+    return hFont;

+}

+void CWin32FontInfo::DeleteFont(void* hFont)

+{

+    ::DeleteObject(hFont);

+}

+FX_DWORD CWin32FontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)

+{

+    HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);

+    table = FXDWORD_FROM_MSBFIRST(table);

+    size = ::GetFontData(m_hDC, table, 0, buffer, size);

+    ::SelectObject(m_hDC, hOldFont);

+    if (size == GDI_ERROR) {

+        return 0;

+    }

+    return size;

+}

+FX_BOOL CWin32FontInfo::GetFaceName(void* hFont, CFX_ByteString& name)

+{

+    char facebuf[100];

+    HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);

+    int ret = ::GetTextFaceA(m_hDC, 100, facebuf);

+    ::SelectObject(m_hDC, hOldFont);

+    if (ret == 0) {

+        return FALSE;

+    }

+    name = facebuf;

+    return TRUE;

+}

+FX_BOOL CWin32FontInfo::GetFontCharset(void* hFont, int& charset)

+{

+    TEXTMETRIC tm;

+    HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);

+    ::GetTextMetrics(m_hDC, &tm);

+    ::SelectObject(m_hDC, hOldFont);

+    charset = tm.tmCharSet;

+    return TRUE;

+}

+#ifndef _FPDFAPI_MINI_

+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()

+{

+    return FX_NEW CWin32FontInfo;

+}

+#endif

+void CFX_GEModule::InitPlatform()

+{

+    CWin32Platform* pPlatformData = FX_NEW CWin32Platform;

+    if (!pPlatformData) {

+        return;

+    }

+    OSVERSIONINFO ver;

+    ver.dwOSVersionInfoSize = sizeof(ver);

+    GetVersionEx(&ver);

+    pPlatformData->m_bHalfTone = ver.dwMajorVersion >= 5;

+    pPlatformData->m_GdiplusExt.Load();

+    m_pPlatformData = pPlatformData;

+    m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());

+}

+void CFX_GEModule::DestroyPlatform()

+{

+    if (m_pPlatformData) {

+        delete (CWin32Platform*)m_pPlatformData;

+    }

+    m_pPlatformData = NULL;

+}

+CGdiDeviceDriver::CGdiDeviceDriver(HDC hDC, int device_class)

+{

+    m_hDC = hDC;

+    m_DeviceClass = device_class;

+    CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();

+    SetStretchBltMode(hDC, pPlatform->m_bHalfTone ? HALFTONE : COLORONCOLOR);

+    if (GetObjectType(m_hDC) == OBJ_MEMDC) {

+        HBITMAP hBitmap = CreateBitmap(1, 1, 1, 1, NULL);

+        hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap);

+        BITMAP bitmap;

+        GetObject(hBitmap, sizeof bitmap, &bitmap);

+        m_nBitsPerPixel = bitmap.bmBitsPixel;

+        m_Width = bitmap.bmWidth;

+        m_Height = abs(bitmap.bmHeight);

+        hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap);

+        DeleteObject(hBitmap);

+    } else {

+        m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);

+        m_Width = ::GetDeviceCaps(m_hDC, HORZRES);

+        m_Height = ::GetDeviceCaps(m_hDC, VERTRES);

+    }

+    if (m_DeviceClass != FXDC_DISPLAY) {

+        m_RenderCaps = FXRC_BIT_MASK;

+    } else {

+        m_RenderCaps = FXRC_GET_BITS | FXRC_BIT_MASK;

+    }

+}

+int CGdiDeviceDriver::GetDeviceCaps(int caps_id)

+{

+    switch (caps_id) {

+        case FXDC_DEVICE_CLASS:

+            return m_DeviceClass;

+        case FXDC_PIXEL_WIDTH:

+            return m_Width;

+        case FXDC_PIXEL_HEIGHT:

+            return m_Height;

+        case FXDC_BITS_PIXEL:

+            return m_nBitsPerPixel;

+        case FXDC_RENDER_CAPS:

+            return m_RenderCaps;

+    }

+    return 0;

+}

+FX_LPVOID CGdiDeviceDriver::GetClipRgn()

+{

+    HRGN hClipRgn = CreateRectRgn(0, 0, 1, 1);

+    if (::GetClipRgn(m_hDC, hClipRgn) == 0) {

+        DeleteObject(hClipRgn);

+        hClipRgn = NULL;

+    }

+    return (FX_LPVOID)hClipRgn;

+}

+FX_BOOL CGdiDeviceDriver::GDI_SetDIBits(const CFX_DIBitmap* pBitmap1, const FX_RECT* pSrcRect, int left, int top, void* pIccTransform)

+{

+    if (m_DeviceClass == FXDC_PRINTER) {

+        CFX_DIBitmap* pBitmap = pBitmap1->FlipImage(FALSE, TRUE);

+        if (pBitmap == NULL) {

+            return FALSE;

+        }

+        if ((pBitmap->IsCmykImage() || pIccTransform) &&

+                !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) {

+            return FALSE;

+        }

+        int width = pSrcRect->Width(), height = pSrcRect->Height();

+        int pitch = pBitmap->GetPitch();

+        LPBYTE pBuffer = pBitmap->GetBuffer();

+        CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);

+        ((BITMAPINFOHEADER*)(FX_LPCSTR)info)->biHeight *= -1;

+        FX_RECT dst_rect(0, 0, width, height);

+        dst_rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());

+        int dst_width = dst_rect.Width();

+        int dst_height = dst_rect.Height();

+        ::StretchDIBits(m_hDC, left, top, dst_width, dst_height,

+                        0, 0, dst_width, dst_height, pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS, SRCCOPY);

+        delete pBitmap;

+    } else {

+        CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;

+        if ((pBitmap->IsCmykImage() || pIccTransform) &&

+                (pBitmap = pBitmap->CloneConvert(FXDIB_Rgb, NULL, pIccTransform)) == NULL) {

+            return FALSE;

+        }

+        int width = pSrcRect->Width(), height = pSrcRect->Height();

+        int pitch = pBitmap->GetPitch();

+        LPBYTE pBuffer = pBitmap->GetBuffer();

+        CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);

+        ::SetDIBitsToDevice(m_hDC, left, top, width, height, pSrcRect->left, pBitmap->GetHeight() - pSrcRect->bottom,

+                            0, pBitmap->GetHeight(), pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);

+        if (pBitmap != pBitmap1) {

+            delete pBitmap;

+        }

+    }

+    return TRUE;

+}

+FX_BOOL CGdiDeviceDriver::GDI_StretchDIBits(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top,

+        int dest_width, int dest_height, FX_DWORD flags, void* pIccTransform)

+{

+    CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;

+    if (pBitmap == NULL) {

+        return FALSE;

+    }

+    if ((pBitmap->IsCmykImage() || pIccTransform) &&

+            !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) {

+        return FALSE;

+    }

+    CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);

+    if (abs(dest_width) * abs(dest_height) < pBitmap1->GetWidth() * pBitmap1->GetHeight() * 4 ||

+            (flags & FXDIB_INTERPOL) || (flags & FXDIB_BICUBIC_INTERPOL)) {

+        SetStretchBltMode(m_hDC, HALFTONE);

+    } else {

+        SetStretchBltMode(m_hDC, COLORONCOLOR);

+    }

+    CFX_DIBitmap* pToStrechBitmap = pBitmap;

+    bool del = false;

+    if (m_DeviceClass == FXDC_PRINTER && (pBitmap->GetWidth() * pBitmap->GetHeight() > abs(dest_width) * abs(dest_height))) {

+        pToStrechBitmap = pBitmap->StretchTo(dest_width, dest_height);

+        del = true;

+    }

+    CFX_ByteString toStrechBitmapInfo = CFX_WindowsDIB::GetBitmapInfo(pToStrechBitmap);

+    ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,

+                    0, 0, pToStrechBitmap->GetWidth(), pToStrechBitmap->GetHeight(), pToStrechBitmap->GetBuffer(),

+                    (BITMAPINFO*)(FX_LPCSTR)toStrechBitmapInfo, DIB_RGB_COLORS, SRCCOPY);

+    if (del) {

+        delete pToStrechBitmap;

+    }

+    return TRUE;

+}

+FX_BOOL CGdiDeviceDriver::GDI_StretchBitMask(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top,

+        int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,

+        int alpha_flag, void* pIccTransform)

+{

+    CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;

+    if (pBitmap == NULL) {

+        return FALSE;

+    }

+    _Color2Argb(bitmap_color, bitmap_color, alpha_flag | (1 << 24), pIccTransform);

+    int width = pBitmap->GetWidth(), height = pBitmap->GetHeight();

+    struct {

+        BITMAPINFOHEADER	bmiHeader;

+        FX_DWORD			bmiColors[2];

+    } bmi;

+    FXSYS_memset32(&bmi.bmiHeader, 0, sizeof (BITMAPINFOHEADER));

+    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

+    bmi.bmiHeader.biBitCount = 1;

+    bmi.bmiHeader.biCompression = BI_RGB;

+    bmi.bmiHeader.biHeight = -height;

+    bmi.bmiHeader.biPlanes = 1;

+    bmi.bmiHeader.biWidth = width;

+    if (m_nBitsPerPixel != 1) {

+        SetStretchBltMode(m_hDC, HALFTONE);

+    }

+    bmi.bmiColors[0] = 0xffffff;

+    bmi.bmiColors[1] = 0;

+    ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,

+                    0, 0, width, height, pBitmap->GetBuffer(), (BITMAPINFO*)&bmi, DIB_RGB_COLORS, SRCAND);

+    return TRUE;

+}

+BOOL CGdiDeviceDriver::GetClipBox(FX_RECT* pRect)

+{

+    return ::GetClipBox(m_hDC, (RECT*)pRect);

+}

+FX_BOOL CGdiDeviceDriver::SetClipRgn(FX_LPVOID hRgn)

+{

+    ::SelectClipRgn(m_hDC, (HRGN)hRgn);

+    return TRUE;

+}

+static HPEN _CreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, FX_DWORD argb)

+{

+    FX_FLOAT width;

+    FX_FLOAT scale = 1.f;

+    if (pMatrix)

+        scale = FXSYS_fabs(pMatrix->a) > FXSYS_fabs(pMatrix->b) ?

+                FXSYS_fabs(pMatrix->a) : FXSYS_fabs(pMatrix->b);

+    if (pGraphState) {

+        width = scale * pGraphState->m_LineWidth;

+    } else {

+        width = 1.0f;

+    }

+    FX_DWORD PenStyle = PS_GEOMETRIC;

+    if (width < 1) {

+        width = 1;

+    }

+    if(pGraphState->m_DashCount) {

+        PenStyle |= PS_USERSTYLE;

+    } else {

+        PenStyle |= PS_SOLID;

+    }

+    switch(pGraphState->m_LineCap) {

+        case 0:

+            PenStyle |= PS_ENDCAP_FLAT;

+            break;

+        case 1:

+            PenStyle |= PS_ENDCAP_ROUND;

+            break;

+        case 2:

+            PenStyle |= PS_ENDCAP_SQUARE;

+            break;

+    }

+    switch(pGraphState->m_LineJoin) {

+        case 0:

+            PenStyle |= PS_JOIN_MITER;

+            break;

+        case 1:

+            PenStyle |= PS_JOIN_ROUND;

+            break;

+        case 2:

+            PenStyle |= PS_JOIN_BEVEL;

+            break;

+    }

+    int a;

+    FX_COLORREF rgb;

+    ArgbDecode(argb, a, rgb);

+    LOGBRUSH lb;

+    lb.lbColor = rgb;

+    lb.lbStyle = BS_SOLID;

+    lb.lbHatch = 0;

+    FX_DWORD* pDash = NULL;

+    if (pGraphState->m_DashCount) {

+        pDash = FX_Alloc(FX_DWORD, pGraphState->m_DashCount);

+        if (!pDash) {

+            return NULL;

+        }

+        for (int i = 0; i < pGraphState->m_DashCount; i ++) {

+            pDash[i] = FXSYS_round(pMatrix ? pMatrix->TransformDistance(pGraphState->m_DashArray[i]) : pGraphState->m_DashArray[i]);

+            if (pDash[i] < 1) {

+                pDash[i] = 1;

+            }

+        }

+    }

+    HPEN hPen = ExtCreatePen(PenStyle, (DWORD)FXSYS_ceil(width), &lb, pGraphState->m_DashCount, (const DWORD*)pDash);

+    if (pDash) {

+        FX_Free(pDash);

+    }

+    return hPen;

+}

+static HBRUSH _CreateBrush(FX_DWORD argb)

+{

+    int a;

+    FX_COLORREF rgb;

+    ArgbDecode(argb, a, rgb);

+    return CreateSolidBrush(rgb);

+}

+static void _SetPathToDC(HDC hDC, const CFX_PathData* pPathData, const CFX_AffineMatrix* pMatrix)

+{

+    BeginPath(hDC);

+    int nPoints = pPathData->GetPointCount();

+    FX_PATHPOINT* pPoints = pPathData->GetPoints();

+    for(int i = 0; i < nPoints; i++) {

+        FX_FLOAT posx = pPoints[i].m_PointX, posy = pPoints[i].m_PointY;

+        if (pMatrix) {

+            pMatrix->Transform(posx, posy);

+        }

+        int screen_x = FXSYS_round(posx), screen_y = FXSYS_round(posy);

+        int point_type = pPoints[i].m_Flag & FXPT_TYPE;

+        if(point_type == PT_MOVETO) {

+            MoveToEx(hDC, screen_x, screen_y, NULL);

+        } else if(point_type == PT_LINETO) {

+            if (pPoints[i].m_PointY == pPoints[i - 1].m_PointY && pPoints[i].m_PointX == pPoints[i - 1].m_PointX) {

+                screen_x ++;

+            }

+            LineTo(hDC, screen_x, screen_y);

+        } else if(point_type == PT_BEZIERTO) {

+            POINT lppt[3];

+            lppt[0].x = screen_x;

+            lppt[0].y = screen_y;

+            posx = pPoints[i + 1].m_PointX;

+            posy = pPoints[i + 1].m_PointY;

+            if (pMatrix) {

+                pMatrix->Transform(posx, posy);

+            }

+            lppt[1].x = FXSYS_round(posx);

+            lppt[1].y = FXSYS_round(posy);

+            posx = pPoints[i + 2].m_PointX;

+            posy = pPoints[i + 2].m_PointY;

+            if (pMatrix) {

+                pMatrix->Transform(posx, posy);

+            }

+            lppt[2].x = FXSYS_round(posx);

+            lppt[2].y = FXSYS_round(posy);

+            PolyBezierTo(hDC, lppt, 3);

+            i += 2;

+        }

+        if (pPoints[i].m_Flag & PT_CLOSEFIGURE) {

+            CloseFigure(hDC);

+        }

+    }

+    EndPath(hDC);

+}

+void CGdiDeviceDriver::DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)

+{

+    int flag1 = (x1 < 0) | ((x1 > m_Width) << 1) | ((y1 < 0) << 2) | ((y1 > m_Height) << 3);

+    int flag2 = (x2 < 0) | ((x2 > m_Width) << 1) | ((y2 < 0) << 2) | ((y2 > m_Height) << 3);

+    if (flag1 & flag2) {

+        return;

+    }

+    if (flag1 || flag2) {

+        agg::rect_base<FX_FLOAT> rect(0.0f, 0.0f, (FX_FLOAT)(m_Width), (FX_FLOAT)(m_Height));

+        FX_FLOAT x[2], y[2];

+        int np = agg::clip_liang_barsky<FX_FLOAT>(x1, y1, x2, y2, rect, x, y);

+        if (np == 0) {

+            return;

+        }

+        if (np == 1) {

+            x2 = x[0];

+            y2 = y[0];

+        } else {

+            x1 = x[0];

+            y1 = y[0];

+            x2 = x[np - 1];

+            y2 = y[np - 1];

+        }

+    }

+    MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL);

+    LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));

+}

+static FX_BOOL _MatrixNoScaled(const CFX_AffineMatrix* pMatrix)

+{

+    return pMatrix->GetA() == 1.0f && pMatrix->GetB() == 0 && pMatrix->GetC() == 0 && pMatrix->GetD() == 1.0f;

+}

+FX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData,

+                                   const CFX_AffineMatrix* pMatrix,

+                                   const CFX_GraphStateData* pGraphState,

+                                   FX_DWORD fill_color,

+                                   FX_DWORD stroke_color,

+                                   int fill_mode,

+                                   int alpha_flag,

+                                   void* pIccTransform,

+                                   int	blend_type

+                                  )

+{

+    if (blend_type != FXDIB_BLEND_NORMAL) {

+        return FALSE;

+    }

+    _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);

+    _Color2Argb(stroke_color, stroke_color, alpha_flag, pIccTransform);

+    CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();

+    if ((pGraphState == NULL || stroke_color == 0) && !pPlatform->m_GdiplusExt.IsAvailable()) {

+        CFX_FloatRect bbox_f = pPathData->GetBoundingBox();

+        if (pMatrix) {

+            bbox_f.Transform(pMatrix);

+        }

+        FX_RECT bbox = bbox_f.GetInnerRect();

+        if (bbox.Width() <= 0) {

+            return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.bottom + 1), fill_color,

+                                    alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);

+        } else if (bbox.Height() <= 0) {

+            return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.right + 1), (FX_FLOAT)(bbox.top), fill_color,

+                                    alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);

+        }

+    }

+    int fill_alpha = FXARGB_A(fill_color);

+    int stroke_alpha = FXARGB_A(stroke_color);

+    FX_BOOL bDrawAlpha = (fill_alpha > 0 && fill_alpha < 255) || (stroke_alpha > 0 && stroke_alpha < 255 && pGraphState);

+    if (!pPlatform->m_GdiplusExt.IsAvailable() && bDrawAlpha) {

+        return FALSE;

+    }

+    if (pPlatform->m_GdiplusExt.IsAvailable()) {

+        if (bDrawAlpha || ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) || pGraphState && pGraphState->m_DashCount)) {

+            if ( !((NULL == pMatrix || _MatrixNoScaled(pMatrix)) &&

+                    pGraphState && pGraphState->m_LineWidth == 1.f &&

+                    (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) &&

+                    pPathData->IsRect()) ) {

+                if (pPlatform->m_GdiplusExt.DrawPath(m_hDC, pPathData, pMatrix, pGraphState, fill_color, stroke_color, fill_mode)) {

+                    return TRUE;

+                }

+            }

+        }

+    }

+    int old_fill_mode = fill_mode;

+    fill_mode &= 3;

+    HPEN hPen = NULL;

+    HBRUSH hBrush = NULL;

+    if (pGraphState && stroke_alpha) {

+        SetMiterLimit(m_hDC, pGraphState->m_MiterLimit, NULL);

+        hPen = _CreatePen(pGraphState, pMatrix, stroke_color);

+        hPen = (HPEN)SelectObject(m_hDC, hPen);

+    }

+    if (fill_mode && fill_alpha) {

+        SetPolyFillMode(m_hDC, fill_mode);

+        hBrush = _CreateBrush(fill_color);

+        hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);

+    }

+    if (pPathData->GetPointCount() == 2 && pGraphState && pGraphState->m_DashCount) {

+        FX_FLOAT x1 = pPathData->GetPointX(0), y1 = pPathData->GetPointY(0);

+        if (pMatrix) {

+            pMatrix->Transform(x1, y1);

+        }

+        FX_FLOAT x2 = pPathData->GetPointX(1), y2 = pPathData->GetPointY(1);

+        if (pMatrix) {

+            pMatrix->Transform(x2, y2);

+        }

+        DrawLine(x1, y1, x2, y2);

+    } else {

+        _SetPathToDC(m_hDC, pPathData, pMatrix);

+        if (pGraphState && stroke_alpha) {

+            if (fill_mode && fill_alpha) {

+                if (old_fill_mode & FX_FILL_TEXT_MODE) {

+                    StrokeAndFillPath(m_hDC);

+                } else {

+                    FillPath(m_hDC);

+                    _SetPathToDC(m_hDC, pPathData, pMatrix);

+                    StrokePath(m_hDC);

+                }

+            } else {

+                StrokePath(m_hDC);

+            }

+        } else if (fill_mode && fill_alpha) {

+            FillPath(m_hDC);

+        }

+    }

+    if (hPen) {

+        hPen = (HPEN)SelectObject(m_hDC, hPen);

+        DeleteObject(hPen);

+    }

+    if (hBrush) {

+        hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);

+        DeleteObject(hBrush);

+    }

+    return TRUE;

+}

+FX_BOOL CGdiDeviceDriver::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)

+{

+    if (blend_type != FXDIB_BLEND_NORMAL) {

+        return FALSE;

+    }

+    _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);

+    int alpha;

+    FX_COLORREF rgb;

+    ArgbDecode(fill_color, alpha, rgb);

+    if (alpha == 0) {

+        return TRUE;

+    }

+    if (alpha < 255) {

+        return FALSE;

+    }

+    HBRUSH hBrush = CreateSolidBrush(rgb);

+    ::FillRect(m_hDC, (RECT*)pRect, hBrush);

+    DeleteObject(hBrush);

+    return TRUE;

+}

+FX_BOOL CGdiDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData,

+        const CFX_AffineMatrix* pMatrix,

+        int fill_mode

+                                          )

+{

+    if (pPathData->GetPointCount() == 5) {

+        CFX_FloatRect rectf;

+        if (pPathData->IsRect(pMatrix, &rectf)) {

+            FX_RECT rect = rectf.GetOutterRect();

+            IntersectClipRect(m_hDC, rect.left, rect.top, rect.right, rect.bottom);

+            return TRUE;

+        }

+    }

+    _SetPathToDC(m_hDC, pPathData, pMatrix);

+    SetPolyFillMode(m_hDC, fill_mode & 3);

+    SelectClipPath(m_hDC, RGN_AND);

+    return TRUE;

+}

+FX_BOOL CGdiDeviceDriver::SetClip_PathStroke(const CFX_PathData* pPathData,

+        const CFX_AffineMatrix* pMatrix,

+        const CFX_GraphStateData* pGraphState

+                                            )

+{

+    HPEN hPen = _CreatePen(pGraphState, pMatrix, 0xff000000);

+    hPen = (HPEN)SelectObject(m_hDC, hPen);

+    _SetPathToDC(m_hDC, pPathData, pMatrix);

+    WidenPath(m_hDC);

+    SetPolyFillMode(m_hDC, WINDING);

+    FX_BOOL ret = SelectClipPath(m_hDC, RGN_AND);

+    hPen = (HPEN)SelectObject(m_hDC, hPen);

+    DeleteObject(hPen);

+    return ret;

+}

+FX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,

+        int alpha_flag, void* pIccTransform, int	blend_type)

+{

+    if (blend_type != FXDIB_BLEND_NORMAL) {

+        return FALSE;

+    }

+    _Color2Argb(color, color, alpha_flag | (1 << 24), pIccTransform);

+    int a;

+    FX_COLORREF rgb;

+    ArgbDecode(color, a, rgb);

+    if (a == 0) {

+        return TRUE;

+    }

+    HPEN hPen = CreatePen(PS_SOLID, 1, rgb);

+    hPen = (HPEN)SelectObject(m_hDC, hPen);

+    MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL);

+    LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));

+    hPen = (HPEN)SelectObject(m_hDC, hPen);

+    DeleteObject(hPen);

+    return TRUE;

+}

+FX_BOOL CGdiDeviceDriver::DeleteDeviceRgn(FX_LPVOID pRgn)

+{

+    DeleteObject((HGDIOBJ)pRgn);

+    return TRUE;

+}

+CGdiDisplayDriver::CGdiDisplayDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_DISPLAY)

+{

+    CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();

+    if (pPlatform->m_GdiplusExt.IsAvailable()) {

+        m_RenderCaps |= FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE;

+    }

+}

+FX_BOOL CGdiDisplayDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform, FX_BOOL bDEdge)

+{

+    FX_BOOL ret = FALSE;

+    int width = pBitmap->GetWidth();

+    int height = pBitmap->GetHeight();

+    HBITMAP hbmp = CreateCompatibleBitmap(m_hDC, width, height);

+    HDC hDCMemory = CreateCompatibleDC(m_hDC);

+    HBITMAP holdbmp  = (HBITMAP)SelectObject(hDCMemory, hbmp);

+    BitBlt(hDCMemory, 0, 0, width, height, m_hDC, left, top, SRCCOPY);

+    SelectObject(hDCMemory, holdbmp);

+    BITMAPINFO bmi;

+    FXSYS_memset32(&bmi, 0, sizeof bmi);

+    bmi.bmiHeader.biSize = sizeof bmi.bmiHeader;

+    bmi.bmiHeader.biBitCount = pBitmap->GetBPP();

+    bmi.bmiHeader.biHeight = -height;

+    bmi.bmiHeader.biPlanes = 1;

+    bmi.bmiHeader.biWidth = width;

+    if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {

+        pIccTransform = NULL;

+    }

+    if (pBitmap->GetBPP() > 8 && !pBitmap->IsCmykImage() && pIccTransform == NULL) {

+        ret = ::GetDIBits(hDCMemory, hbmp, 0, height, pBitmap->GetBuffer(), &bmi, DIB_RGB_COLORS) == height;

+    } else {

+        CFX_DIBitmap bitmap;

+        if (bitmap.Create(width, height, FXDIB_Rgb)) {

+            bmi.bmiHeader.biBitCount = 24;

+            ::GetDIBits(hDCMemory, hbmp, 0, height, bitmap.GetBuffer(), &bmi, DIB_RGB_COLORS);

+            ret = pBitmap->TransferBitmap(0, 0, width, height, &bitmap, 0, 0, pIccTransform);

+        } else {

+            ret = FALSE;

+        }

+    }

+#ifndef _FPDFAPI_MINI_

+    if (pBitmap->HasAlpha() && ret) {

+        pBitmap->LoadChannel(FXDIB_Alpha, 0xff);

+    }

+#endif

+    DeleteObject(hbmp);

+    DeleteObject(hDCMemory);

+    return ret;

+}

+FX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,

+                                     int alpha_flag, void* pIccTransform)

+{

+    ASSERT(blend_type == FXDIB_BLEND_NORMAL);

+    if (pSource->IsAlphaMask()) {

+        int width = pSource->GetWidth(), height = pSource->GetHeight();

+        int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);

+        FX_BOOL bGDI = pSource->GetBPP() == 1 && alpha == 255;

+        if (!bGDI) {

+            CFX_DIBitmap background;

+            if (!background.Create(width, height, FXDIB_Rgb32) ||

+                    !GetDIBits(&background, left, top, NULL) ||

+                    !background.CompositeMask(0, 0, width, height, pSource, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {

+                return FALSE;

+            }

+            FX_RECT src_rect(0, 0, width, height);

+            return SetDIBits(&background, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL);

+        }

+        FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());

+        return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, width, height,

+                             &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);

+    } else {

+        int width = pSrcRect->Width(), height = pSrcRect->Height();

+        if (pSource->HasAlpha()) {

+            CFX_DIBitmap bitmap;

+            if (!bitmap.Create(width, height, FXDIB_Rgb) ||

+                    !GetDIBits(&bitmap, left, top, NULL) ||

+                    !bitmap.CompositeBitmap(0, 0, width, height, pSource, pSrcRect->left, pSrcRect->top, FXDIB_BLEND_NORMAL, NULL, FALSE, pIccTransform)) {

+                return FALSE;

+            }

+            FX_RECT src_rect(0, 0, width, height);

+            return SetDIBits(&bitmap, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL);

+        }

+        CFX_DIBExtractor temp(pSource);

+        CFX_DIBitmap* pBitmap = temp;

+        if (pBitmap) {

+            return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);

+        }

+    }

+    return FALSE;

+}

+FX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,

+        int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,

+        int alpha_flag, void* pIccTransform, int blend_type)

+{

+    FX_RECT bitmap_clip = *pClipRect;

+    if (dest_width < 0) {

+        dest_left += dest_width;

+    }

+    if (dest_height < 0) {

+        dest_top += dest_height;

+    }

+    bitmap_clip.Offset(-dest_left, -dest_top);

+    CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, render_flags, &bitmap_clip);

+    if (pStretched == NULL) {

+        return TRUE;

+    }

+    FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight());

+    FX_BOOL ret = SetDIBits(pStretched, color, &src_rect, pClipRect->left, pClipRect->top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);

+    delete pStretched;

+    return ret;

+}

+FX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,

+        int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,

+        int alpha_flag, void* pIccTransform, int blend_type)

+{

+    ASSERT(pSource != NULL && pClipRect != NULL);

+    if (flags || dest_width > 10000 || dest_width < -10000 || dest_height > 10000 || dest_height < -10000)

+        return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height,

+                                     pClipRect, flags, alpha_flag, pIccTransform, blend_type);

+    if (pSource->IsAlphaMask()) {

+        FX_RECT image_rect;

+        image_rect.left = dest_width > 0 ? dest_left : dest_left + dest_width;

+        image_rect.right = dest_width > 0 ? dest_left + dest_width : dest_left;

+        image_rect.top = dest_height > 0 ? dest_top : dest_top + dest_height;

+        image_rect.bottom = dest_height > 0 ? dest_top + dest_height : dest_top;

+        FX_RECT clip_rect = image_rect;

+        clip_rect.Intersect(*pClipRect);

+        clip_rect.Offset(-image_rect.left, -image_rect.top);

+        int clip_width = clip_rect.Width(), clip_height = clip_rect.Height();

+        CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, flags, &clip_rect);

+        if (pStretched == NULL) {

+            return TRUE;

+        }

+        CFX_DIBitmap background;

+        if (!background.Create(clip_width, clip_height, FXDIB_Rgb32) ||

+                !GetDIBits(&background, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, NULL) ||

+                !background.CompositeMask(0, 0, clip_width, clip_height, pStretched, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {

+            delete pStretched;

+            return FALSE;

+        }

+        FX_RECT src_rect(0, 0, clip_width, clip_height);

+        FX_BOOL ret = SetDIBits(&background, 0, &src_rect, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, FXDIB_BLEND_NORMAL, 0, NULL);

+        delete pStretched;

+        return ret;

+    } else {

+        if (pSource->HasAlpha()) {

+            CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();

+            if (pPlatform->m_GdiplusExt.IsAvailable() && pIccTransform == NULL && !pSource->IsCmykImage()) {

+                CFX_DIBExtractor temp(pSource);

+                CFX_DIBitmap* pBitmap = temp;

+                if (pBitmap == NULL) {

+                    return FALSE;

+                }

+                return pPlatform->m_GdiplusExt.StretchDIBits(m_hDC, pBitmap, dest_left, dest_top, dest_width, dest_height, pClipRect, flags);

+            }

+            return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height,

+                                         pClipRect, flags, alpha_flag, pIccTransform, blend_type);

+        }

+        CFX_DIBExtractor temp(pSource);

+        CFX_DIBitmap* pBitmap = temp;

+        if (pBitmap) {

+            return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);

+        }

+    }

+    return FALSE;

+}

+#define GET_PS_FEATURESETTING        4121

+#define FEATURESETTING_PSLEVEL       2

+int GetPSLevel(HDC hDC)

+{

+    int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);

+    if (device_type != DT_RASPRINTER) {

+        return 0;

+    }

+    FX_DWORD esc = GET_PS_FEATURESETTING;

+    if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {

+        int param = FEATURESETTING_PSLEVEL;

+        if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)&param, sizeof(int), (char*)&param) > 0) {

+            return param;

+        }

+    }

+    esc = POSTSCRIPT_IDENTIFY;

+    if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL) == 0) {

+        esc = POSTSCRIPT_DATA;

+        if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {

+            return 2;

+        }

+        return 0;

+    }

+    esc = PSIDENT_GDICENTRIC;

+    if (ExtEscape(hDC, POSTSCRIPT_IDENTIFY, sizeof(FX_DWORD), (char*)&esc, 0, NULL) <= 0) {

+        return 2;

+    }

+    esc = GET_PS_FEATURESETTING;

+    if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {

+        int param = FEATURESETTING_PSLEVEL;

+        if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)&param, sizeof(int), (char*)&param) > 0) {

+            return param;

+        }

+    }

+    return 2;

+}

+int CFX_WindowsDevice::m_psLevel = 2;

+CFX_WindowsDevice::CFX_WindowsDevice(HDC hDC, FX_BOOL bCmykOutput, FX_BOOL bForcePSOutput, int psLevel)

+{

+    m_bForcePSOutput = bForcePSOutput;

+    m_psLevel = psLevel;

+    if (bForcePSOutput) {

+        IFX_RenderDeviceDriver* pDriver = FX_NEW CPSPrinterDriver;

+        if (!pDriver) {

+            return;

+        }

+        ((CPSPrinterDriver*)pDriver)->Init(hDC, psLevel, bCmykOutput);

+        SetDeviceDriver(pDriver);

+        return;

+    }

+    SetDeviceDriver(CreateDriver(hDC, bCmykOutput));

+}

+HDC CFX_WindowsDevice::GetDC() const

+{

+    IFX_RenderDeviceDriver *pRDD = GetDeviceDriver();

+    if (!pRDD) {

+        return NULL;

+    }

+    return (HDC)pRDD->GetPlatformSurface();

+}

+IFX_RenderDeviceDriver* CFX_WindowsDevice::CreateDriver(HDC hDC, FX_BOOL bCmykOutput)

+{

+    int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);

+    int obj_type = ::GetObjectType(hDC);

+    int device_class;

+    if (device_type == DT_RASPRINTER || device_type == DT_PLOTTER || obj_type == OBJ_ENHMETADC) {

+        device_class = FXDC_PRINTER;

+    } else {

+        device_class = FXDC_DISPLAY;

+    }

+    return FX_NEW CGdiDisplayDriver(hDC);

+}

+CFX_WinBitmapDevice::CFX_WinBitmapDevice(int width, int height, FXDIB_Format format)

+{

+    BITMAPINFOHEADER bmih;

+    FXSYS_memset32(&bmih, 0, sizeof (BITMAPINFOHEADER));

+    bmih.biSize = sizeof(BITMAPINFOHEADER);

+    bmih.biBitCount = format & 0xff;

+    bmih.biHeight = -height;

+    bmih.biPlanes = 1;

+    bmih.biWidth = width;

+    FX_LPBYTE pBuffer;

+    m_hBitmap = CreateDIBSection(NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (FX_LPVOID*)&pBuffer, NULL, 0);

+    if (m_hBitmap == NULL) {

+        return;

+    }

+    CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;

+    if (!pBitmap) {

+        return;

+    }

+    pBitmap->Create(width, height, format, pBuffer);

+    SetBitmap(pBitmap);

+    m_hDC = ::CreateCompatibleDC(NULL);

+    m_hOldBitmap = (HBITMAP)SelectObject(m_hDC, m_hBitmap);

+    IFX_RenderDeviceDriver* pDriver = FX_NEW CGdiDisplayDriver(m_hDC);

+    if (!pDriver) {

+        return;

+    }

+    SetDeviceDriver(pDriver);

+}

+CFX_WinBitmapDevice::~CFX_WinBitmapDevice()

+{

+    if (m_hDC) {

+        SelectObject(m_hDC, m_hOldBitmap);

+        DeleteDC(m_hDC);

+    }

+    if (m_hBitmap) {

+        DeleteObject(m_hBitmap);

+    }

+    delete GetBitmap();

+}

+#endif

diff --git a/core/src/fxge/win32/fx_win32_dib.cpp b/core/src/fxge/win32/fx_win32_dib.cpp
new file mode 100644
index 0000000..a9cf78e
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_dib.cpp
@@ -0,0 +1,310 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#if _FX_OS_ == _FX_WIN32_DESKTOP_ ||  _FX_OS_ == _FX_WIN64_

+#include <windows.h>

+#include "../../../include/fxge/fx_ge_win32.h"

+#include "win32_int.h"

+CFX_ByteString CFX_WindowsDIB::GetBitmapInfo(const CFX_DIBitmap* pBitmap)

+{

+    CFX_ByteString result;

+    int len = sizeof (BITMAPINFOHEADER);

+    if (pBitmap->GetBPP() == 1 || pBitmap->GetBPP() == 8) {

+        len += sizeof (DWORD) * (int)(1 << pBitmap->GetBPP());

+    }

+    BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)result.GetBuffer(len);

+    FXSYS_memset32(pbmih, 0, sizeof (BITMAPINFOHEADER));

+    pbmih->biSize = sizeof(BITMAPINFOHEADER);

+    pbmih->biBitCount = pBitmap->GetBPP();

+    pbmih->biCompression = BI_RGB;

+    pbmih->biHeight = -(int)pBitmap->GetHeight();

+    pbmih->biPlanes = 1;

+    pbmih->biWidth = pBitmap->GetWidth();

+    if (pBitmap->GetBPP() == 8) {

+        FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);

+        if (pBitmap->GetPalette() == NULL) {

+            for (int i = 0; i < 256; i ++) {

+                pPalette[i] = i * 0x010101;

+            }

+        } else {

+            for (int i = 0; i < 256; i ++) {

+                pPalette[i] = pBitmap->GetPalette()[i];

+            }

+        }

+    }

+    if (pBitmap->GetBPP() == 1) {

+        FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);

+        if (pBitmap->GetPalette() == NULL) {

+            pPalette[0] = 0;

+            pPalette[1] = 0xffffff;

+        } else {

+            pPalette[0] = pBitmap->GetPalette()[0];

+            pPalette[1] = pBitmap->GetPalette()[1];

+        }

+    }

+    result.ReleaseBuffer(len);

+    return result;

+}

+CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha)

+{

+    int width = pbmi->bmiHeader.biWidth;

+    int height = pbmi->bmiHeader.biHeight;

+    BOOL bBottomUp = TRUE;

+    if (height < 0) {

+        height = -height;

+        bBottomUp = FALSE;

+    }

+    int pitch = (width * pbmi->bmiHeader.biBitCount + 31) / 32 * 4;

+    CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;

+    if (!pBitmap) {

+        return NULL;

+    }

+    FXDIB_Format format = bAlpha ? (FXDIB_Format)(pbmi->bmiHeader.biBitCount + 0x200) : (FXDIB_Format)pbmi->bmiHeader.biBitCount;

+    FX_BOOL ret = pBitmap->Create(width, height, format);

+    if (!ret) {

+        delete pBitmap;

+        return NULL;

+    }

+    FXSYS_memcpy32(pBitmap->GetBuffer(), pData, pitch * height);

+    if (bBottomUp) {

+        FX_LPBYTE temp_buf = FX_Alloc(FX_BYTE, pitch);

+        if (!temp_buf) {

+            if (pBitmap) {

+                delete pBitmap;

+            }

+            return NULL;

+        }

+        int top = 0, bottom = height - 1;

+        while (top < bottom) {

+            FXSYS_memcpy32(temp_buf, pBitmap->GetBuffer() + top * pitch, pitch);

+            FXSYS_memcpy32(pBitmap->GetBuffer() + top * pitch, pBitmap->GetBuffer() + bottom * pitch, pitch);

+            FXSYS_memcpy32(pBitmap->GetBuffer() + bottom * pitch, temp_buf, pitch);

+            top ++;

+            bottom --;

+        }

+        FX_Free(temp_buf);

+        temp_buf = NULL;

+    }

+    if (pbmi->bmiHeader.biBitCount == 1) {

+        for (int i = 0; i < 2; i ++) {

+            pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);

+        }

+    } else if (pbmi->bmiHeader.biBitCount == 8) {

+        for (int i = 0; i < 256; i ++) {

+            pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);

+        }

+    }

+    return pBitmap;

+}

+CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData)

+{

+    return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE);

+}

+HBITMAP	CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC)

+{

+    CFX_ByteString info = GetBitmapInfo(pBitmap);

+    HBITMAP hBitmap = NULL;

+    hBitmap = CreateDIBitmap(hDC, (BITMAPINFOHEADER*)(FX_LPCSTR)info, CBM_INIT,

+                             pBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);

+    return hBitmap;

+}

+void GetBitmapSize(HBITMAP hBitmap, int& w, int& h)

+{

+    BITMAP bmp;

+    GetObject(hBitmap, sizeof bmp, &bmp);

+    w = bmp.bmWidth;

+    h = bmp.bmHeight;

+}

+CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(FX_LPCWSTR filename)

+{

+    CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();

+    if (pPlatform->m_GdiplusExt.IsAvailable()) {

+        WINDIB_Open_Args_ args;

+        args.flags = WINDIB_OPEN_PATHNAME;

+        args.path_name = filename;

+        return pPlatform->m_GdiplusExt.LoadDIBitmap(args);

+    }

+    HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

+    if (hBitmap == NULL) {

+        return NULL;

+    }

+    HDC hDC = CreateCompatibleDC(NULL);

+    int width, height;

+    GetBitmapSize(hBitmap, width, height);

+    CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;

+    if (!pDIBitmap) {

+        DeleteDC(hDC);

+        return NULL;

+    }

+    if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {

+        delete pDIBitmap;

+        DeleteDC(hDC);

+        return NULL;

+    }

+    CFX_ByteString info = GetBitmapInfo(pDIBitmap);

+    int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);

+    if (!ret) {

+        if (pDIBitmap) {

+            delete pDIBitmap;

+        }

+        pDIBitmap = NULL;

+    }

+    DeleteDC(hDC);

+    return pDIBitmap;

+}

+CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args)

+{

+    CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();

+    if (pPlatform->m_GdiplusExt.IsAvailable()) {

+        return pPlatform->m_GdiplusExt.LoadDIBitmap(args);

+    } else if (args.flags == WINDIB_OPEN_MEMORY) {

+        return NULL;

+    }

+    HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)args.path_name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

+    if (hBitmap == NULL) {

+        return NULL;

+    }

+    HDC hDC = CreateCompatibleDC(NULL);

+    int width, height;

+    GetBitmapSize(hBitmap, width, height);

+    CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;

+    if (!pDIBitmap) {

+        DeleteDC(hDC);

+        return NULL;

+    }

+    if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {

+        delete pDIBitmap;

+        DeleteDC(hDC);

+        return NULL;

+    }

+    CFX_ByteString info = GetBitmapInfo(pDIBitmap);

+    int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);

+    if (!ret) {

+        if (pDIBitmap) {

+            delete pDIBitmap;

+        }

+        pDIBitmap = NULL;

+    }

+    DeleteDC(hDC);

+    return pDIBitmap;

+}

+CFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC, HBITMAP hBitmap, FX_DWORD* pPalette, FX_DWORD palsize)

+{

+    FX_BOOL bCreatedDC = hDC == NULL;

+    if (hDC == NULL) {

+        hDC = CreateCompatibleDC(NULL);

+    }

+    BITMAPINFOHEADER bmih;

+    FXSYS_memset32(&bmih, 0, sizeof bmih);

+    bmih.biSize = sizeof bmih;

+    GetDIBits(hDC, hBitmap, 0, 0, NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS);

+    int width = bmih.biWidth;

+    int height = abs(bmih.biHeight);

+    bmih.biHeight = -height;

+    bmih.biCompression = BI_RGB;

+    CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;

+    if (!pDIBitmap) {

+        return NULL;

+    }

+    int ret = 0;

+    if (bmih.biBitCount == 1 || bmih.biBitCount == 8) {

+        int size = sizeof (BITMAPINFOHEADER) + 8;

+        if (bmih.biBitCount == 8) {

+            size += sizeof (FX_DWORD) * 254;

+        }

+        BITMAPINFO* pbmih = (BITMAPINFO*)FX_Alloc(FX_BYTE, size);

+        if (!pbmih) {

+            delete pDIBitmap;

+            if (bCreatedDC) {

+                DeleteDC(hDC);

+            }

+            return NULL;

+        }

+        FXSYS_memset32(pbmih, 0, sizeof (BITMAPINFOHEADER));

+        pbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

+        pbmih->bmiHeader.biBitCount = bmih.biBitCount;

+        pbmih->bmiHeader.biCompression = BI_RGB;

+        pbmih->bmiHeader.biHeight = -height;

+        pbmih->bmiHeader.biPlanes = 1;

+        pbmih->bmiHeader.biWidth = bmih.biWidth;

+        if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 1 ? FXDIB_1bppRgb : FXDIB_8bppRgb)) {

+            delete pDIBitmap;

+            FX_Free(pbmih);

+            if (bCreatedDC) {

+                DeleteDC(hDC);

+            }

+            return NULL;

+        }

+        ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)pbmih, DIB_RGB_COLORS);

+        FX_Free(pbmih);

+        pbmih = NULL;

+        pDIBitmap->CopyPalette(pPalette, palsize);

+    } else {

+        if (bmih.biBitCount <= 24) {

+            bmih.biBitCount = 24;

+        } else {

+            bmih.biBitCount = 32;

+        }

+        if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 24 ? FXDIB_Rgb : FXDIB_Rgb32)) {

+            delete pDIBitmap;

+            if (bCreatedDC) {

+                DeleteDC(hDC);

+            }

+            return NULL;

+        }

+        ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)&bmih, DIB_RGB_COLORS);

+        if (ret != 0 && bmih.biBitCount == 32) {

+            int pitch = pDIBitmap->GetPitch();

+            for (int row = 0; row < height; row ++) {

+                FX_BYTE* dest_scan = (FX_BYTE*)(pDIBitmap->GetBuffer() + row * pitch);

+                for (int col = 0; col < width; col++) {

+                    dest_scan[3] = 255;

+                    dest_scan += 4;

+                }

+            }

+        }

+    }

+    if (ret == 0) {

+        if (pDIBitmap) {

+            delete pDIBitmap;

+        }

+        pDIBitmap = NULL;

+    }

+    if (bCreatedDC) {

+        DeleteDC(hDC);

+    }

+    return pDIBitmap;

+}

+CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height)

+{

+    Create(width, height, FXDIB_Rgb, (FX_LPBYTE)1);

+    BITMAPINFOHEADER bmih;

+    FXSYS_memset32(&bmih, 0, sizeof bmih);

+    bmih.biSize = sizeof bmih;

+    bmih.biBitCount = 24;

+    bmih.biHeight = -height;

+    bmih.biPlanes = 1;

+    bmih.biWidth = width;

+    m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (LPVOID*)&m_pBuffer, NULL, 0);

+    m_hMemDC = CreateCompatibleDC(hDC);

+    m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);

+}

+CFX_WindowsDIB::~CFX_WindowsDIB()

+{

+    SelectObject(m_hMemDC, m_hOldBitmap);

+    DeleteDC(m_hMemDC);

+    DeleteObject(m_hBitmap);

+}

+void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top)

+{

+    ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY);

+}

+void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top)

+{

+    ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY);

+}

+#endif

diff --git a/core/src/fxge/win32/fx_win32_dwrite.cpp b/core/src/fxge/win32/fx_win32_dwrite.cpp
new file mode 100644
index 0000000..d4c9620
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_dwrite.cpp
@@ -0,0 +1,480 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_

+#include "../../../include/fxge/fx_ge_win32.h"

+#include "dwrite_int.h"

+#include "../Microsoft SDK/include/DWrite.h"

+typedef HRESULT  (__stdcall *FuncType_DWriteCreateFactory)(__in DWRITE_FACTORY_TYPE, __in REFIID, __out IUnknown **);

+template <typename InterfaceType>

+inline void SafeRelease(InterfaceType** currentObject)

+{

+    if (*currentObject != NULL) {

+        (*currentObject)->Release();

+        *currentObject = NULL;

+    }

+}

+template <typename InterfaceType>

+inline InterfaceType* SafeAcquire(InterfaceType* newObject)

+{

+    if (newObject != NULL) {

+        newObject->AddRef();

+    }

+    return newObject;

+}

+class CDwFontFileStream : public IDWriteFontFileStream, public CFX_Object

+{

+public:

+    explicit CDwFontFileStream(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize);

+    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);

+    virtual ULONG   STDMETHODCALLTYPE AddRef();

+    virtual ULONG   STDMETHODCALLTYPE Release();

+    virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(void const** fragmentStart, UINT64 fileOffset, UINT64 fragmentSize, OUT void** fragmentContext);

+    virtual void    STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext);

+    virtual HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize);

+    virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64* lastWriteTime);

+    bool IsInitialized()

+    {

+        return resourcePtr_ != NULL;

+    }

+private:

+    ULONG refCount_;

+    void const* resourcePtr_;

+    DWORD resourceSize_;

+};

+class CDwFontFileLoader : public IDWriteFontFileLoader, public CFX_Object

+{

+public:

+    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);

+    virtual ULONG STDMETHODCALLTYPE AddRef();

+    virtual ULONG STDMETHODCALLTYPE Release();

+    virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize, OUT IDWriteFontFileStream** fontFileStream);

+

+    static IDWriteFontFileLoader* GetLoader()

+    {

+        if (instance_ == NULL) {

+            instance_ = FX_NEW CDwFontFileLoader();

+            return instance_;

+        }

+        return instance_;

+    }

+    static bool IsLoaderInitialized()

+    {

+        return instance_ != NULL;

+    }

+private:

+    CDwFontFileLoader();

+    ULONG refCount_;

+    static IDWriteFontFileLoader* instance_;

+};

+class CDwFontContext : public CFX_Object

+{

+public:

+    CDwFontContext(IDWriteFactory* dwriteFactory);

+    ~CDwFontContext();

+    HRESULT Initialize();

+private:

+    CDwFontContext(CDwFontContext const&);

+    void operator=(CDwFontContext const&);

+    HRESULT hr_;

+    IDWriteFactory* dwriteFactory_;

+};

+class CDwGdiTextRenderer : public CFX_Object

+{

+public:

+    CDwGdiTextRenderer(

+        CFX_DIBitmap* pBitmap,

+        IDWriteBitmapRenderTarget* bitmapRenderTarget,

+        IDWriteRenderingParams* renderingParams

+    );

+    CDwGdiTextRenderer::~CDwGdiTextRenderer();

+    HRESULT STDMETHODCALLTYPE DrawGlyphRun(

+        const FX_RECT& text_bbox,

+        __in_opt CFX_ClipRgn* pClipRgn,

+        __in_opt DWRITE_MATRIX const* pMatrix,

+        FLOAT baselineOriginX,

+        FLOAT baselineOriginY,

+        DWRITE_MEASURING_MODE measuringMode,

+        __in DWRITE_GLYPH_RUN const* glyphRun,

+        const COLORREF& textColor

+    );

+private:

+    CFX_DIBitmap* pBitmap_;

+    IDWriteBitmapRenderTarget* pRenderTarget_;

+    IDWriteRenderingParams* pRenderingParams_;

+};

+CDWriteExt::CDWriteExt()

+{

+    m_hModule = NULL;

+    m_pDWriteFactory = NULL;

+    m_pDwFontContext = NULL;

+    m_pDwTextRenderer = NULL;

+}

+void CDWriteExt::Load()

+{

+}

+void CDWriteExt::Unload()

+{

+    if (m_pDwFontContext) {

+        delete (CDwFontContext*)m_pDwFontContext;

+        m_pDwFontContext = NULL;

+    }

+    SafeRelease((IDWriteFactory**)&m_pDWriteFactory);

+}

+CDWriteExt::~CDWriteExt()

+{

+    Unload();

+}

+LPVOID	CDWriteExt::DwCreateFontFaceFromStream(FX_LPBYTE pData, FX_DWORD size, int simulation_style)

+{

+    IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;

+    IDWriteFontFile* pDwFontFile = NULL;

+    IDWriteFontFace* pDwFontFace = NULL;

+    BOOL isSupportedFontType = FALSE;

+    DWRITE_FONT_FILE_TYPE fontFileType;

+    DWRITE_FONT_FACE_TYPE fontFaceType;

+    UINT32 numberOfFaces;

+    DWRITE_FONT_SIMULATIONS fontStyle = (DWRITE_FONT_SIMULATIONS)(simulation_style & 3);

+    HRESULT hr = S_OK;

+    hr = pDwFactory->CreateCustomFontFileReference(

+             (void const*)pData,

+             (UINT32)size,

+             CDwFontFileLoader::GetLoader(),

+             &pDwFontFile

+         );

+    if (FAILED(hr)) {

+        goto failed;

+    }

+    hr = pDwFontFile->Analyze(

+             &isSupportedFontType,

+             &fontFileType,

+             &fontFaceType,

+             &numberOfFaces

+         );

+    if (FAILED(hr) || !isSupportedFontType || fontFaceType == DWRITE_FONT_FACE_TYPE_UNKNOWN) {

+        goto failed;

+    }

+    hr = pDwFactory->CreateFontFace(

+             fontFaceType,

+             1,

+             &pDwFontFile,

+             0,

+             fontStyle,

+             &pDwFontFace

+         );

+    if (FAILED(hr)) {

+        goto failed;

+    }

+    SafeRelease(&pDwFontFile);

+    return pDwFontFace;

+failed:

+    SafeRelease(&pDwFontFile);

+    return NULL;

+}

+FX_BOOL CDWriteExt::DwCreateRenderingTarget(CFX_DIBitmap* pBitmap, void** renderTarget)

+{

+    if (pBitmap->GetFormat() > FXDIB_Argb) {

+        return FALSE;

+    }

+    IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;

+    IDWriteGdiInterop* pGdiInterop = NULL;

+    IDWriteBitmapRenderTarget* pBitmapRenderTarget = NULL;

+    IDWriteRenderingParams* pRenderingParams = NULL;

+    HRESULT hr = S_OK;

+    hr = pDwFactory->GetGdiInterop(&pGdiInterop);

+    if (FAILED(hr)) {

+        goto failed;

+    }

+    hr = pGdiInterop->CreateBitmapRenderTarget(NULL, pBitmap->GetWidth(), pBitmap->GetHeight(),

+            &pBitmapRenderTarget);

+    if (FAILED(hr)) {

+        goto failed;

+    }

+    hr = pDwFactory->CreateCustomRenderingParams(

+             1.0f,

+             0.0f,

+             1.0f,

+             DWRITE_PIXEL_GEOMETRY_RGB,

+             DWRITE_RENDERING_MODE_DEFAULT,

+             &pRenderingParams

+         );

+    if (FAILED(hr)) {

+        goto failed;

+    }

+    hr = pBitmapRenderTarget->SetPixelsPerDip(1.0f);

+    if (FAILED(hr)) {

+        goto failed;

+    }

+    *(CDwGdiTextRenderer**)renderTarget = FX_NEW CDwGdiTextRenderer(pBitmap, pBitmapRenderTarget, pRenderingParams);

+    if (*(CDwGdiTextRenderer**)renderTarget == NULL) {

+        goto failed;

+    }

+    SafeRelease(&pGdiInterop);

+    SafeRelease(&pBitmapRenderTarget);

+    SafeRelease(&pRenderingParams);

+    return TRUE;

+failed:

+    SafeRelease(&pGdiInterop);

+    SafeRelease(&pBitmapRenderTarget);

+    SafeRelease(&pRenderingParams);

+    return FALSE;

+}

+FX_BOOL	CDWriteExt::DwRendingString(void* renderTarget, CFX_ClipRgn* pClipRgn, FX_RECT& stringRect, CFX_AffineMatrix* pMatrix,

+                                    void *font, FX_FLOAT font_size, FX_ARGB text_color,

+                                    int glyph_count, unsigned short* glyph_indices,

+                                    FX_FLOAT baselineOriginX, FX_FLOAT baselineOriginY,

+                                    void* glyph_offsets,

+                                    FX_FLOAT* glyph_advances)

+{

+    if (renderTarget == NULL) {

+        return TRUE;

+    }

+    CDwGdiTextRenderer* pTextRenderer = (CDwGdiTextRenderer*)renderTarget;

+    DWRITE_MATRIX transform;

+    DWRITE_GLYPH_RUN glyphRun;

+    HRESULT hr = S_OK;

+    if (pMatrix) {

+        transform.m11 = pMatrix->a;

+        transform.m12 = pMatrix->b;

+        transform.m21 = pMatrix->c;

+        transform.m22 = pMatrix->d;

+        transform.dx = pMatrix->e;

+        transform.dy = pMatrix->f;

+    }

+    glyphRun.fontFace = (IDWriteFontFace*)font;

+    glyphRun.fontEmSize = font_size;

+    glyphRun.glyphCount = glyph_count;

+    glyphRun.glyphIndices = glyph_indices;

+    glyphRun.glyphAdvances = glyph_advances;

+    glyphRun.glyphOffsets = (DWRITE_GLYPH_OFFSET*)glyph_offsets;

+    glyphRun.isSideways = FALSE;

+    glyphRun.bidiLevel = 0;

+    hr = pTextRenderer->DrawGlyphRun(

+             stringRect,

+             pClipRgn,

+             pMatrix ? &transform : NULL,

+             baselineOriginX, baselineOriginY,

+             DWRITE_MEASURING_MODE_NATURAL,

+             &glyphRun,

+             RGB(FXARGB_R(text_color), FXARGB_G(text_color), FXARGB_B(text_color))

+         );

+    return SUCCEEDED(hr) ? TRUE : FALSE;

+}

+void CDWriteExt::DwDeleteRenderingTarget(void* renderTarget)

+{

+    if (renderTarget) {

+        delete (CDwGdiTextRenderer*)renderTarget;

+    }

+}

+void CDWriteExt::DwDeleteFont(void* pFont)

+{

+    if (pFont) {

+        SafeRelease((IDWriteFontFace**)&pFont);

+    }

+}

+CDwFontFileStream::CDwFontFileStream(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize)

+{

+    refCount_ = 0;

+    resourcePtr_ = fontFileReferenceKey;

+    resourceSize_ = fontFileReferenceKeySize;

+}

+HRESULT STDMETHODCALLTYPE CDwFontFileStream::QueryInterface(REFIID iid, void** ppvObject)

+{

+    if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) {

+        *ppvObject = this;

+        AddRef();

+        return S_OK;

+    } else {

+        *ppvObject = NULL;

+        return E_NOINTERFACE;

+    }

+}

+ULONG STDMETHODCALLTYPE CDwFontFileStream::AddRef()

+{

+    return InterlockedIncrement((long*)(&refCount_));

+}

+ULONG STDMETHODCALLTYPE CDwFontFileStream::Release()

+{

+    ULONG newCount = InterlockedDecrement((long*)(&refCount_));

+    if (newCount == 0) {

+        delete this;

+    }

+    return newCount;

+}

+HRESULT STDMETHODCALLTYPE CDwFontFileStream::ReadFileFragment(

+    void const** fragmentStart,

+    UINT64 fileOffset,

+    UINT64 fragmentSize,

+    OUT void** fragmentContext

+)

+{

+    if (fileOffset <= resourceSize_ &&

+            fragmentSize <= resourceSize_ - fileOffset) {

+        *fragmentStart = static_cast<FX_BYTE const*>(resourcePtr_) + static_cast<size_t>(fileOffset);

+        *fragmentContext = NULL;

+        return S_OK;

+    } else {

+        *fragmentStart = NULL;

+        *fragmentContext = NULL;

+        return E_FAIL;

+    }

+}

+void STDMETHODCALLTYPE CDwFontFileStream::ReleaseFileFragment(void* fragmentContext)

+{

+}

+HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetFileSize(OUT UINT64* fileSize)

+{

+    *fileSize = resourceSize_;

+    return S_OK;

+}

+HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetLastWriteTime(OUT UINT64* lastWriteTime)

+{

+    *lastWriteTime = 0;

+    return E_NOTIMPL;

+}

+IDWriteFontFileLoader* CDwFontFileLoader::instance_ = NULL;

+CDwFontFileLoader::CDwFontFileLoader() :

+    refCount_(0)

+{

+}

+HRESULT STDMETHODCALLTYPE CDwFontFileLoader::QueryInterface(REFIID iid, void** ppvObject)

+{

+    if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) {

+        *ppvObject = this;

+        AddRef();

+        return S_OK;

+    } else {

+        *ppvObject = NULL;

+        return E_NOINTERFACE;

+    }

+}

+ULONG STDMETHODCALLTYPE CDwFontFileLoader::AddRef()

+{

+    return InterlockedIncrement((long*)(&refCount_));

+}

+ULONG STDMETHODCALLTYPE CDwFontFileLoader::Release()

+{

+    ULONG newCount = InterlockedDecrement((long*)(&refCount_));

+    if (newCount == 0) {

+        instance_ = NULL;

+        delete this;

+    }

+    return newCount;

+}

+HRESULT STDMETHODCALLTYPE CDwFontFileLoader::CreateStreamFromKey(

+    void const* fontFileReferenceKey,

+    UINT32 fontFileReferenceKeySize,

+    OUT IDWriteFontFileStream** fontFileStream

+)

+{

+    *fontFileStream = NULL;

+    CDwFontFileStream* stream = FX_NEW CDwFontFileStream(fontFileReferenceKey, fontFileReferenceKeySize);

+    if (stream == NULL)	{

+        return E_OUTOFMEMORY;

+    }

+    if (!stream->IsInitialized()) {

+        delete stream;

+        return E_FAIL;

+    }

+    *fontFileStream = SafeAcquire(stream);

+    return S_OK;

+}

+CDwFontContext::CDwFontContext(IDWriteFactory* dwriteFactory) :

+    hr_(S_FALSE),

+    dwriteFactory_(SafeAcquire(dwriteFactory))

+{

+}

+CDwFontContext::~CDwFontContext()

+{

+    if(dwriteFactory_ && hr_ == S_OK) {

+        dwriteFactory_->UnregisterFontFileLoader(CDwFontFileLoader::GetLoader());

+    }

+    SafeRelease(&dwriteFactory_);

+}

+HRESULT CDwFontContext::Initialize()

+{

+    if (hr_ == S_FALSE) {

+        return hr_ = dwriteFactory_->RegisterFontFileLoader(CDwFontFileLoader::GetLoader());

+    }

+    return hr_;

+}

+CDwGdiTextRenderer::CDwGdiTextRenderer(CFX_DIBitmap* pBitmap, IDWriteBitmapRenderTarget* bitmapRenderTarget, IDWriteRenderingParams* renderingParams):

+    pBitmap_(pBitmap),

+    pRenderTarget_(SafeAcquire(bitmapRenderTarget)),

+    pRenderingParams_(SafeAcquire(renderingParams))

+{

+}

+CDwGdiTextRenderer::~CDwGdiTextRenderer()

+{

+    SafeRelease(&pRenderTarget_);

+    SafeRelease(&pRenderingParams_);

+}

+STDMETHODIMP CDwGdiTextRenderer::DrawGlyphRun(

+    const FX_RECT& text_bbox,

+    __in_opt CFX_ClipRgn* pClipRgn,

+    __in_opt DWRITE_MATRIX const* pMatrix,

+    FLOAT baselineOriginX,

+    FLOAT baselineOriginY,

+    DWRITE_MEASURING_MODE measuringMode,

+    __in DWRITE_GLYPH_RUN const* glyphRun,

+    const COLORREF& textColor

+)

+{

+    HRESULT hr = S_OK;

+    if (pMatrix) {

+        hr = pRenderTarget_->SetCurrentTransform(pMatrix);

+        if (FAILED(hr)) {

+            return hr;

+        }

+    }

+    HDC hDC = pRenderTarget_->GetMemoryDC();

+    HBITMAP hBitmap = (HBITMAP)::GetCurrentObject(hDC, OBJ_BITMAP);

+    BITMAP bitmap;

+    GetObject(hBitmap, sizeof bitmap, &bitmap);

+    CFX_DIBitmap dib;

+    dib.Create(

+        bitmap.bmWidth,

+        bitmap.bmHeight,

+        bitmap.bmBitsPixel == 24 ? FXDIB_Rgb : FXDIB_Rgb32,

+        (FX_LPBYTE)bitmap.bmBits

+    );

+    dib.CompositeBitmap(

+        text_bbox.left,

+        text_bbox.top,

+        text_bbox.Width(),

+        text_bbox.Height(),

+        pBitmap_,

+        text_bbox.left,

+        text_bbox.top,

+        FXDIB_BLEND_NORMAL,

+        NULL

+    );

+    hr = pRenderTarget_->DrawGlyphRun(

+             baselineOriginX,

+             baselineOriginY,

+             measuringMode,

+             glyphRun,

+             pRenderingParams_,

+             textColor

+         );

+    if (FAILED(hr)) {

+        return hr;

+    }

+    pBitmap_->CompositeBitmap(

+        text_bbox.left,

+        text_bbox.top,

+        text_bbox.Width(),

+        text_bbox.Height(),

+        &dib,

+        text_bbox.left,

+        text_bbox.top,

+        FXDIB_BLEND_NORMAL,

+        pClipRgn

+    );

+    return hr;

+}

+#endif

diff --git a/core/src/fxge/win32/fx_win32_gdipext.cpp b/core/src/fxge/win32/fx_win32_gdipext.cpp
new file mode 100644
index 0000000..7f92406
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_gdipext.cpp
@@ -0,0 +1,1286 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_

+#include <windows.h>

+#include "../../../include/fxge/fx_ge_win32.h"

+#include "win32_int.h"

+#include "../Microsoft SDK/include/GdiPlus.h"

+using namespace Gdiplus;

+using namespace Gdiplus::DllExports;

+#define GdiFillType2Gdip(fill_type) (fill_type == ALTERNATE ? FillModeAlternate : FillModeWinding)

+static CombineMode GdiCombineMode2Gdip(int mode)

+{

+    switch (mode) {

+        case RGN_AND:

+            return CombineModeIntersect;

+    }

+    return CombineModeIntersect;

+}

+enum {

+    FuncId_GdipCreatePath2,

+    FuncId_GdipSetPenDashStyle,

+    FuncId_GdipSetPenDashArray,

+    FuncId_GdipSetPenDashCap197819,

+    FuncId_GdipSetPenLineJoin,

+    FuncId_GdipSetPenWidth,

+    FuncId_GdipCreateFromHDC,

+    FuncId_GdipSetPageUnit,

+    FuncId_GdipSetSmoothingMode,

+    FuncId_GdipCreateSolidFill,

+    FuncId_GdipFillPath,

+    FuncId_GdipDeleteBrush,

+    FuncId_GdipCreatePen1,

+    FuncId_GdipSetPenMiterLimit,

+    FuncId_GdipDrawPath,

+    FuncId_GdipDeletePen,

+    FuncId_GdipDeletePath,

+    FuncId_GdipDeleteGraphics,

+    FuncId_GdipCreateBitmapFromFileICM,

+    FuncId_GdipCreateBitmapFromStreamICM,

+    FuncId_GdipGetImageHeight,

+    FuncId_GdipGetImageWidth,

+    FuncId_GdipGetImagePixelFormat,

+    FuncId_GdipBitmapLockBits,

+    FuncId_GdipGetImagePaletteSize,

+    FuncId_GdipGetImagePalette,

+    FuncId_GdipBitmapUnlockBits,

+    FuncId_GdipDisposeImage,

+    FuncId_GdipFillRectangle,

+    FuncId_GdipCreateBitmapFromScan0,

+    FuncId_GdipSetImagePalette,

+    FuncId_GdipSetInterpolationMode,

+    FuncId_GdipDrawImagePointsI,

+    FuncId_GdipCreateBitmapFromGdiDib,

+    FuncId_GdiplusStartup,

+    FuncId_GdipDrawLineI,

+    FuncId_GdipResetClip,

+    FuncId_GdipCreatePath,

+    FuncId_GdipAddPathPath,

+    FuncId_GdipSetPathFillMode,

+    FuncId_GdipSetClipPath,

+    FuncId_GdipGetClip,

+    FuncId_GdipCreateRegion,

+    FuncId_GdipGetClipBoundsI,

+    FuncId_GdipSetClipRegion,

+    FuncId_GdipWidenPath,

+    FuncId_GdipAddPathLine,

+    FuncId_GdipAddPathRectangle,

+    FuncId_GdipDeleteRegion,

+    FuncId_GdipGetDC,

+    FuncId_GdipReleaseDC,

+    FuncId_GdipSetPenLineCap197819,

+    FuncId_GdipSetPenDashOffset,

+    FuncId_GdipResetPath,

+    FuncId_GdipCreateRegionPath,

+    FuncId_GdipCreateFont,

+    FuncId_GdipGetFontSize,

+    FuncId_GdipCreateFontFamilyFromName,

+    FuncId_GdipSetTextRenderingHint,

+    FuncId_GdipDrawDriverString,

+    FuncId_GdipCreateMatrix2,

+    FuncId_GdipDeleteMatrix,

+    FuncId_GdipSetWorldTransform,

+    FuncId_GdipResetWorldTransform,

+    FuncId_GdipDeleteFontFamily,

+    FuncId_GdipDeleteFont,

+    FuncId_GdipNewPrivateFontCollection,

+    FuncId_GdipDeletePrivateFontCollection,

+    FuncId_GdipPrivateAddMemoryFont,

+    FuncId_GdipGetFontCollectionFamilyList,

+    FuncId_GdipGetFontCollectionFamilyCount,

+    FuncId_GdipSetTextContrast,

+    FuncId_GdipSetPixelOffsetMode,

+    FuncId_GdipGetImageGraphicsContext,

+    FuncId_GdipDrawImageI,

+    FuncId_GdipDrawImageRectI,

+    FuncId_GdipDrawString,

+    FuncId_GdipSetPenTransform,

+};

+static LPCSTR g_GdipFuncNames[] = {

+    "GdipCreatePath2",

+    "GdipSetPenDashStyle",

+    "GdipSetPenDashArray",

+    "GdipSetPenDashCap197819",

+    "GdipSetPenLineJoin",

+    "GdipSetPenWidth",

+    "GdipCreateFromHDC",

+    "GdipSetPageUnit",

+    "GdipSetSmoothingMode",

+    "GdipCreateSolidFill",

+    "GdipFillPath",

+    "GdipDeleteBrush",

+    "GdipCreatePen1",

+    "GdipSetPenMiterLimit",

+    "GdipDrawPath",

+    "GdipDeletePen",

+    "GdipDeletePath",

+    "GdipDeleteGraphics",

+    "GdipCreateBitmapFromFileICM",

+    "GdipCreateBitmapFromStreamICM",

+    "GdipGetImageHeight",

+    "GdipGetImageWidth",

+    "GdipGetImagePixelFormat",

+    "GdipBitmapLockBits",

+    "GdipGetImagePaletteSize",

+    "GdipGetImagePalette",

+    "GdipBitmapUnlockBits",

+    "GdipDisposeImage",

+    "GdipFillRectangle",

+    "GdipCreateBitmapFromScan0",

+    "GdipSetImagePalette",

+    "GdipSetInterpolationMode",

+    "GdipDrawImagePointsI",

+    "GdipCreateBitmapFromGdiDib",

+    "GdiplusStartup",

+    "GdipDrawLineI",

+    "GdipResetClip",

+    "GdipCreatePath",

+    "GdipAddPathPath",

+    "GdipSetPathFillMode",

+    "GdipSetClipPath",

+    "GdipGetClip",

+    "GdipCreateRegion",

+    "GdipGetClipBoundsI",

+    "GdipSetClipRegion",

+    "GdipWidenPath",

+    "GdipAddPathLine",

+    "GdipAddPathRectangle",

+    "GdipDeleteRegion",

+    "GdipGetDC",

+    "GdipReleaseDC",

+    "GdipSetPenLineCap197819",

+    "GdipSetPenDashOffset",

+    "GdipResetPath",

+    "GdipCreateRegionPath",

+    "GdipCreateFont",

+    "GdipGetFontSize",

+    "GdipCreateFontFamilyFromName",

+    "GdipSetTextRenderingHint",

+    "GdipDrawDriverString",

+    "GdipCreateMatrix2",

+    "GdipDeleteMatrix",

+    "GdipSetWorldTransform",

+    "GdipResetWorldTransform",

+    "GdipDeleteFontFamily",

+    "GdipDeleteFont",

+    "GdipNewPrivateFontCollection",

+    "GdipDeletePrivateFontCollection",

+    "GdipPrivateAddMemoryFont",

+    "GdipGetFontCollectionFamilyList",

+    "GdipGetFontCollectionFamilyCount",

+    "GdipSetTextContrast",

+    "GdipSetPixelOffsetMode",

+    "GdipGetImageGraphicsContext",

+    "GdipDrawImageI",

+    "GdipDrawImageRectI",

+    "GdipDrawString",

+    "GdipSetPenTransform",

+};

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath2)(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode, GpPath **path);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashStyle)(GpPen *pen, GpDashStyle dashstyle);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashArray)(GpPen *pen, GDIPCONST REAL *dash, INT count);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashCap197819)(GpPen *pen, GpDashCap dashCap);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineJoin)(GpPen *pen, GpLineJoin lineJoin);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenWidth)(GpPen *pen, REAL width);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFromHDC)(HDC hdc, GpGraphics **graphics);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPageUnit)(GpGraphics *graphics, GpUnit unit);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetSmoothingMode)(GpGraphics *graphics, SmoothingMode smoothingMode);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateSolidFill)(ARGB color, GpSolidFill **brush);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipFillPath)(GpGraphics *graphics, GpBrush *brush, GpPath *path);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteBrush)(GpBrush *brush);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePen1)(ARGB color, REAL width, GpUnit unit, GpPen **pen);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenMiterLimit)(GpPen *pen, REAL miterLimit);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawPath)(GpGraphics *graphics, GpPen *pen, GpPath *path);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePen)(GpPen *pen);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePath)(GpPath* path);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteGraphics)(GpGraphics *graphics);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromFileICM)(GDIPCONST WCHAR* filename, GpBitmap **bitmap);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromStreamICM)(IStream* stream, GpBitmap **bitmap);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageWidth)(GpImage *image, UINT *width);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageHeight)(GpImage *image, UINT *height);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePixelFormat)(GpImage *image, PixelFormat *format);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapLockBits)(GpBitmap* bitmap, GDIPCONST GpRect* rect, UINT flags, PixelFormat format, BitmapData* lockedBitmapData);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePalette)(GpImage *image, ColorPalette *palette, INT size);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePaletteSize)(GpImage *image, INT *size);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapUnlockBits)(GpBitmap* bitmap, BitmapData* lockedBitmapData);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDisposeImage)(GpImage *image);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipFillRectangle)(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y, REAL width, REAL height);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromScan0)(INT width, INT height, INT stride, PixelFormat format, BYTE* scan0, GpBitmap** bitmap);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetImagePalette)(GpImage *image, GDIPCONST ColorPalette *palette);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetInterpolationMode)(GpGraphics *graphics, InterpolationMode interpolationMode);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImagePointsI)(GpGraphics *graphics, GpImage *image, GDIPCONST GpPoint *dstpoints, INT count);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromGdiDib)(GDIPCONST BITMAPINFO* gdiBitmapInfo, VOID* gdiBitmapData, GpBitmap** bitmap);

+typedef Status (WINAPI *FuncType_GdiplusStartup)(OUT FX_UINTPTR *token, const GdiplusStartupInput *input, OUT GdiplusStartupOutput *output);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawLineI)(GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipResetClip)(GpGraphics *graphics);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath)(GpFillMode brushMode, GpPath **path);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathPath)(GpPath *path, GDIPCONST GpPath* addingPath, BOOL connect);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPathFillMode)(GpPath *path, GpFillMode fillmode);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipPath)(GpGraphics *graphics, GpPath *path, CombineMode combineMode);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetClip)(GpGraphics *graphics, GpRegion *region);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegion)(GpRegion **region);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetClipBoundsI)(GpGraphics *graphics, GpRect *rect);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipRegion)(GpGraphics *graphics, GpRegion *region, CombineMode combineMode);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipWidenPath)(GpPath *nativePath, GpPen *pen, GpMatrix *matrix, REAL flatness);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathLine)(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathRectangle)(GpPath *path, REAL x, REAL y, REAL width, REAL height);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteRegion)(GpRegion *region);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetDC)(GpGraphics* graphics, HDC * hdc);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipReleaseDC)(GpGraphics* graphics, HDC hdc);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineCap197819)(GpPen *pen, GpLineCap startCap, GpLineCap endCap, GpDashCap dashCap);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashOffset)(GpPen *pen, REAL offset);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipResetPath)(GpPath *path);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegionPath)(GpPath *path, GpRegion **region);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFont)(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontSize)(GpFont *font, REAL *size);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFontFamilyFromName)(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextRenderingHint)(GpGraphics *graphics, TextRenderingHint mode);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawDriverString)(GpGraphics *graphics, GDIPCONST UINT16 *text, INT length, GDIPCONST GpFont *font, GDIPCONST GpBrush *brush, GDIPCONST PointF *positions, INT flags, GDIPCONST GpMatrix *matrix);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateMatrix2)(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx, REAL dy, GpMatrix **matrix);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteMatrix)(GpMatrix *matrix);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetWorldTransform)(GpGraphics *graphics, GpMatrix *matrix);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipResetWorldTransform)(GpGraphics *graphics);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFontFamily)(GpFontFamily *FontFamily);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFont)(GpFont* font);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipNewPrivateFontCollection)(GpFontCollection** fontCollection);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePrivateFontCollection)(GpFontCollection** fontCollection);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipPrivateAddMemoryFont)(GpFontCollection* fontCollection, GDIPCONST void* memory, INT length);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyList)(GpFontCollection* fontCollection, INT numSought, GpFontFamily* gpfamilies[], INT* numFound);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyCount)(GpFontCollection* fontCollection, INT* numFound);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextContrast)(GpGraphics *graphics, UINT contrast);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPixelOffsetMode)(GpGraphics* graphics, PixelOffsetMode pixelOffsetMode);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageGraphicsContext)(GpImage *image, GpGraphics **graphics);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageI)(GpGraphics *graphics, GpImage *image, INT x, INT y);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageRectI)(GpGraphics *graphics, GpImage *image, INT x, INT y, INT width, INT height);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawString)(GpGraphics *graphics, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, GDIPCONST GpBrush *brush);

+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenTransform)(GpPen *pen, GpMatrix *matrix);

+#define CallFunc(funcname) ((FuncType_##funcname)GdiplusExt.m_Functions[FuncId_##funcname])

+typedef HANDLE   (__stdcall *FuncType_GdiAddFontMemResourceEx)(PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD *pcFonts);

+typedef BOOL     (__stdcall *FuncType_GdiRemoveFontMemResourceEx)(HANDLE handle);

+void* CGdiplusExt::GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face)

+{

+    if (m_pGdiAddFontMemResourceEx) {

+        return ((FuncType_GdiAddFontMemResourceEx)m_pGdiAddFontMemResourceEx)((PVOID)pFontdata, (DWORD)size, (PVOID)pdv, (DWORD*)num_face);

+    }

+    return NULL;

+}

+FX_BOOL CGdiplusExt::GdiRemoveFontMemResourceEx(void* handle)

+{

+    if (m_pGdiRemoveFontMemResourseEx) {

+        return ((FuncType_GdiRemoveFontMemResourceEx)m_pGdiRemoveFontMemResourseEx)((HANDLE)handle);

+    }

+    return FALSE;

+}

+static GpBrush* _GdipCreateBrush(DWORD argb)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    GpSolidFill* solidBrush = NULL;

+    CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);

+    return solidBrush;

+}

+static CFX_DIBitmap* _StretchMonoToGray(int dest_width, int dest_height,

+                                        const CFX_DIBitmap* pSource, FX_RECT* pClipRect)

+{

+    FX_BOOL bFlipX = dest_width < 0;

+    if (bFlipX) {

+        dest_width = -dest_width;

+    }

+    FX_BOOL bFlipY = dest_height < 0;

+    if (bFlipY) {

+        dest_height = -dest_height;

+    }

+    int result_width = pClipRect->Width();

+    int result_height = pClipRect->Height();

+    int result_pitch = (result_width + 3) / 4 * 4;

+    CFX_DIBitmap* pStretched = FX_NEW CFX_DIBitmap;

+    if (!pStretched) {

+        return NULL;

+    }

+    if (!pStretched->Create(result_width, result_height, FXDIB_8bppRgb)) {

+        delete pStretched;

+        return NULL;

+    }

+    LPBYTE dest_buf = pStretched->GetBuffer();

+    int src_width = pSource->GetWidth();

+    int src_height = pSource->GetHeight();

+    int src_count = src_width * src_height;

+    int dest_count = dest_width * dest_height;

+    int ratio = 255 * dest_count / src_count;

+    int y_unit = src_height / dest_height;

+    int x_unit = src_width / dest_width;

+    int area_unit = y_unit * x_unit;

+    LPBYTE src_buf = pSource->GetBuffer();

+    int src_pitch = pSource->GetPitch();

+    for (int dest_y = 0; dest_y < result_height; dest_y ++) {

+        LPBYTE dest_scan = dest_buf + dest_y * result_pitch;

+        int src_y_start = bFlipY ? (dest_height - 1 - dest_y - pClipRect->top) : (dest_y + pClipRect->top);

+        src_y_start = src_y_start * src_height / dest_height;

+        LPBYTE src_scan = src_buf + src_y_start * src_pitch;

+        for (int dest_x = 0; dest_x < result_width; dest_x ++) {

+            int sum = 0;

+            int src_x_start = bFlipX ? (dest_width - 1 - dest_x - pClipRect->left) : (dest_x + pClipRect->left);

+            src_x_start = src_x_start * src_width / dest_width;

+            int src_x_end = src_x_start + x_unit;

+            LPBYTE src_line = src_scan;

+            for (int src_y = 0; src_y < y_unit; src_y ++) {

+                for (int src_x = src_x_start; src_x < src_x_end; src_x ++) {

+                    if (!(src_line[src_x / 8] & (1 << (7 - src_x % 8)))) {

+                        sum += 255;

+                    }

+                }

+                src_line += src_pitch;

+            }

+            dest_scan[dest_x] = 255 - sum / area_unit;

+        }

+    }

+    return pStretched;

+}

+static void OutputImageMask(GpGraphics* pGraphics, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,

+                            int dest_width, int dest_height, FX_ARGB argb, const FX_RECT* pClipRect)

+{

+    ASSERT(pBitmap->GetBPP() == 1);

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    int src_width = pBitmap->GetWidth(), src_height = pBitmap->GetHeight();

+    int src_pitch = pBitmap->GetPitch();

+    FX_LPBYTE scan0 = pBitmap->GetBuffer();

+    if (src_width == 1 && src_height == 1) {

+        if ((scan0[0] & 0x80) == 0) {

+            return;

+        }

+        GpSolidFill* solidBrush;

+        CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);

+        if (dest_width < 0) {

+            dest_width = -dest_width;

+            dest_left -= dest_width;

+        }

+        if (dest_height < 0) {

+            dest_height = -dest_height;

+            dest_top -= dest_height;

+        }

+        CallFunc(GdipFillRectangle)(pGraphics, solidBrush, (float)dest_left, (float)dest_top,

+                                    (float)dest_width, (float)dest_height);

+        CallFunc(GdipDeleteBrush)(solidBrush);

+        return;

+    }

+    if (!bMonoDevice && abs(dest_width) < src_width && abs(dest_height) < src_height) {

+        FX_RECT image_rect(dest_left, dest_top, dest_left + dest_width, dest_top + dest_height);

+        image_rect.Normalize();

+        FX_RECT image_clip = image_rect;

+        image_clip.Intersect(*pClipRect);

+        if (image_clip.IsEmpty()) {

+            return;

+        }

+        image_clip.Offset(-image_rect.left, -image_rect.top);

+        CFX_DIBitmap* pStretched = NULL;

+        if (src_width * src_height > 10000) {

+            pStretched = _StretchMonoToGray(dest_width, dest_height, pBitmap, &image_clip);

+        } else {

+            pStretched = pBitmap->StretchTo(dest_width, dest_height, FALSE, &image_clip);

+        }

+        GpBitmap* bitmap;

+        CallFunc(GdipCreateBitmapFromScan0)(image_clip.Width(), image_clip.Height(),

+                                            (image_clip.Width() + 3) / 4 * 4, PixelFormat8bppIndexed, pStretched->GetBuffer(), &bitmap);

+        int a, r, g, b;

+        ArgbDecode(argb, a, r, g, b);

+        UINT pal[258];

+        pal[0] = 0;

+        pal[1] = 256;

+        for (int i = 0; i < 256; i ++) {

+            pal[i + 2] = ArgbEncode(i * a / 255, r, g, b);

+        }

+        CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);

+        CallFunc(GdipDrawImageI)(pGraphics, bitmap, image_rect.left + image_clip.left,

+                                 image_rect.top + image_clip.top);

+        CallFunc(GdipDisposeImage)(bitmap);

+        delete pStretched;

+        return;

+    }

+    GpBitmap* bitmap;

+    CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, PixelFormat1bppIndexed, scan0, &bitmap);

+    UINT palette[4] = { PaletteFlagsHasAlpha, 2, 0, argb };

+    CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)palette);

+    Point destinationPoints[] = {

+        Point(dest_left, dest_top),

+        Point(dest_left + dest_width, dest_top),

+        Point(dest_left, dest_top + dest_height)

+    };

+    CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);

+    CallFunc(GdipDisposeImage)(bitmap);

+}

+static void OutputImage(GpGraphics* pGraphics, const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect,

+                        int dest_left, int dest_top, int dest_width, int dest_height)

+{

+    int src_width = pSrcRect->Width(), src_height = pSrcRect->Height();

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    if (pBitmap->GetBPP() == 1 && (pSrcRect->left % 8)) {

+        FX_RECT new_rect(0, 0, src_width, src_height);

+        CFX_DIBitmap* pCloned = pBitmap->Clone(pSrcRect);

+        if (!pCloned) {

+            return;

+        }

+        OutputImage(pGraphics, pCloned, &new_rect, dest_left, dest_top, dest_width, dest_height);

+        delete pCloned;

+        return;

+    }

+    int src_pitch = pBitmap->GetPitch();

+    FX_LPBYTE scan0 = pBitmap->GetBuffer() + pSrcRect->top * src_pitch + pBitmap->GetBPP() * pSrcRect->left / 8;

+    GpBitmap* bitmap = NULL;

+    switch (pBitmap->GetFormat()) {

+        case FXDIB_Argb:

+            CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,

+                                                PixelFormat32bppARGB, scan0, &bitmap);

+            break;

+        case FXDIB_Rgb32:

+            CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,

+                                                PixelFormat32bppRGB, scan0, &bitmap);

+            break;

+        case FXDIB_Rgb:

+            CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,

+                                                PixelFormat24bppRGB, scan0, &bitmap);

+            break;

+        case FXDIB_8bppRgb: {

+                CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,

+                                                    PixelFormat8bppIndexed, scan0, &bitmap);

+                UINT pal[258];

+                pal[0] = 0;

+                pal[1] = 256;

+                for (int i = 0; i < 256; i ++) {

+                    pal[i + 2] = pBitmap->GetPaletteEntry(i);

+                }

+                CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);

+                break;

+            }

+        case FXDIB_1bppRgb: {

+                CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,

+                                                    PixelFormat1bppIndexed, scan0, &bitmap);

+                break;

+            }

+    }

+    if (dest_height < 0) {

+        dest_height --;

+    }

+    if (dest_width < 0) {

+        dest_width --;

+    }

+    Point destinationPoints[] = {

+        Point(dest_left, dest_top),

+        Point(dest_left + dest_width, dest_top),

+        Point(dest_left, dest_top + dest_height)

+    };

+    CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);

+    CallFunc(GdipDisposeImage)(bitmap);

+}

+CGdiplusExt::CGdiplusExt()

+{

+    m_hModule = NULL;

+    m_GdiModule = NULL;

+    for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {

+        m_Functions[i] = NULL;

+    }

+    m_pGdiAddFontMemResourceEx = NULL;

+    m_pGdiRemoveFontMemResourseEx = NULL;

+}

+void CGdiplusExt::Load()

+{

+    CFX_ByteString strPlusPath = "";

+    FX_CHAR buf[MAX_PATH];

+    GetSystemDirectoryA(buf, MAX_PATH);

+    strPlusPath += buf;

+    strPlusPath += "\\";

+    strPlusPath += "GDIPLUS.DLL";

+    m_hModule = LoadLibraryA(strPlusPath);

+    if (m_hModule == NULL) {

+        return;

+    }

+    for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {

+        m_Functions[i] = GetProcAddress(m_hModule, g_GdipFuncNames[i]);

+        if (m_Functions[i] == NULL) {

+            m_hModule = NULL;

+            return;

+        }

+    }

+    FX_UINTPTR gdiplusToken;

+    GdiplusStartupInput gdiplusStartupInput;

+    ((FuncType_GdiplusStartup)m_Functions[FuncId_GdiplusStartup])(&gdiplusToken, &gdiplusStartupInput, NULL);

+    m_GdiModule = LoadLibraryA("GDI32.DLL");

+    if (m_GdiModule == NULL) {

+        return;

+    }

+    m_pGdiAddFontMemResourceEx = GetProcAddress(m_GdiModule, "AddFontMemResourceEx");

+    m_pGdiRemoveFontMemResourseEx = GetProcAddress(m_GdiModule, "RemoveFontMemResourceEx");

+}

+CGdiplusExt::~CGdiplusExt()

+{

+}

+LPVOID CGdiplusExt::LoadMemFont(LPBYTE pData, FX_DWORD size)

+{

+    GpFontCollection* pCollection = NULL;

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipNewPrivateFontCollection)(&pCollection);

+    GpStatus status = CallFunc(GdipPrivateAddMemoryFont)(pCollection, pData, size);

+    if (status == Ok) {

+        return pCollection;

+    }

+    CallFunc(GdipDeletePrivateFontCollection)(&pCollection);

+    return NULL;

+}

+void CGdiplusExt::DeleteMemFont(LPVOID pCollection)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipDeletePrivateFontCollection)((GpFontCollection**)&pCollection);

+}

+FX_BOOL CGdiplusExt::GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    PixelFormat format;

+    switch (pBitmap->GetFormat()) {

+        case FXDIB_Rgb:

+            format = PixelFormat24bppRGB;

+            break;

+        case FXDIB_Rgb32:

+            format = PixelFormat32bppRGB;

+            break;

+        case FXDIB_Argb:

+            format = PixelFormat32bppARGB;

+            break;

+        default:

+            return FALSE;

+    }

+    GpStatus status = CallFunc(GdipCreateBitmapFromScan0)(pBitmap->GetWidth(), pBitmap->GetHeight(),

+                      pBitmap->GetPitch(), format, pBitmap->GetBuffer(), (GpBitmap**)bitmap);

+    if (status == Ok) {

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL CGdiplusExt::GdipCreateFromImage(void* bitmap, void** graphics)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    GpStatus status = CallFunc(GdipGetImageGraphicsContext)((GpBitmap*)bitmap, (GpGraphics**)graphics);

+    if (status == Ok) {

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL CGdiplusExt::GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    GpStatus status = CallFunc(GdipCreateFontFamilyFromName)((GDIPCONST WCHAR *)name, (GpFontCollection*)pFontCollection, (GpFontFamily**)pFamily);

+    if (status == Ok) {

+        return TRUE;

+    }

+    return FALSE;

+}

+FX_BOOL CGdiplusExt::GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    GpStatus status = CallFunc(GdipCreateFont)((GpFontFamily*)pFamily, font_size, fontstyle, Unit(flag), (GpFont**)pFont);

+    if (status == Ok) {

+        return TRUE;

+    }

+    return FALSE;

+}

+void CGdiplusExt::GdipGetFontSize(void *pFont, FX_FLOAT *size)

+{

+    REAL get_size;

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    GpStatus status = CallFunc(GdipGetFontSize)((GpFont *)pFont, (REAL*)&get_size);

+    if (status == Ok) {

+        *size = (FX_FLOAT)get_size;

+    } else {

+        *size = 0;

+    }

+}

+void CGdiplusExt::GdipSetTextRenderingHint(void* graphics, int mode)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipSetTextRenderingHint)((GpGraphics*)graphics, (TextRenderingHint)mode);

+}

+void CGdiplusExt::GdipSetPageUnit(void* graphics, FX_DWORD unit)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipSetPageUnit)((GpGraphics*)graphics, (GpUnit)unit);

+}

+FX_BOOL CGdiplusExt::GdipDrawDriverString(void *graphics,  unsigned short *text, int length,

+        void *font, void* brush, void *positions, int flags, const void *matrix)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    GpStatus status = CallFunc(GdipDrawDriverString)((GpGraphics*)graphics, (GDIPCONST UINT16 *)text, (INT)length, (GDIPCONST GpFont *)font, (GDIPCONST GpBrush*)brush,

+                      (GDIPCONST PointF *)positions, (INT)flags, (GDIPCONST GpMatrix *)matrix);

+    if (status == Ok) {

+        return TRUE;

+    }

+    return FALSE;

+}

+void CGdiplusExt::GdipCreateBrush(FX_DWORD fill_argb, void** pBrush)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipCreateSolidFill)((ARGB)fill_argb, (GpSolidFill**)pBrush);

+}

+void CGdiplusExt::GdipDeleteBrush(void* pBrush)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipDeleteBrush)((GpSolidFill*)pBrush);

+}

+void* CGdiplusExt::GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    int numFamilies = 0;

+    GpStatus status = CallFunc(GdipGetFontCollectionFamilyCount)((GpFontCollection*)pFontCollection, &numFamilies);

+    if (status != Ok) {

+        return NULL;

+    }

+    GpFontFamily* family_list[1];

+    status = CallFunc(GdipGetFontCollectionFamilyList)((GpFontCollection*)pFontCollection, 1, family_list, &numFamilies);

+    if (status != Ok) {

+        return NULL;

+    }

+    GpFont* pFont = NULL;

+    status = CallFunc(GdipCreateFont)(family_list[0], font_size, fontstyle, UnitPixel, &pFont);

+    if (status != Ok) {

+        return NULL;

+    }

+    return pFont;

+}

+void CGdiplusExt::GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipCreateMatrix2)(a, b, c, d, e, f, (GpMatrix**)matrix);

+}

+void CGdiplusExt::GdipDeleteMatrix(void* matrix)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipDeleteMatrix)((GpMatrix*)matrix);

+}

+void CGdiplusExt::GdipDeleteFontFamily(void* pFamily)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipDeleteFontFamily)((GpFontFamily*)pFamily);

+}

+void CGdiplusExt::GdipDeleteFont(void* pFont)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipDeleteFont)((GpFont*)pFont);

+}

+void CGdiplusExt::GdipSetWorldTransform(void* graphics, void* pMatrix)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipSetWorldTransform)((GpGraphics*)graphics, (GpMatrix*)pMatrix);

+}

+void CGdiplusExt::GdipDisposeImage(void* bitmap)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipDisposeImage)((GpBitmap*)bitmap);

+}

+void CGdiplusExt::GdipDeleteGraphics(void* graphics)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipDeleteGraphics)((GpGraphics*)graphics);

+}

+FX_BOOL CGdiplusExt::StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,

+                                    int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags)

+{

+    ASSERT(pBitmap->GetBPP() == 1);

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    GpGraphics* pGraphics = NULL;

+    CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);

+    CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);

+    if (flags & FXDIB_NOSMOOTH) {

+        CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);

+    } else {

+        CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);

+    }

+    OutputImageMask(pGraphics, bMonoDevice, pBitmap, dest_left, dest_top, dest_width, dest_height, argb, pClipRect);

+    CallFunc(GdipDeleteGraphics)(pGraphics);

+    return TRUE;

+}

+FX_BOOL CGdiplusExt::StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,

+                                   int dest_width, int dest_height, const FX_RECT* pClipRect, int flags)

+{

+    GpGraphics* pGraphics;

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);

+    CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);

+    if (flags & FXDIB_NOSMOOTH) {

+        CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);

+    } else if (pBitmap->GetWidth() > abs(dest_width) / 2 || pBitmap->GetHeight() > abs(dest_height) / 2) {

+        CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);

+    } else {

+        CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeBilinear);

+    }

+    FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());

+    OutputImage(pGraphics, pBitmap, &src_rect, dest_left, dest_top, dest_width, dest_height);

+    CallFunc(GdipDeleteGraphics)(pGraphics);

+    CallFunc(GdipDeleteGraphics)(pGraphics);

+    return TRUE;

+}

+static GpPen* _GdipCreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, DWORD argb, FX_BOOL bTextMode = FALSE)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    FX_FLOAT width = pGraphState ? pGraphState->m_LineWidth : 1.0f;

+    if (!bTextMode) {

+        FX_FLOAT unit = pMatrix == NULL ? 1.0f : FXSYS_Div(1.0f, (pMatrix->GetXUnit() + pMatrix->GetYUnit()) / 2);

+        if (width < unit) {

+            width = unit;

+        }

+    }

+    GpPen* pPen = NULL;

+    CallFunc(GdipCreatePen1)((ARGB)argb, width, UnitWorld, &pPen);

+    LineCap lineCap;

+    DashCap dashCap = DashCapFlat;

+    FX_BOOL bDashExtend = FALSE;

+    switch(pGraphState->m_LineCap) {

+        case CFX_GraphStateData::LineCapButt:

+            lineCap = LineCapFlat;

+            break;

+        case CFX_GraphStateData::LineCapRound:

+            lineCap = LineCapRound;

+            dashCap = DashCapRound;

+            bDashExtend = TRUE;

+            break;

+        case CFX_GraphStateData::LineCapSquare:

+            lineCap = LineCapSquare;

+            bDashExtend = TRUE;

+            break;

+    }

+    CallFunc(GdipSetPenLineCap197819)(pPen, lineCap, lineCap, dashCap);

+    LineJoin lineJoin;

+    switch(pGraphState->m_LineJoin) {

+        case CFX_GraphStateData::LineJoinMiter:

+            lineJoin = LineJoinMiterClipped;

+            break;

+        case CFX_GraphStateData::LineJoinRound:

+            lineJoin = LineJoinRound;

+            break;

+        case CFX_GraphStateData::LineJoinBevel:

+            lineJoin = LineJoinBevel;

+            break;

+    }

+    CallFunc(GdipSetPenLineJoin)(pPen, lineJoin);

+    if(pGraphState->m_DashCount) {

+        FX_FLOAT* pDashArray = FX_Alloc(FX_FLOAT, pGraphState->m_DashCount + pGraphState->m_DashCount % 2);

+        if (!pDashArray) {

+            return NULL;

+        }

+        int nCount = 0;

+        FX_FLOAT on_leftover = 0, off_leftover = 0;

+        for (int i = 0; i < pGraphState->m_DashCount; i += 2) {

+            FX_FLOAT on_phase = pGraphState->m_DashArray[i];

+            FX_FLOAT off_phase;

+            if (i == pGraphState->m_DashCount - 1) {

+                off_phase = on_phase;

+            } else {

+                off_phase = pGraphState->m_DashArray[i + 1];

+            }

+            on_phase /= width;

+            off_phase /= width;

+            if (on_phase + off_phase <= 0.00002f) {

+                on_phase = 1.0f / 10;

+                off_phase = 1.0f / 10;

+            }

+            if (bDashExtend) {

+                if (off_phase < 1) {

+                    off_phase = 0;

+                } else {

+                    off_phase -= 1;

+                }

+                on_phase += 1;

+            }

+            if (on_phase == 0 || off_phase == 0) {

+                if (nCount == 0) {

+                    on_leftover += on_phase;

+                    off_leftover += off_phase;

+                } else {

+                    pDashArray[nCount - 2] += on_phase;

+                    pDashArray[nCount - 1] += off_phase;

+                }

+            } else {

+                pDashArray[nCount++] = on_phase + on_leftover;

+                on_leftover = 0;

+                pDashArray[nCount++] = off_phase + off_leftover;

+                off_leftover = 0;

+            }

+        }

+        CallFunc(GdipSetPenDashArray)(pPen, pDashArray, nCount);

+        FX_FLOAT phase = pGraphState->m_DashPhase;

+        if (bDashExtend)

+            if (phase < 0.5f) {

+                phase = 0;

+            } else {

+                phase -= 0.5f;

+            }

+        CallFunc(GdipSetPenDashOffset)(pPen, phase);

+        FX_Free(pDashArray);

+        pDashArray = NULL;

+    }

+    CallFunc(GdipSetPenMiterLimit)(pPen, pGraphState->m_MiterLimit);

+    return pPen;

+}

+static BOOL IsSmallTriangle(PointF* points, const CFX_AffineMatrix* pMatrix, int& v1, int& v2)

+{

+    int pairs[] = {1, 2, 0, 2, 0, 1};

+    for (int i = 0; i < 3; i ++) {

+        int pair1 = pairs[i * 2];

+        int pair2 = pairs[i * 2 + 1];

+        FX_FLOAT x1 = points[pair1].X, x2 = points[pair2].X;

+        FX_FLOAT y1 = points[pair1].Y, y2 = points[pair2].Y;

+        if (pMatrix) {

+            pMatrix->Transform(x1, y1);

+            pMatrix->Transform(x2, y2);

+        }

+        FX_FLOAT dx = x1 - x2;

+        FX_FLOAT dy = y1 - y2;

+        FX_FLOAT distance_square = FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy);

+        if (distance_square < (1.0f * 2 + 1.0f / 4)) {

+            v1 = i;

+            v2 = pair1;

+            return TRUE;

+        }

+    }

+    return FALSE;

+}

+BOOL CGdiplusExt::DrawPath(HDC hDC, const CFX_PathData* pPathData,

+                           const CFX_AffineMatrix* pObject2Device,

+                           const CFX_GraphStateData* pGraphState,

+                           FX_DWORD fill_argb,

+                           FX_DWORD stroke_argb,

+                           int fill_mode

+                          )

+{

+    int nPoints = pPathData->GetPointCount();

+    if (nPoints == 0) {

+        return TRUE;

+    }

+    FX_PATHPOINT* pPoints = pPathData->GetPoints();

+    GpGraphics* pGraphics = NULL;

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);

+    CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);

+    CallFunc(GdipSetPixelOffsetMode)(pGraphics, PixelOffsetModeHalf);

+    GpMatrix* pMatrix = NULL;

+    if (pObject2Device) {

+        CallFunc(GdipCreateMatrix2)(pObject2Device->a, pObject2Device->b, pObject2Device->c, pObject2Device->d, pObject2Device->e, pObject2Device->f, &pMatrix);

+        CallFunc(GdipSetWorldTransform)(pGraphics, pMatrix);

+    }

+    PointF *points = FX_Alloc(PointF, nPoints);

+    if (!points) {

+        return FALSE;

+    }

+    BYTE * types  = FX_Alloc(BYTE, nPoints);

+    if (!types) {

+        FX_Free(points);

+        return FALSE;

+    }

+    int nSubPathes = 0;

+    FX_BOOL bSubClose = FALSE;

+    int pos_subclose = 0;

+    FX_BOOL bSmooth = FALSE;

+    int startpoint = 0;

+    for(int i = 0; i < nPoints; i++) {

+        points[i].X = pPoints[i].m_PointX;

+        points[i].Y = pPoints[i].m_PointY;

+        FX_FLOAT x, y;

+        if (pObject2Device) {

+            pObject2Device->Transform(pPoints[i].m_PointX, pPoints[i].m_PointY, x, y);

+        } else {

+            x = pPoints[i].m_PointX;

+            y = pPoints[i].m_PointY;

+        }

+        if (x > 50000 * 1.0f) {

+            points[i].X = 50000 * 1.0f;

+        }

+        if (x < -50000 * 1.0f) {

+            points[i].X = -50000 * 1.0f;

+        }

+        if (y > 50000 * 1.0f) {

+            points[i].Y = 50000 * 1.0f;

+        }

+        if (y < -50000 * 1.0f) {

+            points[i].Y = -50000 * 1.0f;

+        }

+        int point_type = pPoints[i].m_Flag & FXPT_TYPE;

+        if(point_type == FXPT_MOVETO) {

+            types[i] = PathPointTypeStart;

+            nSubPathes ++;

+            bSubClose = FALSE;

+            startpoint = i;

+        } else if (point_type == FXPT_LINETO) {

+            types[i] = PathPointTypeLine;

+            if (pPoints[i - 1].m_Flag == FXPT_MOVETO && (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) &&

+                    points[i].Y == points[i - 1].Y && points[i].X == points[i - 1].X) {

+                points[i].X += 0.01f;

+                continue;

+            }

+            if (!bSmooth && points[i].X != points[i - 1].X && points[i].Y != points[i - 1].Y) {

+                bSmooth = TRUE;

+            }

+        } else if (point_type == FXPT_BEZIERTO)	{

+            types[i] = PathPointTypeBezier;

+            bSmooth = TRUE;

+        }

+        if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) {

+            if (bSubClose) {

+                types[pos_subclose] &= ~PathPointTypeCloseSubpath;

+            } else {

+                bSubClose = TRUE;

+            }

+            pos_subclose = i;

+            types[i] |= PathPointTypeCloseSubpath;

+            if (!bSmooth && points[i].X != points[startpoint].X && points[i].Y != points[startpoint].Y) {

+                bSmooth = TRUE;

+            }

+        }

+    }

+    if (fill_mode & FXFILL_NOPATHSMOOTH) {

+        bSmooth = FALSE;

+        CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeNone);

+    } else if (!(fill_mode & FXFILL_FULLCOVER)) {

+        if (!bSmooth && (fill_mode & 3)) {

+            bSmooth = TRUE;

+        }

+        if (bSmooth || pGraphState && pGraphState->m_LineWidth > 2) {

+            CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeAntiAlias);

+        }

+    }

+    int new_fill_mode = fill_mode & 3;

+    if (nPoints == 4 && pGraphState == NULL) {

+        int v1, v2;

+        if (IsSmallTriangle(points, pObject2Device, v1, v2)) {

+            GpPen* pPen = NULL;

+            CallFunc(GdipCreatePen1)(fill_argb, 1.0f, UnitPixel, &pPen);

+            CallFunc(GdipDrawLineI)(pGraphics, pPen, FXSYS_round(points[v1].X), FXSYS_round(points[v1].Y),

+                                    FXSYS_round(points[v2].X), FXSYS_round(points[v2].Y));

+            CallFunc(GdipDeletePen)(pPen);

+            return TRUE;

+        }

+    }

+    GpPath* pGpPath = NULL;

+    CallFunc(GdipCreatePath2)(points, types, nPoints, GdiFillType2Gdip(new_fill_mode), &pGpPath);

+    if (!pGpPath) {

+        if (pMatrix) {

+            CallFunc(GdipDeleteMatrix)(pMatrix);

+        }

+        FX_Free(points);

+        FX_Free(types);

+        CallFunc(GdipDeleteGraphics)(pGraphics);

+        return FALSE;

+    }

+    if (new_fill_mode) {

+        GpBrush* pBrush = _GdipCreateBrush(fill_argb);

+        CallFunc(GdipSetPathFillMode)(pGpPath, GdiFillType2Gdip(new_fill_mode));

+        CallFunc(GdipFillPath)(pGraphics, pBrush, pGpPath);

+        CallFunc(GdipDeleteBrush)(pBrush);

+    }

+    if (pGraphState && stroke_argb) {

+        GpPen* pPen = _GdipCreatePen(pGraphState, pObject2Device, stroke_argb, fill_mode & FX_STROKE_TEXT_MODE);

+        if (nSubPathes == 1) {

+            CallFunc(GdipDrawPath)(pGraphics, pPen, pGpPath);

+        } else {

+            int iStart = 0;

+            for (int i = 0; i < nPoints; i ++) {

+                if (i == nPoints - 1 || types[i + 1] == PathPointTypeStart) {

+                    GpPath* pSubPath;

+                    CallFunc(GdipCreatePath2)(points + iStart, types + iStart, i - iStart + 1, GdiFillType2Gdip(new_fill_mode), &pSubPath);

+                    iStart = i + 1;

+                    CallFunc(GdipDrawPath)(pGraphics, pPen, pSubPath);

+                    CallFunc(GdipDeletePath)(pSubPath);

+                }

+            }

+        }

+        CallFunc(GdipDeletePen)(pPen);

+    }

+    if (pMatrix) {

+        CallFunc(GdipDeleteMatrix)(pMatrix);

+    }

+    FX_Free(points);

+    FX_Free(types);

+    CallFunc(GdipDeletePath)(pGpPath);

+    CallFunc(GdipDeleteGraphics)(pGraphics);

+    return TRUE;

+}

+class GpStream : public IStream, public CFX_Object

+{

+    LONG	m_RefCount;

+    int     m_ReadPos;

+    CFX_ByteTextBuf	m_InterStream;

+public:

+    GpStream()

+    {

+        m_RefCount = 1;

+        m_ReadPos = 0;

+    }

+    virtual HRESULT STDMETHODCALLTYPE

+    QueryInterface(REFIID iid, void ** ppvObject)

+    {

+        if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) ||

+                iid == __uuidof(ISequentialStream))	{

+            *ppvObject = static_cast<IStream*>(this);

+            AddRef();

+            return S_OK;

+        } else {

+            return E_NOINTERFACE;

+        }

+    }

+    virtual ULONG STDMETHODCALLTYPE AddRef(void)

+    {

+        return (ULONG)InterlockedIncrement(&m_RefCount);

+    }

+    virtual ULONG STDMETHODCALLTYPE Release(void)

+    {

+        ULONG res = (ULONG) InterlockedDecrement(&m_RefCount);

+        if (res == 0) {

+            delete this;

+        }

+        return res;

+    }

+public:

+    virtual HRESULT STDMETHODCALLTYPE Read(void* Output, ULONG cb, ULONG* pcbRead)

+    {

+        size_t	bytes_left;

+        size_t	bytes_out;

+        if (pcbRead != NULL) {

+            *pcbRead = 0;

+        }

+        if (m_ReadPos == m_InterStream.GetLength()) {

+            return HRESULT_FROM_WIN32(ERROR_END_OF_MEDIA);

+        }

+        bytes_left = m_InterStream.GetLength() - m_ReadPos;

+        bytes_out = FX_MIN(cb, bytes_left);

+        FXSYS_memcpy32(Output, m_InterStream.GetBuffer() + m_ReadPos, bytes_out);

+        m_ReadPos += (FX_INT32)bytes_out;

+        if (pcbRead != NULL) {

+            *pcbRead = (ULONG)bytes_out;

+        }

+        return S_OK;

+    }

+    virtual HRESULT STDMETHODCALLTYPE Write(void const* Input, ULONG cb, ULONG* pcbWritten)

+    {

+        if (cb <= 0) {

+            if (pcbWritten != NULL) {

+                *pcbWritten = 0;

+            }

+            return S_OK;

+        }

+        m_InterStream.InsertBlock(m_InterStream.GetLength(), Input, cb);

+        if (pcbWritten != NULL) {

+            *pcbWritten = cb;

+        }

+        return S_OK;

+    }

+public:

+    virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER)

+    {

+        return E_NOTIMPL;

+    }

+    virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*)

+    {

+        return E_NOTIMPL;

+    }

+    virtual HRESULT STDMETHODCALLTYPE Commit(DWORD)

+    {

+        return E_NOTIMPL;

+    }

+    virtual HRESULT STDMETHODCALLTYPE Revert(void)

+    {

+        return E_NOTIMPL;

+    }

+    virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)

+    {

+        return E_NOTIMPL;

+    }

+    virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)

+    {

+        return E_NOTIMPL;

+    }

+    virtual HRESULT STDMETHODCALLTYPE Clone(IStream **)

+    {

+        return E_NOTIMPL;

+    }

+    virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER* lpNewFilePointer)

+    {

+        long	start = 0;

+        long	new_read_position;

+        switch(dwOrigin) {

+            case STREAM_SEEK_SET:

+                start = 0;

+                break;

+            case STREAM_SEEK_CUR:

+                start = m_ReadPos;

+                break;

+            case STREAM_SEEK_END:

+                start = m_InterStream.GetLength();

+                break;

+            default:

+                return STG_E_INVALIDFUNCTION;

+                break;

+        }

+        new_read_position = start + (long)liDistanceToMove.QuadPart;

+        if (new_read_position < 0 || new_read_position > m_InterStream.GetLength()) {

+            return STG_E_SEEKERROR;

+        }

+        m_ReadPos = new_read_position;

+        if (lpNewFilePointer != NULL) {

+            lpNewFilePointer->QuadPart = m_ReadPos;

+        }

+        return S_OK;

+    }

+    virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg, DWORD grfStatFlag)

+    {

+        if (pStatstg == NULL) {

+            return STG_E_INVALIDFUNCTION;

+        }

+        ZeroMemory(pStatstg, sizeof(STATSTG));

+        pStatstg->cbSize.QuadPart = m_InterStream.GetLength();

+        return S_OK;

+    }

+};

+typedef struct {

+    BITMAPINFO*		pbmi;

+    int				Stride;

+    LPBYTE			pScan0;

+    GpBitmap*		pBitmap;

+    BitmapData*		pBitmapData;

+    GpStream*       pStream;

+} PREVIEW3_DIBITMAP;

+static PREVIEW3_DIBITMAP* LoadDIBitmap(WINDIB_Open_Args_ args)

+{

+    GpBitmap* pBitmap;

+    GpStream* pStream = NULL;

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    Status status = Ok;

+    if (args.flags == WINDIB_OPEN_PATHNAME) {

+        status = CallFunc(GdipCreateBitmapFromFileICM)((wchar_t*)args.path_name, &pBitmap);

+    } else {

+        if (args.memory_size == 0 || !args.memory_base) {

+            return NULL;

+        }

+        pStream = FX_NEW GpStream;

+        if (!pStream) {

+            return NULL;

+        }

+        pStream->Write(args.memory_base, (ULONG)args.memory_size, NULL);

+        status = CallFunc(GdipCreateBitmapFromStreamICM)(pStream, &pBitmap);

+    }

+    if (status != Ok) {

+        if (pStream) {

+            pStream->Release();

+        }

+        return NULL;

+    }

+    UINT height, width;

+    CallFunc(GdipGetImageHeight)(pBitmap, &height);

+    CallFunc(GdipGetImageWidth)(pBitmap, &width);

+    PixelFormat pixel_format;

+    CallFunc(GdipGetImagePixelFormat)(pBitmap, &pixel_format);

+    int info_size = sizeof(BITMAPINFOHEADER);

+    int bpp = 24;

+    int dest_pixel_format = PixelFormat24bppRGB;

+    if (pixel_format == PixelFormat1bppIndexed) {

+        info_size += 8;

+        bpp = 1;

+        dest_pixel_format = PixelFormat1bppIndexed;

+    } else if (pixel_format == PixelFormat8bppIndexed) {

+        info_size += 1024;

+        bpp = 8;

+        dest_pixel_format = PixelFormat8bppIndexed;

+    } else if (pixel_format == PixelFormat32bppARGB) {

+        bpp = 32;

+        dest_pixel_format = PixelFormat32bppARGB;

+    }

+    LPBYTE buf = FX_Alloc(BYTE, info_size);

+    if (!buf) {

+        if (pStream) {

+            pStream->Release();

+        }

+        return NULL;

+    }

+    BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)buf;

+    FXSYS_memset32(buf, 0, info_size);

+    pbmih->biBitCount = bpp;

+    pbmih->biCompression = BI_RGB;

+    pbmih->biHeight = -(int)height;

+    pbmih->biPlanes = 1;

+    pbmih->biWidth = width;

+    Rect rect(0, 0, width, height);

+    BitmapData* pBitmapData = FX_Alloc(BitmapData, 1);

+    if (!pBitmapData) {

+        if (pStream) {

+            pStream->Release();

+        }

+        return NULL;

+    }

+    CallFunc(GdipBitmapLockBits)(pBitmap, &rect, ImageLockModeRead,

+                                 dest_pixel_format, pBitmapData);

+    if (pixel_format == PixelFormat1bppIndexed || pixel_format == PixelFormat8bppIndexed) {

+        DWORD* ppal = (DWORD*)(buf + sizeof(BITMAPINFOHEADER));

+        struct {

+            UINT flags;

+            UINT Count;

+            DWORD Entries[256];

+        } pal;

+        int size = 0;

+        CallFunc(GdipGetImagePaletteSize)(pBitmap, &size);

+        CallFunc(GdipGetImagePalette)(pBitmap, (ColorPalette*)&pal, size);

+        int entries = pixel_format == PixelFormat1bppIndexed ? 2 : 256;

+        for (int i = 0; i < entries; i ++) {

+            ppal[i] = pal.Entries[i] & 0x00ffffff;

+        }

+    }

+    PREVIEW3_DIBITMAP* pInfo = FX_Alloc(PREVIEW3_DIBITMAP, 1);

+    if (!pInfo) {

+        if (pStream) {

+            pStream->Release();

+        }

+        return NULL;

+    }

+    pInfo->pbmi = (BITMAPINFO*)buf;

+    pInfo->pScan0 = (LPBYTE)pBitmapData->Scan0;

+    pInfo->Stride = pBitmapData->Stride;

+    pInfo->pBitmap = pBitmap;

+    pInfo->pBitmapData = pBitmapData;

+    pInfo->pStream = pStream;

+    return pInfo;

+}

+static void FreeDIBitmap(PREVIEW3_DIBITMAP* pInfo)

+{

+    CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;

+    CallFunc(GdipBitmapUnlockBits)(pInfo->pBitmap, pInfo->pBitmapData);

+    CallFunc(GdipDisposeImage)(pInfo->pBitmap);

+    FX_Free(pInfo->pBitmapData);

+    FX_Free((LPBYTE)pInfo->pbmi);

+    if (pInfo->pStream) {

+        pInfo->pStream->Release();

+    }

+    FX_Free(pInfo);

+}

+CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha);

+CFX_DIBitmap* CGdiplusExt::LoadDIBitmap(WINDIB_Open_Args_ args)

+{

+    PREVIEW3_DIBITMAP* pInfo = ::LoadDIBitmap(args);

+    if (pInfo == NULL) {

+        return NULL;

+    }

+    int height = abs(pInfo->pbmi->bmiHeader.biHeight);

+    int width = pInfo->pbmi->bmiHeader.biWidth;

+    int dest_pitch = (width * pInfo->pbmi->bmiHeader.biBitCount + 31) / 32 * 4;

+    LPBYTE pData = FX_Alloc(BYTE, dest_pitch * height);

+    if (pData == NULL) {

+        FreeDIBitmap(pInfo);

+        return NULL;

+    }

+    if (dest_pitch == pInfo->Stride) {

+        FXSYS_memcpy32(pData, pInfo->pScan0, dest_pitch * height);

+    } else for (int i = 0; i < height; i ++) {

+            FXSYS_memcpy32(pData + dest_pitch * i, pInfo->pScan0 + pInfo->Stride * i, dest_pitch);

+        }

+    CFX_DIBitmap* pDIBitmap = _FX_WindowsDIB_LoadFromBuf(pInfo->pbmi, pData, pInfo->pbmi->bmiHeader.biBitCount == 32);

+    FX_Free(pData);

+    FreeDIBitmap(pInfo);

+    return pDIBitmap;

+}

+#endif

diff --git a/core/src/fxge/win32/fx_win32_print.cpp b/core/src/fxge/win32/fx_win32_print.cpp
new file mode 100644
index 0000000..c08c8e7
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_print.cpp
@@ -0,0 +1,426 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+#include "../../../include/fxge/fx_ge.h"

+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_

+#include <windows.h>

+#include "../../../include/fxge/fx_ge_win32.h"

+#include "win32_int.h"

+#include "../../../include/fxge/fx_freetype.h"

+#include "../ge/text_int.h"

+#include "../dib/dib_int.h"

+#define SIZETHRESHOLD 1000

+#define OUTPUTPSLEN 4096

+CGdiPrinterDriver::CGdiPrinterDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_PRINTER)

+{

+    m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);

+    m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);

+    m_bSupportROP = TRUE;

+}

+int CGdiPrinterDriver::GetDeviceCaps(int caps_id)

+{

+    if (caps_id == FXDC_HORZ_SIZE) {

+        return m_HorzSize;

+    }

+    if (caps_id == FXDC_VERT_SIZE) {

+        return m_VertSize;

+    }

+    return CGdiDeviceDriver::GetDeviceCaps(caps_id);

+}

+FX_BOOL CGdiPrinterDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,

+                                     int alpha_flag, void* pIccTransform)

+{

+    if (pSource->IsAlphaMask()) {

+        FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());

+        return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, pSource->GetWidth(), pSource->GetHeight(),

+                             &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);

+    }

+    ASSERT(pSource != NULL && !pSource->IsAlphaMask() && pSrcRect != NULL);

+    ASSERT(blend_type == FXDIB_BLEND_NORMAL);

+    if (pSource->HasAlpha()) {

+        return FALSE;

+    }

+    CFX_DIBExtractor temp(pSource);

+    CFX_DIBitmap* pBitmap = temp;

+    if (pBitmap == NULL) {

+        return FALSE;

+    }

+    return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);

+}

+FX_BOOL CGdiPrinterDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,

+        int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,

+        int alpha_flag, void* pIccTransform, int blend_type)

+{

+    if (pSource->IsAlphaMask()) {

+        int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);

+        if (pSource->GetBPP() != 1 || alpha != 255 || !m_bSupportROP) {

+            return FALSE;

+        }

+        if (dest_width < 0 || dest_height < 0) {

+            CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);

+            if (pFlipped == NULL) {

+                return FALSE;

+            }

+            if (dest_width < 0) {

+                dest_left += dest_width;

+            }

+            if (dest_height < 0) {

+                dest_top += dest_height;

+            }

+            FX_BOOL ret = GDI_StretchBitMask(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), color, flags, alpha_flag, pIccTransform);

+            delete pFlipped;

+            return ret;

+        }

+        CFX_DIBExtractor temp(pSource);

+        CFX_DIBitmap* pBitmap = temp;

+        if (pBitmap == NULL) {

+            return FALSE;

+        }

+        return GDI_StretchBitMask(pBitmap, dest_left, dest_top, dest_width, dest_height, color, flags, alpha_flag, pIccTransform);

+    } else {

+        ASSERT(pSource != NULL);

+        if (pSource->HasAlpha()) {

+            return FALSE;

+        }

+        if (dest_width < 0 || dest_height < 0) {

+            CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);

+            if (pFlipped == NULL) {

+                return FALSE;

+            }

+            if (dest_width < 0) {

+                dest_left += dest_width;

+            }

+            if (dest_height < 0) {

+                dest_top += dest_height;

+            }

+            FX_BOOL ret = GDI_StretchDIBits(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), flags, pIccTransform);

+            delete pFlipped;

+            return ret;

+        }

+        CFX_DIBExtractor temp(pSource);

+        CFX_DIBitmap* pBitmap = temp;

+        if (pBitmap == NULL) {

+            return FALSE;

+        }

+        return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);

+    }

+}

+static CFX_DIBitmap* Transform1bppBitmap(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix)

+{

+    ASSERT(pSrc->GetFormat() == FXDIB_1bppRgb || pSrc->GetFormat() == FXDIB_1bppMask || pSrc->GetFormat() == FXDIB_1bppCmyk);

+    CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();

+    FX_RECT full_rect = unit_rect.GetOutterRect();

+    int full_left = full_rect.left;

+    int full_top = full_rect.top;

+    CFX_DIBExtractor src_bitmap(pSrc);

+    CFX_DIBitmap* pSrcBitmap = src_bitmap;

+    if (pSrcBitmap == NULL) {

+        return NULL;

+    }

+    int src_width = pSrcBitmap->GetWidth(), src_height = pSrcBitmap->GetHeight();

+    FX_LPBYTE src_buf = pSrcBitmap->GetBuffer();

+    FX_DWORD src_pitch = pSrcBitmap->GetPitch();

+    FX_FLOAT dest_area = pDestMatrix->GetUnitArea();

+    FX_FLOAT area_scale = FXSYS_Div((FX_FLOAT)(src_width * src_height), dest_area);

+    FX_FLOAT size_scale = FXSYS_sqrt(area_scale);

+    CFX_AffineMatrix adjusted_matrix(*pDestMatrix);

+    adjusted_matrix.Scale(size_scale, size_scale);

+    CFX_FloatRect result_rect_f = adjusted_matrix.GetUnitRect();

+    FX_RECT result_rect = result_rect_f.GetOutterRect();

+    CFX_AffineMatrix src2result;

+    src2result.e = adjusted_matrix.c + adjusted_matrix.e;

+    src2result.f = adjusted_matrix.d + adjusted_matrix.f;

+    src2result.a = adjusted_matrix.a / pSrcBitmap->GetWidth();

+    src2result.b = adjusted_matrix.b / pSrcBitmap->GetWidth();

+    src2result.c = -adjusted_matrix.c / pSrcBitmap->GetHeight();

+    src2result.d = -adjusted_matrix.d / pSrcBitmap->GetHeight();

+    src2result.TranslateI(-result_rect.left, -result_rect.top);

+    CFX_AffineMatrix result2src;

+    result2src.SetReverse(src2result);

+    CPDF_FixedMatrix result2src_fix(result2src, 8);

+    int result_width = result_rect.Width();

+    int result_height = result_rect.Height();

+    CFX_DIBitmap* pTempBitmap = FX_NEW CFX_DIBitmap;

+    if (!pTempBitmap) {

+        if (pSrcBitmap != src_bitmap) {

+            delete pSrcBitmap;

+        }

+        return NULL;

+    }

+    if (!pTempBitmap->Create(result_width, result_height, pSrc->GetFormat())) {

+        delete pTempBitmap;

+        if (pSrcBitmap != src_bitmap) {

+            delete pSrcBitmap;

+        }

+        return NULL;

+    }

+    pTempBitmap->CopyPalette(pSrc->GetPalette());

+    FX_LPBYTE dest_buf = pTempBitmap->GetBuffer();

+    int dest_pitch = pTempBitmap->GetPitch();

+    FXSYS_memset8(dest_buf, pSrc->IsAlphaMask() ? 0 : 0xff, dest_pitch * result_height);

+    if (pSrcBitmap->IsAlphaMask()) {

+        for (int dest_y = 0; dest_y < result_height; dest_y ++) {

+            FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;

+            for (int dest_x = 0; dest_x < result_width; dest_x ++) {

+                int src_x, src_y;

+                result2src_fix.Transform(dest_x, dest_y, src_x, src_y);

+                if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {

+                    continue;

+                }

+                if (!((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8)))) {

+                    continue;

+                }

+                dest_scan[dest_x / 8] |= 1 << (7 - dest_x % 8);

+            }

+        }

+    } else {

+        for (int dest_y = 0; dest_y < result_height; dest_y ++) {

+            FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;

+            for (int dest_x = 0; dest_x < result_width; dest_x ++) {

+                int src_x, src_y;

+                result2src_fix.Transform(dest_x, dest_y, src_x, src_y);

+                if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {

+                    continue;

+                }

+                if ((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8))) {

+                    continue;

+                }

+                dest_scan[dest_x / 8] &= ~(1 << (7 - dest_x % 8));

+            }

+        }

+    }

+    if (pSrcBitmap != src_bitmap) {

+        delete pSrcBitmap;

+    }

+    return pTempBitmap;

+}

+FX_BOOL	CGdiPrinterDriver::StartDIBits(const CFX_DIBSource* pSource, int bitmap_alpha, FX_DWORD color,

+                                       const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,

+                                       int alpha_flag, void* pIccTransform, int blend_type)

+{

+    if (bitmap_alpha < 255 || pSource->HasAlpha() || (pSource->IsAlphaMask() && (pSource->GetBPP() != 1 || !m_bSupportROP))) {

+        return FALSE;

+    }

+    CFX_FloatRect unit_rect = pMatrix->GetUnitRect();

+    FX_RECT full_rect = unit_rect.GetOutterRect();

+    if (FXSYS_fabs(pMatrix->b) < 0.5f && pMatrix->a != 0 && FXSYS_fabs(pMatrix->c) < 0.5f && pMatrix->d != 0) {

+        FX_BOOL bFlipX = pMatrix->a < 0;

+        FX_BOOL bFlipY = pMatrix->d > 0;

+        return StretchDIBits(pSource, color, bFlipX ? full_rect.right : full_rect.left, bFlipY ? full_rect.bottom : full_rect.top,

+                             bFlipX ? -full_rect.Width() : full_rect.Width(), bFlipY ? -full_rect.Height() : full_rect.Height(), NULL, 0,

+                             alpha_flag, pIccTransform, blend_type);

+    }

+    if (FXSYS_fabs(pMatrix->a) < 0.5f && FXSYS_fabs(pMatrix->d) < 0.5f) {

+        CFX_DIBitmap* pTransformed = pSource->SwapXY(pMatrix->c > 0, pMatrix->b < 0);

+        if (pTransformed == NULL) {

+            return FALSE;

+        }

+        FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,

+                                    alpha_flag, pIccTransform, blend_type);

+        delete pTransformed;

+        return ret;

+    }

+    if (pSource->GetBPP() == 1) {

+        CFX_DIBitmap* pTransformed = Transform1bppBitmap(pSource, pMatrix);

+        if (pIccTransform == NULL) {

+            return FALSE;

+        }

+        SaveState();

+        CFX_PathData path;

+        path.AppendRect(0, 0, 1.0f, 1.0f);

+        SetClip_PathFill(&path, pMatrix, WINDING);

+        FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,

+                                    alpha_flag, pIccTransform, blend_type);

+        RestoreState();

+        delete pTransformed;

+        handle = NULL;

+        return ret;

+    }

+    return FALSE;

+}

+CPSOutput::CPSOutput(HDC hDC)

+{

+    m_hDC = hDC;

+    m_pBuf = NULL;

+}

+CPSOutput::~CPSOutput()

+{

+    if (m_pBuf) {

+        FX_Free(m_pBuf);

+    }

+}

+void CPSOutput::Init()

+{

+    m_pBuf = FX_Alloc(FX_CHAR, 1026);

+}

+void CPSOutput::OutputPS(FX_LPCSTR string, int len)

+{

+    if (len < 0) {

+        len = (int)FXSYS_strlen(string);

+    }

+    int sent_len = 0;

+    while (len > 0) {

+        int send_len = len > 1024 ? 1024 : len;

+        *(FX_WORD*)m_pBuf = send_len;

+        FXSYS_memcpy(m_pBuf + 2, string + sent_len, send_len);

+        int ret = ExtEscape(m_hDC, PASSTHROUGH, send_len + 2, m_pBuf, 0, NULL);

+        sent_len += send_len;

+        len -= send_len;

+    }

+}

+CPSPrinterDriver::CPSPrinterDriver()

+{

+    m_pPSOutput = NULL;

+    m_bCmykOutput = FALSE;

+}

+CPSPrinterDriver::~CPSPrinterDriver()

+{

+    EndRendering();

+    if (m_pPSOutput) {

+        delete m_pPSOutput;

+    }

+}

+FX_BOOL CPSPrinterDriver::Init(HDC hDC, int pslevel, FX_BOOL bCmykOutput)

+{

+    m_hDC = hDC;

+    m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);

+    m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);

+    m_Width = ::GetDeviceCaps(m_hDC, HORZRES);

+    m_Height = ::GetDeviceCaps(m_hDC, VERTRES);

+    m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);

+    m_pPSOutput = FX_NEW CPSOutput(hDC);

+    if (!m_pPSOutput) {

+        return FALSE;

+    }

+    ((CPSOutput*)m_pPSOutput)->Init();

+    m_PSRenderer.Init(m_pPSOutput, pslevel, m_Width, m_Height, bCmykOutput);

+    m_bCmykOutput = bCmykOutput;

+    HRGN hRgn = ::CreateRectRgn(0, 0, 1, 1);

+    int ret = ::GetClipRgn(hDC, hRgn);

+    if (ret == 1) {

+        ret = ::GetRegionData(hRgn, 0, NULL);

+        if (ret) {

+            RGNDATA* pData = (RGNDATA*)FX_Alloc(FX_BYTE, ret);

+            if (!pData) {

+                return FALSE;

+            }

+            ret = ::GetRegionData(hRgn, ret, pData);

+            if (ret) {

+                CFX_PathData path;

+                path.AllocPointCount(pData->rdh.nCount * 5);

+                for (FX_DWORD i = 0; i < pData->rdh.nCount; i ++) {

+                    RECT* pRect = (RECT*)(pData->Buffer + pData->rdh.nRgnSize * i);

+                    path.AppendRect((FX_FLOAT)pRect->left, (FX_FLOAT)pRect->bottom, (FX_FLOAT)pRect->right, (FX_FLOAT)pRect->top);

+                }

+                m_PSRenderer.SetClip_PathFill(&path, NULL, FXFILL_WINDING);

+            }

+            FX_Free(pData);

+        }

+    }

+    ::DeleteObject(hRgn);

+    return TRUE;

+}

+int CPSPrinterDriver::GetDeviceCaps(int caps_id)

+{

+    switch (caps_id) {

+        case FXDC_DEVICE_CLASS:

+            return FXDC_PRINTER;

+        case FXDC_PIXEL_WIDTH:

+            return m_Width;

+        case FXDC_PIXEL_HEIGHT:

+            return m_Height;

+        case FXDC_BITS_PIXEL:

+            return m_nBitsPerPixel;

+        case FXDC_RENDER_CAPS:

+            return m_bCmykOutput ? FXRC_BIT_MASK | FXRC_CMYK_OUTPUT : FXRC_BIT_MASK;

+        case FXDC_HORZ_SIZE:

+            return m_HorzSize;

+        case FXDC_VERT_SIZE:

+            return m_VertSize;

+    }

+    return 0;

+}

+FX_BOOL CPSPrinterDriver::StartRendering()

+{

+    return m_PSRenderer.StartRendering();

+}

+void CPSPrinterDriver::EndRendering()

+{

+    m_PSRenderer.EndRendering();

+}

+void CPSPrinterDriver::SaveState()

+{

+    m_PSRenderer.SaveState();

+}

+void CPSPrinterDriver::RestoreState(FX_BOOL bKeepSaved)

+{

+    m_PSRenderer.RestoreState(bKeepSaved);

+}

+FX_BOOL	CPSPrinterDriver::SetClip_PathFill(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device,

+        int fill_mode)

+{

+    m_PSRenderer.SetClip_PathFill(pPathData, pObject2Device, fill_mode);

+    return TRUE;

+}

+FX_BOOL	CPSPrinterDriver::SetClip_PathStroke(const CFX_PathData* pPathData,

+        const CFX_AffineMatrix* pObject2Device,

+        const CFX_GraphStateData* pGraphState)

+{

+    m_PSRenderer.SetClip_PathStroke(pPathData, pObject2Device, pGraphState);

+    return TRUE;

+}

+FX_BOOL	CPSPrinterDriver::DrawPath(const CFX_PathData* pPathData,

+                                   const CFX_AffineMatrix* pObject2Device,

+                                   const CFX_GraphStateData* pGraphState, FX_ARGB fill_color, FX_ARGB stroke_color,

+                                   int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)

+{

+    if (blend_type != FXDIB_BLEND_NORMAL) {

+        return FALSE;

+    }

+    return m_PSRenderer.DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode & 3, alpha_flag, pIccTransform);

+}

+FX_BOOL CPSPrinterDriver::GetClipBox(FX_RECT* pRect)

+{

+    *pRect = m_PSRenderer.GetClipBox();

+    return TRUE;

+}

+FX_BOOL CPSPrinterDriver::SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,

+                                    int alpha_flag, void* pIccTransform)

+{

+    if (blend_type != FXDIB_BLEND_NORMAL) {

+        return FALSE;

+    }

+    return m_PSRenderer.SetDIBits(pBitmap, color, left, top, alpha_flag, pIccTransform);

+}

+FX_BOOL CPSPrinterDriver::StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,

+                                        int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,

+                                        int alpha_flag, void* pIccTransform, int blend_type)

+{

+    if (blend_type != FXDIB_BLEND_NORMAL) {

+        return FALSE;

+    }

+    return m_PSRenderer.StretchDIBits(pBitmap, color, dest_left, dest_top, dest_width, dest_height, flags, alpha_flag, pIccTransform);

+}

+FX_BOOL	CPSPrinterDriver::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,

+                                      const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,

+                                      int alpha_flag, void* pIccTransform, int blend_type)

+{

+    if (blend_type != FXDIB_BLEND_NORMAL) {

+        return FALSE;

+    }

+    if (bitmap_alpha < 255) {

+        return FALSE;

+    }

+    handle = NULL;

+    return m_PSRenderer.DrawDIBits(pBitmap, color, pMatrix, render_flags, alpha_flag, pIccTransform);

+}

+FX_BOOL	CPSPrinterDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,

+        CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,

+        int alpha_flag, void* pIccTransform)

+{

+    return m_PSRenderer.DrawText(nChars, pCharPos, pFont, pCache, pObject2Device, font_size, color, alpha_flag, pIccTransform);

+}

+#endif

diff --git a/core/src/fxge/win32/win32_int.h b/core/src/fxge/win32/win32_int.h
new file mode 100644
index 0000000..3f940ed
--- /dev/null
+++ b/core/src/fxge/win32/win32_int.h
@@ -0,0 +1,238 @@
+// Copyright 2014 PDFium Authors. All rights reserved.

+// Use of this source code is governed by a BSD-style license that can be

+// found in the LICENSE file.

+ 

+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

+

+struct  WINDIB_Open_Args_;

+class CGdiplusExt

+{

+public:

+    CGdiplusExt();

+    ~CGdiplusExt();

+    void			Load();

+    FX_BOOL			IsAvailable()

+    {

+        return m_hModule != NULL;

+    }

+    FX_BOOL			StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,

+                                   int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags);

+    FX_BOOL			StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,

+                                  int dest_width, int dest_height, const FX_RECT* pClipRect, int flags);

+    FX_BOOL			DrawPath(HDC hDC, const CFX_PathData* pPathData,

+                             const CFX_AffineMatrix* pObject2Device,

+                             const CFX_GraphStateData* pGraphState,

+                             FX_DWORD fill_argb,

+                             FX_DWORD stroke_argb,

+                             int fill_mode

+                      );

+

+    void*			LoadMemFont(FX_BYTE* pData, FX_DWORD size);

+    void			DeleteMemFont(void* pFontCollection);

+    FX_BOOL         GdipCreateFromImage(void* bitmap, void** graphics);

+    void            GdipDeleteGraphics(void* graphics);

+    void            GdipSetTextRenderingHint(void* graphics, int mode);

+    void            GdipSetPageUnit(void* graphics, FX_DWORD unit);

+    void            GdipSetWorldTransform(void* graphics, void* pMatrix);

+    FX_BOOL         GdipDrawDriverString(void *graphics,  unsigned short *text, int length, void *font, void* brush, void *positions, int flags, const void *matrix);

+    void            GdipCreateBrush(FX_DWORD fill_argb, void** pBrush);

+    void            GdipDeleteBrush(void* pBrush);

+    void            GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix);

+    void            GdipDeleteMatrix(void* matrix);

+    FX_BOOL         GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily);

+    void            GdipDeleteFontFamily(void* pFamily);

+    FX_BOOL         GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont);

+    void*           GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle);

+    void            GdipDeleteFont(void* pFont);

+    FX_BOOL         GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap);

+    void            GdipDisposeImage(void* bitmap);

+    void            GdipGetFontSize(void *pFont, FX_FLOAT *size);

+    void*           GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face);

+    FX_BOOL         GdiRemoveFontMemResourceEx(void* handle);

+    void*			m_Functions[100];

+    void*           m_pGdiAddFontMemResourceEx;

+    void*           m_pGdiRemoveFontMemResourseEx;

+    CFX_DIBitmap*	LoadDIBitmap(WINDIB_Open_Args_ args);

+protected:

+    HMODULE			m_hModule;

+    HMODULE         m_GdiModule;

+};

+#include "dwrite_int.h"

+class CWin32Platform : public CFX_Object

+{

+public:

+    FX_BOOL			m_bHalfTone;

+    CGdiplusExt		m_GdiplusExt;

+    CDWriteExt      m_DWriteExt;

+};

+class CGdiDeviceDriver : public IFX_RenderDeviceDriver

+{

+protected:

+    virtual int		GetDeviceCaps(int caps_id);

+    virtual void	SaveState()

+    {

+        SaveDC(m_hDC);

+    }

+    virtual void	RestoreState(FX_BOOL bKeepSaved = FALSE)

+    {

+        RestoreDC(m_hDC, -1);

+        if (bKeepSaved) {

+            SaveDC(m_hDC);

+        }

+    }

+    virtual FX_BOOL	SetClip_PathFill(const CFX_PathData* pPathData,

+                                     const CFX_AffineMatrix* pObject2Device,

+                                     int fill_mode

+                                    );

+    virtual FX_BOOL	SetClip_PathStroke(const CFX_PathData* pPathData,

+                                       const CFX_AffineMatrix* pObject2Device,

+                                       const CFX_GraphStateData* pGraphState

+                                      );

+    virtual FX_BOOL	DrawPath(const CFX_PathData* pPathData,

+                             const CFX_AffineMatrix* pObject2Device,

+                             const CFX_GraphStateData* pGraphState,

+                             FX_DWORD fill_color,

+                             FX_DWORD stroke_color,

+                             int fill_mode,

+                             int alpha_flag,

+                             void* pIccTransform,

+                             int	blend_type

+                            );

+    virtual FX_BOOL FillRect(const FX_RECT* pRect,

+                             FX_DWORD fill_color,

+                             int alpha_flag, void* pIccTransform, int blend_type);

+    virtual FX_BOOL	DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,

+                                     int alpha_flag, void* pIccTransform, int blend_type);

+    virtual FX_LPVOID GetClipRgn() ;

+    virtual FX_BOOL SetClipRgn(FX_LPVOID pRgn) ;

+    virtual FX_BOOL GetClipBox(FX_RECT* pRect);

+    virtual FX_BOOL DeleteDeviceRgn(FX_LPVOID pRgn);

+    virtual void	DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);

+    virtual void*	GetPlatformSurface()

+    {

+        return (void*)m_hDC;

+    }

+    FX_BOOL			GDI_SetDIBits(const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect, int left, int top,

+                                  void* pIccTransform);

+    FX_BOOL			GDI_StretchDIBits(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,

+                                      int dest_width, int dest_height, FX_DWORD flags,

+                                      void* pIccTransform);

+    FX_BOOL			GDI_StretchBitMask(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,

+                                       int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,

+                                       int alpha_flag, void* pIccTransform);

+    HDC				m_hDC;

+    int				m_Width, m_Height, m_nBitsPerPixel;

+    int				m_DeviceClass, m_RenderCaps;

+    CGdiDeviceDriver(HDC hDC, int device_class);

+    ~CGdiDeviceDriver() {}

+};

+class CGdiDisplayDriver : public CGdiDeviceDriver

+{

+public:

+    CGdiDisplayDriver(HDC hDC);

+protected:

+    virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);

+    virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,

+                              int alpha_flag, void* pIccTransform);

+    virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,

+                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,

+                                  int alpha_flag, void* pIccTransform, int blend_type);

+    virtual FX_BOOL	StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,

+                                const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,

+                                int alpha_flag, void* pIccTransform, int blend_type)

+    {

+        return FALSE;

+    }

+    FX_BOOL			UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,

+                                          int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,

+                                          int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);

+};

+class CGdiPrinterDriver : public CGdiDeviceDriver

+{

+public:

+    CGdiPrinterDriver(HDC hDC);

+protected:

+    virtual int		GetDeviceCaps(int caps_id);

+    virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,

+                              int alpha_flag, void* pIccTransform);

+    virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,

+                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,

+                                  int alpha_flag, void* pIccTransform, int blend_type);

+    virtual FX_BOOL	StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,

+                                const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,

+                                int alpha_flag, void* pIccTransform, int blend_type);

+    int				m_HorzSize, m_VertSize;

+    FX_BOOL			m_bSupportROP;

+};

+class CPSOutput : public IFX_PSOutput, public CFX_Object

+{

+public:

+    CPSOutput(HDC hDC);

+    virtual ~CPSOutput();

+    virtual void			Release()

+    {

+        delete this;

+    }

+    void Init();

+    virtual void	OutputPS(FX_LPCSTR string, int len);

+    HDC				m_hDC;

+    FX_LPSTR        m_pBuf;

+};

+class CPSPrinterDriver : public IFX_RenderDeviceDriver

+{

+public:

+    CPSPrinterDriver();

+    FX_BOOL			Init(HDC hDC, int ps_level, FX_BOOL bCmykOutput);

+    ~CPSPrinterDriver();

+protected:

+    virtual FX_BOOL IsPSPrintDriver()

+    {

+        return TRUE;

+    }

+    virtual int		GetDeviceCaps(int caps_id);

+    virtual FX_BOOL	StartRendering();

+    virtual void	EndRendering();

+    virtual void	SaveState();

+    virtual void	RestoreState(FX_BOOL bKeepSaved = FALSE);

+    virtual FX_BOOL	SetClip_PathFill(const CFX_PathData* pPathData,

+                                     const CFX_AffineMatrix* pObject2Device,

+                                     int fill_mode

+                                    );

+    virtual FX_BOOL	SetClip_PathStroke(const CFX_PathData* pPathData,

+                                       const CFX_AffineMatrix* pObject2Device,

+                                       const CFX_GraphStateData* pGraphState

+                                      );

+    virtual FX_BOOL	DrawPath(const CFX_PathData* pPathData,

+                             const CFX_AffineMatrix* pObject2Device,

+                             const CFX_GraphStateData* pGraphState,

+                             FX_DWORD fill_color,

+                             FX_DWORD stroke_color,

+                             int fill_mode,

+                             int alpha_flag,

+                             void* pIccTransform,

+                             int blend_type

+                            );

+    virtual FX_BOOL GetClipBox(FX_RECT* pRect);

+    virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,

+                              int alpha_flag, void* pIccTransform);

+    virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,

+                                  int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,

+                                  int alpha_flag, void* pIccTransform, int blend_type);

+    virtual FX_BOOL	StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,

+                                const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,

+                                int alpha_flag, void* pIccTransform, int blend_type);

+    virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,

+                                   CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,

+                                   int alpha_flag, void* pIccTransform);

+    virtual void*	GetPlatformSurface()

+    {

+        return (void*)m_hDC;

+    }

+    HDC				m_hDC;

+    FX_BOOL			m_bCmykOutput;

+    int				m_Width, m_Height, m_nBitsPerPixel;

+    int				m_HorzSize, m_VertSize;

+    CPSOutput*		m_pPSOutput;

+    CFX_PSRenderer	m_PSRenderer;

+};

+void _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform);

diff --git a/core/src/reflow/autoreflow.cpp b/core/src/reflow/autoreflow.cpp
new file mode 100644
index 0000000..8c37960
--- /dev/null
+++ b/core/src/reflow/autoreflow.cpp
@@ -0,0 +1,781 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "autoreflow.h"
+#define approachto(a,b,c) (FXSYS_fabs((float)((a)-(b)))>(c) ? 0 : 1)
+int FPDF_ProcessInterObj(const CPDF_PageObject* pPrevObj, const CPDF_PageObject* pObj)
+{
+    CFX_AffineMatrix matrix;
+    FX_RECT PreRect = pPrevObj->GetBBox(&matrix);
+    FX_RECT rect = pObj->GetBBox(&matrix);
+    int flag = 0;
+    if(PreRect.top > rect.bottom) {
+        flag = 0;
+    } else if(rect.top > PreRect.bottom) {
+        flag = 1;
+    } else if(PreRect.right < rect.left) {
+        flag = 0;
+    } else if(PreRect.left > rect.right) {
+        flag = 1;
+    } else if(pObj->m_Type != PDFPAGE_TEXT) {
+        flag = 1;
+    } else if(pPrevObj->m_Type != PDFPAGE_TEXT) {
+        flag = 0;
+    } else {
+        if((PreRect.top < rect.top && PreRect.bottom > rect.bottom) ||
+                (PreRect.top > rect.top && PreRect.bottom < rect.bottom)) {
+            if(PreRect.left > rect.left) {
+                flag = 1;
+            } else {
+                flag = 0;
+            }
+        } else {
+            CPDF_TextObject* pPrevTextObj = (CPDF_TextObject* )pPrevObj;
+            CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj;
+            CPDF_TextObjectItem item, prevItem;
+            pPrevTextObj->GetItemInfo(0, &prevItem);
+            pTextObj->GetItemInfo(0, &item);
+            CFX_AffineMatrix TextMatrix;
+            pTextObj->GetTextMatrix(&TextMatrix);
+            FX_FLOAT originX, originY, prevOriginX, preOriginY;
+            TextMatrix.Transform(item.m_OriginX, item.m_OriginY, originX, originY);
+            pPrevTextObj->GetTextMatrix(&TextMatrix);
+            TextMatrix.Transform(prevItem.m_OriginX, prevItem.m_OriginY, prevOriginX, preOriginY);
+            if(preOriginY > originY) {
+                flag = 0;
+            } else {
+                flag = 1;
+            }
+        }
+    }
+    return flag;
+}
+void CPDF_AutoReflowLayoutProvider::Conver2AppreceOrder(const CPDF_PageObjects* pStreamOrderObjs, CPDF_PageObjects* pAppraceOrderObjs)
+{
+    FX_POSITION pos = pStreamOrderObjs->GetFirstObjectPosition();
+    CFX_AffineMatrix matrix;
+    while(pos) {
+        CPDF_PageObject* pObj = pStreamOrderObjs->GetNextObject(pos);
+        CFX_AffineMatrix matrix;
+        if(pObj->m_Type != PDFPAGE_TEXT) {
+            continue;
+        }
+        FX_POSITION pos1 = pAppraceOrderObjs->GetLastObjectPosition();
+        while(pos1) {
+            CPDF_PageObject* pTempObj = pAppraceOrderObjs->GetPrevObject(pos1);
+            if(FPDF_ProcessInterObj(pObj, pTempObj) == 1) {
+                if(!pos1) {
+                    pos1 = pAppraceOrderObjs->GetFirstObjectPosition();
+                } else {
+                    pAppraceOrderObjs->GetNextObject(pos1);
+                }
+                break;
+            }
+        }
+        pAppraceOrderObjs->InsertObject(pos1, pObj);
+    }
+    pos = pStreamOrderObjs->GetFirstObjectPosition();
+    while(pos) {
+        CPDF_PageObject* pObj = pStreamOrderObjs->GetNextObject(pos);
+        if(pObj->m_Type != PDFPAGE_IMAGE) {
+            continue;
+        }
+        FX_POSITION pos1 = pAppraceOrderObjs->GetLastObjectPosition();
+        while(pos1) {
+            CPDF_PageObject* pTempObj = pAppraceOrderObjs->GetPrevObject(pos1);
+            if(FPDF_ProcessInterObj(pObj, pTempObj) == 1) {
+                if(!pos1) {
+                    pos1 = pAppraceOrderObjs->GetFirstObjectPosition();
+                } else {
+                    pAppraceOrderObjs->GetNextObject(pos1);
+                }
+                break;
+            }
+        }
+        pAppraceOrderObjs->InsertObject(pos1, pObj);
+    }
+}
+IPDF_LayoutProvider* IPDF_LayoutProvider::Create_LayoutProvider_AutoReflow(CPDF_PageObjects* pPage, FX_BOOL bReadOrder)
+{
+    return FX_NEW CPDF_AutoReflowLayoutProvider(pPage, bReadOrder);
+}
+CPDF_AutoReflowElement::CPDF_AutoReflowElement(LayoutType layoutType , CPDF_AutoReflowElement* pParent)
+{
+    m_ElmType = layoutType;
+    m_pParentElm = pParent;
+    if(pParent) {
+        pParent->m_ChildArray.Add(this);
+    }
+    m_SpaceBefore = 0;
+}
+CPDF_AutoReflowElement::~CPDF_AutoReflowElement()
+{
+    m_ChildArray.RemoveAll();
+    m_ObjArray.RemoveAll();
+}
+int	CPDF_AutoReflowElement::CountAttrValues(LayoutAttr attr_type)
+{
+    return 1;
+}
+LayoutEnum CPDF_AutoReflowElement::GetEnumAttr(LayoutAttr attr_type, int index )
+{
+    return LayoutInvalid;
+}
+FX_FLOAT	CPDF_AutoReflowElement::GetNumberAttr(LayoutAttr attr_type, int index )
+{
+    switch (attr_type) {
+        case LayoutSpaceBefore:
+            return m_SpaceBefore;
+        default:
+            return 0;
+    }
+}
+FX_COLORREF	CPDF_AutoReflowElement::GetColorAttr(LayoutAttr attr_type, int index )
+{
+    return 0;
+}
+#define WritingMode_UNKNOW	0
+#define WritingMode_LRTB	1
+#define WritingMode_RLTB	2
+#define WritingMode_TBRL	3
+CPDF_AutoReflowLayoutProvider::CPDF_AutoReflowLayoutProvider(CPDF_PageObjects* pPage, FX_BOOL bReadOrder)
+{
+    m_pPDFPage = (CPDF_Page*)pPage;
+    FX_FLOAT width = m_pPDFPage->GetPageWidth();
+    FX_FLOAT height = m_pPDFPage->GetPageHeight();
+    m_pPDFPage->GetDisplayMatrix(m_PDFDisplayMatrix, 0, 0, (int)(m_pPDFPage->GetPageWidth()), (int)(m_pPDFPage->GetPageHeight()), 0);
+    m_bReadOrder = bReadOrder;
+    m_Status = LayoutReady;
+    m_pRoot = NULL;
+    m_pCurrElm = NULL;
+    m_pPreObj = NULL;
+    m_Step = 0;
+    m_WritingMode = WritingMode_UNKNOW;
+}
+CPDF_AutoReflowLayoutProvider::~CPDF_AutoReflowLayoutProvider()
+{
+    m_pPDFPage = NULL;
+    ReleaseElm(m_pRoot);
+}
+void CPDF_AutoReflowLayoutProvider::ReleaseElm(CPDF_AutoReflowElement*& pElm, FX_BOOL bReleaseChildren)
+{
+    if(bReleaseChildren) {
+        int count = pElm->CountChildren();
+        for(int i = 0; i < count; i++) {
+            CPDF_AutoReflowElement* pChild = (CPDF_AutoReflowElement*)pElm->GetChild(i);
+            ReleaseElm(pChild);
+        }
+    }
+    delete pElm;
+    pElm = NULL;
+}
+void CPDF_AutoReflowLayoutProvider::AddObjectArray(CPDF_AutoReflowElement* pElm, CFX_PtrList& ObjList)
+{
+    if(!pElm) {
+        return;
+    }
+    FX_POSITION pos = ObjList.GetHeadPosition();
+    while (pos) {
+        pElm->m_ObjArray.Add((CPDF_PageObject*)ObjList.GetNext(pos));
+    }
+}
+void CPDF_AutoReflowLayoutProvider::GenerateStructTree()
+{
+    if (m_Step < AUTOREFLOW_STEP_GENERATELINE) {
+        GenerateLine(m_cellArray);
+        if(m_cellArray.GetSize() == 0) {
+            m_Status = LayoutError;
+            return;
+        }
+        if(m_pPause && m_pPause->NeedToPauseNow()) {
+            m_Step = AUTOREFLOW_STEP_GENERATELINE;
+            m_Status = LayoutToBeContinued;
+            return;
+        }
+    }
+    if (m_Step < AUTOREFLOW_STEP_GENERATEParagraph) {
+        GenerateParagraph(m_cellArray);
+        if(m_pPause && m_pPause->NeedToPauseNow()) {
+            m_Step = AUTOREFLOW_STEP_GENERATEParagraph;
+            m_Status = LayoutToBeContinued;
+            return;
+        }
+    }
+    if (m_Step < AUTOREFLOW_STEP_CREATEELEMENT) {
+        CreateElement();
+        if(m_pPause && m_pPause->NeedToPauseNow()) {
+            m_Step = AUTOREFLOW_STEP_CREATEELEMENT;
+            m_Status = LayoutToBeContinued;
+            return;
+        }
+    }
+    if (m_Step < AUTOREFLOW_STEP_REMOVEDATA) {
+        int count = m_cellArray.GetSize();
+        for(int i = 0; i < count; i++) {
+            CRF_CELL* pCell = (CRF_CELL*)m_cellArray.GetAt(i);
+            if(pCell) {
+                pCell->m_ObjList.RemoveAll();
+                delete pCell;
+            }
+        }
+        m_cellArray.RemoveAll();
+        if(m_pPause && m_pPause->NeedToPauseNow()) {
+            m_Step = AUTOREFLOW_STEP_REMOVEDATA;
+            m_Status = LayoutToBeContinued;
+            return;
+        }
+    }
+    m_Step = AUTOREFLOW_STEP_REMOVEDATA;
+    m_Status = LayoutFinished;
+    return;
+}
+void CPDF_AutoReflowLayoutProvider::CreateElement()
+{
+    int count = m_cellArray.GetSize();
+    CRF_CELL* plastCell = NULL;
+    CRF_CELL* pCell = NULL;
+    CRF_CELL* pNextCell = NULL;
+    CPDF_AutoReflowElement* pParent = m_pRoot;
+    CPDF_AutoReflowElement* pCurrElm = NULL;
+    int i;
+    for(i = 0; i < count; i++) {
+        pCell = (CRF_CELL*)m_cellArray.GetAt(i);
+        if(!pCell) {
+            continue;
+        }
+        if(i < count - 1) {
+            pNextCell = (CRF_CELL*)m_cellArray.GetAt(i + 1);
+        } else {
+            pNextCell = NULL;
+        }
+        pCurrElm = NULL;
+        pCurrElm = FX_NEW CPDF_AutoReflowElement(LayoutParagraph, pParent);
+        if(pCurrElm->GetType() == LayoutParagraph && plastCell) {
+            int SpaceBefore = 0;
+            if(pCell->m_CellWritingMode != plastCell->m_CellWritingMode ) {
+                SpaceBefore = 20;
+            } else if(pCell->m_CellWritingMode == WritingMode_LRTB) {
+                SpaceBefore = plastCell->m_BBox.bottom - pCell->m_BBox.top;
+            } else if(pCell->m_CellWritingMode == WritingMode_TBRL) {
+                SpaceBefore = plastCell->m_BBox.left - pCell->m_BBox.right;
+            }
+            if(SpaceBefore > 0) {
+                pCurrElm->m_SpaceBefore = SpaceBefore > 50 ? 50.0f : SpaceBefore;
+            }
+        }
+        AddObjectArray(pCurrElm, pCell->m_ObjList);
+        plastCell = pCell;
+    }
+}
+void CPDF_AutoReflowLayoutProvider::GenerateParagraph(CFX_PtrArray& cellArray)
+{
+    int count = cellArray.GetSize();
+    if(count <= 1) {
+        return;
+    }
+    CRF_CELL* plastCell = (CRF_CELL*)cellArray.GetAt(0);
+    if(plastCell->m_BBox.Height() > plastCell->m_BBox.Width()) {
+        m_WritingMode = WritingMode_TBRL;
+    } else {
+        m_WritingMode = WritingMode_LRTB;
+    }
+    FX_BOOL bEnforce = FALSE;
+    int i = 0;
+    for(i = 1; i < count; i++) {
+        CRF_CELL* pCell = (CRF_CELL*)cellArray.GetAt(i);
+        if(!pCell) {
+            continue;
+        }
+        int c = pCell->m_ObjList.GetCount();
+        FX_BOOL bMerge = FALSE;
+        FX_POSITION pos1 = plastCell->m_ObjList.GetTailPosition();
+        CPDF_PageObject* pLastObj = (CPDF_PageObject*)plastCell->m_ObjList.GetPrev(pos1);
+        pos1 = pCell->m_ObjList.GetHeadPosition();
+        CPDF_PageObject* pCurObj = (CPDF_PageObject*)pCell->m_ObjList.GetNext(pos1);
+        int WritingMode = GetRectEnd(pCell->m_BBox);
+        if(pCell->m_CellWritingMode == WritingMode_UNKNOW) {
+            if(pCell->m_BBox.Height() > pCell->m_BBox.Width()) {
+                pCell->m_CellWritingMode = WritingMode_TBRL;
+            } else {
+                pCell->m_CellWritingMode = WritingMode_LRTB;
+            }
+        }
+        WritingMode = pCell->m_CellWritingMode;
+        if(WritingMode == WritingMode_LRTB && (m_Style.m_Language & LP_Lang_ChinesePRC || m_Style.m_Language & LP_Lang_ChineseTaiwan
+                                               || m_Style.m_Language & LP_Lang_Japanese || m_Style.m_Language & LP_Lang_Korean)) {
+            if(pCurObj->m_Type == PDFPAGE_TEXT) {
+                CPDF_TextObject* pText;
+                pText = (CPDF_TextObject*)pCurObj;
+                if(pText->CountItems()) {
+                    CPDF_TextObjectItem item;
+                    pText->GetItemInfo(0, &item);
+                    CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+                    FX_WCHAR unicode = str.GetAt(0);
+                    if(unicode == 32) {
+                        plastCell = pCell;
+                        bMerge = FALSE;
+                        bEnforce = FALSE;
+                        continue;
+                    }
+                }
+            }
+        }
+        if(m_WritingMode == WritingMode) {
+            if(bEnforce) {
+                bMerge = FALSE;
+                bEnforce = FALSE;
+                if(pCurObj->m_Type == PDFPAGE_TEXT) {
+                    CPDF_TextObject* pText;
+                    pText = (CPDF_TextObject*)pCurObj;
+                    if(pText->CountItems()) {
+                        CPDF_TextObjectItem item;
+                        pText->GetItemInfo(0, &item);
+                        CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+                        FX_WCHAR unicode = str.GetAt(0);
+                        if(unicode > 96 && unicode < 123) {
+                            bMerge = TRUE;
+                        }
+                    }
+                } else {
+                    CPDF_ImageObject* pImage = (CPDF_ImageObject*)pCurObj;
+                    FX_RECT imageBBox = pImage->GetBBox(&m_PDFDisplayMatrix);
+                    if(GetRectEnd(plastCell->m_BBox) - GetRectEnd(pCell->m_BBox) < GetRectWidth(imageBBox)) {
+                        bMerge = TRUE;
+                    }
+                }
+            } else {
+                if(!approachto(GetRectStart(pCell->m_BBox), GetRectStart(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) / 4)) {
+                    if(approachto(GetRectStart(plastCell->m_BBox), GetRectStart(pCell->m_BBox), GetRectHeight(pCell->m_BBox) * 2.3) &&
+                            GetRectStart(plastCell->m_BBox) - GetRectStart(pCell->m_BBox) > 0) {
+                        if(pCurObj->m_Type == PDFPAGE_TEXT || pLastObj->m_Type == PDFPAGE_TEXT) {
+                            CPDF_TextObject* pText;
+                            if(pCurObj->m_Type == PDFPAGE_TEXT) {
+                                pText = (CPDF_TextObject*)pCurObj;
+                            } else {
+                                pText = (CPDF_TextObject*)pLastObj;
+                            }
+                            CPDF_TextObjectItem item;
+                            pText->GetItemInfo(0, &item);
+                            CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+                            FX_WCHAR unicode = str.GetAt(0);
+                            if(unicode > 255) {
+                                bMerge = TRUE;
+                            }
+                        }
+                    }
+                } else if(!approachto(GetRectEnd(pCell->m_BBox), GetRectEnd(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) * 3)) {
+                    FX_RECT rect = pLastObj->GetBBox(&m_PDFDisplayMatrix);
+                    if(approachto(GetRectStart(pCell->m_BBox), GetRectStart(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) / 4)) {
+                        if(GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) > 0) {
+                            bMerge = TRUE;
+                            bEnforce = TRUE;
+                        } else if(GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) <= 0 &&
+                                  GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) > GetRectHeight(pCell->m_BBox) * -3) {
+                            if(pCurObj->m_Type == PDFPAGE_TEXT) {
+                                CPDF_TextObject* pText = (CPDF_TextObject*)pCurObj;
+                                CPDF_TextObjectItem item;
+                                pText->GetItemInfo(0, &item);
+                                CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+                                FX_WCHAR unicode = str.GetAt(0);
+                                if(unicode > 96 && unicode < 123) {
+                                    bMerge = TRUE;
+                                }
+                            }
+                        }
+                    }
+                } else {
+                    bMerge = TRUE;
+                }
+            }
+        } else {
+            m_WritingMode = WritingMode;
+            bEnforce = FALSE;
+        }
+        if(bMerge) {
+            if(GetRectEnd(plastCell->m_BBox) - GetRectEnd(pCell->m_BBox) > 30) {
+                bEnforce = TRUE;
+            }
+            FX_POSITION pos = pCell->m_ObjList.GetHeadPosition();
+            while(pos) {
+                plastCell->m_ObjList.AddTail(pCell->m_ObjList.GetNext(pos));
+            }
+            plastCell->m_BBox.Union(pCell->m_BBox);
+            pCell->m_ObjList.RemoveAll();
+            delete pCell;
+            cellArray.RemoveAt(i);
+            i--;
+            count--;
+        } else {
+            plastCell = pCell;
+        }
+    }
+}
+void CPDF_AutoReflowLayoutProvider::ProcessObj(CFX_PtrArray& cellArray, CPDF_PageObject* pObj, CFX_AffineMatrix matrix)
+{
+}
+FX_INT32 CPDF_AutoReflowLayoutProvider::LogicPreObj(CPDF_PageObject* pObj)
+{
+    CPDF_PageObject* pPreObj = m_pPreObj;
+    m_pPreObj = pObj;
+    if(!pPreObj) {
+        return 0;
+    }
+    if(pPreObj->m_Type != pObj->m_Type) {
+        return 0;
+    }
+    CFX_FloatRect rcCurObj(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+    CFX_FloatRect rcPreObj(pPreObj->m_Left, pPreObj->m_Bottom, pPreObj->m_Right, pPreObj->m_Top);
+    if(pObj->m_Type == PDFPAGE_IMAGE) {
+        if(rcPreObj.Contains(rcCurObj)) {
+            return 2;
+        }
+        if(rcCurObj.Contains(rcPreObj)) {
+            return 2;
+        }
+        return 0;
+    }
+    if(pObj->m_Type == PDFPAGE_TEXT) {
+        if(!((rcPreObj.bottom > rcCurObj.top) || (rcPreObj.top < rcCurObj.bottom))) {
+            FX_FLOAT height = FX_MIN(rcPreObj.Height(), rcCurObj.Height());
+            if((rcCurObj.left - rcPreObj.right) > height / 3) {
+                return 3;
+            }
+        }
+        if(FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) >= 2 || FXSYS_fabs(rcPreObj.Height() - rcCurObj.Height()) >= 2 ) {
+            return 0;
+        }
+        CPDF_TextObject* pPreTextObj = (CPDF_TextObject*)pPreObj;
+        CPDF_TextObject* pCurTextObj = (CPDF_TextObject*)pObj;
+        int nPreCount = pPreTextObj->CountItems();
+        int nCurCount = pCurTextObj->CountItems();
+        if (nPreCount != nCurCount) {
+            return 0;
+        }
+        FX_BOOL bSame = TRUE;
+        for (int i = 0; i < nPreCount; i++) {
+            CPDF_TextObjectItem itemPer, itemCur;
+            pPreTextObj->GetItemInfo(i, &itemPer);
+            pCurTextObj->GetItemInfo(i, &itemCur);
+            if (itemCur.m_CharCode != itemPer.m_CharCode) {
+                return 0;
+            }
+            if (itemCur.m_OriginX != itemPer.m_OriginX) {
+                bSame = FALSE;
+            }
+            if (itemCur.m_OriginY != itemPer.m_OriginY) {
+                bSame = FALSE;
+            }
+        }
+        if(rcPreObj.left == rcCurObj.left && rcPreObj.top == rcCurObj.top) {
+            return 1;
+        }
+        if(FXSYS_fabs(rcPreObj.left - rcCurObj.left) < rcPreObj.Width() / 3
+                && FXSYS_fabs(rcPreObj.top - rcCurObj.top) < rcPreObj.Height() / 3) {
+            return 2;
+        }
+    }
+    return 0;
+}
+void CPDF_AutoReflowLayoutProvider::GenerateLine(CFX_PtrArray& cellArray)
+{
+    CRF_CELL* pCell = NULL;
+    CFX_AffineMatrix matrix;
+    FX_POSITION pos = m_pPDFPage->GetFirstObjectPosition();
+    if(!pos) {
+        return;
+    }
+    FX_FLOAT PDFWidth = m_pPDFPage->GetPageWidth();
+    FX_FLOAT PDFHeight = m_pPDFPage->GetPageHeight();
+    m_pPDFPage->GetDisplayMatrix(m_PDFDisplayMatrix, 0, 0, (int)PDFWidth, (int)PDFHeight, 0);
+    CPDF_PageObject* pPerObj = NULL;
+    int a = 0;
+    CFX_FloatRect pageBBox = m_pPDFPage->m_BBox;
+    FX_FLOAT PrevX = 0 , PrevY = 0, PosX, PosY;
+    while(pos) {
+        CPDF_PageObject* pObj = m_pPDFPage->GetNextObject(pos);
+        if(!pObj || pObj->m_Type == PDFPAGE_PATH) {
+            continue;
+        }
+        int logic = LogicPreObj(pObj);
+        if(logic == 2) {
+            if(pCell) {
+                pCell->m_ObjList.SetAt(pCell->m_ObjList.GetTailPosition(), pObj);
+            }
+            continue;
+        }
+        if (pObj->m_Type == PDFPAGE_TEXT) {
+            CPDF_TextObject* pTextObj = (CPDF_TextObject*)pObj;
+            int textmode = pTextObj->m_TextState.GetObject()->m_TextMode;
+            if(m_Style.m_bIgnoreInvisibleText && pTextObj->m_TextState.GetObject()->m_TextMode == 3) {
+                continue;
+            }
+            PosX = pTextObj->GetPosX();
+            PosY = pTextObj->GetPosY();
+            m_PDFDisplayMatrix.Transform(PosX, PosY);
+        } else {
+            PosX = 0;
+            PosY = 0;
+        }
+        FX_BOOL bNewLine = TRUE;
+        FX_RECT ObjBBox = pObj->GetBBox(&m_PDFDisplayMatrix);
+        if(ObjBBox.left > PDFWidth || ObjBBox.right < 0 ||
+                ObjBBox.bottom < 0 || ObjBBox.top > PDFHeight) {
+            continue;
+        }
+        if(ObjBBox.IsEmpty()) {
+            continue;
+        }
+        a++;
+        if(!pCell) {
+            bNewLine = TRUE;
+            m_WritingMode = GetWritingMode(NULL, pObj);
+        } else {
+            int WritingMode = GetWritingMode(pPerObj, pObj);
+            if(m_WritingMode == WritingMode || m_WritingMode == WritingMode_UNKNOW || WritingMode == WritingMode_UNKNOW) {
+                if(WritingMode != WritingMode_UNKNOW) {
+                    m_WritingMode = WritingMode;
+                }
+                if(m_WritingMode == WritingMode_TBRL) {
+                    if(!(GetRectBottom(ObjBBox) > GetRectTop(pCell->m_BBox) ||
+                            GetRectTop(ObjBBox) < GetRectBottom(pCell->m_BBox))) {
+                        bNewLine = FALSE;
+                    }
+                } else {
+                    if(!(GetRectBottom(ObjBBox) < GetRectTop(pCell->m_BBox) ||
+                            GetRectTop(ObjBBox) > GetRectBottom(pCell->m_BBox))) {
+                        bNewLine = FALSE;
+                    }
+                    if (pObj->m_Type == PDFPAGE_TEXT) {
+                        if(FXSYS_fabs(PrevY - PosY) < 1 ) {
+                            bNewLine = FALSE;
+                        }
+                    }
+                }
+            } else {
+                m_WritingMode = WritingMode;
+            }
+        }
+        pPerObj = pObj;
+        if(bNewLine) {
+            int c = pCell ? pCell->m_ObjList.GetCount() : 0;
+            pCell = FX_NEW CRF_CELL;
+            pCell->m_CellWritingMode = m_WritingMode;
+            pCell->m_BBox = ObjBBox;
+            if(pObj->m_Type == PDFPAGE_TEXT) {
+                FX_FLOAT x = ((CPDF_TextObject*)pObj)->GetPosX(), y = ((CPDF_TextObject*)pObj)->GetPosY();
+                m_PDFDisplayMatrix.Transform(x, y);
+                if(x < ObjBBox.left) {
+                    pCell->m_BBox.left = (int)x;
+                }
+            }
+            pCell->m_ObjList.AddTail(pObj);
+            cellArray.Add(pCell);
+        } else {
+            pCell->m_ObjList.AddTail(pObj);
+            pCell->m_BBox.Union(ObjBBox);
+        }
+        PrevX = PosX;
+        PrevY = PosY;
+    }
+}
+FX_FLOAT CPDF_AutoReflowLayoutProvider::GetLayoutOrderHeight(CPDF_PageObject* pCurObj)
+{
+    CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top);
+    if (m_WritingMode == WritingMode_TBRL) {
+        return rcCurObj.Width();
+    }
+    return rcCurObj.Height();
+}
+FX_FLOAT CPDF_AutoReflowLayoutProvider::GetLayoutOrderWidth(CPDF_PageObject* pCurObj)
+{
+    CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top);
+    if (m_WritingMode == WritingMode_TBRL) {
+        return rcCurObj.Height();
+    }
+    return rcCurObj.Width();
+}
+int CPDF_AutoReflowLayoutProvider:: GetRectWidth(FX_RECT rect)
+{
+    if(m_WritingMode == WritingMode_TBRL) {
+        return rect.Height();
+    }
+    return rect.Width();
+}
+int CPDF_AutoReflowLayoutProvider:: GetRectHeight(FX_RECT rect)
+{
+    if(m_WritingMode == WritingMode_TBRL) {
+        return rect.Width();
+    }
+    return rect.Height();
+}
+int CPDF_AutoReflowLayoutProvider:: GetRectStart(FX_RECT rect)
+{
+    if(m_WritingMode == WritingMode_TBRL) {
+        return rect.top;
+    }
+    return rect.left;
+}
+int CPDF_AutoReflowLayoutProvider:: GetRectEnd(FX_RECT rect)
+{
+    if(m_WritingMode == WritingMode_TBRL) {
+        return rect.bottom;
+    }
+    return rect.right;
+}
+int CPDF_AutoReflowLayoutProvider:: GetRectTop(FX_RECT rect)
+{
+    if(m_WritingMode == WritingMode_TBRL) {
+        return rect.right;
+    }
+    return rect.top;
+}
+int CPDF_AutoReflowLayoutProvider:: GetRectBottom(FX_RECT rect)
+{
+    if(m_WritingMode == WritingMode_TBRL) {
+        return rect.left;
+    }
+    return rect.bottom;
+}
+int CPDF_AutoReflowLayoutProvider::GetWritingMode(CPDF_PageObject* pPreObj, CPDF_PageObject* pCurObj)
+{
+    CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top);
+    if(pCurObj->m_Type == PDFPAGE_TEXT) {
+        CPDF_TextObject* ptextObj = (CPDF_TextObject* )pCurObj;
+        int count = ptextObj->CountItems();
+        if(count > 1) {
+            CPDF_TextObjectItem Item1, Item2;
+            ptextObj->GetItemInfo(0, &Item1);
+            ptextObj->GetItemInfo(count - 1, &Item2);
+            if(Item2.m_CharCode == -1 && count > 2) {
+                ptextObj->GetItemInfo(2, &Item2);
+            }
+            CFX_AffineMatrix textMatrix;
+            ptextObj->GetTextMatrix(&textMatrix);
+            textMatrix.Transform(Item1.m_OriginX, Item1.m_OriginY);
+            textMatrix.Transform(Item2.m_OriginX, Item2.m_OriginY);
+            FX_FLOAT dx = FXSYS_fabs(Item1.m_OriginX - Item2.m_OriginX);
+            FX_FLOAT dy = FXSYS_fabs(Item1.m_OriginY - Item2.m_OriginY);
+            return dx >= dy ? WritingMode_LRTB : WritingMode_TBRL;
+        } else {
+            if(m_WritingMode != WritingMode_UNKNOW) {
+                return m_WritingMode;
+            }
+        }
+    }
+    if(pPreObj) {
+        FX_FLOAT threshold = rcCurObj.Width() / 4;
+        if(m_WritingMode == WritingMode_LRTB) {
+            if(FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) < threshold * 2
+                    && FXSYS_fabs(pPreObj->m_Top - pCurObj->m_Top) < threshold * 2) {
+                return m_WritingMode;
+            }
+            FX_FLOAT mid = (pCurObj->m_Bottom + pCurObj->m_Top) / 2;
+            if(mid > pPreObj->m_Bottom && mid < pPreObj->m_Top && pCurObj->m_Right > pPreObj->m_Right) {
+                return m_WritingMode;
+            }
+        } else if(m_WritingMode == WritingMode_TBRL) {
+            if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) < threshold * 2
+                    && FXSYS_fabs(pPreObj->m_Right - pCurObj->m_Right) < threshold * 2) {
+                return m_WritingMode;
+            }
+            FX_FLOAT mid = (pCurObj->m_Right + pCurObj->m_Left) / 2;
+            if(mid > pPreObj->m_Left && mid < pPreObj->m_Right && pCurObj->m_Bottom < pPreObj->m_Bottom) {
+                return m_WritingMode;
+            }
+        }
+        if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) < threshold &&
+                FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) > threshold * 2) {
+            return WritingMode_TBRL;
+        }
+        if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) > threshold &&
+                FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) < threshold * 2) {
+            return WritingMode_LRTB;
+        }
+        int count = 0;
+        if(pPreObj->m_Type == PDFPAGE_TEXT) {
+            CPDF_TextObject* ptextObj = (CPDF_TextObject* )pCurObj;
+            count = ptextObj->CountItems();
+        }
+        if(pPreObj->m_Type != PDFPAGE_TEXT || count == 1) {
+            if(pCurObj->m_Left > pPreObj->m_Right) {
+                FX_FLOAT mid = (pCurObj->m_Top + pCurObj->m_Bottom) / 2;
+                if(mid < pPreObj->m_Top && mid > pPreObj->m_Bottom) {
+                    return WritingMode_LRTB;
+                }
+            }
+            if(pCurObj->m_Top < pPreObj->m_Bottom) {
+                FX_FLOAT mid = (pCurObj->m_Left + pCurObj->m_Right) / 2;
+                if(mid < pPreObj->m_Right && mid > pPreObj->m_Left) {
+                    return WritingMode_TBRL;
+                }
+            }
+        }
+    }
+    return WritingMode_UNKNOW;
+}
+LayoutStatus CPDF_AutoReflowLayoutProvider::StartLoad(IFX_Pause* pPause)
+{
+    m_pPause = pPause;
+    m_pRoot = FX_NEW CPDF_AutoReflowElement(LayoutDocument);
+    if(!m_pRoot) {
+        return LayoutError;
+    }
+    m_Step = 0;
+    return Continue();
+}
+LayoutStatus CPDF_AutoReflowLayoutProvider::Continue()
+{
+    GenerateStructTree();
+    return m_Status;
+}
+int	CPDF_AutoReflowLayoutProvider::GetPosition()
+{
+    if(m_Step == 0) {
+        return 0;
+    } else {
+        return m_Step * 100 / AUTOREFLOW_STEP_REMOVEDATA;
+    }
+}
+FX_FLOAT CPDF_AutoReflowLayoutProvider::GetObjMinCell(CPDF_PageObject* pObj)
+{
+    if(!pObj) {
+        return 0;
+    }
+    if(pObj->m_Type != PDFPAGE_TEXT) {
+        CFX_AffineMatrix matrix;
+        FX_RECT rect = pObj->GetBBox(&matrix);
+        return (FX_FLOAT)(rect.Width());
+    }
+    CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj;
+    int count = pTextObj->CountItems();
+    for(int i = 0; i < count; i++) {
+        CPDF_TextObjectItem Item;
+        pTextObj->GetItemInfo(i, &Item);
+        if(Item.m_CharCode == -1) {
+            continue;
+        }
+        if((Item.m_CharCode > 47 && Item.m_CharCode < 58) || (Item.m_CharCode > 64 && Item.m_CharCode < 91)
+                || (Item.m_CharCode > 96 && Item.m_CharCode < 123)) {
+            continue;
+        }
+        if(Item.m_CharCode > 127 || (Item.m_CharCode > 32 && Item.m_CharCode < 35) || Item.m_CharCode == 37 ||
+                (Item.m_CharCode > 38 && Item.m_CharCode < 42) || Item.m_CharCode == 44 || Item.m_CharCode == 46 ||
+                Item.m_CharCode == 58 || Item.m_CharCode == 59 || Item.m_CharCode == 63 || Item.m_CharCode == 93) {
+            if(i == count - 1) {
+                CFX_AffineMatrix matrix;
+                FX_RECT rect = pObj->GetBBox(&matrix);
+                return (FX_FLOAT)(rect.Width());
+            } else {
+                pTextObj->GetItemInfo(i + 1, &Item);
+                return Item.m_OriginX;
+            }
+        }
+        return Item.m_OriginX;
+    }
+    CFX_AffineMatrix matrix;
+    FX_RECT rect = pObj->GetBBox(&matrix);
+    return (FX_FLOAT)(rect.Width());
+}
diff --git a/core/src/reflow/autoreflow.h b/core/src/reflow/autoreflow.h
new file mode 100644
index 0000000..d98f33b
--- /dev/null
+++ b/core/src/reflow/autoreflow.h
@@ -0,0 +1,122 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _AUTOREFLOW_H
+#define _AUTOREFLOW_H
+#include "../../include/reflow/reflowengine.h"
+#include "reflowedpage.h"
+class CPDF_AutoReflowElement;
+class CPDF_AutoReflowLayoutProvider;
+typedef CFX_ArrayTemplate<CPDF_AutoReflowElement*> CAR_ElmPtrArray;
+typedef CFX_ArrayTemplate<CPDF_PageObject*> CAR_ObjPtrArray;
+class CRF_CELL : public CFX_Object
+{
+public:
+    CRF_CELL() { };
+    ~CRF_CELL() { };
+    CFX_PtrList		m_ObjList;
+    int			m_CellWritingMode;
+    FX_RECT		m_BBox;
+};
+class CPDF_AutoReflowElement : public IPDF_LayoutElement, public CFX_Object
+{
+public:
+    CPDF_AutoReflowElement(LayoutType layoutType = LayoutUnknown , CPDF_AutoReflowElement* pParent = NULL) ;
+    ~CPDF_AutoReflowElement();
+    LayoutType GetType()
+    {
+        return m_ElmType;
+    }
+    void	GetRect(CFX_FloatRect& rcRect) {};
+
+    int  CountAttrValues(LayoutAttr attr_type);
+    LayoutEnum  GetEnumAttr(LayoutAttr attr_type, int index);
+    FX_FLOAT GetNumberAttr(LayoutAttr attr_type, int index);
+    FX_COLORREF GetColorAttr(LayoutAttr attr_type, int index);
+
+    int  CountChildren()
+    {
+        return m_ChildArray.GetSize();
+    }
+    IPDF_LayoutElement* GetChild(int index)
+    {
+        return m_ChildArray.GetAt(index);
+    }
+
+    IPDF_LayoutElement* GetParent()
+    {
+        return m_pParentElm;
+    }
+    int		CountObjects()
+    {
+        return m_ObjArray.GetSize();
+    }
+    CPDF_PageObject*	GetObject(int index)
+    {
+        return m_ObjArray.GetAt(index);
+    }
+    CPDF_AutoReflowElement* m_pParentElm;
+    LayoutType		m_ElmType;
+    CAR_ElmPtrArray m_ChildArray;
+    CAR_ObjPtrArray m_ObjArray;
+    FX_FLOAT		m_SpaceBefore;
+};
+#define AUTOREFLOW_STEP_GENERATELINE		1
+#define AUTOREFLOW_STEP_GENERATEParagraph	2
+#define AUTOREFLOW_STEP_CREATEELEMENT		3
+#define AUTOREFLOW_STEP_REMOVEDATA			4
+class CPDF_AutoReflowLayoutProvider : public IPDF_LayoutProvider, public CFX_Object
+{
+public:
+    CPDF_AutoReflowLayoutProvider(CPDF_PageObjects* pPage, FX_BOOL bReadOrder);
+    ~CPDF_AutoReflowLayoutProvider();
+    void	SetLayoutProviderStyle(LAYOUTPROVIDER_STYLE Style)
+    {
+        m_Style = Style;
+    }
+    LayoutStatus StartLoad(IFX_Pause* pPause = NULL);
+    LayoutStatus Continue();
+    int	 		GetPosition();
+    IPDF_LayoutElement* GetRoot()
+    {
+        return m_pRoot;
+    }
+    FX_FLOAT GetObjMinCell(CPDF_PageObject* pObj);
+    void Conver2AppreceOrder(const CPDF_PageObjects* pStreamOrderObjs, CPDF_PageObjects* pAppraceOrderObjs);
+    void	ReleaseElm(CPDF_AutoReflowElement*& pElm, FX_BOOL bReleaseChildren = TRUE);
+    void GenerateCell();
+    void GenerateStructTree();
+    void GenerateLine(CFX_PtrArray& cellArray);
+    void GenerateParagraph(CFX_PtrArray& cellArray);
+    void CreateElement();
+    void AddObjectArray(CPDF_AutoReflowElement* pElm, CFX_PtrList& ObjList);
+    FX_FLOAT GetLayoutOrderHeight(CPDF_PageObject* pCurObj);
+    FX_FLOAT GetLayoutOrderWidth(CPDF_PageObject* pCurObj);
+    int GetWritingMode(CPDF_PageObject* pPreObj, CPDF_PageObject* pCurObj);
+    int GetRectStart(FX_RECT rect);
+    int GetRectEnd(FX_RECT rect);
+    int GetRectTop(FX_RECT rect);
+    int GetRectBottom(FX_RECT rect);
+    int GetRectHeight(FX_RECT rect);
+    int GetRectWidth(FX_RECT rect);
+    void ProcessObj(CFX_PtrArray& cellArray, CPDF_PageObject* pObj, CFX_AffineMatrix matrix);
+    FX_INT32 LogicPreObj(CPDF_PageObject* pObj);
+
+    CPDF_AutoReflowElement* m_pRoot;
+    CPDF_AutoReflowElement* m_pCurrElm;
+    CPDF_Page*	m_pPDFPage;
+    IFX_Pause*	m_pPause;
+    CFX_AffineMatrix m_PDFDisplayMatrix;
+    CPDF_PageObject* m_pPreObj;
+    LayoutStatus m_Status;
+    int m_WritingMode;
+    CFX_PtrArray m_CellArray;
+    FX_BOOL		 m_bReadOrder;
+    LAYOUTPROVIDER_STYLE m_Style;
+    CFX_PtrArray m_cellArray;
+    int			m_Step;
+};
+#endif
diff --git a/core/src/reflow/layoutprocessor_reflow.cpp b/core/src/reflow/layoutprocessor_reflow.cpp
new file mode 100644
index 0000000..d2fa7e9
--- /dev/null
+++ b/core/src/reflow/layoutprocessor_reflow.cpp
@@ -0,0 +1,1560 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/reflow/reflowengine.h"
+#include "reflowedpage.h"
+#include "layoutprovider_taggedpdf.h"
+IPDF_LayoutProcessor* IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, void* pReflowedPage, int flags, FX_FLOAT lineSpace )
+{
+    if(pReflowedPage == NULL || fWidth <= 20) {
+        return NULL;
+    }
+    CPDF_LayoutProcessor_Reflow* pReflowEngine = FX_NEW CPDF_LayoutProcessor_Reflow();
+    if (NULL == pReflowEngine) {
+        return NULL;
+    }
+    pReflowEngine->Init(TopIndent, fWidth, fHeight, (CPDF_ReflowedPage*)pReflowedPage, flags, lineSpace);
+    return pReflowEngine;
+}
+CPDF_LayoutProcessor_Reflow::CPDF_LayoutProcessor_Reflow()
+{
+    m_pPause = NULL;
+    m_pLayoutElement = NULL;
+    m_fRefWidth = 0;
+    m_fRefWidth = 0;
+    m_fCurrLineWidth = 0;
+    m_fCurrLineHeight = 0;
+    m_bIllustration = FALSE;
+    m_pPreObj = NULL;
+    m_pCurrLine = FX_NEW CRF_DataPtrArray(50);
+    m_pTempLine = FX_NEW CRF_DataPtrArray(50);
+    m_StartIndent = 0;
+    m_PausePosition = 0;
+}
+CPDF_LayoutProcessor_Reflow::~CPDF_LayoutProcessor_Reflow()
+{
+    if (m_pCurrLine) {
+        m_pCurrLine->RemoveAll();
+        delete m_pCurrLine;
+    }
+    m_pCurrLine = NULL;
+    if (m_pTempLine) {
+        m_pTempLine->RemoveAll();
+        delete m_pTempLine;
+    }
+    m_pTempLine = NULL;
+}
+void CPDF_LayoutProcessor_Reflow::Init(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, CPDF_ReflowedPage* pReflowedPage, int flags, FX_FLOAT lineSpace)
+{
+    m_pLayoutElement = NULL;
+    m_TopIndent = TopIndent;
+    m_Status = LayoutReady;
+    m_flags = flags;
+    m_pReflowedPage = pReflowedPage;
+    m_fScreenHeight = fHeight;
+    m_fRefWidth = fWidth;
+    m_fCurrLineHeight = 0;
+    m_fCurrLineWidth = 0;
+    m_fLineSpace = lineSpace;
+    pReflowedPage->m_PageWidth = fWidth;
+    pReflowedPage->m_PageHeight = TopIndent;
+}
+void CPDF_LayoutProcessor_Reflow::FitPageMode()
+{
+    if(m_flags & RF_PARSER_PAGEMODE && m_fScreenHeight > 20) {
+        float fitPageHeight = m_fScreenHeight;
+        CPDF_ReflowedPage* pRFPage = m_pReflowedPage;
+        int count = pRFPage->m_pReflowed->GetSize();
+        CFX_WordArray dy;
+        dy.Add(0);
+        int pos = 0;
+        int screenCount = 1;
+        FX_FLOAT h = pRFPage->GetPageHeight();
+        while (h > screenCount * fitPageHeight) {
+            FX_FLOAT tempPageHeight = screenCount * fitPageHeight;
+            int j = 0;
+            FX_FLOAT tempDy = 0;
+            for(int i = 0; i < count; i++) {
+                CRF_Data* pData = (*pRFPage->m_pReflowed)[i];
+                FX_FLOAT posY;
+                posY = pData->m_PosY;
+                if(FXSYS_fabs(posY) > tempPageHeight &&
+                        FXSYS_fabs(posY + pData->m_Height) < tempPageHeight) {
+                    if(j == 0) {
+                        j = i;
+                    }
+                    if(pData->m_Height > fitPageHeight) {
+                        FX_FLOAT zoom;
+                        FX_FLOAT spaceh = screenCount * fitPageHeight + posY + pData->m_Height;
+                        if(spaceh < fitPageHeight / 3 * 2) {
+                            spaceh = fitPageHeight;
+                        }
+                        zoom = spaceh / pData->m_Height;
+                        tempDy = spaceh - pData->m_Height;
+                        pData->m_Height = spaceh;
+                        pData->m_Width *= zoom;
+                        break;
+                    }
+                    FX_FLOAT dy = pData->m_PosY + pData->m_Height + tempPageHeight;
+                    if(dy > tempDy) {
+                        tempDy = dy;
+                    }
+                } else if(FXSYS_fabs(posY + pData->m_Height) > tempPageHeight) {
+                    break;
+                }
+            }
+            for(; j < count; j++) {
+                CRF_Data* pData = (*pRFPage->m_pReflowed)[j];
+                FX_FLOAT posY;
+                posY = pData->m_PosY;
+                if(FXSYS_fabs(posY) > tempPageHeight ) {
+                    pData->m_PosY -= tempDy;
+                }
+                if(pData->m_Height >= fitPageHeight) {
+                    pData->m_Height = fitPageHeight - 1;
+                    if(pData->GetType() == CRF_Data::Text) {
+                        CRF_CharData* pCharData = (CRF_CharData*)pData;
+                        pCharData->m_pCharState->m_fFontSize = pData->m_Height;
+                    }
+                }
+            }
+            pRFPage->m_PageHeight += tempDy;
+            h += tempDy;
+            screenCount++;
+        }
+    }
+}
+LayoutStatus CPDF_LayoutProcessor_Reflow::StartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix)
+{
+    if(!pElement) {
+        return LayoutError;
+    }
+    m_pPause = pPause;
+    m_PDFMatrix = *pPDFMatrix;
+    m_pRootElement = pElement;
+    ProcessElement(m_pRootElement, m_fRefWidth);
+    if(m_Status == LayoutToBeContinued) {
+        return LayoutToBeContinued;
+    }
+    m_Status = LayoutFinished;
+    FitPageMode();
+    return LayoutFinished;
+}
+LayoutStatus CPDF_LayoutProcessor_Reflow::Continue()
+{
+    int size = m_pReflowedPage->m_pReflowed->GetSize();
+    ProcessElement(m_pRootElement, m_CurrRefWidth);
+    size = m_pReflowedPage->m_pReflowed->GetSize();
+    if(m_Status == LayoutReady) {
+        m_Status = LayoutFinished;
+        FitPageMode();
+    }
+    return m_Status;
+}
+int CPDF_LayoutProcessor_Reflow::GetPosition()
+{
+    return m_PausePosition;
+}
+FX_BOOL	CPDF_LayoutProcessor_Reflow::IsCanBreakAfter(FX_DWORD unicode)
+{
+    if(unicode == -1) {
+        return FALSE;
+    }
+    switch(unicode) {
+        case 40:
+        case 91:
+        case 123:
+            return FALSE;
+    }
+    if(unicode >= 256) {
+        return TRUE;
+    } else if(unicode >= 48 && unicode <= 57) {
+        return FALSE;
+    } else if(unicode >= 64 && unicode <= 90) {
+        return FALSE;
+    } else if(unicode >= 97 && unicode <= 122) {
+        return FALSE;
+    }
+    return TRUE;
+}
+FX_BOOL	CPDF_LayoutProcessor_Reflow::IsCanBreakBefore(FX_DWORD unicode)
+{
+    if(unicode == -1) {
+        return FALSE;
+    }
+    switch(unicode) {
+        case 33:
+        case 41:
+        case 44:
+        case 46:
+        case 59:
+        case 63:
+        case 93:
+        case 125:
+            return FALSE;
+    }
+    if(unicode >= 256) {
+        return TRUE;
+    } else if(unicode >= 48 && unicode <= 57) {
+        return FALSE;
+    } else if(unicode >= 64 && unicode <= 90) {
+        return FALSE;
+    } else if(unicode >= 97 && unicode <= 122) {
+        return FALSE;
+    }
+    return TRUE;
+}
+void CPDF_LayoutProcessor_Reflow::ProcessTable(FX_FLOAT dx)
+{
+    if(m_pReflowedPage->m_pReflowed->GetSize() == 0) {
+        return;
+    }
+    CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);
+    int rowCount = pTable->m_nCell.GetSize();
+    int n = 0;
+    FX_FLOAT* dyRow = FX_Alloc(FX_FLOAT, rowCount + 1);
+    FXSYS_memset32(dyRow, 0, sizeof(FX_FLOAT) * (rowCount + 1));
+    dyRow[0] = 0 ;
+    dyRow[0] = - pTable->m_ReflowPageHeight;
+    int tableColCount = 0;
+    int i;
+    for(i = 0; i < rowCount; i++) {
+        int colCount = pTable->m_nCell.GetAt(i);
+        if(colCount > tableColCount) {
+            tableColCount = colCount;
+        }
+    }
+    int cellCount = tableColCount * rowCount;
+    RF_TableCell** pVirtualTable = FX_Alloc(RF_TableCell*, cellCount);
+    FXSYS_memset32(pVirtualTable, 0, sizeof(RF_TableCell*) * cellCount);
+    for(i = 0; i < rowCount; i++) {
+        int colCount = pTable->m_nCell.GetAt(i);
+        FX_FLOAT rowWidth = 0;
+        int j = 0;
+        int s = pTable->m_pCellArray.GetSize();
+        for(j = 0; j < colCount; j++) {
+            RF_TableCell* pCell = (RF_TableCell*)pTable->m_pCellArray.GetAt(n++);
+            if(pCell->m_EndPos < pCell->m_BeginPos) {
+                continue;
+            }
+            int pos = i * tableColCount;
+            while(pos < cellCount && pVirtualTable[pos] != NULL) {
+                pos++;
+            }
+            if(pos >= (i + 1) * tableColCount) {
+                pos = i * tableColCount + j;
+            }
+            int RowSpan = pCell->m_RowSpan;
+            int ColSpan = pCell->m_ColSpan;
+            if(RowSpan + i > rowCount) {
+                RowSpan = rowCount - i;
+            }
+            if(ColSpan + j > colCount) {
+                ColSpan = colCount - j;
+            }
+            for(int m = 0; m < RowSpan; m++) {
+                for(int nn = 0; nn < ColSpan; nn++) {
+                    if(pos + nn >= cellCount) {
+                        break;
+                    }
+                    pVirtualTable[pos + nn] = pCell;
+                }
+                pos += tableColCount;
+            }
+            FX_FLOAT dxCell = dx;
+            for(pos = i * tableColCount; pVirtualTable[pos] != pCell && pos < cellCount; pos++) {
+                dxCell += (pVirtualTable[pos])->m_MaxWidth;
+            }
+            CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[pCell->m_BeginPos];
+            FX_FLOAT dy = dyRow[i] - pData->m_Height - pData->m_PosY;
+            CFX_AffineMatrix matrix(1, 0, 0, 1, dxCell, dy);
+            Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1);
+            if(pCell->m_RowSpan + i <= rowCount) {
+                if(FXSYS_fabs(dyRow[pCell->m_RowSpan + i]) < FXSYS_fabs(dyRow[i] - pCell->m_CellHeight)) {
+                    dyRow[pCell->m_RowSpan + i] = dyRow[i] - pCell->m_CellHeight;
+                }
+            }
+        }
+    }
+    n = 0;
+    for(i = 0; i < rowCount; i++) {
+        int colCount = pTable->m_nCell.GetAt(i);
+        for(int j = 0; j < colCount; j++) {
+            RF_TableCell* pCell = (RF_TableCell*)pTable->m_pCellArray.GetAt(n++);
+            switch(pCell->m_BlockAlign) {
+                case LayoutAfter: {
+                        FX_FLOAT dy = dyRow[i + pCell->m_RowSpan] - pCell->m_CellHeight - dyRow[i];
+                        CFX_AffineMatrix matrix(1, 0, 0, 1, 0, dy);
+                        Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1);
+                    }
+                    break;
+                case LayoutMiddle:
+                case LayoutJustify: {
+                        FX_FLOAT dy = (dyRow[i + pCell->m_RowSpan] + pCell->m_CellHeight - dyRow[i]) / 2;
+                        CFX_AffineMatrix matrix(1, 0, 0, 1, 0, dy);
+                        Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1);
+                        break;
+                    }
+                default:
+                    break;
+            }
+        }
+    }
+    CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[m_pReflowedPage->m_pReflowed->GetSize() - 1];
+    m_pReflowedPage->m_PageHeight = - dyRow[rowCount] + pData->m_Height;
+    FX_Free(pVirtualTable);
+    FX_Free(dyRow);
+    int size = pTable->m_pCellArray.GetSize();
+    for(i = 0; i < size; i++) {
+        RF_TableCell* pCell = pTable->m_pCellArray.GetAt(i);
+        FX_Free(pCell);
+    }
+    pTable->m_pCellArray.RemoveAll();
+    pTable->m_nCell.RemoveAll();
+    int s = sizeof(CRF_Table);
+    delete pTable;
+    m_TableArray.RemoveAt(m_TableArray.GetSize() - 1);
+}
+CFX_FloatRect CPDF_LayoutProcessor_Reflow::GetElmBBox(IPDF_LayoutElement* pElement)
+{
+    CFX_FloatRect rect;
+    int objCount = pElement->CountObjects();
+    int count = pElement->CountChildren();
+    if(objCount == 0 && count == 0) {
+        return rect;
+    }
+    CFX_AffineMatrix matrix;
+    int i;
+    for(i = 0; i < objCount; i++) {
+        CPDF_PageObject* pObj = pElement->GetObject(0);
+        if(!pObj) {
+            continue;
+        }
+        if( rect.Height() == 0 ) {
+            rect = pObj->GetBBox(&matrix);
+        } else {
+            rect.Union(pObj->GetBBox(&matrix));
+        }
+    }
+    for(i = 0; i < count; i++) {
+        IPDF_LayoutElement* pChildElement = pElement->GetChild(i);
+        if( rect.Height() == 0 ) {
+            rect = GetElmBBox(pChildElement);
+        } else {
+            rect.Union(GetElmBBox(pChildElement));
+        }
+    }
+    return rect;
+}
+FX_FLOAT CPDF_LayoutProcessor_Reflow::GetElmWidth(IPDF_LayoutElement* pElement)
+{
+    if(!pElement) {
+        return 0;
+    }
+    LayoutType layoutType = pElement->GetType();
+    FX_FLOAT width = 0;
+    if(layoutType == LayoutTable || layoutType == LayoutTableDataCell || layoutType == LayoutTableHeaderCell) {
+        width = pElement->GetNumberAttr(LayoutWidth);
+        if(width > 0) {
+            return width;
+        }
+    } else if( layoutType == LayoutTableRow) {
+        int count = pElement->CountChildren();
+        for(int i = 0; i < count; i++) {
+            IPDF_LayoutElement* pElm = pElement->GetChild(i);
+            width += pElm->GetNumberAttr(LayoutWidth);
+        }
+        if(width > 0) {
+            return width;
+        }
+    }
+    CFX_FloatRect rect = GetElmBBox(pElement);
+    return rect.Width();
+}
+FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,
+                        FX_FLOAT& interlow, FX_FLOAT& interhigh);
+FX_BOOL IsSameLine(FX_BOOL bHorizontal, CFX_FloatRect Rect1, CFX_FloatRect Rect2)
+{
+    if(bHorizontal) {
+        FX_FLOAT inter_top, inter_bottom;
+        if (!GetIntersection(Rect1.bottom, Rect1.top, Rect2.bottom, Rect2.top,
+                             inter_bottom, inter_top)) {
+            return FALSE;
+        }
+        FX_FLOAT lineHeight = Rect1.top - Rect1.bottom;
+        if(lineHeight > 20 && lineHeight > Rect2.Height() * 2) {
+            return FALSE;
+        }
+        if(lineHeight > 5 && Rect2.Height() / 2 > lineHeight) {
+            return FALSE;
+        }
+        FX_FLOAT inter_h = inter_top - inter_bottom;
+        if (inter_h < (lineHeight) / 2 && inter_h < Rect2.Height() / 2) {
+            return FALSE;
+        }
+    } else {
+        FX_FLOAT inter_left, inter_right;
+        if(!GetIntersection(Rect1.left, Rect1.right, Rect2.left, Rect2.right, inter_left, inter_right)) {
+            return FALSE;
+        }
+        FX_FLOAT inter_w = inter_right - inter_left;
+        if (inter_w < (Rect1.right - Rect1.left) / 2 && inter_w < (Rect2.right - Rect2.left) / 2) {
+            return FALSE;
+        }
+    }
+    return TRUE;
+}
+FX_INT32 IsCanMergeParagraph(IPDF_LayoutElement* pPrevElement, IPDF_LayoutElement* pNextElement)
+{
+    FX_INT32 analogial = 100;
+    FX_INT32 nPrevObj = pPrevElement->CountObjects(), i;
+    CPDF_PageObject* pPrevObj = NULL;
+    CFX_FloatRect prevRect, rect;
+    CFX_PtrArray prevLine, line;
+    FX_BOOL bParagraphStart = FALSE;
+    for(i = 0; i < nPrevObj; i++) {
+        CPDF_PageObject* pObj = pPrevElement->GetObject(i);
+        if(!pPrevObj) {
+            pPrevObj = pObj;
+            rect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+            line.Add(pObj);
+            continue;
+        }
+        CFX_FloatRect objRect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+        if(IsSameLine(TRUE, rect, objRect)) {
+            line.Add(pObj);
+            rect.Union(objRect);
+        } else {
+            prevLine.RemoveAll();
+            prevLine.Append(line);
+            prevRect = rect;
+            line.RemoveAll();
+            line.Add(pObj);
+            rect = objRect;
+            if(!bParagraphStart) {
+                if (prevRect.left > rect.left + rect.Height() * 1.5) {
+                    bParagraphStart = TRUE;
+                }
+            }
+        }
+    }
+    if(prevLine.GetSize()) {
+        if(FXSYS_fabs(rect.right - prevRect.right) > rect.Height()) {
+            analogial -= 50;
+        }
+    }
+    CPDF_PageObject* pObj = pPrevElement->GetObject(nPrevObj - 1);
+    if(pObj->m_Type == PDFPAGE_TEXT) {
+        CPDF_TextObject* pText = (CPDF_TextObject*)pObj;
+        FX_INT32 nItem = pText->CountItems();
+        CPDF_TextObjectItem item;
+        pText->GetItemInfo(nItem - 1, &item);
+        CFX_WideString wStr = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+        if(wStr.IsEmpty()) {
+            wStr = (FX_WCHAR)item.m_CharCode;
+        }
+        FX_WCHAR wch = wStr.GetAt(wStr.GetLength() - 1);
+        switch(wch) {
+            case '.':
+            case 12290:
+            case 65311:
+            case 63:
+            case 33:
+            case 65281:
+                analogial -= 50;
+                break;
+        }
+    }
+    prevLine.RemoveAll();
+    prevLine.Append(line);
+    line.RemoveAll();
+    FX_INT32 nNextObj = pNextElement->CountObjects();
+    pPrevObj = NULL;
+    FX_BOOL bFirst = TRUE;
+    for(i = 0; i < nNextObj; i++) {
+        CPDF_PageObject* pObj = pNextElement->GetObject(i);
+        if(!pPrevObj) {
+            pPrevObj = pObj;
+            rect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+            line.Add(pObj);
+            continue;
+        }
+        CFX_FloatRect objRect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+        if(IsSameLine(TRUE, rect, objRect)) {
+            line.Add(pObj);
+            rect.Union(objRect);
+        } else {
+            if(FXSYS_fabs(rect.right - prevRect.right) < rect.Height() && FXSYS_fabs(rect.left - prevRect.left) < rect.Height()) {
+                analogial += 50;
+            }
+            prevLine.RemoveAll();
+            prevLine.Append(line);
+            prevRect = rect;
+            line.RemoveAll();
+            line.Add(pObj);
+            rect = objRect;
+            if(!bFirst) {
+                break;
+            }
+            bFirst = FALSE;
+        }
+    }
+    if(prevLine.GetSize()) {
+        if(bParagraphStart) {
+            if(prevRect.left - rect.left > rect.Height() && prevRect.left - rect.left < rect.Height() * 3) {
+                analogial -= 50;
+            }
+        } else {
+            if(FXSYS_fabs(prevRect.left - rect.left) < rect.Height()) {
+                analogial -= 50;
+            }
+        }
+    }
+    return analogial;
+}
+void CPDF_LayoutProcessor_Reflow::ProcessElement(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth)
+{
+    if(pElement == NULL) {
+        return;
+    }
+    if(m_Status == LayoutReady) {
+        LayoutType layoutType = pElement->GetType();
+        FX_INT32 ElementType = GetElementTypes(layoutType);
+        switch(ElementType) {
+            case SST_IE:
+                m_bIllustration = TRUE;
+                break;
+            case SST_BLSE:
+                FinishedCurrLine();
+                FX_FLOAT StartIndent = 0;
+                if(IPDF_LayoutElement* pParent = pElement->GetParent()) {
+                    StartIndent = pParent->GetNumberAttr(LayoutStartIndent);
+                }
+                FX_FLOAT currStartIndent = pElement->GetNumberAttr(LayoutStartIndent);
+                m_StartIndent = ConverWidth(currStartIndent);
+                FX_FLOAT width = reflowWidth;
+                if(StartIndent != currStartIndent) {
+                    reflowWidth -= m_StartIndent;
+                }
+                FX_FLOAT spaceBefore = pElement->GetNumberAttr(LayoutSpaceBefore);
+                m_pReflowedPage->m_PageHeight += spaceBefore;
+                m_TextAlign = pElement->GetEnumAttr(LayoutTextAlign);
+                if(IPDF_LayoutElement* pParent = pElement->GetParent()) {
+                    StartIndent = pParent->GetNumberAttr(LayoutEndIndent);
+                    FX_FLOAT currEndIndent = pElement->GetNumberAttr(LayoutEndIndent);
+                    if(StartIndent != currStartIndent) {
+                        reflowWidth -= ConverWidth(currEndIndent);
+                    }
+                }
+                if(reflowWidth * 2 < width) {
+                    reflowWidth = width;
+                    m_StartIndent = 0;
+                }
+                break;
+        }
+        switch(layoutType) {
+            case LayoutTable: {
+                    CRF_Table* pTable = FX_NEW CRF_Table;
+                    if (NULL == pTable) {
+                        break;
+                    }
+                    m_TableArray.Add(pTable);
+                    pTable->m_ReflowPageHeight = m_pReflowedPage->m_PageHeight;
+                    pTable->m_TableWidth = GetElmWidth(pElement);
+                    break;
+                }
+            case LayoutTableRow: {
+                    if(!m_TableArray.GetSize()) {
+                        break;
+                    }
+                    int count = pElement->CountChildren();
+                    CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);
+                    int f = 0;
+                    for(int i = 0; i < count; i++) {
+                        IPDF_LayoutElement* pChildElement = pElement->GetChild(i);
+                        LayoutType type = pChildElement->GetType();
+                        if(type == LayoutTableDataCell || type == LayoutTableHeaderCell) {
+                            f++;
+                        }
+                    }
+                    pTable->m_nCell.Add(f);
+                    break;
+                }
+            case LayoutTableDataCell:
+            case LayoutTableHeaderCell: {
+                    if(!m_TableArray.GetSize()) {
+                        break;
+                    }
+                    RF_TableCell* pCell = FX_Alloc(RF_TableCell, 1);
+                    FXSYS_memset32(pCell, 0 , sizeof(RF_TableCell));
+                    CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);
+                    int pos = pTable->m_nCell.GetSize() - 1;
+                    pCell->m_BeginPos = m_pReflowedPage->m_pReflowed->GetSize();
+                    FX_FLOAT cellWidth = pElement->GetNumberAttr(LayoutWidth);
+                    if(cellWidth == 0 || pCell->m_MaxWidth > pTable->m_TableWidth) {
+                        CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);
+                        pCell->m_MaxWidth = reflowWidth / pTable->m_nCell.GetAt(pTable->m_nCell.GetSize() - 1);
+                    } else {
+                        pCell->m_MaxWidth = pElement->GetNumberAttr(LayoutWidth) * reflowWidth / pTable->m_TableWidth;
+                    }
+                    pCell->m_ColSpan = (int)(pElement->GetNumberAttr(LayoutColSpan));
+                    pCell->m_RowSpan = (int)(pElement->GetNumberAttr(LayoutRowSpan));
+                    if(!pCell->m_ColSpan) {
+                        pCell->m_ColSpan = 1;
+                    }
+                    if(!pCell->m_RowSpan ) {
+                        pCell->m_RowSpan = 1;
+                    }
+                    pCell->m_BlockAlign = pElement->GetEnumAttr(LayoutBlockAlign);
+                    m_TextAlign = pElement->GetEnumAttr(LayoutInlineAlign);
+                    pCell->m_PosX = 0;
+                    pCell->m_PosY = 0;
+                    reflowWidth = pCell->m_MaxWidth;
+                    pTable->m_pCellArray.Add(pCell);
+                    break;
+                }
+            default:
+                break;
+        }
+        m_fLineHeight = pElement->GetNumberAttr(LayoutLineHeight);
+        int ReflowedSize = m_pReflowedPage->m_pReflowed->GetSize();
+        if(pElement->CountObjects()) {
+            ProcessObjs(pElement, reflowWidth);
+        }
+    }
+    int count = pElement->CountChildren();
+    for(int i = 0; i < count; i++) {
+        IPDF_LayoutElement* pChildElement = pElement->GetChild(i);
+        ProcessElement(pChildElement, reflowWidth);
+        if(m_pPause && m_pRootElement == pElement && m_Status != LayoutToBeContinued ) {
+            if(m_pPause->NeedToPauseNow()) {
+                m_pLayoutElement = pChildElement;
+                m_Status = LayoutToBeContinued;
+                m_CurrRefWidth = reflowWidth;
+                m_PausePosition = (i + 1) * 100 / (count + 1);
+                return ;
+            }
+        }
+        if(m_Status == LayoutToBeContinued && m_pLayoutElement == pChildElement) {
+            m_Status = LayoutReady;
+        }
+    }
+    if(m_Status == LayoutReady) {
+        FX_FLOAT dx = 0;
+        LayoutType layoutType = pElement->GetType();
+        FX_INT32 ElementType = GetElementTypes(layoutType);
+        switch(ElementType) {
+            case SST_IE:
+                m_bIllustration = FALSE;
+                FinishedCurrLine();
+                break;
+            case SST_BLSE:
+                FinishedCurrLine();
+                FX_FLOAT StartIndent = 0;
+                if(IPDF_LayoutElement* pParent = pElement->GetParent()) {
+                    StartIndent = pParent->GetNumberAttr(LayoutStartIndent);
+                }
+                FX_FLOAT currStartIndent = pElement->GetNumberAttr(LayoutStartIndent);
+                if(StartIndent != currStartIndent) {
+                    reflowWidth += ConverWidth(currStartIndent);
+                    dx += ConverWidth(currStartIndent);
+                }
+                FX_FLOAT spaceAfter = pElement->GetNumberAttr(LayoutSpaceAfter);
+                m_pReflowedPage->m_PageHeight += spaceAfter;
+                break;
+        }
+        switch(layoutType) {
+            case LayoutTableDataCell:
+            case LayoutTableHeaderCell: {
+                    if(!m_TableArray.GetSize()) {
+                        break;
+                    }
+                    CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);
+                    RF_TableCell* pCell = pTable->m_pCellArray.GetAt(pTable->m_pCellArray.GetSize() - 1);
+                    pCell->m_EndPos = m_pReflowedPage->m_pReflowed->GetSize() - 1;
+                    if(pCell->m_EndPos < pCell->m_BeginPos) {
+                        pCell->m_CellHeight = 0;
+                    } else {
+                        CRF_Data* pBeginData = (*m_pReflowedPage->m_pReflowed)[pCell->m_BeginPos];
+                        CRF_Data* pEndData = (*m_pReflowedPage->m_pReflowed)[pCell->m_EndPos];
+                        pCell->m_CellHeight = pBeginData->m_Height > pEndData->m_Height ? pBeginData->m_Height : pEndData->m_Height;
+                        pCell->m_CellHeight -= pEndData->m_PosY - pBeginData->m_PosY;
+                    }
+                    break;
+                }
+            case LayoutTableRow: {
+                    if(!m_TableArray.GetSize()) {
+                        break;
+                    }
+                    CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);
+                    if(pTable->m_nCol == 0) {
+                        pTable->m_nCol = pTable->m_pCellArray.GetSize();
+                    }
+                    break;
+                }
+            case LayoutTable: {
+                    ProcessTable(dx);
+                    break;
+                }
+            default:
+                if(dx) {
+                    CFX_AffineMatrix matrix(1, 0, 0, 1, dx, 0);
+                    int ReflowedSize = m_pReflowedPage->m_pReflowed->GetSize();
+                    Transform(&matrix, m_pReflowedPage->m_pReflowed, ReflowedSize, m_pReflowedPage->m_pReflowed->GetSize() - ReflowedSize);
+                }
+        }
+    }
+    if(m_pRootElement == pElement) {
+        m_PausePosition = 100;
+    }
+}
+FX_INT32 CPDF_LayoutProcessor_Reflow::GetElementTypes(LayoutType layoutType)
+{
+    switch(layoutType) {
+        case LayoutParagraph:
+        case LayoutHeading:
+        case LayoutHeading1:
+        case LayoutHeading2:
+        case LayoutHeading3:
+        case LayoutHeading4:
+        case LayoutHeading5:
+        case LayoutHeading6:
+        case LayoutList:
+        case LayoutListItem:
+        case LayoutListLabel:
+        case LayoutListBody:
+        case LayoutTable:
+        case LayoutTableHeaderCell:
+        case LayoutTableDataCell:
+        case LayoutTableRow:
+        case LayoutTableHeaderGroup:
+        case LayoutTableBodyGroup:
+        case LayoutTableFootGroup:
+        case LayoutTOCI:
+        case LayoutCaption:
+            return SST_BLSE;
+        case LayoutFigure:
+        case LayoutFormula:
+        case LayoutForm:
+            return SST_IE;
+        case LayoutSpan:
+        case LayoutQuote:
+        case LayoutNote:
+        case LayoutReference:
+        case LayoutBibEntry:
+        case LayoutCode:
+        case LayoutLink:
+        case LayoutAnnot:
+        case LayoutRuby:
+        case LayoutWarichu:
+            return SST_ILSE;
+        default:
+            return SST_GE;
+    }
+    return FALSE;
+}
+FX_FLOAT	CPDF_LayoutProcessor_Reflow::ConverWidth(FX_FLOAT width)
+{
+    return width;
+}
+void CPDF_LayoutProcessor_Reflow::ProcessObject(CPDF_PageObject* pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix)
+{
+    if(!pObj) {
+        return;
+    }
+    if(pObj->m_Type == PDFPAGE_TEXT) {
+        ProcessTextObject( (CPDF_TextObject *)pObj, reflowWidth, objMatrix);
+    } else if(pObj->m_Type == PDFPAGE_IMAGE) {
+        if(!(m_flags & RF_PARSER_IMAGE)) {
+            return;
+        }
+        CPDF_PageObjects* pObjs = FX_NEW CPDF_PageObjects(FALSE);
+        if (NULL == pObjs) {
+            return;
+        }
+        FX_POSITION pos = pObjs->GetLastObjectPosition();
+        pos = pObjs->InsertObject(pos, pObj);
+        CFX_AffineMatrix matrix;
+        FX_RECT rect = pObj->GetBBox(&matrix);
+        CPDF_ImageObject* ImageObj = (CPDF_ImageObject*)pObj;
+        ProcessUnitaryObjs(pObjs, reflowWidth, objMatrix);
+        delete pObjs;
+    } else if(pObj->m_Type == PDFPAGE_PATH) {
+    } else if(pObj->m_Type == PDFPAGE_FORM) {
+        CPDF_FormObject* pForm = (CPDF_FormObject*)pObj;
+        FX_POSITION pos = pForm->m_pForm->GetFirstObjectPosition();
+        objMatrix.Concat(pForm->m_FormMatrix);
+        while (pos) {
+            CPDF_PageObject* pObj1 = pForm->m_pForm->GetNextObject(pos);
+            ProcessObject(pObj1, reflowWidth, objMatrix);
+        }
+    }
+}
+void CPDF_LayoutProcessor_Reflow::ProcessObjs(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth)
+{
+    m_fCurrMaxWidth = reflowWidth;
+    int ObjCount = pElement->CountObjects();
+    for(int i = 0; i < ObjCount; i++) {
+        CPDF_PageObject* pObj = pElement->GetObject(i);
+        ProcessObject(pObj, reflowWidth, m_PDFMatrix);
+        continue;
+    }
+}
+void CPDF_LayoutProcessor_Reflow::AddTemp2CurrLine(int begin, int count)
+{
+    if(begin < 0 || count <= 0 || !m_pReflowedPage || !m_pReflowedPage->m_pReflowed || !m_pTempLine) {
+        return;
+    } else {
+        count += begin;
+    }
+    int size = m_pReflowedPage->m_pReflowed->GetSize();
+    int temps = m_pTempLine->GetSize();
+    for(int i = begin; i < count; i++) {
+        CRF_Data* pData = (*m_pTempLine)[i];
+        AddData2CurrLine(pData);
+    }
+}
+void CPDF_LayoutProcessor_Reflow::AddData2CurrLine(CRF_Data* pData)
+{
+    if(pData == NULL || m_pCurrLine == NULL) {
+        return;
+    }
+    m_pCurrLine->Add(pData);
+    m_fCurrLineWidth = pData->m_PosX + pData->m_Width;
+    if(pData->m_Height > m_fCurrLineHeight) {
+        m_fCurrLineHeight = pData->m_Height;
+    }
+}
+void CPDF_LayoutProcessor_Reflow::UpdateCurrLine()
+{
+}
+void CPDF_LayoutProcessor_Reflow::Transform(const CFX_AffineMatrix* pMatrix, CRF_DataPtrArray* pDataArray, int beginPos, int count)
+{
+    if (!pDataArray) {
+        return;
+    }
+    if(count == 0) {
+        count = pDataArray->GetSize();
+    } else {
+        count += beginPos;
+    }
+    for(int i = beginPos; i < count; i++) {
+        CRF_Data* pData = (*pDataArray)[i];
+        Transform(pMatrix, pData);
+    }
+}
+void CPDF_LayoutProcessor_Reflow::Transform(const CFX_AffineMatrix* pMatrix, CRF_Data* pData)
+{
+    if(pData->GetType() == CRF_Data::Path) {
+        CRF_PathData* pPathData = (CRF_PathData*)pData;
+        pPathData->m_pPath2Device.Concat(*pMatrix);
+    }
+    pMatrix->Transform(pData->m_PosX, pData->m_PosY, pData->m_PosX, pData->m_PosY);
+}
+FX_BOOL CPDF_LayoutProcessor_Reflow::FinishedCurrLine()
+{
+    if (NULL == m_pCurrLine) {
+        return FALSE;
+    }
+    int count = m_pCurrLine->GetSize();
+    if(count == 0) {
+        return FALSE;
+    }
+    if(m_fLineHeight > m_fCurrLineHeight) {
+        m_fCurrLineHeight = m_fLineHeight;
+    } else {
+        m_fCurrLineHeight += 2;
+    }
+    if(m_pReflowedPage->m_pReflowed->GetSize() > 0) {
+        m_fCurrLineHeight += m_fLineSpace;
+    }
+    FX_FLOAT height = m_pReflowedPage->m_PageHeight + m_fCurrLineHeight;
+    FX_FLOAT lineHeight = m_fLineHeight;
+    if(lineHeight == 0) {
+        lineHeight = m_fCurrLineHeight;
+    }
+    FX_FLOAT dx = 0;
+    switch(m_TextAlign) {
+        case LayoutCenter:
+            dx = (m_fCurrMaxWidth - m_fCurrLineWidth) / 2;
+            break;
+        case LayoutEnd:
+            dx = m_fCurrMaxWidth - m_fCurrLineWidth;
+            break;
+        case LayoutJustify:
+            break;
+        default:
+            break;
+    }
+    FX_FLOAT dy = - height;
+    int refedSize = m_pReflowedPage->m_pReflowed->GetSize();
+    if(count == 13) {
+        int a = 0;
+    }
+    for(int i = 0; i < count; i++) {
+        CRF_Data* pData = (*m_pCurrLine)[i];
+        m_pReflowedPage->m_pReflowed->Add(pData);
+        FX_FLOAT x = m_StartIndent + dx * (m_TextAlign == LayoutJustify ? i + 1 : 1);
+        CFX_AffineMatrix matrix(1, 0, 0, 1, x, dy);
+        Transform(&matrix, pData);
+    }
+    m_pCurrLine->RemoveAll();
+    m_fCurrLineWidth = 0;
+    m_pReflowedPage->m_PageHeight += m_fCurrLineHeight;
+    m_fCurrLineHeight = 0;
+    return TRUE;
+}
+CRF_CharState* CPDF_LayoutProcessor_Reflow::GetCharState(CPDF_TextObject* pObj, CPDF_Font* pFont, FX_FLOAT fHeight, FX_ARGB color)
+{
+    if (NULL == m_pReflowedPage->m_pCharState) {
+        return NULL;
+    }
+    int count = m_pReflowedPage->m_pCharState->GetSize();
+    for(int i = count - 1; i >= 0; i--) {
+        CRF_CharState* pState = (CRF_CharState*)m_pReflowedPage->m_pCharState->GetAt(i);
+        if(pState->m_Color == color && pState->m_fFontSize == fHeight && pState->m_pFont == pFont && pState->m_pTextObj == pObj) {
+            return pState;
+        }
+    }
+    CRF_CharState pState;
+    pState.m_pTextObj = pObj;
+    pState.m_Color = color;
+    pState.m_pFont = pFont;
+    pState.m_fFontSize = fHeight;
+    int ascent = pFont->GetTypeAscent();
+    int descent = pFont->GetTypeDescent();
+    pState.m_fAscent = ascent * fHeight / (ascent - descent);
+    if(descent == 0) {
+        pState.m_fDescent = 0;
+    } else {
+        pState.m_fDescent = descent * fHeight / (ascent - descent);
+    }
+    pState.m_bVert = FALSE;
+    CPDF_CIDFont *pCIDFont = pFont->GetCIDFont();
+    if(pCIDFont) {
+        pState.m_bVert = pCIDFont->IsVertWriting();
+    }
+    m_pReflowedPage->m_pCharState->Add(pState);
+    return (CRF_CharState*)m_pReflowedPage->m_pCharState->GetAt(count);
+}
+int CPDF_LayoutProcessor_Reflow::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const
+{
+    if(charCode == -1) {
+        return 0;
+    }
+    int w = pFont->GetCharWidthF(charCode);
+    if(w == 0) {
+        CFX_ByteString str;
+        pFont->AppendChar(str, charCode);
+        w = pFont->GetStringWidth(str, 1);
+        if(w == 0) {
+            FX_RECT BBox;
+            pFont->GetCharBBox(charCode, BBox);
+            w = BBox.right - BBox.left;
+        }
+    }
+    return w;
+}
+void CPDF_LayoutProcessor_Reflow::CreateRFData(CPDF_PageObject* pObj, CFX_AffineMatrix* pObjMatrix)
+{
+    if (NULL == m_pReflowedPage->m_pMemoryPool) {
+        return;
+    }
+    if(pObj->m_Type == PDFPAGE_TEXT) {
+        CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj;
+        int count = pTextObj->CountItems();
+        if(!count) {
+            return;
+        }
+        if(count == 1) {
+            CPDF_TextObjectItem Item;
+            pTextObj->GetItemInfo(0, &Item);
+            if(Item.m_CharCode == 49) {
+                int a = 0;
+            }
+        }
+        CPDF_Font * pFont = pTextObj->GetFont();
+        FX_FLOAT fs = pTextObj->GetFontSize();
+        FX_FLOAT* pmatrix = pTextObj->m_TextState.GetMatrix();
+        FX_FLOAT matrix1 = pmatrix[1];
+        if(pmatrix[2] == 0) {
+            matrix1 = 0;
+        }
+        CFX_AffineMatrix textMatrix(pmatrix[0], matrix1, pmatrix[2], pmatrix[3], 0, 0);
+        FX_FLOAT height = FXSYS_fabs(textMatrix.TransformDistance(fs));
+        if(pObjMatrix) {
+            height = FXSYS_fabs(pObjMatrix->TransformDistance(height));
+        }
+        int r = 0, g = 0, b = 0;
+        pTextObj->m_ColorState.GetFillColor()->GetRGB(r, g, b);
+        FX_ARGB col = r * 0x10000;
+        col += g * 0x100;
+        col += b;
+        CRF_CharState* pState = GetCharState(pTextObj, pFont, height, col);
+        FX_FLOAT dx = 0, dy = 0;
+        FX_RECT ObjBBox;
+        if(pObjMatrix) {
+            ObjBBox = pTextObj->GetBBox(pObjMatrix);
+            dx = (float)ObjBBox.left;
+            dy = (float)ObjBBox.bottom;
+        } else {
+            CFX_AffineMatrix matrix;
+            ObjBBox = pTextObj->GetBBox(&matrix);
+        }
+        FX_FLOAT objWidth = 0;
+        CFX_ByteString str;
+        FX_BOOL bOrder = TRUE;
+        CFX_PtrArray tempArray;
+        int i = 0;
+        CPDF_TextObjectItem Item;
+        pTextObj->GetItemInfo(i, &Item);
+        dx = Item.m_OriginX;
+        dy = Item.m_OriginY;
+        textMatrix.Transform(Item.m_OriginX, Item.m_OriginY, dx, dy);
+        CRF_CharData* pLastData = NULL;
+        FX_FLOAT horzScale = pTextObj->m_TextState.GetFontSizeV() / pTextObj->m_TextState.GetFontSizeH();
+        while(i < count) {
+            pTextObj->GetItemInfo(i, &Item);
+            if(Item.m_CharCode == -1) {
+                i++;
+                continue;
+            }
+            FX_FLOAT OriginX, OriginY;
+            textMatrix.Transform(Item.m_OriginX, Item.m_OriginY, OriginX, OriginY);
+            CRF_CharData* pData = (CRF_CharData*)m_pReflowedPage->m_pMemoryPool->Alloc(sizeof(CRF_CharData));
+            if (NULL == pData) {
+                continue;
+            }
+            pData->m_Type = CRF_Data::Text;
+            if(FXSYS_fabs(OriginY - dy) > FXSYS_fabs(OriginX - dx)) {
+                pData->m_PosY = dy;
+                pData->m_PosX = pLastData->m_PosX + pLastData->m_Width + textMatrix.TransformDistance(pTextObj->m_TextState.GetObject()->m_CharSpace);
+            } else {
+                pData->m_PosY = OriginY;
+                pData->m_PosX = OriginX;
+            }
+            int size = tempArray.GetSize();
+            if(size && pData->m_PosX < pLastData->m_PosX ) {
+                for (int j = 0; j < size; j++) {
+                    CRF_CharData* pData1 = (CRF_CharData*)tempArray.GetAt(j);
+                    if(pData1->m_PosX > pData->m_PosX) {
+                        tempArray.InsertAt(j, pData);
+                        break;
+                    }
+                }
+            } else {
+                tempArray.Add(pData);
+            }
+            pLastData = pData;
+            pData->m_CharCode = Item.m_CharCode;
+            pData->m_Height = FXSYS_fabs(height);
+            int w = GetCharWidth(Item.m_CharCode, pFont);
+            pData->m_Width = FXSYS_fabs(fs * textMatrix.TransformDistance((FX_FLOAT)w) / 1000);
+            if(horzScale) {
+                pData->m_Width /= horzScale;
+            }
+            pData->m_pCharState = pState;
+            i++;
+        }
+        count = tempArray.GetSize();
+        for (int j = 0; j < count; j++) {
+            CRF_CharData* pData = (CRF_CharData*)tempArray.GetAt(j);
+            if (m_pTempLine) {
+                m_pTempLine->Add(pData);
+            }
+        }
+        tempArray.RemoveAll();
+    } else if(pObj->m_Type == PDFPAGE_IMAGE) {
+        CPDF_ImageObject* pImageObj = (CPDF_ImageObject* )pObj;
+        CRF_ImageData* pRFImage = (CRF_ImageData*)m_pReflowedPage->m_pMemoryPool->Alloc(sizeof(CRF_ImageData));
+        if (NULL == pRFImage) {
+            return;
+        }
+        pRFImage->m_pBitmap = NULL;
+        pRFImage->m_Type = CRF_Data::Image;
+        if (m_pTempLine) {
+            m_pTempLine->Add(pRFImage);
+        }
+        CPDF_Image *pImage = pImageObj->m_pImage;
+        if (!pImage->m_pDIBSource || !pImage->m_pMask) {
+            if(pImage->StartLoadDIBSource(m_pReflowedPage->GetFormResDict(pImageObj), m_pReflowedPage->m_pPDFPage->m_pResources, 0, 0, TRUE)) {
+                pImage->Continue(NULL);
+            }
+        }
+        CFX_DIBSource* pDibSource = pImage->DetachBitmap();
+        if (pDibSource) {
+            pRFImage->m_pBitmap = pDibSource->Clone();
+            delete pDibSource;
+        }
+        CFX_DIBSource* pMask = pImage->DetachMask();
+        if (pMask) {
+            if (!pMask->IsAlphaMask()) {
+                CFX_DIBitmap* pMaskBmp = pMask->Clone();
+                pMaskBmp->ConvertFormat(FXDIB_8bppMask);
+                pRFImage->m_pBitmap->MultiplyAlpha(pMaskBmp);
+                delete pMaskBmp;
+            } else {
+                pRFImage->m_pBitmap->MultiplyAlpha(pMask);
+            }
+            delete pMask;
+        }
+        CFX_FloatRect ObjBBox;
+        if(pObjMatrix) {
+            ObjBBox = pImageObj->GetBBox(pObjMatrix);
+        } else {
+            CFX_AffineMatrix matrix;
+            ObjBBox = pImageObj->GetBBox(&matrix);
+        }
+        pRFImage->m_Width = ObjBBox.Width();
+        pRFImage->m_Height = ObjBBox.Height();
+        pRFImage->m_PosX = 0;
+        pRFImage->m_PosY = 0;
+        CFX_AffineMatrix matrix(1, 0, 0, -1, 0, 0);
+        matrix.Concat(pImageObj->m_Matrix);
+        matrix.Concat(*pObjMatrix);
+        pRFImage->m_Matrix.Set(matrix.a == 0 ? 0 : matrix.a / FXSYS_fabs(matrix.a),
+                               matrix.b == 0 ? 0 : matrix.b / FXSYS_fabs(matrix.b),
+                               matrix.c == 0 ? 0 : matrix.c / FXSYS_fabs(matrix.c),
+                               matrix.d == 0 ? 0 : matrix.d / FXSYS_fabs(matrix.d), 0, 0);
+    } else if(pObj->m_Type == PDFPAGE_PATH) {
+    }
+}
+FX_FLOAT CPDF_LayoutProcessor_Reflow:: GetDatasWidth(int beginPos, int endpos)
+{
+    if(endpos < beginPos || !m_pTempLine) {
+        return 0;
+    }
+    if(endpos > m_pTempLine->GetSize() - 1) {
+        endpos = m_pTempLine->GetSize() - 1;
+    }
+    CRF_Data* pBeginData = (*m_pTempLine)[beginPos];
+    CRF_Data* pEndData = (*m_pTempLine)[endpos];
+    return pEndData->m_PosX - pBeginData->m_PosX + pEndData->m_Width;
+}
+FX_WCHAR CPDF_LayoutProcessor_Reflow::GetPreChar()
+{
+    if (NULL == m_pCurrLine) {
+        return -1;
+    }
+    int index = m_pCurrLine->GetSize() - 1;
+    CRF_CharData* pCharData = NULL;
+    while (index >= 0 && !pCharData) {
+        CRF_Data* pData = (*m_pCurrLine)[index];
+        if(pData->GetType() == CRF_Data::Text) {
+            pCharData = (CRF_CharData*)pData;
+        } else {
+            return -1;
+        }
+        index --;
+    }
+    if(m_pReflowedPage) {
+        index = m_pReflowedPage->m_pReflowed->GetSize() - 1;
+    }
+    while(!pCharData && index >= 0) {
+        CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[index];
+        if(pData->GetType() == CRF_Data::Text) {
+            pCharData = (CRF_CharData*)pData;
+        } else {
+            return -1;
+        }
+        index --;
+    }
+    if(pCharData) {
+        CFX_WideString str = pCharData->m_pCharState->m_pFont->UnicodeFromCharCode(pCharData->m_CharCode);
+        return str.GetAt(0);
+    }
+    return -1;
+}
+int CPDF_LayoutProcessor_Reflow::ProcessInsertObject(CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix)
+{
+    if(!pObj || !m_pPreObj || !m_pCurrLine) {
+        return 0;
+    }
+    if(m_pCurrLine->GetSize() == 0) {
+        return 0;
+    }
+    CPDF_TextObjectItem item;
+    int nItem = m_pPreObj->CountItems();
+    m_pPreObj->GetItemInfo(nItem - 1, &item);
+    FX_FLOAT last_pos = item.m_OriginX;
+    FX_FLOAT last_width = GetCharWidth(item.m_CharCode, m_pPreObj->GetFont()) * m_pPreObj->GetFontSize() / 1000;
+    last_width = FXSYS_fabs(last_width);
+    pObj->GetItemInfo(0, &item);
+    FX_FLOAT this_width = GetCharWidth(item.m_CharCode, pObj->GetFont()) * pObj->GetFontSize() / 1000;
+    this_width = FXSYS_fabs(this_width);
+    FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;
+    CFX_AffineMatrix prev_matrix, prev_reverse;
+    m_pPreObj->GetTextMatrix(&prev_matrix);
+    prev_matrix.Concat(m_perMatrix);
+    prev_reverse.SetReverse(prev_matrix);
+    FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY();
+    formMatrix.Transform(x, y);
+    prev_reverse.Transform(x, y);
+    FX_WCHAR preChar  = GetPreChar();
+    CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+    FX_WCHAR curChar = wstrItem.GetAt(0);
+    if (FXSYS_fabs(y) > threshold * 2) {
+        if (preChar == L'-') {
+            return 3;
+        }
+        if (preChar != L' ') {
+            return 1;
+        }
+        return 2;
+    }
+    if ((x - last_pos - last_width) > threshold && curChar != L' ' && preChar != L' ') {
+        return 1;
+    }
+    return 0;
+}
+FX_INT32 CPDF_LayoutProcessor_Reflow::LogicPreObj(CPDF_TextObject* pObj)
+{
+    CPDF_TextObject* pPreObj = m_pPreObj;
+    m_pPreObj = pObj;
+    if(!pObj || !pPreObj) {
+        return 0;
+    }
+    CPDF_TextObjectItem item;
+    pPreObj->GetItemInfo(pPreObj->CountItems() - 1, &item);
+    FX_FLOAT last_pos = item.m_OriginX;
+    FX_FLOAT last_width = pPreObj->GetFont()->GetCharWidthF(item.m_CharCode) * pPreObj->GetFontSize() / 1000;
+    last_width = FXSYS_fabs(last_width);
+    pObj->GetItemInfo(0, &item);
+    FX_FLOAT this_width = pObj->GetFont()->GetCharWidthF(item.m_CharCode) * pObj->GetFontSize() / 1000;
+    this_width = FXSYS_fabs(this_width);
+    FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;
+    CFX_AffineMatrix prev_matrix, prev_reverse;
+    pPreObj->GetTextMatrix(&prev_matrix);
+    prev_reverse.SetReverse(prev_matrix);
+    FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY();
+    prev_reverse.Transform(x, y);
+    CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+    FX_WCHAR curChar = wstrItem.GetAt(0);
+    if (FXSYS_fabs(y) > threshold * 2) {
+        return 2;
+    }
+    FX_WCHAR preChar = 0;
+    if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ') {
+        return 1;
+    }
+    return 0;
+    m_pPreObj = pObj;
+    if(!pPreObj) {
+        return 0;
+    }
+    if(pPreObj->m_Type != pObj->m_Type) {
+        return 0;
+    }
+    CFX_FloatRect rcCurObj(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+    CFX_FloatRect rcPreObj(pPreObj->m_Left, pPreObj->m_Bottom, pPreObj->m_Right, pPreObj->m_Top);
+    if(pObj->m_Type == PDFPAGE_IMAGE) {
+        if(rcPreObj.Contains(rcCurObj)) {
+            return 2;
+        }
+        if(rcCurObj.Contains(rcPreObj)) {
+            return 2;
+        }
+        return 0;
+    }
+    if(pObj->m_Type == PDFPAGE_TEXT) {
+        if(!((rcPreObj.bottom > rcCurObj.top) || (rcPreObj.top < rcCurObj.bottom))) {
+            FX_FLOAT height = FX_MIN(rcPreObj.Height(), rcCurObj.Height());
+            if((rcCurObj.left - rcPreObj.right) > height / 3) {
+                return 3;
+            }
+        }
+        if(FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) >= 2 || FXSYS_fabs(rcPreObj.Height() - rcCurObj.Height()) >= 2 ) {
+            return 0;
+        }
+        CPDF_TextObject* pPreTextObj = (CPDF_TextObject*)pPreObj;
+        CPDF_TextObject* pCurTextObj = (CPDF_TextObject*)pObj;
+        int nPreCount = pPreTextObj->CountItems();
+        int nCurCount = pCurTextObj->CountItems();
+        if (nPreCount != nCurCount) {
+            return 0;
+        }
+        FX_BOOL bSame = TRUE;
+        for (int i = 0; i < nPreCount; i++) {
+            CPDF_TextObjectItem itemPer, itemCur;
+            pPreTextObj->GetItemInfo(i, &itemPer);
+            pCurTextObj->GetItemInfo(i, &itemCur);
+            if (itemCur.m_CharCode != itemPer.m_CharCode) {
+                return 0;
+            }
+            if (itemCur.m_OriginX != itemPer.m_OriginX) {
+                bSame = FALSE;
+            }
+            if (itemCur.m_OriginY != itemPer.m_OriginY) {
+                bSame = FALSE;
+            }
+        }
+        if(rcPreObj.left == rcCurObj.left && rcPreObj.top == rcCurObj.top) {
+            return 1;
+        }
+        if(FXSYS_fabs(rcPreObj.left - rcCurObj.left) < rcPreObj.Width() / 3
+                && FXSYS_fabs(rcPreObj.top - rcCurObj.top) < rcPreObj.Height() / 3) {
+            return 2;
+        }
+    }
+    return 0;
+}
+FX_BOOL CPDF_LayoutProcessor_Reflow::IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2)
+{
+    if (!pTextObj1 || !pTextObj2) {
+        return FALSE;
+    }
+    CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);
+    CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);
+    if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) {
+        return FALSE;
+    }
+    if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {
+        rcPreObj.Intersect(rcCurObj);
+        if (rcPreObj.IsEmpty()) {
+            return FALSE;
+        }
+        if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {
+            return FALSE;
+        }
+        if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {
+            return FALSE;
+        }
+    }
+    int nPreCount = pTextObj2->CountItems();
+    int nCurCount = pTextObj1->CountItems();
+    if (nPreCount != nCurCount) {
+        return FALSE;
+    }
+    for (int i = 0; i < nPreCount; i++) {
+        CPDF_TextObjectItem itemPer, itemCur;
+        pTextObj2->GetItemInfo(i, &itemPer);
+        pTextObj1->GetItemInfo(i, &itemCur);
+        if (itemCur.m_CharCode != itemPer.m_CharCode) {
+            return FALSE;
+        }
+    }
+    return TRUE;
+}
+void CPDF_LayoutProcessor_Reflow::ProcessTextObject(CPDF_TextObject *pTextObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix)
+{
+    if(reflowWidth < 0 || !m_pCurrLine || !m_pTempLine) {
+        return;
+    }
+    if(IsSameTextObject(pTextObj, m_pPreObj)) {
+        return;
+    }
+    CPDF_PageObject* pPreObj = m_pPreObj;
+    FX_INT32 logic = ProcessInsertObject(pTextObj, objMatrix);
+    m_pPreObj = pTextObj;
+    m_perMatrix.Copy(objMatrix);
+    int size = m_pTempLine->GetSize();
+    int curs = m_pCurrLine->GetSize();
+    CreateRFData(pTextObj);
+    size = m_pTempLine->GetSize();
+    int reds = m_pReflowedPage->m_pReflowed->GetSize();
+    if(size == 0) {
+        return;
+    }
+    if(logic == 1) {
+        m_fCurrLineWidth += pTextObj->GetBBox(&objMatrix).Height() / 3;
+    } else if(logic == 3 && curs) {
+        m_fCurrLineWidth -= (*m_pCurrLine)[curs - 1]->m_Width;
+        m_pCurrLine->Delete(curs - 1);
+    }
+    int beginPos = 0, endPos = m_pTempLine->GetSize() - 1;
+    while(beginPos <= endPos) {
+        int tempBeginPos = beginPos;
+        int tempEndPos = endPos;
+        FX_FLOAT all_width = GetDatasWidth( beginPos, endPos);
+        if(all_width < reflowWidth - m_fCurrLineWidth) {
+            CRF_CharData* pBeginData = (CRF_CharData*)(*m_pTempLine)[beginPos];
+            CFX_AffineMatrix matrix(1, 0, 0, 1, -pBeginData->m_PosX + m_fCurrLineWidth, -pBeginData->m_PosY);
+            Transform(&matrix, m_pTempLine, beginPos, endPos - beginPos + 1);
+            AddTemp2CurrLine(beginPos, endPos - beginPos + 1);
+            m_pTempLine->RemoveAll();
+            return;
+        }
+        int	midPos ;
+        if(tempBeginPos >= tempEndPos && tempEndPos != 0) {
+            midPos = tempEndPos;
+        } else {
+            while (tempBeginPos < tempEndPos ) {
+                midPos = (tempEndPos - tempBeginPos) / 2 + tempBeginPos;
+                if(midPos == tempBeginPos || midPos == tempEndPos) {
+                    break;
+                }
+                FX_FLOAT w = GetDatasWidth( beginPos, midPos);
+                if(w < reflowWidth - m_fCurrLineWidth) {
+                    tempBeginPos = midPos;
+                } else {
+                    tempEndPos = midPos;
+                }
+            }
+            midPos = tempBeginPos;
+            if(midPos == 0) {
+                FX_FLOAT w = GetDatasWidth( beginPos, 1);
+                if(w > reflowWidth - m_fCurrLineWidth) {
+                    midPos = -1;
+                }
+            }
+        }
+        if(midPos == -1) {
+            int count = m_pCurrLine->GetSize();
+            if(count == 0) {
+                midPos = 0;
+            }
+        }
+        int f = -1;
+        int i = 0;
+        for(i = midPos; i >= beginPos; i--) {
+            CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[i];
+            CFX_WideString Wstr = pData->m_pCharState->m_pFont->UnicodeFromCharCode(pData->m_CharCode);
+            FX_WCHAR cha = Wstr.GetAt(0);
+            if(i < m_pTempLine->GetSize() - 1) {
+                CRF_CharData* pNextData = (CRF_CharData*)(*m_pTempLine)[i + 1];
+                if(pNextData->m_PosX - (pData->m_PosX + pData->m_Width) >= pData->m_Height / 4) {
+                    f = i;
+                    i++;
+                }
+            }
+            if(f == -1) {
+                if(IsCanBreakAfter((FX_DWORD)cha)) {
+                    f = i;
+                    i++;
+                } else if(IsCanBreakBefore((FX_DWORD)cha)) {
+                    f = i - 1;
+                    if(f < beginPos) {
+                        f = -1;
+                    }
+                }
+            }
+            if(f != -1) {
+                CRF_CharData* pBeginData = (CRF_CharData*)(*m_pTempLine)[beginPos];
+                CFX_AffineMatrix matrix(1, 0, 0, 1, -pBeginData->m_PosX + m_fCurrLineWidth, -pBeginData->m_PosY);
+                Transform(&matrix, m_pTempLine, beginPos, f - beginPos + 1);
+                CRF_Data* pData = (*m_pTempLine)[0];
+                AddTemp2CurrLine(beginPos, f - beginPos + 1);
+                beginPos = i;
+                FinishedCurrLine();
+                f = 1;
+                break;
+            }
+        }
+        if(f == -1 && i < beginPos) {
+            if( m_pCurrLine->GetSize()) {
+                int count = m_pCurrLine->GetSize();
+                f = -1;
+                for(int i = count - 1; i >= 0; i--) {
+                    CRF_Data* pData = (*m_pCurrLine)[i];
+                    if(pData->GetType() != CRF_Data::Text) {
+                        f = i + 1;
+                    } else {
+                        CRF_CharData* pCharData = (CRF_CharData*)pData;
+                        CFX_WideString Wstr = pCharData->m_pCharState->m_pFont->UnicodeFromCharCode(pCharData->m_CharCode);
+                        FX_WCHAR cha = Wstr.GetAt(0);
+                        if(IsCanBreakAfter(cha)) {
+                            f = i + 1;
+                            i++;
+                        } else if(IsCanBreakBefore(cha)) {
+                            f = i;
+                        }
+                        if(f == 0) {
+                            f = -1;
+                        }
+                    }
+                    if(f != -1) {
+                        FinishedCurrLine();
+                        if(f < count) {
+                            int reflowdCount = m_pReflowedPage->m_pReflowed->GetSize();
+                            int pos = reflowdCount + f - count;
+                            CRF_CharData* pData = (CRF_CharData*)(*m_pReflowedPage->m_pReflowed)[pos];
+                            CFX_AffineMatrix matrix(1, 0, 0, 1, -pData->m_PosX + m_fCurrLineWidth, -pData->m_PosY);
+                            Transform(&matrix, m_pReflowedPage->m_pReflowed, pos, reflowdCount - pos);
+                            for(int j = pos; j < reflowdCount; j++) {
+                                AddData2CurrLine((*m_pReflowedPage->m_pReflowed)[j]);
+                            }
+                            m_pReflowedPage->m_pReflowed->Delete(pos, count - f);
+                            if(logic == 3) {
+                                m_fCurrLineWidth += pTextObj->GetBBox(&objMatrix).Height() / 3;
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
+            if(f == -1) {
+                CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[beginPos];
+                CFX_AffineMatrix matrix(1, 0, 0, 1, -pData->m_PosX + m_fCurrLineWidth, -pData->m_PosY);
+                if(beginPos == midPos) {
+                    Transform(&matrix, pData);
+                    FX_RECT rect;
+                    pData->m_pCharState->m_pFont->GetFontBBox(rect);
+                    FX_FLOAT* pmatrix = pTextObj->m_TextState.GetMatrix();
+                    CFX_AffineMatrix textMatrix(pmatrix[0], pmatrix[1], pmatrix[2], pmatrix[3], 0, 0);
+                    FX_FLOAT width = pData->m_Height * (rect.right - rect.left) / 1000;
+                    FX_FLOAT f = (reflowWidth - m_fCurrLineWidth) / width;
+                    pData->m_PosY *= f;
+                    pData->m_Width *= f;
+                    pData->m_Height *= f;
+                    pData->m_pCharState = GetCharState(pData->m_pCharState->m_pTextObj, pData->m_pCharState->m_pFont, pData->m_Height, pData->m_pCharState->m_Color);
+                    AddData2CurrLine(pData);
+                } else {
+                    for(int m = beginPos; m <= midPos; m++) {
+                        CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[m];
+                        Transform(&matrix, pData);
+                        AddData2CurrLine(pData);
+                    }
+                }
+                FinishedCurrLine();
+                beginPos = midPos + 1;
+            }
+        }
+    }
+    m_pTempLine->RemoveAll();
+    return;
+}
+void CPDF_LayoutProcessor_Reflow::ProcessUnitaryObjs(CPDF_PageObjects *pObjs, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix)
+{
+    if(!pObjs) {
+        return;
+    }
+    CFX_FloatRect ObjBBox = pObjs->CalcBoundingBox();
+    objMatrix.TransformRect(ObjBBox);
+    FX_FLOAT ObjWidth = ObjBBox.Width();
+    FX_FLOAT ObjHeight = ObjBBox.Height();
+    CFX_AffineMatrix matrix;
+    if(ObjWidth <= reflowWidth - m_fCurrLineWidth) {
+        matrix.Set(1, 0, 0, 1, m_fCurrLineWidth , 0);
+    } else if(ObjWidth <= reflowWidth) {
+        FinishedCurrLine();
+        matrix.Set(1, 0, 0, 1, 0, 0);
+    } else {
+        FinishedCurrLine();
+        FX_FLOAT f = reflowWidth / ObjWidth ;
+        matrix.Set(f, 0, 0, f, 0, 0);
+    }
+    CFX_AffineMatrix tempMatrix = matrix;
+    matrix.Concat(objMatrix);
+    FX_POSITION pos = pObjs->GetFirstObjectPosition();
+    while(pos) {
+        CPDF_PageObject* pObj = pObjs->GetNextObject(pos);
+        if(pObj->m_Type == PDFPAGE_TEXT) {
+            FX_INT32 ret = LogicPreObj((CPDF_TextObject*)pObj);
+            if(ret == 1 || ret == 2) {
+                continue;
+            }
+        }
+        CreateRFData(pObj, &matrix);
+    }
+    if (m_pTempLine) {
+        Transform(&tempMatrix, m_pTempLine, 0, m_pTempLine->GetSize());
+        AddTemp2CurrLine(0, m_pTempLine->GetSize());
+        m_pTempLine->RemoveAll();
+    }
+}
+void CPDF_LayoutProcessor_Reflow::ProcessPathObject(CPDF_PathObject *pObj, FX_FLOAT reflowWidth)
+{
+}
diff --git a/core/src/reflow/layoutprovider_taggedpdf.cpp b/core/src/reflow/layoutprovider_taggedpdf.cpp
new file mode 100644
index 0000000..c40c1cd
--- /dev/null
+++ b/core/src/reflow/layoutprovider_taggedpdf.cpp
@@ -0,0 +1,780 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "layoutprovider_taggedpdf.h"
+CPDF_LayoutElement::CPDF_LayoutElement()
+{
+    m_pTaggedElement = NULL;
+    m_pParentElement = NULL;
+}
+CPDF_LayoutElement::~CPDF_LayoutElement()
+{
+    m_ObjArray.RemoveAll();
+    int size = m_ChildArray.GetSize();
+    for(int i = 0; i < size; i++) {
+        CPDF_LayoutElement* pChild = (CPDF_LayoutElement*)m_ChildArray.GetAt(i);
+        delete pChild;
+        pChild = NULL;
+    }
+    m_ChildArray.RemoveAll();
+}
+LayoutType CPDF_LayoutElement::ConvertLayoutType(FX_BSTR name)
+{
+    if(name == (const char*)("Document")) {
+        return LayoutDocument;
+    } else if(name == (const char*)("Part")) {
+        return LayoutPart;
+    } else if(name == (const char*)("Art")) {
+        return LayoutArt;
+    } else if(name == (const char*)("Sect")) {
+        return LayoutSect;
+    } else if(name == (const char*)("Div")) {
+        return LayoutDiv;
+    } else if(name == (const char*)("BlockQuote")) {
+        return LayoutBlockQuote;
+    } else if(name == (const char*)("Caption")) {
+        return LayoutCaption;
+    } else if(name == (const char*)("TOC")) {
+        return LayoutTOC;
+    } else if(name == (const char*)("TOCI")) {
+        return LayoutTOCI;
+    } else if(name == (const char*)("Index")) {
+        return LayoutIndex;
+    } else if(name == (const char*)("NonStruct")) {
+        return LayoutNonStruct;
+    } else if(name == (const char*)("Private")) {
+        return LayoutPrivate;
+    } else if(name == (const char*)("P")) {
+        return LayoutParagraph;
+    } else if(name == (const char*)("H")) {
+        return LayoutHeading;
+    } else if(name == (const char*)("H1")) {
+        return LayoutHeading1;
+    } else if(name == (const char*)("H2")) {
+        return LayoutHeading2;
+    } else if(name == (const char*)("H3")) {
+        return LayoutHeading3;
+    } else if(name == (const char*)("H4")) {
+        return LayoutHeading4;
+    } else if(name == (const char*)("H5")) {
+        return LayoutHeading5;
+    } else if(name == (const char*)("H6")) {
+        return LayoutHeading6;
+    } else if(name == (const char*)("L")) {
+        return LayoutList;
+    } else if(name == (const char*)("LI")) {
+        return LayoutListItem;
+    } else if(name == (const char*)("Lbl")) {
+        return LayoutListLabel;
+    } else if(name == (const char*)("LBody")) {
+        return LayoutListBody;
+    } else if(name == (const char*)("Table")) {
+        return LayoutTable;
+    } else if(name == (const char*)("TR")) {
+        return LayoutTableRow;
+    } else if(name == (const char*)("TH")) {
+        return LayoutTableHeaderCell;
+    } else if(name == (const char*)("TD")) {
+        return LayoutTableDataCell;
+    } else if(name == (const char*)("THead")) {
+        return LayoutTableHeaderGroup;
+    } else if(name == (const char*)("TBody")) {
+        return LayoutTableBodyGroup;
+    } else if(name == (const char*)("TFoot")) {
+        return LayoutTableFootGroup;
+    } else if(name == (const char*)("Span")) {
+        return LayoutSpan;
+    } else if(name == (const char*)("Quote")) {
+        return LayoutQuote;
+    } else if(name == (const char*)("Note")) {
+        return LayoutNote;
+    } else if(name == (const char*)("Reference")) {
+        return LayoutReference;
+    } else if(name == (const char*)("BibEntry")) {
+        return LayoutBibEntry;
+    } else if(name == (const char*)("Code")) {
+        return LayoutCode;
+    } else if(name == (const char*)("Link")) {
+        return LayoutLink;
+    } else if(name == (const char*)("Annot")) {
+        return LayoutAnnot;
+    } else if(name == (const char*)("Ruby")) {
+        return LayoutRuby;
+    } else if(name == (const char*)("RB")) {
+        return LayoutRubyBase;
+    } else if(name == (const char*)("RT")) {
+        return LayoutRubyAnnot;
+    } else if(name == (const char*)("RP")) {
+        return LayoutRubyPunc;
+    } else if(name == (const char*)("Warichu")) {
+        return LayoutWarichu;
+    } else if(name == (const char*)("WT")) {
+        return LayoutWarichuText;
+    } else if(name == (const char*)("WP")) {
+        return LayoutWarichuPunc;
+    } else if(name == (const char*)("Figure")) {
+        return LayoutFigure;
+    } else if(name == (const char*)("Formula")) {
+        return LayoutFormula;
+    } else if(name == (const char*)("Form")) {
+        return LayoutForm;
+    } else {
+        return LayoutUnknown;
+    }
+}
+CFX_ByteStringC CPDF_LayoutElement::ConvertLayoutType(LayoutType type)
+{
+    FX_BSTR name = "";
+    if(type == LayoutArifact) {
+        return "Arifact";
+    } else if( type == LayoutDocument) {
+        return "Document";
+    } else if( type == LayoutPart) {
+        return "Part";
+    } else if( type == LayoutArt) {
+        return "Art";
+    } else if( type == LayoutSect) {
+        return "Sect";
+    } else if( type == LayoutDiv) {
+        return "Div";
+    } else if( type == LayoutBlockQuote) {
+        return "BlockQuote";
+    } else if( type == LayoutCaption) {
+        return "Caption";
+    } else if( type == LayoutTOC) {
+        return "TOC";
+    } else if( type == LayoutTOCI) {
+        return "TOCI";
+    } else if( type == LayoutIndex) {
+        return "Index";
+    } else if( type == LayoutNonStruct) {
+        return "NonStruct";
+    } else if( type == LayoutPrivate) {
+        return "Private";
+    } else if( type == LayoutParagraph) {
+        return "P";
+    } else if( type == LayoutHeading) {
+        return "H";
+    } else if( type == LayoutHeading1) {
+        return "H1";
+    } else if( type == LayoutHeading2) {
+        return "H2";
+    } else if( type == LayoutHeading3) {
+        return "H3";
+    } else if( type == LayoutHeading4) {
+        return "H4";
+    } else if( type == LayoutHeading5) {
+        return "H5";
+    } else if( type == LayoutHeading6) {
+        return "H6";
+    } else if( type == LayoutList) {
+        return "L";
+    } else if( type == LayoutListItem) {
+        return "LI";
+    } else if( type == LayoutListLabel) {
+        return "Lbl";
+    } else if( type == LayoutListBody) {
+        return "LBody";
+    } else if( type == LayoutTable) {
+        return "Table";
+    } else if( type == LayoutTableRow) {
+        return "TR";
+    } else if( type == LayoutTableHeaderCell) {
+        return "TH";
+    } else if( type == LayoutTableDataCell) {
+        return "TD";
+    } else if( type == LayoutTableHeaderGroup) {
+        return "THead";
+    } else if( type == LayoutTableBodyGroup) {
+        return "TBody";
+    } else if( type == LayoutTableFootGroup) {
+        return "TFoot";
+    } else if( type == LayoutSpan) {
+        return "Span";
+    } else if( type == LayoutQuote) {
+        return "Quote";
+    } else if( type == LayoutNote) {
+        return "Note";
+    } else if( type == LayoutReference) {
+        return "Reference";
+    } else if( type == LayoutBibEntry) {
+        return "BibEntry";
+    } else if( type == LayoutCode) {
+        return "Code";
+    } else if( type == LayoutLink) {
+        return "Link";
+    } else if( type == LayoutAnnot) {
+        return "Annot";
+    } else if( type == LayoutRuby) {
+        return "Ruby";
+    } else if( type == LayoutRubyBase) {
+        return "RB";
+    } else if( type == LayoutRubyAnnot) {
+        return "RT";
+    } else if( type == LayoutRubyPunc) {
+        return "RP";
+    } else if( type == LayoutWarichu) {
+        return "Warichu";
+    } else if( type == LayoutWarichuText) {
+        return "WT";
+    } else if( type == LayoutWarichuPunc) {
+        return "WP";
+    } else if( type == LayoutFigure) {
+        return "Figure";
+    } else if( type == LayoutFormula) {
+        return "Formula";
+    } else if( type == LayoutForm) {
+        return "Form";
+    }
+    return name;
+}
+CFX_ByteStringC CPDF_LayoutElement::ConvertLayoutAttr(LayoutAttr attr)
+{
+    switch(attr) {
+        case LayoutArtifactType:
+            return "Type";
+        case LayoutArtifactAttached:
+            return "Attached";
+        case LayoutArtifactSubType:
+            return "Subtype";
+        case LayoutPlacement:
+            return "Placement";
+        case LayoutWritingMode:
+            return "WritingMode";
+        case LayoutBackgroundColor:
+            return "BackgroundColor";
+        case LayoutBorderColor:
+            return "BorderColor";
+        case LayoutBorderStyle:
+            return "BorderStyle";
+        case LayoutBorderThickness:
+            return "BorderThickness";
+        case LayoutPadding:
+            return "Padding";
+        case LayoutColor:
+            return "Color";
+        case LayoutSpaceBefore:
+            return "SpaceBefore";
+        case LayoutSpaceAfter:
+            return "SpaceAfter";
+        case LayoutStartIndent:
+            return "StartIndent";
+        case LayoutEndIndent:
+            return "EndIndent";
+        case LayoutTextIndent:
+            return "TextIndent";
+        case LayoutTextAlign:
+            return "TextAlign";
+        case LayoutBBox:
+            return "BBox";
+        case LayoutWidth:
+            return "Width";
+        case LayoutHeight:
+            return "Height";
+        case LayoutBlockAlign:
+            return "BlockAlign";
+        case LayoutInlineAlign:
+            return "InlineAlign";
+        case LayoutTBorderStyle:
+            return "TBorderStyle";
+        case LayoutTPadding:
+            return "TPadding";
+        case LayoutBaselineShift:
+            return "BaselineShift";
+        case LayoutLineHeight:
+            return "LineHeight";
+        case LayoutTextDecorationColor:
+            return "TextDecorationColor";
+        case LayoutTextDecorationThickness:
+            return "TextDecorationThickness";
+        case LayoutTextDecorationType:
+            return "TextDecorationType";
+        case LayoutRubyAlign:
+            return "RubyAlign";
+        case LayoutRubyPosition:
+            return "RubyPosition";
+        case LayoutGlyphOrientationVertical:
+            return "GlyphOrientationVertical";
+        case LayoutColumnCount:
+            return "ColumnCount";
+        case LayoutColumnGap:
+            return "ColumnGap";
+        case LayoutColumnWidths:
+            return "ColumnWidths";
+        case LayoutListNumbering:
+            return "ListNumbering";
+        case LayoutFieldRole:
+            return "Role";
+        case LayoutFieldChecked:
+            return "checked";
+        case LayoutFieldDesc:
+            return "Desc";
+        case LayoutRowSpan:
+            return "RowSpan";
+        case LayoutColSpan:
+            return "ColSpan";
+        case LayoutTableHeaders:
+            return "Headers";
+        case LayoutTableHeaderScope:
+            return "Scope";
+        case LayoutTableSummary:
+            return "Summary";
+        default:
+            return "";
+    }
+}
+LayoutEnum CPDF_LayoutElement::ConvertLayoutEnum(CFX_ByteStringC Enum)
+{
+    if(Enum == "Block") {
+        return LayoutBlock;
+    } else if (Enum == "Inline") {
+        return LayoutInline;
+    } else if (Enum == "Before") {
+        return LayoutBefore;
+    } else if (Enum == "Start") {
+        return LayoutStart;
+    } else if (Enum == "End") {
+        return LayoutEnd;
+    } else if (Enum == "LrTb") {
+        return LayoutLrTb;
+    } else if (Enum == "RlTb") {
+        return LayoutRlTb;
+    } else if (Enum == "TbRl") {
+        return LayoutTbRl;
+    } else if (Enum == "None") {
+        return LayoutNone;
+    } else if (Enum == "Hidden") {
+        return LayoutHidden;
+    } else if (Enum == "Dotted") {
+        return LayoutDotted;
+    } else if (Enum == "Dashed") {
+        return LayoutDashed;
+    } else if (Enum == "Solid") {
+        return LayoutSolid;
+    } else if (Enum == "Double") {
+        return LayoutDouble;
+    } else if (Enum == "Groove") {
+        return LayoutGroove;
+    } else if (Enum == "Ridge") {
+        return LayoutRidge;
+    } else if (Enum == "Inset") {
+        return LayoutInset;
+    } else if (Enum == "Outset") {
+        return LayoutOutset;
+    } else if (Enum == "Normal") {
+        return LayoutNormal;
+    } else if (Enum == "Auto") {
+        return LayoutAuto;
+    } else if (Enum == "Center") {
+        return LayoutCenter;
+    } else if (Enum == "Justify") {
+        return LayoutJustify;
+    } else if (Enum == "Middle") {
+        return LayoutMiddle;
+    } else if (Enum == "Underline") {
+        return LayoutUnderline;
+    } else if (Enum == "Overline") {
+        return LayoutOverline;
+    } else if (Enum == "LineThrough") {
+        return LayoutLineThrough;
+    } else if (Enum == "Distribute") {
+        return LayoutDistribute;
+    } else if (Enum == "Disc") {
+        return LayoutDisc;
+    } else if (Enum == "Circle") {
+        return LayoutCircle;
+    } else if (Enum == "Square") {
+        return LayoutSquare;
+    } else if (Enum == "Decimal") {
+        return LayoutDecimal;
+    } else if (Enum == "UpperRoman") {
+        return LayoutUpperRoman;
+    } else if (Enum == "LowerRoman") {
+        return LayoutLowerRoman;
+    } else if (Enum == "UpperAlpha") {
+        return LayoutUpperAlpha;
+    } else if (Enum == "LowerAlpha") {
+        return LayoutLowerAlpha;
+    } else if (Enum == "rb") {
+        return LayoutRB;
+    } else if (Enum == "cb") {
+        return LayoutCB;
+    } else if (Enum == "pb") {
+        return LayoutPB;
+    } else if (Enum == "tv") {
+        return LayoutTV;
+    } else if (Enum == "on") {
+        return LayoutOn;
+    } else if (Enum == "off") {
+        return LayoutOff;
+    } else if (Enum == "neutral") {
+        return LayoutNeutral;
+    } else if (Enum == "Row") {
+        return LayoutRow;
+    } else if (Enum == "Column") {
+        return LayoutColumn;
+    } else if (Enum == "Both") {
+        return LayoutBoth;
+    } else if (Enum == "Left") {
+        return LayoutLeft;
+    } else if (Enum == "Top") {
+        return LayoutTop;
+    } else if (Enum == "Bottom") {
+        return LayoutBottom;
+    } else if (Enum == "Right") {
+        return LayoutRight;
+    } else if (Enum == "Pagination") {
+        return LayoutPagination;
+    } else if (Enum == "Layout") {
+        return LayoutLayout;
+    } else if (Enum == "Page") {
+        return LayoutPage;
+    } else if (Enum == "Background") {
+        return LayoutBackground;
+    } else if (Enum == "Header") {
+        return LayoutHeader;
+    } else if (Enum == "Footer") {
+        return LayoutFooter;
+    } else if (Enum == "Watermark") {
+        return LayoutWatermark;
+    } else {
+        return LayoutInvalid;
+    }
+}
+LayoutType CPDF_LayoutElement::GetType()
+{
+    if(!m_pTaggedElement) {
+        return LayoutUnknown;
+    }
+    CFX_ByteString name = m_pTaggedElement->GetType();
+    return this->ConvertLayoutType(name);
+}
+int	CPDF_LayoutElement::CountAttrValues(LayoutAttr attr_type)
+{
+    if(!m_pTaggedElement) {
+        return 0;
+    }
+    CPDF_Object* pObj = m_pTaggedElement->GetAttr(GetAttrOwner(attr_type), ConvertLayoutAttr(attr_type), IsInheritable(attr_type));
+    if(pObj) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+LayoutEnum CPDF_LayoutElement::GetEnumAttr(LayoutAttr attr_type, int index)
+{
+    if(!m_pTaggedElement) {
+        return LayoutInvalid;
+    }
+    CFX_ByteStringC owner = GetAttrOwner(attr_type);
+    CFX_ByteStringC default_value = GetDefaultNameValue(attr_type);
+    CFX_ByteStringC AttrName = ConvertLayoutAttr(attr_type);
+    CFX_ByteString	AttrValue = m_pTaggedElement->GetName(owner, AttrName, default_value, IsInheritable(attr_type), index);
+    return ConvertLayoutEnum(AttrValue);
+}
+CFX_ByteStringC CPDF_LayoutElement::GetAttrOwner(LayoutAttr attr_type)
+{
+    switch(attr_type) {
+        case LayoutListNumbering:
+            return "List";
+        case LayoutFieldRole:
+        case LayoutFieldChecked :
+        case LayoutFieldDesc:
+            return "PrintField";
+        case LayoutRowSpan:
+        case LayoutColSpan:
+        case LayoutTableHeaders:
+        case LayoutTableHeaderScope:
+        case LayoutTableSummary:
+            return "Table";
+        default:
+            return "Layout";
+    }
+}
+FX_FLOAT	CPDF_LayoutElement::GetNumberAttr(LayoutAttr attr_type, int index)
+{
+    if(!m_pTaggedElement) {
+        return 0;
+    }
+    CFX_ByteStringC owner = GetAttrOwner(attr_type);
+    FX_FLOAT default_value = GetDefaultFloatValue(attr_type);
+    CFX_ByteStringC AttrName = ConvertLayoutAttr(attr_type);
+    FX_FLOAT f = m_pTaggedElement->GetNumber(owner, AttrName, default_value, IsInheritable(attr_type), index);
+    if(attr_type == LayoutWidth && !f) {
+        f = m_pTaggedElement->GetNumber("Table", AttrName, default_value, IsInheritable(attr_type), index);
+    }
+    return f;
+}
+FX_COLORREF	CPDF_LayoutElement::GetColorAttr(LayoutAttr attr_type, int index)
+{
+    if(!m_pTaggedElement) {
+        return 0;
+    }
+    CFX_ByteStringC owner = GetAttrOwner(attr_type);
+    FX_COLORREF default_value = GetDefaultColorValue(attr_type);
+    CFX_ByteStringC AttrName = ConvertLayoutAttr(attr_type);
+    FX_ARGB f = m_pTaggedElement->GetColor(owner, AttrName, default_value, IsInheritable(attr_type), index);
+    return f;
+}
+FX_FLOAT CPDF_LayoutElement::GetDefaultFloatValue(LayoutAttr attr_type)
+{
+    switch(attr_type) {
+        case LayoutColumnCount:
+            return 1;
+        case LayoutRowSpan:
+            return 1;
+        case LayoutColSpan:
+            return 1;
+        default:
+            return 0;
+    }
+}
+FX_COLORREF CPDF_LayoutElement::GetDefaultColorValue(LayoutAttr attr_type)
+{
+    return -1;
+}
+CFX_ByteStringC CPDF_LayoutElement::GetDefaultNameValue(LayoutAttr attr_type)
+{
+    switch(attr_type) {
+        case LayoutPlacement:
+            return "Inline";
+        case LayoutWritingMode:
+            return "LrTb";
+        case LayoutBorderStyle:
+            return "None";
+        case LayoutTextAlign:
+            return "Start";
+        case LayoutBlockAlign:
+            return "Before";
+        case LayoutInlineAlign:
+            return "Start";
+        case LayoutTBorderStyle:
+            return "None";
+        case LayoutTextDecorationType:
+            return "None";
+        case LayoutRubyAlign:
+            return "Distribute";
+        case LayoutRubyPosition:
+            return "Before";
+        case LayoutGlyphOrientationVertical:
+            return "Auto";
+        case LayoutListNumbering:
+            return "None";
+        case LayoutFieldRole:
+            return "None";
+        default:
+            return "";
+    }
+}
+FX_BOOL	CPDF_LayoutElement::IsInheritable(LayoutAttr type)
+{
+    switch(type) {
+        case LayoutWritingMode:
+        case LayoutTextAlign:
+        case LayoutBlockAlign:
+        case LayoutInlineAlign:
+        case LayoutLineHeight:
+        case LayoutGlyphOrientationVertical:
+        case LayoutRubyAlign:
+        case LayoutRubyPosition:
+        case LayoutBorderThickness:
+        case LayoutStartIndent:
+        case LayoutEndIndent:
+        case LayoutTextIndent:
+        case LayoutTPadding:
+        case LayoutTextDecorationThickness:
+        case LayoutBorderColor:
+        case LayoutColor:
+        case LayoutTextDecorationColor:
+            return TRUE;
+        default:
+            return FALSE;
+    }
+}
+int	CPDF_LayoutElement::CountChildren()
+{
+    return m_ChildArray.GetSize();
+}
+IPDF_LayoutElement* CPDF_LayoutElement::GetChild(int index)
+{
+    return (IPDF_LayoutElement*)m_ChildArray.GetAt(index);
+}
+IPDF_LayoutElement* CPDF_LayoutElement::GetParent()
+{
+    return m_pParentElement;
+}
+int	CPDF_LayoutElement::CountObjects()
+{
+    if(m_pTaggedElement == NULL) {
+        return 0;
+    }
+    CFX_PtrArray* pObj = &m_ObjArray;
+    int size = pObj->GetSize();
+    return size;
+}
+CPDF_PageObject* CPDF_LayoutElement::GetObject(int index)
+{
+    if(m_pTaggedElement == NULL) {
+        return NULL;
+    }
+    CFX_PtrArray *pObj = &m_ObjArray;
+    int size = pObj->GetSize();
+    if(index < size) {
+        return (CPDF_PageObject*)pObj->GetAt(index);
+    }
+    return NULL;
+}
+FX_BOOL CPDF_LayoutElement::AddObject(CPDF_PageObject* pObj)
+{
+    return m_ObjArray.Add(pObj);
+}
+IPDF_LayoutProvider* IPDF_LayoutProvider::Create_LayoutProvider_TaggedPDF(CPDF_PageObjects* pPage)
+{
+    if(pPage == NULL) {
+        return NULL;
+    }
+    CPDF_LayoutProvider_TaggedPDF* pProvider = FX_NEW CPDF_LayoutProvider_TaggedPDF;
+    if (!pProvider) {
+        return NULL;
+    }
+    pProvider->Init(pPage);
+    return pProvider;
+}
+CPDF_LayoutProvider_TaggedPDF::CPDF_LayoutProvider_TaggedPDF()
+{
+    m_pPause = NULL;
+    m_pRoot = NULL;
+    m_pPageTree = NULL;
+    m_pCurTaggedElement = NULL;
+}
+CPDF_LayoutProvider_TaggedPDF::~CPDF_LayoutProvider_TaggedPDF()
+{
+    m_pCurTaggedElement = NULL;
+    m_pPause = NULL;
+    if(m_pRoot) {
+        delete m_pRoot;
+    }
+    m_pRoot = NULL;
+    if(m_pPageTree) {
+        delete m_pPageTree;
+    }
+    m_pPageTree = NULL;
+}
+void CPDF_LayoutProvider_TaggedPDF::ProcessElement(CPDF_LayoutElement*pParent, CPDF_StructElement* pTaggedElement)
+{
+    if(!pTaggedElement) {
+        return;
+    }
+    if(!pParent) {
+        m_Status = LayoutError;
+        return;
+    }
+    CPDF_LayoutElement* pElement = FX_NEW CPDF_LayoutElement;
+    if (!pElement) {
+        m_Status = LayoutError;
+        return;
+    }
+    pElement->m_pParentElement = pParent;
+    pElement->m_pTaggedElement = pTaggedElement;
+    pParent->m_ChildArray.Add(pElement);
+    int count = pTaggedElement->CountKids();
+    for(int i = 0; i < count; i++) {
+        CPDF_StructKid Kid = pTaggedElement->GetKid(i);
+        switch(Kid.m_Type) {
+            case CPDF_StructKid::Element: {
+                    ProcessElement(pElement, Kid.m_Element.m_pElement);
+                    if(m_Status != LayoutReady) {
+                        return ;
+                    }
+                }
+                break;
+            case CPDF_StructKid::PageContent: {
+                    int count = m_pPage->CountObjects();
+                    FX_POSITION pos = m_pPage->GetFirstObjectPosition();
+                    if(!pos) {
+                        m_Status = LayoutError;
+                        return ;
+                    }
+                    while (pos) {
+                        CPDF_PageObject* pObj = m_pPage->GetNextObject(pos);
+                        int pbjMCID = pObj->m_ContentMark.GetMCID();
+                        if((FX_DWORD)(pObj->m_ContentMark.GetMCID()) == Kid.m_PageContent.m_ContentId) {
+                            pElement->AddObject(pObj);
+                        }
+                    }
+                }
+                break;
+            case CPDF_StructKid::StreamContent:
+            case CPDF_StructKid::Object:
+            default:
+                break;
+        }
+    }
+}
+LayoutStatus CPDF_LayoutProvider_TaggedPDF::StartLoad(IFX_Pause* pPause)
+{
+    m_pPause = pPause;
+    if(m_pPage->m_pDocument && m_pPage->m_pFormDict) {
+        m_pPageTree = CPDF_StructTree::LoadPage(m_pPage->m_pDocument, m_pPage->m_pFormDict);
+    }
+    if(!m_pPageTree) {
+        m_Status = LayoutError;
+        return LayoutError;
+    }
+    int count = m_pPageTree->CountTopElements();
+    if(count == 0) {
+        m_Status = LayoutError;
+        return LayoutError;
+    }
+    m_pRoot = FX_NEW CPDF_LayoutElement;
+    if (!m_pRoot) {
+        m_Status = LayoutError;
+        return LayoutError;
+    }
+    for(int i = 0; i < count; i++) {
+        CPDF_StructElement* pElement = m_pPageTree->GetTopElement(i);
+        if(pElement) {
+            ProcessElement(m_pRoot, pElement);
+            if(m_Status != LayoutReady) {
+                return m_Status;
+            }
+        }
+    }
+    m_pCurTaggedElement = NULL;
+    m_Status = LayoutFinished;
+    return LayoutFinished;
+}
+LayoutStatus CPDF_LayoutProvider_TaggedPDF::Continue()
+{
+    if(!m_pCurTaggedElement) {
+        return LayoutError;
+    }
+    if(m_Status != LayoutToBeContinued) {
+        return LayoutError;
+    }
+    m_Status = LayoutReady;
+    int count = m_pPageTree->CountTopElements();
+    for(int i = 0; i < count; i++) {
+        CPDF_StructElement* pElement = m_pPageTree->GetTopElement(i);
+        if(pElement) {
+            ProcessElement(m_pRoot, pElement);
+            if(m_Status != LayoutReady) {
+                return m_Status;
+            }
+        }
+    }
+    m_pCurTaggedElement = NULL;
+    m_Status = LayoutFinished;
+    return LayoutFinished;
+}
+int CPDF_LayoutProvider_TaggedPDF::GetPosition()
+{
+    if(m_TopElementIndex == 0) {
+        return 0;
+    }
+    int count = m_pPageTree->CountTopElements();
+    return m_TopElementIndex / count * 100;
+}
diff --git a/core/src/reflow/layoutprovider_taggedpdf.h b/core/src/reflow/layoutprovider_taggedpdf.h
new file mode 100644
index 0000000..b2c8947
--- /dev/null
+++ b/core/src/reflow/layoutprovider_taggedpdf.h
@@ -0,0 +1,82 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef LayoutProvider_TaggedPDF_H
+#define LayoutProvider_TaggedPDF_H
+#include "../../include/reflow/reflowengine.h"
+class CPDF_LayoutElement : public IPDF_LayoutElement, public CFX_Object
+{
+public:
+    CPDF_LayoutElement();
+    ~CPDF_LayoutElement();
+
+    LayoutType	GetType();
+    void	GetRect(CFX_FloatRect& rcRect) {};
+
+    int		CountAttrValues(LayoutAttr attr_type);
+
+    LayoutEnum	GetEnumAttr(LayoutAttr attr_type, int index);
+    FX_FLOAT	GetNumberAttr(LayoutAttr attr_type, int index);
+    FX_COLORREF	GetColorAttr(LayoutAttr attr_type, int index);
+
+    int		CountChildren();
+
+    IPDF_LayoutElement* GetChild(int index);
+
+    IPDF_LayoutElement* GetParent();
+
+    int	CountObjects();
+    CPDF_PageObject*	GetObject(int index);
+    FX_BOOL AddObject(CPDF_PageObject* pObj);
+    CPDF_StructElement* m_pTaggedElement;
+    CPDF_LayoutElement* m_pParentElement;
+    CFX_PtrArray	m_ChildArray;
+    LayoutType ConvertLayoutType(FX_BSTR name);
+    CFX_ByteStringC ConvertLayoutType(LayoutType type);
+    CFX_ByteStringC ConvertLayoutAttr(LayoutAttr attr);
+    LayoutEnum ConvertLayoutEnum(CFX_ByteStringC Enum);
+
+protected:
+    FX_BOOL		IsInheritable(LayoutAttr attr_type);
+    CFX_ByteStringC GetAttrOwner(LayoutAttr attr_type);
+    CFX_ByteStringC GetDefaultNameValue(LayoutAttr attr_type);
+    FX_FLOAT		GetDefaultFloatValue(LayoutAttr attr_type);
+    FX_COLORREF		GetDefaultColorValue(LayoutAttr attr_type);
+    CFX_PtrArray	m_ObjArray;
+};
+class CPDF_LayoutProvider_TaggedPDF : public IPDF_LayoutProvider, public CFX_Object
+{
+public:
+    CPDF_LayoutProvider_TaggedPDF();
+    ~CPDF_LayoutProvider_TaggedPDF();
+    void			SetLayoutProviderStyle(LAYOUTPROVIDER_STYLE style) {};
+
+    void	Init(CPDF_PageObjects* pPage)
+    {
+        m_pPage = pPage;
+        m_Status = LayoutReady;
+    };
+
+    LayoutStatus	StartLoad(IFX_Pause* pPause = NULL);
+    LayoutStatus	Continue();
+    int		 		GetPosition();
+
+    IPDF_LayoutElement* GetRoot()
+    {
+        return m_pRoot;
+    };
+
+protected:
+    void ProcessElement(CPDF_LayoutElement*pParent, CPDF_StructElement* pTaggedElement);
+    LayoutStatus	m_Status;
+    CPDF_StructElement* m_pCurTaggedElement;
+    CPDF_LayoutElement* m_pRoot;
+    IFX_Pause*			m_pPause;
+    CPDF_PageObjects*	m_pPage;
+    CPDF_StructTree*	m_pPageTree;
+    int					m_TopElementIndex;
+};
+#endif
diff --git a/core/src/reflow/reflowedpage.cpp b/core/src/reflow/reflowedpage.cpp
new file mode 100644
index 0000000..11baef8
--- /dev/null
+++ b/core/src/reflow/reflowedpage.cpp
@@ -0,0 +1,622 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/reflow/reflowengine.h"
+#include "reflowedpage.h"
+CPDF_ProgressiveReflowPageParser::CPDF_ProgressiveReflowPageParser()
+{
+    m_nObjProcessed = 0;
+    m_pReflowEngine = NULL;
+    m_pProvider = NULL;
+}
+CPDF_ProgressiveReflowPageParser::~CPDF_ProgressiveReflowPageParser()
+{
+    if(m_pProvider) {
+        delete m_pProvider;
+    }
+    m_pProvider = NULL;
+    if(m_pReflowEngine) {
+        delete m_pReflowEngine;
+    }
+    m_pReflowEngine = NULL;
+}
+void CPDF_ProgressiveReflowPageParser::Init()
+{
+    m_Status = Ready;
+}
+CPDF_ReflowedPage::CPDF_ReflowedPage(CFX_GrowOnlyPool*	pMemoryPool)
+{
+    m_PageWidth = 0;
+    m_PageHeight = 0;
+    m_bWaiting = TRUE;
+    if(pMemoryPool) {
+        m_pMemoryPool = pMemoryPool;
+        m_bCreateMemoryPool = FALSE;
+    } else {
+        m_pMemoryPool = FX_NEW CFX_GrowOnlyPool;
+        m_bCreateMemoryPool = TRUE;
+    }
+    m_pCharState = FX_NEW CRF_CharStateArray(10);
+    m_pReflowed = FX_NEW CRF_DataPtrArray(500);
+    m_pPageInfos = NULL;
+}
+CPDF_ReflowedPage::~CPDF_ReflowedPage()
+{
+    if (m_pReflowed) {
+        for(int i = 0; i < m_pReflowed->GetSize(); i++) {
+            CRF_Data* pData = (*m_pReflowed)[i];
+            if(pData->m_Type == CRF_Data::Image) {
+                delete ((CRF_ImageData*)pData)->m_pBitmap;
+            }
+        }
+        m_pReflowed->RemoveAll();
+        delete m_pReflowed;
+    }
+    m_pReflowed = NULL;
+    if (m_pCharState) {
+        m_pCharState->RemoveAll();
+        delete m_pCharState;
+    }
+    m_pCharState = NULL;
+    if(m_bCreateMemoryPool && m_pMemoryPool) {
+        m_pMemoryPool->FreeAll();
+    }
+    if (m_pMemoryPool) {
+        delete m_pMemoryPool;
+    }
+    m_pMemoryPool = NULL;
+    m_pPDFPage = NULL;
+    if (m_pPageInfos) {
+        ReleasePageObjsMemberShip();
+    }
+}
+FX_BOOL CPDF_ReflowedPage::RetainPageObjsMemberShip()
+{
+    if (NULL == m_pPDFPage) {
+        return FALSE;
+    }
+    if (NULL == m_pPageInfos) {
+        m_pPageInfos = FX_NEW CFX_MapPtrToPtr();
+    } else {
+        return TRUE;
+    }
+    FX_POSITION	pos = m_pPDFPage->GetFirstObjectPosition();
+    if (!pos)	{
+        return FALSE;
+    }
+    CPDF_PageObject* pPageObj = NULL;
+    while (pos) {
+        pPageObj = m_pPDFPage->GetNextObject(pos);
+        MarkPageObjMemberShip(pPageObj, NULL);
+        pPageObj = NULL;
+    }
+    return TRUE;
+}
+void CPDF_ReflowedPage::MarkPageObjMemberShip(CPDF_PageObject* pObj, CRF_PageInfo* pParent)
+{
+    if (NULL == m_pPageInfos) {
+        return;
+    }
+    CRF_PageInfo* pPageInfo = FX_NEW CRF_PageInfo(pObj, pParent);
+    if (NULL == pPageInfo) {
+        return;
+    }
+    m_pPageInfos->SetAt(pObj, pPageInfo);
+    if (PDFPAGE_FORM != pObj->m_Type) {
+        return;
+    }
+    CPDF_FormObject* pFormObj = (CPDF_FormObject*)pObj;
+    FX_POSITION	pos;
+    pos = pFormObj->m_pForm->GetFirstObjectPosition();
+    if (!pos)	{
+        return;
+    }
+    CPDF_PageObject* pPageObj = NULL;
+    while (pos) {
+        pPageObj = pFormObj->m_pForm->GetNextObject(pos);
+        MarkPageObjMemberShip(pPageObj, pPageInfo);
+        pPageObj = NULL;
+    }
+}
+void CPDF_ReflowedPage::ReleasePageObjsMemberShip()
+{
+    if (NULL == m_pPageInfos) {
+        return;
+    }
+    CPDF_PageObject* pPageObj = NULL;
+    CRF_PageInfo* pPageInfo = NULL;
+    FX_POSITION pos = m_pPageInfos->GetStartPosition();
+    while (pos) {
+        m_pPageInfos->GetNextAssoc(pos, (void*&)pPageObj, (void*&)pPageInfo);
+        delete pPageInfo;
+    }
+    m_pPageInfos->RemoveAll();
+    delete m_pPageInfos;
+    m_pPageInfos = NULL;
+}
+CPDF_Dictionary* CPDF_ReflowedPage::GetFormResDict(CPDF_PageObject* pObj)
+{
+    if (NULL == m_pPageInfos) {
+        return NULL;
+    }
+    if (FALSE == RetainPageObjsMemberShip()) {
+        return NULL;
+    }
+    CRF_PageInfo* pPageInfo = (CRF_PageInfo*)m_pPageInfos->GetValueAt(pObj);
+    if (NULL == pPageInfo) {
+        return NULL;
+    }
+    return pPageInfo->GetFormDict();
+}
+void CPDF_ReflowedPage::GetDisplayMatrix(CFX_AffineMatrix& matrix, FX_INT32 xPos, FX_INT32 yPos, FX_INT32 xSize, FX_INT32 ySize, FX_INT32 iRotate, const CFX_AffineMatrix* pPageMatrix)
+{
+    CFX_AffineMatrix display_matrix;
+    if(m_PageHeight == 0) {
+        matrix.Set(1, 0, 0, -1, 0, 0);
+        return;
+    }
+    FX_INT32 x0, y0, x1, y1, x2, y2;
+    iRotate %= 4;
+    switch (iRotate) {
+        case 0:
+            x0 = xPos;
+            y0 = yPos;
+            x1 = xPos;
+            y1 = yPos + ySize;
+            x2 = xPos + xSize;
+            y2 = yPos;
+            break;
+        case 3:
+            x0 = xPos;
+            y0 = ySize + yPos;
+            x1 =  xPos + xSize;
+            y1 = yPos + ySize;
+            x2 = xPos;
+            y2 = yPos;
+            break;
+        case 2:
+            x0 = xSize + xPos;
+            y0 = ySize + yPos;
+            x1 = xSize + xPos ;
+            y1 = yPos;
+            x2 = xPos;
+            y2 =  ySize + yPos;
+            break;
+        case 1:
+            x0 = xPos + xSize;
+            y0 = yPos;
+            x1 = xPos;
+            y1 = yPos;
+            x2 = xPos + xSize;
+            y2 = yPos + ySize;
+            break;
+    }
+    display_matrix.Set(FXSYS_Div((FX_FLOAT)(x2 - x0), m_PageWidth),
+                       FXSYS_Div((FX_FLOAT)(y2 - y0), m_PageWidth),
+                       FXSYS_Div((FX_FLOAT)(x1 - x0), m_PageHeight),
+                       FXSYS_Div((FX_FLOAT)(y1 - y0), m_PageHeight),
+                       (FX_FLOAT)(x0), (FX_FLOAT)(y0));
+    matrix.Set(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
+    matrix.Concat(display_matrix);
+    return;
+}
+FX_FLOAT CPDF_ReflowedPage::GetPageHeight()
+{
+    return m_PageHeight;
+}
+void CPDF_ReflowedPage::FocusGetData(const CFX_AffineMatrix matrix, FX_INT32 x, FX_INT32 y, CFX_ByteString& str)
+{
+    if (NULL == m_pReflowed) {
+        return;
+    }
+    CFX_AffineMatrix revMatrix;
+    revMatrix.SetReverse(matrix);
+    FX_FLOAT x1, y1;
+    revMatrix.Transform((float)x, (float)y, x1, y1);
+    int count = m_pReflowed->GetSize();
+    FX_FLOAT dx = 1000, dy = 1000;
+    FX_INT32 pos = 0;
+    FX_INT32 i;
+    for(i = 0; i < count; i++) {
+        CRF_Data* pData = (*m_pReflowed)[i];
+        FX_FLOAT tempdy = FXSYS_fabs(pData->m_PosY - y1);
+        if(FXSYS_fabs(tempdy - dy) < 1) {
+            continue;
+        }
+        CFX_FloatRect rect (0, pData->m_PosY + pData->m_Height, this->m_PageWidth, pData->m_PosY);
+        if(rect.Contains(x1, y1)) {
+            pos = i;
+            dx = 0;
+            dy = 0;
+            break;
+        } else if(tempdy < dy) {
+            dy = tempdy;
+            dx = FXSYS_fabs(pData->m_PosX - x1);
+            pos = i;
+        } else if (tempdy == dy) {
+            FX_FLOAT tempdx = FXSYS_fabs(pData->m_PosX - x1);
+            if(tempdx < dx) {
+                dx = tempdx;
+                pos = i;
+            }
+        } else if (tempdy > dy) {
+            break;
+        }
+    }
+    if(dx != 0 || dy != 0) {
+        count = count < (pos + 10) ? count : (pos + 10);
+        for(i = 0 > (pos - 10) ? 0 : (pos - 10); i < count; i++) {
+            CRF_Data* pData = (*m_pReflowed)[i];
+            FX_FLOAT tempdy = FXSYS_fabs(pData->m_PosY - y1);
+            if(tempdy < dy) {
+                dy = tempdy;
+                dx = FXSYS_fabs(pData->m_PosX - x1);
+                pos = i;
+            } else if (tempdy == dy) {
+                FX_FLOAT tempdx = FXSYS_fabs(pData->m_PosX - x1);
+                if(tempdx < dx) {
+                    dx = tempdx;
+                    pos = i;
+                }
+            }
+        }
+    }
+    str.Format("%d", pos);
+}
+FX_BOOL CPDF_ReflowedPage::FocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, FX_INT32& x, FX_INT32& y)
+{
+    if (NULL == m_pReflowed) {
+        return FALSE;
+    }
+    FX_INT32 pos = FXSYS_atoi(str);
+    if(pos < 0 || pos >= m_pReflowed->GetSize()) {
+        return FALSE;
+    }
+    CRF_Data* pData = (*m_pReflowed)[pos];
+    FX_FLOAT x1, y1;
+    matrix.Transform(pData->m_PosX, pData->m_PosY + pData->m_Height, x1, y1);
+    x = (int)x1;
+    y = (int)y1;
+    return TRUE;
+}
+int CPDF_ProgressiveReflowPageParser::GetPosition()
+{
+    if(!m_pProvider) {
+        return 0;
+    }
+    if(!m_pReflowEngine) {
+        return m_pProvider->GetPosition() / 2;
+    }
+    return m_pProvider->GetPosition() / 2 + m_pReflowEngine->GetPosition() / 2;
+}
+void CPDF_ProgressiveReflowPageParser::Continue(IFX_Pause* pPause)
+{
+    if (NULL == m_pReflowPage) {
+        return;
+    }
+    if(m_Status != ToBeContinued) {
+        return;
+    }
+    m_pPause = pPause;
+    if(m_pReflowEngine) {
+        if(m_pReflowEngine->Continue() != LayoutToBeContinued) {
+            m_Status = Done;
+        }
+    } else {
+        if(m_pProvider->Continue() == LayoutFinished) {
+            m_pReflowEngine = IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(m_TopIndent, m_ReflowedWidth, m_fScreenHeight, m_pReflowPage, m_flags, m_ParseStyle.m_LineSpace);
+            CFX_AffineMatrix matrix;
+            m_pPDFPage->GetDisplayMatrix(matrix, 0, 0, (int)(m_pPDFPage->GetPageWidth()), (int)(m_pPDFPage->GetPageHeight()), 0);
+            if(m_pReflowEngine->StartProcess(m_pProvider->GetRoot(), m_pPause, &matrix) != LayoutToBeContinued) {
+                m_Status = Done;
+            }
+        }
+    }
+    if(m_TopIndent && m_Status == Done) {
+        m_pReflowPage->m_PageHeight -= m_TopIndent;
+    }
+}
+void CPDF_ProgressiveReflowPageParser::Clear()
+{
+    this->Init();
+    return;
+}
+FX_BOOL IPDF_ProgressiveReflowPageParser::IsTaggedPage(CPDF_PageObjects*pPage)
+{
+    if(!pPage) {
+        return FALSE;
+    }
+    CPDF_StructTree* pPageTree = CPDF_StructTree::LoadPage(pPage->m_pDocument, pPage->m_pFormDict);
+    if(pPageTree) {
+        int count = pPageTree->CountTopElements();
+        if(count) {
+            for(int i = 0; i < count; i++) {
+                CPDF_StructElement* pElm = pPageTree->GetTopElement(i);
+                if(pElm) {
+                    delete pPageTree;
+                    pPageTree = NULL;
+                    return TRUE;
+                }
+            }
+        }
+        delete pPageTree;
+        pPageTree = NULL;
+        return FALSE;
+    }
+    return FALSE;
+}
+void CPDF_ProgressiveReflowPageParser::Start(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT topIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags)
+{
+    if (NULL == pReflowPage) {
+        m_Status = Failed;
+        return;
+    }
+    m_flags = flags;
+    m_pReflowPage = (CPDF_ReflowedPage*)pReflowPage;
+    m_pReflowPage->m_pPDFPage = pPage;
+    m_pReflowPage->ReleasePageObjsMemberShip();
+    m_pPDFPage = pPage;
+    m_TopIndent = topIndent;
+    m_pPause = pPause;
+    m_fScreenHeight = fHeight;
+    m_ReflowedWidth = fWidth;
+    m_pProvider = IPDF_LayoutProvider::Create_LayoutProvider_TaggedPDF(m_pPDFPage);
+    LayoutStatus status = m_pProvider->StartLoad(pPause);
+    if(status == LayoutError) {
+        delete m_pProvider;
+        m_pProvider = IPDF_LayoutProvider::Create_LayoutProvider_AutoReflow(m_pPDFPage, m_flags & RF_PARSER_READERORDER);
+        if (NULL == m_pProvider) {
+            m_Status = Failed;
+            return;
+        }
+        status = m_pProvider->StartLoad(pPause);
+    }
+    if(status == LayoutError) {
+        delete m_pProvider;
+        m_pProvider = NULL;
+        m_Status = Failed;
+        return;
+    }
+    if(status == LayoutToBeContinued) {
+        m_Status = ToBeContinued;
+    } else if (status == LayoutFinished) {
+        m_pReflowEngine = IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(topIndent, fWidth, fHeight, pReflowPage, m_flags, m_ParseStyle.m_LineSpace);
+        if(NULL == m_pReflowEngine) {
+            delete m_pProvider;
+            m_pProvider = NULL;
+            m_Status = Failed;
+            return;
+        }
+        CFX_AffineMatrix matrix;
+        pPage->GetDisplayMatrix(matrix, 0, 0, (int)(pPage->GetPageWidth()), (int)(pPage->GetPageHeight()), 0);
+        CFX_AffineMatrix matrix1 = pPage->GetPageMatrix();
+        if((status = m_pReflowEngine->StartProcess(m_pProvider->GetRoot(), pPause, &matrix)) != LayoutToBeContinued) {
+            delete m_pReflowEngine;
+            m_pReflowEngine = NULL;
+            m_Status = Done;
+        } else {
+            m_Status = ToBeContinued;
+        }
+    }
+    if(status != LayoutToBeContinued) {
+        delete m_pProvider;
+        m_pProvider = NULL;
+    }
+    if(m_TopIndent && m_Status == Done) {
+        m_pReflowPage->m_PageHeight -= m_TopIndent;
+    }
+    return;
+}
+CPDF_ProgressiveReflowPageRender::~CPDF_ProgressiveReflowPageRender()
+{
+    if(m_pDisplayMatrix) {
+        delete m_pDisplayMatrix;
+    }
+    m_pDisplayMatrix = NULL;
+}
+CPDF_ProgressiveReflowPageRender::CPDF_ProgressiveReflowPageRender()
+{
+    m_Status = Ready;
+    m_pReflowPage = NULL;
+    m_pDisplayMatrix = NULL;
+    m_CurrNum = 0;
+    m_pFontEncoding = NULL;
+    m_DisplayColor = -1;
+}
+static FX_FLOAT _CIDTransformToFloat(FX_BYTE ch)
+{
+    if (ch < 128) {
+        return ch * 1.0f / 127;
+    }
+    return (-255 + ch) * 1.0f / 127;
+}
+int	CPDF_ProgressiveReflowPageRender::GetPosition()
+{
+    if(m_CurrNum == 0 || NULL == m_pReflowPage) {
+        return 0;
+    }
+    int size = m_pReflowPage->m_pReflowed->GetSize();
+    if(size == 0 || m_CurrNum >= size) {
+        return 100;
+    }
+    return (int)(m_CurrNum * 100 / size);
+}
+void CPDF_ProgressiveReflowPageRender::Display(IFX_Pause* pPause)
+{
+    if (NULL == m_pReflowPage) {
+        m_Status = Done;
+        return;
+    }
+    FX_RECT clipBox = m_pFXDevice->GetClipBox();
+    int size = m_pReflowPage->m_pReflowed->GetSize();
+    if (size < 1 || NULL == m_pDisplayMatrix) {
+        m_Status = Done;
+        return;
+    }
+    for(int i = m_CurrNum; i < size; i++) {
+        CRF_Data* pData = (*m_pReflowPage->m_pReflowed)[i];
+        if(!pData) {
+            continue;
+        }
+        CFX_FloatRect rect (pData->m_PosX, pData->m_PosY + pData->m_Height, pData->m_PosX + pData->m_Width, pData->m_PosY);
+        m_pDisplayMatrix->TransformRect(rect);
+        if(rect.left > clipBox.right || rect.right < clipBox.left || rect.bottom > clipBox.bottom || rect.top < clipBox.top) {
+            continue;
+        }
+        if(pData->GetType() == CRF_Data::Text) {
+            CRF_CharData* pCharData = (CRF_CharData*)pData;
+            CPDF_Font* pPDFFont = pCharData->m_pCharState->m_pFont;
+            if(pPDFFont->GetFontType() == PDFFONT_TYPE3) {
+                continue;
+            }
+            FX_FLOAT x = pData->m_PosX, y = pData->m_PosY - pCharData->m_pCharState->m_fDescent;
+            FXTEXT_CHARPOS charpos ;
+            charpos.m_GlyphIndex = pPDFFont->GlyphFromCharCode(pCharData->m_CharCode);
+            charpos.m_FontCharWidth = pPDFFont->m_Font.GetGlyphWidth(charpos.m_GlyphIndex);
+            charpos.m_OriginX       = x;
+            charpos.m_OriginY       = y;
+            FX_FLOAT charW = pData->m_Width * 1000 / pData->m_Height;
+            if(charW != charpos.m_FontCharWidth) {
+                charpos.m_bGlyphAdjust  = TRUE;
+                charpos.m_AdjustMatrix[0] = charW / charpos.m_FontCharWidth;
+                charpos.m_AdjustMatrix[1] = 0;
+                charpos.m_AdjustMatrix[2] = 0;
+                charpos.m_AdjustMatrix[3] = 1;
+            } else {
+                charpos.m_bGlyphAdjust  = FALSE;
+            }
+            FX_BOOL bRet = FALSE;
+            if(m_DisplayColor == -1)
+                bRet = m_pFXDevice->DrawNormalText(1, &charpos, &(pPDFFont->m_Font),
+                                                   NULL, pCharData->m_pCharState->m_fFontSize,
+                                                   m_pDisplayMatrix, pCharData->m_pCharState->m_Color + 0xff000000, FXTEXT_CLEARTYPE);
+            else
+                bRet = m_pFXDevice->DrawNormalText(1, &charpos, &(pPDFFont->m_Font),
+                                                   NULL, pCharData->m_pCharState->m_fFontSize, m_pDisplayMatrix, m_DisplayColor, FXTEXT_CLEARTYPE);
+        } else if(pData->GetType() == CRF_Data::Image) {
+            CRF_ImageData* pImageData = (CRF_ImageData*)pData;
+            if(!pImageData->m_pBitmap) {
+                continue;
+            }
+            int left = 0, top = 0;
+            CFX_DIBitmap* pDiBmp = NULL;
+            CFX_DIBSource* pDispSource = pImageData->m_pBitmap;
+            if(pImageData->m_Matrix.d < 0) {
+                CFX_AffineMatrix matrix(pImageData->m_Matrix.a, 0, 0, -pImageData->m_Matrix.d, 0, 0);
+                int left, top;
+                pDiBmp = pImageData->m_pBitmap->TransformTo(&matrix, left, top);
+                pDispSource = pDiBmp;
+            }
+            if (NULL == pDispSource) {
+                continue;
+            }
+            if (pDispSource->GetFormat() == FXDIB_1bppMask || pDispSource->GetFormat() == FXDIB_8bppMask) {
+                m_pFXDevice->StretchBitMask(pDispSource, (int)(rect.left + 0.5), (int)(rect.bottom + 0.5), (int)(rect.Width() + 0.5), (int)(rect.Height() + 0.5), 0xff000000);
+            } else {
+                m_pFXDevice->StretchDIBits(pDispSource, (int)(rect.left + 0.5), (int)(rect.bottom + 0.5), (int)(rect.Width() + 0.5), (int)(rect.Height() + 0.5));
+            }
+            if(m_pFXDevice->GetBitmap() && m_pFXDevice->GetBitmap()->GetFormat() == FXDIB_8bppRgb &&
+                    m_pFXDevice->GetBitmap()->GetPalette() == NULL) {
+                int nPalette = 0;
+                switch(m_DitherBits) {
+                    case 0:
+                        nPalette = 0;
+                        break;
+                    case 1:
+                        nPalette = 2;
+                        break;
+                    case 2:
+                        nPalette = 4;
+                        break;
+                    case 3:
+                        nPalette = 8;
+                        break;
+                    case 4:
+                        nPalette = 16;
+                        break;
+                    case 5:
+                        nPalette = 32;
+                        break;
+                    case 6:
+                        nPalette = 64;
+                        break;
+                    case 7:
+                        nPalette = 128;
+                        break;
+                    default:
+                        nPalette = 256;
+                        break;
+                }
+                if(nPalette >= 2) {
+                    FX_ARGB * palette = FX_Alloc(FX_ARGB, nPalette);
+                    nPalette --;
+                    palette[0] = 0;
+                    palette[nPalette] = 255;
+                    FX_FLOAT Dither = (FX_FLOAT)255 / (nPalette);
+                    for(int i = 1; i < nPalette; i++) {
+                        palette[i] = (FX_ARGB)(Dither * i + 0.5);
+                    }
+                    FX_RECT tmpRect = rect.GetOutterRect();
+                    m_pFXDevice->GetBitmap()->DitherFS(palette, nPalette + 1, &tmpRect);
+                    FX_Free (palette);
+                }
+            }
+            if(pDiBmp) {
+                delete pDiBmp;
+            }
+        } else if(pData->GetType() == CRF_Data::Path) {
+        }
+        if(!(i % 10)) {
+            if(pPause && pPause->NeedToPauseNow()) {
+                i++;
+                m_CurrNum = i;
+                m_Status = ToBeContinued;
+                return;
+            }
+        }
+    }
+    m_CurrNum = size;
+    m_Status = Done;
+}
+void CPDF_ProgressiveReflowPageRender::Start(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits)
+{
+    if(!pReflowPage || !pDevice || !pMatrix) {
+        m_Status = Failed;
+        return;
+    }
+    m_DitherBits = DitherBits;
+    m_Status = Ready;
+    m_CurrNum = 0;
+    m_pReflowPage = (CPDF_ReflowedPage*)pReflowPage;
+    m_pFXDevice = pDevice;
+    if(NULL == m_pDisplayMatrix) {
+        m_pDisplayMatrix = FX_NEW CFX_AffineMatrix;
+    }
+    if (m_pDisplayMatrix) {
+        m_pDisplayMatrix->Copy(*pMatrix);
+    }
+    m_Status = ToBeContinued;
+    Display(pPause);
+}
+void CPDF_ProgressiveReflowPageRender::Continue(IFX_Pause* pPause)
+{
+    Display(pPause);
+}
+void CPDF_ProgressiveReflowPageRender::SetDisplayColor(FX_COLORREF color)
+{
+    m_DisplayColor = color;
+}
+void CPDF_ProgressiveReflowPageRender::Clear()
+{
+    if (m_pDisplayMatrix) {
+        delete m_pDisplayMatrix;
+    }
+    m_pDisplayMatrix = NULL;
+    m_pReflowPage = NULL;
+    m_pFXDevice = NULL;
+    m_CurrNum = 0;
+    m_Status = Ready;
+}
diff --git a/core/src/reflow/reflowedpage.h b/core/src/reflow/reflowedpage.h
new file mode 100644
index 0000000..b768341
--- /dev/null
+++ b/core/src/reflow/reflowedpage.h
@@ -0,0 +1,372 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _REFLOWED_PAGE_H
+#define _REFLOWED_PAGE_H
+#include "../../include/reflow/reflowengine.h"
+#define GET_SIGNED(a) ( (a)>0 ? a/a : (a==0 ? 0 : -a/a) )
+class CRF_Data;
+class CRF_LineData;
+class CRF_CharData;
+class CRF_PathData;
+class CRF_ImageData;
+class CRF_Table;
+class CRF_AttrOperation;
+class CRF_OperationDate;
+class CPDF_ReflowedPage;
+class CPDF_Rect;
+class CFX_Object;
+typedef CFX_SegmentedArray<CRF_Data*> CRF_DataPtrArray;
+class CRF_CharState;
+typedef CFX_SegmentedArray<CRF_CharState> CRF_CharStateArray;
+#define SST_GE		1
+#define SST_BLSE	2
+#define SST_ILSE	3
+#define SST_IE		4
+class CPDF_LayoutProcessor_Reflow : public IPDF_LayoutProcessor, public CFX_Object
+{
+public:
+    CPDF_LayoutProcessor_Reflow();
+    ~CPDF_LayoutProcessor_Reflow();
+    void Init(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, CPDF_ReflowedPage* pReflowedPage, int flags, FX_FLOAT lineSpace);
+
+    LayoutStatus	StartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix = NULL);
+    LayoutStatus	Continue();
+    int				GetPosition();
+protected:
+    void	FitPageMode();
+    void	ProcessElement(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth);
+    FX_FLOAT GetElmWidth(IPDF_LayoutElement* pElement);
+    CFX_FloatRect GetElmBBox(IPDF_LayoutElement* pElement);
+    void	ProcessTable(FX_FLOAT dx);
+    void	ProcessObjs(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth);
+    void	ProcessObject(CPDF_PageObject* pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix);
+    void	ProcessTextObject(CPDF_TextObject *pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix);
+    void	ProcessPathObject(CPDF_PathObject *pObj, FX_FLOAT reflowWidth);
+    void	ProcessUnitaryObjs(CPDF_PageObjects *pObjs, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix);
+    FX_INT32 LogicPreObj(CPDF_TextObject* pObj);
+    int ProcessInsertObject(CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix);
+    FX_WCHAR GetPreChar();
+    FX_BOOL IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2);
+    int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const;
+    FX_BOOL	IsCanBreakAfter(FX_DWORD unicode);
+    FX_BOOL	IsCanBreakBefore(FX_DWORD unicode);
+    FX_INT32 GetElementTypes(LayoutType layoutType);
+    void				CreateRFData(CPDF_PageObject* pObj, CFX_AffineMatrix* pMatrix = NULL);
+    CRF_CharState*		GetCharState(CPDF_TextObject* pObj, CPDF_Font* pFont, FX_FLOAT fHeight, FX_ARGB color);
+    FX_FLOAT		ConverWidth(FX_FLOAT width);
+    void	AddData2CurrLine(CRF_Data* pData);
+    void	AddTemp2CurrLine(int begin, int count );
+    void	Transform(const CFX_AffineMatrix* pMatrix, CRF_Data* pData);
+    void	Transform(const CFX_AffineMatrix* pMatrix, CRF_DataPtrArray* pDataArray, int beginPos, int count = 0);
+    FX_FLOAT GetDatasWidth( int beginPos, int endpos);
+    void	UpdateCurrLine();
+    FX_BOOL	FinishedCurrLine();
+    int m_flags;
+    CFX_AffineMatrix m_PDFMatrix;
+    LayoutStatus	m_Status;
+    CPDF_TextObject* m_pPreObj;
+    CFX_AffineMatrix m_perMatrix;
+    IPDF_LayoutElement*	m_pLayoutElement;
+    IPDF_LayoutElement* m_pRootElement;
+    FX_FLOAT		m_CurrRefWidth;
+    IFX_Pause*		m_pPause;
+    LayoutEnum		m_CurrWritingMode;
+    CPDF_ReflowedPage*	m_pReflowedPage;
+    FX_FLOAT		m_fRefWidth;
+    FX_FLOAT		m_TopIndent;
+    FX_FLOAT		m_fLineSpace;
+    FX_FLOAT		m_fScreenHeight;
+    FX_FLOAT		m_fCurrMaxWidth;
+    FX_FLOAT		m_fCurrLineWidth;
+    FX_FLOAT		m_fCurrLineHeight;
+    CRF_DataPtrArray*	m_pCurrLine;
+    CRF_DataPtrArray*	m_pTempLine;
+    FX_BOOL			m_bIllustration;
+    FX_FLOAT		m_fLineHeight;
+    LayoutEnum		m_TextAlign;
+    FX_FLOAT		m_StartIndent;
+    CFX_ArrayTemplate<CRF_Table*> m_TableArray;
+    int				m_PausePosition;
+};
+struct RF_TableCell {
+    int			m_BeginPos;
+    int			m_EndPos;
+    FX_FLOAT m_MaxWidth;
+    FX_FLOAT m_PosX;
+    FX_FLOAT	m_PosY;
+    FX_FLOAT	m_CellWidth;
+    FX_FLOAT m_CellHeight;
+    int			m_RowSpan;
+    int			m_ColSpan;
+    LayoutEnum	m_BlockAlign;
+    LayoutEnum	m_InlineAlign;
+};
+typedef CFX_ArrayTemplate<RF_TableCell*> CRF_TableCellArray;
+class CRF_Table : public CFX_Object
+{
+public:
+    CRF_Table()
+    {
+        m_TableWidth = 0;
+        m_nCol = 0;
+    }
+    CRF_TableCellArray  m_pCellArray;
+    CFX_WordArray		m_nCell;
+    int					m_nCol;
+    FX_FLOAT			m_TableWidth;
+    FX_FLOAT			m_ReflowPageHeight;
+};
+class CRF_CharState : public CFX_Object
+{
+public:
+    CPDF_Font*	m_pFont;
+    FX_ARGB		m_Color;
+    FX_BOOL		m_bVert;
+    FX_FLOAT m_fFontSize;
+    FX_FLOAT m_fAscent;
+    FX_FLOAT m_fDescent;
+
+    CPDF_TextObject*	m_pTextObj;
+};
+class CRF_PageInfo : public CFX_Object
+{
+public:
+    CRF_PageInfo(CPDF_PageObject* pPageObj, CRF_PageInfo* pParent = NULL)
+        : m_pPageObj(pPageObj) , m_pParent(pParent)
+    {
+    }
+    CPDF_PageObject* GetPageObj()
+    {
+        return m_pPageObj;
+    }
+    CPDF_Dictionary* GetFormDict()
+    {
+        if (NULL == m_pParent) {
+            return NULL;
+        }
+        CPDF_PageObject* pParentObj = m_pParent->GetPageObj();
+        if (NULL == pParentObj || PDFPAGE_FORM != pParentObj->m_Type) {
+            return NULL;
+        }
+        return ((CPDF_FormObject*)pParentObj)->m_pForm->m_pResources;
+    }
+protected:
+    CPDF_PageObject*		m_pPageObj;
+    CRF_PageInfo*			m_pParent;
+};
+class CPDF_ReflowedPage : public IPDF_ReflowedPage, public CFX_PrivateData, public CFX_Object
+{
+public:
+
+    CPDF_ReflowedPage(CFX_GrowOnlyPool*	pMemoryPool);
+    ~CPDF_ReflowedPage();
+    CFX_PrivateData*	GetPrivateDataCtrl()
+    {
+        return this;
+    };
+    void		GetDisplayMatrix(CFX_AffineMatrix& matrix, FX_INT32 xPos, FX_INT32 yPos, FX_INT32 xSize, FX_INT32 ySize, FX_INT32 iRotate, const CFX_AffineMatrix* pPageMatrix);
+
+    FX_FLOAT	GetPageHeight() ;
+    FX_FLOAT	GetPageWidth()
+    {
+        return m_PageWidth;
+    };
+    void		FocusGetData(const CFX_AffineMatrix matrix, FX_INT32 x, FX_INT32 y, CFX_ByteString& str);
+    FX_BOOL		FocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, FX_INT32& x, FX_INT32& y);
+    CRF_DataPtrArray*	m_pReflowed;
+    FX_FLOAT			m_PageWidth;
+    FX_FLOAT			m_PageHeight;
+    FX_BOOL				m_bWaiting;
+    CRF_CharStateArray*	m_pCharState;
+    CFX_GrowOnlyPool*	m_pMemoryPool;
+    FX_BOOL				m_bCreateMemoryPool;
+    CPDF_Page*			m_pPDFPage;
+    FX_BOOL					RetainPageObjsMemberShip();
+    void					MarkPageObjMemberShip(CPDF_PageObject* pObj, CRF_PageInfo* pParent);
+    void					ReleasePageObjsMemberShip();
+    CPDF_Dictionary*		GetFormResDict(CPDF_PageObject* pObj);
+
+    CFX_MapPtrToPtr*		m_pPageInfos;
+};
+class CPDF_ProgressiveReflowPageParser : public IPDF_ProgressiveReflowPageParser, public CFX_Object
+{
+public:
+    CPDF_ProgressiveReflowPageParser();
+    ~CPDF_ProgressiveReflowPageParser() ;
+    void			Init();
+
+    ParseStatus		GetStatus()
+    {
+        return m_Status;
+    };
+
+    void			SetParserStyle(RF_ParseStyle style)
+    {
+        m_ParseStyle = style;
+    };
+    void			Start(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags);
+    void			Continue(IFX_Pause* pPause);
+    int				GetPosition() ;
+
+    void			Clear();
+    ParseStatus		m_Status;
+protected:
+    RF_ParseStyle		m_ParseStyle;
+    CPDF_Page*			m_pPDFPage;
+    IFX_Pause*			m_pPause;
+    CPDF_ReflowedPage*	m_pReflowPage;
+    FX_FLOAT			m_TopIndent;
+    FX_FLOAT			m_ReflowedWidth;
+    FX_FLOAT			m_fScreenHeight;
+    IPDF_LayoutProvider*	m_pProvider;
+    IPDF_LayoutProcessor*	m_pReflowEngine;
+    int					m_nObjProcessed;
+    int m_flags;
+};
+class CPDF_ProgressiveReflowPageRender : public IPDF_ProgressiveReflowPageRender, public CFX_Object
+{
+public:
+    CPDF_ProgressiveReflowPageRender();
+    ~CPDF_ProgressiveReflowPageRender() ;
+
+    RenderStatus			GetStatus()
+    {
+        return m_Status;
+    };
+
+
+    void		SetDisplayColor(FX_COLORREF color);
+    void		Start(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits);
+    void		Continue(IFX_Pause* pPause);
+    int			GetPosition();
+
+
+    void				Clear();
+protected:
+    void				Display(IFX_Pause* pPause);
+    RenderStatus m_Status;
+    CPDF_ReflowedPage*	m_pReflowPage;
+    CFX_AffineMatrix*	m_pDisplayMatrix;
+    int					m_CurrNum;
+    IFX_FontEncoding*	m_pFontEncoding;
+    CFX_RenderDevice*	m_pFXDevice;
+    int					m_DitherBits;
+    FX_COLORREF			m_DisplayColor;
+    typedef struct CRF_TextDataAtt {
+        CRF_TextDataAtt()
+        {
+            pFont = NULL;
+            fFontSize = 0.0f;
+            Color = 0;
+        }
+        CRF_TextDataAtt(CPDF_Font* font, FX_FLOAT fontSize, FX_ARGB color)
+        {
+            pFont = font;
+            fFontSize = fontSize;
+            Color = color;
+        }
+        CPDF_Font*  pFont;
+        FX_FLOAT    fFontSize;
+        FX_ARGB		Color;
+    } CRF_TEXTDATAATT;
+    inline bool isTextDataAttSame(CRF_TEXTDATAATT data1, CRF_TEXTDATAATT data2)
+    {
+        if (data1.pFont != data2.pFont) {
+            return false;
+        }
+        if (data1.Color != data2.Color) {
+            return false;
+        }
+        if (fabs(data1.fFontSize - data2.fFontSize) > 0.0f) {
+            return false;
+        }
+        return true;
+    };
+};
+#define TYPE_UNKNOW		0
+#define TYPE_TEXT		1
+#define TYPE_PATH		2
+#define TYPE_IMAGE		3
+#define TYPE_LINE		4
+class CRF_Data : public CFX_Object
+{
+public:
+    typedef enum {Unknow, Text, Image, Path, Line, paragraph} RF_DataType;
+    CRF_Data()
+    {
+        m_Type = Unknow;
+        m_Width = 0;
+        m_PosY = 0;
+        m_PosX = 0;
+        m_Height = 0;
+    }
+    RF_DataType	GetType()
+    {
+        return m_Type;
+    }
+    virtual		~CRF_Data() {}
+    RF_DataType 	m_Type;
+    FX_FLOAT	m_PosX;
+    FX_FLOAT	m_PosY;
+    FX_FLOAT	m_Width;
+    FX_FLOAT	m_Height;
+};
+class CRF_LineData : public CRF_Data
+{
+public:
+    CRF_LineData()
+    {
+        m_Type = Line;
+    }
+};
+class CRF_CharData : public CRF_Data
+{
+public:
+    CRF_CharData()
+    {
+        m_Type = Text;
+        m_CharCode = -1;
+    }
+    CRF_CharState*	m_pCharState;
+    FX_DWORD		m_CharCode;
+};
+class CRF_ImageData : public CRF_Data
+{
+public:
+    CRF_ImageData()
+    {
+        m_Type = Image;
+        m_pBitmap = NULL;
+    }
+    ~CRF_ImageData()
+    {
+        if(m_pBitmap) {
+            delete m_pBitmap;
+        }
+        m_pBitmap = NULL;
+    }
+    CFX_AffineMatrix m_Matrix;
+    CFX_DIBitmap*	m_pBitmap;
+};
+class CRF_PathData : public CRF_Data
+{
+public:
+    CRF_PathData()
+    {
+        m_Type = Path;
+        m_bDecoration = FALSE;
+    }
+    ~CRF_PathData() {};
+    FX_BOOL			m_bDecoration;
+    CPDF_Path			m_pPathData;
+    CFX_AffineMatrix	m_pPath2Device;
+    CPDF_GraphState		m_pGraphState;
+    FX_ARGB		m_fill_argb;
+    FX_ARGB		m_stroke_argb;
+    int			m_fill_mode;
+};
+#endif
diff --git a/core/src/reflow/reflowedtextpage.cpp b/core/src/reflow/reflowedtextpage.cpp
new file mode 100644
index 0000000..a5ad0be
--- /dev/null
+++ b/core/src/reflow/reflowedtextpage.cpp
@@ -0,0 +1,402 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "reflowedtextpage.h"
+IPDF_TextPage*	IPDF_TextPage::CreateReflowTextPage(IPDF_ReflowedPage* pRefPage)
+{
+    return FX_NEW CRF_TextPage(pRefPage);
+}
+CRF_TextPage::CRF_TextPage(IPDF_ReflowedPage* pRefPage)
+{
+    m_pRefPage = (CPDF_ReflowedPage*)(pRefPage);
+    m_pDataList = NULL;
+    m_CountBSArray = NULL;
+}
+CRF_TextPage::~CRF_TextPage()
+{
+    if(m_pDataList) {
+        delete m_pDataList;
+        m_pDataList = NULL;
+    }
+    if(m_CountBSArray) {
+        delete m_CountBSArray;
+        m_CountBSArray = NULL;
+    }
+}
+FX_BOOL CRF_TextPage::ParseTextPage()
+{
+    if(!m_pRefPage) {
+        return FALSE;
+    }
+    int count = m_pRefPage->m_pReflowed->GetSize();
+    if(count < 500) {
+        m_pDataList = FX_NEW CRF_CharDataPtrArray(count);
+    } else {
+        m_pDataList = FX_NEW CRF_CharDataPtrArray(500);
+    }
+    if (NULL == m_pDataList) {
+        return FALSE;
+    }
+    for(int i = 0; i < count; i++) {
+        CRF_Data* pData = (*(m_pRefPage->m_pReflowed))[i];
+        if(pData->GetType() == CRF_Data::Text) {
+            m_pDataList->Add((CRF_CharData*)pData);
+        }
+    }
+    m_CountBSArray = FX_NEW CFX_CountBSINT32Array(20);
+    if(NULL == m_CountBSArray) {
+        return FALSE;
+    }
+    return TRUE;
+}
+FX_BOOL	CRF_TextPage::IsParsered() const
+{
+    if(m_pDataList) {
+        return TRUE;
+    }
+    return FALSE;
+}
+int CRF_TextPage::CharIndexFromTextIndex(int TextIndex) const
+{
+    return TextIndex;
+}
+int CRF_TextPage::TextIndexFromCharIndex(int CharIndex) const
+{
+    return CharIndex;
+}
+
+int	CRF_TextPage::CountChars() const
+{
+    if (NULL == m_pDataList) {
+        return -1;
+    }
+    return m_pDataList->GetSize();
+}
+void CRF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO & info) const
+{
+    if(index >= CountChars() || index < 0 || !m_pDataList) {
+        return;
+    }
+    CRF_CharData* pData = (*m_pDataList)[index];
+    FX_FLOAT ReltiveCorddDs = pData->m_pCharState->m_fDescent;
+    FX_FLOAT ReltiveCorddAs = pData->m_pCharState->m_fAscent;
+    info.m_Flag		= CHAR_NORMAL;
+    info.m_pTextObj	= pData->m_pCharState->m_pTextObj;
+    info.m_OriginX	= pData->m_PosX;
+    info.m_OriginY	= pData->m_PosY - ReltiveCorddDs;
+    info.m_FontSize	= pData->m_pCharState->m_fFontSize;
+    CFX_FloatRect FloatRectTmp(pData->m_PosX, pData->m_PosY, pData->m_PosX + pData->m_Width, pData->m_PosY + ReltiveCorddAs - ReltiveCorddDs);
+    info.m_CharBox	= FloatRectTmp;
+    CFX_WideString str = pData->m_pCharState->m_pFont->UnicodeFromCharCode(pData->m_CharCode);
+    if(!str.IsEmpty()) {
+        info.m_Unicode	= str.GetAt(0);
+    } else {
+        info.m_Unicode = -1;
+    }
+    info.m_Charcode = (FX_WCHAR)pData->m_CharCode;
+    info.m_Matrix = CFX_Matrix(1, 0, 0, 1, 0, 0);
+}
+extern FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2, FX_FLOAT& interlow, FX_FLOAT& interhigh);
+inline FX_BOOL _IsInsameline(const CFX_FloatRect& rectA, const CFX_FloatRect& rectB)
+{
+    if((rectA.top >= rectB.bottom && rectB.top >= rectA.bottom)) {
+        return TRUE;
+    } else {
+        return FALSE;
+    }
+}
+inline FX_BOOL _IsIntersect(const CFX_FloatRect& rectA, const CFX_FloatRect& rectB)
+{
+    FX_FLOAT interlow = .0f, interhigh = .0f;
+    if(GetIntersection(rectA.bottom, rectA.top, rectB.bottom, rectB.top, interlow, interhigh)) {
+        if(GetIntersection(rectA.left, rectA.right, rectB.left, rectB.right, interlow, interhigh)) {
+            return TRUE;
+        } else {
+            return FALSE;
+        }
+    }
+    return FALSE;
+}
+void CRF_TextPage::GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const
+{
+    int indexlen = start + nCount;
+    FPDF_CHAR_INFO info;
+    FX_BOOL bstart = TRUE;
+    CFX_FloatRect recttmp;
+    int i;
+    for(i = start; i < indexlen; i++) {
+        GetCharInfo(i, info);
+        if(bstart) {
+            recttmp = info.m_CharBox;
+            bstart = FALSE;
+        } else if(_IsInsameline(recttmp, info.m_CharBox)) {
+            recttmp.right = info.m_CharBox.right;
+            if(info.m_CharBox.top > recttmp.top) {
+                recttmp.top = info.m_CharBox.top;
+            }
+            if(info.m_CharBox.bottom < recttmp.bottom) {
+                recttmp.bottom = info.m_CharBox.bottom;
+            }
+        } else {
+            rectArray.Add(recttmp);
+            recttmp = info.m_CharBox;
+        }
+    }
+    rectArray.Add(recttmp);
+}
+inline FX_FLOAT _GetDistance(CFX_FloatRect floatRect, CPDF_Point point)
+{
+    if(floatRect.right < point.x && floatRect.bottom > point.y) {
+        return FXSYS_sqrt(FXSYS_pow(point.x - floatRect.right, 2) + FXSYS_pow(floatRect.bottom - point.y, 2));
+    }
+    if (floatRect.right < point.x && floatRect.top < point.y) {
+        return FXSYS_sqrt(FXSYS_pow(point.x - floatRect.right, 2) + FXSYS_pow(point.y - floatRect.top, 2));
+    }
+    if(floatRect.left > point.x && floatRect.bottom > point.y) {
+        return FXSYS_sqrt(FXSYS_pow(floatRect.bottom - point.y, 2) + FXSYS_pow(floatRect.left - point.x, 2));
+    }
+    if((floatRect.right > point.x || FXSYS_fabs(floatRect.right - point.x) <= 0.0001f) &&
+            (floatRect.left < point.x || FXSYS_fabs(floatRect.left - point.x) <= 0.0001f) && floatRect.bottom > point.y) {
+        return FXSYS_fabs(floatRect.bottom - point.y);
+    }
+    if(floatRect.left > point.x && (floatRect.bottom < point.y || FXSYS_fabs(floatRect.bottom - point.y) <= 0.0001f) &&
+            (floatRect.top > point.y || FXSYS_fabs(floatRect.top - point.y) <= 0.0001f)) {
+        return FXSYS_fabs(floatRect.left - point.x);
+    }
+    if(floatRect.left > point.x && floatRect.top < point.y) {
+        return FXSYS_sqrt(FXSYS_pow(floatRect.left - point.x, 2) + FXSYS_pow(point.y - floatRect.top, 2));
+    }
+    if ((floatRect.left < point.x || FXSYS_fabs(floatRect.left - point.x) <= 0.0001f) &&
+            (floatRect.right > point.x || FXSYS_fabs(floatRect.right - point.x) <= 0.0001f) && floatRect.top < point.y) {
+        return FXSYS_fabs(point.y - floatRect.top);
+    }
+    if(floatRect.right < point.x && (floatRect.top > point.y || FXSYS_fabs(floatRect.top - point.y) <= 0.0001f) &&
+            (floatRect.bottom < point.y || FXSYS_fabs(floatRect.bottom - point.y) <= 0.0001f)) {
+        return point.x - floatRect.right;
+    }
+    return .0f;
+}
+int CRF_TextPage::GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
+{
+    int index = -1, i = 0, j = 0;
+    FPDF_CHAR_INFO info;
+    CFX_FloatRect rectTmp;
+    FX_FLOAT MinDistance = 1000, DistanceTmp = 0;
+    FX_FLOAT rect_bottom = point.x - xTorelance;
+    CFX_FloatRect TorelanceRect(rect_bottom <= 0 ? 0 : rect_bottom, point.y - yTorelance, point.x + xTorelance, point.y + yTorelance);
+    int count = CountChars();
+    for(i = 0; i < count; i++) {
+        GetCharInfo(i, info);
+        rectTmp = info.m_CharBox;
+        if(rectTmp.Contains(point.x, point.y)) {
+            index = i;
+            break;
+        } else if(_IsIntersect(rectTmp, TorelanceRect)) {
+            DistanceTmp = _GetDistance(rectTmp, point);
+            if(DistanceTmp < MinDistance) {
+                MinDistance = DistanceTmp;
+                index = i;
+            }
+        }
+    }
+    return index;
+}
+int CRF_TextPage::GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
+{
+    int index = 0;
+    CPDF_Point point(x, y);
+    if((index = GetIndexAtPos(point, xTorelance, yTorelance)) < 0) {
+        return -1;
+    } else {
+        return index;
+    }
+}
+int CRF_TextPage::GetOrderByDirection(int index, int direction) const
+{
+    return -1;
+}
+CFX_WideString CRF_TextPage::GetTextByRect(CFX_FloatRect rect) const
+{
+    int count;
+    FPDF_CHAR_INFO info;
+    CFX_WideString str;
+    CFX_FloatRect  Recttmp;
+    FX_BOOL bstart = TRUE;
+    count = CountChars();
+    if(rect.IsEmpty()) {
+        return L"";
+    }
+    for(int i = 0; i < count; i++) {
+        GetCharInfo(i, info);
+        if(_IsIntersect(rect, info.m_CharBox)) {
+            if(bstart) {
+                Recttmp = info.m_CharBox;
+                str += info.m_Unicode;
+                bstart = FALSE;
+            } else if(_IsInsameline(Recttmp, info.m_CharBox)) {
+                str += info.m_Unicode;
+            } else {
+                str += L"\r\n";
+                Recttmp = info.m_CharBox;
+                str += info.m_Unicode;
+            }
+        }
+    }
+    if(str.IsEmpty()) {
+        return L"";
+    } else {
+        return str;
+    }
+}
+void CRF_TextPage::GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const
+{
+    int count, i;
+    FX_BOOL bstart = TRUE;
+    FPDF_CHAR_INFO info;
+    CFX_FloatRect recttmp;
+    count = CountChars();
+    for(i = 0; i < count; i++) {
+        GetCharInfo(i, info);
+        if(_IsIntersect(rect, info.m_CharBox)) {
+            if(bstart) {
+                recttmp = info.m_CharBox;
+                bstart = FALSE;
+            } else if(_IsInsameline(recttmp, info.m_CharBox)) {
+                recttmp.right = info.m_CharBox.right;
+                if(info.m_CharBox.top > recttmp.top) {
+                    recttmp.top = info.m_CharBox.top;
+                }
+                if(info.m_CharBox.bottom < recttmp.bottom) {
+                    recttmp.bottom = info.m_CharBox.bottom;
+                }
+            } else {
+                resRectArray.Add(recttmp);
+                recttmp = info.m_CharBox;
+            }
+        }
+    }
+    resRectArray.Add(recttmp);
+}
+int CRF_TextPage::CountRects(int start, int nCount)
+{
+    m_rectArray.RemoveAll();
+    GetRectArray(start, nCount, m_rectArray);
+    return m_rectArray.GetSize();
+}
+void CRF_TextPage::GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const
+{
+    if(m_rectArray.GetSize() <= rectIndex) {
+        return;
+    }
+    left   = m_rectArray[rectIndex].left;
+    top    = m_rectArray[rectIndex].top;
+    right  = m_rectArray[rectIndex].right;
+    bottom = m_rectArray[rectIndex].bottom;
+}
+FX_BOOL CRF_TextPage::GetBaselineRotate(int rectIndex, int& Rotate)
+{
+    Rotate = 0;
+    return TRUE;
+}
+FX_BOOL CRF_TextPage::GetBaselineRotate(CFX_FloatRect rect, int& Rotate)
+{
+    Rotate = 0;
+    return TRUE;
+}
+int CRF_TextPage::CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains)
+{
+    if (!m_CountBSArray) {
+        return -1;
+    }
+    m_CountBSArray->RemoveAll();
+    CFX_FloatRect floatrect(left, bottom, right, top);
+    int totalcount, i, j = 0, counttmp = 0;
+    FX_BOOL bstart = TRUE;
+    FPDF_CHAR_INFO info;
+    CFX_FloatRect recttmp;
+    totalcount = CountChars();
+    for(i = 0; i < totalcount; i++) {
+        GetCharInfo(i, info);
+        if(_IsIntersect(floatrect, info.m_CharBox)) {
+            if(bstart) {
+                m_CountBSArray->Add(i);
+                counttmp = 1;
+                recttmp = info.m_CharBox;
+                bstart = FALSE;
+            } else if(_IsInsameline(recttmp, info.m_CharBox)) {
+                recttmp.right = info.m_CharBox.right;
+                if(info.m_CharBox.top > recttmp.top) {
+                    recttmp.top = info.m_CharBox.top;
+                }
+                if(info.m_CharBox.bottom < recttmp.bottom) {
+                    recttmp.bottom = info.m_CharBox.bottom;
+                }
+                counttmp ++;
+            } else {
+                m_CountBSArray->Add(counttmp);
+                m_CountBSArray->Add(i);
+                counttmp = 1;
+                j++;
+                recttmp = info.m_CharBox;
+            }
+        }
+    }
+    m_CountBSArray->Add(counttmp);
+    j++;
+    return j;
+}
+void CRF_TextPage::GetBoundedSegment(int index, int& start, int& count) const
+{
+    if (!m_CountBSArray) {
+        return;
+    }
+    if(m_CountBSArray->GetSize() <= index * 2) {
+        start = 0;
+        count = 0;
+        return;
+    }
+    start = *(int *)m_CountBSArray->GetAt(index * 2);
+    count = *(int *)m_CountBSArray->GetAt(index * 2 + 1);
+}
+
+int CRF_TextPage::GetWordBreak(int index, int direction) const
+{
+    return -1;
+}
+CFX_WideString CRF_TextPage::GetPageText(int start, int nCount ) const
+{
+    if(nCount == -1) {
+        nCount = CountChars();
+        start = 0;
+    } else if(nCount < 1) {
+        return L"";
+    } else if(start >= CountChars()) {
+        return L"";
+    }
+    int i, index = start + nCount;
+    FPDF_CHAR_INFO info;
+    CFX_WideString str;
+    CFX_FloatRect recttmp;
+    FX_BOOL bstart = TRUE;
+    for(i = start; i < index; i++) {
+        GetCharInfo(i, info);
+        if(bstart) {
+            recttmp = info.m_CharBox;
+            str += info.m_Unicode;
+            bstart = FALSE;
+        } else if (_IsInsameline(recttmp, info.m_CharBox)) {
+            str += info.m_Unicode;
+        } else {
+            str += L"\r\n";
+            recttmp = info.m_CharBox;
+            str += info.m_Unicode;
+        }
+    }
+    if(str.IsEmpty()) {
+        return L"";
+    }
+    return str;
+}
diff --git a/core/src/reflow/reflowedtextpage.h b/core/src/reflow/reflowedtextpage.h
new file mode 100644
index 0000000..397428d
--- /dev/null
+++ b/core/src/reflow/reflowedtextpage.h
@@ -0,0 +1,71 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _REFLOWED_TEXT_PAGE_H
+#define _REFLOWED_TEXT_PAGE_H
+#include "../../include/reflow/reflowengine.h"
+#include "../../src/reflow/reflowedpage.h"
+typedef CFX_SegmentedArray<CRF_CharData*> CRF_CharDataPtrArray;
+typedef CFX_SegmentedArray<FX_INT32> CFX_CountBSINT32Array;
+class CRF_TextPage : public IPDF_TextPage
+{
+public:
+    CRF_TextPage(IPDF_ReflowedPage* pRefPage);
+
+    virtual ~CRF_TextPage() ;
+    FX_BOOL			ParseTextPage();
+    void			NormalizeObjects(FX_BOOL bNormalize)
+    {
+        return;
+    };
+
+    FX_BOOL			IsParsered() const;
+public:
+
+    int CharIndexFromTextIndex(int TextIndex) const;
+
+    int TextIndexFromCharIndex(int CharIndex) const;
+
+
+    int				CountChars() const;
+
+    virtual	void	GetCharInfo(int index, FPDF_CHAR_INFO & info) const;
+
+    void			GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const;
+
+
+    int				GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const;
+
+    int				GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const;
+
+    virtual	int				GetOrderByDirection(int index, int direction) const;
+
+    CFX_WideString	GetTextByRect(CFX_FloatRect rect) const;
+
+    void			GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const;
+
+
+    int				CountRects(int start, int nCount);
+
+    virtual	void			GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const;
+    virtual	FX_BOOL			GetBaselineRotate(int rectIndex, int& Rotate);
+    virtual FX_BOOL			GetBaselineRotate(CFX_FloatRect rect, int& Rotate);
+
+    virtual	int				CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains = FALSE);
+
+    virtual	void			GetBoundedSegment(int index, int& start, int& count) const;
+
+
+    int				GetWordBreak(int index, int direction) const;
+
+    CFX_WideString	GetPageText(int start, int nCount = -1 ) const;
+private:
+    CPDF_ReflowedPage*		m_pRefPage;
+    CRF_CharDataPtrArray*	m_pDataList;
+    CFX_RectArray			m_rectArray;
+    CFX_CountBSINT32Array*	m_CountBSArray;
+};
+#endif
diff --git a/core/src/reflow/reflowengine.cpp b/core/src/reflow/reflowengine.cpp
new file mode 100644
index 0000000..11007c9
--- /dev/null
+++ b/core/src/reflow/reflowengine.cpp
@@ -0,0 +1,38 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+ 
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/reflow/reflowengine.h"
+#include "reflowedpage.h"
+IPDF_ReflowedPage* IPDF_ReflowedPage::Create()
+{
+    CPDF_ReflowedPage* pRefPage = FX_NEW CPDF_ReflowedPage(NULL);
+    return pRefPage;
+}
+IPDF_ReflowedPage* Create_ReflowPage()
+{
+    return IPDF_ReflowedPage::Create();
+}
+IPDF_ProgressiveReflowPageParser* Create_ReflowPageParser()
+{
+    return IPDF_ProgressiveReflowPageParser::Create();
+}
+IPDF_ProgressiveReflowPageParser* IPDF_ProgressiveReflowPageParser::Create()
+{
+    CPDF_ProgressiveReflowPageParser* pParser = FX_NEW CPDF_ProgressiveReflowPageParser;
+    if (NULL == pParser) {
+        return NULL;
+    }
+    pParser->Init();
+    return pParser;
+}
+IPDF_ProgressiveReflowPageRender* Create_ReflowPageRender()
+{
+    return IPDF_ProgressiveReflowPageRender::Create();
+}
+IPDF_ProgressiveReflowPageRender* IPDF_ProgressiveReflowPageRender::Create()
+{
+    return FX_NEW CPDF_ProgressiveReflowPageRender;
+}